<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE module [
  <!ELEMENT module (dtdversion,name,version,description*,help*,about*,requires*,file+)>
  <!ELEMENT dtdversion (#PCDATA)>
  <!ELEMENT name (#PCDATA)>
  <!ELEMENT version (#PCDATA)>
  <!ELEMENT mincmsversion (#PCDATA)>
  <!ELEMENT description (#PCDATA)>
  <!ELEMENT help (#PCDATA)>
  <!ELEMENT about (#PCDATA)>
  <!ELEMENT requires (requiredname,requiredversion)>
  <!ELEMENT requiredname (#PCDATA)>
  <!ELEMENT requiredversion (#PCDATA)>
  <!ELEMENT file (filename,isdir,data)>
  <!ELEMENT filename (#PCDATA)>
  <!ELEMENT isdir (#PCDATA)>
  <!ELEMENT data (#PCDATA)>
]>
<module>
	<dtdversion>1.3</dtdversion>
	<name>CodeMirror</name>
	<version>5.0.1</version>
    <mincmsversion>2.0</mincmsversion>
	<help><![CDATA[PHN0cm9uZz5XaGF0IGRvZXMgdGhpcyBtb2R1bGUgZG8/PC9zdHJvbmc+Cjxici8+ClRoZSBDb2RlTWlycm9yIG1vZHVsZSBhbGxvd3MgeW91IHRvIGVkaXQgY29udGVudCwgdGVtcGxhdGVzIGFuZCBzdHlsZXNoZWV0cyB1c2luZyBhIHN5bnRheGhpZ2hsaWdodGluZyBlZGl0b3IgaW5zaWRlIHlvdXIgYnJvd3Nlci4KSXQgY2FuIGJvdGggcmVwbGFjZSBhIHd5c2l3eWctbW9kdWxlLCBhbmQgYWN0IHN0YW5kYWxvbmUgZm9yIHRlbXBsYXRlL3N0eWxlc2hlZXQgZWRpdGluZyAob25seSBzdXBwb3J0ZWQgaW4gQ01TbXMgMS4xKykKPGJyLz48YnIvPgo8c3Ryb25nPkhvdyBkbyBJIHVzZSB0aGlzIG1vZHVsZT88L3N0cm9uZz4KWW91IHNpbXBseSBpbnN0YWxsIGl0LCBhbmQgY2hvb3NlIGl0IGluIHlvdXIgYWRtaW4gdXNlciBwcmVmZXJlbmNlcy4gTm90ZSwgdGhhdCBpZiB5b3UgdXNlIENNU21zIDEuMSBvciBhYm92ZSB5b3UgY2FuCnNlbGVjdCBDb2RlTWlycm9yIGJvdGggYXMgYSBXWVNJV1lHIGFuZCBhcyBhIHN5bnRheCBoaWdobGlnaHRpbmcgZWRpdG9yLg==]]></help>
	<about><![CDATA[PGJyIC8+QXV0aG9yOiBNb3J0ZW4gUG91bHNlbiAmbHQ7Jmx0O21vcnRlbkBwb3Vsc2VuLm9yZyZndDsmZ3Q7PGJyIC8+PGJyIC8+VmVyc2lvbjogNS4wLjE8YnIgLz48YnIgLz5DaGFuZ2UgSGlzdG9yeTo8YnIgLz48dWw+CiAgPGxpPjUuMC4xIC0gRml4ZWQgYXBwbHkgYnV0dG9ucyAoYXV0b3NhdmUgdG8gdGV4dGFyZWEgb25jaGFuZ2UpLCBmaXhlZCBhIHVybCBpc3N1ZSwgKHRoYW5rcyBNYXR0aGlldSkgYW5kIGFkZGVkIHJlcGxhY2luZyBjc3Mgc3ludGF4IHdpdGggc2Fzcy9sZXNzPC9saT4KICA8bGk+NS4wIC0gVXBkYXRlZCB0byBDTSA1LjIwLjIgYW5kIGZpeGVkIG1vZHVsZSB0byBjbXNtcy0yPC9saT4KICA8bGk+NC40IC0gVXBkYXRlZCB0byBDTSA0LjQ8L2xpPgogIDxsaT40LjAgLSBVcGRhdGVkIHRvIENNIDQuMDwvbGk+CiAgPGxpPjMuMi4wIC0gVXBkYXRlZCB0byBDTSAzLjIwPC9saT4KICA8bGk+My4wLjIgLSBVcGRhdGVkIHRvIENNIDMuMDI8L2xpPgogIDxsaT4zLjAuMCAtIFVwZGF0ZWQgdG8gQ00gMy4wLWZpbmFsLiBQb3NzaWJsZSBmaXggdG8gYWRtaW5zIG9uIGh0dHBzLiBGaXhlZCBzbyB0aGF0IGVkaXRpbmcgVURUJ3MgYXJlIGdldHRpbmcgaGlnaGxpZ2h0ZWQ8L2xpPgogIDxsaT4yLjMuMiAtIFVwZGF0ZWQgdG8gQ00gMi4zMTwvbGk+CiAgPGxpPjIuMy4xIC0gQXBwbHktYnV0dG9uIGluIGVkaXQgY3NzIGFyZSBmaXhlZCwgdGVtcGxhdGVzIHN0aWxsIGhhdmUgY29yZSBidWcgOig8L2xpPgogIDxsaT4yLjMuMCAtIFJlaW1wbGVtZW50ZWQgbGluZXdyYXBwaW5nLCBhdXRvbWF0ZWQgdGhlbWUgZGV0ZWN0aW9uPC9saT4KICA8bGk+Mi4yLjMgLSBVcGRhdGVkIHRvIENNIDIuMi4zPC9saT4KICA8bGk+Mi4yLjIgLSBVcGRhdGVkIHRvIENNIDIuMi4xPC9saT4KICA8bGk+Mi4yLjEgLSBVcGRhdGVkIHRvIENNIDIuMi4wLCBhZGRlZCB0YWItd2lkdGggc2V0dGluZzwvbGk+CiAgPGxpPjIuMi4wIC0gVXBkYXRlZCB0byBDTSAyLjE1LCBhZGRlZCBvcHRpb25hbCBmdWxsc2NyZWVuIG1vZGU8L2xpPgogIDxsaT4yLjEuMiAtIFVwZGF0ZWQgdG8gQ00gMi4xMiwgY2xlYW5lciB3YXkgb2Ygc2F2aW5nIGVkaXRvciBjb250ZW50IHRvIHRleHRhcmVhPC9saT4KICA8bGk+Mi4xLjAgLSBVcGRhdGVkIHRvIENNIDIuMS4xLCBvbmNlIGFnYWluIGNoYW5nZSB0ZXN0bW9kZS4uLiA8L2xpPgogIDxsaT4yLjAuMSAtIFVwZGF0ZWQgdG8gQ00gMi4wLjE8L2xpPgogIDxsaT4yLjAgLSBVcGRhdGVkIHRvIENNIDIuMCBhbmQgcmV3b3JrZWQganVzdCBhYm91dCBldmVyeXRoaW5nIHRvIG1ha2UgdGhpcyB3b3JrPC9saT4KICA8bGk+MC4xLjkgLSBVcGRhdGVkIHRvIENNIDAuOTM8L2xpPgogIDxsaT4wLjEuOCAtIFVwZGF0ZWQgdG8gQ00gMC45LCBhZGRlZCBvcHRpb24gb24gaG93IHRvIGhhbmRsZSBUQUI8L2xpPgogIDxsaT4wLjEuNyAtIFVwZGF0ZWQgdG8gQ00gMC44MDwvbGk+CiAgPGxpPjAuMS42IC0gVXBkYXRlZCB0byBDTSAwLjcwLCBBZGRlZCBvcHRpb24gdG8gbWF0Y2ggcGFyZW50aGVzaXM8L2xpPgogIDxsaT4wLjEuNSAtIFVwZGF0ZWQgdG8gQ00gMC42NiwgcmVtb3ZlZCBhIHN0cmFuZ2UgXG4gY2hhciBmcm9tIGhlYWRlcm91dHB1dCwgbWFkZSB0YWJiaW5nIHdvcms8L2xpPgogIDxsaT4wLjEuNCAtIEZpeGVkIENQVSBob2dnaW5nIHByb2JsZW1zIGJ5IHJld3JpdGluZyB0ZXN0YXJlYS1jb2RlPC9saT4KICA8bGk+MC4xLjMgLSBVcGRhdGVkIHRvIENNIDAuNjUsIGFkZGVkIG9wdGlvbiB0byB0b2dnbGUgd29yZHdyYXA8L2xpPgogIDxsaT4wLjEuMiAtIFVwZGF0ZWQgdG8gQ00gMC42MzwvbGk+CiAgPGxpPjAuMS4xIC0gVXBkYXRlZCB0byBDTSAwLjYyLCBmaXhlZCBleGFtcGxlcyBhbmQgcHJvYmFibHkgZnVuY3Rpb25hbGl0eSBhcyB3ZWxsPC9saT4KICA8bGk+MC4xLjAgLSBJbml0aWFsIHJlbGVhc2UgPC9saT4KPC91bD48YnIgLz4=]]></about>
	<file>
	  <filename>/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/action.defaultadmin.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCmlmICghZnVuY3Rpb25fZXhpc3RzKCJjbXNtcyIpKSBleGl0OwoKaWYgKCEkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdNb2RpZnkgU2l0ZSBQcmVmZXJlbmNlcycpKSB7CiAgZWNobyAkdGhpcy0+U2hvd0Vycm9ycygkdGhpcy0+TGFuZygnbmVlZHBlcm1pc3Npb24nLCBhcnJheSgnTW9kaWZ5IFNpdGUgUHJlZmVyZW5jZXMnKSkpOwogIHJldHVybjsKfQovKiRjb25mPWNtc21zKCktPkdldENvbmZpZygpOwplY2hvICRjb25mWyJzc2xfdXJsIl07Ki8KaWYgKGlzc2V0KCRwYXJhbXNbImV4YW1wbGVzeW50YXgiXSkpIHsKICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgiZXhhbXBsZXN5bnRheCIsJHBhcmFtc1siZXhhbXBsZXN5bnRheCJdKTsKfQoKZWNobyAkdGhpcy0+U3RhcnRUYWJIZWFkZXJzKCk7CmVjaG8gJHRoaXMtPlNldFRhYkhlYWRlcigic2V0dGluZ3MiLCR0aGlzLT5MYW5nKCJzZXR0aW5nc3RhYiIpKTsKLyplY2hvICR0aGlzLT5TZXRUYWJIZWFkZXIoImh0bWwiLCR0aGlzLT5MYW5nKCJodG1sdGVzdCIpKTsKZWNobyAkdGhpcy0+U2V0VGFiSGVhZGVyKCJwaHAiLCR0aGlzLT5MYW5nKCJwaHB0ZXN0IikpOwplY2hvICR0aGlzLT5TZXRUYWJIZWFkZXIoImNzcyIsJHRoaXMtPkxhbmcoImNzc3Rlc3QiKSk7CmVjaG8gJHRoaXMtPlNldFRhYkhlYWRlcigianMiLCR0aGlzLT5MYW5nKCJqc3Rlc3QiKSk7CiovCmVjaG8gJHRoaXMtPkVuZFRhYkhlYWRlcnMoKTsKZWNobyAkdGhpcy0+U3RhcnRUYWJDb250ZW50KCk7CgoKZWNobyAkdGhpcy0+U3RhcnRUYWIoInNldHRpbmdzIik7CiR0aGlzLT5zbWFydHktPmFzc2lnbignc3RhcnRmb3JtJywgJHRoaXMtPkNyZWF0ZUZvcm1TdGFydCgkaWQsICdzYXZlc2V0dGluZ3MnLCAkcmV0dXJuaWQpKTsKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdlbmRmb3JtJywgJHRoaXMtPkNyZWF0ZUZvcm1FbmQoKSk7CgokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3Nob3dsaW5lbnVtYmVyc3RleHQnLCAkdGhpcy0+TGFuZygic2hvd2xpbmVudW1iZXJzIikpOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3Nob3dsaW5lbnVtYmVyc2lucHV0JywgJHRoaXMtPkNyZWF0ZUlucHV0Q2hlY2tib3goJGlkLCJzaG93bGluZW51bWJlcnMiLDEsJHRoaXMtPkdldFByZWZlcmVuY2UoInNob3dsaW5lbnVtYmVycyIsMSkpKTsKCi8qJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdhbGxvd2Z1bGxzY3JlZW50ZXh0JywgJHRoaXMtPkxhbmcoImFsbG93ZnVsbHNjcmVlbiIpKTsKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdhbGxvd2Z1bGxzY3JlZW5pbnB1dCcsICR0aGlzLT5DcmVhdGVJbnB1dENoZWNrYm94KCRpZCwiYWxsb3dmdWxsc2NyZWVuIiwxLCR0aGlzLT5HZXRQcmVmZXJlbmNlKCJhbGxvd2Z1bGxzY3JlZW4iLDEpKSk7CiovCi8qJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdjc3NhZGRpdGlvbnN0ZXh0JywgJHRoaXMtPkxhbmcoImNzc2FkZGl0aW9ucyIpKTsKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdjc3NhZGRpdGlvbnNpbnB1dCcsICR0aGlzLT5DcmVhdGVJbnB1dFRleHQoJGlkLCJjc3NhZGRpdGlvbnMiLCR0aGlzLT5HZXRQcmVmZXJlbmNlKCJjc3NhZGRpdGlvbnMiLCR0aGlzLT5fZGVmYXVsdGNzc2FkZGl0aW9ucyksIjYwIikpOwoqLwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3RhYnNpemV0ZXh0JywgJHRoaXMtPkxhbmcoInRhYnNpemUiKSk7CiR0aGlzLT5zbWFydHktPmFzc2lnbigndGFic2l6ZWlucHV0JywgJHRoaXMtPkNyZWF0ZUlucHV0VGV4dCgkaWQsInRhYnNpemUiLCR0aGlzLT5HZXRQcmVmZXJlbmNlKCJ0YWJzaXplIiwyKSwiOCIpKTsKCiR0aGlzLT5zbWFydHktPmFzc2lnbigndGhlbWV0ZXh0JywgJHRoaXMtPkxhbmcoInRoZW1lIikpOwoKJGZpbGVzPXNjYW5kaXIoZGlybmFtZShfX0ZJTEVfXykuRElSRUNUT1JZX1NFUEFSQVRPUi4kdGhpcy0+X2NtZGlyLkRJUkVDVE9SWV9TRVBBUkFUT1IuInRoZW1lIik7CgokdGhlbWVzPWFycmF5KCk7CmZvcmVhY2ggKCRmaWxlcyBhcyAkZmlsZSkgewogIGlmICgkZmlsZVswXT09Ii4iKSBjb250aW51ZTsKICAkdGhlbWU9c3RyX3JlcGxhY2UoIi5jc3MiLCIiLCRmaWxlKTsKICAkdGhlbWVzWyR0aGVtZV09JHRoZW1lOwp9CgokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ3RoZW1laW5wdXQnLCAkdGhpcy0+Q3JlYXRlSW5wdXREcm9wZG93bigkaWQsInRoZW1lIiwkdGhlbWVzLC0xLCR0aGlzLT5HZXRQcmVmZXJlbmNlKCJ0aGVtZSIsImRlZmF1bHQiKSkpOwoKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCd0ZXh0d3JhcHBpbmd0ZXh0JywgJHRoaXMtPkxhbmcoInRleHR3cmFwcGluZyIpKTsKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCd0ZXh0d3JhcHBpbmdpbnB1dCcsICR0aGlzLT5DcmVhdGVJbnB1dENoZWNrYm94KCRpZCwidGV4dHdyYXBwaW5nIiwxLCR0aGlzLT5HZXRQcmVmZXJlbmNlKCJ0ZXh0d3JhcHBpbmciLDEpKSk7CgovKiR0aGlzLT5zbWFydHktPmFzc2lnbignYXV0b21hdGNocGFyZW5zdGV4dCcsICR0aGlzLT5MYW5nKCJhdXRvbWF0Y2hwYXJlbnMiKSk7CiR0aGlzLT5zbWFydHktPmFzc2lnbignYXV0b21hdGNocGFyZW5zaW5wdXQnLCAkdGhpcy0+Q3JlYXRlSW5wdXRDaGVja2JveCgkaWQsImF1dG9tYXRjaHBhcmVucyIsIjEiLCR0aGlzLT5HZXRQcmVmZXJlbmNlKCJhdXRvbWF0Y2hwYXJlbnMiLCIwIikpKTsKKi8KJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCd0YWJoYW5kbGluZ3RleHQnLCAkdGhpcy0+TGFuZygidGFiaGFuZGxpbmciKSk7CiR0YWJmdW5jdGlvbnM9YXJyYXkoCiAgJHRoaXMtPkxhbmcoInRhYmRlZmF1bHQiKT0+ImRlZmF1bHQiLAogICR0aGlzLT5MYW5nKCJ0YWJpbmRlbnQiKT0+ImluZGVudCIsCiAgJHRoaXMtPkxhbmcoInRhYnNwYWNlcyIpPT4iY2xhc3NpYyIsCiAgJHRoaXMtPkxhbmcoInRhYnNoaWZ0Iik9PiJzaGlmdCIKKTsKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCd0YWJoYW5kbGluZ2lucHV0JywgJHRoaXMtPkNyZWF0ZUlucHV0RHJvcGRvd24oJGlkLCJ0YWJoYW5kbGluZyIsJHRhYmZ1bmN0aW9ucywtMSwkdGhpcy0+R2V0UHJlZmVyZW5jZSgidGFiaGFuZGxpbmciLCJpbmRlbnQiKSkpOwoKJHRoaXMtPnNtYXJ0eS0+YXNzaWduKCdzdWJtaXQnLCAkdGhpcy0+Q3JlYXRlSW5wdXRTdWJtaXQoJGlkLCAnc3VibWl0JywgJHRoaXMtPkxhbmcoJ3NhdmVzZXR0aW5ncycpKSk7CgokY3NzcmVwbGFjZW1lbnRzPWFycmF5KAogICR0aGlzLT5MYW5nKCJkb250cmVwbGFjZWNzcyIpPT4iY3NzIiwKICAiU0FTUyI9PiJzYXNzIiwKICAiTEVTUyI9PiJsZXNzIgopOwokdGhpcy0+c21hcnR5LT5hc3NpZ24oJ2Nzc3JlcGxhY2V0ZXh0JywgJHRoaXMtPkxhbmcoImNzc3JlcGxhY2UiKSk7CiR0aGlzLT5zbWFydHktPmFzc2lnbignY3NzcmVwbGFjZWlucHV0JywgJHRoaXMtPkNyZWF0ZUlucHV0RHJvcGRvd24oJGlkLCJjc3NyZXBsYWNlIiwkY3NzcmVwbGFjZW1lbnRzLC0xLCR0aGlzLT5HZXRQcmVmZXJlbmNlKCJjc3NyZXBsYWNlIiwiIikpKTsKCmVjaG8gJHRoaXMtPlByb2Nlc3NUZW1wbGF0ZSgnc2V0dGluZ3MudHBsJyk7CiRjb250ZW50PSIKPHRhYmxlPgogIDx0cj48dGQ+VGVzdGluZyBIVE1MLXN5bnRheDwvdGQ+PC90cj4KICA8dHI+PHRkPkFuZCBkb2luZyBhYnNvbHV0ZWx5IG5vdGhpbmcgZWxzZTwvdGQ+PC90cj4KPC90YWJsZT4KIjsKCmVjaG8gJHRoaXMtPkNyZWF0ZUZvcm1TdGFydCgkaWQsImRlZmF1bHRhZG1pbiIpOwplY2hvICR0aGlzLT5DcmVhdGVUZXh0QXJlYShmYWxzZSwkaWQsJGNvbnRlbnQsInRlc3RodG1sIiwnJywnJywnJywnJywnJywnJywnQ29kZU1pcnJvcicsImh0bWwiKTsKZWNobyAkdGhpcy0+Q3JlYXRlRm9ybUVuZCgpOwoKZWNobyAiPGJyLz4iOwoKJGNvbnRlbnQ9IgouQ29kZU1pcnJvciB7CiAgLyogU2V0IGhlaWdodCwgd2lkdGgsIGJvcmRlcnMsIGFuZCBnbG9iYWwgZm9udCBwcm9wZXJ0aWVzIGhlcmUgKi8KICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogIGhlaWdodDogMzAwcHg7CiAgY29sb3I6IGJsYWNrOwp9CgovKiBQQURESU5HICovCgouQ29kZU1pcnJvci1saW5lcyB7CiAgcGFkZGluZzogNHB4IDA7IC8qIFZlcnRpY2FsIHBhZGRpbmcgYXJvdW5kIGNvbnRlbnQgKi8KfQouQ29kZU1pcnJvciBwcmUgewogIHBhZGRpbmc6IDAgNHB4OyAvKiBIb3Jpem9udGFsIHBhZGRpbmcgb2YgY29udGVudCAqLwp9CiI7CmVjaG8gJHRoaXMtPkNyZWF0ZUZvcm1TdGFydCgkaWQsImRlZmF1bHRhZG1pbiIpOwplY2hvICR0aGlzLT5DcmVhdGVUZXh0QXJlYShmYWxzZSwkaWQsJGNvbnRlbnQsInRlc3RodG1sIiwnJywnJywnJywnJywnJywnJywnQ29kZU1pcnJvcicsImNzcyIpOwplY2hvICR0aGlzLT5DcmVhdGVGb3JtRW5kKCk7CgplY2hvICR0aGlzLT5FbmRUYWIoKTsKLy8kY29uZmlnPWNtc21zKCktPkdldENvbmZpZygpOwovL3ByaW50X3IoJGNvbmZpZyk7Cgo/Pg==]]></data>
	</file>
	<file>
	  <filename>/action.savesettings.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKCmlmICghZnVuY3Rpb25fZXhpc3RzKCJjbXNtcyIpKSBleGl0OwoKaWYgKCEkdGhpcy0+Q2hlY2tQZXJtaXNzaW9uKCdNb2RpZnkgU2l0ZSBQcmVmZXJlbmNlcycpKSB7CiAgZWNobyAkdGhpcy0+U2hvd0Vycm9ycygkdGhpcy0+TGFuZygnbmVlZHBlcm1pc3Npb24nLCBhcnJheSgnTW9kaWZ5IFNpdGUgUHJlZmVyZW5jZXMnKSkpOwogIHJldHVybjsKfQoKaWYoaXNzZXQoJHBhcmFtc1sic2hvd2xpbmVudW1iZXJzIl0pKSAKICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgic2hvd2xpbmVudW1iZXJzIiwgJHBhcmFtc1sic2hvd2xpbmVudW1iZXJzIl0pOwplbHNlCiAgJHRoaXMtPlNldFByZWZlcmVuY2UoInNob3dsaW5lbnVtYmVycyIsICcwJyk7CgovKmlmKGlzc2V0KCRwYXJhbXNbImFsbG93ZnVsbHNjcmVlbiJdKSkKICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgiYWxsb3dmdWxsc2NyZWVuIiwgJHBhcmFtc1siYWxsb3dmdWxsc2NyZWVuIl0pOwplbHNlCiAgJHRoaXMtPlNldFByZWZlcmVuY2UoImFsbG93ZnVsbHNjcmVlbiIsICcwJyk7CiovCmlmKGlzc2V0KCRwYXJhbXNbInRleHR3cmFwcGluZyJdKSkKICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgidGV4dHdyYXBwaW5nIiwgJHBhcmFtc1sidGV4dHdyYXBwaW5nIl0pOwplbHNlCiAgJHRoaXMtPlNldFByZWZlcmVuY2UoInRleHR3cmFwcGluZyIsICcwJyk7CiAgCi8qaWYoaXNzZXQoJHBhcmFtc1siYXV0b21hdGNocGFyZW5zIl0pKQogICR0aGlzLT5TZXRQcmVmZXJlbmNlKCJhdXRvbWF0Y2hwYXJlbnMiLCAkcGFyYW1zWyJhdXRvbWF0Y2hwYXJlbnMiXSk7CmVsc2UKICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgiYXV0b21hdGNocGFyZW5zIiwgJzAnKTsqLwoKaWYoaXNzZXQoJHBhcmFtc1sidGFiaGFuZGxpbmciXSkpCiAgJHRoaXMtPlNldFByZWZlcmVuY2UoInRhYmhhbmRsaW5nIiwgJHBhcmFtc1sidGFiaGFuZGxpbmciXSk7CgppZihpc3NldCgkcGFyYW1zWyJ0YWJzaXplIl0pKQogICR0aGlzLT5TZXRQcmVmZXJlbmNlKCJ0YWJzaXplIiwgJHBhcmFtc1sidGFic2l6ZSJdKTsKCmlmKGlzc2V0KCRwYXJhbXNbImNzc2FkZGl0aW9ucyJdKSkKICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgiY3NzYWRkaXRpb25zIiwgJHBhcmFtc1siY3NzYWRkaXRpb25zIl0pOwoKaWYoaXNzZXQoJHBhcmFtc1siY3NzcmVwbGFjZSJdKSkKICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgiY3NzcmVwbGFjZSIsICRwYXJhbXNbImNzc3JlcGxhY2UiXSk7CgppZihpc3NldCgkcGFyYW1zWyJ0aGVtZSJdKSkKICAkdGhpcy0+U2V0UHJlZmVyZW5jZSgidGhlbWUiLCAkcGFyYW1zWyJ0aGVtZSJdKTsKCgokdGhpcy0+UmVkaXJlY3QoJGlkLCAnZGVmYXVsdGFkbWluJywgJHJldHVybmlkLGFycmF5KCJtb2R1bGVfbWVzc2FnZSI9PiR0aGlzLT5MYW5nKCJzZXR0aW5nc3NhdmVkIiksInRhYiI9PiJzZXR0aW5ncyIpKTsKPz4=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/.travis.yml</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[bGFuZ3VhZ2U6IG5vZGVfanMKbm9kZV9qczoKICAtIDAuOAo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/comment/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/comment/comment.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CgogIHZhciBub09wdGlvbnMgPSB7fTsKICB2YXIgbm9uV1MgPSAvW15cc1x1MDBhMF0vOwogIHZhciBQb3MgPSBDb2RlTWlycm9yLlBvczsKCiAgZnVuY3Rpb24gZmlyc3ROb25XUyhzdHIpIHsKICAgIHZhciBmb3VuZCA9IHN0ci5zZWFyY2gobm9uV1MpOwogICAgcmV0dXJuIGZvdW5kID09IC0xID8gMCA6IGZvdW5kOwogIH0KCiAgQ29kZU1pcnJvci5jb21tYW5kcy50b2dnbGVDb21tZW50ID0gZnVuY3Rpb24oY20pIHsKICAgIHZhciBtaW5MaW5lID0gSW5maW5pdHksIHJhbmdlcyA9IGNtLmxpc3RTZWxlY3Rpb25zKCksIG1vZGUgPSBudWxsOwogICAgZm9yICh2YXIgaSA9IHJhbmdlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewogICAgICB2YXIgZnJvbSA9IHJhbmdlc1tpXS5mcm9tKCksIHRvID0gcmFuZ2VzW2ldLnRvKCk7CiAgICAgIGlmIChmcm9tLmxpbmUgPj0gbWluTGluZSkgY29udGludWU7CiAgICAgIGlmICh0by5saW5lID49IG1pbkxpbmUpIHRvID0gUG9zKG1pbkxpbmUsIDApOwogICAgICBtaW5MaW5lID0gZnJvbS5saW5lOwogICAgICBpZiAobW9kZSA9PSBudWxsKSB7CiAgICAgICAgaWYgKGNtLnVuY29tbWVudChmcm9tLCB0bykpIG1vZGUgPSAidW4iOwogICAgICAgIGVsc2UgeyBjbS5saW5lQ29tbWVudChmcm9tLCB0byk7IG1vZGUgPSAibGluZSI7IH0KICAgICAgfSBlbHNlIGlmIChtb2RlID09ICJ1biIpIHsKICAgICAgICBjbS51bmNvbW1lbnQoZnJvbSwgdG8pOwogICAgICB9IGVsc2UgewogICAgICAgIGNtLmxpbmVDb21tZW50KGZyb20sIHRvKTsKICAgICAgfQogICAgfQogIH07CgogIENvZGVNaXJyb3IuZGVmaW5lRXh0ZW5zaW9uKCJsaW5lQ29tbWVudCIsIGZ1bmN0aW9uKGZyb20sIHRvLCBvcHRpb25zKSB7CiAgICBpZiAoIW9wdGlvbnMpIG9wdGlvbnMgPSBub09wdGlvbnM7CiAgICB2YXIgc2VsZiA9IHRoaXMsIG1vZGUgPSBzZWxmLmdldE1vZGVBdChmcm9tKTsKICAgIHZhciBjb21tZW50U3RyaW5nID0gb3B0aW9ucy5saW5lQ29tbWVudCB8fCBtb2RlLmxpbmVDb21tZW50OwogICAgaWYgKCFjb21tZW50U3RyaW5nKSB7CiAgICAgIGlmIChvcHRpb25zLmJsb2NrQ29tbWVudFN0YXJ0IHx8IG1vZGUuYmxvY2tDb21tZW50U3RhcnQpIHsKICAgICAgICBvcHRpb25zLmZ1bGxMaW5lcyA9IHRydWU7CiAgICAgICAgc2VsZi5ibG9ja0NvbW1lbnQoZnJvbSwgdG8sIG9wdGlvbnMpOwogICAgICB9CiAgICAgIHJldHVybjsKICAgIH0KICAgIHZhciBmaXJzdExpbmUgPSBzZWxmLmdldExpbmUoZnJvbS5saW5lKTsKICAgIGlmIChmaXJzdExpbmUgPT0gbnVsbCkgcmV0dXJuOwogICAgdmFyIGVuZCA9IE1hdGgubWluKHRvLmNoICE9IDAgfHwgdG8ubGluZSA9PSBmcm9tLmxpbmUgPyB0by5saW5lICsgMSA6IHRvLmxpbmUsIHNlbGYubGFzdExpbmUoKSArIDEpOwogICAgdmFyIHBhZCA9IG9wdGlvbnMucGFkZGluZyA9PSBudWxsID8gIiAiIDogb3B0aW9ucy5wYWRkaW5nOwogICAgdmFyIGJsYW5rTGluZXMgPSBvcHRpb25zLmNvbW1lbnRCbGFua0xpbmVzIHx8IGZyb20ubGluZSA9PSB0by5saW5lOwoKICAgIHNlbGYub3BlcmF0aW9uKGZ1bmN0aW9uKCkgewogICAgICBpZiAob3B0aW9ucy5pbmRlbnQpIHsKICAgICAgICB2YXIgYmFzZVN0cmluZyA9IGZpcnN0TGluZS5zbGljZSgwLCBmaXJzdE5vbldTKGZpcnN0TGluZSkpOwogICAgICAgIGZvciAodmFyIGkgPSBmcm9tLmxpbmU7IGkgPCBlbmQ7ICsraSkgewogICAgICAgICAgdmFyIGxpbmUgPSBzZWxmLmdldExpbmUoaSksIGN1dCA9IGJhc2VTdHJpbmcubGVuZ3RoOwogICAgICAgICAgaWYgKCFibGFua0xpbmVzICYmICFub25XUy50ZXN0KGxpbmUpKSBjb250aW51ZTsKICAgICAgICAgIGlmIChsaW5lLnNsaWNlKDAsIGN1dCkgIT0gYmFzZVN0cmluZykgY3V0ID0gZmlyc3ROb25XUyhsaW5lKTsKICAgICAgICAgIHNlbGYucmVwbGFjZVJhbmdlKGJhc2VTdHJpbmcgKyBjb21tZW50U3RyaW5nICsgcGFkLCBQb3MoaSwgMCksIFBvcyhpLCBjdXQpKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZm9yICh2YXIgaSA9IGZyb20ubGluZTsgaSA8IGVuZDsgKytpKSB7CiAgICAgICAgICBpZiAoYmxhbmtMaW5lcyB8fCBub25XUy50ZXN0KHNlbGYuZ2V0TGluZShpKSkpCiAgICAgICAgICAgIHNlbGYucmVwbGFjZVJhbmdlKGNvbW1lbnRTdHJpbmcgKyBwYWQsIFBvcyhpLCAwKSk7CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKICB9KTsKCiAgQ29kZU1pcnJvci5kZWZpbmVFeHRlbnNpb24oImJsb2NrQ29tbWVudCIsIGZ1bmN0aW9uKGZyb20sIHRvLCBvcHRpb25zKSB7CiAgICBpZiAoIW9wdGlvbnMpIG9wdGlvbnMgPSBub09wdGlvbnM7CiAgICB2YXIgc2VsZiA9IHRoaXMsIG1vZGUgPSBzZWxmLmdldE1vZGVBdChmcm9tKTsKICAgIHZhciBzdGFydFN0cmluZyA9IG9wdGlvbnMuYmxvY2tDb21tZW50U3RhcnQgfHwgbW9kZS5ibG9ja0NvbW1lbnRTdGFydDsKICAgIHZhciBlbmRTdHJpbmcgPSBvcHRpb25zLmJsb2NrQ29tbWVudEVuZCB8fCBtb2RlLmJsb2NrQ29tbWVudEVuZDsKICAgIGlmICghc3RhcnRTdHJpbmcgfHwgIWVuZFN0cmluZykgewogICAgICBpZiAoKG9wdGlvbnMubGluZUNvbW1lbnQgfHwgbW9kZS5saW5lQ29tbWVudCkgJiYgb3B0aW9ucy5mdWxsTGluZXMgIT0gZmFsc2UpCiAgICAgICAgc2VsZi5saW5lQ29tbWVudChmcm9tLCB0bywgb3B0aW9ucyk7CiAgICAgIHJldHVybjsKICAgIH0KCiAgICB2YXIgZW5kID0gTWF0aC5taW4odG8ubGluZSwgc2VsZi5sYXN0TGluZSgpKTsKICAgIGlmIChlbmQgIT0gZnJvbS5saW5lICYmIHRvLmNoID09IDAgJiYgbm9uV1MudGVzdChzZWxmLmdldExpbmUoZW5kKSkpIC0tZW5kOwoKICAgIHZhciBwYWQgPSBvcHRpb25zLnBhZGRpbmcgPT0gbnVsbCA/ICIgIiA6IG9wdGlvbnMucGFkZGluZzsKICAgIGlmIChmcm9tLmxpbmUgPiBlbmQpIHJldHVybjsKCiAgICBzZWxmLm9wZXJhdGlvbihmdW5jdGlvbigpIHsKICAgICAgaWYgKG9wdGlvbnMuZnVsbExpbmVzICE9IGZhbHNlKSB7CiAgICAgICAgdmFyIGxhc3RMaW5lSGFzVGV4dCA9IG5vbldTLnRlc3Qoc2VsZi5nZXRMaW5lKGVuZCkpOwogICAgICAgIHNlbGYucmVwbGFjZVJhbmdlKHBhZCArIGVuZFN0cmluZywgUG9zKGVuZCkpOwogICAgICAgIHNlbGYucmVwbGFjZVJhbmdlKHN0YXJ0U3RyaW5nICsgcGFkLCBQb3MoZnJvbS5saW5lLCAwKSk7CiAgICAgICAgdmFyIGxlYWQgPSBvcHRpb25zLmJsb2NrQ29tbWVudExlYWQgfHwgbW9kZS5ibG9ja0NvbW1lbnRMZWFkOwogICAgICAgIGlmIChsZWFkICE9IG51bGwpIGZvciAodmFyIGkgPSBmcm9tLmxpbmUgKyAxOyBpIDw9IGVuZDsgKytpKQogICAgICAgICAgaWYgKGkgIT0gZW5kIHx8IGxhc3RMaW5lSGFzVGV4dCkKICAgICAgICAgICAgc2VsZi5yZXBsYWNlUmFuZ2UobGVhZCArIHBhZCwgUG9zKGksIDApKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzZWxmLnJlcGxhY2VSYW5nZShlbmRTdHJpbmcsIHRvKTsKICAgICAgICBzZWxmLnJlcGxhY2VSYW5nZShzdGFydFN0cmluZywgZnJvbSk7CiAgICAgIH0KICAgIH0pOwogIH0pOwoKICBDb2RlTWlycm9yLmRlZmluZUV4dGVuc2lvbigidW5jb21tZW50IiwgZnVuY3Rpb24oZnJvbSwgdG8sIG9wdGlvbnMpIHsKICAgIGlmICghb3B0aW9ucykgb3B0aW9ucyA9IG5vT3B0aW9uczsKICAgIHZhciBzZWxmID0gdGhpcywgbW9kZSA9IHNlbGYuZ2V0TW9kZUF0KGZyb20pOwogICAgdmFyIGVuZCA9IE1hdGgubWluKHRvLmxpbmUsIHNlbGYubGFzdExpbmUoKSksIHN0YXJ0ID0gTWF0aC5taW4oZnJvbS5saW5lLCBlbmQpOwoKICAgIC8vIFRyeSBmaW5kaW5nIGxpbmUgY29tbWVudHMKICAgIHZhciBsaW5lU3RyaW5nID0gb3B0aW9ucy5saW5lQ29tbWVudCB8fCBtb2RlLmxpbmVDb21tZW50LCBsaW5lcyA9IFtdOwogICAgdmFyIHBhZCA9IG9wdGlvbnMucGFkZGluZyA9PSBudWxsID8gIiAiIDogb3B0aW9ucy5wYWRkaW5nLCBkaWRTb21ldGhpbmc7CiAgICBsaW5lQ29tbWVudDogewogICAgICBpZiAoIWxpbmVTdHJpbmcpIGJyZWFrIGxpbmVDb21tZW50OwogICAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPD0gZW5kOyArK2kpIHsKICAgICAgICB2YXIgbGluZSA9IHNlbGYuZ2V0TGluZShpKTsKICAgICAgICB2YXIgZm91bmQgPSBsaW5lLmluZGV4T2YobGluZVN0cmluZyk7CiAgICAgICAgaWYgKGZvdW5kID4gLTEgJiYgIS9jb21tZW50Ly50ZXN0KHNlbGYuZ2V0VG9rZW5UeXBlQXQoUG9zKGksIGZvdW5kICsgMSkpKSkgZm91bmQgPSAtMTsKICAgICAgICBpZiAoZm91bmQgPT0gLTEgJiYgKGkgIT0gZW5kIHx8IGkgPT0gc3RhcnQpICYmIG5vbldTLnRlc3QobGluZSkpIGJyZWFrIGxpbmVDb21tZW50OwogICAgICAgIGlmIChmb3VuZCA+IC0xICYmIG5vbldTLnRlc3QobGluZS5zbGljZSgwLCBmb3VuZCkpKSBicmVhayBsaW5lQ29tbWVudDsKICAgICAgICBsaW5lcy5wdXNoKGxpbmUpOwogICAgICB9CiAgICAgIHNlbGYub3BlcmF0aW9uKGZ1bmN0aW9uKCkgewogICAgICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8PSBlbmQ7ICsraSkgewogICAgICAgICAgdmFyIGxpbmUgPSBsaW5lc1tpIC0gc3RhcnRdOwogICAgICAgICAgdmFyIHBvcyA9IGxpbmUuaW5kZXhPZihsaW5lU3RyaW5nKSwgZW5kUG9zID0gcG9zICsgbGluZVN0cmluZy5sZW5ndGg7CiAgICAgICAgICBpZiAocG9zIDwgMCkgY29udGludWU7CiAgICAgICAgICBpZiAobGluZS5zbGljZShlbmRQb3MsIGVuZFBvcyArIHBhZC5sZW5ndGgpID09IHBhZCkgZW5kUG9zICs9IHBhZC5sZW5ndGg7CiAgICAgICAgICBkaWRTb21ldGhpbmcgPSB0cnVlOwogICAgICAgICAgc2VsZi5yZXBsYWNlUmFuZ2UoIiIsIFBvcyhpLCBwb3MpLCBQb3MoaSwgZW5kUG9zKSk7CiAgICAgICAgfQogICAgICB9KTsKICAgICAgaWYgKGRpZFNvbWV0aGluZykgcmV0dXJuIHRydWU7CiAgICB9CgogICAgLy8gVHJ5IGJsb2NrIGNvbW1lbnRzCiAgICB2YXIgc3RhcnRTdHJpbmcgPSBvcHRpb25zLmJsb2NrQ29tbWVudFN0YXJ0IHx8IG1vZGUuYmxvY2tDb21tZW50U3RhcnQ7CiAgICB2YXIgZW5kU3RyaW5nID0gb3B0aW9ucy5ibG9ja0NvbW1lbnRFbmQgfHwgbW9kZS5ibG9ja0NvbW1lbnRFbmQ7CiAgICBpZiAoIXN0YXJ0U3RyaW5nIHx8ICFlbmRTdHJpbmcpIHJldHVybiBmYWxzZTsKICAgIHZhciBsZWFkID0gb3B0aW9ucy5ibG9ja0NvbW1lbnRMZWFkIHx8IG1vZGUuYmxvY2tDb21tZW50TGVhZDsKICAgIHZhciBzdGFydExpbmUgPSBzZWxmLmdldExpbmUoc3RhcnQpLCBlbmRMaW5lID0gZW5kID09IHN0YXJ0ID8gc3RhcnRMaW5lIDogc2VsZi5nZXRMaW5lKGVuZCk7CiAgICB2YXIgb3BlbiA9IHN0YXJ0TGluZS5pbmRleE9mKHN0YXJ0U3RyaW5nKSwgY2xvc2UgPSBlbmRMaW5lLmxhc3RJbmRleE9mKGVuZFN0cmluZyk7CiAgICBpZiAoY2xvc2UgPT0gLTEgJiYgc3RhcnQgIT0gZW5kKSB7CiAgICAgIGVuZExpbmUgPSBzZWxmLmdldExpbmUoLS1lbmQpOwogICAgICBjbG9zZSA9IGVuZExpbmUubGFzdEluZGV4T2YoZW5kU3RyaW5nKTsKICAgIH0KICAgIGlmIChvcGVuID09IC0xIHx8IGNsb3NlID09IC0xIHx8CiAgICAgICAgIS9jb21tZW50Ly50ZXN0KHNlbGYuZ2V0VG9rZW5UeXBlQXQoUG9zKHN0YXJ0LCBvcGVuICsgMSkpKSB8fAogICAgICAgICEvY29tbWVudC8udGVzdChzZWxmLmdldFRva2VuVHlwZUF0KFBvcyhlbmQsIGNsb3NlICsgMSkpKSkKICAgICAgcmV0dXJuIGZhbHNlOwoKICAgIC8vIEF2b2lkIGtpbGxpbmcgYmxvY2sgY29tbWVudHMgY29tcGxldGVseSBvdXRzaWRlIHRoZSBzZWxlY3Rpb24uCiAgICAvLyBQb3NpdGlvbnMgb2YgdGhlIGxhc3Qgc3RhcnRTdHJpbmcgYmVmb3JlIHRoZSBzdGFydCBvZiB0aGUgc2VsZWN0aW9uLCBhbmQgdGhlIGZpcnN0IGVuZFN0cmluZyBhZnRlciBpdC4KICAgIHZhciBsYXN0U3RhcnQgPSBzdGFydExpbmUubGFzdEluZGV4T2Yoc3RhcnRTdHJpbmcsIGZyb20uY2gpOwogICAgdmFyIGZpcnN0RW5kID0gbGFzdFN0YXJ0ID09IC0xID8gLTEgOiBzdGFydExpbmUuc2xpY2UoMCwgZnJvbS5jaCkuaW5kZXhPZihlbmRTdHJpbmcsIGxhc3RTdGFydCArIHN0YXJ0U3RyaW5nLmxlbmd0aCk7CiAgICBpZiAobGFzdFN0YXJ0ICE9IC0xICYmIGZpcnN0RW5kICE9IC0xKSByZXR1cm4gZmFsc2U7CiAgICAvLyBQb3NpdGlvbnMgb2YgdGhlIGZpcnN0IGVuZFN0cmluZyBhZnRlciB0aGUgZW5kIG9mIHRoZSBzZWxlY3Rpb24sIGFuZCB0aGUgbGFzdCBzdGFydFN0cmluZyBiZWZvcmUgaXQuCiAgICBmaXJzdEVuZCA9IGVuZExpbmUuaW5kZXhPZihlbmRTdHJpbmcsIHRvLmNoKTsKICAgIHZhciBhbG1vc3RMYXN0U3RhcnQgPSBlbmRMaW5lLnNsaWNlKHRvLmNoKS5sYXN0SW5kZXhPZihzdGFydFN0cmluZywgZmlyc3RFbmQgLSB0by5jaCk7CiAgICBsYXN0U3RhcnQgPSAoZmlyc3RFbmQgPT0gLTEgfHwgYWxtb3N0TGFzdFN0YXJ0ID09IC0xKSA/IC0xIDogdG8uY2ggKyBhbG1vc3RMYXN0U3RhcnQ7CiAgICBpZiAoZmlyc3RFbmQgIT0gLTEgJiYgbGFzdFN0YXJ0ICE9IC0xKSByZXR1cm4gZmFsc2U7CgogICAgc2VsZi5vcGVyYXRpb24oZnVuY3Rpb24oKSB7CiAgICAgIHNlbGYucmVwbGFjZVJhbmdlKCIiLCBQb3MoZW5kLCBjbG9zZSAtIChwYWQgJiYgZW5kTGluZS5zbGljZShjbG9zZSAtIHBhZC5sZW5ndGgsIGNsb3NlKSA9PSBwYWQgPyBwYWQubGVuZ3RoIDogMCkpLAogICAgICAgICAgICAgICAgICAgICAgICBQb3MoZW5kLCBjbG9zZSArIGVuZFN0cmluZy5sZW5ndGgpKTsKICAgICAgdmFyIG9wZW5FbmQgPSBvcGVuICsgc3RhcnRTdHJpbmcubGVuZ3RoOwogICAgICBpZiAocGFkICYmIHN0YXJ0TGluZS5zbGljZShvcGVuRW5kLCBvcGVuRW5kICsgcGFkLmxlbmd0aCkgPT0gcGFkKSBvcGVuRW5kICs9IHBhZC5sZW5ndGg7CiAgICAgIHNlbGYucmVwbGFjZVJhbmdlKCIiLCBQb3Moc3RhcnQsIG9wZW4pLCBQb3Moc3RhcnQsIG9wZW5FbmQpKTsKICAgICAgaWYgKGxlYWQpIGZvciAodmFyIGkgPSBzdGFydCArIDE7IGkgPD0gZW5kOyArK2kpIHsKICAgICAgICB2YXIgbGluZSA9IHNlbGYuZ2V0TGluZShpKSwgZm91bmQgPSBsaW5lLmluZGV4T2YobGVhZCk7CiAgICAgICAgaWYgKGZvdW5kID09IC0xIHx8IG5vbldTLnRlc3QobGluZS5zbGljZSgwLCBmb3VuZCkpKSBjb250aW51ZTsKICAgICAgICB2YXIgZm91bmRFbmQgPSBmb3VuZCArIGxlYWQubGVuZ3RoOwogICAgICAgIGlmIChwYWQgJiYgbGluZS5zbGljZShmb3VuZEVuZCwgZm91bmRFbmQgKyBwYWQubGVuZ3RoKSA9PSBwYWQpIGZvdW5kRW5kICs9IHBhZC5sZW5ndGg7CiAgICAgICAgc2VsZi5yZXBsYWNlUmFuZ2UoIiIsIFBvcyhpLCBmb3VuZCksIFBvcyhpLCBmb3VuZEVuZCkpOwogICAgICB9CiAgICB9KTsKICAgIHJldHVybiB0cnVlOwogIH0pOwp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/comment/continuecomment.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICB2YXIgbW9kZXMgPSBbImNsaWtlIiwgImNzcyIsICJqYXZhc2NyaXB0Il07CgogIGZvciAodmFyIGkgPSAwOyBpIDwgbW9kZXMubGVuZ3RoOyArK2kpCiAgICBDb2RlTWlycm9yLmV4dGVuZE1vZGUobW9kZXNbaV0sIHtibG9ja0NvbW1lbnRDb250aW51ZTogIiAqICJ9KTsKCiAgZnVuY3Rpb24gY29udGludWVDb21tZW50KGNtKSB7CiAgICBpZiAoY20uZ2V0T3B0aW9uKCJkaXNhYmxlSW5wdXQiKSkgcmV0dXJuIENvZGVNaXJyb3IuUGFzczsKICAgIHZhciByYW5nZXMgPSBjbS5saXN0U2VsZWN0aW9ucygpLCBtb2RlLCBpbnNlcnRzID0gW107CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJhbmdlcy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgcG9zID0gcmFuZ2VzW2ldLmhlYWQsIHRva2VuID0gY20uZ2V0VG9rZW5BdChwb3MpOwogICAgICBpZiAodG9rZW4udHlwZSAhPSAiY29tbWVudCIpIHJldHVybiBDb2RlTWlycm9yLlBhc3M7CiAgICAgIHZhciBtb2RlSGVyZSA9IENvZGVNaXJyb3IuaW5uZXJNb2RlKGNtLmdldE1vZGUoKSwgdG9rZW4uc3RhdGUpLm1vZGU7CiAgICAgIGlmICghbW9kZSkgbW9kZSA9IG1vZGVIZXJlOwogICAgICBlbHNlIGlmIChtb2RlICE9IG1vZGVIZXJlKSByZXR1cm4gQ29kZU1pcnJvci5QYXNzOwoKICAgICAgdmFyIGluc2VydCA9IG51bGw7CiAgICAgIGlmIChtb2RlLmJsb2NrQ29tbWVudFN0YXJ0ICYmIG1vZGUuYmxvY2tDb21tZW50Q29udGludWUpIHsKICAgICAgICB2YXIgZW5kID0gdG9rZW4uc3RyaW5nLmluZGV4T2YobW9kZS5ibG9ja0NvbW1lbnRFbmQpOwogICAgICAgIHZhciBmdWxsID0gY20uZ2V0UmFuZ2UoQ29kZU1pcnJvci5Qb3MocG9zLmxpbmUsIDApLCBDb2RlTWlycm9yLlBvcyhwb3MubGluZSwgdG9rZW4uZW5kKSksIGZvdW5kOwogICAgICAgIGlmIChlbmQgIT0gLTEgJiYgZW5kID09IHRva2VuLnN0cmluZy5sZW5ndGggLSBtb2RlLmJsb2NrQ29tbWVudEVuZC5sZW5ndGggJiYgcG9zLmNoID49IGVuZCkgewogICAgICAgICAgLy8gQ29tbWVudCBlbmRlZCwgZG9uJ3QgY29udGludWUgaXQKICAgICAgICB9IGVsc2UgaWYgKHRva2VuLnN0cmluZy5pbmRleE9mKG1vZGUuYmxvY2tDb21tZW50U3RhcnQpID09IDApIHsKICAgICAgICAgIGluc2VydCA9IGZ1bGwuc2xpY2UoMCwgdG9rZW4uc3RhcnQpOwogICAgICAgICAgaWYgKCEvXlxzKiQvLnRlc3QoaW5zZXJ0KSkgewogICAgICAgICAgICBpbnNlcnQgPSAiIjsKICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB0b2tlbi5zdGFydDsgKytqKSBpbnNlcnQgKz0gIiAiOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoKGZvdW5kID0gZnVsbC5pbmRleE9mKG1vZGUuYmxvY2tDb21tZW50Q29udGludWUpKSAhPSAtMSAmJgogICAgICAgICAgICAgICAgICAgZm91bmQgKyBtb2RlLmJsb2NrQ29tbWVudENvbnRpbnVlLmxlbmd0aCA+IHRva2VuLnN0YXJ0ICYmCiAgICAgICAgICAgICAgICAgICAvXlxzKiQvLnRlc3QoZnVsbC5zbGljZSgwLCBmb3VuZCkpKSB7CiAgICAgICAgICBpbnNlcnQgPSBmdWxsLnNsaWNlKDAsIGZvdW5kKTsKICAgICAgICB9CiAgICAgICAgaWYgKGluc2VydCAhPSBudWxsKSBpbnNlcnQgKz0gbW9kZS5ibG9ja0NvbW1lbnRDb250aW51ZTsKICAgICAgfQogICAgICBpZiAoaW5zZXJ0ID09IG51bGwgJiYgbW9kZS5saW5lQ29tbWVudCAmJiBjb250aW51ZUxpbmVDb21tZW50RW5hYmxlZChjbSkpIHsKICAgICAgICB2YXIgbGluZSA9IGNtLmdldExpbmUocG9zLmxpbmUpLCBmb3VuZCA9IGxpbmUuaW5kZXhPZihtb2RlLmxpbmVDb21tZW50KTsKICAgICAgICBpZiAoZm91bmQgPiAtMSkgewogICAgICAgICAgaW5zZXJ0ID0gbGluZS5zbGljZSgwLCBmb3VuZCk7CiAgICAgICAgICBpZiAoL1xTLy50ZXN0KGluc2VydCkpIGluc2VydCA9IG51bGw7CiAgICAgICAgICBlbHNlIGluc2VydCArPSBtb2RlLmxpbmVDb21tZW50ICsgbGluZS5zbGljZShmb3VuZCArIG1vZGUubGluZUNvbW1lbnQubGVuZ3RoKS5tYXRjaCgvXlxzKi8pWzBdOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoaW5zZXJ0ID09IG51bGwpIHJldHVybiBDb2RlTWlycm9yLlBhc3M7CiAgICAgIGluc2VydHNbaV0gPSAiXG4iICsgaW5zZXJ0OwogICAgfQoKICAgIGNtLm9wZXJhdGlvbihmdW5jdGlvbigpIHsKICAgICAgZm9yICh2YXIgaSA9IHJhbmdlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkKICAgICAgICBjbS5yZXBsYWNlUmFuZ2UoaW5zZXJ0c1tpXSwgcmFuZ2VzW2ldLmZyb20oKSwgcmFuZ2VzW2ldLnRvKCksICIraW5zZXJ0Iik7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIGNvbnRpbnVlTGluZUNvbW1lbnRFbmFibGVkKGNtKSB7CiAgICB2YXIgb3B0ID0gY20uZ2V0T3B0aW9uKCJjb250aW51ZUNvbW1lbnRzIik7CiAgICBpZiAob3B0ICYmIHR5cGVvZiBvcHQgPT0gIm9iamVjdCIpCiAgICAgIHJldHVybiBvcHQuY29udGludWVMaW5lQ29tbWVudCAhPT0gZmFsc2U7CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIENvZGVNaXJyb3IuZGVmaW5lT3B0aW9uKCJjb250aW51ZUNvbW1lbnRzIiwgbnVsbCwgZnVuY3Rpb24oY20sIHZhbCwgcHJldikgewogICAgaWYgKHByZXYgJiYgcHJldiAhPSBDb2RlTWlycm9yLkluaXQpCiAgICAgIGNtLnJlbW92ZUtleU1hcCgiY29udGludWVDb21tZW50Iik7CiAgICBpZiAodmFsKSB7CiAgICAgIHZhciBrZXkgPSAiRW50ZXIiOwogICAgICBpZiAodHlwZW9mIHZhbCA9PSAic3RyaW5nIikKICAgICAgICBrZXkgPSB2YWw7CiAgICAgIGVsc2UgaWYgKHR5cGVvZiB2YWwgPT0gIm9iamVjdCIgJiYgdmFsLmtleSkKICAgICAgICBrZXkgPSB2YWwua2V5OwogICAgICB2YXIgbWFwID0ge25hbWU6ICJjb250aW51ZUNvbW1lbnQifTsKICAgICAgbWFwW2tleV0gPSBjb250aW51ZUNvbW1lbnQ7CiAgICAgIGNtLmFkZEtleU1hcChtYXApOwogICAgfQogIH0pOwp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/comment/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCEtLSBEVU1NWSBIVE1MIEZJTEUgLS0+]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/dialog/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/dialog/dialog.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LkNvZGVNaXJyb3ItZGlhbG9nIHsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgbGVmdDogMDsgcmlnaHQ6IDA7CiAgYmFja2dyb3VuZDogd2hpdGU7CiAgei1pbmRleDogMTU7CiAgcGFkZGluZzogLjFlbSAuOGVtOwogIG92ZXJmbG93OiBoaWRkZW47CiAgY29sb3I6ICMzMzM7Cn0KCi5Db2RlTWlycm9yLWRpYWxvZy10b3AgewogIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZWVlOwogIHRvcDogMDsKfQoKLkNvZGVNaXJyb3ItZGlhbG9nLWJvdHRvbSB7CiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNlZWU7CiAgYm90dG9tOiAwOwp9CgouQ29kZU1pcnJvci1kaWFsb2cgaW5wdXQgewogIGJvcmRlcjogbm9uZTsKICBvdXRsaW5lOiBub25lOwogIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogIHdpZHRoOiAyMGVtOwogIGNvbG9yOiBpbmhlcml0OwogIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7Cn0KCi5Db2RlTWlycm9yLWRpYWxvZyBidXR0b24gewogIGZvbnQtc2l6ZTogNzAlOwp9Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/dialog/dialog.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovLyBPcGVuIHNpbXBsZSBkaWFsb2dzIG9uIHRvcCBvZiBhbiBlZGl0b3IuIFJlbGllcyBvbiBkaWFsb2cuY3NzLgoKKGZ1bmN0aW9uKG1vZCkgewogIGlmICh0eXBlb2YgZXhwb3J0cyA9PSAib2JqZWN0IiAmJiB0eXBlb2YgbW9kdWxlID09ICJvYmplY3QiKSAvLyBDb21tb25KUwogICAgbW9kKHJlcXVpcmUoIi4uLy4uL2xpYi9jb2RlbWlycm9yIikpOwogIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kKSAvLyBBTUQKICAgIGRlZmluZShbIi4uLy4uL2xpYi9jb2RlbWlycm9yIl0sIG1vZCk7CiAgZWxzZSAvLyBQbGFpbiBicm93c2VyIGVudgogICAgbW9kKENvZGVNaXJyb3IpOwp9KShmdW5jdGlvbihDb2RlTWlycm9yKSB7CiAgZnVuY3Rpb24gZGlhbG9nRGl2KGNtLCB0ZW1wbGF0ZSwgYm90dG9tKSB7CiAgICB2YXIgd3JhcCA9IGNtLmdldFdyYXBwZXJFbGVtZW50KCk7CiAgICB2YXIgZGlhbG9nOwogICAgZGlhbG9nID0gd3JhcC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSk7CiAgICBpZiAoYm90dG9tKSB7CiAgICAgIGRpYWxvZy5jbGFzc05hbWUgPSAiQ29kZU1pcnJvci1kaWFsb2cgQ29kZU1pcnJvci1kaWFsb2ctYm90dG9tIjsKICAgIH0gZWxzZSB7CiAgICAgIGRpYWxvZy5jbGFzc05hbWUgPSAiQ29kZU1pcnJvci1kaWFsb2cgQ29kZU1pcnJvci1kaWFsb2ctdG9wIjsKICAgIH0KICAgIGlmICh0eXBlb2YgdGVtcGxhdGUgPT0gInN0cmluZyIpIHsKICAgICAgZGlhbG9nLmlubmVySFRNTCA9IHRlbXBsYXRlOwogICAgfSBlbHNlIHsgLy8gQXNzdW1pbmcgaXQncyBhIGRldGFjaGVkIERPTSBlbGVtZW50LgogICAgICBkaWFsb2cuYXBwZW5kQ2hpbGQodGVtcGxhdGUpOwogICAgfQogICAgcmV0dXJuIGRpYWxvZzsKICB9CgogIGZ1bmN0aW9uIGNsb3NlTm90aWZpY2F0aW9uKGNtLCBuZXdWYWwpIHsKICAgIGlmIChjbS5zdGF0ZS5jdXJyZW50Tm90aWZpY2F0aW9uQ2xvc2UpCiAgICAgIGNtLnN0YXRlLmN1cnJlbnROb3RpZmljYXRpb25DbG9zZSgpOwogICAgY20uc3RhdGUuY3VycmVudE5vdGlmaWNhdGlvbkNsb3NlID0gbmV3VmFsOwogIH0KCiAgQ29kZU1pcnJvci5kZWZpbmVFeHRlbnNpb24oIm9wZW5EaWFsb2ciLCBmdW5jdGlvbih0ZW1wbGF0ZSwgY2FsbGJhY2ssIG9wdGlvbnMpIHsKICAgIGNsb3NlTm90aWZpY2F0aW9uKHRoaXMsIG51bGwpOwogICAgdmFyIGRpYWxvZyA9IGRpYWxvZ0Rpdih0aGlzLCB0ZW1wbGF0ZSwgb3B0aW9ucyAmJiBvcHRpb25zLmJvdHRvbSk7CiAgICB2YXIgY2xvc2VkID0gZmFsc2UsIG1lID0gdGhpczsKICAgIGZ1bmN0aW9uIGNsb3NlKG5ld1ZhbCkgewogICAgICBpZiAodHlwZW9mIG5ld1ZhbCA9PSAnc3RyaW5nJykgewogICAgICAgIGlucC52YWx1ZSA9IG5ld1ZhbDsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoY2xvc2VkKSByZXR1cm47CiAgICAgICAgY2xvc2VkID0gdHJ1ZTsKICAgICAgICBkaWFsb2cucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChkaWFsb2cpOwogICAgICB9CiAgICB9CiAgICB2YXIgaW5wID0gZGlhbG9nLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJpbnB1dCIpWzBdLCBidXR0b247CiAgICBpZiAoaW5wKSB7CiAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMudmFsdWUpIGlucC52YWx1ZSA9IG9wdGlvbnMudmFsdWU7CiAgICAgIENvZGVNaXJyb3Iub24oaW5wLCAia2V5ZG93biIsIGZ1bmN0aW9uKGUpIHsKICAgICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLm9uS2V5RG93biAmJiBvcHRpb25zLm9uS2V5RG93bihlLCBpbnAudmFsdWUsIGNsb3NlKSkgeyByZXR1cm47IH0KICAgICAgICBpZiAoZS5rZXlDb2RlID09IDEzIHx8IGUua2V5Q29kZSA9PSAyNykgewogICAgICAgICAgaW5wLmJsdXIoKTsKICAgICAgICAgIENvZGVNaXJyb3IuZV9zdG9wKGUpOwogICAgICAgICAgY2xvc2UoKTsKICAgICAgICAgIG1lLmZvY3VzKCk7CiAgICAgICAgICBpZiAoZS5rZXlDb2RlID09IDEzKSBjYWxsYmFjayhpbnAudmFsdWUpOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMub25LZXlVcCkgewogICAgICAgIENvZGVNaXJyb3Iub24oaW5wLCAia2V5dXAiLCBmdW5jdGlvbihlKSB7b3B0aW9ucy5vbktleVVwKGUsIGlucC52YWx1ZSwgY2xvc2UpO30pOwogICAgICB9CiAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMudmFsdWUpIGlucC52YWx1ZSA9IG9wdGlvbnMudmFsdWU7CiAgICAgIGlucC5mb2N1cygpOwogICAgICBDb2RlTWlycm9yLm9uKGlucCwgImJsdXIiLCBjbG9zZSk7CiAgICB9IGVsc2UgaWYgKGJ1dHRvbiA9IGRpYWxvZy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYnV0dG9uIilbMF0pIHsKICAgICAgQ29kZU1pcnJvci5vbihidXR0b24sICJjbGljayIsIGZ1bmN0aW9uKCkgewogICAgICAgIGNsb3NlKCk7CiAgICAgICAgbWUuZm9jdXMoKTsKICAgICAgfSk7CiAgICAgIGJ1dHRvbi5mb2N1cygpOwogICAgICBDb2RlTWlycm9yLm9uKGJ1dHRvbiwgImJsdXIiLCBjbG9zZSk7CiAgICB9CiAgICByZXR1cm4gY2xvc2U7CiAgfSk7CgogIENvZGVNaXJyb3IuZGVmaW5lRXh0ZW5zaW9uKCJvcGVuQ29uZmlybSIsIGZ1bmN0aW9uKHRlbXBsYXRlLCBjYWxsYmFja3MsIG9wdGlvbnMpIHsKICAgIGNsb3NlTm90aWZpY2F0aW9uKHRoaXMsIG51bGwpOwogICAgdmFyIGRpYWxvZyA9IGRpYWxvZ0Rpdih0aGlzLCB0ZW1wbGF0ZSwgb3B0aW9ucyAmJiBvcHRpb25zLmJvdHRvbSk7CiAgICB2YXIgYnV0dG9ucyA9IGRpYWxvZy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYnV0dG9uIik7CiAgICB2YXIgY2xvc2VkID0gZmFsc2UsIG1lID0gdGhpcywgYmx1cnJpbmcgPSAxOwogICAgZnVuY3Rpb24gY2xvc2UoKSB7CiAgICAgIGlmIChjbG9zZWQpIHJldHVybjsKICAgICAgY2xvc2VkID0gdHJ1ZTsKICAgICAgZGlhbG9nLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZGlhbG9nKTsKICAgICAgbWUuZm9jdXMoKTsKICAgIH0KICAgIGJ1dHRvbnNbMF0uZm9jdXMoKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYnV0dG9ucy5sZW5ndGg7ICsraSkgewogICAgICB2YXIgYiA9IGJ1dHRvbnNbaV07CiAgICAgIChmdW5jdGlvbihjYWxsYmFjaykgewogICAgICAgIENvZGVNaXJyb3Iub24oYiwgImNsaWNrIiwgZnVuY3Rpb24oZSkgewogICAgICAgICAgQ29kZU1pcnJvci5lX3ByZXZlbnREZWZhdWx0KGUpOwogICAgICAgICAgY2xvc2UoKTsKICAgICAgICAgIGlmIChjYWxsYmFjaykgY2FsbGJhY2sobWUpOwogICAgICAgIH0pOwogICAgICB9KShjYWxsYmFja3NbaV0pOwogICAgICBDb2RlTWlycm9yLm9uKGIsICJibHVyIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgLS1ibHVycmluZzsKICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyBpZiAoYmx1cnJpbmcgPD0gMCkgY2xvc2UoKTsgfSwgMjAwKTsKICAgICAgfSk7CiAgICAgIENvZGVNaXJyb3Iub24oYiwgImZvY3VzIiwgZnVuY3Rpb24oKSB7ICsrYmx1cnJpbmc7IH0pOwogICAgfQogIH0pOwoKICAvKgogICAqIG9wZW5Ob3RpZmljYXRpb24KICAgKiBPcGVucyBhIG5vdGlmaWNhdGlvbiwgdGhhdCBjYW4gYmUgY2xvc2VkIHdpdGggYW4gb3B0aW9uYWwgdGltZXIKICAgKiAoZGVmYXVsdCA1MDAwbXMgdGltZXIpIGFuZCBhbHdheXMgY2xvc2VzIG9uIGNsaWNrLgogICAqCiAgICogSWYgYSBub3RpZmljYXRpb24gaXMgb3BlbmVkIHdoaWxlIGFub3RoZXIgaXMgb3BlbmVkLCBpdCB3aWxsIGNsb3NlIHRoZQogICAqIGN1cnJlbnRseSBvcGVuZWQgb25lIGFuZCBvcGVuIHRoZSBuZXcgb25lIGltbWVkaWF0ZWx5LgogICAqLwogIENvZGVNaXJyb3IuZGVmaW5lRXh0ZW5zaW9uKCJvcGVuTm90aWZpY2F0aW9uIiwgZnVuY3Rpb24odGVtcGxhdGUsIG9wdGlvbnMpIHsKICAgIGNsb3NlTm90aWZpY2F0aW9uKHRoaXMsIGNsb3NlKTsKICAgIHZhciBkaWFsb2cgPSBkaWFsb2dEaXYodGhpcywgdGVtcGxhdGUsIG9wdGlvbnMgJiYgb3B0aW9ucy5ib3R0b20pOwogICAgdmFyIGR1cmF0aW9uID0gb3B0aW9ucyAmJiAob3B0aW9ucy5kdXJhdGlvbiA9PT0gdW5kZWZpbmVkID8gNTAwMCA6IG9wdGlvbnMuZHVyYXRpb24pOwogICAgdmFyIGNsb3NlZCA9IGZhbHNlLCBkb25lVGltZXI7CgogICAgZnVuY3Rpb24gY2xvc2UoKSB7CiAgICAgIGlmIChjbG9zZWQpIHJldHVybjsKICAgICAgY2xvc2VkID0gdHJ1ZTsKICAgICAgY2xlYXJUaW1lb3V0KGRvbmVUaW1lcik7CiAgICAgIGRpYWxvZy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGRpYWxvZyk7CiAgICB9CgogICAgQ29kZU1pcnJvci5vbihkaWFsb2csICdjbGljaycsIGZ1bmN0aW9uKGUpIHsKICAgICAgQ29kZU1pcnJvci5lX3ByZXZlbnREZWZhdWx0KGUpOwogICAgICBjbG9zZSgpOwogICAgfSk7CiAgICBpZiAoZHVyYXRpb24pCiAgICAgIGRvbmVUaW1lciA9IHNldFRpbWVvdXQoY2xvc2UsIG9wdGlvbnMuZHVyYXRpb24pOwogIH0pOwp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/dialog/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCEtLSBEVU1NWSBIVE1MIEZJTEUgLS0+]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/display/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/display/fullscreen.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LkNvZGVNaXJyb3ItZnVsbHNjcmVlbiB7CiAgcG9zaXRpb246IGZpeGVkOwogIHRvcDogMDsgbGVmdDogMDsgcmlnaHQ6IDA7IGJvdHRvbTogMDsKICBoZWlnaHQ6IGF1dG87CiAgei1pbmRleDogOTsKfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/display/fullscreen.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CgogIENvZGVNaXJyb3IuZGVmaW5lT3B0aW9uKCJmdWxsU2NyZWVuIiwgZmFsc2UsIGZ1bmN0aW9uKGNtLCB2YWwsIG9sZCkgewogICAgaWYgKG9sZCA9PSBDb2RlTWlycm9yLkluaXQpIG9sZCA9IGZhbHNlOwogICAgaWYgKCFvbGQgPT0gIXZhbCkgcmV0dXJuOwogICAgaWYgKHZhbCkgc2V0RnVsbHNjcmVlbihjbSk7CiAgICBlbHNlIHNldE5vcm1hbChjbSk7CiAgfSk7CgogIGZ1bmN0aW9uIHNldEZ1bGxzY3JlZW4oY20pIHsKICAgIHZhciB3cmFwID0gY20uZ2V0V3JhcHBlckVsZW1lbnQoKTsKICAgIGNtLnN0YXRlLmZ1bGxTY3JlZW5SZXN0b3JlID0ge3Njcm9sbFRvcDogd2luZG93LnBhZ2VZT2Zmc2V0LCBzY3JvbGxMZWZ0OiB3aW5kb3cucGFnZVhPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogd3JhcC5zdHlsZS53aWR0aCwgaGVpZ2h0OiB3cmFwLnN0eWxlLmhlaWdodH07CiAgICB3cmFwLnN0eWxlLndpZHRoID0gIiI7CiAgICB3cmFwLnN0eWxlLmhlaWdodCA9ICJhdXRvIjsKICAgIHdyYXAuY2xhc3NOYW1lICs9ICIgQ29kZU1pcnJvci1mdWxsc2NyZWVuIjsKICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5vdmVyZmxvdyA9ICJoaWRkZW4iOwogICAgY20ucmVmcmVzaCgpOwogIH0KCiAgZnVuY3Rpb24gc2V0Tm9ybWFsKGNtKSB7CiAgICB2YXIgd3JhcCA9IGNtLmdldFdyYXBwZXJFbGVtZW50KCk7CiAgICB3cmFwLmNsYXNzTmFtZSA9IHdyYXAuY2xhc3NOYW1lLnJlcGxhY2UoL1xzKkNvZGVNaXJyb3ItZnVsbHNjcmVlblxiLywgIiIpOwogICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLm92ZXJmbG93ID0gIiI7CiAgICB2YXIgaW5mbyA9IGNtLnN0YXRlLmZ1bGxTY3JlZW5SZXN0b3JlOwogICAgd3JhcC5zdHlsZS53aWR0aCA9IGluZm8ud2lkdGg7IHdyYXAuc3R5bGUuaGVpZ2h0ID0gaW5mby5oZWlnaHQ7CiAgICB3aW5kb3cuc2Nyb2xsVG8oaW5mby5zY3JvbGxMZWZ0LCBpbmZvLnNjcm9sbFRvcCk7CiAgICBjbS5yZWZyZXNoKCk7CiAgfQp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/display/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCEtLSBEVU1NWSBIVE1MIEZJTEUgLS0+]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/display/placeholder.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICBDb2RlTWlycm9yLmRlZmluZU9wdGlvbigicGxhY2Vob2xkZXIiLCAiIiwgZnVuY3Rpb24oY20sIHZhbCwgb2xkKSB7CiAgICB2YXIgcHJldiA9IG9sZCAmJiBvbGQgIT0gQ29kZU1pcnJvci5Jbml0OwogICAgaWYgKHZhbCAmJiAhcHJldikgewogICAgICBjbS5vbigiYmx1ciIsIG9uQmx1cik7CiAgICAgIGNtLm9uKCJjaGFuZ2UiLCBvbkNoYW5nZSk7CiAgICAgIG9uQ2hhbmdlKGNtKTsKICAgIH0gZWxzZSBpZiAoIXZhbCAmJiBwcmV2KSB7CiAgICAgIGNtLm9mZigiYmx1ciIsIG9uQmx1cik7CiAgICAgIGNtLm9mZigiY2hhbmdlIiwgb25DaGFuZ2UpOwogICAgICBjbGVhclBsYWNlaG9sZGVyKGNtKTsKICAgICAgdmFyIHdyYXBwZXIgPSBjbS5nZXRXcmFwcGVyRWxlbWVudCgpOwogICAgICB3cmFwcGVyLmNsYXNzTmFtZSA9IHdyYXBwZXIuY2xhc3NOYW1lLnJlcGxhY2UoIiBDb2RlTWlycm9yLWVtcHR5IiwgIiIpOwogICAgfQoKICAgIGlmICh2YWwgJiYgIWNtLmhhc0ZvY3VzKCkpIG9uQmx1cihjbSk7CiAgfSk7CgogIGZ1bmN0aW9uIGNsZWFyUGxhY2Vob2xkZXIoY20pIHsKICAgIGlmIChjbS5zdGF0ZS5wbGFjZWhvbGRlcikgewogICAgICBjbS5zdGF0ZS5wbGFjZWhvbGRlci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGNtLnN0YXRlLnBsYWNlaG9sZGVyKTsKICAgICAgY20uc3RhdGUucGxhY2Vob2xkZXIgPSBudWxsOwogICAgfQogIH0KICBmdW5jdGlvbiBzZXRQbGFjZWhvbGRlcihjbSkgewogICAgY2xlYXJQbGFjZWhvbGRlcihjbSk7CiAgICB2YXIgZWx0ID0gY20uc3RhdGUucGxhY2Vob2xkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJwcmUiKTsKICAgIGVsdC5zdHlsZS5jc3NUZXh0ID0gImhlaWdodDogMDsgb3ZlcmZsb3c6IHZpc2libGUiOwogICAgZWx0LmNsYXNzTmFtZSA9ICJDb2RlTWlycm9yLXBsYWNlaG9sZGVyIjsKICAgIGVsdC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjbS5nZXRPcHRpb24oInBsYWNlaG9sZGVyIikpKTsKICAgIGNtLmRpc3BsYXkubGluZVNwYWNlLmluc2VydEJlZm9yZShlbHQsIGNtLmRpc3BsYXkubGluZVNwYWNlLmZpcnN0Q2hpbGQpOwogIH0KCiAgZnVuY3Rpb24gb25CbHVyKGNtKSB7CiAgICBpZiAoaXNFbXB0eShjbSkpIHNldFBsYWNlaG9sZGVyKGNtKTsKICB9CiAgZnVuY3Rpb24gb25DaGFuZ2UoY20pIHsKICAgIHZhciB3cmFwcGVyID0gY20uZ2V0V3JhcHBlckVsZW1lbnQoKSwgZW1wdHkgPSBpc0VtcHR5KGNtKTsKICAgIHdyYXBwZXIuY2xhc3NOYW1lID0gd3JhcHBlci5jbGFzc05hbWUucmVwbGFjZSgiIENvZGVNaXJyb3ItZW1wdHkiLCAiIikgKyAoZW1wdHkgPyAiIENvZGVNaXJyb3ItZW1wdHkiIDogIiIpOwoKICAgIGlmIChlbXB0eSkgc2V0UGxhY2Vob2xkZXIoY20pOwogICAgZWxzZSBjbGVhclBsYWNlaG9sZGVyKGNtKTsKICB9CgogIGZ1bmN0aW9uIGlzRW1wdHkoY20pIHsKICAgIHJldHVybiAoY20ubGluZUNvdW50KCkgPT09IDEpICYmIChjbS5nZXRMaW5lKDApID09PSAiIik7CiAgfQp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/display/rulers.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CgogIENvZGVNaXJyb3IuZGVmaW5lT3B0aW9uKCJydWxlcnMiLCBmYWxzZSwgZnVuY3Rpb24oY20sIHZhbCwgb2xkKSB7CiAgICBpZiAob2xkICYmIG9sZCAhPSBDb2RlTWlycm9yLkluaXQpIHsKICAgICAgY2xlYXJSdWxlcnMoY20pOwogICAgICBjbS5vZmYoInJlZnJlc2giLCByZWZyZXNoUnVsZXJzKTsKICAgIH0KICAgIGlmICh2YWwgJiYgdmFsLmxlbmd0aCkgewogICAgICBzZXRSdWxlcnMoY20pOwogICAgICBjbS5vbigicmVmcmVzaCIsIHJlZnJlc2hSdWxlcnMpOwogICAgfQogIH0pOwoKICBmdW5jdGlvbiBjbGVhclJ1bGVycyhjbSkgewogICAgZm9yICh2YXIgaSA9IGNtLmRpc3BsYXkubGluZVNwYWNlLmNoaWxkTm9kZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgdmFyIG5vZGUgPSBjbS5kaXNwbGF5LmxpbmVTcGFjZS5jaGlsZE5vZGVzW2ldOwogICAgICBpZiAoLyhefFxzKUNvZGVNaXJyb3ItcnVsZXIoJHxccykvLnRlc3Qobm9kZS5jbGFzc05hbWUpKQogICAgICAgIG5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChub2RlKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHNldFJ1bGVycyhjbSkgewogICAgdmFyIHZhbCA9IGNtLmdldE9wdGlvbigicnVsZXJzIik7CiAgICB2YXIgY3cgPSBjbS5kZWZhdWx0Q2hhcldpZHRoKCk7CiAgICB2YXIgbGVmdCA9IGNtLmNoYXJDb29yZHMoQ29kZU1pcnJvci5Qb3MoY20uZmlyc3RMaW5lKCksIDApLCAiZGl2IikubGVmdDsKICAgIHZhciBtaW5IID0gY20uZGlzcGxheS5zY3JvbGxlci5vZmZzZXRIZWlnaHQgKyAzMDsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBlbHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgICAgZWx0LmNsYXNzTmFtZSA9ICJDb2RlTWlycm9yLXJ1bGVyIjsKICAgICAgdmFyIGNvbCwgY2xzID0gbnVsbCwgY29uZiA9IHZhbFtpXTsKICAgICAgaWYgKHR5cGVvZiBjb25mID09ICJudW1iZXIiKSB7CiAgICAgICAgY29sID0gY29uZjsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb2wgPSBjb25mLmNvbHVtbjsKICAgICAgICBpZiAoY29uZi5jbGFzc05hbWUpIGVsdC5jbGFzc05hbWUgKz0gIiAiICsgY29uZi5jbGFzc05hbWU7CiAgICAgICAgaWYgKGNvbmYuY29sb3IpIGVsdC5zdHlsZS5ib3JkZXJDb2xvciA9IGNvbmYuY29sb3I7CiAgICAgICAgaWYgKGNvbmYubGluZVN0eWxlKSBlbHQuc3R5bGUuYm9yZGVyTGVmdFN0eWxlID0gY29uZi5saW5lU3R5bGU7CiAgICAgICAgaWYgKGNvbmYud2lkdGgpIGVsdC5zdHlsZS5ib3JkZXJMZWZ0V2lkdGggPSBjb25mLndpZHRoOwogICAgICAgIGNscyA9IHZhbFtpXS5jbGFzc05hbWU7CiAgICAgIH0KICAgICAgZWx0LnN0eWxlLmxlZnQgPSAobGVmdCArIGNvbCAqIGN3KSArICJweCI7CiAgICAgIGVsdC5zdHlsZS50b3AgPSAiLTUwcHgiOwogICAgICBlbHQuc3R5bGUuYm90dG9tID0gIi0yMHB4IjsKICAgICAgZWx0LnN0eWxlLm1pbkhlaWdodCA9IG1pbkggKyAicHgiOwogICAgICBjbS5kaXNwbGF5LmxpbmVTcGFjZS5pbnNlcnRCZWZvcmUoZWx0LCBjbS5kaXNwbGF5LmN1cnNvckRpdik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiByZWZyZXNoUnVsZXJzKGNtKSB7CiAgICBjbGVhclJ1bGVycyhjbSk7CiAgICBzZXRSdWxlcnMoY20pOwogIH0KfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/edit/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/edit/closebrackets.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICB2YXIgREVGQVVMVF9CUkFDS0VUUyA9ICIoKVtde30nJ1wiXCIiOwogIHZhciBERUZBVUxUX0VYUExPREVfT05fRU5URVIgPSAiW117fSI7CiAgdmFyIFNQQUNFX0NIQVJfUkVHRVggPSAvXHMvOwoKICB2YXIgUG9zID0gQ29kZU1pcnJvci5Qb3M7CgogIENvZGVNaXJyb3IuZGVmaW5lT3B0aW9uKCJhdXRvQ2xvc2VCcmFja2V0cyIsIGZhbHNlLCBmdW5jdGlvbihjbSwgdmFsLCBvbGQpIHsKICAgIGlmIChvbGQgIT0gQ29kZU1pcnJvci5Jbml0ICYmIG9sZCkKICAgICAgY20ucmVtb3ZlS2V5TWFwKCJhdXRvQ2xvc2VCcmFja2V0cyIpOwogICAgaWYgKCF2YWwpIHJldHVybjsKICAgIHZhciBwYWlycyA9IERFRkFVTFRfQlJBQ0tFVFMsIGV4cGxvZGUgPSBERUZBVUxUX0VYUExPREVfT05fRU5URVI7CiAgICBpZiAodHlwZW9mIHZhbCA9PSAic3RyaW5nIikgcGFpcnMgPSB2YWw7CiAgICBlbHNlIGlmICh0eXBlb2YgdmFsID09ICJvYmplY3QiKSB7CiAgICAgIGlmICh2YWwucGFpcnMgIT0gbnVsbCkgcGFpcnMgPSB2YWwucGFpcnM7CiAgICAgIGlmICh2YWwuZXhwbG9kZSAhPSBudWxsKSBleHBsb2RlID0gdmFsLmV4cGxvZGU7CiAgICB9CiAgICB2YXIgbWFwID0gYnVpbGRLZXltYXAocGFpcnMpOwogICAgaWYgKGV4cGxvZGUpIG1hcC5FbnRlciA9IGJ1aWxkRXhwbG9kZUhhbmRsZXIoZXhwbG9kZSk7CiAgICBjbS5hZGRLZXlNYXAobWFwKTsKICB9KTsKCiAgZnVuY3Rpb24gY2hhcnNBcm91bmQoY20sIHBvcykgewogICAgdmFyIHN0ciA9IGNtLmdldFJhbmdlKFBvcyhwb3MubGluZSwgcG9zLmNoIC0gMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zKHBvcy5saW5lLCBwb3MuY2ggKyAxKSk7CiAgICByZXR1cm4gc3RyLmxlbmd0aCA9PSAyID8gc3RyIDogbnVsbDsKICB9CgogIC8vIFByb2plY3QgdGhlIHRva2VuIHR5cGUgdGhhdCB3aWxsIGV4aXN0cyBhZnRlciB0aGUgZ2l2ZW4gY2hhciBpcwogIC8vIHR5cGVkLCBhbmQgdXNlIGl0IHRvIGRldGVybWluZSB3aGV0aGVyIGl0IHdvdWxkIGNhdXNlIHRoZSBzdGFydAogIC8vIG9mIGEgc3RyaW5nIHRva2VuLgogIGZ1bmN0aW9uIGVudGVyaW5nU3RyaW5nKGNtLCBwb3MsIGNoKSB7CiAgICB2YXIgbGluZSA9IGNtLmdldExpbmUocG9zLmxpbmUpOwogICAgdmFyIHRva2VuID0gY20uZ2V0VG9rZW5BdChwb3MpOwogICAgaWYgKC9cYnN0cmluZzI/XGIvLnRlc3QodG9rZW4udHlwZSkpIHJldHVybiBmYWxzZTsKICAgIHZhciBzdHJlYW0gPSBuZXcgQ29kZU1pcnJvci5TdHJpbmdTdHJlYW0obGluZS5zbGljZSgwLCBwb3MuY2gpICsgY2ggKyBsaW5lLnNsaWNlKHBvcy5jaCksIDQpOwogICAgc3RyZWFtLnBvcyA9IHN0cmVhbS5zdGFydCA9IHRva2VuLnN0YXJ0OwogICAgZm9yICg7OykgewogICAgICB2YXIgdHlwZTEgPSBjbS5nZXRNb2RlKCkudG9rZW4oc3RyZWFtLCB0b2tlbi5zdGF0ZSk7CiAgICAgIGlmIChzdHJlYW0ucG9zID49IHBvcy5jaCArIDEpIHJldHVybiAvXGJzdHJpbmcyP1xiLy50ZXN0KHR5cGUxKTsKICAgICAgc3RyZWFtLnN0YXJ0ID0gc3RyZWFtLnBvczsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGJ1aWxkS2V5bWFwKHBhaXJzKSB7CiAgICB2YXIgbWFwID0gewogICAgICBuYW1lIDogImF1dG9DbG9zZUJyYWNrZXRzIiwKICAgICAgQmFja3NwYWNlOiBmdW5jdGlvbihjbSkgewogICAgICAgIGlmIChjbS5nZXRPcHRpb24oImRpc2FibGVJbnB1dCIpKSByZXR1cm4gQ29kZU1pcnJvci5QYXNzOwogICAgICAgIHZhciByYW5nZXMgPSBjbS5saXN0U2VsZWN0aW9ucygpOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBpZiAoIXJhbmdlc1tpXS5lbXB0eSgpKSByZXR1cm4gQ29kZU1pcnJvci5QYXNzOwogICAgICAgICAgdmFyIGFyb3VuZCA9IGNoYXJzQXJvdW5kKGNtLCByYW5nZXNbaV0uaGVhZCk7CiAgICAgICAgICBpZiAoIWFyb3VuZCB8fCBwYWlycy5pbmRleE9mKGFyb3VuZCkgJSAyICE9IDApIHJldHVybiBDb2RlTWlycm9yLlBhc3M7CiAgICAgICAgfQogICAgICAgIGZvciAodmFyIGkgPSByYW5nZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgIHZhciBjdXIgPSByYW5nZXNbaV0uaGVhZDsKICAgICAgICAgIGNtLnJlcGxhY2VSYW5nZSgiIiwgUG9zKGN1ci5saW5lLCBjdXIuY2ggLSAxKSwgUG9zKGN1ci5saW5lLCBjdXIuY2ggKyAxKSk7CiAgICAgICAgfQogICAgICB9CiAgICB9OwogICAgdmFyIGNsb3NpbmdCcmFja2V0cyA9ICIiOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYWlycy5sZW5ndGg7IGkgKz0gMikgKGZ1bmN0aW9uKGxlZnQsIHJpZ2h0KSB7CiAgICAgIGlmIChsZWZ0ICE9IHJpZ2h0KSBjbG9zaW5nQnJhY2tldHMgKz0gcmlnaHQ7CiAgICAgIG1hcFsiJyIgKyBsZWZ0ICsgIiciXSA9IGZ1bmN0aW9uKGNtKSB7CiAgICAgICAgaWYgKGNtLmdldE9wdGlvbigiZGlzYWJsZUlucHV0IikpIHJldHVybiBDb2RlTWlycm9yLlBhc3M7CiAgICAgICAgdmFyIHJhbmdlcyA9IGNtLmxpc3RTZWxlY3Rpb25zKCksIHR5cGUsIG5leHQ7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHZhciByYW5nZSA9IHJhbmdlc1tpXSwgY3VyID0gcmFuZ2UuaGVhZCwgY3VyVHlwZTsKICAgICAgICAgIHZhciBuZXh0ID0gY20uZ2V0UmFuZ2UoY3VyLCBQb3MoY3VyLmxpbmUsIGN1ci5jaCArIDEpKTsKICAgICAgICAgIGlmICghcmFuZ2UuZW1wdHkoKSkKICAgICAgICAgICAgY3VyVHlwZSA9ICJzdXJyb3VuZCI7CiAgICAgICAgICBlbHNlIGlmIChsZWZ0ID09IHJpZ2h0ICYmIG5leHQgPT0gcmlnaHQpIHsKICAgICAgICAgICAgaWYgKGNtLmdldFJhbmdlKGN1ciwgUG9zKGN1ci5saW5lLCBjdXIuY2ggKyAzKSkgPT0gbGVmdCArIGxlZnQgKyBsZWZ0KQogICAgICAgICAgICAgIGN1clR5cGUgPSAic2tpcFRocmVlIjsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgIGN1clR5cGUgPSAic2tpcCI7CiAgICAgICAgICB9IGVsc2UgaWYgKGxlZnQgPT0gcmlnaHQgJiYgY3VyLmNoID4gMSAmJgogICAgICAgICAgICAgICAgICAgICBjbS5nZXRSYW5nZShQb3MoY3VyLmxpbmUsIGN1ci5jaCAtIDIpLCBjdXIpID09IGxlZnQgKyBsZWZ0ICYmCiAgICAgICAgICAgICAgICAgICAgIChjdXIuY2ggPD0gMiB8fCBjbS5nZXRSYW5nZShQb3MoY3VyLmxpbmUsIGN1ci5jaCAtIDMpLCBQb3MoY3VyLmxpbmUsIGN1ci5jaCAtIDIpKSAhPSBsZWZ0KSkKICAgICAgICAgICAgY3VyVHlwZSA9ICJhZGRGb3VyIjsKICAgICAgICAgIGVsc2UgaWYgKGxlZnQgPT0gJyInIHx8IGxlZnQgPT0gIiciKSB7CiAgICAgICAgICAgIGlmICghQ29kZU1pcnJvci5pc1dvcmRDaGFyKG5leHQpICYmIGVudGVyaW5nU3RyaW5nKGNtLCBjdXIsIGxlZnQpKSBjdXJUeXBlID0gImJvdGgiOwogICAgICAgICAgICBlbHNlIHJldHVybiBDb2RlTWlycm9yLlBhc3M7CiAgICAgICAgICB9IGVsc2UgaWYgKGNtLmdldExpbmUoY3VyLmxpbmUpLmxlbmd0aCA9PSBjdXIuY2ggfHwgY2xvc2luZ0JyYWNrZXRzLmluZGV4T2YobmV4dCkgPj0gMCB8fCBTUEFDRV9DSEFSX1JFR0VYLnRlc3QobmV4dCkpCiAgICAgICAgICAgIGN1clR5cGUgPSAiYm90aCI7CiAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHJldHVybiBDb2RlTWlycm9yLlBhc3M7CiAgICAgICAgICBpZiAoIXR5cGUpIHR5cGUgPSBjdXJUeXBlOwogICAgICAgICAgZWxzZSBpZiAodHlwZSAhPSBjdXJUeXBlKSByZXR1cm4gQ29kZU1pcnJvci5QYXNzOwogICAgICAgIH0KCiAgICAgICAgY20ub3BlcmF0aW9uKGZ1bmN0aW9uKCkgewogICAgICAgICAgaWYgKHR5cGUgPT0gInNraXAiKSB7CiAgICAgICAgICAgIGNtLmV4ZWNDb21tYW5kKCJnb0NoYXJSaWdodCIpOwogICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09ICJza2lwVGhyZWUiKSB7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMzsgaSsrKQogICAgICAgICAgICAgIGNtLmV4ZWNDb21tYW5kKCJnb0NoYXJSaWdodCIpOwogICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09ICJzdXJyb3VuZCIpIHsKICAgICAgICAgICAgdmFyIHNlbHMgPSBjbS5nZXRTZWxlY3Rpb25zKCk7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2Vscy5sZW5ndGg7IGkrKykKICAgICAgICAgICAgICBzZWxzW2ldID0gbGVmdCArIHNlbHNbaV0gKyByaWdodDsKICAgICAgICAgICAgY20ucmVwbGFjZVNlbGVjdGlvbnMoc2VscywgImFyb3VuZCIpOwogICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09ICJib3RoIikgewogICAgICAgICAgICBjbS5yZXBsYWNlU2VsZWN0aW9uKGxlZnQgKyByaWdodCwgbnVsbCk7CiAgICAgICAgICAgIGNtLmV4ZWNDb21tYW5kKCJnb0NoYXJMZWZ0Iik7CiAgICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gImFkZEZvdXIiKSB7CiAgICAgICAgICAgIGNtLnJlcGxhY2VTZWxlY3Rpb24obGVmdCArIGxlZnQgKyBsZWZ0ICsgbGVmdCwgImJlZm9yZSIpOwogICAgICAgICAgICBjbS5leGVjQ29tbWFuZCgiZ29DaGFyUmlnaHQiKTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfTsKICAgICAgaWYgKGxlZnQgIT0gcmlnaHQpIG1hcFsiJyIgKyByaWdodCArICInIl0gPSBmdW5jdGlvbihjbSkgewogICAgICAgIHZhciByYW5nZXMgPSBjbS5saXN0U2VsZWN0aW9ucygpOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB2YXIgcmFuZ2UgPSByYW5nZXNbaV07CiAgICAgICAgICBpZiAoIXJhbmdlLmVtcHR5KCkgfHwKICAgICAgICAgICAgICBjbS5nZXRSYW5nZShyYW5nZS5oZWFkLCBQb3MocmFuZ2UuaGVhZC5saW5lLCByYW5nZS5oZWFkLmNoICsgMSkpICE9IHJpZ2h0KQogICAgICAgICAgICByZXR1cm4gQ29kZU1pcnJvci5QYXNzOwogICAgICAgIH0KICAgICAgICBjbS5leGVjQ29tbWFuZCgiZ29DaGFyUmlnaHQiKTsKICAgICAgfTsKICAgIH0pKHBhaXJzLmNoYXJBdChpKSwgcGFpcnMuY2hhckF0KGkgKyAxKSk7CiAgICByZXR1cm4gbWFwOwogIH0KCiAgZnVuY3Rpb24gYnVpbGRFeHBsb2RlSGFuZGxlcihwYWlycykgewogICAgcmV0dXJuIGZ1bmN0aW9uKGNtKSB7CiAgICAgIGlmIChjbS5nZXRPcHRpb24oImRpc2FibGVJbnB1dCIpKSByZXR1cm4gQ29kZU1pcnJvci5QYXNzOwogICAgICB2YXIgcmFuZ2VzID0gY20ubGlzdFNlbGVjdGlvbnMoKTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICBpZiAoIXJhbmdlc1tpXS5lbXB0eSgpKSByZXR1cm4gQ29kZU1pcnJvci5QYXNzOwogICAgICAgIHZhciBhcm91bmQgPSBjaGFyc0Fyb3VuZChjbSwgcmFuZ2VzW2ldLmhlYWQpOwogICAgICAgIGlmICghYXJvdW5kIHx8IHBhaXJzLmluZGV4T2YoYXJvdW5kKSAlIDIgIT0gMCkgcmV0dXJuIENvZGVNaXJyb3IuUGFzczsKICAgICAgfQogICAgICBjbS5vcGVyYXRpb24oZnVuY3Rpb24oKSB7CiAgICAgICAgY20ucmVwbGFjZVNlbGVjdGlvbigiXG5cbiIsIG51bGwpOwogICAgICAgIGNtLmV4ZWNDb21tYW5kKCJnb0NoYXJMZWZ0Iik7CiAgICAgICAgcmFuZ2VzID0gY20ubGlzdFNlbGVjdGlvbnMoKTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJhbmdlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgdmFyIGxpbmUgPSByYW5nZXNbaV0uaGVhZC5saW5lOwogICAgICAgICAgY20uaW5kZW50TGluZShsaW5lLCBudWxsLCB0cnVlKTsKICAgICAgICAgIGNtLmluZGVudExpbmUobGluZSArIDEsIG51bGwsIHRydWUpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9OwogIH0KfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/edit/closetag.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovKioKICogVGFnLWNsb3NlciBleHRlbnNpb24gZm9yIENvZGVNaXJyb3IuCiAqCiAqIFRoaXMgZXh0ZW5zaW9uIGFkZHMgYW4gImF1dG9DbG9zZVRhZ3MiIG9wdGlvbiB0aGF0IGNhbiBiZSBzZXQgdG8KICogZWl0aGVyIHRydWUgdG8gZ2V0IHRoZSBkZWZhdWx0IGJlaGF2aW9yLCBvciBhbiBvYmplY3QgdG8gZnVydGhlcgogKiBjb25maWd1cmUgaXRzIGJlaGF2aW9yLgogKgogKiBUaGVzZSBhcmUgc3VwcG9ydGVkIG9wdGlvbnM6CiAqCiAqIGB3aGVuQ2xvc2luZ2AgKGRlZmF1bHQgdHJ1ZSkKICogICBXaGV0aGVyIHRvIGF1dG9jbG9zZSB3aGVuIHRoZSAnLycgb2YgYSBjbG9zaW5nIHRhZyBpcyB0eXBlZC4KICogYHdoZW5PcGVuaW5nYCAoZGVmYXVsdCB0cnVlKQogKiAgIFdoZXRoZXIgdG8gYXV0b2Nsb3NlIHRoZSB0YWcgd2hlbiB0aGUgZmluYWwgJz4nIG9mIGFuIG9wZW5pbmcKICogICB0YWcgaXMgdHlwZWQuCiAqIGBkb250Q2xvc2VUYWdzYCAoZGVmYXVsdCBpcyBlbXB0eSB0YWdzIGZvciBIVE1MLCBub25lIGZvciBYTUwpCiAqICAgQW4gYXJyYXkgb2YgdGFnIG5hbWVzIHRoYXQgc2hvdWxkIG5vdCBiZSBhdXRvY2xvc2VkLgogKiBgaW5kZW50VGFnc2AgKGRlZmF1bHQgaXMgYmxvY2sgdGFncyBmb3IgSFRNTCwgbm9uZSBmb3IgWE1MKQogKiAgIEFuIGFycmF5IG9mIHRhZyBuYW1lcyB0aGF0IHNob3VsZCwgd2hlbiBvcGVuZWQsIGNhdXNlIGEKICogICBibGFuayBsaW5lIHRvIGJlIGFkZGVkIGluc2lkZSB0aGUgdGFnLCBhbmQgdGhlIGJsYW5rIGxpbmUgYW5kCiAqICAgY2xvc2luZyBsaW5lIHRvIGJlIGluZGVudGVkLgogKgogKiBTZWUgZGVtb3MvY2xvc2V0YWcuaHRtbCBmb3IgYSB1c2FnZSBleGFtcGxlLgogKi8KCihmdW5jdGlvbihtb2QpIHsKICBpZiAodHlwZW9mIGV4cG9ydHMgPT0gIm9iamVjdCIgJiYgdHlwZW9mIG1vZHVsZSA9PSAib2JqZWN0IikgLy8gQ29tbW9uSlMKICAgIG1vZChyZXF1aXJlKCIuLi8uLi9saWIvY29kZW1pcnJvciIpLCByZXF1aXJlKCIuLi9mb2xkL3htbC1mb2xkIikpOwogIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kKSAvLyBBTUQKICAgIGRlZmluZShbIi4uLy4uL2xpYi9jb2RlbWlycm9yIiwgIi4uL2ZvbGQveG1sLWZvbGQiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICBDb2RlTWlycm9yLmRlZmluZU9wdGlvbigiYXV0b0Nsb3NlVGFncyIsIGZhbHNlLCBmdW5jdGlvbihjbSwgdmFsLCBvbGQpIHsKICAgIGlmIChvbGQgIT0gQ29kZU1pcnJvci5Jbml0ICYmIG9sZCkKICAgICAgY20ucmVtb3ZlS2V5TWFwKCJhdXRvQ2xvc2VUYWdzIik7CiAgICBpZiAoIXZhbCkgcmV0dXJuOwogICAgdmFyIG1hcCA9IHtuYW1lOiAiYXV0b0Nsb3NlVGFncyJ9OwogICAgaWYgKHR5cGVvZiB2YWwgIT0gIm9iamVjdCIgfHwgdmFsLndoZW5DbG9zaW5nKQogICAgICBtYXBbIicvJyJdID0gZnVuY3Rpb24oY20pIHsgcmV0dXJuIGF1dG9DbG9zZVNsYXNoKGNtKTsgfTsKICAgIGlmICh0eXBlb2YgdmFsICE9ICJvYmplY3QiIHx8IHZhbC53aGVuT3BlbmluZykKICAgICAgbWFwWyInPiciXSA9IGZ1bmN0aW9uKGNtKSB7IHJldHVybiBhdXRvQ2xvc2VHVChjbSk7IH07CiAgICBjbS5hZGRLZXlNYXAobWFwKTsKICB9KTsKCiAgdmFyIGh0bWxEb250Q2xvc2UgPSBbImFyZWEiLCAiYmFzZSIsICJiciIsICJjb2wiLCAiY29tbWFuZCIsICJlbWJlZCIsICJociIsICJpbWciLCAiaW5wdXQiLCAia2V5Z2VuIiwgImxpbmsiLCAibWV0YSIsICJwYXJhbSIsCiAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZSIsICJ0cmFjayIsICJ3YnIiXTsKICB2YXIgaHRtbEluZGVudCA9IFsiYXBwbGV0IiwgImJsb2NrcXVvdGUiLCAiYm9keSIsICJidXR0b24iLCAiZGl2IiwgImRsIiwgImZpZWxkc2V0IiwgImZvcm0iLCAiZnJhbWVzZXQiLCAiaDEiLCAiaDIiLCAiaDMiLCAiaDQiLAogICAgICAgICAgICAgICAgICAgICJoNSIsICJoNiIsICJoZWFkIiwgImh0bWwiLCAiaWZyYW1lIiwgImxheWVyIiwgImxlZ2VuZCIsICJvYmplY3QiLCAib2wiLCAicCIsICJzZWxlY3QiLCAidGFibGUiLCAidWwiXTsKCiAgZnVuY3Rpb24gYXV0b0Nsb3NlR1QoY20pIHsKICAgIGlmIChjbS5nZXRPcHRpb24oImRpc2FibGVJbnB1dCIpKSByZXR1cm4gQ29kZU1pcnJvci5QYXNzOwogICAgdmFyIHJhbmdlcyA9IGNtLmxpc3RTZWxlY3Rpb25zKCksIHJlcGxhY2VtZW50cyA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKCFyYW5nZXNbaV0uZW1wdHkoKSkgcmV0dXJuIENvZGVNaXJyb3IuUGFzczsKICAgICAgdmFyIHBvcyA9IHJhbmdlc1tpXS5oZWFkLCB0b2sgPSBjbS5nZXRUb2tlbkF0KHBvcyk7CiAgICAgIHZhciBpbm5lciA9IENvZGVNaXJyb3IuaW5uZXJNb2RlKGNtLmdldE1vZGUoKSwgdG9rLnN0YXRlKSwgc3RhdGUgPSBpbm5lci5zdGF0ZTsKICAgICAgaWYgKGlubmVyLm1vZGUubmFtZSAhPSAieG1sIiB8fCAhc3RhdGUudGFnTmFtZSkgcmV0dXJuIENvZGVNaXJyb3IuUGFzczsKCiAgICAgIHZhciBvcHQgPSBjbS5nZXRPcHRpb24oImF1dG9DbG9zZVRhZ3MiKSwgaHRtbCA9IGlubmVyLm1vZGUuY29uZmlndXJhdGlvbiA9PSAiaHRtbCI7CiAgICAgIHZhciBkb250Q2xvc2VUYWdzID0gKHR5cGVvZiBvcHQgPT0gIm9iamVjdCIgJiYgb3B0LmRvbnRDbG9zZVRhZ3MpIHx8IChodG1sICYmIGh0bWxEb250Q2xvc2UpOwogICAgICB2YXIgaW5kZW50VGFncyA9ICh0eXBlb2Ygb3B0ID09ICJvYmplY3QiICYmIG9wdC5pbmRlbnRUYWdzKSB8fCAoaHRtbCAmJiBodG1sSW5kZW50KTsKCiAgICAgIHZhciB0YWdOYW1lID0gc3RhdGUudGFnTmFtZTsKICAgICAgaWYgKHRvay5lbmQgPiBwb3MuY2gpIHRhZ05hbWUgPSB0YWdOYW1lLnNsaWNlKDAsIHRhZ05hbWUubGVuZ3RoIC0gdG9rLmVuZCArIHBvcy5jaCk7CiAgICAgIHZhciBsb3dlclRhZ05hbWUgPSB0YWdOYW1lLnRvTG93ZXJDYXNlKCk7CiAgICAgIC8vIERvbid0IHByb2Nlc3MgdGhlICc+JyBhdCB0aGUgZW5kIG9mIGFuIGVuZC10YWcgb3Igc2VsZi1jbG9zaW5nIHRhZwogICAgICBpZiAoIXRhZ05hbWUgfHwKICAgICAgICAgIHRvay50eXBlID09ICJzdHJpbmciICYmICh0b2suZW5kICE9IHBvcy5jaCB8fCAhL1tcIlwnXS8udGVzdCh0b2suc3RyaW5nLmNoYXJBdCh0b2suc3RyaW5nLmxlbmd0aCAtIDEpKSB8fCB0b2suc3RyaW5nLmxlbmd0aCA9PSAxKSB8fAogICAgICAgICAgdG9rLnR5cGUgPT0gInRhZyIgJiYgc3RhdGUudHlwZSA9PSAiY2xvc2VUYWciIHx8CiAgICAgICAgICB0b2suc3RyaW5nLmluZGV4T2YoIi8iKSA9PSAodG9rLnN0cmluZy5sZW5ndGggLSAxKSB8fCAvLyBtYXRjaCBzb21ldGhpbmcgbGlrZSA8c29tZVRhZ05hbWUgLz4KICAgICAgICAgIGRvbnRDbG9zZVRhZ3MgJiYgaW5kZXhPZihkb250Q2xvc2VUYWdzLCBsb3dlclRhZ05hbWUpID4gLTEgfHwKICAgICAgICAgIGNsb3NpbmdUYWdFeGlzdHMoY20sIHRhZ05hbWUsIHBvcywgc3RhdGUsIHRydWUpKQogICAgICAgIHJldHVybiBDb2RlTWlycm9yLlBhc3M7CgogICAgICB2YXIgaW5kZW50ID0gaW5kZW50VGFncyAmJiBpbmRleE9mKGluZGVudFRhZ3MsIGxvd2VyVGFnTmFtZSkgPiAtMTsKICAgICAgcmVwbGFjZW1lbnRzW2ldID0ge2luZGVudDogaW5kZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogIj4iICsgKGluZGVudCA/ICJcblxuIiA6ICIiKSArICI8LyIgKyB0YWdOYW1lICsgIj4iLAogICAgICAgICAgICAgICAgICAgICAgICAgbmV3UG9zOiBpbmRlbnQgPyBDb2RlTWlycm9yLlBvcyhwb3MubGluZSArIDEsIDApIDogQ29kZU1pcnJvci5Qb3MocG9zLmxpbmUsIHBvcy5jaCArIDEpfTsKICAgIH0KCiAgICBmb3IgKHZhciBpID0gcmFuZ2VzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgIHZhciBpbmZvID0gcmVwbGFjZW1lbnRzW2ldOwogICAgICBjbS5yZXBsYWNlUmFuZ2UoaW5mby50ZXh0LCByYW5nZXNbaV0uaGVhZCwgcmFuZ2VzW2ldLmFuY2hvciwgIitpbnNlcnQiKTsKICAgICAgdmFyIHNlbCA9IGNtLmxpc3RTZWxlY3Rpb25zKCkuc2xpY2UoMCk7CiAgICAgIHNlbFtpXSA9IHtoZWFkOiBpbmZvLm5ld1BvcywgYW5jaG9yOiBpbmZvLm5ld1Bvc307CiAgICAgIGNtLnNldFNlbGVjdGlvbnMoc2VsKTsKICAgICAgaWYgKGluZm8uaW5kZW50KSB7CiAgICAgICAgY20uaW5kZW50TGluZShpbmZvLm5ld1Bvcy5saW5lLCBudWxsLCB0cnVlKTsKICAgICAgICBjbS5pbmRlbnRMaW5lKGluZm8ubmV3UG9zLmxpbmUgKyAxLCBudWxsLCB0cnVlKTsKICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gYXV0b0Nsb3NlU2xhc2goY20pIHsKICAgIGlmIChjbS5nZXRPcHRpb24oImRpc2FibGVJbnB1dCIpKSByZXR1cm4gQ29kZU1pcnJvci5QYXNzOwogICAgdmFyIHJhbmdlcyA9IGNtLmxpc3RTZWxlY3Rpb25zKCksIHJlcGxhY2VtZW50cyA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKCFyYW5nZXNbaV0uZW1wdHkoKSkgcmV0dXJuIENvZGVNaXJyb3IuUGFzczsKICAgICAgdmFyIHBvcyA9IHJhbmdlc1tpXS5oZWFkLCB0b2sgPSBjbS5nZXRUb2tlbkF0KHBvcyk7CiAgICAgIHZhciBpbm5lciA9IENvZGVNaXJyb3IuaW5uZXJNb2RlKGNtLmdldE1vZGUoKSwgdG9rLnN0YXRlKSwgc3RhdGUgPSBpbm5lci5zdGF0ZTsKICAgICAgaWYgKHRvay50eXBlID09ICJzdHJpbmciIHx8IHRvay5zdHJpbmcuY2hhckF0KDApICE9ICI8IiB8fAogICAgICAgICAgdG9rLnN0YXJ0ICE9IHBvcy5jaCAtIDEgfHwgaW5uZXIubW9kZS5uYW1lICE9ICJ4bWwiIHx8CiAgICAgICAgICAhc3RhdGUuY29udGV4dCB8fCAhc3RhdGUuY29udGV4dC50YWdOYW1lIHx8CiAgICAgICAgICBjbG9zaW5nVGFnRXhpc3RzKGNtLCBzdGF0ZS5jb250ZXh0LnRhZ05hbWUsIHBvcywgc3RhdGUpKQogICAgICAgIHJldHVybiBDb2RlTWlycm9yLlBhc3M7CiAgICAgIHJlcGxhY2VtZW50c1tpXSA9ICIvIiArIHN0YXRlLmNvbnRleHQudGFnTmFtZSArICI+IjsKICAgIH0KICAgIGNtLnJlcGxhY2VTZWxlY3Rpb25zKHJlcGxhY2VtZW50cyk7CiAgfQoKICBmdW5jdGlvbiBpbmRleE9mKGNvbGxlY3Rpb24sIGVsdCkgewogICAgaWYgKGNvbGxlY3Rpb24uaW5kZXhPZikgcmV0dXJuIGNvbGxlY3Rpb24uaW5kZXhPZihlbHQpOwogICAgZm9yICh2YXIgaSA9IDAsIGUgPSBjb2xsZWN0aW9uLmxlbmd0aDsgaSA8IGU7ICsraSkKICAgICAgaWYgKGNvbGxlY3Rpb25baV0gPT0gZWx0KSByZXR1cm4gaTsKICAgIHJldHVybiAtMTsKICB9CgogIC8vIElmIHhtbC1mb2xkIGlzIGxvYWRlZCwgd2UgdXNlIGl0cyBmdW5jdGlvbmFsaXR5IHRvIHRyeSBhbmQgdmVyaWZ5CiAgLy8gd2hldGhlciBhIGdpdmVuIHRhZyBpcyBhY3R1YWxseSB1bmNsb3NlZC4KICBmdW5jdGlvbiBjbG9zaW5nVGFnRXhpc3RzKGNtLCB0YWdOYW1lLCBwb3MsIHN0YXRlLCBuZXdUYWcpIHsKICAgIGlmICghQ29kZU1pcnJvci5zY2FuRm9yQ2xvc2luZ1RhZykgcmV0dXJuIGZhbHNlOwogICAgdmFyIGVuZCA9IE1hdGgubWluKGNtLmxhc3RMaW5lKCkgKyAxLCBwb3MubGluZSArIDUwMCk7CiAgICB2YXIgbmV4dENsb3NlID0gQ29kZU1pcnJvci5zY2FuRm9yQ2xvc2luZ1RhZyhjbSwgcG9zLCBudWxsLCBlbmQpOwogICAgaWYgKCFuZXh0Q2xvc2UgfHwgbmV4dENsb3NlLnRhZyAhPSB0YWdOYW1lKSByZXR1cm4gZmFsc2U7CiAgICB2YXIgY3ggPSBzdGF0ZS5jb250ZXh0OwogICAgLy8gSWYgdGhlIGltbWVkaWF0ZSB3cmFwcGluZyBjb250ZXh0IGNvbnRhaW5zIG9uQ3ggaW5zdGFuY2VzIG9mCiAgICAvLyB0aGUgc2FtZSB0YWcsIGEgY2xvc2luZyB0YWcgb25seSBleGlzdHMgaWYgdGhlcmUgYXJlIGF0IGxlYXN0CiAgICAvLyB0aGF0IG1hbnkgY2xvc2luZyB0YWdzIG9mIHRoYXQgdHlwZSBmb2xsb3dpbmcuCiAgICBmb3IgKHZhciBvbkN4ID0gbmV3VGFnID8gMSA6IDA7IGN4ICYmIGN4LnRhZ05hbWUgPT0gdGFnTmFtZTsgY3ggPSBjeC5wcmV2KSArK29uQ3g7CiAgICBwb3MgPSBuZXh0Q2xvc2UudG87CiAgICBmb3IgKHZhciBpID0gMTsgaSA8IG9uQ3g7IGkrKykgewogICAgICB2YXIgbmV4dCA9IENvZGVNaXJyb3Iuc2NhbkZvckNsb3NpbmdUYWcoY20sIHBvcywgbnVsbCwgZW5kKTsKICAgICAgaWYgKCFuZXh0IHx8IG5leHQudGFnICE9IHRhZ05hbWUpIHJldHVybiBmYWxzZTsKICAgICAgcG9zID0gbmV4dC50bzsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/edit/continuelist.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CgogIHZhciBsaXN0UkUgPSAvXihccyopKFsqKy1dfChcZCspXC4pKFxzKykvLAogICAgICB1bm9yZGVyZWRCdWxsZXRzID0gIiorLSI7CgogIENvZGVNaXJyb3IuY29tbWFuZHMubmV3bGluZUFuZEluZGVudENvbnRpbnVlTWFya2Rvd25MaXN0ID0gZnVuY3Rpb24oY20pIHsKICAgIGlmIChjbS5nZXRPcHRpb24oImRpc2FibGVJbnB1dCIpKSByZXR1cm4gQ29kZU1pcnJvci5QYXNzOwogICAgdmFyIHJhbmdlcyA9IGNtLmxpc3RTZWxlY3Rpb25zKCksIHJlcGxhY2VtZW50cyA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIHBvcyA9IHJhbmdlc1tpXS5oZWFkLCBtYXRjaDsKICAgICAgdmFyIGluTGlzdCA9IGNtLmdldFN0YXRlQWZ0ZXIocG9zLmxpbmUpLmxpc3QgIT09IGZhbHNlOwoKICAgICAgaWYgKCFyYW5nZXNbaV0uZW1wdHkoKSB8fCAhaW5MaXN0IHx8ICEobWF0Y2ggPSBjbS5nZXRMaW5lKHBvcy5saW5lKS5tYXRjaChsaXN0UkUpKSkgewogICAgICAgIGNtLmV4ZWNDb21tYW5kKCJuZXdsaW5lQW5kSW5kZW50Iik7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHZhciBpbmRlbnQgPSBtYXRjaFsxXSwgYWZ0ZXIgPSBtYXRjaFs0XTsKICAgICAgdmFyIGJ1bGxldCA9IHVub3JkZXJlZEJ1bGxldHMuaW5kZXhPZihtYXRjaFsyXSkgPj0gMAogICAgICAgID8gbWF0Y2hbMl0KICAgICAgICA6IChwYXJzZUludChtYXRjaFszXSwgMTApICsgMSkgKyAiLiI7CgogICAgICByZXBsYWNlbWVudHNbaV0gPSAiXG4iICsgaW5kZW50ICsgYnVsbGV0ICsgYWZ0ZXI7CiAgICB9CgogICAgY20ucmVwbGFjZVNlbGVjdGlvbnMocmVwbGFjZW1lbnRzKTsKICB9Owp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/edit/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCEtLSBEVU1NWSBIVE1MIEZJTEUgLS0+]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/edit/matchbrackets.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICB2YXIgaWVfbHQ4ID0gL01TSUUgXGQvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkgJiYKICAgIChkb2N1bWVudC5kb2N1bWVudE1vZGUgPT0gbnVsbCB8fCBkb2N1bWVudC5kb2N1bWVudE1vZGUgPCA4KTsKCiAgdmFyIFBvcyA9IENvZGVNaXJyb3IuUG9zOwoKICB2YXIgbWF0Y2hpbmcgPSB7IigiOiAiKT4iLCAiKSI6ICIoPCIsICJbIjogIl0+IiwgIl0iOiAiWzwiLCAieyI6ICJ9PiIsICJ9IjogIns8In07CgogIGZ1bmN0aW9uIGZpbmRNYXRjaGluZ0JyYWNrZXQoY20sIHdoZXJlLCBzdHJpY3QsIGNvbmZpZykgewogICAgdmFyIGxpbmUgPSBjbS5nZXRMaW5lSGFuZGxlKHdoZXJlLmxpbmUpLCBwb3MgPSB3aGVyZS5jaCAtIDE7CiAgICB2YXIgbWF0Y2ggPSAocG9zID49IDAgJiYgbWF0Y2hpbmdbbGluZS50ZXh0LmNoYXJBdChwb3MpXSkgfHwgbWF0Y2hpbmdbbGluZS50ZXh0LmNoYXJBdCgrK3BvcyldOwogICAgaWYgKCFtYXRjaCkgcmV0dXJuIG51bGw7CiAgICB2YXIgZGlyID0gbWF0Y2guY2hhckF0KDEpID09ICI+IiA/IDEgOiAtMTsKICAgIGlmIChzdHJpY3QgJiYgKGRpciA+IDApICE9IChwb3MgPT0gd2hlcmUuY2gpKSByZXR1cm4gbnVsbDsKICAgIHZhciBzdHlsZSA9IGNtLmdldFRva2VuVHlwZUF0KFBvcyh3aGVyZS5saW5lLCBwb3MgKyAxKSk7CgogICAgdmFyIGZvdW5kID0gc2NhbkZvckJyYWNrZXQoY20sIFBvcyh3aGVyZS5saW5lLCBwb3MgKyAoZGlyID4gMCA/IDEgOiAwKSksIGRpciwgc3R5bGUgfHwgbnVsbCwgY29uZmlnKTsKICAgIGlmIChmb3VuZCA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIHJldHVybiB7ZnJvbTogUG9zKHdoZXJlLmxpbmUsIHBvcyksIHRvOiBmb3VuZCAmJiBmb3VuZC5wb3MsCiAgICAgICAgICAgIG1hdGNoOiBmb3VuZCAmJiBmb3VuZC5jaCA9PSBtYXRjaC5jaGFyQXQoMCksIGZvcndhcmQ6IGRpciA+IDB9OwogIH0KCiAgLy8gYnJhY2tldFJlZ2V4IGlzIHVzZWQgdG8gc3BlY2lmeSB3aGljaCB0eXBlIG9mIGJyYWNrZXQgdG8gc2NhbgogIC8vIHNob3VsZCBiZSBhIHJlZ2V4cCwgZS5nLiAvW1tcXV0vCiAgLy8KICAvLyBOb3RlOiBJZiAid2hlcmUiIGlzIG9uIGFuIG9wZW4gYnJhY2tldCwgdGhlbiB0aGlzIGJyYWNrZXQgaXMgaWdub3JlZC4KICAvLwogIC8vIFJldHVybnMgZmFsc2Ugd2hlbiBubyBicmFja2V0IHdhcyBmb3VuZCwgbnVsbCB3aGVuIGl0IHJlYWNoZWQKICAvLyBtYXhTY2FuTGluZXMgYW5kIGdhdmUgdXAKICBmdW5jdGlvbiBzY2FuRm9yQnJhY2tldChjbSwgd2hlcmUsIGRpciwgc3R5bGUsIGNvbmZpZykgewogICAgdmFyIG1heFNjYW5MZW4gPSAoY29uZmlnICYmIGNvbmZpZy5tYXhTY2FuTGluZUxlbmd0aCkgfHwgMTAwMDA7CiAgICB2YXIgbWF4U2NhbkxpbmVzID0gKGNvbmZpZyAmJiBjb25maWcubWF4U2NhbkxpbmVzKSB8fCAxMDAwOwoKICAgIHZhciBzdGFjayA9IFtdOwogICAgdmFyIHJlID0gY29uZmlnICYmIGNvbmZpZy5icmFja2V0UmVnZXggPyBjb25maWcuYnJhY2tldFJlZ2V4IDogL1soKXt9W1xdXS87CiAgICB2YXIgbGluZUVuZCA9IGRpciA+IDAgPyBNYXRoLm1pbih3aGVyZS5saW5lICsgbWF4U2NhbkxpbmVzLCBjbS5sYXN0TGluZSgpICsgMSkKICAgICAgICAgICAgICAgICAgICAgICAgICA6IE1hdGgubWF4KGNtLmZpcnN0TGluZSgpIC0gMSwgd2hlcmUubGluZSAtIG1heFNjYW5MaW5lcyk7CiAgICBmb3IgKHZhciBsaW5lTm8gPSB3aGVyZS5saW5lOyBsaW5lTm8gIT0gbGluZUVuZDsgbGluZU5vICs9IGRpcikgewogICAgICB2YXIgbGluZSA9IGNtLmdldExpbmUobGluZU5vKTsKICAgICAgaWYgKCFsaW5lKSBjb250aW51ZTsKICAgICAgdmFyIHBvcyA9IGRpciA+IDAgPyAwIDogbGluZS5sZW5ndGggLSAxLCBlbmQgPSBkaXIgPiAwID8gbGluZS5sZW5ndGggOiAtMTsKICAgICAgaWYgKGxpbmUubGVuZ3RoID4gbWF4U2NhbkxlbikgY29udGludWU7CiAgICAgIGlmIChsaW5lTm8gPT0gd2hlcmUubGluZSkgcG9zID0gd2hlcmUuY2ggLSAoZGlyIDwgMCA/IDEgOiAwKTsKICAgICAgZm9yICg7IHBvcyAhPSBlbmQ7IHBvcyArPSBkaXIpIHsKICAgICAgICB2YXIgY2ggPSBsaW5lLmNoYXJBdChwb3MpOwogICAgICAgIGlmIChyZS50ZXN0KGNoKSAmJiAoc3R5bGUgPT09IHVuZGVmaW5lZCB8fCBjbS5nZXRUb2tlblR5cGVBdChQb3MobGluZU5vLCBwb3MgKyAxKSkgPT0gc3R5bGUpKSB7CiAgICAgICAgICB2YXIgbWF0Y2ggPSBtYXRjaGluZ1tjaF07CiAgICAgICAgICBpZiAoKG1hdGNoLmNoYXJBdCgxKSA9PSAiPiIpID09IChkaXIgPiAwKSkgc3RhY2sucHVzaChjaCk7CiAgICAgICAgICBlbHNlIGlmICghc3RhY2subGVuZ3RoKSByZXR1cm4ge3BvczogUG9zKGxpbmVObywgcG9zKSwgY2g6IGNofTsKICAgICAgICAgIGVsc2Ugc3RhY2sucG9wKCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gbGluZU5vIC0gZGlyID09IChkaXIgPiAwID8gY20ubGFzdExpbmUoKSA6IGNtLmZpcnN0TGluZSgpKSA/IGZhbHNlIDogbnVsbDsKICB9CgogIGZ1bmN0aW9uIG1hdGNoQnJhY2tldHMoY20sIGF1dG9jbGVhciwgY29uZmlnKSB7CiAgICAvLyBEaXNhYmxlIGJyYWNlIG1hdGNoaW5nIGluIGxvbmcgbGluZXMsIHNpbmNlIGl0J2xsIGNhdXNlIGh1Z2VseSBzbG93IHVwZGF0ZXMKICAgIHZhciBtYXhIaWdobGlnaHRMZW4gPSBjbS5zdGF0ZS5tYXRjaEJyYWNrZXRzLm1heEhpZ2hsaWdodExpbmVMZW5ndGggfHwgMTAwMDsKICAgIHZhciBtYXJrcyA9IFtdLCByYW5nZXMgPSBjbS5saXN0U2VsZWN0aW9ucygpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIG1hdGNoID0gcmFuZ2VzW2ldLmVtcHR5KCkgJiYgZmluZE1hdGNoaW5nQnJhY2tldChjbSwgcmFuZ2VzW2ldLmhlYWQsIGZhbHNlLCBjb25maWcpOwogICAgICBpZiAobWF0Y2ggJiYgY20uZ2V0TGluZShtYXRjaC5mcm9tLmxpbmUpLmxlbmd0aCA8PSBtYXhIaWdobGlnaHRMZW4pIHsKICAgICAgICB2YXIgc3R5bGUgPSBtYXRjaC5tYXRjaCA/ICJDb2RlTWlycm9yLW1hdGNoaW5nYnJhY2tldCIgOiAiQ29kZU1pcnJvci1ub25tYXRjaGluZ2JyYWNrZXQiOwogICAgICAgIG1hcmtzLnB1c2goY20ubWFya1RleHQobWF0Y2guZnJvbSwgUG9zKG1hdGNoLmZyb20ubGluZSwgbWF0Y2guZnJvbS5jaCArIDEpLCB7Y2xhc3NOYW1lOiBzdHlsZX0pKTsKICAgICAgICBpZiAobWF0Y2gudG8gJiYgY20uZ2V0TGluZShtYXRjaC50by5saW5lKS5sZW5ndGggPD0gbWF4SGlnaGxpZ2h0TGVuKQogICAgICAgICAgbWFya3MucHVzaChjbS5tYXJrVGV4dChtYXRjaC50bywgUG9zKG1hdGNoLnRvLmxpbmUsIG1hdGNoLnRvLmNoICsgMSksIHtjbGFzc05hbWU6IHN0eWxlfSkpOwogICAgICB9CiAgICB9CgogICAgaWYgKG1hcmtzLmxlbmd0aCkgewogICAgICAvLyBLbHVkZ2UgdG8gd29yayBhcm91bmQgdGhlIElFIGJ1ZyBmcm9tIGlzc3VlICMxMTkzLCB3aGVyZSB0ZXh0CiAgICAgIC8vIGlucHV0IHN0b3BzIGdvaW5nIHRvIHRoZSB0ZXh0YXJlIHdoZXZlciB0aGlzIGZpcmVzLgogICAgICBpZiAoaWVfbHQ4ICYmIGNtLnN0YXRlLmZvY3VzZWQpIGNtLmRpc3BsYXkuaW5wdXQuZm9jdXMoKTsKCiAgICAgIHZhciBjbGVhciA9IGZ1bmN0aW9uKCkgewogICAgICAgIGNtLm9wZXJhdGlvbihmdW5jdGlvbigpIHsKICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWFya3MubGVuZ3RoOyBpKyspIG1hcmtzW2ldLmNsZWFyKCk7CiAgICAgICAgfSk7CiAgICAgIH07CiAgICAgIGlmIChhdXRvY2xlYXIpIHNldFRpbWVvdXQoY2xlYXIsIDgwMCk7CiAgICAgIGVsc2UgcmV0dXJuIGNsZWFyOwogICAgfQogIH0KCiAgdmFyIGN1cnJlbnRseUhpZ2hsaWdodGVkID0gbnVsbDsKICBmdW5jdGlvbiBkb01hdGNoQnJhY2tldHMoY20pIHsKICAgIGNtLm9wZXJhdGlvbihmdW5jdGlvbigpIHsKICAgICAgaWYgKGN1cnJlbnRseUhpZ2hsaWdodGVkKSB7Y3VycmVudGx5SGlnaGxpZ2h0ZWQoKTsgY3VycmVudGx5SGlnaGxpZ2h0ZWQgPSBudWxsO30KICAgICAgY3VycmVudGx5SGlnaGxpZ2h0ZWQgPSBtYXRjaEJyYWNrZXRzKGNtLCBmYWxzZSwgY20uc3RhdGUubWF0Y2hCcmFja2V0cyk7CiAgICB9KTsKICB9CgogIENvZGVNaXJyb3IuZGVmaW5lT3B0aW9uKCJtYXRjaEJyYWNrZXRzIiwgZmFsc2UsIGZ1bmN0aW9uKGNtLCB2YWwsIG9sZCkgewogICAgaWYgKG9sZCAmJiBvbGQgIT0gQ29kZU1pcnJvci5Jbml0KQogICAgICBjbS5vZmYoImN1cnNvckFjdGl2aXR5IiwgZG9NYXRjaEJyYWNrZXRzKTsKICAgIGlmICh2YWwpIHsKICAgICAgY20uc3RhdGUubWF0Y2hCcmFja2V0cyA9IHR5cGVvZiB2YWwgPT0gIm9iamVjdCIgPyB2YWwgOiB7fTsKICAgICAgY20ub24oImN1cnNvckFjdGl2aXR5IiwgZG9NYXRjaEJyYWNrZXRzKTsKICAgIH0KICB9KTsKCiAgQ29kZU1pcnJvci5kZWZpbmVFeHRlbnNpb24oIm1hdGNoQnJhY2tldHMiLCBmdW5jdGlvbigpIHttYXRjaEJyYWNrZXRzKHRoaXMsIHRydWUpO30pOwogIENvZGVNaXJyb3IuZGVmaW5lRXh0ZW5zaW9uKCJmaW5kTWF0Y2hpbmdCcmFja2V0IiwgZnVuY3Rpb24ocG9zLCBzdHJpY3QsIGNvbmZpZyl7CiAgICByZXR1cm4gZmluZE1hdGNoaW5nQnJhY2tldCh0aGlzLCBwb3MsIHN0cmljdCwgY29uZmlnKTsKICB9KTsKICBDb2RlTWlycm9yLmRlZmluZUV4dGVuc2lvbigic2NhbkZvckJyYWNrZXQiLCBmdW5jdGlvbihwb3MsIGRpciwgc3R5bGUsIGNvbmZpZyl7CiAgICByZXR1cm4gc2NhbkZvckJyYWNrZXQodGhpcywgcG9zLCBkaXIsIHN0eWxlLCBjb25maWcpOwogIH0pOwp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/edit/matchtags.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSwgcmVxdWlyZSgiLi4vZm9sZC94bWwtZm9sZCIpKTsKICBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCkgLy8gQU1ECiAgICBkZWZpbmUoWyIuLi8uLi9saWIvY29kZW1pcnJvciIsICIuLi9mb2xkL3htbC1mb2xkIl0sIG1vZCk7CiAgZWxzZSAvLyBQbGFpbiBicm93c2VyIGVudgogICAgbW9kKENvZGVNaXJyb3IpOwp9KShmdW5jdGlvbihDb2RlTWlycm9yKSB7CiAgInVzZSBzdHJpY3QiOwoKICBDb2RlTWlycm9yLmRlZmluZU9wdGlvbigibWF0Y2hUYWdzIiwgZmFsc2UsIGZ1bmN0aW9uKGNtLCB2YWwsIG9sZCkgewogICAgaWYgKG9sZCAmJiBvbGQgIT0gQ29kZU1pcnJvci5Jbml0KSB7CiAgICAgIGNtLm9mZigiY3Vyc29yQWN0aXZpdHkiLCBkb01hdGNoVGFncyk7CiAgICAgIGNtLm9mZigidmlld3BvcnRDaGFuZ2UiLCBtYXliZVVwZGF0ZU1hdGNoKTsKICAgICAgY2xlYXIoY20pOwogICAgfQogICAgaWYgKHZhbCkgewogICAgICBjbS5zdGF0ZS5tYXRjaEJvdGhUYWdzID0gdHlwZW9mIHZhbCA9PSAib2JqZWN0IiAmJiB2YWwuYm90aFRhZ3M7CiAgICAgIGNtLm9uKCJjdXJzb3JBY3Rpdml0eSIsIGRvTWF0Y2hUYWdzKTsKICAgICAgY20ub24oInZpZXdwb3J0Q2hhbmdlIiwgbWF5YmVVcGRhdGVNYXRjaCk7CiAgICAgIGRvTWF0Y2hUYWdzKGNtKTsKICAgIH0KICB9KTsKCiAgZnVuY3Rpb24gY2xlYXIoY20pIHsKICAgIGlmIChjbS5zdGF0ZS50YWdIaXQpIGNtLnN0YXRlLnRhZ0hpdC5jbGVhcigpOwogICAgaWYgKGNtLnN0YXRlLnRhZ090aGVyKSBjbS5zdGF0ZS50YWdPdGhlci5jbGVhcigpOwogICAgY20uc3RhdGUudGFnSGl0ID0gY20uc3RhdGUudGFnT3RoZXIgPSBudWxsOwogIH0KCiAgZnVuY3Rpb24gZG9NYXRjaFRhZ3MoY20pIHsKICAgIGNtLnN0YXRlLmZhaWxlZFRhZ01hdGNoID0gZmFsc2U7CiAgICBjbS5vcGVyYXRpb24oZnVuY3Rpb24oKSB7CiAgICAgIGNsZWFyKGNtKTsKICAgICAgaWYgKGNtLnNvbWV0aGluZ1NlbGVjdGVkKCkpIHJldHVybjsKICAgICAgdmFyIGN1ciA9IGNtLmdldEN1cnNvcigpLCByYW5nZSA9IGNtLmdldFZpZXdwb3J0KCk7CiAgICAgIHJhbmdlLmZyb20gPSBNYXRoLm1pbihyYW5nZS5mcm9tLCBjdXIubGluZSk7IHJhbmdlLnRvID0gTWF0aC5tYXgoY3VyLmxpbmUgKyAxLCByYW5nZS50byk7CiAgICAgIHZhciBtYXRjaCA9IENvZGVNaXJyb3IuZmluZE1hdGNoaW5nVGFnKGNtLCBjdXIsIHJhbmdlKTsKICAgICAgaWYgKCFtYXRjaCkgcmV0dXJuOwogICAgICBpZiAoY20uc3RhdGUubWF0Y2hCb3RoVGFncykgewogICAgICAgIHZhciBoaXQgPSBtYXRjaC5hdCA9PSAib3BlbiIgPyBtYXRjaC5vcGVuIDogbWF0Y2guY2xvc2U7CiAgICAgICAgaWYgKGhpdCkgY20uc3RhdGUudGFnSGl0ID0gY20ubWFya1RleHQoaGl0LmZyb20sIGhpdC50bywge2NsYXNzTmFtZTogIkNvZGVNaXJyb3ItbWF0Y2hpbmd0YWcifSk7CiAgICAgIH0KICAgICAgdmFyIG90aGVyID0gbWF0Y2guYXQgPT0gImNsb3NlIiA/IG1hdGNoLm9wZW4gOiBtYXRjaC5jbG9zZTsKICAgICAgaWYgKG90aGVyKQogICAgICAgIGNtLnN0YXRlLnRhZ090aGVyID0gY20ubWFya1RleHQob3RoZXIuZnJvbSwgb3RoZXIudG8sIHtjbGFzc05hbWU6ICJDb2RlTWlycm9yLW1hdGNoaW5ndGFnIn0pOwogICAgICBlbHNlCiAgICAgICAgY20uc3RhdGUuZmFpbGVkVGFnTWF0Y2ggPSB0cnVlOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBtYXliZVVwZGF0ZU1hdGNoKGNtKSB7CiAgICBpZiAoY20uc3RhdGUuZmFpbGVkVGFnTWF0Y2gpIGRvTWF0Y2hUYWdzKGNtKTsKICB9CgogIENvZGVNaXJyb3IuY29tbWFuZHMudG9NYXRjaGluZ1RhZyA9IGZ1bmN0aW9uKGNtKSB7CiAgICB2YXIgZm91bmQgPSBDb2RlTWlycm9yLmZpbmRNYXRjaGluZ1RhZyhjbSwgY20uZ2V0Q3Vyc29yKCkpOwogICAgaWYgKGZvdW5kKSB7CiAgICAgIHZhciBvdGhlciA9IGZvdW5kLmF0ID09ICJjbG9zZSIgPyBmb3VuZC5vcGVuIDogZm91bmQuY2xvc2U7CiAgICAgIGlmIChvdGhlcikgY20uZXh0ZW5kU2VsZWN0aW9uKG90aGVyLnRvLCBvdGhlci5mcm9tKTsKICAgIH0KICB9Owp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/edit/trailingspace.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICBDb2RlTWlycm9yLmRlZmluZU9wdGlvbigic2hvd1RyYWlsaW5nU3BhY2UiLCBmYWxzZSwgZnVuY3Rpb24oY20sIHZhbCwgcHJldikgewogICAgaWYgKHByZXYgPT0gQ29kZU1pcnJvci5Jbml0KSBwcmV2ID0gZmFsc2U7CiAgICBpZiAocHJldiAmJiAhdmFsKQogICAgICBjbS5yZW1vdmVPdmVybGF5KCJ0cmFpbGluZ3NwYWNlIik7CiAgICBlbHNlIGlmICghcHJldiAmJiB2YWwpCiAgICAgIGNtLmFkZE92ZXJsYXkoewogICAgICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0pIHsKICAgICAgICAgIGZvciAodmFyIGwgPSBzdHJlYW0uc3RyaW5nLmxlbmd0aCwgaSA9IGw7IGkgJiYgL1xzLy50ZXN0KHN0cmVhbS5zdHJpbmcuY2hhckF0KGkgLSAxKSk7IC0taSkge30KICAgICAgICAgIGlmIChpID4gc3RyZWFtLnBvcykgeyBzdHJlYW0ucG9zID0gaTsgcmV0dXJuIG51bGw7IH0KICAgICAgICAgIHN0cmVhbS5wb3MgPSBsOwogICAgICAgICAgcmV0dXJuICJ0cmFpbGluZ3NwYWNlIjsKICAgICAgICB9LAogICAgICAgIG5hbWU6ICJ0cmFpbGluZ3NwYWNlIgogICAgICB9KTsKICB9KTsKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/fold/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/fold/brace-fold.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5yZWdpc3RlckhlbHBlcigiZm9sZCIsICJicmFjZSIsIGZ1bmN0aW9uKGNtLCBzdGFydCkgewogIHZhciBsaW5lID0gc3RhcnQubGluZSwgbGluZVRleHQgPSBjbS5nZXRMaW5lKGxpbmUpOwogIHZhciBzdGFydENoLCB0b2tlblR5cGU7CgogIGZ1bmN0aW9uIGZpbmRPcGVuaW5nKG9wZW5DaCkgewogICAgZm9yICh2YXIgYXQgPSBzdGFydC5jaCwgcGFzcyA9IDA7OykgewogICAgICB2YXIgZm91bmQgPSBhdCA8PSAwID8gLTEgOiBsaW5lVGV4dC5sYXN0SW5kZXhPZihvcGVuQ2gsIGF0IC0gMSk7CiAgICAgIGlmIChmb3VuZCA9PSAtMSkgewogICAgICAgIGlmIChwYXNzID09IDEpIGJyZWFrOwogICAgICAgIHBhc3MgPSAxOwogICAgICAgIGF0ID0gbGluZVRleHQubGVuZ3RoOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmIChwYXNzID09IDEgJiYgZm91bmQgPCBzdGFydC5jaCkgYnJlYWs7CiAgICAgIHRva2VuVHlwZSA9IGNtLmdldFRva2VuVHlwZUF0KENvZGVNaXJyb3IuUG9zKGxpbmUsIGZvdW5kICsgMSkpOwogICAgICBpZiAoIS9eKGNvbW1lbnR8c3RyaW5nKS8udGVzdCh0b2tlblR5cGUpKSByZXR1cm4gZm91bmQgKyAxOwogICAgICBhdCA9IGZvdW5kIC0gMTsKICAgIH0KICB9CgogIHZhciBzdGFydFRva2VuID0gInsiLCBlbmRUb2tlbiA9ICJ9Iiwgc3RhcnRDaCA9IGZpbmRPcGVuaW5nKCJ7Iik7CiAgaWYgKHN0YXJ0Q2ggPT0gbnVsbCkgewogICAgc3RhcnRUb2tlbiA9ICJbIiwgZW5kVG9rZW4gPSAiXSI7CiAgICBzdGFydENoID0gZmluZE9wZW5pbmcoIlsiKTsKICB9CgogIGlmIChzdGFydENoID09IG51bGwpIHJldHVybjsKICB2YXIgY291bnQgPSAxLCBsYXN0TGluZSA9IGNtLmxhc3RMaW5lKCksIGVuZCwgZW5kQ2g7CiAgb3V0ZXI6IGZvciAodmFyIGkgPSBsaW5lOyBpIDw9IGxhc3RMaW5lOyArK2kpIHsKICAgIHZhciB0ZXh0ID0gY20uZ2V0TGluZShpKSwgcG9zID0gaSA9PSBsaW5lID8gc3RhcnRDaCA6IDA7CiAgICBmb3IgKDs7KSB7CiAgICAgIHZhciBuZXh0T3BlbiA9IHRleHQuaW5kZXhPZihzdGFydFRva2VuLCBwb3MpLCBuZXh0Q2xvc2UgPSB0ZXh0LmluZGV4T2YoZW5kVG9rZW4sIHBvcyk7CiAgICAgIGlmIChuZXh0T3BlbiA8IDApIG5leHRPcGVuID0gdGV4dC5sZW5ndGg7CiAgICAgIGlmIChuZXh0Q2xvc2UgPCAwKSBuZXh0Q2xvc2UgPSB0ZXh0Lmxlbmd0aDsKICAgICAgcG9zID0gTWF0aC5taW4obmV4dE9wZW4sIG5leHRDbG9zZSk7CiAgICAgIGlmIChwb3MgPT0gdGV4dC5sZW5ndGgpIGJyZWFrOwogICAgICBpZiAoY20uZ2V0VG9rZW5UeXBlQXQoQ29kZU1pcnJvci5Qb3MoaSwgcG9zICsgMSkpID09IHRva2VuVHlwZSkgewogICAgICAgIGlmIChwb3MgPT0gbmV4dE9wZW4pICsrY291bnQ7CiAgICAgICAgZWxzZSBpZiAoIS0tY291bnQpIHsgZW5kID0gaTsgZW5kQ2ggPSBwb3M7IGJyZWFrIG91dGVyOyB9CiAgICAgIH0KICAgICAgKytwb3M7CiAgICB9CiAgfQogIGlmIChlbmQgPT0gbnVsbCB8fCBsaW5lID09IGVuZCAmJiBlbmRDaCA9PSBzdGFydENoKSByZXR1cm47CiAgcmV0dXJuIHtmcm9tOiBDb2RlTWlycm9yLlBvcyhsaW5lLCBzdGFydENoKSwKICAgICAgICAgIHRvOiBDb2RlTWlycm9yLlBvcyhlbmQsIGVuZENoKX07Cn0pOwoKQ29kZU1pcnJvci5yZWdpc3RlckhlbHBlcigiZm9sZCIsICJpbXBvcnQiLCBmdW5jdGlvbihjbSwgc3RhcnQpIHsKICBmdW5jdGlvbiBoYXNJbXBvcnQobGluZSkgewogICAgaWYgKGxpbmUgPCBjbS5maXJzdExpbmUoKSB8fCBsaW5lID4gY20ubGFzdExpbmUoKSkgcmV0dXJuIG51bGw7CiAgICB2YXIgc3RhcnQgPSBjbS5nZXRUb2tlbkF0KENvZGVNaXJyb3IuUG9zKGxpbmUsIDEpKTsKICAgIGlmICghL1xTLy50ZXN0KHN0YXJ0LnN0cmluZykpIHN0YXJ0ID0gY20uZ2V0VG9rZW5BdChDb2RlTWlycm9yLlBvcyhsaW5lLCBzdGFydC5lbmQgKyAxKSk7CiAgICBpZiAoc3RhcnQudHlwZSAhPSAia2V5d29yZCIgfHwgc3RhcnQuc3RyaW5nICE9ICJpbXBvcnQiKSByZXR1cm4gbnVsbDsKICAgIC8vIE5vdyBmaW5kIGNsb3Npbmcgc2VtaWNvbG9uLCByZXR1cm4gaXRzIHBvc2l0aW9uCiAgICBmb3IgKHZhciBpID0gbGluZSwgZSA9IE1hdGgubWluKGNtLmxhc3RMaW5lKCksIGxpbmUgKyAxMCk7IGkgPD0gZTsgKytpKSB7CiAgICAgIHZhciB0ZXh0ID0gY20uZ2V0TGluZShpKSwgc2VtaSA9IHRleHQuaW5kZXhPZigiOyIpOwogICAgICBpZiAoc2VtaSAhPSAtMSkgcmV0dXJuIHtzdGFydENoOiBzdGFydC5lbmQsIGVuZDogQ29kZU1pcnJvci5Qb3MoaSwgc2VtaSl9OwogICAgfQogIH0KCiAgdmFyIHN0YXJ0ID0gc3RhcnQubGluZSwgaGFzID0gaGFzSW1wb3J0KHN0YXJ0KSwgcHJldjsKICBpZiAoIWhhcyB8fCBoYXNJbXBvcnQoc3RhcnQgLSAxKSB8fCAoKHByZXYgPSBoYXNJbXBvcnQoc3RhcnQgLSAyKSkgJiYgcHJldi5lbmQubGluZSA9PSBzdGFydCAtIDEpKQogICAgcmV0dXJuIG51bGw7CiAgZm9yICh2YXIgZW5kID0gaGFzLmVuZDs7KSB7CiAgICB2YXIgbmV4dCA9IGhhc0ltcG9ydChlbmQubGluZSArIDEpOwogICAgaWYgKG5leHQgPT0gbnVsbCkgYnJlYWs7CiAgICBlbmQgPSBuZXh0LmVuZDsKICB9CiAgcmV0dXJuIHtmcm9tOiBjbS5jbGlwUG9zKENvZGVNaXJyb3IuUG9zKHN0YXJ0LCBoYXMuc3RhcnRDaCArIDEpKSwgdG86IGVuZH07Cn0pOwoKQ29kZU1pcnJvci5yZWdpc3RlckhlbHBlcigiZm9sZCIsICJpbmNsdWRlIiwgZnVuY3Rpb24oY20sIHN0YXJ0KSB7CiAgZnVuY3Rpb24gaGFzSW5jbHVkZShsaW5lKSB7CiAgICBpZiAobGluZSA8IGNtLmZpcnN0TGluZSgpIHx8IGxpbmUgPiBjbS5sYXN0TGluZSgpKSByZXR1cm4gbnVsbDsKICAgIHZhciBzdGFydCA9IGNtLmdldFRva2VuQXQoQ29kZU1pcnJvci5Qb3MobGluZSwgMSkpOwogICAgaWYgKCEvXFMvLnRlc3Qoc3RhcnQuc3RyaW5nKSkgc3RhcnQgPSBjbS5nZXRUb2tlbkF0KENvZGVNaXJyb3IuUG9zKGxpbmUsIHN0YXJ0LmVuZCArIDEpKTsKICAgIGlmIChzdGFydC50eXBlID09ICJtZXRhIiAmJiBzdGFydC5zdHJpbmcuc2xpY2UoMCwgOCkgPT0gIiNpbmNsdWRlIikgcmV0dXJuIHN0YXJ0LnN0YXJ0ICsgODsKICB9CgogIHZhciBzdGFydCA9IHN0YXJ0LmxpbmUsIGhhcyA9IGhhc0luY2x1ZGUoc3RhcnQpOwogIGlmIChoYXMgPT0gbnVsbCB8fCBoYXNJbmNsdWRlKHN0YXJ0IC0gMSkgIT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgZm9yICh2YXIgZW5kID0gc3RhcnQ7OykgewogICAgdmFyIG5leHQgPSBoYXNJbmNsdWRlKGVuZCArIDEpOwogICAgaWYgKG5leHQgPT0gbnVsbCkgYnJlYWs7CiAgICArK2VuZDsKICB9CiAgcmV0dXJuIHtmcm9tOiBDb2RlTWlycm9yLlBvcyhzdGFydCwgaGFzICsgMSksCiAgICAgICAgICB0bzogY20uY2xpcFBvcyhDb2RlTWlycm9yLlBvcyhlbmQpKX07Cn0pOwoKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/fold/comment-fold.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5yZWdpc3Rlckdsb2JhbEhlbHBlcigiZm9sZCIsICJjb21tZW50IiwgZnVuY3Rpb24obW9kZSkgewogIHJldHVybiBtb2RlLmJsb2NrQ29tbWVudFN0YXJ0ICYmIG1vZGUuYmxvY2tDb21tZW50RW5kOwp9LCBmdW5jdGlvbihjbSwgc3RhcnQpIHsKICB2YXIgbW9kZSA9IGNtLmdldE1vZGVBdChzdGFydCksIHN0YXJ0VG9rZW4gPSBtb2RlLmJsb2NrQ29tbWVudFN0YXJ0LCBlbmRUb2tlbiA9IG1vZGUuYmxvY2tDb21tZW50RW5kOwogIGlmICghc3RhcnRUb2tlbiB8fCAhZW5kVG9rZW4pIHJldHVybjsKICB2YXIgbGluZSA9IHN0YXJ0LmxpbmUsIGxpbmVUZXh0ID0gY20uZ2V0TGluZShsaW5lKTsKCiAgdmFyIHN0YXJ0Q2g7CiAgZm9yICh2YXIgYXQgPSBzdGFydC5jaCwgcGFzcyA9IDA7OykgewogICAgdmFyIGZvdW5kID0gYXQgPD0gMCA/IC0xIDogbGluZVRleHQubGFzdEluZGV4T2Yoc3RhcnRUb2tlbiwgYXQgLSAxKTsKICAgIGlmIChmb3VuZCA9PSAtMSkgewogICAgICBpZiAocGFzcyA9PSAxKSByZXR1cm47CiAgICAgIHBhc3MgPSAxOwogICAgICBhdCA9IGxpbmVUZXh0Lmxlbmd0aDsKICAgICAgY29udGludWU7CiAgICB9CiAgICBpZiAocGFzcyA9PSAxICYmIGZvdW5kIDwgc3RhcnQuY2gpIHJldHVybjsKICAgIGlmICgvY29tbWVudC8udGVzdChjbS5nZXRUb2tlblR5cGVBdChDb2RlTWlycm9yLlBvcyhsaW5lLCBmb3VuZCArIDEpKSkpIHsKICAgICAgc3RhcnRDaCA9IGZvdW5kICsgc3RhcnRUb2tlbi5sZW5ndGg7CiAgICAgIGJyZWFrOwogICAgfQogICAgYXQgPSBmb3VuZCAtIDE7CiAgfQoKICB2YXIgZGVwdGggPSAxLCBsYXN0TGluZSA9IGNtLmxhc3RMaW5lKCksIGVuZCwgZW5kQ2g7CiAgb3V0ZXI6IGZvciAodmFyIGkgPSBsaW5lOyBpIDw9IGxhc3RMaW5lOyArK2kpIHsKICAgIHZhciB0ZXh0ID0gY20uZ2V0TGluZShpKSwgcG9zID0gaSA9PSBsaW5lID8gc3RhcnRDaCA6IDA7CiAgICBmb3IgKDs7KSB7CiAgICAgIHZhciBuZXh0T3BlbiA9IHRleHQuaW5kZXhPZihzdGFydFRva2VuLCBwb3MpLCBuZXh0Q2xvc2UgPSB0ZXh0LmluZGV4T2YoZW5kVG9rZW4sIHBvcyk7CiAgICAgIGlmIChuZXh0T3BlbiA8IDApIG5leHRPcGVuID0gdGV4dC5sZW5ndGg7CiAgICAgIGlmIChuZXh0Q2xvc2UgPCAwKSBuZXh0Q2xvc2UgPSB0ZXh0Lmxlbmd0aDsKICAgICAgcG9zID0gTWF0aC5taW4obmV4dE9wZW4sIG5leHRDbG9zZSk7CiAgICAgIGlmIChwb3MgPT0gdGV4dC5sZW5ndGgpIGJyZWFrOwogICAgICBpZiAocG9zID09IG5leHRPcGVuKSArK2RlcHRoOwogICAgICBlbHNlIGlmICghLS1kZXB0aCkgeyBlbmQgPSBpOyBlbmRDaCA9IHBvczsgYnJlYWsgb3V0ZXI7IH0KICAgICAgKytwb3M7CiAgICB9CiAgfQogIGlmIChlbmQgPT0gbnVsbCB8fCBsaW5lID09IGVuZCAmJiBlbmRDaCA9PSBzdGFydENoKSByZXR1cm47CiAgcmV0dXJuIHtmcm9tOiBDb2RlTWlycm9yLlBvcyhsaW5lLCBzdGFydENoKSwKICAgICAgICAgIHRvOiBDb2RlTWlycm9yLlBvcyhlbmQsIGVuZENoKX07Cn0pOwoKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/fold/foldcode.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CgogIGZ1bmN0aW9uIGRvRm9sZChjbSwgcG9zLCBvcHRpb25zLCBmb3JjZSkgewogICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5jYWxsKSB7CiAgICAgIHZhciBmaW5kZXIgPSBvcHRpb25zOwogICAgICBvcHRpb25zID0gbnVsbDsKICAgIH0gZWxzZSB7CiAgICAgIHZhciBmaW5kZXIgPSBnZXRPcHRpb24oY20sIG9wdGlvbnMsICJyYW5nZUZpbmRlciIpOwogICAgfQogICAgaWYgKHR5cGVvZiBwb3MgPT0gIm51bWJlciIpIHBvcyA9IENvZGVNaXJyb3IuUG9zKHBvcywgMCk7CiAgICB2YXIgbWluU2l6ZSA9IGdldE9wdGlvbihjbSwgb3B0aW9ucywgIm1pbkZvbGRTaXplIik7CgogICAgZnVuY3Rpb24gZ2V0UmFuZ2UoYWxsb3dGb2xkZWQpIHsKICAgICAgdmFyIHJhbmdlID0gZmluZGVyKGNtLCBwb3MpOwogICAgICBpZiAoIXJhbmdlIHx8IHJhbmdlLnRvLmxpbmUgLSByYW5nZS5mcm9tLmxpbmUgPCBtaW5TaXplKSByZXR1cm4gbnVsbDsKICAgICAgdmFyIG1hcmtzID0gY20uZmluZE1hcmtzQXQocmFuZ2UuZnJvbSk7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWFya3MubGVuZ3RoOyArK2kpIHsKICAgICAgICBpZiAobWFya3NbaV0uX19pc0ZvbGQgJiYgZm9yY2UgIT09ICJmb2xkIikgewogICAgICAgICAgaWYgKCFhbGxvd0ZvbGRlZCkgcmV0dXJuIG51bGw7CiAgICAgICAgICByYW5nZS5jbGVhcmVkID0gdHJ1ZTsKICAgICAgICAgIG1hcmtzW2ldLmNsZWFyKCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiByYW5nZTsKICAgIH0KCiAgICB2YXIgcmFuZ2UgPSBnZXRSYW5nZSh0cnVlKTsKICAgIGlmIChnZXRPcHRpb24oY20sIG9wdGlvbnMsICJzY2FuVXAiKSkgd2hpbGUgKCFyYW5nZSAmJiBwb3MubGluZSA+IGNtLmZpcnN0TGluZSgpKSB7CiAgICAgIHBvcyA9IENvZGVNaXJyb3IuUG9zKHBvcy5saW5lIC0gMSwgMCk7CiAgICAgIHJhbmdlID0gZ2V0UmFuZ2UoZmFsc2UpOwogICAgfQogICAgaWYgKCFyYW5nZSB8fCByYW5nZS5jbGVhcmVkIHx8IGZvcmNlID09PSAidW5mb2xkIikgcmV0dXJuOwoKICAgIHZhciBteVdpZGdldCA9IG1ha2VXaWRnZXQoY20sIG9wdGlvbnMpOwogICAgQ29kZU1pcnJvci5vbihteVdpZGdldCwgIm1vdXNlZG93biIsIGZ1bmN0aW9uKGUpIHsKICAgICAgbXlSYW5nZS5jbGVhcigpOwogICAgICBDb2RlTWlycm9yLmVfcHJldmVudERlZmF1bHQoZSk7CiAgICB9KTsKICAgIHZhciBteVJhbmdlID0gY20ubWFya1RleHQocmFuZ2UuZnJvbSwgcmFuZ2UudG8sIHsKICAgICAgcmVwbGFjZWRXaXRoOiBteVdpZGdldCwKICAgICAgY2xlYXJPbkVudGVyOiB0cnVlLAogICAgICBfX2lzRm9sZDogdHJ1ZQogICAgfSk7CiAgICBteVJhbmdlLm9uKCJjbGVhciIsIGZ1bmN0aW9uKGZyb20sIHRvKSB7CiAgICAgIENvZGVNaXJyb3Iuc2lnbmFsKGNtLCAidW5mb2xkIiwgY20sIGZyb20sIHRvKTsKICAgIH0pOwogICAgQ29kZU1pcnJvci5zaWduYWwoY20sICJmb2xkIiwgY20sIHJhbmdlLmZyb20sIHJhbmdlLnRvKTsKICB9CgogIGZ1bmN0aW9uIG1ha2VXaWRnZXQoY20sIG9wdGlvbnMpIHsKICAgIHZhciB3aWRnZXQgPSBnZXRPcHRpb24oY20sIG9wdGlvbnMsICJ3aWRnZXQiKTsKICAgIGlmICh0eXBlb2Ygd2lkZ2V0ID09ICJzdHJpbmciKSB7CiAgICAgIHZhciB0ZXh0ID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUod2lkZ2V0KTsKICAgICAgd2lkZ2V0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpOwogICAgICB3aWRnZXQuYXBwZW5kQ2hpbGQodGV4dCk7CiAgICAgIHdpZGdldC5jbGFzc05hbWUgPSAiQ29kZU1pcnJvci1mb2xkbWFya2VyIjsKICAgIH0KICAgIHJldHVybiB3aWRnZXQ7CiAgfQoKICAvLyBDbHVtc3kgYmFja3dhcmRzLWNvbXBhdGlibGUgaW50ZXJmYWNlCiAgQ29kZU1pcnJvci5uZXdGb2xkRnVuY3Rpb24gPSBmdW5jdGlvbihyYW5nZUZpbmRlciwgd2lkZ2V0KSB7CiAgICByZXR1cm4gZnVuY3Rpb24oY20sIHBvcykgeyBkb0ZvbGQoY20sIHBvcywge3JhbmdlRmluZGVyOiByYW5nZUZpbmRlciwgd2lkZ2V0OiB3aWRnZXR9KTsgfTsKICB9OwoKICAvLyBOZXctc3R5bGUgaW50ZXJmYWNlCiAgQ29kZU1pcnJvci5kZWZpbmVFeHRlbnNpb24oImZvbGRDb2RlIiwgZnVuY3Rpb24ocG9zLCBvcHRpb25zLCBmb3JjZSkgewogICAgZG9Gb2xkKHRoaXMsIHBvcywgb3B0aW9ucywgZm9yY2UpOwogIH0pOwoKICBDb2RlTWlycm9yLmRlZmluZUV4dGVuc2lvbigiaXNGb2xkZWQiLCBmdW5jdGlvbihwb3MpIHsKICAgIHZhciBtYXJrcyA9IHRoaXMuZmluZE1hcmtzQXQocG9zKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWFya3MubGVuZ3RoOyArK2kpCiAgICAgIGlmIChtYXJrc1tpXS5fX2lzRm9sZCkgcmV0dXJuIHRydWU7CiAgfSk7CgogIENvZGVNaXJyb3IuY29tbWFuZHMudG9nZ2xlRm9sZCA9IGZ1bmN0aW9uKGNtKSB7CiAgICBjbS5mb2xkQ29kZShjbS5nZXRDdXJzb3IoKSk7CiAgfTsKICBDb2RlTWlycm9yLmNvbW1hbmRzLmZvbGQgPSBmdW5jdGlvbihjbSkgewogICAgY20uZm9sZENvZGUoY20uZ2V0Q3Vyc29yKCksIG51bGwsICJmb2xkIik7CiAgfTsKICBDb2RlTWlycm9yLmNvbW1hbmRzLnVuZm9sZCA9IGZ1bmN0aW9uKGNtKSB7CiAgICBjbS5mb2xkQ29kZShjbS5nZXRDdXJzb3IoKSwgbnVsbCwgInVuZm9sZCIpOwogIH07CiAgQ29kZU1pcnJvci5jb21tYW5kcy5mb2xkQWxsID0gZnVuY3Rpb24oY20pIHsKICAgIGNtLm9wZXJhdGlvbihmdW5jdGlvbigpIHsKICAgICAgZm9yICh2YXIgaSA9IGNtLmZpcnN0TGluZSgpLCBlID0gY20ubGFzdExpbmUoKTsgaSA8PSBlOyBpKyspCiAgICAgICAgY20uZm9sZENvZGUoQ29kZU1pcnJvci5Qb3MoaSwgMCksIG51bGwsICJmb2xkIik7CiAgICB9KTsKICB9OwogIENvZGVNaXJyb3IuY29tbWFuZHMudW5mb2xkQWxsID0gZnVuY3Rpb24oY20pIHsKICAgIGNtLm9wZXJhdGlvbihmdW5jdGlvbigpIHsKICAgICAgZm9yICh2YXIgaSA9IGNtLmZpcnN0TGluZSgpLCBlID0gY20ubGFzdExpbmUoKTsgaSA8PSBlOyBpKyspCiAgICAgICAgY20uZm9sZENvZGUoQ29kZU1pcnJvci5Qb3MoaSwgMCksIG51bGwsICJ1bmZvbGQiKTsKICAgIH0pOwogIH07CgogIENvZGVNaXJyb3IucmVnaXN0ZXJIZWxwZXIoImZvbGQiLCAiY29tYmluZSIsIGZ1bmN0aW9uKCkgewogICAgdmFyIGZ1bmNzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAwKTsKICAgIHJldHVybiBmdW5jdGlvbihjbSwgc3RhcnQpIHsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmdW5jcy5sZW5ndGg7ICsraSkgewogICAgICAgIHZhciBmb3VuZCA9IGZ1bmNzW2ldKGNtLCBzdGFydCk7CiAgICAgICAgaWYgKGZvdW5kKSByZXR1cm4gZm91bmQ7CiAgICAgIH0KICAgIH07CiAgfSk7CgogIENvZGVNaXJyb3IucmVnaXN0ZXJIZWxwZXIoImZvbGQiLCAiYXV0byIsIGZ1bmN0aW9uKGNtLCBzdGFydCkgewogICAgdmFyIGhlbHBlcnMgPSBjbS5nZXRIZWxwZXJzKHN0YXJ0LCAiZm9sZCIpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBoZWxwZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBjdXIgPSBoZWxwZXJzW2ldKGNtLCBzdGFydCk7CiAgICAgIGlmIChjdXIpIHJldHVybiBjdXI7CiAgICB9CiAgfSk7CgogIHZhciBkZWZhdWx0T3B0aW9ucyA9IHsKICAgIHJhbmdlRmluZGVyOiBDb2RlTWlycm9yLmZvbGQuYXV0bywKICAgIHdpZGdldDogIlx1MjE5NCIsCiAgICBtaW5Gb2xkU2l6ZTogMCwKICAgIHNjYW5VcDogZmFsc2UKICB9OwoKICBDb2RlTWlycm9yLmRlZmluZU9wdGlvbigiZm9sZE9wdGlvbnMiLCBudWxsKTsKCiAgZnVuY3Rpb24gZ2V0T3B0aW9uKGNtLCBvcHRpb25zLCBuYW1lKSB7CiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zW25hbWVdICE9PSB1bmRlZmluZWQpCiAgICAgIHJldHVybiBvcHRpb25zW25hbWVdOwogICAgdmFyIGVkaXRvck9wdGlvbnMgPSBjbS5vcHRpb25zLmZvbGRPcHRpb25zOwogICAgaWYgKGVkaXRvck9wdGlvbnMgJiYgZWRpdG9yT3B0aW9uc1tuYW1lXSAhPT0gdW5kZWZpbmVkKQogICAgICByZXR1cm4gZWRpdG9yT3B0aW9uc1tuYW1lXTsKICAgIHJldHVybiBkZWZhdWx0T3B0aW9uc1tuYW1lXTsKICB9Cn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/fold/foldgutter.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LkNvZGVNaXJyb3ItZm9sZG1hcmtlciB7CiAgY29sb3I6IGJsdWU7CiAgdGV4dC1zaGFkb3c6ICNiOWYgMXB4IDFweCAycHgsICNiOWYgLTFweCAtMXB4IDJweCwgI2I5ZiAxcHggLTFweCAycHgsICNiOWYgLTFweCAxcHggMnB4OwogIGZvbnQtZmFtaWx5OiBhcmlhbDsKICBsaW5lLWhlaWdodDogLjM7CiAgY3Vyc29yOiBwb2ludGVyOwp9Ci5Db2RlTWlycm9yLWZvbGRndXR0ZXIgewogIHdpZHRoOiAuN2VtOwp9Ci5Db2RlTWlycm9yLWZvbGRndXR0ZXItb3BlbiwKLkNvZGVNaXJyb3ItZm9sZGd1dHRlci1mb2xkZWQgewogIGN1cnNvcjogcG9pbnRlcjsKfQouQ29kZU1pcnJvci1mb2xkZ3V0dGVyLW9wZW46YWZ0ZXIgewogIGNvbnRlbnQ6ICJcMjVCRSI7Cn0KLkNvZGVNaXJyb3ItZm9sZGd1dHRlci1mb2xkZWQ6YWZ0ZXIgewogIGNvbnRlbnQ6ICJcMjVCOCI7Cn0K]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/fold/foldgutter.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSwgcmVxdWlyZSgiLi9mb2xkY29kZSIpKTsKICBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCkgLy8gQU1ECiAgICBkZWZpbmUoWyIuLi8uLi9saWIvY29kZW1pcnJvciIsICIuL2ZvbGRjb2RlIl0sIG1vZCk7CiAgZWxzZSAvLyBQbGFpbiBicm93c2VyIGVudgogICAgbW9kKENvZGVNaXJyb3IpOwp9KShmdW5jdGlvbihDb2RlTWlycm9yKSB7CiAgInVzZSBzdHJpY3QiOwoKICBDb2RlTWlycm9yLmRlZmluZU9wdGlvbigiZm9sZEd1dHRlciIsIGZhbHNlLCBmdW5jdGlvbihjbSwgdmFsLCBvbGQpIHsKICAgIGlmIChvbGQgJiYgb2xkICE9IENvZGVNaXJyb3IuSW5pdCkgewogICAgICBjbS5jbGVhckd1dHRlcihjbS5zdGF0ZS5mb2xkR3V0dGVyLm9wdGlvbnMuZ3V0dGVyKTsKICAgICAgY20uc3RhdGUuZm9sZEd1dHRlciA9IG51bGw7CiAgICAgIGNtLm9mZigiZ3V0dGVyQ2xpY2siLCBvbkd1dHRlckNsaWNrKTsKICAgICAgY20ub2ZmKCJjaGFuZ2UiLCBvbkNoYW5nZSk7CiAgICAgIGNtLm9mZigidmlld3BvcnRDaGFuZ2UiLCBvblZpZXdwb3J0Q2hhbmdlKTsKICAgICAgY20ub2ZmKCJmb2xkIiwgb25Gb2xkKTsKICAgICAgY20ub2ZmKCJ1bmZvbGQiLCBvbkZvbGQpOwogICAgICBjbS5vZmYoInN3YXBEb2MiLCB1cGRhdGVJblZpZXdwb3J0KTsKICAgIH0KICAgIGlmICh2YWwpIHsKICAgICAgY20uc3RhdGUuZm9sZEd1dHRlciA9IG5ldyBTdGF0ZShwYXJzZU9wdGlvbnModmFsKSk7CiAgICAgIHVwZGF0ZUluVmlld3BvcnQoY20pOwogICAgICBjbS5vbigiZ3V0dGVyQ2xpY2siLCBvbkd1dHRlckNsaWNrKTsKICAgICAgY20ub24oImNoYW5nZSIsIG9uQ2hhbmdlKTsKICAgICAgY20ub24oInZpZXdwb3J0Q2hhbmdlIiwgb25WaWV3cG9ydENoYW5nZSk7CiAgICAgIGNtLm9uKCJmb2xkIiwgb25Gb2xkKTsKICAgICAgY20ub24oInVuZm9sZCIsIG9uRm9sZCk7CiAgICAgIGNtLm9uKCJzd2FwRG9jIiwgdXBkYXRlSW5WaWV3cG9ydCk7CiAgICB9CiAgfSk7CgogIHZhciBQb3MgPSBDb2RlTWlycm9yLlBvczsKCiAgZnVuY3Rpb24gU3RhdGUob3B0aW9ucykgewogICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKICAgIHRoaXMuZnJvbSA9IHRoaXMudG8gPSAwOwogIH0KCiAgZnVuY3Rpb24gcGFyc2VPcHRpb25zKG9wdHMpIHsKICAgIGlmIChvcHRzID09PSB0cnVlKSBvcHRzID0ge307CiAgICBpZiAob3B0cy5ndXR0ZXIgPT0gbnVsbCkgb3B0cy5ndXR0ZXIgPSAiQ29kZU1pcnJvci1mb2xkZ3V0dGVyIjsKICAgIGlmIChvcHRzLmluZGljYXRvck9wZW4gPT0gbnVsbCkgb3B0cy5pbmRpY2F0b3JPcGVuID0gIkNvZGVNaXJyb3ItZm9sZGd1dHRlci1vcGVuIjsKICAgIGlmIChvcHRzLmluZGljYXRvckZvbGRlZCA9PSBudWxsKSBvcHRzLmluZGljYXRvckZvbGRlZCA9ICJDb2RlTWlycm9yLWZvbGRndXR0ZXItZm9sZGVkIjsKICAgIHJldHVybiBvcHRzOwogIH0KCiAgZnVuY3Rpb24gaXNGb2xkZWQoY20sIGxpbmUpIHsKICAgIHZhciBtYXJrcyA9IGNtLmZpbmRNYXJrc0F0KFBvcyhsaW5lKSk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1hcmtzLmxlbmd0aDsgKytpKQogICAgICBpZiAobWFya3NbaV0uX19pc0ZvbGQgJiYgbWFya3NbaV0uZmluZCgpLmZyb20ubGluZSA9PSBsaW5lKSByZXR1cm4gdHJ1ZTsKICB9CgogIGZ1bmN0aW9uIG1hcmtlcihzcGVjKSB7CiAgICBpZiAodHlwZW9mIHNwZWMgPT0gInN0cmluZyIpIHsKICAgICAgdmFyIGVsdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgICBlbHQuY2xhc3NOYW1lID0gc3BlYyArICIgQ29kZU1pcnJvci1ndXR0ZXJtYXJrZXItc3VidGxlIjsKICAgICAgcmV0dXJuIGVsdDsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBzcGVjLmNsb25lTm9kZSh0cnVlKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHVwZGF0ZUZvbGRJbmZvKGNtLCBmcm9tLCB0bykgewogICAgdmFyIG9wdHMgPSBjbS5zdGF0ZS5mb2xkR3V0dGVyLm9wdGlvbnMsIGN1ciA9IGZyb207CiAgICBjbS5lYWNoTGluZShmcm9tLCB0bywgZnVuY3Rpb24obGluZSkgewogICAgICB2YXIgbWFyayA9IG51bGw7CiAgICAgIGlmIChpc0ZvbGRlZChjbSwgY3VyKSkgewogICAgICAgIG1hcmsgPSBtYXJrZXIob3B0cy5pbmRpY2F0b3JGb2xkZWQpOwogICAgICB9IGVsc2UgewogICAgICAgIHZhciBwb3MgPSBQb3MoY3VyLCAwKSwgZnVuYyA9IG9wdHMucmFuZ2VGaW5kZXIgfHwgQ29kZU1pcnJvci5mb2xkLmF1dG87CiAgICAgICAgdmFyIHJhbmdlID0gZnVuYyAmJiBmdW5jKGNtLCBwb3MpOwogICAgICAgIGlmIChyYW5nZSAmJiByYW5nZS5mcm9tLmxpbmUgKyAxIDwgcmFuZ2UudG8ubGluZSkKICAgICAgICAgIG1hcmsgPSBtYXJrZXIob3B0cy5pbmRpY2F0b3JPcGVuKTsKICAgICAgfQogICAgICBjbS5zZXRHdXR0ZXJNYXJrZXIobGluZSwgb3B0cy5ndXR0ZXIsIG1hcmspOwogICAgICArK2N1cjsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gdXBkYXRlSW5WaWV3cG9ydChjbSkgewogICAgdmFyIHZwID0gY20uZ2V0Vmlld3BvcnQoKSwgc3RhdGUgPSBjbS5zdGF0ZS5mb2xkR3V0dGVyOwogICAgaWYgKCFzdGF0ZSkgcmV0dXJuOwogICAgY20ub3BlcmF0aW9uKGZ1bmN0aW9uKCkgewogICAgICB1cGRhdGVGb2xkSW5mbyhjbSwgdnAuZnJvbSwgdnAudG8pOwogICAgfSk7CiAgICBzdGF0ZS5mcm9tID0gdnAuZnJvbTsgc3RhdGUudG8gPSB2cC50bzsKICB9CgogIGZ1bmN0aW9uIG9uR3V0dGVyQ2xpY2soY20sIGxpbmUsIGd1dHRlcikgewogICAgdmFyIG9wdHMgPSBjbS5zdGF0ZS5mb2xkR3V0dGVyLm9wdGlvbnM7CiAgICBpZiAoZ3V0dGVyICE9IG9wdHMuZ3V0dGVyKSByZXR1cm47CiAgICBjbS5mb2xkQ29kZShQb3MobGluZSwgMCksIG9wdHMucmFuZ2VGaW5kZXIpOwogIH0KCiAgZnVuY3Rpb24gb25DaGFuZ2UoY20pIHsKICAgIHZhciBzdGF0ZSA9IGNtLnN0YXRlLmZvbGRHdXR0ZXIsIG9wdHMgPSBjbS5zdGF0ZS5mb2xkR3V0dGVyLm9wdGlvbnM7CiAgICBzdGF0ZS5mcm9tID0gc3RhdGUudG8gPSAwOwogICAgY2xlYXJUaW1lb3V0KHN0YXRlLmNoYW5nZVVwZGF0ZSk7CiAgICBzdGF0ZS5jaGFuZ2VVcGRhdGUgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyB1cGRhdGVJblZpZXdwb3J0KGNtKTsgfSwgb3B0cy5mb2xkT25DaGFuZ2VUaW1lU3BhbiB8fCA2MDApOwogIH0KCiAgZnVuY3Rpb24gb25WaWV3cG9ydENoYW5nZShjbSkgewogICAgdmFyIHN0YXRlID0gY20uc3RhdGUuZm9sZEd1dHRlciwgb3B0cyA9IGNtLnN0YXRlLmZvbGRHdXR0ZXIub3B0aW9uczsKICAgIGNsZWFyVGltZW91dChzdGF0ZS5jaGFuZ2VVcGRhdGUpOwogICAgc3RhdGUuY2hhbmdlVXBkYXRlID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgdmFyIHZwID0gY20uZ2V0Vmlld3BvcnQoKTsKICAgICAgaWYgKHN0YXRlLmZyb20gPT0gc3RhdGUudG8gfHwgdnAuZnJvbSAtIHN0YXRlLnRvID4gMjAgfHwgc3RhdGUuZnJvbSAtIHZwLnRvID4gMjApIHsKICAgICAgICB1cGRhdGVJblZpZXdwb3J0KGNtKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjbS5vcGVyYXRpb24oZnVuY3Rpb24oKSB7CiAgICAgICAgICBpZiAodnAuZnJvbSA8IHN0YXRlLmZyb20pIHsKICAgICAgICAgICAgdXBkYXRlRm9sZEluZm8oY20sIHZwLmZyb20sIHN0YXRlLmZyb20pOwogICAgICAgICAgICBzdGF0ZS5mcm9tID0gdnAuZnJvbTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh2cC50byA+IHN0YXRlLnRvKSB7CiAgICAgICAgICAgIHVwZGF0ZUZvbGRJbmZvKGNtLCBzdGF0ZS50bywgdnAudG8pOwogICAgICAgICAgICBzdGF0ZS50byA9IHZwLnRvOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CiAgICB9LCBvcHRzLnVwZGF0ZVZpZXdwb3J0VGltZVNwYW4gfHwgNDAwKTsKICB9CgogIGZ1bmN0aW9uIG9uRm9sZChjbSwgZnJvbSkgewogICAgdmFyIHN0YXRlID0gY20uc3RhdGUuZm9sZEd1dHRlciwgbGluZSA9IGZyb20ubGluZTsKICAgIGlmIChsaW5lID49IHN0YXRlLmZyb20gJiYgbGluZSA8IHN0YXRlLnRvKQogICAgICB1cGRhdGVGb2xkSW5mbyhjbSwgbGluZSwgbGluZSArIDEpOwogIH0KfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/fold/indent-fold.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5yZWdpc3RlckhlbHBlcigiZm9sZCIsICJpbmRlbnQiLCBmdW5jdGlvbihjbSwgc3RhcnQpIHsKICB2YXIgdGFiU2l6ZSA9IGNtLmdldE9wdGlvbigidGFiU2l6ZSIpLCBmaXJzdExpbmUgPSBjbS5nZXRMaW5lKHN0YXJ0LmxpbmUpOwogIGlmICghL1xTLy50ZXN0KGZpcnN0TGluZSkpIHJldHVybjsKICB2YXIgZ2V0SW5kZW50ID0gZnVuY3Rpb24obGluZSkgewogICAgcmV0dXJuIENvZGVNaXJyb3IuY291bnRDb2x1bW4obGluZSwgbnVsbCwgdGFiU2l6ZSk7CiAgfTsKICB2YXIgbXlJbmRlbnQgPSBnZXRJbmRlbnQoZmlyc3RMaW5lKTsKICB2YXIgbGFzdExpbmVJbkZvbGQgPSBudWxsOwogIC8vIEdvIHRocm91Z2ggbGluZXMgdW50aWwgd2UgZmluZCBhIGxpbmUgdGhhdCBkZWZpbml0ZWx5IGRvZXNuJ3QgYmVsb25nIGluCiAgLy8gdGhlIGJsb2NrIHdlJ3JlIGZvbGRpbmcsIG9yIHRvIHRoZSBlbmQuCiAgZm9yICh2YXIgaSA9IHN0YXJ0LmxpbmUgKyAxLCBlbmQgPSBjbS5sYXN0TGluZSgpOyBpIDw9IGVuZDsgKytpKSB7CiAgICB2YXIgY3VyTGluZSA9IGNtLmdldExpbmUoaSk7CiAgICB2YXIgY3VySW5kZW50ID0gZ2V0SW5kZW50KGN1ckxpbmUpOwogICAgaWYgKGN1ckluZGVudCA+IG15SW5kZW50KSB7CiAgICAgIC8vIExpbmVzIHdpdGggYSBncmVhdGVyIGluZGVudCBhcmUgY29uc2lkZXJlZCBwYXJ0IG9mIHRoZSBibG9jay4KICAgICAgbGFzdExpbmVJbkZvbGQgPSBpOwogICAgfSBlbHNlIGlmICghL1xTLy50ZXN0KGN1ckxpbmUpKSB7CiAgICAgIC8vIEVtcHR5IGxpbmVzIG1pZ2h0IGJlIGJyZWFrcyB3aXRoaW4gdGhlIGJsb2NrIHdlJ3JlIHRyeWluZyB0byBmb2xkLgogICAgfSBlbHNlIHsKICAgICAgLy8gQSBub24tZW1wdHkgbGluZSBhdCBhbiBpbmRlbnQgZXF1YWwgdG8gb3IgbGVzcyB0aGFuIG91cnMgbWFya3MgdGhlCiAgICAgIC8vIHN0YXJ0IG9mIGFub3RoZXIgYmxvY2suCiAgICAgIGJyZWFrOwogICAgfQogIH0KICBpZiAobGFzdExpbmVJbkZvbGQpIHJldHVybiB7CiAgICBmcm9tOiBDb2RlTWlycm9yLlBvcyhzdGFydC5saW5lLCBmaXJzdExpbmUubGVuZ3RoKSwKICAgIHRvOiBDb2RlTWlycm9yLlBvcyhsYXN0TGluZUluRm9sZCwgY20uZ2V0TGluZShsYXN0TGluZUluRm9sZCkubGVuZ3RoKQogIH07Cn0pOwoKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/fold/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCEtLSBEVU1NWSBIVE1MIEZJTEUgLS0+]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/fold/markdown-fold.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5yZWdpc3RlckhlbHBlcigiZm9sZCIsICJtYXJrZG93biIsIGZ1bmN0aW9uKGNtLCBzdGFydCkgewogIHZhciBtYXhEZXB0aCA9IDEwMDsKCiAgZnVuY3Rpb24gaXNIZWFkZXIobGluZU5vKSB7CiAgICB2YXIgdG9rZW50eXBlID0gY20uZ2V0VG9rZW5UeXBlQXQoQ29kZU1pcnJvci5Qb3MobGluZU5vLCAwKSk7CiAgICByZXR1cm4gdG9rZW50eXBlICYmIC9cYmhlYWRlclxiLy50ZXN0KHRva2VudHlwZSk7CiAgfQoKICBmdW5jdGlvbiBoZWFkZXJMZXZlbChsaW5lTm8sIGxpbmUsIG5leHRMaW5lKSB7CiAgICB2YXIgbWF0Y2ggPSBsaW5lICYmIGxpbmUubWF0Y2goL14jKy8pOwogICAgaWYgKG1hdGNoICYmIGlzSGVhZGVyKGxpbmVObykpIHJldHVybiBtYXRjaFswXS5sZW5ndGg7CiAgICBtYXRjaCA9IG5leHRMaW5lICYmIG5leHRMaW5lLm1hdGNoKC9eWz1cLV0rXHMqJC8pOwogICAgaWYgKG1hdGNoICYmIGlzSGVhZGVyKGxpbmVObyArIDEpKSByZXR1cm4gbmV4dExpbmVbMF0gPT0gIj0iID8gMSA6IDI7CiAgICByZXR1cm4gbWF4RGVwdGg7CiAgfQoKICB2YXIgZmlyc3RMaW5lID0gY20uZ2V0TGluZShzdGFydC5saW5lKSwgbmV4dExpbmUgPSBjbS5nZXRMaW5lKHN0YXJ0LmxpbmUgKyAxKTsKICB2YXIgbGV2ZWwgPSBoZWFkZXJMZXZlbChzdGFydC5saW5lLCBmaXJzdExpbmUsIG5leHRMaW5lKTsKICBpZiAobGV2ZWwgPT09IG1heERlcHRoKSByZXR1cm4gdW5kZWZpbmVkOwoKICB2YXIgbGFzdExpbmVObyA9IGNtLmxhc3RMaW5lKCk7CiAgdmFyIGVuZCA9IHN0YXJ0LmxpbmUsIG5leHROZXh0TGluZSA9IGNtLmdldExpbmUoZW5kICsgMik7CiAgd2hpbGUgKGVuZCA8IGxhc3RMaW5lTm8pIHsKICAgIGlmIChoZWFkZXJMZXZlbChlbmQgKyAxLCBuZXh0TGluZSwgbmV4dE5leHRMaW5lKSA8PSBsZXZlbCkgYnJlYWs7CiAgICArK2VuZDsKICAgIG5leHRMaW5lID0gbmV4dE5leHRMaW5lOwogICAgbmV4dE5leHRMaW5lID0gY20uZ2V0TGluZShlbmQgKyAyKTsKICB9CgogIHJldHVybiB7CiAgICBmcm9tOiBDb2RlTWlycm9yLlBvcyhzdGFydC5saW5lLCBmaXJzdExpbmUubGVuZ3RoKSwKICAgIHRvOiBDb2RlTWlycm9yLlBvcyhlbmQsIGNtLmdldExpbmUoZW5kKS5sZW5ndGgpCiAgfTsKfSk7Cgp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/fold/xml-fold.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CgogIHZhciBQb3MgPSBDb2RlTWlycm9yLlBvczsKICBmdW5jdGlvbiBjbXAoYSwgYikgeyByZXR1cm4gYS5saW5lIC0gYi5saW5lIHx8IGEuY2ggLSBiLmNoOyB9CgogIHZhciBuYW1lU3RhcnRDaGFyID0gIkEtWl9hLXpcXHUwMEMwLVxcdTAwRDZcXHUwMEQ4LVxcdTAwRjZcXHUwMEY4LVxcdTAyRkZcXHUwMzcwLVxcdTAzN0RcXHUwMzdGLVxcdTFGRkZcXHUyMDBDLVxcdTIwMERcXHUyMDcwLVxcdTIxOEZcXHUyQzAwLVxcdTJGRUZcXHUzMDAxLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRkQiOwogIHZhciBuYW1lQ2hhciA9IG5hbWVTdGFydENoYXIgKyAiXC1cOlwuMC05XFx1MDBCN1xcdTAzMDAtXFx1MDM2RlxcdTIwM0YtXFx1MjA0MCI7CiAgdmFyIHhtbFRhZ1N0YXJ0ID0gbmV3IFJlZ0V4cCgiPCgvPykoWyIgKyBuYW1lU3RhcnRDaGFyICsgIl1bIiArIG5hbWVDaGFyICsgIl0qKSIsICJnIik7CgogIGZ1bmN0aW9uIEl0ZXIoY20sIGxpbmUsIGNoLCByYW5nZSkgewogICAgdGhpcy5saW5lID0gbGluZTsgdGhpcy5jaCA9IGNoOwogICAgdGhpcy5jbSA9IGNtOyB0aGlzLnRleHQgPSBjbS5nZXRMaW5lKGxpbmUpOwogICAgdGhpcy5taW4gPSByYW5nZSA/IHJhbmdlLmZyb20gOiBjbS5maXJzdExpbmUoKTsKICAgIHRoaXMubWF4ID0gcmFuZ2UgPyByYW5nZS50byAtIDEgOiBjbS5sYXN0TGluZSgpOwogIH0KCiAgZnVuY3Rpb24gdGFnQXQoaXRlciwgY2gpIHsKICAgIHZhciB0eXBlID0gaXRlci5jbS5nZXRUb2tlblR5cGVBdChQb3MoaXRlci5saW5lLCBjaCkpOwogICAgcmV0dXJuIHR5cGUgJiYgL1xidGFnXGIvLnRlc3QodHlwZSk7CiAgfQoKICBmdW5jdGlvbiBuZXh0TGluZShpdGVyKSB7CiAgICBpZiAoaXRlci5saW5lID49IGl0ZXIubWF4KSByZXR1cm47CiAgICBpdGVyLmNoID0gMDsKICAgIGl0ZXIudGV4dCA9IGl0ZXIuY20uZ2V0TGluZSgrK2l0ZXIubGluZSk7CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgZnVuY3Rpb24gcHJldkxpbmUoaXRlcikgewogICAgaWYgKGl0ZXIubGluZSA8PSBpdGVyLm1pbikgcmV0dXJuOwogICAgaXRlci50ZXh0ID0gaXRlci5jbS5nZXRMaW5lKC0taXRlci5saW5lKTsKICAgIGl0ZXIuY2ggPSBpdGVyLnRleHQubGVuZ3RoOwogICAgcmV0dXJuIHRydWU7CiAgfQoKICBmdW5jdGlvbiB0b1RhZ0VuZChpdGVyKSB7CiAgICBmb3IgKDs7KSB7CiAgICAgIHZhciBndCA9IGl0ZXIudGV4dC5pbmRleE9mKCI+IiwgaXRlci5jaCk7CiAgICAgIGlmIChndCA9PSAtMSkgeyBpZiAobmV4dExpbmUoaXRlcikpIGNvbnRpbnVlOyBlbHNlIHJldHVybjsgfQogICAgICBpZiAoIXRhZ0F0KGl0ZXIsIGd0ICsgMSkpIHsgaXRlci5jaCA9IGd0ICsgMTsgY29udGludWU7IH0KICAgICAgdmFyIGxhc3RTbGFzaCA9IGl0ZXIudGV4dC5sYXN0SW5kZXhPZigiLyIsIGd0KTsKICAgICAgdmFyIHNlbGZDbG9zZSA9IGxhc3RTbGFzaCA+IC0xICYmICEvXFMvLnRlc3QoaXRlci50ZXh0LnNsaWNlKGxhc3RTbGFzaCArIDEsIGd0KSk7CiAgICAgIGl0ZXIuY2ggPSBndCArIDE7CiAgICAgIHJldHVybiBzZWxmQ2xvc2UgPyAic2VsZkNsb3NlIiA6ICJyZWd1bGFyIjsKICAgIH0KICB9CiAgZnVuY3Rpb24gdG9UYWdTdGFydChpdGVyKSB7CiAgICBmb3IgKDs7KSB7CiAgICAgIHZhciBsdCA9IGl0ZXIuY2ggPyBpdGVyLnRleHQubGFzdEluZGV4T2YoIjwiLCBpdGVyLmNoIC0gMSkgOiAtMTsKICAgICAgaWYgKGx0ID09IC0xKSB7IGlmIChwcmV2TGluZShpdGVyKSkgY29udGludWU7IGVsc2UgcmV0dXJuOyB9CiAgICAgIGlmICghdGFnQXQoaXRlciwgbHQgKyAxKSkgeyBpdGVyLmNoID0gbHQ7IGNvbnRpbnVlOyB9CiAgICAgIHhtbFRhZ1N0YXJ0Lmxhc3RJbmRleCA9IGx0OwogICAgICBpdGVyLmNoID0gbHQ7CiAgICAgIHZhciBtYXRjaCA9IHhtbFRhZ1N0YXJ0LmV4ZWMoaXRlci50ZXh0KTsKICAgICAgaWYgKG1hdGNoICYmIG1hdGNoLmluZGV4ID09IGx0KSByZXR1cm4gbWF0Y2g7CiAgICB9CiAgfQoKICBmdW5jdGlvbiB0b05leHRUYWcoaXRlcikgewogICAgZm9yICg7OykgewogICAgICB4bWxUYWdTdGFydC5sYXN0SW5kZXggPSBpdGVyLmNoOwogICAgICB2YXIgZm91bmQgPSB4bWxUYWdTdGFydC5leGVjKGl0ZXIudGV4dCk7CiAgICAgIGlmICghZm91bmQpIHsgaWYgKG5leHRMaW5lKGl0ZXIpKSBjb250aW51ZTsgZWxzZSByZXR1cm47IH0KICAgICAgaWYgKCF0YWdBdChpdGVyLCBmb3VuZC5pbmRleCArIDEpKSB7IGl0ZXIuY2ggPSBmb3VuZC5pbmRleCArIDE7IGNvbnRpbnVlOyB9CiAgICAgIGl0ZXIuY2ggPSBmb3VuZC5pbmRleCArIGZvdW5kWzBdLmxlbmd0aDsKICAgICAgcmV0dXJuIGZvdW5kOwogICAgfQogIH0KICBmdW5jdGlvbiB0b1ByZXZUYWcoaXRlcikgewogICAgZm9yICg7OykgewogICAgICB2YXIgZ3QgPSBpdGVyLmNoID8gaXRlci50ZXh0Lmxhc3RJbmRleE9mKCI+IiwgaXRlci5jaCAtIDEpIDogLTE7CiAgICAgIGlmIChndCA9PSAtMSkgeyBpZiAocHJldkxpbmUoaXRlcikpIGNvbnRpbnVlOyBlbHNlIHJldHVybjsgfQogICAgICBpZiAoIXRhZ0F0KGl0ZXIsIGd0ICsgMSkpIHsgaXRlci5jaCA9IGd0OyBjb250aW51ZTsgfQogICAgICB2YXIgbGFzdFNsYXNoID0gaXRlci50ZXh0Lmxhc3RJbmRleE9mKCIvIiwgZ3QpOwogICAgICB2YXIgc2VsZkNsb3NlID0gbGFzdFNsYXNoID4gLTEgJiYgIS9cUy8udGVzdChpdGVyLnRleHQuc2xpY2UobGFzdFNsYXNoICsgMSwgZ3QpKTsKICAgICAgaXRlci5jaCA9IGd0ICsgMTsKICAgICAgcmV0dXJuIHNlbGZDbG9zZSA/ICJzZWxmQ2xvc2UiIDogInJlZ3VsYXIiOwogICAgfQogIH0KCiAgZnVuY3Rpb24gZmluZE1hdGNoaW5nQ2xvc2UoaXRlciwgdGFnKSB7CiAgICB2YXIgc3RhY2sgPSBbXTsKICAgIGZvciAoOzspIHsKICAgICAgdmFyIG5leHQgPSB0b05leHRUYWcoaXRlciksIGVuZCwgc3RhcnRMaW5lID0gaXRlci5saW5lLCBzdGFydENoID0gaXRlci5jaCAtIChuZXh0ID8gbmV4dFswXS5sZW5ndGggOiAwKTsKICAgICAgaWYgKCFuZXh0IHx8ICEoZW5kID0gdG9UYWdFbmQoaXRlcikpKSByZXR1cm47CiAgICAgIGlmIChlbmQgPT0gInNlbGZDbG9zZSIpIGNvbnRpbnVlOwogICAgICBpZiAobmV4dFsxXSkgeyAvLyBjbG9zaW5nIHRhZwogICAgICAgIGZvciAodmFyIGkgPSBzdGFjay5sZW5ndGggLSAxOyBpID49IDA7IC0taSkgaWYgKHN0YWNrW2ldID09IG5leHRbMl0pIHsKICAgICAgICAgIHN0YWNrLmxlbmd0aCA9IGk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgaWYgKGkgPCAwICYmICghdGFnIHx8IHRhZyA9PSBuZXh0WzJdKSkgcmV0dXJuIHsKICAgICAgICAgIHRhZzogbmV4dFsyXSwKICAgICAgICAgIGZyb206IFBvcyhzdGFydExpbmUsIHN0YXJ0Q2gpLAogICAgICAgICAgdG86IFBvcyhpdGVyLmxpbmUsIGl0ZXIuY2gpCiAgICAgICAgfTsKICAgICAgfSBlbHNlIHsgLy8gb3BlbmluZyB0YWcKICAgICAgICBzdGFjay5wdXNoKG5leHRbMl0pOwogICAgICB9CiAgICB9CiAgfQogIGZ1bmN0aW9uIGZpbmRNYXRjaGluZ09wZW4oaXRlciwgdGFnKSB7CiAgICB2YXIgc3RhY2sgPSBbXTsKICAgIGZvciAoOzspIHsKICAgICAgdmFyIHByZXYgPSB0b1ByZXZUYWcoaXRlcik7CiAgICAgIGlmICghcHJldikgcmV0dXJuOwogICAgICBpZiAocHJldiA9PSAic2VsZkNsb3NlIikgeyB0b1RhZ1N0YXJ0KGl0ZXIpOyBjb250aW51ZTsgfQogICAgICB2YXIgZW5kTGluZSA9IGl0ZXIubGluZSwgZW5kQ2ggPSBpdGVyLmNoOwogICAgICB2YXIgc3RhcnQgPSB0b1RhZ1N0YXJ0KGl0ZXIpOwogICAgICBpZiAoIXN0YXJ0KSByZXR1cm47CiAgICAgIGlmIChzdGFydFsxXSkgeyAvLyBjbG9zaW5nIHRhZwogICAgICAgIHN0YWNrLnB1c2goc3RhcnRbMl0pOwogICAgICB9IGVsc2UgeyAvLyBvcGVuaW5nIHRhZwogICAgICAgIGZvciAodmFyIGkgPSBzdGFjay5sZW5ndGggLSAxOyBpID49IDA7IC0taSkgaWYgKHN0YWNrW2ldID09IHN0YXJ0WzJdKSB7CiAgICAgICAgICBzdGFjay5sZW5ndGggPSBpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmIChpIDwgMCAmJiAoIXRhZyB8fCB0YWcgPT0gc3RhcnRbMl0pKSByZXR1cm4gewogICAgICAgICAgdGFnOiBzdGFydFsyXSwKICAgICAgICAgIGZyb206IFBvcyhpdGVyLmxpbmUsIGl0ZXIuY2gpLAogICAgICAgICAgdG86IFBvcyhlbmRMaW5lLCBlbmRDaCkKICAgICAgICB9OwogICAgICB9CiAgICB9CiAgfQoKICBDb2RlTWlycm9yLnJlZ2lzdGVySGVscGVyKCJmb2xkIiwgInhtbCIsIGZ1bmN0aW9uKGNtLCBzdGFydCkgewogICAgdmFyIGl0ZXIgPSBuZXcgSXRlcihjbSwgc3RhcnQubGluZSwgMCk7CiAgICBmb3IgKDs7KSB7CiAgICAgIHZhciBvcGVuVGFnID0gdG9OZXh0VGFnKGl0ZXIpLCBlbmQ7CiAgICAgIGlmICghb3BlblRhZyB8fCBpdGVyLmxpbmUgIT0gc3RhcnQubGluZSB8fCAhKGVuZCA9IHRvVGFnRW5kKGl0ZXIpKSkgcmV0dXJuOwogICAgICBpZiAoIW9wZW5UYWdbMV0gJiYgZW5kICE9ICJzZWxmQ2xvc2UiKSB7CiAgICAgICAgdmFyIHN0YXJ0ID0gUG9zKGl0ZXIubGluZSwgaXRlci5jaCk7CiAgICAgICAgdmFyIGNsb3NlID0gZmluZE1hdGNoaW5nQ2xvc2UoaXRlciwgb3BlblRhZ1syXSk7CiAgICAgICAgcmV0dXJuIGNsb3NlICYmIHtmcm9tOiBzdGFydCwgdG86IGNsb3NlLmZyb219OwogICAgICB9CiAgICB9CiAgfSk7CiAgQ29kZU1pcnJvci5maW5kTWF0Y2hpbmdUYWcgPSBmdW5jdGlvbihjbSwgcG9zLCByYW5nZSkgewogICAgdmFyIGl0ZXIgPSBuZXcgSXRlcihjbSwgcG9zLmxpbmUsIHBvcy5jaCwgcmFuZ2UpOwogICAgaWYgKGl0ZXIudGV4dC5pbmRleE9mKCI+IikgPT0gLTEgJiYgaXRlci50ZXh0LmluZGV4T2YoIjwiKSA9PSAtMSkgcmV0dXJuOwogICAgdmFyIGVuZCA9IHRvVGFnRW5kKGl0ZXIpLCB0byA9IGVuZCAmJiBQb3MoaXRlci5saW5lLCBpdGVyLmNoKTsKICAgIHZhciBzdGFydCA9IGVuZCAmJiB0b1RhZ1N0YXJ0KGl0ZXIpOwogICAgaWYgKCFlbmQgfHwgZW5kID09ICJzZWxmQ2xvc2UiIHx8ICFzdGFydCB8fCBjbXAoaXRlciwgcG9zKSA+IDApIHJldHVybjsKICAgIHZhciBoZXJlID0ge2Zyb206IFBvcyhpdGVyLmxpbmUsIGl0ZXIuY2gpLCB0bzogdG8sIHRhZzogc3RhcnRbMl19OwoKICAgIGlmIChzdGFydFsxXSkgeyAvLyBjbG9zaW5nIHRhZwogICAgICByZXR1cm4ge29wZW46IGZpbmRNYXRjaGluZ09wZW4oaXRlciwgc3RhcnRbMl0pLCBjbG9zZTogaGVyZSwgYXQ6ICJjbG9zZSJ9OwogICAgfSBlbHNlIHsgLy8gb3BlbmluZyB0YWcKICAgICAgaXRlciA9IG5ldyBJdGVyKGNtLCB0by5saW5lLCB0by5jaCwgcmFuZ2UpOwogICAgICByZXR1cm4ge29wZW46IGhlcmUsIGNsb3NlOiBmaW5kTWF0Y2hpbmdDbG9zZShpdGVyLCBzdGFydFsyXSksIGF0OiAib3BlbiJ9OwogICAgfQogIH07CgogIENvZGVNaXJyb3IuZmluZEVuY2xvc2luZ1RhZyA9IGZ1bmN0aW9uKGNtLCBwb3MsIHJhbmdlKSB7CiAgICB2YXIgaXRlciA9IG5ldyBJdGVyKGNtLCBwb3MubGluZSwgcG9zLmNoLCByYW5nZSk7CiAgICBmb3IgKDs7KSB7CiAgICAgIHZhciBvcGVuID0gZmluZE1hdGNoaW5nT3BlbihpdGVyKTsKICAgICAgaWYgKCFvcGVuKSBicmVhazsKICAgICAgdmFyIGZvcndhcmQgPSBuZXcgSXRlcihjbSwgcG9zLmxpbmUsIHBvcy5jaCwgcmFuZ2UpOwogICAgICB2YXIgY2xvc2UgPSBmaW5kTWF0Y2hpbmdDbG9zZShmb3J3YXJkLCBvcGVuLnRhZyk7CiAgICAgIGlmIChjbG9zZSkgcmV0dXJuIHtvcGVuOiBvcGVuLCBjbG9zZTogY2xvc2V9OwogICAgfQogIH07CgogIC8vIFVzZWQgYnkgYWRkb24vZWRpdC9jbG9zZXRhZy5qcwogIENvZGVNaXJyb3Iuc2NhbkZvckNsb3NpbmdUYWcgPSBmdW5jdGlvbihjbSwgcG9zLCBuYW1lLCBlbmQpIHsKICAgIHZhciBpdGVyID0gbmV3IEl0ZXIoY20sIHBvcy5saW5lLCBwb3MuY2gsIGVuZCA/IHtmcm9tOiAwLCB0bzogZW5kfSA6IG51bGwpOwogICAgcmV0dXJuIGZpbmRNYXRjaGluZ0Nsb3NlKGl0ZXIsIG5hbWUpOwogIH07Cn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/hint/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/hint/anyword-hint.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CgogIHZhciBXT1JEID0gL1tcdyRdKy8sIFJBTkdFID0gNTAwOwoKICBDb2RlTWlycm9yLnJlZ2lzdGVySGVscGVyKCJoaW50IiwgImFueXdvcmQiLCBmdW5jdGlvbihlZGl0b3IsIG9wdGlvbnMpIHsKICAgIHZhciB3b3JkID0gb3B0aW9ucyAmJiBvcHRpb25zLndvcmQgfHwgV09SRDsKICAgIHZhciByYW5nZSA9IG9wdGlvbnMgJiYgb3B0aW9ucy5yYW5nZSB8fCBSQU5HRTsKICAgIHZhciBjdXIgPSBlZGl0b3IuZ2V0Q3Vyc29yKCksIGN1ckxpbmUgPSBlZGl0b3IuZ2V0TGluZShjdXIubGluZSk7CiAgICB2YXIgc3RhcnQgPSBjdXIuY2gsIGVuZCA9IHN0YXJ0OwogICAgd2hpbGUgKGVuZCA8IGN1ckxpbmUubGVuZ3RoICYmIHdvcmQudGVzdChjdXJMaW5lLmNoYXJBdChlbmQpKSkgKytlbmQ7CiAgICB3aGlsZSAoc3RhcnQgJiYgd29yZC50ZXN0KGN1ckxpbmUuY2hhckF0KHN0YXJ0IC0gMSkpKSAtLXN0YXJ0OwogICAgdmFyIGN1cldvcmQgPSBzdGFydCAhPSBlbmQgJiYgY3VyTGluZS5zbGljZShzdGFydCwgZW5kKTsKCiAgICB2YXIgbGlzdCA9IFtdLCBzZWVuID0ge307CiAgICB2YXIgcmUgPSBuZXcgUmVnRXhwKHdvcmQuc291cmNlLCAiZyIpOwogICAgZm9yICh2YXIgZGlyID0gLTE7IGRpciA8PSAxOyBkaXIgKz0gMikgewogICAgICB2YXIgbGluZSA9IGN1ci5saW5lLCBlbmRMaW5lID0gTWF0aC5taW4oTWF0aC5tYXgobGluZSArIGRpciAqIHJhbmdlLCBlZGl0b3IuZmlyc3RMaW5lKCkpLCBlZGl0b3IubGFzdExpbmUoKSkgKyBkaXI7CiAgICAgIGZvciAoOyBsaW5lICE9IGVuZExpbmU7IGxpbmUgKz0gZGlyKSB7CiAgICAgICAgdmFyIHRleHQgPSBlZGl0b3IuZ2V0TGluZShsaW5lKSwgbTsKICAgICAgICB3aGlsZSAobSA9IHJlLmV4ZWModGV4dCkpIHsKICAgICAgICAgIGlmIChsaW5lID09IGN1ci5saW5lICYmIG1bMF0gPT09IGN1cldvcmQpIGNvbnRpbnVlOwogICAgICAgICAgaWYgKCghY3VyV29yZCB8fCBtWzBdLmxhc3RJbmRleE9mKGN1cldvcmQsIDApID09IDApICYmICFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoc2VlbiwgbVswXSkpIHsKICAgICAgICAgICAgc2VlblttWzBdXSA9IHRydWU7CiAgICAgICAgICAgIGxpc3QucHVzaChtWzBdKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB7bGlzdDogbGlzdCwgZnJvbTogQ29kZU1pcnJvci5Qb3MoY3VyLmxpbmUsIHN0YXJ0KSwgdG86IENvZGVNaXJyb3IuUG9zKGN1ci5saW5lLCBlbmQpfTsKICB9KTsKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/hint/css-hint.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSwgcmVxdWlyZSgiLi4vLi4vbW9kZS9jc3MvY3NzIikpOwogIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kKSAvLyBBTUQKICAgIGRlZmluZShbIi4uLy4uL2xpYi9jb2RlbWlycm9yIiwgIi4uLy4uL21vZGUvY3NzL2NzcyJdLCBtb2QpOwogIGVsc2UgLy8gUGxhaW4gYnJvd3NlciBlbnYKICAgIG1vZChDb2RlTWlycm9yKTsKfSkoZnVuY3Rpb24oQ29kZU1pcnJvcikgewogICJ1c2Ugc3RyaWN0IjsKCiAgdmFyIHBzZXVkb0NsYXNzZXMgPSB7bGluazogMSwgdmlzaXRlZDogMSwgYWN0aXZlOiAxLCBob3ZlcjogMSwgZm9jdXM6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgImZpcnN0LWxldHRlciI6IDEsICJmaXJzdC1saW5lIjogMSwgImZpcnN0LWNoaWxkIjogMSwKICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmU6IDEsIGFmdGVyOiAxLCBsYW5nOiAxfTsKCiAgQ29kZU1pcnJvci5yZWdpc3RlckhlbHBlcigiaGludCIsICJjc3MiLCBmdW5jdGlvbihjbSkgewogICAgdmFyIGN1ciA9IGNtLmdldEN1cnNvcigpLCB0b2tlbiA9IGNtLmdldFRva2VuQXQoY3VyKTsKICAgIHZhciBpbm5lciA9IENvZGVNaXJyb3IuaW5uZXJNb2RlKGNtLmdldE1vZGUoKSwgdG9rZW4uc3RhdGUpOwogICAgaWYgKGlubmVyLm1vZGUubmFtZSAhPSAiY3NzIikgcmV0dXJuOwoKICAgIHZhciB3b3JkID0gdG9rZW4uc3RyaW5nLCBzdGFydCA9IHRva2VuLnN0YXJ0LCBlbmQgPSB0b2tlbi5lbmQ7CiAgICBpZiAoL1teXHckXy1dLy50ZXN0KHdvcmQpKSB7CiAgICAgIHdvcmQgPSAiIjsgc3RhcnQgPSBlbmQgPSBjdXIuY2g7CiAgICB9CgogICAgdmFyIHNwZWMgPSBDb2RlTWlycm9yLnJlc29sdmVNb2RlKCJ0ZXh0L2NzcyIpOwoKICAgIHZhciByZXN1bHQgPSBbXTsKICAgIGZ1bmN0aW9uIGFkZChrZXl3b3JkcykgewogICAgICBmb3IgKHZhciBuYW1lIGluIGtleXdvcmRzKQogICAgICAgIGlmICghd29yZCB8fCBuYW1lLmxhc3RJbmRleE9mKHdvcmQsIDApID09IDApCiAgICAgICAgICByZXN1bHQucHVzaChuYW1lKTsKICAgIH0KCiAgICB2YXIgc3QgPSBpbm5lci5zdGF0ZS5zdGF0ZTsKICAgIGlmIChzdCA9PSAicHNldWRvIiB8fCB0b2tlbi50eXBlID09ICJ2YXJpYWJsZS0zIikgewogICAgICBhZGQocHNldWRvQ2xhc3Nlcyk7CiAgICB9IGVsc2UgaWYgKHN0ID09ICJibG9jayIgfHwgc3QgPT0gIm1heWJlcHJvcCIpIHsKICAgICAgYWRkKHNwZWMucHJvcGVydHlLZXl3b3Jkcyk7CiAgICB9IGVsc2UgaWYgKHN0ID09ICJwcm9wIiB8fCBzdCA9PSAicGFyZW5zIiB8fCBzdCA9PSAiYXQiIHx8IHN0ID09ICJwYXJhbXMiKSB7CiAgICAgIGFkZChzcGVjLnZhbHVlS2V5d29yZHMpOwogICAgICBhZGQoc3BlYy5jb2xvcktleXdvcmRzKTsKICAgIH0gZWxzZSBpZiAoc3QgPT0gIm1lZGlhIiB8fCBzdCA9PSAibWVkaWFfcGFyZW5zIikgewogICAgICBhZGQoc3BlYy5tZWRpYVR5cGVzKTsKICAgICAgYWRkKHNwZWMubWVkaWFGZWF0dXJlcyk7CiAgICB9CgogICAgaWYgKHJlc3VsdC5sZW5ndGgpIHJldHVybiB7CiAgICAgIGxpc3Q6IHJlc3VsdCwKICAgICAgZnJvbTogQ29kZU1pcnJvci5Qb3MoY3VyLmxpbmUsIHN0YXJ0KSwKICAgICAgdG86IENvZGVNaXJyb3IuUG9zKGN1ci5saW5lLCBlbmQpCiAgICB9OwogIH0pOwp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/hint/html-hint.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CgogIHZhciBsYW5ncyA9ICJhYiBhYSBhZiBhayBzcSBhbSBhciBhbiBoeSBhcyBhdiBhZSBheSBheiBibSBiYSBldSBiZSBibiBiaCBiaSBicyBiciBiZyBteSBjYSBjaCBjZSBueSB6aCBjdiBrdyBjbyBjciBociBjcyBkYSBkdiBubCBkeiBlbiBlbyBldCBlZSBmbyBmaiBmaSBmciBmZiBnbCBrYSBkZSBlbCBnbiBndSBodCBoYSBoZSBoeiBoaSBobyBodSBpYSBpZCBpZSBnYSBpZyBpayBpbyBpcyBpdCBpdSBqYSBqdiBrbCBrbiBrciBrcyBrayBrbSBraSBydyBreSBrdiBrZyBrbyBrdSBraiBsYSBsYiBsZyBsaSBsbiBsbyBsdCBsdSBsdiBndiBtayBtZyBtcyBtbCBtdCBtaSBtciBtaCBtbiBuYSBudiBuYiBuZCBuZSBuZyBubiBubyBpaSBuciBvYyBvaiBjdSBvbSBvciBvcyBwYSBwaSBmYSBwbCBwcyBwdCBxdSBybSBybiBybyBydSBzYSBzYyBzZCBzZSBzbSBzZyBzciBnZCBzbiBzaSBzayBzbCBzbyBzdCBlcyBzdSBzdyBzcyBzdiB0YSB0ZSB0ZyB0aCB0aSBibyB0ayB0bCB0biB0byB0ciB0cyB0dCB0dyB0eSB1ZyB1ayB1ciB1eiB2ZSB2aSB2byB3YSBjeSB3byBmeSB4aCB5aSB5byB6YSB6dSIuc3BsaXQoIiAiKTsKICB2YXIgdGFyZ2V0cyA9IFsiX2JsYW5rIiwgIl9zZWxmIiwgIl90b3AiLCAiX3BhcmVudCJdOwogIHZhciBjaGFyc2V0cyA9IFsiYXNjaWkiLCAidXRmLTgiLCAidXRmLTE2IiwgImxhdGluMSIsICJsYXRpbjEiXTsKICB2YXIgbWV0aG9kcyA9IFsiZ2V0IiwgInBvc3QiLCAicHV0IiwgImRlbGV0ZSJdOwogIHZhciBlbmNzID0gWyJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiLCAibXVsdGlwYXJ0L2Zvcm0tZGF0YSIsICJ0ZXh0L3BsYWluIl07CiAgdmFyIG1lZGlhID0gWyJhbGwiLCAic2NyZWVuIiwgInByaW50IiwgImVtYm9zc2VkIiwgImJyYWlsbGUiLCAiaGFuZGhlbGQiLCAicHJpbnQiLCAicHJvamVjdGlvbiIsICJzY3JlZW4iLCAidHR5IiwgInR2IiwgInNwZWVjaCIsCiAgICAgICAgICAgICAgICIzZC1nbGFzc2VzIiwgInJlc29sdXRpb24gWz5dWzxdWz1dIFtYXSIsICJkZXZpY2UtYXNwZWN0LXJhdGlvOiBYL1kiLCAib3JpZW50YXRpb246cG9ydHJhaXQiLAogICAgICAgICAgICAgICAib3JpZW50YXRpb246bGFuZHNjYXBlIiwgImRldmljZS1oZWlnaHQ6IFtYXSIsICJkZXZpY2Utd2lkdGg6IFtYXSJdOwogIHZhciBzID0geyBhdHRyczoge30gfTsgLy8gU2ltcGxlIHRhZywgcmV1c2VkIGZvciBhIHdob2xlIGxvdCBvZiB0YWdzCgogIHZhciBkYXRhID0gewogICAgYTogewogICAgICBhdHRyczogewogICAgICAgIGhyZWY6IG51bGwsIHBpbmc6IG51bGwsIHR5cGU6IG51bGwsCiAgICAgICAgbWVkaWE6IG1lZGlhLAogICAgICAgIHRhcmdldDogdGFyZ2V0cywKICAgICAgICBocmVmbGFuZzogbGFuZ3MKICAgICAgfQogICAgfSwKICAgIGFiYnI6IHMsCiAgICBhY3JvbnltOiBzLAogICAgYWRkcmVzczogcywKICAgIGFwcGxldDogcywKICAgIGFyZWE6IHsKICAgICAgYXR0cnM6IHsKICAgICAgICBhbHQ6IG51bGwsIGNvb3JkczogbnVsbCwgaHJlZjogbnVsbCwgdGFyZ2V0OiBudWxsLCBwaW5nOiBudWxsLAogICAgICAgIG1lZGlhOiBtZWRpYSwgaHJlZmxhbmc6IGxhbmdzLCB0eXBlOiBudWxsLAogICAgICAgIHNoYXBlOiBbImRlZmF1bHQiLCAicmVjdCIsICJjaXJjbGUiLCAicG9seSJdCiAgICAgIH0KICAgIH0sCiAgICBhcnRpY2xlOiBzLAogICAgYXNpZGU6IHMsCiAgICBhdWRpbzogewogICAgICBhdHRyczogewogICAgICAgIHNyYzogbnVsbCwgbWVkaWFncm91cDogbnVsbCwKICAgICAgICBjcm9zc29yaWdpbjogWyJhbm9ueW1vdXMiLCAidXNlLWNyZWRlbnRpYWxzIl0sCiAgICAgICAgcHJlbG9hZDogWyJub25lIiwgIm1ldGFkYXRhIiwgImF1dG8iXSwKICAgICAgICBhdXRvcGxheTogWyIiLCAiYXV0b3BsYXkiXSwKICAgICAgICBsb29wOiBbIiIsICJsb29wIl0sCiAgICAgICAgY29udHJvbHM6IFsiIiwgImNvbnRyb2xzIl0KICAgICAgfQogICAgfSwKICAgIGI6IHMsCiAgICBiYXNlOiB7IGF0dHJzOiB7IGhyZWY6IG51bGwsIHRhcmdldDogdGFyZ2V0cyB9IH0sCiAgICBiYXNlZm9udDogcywKICAgIGJkaTogcywKICAgIGJkbzogcywKICAgIGJpZzogcywKICAgIGJsb2NrcXVvdGU6IHsgYXR0cnM6IHsgY2l0ZTogbnVsbCB9IH0sCiAgICBib2R5OiBzLAogICAgYnI6IHMsCiAgICBidXR0b246IHsKICAgICAgYXR0cnM6IHsKICAgICAgICBmb3JtOiBudWxsLCBmb3JtYWN0aW9uOiBudWxsLCBuYW1lOiBudWxsLCB2YWx1ZTogbnVsbCwKICAgICAgICBhdXRvZm9jdXM6IFsiIiwgImF1dG9mb2N1cyJdLAogICAgICAgIGRpc2FibGVkOiBbIiIsICJhdXRvZm9jdXMiXSwKICAgICAgICBmb3JtZW5jdHlwZTogZW5jcywKICAgICAgICBmb3JtbWV0aG9kOiBtZXRob2RzLAogICAgICAgIGZvcm1ub3ZhbGlkYXRlOiBbIiIsICJub3ZhbGlkYXRlIl0sCiAgICAgICAgZm9ybXRhcmdldDogdGFyZ2V0cywKICAgICAgICB0eXBlOiBbInN1Ym1pdCIsICJyZXNldCIsICJidXR0b24iXQogICAgICB9CiAgICB9LAogICAgY2FudmFzOiB7IGF0dHJzOiB7IHdpZHRoOiBudWxsLCBoZWlnaHQ6IG51bGwgfSB9LAogICAgY2FwdGlvbjogcywKICAgIGNlbnRlcjogcywKICAgIGNpdGU6IHMsCiAgICBjb2RlOiBzLAogICAgY29sOiB7IGF0dHJzOiB7IHNwYW46IG51bGwgfSB9LAogICAgY29sZ3JvdXA6IHsgYXR0cnM6IHsgc3BhbjogbnVsbCB9IH0sCiAgICBjb21tYW5kOiB7CiAgICAgIGF0dHJzOiB7CiAgICAgICAgdHlwZTogWyJjb21tYW5kIiwgImNoZWNrYm94IiwgInJhZGlvIl0sCiAgICAgICAgbGFiZWw6IG51bGwsIGljb246IG51bGwsIHJhZGlvZ3JvdXA6IG51bGwsIGNvbW1hbmQ6IG51bGwsIHRpdGxlOiBudWxsLAogICAgICAgIGRpc2FibGVkOiBbIiIsICJkaXNhYmxlZCJdLAogICAgICAgIGNoZWNrZWQ6IFsiIiwgImNoZWNrZWQiXQogICAgICB9CiAgICB9LAogICAgZGF0YTogeyBhdHRyczogeyB2YWx1ZTogbnVsbCB9IH0sCiAgICBkYXRhZ3JpZDogeyBhdHRyczogeyBkaXNhYmxlZDogWyIiLCAiZGlzYWJsZWQiXSwgbXVsdGlwbGU6IFsiIiwgIm11bHRpcGxlIl0gfSB9LAogICAgZGF0YWxpc3Q6IHsgYXR0cnM6IHsgZGF0YTogbnVsbCB9IH0sCiAgICBkZDogcywKICAgIGRlbDogeyBhdHRyczogeyBjaXRlOiBudWxsLCBkYXRldGltZTogbnVsbCB9IH0sCiAgICBkZXRhaWxzOiB7IGF0dHJzOiB7IG9wZW46IFsiIiwgIm9wZW4iXSB9IH0sCiAgICBkZm46IHMsCiAgICBkaXI6IHMsCiAgICBkaXY6IHMsCiAgICBkbDogcywKICAgIGR0OiBzLAogICAgZW06IHMsCiAgICBlbWJlZDogeyBhdHRyczogeyBzcmM6IG51bGwsIHR5cGU6IG51bGwsIHdpZHRoOiBudWxsLCBoZWlnaHQ6IG51bGwgfSB9LAogICAgZXZlbnRzb3VyY2U6IHsgYXR0cnM6IHsgc3JjOiBudWxsIH0gfSwKICAgIGZpZWxkc2V0OiB7IGF0dHJzOiB7IGRpc2FibGVkOiBbIiIsICJkaXNhYmxlZCJdLCBmb3JtOiBudWxsLCBuYW1lOiBudWxsIH0gfSwKICAgIGZpZ2NhcHRpb246IHMsCiAgICBmaWd1cmU6IHMsCiAgICBmb250OiBzLAogICAgZm9vdGVyOiBzLAogICAgZm9ybTogewogICAgICBhdHRyczogewogICAgICAgIGFjdGlvbjogbnVsbCwgbmFtZTogbnVsbCwKICAgICAgICAiYWNjZXB0LWNoYXJzZXQiOiBjaGFyc2V0cywKICAgICAgICBhdXRvY29tcGxldGU6IFsib24iLCAib2ZmIl0sCiAgICAgICAgZW5jdHlwZTogZW5jcywKICAgICAgICBtZXRob2Q6IG1ldGhvZHMsCiAgICAgICAgbm92YWxpZGF0ZTogWyIiLCAibm92YWxpZGF0ZSJdLAogICAgICAgIHRhcmdldDogdGFyZ2V0cwogICAgICB9CiAgICB9LAogICAgZnJhbWU6IHMsCiAgICBmcmFtZXNldDogcywKICAgIGgxOiBzLCBoMjogcywgaDM6IHMsIGg0OiBzLCBoNTogcywgaDY6IHMsCiAgICBoZWFkOiB7CiAgICAgIGF0dHJzOiB7fSwKICAgICAgY2hpbGRyZW46IFsidGl0bGUiLCAiYmFzZSIsICJsaW5rIiwgInN0eWxlIiwgIm1ldGEiLCAic2NyaXB0IiwgIm5vc2NyaXB0IiwgImNvbW1hbmQiXQogICAgfSwKICAgIGhlYWRlcjogcywKICAgIGhncm91cDogcywKICAgIGhyOiBzLAogICAgaHRtbDogewogICAgICBhdHRyczogeyBtYW5pZmVzdDogbnVsbCB9LAogICAgICBjaGlsZHJlbjogWyJoZWFkIiwgImJvZHkiXQogICAgfSwKICAgIGk6IHMsCiAgICBpZnJhbWU6IHsKICAgICAgYXR0cnM6IHsKICAgICAgICBzcmM6IG51bGwsIHNyY2RvYzogbnVsbCwgbmFtZTogbnVsbCwgd2lkdGg6IG51bGwsIGhlaWdodDogbnVsbCwKICAgICAgICBzYW5kYm94OiBbImFsbG93LXRvcC1uYXZpZ2F0aW9uIiwgImFsbG93LXNhbWUtb3JpZ2luIiwgImFsbG93LWZvcm1zIiwgImFsbG93LXNjcmlwdHMiXSwKICAgICAgICBzZWFtbGVzczogWyIiLCAic2VhbWxlc3MiXQogICAgICB9CiAgICB9LAogICAgaW1nOiB7CiAgICAgIGF0dHJzOiB7CiAgICAgICAgYWx0OiBudWxsLCBzcmM6IG51bGwsIGlzbWFwOiBudWxsLCB1c2VtYXA6IG51bGwsIHdpZHRoOiBudWxsLCBoZWlnaHQ6IG51bGwsCiAgICAgICAgY3Jvc3NvcmlnaW46IFsiYW5vbnltb3VzIiwgInVzZS1jcmVkZW50aWFscyJdCiAgICAgIH0KICAgIH0sCiAgICBpbnB1dDogewogICAgICBhdHRyczogewogICAgICAgIGFsdDogbnVsbCwgZGlybmFtZTogbnVsbCwgZm9ybTogbnVsbCwgZm9ybWFjdGlvbjogbnVsbCwKICAgICAgICBoZWlnaHQ6IG51bGwsIGxpc3Q6IG51bGwsIG1heDogbnVsbCwgbWF4bGVuZ3RoOiBudWxsLCBtaW46IG51bGwsCiAgICAgICAgbmFtZTogbnVsbCwgcGF0dGVybjogbnVsbCwgcGxhY2Vob2xkZXI6IG51bGwsIHNpemU6IG51bGwsIHNyYzogbnVsbCwKICAgICAgICBzdGVwOiBudWxsLCB2YWx1ZTogbnVsbCwgd2lkdGg6IG51bGwsCiAgICAgICAgYWNjZXB0OiBbImF1ZGlvLyoiLCAidmlkZW8vKiIsICJpbWFnZS8qIl0sCiAgICAgICAgYXV0b2NvbXBsZXRlOiBbIm9uIiwgIm9mZiJdLAogICAgICAgIGF1dG9mb2N1czogWyIiLCAiYXV0b2ZvY3VzIl0sCiAgICAgICAgY2hlY2tlZDogWyIiLCAiY2hlY2tlZCJdLAogICAgICAgIGRpc2FibGVkOiBbIiIsICJkaXNhYmxlZCJdLAogICAgICAgIGZvcm1lbmN0eXBlOiBlbmNzLAogICAgICAgIGZvcm1tZXRob2Q6IG1ldGhvZHMsCiAgICAgICAgZm9ybW5vdmFsaWRhdGU6IFsiIiwgIm5vdmFsaWRhdGUiXSwKICAgICAgICBmb3JtdGFyZ2V0OiB0YXJnZXRzLAogICAgICAgIG11bHRpcGxlOiBbIiIsICJtdWx0aXBsZSJdLAogICAgICAgIHJlYWRvbmx5OiBbIiIsICJyZWFkb25seSJdLAogICAgICAgIHJlcXVpcmVkOiBbIiIsICJyZXF1aXJlZCJdLAogICAgICAgIHR5cGU6IFsiaGlkZGVuIiwgInRleHQiLCAic2VhcmNoIiwgInRlbCIsICJ1cmwiLCAiZW1haWwiLCAicGFzc3dvcmQiLCAiZGF0ZXRpbWUiLCAiZGF0ZSIsICJtb250aCIsCiAgICAgICAgICAgICAgICJ3ZWVrIiwgInRpbWUiLCAiZGF0ZXRpbWUtbG9jYWwiLCAibnVtYmVyIiwgInJhbmdlIiwgImNvbG9yIiwgImNoZWNrYm94IiwgInJhZGlvIiwKICAgICAgICAgICAgICAgImZpbGUiLCAic3VibWl0IiwgImltYWdlIiwgInJlc2V0IiwgImJ1dHRvbiJdCiAgICAgIH0KICAgIH0sCiAgICBpbnM6IHsgYXR0cnM6IHsgY2l0ZTogbnVsbCwgZGF0ZXRpbWU6IG51bGwgfSB9LAogICAga2JkOiBzLAogICAga2V5Z2VuOiB7CiAgICAgIGF0dHJzOiB7CiAgICAgICAgY2hhbGxlbmdlOiBudWxsLCBmb3JtOiBudWxsLCBuYW1lOiBudWxsLAogICAgICAgIGF1dG9mb2N1czogWyIiLCAiYXV0b2ZvY3VzIl0sCiAgICAgICAgZGlzYWJsZWQ6IFsiIiwgImRpc2FibGVkIl0sCiAgICAgICAga2V5dHlwZTogWyJSU0EiXQogICAgICB9CiAgICB9LAogICAgbGFiZWw6IHsgYXR0cnM6IHsgImZvciI6IG51bGwsIGZvcm06IG51bGwgfSB9LAogICAgbGVnZW5kOiBzLAogICAgbGk6IHsgYXR0cnM6IHsgdmFsdWU6IG51bGwgfSB9LAogICAgbGluazogewogICAgICBhdHRyczogewogICAgICAgIGhyZWY6IG51bGwsIHR5cGU6IG51bGwsCiAgICAgICAgaHJlZmxhbmc6IGxhbmdzLAogICAgICAgIG1lZGlhOiBtZWRpYSwKICAgICAgICBzaXplczogWyJhbGwiLCAiMTZ4MTYiLCAiMTZ4MTYgMzJ4MzIiLCAiMTZ4MTYgMzJ4MzIgNjR4NjQiXQogICAgICB9CiAgICB9LAogICAgbWFwOiB7IGF0dHJzOiB7IG5hbWU6IG51bGwgfSB9LAogICAgbWFyazogcywKICAgIG1lbnU6IHsgYXR0cnM6IHsgbGFiZWw6IG51bGwsIHR5cGU6IFsibGlzdCIsICJjb250ZXh0IiwgInRvb2xiYXIiXSB9IH0sCiAgICBtZXRhOiB7CiAgICAgIGF0dHJzOiB7CiAgICAgICAgY29udGVudDogbnVsbCwKICAgICAgICBjaGFyc2V0OiBjaGFyc2V0cywKICAgICAgICBuYW1lOiBbInZpZXdwb3J0IiwgImFwcGxpY2F0aW9uLW5hbWUiLCAiYXV0aG9yIiwgImRlc2NyaXB0aW9uIiwgImdlbmVyYXRvciIsICJrZXl3b3JkcyJdLAogICAgICAgICJodHRwLWVxdWl2IjogWyJjb250ZW50LWxhbmd1YWdlIiwgImNvbnRlbnQtdHlwZSIsICJkZWZhdWx0LXN0eWxlIiwgInJlZnJlc2giXQogICAgICB9CiAgICB9LAogICAgbWV0ZXI6IHsgYXR0cnM6IHsgdmFsdWU6IG51bGwsIG1pbjogbnVsbCwgbG93OiBudWxsLCBoaWdoOiBudWxsLCBtYXg6IG51bGwsIG9wdGltdW06IG51bGwgfSB9LAogICAgbmF2OiBzLAogICAgbm9mcmFtZXM6IHMsCiAgICBub3NjcmlwdDogcywKICAgIG9iamVjdDogewogICAgICBhdHRyczogewogICAgICAgIGRhdGE6IG51bGwsIHR5cGU6IG51bGwsIG5hbWU6IG51bGwsIHVzZW1hcDogbnVsbCwgZm9ybTogbnVsbCwgd2lkdGg6IG51bGwsIGhlaWdodDogbnVsbCwKICAgICAgICB0eXBlbXVzdG1hdGNoOiBbIiIsICJ0eXBlbXVzdG1hdGNoIl0KICAgICAgfQogICAgfSwKICAgIG9sOiB7IGF0dHJzOiB7IHJldmVyc2VkOiBbIiIsICJyZXZlcnNlZCJdLCBzdGFydDogbnVsbCwgdHlwZTogWyIxIiwgImEiLCAiQSIsICJpIiwgIkkiXSB9IH0sCiAgICBvcHRncm91cDogeyBhdHRyczogeyBkaXNhYmxlZDogWyIiLCAiZGlzYWJsZWQiXSwgbGFiZWw6IG51bGwgfSB9LAogICAgb3B0aW9uOiB7IGF0dHJzOiB7IGRpc2FibGVkOiBbIiIsICJkaXNhYmxlZCJdLCBsYWJlbDogbnVsbCwgc2VsZWN0ZWQ6IFsiIiwgInNlbGVjdGVkIl0sIHZhbHVlOiBudWxsIH0gfSwKICAgIG91dHB1dDogeyBhdHRyczogeyAiZm9yIjogbnVsbCwgZm9ybTogbnVsbCwgbmFtZTogbnVsbCB9IH0sCiAgICBwOiBzLAogICAgcGFyYW06IHsgYXR0cnM6IHsgbmFtZTogbnVsbCwgdmFsdWU6IG51bGwgfSB9LAogICAgcHJlOiBzLAogICAgcHJvZ3Jlc3M6IHsgYXR0cnM6IHsgdmFsdWU6IG51bGwsIG1heDogbnVsbCB9IH0sCiAgICBxOiB7IGF0dHJzOiB7IGNpdGU6IG51bGwgfSB9LAogICAgcnA6IHMsCiAgICBydDogcywKICAgIHJ1Ynk6IHMsCiAgICBzOiBzLAogICAgc2FtcDogcywKICAgIHNjcmlwdDogewogICAgICBhdHRyczogewogICAgICAgIHR5cGU6IFsidGV4dC9qYXZhc2NyaXB0Il0sCiAgICAgICAgc3JjOiBudWxsLAogICAgICAgIGFzeW5jOiBbIiIsICJhc3luYyJdLAogICAgICAgIGRlZmVyOiBbIiIsICJkZWZlciJdLAogICAgICAgIGNoYXJzZXQ6IGNoYXJzZXRzCiAgICAgIH0KICAgIH0sCiAgICBzZWN0aW9uOiBzLAogICAgc2VsZWN0OiB7CiAgICAgIGF0dHJzOiB7CiAgICAgICAgZm9ybTogbnVsbCwgbmFtZTogbnVsbCwgc2l6ZTogbnVsbCwKICAgICAgICBhdXRvZm9jdXM6IFsiIiwgImF1dG9mb2N1cyJdLAogICAgICAgIGRpc2FibGVkOiBbIiIsICJkaXNhYmxlZCJdLAogICAgICAgIG11bHRpcGxlOiBbIiIsICJtdWx0aXBsZSJdCiAgICAgIH0KICAgIH0sCiAgICBzbWFsbDogcywKICAgIHNvdXJjZTogeyBhdHRyczogeyBzcmM6IG51bGwsIHR5cGU6IG51bGwsIG1lZGlhOiBudWxsIH0gfSwKICAgIHNwYW46IHMsCiAgICBzdHJpa2U6IHMsCiAgICBzdHJvbmc6IHMsCiAgICBzdHlsZTogewogICAgICBhdHRyczogewogICAgICAgIHR5cGU6IFsidGV4dC9jc3MiXSwKICAgICAgICBtZWRpYTogbWVkaWEsCiAgICAgICAgc2NvcGVkOiBudWxsCiAgICAgIH0KICAgIH0sCiAgICBzdWI6IHMsCiAgICBzdW1tYXJ5OiBzLAogICAgc3VwOiBzLAogICAgdGFibGU6IHMsCiAgICB0Ym9keTogcywKICAgIHRkOiB7IGF0dHJzOiB7IGNvbHNwYW46IG51bGwsIHJvd3NwYW46IG51bGwsIGhlYWRlcnM6IG51bGwgfSB9LAogICAgdGV4dGFyZWE6IHsKICAgICAgYXR0cnM6IHsKICAgICAgICBkaXJuYW1lOiBudWxsLCBmb3JtOiBudWxsLCBtYXhsZW5ndGg6IG51bGwsIG5hbWU6IG51bGwsIHBsYWNlaG9sZGVyOiBudWxsLAogICAgICAgIHJvd3M6IG51bGwsIGNvbHM6IG51bGwsCiAgICAgICAgYXV0b2ZvY3VzOiBbIiIsICJhdXRvZm9jdXMiXSwKICAgICAgICBkaXNhYmxlZDogWyIiLCAiZGlzYWJsZWQiXSwKICAgICAgICByZWFkb25seTogWyIiLCAicmVhZG9ubHkiXSwKICAgICAgICByZXF1aXJlZDogWyIiLCAicmVxdWlyZWQiXSwKICAgICAgICB3cmFwOiBbInNvZnQiLCAiaGFyZCJdCiAgICAgIH0KICAgIH0sCiAgICB0Zm9vdDogcywKICAgIHRoOiB7IGF0dHJzOiB7IGNvbHNwYW46IG51bGwsIHJvd3NwYW46IG51bGwsIGhlYWRlcnM6IG51bGwsIHNjb3BlOiBbInJvdyIsICJjb2wiLCAicm93Z3JvdXAiLCAiY29sZ3JvdXAiXSB9IH0sCiAgICB0aGVhZDogcywKICAgIHRpbWU6IHsgYXR0cnM6IHsgZGF0ZXRpbWU6IG51bGwgfSB9LAogICAgdGl0bGU6IHMsCiAgICB0cjogcywKICAgIHRyYWNrOiB7CiAgICAgIGF0dHJzOiB7CiAgICAgICAgc3JjOiBudWxsLCBsYWJlbDogbnVsbCwgImRlZmF1bHQiOiBudWxsLAogICAgICAgIGtpbmQ6IFsic3VidGl0bGVzIiwgImNhcHRpb25zIiwgImRlc2NyaXB0aW9ucyIsICJjaGFwdGVycyIsICJtZXRhZGF0YSJdLAogICAgICAgIHNyY2xhbmc6IGxhbmdzCiAgICAgIH0KICAgIH0sCiAgICB0dDogcywKICAgIHU6IHMsCiAgICB1bDogcywKICAgICJ2YXIiOiBzLAogICAgdmlkZW86IHsKICAgICAgYXR0cnM6IHsKICAgICAgICBzcmM6IG51bGwsIHBvc3RlcjogbnVsbCwgd2lkdGg6IG51bGwsIGhlaWdodDogbnVsbCwKICAgICAgICBjcm9zc29yaWdpbjogWyJhbm9ueW1vdXMiLCAidXNlLWNyZWRlbnRpYWxzIl0sCiAgICAgICAgcHJlbG9hZDogWyJhdXRvIiwgIm1ldGFkYXRhIiwgIm5vbmUiXSwKICAgICAgICBhdXRvcGxheTogWyIiLCAiYXV0b3BsYXkiXSwKICAgICAgICBtZWRpYWdyb3VwOiBbIm1vdmllIl0sCiAgICAgICAgbXV0ZWQ6IFsiIiwgIm11dGVkIl0sCiAgICAgICAgY29udHJvbHM6IFsiIiwgImNvbnRyb2xzIl0KICAgICAgfQogICAgfSwKICAgIHdicjogcwogIH07CgogIHZhciBnbG9iYWxBdHRycyA9IHsKICAgIGFjY2Vzc2tleTogWyJhIiwgImIiLCAiYyIsICJkIiwgImUiLCAiZiIsICJnIiwgImgiLCAiaSIsICJqIiwgImsiLCAibCIsICJtIiwgIm4iLCAibyIsICJwIiwgInEiLCAiciIsICJzIiwgInQiLCAidSIsICJ2IiwgInciLCAieCIsICJ5IiwgInoiLCAiMCIsICIxIiwgIjIiLCAiMyIsICI0IiwgIjUiLCAiNiIsICI3IiwgIjgiLCAiOSJdLAogICAgImNsYXNzIjogbnVsbCwKICAgIGNvbnRlbnRlZGl0YWJsZTogWyJ0cnVlIiwgImZhbHNlIl0sCiAgICBjb250ZXh0bWVudTogbnVsbCwKICAgIGRpcjogWyJsdHIiLCAicnRsIiwgImF1dG8iXSwKICAgIGRyYWdnYWJsZTogWyJ0cnVlIiwgImZhbHNlIiwgImF1dG8iXSwKICAgIGRyb3B6b25lOiBbImNvcHkiLCAibW92ZSIsICJsaW5rIiwgInN0cmluZzoiLCAiZmlsZToiXSwKICAgIGhpZGRlbjogWyJoaWRkZW4iXSwKICAgIGlkOiBudWxsLAogICAgaW5lcnQ6IFsiaW5lcnQiXSwKICAgIGl0ZW1pZDogbnVsbCwKICAgIGl0ZW1wcm9wOiBudWxsLAogICAgaXRlbXJlZjogbnVsbCwKICAgIGl0ZW1zY29wZTogWyJpdGVtc2NvcGUiXSwKICAgIGl0ZW10eXBlOiBudWxsLAogICAgbGFuZzogWyJlbiIsICJlcyJdLAogICAgc3BlbGxjaGVjazogWyJ0cnVlIiwgImZhbHNlIl0sCiAgICBzdHlsZTogbnVsbCwKICAgIHRhYmluZGV4OiBbIjEiLCAiMiIsICIzIiwgIjQiLCAiNSIsICI2IiwgIjciLCAiOCIsICI5Il0sCiAgICB0aXRsZTogbnVsbCwKICAgIHRyYW5zbGF0ZTogWyJ5ZXMiLCAibm8iXSwKICAgIG9uY2xpY2s6IG51bGwsCiAgICByZWw6IFsic3R5bGVzaGVldCIsICJhbHRlcm5hdGUiLCAiYXV0aG9yIiwgImJvb2ttYXJrIiwgImhlbHAiLCAibGljZW5zZSIsICJuZXh0IiwgIm5vZm9sbG93IiwgIm5vcmVmZXJyZXIiLCAicHJlZmV0Y2giLCAicHJldiIsICJzZWFyY2giLCAidGFnIl0KICB9OwogIGZ1bmN0aW9uIHBvcHVsYXRlKG9iaikgewogICAgZm9yICh2YXIgYXR0ciBpbiBnbG9iYWxBdHRycykgaWYgKGdsb2JhbEF0dHJzLmhhc093blByb3BlcnR5KGF0dHIpKQogICAgICBvYmouYXR0cnNbYXR0cl0gPSBnbG9iYWxBdHRyc1thdHRyXTsKICB9CgogIHBvcHVsYXRlKHMpOwogIGZvciAodmFyIHRhZyBpbiBkYXRhKSBpZiAoZGF0YS5oYXNPd25Qcm9wZXJ0eSh0YWcpICYmIGRhdGFbdGFnXSAhPSBzKQogICAgcG9wdWxhdGUoZGF0YVt0YWddKTsKCiAgQ29kZU1pcnJvci5odG1sU2NoZW1hID0gZGF0YTsKICBmdW5jdGlvbiBodG1sSGludChjbSwgb3B0aW9ucykgewogICAgdmFyIGxvY2FsID0ge3NjaGVtYUluZm86IGRhdGF9OwogICAgaWYgKG9wdGlvbnMpIGZvciAodmFyIG9wdCBpbiBvcHRpb25zKSBsb2NhbFtvcHRdID0gb3B0aW9uc1tvcHRdOwogICAgcmV0dXJuIENvZGVNaXJyb3IuaGludC54bWwoY20sIGxvY2FsKTsKICB9CiAgQ29kZU1pcnJvci5yZWdpc3RlckhlbHBlcigiaGludCIsICJodG1sIiwgaHRtbEhpbnQpOwp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/hint/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCEtLSBEVU1NWSBIVE1MIEZJTEUgLS0+]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/hint/javascript-hint.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICB2YXIgUG9zID0gQ29kZU1pcnJvci5Qb3M7CgogIGZ1bmN0aW9uIGZvckVhY2goYXJyLCBmKSB7CiAgICBmb3IgKHZhciBpID0gMCwgZSA9IGFyci5sZW5ndGg7IGkgPCBlOyArK2kpIGYoYXJyW2ldKTsKICB9CgogIGZ1bmN0aW9uIGFycmF5Q29udGFpbnMoYXJyLCBpdGVtKSB7CiAgICBpZiAoIUFycmF5LnByb3RvdHlwZS5pbmRleE9mKSB7CiAgICAgIHZhciBpID0gYXJyLmxlbmd0aDsKICAgICAgd2hpbGUgKGktLSkgewogICAgICAgIGlmIChhcnJbaV0gPT09IGl0ZW0pIHsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gYXJyLmluZGV4T2YoaXRlbSkgIT0gLTE7CiAgfQoKICBmdW5jdGlvbiBzY3JpcHRIaW50KGVkaXRvciwga2V5d29yZHMsIGdldFRva2VuLCBvcHRpb25zKSB7CiAgICAvLyBGaW5kIHRoZSB0b2tlbiBhdCB0aGUgY3Vyc29yCiAgICB2YXIgY3VyID0gZWRpdG9yLmdldEN1cnNvcigpLCB0b2tlbiA9IGdldFRva2VuKGVkaXRvciwgY3VyKSwgdHByb3AgPSB0b2tlbjsKICAgIGlmICgvXGIoPzpzdHJpbmd8Y29tbWVudClcYi8udGVzdCh0b2tlbi50eXBlKSkgcmV0dXJuOwogICAgdG9rZW4uc3RhdGUgPSBDb2RlTWlycm9yLmlubmVyTW9kZShlZGl0b3IuZ2V0TW9kZSgpLCB0b2tlbi5zdGF0ZSkuc3RhdGU7CgogICAgLy8gSWYgaXQncyBub3QgYSAnd29yZC1zdHlsZScgdG9rZW4sIGlnbm9yZSB0aGUgdG9rZW4uCiAgICBpZiAoIS9eW1x3JF9dKiQvLnRlc3QodG9rZW4uc3RyaW5nKSkgewogICAgICB0b2tlbiA9IHRwcm9wID0ge3N0YXJ0OiBjdXIuY2gsIGVuZDogY3VyLmNoLCBzdHJpbmc6ICIiLCBzdGF0ZTogdG9rZW4uc3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogdG9rZW4uc3RyaW5nID09ICIuIiA/ICJwcm9wZXJ0eSIgOiBudWxsfTsKICAgIH0KICAgIC8vIElmIGl0IGlzIGEgcHJvcGVydHksIGZpbmQgb3V0IHdoYXQgaXQgaXMgYSBwcm9wZXJ0eSBvZi4KICAgIHdoaWxlICh0cHJvcC50eXBlID09ICJwcm9wZXJ0eSIpIHsKICAgICAgdHByb3AgPSBnZXRUb2tlbihlZGl0b3IsIFBvcyhjdXIubGluZSwgdHByb3Auc3RhcnQpKTsKICAgICAgaWYgKHRwcm9wLnN0cmluZyAhPSAiLiIpIHJldHVybjsKICAgICAgdHByb3AgPSBnZXRUb2tlbihlZGl0b3IsIFBvcyhjdXIubGluZSwgdHByb3Auc3RhcnQpKTsKICAgICAgaWYgKCFjb250ZXh0KSB2YXIgY29udGV4dCA9IFtdOwogICAgICBjb250ZXh0LnB1c2godHByb3ApOwogICAgfQogICAgcmV0dXJuIHtsaXN0OiBnZXRDb21wbGV0aW9ucyh0b2tlbiwgY29udGV4dCwga2V5d29yZHMsIG9wdGlvbnMpLAogICAgICAgICAgICBmcm9tOiBQb3MoY3VyLmxpbmUsIHRva2VuLnN0YXJ0KSwKICAgICAgICAgICAgdG86IFBvcyhjdXIubGluZSwgdG9rZW4uZW5kKX07CiAgfQoKICBmdW5jdGlvbiBqYXZhc2NyaXB0SGludChlZGl0b3IsIG9wdGlvbnMpIHsKICAgIHJldHVybiBzY3JpcHRIaW50KGVkaXRvciwgamF2YXNjcmlwdEtleXdvcmRzLAogICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGUsIGN1cikge3JldHVybiBlLmdldFRva2VuQXQoY3VyKTt9LAogICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyk7CiAgfTsKICBDb2RlTWlycm9yLnJlZ2lzdGVySGVscGVyKCJoaW50IiwgImphdmFzY3JpcHQiLCBqYXZhc2NyaXB0SGludCk7CgogIGZ1bmN0aW9uIGdldENvZmZlZVNjcmlwdFRva2VuKGVkaXRvciwgY3VyKSB7CiAgLy8gVGhpcyBnZXRUb2tlbiwgaXQgaXMgZm9yIGNvZmZlZXNjcmlwdCwgaW1pdGF0ZXMgdGhlIGJlaGF2aW9yIG9mCiAgLy8gZ2V0VG9rZW5BdCBtZXRob2QgaW4gamF2YXNjcmlwdC5qcywgdGhhdCBpcywgcmV0dXJuaW5nICJwcm9wZXJ0eSIKICAvLyB0eXBlIGFuZCB0cmVhdCAiLiIgYXMgaW5kZXBlbmVudCB0b2tlbi4KICAgIHZhciB0b2tlbiA9IGVkaXRvci5nZXRUb2tlbkF0KGN1cik7CiAgICBpZiAoY3VyLmNoID09IHRva2VuLnN0YXJ0ICsgMSAmJiB0b2tlbi5zdHJpbmcuY2hhckF0KDApID09ICcuJykgewogICAgICB0b2tlbi5lbmQgPSB0b2tlbi5zdGFydDsKICAgICAgdG9rZW4uc3RyaW5nID0gJy4nOwogICAgICB0b2tlbi50eXBlID0gInByb3BlcnR5IjsKICAgIH0KICAgIGVsc2UgaWYgKC9eXC5bXHckX10qJC8udGVzdCh0b2tlbi5zdHJpbmcpKSB7CiAgICAgIHRva2VuLnR5cGUgPSAicHJvcGVydHkiOwogICAgICB0b2tlbi5zdGFydCsrOwogICAgICB0b2tlbi5zdHJpbmcgPSB0b2tlbi5zdHJpbmcucmVwbGFjZSgvXC4vLCAnJyk7CiAgICB9CiAgICByZXR1cm4gdG9rZW47CiAgfQoKICBmdW5jdGlvbiBjb2ZmZWVzY3JpcHRIaW50KGVkaXRvciwgb3B0aW9ucykgewogICAgcmV0dXJuIHNjcmlwdEhpbnQoZWRpdG9yLCBjb2ZmZWVzY3JpcHRLZXl3b3JkcywgZ2V0Q29mZmVlU2NyaXB0VG9rZW4sIG9wdGlvbnMpOwogIH0KICBDb2RlTWlycm9yLnJlZ2lzdGVySGVscGVyKCJoaW50IiwgImNvZmZlZXNjcmlwdCIsIGNvZmZlZXNjcmlwdEhpbnQpOwoKICB2YXIgc3RyaW5nUHJvcHMgPSAoImNoYXJBdCBjaGFyQ29kZUF0IGluZGV4T2YgbGFzdEluZGV4T2Ygc3Vic3RyaW5nIHN1YnN0ciBzbGljZSB0cmltIHRyaW1MZWZ0IHRyaW1SaWdodCAiICsKICAgICAgICAgICAgICAgICAgICAgInRvVXBwZXJDYXNlIHRvTG93ZXJDYXNlIHNwbGl0IGNvbmNhdCBtYXRjaCByZXBsYWNlIHNlYXJjaCIpLnNwbGl0KCIgIik7CiAgdmFyIGFycmF5UHJvcHMgPSAoImxlbmd0aCBjb25jYXQgam9pbiBzcGxpY2UgcHVzaCBwb3Agc2hpZnQgdW5zaGlmdCBzbGljZSByZXZlcnNlIHNvcnQgaW5kZXhPZiAiICsKICAgICAgICAgICAgICAgICAgICAibGFzdEluZGV4T2YgZXZlcnkgc29tZSBmaWx0ZXIgZm9yRWFjaCBtYXAgcmVkdWNlIHJlZHVjZVJpZ2h0ICIpLnNwbGl0KCIgIik7CiAgdmFyIGZ1bmNQcm9wcyA9ICJwcm90b3R5cGUgYXBwbHkgY2FsbCBiaW5kIi5zcGxpdCgiICIpOwogIHZhciBqYXZhc2NyaXB0S2V5d29yZHMgPSAoImJyZWFrIGNhc2UgY2F0Y2ggY29udGludWUgZGVidWdnZXIgZGVmYXVsdCBkZWxldGUgZG8gZWxzZSBmYWxzZSBmaW5hbGx5IGZvciBmdW5jdGlvbiAiICsKICAgICAgICAgICAgICAgICAgImlmIGluIGluc3RhbmNlb2YgbmV3IG51bGwgcmV0dXJuIHN3aXRjaCB0aHJvdyB0cnVlIHRyeSB0eXBlb2YgdmFyIHZvaWQgd2hpbGUgd2l0aCIpLnNwbGl0KCIgIik7CiAgdmFyIGNvZmZlZXNjcmlwdEtleXdvcmRzID0gKCJhbmQgYnJlYWsgY2F0Y2ggY2xhc3MgY29udGludWUgZGVsZXRlIGRvIGVsc2UgZXh0ZW5kcyBmYWxzZSBmaW5hbGx5IGZvciAiICsKICAgICAgICAgICAgICAgICAgImlmIGluIGluc3RhbmNlb2YgaXNudCBuZXcgbm8gbm90IG51bGwgb2Ygb2ZmIG9uIG9yIHJldHVybiBzd2l0Y2ggdGhlbiB0aHJvdyB0cnVlIHRyeSB0eXBlb2YgdW50aWwgdm9pZCB3aGlsZSB3aXRoIHllcyIpLnNwbGl0KCIgIik7CgogIGZ1bmN0aW9uIGdldENvbXBsZXRpb25zKHRva2VuLCBjb250ZXh0LCBrZXl3b3Jkcywgb3B0aW9ucykgewogICAgdmFyIGZvdW5kID0gW10sIHN0YXJ0ID0gdG9rZW4uc3RyaW5nOwogICAgZnVuY3Rpb24gbWF5YmVBZGQoc3RyKSB7CiAgICAgIGlmIChzdHIubGFzdEluZGV4T2Yoc3RhcnQsIDApID09IDAgJiYgIWFycmF5Q29udGFpbnMoZm91bmQsIHN0cikpIGZvdW5kLnB1c2goc3RyKTsKICAgIH0KICAgIGZ1bmN0aW9uIGdhdGhlckNvbXBsZXRpb25zKG9iaikgewogICAgICBpZiAodHlwZW9mIG9iaiA9PSAic3RyaW5nIikgZm9yRWFjaChzdHJpbmdQcm9wcywgbWF5YmVBZGQpOwogICAgICBlbHNlIGlmIChvYmogaW5zdGFuY2VvZiBBcnJheSkgZm9yRWFjaChhcnJheVByb3BzLCBtYXliZUFkZCk7CiAgICAgIGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEZ1bmN0aW9uKSBmb3JFYWNoKGZ1bmNQcm9wcywgbWF5YmVBZGQpOwogICAgICBmb3IgKHZhciBuYW1lIGluIG9iaikgbWF5YmVBZGQobmFtZSk7CiAgICB9CgogICAgaWYgKGNvbnRleHQgJiYgY29udGV4dC5sZW5ndGgpIHsKICAgICAgLy8gSWYgdGhpcyBpcyBhIHByb3BlcnR5LCBzZWUgaWYgaXQgYmVsb25ncyB0byBzb21lIG9iamVjdCB3ZSBjYW4KICAgICAgLy8gZmluZCBpbiB0aGUgY3VycmVudCBlbnZpcm9ubWVudC4KICAgICAgdmFyIG9iaiA9IGNvbnRleHQucG9wKCksIGJhc2U7CiAgICAgIGlmIChvYmoudHlwZSAmJiBvYmoudHlwZS5pbmRleE9mKCJ2YXJpYWJsZSIpID09PSAwKSB7CiAgICAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5hZGRpdGlvbmFsQ29udGV4dCkKICAgICAgICAgIGJhc2UgPSBvcHRpb25zLmFkZGl0aW9uYWxDb250ZXh0W29iai5zdHJpbmddOwogICAgICAgIGlmICghb3B0aW9ucyB8fCBvcHRpb25zLnVzZUdsb2JhbFNjb3BlICE9PSBmYWxzZSkKICAgICAgICAgIGJhc2UgPSBiYXNlIHx8IHdpbmRvd1tvYmouc3RyaW5nXTsKICAgICAgfSBlbHNlIGlmIChvYmoudHlwZSA9PSAic3RyaW5nIikgewogICAgICAgIGJhc2UgPSAiIjsKICAgICAgfSBlbHNlIGlmIChvYmoudHlwZSA9PSAiYXRvbSIpIHsKICAgICAgICBiYXNlID0gMTsKICAgICAgfSBlbHNlIGlmIChvYmoudHlwZSA9PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgaWYgKHdpbmRvdy5qUXVlcnkgIT0gbnVsbCAmJiAob2JqLnN0cmluZyA9PSAnJCcgfHwgb2JqLnN0cmluZyA9PSAnalF1ZXJ5JykgJiYKICAgICAgICAgICAgKHR5cGVvZiB3aW5kb3cualF1ZXJ5ID09ICdmdW5jdGlvbicpKQogICAgICAgICAgYmFzZSA9IHdpbmRvdy5qUXVlcnkoKTsKICAgICAgICBlbHNlIGlmICh3aW5kb3cuXyAhPSBudWxsICYmIChvYmouc3RyaW5nID09ICdfJykgJiYgKHR5cGVvZiB3aW5kb3cuXyA9PSAnZnVuY3Rpb24nKSkKICAgICAgICAgIGJhc2UgPSB3aW5kb3cuXygpOwogICAgICB9CiAgICAgIHdoaWxlIChiYXNlICE9IG51bGwgJiYgY29udGV4dC5sZW5ndGgpCiAgICAgICAgYmFzZSA9IGJhc2VbY29udGV4dC5wb3AoKS5zdHJpbmddOwogICAgICBpZiAoYmFzZSAhPSBudWxsKSBnYXRoZXJDb21wbGV0aW9ucyhiYXNlKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIElmIG5vdCwganVzdCBsb29rIGluIHRoZSB3aW5kb3cgb2JqZWN0IGFuZCBhbnkgbG9jYWwgc2NvcGUKICAgICAgLy8gKHJlYWRpbmcgaW50byBKUyBtb2RlIGludGVybmFscyB0byBnZXQgYXQgdGhlIGxvY2FsIGFuZCBnbG9iYWwgdmFyaWFibGVzKQogICAgICBmb3IgKHZhciB2ID0gdG9rZW4uc3RhdGUubG9jYWxWYXJzOyB2OyB2ID0gdi5uZXh0KSBtYXliZUFkZCh2Lm5hbWUpOwogICAgICBmb3IgKHZhciB2ID0gdG9rZW4uc3RhdGUuZ2xvYmFsVmFyczsgdjsgdiA9IHYubmV4dCkgbWF5YmVBZGQodi5uYW1lKTsKICAgICAgaWYgKCFvcHRpb25zIHx8IG9wdGlvbnMudXNlR2xvYmFsU2NvcGUgIT09IGZhbHNlKQogICAgICAgIGdhdGhlckNvbXBsZXRpb25zKHdpbmRvdyk7CiAgICAgIGZvckVhY2goa2V5d29yZHMsIG1heWJlQWRkKTsKICAgIH0KICAgIHJldHVybiBmb3VuZDsKICB9Cn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/hint/python-hint.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CgogIGZ1bmN0aW9uIGZvckVhY2goYXJyLCBmKSB7CiAgICBmb3IgKHZhciBpID0gMCwgZSA9IGFyci5sZW5ndGg7IGkgPCBlOyArK2kpIGYoYXJyW2ldKTsKICB9CgogIGZ1bmN0aW9uIGFycmF5Q29udGFpbnMoYXJyLCBpdGVtKSB7CiAgICBpZiAoIUFycmF5LnByb3RvdHlwZS5pbmRleE9mKSB7CiAgICAgIHZhciBpID0gYXJyLmxlbmd0aDsKICAgICAgd2hpbGUgKGktLSkgewogICAgICAgIGlmIChhcnJbaV0gPT09IGl0ZW0pIHsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gYXJyLmluZGV4T2YoaXRlbSkgIT0gLTE7CiAgfQoKICBmdW5jdGlvbiBzY3JpcHRIaW50KGVkaXRvciwgX2tleXdvcmRzLCBnZXRUb2tlbikgewogICAgLy8gRmluZCB0aGUgdG9rZW4gYXQgdGhlIGN1cnNvcgogICAgdmFyIGN1ciA9IGVkaXRvci5nZXRDdXJzb3IoKSwgdG9rZW4gPSBnZXRUb2tlbihlZGl0b3IsIGN1ciksIHRwcm9wID0gdG9rZW47CiAgICAvLyBJZiBpdCdzIG5vdCBhICd3b3JkLXN0eWxlJyB0b2tlbiwgaWdub3JlIHRoZSB0b2tlbi4KCiAgICBpZiAoIS9eW1x3JF9dKiQvLnRlc3QodG9rZW4uc3RyaW5nKSkgewogICAgICAgIHRva2VuID0gdHByb3AgPSB7c3RhcnQ6IGN1ci5jaCwgZW5kOiBjdXIuY2gsIHN0cmluZzogIiIsIHN0YXRlOiB0b2tlbi5zdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogdG9rZW4uc3RyaW5nID09ICI6IiA/ICJweXRob24tdHlwZSIgOiBudWxsfTsKICAgIH0KCiAgICBpZiAoIWNvbnRleHQpIHZhciBjb250ZXh0ID0gW107CiAgICBjb250ZXh0LnB1c2godHByb3ApOwoKICAgIHZhciBjb21wbGV0aW9uTGlzdCA9IGdldENvbXBsZXRpb25zKHRva2VuLCBjb250ZXh0KTsKICAgIGNvbXBsZXRpb25MaXN0ID0gY29tcGxldGlvbkxpc3Quc29ydCgpOwoKICAgIHJldHVybiB7bGlzdDogY29tcGxldGlvbkxpc3QsCiAgICAgICAgICAgIGZyb206IENvZGVNaXJyb3IuUG9zKGN1ci5saW5lLCB0b2tlbi5zdGFydCksCiAgICAgICAgICAgIHRvOiBDb2RlTWlycm9yLlBvcyhjdXIubGluZSwgdG9rZW4uZW5kKX07CiAgfQoKICBmdW5jdGlvbiBweXRob25IaW50KGVkaXRvcikgewogICAgcmV0dXJuIHNjcmlwdEhpbnQoZWRpdG9yLCBweXRob25LZXl3b3Jkc1UsIGZ1bmN0aW9uIChlLCBjdXIpIHtyZXR1cm4gZS5nZXRUb2tlbkF0KGN1cik7fSk7CiAgfQogIENvZGVNaXJyb3IucmVnaXN0ZXJIZWxwZXIoImhpbnQiLCAicHl0aG9uIiwgcHl0aG9uSGludCk7CgogIHZhciBweXRob25LZXl3b3JkcyA9ICJhbmQgZGVsIGZyb20gbm90IHdoaWxlIGFzIGVsaWYgZ2xvYmFsIG9yIHdpdGggYXNzZXJ0IGVsc2UgaWYgcGFzcyB5aWVsZCIKKyAiYnJlYWsgZXhjZXB0IGltcG9ydCBwcmludCBjbGFzcyBleGVjIGluIHJhaXNlIGNvbnRpbnVlIGZpbmFsbHkgaXMgcmV0dXJuIGRlZiBmb3IgbGFtYmRhIHRyeSI7CiAgdmFyIHB5dGhvbktleXdvcmRzTCA9IHB5dGhvbktleXdvcmRzLnNwbGl0KCIgIik7CiAgdmFyIHB5dGhvbktleXdvcmRzVSA9IHB5dGhvbktleXdvcmRzLnRvVXBwZXJDYXNlKCkuc3BsaXQoIiAiKTsKCiAgdmFyIHB5dGhvbkJ1aWx0aW5zID0gImFicyBkaXZtb2QgaW5wdXQgb3BlbiBzdGF0aWNtZXRob2QgYWxsIGVudW1lcmF0ZSBpbnQgb3JkIHN0ciAiCisgImFueSBldmFsIGlzaW5zdGFuY2UgcG93IHN1bSBiYXNlc3RyaW5nIGV4ZWNmaWxlIGlzc3ViY2xhc3MgcHJpbnQgc3VwZXIiCisgImJpbiBmaWxlIGl0ZXIgcHJvcGVydHkgdHVwbGUgYm9vbCBmaWx0ZXIgbGVuIHJhbmdlIHR5cGUiCisgImJ5dGVhcnJheSBmbG9hdCBsaXN0IHJhd19pbnB1dCB1bmljaHIgY2FsbGFibGUgZm9ybWF0IGxvY2FscyByZWR1Y2UgdW5pY29kZSIKKyAiY2hyIGZyb3plbnNldCBsb25nIHJlbG9hZCB2YXJzIGNsYXNzbWV0aG9kIGdldGF0dHIgbWFwIHJlcHIgeHJhbmdlIgorICJjbXAgZ2xvYmFscyBtYXggcmV2ZXJzZWQgemlwIGNvbXBpbGUgaGFzYXR0ciBtZW1vcnl2aWV3IHJvdW5kIF9faW1wb3J0X18iCisgImNvbXBsZXggaGFzaCBtaW4gc2V0IGFwcGx5IGRlbGF0dHIgaGVscCBuZXh0IHNldGF0dHIgYnVmZmVyIgorICJkaWN0IGhleCBvYmplY3Qgc2xpY2UgY29lcmNlIGRpciBpZCBvY3Qgc29ydGVkIGludGVybiAiOwogIHZhciBweXRob25CdWlsdGluc0wgPSBweXRob25CdWlsdGlucy5zcGxpdCgiICIpLmpvaW4oIigpICIpLnNwbGl0KCIgIik7CiAgdmFyIHB5dGhvbkJ1aWx0aW5zVSA9IHB5dGhvbkJ1aWx0aW5zLnRvVXBwZXJDYXNlKCkuc3BsaXQoIiAiKS5qb2luKCIoKSAiKS5zcGxpdCgiICIpOwoKICBmdW5jdGlvbiBnZXRDb21wbGV0aW9ucyh0b2tlbiwgY29udGV4dCkgewogICAgdmFyIGZvdW5kID0gW10sIHN0YXJ0ID0gdG9rZW4uc3RyaW5nOwogICAgZnVuY3Rpb24gbWF5YmVBZGQoc3RyKSB7CiAgICAgIGlmIChzdHIubGFzdEluZGV4T2Yoc3RhcnQsIDApID09IDAgJiYgIWFycmF5Q29udGFpbnMoZm91bmQsIHN0cikpIGZvdW5kLnB1c2goc3RyKTsKICAgIH0KCiAgICBmdW5jdGlvbiBnYXRoZXJDb21wbGV0aW9ucyhfb2JqKSB7CiAgICAgICAgZm9yRWFjaChweXRob25CdWlsdGluc0wsIG1heWJlQWRkKTsKICAgICAgICBmb3JFYWNoKHB5dGhvbkJ1aWx0aW5zVSwgbWF5YmVBZGQpOwogICAgICAgIGZvckVhY2gocHl0aG9uS2V5d29yZHNMLCBtYXliZUFkZCk7CiAgICAgICAgZm9yRWFjaChweXRob25LZXl3b3Jkc1UsIG1heWJlQWRkKTsKICAgIH0KCiAgICBpZiAoY29udGV4dCkgewogICAgICAvLyBJZiB0aGlzIGlzIGEgcHJvcGVydHksIHNlZSBpZiBpdCBiZWxvbmdzIHRvIHNvbWUgb2JqZWN0IHdlIGNhbgogICAgICAvLyBmaW5kIGluIHRoZSBjdXJyZW50IGVudmlyb25tZW50LgogICAgICB2YXIgb2JqID0gY29udGV4dC5wb3AoKSwgYmFzZTsKCiAgICAgIGlmIChvYmoudHlwZSA9PSAidmFyaWFibGUiKQogICAgICAgICAgYmFzZSA9IG9iai5zdHJpbmc7CiAgICAgIGVsc2UgaWYob2JqLnR5cGUgPT0gInZhcmlhYmxlLTMiKQogICAgICAgICAgYmFzZSA9ICI6IiArIG9iai5zdHJpbmc7CgogICAgICB3aGlsZSAoYmFzZSAhPSBudWxsICYmIGNvbnRleHQubGVuZ3RoKQogICAgICAgIGJhc2UgPSBiYXNlW2NvbnRleHQucG9wKCkuc3RyaW5nXTsKICAgICAgaWYgKGJhc2UgIT0gbnVsbCkgZ2F0aGVyQ29tcGxldGlvbnMoYmFzZSk7CiAgICB9CiAgICByZXR1cm4gZm91bmQ7CiAgfQp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/hint/show-hint.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LkNvZGVNaXJyb3ItaGludHMgewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB6LWluZGV4OiAxMDsKICBvdmVyZmxvdzogaGlkZGVuOwogIGxpc3Qtc3R5bGU6IG5vbmU7CgogIG1hcmdpbjogMDsKICBwYWRkaW5nOiAycHg7CgogIC13ZWJraXQtYm94LXNoYWRvdzogMnB4IDNweCA1cHggcmdiYSgwLDAsMCwuMik7CiAgLW1vei1ib3gtc2hhZG93OiAycHggM3B4IDVweCByZ2JhKDAsMCwwLC4yKTsKICBib3gtc2hhZG93OiAycHggM3B4IDVweCByZ2JhKDAsMCwwLC4yKTsKICBib3JkZXItcmFkaXVzOiAzcHg7CiAgYm9yZGVyOiAxcHggc29saWQgc2lsdmVyOwoKICBiYWNrZ3JvdW5kOiB3aGl0ZTsKICBmb250LXNpemU6IDkwJTsKICBmb250LWZhbWlseTogbW9ub3NwYWNlOwoKICBtYXgtaGVpZ2h0OiAyMGVtOwogIG92ZXJmbG93LXk6IGF1dG87Cn0KCi5Db2RlTWlycm9yLWhpbnQgewogIG1hcmdpbjogMDsKICBwYWRkaW5nOiAwIDRweDsKICBib3JkZXItcmFkaXVzOiAycHg7CiAgbWF4LXdpZHRoOiAxOWVtOwogIG92ZXJmbG93OiBoaWRkZW47CiAgd2hpdGUtc3BhY2U6IHByZTsKICBjb2xvcjogYmxhY2s7CiAgY3Vyc29yOiBwb2ludGVyOwp9CgouQ29kZU1pcnJvci1oaW50LWFjdGl2ZSB7CiAgYmFja2dyb3VuZDogIzA4ZjsKICBjb2xvcjogd2hpdGU7Cn0K]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/hint/show-hint.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CgogIHZhciBISU5UX0VMRU1FTlRfQ0xBU1MgICAgICAgID0gIkNvZGVNaXJyb3ItaGludCI7CiAgdmFyIEFDVElWRV9ISU5UX0VMRU1FTlRfQ0xBU1MgPSAiQ29kZU1pcnJvci1oaW50LWFjdGl2ZSI7CgogIC8vIFRoaXMgaXMgdGhlIG9sZCBpbnRlcmZhY2UsIGtlcHQgYXJvdW5kIGZvciBub3cgdG8gc3RheQogIC8vIGJhY2t3YXJkcy1jb21wYXRpYmxlLgogIENvZGVNaXJyb3Iuc2hvd0hpbnQgPSBmdW5jdGlvbihjbSwgZ2V0SGludHMsIG9wdGlvbnMpIHsKICAgIGlmICghZ2V0SGludHMpIHJldHVybiBjbS5zaG93SGludChvcHRpb25zKTsKICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuYXN5bmMpIGdldEhpbnRzLmFzeW5jID0gdHJ1ZTsKICAgIHZhciBuZXdPcHRzID0ge2hpbnQ6IGdldEhpbnRzfTsKICAgIGlmIChvcHRpb25zKSBmb3IgKHZhciBwcm9wIGluIG9wdGlvbnMpIG5ld09wdHNbcHJvcF0gPSBvcHRpb25zW3Byb3BdOwogICAgcmV0dXJuIGNtLnNob3dIaW50KG5ld09wdHMpOwogIH07CgogIENvZGVNaXJyb3IuZGVmaW5lRXh0ZW5zaW9uKCJzaG93SGludCIsIGZ1bmN0aW9uKG9wdGlvbnMpIHsKICAgIC8vIFdlIHdhbnQgYSBzaW5nbGUgY3Vyc29yIHBvc2l0aW9uLgogICAgaWYgKHRoaXMubGlzdFNlbGVjdGlvbnMoKS5sZW5ndGggPiAxIHx8IHRoaXMuc29tZXRoaW5nU2VsZWN0ZWQoKSkgcmV0dXJuOwoKICAgIGlmICh0aGlzLnN0YXRlLmNvbXBsZXRpb25BY3RpdmUpIHRoaXMuc3RhdGUuY29tcGxldGlvbkFjdGl2ZS5jbG9zZSgpOwogICAgdmFyIGNvbXBsZXRpb24gPSB0aGlzLnN0YXRlLmNvbXBsZXRpb25BY3RpdmUgPSBuZXcgQ29tcGxldGlvbih0aGlzLCBvcHRpb25zKTsKICAgIHZhciBnZXRIaW50cyA9IGNvbXBsZXRpb24ub3B0aW9ucy5oaW50OwogICAgaWYgKCFnZXRIaW50cykgcmV0dXJuOwoKICAgIENvZGVNaXJyb3Iuc2lnbmFsKHRoaXMsICJzdGFydENvbXBsZXRpb24iLCB0aGlzKTsKICAgIGlmIChnZXRIaW50cy5hc3luYykKICAgICAgZ2V0SGludHModGhpcywgZnVuY3Rpb24oaGludHMpIHsgY29tcGxldGlvbi5zaG93SGludHMoaGludHMpOyB9LCBjb21wbGV0aW9uLm9wdGlvbnMpOwogICAgZWxzZQogICAgICByZXR1cm4gY29tcGxldGlvbi5zaG93SGludHMoZ2V0SGludHModGhpcywgY29tcGxldGlvbi5vcHRpb25zKSk7CiAgfSk7CgogIGZ1bmN0aW9uIENvbXBsZXRpb24oY20sIG9wdGlvbnMpIHsKICAgIHRoaXMuY20gPSBjbTsKICAgIHRoaXMub3B0aW9ucyA9IHRoaXMuYnVpbGRPcHRpb25zKG9wdGlvbnMpOwogICAgdGhpcy53aWRnZXQgPSB0aGlzLm9uQ2xvc2UgPSBudWxsOwogIH0KCiAgQ29tcGxldGlvbi5wcm90b3R5cGUgPSB7CiAgICBjbG9zZTogZnVuY3Rpb24oKSB7CiAgICAgIGlmICghdGhpcy5hY3RpdmUoKSkgcmV0dXJuOwogICAgICB0aGlzLmNtLnN0YXRlLmNvbXBsZXRpb25BY3RpdmUgPSBudWxsOwoKICAgICAgaWYgKHRoaXMud2lkZ2V0KSB0aGlzLndpZGdldC5jbG9zZSgpOwogICAgICBpZiAodGhpcy5vbkNsb3NlKSB0aGlzLm9uQ2xvc2UoKTsKICAgICAgQ29kZU1pcnJvci5zaWduYWwodGhpcy5jbSwgImVuZENvbXBsZXRpb24iLCB0aGlzLmNtKTsKICAgIH0sCgogICAgYWN0aXZlOiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHRoaXMuY20uc3RhdGUuY29tcGxldGlvbkFjdGl2ZSA9PSB0aGlzOwogICAgfSwKCiAgICBwaWNrOiBmdW5jdGlvbihkYXRhLCBpKSB7CiAgICAgIHZhciBjb21wbGV0aW9uID0gZGF0YS5saXN0W2ldOwogICAgICBpZiAoY29tcGxldGlvbi5oaW50KSBjb21wbGV0aW9uLmhpbnQodGhpcy5jbSwgZGF0YSwgY29tcGxldGlvbik7CiAgICAgIGVsc2UgdGhpcy5jbS5yZXBsYWNlUmFuZ2UoZ2V0VGV4dChjb21wbGV0aW9uKSwgY29tcGxldGlvbi5mcm9tIHx8IGRhdGEuZnJvbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uLnRvIHx8IGRhdGEudG8sICJjb21wbGV0ZSIpOwogICAgICBDb2RlTWlycm9yLnNpZ25hbChkYXRhLCAicGljayIsIGNvbXBsZXRpb24pOwogICAgICB0aGlzLmNsb3NlKCk7CiAgICB9LAoKICAgIHNob3dIaW50czogZnVuY3Rpb24oZGF0YSkgewogICAgICBpZiAoIWRhdGEgfHwgIWRhdGEubGlzdC5sZW5ndGggfHwgIXRoaXMuYWN0aXZlKCkpIHJldHVybiB0aGlzLmNsb3NlKCk7CgogICAgICBpZiAodGhpcy5vcHRpb25zLmNvbXBsZXRlU2luZ2xlICYmIGRhdGEubGlzdC5sZW5ndGggPT0gMSkKICAgICAgICB0aGlzLnBpY2soZGF0YSwgMCk7CiAgICAgIGVsc2UKICAgICAgICB0aGlzLnNob3dXaWRnZXQoZGF0YSk7CiAgICB9LAoKICAgIHNob3dXaWRnZXQ6IGZ1bmN0aW9uKGRhdGEpIHsKICAgICAgdGhpcy53aWRnZXQgPSBuZXcgV2lkZ2V0KHRoaXMsIGRhdGEpOwogICAgICBDb2RlTWlycm9yLnNpZ25hbChkYXRhLCAic2hvd24iKTsKCiAgICAgIHZhciBkZWJvdW5jZSA9IDAsIGNvbXBsZXRpb24gPSB0aGlzLCBmaW5pc2hlZDsKICAgICAgdmFyIGNsb3NlT24gPSB0aGlzLm9wdGlvbnMuY2xvc2VDaGFyYWN0ZXJzOwogICAgICB2YXIgc3RhcnRQb3MgPSB0aGlzLmNtLmdldEN1cnNvcigpLCBzdGFydExlbiA9IHRoaXMuY20uZ2V0TGluZShzdGFydFBvcy5saW5lKS5sZW5ndGg7CgogICAgICB2YXIgcmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSB8fCBmdW5jdGlvbihmbikgewogICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZuLCAxMDAwLzYwKTsKICAgICAgfTsKICAgICAgdmFyIGNhbmNlbEFuaW1hdGlvbkZyYW1lID0gd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lIHx8IGNsZWFyVGltZW91dDsKCiAgICAgIGZ1bmN0aW9uIGRvbmUoKSB7CiAgICAgICAgaWYgKGZpbmlzaGVkKSByZXR1cm47CiAgICAgICAgZmluaXNoZWQgPSB0cnVlOwogICAgICAgIGNvbXBsZXRpb24uY2xvc2UoKTsKICAgICAgICBjb21wbGV0aW9uLmNtLm9mZigiY3Vyc29yQWN0aXZpdHkiLCBhY3Rpdml0eSk7CiAgICAgICAgaWYgKGRhdGEpIENvZGVNaXJyb3Iuc2lnbmFsKGRhdGEsICJjbG9zZSIpOwogICAgICB9CgogICAgICBmdW5jdGlvbiB1cGRhdGUoKSB7CiAgICAgICAgaWYgKGZpbmlzaGVkKSByZXR1cm47CiAgICAgICAgQ29kZU1pcnJvci5zaWduYWwoZGF0YSwgInVwZGF0ZSIpOwogICAgICAgIHZhciBnZXRIaW50cyA9IGNvbXBsZXRpb24ub3B0aW9ucy5oaW50OwogICAgICAgIGlmIChnZXRIaW50cy5hc3luYykKICAgICAgICAgIGdldEhpbnRzKGNvbXBsZXRpb24uY20sIGZpbmlzaFVwZGF0ZSwgY29tcGxldGlvbi5vcHRpb25zKTsKICAgICAgICBlbHNlCiAgICAgICAgICBmaW5pc2hVcGRhdGUoZ2V0SGludHMoY29tcGxldGlvbi5jbSwgY29tcGxldGlvbi5vcHRpb25zKSk7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gZmluaXNoVXBkYXRlKGRhdGFfKSB7CiAgICAgICAgZGF0YSA9IGRhdGFfOwogICAgICAgIGlmIChmaW5pc2hlZCkgcmV0dXJuOwogICAgICAgIGlmICghZGF0YSB8fCAhZGF0YS5saXN0Lmxlbmd0aCkgcmV0dXJuIGRvbmUoKTsKICAgICAgICBpZiAoY29tcGxldGlvbi53aWRnZXQpIGNvbXBsZXRpb24ud2lkZ2V0LmNsb3NlKCk7CiAgICAgICAgY29tcGxldGlvbi53aWRnZXQgPSBuZXcgV2lkZ2V0KGNvbXBsZXRpb24sIGRhdGEpOwogICAgICB9CgogICAgICBmdW5jdGlvbiBjbGVhckRlYm91bmNlKCkgewogICAgICAgIGlmIChkZWJvdW5jZSkgewogICAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUoZGVib3VuY2UpOwogICAgICAgICAgZGVib3VuY2UgPSAwOwogICAgICAgIH0KICAgICAgfQoKICAgICAgZnVuY3Rpb24gYWN0aXZpdHkoKSB7CiAgICAgICAgY2xlYXJEZWJvdW5jZSgpOwogICAgICAgIHZhciBwb3MgPSBjb21wbGV0aW9uLmNtLmdldEN1cnNvcigpLCBsaW5lID0gY29tcGxldGlvbi5jbS5nZXRMaW5lKHBvcy5saW5lKTsKICAgICAgICBpZiAocG9zLmxpbmUgIT0gc3RhcnRQb3MubGluZSB8fCBsaW5lLmxlbmd0aCAtIHBvcy5jaCAhPSBzdGFydExlbiAtIHN0YXJ0UG9zLmNoIHx8CiAgICAgICAgICAgIHBvcy5jaCA8IHN0YXJ0UG9zLmNoIHx8IGNvbXBsZXRpb24uY20uc29tZXRoaW5nU2VsZWN0ZWQoKSB8fAogICAgICAgICAgICAocG9zLmNoICYmIGNsb3NlT24udGVzdChsaW5lLmNoYXJBdChwb3MuY2ggLSAxKSkpKSB7CiAgICAgICAgICBjb21wbGV0aW9uLmNsb3NlKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGRlYm91bmNlID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHVwZGF0ZSk7CiAgICAgICAgICBpZiAoY29tcGxldGlvbi53aWRnZXQpIGNvbXBsZXRpb24ud2lkZ2V0LmNsb3NlKCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHRoaXMuY20ub24oImN1cnNvckFjdGl2aXR5IiwgYWN0aXZpdHkpOwogICAgICB0aGlzLm9uQ2xvc2UgPSBkb25lOwogICAgfSwKCiAgICBidWlsZE9wdGlvbnM6IGZ1bmN0aW9uKG9wdGlvbnMpIHsKICAgICAgdmFyIGVkaXRvciA9IHRoaXMuY20ub3B0aW9ucy5oaW50T3B0aW9uczsKICAgICAgdmFyIG91dCA9IHt9OwogICAgICBmb3IgKHZhciBwcm9wIGluIGRlZmF1bHRPcHRpb25zKSBvdXRbcHJvcF0gPSBkZWZhdWx0T3B0aW9uc1twcm9wXTsKICAgICAgaWYgKGVkaXRvcikgZm9yICh2YXIgcHJvcCBpbiBlZGl0b3IpCiAgICAgICAgaWYgKGVkaXRvcltwcm9wXSAhPT0gdW5kZWZpbmVkKSBvdXRbcHJvcF0gPSBlZGl0b3JbcHJvcF07CiAgICAgIGlmIChvcHRpb25zKSBmb3IgKHZhciBwcm9wIGluIG9wdGlvbnMpCiAgICAgICAgaWYgKG9wdGlvbnNbcHJvcF0gIT09IHVuZGVmaW5lZCkgb3V0W3Byb3BdID0gb3B0aW9uc1twcm9wXTsKICAgICAgcmV0dXJuIG91dDsKICAgIH0KICB9OwoKICBmdW5jdGlvbiBnZXRUZXh0KGNvbXBsZXRpb24pIHsKICAgIGlmICh0eXBlb2YgY29tcGxldGlvbiA9PSAic3RyaW5nIikgcmV0dXJuIGNvbXBsZXRpb247CiAgICBlbHNlIHJldHVybiBjb21wbGV0aW9uLnRleHQ7CiAgfQoKICBmdW5jdGlvbiBidWlsZEtleU1hcChjb21wbGV0aW9uLCBoYW5kbGUpIHsKICAgIHZhciBiYXNlTWFwID0gewogICAgICBVcDogZnVuY3Rpb24oKSB7aGFuZGxlLm1vdmVGb2N1cygtMSk7fSwKICAgICAgRG93bjogZnVuY3Rpb24oKSB7aGFuZGxlLm1vdmVGb2N1cygxKTt9LAogICAgICBQYWdlVXA6IGZ1bmN0aW9uKCkge2hhbmRsZS5tb3ZlRm9jdXMoLWhhbmRsZS5tZW51U2l6ZSgpICsgMSwgdHJ1ZSk7fSwKICAgICAgUGFnZURvd246IGZ1bmN0aW9uKCkge2hhbmRsZS5tb3ZlRm9jdXMoaGFuZGxlLm1lbnVTaXplKCkgLSAxLCB0cnVlKTt9LAogICAgICBIb21lOiBmdW5jdGlvbigpIHtoYW5kbGUuc2V0Rm9jdXMoMCk7fSwKICAgICAgRW5kOiBmdW5jdGlvbigpIHtoYW5kbGUuc2V0Rm9jdXMoaGFuZGxlLmxlbmd0aCAtIDEpO30sCiAgICAgIEVudGVyOiBoYW5kbGUucGljaywKICAgICAgVGFiOiBoYW5kbGUucGljaywKICAgICAgRXNjOiBoYW5kbGUuY2xvc2UKICAgIH07CiAgICB2YXIgY3VzdG9tID0gY29tcGxldGlvbi5vcHRpb25zLmN1c3RvbUtleXM7CiAgICB2YXIgb3VyTWFwID0gY3VzdG9tID8ge30gOiBiYXNlTWFwOwogICAgZnVuY3Rpb24gYWRkQmluZGluZyhrZXksIHZhbCkgewogICAgICB2YXIgYm91bmQ7CiAgICAgIGlmICh0eXBlb2YgdmFsICE9ICJzdHJpbmciKQogICAgICAgIGJvdW5kID0gZnVuY3Rpb24oY20pIHsgcmV0dXJuIHZhbChjbSwgaGFuZGxlKTsgfTsKICAgICAgLy8gVGhpcyBtZWNoYW5pc20gaXMgZGVwcmVjYXRlZAogICAgICBlbHNlIGlmIChiYXNlTWFwLmhhc093blByb3BlcnR5KHZhbCkpCiAgICAgICAgYm91bmQgPSBiYXNlTWFwW3ZhbF07CiAgICAgIGVsc2UKICAgICAgICBib3VuZCA9IHZhbDsKICAgICAgb3VyTWFwW2tleV0gPSBib3VuZDsKICAgIH0KICAgIGlmIChjdXN0b20pCiAgICAgIGZvciAodmFyIGtleSBpbiBjdXN0b20pIGlmIChjdXN0b20uaGFzT3duUHJvcGVydHkoa2V5KSkKICAgICAgICBhZGRCaW5kaW5nKGtleSwgY3VzdG9tW2tleV0pOwogICAgdmFyIGV4dHJhID0gY29tcGxldGlvbi5vcHRpb25zLmV4dHJhS2V5czsKICAgIGlmIChleHRyYSkKICAgICAgZm9yICh2YXIga2V5IGluIGV4dHJhKSBpZiAoZXh0cmEuaGFzT3duUHJvcGVydHkoa2V5KSkKICAgICAgICBhZGRCaW5kaW5nKGtleSwgZXh0cmFba2V5XSk7CiAgICByZXR1cm4gb3VyTWFwOwogIH0KCiAgZnVuY3Rpb24gZ2V0SGludEVsZW1lbnQoaGludHNFbGVtZW50LCBlbCkgewogICAgd2hpbGUgKGVsICYmIGVsICE9IGhpbnRzRWxlbWVudCkgewogICAgICBpZiAoZWwubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gIkxJIiAmJiBlbC5wYXJlbnROb2RlID09IGhpbnRzRWxlbWVudCkgcmV0dXJuIGVsOwogICAgICBlbCA9IGVsLnBhcmVudE5vZGU7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBXaWRnZXQoY29tcGxldGlvbiwgZGF0YSkgewogICAgdGhpcy5jb21wbGV0aW9uID0gY29tcGxldGlvbjsKICAgIHRoaXMuZGF0YSA9IGRhdGE7CiAgICB2YXIgd2lkZ2V0ID0gdGhpcywgY20gPSBjb21wbGV0aW9uLmNtOwoKICAgIHZhciBoaW50cyA9IHRoaXMuaGludHMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJ1bCIpOwogICAgaGludHMuY2xhc3NOYW1lID0gIkNvZGVNaXJyb3ItaGludHMiOwogICAgdGhpcy5zZWxlY3RlZEhpbnQgPSBkYXRhLnNlbGVjdGVkSGludCB8fCAwOwoKICAgIHZhciBjb21wbGV0aW9ucyA9IGRhdGEubGlzdDsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY29tcGxldGlvbnMubGVuZ3RoOyArK2kpIHsKICAgICAgdmFyIGVsdCA9IGhpbnRzLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImxpIikpLCBjdXIgPSBjb21wbGV0aW9uc1tpXTsKICAgICAgdmFyIGNsYXNzTmFtZSA9IEhJTlRfRUxFTUVOVF9DTEFTUyArIChpICE9IHRoaXMuc2VsZWN0ZWRIaW50ID8gIiIgOiAiICIgKyBBQ1RJVkVfSElOVF9FTEVNRU5UX0NMQVNTKTsKICAgICAgaWYgKGN1ci5jbGFzc05hbWUgIT0gbnVsbCkgY2xhc3NOYW1lID0gY3VyLmNsYXNzTmFtZSArICIgIiArIGNsYXNzTmFtZTsKICAgICAgZWx0LmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKICAgICAgaWYgKGN1ci5yZW5kZXIpIGN1ci5yZW5kZXIoZWx0LCBkYXRhLCBjdXIpOwogICAgICBlbHNlIGVsdC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjdXIuZGlzcGxheVRleHQgfHwgZ2V0VGV4dChjdXIpKSk7CiAgICAgIGVsdC5oaW50SWQgPSBpOwogICAgfQoKICAgIHZhciBwb3MgPSBjbS5jdXJzb3JDb29yZHMoY29tcGxldGlvbi5vcHRpb25zLmFsaWduV2l0aFdvcmQgPyBkYXRhLmZyb20gOiBudWxsKTsKICAgIHZhciBsZWZ0ID0gcG9zLmxlZnQsIHRvcCA9IHBvcy5ib3R0b20sIGJlbG93ID0gdHJ1ZTsKICAgIGhpbnRzLnN0eWxlLmxlZnQgPSBsZWZ0ICsgInB4IjsKICAgIGhpbnRzLnN0eWxlLnRvcCA9IHRvcCArICJweCI7CiAgICAvLyBJZiB3ZSdyZSBhdCB0aGUgZWRnZSBvZiB0aGUgc2NyZWVuLCB0aGVuIHdlIHdhbnQgdGhlIG1lbnUgdG8gYXBwZWFyIG9uIHRoZSBsZWZ0IG9mIHRoZSBjdXJzb3IuCiAgICB2YXIgd2luVyA9IHdpbmRvdy5pbm5lcldpZHRoIHx8IE1hdGgubWF4KGRvY3VtZW50LmJvZHkub2Zmc2V0V2lkdGgsIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5vZmZzZXRXaWR0aCk7CiAgICB2YXIgd2luSCA9IHdpbmRvdy5pbm5lckhlaWdodCB8fCBNYXRoLm1heChkb2N1bWVudC5ib2R5Lm9mZnNldEhlaWdodCwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm9mZnNldEhlaWdodCk7CiAgICAoY29tcGxldGlvbi5vcHRpb25zLmNvbnRhaW5lciB8fCBkb2N1bWVudC5ib2R5KS5hcHBlbmRDaGlsZChoaW50cyk7CiAgICB2YXIgYm94ID0gaGludHMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIG92ZXJsYXBZID0gYm94LmJvdHRvbSAtIHdpbkg7CiAgICBpZiAob3ZlcmxhcFkgPiAwKSB7CiAgICAgIHZhciBoZWlnaHQgPSBib3guYm90dG9tIC0gYm94LnRvcCwgY3VyVG9wID0gcG9zLnRvcCAtIChwb3MuYm90dG9tIC0gYm94LnRvcCk7CiAgICAgIGlmIChjdXJUb3AgLSBoZWlnaHQgPiAwKSB7IC8vIEZpdHMgYWJvdmUgY3Vyc29yCiAgICAgICAgaGludHMuc3R5bGUudG9wID0gKHRvcCA9IHBvcy50b3AgLSBoZWlnaHQpICsgInB4IjsKICAgICAgICBiZWxvdyA9IGZhbHNlOwogICAgICB9IGVsc2UgaWYgKGhlaWdodCA+IHdpbkgpIHsKICAgICAgICBoaW50cy5zdHlsZS5oZWlnaHQgPSAod2luSCAtIDUpICsgInB4IjsKICAgICAgICBoaW50cy5zdHlsZS50b3AgPSAodG9wID0gcG9zLmJvdHRvbSAtIGJveC50b3ApICsgInB4IjsKICAgICAgICB2YXIgY3Vyc29yID0gY20uZ2V0Q3Vyc29yKCk7CiAgICAgICAgaWYgKGRhdGEuZnJvbS5jaCAhPSBjdXJzb3IuY2gpIHsKICAgICAgICAgIHBvcyA9IGNtLmN1cnNvckNvb3JkcyhjdXJzb3IpOwogICAgICAgICAgaGludHMuc3R5bGUubGVmdCA9IChsZWZ0ID0gcG9zLmxlZnQpICsgInB4IjsKICAgICAgICAgIGJveCA9IGhpbnRzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgdmFyIG92ZXJsYXBYID0gYm94LmxlZnQgLSB3aW5XOwogICAgaWYgKG92ZXJsYXBYID4gMCkgewogICAgICBpZiAoYm94LnJpZ2h0IC0gYm94LmxlZnQgPiB3aW5XKSB7CiAgICAgICAgaGludHMuc3R5bGUud2lkdGggPSAod2luVyAtIDUpICsgInB4IjsKICAgICAgICBvdmVybGFwWCAtPSAoYm94LnJpZ2h0IC0gYm94LmxlZnQpIC0gd2luVzsKICAgICAgfQogICAgICBoaW50cy5zdHlsZS5sZWZ0ID0gKGxlZnQgPSBwb3MubGVmdCAtIG92ZXJsYXBYKSArICJweCI7CiAgICB9CgogICAgY20uYWRkS2V5TWFwKHRoaXMua2V5TWFwID0gYnVpbGRLZXlNYXAoY29tcGxldGlvbiwgewogICAgICBtb3ZlRm9jdXM6IGZ1bmN0aW9uKG4sIGF2b2lkV3JhcCkgeyB3aWRnZXQuY2hhbmdlQWN0aXZlKHdpZGdldC5zZWxlY3RlZEhpbnQgKyBuLCBhdm9pZFdyYXApOyB9LAogICAgICBzZXRGb2N1czogZnVuY3Rpb24obikgeyB3aWRnZXQuY2hhbmdlQWN0aXZlKG4pOyB9LAogICAgICBtZW51U2l6ZTogZnVuY3Rpb24oKSB7IHJldHVybiB3aWRnZXQuc2NyZWVuQW1vdW50KCk7IH0sCiAgICAgIGxlbmd0aDogY29tcGxldGlvbnMubGVuZ3RoLAogICAgICBjbG9zZTogZnVuY3Rpb24oKSB7IGNvbXBsZXRpb24uY2xvc2UoKTsgfSwKICAgICAgcGljazogZnVuY3Rpb24oKSB7IHdpZGdldC5waWNrKCk7IH0sCiAgICAgIGRhdGE6IGRhdGEKICAgIH0pKTsKCiAgICBpZiAoY29tcGxldGlvbi5vcHRpb25zLmNsb3NlT25VbmZvY3VzKSB7CiAgICAgIHZhciBjbG9zaW5nT25CbHVyOwogICAgICBjbS5vbigiYmx1ciIsIHRoaXMub25CbHVyID0gZnVuY3Rpb24oKSB7IGNsb3NpbmdPbkJsdXIgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyBjb21wbGV0aW9uLmNsb3NlKCk7IH0sIDEwMCk7IH0pOwogICAgICBjbS5vbigiZm9jdXMiLCB0aGlzLm9uRm9jdXMgPSBmdW5jdGlvbigpIHsgY2xlYXJUaW1lb3V0KGNsb3NpbmdPbkJsdXIpOyB9KTsKICAgIH0KCiAgICB2YXIgc3RhcnRTY3JvbGwgPSBjbS5nZXRTY3JvbGxJbmZvKCk7CiAgICBjbS5vbigic2Nyb2xsIiwgdGhpcy5vblNjcm9sbCA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgY3VyU2Nyb2xsID0gY20uZ2V0U2Nyb2xsSW5mbygpLCBlZGl0b3IgPSBjbS5nZXRXcmFwcGVyRWxlbWVudCgpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICB2YXIgbmV3VG9wID0gdG9wICsgc3RhcnRTY3JvbGwudG9wIC0gY3VyU2Nyb2xsLnRvcDsKICAgICAgdmFyIHBvaW50ID0gbmV3VG9wIC0gKHdpbmRvdy5wYWdlWU9mZnNldCB8fCAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IHx8IGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCk7CiAgICAgIGlmICghYmVsb3cpIHBvaW50ICs9IGhpbnRzLm9mZnNldEhlaWdodDsKICAgICAgaWYgKHBvaW50IDw9IGVkaXRvci50b3AgfHwgcG9pbnQgPj0gZWRpdG9yLmJvdHRvbSkgcmV0dXJuIGNvbXBsZXRpb24uY2xvc2UoKTsKICAgICAgaGludHMuc3R5bGUudG9wID0gbmV3VG9wICsgInB4IjsKICAgICAgaGludHMuc3R5bGUubGVmdCA9IChsZWZ0ICsgc3RhcnRTY3JvbGwubGVmdCAtIGN1clNjcm9sbC5sZWZ0KSArICJweCI7CiAgICB9KTsKCiAgICBDb2RlTWlycm9yLm9uKGhpbnRzLCAiZGJsY2xpY2siLCBmdW5jdGlvbihlKSB7CiAgICAgIHZhciB0ID0gZ2V0SGludEVsZW1lbnQoaGludHMsIGUudGFyZ2V0IHx8IGUuc3JjRWxlbWVudCk7CiAgICAgIGlmICh0ICYmIHQuaGludElkICE9IG51bGwpIHt3aWRnZXQuY2hhbmdlQWN0aXZlKHQuaGludElkKTsgd2lkZ2V0LnBpY2soKTt9CiAgICB9KTsKCiAgICBDb2RlTWlycm9yLm9uKGhpbnRzLCAiY2xpY2siLCBmdW5jdGlvbihlKSB7CiAgICAgIHZhciB0ID0gZ2V0SGludEVsZW1lbnQoaGludHMsIGUudGFyZ2V0IHx8IGUuc3JjRWxlbWVudCk7CiAgICAgIGlmICh0ICYmIHQuaGludElkICE9IG51bGwpIHsKICAgICAgICB3aWRnZXQuY2hhbmdlQWN0aXZlKHQuaGludElkKTsKICAgICAgICBpZiAoY29tcGxldGlvbi5vcHRpb25zLmNvbXBsZXRlT25TaW5nbGVDbGljaykgd2lkZ2V0LnBpY2soKTsKICAgICAgfQogICAgfSk7CgogICAgQ29kZU1pcnJvci5vbihoaW50cywgIm1vdXNlZG93biIsIGZ1bmN0aW9uKCkgewogICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Y20uZm9jdXMoKTt9LCAyMCk7CiAgICB9KTsKCiAgICBDb2RlTWlycm9yLnNpZ25hbChkYXRhLCAic2VsZWN0IiwgY29tcGxldGlvbnNbMF0sIGhpbnRzLmZpcnN0Q2hpbGQpOwogICAgcmV0dXJuIHRydWU7CiAgfQoKICBXaWRnZXQucHJvdG90eXBlID0gewogICAgY2xvc2U6IGZ1bmN0aW9uKCkgewogICAgICBpZiAodGhpcy5jb21wbGV0aW9uLndpZGdldCAhPSB0aGlzKSByZXR1cm47CiAgICAgIHRoaXMuY29tcGxldGlvbi53aWRnZXQgPSBudWxsOwogICAgICB0aGlzLmhpbnRzLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5oaW50cyk7CiAgICAgIHRoaXMuY29tcGxldGlvbi5jbS5yZW1vdmVLZXlNYXAodGhpcy5rZXlNYXApOwoKICAgICAgdmFyIGNtID0gdGhpcy5jb21wbGV0aW9uLmNtOwogICAgICBpZiAodGhpcy5jb21wbGV0aW9uLm9wdGlvbnMuY2xvc2VPblVuZm9jdXMpIHsKICAgICAgICBjbS5vZmYoImJsdXIiLCB0aGlzLm9uQmx1cik7CiAgICAgICAgY20ub2ZmKCJmb2N1cyIsIHRoaXMub25Gb2N1cyk7CiAgICAgIH0KICAgICAgY20ub2ZmKCJzY3JvbGwiLCB0aGlzLm9uU2Nyb2xsKTsKICAgIH0sCgogICAgcGljazogZnVuY3Rpb24oKSB7CiAgICAgIHRoaXMuY29tcGxldGlvbi5waWNrKHRoaXMuZGF0YSwgdGhpcy5zZWxlY3RlZEhpbnQpOwogICAgfSwKCiAgICBjaGFuZ2VBY3RpdmU6IGZ1bmN0aW9uKGksIGF2b2lkV3JhcCkgewogICAgICBpZiAoaSA+PSB0aGlzLmRhdGEubGlzdC5sZW5ndGgpCiAgICAgICAgaSA9IGF2b2lkV3JhcCA/IHRoaXMuZGF0YS5saXN0Lmxlbmd0aCAtIDEgOiAwOwogICAgICBlbHNlIGlmIChpIDwgMCkKICAgICAgICBpID0gYXZvaWRXcmFwID8gMCAgOiB0aGlzLmRhdGEubGlzdC5sZW5ndGggLSAxOwogICAgICBpZiAodGhpcy5zZWxlY3RlZEhpbnQgPT0gaSkgcmV0dXJuOwogICAgICB2YXIgbm9kZSA9IHRoaXMuaGludHMuY2hpbGROb2Rlc1t0aGlzLnNlbGVjdGVkSGludF07CiAgICAgIG5vZGUuY2xhc3NOYW1lID0gbm9kZS5jbGFzc05hbWUucmVwbGFjZSgiICIgKyBBQ1RJVkVfSElOVF9FTEVNRU5UX0NMQVNTLCAiIik7CiAgICAgIG5vZGUgPSB0aGlzLmhpbnRzLmNoaWxkTm9kZXNbdGhpcy5zZWxlY3RlZEhpbnQgPSBpXTsKICAgICAgbm9kZS5jbGFzc05hbWUgKz0gIiAiICsgQUNUSVZFX0hJTlRfRUxFTUVOVF9DTEFTUzsKICAgICAgaWYgKG5vZGUub2Zmc2V0VG9wIDwgdGhpcy5oaW50cy5zY3JvbGxUb3ApCiAgICAgICAgdGhpcy5oaW50cy5zY3JvbGxUb3AgPSBub2RlLm9mZnNldFRvcCAtIDM7CiAgICAgIGVsc2UgaWYgKG5vZGUub2Zmc2V0VG9wICsgbm9kZS5vZmZzZXRIZWlnaHQgPiB0aGlzLmhpbnRzLnNjcm9sbFRvcCArIHRoaXMuaGludHMuY2xpZW50SGVpZ2h0KQogICAgICAgIHRoaXMuaGludHMuc2Nyb2xsVG9wID0gbm9kZS5vZmZzZXRUb3AgKyBub2RlLm9mZnNldEhlaWdodCAtIHRoaXMuaGludHMuY2xpZW50SGVpZ2h0ICsgMzsKICAgICAgQ29kZU1pcnJvci5zaWduYWwodGhpcy5kYXRhLCAic2VsZWN0IiwgdGhpcy5kYXRhLmxpc3RbdGhpcy5zZWxlY3RlZEhpbnRdLCBub2RlKTsKICAgIH0sCgogICAgc2NyZWVuQW1vdW50OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIE1hdGguZmxvb3IodGhpcy5oaW50cy5jbGllbnRIZWlnaHQgLyB0aGlzLmhpbnRzLmZpcnN0Q2hpbGQub2Zmc2V0SGVpZ2h0KSB8fCAxOwogICAgfQogIH07CgogIENvZGVNaXJyb3IucmVnaXN0ZXJIZWxwZXIoImhpbnQiLCAiYXV0byIsIGZ1bmN0aW9uKGNtLCBvcHRpb25zKSB7CiAgICB2YXIgaGVscGVycyA9IGNtLmdldEhlbHBlcnMoY20uZ2V0Q3Vyc29yKCksICJoaW50IiksIHdvcmRzOwogICAgaWYgKGhlbHBlcnMubGVuZ3RoKSB7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaGVscGVycy5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciBjdXIgPSBoZWxwZXJzW2ldKGNtLCBvcHRpb25zKTsKICAgICAgICBpZiAoY3VyICYmIGN1ci5saXN0Lmxlbmd0aCkgcmV0dXJuIGN1cjsKICAgICAgfQogICAgfSBlbHNlIGlmICh3b3JkcyA9IGNtLmdldEhlbHBlcihjbS5nZXRDdXJzb3IoKSwgImhpbnRXb3JkcyIpKSB7CiAgICAgIGlmICh3b3JkcykgcmV0dXJuIENvZGVNaXJyb3IuaGludC5mcm9tTGlzdChjbSwge3dvcmRzOiB3b3Jkc30pOwogICAgfSBlbHNlIGlmIChDb2RlTWlycm9yLmhpbnQuYW55d29yZCkgewogICAgICByZXR1cm4gQ29kZU1pcnJvci5oaW50LmFueXdvcmQoY20sIG9wdGlvbnMpOwogICAgfQogIH0pOwoKICBDb2RlTWlycm9yLnJlZ2lzdGVySGVscGVyKCJoaW50IiwgImZyb21MaXN0IiwgZnVuY3Rpb24oY20sIG9wdGlvbnMpIHsKICAgIHZhciBjdXIgPSBjbS5nZXRDdXJzb3IoKSwgdG9rZW4gPSBjbS5nZXRUb2tlbkF0KGN1cik7CiAgICB2YXIgZm91bmQgPSBbXTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb3B0aW9ucy53b3Jkcy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgd29yZCA9IG9wdGlvbnMud29yZHNbaV07CiAgICAgIGlmICh3b3JkLnNsaWNlKDAsIHRva2VuLnN0cmluZy5sZW5ndGgpID09IHRva2VuLnN0cmluZykKICAgICAgICBmb3VuZC5wdXNoKHdvcmQpOwogICAgfQoKICAgIGlmIChmb3VuZC5sZW5ndGgpIHJldHVybiB7CiAgICAgIGxpc3Q6IGZvdW5kLAogICAgICBmcm9tOiBDb2RlTWlycm9yLlBvcyhjdXIubGluZSwgdG9rZW4uc3RhcnQpLAogICAgICAgICAgICB0bzogQ29kZU1pcnJvci5Qb3MoY3VyLmxpbmUsIHRva2VuLmVuZCkKICAgIH07CiAgfSk7CgogIENvZGVNaXJyb3IuY29tbWFuZHMuYXV0b2NvbXBsZXRlID0gQ29kZU1pcnJvci5zaG93SGludDsKCiAgdmFyIGRlZmF1bHRPcHRpb25zID0gewogICAgaGludDogQ29kZU1pcnJvci5oaW50LmF1dG8sCiAgICBjb21wbGV0ZVNpbmdsZTogdHJ1ZSwKICAgIGFsaWduV2l0aFdvcmQ6IHRydWUsCiAgICBjbG9zZUNoYXJhY3RlcnM6IC9bXHMoKVxbXF17fTs6PixdLywKICAgIGNsb3NlT25VbmZvY3VzOiB0cnVlLAogICAgY29tcGxldGVPblNpbmdsZUNsaWNrOiBmYWxzZSwKICAgIGNvbnRhaW5lcjogbnVsbCwKICAgIGN1c3RvbUtleXM6IG51bGwsCiAgICBleHRyYUtleXM6IG51bGwKICB9OwoKICBDb2RlTWlycm9yLmRlZmluZU9wdGlvbigiaGludE9wdGlvbnMiLCBudWxsKTsKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/hint/sql-hint.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSwgcmVxdWlyZSgiLi4vLi4vbW9kZS9zcWwvc3FsIikpOwogIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kKSAvLyBBTUQKICAgIGRlZmluZShbIi4uLy4uL2xpYi9jb2RlbWlycm9yIiwgIi4uLy4uL21vZGUvc3FsL3NxbCJdLCBtb2QpOwogIGVsc2UgLy8gUGxhaW4gYnJvd3NlciBlbnYKICAgIG1vZChDb2RlTWlycm9yKTsKfSkoZnVuY3Rpb24oQ29kZU1pcnJvcikgewogICJ1c2Ugc3RyaWN0IjsKCiAgdmFyIHRhYmxlczsKICB2YXIga2V5d29yZHM7CiAgdmFyIENPTlMgPSB7CiAgICBRVUVSWV9ESVY6ICI7IiwKICAgIEFMSUFTX0tFWVdPUkQ6ICJBUyIKICB9OwogIHZhciBQb3MgPSBDb2RlTWlycm9yLlBvczsKCiAgZnVuY3Rpb24gZ2V0S2V5d29yZHMoZWRpdG9yKSB7CiAgICB2YXIgbW9kZSA9IGVkaXRvci5kb2MubW9kZU9wdGlvbjsKICAgIGlmKG1vZGUgPT09ICJzcWwiKSBtb2RlID0gInRleHQveC1zcWwiOwogICAgcmV0dXJuIENvZGVNaXJyb3IucmVzb2x2ZU1vZGUobW9kZSkua2V5d29yZHM7CiAgfQoKICBmdW5jdGlvbiBtYXRjaChzdHJpbmcsIHdvcmQpIHsKICAgIHZhciBsZW4gPSBzdHJpbmcubGVuZ3RoOwogICAgdmFyIHN1YiA9IHdvcmQuc3Vic3RyKDAsIGxlbik7CiAgICByZXR1cm4gc3RyaW5nLnRvVXBwZXJDYXNlKCkgPT09IHN1Yi50b1VwcGVyQ2FzZSgpOwogIH0KCiAgZnVuY3Rpb24gYWRkTWF0Y2hlcyhyZXN1bHQsIHNlYXJjaCwgd29yZGxpc3QsIGZvcm1hdHRlcikgewogICAgZm9yKHZhciB3b3JkIGluIHdvcmRsaXN0KSB7CiAgICAgIGlmKCF3b3JkbGlzdC5oYXNPd25Qcm9wZXJ0eSh3b3JkKSkgY29udGludWU7CiAgICAgIGlmKEFycmF5LmlzQXJyYXkod29yZGxpc3QpKSB7CiAgICAgICAgd29yZCA9IHdvcmRsaXN0W3dvcmRdOwogICAgICB9CiAgICAgIGlmKG1hdGNoKHNlYXJjaCwgd29yZCkpIHsKICAgICAgICByZXN1bHQucHVzaChmb3JtYXR0ZXIod29yZCkpOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBjb2x1bW5Db21wbGV0aW9uKHJlc3VsdCwgZWRpdG9yKSB7CiAgICB2YXIgY3VyID0gZWRpdG9yLmdldEN1cnNvcigpOwogICAgdmFyIHRva2VuID0gZWRpdG9yLmdldFRva2VuQXQoY3VyKTsKICAgIHZhciBzdHJpbmcgPSB0b2tlbi5zdHJpbmcuc3Vic3RyKDEpOwogICAgdmFyIHByZXZDdXIgPSBQb3MoY3VyLmxpbmUsIHRva2VuLnN0YXJ0KTsKICAgIHZhciB0YWJsZSA9IGVkaXRvci5nZXRUb2tlbkF0KHByZXZDdXIpLnN0cmluZzsKICAgIGlmKCAhdGFibGVzLmhhc093blByb3BlcnR5KCB0YWJsZSApICl7CiAgICAgIHRhYmxlID0gZmluZFRhYmxlQnlBbGlhcyh0YWJsZSwgZWRpdG9yKTsKICAgIH0KICAgIHZhciBjb2x1bW5zID0gdGFibGVzW3RhYmxlXTsKICAgIGlmKCFjb2x1bW5zKSB7CiAgICAgIHJldHVybjsKICAgIH0KICAgIGFkZE1hdGNoZXMocmVzdWx0LCBzdHJpbmcsIGNvbHVtbnMsCiAgICAgICAgZnVuY3Rpb24odykge3JldHVybiAiLiIgKyB3O30pOwogIH0KCiAgZnVuY3Rpb24gZWFjaFdvcmQobGluZVRleHQsIGYpIHsKICAgIGlmKCAhbGluZVRleHQgKXtyZXR1cm47fQogICAgdmFyIGV4Y2VwdGVkID0gL1ssO10vZzsKICAgIHZhciB3b3JkcyA9IGxpbmVUZXh0LnNwbGl0KCAiICIgKTsKICAgIGZvciggdmFyIGkgPSAwOyBpIDwgd29yZHMubGVuZ3RoOyBpKysgKXsKICAgICAgZiggd29yZHNbaV0/d29yZHNbaV0ucmVwbGFjZSggZXhjZXB0ZWQsICcnICkgOiAnJyApOwogICAgfQogIH0KCiAgZnVuY3Rpb24gY29udmVydEN1clRvTnVtYmVyKCBjdXIgKXsKICAgIC8vIG1heCBjaGFyYWN0ZXJzIG9mIGEgbGluZSBpcyA5OTksOTk5LgogICAgcmV0dXJuIGN1ci5saW5lICsgY3VyLmNoIC8gTWF0aC5wb3coIDEwLCA2ICk7CiAgfQoKICBmdW5jdGlvbiBjb252ZXJ0TnVtYmVyVG9DdXIoIG51bSApewogICAgcmV0dXJuIFBvcyhNYXRoLmZsb29yKCBudW0gKSwgK251bS50b1N0cmluZygpLnNwbGl0KCAnLicgKS5wb3AoKSk7CiAgfQoKICBmdW5jdGlvbiBmaW5kVGFibGVCeUFsaWFzKGFsaWFzLCBlZGl0b3IpIHsKICAgIHZhciBkb2MgPSBlZGl0b3IuZG9jOwogICAgdmFyIGZ1bGxRdWVyeSA9IGRvYy5nZXRWYWx1ZSgpOwogICAgdmFyIGFsaWFzVXBwZXJDYXNlID0gYWxpYXMudG9VcHBlckNhc2UoKTsKICAgIHZhciBwcmV2aW91c1dvcmQgPSAiIjsKICAgIHZhciB0YWJsZSA9ICIiOwogICAgdmFyIHNlcGFyYXRvciA9IFtdOwogICAgdmFyIHZhbGlkUmFuZ2UgPSB7CiAgICAgIHN0YXJ0OiBQb3MoIDAsIDAgKSwKICAgICAgZW5kOiBQb3MoIGVkaXRvci5sYXN0TGluZSgpLCBlZGl0b3IuZ2V0TGluZUhhbmRsZSggZWRpdG9yLmxhc3RMaW5lKCkgKS5sZW5ndGggKQogICAgfTsKCiAgICAvL2FkZCBzZXBhcmF0b3IKICAgIHZhciBpbmRleE9mU2VwYXJhdG9yID0gZnVsbFF1ZXJ5LmluZGV4T2YoIENPTlMuUVVFUllfRElWICk7CiAgICB3aGlsZSggaW5kZXhPZlNlcGFyYXRvciAhPSAtMSApewogICAgICBzZXBhcmF0b3IucHVzaCggZG9jLnBvc0Zyb21JbmRleChpbmRleE9mU2VwYXJhdG9yKSk7CiAgICAgIGluZGV4T2ZTZXBhcmF0b3IgPSBmdWxsUXVlcnkuaW5kZXhPZiggQ09OUy5RVUVSWV9ESVYsIGluZGV4T2ZTZXBhcmF0b3IrMSk7CiAgICB9CiAgICBzZXBhcmF0b3IudW5zaGlmdCggUG9zKCAwLCAwICkgKTsKICAgIHNlcGFyYXRvci5wdXNoKCBQb3MoIGVkaXRvci5sYXN0TGluZSgpLCBlZGl0b3IuZ2V0TGluZUhhbmRsZSggZWRpdG9yLmxhc3RMaW5lKCkgKS50ZXh0Lmxlbmd0aCApICk7CgogICAgLy9maW5kIHZhbGllUmFuZ2UKICAgIHZhciBwcmV2SXRlbSA9IDA7CiAgICB2YXIgY3VycmVudCA9IGNvbnZlcnRDdXJUb051bWJlciggZWRpdG9yLmdldEN1cnNvcigpICk7CiAgICBmb3IoIHZhciBpPTA7IGk8IHNlcGFyYXRvci5sZW5ndGg7IGkrKyl7CiAgICAgIHZhciBfdiA9IGNvbnZlcnRDdXJUb051bWJlciggc2VwYXJhdG9yW2ldICk7CiAgICAgIGlmKCBjdXJyZW50ID4gcHJldkl0ZW0gJiYgY3VycmVudCA8PSBfdiApewogICAgICAgIHZhbGlkUmFuZ2UgPSB7IHN0YXJ0OiBjb252ZXJ0TnVtYmVyVG9DdXIoIHByZXZJdGVtICksIGVuZDogY29udmVydE51bWJlclRvQ3VyKCBfdiApIH07CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgcHJldkl0ZW0gPSBfdjsKICAgIH0KCiAgICB2YXIgcXVlcnkgPSBkb2MuZ2V0UmFuZ2UodmFsaWRSYW5nZS5zdGFydCwgdmFsaWRSYW5nZS5lbmQsIGZhbHNlKTsKCiAgICBmb3IodmFyIGk9MDsgaSA8IHF1ZXJ5Lmxlbmd0aDsgaSsrKXsKICAgICAgdmFyIGxpbmVUZXh0ID0gcXVlcnlbaV07CiAgICAgIGVhY2hXb3JkKCBsaW5lVGV4dCwgZnVuY3Rpb24oIHdvcmQgKXsKICAgICAgICB2YXIgd29yZFVwcGVyQ2FzZSA9IHdvcmQudG9VcHBlckNhc2UoKTsKICAgICAgICBpZiggd29yZFVwcGVyQ2FzZSA9PT0gYWxpYXNVcHBlckNhc2UgJiYgdGFibGVzLmhhc093blByb3BlcnR5KCBwcmV2aW91c1dvcmQgKSApewogICAgICAgICAgICB0YWJsZSA9IHByZXZpb3VzV29yZDsKICAgICAgICB9CiAgICAgICAgaWYoIHdvcmRVcHBlckNhc2UgIT09IENPTlMuQUxJQVNfS0VZV09SRCApewogICAgICAgICAgcHJldmlvdXNXb3JkID0gd29yZDsKICAgICAgICB9CiAgICAgIH0pOwogICAgICBpZiggdGFibGUgKXsgYnJlYWs7IH0KICAgIH0KICAgIHJldHVybiB0YWJsZTsKICB9CgogIGZ1bmN0aW9uIHNxbEhpbnQoZWRpdG9yLCBvcHRpb25zKSB7CiAgICB0YWJsZXMgPSAob3B0aW9ucyAmJiBvcHRpb25zLnRhYmxlcykgfHwge307CiAgICBrZXl3b3JkcyA9IGtleXdvcmRzIHx8IGdldEtleXdvcmRzKGVkaXRvcik7CiAgICB2YXIgY3VyID0gZWRpdG9yLmdldEN1cnNvcigpOwogICAgdmFyIHRva2VuID0gZWRpdG9yLmdldFRva2VuQXQoY3VyKSwgZW5kID0gdG9rZW4uZW5kOwogICAgdmFyIHJlc3VsdCA9IFtdOwogICAgdmFyIHNlYXJjaCA9IHRva2VuLnN0cmluZy50cmltKCk7CgogICAgaWYgKHNlYXJjaC5jaGFyQXQoMCkgPT0gIi4iKSB7CiAgICAgIGNvbHVtbkNvbXBsZXRpb24ocmVzdWx0LCBlZGl0b3IpOwogICAgICBpZiAoIXJlc3VsdC5sZW5ndGgpIHsKICAgICAgICB3aGlsZSAodG9rZW4uc3RhcnQgJiYgc2VhcmNoLmNoYXJBdCgwKSA9PSAiLiIpIHsKICAgICAgICAgIHRva2VuID0gZWRpdG9yLmdldFRva2VuQXQoUG9zKGN1ci5saW5lLCB0b2tlbi5zdGFydCAtIDEpKTsKICAgICAgICAgIHNlYXJjaCA9IHRva2VuLnN0cmluZyArIHNlYXJjaDsKICAgICAgICB9CiAgICAgICAgYWRkTWF0Y2hlcyhyZXN1bHQsIHNlYXJjaCwgdGFibGVzLAogICAgICAgICAgICAgICAgICAgZnVuY3Rpb24odykge3JldHVybiB3O30pOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBhZGRNYXRjaGVzKHJlc3VsdCwgc2VhcmNoLCBrZXl3b3JkcywKICAgICAgICAgICAgICAgICBmdW5jdGlvbih3KSB7cmV0dXJuIHcudG9VcHBlckNhc2UoKTt9KTsKICAgICAgYWRkTWF0Y2hlcyhyZXN1bHQsIHNlYXJjaCwgdGFibGVzLAogICAgICAgICAgICAgICAgIGZ1bmN0aW9uKHcpIHtyZXR1cm4gdzt9KTsKICAgIH0KCiAgICByZXR1cm4gewogICAgICBsaXN0OiByZXN1bHQsCiAgICAgICAgZnJvbTogUG9zKGN1ci5saW5lLCB0b2tlbi5zdGFydCksCiAgICAgICAgdG86IFBvcyhjdXIubGluZSwgZW5kKQogICAgfTsKICB9CiAgQ29kZU1pcnJvci5yZWdpc3RlckhlbHBlcigiaGludCIsICJzcWwiLCBzcWxIaW50KTsKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/hint/xml-hint.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CgogIHZhciBQb3MgPSBDb2RlTWlycm9yLlBvczsKCiAgZnVuY3Rpb24gZ2V0SGludHMoY20sIG9wdGlvbnMpIHsKICAgIHZhciB0YWdzID0gb3B0aW9ucyAmJiBvcHRpb25zLnNjaGVtYUluZm87CiAgICB2YXIgcXVvdGUgPSAob3B0aW9ucyAmJiBvcHRpb25zLnF1b3RlQ2hhcikgfHwgJyInOwogICAgaWYgKCF0YWdzKSByZXR1cm47CiAgICB2YXIgY3VyID0gY20uZ2V0Q3Vyc29yKCksIHRva2VuID0gY20uZ2V0VG9rZW5BdChjdXIpOwogICAgdmFyIGlubmVyID0gQ29kZU1pcnJvci5pbm5lck1vZGUoY20uZ2V0TW9kZSgpLCB0b2tlbi5zdGF0ZSk7CiAgICBpZiAoaW5uZXIubW9kZS5uYW1lICE9ICJ4bWwiKSByZXR1cm47CiAgICB2YXIgcmVzdWx0ID0gW10sIHJlcGxhY2VUb2tlbiA9IGZhbHNlLCBwcmVmaXg7CiAgICB2YXIgdGFnID0gL1xidGFnXGIvLnRlc3QodG9rZW4udHlwZSksIHRhZ05hbWUgPSB0YWcgJiYgL15cdy8udGVzdCh0b2tlbi5zdHJpbmcpLCB0YWdTdGFydDsKICAgIGlmICh0YWdOYW1lKSB7CiAgICAgIHZhciBiZWZvcmUgPSBjbS5nZXRMaW5lKGN1ci5saW5lKS5zbGljZShNYXRoLm1heCgwLCB0b2tlbi5zdGFydCAtIDIpLCB0b2tlbi5zdGFydCk7CiAgICAgIHZhciB0YWdUeXBlID0gLzxcLyQvLnRlc3QoYmVmb3JlKSA/ICJjbG9zZSIgOiAvPCQvLnRlc3QoYmVmb3JlKSA/ICJvcGVuIiA6IG51bGw7CiAgICAgIGlmICh0YWdUeXBlKSB0YWdTdGFydCA9IHRva2VuLnN0YXJ0IC0gKHRhZ1R5cGUgPT0gImNsb3NlIiA/IDIgOiAxKTsKICAgIH0gZWxzZSBpZiAodGFnICYmIHRva2VuLnN0cmluZyA9PSAiPCIpIHsKICAgICAgdGFnVHlwZSA9ICJvcGVuIjsKICAgIH0gZWxzZSBpZiAodGFnICYmIHRva2VuLnN0cmluZyA9PSAiPC8iKSB7CiAgICAgIHRhZ1R5cGUgPSAiY2xvc2UiOwogICAgfQogICAgaWYgKCF0YWcgJiYgIWlubmVyLnN0YXRlLnRhZ05hbWUgfHwgdGFnVHlwZSkgewogICAgICBpZiAodGFnTmFtZSkKICAgICAgICBwcmVmaXggPSB0b2tlbi5zdHJpbmc7CiAgICAgIHJlcGxhY2VUb2tlbiA9IHRhZ1R5cGU7CiAgICAgIHZhciBjeCA9IGlubmVyLnN0YXRlLmNvbnRleHQsIGN1clRhZyA9IGN4ICYmIHRhZ3NbY3gudGFnTmFtZV07CiAgICAgIHZhciBjaGlsZExpc3QgPSBjeCA/IGN1clRhZyAmJiBjdXJUYWcuY2hpbGRyZW4gOiB0YWdzWyIhdG9wIl07CiAgICAgIGlmIChjaGlsZExpc3QgJiYgdGFnVHlwZSAhPSAiY2xvc2UiKSB7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZExpc3QubGVuZ3RoOyArK2kpIGlmICghcHJlZml4IHx8IGNoaWxkTGlzdFtpXS5sYXN0SW5kZXhPZihwcmVmaXgsIDApID09IDApCiAgICAgICAgICByZXN1bHQucHVzaCgiPCIgKyBjaGlsZExpc3RbaV0pOwogICAgICB9IGVsc2UgaWYgKHRhZ1R5cGUgIT0gImNsb3NlIikgewogICAgICAgIGZvciAodmFyIG5hbWUgaW4gdGFncykKICAgICAgICAgIGlmICh0YWdzLmhhc093blByb3BlcnR5KG5hbWUpICYmIG5hbWUgIT0gIiF0b3AiICYmIG5hbWUgIT0gIiFhdHRycyIgJiYgKCFwcmVmaXggfHwgbmFtZS5sYXN0SW5kZXhPZihwcmVmaXgsIDApID09IDApKQogICAgICAgICAgICByZXN1bHQucHVzaCgiPCIgKyBuYW1lKTsKICAgICAgfQogICAgICBpZiAoY3ggJiYgKCFwcmVmaXggfHwgdGFnVHlwZSA9PSAiY2xvc2UiICYmIGN4LnRhZ05hbWUubGFzdEluZGV4T2YocHJlZml4LCAwKSA9PSAwKSkKICAgICAgICByZXN1bHQucHVzaCgiPC8iICsgY3gudGFnTmFtZSArICI+Iik7CiAgICB9IGVsc2UgewogICAgICAvLyBBdHRyaWJ1dGUgY29tcGxldGlvbgogICAgICB2YXIgY3VyVGFnID0gdGFnc1tpbm5lci5zdGF0ZS50YWdOYW1lXSwgYXR0cnMgPSBjdXJUYWcgJiYgY3VyVGFnLmF0dHJzOwogICAgICB2YXIgZ2xvYmFsQXR0cnMgPSB0YWdzWyIhYXR0cnMiXTsKICAgICAgaWYgKCFhdHRycyAmJiAhZ2xvYmFsQXR0cnMpIHJldHVybjsKICAgICAgaWYgKCFhdHRycykgewogICAgICAgIGF0dHJzID0gZ2xvYmFsQXR0cnM7CiAgICAgIH0gZWxzZSBpZiAoZ2xvYmFsQXR0cnMpIHsgLy8gQ29tYmluZSB0YWctbG9jYWwgYW5kIGdsb2JhbCBhdHRyaWJ1dGVzCiAgICAgICAgdmFyIHNldCA9IHt9OwogICAgICAgIGZvciAodmFyIG5tIGluIGdsb2JhbEF0dHJzKSBpZiAoZ2xvYmFsQXR0cnMuaGFzT3duUHJvcGVydHkobm0pKSBzZXRbbm1dID0gZ2xvYmFsQXR0cnNbbm1dOwogICAgICAgIGZvciAodmFyIG5tIGluIGF0dHJzKSBpZiAoYXR0cnMuaGFzT3duUHJvcGVydHkobm0pKSBzZXRbbm1dID0gYXR0cnNbbm1dOwogICAgICAgIGF0dHJzID0gc2V0OwogICAgICB9CiAgICAgIGlmICh0b2tlbi50eXBlID09ICJzdHJpbmciIHx8IHRva2VuLnN0cmluZyA9PSAiPSIpIHsgLy8gQSB2YWx1ZQogICAgICAgIHZhciBiZWZvcmUgPSBjbS5nZXRSYW5nZShQb3MoY3VyLmxpbmUsIE1hdGgubWF4KDAsIGN1ci5jaCAtIDYwKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvcyhjdXIubGluZSwgdG9rZW4udHlwZSA9PSAic3RyaW5nIiA/IHRva2VuLnN0YXJ0IDogdG9rZW4uZW5kKSk7CiAgICAgICAgdmFyIGF0TmFtZSA9IGJlZm9yZS5tYXRjaCgvKFteXHNcdTAwYTA9PD5cIlwnXSspPSQvKSwgYXRWYWx1ZXM7CiAgICAgICAgaWYgKCFhdE5hbWUgfHwgIWF0dHJzLmhhc093blByb3BlcnR5KGF0TmFtZVsxXSkgfHwgIShhdFZhbHVlcyA9IGF0dHJzW2F0TmFtZVsxXV0pKSByZXR1cm47CiAgICAgICAgaWYgKHR5cGVvZiBhdFZhbHVlcyA9PSAnZnVuY3Rpb24nKSBhdFZhbHVlcyA9IGF0VmFsdWVzLmNhbGwodGhpcywgY20pOyAvLyBGdW5jdGlvbnMgY2FuIGJlIHVzZWQgdG8gc3VwcGx5IHZhbHVlcyBmb3IgYXV0b2NvbXBsZXRlIHdpZGdldAogICAgICAgIGlmICh0b2tlbi50eXBlID09ICJzdHJpbmciKSB7CiAgICAgICAgICBwcmVmaXggPSB0b2tlbi5zdHJpbmc7CiAgICAgICAgICB2YXIgbiA9IDA7CiAgICAgICAgICBpZiAoL1snIl0vLnRlc3QodG9rZW4uc3RyaW5nLmNoYXJBdCgwKSkpIHsKICAgICAgICAgICAgcXVvdGUgPSB0b2tlbi5zdHJpbmcuY2hhckF0KDApOwogICAgICAgICAgICBwcmVmaXggPSB0b2tlbi5zdHJpbmcuc2xpY2UoMSk7CiAgICAgICAgICAgIG4rKzsKICAgICAgICAgIH0KICAgICAgICAgIHZhciBsZW4gPSB0b2tlbi5zdHJpbmcubGVuZ3RoOwogICAgICAgICAgaWYgKC9bJyJdLy50ZXN0KHRva2VuLnN0cmluZy5jaGFyQXQobGVuIC0gMSkpKSB7CiAgICAgICAgICAgIHF1b3RlID0gdG9rZW4uc3RyaW5nLmNoYXJBdChsZW4gLSAxKTsKICAgICAgICAgICAgcHJlZml4ID0gdG9rZW4uc3RyaW5nLnN1YnN0cihuLCBsZW4gLSAyKTsKICAgICAgICAgIH0KICAgICAgICAgIHJlcGxhY2VUb2tlbiA9IHRydWU7CiAgICAgICAgfQogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXRWYWx1ZXMubGVuZ3RoOyArK2kpIGlmICghcHJlZml4IHx8IGF0VmFsdWVzW2ldLmxhc3RJbmRleE9mKHByZWZpeCwgMCkgPT0gMCkKICAgICAgICAgIHJlc3VsdC5wdXNoKHF1b3RlICsgYXRWYWx1ZXNbaV0gKyBxdW90ZSk7CiAgICAgIH0gZWxzZSB7IC8vIEFuIGF0dHJpYnV0ZSBuYW1lCiAgICAgICAgaWYgKHRva2VuLnR5cGUgPT0gImF0dHJpYnV0ZSIpIHsKICAgICAgICAgIHByZWZpeCA9IHRva2VuLnN0cmluZzsKICAgICAgICAgIHJlcGxhY2VUb2tlbiA9IHRydWU7CiAgICAgICAgfQogICAgICAgIGZvciAodmFyIGF0dHIgaW4gYXR0cnMpIGlmIChhdHRycy5oYXNPd25Qcm9wZXJ0eShhdHRyKSAmJiAoIXByZWZpeCB8fCBhdHRyLmxhc3RJbmRleE9mKHByZWZpeCwgMCkgPT0gMCkpCiAgICAgICAgICByZXN1bHQucHVzaChhdHRyKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHsKICAgICAgbGlzdDogcmVzdWx0LAogICAgICBmcm9tOiByZXBsYWNlVG9rZW4gPyBQb3MoY3VyLmxpbmUsIHRhZ1N0YXJ0ID09IG51bGwgPyB0b2tlbi5zdGFydCA6IHRhZ1N0YXJ0KSA6IGN1ciwKICAgICAgdG86IHJlcGxhY2VUb2tlbiA/IFBvcyhjdXIubGluZSwgdG9rZW4uZW5kKSA6IGN1cgogICAgfTsKICB9CgogIENvZGVNaXJyb3IucmVnaXN0ZXJIZWxwZXIoImhpbnQiLCAieG1sIiwgZ2V0SGludHMpOwp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCEtLSBEVU1NWSBIVE1MIEZJTEUgLS0+]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/lint/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/lint/coffeescript-lint.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovLyBEZXBlbmRzIG9uIGNvZmZlZWxpbnQuanMgZnJvbSBodHRwOi8vd3d3LmNvZmZlZWxpbnQub3JnL2pzL2NvZmZlZWxpbnQuanMKCi8vIGRlY2xhcmUgZ2xvYmFsOiBjb2ZmZWVsaW50CgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5yZWdpc3RlckhlbHBlcigibGludCIsICJjb2ZmZWVzY3JpcHQiLCBmdW5jdGlvbih0ZXh0KSB7CiAgdmFyIGZvdW5kID0gW107CiAgdmFyIHBhcnNlRXJyb3IgPSBmdW5jdGlvbihlcnIpIHsKICAgIHZhciBsb2MgPSBlcnIubGluZU51bWJlcjsKICAgIGZvdW5kLnB1c2goe2Zyb206IENvZGVNaXJyb3IuUG9zKGxvYy0xLCAwKSwKICAgICAgICAgICAgICAgIHRvOiBDb2RlTWlycm9yLlBvcyhsb2MsIDApLAogICAgICAgICAgICAgICAgc2V2ZXJpdHk6IGVyci5sZXZlbCwKICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGVyci5tZXNzYWdlfSk7CiAgfTsKICB0cnkgewogICAgdmFyIHJlcyA9IGNvZmZlZWxpbnQubGludCh0ZXh0KTsKICAgIGZvcih2YXIgaSA9IDA7IGkgPCByZXMubGVuZ3RoOyBpKyspIHsKICAgICAgcGFyc2VFcnJvcihyZXNbaV0pOwogICAgfQogIH0gY2F0Y2goZSkgewogICAgZm91bmQucHVzaCh7ZnJvbTogQ29kZU1pcnJvci5Qb3MoZS5sb2NhdGlvbi5maXJzdF9saW5lLCAwKSwKICAgICAgICAgICAgICAgIHRvOiBDb2RlTWlycm9yLlBvcyhlLmxvY2F0aW9uLmxhc3RfbGluZSwgZS5sb2NhdGlvbi5sYXN0X2NvbHVtbiksCiAgICAgICAgICAgICAgICBzZXZlcml0eTogJ2Vycm9yJywKICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZX0pOwogIH0KICByZXR1cm4gZm91bmQ7Cn0pOwoKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/lint/css-lint.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovLyBEZXBlbmRzIG9uIGNzc2xpbnQuanMgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vc3R1YmJvcm5lbGxhL2Nzc2xpbnQKCi8vIGRlY2xhcmUgZ2xvYmFsOiBDU1NMaW50CgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5yZWdpc3RlckhlbHBlcigibGludCIsICJjc3MiLCBmdW5jdGlvbih0ZXh0KSB7CiAgdmFyIGZvdW5kID0gW107CiAgaWYgKCF3aW5kb3cuQ1NTTGludCkgcmV0dXJuIGZvdW5kOwogIHZhciByZXN1bHRzID0gQ1NTTGludC52ZXJpZnkodGV4dCksIG1lc3NhZ2VzID0gcmVzdWx0cy5tZXNzYWdlcywgbWVzc2FnZSA9IG51bGw7CiAgZm9yICggdmFyIGkgPSAwOyBpIDwgbWVzc2FnZXMubGVuZ3RoOyBpKyspIHsKICAgIG1lc3NhZ2UgPSBtZXNzYWdlc1tpXTsKICAgIHZhciBzdGFydExpbmUgPSBtZXNzYWdlLmxpbmUgLTEsIGVuZExpbmUgPSBtZXNzYWdlLmxpbmUgLTEsIHN0YXJ0Q29sID0gbWVzc2FnZS5jb2wgLTEsIGVuZENvbCA9IG1lc3NhZ2UuY29sOwogICAgZm91bmQucHVzaCh7CiAgICAgIGZyb206IENvZGVNaXJyb3IuUG9zKHN0YXJ0TGluZSwgc3RhcnRDb2wpLAogICAgICB0bzogQ29kZU1pcnJvci5Qb3MoZW5kTGluZSwgZW5kQ29sKSwKICAgICAgbWVzc2FnZTogbWVzc2FnZS5tZXNzYWdlLAogICAgICBzZXZlcml0eSA6IG1lc3NhZ2UudHlwZQogICAgfSk7CiAgfQogIHJldHVybiBmb3VuZDsKfSk7Cgp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/lint/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCEtLSBEVU1NWSBIVE1MIEZJTEUgLS0+]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/lint/javascript-lint.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CiAgLy8gZGVjbGFyZSBnbG9iYWw6IEpTSElOVAoKICB2YXIgYm9ndXMgPSBbICJEYW5nZXJvdXMgY29tbWVudCIgXTsKCiAgdmFyIHdhcm5pbmdzID0gWyBbICJFeHBlY3RlZCAneyciLAogICAgICAgICAgICAgICAgICAgICAiU3RhdGVtZW50IGJvZHkgc2hvdWxkIGJlIGluc2lkZSAneyB9JyBicmFjZXMuIiBdIF07CgogIHZhciBlcnJvcnMgPSBbICJNaXNzaW5nIHNlbWljb2xvbiIsICJFeHRyYSBjb21tYSIsICJNaXNzaW5nIHByb3BlcnR5IG5hbWUiLAogICAgICAgICAgICAgICAgICJVbm1hdGNoZWQgIiwgIiBhbmQgaW5zdGVhZCBzYXciLCAiIGlzIG5vdCBkZWZpbmVkIiwKICAgICAgICAgICAgICAgICAiVW5jbG9zZWQgc3RyaW5nIiwgIlN0b3BwaW5nLCB1bmFibGUgdG8gY29udGludWUiIF07CgogIGZ1bmN0aW9uIHZhbGlkYXRvcih0ZXh0LCBvcHRpb25zKSB7CiAgICBpZiAoIXdpbmRvdy5KU0hJTlQpIHJldHVybiBbXTsKICAgIEpTSElOVCh0ZXh0LCBvcHRpb25zKTsKICAgIHZhciBlcnJvcnMgPSBKU0hJTlQuZGF0YSgpLmVycm9ycywgcmVzdWx0ID0gW107CiAgICBpZiAoZXJyb3JzKSBwYXJzZUVycm9ycyhlcnJvcnMsIHJlc3VsdCk7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgQ29kZU1pcnJvci5yZWdpc3RlckhlbHBlcigibGludCIsICJqYXZhc2NyaXB0IiwgdmFsaWRhdG9yKTsKCiAgZnVuY3Rpb24gY2xlYW51cChlcnJvcikgewogICAgLy8gQWxsIHByb2JsZW1zIGFyZSB3YXJuaW5ncyBieSBkZWZhdWx0CiAgICBmaXhXaXRoKGVycm9yLCB3YXJuaW5ncywgIndhcm5pbmciLCB0cnVlKTsKICAgIGZpeFdpdGgoZXJyb3IsIGVycm9ycywgImVycm9yIik7CgogICAgcmV0dXJuIGlzQm9ndXMoZXJyb3IpID8gbnVsbCA6IGVycm9yOwogIH0KCiAgZnVuY3Rpb24gZml4V2l0aChlcnJvciwgZml4ZXMsIHNldmVyaXR5LCBmb3JjZSkgewogICAgdmFyIGRlc2NyaXB0aW9uLCBmaXgsIGZpbmQsIHJlcGxhY2UsIGZvdW5kOwoKICAgIGRlc2NyaXB0aW9uID0gZXJyb3IuZGVzY3JpcHRpb247CgogICAgZm9yICggdmFyIGkgPSAwOyBpIDwgZml4ZXMubGVuZ3RoOyBpKyspIHsKICAgICAgZml4ID0gZml4ZXNbaV07CiAgICAgIGZpbmQgPSAodHlwZW9mIGZpeCA9PT0gInN0cmluZyIgPyBmaXggOiBmaXhbMF0pOwogICAgICByZXBsYWNlID0gKHR5cGVvZiBmaXggPT09ICJzdHJpbmciID8gbnVsbCA6IGZpeFsxXSk7CiAgICAgIGZvdW5kID0gZGVzY3JpcHRpb24uaW5kZXhPZihmaW5kKSAhPT0gLTE7CgogICAgICBpZiAoZm9yY2UgfHwgZm91bmQpIHsKICAgICAgICBlcnJvci5zZXZlcml0eSA9IHNldmVyaXR5OwogICAgICB9CiAgICAgIGlmIChmb3VuZCAmJiByZXBsYWNlKSB7CiAgICAgICAgZXJyb3IuZGVzY3JpcHRpb24gPSByZXBsYWNlOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBpc0JvZ3VzKGVycm9yKSB7CiAgICB2YXIgZGVzY3JpcHRpb24gPSBlcnJvci5kZXNjcmlwdGlvbjsKICAgIGZvciAoIHZhciBpID0gMDsgaSA8IGJvZ3VzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmIChkZXNjcmlwdGlvbi5pbmRleE9mKGJvZ3VzW2ldKSAhPT0gLTEpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgZnVuY3Rpb24gcGFyc2VFcnJvcnMoZXJyb3JzLCBvdXRwdXQpIHsKICAgIGZvciAoIHZhciBpID0gMDsgaSA8IGVycm9ycy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgZXJyb3IgPSBlcnJvcnNbaV07CiAgICAgIGlmIChlcnJvcikgewogICAgICAgIHZhciBsaW5ldGFicG9zaXRpb25zLCBpbmRleDsKCiAgICAgICAgbGluZXRhYnBvc2l0aW9ucyA9IFtdOwoKICAgICAgICAvLyBUaGlzIG5leHQgYmxvY2sgaXMgdG8gZml4IGEgcHJvYmxlbSBpbiBqc2hpbnQuIEpzaGludAogICAgICAgIC8vIHJlcGxhY2VzCiAgICAgICAgLy8gYWxsIHRhYnMgd2l0aCBzcGFjZXMgdGhlbiBwZXJmb3JtcyBzb21lIGNoZWNrcy4gVGhlIGVycm9yCiAgICAgICAgLy8gcG9zaXRpb25zIChjaGFyYWN0ZXIvc3BhY2UpIGFyZSB0aGVuIHJlcG9ydGVkIGluY29ycmVjdGx5LAogICAgICAgIC8vIG5vdCB0YWtpbmcgdGhlIHJlcGxhY2VtZW50IHN0ZXAgaW50byBhY2NvdW50LiBIZXJlIHdlIGxvb2sKICAgICAgICAvLyBhdCB0aGUgZXZpZGVuY2UgbGluZSBhbmQgdHJ5IHRvIGFkanVzdCB0aGUgY2hhcmFjdGVyIHBvc2l0aW9uCiAgICAgICAgLy8gdG8gdGhlIGNvcnJlY3QgdmFsdWUuCiAgICAgICAgaWYgKGVycm9yLmV2aWRlbmNlKSB7CiAgICAgICAgICAvLyBUYWIgcG9zaXRpb25zIGFyZSBjb21wdXRlZCBvbmNlIHBlciBsaW5lIGFuZCBjYWNoZWQKICAgICAgICAgIHZhciB0YWJwb3NpdGlvbnMgPSBsaW5ldGFicG9zaXRpb25zW2Vycm9yLmxpbmVdOwogICAgICAgICAgaWYgKCF0YWJwb3NpdGlvbnMpIHsKICAgICAgICAgICAgdmFyIGV2aWRlbmNlID0gZXJyb3IuZXZpZGVuY2U7CiAgICAgICAgICAgIHRhYnBvc2l0aW9ucyA9IFtdOwogICAgICAgICAgICAvLyB1Z2dnaCBwaGFudG9tanMgZG9lcyBub3QgbGlrZSB0aGlzCiAgICAgICAgICAgIC8vIGZvckVhY2hDaGFyKGV2aWRlbmNlLCBmdW5jdGlvbihpdGVtLCBpbmRleCkgewogICAgICAgICAgICBBcnJheS5wcm90b3R5cGUuZm9yRWFjaC5jYWxsKGV2aWRlbmNlLCBmdW5jdGlvbihpdGVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCkgewogICAgICAgICAgICAgIGlmIChpdGVtID09PSAnXHQnKSB7CiAgICAgICAgICAgICAgICAvLyBGaXJzdCBjb2wgaXMgMSAobm90IDApIHRvIG1hdGNoIGVycm9yCiAgICAgICAgICAgICAgICAvLyBwb3NpdGlvbnMKICAgICAgICAgICAgICAgIHRhYnBvc2l0aW9ucy5wdXNoKGluZGV4ICsgMSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgbGluZXRhYnBvc2l0aW9uc1tlcnJvci5saW5lXSA9IHRhYnBvc2l0aW9uczsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0YWJwb3NpdGlvbnMubGVuZ3RoID4gMCkgewogICAgICAgICAgICB2YXIgcG9zID0gZXJyb3IuY2hhcmFjdGVyOwogICAgICAgICAgICB0YWJwb3NpdGlvbnMuZm9yRWFjaChmdW5jdGlvbih0YWJwb3NpdGlvbikgewogICAgICAgICAgICAgIGlmIChwb3MgPiB0YWJwb3NpdGlvbikgcG9zIC09IDE7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBlcnJvci5jaGFyYWN0ZXIgPSBwb3M7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICB2YXIgc3RhcnQgPSBlcnJvci5jaGFyYWN0ZXIgLSAxLCBlbmQgPSBzdGFydCArIDE7CiAgICAgICAgaWYgKGVycm9yLmV2aWRlbmNlKSB7CiAgICAgICAgICBpbmRleCA9IGVycm9yLmV2aWRlbmNlLnN1YnN0cmluZyhzdGFydCkuc2VhcmNoKC8uXGIvKTsKICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7CiAgICAgICAgICAgIGVuZCArPSBpbmRleDsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIENvbnZlcnQgdG8gZm9ybWF0IGV4cGVjdGVkIGJ5IHZhbGlkYXRpb24gc2VydmljZQogICAgICAgIGVycm9yLmRlc2NyaXB0aW9uID0gZXJyb3IucmVhc29uOy8vICsgIihqc2hpbnQpIjsKICAgICAgICBlcnJvci5zdGFydCA9IGVycm9yLmNoYXJhY3RlcjsKICAgICAgICBlcnJvci5lbmQgPSBlbmQ7CiAgICAgICAgZXJyb3IgPSBjbGVhbnVwKGVycm9yKTsKCiAgICAgICAgaWYgKGVycm9yKQogICAgICAgICAgb3V0cHV0LnB1c2goe21lc3NhZ2U6IGVycm9yLmRlc2NyaXB0aW9uLAogICAgICAgICAgICAgICAgICAgICAgIHNldmVyaXR5OiBlcnJvci5zZXZlcml0eSwKICAgICAgICAgICAgICAgICAgICAgICBmcm9tOiBDb2RlTWlycm9yLlBvcyhlcnJvci5saW5lIC0gMSwgc3RhcnQpLAogICAgICAgICAgICAgICAgICAgICAgIHRvOiBDb2RlTWlycm9yLlBvcyhlcnJvci5saW5lIC0gMSwgZW5kKX0pOwogICAgICB9CiAgICB9CiAgfQp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/lint/json-lint.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovLyBEZXBlbmRzIG9uIGpzb25saW50LmpzIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL3phYWNoL2pzb25saW50CgovLyBkZWNsYXJlIGdsb2JhbDoganNvbmxpbnQKCihmdW5jdGlvbihtb2QpIHsKICBpZiAodHlwZW9mIGV4cG9ydHMgPT0gIm9iamVjdCIgJiYgdHlwZW9mIG1vZHVsZSA9PSAib2JqZWN0IikgLy8gQ29tbW9uSlMKICAgIG1vZChyZXF1aXJlKCIuLi8uLi9saWIvY29kZW1pcnJvciIpKTsKICBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCkgLy8gQU1ECiAgICBkZWZpbmUoWyIuLi8uLi9saWIvY29kZW1pcnJvciJdLCBtb2QpOwogIGVsc2UgLy8gUGxhaW4gYnJvd3NlciBlbnYKICAgIG1vZChDb2RlTWlycm9yKTsKfSkoZnVuY3Rpb24oQ29kZU1pcnJvcikgewoidXNlIHN0cmljdCI7CgpDb2RlTWlycm9yLnJlZ2lzdGVySGVscGVyKCJsaW50IiwgImpzb24iLCBmdW5jdGlvbih0ZXh0KSB7CiAgdmFyIGZvdW5kID0gW107CiAganNvbmxpbnQucGFyc2VFcnJvciA9IGZ1bmN0aW9uKHN0ciwgaGFzaCkgewogICAgdmFyIGxvYyA9IGhhc2gubG9jOwogICAgZm91bmQucHVzaCh7ZnJvbTogQ29kZU1pcnJvci5Qb3MobG9jLmZpcnN0X2xpbmUgLSAxLCBsb2MuZmlyc3RfY29sdW1uKSwKICAgICAgICAgICAgICAgIHRvOiBDb2RlTWlycm9yLlBvcyhsb2MubGFzdF9saW5lIC0gMSwgbG9jLmxhc3RfY29sdW1uKSwKICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHN0cn0pOwogIH07CiAgdHJ5IHsganNvbmxpbnQucGFyc2UodGV4dCk7IH0KICBjYXRjaChlKSB7fQogIHJldHVybiBmb3VuZDsKfSk7Cgp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/lint/lint.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogVGhlIGxpbnQgbWFya2VyIGd1dHRlciAqLwouQ29kZU1pcnJvci1saW50LW1hcmtlcnMgewogIHdpZHRoOiAxNnB4Owp9CgouQ29kZU1pcnJvci1saW50LXRvb2x0aXAgewogIGJhY2tncm91bmQtY29sb3I6IGluZm9iYWNrZ3JvdW5kOwogIGJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOwogIGJvcmRlci1yYWRpdXM6IDRweCA0cHggNHB4IDRweDsKICBjb2xvcjogaW5mb3RleHQ7CiAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICBmb250LXNpemU6IDEwcHQ7CiAgb3ZlcmZsb3c6IGhpZGRlbjsKICBwYWRkaW5nOiAycHggNXB4OwogIHBvc2l0aW9uOiBmaXhlZDsKICB3aGl0ZS1zcGFjZTogcHJlOwogIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKICB6LWluZGV4OiAxMDA7CiAgbWF4LXdpZHRoOiA2MDBweDsKICBvcGFjaXR5OiAwOwogIHRyYW5zaXRpb246IG9wYWNpdHkgLjRzOwogIC1tb3otdHJhbnNpdGlvbjogb3BhY2l0eSAuNHM7CiAgLXdlYmtpdC10cmFuc2l0aW9uOiBvcGFjaXR5IC40czsKICAtby10cmFuc2l0aW9uOiBvcGFjaXR5IC40czsKICAtbXMtdHJhbnNpdGlvbjogb3BhY2l0eSAuNHM7Cn0KCi5Db2RlTWlycm9yLWxpbnQtbWFyay1lcnJvciwgLkNvZGVNaXJyb3ItbGludC1tYXJrLXdhcm5pbmcgewogIGJhY2tncm91bmQtcG9zaXRpb246IGxlZnQgYm90dG9tOwogIGJhY2tncm91bmQtcmVwZWF0OiByZXBlYXQteDsKfQoKLkNvZGVNaXJyb3ItbGludC1tYXJrLWVycm9yIHsKICBiYWNrZ3JvdW5kLWltYWdlOgogIHVybCgiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBUUFBQUFEQ0FZQUFBQzA5SzdHQUFBQUFYTlNSMElBcnM0YzZRQUFBQVppUzBkRUFQOEEvd0Qvb0wybmt3QUFBQWx3U0ZsekFBQUxFd0FBQ3hNQkFKcWNHQUFBQUFkMFNVMUZCOXNKRHc0Y09DVzEvS0lBQUFBWmRFVllkRU52YlcxbGJuUUFRM0psWVhSbFpDQjNhWFJvSUVkSlRWQlhnUTRYQUFBQUhFbEVRVlFJMTJOZ2dJTC9EQXovR2RBNS94a1kvcVBLTURBd0FBRExad2Y1cnZtK0xRQUFBQUJKUlU1RXJrSmdnZz09IikKICA7Cn0KCi5Db2RlTWlycm9yLWxpbnQtbWFyay13YXJuaW5nIHsKICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQVFBQUFBRENBWUFBQUMwOUs3R0FBQUFBWE5TUjBJQXJzNGM2UUFBQUFaaVMwZEVBUDhBL3dEL29MMm5rd0FBQUFsd1NGbHpBQUFMRXdBQUN4TUJBSnFjR0FBQUFBZDBTVTFGQjlzSkZoUVhFYmhUZzdZQUFBQVpkRVZZZEVOdmJXMWxiblFBUTNKbFlYUmxaQ0IzYVhSb0lFZEpUVkJYZ1E0WEFBQUFNa2xFUVZRSTEyTmtnSUl2SjNRWE1qQXdkRE4rT2FFYnlzREE0TVBBd05ETndNQ3dpT0hMQ2QxelgwN282a0JWR1FFQUtCQU50b2Jza05NQUFBQUFTVVZPUks1Q1lJST0iKTsKfQoKLkNvZGVNaXJyb3ItbGludC1tYXJrZXItZXJyb3IsIC5Db2RlTWlycm9yLWxpbnQtbWFya2VyLXdhcm5pbmcgewogIGJhY2tncm91bmQtcG9zaXRpb246IGNlbnRlciBjZW50ZXI7CiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsKICBjdXJzb3I6IHBvaW50ZXI7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGhlaWdodDogMTZweDsKICB3aWR0aDogMTZweDsKICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKfQoKLkNvZGVNaXJyb3ItbGludC1tZXNzYWdlLWVycm9yLCAuQ29kZU1pcnJvci1saW50LW1lc3NhZ2Utd2FybmluZyB7CiAgcGFkZGluZy1sZWZ0OiAxOHB4OwogIGJhY2tncm91bmQtcG9zaXRpb246IHRvcCBsZWZ0OwogIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7Cn0KCi5Db2RlTWlycm9yLWxpbnQtbWFya2VyLWVycm9yLCAuQ29kZU1pcnJvci1saW50LW1lc3NhZ2UtZXJyb3IgewogIGJhY2tncm91bmQtaW1hZ2U6IHVybCgiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQ0FNQUFBQW9MUTlUQUFBQUhsQk1WRVc3QUFDN0FBQ3hBQUM3QUFDN0FBQUFBQUM0QUFDNUFBRC8vLys3QUFBVWRjbHBBQUFBQm5SU1RsTVhuT1JTaXdDSzBaS1NBQUFBVFVsRVFWUjQybVdQT1E3QVFBZ0R1UUx4L3o4Y3NZUm1QUklGSXdSR25vc1JycGFtdmtLaTBGVElpTUFTUjNoaEtXK2hBTjYvdElXaHU5UERXaVRHTkVrVHRJT3VjQTVPeXI5Y2tQZ0FXbTBHUEJvZzZ2NEFBQUFBU1VWT1JLNUNZSUk9Iik7Cn0KCi5Db2RlTWlycm9yLWxpbnQtbWFya2VyLXdhcm5pbmcsIC5Db2RlTWlycm9yLWxpbnQtbWVzc2FnZS13YXJuaW5nIHsKICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQkFBQUFBUUNBTUFBQUFvTFE5VEFBQUFObEJNVkVYL3V3RHZyd0QvdXdEL3V3RC91d0QvdXdEL3V3RC91d0QvdXdENnR3RC91d0FBQUFEdXJ3RDJ0UUQ3dUFEK3VnQUFBQUQvdXdEaG1lVFJBQUFBREhSU1RsTUo4bU4xRVljYm1paXhnQUNtN1didUFBQUFWa2xFUVZSNDJuM1BVUXFBSUJCRlVVMUxMYzN1L2pkYk9Kb1cxUDA4REE5R2JhOCtZV0o2Z05Kb05ZSUJ6QUEyY2hCdGg1a0xtRzlZVW9HME5IQVV3Rlh3TzlMdUJRTDFnaUNRYjhnQzlPcm8ydnA1cm5jQ0lZOEw4dUV4NVprQUFBQUFTVVZPUks1Q1lJST0iKTsKfQoKLkNvZGVNaXJyb3ItbGludC1tYXJrZXItbXVsdGlwbGUgewogIGJhY2tncm91bmQtaW1hZ2U6IHVybCgiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBY0FBQUFIQ0FNQUFBRHpqS2ZoQUFBQUNWQk1WRVVBQUFBQUFBQy92NzkxNGt5SEFBQUFBWFJTVGxNQVFPYllaZ0FBQUNOSlJFRlVlTm8xaW9FSkFBQUl3bXovSDkwaUZGU0dKZ0ZNZTNnYUxaMG9kKzkvQVFaMEFEb3NiWXJhQUFBQUFFbEZUa1N1UW1DQyIpOwogIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7CiAgYmFja2dyb3VuZC1wb3NpdGlvbjogcmlnaHQgYm90dG9tOwogIHdpZHRoOiAxMDAlOyBoZWlnaHQ6IDEwMCU7Cn0K]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/lint/lint.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CiAgdmFyIEdVVFRFUl9JRCA9ICJDb2RlTWlycm9yLWxpbnQtbWFya2VycyI7CgogIGZ1bmN0aW9uIHNob3dUb29sdGlwKGUsIGNvbnRlbnQpIHsKICAgIHZhciB0dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgdHQuY2xhc3NOYW1lID0gIkNvZGVNaXJyb3ItbGludC10b29sdGlwIjsKICAgIHR0LmFwcGVuZENoaWxkKGNvbnRlbnQuY2xvbmVOb2RlKHRydWUpKTsKICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodHQpOwoKICAgIGZ1bmN0aW9uIHBvc2l0aW9uKGUpIHsKICAgICAgaWYgKCF0dC5wYXJlbnROb2RlKSByZXR1cm4gQ29kZU1pcnJvci5vZmYoZG9jdW1lbnQsICJtb3VzZW1vdmUiLCBwb3NpdGlvbik7CiAgICAgIHR0LnN0eWxlLnRvcCA9IE1hdGgubWF4KDAsIGUuY2xpZW50WSAtIHR0Lm9mZnNldEhlaWdodCAtIDUpICsgInB4IjsKICAgICAgdHQuc3R5bGUubGVmdCA9IChlLmNsaWVudFggKyA1KSArICJweCI7CiAgICB9CiAgICBDb2RlTWlycm9yLm9uKGRvY3VtZW50LCAibW91c2Vtb3ZlIiwgcG9zaXRpb24pOwogICAgcG9zaXRpb24oZSk7CiAgICBpZiAodHQuc3R5bGUub3BhY2l0eSAhPSBudWxsKSB0dC5zdHlsZS5vcGFjaXR5ID0gMTsKICAgIHJldHVybiB0dDsKICB9CiAgZnVuY3Rpb24gcm0oZWx0KSB7CiAgICBpZiAoZWx0LnBhcmVudE5vZGUpIGVsdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsdCk7CiAgfQogIGZ1bmN0aW9uIGhpZGVUb29sdGlwKHR0KSB7CiAgICBpZiAoIXR0LnBhcmVudE5vZGUpIHJldHVybjsKICAgIGlmICh0dC5zdHlsZS5vcGFjaXR5ID09IG51bGwpIHJtKHR0KTsKICAgIHR0LnN0eWxlLm9wYWNpdHkgPSAwOwogICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsgcm0odHQpOyB9LCA2MDApOwogIH0KCiAgZnVuY3Rpb24gc2hvd1Rvb2x0aXBGb3IoZSwgY29udGVudCwgbm9kZSkgewogICAgdmFyIHRvb2x0aXAgPSBzaG93VG9vbHRpcChlLCBjb250ZW50KTsKICAgIGZ1bmN0aW9uIGhpZGUoKSB7CiAgICAgIENvZGVNaXJyb3Iub2ZmKG5vZGUsICJtb3VzZW91dCIsIGhpZGUpOwogICAgICBpZiAodG9vbHRpcCkgeyBoaWRlVG9vbHRpcCh0b29sdGlwKTsgdG9vbHRpcCA9IG51bGw7IH0KICAgIH0KICAgIHZhciBwb2xsID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7CiAgICAgIGlmICh0b29sdGlwKSBmb3IgKHZhciBuID0gbm9kZTs7IG4gPSBuLnBhcmVudE5vZGUpIHsKICAgICAgICBpZiAobiA9PSBkb2N1bWVudC5ib2R5KSByZXR1cm47CiAgICAgICAgaWYgKCFuKSB7IGhpZGUoKTsgYnJlYWs7IH0KICAgICAgfQogICAgICBpZiAoIXRvb2x0aXApIHJldHVybiBjbGVhckludGVydmFsKHBvbGwpOwogICAgfSwgNDAwKTsKICAgIENvZGVNaXJyb3Iub24obm9kZSwgIm1vdXNlb3V0IiwgaGlkZSk7CiAgfQoKICBmdW5jdGlvbiBMaW50U3RhdGUoY20sIG9wdGlvbnMsIGhhc0d1dHRlcikgewogICAgdGhpcy5tYXJrZWQgPSBbXTsKICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CiAgICB0aGlzLnRpbWVvdXQgPSBudWxsOwogICAgdGhpcy5oYXNHdXR0ZXIgPSBoYXNHdXR0ZXI7CiAgICB0aGlzLm9uTW91c2VPdmVyID0gZnVuY3Rpb24oZSkgeyBvbk1vdXNlT3ZlcihjbSwgZSk7IH07CiAgfQoKICBmdW5jdGlvbiBwYXJzZU9wdGlvbnMoY20sIG9wdGlvbnMpIHsKICAgIGlmIChvcHRpb25zIGluc3RhbmNlb2YgRnVuY3Rpb24pIHJldHVybiB7Z2V0QW5ub3RhdGlvbnM6IG9wdGlvbnN9OwogICAgaWYgKCFvcHRpb25zIHx8IG9wdGlvbnMgPT09IHRydWUpIG9wdGlvbnMgPSB7fTsKICAgIGlmICghb3B0aW9ucy5nZXRBbm5vdGF0aW9ucykgb3B0aW9ucy5nZXRBbm5vdGF0aW9ucyA9IGNtLmdldEhlbHBlcihDb2RlTWlycm9yLlBvcygwLCAwKSwgImxpbnQiKTsKICAgIGlmICghb3B0aW9ucy5nZXRBbm5vdGF0aW9ucykgdGhyb3cgbmV3IEVycm9yKCJSZXF1aXJlZCBvcHRpb24gJ2dldEFubm90YXRpb25zJyBtaXNzaW5nIChsaW50IGFkZG9uKSIpOwogICAgcmV0dXJuIG9wdGlvbnM7CiAgfQoKICBmdW5jdGlvbiBjbGVhck1hcmtzKGNtKSB7CiAgICB2YXIgc3RhdGUgPSBjbS5zdGF0ZS5saW50OwogICAgaWYgKHN0YXRlLmhhc0d1dHRlcikgY20uY2xlYXJHdXR0ZXIoR1VUVEVSX0lEKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RhdGUubWFya2VkLmxlbmd0aDsgKytpKQogICAgICBzdGF0ZS5tYXJrZWRbaV0uY2xlYXIoKTsKICAgIHN0YXRlLm1hcmtlZC5sZW5ndGggPSAwOwogIH0KCiAgZnVuY3Rpb24gbWFrZU1hcmtlcihsYWJlbHMsIHNldmVyaXR5LCBtdWx0aXBsZSwgdG9vbHRpcHMpIHsKICAgIHZhciBtYXJrZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSwgaW5uZXIgPSBtYXJrZXI7CiAgICBtYXJrZXIuY2xhc3NOYW1lID0gIkNvZGVNaXJyb3ItbGludC1tYXJrZXItIiArIHNldmVyaXR5OwogICAgaWYgKG11bHRpcGxlKSB7CiAgICAgIGlubmVyID0gbWFya2VyLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpKTsKICAgICAgaW5uZXIuY2xhc3NOYW1lID0gIkNvZGVNaXJyb3ItbGludC1tYXJrZXItbXVsdGlwbGUiOwogICAgfQoKICAgIGlmICh0b29sdGlwcyAhPSBmYWxzZSkgQ29kZU1pcnJvci5vbihpbm5lciwgIm1vdXNlb3ZlciIsIGZ1bmN0aW9uKGUpIHsKICAgICAgc2hvd1Rvb2x0aXBGb3IoZSwgbGFiZWxzLCBpbm5lcik7CiAgICB9KTsKCiAgICByZXR1cm4gbWFya2VyOwogIH0KCiAgZnVuY3Rpb24gZ2V0TWF4U2V2ZXJpdHkoYSwgYikgewogICAgaWYgKGEgPT0gImVycm9yIikgcmV0dXJuIGE7CiAgICBlbHNlIHJldHVybiBiOwogIH0KCiAgZnVuY3Rpb24gZ3JvdXBCeUxpbmUoYW5ub3RhdGlvbnMpIHsKICAgIHZhciBsaW5lcyA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbm5vdGF0aW9ucy5sZW5ndGg7ICsraSkgewogICAgICB2YXIgYW5uID0gYW5ub3RhdGlvbnNbaV0sIGxpbmUgPSBhbm4uZnJvbS5saW5lOwogICAgICAobGluZXNbbGluZV0gfHwgKGxpbmVzW2xpbmVdID0gW10pKS5wdXNoKGFubik7CiAgICB9CiAgICByZXR1cm4gbGluZXM7CiAgfQoKICBmdW5jdGlvbiBhbm5vdGF0aW9uVG9vbHRpcChhbm4pIHsKICAgIHZhciBzZXZlcml0eSA9IGFubi5zZXZlcml0eTsKICAgIGlmICghc2V2ZXJpdHkpIHNldmVyaXR5ID0gImVycm9yIjsKICAgIHZhciB0aXAgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgIHRpcC5jbGFzc05hbWUgPSAiQ29kZU1pcnJvci1saW50LW1lc3NhZ2UtIiArIHNldmVyaXR5OwogICAgdGlwLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGFubi5tZXNzYWdlKSk7CiAgICByZXR1cm4gdGlwOwogIH0KCiAgZnVuY3Rpb24gc3RhcnRMaW50aW5nKGNtKSB7CiAgICB2YXIgc3RhdGUgPSBjbS5zdGF0ZS5saW50LCBvcHRpb25zID0gc3RhdGUub3B0aW9uczsKICAgIGlmIChvcHRpb25zLmFzeW5jKQogICAgICBvcHRpb25zLmdldEFubm90YXRpb25zKGNtLCB1cGRhdGVMaW50aW5nLCBvcHRpb25zKTsKICAgIGVsc2UKICAgICAgdXBkYXRlTGludGluZyhjbSwgb3B0aW9ucy5nZXRBbm5vdGF0aW9ucyhjbS5nZXRWYWx1ZSgpLCBvcHRpb25zLm9wdGlvbnMpKTsKICB9CgogIGZ1bmN0aW9uIHVwZGF0ZUxpbnRpbmcoY20sIGFubm90YXRpb25zTm90U29ydGVkKSB7CiAgICBjbGVhck1hcmtzKGNtKTsKICAgIHZhciBzdGF0ZSA9IGNtLnN0YXRlLmxpbnQsIG9wdGlvbnMgPSBzdGF0ZS5vcHRpb25zOwoKICAgIHZhciBhbm5vdGF0aW9ucyA9IGdyb3VwQnlMaW5lKGFubm90YXRpb25zTm90U29ydGVkKTsKCiAgICBmb3IgKHZhciBsaW5lID0gMDsgbGluZSA8IGFubm90YXRpb25zLmxlbmd0aDsgKytsaW5lKSB7CiAgICAgIHZhciBhbm5zID0gYW5ub3RhdGlvbnNbbGluZV07CiAgICAgIGlmICghYW5ucykgY29udGludWU7CgogICAgICB2YXIgbWF4U2V2ZXJpdHkgPSBudWxsOwogICAgICB2YXIgdGlwTGFiZWwgPSBzdGF0ZS5oYXNHdXR0ZXIgJiYgZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpOwoKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbm5zLmxlbmd0aDsgKytpKSB7CiAgICAgICAgdmFyIGFubiA9IGFubnNbaV07CiAgICAgICAgdmFyIHNldmVyaXR5ID0gYW5uLnNldmVyaXR5OwogICAgICAgIGlmICghc2V2ZXJpdHkpIHNldmVyaXR5ID0gImVycm9yIjsKICAgICAgICBtYXhTZXZlcml0eSA9IGdldE1heFNldmVyaXR5KG1heFNldmVyaXR5LCBzZXZlcml0eSk7CgogICAgICAgIGlmIChvcHRpb25zLmZvcm1hdEFubm90YXRpb24pIGFubiA9IG9wdGlvbnMuZm9ybWF0QW5ub3RhdGlvbihhbm4pOwogICAgICAgIGlmIChzdGF0ZS5oYXNHdXR0ZXIpIHRpcExhYmVsLmFwcGVuZENoaWxkKGFubm90YXRpb25Ub29sdGlwKGFubikpOwoKICAgICAgICBpZiAoYW5uLnRvKSBzdGF0ZS5tYXJrZWQucHVzaChjbS5tYXJrVGV4dChhbm4uZnJvbSwgYW5uLnRvLCB7CiAgICAgICAgICBjbGFzc05hbWU6ICJDb2RlTWlycm9yLWxpbnQtbWFyay0iICsgc2V2ZXJpdHksCiAgICAgICAgICBfX2Fubm90YXRpb246IGFubgogICAgICAgIH0pKTsKICAgICAgfQoKICAgICAgaWYgKHN0YXRlLmhhc0d1dHRlcikKICAgICAgICBjbS5zZXRHdXR0ZXJNYXJrZXIobGluZSwgR1VUVEVSX0lELCBtYWtlTWFya2VyKHRpcExhYmVsLCBtYXhTZXZlcml0eSwgYW5ucy5sZW5ndGggPiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUub3B0aW9ucy50b29sdGlwcykpOwogICAgfQogICAgaWYgKG9wdGlvbnMub25VcGRhdGVMaW50aW5nKSBvcHRpb25zLm9uVXBkYXRlTGludGluZyhhbm5vdGF0aW9uc05vdFNvcnRlZCwgYW5ub3RhdGlvbnMsIGNtKTsKICB9CgogIGZ1bmN0aW9uIG9uQ2hhbmdlKGNtKSB7CiAgICB2YXIgc3RhdGUgPSBjbS5zdGF0ZS5saW50OwogICAgY2xlYXJUaW1lb3V0KHN0YXRlLnRpbWVvdXQpOwogICAgc3RhdGUudGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKXtzdGFydExpbnRpbmcoY20pO30sIHN0YXRlLm9wdGlvbnMuZGVsYXkgfHwgNTAwKTsKICB9CgogIGZ1bmN0aW9uIHBvcHVwU3BhblRvb2x0aXAoYW5uLCBlKSB7CiAgICB2YXIgdGFyZ2V0ID0gZS50YXJnZXQgfHwgZS5zcmNFbGVtZW50OwogICAgc2hvd1Rvb2x0aXBGb3IoZSwgYW5ub3RhdGlvblRvb2x0aXAoYW5uKSwgdGFyZ2V0KTsKICB9CgogIC8vIFdoZW4gdGhlIG1vdXNlb3ZlciBmaXJlcywgdGhlIGN1cnNvciBtaWdodCBub3QgYWN0dWFsbHkgYmUgb3ZlcgogIC8vIHRoZSBjaGFyYWN0ZXIgaXRzZWxmIHlldC4gVGhlc2UgcGFpcnMgb2YgeCx5IG9mZnNldHMgYXJlIHVzZWQgdG8KICAvLyBwcm9iZSBhIGZldyBuZWFyYnkgcG9pbnRzIHdoZW4gbm8gc3VpdGFibGUgbWFya2VkIHJhbmdlIGlzIGZvdW5kLgogIHZhciBuZWFyYnkgPSBbMCwgMCwgMCwgNSwgMCwgLTUsIDUsIDAsIC01LCAwXTsKCiAgZnVuY3Rpb24gb25Nb3VzZU92ZXIoY20sIGUpIHsKICAgIGlmICghL1xiQ29kZU1pcnJvci1saW50LW1hcmstLy50ZXN0KChlLnRhcmdldCB8fCBlLnNyY0VsZW1lbnQpLmNsYXNzTmFtZSkpIHJldHVybjsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbmVhcmJ5Lmxlbmd0aDsgaSArPSAyKSB7CiAgICAgIHZhciBzcGFucyA9IGNtLmZpbmRNYXJrc0F0KGNtLmNvb3Jkc0NoYXIoe2xlZnQ6IGUuY2xpZW50WCArIG5lYXJieVtpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wOiBlLmNsaWVudFkgKyBuZWFyYnlbaSArIDFdfSwgImNsaWVudCIpKTsKICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBzcGFucy5sZW5ndGg7ICsraikgewogICAgICAgIHZhciBzcGFuID0gc3BhbnNbal0sIGFubiA9IHNwYW4uX19hbm5vdGF0aW9uOwogICAgICAgIGlmIChhbm4pIHJldHVybiBwb3B1cFNwYW5Ub29sdGlwKGFubiwgZSk7CiAgICAgIH0KICAgIH0KICB9CgogIENvZGVNaXJyb3IuZGVmaW5lT3B0aW9uKCJsaW50IiwgZmFsc2UsIGZ1bmN0aW9uKGNtLCB2YWwsIG9sZCkgewogICAgaWYgKG9sZCAmJiBvbGQgIT0gQ29kZU1pcnJvci5Jbml0KSB7CiAgICAgIGNsZWFyTWFya3MoY20pOwogICAgICBjbS5vZmYoImNoYW5nZSIsIG9uQ2hhbmdlKTsKICAgICAgQ29kZU1pcnJvci5vZmYoY20uZ2V0V3JhcHBlckVsZW1lbnQoKSwgIm1vdXNlb3ZlciIsIGNtLnN0YXRlLmxpbnQub25Nb3VzZU92ZXIpOwogICAgICBkZWxldGUgY20uc3RhdGUubGludDsKICAgIH0KCiAgICBpZiAodmFsKSB7CiAgICAgIHZhciBndXR0ZXJzID0gY20uZ2V0T3B0aW9uKCJndXR0ZXJzIiksIGhhc0xpbnRHdXR0ZXIgPSBmYWxzZTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBndXR0ZXJzLmxlbmd0aDsgKytpKSBpZiAoZ3V0dGVyc1tpXSA9PSBHVVRURVJfSUQpIGhhc0xpbnRHdXR0ZXIgPSB0cnVlOwogICAgICB2YXIgc3RhdGUgPSBjbS5zdGF0ZS5saW50ID0gbmV3IExpbnRTdGF0ZShjbSwgcGFyc2VPcHRpb25zKGNtLCB2YWwpLCBoYXNMaW50R3V0dGVyKTsKICAgICAgY20ub24oImNoYW5nZSIsIG9uQ2hhbmdlKTsKICAgICAgaWYgKHN0YXRlLm9wdGlvbnMudG9vbHRpcHMgIT0gZmFsc2UpCiAgICAgICAgQ29kZU1pcnJvci5vbihjbS5nZXRXcmFwcGVyRWxlbWVudCgpLCAibW91c2VvdmVyIiwgc3RhdGUub25Nb3VzZU92ZXIpOwoKICAgICAgc3RhcnRMaW50aW5nKGNtKTsKICAgIH0KICB9KTsKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/lint/yaml-lint.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKLy8gRGVwZW5kcyBvbiBqcy15YW1sLmpzIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL25vZGVjYS9qcy15YW1sCgovLyBkZWNsYXJlIGdsb2JhbDoganN5YW1sCgpDb2RlTWlycm9yLnJlZ2lzdGVySGVscGVyKCJsaW50IiwgInlhbWwiLCBmdW5jdGlvbih0ZXh0KSB7CiAgdmFyIGZvdW5kID0gW107CiAgdHJ5IHsganN5YW1sLmxvYWQodGV4dCk7IH0KICBjYXRjaChlKSB7CiAgICAgIHZhciBsb2MgPSBlLm1hcms7CiAgICAgIGZvdW5kLnB1c2goeyBmcm9tOiBDb2RlTWlycm9yLlBvcyhsb2MubGluZSwgbG9jLmNvbHVtbiksIHRvOiBDb2RlTWlycm9yLlBvcyhsb2MubGluZSwgbG9jLmNvbHVtbiksIG1lc3NhZ2U6IGUubWVzc2FnZSB9KTsKICB9CiAgcmV0dXJuIGZvdW5kOwp9KTsKCn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/merge/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/merge/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCEtLSBEVU1NWSBIVE1MIEZJTEUgLS0+]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/merge/merge.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LkNvZGVNaXJyb3ItbWVyZ2UgewogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICBib3JkZXI6IDFweCBzb2xpZCAjZGRkOwogIHdoaXRlLXNwYWNlOiBwcmU7Cn0KCi5Db2RlTWlycm9yLW1lcmdlLCAuQ29kZU1pcnJvci1tZXJnZSAuQ29kZU1pcnJvciB7CiAgaGVpZ2h0OiAzNTBweDsKfQoKLkNvZGVNaXJyb3ItbWVyZ2UtMnBhbmUgLkNvZGVNaXJyb3ItbWVyZ2UtcGFuZSB7IHdpZHRoOiA0NyU7IH0KLkNvZGVNaXJyb3ItbWVyZ2UtMnBhbmUgLkNvZGVNaXJyb3ItbWVyZ2UtZ2FwIHsgd2lkdGg6IDYlOyB9Ci5Db2RlTWlycm9yLW1lcmdlLTNwYW5lIC5Db2RlTWlycm9yLW1lcmdlLXBhbmUgeyB3aWR0aDogMzElOyB9Ci5Db2RlTWlycm9yLW1lcmdlLTNwYW5lIC5Db2RlTWlycm9yLW1lcmdlLWdhcCB7IHdpZHRoOiAzLjUlOyB9CgouQ29kZU1pcnJvci1tZXJnZS1wYW5lIHsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgd2hpdGUtc3BhY2U6IG5vcm1hbDsKICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwp9Ci5Db2RlTWlycm9yLW1lcmdlLXBhbmUtcmlnaHRtb3N0IHsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgcmlnaHQ6IDBweDsKICB6LWluZGV4OiAxOwp9CgouQ29kZU1pcnJvci1tZXJnZS1nYXAgewogIHotaW5kZXg6IDI7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGhlaWdodDogMTAwJTsKICAtbW96LWJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICBvdmVyZmxvdzogaGlkZGVuOwogIGJvcmRlci1sZWZ0OiAxcHggc29saWQgI2RkZDsKICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjZGRkOwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICBiYWNrZ3JvdW5kOiAjZjhmOGY4Owp9CgouQ29kZU1pcnJvci1tZXJnZS1zY3JvbGxsb2NrLXdyYXAgewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICBib3R0b206IDA7IGxlZnQ6IDUwJTsKfQouQ29kZU1pcnJvci1tZXJnZS1zY3JvbGxsb2NrIHsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgbGVmdDogLTUwJTsKICBjdXJzb3I6IHBvaW50ZXI7CiAgY29sb3I6ICM1NTU7CiAgbGluZS1oZWlnaHQ6IDE7Cn0KCi5Db2RlTWlycm9yLW1lcmdlLWNvcHlidXR0b25zLWxlZnQsIC5Db2RlTWlycm9yLW1lcmdlLWNvcHlidXR0b25zLXJpZ2h0IHsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgbGVmdDogMDsgdG9wOiAwOwogIHJpZ2h0OiAwOyBib3R0b206IDA7CiAgbGluZS1oZWlnaHQ6IDE7Cn0KCi5Db2RlTWlycm9yLW1lcmdlLWNvcHkgewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICBjdXJzb3I6IHBvaW50ZXI7CiAgY29sb3I6ICM0NGM7Cn0KCi5Db2RlTWlycm9yLW1lcmdlLWNvcHlidXR0b25zLWxlZnQgLkNvZGVNaXJyb3ItbWVyZ2UtY29weSB7IGxlZnQ6IDJweDsgfQouQ29kZU1pcnJvci1tZXJnZS1jb3B5YnV0dG9ucy1yaWdodCAuQ29kZU1pcnJvci1tZXJnZS1jb3B5IHsgcmlnaHQ6IDJweDsgfQoKLkNvZGVNaXJyb3ItbWVyZ2Utci1pbnNlcnRlZCwgLkNvZGVNaXJyb3ItbWVyZ2UtbC1pbnNlcnRlZCB7CiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQU1BQUFBQ0NBWUFBQUNkZEdZYUFBQUFHVWxFUVZRSTEyTXd1Q1h5MytDV3lIOEdCZ1lHSmdZa0FBQlpiQVE5RUxYdXJ3QUFBQUJKUlU1RXJrSmdnZz09KTsKICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBib3R0b20gbGVmdDsKICBiYWNrZ3JvdW5kLXJlcGVhdDogcmVwZWF0LXg7Cn0KCi5Db2RlTWlycm9yLW1lcmdlLXItZGVsZXRlZCwgLkNvZGVNaXJyb3ItbWVyZ2UtbC1kZWxldGVkIHsKICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBTUFBQUFDQ0FZQUFBQ2RkR1lhQUFBQUdVbEVRVlFJMTJNNEt5YjIvNnlZMkg4R0JnWUdKZ1lrQUFCVVJnUHo2S3M3d1FBQUFBQkpSVTVFcmtKZ2dnPT0pOwogIGJhY2tncm91bmQtcG9zaXRpb246IGJvdHRvbSBsZWZ0OwogIGJhY2tncm91bmQtcmVwZWF0OiByZXBlYXQteDsKfQoKLkNvZGVNaXJyb3ItbWVyZ2Utci1jaHVuayB7IGJhY2tncm91bmQ6ICNmZmZmZTA7IH0KLkNvZGVNaXJyb3ItbWVyZ2Utci1jaHVuay1zdGFydCB7IGJvcmRlci10b3A6IDFweCBzb2xpZCAjZWU4OyB9Ci5Db2RlTWlycm9yLW1lcmdlLXItY2h1bmstZW5kIHsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlZTg7IH0KLkNvZGVNaXJyb3ItbWVyZ2Utci1jb25uZWN0IHsgZmlsbDogI2ZmZmZlMDsgc3Ryb2tlOiAjZWU4OyBzdHJva2Utd2lkdGg6IDFweDsgfQoKLkNvZGVNaXJyb3ItbWVyZ2UtbC1jaHVuayB7IGJhY2tncm91bmQ6ICNlZWY7IH0KLkNvZGVNaXJyb3ItbWVyZ2UtbC1jaHVuay1zdGFydCB7IGJvcmRlci10b3A6IDFweCBzb2xpZCAjODhlOyB9Ci5Db2RlTWlycm9yLW1lcmdlLWwtY2h1bmstZW5kIHsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICM4OGU7IH0KLkNvZGVNaXJyb3ItbWVyZ2UtbC1jb25uZWN0IHsgZmlsbDogI2VlZjsgc3Ryb2tlOiAjODhlOyBzdHJva2Utd2lkdGg6IDFweDsgfQoKLkNvZGVNaXJyb3ItbWVyZ2UtbC1jaHVuay5Db2RlTWlycm9yLW1lcmdlLXItY2h1bmsgeyBiYWNrZ3JvdW5kOiAjZGZkOyB9Ci5Db2RlTWlycm9yLW1lcmdlLWwtY2h1bmstc3RhcnQuQ29kZU1pcnJvci1tZXJnZS1yLWNodW5rLXN0YXJ0IHsgYm9yZGVyLXRvcDogMXB4IHNvbGlkICM0ZTQ7IH0KLkNvZGVNaXJyb3ItbWVyZ2UtbC1jaHVuay1lbmQuQ29kZU1pcnJvci1tZXJnZS1yLWNodW5rLWVuZCB7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjNGU0OyB9Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/merge/merge.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CiAgLy8gZGVjbGFyZSBnbG9iYWw6IGRpZmZfbWF0Y2hfcGF0Y2gsIERJRkZfSU5TRVJULCBESUZGX0RFTEVURSwgRElGRl9FUVVBTAoKICB2YXIgUG9zID0gQ29kZU1pcnJvci5Qb3M7CiAgdmFyIHN2Z05TID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIjsKCiAgZnVuY3Rpb24gRGlmZlZpZXcobXYsIHR5cGUpIHsKICAgIHRoaXMubXYgPSBtdjsKICAgIHRoaXMudHlwZSA9IHR5cGU7CiAgICB0aGlzLmNsYXNzZXMgPSB0eXBlID09ICJsZWZ0IgogICAgICA/IHtjaHVuazogIkNvZGVNaXJyb3ItbWVyZ2UtbC1jaHVuayIsCiAgICAgICAgIHN0YXJ0OiAiQ29kZU1pcnJvci1tZXJnZS1sLWNodW5rLXN0YXJ0IiwKICAgICAgICAgZW5kOiAiQ29kZU1pcnJvci1tZXJnZS1sLWNodW5rLWVuZCIsCiAgICAgICAgIGluc2VydDogIkNvZGVNaXJyb3ItbWVyZ2UtbC1pbnNlcnRlZCIsCiAgICAgICAgIGRlbDogIkNvZGVNaXJyb3ItbWVyZ2UtbC1kZWxldGVkIiwKICAgICAgICAgY29ubmVjdDogIkNvZGVNaXJyb3ItbWVyZ2UtbC1jb25uZWN0In0KICAgICAgOiB7Y2h1bms6ICJDb2RlTWlycm9yLW1lcmdlLXItY2h1bmsiLAogICAgICAgICBzdGFydDogIkNvZGVNaXJyb3ItbWVyZ2Utci1jaHVuay1zdGFydCIsCiAgICAgICAgIGVuZDogIkNvZGVNaXJyb3ItbWVyZ2Utci1jaHVuay1lbmQiLAogICAgICAgICBpbnNlcnQ6ICJDb2RlTWlycm9yLW1lcmdlLXItaW5zZXJ0ZWQiLAogICAgICAgICBkZWw6ICJDb2RlTWlycm9yLW1lcmdlLXItZGVsZXRlZCIsCiAgICAgICAgIGNvbm5lY3Q6ICJDb2RlTWlycm9yLW1lcmdlLXItY29ubmVjdCJ9OwogIH0KCiAgRGlmZlZpZXcucHJvdG90eXBlID0gewogICAgY29uc3RydWN0b3I6IERpZmZWaWV3LAogICAgaW5pdDogZnVuY3Rpb24ocGFuZSwgb3JpZywgb3B0aW9ucykgewogICAgICB0aGlzLmVkaXQgPSB0aGlzLm12LmVkaXQ7CiAgICAgIHRoaXMub3JpZyA9IENvZGVNaXJyb3IocGFuZSwgY29weU9iaih7dmFsdWU6IG9yaWcsIHJlYWRPbmx5OiB0cnVlfSwgY29weU9iaihvcHRpb25zKSkpOwoKICAgICAgdGhpcy5kaWZmID0gZ2V0RGlmZihhc1N0cmluZyhvcmlnKSwgYXNTdHJpbmcob3B0aW9ucy52YWx1ZSkpOwogICAgICB0aGlzLmRpZmZPdXRPZkRhdGUgPSBmYWxzZTsKCiAgICAgIHRoaXMuc2hvd0RpZmZlcmVuY2VzID0gb3B0aW9ucy5zaG93RGlmZmVyZW5jZXMgIT09IGZhbHNlOwogICAgICB0aGlzLmZvcmNlVXBkYXRlID0gcmVnaXN0ZXJVcGRhdGUodGhpcyk7CiAgICAgIHNldFNjcm9sbExvY2sodGhpcywgdHJ1ZSwgZmFsc2UpOwogICAgICByZWdpc3RlclNjcm9sbCh0aGlzKTsKICAgIH0sCiAgICBzZXRTaG93RGlmZmVyZW5jZXM6IGZ1bmN0aW9uKHZhbCkgewogICAgICB2YWwgPSB2YWwgIT09IGZhbHNlOwogICAgICBpZiAodmFsICE9IHRoaXMuc2hvd0RpZmZlcmVuY2VzKSB7CiAgICAgICAgdGhpcy5zaG93RGlmZmVyZW5jZXMgPSB2YWw7CiAgICAgICAgdGhpcy5mb3JjZVVwZGF0ZSgiZnVsbCIpOwogICAgICB9CiAgICB9CiAgfTsKCiAgZnVuY3Rpb24gZW5zdXJlRGlmZihkdikgewogICAgaWYgKGR2LmRpZmZPdXRPZkRhdGUpIHsKICAgICAgZHYuZGlmZiA9IGdldERpZmYoZHYub3JpZy5nZXRWYWx1ZSgpLCBkdi5lZGl0LmdldFZhbHVlKCkpOwogICAgICBkdi5kaWZmT3V0T2ZEYXRlID0gZmFsc2U7CiAgICAgIENvZGVNaXJyb3Iuc2lnbmFsKGR2LmVkaXQsICJ1cGRhdGVEaWZmIiwgZHYuZGlmZik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiByZWdpc3RlclVwZGF0ZShkdikgewogICAgdmFyIGVkaXQgPSB7ZnJvbTogMCwgdG86IDAsIG1hcmtlZDogW119OwogICAgdmFyIG9yaWcgPSB7ZnJvbTogMCwgdG86IDAsIG1hcmtlZDogW119OwogICAgdmFyIGRlYm91bmNlQ2hhbmdlOwogICAgZnVuY3Rpb24gdXBkYXRlKG1vZGUpIHsKICAgICAgaWYgKG1vZGUgPT0gImZ1bGwiKSB7CiAgICAgICAgaWYgKGR2LnN2ZykgY2xlYXIoZHYuc3ZnKTsKICAgICAgICBjbGVhcihkdi5jb3B5QnV0dG9ucyk7CiAgICAgICAgY2xlYXJNYXJrcyhkdi5lZGl0LCBlZGl0Lm1hcmtlZCwgZHYuY2xhc3Nlcyk7CiAgICAgICAgY2xlYXJNYXJrcyhkdi5vcmlnLCBvcmlnLm1hcmtlZCwgZHYuY2xhc3Nlcyk7CiAgICAgICAgZWRpdC5mcm9tID0gZWRpdC50byA9IG9yaWcuZnJvbSA9IG9yaWcudG8gPSAwOwogICAgICB9CiAgICAgIGVuc3VyZURpZmYoZHYpOwogICAgICBpZiAoZHYuc2hvd0RpZmZlcmVuY2VzKSB7CiAgICAgICAgdXBkYXRlTWFya3MoZHYuZWRpdCwgZHYuZGlmZiwgZWRpdCwgRElGRl9JTlNFUlQsIGR2LmNsYXNzZXMpOwogICAgICAgIHVwZGF0ZU1hcmtzKGR2Lm9yaWcsIGR2LmRpZmYsIG9yaWcsIERJRkZfREVMRVRFLCBkdi5jbGFzc2VzKTsKICAgICAgfQogICAgICBkcmF3Q29ubmVjdG9ycyhkdik7CiAgICB9CiAgICBmdW5jdGlvbiBzZXQoc2xvdykgewogICAgICBjbGVhclRpbWVvdXQoZGVib3VuY2VDaGFuZ2UpOwogICAgICBkZWJvdW5jZUNoYW5nZSA9IHNldFRpbWVvdXQodXBkYXRlLCBzbG93ID09IHRydWUgPyAyNTAgOiAxMDApOwogICAgfQogICAgZnVuY3Rpb24gY2hhbmdlKCkgewogICAgICBpZiAoIWR2LmRpZmZPdXRPZkRhdGUpIHsKICAgICAgICBkdi5kaWZmT3V0T2ZEYXRlID0gdHJ1ZTsKICAgICAgICBlZGl0LmZyb20gPSBlZGl0LnRvID0gb3JpZy5mcm9tID0gb3JpZy50byA9IDA7CiAgICAgIH0KICAgICAgc2V0KHRydWUpOwogICAgfQogICAgZHYuZWRpdC5vbigiY2hhbmdlIiwgY2hhbmdlKTsKICAgIGR2Lm9yaWcub24oImNoYW5nZSIsIGNoYW5nZSk7CiAgICBkdi5lZGl0Lm9uKCJtYXJrZXJBZGRlZCIsIHNldCk7CiAgICBkdi5lZGl0Lm9uKCJtYXJrZXJDbGVhcmVkIiwgc2V0KTsKICAgIGR2Lm9yaWcub24oIm1hcmtlckFkZGVkIiwgc2V0KTsKICAgIGR2Lm9yaWcub24oIm1hcmtlckNsZWFyZWQiLCBzZXQpOwogICAgZHYuZWRpdC5vbigidmlld3BvcnRDaGFuZ2UiLCBzZXQpOwogICAgZHYub3JpZy5vbigidmlld3BvcnRDaGFuZ2UiLCBzZXQpOwogICAgdXBkYXRlKCk7CiAgICByZXR1cm4gdXBkYXRlOwogIH0KCiAgZnVuY3Rpb24gcmVnaXN0ZXJTY3JvbGwoZHYpIHsKICAgIGR2LmVkaXQub24oInNjcm9sbCIsIGZ1bmN0aW9uKCkgewogICAgICBzeW5jU2Nyb2xsKGR2LCBESUZGX0lOU0VSVCkgJiYgZHJhd0Nvbm5lY3RvcnMoZHYpOwogICAgfSk7CiAgICBkdi5vcmlnLm9uKCJzY3JvbGwiLCBmdW5jdGlvbigpIHsKICAgICAgc3luY1Njcm9sbChkdiwgRElGRl9ERUxFVEUpICYmIGRyYXdDb25uZWN0b3JzKGR2KTsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gc3luY1Njcm9sbChkdiwgdHlwZSkgewogICAgLy8gQ2hhbmdlIGhhbmRsZXIgd2lsbCBkbyBhIHJlZnJlc2ggYWZ0ZXIgYSB0aW1lb3V0IHdoZW4gZGlmZiBpcyBvdXQgb2YgZGF0ZQogICAgaWYgKGR2LmRpZmZPdXRPZkRhdGUpIHJldHVybiBmYWxzZTsKICAgIGlmICghZHYubG9ja1Njcm9sbCkgcmV0dXJuIHRydWU7CiAgICB2YXIgZWRpdG9yLCBvdGhlciwgbm93ID0gK25ldyBEYXRlOwogICAgaWYgKHR5cGUgPT0gRElGRl9JTlNFUlQpIHsgZWRpdG9yID0gZHYuZWRpdDsgb3RoZXIgPSBkdi5vcmlnOyB9CiAgICBlbHNlIHsgZWRpdG9yID0gZHYub3JpZzsgb3RoZXIgPSBkdi5lZGl0OyB9CiAgICAvLyBEb24ndCB0YWtlIGFjdGlvbiBpZiB0aGUgcG9zaXRpb24gb2YgdGhpcyBlZGl0b3Igd2FzIHJlY2VudGx5IHNldAogICAgLy8gKHRvIHByZXZlbnQgZmVlZGJhY2sgbG9vcHMpCiAgICBpZiAoZWRpdG9yLnN0YXRlLnNjcm9sbFNldEJ5ID09IGR2ICYmIChlZGl0b3Iuc3RhdGUuc2Nyb2xsU2V0QXQgfHwgMCkgKyA1MCA+IG5vdykgcmV0dXJuIGZhbHNlOwoKICAgIHZhciBzSW5mbyA9IGVkaXRvci5nZXRTY3JvbGxJbmZvKCksIGhhbGZTY3JlZW4gPSAuNSAqIHNJbmZvLmNsaWVudEhlaWdodCwgbWlkWSA9IHNJbmZvLnRvcCArIGhhbGZTY3JlZW47CiAgICB2YXIgbWlkID0gZWRpdG9yLmxpbmVBdEhlaWdodChtaWRZLCAibG9jYWwiKTsKICAgIHZhciBhcm91bmQgPSBjaHVua0JvdW5kYXJpZXNBcm91bmQoZHYuZGlmZiwgbWlkLCB0eXBlID09IERJRkZfSU5TRVJUKTsKICAgIHZhciBvZmYgPSBnZXRPZmZzZXRzKGVkaXRvciwgdHlwZSA9PSBESUZGX0lOU0VSVCA/IGFyb3VuZC5lZGl0IDogYXJvdW5kLm9yaWcpOwogICAgdmFyIG9mZk90aGVyID0gZ2V0T2Zmc2V0cyhvdGhlciwgdHlwZSA9PSBESUZGX0lOU0VSVCA/IGFyb3VuZC5vcmlnIDogYXJvdW5kLmVkaXQpOwogICAgdmFyIHJhdGlvID0gKG1pZFkgLSBvZmYudG9wKSAvIChvZmYuYm90IC0gb2ZmLnRvcCk7CiAgICB2YXIgdGFyZ2V0UG9zID0gKG9mZk90aGVyLnRvcCAtIGhhbGZTY3JlZW4pICsgcmF0aW8gKiAob2ZmT3RoZXIuYm90IC0gb2ZmT3RoZXIudG9wKTsKCiAgICB2YXIgYm90RGlzdCwgbWl4OwogICAgLy8gU29tZSBjYXJlZnVsIHR3ZWFraW5nIHRvIG1ha2Ugc3VyZSBubyBzcGFjZSBpcyBsZWZ0IG91dCBvZiB2aWV3CiAgICAvLyB3aGVuIHNjcm9sbGluZyB0byB0b3Agb3IgYm90dG9tLgogICAgaWYgKHRhcmdldFBvcyA+IHNJbmZvLnRvcCAmJiAobWl4ID0gc0luZm8udG9wIC8gaGFsZlNjcmVlbikgPCAxKSB7CiAgICAgIHRhcmdldFBvcyA9IHRhcmdldFBvcyAqIG1peCArIHNJbmZvLnRvcCAqICgxIC0gbWl4KTsKICAgIH0gZWxzZSBpZiAoKGJvdERpc3QgPSBzSW5mby5oZWlnaHQgLSBzSW5mby5jbGllbnRIZWlnaHQgLSBzSW5mby50b3ApIDwgaGFsZlNjcmVlbikgewogICAgICB2YXIgb3RoZXJJbmZvID0gb3RoZXIuZ2V0U2Nyb2xsSW5mbygpOwogICAgICB2YXIgYm90RGlzdE90aGVyID0gb3RoZXJJbmZvLmhlaWdodCAtIG90aGVySW5mby5jbGllbnRIZWlnaHQgLSB0YXJnZXRQb3M7CiAgICAgIGlmIChib3REaXN0T3RoZXIgPiBib3REaXN0ICYmIChtaXggPSBib3REaXN0IC8gaGFsZlNjcmVlbikgPCAxKQogICAgICAgIHRhcmdldFBvcyA9IHRhcmdldFBvcyAqIG1peCArIChvdGhlckluZm8uaGVpZ2h0IC0gb3RoZXJJbmZvLmNsaWVudEhlaWdodCAtIGJvdERpc3QpICogKDEgLSBtaXgpOwogICAgfQoKICAgIG90aGVyLnNjcm9sbFRvKHNJbmZvLmxlZnQsIHRhcmdldFBvcyk7CiAgICBvdGhlci5zdGF0ZS5zY3JvbGxTZXRBdCA9IG5vdzsKICAgIG90aGVyLnN0YXRlLnNjcm9sbFNldEJ5ID0gZHY7CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIGZ1bmN0aW9uIGdldE9mZnNldHMoZWRpdG9yLCBhcm91bmQpIHsKICAgIHZhciBib3QgPSBhcm91bmQuYWZ0ZXI7CiAgICBpZiAoYm90ID09IG51bGwpIGJvdCA9IGVkaXRvci5sYXN0TGluZSgpICsgMTsKICAgIHJldHVybiB7dG9wOiBlZGl0b3IuaGVpZ2h0QXRMaW5lKGFyb3VuZC5iZWZvcmUgfHwgMCwgImxvY2FsIiksCiAgICAgICAgICAgIGJvdDogZWRpdG9yLmhlaWdodEF0TGluZShib3QsICJsb2NhbCIpfTsKICB9CgogIGZ1bmN0aW9uIHNldFNjcm9sbExvY2soZHYsIHZhbCwgYWN0aW9uKSB7CiAgICBkdi5sb2NrU2Nyb2xsID0gdmFsOwogICAgaWYgKHZhbCAmJiBhY3Rpb24gIT0gZmFsc2UpIHN5bmNTY3JvbGwoZHYsIERJRkZfSU5TRVJUKSAmJiBkcmF3Q29ubmVjdG9ycyhkdik7CiAgICBkdi5sb2NrQnV0dG9uLmlubmVySFRNTCA9IHZhbCA/ICJcdTIxZGJcdTIxZGEiIDogIlx1MjFkYiZuYnNwOyZuYnNwO1x1MjFkYSI7CiAgfQoKICAvLyBVcGRhdGluZyB0aGUgbWFya3MgZm9yIGVkaXRvciBjb250ZW50CgogIGZ1bmN0aW9uIGNsZWFyTWFya3MoZWRpdG9yLCBhcnIsIGNsYXNzZXMpIHsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgKytpKSB7CiAgICAgIHZhciBtYXJrID0gYXJyW2ldOwogICAgICBpZiAobWFyayBpbnN0YW5jZW9mIENvZGVNaXJyb3IuVGV4dE1hcmtlcikgewogICAgICAgIG1hcmsuY2xlYXIoKTsKICAgICAgfSBlbHNlIGlmIChtYXJrLnBhcmVudCkgewogICAgICAgIGVkaXRvci5yZW1vdmVMaW5lQ2xhc3MobWFyaywgImJhY2tncm91bmQiLCBjbGFzc2VzLmNodW5rKTsKICAgICAgICBlZGl0b3IucmVtb3ZlTGluZUNsYXNzKG1hcmssICJiYWNrZ3JvdW5kIiwgY2xhc3Nlcy5zdGFydCk7CiAgICAgICAgZWRpdG9yLnJlbW92ZUxpbmVDbGFzcyhtYXJrLCAiYmFja2dyb3VuZCIsIGNsYXNzZXMuZW5kKTsKICAgICAgfQogICAgfQogICAgYXJyLmxlbmd0aCA9IDA7CiAgfQoKICAvLyBGSVhNRSBtYXliZSBhZGQgYSBtYXJnaW4gYXJvdW5kIHZpZXdwb3J0IHRvIHByZXZlbnQgdG9vIG1hbnkgdXBkYXRlcwogIGZ1bmN0aW9uIHVwZGF0ZU1hcmtzKGVkaXRvciwgZGlmZiwgc3RhdGUsIHR5cGUsIGNsYXNzZXMpIHsKICAgIHZhciB2cCA9IGVkaXRvci5nZXRWaWV3cG9ydCgpOwogICAgZWRpdG9yLm9wZXJhdGlvbihmdW5jdGlvbigpIHsKICAgICAgaWYgKHN0YXRlLmZyb20gPT0gc3RhdGUudG8gfHwgdnAuZnJvbSAtIHN0YXRlLnRvID4gMjAgfHwgc3RhdGUuZnJvbSAtIHZwLnRvID4gMjApIHsKICAgICAgICBjbGVhck1hcmtzKGVkaXRvciwgc3RhdGUubWFya2VkLCBjbGFzc2VzKTsKICAgICAgICBtYXJrQ2hhbmdlcyhlZGl0b3IsIGRpZmYsIHR5cGUsIHN0YXRlLm1hcmtlZCwgdnAuZnJvbSwgdnAudG8sIGNsYXNzZXMpOwogICAgICAgIHN0YXRlLmZyb20gPSB2cC5mcm9tOyBzdGF0ZS50byA9IHZwLnRvOwogICAgICB9IGVsc2UgewogICAgICAgIGlmICh2cC5mcm9tIDwgc3RhdGUuZnJvbSkgewogICAgICAgICAgbWFya0NoYW5nZXMoZWRpdG9yLCBkaWZmLCB0eXBlLCBzdGF0ZS5tYXJrZWQsIHZwLmZyb20sIHN0YXRlLmZyb20sIGNsYXNzZXMpOwogICAgICAgICAgc3RhdGUuZnJvbSA9IHZwLmZyb207CiAgICAgICAgfQogICAgICAgIGlmICh2cC50byA+IHN0YXRlLnRvKSB7CiAgICAgICAgICBtYXJrQ2hhbmdlcyhlZGl0b3IsIGRpZmYsIHR5cGUsIHN0YXRlLm1hcmtlZCwgc3RhdGUudG8sIHZwLnRvLCBjbGFzc2VzKTsKICAgICAgICAgIHN0YXRlLnRvID0gdnAudG87CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIG1hcmtDaGFuZ2VzKGVkaXRvciwgZGlmZiwgdHlwZSwgbWFya3MsIGZyb20sIHRvLCBjbGFzc2VzKSB7CiAgICB2YXIgcG9zID0gUG9zKDAsIDApOwogICAgdmFyIHRvcCA9IFBvcyhmcm9tLCAwKSwgYm90ID0gZWRpdG9yLmNsaXBQb3MoUG9zKHRvIC0gMSkpOwogICAgdmFyIGNscyA9IHR5cGUgPT0gRElGRl9ERUxFVEUgPyBjbGFzc2VzLmRlbCA6IGNsYXNzZXMuaW5zZXJ0OwogICAgZnVuY3Rpb24gbWFya0NodW5rKHN0YXJ0LCBlbmQpIHsKICAgICAgdmFyIGJmcm9tID0gTWF0aC5tYXgoZnJvbSwgc3RhcnQpLCBidG8gPSBNYXRoLm1pbih0bywgZW5kKTsKICAgICAgZm9yICh2YXIgaSA9IGJmcm9tOyBpIDwgYnRvOyArK2kpIHsKICAgICAgICB2YXIgbGluZSA9IGVkaXRvci5hZGRMaW5lQ2xhc3MoaSwgImJhY2tncm91bmQiLCBjbGFzc2VzLmNodW5rKTsKICAgICAgICBpZiAoaSA9PSBzdGFydCkgZWRpdG9yLmFkZExpbmVDbGFzcyhsaW5lLCAiYmFja2dyb3VuZCIsIGNsYXNzZXMuc3RhcnQpOwogICAgICAgIGlmIChpID09IGVuZCAtIDEpIGVkaXRvci5hZGRMaW5lQ2xhc3MobGluZSwgImJhY2tncm91bmQiLCBjbGFzc2VzLmVuZCk7CiAgICAgICAgbWFya3MucHVzaChsaW5lKTsKICAgICAgfQogICAgICAvLyBXaGVuIHRoZSBjaHVuayBpcyBlbXB0eSwgbWFrZSBzdXJlIGEgaG9yaXpvbnRhbCBsaW5lIHNob3dzIHVwCiAgICAgIGlmIChzdGFydCA9PSBlbmQgJiYgYmZyb20gPT0gZW5kICYmIGJ0byA9PSBlbmQpIHsKICAgICAgICBpZiAoYmZyb20pCiAgICAgICAgICBtYXJrcy5wdXNoKGVkaXRvci5hZGRMaW5lQ2xhc3MoYmZyb20gLSAxLCAiYmFja2dyb3VuZCIsIGNsYXNzZXMuZW5kKSk7CiAgICAgICAgZWxzZQogICAgICAgICAgbWFya3MucHVzaChlZGl0b3IuYWRkTGluZUNsYXNzKGJmcm9tLCAiYmFja2dyb3VuZCIsIGNsYXNzZXMuc3RhcnQpKTsKICAgICAgfQogICAgfQoKICAgIHZhciBjaHVua1N0YXJ0ID0gMDsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGlmZi5sZW5ndGg7ICsraSkgewogICAgICB2YXIgcGFydCA9IGRpZmZbaV0sIHRwID0gcGFydFswXSwgc3RyID0gcGFydFsxXTsKICAgICAgaWYgKHRwID09IERJRkZfRVFVQUwpIHsKICAgICAgICB2YXIgY2xlYW5Gcm9tID0gcG9zLmxpbmUgKyAoc3RhcnRPZkxpbmVDbGVhbihkaWZmLCBpKSA/IDAgOiAxKTsKICAgICAgICBtb3ZlT3Zlcihwb3MsIHN0cik7CiAgICAgICAgdmFyIGNsZWFuVG8gPSBwb3MubGluZSArIChlbmRPZkxpbmVDbGVhbihkaWZmLCBpKSA/IDEgOiAwKTsKICAgICAgICBpZiAoY2xlYW5UbyA+IGNsZWFuRnJvbSkgewogICAgICAgICAgaWYgKGkpIG1hcmtDaHVuayhjaHVua1N0YXJ0LCBjbGVhbkZyb20pOwogICAgICAgICAgY2h1bmtTdGFydCA9IGNsZWFuVG87CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGlmICh0cCA9PSB0eXBlKSB7CiAgICAgICAgICB2YXIgZW5kID0gbW92ZU92ZXIocG9zLCBzdHIsIHRydWUpOwogICAgICAgICAgdmFyIGEgPSBwb3NNYXgodG9wLCBwb3MpLCBiID0gcG9zTWluKGJvdCwgZW5kKTsKICAgICAgICAgIGlmICghcG9zRXEoYSwgYikpCiAgICAgICAgICAgIG1hcmtzLnB1c2goZWRpdG9yLm1hcmtUZXh0KGEsIGIsIHtjbGFzc05hbWU6IGNsc30pKTsKICAgICAgICAgIHBvcyA9IGVuZDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGlmIChjaHVua1N0YXJ0IDw9IHBvcy5saW5lKSBtYXJrQ2h1bmsoY2h1bmtTdGFydCwgcG9zLmxpbmUgKyAxKTsKICB9CgogIC8vIFVwZGF0aW5nIHRoZSBnYXAgYmV0d2VlbiBlZGl0b3IgYW5kIG9yaWdpbmFsCgogIGZ1bmN0aW9uIGRyYXdDb25uZWN0b3JzKGR2KSB7CiAgICBpZiAoIWR2LnNob3dEaWZmZXJlbmNlcykgcmV0dXJuOwoKICAgIGlmIChkdi5zdmcpIHsKICAgICAgY2xlYXIoZHYuc3ZnKTsKICAgICAgdmFyIHcgPSBkdi5nYXAub2Zmc2V0V2lkdGg7CiAgICAgIGF0dHJzKGR2LnN2ZywgIndpZHRoIiwgdywgImhlaWdodCIsIGR2LmdhcC5vZmZzZXRIZWlnaHQpOwogICAgfQogICAgY2xlYXIoZHYuY29weUJ1dHRvbnMpOwoKICAgIHZhciBmbGlwID0gZHYudHlwZSA9PSAibGVmdCI7CiAgICB2YXIgdnBFZGl0ID0gZHYuZWRpdC5nZXRWaWV3cG9ydCgpLCB2cE9yaWcgPSBkdi5vcmlnLmdldFZpZXdwb3J0KCk7CiAgICB2YXIgc1RvcEVkaXQgPSBkdi5lZGl0LmdldFNjcm9sbEluZm8oKS50b3AsIHNUb3BPcmlnID0gZHYub3JpZy5nZXRTY3JvbGxJbmZvKCkudG9wOwogICAgaXRlcmF0ZUNodW5rcyhkdi5kaWZmLCBmdW5jdGlvbih0b3BPcmlnLCBib3RPcmlnLCB0b3BFZGl0LCBib3RFZGl0KSB7CiAgICAgIGlmICh0b3BFZGl0ID4gdnBFZGl0LnRvIHx8IGJvdEVkaXQgPCB2cEVkaXQuZnJvbSB8fAogICAgICAgICAgdG9wT3JpZyA+IHZwT3JpZy50byB8fCBib3RPcmlnIDwgdnBPcmlnLmZyb20pCiAgICAgICAgcmV0dXJuOwogICAgICB2YXIgdG9wTHB4ID0gZHYub3JpZy5oZWlnaHRBdExpbmUodG9wT3JpZywgImxvY2FsIikgLSBzVG9wT3JpZywgdG9wID0gdG9wTHB4OwogICAgICBpZiAoZHYuc3ZnKSB7CiAgICAgICAgdmFyIHRvcFJweCA9IGR2LmVkaXQuaGVpZ2h0QXRMaW5lKHRvcEVkaXQsICJsb2NhbCIpIC0gc1RvcEVkaXQ7CiAgICAgICAgaWYgKGZsaXApIHsgdmFyIHRtcCA9IHRvcExweDsgdG9wTHB4ID0gdG9wUnB4OyB0b3BScHggPSB0bXA7IH0KICAgICAgICB2YXIgYm90THB4ID0gZHYub3JpZy5oZWlnaHRBdExpbmUoYm90T3JpZywgImxvY2FsIikgLSBzVG9wT3JpZzsKICAgICAgICB2YXIgYm90UnB4ID0gZHYuZWRpdC5oZWlnaHRBdExpbmUoYm90RWRpdCwgImxvY2FsIikgLSBzVG9wRWRpdDsKICAgICAgICBpZiAoZmxpcCkgeyB2YXIgdG1wID0gYm90THB4OyBib3RMcHggPSBib3RScHg7IGJvdFJweCA9IHRtcDsgfQogICAgICAgIHZhciBjdXJ2ZVRvcCA9ICIgQyAiICsgdy8yICsgIiAiICsgdG9wUnB4ICsgIiAiICsgdy8yICsgIiAiICsgdG9wTHB4ICsgIiAiICsgKHcgKyAyKSArICIgIiArIHRvcExweDsKICAgICAgICB2YXIgY3VydmVCb3QgPSAiIEMgIiArIHcvMiArICIgIiArIGJvdExweCArICIgIiArIHcvMiArICIgIiArIGJvdFJweCArICIgLTEgIiArIGJvdFJweDsKICAgICAgICBhdHRycyhkdi5zdmcuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHN2Z05TLCAicGF0aCIpKSwKICAgICAgICAgICAgICAiZCIsICJNIC0xICIgKyB0b3BScHggKyBjdXJ2ZVRvcCArICIgTCAiICsgKHcgKyAyKSArICIgIiArIGJvdExweCArIGN1cnZlQm90ICsgIiB6IiwKICAgICAgICAgICAgICAiY2xhc3MiLCBkdi5jbGFzc2VzLmNvbm5lY3QpOwogICAgICB9CiAgICAgIHZhciBjb3B5ID0gZHYuY29weUJ1dHRvbnMuYXBwZW5kQ2hpbGQoZWx0KCJkaXYiLCBkdi50eXBlID09ICJsZWZ0IiA/ICJcdTIxZGQiIDogIlx1MjFkYyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb2RlTWlycm9yLW1lcmdlLWNvcHkiKSk7CiAgICAgIGNvcHkudGl0bGUgPSAiUmV2ZXJ0IGNodW5rIjsKICAgICAgY29weS5jaHVuayA9IHt0b3BFZGl0OiB0b3BFZGl0LCBib3RFZGl0OiBib3RFZGl0LCB0b3BPcmlnOiB0b3BPcmlnLCBib3RPcmlnOiBib3RPcmlnfTsKICAgICAgY29weS5zdHlsZS50b3AgPSB0b3AgKyAicHgiOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBjb3B5Q2h1bmsoZHYsIGNodW5rKSB7CiAgICBpZiAoZHYuZGlmZk91dE9mRGF0ZSkgcmV0dXJuOwogICAgZHYuZWRpdC5yZXBsYWNlUmFuZ2UoZHYub3JpZy5nZXRSYW5nZShQb3MoY2h1bmsudG9wT3JpZywgMCksIFBvcyhjaHVuay5ib3RPcmlnLCAwKSksCiAgICAgICAgICAgICAgICAgICAgICAgICBQb3MoY2h1bmsudG9wRWRpdCwgMCksIFBvcyhjaHVuay5ib3RFZGl0LCAwKSk7CiAgfQoKICAvLyBNZXJnZSB2aWV3LCBjb250YWluaW5nIDAsIDEsIG9yIDIgZGlmZiB2aWV3cy4KCiAgdmFyIE1lcmdlVmlldyA9IENvZGVNaXJyb3IuTWVyZ2VWaWV3ID0gZnVuY3Rpb24obm9kZSwgb3B0aW9ucykgewogICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIE1lcmdlVmlldykpIHJldHVybiBuZXcgTWVyZ2VWaWV3KG5vZGUsIG9wdGlvbnMpOwoKICAgIHZhciBvcmlnTGVmdCA9IG9wdGlvbnMub3JpZ0xlZnQsIG9yaWdSaWdodCA9IG9wdGlvbnMub3JpZ1JpZ2h0ID09IG51bGwgPyBvcHRpb25zLm9yaWcgOiBvcHRpb25zLm9yaWdSaWdodDsKICAgIHZhciBoYXNMZWZ0ID0gb3JpZ0xlZnQgIT0gbnVsbCwgaGFzUmlnaHQgPSBvcmlnUmlnaHQgIT0gbnVsbDsKICAgIHZhciBwYW5lcyA9IDEgKyAoaGFzTGVmdCA/IDEgOiAwKSArIChoYXNSaWdodCA/IDEgOiAwKTsKICAgIHZhciB3cmFwID0gW10sIGxlZnQgPSB0aGlzLmxlZnQgPSBudWxsLCByaWdodCA9IHRoaXMucmlnaHQgPSBudWxsOwoKICAgIGlmIChoYXNMZWZ0KSB7CiAgICAgIGxlZnQgPSB0aGlzLmxlZnQgPSBuZXcgRGlmZlZpZXcodGhpcywgImxlZnQiKTsKICAgICAgdmFyIGxlZnRQYW5lID0gZWx0KCJkaXYiLCBudWxsLCAiQ29kZU1pcnJvci1tZXJnZS1wYW5lIik7CiAgICAgIHdyYXAucHVzaChsZWZ0UGFuZSk7CiAgICAgIHdyYXAucHVzaChidWlsZEdhcChsZWZ0KSk7CiAgICB9CgogICAgdmFyIGVkaXRQYW5lID0gZWx0KCJkaXYiLCBudWxsLCAiQ29kZU1pcnJvci1tZXJnZS1wYW5lIik7CiAgICB3cmFwLnB1c2goZWRpdFBhbmUpOwoKICAgIGlmIChoYXNSaWdodCkgewogICAgICByaWdodCA9IHRoaXMucmlnaHQgPSBuZXcgRGlmZlZpZXcodGhpcywgInJpZ2h0Iik7CiAgICAgIHdyYXAucHVzaChidWlsZEdhcChyaWdodCkpOwogICAgICB2YXIgcmlnaHRQYW5lID0gZWx0KCJkaXYiLCBudWxsLCAiQ29kZU1pcnJvci1tZXJnZS1wYW5lIik7CiAgICAgIHdyYXAucHVzaChyaWdodFBhbmUpOwogICAgfQoKICAgIChoYXNSaWdodCA/IHJpZ2h0UGFuZSA6IGVkaXRQYW5lKS5jbGFzc05hbWUgKz0gIiBDb2RlTWlycm9yLW1lcmdlLXBhbmUtcmlnaHRtb3N0IjsKCiAgICB3cmFwLnB1c2goZWx0KCJkaXYiLCBudWxsLCBudWxsLCAiaGVpZ2h0OiAwOyBjbGVhcjogYm90aDsiKSk7CiAgICB2YXIgd3JhcEVsdCA9IHRoaXMud3JhcCA9IG5vZGUuYXBwZW5kQ2hpbGQoZWx0KCJkaXYiLCB3cmFwLCAiQ29kZU1pcnJvci1tZXJnZSBDb2RlTWlycm9yLW1lcmdlLSIgKyBwYW5lcyArICJwYW5lIikpOwogICAgdGhpcy5lZGl0ID0gQ29kZU1pcnJvcihlZGl0UGFuZSwgY29weU9iaihvcHRpb25zKSk7CgogICAgaWYgKGxlZnQpIGxlZnQuaW5pdChsZWZ0UGFuZSwgb3JpZ0xlZnQsIG9wdGlvbnMpOwogICAgaWYgKHJpZ2h0KSByaWdodC5pbml0KHJpZ2h0UGFuZSwgb3JpZ1JpZ2h0LCBvcHRpb25zKTsKCiAgICB2YXIgb25SZXNpemUgPSBmdW5jdGlvbigpIHsKICAgICAgaWYgKGxlZnQpIGRyYXdDb25uZWN0b3JzKGxlZnQpOwogICAgICBpZiAocmlnaHQpIGRyYXdDb25uZWN0b3JzKHJpZ2h0KTsKICAgIH07CiAgICBDb2RlTWlycm9yLm9uKHdpbmRvdywgInJlc2l6ZSIsIG9uUmVzaXplKTsKICAgIHZhciByZXNpemVJbnRlcnZhbCA9IHNldEludGVydmFsKGZ1bmN0aW9uKCkgewogICAgICBmb3IgKHZhciBwID0gd3JhcEVsdC5wYXJlbnROb2RlOyBwICYmIHAgIT0gZG9jdW1lbnQuYm9keTsgcCA9IHAucGFyZW50Tm9kZSkge30KICAgICAgaWYgKCFwKSB7IGNsZWFySW50ZXJ2YWwocmVzaXplSW50ZXJ2YWwpOyBDb2RlTWlycm9yLm9mZih3aW5kb3csICJyZXNpemUiLCBvblJlc2l6ZSk7IH0KICAgIH0sIDUwMDApOwogIH07CgogIGZ1bmN0aW9uIGJ1aWxkR2FwKGR2KSB7CiAgICB2YXIgbG9jayA9IGR2LmxvY2tCdXR0b24gPSBlbHQoImRpdiIsIG51bGwsICJDb2RlTWlycm9yLW1lcmdlLXNjcm9sbGxvY2siKTsKICAgIGxvY2sudGl0bGUgPSAiVG9nZ2xlIGxvY2tlZCBzY3JvbGxpbmciOwogICAgdmFyIGxvY2tXcmFwID0gZWx0KCJkaXYiLCBbbG9ja10sICJDb2RlTWlycm9yLW1lcmdlLXNjcm9sbGxvY2std3JhcCIpOwogICAgQ29kZU1pcnJvci5vbihsb2NrLCAiY2xpY2siLCBmdW5jdGlvbigpIHsgc2V0U2Nyb2xsTG9jayhkdiwgIWR2LmxvY2tTY3JvbGwpOyB9KTsKICAgIGR2LmNvcHlCdXR0b25zID0gZWx0KCJkaXYiLCBudWxsLCAiQ29kZU1pcnJvci1tZXJnZS1jb3B5YnV0dG9ucy0iICsgZHYudHlwZSk7CiAgICBDb2RlTWlycm9yLm9uKGR2LmNvcHlCdXR0b25zLCAiY2xpY2siLCBmdW5jdGlvbihlKSB7CiAgICAgIHZhciBub2RlID0gZS50YXJnZXQgfHwgZS5zcmNFbGVtZW50OwogICAgICBpZiAobm9kZS5jaHVuaykgY29weUNodW5rKGR2LCBub2RlLmNodW5rKTsKICAgIH0pOwogICAgdmFyIGdhcEVsdHMgPSBbZHYuY29weUJ1dHRvbnMsIGxvY2tXcmFwXTsKICAgIHZhciBzdmcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMgJiYgZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHN2Z05TLCAic3ZnIik7CiAgICBpZiAoc3ZnICYmICFzdmcuY3JlYXRlU1ZHUmVjdCkgc3ZnID0gbnVsbDsKICAgIGR2LnN2ZyA9IHN2ZzsKICAgIGlmIChzdmcpIGdhcEVsdHMucHVzaChzdmcpOwoKICAgIHJldHVybiBkdi5nYXAgPSBlbHQoImRpdiIsIGdhcEVsdHMsICJDb2RlTWlycm9yLW1lcmdlLWdhcCIpOwogIH0KCiAgTWVyZ2VWaWV3LnByb3RvdHlwZSA9IHsKICAgIGNvbnN0dWN0b3I6IE1lcmdlVmlldywKICAgIGVkaXRvcjogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLmVkaXQ7IH0sCiAgICByaWdodE9yaWdpbmFsOiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMucmlnaHQgJiYgdGhpcy5yaWdodC5vcmlnOyB9LAogICAgbGVmdE9yaWdpbmFsOiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMubGVmdCAmJiB0aGlzLmxlZnQub3JpZzsgfSwKICAgIHNldFNob3dEaWZmZXJlbmNlczogZnVuY3Rpb24odmFsKSB7CiAgICAgIGlmICh0aGlzLnJpZ2h0KSB0aGlzLnJpZ2h0LnNldFNob3dEaWZmZXJlbmNlcyh2YWwpOwogICAgICBpZiAodGhpcy5sZWZ0KSB0aGlzLmxlZnQuc2V0U2hvd0RpZmZlcmVuY2VzKHZhbCk7CiAgICB9LAogICAgcmlnaHRDaHVua3M6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gdGhpcy5yaWdodCAmJiBnZXRDaHVua3ModGhpcy5yaWdodCk7CiAgICB9LAogICAgbGVmdENodW5rczogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLmxlZnQgJiYgZ2V0Q2h1bmtzKHRoaXMubGVmdCk7CiAgICB9CiAgfTsKCiAgZnVuY3Rpb24gYXNTdHJpbmcob2JqKSB7CiAgICBpZiAodHlwZW9mIG9iaiA9PSAic3RyaW5nIikgcmV0dXJuIG9iajsKICAgIGVsc2UgcmV0dXJuIG9iai5nZXRWYWx1ZSgpOwogIH0KCiAgLy8gT3BlcmF0aW9ucyBvbiBkaWZmcwoKICB2YXIgZG1wID0gbmV3IGRpZmZfbWF0Y2hfcGF0Y2goKTsKICBmdW5jdGlvbiBnZXREaWZmKGEsIGIpIHsKICAgIHZhciBkaWZmID0gZG1wLmRpZmZfbWFpbihhLCBiKTsKICAgIGRtcC5kaWZmX2NsZWFudXBTZW1hbnRpYyhkaWZmKTsKICAgIC8vIFRoZSBsaWJyYXJ5IHNvbWV0aW1lcyBsZWF2ZXMgaW4gZW1wdHkgcGFydHMsIHdoaWNoIGNvbmZ1c2UgdGhlIGFsZ29yaXRobQogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkaWZmLmxlbmd0aDsgKytpKSB7CiAgICAgIHZhciBwYXJ0ID0gZGlmZltpXTsKICAgICAgaWYgKCFwYXJ0WzFdKSB7CiAgICAgICAgZGlmZi5zcGxpY2UoaS0tLCAxKTsKICAgICAgfSBlbHNlIGlmIChpICYmIGRpZmZbaSAtIDFdWzBdID09IHBhcnRbMF0pIHsKICAgICAgICBkaWZmLnNwbGljZShpLS0sIDEpOwogICAgICAgIGRpZmZbaV1bMV0gKz0gcGFydFsxXTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGRpZmY7CiAgfQoKICBmdW5jdGlvbiBpdGVyYXRlQ2h1bmtzKGRpZmYsIGYpIHsKICAgIHZhciBzdGFydEVkaXQgPSAwLCBzdGFydE9yaWcgPSAwOwogICAgdmFyIGVkaXQgPSBQb3MoMCwgMCksIG9yaWcgPSBQb3MoMCwgMCk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpZmYubGVuZ3RoOyArK2kpIHsKICAgICAgdmFyIHBhcnQgPSBkaWZmW2ldLCB0cCA9IHBhcnRbMF07CiAgICAgIGlmICh0cCA9PSBESUZGX0VRVUFMKSB7CiAgICAgICAgdmFyIHN0YXJ0T2ZmID0gc3RhcnRPZkxpbmVDbGVhbihkaWZmLCBpKSA/IDAgOiAxOwogICAgICAgIHZhciBjbGVhbkZyb21FZGl0ID0gZWRpdC5saW5lICsgc3RhcnRPZmYsIGNsZWFuRnJvbU9yaWcgPSBvcmlnLmxpbmUgKyBzdGFydE9mZjsKICAgICAgICBtb3ZlT3ZlcihlZGl0LCBwYXJ0WzFdLCBudWxsLCBvcmlnKTsKICAgICAgICB2YXIgZW5kT2ZmID0gZW5kT2ZMaW5lQ2xlYW4oZGlmZiwgaSkgPyAxIDogMDsKICAgICAgICB2YXIgY2xlYW5Ub0VkaXQgPSBlZGl0LmxpbmUgKyBlbmRPZmYsIGNsZWFuVG9PcmlnID0gb3JpZy5saW5lICsgZW5kT2ZmOwogICAgICAgIGlmIChjbGVhblRvRWRpdCA+IGNsZWFuRnJvbUVkaXQpIHsKICAgICAgICAgIGlmIChpKSBmKHN0YXJ0T3JpZywgY2xlYW5Gcm9tT3JpZywgc3RhcnRFZGl0LCBjbGVhbkZyb21FZGl0KTsKICAgICAgICAgIHN0YXJ0RWRpdCA9IGNsZWFuVG9FZGl0OyBzdGFydE9yaWcgPSBjbGVhblRvT3JpZzsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbW92ZU92ZXIodHAgPT0gRElGRl9JTlNFUlQgPyBlZGl0IDogb3JpZywgcGFydFsxXSk7CiAgICAgIH0KICAgIH0KICAgIGlmIChzdGFydEVkaXQgPD0gZWRpdC5saW5lIHx8IHN0YXJ0T3JpZyA8PSBvcmlnLmxpbmUpCiAgICAgIGYoc3RhcnRPcmlnLCBvcmlnLmxpbmUgKyAxLCBzdGFydEVkaXQsIGVkaXQubGluZSArIDEpOwogIH0KCiAgZnVuY3Rpb24gZ2V0Q2h1bmtzKGR2KSB7CiAgICBlbnN1cmVEaWZmKGR2KTsKICAgIHZhciBjb2xsZWN0ID0gW107CiAgICBpdGVyYXRlQ2h1bmtzKGR2LmRpZmYsIGZ1bmN0aW9uKHRvcE9yaWcsIGJvdE9yaWcsIHRvcEVkaXQsIGJvdEVkaXQpIHsKICAgICAgY29sbGVjdC5wdXNoKHtvcmlnRnJvbTogdG9wT3JpZywgb3JpZ1RvOiBib3RPcmlnLAogICAgICAgICAgICAgICAgICAgIGVkaXRGcm9tOiB0b3BFZGl0LCBlZGl0VG86IGJvdEVkaXR9KTsKICAgIH0pOwogICAgcmV0dXJuIGNvbGxlY3Q7CiAgfQoKICBmdW5jdGlvbiBlbmRPZkxpbmVDbGVhbihkaWZmLCBpKSB7CiAgICBpZiAoaSA9PSBkaWZmLmxlbmd0aCAtIDEpIHJldHVybiB0cnVlOwogICAgdmFyIG5leHQgPSBkaWZmW2kgKyAxXVsxXTsKICAgIGlmIChuZXh0Lmxlbmd0aCA9PSAxIHx8IG5leHQuY2hhckNvZGVBdCgwKSAhPSAxMCkgcmV0dXJuIGZhbHNlOwogICAgaWYgKGkgPT0gZGlmZi5sZW5ndGggLSAyKSByZXR1cm4gdHJ1ZTsKICAgIG5leHQgPSBkaWZmW2kgKyAyXVsxXTsKICAgIHJldHVybiBuZXh0Lmxlbmd0aCA+IDEgJiYgbmV4dC5jaGFyQ29kZUF0KDApID09IDEwOwogIH0KCiAgZnVuY3Rpb24gc3RhcnRPZkxpbmVDbGVhbihkaWZmLCBpKSB7CiAgICBpZiAoaSA9PSAwKSByZXR1cm4gdHJ1ZTsKICAgIHZhciBsYXN0ID0gZGlmZltpIC0gMV1bMV07CiAgICBpZiAobGFzdC5jaGFyQ29kZUF0KGxhc3QubGVuZ3RoIC0gMSkgIT0gMTApIHJldHVybiBmYWxzZTsKICAgIGlmIChpID09IDEpIHJldHVybiB0cnVlOwogICAgbGFzdCA9IGRpZmZbaSAtIDJdWzFdOwogICAgcmV0dXJuIGxhc3QuY2hhckNvZGVBdChsYXN0Lmxlbmd0aCAtIDEpID09IDEwOwogIH0KCiAgZnVuY3Rpb24gY2h1bmtCb3VuZGFyaWVzQXJvdW5kKGRpZmYsIG4sIG5JbkVkaXQpIHsKICAgIHZhciBiZWZvcmVFLCBhZnRlckUsIGJlZm9yZU8sIGFmdGVyTzsKICAgIGl0ZXJhdGVDaHVua3MoZGlmZiwgZnVuY3Rpb24oZnJvbU9yaWcsIHRvT3JpZywgZnJvbUVkaXQsIHRvRWRpdCkgewogICAgICB2YXIgZnJvbUxvY2FsID0gbkluRWRpdCA/IGZyb21FZGl0IDogZnJvbU9yaWc7CiAgICAgIHZhciB0b0xvY2FsID0gbkluRWRpdCA/IHRvRWRpdCA6IHRvT3JpZzsKICAgICAgaWYgKGFmdGVyRSA9PSBudWxsKSB7CiAgICAgICAgaWYgKGZyb21Mb2NhbCA+IG4pIHsgYWZ0ZXJFID0gZnJvbUVkaXQ7IGFmdGVyTyA9IGZyb21PcmlnOyB9CiAgICAgICAgZWxzZSBpZiAodG9Mb2NhbCA+IG4pIHsgYWZ0ZXJFID0gdG9FZGl0OyBhZnRlck8gPSB0b09yaWc7IH0KICAgICAgfQogICAgICBpZiAodG9Mb2NhbCA8PSBuKSB7IGJlZm9yZUUgPSB0b0VkaXQ7IGJlZm9yZU8gPSB0b09yaWc7IH0KICAgICAgZWxzZSBpZiAoZnJvbUxvY2FsIDw9IG4pIHsgYmVmb3JlRSA9IGZyb21FZGl0OyBiZWZvcmVPID0gZnJvbU9yaWc7IH0KICAgIH0pOwogICAgcmV0dXJuIHtlZGl0OiB7YmVmb3JlOiBiZWZvcmVFLCBhZnRlcjogYWZ0ZXJFfSwgb3JpZzoge2JlZm9yZTogYmVmb3JlTywgYWZ0ZXI6IGFmdGVyT319OwogIH0KCiAgLy8gR2VuZXJhbCB1dGlsaXRpZXMKCiAgZnVuY3Rpb24gZWx0KHRhZywgY29udGVudCwgY2xhc3NOYW1lLCBzdHlsZSkgewogICAgdmFyIGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7CiAgICBpZiAoY2xhc3NOYW1lKSBlLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKICAgIGlmIChzdHlsZSkgZS5zdHlsZS5jc3NUZXh0ID0gc3R5bGU7CiAgICBpZiAodHlwZW9mIGNvbnRlbnQgPT0gInN0cmluZyIpIGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY29udGVudCkpOwogICAgZWxzZSBpZiAoY29udGVudCkgZm9yICh2YXIgaSA9IDA7IGkgPCBjb250ZW50Lmxlbmd0aDsgKytpKSBlLmFwcGVuZENoaWxkKGNvbnRlbnRbaV0pOwogICAgcmV0dXJuIGU7CiAgfQoKICBmdW5jdGlvbiBjbGVhcihub2RlKSB7CiAgICBmb3IgKHZhciBjb3VudCA9IG5vZGUuY2hpbGROb2Rlcy5sZW5ndGg7IGNvdW50ID4gMDsgLS1jb3VudCkKICAgICAgbm9kZS5yZW1vdmVDaGlsZChub2RlLmZpcnN0Q2hpbGQpOwogIH0KCiAgZnVuY3Rpb24gYXR0cnMoZWx0KSB7CiAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkgKz0gMikKICAgICAgZWx0LnNldEF0dHJpYnV0ZShhcmd1bWVudHNbaV0sIGFyZ3VtZW50c1tpKzFdKTsKICB9CgogIGZ1bmN0aW9uIGNvcHlPYmoob2JqLCB0YXJnZXQpIHsKICAgIGlmICghdGFyZ2V0KSB0YXJnZXQgPSB7fTsKICAgIGZvciAodmFyIHByb3AgaW4gb2JqKSBpZiAob2JqLmhhc093blByb3BlcnR5KHByb3ApKSB0YXJnZXRbcHJvcF0gPSBvYmpbcHJvcF07CiAgICByZXR1cm4gdGFyZ2V0OwogIH0KCiAgZnVuY3Rpb24gbW92ZU92ZXIocG9zLCBzdHIsIGNvcHksIG90aGVyKSB7CiAgICB2YXIgb3V0ID0gY29weSA/IFBvcyhwb3MubGluZSwgcG9zLmNoKSA6IHBvcywgYXQgPSAwOwogICAgZm9yICg7OykgewogICAgICB2YXIgbmwgPSBzdHIuaW5kZXhPZigiXG4iLCBhdCk7CiAgICAgIGlmIChubCA9PSAtMSkgYnJlYWs7CiAgICAgICsrb3V0LmxpbmU7CiAgICAgIGlmIChvdGhlcikgKytvdGhlci5saW5lOwogICAgICBhdCA9IG5sICsgMTsKICAgIH0KICAgIG91dC5jaCA9IChhdCA/IDAgOiBvdXQuY2gpICsgKHN0ci5sZW5ndGggLSBhdCk7CiAgICBpZiAob3RoZXIpIG90aGVyLmNoID0gKGF0ID8gMCA6IG90aGVyLmNoKSArIChzdHIubGVuZ3RoIC0gYXQpOwogICAgcmV0dXJuIG91dDsKICB9CgogIGZ1bmN0aW9uIHBvc01pbihhLCBiKSB7IHJldHVybiAoYS5saW5lIC0gYi5saW5lIHx8IGEuY2ggLSBiLmNoKSA8IDAgPyBhIDogYjsgfQogIGZ1bmN0aW9uIHBvc01heChhLCBiKSB7IHJldHVybiAoYS5saW5lIC0gYi5saW5lIHx8IGEuY2ggLSBiLmNoKSA+IDAgPyBhIDogYjsgfQogIGZ1bmN0aW9uIHBvc0VxKGEsIGIpIHsgcmV0dXJuIGEubGluZSA9PSBiLmxpbmUgJiYgYS5jaCA9PSBiLmNoOyB9Cn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/mode/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/mode/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCEtLSBEVU1NWSBIVE1MIEZJTEUgLS0+]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/mode/loadmode.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICBpZiAoIUNvZGVNaXJyb3IubW9kZVVSTCkgQ29kZU1pcnJvci5tb2RlVVJMID0gIi4uL21vZGUvJU4vJU4uanMiOwoKICB2YXIgbG9hZGluZyA9IHt9OwogIGZ1bmN0aW9uIHNwbGl0Q2FsbGJhY2soY29udCwgbikgewogICAgdmFyIGNvdW50RG93biA9IG47CiAgICByZXR1cm4gZnVuY3Rpb24oKSB7IGlmICgtLWNvdW50RG93biA9PSAwKSBjb250KCk7IH07CiAgfQogIGZ1bmN0aW9uIGVuc3VyZURlcHMobW9kZSwgY29udCkgewogICAgdmFyIGRlcHMgPSBDb2RlTWlycm9yLm1vZGVzW21vZGVdLmRlcGVuZGVuY2llczsKICAgIGlmICghZGVwcykgcmV0dXJuIGNvbnQoKTsKICAgIHZhciBtaXNzaW5nID0gW107CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRlcHMubGVuZ3RoOyArK2kpIHsKICAgICAgaWYgKCFDb2RlTWlycm9yLm1vZGVzLmhhc093blByb3BlcnR5KGRlcHNbaV0pKQogICAgICAgIG1pc3NpbmcucHVzaChkZXBzW2ldKTsKICAgIH0KICAgIGlmICghbWlzc2luZy5sZW5ndGgpIHJldHVybiBjb250KCk7CiAgICB2YXIgc3BsaXQgPSBzcGxpdENhbGxiYWNrKGNvbnQsIG1pc3NpbmcubGVuZ3RoKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWlzc2luZy5sZW5ndGg7ICsraSkKICAgICAgQ29kZU1pcnJvci5yZXF1aXJlTW9kZShtaXNzaW5nW2ldLCBzcGxpdCk7CiAgfQoKICBDb2RlTWlycm9yLnJlcXVpcmVNb2RlID0gZnVuY3Rpb24obW9kZSwgY29udCkgewogICAgaWYgKHR5cGVvZiBtb2RlICE9ICJzdHJpbmciKSBtb2RlID0gbW9kZS5uYW1lOwogICAgaWYgKENvZGVNaXJyb3IubW9kZXMuaGFzT3duUHJvcGVydHkobW9kZSkpIHJldHVybiBlbnN1cmVEZXBzKG1vZGUsIGNvbnQpOwogICAgaWYgKGxvYWRpbmcuaGFzT3duUHJvcGVydHkobW9kZSkpIHJldHVybiBsb2FkaW5nW21vZGVdLnB1c2goY29udCk7CgogICAgdmFyIHNjcmlwdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpOwogICAgc2NyaXB0LnNyYyA9IENvZGVNaXJyb3IubW9kZVVSTC5yZXBsYWNlKC8lTi9nLCBtb2RlKTsKICAgIHZhciBvdGhlcnMgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgic2NyaXB0IilbMF07CiAgICBvdGhlcnMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoc2NyaXB0LCBvdGhlcnMpOwogICAgdmFyIGxpc3QgPSBsb2FkaW5nW21vZGVdID0gW2NvbnRdOwogICAgdmFyIGNvdW50ID0gMCwgcG9sbCA9IHNldEludGVydmFsKGZ1bmN0aW9uKCkgewogICAgICBpZiAoKytjb3VudCA+IDEwMCkgcmV0dXJuIGNsZWFySW50ZXJ2YWwocG9sbCk7CiAgICAgIGlmIChDb2RlTWlycm9yLm1vZGVzLmhhc093blByb3BlcnR5KG1vZGUpKSB7CiAgICAgICAgY2xlYXJJbnRlcnZhbChwb2xsKTsKICAgICAgICBsb2FkaW5nW21vZGVdID0gbnVsbDsKICAgICAgICBlbnN1cmVEZXBzKG1vZGUsIGZ1bmN0aW9uKCkgewogICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKSBsaXN0W2ldKCk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0sIDIwMCk7CiAgfTsKCiAgQ29kZU1pcnJvci5hdXRvTG9hZE1vZGUgPSBmdW5jdGlvbihpbnN0YW5jZSwgbW9kZSkgewogICAgaWYgKCFDb2RlTWlycm9yLm1vZGVzLmhhc093blByb3BlcnR5KG1vZGUpKQogICAgICBDb2RlTWlycm9yLnJlcXVpcmVNb2RlKG1vZGUsIGZ1bmN0aW9uKCkgewogICAgICAgIGluc3RhbmNlLnNldE9wdGlvbigibW9kZSIsIGluc3RhbmNlLmdldE9wdGlvbigibW9kZSIpKTsKICAgICAgfSk7CiAgfTsKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/mode/multiplex.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5tdWx0aXBsZXhpbmdNb2RlID0gZnVuY3Rpb24ob3V0ZXIgLyosIG90aGVycyAqLykgewogIC8vIE90aGVycyBzaG91bGQgYmUge29wZW4sIGNsb3NlLCBtb2RlIFssIGRlbGltU3R5bGVdIFssIGlubmVyU3R5bGVdfSBvYmplY3RzCiAgdmFyIG90aGVycyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CiAgdmFyIG5fb3RoZXJzID0gb3RoZXJzLmxlbmd0aDsKCiAgZnVuY3Rpb24gaW5kZXhPZihzdHJpbmcsIHBhdHRlcm4sIGZyb20pIHsKICAgIGlmICh0eXBlb2YgcGF0dGVybiA9PSAic3RyaW5nIikgcmV0dXJuIHN0cmluZy5pbmRleE9mKHBhdHRlcm4sIGZyb20pOwogICAgdmFyIG0gPSBwYXR0ZXJuLmV4ZWMoZnJvbSA/IHN0cmluZy5zbGljZShmcm9tKSA6IHN0cmluZyk7CiAgICByZXR1cm4gbSA/IG0uaW5kZXggKyBmcm9tIDogLTE7CiAgfQoKICByZXR1cm4gewogICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgb3V0ZXI6IENvZGVNaXJyb3Iuc3RhcnRTdGF0ZShvdXRlciksCiAgICAgICAgaW5uZXJBY3RpdmU6IG51bGwsCiAgICAgICAgaW5uZXI6IG51bGwKICAgICAgfTsKICAgIH0sCgogICAgY29weVN0YXRlOiBmdW5jdGlvbihzdGF0ZSkgewogICAgICByZXR1cm4gewogICAgICAgIG91dGVyOiBDb2RlTWlycm9yLmNvcHlTdGF0ZShvdXRlciwgc3RhdGUub3V0ZXIpLAogICAgICAgIGlubmVyQWN0aXZlOiBzdGF0ZS5pbm5lckFjdGl2ZSwKICAgICAgICBpbm5lcjogc3RhdGUuaW5uZXJBY3RpdmUgJiYgQ29kZU1pcnJvci5jb3B5U3RhdGUoc3RhdGUuaW5uZXJBY3RpdmUubW9kZSwgc3RhdGUuaW5uZXIpCiAgICAgIH07CiAgICB9LAoKICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIGlmICghc3RhdGUuaW5uZXJBY3RpdmUpIHsKICAgICAgICB2YXIgY3V0T2ZmID0gSW5maW5pdHksIG9sZENvbnRlbnQgPSBzdHJlYW0uc3RyaW5nOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbl9vdGhlcnM7ICsraSkgewogICAgICAgICAgdmFyIG90aGVyID0gb3RoZXJzW2ldOwogICAgICAgICAgdmFyIGZvdW5kID0gaW5kZXhPZihvbGRDb250ZW50LCBvdGhlci5vcGVuLCBzdHJlYW0ucG9zKTsKICAgICAgICAgIGlmIChmb3VuZCA9PSBzdHJlYW0ucG9zKSB7CiAgICAgICAgICAgIHN0cmVhbS5tYXRjaChvdGhlci5vcGVuKTsKICAgICAgICAgICAgc3RhdGUuaW5uZXJBY3RpdmUgPSBvdGhlcjsKICAgICAgICAgICAgc3RhdGUuaW5uZXIgPSBDb2RlTWlycm9yLnN0YXJ0U3RhdGUob3RoZXIubW9kZSwgb3V0ZXIuaW5kZW50ID8gb3V0ZXIuaW5kZW50KHN0YXRlLm91dGVyLCAiIikgOiAwKTsKICAgICAgICAgICAgcmV0dXJuIG90aGVyLmRlbGltU3R5bGU7CiAgICAgICAgICB9IGVsc2UgaWYgKGZvdW5kICE9IC0xICYmIGZvdW5kIDwgY3V0T2ZmKSB7CiAgICAgICAgICAgIGN1dE9mZiA9IGZvdW5kOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoY3V0T2ZmICE9IEluZmluaXR5KSBzdHJlYW0uc3RyaW5nID0gb2xkQ29udGVudC5zbGljZSgwLCBjdXRPZmYpOwogICAgICAgIHZhciBvdXRlclRva2VuID0gb3V0ZXIudG9rZW4oc3RyZWFtLCBzdGF0ZS5vdXRlcik7CiAgICAgICAgaWYgKGN1dE9mZiAhPSBJbmZpbml0eSkgc3RyZWFtLnN0cmluZyA9IG9sZENvbnRlbnQ7CiAgICAgICAgcmV0dXJuIG91dGVyVG9rZW47CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIGN1cklubmVyID0gc3RhdGUuaW5uZXJBY3RpdmUsIG9sZENvbnRlbnQgPSBzdHJlYW0uc3RyaW5nOwogICAgICAgIGlmICghY3VySW5uZXIuY2xvc2UgJiYgc3RyZWFtLnNvbCgpKSB7CiAgICAgICAgICBzdGF0ZS5pbm5lckFjdGl2ZSA9IHN0YXRlLmlubmVyID0gbnVsbDsKICAgICAgICAgIHJldHVybiB0aGlzLnRva2VuKHN0cmVhbSwgc3RhdGUpOwogICAgICAgIH0KICAgICAgICB2YXIgZm91bmQgPSBjdXJJbm5lci5jbG9zZSA/IGluZGV4T2Yob2xkQ29udGVudCwgY3VySW5uZXIuY2xvc2UsIHN0cmVhbS5wb3MpIDogLTE7CiAgICAgICAgaWYgKGZvdW5kID09IHN0cmVhbS5wb3MpIHsKICAgICAgICAgIHN0cmVhbS5tYXRjaChjdXJJbm5lci5jbG9zZSk7CiAgICAgICAgICBzdGF0ZS5pbm5lckFjdGl2ZSA9IHN0YXRlLmlubmVyID0gbnVsbDsKICAgICAgICAgIHJldHVybiBjdXJJbm5lci5kZWxpbVN0eWxlOwogICAgICAgIH0KICAgICAgICBpZiAoZm91bmQgPiAtMSkgc3RyZWFtLnN0cmluZyA9IG9sZENvbnRlbnQuc2xpY2UoMCwgZm91bmQpOwogICAgICAgIHZhciBpbm5lclRva2VuID0gY3VySW5uZXIubW9kZS50b2tlbihzdHJlYW0sIHN0YXRlLmlubmVyKTsKICAgICAgICBpZiAoZm91bmQgPiAtMSkgc3RyZWFtLnN0cmluZyA9IG9sZENvbnRlbnQ7CgogICAgICAgIGlmIChjdXJJbm5lci5pbm5lclN0eWxlKSB7CiAgICAgICAgICBpZiAoaW5uZXJUb2tlbikgaW5uZXJUb2tlbiA9IGlubmVyVG9rZW4gKyAnICcgKyBjdXJJbm5lci5pbm5lclN0eWxlOwogICAgICAgICAgZWxzZSBpbm5lclRva2VuID0gY3VySW5uZXIuaW5uZXJTdHlsZTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBpbm5lclRva2VuOwogICAgICB9CiAgICB9LAoKICAgIGluZGVudDogZnVuY3Rpb24oc3RhdGUsIHRleHRBZnRlcikgewogICAgICB2YXIgbW9kZSA9IHN0YXRlLmlubmVyQWN0aXZlID8gc3RhdGUuaW5uZXJBY3RpdmUubW9kZSA6IG91dGVyOwogICAgICBpZiAoIW1vZGUuaW5kZW50KSByZXR1cm4gQ29kZU1pcnJvci5QYXNzOwogICAgICByZXR1cm4gbW9kZS5pbmRlbnQoc3RhdGUuaW5uZXJBY3RpdmUgPyBzdGF0ZS5pbm5lciA6IHN0YXRlLm91dGVyLCB0ZXh0QWZ0ZXIpOwogICAgfSwKCiAgICBibGFua0xpbmU6IGZ1bmN0aW9uKHN0YXRlKSB7CiAgICAgIHZhciBtb2RlID0gc3RhdGUuaW5uZXJBY3RpdmUgPyBzdGF0ZS5pbm5lckFjdGl2ZS5tb2RlIDogb3V0ZXI7CiAgICAgIGlmIChtb2RlLmJsYW5rTGluZSkgewogICAgICAgIG1vZGUuYmxhbmtMaW5lKHN0YXRlLmlubmVyQWN0aXZlID8gc3RhdGUuaW5uZXIgOiBzdGF0ZS5vdXRlcik7CiAgICAgIH0KICAgICAgaWYgKCFzdGF0ZS5pbm5lckFjdGl2ZSkgewogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbl9vdGhlcnM7ICsraSkgewogICAgICAgICAgdmFyIG90aGVyID0gb3RoZXJzW2ldOwogICAgICAgICAgaWYgKG90aGVyLm9wZW4gPT09ICJcbiIpIHsKICAgICAgICAgICAgc3RhdGUuaW5uZXJBY3RpdmUgPSBvdGhlcjsKICAgICAgICAgICAgc3RhdGUuaW5uZXIgPSBDb2RlTWlycm9yLnN0YXJ0U3RhdGUob3RoZXIubW9kZSwgbW9kZS5pbmRlbnQgPyBtb2RlLmluZGVudChzdGF0ZS5vdXRlciwgIiIpIDogMCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKHN0YXRlLmlubmVyQWN0aXZlLmNsb3NlID09PSAiXG4iKSB7CiAgICAgICAgc3RhdGUuaW5uZXJBY3RpdmUgPSBzdGF0ZS5pbm5lciA9IG51bGw7CiAgICAgIH0KICAgIH0sCgogICAgZWxlY3RyaWNDaGFyczogb3V0ZXIuZWxlY3RyaWNDaGFycywKCiAgICBpbm5lck1vZGU6IGZ1bmN0aW9uKHN0YXRlKSB7CiAgICAgIHJldHVybiBzdGF0ZS5pbm5lciA/IHtzdGF0ZTogc3RhdGUuaW5uZXIsIG1vZGU6IHN0YXRlLmlubmVyQWN0aXZlLm1vZGV9IDoge3N0YXRlOiBzdGF0ZS5vdXRlciwgbW9kZTogb3V0ZXJ9OwogICAgfQogIH07Cn07Cgp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/mode/multiplex_test.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24oKSB7CiAgQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJtYXJrZG93bl93aXRoX3N0ZXgiLCBmdW5jdGlvbigpewogICAgdmFyIGlubmVyID0gQ29kZU1pcnJvci5nZXRNb2RlKHt9LCAic3RleCIpOwogICAgdmFyIG91dGVyID0gQ29kZU1pcnJvci5nZXRNb2RlKHt9LCAibWFya2Rvd24iKTsKCiAgICB2YXIgaW5uZXJPcHRpb25zID0gewogICAgICBvcGVuOiAnJCcsCiAgICAgIGNsb3NlOiAnJCcsCiAgICAgIG1vZGU6IGlubmVyLAogICAgICBkZWxpbVN0eWxlOiAnZGVsaW0nLAogICAgICBpbm5lclN0eWxlOiAnaW5uZXInCiAgICB9OwoKICAgIHJldHVybiBDb2RlTWlycm9yLm11bHRpcGxleGluZ01vZGUob3V0ZXIsIGlubmVyT3B0aW9ucyk7CiAgfSk7CgogIHZhciBtb2RlID0gQ29kZU1pcnJvci5nZXRNb2RlKHt9LCAibWFya2Rvd25fd2l0aF9zdGV4Iik7CgogIGZ1bmN0aW9uIE1UKG5hbWUpIHsKICAgIHRlc3QubW9kZSgKICAgICAgbmFtZSwKICAgICAgbW9kZSwKICAgICAgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSwKICAgICAgJ211bHRpcGxleGluZycpOwogIH0KCiAgTVQoCiAgICAic3RleEluc2lkZU1hcmtkb3duIiwKICAgICJbc3Ryb25nICoqRXF1YXRpb246KipdIFtkZWxpbSAkXVtpbm5lciZ0YWcgXFxwaV1bZGVsaW0gJF0iKTsKfSkoKTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/mode/overlay.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovLyBVdGlsaXR5IGZ1bmN0aW9uIHRoYXQgYWxsb3dzIG1vZGVzIHRvIGJlIGNvbWJpbmVkLiBUaGUgbW9kZSBnaXZlbgovLyBhcyB0aGUgYmFzZSBhcmd1bWVudCB0YWtlcyBjYXJlIG9mIG1vc3Qgb2YgdGhlIG5vcm1hbCBtb2RlCi8vIGZ1bmN0aW9uYWxpdHksIGJ1dCBhIHNlY29uZCAodHlwaWNhbGx5IHNpbXBsZSkgbW9kZSBpcyB1c2VkLCB3aGljaAovLyBjYW4gb3ZlcnJpZGUgdGhlIHN0eWxlIG9mIHRleHQuIEJvdGggbW9kZXMgZ2V0IHRvIHBhcnNlIGFsbCBvZiB0aGUKLy8gdGV4dCwgYnV0IHdoZW4gYm90aCBhc3NpZ24gYSBub24tbnVsbCBzdHlsZSB0byBhIHBpZWNlIG9mIGNvZGUsIHRoZQovLyBvdmVybGF5IHdpbnMsIHVubGVzcyB0aGUgY29tYmluZSBhcmd1bWVudCB3YXMgdHJ1ZSBhbmQgbm90IG92ZXJyaWRkZW4sCi8vIG9yIHN0YXRlLm92ZXJsYXkuY29tYmluZVRva2VucyB3YXMgdHJ1ZSwgaW4gd2hpY2ggY2FzZSB0aGUgc3R5bGVzIGFyZQovLyBjb21iaW5lZC4KCihmdW5jdGlvbihtb2QpIHsKICBpZiAodHlwZW9mIGV4cG9ydHMgPT0gIm9iamVjdCIgJiYgdHlwZW9mIG1vZHVsZSA9PSAib2JqZWN0IikgLy8gQ29tbW9uSlMKICAgIG1vZChyZXF1aXJlKCIuLi8uLi9saWIvY29kZW1pcnJvciIpKTsKICBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCkgLy8gQU1ECiAgICBkZWZpbmUoWyIuLi8uLi9saWIvY29kZW1pcnJvciJdLCBtb2QpOwogIGVsc2UgLy8gUGxhaW4gYnJvd3NlciBlbnYKICAgIG1vZChDb2RlTWlycm9yKTsKfSkoZnVuY3Rpb24oQ29kZU1pcnJvcikgewoidXNlIHN0cmljdCI7CgpDb2RlTWlycm9yLm92ZXJsYXlNb2RlID0gZnVuY3Rpb24oYmFzZSwgb3ZlcmxheSwgY29tYmluZSkgewogIHJldHVybiB7CiAgICBzdGFydFN0YXRlOiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBiYXNlOiBDb2RlTWlycm9yLnN0YXJ0U3RhdGUoYmFzZSksCiAgICAgICAgb3ZlcmxheTogQ29kZU1pcnJvci5zdGFydFN0YXRlKG92ZXJsYXkpLAogICAgICAgIGJhc2VQb3M6IDAsIGJhc2VDdXI6IG51bGwsCiAgICAgICAgb3ZlcmxheVBvczogMCwgb3ZlcmxheUN1cjogbnVsbCwKICAgICAgICBsaW5lU2VlbjogbnVsbAogICAgICB9OwogICAgfSwKICAgIGNvcHlTdGF0ZTogZnVuY3Rpb24oc3RhdGUpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBiYXNlOiBDb2RlTWlycm9yLmNvcHlTdGF0ZShiYXNlLCBzdGF0ZS5iYXNlKSwKICAgICAgICBvdmVybGF5OiBDb2RlTWlycm9yLmNvcHlTdGF0ZShvdmVybGF5LCBzdGF0ZS5vdmVybGF5KSwKICAgICAgICBiYXNlUG9zOiBzdGF0ZS5iYXNlUG9zLCBiYXNlQ3VyOiBudWxsLAogICAgICAgIG92ZXJsYXlQb3M6IHN0YXRlLm92ZXJsYXlQb3MsIG92ZXJsYXlDdXI6IG51bGwKICAgICAgfTsKICAgIH0sCgogICAgdG9rZW46IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgaWYgKHN0cmVhbS5zb2woKSB8fCBzdHJlYW0uc3RyaW5nICE9IHN0YXRlLmxpbmVTZWVuIHx8CiAgICAgICAgICBNYXRoLm1pbihzdGF0ZS5iYXNlUG9zLCBzdGF0ZS5vdmVybGF5UG9zKSA8IHN0cmVhbS5zdGFydCkgewogICAgICAgIHN0YXRlLmxpbmVTZWVuID0gc3RyZWFtLnN0cmluZzsKICAgICAgICBzdGF0ZS5iYXNlUG9zID0gc3RhdGUub3ZlcmxheVBvcyA9IHN0cmVhbS5zdGFydDsKICAgICAgfQoKICAgICAgaWYgKHN0cmVhbS5zdGFydCA9PSBzdGF0ZS5iYXNlUG9zKSB7CiAgICAgICAgc3RhdGUuYmFzZUN1ciA9IGJhc2UudG9rZW4oc3RyZWFtLCBzdGF0ZS5iYXNlKTsKICAgICAgICBzdGF0ZS5iYXNlUG9zID0gc3RyZWFtLnBvczsKICAgICAgfQogICAgICBpZiAoc3RyZWFtLnN0YXJ0ID09IHN0YXRlLm92ZXJsYXlQb3MpIHsKICAgICAgICBzdHJlYW0ucG9zID0gc3RyZWFtLnN0YXJ0OwogICAgICAgIHN0YXRlLm92ZXJsYXlDdXIgPSBvdmVybGF5LnRva2VuKHN0cmVhbSwgc3RhdGUub3ZlcmxheSk7CiAgICAgICAgc3RhdGUub3ZlcmxheVBvcyA9IHN0cmVhbS5wb3M7CiAgICAgIH0KICAgICAgc3RyZWFtLnBvcyA9IE1hdGgubWluKHN0YXRlLmJhc2VQb3MsIHN0YXRlLm92ZXJsYXlQb3MpOwoKICAgICAgLy8gc3RhdGUub3ZlcmxheS5jb21iaW5lVG9rZW5zIGFsd2F5cyB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgY29tYmluZSwKICAgICAgLy8gdW5sZXNzIHNldCB0byBudWxsCiAgICAgIGlmIChzdGF0ZS5vdmVybGF5Q3VyID09IG51bGwpIHJldHVybiBzdGF0ZS5iYXNlQ3VyOwogICAgICBlbHNlIGlmIChzdGF0ZS5iYXNlQ3VyICE9IG51bGwgJiYKICAgICAgICAgICAgICAgc3RhdGUub3ZlcmxheS5jb21iaW5lVG9rZW5zIHx8CiAgICAgICAgICAgICAgIGNvbWJpbmUgJiYgc3RhdGUub3ZlcmxheS5jb21iaW5lVG9rZW5zID09IG51bGwpCiAgICAgICAgcmV0dXJuIHN0YXRlLmJhc2VDdXIgKyAiICIgKyBzdGF0ZS5vdmVybGF5Q3VyOwogICAgICBlbHNlIHJldHVybiBzdGF0ZS5vdmVybGF5Q3VyOwogICAgfSwKCiAgICBpbmRlbnQ6IGJhc2UuaW5kZW50ICYmIGZ1bmN0aW9uKHN0YXRlLCB0ZXh0QWZ0ZXIpIHsKICAgICAgcmV0dXJuIGJhc2UuaW5kZW50KHN0YXRlLmJhc2UsIHRleHRBZnRlcik7CiAgICB9LAogICAgZWxlY3RyaWNDaGFyczogYmFzZS5lbGVjdHJpY0NoYXJzLAoKICAgIGlubmVyTW9kZTogZnVuY3Rpb24oc3RhdGUpIHsgcmV0dXJuIHtzdGF0ZTogc3RhdGUuYmFzZSwgbW9kZTogYmFzZX07IH0sCgogICAgYmxhbmtMaW5lOiBmdW5jdGlvbihzdGF0ZSkgewogICAgICBpZiAoYmFzZS5ibGFua0xpbmUpIGJhc2UuYmxhbmtMaW5lKHN0YXRlLmJhc2UpOwogICAgICBpZiAob3ZlcmxheS5ibGFua0xpbmUpIG92ZXJsYXkuYmxhbmtMaW5lKHN0YXRlLm92ZXJsYXkpOwogICAgfQogIH07Cn07Cgp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/runmode/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/runmode/colorize.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSwgcmVxdWlyZSgiLi9ydW5tb2RlIikpOwogIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kKSAvLyBBTUQKICAgIGRlZmluZShbIi4uLy4uL2xpYi9jb2RlbWlycm9yIiwgIi4vcnVubW9kZSJdLCBtb2QpOwogIGVsc2UgLy8gUGxhaW4gYnJvd3NlciBlbnYKICAgIG1vZChDb2RlTWlycm9yKTsKfSkoZnVuY3Rpb24oQ29kZU1pcnJvcikgewogICJ1c2Ugc3RyaWN0IjsKCiAgdmFyIGlzQmxvY2sgPSAvXihwfGxpfGRpdnxoXFxkfHByZXxibG9ja3F1b3RlfHRkKSQvOwoKICBmdW5jdGlvbiB0ZXh0Q29udGVudChub2RlLCBvdXQpIHsKICAgIGlmIChub2RlLm5vZGVUeXBlID09IDMpIHJldHVybiBvdXQucHVzaChub2RlLm5vZGVWYWx1ZSk7CiAgICBmb3IgKHZhciBjaCA9IG5vZGUuZmlyc3RDaGlsZDsgY2g7IGNoID0gY2gubmV4dFNpYmxpbmcpIHsKICAgICAgdGV4dENvbnRlbnQoY2gsIG91dCk7CiAgICAgIGlmIChpc0Jsb2NrLnRlc3Qobm9kZS5ub2RlVHlwZSkpIG91dC5wdXNoKCJcbiIpOwogICAgfQogIH0KCiAgQ29kZU1pcnJvci5jb2xvcml6ZSA9IGZ1bmN0aW9uKGNvbGxlY3Rpb24sIGRlZmF1bHRNb2RlKSB7CiAgICBpZiAoIWNvbGxlY3Rpb24pIGNvbGxlY3Rpb24gPSBkb2N1bWVudC5ib2R5LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJwcmUiKTsKCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbGxlY3Rpb24ubGVuZ3RoOyArK2kpIHsKICAgICAgdmFyIG5vZGUgPSBjb2xsZWN0aW9uW2ldOwogICAgICB2YXIgbW9kZSA9IG5vZGUuZ2V0QXR0cmlidXRlKCJkYXRhLWxhbmciKSB8fCBkZWZhdWx0TW9kZTsKICAgICAgaWYgKCFtb2RlKSBjb250aW51ZTsKCiAgICAgIHZhciB0ZXh0ID0gW107CiAgICAgIHRleHRDb250ZW50KG5vZGUsIHRleHQpOwogICAgICBub2RlLmlubmVySFRNTCA9ICIiOwogICAgICBDb2RlTWlycm9yLnJ1bk1vZGUodGV4dC5qb2luKCIiKSwgbW9kZSwgbm9kZSk7CgogICAgICBub2RlLmNsYXNzTmFtZSArPSAiIGNtLXMtZGVmYXVsdCI7CiAgICB9CiAgfTsKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/runmode/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCEtLSBEVU1NWSBIVE1MIEZJTEUgLS0+]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/runmode/runmode-standalone.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgp3aW5kb3cuQ29kZU1pcnJvciA9IHt9OwoKKGZ1bmN0aW9uKCkgewoidXNlIHN0cmljdCI7CgpmdW5jdGlvbiBzcGxpdExpbmVzKHN0cmluZyl7IHJldHVybiBzdHJpbmcuc3BsaXQoL1xyP1xufFxyLyk7IH07CgpmdW5jdGlvbiBTdHJpbmdTdHJlYW0oc3RyaW5nKSB7CiAgdGhpcy5wb3MgPSB0aGlzLnN0YXJ0ID0gMDsKICB0aGlzLnN0cmluZyA9IHN0cmluZzsKICB0aGlzLmxpbmVTdGFydCA9IDA7Cn0KU3RyaW5nU3RyZWFtLnByb3RvdHlwZSA9IHsKICBlb2w6IGZ1bmN0aW9uKCkge3JldHVybiB0aGlzLnBvcyA+PSB0aGlzLnN0cmluZy5sZW5ndGg7fSwKICBzb2w6IGZ1bmN0aW9uKCkge3JldHVybiB0aGlzLnBvcyA9PSAwO30sCiAgcGVlazogZnVuY3Rpb24oKSB7cmV0dXJuIHRoaXMuc3RyaW5nLmNoYXJBdCh0aGlzLnBvcykgfHwgbnVsbDt9LAogIG5leHQ6IGZ1bmN0aW9uKCkgewogICAgaWYgKHRoaXMucG9zIDwgdGhpcy5zdHJpbmcubGVuZ3RoKQogICAgICByZXR1cm4gdGhpcy5zdHJpbmcuY2hhckF0KHRoaXMucG9zKyspOwogIH0sCiAgZWF0OiBmdW5jdGlvbihtYXRjaCkgewogICAgdmFyIGNoID0gdGhpcy5zdHJpbmcuY2hhckF0KHRoaXMucG9zKTsKICAgIGlmICh0eXBlb2YgbWF0Y2ggPT0gInN0cmluZyIpIHZhciBvayA9IGNoID09IG1hdGNoOwogICAgZWxzZSB2YXIgb2sgPSBjaCAmJiAobWF0Y2gudGVzdCA/IG1hdGNoLnRlc3QoY2gpIDogbWF0Y2goY2gpKTsKICAgIGlmIChvaykgeysrdGhpcy5wb3M7IHJldHVybiBjaDt9CiAgfSwKICBlYXRXaGlsZTogZnVuY3Rpb24obWF0Y2gpIHsKICAgIHZhciBzdGFydCA9IHRoaXMucG9zOwogICAgd2hpbGUgKHRoaXMuZWF0KG1hdGNoKSl7fQogICAgcmV0dXJuIHRoaXMucG9zID4gc3RhcnQ7CiAgfSwKICBlYXRTcGFjZTogZnVuY3Rpb24oKSB7CiAgICB2YXIgc3RhcnQgPSB0aGlzLnBvczsKICAgIHdoaWxlICgvW1xzXHUwMGEwXS8udGVzdCh0aGlzLnN0cmluZy5jaGFyQXQodGhpcy5wb3MpKSkgKyt0aGlzLnBvczsKICAgIHJldHVybiB0aGlzLnBvcyA+IHN0YXJ0OwogIH0sCiAgc2tpcFRvRW5kOiBmdW5jdGlvbigpIHt0aGlzLnBvcyA9IHRoaXMuc3RyaW5nLmxlbmd0aDt9LAogIHNraXBUbzogZnVuY3Rpb24oY2gpIHsKICAgIHZhciBmb3VuZCA9IHRoaXMuc3RyaW5nLmluZGV4T2YoY2gsIHRoaXMucG9zKTsKICAgIGlmIChmb3VuZCA+IC0xKSB7dGhpcy5wb3MgPSBmb3VuZDsgcmV0dXJuIHRydWU7fQogIH0sCiAgYmFja1VwOiBmdW5jdGlvbihuKSB7dGhpcy5wb3MgLT0gbjt9LAogIGNvbHVtbjogZnVuY3Rpb24oKSB7cmV0dXJuIHRoaXMuc3RhcnQgLSB0aGlzLmxpbmVTdGFydDt9LAogIGluZGVudGF0aW9uOiBmdW5jdGlvbigpIHtyZXR1cm4gMDt9LAogIG1hdGNoOiBmdW5jdGlvbihwYXR0ZXJuLCBjb25zdW1lLCBjYXNlSW5zZW5zaXRpdmUpIHsKICAgIGlmICh0eXBlb2YgcGF0dGVybiA9PSAic3RyaW5nIikgewogICAgICB2YXIgY2FzZWQgPSBmdW5jdGlvbihzdHIpIHtyZXR1cm4gY2FzZUluc2Vuc2l0aXZlID8gc3RyLnRvTG93ZXJDYXNlKCkgOiBzdHI7fTsKICAgICAgdmFyIHN1YnN0ciA9IHRoaXMuc3RyaW5nLnN1YnN0cih0aGlzLnBvcywgcGF0dGVybi5sZW5ndGgpOwogICAgICBpZiAoY2FzZWQoc3Vic3RyKSA9PSBjYXNlZChwYXR0ZXJuKSkgewogICAgICAgIGlmIChjb25zdW1lICE9PSBmYWxzZSkgdGhpcy5wb3MgKz0gcGF0dGVybi5sZW5ndGg7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHZhciBtYXRjaCA9IHRoaXMuc3RyaW5nLnNsaWNlKHRoaXMucG9zKS5tYXRjaChwYXR0ZXJuKTsKICAgICAgaWYgKG1hdGNoICYmIG1hdGNoLmluZGV4ID4gMCkgcmV0dXJuIG51bGw7CiAgICAgIGlmIChtYXRjaCAmJiBjb25zdW1lICE9PSBmYWxzZSkgdGhpcy5wb3MgKz0gbWF0Y2hbMF0ubGVuZ3RoOwogICAgICByZXR1cm4gbWF0Y2g7CiAgICB9CiAgfSwKICBjdXJyZW50OiBmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0cmluZy5zbGljZSh0aGlzLnN0YXJ0LCB0aGlzLnBvcyk7fSwKICBoaWRlRmlyc3RDaGFyczogZnVuY3Rpb24obiwgaW5uZXIpIHsKICAgIHRoaXMubGluZVN0YXJ0ICs9IG47CiAgICB0cnkgeyByZXR1cm4gaW5uZXIoKTsgfQogICAgZmluYWxseSB7IHRoaXMubGluZVN0YXJ0IC09IG47IH0KICB9Cn07CkNvZGVNaXJyb3IuU3RyaW5nU3RyZWFtID0gU3RyaW5nU3RyZWFtOwoKQ29kZU1pcnJvci5zdGFydFN0YXRlID0gZnVuY3Rpb24gKG1vZGUsIGExLCBhMikgewogIHJldHVybiBtb2RlLnN0YXJ0U3RhdGUgPyBtb2RlLnN0YXJ0U3RhdGUoYTEsIGEyKSA6IHRydWU7Cn07Cgp2YXIgbW9kZXMgPSBDb2RlTWlycm9yLm1vZGVzID0ge30sIG1pbWVNb2RlcyA9IENvZGVNaXJyb3IubWltZU1vZGVzID0ge307CkNvZGVNaXJyb3IuZGVmaW5lTW9kZSA9IGZ1bmN0aW9uIChuYW1lLCBtb2RlKSB7IG1vZGVzW25hbWVdID0gbW9kZTsgfTsKQ29kZU1pcnJvci5kZWZpbmVNSU1FID0gZnVuY3Rpb24gKG1pbWUsIHNwZWMpIHsgbWltZU1vZGVzW21pbWVdID0gc3BlYzsgfTsKQ29kZU1pcnJvci5yZXNvbHZlTW9kZSA9IGZ1bmN0aW9uKHNwZWMpIHsKICBpZiAodHlwZW9mIHNwZWMgPT0gInN0cmluZyIgJiYgbWltZU1vZGVzLmhhc093blByb3BlcnR5KHNwZWMpKSB7CiAgICBzcGVjID0gbWltZU1vZGVzW3NwZWNdOwogIH0gZWxzZSBpZiAoc3BlYyAmJiB0eXBlb2Ygc3BlYy5uYW1lID09ICJzdHJpbmciICYmIG1pbWVNb2Rlcy5oYXNPd25Qcm9wZXJ0eShzcGVjLm5hbWUpKSB7CiAgICBzcGVjID0gbWltZU1vZGVzW3NwZWMubmFtZV07CiAgfQogIGlmICh0eXBlb2Ygc3BlYyA9PSAic3RyaW5nIikgcmV0dXJuIHtuYW1lOiBzcGVjfTsKICBlbHNlIHJldHVybiBzcGVjIHx8IHtuYW1lOiAibnVsbCJ9Owp9OwpDb2RlTWlycm9yLmdldE1vZGUgPSBmdW5jdGlvbiAob3B0aW9ucywgc3BlYykgewogIHNwZWMgPSBDb2RlTWlycm9yLnJlc29sdmVNb2RlKHNwZWMpOwogIHZhciBtZmFjdG9yeSA9IG1vZGVzW3NwZWMubmFtZV07CiAgaWYgKCFtZmFjdG9yeSkgdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIG1vZGU6ICIgKyBzcGVjKTsKICByZXR1cm4gbWZhY3Rvcnkob3B0aW9ucywgc3BlYyk7Cn07CkNvZGVNaXJyb3IucmVnaXN0ZXJIZWxwZXIgPSBDb2RlTWlycm9yLnJlZ2lzdGVyR2xvYmFsSGVscGVyID0gTWF0aC5taW47CkNvZGVNaXJyb3IuZGVmaW5lTW9kZSgibnVsbCIsIGZ1bmN0aW9uKCkgewogIHJldHVybiB7dG9rZW46IGZ1bmN0aW9uKHN0cmVhbSkge3N0cmVhbS5za2lwVG9FbmQoKTt9fTsKfSk7CkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC9wbGFpbiIsICJudWxsIik7CgpDb2RlTWlycm9yLnJ1bk1vZGUgPSBmdW5jdGlvbiAoc3RyaW5nLCBtb2Rlc3BlYywgY2FsbGJhY2ssIG9wdGlvbnMpIHsKICB2YXIgbW9kZSA9IENvZGVNaXJyb3IuZ2V0TW9kZSh7IGluZGVudFVuaXQ6IDIgfSwgbW9kZXNwZWMpOwoKICBpZiAoY2FsbGJhY2subm9kZVR5cGUgPT0gMSkgewogICAgdmFyIHRhYlNpemUgPSAob3B0aW9ucyAmJiBvcHRpb25zLnRhYlNpemUpIHx8IDQ7CiAgICB2YXIgbm9kZSA9IGNhbGxiYWNrLCBjb2wgPSAwOwogICAgbm9kZS5pbm5lckhUTUwgPSAiIjsKICAgIGNhbGxiYWNrID0gZnVuY3Rpb24gKHRleHQsIHN0eWxlKSB7CiAgICAgIGlmICh0ZXh0ID09ICJcbiIpIHsKICAgICAgICBub2RlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJyIikpOwogICAgICAgIGNvbCA9IDA7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHZhciBjb250ZW50ID0gIiI7CiAgICAgIC8vIHJlcGxhY2UgdGFicwogICAgICBmb3IgKHZhciBwb3MgPSAwOyA7KSB7CiAgICAgICAgdmFyIGlkeCA9IHRleHQuaW5kZXhPZigiXHQiLCBwb3MpOwogICAgICAgIGlmIChpZHggPT0gLTEpIHsKICAgICAgICAgIGNvbnRlbnQgKz0gdGV4dC5zbGljZShwb3MpOwogICAgICAgICAgY29sICs9IHRleHQubGVuZ3RoIC0gcG9zOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbCArPSBpZHggLSBwb3M7CiAgICAgICAgICBjb250ZW50ICs9IHRleHQuc2xpY2UocG9zLCBpZHgpOwogICAgICAgICAgdmFyIHNpemUgPSB0YWJTaXplIC0gY29sICUgdGFiU2l6ZTsKICAgICAgICAgIGNvbCArPSBzaXplOwogICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplOyArK2kpIGNvbnRlbnQgKz0gIiAiOwogICAgICAgICAgcG9zID0gaWR4ICsgMTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGlmIChzdHlsZSkgewogICAgICAgIHZhciBzcCA9IG5vZGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpKTsKICAgICAgICBzcC5jbGFzc05hbWUgPSAiY20tIiArIHN0eWxlLnJlcGxhY2UoLyArL2csICIgY20tIik7CiAgICAgICAgc3AuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY29udGVudCkpOwogICAgICB9IGVsc2UgewogICAgICAgIG5vZGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY29udGVudCkpOwogICAgICB9CiAgICB9OwogIH0KCiAgdmFyIGxpbmVzID0gc3BsaXRMaW5lcyhzdHJpbmcpLCBzdGF0ZSA9IChvcHRpb25zICYmIG9wdGlvbnMuc3RhdGUpIHx8IENvZGVNaXJyb3Iuc3RhcnRTdGF0ZShtb2RlKTsKICBmb3IgKHZhciBpID0gMCwgZSA9IGxpbmVzLmxlbmd0aDsgaSA8IGU7ICsraSkgewogICAgaWYgKGkpIGNhbGxiYWNrKCJcbiIpOwogICAgdmFyIHN0cmVhbSA9IG5ldyBDb2RlTWlycm9yLlN0cmluZ1N0cmVhbShsaW5lc1tpXSk7CiAgICBpZiAoIXN0cmVhbS5zdHJpbmcgJiYgbW9kZS5ibGFua0xpbmUpIG1vZGUuYmxhbmtMaW5lKHN0YXRlKTsKICAgIHdoaWxlICghc3RyZWFtLmVvbCgpKSB7CiAgICAgIHZhciBzdHlsZSA9IG1vZGUudG9rZW4oc3RyZWFtLCBzdGF0ZSk7CiAgICAgIGNhbGxiYWNrKHN0cmVhbS5jdXJyZW50KCksIHN0eWxlLCBpLCBzdHJlYW0uc3RhcnQsIHN0YXRlKTsKICAgICAgc3RyZWFtLnN0YXJ0ID0gc3RyZWFtLnBvczsKICAgIH0KICB9Cn07Cn0pKCk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/runmode/runmode.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5ydW5Nb2RlID0gZnVuY3Rpb24oc3RyaW5nLCBtb2Rlc3BlYywgY2FsbGJhY2ssIG9wdGlvbnMpIHsKICB2YXIgbW9kZSA9IENvZGVNaXJyb3IuZ2V0TW9kZShDb2RlTWlycm9yLmRlZmF1bHRzLCBtb2Rlc3BlYyk7CiAgdmFyIGllID0gL01TSUUgXGQvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7CiAgdmFyIGllX2x0OSA9IGllICYmIChkb2N1bWVudC5kb2N1bWVudE1vZGUgPT0gbnVsbCB8fCBkb2N1bWVudC5kb2N1bWVudE1vZGUgPCA5KTsKCiAgaWYgKGNhbGxiYWNrLm5vZGVUeXBlID09IDEpIHsKICAgIHZhciB0YWJTaXplID0gKG9wdGlvbnMgJiYgb3B0aW9ucy50YWJTaXplKSB8fCBDb2RlTWlycm9yLmRlZmF1bHRzLnRhYlNpemU7CiAgICB2YXIgbm9kZSA9IGNhbGxiYWNrLCBjb2wgPSAwOwogICAgbm9kZS5pbm5lckhUTUwgPSAiIjsKICAgIGNhbGxiYWNrID0gZnVuY3Rpb24odGV4dCwgc3R5bGUpIHsKICAgICAgaWYgKHRleHQgPT0gIlxuIikgewogICAgICAgIC8vIEVtaXR0aW5nIExGIG9yIENSTEYgb24gSUU4IG9yIGVhcmxpZXIgcmVzdWx0cyBpbiBhbiBpbmNvcnJlY3QgZGlzcGxheS4KICAgICAgICAvLyBFbWl0dGluZyBhIGNhcnJpYWdlIHJldHVybiBtYWtlcyBldmVyeXRoaW5nIG9rLgogICAgICAgIG5vZGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoaWVfbHQ5ID8gJ1xyJyA6IHRleHQpKTsKICAgICAgICBjb2wgPSAwOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB2YXIgY29udGVudCA9ICIiOwogICAgICAvLyByZXBsYWNlIHRhYnMKICAgICAgZm9yICh2YXIgcG9zID0gMDs7KSB7CiAgICAgICAgdmFyIGlkeCA9IHRleHQuaW5kZXhPZigiXHQiLCBwb3MpOwogICAgICAgIGlmIChpZHggPT0gLTEpIHsKICAgICAgICAgIGNvbnRlbnQgKz0gdGV4dC5zbGljZShwb3MpOwogICAgICAgICAgY29sICs9IHRleHQubGVuZ3RoIC0gcG9zOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbCArPSBpZHggLSBwb3M7CiAgICAgICAgICBjb250ZW50ICs9IHRleHQuc2xpY2UocG9zLCBpZHgpOwogICAgICAgICAgdmFyIHNpemUgPSB0YWJTaXplIC0gY29sICUgdGFiU2l6ZTsKICAgICAgICAgIGNvbCArPSBzaXplOwogICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplOyArK2kpIGNvbnRlbnQgKz0gIiAiOwogICAgICAgICAgcG9zID0gaWR4ICsgMTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGlmIChzdHlsZSkgewogICAgICAgIHZhciBzcCA9IG5vZGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpKTsKICAgICAgICBzcC5jbGFzc05hbWUgPSAiY20tIiArIHN0eWxlLnJlcGxhY2UoLyArL2csICIgY20tIik7CiAgICAgICAgc3AuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY29udGVudCkpOwogICAgICB9IGVsc2UgewogICAgICAgIG5vZGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY29udGVudCkpOwogICAgICB9CiAgICB9OwogIH0KCiAgdmFyIGxpbmVzID0gQ29kZU1pcnJvci5zcGxpdExpbmVzKHN0cmluZyksIHN0YXRlID0gKG9wdGlvbnMgJiYgb3B0aW9ucy5zdGF0ZSkgfHwgQ29kZU1pcnJvci5zdGFydFN0YXRlKG1vZGUpOwogIGZvciAodmFyIGkgPSAwLCBlID0gbGluZXMubGVuZ3RoOyBpIDwgZTsgKytpKSB7CiAgICBpZiAoaSkgY2FsbGJhY2soIlxuIik7CiAgICB2YXIgc3RyZWFtID0gbmV3IENvZGVNaXJyb3IuU3RyaW5nU3RyZWFtKGxpbmVzW2ldKTsKICAgIGlmICghc3RyZWFtLnN0cmluZyAmJiBtb2RlLmJsYW5rTGluZSkgbW9kZS5ibGFua0xpbmUoc3RhdGUpOwogICAgd2hpbGUgKCFzdHJlYW0uZW9sKCkpIHsKICAgICAgdmFyIHN0eWxlID0gbW9kZS50b2tlbihzdHJlYW0sIHN0YXRlKTsKICAgICAgY2FsbGJhY2soc3RyZWFtLmN1cnJlbnQoKSwgc3R5bGUsIGksIHN0cmVhbS5zdGFydCwgc3RhdGUpOwogICAgICBzdHJlYW0uc3RhcnQgPSBzdHJlYW0ucG9zOwogICAgfQogIH0KfTsKCn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/runmode/runmode.node.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovKiBKdXN0IGVub3VnaCBvZiBDb2RlTWlycm9yIHRvIHJ1biBydW5Nb2RlIHVuZGVyIG5vZGUuanMgKi8KCi8vIGRlY2xhcmUgZ2xvYmFsOiBTdHJpbmdTdHJlYW0KCmZ1bmN0aW9uIHNwbGl0TGluZXMoc3RyaW5nKXsgcmV0dXJuIHN0cmluZy5zcGxpdCgvXHI/XG58XHIvKTsgfTsKCmZ1bmN0aW9uIFN0cmluZ1N0cmVhbShzdHJpbmcpIHsKICB0aGlzLnBvcyA9IHRoaXMuc3RhcnQgPSAwOwogIHRoaXMuc3RyaW5nID0gc3RyaW5nOwogIHRoaXMubGluZVN0YXJ0ID0gMDsKfQpTdHJpbmdTdHJlYW0ucHJvdG90eXBlID0gewogIGVvbDogZnVuY3Rpb24oKSB7cmV0dXJuIHRoaXMucG9zID49IHRoaXMuc3RyaW5nLmxlbmd0aDt9LAogIHNvbDogZnVuY3Rpb24oKSB7cmV0dXJuIHRoaXMucG9zID09IDA7fSwKICBwZWVrOiBmdW5jdGlvbigpIHtyZXR1cm4gdGhpcy5zdHJpbmcuY2hhckF0KHRoaXMucG9zKSB8fCBudWxsO30sCiAgbmV4dDogZnVuY3Rpb24oKSB7CiAgICBpZiAodGhpcy5wb3MgPCB0aGlzLnN0cmluZy5sZW5ndGgpCiAgICAgIHJldHVybiB0aGlzLnN0cmluZy5jaGFyQXQodGhpcy5wb3MrKyk7CiAgfSwKICBlYXQ6IGZ1bmN0aW9uKG1hdGNoKSB7CiAgICB2YXIgY2ggPSB0aGlzLnN0cmluZy5jaGFyQXQodGhpcy5wb3MpOwogICAgaWYgKHR5cGVvZiBtYXRjaCA9PSAic3RyaW5nIikgdmFyIG9rID0gY2ggPT0gbWF0Y2g7CiAgICBlbHNlIHZhciBvayA9IGNoICYmIChtYXRjaC50ZXN0ID8gbWF0Y2gudGVzdChjaCkgOiBtYXRjaChjaCkpOwogICAgaWYgKG9rKSB7Kyt0aGlzLnBvczsgcmV0dXJuIGNoO30KICB9LAogIGVhdFdoaWxlOiBmdW5jdGlvbihtYXRjaCkgewogICAgdmFyIHN0YXJ0ID0gdGhpcy5wb3M7CiAgICB3aGlsZSAodGhpcy5lYXQobWF0Y2gpKXt9CiAgICByZXR1cm4gdGhpcy5wb3MgPiBzdGFydDsKICB9LAogIGVhdFNwYWNlOiBmdW5jdGlvbigpIHsKICAgIHZhciBzdGFydCA9IHRoaXMucG9zOwogICAgd2hpbGUgKC9bXHNcdTAwYTBdLy50ZXN0KHRoaXMuc3RyaW5nLmNoYXJBdCh0aGlzLnBvcykpKSArK3RoaXMucG9zOwogICAgcmV0dXJuIHRoaXMucG9zID4gc3RhcnQ7CiAgfSwKICBza2lwVG9FbmQ6IGZ1bmN0aW9uKCkge3RoaXMucG9zID0gdGhpcy5zdHJpbmcubGVuZ3RoO30sCiAgc2tpcFRvOiBmdW5jdGlvbihjaCkgewogICAgdmFyIGZvdW5kID0gdGhpcy5zdHJpbmcuaW5kZXhPZihjaCwgdGhpcy5wb3MpOwogICAgaWYgKGZvdW5kID4gLTEpIHt0aGlzLnBvcyA9IGZvdW5kOyByZXR1cm4gdHJ1ZTt9CiAgfSwKICBiYWNrVXA6IGZ1bmN0aW9uKG4pIHt0aGlzLnBvcyAtPSBuO30sCiAgY29sdW1uOiBmdW5jdGlvbigpIHtyZXR1cm4gdGhpcy5zdGFydCAtIHRoaXMubGluZVN0YXJ0O30sCiAgaW5kZW50YXRpb246IGZ1bmN0aW9uKCkge3JldHVybiAwO30sCiAgbWF0Y2g6IGZ1bmN0aW9uKHBhdHRlcm4sIGNvbnN1bWUsIGNhc2VJbnNlbnNpdGl2ZSkgewogICAgaWYgKHR5cGVvZiBwYXR0ZXJuID09ICJzdHJpbmciKSB7CiAgICAgIHZhciBjYXNlZCA9IGZ1bmN0aW9uKHN0cikge3JldHVybiBjYXNlSW5zZW5zaXRpdmUgPyBzdHIudG9Mb3dlckNhc2UoKSA6IHN0cjt9OwogICAgICB2YXIgc3Vic3RyID0gdGhpcy5zdHJpbmcuc3Vic3RyKHRoaXMucG9zLCBwYXR0ZXJuLmxlbmd0aCk7CiAgICAgIGlmIChjYXNlZChzdWJzdHIpID09IGNhc2VkKHBhdHRlcm4pKSB7CiAgICAgICAgaWYgKGNvbnN1bWUgIT09IGZhbHNlKSB0aGlzLnBvcyArPSBwYXR0ZXJuLmxlbmd0aDsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdmFyIG1hdGNoID0gdGhpcy5zdHJpbmcuc2xpY2UodGhpcy5wb3MpLm1hdGNoKHBhdHRlcm4pOwogICAgICBpZiAobWF0Y2ggJiYgbWF0Y2guaW5kZXggPiAwKSByZXR1cm4gbnVsbDsKICAgICAgaWYgKG1hdGNoICYmIGNvbnN1bWUgIT09IGZhbHNlKSB0aGlzLnBvcyArPSBtYXRjaFswXS5sZW5ndGg7CiAgICAgIHJldHVybiBtYXRjaDsKICAgIH0KICB9LAogIGN1cnJlbnQ6IGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RyaW5nLnNsaWNlKHRoaXMuc3RhcnQsIHRoaXMucG9zKTt9LAogIGhpZGVGaXJzdENoYXJzOiBmdW5jdGlvbihuLCBpbm5lcikgewogICAgdGhpcy5saW5lU3RhcnQgKz0gbjsKICAgIHRyeSB7IHJldHVybiBpbm5lcigpOyB9CiAgICBmaW5hbGx5IHsgdGhpcy5saW5lU3RhcnQgLT0gbjsgfQogIH0KfTsKZXhwb3J0cy5TdHJpbmdTdHJlYW0gPSBTdHJpbmdTdHJlYW07CgpleHBvcnRzLnN0YXJ0U3RhdGUgPSBmdW5jdGlvbihtb2RlLCBhMSwgYTIpIHsKICByZXR1cm4gbW9kZS5zdGFydFN0YXRlID8gbW9kZS5zdGFydFN0YXRlKGExLCBhMikgOiB0cnVlOwp9OwoKdmFyIG1vZGVzID0gZXhwb3J0cy5tb2RlcyA9IHt9LCBtaW1lTW9kZXMgPSBleHBvcnRzLm1pbWVNb2RlcyA9IHt9OwpleHBvcnRzLmRlZmluZU1vZGUgPSBmdW5jdGlvbihuYW1lLCBtb2RlKSB7CiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAyKSB7CiAgICBtb2RlLmRlcGVuZGVuY2llcyA9IFtdOwogICAgZm9yICh2YXIgaSA9IDI7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyArK2kpIG1vZGUuZGVwZW5kZW5jaWVzLnB1c2goYXJndW1lbnRzW2ldKTsKICB9CiAgbW9kZXNbbmFtZV0gPSBtb2RlOwp9OwpleHBvcnRzLmRlZmluZU1JTUUgPSBmdW5jdGlvbihtaW1lLCBzcGVjKSB7IG1pbWVNb2Rlc1ttaW1lXSA9IHNwZWM7IH07CgpleHBvcnRzLmRlZmluZU1vZGUoIm51bGwiLCBmdW5jdGlvbigpIHsKICByZXR1cm4ge3Rva2VuOiBmdW5jdGlvbihzdHJlYW0pIHtzdHJlYW0uc2tpcFRvRW5kKCk7fX07Cn0pOwpleHBvcnRzLmRlZmluZU1JTUUoInRleHQvcGxhaW4iLCAibnVsbCIpOwoKZXhwb3J0cy5yZXNvbHZlTW9kZSA9IGZ1bmN0aW9uKHNwZWMpIHsKICBpZiAodHlwZW9mIHNwZWMgPT0gInN0cmluZyIgJiYgbWltZU1vZGVzLmhhc093blByb3BlcnR5KHNwZWMpKSB7CiAgICBzcGVjID0gbWltZU1vZGVzW3NwZWNdOwogIH0gZWxzZSBpZiAoc3BlYyAmJiB0eXBlb2Ygc3BlYy5uYW1lID09ICJzdHJpbmciICYmIG1pbWVNb2Rlcy5oYXNPd25Qcm9wZXJ0eShzcGVjLm5hbWUpKSB7CiAgICBzcGVjID0gbWltZU1vZGVzW3NwZWMubmFtZV07CiAgfQogIGlmICh0eXBlb2Ygc3BlYyA9PSAic3RyaW5nIikgcmV0dXJuIHtuYW1lOiBzcGVjfTsKICBlbHNlIHJldHVybiBzcGVjIHx8IHtuYW1lOiAibnVsbCJ9Owp9OwpleHBvcnRzLmdldE1vZGUgPSBmdW5jdGlvbihvcHRpb25zLCBzcGVjKSB7CiAgc3BlYyA9IGV4cG9ydHMucmVzb2x2ZU1vZGUoc3BlYyk7CiAgdmFyIG1mYWN0b3J5ID0gbW9kZXNbc3BlYy5uYW1lXTsKICBpZiAoIW1mYWN0b3J5KSB0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gbW9kZTogIiArIHNwZWMpOwogIHJldHVybiBtZmFjdG9yeShvcHRpb25zLCBzcGVjKTsKfTsKZXhwb3J0cy5yZWdpc3RlckhlbHBlciA9IGV4cG9ydHMucmVnaXN0ZXJHbG9iYWxIZWxwZXIgPSBNYXRoLm1pbjsKCmV4cG9ydHMucnVuTW9kZSA9IGZ1bmN0aW9uKHN0cmluZywgbW9kZXNwZWMsIGNhbGxiYWNrLCBvcHRpb25zKSB7CiAgdmFyIG1vZGUgPSBleHBvcnRzLmdldE1vZGUoe2luZGVudFVuaXQ6IDJ9LCBtb2Rlc3BlYyk7CiAgdmFyIGxpbmVzID0gc3BsaXRMaW5lcyhzdHJpbmcpLCBzdGF0ZSA9IChvcHRpb25zICYmIG9wdGlvbnMuc3RhdGUpIHx8IGV4cG9ydHMuc3RhcnRTdGF0ZShtb2RlKTsKICBmb3IgKHZhciBpID0gMCwgZSA9IGxpbmVzLmxlbmd0aDsgaSA8IGU7ICsraSkgewogICAgaWYgKGkpIGNhbGxiYWNrKCJcbiIpOwogICAgdmFyIHN0cmVhbSA9IG5ldyBleHBvcnRzLlN0cmluZ1N0cmVhbShsaW5lc1tpXSk7CiAgICBpZiAoIXN0cmVhbS5zdHJpbmcgJiYgbW9kZS5ibGFua0xpbmUpIG1vZGUuYmxhbmtMaW5lKHN0YXRlKTsKICAgIHdoaWxlICghc3RyZWFtLmVvbCgpKSB7CiAgICAgIHZhciBzdHlsZSA9IG1vZGUudG9rZW4oc3RyZWFtLCBzdGF0ZSk7CiAgICAgIGNhbGxiYWNrKHN0cmVhbS5jdXJyZW50KCksIHN0eWxlLCBpLCBzdHJlYW0uc3RhcnQsIHN0YXRlKTsKICAgICAgc3RyZWFtLnN0YXJ0ID0gc3RyZWFtLnBvczsKICAgIH0KICB9Cn07CgpyZXF1aXJlLmNhY2hlW3JlcXVpcmUucmVzb2x2ZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKV0gPSByZXF1aXJlLmNhY2hlW3JlcXVpcmUucmVzb2x2ZSgiLi9ydW5tb2RlLm5vZGUiKV07Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/scroll/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/scroll/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCEtLSBEVU1NWSBIVE1MIEZJTEUgLS0+]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/scroll/scrollpastend.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CgogIENvZGVNaXJyb3IuZGVmaW5lT3B0aW9uKCJzY3JvbGxQYXN0RW5kIiwgZmFsc2UsIGZ1bmN0aW9uKGNtLCB2YWwsIG9sZCkgewogICAgaWYgKG9sZCAmJiBvbGQgIT0gQ29kZU1pcnJvci5Jbml0KSB7CiAgICAgIGNtLm9mZigiY2hhbmdlIiwgb25DaGFuZ2UpOwogICAgICBjbS5vZmYoInJlZnJlc2giLCB1cGRhdGVCb3R0b21NYXJnaW4pOwogICAgICBjbS5kaXNwbGF5LmxpbmVTcGFjZS5wYXJlbnROb2RlLnN0eWxlLnBhZGRpbmdCb3R0b20gPSAiIjsKICAgICAgY20uc3RhdGUuc2Nyb2xsUGFzdEVuZFBhZGRpbmcgPSBudWxsOwogICAgfQogICAgaWYgKHZhbCkgewogICAgICBjbS5vbigiY2hhbmdlIiwgb25DaGFuZ2UpOwogICAgICBjbS5vbigicmVmcmVzaCIsIHVwZGF0ZUJvdHRvbU1hcmdpbik7CiAgICAgIHVwZGF0ZUJvdHRvbU1hcmdpbihjbSk7CiAgICB9CiAgfSk7CgogIGZ1bmN0aW9uIG9uQ2hhbmdlKGNtLCBjaGFuZ2UpIHsKICAgIGlmIChDb2RlTWlycm9yLmNoYW5nZUVuZChjaGFuZ2UpLmxpbmUgPT0gY20ubGFzdExpbmUoKSkKICAgICAgdXBkYXRlQm90dG9tTWFyZ2luKGNtKTsKICB9CgogIGZ1bmN0aW9uIHVwZGF0ZUJvdHRvbU1hcmdpbihjbSkgewogICAgdmFyIHBhZGRpbmcgPSAiIjsKICAgIGlmIChjbS5saW5lQ291bnQoKSA+IDEpIHsKICAgICAgdmFyIHRvdGFsSCA9IGNtLmRpc3BsYXkuc2Nyb2xsZXIuY2xpZW50SGVpZ2h0IC0gMzAsCiAgICAgICAgICBsYXN0TGluZUggPSBjbS5nZXRMaW5lSGFuZGxlKGNtLmxhc3RMaW5lKCkpLmhlaWdodDsKICAgICAgcGFkZGluZyA9ICh0b3RhbEggLSBsYXN0TGluZUgpICsgInB4IjsKICAgIH0KICAgIGlmIChjbS5zdGF0ZS5zY3JvbGxQYXN0RW5kUGFkZGluZyAhPSBwYWRkaW5nKSB7CiAgICAgIGNtLnN0YXRlLnNjcm9sbFBhc3RFbmRQYWRkaW5nID0gcGFkZGluZzsKICAgICAgY20uZGlzcGxheS5saW5lU3BhY2UucGFyZW50Tm9kZS5zdHlsZS5wYWRkaW5nQm90dG9tID0gcGFkZGluZzsKICAgICAgY20uc2V0U2l6ZSgpOwogICAgfQogIH0KfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/search/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/search/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCEtLSBEVU1NWSBIVE1MIEZJTEUgLS0+]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/search/match-highlighter.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovLyBIaWdobGlnaHRpbmcgdGV4dCB0aGF0IG1hdGNoZXMgdGhlIHNlbGVjdGlvbgovLwovLyBEZWZpbmVzIGFuIG9wdGlvbiBoaWdobGlnaHRTZWxlY3Rpb25NYXRjaGVzLCB3aGljaCwgd2hlbiBlbmFibGVkLAovLyB3aWxsIHN0eWxlIHN0cmluZ3MgdGhhdCBtYXRjaCB0aGUgc2VsZWN0aW9uIHRocm91Z2hvdXQgdGhlCi8vIGRvY3VtZW50LgovLwovLyBUaGUgb3B0aW9uIGNhbiBiZSBzZXQgdG8gdHJ1ZSB0byBzaW1wbHkgZW5hYmxlIGl0LCBvciB0byBhCi8vIHttaW5DaGFycywgc3R5bGUsIHNob3dUb2tlbn0gb2JqZWN0IHRvIGV4cGxpY2l0bHkgY29uZmlndXJlIGl0LgovLyBtaW5DaGFycyBpcyB0aGUgbWluaW11bSBhbW91bnQgb2YgY2hhcmFjdGVycyB0aGF0IHNob3VsZCBiZQovLyBzZWxlY3RlZCBmb3IgdGhlIGJlaGF2aW9yIHRvIG9jY3VyLCBhbmQgc3R5bGUgaXMgdGhlIHRva2VuIHN0eWxlIHRvCi8vIGFwcGx5IHRvIHRoZSBtYXRjaGVzLiBUaGlzIHdpbGwgYmUgcHJlZml4ZWQgYnkgImNtLSIgdG8gY3JlYXRlIGFuCi8vIGFjdHVhbCBDU1MgY2xhc3MgbmFtZS4gc2hvd1Rva2VuLCB3aGVuIGVuYWJsZWQsIHdpbGwgY2F1c2UgdGhlCi8vIGN1cnJlbnQgdG9rZW4gdG8gYmUgaGlnaGxpZ2h0ZWQgd2hlbiBub3RoaW5nIGlzIHNlbGVjdGVkLgoKKGZ1bmN0aW9uKG1vZCkgewogIGlmICh0eXBlb2YgZXhwb3J0cyA9PSAib2JqZWN0IiAmJiB0eXBlb2YgbW9kdWxlID09ICJvYmplY3QiKSAvLyBDb21tb25KUwogICAgbW9kKHJlcXVpcmUoIi4uLy4uL2xpYi9jb2RlbWlycm9yIikpOwogIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kKSAvLyBBTUQKICAgIGRlZmluZShbIi4uLy4uL2xpYi9jb2RlbWlycm9yIl0sIG1vZCk7CiAgZWxzZSAvLyBQbGFpbiBicm93c2VyIGVudgogICAgbW9kKENvZGVNaXJyb3IpOwp9KShmdW5jdGlvbihDb2RlTWlycm9yKSB7CiAgInVzZSBzdHJpY3QiOwoKICB2YXIgREVGQVVMVF9NSU5fQ0hBUlMgPSAyOwogIHZhciBERUZBVUxUX1RPS0VOX1NUWUxFID0gIm1hdGNoaGlnaGxpZ2h0IjsKICB2YXIgREVGQVVMVF9ERUxBWSA9IDEwMDsKCiAgZnVuY3Rpb24gU3RhdGUob3B0aW9ucykgewogICAgaWYgKHR5cGVvZiBvcHRpb25zID09ICJvYmplY3QiKSB7CiAgICAgIHRoaXMubWluQ2hhcnMgPSBvcHRpb25zLm1pbkNoYXJzOwogICAgICB0aGlzLnN0eWxlID0gb3B0aW9ucy5zdHlsZTsKICAgICAgdGhpcy5zaG93VG9rZW4gPSBvcHRpb25zLnNob3dUb2tlbjsKICAgICAgdGhpcy5kZWxheSA9IG9wdGlvbnMuZGVsYXk7CiAgICB9CiAgICBpZiAodGhpcy5zdHlsZSA9PSBudWxsKSB0aGlzLnN0eWxlID0gREVGQVVMVF9UT0tFTl9TVFlMRTsKICAgIGlmICh0aGlzLm1pbkNoYXJzID09IG51bGwpIHRoaXMubWluQ2hhcnMgPSBERUZBVUxUX01JTl9DSEFSUzsKICAgIGlmICh0aGlzLmRlbGF5ID09IG51bGwpIHRoaXMuZGVsYXkgPSBERUZBVUxUX0RFTEFZOwogICAgdGhpcy5vdmVybGF5ID0gdGhpcy50aW1lb3V0ID0gbnVsbDsKICB9CgogIENvZGVNaXJyb3IuZGVmaW5lT3B0aW9uKCJoaWdobGlnaHRTZWxlY3Rpb25NYXRjaGVzIiwgZmFsc2UsIGZ1bmN0aW9uKGNtLCB2YWwsIG9sZCkgewogICAgaWYgKG9sZCAmJiBvbGQgIT0gQ29kZU1pcnJvci5Jbml0KSB7CiAgICAgIHZhciBvdmVyID0gY20uc3RhdGUubWF0Y2hIaWdobGlnaHRlci5vdmVybGF5OwogICAgICBpZiAob3ZlcikgY20ucmVtb3ZlT3ZlcmxheShvdmVyKTsKICAgICAgY2xlYXJUaW1lb3V0KGNtLnN0YXRlLm1hdGNoSGlnaGxpZ2h0ZXIudGltZW91dCk7CiAgICAgIGNtLnN0YXRlLm1hdGNoSGlnaGxpZ2h0ZXIgPSBudWxsOwogICAgICBjbS5vZmYoImN1cnNvckFjdGl2aXR5IiwgY3Vyc29yQWN0aXZpdHkpOwogICAgfQogICAgaWYgKHZhbCkgewogICAgICBjbS5zdGF0ZS5tYXRjaEhpZ2hsaWdodGVyID0gbmV3IFN0YXRlKHZhbCk7CiAgICAgIGhpZ2hsaWdodE1hdGNoZXMoY20pOwogICAgICBjbS5vbigiY3Vyc29yQWN0aXZpdHkiLCBjdXJzb3JBY3Rpdml0eSk7CiAgICB9CiAgfSk7CgogIGZ1bmN0aW9uIGN1cnNvckFjdGl2aXR5KGNtKSB7CiAgICB2YXIgc3RhdGUgPSBjbS5zdGF0ZS5tYXRjaEhpZ2hsaWdodGVyOwogICAgY2xlYXJUaW1lb3V0KHN0YXRlLnRpbWVvdXQpOwogICAgc3RhdGUudGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7aGlnaGxpZ2h0TWF0Y2hlcyhjbSk7fSwgc3RhdGUuZGVsYXkpOwogIH0KCiAgZnVuY3Rpb24gaGlnaGxpZ2h0TWF0Y2hlcyhjbSkgewogICAgY20ub3BlcmF0aW9uKGZ1bmN0aW9uKCkgewogICAgICB2YXIgc3RhdGUgPSBjbS5zdGF0ZS5tYXRjaEhpZ2hsaWdodGVyOwogICAgICBpZiAoc3RhdGUub3ZlcmxheSkgewogICAgICAgIGNtLnJlbW92ZU92ZXJsYXkoc3RhdGUub3ZlcmxheSk7CiAgICAgICAgc3RhdGUub3ZlcmxheSA9IG51bGw7CiAgICAgIH0KICAgICAgaWYgKCFjbS5zb21ldGhpbmdTZWxlY3RlZCgpICYmIHN0YXRlLnNob3dUb2tlbikgewogICAgICAgIHZhciByZSA9IHN0YXRlLnNob3dUb2tlbiA9PT0gdHJ1ZSA/IC9bXHckXS8gOiBzdGF0ZS5zaG93VG9rZW47CiAgICAgICAgdmFyIGN1ciA9IGNtLmdldEN1cnNvcigpLCBsaW5lID0gY20uZ2V0TGluZShjdXIubGluZSksIHN0YXJ0ID0gY3VyLmNoLCBlbmQgPSBzdGFydDsKICAgICAgICB3aGlsZSAoc3RhcnQgJiYgcmUudGVzdChsaW5lLmNoYXJBdChzdGFydCAtIDEpKSkgLS1zdGFydDsKICAgICAgICB3aGlsZSAoZW5kIDwgbGluZS5sZW5ndGggJiYgcmUudGVzdChsaW5lLmNoYXJBdChlbmQpKSkgKytlbmQ7CiAgICAgICAgaWYgKHN0YXJ0IDwgZW5kKQogICAgICAgICAgY20uYWRkT3ZlcmxheShzdGF0ZS5vdmVybGF5ID0gbWFrZU92ZXJsYXkobGluZS5zbGljZShzdGFydCwgZW5kKSwgcmUsIHN0YXRlLnN0eWxlKSk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHZhciBmcm9tID0gY20uZ2V0Q3Vyc29yKCJmcm9tIiksIHRvID0gY20uZ2V0Q3Vyc29yKCJ0byIpOwogICAgICBpZiAoZnJvbS5saW5lICE9IHRvLmxpbmUpIHJldHVybjsKICAgICAgdmFyIHNlbGVjdGlvbiA9IGNtLmdldFJhbmdlKGZyb20sIHRvKS5yZXBsYWNlKC9eXHMrfFxzKyQvZywgIiIpOwogICAgICBpZiAoc2VsZWN0aW9uLmxlbmd0aCA+PSBzdGF0ZS5taW5DaGFycykKICAgICAgICBjbS5hZGRPdmVybGF5KHN0YXRlLm92ZXJsYXkgPSBtYWtlT3ZlcmxheShzZWxlY3Rpb24sIGZhbHNlLCBzdGF0ZS5zdHlsZSkpOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBib3VuZGFyaWVzQXJvdW5kKHN0cmVhbSwgcmUpIHsKICAgIHJldHVybiAoIXN0cmVhbS5zdGFydCB8fCAhcmUudGVzdChzdHJlYW0uc3RyaW5nLmNoYXJBdChzdHJlYW0uc3RhcnQgLSAxKSkpICYmCiAgICAgIChzdHJlYW0ucG9zID09IHN0cmVhbS5zdHJpbmcubGVuZ3RoIHx8ICFyZS50ZXN0KHN0cmVhbS5zdHJpbmcuY2hhckF0KHN0cmVhbS5wb3MpKSk7CiAgfQoKICBmdW5jdGlvbiBtYWtlT3ZlcmxheShxdWVyeSwgaGFzQm91bmRhcnksIHN0eWxlKSB7CiAgICByZXR1cm4ge3Rva2VuOiBmdW5jdGlvbihzdHJlYW0pIHsKICAgICAgaWYgKHN0cmVhbS5tYXRjaChxdWVyeSkgJiYKICAgICAgICAgICghaGFzQm91bmRhcnkgfHwgYm91bmRhcmllc0Fyb3VuZChzdHJlYW0sIGhhc0JvdW5kYXJ5KSkpCiAgICAgICAgcmV0dXJuIHN0eWxlOwogICAgICBzdHJlYW0ubmV4dCgpOwogICAgICBzdHJlYW0uc2tpcFRvKHF1ZXJ5LmNoYXJBdCgwKSkgfHwgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgfX07CiAgfQp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/search/search.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovLyBEZWZpbmUgc2VhcmNoIGNvbW1hbmRzLiBEZXBlbmRzIG9uIGRpYWxvZy5qcyBvciBhbm90aGVyCi8vIGltcGxlbWVudGF0aW9uIG9mIHRoZSBvcGVuRGlhbG9nIG1ldGhvZC4KCi8vIFJlcGxhY2Ugd29ya3MgYSBsaXR0bGUgb2RkbHkgLS0gaXQgd2lsbCBkbyB0aGUgcmVwbGFjZSBvbiB0aGUgbmV4dAovLyBDdHJsLUcgKG9yIHdoYXRldmVyIGlzIGJvdW5kIHRvIGZpbmROZXh0KSBwcmVzcy4gWW91IHByZXZlbnQgYQovLyByZXBsYWNlIGJ5IG1ha2luZyBzdXJlIHRoZSBtYXRjaCBpcyBubyBsb25nZXIgc2VsZWN0ZWQgd2hlbiBoaXR0aW5nCi8vIEN0cmwtRy4KCihmdW5jdGlvbihtb2QpIHsKICBpZiAodHlwZW9mIGV4cG9ydHMgPT0gIm9iamVjdCIgJiYgdHlwZW9mIG1vZHVsZSA9PSAib2JqZWN0IikgLy8gQ29tbW9uSlMKICAgIG1vZChyZXF1aXJlKCIuLi8uLi9saWIvY29kZW1pcnJvciIpLCByZXF1aXJlKCIuL3NlYXJjaGN1cnNvciIpLCByZXF1aXJlKCIuLi9kaWFsb2cvZGlhbG9nIikpOwogIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kKSAvLyBBTUQKICAgIGRlZmluZShbIi4uLy4uL2xpYi9jb2RlbWlycm9yIiwgIi4vc2VhcmNoY3Vyc29yIiwgIi4uL2RpYWxvZy9kaWFsb2ciXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CiAgZnVuY3Rpb24gc2VhcmNoT3ZlcmxheShxdWVyeSwgY2FzZUluc2Vuc2l0aXZlKSB7CiAgICBpZiAodHlwZW9mIHF1ZXJ5ID09ICJzdHJpbmciKQogICAgICBxdWVyeSA9IG5ldyBSZWdFeHAocXVlcnkucmVwbGFjZSgvW1wtXFtcXVwvXHtcfVwoXClcKlwrXD9cLlxcXF5cJFx8XS9nLCAiXFwkJiIpLCBjYXNlSW5zZW5zaXRpdmUgPyAiZ2kiIDogImciKTsKICAgIGVsc2UgaWYgKCFxdWVyeS5nbG9iYWwpCiAgICAgIHF1ZXJ5ID0gbmV3IFJlZ0V4cChxdWVyeS5zb3VyY2UsIHF1ZXJ5Lmlnbm9yZUNhc2UgPyAiZ2kiIDogImciKTsKCiAgICByZXR1cm4ge3Rva2VuOiBmdW5jdGlvbihzdHJlYW0pIHsKICAgICAgcXVlcnkubGFzdEluZGV4ID0gc3RyZWFtLnBvczsKICAgICAgdmFyIG1hdGNoID0gcXVlcnkuZXhlYyhzdHJlYW0uc3RyaW5nKTsKICAgICAgaWYgKG1hdGNoICYmIG1hdGNoLmluZGV4ID09IHN0cmVhbS5wb3MpIHsKICAgICAgICBzdHJlYW0ucG9zICs9IG1hdGNoWzBdLmxlbmd0aDsKICAgICAgICByZXR1cm4gInNlYXJjaGluZyI7CiAgICAgIH0gZWxzZSBpZiAobWF0Y2gpIHsKICAgICAgICBzdHJlYW0ucG9zID0gbWF0Y2guaW5kZXg7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICB9CiAgICB9fTsKICB9CgogIGZ1bmN0aW9uIFNlYXJjaFN0YXRlKCkgewogICAgdGhpcy5wb3NGcm9tID0gdGhpcy5wb3NUbyA9IHRoaXMucXVlcnkgPSBudWxsOwogICAgdGhpcy5vdmVybGF5ID0gbnVsbDsKICB9CiAgZnVuY3Rpb24gZ2V0U2VhcmNoU3RhdGUoY20pIHsKICAgIHJldHVybiBjbS5zdGF0ZS5zZWFyY2ggfHwgKGNtLnN0YXRlLnNlYXJjaCA9IG5ldyBTZWFyY2hTdGF0ZSgpKTsKICB9CiAgZnVuY3Rpb24gcXVlcnlDYXNlSW5zZW5zaXRpdmUocXVlcnkpIHsKICAgIHJldHVybiB0eXBlb2YgcXVlcnkgPT0gInN0cmluZyIgJiYgcXVlcnkgPT0gcXVlcnkudG9Mb3dlckNhc2UoKTsKICB9CiAgZnVuY3Rpb24gZ2V0U2VhcmNoQ3Vyc29yKGNtLCBxdWVyeSwgcG9zKSB7CiAgICAvLyBIZXVyaXN0aWM6IGlmIHRoZSBxdWVyeSBzdHJpbmcgaXMgYWxsIGxvd2VyY2FzZSwgZG8gYSBjYXNlIGluc2Vuc2l0aXZlIHNlYXJjaC4KICAgIHJldHVybiBjbS5nZXRTZWFyY2hDdXJzb3IocXVlcnksIHBvcywgcXVlcnlDYXNlSW5zZW5zaXRpdmUocXVlcnkpKTsKICB9CiAgZnVuY3Rpb24gZGlhbG9nKGNtLCB0ZXh0LCBzaG9ydFRleHQsIGRlZmx0LCBmKSB7CiAgICBpZiAoY20ub3BlbkRpYWxvZykgY20ub3BlbkRpYWxvZyh0ZXh0LCBmLCB7dmFsdWU6IGRlZmx0fSk7CiAgICBlbHNlIGYocHJvbXB0KHNob3J0VGV4dCwgZGVmbHQpKTsKICB9CiAgZnVuY3Rpb24gY29uZmlybURpYWxvZyhjbSwgdGV4dCwgc2hvcnRUZXh0LCBmcykgewogICAgaWYgKGNtLm9wZW5Db25maXJtKSBjbS5vcGVuQ29uZmlybSh0ZXh0LCBmcyk7CiAgICBlbHNlIGlmIChjb25maXJtKHNob3J0VGV4dCkpIGZzWzBdKCk7CiAgfQogIGZ1bmN0aW9uIHBhcnNlUXVlcnkocXVlcnkpIHsKICAgIHZhciBpc1JFID0gcXVlcnkubWF0Y2goL15cLyguKilcLyhbYS16XSopJC8pOwogICAgaWYgKGlzUkUpIHsKICAgICAgcXVlcnkgPSBuZXcgUmVnRXhwKGlzUkVbMV0sIGlzUkVbMl0uaW5kZXhPZigiaSIpID09IC0xID8gIiIgOiAiaSIpOwogICAgICBpZiAocXVlcnkudGVzdCgiIikpIHF1ZXJ5ID0gL3heLzsKICAgIH0gZWxzZSBpZiAocXVlcnkgPT0gIiIpIHsKICAgICAgcXVlcnkgPSAveF4vOwogICAgfQogICAgcmV0dXJuIHF1ZXJ5OwogIH0KICB2YXIgcXVlcnlEaWFsb2cgPQogICAgJ1NlYXJjaDogPGlucHV0IHR5cGU9InRleHQiIHN0eWxlPSJ3aWR0aDogMTBlbSIvPiA8c3BhbiBzdHlsZT0iY29sb3I6ICM4ODgiPihVc2UgL3JlLyBzeW50YXggZm9yIHJlZ2V4cCBzZWFyY2gpPC9zcGFuPic7CiAgZnVuY3Rpb24gZG9TZWFyY2goY20sIHJldikgewogICAgdmFyIHN0YXRlID0gZ2V0U2VhcmNoU3RhdGUoY20pOwogICAgaWYgKHN0YXRlLnF1ZXJ5KSByZXR1cm4gZmluZE5leHQoY20sIHJldik7CiAgICBkaWFsb2coY20sIHF1ZXJ5RGlhbG9nLCAiU2VhcmNoIGZvcjoiLCBjbS5nZXRTZWxlY3Rpb24oKSwgZnVuY3Rpb24ocXVlcnkpIHsKICAgICAgY20ub3BlcmF0aW9uKGZ1bmN0aW9uKCkgewogICAgICAgIGlmICghcXVlcnkgfHwgc3RhdGUucXVlcnkpIHJldHVybjsKICAgICAgICBzdGF0ZS5xdWVyeSA9IHBhcnNlUXVlcnkocXVlcnkpOwogICAgICAgIGNtLnJlbW92ZU92ZXJsYXkoc3RhdGUub3ZlcmxheSwgcXVlcnlDYXNlSW5zZW5zaXRpdmUoc3RhdGUucXVlcnkpKTsKICAgICAgICBzdGF0ZS5vdmVybGF5ID0gc2VhcmNoT3ZlcmxheShzdGF0ZS5xdWVyeSwgcXVlcnlDYXNlSW5zZW5zaXRpdmUoc3RhdGUucXVlcnkpKTsKICAgICAgICBjbS5hZGRPdmVybGF5KHN0YXRlLm92ZXJsYXkpOwogICAgICAgIHN0YXRlLnBvc0Zyb20gPSBzdGF0ZS5wb3NUbyA9IGNtLmdldEN1cnNvcigpOwogICAgICAgIGZpbmROZXh0KGNtLCByZXYpOwogICAgICB9KTsKICAgIH0pOwogIH0KICBmdW5jdGlvbiBmaW5kTmV4dChjbSwgcmV2KSB7Y20ub3BlcmF0aW9uKGZ1bmN0aW9uKCkgewogICAgdmFyIHN0YXRlID0gZ2V0U2VhcmNoU3RhdGUoY20pOwogICAgdmFyIGN1cnNvciA9IGdldFNlYXJjaEN1cnNvcihjbSwgc3RhdGUucXVlcnksIHJldiA/IHN0YXRlLnBvc0Zyb20gOiBzdGF0ZS5wb3NUbyk7CiAgICBpZiAoIWN1cnNvci5maW5kKHJldikpIHsKICAgICAgY3Vyc29yID0gZ2V0U2VhcmNoQ3Vyc29yKGNtLCBzdGF0ZS5xdWVyeSwgcmV2ID8gQ29kZU1pcnJvci5Qb3MoY20ubGFzdExpbmUoKSkgOiBDb2RlTWlycm9yLlBvcyhjbS5maXJzdExpbmUoKSwgMCkpOwogICAgICBpZiAoIWN1cnNvci5maW5kKHJldikpIHJldHVybjsKICAgIH0KICAgIGNtLnNldFNlbGVjdGlvbihjdXJzb3IuZnJvbSgpLCBjdXJzb3IudG8oKSk7CiAgICBjbS5zY3JvbGxJbnRvVmlldyh7ZnJvbTogY3Vyc29yLmZyb20oKSwgdG86IGN1cnNvci50bygpfSk7CiAgICBzdGF0ZS5wb3NGcm9tID0gY3Vyc29yLmZyb20oKTsgc3RhdGUucG9zVG8gPSBjdXJzb3IudG8oKTsKICB9KTt9CiAgZnVuY3Rpb24gY2xlYXJTZWFyY2goY20pIHtjbS5vcGVyYXRpb24oZnVuY3Rpb24oKSB7CiAgICB2YXIgc3RhdGUgPSBnZXRTZWFyY2hTdGF0ZShjbSk7CiAgICBpZiAoIXN0YXRlLnF1ZXJ5KSByZXR1cm47CiAgICBzdGF0ZS5xdWVyeSA9IG51bGw7CiAgICBjbS5yZW1vdmVPdmVybGF5KHN0YXRlLm92ZXJsYXkpOwogIH0pO30KCiAgdmFyIHJlcGxhY2VRdWVyeURpYWxvZyA9CiAgICAnUmVwbGFjZTogPGlucHV0IHR5cGU9InRleHQiIHN0eWxlPSJ3aWR0aDogMTBlbSIvPiA8c3BhbiBzdHlsZT0iY29sb3I6ICM4ODgiPihVc2UgL3JlLyBzeW50YXggZm9yIHJlZ2V4cCBzZWFyY2gpPC9zcGFuPic7CiAgdmFyIHJlcGxhY2VtZW50UXVlcnlEaWFsb2cgPSAnV2l0aDogPGlucHV0IHR5cGU9InRleHQiIHN0eWxlPSJ3aWR0aDogMTBlbSIvPic7CiAgdmFyIGRvUmVwbGFjZUNvbmZpcm0gPSAiUmVwbGFjZT8gPGJ1dHRvbj5ZZXM8L2J1dHRvbj4gPGJ1dHRvbj5ObzwvYnV0dG9uPiA8YnV0dG9uPlN0b3A8L2J1dHRvbj4iOwogIGZ1bmN0aW9uIHJlcGxhY2UoY20sIGFsbCkgewogICAgaWYgKGNtLmdldE9wdGlvbigicmVhZE9ubHkiKSkgcmV0dXJuOwogICAgZGlhbG9nKGNtLCByZXBsYWNlUXVlcnlEaWFsb2csICJSZXBsYWNlOiIsIGNtLmdldFNlbGVjdGlvbigpLCBmdW5jdGlvbihxdWVyeSkgewogICAgICBpZiAoIXF1ZXJ5KSByZXR1cm47CiAgICAgIHF1ZXJ5ID0gcGFyc2VRdWVyeShxdWVyeSk7CiAgICAgIGRpYWxvZyhjbSwgcmVwbGFjZW1lbnRRdWVyeURpYWxvZywgIlJlcGxhY2Ugd2l0aDoiLCAiIiwgZnVuY3Rpb24odGV4dCkgewogICAgICAgIGlmIChhbGwpIHsKICAgICAgICAgIGNtLm9wZXJhdGlvbihmdW5jdGlvbigpIHsKICAgICAgICAgICAgZm9yICh2YXIgY3Vyc29yID0gZ2V0U2VhcmNoQ3Vyc29yKGNtLCBxdWVyeSk7IGN1cnNvci5maW5kTmV4dCgpOykgewogICAgICAgICAgICAgIGlmICh0eXBlb2YgcXVlcnkgIT0gInN0cmluZyIpIHsKICAgICAgICAgICAgICAgIHZhciBtYXRjaCA9IGNtLmdldFJhbmdlKGN1cnNvci5mcm9tKCksIGN1cnNvci50bygpKS5tYXRjaChxdWVyeSk7CiAgICAgICAgICAgICAgICBjdXJzb3IucmVwbGFjZSh0ZXh0LnJlcGxhY2UoL1wkKFxkKS9nLCBmdW5jdGlvbihfLCBpKSB7cmV0dXJuIG1hdGNoW2ldO30pKTsKICAgICAgICAgICAgICB9IGVsc2UgY3Vyc29yLnJlcGxhY2UodGV4dCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjbGVhclNlYXJjaChjbSk7CiAgICAgICAgICB2YXIgY3Vyc29yID0gZ2V0U2VhcmNoQ3Vyc29yKGNtLCBxdWVyeSwgY20uZ2V0Q3Vyc29yKCkpOwogICAgICAgICAgdmFyIGFkdmFuY2UgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIHN0YXJ0ID0gY3Vyc29yLmZyb20oKSwgbWF0Y2g7CiAgICAgICAgICAgIGlmICghKG1hdGNoID0gY3Vyc29yLmZpbmROZXh0KCkpKSB7CiAgICAgICAgICAgICAgY3Vyc29yID0gZ2V0U2VhcmNoQ3Vyc29yKGNtLCBxdWVyeSk7CiAgICAgICAgICAgICAgaWYgKCEobWF0Y2ggPSBjdXJzb3IuZmluZE5leHQoKSkgfHwKICAgICAgICAgICAgICAgICAgKHN0YXJ0ICYmIGN1cnNvci5mcm9tKCkubGluZSA9PSBzdGFydC5saW5lICYmIGN1cnNvci5mcm9tKCkuY2ggPT0gc3RhcnQuY2gpKSByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY20uc2V0U2VsZWN0aW9uKGN1cnNvci5mcm9tKCksIGN1cnNvci50bygpKTsKICAgICAgICAgICAgY20uc2Nyb2xsSW50b1ZpZXcoe2Zyb206IGN1cnNvci5mcm9tKCksIHRvOiBjdXJzb3IudG8oKX0pOwogICAgICAgICAgICBjb25maXJtRGlhbG9nKGNtLCBkb1JlcGxhY2VDb25maXJtLCAiUmVwbGFjZT8iLAogICAgICAgICAgICAgICAgICAgICAgICAgIFtmdW5jdGlvbigpIHtkb1JlcGxhY2UobWF0Y2gpO30sIGFkdmFuY2VdKTsKICAgICAgICAgIH07CiAgICAgICAgICB2YXIgZG9SZXBsYWNlID0gZnVuY3Rpb24obWF0Y2gpIHsKICAgICAgICAgICAgY3Vyc29yLnJlcGxhY2UodHlwZW9mIHF1ZXJ5ID09ICJzdHJpbmciID8gdGV4dCA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQucmVwbGFjZSgvXCQoXGQpL2csIGZ1bmN0aW9uKF8sIGkpIHtyZXR1cm4gbWF0Y2hbaV07fSkpOwogICAgICAgICAgICBhZHZhbmNlKCk7CiAgICAgICAgICB9OwogICAgICAgICAgYWR2YW5jZSgpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9KTsKICB9CgogIENvZGVNaXJyb3IuY29tbWFuZHMuZmluZCA9IGZ1bmN0aW9uKGNtKSB7Y2xlYXJTZWFyY2goY20pOyBkb1NlYXJjaChjbSk7fTsKICBDb2RlTWlycm9yLmNvbW1hbmRzLmZpbmROZXh0ID0gZG9TZWFyY2g7CiAgQ29kZU1pcnJvci5jb21tYW5kcy5maW5kUHJldiA9IGZ1bmN0aW9uKGNtKSB7ZG9TZWFyY2goY20sIHRydWUpO307CiAgQ29kZU1pcnJvci5jb21tYW5kcy5jbGVhclNlYXJjaCA9IGNsZWFyU2VhcmNoOwogIENvZGVNaXJyb3IuY29tbWFuZHMucmVwbGFjZSA9IHJlcGxhY2U7CiAgQ29kZU1pcnJvci5jb21tYW5kcy5yZXBsYWNlQWxsID0gZnVuY3Rpb24oY20pIHtyZXBsYWNlKGNtLCB0cnVlKTt9Owp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/search/searchcursor.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CiAgdmFyIFBvcyA9IENvZGVNaXJyb3IuUG9zOwoKICBmdW5jdGlvbiBTZWFyY2hDdXJzb3IoZG9jLCBxdWVyeSwgcG9zLCBjYXNlRm9sZCkgewogICAgdGhpcy5hdE9jY3VycmVuY2UgPSBmYWxzZTsgdGhpcy5kb2MgPSBkb2M7CiAgICBpZiAoY2FzZUZvbGQgPT0gbnVsbCAmJiB0eXBlb2YgcXVlcnkgPT0gInN0cmluZyIpIGNhc2VGb2xkID0gZmFsc2U7CgogICAgcG9zID0gcG9zID8gZG9jLmNsaXBQb3MocG9zKSA6IFBvcygwLCAwKTsKICAgIHRoaXMucG9zID0ge2Zyb206IHBvcywgdG86IHBvc307CgogICAgLy8gVGhlIG1hdGNoZXMgbWV0aG9kIGlzIGZpbGxlZCBpbiBiYXNlZCBvbiB0aGUgdHlwZSBvZiBxdWVyeS4KICAgIC8vIEl0IHRha2VzIGEgcG9zaXRpb24gYW5kIGEgZGlyZWN0aW9uLCBhbmQgcmV0dXJucyBhbiBvYmplY3QKICAgIC8vIGRlc2NyaWJpbmcgdGhlIG5leHQgb2NjdXJyZW5jZSBvZiB0aGUgcXVlcnksIG9yIG51bGwgaWYgbm8KICAgIC8vIG1vcmUgbWF0Y2hlcyB3ZXJlIGZvdW5kLgogICAgaWYgKHR5cGVvZiBxdWVyeSAhPSAic3RyaW5nIikgeyAvLyBSZWdleHAgbWF0Y2gKICAgICAgaWYgKCFxdWVyeS5nbG9iYWwpIHF1ZXJ5ID0gbmV3IFJlZ0V4cChxdWVyeS5zb3VyY2UsIHF1ZXJ5Lmlnbm9yZUNhc2UgPyAiaWciIDogImciKTsKICAgICAgdGhpcy5tYXRjaGVzID0gZnVuY3Rpb24ocmV2ZXJzZSwgcG9zKSB7CiAgICAgICAgaWYgKHJldmVyc2UpIHsKICAgICAgICAgIHF1ZXJ5Lmxhc3RJbmRleCA9IDA7CiAgICAgICAgICB2YXIgbGluZSA9IGRvYy5nZXRMaW5lKHBvcy5saW5lKS5zbGljZSgwLCBwb3MuY2gpLCBjdXRPZmYgPSAwLCBtYXRjaCwgc3RhcnQ7CiAgICAgICAgICBmb3IgKDs7KSB7CiAgICAgICAgICAgIHF1ZXJ5Lmxhc3RJbmRleCA9IGN1dE9mZjsKICAgICAgICAgICAgdmFyIG5ld01hdGNoID0gcXVlcnkuZXhlYyhsaW5lKTsKICAgICAgICAgICAgaWYgKCFuZXdNYXRjaCkgYnJlYWs7CiAgICAgICAgICAgIG1hdGNoID0gbmV3TWF0Y2g7CiAgICAgICAgICAgIHN0YXJ0ID0gbWF0Y2guaW5kZXg7CiAgICAgICAgICAgIGN1dE9mZiA9IG1hdGNoLmluZGV4ICsgKG1hdGNoWzBdLmxlbmd0aCB8fCAxKTsKICAgICAgICAgICAgaWYgKGN1dE9mZiA9PSBsaW5lLmxlbmd0aCkgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICB2YXIgbWF0Y2hMZW4gPSAobWF0Y2ggJiYgbWF0Y2hbMF0ubGVuZ3RoKSB8fCAwOwogICAgICAgICAgaWYgKCFtYXRjaExlbikgewogICAgICAgICAgICBpZiAoc3RhcnQgPT0gMCAmJiBsaW5lLmxlbmd0aCA9PSAwKSB7bWF0Y2ggPSB1bmRlZmluZWQ7fQogICAgICAgICAgICBlbHNlIGlmIChzdGFydCAhPSBkb2MuZ2V0TGluZShwb3MubGluZSkubGVuZ3RoKSB7CiAgICAgICAgICAgICAgbWF0Y2hMZW4rKzsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBxdWVyeS5sYXN0SW5kZXggPSBwb3MuY2g7CiAgICAgICAgICB2YXIgbGluZSA9IGRvYy5nZXRMaW5lKHBvcy5saW5lKSwgbWF0Y2ggPSBxdWVyeS5leGVjKGxpbmUpOwogICAgICAgICAgdmFyIG1hdGNoTGVuID0gKG1hdGNoICYmIG1hdGNoWzBdLmxlbmd0aCkgfHwgMDsKICAgICAgICAgIHZhciBzdGFydCA9IG1hdGNoICYmIG1hdGNoLmluZGV4OwogICAgICAgICAgaWYgKHN0YXJ0ICsgbWF0Y2hMZW4gIT0gbGluZS5sZW5ndGggJiYgIW1hdGNoTGVuKSBtYXRjaExlbiA9IDE7CiAgICAgICAgfQogICAgICAgIGlmIChtYXRjaCAmJiBtYXRjaExlbikKICAgICAgICAgIHJldHVybiB7ZnJvbTogUG9zKHBvcy5saW5lLCBzdGFydCksCiAgICAgICAgICAgICAgICAgIHRvOiBQb3MocG9zLmxpbmUsIHN0YXJ0ICsgbWF0Y2hMZW4pLAogICAgICAgICAgICAgICAgICBtYXRjaDogbWF0Y2h9OwogICAgICB9OwogICAgfSBlbHNlIHsgLy8gU3RyaW5nIHF1ZXJ5CiAgICAgIHZhciBvcmlnUXVlcnkgPSBxdWVyeTsKICAgICAgaWYgKGNhc2VGb2xkKSBxdWVyeSA9IHF1ZXJ5LnRvTG93ZXJDYXNlKCk7CiAgICAgIHZhciBmb2xkID0gY2FzZUZvbGQgPyBmdW5jdGlvbihzdHIpe3JldHVybiBzdHIudG9Mb3dlckNhc2UoKTt9IDogZnVuY3Rpb24oc3RyKXtyZXR1cm4gc3RyO307CiAgICAgIHZhciB0YXJnZXQgPSBxdWVyeS5zcGxpdCgiXG4iKTsKICAgICAgLy8gRGlmZmVyZW50IG1ldGhvZHMgZm9yIHNpbmdsZS1saW5lIGFuZCBtdWx0aS1saW5lIHF1ZXJpZXMKICAgICAgaWYgKHRhcmdldC5sZW5ndGggPT0gMSkgewogICAgICAgIGlmICghcXVlcnkubGVuZ3RoKSB7CiAgICAgICAgICAvLyBFbXB0eSBzdHJpbmcgd291bGQgbWF0Y2ggYW55dGhpbmcgYW5kIG5ldmVyIHByb2dyZXNzLCBzbwogICAgICAgICAgLy8gd2UgZGVmaW5lIGl0IHRvIG1hdGNoIG5vdGhpbmcgaW5zdGVhZC4KICAgICAgICAgIHRoaXMubWF0Y2hlcyA9IGZ1bmN0aW9uKCkge307CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMubWF0Y2hlcyA9IGZ1bmN0aW9uKHJldmVyc2UsIHBvcykgewogICAgICAgICAgICBpZiAocmV2ZXJzZSkgewogICAgICAgICAgICAgIHZhciBvcmlnID0gZG9jLmdldExpbmUocG9zLmxpbmUpLnNsaWNlKDAsIHBvcy5jaCksIGxpbmUgPSBmb2xkKG9yaWcpOwogICAgICAgICAgICAgIHZhciBtYXRjaCA9IGxpbmUubGFzdEluZGV4T2YocXVlcnkpOwogICAgICAgICAgICAgIGlmIChtYXRjaCA+IC0xKSB7CiAgICAgICAgICAgICAgICBtYXRjaCA9IGFkanVzdFBvcyhvcmlnLCBsaW5lLCBtYXRjaCk7CiAgICAgICAgICAgICAgICByZXR1cm4ge2Zyb206IFBvcyhwb3MubGluZSwgbWF0Y2gpLCB0bzogUG9zKHBvcy5saW5lLCBtYXRjaCArIG9yaWdRdWVyeS5sZW5ndGgpfTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICB2YXIgb3JpZyA9IGRvYy5nZXRMaW5lKHBvcy5saW5lKS5zbGljZShwb3MuY2gpLCBsaW5lID0gZm9sZChvcmlnKTsKICAgICAgICAgICAgICAgdmFyIG1hdGNoID0gbGluZS5pbmRleE9mKHF1ZXJ5KTsKICAgICAgICAgICAgICAgaWYgKG1hdGNoID4gLTEpIHsKICAgICAgICAgICAgICAgICBtYXRjaCA9IGFkanVzdFBvcyhvcmlnLCBsaW5lLCBtYXRjaCkgKyBwb3MuY2g7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHtmcm9tOiBQb3MocG9zLmxpbmUsIG1hdGNoKSwgdG86IFBvcyhwb3MubGluZSwgbWF0Y2ggKyBvcmlnUXVlcnkubGVuZ3RoKX07CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIG9yaWdUYXJnZXQgPSBvcmlnUXVlcnkuc3BsaXQoIlxuIik7CiAgICAgICAgdGhpcy5tYXRjaGVzID0gZnVuY3Rpb24ocmV2ZXJzZSwgcG9zKSB7CiAgICAgICAgICB2YXIgbGFzdCA9IHRhcmdldC5sZW5ndGggLSAxOwogICAgICAgICAgaWYgKHJldmVyc2UpIHsKICAgICAgICAgICAgaWYgKHBvcy5saW5lIC0gKHRhcmdldC5sZW5ndGggLSAxKSA8IGRvYy5maXJzdExpbmUoKSkgcmV0dXJuOwogICAgICAgICAgICBpZiAoZm9sZChkb2MuZ2V0TGluZShwb3MubGluZSkuc2xpY2UoMCwgb3JpZ1RhcmdldFtsYXN0XS5sZW5ndGgpKSAhPSB0YXJnZXRbdGFyZ2V0Lmxlbmd0aCAtIDFdKSByZXR1cm47CiAgICAgICAgICAgIHZhciB0byA9IFBvcyhwb3MubGluZSwgb3JpZ1RhcmdldFtsYXN0XS5sZW5ndGgpOwogICAgICAgICAgICBmb3IgKHZhciBsbiA9IHBvcy5saW5lIC0gMSwgaSA9IGxhc3QgLSAxOyBpID49IDE7IC0taSwgLS1sbikKICAgICAgICAgICAgICBpZiAodGFyZ2V0W2ldICE9IGZvbGQoZG9jLmdldExpbmUobG4pKSkgcmV0dXJuOwogICAgICAgICAgICB2YXIgbGluZSA9IGRvYy5nZXRMaW5lKGxuKSwgY3V0ID0gbGluZS5sZW5ndGggLSBvcmlnVGFyZ2V0WzBdLmxlbmd0aDsKICAgICAgICAgICAgaWYgKGZvbGQobGluZS5zbGljZShjdXQpKSAhPSB0YXJnZXRbMF0pIHJldHVybjsKICAgICAgICAgICAgcmV0dXJuIHtmcm9tOiBQb3MobG4sIGN1dCksIHRvOiB0b307CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAocG9zLmxpbmUgKyAodGFyZ2V0Lmxlbmd0aCAtIDEpID4gZG9jLmxhc3RMaW5lKCkpIHJldHVybjsKICAgICAgICAgICAgdmFyIGxpbmUgPSBkb2MuZ2V0TGluZShwb3MubGluZSksIGN1dCA9IGxpbmUubGVuZ3RoIC0gb3JpZ1RhcmdldFswXS5sZW5ndGg7CiAgICAgICAgICAgIGlmIChmb2xkKGxpbmUuc2xpY2UoY3V0KSkgIT0gdGFyZ2V0WzBdKSByZXR1cm47CiAgICAgICAgICAgIHZhciBmcm9tID0gUG9zKHBvcy5saW5lLCBjdXQpOwogICAgICAgICAgICBmb3IgKHZhciBsbiA9IHBvcy5saW5lICsgMSwgaSA9IDE7IGkgPCBsYXN0OyArK2ksICsrbG4pCiAgICAgICAgICAgICAgaWYgKHRhcmdldFtpXSAhPSBmb2xkKGRvYy5nZXRMaW5lKGxuKSkpIHJldHVybjsKICAgICAgICAgICAgaWYgKGZvbGQoZG9jLmdldExpbmUobG4pLnNsaWNlKDAsIG9yaWdUYXJnZXRbbGFzdF0ubGVuZ3RoKSkgIT0gdGFyZ2V0W2xhc3RdKSByZXR1cm47CiAgICAgICAgICAgIHJldHVybiB7ZnJvbTogZnJvbSwgdG86IFBvcyhsbiwgb3JpZ1RhcmdldFtsYXN0XS5sZW5ndGgpfTsKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICB9CiAgICB9CiAgfQoKICBTZWFyY2hDdXJzb3IucHJvdG90eXBlID0gewogICAgZmluZE5leHQ6IGZ1bmN0aW9uKCkge3JldHVybiB0aGlzLmZpbmQoZmFsc2UpO30sCiAgICBmaW5kUHJldmlvdXM6IGZ1bmN0aW9uKCkge3JldHVybiB0aGlzLmZpbmQodHJ1ZSk7fSwKCiAgICBmaW5kOiBmdW5jdGlvbihyZXZlcnNlKSB7CiAgICAgIHZhciBzZWxmID0gdGhpcywgcG9zID0gdGhpcy5kb2MuY2xpcFBvcyhyZXZlcnNlID8gdGhpcy5wb3MuZnJvbSA6IHRoaXMucG9zLnRvKTsKICAgICAgZnVuY3Rpb24gc2F2ZVBvc0FuZEZhaWwobGluZSkgewogICAgICAgIHZhciBwb3MgPSBQb3MobGluZSwgMCk7CiAgICAgICAgc2VsZi5wb3MgPSB7ZnJvbTogcG9zLCB0bzogcG9zfTsKICAgICAgICBzZWxmLmF0T2NjdXJyZW5jZSA9IGZhbHNlOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQoKICAgICAgZm9yICg7OykgewogICAgICAgIGlmICh0aGlzLnBvcyA9IHRoaXMubWF0Y2hlcyhyZXZlcnNlLCBwb3MpKSB7CiAgICAgICAgICB0aGlzLmF0T2NjdXJyZW5jZSA9IHRydWU7CiAgICAgICAgICByZXR1cm4gdGhpcy5wb3MubWF0Y2ggfHwgdHJ1ZTsKICAgICAgICB9CiAgICAgICAgaWYgKHJldmVyc2UpIHsKICAgICAgICAgIGlmICghcG9zLmxpbmUpIHJldHVybiBzYXZlUG9zQW5kRmFpbCgwKTsKICAgICAgICAgIHBvcyA9IFBvcyhwb3MubGluZS0xLCB0aGlzLmRvYy5nZXRMaW5lKHBvcy5saW5lLTEpLmxlbmd0aCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgdmFyIG1heExpbmUgPSB0aGlzLmRvYy5saW5lQ291bnQoKTsKICAgICAgICAgIGlmIChwb3MubGluZSA9PSBtYXhMaW5lIC0gMSkgcmV0dXJuIHNhdmVQb3NBbmRGYWlsKG1heExpbmUpOwogICAgICAgICAgcG9zID0gUG9zKHBvcy5saW5lICsgMSwgMCk7CiAgICAgICAgfQogICAgICB9CiAgICB9LAoKICAgIGZyb206IGZ1bmN0aW9uKCkge2lmICh0aGlzLmF0T2NjdXJyZW5jZSkgcmV0dXJuIHRoaXMucG9zLmZyb207fSwKICAgIHRvOiBmdW5jdGlvbigpIHtpZiAodGhpcy5hdE9jY3VycmVuY2UpIHJldHVybiB0aGlzLnBvcy50bzt9LAoKICAgIHJlcGxhY2U6IGZ1bmN0aW9uKG5ld1RleHQpIHsKICAgICAgaWYgKCF0aGlzLmF0T2NjdXJyZW5jZSkgcmV0dXJuOwogICAgICB2YXIgbGluZXMgPSBDb2RlTWlycm9yLnNwbGl0TGluZXMobmV3VGV4dCk7CiAgICAgIHRoaXMuZG9jLnJlcGxhY2VSYW5nZShsaW5lcywgdGhpcy5wb3MuZnJvbSwgdGhpcy5wb3MudG8pOwogICAgICB0aGlzLnBvcy50byA9IFBvcyh0aGlzLnBvcy5mcm9tLmxpbmUgKyBsaW5lcy5sZW5ndGggLSAxLAogICAgICAgICAgICAgICAgICAgICAgICBsaW5lc1tsaW5lcy5sZW5ndGggLSAxXS5sZW5ndGggKyAobGluZXMubGVuZ3RoID09IDEgPyB0aGlzLnBvcy5mcm9tLmNoIDogMCkpOwogICAgfQogIH07CgogIC8vIE1hcHMgYSBwb3NpdGlvbiBpbiBhIGNhc2UtZm9sZGVkIGxpbmUgYmFjayB0byBhIHBvc2l0aW9uIGluIHRoZSBvcmlnaW5hbCBsaW5lCiAgLy8gKGNvbXBlbnNhdGluZyBmb3IgY29kZXBvaW50cyBpbmNyZWFzaW5nIGluIG51bWJlciBkdXJpbmcgZm9sZGluZykKICBmdW5jdGlvbiBhZGp1c3RQb3Mob3JpZywgZm9sZGVkLCBwb3MpIHsKICAgIGlmIChvcmlnLmxlbmd0aCA9PSBmb2xkZWQubGVuZ3RoKSByZXR1cm4gcG9zOwogICAgZm9yICh2YXIgcG9zMSA9IE1hdGgubWluKHBvcywgb3JpZy5sZW5ndGgpOzspIHsKICAgICAgdmFyIGxlbjEgPSBvcmlnLnNsaWNlKDAsIHBvczEpLnRvTG93ZXJDYXNlKCkubGVuZ3RoOwogICAgICBpZiAobGVuMSA8IHBvcykgKytwb3MxOwogICAgICBlbHNlIGlmIChsZW4xID4gcG9zKSAtLXBvczE7CiAgICAgIGVsc2UgcmV0dXJuIHBvczE7CiAgICB9CiAgfQoKICBDb2RlTWlycm9yLmRlZmluZUV4dGVuc2lvbigiZ2V0U2VhcmNoQ3Vyc29yIiwgZnVuY3Rpb24ocXVlcnksIHBvcywgY2FzZUZvbGQpIHsKICAgIHJldHVybiBuZXcgU2VhcmNoQ3Vyc29yKHRoaXMuZG9jLCBxdWVyeSwgcG9zLCBjYXNlRm9sZCk7CiAgfSk7CiAgQ29kZU1pcnJvci5kZWZpbmVEb2NFeHRlbnNpb24oImdldFNlYXJjaEN1cnNvciIsIGZ1bmN0aW9uKHF1ZXJ5LCBwb3MsIGNhc2VGb2xkKSB7CiAgICByZXR1cm4gbmV3IFNlYXJjaEN1cnNvcih0aGlzLCBxdWVyeSwgcG9zLCBjYXNlRm9sZCk7CiAgfSk7CgogIENvZGVNaXJyb3IuZGVmaW5lRXh0ZW5zaW9uKCJzZWxlY3RNYXRjaGVzIiwgZnVuY3Rpb24ocXVlcnksIGNhc2VGb2xkKSB7CiAgICB2YXIgcmFuZ2VzID0gW10sIG5leHQ7CiAgICB2YXIgY3VyID0gdGhpcy5nZXRTZWFyY2hDdXJzb3IocXVlcnksIHRoaXMuZ2V0Q3Vyc29yKCJmcm9tIiksIGNhc2VGb2xkKTsKICAgIHdoaWxlIChuZXh0ID0gY3VyLmZpbmROZXh0KCkpIHsKICAgICAgaWYgKENvZGVNaXJyb3IuY21wUG9zKGN1ci50bygpLCB0aGlzLmdldEN1cnNvcigidG8iKSkgPiAwKSBicmVhazsKICAgICAgcmFuZ2VzLnB1c2goe2FuY2hvcjogY3VyLmZyb20oKSwgaGVhZDogY3VyLnRvKCl9KTsKICAgIH0KICAgIGlmIChyYW5nZXMubGVuZ3RoKQogICAgICB0aGlzLnNldFNlbGVjdGlvbnMocmFuZ2VzLCAwKTsKICB9KTsKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/selection/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/selection/active-line.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovLyBCZWNhdXNlIHNvbWV0aW1lcyB5b3UgbmVlZCB0byBzdHlsZSB0aGUgY3Vyc29yJ3MgbGluZS4KLy8KLy8gQWRkcyBhbiBvcHRpb24gJ3N0eWxlQWN0aXZlTGluZScgd2hpY2gsIHdoZW4gZW5hYmxlZCwgZ2l2ZXMgdGhlCi8vIGFjdGl2ZSBsaW5lJ3Mgd3JhcHBpbmcgPGRpdj4gdGhlIENTUyBjbGFzcyAiQ29kZU1pcnJvci1hY3RpdmVsaW5lIiwKLy8gYW5kIGdpdmVzIGl0cyBiYWNrZ3JvdW5kIDxkaXY+IHRoZSBjbGFzcyAiQ29kZU1pcnJvci1hY3RpdmVsaW5lLWJhY2tncm91bmQiLgoKKGZ1bmN0aW9uKG1vZCkgewogIGlmICh0eXBlb2YgZXhwb3J0cyA9PSAib2JqZWN0IiAmJiB0eXBlb2YgbW9kdWxlID09ICJvYmplY3QiKSAvLyBDb21tb25KUwogICAgbW9kKHJlcXVpcmUoIi4uLy4uL2xpYi9jb2RlbWlycm9yIikpOwogIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kKSAvLyBBTUQKICAgIGRlZmluZShbIi4uLy4uL2xpYi9jb2RlbWlycm9yIl0sIG1vZCk7CiAgZWxzZSAvLyBQbGFpbiBicm93c2VyIGVudgogICAgbW9kKENvZGVNaXJyb3IpOwp9KShmdW5jdGlvbihDb2RlTWlycm9yKSB7CiAgInVzZSBzdHJpY3QiOwogIHZhciBXUkFQX0NMQVNTID0gIkNvZGVNaXJyb3ItYWN0aXZlbGluZSI7CiAgdmFyIEJBQ0tfQ0xBU1MgPSAiQ29kZU1pcnJvci1hY3RpdmVsaW5lLWJhY2tncm91bmQiOwoKICBDb2RlTWlycm9yLmRlZmluZU9wdGlvbigic3R5bGVBY3RpdmVMaW5lIiwgZmFsc2UsIGZ1bmN0aW9uKGNtLCB2YWwsIG9sZCkgewogICAgdmFyIHByZXYgPSBvbGQgJiYgb2xkICE9IENvZGVNaXJyb3IuSW5pdDsKICAgIGlmICh2YWwgJiYgIXByZXYpIHsKICAgICAgY20uc3RhdGUuYWN0aXZlTGluZXMgPSBbXTsKICAgICAgdXBkYXRlQWN0aXZlTGluZXMoY20sIGNtLmxpc3RTZWxlY3Rpb25zKCkpOwogICAgICBjbS5vbigiYmVmb3JlU2VsZWN0aW9uQ2hhbmdlIiwgc2VsZWN0aW9uQ2hhbmdlKTsKICAgIH0gZWxzZSBpZiAoIXZhbCAmJiBwcmV2KSB7CiAgICAgIGNtLm9mZigiYmVmb3JlU2VsZWN0aW9uQ2hhbmdlIiwgc2VsZWN0aW9uQ2hhbmdlKTsKICAgICAgY2xlYXJBY3RpdmVMaW5lcyhjbSk7CiAgICAgIGRlbGV0ZSBjbS5zdGF0ZS5hY3RpdmVMaW5lczsKICAgIH0KICB9KTsKCiAgZnVuY3Rpb24gY2xlYXJBY3RpdmVMaW5lcyhjbSkgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbS5zdGF0ZS5hY3RpdmVMaW5lcy5sZW5ndGg7IGkrKykgewogICAgICBjbS5yZW1vdmVMaW5lQ2xhc3MoY20uc3RhdGUuYWN0aXZlTGluZXNbaV0sICJ3cmFwIiwgV1JBUF9DTEFTUyk7CiAgICAgIGNtLnJlbW92ZUxpbmVDbGFzcyhjbS5zdGF0ZS5hY3RpdmVMaW5lc1tpXSwgImJhY2tncm91bmQiLCBCQUNLX0NMQVNTKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHNhbWVBcnJheShhLCBiKSB7CiAgICBpZiAoYS5sZW5ndGggIT0gYi5sZW5ndGgpIHJldHVybiBmYWxzZTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYS5sZW5ndGg7IGkrKykKICAgICAgaWYgKGFbaV0gIT0gYltpXSkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIHRydWU7CiAgfQoKICBmdW5jdGlvbiB1cGRhdGVBY3RpdmVMaW5lcyhjbSwgcmFuZ2VzKSB7CiAgICB2YXIgYWN0aXZlID0gW107CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJhbmdlcy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgcmFuZ2UgPSByYW5nZXNbaV07CiAgICAgIGlmICghcmFuZ2UuZW1wdHkoKSkgY29udGludWU7CiAgICAgIHZhciBsaW5lID0gY20uZ2V0TGluZUhhbmRsZVZpc3VhbFN0YXJ0KHJhbmdlLmhlYWQubGluZSk7CiAgICAgIGlmIChhY3RpdmVbYWN0aXZlLmxlbmd0aCAtIDFdICE9IGxpbmUpIGFjdGl2ZS5wdXNoKGxpbmUpOwogICAgfQogICAgaWYgKHNhbWVBcnJheShjbS5zdGF0ZS5hY3RpdmVMaW5lcywgYWN0aXZlKSkgcmV0dXJuOwogICAgY20ub3BlcmF0aW9uKGZ1bmN0aW9uKCkgewogICAgICBjbGVhckFjdGl2ZUxpbmVzKGNtKTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhY3RpdmUubGVuZ3RoOyBpKyspIHsKICAgICAgICBjbS5hZGRMaW5lQ2xhc3MoYWN0aXZlW2ldLCAid3JhcCIsIFdSQVBfQ0xBU1MpOwogICAgICAgIGNtLmFkZExpbmVDbGFzcyhhY3RpdmVbaV0sICJiYWNrZ3JvdW5kIiwgQkFDS19DTEFTUyk7CiAgICAgIH0KICAgICAgY20uc3RhdGUuYWN0aXZlTGluZXMgPSBhY3RpdmU7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIHNlbGVjdGlvbkNoYW5nZShjbSwgc2VsKSB7CiAgICB1cGRhdGVBY3RpdmVMaW5lcyhjbSwgc2VsLnJhbmdlcyk7CiAgfQp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/selection/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCEtLSBEVU1NWSBIVE1MIEZJTEUgLS0+]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/selection/mark-selection.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovLyBCZWNhdXNlIHNvbWV0aW1lcyB5b3UgbmVlZCB0byBtYXJrIHRoZSBzZWxlY3RlZCAqdGV4dCouCi8vCi8vIEFkZHMgYW4gb3B0aW9uICdzdHlsZVNlbGVjdGVkVGV4dCcgd2hpY2gsIHdoZW4gZW5hYmxlZCwgZ2l2ZXMKLy8gc2VsZWN0ZWQgdGV4dCB0aGUgQ1NTIGNsYXNzIGdpdmVuIGFzIG9wdGlvbiB2YWx1ZSwgb3IKLy8gIkNvZGVNaXJyb3Itc2VsZWN0ZWR0ZXh0IiB3aGVuIHRoZSB2YWx1ZSBpcyBub3QgYSBzdHJpbmcuCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CgogIENvZGVNaXJyb3IuZGVmaW5lT3B0aW9uKCJzdHlsZVNlbGVjdGVkVGV4dCIsIGZhbHNlLCBmdW5jdGlvbihjbSwgdmFsLCBvbGQpIHsKICAgIHZhciBwcmV2ID0gb2xkICYmIG9sZCAhPSBDb2RlTWlycm9yLkluaXQ7CiAgICBpZiAodmFsICYmICFwcmV2KSB7CiAgICAgIGNtLnN0YXRlLm1hcmtlZFNlbGVjdGlvbiA9IFtdOwogICAgICBjbS5zdGF0ZS5tYXJrZWRTZWxlY3Rpb25TdHlsZSA9IHR5cGVvZiB2YWwgPT0gInN0cmluZyIgPyB2YWwgOiAiQ29kZU1pcnJvci1zZWxlY3RlZHRleHQiOwogICAgICByZXNldChjbSk7CiAgICAgIGNtLm9uKCJjdXJzb3JBY3Rpdml0eSIsIG9uQ3Vyc29yQWN0aXZpdHkpOwogICAgICBjbS5vbigiY2hhbmdlIiwgb25DaGFuZ2UpOwogICAgfSBlbHNlIGlmICghdmFsICYmIHByZXYpIHsKICAgICAgY20ub2ZmKCJjdXJzb3JBY3Rpdml0eSIsIG9uQ3Vyc29yQWN0aXZpdHkpOwogICAgICBjbS5vZmYoImNoYW5nZSIsIG9uQ2hhbmdlKTsKICAgICAgY2xlYXIoY20pOwogICAgICBjbS5zdGF0ZS5tYXJrZWRTZWxlY3Rpb24gPSBjbS5zdGF0ZS5tYXJrZWRTZWxlY3Rpb25TdHlsZSA9IG51bGw7CiAgICB9CiAgfSk7CgogIGZ1bmN0aW9uIG9uQ3Vyc29yQWN0aXZpdHkoY20pIHsKICAgIGNtLm9wZXJhdGlvbihmdW5jdGlvbigpIHsgdXBkYXRlKGNtKTsgfSk7CiAgfQoKICBmdW5jdGlvbiBvbkNoYW5nZShjbSkgewogICAgaWYgKGNtLnN0YXRlLm1hcmtlZFNlbGVjdGlvbi5sZW5ndGgpCiAgICAgIGNtLm9wZXJhdGlvbihmdW5jdGlvbigpIHsgY2xlYXIoY20pOyB9KTsKICB9CgogIHZhciBDSFVOS19TSVpFID0gODsKICB2YXIgUG9zID0gQ29kZU1pcnJvci5Qb3M7CiAgdmFyIGNtcCA9IENvZGVNaXJyb3IuY21wUG9zOwoKICBmdW5jdGlvbiBjb3ZlclJhbmdlKGNtLCBmcm9tLCB0bywgYWRkQXQpIHsKICAgIGlmIChjbXAoZnJvbSwgdG8pID09IDApIHJldHVybjsKICAgIHZhciBhcnJheSA9IGNtLnN0YXRlLm1hcmtlZFNlbGVjdGlvbjsKICAgIHZhciBjbHMgPSBjbS5zdGF0ZS5tYXJrZWRTZWxlY3Rpb25TdHlsZTsKICAgIGZvciAodmFyIGxpbmUgPSBmcm9tLmxpbmU7OykgewogICAgICB2YXIgc3RhcnQgPSBsaW5lID09IGZyb20ubGluZSA/IGZyb20gOiBQb3MobGluZSwgMCk7CiAgICAgIHZhciBlbmRMaW5lID0gbGluZSArIENIVU5LX1NJWkUsIGF0RW5kID0gZW5kTGluZSA+PSB0by5saW5lOwogICAgICB2YXIgZW5kID0gYXRFbmQgPyB0byA6IFBvcyhlbmRMaW5lLCAwKTsKICAgICAgdmFyIG1hcmsgPSBjbS5tYXJrVGV4dChzdGFydCwgZW5kLCB7Y2xhc3NOYW1lOiBjbHN9KTsKICAgICAgaWYgKGFkZEF0ID09IG51bGwpIGFycmF5LnB1c2gobWFyayk7CiAgICAgIGVsc2UgYXJyYXkuc3BsaWNlKGFkZEF0KyssIDAsIG1hcmspOwogICAgICBpZiAoYXRFbmQpIGJyZWFrOwogICAgICBsaW5lID0gZW5kTGluZTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGNsZWFyKGNtKSB7CiAgICB2YXIgYXJyYXkgPSBjbS5zdGF0ZS5tYXJrZWRTZWxlY3Rpb247CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgKytpKSBhcnJheVtpXS5jbGVhcigpOwogICAgYXJyYXkubGVuZ3RoID0gMDsKICB9CgogIGZ1bmN0aW9uIHJlc2V0KGNtKSB7CiAgICBjbGVhcihjbSk7CiAgICB2YXIgcmFuZ2VzID0gY20ubGlzdFNlbGVjdGlvbnMoKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSsrKQogICAgICBjb3ZlclJhbmdlKGNtLCByYW5nZXNbaV0uZnJvbSgpLCByYW5nZXNbaV0udG8oKSk7CiAgfQoKICBmdW5jdGlvbiB1cGRhdGUoY20pIHsKICAgIGlmICghY20uc29tZXRoaW5nU2VsZWN0ZWQoKSkgcmV0dXJuIGNsZWFyKGNtKTsKICAgIGlmIChjbS5saXN0U2VsZWN0aW9ucygpLmxlbmd0aCA+IDEpIHJldHVybiByZXNldChjbSk7CgogICAgdmFyIGZyb20gPSBjbS5nZXRDdXJzb3IoInN0YXJ0IiksIHRvID0gY20uZ2V0Q3Vyc29yKCJlbmQiKTsKCiAgICB2YXIgYXJyYXkgPSBjbS5zdGF0ZS5tYXJrZWRTZWxlY3Rpb247CiAgICBpZiAoIWFycmF5Lmxlbmd0aCkgcmV0dXJuIGNvdmVyUmFuZ2UoY20sIGZyb20sIHRvKTsKCiAgICB2YXIgY292ZXJTdGFydCA9IGFycmF5WzBdLmZpbmQoKSwgY292ZXJFbmQgPSBhcnJheVthcnJheS5sZW5ndGggLSAxXS5maW5kKCk7CiAgICBpZiAoIWNvdmVyU3RhcnQgfHwgIWNvdmVyRW5kIHx8IHRvLmxpbmUgLSBmcm9tLmxpbmUgPCBDSFVOS19TSVpFIHx8CiAgICAgICAgY21wKGZyb20sIGNvdmVyRW5kLnRvKSA+PSAwIHx8IGNtcCh0bywgY292ZXJTdGFydC5mcm9tKSA8PSAwKQogICAgICByZXR1cm4gcmVzZXQoY20pOwoKICAgIHdoaWxlIChjbXAoZnJvbSwgY292ZXJTdGFydC5mcm9tKSA+IDApIHsKICAgICAgYXJyYXkuc2hpZnQoKS5jbGVhcigpOwogICAgICBjb3ZlclN0YXJ0ID0gYXJyYXlbMF0uZmluZCgpOwogICAgfQogICAgaWYgKGNtcChmcm9tLCBjb3ZlclN0YXJ0LmZyb20pIDwgMCkgewogICAgICBpZiAoY292ZXJTdGFydC50by5saW5lIC0gZnJvbS5saW5lIDwgQ0hVTktfU0laRSkgewogICAgICAgIGFycmF5LnNoaWZ0KCkuY2xlYXIoKTsKICAgICAgICBjb3ZlclJhbmdlKGNtLCBmcm9tLCBjb3ZlclN0YXJ0LnRvLCAwKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb3ZlclJhbmdlKGNtLCBmcm9tLCBjb3ZlclN0YXJ0LmZyb20sIDApOwogICAgICB9CiAgICB9CgogICAgd2hpbGUgKGNtcCh0bywgY292ZXJFbmQudG8pIDwgMCkgewogICAgICBhcnJheS5wb3AoKS5jbGVhcigpOwogICAgICBjb3ZlckVuZCA9IGFycmF5W2FycmF5Lmxlbmd0aCAtIDFdLmZpbmQoKTsKICAgIH0KICAgIGlmIChjbXAodG8sIGNvdmVyRW5kLnRvKSA+IDApIHsKICAgICAgaWYgKHRvLmxpbmUgLSBjb3ZlckVuZC5mcm9tLmxpbmUgPCBDSFVOS19TSVpFKSB7CiAgICAgICAgYXJyYXkucG9wKCkuY2xlYXIoKTsKICAgICAgICBjb3ZlclJhbmdlKGNtLCBjb3ZlckVuZC5mcm9tLCB0byk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY292ZXJSYW5nZShjbSwgY292ZXJFbmQudG8sIHRvKTsKICAgICAgfQogICAgfQogIH0KfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/tern/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/tern/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCEtLSBEVU1NWSBIVE1MIEZJTEUgLS0+]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/tern/tern.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LkNvZGVNaXJyb3ItVGVybi1jb21wbGV0aW9uIHsKICBwYWRkaW5nLWxlZnQ6IDIycHg7CiAgcG9zaXRpb246IHJlbGF0aXZlOwp9Ci5Db2RlTWlycm9yLVRlcm4tY29tcGxldGlvbjpiZWZvcmUgewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICBsZWZ0OiAycHg7CiAgYm90dG9tOiAycHg7CiAgYm9yZGVyLXJhZGl1czogNTAlOwogIGZvbnQtc2l6ZTogMTJweDsKICBmb250LXdlaWdodDogYm9sZDsKICBoZWlnaHQ6IDE1cHg7CiAgd2lkdGg6IDE1cHg7CiAgbGluZS1oZWlnaHQ6IDE2cHg7CiAgdGV4dC1hbGlnbjogY2VudGVyOwogIGNvbG9yOiB3aGl0ZTsKICAtbW96LWJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgYm94LXNpemluZzogYm9yZGVyLWJveDsKfQouQ29kZU1pcnJvci1UZXJuLWNvbXBsZXRpb24tdW5rbm93bjpiZWZvcmUgewogIGNvbnRlbnQ6ICI/IjsKICBiYWNrZ3JvdW5kOiAjNGJiOwp9Ci5Db2RlTWlycm9yLVRlcm4tY29tcGxldGlvbi1vYmplY3Q6YmVmb3JlIHsKICBjb250ZW50OiAiTyI7CiAgYmFja2dyb3VuZDogIzc3YzsKfQouQ29kZU1pcnJvci1UZXJuLWNvbXBsZXRpb24tZm46YmVmb3JlIHsKICBjb250ZW50OiAiRiI7CiAgYmFja2dyb3VuZDogIzdjNzsKfQouQ29kZU1pcnJvci1UZXJuLWNvbXBsZXRpb24tYXJyYXk6YmVmb3JlIHsKICBjb250ZW50OiAiQSI7CiAgYmFja2dyb3VuZDogI2M2NjsKfQouQ29kZU1pcnJvci1UZXJuLWNvbXBsZXRpb24tbnVtYmVyOmJlZm9yZSB7CiAgY29udGVudDogIjEiOwogIGJhY2tncm91bmQ6ICM5OTk7Cn0KLkNvZGVNaXJyb3ItVGVybi1jb21wbGV0aW9uLXN0cmluZzpiZWZvcmUgewogIGNvbnRlbnQ6ICJTIjsKICBiYWNrZ3JvdW5kOiAjOTk5Owp9Ci5Db2RlTWlycm9yLVRlcm4tY29tcGxldGlvbi1ib29sOmJlZm9yZSB7CiAgY29udGVudDogIkIiOwogIGJhY2tncm91bmQ6ICM5OTk7Cn0KCi5Db2RlTWlycm9yLVRlcm4tY29tcGxldGlvbi1ndWVzcyB7CiAgY29sb3I6ICM5OTk7Cn0KCi5Db2RlTWlycm9yLVRlcm4tdG9vbHRpcCB7CiAgYm9yZGVyOiAxcHggc29saWQgc2lsdmVyOwogIGJvcmRlci1yYWRpdXM6IDNweDsKICBjb2xvcjogIzQ0NDsKICBwYWRkaW5nOiAycHggNXB4OwogIGZvbnQtc2l6ZTogOTAlOwogIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7CiAgYmFja2dyb3VuZC1jb2xvcjogd2hpdGU7CiAgd2hpdGUtc3BhY2U6IHByZS13cmFwOwoKICBtYXgtd2lkdGg6IDQwZW07CiAgcG9zaXRpb246IGFic29sdXRlOwogIHotaW5kZXg6IDEwOwogIC13ZWJraXQtYm94LXNoYWRvdzogMnB4IDNweCA1cHggcmdiYSgwLDAsMCwuMik7CiAgLW1vei1ib3gtc2hhZG93OiAycHggM3B4IDVweCByZ2JhKDAsMCwwLC4yKTsKICBib3gtc2hhZG93OiAycHggM3B4IDVweCByZ2JhKDAsMCwwLC4yKTsKCiAgdHJhbnNpdGlvbjogb3BhY2l0eSAxczsKICAtbW96LXRyYW5zaXRpb246IG9wYWNpdHkgMXM7CiAgLXdlYmtpdC10cmFuc2l0aW9uOiBvcGFjaXR5IDFzOwogIC1vLXRyYW5zaXRpb246IG9wYWNpdHkgMXM7CiAgLW1zLXRyYW5zaXRpb246IG9wYWNpdHkgMXM7Cn0KCi5Db2RlTWlycm9yLVRlcm4taGludC1kb2MgewogIG1heC13aWR0aDogMjVlbTsKICBtYXJnaW4tdG9wOiAtM3B4Owp9CgouQ29kZU1pcnJvci1UZXJuLWZuYW1lIHsgY29sb3I6IGJsYWNrOyB9Ci5Db2RlTWlycm9yLVRlcm4tZmFyZyB7IGNvbG9yOiAjNzBhOyB9Ci5Db2RlTWlycm9yLVRlcm4tZmFyZy1jdXJyZW50IHsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IH0KLkNvZGVNaXJyb3ItVGVybi10eXBlIHsgY29sb3I6ICMwN2M7IH0KLkNvZGVNaXJyb3ItVGVybi1maGludC1ndWVzcyB7IG9wYWNpdHk6IC43OyB9Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/tern/tern.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovLyBHbHVlIGNvZGUgYmV0d2VlbiBDb2RlTWlycm9yIGFuZCBUZXJuLgovLwovLyBDcmVhdGUgYSBDb2RlTWlycm9yLlRlcm5TZXJ2ZXIgdG8gd3JhcCBhbiBhY3R1YWwgVGVybiBzZXJ2ZXIsCi8vIHJlZ2lzdGVyIG9wZW4gZG9jdW1lbnRzIChDb2RlTWlycm9yLkRvYyBpbnN0YW5jZXMpIHdpdGggaXQsIGFuZAovLyBjYWxsIGl0cyBtZXRob2RzIHRvIGFjdGl2YXRlIHRoZSBhc3Npc3RpbmcgZnVuY3Rpb25zIHRoYXQgVGVybgovLyBwcm92aWRlcy4KLy8KLy8gT3B0aW9ucyBzdXBwb3J0ZWQgKGFsbCBvcHRpb25hbCk6Ci8vICogZGVmczogQW4gYXJyYXkgb2YgSlNPTiBkZWZpbml0aW9uIGRhdGEgc3RydWN0dXJlcy4KLy8gKiBwbHVnaW5zOiBBbiBvYmplY3QgbWFwcGluZyBwbHVnaW4gbmFtZXMgdG8gY29uZmlndXJhdGlvbgovLyAgIG9wdGlvbnMuCi8vICogZ2V0RmlsZTogQSBmdW5jdGlvbihuYW1lLCBjKSB0aGF0IGNhbiBiZSB1c2VkIHRvIGFjY2VzcyBmaWxlcyBpbgovLyAgIHRoZSBwcm9qZWN0IHRoYXQgaGF2ZW4ndCBiZWVuIGxvYWRlZCB5ZXQuIFNpbXBseSBkbyBjKG51bGwpIHRvCi8vICAgaW5kaWNhdGUgdGhhdCBhIGZpbGUgaXMgbm90IGF2YWlsYWJsZS4KLy8gKiBmaWxlRmlsdGVyOiBBIGZ1bmN0aW9uKHZhbHVlLCBkb2NOYW1lLCBkb2MpIHRoYXQgd2lsbCBiZSBhcHBsaWVkCi8vICAgdG8gZG9jdW1lbnRzIGJlZm9yZSBwYXNzaW5nIHRoZW0gb24gdG8gVGVybi4KLy8gKiBzd2l0Y2hUb0RvYzogQSBmdW5jdGlvbihuYW1lLCBkb2MpIHRoYXQgc2hvdWxkLCB3aGVuIHByb3ZpZGluZyBhCi8vICAgbXVsdGktZmlsZSB2aWV3LCBzd2l0Y2ggdGhlIHZpZXcgb3IgZm9jdXMgdG8gdGhlIG5hbWVkIGZpbGUuCi8vICogc2hvd0Vycm9yOiBBIGZ1bmN0aW9uKGVkaXRvciwgbWVzc2FnZSkgdGhhdCBjYW4gYmUgdXNlZCB0bwovLyAgIG92ZXJyaWRlIHRoZSB3YXkgZXJyb3JzIGFyZSBkaXNwbGF5ZWQuCi8vICogY29tcGxldGlvblRpcDogQ3VzdG9taXplIHRoZSBjb250ZW50IGluIHRvb2x0aXBzIGZvciBjb21wbGV0aW9ucy4KLy8gICBJcyBwYXNzZWQgYSBzaW5nbGUgYXJndW1lbnTigJR0aGUgY29tcGxldGlvbidzIGRhdGEgYXMgcmV0dXJuZWQgYnkKLy8gICBUZXJu4oCUYW5kIG1heSByZXR1cm4gYSBzdHJpbmcsIERPTSBub2RlLCBvciBudWxsIHRvIGluZGljYXRlIHRoYXQKLy8gICBubyB0aXAgc2hvdWxkIGJlIHNob3duLiBCeSBkZWZhdWx0IHRoZSBkb2NzdHJpbmcgaXMgc2hvd24uCi8vICogdHlwZVRpcDogTGlrZSBjb21wbGV0aW9uVGlwLCBidXQgZm9yIHRoZSB0b29sdGlwcyBzaG93biBmb3IgdHlwZQovLyAgIHF1ZXJpZXMuCi8vICogcmVzcG9uc2VGaWx0ZXI6IEEgZnVuY3Rpb24oZG9jLCBxdWVyeSwgcmVxdWVzdCwgZXJyb3IsIGRhdGEpIHRoYXQKLy8gICB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIFRlcm4gcmVzcG9uc2VzIGJlZm9yZSB0cmVhdGluZyB0aGVtCi8vCi8vCi8vIEl0IGlzIHBvc3NpYmxlIHRvIHJ1biB0aGUgVGVybiBzZXJ2ZXIgaW4gYSB3ZWIgd29ya2VyIGJ5IHNwZWNpZnlpbmcKLy8gdGhlc2UgYWRkaXRpb25hbCBvcHRpb25zOgovLyAqIHVzZVdvcmtlcjogU2V0IHRvIHRydWUgdG8gZW5hYmxlIHdlYiB3b3JrZXIgbW9kZS4gWW91J2xsIHByb2JhYmx5Ci8vICAgd2FudCB0byBmZWF0dXJlIGRldGVjdCB0aGUgYWN0dWFsIHZhbHVlIHlvdSB1c2UgaGVyZSwgZm9yIGV4YW1wbGUKLy8gICAhIXdpbmRvdy5Xb3JrZXIuCi8vICogd29ya2VyU2NyaXB0OiBUaGUgbWFpbiBzY3JpcHQgb2YgdGhlIHdvcmtlci4gUG9pbnQgdGhpcyB0bwovLyAgIHdoZXJldmVyIHlvdSBhcmUgaG9zdGluZyB3b3JrZXIuanMgZnJvbSB0aGlzIGRpcmVjdG9yeS4KLy8gKiB3b3JrZXJEZXBzOiBBbiBhcnJheSBvZiBwYXRocyBwb2ludGluZyAocmVsYXRpdmUgdG8gd29ya2VyU2NyaXB0KQovLyAgIHRvIHRoZSBBY29ybiBhbmQgVGVybiBsaWJyYXJpZXMgYW5kIGFueSBUZXJuIHBsdWdpbnMgeW91IHdhbnQgdG8KLy8gICBsb2FkLiBPciwgaWYgeW91IG1pbmlmaWVkIHRob3NlIGludG8gYSBzaW5nbGUgc2NyaXB0IGFuZCBpbmNsdWRlZAovLyAgIHRoZW0gaW4gdGhlIHdvcmtlclNjcmlwdCwgc2ltcGx5IGxlYXZlIHRoaXMgdW5kZWZpbmVkLgoKKGZ1bmN0aW9uKG1vZCkgewogIGlmICh0eXBlb2YgZXhwb3J0cyA9PSAib2JqZWN0IiAmJiB0eXBlb2YgbW9kdWxlID09ICJvYmplY3QiKSAvLyBDb21tb25KUwogICAgbW9kKHJlcXVpcmUoIi4uLy4uL2xpYi9jb2RlbWlycm9yIikpOwogIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kKSAvLyBBTUQKICAgIGRlZmluZShbIi4uLy4uL2xpYi9jb2RlbWlycm9yIl0sIG1vZCk7CiAgZWxzZSAvLyBQbGFpbiBicm93c2VyIGVudgogICAgbW9kKENvZGVNaXJyb3IpOwp9KShmdW5jdGlvbihDb2RlTWlycm9yKSB7CiAgInVzZSBzdHJpY3QiOwogIC8vIGRlY2xhcmUgZ2xvYmFsOiB0ZXJuCgogIENvZGVNaXJyb3IuVGVyblNlcnZlciA9IGZ1bmN0aW9uKG9wdGlvbnMpIHsKICAgIHZhciBzZWxmID0gdGhpczsKICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge307CiAgICB2YXIgcGx1Z2lucyA9IHRoaXMub3B0aW9ucy5wbHVnaW5zIHx8ICh0aGlzLm9wdGlvbnMucGx1Z2lucyA9IHt9KTsKICAgIGlmICghcGx1Z2lucy5kb2NfY29tbWVudCkgcGx1Z2lucy5kb2NfY29tbWVudCA9IHRydWU7CiAgICBpZiAodGhpcy5vcHRpb25zLnVzZVdvcmtlcikgewogICAgICB0aGlzLnNlcnZlciA9IG5ldyBXb3JrZXJTZXJ2ZXIodGhpcyk7CiAgICB9IGVsc2UgewogICAgICB0aGlzLnNlcnZlciA9IG5ldyB0ZXJuLlNlcnZlcih7CiAgICAgICAgZ2V0RmlsZTogZnVuY3Rpb24obmFtZSwgYykgeyByZXR1cm4gZ2V0RmlsZShzZWxmLCBuYW1lLCBjKTsgfSwKICAgICAgICBhc3luYzogdHJ1ZSwKICAgICAgICBkZWZzOiB0aGlzLm9wdGlvbnMuZGVmcyB8fCBbXSwKICAgICAgICBwbHVnaW5zOiBwbHVnaW5zCiAgICAgIH0pOwogICAgfQogICAgdGhpcy5kb2NzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIHRoaXMudHJhY2tDaGFuZ2UgPSBmdW5jdGlvbihkb2MsIGNoYW5nZSkgeyB0cmFja0NoYW5nZShzZWxmLCBkb2MsIGNoYW5nZSk7IH07CgogICAgdGhpcy5jYWNoZWRBcmdIaW50cyA9IG51bGw7CiAgICB0aGlzLmFjdGl2ZUFyZ0hpbnRzID0gbnVsbDsKICAgIHRoaXMuanVtcFN0YWNrID0gW107CgogICAgdGhpcy5nZXRIaW50ID0gZnVuY3Rpb24oY20sIGMpIHsgcmV0dXJuIGhpbnQoc2VsZiwgY20sIGMpOyB9OwogICAgdGhpcy5nZXRIaW50LmFzeW5jID0gdHJ1ZTsKICB9OwoKICBDb2RlTWlycm9yLlRlcm5TZXJ2ZXIucHJvdG90eXBlID0gewogICAgYWRkRG9jOiBmdW5jdGlvbihuYW1lLCBkb2MpIHsKICAgICAgdmFyIGRhdGEgPSB7ZG9jOiBkb2MsIG5hbWU6IG5hbWUsIGNoYW5nZWQ6IG51bGx9OwogICAgICB0aGlzLnNlcnZlci5hZGRGaWxlKG5hbWUsIGRvY1ZhbHVlKHRoaXMsIGRhdGEpKTsKICAgICAgQ29kZU1pcnJvci5vbihkb2MsICJjaGFuZ2UiLCB0aGlzLnRyYWNrQ2hhbmdlKTsKICAgICAgcmV0dXJuIHRoaXMuZG9jc1tuYW1lXSA9IGRhdGE7CiAgICB9LAoKICAgIGRlbERvYzogZnVuY3Rpb24oaWQpIHsKICAgICAgdmFyIGZvdW5kID0gcmVzb2x2ZURvYyh0aGlzLCBpZCk7CiAgICAgIGlmICghZm91bmQpIHJldHVybjsKICAgICAgQ29kZU1pcnJvci5vZmYoZm91bmQuZG9jLCAiY2hhbmdlIiwgdGhpcy50cmFja0NoYW5nZSk7CiAgICAgIGRlbGV0ZSB0aGlzLmRvY3NbZm91bmQubmFtZV07CiAgICAgIHRoaXMuc2VydmVyLmRlbEZpbGUoZm91bmQubmFtZSk7CiAgICB9LAoKICAgIGhpZGVEb2M6IGZ1bmN0aW9uKGlkKSB7CiAgICAgIGNsb3NlQXJnSGludHModGhpcyk7CiAgICAgIHZhciBmb3VuZCA9IHJlc29sdmVEb2ModGhpcywgaWQpOwogICAgICBpZiAoZm91bmQgJiYgZm91bmQuY2hhbmdlZCkgc2VuZERvYyh0aGlzLCBmb3VuZCk7CiAgICB9LAoKICAgIGNvbXBsZXRlOiBmdW5jdGlvbihjbSkgewogICAgICBjbS5zaG93SGludCh7aGludDogdGhpcy5nZXRIaW50fSk7CiAgICB9LAoKICAgIHNob3dUeXBlOiBmdW5jdGlvbihjbSwgcG9zLCBjKSB7IHNob3dUeXBlKHRoaXMsIGNtLCBwb3MsIGMpOyB9LAoKICAgIHVwZGF0ZUFyZ0hpbnRzOiBmdW5jdGlvbihjbSkgeyB1cGRhdGVBcmdIaW50cyh0aGlzLCBjbSk7IH0sCgogICAganVtcFRvRGVmOiBmdW5jdGlvbihjbSkgeyBqdW1wVG9EZWYodGhpcywgY20pOyB9LAoKICAgIGp1bXBCYWNrOiBmdW5jdGlvbihjbSkgeyBqdW1wQmFjayh0aGlzLCBjbSk7IH0sCgogICAgcmVuYW1lOiBmdW5jdGlvbihjbSkgeyByZW5hbWUodGhpcywgY20pOyB9LAoKICAgIHNlbGVjdE5hbWU6IGZ1bmN0aW9uKGNtKSB7IHNlbGVjdE5hbWUodGhpcywgY20pOyB9LAoKICAgIHJlcXVlc3Q6IGZ1bmN0aW9uIChjbSwgcXVlcnksIGMsIHBvcykgewogICAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICAgIHZhciBkb2MgPSBmaW5kRG9jKHRoaXMsIGNtLmdldERvYygpKTsKICAgICAgdmFyIHJlcXVlc3QgPSBidWlsZFJlcXVlc3QodGhpcywgZG9jLCBxdWVyeSwgcG9zKTsKCiAgICAgIHRoaXMuc2VydmVyLnJlcXVlc3QocmVxdWVzdCwgZnVuY3Rpb24gKGVycm9yLCBkYXRhKSB7CiAgICAgICAgaWYgKCFlcnJvciAmJiBzZWxmLm9wdGlvbnMucmVzcG9uc2VGaWx0ZXIpCiAgICAgICAgICBkYXRhID0gc2VsZi5vcHRpb25zLnJlc3BvbnNlRmlsdGVyKGRvYywgcXVlcnksIHJlcXVlc3QsIGVycm9yLCBkYXRhKTsKICAgICAgICBjKGVycm9yLCBkYXRhKTsKICAgICAgfSk7CiAgICB9CiAgfTsKCiAgdmFyIFBvcyA9IENvZGVNaXJyb3IuUG9zOwogIHZhciBjbHMgPSAiQ29kZU1pcnJvci1UZXJuLSI7CiAgdmFyIGJpZ0RvYyA9IDI1MDsKCiAgZnVuY3Rpb24gZ2V0RmlsZSh0cywgbmFtZSwgYykgewogICAgdmFyIGJ1ZiA9IHRzLmRvY3NbbmFtZV07CiAgICBpZiAoYnVmKQogICAgICBjKGRvY1ZhbHVlKHRzLCBidWYpKTsKICAgIGVsc2UgaWYgKHRzLm9wdGlvbnMuZ2V0RmlsZSkKICAgICAgdHMub3B0aW9ucy5nZXRGaWxlKG5hbWUsIGMpOwogICAgZWxzZQogICAgICBjKG51bGwpOwogIH0KCiAgZnVuY3Rpb24gZmluZERvYyh0cywgZG9jLCBuYW1lKSB7CiAgICBmb3IgKHZhciBuIGluIHRzLmRvY3MpIHsKICAgICAgdmFyIGN1ciA9IHRzLmRvY3Nbbl07CiAgICAgIGlmIChjdXIuZG9jID09IGRvYykgcmV0dXJuIGN1cjsKICAgIH0KICAgIGlmICghbmFtZSkgZm9yICh2YXIgaSA9IDA7OyArK2kpIHsKICAgICAgbiA9ICJbZG9jIiArIChpIHx8ICIiKSArICJdIjsKICAgICAgaWYgKCF0cy5kb2NzW25dKSB7IG5hbWUgPSBuOyBicmVhazsgfQogICAgfQogICAgcmV0dXJuIHRzLmFkZERvYyhuYW1lLCBkb2MpOwogIH0KCiAgZnVuY3Rpb24gcmVzb2x2ZURvYyh0cywgaWQpIHsKICAgIGlmICh0eXBlb2YgaWQgPT0gInN0cmluZyIpIHJldHVybiB0cy5kb2NzW2lkXTsKICAgIGlmIChpZCBpbnN0YW5jZW9mIENvZGVNaXJyb3IpIGlkID0gaWQuZ2V0RG9jKCk7CiAgICBpZiAoaWQgaW5zdGFuY2VvZiBDb2RlTWlycm9yLkRvYykgcmV0dXJuIGZpbmREb2ModHMsIGlkKTsKICB9CgogIGZ1bmN0aW9uIHRyYWNrQ2hhbmdlKHRzLCBkb2MsIGNoYW5nZSkgewogICAgdmFyIGRhdGEgPSBmaW5kRG9jKHRzLCBkb2MpOwoKICAgIHZhciBhcmdIaW50cyA9IHRzLmNhY2hlZEFyZ0hpbnRzOwogICAgaWYgKGFyZ0hpbnRzICYmIGFyZ0hpbnRzLmRvYyA9PSBkb2MgJiYgY21wUG9zKGFyZ0hpbnRzLnN0YXJ0LCBjaGFuZ2UudG8pIDw9IDApCiAgICAgIHRzLmNhY2hlZEFyZ0hpbnRzID0gbnVsbDsKCiAgICB2YXIgY2hhbmdlZCA9IGRhdGEuY2hhbmdlZDsKICAgIGlmIChjaGFuZ2VkID09IG51bGwpCiAgICAgIGRhdGEuY2hhbmdlZCA9IGNoYW5nZWQgPSB7ZnJvbTogY2hhbmdlLmZyb20ubGluZSwgdG86IGNoYW5nZS5mcm9tLmxpbmV9OwogICAgdmFyIGVuZCA9IGNoYW5nZS5mcm9tLmxpbmUgKyAoY2hhbmdlLnRleHQubGVuZ3RoIC0gMSk7CiAgICBpZiAoY2hhbmdlLmZyb20ubGluZSA8IGNoYW5nZWQudG8pIGNoYW5nZWQudG8gPSBjaGFuZ2VkLnRvIC0gKGNoYW5nZS50by5saW5lIC0gZW5kKTsKICAgIGlmIChlbmQgPj0gY2hhbmdlZC50bykgY2hhbmdlZC50byA9IGVuZCArIDE7CiAgICBpZiAoY2hhbmdlZC5mcm9tID4gY2hhbmdlLmZyb20ubGluZSkgY2hhbmdlZC5mcm9tID0gY2hhbmdlLmZyb20ubGluZTsKCiAgICBpZiAoZG9jLmxpbmVDb3VudCgpID4gYmlnRG9jICYmIGNoYW5nZS50byAtIGNoYW5nZWQuZnJvbSA+IDEwMCkgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgaWYgKGRhdGEuY2hhbmdlZCAmJiBkYXRhLmNoYW5nZWQudG8gLSBkYXRhLmNoYW5nZWQuZnJvbSA+IDEwMCkgc2VuZERvYyh0cywgZGF0YSk7CiAgICB9LCAyMDApOwogIH0KCiAgZnVuY3Rpb24gc2VuZERvYyh0cywgZG9jKSB7CiAgICB0cy5zZXJ2ZXIucmVxdWVzdCh7ZmlsZXM6IFt7dHlwZTogImZ1bGwiLCBuYW1lOiBkb2MubmFtZSwgdGV4dDogZG9jVmFsdWUodHMsIGRvYyl9XX0sIGZ1bmN0aW9uKGVycm9yKSB7CiAgICAgIGlmIChlcnJvcikgd2luZG93LmNvbnNvbGUuZXJyb3IoZXJyb3IpOwogICAgICBlbHNlIGRvYy5jaGFuZ2VkID0gbnVsbDsKICAgIH0pOwogIH0KCiAgLy8gQ29tcGxldGlvbgoKICBmdW5jdGlvbiBoaW50KHRzLCBjbSwgYykgewogICAgdHMucmVxdWVzdChjbSwge3R5cGU6ICJjb21wbGV0aW9ucyIsIHR5cGVzOiB0cnVlLCBkb2NzOiB0cnVlLCB1cmxzOiB0cnVlfSwgZnVuY3Rpb24oZXJyb3IsIGRhdGEpIHsKICAgICAgaWYgKGVycm9yKSByZXR1cm4gc2hvd0Vycm9yKHRzLCBjbSwgZXJyb3IpOwogICAgICB2YXIgY29tcGxldGlvbnMgPSBbXSwgYWZ0ZXIgPSAiIjsKICAgICAgdmFyIGZyb20gPSBkYXRhLnN0YXJ0LCB0byA9IGRhdGEuZW5kOwogICAgICBpZiAoY20uZ2V0UmFuZ2UoUG9zKGZyb20ubGluZSwgZnJvbS5jaCAtIDIpLCBmcm9tKSA9PSAiW1wiIiAmJgogICAgICAgICAgY20uZ2V0UmFuZ2UodG8sIFBvcyh0by5saW5lLCB0by5jaCArIDIpKSAhPSAiXCJdIikKICAgICAgICBhZnRlciA9ICJcIl0iOwoKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhLmNvbXBsZXRpb25zLmxlbmd0aDsgKytpKSB7CiAgICAgICAgdmFyIGNvbXBsZXRpb24gPSBkYXRhLmNvbXBsZXRpb25zW2ldLCBjbGFzc05hbWUgPSB0eXBlVG9JY29uKGNvbXBsZXRpb24udHlwZSk7CiAgICAgICAgaWYgKGRhdGEuZ3Vlc3MpIGNsYXNzTmFtZSArPSAiICIgKyBjbHMgKyAiZ3Vlc3MiOwogICAgICAgIGNvbXBsZXRpb25zLnB1c2goe3RleHQ6IGNvbXBsZXRpb24ubmFtZSArIGFmdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlUZXh0OiBjb21wbGV0aW9uLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3NOYW1lOiBjbGFzc05hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTogY29tcGxldGlvbn0pOwogICAgICB9CgogICAgICB2YXIgb2JqID0ge2Zyb206IGZyb20sIHRvOiB0bywgbGlzdDogY29tcGxldGlvbnN9OwogICAgICB2YXIgdG9vbHRpcCA9IG51bGw7CiAgICAgIENvZGVNaXJyb3Iub24ob2JqLCAiY2xvc2UiLCBmdW5jdGlvbigpIHsgcmVtb3ZlKHRvb2x0aXApOyB9KTsKICAgICAgQ29kZU1pcnJvci5vbihvYmosICJ1cGRhdGUiLCBmdW5jdGlvbigpIHsgcmVtb3ZlKHRvb2x0aXApOyB9KTsKICAgICAgQ29kZU1pcnJvci5vbihvYmosICJzZWxlY3QiLCBmdW5jdGlvbihjdXIsIG5vZGUpIHsKICAgICAgICByZW1vdmUodG9vbHRpcCk7CiAgICAgICAgdmFyIGNvbnRlbnQgPSB0cy5vcHRpb25zLmNvbXBsZXRpb25UaXAgPyB0cy5vcHRpb25zLmNvbXBsZXRpb25UaXAoY3VyLmRhdGEpIDogY3VyLmRhdGEuZG9jOwogICAgICAgIGlmIChjb250ZW50KSB7CiAgICAgICAgICB0b29sdGlwID0gbWFrZVRvb2x0aXAobm9kZS5wYXJlbnROb2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnJpZ2h0ICsgd2luZG93LnBhZ2VYT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wICsgd2luZG93LnBhZ2VZT2Zmc2V0LCBjb250ZW50KTsKICAgICAgICAgIHRvb2x0aXAuY2xhc3NOYW1lICs9ICIgIiArIGNscyArICJoaW50LWRvYyI7CiAgICAgICAgfQogICAgICB9KTsKICAgICAgYyhvYmopOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiB0eXBlVG9JY29uKHR5cGUpIHsKICAgIHZhciBzdWZmaXg7CiAgICBpZiAodHlwZSA9PSAiPyIpIHN1ZmZpeCA9ICJ1bmtub3duIjsKICAgIGVsc2UgaWYgKHR5cGUgPT0gIm51bWJlciIgfHwgdHlwZSA9PSAic3RyaW5nIiB8fCB0eXBlID09ICJib29sIikgc3VmZml4ID0gdHlwZTsKICAgIGVsc2UgaWYgKC9eZm5cKC8udGVzdCh0eXBlKSkgc3VmZml4ID0gImZuIjsKICAgIGVsc2UgaWYgKC9eXFsvLnRlc3QodHlwZSkpIHN1ZmZpeCA9ICJhcnJheSI7CiAgICBlbHNlIHN1ZmZpeCA9ICJvYmplY3QiOwogICAgcmV0dXJuIGNscyArICJjb21wbGV0aW9uICIgKyBjbHMgKyAiY29tcGxldGlvbi0iICsgc3VmZml4OwogIH0KCiAgLy8gVHlwZSBxdWVyaWVzCgogIGZ1bmN0aW9uIHNob3dUeXBlKHRzLCBjbSwgcG9zLCBjKSB7CiAgICB0cy5yZXF1ZXN0KGNtLCAidHlwZSIsIGZ1bmN0aW9uKGVycm9yLCBkYXRhKSB7CiAgICAgIGlmIChlcnJvcikgcmV0dXJuIHNob3dFcnJvcih0cywgY20sIGVycm9yKTsKICAgICAgaWYgKHRzLm9wdGlvbnMudHlwZVRpcCkgewogICAgICAgIHZhciB0aXAgPSB0cy5vcHRpb25zLnR5cGVUaXAoZGF0YSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIHRpcCA9IGVsdCgic3BhbiIsIG51bGwsIGVsdCgic3Ryb25nIiwgbnVsbCwgZGF0YS50eXBlIHx8ICJub3QgZm91bmQiKSk7CiAgICAgICAgaWYgKGRhdGEuZG9jKQogICAgICAgICAgdGlwLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCIg4oCUICIgKyBkYXRhLmRvYykpOwogICAgICAgIGlmIChkYXRhLnVybCkgewogICAgICAgICAgdGlwLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCIgIikpOwogICAgICAgICAgdGlwLmFwcGVuZENoaWxkKGVsdCgiYSIsIG51bGwsICJbZG9jc10iKSkuaHJlZiA9IGRhdGEudXJsOwogICAgICAgIH0KICAgICAgfQogICAgICB0ZW1wVG9vbHRpcChjbSwgdGlwKTsKICAgICAgaWYgKGMpIGMoKTsKICAgIH0sIHBvcyk7CiAgfQoKICAvLyBNYWludGFpbmluZyBhcmd1bWVudCBoaW50cwoKICBmdW5jdGlvbiB1cGRhdGVBcmdIaW50cyh0cywgY20pIHsKICAgIGNsb3NlQXJnSGludHModHMpOwoKICAgIGlmIChjbS5zb21ldGhpbmdTZWxlY3RlZCgpKSByZXR1cm47CiAgICB2YXIgc3RhdGUgPSBjbS5nZXRUb2tlbkF0KGNtLmdldEN1cnNvcigpKS5zdGF0ZTsKICAgIHZhciBpbm5lciA9IENvZGVNaXJyb3IuaW5uZXJNb2RlKGNtLmdldE1vZGUoKSwgc3RhdGUpOwogICAgaWYgKGlubmVyLm1vZGUubmFtZSAhPSAiamF2YXNjcmlwdCIpIHJldHVybjsKICAgIHZhciBsZXggPSBpbm5lci5zdGF0ZS5sZXhpY2FsOwogICAgaWYgKGxleC5pbmZvICE9ICJjYWxsIikgcmV0dXJuOwoKICAgIHZhciBjaCwgYXJnUG9zID0gbGV4LnBvcyB8fCAwLCB0YWJTaXplID0gY20uZ2V0T3B0aW9uKCJ0YWJTaXplIik7CiAgICBmb3IgKHZhciBsaW5lID0gY20uZ2V0Q3Vyc29yKCkubGluZSwgZSA9IE1hdGgubWF4KDAsIGxpbmUgLSA5KSwgZm91bmQgPSBmYWxzZTsgbGluZSA+PSBlOyAtLWxpbmUpIHsKICAgICAgdmFyIHN0ciA9IGNtLmdldExpbmUobGluZSksIGV4dHJhID0gMDsKICAgICAgZm9yICh2YXIgcG9zID0gMDs7KSB7CiAgICAgICAgdmFyIHRhYiA9IHN0ci5pbmRleE9mKCJcdCIsIHBvcyk7CiAgICAgICAgaWYgKHRhYiA9PSAtMSkgYnJlYWs7CiAgICAgICAgZXh0cmEgKz0gdGFiU2l6ZSAtICh0YWIgKyBleHRyYSkgJSB0YWJTaXplIC0gMTsKICAgICAgICBwb3MgPSB0YWIgKyAxOwogICAgICB9CiAgICAgIGNoID0gbGV4LmNvbHVtbiAtIGV4dHJhOwogICAgICBpZiAoc3RyLmNoYXJBdChjaCkgPT0gIigiKSB7Zm91bmQgPSB0cnVlOyBicmVhazt9CiAgICB9CiAgICBpZiAoIWZvdW5kKSByZXR1cm47CgogICAgdmFyIHN0YXJ0ID0gUG9zKGxpbmUsIGNoKTsKICAgIHZhciBjYWNoZSA9IHRzLmNhY2hlZEFyZ0hpbnRzOwogICAgaWYgKGNhY2hlICYmIGNhY2hlLmRvYyA9PSBjbS5nZXREb2MoKSAmJiBjbXBQb3Moc3RhcnQsIGNhY2hlLnN0YXJ0KSA9PSAwKQogICAgICByZXR1cm4gc2hvd0FyZ0hpbnRzKHRzLCBjbSwgYXJnUG9zKTsKCiAgICB0cy5yZXF1ZXN0KGNtLCB7dHlwZTogInR5cGUiLCBwcmVmZXJGdW5jdGlvbjogdHJ1ZSwgZW5kOiBzdGFydH0sIGZ1bmN0aW9uKGVycm9yLCBkYXRhKSB7CiAgICAgIGlmIChlcnJvciB8fCAhZGF0YS50eXBlIHx8ICEoL15mblwoLykudGVzdChkYXRhLnR5cGUpKSByZXR1cm47CiAgICAgIHRzLmNhY2hlZEFyZ0hpbnRzID0gewogICAgICAgIHN0YXJ0OiBwb3MsCiAgICAgICAgdHlwZTogcGFyc2VGblR5cGUoZGF0YS50eXBlKSwKICAgICAgICBuYW1lOiBkYXRhLmV4cHJOYW1lIHx8IGRhdGEubmFtZSB8fCAiZm4iLAogICAgICAgIGd1ZXNzOiBkYXRhLmd1ZXNzLAogICAgICAgIGRvYzogY20uZ2V0RG9jKCkKICAgICAgfTsKICAgICAgc2hvd0FyZ0hpbnRzKHRzLCBjbSwgYXJnUG9zKTsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gc2hvd0FyZ0hpbnRzKHRzLCBjbSwgcG9zKSB7CiAgICBjbG9zZUFyZ0hpbnRzKHRzKTsKCiAgICB2YXIgY2FjaGUgPSB0cy5jYWNoZWRBcmdIaW50cywgdHAgPSBjYWNoZS50eXBlOwogICAgdmFyIHRpcCA9IGVsdCgic3BhbiIsIGNhY2hlLmd1ZXNzID8gY2xzICsgImZoaW50LWd1ZXNzIiA6IG51bGwsCiAgICAgICAgICAgICAgICAgIGVsdCgic3BhbiIsIGNscyArICJmbmFtZSIsIGNhY2hlLm5hbWUpLCAiKCIpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0cC5hcmdzLmxlbmd0aDsgKytpKSB7CiAgICAgIGlmIChpKSB0aXAuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIiwgIikpOwogICAgICB2YXIgYXJnID0gdHAuYXJnc1tpXTsKICAgICAgdGlwLmFwcGVuZENoaWxkKGVsdCgic3BhbiIsIGNscyArICJmYXJnIiArIChpID09IHBvcyA/ICIgIiArIGNscyArICJmYXJnLWN1cnJlbnQiIDogIiIpLCBhcmcubmFtZSB8fCAiPyIpKTsKICAgICAgaWYgKGFyZy50eXBlICE9ICI/IikgewogICAgICAgIHRpcC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiOlx1MDBhMCIpKTsKICAgICAgICB0aXAuYXBwZW5kQ2hpbGQoZWx0KCJzcGFuIiwgY2xzICsgInR5cGUiLCBhcmcudHlwZSkpOwogICAgICB9CiAgICB9CiAgICB0aXAuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodHAucmV0dHlwZSA/ICIpIC0+XHUwMGEwIiA6ICIpIikpOwogICAgaWYgKHRwLnJldHR5cGUpIHRpcC5hcHBlbmRDaGlsZChlbHQoInNwYW4iLCBjbHMgKyAidHlwZSIsIHRwLnJldHR5cGUpKTsKICAgIHZhciBwbGFjZSA9IGNtLmN1cnNvckNvb3JkcyhudWxsLCAicGFnZSIpOwogICAgdHMuYWN0aXZlQXJnSGludHMgPSBtYWtlVG9vbHRpcChwbGFjZS5yaWdodCArIDEsIHBsYWNlLmJvdHRvbSwgdGlwKTsKICB9CgogIGZ1bmN0aW9uIHBhcnNlRm5UeXBlKHRleHQpIHsKICAgIHZhciBhcmdzID0gW10sIHBvcyA9IDM7CgogICAgZnVuY3Rpb24gc2tpcE1hdGNoaW5nKHVwdG8pIHsKICAgICAgdmFyIGRlcHRoID0gMCwgc3RhcnQgPSBwb3M7CiAgICAgIGZvciAoOzspIHsKICAgICAgICB2YXIgbmV4dCA9IHRleHQuY2hhckF0KHBvcyk7CiAgICAgICAgaWYgKHVwdG8udGVzdChuZXh0KSAmJiAhZGVwdGgpIHJldHVybiB0ZXh0LnNsaWNlKHN0YXJ0LCBwb3MpOwogICAgICAgIGlmICgvW3tcW1woXS8udGVzdChuZXh0KSkgKytkZXB0aDsKICAgICAgICBlbHNlIGlmICgvW31cXVwpXS8udGVzdChuZXh0KSkgLS1kZXB0aDsKICAgICAgICArK3BvczsKICAgICAgfQogICAgfQoKICAgIC8vIFBhcnNlIGFyZ3VtZW50cwogICAgaWYgKHRleHQuY2hhckF0KHBvcykgIT0gIikiKSBmb3IgKDs7KSB7CiAgICAgIHZhciBuYW1lID0gdGV4dC5zbGljZShwb3MpLm1hdGNoKC9eKFteLCBcKFxbXHtdKyk6IC8pOwogICAgICBpZiAobmFtZSkgewogICAgICAgIHBvcyArPSBuYW1lWzBdLmxlbmd0aDsKICAgICAgICBuYW1lID0gbmFtZVsxXTsKICAgICAgfQogICAgICBhcmdzLnB1c2goe25hbWU6IG5hbWUsIHR5cGU6IHNraXBNYXRjaGluZygvW1wpLF0vKX0pOwogICAgICBpZiAodGV4dC5jaGFyQXQocG9zKSA9PSAiKSIpIGJyZWFrOwogICAgICBwb3MgKz0gMjsKICAgIH0KCiAgICB2YXIgcmV0dHlwZSA9IHRleHQuc2xpY2UocG9zKS5tYXRjaCgvXlwpIC0+ICguKikkLyk7CgogICAgcmV0dXJuIHthcmdzOiBhcmdzLCByZXR0eXBlOiByZXR0eXBlICYmIHJldHR5cGVbMV19OwogIH0KCiAgLy8gTW92aW5nIHRvIHRoZSBkZWZpbml0aW9uIG9mIHNvbWV0aGluZwoKICBmdW5jdGlvbiBqdW1wVG9EZWYodHMsIGNtKSB7CiAgICBmdW5jdGlvbiBpbm5lcih2YXJOYW1lKSB7CiAgICAgIHZhciByZXEgPSB7dHlwZTogImRlZmluaXRpb24iLCB2YXJpYWJsZTogdmFyTmFtZSB8fCBudWxsfTsKICAgICAgdmFyIGRvYyA9IGZpbmREb2ModHMsIGNtLmdldERvYygpKTsKICAgICAgdHMuc2VydmVyLnJlcXVlc3QoYnVpbGRSZXF1ZXN0KHRzLCBkb2MsIHJlcSksIGZ1bmN0aW9uKGVycm9yLCBkYXRhKSB7CiAgICAgICAgaWYgKGVycm9yKSByZXR1cm4gc2hvd0Vycm9yKHRzLCBjbSwgZXJyb3IpOwogICAgICAgIGlmICghZGF0YS5maWxlICYmIGRhdGEudXJsKSB7IHdpbmRvdy5vcGVuKGRhdGEudXJsKTsgcmV0dXJuOyB9CgogICAgICAgIGlmIChkYXRhLmZpbGUpIHsKICAgICAgICAgIHZhciBsb2NhbERvYyA9IHRzLmRvY3NbZGF0YS5maWxlXSwgZm91bmQ7CiAgICAgICAgICBpZiAobG9jYWxEb2MgJiYgKGZvdW5kID0gZmluZENvbnRleHQobG9jYWxEb2MuZG9jLCBkYXRhKSkpIHsKICAgICAgICAgICAgdHMuanVtcFN0YWNrLnB1c2goe2ZpbGU6IGRvYy5uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IGNtLmdldEN1cnNvcigiZnJvbSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBjbS5nZXRDdXJzb3IoInRvIil9KTsKICAgICAgICAgICAgbW92ZVRvKHRzLCBkb2MsIGxvY2FsRG9jLCBmb3VuZC5zdGFydCwgZm91bmQuZW5kKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBzaG93RXJyb3IodHMsIGNtLCAiQ291bGQgbm90IGZpbmQgYSBkZWZpbml0aW9uLiIpOwogICAgICB9KTsKICAgIH0KCiAgICBpZiAoIWF0SW50ZXJlc3RpbmdFeHByZXNzaW9uKGNtKSkKICAgICAgZGlhbG9nKGNtLCAiSnVtcCB0byB2YXJpYWJsZSIsIGZ1bmN0aW9uKG5hbWUpIHsgaWYgKG5hbWUpIGlubmVyKG5hbWUpOyB9KTsKICAgIGVsc2UKICAgICAgaW5uZXIoKTsKICB9CgogIGZ1bmN0aW9uIGp1bXBCYWNrKHRzLCBjbSkgewogICAgdmFyIHBvcyA9IHRzLmp1bXBTdGFjay5wb3AoKSwgZG9jID0gcG9zICYmIHRzLmRvY3NbcG9zLmZpbGVdOwogICAgaWYgKCFkb2MpIHJldHVybjsKICAgIG1vdmVUbyh0cywgZmluZERvYyh0cywgY20uZ2V0RG9jKCkpLCBkb2MsIHBvcy5zdGFydCwgcG9zLmVuZCk7CiAgfQoKICBmdW5jdGlvbiBtb3ZlVG8odHMsIGN1ckRvYywgZG9jLCBzdGFydCwgZW5kKSB7CiAgICBkb2MuZG9jLnNldFNlbGVjdGlvbihzdGFydCwgZW5kKTsKICAgIGlmIChjdXJEb2MgIT0gZG9jICYmIHRzLm9wdGlvbnMuc3dpdGNoVG9Eb2MpIHsKICAgICAgY2xvc2VBcmdIaW50cyh0cyk7CiAgICAgIHRzLm9wdGlvbnMuc3dpdGNoVG9Eb2MoZG9jLm5hbWUsIGRvYy5kb2MpOwogICAgfQogIH0KCiAgLy8gVGhlIHtsaW5lLGNofSByZXByZXNlbnRhdGlvbiBvZiBwb3NpdGlvbnMgbWFrZXMgdGhpcyByYXRoZXIgYXdrd2FyZC4KICBmdW5jdGlvbiBmaW5kQ29udGV4dChkb2MsIGRhdGEpIHsKICAgIHZhciBiZWZvcmUgPSBkYXRhLmNvbnRleHQuc2xpY2UoMCwgZGF0YS5jb250ZXh0T2Zmc2V0KS5zcGxpdCgiXG4iKTsKICAgIHZhciBzdGFydExpbmUgPSBkYXRhLnN0YXJ0LmxpbmUgLSAoYmVmb3JlLmxlbmd0aCAtIDEpOwogICAgdmFyIHN0YXJ0ID0gUG9zKHN0YXJ0TGluZSwgKGJlZm9yZS5sZW5ndGggPT0gMSA/IGRhdGEuc3RhcnQuY2ggOiBkb2MuZ2V0TGluZShzdGFydExpbmUpLmxlbmd0aCkgLSBiZWZvcmVbMF0ubGVuZ3RoKTsKCiAgICB2YXIgdGV4dCA9IGRvYy5nZXRMaW5lKHN0YXJ0TGluZSkuc2xpY2Uoc3RhcnQuY2gpOwogICAgZm9yICh2YXIgY3VyID0gc3RhcnRMaW5lICsgMTsgY3VyIDwgZG9jLmxpbmVDb3VudCgpICYmIHRleHQubGVuZ3RoIDwgZGF0YS5jb250ZXh0Lmxlbmd0aDsgKytjdXIpCiAgICAgIHRleHQgKz0gIlxuIiArIGRvYy5nZXRMaW5lKGN1cik7CiAgICBpZiAodGV4dC5zbGljZSgwLCBkYXRhLmNvbnRleHQubGVuZ3RoKSA9PSBkYXRhLmNvbnRleHQpIHJldHVybiBkYXRhOwoKICAgIHZhciBjdXJzb3IgPSBkb2MuZ2V0U2VhcmNoQ3Vyc29yKGRhdGEuY29udGV4dCwgMCwgZmFsc2UpOwogICAgdmFyIG5lYXJlc3QsIG5lYXJlc3REaXN0ID0gSW5maW5pdHk7CiAgICB3aGlsZSAoY3Vyc29yLmZpbmROZXh0KCkpIHsKICAgICAgdmFyIGZyb20gPSBjdXJzb3IuZnJvbSgpLCBkaXN0ID0gTWF0aC5hYnMoZnJvbS5saW5lIC0gc3RhcnQubGluZSkgKiAxMDAwMDsKICAgICAgaWYgKCFkaXN0KSBkaXN0ID0gTWF0aC5hYnMoZnJvbS5jaCAtIHN0YXJ0LmNoKTsKICAgICAgaWYgKGRpc3QgPCBuZWFyZXN0RGlzdCkgeyBuZWFyZXN0ID0gZnJvbTsgbmVhcmVzdERpc3QgPSBkaXN0OyB9CiAgICB9CiAgICBpZiAoIW5lYXJlc3QpIHJldHVybiBudWxsOwoKICAgIGlmIChiZWZvcmUubGVuZ3RoID09IDEpCiAgICAgIG5lYXJlc3QuY2ggKz0gYmVmb3JlWzBdLmxlbmd0aDsKICAgIGVsc2UKICAgICAgbmVhcmVzdCA9IFBvcyhuZWFyZXN0LmxpbmUgKyAoYmVmb3JlLmxlbmd0aCAtIDEpLCBiZWZvcmVbYmVmb3JlLmxlbmd0aCAtIDFdLmxlbmd0aCk7CiAgICBpZiAoZGF0YS5zdGFydC5saW5lID09IGRhdGEuZW5kLmxpbmUpCiAgICAgIHZhciBlbmQgPSBQb3MobmVhcmVzdC5saW5lLCBuZWFyZXN0LmNoICsgKGRhdGEuZW5kLmNoIC0gZGF0YS5zdGFydC5jaCkpOwogICAgZWxzZQogICAgICB2YXIgZW5kID0gUG9zKG5lYXJlc3QubGluZSArIChkYXRhLmVuZC5saW5lIC0gZGF0YS5zdGFydC5saW5lKSwgZGF0YS5lbmQuY2gpOwogICAgcmV0dXJuIHtzdGFydDogbmVhcmVzdCwgZW5kOiBlbmR9OwogIH0KCiAgZnVuY3Rpb24gYXRJbnRlcmVzdGluZ0V4cHJlc3Npb24oY20pIHsKICAgIHZhciBwb3MgPSBjbS5nZXRDdXJzb3IoImVuZCIpLCB0b2sgPSBjbS5nZXRUb2tlbkF0KHBvcyk7CiAgICBpZiAodG9rLnN0YXJ0IDwgcG9zLmNoICYmICh0b2sudHlwZSA9PSAiY29tbWVudCIgfHwgdG9rLnR5cGUgPT0gInN0cmluZyIpKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gL1x3Ly50ZXN0KGNtLmdldExpbmUocG9zLmxpbmUpLnNsaWNlKE1hdGgubWF4KHBvcy5jaCAtIDEsIDApLCBwb3MuY2ggKyAxKSk7CiAgfQoKICAvLyBWYXJpYWJsZSByZW5hbWluZwoKICBmdW5jdGlvbiByZW5hbWUodHMsIGNtKSB7CiAgICB2YXIgdG9rZW4gPSBjbS5nZXRUb2tlbkF0KGNtLmdldEN1cnNvcigpKTsKICAgIGlmICghL1x3Ly50ZXN0KHRva2VuLnN0cmluZykpIHJldHVybiBzaG93RXJyb3IodHMsIGNtLCAiTm90IGF0IGEgdmFyaWFibGUiKTsKICAgIGRpYWxvZyhjbSwgIk5ldyBuYW1lIGZvciAiICsgdG9rZW4uc3RyaW5nLCBmdW5jdGlvbihuZXdOYW1lKSB7CiAgICAgIHRzLnJlcXVlc3QoY20sIHt0eXBlOiAicmVuYW1lIiwgbmV3TmFtZTogbmV3TmFtZSwgZnVsbERvY3M6IHRydWV9LCBmdW5jdGlvbihlcnJvciwgZGF0YSkgewogICAgICAgIGlmIChlcnJvcikgcmV0dXJuIHNob3dFcnJvcih0cywgY20sIGVycm9yKTsKICAgICAgICBhcHBseUNoYW5nZXModHMsIGRhdGEuY2hhbmdlcyk7CiAgICAgIH0pOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBzZWxlY3ROYW1lKHRzLCBjbSkgewogICAgdmFyIG5hbWUgPSBmaW5kRG9jKHRzLCBjbS5kb2MpLm5hbWU7CiAgICB0cy5yZXF1ZXN0KGNtLCB7dHlwZTogInJlZnMifSwgZnVuY3Rpb24oZXJyb3IsIGRhdGEpIHsKICAgICAgaWYgKGVycm9yKSByZXR1cm4gc2hvd0Vycm9yKHRzLCBjbSwgZXJyb3IpOwogICAgICB2YXIgcmFuZ2VzID0gW10sIGN1ciA9IDA7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5yZWZzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIHJlZiA9IGRhdGEucmVmc1tpXTsKICAgICAgICBpZiAocmVmLmZpbGUgPT0gbmFtZSkgewogICAgICAgICAgcmFuZ2VzLnB1c2goe2FuY2hvcjogcmVmLnN0YXJ0LCBoZWFkOiByZWYuZW5kfSk7CiAgICAgICAgICBpZiAoY21wUG9zKGN1ciwgcmVmLnN0YXJ0KSA+PSAwICYmIGNtcFBvcyhjdXIsIHJlZi5lbmQpIDw9IDApCiAgICAgICAgICAgIGN1ciA9IHJhbmdlcy5sZW5ndGggLSAxOwogICAgICAgIH0KICAgICAgfQogICAgICBjbS5zZXRTZWxlY3Rpb25zKHJhbmdlcywgY3VyKTsKICAgIH0pOwogIH0KCiAgdmFyIG5leHRDaGFuZ2VPcmlnID0gMDsKICBmdW5jdGlvbiBhcHBseUNoYW5nZXModHMsIGNoYW5nZXMpIHsKICAgIHZhciBwZXJGaWxlID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hhbmdlcy5sZW5ndGg7ICsraSkgewogICAgICB2YXIgY2ggPSBjaGFuZ2VzW2ldOwogICAgICAocGVyRmlsZVtjaC5maWxlXSB8fCAocGVyRmlsZVtjaC5maWxlXSA9IFtdKSkucHVzaChjaCk7CiAgICB9CiAgICBmb3IgKHZhciBmaWxlIGluIHBlckZpbGUpIHsKICAgICAgdmFyIGtub3duID0gdHMuZG9jc1tmaWxlXSwgY2hzID0gcGVyRmlsZVtmaWxlXTs7CiAgICAgIGlmICgha25vd24pIGNvbnRpbnVlOwogICAgICBjaHMuc29ydChmdW5jdGlvbihhLCBiKSB7IHJldHVybiBjbXBQb3MoYi5zdGFydCwgYS5zdGFydCk7IH0pOwogICAgICB2YXIgb3JpZ2luID0gIipyZW5hbWUiICsgKCsrbmV4dENoYW5nZU9yaWcpOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNocy5sZW5ndGg7ICsraSkgewogICAgICAgIHZhciBjaCA9IGNoc1tpXTsKICAgICAgICBrbm93bi5kb2MucmVwbGFjZVJhbmdlKGNoLnRleHQsIGNoLnN0YXJ0LCBjaC5lbmQsIG9yaWdpbik7CiAgICAgIH0KICAgIH0KICB9CgogIC8vIEdlbmVyaWMgcmVxdWVzdC1idWlsZGluZyBoZWxwZXIKCiAgZnVuY3Rpb24gYnVpbGRSZXF1ZXN0KHRzLCBkb2MsIHF1ZXJ5LCBwb3MpIHsKICAgIHZhciBmaWxlcyA9IFtdLCBvZmZzZXRMaW5lcyA9IDAsIGFsbG93RnJhZ21lbnRzID0gIXF1ZXJ5LmZ1bGxEb2NzOwogICAgaWYgKCFhbGxvd0ZyYWdtZW50cykgZGVsZXRlIHF1ZXJ5LmZ1bGxEb2NzOwogICAgaWYgKHR5cGVvZiBxdWVyeSA9PSAic3RyaW5nIikgcXVlcnkgPSB7dHlwZTogcXVlcnl9OwogICAgcXVlcnkubGluZUNoYXJQb3NpdGlvbnMgPSB0cnVlOwogICAgaWYgKHF1ZXJ5LmVuZCA9PSBudWxsKSB7CiAgICAgIHF1ZXJ5LmVuZCA9IHBvcyB8fCBkb2MuZG9jLmdldEN1cnNvcigiZW5kIik7CiAgICAgIGlmIChkb2MuZG9jLnNvbWV0aGluZ1NlbGVjdGVkKCkpCiAgICAgICAgcXVlcnkuc3RhcnQgPSBkb2MuZG9jLmdldEN1cnNvcigic3RhcnQiKTsKICAgIH0KICAgIHZhciBzdGFydFBvcyA9IHF1ZXJ5LnN0YXJ0IHx8IHF1ZXJ5LmVuZDsKCiAgICBpZiAoZG9jLmNoYW5nZWQpIHsKICAgICAgaWYgKGRvYy5kb2MubGluZUNvdW50KCkgPiBiaWdEb2MgJiYgYWxsb3dGcmFnbWVudHMgIT09IGZhbHNlICYmCiAgICAgICAgICBkb2MuY2hhbmdlZC50byAtIGRvYy5jaGFuZ2VkLmZyb20gPCAxMDAgJiYKICAgICAgICAgIGRvYy5jaGFuZ2VkLmZyb20gPD0gc3RhcnRQb3MubGluZSAmJiBkb2MuY2hhbmdlZC50byA+IHF1ZXJ5LmVuZC5saW5lKSB7CiAgICAgICAgZmlsZXMucHVzaChnZXRGcmFnbWVudEFyb3VuZChkb2MsIHN0YXJ0UG9zLCBxdWVyeS5lbmQpKTsKICAgICAgICBxdWVyeS5maWxlID0gIiMwIjsKICAgICAgICB2YXIgb2Zmc2V0TGluZXMgPSBmaWxlc1swXS5vZmZzZXRMaW5lczsKICAgICAgICBpZiAocXVlcnkuc3RhcnQgIT0gbnVsbCkgcXVlcnkuc3RhcnQgPSBQb3MocXVlcnkuc3RhcnQubGluZSAtIC1vZmZzZXRMaW5lcywgcXVlcnkuc3RhcnQuY2gpOwogICAgICAgIHF1ZXJ5LmVuZCA9IFBvcyhxdWVyeS5lbmQubGluZSAtIG9mZnNldExpbmVzLCBxdWVyeS5lbmQuY2gpOwogICAgICB9IGVsc2UgewogICAgICAgIGZpbGVzLnB1c2goe3R5cGU6ICJmdWxsIiwKICAgICAgICAgICAgICAgICAgICBuYW1lOiBkb2MubmFtZSwKICAgICAgICAgICAgICAgICAgICB0ZXh0OiBkb2NWYWx1ZSh0cywgZG9jKX0pOwogICAgICAgIHF1ZXJ5LmZpbGUgPSBkb2MubmFtZTsKICAgICAgICBkb2MuY2hhbmdlZCA9IG51bGw7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHF1ZXJ5LmZpbGUgPSBkb2MubmFtZTsKICAgIH0KICAgIGZvciAodmFyIG5hbWUgaW4gdHMuZG9jcykgewogICAgICB2YXIgY3VyID0gdHMuZG9jc1tuYW1lXTsKICAgICAgaWYgKGN1ci5jaGFuZ2VkICYmIGN1ciAhPSBkb2MpIHsKICAgICAgICBmaWxlcy5wdXNoKHt0eXBlOiAiZnVsbCIsIG5hbWU6IGN1ci5uYW1lLCB0ZXh0OiBkb2NWYWx1ZSh0cywgY3VyKX0pOwogICAgICAgIGN1ci5jaGFuZ2VkID0gbnVsbDsKICAgICAgfQogICAgfQoKICAgIHJldHVybiB7cXVlcnk6IHF1ZXJ5LCBmaWxlczogZmlsZXN9OwogIH0KCiAgZnVuY3Rpb24gZ2V0RnJhZ21lbnRBcm91bmQoZGF0YSwgc3RhcnQsIGVuZCkgewogICAgdmFyIGRvYyA9IGRhdGEuZG9jOwogICAgdmFyIG1pbkluZGVudCA9IG51bGwsIG1pbkxpbmUgPSBudWxsLCBlbmRMaW5lLCB0YWJTaXplID0gNDsKICAgIGZvciAodmFyIHAgPSBzdGFydC5saW5lIC0gMSwgbWluID0gTWF0aC5tYXgoMCwgcCAtIDUwKTsgcCA+PSBtaW47IC0tcCkgewogICAgICB2YXIgbGluZSA9IGRvYy5nZXRMaW5lKHApLCBmbiA9IGxpbmUuc2VhcmNoKC9cYmZ1bmN0aW9uXGIvKTsKICAgICAgaWYgKGZuIDwgMCkgY29udGludWU7CiAgICAgIHZhciBpbmRlbnQgPSBDb2RlTWlycm9yLmNvdW50Q29sdW1uKGxpbmUsIG51bGwsIHRhYlNpemUpOwogICAgICBpZiAobWluSW5kZW50ICE9IG51bGwgJiYgbWluSW5kZW50IDw9IGluZGVudCkgY29udGludWU7CiAgICAgIG1pbkluZGVudCA9IGluZGVudDsKICAgICAgbWluTGluZSA9IHA7CiAgICB9CiAgICBpZiAobWluTGluZSA9PSBudWxsKSBtaW5MaW5lID0gbWluOwogICAgdmFyIG1heCA9IE1hdGgubWluKGRvYy5sYXN0TGluZSgpLCBlbmQubGluZSArIDIwKTsKICAgIGlmIChtaW5JbmRlbnQgPT0gbnVsbCB8fCBtaW5JbmRlbnQgPT0gQ29kZU1pcnJvci5jb3VudENvbHVtbihkb2MuZ2V0TGluZShzdGFydC5saW5lKSwgbnVsbCwgdGFiU2l6ZSkpCiAgICAgIGVuZExpbmUgPSBtYXg7CiAgICBlbHNlIGZvciAoZW5kTGluZSA9IGVuZC5saW5lICsgMTsgZW5kTGluZSA8IG1heDsgKytlbmRMaW5lKSB7CiAgICAgIHZhciBpbmRlbnQgPSBDb2RlTWlycm9yLmNvdW50Q29sdW1uKGRvYy5nZXRMaW5lKGVuZExpbmUpLCBudWxsLCB0YWJTaXplKTsKICAgICAgaWYgKGluZGVudCA8PSBtaW5JbmRlbnQpIGJyZWFrOwogICAgfQogICAgdmFyIGZyb20gPSBQb3MobWluTGluZSwgMCk7CgogICAgcmV0dXJuIHt0eXBlOiAicGFydCIsCiAgICAgICAgICAgIG5hbWU6IGRhdGEubmFtZSwKICAgICAgICAgICAgb2Zmc2V0TGluZXM6IGZyb20ubGluZSwKICAgICAgICAgICAgdGV4dDogZG9jLmdldFJhbmdlKGZyb20sIFBvcyhlbmRMaW5lLCAwKSl9OwogIH0KCiAgLy8gR2VuZXJpYyB1dGlsaXRpZXMKCiAgdmFyIGNtcFBvcyA9IENvZGVNaXJyb3IuY21wUG9zOwoKICBmdW5jdGlvbiBlbHQodGFnbmFtZSwgY2xzIC8qLCAuLi4gZWx0cyovKSB7CiAgICB2YXIgZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGFnbmFtZSk7CiAgICBpZiAoY2xzKSBlLmNsYXNzTmFtZSA9IGNsczsKICAgIGZvciAodmFyIGkgPSAyOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgKytpKSB7CiAgICAgIHZhciBlbHQgPSBhcmd1bWVudHNbaV07CiAgICAgIGlmICh0eXBlb2YgZWx0ID09ICJzdHJpbmciKSBlbHQgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShlbHQpOwogICAgICBlLmFwcGVuZENoaWxkKGVsdCk7CiAgICB9CiAgICByZXR1cm4gZTsKICB9CgogIGZ1bmN0aW9uIGRpYWxvZyhjbSwgdGV4dCwgZikgewogICAgaWYgKGNtLm9wZW5EaWFsb2cpCiAgICAgIGNtLm9wZW5EaWFsb2codGV4dCArICI6IDxpbnB1dCB0eXBlPXRleHQ+IiwgZik7CiAgICBlbHNlCiAgICAgIGYocHJvbXB0KHRleHQsICIiKSk7CiAgfQoKICAvLyBUb29sdGlwcwoKICBmdW5jdGlvbiB0ZW1wVG9vbHRpcChjbSwgY29udGVudCkgewogICAgdmFyIHdoZXJlID0gY20uY3Vyc29yQ29vcmRzKCk7CiAgICB2YXIgdGlwID0gbWFrZVRvb2x0aXAod2hlcmUucmlnaHQgKyAxLCB3aGVyZS5ib3R0b20sIGNvbnRlbnQpOwogICAgZnVuY3Rpb24gY2xlYXIoKSB7CiAgICAgIGlmICghdGlwLnBhcmVudE5vZGUpIHJldHVybjsKICAgICAgY20ub2ZmKCJjdXJzb3JBY3Rpdml0eSIsIGNsZWFyKTsKICAgICAgZmFkZU91dCh0aXApOwogICAgfQogICAgc2V0VGltZW91dChjbGVhciwgMTcwMCk7CiAgICBjbS5vbigiY3Vyc29yQWN0aXZpdHkiLCBjbGVhcik7CiAgfQoKICBmdW5jdGlvbiBtYWtlVG9vbHRpcCh4LCB5LCBjb250ZW50KSB7CiAgICB2YXIgbm9kZSA9IGVsdCgiZGl2IiwgY2xzICsgInRvb2x0aXAiLCBjb250ZW50KTsKICAgIG5vZGUuc3R5bGUubGVmdCA9IHggKyAicHgiOwogICAgbm9kZS5zdHlsZS50b3AgPSB5ICsgInB4IjsKICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobm9kZSk7CiAgICByZXR1cm4gbm9kZTsKICB9CgogIGZ1bmN0aW9uIHJlbW92ZShub2RlKSB7CiAgICB2YXIgcCA9IG5vZGUgJiYgbm9kZS5wYXJlbnROb2RlOwogICAgaWYgKHApIHAucmVtb3ZlQ2hpbGQobm9kZSk7CiAgfQoKICBmdW5jdGlvbiBmYWRlT3V0KHRvb2x0aXApIHsKICAgIHRvb2x0aXAuc3R5bGUub3BhY2l0eSA9ICIwIjsKICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IHJlbW92ZSh0b29sdGlwKTsgfSwgMTEwMCk7CiAgfQoKICBmdW5jdGlvbiBzaG93RXJyb3IodHMsIGNtLCBtc2cpIHsKICAgIGlmICh0cy5vcHRpb25zLnNob3dFcnJvcikKICAgICAgdHMub3B0aW9ucy5zaG93RXJyb3IoY20sIG1zZyk7CiAgICBlbHNlCiAgICAgIHRlbXBUb29sdGlwKGNtLCBTdHJpbmcobXNnKSk7CiAgfQoKICBmdW5jdGlvbiBjbG9zZUFyZ0hpbnRzKHRzKSB7CiAgICBpZiAodHMuYWN0aXZlQXJnSGludHMpIHsgcmVtb3ZlKHRzLmFjdGl2ZUFyZ0hpbnRzKTsgdHMuYWN0aXZlQXJnSGludHMgPSBudWxsOyB9CiAgfQoKICBmdW5jdGlvbiBkb2NWYWx1ZSh0cywgZG9jKSB7CiAgICB2YXIgdmFsID0gZG9jLmRvYy5nZXRWYWx1ZSgpOwogICAgaWYgKHRzLm9wdGlvbnMuZmlsZUZpbHRlcikgdmFsID0gdHMub3B0aW9ucy5maWxlRmlsdGVyKHZhbCwgZG9jLm5hbWUsIGRvYy5kb2MpOwogICAgcmV0dXJuIHZhbDsKICB9CgogIC8vIFdvcmtlciB3cmFwcGVyCgogIGZ1bmN0aW9uIFdvcmtlclNlcnZlcih0cykgewogICAgdmFyIHdvcmtlciA9IG5ldyBXb3JrZXIodHMub3B0aW9ucy53b3JrZXJTY3JpcHQpOwogICAgd29ya2VyLnBvc3RNZXNzYWdlKHt0eXBlOiAiaW5pdCIsCiAgICAgICAgICAgICAgICAgICAgICAgIGRlZnM6IHRzLm9wdGlvbnMuZGVmcywKICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luczogdHMub3B0aW9ucy5wbHVnaW5zLAogICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHRzOiB0cy5vcHRpb25zLndvcmtlckRlcHN9KTsKICAgIHZhciBtc2dJZCA9IDAsIHBlbmRpbmcgPSB7fTsKCiAgICBmdW5jdGlvbiBzZW5kKGRhdGEsIGMpIHsKICAgICAgaWYgKGMpIHsKICAgICAgICBkYXRhLmlkID0gKyttc2dJZDsKICAgICAgICBwZW5kaW5nW21zZ0lkXSA9IGM7CiAgICAgIH0KICAgICAgd29ya2VyLnBvc3RNZXNzYWdlKGRhdGEpOwogICAgfQogICAgd29ya2VyLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGUpIHsKICAgICAgdmFyIGRhdGEgPSBlLmRhdGE7CiAgICAgIGlmIChkYXRhLnR5cGUgPT0gImdldEZpbGUiKSB7CiAgICAgICAgZ2V0RmlsZSh0cywgZGF0YS5uYW1lLCBmdW5jdGlvbihlcnIsIHRleHQpIHsKICAgICAgICAgIHNlbmQoe3R5cGU6ICJnZXRGaWxlIiwgZXJyOiBTdHJpbmcoZXJyKSwgdGV4dDogdGV4dCwgaWQ6IGRhdGEuaWR9KTsKICAgICAgICB9KTsKICAgICAgfSBlbHNlIGlmIChkYXRhLnR5cGUgPT0gImRlYnVnIikgewogICAgICAgIHdpbmRvdy5jb25zb2xlLmxvZyhkYXRhLm1lc3NhZ2UpOwogICAgICB9IGVsc2UgaWYgKGRhdGEuaWQgJiYgcGVuZGluZ1tkYXRhLmlkXSkgewogICAgICAgIHBlbmRpbmdbZGF0YS5pZF0oZGF0YS5lcnIsIGRhdGEuYm9keSk7CiAgICAgICAgZGVsZXRlIHBlbmRpbmdbZGF0YS5pZF07CiAgICAgIH0KICAgIH07CiAgICB3b3JrZXIub25lcnJvciA9IGZ1bmN0aW9uKGUpIHsKICAgICAgZm9yICh2YXIgaWQgaW4gcGVuZGluZykgcGVuZGluZ1tpZF0oZSk7CiAgICAgIHBlbmRpbmcgPSB7fTsKICAgIH07CgogICAgdGhpcy5hZGRGaWxlID0gZnVuY3Rpb24obmFtZSwgdGV4dCkgeyBzZW5kKHt0eXBlOiAiYWRkIiwgbmFtZTogbmFtZSwgdGV4dDogdGV4dH0pOyB9OwogICAgdGhpcy5kZWxGaWxlID0gZnVuY3Rpb24obmFtZSkgeyBzZW5kKHt0eXBlOiAiZGVsIiwgbmFtZTogbmFtZX0pOyB9OwogICAgdGhpcy5yZXF1ZXN0ID0gZnVuY3Rpb24oYm9keSwgYykgeyBzZW5kKHt0eXBlOiAicmVxIiwgYm9keTogYm9keX0sIGMpOyB9OwogIH0KfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/tern/worker.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovLyBkZWNsYXJlIGdsb2JhbDogdGVybiwgc2VydmVyCgp2YXIgc2VydmVyOwoKdGhpcy5vbm1lc3NhZ2UgPSBmdW5jdGlvbihlKSB7CiAgdmFyIGRhdGEgPSBlLmRhdGE7CiAgc3dpdGNoIChkYXRhLnR5cGUpIHsKICBjYXNlICJpbml0IjogcmV0dXJuIHN0YXJ0U2VydmVyKGRhdGEuZGVmcywgZGF0YS5wbHVnaW5zLCBkYXRhLnNjcmlwdHMpOwogIGNhc2UgImFkZCI6IHJldHVybiBzZXJ2ZXIuYWRkRmlsZShkYXRhLm5hbWUsIGRhdGEudGV4dCk7CiAgY2FzZSAiZGVsIjogcmV0dXJuIHNlcnZlci5kZWxGaWxlKGRhdGEubmFtZSk7CiAgY2FzZSAicmVxIjogcmV0dXJuIHNlcnZlci5yZXF1ZXN0KGRhdGEuYm9keSwgZnVuY3Rpb24oZXJyLCByZXFEYXRhKSB7CiAgICBwb3N0TWVzc2FnZSh7aWQ6IGRhdGEuaWQsIGJvZHk6IHJlcURhdGEsIGVycjogZXJyICYmIFN0cmluZyhlcnIpfSk7CiAgfSk7CiAgY2FzZSAiZ2V0RmlsZSI6CiAgICB2YXIgYyA9IHBlbmRpbmdbZGF0YS5pZF07CiAgICBkZWxldGUgcGVuZGluZ1tkYXRhLmlkXTsKICAgIHJldHVybiBjKGRhdGEuZXJyLCBkYXRhLnRleHQpOwogIGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvcigiVW5rbm93biBtZXNzYWdlIHR5cGU6ICIgKyBkYXRhLnR5cGUpOwogIH0KfTsKCnZhciBuZXh0SWQgPSAwLCBwZW5kaW5nID0ge307CmZ1bmN0aW9uIGdldEZpbGUoZmlsZSwgYykgewogIHBvc3RNZXNzYWdlKHt0eXBlOiAiZ2V0RmlsZSIsIG5hbWU6IGZpbGUsIGlkOiArK25leHRJZH0pOwogIHBlbmRpbmdbbmV4dElkXSA9IGM7Cn0KCmZ1bmN0aW9uIHN0YXJ0U2VydmVyKGRlZnMsIHBsdWdpbnMsIHNjcmlwdHMpIHsKICBpZiAoc2NyaXB0cykgaW1wb3J0U2NyaXB0cy5hcHBseShudWxsLCBzY3JpcHRzKTsKCiAgc2VydmVyID0gbmV3IHRlcm4uU2VydmVyKHsKICAgIGdldEZpbGU6IGdldEZpbGUsCiAgICBhc3luYzogdHJ1ZSwKICAgIGRlZnM6IGRlZnMsCiAgICBwbHVnaW5zOiBwbHVnaW5zCiAgfSk7Cn0KCnZhciBjb25zb2xlID0gewogIGxvZzogZnVuY3Rpb24odikgeyBwb3N0TWVzc2FnZSh7dHlwZTogImRlYnVnIiwgbWVzc2FnZTogdn0pOyB9Cn07Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/wrap/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/wrap/hardwrap.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CgogIHZhciBQb3MgPSBDb2RlTWlycm9yLlBvczsKCiAgZnVuY3Rpb24gZmluZFBhcmFncmFwaChjbSwgcG9zLCBvcHRpb25zKSB7CiAgICB2YXIgc3RhcnRSRSA9IG9wdGlvbnMucGFyYWdyYXBoU3RhcnQgfHwgY20uZ2V0SGVscGVyKHBvcywgInBhcmFncmFwaFN0YXJ0Iik7CiAgICBmb3IgKHZhciBzdGFydCA9IHBvcy5saW5lLCBmaXJzdCA9IGNtLmZpcnN0TGluZSgpOyBzdGFydCA+IGZpcnN0OyAtLXN0YXJ0KSB7CiAgICAgIHZhciBsaW5lID0gY20uZ2V0TGluZShzdGFydCk7CiAgICAgIGlmIChzdGFydFJFICYmIHN0YXJ0UkUudGVzdChsaW5lKSkgYnJlYWs7CiAgICAgIGlmICghL1xTLy50ZXN0KGxpbmUpKSB7ICsrc3RhcnQ7IGJyZWFrOyB9CiAgICB9CiAgICB2YXIgZW5kUkUgPSBvcHRpb25zLnBhcmFncmFwaEVuZCB8fCBjbS5nZXRIZWxwZXIocG9zLCAicGFyYWdyYXBoRW5kIik7CiAgICBmb3IgKHZhciBlbmQgPSBwb3MubGluZSArIDEsIGxhc3QgPSBjbS5sYXN0TGluZSgpOyBlbmQgPD0gbGFzdDsgKytlbmQpIHsKICAgICAgdmFyIGxpbmUgPSBjbS5nZXRMaW5lKGVuZCk7CiAgICAgIGlmIChlbmRSRSAmJiBlbmRSRS50ZXN0KGxpbmUpKSB7ICsrZW5kOyBicmVhazsgfQogICAgICBpZiAoIS9cUy8udGVzdChsaW5lKSkgYnJlYWs7CiAgICB9CiAgICByZXR1cm4ge2Zyb206IHN0YXJ0LCB0bzogZW5kfTsKICB9CgogIGZ1bmN0aW9uIGZpbmRCcmVha1BvaW50KHRleHQsIGNvbHVtbiwgd3JhcE9uLCBraWxsVHJhaWxpbmdTcGFjZSkgewogICAgZm9yICh2YXIgYXQgPSBjb2x1bW47IGF0ID4gMDsgLS1hdCkKICAgICAgaWYgKHdyYXBPbi50ZXN0KHRleHQuc2xpY2UoYXQgLSAxLCBhdCArIDEpKSkgYnJlYWs7CiAgICBpZiAoYXQgPT0gMCkgYXQgPSBjb2x1bW47CiAgICB2YXIgZW5kT2ZUZXh0ID0gYXQ7CiAgICBpZiAoa2lsbFRyYWlsaW5nU3BhY2UpCiAgICAgIHdoaWxlICh0ZXh0LmNoYXJBdChlbmRPZlRleHQgLSAxKSA9PSAiICIpIC0tZW5kT2ZUZXh0OwogICAgcmV0dXJuIHtmcm9tOiBlbmRPZlRleHQsIHRvOiBhdH07CiAgfQoKICBmdW5jdGlvbiB3cmFwUmFuZ2UoY20sIGZyb20sIHRvLCBvcHRpb25zKSB7CiAgICBmcm9tID0gY20uY2xpcFBvcyhmcm9tKTsgdG8gPSBjbS5jbGlwUG9zKHRvKTsKICAgIHZhciBjb2x1bW4gPSBvcHRpb25zLmNvbHVtbiB8fCA4MDsKICAgIHZhciB3cmFwT24gPSBvcHRpb25zLndyYXBPbiB8fCAvXHNcU3wtW15cLlxkXS87CiAgICB2YXIga2lsbFRyYWlsaW5nID0gb3B0aW9ucy5raWxsVHJhaWxpbmdTcGFjZSAhPT0gZmFsc2U7CiAgICB2YXIgY2hhbmdlcyA9IFtdLCBjdXJMaW5lID0gIiIsIGN1ck5vID0gZnJvbS5saW5lOwogICAgdmFyIGxpbmVzID0gY20uZ2V0UmFuZ2UoZnJvbSwgdG8sIGZhbHNlKTsKICAgIGlmICghbGluZXMubGVuZ3RoKSByZXR1cm4gbnVsbDsKICAgIHZhciBsZWFkaW5nU3BhY2UgPSBsaW5lc1swXS5tYXRjaCgvXlsgXHRdKi8pWzBdOwoKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyArK2kpIHsKICAgICAgdmFyIHRleHQgPSBsaW5lc1tpXSwgb2xkTGVuID0gY3VyTGluZS5sZW5ndGgsIHNwYWNlSW5zZXJ0ZWQgPSAwOwogICAgICBpZiAoY3VyTGluZSAmJiB0ZXh0ICYmICF3cmFwT24udGVzdChjdXJMaW5lLmNoYXJBdChjdXJMaW5lLmxlbmd0aCAtIDEpICsgdGV4dC5jaGFyQXQoMCkpKSB7CiAgICAgICAgY3VyTGluZSArPSAiICI7CiAgICAgICAgc3BhY2VJbnNlcnRlZCA9IDE7CiAgICAgIH0KICAgICAgdmFyIHNwYWNlVHJpbW1lZCA9ICIiOwogICAgICBpZiAoaSkgewogICAgICAgIHNwYWNlVHJpbW1lZCA9IHRleHQubWF0Y2goL15ccyovKVswXTsKICAgICAgICB0ZXh0ID0gdGV4dC5zbGljZShzcGFjZVRyaW1tZWQubGVuZ3RoKTsKICAgICAgfQogICAgICBjdXJMaW5lICs9IHRleHQ7CiAgICAgIGlmIChpKSB7CiAgICAgICAgdmFyIGZpcnN0QnJlYWsgPSBjdXJMaW5lLmxlbmd0aCA+IGNvbHVtbiAmJiBsZWFkaW5nU3BhY2UgPT0gc3BhY2VUcmltbWVkICYmCiAgICAgICAgICBmaW5kQnJlYWtQb2ludChjdXJMaW5lLCBjb2x1bW4sIHdyYXBPbiwga2lsbFRyYWlsaW5nKTsKICAgICAgICAvLyBJZiB0aGlzIGlzbid0IGJyb2tlbiwgb3IgaXMgYnJva2VuIGF0IGEgZGlmZmVyZW50IHBvaW50LCByZW1vdmUgb2xkIGJyZWFrCiAgICAgICAgaWYgKCFmaXJzdEJyZWFrIHx8IGZpcnN0QnJlYWsuZnJvbSAhPSBvbGRMZW4gfHwgZmlyc3RCcmVhay50byAhPSBvbGRMZW4gKyBzcGFjZUluc2VydGVkKSB7CiAgICAgICAgICBjaGFuZ2VzLnB1c2goe3RleHQ6IFtzcGFjZUluc2VydGVkID8gIiAiIDogIiJdLAogICAgICAgICAgICAgICAgICAgICAgICBmcm9tOiBQb3MoY3VyTm8sIG9sZExlbiksCiAgICAgICAgICAgICAgICAgICAgICAgIHRvOiBQb3MoY3VyTm8gKyAxLCBzcGFjZVRyaW1tZWQubGVuZ3RoKX0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjdXJMaW5lID0gbGVhZGluZ1NwYWNlICsgdGV4dDsKICAgICAgICAgICsrY3VyTm87CiAgICAgICAgfQogICAgICB9CiAgICAgIHdoaWxlIChjdXJMaW5lLmxlbmd0aCA+IGNvbHVtbikgewogICAgICAgIHZhciBicCA9IGZpbmRCcmVha1BvaW50KGN1ckxpbmUsIGNvbHVtbiwgd3JhcE9uLCBraWxsVHJhaWxpbmcpOwogICAgICAgIGNoYW5nZXMucHVzaCh7dGV4dDogWyIiLCBsZWFkaW5nU3BhY2VdLAogICAgICAgICAgICAgICAgICAgICAgZnJvbTogUG9zKGN1ck5vLCBicC5mcm9tKSwKICAgICAgICAgICAgICAgICAgICAgIHRvOiBQb3MoY3VyTm8sIGJwLnRvKX0pOwogICAgICAgIGN1ckxpbmUgPSBsZWFkaW5nU3BhY2UgKyBjdXJMaW5lLnNsaWNlKGJwLnRvKTsKICAgICAgICArK2N1ck5vOwogICAgICB9CiAgICB9CiAgICBpZiAoY2hhbmdlcy5sZW5ndGgpIGNtLm9wZXJhdGlvbihmdW5jdGlvbigpIHsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGFuZ2VzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgdmFyIGNoYW5nZSA9IGNoYW5nZXNbaV07CiAgICAgICAgY20ucmVwbGFjZVJhbmdlKGNoYW5nZS50ZXh0LCBjaGFuZ2UuZnJvbSwgY2hhbmdlLnRvKTsKICAgICAgfQogICAgfSk7CiAgICByZXR1cm4gY2hhbmdlcy5sZW5ndGggPyB7ZnJvbTogY2hhbmdlc1swXS5mcm9tLCB0bzogQ29kZU1pcnJvci5jaGFuZ2VFbmQoY2hhbmdlc1tjaGFuZ2VzLmxlbmd0aCAtIDFdKX0gOiBudWxsOwogIH0KCiAgQ29kZU1pcnJvci5kZWZpbmVFeHRlbnNpb24oIndyYXBQYXJhZ3JhcGgiLCBmdW5jdGlvbihwb3MsIG9wdGlvbnMpIHsKICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwogICAgaWYgKCFwb3MpIHBvcyA9IHRoaXMuZ2V0Q3Vyc29yKCk7CiAgICB2YXIgcGFyYSA9IGZpbmRQYXJhZ3JhcGgodGhpcywgcG9zLCBvcHRpb25zKTsKICAgIHJldHVybiB3cmFwUmFuZ2UodGhpcywgUG9zKHBhcmEuZnJvbSwgMCksIFBvcyhwYXJhLnRvIC0gMSksIG9wdGlvbnMpOwogIH0pOwoKICBDb2RlTWlycm9yLmNvbW1hbmRzLndyYXBMaW5lcyA9IGZ1bmN0aW9uKGNtKSB7CiAgICBjbS5vcGVyYXRpb24oZnVuY3Rpb24oKSB7CiAgICAgIHZhciByYW5nZXMgPSBjbS5saXN0U2VsZWN0aW9ucygpLCBhdCA9IGNtLmxhc3RMaW5lKCkgKyAxOwogICAgICBmb3IgKHZhciBpID0gcmFuZ2VzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgdmFyIHJhbmdlID0gcmFuZ2VzW2ldLCBzcGFuOwogICAgICAgIGlmIChyYW5nZS5lbXB0eSgpKSB7CiAgICAgICAgICB2YXIgcGFyYSA9IGZpbmRQYXJhZ3JhcGgoY20sIHJhbmdlLmhlYWQsIHt9KTsKICAgICAgICAgIHNwYW4gPSB7ZnJvbTogUG9zKHBhcmEuZnJvbSwgMCksIHRvOiBQb3MocGFyYS50byAtIDEpfTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc3BhbiA9IHtmcm9tOiByYW5nZS5mcm9tKCksIHRvOiByYW5nZS50bygpfTsKICAgICAgICB9CiAgICAgICAgaWYgKHNwYW4udG8ubGluZSA+PSBhdCkgY29udGludWU7CiAgICAgICAgYXQgPSBzcGFuLmZyb20ubGluZTsKICAgICAgICB3cmFwUmFuZ2UoY20sIHNwYW4uZnJvbSwgc3Bhbi50bywge30pOwogICAgICB9CiAgICB9KTsKICB9OwoKICBDb2RlTWlycm9yLmRlZmluZUV4dGVuc2lvbigid3JhcFJhbmdlIiwgZnVuY3Rpb24oZnJvbSwgdG8sIG9wdGlvbnMpIHsKICAgIHJldHVybiB3cmFwUmFuZ2UodGhpcywgZnJvbSwgdG8sIG9wdGlvbnMgfHwge30pOwogIH0pOwoKICBDb2RlTWlycm9yLmRlZmluZUV4dGVuc2lvbigid3JhcFBhcmFncmFwaHNJblJhbmdlIiwgZnVuY3Rpb24oZnJvbSwgdG8sIG9wdGlvbnMpIHsKICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwogICAgdmFyIGNtID0gdGhpcywgcGFyYXMgPSBbXTsKICAgIGZvciAodmFyIGxpbmUgPSBmcm9tLmxpbmU7IGxpbmUgPD0gdG8ubGluZTspIHsKICAgICAgdmFyIHBhcmEgPSBmaW5kUGFyYWdyYXBoKGNtLCBQb3MobGluZSwgMCksIG9wdGlvbnMpOwogICAgICBwYXJhcy5wdXNoKHBhcmEpOwogICAgICBsaW5lID0gcGFyYS50bzsKICAgIH0KICAgIHZhciBtYWRlQ2hhbmdlID0gZmFsc2U7CiAgICBpZiAocGFyYXMubGVuZ3RoKSBjbS5vcGVyYXRpb24oZnVuY3Rpb24oKSB7CiAgICAgIGZvciAodmFyIGkgPSBwYXJhcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkKICAgICAgICBtYWRlQ2hhbmdlID0gbWFkZUNoYW5nZSB8fCB3cmFwUmFuZ2UoY20sIFBvcyhwYXJhc1tpXS5mcm9tLCAwKSwgUG9zKHBhcmFzW2ldLnRvIC0gMSksIG9wdGlvbnMpOwogICAgfSk7CiAgICByZXR1cm4gbWFkZUNoYW5nZTsKICB9KTsKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/addon/wrap/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCEtLSBEVU1NWSBIVE1MIEZJTEUgLS0+]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/AUTHORS</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[TGlzdCBvZiBDb2RlTWlycm9yIGNvbnRyaWJ1dG9ycy4gVXBkYXRlZCBiZWZvcmUgZXZlcnkgcmVsZWFzZS4KCjRyMnIKQWFyb24gQnJvb2tzCkFiZSBGZXR0aWcKQWRhbSBBaG1lZApBZGFtIEtpbmcKYWRhbmxvYmF0bwpBZMOhbiBMb2JhdG8KQWRyaWFuIEFpY2huZXIKYWVyb3NvbgpBaG1hZCBBbWlyZWgKQWhtYWQgTS4gWmF3YXdpCmFob3dhcmQKQWtla3NhbmRyIE1vdHNqb25vdgpBbGJlcnRvIEdvbnrDoWxleiBQYWxvbW8KQWxiZXJ0byBQb3NlCkFsYmVydCBYaW5nCkFsZXhhbmRlciBQYXZsb3YKQWxleGFuZGVyIFNjaGVwYW5vdnNraQpBbGV4YW5kZXIgU2h2ZXRzCkFsZXhhbmRlciBTb2xvdnlvdgpBbGV4YW5kcmUgQmlxdWUKYWxleGV5LWsKQWxleCBQaWdnb3R0CkFtc3VsCkFteQpBbmFueWEgU2VuCmFuYXJhbgpBbmRlcnNNYWQKQW5kZXJzIE5hd3JvdGgKQW5kZXJzb24gTWVzcXVpdGEKQW5kcmUgdm9uIEhvdWNrCkFuZHJleSBMdXNobmlrb3YKQW5keSBKb3NsaW4KQW5keSBLaW1iYWxsCkFuZHkgTGkKYW5nZWxvemVycgphbmdlbG8uemVyckBnbWFpbC5jb20KQW5raXQgQWh1amEKQW5zZWwgU2FudG9zYQpBbnRob255IEdyaW1lcwpBbnRvbiBLb3ZhbHlvdgphcmVvcwphczNib3lhbgpBdG9taWNQYWdlcyBMTEMKQXR1bCBCaG91cmFza2FyCkF1cmVsaWFuIE9hbmNlYQpCYXN0aWFuIE11zIhsbGVyCkJlbSBKb25lcy1CZXkKYmVuYnJvCkJlbmkgQ2hlcm5pYXZza3ktUGFza2luCkJlbmphbWluIERlQ29zdGUKQmVuIEtlZW4KQmVybmhhcmQgU2lybGluZ2VyCkJlcnQgQ2hhbmcKQmlsbHkgTW9vbgpiaW5ueQpCIEtyaXNobmEgQ2hhaXRhbnlhCkJsYWluZSBHCmJvb215amVlCmJvcmF3am0KQnJhbmRvbiBGcm9ocwpCcmFuZG9uIFdhbWJvbGR0CkJyZXR0IFphbWlyCkJyaWFuIEdyaW5zdGVhZApCcmlhbiBTbGV0dGVuCkJydWNlIE1pdGNoZW5lcgpDaGFuZHJhIFNla2hhciBQeWRpCkNoYXJsZXMgU2tlbHRvbgpDaGVhaCBDaHUgWWVvdwpDaHJpcyBDb3lpZXIKQ2hyaXMgR3JhbmdlcgpDaHJpcyBIb3VzZWtuZWNodApDaHJpcyBNb3JnYW4KQ2hyaXN0b3BoZXIgQnJvd24KY2lhcmFuagpDb2RlQW5pbWFsCkNvbUZyZWVrCkN1cnRpcyBHYWdsaWFyZGkKZGFnc3RhCmRhaW5lcwpEYW4gSGViZXJkZW4KRGFuaWVsLCBEYW8gUXVhbmcgTWluaApEYW5pZWwgRmF1c3QKRGFuaWVsIEh1aWdlbnMKRGFuaWVsIEtKCkRhbmllbCBOZWVsCkRhbmllbCBQYXJuZWxsCkRhbm55IFlvbwpEYXJpdXMgUm9iZXJ0cwpEYXZlIE15ZXJzCkRhdmlkIE1pZ25vdApEYXZpZCBQYXRoYWtqZWUKZGVlYnVnZ2VyCkRlZXAgVGhvdWdodApkaWduaWZpZWRxdWlyZQpkb21hZ29qNDEyCkRvbWluYXRvcjAwOApEb21pemlvIERlbWljaGVsaXMKRG91ZyBXaWtsZQpEcmV3IEJyYXRjaGVyCkRyZXcgSGludHoKRHJldyBLaG91cnkKRHJvciBCRwpkdXJhbG9nCmVib3JkZW4KZWRzaGFycApla2hhbGVkCkVuYW0gTWlqYmFoIE5vb3IKRXJpYyBBbGxhbQpldXN0YXMKRmFiaWVuIE8nQ2Fycm9sbApGYWJpbyBaZW5kaGkgTmFnYW8KRmFpemEgQWxzYWllZApGYXVudGxlcm95CmZidWNoaW5nZXIKZmVpemhhbmczNjUKRmVsaXBlIExhbGFubmUKRmVsaXggUmFhYgpGaWxpcCBOb2V0emVsCmZsYWNrCkZvcmJlc0xpbmRlc2F5CkZvcmJlcyBMaW5kZXNheQpGb3JkX0xhd25tb3dlcgpGcmFuayBXaWVnYW5kCkdhYnJpZWwgSG9ybmVyCkdhYnJpZWwgTmFobWlhcwpnYWxhbWJhbGF6cwpHYXV0YW0gTWVodGEKR2VyZ2VseSBIZWd5a296aQpHbGVubiBKb3JkZQpHbGVubiBSdWVobGUKR29sZXZrYQpHb3Jkb24gU21pdGgKR3JhbnQgU2tpbm5lcgpncmVlbmdpYW50Ckd1aWxsYXVtZSBNYXNzZcyBCkd1aWxsYXVtZSBNYXNzw6kKR3VzdGF2byBSb2RyaWd1ZXMKSGFucyBFbmdlbApIYXJkZXN0Ckhhc2FuIEthcmFoYW4KaGl0c3RoaW5ncwpIb2Nkb2MKSWFuIEJlY2sKSWFuIERpY2tpbnNvbgpJYW4gV2Vocm1hbgpJYW4gV2V0aGVyYmVlCkljZSBXaGl0ZQpJQ0hJS0FXQSwgWXVqaQppbHZhbGxlCkluZ28gUmljaHRlcgpJcmFrbGkgR296YWxpc2h2aWxpCkl2YW4gS3Vybm9zb3YKSmFjb2IgTGVlCkpha29iIE1pbGFuZApKYWt1YiBWcmFuYQpKYW1lcyBDYW1wb3MKSmFtZXMgVGhvcm5lCkphbWllIEhpbGwKSmFuIEpvbmdib29tCmphbmtlcm9tbmVzCkphbiBLZXJvbW5lcwpKYW4gT2R2YXJrbwpKYW4gVC4gU290dApKYXNvbgpKYXNvbiBHcm91dApKYXNvbiBKb2huc3RvbgpKYXNvbiBTYW4gSm9zZQpKYXNvbiBTaWVma2VuCkpheWRlZXAgU29sYW5raQpKZWFuIEJvdXNzaWVyCmplZmZrZW50b24KSmVmZiBQaWNraGFyZHQKamVtIChncmFwaGl0ZSkKSm9jaGVuIEJlcmdlcgpKb2hhbiBBc2sKSm9obiBDb25ub3IKSm9obiBMZWVzLU1pbGxlcgpKb2huIFNuZWxzb24KSm9obiBWYW4gRGVyIExvbwpKb25hdGhhbiBNYWxtYXVkCmpvbmdhbGxvd2F5CkpvbiBNYWxtYXVkCkpvb3N0LVdpbSBCb2VrZXN0ZWlqbgpKb3NlcGggUGVjb3Jhcm8KSm9zaHVhIE5ld21hbgpKb3NoIFdhdHptYW4Kam90cwpqc29vamVvbgpKdWFuIEJlbmF2aWRlcyBSb21lcm8KSnVjb3ZzY2hpIENvbnN0YW50aW4KSnVobyBWdW9yaQpqd2FsbGVyc0BnbWFpbC5jb20Ka2FuaWdhCktlbiBOZXdtYW4KS2VuIFJvY2tvdApLZXZpbiBTYXdpY2tpCktsYXVzIFNpbHZlaXJhCktvaCBaaSBIYW4sIENsaWZmCmtvbWFraW5vCktvbnN0YW50aW4gTG9wdWhpbgprb29wcwprcy1pZndhcmUKa3ViZWxzbWllY2kKTGFubnkKTGFzemxvIFZpZGFjcwpsZWFmIGNvcmNvcmFuCkxlb25pZCBLaGFjaGF0dXJvdgpMZW9ueWEgS2hhY2hhdHVyb3YKTGlhbSBOZXdtYW4KTE0KTG9yZW56byBTdG9ha2VzCkx1Y2lhbm8gTG9uZ28KbHluc2NoaW56ZXIKTWFrc2ltIExpbgpNYWtzeW0gVGFyYW4KTWFsYXkgTWFqaXRoaWEKTWFudWVsIFJlZ28gQ2FzYXNub3ZhcwpNYXJhdCBEcmVpemluCk1hcmNvIEF1csOpbGlvCk1hcmNvIE11bml6YWdhCk1hcmN1cyBCb2ludG9uCk1hcmlqbiBIYXZlcmJla2UKTWFyaW8gUGlldHNjaApNYXJrIExlbnRjem5lcgpNYXJrbyBCb25hY2kKTWFydGluIEJhbGVrCk1hcnTDrW4gR2FpdMOhbgpNYXJ0aW4gSGFzb8WICk1hc29uIE1hbG9uZQpNYXRldXN6IFBhcHJvY2tpCk1hdGhpYXMgQnluZW5zCm1hdHMgY3JvbnF2aXN0Ck1hdHRoZXcgQmVhbGUKTWF0dGhpYXMgQlVTU09OTklFUgpNYXR0IE1jRG9uYWxkCk1hdHQgUGFzcwpNYXR0IFNhY2tzCm1hdXJpY2lvCk1heGltaWxpYW4gSGlscwpNYXhpbSBLcmFldgpNYXggS2lyc2NoCm1iYXJraGF1Ck1ldGF0aGVvcwpNaWNhaCBEdWJpbmtvCk1pY2hhZWwgTGVoZW5iYXVlcgpNaWNoYWVsIFpob3UKTWlnaHR5IEd1YXZhCk1pZ3VlbCBDYXN0aWxsbwpNaWtlCk1pa2UgQnJldm9vcnQKTWlrZSBEaWF6Ck1pa2UgSXZhbm92Ck1pa2UgS2FkaW4KTWluUksKTWlyYWN1bGl4ODcKbWlzZm8KbWxvZ2lub3YKbXBzCm10YXJhbi1nb29nbGUKTmFyY2lzbyBKYXJhbWlsbG8KTmF0aGFuIFdpbGxpYW1zCm5kcgpuZXJiZXJ0Cm5leHRyZXZpc2lvbgpuZ3VpbGxhdW1pbgpOZyBaaGkgQW4KTmljaG9sYXMgQm9sbHdlZwpOaWVscyB2YW4gR3JvbmluZ2VuCk5pa2l0YSBCZWxvZ2xhem92Ck5pa2l0YSBWYXNpbHlldgpOaWtvbGF5IEtvc3RvdgpuaWxwMGludGVyCm5sd2lsbGlhCnBhYmxvClBhZ2UKUGFudXBvbmcgUGFzdXBhdApwYXJpcwpQYXRpbCBBcnBpdGgKUGF0cmljayBTdHJhd2Rlcm1hbgpQYXVsIEdhcnZpbgpQYXVsIEl2YW5vdgpQYXZlbCBGZWxkbWFuClBhdmVsIFN0cmFzaGtpbgpQYXdlxYIgQmFydGtpZXdpY3oKcGV0ZWd1aGwKUGV0ZXIgRmx5bm4KcGV0ZXJrcm9vbgpQZXRlciBLcm9vbgpwcmFzYW50aGoKUHJhc2FudGggSgpSYWRlayBQacOzcmtvd3NraQpSYWh1bApSYW5keSBFZG11bmRzClJhc211cyBFcmlrIFZvZWwgSmVuc2VuClJpY2hhcmQgdmFuIGRlciBNZWVyClJpY2hhcmQgWi5ILiBXYW5nClJvYmVydG8gQWJkZWxrYWRlciBNYXJ0w61uZXogUMOpcmV6CnJvYmVydG9wMjMKUm9iZXJ0IFBsdW1tZXIKUnVzbGFuIE9zbWFub3YKUnlhbiBQcmlvcgpzYWJhY2EKU2FtdWVsIEFpbnN3b3J0aApzYW5kZWVwc2hldHR5ClNhbmRlciBBS0EgUmVkc2FuZHJvCnNhbnRlYwpTYXNjaGEgUGVpbGlja2UKc2F0Y2htb3J1bgpzYXRoeWFtb29ydGhpClNDTElOSUNcamRlY2tlcgpTZWJhc3RpYW4gWmFoYQpzaGF1bmQKc2hhdW4gZ2lsY2hyaXN0ClNoYXduIEEKc2hlb3BvcnkKU2hpdiBEZWVwYWsKU2htdWVsIEVuZ2xhcmQKU2h1YmhhbSBKYWluCnNvbGl0b240CnNvbnNvbgpzcGFzdG9yZWxsaQpzcmFqYW5wYWxpd2FsClN0YW5pc2xhdiBPYXNlcmVsZQpTdGFzIEtvYnphcgpTdGVmYW4gQm9yc2plClN0ZWZmZW4gQmV5ZXIKU3RldmUgTydIYXJhCnN0b3Nrb3YKVGFoYSBKYWhhbmdpcgpUYWt1amkgU2hpbW9rYXdhClRhcm1pbAp0ZmpnZW9yZ2UKVGhhZGRlZSBUeWwKdGhpbmsKVGhvbWFzIER2b3JuaWsKVGhvbWFzIFNjaG1pZApUaW0gQWxieQpUaW0gQmF1bWFubgpUaW1vdGh5IEZhcnJlbGwKVGltb3RoeSBIYXRjaGVyClRvYmlhc0JnClRvbWFzLUEKVG9tYXMgVmFyYW5lY2thcwpUb20gRXJpayBTdMO4d2VyClRvbSBNYWNXcmlnaHQKVG9ueSBKaWFuClRyYXZpcyBIZXBwZQpUcmlhbmdsZTcxNwp0d2lma2FrClZlc3RpbWlyIE1hcmtvdgp2ZgpWaW5jZW50IFdvbwpWb2xrZXIgTWlzY2hlCndlbmxpCldlc2xleSBXaXNlcgpXaWxsaWFtIEphbWllc29uCldpbGxpYW0gU3RlaW4KV29qdGVrIFB0YWsKWGF2aWVyIE1lbmRlegpZTkggV2ViZGV2Cll1bmNoaSBMdW8KWXV2aSBQYW5kYQpaYWNoYXJ5IERyZW1hbm4KenppdW5pCumtj+m5j+WImgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/bin/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/bin/authors.sh</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[IyBDb21iaW5lIGV4aXN0aW5nIGxpc3Qgb2YgYXV0aG9ycyB3aXRoIGV2ZXJ5b25lIGtub3duIGluIGdpdCwgc29ydCwgYWRkIGhlYWRlci4KdGFpbCAtLWxpbmVzPSszIEFVVEhPUlMgPiBBVVRIT1JTLnRtcApnaXQgbG9nIC0tZm9ybWF0PSclYU4nID4+IEFVVEhPUlMudG1wCmVjaG8gLWUgIkxpc3Qgb2YgQ29kZU1pcnJvciBjb250cmlidXRvcnMuIFVwZGF0ZWQgYmVmb3JlIGV2ZXJ5IHJlbGVhc2UuXG4iID4gQVVUSE9SUwpzb3J0IC11IEFVVEhPUlMudG1wID4+IEFVVEhPUlMKcm0gLWYgQVVUSE9SUy50bXAK]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/bin/compress</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[IyEvdXNyL2Jpbi9lbnYgbm9kZQoKLy8gQ29tcHJlc3Npb24gaGVscGVyIGZvciBDb2RlTWlycm9yCi8vCi8vIEV4YW1wbGU6Ci8vCi8vICAgYmluL2NvbXByZXNzIGNvZGVtaXJyb3IgcnVubW9kZSBqYXZhc2NyaXB0IHhtbAovLwovLyBXaWxsIHRha2UgbGliL2NvZGVtaXJyb3IuanMsIGFkZG9uL3J1bm1vZGUvcnVubW9kZS5qcywKLy8gbW9kZS9qYXZhc2NyaXB0L2phdmFzY3JpcHQuanMsIGFuZCBtb2RlL3htbC94bWwuanMsIHJ1biB0aGVtIHRob3VnaAovLyB0aGUgb25saW5lIG1pbmlmaWVyIGF0IGh0dHA6Ly9tYXJpam5oYXZlcmJla2UubmwvdWdsaWZ5anMsIGFuZCBzcGl0Ci8vIG91dCB0aGUgcmVzdWx0LgovLwovLyAgIGJpbi9jb21wcmVzcyBjb2RlbWlycm9yIC0tbG9jYWwgL3BhdGgvdG8vYmluL1VnbGlmeUpTCi8vCi8vIFdpbGwgdXNlIGEgbG9jYWwgbWluaWZpZXIgaW5zdGVhZCBvZiB0aGUgb25saW5lIGRlZmF1bHQgb25lLgovLwovLyBTY3JpcHQgZmlsZXMgYXJlIHNwZWNpZmllZCB3aXRob3V0IC5qcyBlbmRpbmcuIFByZWZpeGluZyB0aGVtIHdpdGgKLy8gdGhlaXIgZnVsbCAobG9jYWwpIHBhdGggaXMgb3B0aW9uYWwuIFNvIHlvdSBtYXkgc2F5IGxpYi9jb2RlbWlycm9yCi8vIG9yIG1vZGUveG1sL3htbCB0byBiZSBtb3JlIHByZWNpc2UuIEluIGZhY3QsIGV2ZW4gdGhlIC5qcyBzdWZmaXgKLy8gbWF5IGJlIHNwZWZpY2llZCwgaWYgd2FudGVkLgoKInVzZSBzdHJpY3QiOwoKdmFyIGZzID0gcmVxdWlyZSgiZnMiKTsKCmZ1bmN0aW9uIGhlbHAob2spIHsKICBjb25zb2xlLmxvZygidXNhZ2U6ICIgKyBwcm9jZXNzLmFyZ3ZbMV0gKyAiIFstLWxvY2FsIC9wYXRoL3RvL3VnbGlmeWpzXSBmaWxlcy4uLiIpOwogIHByb2Nlc3MuZXhpdChvayA/IDAgOiAxKTsKfQoKdmFyIGxvY2FsID0gbnVsbCwgYXJncyA9IFtdLCBleHRyYUFyZ3MgPSBudWxsLCBmaWxlcyA9IFtdLCBibG9iID0gIiI7Cgpmb3IgKHZhciBpID0gMjsgaSA8IHByb2Nlc3MuYXJndi5sZW5ndGg7ICsraSkgewogIHZhciBhcmcgPSBwcm9jZXNzLmFyZ3ZbaV07CiAgaWYgKGFyZyA9PSAiLS1sb2NhbCIgJiYgaSArIDEgPCBwcm9jZXNzLmFyZ3YubGVuZ3RoKSB7CiAgICB2YXIgcGFydHMgPSBwcm9jZXNzLmFyZ3ZbKytpXS5zcGxpdCgvXHMrLyk7CiAgICBsb2NhbCA9IHBhcnRzWzBdOwogICAgZXh0cmFBcmdzID0gcGFydHMuc2xpY2UoMSk7CiAgICBpZiAoIWV4dHJhQXJncy5sZW5ndGgpIGV4dHJhQXJncyA9IFsiLWMiLCAiLW0iXTsKICB9IGVsc2UgaWYgKGFyZyA9PSAiLS1oZWxwIikgewogICAgaGVscCh0cnVlKTsKICB9IGVsc2UgaWYgKGFyZ1swXSAhPSAiLSIpIHsKICAgIGZpbGVzLnB1c2goe25hbWU6IGFyZywgcmU6IG5ldyBSZWdFeHAoIig/OlxcL3xeKSIgKyBhcmcgKyAoL1wuanMkLy50ZXN0KGFyZykgPyAiJCIgOiAiXFwuanMkIikpfSk7CiAgfSBlbHNlIGhlbHAoZmFsc2UpOwp9CgpmdW5jdGlvbiB3YWxrKGRpcikgewogIGZzLnJlYWRkaXJTeW5jKGRpcikuZm9yRWFjaChmdW5jdGlvbihmbmFtZSkgewogICAgaWYgKC9eW19cLl0vLnRlc3QoZm5hbWUpKSByZXR1cm47CiAgICB2YXIgZmlsZSA9IGRpciArIGZuYW1lOwogICAgaWYgKGZzLnN0YXRTeW5jKGZpbGUpLmlzRGlyZWN0b3J5KCkpIHJldHVybiB3YWxrKGZpbGUgKyAiLyIpOwogICAgaWYgKGZpbGVzLnNvbWUoZnVuY3Rpb24oc3BlYywgaSkgewogICAgICB2YXIgbWF0Y2ggPSBzcGVjLnJlLnRlc3QoZmlsZSk7CiAgICAgIGlmIChtYXRjaCkgZmlsZXMuc3BsaWNlKGksIDEpOwogICAgICByZXR1cm4gbWF0Y2g7CiAgICB9KSkgewogICAgICBpZiAobG9jYWwpIGFyZ3MucHVzaChmaWxlKTsKICAgICAgZWxzZSBibG9iICs9IGZzLnJlYWRGaWxlU3luYyhmaWxlLCAidXRmOCIpOwogICAgfQogIH0pOwp9Cgp3YWxrKCJsaWIvIik7CndhbGsoImFkZG9uLyIpOwp3YWxrKCJtb2RlLyIpOwoKaWYgKCFsb2NhbCAmJiAhYmxvYikgaGVscChmYWxzZSk7CgppZiAoZmlsZXMubGVuZ3RoKSB7CiAgY29uc29sZS5sb2coIlNvbWUgc3BlZmljaWVkIGZpbGVzIHdlcmUgbm90IGZvdW5kOiAiICsKICAgICAgICAgICAgICBmaWxlcy5tYXAoZnVuY3Rpb24oYSl7cmV0dXJuIGEubmFtZTt9KS5qb2luKCIsICIpKTsKICBwcm9jZXNzLmV4aXQoMSk7Cn0KICAKaWYgKGxvY2FsKSB7CiAgcmVxdWlyZSgiY2hpbGRfcHJvY2VzcyIpLnNwYXduKGxvY2FsLCBhcmdzLmNvbmNhdChleHRyYUFyZ3MpLCB7c3RkaW86IFsiaWdub3JlIiwgcHJvY2Vzcy5zdGRvdXQsIHByb2Nlc3Muc3RkZXJyXX0pOwp9IGVsc2UgewogIHZhciBkYXRhID0gbmV3IEJ1ZmZlcigianNfY29kZT0iICsgcmVxdWlyZSgicXVlcnlzdHJpbmciKS5lc2NhcGUoYmxvYiksICJ1dGY4Iik7CiAgdmFyIHJlcSA9IHJlcXVpcmUoImh0dHAiKS5yZXF1ZXN0KHsKICAgIGhvc3Q6ICJtYXJpam5oYXZlcmJla2UubmwiLAogICAgcG9ydDogODAsCiAgICBtZXRob2Q6ICJQT1NUIiwKICAgIHBhdGg6ICIvdWdsaWZ5anMiLAogICAgaGVhZGVyczogeyJjb250ZW50LXR5cGUiOiAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwKICAgICAgICAgICAgICAiY29udGVudC1sZW5ndGgiOiBkYXRhLmxlbmd0aH0KICB9KTsKICByZXEub24oInJlc3BvbnNlIiwgZnVuY3Rpb24ocmVzcCkgewogICAgcmVzcC5vbigiZGF0YSIsIGZ1bmN0aW9uIChjaHVuaykgeyBwcm9jZXNzLnN0ZG91dC53cml0ZShjaHVuayk7IH0pOwogIH0pOwogIHJlcS5lbmQoZGF0YSk7Cn0K]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/bin/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCEtLSBEVU1NWSBIVE1MIEZJTEUgLS0+]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/bin/lint</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[IyEvdXNyL2Jpbi9lbnYgbm9kZQoKdmFyIGxpbnQgPSByZXF1aXJlKCIuLi90ZXN0L2xpbnQvbGludCIpLAogICAgcGF0aCA9IHJlcXVpcmUoInBhdGgiKTsKCmlmIChwcm9jZXNzLmFyZ3YubGVuZ3RoID4gMikgewogIGxpbnQuY2hlY2tEaXIocHJvY2Vzcy5hcmd2WzJdKTsKfSBlbHNlIHsKICBwcm9jZXNzLmNoZGlyKHBhdGgucmVzb2x2ZShfX2Rpcm5hbWUsICIuLiIpKTsKICBsaW50LmNoZWNrRGlyKCJsaWIiKTsKICBsaW50LmNoZWNrRGlyKCJtb2RlIik7CiAgbGludC5jaGVja0RpcigiYWRkb24iKTsKICBsaW50LmNoZWNrRGlyKCJrZXltYXAiKTsKfQoKcHJvY2Vzcy5leGl0KGxpbnQuc3VjY2VzcygpID8gMCA6IDEpOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/bin/release</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[IyEvdXNyL2Jpbi9lbnYgbm9kZQoKdmFyIGZzID0gcmVxdWlyZSgiZnMiKSwgY2hpbGQgPSByZXF1aXJlKCJjaGlsZF9wcm9jZXNzIik7Cgp2YXIgbnVtYmVyLCBidW1wT25seTsKCmZvciAodmFyIGkgPSAyOyBpIDwgcHJvY2Vzcy5hcmd2Lmxlbmd0aDsgaSsrKSB7CiAgaWYgKHByb2Nlc3MuYXJndltpXSA9PSAiLWJ1bXAiKSBidW1wT25seSA9IHRydWU7CiAgZWxzZSBpZiAoL15cZCtcLlxkK1wuXGQrJC8udGVzdChwcm9jZXNzLmFyZ3ZbaV0pKSBudW1iZXIgPSBwcm9jZXNzLmFyZ3ZbaV07CiAgZWxzZSB7IGNvbnNvbGUubG9nKCJCb2d1cyBjb21tYW5kIGxpbmUgYXJnOiAiICsgcHJvY2Vzcy5hcmd2W2ldKTsgcHJvY2Vzcy5leGl0KDEpOyB9Cn0KCmlmICghbnVtYmVyKSB7IGNvbnNvbGUubG9nKCJNdXN0IGdpdmUgYSB2ZXJzaW9uIik7IHByb2Nlc3MuZXhpdCgxKTsgfQoKZnVuY3Rpb24gcmV3cml0ZShmaWxlLCBmKSB7CiAgZnMud3JpdGVGaWxlU3luYyhmaWxlLCBmKGZzLnJlYWRGaWxlU3luYyhmaWxlLCAidXRmOCIpKSwgInV0ZjgiKTsKfQoKcmV3cml0ZSgibGliL2NvZGVtaXJyb3IuanMiLCBmdW5jdGlvbihsaWIpIHsKICByZXR1cm4gbGliLnJlcGxhY2UoL0NvZGVNaXJyb3JcLnZlcnNpb24gPSAiXGQrXC5cZCtcLlxkKyIvLAogICAgICAgICAgICAgICAgICAgICAiQ29kZU1pcnJvci52ZXJzaW9uID0gXCIiICsgbnVtYmVyICsgIlwiIik7Cn0pOwpmdW5jdGlvbiByZXdyaXRlSlNPTihwYWNrKSB7CiAgcmV0dXJuIHBhY2sucmVwbGFjZSgvInZlcnNpb24iOiJcZCtcLlxkK1wuXGQrIi8sICJcInZlcnNpb25cIjpcIiIgKyBudW1iZXIgKyAiXCIiKTsKfQpyZXdyaXRlKCJwYWNrYWdlLmpzb24iLCByZXdyaXRlSlNPTik7CnJld3JpdGUoImJvd2VyLmpzb24iLCByZXdyaXRlSlNPTik7CnJld3JpdGUoImRvYy9tYW51YWwuaHRtbCIsIGZ1bmN0aW9uKG1hbnVhbCkgewogIHJldHVybiBtYW51YWwucmVwbGFjZSgvPnZlcnNpb24gXGQrXC5cZCtcLlxkKzxcL3NwYW4+LywgIj52ZXJzaW9uICIgKyBudW1iZXIgKyAiPC9zcGFuPiIpOwp9KTsKCmlmIChidW1wT25seSkgcHJvY2Vzcy5leGl0KDApOwoKY2hpbGQuZXhlYygiYmFzaCBiaW4vYXV0aG9ycy5zaCIsIGZ1bmN0aW9uKCl7fSk7Cgp2YXIgc2ltcGxlID0gbnVtYmVyLnNsaWNlKDAsIG51bWJlci5sYXN0SW5kZXhPZigiLiIpKTsKCnJld3JpdGUoImRvYy9jb21wcmVzcy5odG1sIiwgZnVuY3Rpb24oY21wKSB7CiAgcmV0dXJuIGNtcC5yZXBsYWNlKC88b3B0aW9uIHZhbHVlPSJodHRwOlwvXC9jb2RlbWlycm9yLm5ldFwvIj5IRUFEPFwvb3B0aW9uPi8sCiAgICAgICAgICAgICAgICAgICAgICI8b3B0aW9uIHZhbHVlPVwiaHR0cDovL2NvZGVtaXJyb3IubmV0L1wiPkhFQUQ8L29wdGlvbj5cbiAgICAgICAgPG9wdGlvbiB2YWx1ZT1cImh0dHA6Ly9tYXJpam5oYXZlcmJla2UubmwvZ2l0L2NvZGVtaXJyb3I/YT1ibG9iX3BsYWluO2hiPSIgKyBudW1iZXIgKyAiO2Y9XCI+IiArIHNpbXBsZSArICI8L29wdGlvbj4iKTsKfSk7CgpyZXdyaXRlKCJpbmRleC5odG1sIiwgZnVuY3Rpb24oaW5kZXgpIHsKICByZXR1cm4gaW5kZXgucmVwbGFjZSgvPHN0cm9uZz52ZXJzaW9uIFxkK1wuXGQrPFwvc3Ryb25nPi8sCiAgICAgICAgICAgICAgICAgICAgICAgIjxzdHJvbmc+dmVyc2lvbiAiICsgc2ltcGxlICsgIjwvc3Ryb25nPiIpOwp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/bin/source-highlight</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[IyEvdXNyL2Jpbi9lbnYgbm9kZQoKLy8gU2ltcGxlIGNvbW1hbmQtbGluZSBjb2RlIGhpZ2hsaWdodGluZyB0b29sLiBSZWFkcyBjb2RlIGZyb20gc3RkaW4sCi8vIHNwaXRzIGh0bWwgdG8gc3Rkb3V0LiBGb3IgZXhhbXBsZToKLy8KLy8gICBlY2hvICdmdW5jdGlvbiBmb28oYSkgeyByZXR1cm4gYTsgfScgfCBiaW4vc291cmNlLWhpZ2hsaWdodCAtcyBqYXZhc2NyaXB0Ci8vICAgYmluL3NvdXJjZS1oaWdobGlnaHQgLXMgCgp2YXIgZnMgPSByZXF1aXJlKCJmcyIpOwoKdmFyIENvZGVNaXJyb3IgPSByZXF1aXJlKCIuLi9hZGRvbi9ydW5tb2RlL3J1bm1vZGUubm9kZS5qcyIpOwpyZXF1aXJlKCIuLi9tb2RlL21ldGEuanMiKTsKCnZhciBzUG9zID0gcHJvY2Vzcy5hcmd2LmluZGV4T2YoIi1zIik7CmlmIChzUG9zID09IC0xIHx8IHNQb3MgPT0gcHJvY2Vzcy5hcmd2Lmxlbmd0aCAtIDEpIHsKICAgY29uc29sZS5lcnJvcigiVXNhZ2U6IHNvdXJjZS1oaWdobGlnaHQgLXMgbGFuZ3VhZ2UiKTsKICAgcHJvY2Vzcy5leGl0KDEpOwp9CnZhciBsYW5nID0gcHJvY2Vzcy5hcmd2W3NQb3MgKyAxXS50b0xvd2VyQ2FzZSgpLCBtb2RlTmFtZSA9IGxhbmc7CkNvZGVNaXJyb3IubW9kZUluZm8uZm9yRWFjaChmdW5jdGlvbihpbmZvKSB7CiAgaWYgKGluZm8ubWltZSA9PSBsYW5nKSB7CiAgICBtb2RlTmFtZSA9IGluZm8ubW9kZTsKICB9IGVsc2UgaWYgKGluZm8ubmFtZS50b0xvd2VyQ2FzZSgpID09IGxhbmcpIHsKICAgIG1vZGVOYW1lID0gaW5mby5tb2RlOwogICAgbGFuZyA9IGluZm8ubWltZTsKICB9Cn0pOwoKaWYgKCFDb2RlTWlycm9yLm1vZGVzW21vZGVOYW1lXSkKICByZXF1aXJlKCIuLi9tb2RlLyIgKyBtb2RlTmFtZSArICIvIiArIG1vZGVOYW1lICsgIi5qcyIpOwoKZnVuY3Rpb24gZXNjKHN0cikgewogIHJldHVybiBzdHIucmVwbGFjZSgvWzwmXS9nLCBmdW5jdGlvbihjaCkgeyByZXR1cm4gY2ggPT0gIiYiID8gIiZhbXA7IiA6ICImbHQ7IjsgfSk7Cn0KCnZhciBjb2RlID0gZnMucmVhZEZpbGVTeW5jKCIvZGV2L3N0ZGluIiwgInV0ZjgiKTsKdmFyIGN1clN0eWxlID0gbnVsbCwgYWNjdW0gPSAiIjsKZnVuY3Rpb24gZmx1c2goKSB7CiAgaWYgKGN1clN0eWxlKSBwcm9jZXNzLnN0ZG91dC53cml0ZSgiPHNwYW4gY2xhc3M9XCIiICsgY3VyU3R5bGUucmVwbGFjZSgvKF58XHMrKS9nLCAiJDFjbS0iKSArICJcIj4iICsgZXNjKGFjY3VtKSArICI8L3NwYW4+Iik7CiAgZWxzZSBwcm9jZXNzLnN0ZG91dC53cml0ZShlc2MoYWNjdW0pKTsKfQoKQ29kZU1pcnJvci5ydW5Nb2RlKGNvZGUsIGxhbmcsIGZ1bmN0aW9uKHRleHQsIHN0eWxlKSB7CiAgaWYgKHN0eWxlICE9IGN1clN0eWxlKSB7CiAgICBmbHVzaCgpOwogICAgY3VyU3R5bGUgPSBzdHlsZTsgYWNjdW0gPSB0ZXh0OwogIH0gZWxzZSB7CiAgICBhY2N1bSArPSB0ZXh0OwogIH0KfSk7CmZsdXNoKCk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/bower.json</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ewogICJuYW1lIjogImNvZGVtaXJyb3IiLAogICJ2ZXJzaW9uIjoiNC40LjAiLAogICJtYWluIjogWyJsaWIvY29kZW1pcnJvci5qcyIsICJsaWIvY29kZW1pcnJvci5jc3MiXSwKICAiaWdub3JlIjogWwogICAgIioqLy4qIiwKICAgICJub2RlX21vZHVsZXMiLAogICAgImNvbXBvbmVudHMiLAogICAgImJpbiIsCiAgICAiZGVtbyIsCiAgICAiZG9jIiwKICAgICJ0ZXN0IiwKICAgICJpbmRleC5odG1sIiwKICAgICJwYWNrYWdlLmpzb24iCiAgXQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/CONTRIBUTING.md</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[IyBIb3cgdG8gY29udHJpYnV0ZQoKLSBbR2V0dGluZyBoZWxwXSgjZ2V0dGluZy1oZWxwLSkKLSBbU3VibWl0dGluZyBidWcgcmVwb3J0c10oI3N1Ym1pdHRpbmctYnVnLXJlcG9ydHMtKQotIFtDb250cmlidXRpbmcgY29kZV0oI2NvbnRyaWJ1dGluZy1jb2RlLSkKCiMjIEdldHRpbmcgaGVscAoKQ29tbXVuaXR5IGRpc2N1c3Npb24sIHF1ZXN0aW9ucywgYW5kIGluZm9ybWFsIGJ1ZyByZXBvcnRpbmcgaXMgZG9uZSBvbiB0aGUKW0NvZGVNaXJyb3IgR29vZ2xlIGdyb3VwXShodHRwOi8vZ3JvdXBzLmdvb2dsZS5jb20vZ3JvdXAvY29kZW1pcnJvcikuCgojIyBTdWJtaXR0aW5nIGJ1ZyByZXBvcnRzCgpUaGUgcHJlZmVycmVkIHdheSB0byByZXBvcnQgYnVncyBpcyB0byB1c2UgdGhlCltHaXRIdWIgaXNzdWUgdHJhY2tlcl0oaHR0cDovL2dpdGh1Yi5jb20vbWFyaWpuaC9Db2RlTWlycm9yL2lzc3VlcykuIEJlZm9yZQpyZXBvcnRpbmcgYSBidWcsIHJlYWQgdGhlc2UgcG9pbnRlcnMuCgoqKk5vdGU6KiogVGhlIGlzc3VlIHRyYWNrZXIgaXMgZm9yICpidWdzKiwgbm90IHJlcXVlc3RzIGZvciBoZWxwLiBRdWVzdGlvbnMKc2hvdWxkIGJlIGFza2VkIG9uIHRoZQpbQ29kZU1pcnJvciBHb29nbGUgZ3JvdXBdKGh0dHA6Ly9ncm91cHMuZ29vZ2xlLmNvbS9ncm91cC9jb2RlbWlycm9yKSBpbnN0ZWFkLgoKIyMjIFJlcG9ydGluZyBidWdzIGVmZmVjdGl2ZWx5CgotIENvZGVNaXJyb3IgaXMgbWFpbnRhaW5lZCBieSB2b2x1bnRlZXJzLiBUaGV5IGRvbid0IG93ZSB5b3UgYW55dGhpbmcsIHNvIGJlCiAgcG9saXRlLiBSZXBvcnRzIHdpdGggYW4gaW5kaWduYW50IG9yIGJlbGxpZ2VyZW50IHRvbmUgdGVuZCB0byBiZSBtb3ZlZCB0byB0aGUKICBib3R0b20gb2YgdGhlIHBpbGUuCgotIEluY2x1ZGUgaW5mb3JtYXRpb24gYWJvdXQgKip0aGUgYnJvd3NlciBpbiB3aGljaCB0aGUgcHJvYmxlbSBvY2N1cnJlZCoqLiBFdmVuCiAgaWYgeW91IHRlc3RlZCBzZXZlcmFsIGJyb3dzZXJzLCBhbmQgdGhlIHByb2JsZW0gb2NjdXJyZWQgaW4gYWxsIG9mIHRoZW0sCiAgbWVudGlvbiB0aGlzIGZhY3QgaW4gdGhlIGJ1ZyByZXBvcnQuIEFsc28gaW5jbHVkZSBicm93c2VyIHZlcnNpb24gbnVtYmVycyBhbmQKICB0aGUgb3BlcmF0aW5nIHN5c3RlbSB0aGF0IHlvdSdyZSBvbi4KCi0gTWVudGlvbiB3aGljaCByZWxlYXNlIG9mIENvZGVNaXJyb3IgeW91J3JlIHVzaW5nLiBQcmVmZXJhYmx5LCB0cnkgYWxzbyB3aXRoCiAgdGhlIGN1cnJlbnQgZGV2ZWxvcG1lbnQgc25hcHNob3QsIHRvIGVuc3VyZSB0aGUgcHJvYmxlbSBoYXMgbm90IGFscmVhZHkgYmVlbgogIGZpeGVkLgoKLSBNZW50aW9uIHZlcnkgcHJlY2lzZWx5IHdoYXQgd2VudCB3cm9uZy4gIlggaXMgYnJva2VuIiBpcyBub3QgYSBnb29kIGJ1ZwogIHJlcG9ydC4gV2hhdCBkaWQgeW91IGV4cGVjdCB0byBoYXBwZW4/IFdoYXQgaGFwcGVuZWQgaW5zdGVhZD8gRGVzY3JpYmUgdGhlCiAgZXhhY3Qgc3RlcHMgYSBtYWludGFpbmVyIGhhcyB0byB0YWtlIHRvIG1ha2UgdGhlIHByb2JsZW0gb2NjdXIuIFdlIGNhbiBub3QKICBmaXggc29tZXRoaW5nIHRoYXQgd2UgY2FuIG5vdCBvYnNlcnZlLgoKLSBJZiB0aGUgcHJvYmxlbSBjYW4gbm90IGJlIHJlcHJvZHVjZWQgaW4gYW55IG9mIHRoZSBkZW1vcyBpbmNsdWRlZCBpbiB0aGUKICBDb2RlTWlycm9yIGRpc3RyaWJ1dGlvbiwgcGxlYXNlIHByb3ZpZGUgYW4gSFRNTCBkb2N1bWVudCB0aGF0IGRlbW9uc3RyYXRlcwogIHRoZSBwcm9ibGVtLiBUaGUgYmVzdCB3YXkgdG8gZG8gdGhpcyBpcyB0byBnbyB0bwogIFtqc2Jpbi5jb21dKGh0dHA6Ly9qc2Jpbi5jb20vaWh1bmluL2VkaXQpLCBlbnRlciBpdCB0aGVyZSwgcHJlc3Mgc2F2ZSwgYW5kCiAgaW5jbHVkZSB0aGUgcmVzdWx0aW5nIGxpbmsgaW4geW91ciBidWcgcmVwb3J0LgoKIyMgQ29udHJpYnV0aW5nIGNvZGUKCi0gTWFrZSBzdXJlIHlvdSBoYXZlIGEgW0dpdEh1YiBBY2NvdW50XShodHRwczovL2dpdGh1Yi5jb20vc2lnbnVwL2ZyZWUpCi0gRm9yayBbQ29kZU1pcnJvcl0oaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvQ29kZU1pcnJvci8pCiAgKFtob3cgdG8gZm9yayBhIHJlcG9dKGh0dHBzOi8vaGVscC5naXRodWIuY29tL2FydGljbGVzL2ZvcmstYS1yZXBvKSkKLSBNYWtlIHlvdXIgY2hhbmdlcwotIElmIHlvdXIgY2hhbmdlcyBhcmUgZWFzeSB0byB0ZXN0IG9yIGxpa2VseSB0byByZWdyZXNzLCBhZGQgdGVzdHMuCiAgVGVzdHMgZm9yIHRoZSBjb3JlIGdvIGludG8gYHRlc3QvdGVzdC5qc2AsIHNvbWUgbW9kZXMgaGF2ZSB0aGVpciBvd24KICB0ZXN0IHN1aXRlIHVuZGVyIGBtb2RlL1hYWC90ZXN0LmpzYC4gRmVlbCBmcmVlIHRvIGFkZCBuZXcgdGVzdAogIHN1aXRlcyB0byBtb2RlcyB0aGF0IGRvbid0IGhhdmUgb25lIHlldCAoYmUgc3VyZSB0byBsaW5rIHRoZSBuZXcKICB0ZXN0cyBpbnRvIGB0ZXN0L2luZGV4Lmh0bWxgKS4KLSBGb2xsb3cgdGhlIGdlbmVyYWwgY29kZSBzdHlsZSBvZiB0aGUgcmVzdCBvZiB0aGUgcHJvamVjdCAoc2VlCiAgYmVsb3cpLiBSdW4gYGJpbi9saW50YCB0byB2ZXJpZnkgdGhhdCB0aGUgbGludGVyIGlzIGhhcHB5LgotIE1ha2Ugc3VyZSBhbGwgdGVzdHMgcGFzcy4gVmlzaXQgYHRlc3QvaW5kZXguaHRtbGAgaW4geW91ciBicm93c2VyIHRvCiAgcnVuIHRoZW0uCi0gU3VibWl0IGEgcHVsbCByZXF1ZXN0CihbaG93IHRvIGNyZWF0ZSBhIHB1bGwgcmVxdWVzdF0oaHR0cHM6Ly9oZWxwLmdpdGh1Yi5jb20vYXJ0aWNsZXMvZm9yay1hLXJlcG8pKQoKIyMjIENvZGluZyBzdGFuZGFyZHMKCi0gMiBzcGFjZXMgcGVyIGluZGVudGF0aW9uIGxldmVsLCBubyB0YWJzLgotIEluY2x1ZGUgc2VtaWNvbG9ucyBhZnRlciBzdGF0ZW1lbnRzLgotIE5vdGUgdGhhdCB0aGUgbGludGVyIChgYmluL2xpbnRgKSB3aGljaCBpcyBydW4gYWZ0ZXIgZWFjaCBjb21taXQKICBjb21wbGFpbnMgYWJvdXQgdW51c2VkIHZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zLiBQcmVmaXggdGhlaXIgbmFtZXMKICB3aXRoIGFuIHVuZGVyc2NvcmUgdG8gbXVmZmxlIGl0LgoKLSBDb2RlTWlycm9yIGRvZXMgKm5vdCogZm9sbG93IEpTSGludCBvciBKU0xpbnQgcHJlc2NyaWJlZCBzdHlsZS4KICBQYXRjaGVzIHRoYXQgdHJ5IHRvICdmaXgnIGNvZGUgdG8gcGFzcyBvbmUgb2YgdGhlc2UgbGludGVycyB3aWxsIGJlCiAgdW5jZXJlbW9uaW91c2x5IGRpc2NhcmRlZC4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/demo/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/demo/activeline.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogQWN0aXZlIExpbmUgRGVtbzwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxzY3JpcHQgc3JjPSIuLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9tb2RlL3htbC94bWwuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vYWRkb24vc2VsZWN0aW9uL2FjdGl2ZS1saW5lLmpzIj48L3NjcmlwdD4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KICAgICAgLkNvZGVNaXJyb3Ige2JvcmRlci10b3A6IDFweCBzb2xpZCBibGFjazsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO30KICAgIDwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGltZyBpZD1sb2dvIHNyYz0iLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPkFjdGl2ZSBMaW5lPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5BY3RpdmUgTGluZSBEZW1vPC9oMj4KPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KPHJzcyB4bWxuczphdG9tPSJodHRwOi8vd3d3LnczLm9yZy8yMDA1L0F0b20iIHZlcnNpb249IjIuMCIKICAgICB4bWxuczpnZW9yc3M9Imh0dHA6Ly93d3cuZ2VvcnNzLm9yZy9nZW9yc3MiCiAgICAgeG1sbnM6dHdpdHRlcj0iaHR0cDovL2FwaS50d2l0dGVyLmNvbSI+CiAgPGNoYW5uZWw+CiAgICA8dGl0bGU+VHdpdHRlciAvIGNvZGVtaXJyb3I8L3RpdGxlPgogICAgPGxpbms+aHR0cDovL3R3aXR0ZXIuY29tL2NvZGVtaXJyb3I8L2xpbms+CiAgICA8YXRvbTpsaW5rIHR5cGU9ImFwcGxpY2F0aW9uL3Jzcyt4bWwiCiAgICAgICAgICAgICAgIGhyZWY9Imh0dHA6Ly90d2l0dGVyLmNvbS9zdGF0dXNlcy91c2VyX3RpbWVsaW5lLzI0MjI4MzI4OC5yc3MiIHJlbD0ic2VsZiIvPgogICAgPGRlc2NyaXB0aW9uPlR3aXR0ZXIgdXBkYXRlcyBmcm9tIENvZGVNaXJyb3IgLyBjb2RlbWlycm9yLjwvZGVzY3JpcHRpb24+CiAgICA8bGFuZ3VhZ2U+ZW4tdXM8L2xhbmd1YWdlPgogICAgPHR0bD40MDwvdHRsPgogIDxpdGVtPgogICAgPHRpdGxlPmNvZGVtaXJyb3I6IGh0dHA6Ly9jbG91ZC1pZGUuY29tICYjODIxMjsgdGhleSdyZSBzcHJpbmdpbmcgdXAgbGlrZSBtdXNocm9vbXMuIFRoaXMgb25lCiAgICAgIHVzZXMgQ29kZU1pcnJvciBhcyBpdHMgZWRpdG9yLjwvdGl0bGU+CiAgICA8ZGVzY3JpcHRpb24+Y29kZW1pcnJvcjogaHR0cDovL2Nsb3VkLWlkZS5jb20gJiM4MjEyOyB0aGV5J3JlIHNwcmluZ2luZyB1cCBsaWtlIG11c2hyb29tcy4gVGhpcwogICAgICBvbmUgdXNlcyBDb2RlTWlycm9yIGFzIGl0cyBlZGl0b3IuPC9kZXNjcmlwdGlvbj4KICAgIDxwdWJEYXRlPlRodSwgMTcgTWFyIDIwMTEgMjM6MzQ6NDcgKzAwMDA8L3B1YkRhdGU+CiAgICA8Z3VpZD5odHRwOi8vdHdpdHRlci5jb20vY29kZW1pcnJvci9zdGF0dXNlcy80ODUyNzczMzcyMjA1ODc1MjwvZ3VpZD4KICAgIDxsaW5rPmh0dHA6Ly90d2l0dGVyLmNvbS9jb2RlbWlycm9yL3N0YXR1c2VzLzQ4NTI3NzMzNzIyMDU4NzUyPC9saW5rPgogICAgPHR3aXR0ZXI6c291cmNlPndlYjwvdHdpdHRlcjpzb3VyY2U+CiAgICA8dHdpdHRlcjpwbGFjZS8+CiAgPC9pdGVtPgogIDxpdGVtPgogICAgPHRpdGxlPmNvZGVtaXJyb3I6IFBvc3RlZCBhIGRlc2NyaXB0aW9uIG9mIHRoZSBDb2RlTWlycm9yIDIgaW50ZXJuYWxzIGF0CiAgICAgIGh0dHA6Ly9jb2RlbWlycm9yLm5ldC8yL2ludGVybmFscy5odG1sPC90aXRsZT4KICAgIDxkZXNjcmlwdGlvbj5jb2RlbWlycm9yOiBQb3N0ZWQgYSBkZXNjcmlwdGlvbiBvZiB0aGUgQ29kZU1pcnJvciAyIGludGVybmFscyBhdAogICAgICBodHRwOi8vY29kZW1pcnJvci5uZXQvMi9pbnRlcm5hbHMuaHRtbDwvZGVzY3JpcHRpb24+CiAgICA8cHViRGF0ZT5XZWQsIDAyIE1hciAyMDExIDEyOjE1OjA5ICswMDAwPC9wdWJEYXRlPgogICAgPGd1aWQ+aHR0cDovL3R3aXR0ZXIuY29tL2NvZGVtaXJyb3Ivc3RhdHVzZXMvNDI5MjA4Nzk3ODg3ODk3NjA8L2d1aWQ+CiAgICA8bGluaz5odHRwOi8vdHdpdHRlci5jb20vY29kZW1pcnJvci9zdGF0dXNlcy80MjkyMDg3OTc4ODc4OTc2MDwvbGluaz4KICAgIDx0d2l0dGVyOnNvdXJjZT53ZWI8L3R3aXR0ZXI6c291cmNlPgogICAgPHR3aXR0ZXI6cGxhY2UvPgogIDwvaXRlbT4KICA8L2NoYW5uZWw+CjwvcnNzPjwvdGV4dGFyZWE+PC9mb3JtPgoKICAgIDxzY3JpcHQ+CnZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgbW9kZTogImFwcGxpY2F0aW9uL3htbCIsCiAgc3R5bGVBY3RpdmVMaW5lOiB0cnVlLAogIGxpbmVOdW1iZXJzOiB0cnVlLAogIGxpbmVXcmFwcGluZzogdHJ1ZQp9KTsKPC9zY3JpcHQ+CgogICAgPHA+U3R5bGluZyB0aGUgY3VycmVudCBjdXJzb3IgbGluZS48L3A+CgogIDwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/demo/anywordhint.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogQW55IFdvcmQgQ29tcGxldGlvbiBEZW1vPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9hZGRvbi9oaW50L3Nob3ctaGludC5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vYWRkb24vaGludC9zaG93LWhpbnQuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vYWRkb24vaGludC9hbnl3b3JkLWhpbnQuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vbW9kZS9qYXZhc2NyaXB0L2phdmFzY3JpcHQuanMiPjwvc2NyaXB0Pgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5BbnkgV29yZCBDb21wbGV0aW9uPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5BbnkgV29yZCBDb21wbGV0aW9uIERlbW88L2gyPgo8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgooZnVuY3Rpb24oKSB7CiAgInVzZSBzdHJpY3QiOwoKICB2YXIgV09SRCA9IC9bXHckXSsvZywgUkFOR0UgPSA1MDA7CgogIENvZGVNaXJyb3IucmVnaXN0ZXJIZWxwZXIoImhpbnQiLCAiYW55d29yZCIsIGZ1bmN0aW9uKGVkaXRvciwgb3B0aW9ucykgewogICAgdmFyIHdvcmQgPSBvcHRpb25zICYmIG9wdGlvbnMud29yZCB8fCBXT1JEOwogICAgdmFyIHJhbmdlID0gb3B0aW9ucyAmJiBvcHRpb25zLnJhbmdlIHx8IFJBTkdFOwogICAgdmFyIGN1ciA9IGVkaXRvci5nZXRDdXJzb3IoKSwgY3VyTGluZSA9IGVkaXRvci5nZXRMaW5lKGN1ci5saW5lKTsKICAgIHZhciBzdGFydCA9IGN1ci5jaCwgZW5kID0gc3RhcnQ7CiAgICB3aGlsZSAoZW5kIDwgY3VyTGluZS5sZW5ndGggJiYgd29yZC50ZXN0KGN1ckxpbmUuY2hhckF0KGVuZCkpKSArK2VuZDsKICAgIHdoaWxlIChzdGFydCAmJiB3b3JkLnRlc3QoY3VyTGluZS5jaGFyQXQoc3RhcnQgLSAxKSkpIC0tc3RhcnQ7CiAgICB2YXIgY3VyV29yZCA9IHN0YXJ0ICE9IGVuZCAmJiBjdXJMaW5lLnNsaWNlKHN0YXJ0LCBlbmQpOwoKICAgIHZhciBsaXN0ID0gW10sIHNlZW4gPSB7fTsKICAgIGZ1bmN0aW9uIHNjYW4oZGlyKSB7CiAgICAgIHZhciBsaW5lID0gY3VyLmxpbmUsIGVuZCA9IE1hdGgubWluKE1hdGgubWF4KGxpbmUgKyBkaXIgKiByYW5nZSwgZWRpdG9yLmZpcnN0TGluZSgpKSwgZWRpdG9yLmxhc3RMaW5lKCkpICsgZGlyOwogICAgICBmb3IgKDsgbGluZSAhPSBlbmQ7IGxpbmUgKz0gZGlyKSB7CiAgICAgICAgdmFyIHRleHQgPSBlZGl0b3IuZ2V0TGluZShsaW5lKSwgbTsKICAgICAgICB3b3JkLmxhc3RJbmRleCA9IDA7CiAgICAgICAgd2hpbGUgKG0gPSB3b3JkLmV4ZWModGV4dCkpIHsKICAgICAgICAgIGlmICgoIWN1cldvcmQgfHwgbVswXS5pbmRleE9mKGN1cldvcmQpID09IDApICYmICFzZWVuLmhhc093blByb3BlcnR5KG1bMF0pKSB7CiAgICAgICAgICAgIHNlZW5bbVswXV0gPSB0cnVlOwogICAgICAgICAgICBsaXN0LnB1c2gobVswXSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBzY2FuKC0xKTsKICAgIHNjYW4oMSk7CiAgICByZXR1cm4ge2xpc3Q6IGxpc3QsIGZyb206IENvZGVNaXJyb3IuUG9zKGN1ci5saW5lLCBzdGFydCksIHRvOiBDb2RlTWlycm9yLlBvcyhjdXIubGluZSwgZW5kKX07CiAgfSk7Cn0pKCk7CjwvdGV4dGFyZWE+PC9mb3JtPgoKPHA+UHJlc3MgPHN0cm9uZz5jdHJsLXNwYWNlPC9zdHJvbmc+IHRvIGFjdGl2YXRlIGF1dG9jb21wbGV0aW9uLiBUaGUKY29tcGxldGlvbiB1c2VzCnRoZSA8YSBocmVmPSIuLi9kb2MvbWFudWFsLmh0bWwjYWRkb25fYW55d29yZC1oaW50Ij5hbnl3b3JkLWhpbnQuanM8L2E+Cm1vZHVsZSwgd2hpY2ggc2ltcGx5IGxvb2tzIGF0IG5lYXJieSB3b3JkcyBpbiB0aGUgYnVmZmVyIGFuZCBjb21wbGV0ZXMKdG8gdGhvc2UuPC9wPgoKICAgIDxzY3JpcHQ+CiAgICAgIENvZGVNaXJyb3IuY29tbWFuZHMuYXV0b2NvbXBsZXRlID0gZnVuY3Rpb24oY20pIHsKICAgICAgICBjbS5zaG93SGludCh7aGludDogQ29kZU1pcnJvci5oaW50LmFueXdvcmR9KTsKICAgICAgfQogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgICAgIGV4dHJhS2V5czogeyJDdHJsLVNwYWNlIjogImF1dG9jb21wbGV0ZSJ9CiAgICAgIH0pOwogICAgPC9zY3JpcHQ+CiAgPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/demo/bidi.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogQmktZGlyZWN0aW9uYWwgVGV4dCBEZW1vPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL21vZGUveG1sL3htbC5qcyI+PC9zY3JpcHQ+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICAgIC5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazt9CiAgICA8L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5CaS1kaXJlY3Rpb25hbCBUZXh0PC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5CaS1kaXJlY3Rpb25hbCBUZXh0IERlbW88L2gyPgo8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPjwhLS0gUGllY2Ugb2YgdGhlIENvZGVNaXJyb3IgbWFudWFsLCAndHJhbnNsYXRlZCcgaW50byBBcmFiaWMgYnkKICAgICBHb29nbGUgVHJhbnNsYXRlIC0tPgoKPGRsPgogIDxkdCBpZD1vcHRpb25fdmFsdWU+PGNvZGU+dmFsdWUgKHN0cmluZyBvciBEb2MpPC9jb2RlPjwvZHQ+CiAgPGRkPtmC2YrZhdipINin2YTYqNiv2KfZitipINin2YTZhdit2LHYsS4g2YrZhdmD2YYg2KPZhiDYqtmD2YjZhiDYs9mE2LPZhNip2Iwg2KPZiC4g2YPYp9im2YYg2YXYs9iq2YbYry48L2RkPgogIDxkdCBpZD1vcHRpb25fbW9kZT48Y29kZT5tb2RlIChzdHJpbmcgb3Igb2JqZWN0KTwvY29kZT48L2R0PgogIDxkZD7ZiNi22Lkg2KfZhNin2LPYqtiu2K/Yp9mFLiDYudmG2K/ZhdinINmE2Kcg2KrYudi32YnYjCDZiNmH2LDYpyDYp9mE2KfZgdiq2LHYp9i22Yog2KXZhNmJINin2YTYt9ix2YrZgtipINin2YTYp9mI2YTZiQogINin2YTYqtmKINiq2YUg2KrYrdmF2YrZhNmH2KcuINmC2K8g2YrZg9mI2YYg2YXZhiDYs9mE2LPZhNip2Iwg2YjYp9mE2KrZiiDYpdmF2Kcg2KPYs9mF2KfYoSDYo9mIINio2KjYs9in2LfYqSDZh9mIINmI2LbYuQogIE1JTUUg2YbZiNi5INin2YTZhdix2KrYqNi32Kkg2KfYs9i32KkuINio2K/ZhNinINmF2YYg2LDZhNmD2Iwg2YLYryDZitmD2YjZhiDZhdmGINmD2KfYptmGINmK2K3YqtmI2Yog2LnZhNmJCiAg2K7Zitin2LHYp9iqINin2YTYqtmD2YjZitmGINmE2YjYp9iz2LfYqdiMINmF2LkgPGNvZGU+bmFtZTwvY29kZT4g2KfZhNiu2KfYtdmK2Kkg2KfZhNiq2Yog2YjYtti5INij2LPZhdin2KEKICAo2LnZhNmJINiz2KjZitmEINin2YTZhdir2KfZhCA8Y29kZT57bmFtZTogImphdmFzY3JpcHQiLCBqc29uOiB0cnVlfTwvY29kZT4pLgogINi12YHYrdin2Kog2KfZhNiq2KzYsdmK2KjZiiDZhNmD2YQg2YjYtti5INiq2K3YqtmI2Yog2LnZhNmJINmF2LnZhNmI2YXYp9iqINit2YjZhCDZhdinINmF2LnZhNmF2KfYqiDYqtmD2YjZitmGINmI2LbYuQogINmK2K/YudmF2YfYpy4g2YrZhdmD2YbZgyDYo9mGINiq2LfZhNioIENvZGVNaXJyb3Ig2KfZhNiq2Yog2KrZhSDYqti52LHZitmB2YfYpyDYt9ix2YIg2YjYo9mG2YjYp9i5IE1JTUUKICDYp9mE2YPYtNmBINi52YTZiSA8Y29kZT5Db2RlTWlycm9yLm1vZGVzPC9jb2RlPgogINmIIDxjb2RlPkNvZGVNaXJyb3IubWltZU1vZGVzPC9jb2RlPiDYp9mE2YPYp9im2YbYp9iqLiDZiNi22Lkg2K7Ysdin2KbYtyDYp9mE2KPYs9mF2KfYoQogINin2YTYo9mI2YTZiSDZhNmF2YbYtNim2KfYqiDYp9mE2K7Yp9i12Kkg2KjZh9mF2Iwg2YjYrtix2KfYpti3INmE2KPZhtmI2KfYuSBNSU1FIDIg2KfZhNmF2YjYp9i12YHYp9iqCiAg2YjYp9iz2LfYqS48L2RkPgogIDxkdCBpZD1vcHRpb25fdGhlbWU+PGNvZGU+dGhlbWUgKHN0cmluZyk8L2NvZGU+PC9kdD4KICA8ZGQ+2YXZiNi22YjYuSDZhNmG2YXYtyDYp9mE2YXYrdix2LEg2YXYuS4g2YrYrNioINi52YTZitmDINin2YTYqtij2YPYryDZhdmGINin2YTZhdmE2YEgQ1NTINiq2K3Yr9mK2K8KICDYp9mE2YXZgtin2KjZhNipIDxjb2RlPi5jbS1zLVtuYW1lXTwvY29kZT4g2YrYqtmFINiq2K3ZhdmK2YQg2KPZhtmF2KfYtyAo2KfZhti42LEKICA8YSBocmVmPSIuLi90aGVtZS8iPjxjb2RlPnRoZW1lPC9jb2RlPjwvYT4g2KfZhNiv2YTZitmEINmB2Yog2KfZhNiq2YjYstmK2LkpLgogINin2YTYp9mB2KrYsdin2LbZiiDZh9mIIDxjb2RlPiJkZWZhdWx0IjwvY29kZT4g2Iwg2YjYp9mE2KrZiiDYqtmFINiq2LbZhdmK2YbZh9inINmB2YoKICDYp9mE2KPZhNmI2KfZhiA8Y29kZT5jb2RlbWlycm9yLmNzczwvY29kZT4uINmB2YXZhiDYp9mE2YXZhdmD2YYg2KfYs9iq2K7Yr9in2YUg2YHYptin2Kog2YXYqti52K/Yr9ipCiAg2YHZiiDYqti32KjZitmCINin2YTYs9mF2KfYqiDZhdix2Kkg2YjYp9it2K/YqSDYudmE2Ykg2LPYqNmK2YQg2KfZhNmF2KvYp9mEIDxjb2RlPiJmb28gYmFyIjwvY29kZT4KICDYs9mK2KrZhSDYqti52YrZitmGINmD2YQg2YXZhiA8Y29kZT5jbS1zLWZvbzwvY29kZT4g2YggPGNvZGU+Y20tcy1iYXI8L2NvZGU+CiAg2KfZhNi32KjZgtin2Kog2KXZhNmJINin2YTZhdit2LHYsS48L2RkPgo8L2RsPgo8L3RleHRhcmVhPjwvZm9ybT4KCiAgICA8c2NyaXB0Pgp2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogIG1vZGU6ICJ0ZXh0L2h0bWwiLAogIGxpbmVOdW1iZXJzOiB0cnVlCn0pOwo8L3NjcmlwdD4KCiAgPHA+RGVtb25zdHJhdGlvbiBvZiBiaS1kaXJlY3Rpb25hbCB0ZXh0IHN1cHBvcnQuIFNlZQogIHRoZSA8YSBocmVmPSJodHRwOi8vbWFyaWpuaGF2ZXJiZWtlLm5sL2Jsb2cvY3Vyc29yLWluLWJpZGktdGV4dC5odG1sIj5yZWxhdGVkCiAgYmxvZyBwb3N0PC9hPiBmb3IgbW9yZSBiYWNrZ3JvdW5kLjwvcD4KCiAgPHA+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBUaGVyZSBpcwogIGEgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvQ29kZU1pcnJvci9pc3N1ZXMvMTc1NyI+a25vd24KICBidWc8L2E+IHdpdGggY3Vyc29yIG1vdGlvbiBhbmQgbW91c2UgY2xpY2tzIGluIGJpLWRpcmVjdGlvbmFsIGxpbmVzCiAgdGhhdCBhcmUgbGluZSB3cmFwcGVkLjwvcD4KCjwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/demo/btree.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogQi1UcmVlIHZpc3VhbGl6YXRpb248L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgogICAgICAubGluZWJsb2NrIHsgZGlzcGxheTogaW5saW5lLWJsb2NrOyBtYXJnaW46IDFweDsgaGVpZ2h0OiA1cHg7IH0KICAgICAgLkNvZGVNaXJyb3Ige2JvcmRlcjogMXB4IHNvbGlkICNhYWE7IGhlaWdodDogNDAwcHh9CiAgICA8L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5CLVRyZWUgdmlzdWFsaXphdGlvbjwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+Qi1UcmVlIHZpc3VhbGl6YXRpb248L2gyPgo8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPnR5cGUgaGVyZSwgc2VlIGEgc3VtbWFyeSBvZiB0aGUgZG9jdW1lbnQgYi10cmVlIGJlbG93PC90ZXh0YXJlYT48L2Zvcm0+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IGhlaWdodDogNDAycHg7IG92ZXJmbG93LXk6IGF1dG8iIGlkPSJvdXRwdXQiPjwvZGl2PgogICAgPC9kaXY+CgogICAgPHNjcmlwdCBpZD0ibWUiPgp2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogIGxpbmVOdW1iZXJzOiB0cnVlLAogIGxpbmVXcmFwcGluZzogdHJ1ZQp9KTsKdmFyIHVwZGF0ZVRpbWVvdXQ7CmVkaXRvci5vbigiY2hhbmdlIiwgZnVuY3Rpb24oY20pIHsKICBjbGVhclRpbWVvdXQodXBkYXRlVGltZW91dCk7CiAgdXBkYXRlVGltZW91dCA9IHNldFRpbWVvdXQodXBkYXRlVmlzdWFsLCAyMDApOwp9KTsKdXBkYXRlVmlzdWFsKCk7CgpmdW5jdGlvbiB1cGRhdGVWaXN1YWwoKSB7CiAgdmFyIG91dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJvdXRwdXQiKTsKICBvdXQuaW5uZXJIVE1MID0gIiI7CgogIGZ1bmN0aW9uIGRyYXdUcmVlKG91dCwgbm9kZSkgewogICAgaWYgKG5vZGUubGluZXMpIHsKICAgICAgb3V0LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpKS5pbm5lckhUTUwgPQogICAgICAgICI8Yj5sZWFmPC9iPjogIiArIG5vZGUubGluZXMubGVuZ3RoICsgIiBsaW5lcywgIiArIE1hdGgucm91bmQobm9kZS5oZWlnaHQpICsgIiBweCI7CiAgICAgIHZhciBsaW5lcyA9IG91dC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSk7CiAgICAgIGxpbmVzLnN0eWxlLmxpbmVIZWlnaHQgPSAiNnB4IjsgbGluZXMuc3R5bGUubWFyZ2luTGVmdCA9ICIxMHB4IjsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLmxpbmVzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgdmFyIGxpbmUgPSBub2RlLmxpbmVzW2ldLCBsaW5lRWx0ID0gbGluZXMuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikpOwogICAgICAgIGxpbmVFbHQuY2xhc3NOYW1lID0gImxpbmVibG9jayI7CiAgICAgICAgdmFyIGdyYXkgPSBNYXRoLm1pbihsaW5lLnRleHQubGVuZ3RoICogMywgMjMwKSwgY29sID0gZ3JheS50b1N0cmluZygxNik7CiAgICAgICAgaWYgKGNvbC5sZW5ndGggPT0gMSkgY29sID0gIjAiICsgY29sOwogICAgICAgIGxpbmVFbHQuc3R5bGUuYmFja2dyb3VuZCA9ICIjIiArIGNvbCArIGNvbCArIGNvbDsKICAgICAgICBsaW5lRWx0LnN0eWxlLndpZHRoID0gTWF0aC5tYXgoTWF0aC5yb3VuZChsaW5lLmhlaWdodCAvIDMpLCAxKSArICJweCI7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIG91dC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSkuaW5uZXJIVE1MID0KICAgICAgICAiPGI+bm9kZTwvYj46ICIgKyBub2RlLnNpemUgKyAiIGxpbmVzLCAiICsgTWF0aC5yb3VuZChub2RlLmhlaWdodCkgKyAiIHB4IjsKICAgICAgdmFyIHN1YiA9IG91dC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSk7CiAgICAgIHN1Yi5zdHlsZS5wYWRkaW5nTGVmdCA9ICIyMHB4IjsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLmNoaWxkcmVuLmxlbmd0aDsgKytpKQogICAgICAgIGRyYXdUcmVlKHN1Yiwgbm9kZS5jaGlsZHJlbltpXSk7CiAgICB9CiAgfQogIGRyYXdUcmVlKG91dCwgZWRpdG9yLmdldERvYygpKTsKfQoKZnVuY3Rpb24gZmlsbEVkaXRvcigpIHsKICB2YXIgc2MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibWUiKTsKICB2YXIgZG9jID0gKHNjLnRleHRDb250ZW50IHx8IHNjLmlubmVyVGV4dCB8fCBzYy5pbm5lckhUTUwpLnJlcGxhY2UoL15ccyovLCAiIikgKyAiXG4iOwogIGRvYyArPSBkb2M7IGRvYyArPSBkb2M7IGRvYyArPSBkb2M7IGRvYyArPSBkb2M7IGRvYyArPSBkb2M7IGRvYyArPSBkb2M7CiAgZWRpdG9yLnNldFZhbHVlKGRvYyk7Cn0KICAgIDwvc2NyaXB0PgoKPHA+PGJ1dHRvbiBvbmNsaWNrPSJmaWxsRWRpdG9yKCkiPkFkZCBhIGxvdCBvZiBjb250ZW50PC9idXR0b24+PC9wPgoKICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/demo/buffers.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogTXVsdGlwbGUgQnVmZmVyICYgU3BsaXQgVmlldyBEZW1vPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL21vZGUvamF2YXNjcmlwdC9qYXZhc2NyaXB0LmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL21vZGUvY3NzL2Nzcy5qcyI+PC9zY3JpcHQ+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyIgaWQ9c3R5bGU+CiAgICAgIC5Db2RlTWlycm9yIHtib3JkZXI6IDFweCBzb2xpZCBibGFjazsgaGVpZ2h0OiAyNTBweDt9CiAgICA8L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5NdWx0aXBsZSBCdWZmZXIgJiBTcGxpdCBWaWV3PC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5NdWx0aXBsZSBCdWZmZXIgJiBTcGxpdCBWaWV3IERlbW88L2gyPgoKCiAgICA8ZGl2IGlkPWNvZGVfdG9wPjwvZGl2PgogICAgPGRpdj4KICAgICAgU2VsZWN0IGJ1ZmZlcjogPHNlbGVjdCBpZD1idWZmZXJzX3RvcD48L3NlbGVjdD4KICAgICAgJm5ic3A7ICZuYnNwOyA8YnV0dG9uIG9uY2xpY2s9Im5ld0J1ZigndG9wJykiPk5ldyBidWZmZXI8L2J1dHRvbj4KICAgIDwvZGl2PgogICAgPGRpdiBpZD1jb2RlX2JvdD48L2Rpdj4KICAgIDxkaXY+CiAgICAgIFNlbGVjdCBidWZmZXI6IDxzZWxlY3QgaWQ9YnVmZmVyc19ib3Q+PC9zZWxlY3Q+CiAgICAgICZuYnNwOyAmbmJzcDsgPGJ1dHRvbiBvbmNsaWNrPSJuZXdCdWYoJ2JvdCcpIj5OZXcgYnVmZmVyPC9idXR0b24+CiAgICA8L2Rpdj4KCiAgICA8c2NyaXB0IGlkPXNjcmlwdD4KdmFyIHNlbF90b3AgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYnVmZmVyc190b3AiKTsKQ29kZU1pcnJvci5vbihzZWxfdG9wLCAiY2hhbmdlIiwgZnVuY3Rpb24oKSB7CiAgc2VsZWN0QnVmZmVyKGVkX3RvcCwgc2VsX3RvcC5vcHRpb25zW3NlbF90b3Auc2VsZWN0ZWRJbmRleF0udmFsdWUpOwp9KTsKCnZhciBzZWxfYm90ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ1ZmZlcnNfYm90Iik7CkNvZGVNaXJyb3Iub24oc2VsX2JvdCwgImNoYW5nZSIsIGZ1bmN0aW9uKCkgewogIHNlbGVjdEJ1ZmZlcihlZF9ib3QsIHNlbF9ib3Qub3B0aW9uc1tzZWxfYm90LnNlbGVjdGVkSW5kZXhdLnZhbHVlKTsKfSk7Cgp2YXIgYnVmZmVycyA9IHt9OwoKZnVuY3Rpb24gb3BlbkJ1ZmZlcihuYW1lLCB0ZXh0LCBtb2RlKSB7CiAgYnVmZmVyc1tuYW1lXSA9IENvZGVNaXJyb3IuRG9jKHRleHQsIG1vZGUpOwogIHZhciBvcHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJvcHRpb24iKTsKICBvcHQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobmFtZSkpOwogIHNlbF90b3AuYXBwZW5kQ2hpbGQob3B0KTsKICBzZWxfYm90LmFwcGVuZENoaWxkKG9wdC5jbG9uZU5vZGUodHJ1ZSkpOwp9CgpmdW5jdGlvbiBuZXdCdWYod2hlcmUpIHsKICB2YXIgbmFtZSA9IHByb21wdCgiTmFtZSBmb3IgdGhlIGJ1ZmZlciIsICIqc2NyYXRjaCoiKTsKICBpZiAobmFtZSA9PSBudWxsKSByZXR1cm47CiAgaWYgKGJ1ZmZlcnMuaGFzT3duUHJvcGVydHkobmFtZSkpIHsKICAgIGFsZXJ0KCJUaGVyZSdzIGFscmVhZHkgYSBidWZmZXIgYnkgdGhhdCBuYW1lLiIpOwogICAgcmV0dXJuOwogIH0KICBvcGVuQnVmZmVyKG5hbWUsICIiLCAiamF2YXNjcmlwdCIpOwogIHNlbGVjdEJ1ZmZlcih3aGVyZSA9PSAidG9wIiA/IGVkX3RvcCA6IGVkX2JvdCwgbmFtZSk7CiAgdmFyIHNlbCA9IHdoZXJlID09ICJ0b3AiID8gc2VsX3RvcCA6IHNlbF9ib3Q7CiAgc2VsLnZhbHVlID0gbmFtZTsKfQoKZnVuY3Rpb24gc2VsZWN0QnVmZmVyKGVkaXRvciwgbmFtZSkgewogIHZhciBidWYgPSBidWZmZXJzW25hbWVdOwogIGlmIChidWYuZ2V0RWRpdG9yKCkpIGJ1ZiA9IGJ1Zi5saW5rZWREb2Moe3NoYXJlZEhpc3Q6IHRydWV9KTsKICB2YXIgb2xkID0gZWRpdG9yLnN3YXBEb2MoYnVmKTsKICB2YXIgbGlua2VkID0gb2xkLml0ZXJMaW5rZWREb2NzKGZ1bmN0aW9uKGRvYykge2xpbmtlZCA9IGRvYzt9KTsKICBpZiAobGlua2VkKSB7CiAgICAvLyBNYWtlIHN1cmUgdGhlIGRvY3VtZW50IGluIGJ1ZmZlcnMgaXMgdGhlIG9uZSB0aGUgb3RoZXIgdmlldyBpcyBsb29raW5nIGF0CiAgICBmb3IgKHZhciBuYW1lIGluIGJ1ZmZlcnMpIGlmIChidWZmZXJzW25hbWVdID09IG9sZCkgYnVmZmVyc1tuYW1lXSA9IGxpbmtlZDsKICAgIG9sZC51bmxpbmtEb2MobGlua2VkKTsKICB9CiAgZWRpdG9yLmZvY3VzKCk7Cn0KCmZ1bmN0aW9uIG5vZGVDb250ZW50KGlkKSB7CiAgdmFyIG5vZGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCksIHZhbCA9IG5vZGUudGV4dENvbnRlbnQgfHwgbm9kZS5pbm5lclRleHQ7CiAgdmFsID0gdmFsLnNsaWNlKHZhbC5tYXRjaCgvXlxzKi8pWzBdLmxlbmd0aCwgdmFsLmxlbmd0aCAtIHZhbC5tYXRjaCgvXHMqJC8pWzBdLmxlbmd0aCkgKyAiXG4iOwogIHJldHVybiB2YWw7Cn0Kb3BlbkJ1ZmZlcigianMiLCBub2RlQ29udGVudCgic2NyaXB0IiksICJqYXZhc2NyaXB0Iik7Cm9wZW5CdWZmZXIoImNzcyIsIG5vZGVDb250ZW50KCJzdHlsZSIpLCAiY3NzIik7Cgp2YXIgZWRfdG9wID0gQ29kZU1pcnJvcihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZV90b3AiKSwge2xpbmVOdW1iZXJzOiB0cnVlfSk7CnNlbGVjdEJ1ZmZlcihlZF90b3AsICJqcyIpOwp2YXIgZWRfYm90ID0gQ29kZU1pcnJvcihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZV9ib3QiKSwge2xpbmVOdW1iZXJzOiB0cnVlfSk7CnNlbGVjdEJ1ZmZlcihlZF9ib3QsICJqcyIpOwo8L3NjcmlwdD4KCiAgICA8cD5EZW1vbnN0cmF0aW9uIG9mCiAgICB1c2luZyA8YSBocmVmPSIuLi9kb2MvbWFudWFsLmh0bWwjbGlua2VkRG9jIj5saW5rZWQgZG9jdW1lbnRzPC9hPgogICAgdG8gcHJvdmlkZSBhIHNwbGl0IHZpZXcgb24gYSBkb2N1bWVudCwgYW5kCiAgICB1c2luZyA8YSBocmVmPSIuLi9kb2MvbWFudWFsLmh0bWwjc3dhcERvYyI+PGNvZGU+c3dhcERvYzwvY29kZT48L2E+CiAgICB0byB1c2UgYSBzaW5nbGUgZWRpdG9yIHRvIGRpc3BsYXkgbXVsdGlwbGUgZG9jdW1lbnRzLjwvcD4KCiAgPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/demo/changemode.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogTW9kZS1DaGFuZ2luZyBEZW1vPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL21vZGUvamF2YXNjcmlwdC9qYXZhc2NyaXB0LmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL21vZGUvc2NoZW1lL3NjaGVtZS5qcyI+PC9zY3JpcHQ+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICAgIC5Db2RlTWlycm9yIHtib3JkZXI6IDFweCBzb2xpZCBibGFjazt9CiAgICA8L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5Nb2RlLUNoYW5naW5nPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5Nb2RlLUNoYW5naW5nIERlbW88L2gyPgo8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgo7OyBJZiB0aGVyZSBpcyBTY2hlbWUgY29kZSBpbiBoZXJlLCB0aGUgZWRpdG9yIHdpbGwgYmUgaW4gU2NoZW1lIG1vZGUuCjs7IElmIHlvdSBwdXQgaW4gSlMgaW5zdGVhZCwgaXQnbGwgc3dpdGNoIHRvIEpTIG1vZGUuCgooZGVmaW5lIChkb3VibGUgeCkKICAoKiB4IHgpKQo8L3RleHRhcmVhPjwvZm9ybT4KCjxwPk9uIGNoYW5nZXMgdG8gdGhlIGNvbnRlbnQgb2YgdGhlIGFib3ZlIGVkaXRvciwgYSAoY3J1ZGUpIHNjcmlwdAp0cmllcyB0byBhdXRvLWRldGVjdCB0aGUgbGFuZ3VhZ2UgdXNlZCwgYW5kIHN3aXRjaGVzIHRoZSBlZGl0b3IgdG8KZWl0aGVyIEphdmFTY3JpcHQgb3IgU2NoZW1lIG1vZGUgYmFzZWQgb24gdGhhdC48L3A+Cgo8c2NyaXB0PgogIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICBtb2RlOiAic2NoZW1lIiwKICAgIGxpbmVOdW1iZXJzOiB0cnVlCiAgfSk7CiAgdmFyIHBlbmRpbmc7CiAgZWRpdG9yLm9uKCJjaGFuZ2UiLCBmdW5jdGlvbigpIHsKICAgIGNsZWFyVGltZW91dChwZW5kaW5nKTsKICAgIHBlbmRpbmcgPSBzZXRUaW1lb3V0KHVwZGF0ZSwgNDAwKTsKICB9KTsKICBmdW5jdGlvbiBsb29rc0xpa2VTY2hlbWUoY29kZSkgewogICAgcmV0dXJuICEvXlxzKlwoXHMqZnVuY3Rpb25cYi8udGVzdChjb2RlKSAmJiAvXlxzKls7XChdLy50ZXN0KGNvZGUpOwogIH0KICBmdW5jdGlvbiB1cGRhdGUoKSB7CiAgICBlZGl0b3Iuc2V0T3B0aW9uKCJtb2RlIiwgbG9va3NMaWtlU2NoZW1lKGVkaXRvci5nZXRWYWx1ZSgpKSA/ICJzY2hlbWUiIDogImphdmFzY3JpcHQiKTsKICB9Cjwvc2NyaXB0PgogIDwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/demo/closebrackets.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogQ2xvc2VicmFja2V0cyBEZW1vPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL2FkZG9uL2VkaXQvY2xvc2VicmFja2V0cy5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9tb2RlL2phdmFzY3JpcHQvamF2YXNjcmlwdC5qcyI+PC9zY3JpcHQ+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICAgIC5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgIzg4ODsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICM4ODg7fQogICAgPC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aW1nIGlkPWxvZ28gc3JjPSIuLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+Q2xvc2VicmFja2V0czwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+Q2xvc2VicmFja2V0cyBEZW1vPC9oMj4KPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj5mdW5jdGlvbiBHcmlkKHdpZHRoLCBoZWlnaHQpIHsKICB0aGlzLndpZHRoID0gd2lkdGg7CiAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7CiAgdGhpcy5jZWxscyA9IG5ldyBBcnJheSh3aWR0aCAqIGhlaWdodCk7Cn0KR3JpZC5wcm90b3R5cGUudmFsdWVBdCA9IGZ1bmN0aW9uKHBvaW50KSB7CiAgcmV0dXJuIHRoaXMuY2VsbHNbcG9pbnQueSAqIHRoaXMud2lkdGggKyBwb2ludC54XTsKfTsKR3JpZC5wcm90b3R5cGUuc2V0VmFsdWVBdCA9IGZ1bmN0aW9uKHBvaW50LCB2YWx1ZSkgewogIHRoaXMuY2VsbHNbcG9pbnQueSAqIHRoaXMud2lkdGggKyBwb2ludC54XSA9IHZhbHVlOwp9OwpHcmlkLnByb3RvdHlwZS5pc0luc2lkZSA9IGZ1bmN0aW9uKHBvaW50KSB7CiAgcmV0dXJuIHBvaW50LnggPj0gMCAmJiBwb2ludC55ID49IDAgJiYKICAgICAgICAgcG9pbnQueCA8IHRoaXMud2lkdGggJiYgcG9pbnQueSA8IHRoaXMuaGVpZ2h0Owp9OwpHcmlkLnByb3RvdHlwZS5tb3ZlVmFsdWUgPSBmdW5jdGlvbihmcm9tLCB0bykgewogIHRoaXMuc2V0VmFsdWVBdCh0bywgdGhpcy52YWx1ZUF0KGZyb20pKTsKICB0aGlzLnNldFZhbHVlQXQoZnJvbSwgdW5kZWZpbmVkKTsKfTs8L3RleHRhcmVhPjwvZm9ybT4KCiAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7YXV0b0Nsb3NlQnJhY2tldHM6IHRydWV9KTsKICAgIDwvc2NyaXB0PgogIDwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/demo/closetag.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogQ2xvc2UtVGFnIERlbW88L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vYWRkb24vZWRpdC9jbG9zZXRhZy5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9hZGRvbi9mb2xkL3htbC1mb2xkLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL21vZGUveG1sL3htbC5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9tb2RlL2phdmFzY3JpcHQvamF2YXNjcmlwdC5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9tb2RlL2Nzcy9jc3MuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vbW9kZS9odG1sbWl4ZWQvaHRtbG1peGVkLmpzIj48L3NjcmlwdD4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KICAgICAgLkNvZGVNaXJyb3Ige2JvcmRlci10b3A6IDFweCBzb2xpZCAjODg4OyBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzg4ODt9CiAgICA8L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5DbG9zZS1UYWc8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPkNsb3NlLVRhZyBEZW1vPC9oMj4KPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj48aHRtbDwvdGV4dGFyZWE+PC9mb3JtPgoKICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICBtb2RlOiAndGV4dC9odG1sJywKICAgICAgICBhdXRvQ2xvc2VUYWdzOiB0cnVlCiAgICAgIH0pOwogICAgPC9zY3JpcHQ+CiAgPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/demo/complete.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogQXV0b2NvbXBsZXRlIERlbW88L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9saWIvY29kZW1pcnJvci5jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL2FkZG9uL2hpbnQvc2hvdy1oaW50LmNzcyI+CjxzY3JpcHQgc3JjPSIuLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9hZGRvbi9oaW50L3Nob3ctaGludC5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9hZGRvbi9oaW50L2phdmFzY3JpcHQtaGludC5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9tb2RlL2phdmFzY3JpcHQvamF2YXNjcmlwdC5qcyI+PC9zY3JpcHQ+Cgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5BdXRvY29tcGxldGU8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPkF1dG9jb21wbGV0ZSBEZW1vPC9oMj4KPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KZnVuY3Rpb24gZ2V0Q29tcGxldGlvbnModG9rZW4sIGNvbnRleHQpIHsKICB2YXIgZm91bmQgPSBbXSwgc3RhcnQgPSB0b2tlbi5zdHJpbmc7CiAgZnVuY3Rpb24gbWF5YmVBZGQoc3RyKSB7CiAgICBpZiAoc3RyLmluZGV4T2Yoc3RhcnQpID09IDApIGZvdW5kLnB1c2goc3RyKTsKICB9CiAgZnVuY3Rpb24gZ2F0aGVyQ29tcGxldGlvbnMob2JqKSB7CiAgICBpZiAodHlwZW9mIG9iaiA9PSAic3RyaW5nIikgZm9yRWFjaChzdHJpbmdQcm9wcywgbWF5YmVBZGQpOwogICAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgQXJyYXkpIGZvckVhY2goYXJyYXlQcm9wcywgbWF5YmVBZGQpOwogICAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRnVuY3Rpb24pIGZvckVhY2goZnVuY1Byb3BzLCBtYXliZUFkZCk7CiAgICBmb3IgKHZhciBuYW1lIGluIG9iaikgbWF5YmVBZGQobmFtZSk7CiAgfQoKICBpZiAoY29udGV4dCkgewogICAgLy8gSWYgdGhpcyBpcyBhIHByb3BlcnR5LCBzZWUgaWYgaXQgYmVsb25ncyB0byBzb21lIG9iamVjdCB3ZSBjYW4KICAgIC8vIGZpbmQgaW4gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQuCiAgICB2YXIgb2JqID0gY29udGV4dC5wb3AoKSwgYmFzZTsKICAgIGlmIChvYmouY2xhc3NOYW1lID09ICJqcy12YXJpYWJsZSIpCiAgICAgIGJhc2UgPSB3aW5kb3dbb2JqLnN0cmluZ107CiAgICBlbHNlIGlmIChvYmouY2xhc3NOYW1lID09ICJqcy1zdHJpbmciKQogICAgICBiYXNlID0gIiI7CiAgICBlbHNlIGlmIChvYmouY2xhc3NOYW1lID09ICJqcy1hdG9tIikKICAgICAgYmFzZSA9IDE7CiAgICB3aGlsZSAoYmFzZSAhPSBudWxsICYmIGNvbnRleHQubGVuZ3RoKQogICAgICBiYXNlID0gYmFzZVtjb250ZXh0LnBvcCgpLnN0cmluZ107CiAgICBpZiAoYmFzZSAhPSBudWxsKSBnYXRoZXJDb21wbGV0aW9ucyhiYXNlKTsKICB9CiAgZWxzZSB7CiAgICAvLyBJZiBub3QsIGp1c3QgbG9vayBpbiB0aGUgd2luZG93IG9iamVjdCBhbmQgYW55IGxvY2FsIHNjb3BlCiAgICAvLyAocmVhZGluZyBpbnRvIEpTIG1vZGUgaW50ZXJuYWxzIHRvIGdldCBhdCB0aGUgbG9jYWwgdmFyaWFibGVzKQogICAgZm9yICh2YXIgdiA9IHRva2VuLnN0YXRlLmxvY2FsVmFyczsgdjsgdiA9IHYubmV4dCkgbWF5YmVBZGQodi5uYW1lKTsKICAgIGdhdGhlckNvbXBsZXRpb25zKHdpbmRvdyk7CiAgICBmb3JFYWNoKGtleXdvcmRzLCBtYXliZUFkZCk7CiAgfQogIHJldHVybiBmb3VuZDsKfQo8L3RleHRhcmVhPjwvZm9ybT4KCjxwPlByZXNzIDxzdHJvbmc+Y3RybC1zcGFjZTwvc3Ryb25nPiB0byBhY3RpdmF0ZSBhdXRvY29tcGxldGlvbi4gQnVpbHQKb24gdG9wIG9mIHRoZSA8YSBocmVmPSIuLi9kb2MvbWFudWFsLmh0bWwjYWRkb25fc2hvdy1oaW50Ij48Y29kZT5zaG93LWhpbnQ8L2NvZGU+PC9hPgphbmQgPGEgaHJlZj0iLi4vZG9jL21hbnVhbC5odG1sI2FkZG9uX2phdmFzY3JpcHQtaGludCI+PGNvZGU+amF2YXNjcmlwdC1oaW50PC9jb2RlPjwvYT4KYWRkb25zLjwvcD4KCiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgICAgIGV4dHJhS2V5czogeyJDdHJsLVNwYWNlIjogImF1dG9jb21wbGV0ZSJ9LAogICAgICAgIG1vZGU6IHtuYW1lOiAiamF2YXNjcmlwdCIsIGdsb2JhbFZhcnM6IHRydWV9CiAgICAgIH0pOwogICAgPC9zY3JpcHQ+CiAgPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/demo/emacs.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogRW1hY3MgYmluZGluZ3MgZGVtbzwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vYWRkb24vZGlhbG9nL2RpYWxvZy5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vbW9kZS9jbGlrZS9jbGlrZS5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9rZXltYXAvZW1hY3MuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vYWRkb24vZWRpdC9tYXRjaGJyYWNrZXRzLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL2FkZG9uL2NvbW1lbnQvY29tbWVudC5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9hZGRvbi9kaWFsb2cvZGlhbG9nLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL2FkZG9uL3NlYXJjaC9zZWFyY2hjdXJzb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vYWRkb24vc2VhcmNoL3NlYXJjaC5qcyI+PC9zY3JpcHQ+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICAgIC5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgI2VlZTsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlZWU7fQogICAgPC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aW1nIGlkPWxvZ28gc3JjPSIuLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+RW1hY3MgYmluZGluZ3M8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPkVtYWNzIGJpbmRpbmdzIGRlbW88L2gyPgo8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgojaW5jbHVkZSAic3lzY2FsbHMuaCIKLyogZ2V0Y2hhcjogIHNpbXBsZSBidWZmZXJlZCB2ZXJzaW9uICovCmludCBnZXRjaGFyKHZvaWQpCnsKICBzdGF0aWMgY2hhciBidWZbQlVGU0laXTsKICBzdGF0aWMgY2hhciAqYnVmcCA9IGJ1ZjsKICBzdGF0aWMgaW50IG4gPSAwOwogIGlmIChuID09IDApIHsgIC8qIGJ1ZmZlciBpcyBlbXB0eSAqLwogICAgbiA9IHJlYWQoMCwgYnVmLCBzaXplb2YgYnVmKTsKICAgIGJ1ZnAgPSBidWY7CiAgfQogIHJldHVybiAoLS1uID49IDApID8gKHVuc2lnbmVkIGNoYXIpICpidWZwKysgOiBFT0Y7Cn0KPC90ZXh0YXJlYT48L2Zvcm0+Cgo8cD5UaGUgZW1hY3Mga2V5YmluZGluZ3MgYXJlIGVuYWJsZWQgYnkKaW5jbHVkaW5nIDxhIGhyZWY9Ii4uL2tleW1hcC9lbWFjcy5qcyI+a2V5bWFwL2VtYWNzLmpzPC9hPiBhbmQgc2V0dGluZwp0aGUgPGNvZGU+a2V5TWFwPC9jb2RlPiBvcHRpb24gdG8gPGNvZGU+ImVtYWNzIjwvY29kZT4uIEJlY2F1c2UKQ29kZU1pcnJvcidzIGludGVybmFsIEFQSSBpcyBxdWl0ZSBkaWZmZXJlbnQgZnJvbSBFbWFjcywgdGhleSBhcmUgb25seQphIGxvb3NlIGFwcHJveGltYXRpb24gb2YgYWN0dWFsIGVtYWNzIGJpbmRpbmdzLCB0aG91Z2guPC9wPgoKPHA+QWxzbyBub3RlIHRoYXQgYSBsb3Qgb2YgYnJvd3NlcnMgZGlzYWxsb3cgY2VydGFpbiBrZXlzIGZyb20gYmVpbmcKY2FwdHVyZWQuIEZvciBleGFtcGxlLCBDaHJvbWUgYmxvY2tzIGJvdGggQ3RybC1XIGFuZCBDdHJsLU4sIHdpdGggdGhlCnJlc3VsdCB0aGF0IGlkaW9tYXRpYyB1c2Ugb2YgRW1hY3Mga2V5cyB3aWxsIGNvbnN0YW50bHkgY2xvc2UgeW91ciB0YWIKb3Igb3BlbiBhIG5ldyB3aW5kb3cuPC9wPgoKICAgIDxzY3JpcHQ+CiAgICAgIENvZGVNaXJyb3IuY29tbWFuZHMuc2F2ZSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBlbHQgPSBlZGl0b3IuZ2V0V3JhcHBlckVsZW1lbnQoKTsKICAgICAgICBlbHQuc3R5bGUuYmFja2dyb3VuZCA9ICIjZGVmIjsKICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyBlbHQuc3R5bGUuYmFja2dyb3VuZCA9ICIiOyB9LCAzMDApOwogICAgICB9OwogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgICAgIG1vZGU6ICJ0ZXh0L3gtY3NyYyIsCiAgICAgICAga2V5TWFwOiAiZW1hY3MiCiAgICAgIH0pOwogICAgPC9zY3JpcHQ+CgogIDwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/demo/folding.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8aGVhZD4KICA8dGl0bGU+Q29kZU1pcnJvcjogQ29kZSBGb2xkaW5nIERlbW88L3RpdGxlPgogIDxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CiAgPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vZG9jL2RvY3MuY3NzIj4KCiAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9saWIvY29kZW1pcnJvci5jc3MiPgogIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vYWRkb24vZm9sZC9mb2xkZ3V0dGVyLmNzcyIgLz4KICA8c2NyaXB0IHNyYz0iLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0PgogIDxzY3JpcHQgc3JjPSIuLi9hZGRvbi9mb2xkL2ZvbGRjb2RlLmpzIj48L3NjcmlwdD4KICA8c2NyaXB0IHNyYz0iLi4vYWRkb24vZm9sZC9mb2xkZ3V0dGVyLmpzIj48L3NjcmlwdD4KICA8c2NyaXB0IHNyYz0iLi4vYWRkb24vZm9sZC9icmFjZS1mb2xkLmpzIj48L3NjcmlwdD4KICA8c2NyaXB0IHNyYz0iLi4vYWRkb24vZm9sZC94bWwtZm9sZC5qcyI+PC9zY3JpcHQ+CiAgPHNjcmlwdCBzcmM9Ii4uL2FkZG9uL2ZvbGQvbWFya2Rvd24tZm9sZC5qcyI+PC9zY3JpcHQ+CiAgPHNjcmlwdCBzcmM9Ii4uL2FkZG9uL2ZvbGQvY29tbWVudC1mb2xkLmpzIj48L3NjcmlwdD4KICA8c2NyaXB0IHNyYz0iLi4vbW9kZS9qYXZhc2NyaXB0L2phdmFzY3JpcHQuanMiPjwvc2NyaXB0PgogIDxzY3JpcHQgc3JjPSIuLi9tb2RlL3htbC94bWwuanMiPjwvc2NyaXB0PgogIDxzY3JpcHQgc3JjPSIuLi9tb2RlL21hcmtkb3duL21hcmtkb3duLmpzIj48L3NjcmlwdD4KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgogICAgLkNvZGVNaXJyb3Ige2JvcmRlci10b3A6IDFweCBzb2xpZCBibGFjazsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO30KICA8L3N0eWxlPgo8L2hlYWQ+Cgo8Ym9keT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aW1nIGlkPWxvZ28gc3JjPSIuLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+Q29kZSBGb2xkaW5nPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CiAgPGgyPkNvZGUgRm9sZGluZyBEZW1vPC9oMj4KICA8Zm9ybT4KICAgIDxkaXYgc3R5bGU9Im1heC13aWR0aDogNTBlbTsgbWFyZ2luLWJvdHRvbTogMWVtIj5KYXZhU2NyaXB0Ojxicj4KICAgIDx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+PC90ZXh0YXJlYT48L2Rpdj4KICAgIDxkaXYgc3R5bGU9Im1heC13aWR0aDogNTBlbTsgbWFyZ2luLWJvdHRvbTogMWVtIj5IVE1MOjxicj4KICAgIDx0ZXh0YXJlYSBpZD0iY29kZS1odG1sIiBuYW1lPSJjb2RlLWh0bWwiPjwvdGV4dGFyZWE+PC9kaXY+CiAgICA8ZGl2IHN0eWxlPSJtYXgtd2lkdGg6IDUwZW0iPk1hcmtkb3duOjxicj4KICAgIDx0ZXh0YXJlYSBpZD0iY29kZS1tYXJrZG93biIgbmFtZT0iY29kZSI+PC90ZXh0YXJlYT48L2Rpdj4KICA8L2Zvcm0+CiAgPHNjcmlwdCBpZD0ic2NyaXB0Ij4KLyoKICogRGVtb25zdHJhdGlvbiBvZiBjb2RlIGZvbGRpbmcKICovCndpbmRvdy5vbmxvYWQgPSBmdW5jdGlvbigpIHsKICB2YXIgdGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpOwogIHZhciBzYyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzY3JpcHQiKTsKICB0ZS52YWx1ZSA9IChzYy50ZXh0Q29udGVudCB8fCBzYy5pbm5lclRleHQgfHwgc2MuaW5uZXJIVE1MKS5yZXBsYWNlKC9eXHMqLywgIiIpOwogIHNjLmlubmVySFRNTCA9ICIiOwogIHZhciB0ZV9odG1sID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUtaHRtbCIpOwogIHRlX2h0bWwudmFsdWUgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuaW5uZXJIVE1MOwogIHZhciB0ZV9tYXJrZG93biA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlLW1hcmtkb3duIik7CiAgdGVfbWFya2Rvd24udmFsdWUgPSAiIyBGb29cbiMjIEJhclxuXG5ibGFoIGJsYWhcblxuIyMgQmF6XG5cbmJsYWggYmxhaFxuXG4jIFF1dXhcblxuYmxhaCBibGFoXG4iCgogIHdpbmRvdy5lZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYSh0ZSwgewogICAgbW9kZTogImphdmFzY3JpcHQiLAogICAgbGluZU51bWJlcnM6IHRydWUsCiAgICBsaW5lV3JhcHBpbmc6IHRydWUsCiAgICBleHRyYUtleXM6IHsiQ3RybC1RIjogZnVuY3Rpb24oY20peyBjbS5mb2xkQ29kZShjbS5nZXRDdXJzb3IoKSk7IH19LAogICAgZm9sZEd1dHRlcjogdHJ1ZSwKICAgIGd1dHRlcnM6IFsiQ29kZU1pcnJvci1saW5lbnVtYmVycyIsICJDb2RlTWlycm9yLWZvbGRndXR0ZXIiXQogIH0pOwogIGVkaXRvci5mb2xkQ29kZShDb2RlTWlycm9yLlBvcygxMywgMCkpOwoKICB3aW5kb3cuZWRpdG9yX2h0bWwgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYSh0ZV9odG1sLCB7CiAgICBtb2RlOiAidGV4dC9odG1sIiwKICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgbGluZVdyYXBwaW5nOiB0cnVlLAogICAgZXh0cmFLZXlzOiB7IkN0cmwtUSI6IGZ1bmN0aW9uKGNtKXsgY20uZm9sZENvZGUoY20uZ2V0Q3Vyc29yKCkpOyB9fSwKICAgIGZvbGRHdXR0ZXI6IHRydWUsCiAgICBndXR0ZXJzOiBbIkNvZGVNaXJyb3ItbGluZW51bWJlcnMiLCAiQ29kZU1pcnJvci1mb2xkZ3V0dGVyIl0KICB9KTsKICBlZGl0b3JfaHRtbC5mb2xkQ29kZShDb2RlTWlycm9yLlBvcygwLCAwKSk7CiAgZWRpdG9yX2h0bWwuZm9sZENvZGUoQ29kZU1pcnJvci5Qb3MoMjEsIDApKTsKCiAgd2luZG93LmVkaXRvcl9tYXJrZG93biA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKHRlX21hcmtkb3duLCB7CiAgICBtb2RlOiAibWFya2Rvd24iLAogICAgbGluZU51bWJlcnM6IHRydWUsCiAgICBsaW5lV3JhcHBpbmc6IHRydWUsCiAgICBleHRyYUtleXM6IHsiQ3RybC1RIjogZnVuY3Rpb24oY20peyBjbS5mb2xkQ29kZShjbS5nZXRDdXJzb3IoKSk7IH19LAogICAgZm9sZEd1dHRlcjogdHJ1ZSwKICAgIGd1dHRlcnM6IFsiQ29kZU1pcnJvci1saW5lbnVtYmVycyIsICJDb2RlTWlycm9yLWZvbGRndXR0ZXIiXQogIH0pOwp9OwogIDwvc2NyaXB0Pgo8L2FydGljbGU+CjwvYm9keT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/demo/fullscreen.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogRnVsbCBTY3JlZW4gRWRpdGluZzwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vYWRkb24vZGlzcGxheS9mdWxsc2NyZWVuLmNzcyI+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vdGhlbWUvbmlnaHQuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL21vZGUveG1sL3htbC5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9hZGRvbi9kaXNwbGF5L2Z1bGxzY3JlZW4uanMiPjwvc2NyaXB0PgoKPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aW1nIGlkPWxvZ28gc3JjPSIuLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+RnVsbCBTY3JlZW4gRWRpdGluZzwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+RnVsbCBTY3JlZW4gRWRpdGluZzwvaDI+Cjxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSIgcm93cz0iNSI+CjxkbD4KICA8ZHQgaWQ9Im9wdGlvbl9pbmRlbnRXaXRoVGFicyI+PGNvZGU+PHN0cm9uZz5pbmRlbnRXaXRoVGFiczwvc3Ryb25nPjogYm9vbGVhbjwvY29kZT48L2R0PgogIDxkZD5XaGV0aGVyLCB3aGVuIGluZGVudGluZywgdGhlIGZpcnN0IE4qPGNvZGU+dGFiU2l6ZTwvY29kZT4KICBzcGFjZXMgc2hvdWxkIGJlIHJlcGxhY2VkIGJ5IE4gdGFicy4gRGVmYXVsdCBpcyBmYWxzZS48L2RkPgoKICA8ZHQgaWQ9Im9wdGlvbl9lbGVjdHJpY0NoYXJzIj48Y29kZT48c3Ryb25nPmVsZWN0cmljQ2hhcnM8L3N0cm9uZz46IGJvb2xlYW48L2NvZGU+PC9kdD4KICA8ZGQ+Q29uZmlndXJlcyB3aGV0aGVyIHRoZSBlZGl0b3Igc2hvdWxkIHJlLWluZGVudCB0aGUgY3VycmVudAogIGxpbmUgd2hlbiBhIGNoYXJhY3RlciBpcyB0eXBlZCB0aGF0IG1pZ2h0IGNoYW5nZSBpdHMgcHJvcGVyCiAgaW5kZW50YXRpb24gKG9ubHkgd29ya3MgaWYgdGhlIG1vZGUgc3VwcG9ydHMgaW5kZW50YXRpb24pLgogIERlZmF1bHQgaXMgdHJ1ZS48L2RkPgoKICA8ZHQgaWQ9Im9wdGlvbl9zcGVjaWFsQ2hhcnMiPjxjb2RlPjxzdHJvbmc+c3BlY2lhbENoYXJzPC9zdHJvbmc+OiBSZWdFeHA8L2NvZGU+PC9kdD4KICA8ZGQ+QSByZWd1bGFyIGV4cHJlc3Npb24gdXNlZCB0byBkZXRlcm1pbmUgd2hpY2ggY2hhcmFjdGVycwogIHNob3VsZCBiZSByZXBsYWNlZCBieSBhCiAgc3BlY2lhbCA8YSBocmVmPSIjb3B0aW9uX3NwZWNpYWxDaGFyUGxhY2Vob2xkZXIiPnBsYWNlaG9sZGVyPC9hPi4KICBNb3N0bHkgdXNlZnVsIGZvciBub24tcHJpbnRpbmcgc3BlY2lhbCBjaGFyYWN0ZXJzLiBUaGUgZGVmYXVsdAogIGlzIDxjb2RlPi9bXHUwMDAwLVx1MDAxOVx1MDBhZFx1MjAwYlx1MjAyOFx1MjAyOVx1ZmVmZl0vPC9jb2RlPi48L2RkPgogIDxkdCBpZD0ib3B0aW9uX3NwZWNpYWxDaGFyUGxhY2Vob2xkZXIiPjxjb2RlPjxzdHJvbmc+c3BlY2lhbENoYXJQbGFjZWhvbGRlcjwvc3Ryb25nPjogZnVuY3Rpb24oY2hhcinCoOKGksKgRWxlbWVudDwvY29kZT48L2R0PgogIDxkZD5BIGZ1bmN0aW9uIHRoYXQsIGdpdmVuIGEgc3BlY2lhbCBjaGFyYWN0ZXIgaWRlbnRpZmllZCBieQogIHRoZSA8YSBocmVmPSIjb3B0aW9uX3NwZWNpYWxDaGFycyI+PGNvZGU+c3BlY2lhbENoYXJzPC9jb2RlPjwvYT4KICBvcHRpb24sIHByb2R1Y2VzIGEgRE9NIG5vZGUgdGhhdCBpcyB1c2VkIHRvIHJlcHJlc2VudCB0aGUKICBjaGFyYWN0ZXIuIEJ5IGRlZmF1bHQsIGEgcmVkIGRvdCAoPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQiPuKAojwvc3Bhbj4pCiAgaXMgc2hvd24sIHdpdGggYSB0aXRsZSB0b29sdGlwIHRvIGluZGljYXRlIHRoZSBjaGFyYWN0ZXIgY29kZS48L2RkPgoKICA8ZHQgaWQ9Im9wdGlvbl9ydGxNb3ZlVmlzdWFsbHkiPjxjb2RlPjxzdHJvbmc+cnRsTW92ZVZpc3VhbGx5PC9zdHJvbmc+OiBib29sZWFuPC9jb2RlPjwvZHQ+CiAgPGRkPkRldGVybWluZXMgd2hldGhlciBob3Jpem9udGFsIGN1cnNvciBtb3ZlbWVudCB0aHJvdWdoCiAgcmlnaHQtdG8tbGVmdCAoQXJhYmljLCBIZWJyZXcpIHRleHQgaXMgdmlzdWFsIChwcmVzc2luZyB0aGUgbGVmdAogIGFycm93IG1vdmVzIHRoZSBjdXJzb3IgbGVmdCkgb3IgbG9naWNhbCAocHJlc3NpbmcgdGhlIGxlZnQgYXJyb3cKICBtb3ZlcyB0byB0aGUgbmV4dCBsb3dlciBpbmRleCBpbiB0aGUgc3RyaW5nLCB3aGljaCBpcyB2aXN1YWxseQogIHJpZ2h0IGluIHJpZ2h0LXRvLWxlZnQgdGV4dCkuIFRoZSBkZWZhdWx0IGlzIDxjb2RlPmZhbHNlPC9jb2RlPgogIG9uIFdpbmRvd3MsIGFuZCA8Y29kZT50cnVlPC9jb2RlPiBvbiBvdGhlciBwbGF0Zm9ybXMuPC9kZD4KPC9kbD4KPC90ZXh0YXJlYT48L2Zvcm0+CiAgPHNjcmlwdD4KICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgICB0aGVtZTogIm5pZ2h0IiwKICAgICAgZXh0cmFLZXlzOiB7CiAgICAgICAgIkYxMSI6IGZ1bmN0aW9uKGNtKSB7CiAgICAgICAgICBjbS5zZXRPcHRpb24oImZ1bGxTY3JlZW4iLCAhY20uZ2V0T3B0aW9uKCJmdWxsU2NyZWVuIikpOwogICAgICAgIH0sCiAgICAgICAgIkVzYyI6IGZ1bmN0aW9uKGNtKSB7CiAgICAgICAgICBpZiAoY20uZ2V0T3B0aW9uKCJmdWxsU2NyZWVuIikpIGNtLnNldE9wdGlvbigiZnVsbFNjcmVlbiIsIGZhbHNlKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0pOwogIDwvc2NyaXB0PgoKICAgIDxwPkRlbW9uc3RyYXRpb24gb2YKICAgIHRoZSA8YSBocmVmPSIuLi9kb2MvbWFudWFsLmh0bWwjYWRkb25fZnVsbHNjcmVlbiI+ZnVsbHNjcmVlbjwvYT4KICAgIGFkZG9uLiBQcmVzcyA8c3Ryb25nPkYxMTwvc3Ryb25nPiB3aGVuIGN1cnNvciBpcyBpbiB0aGUgZWRpdG9yIHRvCiAgICB0b2dnbGUgZnVsbCBzY3JlZW4gZWRpdGluZy4gPHN0cm9uZz5Fc2M8L3N0cm9uZz4gY2FuIGFsc28gYmUgdXNlZAogICAgdG8gPGk+ZXhpdDwvaT4gZnVsbCBzY3JlZW4gZWRpdGluZy48L3A+CiAgPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/demo/hardwrap.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogSGFyZC13cmFwcGluZyBEZW1vPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL21vZGUvbWFya2Rvd24vbWFya2Rvd24uanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vYWRkb24vd3JhcC9oYXJkd3JhcC5qcyI+PC9zY3JpcHQ+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgLkNvZGVNaXJyb3Ige2JvcmRlci10b3A6IDFweCBzb2xpZCBibGFjazsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO30KPC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aW1nIGlkPWxvZ28gc3JjPSIuLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+SGFyZC13cmFwcGluZzwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+SGFyZC13cmFwcGluZyBEZW1vPC9oMj4KPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj5Mb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgdmltIGF1Z3VlIGRpY3RhcyBjb25zdGl0dXRvIGV4LApzaXQgZmFsbGkgc2ltdWwgdmlkZXJlciB0ZS4gR3JhZWNvIHNjYWV2b2xhIG1hbHVpc3NldCBzaXQKdXQsIGluIGlkcXVlIHZpcmlzIHByYWVzZW50IHNlYS4gRWEgc2VhIGVpcm1vZCBpbmRvY3R1bQpyZXB1ZGlhcmUuIFZlbCBub2x1aXNzZSBzdXNjaXBpdCBwZXJpY3VsYSB1dC4gSW4gaXVzIG51bGxhCmFsaWVudW0gbW9sZXN0aWUuIE1laSBlc3NlbnQgZGlzY2VyZSBkZW1vY3JpdHVtIGlkLgoKRXF1aWRlbSBwb25kZXJ1bSBleHBldGVuZGlzIGl1cyBpbiwgbWVhIGFuIGVycm9yaWJ1cwpjb25zdGl0dXRvLCBjb25ndWUgdGltZWFtIHBlcmZlY3RvIGFkIGVzdC4gSXVzIHV0IHByaW1pcwp0aW1lYW0sIHBlciBpbiB1bGx1bSBtZWRpb2NyZW0uIEFuIGNhc2UgdmVybyBsYWJpdHVyIHByaSwKdmVsIGRpY2l0IGxhb3JlZXQgZXQuIEFuIHF1aSBwcm9tcHRhIGNvbmNsdXNpb25lbXF1ZSwgZWFtCnRpbWVhbSBzYXBpZW50ZW0gaW4sIGN1bSBkaWN0YXMgZXBpY3VyZWkgZXUuCgpVc3UgY3UgdmlkZSBkaWN0YXMgZGVzZXJ1aXNzZSwgZXVtIGNob3JvIGdyYWVjZSBhZGlwaXNjaW5nCnV0LiBDaWJvIHF1YWxpc3F1ZSBpdXMgYWQsIGV0IGRpY2F0IHNjcmlwdGEgbWVhLCBlYW0gbmloaWwKbWVudGl0dW0gYWxpcXVhbmRvIGN1LiBEZWJldCBhcGVyaWFtIHNwbGVuZGlkZSBhdCBxdW8sIGFkCnBhdWxvIG5vc3RybyBjb21tb2RvIGR1by4gU2VhIGFkaHVjIHV0aW5hbSBjb25jbHVzaW9uZW1xdWUKaWQsIHF1YXMgZG9taW5nIG1hbG9ydW0gbmVjIGFkLiBUb2xsaXQgZXJ1ZGl0aSB2aXZlbmR1bSBhZAppdXMsIGVvcyBzb2xlYXQgaWdub3RhIGFkLgo8L3RleHRhcmVhPjwvZm9ybT4KCjxwPkRlbW9uc3RyYXRpb24gb2YKdGhlIDxhIGhyZWY9Ii4uL2RvYy9tYW51YWwuaHRtbCNhZGRvbl9oYXJkd3JhcCI+aGFyZHdyYXA8L2E+IGFkZG9uLgpUaGUgYWJvdmUgZWRpdG9yIGhhcyBpdHMgY2hhbmdlIGV2ZW50IGhvb2tlZCB1cCB0bwp0aGUgPGNvZGU+d3JhcFBhcmFncmFwaHNJblJhbmdlPC9jb2RlPiBtZXRob2QsIHNvIHRoYXQgdGhlIHBhcmFncmFwaHMKYXJlIHJlZmxvd24gYXMgeW91IGFyZSB0eXBpbmcuPC9wPgoKPHNjcmlwdD4KdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICBtb2RlOiAibWFya2Rvd24iLAogIGxpbmVOdW1iZXJzOiB0cnVlLAogIGV4dHJhS2V5czogewogICAgIkN0cmwtUSI6IGZ1bmN0aW9uKGNtKSB7IGNtLndyYXBQYXJhZ3JhcGgoY20uZ2V0Q3Vyc29yKCksIG9wdGlvbnMpOyB9CiAgfQp9KTsKdmFyIHdhaXQsIG9wdGlvbnMgPSB7Y29sdW1uOiA2MH07CmVkaXRvci5vbigiY2hhbmdlIiwgZnVuY3Rpb24oY20sIGNoYW5nZSkgewogIGNsZWFyVGltZW91dCh3YWl0KTsKICB3YWl0ID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgIGNvbnNvbGUubG9nKGNtLndyYXBQYXJhZ3JhcGhzSW5SYW5nZShjaGFuZ2UuZnJvbSwgQ29kZU1pcnJvci5jaGFuZ2VFbmQoY2hhbmdlKSwgb3B0aW9ucykpOwogIH0sIDIwMCk7Cn0pOwo8L3NjcmlwdD4KCjwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/demo/html5complete.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8aGVhZD4KICA8dGl0bGU+Q29kZU1pcnJvcjogSFRNTCBjb21wbGV0aW9uIGRlbW88L3RpdGxlPgogIDxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CiAgPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vZG9jL2RvY3MuY3NzIj4KCiAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9saWIvY29kZW1pcnJvci5jc3MiPgogIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vYWRkb24vaGludC9zaG93LWhpbnQuY3NzIj4KICA8c2NyaXB0IHNyYz0iLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0PgogIDxzY3JpcHQgc3JjPSIuLi9hZGRvbi9oaW50L3Nob3ctaGludC5qcyI+PC9zY3JpcHQ+CiAgPHNjcmlwdCBzcmM9Ii4uL2FkZG9uL2hpbnQveG1sLWhpbnQuanMiPjwvc2NyaXB0PgogIDxzY3JpcHQgc3JjPSIuLi9hZGRvbi9oaW50L2h0bWwtaGludC5qcyI+PC9zY3JpcHQ+CiAgPHNjcmlwdCBzcmM9Ii4uL21vZGUveG1sL3htbC5qcyI+PC9zY3JpcHQ+CiAgPHNjcmlwdCBzcmM9Ii4uL21vZGUvamF2YXNjcmlwdC9qYXZhc2NyaXB0LmpzIj48L3NjcmlwdD4KICA8c2NyaXB0IHNyYz0iLi4vbW9kZS9jc3MvY3NzLmpzIj48L3NjcmlwdD4KICA8c2NyaXB0IHNyYz0iLi4vbW9kZS9odG1sbWl4ZWQvaHRtbG1peGVkLmpzIj48L3NjcmlwdD4KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgogICAgLkNvZGVNaXJyb3Ige2JvcmRlci10b3A6IDFweCBzb2xpZCAjODg4OyBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzg4ODt9CiAgPC9zdHlsZT4KPC9oZWFkPgoKPGJvZHk+CiAgPGRpdiBpZD1uYXY+CiAgICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICAgIDx1bD4KICAgICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICAgIDxsaT48YSBocmVmPSIuLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgICA8L3VsPgogICAgPHVsPgogICAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPkhUTUwgY29tcGxldGlvbjwvYT4KICAgIDwvdWw+CiAgPC9kaXY+CgogIDxhcnRpY2xlPgogICAgPGgyPkhUTUwgY29tcGxldGlvbiBkZW1vPC9oMj4KCiAgICA8cD5TaG93cyB0aGUgPGEgaHJlZj0ieG1sY29tcGxldGUuaHRtbCI+WE1MIGNvbXBsZXRlcjwvYT4KICAgIHBhcmFtZXRlcml6ZWQgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdGFncyBpbiBIVE1MLgogICAgUHJlc3MgPHN0cm9uZz5jdHJsLXNwYWNlPC9zdHJvbmc+IHRvIGFjdGl2YXRlIGNvbXBsZXRpb24uPC9wPgoKICAgIDxkaXYgaWQ9ImNvZGUiPjwvZGl2PgoKICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KICAgICAgd2luZG93Lm9ubG9hZCA9IGZ1bmN0aW9uKCkgewogICAgICAgIGVkaXRvciA9IENvZGVNaXJyb3IoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgICAgICAgbW9kZTogInRleHQvaHRtbCIsCiAgICAgICAgICBleHRyYUtleXM6IHsiQ3RybC1TcGFjZSI6ICJhdXRvY29tcGxldGUifSwKICAgICAgICAgIHZhbHVlOiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuaW5uZXJIVE1MCiAgICAgICAgfSk7CiAgICAgIH07CiAgICA8L3NjcmlwdD4KICA8L2FydGljbGU+CjwvYm9keT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/demo/indentwrap.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogSW5kZW50ZWQgd3JhcHBlZCBsaW5lIGRlbW88L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vbW9kZS94bWwveG1sLmpzIj48L3NjcmlwdD4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KICAgICAgLkNvZGVNaXJyb3Ige2JvcmRlci10b3A6IDFweCBzb2xpZCBibGFjazsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO30KICAgICAgLkNvZGVNaXJyb3IgcHJlID4gKiB7IHRleHQtaW5kZW50OiAwcHg7IH0KICAgIDwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGltZyBpZD1sb2dvIHNyYz0iLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPkluZGVudGVkIHdyYXBwZWQgbGluZTwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+SW5kZW50ZWQgd3JhcHBlZCBsaW5lIGRlbW88L2gyPgo8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgo8IWRvY3R5cGUgaHRtbD4KPGJvZHk+CiAgPGgyIGlkPSJvdmVydmlldyI+T3ZlcnZpZXc8L2gyPgoKICA8cD5Db2RlTWlycm9yIGlzIGEgY29kZS1lZGl0b3IgY29tcG9uZW50IHRoYXQgY2FuIGJlIGVtYmVkZGVkIGluIFdlYiBwYWdlcy4gVGhlIGNvcmUgbGlicmFyeSBwcm92aWRlcyA8ZW0+b25seTwvZW0+IHRoZSBlZGl0b3IgY29tcG9uZW50LCBubyBhY2NvbXBhbnlpbmcgYnV0dG9ucywgYXV0by1jb21wbGV0aW9uLCBvciBvdGhlciBJREUgZnVuY3Rpb25hbGl0eS4gSXQgZG9lcyBwcm92aWRlIGEgcmljaCBBUEkgb24gdG9wIG9mIHdoaWNoIHN1Y2ggZnVuY3Rpb25hbGl0eSBjYW4gYmUgc3RyYWlnaHRmb3J3YXJkbHkgaW1wbGVtZW50ZWQuIFNlZSB0aGUgPGEgaHJlZj0iI2FkZG9ucyI+YWRkLW9uczwvYT4gaW5jbHVkZWQgaW4gdGhlIGRpc3RyaWJ1dGlvbiwgYW5kIHRoZSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vamFndGhlZHJ1bW1lci9jb2RlbWlycm9yLXVpIj5Db2RlTWlycm9yIFVJPC9hPiBwcm9qZWN0LCBmb3IgcmV1c2FibGUgaW1wbGVtZW50YXRpb25zIG9mIGV4dHJhIGZlYXR1cmVzLjwvcD4KCiAgPHA+Q29kZU1pcnJvciB3b3JrcyB3aXRoIGxhbmd1YWdlLXNwZWNpZmljIG1vZGVzLiBNb2RlcyBhcmUgSmF2YVNjcmlwdCBwcm9ncmFtcyB0aGF0IGhlbHAgY29sb3IgKGFuZCBvcHRpb25hbGx5IGluZGVudCkgdGV4dCB3cml0dGVuIGluIGEgZ2l2ZW4gbGFuZ3VhZ2UuIFRoZSBkaXN0cmlidXRpb24gY29tZXMgd2l0aCBhIG51bWJlciBvZiBtb2RlcyAoc2VlIHRoZSA8YSBocmVmPSIuLi9tb2RlLyI+PGNvZGU+bW9kZS88L2NvZGU+PC9hPiBkaXJlY3RvcnkpLCBhbmQgaXQgaXNuJ3QgaGFyZCB0byA8YSBocmVmPSIjbW9kZWFwaSI+d3JpdGUgbmV3IG9uZXM8L2E+IGZvciBvdGhlciBsYW5ndWFnZXMuPC9wPgo8L2JvZHk+CjwvdGV4dGFyZWE+PC9mb3JtPgoKICAgIDxwPlRoaXMgcGFnZSB1c2VzIGEgaGFjayBvbiB0b3Agb2YgdGhlIDxjb2RlPiJyZW5kZXJMaW5lIjwvY29kZT4KICAgIGV2ZW50IHRvIG1ha2Ugd3JhcHBlZCB0ZXh0IGxpbmUgdXAgd2l0aCB0aGUgYmFzZSBpbmRlbnRhdGlvbiBvZgogICAgdGhlIGxpbmUuPC9wPgoKICAgIDxzY3JpcHQ+CiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICAgICAgbGluZU51bWJlcnM6IHRydWUsCiAgICAgICAgbGluZVdyYXBwaW5nOiB0cnVlLAogICAgICAgIG1vZGU6ICJ0ZXh0L2h0bWwiCiAgICAgIH0pOwogICAgICB2YXIgY2hhcldpZHRoID0gZWRpdG9yLmRlZmF1bHRDaGFyV2lkdGgoKSwgYmFzZVBhZGRpbmcgPSA0OwogICAgICBlZGl0b3Iub24oInJlbmRlckxpbmUiLCBmdW5jdGlvbihjbSwgbGluZSwgZWx0KSB7CiAgICAgICAgdmFyIG9mZiA9IENvZGVNaXJyb3IuY291bnRDb2x1bW4obGluZS50ZXh0LCBudWxsLCBjbS5nZXRPcHRpb24oInRhYlNpemUiKSkgKiBjaGFyV2lkdGg7CiAgICAgICAgZWx0LnN0eWxlLnRleHRJbmRlbnQgPSAiLSIgKyBvZmYgKyAicHgiOwogICAgICAgIGVsdC5zdHlsZS5wYWRkaW5nTGVmdCA9IChiYXNlUGFkZGluZyArIG9mZikgKyAicHgiOwogICAgICB9KTsKICAgICAgZWRpdG9yLnJlZnJlc2goKTsKICAgIDwvc2NyaXB0PgoKICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/demo/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCEtLSBEVU1NWSBIVE1MIEZJTEUgLS0+]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/demo/lint.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogTGludGVyIERlbW88L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9saWIvY29kZW1pcnJvci5jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL2FkZG9uL2xpbnQvbGludC5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vbW9kZS9qYXZhc2NyaXB0L2phdmFzY3JpcHQuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vbW9kZS9jc3MvY3NzLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii8vYWpheC5hc3BuZXRjZG4uY29tL2FqYXgvanNoaW50L3IwNy9qc2hpbnQuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iaHR0cHM6Ly9yYXdnaXRodWIuY29tL3phYWNoL2pzb25saW50Lzc5YjU1M2ZiNjVjMTkyYWRkOTA2NmRhNjQwNDM0NTg5ODFiMzk3MmIvbGliL2pzb25saW50LmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Imh0dHBzOi8vcmF3Z2l0aHViLmNvbS9zdHViYm9ybmVsbGEvY3NzbGludC9tYXN0ZXIvcmVsZWFzZS9jc3NsaW50LmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL2FkZG9uL2xpbnQvbGludC5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9hZGRvbi9saW50L2phdmFzY3JpcHQtbGludC5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9hZGRvbi9saW50L2pzb24tbGludC5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9hZGRvbi9saW50L2Nzcy1saW50LmpzIj48L3NjcmlwdD4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KICAgICAgLkNvZGVNaXJyb3Ige2JvcmRlcjogMXB4IHNvbGlkIGJsYWNrO30KICAgIDwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGltZyBpZD1sb2dvIHNyYz0iLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPkxpbnRlcjwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+TGludGVyIERlbW88L2gyPgoKCiAgICA8cD48dGV4dGFyZWEgaWQ9ImNvZGUtanMiPnZhciB3aWRnZXRzID0gW10KZnVuY3Rpb24gdXBkYXRlSGludHMoKSB7CiAgZWRpdG9yLm9wZXJhdGlvbihmdW5jdGlvbigpewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB3aWRnZXRzLmxlbmd0aDsgKytpKQogICAgICBlZGl0b3IucmVtb3ZlTGluZVdpZGdldCh3aWRnZXRzW2ldKTsKICAgIHdpZGdldHMubGVuZ3RoID0gMDsKCiAgICBKU0hJTlQoZWRpdG9yLmdldFZhbHVlKCkpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBKU0hJTlQuZXJyb3JzLmxlbmd0aDsgKytpKSB7CiAgICAgIHZhciBlcnIgPSBKU0hJTlQuZXJyb3JzW2ldOwogICAgICBpZiAoIWVycikgY29udGludWU7CiAgICAgIHZhciBtc2cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgICAgdmFyIGljb24gPSBtc2cuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpKTsKICAgICAgaWNvbi5pbm5lckhUTUwgPSAiISEiOwogICAgICBpY29uLmNsYXNzTmFtZSA9ICJsaW50LWVycm9yLWljb24iOwogICAgICBtc2cuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZXJyLnJlYXNvbikpOwogICAgICBtc2cuY2xhc3NOYW1lID0gImxpbnQtZXJyb3IiOwogICAgICB3aWRnZXRzLnB1c2goZWRpdG9yLmFkZExpbmVXaWRnZXQoZXJyLmxpbmUgLSAxLCBtc2csIHtjb3Zlckd1dHRlcjogZmFsc2UsIG5vSFNjcm9sbDogdHJ1ZX0pKTsKICAgIH0KICB9KTsKICB2YXIgaW5mbyA9IGVkaXRvci5nZXRTY3JvbGxJbmZvKCk7CiAgdmFyIGFmdGVyID0gZWRpdG9yLmNoYXJDb29yZHMoe2xpbmU6IGVkaXRvci5nZXRDdXJzb3IoKS5saW5lICsgMSwgY2g6IDB9LCAibG9jYWwiKS50b3A7CiAgaWYgKGluZm8udG9wICsgaW5mby5jbGllbnRIZWlnaHQgPCBhZnRlcikKICAgIGVkaXRvci5zY3JvbGxUbyhudWxsLCBhZnRlciAtIGluZm8uY2xpZW50SGVpZ2h0ICsgMyk7Cn0KPC90ZXh0YXJlYT48L3A+CgogICAgPHA+PHRleHRhcmVhIGlkPSJjb2RlLWpzb24iPlsKIHsKICBfaWQ6ICJwb3N0IDEiLAogICJhdXRob3IiOiAiQm9iIiwKICAiY29udGVudCI6ICIuLi4iLAogICJwYWdlX3ZpZXdzIjogNQogfSwKIHsKICAiX2lkIjogInBvc3QgMiIsCiAgImF1dGhvciI6ICJCb2IiLAogICJjb250ZW50IjogIi4uLiIsCiAgInBhZ2Vfdmlld3MiOiA5CiB9LAogewogICJfaWQiOiAicG9zdCAzIiwKICAiYXV0aG9yIjogIkJvYiIsCiAgImNvbnRlbnQiOiAiLi4uIiwKICAicGFnZV92aWV3cyI6IDgKIH0KXQo8L3RleHRhcmVhPjwvcD4KCiAgICA8cD48dGV4dGFyZWEgaWQ9ImNvZGUtY3NzIj5AY2hhcnNldCAiVVRGLTgiOwoKQGltcG9ydCB1cmwoImJvb3lhLmNzcyIpIHByaW50LCBzY3JlZW47CkBpbXBvcnQgIndoYXR1cC5jc3MiIHNjcmVlbjsKQGltcG9ydCAid2lja2VkLmNzcyI7CgovKkVycm9yKi8KQGNoYXJzZXQgIlVURi04IjsKCgpAbmFtZXNwYWNlICJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIjsKQG5hbWVzcGFjZSBzdmcgImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIjsKCi8qV2FybmluZzogZW1wdHkgcnVsZXNldCAqLwouZm9vIHsKfQoKaDEgewogICAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KCi8qV2FybmluZzogcXVhbGlmaWVkIGhlYWRpbmcgKi8KLmZvbyBoMSB7CiAgICBmb250LXdlaWdodDogYm9sZDsKfQoKLypXYXJuaW5nOiBhZGpvaW5pbmcgY2xhc3NlcyAqLwouZm9vLmJhciB7CiAgICB6b29tOiAxOwp9CgpsaS5pbmxpbmUgewogICAgd2lkdGg6IDEwMCU7ICAvKldhcm5pbmc6IDEwMCUgY2FuIGJlIHByb2JsZW1hdGljKi8KfQoKbGkubGFzdCB7CiAgZGlzcGxheTogaW5saW5lOwogIHBhZGRpbmctbGVmdDogM3B4ICFpbXBvcnRhbnQ7CiAgcGFkZGluZy1yaWdodDogM3B4OwogIGJvcmRlci1yaWdodDogMHB4Owp9CgpAbWVkaWEgcHJpbnQgewogICAgbGkuaW5saW5lIHsKICAgICAgY29sb3I6IGJsYWNrOwogICAgfQp9CgpAcGFnZSB7CiAgbWFyZ2luOiAxMCU7CiAgY291bnRlci1pbmNyZW1lbnQ6IHBhZ2U7CgogIEB0b3AtY2VudGVyIHsKICAgIGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmOwogICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICBmb250LXNpemU6IDJlbTsKICAgIGNvbnRlbnQ6IGNvdW50ZXIocGFnZSk7CiAgfQp9CjwvdGV4dGFyZWE+PC9wPgo8c2NyaXB0PgogIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZS1qcyIpLCB7CiAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgIG1vZGU6ICJqYXZhc2NyaXB0IiwKICAgIGd1dHRlcnM6IFsiQ29kZU1pcnJvci1saW50LW1hcmtlcnMiXSwKICAgIGxpbnQ6IHRydWUKICB9KTsKCiAgdmFyIGVkaXRvcl9qc29uID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUtanNvbiIpLCB7CiAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgIG1vZGU6ICJhcHBsaWNhdGlvbi9qc29uIiwKICAgIGd1dHRlcnM6IFsiQ29kZU1pcnJvci1saW50LW1hcmtlcnMiXSwKICAgIGxpbnQ6IHRydWUKICB9KTsKICAKICB2YXIgZWRpdG9yX2NzcyA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlLWNzcyIpLCB7CiAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgIG1vZGU6ICJjc3MiLAogICAgZ3V0dGVyczogWyJDb2RlTWlycm9yLWxpbnQtbWFya2VycyJdLAogICAgbGludDogdHJ1ZQogIH0pOwo8L3NjcmlwdD4KCiAgPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/demo/loadmode.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogTGF6eSBNb2RlIExvYWRpbmcgRGVtbzwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxzY3JpcHQgc3JjPSIuLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9hZGRvbi9tb2RlL2xvYWRtb2RlLmpzIj48L3NjcmlwdD4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KICAgICAgLkNvZGVNaXJyb3Ige2JvcmRlci10b3A6IDFweCBzb2xpZCBibGFjazsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO30KICAgIDwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGltZyBpZD1sb2dvIHNyYz0iLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPkxhenkgTW9kZSBMb2FkaW5nPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5MYXp5IE1vZGUgTG9hZGluZyBEZW1vPC9oMj4KPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj5UaGlzIGlzIHRoZSBlZGl0b3IuCi8vIEl0IHN0YXJ0cyBvdXQgaW4gcGxhaW4gdGV4dCBtb2RlLAojICB1c2UgdGhlIGNvbnRyb2wgYmVsb3cgdG8gbG9hZCBhbmQgYXBwbHkgYSBtb2RlCiAgInlvdSdsbCBzZWUgdGhlIGhpZ2hsaWdodGluZyBvZiIgdGhpcyB0ZXh0IC8qY2hhbmdlKi8uCjwvdGV4dGFyZWE+PC9mb3JtPgo8cD48aW5wdXQgdHlwZT10ZXh0IHZhbHVlPWphdmFzY3JpcHQgaWQ9bW9kZT4gPGJ1dHRvbiB0eXBlPWJ1dHRvbiBvbmNsaWNrPSJjaGFuZ2UoKSI+Y2hhbmdlIG1vZGU8L2J1dHRvbj48L3A+CgogICAgPHNjcmlwdD4KQ29kZU1pcnJvci5tb2RlVVJMID0gIi4uL21vZGUvJU4vJU4uanMiOwp2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogIGxpbmVOdW1iZXJzOiB0cnVlCn0pOwp2YXIgbW9kZUlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm1vZGUiKTsKQ29kZU1pcnJvci5vbihtb2RlSW5wdXQsICJrZXlwcmVzcyIsIGZ1bmN0aW9uKGUpIHsKICBpZiAoZS5rZXlDb2RlID09IDEzKSBjaGFuZ2UoKTsKfSk7CmZ1bmN0aW9uIGNoYW5nZSgpIHsKICAgZWRpdG9yLnNldE9wdGlvbigibW9kZSIsIG1vZGVJbnB1dC52YWx1ZSk7CiAgIENvZGVNaXJyb3IuYXV0b0xvYWRNb2RlKGVkaXRvciwgbW9kZUlucHV0LnZhbHVlKTsKfQo8L3NjcmlwdD4KICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/demo/marker.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogQnJlYWtwb2ludCBEZW1vPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL21vZGUvamF2YXNjcmlwdC9qYXZhc2NyaXB0LmpzIj48L3NjcmlwdD4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KICAgICAgLmJyZWFrcG9pbnRzIHt3aWR0aDogLjhlbTt9CiAgICAgIC5icmVha3BvaW50IHsgY29sb3I6ICM4MjI7IH0KICAgICAgLkNvZGVNaXJyb3Ige2JvcmRlcjogMXB4IHNvbGlkICNhYWE7fQogICAgPC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aW1nIGlkPWxvZ28gc3JjPSIuLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+QnJlYWtwb2ludDwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+QnJlYWtwb2ludCBEZW1vPC9oMj4KPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICBsaW5lTnVtYmVyczogdHJ1ZSwKICBndXR0ZXJzOiBbIkNvZGVNaXJyb3ItbGluZW51bWJlcnMiLCAiYnJlYWtwb2ludHMiXQp9KTsKZWRpdG9yLm9uKCJndXR0ZXJDbGljayIsIGZ1bmN0aW9uKGNtLCBuKSB7CiAgdmFyIGluZm8gPSBjbS5saW5lSW5mbyhuKTsKICBjbS5zZXRHdXR0ZXJNYXJrZXIobiwgImJyZWFrcG9pbnRzIiwgaW5mby5ndXR0ZXJNYXJrZXJzID8gbnVsbCA6IG1ha2VNYXJrZXIoKSk7Cn0pOwoKZnVuY3Rpb24gbWFrZU1hcmtlcigpIHsKICB2YXIgbWFya2VyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgbWFya2VyLnN0eWxlLmNvbG9yID0gIiM4MjIiOwogIG1hcmtlci5pbm5lckhUTUwgPSAi4pePIjsKICByZXR1cm4gbWFya2VyOwp9CjwvdGV4dGFyZWE+PC9mb3JtPgoKPHA+Q2xpY2sgdGhlIGxpbmUtbnVtYmVyIGd1dHRlciB0byBhZGQgb3IgcmVtb3ZlICdicmVha3BvaW50cycuPC9wPgoKICAgIDxzY3JpcHQ+ZXZhbChkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLnZhbHVlKTs8L3NjcmlwdD4KCiAgPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/demo/markselection.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogU2VsZWN0aW9uIE1hcmtpbmcgRGVtbzwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxzY3JpcHQgc3JjPSIuLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9hZGRvbi9zZWFyY2gvc2VhcmNoY3Vyc29yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL2FkZG9uL3NlbGVjdGlvbi9tYXJrLXNlbGVjdGlvbi5qcyI+PC9zY3JpcHQ+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICAgIC5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazt9CiAgICAgIC5Db2RlTWlycm9yLXNlbGVjdGVkICB7IGJhY2tncm91bmQtY29sb3I6IGJsdWUgIWltcG9ydGFudDsgfQogICAgICAuQ29kZU1pcnJvci1zZWxlY3RlZHRleHQgeyBjb2xvcjogd2hpdGU7IH0KICAgIDwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGltZyBpZD1sb2dvIHNyYz0iLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPlNlbGVjdGlvbiBNYXJraW5nPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5TZWxlY3Rpb24gTWFya2luZyBEZW1vPC9oMj4KPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj5TZWxlY3Qgc29tZXRoaW5nIGZyb20gaGVyZS4KWW91J2xsIHNlZSB0aGF0IHRoZSBzZWxlY3Rpb24ncyBmb3JlZ3JvdW5kIGNvbG9yIGNoYW5nZXMgdG8gd2hpdGUhClNpbmNlLCBieSBkZWZhdWx0LCBDb2RlTWlycm9yIG9ubHkgcHV0cyBhbiBpbmRlcGVuZGVudCAibWFya2VyIiBsYXllcgpiZWhpbmQgdGhlIHRleHQsIHlvdSdsbCBuZWVkIHNvbWV0aGluZyBsaWtlIHRoaXMgdG8gY2hhbmdlIGl0cyBjb2xvdXIuPC90ZXh0YXJlYT48L2Zvcm0+CgogICAgPHNjcmlwdD4KdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICBsaW5lTnVtYmVyczogdHJ1ZSwKICBzdHlsZVNlbGVjdGVkVGV4dDogdHJ1ZQp9KTsKPC9zY3JpcHQ+CgogICAgPHA+U2ltcGxlIGFkZG9uIHRvIGVhc2lseSBtYXJrIChhbmQgc3R5bGUpIHNlbGVjdGVkIHRleHQuPC9wPgoKICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/demo/matchhighlighter.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogTWF0Y2ggSGlnaGxpZ2h0ZXIgRGVtbzwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxzY3JpcHQgc3JjPSIuLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9hZGRvbi9zZWFyY2gvc2VhcmNoY3Vyc29yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL2FkZG9uL3NlYXJjaC9tYXRjaC1oaWdobGlnaHRlci5qcyI+PC9zY3JpcHQ+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICAgIC5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazt9CiAgICAgIC5Db2RlTWlycm9yLWZvY3VzZWQgLmNtLW1hdGNoaGlnaGxpZ2h0IHsKICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBSUFBQUFDQ0FZQUFBQnl0ZzBrQUFBQUZrbEVRVlFJMTJOZ1lHQmdrS3pjOHg5Q01EQXdBQUFtaHdTYmlkRW9TUUFBQUFCSlJVNUVya0pnZ2c9PSk7CiAgICAgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogYm90dG9tOwogICAgICAgIGJhY2tncm91bmQtcmVwZWF0OiByZXBlYXQteDsKICAgICAgfQogICAgPC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aW1nIGlkPWxvZ28gc3JjPSIuLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+TWF0Y2ggSGlnaGxpZ2h0ZXI8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPk1hdGNoIEhpZ2hsaWdodGVyIERlbW88L2gyPgo8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPlNlbGVjdCB0aGlzIHRleHQ6IGhhcmRUb1Nwb3RWYXIKCUFuZCBldmVyeXdoZXJlIGVsc2UgaW4geW91ciBjb2RlIHdoZXJlIGhhcmRUb1Nwb3RWYXIgYXBwZWFycyB3aWxsIGF1dG9tYXRpY2FsbHkgaWxsdW1pbmF0ZS4KR2l2ZSBpdCBhIHRyeSEgIE5vIG1vcmUgaGFyZFRvU3BvdFZhcnMuPC90ZXh0YXJlYT48L2Zvcm0+CgogICAgPHNjcmlwdD4KdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICBsaW5lTnVtYmVyczogdHJ1ZSwKICBoaWdobGlnaHRTZWxlY3Rpb25NYXRjaGVzOiB7c2hvd1Rva2VuOiAvXHcvfQp9KTsKPC9zY3JpcHQ+CgogICAgPHA+U2VhcmNoIGFuZCBoaWdobGlnaHQgb2NjdXJlbmNlcyBvZiB0aGUgc2VsZWN0ZWQgdGV4dC48L3A+CgogIDwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/demo/matchtags.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogVGFnIE1hdGNoZXIgRGVtbzwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxzY3JpcHQgc3JjPSIuLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9hZGRvbi9mb2xkL3htbC1mb2xkLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL2FkZG9uL2VkaXQvbWF0Y2h0YWdzLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL21vZGUveG1sL3htbC5qcyI+PC9zY3JpcHQ+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICAgIC5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazt9CiAgICA8L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5UYWcgTWF0Y2hlcjwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+VGFnIE1hdGNoZXIgRGVtbzwvaDI+CgoKICAgIDxkaXYgaWQ9ImVkaXRvciI+PC9kaXY+CgogICAgPHNjcmlwdD4Kd2luZG93Lm9ubG9hZCA9IGZ1bmN0aW9uKCkgewogIGVkaXRvciA9IENvZGVNaXJyb3IoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImVkaXRvciIpLCB7CiAgICB2YWx1ZTogIjxodG1sPlxuICAiICsgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmlubmVySFRNTCArICJcbjwvaHRtbD4iLAogICAgbW9kZTogInRleHQvaHRtbCIsCiAgICBtYXRjaFRhZ3M6IHtib3RoVGFnczogdHJ1ZX0sCiAgICBleHRyYUtleXM6IHsiQ3RybC1KIjogInRvTWF0Y2hpbmdUYWcifQogIH0pOwp9OwogICAgPC9zY3JpcHQ+CgogICAgPHA+UHV0IHRoZSBjdXJzb3Igb24gb3IgaW5zaWRlIGEgcGFpciBvZiB0YWdzIHRvIGhpZ2hsaWdodCB0aGVtLgogICAgUHJlc3MgQ3RybC1KIHRvIGp1bXAgdG8gdGhlIHRhZyB0aGF0IG1hdGNoZXMgdGhlIG9uZSB1bmRlciB0aGUKICAgIGN1cnNvci48L3A+CiAgPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/demo/merge.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogbWVyZ2UgdmlldyBkZW1vPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uL2FkZG9uL21lcmdlL21lcmdlLmNzcyI+CjxzY3JpcHQgc3JjPSIuLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9tb2RlL3htbC94bWwuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLy9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvZGlmZl9tYXRjaF9wYXRjaC8yMDEyMTExOS9kaWZmX21hdGNoX3BhdGNoLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL2FkZG9uL21lcmdlL21lcmdlLmpzIj48L3NjcmlwdD4KPHN0eWxlPgogICAgLkNvZGVNaXJyb3IgeyBsaW5lLWhlaWdodDogMS4yOyB9CiAgICBzcGFuLmNsaWNreSB7CiAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgYmFja2dyb3VuZDogI2Q3MDsKICAgICAgY29sb3I6IHdoaXRlOwogICAgICBwYWRkaW5nOiAwIDNweDsKICAgICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgfQogIDwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGltZyBpZD1sb2dvIHNyYz0iLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPm1lcmdlIHZpZXc8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPm1lcmdlIHZpZXcgZGVtbzwvaDI+CgoKPGRpdiBpZD12aWV3PjwvZGl2PgoKPHA+VGhlIDxhIGhyZWY9Ii4uL2RvYy9tYW51YWwuaHRtbCNhZGRvbl9tZXJnZSI+PGNvZGU+bWVyZ2U8L2NvZGU+PC9hPgphZGRvbiBwcm92aWRlcyBhbiBpbnRlcmZhY2UgZm9yIGRpc3BsYXlpbmcgYW5kIG1lcmdpbmcgZGlmZnMsCmVpdGhlciA8c3BhbiBjbGFzcz1jbGlja3kgb25jbGljaz0iaW5pdFVJKDIpIj50d28td2F5PC9zcGFuPgpvciA8c3BhbiBjbGFzcz1jbGlja3kgb25jbGljaz0iaW5pdFVJKDMpIj50aHJlZS13YXk8L3NwYW4+LiBUaGUgbGVmdAoob3IgY2VudGVyKSBwYW5lIGlzIGVkaXRhYmxlLCBhbmQgdGhlIGRpZmZlcmVuY2VzIHdpdGggdGhlIG90aGVyCnBhbmUocykgYXJlIDxzcGFuIGNsYXNzPWNsaWNreSBvbmNsaWNrPSJ0b2dnbGVEaWZmZXJlbmNlcygpIj5vcHRpb25hbGx5PC9zcGFuPiBzaG93biBsaXZlIGFzIHlvdSBlZGl0IGl0LjwvcD4KCjxwPlRoaXMgYWRkb24gZGVwZW5kcyBvbgp0aGUgPGEgaHJlZj0iaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9nb29nbGUtZGlmZi1tYXRjaC1wYXRjaC8iPmdvb2dsZS1kaWZmLW1hdGNoLXBhdGNoPC9hPgpsaWJyYXJ5IHRvIGNvbXB1dGUgdGhlIGRpZmZzLjwvcD4KCjxzY3JpcHQ+CnZhciB2YWx1ZSwgb3JpZzEsIG9yaWcyLCBkdiwgaGlsaWdodD0gdHJ1ZTsKZnVuY3Rpb24gaW5pdFVJKHBhbmVzKSB7CiAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybjsKICB2YXIgdGFyZ2V0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInZpZXciKTsKICB0YXJnZXQuaW5uZXJIVE1MID0gIiI7CiAgZHYgPSBDb2RlTWlycm9yLk1lcmdlVmlldyh0YXJnZXQsIHsKICAgIHZhbHVlOiB2YWx1ZSwKICAgIG9yaWdMZWZ0OiBwYW5lcyA9PSAzID8gb3JpZzEgOiBudWxsLAogICAgb3JpZzogb3JpZzIsCiAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgIG1vZGU6ICJ0ZXh0L2h0bWwiLAogICAgaGlnaGxpZ2h0RGlmZmVyZW5jZXM6IGhpbGlnaHQKICB9KTsKfQoKZnVuY3Rpb24gdG9nZ2xlRGlmZmVyZW5jZXMoKSB7CiAgZHYuc2V0U2hvd0RpZmZlcmVuY2VzKGhpbGlnaHQgPSAhaGlsaWdodCk7Cn0KCndpbmRvdy5vbmxvYWQgPSBmdW5jdGlvbigpIHsKICB2YWx1ZSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5pbm5lckhUTUw7CiAgb3JpZzEgPSB2YWx1ZS5yZXBsYWNlKC9cLlwuXC8vZywgImNvZGVtaXJyb3IvIikucmVwbGFjZSgieWVsbG93IiwgIm9yYW5nZSIpOwogIG9yaWcyID0gdmFsdWUucmVwbGFjZSgvXHUwMDNjc2NyaXB0L2csICJcdTAwM2NzY3JpcHQgdHlwZT10ZXh0L2phdmFzY3JpcHQgIikKICAgIC5yZXBsYWNlKCJ3aGl0ZSIsICJwdXJwbGU7XG4gICAgICBmb250OiBjb21pYyBzYW5zO1xuICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7XG4gICAgICBoZWlnaHQ6IDE1ZW0iKTsKICBpbml0VUkoMik7Cn07CgpmdW5jdGlvbiBtZXJnZVZpZXdIZWlnaHQobWVyZ2VWaWV3KSB7CiAgZnVuY3Rpb24gZWRpdG9ySGVpZ2h0KGVkaXRvcikgewogICAgaWYgKCFlZGl0b3IpIHJldHVybiAwOwogICAgcmV0dXJuIGVkaXRvci5nZXRTY3JvbGxJbmZvKCkuaGVpZ2h0OwogIH0KICByZXR1cm4gTWF0aC5tYXgoZWRpdG9ySGVpZ2h0KG1lcmdlVmlldy5sZWZ0T3JpZ2luYWwoKSksCiAgICAgICAgICAgICAgICAgIGVkaXRvckhlaWdodChtZXJnZVZpZXcuZWRpdG9yKCkpLAogICAgICAgICAgICAgICAgICBlZGl0b3JIZWlnaHQobWVyZ2VWaWV3LnJpZ2h0T3JpZ2luYWwoKSkpOwp9CgpmdW5jdGlvbiByZXNpemUobWVyZ2VWaWV3KSB7CiAgdmFyIGhlaWdodCA9IG1lcmdlVmlld0hlaWdodChtZXJnZVZpZXcpOwogIGZvcig7OykgewogICAgaWYgKG1lcmdlVmlldy5sZWZ0T3JpZ2luYWwoKSkKICAgICAgbWVyZ2VWaWV3LmxlZnRPcmlnaW5hbCgpLnNldFNpemUobnVsbCwgaGVpZ2h0KTsKICAgIG1lcmdlVmlldy5lZGl0b3IoKS5zZXRTaXplKG51bGwsIGhlaWdodCk7CiAgICBpZiAobWVyZ2VWaWV3LnJpZ2h0T3JpZ2luYWwoKSkKICAgICAgbWVyZ2VWaWV3LnJpZ2h0T3JpZ2luYWwoKS5zZXRTaXplKG51bGwsIGhlaWdodCk7CgogICAgdmFyIG5ld0hlaWdodCA9IG1lcmdlVmlld0hlaWdodChtZXJnZVZpZXcpOwogICAgaWYgKG5ld0hlaWdodCA+PSBoZWlnaHQpIGJyZWFrOwogICAgZWxzZSBoZWlnaHQgPSBuZXdIZWlnaHQ7CiAgfQogIG1lcmdlVmlldy53cmFwLnN0eWxlLmhlaWdodCA9IGhlaWdodCArICJweCI7Cn0KPC9zY3JpcHQ+CjwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/demo/multiplex.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogTXVsdGlwbGV4aW5nIFBhcnNlciBEZW1vPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL2FkZG9uL21vZGUvbXVsdGlwbGV4LmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL21vZGUveG1sL3htbC5qcyI+PC9zY3JpcHQ+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICAgIC5Db2RlTWlycm9yIHtib3JkZXI6IDFweCBzb2xpZCBibGFjazt9CiAgICAgIC5jbS1kZWxpbWl0IHtjb2xvcjogI2ZhNDt9CiAgICA8L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5NdWx0aXBsZXhpbmcgUGFyc2VyPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5NdWx0aXBsZXhpbmcgUGFyc2VyIERlbW88L2gyPgo8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgo8aHRtbD4KICA8Ym9keSBzdHlsZT0iPDxtYWdpYz4+Ij4KICAgIDxoMT48PCB0aGlzIGlzIG5vdCA8aHRtbCA+PjwvaDE+CiAgICA8PAogICAgICAgIG11bHRpbGluZQogICAgICAgIG5vdCBodG1sCiAgICAgICAgYXQgYWxsIDogJmFtcDthbXA7IDxsaW5rLz4KICAgID4+CiAgICA8cD50aGlzIGlzIGh0bWwgYWdhaW48L3A+CiAgPC9ib2R5Pgo8L2h0bWw+CjwvdGV4dGFyZWE+PC9mb3JtPgoKICAgIDxzY3JpcHQ+CkNvZGVNaXJyb3IuZGVmaW5lTW9kZSgiZGVtbyIsIGZ1bmN0aW9uKGNvbmZpZykgewogIHJldHVybiBDb2RlTWlycm9yLm11bHRpcGxleGluZ01vZGUoCiAgICBDb2RlTWlycm9yLmdldE1vZGUoY29uZmlnLCAidGV4dC9odG1sIiksCiAgICB7b3BlbjogIjw8IiwgY2xvc2U6ICI+PiIsCiAgICAgbW9kZTogQ29kZU1pcnJvci5nZXRNb2RlKGNvbmZpZywgInRleHQvcGxhaW4iKSwKICAgICBkZWxpbVN0eWxlOiAiZGVsaW1pdCJ9CiAgICAvLyAuLiBtb3JlIG11bHRpcGxleGVkIHN0eWxlcyBjYW4gZm9sbG93IGhlcmUKICApOwp9KTsKdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICBtb2RlOiAiZGVtbyIsCiAgbGluZU51bWJlcnM6IHRydWUsCiAgbGluZVdyYXBwaW5nOiB0cnVlCn0pOwo8L3NjcmlwdD4KCiAgICA8cD5EZW1vbnN0cmF0aW9uIG9mIGEgbXVsdGlwbGV4aW5nIG1vZGUsIHdoaWNoLCBhdCBjZXJ0YWluCiAgICBib3VuZGFyeSBzdHJpbmdzLCBzd2l0Y2hlcyB0byBvbmUgb3IgbW9yZSBpbm5lciBtb2Rlcy4gVGhlIG91dAogICAgKEhUTUwpIG1vZGUgZG9lcyBub3QgZ2V0IGZlZCB0aGUgY29udGVudCBvZiB0aGUgPGNvZGU+Jmx0OyZsdDsKICAgID4+PC9jb2RlPiBibG9ja3MuIFNlZQogICAgdGhlIDxhIGhyZWY9Ii4uL2RvYy9tYW51YWwuaHRtbCNhZGRvbl9tdWx0aXBsZXgiPm1hbnVhbDwvYT4gYW5kCiAgICB0aGUgPGEgaHJlZj0iLi4vYWRkb24vbW9kZS9tdWx0aXBsZXguanMiPnNvdXJjZTwvYT4gZm9yIG1vcmUKICAgIGluZm9ybWF0aW9uLjwvcD4KCiAgICA8cD4KICAgICAgPHN0cm9uZz5QYXJzaW5nL0hpZ2hsaWdodGluZyBUZXN0czo8L3N0cm9uZz4KICAgICAgPGEgaHJlZj0iLi4vdGVzdC9pbmRleC5odG1sI211bHRpcGxleGluZ18qIj5ub3JtYWw8L2E+LAogICAgICA8YSBocmVmPSIuLi90ZXN0L2luZGV4Lmh0bWwjdmVyYm9zZSxtdWx0aXBsZXhpbmdfKiI+dmVyYm9zZTwvYT4uCiAgICA8L3A+CgogIDwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/demo/mustache.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogT3ZlcmxheSBQYXJzZXIgRGVtbzwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxzY3JpcHQgc3JjPSIuLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9hZGRvbi9tb2RlL292ZXJsYXkuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vbW9kZS94bWwveG1sLmpzIj48L3NjcmlwdD4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KICAgICAgLkNvZGVNaXJyb3Ige2JvcmRlcjogMXB4IHNvbGlkIGJsYWNrO30KICAgICAgLmNtLW11c3RhY2hlIHtjb2xvcjogIzBjYTt9Cjwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGltZyBpZD1sb2dvIHNyYz0iLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPk92ZXJsYXkgUGFyc2VyPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5PdmVybGF5IFBhcnNlciBEZW1vPC9oMj4KPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KPGh0bWw+CiAgPGJvZHk+CiAgICA8aDE+e3t0aXRsZX19PC9oMT4KICAgIDxwPlRoZXNlIGFyZSBsaW5rcyB0byB7e3RoaW5nc319OjwvcD4KICAgIDx1bD57eyNsaW5rc319CiAgICAgIDxsaT48YSBocmVmPSJ7e3VybH19Ij57e3RleHR9fTwvYT48L2xpPgogICAge3svbGlua3N9fTwvdWw+CiAgPC9ib2R5Pgo8L2h0bWw+CjwvdGV4dGFyZWE+PC9mb3JtPgoKICAgIDxzY3JpcHQ+CkNvZGVNaXJyb3IuZGVmaW5lTW9kZSgibXVzdGFjaGUiLCBmdW5jdGlvbihjb25maWcsIHBhcnNlckNvbmZpZykgewogIHZhciBtdXN0YWNoZU92ZXJsYXkgPSB7CiAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICB2YXIgY2g7CiAgICAgIGlmIChzdHJlYW0ubWF0Y2goInt7IikpIHsKICAgICAgICB3aGlsZSAoKGNoID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkKICAgICAgICAgIGlmIChjaCA9PSAifSIgJiYgc3RyZWFtLm5leHQoKSA9PSAifSIpIGJyZWFrOwogICAgICAgIHN0cmVhbS5lYXQoIn0iKTsKICAgICAgICByZXR1cm4gIm11c3RhY2hlIjsKICAgICAgfQogICAgICB3aGlsZSAoc3RyZWFtLm5leHQoKSAhPSBudWxsICYmICFzdHJlYW0ubWF0Y2goInt7IiwgZmFsc2UpKSB7fQogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICB9OwogIHJldHVybiBDb2RlTWlycm9yLm92ZXJsYXlNb2RlKENvZGVNaXJyb3IuZ2V0TW9kZShjb25maWcsIHBhcnNlckNvbmZpZy5iYWNrZHJvcCB8fCAidGV4dC9odG1sIiksIG11c3RhY2hlT3ZlcmxheSk7Cn0pOwp2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwge21vZGU6ICJtdXN0YWNoZSJ9KTsKPC9zY3JpcHQ+CgogICAgPHA+RGVtb25zdHJhdGlvbiBvZiBhIG1vZGUgdGhhdCBwYXJzZXMgSFRNTCwgaGlnaGxpZ2h0aW5nCiAgICB0aGUgPGEgaHJlZj0iaHR0cDovL211c3RhY2hlLmdpdGh1Yi5jb20vIj5NdXN0YWNoZTwvYT4gdGVtcGxhdGluZwogICAgZGlyZWN0aXZlcyBpbnNpZGUgb2YgaXQgYnkgdXNpbmcgdGhlIGNvZGUKICAgIGluIDxhIGhyZWY9Ii4uL2FkZG9uL21vZGUvb3ZlcmxheS5qcyI+PGNvZGU+b3ZlcmxheS5qczwvY29kZT48L2E+LiBWaWV3CiAgICBzb3VyY2UgdG8gc2VlIHRoZSAxNSBsaW5lcyBvZiBjb2RlIG5lZWRlZCB0byBhY2NvbXBsaXNoIHRoaXMuPC9wPgoKICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/demo/placeholder.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogUGxhY2Vob2xkZXIgZGVtbzwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxzY3JpcHQgc3JjPSIuLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9hZGRvbi9kaXNwbGF5L3BsYWNlaG9sZGVyLmpzIj48L3NjcmlwdD4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KICAgICAgLkNvZGVNaXJyb3IgeyBib3JkZXI6IDFweCBzb2xpZCBzaWx2ZXI7IH0KICAgICAgLkNvZGVNaXJyb3ItZW1wdHkgeyBvdXRsaW5lOiAxcHggc29saWQgI2MyMjsgfQogICAgICAuQ29kZU1pcnJvci1lbXB0eS5Db2RlTWlycm9yLWZvY3VzZWQgeyBvdXRsaW5lOiBub25lOyB9CiAgICAgIC5Db2RlTWlycm9yIHByZS5Db2RlTWlycm9yLXBsYWNlaG9sZGVyIHsgY29sb3I6ICM5OTk7IH0KICAgIDwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGltZyBpZD1sb2dvIHNyYz0iLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPlBsYWNlaG9sZGVyPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5QbGFjZWhvbGRlciBkZW1vPC9oMj4KPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIiBwbGFjZWhvbGRlcj0iQ29kZSBnb2VzIGhlcmUuLi4iPjwvdGV4dGFyZWE+PC9mb3JtPgoKICAgIDxwPlRoZSA8YSBocmVmPSIuLi9kb2MvbWFudWFsLmh0bWwjYWRkb25fcGxhY2Vob2xkZXIiPnBsYWNlaG9sZGVyPC9hPgogICAgcGx1Zy1pbiBhZGRzIGFuIG9wdGlvbiA8Y29kZT5wbGFjZWhvbGRlcjwvY29kZT4gdGhhdCBjYW4gYmUgc2V0IHRvCiAgICBtYWtlIHRleHQgYXBwZWFyIGluIHRoZSBlZGl0b3Igd2hlbiBpdCBpcyBlbXB0eSBhbmQgbm90IGZvY3VzZWQuCiAgICBJZiB0aGUgc291cmNlIHRleHRhcmVhIGhhcyBhIDxjb2RlPnBsYWNlaG9sZGVyPC9jb2RlPiBhdHRyaWJ1dGUsCiAgICBpdCB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgaW5oZXJpdGVkLjwvcD4KCiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlCiAgICAgIH0pOwogICAgPC9zY3JpcHQ+CgogIDwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/demo/preview.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogSFRNTDUgcHJldmlldzwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPS4uL2xpYi9jb2RlbWlycm9yLmNzcz4KPHNjcmlwdCBzcmM9Li4vbGliL2NvZGVtaXJyb3IuanM+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPS4uL21vZGUveG1sL3htbC5qcz48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Li4vbW9kZS9qYXZhc2NyaXB0L2phdmFzY3JpcHQuanM+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPS4uL21vZGUvY3NzL2Nzcy5qcz48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Li4vbW9kZS9odG1sbWl4ZWQvaHRtbG1peGVkLmpzPjwvc2NyaXB0Pgo8c3R5bGUgdHlwZT10ZXh0L2Nzcz4KICAgICAgLkNvZGVNaXJyb3IgewogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICAgIHdpZHRoOiA1MCU7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7CiAgICAgIH0KICAgICAgaWZyYW1lIHsKICAgICAgICB3aWR0aDogNDklOwogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICAgIGhlaWdodDogMzAwcHg7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7CiAgICAgICAgYm9yZGVyLWxlZnQ6IDBweDsKICAgICAgfQogICAgPC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aW1nIGlkPWxvZ28gc3JjPSIuLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+SFRNTDUgcHJldmlldzwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+SFRNTDUgcHJldmlldzwvaDI+CgogICAgPHRleHRhcmVhIGlkPWNvZGUgbmFtZT1jb2RlPgo8IWRvY3R5cGUgaHRtbD4KPGh0bWw+CiAgPGhlYWQ+CiAgICA8bWV0YSBjaGFyc2V0PXV0Zi04PgogICAgPHRpdGxlPkhUTUw1IGNhbnZhcyBkZW1vPC90aXRsZT4KICAgIDxzdHlsZT5wIHtmb250LWZhbWlseTogbW9ub3NwYWNlO308L3N0eWxlPgogIDwvaGVhZD4KICA8Ym9keT4KICAgIDxwPkNhbnZhcyBwYW5lIGdvZXMgaGVyZTo8L3A+CiAgICA8Y2FudmFzIGlkPXBhbmUgd2lkdGg9MzAwIGhlaWdodD0yMDA+PC9jYW52YXM+CiAgICA8c2NyaXB0PgogICAgICB2YXIgY2FudmFzID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3BhbmUnKTsKICAgICAgdmFyIGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dCgnMmQnKTsKCiAgICAgIGNvbnRleHQuZmlsbFN0eWxlID0gJ3JnYigyNTAsMCwwKSc7CiAgICAgIGNvbnRleHQuZmlsbFJlY3QoMTAsIDEwLCA1NSwgNTApOwoKICAgICAgY29udGV4dC5maWxsU3R5bGUgPSAncmdiYSgwLCAwLCAyNTAsIDAuNSknOwogICAgICBjb250ZXh0LmZpbGxSZWN0KDMwLCAzMCwgNTUsIDUwKTsKICAgIDwvc2NyaXB0PgogIDwvYm9keT4KPC9odG1sPjwvdGV4dGFyZWE+CiAgICA8aWZyYW1lIGlkPXByZXZpZXc+PC9pZnJhbWU+CiAgICA8c2NyaXB0PgogICAgICB2YXIgZGVsYXk7CiAgICAgIC8vIEluaXRpYWxpemUgQ29kZU1pcnJvciBlZGl0b3Igd2l0aCBhIG5pY2UgaHRtbDUgY2FudmFzIGRlbW8uCiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29kZScpLCB7CiAgICAgICAgbW9kZTogJ3RleHQvaHRtbCcKICAgICAgfSk7CiAgICAgIGVkaXRvci5vbigiY2hhbmdlIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgY2xlYXJUaW1lb3V0KGRlbGF5KTsKICAgICAgICBkZWxheSA9IHNldFRpbWVvdXQodXBkYXRlUHJldmlldywgMzAwKTsKICAgICAgfSk7CiAgICAgIAogICAgICBmdW5jdGlvbiB1cGRhdGVQcmV2aWV3KCkgewogICAgICAgIHZhciBwcmV2aWV3RnJhbWUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncHJldmlldycpOwogICAgICAgIHZhciBwcmV2aWV3ID0gIHByZXZpZXdGcmFtZS5jb250ZW50RG9jdW1lbnQgfHwgIHByZXZpZXdGcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50OwogICAgICAgIHByZXZpZXcub3BlbigpOwogICAgICAgIHByZXZpZXcud3JpdGUoZWRpdG9yLmdldFZhbHVlKCkpOwogICAgICAgIHByZXZpZXcuY2xvc2UoKTsKICAgICAgfQogICAgICBzZXRUaW1lb3V0KHVwZGF0ZVByZXZpZXcsIDMwMCk7CiAgICA8L3NjcmlwdD4KICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/demo/resize.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogQXV0b3Jlc2l6ZSBEZW1vPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL21vZGUvY3NzL2Nzcy5qcyI+PC9zY3JpcHQ+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICAgIC5Db2RlTWlycm9yIHsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZWVlOwogICAgICAgIGhlaWdodDogYXV0bzsKICAgICAgfQogICAgICAuQ29kZU1pcnJvci1zY3JvbGwgewogICAgICAgIG92ZXJmbG93LXk6IGhpZGRlbjsKICAgICAgICBvdmVyZmxvdy14OiBhdXRvOwogICAgICB9CiAgICA8L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5BdXRvcmVzaXplPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5BdXRvcmVzaXplIERlbW88L2gyPgo8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgouQ29kZU1pcnJvciB7CiAgYm9yZGVyOiAxcHggc29saWQgI2VlZTsKICBoZWlnaHQ6IGF1dG87Cn0KLkNvZGVNaXJyb3Itc2Nyb2xsIHsKICBvdmVyZmxvdy15OiBoaWRkZW47CiAgb3ZlcmZsb3cteDogYXV0bzsKfQo8L3RleHRhcmVhPjwvZm9ybT4KCjxwPkJ5IHNldHRpbmcgYSBmZXcgQ1NTIHByb3BlcnRpZXMsIGFuZCBnaXZpbmcKdGhlIDxhIGhyZWY9Ii4uL2RvYy9tYW51YWwuaHRtbCNvcHRpb25fdmlld3BvcnRNYXJnaW4iPjxjb2RlPnZpZXdwb3J0TWFyZ2luPC9jb2RlPjwvYT4KYSB2YWx1ZSBvZiA8Y29kZT5JbmZpbml0eTwvY29kZT4sIENvZGVNaXJyb3IgY2FuIGJlIG1hZGUgdG8KYXV0b21hdGljYWxseSByZXNpemUgdG8gZml0IGl0cyBjb250ZW50LjwvcD4KCiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgICAgIHZpZXdwb3J0TWFyZ2luOiBJbmZpbml0eQogICAgICB9KTsKICAgIDwvc2NyaXB0PgoKICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/demo/rulers.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogUnVsZXIgRGVtbzwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxzY3JpcHQgc3JjPSIuLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9hZGRvbi9kaXNwbGF5L3J1bGVycy5qcyI+PC9zY3JpcHQ+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgLkNvZGVNaXJyb3Ige2JvcmRlci10b3A6IDFweCBzb2xpZCAjODg4OyBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzg4ODt9Cjwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGltZyBpZD1sb2dvIHNyYz0iLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPlJ1bGVyIGRlbW88L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPlJ1bGVyIERlbW88L2gyPgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgogIHZhciBudW1zID0gIjAxMjM0NTY3ODkiLCBzcGFjZSA9ICIgICAgICAgICAgIjsKICB2YXIgY29sb3JzID0gWyIjZmNjIiwgIiNmNWY1NzciLCAiI2NmYyIsICIjYWZmIiwgIiNjY2YiLCAiI2ZjZiJdOwogIHZhciBydWxlcnMgPSBbXSwgdmFsdWUgPSAiIjsKICBmb3IgKHZhciBpID0gMTsgaSA8PSA2OyBpKyspIHsKICAgIHJ1bGVycy5wdXNoKHtjb2xvcjogY29sb3JzW2ldLCBjb2x1bW46IGkgKiAxMCwgbGluZVN0eWxlOiAiZGFzaGVkIn0pOwogICAgZm9yICh2YXIgaiA9IDE7IGogPCBpOyBqKyspIHZhbHVlICs9IHNwYWNlOwogICAgdmFsdWUgKz0gbnVtcyArICJcbiI7CiAgfQogIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yKGRvY3VtZW50LmJvZHkubGFzdENoaWxkLCB7CiAgICBydWxlcnM6IHJ1bGVycywKICAgIHZhbHVlOiB2YWx1ZSArIHZhbHVlICsgdmFsdWUsCiAgICBsaW5lTnVtYmVyczogdHJ1ZQp9KTsKPC9zY3JpcHQ+Cgo8cD5EZW1vbnN0cmF0aW9uIG9mCnRoZSA8YSBocmVmPSIuLi9kb2MvbWFudWFsLmh0bWwjYWRkb25fcnVsZXJzIj5ydWxlcnM8L2E+IGFkZG9uLCB3aGljaApkaXNwbGF5cyB2ZXJ0aWNhbCBsaW5lcyBhdCBnaXZlbiBjb2x1bW4gb2Zmc2V0cy48L3A+Cgo8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/demo/runmode.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogTW9kZSBSdW5uZXIgRGVtbzwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxzY3JpcHQgc3JjPSIuLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9hZGRvbi9ydW5tb2RlL3J1bm1vZGUuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vbW9kZS94bWwveG1sLmpzIj48L3NjcmlwdD4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aW1nIGlkPWxvZ28gc3JjPSIuLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+TW9kZSBSdW5uZXI8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPk1vZGUgUnVubmVyIERlbW88L2gyPgoKCiAgICA8dGV4dGFyZWEgaWQ9ImNvZGUiIHN0eWxlPSJ3aWR0aDogOTAlOyBoZWlnaHQ6IDdlbTsgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7IHBhZGRpbmc6IC4yZW0gLjRlbTsiPgo8Zm9vYmFyPgogIDxibGFoPkVudGVyIHlvdXIgeG1sIGhlcmUgYW5kIHByZXNzIHRoZSBidXR0b24gYmVsb3cgdG8gZGlzcGxheQogICAgaXQgYXMgaGlnaGxpZ2h0ZWQgYnkgdGhlIENvZGVNaXJyb3IgWE1MIG1vZGU8L2JsYWg+CiAgPHRhZzIgZm9vPSIyIiBiYXI9IiZhbXA7cXVvdDtiYXImYW1wO3F1b3Q7Ii8+CjwvZm9vYmFyPjwvdGV4dGFyZWE+PGJyPgogICAgPGJ1dHRvbiBvbmNsaWNrPSJkb0hpZ2hsaWdodCgpOyI+SGlnaGxpZ2h0ITwvYnV0dG9uPgogICAgPHByZSBpZD0ib3V0cHV0IiBjbGFzcz0iY20tcy1kZWZhdWx0Ij48L3ByZT4KCiAgICA8c2NyaXB0PgpmdW5jdGlvbiBkb0hpZ2hsaWdodCgpIHsKICBDb2RlTWlycm9yLnJ1bk1vZGUoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKS52YWx1ZSwgImFwcGxpY2F0aW9uL3htbCIsCiAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJvdXRwdXQiKSk7Cn0KPC9zY3JpcHQ+CgogICAgPHA+UnVubmluZyBhIENvZGVNaXJyb3IgbW9kZSBvdXRzaWRlIG9mIHRoZSBlZGl0b3IuCiAgICBUaGUgPGNvZGU+Q29kZU1pcnJvci5ydW5Nb2RlPC9jb2RlPiBmdW5jdGlvbiwgZGVmaW5lZAogICAgaW4gPGNvZGU+PGEgaHJlZj0iLi4vYWRkb24vcnVubW9kZS9ydW5tb2RlLmpzIj5saWIvcnVubW9kZS5qczwvYT48L2NvZGU+IHRha2VzIHRoZSBmb2xsb3dpbmcgYXJndW1lbnRzOjwvcD4KCiAgICA8ZGw+CiAgICAgIDxkdD48Y29kZT50ZXh0IChzdHJpbmcpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5UaGUgZG9jdW1lbnQgdG8gcnVuIHRocm91Z2ggdGhlIGhpZ2hsaWdodGVyLjwvZGQ+CiAgICAgIDxkdD48Y29kZT5tb2RlICg8YSBocmVmPSIuLi9kb2MvbWFudWFsLmh0bWwjb3B0aW9uX21vZGUiPm1vZGUgc3BlYzwvYT4pPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5UaGUgbW9kZSB0byB1c2UgKG11c3QgYmUgbG9hZGVkIGFzIG5vcm1hbCkuPC9kZD4KICAgICAgPGR0Pjxjb2RlPm91dHB1dCAoZnVuY3Rpb24gb3IgRE9NIG5vZGUpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5JZiB0aGlzIGlzIGEgZnVuY3Rpb24sIGl0IHdpbGwgYmUgY2FsbGVkIGZvciBlYWNoIHRva2VuIHdpdGgKICAgICAgdHdvIGFyZ3VtZW50cywgdGhlIHRva2VuJ3MgdGV4dCBhbmQgdGhlIHRva2VuJ3Mgc3R5bGUgY2xhc3MgKG1heQogICAgICBiZSA8Y29kZT5udWxsPC9jb2RlPiBmb3IgdW5zdHlsZWQgdG9rZW5zKS4gSWYgaXQgaXMgYSBET00gbm9kZSwKICAgICAgdGhlIHRva2VucyB3aWxsIGJlIGNvbnZlcnRlZCB0byA8Y29kZT5zcGFuPC9jb2RlPiBlbGVtZW50cyBhcyBpbgogICAgICBhbiBlZGl0b3IsIGFuZCBpbnNlcnRlZCBpbnRvIHRoZSBub2RlCiAgICAgICh0aHJvdWdoIDxjb2RlPmlubmVySFRNTDwvY29kZT4pLjwvZGQ+CiAgICA8L2RsPgoKICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/demo/search.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogU2VhcmNoL1JlcGxhY2UgRGVtbzwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vYWRkb24vZGlhbG9nL2RpYWxvZy5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vbW9kZS94bWwveG1sLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL2FkZG9uL2RpYWxvZy9kaWFsb2cuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vYWRkb24vc2VhcmNoL3NlYXJjaGN1cnNvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9hZGRvbi9zZWFyY2gvc2VhcmNoLmpzIj48L3NjcmlwdD4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KICAgICAgLkNvZGVNaXJyb3Ige2JvcmRlci10b3A6IDFweCBzb2xpZCBibGFjazsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO30KICAgICAgZHQge2ZvbnQtZmFtaWx5OiBtb25vc3BhY2U7IGNvbG9yOiAjNjY2O30KICAgIDwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGltZyBpZD1sb2dvIHNyYz0iLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPlNlYXJjaC9SZXBsYWNlPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5TZWFyY2gvUmVwbGFjZSBEZW1vPC9oMj4KPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KPGRsPgogIDxkdCBpZD0ib3B0aW9uX2luZGVudFdpdGhUYWJzIj48Y29kZT48c3Ryb25nPmluZGVudFdpdGhUYWJzPC9zdHJvbmc+OiBib29sZWFuPC9jb2RlPjwvZHQ+CiAgPGRkPldoZXRoZXIsIHdoZW4gaW5kZW50aW5nLCB0aGUgZmlyc3QgTio8Y29kZT50YWJTaXplPC9jb2RlPgogIHNwYWNlcyBzaG91bGQgYmUgcmVwbGFjZWQgYnkgTiB0YWJzLiBEZWZhdWx0IGlzIGZhbHNlLjwvZGQ+CgogIDxkdCBpZD0ib3B0aW9uX2VsZWN0cmljQ2hhcnMiPjxjb2RlPjxzdHJvbmc+ZWxlY3RyaWNDaGFyczwvc3Ryb25nPjogYm9vbGVhbjwvY29kZT48L2R0PgogIDxkZD5Db25maWd1cmVzIHdoZXRoZXIgdGhlIGVkaXRvciBzaG91bGQgcmUtaW5kZW50IHRoZSBjdXJyZW50CiAgbGluZSB3aGVuIGEgY2hhcmFjdGVyIGlzIHR5cGVkIHRoYXQgbWlnaHQgY2hhbmdlIGl0cyBwcm9wZXIKICBpbmRlbnRhdGlvbiAob25seSB3b3JrcyBpZiB0aGUgbW9kZSBzdXBwb3J0cyBpbmRlbnRhdGlvbikuCiAgRGVmYXVsdCBpcyB0cnVlLjwvZGQ+CgogIDxkdCBpZD0ib3B0aW9uX3NwZWNpYWxDaGFycyI+PGNvZGU+PHN0cm9uZz5zcGVjaWFsQ2hhcnM8L3N0cm9uZz46IFJlZ0V4cDwvY29kZT48L2R0PgogIDxkZD5BIHJlZ3VsYXIgZXhwcmVzc2lvbiB1c2VkIHRvIGRldGVybWluZSB3aGljaCBjaGFyYWN0ZXJzCiAgc2hvdWxkIGJlIHJlcGxhY2VkIGJ5IGEKICBzcGVjaWFsIDxhIGhyZWY9IiNvcHRpb25fc3BlY2lhbENoYXJQbGFjZWhvbGRlciI+cGxhY2Vob2xkZXI8L2E+LgogIE1vc3RseSB1c2VmdWwgZm9yIG5vbi1wcmludGluZyBzcGVjaWFsIGNoYXJhY3RlcnMuIFRoZSBkZWZhdWx0CiAgaXMgPGNvZGU+L1tcdTAwMDAtXHUwMDE5XHUwMGFkXHUyMDBiXHUyMDI4XHUyMDI5XHVmZWZmXS88L2NvZGU+LjwvZGQ+CiAgPGR0IGlkPSJvcHRpb25fc3BlY2lhbENoYXJQbGFjZWhvbGRlciI+PGNvZGU+PHN0cm9uZz5zcGVjaWFsQ2hhclBsYWNlaG9sZGVyPC9zdHJvbmc+OiBmdW5jdGlvbihjaGFyKcKg4oaSwqBFbGVtZW50PC9jb2RlPjwvZHQ+CiAgPGRkPkEgZnVuY3Rpb24gdGhhdCwgZ2l2ZW4gYSBzcGVjaWFsIGNoYXJhY3RlciBpZGVudGlmaWVkIGJ5CiAgdGhlIDxhIGhyZWY9IiNvcHRpb25fc3BlY2lhbENoYXJzIj48Y29kZT5zcGVjaWFsQ2hhcnM8L2NvZGU+PC9hPgogIG9wdGlvbiwgcHJvZHVjZXMgYSBET00gbm9kZSB0aGF0IGlzIHVzZWQgdG8gcmVwcmVzZW50IHRoZQogIGNoYXJhY3Rlci4gQnkgZGVmYXVsdCwgYSByZWQgZG90ICg8c3BhbiBzdHlsZT0iY29sb3I6IHJlZCI+4oCiPC9zcGFuPikKICBpcyBzaG93biwgd2l0aCBhIHRpdGxlIHRvb2x0aXAgdG8gaW5kaWNhdGUgdGhlIGNoYXJhY3RlciBjb2RlLjwvZGQ+CgogIDxkdCBpZD0ib3B0aW9uX3J0bE1vdmVWaXN1YWxseSI+PGNvZGU+PHN0cm9uZz5ydGxNb3ZlVmlzdWFsbHk8L3N0cm9uZz46IGJvb2xlYW48L2NvZGU+PC9kdD4KICA8ZGQ+RGV0ZXJtaW5lcyB3aGV0aGVyIGhvcml6b250YWwgY3Vyc29yIG1vdmVtZW50IHRocm91Z2gKICByaWdodC10by1sZWZ0IChBcmFiaWMsIEhlYnJldykgdGV4dCBpcyB2aXN1YWwgKHByZXNzaW5nIHRoZSBsZWZ0CiAgYXJyb3cgbW92ZXMgdGhlIGN1cnNvciBsZWZ0KSBvciBsb2dpY2FsIChwcmVzc2luZyB0aGUgbGVmdCBhcnJvdwogIG1vdmVzIHRvIHRoZSBuZXh0IGxvd2VyIGluZGV4IGluIHRoZSBzdHJpbmcsIHdoaWNoIGlzIHZpc3VhbGx5CiAgcmlnaHQgaW4gcmlnaHQtdG8tbGVmdCB0ZXh0KS4gVGhlIGRlZmF1bHQgaXMgPGNvZGU+ZmFsc2U8L2NvZGU+CiAgb24gV2luZG93cywgYW5kIDxjb2RlPnRydWU8L2NvZGU+IG9uIG90aGVyIHBsYXRmb3Jtcy48L2RkPgo8L2RsPgo8L3RleHRhcmVhPjwvZm9ybT4KCiAgICA8c2NyaXB0Pgp2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwge21vZGU6ICJ0ZXh0L2h0bWwiLCBsaW5lTnVtYmVyczogdHJ1ZX0pOwo8L3NjcmlwdD4KCiAgICA8cD5EZW1vbnN0cmF0aW9uIG9mIHByaW1pdGl2ZSBzZWFyY2gvcmVwbGFjZSBmdW5jdGlvbmFsaXR5LiBUaGUKICAgIGtleWJpbmRpbmdzICh3aGljaCBjYW4gYmUgb3ZlcnJpZGRlbiBieSBjdXN0b20ga2V5bWFwcykgYXJlOjwvcD4KICAgIDxkbD4KICAgICAgPGR0PkN0cmwtRiAvIENtZC1GPC9kdD48ZGQ+U3RhcnQgc2VhcmNoaW5nPC9kZD4KICAgICAgPGR0PkN0cmwtRyAvIENtZC1HPC9kdD48ZGQ+RmluZCBuZXh0PC9kZD4KICAgICAgPGR0PlNoaWZ0LUN0cmwtRyAvIFNoaWZ0LUNtZC1HPC9kdD48ZGQ+RmluZCBwcmV2aW91czwvZGQ+CiAgICAgIDxkdD5TaGlmdC1DdHJsLUYgLyBDbWQtT3B0aW9uLUY8L2R0PjxkZD5SZXBsYWNlPC9kZD4KICAgICAgPGR0PlNoaWZ0LUN0cmwtUiAvIFNoaWZ0LUNtZC1PcHRpb24tRjwvZHQ+PGRkPlJlcGxhY2UgYWxsPC9kZD4KICAgIDwvZGw+CiAgICA8cD5TZWFyY2hpbmcgaXMgZW5hYmxlZCBieQogICAgaW5jbHVkaW5nIDxhIGhyZWY9Ii4uL2FkZG9uL3NlYXJjaC9zZWFyY2guanMiPmFkZG9uL3NlYXJjaC9zZWFyY2guanM8L2E+CiAgICBhbmQgPGEgaHJlZj0iLi4vYWRkb24vc2VhcmNoL3NlYXJjaGN1cnNvci5qcyI+YWRkb24vc2VhcmNoL3NlYXJjaGN1cnNvci5qczwvYT4uCiAgICBGb3IgZ29vZC1sb29raW5nIGlucHV0IGRpYWxvZ3MsIHlvdSBhbHNvIHdhbnQgdG8gaW5jbHVkZQogICAgPGEgaHJlZj0iLi4vYWRkb24vZGlhbG9nL2RpYWxvZy5qcyI+YWRkb24vZGlhbG9nL2RpYWxvZy5qczwvYT4KICAgIGFuZCA8YSBocmVmPSIuLi9hZGRvbi9kaWFsb2cvZGlhbG9nLmNzcyI+YWRkb24vZGlhbG9nL2RpYWxvZy5jc3M8L2E+LjwvcD4KICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/demo/spanaffectswrapping_shim.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogQXV0b21hdGljYWxseSBkZXJpdmUgb2RkIHdyYXBwaW5nIGJlaGF2aW9yIGZvciB5b3VyIGJyb3dzZXI8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi9kb2MvZG9jcy5jc3MiPgoKPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aW1nIGlkPWxvZ28gc3JjPSIuLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+QXV0b21hdGljYWxseSBkZXJpdmUgb2RkIHdyYXBwaW5nIGJlaGF2aW9yIGZvciB5b3VyIGJyb3dzZXI8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPkF1dG9tYXRpY2FsbHkgZGVyaXZlIG9kZCB3cmFwcGluZyBiZWhhdmlvciBmb3IgeW91ciBicm93c2VyPC9oMj4KCgogICAgPHA+VGhpcyBpcyBhIGhhY2sgdG8gYXV0b21hdGljYWxseSBkZXJpdmUKICAgIGEgPGNvZGU+c3BhbkFmZmVjdHNXcmFwcGluZzwvY29kZT4gcmVnZXhwIGZvciBhIGJyb3dzZXIuIFNlZSB0aGUKICAgIGNvbW1lbnRzIGFib3ZlIHRoYXQgdmFyaWFibGUKICAgIGluIDxhIGhyZWY9Ii4uL2xpYi9jb2RlbWlycm9yLmpzIj48Y29kZT5saWIvY29kZW1pcnJvci5qczwvY29kZT48L2E+CiAgICBmb3Igc29tZSBtb3JlIGRldGFpbHMuPC9wPgoKICAgIDxkaXYgc3R5bGU9IndoaXRlLXNwYWNlOiBwcmUtd3JhcDsgd2lkdGg6IDUwcHg7IiBpZD0iYXJlYSI+PC9kaXY+CiAgICA8cHJlIGlkPSJvdXRwdXQiPjwvcHJlPgoKICAgIDxzY3JpcHQgaWQ9InNjcmlwdCI+CiAgICAgIHZhciBhID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImFyZWEiKSwgYmFkID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgdmFyIGNoYXJzID0gImF+YCFAIyQlXiYqKCktXz0rfXtbXVxcfCdcIi8/Lj4sPDo7IiwgbCA9IGNoYXJzLmxlbmd0aDsKICAgICAgZm9yICh2YXIgeCA9IDA7IHggPCBsOyArK3gpIGZvciAodmFyIHkgPSAwOyB5IDwgbDsgKyt5KSB7CiAgICAgICAgdmFyIHMxID0gImZvb29vIiArIGNoYXJzLmNoYXJBdCh4KSwgczIgPSBjaGFycy5jaGFyQXQoeSkgKyAiYnIiOwogICAgICAgIGEuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoczEgKyBzMikpOwogICAgICAgIHZhciBoMSA9IGEub2Zmc2V0SGVpZ2h0OwogICAgICAgIGEuaW5uZXJIVE1MID0gIiI7CiAgICAgICAgYS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIikpLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHMxKSk7CiAgICAgICAgYS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIikpLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHMyKSk7CiAgICAgICAgaWYgKGEub2Zmc2V0SGVpZ2h0ICE9IGgxKQogICAgICAgICAgYmFkW2NoYXJzLmNoYXJBdCh4KV0gPSAoYmFkW2NoYXJzLmNoYXJBdCh4KV0gfHwgIiIpICsgY2hhcnMuY2hhckF0KHkpOwogICAgICAgIGEuaW5uZXJIVE1MID0gIiI7CiAgICAgIH0KCiAgICAgIHZhciByZSA9ICIiOwogICAgICBmdW5jdGlvbiB0b1JFRWx0KHN0cikgewogICAgICAgIGlmIChzdHIubGVuZ3RoID4gMSkgewogICAgICAgICAgdmFyIGludmVydCA9IGZhbHNlOwogICAgICAgICAgaWYgKHN0ci5sZW5ndGggPiBjaGFycy5sZW5ndGggKiAuNikgewogICAgICAgICAgICBpbnZlcnQgPSB0cnVlOwogICAgICAgICAgICB2YXIgbmV3U3RyID0gIiI7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbDsgKytpKSBpZiAoc3RyLmluZGV4T2YoY2hhcnMuY2hhckF0KGkpKSA9PSAtMSkgbmV3U3RyICs9IGNoYXJzLmNoYXJBdChpKTsKICAgICAgICAgICAgc3RyID0gbmV3U3RyOwogICAgICAgICAgfQogICAgICAgICAgc3RyID0gc3RyLnJlcGxhY2UoL1tcLVwuXF1cIlwnXFxcL1xeYV0vZywgZnVuY3Rpb24ob3JpZykgeyByZXR1cm4gb3JpZyA9PSAiYSIgPyAiXFx3IiA6ICJcXCIgKyBvcmlnOyB9KTsKICAgICAgICAgIHJldHVybiAiWyIgKyAoaW52ZXJ0ID8gIl4iIDogIiIpICsgc3RyICsgIl0iOwogICAgICAgIH0gZWxzZSBpZiAoc3RyID09ICJhIikgewogICAgICAgICAgcmV0dXJuICJcXHciOwogICAgICAgIH0gZWxzZSBpZiAoL1s/JCooKSt7fVtcXVwufC9cJ1wiXS8udGVzdChzdHIpKSB7CiAgICAgICAgICByZXR1cm4gIlxcIiArIHN0cjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIHN0cjsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHZhciBuZXdSRSA9ICIiOwogICAgICBmb3IgKDs7KSB7CiAgICAgICAgdmFyIGxlZnQgPSBudWxsOwogICAgICAgIGZvciAodmFyIGxlZnQgaW4gYmFkKSBicmVhazsKICAgICAgICBpZiAobGVmdCA9PSBudWxsKSBicmVhazsKICAgICAgICB2YXIgcmlnaHQgPSBiYWRbbGVmdF07CiAgICAgICAgZGVsZXRlIGJhZFtsZWZ0XTsKICAgICAgICBmb3IgKHZhciBvdGhlciBpbiBiYWQpIGlmIChiYWRbb3RoZXJdID09IHJpZ2h0KSB7CiAgICAgICAgICBsZWZ0ICs9IG90aGVyOwogICAgICAgICAgZGVsZXRlIGJhZFtvdGhlcl07CiAgICAgICAgfQogICAgICAgIG5ld1JFICs9IChuZXdSRSA/ICJ8IiA6ICIiKSArIHRvUkVFbHQobGVmdCkgKyB0b1JFRWx0KHJpZ2h0KTsKICAgICAgfQoKICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm91dHB1dCIpLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCJZb3VyIHJlZ2V4cCBpczogIiArIChuZXdSRSB8fCAiXiQiKSkpOwogICAgPC9zY3JpcHQ+CiAgPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/demo/sublime.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogU3VibGltZSBUZXh0IGJpbmRpbmdzIGRlbW88L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9saWIvY29kZW1pcnJvci5jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL2FkZG9uL2ZvbGQvZm9sZGd1dHRlci5jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL2FkZG9uL2RpYWxvZy9kaWFsb2cuY3NzIj4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi90aGVtZS9tb25va2FpLmNzcyI+CjxzY3JpcHQgc3JjPSIuLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9hZGRvbi9zZWFyY2gvc2VhcmNoY3Vyc29yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL2FkZG9uL3NlYXJjaC9zZWFyY2guanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vYWRkb24vZGlhbG9nL2RpYWxvZy5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9hZGRvbi9lZGl0L21hdGNoYnJhY2tldHMuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vYWRkb24vZWRpdC9jbG9zZWJyYWNrZXRzLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL2FkZG9uL2NvbW1lbnQvY29tbWVudC5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9hZGRvbi93cmFwL2hhcmR3cmFwLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL2FkZG9uL2ZvbGQvZm9sZGNvZGUuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vYWRkb24vZm9sZC9icmFjZS1mb2xkLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL21vZGUvamF2YXNjcmlwdC9qYXZhc2NyaXB0LmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL2tleW1hcC9zdWJsaW1lLmpzIj48L3NjcmlwdD4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KICAuQ29kZU1pcnJvciB7Ym9yZGVyLXRvcDogMXB4IHNvbGlkICNlZWU7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZWVlOyBsaW5lLWhlaWdodDogMS4zOyBoZWlnaHQ6IDUwMHB4fQogIC5Db2RlTWlycm9yLWxpbmVudW1iZXJzIHsgcGFkZGluZzogMCA4cHg7IH0KPC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aW1nIGlkPWxvZ28gc3JjPSIuLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+U3VibGltZSBiaW5kaW5nczwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+U3VibGltZSBUZXh0IGJpbmRpbmdzIGRlbW88L2gyPgoKPHA+VGhlIDxjb2RlPnN1YmxpbWU8L2NvZGU+IGtleW1hcCBkZWZpbmVzIG1hbnkgU3VibGltZSBUZXh0LXNwZWNpZmljCmJpbmRpbmdzIGZvciBDb2RlTWlycm9yLiBTZWUgdGhlIGNvZGUgYmVsb3cgZm9yIGFuIG92ZXJ2aWV3LjwvcD4KCjxwPkVuYWJsZSB0aGUga2V5bWFwIGJ5CmxvYWRpbmcgPGEgaHJlZj0iLi4va2V5bWFwL3N1YmxpbWUuanMiPjxjb2RlPmtleW1hcC9zdWJsaW1lLmpzPC9jb2RlPjwvYT4KYW5kIHNldHRpbmcKdGhlIDxhIGhyZWY9Ii4uL2RvYy9tYW51YWwuaHRtbCNvcHRpb25fa2V5TWFwIj48Y29kZT5rZXlNYXA8L2NvZGU+PC9hPgpvcHRpb24gdG8gPGNvZGU+InN1YmxpbWUiPC9jb2RlPi48L3A+Cgo8cD4oQSBsb3Qgb2YgdGhlIHNlYXJjaCBmdW5jdGlvbmFsaXR5IGlzIHN0aWxsIG1pc3NpbmcuKQoKPHNjcmlwdD4KICB2YXIgdmFsdWUgPSAiLy8gVGhlIGJpbmRpbmdzIGRlZmluZWQgc3BlY2lmaWNhbGx5IGluIHRoZSBTdWJsaW1lIFRleHQgbW9kZVxudmFyIGJpbmRpbmdzID0ge1xuIjsKICB2YXIgbWFwID0gQ29kZU1pcnJvci5rZXlNYXAuc3VibGltZSwgbWFwSyA9IENvZGVNaXJyb3Iua2V5TWFwWyJzdWJsaW1lLUN0cmwtSyJdOwogIGZvciAodmFyIGtleSBpbiBtYXApIHsKICAgIGlmIChrZXkgIT0gIkN0cmwtSyIgJiYga2V5ICE9ICJmYWxsdGhyb3VnaCIgJiYgKCEvZmluZC8udGVzdChtYXBba2V5XSkgfHwgL2ZpbmRVbmRlci8udGVzdChtYXBba2V5XSkpKQogICAgICB2YWx1ZSArPSAiICBcIiIgKyBrZXkgKyAiXCI6IFwiIiArIG1hcFtrZXldICsgIlwiLFxuIjsKICB9CiAgZm9yICh2YXIga2V5IGluIG1hcEspIHsKICAgIGlmIChrZXkgIT0gImF1dG8iICYmIGtleSAhPSAibm9mYWxsdGhyb3VnaCIpCiAgICAgIHZhbHVlICs9ICIgIFwiQ3RybC1LICIgKyBrZXkgKyAiXCI6IFwiIiArIG1hcEtba2V5XSArICJcIixcbiI7CiAgfQogIHZhbHVlICs9ICJ9XG5cbi8vIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiBqb2luTGluZXNcbiI7CiAgdmFsdWUgKz0gQ29kZU1pcnJvci5jb21tYW5kcy5qb2luTGluZXMudG9TdHJpbmcoKS5yZXBsYWNlKC9eZnVuY3Rpb25ccypcKC8sICJmdW5jdGlvbiBqb2luTGluZXMoIikucmVwbGFjZSgvXG4gIC9nLCAiXG4iKSArICJcbiI7CiAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IoZG9jdW1lbnQuYm9keS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYXJ0aWNsZSIpWzBdLCB7CiAgICB2YWx1ZTogdmFsdWUsCiAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgIG1vZGU6ICJqYXZhc2NyaXB0IiwKICAgIGtleU1hcDogInN1YmxpbWUiLAogICAgYXV0b0Nsb3NlQnJhY2tldHM6IHRydWUsCiAgICBtYXRjaEJyYWNrZXRzOiB0cnVlLAogICAgc2hvd0N1cnNvcldoZW5TZWxlY3Rpbmc6IHRydWUsCiAgICB0aGVtZTogIm1vbm9rYWkiCiAgfSk7Cjwvc2NyaXB0PgoKPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/demo/tern.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogVGVybiBEZW1vPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9hZGRvbi9kaWFsb2cvZGlhbG9nLmNzcyI+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vYWRkb24vaGludC9zaG93LWhpbnQuY3NzIj4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9hZGRvbi90ZXJuL3Rlcm4uY3NzIj4KPHNjcmlwdCBzcmM9Ii4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL21vZGUvamF2YXNjcmlwdC9qYXZhc2NyaXB0LmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL2FkZG9uL2RpYWxvZy9kaWFsb2cuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vYWRkb24vaGludC9zaG93LWhpbnQuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vYWRkb24vdGVybi90ZXJuLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Imh0dHA6Ly9tYXJpam5oYXZlcmJla2UubmwvYWNvcm4vYWNvcm4uanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iaHR0cDovL21hcmlqbmhhdmVyYmVrZS5ubC9hY29ybi9hY29ybl9sb29zZS5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJodHRwOi8vbWFyaWpuaGF2ZXJiZWtlLm5sL2Fjb3JuL3V0aWwvd2Fsay5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJodHRwOi8vdGVybmpzLm5ldC9kb2MvZGVtby9wb2x5ZmlsbC5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJodHRwOi8vdGVybmpzLm5ldC9saWIvc2lnbmFsLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Imh0dHA6Ly90ZXJuanMubmV0L2xpYi90ZXJuLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Imh0dHA6Ly90ZXJuanMubmV0L2xpYi9kZWYuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iaHR0cDovL3Rlcm5qcy5uZXQvbGliL2NvbW1lbnQuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iaHR0cDovL3Rlcm5qcy5uZXQvbGliL2luZmVyLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Imh0dHA6Ly90ZXJuanMubmV0L3BsdWdpbi9kb2NfY29tbWVudC5qcyI+PC9zY3JpcHQ+CjxzdHlsZT4KICAgICAgLkNvZGVNaXJyb3Ige2JvcmRlcjogMXB4IHNvbGlkICNkZGQ7fQogICAgPC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aW1nIGlkPWxvZ28gc3JjPSIuLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+VGVybjwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+VGVybiBEZW1vPC9oMj4KPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4vLyBVc2UgY3RybC1zcGFjZSB0byBjb21wbGV0ZSBzb21ldGhpbmcKLy8gUHV0IHRoZSBjdXJzb3IgaW4gb3IgYWZ0ZXIgYW4gZXhwcmVzc2lvbiwgcHJlc3MgY3RybC1pIHRvCi8vIGZpbmQgaXRzIHR5cGUKCnZhciBmb28gPSBbImFycmF5IiwgIm9mIiwgInN0cmluZ3MiXTsKdmFyIGJhciA9IGZvby5zbGljZSgwLCAyKS5qb2luKCIiKS5zcGxpdCgiYSIpWzBdOwoKLy8gV29ya3MgZm9yIGxvY2FsbHkgZGVmaW5lZCB0eXBlcyB0b28uCgpmdW5jdGlvbiBDVG9yKCkgeyB0aGlzLnNpemUgPSAxMDsgfQpDVG9yLnByb3RvdHlwZS5oYWxsbyA9ICJoYWxsbyI7Cgp2YXIgYmF6ID0gbmV3IENUb3I7CmJhei4KCi8vIFlvdSBjYW4gcHJlc3MgY3RybC1xIHdoZW4gdGhlIGN1cnNvciBpcyBvbiBhIHZhcmlhYmxlIG5hbWUgdG8KLy8gcmVuYW1lIGl0LiBUcnkgaXQgd2l0aCBDVG9yLi4uCgovLyBXaGVuIHRoZSBjdXJzb3IgaXMgaW4gYW4gYXJndW1lbnQgbGlzdCwgdGhlIGFyZ3VtZW50cyBhcmUKLy8gc2hvd24gYmVsb3cgdGhlIGVkaXRvci4KClsxXS5yZWR1Y2UoICApOwoKLy8gQW5kIGEgbGl0dGxlIG1vcmUgYWR2YW5jZWQgY29kZS4uLgoKKGZ1bmN0aW9uKGV4cG9ydHMpIHsKICBleHBvcnRzLnJhbmRvbUVsdCA9IGZ1bmN0aW9uKGFycikgewogICAgcmV0dXJuIGFycltNYXRoLmZsb29yKGFyci5sZW5ndGggKiBNYXRoLnJhbmRvbSgpKV07CiAgfTsKICBleHBvcnRzLnN0ckxpc3QgPSAiZm9vIi5zcGxpdCgiIik7CiAgZXhwb3J0cy5pbnRMaXN0ID0gZXhwb3J0cy5zdHJMaXN0Lm1hcChmdW5jdGlvbihzKSB7IHJldHVybiBzLmNoYXJDb2RlQXQoMCk7IH0pOwp9KSh3aW5kb3cubXlNb2QgPSB7fSk7Cgp2YXIgcmFuZG9tU3RyID0gbXlNb2QucmFuZG9tRWx0KG15TW9kLnN0ckxpc3QpOwp2YXIgcmFuZG9tSW50ID0gbXlNb2QucmFuZG9tRWx0KG15TW9kLmludExpc3QpOwo8L3RleHRhcmVhPjwvcD4KCjxwPkRlbW9uc3RyYXRlcyBpbnRlZ3JhdGlvbiBvZiA8YSBocmVmPSJodHRwOi8vdGVybmpzLm5ldC8iPlRlcm48L2E+CmFuZCBDb2RlTWlycm9yLiBUaGUgZm9sbG93aW5nIGtleXMgYXJlIGJvdW5kOjwvcD4KCjxkbD4KICA8ZHQ+Q3RybC1TcGFjZTwvZHQ+PGRkPkF1dG9jb21wbGV0ZTwvZGQ+CiAgPGR0PkN0cmwtSTwvZHQ+PGRkPkZpbmQgdHlwZSBhdCBjdXJzb3I8L2RkPgogIDxkdD5BbHQtLjwvZHQ+PGRkPkp1bXAgdG8gZGVmaW5pdGlvbiAoQWx0LSwgdG8ganVtcCBiYWNrKTwvZGQ+CiAgPGR0PkN0cmwtUTwvZHQ+PGRkPlJlbmFtZSB2YXJpYWJsZTwvZGQ+CiAgPGR0PkN0cmwtLjwvZHQ+PGRkPlNlbGVjdCBhbGwgb2NjdXJyZW5jZXMgb2YgYSB2YXJpYWJsZTwvZGQ+CjwvZGw+Cgo8cD5Eb2N1bWVudGF0aW9uIGlzIHNwYXJzZSBmb3Igbm93LiBTZWUgdGhlIHRvcCBvZgp0aGUgPGEgaHJlZj0iLi4vYWRkb24vdGVybi90ZXJuLmpzIj5zY3JpcHQ8L2E+IGZvciBhIHJvdWdoIEFQSQpvdmVydmlldy48L3A+Cgo8c2NyaXB0PgogIGZ1bmN0aW9uIGdldFVSTCh1cmwsIGMpIHsKICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKICAgIHhoci5vcGVuKCJnZXQiLCB1cmwsIHRydWUpOwogICAgeGhyLnNlbmQoKTsKICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpIHsKICAgICAgaWYgKHhoci5yZWFkeVN0YXRlICE9IDQpIHJldHVybjsKICAgICAgaWYgKHhoci5zdGF0dXMgPCA0MDApIHJldHVybiBjKG51bGwsIHhoci5yZXNwb25zZVRleHQpOwogICAgICB2YXIgZSA9IG5ldyBFcnJvcih4aHIucmVzcG9uc2VUZXh0IHx8ICJObyByZXNwb25zZSIpOwogICAgICBlLnN0YXR1cyA9IHhoci5zdGF0dXM7CiAgICAgIGMoZSk7CiAgICB9OwogIH0KCiAgdmFyIHNlcnZlcjsKICBnZXRVUkwoImh0dHA6Ly90ZXJuanMubmV0L2RlZnMvZWNtYTUuanNvbiIsIGZ1bmN0aW9uKGVyciwgY29kZSkgewogICAgaWYgKGVycikgdGhyb3cgbmV3IEVycm9yKCJSZXF1ZXN0IGZvciBlY21hNS5qc29uOiAiICsgZXJyKTsKICAgIHNlcnZlciA9IG5ldyBDb2RlTWlycm9yLlRlcm5TZXJ2ZXIoe2RlZnM6IFtKU09OLnBhcnNlKGNvZGUpXX0pOwogICAgZWRpdG9yLnNldE9wdGlvbigiZXh0cmFLZXlzIiwgewogICAgICAiQ3RybC1TcGFjZSI6IGZ1bmN0aW9uKGNtKSB7IHNlcnZlci5jb21wbGV0ZShjbSk7IH0sCiAgICAgICJDdHJsLUkiOiBmdW5jdGlvbihjbSkgeyBzZXJ2ZXIuc2hvd1R5cGUoY20pOyB9LAogICAgICAiQWx0LS4iOiBmdW5jdGlvbihjbSkgeyBzZXJ2ZXIuanVtcFRvRGVmKGNtKTsgfSwKICAgICAgIkFsdC0sIjogZnVuY3Rpb24oY20pIHsgc2VydmVyLmp1bXBCYWNrKGNtKTsgfSwKICAgICAgIkN0cmwtUSI6IGZ1bmN0aW9uKGNtKSB7IHNlcnZlci5yZW5hbWUoY20pOyB9LAogICAgICAiQ3RybC0uIjogZnVuY3Rpb24oY20pIHsgc2VydmVyLnNlbGVjdE5hbWUoY20pOyB9CiAgICB9KQogICAgZWRpdG9yLm9uKCJjdXJzb3JBY3Rpdml0eSIsIGZ1bmN0aW9uKGNtKSB7IHNlcnZlci51cGRhdGVBcmdIaW50cyhjbSk7IH0pOwogIH0pOwoKICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgbGluZU51bWJlcnM6IHRydWUsCiAgICBtb2RlOiAiamF2YXNjcmlwdCIKICB9KTsKPC9zY3JpcHQ+CgogIDwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/demo/theme.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogVGhlbWUgRGVtbzwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vdGhlbWUvMzAyNC1kYXkuY3NzIj4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi90aGVtZS8zMDI0LW5pZ2h0LmNzcyI+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vdGhlbWUvYW1iaWFuY2UuY3NzIj4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi90aGVtZS9iYXNlMTYtZGFyay5jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL3RoZW1lL2Jhc2UxNi1saWdodC5jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL3RoZW1lL2JsYWNrYm9hcmQuY3NzIj4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi90aGVtZS9jb2JhbHQuY3NzIj4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi90aGVtZS9lY2xpcHNlLmNzcyI+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vdGhlbWUvZWxlZ2FudC5jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL3RoZW1lL2VybGFuZy1kYXJrLmNzcyI+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vdGhlbWUvbGVzc2VyLWRhcmsuY3NzIj4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi90aGVtZS9tYm8uY3NzIj4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi90aGVtZS9tZG4tbGlrZS5jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL3RoZW1lL21pZG5pZ2h0LmNzcyI+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vdGhlbWUvbW9ub2thaS5jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL3RoZW1lL25lYXQuY3NzIj4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi90aGVtZS9uZW8uY3NzIj4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi90aGVtZS9uaWdodC5jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL3RoZW1lL3BhcmFpc28tZGFyay5jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL3RoZW1lL3BhcmFpc28tbGlnaHQuY3NzIj4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi90aGVtZS9wYXN0ZWwtb24tZGFyay5jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL3RoZW1lL3J1YnlibHVlLmNzcyI+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vdGhlbWUvc29sYXJpemVkLmNzcyI+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vdGhlbWUvdGhlLW1hdHJpeC5jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL3RoZW1lL3RvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzLmNzcyI+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vdGhlbWUvdHdpbGlnaHQuY3NzIj4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi90aGVtZS92aWJyYW50LWluay5jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL3RoZW1lL3hxLWRhcmsuY3NzIj4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi90aGVtZS94cS1saWdodC5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vbW9kZS9qYXZhc2NyaXB0L2phdmFzY3JpcHQuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vYWRkb24vc2VsZWN0aW9uL2FjdGl2ZS1saW5lLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL2FkZG9uL2VkaXQvbWF0Y2hicmFja2V0cy5qcyI+PC9zY3JpcHQ+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICAgIC5Db2RlTWlycm9yIHtib3JkZXI6IDFweCBzb2xpZCBibGFjazsgZm9udC1zaXplOjEzcHh9CiAgICA8L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5UaGVtZTwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+VGhlbWUgRGVtbzwvaDI+Cjxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+CmZ1bmN0aW9uIGZpbmRTZXF1ZW5jZShnb2FsKSB7CiAgZnVuY3Rpb24gZmluZChzdGFydCwgaGlzdG9yeSkgewogICAgaWYgKHN0YXJ0ID09IGdvYWwpCiAgICAgIHJldHVybiBoaXN0b3J5OwogICAgZWxzZSBpZiAoc3RhcnQgPiBnb2FsKQogICAgICByZXR1cm4gbnVsbDsKICAgIGVsc2UKICAgICAgcmV0dXJuIGZpbmQoc3RhcnQgKyA1LCAiKCIgKyBoaXN0b3J5ICsgIiArIDUpIikgfHwKICAgICAgICAgICAgIGZpbmQoc3RhcnQgKiAzLCAiKCIgKyBoaXN0b3J5ICsgIiAqIDMpIik7CiAgfQogIHJldHVybiBmaW5kKDEsICIxIik7Cn08L3RleHRhcmVhPjwvZm9ybT4KCjxwPlNlbGVjdCBhIHRoZW1lOiA8c2VsZWN0IG9uY2hhbmdlPSJzZWxlY3RUaGVtZSgpIiBpZD1zZWxlY3Q+CiAgICA8b3B0aW9uIHNlbGVjdGVkPmRlZmF1bHQ8L29wdGlvbj4KICAgIDxvcHRpb24+MzAyNC1kYXk8L29wdGlvbj4KICAgIDxvcHRpb24+MzAyNC1uaWdodDwvb3B0aW9uPgogICAgPG9wdGlvbj5hbWJpYW5jZTwvb3B0aW9uPgogICAgPG9wdGlvbj5iYXNlMTYtZGFyazwvb3B0aW9uPgogICAgPG9wdGlvbj5iYXNlMTYtbGlnaHQ8L29wdGlvbj4KICAgIDxvcHRpb24+YmxhY2tib2FyZDwvb3B0aW9uPgogICAgPG9wdGlvbj5jb2JhbHQ8L29wdGlvbj4KICAgIDxvcHRpb24+ZWNsaXBzZTwvb3B0aW9uPgogICAgPG9wdGlvbj5lbGVnYW50PC9vcHRpb24+CiAgICA8b3B0aW9uPmVybGFuZy1kYXJrPC9vcHRpb24+CiAgICA8b3B0aW9uPmxlc3Nlci1kYXJrPC9vcHRpb24+CiAgICA8b3B0aW9uPm1ibzwvb3B0aW9uPgogICAgPG9wdGlvbj5tZG4tbGlrZTwvb3B0aW9uPgogICAgPG9wdGlvbj5taWRuaWdodDwvb3B0aW9uPgogICAgPG9wdGlvbj5tb25va2FpPC9vcHRpb24+CiAgICA8b3B0aW9uPm5lYXQ8L29wdGlvbj4KICAgIDxvcHRpb24+bmVvPC9vcHRpb24+CiAgICA8b3B0aW9uPm5pZ2h0PC9vcHRpb24+CiAgICA8b3B0aW9uPnBhcmFpc28tZGFyazwvb3B0aW9uPgogICAgPG9wdGlvbj5wYXJhaXNvLWxpZ2h0PC9vcHRpb24+CiAgICA8b3B0aW9uPnBhc3RlbC1vbi1kYXJrPC9vcHRpb24+CiAgICA8b3B0aW9uPnJ1YnlibHVlPC9vcHRpb24+CiAgICA8b3B0aW9uPnNvbGFyaXplZCBkYXJrPC9vcHRpb24+CiAgICA8b3B0aW9uPnNvbGFyaXplZCBsaWdodDwvb3B0aW9uPgogICAgPG9wdGlvbj50aGUtbWF0cml4PC9vcHRpb24+CiAgICA8b3B0aW9uPnRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzPC9vcHRpb24+CiAgICA8b3B0aW9uPnR3aWxpZ2h0PC9vcHRpb24+CiAgICA8b3B0aW9uPnZpYnJhbnQtaW5rPC9vcHRpb24+CiAgICA8b3B0aW9uPnhxLWRhcms8L29wdGlvbj4KICAgIDxvcHRpb24+eHEtbGlnaHQ8L29wdGlvbj4KPC9zZWxlY3Q+CjwvcD4KCjxzY3JpcHQ+CiAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgc3R5bGVBY3RpdmVMaW5lOiB0cnVlLAogICAgbWF0Y2hCcmFja2V0czogdHJ1ZQogIH0pOwogIHZhciBpbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZWxlY3QiKTsKICBmdW5jdGlvbiBzZWxlY3RUaGVtZSgpIHsKICAgIHZhciB0aGVtZSA9IGlucHV0Lm9wdGlvbnNbaW5wdXQuc2VsZWN0ZWRJbmRleF0uaW5uZXJIVE1MOwogICAgZWRpdG9yLnNldE9wdGlvbigidGhlbWUiLCB0aGVtZSk7CiAgfQogIHZhciBjaG9pY2UgPSBkb2N1bWVudC5sb2NhdGlvbi5zZWFyY2ggJiYKICAgICAgICAgICAgICAgZGVjb2RlVVJJQ29tcG9uZW50KGRvY3VtZW50LmxvY2F0aW9uLnNlYXJjaC5zbGljZSgxKSk7CiAgaWYgKGNob2ljZSkgewogICAgaW5wdXQudmFsdWUgPSBjaG9pY2U7CiAgICBlZGl0b3Iuc2V0T3B0aW9uKCJ0aGVtZSIsIGNob2ljZSk7CiAgfQo8L3NjcmlwdD4KICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/demo/trailingspace.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogVHJhaWxpbmcgV2hpdGVzcGFjZSBEZW1vPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL2FkZG9uL2VkaXQvdHJhaWxpbmdzcGFjZS5qcyI+PC9zY3JpcHQ+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICAgIC5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazt9CiAgICAgIC5jbS10cmFpbGluZ3NwYWNlIHsKICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBUUFBQUFDQ0FZQUFBQi9xSDFqQUFBQUJtSkxSMFFBL3dEL0FQK2d2YWVUQUFBQUNYQklXWE1BQUFzVEFBQUxFd0VBbXB3WUFBQUFCM1JKVFVVSDNRVVhDVG9IMDBZMVVnQUFBQ0ZKUkVGVUNOZGpQTURCVWMvQXdOREFBQUZNVEF3TURBME9QMzR3UWdYL0FRQllnd1lFeDRmOWxRQUFBQUJKUlU1RXJrSmdnZz09KTsKICAgICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBib3R0b20gbGVmdDsKICAgICAgICBiYWNrZ3JvdW5kLXJlcGVhdDogcmVwZWF0LXg7CiAgICAgIH0KICAgIDwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGltZyBpZD1sb2dvIHNyYz0iLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPlRyYWlsaW5nIFdoaXRlc3BhY2U8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPlRyYWlsaW5nIFdoaXRlc3BhY2UgRGVtbzwvaDI+Cjxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+VGhpcyB0ZXh0ICAKIGhhcyBzb21lCSAKdHJhaWxpbmcgd2hpdGVzcGFjZSE8L3RleHRhcmVhPjwvZm9ybT4KCiAgICA8c2NyaXB0Pgp2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogIGxpbmVOdW1iZXJzOiB0cnVlLAogIHNob3dUcmFpbGluZ1NwYWNlOiB0cnVlCn0pOwo8L3NjcmlwdD4KCjxwPlVzZXMKdGhlIDxhIGhyZWY9Ii4uL2RvYy9tYW51YWwuaHRtbCNhZGRvbl90cmFpbGluZ3NwYWNlIj50cmFpbGluZ3NwYWNlPC9hPgphZGRvbiB0byBoaWdobGlnaHQgdHJhaWxpbmcgd2hpdGVzcGFjZS48L3A+CgogIDwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/demo/variableheight.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogVmFyaWFibGUgSGVpZ2h0IERlbW88L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vbW9kZS9tYXJrZG93bi9tYXJrZG93bi5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9tb2RlL3htbC94bWwuanMiPjwvc2NyaXB0Pgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgogICAgICAuQ29kZU1pcnJvciB7Ym9yZGVyOiAxcHggc29saWQgc2lsdmVyOyBib3JkZXItd2lkdGg6IDFweCAycHg7IH0KICAgICAgLmNtLWhlYWRlciB7IGZvbnQtZmFtaWx5OiBhcmlhbDsgfQogICAgICAuY20taGVhZGVyLTEgeyBmb250LXNpemU6IDE1MCU7IH0KICAgICAgLmNtLWhlYWRlci0yIHsgZm9udC1zaXplOiAxMzAlOyB9CiAgICAgIC5jbS1oZWFkZXItMyB7IGZvbnQtc2l6ZTogMTIwJTsgfQogICAgICAuY20taGVhZGVyLTQgeyBmb250LXNpemU6IDExMCU7IH0KICAgICAgLmNtLWhlYWRlci01IHsgZm9udC1zaXplOiAxMDAlOyB9CiAgICAgIC5jbS1oZWFkZXItNiB7IGZvbnQtc2l6ZTogOTAlOyB9CiAgICAgIC5jbS1zdHJvbmcgeyBmb250LXNpemU6IDE0MCU7IH0KICAgIDwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGltZyBpZD1sb2dvIHNyYz0iLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPlZhcmlhYmxlIEhlaWdodDwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+VmFyaWFibGUgSGVpZ2h0IERlbW88L2gyPgo8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPiMgQSBGaXJzdCBMZXZlbCBIZWFkZXIKCioqQm9sZCoqIHRleHQgaW4gYSBub3JtYWwtc2l6ZSBwYXJhZ3JhcGguCgpBbmQgYSB2ZXJ5IGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcsIHdyYXBwZWQgbGluZSB3aXRoIGEgcGllY2Ugb2YgKipiaWcqKiB0ZXh0IGluc2lkZSBvZiBpdC4KCiMjIEEgU2Vjb25kIExldmVsIEhlYWRlcgoKTm93IGlzIHRoZSB0aW1lIGZvciBhbGwgZ29vZCBtZW4gdG8gY29tZSB0bwp0aGUgYWlkIG9mIHRoZWlyIGNvdW50cnkuIFRoaXMgaXMganVzdCBhCnJlZ3VsYXIgcGFyYWdyYXBoLgoKVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wZWQgb3ZlciB0aGUgbGF6eQpkb2cncyBiYWNrLgoKIyMjIEhlYWRlciAzCgo+IFRoaXMgaXMgYSBibG9ja3F1b3RlLgo+IAo+IFRoaXMgaXMgdGhlIHNlY29uZCBwYXJhZ3JhcGggaW4gdGhlIGJsb2NrcXVvdGUuCj4KPiAjIyBUaGlzIGlzIGFuIEgyIGluIGEgYmxvY2txdW90ZSAgICAgICAKPC90ZXh0YXJlYT48L2Zvcm0+CiAgICA8c2NyaXB0IGlkPSJzY3JpcHQiPgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgICAgIGxpbmVXcmFwcGluZzogdHJ1ZSwKICAgICAgICBtb2RlOiAibWFya2Rvd24iCiAgICAgIH0pOwogICAgPC9zY3JpcHQ+CiAgPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/demo/vim.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogVmltIGJpbmRpbmdzIGRlbW88L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9saWIvY29kZW1pcnJvci5jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL2FkZG9uL2RpYWxvZy9kaWFsb2cuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL2FkZG9uL2RpYWxvZy9kaWFsb2cuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vYWRkb24vc2VhcmNoL3NlYXJjaGN1cnNvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9tb2RlL2NsaWtlL2NsaWtlLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL2FkZG9uL2VkaXQvbWF0Y2hicmFja2V0cy5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9rZXltYXAvdmltLmpzIj48L3NjcmlwdD4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KICAgICAgLkNvZGVNaXJyb3Ige2JvcmRlci10b3A6IDFweCBzb2xpZCAjZWVlOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2VlZTt9CiAgICA8L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5WaW0gYmluZGluZ3M8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPlZpbSBiaW5kaW5ncyBkZW1vPC9oMj4KPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KI2luY2x1ZGUgInN5c2NhbGxzLmgiCi8qIGdldGNoYXI6ICBzaW1wbGUgYnVmZmVyZWQgdmVyc2lvbiAqLwppbnQgZ2V0Y2hhcih2b2lkKQp7CiAgc3RhdGljIGNoYXIgYnVmW0JVRlNJWl07CiAgc3RhdGljIGNoYXIgKmJ1ZnAgPSBidWY7CiAgc3RhdGljIGludCBuID0gMDsKICBpZiAobiA9PSAwKSB7ICAvKiBidWZmZXIgaXMgZW1wdHkgKi8KICAgIG4gPSByZWFkKDAsIGJ1Ziwgc2l6ZW9mIGJ1Zik7CiAgICBidWZwID0gYnVmOwogIH0KICByZXR1cm4gKC0tbiA+PSAwKSA/ICh1bnNpZ25lZCBjaGFyKSAqYnVmcCsrIDogRU9GOwp9CjwvdGV4dGFyZWE+PC9mb3JtPgo8ZGl2IHN0eWxlPSJmb250LXNpemU6IDEzcHg7IHdpZHRoOiAzMDBweDsgaGVpZ2h0OiAzMHB4OyI+S2V5IGJ1ZmZlcjogPHNwYW4gaWQ9ImNvbW1hbmQtZGlzcGxheSI+PC9zcGFuPjwvZGl2PgoKPHA+VGhlIHZpbSBrZXliaW5kaW5ncyBhcmUgZW5hYmxlZCBieQppbmNsdWRpbmcgPGEgaHJlZj0iLi4va2V5bWFwL3ZpbS5qcyI+a2V5bWFwL3ZpbS5qczwvYT4gYW5kIHNldHRpbmcKdGhlIDxjb2RlPnZpbU1vZGU8L2NvZGU+IG9wdGlvbiB0byA8Y29kZT50cnVlPC9jb2RlPi4gVGhpcyB3aWxsIGFsc28KYXV0b21hdGljYWxseSBjaGFuZ2UgdGhlIDxjb2RlPmtleU1hcDwvY29kZT4gb3B0aW9uIHRvIDxjb2RlPiJ2aW0iPC9jb2RlPi48L3A+Cgo8cD48c3Ryb25nPkZlYXR1cmVzPC9zdHJvbmc+PC9wPgoKPHVsPgogIDxsaT5BbGwgY29tbW9uIG1vdGlvbnMgYW5kIG9wZXJhdG9ycywgaW5jbHVkaW5nIHRleHQgb2JqZWN0czwvbGk+CiAgPGxpPk9wZXJhdG9yIG1vdGlvbiBvcnRob2dvbmFsaXR5PC9saT4KICA8bGk+VmlzdWFsIG1vZGUgLSBjaGFyYWN0ZXJ3aXNlLCBsaW5ld2lzZSwgcGFydGlhbCBzdXBwb3J0IGZvciBibG9ja3dpc2U8L2xpPgogIDxsaT5GdWxsIG1hY3JvIHN1cHBvcnQgKHEsIEApPC9saT4KICA8bGk+SW5jcmVtZW50YWwgaGlnaGxpZ2h0ZWQgc2VhcmNoICgvLCA/LCAjLCAqLCBnIywgZyopPC9saT4KICA8bGk+U2VhcmNoL3JlcGxhY2Ugd2l0aCBjb25maXJtICg6c3Vic3RpdHV0ZSwgOiVzKTwvbGk+CiAgPGxpPlNlYXJjaCBoaXN0b3J5PC9saT4KICA8bGk+SnVtcCBsaXN0cyAoQ3RybC1vLCBDdHJsLWkpPC9saT4KICA8bGk+S2V5L2NvbW1hbmQgbWFwcGluZyB3aXRoIEFQSSAoOm1hcCwgOm5tYXAsIDp2bWFwKTwvbGk+CiAgPGxpPlNvcnQgKDpzb3J0KTwvbGk+CiAgPGxpPk1hcmtzIChgLCAnKTwvbGk+CiAgPGxpPjpnbG9iYWw8L2xpPgogIDxsaT5JbnNlcnQgbW9kZSBiZWhhdmVzIGlkZW50aWNhbCB0byBiYXNlIENvZGVNaXJyb3I8L2xpPgogIDxsaT5Dcm9zcy1idWZmZXIgeWFuay9wYXN0ZTwvbGk+CjwvdWw+Cgo8cD5Ob3RlIHRoYXQgd2hpbGUgdGhlIHZpbSBtb2RlIHRyaWVzIHRvIGVtdWxhdGUgdGhlIG1vc3QgdXNlZnVsIGZlYXR1cmVzIG9mCnZpbSBhcyBmYWl0aGZ1bGx5IGFzIHBvc3NpYmxlLCBpdCBkb2VzIG5vdCBzdHJpdmUgdG8gYmVjb21lIGEgY29tcGxldGUgdmltCmltcGxlbWVudGF0aW9uPC9wPgoKICAgIDxzY3JpcHQ+CiAgICAgIENvZGVNaXJyb3IuY29tbWFuZHMuc2F2ZSA9IGZ1bmN0aW9uKCl7IGFsZXJ0KCJTYXZpbmciKTsgfTsKICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgICAgICBtb2RlOiAidGV4dC94LWNzcmMiLAogICAgICAgIHZpbU1vZGU6IHRydWUsCiAgICAgICAgbWF0Y2hCcmFja2V0czogdHJ1ZSwKICAgICAgICBzaG93Q3Vyc29yV2hlblNlbGVjdGluZzogdHJ1ZQogICAgICB9KTsKICAgICAgdmFyIGNvbW1hbmREaXNwbGF5ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvbW1hbmQtZGlzcGxheScpOwogICAgICB2YXIga2V5cyA9ICcnOwogICAgICBDb2RlTWlycm9yLm9uKGVkaXRvciwgJ3ZpbS1rZXlwcmVzcycsIGZ1bmN0aW9uKGtleSkgewogICAgICAgIGtleXMgPSBrZXlzICsga2V5OwogICAgICAgIGNvbW1hbmREaXNwbGF5LmlubmVySFRNTCA9IGtleXM7CiAgICAgIH0pOwogICAgICBDb2RlTWlycm9yLm9uKGVkaXRvciwgJ3ZpbS1jb21tYW5kLWRvbmUnLCBmdW5jdGlvbihlKSB7CiAgICAgICAga2V5cyA9ICcnOwogICAgICAgIGNvbW1hbmREaXNwbGF5LmlubmVySFRNTCA9IGtleXM7CiAgICAgIH0pOwogICAgPC9zY3JpcHQ+CgogIDwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/demo/visibletabs.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogVmlzaWJsZSB0YWJzIGRlbW88L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vbW9kZS9jbGlrZS9jbGlrZS5qcyI+PC9zY3JpcHQ+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICAgIC5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgI2VlZTsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlZWU7fQogICAgICAuY20tdGFiIHsKICAgICAgICAgYmFja2dyb3VuZDogdXJsKGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBREFBQUFBTUNBWUFBQUFrdWo1UkFBQUFBWE5TUjBJQXJzNGM2UUFBQUdGSlJFRlVTTWZ0MUxzUlFGQVFoZUhQb3dBS29BQ3gzSWdFS3RhRUh1akRqT1JTZ1dUSC9aT2RuWk9jTS9zZ2sva0ZGV1kwcVY4Zm9Rd1M0TUtCQ1MzcVI2aXhCSnZFbE9vYllBdGl2c2VJRTEyMEZhb3dKUE43NUdNdThqL0xmTXdOamg0SFVwd2c0TFVBQUFBQVNVVk9SSzVDWUlJPSk7CiAgICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IHJpZ2h0OwogICAgICAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OwogICAgICB9CiAgICA8L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5WaXNpYmxlIHRhYnM8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPlZpc2libGUgdGFicyBkZW1vPC9oMj4KPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KI2luY2x1ZGUgInN5c2NhbGxzLmgiCi8qIGdldGNoYXI6ICBzaW1wbGUgYnVmZmVyZWQgdmVyc2lvbiAqLwppbnQgZ2V0Y2hhcih2b2lkKQp7CglzdGF0aWMgY2hhciBidWZbQlVGU0laXTsKCXN0YXRpYyBjaGFyICpidWZwID0gYnVmOwoJc3RhdGljIGludCBuID0gMDsKCWlmIChuID09IDApIHsgIC8qIGJ1ZmZlciBpcyBlbXB0eSAqLwoJCW4gPSByZWFkKDAsIGJ1Ziwgc2l6ZW9mIGJ1Zik7CgkJYnVmcCA9IGJ1ZjsKCX0KCXJldHVybiAoLS1uID49IDApID8gKHVuc2lnbmVkIGNoYXIpICpidWZwKysgOiBFT0Y7Cn0KPC90ZXh0YXJlYT48L2Zvcm0+Cgo8cD5UYWJzIGluc2lkZSB0aGUgZWRpdG9yIGFyZSBzcGFucyB3aXRoIHRoZQpjbGFzcyA8Y29kZT5jbS10YWI8L2NvZGU+LCBhbmQgY2FuIGJlIHN0eWxlZC48L3A+CgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgICAgICB0YWJTaXplOiA0LAogICAgICAgIGluZGVudFVuaXQ6IDQsCiAgICAgICAgaW5kZW50V2l0aFRhYnM6IHRydWUsCiAgICAgICAgbW9kZTogInRleHQveC1jc3JjIgogICAgICB9KTsKICAgIDwvc2NyaXB0PgoKICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/demo/widget.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogSW5saW5lIFdpZGdldCBEZW1vPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL21vZGUvamF2YXNjcmlwdC9qYXZhc2NyaXB0LmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii8vYWpheC5hc3BuZXRjZG4uY29tL2FqYXgvanNoaW50L3IwNy9qc2hpbnQuanMiPjwvc2NyaXB0Pgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgogICAgICAuQ29kZU1pcnJvciB7Ym9yZGVyOiAxcHggc29saWQgYmxhY2s7fQogICAgICAubGludC1lcnJvciB7Zm9udC1mYW1pbHk6IGFyaWFsOyBmb250LXNpemU6IDcwJTsgYmFja2dyb3VuZDogI2ZmYTsgY29sb3I6ICNhMDA7IHBhZGRpbmc6IDJweCA1cHggM3B4OyB9CiAgICAgIC5saW50LWVycm9yLWljb24ge2NvbG9yOiB3aGl0ZTsgYmFja2dyb3VuZC1jb2xvcjogcmVkOyBmb250LXdlaWdodDogYm9sZDsgYm9yZGVyLXJhZGl1czogNTAlOyBwYWRkaW5nOiAwIDNweDsgbWFyZ2luLXJpZ2h0OiA3cHg7fQogICAgPC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aW1nIGlkPWxvZ28gc3JjPSIuLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+SW5saW5lIFdpZGdldDwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+SW5saW5lIFdpZGdldCBEZW1vPC9oMj4KCgogICAgPGRpdiBpZD1jb2RlPjwvZGl2PgogICAgPHNjcmlwdCBpZD0ic2NyaXB0Ij52YXIgd2lkZ2V0cyA9IFtdCmZ1bmN0aW9uIHVwZGF0ZUhpbnRzKCkgewogIGVkaXRvci5vcGVyYXRpb24oZnVuY3Rpb24oKXsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgd2lkZ2V0cy5sZW5ndGg7ICsraSkKICAgICAgZWRpdG9yLnJlbW92ZUxpbmVXaWRnZXQod2lkZ2V0c1tpXSk7CiAgICB3aWRnZXRzLmxlbmd0aCA9IDA7CgogICAgSlNISU5UKGVkaXRvci5nZXRWYWx1ZSgpKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgSlNISU5ULmVycm9ycy5sZW5ndGg7ICsraSkgewogICAgICB2YXIgZXJyID0gSlNISU5ULmVycm9yc1tpXTsKICAgICAgaWYgKCFlcnIpIGNvbnRpbnVlOwogICAgICB2YXIgbXNnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICAgIHZhciBpY29uID0gbXNnLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKSk7CiAgICAgIGljb24uaW5uZXJIVE1MID0gIiEhIjsKICAgICAgaWNvbi5jbGFzc05hbWUgPSAibGludC1lcnJvci1pY29uIjsKICAgICAgbXNnLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGVyci5yZWFzb24pKTsKICAgICAgbXNnLmNsYXNzTmFtZSA9ICJsaW50LWVycm9yIjsKICAgICAgd2lkZ2V0cy5wdXNoKGVkaXRvci5hZGRMaW5lV2lkZ2V0KGVyci5saW5lIC0gMSwgbXNnLCB7Y292ZXJHdXR0ZXI6IGZhbHNlLCBub0hTY3JvbGw6IHRydWV9KSk7CiAgICB9CiAgfSk7CiAgdmFyIGluZm8gPSBlZGl0b3IuZ2V0U2Nyb2xsSW5mbygpOwogIHZhciBhZnRlciA9IGVkaXRvci5jaGFyQ29vcmRzKHtsaW5lOiBlZGl0b3IuZ2V0Q3Vyc29yKCkubGluZSArIDEsIGNoOiAwfSwgImxvY2FsIikudG9wOwogIGlmIChpbmZvLnRvcCArIGluZm8uY2xpZW50SGVpZ2h0IDwgYWZ0ZXIpCiAgICBlZGl0b3Iuc2Nyb2xsVG8obnVsbCwgYWZ0ZXIgLSBpbmZvLmNsaWVudEhlaWdodCArIDMpOwp9Cgp3aW5kb3cub25sb2FkID0gZnVuY3Rpb24oKSB7CiAgdmFyIHNjID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNjcmlwdCIpOwogIHZhciBjb250ZW50ID0gc2MudGV4dENvbnRlbnQgfHwgc2MuaW5uZXJUZXh0IHx8IHNjLmlubmVySFRNTDsKCiAgd2luZG93LmVkaXRvciA9IENvZGVNaXJyb3IoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgbGluZU51bWJlcnM6IHRydWUsCiAgICBtb2RlOiAiamF2YXNjcmlwdCIsCiAgICB2YWx1ZTogY29udGVudAogIH0pOwoKICB2YXIgd2FpdGluZzsKICBlZGl0b3Iub24oImNoYW5nZSIsIGZ1bmN0aW9uKCkgewogICAgY2xlYXJUaW1lb3V0KHdhaXRpbmcpOwogICAgd2FpdGluZyA9IHNldFRpbWVvdXQodXBkYXRlSGludHMsIDUwMCk7CiAgfSk7CgogIHNldFRpbWVvdXQodXBkYXRlSGludHMsIDEwMCk7Cn07CgoibG9uZyBsaW5lIHRvIGNyZWF0ZSBhIGhvcml6b250YWwgc2Nyb2xsYmFyLCBpbiBvcmRlciB0byB0ZXN0IHdoZXRoZXIgdGhlIChub24taW5saW5lKSB3aWRnZXRzIHN0YXkgaW4gcGxhY2Ugd2hlbiBzY3JvbGxpbmcgdG8gdGhlIHJpZ2h0IjsKPC9zY3JpcHQ+CjxwPlRoaXMgZGVtbyBydW5zIDxhIGhyZWY9Imh0dHA6Ly9qc2hpbnQuY29tIj5KU0hpbnQ8L2E+IG92ZXIgdGhlIGNvZGUKaW4gdGhlIGVkaXRvciAod2hpY2ggaXMgdGhlIHNjcmlwdCB1c2VkIG9uIHRoaXMgcGFnZSksIGFuZAppbnNlcnRzIDxhIGhyZWY9Ii4uL2RvYy9tYW51YWwuaHRtbCNhZGRMaW5lV2lkZ2V0Ij5saW5lIHdpZGdldHM8L2E+IHRvCmRpc3BsYXkgdGhlIHdhcm5pbmdzIHRoYXQgSlNIaW50IGNvbWVzIHVwIHdpdGguPC9wPgogIDwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/demo/xmlcomplete.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogWE1MIEF1dG9jb21wbGV0ZSBEZW1vPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9hZGRvbi9oaW50L3Nob3ctaGludC5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vYWRkb24vaGludC9zaG93LWhpbnQuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vYWRkb24vaGludC94bWwtaGludC5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9tb2RlL3htbC94bWwuanMiPjwvc2NyaXB0Pgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgogICAgICAuQ29kZU1pcnJvciB7IGJvcmRlcjogMXB4IHNvbGlkICNlZWU7IH0KICAgIDwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGltZyBpZD1sb2dvIHNyYz0iLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPlhNTCBBdXRvY29tcGxldGU8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPlhNTCBBdXRvY29tcGxldGUgRGVtbzwvaDI+Cjxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+PCEtLSB3cml0ZSBzb21lIHhtbCBiZWxvdyAtLT4KPC90ZXh0YXJlYT48L2Zvcm0+CgogICAgPHA+UHJlc3MgPHN0cm9uZz5jdHJsLXNwYWNlPC9zdHJvbmc+LCBvciB0eXBlIGEgJzwnIGNoYXJhY3RlciB0bwogICAgYWN0aXZhdGUgYXV0b2NvbXBsZXRpb24uIFRoaXMgZGVtbyBkZWZpbmVzIGEgc2ltcGxlIHNjaGVtYSB0aGF0CiAgICBndWlkZXMgY29tcGxldGlvbi4gVGhlIHNjaGVtYSBjYW4gYmUgY3VzdG9taXplZOKAlHNlZQogICAgdGhlIDxhIGhyZWY9Ii4uL2RvYy9tYW51YWwuaHRtbCNhZGRvbl94bWwtaGludCI+bWFudWFsPC9hPi48L3A+CgogICAgPHA+RGV2ZWxvcG1lbnQgb2YgdGhlIDxjb2RlPnhtbC1oaW50PC9jb2RlPiBhZGRvbiB3YXMga2luZGx5CiAgICBzcG9uc29yZWQKICAgIGJ5IDxhIGhyZWY9Imh0dHA6Ly93d3cueHBlcmltZW50Lm1vYmkiPnd3dy54cGVyaW1lbnQubW9iaTwvYT4uPC9wPgoKICAgIDxzY3JpcHQ+CiAgICAgIHZhciBkdW1teSA9IHsKICAgICAgICBhdHRyczogewogICAgICAgICAgY29sb3I6IFsicmVkIiwgImdyZWVuIiwgImJsdWUiLCAicHVycGxlIiwgIndoaXRlIiwgImJsYWNrIiwgInllbGxvdyJdLAogICAgICAgICAgc2l6ZTogWyJsYXJnZSIsICJtZWRpdW0iLCAic21hbGwiXSwKICAgICAgICAgIGRlc2NyaXB0aW9uOiBudWxsCiAgICAgICAgfSwKICAgICAgICBjaGlsZHJlbjogW10KICAgICAgfTsKCiAgICAgIHZhciB0YWdzID0gewogICAgICAgICIhdG9wIjogWyJ0b3AiXSwKICAgICAgICAiIWF0dHJzIjogewogICAgICAgICAgaWQ6IG51bGwsCiAgICAgICAgICBjbGFzczogWyJBIiwgIkIiLCAiQyJdCiAgICAgICAgfSwKICAgICAgICB0b3A6IHsKICAgICAgICAgIGF0dHJzOiB7CiAgICAgICAgICAgIGxhbmc6IFsiZW4iLCAiZGUiLCAiZnIiLCAibmwiXSwKICAgICAgICAgICAgZnJlZWZvcm06IG51bGwKICAgICAgICAgIH0sCiAgICAgICAgICBjaGlsZHJlbjogWyJhbmltYWwiLCAicGxhbnQiXQogICAgICAgIH0sCiAgICAgICAgYW5pbWFsOiB7CiAgICAgICAgICBhdHRyczogewogICAgICAgICAgICBuYW1lOiBudWxsLAogICAgICAgICAgICBpc2R1Y2s6IFsieWVzIiwgIm5vIl0KICAgICAgICAgIH0sCiAgICAgICAgICBjaGlsZHJlbjogWyJ3aW5ncyIsICJmZWV0IiwgImJvZHkiLCAiaGVhZCIsICJ0YWlsIl0KICAgICAgICB9LAogICAgICAgIHBsYW50OiB7CiAgICAgICAgICBhdHRyczoge25hbWU6IG51bGx9LAogICAgICAgICAgY2hpbGRyZW46IFsibGVhdmVzIiwgInN0ZW0iLCAiZmxvd2VycyJdCiAgICAgICAgfSwKICAgICAgICB3aW5nczogZHVtbXksIGZlZXQ6IGR1bW15LCBib2R5OiBkdW1teSwgaGVhZDogZHVtbXksIHRhaWw6IGR1bW15LAogICAgICAgIGxlYXZlczogZHVtbXksIHN0ZW06IGR1bW15LCBmbG93ZXJzOiBkdW1teQogICAgICB9OwoKICAgICAgZnVuY3Rpb24gY29tcGxldGVBZnRlcihjbSwgcHJlZCkgewogICAgICAgIHZhciBjdXIgPSBjbS5nZXRDdXJzb3IoKTsKICAgICAgICBpZiAoIXByZWQgfHwgcHJlZCgpKSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgaWYgKCFjbS5zdGF0ZS5jb21wbGV0aW9uQWN0aXZlKQogICAgICAgICAgICBjbS5zaG93SGludCh7Y29tcGxldGVTaW5nbGU6IGZhbHNlfSk7CiAgICAgICAgfSwgMTAwKTsKICAgICAgICByZXR1cm4gQ29kZU1pcnJvci5QYXNzOwogICAgICB9CgogICAgICBmdW5jdGlvbiBjb21wbGV0ZUlmQWZ0ZXJMdChjbSkgewogICAgICAgIHJldHVybiBjb21wbGV0ZUFmdGVyKGNtLCBmdW5jdGlvbigpIHsKICAgICAgICAgIHZhciBjdXIgPSBjbS5nZXRDdXJzb3IoKTsKICAgICAgICAgIHJldHVybiBjbS5nZXRSYW5nZShDb2RlTWlycm9yLlBvcyhjdXIubGluZSwgY3VyLmNoIC0gMSksIGN1cikgPT0gIjwiOwogICAgICAgIH0pOwogICAgICB9CgogICAgICBmdW5jdGlvbiBjb21wbGV0ZUlmSW5UYWcoY20pIHsKICAgICAgICByZXR1cm4gY29tcGxldGVBZnRlcihjbSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICB2YXIgdG9rID0gY20uZ2V0VG9rZW5BdChjbS5nZXRDdXJzb3IoKSk7CiAgICAgICAgICBpZiAodG9rLnR5cGUgPT0gInN0cmluZyIgJiYgKCEvWyciXS8udGVzdCh0b2suc3RyaW5nLmNoYXJBdCh0b2suc3RyaW5nLmxlbmd0aCAtIDEpKSB8fCB0b2suc3RyaW5nLmxlbmd0aCA9PSAxKSkgcmV0dXJuIGZhbHNlOwogICAgICAgICAgdmFyIGlubmVyID0gQ29kZU1pcnJvci5pbm5lck1vZGUoY20uZ2V0TW9kZSgpLCB0b2suc3RhdGUpLnN0YXRlOwogICAgICAgICAgcmV0dXJuIGlubmVyLnRhZ05hbWU7CiAgICAgICAgfSk7CiAgICAgIH0KCiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICAgICAgbW9kZTogInhtbCIsCiAgICAgICAgbGluZU51bWJlcnM6IHRydWUsCiAgICAgICAgZXh0cmFLZXlzOiB7CiAgICAgICAgICAiJzwnIjogY29tcGxldGVBZnRlciwKICAgICAgICAgICInLyciOiBjb21wbGV0ZUlmQWZ0ZXJMdCwKICAgICAgICAgICInICciOiBjb21wbGV0ZUlmSW5UYWcsCiAgICAgICAgICAiJz0nIjogY29tcGxldGVJZkluVGFnLAogICAgICAgICAgIkN0cmwtU3BhY2UiOiAiYXV0b2NvbXBsZXRlIgogICAgICAgIH0sCiAgICAgICAgaGludE9wdGlvbnM6IHtzY2hlbWFJbmZvOiB0YWdzfQogICAgICB9KTsKICAgIDwvc2NyaXB0PgogIDwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/doc/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/doc/activebookmark.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gS2x1ZGdlIGluIEhUTUw1IHRhZyByZWNvZ25pdGlvbiBpbiBJRTgKZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2VjdGlvbiIpOwpkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhcnRpY2xlIik7CgooZnVuY3Rpb24oKSB7CiAgaWYgKCF3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcikgcmV0dXJuOwogIHZhciBwZW5kaW5nID0gZmFsc2UsIHByZXZWYWwgPSBudWxsOwoKICBmdW5jdGlvbiB1cGRhdGVTb29uKCkgewogICAgaWYgKCFwZW5kaW5nKSB7CiAgICAgIHBlbmRpbmcgPSB0cnVlOwogICAgICBzZXRUaW1lb3V0KHVwZGF0ZSwgMjUwKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHVwZGF0ZSgpIHsKICAgIHBlbmRpbmcgPSBmYWxzZTsKICAgIHZhciBtYXJrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJuYXYiKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYSIpLCBmb3VuZDsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWFya3MubGVuZ3RoOyArK2kpIHsKICAgICAgdmFyIG1hcmsgPSBtYXJrc1tpXSwgbTsKICAgICAgaWYgKG1hcmsuZ2V0QXR0cmlidXRlKCJkYXRhLWRlZmF1bHQiKSkgewogICAgICAgIGlmIChmb3VuZCA9PSBudWxsKSBmb3VuZCA9IGk7CiAgICAgIH0gZWxzZSBpZiAobSA9IG1hcmsuaHJlZi5tYXRjaCgvIyguKikvKSkgewogICAgICAgIHZhciByZWYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChtWzFdKTsKICAgICAgICBpZiAocmVmICYmIHJlZi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgPCA1MCkKICAgICAgICAgIGZvdW5kID0gaTsKICAgICAgfQogICAgfQogICAgaWYgKGZvdW5kICE9IG51bGwgJiYgZm91bmQgIT0gcHJldlZhbCkgewogICAgICBwcmV2VmFsID0gZm91bmQ7CiAgICAgIHZhciBsaXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibmF2IikuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImxpIik7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzLmxlbmd0aDsgKytpKSBsaXNbaV0uY2xhc3NOYW1lID0gIiI7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWFya3MubGVuZ3RoOyArK2kpIHsKICAgICAgICBpZiAoZm91bmQgPT0gaSkgewogICAgICAgICAgbWFya3NbaV0uY2xhc3NOYW1lID0gImFjdGl2ZSI7CiAgICAgICAgICBmb3IgKHZhciBuID0gbWFya3NbaV07IG47IG4gPSBuLnBhcmVudE5vZGUpCiAgICAgICAgICAgIGlmIChuLm5vZGVOYW1lID09ICJMSSIpIG4uY2xhc3NOYW1lID0gImFjdGl2ZSI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG1hcmtzW2ldLmNsYXNzTmFtZSA9ICIiOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsIHVwZGF0ZVNvb24pOwogIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwgdXBkYXRlU29vbik7CiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhhc2hjaGFuZ2UiLCBmdW5jdGlvbigpIHsKICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgIHZhciBoYXNoID0gZG9jdW1lbnQubG9jYXRpb24uaGFzaCwgZm91bmQgPSBudWxsLCBtOwogICAgICB2YXIgbWFya3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibmF2IikuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtYXJrcy5sZW5ndGg7IGkrKykKICAgICAgICBpZiAoKG0gPSBtYXJrc1tpXS5ocmVmLm1hdGNoKC8oIy4qKS8pKSAmJiBtWzFdID09IGhhc2gpIHsgZm91bmQgPSBpOyBicmVhazsgfQogICAgICBpZiAoZm91bmQgIT0gbnVsbCkgZm9yICh2YXIgaSA9IDA7IGkgPCBtYXJrcy5sZW5ndGg7IGkrKykKICAgICAgICBtYXJrc1tpXS5jbGFzc05hbWUgPSBpID09IGZvdW5kID8gImFjdGl2ZSIgOiAiIjsKICAgIH0sIDMwMCk7CiAgfSk7Cn0pKCk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/doc/compress.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogQ29tcHJlc3Npb24gSGVscGVyPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iZG9jcy5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vbW9kZS9qYXZhc2NyaXB0L2phdmFzY3JpcHQuanMiPjwvc2NyaXB0Pgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi9saWIvY29kZW1pcnJvci5jc3MiPgoKPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aW1nIGlkPWxvZ28gc3JjPSJsb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSJtYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPkNvbXByZXNzaW9uIGhlbHBlcjwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgoKPGgyPlNjcmlwdCBjb21wcmVzc2lvbiBoZWxwZXI8L2gyPgoKICAgIDxwPlRvIG9wdGltaXplIGxvYWRpbmcgQ29kZU1pcnJvciwgZXNwZWNpYWxseSB3aGVuIGluY2x1ZGluZyBhCiAgICBidW5jaCBvZiBkaWZmZXJlbnQgbW9kZXMsIGl0IGlzIHJlY29tbWVuZGVkIHRoYXQgeW91IGNvbWJpbmUgYW5kCiAgICBtaW5pZnkgKGFuZCBwcmVmZXJhYmx5IGFsc28gZ3ppcCkgdGhlIHNjcmlwdHMuIFRoaXMgcGFnZSBtYWtlcwogICAgdGhvc2UgZmlyc3QgdHdvIHN0ZXBzIHZlcnkgZWFzeS4gU2ltcGx5IHNlbGVjdCB0aGUgdmVyc2lvbiBhbmQKICAgIHNjcmlwdHMgeW91IG5lZWQgaW4gdGhlIGZvcm0gYmVsb3csIGFuZAogICAgY2xpY2sgPHN0cm9uZz5Db21wcmVzczwvc3Ryb25nPiB0byBkb3dubG9hZCB0aGUgbWluaWZpZWQgc2NyaXB0CiAgICBmaWxlLjwvcD4KCiAgICA8Zm9ybSBpZD0iZm9ybSIgYWN0aW9uPSJodHRwOi8vbWFyaWpuaGF2ZXJiZWtlLm5sL3VnbGlmeWpzIiBtZXRob2Q9InBvc3QiIG9uc3VibWl0PSJnZW5lcmF0ZUhlYWRlcigpOyI+CiAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGlkPSJkb3dubG9hZCIgbmFtZT0iZG93bmxvYWQiIHZhbHVlPSJjb2RlbWlycm9yLWNvbXByZXNzZWQuanMiLz4KICAgICAgPHA+VmVyc2lvbjogPHNlbGVjdCBpZD0idmVyc2lvbiIgb25jaGFuZ2U9InNldFZlcnNpb24odGhpcyk7IiBzdHlsZT0icGFkZGluZzogMXB4OyI+CiAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL2NvZGVtaXJyb3IubmV0LyI+SEVBRDwvb3B0aW9uPgogICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9tYXJpam5oYXZlcmJla2UubmwvZ2l0L2NvZGVtaXJyb3I/YT1ibG9iX3BsYWluO2hiPTQuNC4wO2Y9Ij40LjQ8L29wdGlvbj4KICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vbWFyaWpuaGF2ZXJiZWtlLm5sL2dpdC9jb2RlbWlycm9yP2E9YmxvYl9wbGFpbjtoYj00LjMuMDtmPSI+NC4zPC9vcHRpb24+CiAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL21hcmlqbmhhdmVyYmVrZS5ubC9naXQvY29kZW1pcnJvcj9hPWJsb2JfcGxhaW47aGI9NC4yLjE7Zj0iPjQuMjwvb3B0aW9uPgogICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9tYXJpam5oYXZlcmJla2UubmwvZ2l0L2NvZGVtaXJyb3I/YT1ibG9iX3BsYWluO2hiPTQuMi4wO2Y9Ij40LjI8L29wdGlvbj4KICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vbWFyaWpuaGF2ZXJiZWtlLm5sL2dpdC9jb2RlbWlycm9yP2E9YmxvYl9wbGFpbjtoYj00LjEuMDtmPSI+NC4xPC9vcHRpb24+CiAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL21hcmlqbmhhdmVyYmVrZS5ubC9naXQvY29kZW1pcnJvcj9hPWJsb2JfcGxhaW47aGI9NC4wLjM7Zj0iPjQuMDwvb3B0aW9uPgogICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9tYXJpam5oYXZlcmJla2UubmwvZ2l0L2NvZGVtaXJyb3I/YT1ibG9iX3BsYWluO2hiPTMuMjMuMDtmPSI+My4yMzwvb3B0aW9uPgogICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9tYXJpam5oYXZlcmJla2UubmwvZ2l0L2NvZGVtaXJyb3I/YT1ibG9iX3BsYWluO2hiPTMuMjIuMDtmPSI+My4yMjwvb3B0aW9uPgogICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9tYXJpam5oYXZlcmJla2UubmwvZ2l0L2NvZGVtaXJyb3I/YT1ibG9iX3BsYWluO2hiPTMuMjEuMDtmPSI+My4yMTwvb3B0aW9uPgogICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9tYXJpam5oYXZlcmJla2UubmwvZ2l0L2NvZGVtaXJyb3I/YT1ibG9iX3BsYWluO2hiPTMuMjAuMDtmPSI+My4yMDwvb3B0aW9uPgogICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9tYXJpam5oYXZlcmJla2UubmwvZ2l0L2NvZGVtaXJyb3I/YT1ibG9iX3BsYWluO2hiPTMuMTkuMDtmPSI+My4xOTwvb3B0aW9uPgogICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9tYXJpam5oYXZlcmJla2UubmwvZ2l0L2NvZGVtaXJyb3I/YT1ibG9iX3BsYWluO2hiPTMuMTguMDtmPSI+My4xODwvb3B0aW9uPgogICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9tYXJpam5oYXZlcmJla2UubmwvZ2l0L2NvZGVtaXJyb3I/YT1ibG9iX3BsYWluO2hiPTMuMTYuMDtmPSI+My4xNjwvb3B0aW9uPgogICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9tYXJpam5oYXZlcmJla2UubmwvZ2l0L2NvZGVtaXJyb3I/YT1ibG9iX3BsYWluO2hiPTMuMTUuMDtmPSI+My4xNTwvb3B0aW9uPgogICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9tYXJpam5oYXZlcmJla2UubmwvZ2l0L2NvZGVtaXJyb3I/YT1ibG9iX3BsYWluO2hiPTMuMTQuMDtmPSI+My4xNDwvb3B0aW9uPgogICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9tYXJpam5oYXZlcmJla2UubmwvZ2l0L2NvZGVtaXJyb3I/YT1ibG9iX3BsYWluO2hiPTMuMTMuMDtmPSI+My4xMzwvb3B0aW9uPgogICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9tYXJpam5oYXZlcmJla2UubmwvZ2l0L2NvZGVtaXJyb3I/YT1ibG9iX3BsYWluO2hiPXYzLjEyO2Y9Ij4zLjEyPC9vcHRpb24+CiAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL21hcmlqbmhhdmVyYmVrZS5ubC9naXQvY29kZW1pcnJvcj9hPWJsb2JfcGxhaW47aGI9djMuMTE7Zj0iPjMuMTE8L29wdGlvbj4KICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vbWFyaWpuaGF2ZXJiZWtlLm5sL2dpdC9jb2RlbWlycm9yP2E9YmxvYl9wbGFpbjtoYj12My4xO2Y9Ij4zLjE8L29wdGlvbj4KICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vbWFyaWpuaGF2ZXJiZWtlLm5sL2dpdC9jb2RlbWlycm9yP2E9YmxvYl9wbGFpbjtoYj12My4wMjtmPSI+My4wMjwvb3B0aW9uPgogICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9tYXJpam5oYXZlcmJla2UubmwvZ2l0L2NvZGVtaXJyb3I/YT1ibG9iX3BsYWluO2hiPXYzLjAxO2Y9Ij4zLjAxPC9vcHRpb24+CiAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL21hcmlqbmhhdmVyYmVrZS5ubC9naXQvY29kZW1pcnJvcj9hPWJsb2JfcGxhaW47aGI9djMuMDtmPSI+My4wPC9vcHRpb24+CiAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL21hcmlqbmhhdmVyYmVrZS5ubC9naXQvY29kZW1pcnJvcj9hPWJsb2JfcGxhaW47aGI9djIuMzg7Zj0iPjIuMzg8L29wdGlvbj4KICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vbWFyaWpuaGF2ZXJiZWtlLm5sL2dpdC9jb2RlbWlycm9yP2E9YmxvYl9wbGFpbjtoYj12Mi4zNztmPSI+Mi4zNzwvb3B0aW9uPgogICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9tYXJpam5oYXZlcmJla2UubmwvZ2l0L2NvZGVtaXJyb3I/YT1ibG9iX3BsYWluO2hiPXYyLjM2O2Y9Ij4yLjM2PC9vcHRpb24+CiAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL21hcmlqbmhhdmVyYmVrZS5ubC9naXQvY29kZW1pcnJvcj9hPWJsb2JfcGxhaW47aGI9djIuMzU7Zj0iPjIuMzU8L29wdGlvbj4KICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vbWFyaWpuaGF2ZXJiZWtlLm5sL2dpdC9jb2RlbWlycm9yP2E9YmxvYl9wbGFpbjtoYj12Mi4zNDtmPSI+Mi4zNDwvb3B0aW9uPgogICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9tYXJpam5oYXZlcmJla2UubmwvZ2l0L2NvZGVtaXJyb3I/YT1ibG9iX3BsYWluO2hiPXYyLjMzO2Y9Ij4yLjMzPC9vcHRpb24+CiAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL21hcmlqbmhhdmVyYmVrZS5ubC9naXQvY29kZW1pcnJvcj9hPWJsb2JfcGxhaW47aGI9djIuMzI7Zj0iPjIuMzI8L29wdGlvbj4KICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vbWFyaWpuaGF2ZXJiZWtlLm5sL2dpdC9jb2RlbWlycm9yP2E9YmxvYl9wbGFpbjtoYj12Mi4zMTtmPSI+Mi4zMTwvb3B0aW9uPgogICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9tYXJpam5oYXZlcmJla2UubmwvZ2l0L2NvZGVtaXJyb3I/YT1ibG9iX3BsYWluO2hiPXYyLjM7Zj0iPjIuMzwvb3B0aW9uPgogICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9tYXJpam5oYXZlcmJla2UubmwvZ2l0L2NvZGVtaXJyb3I/YT1ibG9iX3BsYWluO2hiPXYyLjI1O2Y9Ij4yLjI1PC9vcHRpb24+CiAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL21hcmlqbmhhdmVyYmVrZS5ubC9naXQvY29kZW1pcnJvcj9hPWJsb2JfcGxhaW47aGI9djIuMjQ7Zj0iPjIuMjQ8L29wdGlvbj4KICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vbWFyaWpuaGF2ZXJiZWtlLm5sL2dpdC9jb2RlbWlycm9yP2E9YmxvYl9wbGFpbjtoYj12Mi4yMztmPSI+Mi4yMzwvb3B0aW9uPgogICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9tYXJpam5oYXZlcmJla2UubmwvZ2l0L2NvZGVtaXJyb3I/YT1ibG9iX3BsYWluO2hiPXYyLjIyO2Y9Ij4yLjIyPC9vcHRpb24+CiAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL21hcmlqbmhhdmVyYmVrZS5ubC9naXQvY29kZW1pcnJvcj9hPWJsb2JfcGxhaW47aGI9djIuMjE7Zj0iPjIuMjE8L29wdGlvbj4KICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vbWFyaWpuaGF2ZXJiZWtlLm5sL2dpdC9jb2RlbWlycm9yP2E9YmxvYl9wbGFpbjtoYj12Mi4yO2Y9Ij4yLjI8L29wdGlvbj4KICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vbWFyaWpuaGF2ZXJiZWtlLm5sL2dpdC9jb2RlbWlycm9yP2E9YmxvYl9wbGFpbjtoYj12Mi4xODtmPSI+Mi4xODwvb3B0aW9uPgogICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9tYXJpam5oYXZlcmJla2UubmwvZ2l0L2NvZGVtaXJyb3I/YT1ibG9iX3BsYWluO2hiPXYyLjE2O2Y9Ij4yLjE2PC9vcHRpb24+CiAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL21hcmlqbmhhdmVyYmVrZS5ubC9naXQvY29kZW1pcnJvcj9hPWJsb2JfcGxhaW47aGI9djIuMTU7Zj0iPjIuMTU8L29wdGlvbj4KICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vbWFyaWpuaGF2ZXJiZWtlLm5sL2dpdC9jb2RlbWlycm9yP2E9YmxvYl9wbGFpbjtoYj12Mi4xMztmPSI+Mi4xMzwvb3B0aW9uPgogICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9tYXJpam5oYXZlcmJla2UubmwvZ2l0L2NvZGVtaXJyb3I/YT1ibG9iX3BsYWluO2hiPXYyLjEyO2Y9Ij4yLjEyPC9vcHRpb24+CiAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL21hcmlqbmhhdmVyYmVrZS5ubC9naXQvY29kZW1pcnJvcj9hPWJsb2JfcGxhaW47aGI9djIuMTE7Zj0iPjIuMTE8L29wdGlvbj4KICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vbWFyaWpuaGF2ZXJiZWtlLm5sL2dpdC9jb2RlbWlycm9yP2E9YmxvYl9wbGFpbjtoYj12Mi4xO2Y9Ij4yLjE8L29wdGlvbj4KICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vbWFyaWpuaGF2ZXJiZWtlLm5sL2dpdC9jb2RlbWlycm9yP2E9YmxvYl9wbGFpbjtoYj12Mi4wMjtmPSI+Mi4wMjwvb3B0aW9uPgogICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9tYXJpam5oYXZlcmJla2UubmwvZ2l0L2NvZGVtaXJyb3I/YT1ibG9iX3BsYWluO2hiPXYyLjAxO2Y9Ij4yLjAxPC9vcHRpb24+CiAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL21hcmlqbmhhdmVyYmVrZS5ubC9naXQvY29kZW1pcnJvcj9hPWJsb2JfcGxhaW47aGI9djIuMDtmPSI+Mi4wPC9vcHRpb24+CiAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL21hcmlqbmhhdmVyYmVrZS5ubC9naXQvY29kZW1pcnJvcj9hPWJsb2JfcGxhaW47aGI9YmV0YTI7Zj0iPmJldGEyPC9vcHRpb24+CiAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL21hcmlqbmhhdmVyYmVrZS5ubC9naXQvY29kZW1pcnJvcj9hPWJsb2JfcGxhaW47aGI9YmV0YTE7Zj0iPmJldGExPC9vcHRpb24+CiAgICAgIDwvc2VsZWN0PjwvcD4KCiAgICAgIDxzZWxlY3QgbXVsdGlwbGU9Im11bHRpcGxlIiBzaXplPSIyMCIgbmFtZT0iY29kZV91cmwiIHN0eWxlPSJ3aWR0aDogNDBlbTsiIGNsYXNzPSJmaWVsZCIgaWQ9ImZpbGVzIj4KICAgICAgICA8b3B0Z3JvdXAgbGFiZWw9IkNvZGVNaXJyb3IgTGlicmFyeSI+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vY29kZW1pcnJvci5uZXQvbGliL2NvZGVtaXJyb3IuanMiIHNlbGVjdGVkPmNvZGVtaXJyb3IuanM8L29wdGlvbj4KICAgICAgICA8L29wdGdyb3VwPgogICAgICAgIDxvcHRncm91cCBsYWJlbD0iTW9kZXMiPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvYXBsL2FwbC5qcyI+YXBsLmpzPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9jbGlrZS9jbGlrZS5qcyI+Y2xpa2UuanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL2Nsb2p1cmUvY2xvanVyZS5qcyI+Y2xvanVyZS5qczwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvY29ib2wvY29ib2wuanMiPmNvYm9sLmpzPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9jb2ZmZWVzY3JpcHQvY29mZmVlc2NyaXB0LmpzIj5jb2ZmZWVzY3JpcHQuanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL2NvbW1vbmxpc3AvY29tbW9ubGlzcC5qcyI+Y29tbW9ubGlzcC5qczwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvY3NzL2Nzcy5qcyI+Y3NzLmpzPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9jeXBoZXIvY3lwaGVyLmpzIj5jeXBoZXIuanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL2QvZC5qcyI+ZC5qczwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvZGlmZi9kaWZmLmpzIj5kaWZmLmpzPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9kamFuZ28vZGphbmdvLmpzIj5kamFuZ28uanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL2R0ZC9kdGQuanMiPmR0ZC5qczwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvZHlsYW4vZHlsYW4uanMiPmR5bGFuLmpzPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9lY2wvZWNsLmpzIj5lY2wuanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL2VpZmZlbC9laWZmZWwuanMiPmVpZmZlbC5qczwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvZXJsYW5nL2VybGFuZy5qcyI+ZXJsYW5nLmpzPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9mb3J0cmFuL2ZvcnRyYW4uanMiPmZvcnRyYW4uanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL2dmbS9nZm0uanMiPmdmbS5qczwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvZ2FzL2dhcy5qcyI+Z2FzLmpzPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9naGVya2luL2doZXJraW4uanMiPmdoZXJraW4uanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL2dvL2dvLmpzIj5nby5qczwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvZ3Jvb3Z5L2dyb292eS5qcyI+Z3Jvb3Z5LmpzPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9oYW1sL2hhbWwuanMiPmhhbWwuanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL2hhc2tlbGwvaGFza2VsbC5qcyI+aGFza2VsbC5qczwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvaGF4ZS9oYXhlLmpzIj5oYXhlLmpzPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9odG1sZW1iZWRkZWQvaHRtbGVtYmVkZGVkLmpzIj5odG1sZW1iZWRkZWQuanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL2h0bWxtaXhlZC9odG1sbWl4ZWQuanMiPmh0bWxtaXhlZC5qczwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvaHR0cC9odHRwLmpzIj5odHRwLmpzPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9qYWRlL2phZGUuanMiPmphZGUuanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL2phdmFzY3JpcHQvamF2YXNjcmlwdC5qcyI+amF2YXNjcmlwdC5qczwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvamluamEyL2ppbmphMi5qcyI+amluamEyLmpzPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9qdWxpYS9qdWxpYS5qcyI+anVsaWEuanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL2tvdGxpbi9rb3RsaW4uanMiPmtvdGxpbi5qczwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvbGl2ZXNjcmlwdC9saXZlc2NyaXB0LmpzIj5saXZlc2NyaXB0LmpzPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9sdWEvbHVhLmpzIj5sdWEuanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL21hcmtkb3duL21hcmtkb3duLmpzIj5tYXJrZG93bi5qczwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvbWlyYy9taXJjLmpzIj5taXJjLmpzPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9tbGxpa2UvbWxsaWtlLmpzIj5tbGxpa2UuanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL25naW54L25naW54LmpzIj5uZ2lueC5qczwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvbnRyaXBsZXMvbnRyaXBsZXMuanMiPm50cmlwbGVzLmpzPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9vY3RhdmUvb2N0YXZlLmpzIj5vY3RhdmUuanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL3Bhc2NhbC9wYXNjYWwuanMiPnBhc2NhbC5qczwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvcGVnanMvcGVnanMuanMiPnBlZ2pzLmpzPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9wZXJsL3BlcmwuanMiPnBlcmwuanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL3BocC9waHAuanMiPnBocC5qczwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvcGlnL3BpZy5qcyI+cGlnLmpzPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9wcm9wZXJ0aWVzL3Byb3BlcnRpZXMuanMiPnByb3BlcnRpZXMuanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL3B5dGhvbi9weXRob24uanMiPnB5dGhvbi5qczwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvcHVwcGV0L3B1cHBldC5qcyI+cHVwcGV0LmpzPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9xL3EuanMiPnEuanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL3Ivci5qcyI+ci5qczwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvcnBtL3JwbS5qcyI+cnBtLmpzPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9yc3QvcnN0LmpzIj5yc3QuanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL3J1YnkvcnVieS5qcyI+cnVieS5qczwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvcnVzdC9ydXN0LmpzIj5ydXN0LmpzPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9zYXNzL3Nhc3MuanMiPnNhc3MuanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL3NjYWxhL3NjYWxhLmpzIj5zY2FsYS5qczwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvc2NoZW1lL3NjaGVtZS5qcyI+c2NoZW1lLmpzPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9zaGVsbC9zaGVsbC5qcyI+c2hlbGwuanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL3NpZXZlL3NpZXZlLmpzIj5zaWV2ZS5qczwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvc21hbGx0YWxrL3NtYWxsdGFsay5qcyI+c21hbGx0YWxrLmpzPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9zbWFydHkvc21hcnR5LmpzIj5zbWFydHkuanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL3NtYXJ0eW1peGVkL3NtYXJ0eW1peGVkLmpzIj5zbWFydHltaXhlZC5qczwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvc3FsL3NxbC5qcyI+c3FsLmpzPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9zcGFycWwvc3BhcnFsLmpzIj5zcGFycWwuanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL3N0ZXgvc3RleC5qcyI+c3RleC5qczwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvdGNsL3RjbC5qcyI+dGNsLmpzPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS90aWRkbHl3aWtpL3RpZGRseXdpa2kuanMiPnRpZGRseXdpa2kuanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL3Rpa2kvdGlraS5qcyI+dGlraS5qczwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvdG9tbC90b21sLmpzIj50b21sLmpzPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS90dXJ0bGUvdHVydGxlLmpzIj50dXJ0bGUuanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL3ZiL3ZiLmpzIj52Yi5qczwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvdmJzY3JpcHQvdmJzY3JpcHQuanMiPnZic2NyaXB0LmpzPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS92ZWxvY2l0eS92ZWxvY2l0eS5qcyI+dmVsb2NpdHkuanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL3Zlcmlsb2cvdmVyaWxvZy5qcyI+dmVyaWxvZy5qczwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUveG1sL3htbC5qcyI+eG1sLmpzPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS94cXVlcnkveHF1ZXJ5LmpzIj54cXVlcnkuanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL3lhbWwveWFtbC5qcyI+eWFtbC5qczwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvejgwL3o4MC5qcyI+ejgwLmpzPC9vcHRpb24+CiAgICAgICAgPC9vcHRncm91cD4KICAgICAgICA8b3B0Z3JvdXAgbGFiZWw9IkFkZC1vbnMiPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2FkZG9uL3NlbGVjdGlvbi9hY3RpdmUtbGluZS5qcyI+YWN0aXZlLWxpbmUuanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9hZGRvbi9oaW50L2FueXdvcmQtaGludC5qcyI+YW55d29yZC1oaW50LmpzPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vY29kZW1pcnJvci5uZXQvYWRkb24vZm9sZC9icmFjZS1mb2xkLmpzIj5icmFjZS1mb2xkLmpzPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vY29kZW1pcnJvci5uZXQvYWRkb24vZWRpdC9jbG9zZWJyYWNrZXRzLmpzIj5jbG9zZWJyYWNrZXRzLmpzPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vY29kZW1pcnJvci5uZXQvYWRkb24vZWRpdC9jbG9zZXRhZy5qcyI+Y2xvc2V0YWcuanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9hZGRvbi9ydW5tb2RlL2NvbG9yaXplLmpzIj5jb2xvcml6ZS5qczwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2FkZG9uL2NvbW1lbnQvY29tbWVudC5qcyI+Y29tbWVudC5qczwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2FkZG9uL2ZvbGQvY29tbWVudC1mb2xkLmpzIj5jb21tZW50LWZvbGQuanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9hZGRvbi9jb21tZW50L2NvbnRpbnVlY29tbWVudC5qcyI+Y29udGludWVjb21tZW50LmpzPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vY29kZW1pcnJvci5uZXQvYWRkb24vZWRpdC9jb250aW51ZWxpc3QuanMiPmNvbnRpbnVlbGlzdC5qczwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2FkZG9uL2hpbnQvY3NzLWhpbnQuanMiPmNzcy1oaW50LmpzPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vY29kZW1pcnJvci5uZXQvYWRkb24vZGlhbG9nL2RpYWxvZy5qcyI+ZGlhbG9nLmpzPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vY29kZW1pcnJvci5uZXQvYWRkb24vZm9sZC9mb2xkY29kZS5qcyI+Zm9sZGNvZGUuanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9hZGRvbi9mb2xkL2ZvbGRndXR0ZXIuanMiPmZvbGRndXR0ZXIuanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9hZGRvbi9kaXNwbGF5L2Z1bGxzY3JlZW4uanMiPmZ1bGxzY3JlZW4uanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9hZGRvbi93cmFwL2hhcmR3cmFwLmpzIj5oYXJkd3JhcC5qczwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2FkZG9uL2hpbnQvaHRtbC1oaW50LmpzIj5odG1sLWhpbnQuanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9hZGRvbi9mb2xkL2luZGVudC1mb2xkLmpzIj5pbmRlbnQtZm9sZC5qczwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2FkZG9uL2hpbnQvamF2YXNjcmlwdC1oaW50LmpzIj5qYXZhc2NyaXB0LWhpbnQuanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9hZGRvbi9saW50L2phdmFzY3JpcHQtbGludC5qcyI+amF2YXNjcmlwdC1saW50LmpzPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vY29kZW1pcnJvci5uZXQvYWRkb24vbGludC9qc29uLWxpbnQuanMiPmpzb24tbGludC5qczwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2FkZG9uL2xpbnQvbGludC5qcyI+bGludC5qczwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2FkZG9uL21vZGUvbG9hZG1vZGUuanMiPmxvYWRtb2RlLmpzPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vY29kZW1pcnJvci5uZXQvYWRkb24vZm9sZC9tYXJrZG93bi1mb2xkLmpzIj5tYXJrZG93bi1mb2xkLmpzPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vY29kZW1pcnJvci5uZXQvYWRkb24vc2VsZWN0aW9uL21hcmstc2VsZWN0aW9uLmpzIj5tYXJrLXNlbGVjdGlvbi5qczwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2FkZG9uL3NlYXJjaC9tYXRjaC1oaWdobGlnaHRlci5qcyI+bWF0Y2gtaGlnaGxpZ2h0ZXIuanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9hZGRvbi9lZGl0L21hdGNoYnJhY2tldHMuanMiPm1hdGNoYnJhY2tldHMuanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9hZGRvbi9lZGl0L21hdGNodGFncy5qcyI+bWF0Y2h0YWdzLmpzPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vY29kZW1pcnJvci5uZXQvYWRkb24vbWVyZ2UvbWVyZ2UuanMiPm1lcmdlLmpzPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vY29kZW1pcnJvci5uZXQvYWRkb24vbW9kZS9tdWx0aXBsZXguanMiPm11bHRpcGxleC5qczwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2FkZG9uL21vZGUvb3ZlcmxheS5qcyI+b3ZlcmxheS5qczwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2FkZG9uL2Rpc3BsYXkvcGxhY2Vob2xkZXIuanMiPnBsYWNlaG9sZGVyLmpzPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vY29kZW1pcnJvci5uZXQvYWRkb24vaGludC9weXRob24taGludC5qcyI+cHl0aG9uLWhpbnQuanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9hZGRvbi9kaXNwbGF5L3J1bGVycy5qcyI+cnVsZXJzLmpzPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vY29kZW1pcnJvci5uZXQvYWRkb24vcnVubW9kZS9ydW5tb2RlLmpzIj5ydW5tb2RlLmpzPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vY29kZW1pcnJvci5uZXQvYWRkb24vcnVubW9kZS9ydW5tb2RlLm5vZGUuanMiPnJ1bm1vZGUubm9kZS5qczwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2FkZG9uL3J1bm1vZGUvcnVubW9kZS1zdGFuZGFsb25lLmpzIj5ydW5tb2RlLXN0YW5kYWxvbmUuanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9hZGRvbi9zZWFyY2gvc2VhcmNoLmpzIj5zZWFyY2guanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9hZGRvbi9zZWFyY2gvc2VhcmNoY3Vyc29yLmpzIj5zZWFyY2hjdXJzb3IuanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9hZGRvbi9oaW50L3Nob3ctaGludC5qcyI+c2hvdy1oaW50LmpzPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vY29kZW1pcnJvci5uZXQvYWRkb24vaGludC9zcWwtaGludC5qcyI+c3FsLWhpbnQuanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9hZGRvbi9lZGl0L3RyYWlsaW5nc3BhY2UuanMiPnRyYWlsaW5nc3BhY2UuanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9hZGRvbi90ZXJuL3Rlcm4uanMiPnRlcm4uanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9hZGRvbi9mb2xkL3htbC1mb2xkLmpzIj54bWwtZm9sZC5qczwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2FkZG9uL2hpbnQveG1sLWhpbnQuanMiPnhtbC1oaW50LmpzPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vY29kZW1pcnJvci5uZXQvYWRkb24vaGludC95YW1sLWxpbnQuanMiPnlhbWwtbGludC5qczwvb3B0aW9uPgogICAgICAgIDwvb3B0Z3JvdXA+CiAgICAgICAgPG9wdGdyb3VwIGxhYmVsPSJLZXltYXBzIj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9rZXltYXAvZW1hY3MuanMiPmVtYWNzLmpzPC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSJodHRwOi8vY29kZW1pcnJvci5uZXQva2V5bWFwL3N1YmxpbWUuanMiPnN1YmxpbWUuanM8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9rZXltYXAvdmltLmpzIj52aW0uanM8L29wdGlvbj4KICAgICAgICA8L29wdGdyb3VwPgogICAgICA8L3NlbGVjdD4KCiAgICAgIDxwPgogICAgICAgIDxidXR0b24gdHlwZT0ic3VibWl0Ij5Db21wcmVzczwvYnV0dG9uPiB3aXRoIDxhIGhyZWY9Imh0dHA6Ly9naXRodWIuY29tL21pc2hvby9VZ2xpZnlKUy8iPlVnbGlmeUpTPC9hPgogICAgICA8L3A+CiAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIGlkPSJoZWFkZXIiIG5hbWU9ImhlYWRlciI+CiAgICAgIDxwPkN1c3RvbSBjb2RlIHRvIGFkZCB0byB0aGUgY29tcHJlc3NlZCBmaWxlOjx0ZXh0YXJlYSBuYW1lPSJqc19jb2RlIiBzdHlsZT0id2lkdGg6IDEwMCU7IGhlaWdodDogMTVlbTsiIGNsYXNzPSJmaWVsZCIgaWQ9ImpzX2NvZGUiPjwvdGV4dGFyZWE+PC9wPgogICAgPC9mb3JtPgoKICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KICAgICAgQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImpzX2NvZGUiKSkuZ2V0V3JhcHBlckVsZW1lbnQoKS5jbGFzc05hbWUgKz0gIiBmaWVsZCI7CgogICAgICBmdW5jdGlvbiBzZXRWZXJzaW9uKHZlcikgewogICAgICAgIHZhciB1cmxwcmVmaXggPSB2ZXIub3B0aW9uc1t2ZXIuc2VsZWN0ZWRJbmRleF0udmFsdWU7CiAgICAgICAgdmFyIHNlbGVjdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJmaWxlcyIpLCBtOwogICAgICAgIGZvciAodmFyIG9wdGdyID0gc2VsZWN0LmZpcnN0Q2hpbGQ7IG9wdGdyOyBvcHRnciA9IG9wdGdyLm5leHRTaWJsaW5nKQogICAgICAgICAgZm9yICh2YXIgb3B0ID0gb3B0Z3IuZmlyc3RDaGlsZDsgb3B0OyBvcHQgPSBvcHQubmV4dFNpYmxpbmcpIHsKICAgICAgICAgICAgaWYgKG9wdC5ub2RlTmFtZSAhPSAiT1BUSU9OIikKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgZWxzZSBpZiAobSA9IG9wdC52YWx1ZS5tYXRjaCgvXmh0dHA6XC9cL2NvZGVtaXJyb3IubmV0XC8oLiopJC8pKQogICAgICAgICAgICAgIG9wdC52YWx1ZSA9IHVybHByZWZpeCArIG1bMV07CiAgICAgICAgICAgIGVsc2UgaWYgKG0gPSBvcHQudmFsdWUubWF0Y2goL2h0dHA6XC9cL21hcmlqbmhhdmVyYmVrZS5ubFwvZ2l0XC9jb2RlbWlycm9yXD9hPWJsb2JfcGxhaW47aGI9W147XSs7Zj0oLiopJC8pKQogICAgICAgICAgICAgIG9wdC52YWx1ZSA9IHVybHByZWZpeCArIG1bMV07CiAgICAgICAgICB9CiAgICAgICB9CiAgICAgICAKICAgICAgIGZ1bmN0aW9uIGdlbmVyYXRlSGVhZGVyKCkgewogICAgICAgICB2YXIgdmVyc2lvbk5vZGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidmVyc2lvbiIpOwogICAgICAgICB2YXIgdmVyc2lvbiA9IHZlcnNpb25Ob2RlLm9wdGlvbnNbdmVyc2lvbk5vZGUuc2VsZWN0ZWRJbmRleF0ubGFiZWwKICAgICAgICAgdmFyIGZpbGVzTm9kZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJmaWxlcyIpOwogICAgICAgICB2YXIgb3B0R3JvdXBIZWFkZXJJbmNsdWRlZDsKCiAgICAgICAgIC8vIEdlbmVyYXRlIHRoZSBjb21tZW50CiAgICAgICAgIHZhciBzdHIgPSAiLyogQ29kZU1pcnJvciAtIE1pbmlmaWVkICYgQnVuZGxlZFxuIjsKICAgICAgICAgc3RyICs9ICIgICBHZW5lcmF0ZWQgb24gIiArIG5ldyBEYXRlKCkudG9Mb2NhbGVEYXRlU3RyaW5nKCkgKyAiIHdpdGggaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9jb21wcmVzcy5odG1sXG4iOwogICAgICAgICBzdHIgKz0gIiAgIFZlcnNpb246ICIgKyB2ZXJzaW9uICsgIlxuXG4iOwoKICAgICAgICAgZm9yICh2YXIgZ3JvdXAgPSBmaWxlc05vZGUuZmlyc3RDaGlsZDsgZ3JvdXA7IGdyb3VwID0gZ3JvdXAubmV4dFNpYmxpbmcpIHsKICAgICAgICAgICBvcHRHcm91cEhlYWRlckluY2x1ZGVkID0gZmFsc2U7CiAgICAgICAgICAgZm9yICh2YXIgb3B0aW9uID0gZ3JvdXAuZmlyc3RDaGlsZDsgb3B0aW9uOyBvcHRpb24gPSBvcHRpb24ubmV4dFNpYmxpbmcpIHsKICAgICAgICAgICAgIGlmIChvcHRpb24ubm9kZU5hbWUgIT09ICJPUFRJT04iKSB7CiAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfSBlbHNlIGlmIChvcHRpb24uc2VsZWN0ZWQpIHsKICAgICAgICAgICAgICAgaWYgKCFvcHRHcm91cEhlYWRlckluY2x1ZGVkKSB7CiAgICAgICAgICAgICAgICAgc3RyICs9ICIgICAiICsgZ3JvdXAubGFiZWwgKyAiOlxuIjsKICAgICAgICAgICAgICAgICBvcHRHcm91cEhlYWRlckluY2x1ZGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICBzdHIgKz0gIiAgIC0gIiArIG9wdGlvbi5sYWJlbCArICJcbiI7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIHN0ciArPSAiICovXG5cbiI7CgogICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiaGVhZGVyIikudmFsdWUgPSBzdHI7CiAgICAgICB9CiAgICA8L3NjcmlwdD4KCjwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/doc/docs.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[QGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdTb3VyY2UgU2FucyBQcm8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1NvdXJjZSBTYW5zIFBybycpLCBsb2NhbCgnU291cmNlU2Fuc1Byby1SZWd1bGFyJyksIHVybCgvL3RoZW1lcy5nb29nbGV1c2VyY29udGVudC5jb20vc3RhdGljL2ZvbnRzL3NvdXJjZXNhbnNwcm8vdjUvT0RlbEkxYUhCWURCcWdlSUFIMnpsQk0wWXp1VDdNZE9lMDNvdFBidVVTMC53b2ZmKSBmb3JtYXQoJ3dvZmYnKTsKfQoKYm9keSwgaHRtbCB7IG1hcmdpbjogMDsgcGFkZGluZzogMDsgaGVpZ2h0OiAxMDAlOyB9CnNlY3Rpb24sIGFydGljbGUgeyBkaXNwbGF5OiBibG9jazsgcGFkZGluZzogMDsgfQoKYm9keSB7CiAgYmFja2dyb3VuZDogI2Y4ZjhmODsKICBmb250LWZhbWlseTogJ1NvdXJjZSBTYW5zIFBybycsIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7CiAgbGluZS1oZWlnaHQ6IDEuNTsKfQoKcCB7IG1hcmdpbi10b3A6IDA7IH0KCmgyLCBoMyB7CiAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKICBtYXJnaW4tYm90dG9tOiAuN2VtOwp9CmgyIHsgZm9udC1zaXplOiAxMjAlOyB9CmgzIHsgZm9udC1zaXplOiAxMTAlOyB9CmFydGljbGUgPiBoMjpmaXJzdC1jaGlsZCwgc2VjdGlvbjpmaXJzdC1jaGlsZCA+IGgyIHsgbWFyZ2luLXRvcDogMDsgfQoKYSwgYTp2aXNpdGVkLCBhOmxpbmssIC5xdWFzaWxpbmsgewogIGNvbG9yOiAjQTIxMzEzOwogIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKfQoKZW0gewogIHBhZGRpbmctcmlnaHQ6IDJweDsKfQoKLnF1YXNpbGluayB7CiAgY3Vyc29yOiBwb2ludGVyOwp9CgphcnRpY2xlIHsKICBtYXgtd2lkdGg6IDcwMHB4OwogIG1hcmdpbjogMCAwIDAgMTYwcHg7CiAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjRTMwODA4OwogIGJvcmRlci1yaWdodDogMXB4IHNvbGlkICNkZGQ7CiAgcGFkZGluZzogMzBweCA1MHB4IDEwMHB4IDUwcHg7CiAgYmFja2dyb3VuZDogd2hpdGU7CiAgei1pbmRleDogMjsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgbWluLWhlaWdodDogMTAwJTsKICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogIC1tb3otYm94LXNpemluZzogYm9yZGVyLWJveDsKfQoKI25hdiB7CiAgcG9zaXRpb246IGZpeGVkOwogIHBhZGRpbmctdG9wOiAzMHB4OwogIG1heC1oZWlnaHQ6IDEwMCU7CiAgYm94LXNpemluZzogLW1vei1ib3JkZXItYm94OwogIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgb3ZlcmZsb3cteTogYXV0bzsKICBsZWZ0OiAwOyByaWdodDogbm9uZTsKICB3aWR0aDogMTYwcHg7CiAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgei1pbmRleDogMTsKfQoKQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogMTAwMHB4KSB7CiAgYXJ0aWNsZSB7CiAgICBtYXJnaW46IDAgYXV0bzsKICB9CiAgI25hdiB7CiAgICByaWdodDogNTAlOwogICAgd2lkdGg6IGF1dG87CiAgICBib3JkZXItcmlnaHQ6IDM0OXB4IHNvbGlkIHRyYW5zcGFyZW50OwogIH0KfQoKI25hdiB1bCB7CiAgZGlzcGxheTogYmxvY2s7CiAgbWFyZ2luOiAwOyBwYWRkaW5nOiAwOwogIG1hcmdpbi1ib3R0b206IDMycHg7Cn0KCiNuYXYgbGkgewogIGRpc3BsYXk6IGJsb2NrOwogIG1hcmdpbi1ib3R0b206IDRweDsKfQoKI25hdiBsaSB1bCB7CiAgZm9udC1zaXplOiA4MCU7CiAgbWFyZ2luLWJvdHRvbTogMDsKICBkaXNwbGF5OiBub25lOwp9CgojbmF2IGxpLmFjdGl2ZSB1bCB7CiAgZGlzcGxheTogYmxvY2s7Cn0KCiNuYXYgbGkgbGkgYSB7CiAgcGFkZGluZy1yaWdodDogMjBweDsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCiNuYXYgdWwgYSB7CiAgY29sb3I6IGJsYWNrOwogIHBhZGRpbmc6IDAgN3B4IDFweCAxMXB4Owp9CgojbmF2IHVsIGEuYWN0aXZlLCAjbmF2IHVsIGE6aG92ZXIgewogIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjRTMwODA4OwogIG1hcmdpbi1ib3R0b206IC0xcHg7CiAgY29sb3I6ICNFMzA4MDg7Cn0KCiNsb2dvIHsKICBib3JkZXI6IDA7CiAgbWFyZ2luLXJpZ2h0OiA3cHg7CiAgbWFyZ2luLWJvdHRvbTogMjVweDsKfQoKc2VjdGlvbiB7CiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICNFMzA4MDg7CiAgbWFyZ2luOiAxLjVlbSAwOwp9CgpzZWN0aW9uLmZpcnN0IHsKICBib3JkZXI6IG5vbmU7CiAgbWFyZ2luLXRvcDogMDsKfQoKI2RlbW8gewogIHBvc2l0aW9uOiByZWxhdGl2ZTsKfQoKI2RlbW9saXN0IHsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgcmlnaHQ6IDVweDsKICB0b3A6IDVweDsKICB6LWluZGV4OiAyNTsKfQoKLmJhbmtpbmZvIHsKICB0ZXh0LWFsaWduOiBsZWZ0OwogIGRpc3BsYXk6IG5vbmU7CiAgcGFkZGluZzogMCAuNWVtOwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICBib3JkZXI6IDJweCBzb2xpZCAjYWFhOwogIGJvcmRlci1yYWRpdXM6IDVweDsKICBiYWNrZ3JvdW5kOiAjZWVlOwogIHRvcDogMTBweDsKICBsZWZ0OiAzMHB4Owp9CgouYmFua2luZm9fY2xvc2UgewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB0b3A6IDA7IHJpZ2h0OiA2cHg7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgY3Vyc29yOiBwb2ludGVyOwp9CgouYmlnYnV0dG9uIHsKICBjdXJzb3I6IHBvaW50ZXI7CiAgdGV4dC1hbGlnbjogY2VudGVyOwogIHBhZGRpbmc6IDAgMWVtOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICBjb2xvcjogd2hpdGU7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIGxpbmUtaGVpZ2h0OiAxLjk7CiAgY29sb3I6IHdoaXRlICFpbXBvcnRhbnQ7CiAgYmFja2dyb3VuZDogI0EyMTMxMzsKfQoKLmJpZ2J1dHRvbi5yaWdodCB7CiAgYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1czogMTAwcHg7CiAgYm9yZGVyLXRvcC1sZWZ0LXJhZGl1czogMTAwcHg7Cn0KCi5iaWdidXR0b24ubGVmdCB7CiAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDEwMHB4OwogIGJvcmRlci10b3AtcmlnaHQtcmFkaXVzOiAxMDBweDsKfQoKLmJpZ2J1dHRvbjpob3ZlciB7CiAgYmFja2dyb3VuZDogI0UzMDgwODsKfQoKdGggewogIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgdGV4dC1hbGlnbjogbGVmdDsKfQoKI2ZlYXR1cmVzIHVsIHsKICBsaXN0LXN0eWxlOiBub25lOwogIG1hcmdpbjogMCAwIDFlbTsKICBwYWRkaW5nOiAwIDAgMCAxLjJlbTsKfQoKI2ZlYXR1cmVzIGxpOmJlZm9yZSB7CiAgY29udGVudDogIi0iOwogIHdpZHRoOiAxZW07CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIHBhZGRpbmc6IDA7CiAgbWFyZ2luOiAwOwogIG1hcmdpbi1sZWZ0OiAtMWVtOwp9CgoucmVsIHsKICBtYXJnaW4tYm90dG9tOiAwOwp9Ci5yZWwtbm90ZSB7CiAgbWFyZ2luLXRvcDogMDsKICBjb2xvcjogIzU1NTsKfQoKcHJlIHsKICBwYWRkaW5nLWxlZnQ6IDE1cHg7CiAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjZGRkOwp9Cgpjb2RlIHsKICBwYWRkaW5nOiAwIDJweDsKfQoKc3Ryb25nIHsKICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICBmb250LXdlaWdodDogbm9ybWFsOwp9CgouZmllbGQgewogIGJvcmRlcjogMXB4IHNvbGlkICNBMjEzMTM7Cn0K]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/doc/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCEtLSBEVU1NWSBIVE1MIEZJTEUgLS0+]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/doc/internals.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogSW50ZXJuYWxzPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iZG9jcy5jc3MiPgo8c3R5bGU+ZGwgZGwge21hcmdpbjogMDt9IC51cGRhdGUge2NvbG9yOiAjZDQwICFpbXBvcnRhbnR9PC9zdHlsZT4KPHNjcmlwdCBzcmM9ImFjdGl2ZWJvb2ttYXJrLmpzIj48L3NjcmlwdD4KCjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGltZyBpZD1sb2dvIHNyYz0ibG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0ibWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9IiN0b3AiPkludHJvZHVjdGlvbjwvYT48L2xpPgogICAgPGxpPjxhIGhyZWY9IiNhcHByb2FjaCI+R2VuZXJhbCBBcHByb2FjaDwvYT48L2xpPgogICAgPGxpPjxhIGhyZWY9IiNpbnB1dCI+SW5wdXQ8L2E+PC9saT4KICAgIDxsaT48YSBocmVmPSIjc2VsZWN0aW9uIj5TZWxlY3Rpb248L2E+PC9saT4KICAgIDxsaT48YSBocmVmPSIjdXBkYXRlIj5JbnRlbGxpZ2VudCBVcGRhdGluZzwvYT48L2xpPgogICAgPGxpPjxhIGhyZWY9IiNwYXJzZSI+UGFyc2luZzwvYT48L2xpPgogICAgPGxpPjxhIGhyZWY9IiNzdW1tYXJ5Ij5XaGF0IEdpdmVzPzwvYT48L2xpPgogICAgPGxpPjxhIGhyZWY9IiNidHJlZSI+Q29udGVudCBSZXByZXNlbnRhdGlvbjwvYT48L2xpPgogICAgPGxpPjxhIGhyZWY9IiNrZXltYXAiPktleSBNYXBzPC9hPjwvbGk+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KCjxoMiBpZD10b3A+KFJlLSkgSW1wbGVtZW50aW5nIEEgU3ludGF4LUhpZ2hsaWdodGluZyBFZGl0b3IgaW4gSmF2YVNjcmlwdDwvaDI+Cgo8cCBzdHlsZT0iZm9udC1zaXplOiA4NSUiIGlkPSJpbnRybyI+CiAgPHN0cm9uZz5Ub3BpYzo8L3N0cm9uZz4gSmF2YVNjcmlwdCwgY29kZSBlZGl0b3IgaW1wbGVtZW50YXRpb248YnI+CiAgPHN0cm9uZz5BdXRob3I6PC9zdHJvbmc+IE1hcmlqbiBIYXZlcmJla2U8YnI+CiAgPHN0cm9uZz5EYXRlOjwvc3Ryb25nPiBNYXJjaCAybmQgMjAxMSAodXBkYXRlZCBOb3ZlbWJlciAxM3RoIDIwMTEpCjwvcD4KCjxwIHN0eWxlPSJwYWRkaW5nOiAwIDNlbSAwIDJlbSI+PHN0cm9uZz5DYXV0aW9uPC9zdHJvbmc+OiB0aGlzIHRleHQgd2FzIHdyaXR0ZW4gYnJpZWZseSBhZnRlcgp2ZXJzaW9uIDIgd2FzIGluaXRpYWxseSB3cml0dGVuLiBJdCBubyBsb25nZXIgKGV2ZW4gaW5jbHVkaW5nIHRoZQp1cGRhdGUgYXQgdGhlIGJvdHRvbSkgZnVsbHkgcmVwcmVzZW50cyB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbi4gSSdtCmxlYXZpbmcgaXQgaGVyZSBhcyBhIGhpc3RvcmljIGRvY3VtZW50LiBGb3IgbW9yZSB1cC10by1kYXRlCmluZm9ybWF0aW9uLCBsb29rIGF0IHRoZSBlbnRyaWVzCnRhZ2dlZCA8YSBocmVmPSJodHRwOi8vbWFyaWpuaGF2ZXJiZWtlLm5sL2Jsb2cvI2NtLWludGVybmFscyI+Y20taW50ZXJuYWxzPC9hPgpvbiBteSBibG9nLjwvcD4KCjxwPlRoaXMgaXMgYSBmb2xsb3d1cCB0bwpteSA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvc3RvcnkuaHRtbCI+QnJ1dGFsIE9keXNzZXkgdG8gdGhlCkRhcmsgU2lkZSBvZiB0aGUgRE9NIFRyZWU8L2E+IHN0b3J5LiBUaGF0IG9uZSBkZXNjcmliZXMgdGhlCm1pbmQtYmVuZGluZyBwcm9jZXNzIG9mIGltcGxlbWVudGluZyAod2hhdCB3b3VsZCBiZWNvbWUpIENvZGVNaXJyb3IgMS4KVGhpcyBvbmUgZGVzY3JpYmVzIHRoZSBpbnRlcm5hbHMgb2YgQ29kZU1pcnJvciAyLCBhIGNvbXBsZXRlIHJld3JpdGUKYW5kIHJldGhpbmsgb2YgdGhlIG9sZCBjb2RlIGJhc2UuIEkgd2FudGVkIHRvIGdpdmUgdGhpcyBwaWVjZSBhbm90aGVyCkh1bnRlciBUaG9tcHNvbiBjb3B5Y2F0IHN1YnRpdGxlLCBidXQgc29tZWhvdyB0aGF0IHdvdWxkIGJlIG91dCBvZgpwbGFjZeKAlHRoZSBwcm9jZXNzIHRoaXMgdGltZSBhcm91bmQgd2FzIG9uZSBvZiBzdHJhaWdodGZvcndhcmQKZW5naW5lZXJpbmcsIHJlcXVpcmluZyBubyBzZXJpb3VzIG1pbmQtYmVuZGluZyB3aGF0c29ldmVyLjwvcD4KCjxwPlNvLCB3aGF0IGlzIHdyb25nIHdpdGggQ29kZU1pcnJvciAxPyBJJ2QgZXN0aW1hdGUsIGJ5IG1haWxpbmcgbGlzdAphY3Rpdml0eSBhbmQgZ2VuZXJhbCBzZWFyY2gtZW5naW5lIHByZXNlbmNlLCB0aGF0IGl0IGhhcyBiZWVuCmludGVncmF0ZWQgaW50byBhYm91dCBhIHRob3VzYW5kIHN5c3RlbXMgYnkgbm93LiBUaGUgbW9zdCBwcm9taW5lbnQKb25lLCBzaW5jZSBhIGZldyB3ZWVrcywKYmVpbmcgPGEgaHJlZj0iaHR0cDovL2dvb2dsZWNvZGUuYmxvZ3Nwb3QuY29tLzIwMTEvMDEvbWFrZS1xdWljay1maXhlcy1xdWlja2VyLW9uLWdvb2dsZS5odG1sIj5Hb29nbGUKY29kZSdzIHByb2plY3QgaG9zdGluZzwvYT4uIEl0IHdvcmtzLCBhbmQgaXQncyBiZWluZyB1c2VkIHdpZGVseS48L3A+Cgo8cD5TdGlsbCwgSSBkaWQgbm90IHN0YXJ0IHJlcGxhY2luZyBpdCBiZWNhdXNlIEkgd2FzIGJvcmVkLiBDb2RlTWlycm9yCjEgd2FzIGhlYXZpbHkgcmVsaWFudCBvbiA8Y29kZT5kZXNpZ25Nb2RlPC9jb2RlPgpvciA8Y29kZT5jb250ZW50RWRpdGFibGU8L2NvZGU+IChkZXBlbmRpbmcgb24gdGhlIGJyb3dzZXIpLiBOZWl0aGVyIG9mCnRoZXNlIGFyZSB3ZWxsIHNwZWNpZmllZCAoSFRNTDUgdHJpZXMKdG8gPGEgaHJlZj0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDUvZWRpdGluZy5odG1sI2NvbnRlbnRlZGl0YWJsZSI+c3BlY2lmeTwvYT4KdGhlaXIgYmFzaWNzKSwgYW5kLCBtb3JlIGltcG9ydGFudGx5LCB0aGV5IHRlbmQgdG8gYmUgb25lIG9mIHRoZSBtb3JlCm9ic2N1cmUgYW5kIGJ1Z2d5IGFyZWFzIG9mIGJyb3dzZXIgZnVuY3Rpb25hbGl0eeKAlENvZGVNaXJyb3IsIGJ5IHVzaW5nCnRoaXMgZnVuY3Rpb25hbGl0eSBpbiBhIG5vbi10eXBpY2FsIHdheSwgd2FzIGNvbnN0YW50bHkgcnVubmluZyB1cAphZ2FpbnN0IGJyb3dzZXIgYnVncy4gV2ViS2l0IHdvdWxkbid0IHNob3cgYW4gZW1wdHkgbGluZSBhdCB0aGUgZW5kIG9mCnRoZSBkb2N1bWVudCwgYW5kIGluIHNvbWUgcmVsZWFzZXMgd291bGQgc3VkZGVubHkgZ2V0IHVuYmVhcmFibHkgc2xvdy4KRmlyZWZveCB3b3VsZCBzaG93IHRoZSBjdXJzb3IgaW4gdGhlIHdyb25nIHBsYWNlLiBJbnRlcm5ldCBFeHBsb3Jlcgp3b3VsZCBpbnNpc3Qgb24gbGlua2lmeWluZyBldmVyeXRoaW5nIHRoYXQgbG9va2VkIGxpa2UgYSBVUkwgb3IgZW1haWwKYWRkcmVzcywgYSBiZWhhdmlvdXIgdGhhdCBjYW4ndCBiZSB0dXJuZWQgb2ZmLiBTb21lIGJ1Z3MgSSBtYW5hZ2VkIHRvCndvcmsgYXJvdW5kICh3aGljaCB3YXMgb2Z0ZW4gYSBmcnVzdHJhdGluZywgcGFpbmZ1bCBwcm9jZXNzKSwgb3RoZXJzLApzdWNoIGFzIHRoZSBGaXJlZm94IGN1cnNvciBwbGFjZW1lbnQsIEkgZ2F2ZSB1cCBvbiwgYW5kIGhhZCB0byB0ZWxsCnVzZXIgYWZ0ZXIgdXNlciB0aGF0IHRoZXkgd2VyZSBrbm93biBwcm9ibGVtcywgYnV0IG5vdCBzb21ldGhpbmcgSQpjb3VsZCBoZWxwLjwvcD4KCjxwPkFsc28sIHRoZXJlIGlzIHRoZSBmYWN0IHRoYXQgPGNvZGU+ZGVzaWduTW9kZTwvY29kZT4gKHdoaWNoIHNlZW1lZAp0byBiZSBsZXNzIGJ1Z2d5IHRoYW4gPGNvZGU+Y29udGVudEVkaXRhYmxlPC9jb2RlPiBpbiBXZWJraXQgYW5kCkZpcmVmb3gsIGFuZCB3YXMgdGh1cyB1c2VkIGJ5IENvZGVNaXJyb3IgMSBpbiB0aG9zZSBicm93c2VycykgcmVxdWlyZXMKYSBmcmFtZS4gRnJhbWVzIGFyZSBhbm90aGVyIHRyaWNreSBhcmVhLiBJdCB0YWtlcyBzb21lIGVmZm9ydCB0bwpwcmV2ZW50IGdldHRpbmcgdHJpcHBlZCB1cCBieSBkb21haW4gcmVzdHJpY3Rpb25zLCB0aGV5IGRvbid0CmluaXRpYWxpemUgc3luY2hyb25vdXNseSwgYmVoYXZlIHN0cmFuZ2VseSBpbiByZXNwb25zZSB0byB0aGUgYmFjawpidXR0b24sIGFuZCwgb24gc2V2ZXJhbCBicm93c2VycywgY2FuJ3QgYmUgbW92ZWQgYXJvdW5kIHRoZSBET00Kd2l0aG91dCBoYXZpbmcgdGhlbSByZS1pbml0aWFsaXplLiBUaGV5IGRpZCBwcm92aWRlIGEgdmVyeSBuaWNlIHdheSB0bwpuYW1lc3BhY2UgdGhlIGxpYnJhcnksIHRob3VnaOKAlENvZGVNaXJyb3IgMSBjb3VsZCBmcmVlbHkgcG9sbHV0ZSB0aGUKbmFtZXNwYWNlIGluc2lkZSB0aGUgZnJhbWUuPC9wPgoKPHA+RmluYWxseSwgd29ya2luZyB3aXRoIGFuIGVkaXRhYmxlIGRvY3VtZW50IG1lYW5zIHdvcmtpbmcgd2l0aApzZWxlY3Rpb24gaW4gYXJiaXRyYXJ5IERPTSBzdHJ1Y3R1cmVzLiBJbnRlcm5ldCBFeHBsb3JlciAoOCBhbmQKYmVmb3JlKSBoYXMgYW4gdXR0ZXJseSBkaWZmZXJlbnQgKGFuZCBhd2t3YXJkKSBzZWxlY3Rpb24gQVBJIHRoYW4gYWxsCm9mIHRoZSBvdGhlciBicm93c2VycywgYW5kIGV2ZW4gYW1vbmcgdGhlIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbnMgb2YKPGNvZGU+ZG9jdW1lbnQuc2VsZWN0aW9uPC9jb2RlPiwgZGV0YWlscyBhYm91dCBob3cgZXhhY3RseSBhIHNlbGVjdGlvbgppcyByZXByZXNlbnRlZCB2YXJ5IHF1aXRlIGEgYml0LiBBZGQgdG8gdGhhdCB0aGUgZmFjdCB0aGF0IE9wZXJhJ3MKc2VsZWN0aW9uIHN1cHBvcnQgdGVuZGVkIHRvIGJlIHZlcnkgYnVnZ3kgdW50aWwgcmVjZW50bHksIGFuZCB5b3UgY2FuCmltYWdpbmUgd2h5IENvZGVNaXJyb3IgMSBjb250YWlucyA3MDAgbGluZXMgb2Ygc2VsZWN0aW9uLWhhbmRsaW5nCmNvZGUuPC9wPgoKPHA+QW5kIHRoYXQgYnJpbmdzIHVzIHRvIHRoZSBtYWluIGlzc3VlIHdpdGggdGhlIENvZGVNaXJyb3IgMQpjb2RlIGJhc2U6IFRoZSBwcm9wb3J0aW9uIG9mIGJyb3dzZXItYnVnLXdvcmthcm91bmRzIHRvIHJlYWwKYXBwbGljYXRpb24gY29kZSB3YXMgZ2V0dGluZyBkYW5nZXJvdXNseSBoaWdoLiBCeSBidWlsZGluZyBvbiB0b3Agb2YgYQpmZXcgZG9kZ3kgZmVhdHVyZXMsIEkgcHV0IHRoZSBzeXN0ZW0gaW4gYSB2dWxuZXJhYmxlIHBvc2l0aW9u4oCUYW55CmluY29tcGF0aWJpbGl0eSBhbmQgYnVnZ2luZXNzIGluIHRoZXNlIGZlYXR1cmVzLCBJIGhhZCB0byBwYXBlciBvdmVyCndpdGggbXkgb3duIGNvZGUuIE5vdCBvbmx5IGRpZCBJIGhhdmUgdG8gZG8gc29tZSBzZXJpb3VzIHN0dW50LXdvcmsgdG8KZ2V0IGl0IHRvIHdvcmsgb24gb2xkZXIgYnJvd3NlcnMgKGFzIGRldGFpbGVkIGluIHRoZQpwcmV2aW91cyA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvc3RvcnkuaHRtbCI+c3Rvcnk8L2E+KSwgdGhpbmdzCmFsc28ga2VwdCBicmVha2luZyBpbiBuZXdseSByZWxlYXNlZCB2ZXJzaW9ucywgcmVxdWlyaW5nIG1lIHRvIGNvbWUgdXAKd2l0aCA8ZW0+bmV3PC9lbT4gc2NhcnkgaGFja3MgaW4gb3JkZXIgdG8ga2VlcCB1cC4gVGhpcyB3YXMgc3RhcnRpbmcKdG8gbG9zZSBpdHMgYXBwZWFsLjwvcD4KCjxzZWN0aW9uIGlkPWFwcHJvYWNoPgogIDxoMj5HZW5lcmFsIEFwcHJvYWNoPC9oMj4KCjxwPldoYXQgQ29kZU1pcnJvciAyIGRvZXMgaXMgdHJ5IHRvIHNpZGVzdGVwIG1vc3Qgb2YgdGhlIGhhaXJ5IGhhY2tzCnRoYXQgY2FtZSB1cCBpbiB2ZXJzaW9uIDEuIEkgb3dlIGEgbG90IHRvIHRoZQo8YSBocmVmPSJodHRwOi8vYWNlLmFqYXgub3JnIj5BQ0U8L2E+IGVkaXRvciBmb3IgaW5zcGlyYXRpb24gb24gaG93IHRvCmFwcHJvYWNoIHRoaXMuPC9wPgoKPHA+SSBhYnNvbHV0ZWx5IGRpZCBub3Qgd2FudCB0byBiZSBjb21wbGV0ZWx5IHJlbGlhbnQgb24ga2V5IGV2ZW50cyB0bwpnZW5lcmF0ZSBteSBpbnB1dC4gRXZlcnkgSmF2YVNjcmlwdCBwcm9ncmFtbWVyIGtub3dzIHRoYXQga2V5IGV2ZW50CmluZm9ybWF0aW9uIGlzIGhvcnJpYmxlIGFuZCBpbmNvbXBsZXRlLiBTb21lIHBlb3BsZSAobW9zdCBhd2Vzb21lbHkKTWloYWkgQmF6b24gd2l0aCA8YSBocmVmPSJodHRwOi8veW1hY3Mub3JnIj5ZbWFjczwvYT4pIGhhdmUgYmVlbiBhYmxlCnRvIGJ1aWxkIG1vcmUgb3IgbGVzcyBmdW5jdGlvbmluZyBlZGl0b3JzIGJ5IGRpcmVjdGx5IHJlYWRpbmcga2V5CmV2ZW50cywgYnV0IGl0IHRha2VzIGEgbG90IG9mIHdvcmsgKHRoZSBraW5kIG9mIG5ldmVyLWVuZGluZywgZnJhZ2lsZQp3b3JrIEkgZGVzY3JpYmVkIGVhcmxpZXIpLCBhbmQgd2lsbCBuZXZlciBiZSBhYmxlIHRvIHByb3Blcmx5IHN1cHBvcnQKdGhpbmdzIGxpa2UgbXVsdGkta2V5c3Rva2UgaW50ZXJuYXRpb25hbCBjaGFyYWN0ZXIKaW5wdXQuIDxhIGhyZWY9IiNrZXltYXAiIGNsYXNzPSJ1cGRhdGUiPltzZWUgYmVsb3cgZm9yIGNhdmVhdF08L2E+PC9wPgoKPHA+U28gd2hhdCBJIGRvIGlzIGZvY3VzIGEgaGlkZGVuIHRleHRhcmVhLCBhbmQgbGV0IHRoZSBicm93c2VyCmJlbGlldmUgdGhhdCB0aGUgdXNlciBpcyB0eXBpbmcgaW50byB0aGF0LiBXaGF0IHdlIHNob3cgdG8gdGhlIHVzZXIgaXMKYSBET00gc3RydWN0dXJlIHdlIGJ1aWx0IHRvIHJlcHJlc2VudCBoaXMgZG9jdW1lbnQuIElmIHRoaXMgaXMgdXBkYXRlZApxdWlja2x5IGVub3VnaCwgYW5kIHNob3dzIHNvbWUga2luZCBvZiBiZWxpZXZhYmxlIGN1cnNvciwgaXQgZmVlbHMKbGlrZSBhIHJlYWwgdGV4dC1pbnB1dCBjb250cm9sLjwvcD4KCjxwPkFub3RoZXIgYmlnIHdpbiBpcyB0aGF0IHRoaXMgRE9NIHJlcHJlc2VudGF0aW9uIGRvZXMgbm90IGhhdmUgdG8Kc3BhbiB0aGUgd2hvbGUgZG9jdW1lbnQuIFNvbWUgQ29kZU1pcnJvciAxIHVzZXJzIGluc2lzdGVkIHRoYXQgdGhleQpuZWVkZWQgdG8gcHV0IGEgMzAgdGhvdXNhbmQgbGluZSBYTUwgZG9jdW1lbnQgaW50byBDb2RlTWlycm9yLiBQdXR0aW5nCmFsbCB0aGF0IGludG8gdGhlIERPTSB0YWtlcyBhIHdoaWxlLCBlc3BlY2lhbGx5IHNpbmNlLCBmb3Igc29tZQpyZWFzb24sIGFuIGVkaXRhYmxlIERPTSB0cmVlIGlzIHNsb3dlciB0aGFuIGEgbm9ybWFsIG9uZSBvbiBtb3N0CmJyb3dzZXJzLiBJZiB3ZSBoYXZlIGZ1bGwgY29udHJvbCBvdmVyIHdoYXQgd2Ugc2hvdywgd2UgbXVzdCBvbmx5CmVuc3VyZSB0aGF0IHRoZSB2aXNpYmxlIHBhcnQgb2YgdGhlIGRvY3VtZW50IGhhcyBiZWVuIGFkZGVkLCBhbmQgY2FuCmRvIHRoZSByZXN0IG9ubHkgd2hlbiBuZWVkZWQuIChGb3J0dW5hdGVseSwgdGhlIDxjb2RlPm9uc2Nyb2xsPC9jb2RlPgpldmVudCB3b3JrcyBhbG1vc3QgdGhlIHNhbWUgb24gYWxsIGJyb3dzZXJzLCBhbmQgbGVuZHMgaXRzZWxmIHdlbGwgdG8KZGlzcGxheWluZyB0aGluZ3Mgb25seSBhcyB0aGV5IGFyZSBzY3JvbGxlZCBpbnRvIHZpZXcuKTwvcD4KPC9zZWN0aW9uPgo8c2VjdGlvbiBpZD0iaW5wdXQiPgogIDxoMj5JbnB1dDwvaDI+Cgo8cD5BQ0UgdXNlcyBpdHMgaGlkZGVuIHRleHRhcmVhIG9ubHkgYXMgYSB0ZXh0IGlucHV0IHNoaW0sIGFuZCBkb2VzCmFsbCBjdXJzb3IgbW92ZW1lbnQgYW5kIHRoaW5ncyBsaWtlIHRleHQgZGVsZXRpb24gaXRzZWxmIGJ5IGRpcmVjdGx5CmhhbmRsaW5nIGtleSBldmVudHMuIENvZGVNaXJyb3IncyB3YXkgaXMgdG8gbGV0IHRoZSBicm93c2VyIGRvIGl0cwp0aGluZyBhcyBtdWNoIGFzIHBvc3NpYmxlLCBhbmQgbm90LCBmb3IgZXhhbXBsZSwgZGVmaW5lIGl0cyBvd24gc2V0IG9mCmtleSBiaW5kaW5ncy4gT25lIHdheSB0byBkbyB0aGlzIHdvdWxkIGhhdmUgYmVlbiB0byBoYXZlIHRoZSB3aG9sZQpkb2N1bWVudCBpbnNpZGUgdGhlIGhpZGRlbiB0ZXh0YXJlYSwgYW5kIGFmdGVyIGVhY2gga2V5IGV2ZW50IHVwZGF0ZQp0aGUgZGlzcGxheSBET00gdG8gcmVmbGVjdCB3aGF0J3MgaW4gdGhhdCB0ZXh0YXJlYS48L3A+Cgo8cD5UaGF0J2QgYmUgc2ltcGxlLCBidXQgaXQgaXMgbm90IHJlYWxpc3RpYy4gRm9yIGV2ZW4gbWVkaXVtLXNpemVkCmRvY3VtZW50IHRoZSBlZGl0b3Igd291bGQgYmUgY29uc3RhbnRseSBtdW5naW5nIGh1Z2Ugc3RyaW5ncywgYW5kIGdldAp0ZXJyaWJseSBzbG93LiBXaGF0IENvZGVNaXJyb3IgMiBkb2VzIGlzIHB1dCB0aGUgY3VycmVudCBzZWxlY3Rpb24sCmFsb25nIHdpdGggYW4gZXh0cmEgbGluZSBvbiB0aGUgdG9wIGFuZCBvbiB0aGUgYm90dG9tLCBpbnRvIHRoZQp0ZXh0YXJlYS48L3A+Cgo8cD5UaGlzIG1lYW5zIHRoYXQgdGhlIGFycm93IGtleXMgKGFuZCB0aGVpciBjdHJsLXZhcmlhdGlvbnMpLCBob21lLAplbmQsIGV0Y2V0ZXJhLCBkbyBub3QgaGF2ZSB0byBiZSBoYW5kbGVkIHNwZWNpYWxseS4gV2UganVzdCByZWFkIHRoZQpjdXJzb3IgcG9zaXRpb24gaW4gdGhlIHRleHRhcmVhLCBhbmQgdXBkYXRlIG91ciBjdXJzb3IgdG8gbWF0Y2ggaXQuCkFsc28sIGNvcHkgYW5kIHBhc3RlIHdvcmsgcHJldHR5IG11Y2ggZm9yIGZyZWUsIGFuZCBwZW9wbGUgZ2V0IHRoZWlyCm5hdGl2ZSBrZXkgYmluZGluZ3MsIHdpdGhvdXQgYW55IHNwZWNpYWwgd29yayBvbiBteSBwYXJ0LiBGb3IgZXhhbXBsZSwKSSBoYXZlIGVtYWNzIGtleSBiaW5kaW5ncyBjb25maWd1cmVkIGZvciBDaHJvbWUgYW5kIEZpcmVmb3guIFRoZXJlIGlzCm5vIHdheSBmb3IgYSBzY3JpcHQgdG8gZGV0ZWN0IHRoaXMuIDxhIGNsYXNzPSJ1cGRhdGUiCmhyZWY9IiNrZXltYXAiPltubyBsb25nZXIgdGhlIGNhc2VdPC9hPjwvcD4KCjxwPk9mIGNvdXJzZSwgc2luY2Ugb25seSBhIHNtYWxsIHBhcnQgb2YgdGhlIGRvY3VtZW50IHNpdHMgaW4gdGhlCnRleHRhcmVhLCBrZXlzIGxpa2UgcGFnZSB1cCBhbmQgY3RybC1lbmQgd29uJ3QgZG8gdGhlIHJpZ2h0IHRoaW5nLgpDb2RlTWlycm9yIGlzIGNhdGNoaW5nIHRob3NlIGV2ZW50cyBhbmQgaGFuZGxpbmcgdGhlbSBpdHNlbGYuPC9wPgo8L3NlY3Rpb24+CjxzZWN0aW9uIGlkPSJzZWxlY3Rpb24iPgogIDxoMj5TZWxlY3Rpb248L2gyPgoKPHA+R2V0dGluZyBhbmQgc2V0dGluZyB0aGUgc2VsZWN0aW9uIHJhbmdlIG9mIGEgdGV4dGFyZWEgaW4gbW9kZXJuCmJyb3dzZXJzIGlzIHRyaXZpYWzigJR5b3UganVzdCB1c2UgdGhlIDxjb2RlPnNlbGVjdGlvblN0YXJ0PC9jb2RlPgphbmQgPGNvZGU+c2VsZWN0aW9uRW5kPC9jb2RlPiBwcm9wZXJ0aWVzLiBPbiBJRSB5b3UgaGF2ZSB0byBkbyBzb21lCmluc2FuZSBzdHVmZiB3aXRoIHRlbXBvcmFyeSByYW5nZXMgYW5kIGNvbXBlbnNhdGluZyBmb3IgdGhlIGZhY3QgdGhhdAptb3ZpbmcgdGhlIHNlbGVjdGlvbiBieSBhICdjaGFyYWN0ZXInIHdpbGwgdHJlYXQgXHJcbiBhcyBhIHNpbmdsZQpjaGFyYWN0ZXIsIGJ1dCBldmVuIHRoZXJlIGl0IGlzIHBvc3NpYmxlIHRvIGJ1aWxkIGZ1bmN0aW9ucyB0aGF0CnJlbGlhYmx5IHNldCBhbmQgZ2V0IHRoZSBzZWxlY3Rpb24gcmFuZ2UuPC9wPgoKPHA+QnV0IGNvbnNpZGVyIHRoaXMgdHlwaWNhbCBjYXNlOiBXaGVuIEknbSBzb21ld2hlcmUgaW4gbXkgZG9jdW1lbnQsCnByZXNzIHNoaWZ0LCBhbmQgcHJlc3MgdGhlIHVwIGFycm93LCBzb21ldGhpbmcgZ2V0cyBzZWxlY3RlZC4gVGhlbiwgaWYKSSwgc3RpbGwgaG9sZGluZyBzaGlmdCwgcHJlc3MgdGhlIHVwIGFycm93IGFnYWluLCB0aGUgdG9wIG9mIG15CnNlbGVjdGlvbiBpcyBhZGp1c3RlZC4gVGhlIHNlbGVjdGlvbiByZW1lbWJlcnMgd2hlcmUgaXRzIDxlbT5oZWFkPC9lbT4KYW5kIGl0cyA8ZW0+YW5jaG9yPC9lbT4gYXJlLCBhbmQgbW92ZXMgdGhlIGhlYWQgd2hlbiB3ZSBzaGlmdC1tb3ZlLgpUaGlzIGlzIGEgZ2VuZXJhbGx5IGFjY2VwdGVkIHByb3BlcnR5IG9mIHNlbGVjdGlvbnMsIGFuZCBkb25lIHJpZ2h0IGJ5CmV2ZXJ5IGVkaXRpbmcgY29tcG9uZW50IGJ1aWx0IGluIHRoZSBwYXN0IHR3ZW50eSB5ZWFycy48L3A+Cgo8cD5CdXQgbm90IHNvbWV0aGluZyB0aGF0IHRoZSBicm93c2VyIHNlbGVjdGlvbiBBUElzIGV4cG9zZS48L3A+Cgo8cD5HcmVhdC4gU28gd2hlbiBzb21lb25lIGNyZWF0ZXMgYW4gJ3Vwc2lkZS1kb3duJyBzZWxlY3Rpb24sIHRoZSBuZXh0CnRpbWUgQ29kZU1pcnJvciBoYXMgdG8gdXBkYXRlIHRoZSB0ZXh0YXJlYSwgaXQnbGwgcmUtY3JlYXRlIHRoZQpzZWxlY3Rpb24gYXMgYW4gJ3Vwc2lkZS11cCcgc2VsZWN0aW9uLCB3aXRoIHRoZSBhbmNob3IgYXQgdGhlIHRvcCwgYW5kCnRoZSBuZXh0IGN1cnNvciBtb3Rpb24gd2lsbCBiZWhhdmUgaW4gYW4gdW5leHBlY3RlZCB3YXnigJRvdXIgc2Vjb25kCnVwLWFycm93IHByZXNzIGluIHRoZSBleGFtcGxlIGFib3ZlIHdpbGwgbm90IGRvIGFueXRoaW5nLCBzaW5jZSBpdCBpcwppbnRlcnByZXRlZCBpbiBleGFjdGx5IHRoZSBzYW1lIHdheSBhcyB0aGUgZmlyc3QuPC9wPgoKPHA+Tm8gcHJvYmxlbS4gV2UnbGwganVzdCwgZWhtLCBkZXRlY3QgdGhhdCB0aGUgc2VsZWN0aW9uIGlzCnVwc2lkZS1kb3duICh5b3UgY2FuIHRlbGwgYnkgdGhlIHdheSBpdCB3YXMgY3JlYXRlZCksIGFuZCB0aGVuLCB3aGVuCmFuIHVwc2lkZS1kb3duIHNlbGVjdGlvbiBpcyBwcmVzZW50LCBhbmQgYSBjdXJzb3ItbW92aW5nIGtleSBpcwpwcmVzc2VkIGluIGNvbWJpbmF0aW9uIHdpdGggc2hpZnQsIHdlIHF1aWNrbHkgY29sbGFwc2UgdGhlIHNlbGVjdGlvbgppbiB0aGUgdGV4dGFyZWEgdG8gaXRzIHN0YXJ0LCBhbGxvdyB0aGUga2V5IHRvIHRha2UgZWZmZWN0LCBhbmQgdGhlbgpjb21iaW5lIGl0cyBuZXcgaGVhZCB3aXRoIGl0cyBvbGQgYW5jaG9yIHRvIGdldCB0aGUgPGVtPnJlYWw8L2VtPgpzZWxlY3Rpb24uPC9wPgoKPHA+SW4gc2hvcnQsIHNjYXJ5IGhhY2tzIGNvdWxkIG5vdCBiZSBhdm9pZGVkIGVudGlyZWx5IGluIENvZGVNaXJyb3IKMi48L3A+Cgo8cD5BbmQsIHRoZSBvYnNlcnZhbnQgcmVhZGVyIG1pZ2h0IGFzaywgaG93IGRvIHlvdSBldmVuIGtub3cgdGhhdCBhCmtleSBjb21ibyBpcyBhIGN1cnNvci1tb3ZpbmcgY29tYm8sIGlmIHlvdSBjbGFpbSB5b3Ugc3VwcG9ydCBhbnkKbmF0aXZlIGtleSBiaW5kaW5ncz8gV2VsbCwgd2UgZG9uJ3QsIGJ1dCB3ZSBjYW4gbGVhcm4uIFRoZSBlZGl0b3IKa2VlcHMgYSBzZXQga25vd24gY3Vyc29yLW1vdmVtZW50IGNvbWJvcyAoaW5pdGlhbGl6ZWQgdG8gdGhlCnByZWRpY3RhYmxlIGRlZmF1bHRzKSwgYW5kIHVwZGF0ZXMgdGhpcyBzZXQgd2hlbiBpdCBvYnNlcnZlcyB0aGF0CnByZXNzaW5nIGEgY2VydGFpbiBrZXkgaGFkIChvbmx5KSB0aGUgZWZmZWN0IG9mIG1vdmluZyB0aGUgY3Vyc29yLgpUaGlzLCBvZiBjb3Vyc2UsIGRvZXNuJ3Qgd29yayBpZiB0aGUgZmlyc3QgdGltZSB0aGUga2V5IGlzIHVzZWQgd2FzCmZvciBleHRlbmRpbmcgYW4gaW52ZXJ0ZWQgc2VsZWN0aW9uLCBidXQgaXQgd29ya3MgbW9zdCBvZiB0aGUKdGltZS48L3A+Cjwvc2VjdGlvbj4KPHNlY3Rpb24gaWQ9InVwZGF0ZSI+CiAgPGgyPkludGVsbGlnZW50IFVwZGF0aW5nPC9oMj4KCjxwPk9uZSB0aGluZyB0aGF0IGFsd2F5cyBjb21lcyB1cCB3aGVuIHlvdSBoYXZlIGEgY29tcGxpY2F0ZWQgaW50ZXJuYWwKc3RhdGUgdGhhdCdzIHJlZmxlY3RlZCBpbiBzb21lIHVzZXItdmlzaWJsZSBleHRlcm5hbCByZXByZXNlbnRhdGlvbgooaW4gdGhpcyBjYXNlLCB0aGUgZGlzcGxheWVkIGNvZGUgYW5kIHRoZSB0ZXh0YXJlYSdzIGNvbnRlbnQpIGlzCmtlZXBpbmcgdGhlIHR3byBpbiBzeW5jLiBUaGUgbmFpdmUgd2F5IGlzIHRvIGp1c3QgdXBkYXRlIHRoZSBkaXNwbGF5CmV2ZXJ5IHRpbWUgeW91IGNoYW5nZSB5b3VyIHN0YXRlLCBidXQgdGhpcyBpcyBub3Qgb25seSBlcnJvciBwcm9uZQooeW91J2xsIGZvcmdldCksIGl0IGFsc28gZWFzaWx5IGxlYWRzIHRvIGR1cGxpY2F0ZSB3b3JrIG9uIGJpZywKY29tcG9zaXRlIG9wZXJhdGlvbnMuIFRoZW4geW91IHN0YXJ0IHBhc3NpbmcgYXJvdW5kIGZsYWdzIGluZGljYXRpbmcKd2hldGhlciB0aGUgZGlzcGxheSBzaG91bGQgYmUgdXBkYXRlZCBpbiBhbiBhdHRlbXB0IHRvIGJlIGVmZmljaWVudAphZ2FpbiBhbmQsIHdlbGwsIGF0IHRoYXQgcG9pbnQgeW91IG1pZ2h0IGFzIHdlbGwgZ2l2ZSB1cCBjb21wbGV0ZWx5LjwvcD4KCjxwPkkgZGlkIGdvIGRvd24gdGhhdCByb2FkLCBidXQgdGhlbiBzd2l0Y2hlZCB0byBhIG11Y2ggc2ltcGxlciBtb2RlbDoKc2ltcGx5IGtlZXAgdHJhY2sgb2YgYWxsIHRoZSB0aGluZ3MgdGhhdCBoYXZlIGJlZW4gY2hhbmdlZCBkdXJpbmcgYW4KYWN0aW9uLCBhbmQgdGhlbiwgb25seSBhdCB0aGUgZW5kLCB1c2UgdGhpcyBpbmZvcm1hdGlvbiB0byB1cGRhdGUgdGhlCnVzZXItdmlzaWJsZSBkaXNwbGF5LjwvcD4KCjxwPkNvZGVNaXJyb3IgdXNlcyBhIGNvbmNlcHQgb2YgPGVtPm9wZXJhdGlvbnM8L2VtPiwgd2hpY2ggc3RhcnQgYnkKY2FsbGluZyBhIHNwZWNpZmljIHNldC11cCBmdW5jdGlvbiB0aGF0IGNsZWFycyB0aGUgc3RhdGUgYW5kIGVuZCBieQpjYWxsaW5nIGFub3RoZXIgZnVuY3Rpb24gdGhhdCByZWFkcyB0aGlzIHN0YXRlIGFuZCBkb2VzIHRoZSByZXF1aXJlZAp1cGRhdGluZy4gTW9zdCBldmVudCBoYW5kbGVycywgYW5kIGFsbCB0aGUgdXNlci12aXNpYmxlIG1ldGhvZHMgdGhhdApjaGFuZ2Ugc3RhdGUgYXJlIHdyYXBwZWQgbGlrZSB0aGlzLiBUaGVyZSdzIGEgbWV0aG9kCmNhbGxlZCA8Y29kZT5vcGVyYXRpb248L2NvZGU+IHRoYXQgYWNjZXB0cyBhIGZ1bmN0aW9uLCBhbmQgcmV0dXJucwphbm90aGVyIGZ1bmN0aW9uIHRoYXQgd3JhcHMgdGhlIGdpdmVuIGZ1bmN0aW9uIGFzIGFuIG9wZXJhdGlvbi48L3A+Cgo8cD5JdCdzIHRyaXZpYWwgdG8gZXh0ZW5kIHRoaXMgKGFzIENvZGVNaXJyb3IgZG9lcykgdG8gZGV0ZWN0IG5lc3RpbmcsCmFuZCwgd2hlbiBhbiBvcGVyYXRpb24gaXMgc3RhcnRlZCBpbnNpZGUgYW4gb3BlcmF0aW9uLCBzaW1wbHkKaW5jcmVtZW50IHRoZSBuZXN0aW5nIGNvdW50LCBhbmQgb25seSBkbyB0aGUgdXBkYXRpbmcgd2hlbiB0aGlzIGNvdW50CnJlYWNoZXMgemVybyBhZ2Fpbi48L3A+Cgo8cD5JZiB3ZSBoYXZlIGEgc2V0IG9mIGNoYW5nZWQgcmFuZ2VzIGFuZCBrbm93IHRoZSBjdXJyZW50bHkgc2hvd24KcmFuZ2UsIHdlIGNhbiAod2l0aCBzb21lIGF3a3dhcmQgY29kZSB0byBkZWFsIHdpdGggdGhlIGZhY3QgdGhhdApjaGFuZ2VzIGNhbiBhZGQgYW5kIHJlbW92ZSBsaW5lcywgc28gd2UncmUgZGVhbGluZyB3aXRoIGEgY2hhbmdpbmcKY29vcmRpbmF0ZSBzeXN0ZW0pIGNvbnN0cnVjdCBhIG1hcCBvZiB0aGUgcmFuZ2VzIHRoYXQgd2VyZSBsZWZ0CmludGFjdC4gV2UgY2FuIHRoZW4gY29tcGFyZSB0aGlzIG1hcCB3aXRoIHRoZSBwYXJ0IG9mIHRoZSBkb2N1bWVudAp0aGF0J3MgY3VycmVudGx5IHZpc2libGUgKGJhc2VkIG9uIHNjcm9sbCBvZmZzZXQgYW5kIGVkaXRvciBoZWlnaHQpIHRvCmRldGVybWluZSB3aGV0aGVyIHNvbWV0aGluZyBuZWVkcyB0byBiZSB1cGRhdGVkLjwvcD4KCjxwPkNvZGVNaXJyb3IgdXNlcyB0d28gdXBkYXRlIGFsZ29yaXRobXPigJRhIGZ1bGwgcmVmcmVzaCwgd2hlcmUgaXQganVzdApkaXNjYXJkcyB0aGUgd2hvbGUgcGFydCBvZiB0aGUgRE9NIHRoYXQgY29udGFpbnMgdGhlIGVkaXRlZCB0ZXh0IGFuZApyZWJ1aWxkcyBpdCwgYW5kIGEgcGF0Y2ggYWxnb3JpdGhtLCB3aGVyZSBpdCB1c2VzIHRoZSBpbmZvcm1hdGlvbgphYm91dCBjaGFuZ2VkIGFuZCBpbnRhY3QgcmFuZ2VzIHRvIHVwZGF0ZSBvbmx5IHRoZSBvdXQtb2YtZGF0ZSBwYXJ0cwpvZiB0aGUgRE9NLiBXaGVuIG1vcmUgdGhhbiAzMCBwZXJjZW50ICh3aGljaCBpcyB0aGUgY3VycmVudCBoZXVyaXN0aWMsCm1pZ2h0IGNoYW5nZSkgb2YgdGhlIGxpbmVzIG5lZWQgdG8gYmUgdXBkYXRlZCwgdGhlIGZ1bGwgcmVmcmVzaCBpcwpjaG9zZW4gKHNpbmNlIGl0J3MgZmFzdGVyIHRvIGRvIHRoYW4gcGFpbnN0YWtpbmdseSBmaW5kaW5nIGFuZAp1cGRhdGluZyBhbGwgdGhlIGNoYW5nZWQgbGluZXMpLCBpbiB0aGUgb3RoZXIgY2FzZSBpdCBkb2VzIHRoZQpwYXRjaGluZyAoc28gdGhhdCwgaWYgeW91IHNjcm9sbCBhIGxpbmUgb3Igc2VsZWN0IGFub3RoZXIgY2hhcmFjdGVyLAp0aGUgd2hvbGUgc2NyZWVuIGRvZXNuJ3QgaGF2ZSB0byBiZQpyZS1yZW5kZXJlZCkuIDxzcGFuIGNsYXNzPSJ1cGRhdGUiPlt0aGUgZnVsbC1yZWZyZXNoCmFsZ29yaXRobSB3YXMgZHJvcHBlZCwgaXQgd2Fzbid0IHJlYWxseSBmYXN0ZXIgdGhhbiB0aGUgcGF0Y2hpbmcKb25lXTwvc3Bhbj48L3A+Cgo8cD5BbGwgdXBkYXRpbmcgdXNlcyA8Y29kZT5pbm5lckhUTUw8L2NvZGU+IHJhdGhlciB0aGFuIGRpcmVjdCBET00KbWFuaXB1bGF0aW9uLCBzaW5jZSB0aGF0IHN0aWxsIHNlZW1zIHRvIGJlIGJ5IGZhciB0aGUgZmFzdGVzdCB3YXkgdG8KYnVpbGQgZG9jdW1lbnRzLiBUaGVyZSdzIGEgcGVyLWxpbmUgZnVuY3Rpb24gdGhhdCBjb21iaW5lcyB0aGUKaGlnaGxpZ2h0aW5nLCA8YSBocmVmPSJtYW51YWwuaHRtbCNtYXJrVGV4dCI+bWFya2luZzwvYT4sIGFuZApzZWxlY3Rpb24gaW5mbyBmb3IgdGhhdCBsaW5lIGludG8gYSBzbmlwcGV0IG9mIEhUTUwuIFRoZSBwYXRjaCB1cGRhdGVyCnVzZXMgdGhpcyB0byByZXNldCBpbmRpdmlkdWFsIGxpbmVzLCB0aGUgcmVmcmVzaCB1cGRhdGVyIGJ1aWxkcyBhbgpIVE1MIGNodW5rIGZvciB0aGUgd2hvbGUgdmlzaWJsZSBkb2N1bWVudCBhdCBvbmNlLCBhbmQgdGhlbiB1c2VzIGEKc2luZ2xlIDxjb2RlPmlubmVySFRNTDwvY29kZT4gdXBkYXRlIHRvIGRvIHRoZSByZWZyZXNoLjwvcD4KPC9zZWN0aW9uPgo8c2VjdGlvbiBpZD0icGFyc2UiPgogIDxoMj5QYXJzZXJzIGNhbiBiZSBTaW1wbGU8L2gyPgoKPHA+V2hlbiBJIHdyb3RlIENvZGVNaXJyb3IgMSwgSQp0aG91Z2h0IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9zdG9yeS5odG1sI3BhcnNlciI+aW50ZXJydXB0YWJsZQpwYXJzZXJzPC9hPiB3ZXJlIGEgaHVnZWx5IHNjYXJ5IGFuZCBjb21wbGljYXRlZCB0aGluZywgYW5kIEkgdXNlZCBhCmJ1bmNoIG9mIGhlYXZ5d2VpZ2h0IGFic3RyYWN0aW9ucyB0byBrZWVwIHRoaXMgc3VwcG9zZWQgY29tcGxleGl0eQp1bmRlciBjb250cm9sOiBwYXJzZXJzCndlcmUgPGEgaHJlZj0iaHR0cDovL2JvYi5weXRob25tYWMub3JnL2FyY2hpdmVzLzIwMDUvMDcvMDYvaXRlcmF0aW9uLWluLWphdmFzY3JpcHQvIj5pdGVyYXRvcnM8L2E+CnRoYXQgY29uc3VtZWQgaW5wdXQgZnJvbSBhbm90aGVyIGl0ZXJhdG9yLCBhbmQgdXNlZCBmdW5ueQpjbG9zdXJlLXJlc2V0dGluZyB0cmlja3MgdG8gY29weSBhbmQgcmVzdW1lIHRoZW1zZWx2ZXMuPC9wPgoKPHA+VGhpcyBtYWRlIGZvciBhIHJhdGhlciBuaWNlIHN5c3RlbSwgaW4gdGhhdCBwYXJzZXJzIGZvcm1lZCBzdHJpY3RseQpzZXBhcmF0ZSBtb2R1bGVzLCBhbmQgY291bGQgYmUgY29tcG9zZWQgaW4gcHJlZGljdGFibGUgd2F5cy4KVW5mb3J0dW5hdGVseSwgaXQgd2FzIHF1aXRlIHNsb3cgKHN0YWNraW5nIHRocmVlIG9yIGZvdXIgaXRlcmF0b3JzIG9uCnRvcCBvZiBlYWNoIG90aGVyKSwgYW5kIGV4dHJlbWVseSBpbnRpbWlkYXRpbmcgdG8gcGVvcGxlIG5vdCB1c2VkIHRvIGEKZnVuY3Rpb25hbCBwcm9ncmFtbWluZyBzdHlsZS48L3A+Cgo8cD5XaXRoIGEgZmV3IHNtYWxsIGNoYW5nZXMsIGhvd2V2ZXIsIHdlIGNhbiBrZWVwIGFsbCB0aG9zZQphZHZhbnRhZ2VzLCBidXQgc2ltcGxpZnkgdGhlIEFQSSBhbmQgbWFrZSB0aGUgd2hvbGUgdGhpbmcgbGVzcwppbmRpcmVjdCBhbmQgaW5lZmZpY2llbnQuIENvZGVNaXJyb3IKMidzIDxhIGhyZWY9Im1hbnVhbC5odG1sI21vZGVhcGkiPm1vZGUgQVBJPC9hPiB1c2VzIGV4cGxpY2l0IHN0YXRlCm9iamVjdHMsIGFuZCBtYWtlcyB0aGUgcGFyc2VyL3Rva2VuaXplciBhIGZ1bmN0aW9uIHRoYXQgc2ltcGx5IHRha2VzIGEKc3RhdGUgYW5kIGEgY2hhcmFjdGVyIHN0cmVhbSBhYnN0cmFjdGlvbiwgYWR2YW5jZXMgdGhlIHN0cmVhbSBvbmUKdG9rZW4sIGFuZCByZXR1cm5zIHRoZSB3YXkgdGhlIHRva2VuIHNob3VsZCBiZSBzdHlsZWQuIFRoaXMgc3RhdGUgbWF5CmJlIGNvcGllZCwgb3B0aW9uYWxseSBpbiBhIG1vZGUtZGVmaW5lZCB3YXksIGluIG9yZGVyIHRvIGJlIGFibGUgdG8KY29udGludWUgYSBwYXJzZSBhdCBhIGdpdmVuIHBvaW50LiBFdmVuIHNvbWVvbmUgd2hvJ3MgbmV2ZXIgdG91Y2hlZCBhCmxhbWJkYSBpbiBoaXMgbGlmZSBjYW4gdW5kZXJzdGFuZCB0aGlzIGFwcHJvYWNoLiBBZGRpdGlvbmFsbHksIGZhcgpmZXdlciBvYmplY3RzIGFyZSBhbGxvY2F0ZWQgaW4gdGhlIGNvdXJzZSBvZiBwYXJzaW5nIG5vdy48L3A+Cgo8cD5UaGUgYmlnZ2VzdCBzcGVlZHVwIGNvbWVzIGZyb20gdGhlIGZhY3QgdGhhdCB0aGUgcGFyc2luZyBubyBsb25nZXIKaGFzIHRvIHRvdWNoIHRoZSBET00gdGhvdWdoLiBJbiBDb2RlTWlycm9yIDEsIG9uIGFuIG9sZGVyIGJyb3dzZXIsIHlvdQpjb3VsZCA8ZW0+c2VlPC9lbT4gdGhlIHBhcnNlciB3b3JrIGl0cyB3YXkgdGhyb3VnaCB0aGUgZG9jdW1lbnQsCm1hbmFnaW5nIHNvbWUgdHdlbnR5IGxpbmVzIGluIGVhY2ggNTAtbWlsbGlzZWNvbmQgdGltZSBzbGljZSBpdCBnb3QuIEl0CndhcyByZWFkaW5nIGl0cyBpbnB1dCBmcm9tIHRoZSBET00sIGFuZCB1cGRhdGluZyB0aGUgRE9NIGFzIGl0IHdlbnQKYWxvbmcsIHdoaWNoIGFueSBleHBlcmllbmNlZCBKYXZhU2NyaXB0IHByb2dyYW1tZXIgd2lsbCBpbW1lZGlhdGVseQpzcG90IGFzIGEgcmVjaXBlIGZvciBzbG93bmVzcy4gSW4gQ29kZU1pcnJvciAyLCB0aGUgcGFyc2VyIHVzdWFsbHkKZmluaXNoZXMgdGhlIHdob2xlIGRvY3VtZW50IGluIGEgc2luZ2xlIDEwMC1taWxsaXNlY29uZCB0aW1lIHNsaWNl4oCUaXQKbWFuYWdlcyBzb21lIDE1MDAgbGluZXMgZHVyaW5nIHRoYXQgdGltZSBvbiBDaHJvbWUuIEFsbCBpdCBoYXMgdG8gZG8KaXMgbXVuZ2Ugc3RyaW5ncywgc28gdGhlcmUgaXMgbm8gcmVhbCByZWFzb24gZm9yIGl0IHRvIGJlIHNsb3cKYW55bW9yZS48L3A+Cjwvc2VjdGlvbj4KPHNlY3Rpb24gaWQ9InN1bW1hcnkiPgogIDxoMj5XaGF0IEdpdmVzPzwvaDI+Cgo8cD5HaXZlbiBhbGwgdGhpcywgd2hhdCBjYW4geW91IGV4cGVjdCBmcm9tIENvZGVNaXJyb3IgMj88L3A+Cgo8dWw+Cgo8bGk+PHN0cm9uZz5TbWFsbC48L3N0cm9uZz4gdGhlIGJhc2UgbGlicmFyeSBpcwpzb21lIDxzcGFuIGNsYXNzPSJ1cGRhdGUiPjQ1azwvc3Bhbj4gd2hlbiBtaW5pZmllZApub3csIDxzcGFuIGNsYXNzPSJ1cGRhdGUiPjE3azwvc3Bhbj4gd2hlbiBnemlwcGVkLiBJdCdzIHNtYWxsZXIgdGhhbgppdHMgb3duIGxvZ28uPC9saT4KCjxsaT48c3Ryb25nPkxpZ2h0d2VpZ2h0Ljwvc3Ryb25nPiBDb2RlTWlycm9yIDIgaW5pdGlhbGl6ZXMgdmVyeQpxdWlja2x5LCBhbmQgZG9lcyBhbG1vc3Qgbm8gd29yayB3aGVuIGl0IGlzIG5vdCBmb2N1c2VkLiBUaGlzIG1lYW5zCnlvdSBjYW4gdHJlYXQgaXQgYWxtb3N0IGxpa2UgYSB0ZXh0YXJlYSwgaGF2ZSBtdWx0aXBsZSBpbnN0YW5jZXMgb24gYQpwYWdlIHdpdGhvdXQgdHJvdWJsZS48L2xpPgoKPGxpPjxzdHJvbmc+SHVnZSBkb2N1bWVudCBzdXBwb3J0Ljwvc3Ryb25nPiBTaW5jZSBoaWdobGlnaHRpbmcgaXMKcmVhbGx5IGZhc3QsIGFuZCBubyBET00gc3RydWN0dXJlIGlzIGJlaW5nIGJ1aWx0IGZvciBub24tdmlzaWJsZQpjb250ZW50LCB5b3UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCBsb2NraW5nIHVwIHlvdXIgYnJvd3NlciB3aGVuIGEKdXNlciBlbnRlcnMgYSBtZWdhYnl0ZS1zaXplZCBkb2N1bWVudC48L2xpPgoKPGxpPjxzdHJvbmc+RXh0ZW5kZWQgQVBJLjwvc3Ryb25nPiBTb21lIHRoaW5ncyBrZXB0IGNvbWluZyB1cCBpbiB0aGUKbWFpbGluZyBsaXN0LCBzdWNoIGFzIG1hcmtpbmcgcGllY2VzIG9mIHRleHQgb3IgbGluZXMsIHdoaWNoIHdlcmUKZXh0cmVtZWx5IGhhcmQgdG8gZG8gd2l0aCBDb2RlTWlycm9yIDEuIFRoZSBuZXcgdmVyc2lvbiBoYXMgcHJvcGVyCnN1cHBvcnQgZm9yIHRoZXNlIGJ1aWx0IGluLjwvbGk+Cgo8bGk+PHN0cm9uZz5UYWIgc3VwcG9ydC48L3N0cm9uZz4gVGFicyBpbnNpZGUgZWRpdGFibGUgZG9jdW1lbnRzIHdlcmUsCmZvciBzb21lIHJlYXNvbiwgYSBuby1nby4gQXQgbGVhc3Qgc2l4IGRpZmZlcmVudCBwZW9wbGUgYW5ub3VuY2VkIHRoZXkKd2VyZSBnb2luZyB0byBhZGQgdGFiIHN1cHBvcnQgdG8gQ29kZU1pcnJvciAxLCBub25lIHN1cnZpdmVkIChJIG1lYW4sCm5vbmUgZGVsaXZlcmVkIGEgd29ya2luZyB2ZXJzaW9uKS4gQ29kZU1pcnJvciAyIG5vIGxvbmdlciByZW1vdmVzIHRhYnMKZnJvbSB5b3VyIGRvY3VtZW50LjwvbGk+Cgo8bGk+PHN0cm9uZz5TYW5lIHN0eWxpbmcuPC9zdHJvbmc+IDxjb2RlPmlmcmFtZTwvY29kZT4gbm9kZXMgYXJlbid0CnJlYWxseSBrbm93biBmb3IgcmVzcGVjdGluZyBkb2N1bWVudCBmbG93LiBOb3cgdGhhdCBhbiBlZGl0b3IgaW5zdGFuY2UKaXMgYSBwbGFpbiA8Y29kZT5kaXY8L2NvZGU+IGVsZW1lbnQsIGl0IGlzIG11Y2ggZWFzaWVyIHRvIHNpemUgaXQgdG8KZml0IHRoZSBzdXJyb3VuZGluZyBlbGVtZW50cy4gWW91IGRvbid0IGV2ZW4gaGF2ZSB0byBtYWtlIGl0IHNjcm9sbCBpZgp5b3UgZG8gbm90IDxhIGhyZWY9Ii4uL2RlbW8vcmVzaXplLmh0bWwiPndhbnQgdG88L2E+LjwvbGk+Cgo8L3VsPgoKPHA+T24gdGhlIGRvd25zaWRlLCBhIENvZGVNaXJyb3IgMiBpbnN0YW5jZSBpcyA8ZW0+bm90PC9lbT4gYSBuYXRpdmUKZWRpdGFibGUgY29tcG9uZW50LiBUaG91Z2ggaXQgZG9lcyBpdHMgYmVzdCB0byBlbXVsYXRlIHN1Y2ggYQpjb21wb25lbnQgYXMgbXVjaCBhcyBwb3NzaWJsZSwgdGhlcmUgaXMgZnVuY3Rpb25hbGl0eSB0aGF0IGJyb3dzZXJzCmp1c3QgZG8gbm90IGFsbG93IHVzIHRvIGhvb2sgaW50by4gRG9pbmcgc2VsZWN0LWFsbCBmcm9tIHRoZSBjb250ZXh0Cm1lbnUsIGZvciBleGFtcGxlLCBpcyBub3QgY3VycmVudGx5IGRldGVjdGVkIGJ5IENvZGVNaXJyb3IuPC9wPgoKPHAgaWQ9ImNoYW5nZXMiIHN0eWxlPSJtYXJnaW4tdG9wOiAyZW07Ij48c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6CmJvbGQiPltVcGRhdGVzIGZyb20gTm92ZW1iZXIgMTN0aCAyMDExXTwvc3Bhbj4gUmVjZW50bHksIEkndmUgbWFkZQpzb21lIGNoYW5nZXMgdG8gdGhlIGNvZGViYXNlIHRoYXQgY2F1c2Ugc29tZSBvZiB0aGUgdGV4dCBhYm92ZSB0byBubwpsb25nZXIgYmUgY3VycmVudC4gSSd2ZSBsZWZ0IHRoZSB0ZXh0IGludGFjdCwgYnV0IGFkZGVkIG1hcmtlcnMgYXQgdGhlCnBhc3NhZ2VzIHRoYXQgYXJlIG5vdyBpbmFjY3VyYXRlLiBUaGUgbmV3IHNpdHVhdGlvbiBpcyBkZXNjcmliZWQKYmVsb3cuPC9wPgo8L3NlY3Rpb24+CjxzZWN0aW9uIGlkPSJidHJlZSI+CiAgPGgyPkNvbnRlbnQgUmVwcmVzZW50YXRpb248L2gyPgoKPHA+VGhlIG9yaWdpbmFsIGltcGxlbWVudGF0aW9uIG9mIENvZGVNaXJyb3IgMiByZXByZXNlbnRlZCB0aGUKZG9jdW1lbnQgYXMgYSBmbGF0IGFycmF5IG9mIGxpbmUgb2JqZWN0cy4gVGhpcyB3b3JrZWQgd2VsbOKAlHNwbGljaW5nCmFycmF5cyB3aWxsIHJlcXVpcmUgdGhlIHBhcnQgb2YgdGhlIGFycmF5IGFmdGVyIHRoZSBzcGxpY2UgdG8gYmUKbW92ZWQsIGJ1dCB0aGlzIGlzIGJhc2ljYWxseSBqdXN0IGEgc2ltcGxlIDxjb2RlPm1lbW1vdmU8L2NvZGU+IG9mIGEKYnVuY2ggb2YgcG9pbnRlcnMsIHNvIGl0IGlzIGNoZWFwIGV2ZW4gZm9yIGh1Z2UgZG9jdW1lbnRzLjwvcD4KCjxwPkhvd2V2ZXIsIEkgcmVjZW50bHkgYWRkZWQgbGluZSB3cmFwcGluZyBhbmQgY29kZSBmb2xkaW5nIChsaW5lCmNvbGxhcHNpbmcsIGJhc2ljYWxseSkuIE9uY2UgbGluZXMgc3RhcnQgdGFraW5nIHVwIGEgbm9uLWNvbnN0YW50CmFtb3VudCBvZiB2ZXJ0aWNhbCBzcGFjZSwgbG9va2luZyB1cCBhIGxpbmUgYnkgdmVydGljYWwgcG9zaXRpb24KKHdoaWNoIGlzIG5lZWRlZCB3aGVuIHNvbWVvbmUgY2xpY2tzIHRoZSBkb2N1bWVudCwgYW5kIHRvIGRldGVybWluZQp0aGUgdmlzaWJsZSBwYXJ0IG9mIHRoZSBkb2N1bWVudCBkdXJpbmcgc2Nyb2xsaW5nKSBjYW4gb25seSBiZSBkb25lCndpdGggYSBsaW5lYXIgc2NhbiB0aHJvdWdoIHRoZSB3aG9sZSBhcnJheSwgc3VtbWluZyB1cCBsaW5lIGhlaWdodHMgYXMKeW91IGdvLiBTZWVpbmcgaG93IEkndmUgYmVlbiBnb2luZyBvdXQgb2YgbXkgd2F5IHRvIG1ha2UgYmlnIGRvY3VtZW50cwpmYXN0LCB0aGlzIGlzIG5vdCBhY2NlcHRhYmxlLjwvcD4KCjxwPlRoZSBuZXcgcmVwcmVzZW50YXRpb24gaXMgYmFzZWQgb24gYSBCLXRyZWUuIFRoZSBsZWF2ZXMgb2YgdGhlIHRyZWUKY29udGFpbiBhcnJheXMgb2YgbGluZSBvYmplY3RzLCB3aXRoIGEgZml4ZWQgbWluaW11bSBhbmQgbWF4aW11bSBzaXplLAphbmQgdGhlIG5vbi1sZWFmIG5vZGVzIHNpbXBseSBob2xkIGFycmF5cyBvZiBjaGlsZCBub2Rlcy4gRWFjaCBub2RlCnN0b3JlcyBib3RoIHRoZSBhbW91bnQgb2YgbGluZXMgdGhhdCBsaXZlIGJlbG93IHRoZW0gYW5kIHRoZSB2ZXJ0aWNhbApzcGFjZSB0YWtlbiB1cCBieSB0aGVzZSBsaW5lcy4gVGhpcyBhbGxvd3MgdGhlIHRyZWUgdG8gYmUgaW5kZXhlZCBib3RoCmJ5IGxpbmUgbnVtYmVyIGFuZCBieSB2ZXJ0aWNhbCBwb3NpdGlvbiwgYW5kIGFsbCBhY2Nlc3MgaGFzCmxvZ2FyaXRobWljIGNvbXBsZXhpdHkgaW4gcmVsYXRpb24gdG8gdGhlIGRvY3VtZW50IHNpemUuPC9wPgoKPHA+SSBnYXZlIGxpbmUgb2JqZWN0cyBhbmQgdHJlZSBub2RlcyBwYXJlbnQgcG9pbnRlcnMsIHRvIHRoZSBub2RlCmFib3ZlIHRoZW0uIFdoZW4gYSBsaW5lIGhhcyB0byB1cGRhdGUgaXRzIGhlaWdodCwgaXQgY2FuIHNpbXBseSB3YWxrCnRoZXNlIHBvaW50ZXJzIHRvIHRoZSB0b3Agb2YgdGhlIHRyZWUsIGFkZGluZyBvciBzdWJ0cmFjdGluZyB0aGUKZGlmZmVyZW5jZSBpbiBoZWlnaHQgZnJvbSBlYWNoIG5vZGUgaXQgZW5jb3VudGVycy4gVGhlIHBhcmVudCBwb2ludGVycwphbHNvIG1ha2UgaXQgY2hlYXBlciAoaW4gY29tcGxleGl0eSB0ZXJtcywgdGhlIGRpZmZlcmVuY2UgaXMgcHJvYmFibHkKdGlueSBpbiBub3JtYWwtc2l6ZWQgZG9jdW1lbnRzKSB0byBmaW5kIHRoZSBjdXJyZW50IGxpbmUgbnVtYmVyIHdoZW4KZ2l2ZW4gYSBsaW5lIG9iamVjdC4gSW4gdGhlIG9sZCBhcHByb2FjaCwgdGhlIHdob2xlIGRvY3VtZW50IGFycmF5IGhhZAp0byBiZSBzZWFyY2hlZC4gTm93LCB3ZSBjYW4ganVzdCB3YWxrIHVwIHRoZSB0cmVlIGFuZCBjb3VudCB0aGUgc2l6ZXMKb2YgdGhlIG5vZGVzIGNvbWluZyBiZWZvcmUgdXMgYXQgZWFjaCBsZXZlbC48L3A+Cgo8cD5JIGNob3NlIEItdHJlZXMsIG5vdCByZWd1bGFyIGJpbmFyeSB0cmVlcywgbW9zdGx5IGJlY2F1c2UgdGhleQphbGxvdyBmb3IgdmVyeSBmYXN0IGJ1bGsgaW5zZXJ0aW9ucyBhbmQgZGVsZXRpb25zLiBXaGVuIHRoZXJlIGlzIGEgYmlnCmNoYW5nZSB0byBhIGRvY3VtZW50LCBpdCB0eXBpY2FsbHkgaW52b2x2ZXMgYWRkaW5nLCBkZWxldGluZywgb3IKcmVwbGFjaW5nIGEgY2h1bmsgb2Ygc3Vic2VxdWVudCBsaW5lcy4gSW4gYSByZWd1bGFyIGJhbGFuY2VkIHRyZWUsIGFsbAp0aGVzZSBpbnNlcnRzIG9yIGRlbGV0ZXMgd291bGQgaGF2ZSB0byBiZSBkb25lIHNlcGFyYXRlbHksIHdoaWNoIGNvdWxkCmJlIHJlYWxseSBleHBlbnNpdmUuIEluIGEgQi10cmVlLCB0byBpbnNlcnQgYSBjaHVuaywgeW91IGp1c3Qgd2Fsawpkb3duIHRoZSB0cmVlIG9uY2UgdG8gZmluZCB3aGVyZSBpdCBzaG91bGQgZ28sIGluc2VydCB0aGVtIGFsbCBpbiBvbmUKc2hvdCwgYW5kIHRoZW4gYnJlYWsgdXAgdGhlIG5vZGUgaWYgbmVlZGVkLiBUaGlzIGJyZWFraW5nIHVwIG1pZ2h0Cmludm9sdmUgYnJlYWtpbmcgdXAgbm9kZXMgZnVydGhlciB1cCwgYnV0IG9ubHkgcmVxdWlyZXMgYSBzaW5nbGUgcGFzcwpiYWNrIHVwIHRoZSB0cmVlLiBGb3IgZGVsZXRpb24sIEknbSBzb21ld2hhdCBsYXggaW4ga2VlcGluZyB0aGluZ3MKYmFsYW5jZWTigJRJIGp1c3QgY29sbGFwc2Ugbm9kZXMgaW50byBhIGxlYWYgd2hlbiB0aGVpciBjaGlsZCBjb3VudCBnb2VzCmJlbG93IGEgZ2l2ZW4gbnVtYmVyLiBUaGlzIG1lYW5zIHRoYXQgdGhlcmUgYXJlIHNvbWUgd2VpcmQgZWRpdGluZwpwYXR0ZXJucyB0aGF0IG1heSByZXN1bHQgaW4gYSBzZXJpb3VzbHkgdW5iYWxhbmNlZCB0cmVlLCBidXQgZXZlbiBzdWNoCmFuIHVuYmFsYW5jZWQgdHJlZSB3aWxsIHBlcmZvcm0gd2VsbCwgdW5sZXNzIHlvdSBzcGVuZCBhIGRheSBtYWtpbmcKc3RyYW5nZWx5IHJlcGVhdGluZyBlZGl0cyB0byBhIHJlYWxseSBiaWcgZG9jdW1lbnQuPC9wPgo8L3NlY3Rpb24+CjxzZWN0aW9uIGlkPSJrZXltYXAiPgogIDxoMj5LZXltYXBzPC9oMj4KCjxwPjxhIGhyZWY9IiNhcHByb2FjaCI+QWJvdmU8L2E+LCBJIGNsYWltZWQgdGhhdCBkaXJlY3RseSBjYXRjaGluZyBrZXkKZXZlbnRzIGZvciB0aGluZ3MgbGlrZSBjdXJzb3IgbW92ZW1lbnQgaXMgaW1wcmFjdGljYWwgYmVjYXVzZSBpdApyZXF1aXJlcyBzb21lIGJyb3dzZXItc3BlY2lmaWMga2x1ZGdlcy4gSSB0aGVuIHByb2NlZWRlZCB0byBleHBsYWluCnNvbWUgYXdmdWwgPGEgaHJlZj0iI3NlbGVjdGlvbiI+aGFja3M8L2E+IHRoYXQgd2VyZSBuZWVkZWQgdG8gbWFrZSBpdApwb3NzaWJsZSBmb3IgdGhlIHNlbGVjdGlvbiBjaGFuZ2VzIHRvIGJlIGRldGVjdGVkIHRocm91Z2ggdGhlCnRleHRhcmVhLiBJbiBmYWN0LCB0aGUgc2Vjb25kIGhhY2sgaXMgYWJvdXQgYXMgYmFkIGFzIHRoZSBmaXJzdC48L3A+Cgo8cD5PbiB0b3Agb2YgdGhhdCwgaW4gdGhlIHByZXNlbmNlIG9mIHVzZXItY29uZmlndXJhYmxlIHRhYiBzaXplcyBhbmQKY29sbGFwc2VkIGFuZCB3cmFwcGVkIGxpbmVzLCBsaW5pbmcgdXAgY3Vyc29yIG1vdmVtZW50IGluIHRoZSB0ZXh0YXJlYQp3aXRoIHdoYXQncyB2aXNpYmxlIG9uIHRoZSBzY3JlZW4gYmVjb21lcyBhIG5pZ2h0bWFyZS4gVGh1cywgSSd2ZQpkZWNpZGVkIHRvIG1vdmUgdG8gYSBtb2RlbCB3aGVyZSB0aGUgdGV4dGFyZWEncyBzZWxlY3Rpb24gaXMgbm8gbG9uZ2VyCmRlcGVuZGVkIG9uLjwvcD4KCjxwPlNvIEkgbW92ZWQgdG8gYSBtb2RlbCB3aGVyZSBhbGwgY3Vyc29yIG1vdmVtZW50IGlzIGhhbmRsZWQgYnkgbXkKb3duIGNvZGUuIFRoaXMgYWRkcyBzdXBwb3J0IGZvciBhIGdvYWwgY29sdW1uLCBwcm9wZXIgaW50ZXJhY3Rpb24gb2YKY3Vyc29yIG1vdmVtZW50IHdpdGggY29sbGFwc2VkIGxpbmVzLCBhbmQgbWFrZXMgaXQgcG9zc2libGUgZm9yCnZlcnRpY2FsIG1vdmVtZW50IHRvIG1vdmUgdGhyb3VnaCB3cmFwcGVkIGxpbmVzIHByb3Blcmx5LCBpbnN0ZWFkIG9mCmp1c3QgdHJlYXRpbmcgdGhlbSBsaWtlIG5vbi13cmFwcGVkIGxpbmVzLjwvcD4KCjxwPlRoZSBrZXkgZXZlbnQgaGFuZGxlcnMgbm93IHRyYW5zbGF0ZSB0aGUga2V5IGV2ZW50IGludG8gYSBzdHJpbmcsCnNvbWV0aGluZyBsaWtlIDxjb2RlPkN0cmwtSG9tZTwvY29kZT4gb3IgPGNvZGU+U2hpZnQtQ21kLVI8L2NvZGU+LCBhbmQKdXNlIHRoYXQgc3RyaW5nIHRvIGxvb2sgdXAgYW4gYWN0aW9uIHRvIHBlcmZvcm0uIFRvIG1ha2Uga2V5YmluZGluZwpjdXN0b21pemFibGUsIHRoaXMgbG9va3VwIGdvZXMgdGhyb3VnaAphIDxhIGhyZWY9Im1hbnVhbC5odG1sI29wdGlvbl9rZXlNYXAiPnRhYmxlPC9hPiwgdXNpbmcgYSBzY2hlbWUgdGhhdAphbGxvd3Mgc3VjaCB0YWJsZXMgdG8gYmUgY2hhaW5lZCB0b2dldGhlciAoZm9yIGV4YW1wbGUsIHRoZSBkZWZhdWx0Ck1hYyBiaW5kaW5ncyBmYWxsIHRocm91Z2ggdG8gYSB0YWJsZSBuYW1lZCAnZW1hY3N5Jywgd2hpY2ggZGVmaW5lcwpiYXNpYyBFbWFjcy1zdHlsZSBiaW5kaW5ncyBsaWtlIDxjb2RlPkN0cmwtRjwvY29kZT4sIGFuZCB3aGljaCBpcyBhbHNvCnVzZWQgYnkgdGhlIGN1c3RvbSBFbWFjcyBiaW5kaW5ncykuPC9wPgoKPHA+QSBuZXcKb3B0aW9uIDxhIGhyZWY9Im1hbnVhbC5odG1sI29wdGlvbl9leHRyYUtleXMiPjxjb2RlPmV4dHJhS2V5czwvY29kZT48L2E+CmFsbG93cyBhZC1ob2Mga2V5YmluZGluZ3MgdG8gYmUgZGVmaW5lZCBpbiBhIG11Y2ggbmljZXIgd2F5IHRoYW4gd2hhdAp3YXMgcG9zc2libGUgd2l0aCB0aGUKb2xkIDxhIGhyZWY9Im1hbnVhbC5odG1sI29wdGlvbl9vbktleUV2ZW50Ij48Y29kZT5vbktleUV2ZW50PC9jb2RlPjwvYT4KY2FsbGJhY2suIFlvdSBzaW1wbHkgcHJvdmlkZSBhbiBvYmplY3QgbWFwcGluZyBrZXkgaWRlbnRpZmllcnMgdG8KZnVuY3Rpb25zLCBpbnN0ZWFkIG9mIHBhaW5zdGFraW5nbHkgbG9va2luZyBhdCByYXcga2V5IGV2ZW50cy48L3A+Cgo8cD5CdWlsdC1pbiBjb21tYW5kcyBtYXAgdG8gc3RyaW5ncywgcmF0aGVyIHRoYW4gZnVuY3Rpb25zLCBmb3IKZXhhbXBsZSA8Y29kZT4iZ29MaW5lVXAiPC9jb2RlPiBpcyB0aGUgZGVmYXVsdCBhY3Rpb24gYm91bmQgdG8gdGhlIHVwCmFycm93IGtleS4gVGhpcyBhbGxvd3MgbmV3IGtleW1hcHMgdG8gcmVmZXIgdG8gdGhlbSB3aXRob3V0CmR1cGxpY2F0aW5nIGFueSBjb2RlLiBOZXcgY29tbWFuZHMgY2FuIGJlIGRlZmluZWQgYnkgYXNzaWduaW5nIHRvCnRoZSA8Y29kZT5Db2RlTWlycm9yLmNvbW1hbmRzPC9jb2RlPiBvYmplY3QsIHdoaWNoIG1hcHMgc3VjaCBjb21tYW5kcwp0byBmdW5jdGlvbnMuPC9wPgoKPHA+VGhlIGhpZGRlbiB0ZXh0YXJlYSBub3cgb25seSBob2xkcyB0aGUgY3VycmVudCBzZWxlY3Rpb24sIHdpdGggbm8KZXh0cmEgY2hhcmFjdGVycyBhcm91bmQgaXQuIFRoaXMgaGFzIGEgbmljZSBhZHZhbnRhZ2U6IHBvbGxpbmcgZm9yCmlucHV0IGJlY29tZXMgbXVjaCwgbXVjaCBmYXN0ZXIuIElmIHRoZXJlJ3MgYSBiaWcgc2VsZWN0aW9uLCB0aGlzIHRleHQKZG9lcyBub3QgaGF2ZSB0byBiZSByZWFkIGZyb20gdGhlIHRleHRhcmVhIGV2ZXJ5IHRpbWXigJR3aGVuIHdlIHBvbGwsCmp1c3Qgbm90aWNpbmcgdGhhdCBzb21ldGhpbmcgaXMgc3RpbGwgc2VsZWN0ZWQgaXMgZW5vdWdoIHRvIHRlbGwgdXMKdGhhdCBubyBuZXcgdGV4dCB3YXMgdHlwZWQuPC9wPgoKPHA+VGhlIHJlYXNvbiB0aGF0IGNoZWFwIHBvbGxpbmcgaXMgaW1wb3J0YW50IGlzIHRoYXQgbWFueSBicm93c2VycyBkbwpub3QgZmlyZSB1c2VmdWwgZXZlbnRzIG9uIElNRSAoaW5wdXQgbWV0aG9kIGVuZ2luZSkgaW5wdXQsIHdoaWNoIGlzCnRoZSB0aGluZyB3aGVyZSBwZW9wbGUgaW5wdXR0aW5nIGEgbGFuZ3VhZ2UgbGlrZSBKYXBhbmVzZSBvciBDaGluZXNlCnVzZSBtdWx0aXBsZSBrZXlzdHJva2VzIHRvIGNyZWF0ZSBhIGNoYXJhY3RlciBvciBzZXF1ZW5jZSBvZgpjaGFyYWN0ZXJzLiBNb3N0IG1vZGVybiBicm93c2VycyBmaXJlIDxjb2RlPmlucHV0PC9jb2RlPiB3aGVuIHRoZQpjb21wb3NpbmcgaXMgZmluaXNoZWQsIGJ1dCBtYW55IGRvbid0IGZpcmUgYW55dGhpbmcgd2hlbiB0aGUgY2hhcmFjdGVyCmlzIHVwZGF0ZWQgPGVtPmR1cmluZzwvZW0+IGNvbXBvc2l0aW9uLiBTbyB3ZSBwb2xsLCB3aGVuZXZlciB0aGUKZWRpdG9yIGlzIGZvY3VzZWQsIHRvIHByb3ZpZGUgaW1tZWRpYXRlIHVwZGF0ZXMgb2YgdGhlIGRpc3BsYXkuPC9wPgoKPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/doc/logo.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAJMAAACQCAYAAAAMcVm7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAEOQAABDkBNNJBtAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAACAASURBVHic7X15eBRV1v57q3rJvnV1p4EkQFYSZBMcYNiRUUBUFFEEGpkZt2HEbZRPPhXlY9Dx+xzGgXEZ10AHEHFB/DEgoKDsKIKyhYQlIYRs1UlIIEt3V53fH9UdOt2dDZJ0J/F9nvNU113PvXX63nPP3RgRoSuDMcanpaX902AwjK6pqVGLorjx9OnTrxFRqa9562hgXUmYevXqNScsLGyOTqfT19TUXLl06dJ5Iop75513bhwzZowWAA4fPkzz5s3LKioq2qDVatOCgoJ0NptNysvLW1pWVva1r8vg1yCiLkFpaWlr3nrrrfLa2lpyory8nIqLi8kd5eXldOTIEbp8+TIREVVVVdFbb71VnpqausXX5fBn8jkDbV5AgPXo0ePRDz/8sIKuE1988cWVxMTEJb4uk79Sp+zmtFptQp8+fdYLghCi0Wg0aWlpQX//+9/1rZH2a6+9Ztm9e/clq9VaU1paasvLy3ussLBwd2uk3dHR6YTJYDAMGjhw4Beffvppz7CwsCbDV1RU4MyZM8jKyqotKiqqSklJiUhISGA9e/aEWq1uNK7NZsMf//jHgv379z+dlZX1cWuVoaOi0wnToEGDvtq9e/eU4OBgr/5EhM2bN1vfeOON86WlpYU1NTX5gZcv5/EXL2Yft9kODw4Lm3rJYDBoVaqb5OBg6j9wYPTzzz/frXfv3g3mOXTo0KMHDhzo31Zl6ihQ+ZqB1gRjTDNlypRkb4JUXV2N9957r3xNRsaFyPz8g1Orqz+fV1q6yTXMKkGYrbLbX5cqK61kt9/FiWLQnqys8rk7dz4empzc/b8WLowZNWqUR3M1fPhwPWMsmYiy2rB4fo9O0TL16tVrVnh4+INGo7Hn4sWLewwbNkzj6r9t27bqZ/7yl6Pa8+ffmB8Q8I1kt0dpeb7s/qKiItdwawyGJEmSRkuM7VERxQLgZcaiwZihwG4/+GF4+KheKSlzV69enSAIQl28c+fO4YknnsjOzc3NKyoq+rSoqOjfRCS3T+n9CL4eAVwv9erVa/bzzz9fXl1dTe6QZZkWLlxYnJyc/AYcf5zrJQDd+/Xr98OePXus7vlZrVZ69913qxMSEv7p63rxBfmcgev8sNyIESPOuH9UIiJRFGnChAk5MTExd7ZBvqrk5OSVf/vb3yze8n7ggQeKAPTxdf20+/fwNQPX+VGFRx555Lz7xywtLaWBAwdmAoh7GeBWRUaO9BY/Xa8fTUT4d/fuQR8IQmhz8zVHRU3MiIqKiYuLe2j+/PlF7vmvWbPGBuA2X9dPe1OHVcAZY1q9Xv9wz549g1zdbTYb7r7rrpwjR45MJKLzqwThThtj35qjokYCOE8cZ2RE/Xie/57J8gAA3wfV1EySgZ7vMrbiYSKb2WgMZnb770BULDMWxAEhsy2WL50SLBNdlLTa2r9euWJ5d+PGjW+lpEyf9+c/hzt5iI6OVun1+pmMsd1EdKl9a8Z34HzNwLUgLS3t/yZOnPjzypUrX3ruued0rn5zH3jg4i9Hj84kohwA4IhUfygpqQTPp5JKpWNEPcHYMVmWhwMoW88YT0SnOI7b+TCRDQBsksQRECEBIQwIIyDCNY85paW//L6goIQA466cnIcyli07snXr1mqn//jx4/Hpp5/eN3ny5MMpKSlrGWPatq8V36PDjeaMRuPkv/zlL6ufffbZCHe/RYsWlXy7cuWru3Nz/+F0W6nT9eWBcJKkAlKpRhPRj4yxcpnj9GpJEmWOGxQQELC9urr6Xjk0dN3cc+dqmsvLSp3uFg5gVsbK3oyKejtjw4YBaWlpvGuY7777zjZ37tz/O3fu3PPXV/IOAF/3sy2lQYMG7bdaPQZStHfvXltycvIyb3Faog9dKwEIGjx48Am73e7B2+jRo7N8XW/tQR2um+N53u4+zSHLMp555pnTWVlZz3mL84eSksq25ouIqvLz859btmxZmbtfQEBAx2r+rxEdSpgYY4aCggK9JEn13N95550KW07OCiKymgXh8dU6XZrTb01ERGSGTjfRW3qr9PpxAGA2Gg0Zen235vJhFoS5GXp9irt7QUHBxvT09KMlJSX13MvLy3nGWExz0++o6DCjucTExBfvueeeh1588cUYnr+qlpSXl+O9t9/OfspqPblap4sBY4k8x33q9Jd5/nezS0vXr9Lp7uGBE8RxvUmWk0H0A8fz4wDsYDbbKNfR3HqDIaSGaAoDCgEEExBqEsV1zv7MrlZvYpLEZ+h008BxGiJSMSCW47j1U2prdzz15JNJGatX1wnnxx9/nPDKK68cSE1N3Z6Zmfl76qTW8Q7RMqlUqjGzZs16av369bH9+/dnrn4LFiwounz69DyOKPZ0aelFAD/NKCm56BJEAhFxQITMmJFkOQiM7QXHJcqyfHxtdHQ0MXaCZ+znAqB+k9cAfl9QUDK3uLiQGLuZiEYAiJSBfFmS9P1Uqq0/Hzy44/Dhw3UC07t3b7z33nvdlyxZMiMxMdFrV9wZ0CFGcykpKeadO3fO7tatfk9UWVmJkSNHfvPzzz9PMEdFjQwoKzt4Ra+PmltcXOgM81G3bnrOah1UGxCwO8BqHSqpVMfIbq/hGAsO1movVVdVDZxTWrrfrNONC7BYdk8nsjaXL7PRaFARMVt1tZ3TantqAwJOWquq1LNLS9n9M2YcXbN2baxreCLCsGHD9h04cOC3110p/ghfjwCaQ2lpadtcl9s68dZbb1VGRET8ztf8eaMBAwZsrqys9OB59OjRR33NW1tRh+jmysrKvty9e7fd3X3NmjUXysvLtzcnjdU6XVi6wWBckZTUagbEDL1+FgBkGAyjPtLp6rVC586de3316tUVrm5lZWUoKys701r5+xs6hAKuUqmqN2/eXDF+/Pgop1tmZiaqior2rxKE0QC+A4D1sbGB1VVVd9js9m1qnh+qUqlOW202m1ajqSaVyshJ0v3h5eUfromIKLFptVG8LPeVJSlHJqpQcVzSbItlGwAsZozrGRERxmu1NlNh4RVAMX4yojibJB0IZIxkjUYnE6kAgDjuFG+3DwaQ5+Tv0qVL34wZMybvkUce6et027Fjh62kpKSgfWqt/eH3wtSnT5//M5lMv1+6dGmUq/uKFSsu3lJUdNh06dJ3TjebzdaNA4xMo7FBloNlojt5ng+wS5JeCg39L76yMjMgICCvVpZn8HZ7BXGcnnFcLE+kI8Zq0iMjf5hbVlbeMyIijOf5RyFJOQA+BgCO40ZxsnyEaTQj7IxdcMzrNapwFhYWbj158mTf1NRUAMDdd9+trqysnJmcnGzMzs6+lxzTN50Fft3NMcYSb7nllgeWLl2qc/f7cf/+kr4qVb2VjZwk1YDjqjUcF8+AGJmokDF2DsDhuefO1TCiwul5edXEcb0YsI2I+oKxMnDcYUaUM7esrBwArOXlVyRgg12W99TxAlxkPG9hHHeek+URxJjIMXbUrNffHltUVArGUtN79w4wC8KfnXGysrL++e933qlndHrggQfCFi9ePMlgMMxu9QrzNXyttDVGffr0eTs7O9tDic3NzaW0tLQPriXNtYLQ3azXjyIirBKEIa3Nc0ZUVJrr+81jx3qst7LZbDRo0KBdvq7f1iZ/7+bCo6KiPBz37t1rO3/+/JfXkqDDBnURAEwlJT9eH3uemGWxnHB9F8vKLsiyHM9xVzsBlUoFrVar8YjcweHX3VxxcfHypUuXFru7b9++veTy5cte96qtjIoasZ4x3pufO9INhoEZgjB1tU4XszI6OsFbmLVhYUJT6b3bo0fQh3p9qDe/mpqaPceOHavn9vXXX9daLJZN3sJ3ZPh1y1RaWnpw48aN5X/7298MrpO7OWfOVJoFoZdZrx8BoMJUUqIo4YwxXhB6VYeGZmZER8eQLEdIjF1SEaXKwCHI8qBAoi3TS0svAQAvSbOJaANUqt48UPFBeHiUVq2ewoi+JWAiA/bKGs0dUlRUNoDPAMVQyez234Lnz80uKvoZAAJqaiYzIDbdYFirkuVbyG7fBbVaB0kK6FNTU7Rr164r/fv3r9sy8/LLL4vZ2dkr2q8m2wd+3TIlJSW99a9//SvOVZCsVivKysouEvAbEOnqBAnAer0+WJLlkjkVFRZZkkaQLBtVRKky0QBIUgJTq3c4BQkAwNgxU2npbrmm5oQsy7FarTZKkuUzsyyWC8RxVRLHRRNwyspxW51RyG5XExDB7PZApxtPdIp4fqcGCAXR6erg4CIAyeC4xNsCAnrt2rGj3mrL9PT07n369PmCMVZvaqijw2+FSavVjpkxY8b0W2+9NcDVPTs7G+FVVQWMse0Sxx1x9ZteXHyZA2LBGGOMHQ8MCtoIWRYZcJxTqbIBXHEN74w/p6LCwogEEF2RGTsP5SsTT3SZY2y/GrjNGWeOKOabRDF9lsWy3+l2JTDwDGS5v0x02QbkPZyfXwVZtjHGcgJ4fkOpxVLPeJmSksJeffXVocnJyf/dilXme/h6BNAQJSUlvZGVleU+EKLvvvuOevTo8UhD8VZFRwe/DHC+5t+Vhg8fvs+9HJIk0aBBg3b6mrfWJL/VmXie7+dtS7bFYqGCgoILDcVzWqz9CTU1NbXubhzHISwsLNIX/LQV/Labq6ys/Hzjxo0e67GLioquyLJsAYAMvX4soIy4MnS6J9aGhdVtszXr9UPWGAxJALBKp7tnfWxs4Gqdblhz88/Q6+9YqdPVTYWYo6JuyNDp7l0fGxu4ShDmm43GenvQMwyGUQ2lZbVaq+32+lOLeXl5EEUxp7n8dAT4bcuUn5//9oIFC+5OSkoa369fvzr3wsLCGgDOpbHjwdh3dp1uNBHx2srKuiWzJMsJMy2WdRk63YMcx6Vaq6pOyBzXC8D+VTrdizJj6+eKYiYArNLrkxlwY7VGs/Hh/PyqNRERkaRS9eM5LhjAcQAAxyUTYLRWVenA2CCy2yPgooORJCVn6HQGMJZCQCYD+sjAeY4xitLpAkpLS2EwGAAoE75Tp07NPn78+B/atBLbGX7bMgGINBqNPd27usLCQisA5bxJWT6WrtdHc7KczXHczulErovblN8cFyEDWbMslhNEFPUuY2owdt4pSADAAd1d87Do9VUA8skxkQsAYMxAQJLM2DjG2HHG2Bin107GVOC4n4nj1DJjnxJglIHzDIgiQAqw2WosFktdUqGhoYiLiwsMDAzscf3V5D/w25YpLS3NvGbNmoSQkJB67sXFxRKAcgDQBgV9JVdVDZQ1ml8CZNl9mJ2/xmiMl4nWMlnuDQDE2IHIyMggO89vcQ04u6Rkp+v7/Ozs2jUGwx61VntVN+P5z8lm2yXzvIWT5TgNY/X1NkkqhkZzfk5hYbHZaCyXJSkWtbU5NaGh1eet1sSysrK6degqlQoZGRkxI0aMWMUYG0z1/wQdF74eATREEyZM8BzKEdGsWbPyALT51qXWpISEhEWHDh3yKMvTTz+dD6CHr/lrLfLLbo4xxhqauzIajSoAbToK2smYao3RGA8oa5uaCu86leItvEajMep0HgsfEBMTEwTAc/Kxg8Ivuzkiov79+1fabDaPowC7desWACBqMWMX4qOjAwNkmcFu562Mhc6yWC58rNd3t/H8JaeJ4F3G1FqDIS6IqAglJdYygNRGY4S2uto+s7zcY48bAGQBLMhunw7gtXi9fuLasLCDslptldXqAFNhYXGGXt9tdklJgVmne4px3BUNkSZDr/9MK4rFCTrdrJ2MrRlLZAcAs15/e6DBEO9NmPbs2VMOx6RzZ4BftkwAYLFYnpozZ85FWa6/Kyg6OjoIQNRLRDIkaWatJM2oYiyGGPurWRBS7bJ8q1RbWyeBgYLwuMpmC6qR5Xuq9fq+AZGRqWqrdZ4UEFAXZqXBMNqs189YrdOFAcDDRDYCigCAJCmUAgIiZcZMzG6fuEoQJhDRwgyd7gnGcYUEEAFBBNxZKwgGYiyoUBAMzrQZUQzHcRHuut/y5cvLjh49+hERWdBJ4LfClJ+fv/3bb799/7333qtn8NPr9ZqIiAgDABBRNTiugAcmEJHIybJKIspyLnIDACbLdpnnezGiKhBNYIAsM5ZjKiz0WI3gCgLsqwXhJo7jjthleSIYk2SOOwogmBjLkzluMxHF1x1qQSRoJamKyfIZAFgVFTVpRVKSloBTgVptPZvU4cOH8frrr/906tSp/2md2vIT+Fppa4gABA4fPvy0JEn1lNYffviBEhISnq0XHmCfxMQENpTW8sRELRHh5RZOs+wAVESEfwNqV3fn+ycATwAjgO0AVB/p9caVUVFPfwJoyOWkutGjRv1IbpgxY8YFAL19Xc+t+s18zUBDJAjCH7788kuPUyAKCwupX79+6b7mryU0ceLETPdyFBQUUEpKitnXvLUm+W03V1FRUalWqz34i46ORnBwcGp78ZGh13dz3R6V3rt3gOvTHTsZU62JjOy53mAIWa3Thc0KCRnTt29fj9GnSqUCY8z/d8C2AH45mgMAq9WauW3btpJJkyYZ3P30er1+CGPqxwVBMUZynMTLch9tQMC31dXVt/BEh2ZZLBcAwCwICxjRGZnjjjKezydJ6sGAG1W1tdtltToRRFdmlZYeBYD1jGmuREQEVQpC9fzsbEVXI/pdyOXLm9eGhZGk1f6Ol2X7esY+56Oibjfr9cXEWIXKZiuVeH5wgCx/U63TTeWIqmuJ4uw8v52Cgp6ZMGGCx+0IBw8etFZXVx9zd+/I8NuWiYiObt68+Quz2XzZ3W/EiBGRh4A0yPJIJsujOFmOJFkeV1VVFU+yLDoFyYHTVo7bCqI4SNJMDuguS1KepNFMlxibRYyNdwasEoR+PM8/GlVWdvWAeKLTWkmKkNTqZCLSMqCyRqd7hQCOEaUxWf6txPPjTKL4eTXHTVVbrZsAhEGWf55bXHwkX6czDh06tJ51/sSJE9KCBQsO5+bmLmuDqvMZ/FaYAODkyZOPLly48P1ly5bVW1YyZsyYiPj4+EkckCdz3BEQxTHGSjlJquKA+mdIynKWiujOORbLNwzoY2esnDE2nhg7wQEnAPzgDKq22c5KwAZmt592utl5/qwsyxNkjhOJKEriuBLG2GYAEin1V8GICgGAyfIhSaOZLhGdlDkufmVU1AiEh4dGRl7t5Xbt2iVPnjz5u+PHj48nhy2q08DXSltTlJaWtiEvL6+e8lpTU0P9+vXb1pJ00gVhcLrBkPCRXm9cqdO1yxQGAO1dd92V68p7VVUVDRgw4LCv67UtyG91JgBgjKknTpzYPyam/jlZWq0Wer2+J2NMRc38dz9QUnKoTZhsBDqd7vZp06YJrm6BgYG4++67Yxlj/Ynol/bmqS3h190cEdlsNpvXI24efPDBGIPBcE9TaZiNxuB0g8F4rTysMhgGrRKE3zQWZrUg3JxuMAxcYzTGZwjCVKd7TEzM/HvuuSfIPXxlZaUVQKexfDvh1y0TABQXF587ceJEUlpaWj3Bv/vuuwNfe+21x+A4C8CJDEGYOlsUNzjfeSCaZDk+Q6/vDqKhMrCRMTZZItrFAzcxoJJkWeQ4rlYGODDWH5L0tam09DwAzCkpOZKh0z0K4CAArNbpYmTgVp7nv5fs9mgAgEZzlLNaB88sLT1iVg7SAGMseu7cufFabf1DVyoqKvDNN99cIqL81q8t38KvWyYAOHr06N333nvvtq+++qra1V2r1WLgwIG9GWP1Wh0rY9+4vpPNJqokKVsGbgJjByDLOiKyzrVYThFjQcSYETyfKhP1Yowl2lWqDcTYBGf8DEEwgrE64bTxvFB3jjjPp4LjElVVVTLH8xwAkOMwi6SkpKeefPLJev3z6dOnafz48ccOHz48qfVqyH/g98JERNXHjh2b+OSTT245dKi+2jN//vzuycnJf3F1U8tyvVPZeI4LkXg+iJflXZDlh3nGSjmeP+LQGgtBlCUx9gMYC5Zl2a6y26epVaq63bYyECoTudZTIQEX7Bz3CxjLZ4yV3F9RIYJIl967dwAjKkyPjOyl1+tvGzBgQF2kyspKTJ48OfPQoUO/JceB950Ovh4BNJfS0tK+9nZz07Bhw07Bbe7MG2VERcWsjIzs31iYD41GvXM+7npIr9ff+sYbb5S78zp8+PBDvq7HtiSfM9BcGjJkyEH3j0NEtH37dmtycvJffc1fXYUC/KBBg455Ozbxtttuy/Q1f21Jft/NOVFTU1NQVua5lu3mm29Wp6amzmaMNXihs1mvn7kqKmpSemSkxxUZZr1+put7usEw0FsaOxlTObc+rdTpblkVFua52g1AQkLCgsWLFydoNJ4LRS0Wi8f+uc4Evx/NOZGZmfnX5cuXj3zppZc8lrkuX76859mzZ/8N4O4MnW7abIvlM6ffTsZUTKdTQaP5nrPZJq3W6bYSxz1DkvS+pFJZecbq1j59pNPFqhj7Q4bBsFyWpDvA2DkGdCfgFGcwlDC7fXZ6ZORSjuMi51RUWDIE4TEGnJSIIjmOq95ttRamDB36+O233+4xCbx//365qKjoU3f3zoQO0zLZbLYf1q5du+n999+vdHQndYiLi8OUKVNGRkRE3GTn+XoHkJ7X6cbaJel7U2HhFcZYiKa0tIaIzjKe78fL8u/Kw8O/eZcx9Uqdru/vLZY8Yuw4Z7PZGGOJHMeJjOd3c4yN1hYXn2RAprW8/AqunhceXMvYQcZYNGTZcNBo/Os/33rLw6a1b98++x//+MdD586de6PNKsgP0GGECQAyMzPnLFmy5OkhQ4Yc3blzZz1j5qJFi/RJSUnpP125Um+dL8dY/NyyshzHa8VlozGcA/KswPeMscD52dm1kYDMESn3qzB2UFaprIzn/w2gAACIaO10IqtMlBkcFRXIeL5qTUREJCdJH2tkuZ/VZlu7WqPpdetdd92YmJhYl3deXh7Gjx9/bvbs2f8+ceLEGHLm0Vnha6XtGpXcW9esWeNxtdPZs2cpNTV1L5oxumtNCgkJGXLHHXdckGW5Hj+nT5+mtLS0N3xdX+1FHaplcoHMvGwp6t27Nz788MMhSUlJnzjd0nv3DnBfyLbeYAjZyZhXfXE9Y7xzY8EH4eFNbkNijMXecMMN69atW9fD/bglxhiIqFOdwdQYOqowHXrzzTcvOFqpehg2bJh6yZIlN8fHx/8DAFQVFWO5y5cnrDcYQj7W67sDQDXRrLzIyD7rGdO473OrjYoaDyBsfWxsoEajucXp7oy/njHNu4yp1xsMIfNDQtL69u37n6+++io+IMBz4eWbb75ZIoriJx4enRQdZjTnCiIqjY2NfWHmzJmvL1q0KNp5zrYT9913X+jFixfnJCQk6ANKS/9wHLCZdbp5YKwsQ6/PPCeK770EUIbB0D9FlkvgsneNgLjZFss2s15/u12lqpuaqZHlB8BYmU0Q5CCOO7m3unrivri4xz///HOjINRbGABRFPH+++9Xbtq06evi4uI96CLokMIEAHl5eRmMsT2HDh16ShCEm5cuXZo4bty4OuPOU089FTV48OB7H3300TR28uQdK5VWOFSW5dqXHFd0SXq9iuP5uiZlPWM8RUU5mzvj7wsKXM/w5gkIBZC1heMWlg0bNm7bunUG14VvOTk5eOyxx87m5uYeO3PmzN+rq6t3tWkl+Bt8rbS1BoWHh9+/adMmG3lBYWEhjRkzJucuo3GJ+1TJSp3uN65Xrn6k0/VZrdcnERFWCsIU17BmQbjjNiAoKSnpw5dfftnirmwTEV28eJH69u37vq/rw1fkcwZag9Rq9a0ffPDBZY+v64DdbqdXXnnFMnDgwJ+MRuNctHD+DYAxOTn5zXHjxmXv2rXL84JgB7Kzsyk5Oflfvq4PX5HPGWiVQgDq6Ojo7NOnT3v5xFdht9tp3bp11SNHjjyVlJj4jxnBwS8uioiY5SU9HkC8Wq2e3Ldv3y0zZ87MO3bsWKNp19TUUGpq6kUARl/Xh6+oQ1xe2BgYY8YBAwZsfvHFF5OnTZvmsaqxIfzyyy/Yu2fPlSNHjlScz8mxXq6svGyrrZVCgoNDgyMjVWmpqUH9Bw4Mu+WWW9Tebknwhu3bt9teeOGFc6dPn54jiuKBay5UR4Wvpfl6CADr06fPj4WFhd4aC5+gtraWhg0blgUgkvygjtqTOqqdyYnwIUOGREdHR/uajzpoNBrMmzcvBkD/JgN3MnR0YQoKCAho1j0p7YmQkJAAtVod5ms+2hsdWpiI6OLu3btPnjp1ytes1MFqteLVV1/NstlsO33NS3ujMyjgQlJS0kdBQUH66Ojo6I0bN/Zy3xHSHnj22WcLf/zxx/OXLl2qyM3NfdHich1Gl4GvlbbWpNDQ0BGPP/54gYdW3Mb47LPPqhMTExe3Vjk6KvmcgdamxMTEd/bt29egYbG1UVRURH379j0El8O9uir5nIFWLxCgSUlJ2ZCenn6J2hiHDh2yDxgw4BcAsb4utz+QzxloK0pISHh2zpw5F8+fP0+tjYqKCnr99dfLUlJSPgGg9XVZ/YU6vALeGBhjyWlpaf+l0+mGTpgwofvs2bMj4+Pjrymty5cvY8OGDVUZGRkFeXl5ZwoKClaUlpb+v1ZmuWPD19LcXgSgf2Ji4sb//Oc/njs5m0Bubi4lJyf/EhERMRWAxtdl8VfyOQPtWlggduzYsS2ee3nmmWdKQ0NDJ/uaf38nnzPQnpSSkmI+e/YstRRWq5UGDRq019f8+zt1aAt4S8FxXLjR2PKjmtRqNYKCggKbDtm10aWEyWKxbNqyZYvXw8Maw8WLF1FWVna66ZBdHL5uGtuTAPApKSkbd+/eXUPNRFFREQ0cOPAYAL2v+fd38jkD7V5ggE9NTf1q3759nseUuKG4uJgGDRqUiS68erIl1KW6OQAgIunkyZNPpqene70ezBVbt26tzc3NfZ0cRzP/isbRIbY6mQVBBcB5UPw8kyh+fp1JxgwcODC4qUD9+vXTCoLQ6zrzahRmQhNbJgAADlRJREFUQeAADAeQaRLFDn1oqldhMgtCBIDbAaRBuamxFMARAJtMouhxY0A7gAFwLqf0emdJC7H37bffzps2bVqqXu/9WCciwssvv5yblZX1gdPNLAiJAJwnUxw3iWJeUxmZlR2aQxyvF0yi6H7FxQcA5gKoMgtCb5MoNnp1mT+jnjCZBSESwEsA/gTA27WmJWZB+LNJFNe3B3NtBSKyMcZumTp16r49e/bEeAvzxBNPFB88ePAxIjrn4jwHwIuO3+sAzGhGdk8CeN7x+0MAf3Tz7+d4BgFIAtBhhalOZzIrl9ocAPAEFEG6AmAHgH8A2ASlddID+MQsCA+1P6utDlVycnKD3Xz//v0DbTZbY6vs7nS04A3CLAgMgKkJPuYD+BTAf5tEsUNvJVcBgFkQQgFsxdUm/DUAL5hEse70f7MgaAG8CuBOAGvbmc+2QE1xcbEsSRJ43nMZ+aVLl1hNTU1Dtx9UQWlJ7gfwdiN5jAMQB6ASytZyD5hEcR+A6S1h3F/hbJn+F1cFaZZJFJ9zFSQAMIlirUkUnwYwwAd6U6svbSCiwgMHDjwzb968cne/Tz75xLps2bJ1ly5d+rKB6Fscz7lNZPOA47n5GtnsUFCZBaE7gD843jeZRHFNYxGaEiSzINwEYBiAQQDKABwC8K1JFJscXpsFIRDABAAjAQgAfgawxSSKWWZBsKOJ0adZEDRQWoOhAPoAEKF8+C0mUZTdw6tUqh6TJk3yaDGGDRumCQsL69ZIVgUAjgL4jVkQ0kyieMILL8EApkE5YSWzEZ77ABgIoMbkcrOCwy8OwG8B5JhEcb/DbRAUXa07gGUmUTxsFgQjgLEA8k2iuMsR7gYA9wGIB/CmSRT3uqWdAmAUgBsdTocAfGcSxQYt/WZB+B0AHYCvTaJY5ijj7QAmA7ioAjALio5EuKpcthhmQQgHsALedYQKsyDMN4niqkbipwH4BEBfNy+rWRBeAVCLRoTJ8VHWQvkwrpgP4AuzIMw0iWKNq0dRUdG/li5d+uDUqVNTXN0XLlxYkJmZOa+hvKBc8vwxFOV5LoAFXsLcAyAYymitMd3qTgB/g3Jb+QY3v+GOMn1pFoS7oCj9rl3ie47nAEe47wCMNQvCewAedAlXd0aUWRDUABYBWAhlG7wr7GZBWAzgVZMoSvDEXwH8BsAYsyCUAdgFINzh9xMHwHl53xmTKB5upNANwiGhP0ARJDuA9QCegaJjHQYQBmClWRCWNBB/sCN+Xyj3xX0A4HEoyv95AC9D+TAN5X8jlH/WQAC/OPK+D8pHKgZwFwCPhWxEVKNWq6vc3aurq61ElNtIkUNw9c4Wk1kQvO3dm+N4rkMD+lILoIPyIacDyAFgBvA5lDLXC2cWhGegCFI+gNVQvoXrTpmvALwARZC2On6/COBbKH/WJVAGBI0h1ZFOGIBvoIxSM1QAbnAEONNAxOZgEZRhbSWAu02iuN3pYRaEFwEsBzAPwHNmQVjnamtxjHjehKLQngMw2SSKmS7+C6EU+AVvGTviv+WI/zGAOSZRtDm8PzELwkcA9gK42SwIt5hEcatrfFmWPbo/WZab0tGCTaJ41iwIu6B0FROhjHidPMVB6W5PA9gHZYR8PRgCpet/F8DjJlFs6DzxZCiDp7UAHjSJYr0/ilkQTABuBSADeNQkiu+5eP/VLAjzoXyrqWZBmGYSxc/gHf8AYAMwxtmtAooC7jyV4ZqEyWFSeMrx+ndXQQIAR3P5OBRBUQFwv0r0fig6DgA85ipIjvi1AP6nERZmOuKXO+LbXD1NopgF5SMAiv2sHsgxYecKSZI8BMwNzuUo7zuec938TVAMre+bRJFcwl8rAqCYaf7UiCABirryE5Q/lLsgaQG87nj93E2QFKZFcQWA/zhe32igxQWU8phcBQlQhMlpnLzWY4WHA1BDkfYV3gI4BOpfjteRjtbEiTGO5wmTKP4HLccox3N7I9MRztaon7tHAy1TU8Lk5H89lG75DrMguB6VMgfKPze9iXRagkXeBhFesNh9JO5AMgDn5dn/bCS+0y8GQO8GwvxgEsWN7o4qKCMuPYCezWDUG5wHSl40iWJpI+GOOp6Bjrxy3OL/fI35O5VnjVkQHm0gjHMqxsPa3UDL1CxThEkUq82CsBpKF34fgLcdo9lkAJ+ZRLGoOek0Ez9eZzjXgz+PNhAGUHRO1zjeRnde81BBGbrqAfRqJIPGkOR4Nqawuvsn46owOYXh7DXm77SP3eGgxuAhJNfYMrnifSjCNAuKAdN5F4tHN+JjJDuel0yieKmRcEUArFB6rKRGwnmAg6IgAkCKWRCuZRLV2bU0OrXg5u/aHTntVtc64nG2hmYoSm9jNN498vW0TADgGAH/BGCEWRASoLRQuQC2tagUbQ9nnYc4VmE0hCBcVX1atIpBBUWfeBRAJICH0IDe0whOOp69mgjn3LBGqG/Ey3X4xbYwXyeyoJyFFGQSxZ0tjaxSqbwZM1vSMgFKK/Q2lFaqG5qv37QnnN+JhzLF01BP0MtLnGaBg2IvcK4Ves5hhW4JnBkGmwVhSiPh7nU880yieMXFPcfxHGsWhGYfI+iCLMdzlFkQQloaOSQkxKO8ISEhgd5uQGgEa6DM142FcknPhy3lox3gKhj3NhhKaVkBzz99k+Acmv9/Od67A9jpmGLxgFkQQsyCsNIsCCNcnHdCMUwCwMvehNEsCMMBOG/VdjcNOK3ikVB0D29oSLEGlNagGspIZXFDgRyL0DwQGBjoYQyNjY3V4KrS3iRMolgBZWQHAJtNouh3lzk7BgPOqbKnHFMw9WAWhBgoMwYA8IGjXM2GypHRGrMgjIRih/kNgENmQfgnFKv0L1CavsFQ7EnJAG4yC0JfkyiSSRQlsyA8AsXKOhjAd2ZBeBqKgEVAMegthzKc/glXTQTOQu40C8IOKDrN/5oFIQyK/nMBiv3ocSgWbK8wieI5h2X9FQBPOyppEa424wlQJlynmQXhRtcpFcYYP336dI/WMCEhIRjKyK+gGXXoxFtQ6qmxYbev8TSUeTQDgANmQZiHqzrzSChddQSAElxtYJqNOkXMJIrzzIJQAMW0boQyFeINPwOY4TDGOeP+YBaEOVAs2TdBmbMhXLXHAIqwzWpgzudhKPNSfR35v+gWfwUUe9YQL3EBxRjXDcBjUEZTM6GsxwKuTsNchiLsrmuGjHFxcR5rluLj48M1Gk0clD9Ts2ASxYNQujm/hUkUi8yCcCeUP2scvEwxQfkTzmrCzOMV9Zp+kygugWLYe9ORqFOJlAEch/KPH+pupXbEXe2I+yGAE444l6EI1l8AjDSJolelzzFTPRTKv/oolPm9SgBfA5hqEsXHoSzj+A7K0NU9vs0RZjwUHTAHyqgEUBb8/S+ABC+Lz2KSkpI89Kzu3buzHj16pHlhNcfBw0/eytEIjjniedNBzjv89nrxK3b4fYer38IbSl3CNbov0CSK30P5Tn+HMrdnhTKJ/iOUqZj+zhUKXnDIkUe2V19fb4/xJUVFRc3YsmULuaOoqIhSU1NX+Zq/jkZdbquTKwwGQ1qPHj083PV6PRhjXteG/4qG0aWFSa1Wp8TEeMoMYwzBwcFNboX6FfXRpYUpODg4PiLCu+G+e/fukcz9astf0Si6rDAxxoLi4uIMDfmPHTvWAGUF469oJrqsMAUFBY2eMmVKg8I0ceLE8NTU1Psa8v8VnuiywtSzZ8/7J0yY0ODEdp8+fRAaGjqyPXnq6OiywhQaGnpDt26NbUABunXr1o0x5nd3s/gruqQwMcbC4+PjhabCTZgwwaBSqRqyuv8KN3RJYQoMDBx35513NqgvOXHrrbeGJicn/6o3NRNdUpji4uLuu/nmm5tcCJiUlITg4ODh7cFTZ0CXFKbQ0NAGj9JxR48ePYyMMXUbs9Qp0OWEKSQk5Dc33nhj8yQJwO23367v3r3779uSp04DX08OtifpdLrRkydPzq2tbfI4y3r405/+VNi7d+8/+Zp/fyefM9BuBQXUw4YNO2Oz2ehaYDKZCgEk+Loc/kxdppsLDg4e99BDDxlUqms7xvPZZ5+Njo+P7wyHnLUZuowwxcbGThkzZkyLNxw40a9fP2i12tGtyVNnQ5cRptzc3A07duy45kPKjh49CqvVuq/pkF0XXUaYqqurv//iiy+u+TzvdevWWc6cObOyNXnqbOgywtS7d+8HS0pKrmVfHgDg1KlTUnx8/LRf5+oaga9HAG1NUO5L2Zmenl5B14lvvvmmZsCAAYfw6z0q3uva1wy0NRkMhhlr1669Qq2EY8eOUVJS0nJfl8sfqdN3czqd7qE777zzmrs3d/Tt2xcRERHjWiu9zoROL0w1NTVf79y5s6HzvFuM4uJiVFVV5bRWep0Kvm4a25oAqG+44YYfCgoK6Hpht9tp7NixZwD08HW5/JE6fctERLZjx469sHXr1hbfgOmOs2fP4sKFC18Qkd8dTOEP6PTCBACCIMT26NHD28VCLUL37t2hUqmu9RypTo8uIUyiKH67bNmyIlEUrzkNm82G5cuXV5WWln7Tiqx1Lvi6n20vUqlUAyZNmnSBrhFLliwpj4iI+DMAztdl8VfqEi0TANjt9kye521Nh2wQcnl5+QEi8rfjBf0GXUaYiKg2Jycnfdq0aedb0t0RERYsWFC8evXq74mouccnd034umlsb1Kr1RNXrVrV7KWWOTk5FB8f/7av+e4I1GVaJidsNtvBFStWXDh27BiKiho+891msyE/Px+LFi0qLCkpyWhHFjssGFGr3wvo92CM9UpMTHyY47j45OTkkRkZGT3Cw5Wbrux2O5577rniL7/88oRKpTpbUVGxPj8/f0sTSf4KdFFhcoVGo+mTmpr6jtFo7AaAFRUVleXn5y8sKSn51te8dTT8f55fKsbmgm+wAAAAAElFTkSuQmCC]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/doc/logo.svg</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICB3aWR0aD0iNzQ0LjA5NDQ4ODE5IgogICBoZWlnaHQ9IjEwNTIuMzYyMjA0NyIKICAgaWQ9InN2ZzIiCiAgIHZlcnNpb249IjEuMSIKICAgaW5rc2NhcGU6dmVyc2lvbj0iMC40OC40IHI5OTM5IgogICBpbmtzY2FwZTpleHBvcnQtZmlsZW5hbWU9Ii9ob21lL21hcmlqbi9zcmMvanMvY29kZW1pcnJvci9kb2MvbG9nby5wbmciCiAgIGlua3NjYXBlOmV4cG9ydC14ZHBpPSIyNy40NTA0MDUiCiAgIGlua3NjYXBlOmV4cG9ydC15ZHBpPSIyNy40NTA0MDUiCiAgIHNvZGlwb2RpOmRvY25hbWU9ImxvZ28uc3ZnIj4KICA8ZGVmcwogICAgIGlkPSJkZWZzNCI+CiAgICA8Y2xpcFBhdGgKICAgICAgIGNsaXBQYXRoVW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgaWQ9ImNsaXBQYXRoNDEzOCI+CiAgICAgIDxwYXRoCiAgICAgICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMDUsMCwwLDEsLTI5MC43NjE2NCwyNy45MjcxMjgpIgogICAgICAgICBkPSJtIDcwNS4wODY0NywyMzEuNjEzMjQgYSA3MC43MTA2NzgsMTA0LjU1MDc5IDAgMSAxIC0xNDEuNDIxMzUsMCA3MC43MTA2NzgsMTA0LjU1MDc5IDAgMSAxIDE0MS40MjEzNSwwIHoiCiAgICAgICAgIHNvZGlwb2RpOnJ5PSIxMDQuNTUwNzkiCiAgICAgICAgIHNvZGlwb2RpOnJ4PSI3MC43MTA2NzgiCiAgICAgICAgIHNvZGlwb2RpOmN5PSIyMzEuNjEzMjQiCiAgICAgICAgIHNvZGlwb2RpOmN4PSI2MzQuMzc1NzkiCiAgICAgICAgIGlkPSJwYXRoNDE0MCIKICAgICAgICAgc3R5bGU9ImZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6bm9uZSIKICAgICAgICAgc29kaXBvZGk6dHlwZT0iYXJjIiAvPgogICAgPC9jbGlwUGF0aD4KICA8L2RlZnM+CiAgPHNvZGlwb2RpOm5hbWVkdmlldwogICAgIGlkPSJiYXNlIgogICAgIHBhZ2Vjb2xvcj0iI2ZmZmZmZiIKICAgICBib3JkZXJjb2xvcj0iIzY2NjY2NiIKICAgICBib3JkZXJvcGFjaXR5PSIxLjAiCiAgICAgaW5rc2NhcGU6cGFnZW9wYWNpdHk9IjAuMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOnpvb209IjEuNCIKICAgICBpbmtzY2FwZTpjeD0iMjkxLjcyODEyIgogICAgIGlua3NjYXBlOmN5PSI3ODkuMjQ5NyIKICAgICBpbmtzY2FwZTpkb2N1bWVudC11bml0cz0icHgiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ibGF5ZXIxIgogICAgIHNob3dncmlkPSJmYWxzZSIKICAgICBpbmtzY2FwZTp3aW5kb3ctd2lkdGg9IjE2MDAiCiAgICAgaW5rc2NhcGU6d2luZG93LWhlaWdodD0iODc1IgogICAgIGlua3NjYXBlOndpbmRvdy14PSIwIgogICAgIGlua3NjYXBlOndpbmRvdy15PSIyNSIKICAgICBpbmtzY2FwZTp3aW5kb3ctbWF4aW1pemVkPSIwIiAvPgogIDxtZXRhZGF0YQogICAgIGlkPSJtZXRhZGF0YTciPgogICAgPHJkZjpSREY+CiAgICAgIDxjYzpXb3JrCiAgICAgICAgIHJkZjphYm91dD0iIj4KICAgICAgICA8ZGM6Zm9ybWF0PmltYWdlL3N2Zyt4bWw8L2RjOmZvcm1hdD4KICAgICAgICA8ZGM6dHlwZQogICAgICAgICAgIHJkZjpyZXNvdXJjZT0iaHR0cDovL3B1cmwub3JnL2RjL2RjbWl0eXBlL1N0aWxsSW1hZ2UiIC8+CiAgICAgICAgPGRjOnRpdGxlPjwvZGM6dGl0bGU+CiAgICAgIDwvY2M6V29yaz4KICAgIDwvcmRmOlJERj4KICA8L21ldGFkYXRhPgogIDxnCiAgICAgaW5rc2NhcGU6bGFiZWw9IkxheWVyIDEiCiAgICAgaW5rc2NhcGU6Z3JvdXBtb2RlPSJsYXllciIKICAgICBpZD0ibGF5ZXIxIj4KICAgIDx0ZXh0CiAgICAgICB4bWw6c3BhY2U9InByZXNlcnZlIgogICAgICAgc3R5bGU9ImZvbnQtc2l6ZToxNXB4O2ZvbnQtc3R5bGU6bm9ybWFsO2ZvbnQtdmFyaWFudDpub3JtYWw7Zm9udC13ZWlnaHQ6bm9ybWFsO2ZvbnQtc3RyZXRjaDpub3JtYWw7bGluZS1oZWlnaHQ6MTI1JTtsZXR0ZXItc3BhY2luZzowcHg7d29yZC1zcGFjaW5nOjBweDtmaWxsOiNhMjEzMTM7ZmlsbC1vcGFjaXR5OjE7c3Ryb2tlOm5vbmU7Zm9udC1mYW1pbHk6VWJ1bnR1IE1vbm87LWlua3NjYXBlLWZvbnQtc3BlY2lmaWNhdGlvbjpVYnVudHUgTW9ubyIKICAgICAgIHg9IjI0Ny40ODczOCIKICAgICAgIHk9IjE2My40Mjc5NSIKICAgICAgIGlkPSJ0ZXh0NDAwNiIKICAgICAgIHNvZGlwb2RpOmxpbmVzcGFjaW5nPSIxMjUlIgogICAgICAgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoNDEzOCkiCiAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSgwLjUwNTA3Mjg3LDAuNTA1MDc1OTUpIj48dHNwYW4KICAgICAgICAgc29kaXBvZGk6cm9sZT0ibGluZSIKICAgICAgICAgaWQ9InRzcGFuNDAwOCIKICAgICAgICAgeD0iMjQ3LjQ4NzM4IgogICAgICAgICB5PSIxNjMuNDI3OTUiPiAgICBpZiAodW5pdCA9PSAmcXVvdDtjaGFyJnF1b3Q7KSBtb3ZlT25jZSgpOzwvdHNwYW4+PHRzcGFuCiAgICAgICAgIHNvZGlwb2RpOnJvbGU9ImxpbmUiCiAgICAgICAgIHg9IjI0Ny40ODczOCIKICAgICAgICAgeT0iMTgyLjE3Nzk1IgogICAgICAgICBpZD0idHNwYW40MDEwIj4gICAgZWxzZSBpZiAodW5pdCA9PSAmcXVvdDtjb2x1bW4mcXVvdDspIG1vdmVPbmNlKHRydWUpOzwvdHNwYW4+PHRzcGFuCiAgICAgICAgIHNvZGlwb2RpOnJvbGU9ImxpbmUiCiAgICAgICAgIHg9IjI0Ny40ODczOCIKICAgICAgICAgeT0iMjAwLjkyNzk1IgogICAgICAgICBpZD0idHNwYW40MDEyIj4gICAgZWxzZSBpZiAodW5pdCA9PSAmcXVvdDt3b3JkJnF1b3Q7IHx8IHVuaXQgPT0gJnF1b3Q7Z3JvdXAmcXVvdDspIHs8L3RzcGFuPjx0c3BhbgogICAgICAgICBzb2RpcG9kaTpyb2xlPSJsaW5lIgogICAgICAgICB4PSIyNDcuNDg3MzgiCiAgICAgICAgIHk9IjIxOS42Nzc5NSIKICAgICAgICAgaWQ9InRzcGFuNDAxNCI+ICAgICAgdmFyIHNhd1R5cGUgPSBudWxsLCBncm91cCA9IHVuaXQgPT0gJnF1b3Q7Z3JvdXAmcXVvdDs7PC90c3Bhbj48dHNwYW4KICAgICAgICAgc29kaXBvZGk6cm9sZT0ibGluZSIKICAgICAgICAgeD0iMjQ3LjQ4NzM4IgogICAgICAgICB5PSIyMzguNDI3OTUiCiAgICAgICAgIGlkPSJ0c3BhbjQwMTYiPiAgICAgIGZvciAodmFyIGZpcnN0ID0gdHJ1ZTs7IGZpcnN0ID0gZmFsc2UpIHs8L3RzcGFuPjx0c3BhbgogICAgICAgICBzb2RpcG9kaTpyb2xlPSJsaW5lIgogICAgICAgICB4PSIyNDcuNDg3MzgiCiAgICAgICAgIHk9IjI1Ny4xNzc5NSIKICAgICAgICAgaWQ9InRzcGFuNDAxOCI+ICAgICAgICBpZiAoZGlyICZsdDsgMCAmYW1wOyZhbXA7ICFtb3ZlT25jZSghZmlyc3QpKSBicmVhazs8L3RzcGFuPjx0c3BhbgogICAgICAgICBzb2RpcG9kaTpyb2xlPSJsaW5lIgogICAgICAgICB4PSIyNDcuNDg3MzgiCiAgICAgICAgIHk9IjI3NS45Mjc5NSIKICAgICAgICAgaWQ9InRzcGFuNDAyMCI+ICAgICAgICB2YXIgY3VyID0gbGluZU9iai50ZXh0LmNoYXJBdChjaCkgfHwgJnF1b3Q7XG4mcXVvdDs7PC90c3Bhbj48dHNwYW4KICAgICAgICAgc29kaXBvZGk6cm9sZT0ibGluZSIKICAgICAgICAgeD0iMjQ3LjQ4NzM4IgogICAgICAgICB5PSIyOTQuNjc3OTUiCiAgICAgICAgIGlkPSJ0c3BhbjQwMjIiPiAgICAgICAgdmFyIHR5cGUgPSBpc1dvcmRDaGFyKGN1cikgPyAmcXVvdDt3JnF1b3Q7PC90c3Bhbj48dHNwYW4KICAgICAgICAgc29kaXBvZGk6cm9sZT0ibGluZSIKICAgICAgICAgeD0iMjQ3LjQ4NzM4IgogICAgICAgICB5PSIzMTMuNDI3OTUiCiAgICAgICAgIGlkPSJ0c3BhbjQwMjQiPiAgICAgICAgICA6ICFncm91cCA/IG51bGw8L3RzcGFuPjx0c3BhbgogICAgICAgICBzb2RpcG9kaTpyb2xlPSJsaW5lIgogICAgICAgICB4PSIyNDcuNDg3MzgiCiAgICAgICAgIHk9IjMzMi4xNzc5NSIKICAgICAgICAgaWQ9InRzcGFuNDAyNiI+ICAgICAgICAgIDogL1xzLy50ZXN0KGN1cikgPyBudWxsPC90c3Bhbj48dHNwYW4KICAgICAgICAgc29kaXBvZGk6cm9sZT0ibGluZSIKICAgICAgICAgeD0iMjQ3LjQ4NzM4IgogICAgICAgICB5PSIzNTAuOTI3OTUiCiAgICAgICAgIGlkPSJ0c3BhbjQwMjgiPiAgICAgICAgICA6ICZxdW90O3AmcXVvdDs7IC8vIHB1bmN0dWF0aW9uPC90c3Bhbj48dHNwYW4KICAgICAgICAgc29kaXBvZGk6cm9sZT0ibGluZSIKICAgICAgICAgeD0iMjQ3LjQ4NzM4IgogICAgICAgICB5PSIzNjkuNjc3OTUiCiAgICAgICAgIGlkPSJ0c3BhbjQwNDYiPiAgICAgICAgaWYgKHNhd1R5cGUgJmFtcDsmYW1wOyBzYXdUeXBlPC90c3Bhbj48L3RleHQ+CiAgICA8cGF0aAogICAgICAgc3R5bGU9ImZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtzdHJva2U6IzAwMDAwMDtzdHJva2Utb3BhY2l0eToxO3N0cm9rZS13aWR0aDoyO3N0cm9rZS1taXRlcmxpbWl0OjQ7c3Ryb2tlLWRhc2hhcnJheTpub25lIgogICAgICAgZD0iTSAzNzQuODQzNzUgMTM2LjgxMjUgQyAzNzEuOTY4NTQgMTM2LjcxMDAxIDM2OC42NDMwNSAxMzcuOTc5MTkgMzY1LjE1NjI1IDE0Mi4wMzEyNSBDIDM2MS45NzA1MSAxNDAuODQ2MDggMzU5LjIyMzQ3IDE0MC4zNTYyMiAzNTYuODQzNzUgMTQwLjM3NSBDIDM0Ni41MzE2MiAxNDAuNDU2NCAzNDMuMzEyNSAxNDkuNzE4NzUgMzQzLjMxMjUgMTQ5LjcxODc1IEMgMzI2LjIyMzQgMTQ2LjY3OTM0IDMyNS42MjUgMTYyLjU5Mzc1IDMyNS42MjUgMTYyLjU5Mzc1IEMgMzA5LjQzMTk1IDE2My4zNzEwMSAzMTIuNDM3NSAxNzcuMzc1IDMxMi40Mzc1IDE3Ny4zNzUgQyAyOTUuNjc4OTkgMTgwLjE1NjUxIDMwMS4xODc1IDE5NCAzMDEuMTg3NSAxOTQgQyAyODQuMTA4MzggMTk5LjA0NTc1IDI5My40Mzc1IDIxMi40Njg3NSAyOTMuNDM3NSAyMTIuNDY4NzUgQyAyOTMuNDM3NSAyMTIuNDY4NzUgMjc3LjY4MTc0IDIyMC4zMTI3MSAyODguMTg3NSAyMzIuMjUgQyAyODguMTg3NSAyMzIuMjUgMjczLjgxNzc2IDI0My42MzI4MiAyODUuOTA2MjUgMjUzLjM0Mzc1IEMgMjg1LjkwNjI1IDI1My4zNDM3NSAyNzEuNTc4OTcgMjYzLjk3NDg3IDI4Ni40MDYyNSAyNzUuMDMxMjUgQyAyODYuNDA2MjUgMjc1LjAzMTI1IDI3My44NDE0NyAyODUuNDgwMzYgMjg5Ljk2ODc1IDI5NS4zMTI1IEMgMjg5Ljk2ODc1IDI5NS4zMTI1IDI3OC45MjM3NCAzMDYuMDcxMDggMjk1LjU5Mzc1IDMxNC42NTYyNSBDIDI5NS41OTM3NSAzMTQuNjU2MjUgMjg3LjcwODQ0IDMyOS4wMTg2MiAzMDUuOTY4NzUgMzM1LjEyNSBDIDMwNS45Njg3NSAzMzUuMTI1IDMwMC40NzQ5NSAzNDguODg4NzQgMzE5LjA5Mzc1IDM1MS40Njg3NSBDIDMxOS4wOTM3NSAzNTEuNDY4NzUgMzE1LjkwMTYyIDM1Ny4xOTU2NCAzMjEuNTkzNzUgMzYxLjE1NjI1IEMgMzIxLjU5Mzc1IDM2MS4xNTYyNSAzMTAuMDQ0MTYgMzY0Ljc4NjYxIDMxMi41NjI1IDM3NC40MDYyNSBDIDMxMy44MzM2MSAzNzkuMjYxNzEgMzE2LjgyNjg0IDM4MC40OTE1OCAzMjMuNTMxMjUgMzgwLjE4NzUgQyAzMjMuNTMxMjUgMzgwLjE4NzUgMzI5LjA5NiAzOTUuNTQ4MTIgMzUwLjQ2ODc1IDM5OC45Njg3NSBMIDM1My4xMjUgNDAyLjU5Mzc1IEMgMzUzLjEyNSA0MDIuNTkzNzUgMzQyLjgwNTkyIDQwOS42NDA4OCAzNTkuMTI1IDQyMS41IEMgMzU5LjEyNSA0MjEuNSAzNTQuMTYxMjYgNDI1Ljc0MzE0IDM2My4yODEyNSA0MzMuMzQzNzUgQyAzNjMuMjgxMjUgNDMzLjM0Mzc1IDM1Ny41NDExNyA0MzguMzM2MiAzNjUuNzUgNDQyLjYyNSBDIDM2NS43NSA0NDIuNjI1IDM2MS4zNTgyMiA0NDUuOTYxNjYgMzY2LjA5Mzc1IDQ0OC4xMjUgQyAzNjYuMDkzNzUgNDQ4LjEyNSAzNzAuODgyOTMgNDkwLjE4MjYyIDM1NS40MDYyNSA1MzQuNDM3NSBDIDM1NS40MDYyNSA1MzQuNDM3NSAzNDEuMjg3MjEgNTQyLjA0NzgyIDM1MC4xODc1IDU1Ni45Njg3NSBDIDM1MC4xODc1IDU1Ni45Njg3NSAzMzEuNTk2NzUgNTYyLjI0MDkzIDM0NS4wOTM3NSA1NzUuNTMxMjUgQyAzNDUuMDkzNzUgNTc1LjUzMTI1IDM0Mi4wNTQ3IDU4NS41NjE1NSAzNDkuMzc1IDU4NS43ODEyNSBDIDM0OS4zNzUgNTg1Ljc4MTI1IDM0Ni4xNjA0OCA1OTIuNTQ1NTIgMzU0LjQzNzUgNTk0LjU2MjUgQyAzNTQuNDM3NSA1OTQuNTYyNSAzNTMuMTc4ODMgNjAzLjg4MTEzIDM2NC4wOTM3NSA2MDIuMTg3NSBDIDM2OS40NDgxMyA2MDguNDA5OTQgMzc4LjkyNzMzIDYwOC43MDUxOCAzODUuMjE4NzUgNjAyLjM0Mzc1IEMgMzk2LjEzMzYxIDYwNC4wMzczOCAzOTQuODc1IDU5NC43MTg3NSAzOTQuODc1IDU5NC43MTg3NSBDIDQwMy4xNTE5NyA1OTIuNzAxNzcgMzk5LjkzNzUgNTg1LjkzNzUgMzk5LjkzNzUgNTg1LjkzNzUgQyA0MDcuMjU3ODEgNTg1LjcxNzggNDA0LjIxODc1IDU3NS42ODc1IDQwNC4yMTg3NSA1NzUuNjg3NSBDIDQxNy43MTU3MyA1NjIuMzk3MTggMzk5LjEyNSA1NTcuMDkzNzUgMzk5LjEyNSA1NTcuMDkzNzUgQyA0MDguMDI1MyA1NDIuMTcyODIgMzkzLjkwNjI1IDUzNC41NjI1IDM5My45MDYyNSA1MzQuNTYyNSBDIDM3OC40Mjk1MyA0OTAuMzA3NjIgMzgzLjIxODc1IDQ0OC4yODEyNSAzODMuMjE4NzUgNDQ4LjI4MTI1IEMgMzg3Ljk1NDIxIDQ0Ni4xMTc5MSAzODMuNTYyNSA0NDIuNzgxMjUgMzgzLjU2MjUgNDQyLjc4MTI1IEMgMzkxLjc3MTI5IDQzOC40OTI0NSAzODYuMDMxMjUgNDMzLjUgMzg2LjAzMTI1IDQzMy41IEMgMzk1LjE1MTI1IDQyNS44OTkzOSAzOTAuMTg3NSA0MjEuNjU2MjUgMzkwLjE4NzUgNDIxLjY1NjI1IEMgNDA2LjUwNjYgNDA5Ljc5NzEzIDM5Ni4xODc1IDQwMi43NSAzOTYuMTg3NSA0MDIuNzUgTCAzOTguODQzNzUgMzk5LjEyNSBDIDQyMC4yMTY0OSAzOTUuNzA0MzcgNDI1Ljc4MTI1IDM4MC4zNDM3NSA0MjUuNzgxMjUgMzgwLjM0Mzc1IEMgNDMyLjQ4NTY2IDM4MC42NDc4MyA0MzUuNDc4ODkgMzc5LjQxNzk2IDQzNi43NSAzNzQuNTYyNSBDIDQzOS4yNjgzNCAzNjQuOTQyODYgNDI3Ljc1IDM2MS4zMTI1IDQyNy43NSAzNjEuMzEyNSBDIDQzMy40NDIxMyAzNTcuMzUxODggNDMwLjIxODc1IDM1MS41OTM3NSA0MzAuMjE4NzUgMzUxLjU5Mzc1IEMgNDQ4LjgzNzU1IDM0OS4wMTM3MyA0NDMuMzQzNzUgMzM1LjI4MTI1IDQ0My4zNDM3NSAzMzUuMjgxMjUgQyA0NjEuNjA0MDYgMzI5LjE3NDg3IDQ1My43MTg3NSAzMTQuNzgxMjUgNDUzLjcxODc1IDMxNC43ODEyNSBDIDQ3MC4zODg3NiAzMDYuMTk2MDggNDU5LjM0Mzc1IDI5NS40Njg3NSA0NTkuMzQzNzUgMjk1LjQ2ODc1IEMgNDc1LjQ3MTAzIDI4NS42MzY2MSA0NjIuOTA2MjUgMjc1LjE4NzUgNDYyLjkwNjI1IDI3NS4xODc1IEMgNDc3LjczMzUzIDI2NC4xMzExMiA0NjMuNDA2MjUgMjUzLjUgNDYzLjQwNjI1IDI1My41IEMgNDc1LjQ5NDc0IDI0My43ODkwNyA0NjEuMTU2MjUgMjMyLjM3NSA0NjEuMTU2MjUgMjMyLjM3NSBDIDQ3MS42NjIwMSAyMjAuNDM3NzEgNDU1Ljg3NSAyMTIuNjI1IDQ1NS44NzUgMjEyLjYyNSBDIDQ1NS44NzUgMjEyLjYyNSA0NjUuMjA0MTEgMTk5LjIwMiA0NDguMTI1IDE5NC4xNTYyNSBDIDQ0OC4xMjUgMTk0LjE1NjI1IDQ1My42NjQ3NiAxODAuMzEyNzYgNDM2LjkwNjI1IDE3Ny41MzEyNSBDIDQzNi45MDYyNSAxNzcuNTMxMjUgNDM5Ljg4MDU0IDE2My41MjcyNiA0MjMuNjg3NSAxNjIuNzUgQyA0MjMuNjg3NSAxNjIuNzUgNDIzLjA4OTEgMTQ2LjgzNTYgNDA2IDE0OS44NzUgQyA0MDYgMTQ5Ljg3NSA0MDEuMTQ2ODcgMTM1LjgzNTMyIDM4NC4xNTYyNSAxNDIuMTU2MjUgQyAzODQuMTU2MjUgMTQyLjE1NjI1IDM4MC4zMzI3OSAxMzcuMDA4MTUgMzc0Ljg0Mzc1IDEzNi44MTI1IHogTSAzNzUuMzQzNzUgMTU1IEMgNDE2LjM0ODggMTU1IDQ0OS41OTM3NSAyMDEuNzg5NDQgNDQ5LjU5Mzc1IDI1OS41MzEyNSBDIDQ0OS41OTM3NSAzMTcuMjczMDYgNDE2LjM0ODggMzY0LjA5Mzc1IDM3NS4zNDM3NSAzNjQuMDkzNzUgQyAzMzQuMzM4NyAzNjQuMDkzNzUgMzAxLjA5Mzc1IDMxNy4yNzMwNiAzMDEuMDkzNzUgMjU5LjUzMTI1IEMgMzAxLjA5Mzc1IDIwMS43ODk0NCAzMzQuMzM4NyAxNTUgMzc1LjM0Mzc1IDE1NSB6ICIKICAgICAgIGlkPSJyZWN0MzA1OCIgLz4KICAgIDx0ZXh0CiAgICAgICBzb2RpcG9kaTpsaW5lc3BhY2luZz0iMTI1JSIKICAgICAgIGlkPSJ0ZXh0NDIwNyIKICAgICAgIHk9IjQ5MS45MTQwMyIKICAgICAgIHg9IjE0OS42OTU0MiIKICAgICAgIHN0eWxlPSJmb250LXNpemU6OTVweDtmb250LXN0eWxlOm5vcm1hbDtmb250LXZhcmlhbnQ6bm9ybWFsO2ZvbnQtd2VpZ2h0Om5vcm1hbDtmb250LXN0cmV0Y2g6bm9ybWFsO2xpbmUtaGVpZ2h0OjEyNSU7bGV0dGVyLXNwYWNpbmc6MHB4O3dvcmQtc3BhY2luZzowcHg7ZmlsbDojYTIxMzEzO2ZpbGwtb3BhY2l0eToxO3N0cm9rZTpub25lO2ZvbnQtZmFtaWx5OlNvdXJjZSBTYW5zOy1pbmtzY2FwZS1mb250LXNwZWNpZmljYXRpb246U291cmNlIFNhbnMiCiAgICAgICB4bWw6c3BhY2U9InByZXNlcnZlIgogICAgICAgaW5rc2NhcGU6ZXhwb3J0LXhkcGk9IjkwIgogICAgICAgaW5rc2NhcGU6ZXhwb3J0LXlkcGk9IjkwIj48dHNwYW4KICAgICAgICAgeT0iNDkxLjkxNDAzIgogICAgICAgICB4PSIxNDkuNjk1NDIiCiAgICAgICAgIGlkPSJ0c3BhbjQyMDkiCiAgICAgICAgIHNvZGlwb2RpOnJvbGU9ImxpbmUiPkNvZGUgIE1pcnJvcjwvdHNwYW4+PC90ZXh0PgogIDwvZz4KPC9zdmc+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/doc/manual.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogVXNlciBNYW51YWw8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSJkb2NzLmNzcyI+CjxzY3JpcHQgc3JjPSJhY3RpdmVib29rbWFyay5qcyI+PC9zY3JpcHQ+Cgo8c2NyaXB0IHNyYz0iLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxzY3JpcHQgc3JjPSIuLi9hZGRvbi9ydW5tb2RlL3J1bm1vZGUuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vYWRkb24vcnVubW9kZS9jb2xvcml6ZS5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9tb2RlL2phdmFzY3JpcHQvamF2YXNjcmlwdC5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9tb2RlL3htbC94bWwuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vbW9kZS9jc3MvY3NzLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL21vZGUvaHRtbG1peGVkL2h0bWxtaXhlZC5qcyI+PC9zY3JpcHQ+CjxzdHlsZT4KICBkdCB7IHRleHQtaW5kZW50OiAtMmVtOyBwYWRkaW5nLWxlZnQ6IDJlbTsgbWFyZ2luLXRvcDogMWVtOyB9CiAgZGQgeyBtYXJnaW4tbGVmdDogMS41ZW07IG1hcmdpbi1ib3R0b206IDFlbTsgfQogIGR0IHttYXJnaW4tdG9wOiAxZW07fQogIGRkIGRsLCBkZCBkdCwgZGQgZGQsIGRkIHVsIHsgbWFyZ2luLXRvcDogMDsgbWFyZ2luLWJvdHRvbTogMDsgfQogIGR0ICsgZHQgeyBtYXJnaW4tdG9wOiAwOyB9CiAgZHQuY29tbWFuZCB7IHBvc2l0aW9uOiByZWxhdGl2ZTsgfQogIHNwYW4ua2V5YmluZGluZyB7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgcmlnaHQ6IDA7IGZvbnQtc2l6ZTogODAlOyBjb2xvcjogIzU1NTsgdGV4dC1pbmRlbnQ6IDA7IH0KPC9zdHlsZT4KCjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGltZyBpZD1sb2dvIHNyYz0ibG9nby5wbmciPjwvYT4KICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+SG9tZTwvYT48L2xpPgogICAgPGxpPjxhIGhyZWY9IiNvdmVydmlldyIgY2xhc3M9YWN0aXZlIGRhdGEtZGVmYXVsdD0idHJ1ZSI+TWFudWFsPC9hPjwvbGk+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvY29kZW1pcnJvciI+Q29kZTwvYT48L2xpPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9IiN1c2FnZSI+QmFzaWMgVXNhZ2U8L2E+PC9saT4KICAgIDxsaT48YSBocmVmPSIjY29uZmlnIj5Db25maWd1cmF0aW9uPC9hPjwvbGk+CiAgICA8bGk+PGEgaHJlZj0iI2V2ZW50cyI+RXZlbnRzPC9hPjwvbGk+CiAgICA8bGk+PGEgaHJlZj0iI2tleW1hcHMiPktleSBtYXBzPC9hPjwvbGk+CiAgICA8bGk+PGEgaHJlZj0iI2NvbW1hbmRzIj5Db21tYW5kczwvYT48L2xpPgogICAgPGxpPjxhIGhyZWY9IiNzdHlsaW5nIj5DdXN0b21pemVkIFN0eWxpbmc8L2E+PC9saT4KICAgIDxsaT48YSBocmVmPSIjYXBpIj5Qcm9ncmFtbWluZyBBUEk8L2E+CiAgICAgIDx1bD4KICAgICAgICA8bGk+PGEgaHJlZj0iI2FwaV9jb25zdHJ1Y3RvciI+Q29uc3RydWN0b3I8L2E+PC9saT4KICAgICAgICA8bGk+PGEgaHJlZj0iI2FwaV9jb250ZW50Ij5Db250ZW50IG1hbmlwdWxhdGlvbjwvYT48L2xpPgogICAgICAgIDxsaT48YSBocmVmPSIjYXBpX3NlbGVjdGlvbiI+U2VsZWN0aW9uPC9hPjwvbGk+CiAgICAgICAgPGxpPjxhIGhyZWY9IiNhcGlfY29uZmlndXJhdGlvbiI+Q29uZmlndXJhdGlvbjwvYT48L2xpPgogICAgICAgIDxsaT48YSBocmVmPSIjYXBpX2RvYyI+RG9jdW1lbnQgbWFuYWdlbWVudDwvYT48L2xpPgogICAgICAgIDxsaT48YSBocmVmPSIjYXBpX2hpc3RvcnkiPkhpc3Rvcnk8L2E+PC9saT4KICAgICAgICA8bGk+PGEgaHJlZj0iI2FwaV9tYXJrZXIiPlRleHQtbWFya2luZzwvYT48L2xpPgogICAgICAgIDxsaT48YSBocmVmPSIjYXBpX2RlY29yYXRpb24iPldpZGdldCwgZ3V0dGVyLCBhbmQgZGVjb3JhdGlvbjwvYT48L2xpPgogICAgICAgIDxsaT48YSBocmVmPSIjYXBpX3NpemluZyI+U2l6aW5nLCBzY3JvbGxpbmcsIGFuZCBwb3NpdGlvbmluZzwvYT48L2xpPgogICAgICAgIDxsaT48YSBocmVmPSIjYXBpX21vZGUiPk1vZGUsIHN0YXRlLCBhbmQgdG9rZW5zPC9hPjwvbGk+CiAgICAgICAgPGxpPjxhIGhyZWY9IiNhcGlfbWlzYyI+TWlzY2VsbGFuZW91cyBtZXRob2RzPC9hPjwvbGk+CiAgICAgICAgPGxpPjxhIGhyZWY9IiNhcGlfc3RhdGljIj5TdGF0aWMgcHJvcGVydGllczwvYT48L2xpPgogICAgICA8L3VsPgogICAgPC9saT4KICAgIDxsaT48YSBocmVmPSIjYWRkb25zIj5BZGRvbnM8L2E+PC9saT4KICAgIDxsaT48YSBocmVmPSIjbW9kZWFwaSI+V3JpdGluZyBDb2RlTWlycm9yIE1vZGVzPC9hPjwvbGk+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KCjxzZWN0aW9uIGNsYXNzPWZpcnN0IGlkPW92ZXJ2aWV3PgogICAgPGgyIHN0eWxlPSJwb3NpdGlvbjogcmVsYXRpdmUiPgogICAgICBVc2VyIG1hbnVhbCBhbmQgcmVmZXJlbmNlIGd1aWRlCiAgICAgIDxzcGFuIHN0eWxlPSJjb2xvcjogIzg4ODsgZm9udC1zaXplOiAxcmVtOyBwb3NpdGlvbjogYWJzb2x1dGU7IHJpZ2h0OiAwOyBib3R0b206IDAiPnZlcnNpb24gNC40LjA8L3NwYW4+CiAgICA8L2gyPgoKICAgIDxwPkNvZGVNaXJyb3IgaXMgYSBjb2RlLWVkaXRvciBjb21wb25lbnQgdGhhdCBjYW4gYmUgZW1iZWRkZWQgaW4KICAgIFdlYiBwYWdlcy4gVGhlIGNvcmUgbGlicmFyeSBwcm92aWRlcyA8ZW0+b25seTwvZW0+IHRoZSBlZGl0b3IKICAgIGNvbXBvbmVudCwgbm8gYWNjb21wYW55aW5nIGJ1dHRvbnMsIGF1dG8tY29tcGxldGlvbiwgb3Igb3RoZXIgSURFCiAgICBmdW5jdGlvbmFsaXR5LiBJdCBkb2VzIHByb3ZpZGUgYSByaWNoIEFQSSBvbiB0b3Agb2Ygd2hpY2ggc3VjaAogICAgZnVuY3Rpb25hbGl0eSBjYW4gYmUgc3RyYWlnaHRmb3J3YXJkbHkgaW1wbGVtZW50ZWQuIFNlZQogICAgdGhlIDxhIGhyZWY9IiNhZGRvbnMiPmFkZG9uczwvYT4gaW5jbHVkZWQgaW4gdGhlIGRpc3RyaWJ1dGlvbiwKICAgIGFuZCB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvQ29kZU1pcnJvci93aWtpL0NvZGVNaXJyb3ItYWRkb25zIj5saXN0CiAgICBvZiBleHRlcm5hbGx5IGhvc3RlZCBhZGRvbnM8L2E+LCBmb3IgcmV1c2FibGUKICAgIGltcGxlbWVudGF0aW9ucyBvZiBleHRyYSBmZWF0dXJlcy48L3A+CgogICAgPHA+Q29kZU1pcnJvciB3b3JrcyB3aXRoIGxhbmd1YWdlLXNwZWNpZmljIG1vZGVzLiBNb2RlcyBhcmUKICAgIEphdmFTY3JpcHQgcHJvZ3JhbXMgdGhhdCBoZWxwIGNvbG9yIChhbmQgb3B0aW9uYWxseSBpbmRlbnQpIHRleHQKICAgIHdyaXR0ZW4gaW4gYSBnaXZlbiBsYW5ndWFnZS4gVGhlIGRpc3RyaWJ1dGlvbiBjb21lcyB3aXRoIGEgbnVtYmVyCiAgICBvZiBtb2RlcyAoc2VlIHRoZSA8YSBocmVmPSIuLi9tb2RlLyI+PGNvZGU+bW9kZS88L2NvZGU+PC9hPgogICAgZGlyZWN0b3J5KSwgYW5kIGl0IGlzbid0IGhhcmQgdG8gPGEgaHJlZj0iI21vZGVhcGkiPndyaXRlIG5ldwogICAgb25lczwvYT4gZm9yIG90aGVyIGxhbmd1YWdlcy48L3A+Cjwvc2VjdGlvbj4KCjxzZWN0aW9uIGlkPXVzYWdlPgogICAgPGgyPkJhc2ljIFVzYWdlPC9oMj4KCiAgICA8cD5UaGUgZWFzaWVzdCB3YXkgdG8gdXNlIENvZGVNaXJyb3IgaXMgdG8gc2ltcGx5IGxvYWQgdGhlIHNjcmlwdAogICAgYW5kIHN0eWxlIHNoZWV0IGZvdW5kIHVuZGVyIDxjb2RlPmxpYi88L2NvZGU+IGluIHRoZSBkaXN0cmlidXRpb24sCiAgICBwbHVzIGEgbW9kZSBzY3JpcHQgZnJvbSBvbmUgb2YgdGhlIDxjb2RlPm1vZGUvPC9jb2RlPiBkaXJlY3Rvcmllcy4KICAgIChTZWUgPGEgaHJlZj0iY29tcHJlc3MuaHRtbCI+dGhlIGNvbXByZXNzaW9uIGhlbHBlcjwvYT4gZm9yIGFuCiAgICBlYXN5IHdheSB0byBjb21iaW5lIHNjcmlwdHMuKSBGb3IgZXhhbXBsZTo8L3A+CgogICAgPHByZSBkYXRhLWxhbmc9InRleHQvaHRtbCI+Jmx0O3NjcmlwdCBzcmM9ImxpYi9jb2RlbWlycm9yLmpzIj4mbHQ7L3NjcmlwdD4KJmx0O2xpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9saWIvY29kZW1pcnJvci5jc3MiPgombHQ7c2NyaXB0IHNyYz0ibW9kZS9qYXZhc2NyaXB0L2phdmFzY3JpcHQuanMiPiZsdDsvc2NyaXB0PjwvcHJlPgoKICAgIDxwPihBbHRlcm5hdGl2ZWx5LCB1c2UgYSBtb2R1bGUgbG9hZGVyLiA8YSBocmVmPSIjbW9kbG9hZGVyIj5Nb3JlCiAgICBhYm91dCB0aGF0IGxhdGVyLjwvYT4pPC9wPgoKICAgIDxwPkhhdmluZyBkb25lIHRoaXMsIGFuIGVkaXRvciBpbnN0YW5jZSBjYW4gYmUgY3JlYXRlZCBsaWtlCiAgICB0aGlzOjwvcD4KCiAgICA8cHJlIGRhdGEtbGFuZz0iamF2YXNjcmlwdCI+dmFyIG15Q29kZU1pcnJvciA9IENvZGVNaXJyb3IoZG9jdW1lbnQuYm9keSk7PC9wcmU+CgogICAgPHA+VGhlIGVkaXRvciB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBkb2N1bWVudCBib2R5LCB3aWxsIHN0YXJ0CiAgICBlbXB0eSwgYW5kIHdpbGwgdXNlIHRoZSBtb2RlIHRoYXQgd2UgbG9hZGVkLiBUbyBoYXZlIG1vcmUgY29udHJvbAogICAgb3ZlciB0aGUgbmV3IGVkaXRvciwgYSBjb25maWd1cmF0aW9uIG9iamVjdCBjYW4gYmUgcGFzc2VkCiAgICB0byA8YSBocmVmPSIjQ29kZU1pcnJvciI+PGNvZGU+Q29kZU1pcnJvcjwvY29kZT48L2E+IGFzIGEgc2Vjb25kCiAgICBhcmd1bWVudDo8L3A+CgogICAgPHByZSBkYXRhLWxhbmc9ImphdmFzY3JpcHQiPnZhciBteUNvZGVNaXJyb3IgPSBDb2RlTWlycm9yKGRvY3VtZW50LmJvZHksIHsKICB2YWx1ZTogImZ1bmN0aW9uIG15U2NyaXB0KCl7cmV0dXJuIDEwMDt9XG4iLAogIG1vZGU6ICAiamF2YXNjcmlwdCIKfSk7PC9wcmU+CgogICAgPHA+VGhpcyB3aWxsIGluaXRpYWxpemUgdGhlIGVkaXRvciB3aXRoIGEgcGllY2Ugb2YgY29kZSBhbHJlYWR5IGluCiAgICBpdCwgYW5kIGV4cGxpY2l0bHkgdGVsbCBpdCB0byB1c2UgdGhlIEphdmFTY3JpcHQgbW9kZSAod2hpY2ggaXMKICAgIHVzZWZ1bCB3aGVuIG11bHRpcGxlIG1vZGVzIGFyZSBsb2FkZWQpLgogICAgU2VlIDxhIGhyZWY9IiNjb25maWciPmJlbG93PC9hPiBmb3IgYSBmdWxsIGRpc2N1c3Npb24gb2YgdGhlCiAgICBjb25maWd1cmF0aW9uIG9wdGlvbnMgdGhhdCBDb2RlTWlycm9yIGFjY2VwdHMuPC9wPgoKICAgIDxwPkluIGNhc2VzIHdoZXJlIHlvdSBkb24ndCB3YW50IHRvIGFwcGVuZCB0aGUgZWRpdG9yIHRvIGFuCiAgICBlbGVtZW50LCBhbmQgbmVlZCBtb3JlIGNvbnRyb2wgb3ZlciB0aGUgd2F5IGl0IGlzIGluc2VydGVkLCB0aGUKICAgIGZpcnN0IGFyZ3VtZW50IHRvIHRoZSA8Y29kZT5Db2RlTWlycm9yPC9jb2RlPiBmdW5jdGlvbiBjYW4gYWxzbwogICAgYmUgYSBmdW5jdGlvbiB0aGF0LCB3aGVuIGdpdmVuIGEgRE9NIGVsZW1lbnQsIGluc2VydHMgaXQgaW50byB0aGUKICAgIGRvY3VtZW50IHNvbWV3aGVyZS4gVGhpcyBjb3VsZCBiZSB1c2VkIHRvLCBmb3IgZXhhbXBsZSwgcmVwbGFjZSBhCiAgICB0ZXh0YXJlYSB3aXRoIGEgcmVhbCBlZGl0b3I6PC9wPgoKICAgIDxwcmUgZGF0YS1sYW5nPSJqYXZhc2NyaXB0Ij52YXIgbXlDb2RlTWlycm9yID0gQ29kZU1pcnJvcihmdW5jdGlvbihlbHQpIHsKICBteVRleHRBcmVhLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGVsdCwgbXlUZXh0QXJlYSk7Cn0sIHt2YWx1ZTogbXlUZXh0QXJlYS52YWx1ZX0pOzwvcHJlPgoKICAgIDxwPkhvd2V2ZXIsIGZvciB0aGlzIHVzZSBjYXNlLCB3aGljaCBpcyBhIGNvbW1vbiB3YXkgdG8gdXNlCiAgICBDb2RlTWlycm9yLCB0aGUgbGlicmFyeSBwcm92aWRlcyBhIG11Y2ggbW9yZSBwb3dlcmZ1bAogICAgc2hvcnRjdXQ6PC9wPgoKICAgIDxwcmUgZGF0YS1sYW5nPSJqYXZhc2NyaXB0Ij52YXIgbXlDb2RlTWlycm9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEobXlUZXh0QXJlYSk7PC9wcmU+CgogICAgPHA+VGhpcyB3aWxsLCBhbW9uZyBvdGhlciB0aGluZ3MsIGVuc3VyZSB0aGF0IHRoZSB0ZXh0YXJlYSdzIHZhbHVlCiAgICBpcyB1cGRhdGVkIHdpdGggdGhlIGVkaXRvcidzIGNvbnRlbnRzIHdoZW4gdGhlIGZvcm0gKGlmIGl0IGlzIHBhcnQKICAgIG9mIGEgZm9ybSkgaXMgc3VibWl0dGVkLiBTZWUgdGhlIDxhIGhyZWY9IiNmcm9tVGV4dEFyZWEiPkFQSQogICAgcmVmZXJlbmNlPC9hPiBmb3IgYSBmdWxsIGRlc2NyaXB0aW9uIG9mIHRoaXMgbWV0aG9kLjwvcD4KCiAgICA8aDMgaWQ9bW9kbG9hZGVyPk1vZHVsZSBsb2FkZXJzPC9oMz4KCiAgICA8cD5UaGUgZmlsZXMgaW4gdGhlIENvZGVNaXJyb3IgZGlzdHJpYnV0aW9uIGNvbnRhaW4gc2hpbXMgZm9yCiAgICBsb2FkaW5nIHRoZW0gKGFuZCB0aGVpciBkZXBlbmRlbmNpZXMpIGluIEFNRCBvciBDb21tb25KUwogICAgZW52aXJvbm1lbnRzLiBJZiB0aGUgdmFyaWFibGVzIDxjb2RlPmV4cG9ydHM8L2NvZGU+CiAgICBhbmQgPGNvZGU+bW9kdWxlPC9jb2RlPiBleGlzdCBhbmQgaGF2ZSB0eXBlIG9iamVjdCwgQ29tbW9uSlMtc3R5bGUKICAgIHJlcXVpcmUgd2lsbCBiZSB1c2VkLiBJZiBub3QsIGJ1dCB0aGVyZSBpcyBhCiAgICBmdW5jdGlvbiA8Y29kZT5kZWZpbmU8L2NvZGU+IHdpdGggYW4gPGNvZGU+YW1kPC9jb2RlPiBwcm9wZXJ0eQogICAgcHJlc2VudCwgQU1ELXN0eWxlIChSZXF1aXJlSlMpIHdpbGwgYmUgdXNlZC48L3A+CgogICAgPHA+SXQgaXMgcG9zc2libGUgdG8KICAgIHVzZSA8YSBocmVmPSJodHRwOi8vYnJvd3NlcmlmeS5vcmcvIj5Ccm93c2VyaWZ5PC9hPiBvciBzaW1pbGFyCiAgICB0b29scyB0byBzdGF0aWNhbGx5IGJ1aWxkIG1vZHVsZXMgdXNpbmcgQ29kZU1pcnJvci4gQWx0ZXJuYXRpdmVseSwKICAgIHVzZSA8YSBocmVmPSJodHRwOi8vcmVxdWlyZWpzLm9yZy8iPlJlcXVpcmVKUzwvYT4gdG8gZHluYW1pY2FsbHkKICAgIGxvYWQgZGVwZW5kZW5jaWVzIGF0IHJ1bnRpbWUuIEJvdGggb2YgdGhlc2UgYXBwcm9hY2hlcyBoYXZlIHRoZQogICAgYWR2YW50YWdlIHRoYXQgdGhleSBkb24ndCB1c2UgdGhlIGdsb2JhbCBuYW1lc3BhY2UgYW5kIGNhbiwgdGh1cywKICAgIGRvIHRoaW5ncyBsaWtlIGxvYWQgbXVsdGlwbGUgdmVyc2lvbnMgb2YgQ29kZU1pcnJvciBhbG9uZ3NpZGUgZWFjaAogICAgb3RoZXIuPC9wPgoKICAgIDxwPkhlcmUncyBhIHNpbXBsZSBleGFtcGxlIG9mIHVzaW5nIFJlcXVpcmVKUyB0byBsb2FkIENvZGVNaXJyb3I6PC9wPgoKICAgIDxwcmUgZGF0YS1sYW5nPSJqYXZhc2NyaXB0Ij5yZXF1aXJlKFsKICAiY20vbGliL2NvZGVtaXJyb3IiLCAiY20vbW9kZS9odG1sbWl4ZWQvaHRtbG1peGVkIgpdLCBmdW5jdGlvbihDb2RlTWlycm9yKSB7CiAgQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgbGluZU51bWJlcnM6IHRydWUsCiAgICBtb2RlOiAiaHRtbG1peGVkIgogIH0pOwp9KTs8L3ByZT4KCiAgICA8cD5JdCB3aWxsIGF1dG9tYXRpY2FsbHkgbG9hZCB0aGUgbW9kZXMgdGhhdCB0aGUgbWl4ZWQgSFRNTCBtb2RlCiAgICBkZXBlbmRzIG9uIChYTUwsIEphdmFTY3JpcHQsIGFuZCBDU1MpLjwvcD4KCjwvc2VjdGlvbj4KCjxzZWN0aW9uIGlkPWNvbmZpZz4KICAgIDxoMj5Db25maWd1cmF0aW9uPC9oMj4KCiAgICA8cD5Cb3RoIHRoZSA8YSBocmVmPSIjQ29kZU1pcnJvciI+PGNvZGU+Q29kZU1pcnJvcjwvY29kZT48L2E+CiAgICBmdW5jdGlvbiBhbmQgaXRzIDxjb2RlPmZyb21UZXh0QXJlYTwvY29kZT4gbWV0aG9kIHRha2UgYXMgc2Vjb25kCiAgICAob3B0aW9uYWwpIGFyZ3VtZW50IGFuIG9iamVjdCBjb250YWluaW5nIGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4KICAgIEFueSBvcHRpb24gbm90IHN1cHBsaWVkIGxpa2UgdGhpcyB3aWxsIGJlIHRha2VuCiAgICBmcm9tIDxhIGhyZWY9IiNkZWZhdWx0cyI+PGNvZGU+Q29kZU1pcnJvci5kZWZhdWx0czwvY29kZT48L2E+LCBhbgogICAgb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGRlZmF1bHQgb3B0aW9ucy4gWW91IGNhbiB1cGRhdGUgdGhpcyBvYmplY3QKICAgIHRvIGNoYW5nZSB0aGUgZGVmYXVsdHMgb24geW91ciBwYWdlLjwvcD4KCiAgICA8cD5PcHRpb25zIGFyZSBub3QgY2hlY2tlZCBpbiBhbnkgd2F5LCBzbyBzZXR0aW5nIGJvZ3VzIG9wdGlvbgogICAgdmFsdWVzIGlzIGJvdW5kIHRvIGxlYWQgdG8gb2RkIGVycm9ycy48L3A+CgogICAgPHA+VGhlc2UgYXJlIHRoZSBzdXBwb3J0ZWQgb3B0aW9uczo8L3A+CgogICAgPGRsPgogICAgICA8ZHQgaWQ9Im9wdGlvbl92YWx1ZSI+PGNvZGU+PHN0cm9uZz52YWx1ZTwvc3Ryb25nPjogc3RyaW5nfENvZGVNaXJyb3IuRG9jPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5UaGUgc3RhcnRpbmcgdmFsdWUgb2YgdGhlIGVkaXRvci4gQ2FuIGJlIGEgc3RyaW5nLCBvcgogICAgICBhIDxhIGhyZWY9IiNhcGlfZG9jIj5kb2N1bWVudCBvYmplY3Q8L2E+LjwvZGQ+CgogICAgICA8ZHQgaWQ9Im9wdGlvbl9tb2RlIj48Y29kZT48c3Ryb25nPm1vZGU8L3N0cm9uZz46IHN0cmluZ3xvYmplY3Q8L2NvZGU+PC9kdD4KICAgICAgPGRkPlRoZSBtb2RlIHRvIHVzZS4gV2hlbiBub3QgZ2l2ZW4sIHRoaXMgd2lsbCBkZWZhdWx0IHRvIHRoZQogICAgICBmaXJzdCBtb2RlIHRoYXQgd2FzIGxvYWRlZC4gSXQgbWF5IGJlIGEgc3RyaW5nLCB3aGljaCBlaXRoZXIKICAgICAgc2ltcGx5IG5hbWVzIHRoZSBtb2RlIG9yIGlzCiAgICAgIGEgPGEgaHJlZj0iaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9NSU1FIj5NSU1FPC9hPiB0eXBlCiAgICAgIGFzc29jaWF0ZWQgd2l0aCB0aGUgbW9kZS4gQWx0ZXJuYXRpdmVseSwgaXQgbWF5IGJlIGFuIG9iamVjdAogICAgICBjb250YWluaW5nIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIG1vZGUsIHdpdGgKICAgICAgYSA8Y29kZT5uYW1lPC9jb2RlPiBwcm9wZXJ0eSB0aGF0IG5hbWVzIHRoZSBtb2RlIChmb3IKICAgICAgZXhhbXBsZSA8Y29kZT57bmFtZTogImphdmFzY3JpcHQiLCBqc29uOiB0cnVlfTwvY29kZT4pLiBUaGUgZGVtbwogICAgICBwYWdlcyBmb3IgZWFjaCBtb2RlIGNvbnRhaW4gaW5mb3JtYXRpb24gYWJvdXQgd2hhdCBjb25maWd1cmF0aW9uCiAgICAgIHBhcmFtZXRlcnMgdGhlIG1vZGUgc3VwcG9ydHMuIFlvdSBjYW4gYXNrIENvZGVNaXJyb3Igd2hpY2ggbW9kZXMKICAgICAgYW5kIE1JTUUgdHlwZXMgaGF2ZSBiZWVuIGRlZmluZWQgYnkgaW5zcGVjdGluZwogICAgICB0aGUgPGNvZGU+Q29kZU1pcnJvci5tb2RlczwvY29kZT4KICAgICAgYW5kIDxjb2RlPkNvZGVNaXJyb3IubWltZU1vZGVzPC9jb2RlPiBvYmplY3RzLiBUaGUgZmlyc3QgbWFwcwogICAgICBtb2RlIG5hbWVzIHRvIHRoZWlyIGNvbnN0cnVjdG9ycywgYW5kIHRoZSBzZWNvbmQgbWFwcyBNSU1FIHR5cGVzCiAgICAgIHRvIG1vZGUgc3BlY3MuPC9kZD4KCiAgICAgIDxkdCBpZD0ib3B0aW9uX3RoZW1lIj48Y29kZT48c3Ryb25nPnRoZW1lPC9zdHJvbmc+OiBzdHJpbmc8L2NvZGU+PC9kdD4KICAgICAgPGRkPlRoZSB0aGVtZSB0byBzdHlsZSB0aGUgZWRpdG9yIHdpdGguIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGUKICAgICAgQ1NTIGZpbGUgZGVmaW5pbmcgdGhlIGNvcnJlc3BvbmRpbmcgPGNvZGU+LmNtLXMtW25hbWVdPC9jb2RlPgogICAgICBzdHlsZXMgaXMgbG9hZGVkIChzZWUKICAgICAgdGhlIDxhIGhyZWY9Ii4uL3RoZW1lLyI+PGNvZGU+dGhlbWU8L2NvZGU+PC9hPiBkaXJlY3RvcnkgaW4gdGhlCiAgICAgIGRpc3RyaWJ1dGlvbikuIFRoZSBkZWZhdWx0IGlzIDxjb2RlPiJkZWZhdWx0IjwvY29kZT4sIGZvciB3aGljaAogICAgICBjb2xvcnMgYXJlIGluY2x1ZGVkIGluIDxjb2RlPmNvZGVtaXJyb3IuY3NzPC9jb2RlPi4gSXQgaXMKICAgICAgcG9zc2libGUgdG8gdXNlIG11bHRpcGxlIHRoZW1pbmcgY2xhc3NlcyBhdCBvbmNl4oCUZm9yCiAgICAgIGV4YW1wbGUgPGNvZGU+ImZvbyBiYXIiPC9jb2RlPiB3aWxsIGFzc2lnbiBib3RoCiAgICAgIHRoZSA8Y29kZT5jbS1zLWZvbzwvY29kZT4gYW5kIHRoZSA8Y29kZT5jbS1zLWJhcjwvY29kZT4gY2xhc3NlcwogICAgICB0byB0aGUgZWRpdG9yLjwvZGQ+CgogICAgICA8ZHQgaWQ9Im9wdGlvbl9pbmRlbnRVbml0Ij48Y29kZT48c3Ryb25nPmluZGVudFVuaXQ8L3N0cm9uZz46IGludGVnZXI8L2NvZGU+PC9kdD4KICAgICAgPGRkPkhvdyBtYW55IHNwYWNlcyBhIGJsb2NrICh3aGF0ZXZlciB0aGF0IG1lYW5zIGluIHRoZSBlZGl0ZWQKICAgICAgbGFuZ3VhZ2UpIHNob3VsZCBiZSBpbmRlbnRlZC4gVGhlIGRlZmF1bHQgaXMgMi48L2RkPgoKICAgICAgPGR0IGlkPSJvcHRpb25fc21hcnRJbmRlbnQiPjxjb2RlPjxzdHJvbmc+c21hcnRJbmRlbnQ8L3N0cm9uZz46IGJvb2xlYW48L2NvZGU+PC9kdD4KICAgICAgPGRkPldoZXRoZXIgdG8gdXNlIHRoZSBjb250ZXh0LXNlbnNpdGl2ZSBpbmRlbnRhdGlvbiB0aGF0IHRoZQogICAgICBtb2RlIHByb3ZpZGVzIChvciBqdXN0IGluZGVudCB0aGUgc2FtZSBhcyB0aGUgbGluZSBiZWZvcmUpLgogICAgICBEZWZhdWx0cyB0byB0cnVlLjwvZGQ+CgogICAgICA8ZHQgaWQ9Im9wdGlvbl90YWJTaXplIj48Y29kZT48c3Ryb25nPnRhYlNpemU8L3N0cm9uZz46IGludGVnZXI8L2NvZGU+PC9kdD4KICAgICAgPGRkPlRoZSB3aWR0aCBvZiBhIHRhYiBjaGFyYWN0ZXIuIERlZmF1bHRzIHRvIDQuPC9kZD4KCiAgICAgIDxkdCBpZD0ib3B0aW9uX2luZGVudFdpdGhUYWJzIj48Y29kZT48c3Ryb25nPmluZGVudFdpdGhUYWJzPC9zdHJvbmc+OiBib29sZWFuPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5XaGV0aGVyLCB3aGVuIGluZGVudGluZywgdGhlIGZpcnN0IE4qPGNvZGU+dGFiU2l6ZTwvY29kZT4KICAgICAgc3BhY2VzIHNob3VsZCBiZSByZXBsYWNlZCBieSBOIHRhYnMuIERlZmF1bHQgaXMgZmFsc2UuPC9kZD4KCiAgICAgIDxkdCBpZD0ib3B0aW9uX2VsZWN0cmljQ2hhcnMiPjxjb2RlPjxzdHJvbmc+ZWxlY3RyaWNDaGFyczwvc3Ryb25nPjogYm9vbGVhbjwvY29kZT48L2R0PgogICAgICA8ZGQ+Q29uZmlndXJlcyB3aGV0aGVyIHRoZSBlZGl0b3Igc2hvdWxkIHJlLWluZGVudCB0aGUgY3VycmVudAogICAgICBsaW5lIHdoZW4gYSBjaGFyYWN0ZXIgaXMgdHlwZWQgdGhhdCBtaWdodCBjaGFuZ2UgaXRzIHByb3BlcgogICAgICBpbmRlbnRhdGlvbiAob25seSB3b3JrcyBpZiB0aGUgbW9kZSBzdXBwb3J0cyBpbmRlbnRhdGlvbikuCiAgICAgIERlZmF1bHQgaXMgdHJ1ZS48L2RkPgoKICAgICAgPGR0IGlkPSJvcHRpb25fc3BlY2lhbENoYXJzIj48Y29kZT48c3Ryb25nPnNwZWNpYWxDaGFyczwvc3Ryb25nPjogUmVnRXhwPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5BIHJlZ3VsYXIgZXhwcmVzc2lvbiB1c2VkIHRvIGRldGVybWluZSB3aGljaCBjaGFyYWN0ZXJzCiAgICAgIHNob3VsZCBiZSByZXBsYWNlZCBieSBhCiAgICAgIHNwZWNpYWwgPGEgaHJlZj0iI29wdGlvbl9zcGVjaWFsQ2hhclBsYWNlaG9sZGVyIj5wbGFjZWhvbGRlcjwvYT4uCiAgICAgIE1vc3RseSB1c2VmdWwgZm9yIG5vbi1wcmludGluZyBzcGVjaWFsIGNoYXJhY3RlcnMuIFRoZSBkZWZhdWx0CiAgICAgIGlzIDxjb2RlPi9bXHUwMDAwLVx1MDAxOVx1MDBhZFx1MjAwYlx1MjAyOFx1MjAyOVx1ZmVmZl0vPC9jb2RlPi48L2RkPgogICAgICA8ZHQgaWQ9Im9wdGlvbl9zcGVjaWFsQ2hhclBsYWNlaG9sZGVyIj48Y29kZT48c3Ryb25nPnNwZWNpYWxDaGFyUGxhY2Vob2xkZXI8L3N0cm9uZz46IGZ1bmN0aW9uKGNoYXIpwqDihpLCoEVsZW1lbnQ8L2NvZGU+PC9kdD4KICAgICAgPGRkPkEgZnVuY3Rpb24gdGhhdCwgZ2l2ZW4gYSBzcGVjaWFsIGNoYXJhY3RlciBpZGVudGlmaWVkIGJ5CiAgICAgIHRoZSA8YSBocmVmPSIjb3B0aW9uX3NwZWNpYWxDaGFycyI+PGNvZGU+c3BlY2lhbENoYXJzPC9jb2RlPjwvYT4KICAgICAgb3B0aW9uLCBwcm9kdWNlcyBhIERPTSBub2RlIHRoYXQgaXMgdXNlZCB0byByZXByZXNlbnQgdGhlCiAgICAgIGNoYXJhY3Rlci4gQnkgZGVmYXVsdCwgYSByZWQgZG90ICg8c3BhbiBzdHlsZT0iY29sb3I6IHJlZCI+4oCiPC9zcGFuPikKICAgICAgaXMgc2hvd24sIHdpdGggYSB0aXRsZSB0b29sdGlwIHRvIGluZGljYXRlIHRoZSBjaGFyYWN0ZXIgY29kZS48L2RkPgoKICAgICAgPGR0IGlkPSJvcHRpb25fcnRsTW92ZVZpc3VhbGx5Ij48Y29kZT48c3Ryb25nPnJ0bE1vdmVWaXN1YWxseTwvc3Ryb25nPjogYm9vbGVhbjwvY29kZT48L2R0PgogICAgICA8ZGQ+RGV0ZXJtaW5lcyB3aGV0aGVyIGhvcml6b250YWwgY3Vyc29yIG1vdmVtZW50IHRocm91Z2gKICAgICAgcmlnaHQtdG8tbGVmdCAoQXJhYmljLCBIZWJyZXcpIHRleHQgaXMgdmlzdWFsIChwcmVzc2luZyB0aGUgbGVmdAogICAgICBhcnJvdyBtb3ZlcyB0aGUgY3Vyc29yIGxlZnQpIG9yIGxvZ2ljYWwgKHByZXNzaW5nIHRoZSBsZWZ0IGFycm93CiAgICAgIG1vdmVzIHRvIHRoZSBuZXh0IGxvd2VyIGluZGV4IGluIHRoZSBzdHJpbmcsIHdoaWNoIGlzIHZpc3VhbGx5CiAgICAgIHJpZ2h0IGluIHJpZ2h0LXRvLWxlZnQgdGV4dCkuIFRoZSBkZWZhdWx0IGlzIDxjb2RlPmZhbHNlPC9jb2RlPgogICAgICBvbiBXaW5kb3dzLCBhbmQgPGNvZGU+dHJ1ZTwvY29kZT4gb24gb3RoZXIgcGxhdGZvcm1zLjwvZGQ+CgogICAgICA8ZHQgaWQ9Im9wdGlvbl9rZXlNYXAiPjxjb2RlPjxzdHJvbmc+a2V5TWFwPC9zdHJvbmc+OiBzdHJpbmc8L2NvZGU+PC9kdD4KICAgICAgPGRkPkNvbmZpZ3VyZXMgdGhlIGtleSBtYXAgdG8gdXNlLiBUaGUgZGVmYXVsdAogICAgICBpcyA8Y29kZT4iZGVmYXVsdCI8L2NvZGU+LCB3aGljaCBpcyB0aGUgb25seSBrZXkgbWFwIGRlZmluZWQKICAgICAgaW4gPGNvZGU+Y29kZW1pcnJvci5qczwvY29kZT4gaXRzZWxmLiBFeHRyYSBrZXkgbWFwcyBhcmUgZm91bmQgaW4KICAgICAgdGhlIDxhIGhyZWY9Ii4uL2tleW1hcC8iPjxjb2RlPmtleSBtYXA8L2NvZGU+PC9hPiBkaXJlY3RvcnkuIFNlZQogICAgICB0aGUgPGEgaHJlZj0iI2tleW1hcHMiPnNlY3Rpb24gb24ga2V5IG1hcHM8L2E+IGZvciBtb3JlCiAgICAgIGluZm9ybWF0aW9uLjwvZGQ+CgogICAgICA8ZHQgaWQ9Im9wdGlvbl9leHRyYUtleXMiPjxjb2RlPjxzdHJvbmc+ZXh0cmFLZXlzPC9zdHJvbmc+OiBvYmplY3Q8L2NvZGU+PC9kdD4KICAgICAgPGRkPkNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgZXh0cmEga2V5IGJpbmRpbmdzIGZvciB0aGUgZWRpdG9yLAogICAgICBhbG9uZ3NpZGUgdGhlIG9uZXMgZGVmaW5lZAogICAgICBieSA8YSBocmVmPSIjb3B0aW9uX2tleU1hcCI+PGNvZGU+a2V5TWFwPC9jb2RlPjwvYT4uIFNob3VsZCBiZQogICAgICBlaXRoZXIgbnVsbCwgb3IgYSB2YWxpZCA8YSBocmVmPSIja2V5bWFwcyI+a2V5IG1hcDwvYT4gdmFsdWUuPC9kZD4KCiAgICAgIDxkdCBpZD0ib3B0aW9uX2xpbmVXcmFwcGluZyI+PGNvZGU+PHN0cm9uZz5saW5lV3JhcHBpbmc8L3N0cm9uZz46IGJvb2xlYW48L2NvZGU+PC9kdD4KICAgICAgPGRkPldoZXRoZXIgQ29kZU1pcnJvciBzaG91bGQgc2Nyb2xsIG9yIHdyYXAgZm9yIGxvbmcgbGluZXMuCiAgICAgIERlZmF1bHRzIHRvIDxjb2RlPmZhbHNlPC9jb2RlPiAoc2Nyb2xsKS48L2RkPgoKICAgICAgPGR0IGlkPSJvcHRpb25fbGluZU51bWJlcnMiPjxjb2RlPjxzdHJvbmc+bGluZU51bWJlcnM8L3N0cm9uZz46IGJvb2xlYW48L2NvZGU+PC9kdD4KICAgICAgPGRkPldoZXRoZXIgdG8gc2hvdyBsaW5lIG51bWJlcnMgdG8gdGhlIGxlZnQgb2YgdGhlIGVkaXRvci48L2RkPgoKICAgICAgPGR0IGlkPSJvcHRpb25fZmlyc3RMaW5lTnVtYmVyIj48Y29kZT48c3Ryb25nPmZpcnN0TGluZU51bWJlcjwvc3Ryb25nPjogaW50ZWdlcjwvY29kZT48L2R0PgogICAgICA8ZGQ+QXQgd2hpY2ggbnVtYmVyIHRvIHN0YXJ0IGNvdW50aW5nIGxpbmVzLiBEZWZhdWx0IGlzIDEuPC9kZD4KCiAgICAgIDxkdCBpZD0ib3B0aW9uX2xpbmVOdW1iZXJGb3JtYXR0ZXIiPjxjb2RlPjxzdHJvbmc+bGluZU51bWJlckZvcm1hdHRlcjwvc3Ryb25nPjogZnVuY3Rpb24obGluZTogaW50ZWdlcikg4oaSIHN0cmluZzwvY29kZT48L2R0PgogICAgICA8ZGQ+QSBmdW5jdGlvbiB1c2VkIHRvIGZvcm1hdCBsaW5lIG51bWJlcnMuIFRoZSBmdW5jdGlvbiBpcwogICAgICBwYXNzZWQgdGhlIGxpbmUgbnVtYmVyLCBhbmQgc2hvdWxkIHJldHVybiBhIHN0cmluZyB0aGF0IHdpbGwgYmUKICAgICAgc2hvd24gaW4gdGhlIGd1dHRlci48L2RkPgoKICAgICAgPGR0IGlkPSJvcHRpb25fZ3V0dGVycyI+PGNvZGU+PHN0cm9uZz5ndXR0ZXJzPC9zdHJvbmc+OiBhcnJheSZsdDtzdHJpbmcmZ3Q7PC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5DYW4gYmUgdXNlZCB0byBhZGQgZXh0cmEgZ3V0dGVycyAoYmV5b25kIG9yIGluc3RlYWQgb2YgdGhlCiAgICAgIGxpbmUgbnVtYmVyIGd1dHRlcikuIFNob3VsZCBiZSBhbiBhcnJheSBvZiBDU1MgY2xhc3MgbmFtZXMsIGVhY2gKICAgICAgb2Ygd2hpY2ggZGVmaW5lcyBhIDxjb2RlPndpZHRoPC9jb2RlPiAoYW5kIG9wdGlvbmFsbHkgYQogICAgICBiYWNrZ3JvdW5kKSwgYW5kIHdoaWNoIHdpbGwgYmUgdXNlZCB0byBkcmF3IHRoZSBiYWNrZ3JvdW5kIG9mCiAgICAgIHRoZSBndXR0ZXJzLiA8ZW0+TWF5PC9lbT4gaW5jbHVkZQogICAgICB0aGUgPGNvZGU+Q29kZU1pcnJvci1saW5lbnVtYmVyczwvY29kZT4gY2xhc3MsIGluIG9yZGVyIHRvCiAgICAgIGV4cGxpY2l0bHkgc2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgbGluZSBudW1iZXIgZ3V0dGVyIChpdCB3aWxsCiAgICAgIGRlZmF1bHQgdG8gYmUgdG8gdGhlIHJpZ2h0IG9mIGFsbCBvdGhlciBndXR0ZXJzKS4gVGhlc2UgY2xhc3MKICAgICAgbmFtZXMgYXJlIHRoZSBrZXlzIHBhc3NlZAogICAgICB0byA8YSBocmVmPSIjc2V0R3V0dGVyTWFya2VyIj48Y29kZT5zZXRHdXR0ZXJNYXJrZXI8L2NvZGU+PC9hPi48L2RkPgoKICAgICAgPGR0IGlkPSJvcHRpb25fZml4ZWRHdXR0ZXIiPjxjb2RlPjxzdHJvbmc+Zml4ZWRHdXR0ZXI8L3N0cm9uZz46IGJvb2xlYW48L2NvZGU+PC9kdD4KICAgICAgPGRkPkRldGVybWluZXMgd2hldGhlciB0aGUgZ3V0dGVyIHNjcm9sbHMgYWxvbmcgd2l0aCB0aGUgY29udGVudAogICAgICBob3Jpem9udGFsbHkgKGZhbHNlKSBvciB3aGV0aGVyIGl0IHN0YXlzIGZpeGVkIGR1cmluZyBob3Jpem9udGFsCiAgICAgIHNjcm9sbGluZyAodHJ1ZSwgdGhlIGRlZmF1bHQpLjwvZGQ+CgogICAgICA8ZHQgaWQ9Im9wdGlvbl9jb3Zlckd1dHRlck5leHRUb1Njcm9sbGJhciI+PGNvZGU+PHN0cm9uZz5jb3Zlckd1dHRlck5leHRUb1Njcm9sbGJhcjwvc3Ryb25nPjogYm9vbGVhbjwvY29kZT48L2R0PgogICAgICA8ZGQ+V2hlbiA8YSBocmVmPSIjb3B0aW9uX2ZpeGVkR3V0dGVyIj48Y29kZT5maXhlZEd1dHRlcjwvY29kZT48L2E+CiAgICAgIGlzIG9uLCBhbmQgdGhlcmUgaXMgYSBob3Jpem9udGFsIHNjcm9sbGJhciwgYnkgZGVmYXVsdCB0aGUKICAgICAgZ3V0dGVyIHdpbGwgYmUgdmlzaWJsZSB0byB0aGUgbGVmdCBvZiB0aGlzIHNjcm9sbGJhci4gSWYgdGhpcwogICAgICBvcHRpb24gaXMgc2V0IHRvIHRydWUsIGl0IHdpbGwgYmUgY292ZXJlZCBieSBhbiBlbGVtZW50IHdpdGgKICAgICAgY2xhc3MgPGNvZGU+Q29kZU1pcnJvci1ndXR0ZXItZmlsbGVyPC9jb2RlPi48L2RkPgoKICAgICAgPGR0IGlkPSJvcHRpb25fcmVhZE9ubHkiPjxjb2RlPjxzdHJvbmc+cmVhZE9ubHk8L3N0cm9uZz46IGJvb2xlYW58c3RyaW5nPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5UaGlzIGRpc2FibGVzIGVkaXRpbmcgb2YgdGhlIGVkaXRvciBjb250ZW50IGJ5IHRoZSB1c2VyLiBJZgogICAgICB0aGUgc3BlY2lhbCB2YWx1ZSA8Y29kZT4ibm9jdXJzb3IiPC9jb2RlPiBpcyBnaXZlbiAoaW5zdGVhZCBvZgogICAgICBzaW1wbHkgPGNvZGU+dHJ1ZTwvY29kZT4pLCBmb2N1c2luZyBvZiB0aGUgZWRpdG9yIGlzIGFsc28KICAgICAgZGlzYWxsb3dlZC48L2RkPgoKICAgICAgPGR0IGlkPSJvcHRpb25fc2hvd0N1cnNvcldoZW5TZWxlY3RpbmciPjxjb2RlPjxzdHJvbmc+c2hvd0N1cnNvcldoZW5TZWxlY3Rpbmc8L3N0cm9uZz46IGJvb2xlYW48L2NvZGU+PC9kdD4KICAgICAgPGRkPldoZXRoZXIgdGhlIGN1cnNvciBzaG91bGQgYmUgZHJhd24gd2hlbiBhIHNlbGVjdGlvbiBpcwogICAgICBhY3RpdmUuIERlZmF1bHRzIHRvIGZhbHNlLjwvZGQ+CgogICAgICA8ZHQgaWQ9Im9wdGlvbl91bmRvRGVwdGgiPjxjb2RlPjxzdHJvbmc+dW5kb0RlcHRoPC9zdHJvbmc+OiBpbnRlZ2VyPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5UaGUgbWF4aW11bSBudW1iZXIgb2YgdW5kbyBsZXZlbHMgdGhhdCB0aGUgZWRpdG9yIHN0b3Jlcy4KICAgICAgTm90ZSB0aGF0IHRoaXMgaW5jbHVkZXMgc2VsZWN0aW9uIGNoYW5nZSBldmVudHMuIERlZmF1bHRzIHRvCiAgICAgIDIwMC48L2RkPgoKICAgICAgPGR0IGlkPSJvcHRpb25faGlzdG9yeUV2ZW50RGVsYXkiPjxjb2RlPjxzdHJvbmc+aGlzdG9yeUV2ZW50RGVsYXk8L3N0cm9uZz46IGludGVnZXI8L2NvZGU+PC9kdD4KICAgICAgPGRkPlRoZSBwZXJpb2Qgb2YgaW5hY3Rpdml0eSAoaW4gbWlsbGlzZWNvbmRzKSB0aGF0IHdpbGwgY2F1c2UgYQogICAgICBuZXcgaGlzdG9yeSBldmVudCB0byBiZSBzdGFydGVkIHdoZW4gdHlwaW5nIG9yIGRlbGV0aW5nLgogICAgICBEZWZhdWx0cyB0byAxMjUwLjwvZGQ+CgogICAgICA8ZHQgaWQ9Im9wdGlvbl90YWJpbmRleCI+PGNvZGU+PHN0cm9uZz50YWJpbmRleDwvc3Ryb25nPjogaW50ZWdlcjwvY29kZT48L2R0PgogICAgICA8ZGQ+VGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0MDEvaW50ZXJhY3QvZm9ybXMuaHRtbCNhZGVmLXRhYmluZGV4Ij50YWIKICAgICAgaW5kZXg8L2E+IHRvIGFzc2lnbiB0byB0aGUgZWRpdG9yLiBJZiBub3QgZ2l2ZW4sIG5vIHRhYiBpbmRleAogICAgICB3aWxsIGJlIGFzc2lnbmVkLjwvZGQ+CgogICAgICA8ZHQgaWQ9Im9wdGlvbl9hdXRvZm9jdXMiPjxjb2RlPjxzdHJvbmc+YXV0b2ZvY3VzPC9zdHJvbmc+OiBib29sZWFuPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5DYW4gYmUgdXNlZCB0byBtYWtlIENvZGVNaXJyb3IgZm9jdXMgaXRzZWxmIG9uCiAgICAgIGluaXRpYWxpemF0aW9uLiBEZWZhdWx0cyB0byBvZmYuCiAgICAgIFdoZW4gPGEgaHJlZj0iI2Zyb21UZXh0QXJlYSI+PGNvZGU+ZnJvbVRleHRBcmVhPC9jb2RlPjwvYT4gaXMKICAgICAgdXNlZCwgYW5kIG5vIGV4cGxpY2l0IHZhbHVlIGlzIGdpdmVuIGZvciB0aGlzIG9wdGlvbiwgaXQgd2lsbCBiZQogICAgICBzZXQgdG8gdHJ1ZSB3aGVuIGVpdGhlciB0aGUgc291cmNlIHRleHRhcmVhIGlzIGZvY3VzZWQsIG9yIGl0CiAgICAgIGhhcyBhbiA8Y29kZT5hdXRvZm9jdXM8L2NvZGU+IGF0dHJpYnV0ZSBhbmQgbm8gb3RoZXIgZWxlbWVudCBpcwogICAgICBmb2N1c2VkLjwvZGQ+CiAgICA8L2RsPgoKICAgIDxwPkJlbG93IHRoaXMgYSBmZXcgbW9yZSBzcGVjaWFsaXplZCwgbG93LWxldmVsIG9wdGlvbnMgYXJlCiAgICBsaXN0ZWQuIFRoZXNlIGFyZSBvbmx5IHVzZWZ1bCBpbiB2ZXJ5IHNwZWNpZmljIHNpdHVhdGlvbnMsIHlvdQogICAgbWlnaHQgd2FudCB0byBza2lwIHRoZW0gdGhlIGZpcnN0IHRpbWUgeW91IHJlYWQgdGhpcyBtYW51YWwuPC9wPgoKICAgIDxkbD4KICAgICAgPGR0IGlkPSJvcHRpb25fZHJhZ0Ryb3AiPjxjb2RlPjxzdHJvbmc+ZHJhZ0Ryb3A8L3N0cm9uZz46IGJvb2xlYW48L2NvZGU+PC9kdD4KICAgICAgPGRkPkNvbnRyb2xzIHdoZXRoZXIgZHJhZy1hbmQtZHJvcCBpcyBlbmFibGVkLiBPbiBieSBkZWZhdWx0LjwvZGQ+CgogICAgICA8ZHQgaWQ9Im9wdGlvbl9jdXJzb3JCbGlua1JhdGUiPjxjb2RlPjxzdHJvbmc+Y3Vyc29yQmxpbmtSYXRlPC9zdHJvbmc+OiBudW1iZXI8L2NvZGU+PC9kdD4KICAgICAgPGRkPkhhbGYtcGVyaW9kIGluIG1pbGxpc2Vjb25kcyB1c2VkIGZvciBjdXJzb3IgYmxpbmtpbmcuIFRoZSBkZWZhdWx0IGJsaW5rCiAgICAgIHJhdGUgaXMgNTMwbXMuIEJ5IHNldHRpbmcgdGhpcyB0byB6ZXJvLCBibGlua2luZyBjYW4gYmUgZGlzYWJsZWQuIEEKICAgICAgbmVnYXRpdmUgdmFsdWUgaGlkZXMgdGhlIGN1cnNvciBlbnRpcmVseS48L2RkPgoKICAgICAgPGR0IGlkPSJvcHRpb25fY3Vyc29yU2Nyb2xsTWFyZ2luIj48Y29kZT48c3Ryb25nPmN1cnNvclNjcm9sbE1hcmdpbjwvc3Ryb25nPjogbnVtYmVyPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5Ib3cgbXVjaCBleHRyYSBzcGFjZSB0byBhbHdheXMga2VlcCBhYm92ZSBhbmQgYmVsb3cgdGhlCiAgICAgIGN1cnNvciB3aGVuIGFwcHJvYWNoaW5nIHRoZSB0b3Agb3IgYm90dG9tIG9mIHRoZSB2aXNpYmxlIHZpZXcgaW4KICAgICAgYSBzY3JvbGxhYmxlIGRvY3VtZW50LiBEZWZhdWx0IGlzIDAuPC9kZD4KCiAgICAgIDxkdCBpZD0ib3B0aW9uX2N1cnNvckhlaWdodCI+PGNvZGU+PHN0cm9uZz5jdXJzb3JIZWlnaHQ8L3N0cm9uZz46IG51bWJlcjwvY29kZT48L2R0PgogICAgICA8ZGQ+RGV0ZXJtaW5lcyB0aGUgaGVpZ2h0IG9mIHRoZSBjdXJzb3IuIERlZmF1bHQgaXMgMSwgbWVhbmluZwogICAgICBpdCBzcGFucyB0aGUgd2hvbGUgaGVpZ2h0IG9mIHRoZSBsaW5lLiBGb3Igc29tZSBmb250cyAoYW5kIGJ5CiAgICAgIHNvbWUgdGFzdGVzKSBhIHNtYWxsZXIgaGVpZ2h0IChmb3IgZXhhbXBsZSA8Y29kZT4wLjg1PC9jb2RlPiksCiAgICAgIHdoaWNoIGNhdXNlcyB0aGUgY3Vyc29yIHRvIG5vdCByZWFjaCBhbGwgdGhlIHdheSB0byB0aGUgYm90dG9tCiAgICAgIG9mIHRoZSBsaW5lLCBsb29rcyBiZXR0ZXI8L2RkPgoKICAgICAgPGR0IGlkPSJvcHRpb25fcmVzZXRTZWxlY3Rpb25PbkNvbnRleHRNZW51Ij48Y29kZT48c3Ryb25nPnJlc2V0U2VsZWN0aW9uT25Db250ZXh0TWVudTwvc3Ryb25nPjogYm9vbGVhbjwvY29kZT48L2R0PgogICAgICA8ZGQ+Q29udHJvbHMgd2hldGhlciwgd2hlbiB0aGUgY29udGV4dCBtZW51IGlzIG9wZW5lZCB3aXRoIGEKICAgICAgY2xpY2sgb3V0c2lkZSBvZiB0aGUgY3VycmVudCBzZWxlY3Rpb24sIHRoZSBjdXJzb3IgaXMgbW92ZWQgdG8KICAgICAgdGhlIHBvaW50IG9mIHRoZSBjbGljay4gRGVmYXVsdHMgdG8gPGNvZGU+dHJ1ZTwvY29kZT4uPC9kZD4KCiAgICAgIDxkdCBpZD0ib3B0aW9uX3dvcmtUaW1lIj48Y29kZSBpZD0ib3B0aW9uX3dvcmRrRGVsYXkiPjxzdHJvbmc+d29ya1RpbWU8L3N0cm9uZz4sIDxzdHJvbmc+d29ya0RlbGF5PC9zdHJvbmc+OiBudW1iZXI8L2NvZGU+PC9kdD4KICAgICAgPGRkPkhpZ2hsaWdodGluZyBpcyBkb25lIGJ5IGEgcHNldWRvIGJhY2tncm91bmQtdGhyZWFkIHRoYXQgd2lsbAogICAgICB3b3JrIGZvciA8Y29kZT53b3JrVGltZTwvY29kZT4gbWlsbGlzZWNvbmRzLCBhbmQgdGhlbiB1c2UKICAgICAgdGltZW91dCB0byBzbGVlcCBmb3IgPGNvZGU+d29ya0RlbGF5PC9jb2RlPiBtaWxsaXNlY29uZHMuIFRoZQogICAgICBkZWZhdWx0cyBhcmUgMjAwIGFuZCAzMDAsIHlvdSBjYW4gY2hhbmdlIHRoZXNlIG9wdGlvbnMgdG8gbWFrZQogICAgICB0aGUgaGlnaGxpZ2h0aW5nIG1vcmUgb3IgbGVzcyBhZ2dyZXNzaXZlLjwvZGQ+CgogICAgICA8ZHQgaWQ9Im9wdGlvbl9wb2xsSW50ZXJ2YWwiPjxjb2RlPjxzdHJvbmc+cG9sbEludGVydmFsPC9zdHJvbmc+OiBudW1iZXI8L2NvZGU+PC9kdD4KICAgICAgPGRkPkluZGljYXRlcyBob3cgcXVpY2tseSBDb2RlTWlycm9yIHNob3VsZCBwb2xsIGl0cyBpbnB1dAogICAgICB0ZXh0YXJlYSBmb3IgY2hhbmdlcyAod2hlbiBmb2N1c2VkKS4gTW9zdCBpbnB1dCBpcyBjYXB0dXJlZCBieQogICAgICBldmVudHMsIGJ1dCBzb21lIHRoaW5ncywgbGlrZSBJTUUgaW5wdXQgb24gc29tZSBicm93c2VycywgZG9uJ3QKICAgICAgZ2VuZXJhdGUgZXZlbnRzIHRoYXQgYWxsb3cgQ29kZU1pcnJvciB0byBwcm9wZXJseSBkZXRlY3QgaXQuCiAgICAgIFRodXMsIGl0IHBvbGxzLiBEZWZhdWx0IGlzIDEwMCBtaWxsaXNlY29uZHMuPC9kZD4KCiAgICAgIDxkdCBpZD0ib3B0aW9uX2ZsYXR0ZW5TcGFucyI+PGNvZGU+PHN0cm9uZz5mbGF0dGVuU3BhbnM8L3N0cm9uZz46IGJvb2xlYW48L2NvZGU+PC9kdD4KICAgICAgPGRkPkJ5IGRlZmF1bHQsIENvZGVNaXJyb3Igd2lsbCBjb21iaW5lIGFkamFjZW50IHRva2VucyBpbnRvIGEKICAgICAgc2luZ2xlIHNwYW4gaWYgdGhleSBoYXZlIHRoZSBzYW1lIGNsYXNzLiBUaGlzIHdpbGwgcmVzdWx0IGluIGEKICAgICAgc2ltcGxlciBET00gdHJlZSwgYW5kIHRodXMgcGVyZm9ybSBiZXR0ZXIuIFdpdGggc29tZSBraW5kcyBvZgogICAgICBzdHlsaW5nIChzdWNoIGFzIHJvdW5kZWQgY29ybmVycyksIHRoaXMgd2lsbCBjaGFuZ2UgdGhlIHdheSB0aGUKICAgICAgZG9jdW1lbnQgbG9va3MuIFlvdSBjYW4gc2V0IHRoaXMgb3B0aW9uIHRvIGZhbHNlIHRvIGRpc2FibGUgdGhpcwogICAgICBiZWhhdmlvci48L2RkPgoKICAgICAgPGR0IGlkPSJvcHRpb25fYWRkTW9kZUNsYXNzIj48Y29kZT48c3Ryb25nPmFkZE1vZGVDbGFzczwvc3Ryb25nPjogYm9vbGVhbjwvY29kZT48L2R0PgogICAgICA8ZGQ+V2hlbiBlbmFibGVkIChvZmYgYnkgZGVmYXVsdCksIGFuIGV4dHJhIENTUyBjbGFzcyB3aWxsIGJlCiAgICAgIGFkZGVkIHRvIGVhY2ggdG9rZW4sIGluZGljYXRpbmcgdGhlCiAgICAgICg8YSBocmVmPSIjaW5uZXJNb2RlIj5pbm5lcjwvYT4pIG1vZGUgdGhhdCBwcm9kdWNlZCBpdCwgcHJlZml4ZWQKICAgICAgd2l0aCA8Y29kZT4iY20tbS0iPC9jb2RlPi4gRm9yIGV4YW1wbGUsIHRva2VucyBmcm9tIHRoZSBYTUwgbW9kZQogICAgICB3aWxsIGdldCB0aGUgPGNvZGU+Y20tbS14bWw8L2NvZGU+IGNsYXNzLjwvZGQ+CgogICAgICA8ZHQgaWQ9Im9wdGlvbl9tYXhIaWdobGlnaHRMZW5ndGgiPjxjb2RlPjxzdHJvbmc+bWF4SGlnaGxpZ2h0TGVuZ3RoPC9zdHJvbmc+OiBudW1iZXI8L2NvZGU+PC9kdD4KICAgICAgPGRkPldoZW4gaGlnaGxpZ2h0aW5nIGxvbmcgbGluZXMsIGluIG9yZGVyIHRvIHN0YXkgcmVzcG9uc2l2ZSwKICAgICAgdGhlIGVkaXRvciB3aWxsIGdpdmUgdXAgYW5kIHNpbXBseSBzdHlsZSB0aGUgcmVzdCBvZiB0aGUgbGluZSBhcwogICAgICBwbGFpbiB0ZXh0IHdoZW4gaXQgcmVhY2hlcyBhIGNlcnRhaW4gcG9zaXRpb24uIFRoZSBkZWZhdWx0IGlzCiAgICAgIDEwIDAwMC4gWW91IGNhbiBzZXQgdGhpcyB0byA8Y29kZT5JbmZpbml0eTwvY29kZT4gdG8gdHVybiBvZmYKICAgICAgdGhpcyBiZWhhdmlvci48L2RkPgoKICAgICAgPGR0IGlkPSJvcHRpb25fY3J1ZGVNZWFzdXJpbmdGcm9tIj48Y29kZT48c3Ryb25nPmNydWRlTWVhc3VyaW5nRnJvbTwvc3Ryb25nPjogbnVtYmVyPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5XaGVuIG1lYXN1cmluZyB0aGUgY2hhcmFjdGVyIHBvc2l0aW9ucyBpbiBsb25nIGxpbmVzLCBhbnkKICAgICAgbGluZSBsb25nZXIgdGhhbiB0aGlzIG51bWJlciAoZGVmYXVsdCBpcyAxMCAwMDApLAogICAgICB3aGVuIDxhIGhyZWY9IiNvcHRpb25fbGluZVdyYXBwaW5nIj5saW5lIHdyYXBwaW5nPC9hPgogICAgICBpcyA8c3Ryb25nPm9mZjwvc3Ryb25nPiwgd2lsbCBzaW1wbHkgYmUgYXNzdW1lZCB0byBjb25zaXN0IG9mCiAgICAgIHNhbWUtc2l6ZWQgY2hhcmFjdGVycy4gVGhpcyBtZWFucyB0aGF0LCBvbiB0aGUgb25lIGhhbmQsCiAgICAgIG1lYXN1cmluZyB3aWxsIGJlIGluYWNjdXJhdGUgd2hlbiBjaGFyYWN0ZXJzIG9mIHZhcnlpbmcgc2l6ZSwKICAgICAgcmlnaHQtdG8tbGVmdCB0ZXh0LCBtYXJrZXJzLCBvciBvdGhlciBpcnJlZ3VsYXIgZWxlbWVudHMgYXJlCiAgICAgIHByZXNlbnQuIE9uIHRoZSBvdGhlciBoYW5kLCBpdCBtZWFucyB0aGF0IGhhdmluZyBzdWNoIGEgbGluZQogICAgICB3b24ndCBmcmVlemUgdGhlIHVzZXIgaW50ZXJmYWNlIGJlY2F1c2Ugb2YgdGhlIGV4cGVuc2l2ZW5lc3Mgb2YKICAgICAgdGhlIG1lYXN1cmVtZW50cy48L2RkPgoKICAgICAgPGR0IGlkPSJvcHRpb25fdmlld3BvcnRNYXJnaW4iPjxjb2RlPjxzdHJvbmc+dmlld3BvcnRNYXJnaW48L3N0cm9uZz46IGludGVnZXI8L2NvZGU+PC9kdD4KICAgICAgPGRkPlNwZWNpZmllcyB0aGUgYW1vdW50IG9mIGxpbmVzIHRoYXQgYXJlIHJlbmRlcmVkIGFib3ZlIGFuZAogICAgICBiZWxvdyB0aGUgcGFydCBvZiB0aGUgZG9jdW1lbnQgdGhhdCdzIGN1cnJlbnRseSBzY3JvbGxlZCBpbnRvCiAgICAgIHZpZXcuIFRoaXMgYWZmZWN0cyB0aGUgYW1vdW50IG9mIHVwZGF0ZXMgbmVlZGVkIHdoZW4gc2Nyb2xsaW5nLAogICAgICBhbmQgdGhlIGFtb3VudCBvZiB3b3JrIHRoYXQgc3VjaCBhbiB1cGRhdGUgZG9lcy4gWW91IHNob3VsZAogICAgICB1c3VhbGx5IGxlYXZlIGl0IGF0IGl0cyBkZWZhdWx0LCAxMC4gQ2FuIGJlIHNldAogICAgICB0byA8Y29kZT5JbmZpbml0eTwvY29kZT4gdG8gbWFrZSBzdXJlIHRoZSB3aG9sZSBkb2N1bWVudCBpcwogICAgICBhbHdheXMgcmVuZGVyZWQsIGFuZCB0aHVzIHRoZSBicm93c2VyJ3MgdGV4dCBzZWFyY2ggd29ya3Mgb24gaXQuCiAgICAgIFRoaXMgPGVtPndpbGw8L2VtPiBoYXZlIGJhZCBlZmZlY3RzIG9uIHBlcmZvcm1hbmNlIG9mIGJpZwogICAgICBkb2N1bWVudHMuPC9kZD4KICAgIDwvZGw+Cjwvc2VjdGlvbj4KCjxzZWN0aW9uIGlkPWV2ZW50cz4KICAgIDxoMj5FdmVudHM8L2gyPgoKICAgIDxwPlZhcmlvdXMgQ29kZU1pcnJvci1yZWxhdGVkIG9iamVjdHMgZW1pdCBldmVudHMsIHdoaWNoIGFsbG93CiAgICBjbGllbnQgY29kZSB0byByZWFjdCB0byB2YXJpb3VzIHNpdHVhdGlvbnMuIEhhbmRsZXJzIGZvciBzdWNoCiAgICBldmVudHMgY2FuIGJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgPGEgaHJlZj0iI29uIj48Y29kZT5vbjwvY29kZT48L2E+CiAgICBhbmQgPGEgaHJlZj0iI29mZiI+PGNvZGU+b2ZmPC9jb2RlPjwvYT4gbWV0aG9kcyBvbiB0aGUgb2JqZWN0cwogICAgdGhhdCB0aGUgZXZlbnQgZmlyZXMgb24uIFRvIGZpcmUgeW91ciBvd24gZXZlbnRzLAogICAgdXNlIDxjb2RlPkNvZGVNaXJyb3Iuc2lnbmFsKHRhcmdldCwgbmFtZSwgYXJncy4uLik8L2NvZGU+LAogICAgd2hlcmUgPGNvZGU+dGFyZ2V0PC9jb2RlPiBpcyBhIG5vbi1ET00tbm9kZSBvYmplY3QuPC9wPgoKICAgIDxwPkFuIGVkaXRvciBpbnN0YW5jZSBmaXJlcyB0aGUgZm9sbG93aW5nIGV2ZW50cy4KICAgIFRoZSA8Y29kZT5pbnN0YW5jZTwvY29kZT4gYXJndW1lbnQgYWx3YXlzIHJlZmVycyB0byB0aGUgZWRpdG9yCiAgICBpdHNlbGYuPC9wPgoKICAgIDxkbD4KICAgICAgPGR0IGlkPSJldmVudF9jaGFuZ2UiPjxjb2RlPjxzdHJvbmc+ImNoYW5nZSI8L3N0cm9uZz4gKGluc3RhbmNlOiBDb2RlTWlycm9yLCBjaGFuZ2VPYmo6IG9iamVjdCk8L2NvZGU+PC9kdD4KICAgICAgPGRkPkZpcmVzIGV2ZXJ5IHRpbWUgdGhlIGNvbnRlbnQgb2YgdGhlIGVkaXRvciBpcyBjaGFuZ2VkLgogICAgICBUaGUgPGNvZGU+Y2hhbmdlT2JqPC9jb2RlPiBpcyBhIDxjb2RlPntmcm9tLCB0bywgdGV4dCwgcmVtb3ZlZCwKICAgICAgb3JpZ2lufTwvY29kZT4gb2JqZWN0IGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNoYW5nZXMKICAgICAgdGhhdCBvY2N1cnJlZCBhcyBzZWNvbmQgYXJndW1lbnQuIDxjb2RlPmZyb208L2NvZGU+CiAgICAgIGFuZCA8Y29kZT50bzwvY29kZT4gYXJlIHRoZSBwb3NpdGlvbnMgKGluIHRoZSBwcmUtY2hhbmdlCiAgICAgIGNvb3JkaW5hdGUgc3lzdGVtKSB3aGVyZSB0aGUgY2hhbmdlIHN0YXJ0ZWQgYW5kIGVuZGVkIChmb3IKICAgICAgZXhhbXBsZSwgaXQgbWlnaHQgYmUgPGNvZGU+e2NoOjAsIGxpbmU6MTh9PC9jb2RlPiBpZiB0aGUKICAgICAgcG9zaXRpb24gaXMgYXQgdGhlIGJlZ2lubmluZyBvZiBsaW5lICMxOSkuIDxjb2RlPnRleHQ8L2NvZGU+IGlzCiAgICAgIGFuIGFycmF5IG9mIHN0cmluZ3MgcmVwcmVzZW50aW5nIHRoZSB0ZXh0IHRoYXQgcmVwbGFjZWQgdGhlCiAgICAgIGNoYW5nZWQgcmFuZ2UgKHNwbGl0IGJ5IGxpbmUpLiA8Y29kZT5yZW1vdmVkPC9jb2RlPiBpcyB0aGUgdGV4dAogICAgICB0aGF0IHVzZWQgdG8gYmUgYmV0d2VlbiA8Y29kZT5mcm9tPC9jb2RlPiBhbmQgPGNvZGU+dG88L2NvZGU+LAogICAgICB3aGljaCBpcyBvdmVyd3JpdHRlbiBieSB0aGlzIGNoYW5nZS48L2RkPgoKICAgICAgPGR0IGlkPSJldmVudF9jaGFuZ2VzIj48Y29kZT48c3Ryb25nPiJjaGFuZ2VzIjwvc3Ryb25nPiAoaW5zdGFuY2U6IENvZGVNaXJyb3IsIGNoYW5nZXM6IGFycmF5Jmx0O29iamVjdCZsdDspPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5MaWtlIHRoZSA8YSBocmVmPSIjZXZlbnRfY2hhbmdlIj48Y29kZT4iY2hhbmdlIjwvY29kZT48L2E+CiAgICAgIGV2ZW50LCBidXQgYmF0Y2hlZCBwZXIgPGEgaHJlZj0iI29wZXJhdGlvbiI+b3BlcmF0aW9uPC9hPiwKICAgICAgcGFzc2luZyBhbiBhcnJheSBjb250YWluaW5nIGFsbCB0aGUgY2hhbmdlcyB0aGF0IGhhcHBlbmVkIGluIHRoZQogICAgICBvcGVyYXRpb24uPC9kZD4KCiAgICAgIDxkdCBpZD0iZXZlbnRfYmVmb3JlQ2hhbmdlIj48Y29kZT48c3Ryb25nPiJiZWZvcmVDaGFuZ2UiPC9zdHJvbmc+IChpbnN0YW5jZTogQ29kZU1pcnJvciwgY2hhbmdlT2JqOiBvYmplY3QpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5UaGlzIGV2ZW50IGlzIGZpcmVkIGJlZm9yZSBhIGNoYW5nZSBpcyBhcHBsaWVkLCBhbmQgaXRzCiAgICAgIGhhbmRsZXIgbWF5IGNob29zZSB0byBtb2RpZnkgb3IgY2FuY2VsIHRoZSBjaGFuZ2UuCiAgICAgIFRoZSA8Y29kZT5jaGFuZ2VPYmo8L2NvZGU+IG9iamVjdAogICAgICBoYXMgPGNvZGU+ZnJvbTwvY29kZT4sIDxjb2RlPnRvPC9jb2RlPiwgYW5kIDxjb2RlPnRleHQ8L2NvZGU+CiAgICAgIHByb3BlcnRpZXMsIGFzIHdpdGgKICAgICAgdGhlIDxhIGhyZWY9IiNldmVudF9jaGFuZ2UiPjxjb2RlPiJjaGFuZ2UiPC9jb2RlPjwvYT4gZXZlbnQuIEl0CiAgICAgIGFsc28gaGFzIGEgPGNvZGU+Y2FuY2VsKCk8L2NvZGU+IG1ldGhvZCwgd2hpY2ggY2FuIGJlIGNhbGxlZCB0bwogICAgICBjYW5jZWwgdGhlIGNoYW5nZSwgYW5kLCA8c3Ryb25nPmlmPC9zdHJvbmc+IHRoZSBjaGFuZ2UgaXNuJ3QKICAgICAgY29taW5nIGZyb20gYW4gdW5kbyBvciByZWRvIGV2ZW50LCBhbiA8Y29kZT51cGRhdGUoZnJvbSwgdG8sCiAgICAgIHRleHQpPC9jb2RlPiBtZXRob2QsIHdoaWNoIG1heSBiZSB1c2VkIHRvIG1vZGlmeSB0aGUgY2hhbmdlLgogICAgICBVbmRvIG9yIHJlZG8gY2hhbmdlcyBjYW4ndCBiZSBtb2RpZmllZCwgYmVjYXVzZSB0aGV5IGhvbGQgc29tZQogICAgICBtZXRhaW5mb3JtYXRpb24gZm9yIHJlc3RvcmluZyBvbGQgbWFya2VkIHJhbmdlcyB0aGF0IGlzIG9ubHkKICAgICAgdmFsaWQgZm9yIHRoYXQgc3BlY2lmaWMgY2hhbmdlLiBBbGwgdGhyZWUgYXJndW1lbnRzCiAgICAgIHRvIDxjb2RlPnVwZGF0ZTwvY29kZT4gYXJlIG9wdGlvbmFsLCBhbmQgY2FuIGJlIGxlZnQgb2ZmIHRvCiAgICAgIGxlYXZlIHRoZSBleGlzdGluZyB2YWx1ZSBmb3IgdGhhdCBmaWVsZAogICAgICBpbnRhY3QuIDxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4geW91IG1heSBub3QgZG8gYW55dGhpbmcgZnJvbQogICAgICBhIDxjb2RlPiJiZWZvcmVDaGFuZ2UiPC9jb2RlPiBoYW5kbGVyIHRoYXQgd291bGQgY2F1c2UgY2hhbmdlcwogICAgICB0byB0aGUgZG9jdW1lbnQgb3IgaXRzIHZpc3VhbGl6YXRpb24uIERvaW5nIHNvIHdpbGwsIHNpbmNlIHRoaXMKICAgICAgaGFuZGxlciBpcyBjYWxsZWQgZGlyZWN0bHkgZnJvbSB0aGUgYm93ZWxzIG9mIHRoZSBDb2RlTWlycm9yCiAgICAgIGltcGxlbWVudGF0aW9uLCBwcm9iYWJseSBjYXVzZSB0aGUgZWRpdG9yIHRvIGJlY29tZQogICAgICBjb3JydXB0ZWQuPC9kZD4KCiAgICAgIDxkdCBpZD0iZXZlbnRfY3Vyc29yQWN0aXZpdHkiPjxjb2RlPjxzdHJvbmc+ImN1cnNvckFjdGl2aXR5Ijwvc3Ryb25nPiAoaW5zdGFuY2U6IENvZGVNaXJyb3IpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5XaWxsIGJlIGZpcmVkIHdoZW4gdGhlIGN1cnNvciBvciBzZWxlY3Rpb24gbW92ZXMsIG9yIGFueQogICAgICBjaGFuZ2UgaXMgbWFkZSB0byB0aGUgZWRpdG9yIGNvbnRlbnQuPC9kZD4KCiAgICAgIDxkdCBpZD0iZXZlbnRfa2V5SGFuZGxlZCI+PGNvZGU+PHN0cm9uZz4ia2V5SGFuZGxlZCI8L3N0cm9uZz4gKGluc3RhbmNlOiBDb2RlTWlycm9yLCBuYW1lOiBzdHJpbmcsIGV2ZW50OiBFdmVudCk8L2NvZGU+PC9kdD4KICAgICAgPGRkPkZpcmVkIGFmdGVyIGEga2V5IGlzIGhhbmRsZWQgdGhyb3VnaCBhCiAgICAgIGtleSBtYXAuIDxjb2RlPm5hbWU8L2NvZGU+IGlzIHRoZSBuYW1lIG9mIHRoZSBoYW5kbGVkIGtleSAoZm9yCiAgICAgIGV4YW1wbGUgPGNvZGU+IkN0cmwtWCI8L2NvZGU+IG9yIDxjb2RlPiIncSciPC9jb2RlPiksCiAgICAgIGFuZCA8Y29kZT5ldmVudDwvY29kZT4gaXMgdGhlIERPTSA8Y29kZT5rZXlkb3duPC9jb2RlPgogICAgICBvciA8Y29kZT5rZXlwcmVzczwvY29kZT4gZXZlbnQuPC9kZD4KCiAgICAgIDxkdCBpZD0iZXZlbnRfaW5wdXRSZWFkIj48Y29kZT48c3Ryb25nPiJpbnB1dFJlYWQiPC9zdHJvbmc+IChpbnN0YW5jZTogQ29kZU1pcnJvciwgY2hhbmdlT2JqOiBvYmplY3QpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5GaXJlZCB3aGVuZXZlciBuZXcgaW5wdXQgaXMgcmVhZCBmcm9tIHRoZSBoaWRkZW4gdGV4dGFyZWEKICAgICAgKHR5cGVkIG9yIHBhc3RlZCBieSB0aGUgdXNlcikuPC9kZD4KCiAgICAgIDxkdCBpZD0iZXZlbnRfYmVmb3JlU2VsZWN0aW9uQ2hhbmdlIj48Y29kZT48c3Ryb25nPiJiZWZvcmVTZWxlY3Rpb25DaGFuZ2UiPC9zdHJvbmc+IChpbnN0YW5jZTogQ29kZU1pcnJvciwgb2JqOiB7cmFuZ2VzLCB1cGRhdGV9KTwvY29kZT48L2R0PgogICAgICA8ZGQ+VGhpcyBldmVudCBpcyBmaXJlZCBiZWZvcmUgdGhlIHNlbGVjdGlvbiBpcyBtb3ZlZC4gSXRzCiAgICAgIGhhbmRsZXIgbWF5IGluc3BlY3QgdGhlIHNldCBvZiBzZWxlY3Rpb24gcmFuZ2VzLCBwcmVzZW50IGFzIGFuCiAgICAgIGFycmF5IG9mIDxjb2RlPnthbmNob3IsIGhlYWR9PC9jb2RlPiBvYmplY3RzIGluCiAgICAgIHRoZSA8Y29kZT5yYW5nZXM8L2NvZGU+IHByb3BlcnR5IG9mIHRoZSA8Y29kZT5vYmo8L2NvZGU+CiAgICAgIGFyZ3VtZW50LCBhbmQgb3B0aW9uYWxseSBjaGFuZ2UgdGhlbSBieSBjYWxsaW5nCiAgICAgIHRoZSA8Y29kZT51cGRhdGU8L2NvZGU+IG1ldGhvZCBvbiB0aGlzIG9iamVjdCwgcGFzc2luZyBhbiBhcnJheQogICAgICBvZiByYW5nZXMgaW4gdGhlIHNhbWUgZm9ybWF0LiBIYW5kbGVycyBmb3IgdGhpcyBldmVudCBoYXZlIHRoZQogICAgICBzYW1lIHJlc3RyaWN0aW9uCiAgICAgIGFzIDxhIGhyZWY9IiNldmVudF9iZWZvcmVDaGFuZ2UiPjxjb2RlPiJiZWZvcmVDaGFuZ2UiPC9jb2RlPjwvYT4KICAgICAgaGFuZGxlcnMg4oCUIHRoZXkgc2hvdWxkIG5vdCBkbyBhbnl0aGluZyB0byBkaXJlY3RseSB1cGRhdGUgdGhlCiAgICAgIHN0YXRlIG9mIHRoZSBlZGl0b3IuPC9kZD4KCiAgICAgIDxkdCBpZD0iZXZlbnRfdmlld3BvcnRDaGFuZ2UiPjxjb2RlPjxzdHJvbmc+InZpZXdwb3J0Q2hhbmdlIjwvc3Ryb25nPiAoaW5zdGFuY2U6IENvZGVNaXJyb3IsIGZyb206IG51bWJlciwgdG86IG51bWJlcik8L2NvZGU+PC9kdD4KICAgICAgPGRkPkZpcmVzIHdoZW5ldmVyIHRoZSA8YSBocmVmPSIjZ2V0Vmlld3BvcnQiPnZpZXcgcG9ydDwvYT4gb2YKICAgICAgdGhlIGVkaXRvciBjaGFuZ2VzIChkdWUgdG8gc2Nyb2xsaW5nLCBlZGl0aW5nLCBvciBhbnkgb3RoZXIKICAgICAgZmFjdG9yKS4gVGhlIDxjb2RlPmZyb208L2NvZGU+IGFuZCA8Y29kZT50bzwvY29kZT4gYXJndW1lbnRzCiAgICAgIGdpdmUgdGhlIG5ldyBzdGFydCBhbmQgZW5kIG9mIHRoZSB2aWV3cG9ydC48L2RkPgoKICAgICAgPGR0IGlkPSJldmVudF9zd2FwRG9jIj48Y29kZT48c3Ryb25nPiJzd2FwRG9jIjwvc3Ryb25nPiAoaW5zdGFuY2U6IENvZGVNaXJyb3IsIG9sZERvYzogRG9jKTwvY29kZT48L2R0PgogICAgICA8ZGQ+VGhpcyBpcyBzaWduYWxsZWQgd2hlbiB0aGUgZWRpdG9yJ3MgZG9jdW1lbnQgaXMgcmVwbGFjZWQKICAgICAgdXNpbmcgdGhlIDxhIGhyZWY9IiNzd2FwRG9jIj48Y29kZT5zd2FwRG9jPC9jb2RlPjwvYT4KICAgICAgbWV0aG9kLjwvZGQ+CgogICAgICA8ZHQgaWQ9ImV2ZW50X2d1dHRlckNsaWNrIj48Y29kZT48c3Ryb25nPiJndXR0ZXJDbGljayI8L3N0cm9uZz4gKGluc3RhbmNlOiBDb2RlTWlycm9yLCBsaW5lOiBpbnRlZ2VyLCBndXR0ZXI6IHN0cmluZywgY2xpY2tFdmVudDogRXZlbnQpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5GaXJlcyB3aGVuIHRoZSBlZGl0b3IgZ3V0dGVyICh0aGUgbGluZS1udW1iZXIgYXJlYSkgaXMKICAgICAgY2xpY2tlZC4gV2lsbCBwYXNzIHRoZSBlZGl0b3IgaW5zdGFuY2UgYXMgZmlyc3QgYXJndW1lbnQsIHRoZQogICAgICAoemVyby1iYXNlZCkgbnVtYmVyIG9mIHRoZSBsaW5lIHRoYXQgd2FzIGNsaWNrZWQgYXMgc2Vjb25kCiAgICAgIGFyZ3VtZW50LCB0aGUgQ1NTIGNsYXNzIG9mIHRoZSBndXR0ZXIgdGhhdCB3YXMgY2xpY2tlZCBhcyB0aGlyZAogICAgICBhcmd1bWVudCwgYW5kIHRoZSByYXcgPGNvZGU+bW91c2Vkb3duPC9jb2RlPiBldmVudCBvYmplY3QgYXMKICAgICAgZm91cnRoIGFyZ3VtZW50LjwvZGQ+CgogICAgICA8ZHQgaWQ9ImV2ZW50X2d1dHRlckNvbnRleHRNZW51Ij48Y29kZT48c3Ryb25nPiJndXR0ZXJDb250ZXh0TWVudSI8L3N0cm9uZz4gKGluc3RhbmNlOiBDb2RlTWlycm9yLCBsaW5lOiBpbnRlZ2VyLCBndXR0ZXI6IHN0cmluZywgY29udGV4dE1lbnU6IEV2ZW50OiBFdmVudCk8L2NvZGU+PC9kdD4KICAgICAgPGRkPkZpcmVzIHdoZW4gdGhlIGVkaXRvciBndXR0ZXIgKHRoZSBsaW5lLW51bWJlciBhcmVhKQogICAgICByZWNlaXZlcyBhIDxjb2RlPmNvbnRleHRtZW51PC9jb2RlPiBldmVudC4gV2lsbCBwYXNzIHRoZSBlZGl0b3IKICAgICAgaW5zdGFuY2UgYXMgZmlyc3QgYXJndW1lbnQsIHRoZSAoemVyby1iYXNlZCkgbnVtYmVyIG9mIHRoZSBsaW5lCiAgICAgIHRoYXQgd2FzIGNsaWNrZWQgYXMgc2Vjb25kIGFyZ3VtZW50LCB0aGUgQ1NTIGNsYXNzIG9mIHRoZQogICAgICBndXR0ZXIgdGhhdCB3YXMgY2xpY2tlZCBhcyB0aGlyZCBhcmd1bWVudCwgYW5kIHRoZSByYXcKICAgICAgPGNvZGU+Y29udGV4dG1lbnU8L2NvZGU+IG1vdXNlIGV2ZW50IG9iamVjdCBhcyBmb3VydGggYXJndW1lbnQuCiAgICAgIFlvdSBjYW4gPGNvZGU+cHJldmVudERlZmF1bHQ8L2NvZGU+IHRoZSBldmVudCwgdG8gc2lnbmFsIHRoYXQKICAgICAgQ29kZU1pcnJvciBzaG91bGQgZG8gbm8gZnVydGhlciBoYW5kbGluZy48L2RkPgoKICAgICAgPGR0IGlkPSJldmVudF9mb2N1cyI+PGNvZGU+PHN0cm9uZz4iZm9jdXMiPC9zdHJvbmc+IChpbnN0YW5jZTogQ29kZU1pcnJvcik8L2NvZGU+PC9kdD4KICAgICAgPGRkPkZpcmVzIHdoZW5ldmVyIHRoZSBlZGl0b3IgaXMgZm9jdXNlZC48L2RkPgoKICAgICAgPGR0IGlkPSJldmVudF9ibHVyIj48Y29kZT48c3Ryb25nPiJibHVyIjwvc3Ryb25nPiAoaW5zdGFuY2U6IENvZGVNaXJyb3IpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5GaXJlcyB3aGVuZXZlciB0aGUgZWRpdG9yIGlzIHVuZm9jdXNlZC48L2RkPgoKICAgICAgPGR0IGlkPSJldmVudF9zY3JvbGwiPjxjb2RlPjxzdHJvbmc+InNjcm9sbCI8L3N0cm9uZz4gKGluc3RhbmNlOiBDb2RlTWlycm9yKTwvY29kZT48L2R0PgogICAgICA8ZGQ+RmlyZXMgd2hlbiB0aGUgZWRpdG9yIGlzIHNjcm9sbGVkLjwvZGQ+CgogICAgICA8ZHQgaWQ9ImV2ZW50X3VwZGF0ZSI+PGNvZGU+PHN0cm9uZz4idXBkYXRlIjwvc3Ryb25nPiAoaW5zdGFuY2U6IENvZGVNaXJyb3IpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5XaWxsIGJlIGZpcmVkIHdoZW5ldmVyIENvZGVNaXJyb3IgdXBkYXRlcyBpdHMgRE9NIGRpc3BsYXkuPC9kZD4KCiAgICAgIDxkdCBpZD0iZXZlbnRfcmVuZGVyTGluZSI+PGNvZGU+PHN0cm9uZz4icmVuZGVyTGluZSI8L3N0cm9uZz4gKGluc3RhbmNlOiBDb2RlTWlycm9yLCBsaW5lOiBMaW5lSGFuZGxlLCBlbGVtZW50OiBFbGVtZW50KTwvY29kZT48L2R0PgogICAgICA8ZGQ+RmlyZWQgd2hlbmV2ZXIgYSBsaW5lIGlzIChyZS0pcmVuZGVyZWQgdG8gdGhlIERPTS4gRmlyZWQKICAgICAgcmlnaHQgYWZ0ZXIgdGhlIERPTSBlbGVtZW50IGlzIGJ1aWx0LCA8ZW0+YmVmb3JlPC9lbT4gaXQgaXMKICAgICAgYWRkZWQgdG8gdGhlIGRvY3VtZW50LiBUaGUgaGFuZGxlciBtYXkgbWVzcyB3aXRoIHRoZSBzdHlsZSBvZgogICAgICB0aGUgcmVzdWx0aW5nIGVsZW1lbnQsIG9yIGFkZCBldmVudCBoYW5kbGVycywgYnV0CiAgICAgIHNob3VsZCA8ZW0+bm90PC9lbT4gdHJ5IHRvIGNoYW5nZSB0aGUgc3RhdGUgb2YgdGhlIGVkaXRvci48L2RkPgoKICAgICAgPGR0IGlkPSJldmVudF9kb20iPjxjb2RlPjxzdHJvbmc+Im1vdXNlZG93biI8L3N0cm9uZz4sCiAgICAgIDxzdHJvbmc+ImRibGNsaWNrIjwvc3Ryb25nPiwgPHN0cm9uZz4iY29udGV4dG1lbnUiPC9zdHJvbmc+LCA8c3Ryb25nPiJrZXlkb3duIjwvc3Ryb25nPiwgPHN0cm9uZz4ia2V5cHJlc3MiPC9zdHJvbmc+LAogICAgICA8c3Ryb25nPiJrZXl1cCI8L3N0cm9uZz4sIDxzdHJvbmc+ImRyYWdzdGFydCI8L3N0cm9uZz4sIDxzdHJvbmc+ImRyYWdlbnRlciI8L3N0cm9uZz4sCiAgICAgIDxzdHJvbmc+ImRyYWdvdmVyIjwvc3Ryb25nPiwgPHN0cm9uZz4iZHJvcCI8L3N0cm9uZz4KICAgICAgKGluc3RhbmNlOiBDb2RlTWlycm9yLCBldmVudDogRXZlbnQpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5GaXJlZCB3aGVuIENvZGVNaXJyb3IgaXMgaGFuZGxpbmcgYSBET00gZXZlbnQgb2YgdGhpcyB0eXBlLgogICAgICBZb3UgY2FuIDxjb2RlPnByZXZlbnREZWZhdWx0PC9jb2RlPiB0aGUgZXZlbnQsIG9yIGdpdmUgaXQgYQogICAgICB0cnV0aHkgPGNvZGU+Y29kZW1pcnJvcklnbm9yZTwvY29kZT4gcHJvcGVydHksIHRvIHNpZ25hbCB0aGF0CiAgICAgIENvZGVNaXJyb3Igc2hvdWxkIGRvIG5vIGZ1cnRoZXIgaGFuZGxpbmcuPC9kZD4KICAgIDwvZGw+CgogICAgPHA+RG9jdW1lbnQgb2JqZWN0cyAoaW5zdGFuY2VzCiAgICBvZiA8YSBocmVmPSIjRG9jIj48Y29kZT5Db2RlTWlycm9yLkRvYzwvY29kZT48L2E+KSBlbWl0IHRoZQogICAgZm9sbG93aW5nIGV2ZW50czo8L3A+CgogICAgPGRsPgogICAgICA8ZHQgaWQ9ImV2ZW50X2RvY19jaGFuZ2UiPjxjb2RlPjxzdHJvbmc+ImNoYW5nZSI8L3N0cm9uZz4gKGRvYzogQ29kZU1pcnJvci5Eb2MsIGNoYW5nZU9iajogb2JqZWN0KTwvY29kZT48L2R0PgogICAgICA8ZGQ+RmlyZWQgd2hlbmV2ZXIgYSBjaGFuZ2Ugb2NjdXJzIHRvIHRoZQogICAgICBkb2N1bWVudC4gPGNvZGU+Y2hhbmdlT2JqPC9jb2RlPiBoYXMgYSBzaW1pbGFyIHR5cGUgYXMgdGhlCiAgICAgIG9iamVjdCBwYXNzZWQgdG8gdGhlCiAgICAgIGVkaXRvcidzIDxhIGhyZWY9IiNldmVudF9jaGFuZ2UiPjxjb2RlPiJjaGFuZ2UiPC9jb2RlPjwvYT4KICAgICAgZXZlbnQuPC9kZD4KCiAgICAgIDxkdCBpZD0iZXZlbnRfZG9jX2JlZm9yZUNoYW5nZSI+PGNvZGU+PHN0cm9uZz4iYmVmb3JlQ2hhbmdlIjwvc3Ryb25nPiAoZG9jOiBDb2RlTWlycm9yLkRvYywgY2hhbmdlOiBvYmplY3QpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5TZWUgdGhlIDxhIGhyZWY9IiNldmVudF9iZWZvcmVDaGFuZ2UiPmRlc2NyaXB0aW9uIG9mIHRoZQogICAgICBzYW1lIGV2ZW50PC9hPiBvbiBlZGl0b3IgaW5zdGFuY2VzLjwvZGQ+CgogICAgICA8ZHQgaWQ9ImV2ZW50X2RvY19jdXJzb3JBY3Rpdml0eSI+PGNvZGU+PHN0cm9uZz4iY3Vyc29yQWN0aXZpdHkiPC9zdHJvbmc+IChkb2M6IENvZGVNaXJyb3IuRG9jKTwvY29kZT48L2R0PgogICAgICA8ZGQ+RmlyZWQgd2hlbmV2ZXIgdGhlIGN1cnNvciBvciBzZWxlY3Rpb24gaW4gdGhpcyBkb2N1bWVudAogICAgICBjaGFuZ2VzLjwvZGQ+CgogICAgICA8ZHQgaWQ9ImV2ZW50X2RvY19iZWZvcmVTZWxlY3Rpb25DaGFuZ2UiPjxjb2RlPjxzdHJvbmc+ImJlZm9yZVNlbGVjdGlvbkNoYW5nZSI8L3N0cm9uZz4gKGRvYzogQ29kZU1pcnJvci5Eb2MsIHNlbGVjdGlvbjoge2hlYWQsIGFuY2hvcn0pPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5FcXVpdmFsZW50IHRvCiAgICAgIHRoZSA8YSBocmVmPSIjZXZlbnRfYmVmb3JlU2VsZWN0aW9uQ2hhbmdlIj5ldmVudCBieSB0aGUgc2FtZQogICAgICBuYW1lPC9hPiBhcyBmaXJlZCBvbiBlZGl0b3IgaW5zdGFuY2VzLjwvZGQ+CiAgICA8L2RsPgoKICAgIDxwPkxpbmUgaGFuZGxlcyAoYXMgcmV0dXJuZWQgYnksIGZvcgogICAgZXhhbXBsZSwgPGEgaHJlZj0iI2dldExpbmVIYW5kbGUiPjxjb2RlPmdldExpbmVIYW5kbGU8L2NvZGU+PC9hPikKICAgIHN1cHBvcnQgdGhlc2UgZXZlbnRzOjwvcD4KCiAgICA8ZGw+CiAgICAgIDxkdCBpZD0iZXZlbnRfZGVsZXRlIj48Y29kZT48c3Ryb25nPiJkZWxldGUiPC9zdHJvbmc+ICgpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5XaWxsIGJlIGZpcmVkIHdoZW4gdGhlIGxpbmUgb2JqZWN0IGlzIGRlbGV0ZWQuIEEgbGluZSBvYmplY3QKICAgICAgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSA8ZW0+c3RhcnQ8L2VtPiBvZiB0aGUgbGluZS4gTW9zdGx5IHVzZWZ1bAogICAgICB3aGVuIHlvdSBuZWVkIHRvIGZpbmQgb3V0IHdoZW4geW91ciA8YSBocmVmPSIjc2V0R3V0dGVyTWFya2VyIj5ndXR0ZXIKICAgICAgbWFya2VyczwvYT4gb24gYSBnaXZlbiBsaW5lIGFyZSByZW1vdmVkLjwvZGQ+CiAgICAgIDxkdCBpZD0iZXZlbnRfbGluZV9jaGFuZ2UiPjxjb2RlPjxzdHJvbmc+ImNoYW5nZSI8L3N0cm9uZz4gKGxpbmU6IExpbmVIYW5kbGUsIGNoYW5nZU9iajogb2JqZWN0KTwvY29kZT48L2R0PgogICAgICA8ZGQ+RmlyZXMgd2hlbiB0aGUgbGluZSdzIHRleHQgY29udGVudCBpcyBjaGFuZ2VkIGluIGFueSB3YXkKICAgICAgKGJ1dCB0aGUgbGluZSBpcyBub3QgZGVsZXRlZCBvdXRyaWdodCkuIFRoZSA8Y29kZT5jaGFuZ2U8L2NvZGU+CiAgICAgIG9iamVjdCBpcyBzaW1pbGFyIHRvIHRoZSBvbmUgcGFzc2VkCiAgICAgIHRvIDxhIGhyZWY9IiNldmVudF9jaGFuZ2UiPmNoYW5nZSBldmVudDwvYT4gb24gdGhlIGVkaXRvcgogICAgICBvYmplY3QuPC9kZD4KICAgIDwvZGw+CgogICAgPHA+TWFya2VkIHJhbmdlIGhhbmRsZXMgKDxjb2RlPkNvZGVNaXJyb3IuVGV4dE1hcmtlcjwvY29kZT4pLCBhcyByZXR1cm5lZAogICAgYnkgPGEgaHJlZj0iI21hcmtUZXh0Ij48Y29kZT5tYXJrVGV4dDwvY29kZT48L2E+CiAgICBhbmQgPGEgaHJlZj0iI3NldEJvb2ttYXJrIj48Y29kZT5zZXRCb29rbWFyazwvY29kZT48L2E+LCBlbWl0IHRoZQogICAgZm9sbG93aW5nIGV2ZW50czo8L3A+CgogICAgPGRsPgogICAgICA8ZHQgaWQ9ImV2ZW50X2JlZm9yZUN1cnNvckVudGVyIj48Y29kZT48c3Ryb25nPiJiZWZvcmVDdXJzb3JFbnRlciI8L3N0cm9uZz4gKCk8L2NvZGU+PC9kdD4KICAgICAgPGRkPkZpcmVkIHdoZW4gdGhlIGN1cnNvciBlbnRlcnMgdGhlIG1hcmtlZCByYW5nZS4gRnJvbSB0aGlzCiAgICAgIGV2ZW50IGhhbmRsZXIsIHRoZSBlZGl0b3Igc3RhdGUgbWF5IGJlIGluc3BlY3RlZAogICAgICBidXQgPGVtPm5vdDwvZW0+IG1vZGlmaWVkLCB3aXRoIHRoZSBleGNlcHRpb24gdGhhdCB0aGUgcmFuZ2Ugb24KICAgICAgd2hpY2ggdGhlIGV2ZW50IGZpcmVzIG1heSBiZSBjbGVhcmVkLjwvZGQ+CiAgICAgIDxkdCBpZD0iZXZlbnRfY2xlYXIiPjxjb2RlPjxzdHJvbmc+ImNsZWFyIjwvc3Ryb25nPiAoZnJvbToge2xpbmUsIGNofSwgdG86IHtsaW5lLCBjaH0pPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5GaXJlZCB3aGVuIHRoZSByYW5nZSBpcyBjbGVhcmVkLCBlaXRoZXIgdGhyb3VnaCBjdXJzb3IKICAgICAgbW92ZW1lbnQgaW4gY29tYmluYXRpb24KICAgICAgd2l0aCA8YSBocmVmPSIjbWFya19jbGVhck9uRW50ZXIiPjxjb2RlPmNsZWFyT25FbnRlcjwvY29kZT48L2E+CiAgICAgIG9yIHRocm91Z2ggYSBjYWxsIHRvIGl0cyA8Y29kZT5jbGVhcigpPC9jb2RlPiBtZXRob2QuIFdpbGwgb25seQogICAgICBiZSBmaXJlZCBvbmNlIHBlciBoYW5kbGUuIE5vdGUgdGhhdCBkZWxldGluZyB0aGUgcmFuZ2UgdGhyb3VnaAogICAgICB0ZXh0IGVkaXRpbmcgZG9lcyBub3QgZmlyZSB0aGlzIGV2ZW50LCBiZWNhdXNlIGFuIHVuZG8gYWN0aW9uCiAgICAgIG1pZ2h0IGJyaW5nIHRoZSByYW5nZSBiYWNrIGludG8gZXhpc3RlbmNlLiA8Y29kZT5mcm9tPC9jb2RlPgogICAgICBhbmQgPGNvZGU+dG88L2NvZGU+IGdpdmUgdGhlIHBhcnQgb2YgdGhlIGRvY3VtZW50IHRoYXQgdGhlIHJhbmdlCiAgICAgIHNwYW5uZWQgd2hlbiBpdCB3YXMgY2xlYXJlZC48L2RkPgogICAgICA8ZHQgaWQ9ImV2ZW50X2hpZGUiPjxjb2RlPjxzdHJvbmc+ImhpZGUiPC9zdHJvbmc+ICgpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5GaXJlZCB3aGVuIHRoZSBsYXN0IHBhcnQgb2YgdGhlIG1hcmtlciBpcyByZW1vdmVkIGZyb20gdGhlCiAgICAgIGRvY3VtZW50IGJ5IGVkaXRpbmcgb3BlcmF0aW9ucy48L2RkPgogICAgICA8ZHQgaWQ9ImV2ZW50X3VuaGlkZSI+PGNvZGU+PHN0cm9uZz4idW5oaWRlIjwvc3Ryb25nPiAoKTwvY29kZT48L2R0PgogICAgICA8ZGQ+RmlyZWQgd2hlbiwgYWZ0ZXIgdGhlIG1hcmtlciB3YXMgcmVtb3ZlZCBieSBlZGl0aW5nLCBhIHVuZG8KICAgICAgb3BlcmF0aW9uIGJyb3VnaHQgdGhlIG1hcmtlciBiYWNrLjwvZGQ+CiAgICA8L2RsPgoKICAgIDxwPkxpbmUgd2lkZ2V0cyAoPGNvZGU+Q29kZU1pcnJvci5MaW5lV2lkZ2V0PC9jb2RlPiksIHJldHVybmVkCiAgICBieSA8YSBocmVmPSIjYWRkTGluZVdpZGdldCI+PGNvZGU+YWRkTGluZVdpZGdldDwvY29kZT48L2E+LCBmaXJlCiAgICB0aGVzZSBldmVudHM6PC9wPgoKICAgIDxkbD4KICAgICAgPGR0IGlkPSJldmVudF9yZWRyYXciPjxjb2RlPjxzdHJvbmc+InJlZHJhdyI8L3N0cm9uZz4gKCk8L2NvZGU+PC9kdD4KICAgICAgPGRkPkZpcmVkIHdoZW5ldmVyIHRoZSBlZGl0b3IgcmUtYWRkcyB0aGUgd2lkZ2V0IHRvIHRoZSBET00uCiAgICAgIFRoaXMgd2lsbCBoYXBwZW4gb25jZSByaWdodCBhZnRlciB0aGUgd2lkZ2V0IGlzIGFkZGVkIChpZiBpdCBpcwogICAgICBzY3JvbGxlZCBpbnRvIHZpZXcpLCBhbmQgdGhlbiBhZ2FpbiB3aGVuZXZlciBpdCBpcyBzY3JvbGxlZCBvdXQKICAgICAgb2YgdmlldyBhbmQgYmFjayBpbiBhZ2Fpbiwgb3Igd2hlbiBjaGFuZ2VzIHRvIHRoZSBlZGl0b3Igb3B0aW9ucwogICAgICBvciB0aGUgbGluZSB0aGUgd2lkZ2V0IGlzIG9uIHJlcXVpcmUgdGhlIHdpZGdldCB0byBiZQogICAgICByZWRyYXduLjwvZGQ+CiAgICA8L2RsPgo8L3NlY3Rpb24+Cgo8c2VjdGlvbiBpZD1rZXltYXBzPgogICAgPGgyPktleSBNYXBzPC9oMj4KCiAgICA8cD5LZXkgbWFwcyBhcmUgd2F5cyB0byBhc3NvY2lhdGUga2V5cyB3aXRoIGZ1bmN0aW9uYWxpdHkuIEEga2V5IG1hcAogICAgaXMgYW4gb2JqZWN0IG1hcHBpbmcgc3RyaW5ncyB0aGF0IGlkZW50aWZ5IHRoZSBrZXlzIHRvIGZ1bmN0aW9ucwogICAgdGhhdCBpbXBsZW1lbnQgdGhlaXIgZnVuY3Rpb25hbGl0eS48L3A+CgogICAgPHA+VGhlIENvZGVNaXJyb3IgZGlzdHJpYnV0aW9ucyBjb21lcwogICAgd2l0aCA8YSBocmVmPSIuLi9kZW1vL2VtYWNzLmh0bWwiPkVtYWNzPC9hPiwgPGEgaHJlZj0iLi4vZGVtby92aW0uaHRtbCI+VmltPC9hPiwKICAgIGFuZCA8YSBocmVmPSIuLi9kZW1vL3N1YmxpbWUuaHRtbCI+U3VibGltZSBUZXh0PC9hPi1zdHlsZSBrZXltYXBzLjwvcD4KCiAgICA8cD5LZXlzIGFyZSBpZGVudGlmaWVkIGVpdGhlciBieSBuYW1lIG9yIGJ5IGNoYXJhY3Rlci4KICAgIFRoZSA8Y29kZT5Db2RlTWlycm9yLmtleU5hbWVzPC9jb2RlPiBvYmplY3QgZGVmaW5lcyBuYW1lcyBmb3IKICAgIGNvbW1vbiBrZXlzIGFuZCBhc3NvY2lhdGVzIHRoZW0gd2l0aCB0aGVpciBrZXkgY29kZXMuIEV4YW1wbGVzIG9mCiAgICBuYW1lcyBkZWZpbmVkIGhlcmUgYXJlIDxjb2RlPkVudGVyPC9jb2RlPiwgPGNvZGU+RjU8L2NvZGU+LAogICAgYW5kIDxjb2RlPlE8L2NvZGU+LiBUaGVzZSBjYW4gYmUgcHJlZml4ZWQKICAgIHdpdGggPGNvZGU+U2hpZnQtPC9jb2RlPiwgPGNvZGU+Q21kLTwvY29kZT4sIDxjb2RlPkN0cmwtPC9jb2RlPiwKICAgIGFuZCA8Y29kZT5BbHQtPC9jb2RlPiAoaW4gdGhhdCBvcmRlciEpIHRvIHNwZWNpZnkgYSBtb2RpZmllci4gU28KICAgIGZvciBleGFtcGxlLCA8Y29kZT5TaGlmdC1DdHJsLVNwYWNlPC9jb2RlPiB3b3VsZCBiZSBhIHZhbGlkIGtleQogICAgaWRlbnRpZmllci48L3A+CgogICAgPHA+Q29tbW9uIGV4YW1wbGU6IG1hcCB0aGUgVGFiIGtleSB0byBpbnNlcnQgc3BhY2VzIGluc3RlYWQgb2YgYSB0YWIKICAgIGNoYXJhY3Rlci48L3A+CgogICAgPHByZSBkYXRhLWxhbmc9ImphdmFzY3JpcHQiPgp7CiAgVGFiOiBmdW5jdGlvbihjbSkgewogICAgdmFyIHNwYWNlcyA9IEFycmF5KGNtLmdldE9wdGlvbigiaW5kZW50VW5pdCIpICsgMSkuam9pbigiICIpOwogICAgY20ucmVwbGFjZVNlbGVjdGlvbihzcGFjZXMpOwogIH0KfTwvcHJlPgoKICAgIDxwPkFsdGVybmF0aXZlbHksIGEgY2hhcmFjdGVyIGNhbiBiZSBzcGVjaWZpZWQgZGlyZWN0bHkgYnkKICAgIHN1cnJvdW5kaW5nIGl0IGluIHNpbmdsZSBxdW90ZXMsIGZvciBleGFtcGxlIDxjb2RlPickJzwvY29kZT4KICAgIG9yIDxjb2RlPidxJzwvY29kZT4uIER1ZSB0byBsaW1pdGF0aW9ucyBpbiB0aGUgd2F5IGJyb3dzZXJzIGZpcmUKICAgIGtleSBldmVudHMsIHRoZXNlIG1heSBub3QgYmUgcHJlZml4ZWQgd2l0aCBtb2RpZmllcnMuPC9wPgoKICAgIDxwPlRoZSA8Y29kZT5Db2RlTWlycm9yLmtleU1hcDwvY29kZT4gb2JqZWN0IGFzc29jaWF0ZXMga2V5IG1hcHMKICAgIHdpdGggbmFtZXMuIFVzZXIgY29kZSBhbmQga2V5IG1hcCBkZWZpbml0aW9ucyBjYW4gYXNzaWduIGV4dHJhCiAgICBwcm9wZXJ0aWVzIHRvIHRoaXMgb2JqZWN0LiBBbnl3aGVyZSB3aGVyZSBhIGtleSBtYXAgaXMgZXhwZWN0ZWQsIGEKICAgIHN0cmluZyBjYW4gYmUgZ2l2ZW4sIHdoaWNoIHdpbGwgYmUgbG9va2VkIHVwIGluIHRoaXMgb2JqZWN0LiBJdAogICAgYWxzbyBjb250YWlucyB0aGUgPGNvZGU+ImRlZmF1bHQiPC9jb2RlPiBrZXkgbWFwIGhvbGRpbmcgdGhlCiAgICBkZWZhdWx0IGJpbmRpbmdzLjwvcD4KCiAgICA8cD5UaGUgdmFsdWVzIG9mIHByb3BlcnRpZXMgaW4ga2V5IG1hcHMgY2FuIGJlIGVpdGhlciBmdW5jdGlvbnMgb2YKICAgIGEgc2luZ2xlIGFyZ3VtZW50ICh0aGUgQ29kZU1pcnJvciBpbnN0YW5jZSksIHN0cmluZ3MsIG9yCiAgICA8Y29kZT5mYWxzZTwvY29kZT4uIFN0cmluZ3MgcmVmZXIKICAgIHRvIDxhIGhyZWY9IiNjb21tYW5kcyI+Y29tbWFuZHM8L2E+LCB3aGljaCBhcmUgZGVzY3JpYmVkIGJlbG93LiBJZgogICAgdGhlIHByb3BlcnR5IGlzIHNldCB0byA8Y29kZT5mYWxzZTwvY29kZT4sIENvZGVNaXJyb3IgbGVhdmVzCiAgICBoYW5kbGluZyBvZiB0aGUga2V5IHVwIHRvIHRoZSBicm93c2VyLiBBIGtleSBoYW5kbGVyIGZ1bmN0aW9uIG1heQogICAgcmV0dXJuIDxjb2RlPkNvZGVNaXJyb3IuUGFzczwvY29kZT4gdG8gaW5kaWNhdGUgdGhhdCBpdCBoYXMKICAgIGRlY2lkZWQgbm90IHRvIGhhbmRsZSB0aGUga2V5LCBhbmQgb3RoZXIgaGFuZGxlcnMgKG9yIHRoZSBkZWZhdWx0CiAgICBiZWhhdmlvcikgc2hvdWxkIGJlIGdpdmVuIGEgdHVybi48L3A+CgogICAgPHA+S2V5cyBtYXBwZWQgdG8gY29tbWFuZCBuYW1lcyB0aGF0IHN0YXJ0IHdpdGggdGhlCiAgICBjaGFyYWN0ZXJzIDxjb2RlPiJnbyI8L2NvZGU+ICh3aGljaCBzaG91bGQgYmUgdXNlZCBmb3IKICAgIGN1cnNvci1tb3ZlbWVudCBhY3Rpb25zKSB3aWxsIGJlIGZpcmVkIGV2ZW4gd2hlbiBhbgogICAgZXh0cmEgPGNvZGU+U2hpZnQ8L2NvZGU+IG1vZGlmaWVyIGlzIHByZXNlbnQgKGkuZS4gPGNvZGU+IlVwIjoKICAgICJnb0xpbmVVcCI8L2NvZGU+IG1hdGNoZXMgYm90aCB1cCBhbmQgc2hpZnQtdXApLiBUaGlzIGlzIHVzZWQgdG8KICAgIGVhc2lseSBpbXBsZW1lbnQgc2hpZnQtc2VsZWN0aW9uLjwvcD4KCiAgICA8cD5LZXkgbWFwcyBjYW4gZGVmZXIgdG8gZWFjaCBvdGhlciBieSBkZWZpbmluZwogICAgYSA8Y29kZT5mYWxsdGhyb3VnaDwvY29kZT4gcHJvcGVydHkuIFRoaXMgaW5kaWNhdGVzIHRoYXQgd2hlbiBhCiAgICBrZXkgaXMgbm90IGZvdW5kIGluIHRoZSBtYXAgaXRzZWxmLCBvbmUgb3IgbW9yZSBvdGhlciBtYXBzIHNob3VsZAogICAgYmUgc2VhcmNoZWQuIEl0IGNhbiBob2xkIGVpdGhlciBhIHNpbmdsZSBrZXkgbWFwIG9yIGFuIGFycmF5IG9mCiAgICBrZXkgbWFwcy48L3A+CgogICAgPHA+V2hlbiBhIGtleSBtYXAgY29udGFpbnMgYSA8Y29kZT5ub2ZhbGx0aHJvdWdoPC9jb2RlPiBwcm9wZXJ0eQogICAgc2V0IHRvIDxjb2RlPnRydWU8L2NvZGU+LCBrZXlzIG1hdGNoZWQgYWdhaW5zdCB0aGF0IG1hcCB3aWxsIGJlCiAgICBpZ25vcmVkIGlmIHRoZXkgZG9uJ3QgbWF0Y2ggYW55IG9mIHRoZSBiaW5kaW5ncyBpbiB0aGUgbWFwIChubwogICAgZnVydGhlciBjaGlsZCBtYXBzIHdpbGwgYmUgdHJpZWQpLiBXaGVuCiAgICB0aGUgPGNvZGU+ZGlzYWJsZUlucHV0PC9jb2RlPiBwcm9wZXJ0eSBpcyBzZXQKICAgIHRvIDxjb2RlPnRydWU8L2NvZGU+LCB0aGUgZGVmYXVsdCBlZmZlY3Qgb2YgaW5zZXJ0aW5nIGEgY2hhcmFjdGVyCiAgICB3aWxsIGJlIHN1cHByZXNzZWQgd2hlbiB0aGUga2V5IG1hcCBpcyBhY3RpdmUgYXMgdGhlIHRvcC1sZXZlbAogICAgbWFwLjwvcD4KPC9zZWN0aW9uPgoKPHNlY3Rpb24gaWQ9Y29tbWFuZHM+CiAgICA8aDI+Q29tbWFuZHM8L2gyPgoKICAgIDxwPkNvbW1hbmRzIGFyZSBwYXJhbWV0ZXItbGVzcyBhY3Rpb25zIHRoYXQgY2FuIGJlIHBlcmZvcm1lZCBvbiBhbgogICAgZWRpdG9yLiBUaGVpciBtYWluIHVzZSBpcyBmb3Iga2V5IGJpbmRpbmdzLiBDb21tYW5kcyBhcmUgZGVmaW5lZCBieQogICAgYWRkaW5nIHByb3BlcnRpZXMgdG8gdGhlIDxjb2RlPkNvZGVNaXJyb3IuY29tbWFuZHM8L2NvZGU+IG9iamVjdC4KICAgIEEgbnVtYmVyIG9mIGNvbW1vbiBjb21tYW5kcyBhcmUgZGVmaW5lZCBieSB0aGUgbGlicmFyeSBpdHNlbGYsCiAgICBtb3N0IG9mIHRoZW0gdXNlZCBieSB0aGUgZGVmYXVsdCBrZXkgYmluZGluZ3MuIFRoZSB2YWx1ZSBvZiBhCiAgICBjb21tYW5kIHByb3BlcnR5IG11c3QgYmUgYSBmdW5jdGlvbiBvZiBvbmUgYXJndW1lbnQgKGFuIGVkaXRvcgogICAgaW5zdGFuY2UpLjwvcD4KCiAgICA8cD5Tb21lIG9mIHRoZSBjb21tYW5kcyBiZWxvdyBhcmUgcmVmZXJlbmNlZCBpbiB0aGUgZGVmYXVsdAogICAga2V5IG1hcCwgYnV0IG5vdCBkZWZpbmVkIGJ5IHRoZSBjb3JlIGxpYnJhcnkuIFRoZXNlIGFyZSBpbnRlbmRlZCB0bwogICAgYmUgZGVmaW5lZCBieSB1c2VyIGNvZGUgb3IgYWRkb25zLjwvcD4KCiAgICA8cD5Db21tYW5kcyBjYW4gYWxzbyBiZSBydW4gd2l0aAogICAgdGhlIDxhIGhyZWY9IiNleGVjQ29tbWFuZCI+PGNvZGU+ZXhlY0NvbW1hbmQ8L2NvZGU+PC9hPgogICAgbWV0aG9kLjwvcD4KCiAgICA8ZGw+CiAgICAgIDxkdCBjbGFzcz1jb21tYW5kIGlkPWNvbW1hbmRfc2VsZWN0QWxsPjxjb2RlPjxzdHJvbmc+c2VsZWN0QWxsPC9zdHJvbmc+PC9jb2RlPjxzcGFuIGNsYXNzPWtleWJpbmRpbmc+Q3RybC1BIChQQyksIENtZC1BIChNYWMpPC9zcGFuPjwvZHQ+CiAgICAgIDxkZD5TZWxlY3QgdGhlIHdob2xlIGNvbnRlbnQgb2YgdGhlIGVkaXRvci48L2RkPgoKICAgICAgPGR0IGNsYXNzPWNvbW1hbmQgaWQ9Y29tbWFuZF9zaW5nbGVTZWxlY3Rpb24+PGNvZGU+PHN0cm9uZz5zaW5nbGVTZWxlY3Rpb248L3N0cm9uZz48L2NvZGU+PHNwYW4gY2xhc3M9a2V5YmluZGluZz5Fc2M8L3NwYW4+PC9kdD4KICAgICAgPGRkPldoZW4gbXVsdGlwbGUgc2VsZWN0aW9ucyBhcmUgcHJlc2VudCwgdGhpcyBkZXNlbGVjdHMgYWxsIGJ1dAogICAgICB0aGUgcHJpbWFyeSBzZWxlY3Rpb24uPC9kZD4KCiAgICAgIDxkdCBjbGFzcz1jb21tYW5kIGlkPWNvbW1hbmRfa2lsbExpbmU+PGNvZGU+PHN0cm9uZz5raWxsTGluZTwvc3Ryb25nPjwvY29kZT48c3BhbiBjbGFzcz1rZXliaW5kaW5nPkN0cmwtSyAoTWFjKTwvc3Bhbj48L2R0PgogICAgICA8ZGQ+RW1hY3Mtc3R5bGUgbGluZSBraWxsaW5nLiBEZWxldGVzIHRoZSBwYXJ0IG9mIHRoZSBsaW5lIGFmdGVyCiAgICAgIHRoZSBjdXJzb3IuIElmIHRoYXQgY29uc2lzdHMgb25seSBvZiB3aGl0ZXNwYWNlLCB0aGUgbmV3bGluZSBhdAogICAgICB0aGUgZW5kIG9mIHRoZSBsaW5lIGlzIGFsc28gZGVsZXRlZC48L2RkPgoKICAgICAgPGR0IGNsYXNzPWNvbW1hbmQgaWQ9Y29tbWFuZF9kZWxldGVMaW5lPjxjb2RlPjxzdHJvbmc+ZGVsZXRlTGluZTwvc3Ryb25nPjwvY29kZT48c3BhbiBjbGFzcz1rZXliaW5kaW5nPkN0cmwtRCAoUEMpLCBDbWQtRCAoTWFjKTwvc3Bhbj48L2R0PgogICAgICA8ZGQ+RGVsZXRlcyB0aGUgd2hvbGUgbGluZSB1bmRlciB0aGUgY3Vyc29yLCBpbmNsdWRpbmcgbmV3bGluZSBhdCB0aGUgZW5kLjwvZGQ+CgogICAgICA8ZHQgY2xhc3M9Y29tbWFuZCBpZD1jb21tYW5kX2RlbExpbmVMZWZ0Pjxjb2RlPjxzdHJvbmc+ZGVsTGluZUxlZnQ8L3N0cm9uZz48L2NvZGU+PC9kdD4KICAgICAgPGRkPkRlbGV0ZSB0aGUgcGFydCBvZiB0aGUgbGluZSBiZWZvcmUgdGhlIGN1cnNvci48L2RkPgoKICAgICAgPGR0IGNsYXNzPWNvbW1hbmQgaWQ9Y29tbWFuZF9kZWxXcmFwcGVkTGluZUxlZnQ+PGNvZGU+PHN0cm9uZz5kZWxXcmFwcGVkTGluZUxlZnQ8L3N0cm9uZz48L2NvZGU+PHNwYW4gY2xhc3M9a2V5YmluZGluZz5DbWQtQmFja3NwYWNlIChNYWMpPC9zcGFuPjwvZHQ+CiAgICAgIDxkZD5EZWxldGUgdGhlIHBhcnQgb2YgdGhlIGxpbmUgZnJvbSB0aGUgbGVmdCBzaWRlIG9mIHRoZSB2aXN1YWwgbGluZSB0aGUgY3Vyc29yIGlzIG9uIHRvIHRoZSBjdXJzb3IuPC9kZD4KCiAgICAgIDxkdCBjbGFzcz1jb21tYW5kIGlkPWNvbW1hbmRfZGVsV3JhcHBlZExpbmVSaWdodD48Y29kZT48c3Ryb25nPmRlbFdyYXBwZWRMaW5lUmlnaHQ8L3N0cm9uZz48L2NvZGU+PHNwYW4gY2xhc3M9a2V5YmluZGluZz5DbWQtRGVsZXRlIChNYWMpPC9zcGFuPjwvZHQ+CiAgICAgIDxkZD5EZWxldGUgdGhlIHBhcnQgb2YgdGhlIGxpbmUgZnJvbSB0aGUgY3Vyc29yIHRvIHRoZSByaWdodCBzaWRlIG9mIHRoZSB2aXN1YWwgbGluZSB0aGUgY3Vyc29yIGlzIG9uLjwvZGQ+CgogICAgICA8ZHQgY2xhc3M9Y29tbWFuZCBpZD1jb21tYW5kX3VuZG8+PGNvZGU+PHN0cm9uZz51bmRvPC9zdHJvbmc+PC9jb2RlPjxzcGFuIGNsYXNzPWtleWJpbmRpbmc+Q3RybC1aIChQQyksIENtZC1aIChNYWMpPC9zcGFuPjwvZHQ+CiAgICAgIDxkZD5VbmRvIHRoZSBsYXN0IGNoYW5nZS48L2RkPgoKICAgICAgPGR0IGNsYXNzPWNvbW1hbmQgaWQ9Y29tbWFuZF9yZWRvPjxjb2RlPjxzdHJvbmc+cmVkbzwvc3Ryb25nPjwvY29kZT48c3BhbiBjbGFzcz1rZXliaW5kaW5nPkN0cmwtWSAoUEMpLCBTaGlmdC1DbWQtWiAoTWFjKSwgQ21kLVkgKE1hYyk8L3NwYW4+PC9kdD4KICAgICAgPGRkPlJlZG8gdGhlIGxhc3QgdW5kb25lIGNoYW5nZS48L2RkPgoKICAgICAgPGR0IGNsYXNzPWNvbW1hbmQgaWQ9Y29tbWFuZF91bmRvU2VsZWN0aW9uPjxjb2RlPjxzdHJvbmc+dW5kb1NlbGVjdGlvbjwvc3Ryb25nPjwvY29kZT48c3BhbiBjbGFzcz1rZXliaW5kaW5nPkN0cmwtVSAoUEMpLCBDbWQtVSAoTWFjKTwvc3Bhbj48L2R0PgogICAgICA8ZGQ+VW5kbyB0aGUgbGFzdCBjaGFuZ2UgdG8gdGhlIHNlbGVjdGlvbiwgb3IgaWYgdGhlcmUgYXJlIG5vCiAgICAgIHNlbGVjdGlvbi1vbmx5IGNoYW5nZXMgYXQgdGhlIHRvcCBvZiB0aGUgaGlzdG9yeSwgdW5kbyB0aGUgbGFzdAogICAgICBjaGFuZ2UuPC9kZD4KCiAgICAgIDxkdCBjbGFzcz1jb21tYW5kIGlkPWNvbW1hbmRfcmVkb1NlbGVjdGlvbj48Y29kZT48c3Ryb25nPnJlZG9TZWxlY3Rpb248L3N0cm9uZz48L2NvZGU+PHNwYW4gY2xhc3M9a2V5YmluZGluZz5BbHQtVSAoUEMpLCBTaGlmdC1DbWQtVSAoTWFjKTwvc3Bhbj48L2R0PgogICAgICA8ZGQ+UmVkbyB0aGUgbGFzdCBjaGFuZ2UgdG8gdGhlIHNlbGVjdGlvbiwgb3IgdGhlIGxhc3QgdGV4dCBjaGFuZ2UgaWYKICAgICAgbm8gc2VsZWN0aW9uIGNoYW5nZXMgcmVtYWluLjwvZGQ+CgogICAgICA8ZHQgY2xhc3M9Y29tbWFuZCBpZD1jb21tYW5kX2dvRG9jU3RhcnQ+PGNvZGU+PHN0cm9uZz5nb0RvY1N0YXJ0PC9zdHJvbmc+PC9jb2RlPjxzcGFuIGNsYXNzPWtleWJpbmRpbmc+Q3RybC1VcCAoUEMpLCBDbWQtVXAgKE1hYyksIENtZC1Ib21lIChNYWMpPC9zcGFuPjwvZHQ+CiAgICAgIDxkZD5Nb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIHN0YXJ0IG9mIHRoZSBkb2N1bWVudC48L2RkPgoKICAgICAgPGR0IGNsYXNzPWNvbW1hbmQgaWQ9Y29tbWFuZF9nb0RvY0VuZD48Y29kZT48c3Ryb25nPmdvRG9jRW5kPC9zdHJvbmc+PC9jb2RlPjxzcGFuIGNsYXNzPWtleWJpbmRpbmc+Q3RybC1Eb3duIChQQyksIENtZC1FbmQgKE1hYyksIENtZC1Eb3duIChNYWMpPC9zcGFuPjwvZHQ+CiAgICAgIDxkZD5Nb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQuPC9kZD4KCiAgICAgIDxkdCBjbGFzcz1jb21tYW5kIGlkPWNvbW1hbmRfZ29MaW5lU3RhcnQ+PGNvZGU+PHN0cm9uZz5nb0xpbmVTdGFydDwvc3Ryb25nPjwvY29kZT48c3BhbiBjbGFzcz1rZXliaW5kaW5nPkFsdC1MZWZ0IChQQyksIEN0cmwtQSAoTWFjKTwvc3Bhbj48L2R0PgogICAgICA8ZGQ+TW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBzdGFydCBvZiB0aGUgbGluZS48L2RkPgoKICAgICAgPGR0IGNsYXNzPWNvbW1hbmQgaWQ9Y29tbWFuZF9nb0xpbmVTdGFydFNtYXJ0Pjxjb2RlPjxzdHJvbmc+Z29MaW5lU3RhcnRTbWFydDwvc3Ryb25nPjwvY29kZT48c3BhbiBjbGFzcz1rZXliaW5kaW5nPkhvbWU8L3NwYW4+PC9kdD4KICAgICAgPGRkPk1vdmUgdG8gdGhlIHN0YXJ0IG9mIHRoZSB0ZXh0IG9uIHRoZSBsaW5lLCBvciBpZiB3ZSBhcmUKICAgICAgYWxyZWFkeSB0aGVyZSwgdG8gdGhlIGFjdHVhbCBzdGFydCBvZiB0aGUgbGluZSAoaW5jbHVkaW5nCiAgICAgIHdoaXRlc3BhY2UpLjwvZGQ+CgogICAgICA8ZHQgY2xhc3M9Y29tbWFuZCBpZD1jb21tYW5kX2dvTGluZUVuZD48Y29kZT48c3Ryb25nPmdvTGluZUVuZDwvc3Ryb25nPjwvY29kZT48c3BhbiBjbGFzcz1rZXliaW5kaW5nPkFsdC1SaWdodCAoUEMpLCBDdHJsLUUgKE1hYyk8L3NwYW4+PC9kdD4KICAgICAgPGRkPk1vdmUgdGhlIGN1cnNvciB0byB0aGUgZW5kIG9mIHRoZSBsaW5lLjwvZGQ+CgogICAgICA8ZHQgY2xhc3M9Y29tbWFuZCBpZD1jb21tYW5kX2dvTGluZUxlZnQ+PGNvZGU+PHN0cm9uZz5nb0xpbmVMZWZ0PC9zdHJvbmc+PC9jb2RlPjxzcGFuIGNsYXNzPWtleWJpbmRpbmc+Q21kLUxlZnQgKE1hYyk8L3NwYW4+PC9kdD4KICAgICAgPGRkPk1vdmUgdGhlIGN1cnNvciB0byB0aGUgbGVmdCBzaWRlIG9mIHRoZSB2aXN1YWwgbGluZSBpdCBpcyBvbi4gSWYKICAgICAgdGhpcyBsaW5lIGlzIHdyYXBwZWQsIHRoYXQgbWF5IG5vdCBiZSB0aGUgc3RhcnQgb2YgdGhlIGxpbmUuPC9kZD4KCiAgICAgIDxkdCBjbGFzcz1jb21tYW5kIGlkPWNvbW1hbmRfZ29MaW5lUmlnaHQ+PGNvZGU+PHN0cm9uZz5nb0xpbmVSaWdodDwvc3Ryb25nPjwvY29kZT48c3BhbiBjbGFzcz1rZXliaW5kaW5nPkNtZC1SaWdodCAoTWFjKTwvc3Bhbj48L2R0PgogICAgICA8ZGQ+TW92ZSB0aGUgY3Vyc29yIHRvIHRoZSByaWdodCBzaWRlIG9mIHRoZSB2aXN1YWwgbGluZSBpdCBpcyBvbi48L2RkPgoKICAgICAgPGR0IGNsYXNzPWNvbW1hbmQgaWQ9Y29tbWFuZF9nb0xpbmVVcD48Y29kZT48c3Ryb25nPmdvTGluZVVwPC9zdHJvbmc+PC9jb2RlPjxzcGFuIGNsYXNzPWtleWJpbmRpbmc+VXAsIEN0cmwtUCAoTWFjKTwvc3Bhbj48L2R0PgogICAgICA8ZGQ+TW92ZSB0aGUgY3Vyc29yIHVwIG9uZSBsaW5lLjwvZGQ+CgogICAgICA8ZHQgY2xhc3M9Y29tbWFuZCBpZD1jb21tYW5kX2dvTGluZURvd24+PGNvZGU+PHN0cm9uZz5nb0xpbmVEb3duPC9zdHJvbmc+PC9jb2RlPjxzcGFuIGNsYXNzPWtleWJpbmRpbmc+RG93biwgQ3RybC1OIChNYWMpPC9zcGFuPjwvZHQ+CiAgICAgIDxkZD5Nb3ZlIGRvd24gb25lIGxpbmUuPC9kZD4KCiAgICAgIDxkdCBjbGFzcz1jb21tYW5kIGlkPWNvbW1hbmRfZ29QYWdlVXA+PGNvZGU+PHN0cm9uZz5nb1BhZ2VVcDwvc3Ryb25nPjwvY29kZT48c3BhbiBjbGFzcz1rZXliaW5kaW5nPlBhZ2VVcCwgU2hpZnQtQ3RybC1WIChNYWMpPC9zcGFuPjwvZHQ+CiAgICAgIDxkZD5Nb3ZlIHRoZSBjdXJzb3IgdXAgb25lIHNjcmVlbiwgYW5kIHNjcm9sbCB1cCBieSB0aGUgc2FtZSBkaXN0YW5jZS48L2RkPgoKICAgICAgPGR0IGNsYXNzPWNvbW1hbmQgaWQ9Y29tbWFuZF9nb1BhZ2VEb3duPjxjb2RlPjxzdHJvbmc+Z29QYWdlRG93bjwvc3Ryb25nPjwvY29kZT48c3BhbiBjbGFzcz1rZXliaW5kaW5nPlBhZ2VEb3duLCBDdHJsLVYgKE1hYyk8L3NwYW4+PC9kdD4KICAgICAgPGRkPk1vdmUgdGhlIGN1cnNvciBkb3duIG9uZSBzY3JlZW4sIGFuZCBzY3JvbGwgZG93biBieSB0aGUgc2FtZSBkaXN0YW5jZS48L2RkPgoKICAgICAgPGR0IGNsYXNzPWNvbW1hbmQgaWQ9Y29tbWFuZF9nb0NoYXJMZWZ0Pjxjb2RlPjxzdHJvbmc+Z29DaGFyTGVmdDwvc3Ryb25nPjwvY29kZT48c3BhbiBjbGFzcz1rZXliaW5kaW5nPkxlZnQsIEN0cmwtQiAoTWFjKTwvc3Bhbj48L2R0PgogICAgICA8ZGQ+TW92ZSB0aGUgY3Vyc29yIG9uZSBjaGFyYWN0ZXIgbGVmdCwgZ29pbmcgdG8gdGhlIHByZXZpb3VzIGxpbmUKICAgICAgd2hlbiBoaXR0aW5nIHRoZSBzdGFydCBvZiBsaW5lLjwvZGQ+CgogICAgICA8ZHQgY2xhc3M9Y29tbWFuZCBpZD1jb21tYW5kX2dvQ2hhclJpZ2h0Pjxjb2RlPjxzdHJvbmc+Z29DaGFyUmlnaHQ8L3N0cm9uZz48L2NvZGU+PHNwYW4gY2xhc3M9a2V5YmluZGluZz5SaWdodCwgQ3RybC1GIChNYWMpPC9zcGFuPjwvZHQ+CiAgICAgIDxkZD5Nb3ZlIHRoZSBjdXJzb3Igb25lIGNoYXJhY3RlciByaWdodCwgZ29pbmcgdG8gdGhlIG5leHQgbGluZQogICAgICB3aGVuIGhpdHRpbmcgdGhlIGVuZCBvZiBsaW5lLjwvZGQ+CgogICAgICA8ZHQgY2xhc3M9Y29tbWFuZCBpZD1jb21tYW5kX2dvQ29sdW1uTGVmdD48Y29kZT48c3Ryb25nPmdvQ29sdW1uTGVmdDwvc3Ryb25nPjwvY29kZT48L2R0PgogICAgICA8ZGQ+TW92ZSB0aGUgY3Vyc29yIG9uZSBjaGFyYWN0ZXIgbGVmdCwgYnV0IGRvbid0IGNyb3NzIGxpbmUgYm91bmRhcmllcy48L2RkPgoKICAgICAgPGR0IGNsYXNzPWNvbW1hbmQgaWQ9Y29tbWFuZF9nb0NvbHVtblJpZ2h0Pjxjb2RlPjxzdHJvbmc+Z29Db2x1bW5SaWdodDwvc3Ryb25nPjwvY29kZT48L2R0PgogICAgICA8ZGQ+TW92ZSB0aGUgY3Vyc29yIG9uZSBjaGFyYWN0ZXIgcmlnaHQsIGRvbid0IGNyb3NzIGxpbmUgYm91bmRhcmllcy48L2RkPgoKICAgICAgPGR0IGNsYXNzPWNvbW1hbmQgaWQ9Y29tbWFuZF9nb1dvcmRMZWZ0Pjxjb2RlPjxzdHJvbmc+Z29Xb3JkTGVmdDwvc3Ryb25nPjwvY29kZT48c3BhbiBjbGFzcz1rZXliaW5kaW5nPkFsdC1CIChNYWMpPC9zcGFuPjwvZHQ+CiAgICAgIDxkZD5Nb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIHN0YXJ0IG9mIHRoZSBwcmV2aW91cyB3b3JkLjwvZGQ+CgogICAgICA8ZHQgY2xhc3M9Y29tbWFuZCBpZD1jb21tYW5kX2dvV29yZFJpZ2h0Pjxjb2RlPjxzdHJvbmc+Z29Xb3JkUmlnaHQ8L3N0cm9uZz48L2NvZGU+PHNwYW4gY2xhc3M9a2V5YmluZGluZz5BbHQtRiAoTWFjKTwvc3Bhbj48L2R0PgogICAgICA8ZGQ+TW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBlbmQgb2YgdGhlIG5leHQgd29yZC48L2RkPgoKICAgICAgPGR0IGNsYXNzPWNvbW1hbmQgaWQ9Y29tbWFuZF9nb0dyb3VwTGVmdD48Y29kZT48c3Ryb25nPmdvR3JvdXBMZWZ0PC9zdHJvbmc+PC9jb2RlPjxzcGFuIGNsYXNzPWtleWJpbmRpbmc+Q3RybC1MZWZ0IChQQyksIEFsdC1MZWZ0IChNYWMpPC9zcGFuPjwvZHQ+CiAgICAgIDxkZD5Nb3ZlIHRvIHRoZSBsZWZ0IG9mIHRoZSBncm91cCBiZWZvcmUgdGhlIGN1cnNvci4gQSBncm91cCBpcwogICAgICBhIHN0cmV0Y2ggb2Ygd29yZCBjaGFyYWN0ZXJzLCBhIHN0cmV0Y2ggb2YgcHVuY3R1YXRpb24KICAgICAgY2hhcmFjdGVycywgYSBuZXdsaW5lLCBvciBhIHN0cmV0Y2ggb2YgPGVtPm1vcmUgdGhhbiBvbmU8L2VtPgogICAgICB3aGl0ZXNwYWNlIGNoYXJhY3Rlci48L2RkPgoKICAgICAgPGR0IGNsYXNzPWNvbW1hbmQgaWQ9Y29tbWFuZF9nb0dyb3VwUmlnaHQ+PGNvZGU+PHN0cm9uZz5nb0dyb3VwUmlnaHQ8L3N0cm9uZz48L2NvZGU+PHNwYW4gY2xhc3M9a2V5YmluZGluZz5DdHJsLVJpZ2h0IChQQyksIEFsdC1SaWdodCAoTWFjKTwvc3Bhbj48L2R0PgogICAgICA8ZGQ+TW92ZSB0byB0aGUgcmlnaHQgb2YgdGhlIGdyb3VwIGFmdGVyIHRoZSBjdXJzb3IKICAgICAgKHNlZSA8YSBocmVmPSIjY29tbWFuZF9nb0dyb3VwTGVmdCI+YWJvdmU8L2E+KS48L2RkPgoKICAgICAgPGR0IGNsYXNzPWNvbW1hbmQgaWQ9Y29tbWFuZF9kZWxDaGFyQmVmb3JlPjxjb2RlPjxzdHJvbmc+ZGVsQ2hhckJlZm9yZTwvc3Ryb25nPjwvY29kZT48c3BhbiBjbGFzcz1rZXliaW5kaW5nPlNoaWZ0LUJhY2tzcGFjZSwgQ3RybC1IIChNYWMpPC9zcGFuPjwvZHQ+CiAgICAgIDxkZD5EZWxldGUgdGhlIGNoYXJhY3RlciBiZWZvcmUgdGhlIGN1cnNvci48L2RkPgoKICAgICAgPGR0IGNsYXNzPWNvbW1hbmQgaWQ9Y29tbWFuZF9kZWxDaGFyQWZ0ZXI+PGNvZGU+PHN0cm9uZz5kZWxDaGFyQWZ0ZXI8L3N0cm9uZz48L2NvZGU+PHNwYW4gY2xhc3M9a2V5YmluZGluZz5EZWxldGUsIEN0cmwtRCAoTWFjKTwvc3Bhbj48L2R0PgogICAgICA8ZGQ+RGVsZXRlIHRoZSBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIGN1cnNvci48L2RkPgoKICAgICAgPGR0IGNsYXNzPWNvbW1hbmQgaWQ9Y29tbWFuZF9kZWxXb3JkQmVmb3JlPjxjb2RlPjxzdHJvbmc+ZGVsV29yZEJlZm9yZTwvc3Ryb25nPjwvY29kZT48c3BhbiBjbGFzcz1rZXliaW5kaW5nPkFsdC1CYWNrc3BhY2UgKE1hYyk8L3NwYW4+PC9kdD4KICAgICAgPGRkPkRlbGV0ZSB1cCB0byB0aGUgc3RhcnQgb2YgdGhlIHdvcmQgYmVmb3JlIHRoZSBjdXJzb3IuPC9kZD4KCiAgICAgIDxkdCBjbGFzcz1jb21tYW5kIGlkPWNvbW1hbmRfZGVsV29yZEFmdGVyPjxjb2RlPjxzdHJvbmc+ZGVsV29yZEFmdGVyPC9zdHJvbmc+PC9jb2RlPjxzcGFuIGNsYXNzPWtleWJpbmRpbmc+QWx0LUQgKE1hYyk8L3NwYW4+PC9kdD4KICAgICAgPGRkPkRlbGV0ZSB1cCB0byB0aGUgZW5kIG9mIHRoZSB3b3JkIGFmdGVyIHRoZSBjdXJzb3IuPC9kZD4KCiAgICAgIDxkdCBjbGFzcz1jb21tYW5kIGlkPWNvbW1hbmRfZGVsR3JvdXBCZWZvcmU+PGNvZGU+PHN0cm9uZz5kZWxHcm91cEJlZm9yZTwvc3Ryb25nPjwvY29kZT48c3BhbiBjbGFzcz1rZXliaW5kaW5nPkN0cmwtQmFja3NwYWNlIChQQyksIEFsdC1CYWNrc3BhY2UgKE1hYyk8L3NwYW4+PC9kdD4KICAgICAgPGRkPkRlbGV0ZSB0byB0aGUgbGVmdCBvZiB0aGUgPGEgaHJlZj0iI2NvbW1hbmRfZ29Hcm91cExlZnQiPmdyb3VwPC9hPiBiZWZvcmUgdGhlIGN1cnNvci48L2RkPgoKICAgICAgPGR0IGNsYXNzPWNvbW1hbmQgaWQ9Y29tbWFuZF9kZWxHcm91cEFmdGVyPjxjb2RlPjxzdHJvbmc+ZGVsR3JvdXBBZnRlcjwvc3Ryb25nPjwvY29kZT48c3BhbiBjbGFzcz1rZXliaW5kaW5nPkN0cmwtRGVsZXRlIChQQyksIEN0cmwtQWx0LUJhY2tzcGFjZSAoTWFjKSwgQWx0LURlbGV0ZSAoTWFjKTwvc3Bhbj48L2R0PgogICAgICA8ZGQ+RGVsZXRlIHRvIHRoZSBzdGFydCBvZiB0aGUgPGEgaHJlZj0iI2NvbW1hbmRfZ29Hcm91cExlZnQiPmdyb3VwPC9hPiBhZnRlciB0aGUgY3Vyc29yLjwvZGQ+CgogICAgICA8ZHQgY2xhc3M9Y29tbWFuZCBpZD1jb21tYW5kX2luZGVudEF1dG8+PGNvZGU+PHN0cm9uZz5pbmRlbnRBdXRvPC9zdHJvbmc+PC9jb2RlPjxzcGFuIGNsYXNzPWtleWJpbmRpbmc+U2hpZnQtVGFiPC9zcGFuPjwvZHQ+CiAgICAgIDxkZD5BdXRvLWluZGVudCB0aGUgY3VycmVudCBsaW5lIG9yIHNlbGVjdGlvbi48L2RkPgoKICAgICAgPGR0IGNsYXNzPWNvbW1hbmQgaWQ9Y29tbWFuZF9pbmRlbnRNb3JlPjxjb2RlPjxzdHJvbmc+aW5kZW50TW9yZTwvc3Ryb25nPjwvY29kZT48c3BhbiBjbGFzcz1rZXliaW5kaW5nPkN0cmwtXSAoUEMpLCBDbWQtXSAoTWFjKTwvc3Bhbj48L2R0PgogICAgICA8ZGQ+SW5kZW50IHRoZSBjdXJyZW50IGxpbmUgb3Igc2VsZWN0aW9uIGJ5IG9uZSA8YSBocmVmPSIjb3B0aW9uX2luZGVudFVuaXQiPmluZGVudCB1bml0PC9hPi48L2RkPgoKICAgICAgPGR0IGNsYXNzPWNvbW1hbmQgaWQ9Y29tbWFuZF9pbmRlbnRMZXNzPjxjb2RlPjxzdHJvbmc+aW5kZW50TGVzczwvc3Ryb25nPjwvY29kZT48c3BhbiBjbGFzcz1rZXliaW5kaW5nPkN0cmwtWyAoUEMpLCBDbWQtWyAoTWFjKTwvc3Bhbj48L2R0PgogICAgICA8ZGQ+RGVkZW50IHRoZSBjdXJyZW50IGxpbmUgb3Igc2VsZWN0aW9uIGJ5IG9uZSA8YSBocmVmPSIjb3B0aW9uX2luZGVudFVuaXQiPmluZGVudCB1bml0PC9hPi48L2RkPgoKICAgICAgPGR0IGNsYXNzPWNvbW1hbmQgaWQ9Y29tbWFuZF9pbnNlcnRUYWI+PGNvZGU+PHN0cm9uZz5pbnNlcnRUYWI8L3N0cm9uZz48L2NvZGU+PC9kdD4KICAgICAgPGRkPkluc2VydCBhIHRhYiBjaGFyYWN0ZXIgYXQgdGhlIGN1cnNvci48L2RkPgoKICAgICAgPGR0IGNsYXNzPWNvbW1hbmQgaWQ9Y29tbWFuZF9pbnNlcnRTb2Z0VGFiPjxjb2RlPjxzdHJvbmc+aW5zZXJ0U29mdFRhYjwvc3Ryb25nPjwvY29kZT48L2R0PgogICAgICA8ZGQ+SW5zZXJ0IHRoZSBhbW91bnQgb2Ygc3BhY2VzIHRoYXQgbWF0Y2ggdGhlIHdpZHRoIGEgdGFiIGF0CiAgICAgIHRoZSBjdXJzb3IgcG9zaXRpb24gd291bGQgaGF2ZS48L2RkPgoKICAgICAgPGR0IGNsYXNzPWNvbW1hbmQgaWQ9Y29tbWFuZF9kZWZhdWx0VGFiPjxjb2RlPjxzdHJvbmc+ZGVmYXVsdFRhYjwvc3Ryb25nPjwvY29kZT48c3BhbiBjbGFzcz1rZXliaW5kaW5nPlRhYjwvc3Bhbj48L2R0PgogICAgICA8ZGQ+SWYgc29tZXRoaW5nIGlzIHNlbGVjdGVkLCBpbmRlbnQgaXQgYnkKICAgICAgb25lIDxhIGhyZWY9IiNvcHRpb25faW5kZW50VW5pdCI+aW5kZW50IHVuaXQ8L2E+LiBJZiBub3RoaW5nIGlzCiAgICAgIHNlbGVjdGVkLCBpbnNlcnQgYSB0YWIgY2hhcmFjdGVyLjwvZGQ+CgogICAgICA8ZHQgY2xhc3M9Y29tbWFuZCBpZD1jb21tYW5kX3RyYW5zcG9zZUNoYXJzPjxjb2RlPjxzdHJvbmc+dHJhbnNwb3NlQ2hhcnM8L3N0cm9uZz48L2NvZGU+PHNwYW4gY2xhc3M9a2V5YmluZGluZz5DdHJsLVQgKE1hYyk8L3NwYW4+PC9kdD4KICAgICAgPGRkPlN3YXAgdGhlIGNoYXJhY3RlcnMgYmVmb3JlIGFuZCBhZnRlciB0aGUgY3Vyc29yLjwvZGQ+CgogICAgICA8ZHQgY2xhc3M9Y29tbWFuZCBpZD1jb21tYW5kX25ld2xpbmVBbmRJbmRlbnQ+PGNvZGU+PHN0cm9uZz5uZXdsaW5lQW5kSW5kZW50PC9zdHJvbmc+PC9jb2RlPjxzcGFuIGNsYXNzPWtleWJpbmRpbmc+RW50ZXI8L3NwYW4+PC9kdD4KICAgICAgPGRkPkluc2VydCBhIG5ld2xpbmUgYW5kIGF1dG8taW5kZW50IHRoZSBuZXcgbGluZS48L2RkPgoKICAgICAgPGR0IGNsYXNzPWNvbW1hbmQgaWQ9Y29tbWFuZF90b2dnbGVPdmVyd3JpdGU+PGNvZGU+PHN0cm9uZz50b2dnbGVPdmVyd3JpdGU8L3N0cm9uZz48L2NvZGU+PHNwYW4gY2xhc3M9a2V5YmluZGluZz5JbnNlcnQ8L3NwYW4+PC9kdD4KICAgICAgPGRkPkZsaXAgdGhlIDxhIGhyZWY9IiN0b2dnbGVPdmVyd3JpdGUiPm92ZXJ3cml0ZTwvYT4gZmxhZy48L2RkPgoKICAgICAgPGR0IGNsYXNzPWNvbW1hbmQgaWQ9Y29tbWFuZF9zYXZlPjxjb2RlPjxzdHJvbmc+c2F2ZTwvc3Ryb25nPjwvY29kZT48c3BhbiBjbGFzcz1rZXliaW5kaW5nPkN0cmwtUyAoUEMpLCBDbWQtUyAoTWFjKTwvc3Bhbj48L2R0PgogICAgICA8ZGQ+Tm90IGRlZmluZWQgYnkgdGhlIGNvcmUgbGlicmFyeSwgb25seSByZWZlcnJlZCB0byBpbgogICAgICBrZXkgbWFwcy4gSW50ZW5kZWQgdG8gcHJvdmlkZSBhbiBlYXN5IHdheSBmb3IgdXNlciBjb2RlIHRvIGRlZmluZQogICAgICBhIHNhdmUgY29tbWFuZC48L2RkPgoKICAgICAgPGR0IGNsYXNzPWNvbW1hbmQgaWQ9Y29tbWFuZF9maW5kPjxjb2RlPjxzdHJvbmc+ZmluZDwvc3Ryb25nPjwvY29kZT48c3BhbiBjbGFzcz1rZXliaW5kaW5nPkN0cmwtRiAoUEMpLCBDbWQtRiAoTWFjKTwvc3Bhbj48L2R0PgogICAgICA8ZHQgY2xhc3M9Y29tbWFuZCBpZD1jb21tYW5kX2ZpbmROZXh0Pjxjb2RlPjxzdHJvbmc+ZmluZE5leHQ8L3N0cm9uZz48L2NvZGU+PHNwYW4gY2xhc3M9a2V5YmluZGluZz5DdHJsLUcgKFBDKSwgQ21kLUcgKE1hYyk8L3NwYW4+PC9kdD4KICAgICAgPGR0IGNsYXNzPWNvbW1hbmQgaWQ9Y29tbWFuZF9maW5kUHJldj48Y29kZT48c3Ryb25nPmZpbmRQcmV2PC9zdHJvbmc+PC9jb2RlPjxzcGFuIGNsYXNzPWtleWJpbmRpbmc+U2hpZnQtQ3RybC1HIChQQyksIFNoaWZ0LUNtZC1HIChNYWMpPC9zcGFuPjwvZHQ+CiAgICAgIDxkdCBjbGFzcz1jb21tYW5kIGlkPWNvbW1hbmRfcmVwbGFjZT48Y29kZT48c3Ryb25nPnJlcGxhY2U8L3N0cm9uZz48L2NvZGU+PHNwYW4gY2xhc3M9a2V5YmluZGluZz5TaGlmdC1DdHJsLUYgKFBDKSwgQ21kLUFsdC1GIChNYWMpPC9zcGFuPjwvZHQ+CiAgICAgIDxkdCBjbGFzcz1jb21tYW5kIGlkPWNvbW1hbmRfcmVwbGFjZUFsbD48Y29kZT48c3Ryb25nPnJlcGxhY2VBbGw8L3N0cm9uZz48L2NvZGU+PHNwYW4gY2xhc3M9a2V5YmluZGluZz5TaGlmdC1DdHJsLVIgKFBDKSwgU2hpZnQtQ21kLUFsdC1GIChNYWMpPC9zcGFuPjwvZHQ+CiAgICAgIDxkZD5Ob3QgZGVmaW5lZCBieSB0aGUgY29yZSBsaWJyYXJ5LCBidXQgZGVmaW5lZCBpbgogICAgICB0aGUgPGEgaHJlZj0iI2FkZG9uX3NlYXJjaCI+c2VhcmNoIGFkZG9uPC9hPiAob3IgY3VzdG9tIGNsaWVudAogICAgICBhZGRvbnMpLjwvZGQ+CgogICAgPC9kbD4KCjwvc2VjdGlvbj4KCjxzZWN0aW9uIGlkPXN0eWxpbmc+CiAgICA8aDI+Q3VzdG9taXplZCBTdHlsaW5nPC9oMj4KCiAgICA8cD5VcCB0byBhIGNlcnRhaW4gZXh0ZW50LCBDb2RlTWlycm9yJ3MgbG9vayBjYW4gYmUgY2hhbmdlZCBieQogICAgbW9kaWZ5aW5nIHN0eWxlIHNoZWV0IGZpbGVzLiBUaGUgc3R5bGUgc2hlZXRzIHN1cHBsaWVkIGJ5IG1vZGVzCiAgICBzaW1wbHkgcHJvdmlkZSB0aGUgY29sb3JzIGZvciB0aGF0IG1vZGUsIGFuZCBjYW4gYmUgYWRhcHRlZCBpbiBhCiAgICB2ZXJ5IHN0cmFpZ2h0Zm9yd2FyZCB3YXkuIFRvIHN0eWxlIHRoZSBlZGl0b3IgaXRzZWxmLCBpdCBpcwogICAgcG9zc2libGUgdG8gYWx0ZXIgb3Igb3ZlcnJpZGUgdGhlIHN0eWxlcyBkZWZpbmVkCiAgICBpbiA8YSBocmVmPSIuLi9saWIvY29kZW1pcnJvci5jc3MiPjxjb2RlPmNvZGVtaXJyb3IuY3NzPC9jb2RlPjwvYT4uPC9wPgoKICAgIDxwPlNvbWUgY2FyZSBtdXN0IGJlIHRha2VuIHRoZXJlLCBzaW5jZSBhIGxvdCBvZiB0aGUgcnVsZXMgaW4gdGhpcwogICAgZmlsZSBhcmUgbmVjZXNzYXJ5IHRvIGhhdmUgQ29kZU1pcnJvciBmdW5jdGlvbiBwcm9wZXJseS4gQWRqdXN0aW5nCiAgICBjb2xvcnMgc2hvdWxkIGJlIHNhZmUsIG9mIGNvdXJzZSwgYW5kIHdpdGggc29tZSBjYXJlIGEgbG90IG9mCiAgICBvdGhlciB0aGluZ3MgY2FuIGJlIGNoYW5nZWQgYXMgd2VsbC4gVGhlIENTUyBjbGFzc2VzIGRlZmluZWQgaW4KICAgIHRoaXMgZmlsZSBzZXJ2ZSB0aGUgZm9sbG93aW5nIHJvbGVzOjwvcD4KCiAgICA8ZGw+CiAgICAgIDxkdCBpZD0iY2xhc3NfQ29kZU1pcnJvciI+PGNvZGU+PHN0cm9uZz5Db2RlTWlycm9yPC9zdHJvbmc+PC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5UaGUgb3V0ZXIgZWxlbWVudCBvZiB0aGUgZWRpdG9yLiBUaGlzIHNob3VsZCBiZSB1c2VkIGZvciB0aGUKICAgICAgZWRpdG9yIHdpZHRoLCBoZWlnaHQsIGJvcmRlcnMgYW5kIHBvc2l0aW9uaW5nLiBDYW4gYWxzbyBiZSB1c2VkCiAgICAgIHRvIHNldCBzdHlsZXMgdGhhdCBzaG91bGQgaG9sZCBmb3IgZXZlcnl0aGluZyBpbnNpZGUgdGhlIGVkaXRvcgogICAgICAoc3VjaCBhcyBmb250IGFuZCBmb250IHNpemUpLCBvciB0byBzZXQgYSBiYWNrZ3JvdW5kLjwvZGQ+CgogICAgICA8ZHQgaWQ9ImNsYXNzX0NvZGVNaXJyb3Jfc2Nyb2xsIj48Y29kZT48c3Ryb25nPkNvZGVNaXJyb3Itc2Nyb2xsPC9zdHJvbmc+PC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5XaGV0aGVyIHRoZSBlZGl0b3Igc2Nyb2xscyAoPGNvZGU+b3ZlcmZsb3c6IGF1dG88L2NvZGU+ICsKICAgICAgZml4ZWQgaGVpZ2h0KS4gQnkgZGVmYXVsdCwgaXQgZG9lcy4gU2V0dGluZwogICAgICB0aGUgPGNvZGU+Q29kZU1pcnJvcjwvY29kZT4gY2xhc3MgdG8gaGF2ZSA8Y29kZT5oZWlnaHQ6CiAgICAgIGF1dG88L2NvZGU+IGFuZCBnaXZpbmcgdGhpcyBjbGFzcyA8Y29kZT5vdmVyZmxvdy14OiBhdXRvOwogICAgICBvdmVyZmxvdy15OiBoaWRkZW47PC9jb2RlPiB3aWxsIGNhdXNlIHRoZSBlZGl0b3IKICAgICAgdG8gPGEgaHJlZj0iLi4vZGVtby9yZXNpemUuaHRtbCI+cmVzaXplIHRvIGZpdCBpdHMKICAgICAgY29udGVudDwvYT4uPC9kZD4KCiAgICAgIDxkdCBpZD0iY2xhc3NfQ29kZU1pcnJvcl9mb2N1c2VkIj48Y29kZT48c3Ryb25nPkNvZGVNaXJyb3ItZm9jdXNlZDwvc3Ryb25nPjwvY29kZT48L2R0PgogICAgICA8ZGQ+V2hlbmV2ZXIgdGhlIGVkaXRvciBpcyBmb2N1c2VkLCB0aGUgdG9wIGVsZW1lbnQgZ2V0cyB0aGlzCiAgICAgIGNsYXNzLiBUaGlzIGlzIHVzZWQgdG8gaGlkZSB0aGUgY3Vyc29yIGFuZCBnaXZlIHRoZSBzZWxlY3Rpb24gYQogICAgICBkaWZmZXJlbnQgY29sb3Igd2hlbiB0aGUgZWRpdG9yIGlzIG5vdCBmb2N1c2VkLjwvZGQ+CgogICAgICA8ZHQgaWQ9ImNsYXNzX0NvZGVNaXJyb3JfZ3V0dGVycyI+PGNvZGU+PHN0cm9uZz5Db2RlTWlycm9yLWd1dHRlcnM8L3N0cm9uZz48L2NvZGU+PC9kdD4KICAgICAgPGRkPlRoaXMgaXMgdGhlIGJhY2tkcm9wIGZvciBhbGwgZ3V0dGVycy4gVXNlIGl0IHRvIHNldCB0aGUKICAgICAgZGVmYXVsdCBndXR0ZXIgYmFja2dyb3VuZCBjb2xvciwgYW5kIG9wdGlvbmFsbHkgYWRkIGEgYm9yZGVyIG9uCiAgICAgIHRoZSByaWdodCBvZiB0aGUgZ3V0dGVycy48L2RkPgoKICAgICAgPGR0IGlkPSJjbGFzc19Db2RlTWlycm9yX2xpbmVudW1iZXJzIj48Y29kZT48c3Ryb25nPkNvZGVNaXJyb3ItbGluZW51bWJlcnM8L3N0cm9uZz48L2NvZGU+PC9kdD4KICAgICAgPGRkPlVzZSB0aGlzIGZvciBnaXZpbmcgYSBiYWNrZ3JvdW5kIG9yIHdpZHRoIHRvIHRoZSBsaW5lIG51bWJlcgogICAgICBndXR0ZXIuPC9kZD4KCiAgICAgIDxkdCBpZD0iY2xhc3NfQ29kZU1pcnJvcl9saW5lbnVtYmVyIj48Y29kZT48c3Ryb25nPkNvZGVNaXJyb3ItbGluZW51bWJlcjwvc3Ryb25nPjwvY29kZT48L2R0PgogICAgICA8ZGQ+VXNlZCB0byBzdHlsZSB0aGUgYWN0dWFsIGluZGl2aWR1YWwgbGluZSBudW1iZXJzLiBUaGVzZQogICAgICB3b24ndCBiZSBjaGlsZHJlbiBvZiB0aGUgPGNvZGU+Q29kZU1pcnJvci1saW5lbnVtYmVyczwvY29kZT4KICAgICAgKHBsdXJhbCkgZWxlbWVudCwgYnV0IHJhdGhlciB3aWxsIGJlIGFic29sdXRlbHkgcG9zaXRpb25lZCB0bwogICAgICBvdmVybGF5IGl0LiBVc2UgdGhpcyB0byBzZXQgYWxpZ25tZW50IGFuZCB0ZXh0IHByb3BlcnRpZXMgZm9yCiAgICAgIHRoZSBsaW5lIG51bWJlcnMuPC9kZD4KCiAgICAgIDxkdCBpZD0iY2xhc3NfQ29kZU1pcnJvcl9saW5lcyI+PGNvZGU+PHN0cm9uZz5Db2RlTWlycm9yLWxpbmVzPC9zdHJvbmc+PC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5UaGUgdmlzaWJsZSBsaW5lcy4gVGhpcyBpcyB3aGVyZSB5b3Ugc3BlY2lmeSB2ZXJ0aWNhbAogICAgICBwYWRkaW5nIGZvciB0aGUgZWRpdG9yIGNvbnRlbnQuPC9kZD4KCiAgICAgIDxkdCBpZD0iY2xhc3NfQ29kZU1pcnJvcl9jdXJzb3IiPjxjb2RlPjxzdHJvbmc+Q29kZU1pcnJvci1jdXJzb3I8L3N0cm9uZz48L2NvZGU+PC9kdD4KICAgICAgPGRkPlRoZSBjdXJzb3IgaXMgYSBibG9jayBlbGVtZW50IHRoYXQgaXMgYWJzb2x1dGVseSBwb3NpdGlvbmVkLgogICAgICBZb3UgY2FuIG1ha2UgaXQgbG9vayB3aGljaGV2ZXIgd2F5IHlvdSB3YW50LjwvZGQ+CgogICAgICA8ZHQgaWQ9ImNsYXNzX0NvZGVNaXJyb3Jfc2VsZWN0ZWQiPjxjb2RlPjxzdHJvbmc+Q29kZU1pcnJvci1zZWxlY3RlZDwvc3Ryb25nPjwvY29kZT48L2R0PgogICAgICA8ZGQ+VGhlIHNlbGVjdGlvbiBpcyByZXByZXNlbnRlZCBieSA8Y29kZT5zcGFuPC9jb2RlPiBlbGVtZW50cwogICAgICB3aXRoIHRoaXMgY2xhc3MuPC9kZD4KCiAgICAgIDxkdCBpZD0iY2xhc3NfQ29kZU1pcnJvcl9tYXRjaGluZ2JyYWNrZXQiPjxjb2RlPjxzdHJvbmc+Q29kZU1pcnJvci1tYXRjaGluZ2JyYWNrZXQ8L3N0cm9uZz48L2NvZGU+LAogICAgICAgIDxjb2RlPjxzdHJvbmc+Q29kZU1pcnJvci1ub25tYXRjaGluZ2JyYWNrZXQ8L3N0cm9uZz48L2NvZGU+PC9kdD4KICAgICAgPGRkPlRoZXNlIGFyZSB1c2VkIHRvIHN0eWxlIG1hdGNoZWQgKG9yIHVubWF0Y2hlZCkgYnJhY2tldHMuPC9kZD4KICAgIDwvZGw+CgogICAgPHA+SWYgeW91ciBwYWdlJ3Mgc3R5bGUgc2hlZXRzIGRvIGZ1bmt5IHRoaW5ncyB0bwogICAgYWxsIDxjb2RlPmRpdjwvY29kZT4gb3IgPGNvZGU+cHJlPC9jb2RlPiBlbGVtZW50cyAoeW91IHByb2JhYmx5CiAgICBzaG91bGRuJ3QgZG8gdGhhdCksIHlvdSdsbCBoYXZlIHRvIGRlZmluZSBydWxlcyB0byBjYW5jZWwgdGhlc2UKICAgIGVmZmVjdHMgb3V0IGFnYWluIGZvciBlbGVtZW50cyB1bmRlciB0aGUgPGNvZGU+Q29kZU1pcnJvcjwvY29kZT4KICAgIGNsYXNzLjwvcD4KCiAgICA8cD5UaGVtZXMgYXJlIGFsc28gc2ltcGx5IENTUyBmaWxlcywgd2hpY2ggZGVmaW5lIGNvbG9ycyBmb3IKICAgIHZhcmlvdXMgc3ludGFjdGljIGVsZW1lbnRzLiBTZWUgdGhlIGZpbGVzIGluCiAgICB0aGUgPGEgaHJlZj0iLi4vdGhlbWUvIj48Y29kZT50aGVtZTwvY29kZT48L2E+IGRpcmVjdG9yeS48L3A+Cjwvc2VjdGlvbj4KCjxzZWN0aW9uIGlkPWFwaT4KICAgIDxoMj5Qcm9ncmFtbWluZyBBUEk8L2gyPgoKICAgIDxwPkEgbG90IG9mIENvZGVNaXJyb3IgZmVhdHVyZXMgYXJlIG9ubHkgYXZhaWxhYmxlIHRocm91Z2ggaXRzCiAgICBBUEkuIFRodXMsIHlvdSBuZWVkIHRvIHdyaXRlIGNvZGUgKG9yCiAgICB1c2UgPGEgaHJlZj0iI2FkZG9ucyI+YWRkb25zPC9hPikgaWYgeW91IHdhbnQgdG8gZXhwb3NlIHRoZW0gdG8KICAgIHlvdXIgdXNlcnMuPC9wPgoKICAgIDxwPldoZW5ldmVyIHBvaW50cyBpbiB0aGUgZG9jdW1lbnQgYXJlIHJlcHJlc2VudGVkLCB0aGUgQVBJIHVzZXMKICAgIG9iamVjdHMgd2l0aCA8Y29kZT5saW5lPC9jb2RlPiBhbmQgPGNvZGU+Y2g8L2NvZGU+IHByb3BlcnRpZXMuCiAgICBCb3RoIGFyZSB6ZXJvLWJhc2VkLiBDb2RlTWlycm9yIG1ha2VzIHN1cmUgdG8gJ2NsaXAnIGFueSBwb3NpdGlvbnMKICAgIHBhc3NlZCBieSBjbGllbnQgY29kZSBzbyB0aGF0IHRoZXkgZml0IGluc2lkZSB0aGUgZG9jdW1lbnQsIHNvIHlvdQogICAgc2hvdWxkbid0IHdvcnJ5IHRvbyBtdWNoIGFib3V0IHNhbml0aXppbmcgeW91ciBjb29yZGluYXRlcy4gSWYgeW91CiAgICBnaXZlIDxjb2RlPmNoPC9jb2RlPiBhIHZhbHVlIG9mIDxjb2RlPm51bGw8L2NvZGU+LCBvciBkb24ndAogICAgc3BlY2lmeSBpdCwgaXQgd2lsbCBiZSByZXBsYWNlZCB3aXRoIHRoZSBsZW5ndGggb2YgdGhlIHNwZWNpZmllZAogICAgbGluZS48L3A+CgogICAgPHA+TWV0aG9kcyBwcmVmaXhlZCB3aXRoIDxjb2RlPmRvYy48L2NvZGU+IGNhbiwgdW5sZXNzIG90aGVyd2lzZQogICAgc3BlY2lmaWVkLCBiZSBjYWxsZWQgYm90aCBvbiA8Y29kZT5Db2RlTWlycm9yPC9jb2RlPiAoZWRpdG9yKQogICAgaW5zdGFuY2VzIGFuZCA8Y29kZT5Db2RlTWlycm9yLkRvYzwvY29kZT4gaW5zdGFuY2VzLiBNZXRob2RzCiAgICBwcmVmaXhlZCB3aXRoIDxjb2RlPmNtLjwvY29kZT4gYXJlIDxlbT5vbmx5PC9lbT4gYXZhaWxhYmxlCiAgICBvbiA8Y29kZT5Db2RlTWlycm9yPC9jb2RlPiBpbnN0YW5jZXMuPC9wPgoKICAgIDxoMyBpZD0iYXBpX2NvbnN0cnVjdG9yIj5Db25zdHJ1Y3RvcjwvaDM+CgogICAgPHAgaWQ9IkNvZGVNaXJyb3IiPkNvbnN0cnVjdGluZyBhbiBlZGl0b3IgaW5zdGFuY2UgaXMgZG9uZSB3aXRoCiAgICB0aGUgPGNvZGU+PHN0cm9uZz5Db2RlTWlycm9yPC9zdHJvbmc+KHBsYWNlOiBFbGVtZW50fGZuKEVsZW1lbnQpLAogICAgP29wdGlvbjogb2JqZWN0KTwvY29kZT4gY29uc3RydWN0b3IuIElmIHRoZSA8Y29kZT5wbGFjZTwvY29kZT4KICAgIGFyZ3VtZW50IGlzIGEgRE9NIGVsZW1lbnQsIHRoZSBlZGl0b3Igd2lsbCBiZSBhcHBlbmRlZCB0byBpdC4gSWYKICAgIGl0IGlzIGEgZnVuY3Rpb24sIGl0IHdpbGwgYmUgY2FsbGVkLCBhbmQgaXMgZXhwZWN0ZWQgdG8gcGxhY2UgdGhlCiAgICBlZGl0b3IgaW50byB0aGUgZG9jdW1lbnQuIDxjb2RlPm9wdGlvbnM8L2NvZGU+IG1heSBiZSBhbiBlbGVtZW50CiAgICBtYXBwaW5nIDxhIGhyZWY9IiNjb25maWciPm9wdGlvbiBuYW1lczwvYT4gdG8gdmFsdWVzLiBUaGUgb3B0aW9ucwogICAgdGhhdCBpdCBkb2Vzbid0IGV4cGxpY2l0bHkgc3BlY2lmeSAob3IgYWxsIG9wdGlvbnMsIGlmIGl0IGlzIG5vdAogICAgcGFzc2VkKSB3aWxsIGJlIHRha2VuCiAgICBmcm9tIDxhIGhyZWY9IiNkZWZhdWx0cyI+PGNvZGU+Q29kZU1pcnJvci5kZWZhdWx0czwvY29kZT48L2E+LjwvcD4KCiAgICA8cD5Ob3RlIHRoYXQgdGhlIG9wdGlvbnMgb2JqZWN0IHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3Igd2lsbCBiZQogICAgbXV0YXRlZCB3aGVuIHRoZSBpbnN0YW5jZSdzIG9wdGlvbnMKICAgIGFyZSA8YSBocmVmPSIjc2V0T3B0aW9uIj5jaGFuZ2VkPC9hPiwgc28geW91IHNob3VsZG4ndCBzaGFyZSBzdWNoCiAgICBvYmplY3RzIGJldHdlZW4gaW5zdGFuY2VzLjwvcD4KCiAgICA8cD5TZWUgPGEgaHJlZj0iI2Zyb21UZXh0QXJlYSI+PGNvZGU+Q29kZU1pcnJvci5mcm9tVGV4dEFyZWE8L2NvZGU+PC9hPgogICAgZm9yIGFub3RoZXIgd2F5IHRvIGNvbnN0cnVjdCBhbiBlZGl0b3IgaW5zdGFuY2UuPC9wPgoKICAgIDxoMyBpZD0iYXBpX2NvbnRlbnQiPkNvbnRlbnQgbWFuaXB1bGF0aW9uIG1ldGhvZHM8L2gzPgoKICAgIDxkbD4KICAgICAgPGR0IGlkPSJnZXRWYWx1ZSI+PGNvZGU+PHN0cm9uZz5kb2MuZ2V0VmFsdWU8L3N0cm9uZz4oP3NlcGFyYXRvcjogc3RyaW5nKSDihpIgc3RyaW5nPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5HZXQgdGhlIGN1cnJlbnQgZWRpdG9yIGNvbnRlbnQuIFlvdSBjYW4gcGFzcyBpdCBhbiBvcHRpb25hbAogICAgICBhcmd1bWVudCB0byBzcGVjaWZ5IHRoZSBzdHJpbmcgdG8gYmUgdXNlZCB0byBzZXBhcmF0ZSBsaW5lcwogICAgICAoZGVmYXVsdHMgdG8gPGNvZGU+IlxuIjwvY29kZT4pLjwvZGQ+CiAgICAgIDxkdCBpZD0ic2V0VmFsdWUiPjxjb2RlPjxzdHJvbmc+ZG9jLnNldFZhbHVlPC9zdHJvbmc+KGNvbnRlbnQ6IHN0cmluZyk8L2NvZGU+PC9kdD4KICAgICAgPGRkPlNldCB0aGUgZWRpdG9yIGNvbnRlbnQuPC9kZD4KCiAgICAgIDxkdCBpZD0iZ2V0UmFuZ2UiPjxjb2RlPjxzdHJvbmc+ZG9jLmdldFJhbmdlPC9zdHJvbmc+KGZyb206IHtsaW5lLCBjaH0sIHRvOiB7bGluZSwgY2h9LCA/c2VwYXJhdG9yOiBzdHJpbmcpIOKGkiBzdHJpbmc8L2NvZGU+PC9kdD4KICAgICAgPGRkPkdldCB0aGUgdGV4dCBiZXR3ZWVuIHRoZSBnaXZlbiBwb2ludHMgaW4gdGhlIGVkaXRvciwgd2hpY2gKICAgICAgc2hvdWxkIGJlIDxjb2RlPntsaW5lLCBjaH08L2NvZGU+IG9iamVjdHMuIEFuIG9wdGlvbmFsIHRoaXJkCiAgICAgIGFyZ3VtZW50IGNhbiBiZSBnaXZlbiB0byBpbmRpY2F0ZSB0aGUgbGluZSBzZXBhcmF0b3Igc3RyaW5nIHRvCiAgICAgIHVzZSAoZGVmYXVsdHMgdG8gPGNvZGU+IlxuIjwvY29kZT4pLjwvZGQ+CiAgICAgIDxkdCBpZD0icmVwbGFjZVJhbmdlIj48Y29kZT48c3Ryb25nPmRvYy5yZXBsYWNlUmFuZ2U8L3N0cm9uZz4ocmVwbGFjZW1lbnQ6IHN0cmluZywgZnJvbToge2xpbmUsIGNofSwgdG86wqB7bGluZSzCoGNofSwgP29yaWdpbjrCoHN0cmluZyk8L2NvZGU+PC9kdD4KICAgICAgPGRkPlJlcGxhY2UgdGhlIHBhcnQgb2YgdGhlIGRvY3VtZW50IGJldHdlZW4gPGNvZGU+ZnJvbTwvY29kZT4KICAgICAgYW5kIDxjb2RlPnRvPC9jb2RlPiB3aXRoIHRoZSBnaXZlbiBzdHJpbmcuIDxjb2RlPmZyb208L2NvZGU+CiAgICAgIGFuZCA8Y29kZT50bzwvY29kZT4gbXVzdCBiZSA8Y29kZT57bGluZSwgY2h9PC9jb2RlPgogICAgICBvYmplY3RzLiA8Y29kZT50bzwvY29kZT4gY2FuIGJlIGxlZnQgb2ZmIHRvIHNpbXBseSBpbnNlcnQgdGhlCiAgICAgIHN0cmluZyBhdCBwb3NpdGlvbiA8Y29kZT5mcm9tPC9jb2RlPi4gV2hlbiA8Y29kZT5vcmlnaW48L2NvZGU+CiAgICAgIGlzIGdpdmVuLCBpdCB3aWxsIGJlIHBhc3NlZCBvbgogICAgICB0byA8YSBocmVmPSIjZXZlbnRfY2hhbmdlIj48Y29kZT4iY2hhbmdlIjwvY29kZT4gZXZlbnRzPC9hPiwgYW5kCiAgICAgIGl0cyBmaXJzdCBsZXR0ZXIgd2lsbCBiZSB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIHRoaXMgY2hhbmdlCiAgICAgIGNhbiBiZSBtZXJnZWQgd2l0aCBwcmV2aW91cyBoaXN0b3J5IGV2ZW50cywgaW4gdGhlIHdheSBkZXNjcmliZWQKICAgICAgZm9yIDxhIGhyZWY9IiNzZWxlY3Rpb25fb3JpZ2luIj5zZWxlY3Rpb24gb3JpZ2luczwvYT4uPC9kZD4KCiAgICAgIDxkdCBpZD0iZ2V0TGluZSI+PGNvZGU+PHN0cm9uZz5kb2MuZ2V0TGluZTwvc3Ryb25nPihuOiBpbnRlZ2VyKSDihpIgc3RyaW5nPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5HZXQgdGhlIGNvbnRlbnQgb2YgbGluZSA8Y29kZT5uPC9jb2RlPi48L2RkPgoKICAgICAgPGR0IGlkPSJsaW5lQ291bnQiPjxjb2RlPjxzdHJvbmc+ZG9jLmxpbmVDb3VudDwvc3Ryb25nPigpIOKGkiBpbnRlZ2VyPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5HZXQgdGhlIG51bWJlciBvZiBsaW5lcyBpbiB0aGUgZWRpdG9yLjwvZGQ+CiAgICAgIDxkdCBpZD0iZmlyc3RMaW5lIj48Y29kZT48c3Ryb25nPmRvYy5maXJzdExpbmU8L3N0cm9uZz4oKSDihpIgaW50ZWdlcjwvY29kZT48L2R0PgogICAgICA8ZGQ+R2V0IHRoZSBmaXJzdCBsaW5lIG9mIHRoZSBlZGl0b3IuIFRoaXMgd2lsbAogICAgICB1c3VhbGx5IGJlIHplcm8gYnV0IGZvciA8YSBocmVmPSIjbGlua2VkRG9jX2Zyb20iPmxpbmtlZCBzdWItdmlld3M8L2E+LAogICAgICBvciA8YSBocmVmPSIjYXBpX2RvYyI+ZG9jdW1lbnRzPC9hPiBpbnN0YW50aWF0ZWQgd2l0aCBhIG5vbi16ZXJvCiAgICAgIGZpcnN0IGxpbmUsIGl0IG1pZ2h0IHJldHVybiBvdGhlciB2YWx1ZXMuPC9kZD4KICAgICAgPGR0IGlkPSJsYXN0TGluZSI+PGNvZGU+PHN0cm9uZz5kb2MubGFzdExpbmU8L3N0cm9uZz4oKSDihpIgaW50ZWdlcjwvY29kZT48L2R0PgogICAgICA8ZGQ+R2V0IHRoZSBsYXN0IGxpbmUgb2YgdGhlIGVkaXRvci4gVGhpcyB3aWxsCiAgICAgIHVzdWFsbHkgYmUgPGNvZGU+ZG9jLmxpbmVDb3VudCgpIC0gMTwvY29kZT4sCiAgICAgIGJ1dCBmb3IgPGEgaHJlZj0iI2xpbmtlZERvY19mcm9tIj5saW5rZWQgc3ViLXZpZXdzPC9hPiwKICAgICAgaXQgbWlnaHQgcmV0dXJuIG90aGVyIHZhbHVlcy48L2RkPgoKICAgICAgPGR0IGlkPSJnZXRMaW5lSGFuZGxlIj48Y29kZT48c3Ryb25nPmRvYy5nZXRMaW5lSGFuZGxlPC9zdHJvbmc+KG51bTogaW50ZWdlcikg4oaSIExpbmVIYW5kbGU8L2NvZGU+PC9kdD4KICAgICAgPGRkPkZldGNoZXMgdGhlIGxpbmUgaGFuZGxlIGZvciB0aGUgZ2l2ZW4gbGluZSBudW1iZXIuPC9kZD4KICAgICAgPGR0IGlkPSJnZXRMaW5lTnVtYmVyIj48Y29kZT48c3Ryb25nPmRvYy5nZXRMaW5lTnVtYmVyPC9zdHJvbmc+KGhhbmRsZTogTGluZUhhbmRsZSkg4oaSIGludGVnZXI8L2NvZGU+PC9kdD4KICAgICAgPGRkPkdpdmVuIGEgbGluZSBoYW5kbGUsIHJldHVybnMgdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgdGhhdAogICAgICBsaW5lIChvciA8Y29kZT5udWxsPC9jb2RlPiB3aGVuIGl0IGlzIG5vIGxvbmdlciBpbiB0aGUKICAgICAgZG9jdW1lbnQpLjwvZGQ+CiAgICAgIDxkdCBpZD0iZWFjaExpbmUiPjxjb2RlPjxzdHJvbmc+ZG9jLmVhY2hMaW5lPC9zdHJvbmc+KGY6IChsaW5lOiBMaW5lSGFuZGxlKSk8L2NvZGU+PC9kdD4KICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+ZG9jLmVhY2hMaW5lPC9zdHJvbmc+KHN0YXJ0OiBpbnRlZ2VyLCBlbmQ6IGludGVnZXIsIGY6IChsaW5lOiBMaW5lSGFuZGxlKSk8L2NvZGU+PC9kdD4KICAgICAgPGRkPkl0ZXJhdGUgb3ZlciB0aGUgd2hvbGUgZG9jdW1lbnQsIG9yIGlmIDxjb2RlPnN0YXJ0PC9jb2RlPgogICAgICBhbmQgPGNvZGU+ZW5kPC9jb2RlPiBsaW5lIG51bWJlcnMgYXJlIGdpdmVuLCB0aGUgcmFuZ2UKICAgICAgZnJvbSA8Y29kZT5zdGFydDwvY29kZT4gdXAgdG8gKG5vdCBpbmNsdWRpbmcpIDxjb2RlPmVuZDwvY29kZT4sCiAgICAgIGFuZCBjYWxsIDxjb2RlPmY8L2NvZGU+IGZvciBlYWNoIGxpbmUsIHBhc3NpbmcgdGhlIGxpbmUgaGFuZGxlLgogICAgICBUaGlzIGlzIGEgZmFzdGVyIHdheSB0byB2aXNpdCBhIHJhbmdlIG9mIGxpbmUgaGFuZGxlcnMgdGhhbgogICAgICBjYWxsaW5nIDxhIGhyZWY9IiNnZXRMaW5lSGFuZGxlIj48Y29kZT5nZXRMaW5lSGFuZGxlPC9jb2RlPjwvYT4KICAgICAgZm9yIGVhY2ggb2YgdGhlbS4gTm90ZSB0aGF0IGxpbmUgaGFuZGxlcyBoYXZlCiAgICAgIGEgPGNvZGU+dGV4dDwvY29kZT4gcHJvcGVydHkgY29udGFpbmluZyB0aGUgbGluZSdzIGNvbnRlbnQgKGFzIGEKICAgICAgc3RyaW5nKS48L2RkPgoKICAgICAgPGR0IGlkPSJtYXJrQ2xlYW4iPjxjb2RlPjxzdHJvbmc+ZG9jLm1hcmtDbGVhbjwvc3Ryb25nPigpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5TZXQgdGhlIGVkaXRvciBjb250ZW50IGFzICdjbGVhbicsIGEgZmxhZyB0aGF0IGl0IHdpbGwKICAgICAgcmV0YWluIHVudGlsIGl0IGlzIGVkaXRlZCwgYW5kIHdoaWNoIHdpbGwgYmUgc2V0IGFnYWluIHdoZW4gc3VjaAogICAgICBhbiBlZGl0IGlzIHVuZG9uZSBhZ2Fpbi4gVXNlZnVsIHRvIHRyYWNrIHdoZXRoZXIgdGhlIGNvbnRlbnQKICAgICAgbmVlZHMgdG8gYmUgc2F2ZWQuIFRoaXMgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZCBpbiBmYXZvcgogICAgICBvZiA8YSBocmVmPSIjY2hhbmdlR2VuZXJhdGlvbiI+PGNvZGU+Y2hhbmdlR2VuZXJhdGlvbjwvY29kZT48L2E+LAogICAgICB3aGljaCBhbGxvd3MgbXVsdGlwbGUgc3Vic3lzdGVtcyB0byB0cmFjayBkaWZmZXJlbnQgbm90aW9ucyBvZgogICAgICBjbGVhbm5lc3Mgd2l0aG91dCBpbnRlcmZlcmluZy48L2RkPgogICAgICA8ZHQgaWQ9ImNoYW5nZUdlbmVyYXRpb24iPjxjb2RlPjxzdHJvbmc+ZG9jLmNoYW5nZUdlbmVyYXRpb248L3N0cm9uZz4oP2Nsb3NlRXZlbnQ6IGJvb2xlYW4pIOKGkiBpbnRlZ2VyPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5SZXR1cm5zIGEgbnVtYmVyIHRoYXQgY2FuIGxhdGVyIGJlIHBhc3NlZAogICAgICB0byA8YSBocmVmPSIjaXNDbGVhbiI+PGNvZGU+aXNDbGVhbjwvY29kZT48L2E+IHRvIHRlc3Qgd2hldGhlcgogICAgICBhbnkgZWRpdHMgd2VyZSBtYWRlIChhbmQgbm90IHVuZG9uZSkgaW4gdGhlIG1lYW50aW1lLgogICAgICBJZiA8Y29kZT5jbG9zZUV2ZW50PC9jb2RlPiBpcyB0cnVlLCB0aGUgY3VycmVudCBoaXN0b3J5IGV2ZW50CiAgICAgIHdpbGwgYmUg4oCYY2xvc2Vk4oCZLCBtZWFuaW5nIGl0IGNhbid0IGJlIGNvbWJpbmVkIHdpdGggZnVydGhlcgogICAgICBjaGFuZ2VzIChyYXBpZCB0eXBpbmcgb3IgZGVsZXRpbmcgZXZlbnRzIGFyZSB0eXBpY2FsbHkKICAgICAgY29tYmluZWQpLjwvZGQ+CiAgICAgIDxkdCBpZD0iaXNDbGVhbiI+PGNvZGU+PHN0cm9uZz5kb2MuaXNDbGVhbjwvc3Ryb25nPig/Z2VuZXJhdGlvbjogaW50ZWdlcikg4oaSIGJvb2xlYW48L2NvZGU+PC9kdD4KICAgICAgPGRkPlJldHVybnMgd2hldGhlciB0aGUgZG9jdW1lbnQgaXMgY3VycmVudGx5IGNsZWFuIOKAlCBub3QKICAgICAgbW9kaWZpZWQgc2luY2UgaW5pdGlhbGl6YXRpb24gb3IgdGhlIGxhc3QgY2FsbAogICAgICB0byA8YSBocmVmPSIjbWFya0NsZWFuIj48Y29kZT5tYXJrQ2xlYW48L2NvZGU+PC9hPiBpZiBubwogICAgICBhcmd1bWVudCBpcyBwYXNzZWQsIG9yIHNpbmNlIHRoZSBtYXRjaGluZyBjYWxsCiAgICAgIHRvIDxhIGhyZWY9IiNjaGFuZ2VHZW5lcmF0aW9uIj48Y29kZT5jaGFuZ2VHZW5lcmF0aW9uPC9jb2RlPjwvYT4KICAgICAgaWYgYSBnZW5lcmF0aW9uIHZhbHVlIGlzIGdpdmVuLjwvZGQ+CiAgICA8L2RsPgoKICAgIDxoMyBpZD0iYXBpX3NlbGVjdGlvbiI+Q3Vyc29yIGFuZCBzZWxlY3Rpb24gbWV0aG9kczwvaDM+CgogICAgPGRsPgogICAgICA8ZHQgaWQ9ImdldFNlbGVjdGlvbiI+PGNvZGU+PHN0cm9uZz5kb2MuZ2V0U2VsZWN0aW9uPC9zdHJvbmc+KD9saW5lU2VwOiBzdHJpbmcpIOKGkiBzdHJpbmc8L2NvZGU+PC9kdD4KICAgICAgPGRkPkdldCB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGNvZGUuIE9wdGlvbmFsbHkgcGFzcyBhIGxpbmUKICAgICAgc2VwYXJhdG9yIHRvIHB1dCBiZXR3ZWVuIHRoZSBsaW5lcyBpbiB0aGUgb3V0cHV0LiBXaGVuIG11bHRpcGxlCiAgICAgIHNlbGVjdGlvbnMgYXJlIHByZXNlbnQsIHRoZXkgYXJlIGNvbmNhdGVuYXRlZCB3aXRoIGluc3RhbmNlcwogICAgICBvZiA8Y29kZT5saW5lU2VwPC9jb2RlPiBpbiBiZXR3ZWVuLjwvZGQ+CiAgICAgIDxkdCBpZD0iZ2V0U2VsZWN0aW9ucyI+PGNvZGU+PHN0cm9uZz5kb2MuZ2V0U2VsZWN0aW9uczwvc3Ryb25nPig/bGluZVNlcDogc3RyaW5nKSDihpIgc3RyaW5nPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5SZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgYSBzdHJpbmcgZm9yIGVhY2ggc2VsZWN0aW9uLAogICAgICByZXByZXNlbnRpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIHNlbGVjdGlvbnMuPC9kZD4KCiAgICAgIDxkdCBpZD0icmVwbGFjZVNlbGVjdGlvbiI+PGNvZGU+PHN0cm9uZz5kb2MucmVwbGFjZVNlbGVjdGlvbjwvc3Ryb25nPihyZXBsYWNlbWVudDogc3RyaW5nLCA/c2VsZWN0OiBzdHJpbmcpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5SZXBsYWNlIHRoZSBzZWxlY3Rpb24ocykgd2l0aCB0aGUgZ2l2ZW4gc3RyaW5nLiBCeSBkZWZhdWx0LAogICAgICB0aGUgbmV3IHNlbGVjdGlvbiBlbmRzIHVwIGFmdGVyIHRoZSBpbnNlcnRlZCB0ZXh0LiBUaGUKICAgICAgb3B0aW9uYWwgPGNvZGU+c2VsZWN0PC9jb2RlPiBhcmd1bWVudCBjYW4gYmUgdXNlZCB0byBjaGFuZ2UKICAgICAgdGhpc+KAlHBhc3NpbmcgPGNvZGU+ImFyb3VuZCI8L2NvZGU+IHdpbGwgY2F1c2UgdGhlIG5ldyB0ZXh0IHRvIGJlCiAgICAgIHNlbGVjdGVkLCBwYXNzaW5nIDxjb2RlPiJzdGFydCI8L2NvZGU+IHdpbGwgY29sbGFwc2UgdGhlCiAgICAgIHNlbGVjdGlvbiB0byB0aGUgc3RhcnQgb2YgdGhlIGluc2VydGVkIHRleHQuPC9kZD4KICAgICAgPGR0IGlkPSJyZXBsYWNlU2VsZWN0aW9ucyI+PGNvZGU+PHN0cm9uZz5kb2MucmVwbGFjZVNlbGVjdGlvbnM8L3N0cm9uZz4ocmVwbGFjZW1lbnRzOiBhcnJheSZsdDtzdHJpbmcmZ3Q7LCA/c2VsZWN0OiBzdHJpbmcpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5UaGUgbGVuZ3RoIG9mIHRoZSBnaXZlbiBhcnJheSBzaG91bGQgYmUgdGhlIHNhbWUgYXMgdGhlCiAgICAgIG51bWJlciBvZiBhY3RpdmUgc2VsZWN0aW9ucy4gUmVwbGFjZXMgdGhlIGNvbnRlbnQgb2YgdGhlCiAgICAgIHNlbGVjdGlvbnMgd2l0aCB0aGUgc3RyaW5ncyBpbiB0aGUgYXJyYXkuCiAgICAgIFRoZSA8Y29kZT5zZWxlY3Q8L2NvZGU+IGFyZ3VtZW50IHdvcmtzIHRoZSBzYW1lIGFzCiAgICAgIGluIDxhIGhyZWY9IiNyZXBsYWNlU2VsZWN0aW9uIj48Y29kZT5yZXBsYWNlU2VsZWN0aW9uPC9jb2RlPjwvYT4uPC9kZD4KCiAgICAgIDxkdCBpZD0iZ2V0Q3Vyc29yIj48Y29kZT48c3Ryb25nPmRvYy5nZXRDdXJzb3I8L3N0cm9uZz4oP3N0YXJ0OiBzdHJpbmcpIOKGkiB7bGluZSwgY2h9PC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5SZXRyaWV2ZSBvbmUgZW5kIG9mIHRoZSA8ZW0+cHJpbWFyeTwvZW0+CiAgICAgIHNlbGVjdGlvbi4gPGNvZGU+c3RhcnQ8L2NvZGU+IGlzIGEgYW4gb3B0aW9uYWwgc3RyaW5nIGluZGljYXRpbmcKICAgICAgd2hpY2ggZW5kIG9mIHRoZSBzZWxlY3Rpb24gdG8gcmV0dXJuLiBJdCBtYXkKICAgICAgYmUgPGNvZGU+ImZyb20iPC9jb2RlPiwgPGNvZGU+InRvIjwvY29kZT4sIDxjb2RlPiJoZWFkIjwvY29kZT4KICAgICAgKHRoZSBzaWRlIG9mIHRoZSBzZWxlY3Rpb24gdGhhdCBtb3ZlcyB3aGVuIHlvdSBwcmVzcwogICAgICBzaGlmdCthcnJvdyksIG9yIDxjb2RlPiJhbmNob3IiPC9jb2RlPiAodGhlIGZpeGVkIHNpZGUgb2YgdGhlCiAgICAgIHNlbGVjdGlvbikuIE9taXR0aW5nIHRoZSBhcmd1bWVudCBpcyB0aGUgc2FtZSBhcwogICAgICBwYXNzaW5nIDxjb2RlPiJoZWFkIjwvY29kZT4uIEEgPGNvZGU+e2xpbmUsIGNofTwvY29kZT4gb2JqZWN0CiAgICAgIHdpbGwgYmUgcmV0dXJuZWQuPC9kZD4KICAgICAgPGR0IGlkPSJsaXN0U2VsZWN0aW9ucyI+PGNvZGU+PHN0cm9uZz5kb2MubGlzdFNlbGVjdGlvbnM8L3N0cm9uZz4oKSDihpIgYXJyYXkmbHQ7e2FuY2hvciwgaGVhZH0mbHQ7PC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5SZXRyaWV2ZXMgYSBsaXN0IG9mIGFsbCBjdXJyZW50IHNlbGVjdGlvbnMuIFRoZXNlIHdpbGwKICAgICAgYWx3YXlzIGJlIHNvcnRlZCwgYW5kIG5ldmVyIG92ZXJsYXAgKG92ZXJsYXBwaW5nIHNlbGVjdGlvbnMgYXJlCiAgICAgIG1lcmdlZCkuIEVhY2ggb2JqZWN0IGluIHRoZSBhcnJheSBjb250YWlucyA8Y29kZT5hbmNob3I8L2NvZGU+CiAgICAgIGFuZCA8Y29kZT5oZWFkPC9jb2RlPiBwcm9wZXJ0aWVzIHJlZmVycmluZyB0byA8Y29kZT57bGluZSwKICAgICAgY2h9PC9jb2RlPiBvYmplY3RzLjwvZGQ+CgogICAgICA8ZHQgaWQ9InNvbWV0aGluZ1NlbGVjdGVkIj48Y29kZT48c3Ryb25nPmRvYy5zb21ldGhpbmdTZWxlY3RlZDwvc3Ryb25nPigpIOKGkiBib29sZWFuPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5SZXR1cm4gdHJ1ZSBpZiBhbnkgdGV4dCBpcyBzZWxlY3RlZC48L2RkPgogICAgICA8ZHQgaWQ9InNldEN1cnNvciI+PGNvZGU+PHN0cm9uZz5kb2Muc2V0Q3Vyc29yPC9zdHJvbmc+KHBvczoge2xpbmUsIGNofXxudW1iZXIsID9jaDogbnVtYmVyLCA/b3B0aW9uczogb2JqZWN0KTwvY29kZT48L2R0PgogICAgICA8ZGQ+U2V0IHRoZSBjdXJzb3IgcG9zaXRpb24uIFlvdSBjYW4gZWl0aGVyIHBhc3MgYQogICAgICBzaW5nbGUgPGNvZGU+e2xpbmUsIGNofTwvY29kZT4gb2JqZWN0LCBvciB0aGUgbGluZSBhbmQgdGhlCiAgICAgIGNoYXJhY3RlciBhcyB0d28gc2VwYXJhdGUgcGFyYW1ldGVycy4gV2lsbCByZXBsYWNlIGFsbAogICAgICBzZWxlY3Rpb25zIHdpdGggYSBzaW5nbGUsIGVtcHR5IHNlbGVjdGlvbiBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24uCiAgICAgIFRoZSBzdXBwb3J0ZWQgb3B0aW9ucyBhcmUgdGhlIHNhbWUgYXMgZm9yIDxhIGhyZWY9IiNzZXRTZWxlY3Rpb24iPjxjb2RlPnNldFNlbGVjdGlvbjwvY29kZT48L2E+LjwvZGQ+CgogICAgICA8ZHQgaWQ9InNldFNlbGVjdGlvbiI+PGNvZGU+PHN0cm9uZz5kb2Muc2V0U2VsZWN0aW9uPC9zdHJvbmc+KGFuY2hvcjoge2xpbmUsIGNofSwgP2hlYWQ6IHtsaW5lLCBjaH0sID9vcHRpb25zOiBvYmplY3QpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5TZXQgYSBzaW5nbGUgc2VsZWN0aW9uIHJhbmdlLiA8Y29kZT5hbmNob3I8L2NvZGU+CiAgICAgIGFuZCA8Y29kZT5oZWFkPC9jb2RlPiBzaG91bGQgYmUgPGNvZGU+e2xpbmUsIGNofTwvY29kZT4KICAgICAgb2JqZWN0cy4gPGNvZGU+aGVhZDwvY29kZT4gZGVmYXVsdHMgdG8gPGNvZGU+YW5jaG9yPC9jb2RlPiB3aGVuCiAgICAgIG5vdCBnaXZlbi4gVGhlc2Ugb3B0aW9ucyBhcmUgc3VwcG9ydGVkOgogICAgICA8ZGw+CiAgICAgICAgPGR0IGlkPSJzZWxlY3Rpb25fc2Nyb2xsIj48Y29kZT48c3Ryb25nPnNjcm9sbDwvc3Ryb25nPjogYm9vbGVhbjwvY29kZT48L2R0PgogICAgICAgIDxkZD5EZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHNlbGVjdGlvbiBoZWFkIHNob3VsZCBiZSBzY3JvbGxlZAogICAgICAgIGludG8gdmlldy4gRGVmYXVsdHMgdG8gdHJ1ZS48L2RkPgogICAgICAgIDxkdCBpZD0ic2VsZWN0aW9uX29yaWdpbiI+PGNvZGU+PHN0cm9uZz5vcmlnaW48L3N0cm9uZz46IHN0cmluZzwvY29kZT48L2R0PgogICAgICAgIDxkZD5EZXRlbWluZXMgd2hldGhlciB0aGUgc2VsZWN0aW9uIGhpc3RvcnkgZXZlbnQgbWF5IGJlCiAgICAgICAgbWVyZ2VkIHdpdGggdGhlIHByZXZpb3VzIG9uZS4gV2hlbiBhbiBvcmlnaW4gc3RhcnRzIHdpdGggdGhlCiAgICAgICAgY2hhcmFjdGVyIDxjb2RlPis8L2NvZGU+LCBhbmQgdGhlIGxhc3QgcmVjb3JkZWQgc2VsZWN0aW9uIGhhZAogICAgICAgIHRoZSBzYW1lIG9yaWdpbiBhbmQgd2FzIHNpbWlsYXIgKGNsb3NlCiAgICAgICAgaW4gPGEgaHJlZj0iI29wdGlvbl9oaXN0b3J5RXZlbnREZWxheSI+dGltZTwvYT4sIGJvdGgKICAgICAgICBjb2xsYXBzZWQgb3IgYm90aCBub24tY29sbGFwc2VkKSwgdGhlIG5ldyBvbmUgd2lsbCByZXBsYWNlIHRoZQogICAgICAgIG9sZCBvbmUuIFdoZW4gaXQgc3RhcnRzIHdpdGggPGNvZGU+KjwvY29kZT4sIGl0IHdpbGwgYWx3YXlzCiAgICAgICAgcmVwbGFjZSB0aGUgcHJldmlvdXMgZXZlbnQgKGlmIHRoYXQgaGFkIHRoZSBzYW1lIG9yaWdpbikuCiAgICAgICAgQnVpbHQtaW4gbW90aW9uIHVzZXMgdGhlIDxjb2RlPiIrbW92ZSI8L2NvZGU+IG9yaWdpbi48L2RkPgogICAgICAgIDxkdCBpZD0ic2VsZWN0aW9uX2JpYXMiPjxjb2RlPjxzdHJvbmc+Ymlhczwvc3Ryb25nPjogbnVtYmVyPC9jb2RlPjwvZHQ+CiAgICAgICAgPGRkPkRldGVybWluZSB0aGUgZGlyZWN0aW9uIGludG8gd2hpY2ggdGhlIHNlbGVjdGlvbiBlbmRwb2ludHMKICAgICAgICBzaG91bGQgYmUgYWRqdXN0ZWQgd2hlbiB0aGV5IGZhbGwgaW5zaWRlCiAgICAgICAgYW4gPGEgaHJlZj0iI21hcmtfYXRvbWljIj5hdG9taWM8L2E+IHJhbmdlLiBDYW4gYmUgZWl0aGVyIC0xCiAgICAgICAgKGJhY2t3YXJkKSBvciAxIChmb3J3YXJkKS4gV2hlbiBub3QgZ2l2ZW4sIHRoZSBiaWFzIHdpbGwgYmUKICAgICAgICBiYXNlZCBvbiB0aGUgcmVsYXRpdmUgcG9zaXRpb24gb2YgdGhlIG9sZCBzZWxlY3Rpb27igJR0aGUgZWRpdG9yCiAgICAgICAgd2lsbCB0cnkgdG8gbW92ZSBmdXJ0aGVyIGF3YXkgZnJvbSB0aGF0LCB0byBwcmV2ZW50IGdldHRpbmcKICAgICAgICBzdHVjay48L2RkPgogICAgICA8L2RsPjwvZGQ+CgogICAgICA8ZHQgaWQ9InNldFNlbGVjdGlvbnMiPjxjb2RlPjxzdHJvbmc+ZG9jLnNldFNlbGVjdGlvbnM8L3N0cm9uZz4ocmFuZ2VzOiBhcnJheSZsdDt7YW5jaG9yLCBoZWFkfSZndDssID9wcmltYXJ5OiBpbnRlZ2VyLCA/b3B0aW9uczogb2JqZWN0KTwvY29kZT48L2R0PgogICAgICA8ZGQ+U2V0cyBhIG5ldyBzZXQgb2Ygc2VsZWN0aW9ucy4gVGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUKICAgICAgc2VsZWN0aW9uIGluIHRoZSBnaXZlbiBhcnJheS4gV2hlbiA8Y29kZT5wcmltYXJ5PC9jb2RlPiBpcyBhCiAgICAgIG51bWJlciwgaXQgZGV0ZXJtaW5lcyB3aGljaCBzZWxlY3Rpb24gaXMgdGhlIHByaW1hcnkgb25lLiBXaGVuCiAgICAgIGl0IGlzIG5vdCBnaXZlbiwgdGhlIHByaW1hcnkgaW5kZXggaXMgdGFrZW4gZnJvbSB0aGUgcHJldmlvdXMKICAgICAgc2VsZWN0aW9uLCBvciBzZXQgdG8gdGhlIGxhc3QgcmFuZ2UgaWYgdGhlIHByZXZpb3VzIHNlbGVjdGlvbgogICAgICBoYWQgbGVzcyByYW5nZXMgdGhhbiB0aGUgbmV3IG9uZS4gU3VwcG9ydHMgdGhlIHNhbWUgb3B0aW9ucwogICAgICBhcyA8YSBocmVmPSIjc2V0U2VsZWN0aW9uIj48Y29kZT5zZXRTZWxlY3Rpb248L2NvZGU+PC9hPi48L2RkPgogICAgICA8ZHQgaWQ9ImFkZFNlbGVjdGlvbiI+PGNvZGU+PHN0cm9uZz5kb2MuYWRkU2VsZWN0aW9uPC9zdHJvbmc+KGFuY2hvcjoge2xpbmUsIGNofSwgP2hlYWQ6IHtsaW5lLCBjaH0pPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5BZGRzIGEgbmV3IHNlbGVjdGlvbiB0byB0aGUgZXhpc3Rpbmcgc2V0IG9mIHNlbGVjdGlvbnMsIGFuZAogICAgICBtYWtlcyBpdCB0aGUgcHJpbWFyeSBzZWxlY3Rpb24uPC9kZD4KCiAgICAgIDxkdCBpZD0iZXh0ZW5kU2VsZWN0aW9uIj48Y29kZT48c3Ryb25nPmRvYy5leHRlbmRTZWxlY3Rpb248L3N0cm9uZz4oZnJvbToge2xpbmUsIGNofSwgP3RvOiB7bGluZSwgY2h9LCA/b3B0aW9uczogb2JqZWN0KTwvY29kZT48L2R0PgogICAgICA8ZGQ+U2ltaWxhcgogICAgICB0byA8YSBocmVmPSIjc2V0U2VsZWN0aW9uIj48Y29kZT5zZXRTZWxlY3Rpb248L2NvZGU+PC9hPiwgYnV0CiAgICAgIHdpbGwsIGlmIHNoaWZ0IGlzIGhlbGQgb3IKICAgICAgdGhlIDxhIGhyZWY9IiNzZXRFeHRlbmRpbmciPmV4dGVuZGluZzwvYT4gZmxhZyBpcyBzZXQsIG1vdmUgdGhlCiAgICAgIGhlYWQgb2YgdGhlIHNlbGVjdGlvbiB3aGlsZSBsZWF2aW5nIHRoZSBhbmNob3IgYXQgaXRzIGN1cnJlbnQKICAgICAgcGxhY2UuIDxjb2RlPnRvPC9jb2RlPiBpcyBvcHRpb25hbCwgYW5kIGNhbiBiZSBwYXNzZWQgdG8gZW5zdXJlCiAgICAgIGEgcmVnaW9uIChmb3IgZXhhbXBsZSBhIHdvcmQgb3IgcGFyYWdyYXBoKSB3aWxsIGVuZCB1cCBzZWxlY3RlZAogICAgICAoaW4gYWRkaXRpb24gdG8gd2hhdGV2ZXIgbGllcyBiZXR3ZWVuIHRoYXQgcmVnaW9uIGFuZCB0aGUKICAgICAgY3VycmVudCBhbmNob3IpLiBXaGVuIG11bHRpcGxlIHNlbGVjdGlvbnMgYXJlIHByZXNlbnQsIGFsbCBidXQKICAgICAgdGhlIHByaW1hcnkgc2VsZWN0aW9uIHdpbGwgYmUgZHJvcHBlZCBieSB0aGlzIG1ldGhvZC4KICAgICAgU3VwcG9ydHMgdGhlIHNhbWUgb3B0aW9ucyBhcyA8YSBocmVmPSIjc2V0U2VsZWN0aW9uIj48Y29kZT5zZXRTZWxlY3Rpb248L2NvZGU+PC9hPi48L2RkPgogICAgICA8ZHQgaWQ9ImV4dGVuZFNlbGVjdGlvbnMiPjxjb2RlPjxzdHJvbmc+ZG9jLmV4dGVuZFNlbGVjdGlvbnM8L3N0cm9uZz4oaGVhZHM6IGFycmF5Jmx0O3tsaW5lLCBjaH0mZ3Q7LCA/b3B0aW9uczogb2JqZWN0KTwvY29kZT48L2R0PgogICAgICA8ZGQ+QW4gZXF1aXZhbGVudAogICAgICBvZiA8YSBocmVmPSIjZXh0ZW5kU2VsZWN0aW9uIj48Y29kZT5leHRlbmRTZWxlY3Rpb248L2NvZGU+PC9hPgogICAgICB0aGF0IGFjdHMgb24gYWxsIHNlbGVjdGlvbnMgYXQgb25jZS48L2RkPgogICAgICA8ZHQgaWQ9ImV4dGVuZFNlbGVjdGlvbnNCeSI+PGNvZGU+PHN0cm9uZz5kb2MuZXh0ZW5kU2VsZWN0aW9uc0J5PC9zdHJvbmc+KGY6IGZ1bmN0aW9uKHJhbmdlOiB7YW5jaG9yLCBoZWFkfSkg4oaSwqB7YW5jaG9yLMKgaGVhZH0pLCA/b3B0aW9uczogb2JqZWN0KTwvY29kZT48L2R0PgogICAgICA8ZGQ+QXBwbGllcyB0aGUgZ2l2ZW4gZnVuY3Rpb24gdG8gYWxsIGV4aXN0aW5nIHNlbGVjdGlvbnMsIGFuZAogICAgICBjYWxscyA8YSBocmVmPSIjZXh0ZW5kU2VsZWN0aW9ucyI+PGNvZGU+ZXh0ZW5kU2VsZWN0aW9uczwvY29kZT48L2E+CiAgICAgIG9uIHRoZSByZXN1bHQuPC9kZD4KICAgICAgPGR0IGlkPSJzZXRFeHRlbmRpbmciPjxjb2RlPjxzdHJvbmc+ZG9jLnNldEV4dGVuZGluZzwvc3Ryb25nPih2YWx1ZTogYm9vbGVhbik8L2NvZGU+PC9kdD4KICAgICAgPGRkPlNldHMgb3IgY2xlYXJzIHRoZSAnZXh0ZW5kaW5nJyBmbGFnLCB3aGljaCBhY3RzIHNpbWlsYXIgdG8KICAgICAgdGhlIHNoaWZ0IGtleSwgaW4gdGhhdCBpdCB3aWxsIGNhdXNlIGN1cnNvciBtb3ZlbWVudCBhbmQgY2FsbHMKICAgICAgdG8gPGEgaHJlZj0iI2V4dGVuZFNlbGVjdGlvbiI+PGNvZGU+ZXh0ZW5kU2VsZWN0aW9uPC9jb2RlPjwvYT4KICAgICAgdG8gbGVhdmUgdGhlIHNlbGVjdGlvbiBhbmNob3IgaW4gcGxhY2UuPC9kZD4KICAgICAgPGR0IGlkPSJnZXRFeHRlbmRpbmciPjxjb2RlPjxzdHJvbmc+ZG9jLmdldEV4dGVuZGluZzwvc3Ryb25nPigpIOKGkiBib29sZWFuPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5HZXQgdGhlIHZhbHVlIG9mIHRoZSAnZXh0ZW5kaW5nJyBmbGFnLjwvZGQ+CgogICAgICA8ZHQgaWQ9Imhhc0ZvY3VzIj48Y29kZT48c3Ryb25nPmNtLmhhc0ZvY3VzPC9zdHJvbmc+KCkg4oaSIGJvb2xlYW48L2NvZGU+PC9kdD4KICAgICAgPGRkPlRlbGxzIHlvdSB3aGV0aGVyIHRoZSBlZGl0b3IgY3VycmVudGx5IGhhcyBmb2N1cy48L2RkPgoKICAgICAgPGR0IGlkPSJmaW5kUG9zSCI+PGNvZGU+PHN0cm9uZz5jbS5maW5kUG9zSDwvc3Ryb25nPihzdGFydDoge2xpbmUsIGNofSwgYW1vdW50OiBpbnRlZ2VyLCB1bml0OiBzdHJpbmcsIHZpc3VhbGx5OsKgYm9vbGVhbikg4oaSwqB7bGluZSwgY2gsID9oaXRTaWRlOiBib29sZWFufTwvY29kZT48L2R0PgogICAgICA8ZGQ+VXNlZCB0byBmaW5kIHRoZSB0YXJnZXQgcG9zaXRpb24gZm9yIGhvcml6b250YWwgY3Vyc29yCiAgICAgIG1vdGlvbi4gPGNvZGU+c3RhcnQ8L2NvZGU+IGlzIGEgPGNvZGU+e2xpbmUsIGNofTwvY29kZT4KICAgICAgb2JqZWN0LCA8Y29kZT5hbW91bnQ8L2NvZGU+IGFuIGludGVnZXIgKG1heSBiZSBuZWdhdGl2ZSksCiAgICAgIGFuZCA8Y29kZT51bml0PC9jb2RlPiBvbmUgb2YgdGhlCiAgICAgIHN0cmluZyA8Y29kZT4iY2hhciI8L2NvZGU+LCA8Y29kZT4iY29sdW1uIjwvY29kZT4sCiAgICAgIG9yIDxjb2RlPiJ3b3JkIjwvY29kZT4uIFdpbGwgcmV0dXJuIGEgcG9zaXRpb24gdGhhdCBpcyBwcm9kdWNlZAogICAgICBieSBtb3ZpbmcgPGNvZGU+YW1vdW50PC9jb2RlPiB0aW1lcyB0aGUgZGlzdGFuY2Ugc3BlY2lmaWVkCiAgICAgIGJ5IDxjb2RlPnVuaXQ8L2NvZGU+LiBXaGVuIDxjb2RlPnZpc3VhbGx5PC9jb2RlPiBpcyB0cnVlLCBtb3Rpb24KICAgICAgaW4gcmlnaHQtdG8tbGVmdCB0ZXh0IHdpbGwgYmUgdmlzdWFsIHJhdGhlciB0aGFuIGxvZ2ljYWwuIFdoZW4KICAgICAgdGhlIG1vdGlvbiB3YXMgY2xpcHBlZCBieSBoaXR0aW5nIHRoZSBlbmQgb3Igc3RhcnQgb2YgdGhlCiAgICAgIGRvY3VtZW50LCB0aGUgcmV0dXJuZWQgdmFsdWUgd2lsbCBoYXZlIGEgPGNvZGU+aGl0U2lkZTwvY29kZT4KICAgICAgcHJvcGVydHkgc2V0IHRvIHRydWUuPC9kZD4KICAgICAgPGR0IGlkPSJmaW5kUG9zViI+PGNvZGU+PHN0cm9uZz5jbS5maW5kUG9zVjwvc3Ryb25nPihzdGFydDoge2xpbmUsIGNofSwgYW1vdW50OiBpbnRlZ2VyLCB1bml0OiBzdHJpbmcpIOKGkiB7bGluZSwgY2gsID9oaXRTaWRlOiBib29sZWFufTwvY29kZT48L2R0PgogICAgICA8ZGQ+U2ltaWxhciB0byA8YSBocmVmPSIjZmluZFBvc0giPjxjb2RlPmZpbmRQb3NIPC9jb2RlPjwvYT4sCiAgICAgIGJ1dCB1c2VkIGZvciB2ZXJ0aWNhbCBtb3Rpb24uIDxjb2RlPnVuaXQ8L2NvZGU+IG1heQogICAgICBiZSA8Y29kZT4ibGluZSI8L2NvZGU+IG9yIDxjb2RlPiJwYWdlIjwvY29kZT4uIFRoZSBvdGhlcgogICAgICBhcmd1bWVudHMgYW5kIHRoZSByZXR1cm5lZCB2YWx1ZSBoYXZlIHRoZSBzYW1lIGludGVycHJldGF0aW9uIGFzCiAgICAgIHRoZXkgaGF2ZSBpbiA8Y29kZT5maW5kUG9zSDwvY29kZT4uPC9kZD4KICAgIDwvZGw+CgogICAgPGgzIGlkPSJhcGlfY29uZmlndXJhdGlvbiI+Q29uZmlndXJhdGlvbiBtZXRob2RzPC9oMz4KCiAgICA8ZGw+CiAgICAgIDxkdCBpZD0ic2V0T3B0aW9uIj48Y29kZT48c3Ryb25nPmNtLnNldE9wdGlvbjwvc3Ryb25nPihvcHRpb246IHN0cmluZywgdmFsdWU6IGFueSk8L2NvZGU+PC9kdD4KICAgICAgPGRkPkNoYW5nZSB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgZWRpdG9yLiA8Y29kZT5vcHRpb248L2NvZGU+CiAgICAgIHNob3VsZCB0aGUgbmFtZSBvZiBhbiA8YSBocmVmPSIjY29uZmlnIj5vcHRpb248L2E+LAogICAgICBhbmQgPGNvZGU+dmFsdWU8L2NvZGU+IHNob3VsZCBiZSBhIHZhbGlkIHZhbHVlIGZvciB0aGF0CiAgICAgIG9wdGlvbi48L2RkPgogICAgICA8ZHQgaWQ9ImdldE9wdGlvbiI+PGNvZGU+PHN0cm9uZz5jbS5nZXRPcHRpb248L3N0cm9uZz4ob3B0aW9uOiBzdHJpbmcpIOKGkiBhbnk8L2NvZGU+PC9kdD4KICAgICAgPGRkPlJldHJpZXZlcyB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgZ2l2ZW4gb3B0aW9uIGZvciB0aGlzCiAgICAgIGVkaXRvciBpbnN0YW5jZS48L2RkPgoKICAgICAgPGR0IGlkPSJhZGRLZXlNYXAiPjxjb2RlPjxzdHJvbmc+Y20uYWRkS2V5TWFwPC9zdHJvbmc+KG1hcDogb2JqZWN0LCBib3R0b206IGJvb2xlYW4pPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5BdHRhY2ggYW4gYWRkaXRpb25hbCA8YSBocmVmPSIja2V5bWFwcyI+a2V5IG1hcDwvYT4gdG8gdGhlCiAgICAgIGVkaXRvci4gVGhpcyBpcyBtb3N0bHkgdXNlZnVsIGZvciBhZGRvbnMgdGhhdCBuZWVkIHRvIHJlZ2lzdGVyCiAgICAgIHNvbWUga2V5IGhhbmRsZXJzIHdpdGhvdXQgdHJhbXBsaW5nIG9uCiAgICAgIHRoZSA8YSBocmVmPSIjb3B0aW9uX2V4dHJhS2V5cyI+PGNvZGU+ZXh0cmFLZXlzPC9jb2RlPjwvYT4KICAgICAgb3B0aW9uLiBNYXBzIGFkZGVkIGluIHRoaXMgd2F5IGhhdmUgYSBoaWdoZXIgcHJlY2VkZW5jZSB0aGFuCiAgICAgIHRoZSA8Y29kZT5leHRyYUtleXM8L2NvZGU+CiAgICAgIGFuZCA8YSBocmVmPSIjb3B0aW9uX2tleU1hcCI+PGNvZGU+a2V5TWFwPC9jb2RlPjwvYT4gb3B0aW9ucywKICAgICAgYW5kIGJldHdlZW4gdGhlbSwgdGhlIG1hcHMgYWRkZWQgZWFybGllciBoYXZlIGEgbG93ZXIgcHJlY2VkZW5jZQogICAgICB0aGFuIHRob3NlIGFkZGVkIGxhdGVyLCB1bmxlc3MgdGhlIDxjb2RlPmJvdHRvbTwvY29kZT4gYXJndW1lbnQKICAgICAgd2FzIHBhc3NlZCwgaW4gd2hpY2ggY2FzZSB0aGV5IGVuZCB1cCBiZWxvdyBvdGhlciBrZXkgbWFwcyBhZGRlZAogICAgICB3aXRoIHRoaXMgbWV0aG9kLjwvZGQ+CiAgICAgIDxkdCBpZD0icmVtb3ZlS2V5TWFwIj48Y29kZT48c3Ryb25nPmNtLnJlbW92ZUtleU1hcDwvc3Ryb25nPihtYXA6IG9iamVjdCk8L2NvZGU+PC9kdD4KICAgICAgPGRkPkRpc2FibGUgYSBrZXltYXAgYWRkZWQKICAgICAgd2l0aCA8YSBocmVmPSIjYWRkS2V5TWFwIj48Y29kZT5hZGRLZXlNYXA8L2NvZGU+PC9hPi4gRWl0aGVyCiAgICAgIHBhc3MgaW4gdGhlIGtleSBtYXAgb2JqZWN0IGl0c2VsZiwgb3IgYSBzdHJpbmcsIHdoaWNoIHdpbGwgYmUKICAgICAgY29tcGFyZWQgYWdhaW5zdCB0aGUgPGNvZGU+bmFtZTwvY29kZT4gcHJvcGVydHkgb2YgdGhlIGFjdGl2ZQogICAgICBrZXkgbWFwcy48L2RkPgoKICAgICAgPGR0IGlkPSJhZGRPdmVybGF5Ij48Y29kZT48c3Ryb25nPmNtLmFkZE92ZXJsYXk8L3N0cm9uZz4obW9kZTogc3RyaW5nfG9iamVjdCwgP29wdGlvbnM6IG9iamVjdCk8L2NvZGU+PC9kdD4KICAgICAgPGRkPkVuYWJsZSBhIGhpZ2hsaWdodGluZyBvdmVybGF5LiBUaGlzIGlzIGEgc3RhdGVsZXNzIG1pbmktbW9kZQogICAgICB0aGF0IGNhbiBiZSB1c2VkIHRvIGFkZCBleHRyYSBoaWdobGlnaHRpbmcuIEZvciBleGFtcGxlLAogICAgICB0aGUgPGEgaHJlZj0iLi4vZGVtby9zZWFyY2guaHRtbCI+c2VhcmNoIGFkZG9uPC9hPiB1c2VzIGl0IHRvCiAgICAgIGhpZ2hsaWdodCB0aGUgdGVybSB0aGF0J3MgY3VycmVudGx5IGJlaW5nCiAgICAgIHNlYXJjaGVkLiA8Y29kZT5tb2RlPC9jb2RlPiBjYW4gYmUgYSA8YSBocmVmPSIjb3B0aW9uX21vZGUiPm1vZGUKICAgICAgc3BlYzwvYT4gb3IgYSBtb2RlIG9iamVjdCAoYW4gb2JqZWN0IHdpdGgKICAgICAgYSA8YSBocmVmPSIjdG9rZW4iPjxjb2RlPnRva2VuPC9jb2RlPjwvYT4gbWV0aG9kKS4KICAgICAgVGhlIDxjb2RlPm9wdGlvbnM8L2NvZGU+IHBhcmFtZXRlciBpcyBvcHRpb25hbC4gSWYgZ2l2ZW4sIGl0CiAgICAgIHNob3VsZCBiZSBhbiBvYmplY3QuIEN1cnJlbnRseSwgb25seSB0aGUgPGNvZGU+b3BhcXVlPC9jb2RlPgogICAgICBvcHRpb24gaXMgcmVjb2duaXplZC4gVGhpcyBkZWZhdWx0cyB0byBvZmYsIGJ1dCBjYW4gYmUgZ2l2ZW4gdG8KICAgICAgYWxsb3cgdGhlIG92ZXJsYXkgc3R5bGluZywgd2hlbiBub3QgPGNvZGU+bnVsbDwvY29kZT4sIHRvCiAgICAgIG92ZXJyaWRlIHRoZSBzdHlsaW5nIG9mIHRoZSBiYXNlIG1vZGUgZW50aXJlbHksIGluc3RlYWQgb2YgdGhlCiAgICAgIHR3byBiZWluZyBhcHBsaWVkIHRvZ2V0aGVyLjwvZGQ+CiAgICAgIDxkdCBpZD0icmVtb3ZlT3ZlcmxheSI+PGNvZGU+PHN0cm9uZz5jbS5yZW1vdmVPdmVybGF5PC9zdHJvbmc+KG1vZGU6IHN0cmluZ3xvYmplY3QpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5QYXNzIHRoaXMgdGhlIGV4YWN0IHZhbHVlIHBhc3NlZCBmb3IgdGhlIDxjb2RlPm1vZGU8L2NvZGU+CiAgICAgIHBhcmFtZXRlciB0byA8YSBocmVmPSIjYWRkT3ZlcmxheSI+PGNvZGU+YWRkT3ZlcmxheTwvY29kZT48L2E+LAogICAgICBvciBhIHN0cmluZyB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT5uYW1lPC9jb2RlPiBwcm9wZXJ5IG9mCiAgICAgIHRoYXQgdmFsdWUsIHRvIHJlbW92ZSBhbiBvdmVybGF5IGFnYWluLjwvZGQ+CgogICAgICA8ZHQgaWQ9Im9uIj48Y29kZT48c3Ryb25nPmNtLm9uPC9zdHJvbmc+KHR5cGU6IHN0cmluZywgZnVuYzogKC4uLmFyZ3MpKTwvY29kZT48L2R0PgogICAgICA8ZGQ+UmVnaXN0ZXIgYW4gZXZlbnQgaGFuZGxlciBmb3IgdGhlIGdpdmVuIGV2ZW50IHR5cGUgKGEKICAgICAgc3RyaW5nKSBvbiB0aGUgZWRpdG9yIGluc3RhbmNlLiBUaGVyZSBpcyBhbHNvCiAgICAgIGEgPGNvZGU+Q29kZU1pcnJvci5vbihvYmplY3QsIHR5cGUsIGZ1bmMpPC9jb2RlPiB2ZXJzaW9uCiAgICAgIHRoYXQgYWxsb3dzIHJlZ2lzdGVyaW5nIG9mIGV2ZW50cyBvbiBhbnkgb2JqZWN0LjwvZGQ+CiAgICAgIDxkdCBpZD0ib2ZmIj48Y29kZT48c3Ryb25nPmNtLm9mZjwvc3Ryb25nPih0eXBlOiBzdHJpbmcsIGZ1bmM6ICguLi5hcmdzKSk8L2NvZGU+PC9kdD4KICAgICAgPGRkPlJlbW92ZSBhbiBldmVudCBoYW5kbGVyIG9uIHRoZSBlZGl0b3IgaW5zdGFuY2UuIEFuCiAgICAgIGVxdWl2YWxlbnQgPGNvZGU+Q29kZU1pcnJvci5vZmYob2JqZWN0LCB0eXBlLAogICAgICBmdW5jKTwvY29kZT4gYWxzbyBleGlzdHMuPC9kZD4KICAgIDwvZGw+CgogICAgPGgzIGlkPSJhcGlfZG9jIj5Eb2N1bWVudCBtYW5hZ2VtZW50IG1ldGhvZHM8L2gzPgoKICAgIDxwIGlkPSJEb2MiPkVhY2ggZWRpdG9yIGlzIGFzc29jaWF0ZWQgd2l0aCBhbiBpbnN0YW5jZQogICAgb2YgPGNvZGU+Q29kZU1pcnJvci5Eb2M8L2NvZGU+LCBpdHMgZG9jdW1lbnQuIEEgZG9jdW1lbnQKICAgIHJlcHJlc2VudHMgdGhlIGVkaXRvciBjb250ZW50LCBwbHVzIGEgc2VsZWN0aW9uLCBhbiB1bmRvIGhpc3RvcnksCiAgICBhbmQgYSA8YSBocmVmPSIjb3B0aW9uX21vZGUiPm1vZGU8L2E+LiBBIGRvY3VtZW50IGNhbiBvbmx5IGJlCiAgICBhc3NvY2lhdGVkIHdpdGggYSBzaW5nbGUgZWRpdG9yIGF0IGEgdGltZS4gWW91IGNhbiBjcmVhdGUgbmV3CiAgICBkb2N1bWVudHMgYnkgY2FsbGluZyB0aGUgPGNvZGU+Q29kZU1pcnJvci5Eb2ModGV4dCwgbW9kZSwKICAgIGZpcnN0TGluZU51bWJlcik8L2NvZGU+IGNvbnN0cnVjdG9yLiBUaGUgbGFzdCB0d28gYXJndW1lbnRzIGFyZQogICAgb3B0aW9uYWwgYW5kIGNhbiBiZSB1c2VkIHRvIHNldCBhIG1vZGUgZm9yIHRoZSBkb2N1bWVudCBhbmQgbWFrZQogICAgaXQgc3RhcnQgYXQgYSBsaW5lIG51bWJlciBvdGhlciB0aGFuIDAsIHJlc3BlY3RpdmVseS48L3A+CgogICAgPGRsPgogICAgICA8ZHQgaWQ9ImdldERvYyI+PGNvZGU+PHN0cm9uZz5jbS5nZXREb2M8L3N0cm9uZz4oKSDihpIgRG9jPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5SZXRyaWV2ZSB0aGUgY3VycmVudGx5IGFjdGl2ZSBkb2N1bWVudCBmcm9tIGFuIGVkaXRvci48L2RkPgogICAgICA8ZHQgaWQ9ImdldEVkaXRvciI+PGNvZGU+PHN0cm9uZz5kb2MuZ2V0RWRpdG9yPC9zdHJvbmc+KCkg4oaSIENvZGVNaXJyb3I8L2NvZGU+PC9kdD4KICAgICAgPGRkPlJldHJpZXZlIHRoZSBlZGl0b3IgYXNzb2NpYXRlZCB3aXRoIGEgZG9jdW1lbnQuIE1heQogICAgICByZXR1cm4gPGNvZGU+bnVsbDwvY29kZT4uPC9kZD4KCiAgICAgIDxkdCBpZD0ic3dhcERvYyI+PGNvZGU+PHN0cm9uZz5jbS5zd2FwRG9jPC9zdHJvbmc+KGRvYzogQ29kZU1pcnJvci5Eb2MpIOKGkiBEb2M8L2NvZGU+PC9kdD4KICAgICAgPGRkPkF0dGFjaCBhIG5ldyBkb2N1bWVudCB0byB0aGUgZWRpdG9yLiBSZXR1cm5zIHRoZSBvbGQKICAgICAgZG9jdW1lbnQsIHdoaWNoIGlzIG5vdyBubyBsb25nZXIgYXNzb2NpYXRlZCB3aXRoIGFuIGVkaXRvci48L2RkPgoKICAgICAgPGR0IGlkPSJjb3B5Ij48Y29kZT48c3Ryb25nPmRvYy5jb3B5PC9zdHJvbmc+KGNvcHlIaXN0b3J5OiBib29sZWFuKSDihpIgRG9jPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5DcmVhdGUgYW4gaWRlbnRpY2FsIGNvcHkgb2YgdGhlIGdpdmVuIGRvYy4KICAgICAgV2hlbiA8Y29kZT5jb3B5SGlzdG9yeTwvY29kZT4gaXMgdHJ1ZSwgdGhlIGhpc3Rvcnkgd2lsbCBhbHNvIGJlCiAgICAgIGNvcGllZC4gQ2FuIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkgb24gYW4gZWRpdG9yLjwvZGQ+CgogICAgICA8ZHQgaWQ9ImxpbmtlZERvYyI+PGNvZGU+PHN0cm9uZz5kb2MubGlua2VkRG9jPC9zdHJvbmc+KG9wdGlvbnM6IG9iamVjdCkg4oaSIERvYzwvY29kZT48L2R0PgogICAgICA8ZGQ+Q3JlYXRlIGEgbmV3IGRvY3VtZW50IHRoYXQncyBsaW5rZWQgdG8gdGhlIHRhcmdldCBkb2N1bWVudC4KICAgICAgTGlua2VkIGRvY3VtZW50cyB3aWxsIHN0YXkgaW4gc3luYyAoY2hhbmdlcyB0byBvbmUgYXJlIGFsc28KICAgICAgYXBwbGllZCB0byB0aGUgb3RoZXIpIHVudGlsIDxhIGhyZWY9IiN1bmxpbmtEb2MiPnVubGlua2VkPC9hPi4KICAgICAgVGhlc2UgYXJlIHRoZSBvcHRpb25zIHRoYXQgYXJlIHN1cHBvcnRlZDoKICAgICAgICA8ZGw+CiAgICAgICAgICA8ZHQgaWQ9ImxpbmtlZERvY19zaGFyZWRIaXN0Ij48Y29kZT48c3Ryb25nPnNoYXJlZEhpc3Q8L3N0cm9uZz46IGJvb2xlYW48L2NvZGU+PC9kdD4KICAgICAgICAgIDxkZD5XaGVuIHR1cm5lZCBvbiwgdGhlIGxpbmtlZCBjb3B5IHdpbGwgc2hhcmUgYW4gdW5kbwogICAgICAgICAgaGlzdG9yeSB3aXRoIHRoZSBvcmlnaW5hbC4gVGh1cywgc29tZXRoaW5nIGRvbmUgaW4gb25lIG9mCiAgICAgICAgICB0aGUgdHdvIGNhbiBiZSB1bmRvbmUgaW4gdGhlIG90aGVyLCBhbmQgdmljZSB2ZXJzYS48L2RkPgogICAgICAgICAgPGR0IGlkPSJsaW5rZWREb2NfZnJvbSI+PGNvZGU+PHN0cm9uZz5mcm9tPC9zdHJvbmc+OiBpbnRlZ2VyPC9jb2RlPjwvZHQ+CiAgICAgICAgICA8ZHQgaWQ9ImxpbmtlZERvY190byI+PGNvZGU+PHN0cm9uZz50bzwvc3Ryb25nPjogaW50ZWdlcjwvY29kZT48L2R0PgogICAgICAgICAgPGRkPkNhbiBiZSBnaXZlbiB0byBtYWtlIHRoZSBuZXcgZG9jdW1lbnQgYSBzdWJ2aWV3IG9mIHRoZQogICAgICAgICAgb3JpZ2luYWwuIFN1YnZpZXdzIG9ubHkgc2hvdyBhIGdpdmVuIHJhbmdlIG9mIGxpbmVzLiBOb3RlCiAgICAgICAgICB0aGF0IGxpbmUgY29vcmRpbmF0ZXMgaW5zaWRlIHRoZSBzdWJ2aWV3IHdpbGwgYmUgY29uc2lzdGVudAogICAgICAgICAgd2l0aCB0aG9zZSBvZiB0aGUgcGFyZW50LCBzbyB0aGF0IGZvciBleGFtcGxlIGEgc3VidmlldwogICAgICAgICAgc3RhcnRpbmcgYXQgbGluZSAxMCB3aWxsIHJlZmVyIHRvIGl0cyBmaXJzdCBsaW5lIGFzIGxpbmUgMTAsCiAgICAgICAgICBub3QgMC48L2RkPgogICAgICAgICAgPGR0IGlkPSJsaW5rZWREb2NfbW9kZSI+PGNvZGU+PHN0cm9uZz5tb2RlPC9zdHJvbmc+OiBzdHJpbmd8b2JqZWN0PC9jb2RlPjwvZHQ+CiAgICAgICAgICA8ZGQ+QnkgZGVmYXVsdCwgdGhlIG5ldyBkb2N1bWVudCBpbmhlcml0cyB0aGUgbW9kZSBvZiB0aGUKICAgICAgICAgIHBhcmVudC4gVGhpcyBvcHRpb24gY2FuIGJlIHNldCB0bwogICAgICAgICAgYSA8YSBocmVmPSIjb3B0aW9uX21vZGUiPm1vZGUgc3BlYzwvYT4gdG8gZ2l2ZSBpdCBhCiAgICAgICAgICBkaWZmZXJlbnQgbW9kZS48L2RkPgogICAgICAgIDwvZGw+PC9kZD4KICAgICAgPGR0IGlkPSJ1bmxpbmtEb2MiPjxjb2RlPjxzdHJvbmc+ZG9jLnVubGlua0RvYzwvc3Ryb25nPihkb2M6IENvZGVNaXJyb3IuRG9jKTwvY29kZT48L2R0PgogICAgICA8ZGQ+QnJlYWsgdGhlIGxpbmsgYmV0d2VlbiB0d28gZG9jdW1lbnRzLiBBZnRlciBjYWxsaW5nIHRoaXMsCiAgICAgIGNoYW5nZXMgd2lsbCBubyBsb25nZXIgcHJvcGFnYXRlIGJldHdlZW4gdGhlIGRvY3VtZW50cywgYW5kLCBpZgogICAgICB0aGV5IGhhZCBhIHNoYXJlZCBoaXN0b3J5LCB0aGUgaGlzdG9yeSB3aWxsIGJlY29tZQogICAgICBzZXBhcmF0ZS48L2RkPgogICAgICA8ZHQgaWQ9Iml0ZXJMaW5rZWREb2NzIj48Y29kZT48c3Ryb25nPmRvYy5pdGVyTGlua2VkRG9jczwvc3Ryb25nPihmdW5jdGlvbjogKGRvYzogQ29kZU1pcnJvci5Eb2MsIHNoYXJlZEhpc3Q6IGJvb2xlYW4pKTwvY29kZT48L2R0PgogICAgICA8ZGQ+V2lsbCBjYWxsIHRoZSBnaXZlbiBmdW5jdGlvbiBmb3IgYWxsIGRvY3VtZW50cyBsaW5rZWQgdG8gdGhlCiAgICAgIHRhcmdldCBkb2N1bWVudC4gSXQgd2lsbCBiZSBwYXNzZWQgdHdvIGFyZ3VtZW50cywgdGhlIGxpbmtlZCBkb2N1bWVudAogICAgICBhbmQgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGF0IGRvY3VtZW50IHNoYXJlcyBoaXN0b3J5CiAgICAgIHdpdGggdGhlIHRhcmdldC48L2RkPgogICAgPC9kbD4KCiAgICA8aDMgaWQ9ImFwaV9oaXN0b3J5Ij5IaXN0b3J5LXJlbGF0ZWQgbWV0aG9kczwvaDM+CgogICAgPGRsPgogICAgICA8ZHQgaWQ9InVuZG8iPjxjb2RlPjxzdHJvbmc+ZG9jLnVuZG88L3N0cm9uZz4oKTwvY29kZT48L2R0PgogICAgICA8ZGQ+VW5kbyBvbmUgZWRpdCAoaWYgYW55IHVuZG8gZXZlbnRzIGFyZSBzdG9yZWQpLjwvZGQ+CiAgICAgIDxkdCBpZD0icmVkbyI+PGNvZGU+PHN0cm9uZz5kb2MucmVkbzwvc3Ryb25nPigpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5SZWRvIG9uZSB1bmRvbmUgZWRpdC48L2RkPgoKICAgICAgPGR0IGlkPSJ1bmRvU2VsZWN0aW9uIj48Y29kZT48c3Ryb25nPmRvYy51bmRvU2VsZWN0aW9uPC9zdHJvbmc+KCk8L2NvZGU+PC9kdD4KICAgICAgPGRkPlVuZG8gb25lIGVkaXQgb3Igc2VsZWN0aW9uIGNoYW5nZS48L2RkPgogICAgICA8ZHQgaWQ9InJlZG9TZWxlY3Rpb24iPjxjb2RlPjxzdHJvbmc+ZG9jLnJlZG9TZWxlY3Rpb248L3N0cm9uZz4oKTwvY29kZT48L2R0PgogICAgICA8ZGQ+UmVkbyBvbmUgdW5kb25lIGVkaXQgb3Igc2VsZWN0aW9uIGNoYW5nZS48L2RkPgoKICAgICAgPGR0IGlkPSJoaXN0b3J5U2l6ZSI+PGNvZGU+PHN0cm9uZz5kb2MuaGlzdG9yeVNpemU8L3N0cm9uZz4oKSDihpIge3VuZG86IGludGVnZXIsIHJlZG86IGludGVnZXJ9PC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5SZXR1cm5zIGFuIG9iamVjdCB3aXRoIDxjb2RlPnt1bmRvLCByZWRvfTwvY29kZT4gcHJvcGVydGllcywKICAgICAgYm90aCBvZiB3aGljaCBob2xkIGludGVnZXJzLCBpbmRpY2F0aW5nIHRoZSBhbW91bnQgb2Ygc3RvcmVkCiAgICAgIHVuZG8gYW5kIHJlZG8gb3BlcmF0aW9ucy48L2RkPgogICAgICA8ZHQgaWQ9ImNsZWFySGlzdG9yeSI+PGNvZGU+PHN0cm9uZz5kb2MuY2xlYXJIaXN0b3J5PC9zdHJvbmc+KCk8L2NvZGU+PC9kdD4KICAgICAgPGRkPkNsZWFycyB0aGUgZWRpdG9yJ3MgdW5kbyBoaXN0b3J5LjwvZGQ+CiAgICAgIDxkdCBpZD0iZ2V0SGlzdG9yeSI+PGNvZGU+PHN0cm9uZz5kb2MuZ2V0SGlzdG9yeTwvc3Ryb25nPigpIOKGkiBvYmplY3Q8L2NvZGU+PC9kdD4KICAgICAgPGRkPkdldCBhIChKU09OLXNlcmlhbGl6ZWFibGUpIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB1bmRvIGhpc3RvcnkuPC9kZD4KICAgICAgPGR0IGlkPSJzZXRIaXN0b3J5Ij48Y29kZT48c3Ryb25nPmRvYy5zZXRIaXN0b3J5PC9zdHJvbmc+KGhpc3Rvcnk6IG9iamVjdCk8L2NvZGU+PC9kdD4KICAgICAgPGRkPlJlcGxhY2UgdGhlIGVkaXRvcidzIHVuZG8gaGlzdG9yeSB3aXRoIHRoZSBvbmUgcHJvdmlkZWQsCiAgICAgIHdoaWNoIG11c3QgYmUgYSB2YWx1ZSBhcyByZXR1cm5lZAogICAgICBieSA8YSBocmVmPSIjZ2V0SGlzdG9yeSI+PGNvZGU+Z2V0SGlzdG9yeTwvY29kZT48L2E+LiBOb3RlIHRoYXQKICAgICAgdGhpcyB3aWxsIGhhdmUgZW50aXJlbHkgdW5kZWZpbmVkIHJlc3VsdHMgaWYgdGhlIGVkaXRvciBjb250ZW50CiAgICAgIGlzbid0IGFsc28gdGhlIHNhbWUgYXMgaXQgd2FzIHdoZW4gPGNvZGU+Z2V0SGlzdG9yeTwvY29kZT4gd2FzCiAgICAgIGNhbGxlZC48L2RkPgogICAgPC9kbD4KCiAgICA8aDMgaWQ9ImFwaV9tYXJrZXIiPlRleHQtbWFya2luZyBtZXRob2RzPC9oMz4KCiAgICA8ZGw+CiAgICAgIDxkdCBpZD0ibWFya1RleHQiPjxjb2RlPjxzdHJvbmc+ZG9jLm1hcmtUZXh0PC9zdHJvbmc+KGZyb206IHtsaW5lLCBjaH0sIHRvOiB7bGluZSwgY2h9LCA/b3B0aW9uczogb2JqZWN0KSDihpIgVGV4dE1hcmtlcjwvY29kZT48L2R0PgogICAgICA8ZGQ+Q2FuIGJlIHVzZWQgdG8gbWFyayBhIHJhbmdlIG9mIHRleHQgd2l0aCBhIHNwZWNpZmljIENTUwogICAgICBjbGFzcyBuYW1lLiA8Y29kZT5mcm9tPC9jb2RlPiBhbmQgPGNvZGU+dG88L2NvZGU+IHNob3VsZAogICAgICBiZSA8Y29kZT57bGluZSwgY2h9PC9jb2RlPiBvYmplY3RzLiBUaGUgPGNvZGU+b3B0aW9uczwvY29kZT4KICAgICAgcGFyYW1ldGVyIGlzIG9wdGlvbmFsLiBXaGVuIGdpdmVuLCBpdCBzaG91bGQgYmUgYW4gb2JqZWN0IHRoYXQKICAgICAgbWF5IGNvbnRhaW4gdGhlIGZvbGxvd2luZyBjb25maWd1cmF0aW9uIG9wdGlvbnM6CiAgICAgIDxkbD4KICAgICAgICA8ZHQgaWQ9Im1hcmtfY2xhc3NOYW1lIj48Y29kZT48c3Ryb25nPmNsYXNzTmFtZTwvc3Ryb25nPjogc3RyaW5nPC9jb2RlPjwvZHQ+CiAgICAgICAgPGRkPkFzc2lnbnMgYSBDU1MgY2xhc3MgdG8gdGhlIG1hcmtlZCBzdHJldGNoIG9mIHRleHQuPC9kZD4KICAgICAgICA8ZHQgaWQ9Im1hcmtfaW5jbHVzaXZlTGVmdCI+PGNvZGU+PHN0cm9uZz5pbmNsdXNpdmVMZWZ0PC9zdHJvbmc+OiBib29sZWFuPC9jb2RlPjwvZHQ+CiAgICAgICAgPGRkPkRldGVybWluZXMgd2hldGhlcgogICAgICAgIHRleHQgaW5zZXJ0ZWQgb24gdGhlIGxlZnQgb2YgdGhlIG1hcmtlciB3aWxsIGVuZCB1cCBpbnNpZGUKICAgICAgICBvciBvdXRzaWRlIG9mIGl0LjwvZGQ+CiAgICAgICAgPGR0IGlkPSJtYXJrX2luY2x1c2l2ZVJpZ2h0Ij48Y29kZT48c3Ryb25nPmluY2x1c2l2ZVJpZ2h0PC9zdHJvbmc+OiBib29sZWFuPC9jb2RlPjwvZHQ+CiAgICAgICAgPGRkPkxpa2UgPGNvZGU+aW5jbHVzaXZlTGVmdDwvY29kZT4sCiAgICAgICAgYnV0IGZvciB0aGUgcmlnaHQgc2lkZS48L2RkPgogICAgICAgIDxkdCBpZD0ibWFya19hdG9taWMiPjxjb2RlPjxzdHJvbmc+YXRvbWljPC9zdHJvbmc+OiBib29sZWFuPC9jb2RlPjwvZHQ+CiAgICAgICAgPGRkPkF0b21pYyByYW5nZXMgYWN0IGFzIGEgc2luZ2xlIHVuaXQgd2hlbiBjdXJzb3IgbW92ZW1lbnQgaXMKICAgICAgICBjb25jZXJuZWTigJRpLmUuIGl0IGlzIGltcG9zc2libGUgdG8gcGxhY2UgdGhlIGN1cnNvciBpbnNpZGUgb2YKICAgICAgICB0aGVtLiBJbiBhdG9taWMgcmFuZ2VzLCA8Y29kZT5pbmNsdXNpdmVMZWZ0PC9jb2RlPgogICAgICAgIGFuZCA8Y29kZT5pbmNsdXNpdmVSaWdodDwvY29kZT4gaGF2ZSBhIGRpZmZlcmVudCBtZWFuaW5n4oCUdGhleQogICAgICAgIHdpbGwgcHJldmVudCB0aGUgY3Vyc29yIGZyb20gYmVpbmcgcGxhY2VkIHJlc3BlY3RpdmVseQogICAgICAgIGRpcmVjdGx5IGJlZm9yZSBhbmQgZGlyZWN0bHkgYWZ0ZXIgdGhlIHJhbmdlLjwvZGQ+CiAgICAgICAgPGR0IGlkPSJtYXJrX2NvbGxhcHNlZCI+PGNvZGU+PHN0cm9uZz5jb2xsYXBzZWQ8L3N0cm9uZz46IGJvb2xlYW48L2NvZGU+PC9kdD4KICAgICAgICA8ZGQ+Q29sbGFwc2VkIHJhbmdlcyBkbyBub3Qgc2hvdyB1cCBpbiB0aGUgZGlzcGxheS4gU2V0dGluZyBhCiAgICAgICAgcmFuZ2UgdG8gYmUgY29sbGFwc2VkIHdpbGwgYXV0b21hdGljYWxseSBtYWtlIGl0IGF0b21pYy48L2RkPgogICAgICAgIDxkdCBpZD0ibWFya19jbGVhck9uRW50ZXIiPjxjb2RlPjxzdHJvbmc+Y2xlYXJPbkVudGVyPC9zdHJvbmc+OiBib29sZWFuPC9jb2RlPjwvZHQ+CiAgICAgICAgPGRkPldoZW4gZW5hYmxlZCwgd2lsbCBjYXVzZSB0aGUgbWFyayB0byBjbGVhciBpdHNlbGYgd2hlbmV2ZXIKICAgICAgICB0aGUgY3Vyc29yIGVudGVycyBpdHMgcmFuZ2UuIFRoaXMgaXMgbW9zdGx5IHVzZWZ1bCBmb3IKICAgICAgICB0ZXh0LXJlcGxhY2VtZW50IHdpZGdldHMgdGhhdCBuZWVkIHRvICdzbmFwIG9wZW4nIHdoZW4gdGhlCiAgICAgICAgdXNlciB0cmllcyB0byBlZGl0IHRoZW0uIFRoZQogICAgICAgIDxhIGhyZWY9IiNldmVudF9jbGVhciI+PGNvZGU+ImNsZWFyIjwvY29kZT48L2E+IGV2ZW50CiAgICAgICAgZmlyZWQgb24gdGhlIHJhbmdlIGhhbmRsZSBjYW4gYmUgdXNlZCB0byBiZSBub3RpZmllZCB3aGVuIHRoaXMKICAgICAgICBoYXBwZW5zLjwvZGQ+CiAgICAgICAgPGR0IGlkPSJtYXJrX2NsZWFyV2hlbkVtcHR5Ij48Y29kZT48c3Ryb25nPmNsZWFyV2hlbkVtcHR5PC9zdHJvbmc+OiBib29sZWFuPC9jb2RlPjwvZHQ+CiAgICAgICAgPGRkPkRldGVybWluZXMgd2hldGhlciB0aGUgbWFyayBpcyBhdXRvbWF0aWNhbGx5IGNsZWFyZWQgd2hlbgogICAgICAgIGl0IGJlY29tZXMgZW1wdHkuIERlZmF1bHQgaXMgdHJ1ZS48L2RkPgogICAgICAgIDxkdCBpZD0ibWFya19yZXBsYWNlZFdpdGgiPjxjb2RlPjxzdHJvbmc+cmVwbGFjZWRXaXRoPC9zdHJvbmc+OiBFbGVtZW50PC9jb2RlPjwvZHQ+CiAgICAgICAgPGRkPlVzZSBhIGdpdmVuIG5vZGUgdG8gZGlzcGxheSB0aGlzIHJhbmdlLiBJbXBsaWVzIGJvdGgKICAgICAgICBjb2xsYXBzZWQgYW5kIGF0b21pYy4gVGhlIGdpdmVuIERPTSBub2RlIDxlbT5tdXN0PC9lbT4gYmUgYW4KICAgICAgICBpbmxpbmUgZWxlbWVudCAoYXMgb3Bwb3NlZCB0byBhIGJsb2NrIGVsZW1lbnQpLjwvZGQ+CiAgICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+aGFuZGxlTW91c2VFdmVudHM8L3N0cm9uZz46IGJvb2xlYW48L2NvZGU+PC9kdD4KICAgICAgICA8ZGQ+V2hlbiA8Y29kZT5yZXBsYWNlZFdpdGg8L2NvZGU+IGlzIGdpdmVuLCB0aGlzIGRldGVybWluZXMKICAgICAgICB3aGV0aGVyIHRoZSBlZGl0b3Igd2lsbCBjYXB0dXJlIG1vdXNlIGFuZCBkcmFnIGV2ZW50cwogICAgICAgIG9jY3VycmluZyBpbiB0aGlzIHdpZGdldC4gRGVmYXVsdCBpcyBmYWxzZeKAlHRoZSBldmVudHMgd2lsbCBiZQogICAgICAgIGxlZnQgYWxvbmUgZm9yIHRoZSBkZWZhdWx0IGJyb3dzZXIgaGFuZGxlciwgb3Igc3BlY2lmaWMKICAgICAgICBoYW5kbGVycyBvbiB0aGUgd2lkZ2V0LCB0byBjYXB0dXJlLjwvZGQ+CiAgICAgICAgPGR0IGlkPSJtYXJrX3JlYWRPbmx5Ij48Y29kZT48c3Ryb25nPnJlYWRPbmx5PC9zdHJvbmc+OiBib29sZWFuPC9jb2RlPjwvZHQ+CiAgICAgICAgPGRkPkEgcmVhZC1vbmx5IHNwYW4gY2FuLCBhcyBsb25nIGFzIGl0IGlzIG5vdCBjbGVhcmVkLCBub3QgYmUKICAgICAgICBtb2RpZmllZCBleGNlcHQgYnkKICAgICAgICBjYWxsaW5nIDxhIGhyZWY9IiNzZXRWYWx1ZSI+PGNvZGU+c2V0VmFsdWU8L2NvZGU+PC9hPiB0byByZXNldAogICAgICAgIHRoZSB3aG9sZSBkb2N1bWVudC4gPGVtPk5vdGU6PC9lbT4gYWRkaW5nIGEgcmVhZC1vbmx5IHNwYW4KICAgICAgICBjdXJyZW50bHkgY2xlYXJzIHRoZSB1bmRvIGhpc3Rvcnkgb2YgdGhlIGVkaXRvciwgYmVjYXVzZQogICAgICAgIGV4aXN0aW5nIHVuZG8gZXZlbnRzIGJlaW5nIHBhcnRpYWxseSBudWxsaWZpZWQgYnkgcmVhZC1vbmx5CiAgICAgICAgc3BhbnMgd291bGQgY29ycnVwdCB0aGUgaGlzdG9yeSAoaW4gdGhlIGN1cnJlbnQKICAgICAgICBpbXBsZW1lbnRhdGlvbikuPC9kZD4KICAgICAgICA8ZHQgaWQ9Im1hcmtfYWRkVG9IaXN0b3J5Ij48Y29kZT48c3Ryb25nPmFkZFRvSGlzdG9yeTwvc3Ryb25nPjogYm9vbGVhbjwvY29kZT48L2R0PgogICAgICAgIDxkZD5XaGVuIHNldCB0byB0cnVlIChkZWZhdWx0IGlzIGZhbHNlKSwgYWRkaW5nIHRoaXMgbWFya2VyCiAgICAgICAgd2lsbCBjcmVhdGUgYW4gZXZlbnQgaW4gdGhlIHVuZG8gaGlzdG9yeSB0aGF0IGNhbiBiZQogICAgICAgIGluZGl2aWR1YWxseSB1bmRvbmUgKGNsZWFyaW5nIHRoZSBtYXJrZXIpLjwvZGQ+CiAgICAgICAgPGR0IGlkPSJtYXJrX3N0YXJ0U3R5bGUiPjxjb2RlPjxzdHJvbmc+c3RhcnRTdHlsZTwvc3Ryb25nPjogc3RyaW5nPC9jb2RlPjwvZHQ+PGRkPkNhbiBiZSB1c2VkIHRvIHNwZWNpZnkKICAgICAgICBhbiBleHRyYSBDU1MgY2xhc3MgdG8gYmUgYXBwbGllZCB0byB0aGUgbGVmdG1vc3Qgc3BhbiB0aGF0CiAgICAgICAgaXMgcGFydCBvZiB0aGUgbWFya2VyLjwvZGQ+CiAgICAgICAgPGR0IGlkPSJtYXJrX2VuZFN0eWxlIj48Y29kZT48c3Ryb25nPmVuZFN0eWxlPC9zdHJvbmc+OiBzdHJpbmc8L2NvZGU+PC9kdD48ZGQ+RXF1aXZhbGVudAogICAgICAgIHRvIDxjb2RlPnN0YXJ0U3R5bGU8L2NvZGU+LCBidXQgZm9yIHRoZSByaWdodG1vc3Qgc3Bhbi48L2RkPgogICAgICAgIDxkdCBpZD0ibWFya190aXRsZSI+PGNvZGU+PHN0cm9uZz50aXRsZTwvc3Ryb25nPjoKICAgICAgICBzdHJpbmc8L2NvZGU+PC9kdD48ZGQ+V2hlbiBnaXZlbiwgd2lsbCBnaXZlIHRoZSBub2RlcyBjcmVhdGVkCiAgICAgICAgZm9yIHRoaXMgc3BhbiBhIEhUTUwgPGNvZGU+dGl0bGU8L2NvZGU+IGF0dHJpYnV0ZSB3aXRoIHRoZQogICAgICAgIGdpdmVuIHZhbHVlLjwvZGQ+CiAgICAgICAgPGR0IGlkPSJtYXJrX3NoYXJlZCI+PGNvZGU+PHN0cm9uZz5zaGFyZWQ8L3N0cm9uZz46IGJvb2xlYW48L2NvZGU+PC9kdD48ZGQ+V2hlbiB0aGUKICAgICAgICB0YXJnZXQgZG9jdW1lbnQgaXMgPGEgaHJlZj0iI2xpbmtlZERvYyI+bGlua2VkPC9hPiB0byBvdGhlcgogICAgICAgIGRvY3VtZW50cywgeW91IGNhbiBzZXQgPGNvZGU+c2hhcmVkPC9jb2RlPiB0byB0cnVlIHRvIG1ha2UgdGhlCiAgICAgICAgbWFya2VyIGFwcGVhciBpbiBhbGwgZG9jdW1lbnRzLiBCeSBkZWZhdWx0LCBhIG1hcmtlciBhcHBlYXJzCiAgICAgICAgb25seSBpbiBpdHMgdGFyZ2V0IGRvY3VtZW50LjwvZGQ+CiAgICAgIDwvZGw+CiAgICAgIFRoZSBtZXRob2Qgd2lsbCByZXR1cm4gYW4gb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgbWFya2VyCiAgICAgICh3aXRoIGNvbnN0cnVjdG9yIDxjb2RlPkNvZGVNaXJyb3IuVGV4dE1hcmtlcjwvY29kZT4pLCB3aGljaAogICAgICBleHBvc2VzIHRocmVlIG1ldGhvZHM6CiAgICAgIDxjb2RlPjxzdHJvbmc+Y2xlYXI8L3N0cm9uZz4oKTwvY29kZT4sIHRvIHJlbW92ZSB0aGUgbWFyaywKICAgICAgPGNvZGU+PHN0cm9uZz5maW5kPC9zdHJvbmc+KCk8L2NvZGU+LCB3aGljaCByZXR1cm5zCiAgICAgIGEgPGNvZGU+e2Zyb20sIHRvfTwvY29kZT4gb2JqZWN0IChib3RoIGhvbGRpbmcgZG9jdW1lbnQKICAgICAgcG9zaXRpb25zKSwgaW5kaWNhdGluZyB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGUgbWFya2VkIHJhbmdlLAogICAgICBvciA8Y29kZT51bmRlZmluZWQ8L2NvZGU+IGlmIHRoZSBtYXJrZXIgaXMgbm8gbG9uZ2VyIGluIHRoZQogICAgICBkb2N1bWVudCwgYW5kIGZpbmFsbHkgPGNvZGU+PHN0cm9uZz5jaGFuZ2VkPC9zdHJvbmc+KCk8L2NvZGU+LAogICAgICB3aGljaCB5b3UgY2FuIGNhbGwgaWYgeW91J3ZlIGRvbmUgc29tZXRoaW5nIHRoYXQgbWlnaHQgY2hhbmdlCiAgICAgIHRoZSBzaXplIG9mIHRoZSBtYXJrZXIgKGZvciBleGFtcGxlIGNoYW5naW5nIHRoZSBjb250ZW50IG9mCiAgICAgIGEgPGEgaHJlZj0iI21hcmtfcmVwbGFjZWRXaXRoIj48Y29kZT5yZXBsYWNlZFdpdGg8L2NvZGU+PC9hPgogICAgICBub2RlKSwgYW5kIHdhbnQgdG8gY2hlYXBseSB1cGRhdGUgdGhlIGRpc3BsYXkuPC9kZD4KCiAgICAgIDxkdCBpZD0ic2V0Qm9va21hcmsiPjxjb2RlPjxzdHJvbmc+ZG9jLnNldEJvb2ttYXJrPC9zdHJvbmc+KHBvczoge2xpbmUsIGNofSwgP29wdGlvbnM6IG9iamVjdCkg4oaSIFRleHRNYXJrZXI8L2NvZGU+PC9kdD4KICAgICAgPGRkPkluc2VydHMgYSBib29rbWFyaywgYSBoYW5kbGUgdGhhdCBmb2xsb3dzIHRoZSB0ZXh0IGFyb3VuZCBpdAogICAgICBhcyBpdCBpcyBiZWluZyBlZGl0ZWQsIGF0IHRoZSBnaXZlbiBwb3NpdGlvbi4gQSBib29rbWFyayBoYXMgdHdvCiAgICAgIG1ldGhvZHMgPGNvZGU+ZmluZCgpPC9jb2RlPiBhbmQgPGNvZGU+Y2xlYXIoKTwvY29kZT4uIFRoZSBmaXJzdAogICAgICByZXR1cm5zIHRoZSBjdXJyZW50IHBvc2l0aW9uIG9mIHRoZSBib29rbWFyaywgaWYgaXQgaXMgc3RpbGwgaW4KICAgICAgdGhlIGRvY3VtZW50LCBhbmQgdGhlIHNlY29uZCBleHBsaWNpdGx5IHJlbW92ZXMgdGhlIGJvb2ttYXJrLgogICAgICBUaGUgb3B0aW9ucyBhcmd1bWVudCBpcyBvcHRpb25hbC4gSWYgZ2l2ZW4sIHRoZSBmb2xsb3dpbmcKICAgICAgcHJvcGVydGllcyBhcmUgcmVjb2duaXplZDoKICAgICAgPGRsPgogICAgICAgIDxkdD48Y29kZT48c3Ryb25nPndpZGdldDwvc3Ryb25nPjogRWxlbWVudDwvY29kZT48L2R0PjxkZD5DYW4gYmUgdXNlZCB0byBkaXNwbGF5IGEgRE9NCiAgICAgICAgbm9kZSBhdCB0aGUgY3VycmVudCBsb2NhdGlvbiBvZiB0aGUgYm9va21hcmsgKGFuYWxvZ291cyB0bwogICAgICAgIHRoZSA8YSBocmVmPSIjbWFya19yZXBsYWNlZFdpdGgiPjxjb2RlPnJlcGxhY2VkV2l0aDwvY29kZT48L2E+CiAgICAgICAgb3B0aW9uIHRvIDxhIGhyZWY9IiNtYXJrVGV4dCI+PGNvZGU+bWFya1RleHQ8L2NvZGU+PC9hPikuPC9kZD4KICAgICAgICA8ZHQ+PGNvZGU+PHN0cm9uZz5pbnNlcnRMZWZ0PC9zdHJvbmc+OiBib29sZWFuPC9jb2RlPjwvZHQ+PGRkPkJ5IGRlZmF1bHQsIHRleHQgdHlwZWQKICAgICAgICB3aGVuIHRoZSBjdXJzb3IgaXMgb24gdG9wIG9mIHRoZSBib29rbWFyayB3aWxsIGVuZCB1cCB0byB0aGUKICAgICAgICByaWdodCBvZiB0aGUgYm9va21hcmsuIFNldCB0aGlzIG9wdGlvbiB0byB0cnVlIHRvIG1ha2UgaXQgZ28KICAgICAgICB0byB0aGUgbGVmdCBpbnN0ZWFkLjwvZGQ+CiAgICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+c2hhcmVkPC9zdHJvbmc+OiBib29sZWFuPC9jb2RlPjwvZHQ+PGRkPlNlZQogICAgICAgIHRoZSBjb3JyZXNwb25kaW5nIDxhIGhyZWY9IiNtYXJrX3NoYXJlZCI+b3B0aW9uPC9hPgogICAgICAgIHRvIDxjb2RlPm1hcmtUZXh0PC9jb2RlPi48L2RkPgogICAgICA8L2RsPjwvZGQ+CgogICAgICA8ZHQgaWQ9ImZpbmRNYXJrcyI+PGNvZGU+PHN0cm9uZz5kb2MuZmluZE1hcmtzPC9zdHJvbmc+KGZyb206IHtsaW5lLCBjaH0sIHRvOiB7bGluZSwgY2h9KSDihpIgYXJyYXkmbHQ7VGV4dE1hcmtlciZndDs8L2NvZGU+PC9kdD4KICAgICAgPGRkPlJldHVybnMgYW4gYXJyYXkgb2YgYWxsIHRoZSBib29rbWFya3MgYW5kIG1hcmtlZCByYW5nZXMKICAgICAgZm91bmQgYmV0d2VlbiB0aGUgZ2l2ZW4gcG9zaXRpb25zLjwvZGQ+CiAgICAgIDxkdCBpZD0iZmluZE1hcmtzQXQiPjxjb2RlPjxzdHJvbmc+ZG9jLmZpbmRNYXJrc0F0PC9zdHJvbmc+KHBvczoge2xpbmUsIGNofSkg4oaSIGFycmF5Jmx0O1RleHRNYXJrZXImZ3Q7PC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5SZXR1cm5zIGFuIGFycmF5IG9mIGFsbCB0aGUgYm9va21hcmtzIGFuZCBtYXJrZWQgcmFuZ2VzCiAgICAgIHByZXNlbnQgYXQgdGhlIGdpdmVuIHBvc2l0aW9uLjwvZGQ+CiAgICAgIDxkdCBpZD0iZ2V0QWxsTWFya3MiPjxjb2RlPjxzdHJvbmc+ZG9jLmdldEFsbE1hcmtzPC9zdHJvbmc+KCkg4oaSIGFycmF5Jmx0O1RleHRNYXJrZXImZ3Q7PC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5SZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgYWxsIG1hcmtlZCByYW5nZXMgaW4gdGhlIGRvY3VtZW50LjwvZGQ+CiAgICA8L2RsPgoKICAgIDxoMyBpZD0iYXBpX2RlY29yYXRpb24iPldpZGdldCwgZ3V0dGVyLCBhbmQgZGVjb3JhdGlvbiBtZXRob2RzPC9oMz4KCiAgICA8ZGw+CiAgICAgIDxkdCBpZD0ic2V0R3V0dGVyTWFya2VyIj48Y29kZT48c3Ryb25nPmNtLnNldEd1dHRlck1hcmtlcjwvc3Ryb25nPihsaW5lOiBpbnRlZ2VyfExpbmVIYW5kbGUsIGd1dHRlcklEOiBzdHJpbmcsIHZhbHVlOiBFbGVtZW50KSDihpIgTGluZUhhbmRsZTwvY29kZT48L2R0PgogICAgICA8ZGQ+U2V0cyB0aGUgZ3V0dGVyIG1hcmtlciBmb3IgdGhlIGdpdmVuIGd1dHRlciAoaWRlbnRpZmllZCBieQogICAgICBpdHMgQ1NTIGNsYXNzLCBzZWUKICAgICAgdGhlIDxhIGhyZWY9IiNvcHRpb25fZ3V0dGVycyI+PGNvZGU+Z3V0dGVyczwvY29kZT48L2E+IG9wdGlvbikKICAgICAgdG8gdGhlIGdpdmVuIHZhbHVlLiBWYWx1ZSBjYW4gYmUgZWl0aGVyIDxjb2RlPm51bGw8L2NvZGU+LCB0bwogICAgICBjbGVhciB0aGUgbWFya2VyLCBvciBhIERPTSBlbGVtZW50LCB0byBzZXQgaXQuIFRoZSBET00gZWxlbWVudAogICAgICB3aWxsIGJlIHNob3duIGluIHRoZSBzcGVjaWZpZWQgZ3V0dGVyIG5leHQgdG8gdGhlIHNwZWNpZmllZAogICAgICBsaW5lLjwvZGQ+CgogICAgICA8ZHQgaWQ9ImNsZWFyR3V0dGVyIj48Y29kZT48c3Ryb25nPmNtLmNsZWFyR3V0dGVyPC9zdHJvbmc+KGd1dHRlcklEOiBzdHJpbmcpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5SZW1vdmUgYWxsIGd1dHRlciBtYXJrZXJzIGluCiAgICAgIHRoZSA8YSBocmVmPSIjb3B0aW9uX2d1dHRlcnMiPmd1dHRlcjwvYT4gd2l0aCB0aGUgZ2l2ZW4gSUQuPC9kZD4KCiAgICAgIDxkdCBpZD0iYWRkTGluZUNsYXNzIj48Y29kZT48c3Ryb25nPmRvYy5hZGRMaW5lQ2xhc3M8L3N0cm9uZz4obGluZTogaW50ZWdlcnxMaW5lSGFuZGxlLCB3aGVyZTogc3RyaW5nLCBjbGFzczogc3RyaW5nKSDihpIgTGluZUhhbmRsZTwvY29kZT48L2R0PgogICAgICA8ZGQ+U2V0IGEgQ1NTIGNsYXNzIG5hbWUgZm9yIHRoZSBnaXZlbiBsaW5lLiA8Y29kZT5saW5lPC9jb2RlPgogICAgICBjYW4gYmUgYSBudW1iZXIgb3IgYSBsaW5lIGhhbmRsZS4gPGNvZGU+d2hlcmU8L2NvZGU+IGRldGVybWluZXMKICAgICAgdG8gd2hpY2ggZWxlbWVudCB0aGlzIGNsYXNzIHNob3VsZCBiZSBhcHBsaWVkLCBjYW4gY2FuIGJlIG9uZQogICAgICBvZiA8Y29kZT4idGV4dCI8L2NvZGU+ICh0aGUgdGV4dCBlbGVtZW50LCB3aGljaCBsaWVzIGluIGZyb250IG9mCiAgICAgIHRoZSBzZWxlY3Rpb24pLCA8Y29kZT4iYmFja2dyb3VuZCI8L2NvZGU+IChhIGJhY2tncm91bmQgZWxlbWVudAogICAgICB0aGF0IHdpbGwgYmUgYmVoaW5kIHRoZSBzZWxlY3Rpb24pLCBvciA8Y29kZT4id3JhcCI8L2NvZGU+ICh0aGUKICAgICAgd3JhcHBlciBub2RlIHRoYXQgd3JhcHMgYWxsIG9mIHRoZSBsaW5lJ3MgZWxlbWVudHMsIGluY2x1ZGluZwogICAgICBndXR0ZXIgZWxlbWVudHMpLiA8Y29kZT5jbGFzczwvY29kZT4gc2hvdWxkIGJlIHRoZSBuYW1lIG9mIHRoZQogICAgICBjbGFzcyB0byBhcHBseS48L2RkPgoKICAgICAgPGR0IGlkPSJyZW1vdmVMaW5lQ2xhc3MiPjxjb2RlPjxzdHJvbmc+ZG9jLnJlbW92ZUxpbmVDbGFzczwvc3Ryb25nPihsaW5lOiBpbnRlZ2VyfExpbmVIYW5kbGUsIHdoZXJlOiBzdHJpbmcsIGNsYXNzOiBzdHJpbmcpIOKGkiBMaW5lSGFuZGxlPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5SZW1vdmUgYSBDU1MgY2xhc3MgZnJvbSBhIGxpbmUuIDxjb2RlPmxpbmU8L2NvZGU+IGNhbiBiZSBhCiAgICAgIGxpbmUgaGFuZGxlIG9yIG51bWJlci4gPGNvZGU+d2hlcmU8L2NvZGU+IHNob3VsZCBiZSBvbmUKICAgICAgb2YgPGNvZGU+InRleHQiPC9jb2RlPiwgPGNvZGU+ImJhY2tncm91bmQiPC9jb2RlPiwKICAgICAgb3IgPGNvZGU+IndyYXAiPC9jb2RlPgogICAgICAoc2VlIDxhIGhyZWY9IiNhZGRMaW5lQ2xhc3MiPjxjb2RlPmFkZExpbmVDbGFzczwvY29kZT48L2E+KS4gPGNvZGU+Y2xhc3M8L2NvZGU+CiAgICAgIGNhbiBiZSBsZWZ0IG9mZiB0byByZW1vdmUgYWxsIGNsYXNzZXMgZm9yIHRoZSBzcGVjaWZpZWQgbm9kZSwgb3IKICAgICAgYmUgYSBzdHJpbmcgdG8gcmVtb3ZlIG9ubHkgYSBzcGVjaWZpYyBjbGFzcy48L2RkPgoKICAgICAgPGR0IGlkPSJsaW5lSW5mbyI+PGNvZGU+PHN0cm9uZz5jbS5saW5lSW5mbzwvc3Ryb25nPihsaW5lOiBpbnRlZ2VyfExpbmVIYW5kbGUpIOKGkiBvYmplY3Q8L2NvZGU+PC9kdD4KICAgICAgPGRkPlJldHVybnMgdGhlIGxpbmUgbnVtYmVyLCB0ZXh0IGNvbnRlbnQsIGFuZCBtYXJrZXIgc3RhdHVzIG9mCiAgICAgIHRoZSBnaXZlbiBsaW5lLCB3aGljaCBjYW4gYmUgZWl0aGVyIGEgbnVtYmVyIG9yIGEgbGluZSBoYW5kbGUuCiAgICAgIFRoZSByZXR1cm5lZCBvYmplY3QgaGFzIHRoZSBzdHJ1Y3R1cmUgPGNvZGU+e2xpbmUsIGhhbmRsZSwgdGV4dCwKICAgICAgZ3V0dGVyTWFya2VycywgdGV4dENsYXNzLCBiZ0NsYXNzLCB3cmFwQ2xhc3MsIHdpZGdldHN9PC9jb2RlPiwKICAgICAgd2hlcmUgPGNvZGU+Z3V0dGVyTWFya2VyczwvY29kZT4gaXMgYW4gb2JqZWN0IG1hcHBpbmcgZ3V0dGVyIElEcwogICAgICB0byBtYXJrZXIgZWxlbWVudHMsIGFuZCA8Y29kZT53aWRnZXRzPC9jb2RlPiBpcyBhbiBhcnJheQogICAgICBvZiA8YSBocmVmPSIjYWRkTGluZVdpZGdldCI+bGluZSB3aWRnZXRzPC9hPiBhdHRhY2hlZCB0byB0aGlzCiAgICAgIGxpbmUsIGFuZCB0aGUgdmFyaW91cyBjbGFzcyBwcm9wZXJ0aWVzIHJlZmVyIHRvIGNsYXNzZXMgYWRkZWQKICAgICAgd2l0aCA8YSBocmVmPSIjYWRkTGluZUNsYXNzIj48Y29kZT5hZGRMaW5lQ2xhc3M8L2NvZGU+PC9hPi48L2RkPgoKICAgICAgPGR0IGlkPSJhZGRXaWRnZXQiPjxjb2RlPjxzdHJvbmc+Y20uYWRkV2lkZ2V0PC9zdHJvbmc+KHBvczoge2xpbmUsIGNofSwgbm9kZTogRWxlbWVudCwgc2Nyb2xsSW50b1ZpZXc6IGJvb2xlYW4pPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5QdXRzIDxjb2RlPm5vZGU8L2NvZGU+LCB3aGljaCBzaG91bGQgYmUgYW4gYWJzb2x1dGVseQogICAgICBwb3NpdGlvbmVkIERPTSBub2RlLCBpbnRvIHRoZSBlZGl0b3IsIHBvc2l0aW9uZWQgcmlnaHQgYmVsb3cgdGhlCiAgICAgIGdpdmVuIDxjb2RlPntsaW5lLCBjaH08L2NvZGU+IHBvc2l0aW9uLgogICAgICBXaGVuIDxjb2RlPnNjcm9sbEludG9WaWV3PC9jb2RlPiBpcyB0cnVlLCB0aGUgZWRpdG9yIHdpbGwgZW5zdXJlCiAgICAgIHRoYXQgdGhlIGVudGlyZSBub2RlIGlzIHZpc2libGUgKGlmIHBvc3NpYmxlKS4gVG8gcmVtb3ZlIHRoZQogICAgICB3aWRnZXQgYWdhaW4sIHNpbXBseSB1c2UgRE9NIG1ldGhvZHMgKG1vdmUgaXQgc29tZXdoZXJlIGVsc2UsIG9yCiAgICAgIGNhbGwgPGNvZGU+cmVtb3ZlQ2hpbGQ8L2NvZGU+IG9uIGl0cyBwYXJlbnQpLjwvZGQ+CgogICAgICA8ZHQgaWQ9ImFkZExpbmVXaWRnZXQiPjxjb2RlPjxzdHJvbmc+Y20uYWRkTGluZVdpZGdldDwvc3Ryb25nPihsaW5lOiBpbnRlZ2VyfExpbmVIYW5kbGUsIG5vZGU6IEVsZW1lbnQsID9vcHRpb25zOiBvYmplY3QpIOKGkiBMaW5lV2lkZ2V0PC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5BZGRzIGEgbGluZSB3aWRnZXQsIGFuIGVsZW1lbnQgc2hvd24gYmVsb3cgYSBsaW5lLCBzcGFubmluZwogICAgICB0aGUgd2hvbGUgb2YgdGhlIGVkaXRvcidzIHdpZHRoLCBhbmQgbW92aW5nIHRoZSBsaW5lcyBiZWxvdyBpdAogICAgICBkb3dud2FyZHMuIDxjb2RlPmxpbmU8L2NvZGU+IHNob3VsZCBiZSBlaXRoZXIgYW4gaW50ZWdlciBvciBhCiAgICAgIGxpbmUgaGFuZGxlLCBhbmQgPGNvZGU+bm9kZTwvY29kZT4gc2hvdWxkIGJlIGEgRE9NIG5vZGUsIHdoaWNoCiAgICAgIHdpbGwgYmUgZGlzcGxheWVkIGJlbG93IHRoZSBnaXZlbiBsaW5lLiA8Y29kZT5vcHRpb25zPC9jb2RlPiwKICAgICAgd2hlbiBnaXZlbiwgc2hvdWxkIGJlIGFuIG9iamVjdCB0aGF0IGNvbmZpZ3VyZXMgdGhlIGJlaGF2aW9yIG9mCiAgICAgIHRoZSB3aWRnZXQuIFRoZSBmb2xsb3dpbmcgb3B0aW9ucyBhcmUgc3VwcG9ydGVkIChhbGwgZGVmYXVsdCB0bwogICAgICBmYWxzZSk6CiAgICAgICAgPGRsPgogICAgICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+Y292ZXJHdXR0ZXI8L3N0cm9uZz46IGJvb2xlYW48L2NvZGU+PC9kdD4KICAgICAgICAgIDxkZD5XaGV0aGVyIHRoZSB3aWRnZXQgc2hvdWxkIGNvdmVyIHRoZSBndXR0ZXIuPC9kZD4KICAgICAgICAgIDxkdD48Y29kZT48c3Ryb25nPm5vSFNjcm9sbDwvc3Ryb25nPjogYm9vbGVhbjwvY29kZT48L2R0PgogICAgICAgICAgPGRkPldoZXRoZXIgdGhlIHdpZGdldCBzaG91bGQgc3RheSBmaXhlZCBpbiB0aGUgZmFjZSBvZgogICAgICAgICAgaG9yaXpvbnRhbCBzY3JvbGxpbmcuPC9kZD4KICAgICAgICAgIDxkdD48Y29kZT48c3Ryb25nPmFib3ZlPC9zdHJvbmc+OiBib29sZWFuPC9jb2RlPjwvZHQ+CiAgICAgICAgICA8ZGQ+Q2F1c2VzIHRoZSB3aWRnZXQgdG8gYmUgcGxhY2VkIGFib3ZlIGluc3RlYWQgb2YgYmVsb3cKICAgICAgICAgIHRoZSB0ZXh0IG9mIHRoZSBsaW5lLjwvZGQ+CiAgICAgICAgICA8ZHQ+PGNvZGU+PHN0cm9uZz5oYW5kbGVNb3VzZUV2ZW50czwvc3Ryb25nPjogYm9vbGVhbjwvY29kZT48L2R0PgogICAgICAgICAgPGRkPkRldGVybWluZXMgd2hldGhlciB0aGUgZWRpdG9yIHdpbGwgY2FwdHVyZSBtb3VzZSBhbmQKICAgICAgICAgIGRyYWcgZXZlbnRzIG9jY3VycmluZyBpbiB0aGlzIHdpZGdldC4gRGVmYXVsdCBpcyBmYWxzZeKAlHRoZQogICAgICAgICAgZXZlbnRzIHdpbGwgYmUgbGVmdCBhbG9uZSBmb3IgdGhlIGRlZmF1bHQgYnJvd3NlciBoYW5kbGVyLAogICAgICAgICAgb3Igc3BlY2lmaWMgaGFuZGxlcnMgb24gdGhlIHdpZGdldCwgdG8gY2FwdHVyZS48L2RkPgogICAgICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+aW5zZXJ0QXQ8L3N0cm9uZz46IGludGVnZXI8L2NvZGU+PC9kdD4KICAgICAgICAgIDxkZD5CeSBkZWZhdWx0LCB0aGUgd2lkZ2V0IGlzIGFkZGVkIGJlbG93IG90aGVyIHdpZGdldHMgZm9yCiAgICAgICAgICB0aGUgbGluZS4gVGhpcyBvcHRpb24gY2FuIGJlIHVzZWQgdG8gcGxhY2UgaXQgYXQgYSBkaWZmZXJlbnQKICAgICAgICAgIHBvc2l0aW9uICh6ZXJvIGZvciB0aGUgdG9wLCBOIHRvIHB1dCBpdCBhZnRlciB0aGUgTnRoIG90aGVyCiAgICAgICAgICB3aWRnZXQpLiBOb3RlIHRoYXQgdGhpcyBvbmx5IGhhcyBlZmZlY3Qgb25jZSwgd2hlbiB0aGUKICAgICAgICAgIHdpZGdldCBpcyBjcmVhdGVkLgogICAgICAgIDwvZGw+CiAgICAgIE5vdGUgdGhhdCB0aGUgd2lkZ2V0IG5vZGUgd2lsbCBiZWNvbWUgYSBkZXNjZW5kYW50IG9mIG5vZGVzIHdpdGgKICAgICAgQ29kZU1pcnJvci1zcGVjaWZpYyBDU1MgY2xhc3NlcywgYW5kIHRob3NlIGNsYXNzZXMgbWlnaHQgaW4gc29tZQogICAgICBjYXNlcyBhZmZlY3QgaXQuIFRoaXMgbWV0aG9kIHJldHVybnMgYW4gb2JqZWN0IHRoYXQgcmVwcmVzZW50cwogICAgICB0aGUgd2lkZ2V0IHBsYWNlbWVudC4gSXQnbGwgaGF2ZSBhIDxjb2RlPmxpbmU8L2NvZGU+IHByb3BlcnR5CiAgICAgIHBvaW50aW5nIGF0IHRoZSBsaW5lIGhhbmRsZSB0aGF0IGl0IGlzIGFzc29jaWF0ZWQgd2l0aCwgYW5kIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKICAgICAgICA8ZGw+CiAgICAgICAgICA8ZHQgaWQ9IndpZGdldF9jbGVhciI+PGNvZGU+PHN0cm9uZz5jbGVhcjwvc3Ryb25nPigpPC9jb2RlPjwvZHQ+PGRkPlJlbW92ZXMgdGhlIHdpZGdldC48L2RkPgogICAgICAgICAgPGR0IGlkPSJ3aWRnZXRfY2hhbmdlZCI+PGNvZGU+PHN0cm9uZz5jaGFuZ2VkPC9zdHJvbmc+KCk8L2NvZGU+PC9kdD48ZGQ+Q2FsbAogICAgICAgICAgdGhpcyBpZiB5b3UgbWFkZSBzb21lIGNoYW5nZSB0byB0aGUgd2lkZ2V0J3MgRE9NIG5vZGUgdGhhdAogICAgICAgICAgbWlnaHQgYWZmZWN0IGl0cyBoZWlnaHQuIEl0J2xsIGZvcmNlIENvZGVNaXJyb3IgdG8gdXBkYXRlCiAgICAgICAgICB0aGUgaGVpZ2h0IG9mIHRoZSBsaW5lIHRoYXQgY29udGFpbnMgdGhlIHdpZGdldC48L2RkPgogICAgICAgIDwvZGw+CiAgICAgIDwvZGQ+CiAgICA8L2RsPgoKICAgIDxoMyBpZD0iYXBpX3NpemluZyI+U2l6aW5nLCBzY3JvbGxpbmcgYW5kIHBvc2l0aW9uaW5nIG1ldGhvZHM8L2gzPgoKICAgIDxkbD4KICAgICAgPGR0IGlkPSJzZXRTaXplIj48Y29kZT48c3Ryb25nPmNtLnNldFNpemU8L3N0cm9uZz4od2lkdGg6IG51bWJlcnxzdHJpbmcsIGhlaWdodDogbnVtYmVyfHN0cmluZyk8L2NvZGU+PC9kdD4KICAgICAgPGRkPlByb2dyYW1hdGljYWxseSBzZXQgdGhlIHNpemUgb2YgdGhlIGVkaXRvciAob3ZlcnJpZGluZyB0aGUKICAgICAgYXBwbGljYWJsZSA8YSBocmVmPSIjY3NzLXJlc2l6ZSI+Q1NTCiAgICAgIHJ1bGVzPC9hPikuIDxjb2RlPndpZHRoPC9jb2RlPiBhbmQgPGNvZGU+aGVpZ2h0PC9jb2RlPgogICAgICBjYW4gYmUgZWl0aGVyIG51bWJlcnMgKGludGVycHJldGVkIGFzIHBpeGVscykgb3IgQ1NTIHVuaXRzCiAgICAgICg8Y29kZT4iMTAwJSI8L2NvZGU+LCBmb3IgZXhhbXBsZSkuIFlvdSBjYW4KICAgICAgcGFzcyA8Y29kZT5udWxsPC9jb2RlPiBmb3IgZWl0aGVyIG9mIHRoZW0gdG8gaW5kaWNhdGUgdGhhdCB0aGF0CiAgICAgIGRpbWVuc2lvbiBzaG91bGQgbm90IGJlIGNoYW5nZWQuPC9kZD4KCiAgICAgIDxkdCBpZD0ic2Nyb2xsVG8iPjxjb2RlPjxzdHJvbmc+Y20uc2Nyb2xsVG88L3N0cm9uZz4oeDogbnVtYmVyLCB5OiBudW1iZXIpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5TY3JvbGwgdGhlIGVkaXRvciB0byBhIGdpdmVuIChwaXhlbCkgcG9zaXRpb24uIEJvdGgKICAgICAgYXJndW1lbnRzIG1heSBiZSBsZWZ0IGFzIDxjb2RlPm51bGw8L2NvZGU+CiAgICAgIG9yIDxjb2RlPnVuZGVmaW5lZDwvY29kZT4gdG8gaGF2ZSBubyBlZmZlY3QuPC9kZD4KICAgICAgPGR0IGlkPSJnZXRTY3JvbGxJbmZvIj48Y29kZT48c3Ryb25nPmNtLmdldFNjcm9sbEluZm88L3N0cm9uZz4oKSDihpIge2xlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCwgY2xpZW50V2lkdGgsIGNsaWVudEhlaWdodH08L2NvZGU+PC9kdD4KICAgICAgPGRkPkdldCBhbiA8Y29kZT57bGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0LCBjbGllbnRXaWR0aCwKICAgICAgY2xpZW50SGVpZ2h0fTwvY29kZT4gb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgY3VycmVudCBzY3JvbGwKICAgICAgcG9zaXRpb24sIHRoZSBzaXplIG9mIHRoZSBzY3JvbGxhYmxlIGFyZWEsIGFuZCB0aGUgc2l6ZSBvZiB0aGUKICAgICAgdmlzaWJsZSBhcmVhIChtaW51cyBzY3JvbGxiYXJzKS48L2RkPgogICAgICA8ZHQgaWQ9InNjcm9sbEludG9WaWV3Ij48Y29kZT48c3Ryb25nPmNtLnNjcm9sbEludG9WaWV3PC9zdHJvbmc+KHdoYXQ6IHtsaW5lLCBjaH18e2xlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbX18e2Zyb20sIHRvfXxudWxsLCA/bWFyZ2luOiBudW1iZXIpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5TY3JvbGxzIHRoZSBnaXZlbiBwb3NpdGlvbiBpbnRvIHZpZXcuIDxjb2RlPndoYXQ8L2NvZGU+IG1heQogICAgICBiZSA8Y29kZT5udWxsPC9jb2RlPiB0byBzY3JvbGwgdGhlIGN1cnNvciBpbnRvIHZpZXcsCiAgICAgIGEgPGNvZGU+e2xpbmUsIGNofTwvY29kZT4gcG9zaXRpb24gdG8gc2Nyb2xsIGEgY2hhcmFjdGVyIGludG8KICAgICAgdmlldywgYSA8Y29kZT57bGVmdCwgdG9wLCByaWdodCwgYm90dG9tfTwvY29kZT4gcGl4ZWwgcmFuZ2UgKGluCiAgICAgIGVkaXRvci1sb2NhbCBjb29yZGluYXRlcyksIG9yIGEgcmFuZ2UgPGNvZGU+e2Zyb20sIHRvfTwvY29kZT4KICAgICAgY29udGFpbmluZyBlaXRoZXIgdHdvIGNoYXJhY3RlciBwb3NpdGlvbnMgb3IgdHdvIHBpeGVsIHNxdWFyZXMuCiAgICAgIFRoZSA8Y29kZT5tYXJnaW48L2NvZGU+IHBhcmFtZXRlciBpcyBvcHRpb25hbC4gV2hlbiBnaXZlbiwgaXQKICAgICAgaW5kaWNhdGVzIHRoZSBhbW91bnQgb2YgdmVydGljYWwgcGl4ZWxzIGFyb3VuZCB0aGUgZ2l2ZW4gYXJlYQogICAgICB0aGF0IHNob3VsZCBiZSBtYWRlIHZpc2libGUgYXMgd2VsbC48L2RkPgoKICAgICAgPGR0IGlkPSJjdXJzb3JDb29yZHMiPjxjb2RlPjxzdHJvbmc+Y20uY3Vyc29yQ29vcmRzPC9zdHJvbmc+KHdoZXJlOiBib29sZWFufHtsaW5lLCBjaH0sIG1vZGU6IHN0cmluZykg4oaSIHtsZWZ0LCB0b3AsIGJvdHRvbX08L2NvZGU+PC9kdD4KICAgICAgPGRkPlJldHVybnMgYW4gPGNvZGU+e2xlZnQsIHRvcCwgYm90dG9tfTwvY29kZT4gb2JqZWN0CiAgICAgIGNvbnRhaW5pbmcgdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBjdXJzb3IgcG9zaXRpb24uCiAgICAgIElmIDxjb2RlPm1vZGU8L2NvZGU+IGlzIDxjb2RlPiJsb2NhbCI8L2NvZGU+LCB0aGV5IHdpbGwgYmUKICAgICAgcmVsYXRpdmUgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgZWRpdGFibGUgZG9jdW1lbnQuIElmIGl0CiAgICAgIGlzIDxjb2RlPiJwYWdlIjwvY29kZT4gb3Igbm90IGdpdmVuLCB0aGV5IGFyZSByZWxhdGl2ZSB0byB0aGUKICAgICAgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBwYWdlLiA8Y29kZT53aGVyZTwvY29kZT4gY2FuIGJlIGEgYm9vbGVhbgogICAgICBpbmRpY2F0aW5nIHdoZXRoZXIgeW91IHdhbnQgdGhlIHN0YXJ0ICg8Y29kZT50cnVlPC9jb2RlPikgb3IgdGhlCiAgICAgIGVuZCAoPGNvZGU+ZmFsc2U8L2NvZGU+KSBvZiB0aGUgc2VsZWN0aW9uLCBvciwgaWYgYSA8Y29kZT57bGluZSwKICAgICAgY2h9PC9jb2RlPiBvYmplY3QgaXMgZ2l2ZW4sIGl0IHNwZWNpZmllcyB0aGUgcHJlY2lzZSBwb3NpdGlvbiBhdAogICAgICB3aGljaCB5b3Ugd2FudCB0byBtZWFzdXJlLjwvZGQ+CiAgICAgIDxkdCBpZD0iY2hhckNvb3JkcyI+PGNvZGU+PHN0cm9uZz5jbS5jaGFyQ29vcmRzPC9zdHJvbmc+KHBvczoge2xpbmUsIGNofSwgP21vZGU6IHN0cmluZykg4oaSIHtsZWZ0LCByaWdodCwgdG9wLCBib3R0b219PC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5SZXR1cm5zIHRoZSBwb3NpdGlvbiBhbmQgZGltZW5zaW9ucyBvZiBhbiBhcmJpdHJhcnkKICAgICAgY2hhcmFjdGVyLiA8Y29kZT5wb3M8L2NvZGU+IHNob3VsZCBiZSBhIDxjb2RlPntsaW5lLCBjaH08L2NvZGU+CiAgICAgIG9iamVjdC4gVGhpcyBkaWZmZXJzIGZyb20gPGNvZGU+Y3Vyc29yQ29vcmRzPC9jb2RlPiBpbiB0aGF0CiAgICAgIGl0J2xsIGdpdmUgdGhlIHNpemUgb2YgdGhlIHdob2xlIGNoYXJhY3RlciwgcmF0aGVyIHRoYW4ganVzdCB0aGUKICAgICAgcG9zaXRpb24gdGhhdCB0aGUgY3Vyc29yIHdvdWxkIGhhdmUgd2hlbiBpdCB3b3VsZCBzaXQgYXQgdGhhdAogICAgICBwb3NpdGlvbi48L2RkPgogICAgICA8ZHQgaWQ9ImNvb3Jkc0NoYXIiPjxjb2RlPjxzdHJvbmc+Y20uY29vcmRzQ2hhcjwvc3Ryb25nPihvYmplY3Q6IHtsZWZ0LCB0b3B9LCA/bW9kZTogc3RyaW5nKSDihpIge2xpbmUsIGNofTwvY29kZT48L2R0PgogICAgICA8ZGQ+R2l2ZW4gYW4gPGNvZGU+e2xlZnQsIHRvcH08L2NvZGU+IG9iamVjdCwgcmV0dXJucwogICAgICB0aGUgPGNvZGU+e2xpbmUsIGNofTwvY29kZT4gcG9zaXRpb24gdGhhdCBjb3JyZXNwb25kcyB0byBpdC4gVGhlCiAgICAgIG9wdGlvbmFsIDxjb2RlPm1vZGU8L2NvZGU+IHBhcmFtZXRlciBkZXRlcm1pbmVzIHJlbGF0aXZlIHRvIHdoYXQKICAgICAgdGhlIGNvb3JkaW5hdGVzIGFyZSBpbnRlcnByZXRlZC4gSXQgbWF5CiAgICAgIGJlIDxjb2RlPiJ3aW5kb3ciPC9jb2RlPiwgPGNvZGU+InBhZ2UiPC9jb2RlPiAodGhlIGRlZmF1bHQpLAogICAgICBvciA8Y29kZT4ibG9jYWwiPC9jb2RlPi48L2RkPgogICAgICA8ZHQgaWQ9ImxpbmVBdEhlaWdodCI+PGNvZGU+PHN0cm9uZz5jbS5saW5lQXRIZWlnaHQ8L3N0cm9uZz4oaGVpZ2h0OiBudW1iZXIsID9tb2RlOiBzdHJpbmcpIOKGkiBudW1iZXI8L2NvZGU+PC9kdD4KICAgICAgPGRkPkNvbXB1dGVzIHRoZSBsaW5lIGF0IHRoZSBnaXZlbiBwaXhlbAogICAgICBoZWlnaHQuIDxjb2RlPm1vZGU8L2NvZGU+IGNhbiBiZSBvbmUgb2YgdGhlIHNhbWUgc3RyaW5ncwogICAgICB0aGF0IDxhIGhyZWY9IiNjb29yZHNDaGFyIj48Y29kZT5jb29yZHNDaGFyPC9jb2RlPjwvYT4KICAgICAgYWNjZXB0cy48L2RkPgogICAgICA8ZHQgaWQ9ImhlaWdodEF0TGluZSI+PGNvZGU+PHN0cm9uZz5jbS5oZWlnaHRBdExpbmU8L3N0cm9uZz4obGluZTogbnVtYmVyLCA/bW9kZTogc3RyaW5nKSDihpIgbnVtYmVyPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5Db21wdXRlcyB0aGUgaGVpZ2h0IG9mIHRoZSB0b3Agb2YgYSBsaW5lLCBpbiB0aGUgY29vcmRpbmF0ZQogICAgICBzeXN0ZW0gc3BlY2lmaWVkIGJ5IDxjb2RlPm1vZGU8L2NvZGU+CiAgICAgIChzZWUgPGEgaHJlZj0iI2Nvb3Jkc0NoYXIiPjxjb2RlPmNvb3Jkc0NoYXI8L2NvZGU+PC9hPiksIHdoaWNoCiAgICAgIGRlZmF1bHRzIHRvIDxjb2RlPiJwYWdlIjwvY29kZT4uIFdoZW4gYSBsaW5lIGJlbG93IHRoZSBib3R0b20gb2YKICAgICAgdGhlIGRvY3VtZW50IGlzIHNwZWNpZmllZCwgdGhlIHJldHVybmVkIHZhbHVlIGlzIHRoZSBib3R0b20gb2YKICAgICAgdGhlIGxhc3QgbGluZSBpbiB0aGUgZG9jdW1lbnQuPC9kZD4KICAgICAgPGR0IGlkPSJkZWZhdWx0VGV4dEhlaWdodCI+PGNvZGU+PHN0cm9uZz5jbS5kZWZhdWx0VGV4dEhlaWdodDwvc3Ryb25nPigpIOKGkiBudW1iZXI8L2NvZGU+PC9kdD4KICAgICAgPGRkPlJldHVybnMgdGhlIGxpbmUgaGVpZ2h0IG9mIHRoZSBkZWZhdWx0IGZvbnQgZm9yIHRoZSBlZGl0b3IuPC9kZD4KICAgICAgPGR0IGlkPSJkZWZhdWx0Q2hhcldpZHRoIj48Y29kZT48c3Ryb25nPmNtLmRlZmF1bHRDaGFyV2lkdGg8L3N0cm9uZz4oKSDihpIgbnVtYmVyPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5SZXR1cm5zIHRoZSBwaXhlbCB3aWR0aCBvZiBhbiAneCcgaW4gdGhlIGRlZmF1bHQgZm9udCBmb3IKICAgICAgdGhlIGVkaXRvci4gKE5vdGUgdGhhdCBmb3Igbm9uLW1vbm9zcGFjZSBmb250cywgdGhpcyBpcyBtb3N0bHkKICAgICAgdXNlbGVzcywgYW5kIGV2ZW4gZm9yIG1vbm9zcGFjZSBmb250cywgbm9uLWFzY2lpIGNoYXJhY3RlcnMKICAgICAgbWlnaHQgaGF2ZSBhIGRpZmZlcmVudCB3aWR0aCkuPC9kZD4KCiAgICAgIDxkdCBpZD0iZ2V0Vmlld3BvcnQiPjxjb2RlPjxzdHJvbmc+Y20uZ2V0Vmlld3BvcnQ8L3N0cm9uZz4oKSDihpIge2Zyb206IG51bWJlciwgdG86IG51bWJlcn08L2NvZGU+PC9kdD4KICAgICAgPGRkPlJldHVybnMgYSA8Y29kZT57ZnJvbSwgdG99PC9jb2RlPiBvYmplY3QgaW5kaWNhdGluZyB0aGUKICAgICAgc3RhcnQgKGluY2x1c2l2ZSkgYW5kIGVuZCAoZXhjbHVzaXZlKSBvZiB0aGUgY3VycmVudGx5IHJlbmRlcmVkCiAgICAgIHBhcnQgb2YgdGhlIGRvY3VtZW50LiBJbiBiaWcgZG9jdW1lbnRzLCB3aGVuIG1vc3QgY29udGVudCBpcwogICAgICBzY3JvbGxlZCBvdXQgb2YgdmlldywgQ29kZU1pcnJvciB3aWxsIG9ubHkgcmVuZGVyIHRoZSB2aXNpYmxlCiAgICAgIHBhcnQsIGFuZCBhIG1hcmdpbiBhcm91bmQgaXQuIFNlZSBhbHNvCiAgICAgIHRoZSA8YSBocmVmPSIjZXZlbnRfdmlld3BvcnRDaGFuZ2UiPjxjb2RlPnZpZXdwb3J0Q2hhbmdlPC9jb2RlPjwvYT4KICAgICAgZXZlbnQuPC9kZD4KCiAgICAgIDxkdCBpZD0icmVmcmVzaCI+PGNvZGU+PHN0cm9uZz5jbS5yZWZyZXNoPC9zdHJvbmc+KCk8L2NvZGU+PC9kdD4KICAgICAgPGRkPklmIHlvdXIgY29kZSBkb2VzIHNvbWV0aGluZyB0byBjaGFuZ2UgdGhlIHNpemUgb2YgdGhlIGVkaXRvcgogICAgICBlbGVtZW50ICh3aW5kb3cgcmVzaXplcyBhcmUgYWxyZWFkeSBsaXN0ZW5lZCBmb3IpLCBvciB1bmhpZGVzCiAgICAgIGl0LCB5b3Ugc2hvdWxkIHByb2JhYmx5IGZvbGxvdyB1cCBieSBjYWxsaW5nIHRoaXMgbWV0aG9kIHRvCiAgICAgIGVuc3VyZSBDb2RlTWlycm9yIGlzIHN0aWxsIGxvb2tpbmcgYXMgaW50ZW5kZWQuPC9kZD4KICAgIDwvZGw+CgogICAgPGgzIGlkPSJhcGlfbW9kZSI+TW9kZSwgc3RhdGUsIGFuZCB0b2tlbi1yZWxhdGVkIG1ldGhvZHM8L2gzPgoKICAgIDxwPldoZW4gd3JpdGluZyBsYW5ndWFnZS1hd2FyZSBmdW5jdGlvbmFsaXR5LCBpdCBjYW4gb2Z0ZW4gYmUKICAgIHVzZWZ1bCB0byBob29rIGludG8gdGhlIGtub3dsZWRnZSB0aGF0IHRoZSBDb2RlTWlycm9yIGxhbmd1YWdlCiAgICBtb2RlIGhhcy4gU2VlIDxhIGhyZWY9IiNtb2RlYXBpIj50aGUgc2VjdGlvbiBvbiBtb2RlczwvYT4gZm9yIGEKICAgIG1vcmUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgaG93IHRoZXNlIHdvcmsuPC9wPgoKICAgIDxkbD4KICAgICAgPGR0IGlkPSJnZXRNb2RlIj48Y29kZT48c3Ryb25nPmRvYy5nZXRNb2RlPC9zdHJvbmc+KCkg4oaSIG9iamVjdDwvY29kZT48L2R0PgogICAgICA8ZGQ+R2V0cyB0aGUgKG91dGVyKSBtb2RlIG9iamVjdCBmb3IgdGhlIGVkaXRvci4gTm90ZSB0aGF0IHRoaXMKICAgICAgaXMgZGlzdGluY3QgZnJvbSA8Y29kZT5nZXRPcHRpb24oIm1vZGUiKTwvY29kZT4sIHdoaWNoIGdpdmVzIHlvdQogICAgICB0aGUgbW9kZSBzcGVjaWZpY2F0aW9uLCByYXRoZXIgdGhhbiB0aGUgcmVzb2x2ZWQsIGluc3RhbnRpYXRlZAogICAgICA8YSBocmVmPSIjZGVmaW5lTW9kZSI+bW9kZSBvYmplY3Q8L2E+LjwvZGQ+CgogICAgICA8ZHQgaWQ9ImdldE1vZGVBdCI+PGNvZGU+PHN0cm9uZz5kb2MuZ2V0TW9kZUF0PC9zdHJvbmc+KHBvczoge2xpbmUsIGNofSkg4oaSIG9iamVjdDwvY29kZT48L2R0PgogICAgICA8ZGQ+R2V0cyB0aGUgaW5uZXIgbW9kZSBhdCBhIGdpdmVuIHBvc2l0aW9uLiBUaGlzIHdpbGwgcmV0dXJuCiAgICAgIHRoZSBzYW1lIGFzIDxhIGhyZWY9IiNnZXRNb2RlIj48Y29kZT5nZXRNb2RlPC9jb2RlPjwvYT4gZm9yCiAgICAgIHNpbXBsZSBtb2RlcywgYnV0IHdpbGwgcmV0dXJuIGFuIGlubmVyIG1vZGUgZm9yIG5lc3RpbmcgbW9kZXMKICAgICAgKHN1Y2ggYXMgPGNvZGU+aHRtbG1peGVkPC9jb2RlPikuPC9kZD4KCiAgICAgIDxkdCBpZD0iZ2V0VG9rZW5BdCI+PGNvZGU+PHN0cm9uZz5jbS5nZXRUb2tlbkF0PC9zdHJvbmc+KHBvczoge2xpbmUsIGNofSwgP3ByZWNpc2U6IGJvb2xlYW4pIOKGkiBvYmplY3Q8L2NvZGU+PC9kdD4KICAgICAgPGRkPlJldHJpZXZlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdG9rZW4gdGhlIGN1cnJlbnQgbW9kZSBmb3VuZAogICAgICBiZWZvcmUgdGhlIGdpdmVuIHBvc2l0aW9uIChhIDxjb2RlPntsaW5lLCBjaH08L2NvZGU+IG9iamVjdCkuIFRoZQogICAgICByZXR1cm5lZCBvYmplY3QgaGFzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKICAgICAgPGRsPgogICAgICAgIDxkdD48Y29kZT48c3Ryb25nPnN0YXJ0PC9zdHJvbmc+PC9jb2RlPjwvZHQ+PGRkPlRoZSBjaGFyYWN0ZXIgKG9uIHRoZSBnaXZlbiBsaW5lKSBhdCB3aGljaCB0aGUgdG9rZW4gc3RhcnRzLjwvZGQ+CiAgICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+ZW5kPC9zdHJvbmc+PC9jb2RlPjwvZHQ+PGRkPlRoZSBjaGFyYWN0ZXIgYXQgd2hpY2ggdGhlIHRva2VuIGVuZHMuPC9kZD4KICAgICAgICA8ZHQ+PGNvZGU+PHN0cm9uZz5zdHJpbmc8L3N0cm9uZz48L2NvZGU+PC9kdD48ZGQ+VGhlIHRva2VuJ3Mgc3RyaW5nLjwvZGQ+CiAgICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+dHlwZTwvc3Ryb25nPjwvY29kZT48L2R0PjxkZD5UaGUgdG9rZW4gdHlwZSB0aGUgbW9kZSBhc3NpZ25lZAogICAgICAgIHRvIHRoZSB0b2tlbiwgc3VjaCBhcyA8Y29kZT4ia2V5d29yZCI8L2NvZGU+CiAgICAgICAgb3IgPGNvZGU+ImNvbW1lbnQiPC9jb2RlPiAobWF5IGFsc28gYmUgbnVsbCkuPC9kZD4KICAgICAgICA8ZHQ+PGNvZGU+PHN0cm9uZz5zdGF0ZTwvc3Ryb25nPjwvY29kZT48L2R0PjxkZD5UaGUgbW9kZSdzIHN0YXRlIGF0IHRoZSBlbmQgb2YgdGhpcyB0b2tlbi48L2RkPgogICAgICA8L2RsPgogICAgICBJZiA8Y29kZT5wcmVjaXNlPC9jb2RlPiBpcyB0cnVlLCB0aGUgdG9rZW4gd2lsbCBiZSBndWFyYW50ZWVkIHRvIGJlIGFjY3VyYXRlIGJhc2VkIG9uIHJlY2VudCBlZGl0cy4gSWYgZmFsc2Ugb3IKICAgICAgbm90IHNwZWNpZmllZCwgdGhlIHRva2VuIHdpbGwgdXNlIGNhY2hlZCBzdGF0ZSBpbmZvcm1hdGlvbiwgd2hpY2ggd2lsbCBiZSBmYXN0ZXIgYnV0IG1pZ2h0IG5vdCBiZSBhY2N1cmF0ZSBpZgogICAgICBlZGl0cyB3ZXJlIHJlY2VudGx5IG1hZGUgYW5kIGhpZ2hsaWdodGluZyBoYXMgbm90IHlldCBjb21wbGV0ZWQuCiAgICAgIDwvZGQ+CgogICAgICA8ZHQgaWQ9ImdldFRva2VuVHlwZUF0Ij48Y29kZT48c3Ryb25nPmNtLmdldFRva2VuVHlwZUF0PC9zdHJvbmc+KHBvczoge2xpbmUsIGNofSkg4oaSIHN0cmluZzwvY29kZT48L2R0PgogICAgICA8ZGQ+VGhpcyBpcyBhIChtdWNoKSBjaGVhcGVyIHZlcnNpb24KICAgICAgb2YgPGEgaHJlZj0iI2dldFRva2VuQXQiPjxjb2RlPmdldFRva2VuQXQ8L2NvZGU+PC9hPiB1c2VmdWwgZm9yCiAgICAgIHdoZW4geW91IGp1c3QgbmVlZCB0aGUgdHlwZSBvZiB0aGUgdG9rZW4gYXQgYSBnaXZlbiBwb3NpdGlvbiwKICAgICAgYW5kIG5vIG90aGVyIGluZm9ybWF0aW9uLiBXaWxsIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPiBmb3IKICAgICAgdW5zdHlsZWQgdG9rZW5zLCBhbmQgYSBzdHJpbmcsIHBvdGVudGlhbGx5IGNvbnRhaW5pbmcgbXVsdGlwbGUKICAgICAgc3BhY2Utc2VwYXJhdGVkIHN0eWxlIG5hbWVzLCBvdGhlcndpc2UuPC9kZD4KCiAgICAgIDxkdCBpZD0iZ2V0SGVscGVycyI+PGNvZGU+PHN0cm9uZz5jbS5nZXRIZWxwZXJzPC9zdHJvbmc+KHBvczoge2xpbmUsIGNofSwgdHlwZTogc3RyaW5nKSDihpIgYXJyYXkmbHQ7aGVscGVyJmd0OzwvY29kZT48L2R0PgogICAgICA8ZGQ+RmV0Y2ggdGhlIHNldCBvZiBhcHBsaWNhYmxlIGhlbHBlciB2YWx1ZXMgZm9yIHRoZSBnaXZlbgogICAgICBwb3NpdGlvbi4gSGVscGVycyBwcm92aWRlIGEgd2F5IHRvIGxvb2sgdXAgZnVuY3Rpb25hbGl0eQogICAgICBhcHByb3ByaWF0ZSBmb3IgYSBtb2RlLiBUaGUgPGNvZGU+dHlwZTwvY29kZT4gYXJndW1lbnQgcHJvdmlkZXMKICAgICAgdGhlIGhlbHBlciBuYW1lc3BhY2UgKHNlZQogICAgICA8YSBocmVmPSIjcmVnaXN0ZXJIZWxwZXIiPjxjb2RlPnJlZ2lzdGVySGVscGVyPC9jb2RlPjwvYT4pLCBpbgogICAgICB3aGljaCB0aGUgdmFsdWVzIHdpbGwgYmUgbG9va2VkIHVwLiBXaGVuIHRoZSBtb2RlIGl0c2VsZiBoYXMgYQogICAgICBwcm9wZXJ0eSB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSA8Y29kZT50eXBlPC9jb2RlPiwgdGhhdAogICAgICBkaXJlY3RseSBkZXRlcm1pbmVzIHRoZSBrZXlzIHRoYXQgYXJlIHVzZWQgdG8gbG9vayB1cCB0aGUgaGVscGVyCiAgICAgIHZhbHVlcyAoaXQgbWF5IGJlIGVpdGhlciBhIHNpbmdsZSBzdHJpbmcsIG9yIGFuIGFycmF5IG9mCiAgICAgIHN0cmluZ3MpLiBGYWlsaW5nIHRoYXQsIHRoZSBtb2RlJ3MgPGNvZGU+aGVscGVyVHlwZTwvY29kZT4KICAgICAgcHJvcGVydHkgYW5kIGZpbmFsbHkgdGhlIG1vZGUncyBuYW1lIGFyZSB1c2VkLjwvZGQ+CiAgICAgIDxkZD5Gb3IgZXhhbXBsZSwgdGhlIEphdmFTY3JpcHQgbW9kZSBoYXMgYQogICAgICBwcm9wZXJ0eSA8Y29kZT5mb2xkPC9jb2RlPiBjb250YWluaW5nIDxjb2RlPiJicmFjZSI8L2NvZGU+LiBXaGVuCiAgICAgIHRoZSA8Y29kZT5icmFjZS1mb2xkPC9jb2RlPiBhZGRvbiBpcyBsb2FkZWQsIHRoYXQgZGVmaW5lcyBhCiAgICAgIGhlbHBlciBuYW1lZCA8Y29kZT5icmFjZTwvY29kZT4gaW4gdGhlIDxjb2RlPmZvbGQ8L2NvZGU+CiAgICAgIG5hbWVzcGFjZS4gVGhpcyBpcyB0aGVuIHVzZWQgYnkKICAgICAgdGhlIDxhIGhyZWY9IiNhZGRvbl9mb2xkY29kZSI+PGNvZGU+Zm9sZGNvZGU8L2NvZGU+PC9hPiBhZGRvbiB0bwogICAgICBmaWd1cmUgb3V0IHRoYXQgaXQgY2FuIHVzZSB0aGF0IGZvbGRpbmcgZnVuY3Rpb24gdG8gZm9sZAogICAgICBKYXZhU2NyaXB0IGNvZGUuPC9kZD4KICAgICAgPGRkPldoZW4gYW55IDxhIGhyZWY9IiNyZWdpc3Rlckdsb2JhbEhlbHBlciI+J2dsb2JhbCc8L2E+CiAgICAgIGhlbHBlcnMgYXJlIGRlZmluZWQgZm9yIHRoZSBnaXZlbiBuYW1lc3BhY2UsIHRoZWlyIHByZWRpY2F0ZXMKICAgICAgYXJlIGNhbGxlZCBvbiB0aGUgY3VycmVudCBtb2RlIGFuZCBlZGl0b3IsIGFuZCBhbGwgdGhvc2UgdGhhdAogICAgICBkZWNsYXJlIHRoZXkgYXJlIGFwcGxpY2FibGUgd2lsbCBhbHNvIGJlIGFkZGVkIHRvIHRoZSBhcnJheSB0aGF0CiAgICAgIGlzIHJldHVybmVkLjwvZGQ+CgogICAgICA8ZHQgaWQ9ImdldEhlbHBlciI+PGNvZGU+PHN0cm9uZz5jbS5nZXRIZWxwZXI8L3N0cm9uZz4ocG9zOiB7bGluZSwgY2h9LCB0eXBlOiBzdHJpbmcpIOKGkiBoZWxwZXI8L2NvZGU+PC9kdD4KICAgICAgPGRkPlJldHVybnMgdGhlIGZpcnN0IGFwcGxpY2FibGUgaGVscGVyIHZhbHVlLgogICAgICBTZWUgPGEgaHJlZj0iI2dldEhlbHBlcnMiPjxjb2RlPmdldEhlbHBlcnM8L2NvZGU+PC9hPi48L2RkPgoKICAgICAgPGR0IGlkPSJnZXRTdGF0ZUFmdGVyIj48Y29kZT48c3Ryb25nPmNtLmdldFN0YXRlQWZ0ZXI8L3N0cm9uZz4oP2xpbmU6IGludGVnZXIsID9wcmVjaXNlOiBib29sZWFuKSDihpIgb2JqZWN0PC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5SZXR1cm5zIHRoZSBtb2RlJ3MgcGFyc2VyIHN0YXRlLCBpZiBhbnksIGF0IHRoZSBlbmQgb2YgdGhlCiAgICAgIGdpdmVuIGxpbmUgbnVtYmVyLiBJZiBubyBsaW5lIG51bWJlciBpcyBnaXZlbiwgdGhlIHN0YXRlIGF0IHRoZQogICAgICBlbmQgb2YgdGhlIGRvY3VtZW50IGlzIHJldHVybmVkLiBUaGlzIGNhbiBiZSB1c2VmdWwgZm9yIHN0b3JpbmcKICAgICAgcGFyc2luZyBlcnJvcnMgaW4gdGhlIHN0YXRlLCBvciBnZXR0aW5nIG90aGVyIGtpbmRzIG9mCiAgICAgIGNvbnRleHR1YWwgaW5mb3JtYXRpb24gZm9yIGEgbGluZS4gPGNvZGU+cHJlY2lzZTwvY29kZT4gaXMgZGVmaW5lZAogICAgICBhcyBpbiA8Y29kZT5nZXRUb2tlbkF0KCk8L2NvZGU+LjwvZGQ+CiAgICA8L2RsPgoKICAgIDxoMyBpZD0iYXBpX21pc2MiPk1pc2NlbGxhbmVvdXMgbWV0aG9kczwvaDM+CgogICAgPGRsPgogICAgICA8ZHQgaWQ9Im9wZXJhdGlvbiI+PGNvZGU+PHN0cm9uZz5jbS5vcGVyYXRpb248L3N0cm9uZz4oZnVuYzogKCkg4oaSIGFueSkg4oaSIGFueTwvY29kZT48L2R0PgogICAgICA8ZGQ+Q29kZU1pcnJvciBpbnRlcm5hbGx5IGJ1ZmZlcnMgY2hhbmdlcyBhbmQgb25seSB1cGRhdGVzIGl0cwogICAgICBET00gc3RydWN0dXJlIGFmdGVyIGl0IGhhcyBmaW5pc2hlZCBwZXJmb3JtaW5nIHNvbWUgb3BlcmF0aW9uLgogICAgICBJZiB5b3UgbmVlZCB0byBwZXJmb3JtIGEgbG90IG9mIG9wZXJhdGlvbnMgb24gYSBDb2RlTWlycm9yCiAgICAgIGluc3RhbmNlLCB5b3UgY2FuIGNhbGwgdGhpcyBtZXRob2Qgd2l0aCBhIGZ1bmN0aW9uIGFyZ3VtZW50LiBJdAogICAgICB3aWxsIGNhbGwgdGhlIGZ1bmN0aW9uLCBidWZmZXJpbmcgdXAgYWxsIGNoYW5nZXMsIGFuZCBvbmx5IGRvaW5nCiAgICAgIHRoZSBleHBlbnNpdmUgdXBkYXRlIGFmdGVyIHRoZSBmdW5jdGlvbiByZXR1cm5zLiBUaGlzIGNhbiBiZSBhCiAgICAgIGxvdCBmYXN0ZXIuIFRoZSByZXR1cm4gdmFsdWUgZnJvbSB0aGlzIG1ldGhvZCB3aWxsIGJlIHRoZSByZXR1cm4KICAgICAgdmFsdWUgb2YgeW91ciBmdW5jdGlvbi48L2RkPgoKICAgICAgPGR0IGlkPSJpbmRlbnRMaW5lIj48Y29kZT48c3Ryb25nPmNtLmluZGVudExpbmU8L3N0cm9uZz4obGluZTogaW50ZWdlciwgP2Rpcjogc3RyaW5nfGludGVnZXIpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5BZGp1c3QgdGhlIGluZGVudGF0aW9uIG9mIHRoZSBnaXZlbiBsaW5lLiBUaGUgc2Vjb25kCiAgICAgIGFyZ3VtZW50ICh3aGljaCBkZWZhdWx0cyB0byA8Y29kZT4ic21hcnQiPC9jb2RlPikgbWF5IGJlIG9uZSBvZjoKICAgICAgICA8ZGw+CiAgICAgICAgICA8ZHQ+PGNvZGU+PHN0cm9uZz4icHJldiI8L3N0cm9uZz48L2NvZGU+PC9kdD4KICAgICAgICAgIDxkZD5CYXNlIGluZGVudGF0aW9uIG9uIHRoZSBpbmRlbnRhdGlvbiBvZiB0aGUgcHJldmlvdXMgbGluZS48L2RkPgogICAgICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+InNtYXJ0Ijwvc3Ryb25nPjwvY29kZT48L2R0PgogICAgICAgICAgPGRkPlVzZSB0aGUgbW9kZSdzIHNtYXJ0IGluZGVudGF0aW9uIGlmIGF2YWlsYWJsZSwgYmVoYXZlCiAgICAgICAgICBsaWtlIDxjb2RlPiJwcmV2IjwvY29kZT4gb3RoZXJ3aXNlLjwvZGQ+CiAgICAgICAgICA8ZHQ+PGNvZGU+PHN0cm9uZz4iYWRkIjwvc3Ryb25nPjwvY29kZT48L2R0PgogICAgICAgICAgPGRkPkluY3JlYXNlIHRoZSBpbmRlbnRhdGlvbiBvZiB0aGUgbGluZSBieQogICAgICAgICAgb25lIDxhIGhyZWY9IiNvcHRpb25faW5kZW50VW5pdCI+aW5kZW50IHVuaXQ8L2E+LjwvZGQ+CiAgICAgICAgICA8ZHQ+PGNvZGU+PHN0cm9uZz4ic3VidHJhY3QiPC9zdHJvbmc+PC9jb2RlPjwvZHQ+CiAgICAgICAgICA8ZGQ+UmVkdWNlIHRoZSBpbmRlbnRhdGlvbiBvZiB0aGUgbGluZS48L2RkPgogICAgICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+Jmx0O2ludGVnZXI+PC9zdHJvbmc+PC9jb2RlPjwvZHQ+CiAgICAgICAgICA8ZGQ+QWRkIChwb3NpdGl2ZSBudW1iZXIpIG9yIHJlZHVjZSAobmVnYXRpdmUgbnVtYmVyKSB0aGUKICAgICAgICAgIGluZGVudGF0aW9uIGJ5IHRoZSBnaXZlbiBhbW91bnQgb2Ygc3BhY2VzLjwvZGQ+CiAgICAgICAgPC9kbD48L2RkPgoKICAgICAgPGR0IGlkPSJ0b2dnbGVPdmVyd3JpdGUiPjxjb2RlPjxzdHJvbmc+Y20udG9nZ2xlT3ZlcndyaXRlPC9zdHJvbmc+KD92YWx1ZTogYm9vbCk8L2NvZGU+PC9kdD4KICAgICAgPGRkPlN3aXRjaGVzIGJldHdlZW4gb3ZlcndyaXRlIGFuZCBub3JtYWwgaW5zZXJ0IG1vZGUgKHdoZW4gbm90CiAgICAgIGdpdmVuIGFuIGFyZ3VtZW50KSwgb3Igc2V0cyB0aGUgb3ZlcndyaXRlIG1vZGUgdG8gYSBzcGVjaWZpYwogICAgICBzdGF0ZSAod2hlbiBnaXZlbiBhbiBhcmd1bWVudCkuPC9kZD4KCiAgICAgIDxkdCBpZD0iZXhlY0NvbW1hbmQiPjxjb2RlPjxzdHJvbmc+Y20uZXhlY0NvbW1hbmQ8L3N0cm9uZz4obmFtZTogc3RyaW5nKTwvY29kZT48L2R0PgogICAgICA8ZGQ+UnVucyB0aGUgPGEgaHJlZj0iI2NvbW1hbmRzIj5jb21tYW5kPC9hPiB3aXRoIHRoZSBnaXZlbiBuYW1lIG9uIHRoZSBlZGl0b3IuPC9kZD4KCiAgICAgIDxkdCBpZD0icG9zRnJvbUluZGV4Ij48Y29kZT48c3Ryb25nPmRvYy5wb3NGcm9tSW5kZXg8L3N0cm9uZz4oaW5kZXg6IGludGVnZXIpIOKGkiB7bGluZSwgY2h9PC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5DYWxjdWxhdGVzIGFuZCByZXR1cm5zIGEgPGNvZGU+e2xpbmUsIGNofTwvY29kZT4gb2JqZWN0IGZvciBhCiAgICAgIHplcm8tYmFzZWQgPGNvZGU+aW5kZXg8L2NvZGU+IHdobydzIHZhbHVlIGlzIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUKICAgICAgZWRpdG9yJ3MgdGV4dC4gSWYgdGhlIDxjb2RlPmluZGV4PC9jb2RlPiBpcyBvdXQgb2YgcmFuZ2Ugb2YgdGhlIHRleHQgdGhlbgogICAgICB0aGUgcmV0dXJuZWQgb2JqZWN0IGlzIGNsaXBwZWQgdG8gc3RhcnQgb3IgZW5kIG9mIHRoZSB0ZXh0CiAgICAgIHJlc3BlY3RpdmVseS48L2RkPgogICAgICA8ZHQgaWQ9ImluZGV4RnJvbVBvcyI+PGNvZGU+PHN0cm9uZz5kb2MuaW5kZXhGcm9tUG9zPC9zdHJvbmc+KG9iamVjdDoge2xpbmUsIGNofSkg4oaSIGludGVnZXI8L2NvZGU+PC9kdD4KICAgICAgPGRkPlRoZSByZXZlcnNlIG9mIDxhIGhyZWY9IiNwb3NGcm9tSW5kZXgiPjxjb2RlPnBvc0Zyb21JbmRleDwvY29kZT48L2E+LjwvZGQ+CgogICAgICA8ZHQgaWQ9ImZvY3VzIj48Y29kZT48c3Ryb25nPmNtLmZvY3VzPC9zdHJvbmc+KCk8L2NvZGU+PC9kdD4KICAgICAgPGRkPkdpdmUgdGhlIGVkaXRvciBmb2N1cy48L2RkPgoKICAgICAgPGR0IGlkPSJnZXRJbnB1dEZpZWxkIj48Y29kZT48c3Ryb25nPmNtLmdldElucHV0RmllbGQ8L3N0cm9uZz4oKSDihpIgVGV4dEFyZWFFbGVtZW50PC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5SZXR1cm5zIHRoZSBoaWRkZW4gdGV4dGFyZWEgdXNlZCB0byByZWFkIGlucHV0LjwvZGQ+CiAgICAgIDxkdCBpZD0iZ2V0V3JhcHBlckVsZW1lbnQiPjxjb2RlPjxzdHJvbmc+Y20uZ2V0V3JhcHBlckVsZW1lbnQ8L3N0cm9uZz4oKSDihpIgRWxlbWVudDwvY29kZT48L2R0PgogICAgICA8ZGQ+UmV0dXJucyB0aGUgRE9NIG5vZGUgdGhhdCByZXByZXNlbnRzIHRoZSBlZGl0b3IsIGFuZAogICAgICBjb250cm9scyBpdHMgc2l6ZS4gUmVtb3ZlIHRoaXMgZnJvbSB5b3VyIHRyZWUgdG8gZGVsZXRlIGFuCiAgICAgIGVkaXRvciBpbnN0YW5jZS48L2RkPgogICAgICA8ZHQgaWQ9ImdldFNjcm9sbGVyRWxlbWVudCI+PGNvZGU+PHN0cm9uZz5jbS5nZXRTY3JvbGxlckVsZW1lbnQ8L3N0cm9uZz4oKSDihpIgRWxlbWVudDwvY29kZT48L2R0PgogICAgICA8ZGQ+UmV0dXJucyB0aGUgRE9NIG5vZGUgdGhhdCBpcyByZXNwb25zaWJsZSBmb3IgdGhlIHNjcm9sbGluZwogICAgICBvZiB0aGUgZWRpdG9yLjwvZGQ+CiAgICAgIDxkdCBpZD0iZ2V0R3V0dGVyRWxlbWVudCI+PGNvZGU+PHN0cm9uZz5jbS5nZXRHdXR0ZXJFbGVtZW50PC9zdHJvbmc+KCkg4oaSIEVsZW1lbnQ8L2NvZGU+PC9kdD4KICAgICAgPGRkPkZldGNoZXMgdGhlIERPTSBub2RlIHRoYXQgY29udGFpbnMgdGhlIGVkaXRvciBndXR0ZXJzLjwvZGQ+CiAgICA8L2RsPgoKICAgIDxoMyBpZD0iYXBpX3N0YXRpYyI+U3RhdGljIHByb3BlcnRpZXM8L2gzPgogICAgPHA+VGhlIDxjb2RlPkNvZGVNaXJyb3I8L2NvZGU+IG9iamVjdCBpdHNlbGYgcHJvdmlkZXMKICAgIHNldmVyYWwgdXNlZnVsIHByb3BlcnRpZXMuPC9wPgoKICAgIDxkbD4KICAgICAgPGR0IGlkPSJ2ZXJzaW9uIj48Y29kZT48c3Ryb25nPkNvZGVNaXJyb3IudmVyc2lvbjwvc3Ryb25nPjogc3RyaW5nPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5JdCBjb250YWlucyBhIHN0cmluZyB0aGF0IGluZGljYXRlcyB0aGUgdmVyc2lvbiBvZiB0aGUKICAgICAgbGlicmFyeS4gVGhpcyBpcyBhIHRyaXBsZSBvZgogICAgICBpbnRlZ2VycyA8Y29kZT4ibWFqb3IubWlub3IucGF0Y2giPC9jb2RlPiwKICAgICAgd2hlcmUgPGNvZGU+cGF0Y2g8L2NvZGU+IGlzIHplcm8gZm9yIHJlbGVhc2VzLCBhbmQgc29tZXRoaW5nCiAgICAgIGVsc2UgKHVzdWFsbHkgb25lKSBmb3IgZGV2IHNuYXBzaG90cy48L2RkPgoKICAgICAgPGR0IGlkPSJmcm9tVGV4dEFyZWEiPjxjb2RlPjxzdHJvbmc+Q29kZU1pcnJvci5mcm9tVGV4dEFyZWE8L3N0cm9uZz4odGV4dEFyZWE6IFRleHRBcmVhRWxlbWVudCwgP2NvbmZpZzogb2JqZWN0KTwvY29kZT48L2R0PgogICAgICA8ZGQ+CiAgICAgICAgVGhlIG1ldGhvZCBwcm92aWRlcyBhbm90aGVyIHdheSB0byBpbml0aWFsaXplIGFuIGVkaXRvci4gSXQKICAgICAgICB0YWtlcyBhIHRleHRhcmVhIERPTSBub2RlIGFzIGZpcnN0IGFyZ3VtZW50IGFuZCBhbiBvcHRpb25hbAogICAgICAgIGNvbmZpZ3VyYXRpb24gb2JqZWN0IGFzIHNlY29uZC4gSXQgd2lsbCByZXBsYWNlIHRoZSB0ZXh0YXJlYQogICAgICAgIHdpdGggYSBDb2RlTWlycm9yIGluc3RhbmNlLCBhbmQgd2lyZSB1cCB0aGUgZm9ybSBvZiB0aGF0CiAgICAgICAgdGV4dGFyZWEgKGlmIGFueSkgdG8gbWFrZSBzdXJlIHRoZSBlZGl0b3IgY29udGVudHMgYXJlIHB1dAogICAgICAgIGludG8gdGhlIHRleHRhcmVhIHdoZW4gdGhlIGZvcm0gaXMgc3VibWl0dGVkLiBUaGUgdGV4dCBpbiB0aGUKICAgICAgICB0ZXh0YXJlYSB3aWxsIHByb3ZpZGUgdGhlIGNvbnRlbnQgZm9yIHRoZSBlZGl0b3IuIEEgQ29kZU1pcnJvcgogICAgICAgIGluc3RhbmNlIGNyZWF0ZWQgdGhpcyB3YXkgaGFzIHRocmVlIGFkZGl0aW9uYWwgbWV0aG9kczoKICAgICAgICA8ZGw+CiAgICAgICAgICA8ZHQgaWQ9InNhdmUiPjxjb2RlPjxzdHJvbmc+Y20uc2F2ZTwvc3Ryb25nPigpPC9jb2RlPjwvZHQ+CiAgICAgICAgICA8ZGQ+Q29weSB0aGUgY29udGVudCBvZiB0aGUgZWRpdG9yIGludG8gdGhlIHRleHRhcmVhLjwvZGQ+CgogICAgICAgICAgPGR0IGlkPSJ0b1RleHRBcmVhIj48Y29kZT48c3Ryb25nPmNtLnRvVGV4dEFyZWE8L3N0cm9uZz4oKTwvY29kZT48L2R0PgogICAgICAgICAgPGRkPlJlbW92ZSB0aGUgZWRpdG9yLCBhbmQgcmVzdG9yZSB0aGUgb3JpZ2luYWwgdGV4dGFyZWEgKHdpdGgKICAgICAgICAgIHRoZSBlZGl0b3IncyBjdXJyZW50IGNvbnRlbnQpLjwvZGQ+CgogICAgICAgICAgPGR0IGlkPSJnZXRUZXh0QXJlYSI+PGNvZGU+PHN0cm9uZz5jbS5nZXRUZXh0QXJlYTwvc3Ryb25nPigpIOKGkiBUZXh0QXJlYUVsZW1lbnQ8L2NvZGU+PC9kdD4KICAgICAgICAgIDxkZD5SZXR1cm5zIHRoZSB0ZXh0YXJlYSB0aGF0IHRoZSBpbnN0YW5jZSB3YXMgYmFzZWQgb24uPC9kZD4KICAgICAgICA8L2RsPgogICAgICA8L2RkPgoKICAgICAgPGR0IGlkPSJkZWZhdWx0cyI+PGNvZGU+PHN0cm9uZz5Db2RlTWlycm9yLmRlZmF1bHRzPC9zdHJvbmc+OiBvYmplY3Q8L2NvZGU+PC9kdD4KICAgICAgPGRkPkFuIG9iamVjdCBjb250YWluaW5nIGRlZmF1bHQgdmFsdWVzIGZvcgogICAgICBhbGwgPGEgaHJlZj0iI2NvbmZpZyI+b3B0aW9uczwvYT4uIFlvdSBjYW4gYXNzaWduIHRvIGl0cwogICAgICBwcm9wZXJ0aWVzIHRvIG1vZGlmeSBkZWZhdWx0cyAodGhvdWdoIHRoaXMgd29uJ3QgYWZmZWN0IGVkaXRvcnMKICAgICAgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBjcmVhdGVkKS48L2RkPgoKICAgICAgPGR0IGlkPSJkZWZpbmVFeHRlbnNpb24iPjxjb2RlPjxzdHJvbmc+Q29kZU1pcnJvci5kZWZpbmVFeHRlbnNpb248L3N0cm9uZz4obmFtZTogc3RyaW5nLCB2YWx1ZTogYW55KTwvY29kZT48L2R0PgogICAgICA8ZGQ+SWYgeW91IHdhbnQgdG8gZGVmaW5lIGV4dHJhIG1ldGhvZHMgaW4gdGVybXMgb2YgdGhlCiAgICAgIENvZGVNaXJyb3IgQVBJLCBpdCBpcyBwb3NzaWJsZSB0bwogICAgICB1c2UgPGNvZGU+ZGVmaW5lRXh0ZW5zaW9uPC9jb2RlPi4gVGhpcyB3aWxsIGNhdXNlIHRoZSBnaXZlbgogICAgICB2YWx1ZSAodXN1YWxseSBhIG1ldGhvZCkgdG8gYmUgYWRkZWQgdG8gYWxsIENvZGVNaXJyb3IgaW5zdGFuY2VzCiAgICAgIGNyZWF0ZWQgZnJvbSB0aGVuIG9uLjwvZGQ+CgogICAgICA8ZHQgaWQ9ImRlZmluZURvY0V4dGVuc2lvbiI+PGNvZGU+PHN0cm9uZz5Db2RlTWlycm9yLmRlZmluZURvY0V4dGVuc2lvbjwvc3Ryb25nPihuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5MaWtlIDxhIGhyZWY9IiNkZWZpbmVFeHRlbnN0aW9uIj48Y29kZT5kZWZpbmVFeHRlbnNpb248L2NvZGU+PC9hPiwKICAgICAgYnV0IHRoZSBtZXRob2Qgd2lsbCBiZSBhZGRlZCB0byB0aGUgaW50ZXJmYWNlCiAgICAgIGZvciA8YSBocmVmPSIjRG9jIj48Y29kZT5Eb2M8L2NvZGU+PC9hPiBvYmplY3RzIGluc3RlYWQuPC9kZD4KCiAgICAgIDxkdCBpZD0iZGVmaW5lT3B0aW9uIj48Y29kZT48c3Ryb25nPkNvZGVNaXJyb3IuZGVmaW5lT3B0aW9uPC9zdHJvbmc+KG5hbWU6IHN0cmluZywKICAgICAgZGVmYXVsdDogYW55LCB1cGRhdGVGdW5jOiBmdW5jdGlvbik8L2NvZGU+PC9kdD4KICAgICAgPGRkPlNpbWlsYXJseSwgPGNvZGU+ZGVmaW5lT3B0aW9uPC9jb2RlPiBjYW4gYmUgdXNlZCB0byBkZWZpbmUgbmV3IG9wdGlvbnMgZm9yCiAgICAgIENvZGVNaXJyb3IuIFRoZSA8Y29kZT51cGRhdGVGdW5jPC9jb2RlPiB3aWxsIGJlIGNhbGxlZCB3aXRoIHRoZQogICAgICBlZGl0b3IgaW5zdGFuY2UgYW5kIHRoZSBuZXcgdmFsdWUgd2hlbiBhbiBlZGl0b3IgaXMgaW5pdGlhbGl6ZWQsCiAgICAgIGFuZCB3aGVuZXZlciB0aGUgb3B0aW9uIGlzIG1vZGlmaWVkCiAgICAgIHRocm91Z2ggPGEgaHJlZj0iI3NldE9wdGlvbiI+PGNvZGU+c2V0T3B0aW9uPC9jb2RlPjwvYT4uPC9kZD4KCiAgICAgIDxkdCBpZD0iZGVmaW5lSW5pdEhvb2siPjxjb2RlPjxzdHJvbmc+Q29kZU1pcnJvci5kZWZpbmVJbml0SG9vazwvc3Ryb25nPihmdW5jOiBmdW5jdGlvbik8L2NvZGU+PC9kdD4KICAgICAgPGRkPklmIHlvdXIgZXh0ZW50aW9uIGp1c3QgbmVlZHMgdG8gcnVuIHNvbWUKICAgICAgY29kZSB3aGVuZXZlciBhIENvZGVNaXJyb3IgaW5zdGFuY2UgaXMgaW5pdGlhbGl6ZWQsCiAgICAgIHVzZSA8Y29kZT5Db2RlTWlycm9yLmRlZmluZUluaXRIb29rPC9jb2RlPi4gR2l2ZSBpdCBhIGZ1bmN0aW9uIGFzCiAgICAgIGl0cyBvbmx5IGFyZ3VtZW50LCBhbmQgZnJvbSB0aGVuIG9uLCB0aGF0IGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkCiAgICAgICh3aXRoIHRoZSBpbnN0YW5jZSBhcyBhcmd1bWVudCkgd2hlbmV2ZXIgYSBuZXcgQ29kZU1pcnJvciBpbnN0YW5jZQogICAgICBpcyBpbml0aWFsaXplZC48L2RkPgoKICAgICAgPGR0IGlkPSJyZWdpc3RlckhlbHBlciI+PGNvZGU+PHN0cm9uZz5Db2RlTWlycm9yLnJlZ2lzdGVySGVscGVyPC9zdHJvbmc+KHR5cGU6wqBzdHJpbmcsIG5hbWU6wqBzdHJpbmcsIHZhbHVlOsKgaGVscGVyKTwvY29kZT48L2R0PgogICAgICA8ZGQ+UmVnaXN0ZXJzIGEgaGVscGVyIHZhbHVlIHdpdGggdGhlIGdpdmVuIDxjb2RlPm5hbWU8L2NvZGU+IGluCiAgICAgIHRoZSBnaXZlbiBuYW1lc3BhY2UgKDxjb2RlPnR5cGU8L2NvZGU+KS4gVGhpcyBpcyB1c2VkIHRvIGRlZmluZQogICAgICBmdW5jdGlvbmFsaXR5IHRoYXQgbWF5IGJlIGxvb2tlZCB1cCBieSBtb2RlLiBXaWxsIGNyZWF0ZSAoaWYgaXQKICAgICAgZG9lc24ndCBhbHJlYWR5IGV4aXN0KSBhIHByb3BlcnR5IG9uIHRoZSA8Y29kZT5Db2RlTWlycm9yPC9jb2RlPgogICAgICBvYmplY3QgZm9yIHRoZSBnaXZlbiA8Y29kZT50eXBlPC9jb2RlPiwgcG9pbnRpbmcgdG8gYW4gb2JqZWN0CiAgICAgIHRoYXQgbWFwcyBuYW1lcyB0byB2YWx1ZXMuIEkuZS4gYWZ0ZXIKICAgICAgZG9pbmcgPGNvZGU+Q29kZU1pcnJvci5yZWdpc3RlckhlbHBlcigiaGludCIsICJmb28iLAogICAgICBteUZvbyk8L2NvZGU+LCB0aGUgdmFsdWUgPGNvZGU+Q29kZU1pcnJvci5oaW50LmZvbzwvY29kZT4gd2lsbAogICAgICBwb2ludCB0byA8Y29kZT5teUZvbzwvY29kZT4uPC9kZD4KCiAgICAgIDxkdCBpZD0icmVnaXN0ZXJHbG9iYWxIZWxwZXIiPjxjb2RlPjxzdHJvbmc+Q29kZU1pcnJvci5yZWdpc3Rlckdsb2JhbEhlbHBlcjwvc3Ryb25nPih0eXBlOsKgc3RyaW5nLCBuYW1lOsKgc3RyaW5nLCBwcmVkaWNhdGU6wqBmbihtb2RlLMKgQ29kZU1pcnJvciksIHZhbHVlOsKgaGVscGVyKTwvY29kZT48L2R0PgogICAgICA8ZGQ+QWN0cwogICAgICBsaWtlIDxhIGhyZWY9IiNyZWdpc3RlckhlbHBlciI+PGNvZGU+cmVnaXN0ZXJIZWxwZXI8L2NvZGU+PC9hPiwKICAgICAgYnV0IGFsc28gcmVnaXN0ZXJzIHRoaXMgaGVscGVyIGFzICdnbG9iYWwnLCBtZWFuaW5nIHRoYXQgaXQgd2lsbAogICAgICBiZSBpbmNsdWRlZCBieSA8YSBocmVmPSIjZ2V0SGVscGVycyI+PGNvZGU+Z2V0SGVscGVyczwvY29kZT48L2E+CiAgICAgIHdoZW5ldmVyIHRoZSBnaXZlbiA8Y29kZT5wcmVkaWNhdGU8L2NvZGU+IHJldHVybnMgdHJ1ZSB3aGVuCiAgICAgIGNhbGxlZCB3aXRoIHRoZSBsb2NhbCBtb2RlIGFuZCBlZGl0b3IuPC9kZD4KCiAgICAgIDxkdCBpZD0iUG9zIj48Y29kZT48c3Ryb25nPkNvZGVNaXJyb3IuUG9zPC9zdHJvbmc+KGxpbmU6IGludGVnZXIsID9jaDogaW50ZWdlcik8L2NvZGU+PC9kdD4KICAgICAgPGRkPkEgY29uc3RydWN0b3IgZm9yIHRoZSA8Y29kZT57bGluZSwgY2h9PC9jb2RlPiBvYmplY3RzIHRoYXQKICAgICAgYXJlIHVzZWQgdG8gcmVwcmVzZW50IHBvc2l0aW9ucyBpbiBlZGl0b3IgZG9jdW1lbnRzLjwvZGQ+CgogICAgICA8ZHQgaWQ9ImNoYW5nZUVuZCI+PGNvZGU+PHN0cm9uZz5Db2RlTWlycm9yLmNoYW5nZUVuZDwvc3Ryb25nPihjaGFuZ2U6IG9iamVjdCkg4oaSIHtsaW5lLCBjaH08L2NvZGU+PC9kdD4KICAgICAgPGRkPlV0aWxpdHkgZnVuY3Rpb24gdGhhdCBjb21wdXRlcyBhbiBlbmQgcG9zaXRpb24gZnJvbSBhIGNoYW5nZQogICAgICAoYW4gb2JqZWN0IHdpdGggPGNvZGU+ZnJvbTwvY29kZT4sIDxjb2RlPnRvPC9jb2RlPiwKICAgICAgYW5kIDxjb2RlPnRleHQ8L2NvZGU+IHByb3BlcnRpZXMsIGFzIHBhc3NlZCB0bwogICAgICB2YXJpb3VzIDxhIGhyZWY9IiNldmVudF9jaGFuZ2UiPmV2ZW50IGhhbmRsZXJzPC9hPikuIFRoZQogICAgICByZXR1cm5lZCBwb3NpdGlvbiB3aWxsIGJlIHRoZSBlbmQgb2YgdGhlIGNoYW5nZWQKICAgICAgcmFuZ2UsIDxlbT5hZnRlcjwvZW0+IHRoZSBjaGFuZ2UgaXMgYXBwbGllZC48L2RkPgogICAgPC9kbD4KPC9zZWN0aW9uPgoKPHNlY3Rpb24gaWQ9YWRkb25zPgogICAgPGgyPkFkZG9uczwvaDI+CgogICAgPHA+VGhlIDxjb2RlPmFkZG9uPC9jb2RlPiBkaXJlY3RvcnkgaW4gdGhlIGRpc3RyaWJ1dGlvbiBjb250YWlucyBhCiAgICBudW1iZXIgb2YgcmV1c2FibGUgY29tcG9uZW50cyB0aGF0IGltcGxlbWVudCBleHRyYSBlZGl0b3IKICAgIGZ1bmN0aW9uYWxpdHkgKG9uIHRvcCBvZiBleHRlbnNpb24gZnVuY3Rpb25zCiAgICBsaWtlIDxhIGhyZWY9IiNkZWZpbmVPcHRpb24iPjxjb2RlPmRlZmluZU9wdGlvbjwvY29kZT48L2E+LCA8YSBocmVmPSIjZGVmaW5lRXh0ZW5zaW9uIj48Y29kZT5kZWZpbmVFeHRlbnNpb248L2NvZGU+PC9hPiwKICAgIGFuZCA8YSBocmVmPSIjcmVnaXN0ZXJIZWxwZXIiPjxjb2RlPnJlZ2lzdGVySGVscGVyPC9jb2RlPjwvYT4pLiBJbgogICAgYnJpZWYsIHRoZXkgYXJlOjwvcD4KCiAgICA8ZGw+CiAgICAgIDxkdCBpZD0iYWRkb25fZGlhbG9nIj48YSBocmVmPSIuLi9hZGRvbi9kaWFsb2cvZGlhbG9nLmpzIj48Y29kZT5kaWFsb2cvZGlhbG9nLmpzPC9jb2RlPjwvYT48L2R0PgogICAgICA8ZGQ+UHJvdmlkZXMgYSB2ZXJ5IHNpbXBsZSB3YXkgdG8gcXVlcnkgdXNlcnMgZm9yIHRleHQgaW5wdXQuCiAgICAgIEFkZHMgYW4gPHN0cm9uZz48Y29kZT5vcGVuRGlhbG9nPC9jb2RlPjwvc3Ryb25nPiBtZXRob2QgdG8KICAgICAgQ29kZU1pcnJvciBpbnN0YW5jZXMsIHdoaWNoIGNhbiBiZSBjYWxsZWQgd2l0aCBhbiBIVE1MIGZyYWdtZW50CiAgICAgIG9yIGEgZGV0YWNoZWQgRE9NIG5vZGUgdGhhdCBwcm92aWRlcyB0aGUgcHJvbXB0IChzaG91bGQgaW5jbHVkZQogICAgICBhbiA8Y29kZT5pbnB1dDwvY29kZT4gdGFnKSwgYW5kIGEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQKICAgICAgd2hlbiB0ZXh0IGhhcyBiZWVuIGVudGVyZWQuIEFsc28gYWRkcwogICAgICBhbiA8c3Ryb25nPjxjb2RlPm9wZW5Ob3RpZmljYXRpb248L2NvZGU+PC9zdHJvbmc+IGZ1bmN0aW9uIHRoYXQKICAgICAgc2ltcGx5IHNob3dzIGFuIEhUTUwgZnJhZ21lbnQgYXMgYSBub3RpZmljYXRpb24uIERlcGVuZHMKICAgICAgb24gPGNvZGU+YWRkb24vZGlhbG9nL2RpYWxvZy5jc3M8L2NvZGU+LjwvZGQ+CgogICAgICA8ZHQgaWQ9ImFkZG9uX3NlYXJjaGN1cnNvciI+PGEgaHJlZj0iLi4vYWRkb24vc2VhcmNoL3NlYXJjaGN1cnNvci5qcyI+PGNvZGU+c2VhcmNoL3NlYXJjaGN1cnNvci5qczwvY29kZT48L2E+PC9kdD4KICAgICAgPGRkPkFkZHMgdGhlIDxjb2RlPmdldFNlYXJjaEN1cnNvcihxdWVyeSwgc3RhcnQsIGNhc2VGb2xkKSDihpIKICAgICAgY3Vyc29yPC9jb2RlPiBtZXRob2QgdG8gQ29kZU1pcnJvciBpbnN0YW5jZXMsIHdoaWNoIGNhbiBiZSB1c2VkCiAgICAgIHRvIGltcGxlbWVudCBzZWFyY2gvcmVwbGFjZSBmdW5jdGlvbmFsaXR5LiA8Y29kZT5xdWVyeTwvY29kZT4KICAgICAgY2FuIGJlIGEgcmVndWxhciBleHByZXNzaW9uIG9yIGEgc3RyaW5nIChvbmx5IHN0cmluZ3Mgd2lsbCBtYXRjaAogICAgICBhY3Jvc3MgbGluZXPigJRpZiB0aGV5IGNvbnRhaW4gbmV3bGluZXMpLiA8Y29kZT5zdGFydDwvY29kZT4KICAgICAgcHJvdmlkZXMgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIG9mIHRoZSBzZWFyY2guIEl0IGNhbiBiZQogICAgICBhIDxjb2RlPntsaW5lLCBjaH08L2NvZGU+IG9iamVjdCwgb3IgY2FuIGJlIGxlZnQgb2ZmIHRvIGRlZmF1bHQKICAgICAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBkb2N1bWVudC4gPGNvZGU+Y2FzZUZvbGQ8L2NvZGU+IGlzIG9ubHkKICAgICAgcmVsZXZhbnQgd2hlbiBtYXRjaGluZyBhIHN0cmluZy4gSXQgd2lsbCBjYXVzZSB0aGUgc2VhcmNoIHRvIGJlCiAgICAgIGNhc2UtaW5zZW5zaXRpdmUuIEEgc2VhcmNoIGN1cnNvciBoYXMgdGhlIGZvbGxvd2luZyBtZXRob2RzOgogICAgICAgIDxkbD4KICAgICAgICAgIDxkdD48Y29kZT48c3Ryb25nPmZpbmROZXh0PC9zdHJvbmc+KCkg4oaSIGJvb2xlYW48L2NvZGU+PC9kdD4KICAgICAgICAgIDxkdD48Y29kZT48c3Ryb25nPmZpbmRQcmV2aW91czwvc3Ryb25nPigpIOKGkiBib29sZWFuPC9jb2RlPjwvZHQ+CiAgICAgICAgICA8ZGQ+U2VhcmNoIGZvcndhcmQgb3IgYmFja3dhcmQgZnJvbSB0aGUgY3VycmVudCBwb3NpdGlvbi4KICAgICAgICAgIFRoZSByZXR1cm4gdmFsdWUgaW5kaWNhdGVzIHdoZXRoZXIgYSBtYXRjaCB3YXMgZm91bmQuIElmCiAgICAgICAgICBtYXRjaGluZyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiwgdGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlIHRoZQogICAgICAgICAgYXJyYXkgcmV0dXJuZWQgYnkgdGhlIDxjb2RlPm1hdGNoPC9jb2RlPiBtZXRob2QsIGluIGNhc2UgeW91CiAgICAgICAgICB3YW50IHRvIGV4dHJhY3QgbWF0Y2hlZCBncm91cHMuPC9kZD4KICAgICAgICAgIDxkdD48Y29kZT48c3Ryb25nPmZyb208L3N0cm9uZz4oKSDihpIge2xpbmUsIGNofTwvY29kZT48L2R0PgogICAgICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+dG88L3N0cm9uZz4oKSDihpIge2xpbmUsIGNofTwvY29kZT48L2R0PgogICAgICAgICAgPGRkPlRoZXNlIGFyZSBvbmx5IHZhbGlkIHdoZW4gdGhlIGxhc3QgY2FsbAogICAgICAgICAgdG8gPGNvZGU+ZmluZE5leHQ8L2NvZGU+IG9yIDxjb2RlPmZpbmRQcmV2aW91czwvY29kZT4gZGlkCiAgICAgICAgICBub3QgcmV0dXJuIGZhbHNlLiBUaGV5IHdpbGwgcmV0dXJuIDxjb2RlPntsaW5lLCBjaH08L2NvZGU+CiAgICAgICAgICBvYmplY3RzIHBvaW50aW5nIGF0IHRoZSBzdGFydCBhbmQgZW5kIG9mIHRoZSBtYXRjaC48L2RkPgogICAgICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+cmVwbGFjZTwvc3Ryb25nPih0ZXh0OiBzdHJpbmcpPC9jb2RlPjwvZHQ+CiAgICAgICAgICA8ZGQ+UmVwbGFjZXMgdGhlIGN1cnJlbnRseSBmb3VuZCBtYXRjaCB3aXRoIHRoZSBnaXZlbiB0ZXh0CiAgICAgICAgICBhbmQgYWRqdXN0cyB0aGUgY3Vyc29yIHBvc2l0aW9uIHRvIHJlZmxlY3QgdGhlCiAgICAgICAgICByZXBsYWNlbWVudC48L2RkPgogICAgICAgIDwvZGw+PC9kZD4KCiAgICAgIDxkdCBpZD0iYWRkb25fc2VhcmNoIj48YSBocmVmPSIuLi9hZGRvbi9zZWFyY2gvc2VhcmNoLmpzIj48Y29kZT5zZWFyY2gvc2VhcmNoLmpzPC9jb2RlPjwvYT48L2R0PgogICAgICA8ZGQ+SW1wbGVtZW50cyB0aGUgc2VhcmNoIGNvbW1hbmRzLiBDb2RlTWlycm9yIGhhcyBrZXlzIGJvdW5kIHRvCiAgICAgIHRoZXNlIGJ5IGRlZmF1bHQsIGJ1dCB3aWxsIG5vdCBkbyBhbnl0aGluZyB3aXRoIHRoZW0gdW5sZXNzIGFuCiAgICAgIGltcGxlbWVudGF0aW9uIGlzIHByb3ZpZGVkLiBEZXBlbmRzCiAgICAgIG9uIDxjb2RlPnNlYXJjaGN1cnNvci5qczwvY29kZT4sIGFuZCB3aWxsIG1ha2UgdXNlCiAgICAgIG9mIDxhIGhyZWY9IiNhZGRvbl9kaWFsb2ciPjxjb2RlPm9wZW5EaWFsb2c8L2NvZGU+PC9hPiB3aGVuCiAgICAgIGF2YWlsYWJsZSB0byBtYWtlIHByb21wdGluZyBmb3Igc2VhcmNoIHF1ZXJpZXMgbGVzcyB1Z2x5LjwvZGQ+CgogICAgICA8ZHQgaWQ9ImFkZG9uX21hdGNoYnJhY2tldHMiPjxhIGhyZWY9Ii4uL2FkZG9uL2VkaXQvbWF0Y2hicmFja2V0cy5qcyI+PGNvZGU+ZWRpdC9tYXRjaGJyYWNrZXRzLmpzPC9jb2RlPjwvYT48L2R0PgogICAgICA8ZGQ+RGVmaW5lcyBhbiBvcHRpb24gPGNvZGU+bWF0Y2hCcmFja2V0czwvY29kZT4gd2hpY2gsIHdoZW4gc2V0CiAgICAgIHRvIHRydWUsIGNhdXNlcyBtYXRjaGluZyBicmFja2V0cyB0byBiZSBoaWdobGlnaHRlZCB3aGVuZXZlciB0aGUKICAgICAgY3Vyc29yIGlzIG5leHQgdG8gdGhlbS4gSXQgYWxzbyBhZGRzIGEKICAgICAgbWV0aG9kIDxjb2RlPm1hdGNoQnJhY2tldHM8L2NvZGU+IHRoYXQgZm9yY2VzIHRoaXMgdG8gaGFwcGVuCiAgICAgIG9uY2UsIGFuZCBhIG1ldGhvZCA8Y29kZT5maW5kTWF0Y2hpbmdCcmFja2V0PC9jb2RlPiB0aGF0IGNhbiBiZQogICAgICB1c2VkIHRvIHJ1biB0aGUgYnJhY2tldC1maW5kaW5nIGFsZ29yaXRobSB0aGF0IHRoaXMgdXNlcwogICAgICBpbnRlcm5hbGx5LjwvZGQ+CgogICAgICA8ZHQgaWQ9ImFkZG9uX2Nsb3NlYnJhY2tldHMiPjxhIGhyZWY9Ii4uL2FkZG9uL2VkaXQvY2xvc2VicmFja2V0cy5qcyI+PGNvZGU+ZWRpdC9jbG9zZWJyYWNrZXRzLmpzPC9jb2RlPjwvYT48L2R0PgogICAgICA8ZGQ+RGVmaW5lcyBhbiBvcHRpb24gPGNvZGU+YXV0b0Nsb3NlQnJhY2tldHM8L2NvZGU+IHRoYXQgd2lsbAogICAgICBhdXRvLWNsb3NlIGJyYWNrZXRzIGFuZCBxdW90ZXMgd2hlbiB0eXBlZC4gQnkgZGVmYXVsdCwgaXQnbGwKICAgICAgYXV0by1jbG9zZSA8Y29kZT4oKVtde30nJyIiPC9jb2RlPiwgYnV0IHlvdSBjYW4gcGFzcyBpdCBhIHN0cmluZwogICAgICBzaW1pbGFyIHRvIHRoYXQgKGNvbnRhaW5pbmcgcGFpcnMgb2YgbWF0Y2hpbmcgY2hhcmFjdGVycyksIG9yIGFuCiAgICAgIG9iamVjdCB3aXRoIDxjb2RlPnBhaXJzPC9jb2RlPiBhbmQKICAgICAgb3B0aW9uYWxseSA8Y29kZT5leHBsb2RlPC9jb2RlPiBwcm9wZXJ0aWVzIHRvIGN1c3RvbWl6ZQogICAgICBpdC4gPGNvZGU+ZXhwbG9kZTwvY29kZT4gc2hvdWxkIGJlIGEgc2ltaWxhciBzdHJpbmcgdGhhdCBnaXZlcwogICAgICB0aGUgcGFpcnMgb2YgY2hhcmFjdGVycyB0aGF0LCB3aGVuIGVudGVyIGlzIHByZXNzZWQgYmV0d2VlbgogICAgICB0aGVtLCBzaG91bGQgaGF2ZSB0aGUgc2Vjb25kIGNoYXJhY3RlciBhbHNvIG1vdmVkIHRvIGl0cyBvd24KICAgICAgbGluZS4gPGEgaHJlZj0iLi4vZGVtby9jbG9zZWJyYWNrZXRzLmh0bWwiPkRlbW8gaGVyZTwvYT4uPC9kZD4KCiAgICAgIDxkdCBpZD0iYWRkb25fbWF0Y2h0YWdzIj48YSBocmVmPSIuLi9hZGRvbi9lZGl0L21hdGNodGFncy5qcyI+PGNvZGU+ZWRpdC9tYXRjaHRhZ3MuanM8L2NvZGU+PC9hPjwvZHQ+CiAgICAgIDxkZD5EZWZpbmVzIGFuIG9wdGlvbiA8Y29kZT5tYXRjaFRhZ3M8L2NvZGU+IHRoYXQsIHdoZW4gZW5hYmxlZCwKICAgICAgd2lsbCBjYXVzZSB0aGUgdGFncyBhcm91bmQgdGhlIGN1cnNvciB0byBiZSBoaWdobGlnaHRlZCAodXNpbmcKICAgICAgdGhlIDxjb2RlPkNvZGVNaXJyb3ItbWF0Y2hpbmd0YWc8L2NvZGU+IGNsYXNzKS4gQWxzbwogICAgICBkZWZpbmVzCiAgICAgIGEgPGEgaHJlZj0iI2NvbW1hbmRzIj5jb21tYW5kPC9hPiA8Y29kZT50b01hdGNoaW5nVGFnPC9jb2RlPiwKICAgICAgd2hpY2ggeW91IGNhbiBiaW5kIGEga2V5IHRvIGluIG9yZGVyIHRvIGp1bXAgdG8gdGhlIHRhZyBtYXRoaW5nCiAgICAgIHRoZSBvbmUgdW5kZXIgdGhlIGN1cnNvci4gRGVwZW5kcyBvbgogICAgICB0aGUgPGNvZGU+YWRkb24vZm9sZC94bWwtZm9sZC5qczwvY29kZT4KICAgICAgYWRkb24uIDxhIGhyZWY9Ii4uL2RlbW8vbWF0Y2h0YWdzLmh0bWwiPkRlbW8gaGVyZS48L2E+PC9kZD4KCiAgICAgIDxkdCBpZD0iYWRkb25fdHJhaWxpbmdzcGFjZSI+PGEgaHJlZj0iLi4vYWRkb24vZWRpdC90cmFpbGluZ3NwYWNlLmpzIj48Y29kZT5lZGl0L3RyYWlsaW5nc3BhY2UuanM8L2NvZGU+PC9hPjwvZHQ+CiAgICAgIDxkZD5BZGRzIGFuIG9wdGlvbiA8Y29kZT5zaG93VHJhaWxpbmdTcGFjZTwvY29kZT4gd2hpY2gsIHdoZW4KICAgICAgZW5hYmxlZCwgYWRkcyB0aGUgQ1NTIGNsYXNzIDxjb2RlPmNtLXRyYWlsaW5nc3BhY2U8L2NvZGU+IHRvCiAgICAgIHN0cmV0Y2hlcyBvZiB3aGl0ZXNwYWNlIGF0IHRoZSBlbmQgb2YgbGluZXMuCiAgICAgIFRoZSA8YSBocmVmPSIuLi9kZW1vL3RyYWlsaW5nc3BhY2UuaHRtbCI+ZGVtbzwvYT4gaGFzIGEgbmljZQogICAgICBzcXVpZ2dseSB1bmRlcmxpbmUgc3R5bGUgZm9yIHRoaXMgY2xhc3MuPC9kZD4KCiAgICAgIDxkdCBpZD0iYWRkb25fY2xvc2V0YWciPjxhIGhyZWY9Ii4uL2FkZG9uL2VkaXQvY2xvc2V0YWcuanMiPjxjb2RlPmVkaXQvY2xvc2V0YWcuanM8L2NvZGU+PC9hPjwvZHQ+CiAgICAgIDxkZD5Qcm92aWRlcyB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgYWRkaW5nIGF1dG9tYXRpYyB0YWcgY2xvc2luZwogICAgICB0byBYTUwgbW9kZXMuIFNlZQogICAgICB0aGUgPGEgaHJlZj0iLi4vZGVtby9jbG9zZXRhZy5odG1sIj5kZW1vPC9hPi48L2RkPgoKICAgICAgPGR0IGlkPSJhZGRvbl9jb250aW51ZWxpc3QiPjxhIGhyZWY9Ii4uL2FkZG9uL2VkaXQvY29udGludWVsaXN0LmpzIj48Y29kZT5lZGl0L2NvbnRpbnVlbGlzdC5qczwvY29kZT48L2E+PC9kdD4KICAgICAgPGRkPk1hcmtkb3duIHNwZWNpZmljLiBEZWZpbmVzCiAgICAgIGEgPGNvZGU+Im5ld2xpbmVBbmRJbmRlbnRDb250aW51ZU1hcmtkb3duTGlzdCI8L2NvZGU+IDxhIGhyZWY9IiNjb21tYW5kcyI+Y29tbWFuZDwvYT4KICAgICAgY29tbWFuZCB0aGF0IGNhbiBiZSBib3VuZCB0byA8Y29kZT5lbnRlcjwvY29kZT4gdG8gYXV0b21hdGljYWxseQogICAgICBpbnNlcnQgdGhlIGxlYWRpbmcgY2hhcmFjdGVycyBmb3IgY29udGludWluZyBhIGxpc3QuIFNlZQogICAgICB0aGUgPGEgaHJlZj0iLi4vbW9kZS9tYXJrZG93bi9pbmRleC5odG1sIj5NYXJrZG93biBtb2RlCiAgICAgIGRlbW88L2E+LjwvZGQ+CgogICAgICA8ZHQgaWQ9ImFkZG9uX2NvbW1lbnQiPjxhIGhyZWY9Ii4uL2FkZG9uL2NvbW1lbnQvY29tbWVudC5qcyI+PGNvZGU+Y29tbWVudC9jb21tZW50LmpzPC9jb2RlPjwvYT48L2R0PgogICAgICA8ZGQ+QWRkb24gZm9yIGNvbW1lbnRpbmcgYW5kIHVuY29tbWVudGluZyBjb2RlLiBBZGRzIHRocmVlCiAgICAgIG1ldGhvZHMgdG8gQ29kZU1pcnJvciBpbnN0YW5jZXM6CiAgICAgIDxkbD4KICAgICAgICA8ZHQgaWQ9ImxpbmVDb21tZW50Ij48Y29kZT48c3Ryb25nPmxpbmVDb21tZW50PC9zdHJvbmc+KGZyb206IHtsaW5lLCBjaH0sIHRvOiB7bGluZSwgY2h9LCA/b3B0aW9uczogb2JqZWN0KTwvY29kZT48L2R0PgogICAgICAgIDxkZD5TZXQgdGhlIGxpbmVzIGluIHRoZSBnaXZlbiByYW5nZSB0byBiZSBsaW5lIGNvbW1lbnRzLiBXaWxsCiAgICAgICAgZmFsbCBiYWNrIHRvIDxjb2RlPmJsb2NrQ29tbWVudDwvY29kZT4gd2hlbiBubyBsaW5lIGNvbW1lbnQKICAgICAgICBzdHlsZSBpcyBkZWZpbmVkIGZvciB0aGUgbW9kZS48L2RkPgogICAgICAgIDxkdCBpZD0iYmxvY2tDb21tZW50Ij48Y29kZT48c3Ryb25nPmJsb2NrQ29tbWVudDwvc3Ryb25nPihmcm9tOiB7bGluZSwgY2h9LCB0bzoge2xpbmUsIGNofSwgP29wdGlvbnM6IG9iamVjdCk8L2NvZGU+PC9kdD4KICAgICAgICA8ZGQ+V3JhcCB0aGUgY29kZSBpbiB0aGUgZ2l2ZW4gcmFuZ2UgaW4gYSBibG9jayBjb21tZW50LiBXaWxsCiAgICAgICAgZmFsbCBiYWNrIHRvIDxjb2RlPmxpbmVDb21tZW50PC9jb2RlPiB3aGVuIG5vIGJsb2NrIGNvbW1lbnQKICAgICAgICBzdHlsZSBpcyBkZWZpbmVkIGZvciB0aGUgbW9kZS48L2RkPgogICAgICAgIDxkdCBpZD0idW5jb21tZW50Ij48Y29kZT48c3Ryb25nPnVuY29tbWVudDwvc3Ryb25nPihmcm9tOiB7bGluZSwgY2h9LCB0bzoge2xpbmUsIGNofSwgP29wdGlvbnM6IG9iamVjdCkg4oaSIGJvb2xlYW48L2NvZGU+PC9kdD4KICAgICAgICA8ZGQ+VHJ5IHRvIHVuY29tbWVudCB0aGUgZ2l2ZW4gcmFuZ2UuCiAgICAgICAgICBSZXR1cm5zIDxjb2RlPnRydWU8L2NvZGU+IGlmIGEgY29tbWVudCByYW5nZSB3YXMgZm91bmQgYW5kCiAgICAgICAgICByZW1vdmVkLCA8Y29kZT5mYWxzZTwvY29kZT4gb3RoZXJ3aXNlLjwvZGQ+CiAgICAgIDwvZGw+CiAgICAgIFRoZSA8Y29kZT5vcHRpb25zPC9jb2RlPiBvYmplY3QgYWNjZXB0ZWQgYnkgdGhlc2UgbWV0aG9kcyBtYXkKICAgICAgaGF2ZSB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6CiAgICAgIDxkbD4KICAgICAgICA8ZHQ+PGNvZGU+YmxvY2tDb21tZW50U3RhcnQsIGJsb2NrQ29tbWVudEVuZCwgYmxvY2tDb21tZW50TGVhZCwgbGluZUNvbW1lbnQ6IHN0cmluZzwvY29kZT48L2R0PgogICAgICAgIDxkZD5PdmVycmlkZSB0aGUgPGEgaHJlZj0iI21vZGVfY29tbWVudCI+Y29tbWVudCBzdHJpbmcKICAgICAgICBwcm9wZXJ0aWVzPC9hPiBvZiB0aGUgbW9kZSB3aXRoIGN1c3RvbSBjb21tZW50IHN0cmluZ3MuPC9kZD4KICAgICAgICA8ZHQ+PGNvZGU+PHN0cm9uZz5wYWRkaW5nPC9zdHJvbmc+OiBzdHJpbmc8L2NvZGU+PC9kdD4KICAgICAgICA8ZGQ+QSBzdHJpbmcgdGhhdCB3aWxsIGJlIGluc2VydGVkIGFmdGVyIG9wZW5pbmcgYW5kIGxlYWRpbmcKICAgICAgICBtYXJrZXJzLCBhbmQgYmVmb3JlIGNsb3NpbmcgY29tbWVudCBtYXJrZXJzLiBEZWZhdWx0cyB0byBhCiAgICAgICAgc2luZ2xlIHNwYWNlLjwvZGQ+CiAgICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+Y29tbWVudEJsYW5rTGluZXM8L3N0cm9uZz46IGJvb2xlYW48L2NvZGU+PC9kdD4KICAgICAgICA8ZGQ+V2hldGhlciwgd2hlbiBhZGRpbmcgbGluZSBjb21tZW50cywgdG8gYWxzbyBjb21tZW50IGxpbmVzCiAgICAgICAgdGhhdCBjb250YWluIG9ubHkgd2hpdGVzcGFjZS48L2RkPgogICAgICAgIDxkdD48Y29kZT48c3Ryb25nPmluZGVudDwvc3Ryb25nPjogYm9vbGVhbjwvY29kZT48L2R0PgogICAgICAgIDxkZD5XaGVuIGFkZGluZyBsaW5lIGNvbW1lbnRzIGFuZCB0aGlzIGlzIHR1cm5lZCBvbiwgaXQgd2lsbAogICAgICAgIGFsaWduIHRoZSBjb21tZW50IGJsb2NrIHRvIHRoZSBjdXJyZW50IGluZGVudGF0aW9uIG9mIHRoZQogICAgICAgIGZpcnN0IGxpbmUgb2YgdGhlIGJsb2NrLjwvZGQ+CiAgICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+ZnVsbExpbmVzPC9zdHJvbmc+OiBib29sZWFuPC9jb2RlPjwvZHQ+CiAgICAgICAgPGRkPldoZW4gYmxvY2sgY29tbWVudGluZywgdGhpcyBjb250cm9scyB3aGV0aGVyIHRoZSB3aG9sZQogICAgICAgIGxpbmVzIGFyZSBpbmRlbnRlZCwgb3Igb25seSB0aGUgcHJlY2lzZSByYW5nZSB0aGF0IGlzIGdpdmVuLgogICAgICAgIERlZmF1bHRzIHRvIDxjb2RlPnRydWU8L2NvZGU+LjwvZGQ+CiAgICAgIDwvZGw+CiAgICAgIFRoZSBhZGRvbiBhbHNvIGRlZmluZXMKICAgICAgYSA8Y29kZT50b2dnbGVDb21tZW50PC9jb2RlPiA8YSBocmVmPSIjY29tbWFuZHMiPmNvbW1hbmQ8L2E+LAogICAgICB3aGljaCB3aWxsIHRyeSB0byB1bmNvbW1lbnQgdGhlIGN1cnJlbnQgc2VsZWN0aW9uLCBhbmQgaWYgdGhhdAogICAgICBmYWlscywgbGluZS1jb21tZW50cyBpdC48L2RkPgoKICAgICAgPGR0IGlkPSJhZGRvbl9mb2xkY29kZSI+PGEgaHJlZj0iLi4vYWRkb24vZm9sZC9mb2xkY29kZS5qcyI+PGNvZGU+Zm9sZC9mb2xkY29kZS5qczwvY29kZT48L2E+PC9kdD4KICAgICAgPGRkPkhlbHBzIHdpdGggY29kZSBmb2xkaW5nLiBBZGRzIGEgPGNvZGU+Zm9sZENvZGU8L2NvZGU+IG1ldGhvZAogICAgICB0byBlZGl0b3IgaW5zdGFuY2VzLCB3aGljaCB3aWxsIHRyeSB0byBkbyBhIGNvZGUgZm9sZCBzdGFydGluZwogICAgICBhdCB0aGUgZ2l2ZW4gbGluZSwgb3IgdW5mb2xkIHRoZSBmb2xkIHRoYXQgaXMgYWxyZWFkeSBwcmVzZW50LgogICAgICBUaGUgbWV0aG9kIHRha2VzIGFzIGZpcnN0IGFyZ3VtZW50IHRoZSBwb3NpdGlvbiB0aGF0IHNob3VsZCBiZQogICAgICBmb2xkZWQgKG1heSBiZSBhIGxpbmUgbnVtYmVyIG9yCiAgICAgIGEgPGEgaHJlZj0iI1BvcyI+PGNvZGU+UG9zPC9jb2RlPjwvYT4pLCBhbmQgYXMgc2Vjb25kIG9wdGlvbmFsCiAgICAgIGFyZ3VtZW50IGVpdGhlciBhIHJhbmdlLWZpbmRlciBmdW5jdGlvbiwgb3IgYW4gb3B0aW9ucyBvYmplY3QsCiAgICAgIHN1cHBvcnRpbmcgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgogICAgICA8ZGw+CiAgICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+cmFuZ2VGaW5kZXI8L3N0cm9uZz46IGZuKENvZGVNaXJyb3IsIFBvcyk8L2NvZGU+PC9kdD4KICAgICAgICA8ZGQgaWQ9ImhlbHBlcl9mb2xkX2F1dG8iPlRoZSBmdW5jdGlvbiB0aGF0IGlzIHVzZWQgdG8gZmluZAogICAgICAgIGZvbGRhYmxlIHJhbmdlcy4gSWYgdGhpcyBpcyBub3QgZGlyZWN0bHkgcGFzc2VkLCBpdCB3aWxsCiAgICAgICAgZGVmYXVsdCB0byA8Y29kZT5Db2RlTWlycm9yLmZvbGQuYXV0bzwvY29kZT4sIHdoaWNoCiAgICAgICAgdXNlcyA8YSBocmVmPSIjZ2V0SGVscGVycyI+PGNvZGU+Z2V0SGVscGVyczwvY29kZT48L2E+IHdpdGgKICAgICAgICBhIDxjb2RlPiJmb2xkIjwvY29kZT4gdHlwZSB0byBmaW5kIGZvbGRpbmcgZnVuY3Rpb25zCiAgICAgICAgYXBwcm9wcmlhdGUgZm9yIHRoZSBsb2NhbCBtb2RlLiBUaGVyZSBhcmUgZmlsZXMgaW4KICAgICAgICB0aGUgPGEgaHJlZj0iLi4vYWRkb24vZm9sZC8iPjxjb2RlPmFkZG9uL2ZvbGQvPC9jb2RlPjwvYT4KICAgICAgICBkaXJlY3RvcnkgcHJvdmlkaW5nIDxjb2RlPkNvZGVNaXJyb3IuZm9sZC5icmFjZTwvY29kZT4sIHdoaWNoCiAgICAgICAgZmluZHMgYmxvY2tzIGluIGJyYWNlIGxhbmd1YWdlcyAoSmF2YVNjcmlwdCwgQywgSmF2YSwKICAgICAgICBldGMpLCA8Y29kZT5Db2RlTWlycm9yLmZvbGQuaW5kZW50PC9jb2RlPiwgZm9yIGxhbmd1YWdlcyB3aGVyZQogICAgICAgIGluZGVudGF0aW9uIGRldGVybWluZXMgYmxvY2sgc3RydWN0dXJlIChQeXRob24sIEhhc2tlbGwpLAogICAgICAgIGFuZCA8Y29kZT5Db2RlTWlycm9yLmZvbGQueG1sPC9jb2RlPiwgZm9yIFhNTC1zdHlsZSBsYW5ndWFnZXMsCiAgICAgICAgYW5kIDxjb2RlPkNvZGVNaXJyb3IuZm9sZC5jb21tZW50PC9jb2RlPiwgZm9yIGZvbGRpbmcgY29tbWVudAogICAgICAgIGJsb2Nrcy48L2RkPgogICAgICAgIDxkdD48Y29kZT48c3Ryb25nPndpZGdldDwvc3Ryb25nPjogc3RyaW5nfEVsZW1lbnQ8L2NvZGU+PC9kdD4KICAgICAgICA8ZGQ+VGhlIHdpZGdldCB0byBzaG93IGZvciBmb2xkZWQgcmFuZ2VzLiBDYW4gYmUgZWl0aGVyIGEKICAgICAgICBzdHJpbmcsIGluIHdoaWNoIGNhc2UgaXQnbGwgYmVjb21lIGEgc3BhbiB3aXRoCiAgICAgICAgY2xhc3MgPGNvZGU+Q29kZU1pcnJvci1mb2xkbWFya2VyPC9jb2RlPiwgb3IgYSBET00gbm9kZS48L2RkPgogICAgICAgIDxkdD48Y29kZT48c3Ryb25nPnNjYW5VcDwvc3Ryb25nPjogYm9vbGVhbjwvY29kZT48L2R0PgogICAgICAgIDxkZD5XaGVuIHRydWUgKGRlZmF1bHQgaXMgZmFsc2UpLCB0aGUgYWRkb24gd2lsbCB0cnkgdG8gZmluZAogICAgICAgIGZvbGRhYmxlIHJhbmdlcyBvbiB0aGUgbGluZXMgYWJvdmUgdGhlIGN1cnJlbnQgb25lIGlmIHRoZXJlCiAgICAgICAgaXNuJ3QgYW4gZWxpZ2libGUgb25lIG9uIHRoZSBnaXZlbiBsaW5lLjwvZGQ+CiAgICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+bWluRm9sZFNpemU8L3N0cm9uZz46IGludGVnZXI8L2NvZGU+PC9kdD4KICAgICAgICA8ZGQ+VGhlIG1pbmltdW0gYW1vdW50IG9mIGxpbmVzIHRoYXQgYSBmb2xkIHNob3VsZCBzcGFuIHRvIGJlCiAgICAgICAgYWNjZXB0ZWQuIERlZmF1bHRzIHRvIDAsIHdoaWNoIGFsc28gYWxsb3dzIHNpbmdsZS1saW5lCiAgICAgICAgZm9sZHMuPC9kZD4KICAgICAgPC9kbD4KICAgICAgU2VlIDxhIGhyZWY9Ii4uL2RlbW8vZm9sZGluZy5odG1sIj50aGUgZGVtbzwvYT4gZm9yIGFuCiAgICAgIGV4YW1wbGUuPC9kZD4KCiAgICAgIDxkdCBpZD0iYWRkb25fZm9sZGd1dHRlciI+PGEgaHJlZj0iLi4vYWRkb24vZm9sZC9mb2xkZ3V0dGVyLmpzIj48Y29kZT5mb2xkL2ZvbGRndXR0ZXIuanM8L2NvZGU+PC9hPjwvZHQ+CiAgICAgIDxkZD5Qcm92aWRlcyBhbiBvcHRpb24gPGNvZGU+Zm9sZEd1dHRlcjwvY29kZT4sIHdoaWNoIGNhbiBiZQogICAgICB1c2VkIHRvIGNyZWF0ZSBhIGd1dHRlciB3aXRoIG1hcmtlcnMgaW5kaWNhdGluZyB0aGUgYmxvY2tzIHRoYXQKICAgICAgY2FuIGJlIGZvbGRlZC4gQ3JlYXRlIGEgZ3V0dGVyIHVzaW5nCiAgICAgIHRoZSA8YSBocmVmPSIjb3B0aW9uX2d1dHRlcnMiPjxjb2RlPmd1dHRlcnM8L2NvZGU+PC9hPiBvcHRpb24sCiAgICAgIGdpdmluZyBpdCB0aGUgY2xhc3MgPGNvZGU+Q29kZU1pcnJvci1mb2xkZ3V0dGVyPC9jb2RlPiBvcgogICAgICBzb21ldGhpbmcgZWxzZSBpZiB5b3UgY29uZmlndXJlIHRoZSBhZGRvbiB0byB1c2UgYSBkaWZmZXJlbnQKICAgICAgY2xhc3MsIGFuZCB0aGlzIGFkZG9uIHdpbGwgc2hvdyBtYXJrZXJzIG5leHQgdG8gZm9sZGVkIGFuZAogICAgICBmb2xkYWJsZSBibG9ja3MsIGFuZCBoYW5kbGUgY2xpY2tzIGluIHRoaXMgZ3V0dGVyLiBOb3RlIHRoYXQKICAgICAgQ1NTIHN0eWxlcyBzaG91bGQgYmUgYXBwbGllZCB0byBtYWtlIHRoZSBndXR0ZXIsIGFuZCB0aGUgZm9sZAogICAgICBtYXJrZXJzIHdpdGhpbiBpdCwgdmlzaWJsZS4gQSBkZWZhdWx0IHNldCBvZiBDU1Mgc3R5bGVzIGFyZQogICAgICBhdmFpbGFibGUgaW46CiAgICAgIDxhIGhyZWY9Ii4uL2FkZG9uL2ZvbGQvZm9sZGd1dHRlci5jc3MiPgogICAgICAgIDxjb2RlPmFkZG9uL2ZvbGQvZm9sZGd1dHRlci5jc3M8L2NvZGU+CiAgICAgIDwvYT4uCiAgICAgIFRoZSBvcHRpb24KICAgICAgY2FuIGJlIGVpdGhlciBzZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4sIG9yIGFuIG9iamVjdCBjb250YWluaW5nCiAgICAgIHRoZSBmb2xsb3dpbmcgb3B0aW9uYWwgb3B0aW9uIGZpZWxkczoKICAgICAgPGRsPgogICAgICAgIDxkdD48Y29kZT48c3Ryb25nPmd1dHRlcjwvc3Ryb25nPjogc3RyaW5nPC9jb2RlPjwvZHQ+CiAgICAgICAgPGRkPlRoZSBDU1MgY2xhc3Mgb2YgdGhlIGd1dHRlci4gRGVmYXVsdHMKICAgICAgICB0byA8Y29kZT4iQ29kZU1pcnJvci1mb2xkZ3V0dGVyIjwvY29kZT4uIFlvdSB3aWxsIGhhdmUgdG8KICAgICAgICBzdHlsZSB0aGlzIHlvdXJzZWxmIHRvIGdpdmUgaXQgYSB3aWR0aCAoYW5kIHBvc3NpYmx5IGEKICAgICAgICBiYWNrZ3JvdW5kKS4gU2VlIHRoZSBkZWZhdWx0IGd1dHRlciBzdHlsZSBydWxlcyBhYm92ZS48L2RkPgogICAgICAgIDxkdD48Y29kZT48c3Ryb25nPmluZGljYXRvck9wZW48L3N0cm9uZz46IHN0cmluZyB8IEVsZW1lbnQ8L2NvZGU+PC9kdD4KICAgICAgICA8ZGQ+QSBDU1MgY2xhc3Mgb3IgRE9NIGVsZW1lbnQgdG8gYmUgdXNlZCBhcyB0aGUgbWFya2VyIGZvcgogICAgICAgIG9wZW4sIGZvbGRhYmxlIGJsb2Nrcy4gRGVmYXVsdHMKICAgICAgICB0byA8Y29kZT4iQ29kZU1pcnJvci1mb2xkZ3V0dGVyLW9wZW4iPC9jb2RlPi48L2RkPgogICAgICAgIDxkdD48Y29kZT48c3Ryb25nPmluZGljYXRvckZvbGRlZDwvc3Ryb25nPjogc3RyaW5nIHwgRWxlbWVudDwvY29kZT48L2R0PgogICAgICAgIDxkZD5BIENTUyBjbGFzcyBvciBET00gZWxlbWVudCB0byBiZSB1c2VkIGFzIHRoZSBtYXJrZXIgZm9yCiAgICAgICAgZm9sZGVkIGJsb2Nrcy4gRGVmYXVsdHMgdG8gPGNvZGU+IkNvZGVNaXJyb3ItZm9sZGd1dHRlci1mb2xkZWQiPC9jb2RlPi48L2RkPgogICAgICAgIDxkdD48Y29kZT48c3Ryb25nPnJhbmdlRmluZGVyPC9zdHJvbmc+OiBmbihDb2RlTWlycm9yLCBQb3MpPC9jb2RlPjwvZHQ+CiAgICAgICAgPGRkPlRoZSByYW5nZS1maW5kZXIgZnVuY3Rpb24gdG8gdXNlIHdoZW4gZGV0ZXJtaW5pbmcgd2hldGhlcgogICAgICAgIHNvbWV0aGluZyBjYW4gYmUgZm9sZGVkLiBXaGVuIG5vdAogICAgICAgIGdpdmVuLCA8YSBocmVmPSIjaGVscGVyX2ZvbGRfYXV0byI+PGNvZGU+Q29kZU1pcnJvci5mb2xkLmF1dG88L2NvZGU+PC9hPgogICAgICAgIHdpbGwgYmUgdXNlZCBhcyBkZWZhdWx0LjwvZGQ+CiAgICAgIDwvZGw+CiAgICAgIFRoZSA8Y29kZT5mb2xkT3B0aW9uczwvY29kZT4gZWRpdG9yIG9wdGlvbiBjYW4gYmUgc2V0IHRvIGFuCiAgICAgIG9iamVjdCB0byBwcm92aWRlIGFuIGVkaXRvci13aWRlIGRlZmF1bHQgY29uZmlndXJhdGlvbi4KICAgICAgRGVtbyA8YSBocmVmPSIuLi9kZW1vL2ZvbGRpbmcuaHRtbCI+aGVyZTwvYT4uPC9kZD4KCiAgICAgIDxkdCBpZD0iYWRkb25fcnVubW9kZSI+PGEgaHJlZj0iLi4vYWRkb24vcnVubW9kZS9ydW5tb2RlLmpzIj48Y29kZT5ydW5tb2RlL3J1bm1vZGUuanM8L2NvZGU+PC9hPjwvZHQ+CiAgICAgIDxkZD5DYW4gYmUgdXNlZCB0byBydW4gYSBDb2RlTWlycm9yIG1vZGUgb3ZlciB0ZXh0IHdpdGhvdXQKICAgICAgYWN0dWFsbHkgb3BlbmluZyBhbiBlZGl0b3IgaW5zdGFuY2UuCiAgICAgIFNlZSA8YSBocmVmPSIuLi9kZW1vL3J1bm1vZGUuaHRtbCI+dGhlIGRlbW88L2E+IGZvciBhbiBleGFtcGxlLgogICAgICBUaGVyZSBhcmUgYWx0ZXJuYXRlIHZlcnNpb25zIG9mIHRoZSBmaWxlIGF2YWlibGUgZm9yCiAgICAgIHJ1bm5pbmcgPGEgaHJlZj0iLi4vYWRkb24vcnVubW9kZS9ydW5tb2RlLXN0YW5kYWxvbmUuanMiPnN0YW5kLWFsb25lPC9hPgogICAgICAod2l0aG91dCBpbmNsdWRpbmcgYWxsIG9mIENvZGVNaXJyb3IpIGFuZAogICAgICBmb3IgPGEgaHJlZj0iLi4vYWRkb24vcnVubW9kZS9ydW5tb2RlLm5vZGUuanMiPnJ1bm5pbmcgdW5kZXIKICAgICAgbm9kZS5qczwvYT4uPC9kZD4KCiAgICAgIDxkdCBpZD0iYWRkb25fY29sb3JpemUiPjxhIGhyZWY9Ii4uL2FkZG9uL3J1bm1vZGUvY29sb3JpemUuanMiPjxjb2RlPnJ1bm1vZGUvY29sb3JpemUuanM8L2NvZGU+PC9hPjwvZHQ+CiAgICAgIDxkZD5Qcm92aWRlcyBhIGNvbnZlbmllbnQgd2F5IHRvIHN5bnRheC1oaWdobGlnaHQgY29kZSBzbmlwcGV0cwogICAgICBpbiBhIHdlYnBhZ2UuIERlcGVuZHMgb24KICAgICAgdGhlIDxhIGhyZWY9IiNhZGRvbl9ydW5tb2RlIj48Y29kZT5ydW5tb2RlPC9jb2RlPjwvYT4gYWRkb24gKG9yCiAgICAgIGl0cyBzdGFuZGFsb25lIHZhcmlhbnQpLiBQcm92aWRlcwogICAgICBhIDxjb2RlPkNvZGVNaXJyb3IuY29sb3JpemU8L2NvZGU+IGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGNhbGxlZAogICAgICB3aXRoIGFuIGFycmF5IChvciBvdGhlciBhcnJheS1pc2ggY29sbGVjdGlvbikgb2YgRE9NIG5vZGVzIHRoYXQKICAgICAgcmVwcmVzZW50IHRoZSBjb2RlIHNuaXBwZXRzLiBCeSBkZWZhdWx0LCBpdCdsbCBnZXQKICAgICAgYWxsIDxjb2RlPnByZTwvY29kZT4gdGFncy4gV2lsbCByZWFkIHRoZSA8Y29kZT5kYXRhLWxhbmc8L2NvZGU+CiAgICAgIGF0dHJpYnV0ZSBvZiB0aGVzZSBub2RlcyB0byBmaWd1cmUgb3V0IHRoZWlyIGxhbmd1YWdlLCBhbmQKICAgICAgc3ludGF4LWNvbG9yIHRoZWlyIGNvbnRlbnQgdXNpbmcgdGhlIHJlbGV2YW50IENvZGVNaXJyb3IgbW9kZQogICAgICAoeW91J2xsIGhhdmUgdG8gbG9hZCB0aGUgc2NyaXB0cyBmb3IgdGhlIHJlbGV2YW50IG1vZGVzCiAgICAgIHlvdXJzZWxmKS4gQSBzZWNvbmQgYXJndW1lbnQgbWF5IGJlIHByb3ZpZGVkIHRvIGdpdmUgYSBkZWZhdWx0CiAgICAgIG1vZGUsIHVzZWQgd2hlbiBubyBsYW5ndWFnZSBhdHRyaWJ1dGUgaXMgZm91bmQgZm9yIGEgbm9kZS4gVXNlZAogICAgICBpbiB0aGlzIG1hbnVhbCB0byBoaWdobGlnaHQgZXhhbXBsZSBjb2RlLjwvZGQ+CgogICAgICA8ZHQgaWQ9ImFkZG9uX292ZXJsYXkiPjxhIGhyZWY9Ii4uL2FkZG9uL21vZGUvb3ZlcmxheS5qcyI+PGNvZGU+bW9kZS9vdmVybGF5LmpzPC9jb2RlPjwvYT48L2R0PgogICAgICA8ZGQ+TW9kZSBjb21iaW5hdG9yIHRoYXQgY2FuIGJlIHVzZWQgdG8gZXh0ZW5kIGEgbW9kZSB3aXRoIGFuCiAgICAgICdvdmVybGF5JyDigJQgYSBzZWNvbmRhcnkgbW9kZSBpcyBydW4gb3ZlciB0aGUgc3RyZWFtLCBhbG9uZyB3aXRoCiAgICAgIHRoZSBiYXNlIG1vZGUsIGFuZCBjYW4gY29sb3Igc3BlY2lmaWMgcGllY2VzIG9mIHRleHQgd2l0aG91dAogICAgICBpbnRlcmZlcmluZyB3aXRoIHRoZSBiYXNlIG1vZGUuCiAgICAgIERlZmluZXMgPGNvZGU+Q29kZU1pcnJvci5vdmVybGF5TW9kZTwvY29kZT4sIHdoaWNoIGlzIHVzZWQgdG8KICAgICAgY3JlYXRlIHN1Y2ggYSBtb2RlLiBTZWUgPGEgaHJlZj0iLi4vZGVtby9tdXN0YWNoZS5odG1sIj50aGlzCiAgICAgIGRlbW88L2E+IGZvciBhIGRldGFpbGVkIGV4YW1wbGUuPC9kZD4KCiAgICAgIDxkdCBpZD0iYWRkb25fbXVsdGlwbGV4Ij48YSBocmVmPSIuLi9hZGRvbi9tb2RlL211bHRpcGxleC5qcyI+PGNvZGU+bW9kZS9tdWx0aXBsZXguanM8L2NvZGU+PC9hPjwvZHQ+CiAgICAgIDxkZD5Nb2RlIGNvbWJpbmF0b3IgdGhhdCBjYW4gYmUgdXNlZCB0byBlYXNpbHkgJ211bHRpcGxleCcKICAgICAgYmV0d2VlbiBzZXZlcmFsIG1vZGVzLgogICAgICBEZWZpbmVzIDxjb2RlPkNvZGVNaXJyb3IubXVsdGlwbGV4aW5nTW9kZTwvY29kZT4gd2hpY2gsIHdoZW4KICAgICAgZ2l2ZW4gYXMgZmlyc3QgYXJndW1lbnQgYSBtb2RlIG9iamVjdCwgYW5kIGFzIG90aGVyIGFyZ3VtZW50cwogICAgICBhbnkgbnVtYmVyIG9mIDxjb2RlPntvcGVuLCBjbG9zZSwgbW9kZSBbLCBkZWxpbVN0eWxlLCBpbm5lclN0eWxlXX08L2NvZGU+CiAgICAgIG9iamVjdHMsIHdpbGwgcmV0dXJuIGEgbW9kZSBvYmplY3QgdGhhdCBzdGFydHMgcGFyc2luZyB1c2luZyB0aGUKICAgICAgbW9kZSBwYXNzZWQgYXMgZmlyc3QgYXJndW1lbnQsIGJ1dCB3aWxsIHN3aXRjaCB0byBhbm90aGVyIG1vZGUKICAgICAgYXMgc29vbiBhcyBpdCBlbmNvdW50ZXJzIGEgc3RyaW5nIHRoYXQgb2NjdXJzIGluIG9uZSBvZgogICAgICB0aGUgPGNvZGU+b3BlbjwvY29kZT4gZmllbGRzIG9mIHRoZSBwYXNzZWQgb2JqZWN0cy4gV2hlbiBpbiBhCiAgICAgIHN1Yi1tb2RlLCBpdCB3aWxsIGdvIGJhY2sgdG8gdGhlIHRvcCBtb2RlIGFnYWluIHdoZW4KICAgICAgdGhlIDxjb2RlPmNsb3NlPC9jb2RlPiBzdHJpbmcgaXMgZW5jb3VudGVyZWQuCiAgICAgIFBhc3MgPGNvZGU+IlxuIjwvY29kZT4gZm9yIDxjb2RlPm9wZW48L2NvZGU+IG9yIDxjb2RlPmNsb3NlPC9jb2RlPgogICAgICBpZiB5b3Ugd2FudCB0byBzd2l0Y2ggb24gYSBibGFuayBsaW5lLgogICAgICA8dWw+PGxpPldoZW4gPGNvZGU+ZGVsaW1TdHlsZTwvY29kZT4gaXMgc3BlY2lmaWVkLCBpdCB3aWxsIGJlIHRoZSB0b2tlbgogICAgICBzdHlsZSByZXR1cm5lZCBmb3IgdGhlIGRlbGltaXRlciB0b2tlbnMuPC9saT4KICAgICAgPGxpPldoZW4gPGNvZGU+aW5uZXJTdHlsZTwvY29kZT4gaXMgc3BlY2lmaWVkLCBpdCB3aWxsIGJlIHRoZSB0b2tlbgogICAgICBzdHlsZSBhZGRlZCBmb3IgZWFjaCBpbm5lciBtb2RlIHRva2VuLjwvbGk+PC91bD4KICAgICAgVGhlIG91dGVyIG1vZGUgd2lsbCBub3Qgc2VlIHRoZSBjb250ZW50IGJldHdlZW4gdGhlIGRlbGltaXRlcnMuCiAgICAgIFNlZSA8YSBocmVmPSIuLi9kZW1vL211bHRpcGxleC5odG1sIj50aGlzIGRlbW88L2E+IGZvciBhbgogICAgICBleGFtcGxlLjwvZGQ+CgogICAgICA8ZHQgaWQ9ImFkZG9uX3Nob3ctaGludCI+PGEgaHJlZj0iLi4vYWRkb24vaGludC9zaG93LWhpbnQuanMiPjxjb2RlPmhpbnQvc2hvdy1oaW50LmpzPC9jb2RlPjwvYT48L2R0PgogICAgICA8ZGQ+UHJvdmlkZXMgYSBmcmFtZXdvcmsgZm9yIHNob3dpbmcgYXV0b2NvbXBsZXRpb24gaGludHMuCiAgICAgIERlZmluZXMgPGNvZGU+ZWRpdG9yLnNob3dIaW50PC9jb2RlPiwgd2hpY2ggdGFrZXMgYW4gb3B0aW9uYWwKICAgICAgb3B0aW9ucyBvYmplY3QsIGFuZCBwb3BzIHVwIGEgd2lkZ2V0IHRoYXQgYWxsb3dzIHRoZSB1c2VyIHRvCiAgICAgIHNlbGVjdCBhIGNvbXBsZXRpb24uIEZpbmRpbmcgaGludHMgaXMgZG9uZSB3aXRoIGEgaGludGluZwogICAgICBmdW5jdGlvbnMgKHRoZSA8Y29kZT5oaW50PC9jb2RlPiBvcHRpb24pLCB3aGljaCBpcyBhIGZ1bmN0aW9uCiAgICAgIHRoYXQgdGFrZSBhbiBlZGl0b3IgaW5zdGFuY2UgYW5kIG9wdGlvbnMgb2JqZWN0LCBhbmQgcmV0dXJuCiAgICAgIGEgPGNvZGU+e2xpc3QsIGZyb20sIHRvfTwvY29kZT4gb2JqZWN0LCB3aGVyZSA8Y29kZT5saXN0PC9jb2RlPgogICAgICBpcyBhbiBhcnJheSBvZiBzdHJpbmdzIG9yIG9iamVjdHMgKHRoZSBjb21wbGV0aW9ucyksCiAgICAgIGFuZCA8Y29kZT5mcm9tPC9jb2RlPiBhbmQgPGNvZGU+dG88L2NvZGU+IGdpdmUgdGhlIHN0YXJ0IGFuZCBlbmQKICAgICAgb2YgdGhlIHRva2VuIHRoYXQgaXMgYmVpbmcgY29tcGxldGVkIGFzIDxjb2RlPntsaW5lLCBjaH08L2NvZGU+CiAgICAgIG9iamVjdHMuPC9kZD4KICAgICAgPGRkPklmIG5vIGhpbnRpbmcgZnVuY3Rpb24gaXMgZ2l2ZW4sIHRoZSBhZGRvbiB3aWxsCiAgICAgIHVzZSA8Y29kZT5Db2RlTWlycm9yLmhpbnQuYXV0bzwvY29kZT4sIHdoaWNoCiAgICAgIGNhbGxzIDxhIGhyZWY9IiNnZXRIZWxwZXJzIj48Y29kZT5nZXRIZWxwZXJzPC9jb2RlPjwvYT4gd2l0aAogICAgICB0aGUgPGNvZGU+ImhpbnQiPC9jb2RlPiB0eXBlIHRvIGZpbmQgYXBwbGljYWJsZSBoaW50aW5nCiAgICAgIGZ1bmN0aW9ucywgYW5kIHRyaWVzIHRoZW0gb25lIGJ5IG9uZS4gSWYgdGhhdCBmYWlscywgaXQgbG9va3MKICAgICAgZm9yIGEgPGNvZGU+ImhpbnRXb3JkcyI8L2NvZGU+IGhlbHBlciB0byBmZXRjaCBhIGxpc3Qgb2YKICAgICAgY29tcGxldGFibGUgd29yZHMgZm9yIHRoZSBtb2RlLCBhbmQKICAgICAgdXNlcyA8Y29kZT5Db2RlTWlycm9yLmhpbnQuZnJvbUxpc3Q8L2NvZGU+IHRvIGNvbXBsZXRlIGZyb20KICAgICAgdGhvc2UuPC9kZD4KICAgICAgPGRkPldoZW4gY29tcGxldGlvbnMgYXJlbid0IHNpbXBsZSBzdHJpbmdzLCB0aGV5IHNob3VsZCBiZQogICAgICBvYmplY3RzIHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgogICAgICA8ZGw+CiAgICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+dGV4dDwvc3Ryb25nPjogc3RyaW5nPC9jb2RlPjwvZHQ+CiAgICAgICAgPGRkPlRoZSBjb21wbGV0aW9uIHRleHQuIFRoaXMgaXMgdGhlIG9ubHkgcmVxdWlyZWQKICAgICAgICBwcm9wZXJ0eS48L2RkPgogICAgICAgIDxkdD48Y29kZT48c3Ryb25nPmRpc3BsYXlUZXh0PC9zdHJvbmc+OiBzdHJpbmc8L2NvZGU+PC9kdD4KICAgICAgICA8ZGQ+VGhlIHRleHQgdGhhdCBzaG91bGQgYmUgZGlzcGxheWVkIGluIHRoZSBtZW51LjwvZGQ+CiAgICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+Y2xhc3NOYW1lPC9zdHJvbmc+OiBzdHJpbmc8L2NvZGU+PC9kdD4KICAgICAgICA8ZGQ+QSBDU1MgY2xhc3MgbmFtZSB0byBhcHBseSB0byB0aGUgY29tcGxldGlvbidzIGxpbmUgaW4gdGhlCiAgICAgICAgbWVudS48L2RkPgogICAgICAgIDxkdD48Y29kZT48c3Ryb25nPnJlbmRlcjwvc3Ryb25nPjogZm4oRWxlbWVudCwgc2VsZiwgZGF0YSk8L2NvZGU+PC9kdD4KICAgICAgICA8ZGQ+QSBtZXRob2QgdXNlZCB0byBjcmVhdGUgdGhlIERPTSBzdHJ1Y3R1cmUgZm9yIHNob3dpbmcgdGhlCiAgICAgICAgY29tcGxldGlvbiBieSBhcHBlbmRpbmcgaXQgdG8gaXRzIGZpcnN0IGFyZ3VtZW50LjwvZGQ+CiAgICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+aGludDwvc3Ryb25nPjogZm4oQ29kZU1pcnJvciwgc2VsZiwgZGF0YSk8L2NvZGU+PC9kdD4KICAgICAgICA8ZGQ+QSBtZXRob2QgdXNlZCB0byBhY3R1YWxseSBhcHBseSB0aGUgY29tcGxldGlvbiwgaW5zdGVhZCBvZgogICAgICAgIHRoZSBkZWZhdWx0IGJlaGF2aW9yLjwvZGQ+CiAgICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+ZnJvbTwvc3Ryb25nPjoge2xpbmUsIGNofTwvY29kZT48L2R0PgogICAgICAgIDxkZD5PcHRpb25hbCA8Y29kZT5mcm9tPC9jb2RlPiBwb3NpdGlvbiB0aGF0IHdpbGwgYmUgdXNlZCBieSA8Y29kZT5waWNrKCk8L2NvZGU+IGluc3RlYWQKICAgICAgICBvZiB0aGUgZ2xvYmFsIG9uZSBwYXNzZWQgd2l0aCB0aGUgZnVsbCBsaXN0IG9mIGNvbXBsZXRpb25zLjwvZGQ+CiAgICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+dG88L3N0cm9uZz46IHtsaW5lLCBjaH08L2NvZGU+PC9kdD4KICAgICAgICA8ZGQ+T3B0aW9uYWwgPGNvZGU+dG88L2NvZGU+IHBvc2l0aW9uIHRoYXQgd2lsbCBiZSB1c2VkIGJ5IDxjb2RlPnBpY2soKTwvY29kZT4gaW5zdGVhZAogICAgICAgIG9mIHRoZSBnbG9iYWwgb25lIHBhc3NlZCB3aXRoIHRoZSBmdWxsIGxpc3Qgb2YgY29tcGxldGlvbnMuPC9kZD4KICAgICAgPC9kbD4KICAgICAgVGhlIHBsdWdpbiB1bmRlcnN0YW5kcyB0aGUgZm9sbG93aW5nIG9wdGlvbnMgKHRoZSBvcHRpb25zIG9iamVjdAogICAgICB3aWxsIGFsc28gYmUgcGFzc2VkIGFsb25nIHRvIHRoZSBoaW50aW5nIGZ1bmN0aW9uLCB3aGljaCBtYXkKICAgICAgdW5kZXJzdGFuZCBhZGRpdGlvbmFsIG9wdGlvbnMpOgogICAgICA8ZGw+CiAgICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+aGludDwvc3Ryb25nPjogZnVuY3Rpb248L2NvZGU+PC9kdD4KICAgICAgICA8ZGQ+QSBoaW50aW5nIGZ1bmN0aW9uLCBhcyBzcGVjaWZpZWQgYWJvdmUuIEl0IGlzIHBvc3NpYmxlIHRvCiAgICAgICAgc2V0IHRoZSA8Y29kZT5hc3luYzwvY29kZT4gcHJvcGVydHkgb24gYSBoaW50aW5nIGZ1bmN0aW9uIHRvCiAgICAgICAgdHJ1ZSwgaW4gd2hpY2ggY2FzZSBpdCB3aWxsIGJlIGNhbGxlZCB3aXRoCiAgICAgICAgYXJndW1lbnRzIDxjb2RlPihjbSwgY2FsbGJhY2ssID9vcHRpb25zKTwvY29kZT4sIGFuZCB0aGUKICAgICAgICBjb21wbGV0aW9uIGludGVyZmFjZSB3aWxsIG9ubHkgYmUgcG9wcGVkIHVwIHdoZW4gdGhlIGhpbnRpbmcKICAgICAgICBmdW5jdGlvbiBjYWxscyB0aGUgY2FsbGJhY2ssIHBhc3NpbmcgaXQgdGhlIG9iamVjdCBob2xkaW5nIHRoZQogICAgICAgIGNvbXBsZXRpb25zLjwvZGQ+CiAgICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+Y29tcGxldGVTaW5nbGU8L3N0cm9uZz46IGJvb2xlYW48L2NvZGU+PC9kdD4KICAgICAgICA8ZGQ+RGV0ZXJtaW5lcyB3aGV0aGVyLCB3aGVuIG9ubHkgYSBzaW5nbGUgY29tcGxldGlvbiBpcwogICAgICAgIGF2YWlsYWJsZSwgaXQgaXMgY29tcGxldGVkIHdpdGhvdXQgc2hvd2luZyB0aGUgZGlhbG9nLgogICAgICAgIERlZmF1bHRzIHRvIHRydWUuPC9kZD4KICAgICAgICA8ZHQ+PGNvZGU+PHN0cm9uZz5hbGlnbldpdGhXb3JkPC9zdHJvbmc+OiBib29sZWFuPC9jb2RlPjwvZHQ+CiAgICAgICAgPGRkPldoZXRoZXIgdGhlIHBvcC11cCBzaG91bGQgYmUgaG9yaXpvbnRhbGx5IGFsaWduZWQgd2l0aCB0aGUKICAgICAgICBzdGFydCBvZiB0aGUgd29yZCAodHJ1ZSwgZGVmYXVsdCksIG9yIHdpdGggdGhlIGN1cnNvciAoZmFsc2UpLjwvZGQ+CiAgICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+Y2xvc2VPblVuZm9jdXM8L3N0cm9uZz46IGJvb2xlYW48L2NvZGU+PC9kdD4KICAgICAgICA8ZGQ+V2hlbiBlbmFibGVkICh3aGljaCBpcyB0aGUgZGVmYXVsdCksIHRoZSBwb3AtdXAgd2lsbCBjbG9zZQogICAgICAgIHdoZW4gdGhlIGVkaXRvciBpcyB1bmZvY3VzZWQuPC9kZD4KICAgICAgICA8ZHQ+PGNvZGU+PHN0cm9uZz5jdXN0b21LZXlzPC9zdHJvbmc+OiBrZXltYXA8L2NvZGU+PC9kdD4KICAgICAgICA8ZGQ+QWxsb3dzIHlvdSB0byBwcm92aWRlIGEgY3VzdG9tIGtleSBtYXAgb2Yga2V5cyB0byBiZSBhY3RpdmUKICAgICAgICB3aGVuIHRoZSBwb3AtdXAgaXMgYWN0aXZlLiBUaGUgaGFuZGxlcnMgd2lsbCBiZSBjYWxsZWQgd2l0aCBhbgogICAgICAgIGV4dHJhIGFyZ3VtZW50LCBhIGhhbmRsZSB0byB0aGUgY29tcGxldGlvbiBtZW51LCB3aGljaAogICAgICAgIGhhcyA8Y29kZT5tb3ZlRm9jdXMobik8L2NvZGU+LCA8Y29kZT5zZXRGb2N1cyhuKTwvY29kZT4sIDxjb2RlPnBpY2soKTwvY29kZT4sCiAgICAgICAgYW5kIDxjb2RlPmNsb3NlKCk8L2NvZGU+IG1ldGhvZHMgKHNlZSB0aGUgc291cmNlIGZvciBkZXRhaWxzKSwKICAgICAgICB0aGF0IGNhbiBiZSB1c2VkIHRvIGNoYW5nZSB0aGUgZm9jdXNlZCBlbGVtZW50LCBwaWNrIHRoZQogICAgICAgIGN1cnJlbnQgZWxlbWVudCBvciBjbG9zZSB0aGUgbWVudS4gQWRkaXRpb25uYWx5IDxjb2RlPm1lbnVTaXplKCk8L2NvZGU+CiAgICAgICAgY2FuIGdpdmUgeW91IGFjY2VzcyB0byB0aGUgc2l6ZSBvZiB0aGUgY3VycmVudCBkcm9wZG93biBtZW51LAogICAgICAgIDxjb2RlPmxlbmd0aDwvY29kZT4gZ2l2ZSB5b3UgdGhlIG51bWJlciBvZiBhdmFpbGxhYmxlIGNvbXBsZXRpb25zLCBhbmQKICAgICAgICA8Y29kZT5kYXRhPC9jb2RlPiBnaXZlIHlvdSBmdWxsIGFjY2VzcyB0byB0aGUgY29tcGxldGlvbiByZXR1cm5lZCBieSB0aGUKICAgICAgICBoaW50aW5nIGZ1bmN0aW9uLjwvZGQ+CiAgICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+ZXh0cmFLZXlzPC9zdHJvbmc+OiBrZXltYXA8L2NvZGU+PC9kdD4KICAgICAgICA8ZGQ+TGlrZSA8Y29kZT5jdXN0b21LZXlzPC9jb2RlPiBhYm92ZSwgYnV0IHRoZSBiaW5kaW5ncyB3aWxsCiAgICAgICAgYmUgYWRkZWQgdG8gdGhlIHNldCBvZiBkZWZhdWx0IGJpbmRpbmdzLCBpbnN0ZWFkIG9mIHJlcGxhY2luZwogICAgICAgIHRoZW0uPC9kZD4KICAgICAgPC9kbD4KICAgICAgVGhlIGZvbGxvd2luZyBldmVudHMgd2lsbCBiZSBmaXJlZCBvbiB0aGUgY29tcGxldGlvbnMgb2JqZWN0CiAgICAgIGR1cmluZyBjb21wbGV0aW9uOgogICAgICA8ZGw+CiAgICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+InNob3duIjwvc3Ryb25nPiAoKTwvY29kZT48L2R0PgogICAgICAgIDxkZD5GaXJlZCB3aGVuIHRoZSBwb3AtdXAgaXMgc2hvd24uPC9kZD4KICAgICAgICA8ZHQ+PGNvZGU+PHN0cm9uZz4ic2VsZWN0Ijwvc3Ryb25nPiAoY29tcGxldGlvbiwgRWxlbWVudCk8L2NvZGU+PC9kdD4KICAgICAgICA8ZGQ+RmlyZWQgd2hlbiBhIGNvbXBsZXRpb24gaXMgc2VsZWN0ZWQuIFBhc3NlZCB0aGUgY29tcGxldGlvbgogICAgICAgIHZhbHVlIChzdHJpbmcgb3Igb2JqZWN0KSBhbmQgdGhlIERPTSBub2RlIHRoYXQgcmVwcmVzZW50cyBpdAogICAgICAgIGluIHRoZSBtZW51LjwvZGQ+CiAgICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+InBpY2siPC9zdHJvbmc+IChjb21wbGV0aW9uKTwvY29kZT48L2R0PgogICAgICAgIDxkZD5GaXJlZCB3aGVuIGEgY29tcGxldGlvbiBpcyBwaWNrZWQuIFBhc3NlZCB0aGUgY29tcGxldGlvbiB2YWx1ZQogICAgICAgIChzdHJpbmcgb3Igb2JqZWN0KS48L2RkPgogICAgICAgIDxkdD48Y29kZT48c3Ryb25nPiJjbG9zZSI8L3N0cm9uZz4gKCk8L2NvZGU+PC9kdD4KICAgICAgICA8ZGQ+RmlyZWQgd2hlbiB0aGUgY29tcGxldGlvbiBpcyBmaW5pc2hlZC48L2RkPgogICAgICA8L2RsPgogICAgICBUaGlzIGFkZG9uIGRlcGVuZHMgb24gc3R5bGVzCiAgICAgIGZyb20gPGNvZGU+YWRkb24vaGludC9zaG93LWhpbnQuY3NzPC9jb2RlPi4gQ2hlY2sKICAgICAgb3V0IDxhIGhyZWY9Ii4uL2RlbW8vY29tcGxldGUuaHRtbCI+dGhlIGRlbW88L2E+IGZvciBhbgogICAgICBleGFtcGxlLjwvZGQ+CgogICAgICA8ZHQgaWQ9ImFkZG9uX2phdmFzY3JpcHQtaGludCI+PGEgaHJlZj0iLi4vYWRkb24vaGludC9qYXZhc2NyaXB0LWhpbnQuanMiPjxjb2RlPmhpbnQvamF2YXNjcmlwdC1oaW50LmpzPC9jb2RlPjwvYT48L2R0PgogICAgICA8ZGQ+RGVmaW5lcyBhIHNpbXBsZSBoaW50aW5nIGZ1bmN0aW9uIGZvciBKYXZhU2NyaXB0CiAgICAgICg8Y29kZT5Db2RlTWlycm9yLmhpbnQuamF2YXNjcmlwdDwvY29kZT4pIGFuZCBDb2ZmZWVTY3JpcHQKICAgICAgKDxjb2RlPkNvZGVNaXJyb3IuaGludC5jb2ZmZWVzY3JpcHQ8L2NvZGU+KSBjb2RlLiBUaGlzIHdpbGwKICAgICAgc2ltcGx5IHVzZSB0aGUgSmF2YVNjcmlwdCBlbnZpcm9ubWVudCB0aGF0IHRoZSBlZGl0b3IgcnVucyBpbiBhcwogICAgICBhIHNvdXJjZSBvZiBpbmZvcm1hdGlvbiBhYm91dCBvYmplY3RzIGFuZCB0aGVpciBwcm9wZXJ0aWVzLjwvZGQ+CgogICAgICA8ZHQgaWQ9ImFkZG9uX3htbC1oaW50Ij48YSBocmVmPSIuLi9hZGRvbi9oaW50L3htbC1oaW50LmpzIj48Y29kZT5oaW50L3htbC1oaW50LmpzPC9jb2RlPjwvYT48L2R0PgogICAgICA8ZGQ+RGVmaW5lcyA8Y29kZT5Db2RlTWlycm9yLmhpbnQueG1sPC9jb2RlPiwgd2hpY2ggcHJvZHVjZXMKICAgICAgaGludHMgZm9yIFhNTCB0YWduYW1lcywgYXR0cmlidXRlIG5hbWVzLCBhbmQgYXR0cmlidXRlIHZhbHVlcywKICAgICAgZ3VpZGVkIGJ5IGEgPGNvZGU+c2NoZW1hSW5mbzwvY29kZT4gb3B0aW9uIChhIHByb3BlcnR5IG9mIHRoZQogICAgICBzZWNvbmQgYXJndW1lbnQgcGFzc2VkIHRvIHRoZSBoaW50aW5nIGZ1bmN0aW9uLCBvciB0aGUgdGhpcmQKICAgICAgYXJndW1lbnQgcGFzc2VkIHRvIDxjb2RlPkNvZGVNaXJyb3Iuc2hvd0hpbnQ8L2NvZGU+KS48YnI+VGhlCiAgICAgIHNjaGVtYSBpbmZvIHNob3VsZCBiZSBhbiBvYmplY3QgbWFwcGluZyB0YWcgbmFtZXMgdG8gaW5mb3JtYXRpb24KICAgICAgYWJvdXQgdGhlc2UgdGFncywgd2l0aCBvcHRpb25hbGx5IGEgPGNvZGU+IiF0b3AiPC9jb2RlPiBwcm9wZXJ0eQogICAgICBjb250YWluaW5nIGEgbGlzdCBvZiB0aGUgbmFtZXMgb2YgdmFsaWQgdG9wLWxldmVsIHRhZ3MuIFRoZQogICAgICB2YWx1ZXMgb2YgdGhlIHByb3BlcnRpZXMgc2hvdWxkIGJlIG9iamVjdHMgd2l0aCBvcHRpb25hbAogICAgICBwcm9wZXJ0aWVzIDxjb2RlPmNoaWxkcmVuPC9jb2RlPiAoYW4gYXJyYXkgb2YgdmFsaWQgY2hpbGQKICAgICAgZWxlbWVudCBuYW1lcywgb21pdCB0byBzaW1wbHkgYWxsb3cgYWxsIHRhZ3MgdG8gYXBwZWFyKQogICAgICBhbmQgPGNvZGU+YXR0cnM8L2NvZGU+IChhbiBvYmplY3QgbWFwcGluZyBhdHRyaWJ1dGUgbmFtZXMKICAgICAgdG8gPGNvZGU+bnVsbDwvY29kZT4gZm9yIGZyZWUtZm9ybSBhdHRyaWJ1dGVzLCBhbmQgYW4gYXJyYXkgb2YKICAgICAgdmFsaWQgdmFsdWVzIGZvciByZXN0cmljdGVkCiAgICAgIGF0dHJpYnV0ZXMpLiA8YSBocmVmPSIuLi9kZW1vL3htbGNvbXBsZXRlLmh0bWwiPkRlbW8KICAgICAgaGVyZS48L2E+PC9kZD4KCiAgICAgIDxkdCBpZD0iYWRkb25faHRtbC1oaW50Ij48YSBocmVmPSIuLi9hZGRvbi9oaW50L2h0bWwtaGludC5qcyI+PGNvZGU+aGludC9odG1sLWhpbnQuanM8L2NvZGU+PC9hPjwvZHQ+CiAgICAgIDxkZD5Qcm92aWRlcyBzY2hlbWEgaW5mbyB0bwogICAgICB0aGUgPGEgaHJlZj0iI2FkZG9uX3htbC1oaW50Ij54bWwtaGludDwvYT4gYWRkb24gZm9yIEhUTUwKICAgICAgZG9jdW1lbnRzLiBEZWZpbmVzIGEgc2NoZW1hCiAgICAgIG9iamVjdCA8Y29kZT5Db2RlTWlycm9yLmh0bWxTY2hlbWE8L2NvZGU+IHRoYXQgeW91IGNhbiBwYXNzIHRvCiAgICAgIGFzIGEgPGNvZGU+c2NoZW1hSW5mbzwvY29kZT4gb3B0aW9uLCBhbmQKICAgICAgYSA8Y29kZT5Db2RlTWlycm9yLmhpbnQuaHRtbDwvY29kZT4gaGludGluZyBmdW5jdGlvbiB0aGF0CiAgICAgIGF1dG9tYXRpY2FsbHkgY2FsbHMgPGNvZGU+Q29kZU1pcnJvci5oaW50LnhtbDwvY29kZT4gd2l0aCB0aGlzCiAgICAgIHNjaGVtYSBkYXRhLiBTZWUKICAgICAgdGhlIDxhIGhyZWY9Ii4uL2RlbW8vaHRtbDVjb21wbGV0ZS5odG1sIj5kZW1vPC9hPi48L2RkPgoKICAgICAgPGR0IGlkPSJhZGRvbl9jc3MtaGludCI+PGEgaHJlZj0iLi4vYWRkb24vaGludC9jc3MtaGludC5qcyI+PGNvZGU+aGludC9jc3MtaGludC5qczwvY29kZT48L2E+PC9kdD4KICAgICAgPGRkPkEgaGludGluZyBmdW5jdGlvbiBmb3IgQ1NTLCBTQ1NTLCBvciBMRVNTIGNvZGUuCiAgICAgIERlZmluZXMgPGNvZGU+Q29kZU1pcnJvci5oaW50LmNzczwvY29kZT4uPC9kZD4KCiAgICAgIDxkdCBpZD0iYWRkb25fcHl0aG9uLWhpbnQiPjxhIGhyZWY9Ii4uL2FkZG9uL2hpbnQvcHl0aG9uLWhpbnQuanMiPjxjb2RlPmhpbnQvcHl0aG9uLWhpbnQuanM8L2NvZGU+PC9hPjwvZHQ+CiAgICAgIDxkZD5BIHZlcnkgc2ltcGxlIGhpbnRpbmcgZnVuY3Rpb24gZm9yIFB5dGhvbiBjb2RlLgogICAgICBEZWZpbmVzIDxjb2RlPkNvZGVNaXJyb3IuaGludC5weXRob248L2NvZGU+LjwvZGQ+CgogICAgICA8ZHQgaWQ9ImFkZG9uX2FueXdvcmQtaGludCI+PGEgaHJlZj0iLi4vYWRkb24vaGludC9hbnl3b3JkLWhpbnQuanMiPjxjb2RlPmhpbnQvYW55d29yZC1oaW50LmpzPC9jb2RlPjwvYT48L2R0PgogICAgICA8ZGQ+QSB2ZXJ5IHNpbXBsZSBoaW50aW5nIGZ1bmN0aW9uCiAgICAgICg8Y29kZT5Db2RlTWlycm9yLmhpbnQuYW55d29yZDwvY29kZT4pIHRoYXQgc2ltcGx5IGxvb2tzIGZvcgogICAgICB3b3JkcyBpbiB0aGUgbmVhcmJ5IGNvZGUgYW5kIGNvbXBsZXRlcyB0byB0aG9zZS4gVGFrZXMgdHdvCiAgICAgIG9wdGlvbmFsIG9wdGlvbnMsIDxjb2RlPndvcmQ8L2NvZGU+LCBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB0aGF0CiAgICAgIG1hdGNoZXMgd29yZHMgKHNlcXVlbmNlcyBvZiBvbmUgb3IgbW9yZSBjaGFyYWN0ZXIpLAogICAgICBhbmQgPGNvZGU+cmFuZ2U8L2NvZGU+LCB3aGljaCBkZWZpbmVzIGhvdyBtYW55IGxpbmVzIHRoZSBhZGRvbgogICAgICBzaG91bGQgc2NhbiB3aGVuIGNvbXBsZXRpbmcgKGRlZmF1bHRzIHRvIDUwMCkuPC9kZD4KCiAgICAgIDxkdCBpZD0iYWRkb25fc3FsLWhpbnQiPjxhIGhyZWY9Ii4uL2FkZG9uL2hpbnQvc3FsLWhpbnQuanMiPjxjb2RlPmhpbnQvc3FsLWhpbnQuanM8L2NvZGU+PC9hPjwvZHQ+CiAgICAgIDxkZD5BIHNpbXBsZSBTUUwgaGludGVyLiBEZWZpbmVzIDxjb2RlPkNvZGVNaXJyb3IuaGludC5zcWw8L2NvZGU+LjwvZGQ+CgogICAgICA8ZHQgaWQ9ImFkZG9uX21hdGNoLWhpZ2hsaWdodGVyIj48YSBocmVmPSIuLi9hZGRvbi9zZWFyY2gvbWF0Y2gtaGlnaGxpZ2h0ZXIuanMiPjxjb2RlPnNlYXJjaC9tYXRjaC1oaWdobGlnaHRlci5qczwvY29kZT48L2E+PC9kdD4KICAgICAgPGRkPkFkZHMgYSA8Y29kZT5oaWdobGlnaHRTZWxlY3Rpb25NYXRjaGVzPC9jb2RlPiBvcHRpb24gdGhhdAogICAgICBjYW4gYmUgZW5hYmxlZCB0byBoaWdobGlnaHQgYWxsIGluc3RhbmNlcyBvZiBhIGN1cnJlbnRseQogICAgICBzZWxlY3RlZCB3b3JkLiBDYW4gYmUgc2V0IGVpdGhlciB0byB0cnVlIG9yIHRvIGFuIG9iamVjdAogICAgICBjb250YWluaW5nIHRoZSBmb2xsb3dpbmcgb3B0aW9uczogPGNvZGU+bWluQ2hhcnM8L2NvZGU+LCBmb3IgdGhlCiAgICAgIG1pbmltdW0gYW1vdW50IG9mIHNlbGVjdGVkIGNoYXJhY3RlcnMgdGhhdCB0cmlnZ2VycyBhIGhpZ2hsaWdodAogICAgICAoZGVmYXVsdCAyKSwgPGNvZGU+c3R5bGU8L2NvZGU+LCBmb3IgdGhlIHN0eWxlIHRvIGJlIHVzZWQgdG8KICAgICAgaGlnaGxpZ2h0IHRoZSBtYXRjaGVzIChkZWZhdWx0IDxjb2RlPiJtYXRjaGhpZ2hsaWdodCI8L2NvZGU+LAogICAgICB3aGljaCB3aWxsIGNvcnJlc3BvbmQgdG8gQ1NTCiAgICAgIGNsYXNzIDxjb2RlPmNtLW1hdGNoaGlnaGxpZ2h0PC9jb2RlPiksCiAgICAgIGFuZCA8Y29kZT5zaG93VG9rZW48L2NvZGU+IHdoaWNoIGNhbiBiZSBzZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4KICAgICAgb3IgdG8gYSByZWdleHAgbWF0Y2hpbmcgdGhlIGNoYXJhY3RlcnMgdGhhdCBtYWtlIHVwIGEgd29yZC4gV2hlbgogICAgICBlbmFibGVkLCBpdCBjYXVzZXMgdGhlIGN1cnJlbnQgd29yZCB0byBiZSBoaWdobGlnaHRlZCB3aGVuCiAgICAgIG5vdGhpbmcgaXMgc2VsZWN0ZWQgKGRlZmF1bHRzIHRvIG9mZikuCiAgICAgIERlbW8gPGEgaHJlZj0iLi4vZGVtby9tYXRjaGhpZ2hsaWdodGVyLmh0bWwiPmhlcmU8L2E+LjwvZGQ+CgogICAgICA8ZHQgaWQ9ImFkZG9uX2xpbnQiPjxhIGhyZWY9Ii4uL2FkZG9uL2xpbnQvbGludC5qcyI+PGNvZGU+bGludC9saW50LmpzPC9jb2RlPjwvYT48L2R0PgogICAgICA8ZGQ+RGVmaW5lcyBhbiBpbnRlcmZhY2UgY29tcG9uZW50IGZvciBzaG93aW5nIGxpbnRpbmcgd2FybmluZ3MsCiAgICAgIHdpdGggcGx1Z2dhYmxlIHdhcm5pbmcgc291cmNlcwogICAgICAoc2VlIDxhIGhyZWY9Ii4uL2FkZG9uL2xpbnQvanNvbi1saW50LmpzIj48Y29kZT5qc29uLWxpbnQuanM8L2NvZGU+PC9hPiwKICAgICAgPGEgaHJlZj0iLi4vYWRkb24vbGludC9qYXZhc2NyaXB0LWxpbnQuanMiPjxjb2RlPmphdmFzY3JpcHQtbGludC5qczwvY29kZT48L2E+LAogICAgICBhbmQgPGEgaHJlZj0iLi4vYWRkb24vbGludC9jc3MtbGludC5qcyI+PGNvZGU+Y3NzLWxpbnQuanM8L2NvZGU+PC9hPgogICAgICBpbiB0aGUgc2FtZSBkaXJlY3RvcnkpLiBEZWZpbmVzIGEgPGNvZGU+bGludDwvY29kZT4gb3B0aW9uIHRoYXQKICAgICAgY2FuIGJlIHNldCB0byBhIHdhcm5pbmcgc291cmNlIChmb3IKICAgICAgZXhhbXBsZSA8Y29kZT5Db2RlTWlycm9yLmxpbnQuamF2YXNjcmlwdDwvY29kZT4pLCBvcgogICAgICB0byA8Y29kZT50cnVlPC9jb2RlPiwgaW4gd2hpY2gKICAgICAgY2FzZSA8YSBocmVmPSIjZ2V0SGVscGVyIj48Y29kZT5nZXRIZWxwZXI8L2NvZGU+PC9hPiB3aXRoCiAgICAgIHR5cGUgPGNvZGU+ImxpbnQiPC9jb2RlPiBpcyB1c2VkIHRvIGRldGVybWluZWQgYSB2YWxpZGF0b3IKICAgICAgZnVuY3Rpb24uIERlcGVuZHMgb24gPGNvZGU+YWRkb24vbGludC9saW50LmNzczwvY29kZT4uIEEgZGVtbwogICAgICBjYW4gYmUgZm91bmQgPGEgaHJlZj0iLi4vZGVtby9saW50Lmh0bWwiPmhlcmU8L2E+LjwvZGQ+CgogICAgICA8ZHQgaWQ9ImFkZG9uX21hcmstc2VsZWN0aW9uIj48YSBocmVmPSIuLi9hZGRvbi9zZWxlY3Rpb24vbWFyay1zZWxlY3Rpb24uanMiPjxjb2RlPnNlbGVjdGlvbi9tYXJrLXNlbGVjdGlvbi5qczwvY29kZT48L2E+PC9kdD4KICAgICAgPGRkPkNhdXNlcyB0aGUgc2VsZWN0ZWQgdGV4dCB0byBiZSBtYXJrZWQgd2l0aCB0aGUgQ1NTIGNsYXNzCiAgICAgIDxjb2RlPkNvZGVNaXJyb3Itc2VsZWN0ZWR0ZXh0PC9jb2RlPiB3aGVuIHRoZSA8Y29kZT5zdHlsZVNlbGVjdGVkVGV4dDwvY29kZT4gb3B0aW9uCiAgICAgIGlzIGVuYWJsZWQuIFVzZWZ1bCB0byBjaGFuZ2UgdGhlIGNvbG91ciBvZiB0aGUgc2VsZWN0aW9uIChpbiBhZGRpdGlvbiB0byB0aGUgYmFja2dyb3VuZCksCiAgICAgIGxpa2UgaW4gPGEgaHJlZj0iLi4vZGVtby9tYXJrc2VsZWN0aW9uLmh0bWwiPnRoaXMgZGVtbzwvYT4uPC9kZD4KCiAgICAgIDxkdCBpZD0iYWRkb25fYWN0aXZlLWxpbmUiPjxhIGhyZWY9Ii4uL2FkZG9uL3NlbGVjdGlvbi9hY3RpdmUtbGluZS5qcyI+PGNvZGU+c2VsZWN0aW9uL2FjdGl2ZS1saW5lLmpzPC9jb2RlPjwvYT48L2R0PgogICAgICA8ZGQ+RGVmaW5lcyBhIDxjb2RlPnN0eWxlQWN0aXZlTGluZTwvY29kZT4gb3B0aW9uIHRoYXQsIHdoZW4gZW5hYmxlZCwKICAgICAgZ2l2ZXMgdGhlIHdyYXBwZXIgb2YgdGhlIGFjdGl2ZSBsaW5lIHRoZSBjbGFzcyA8Y29kZT5Db2RlTWlycm9yLWFjdGl2ZWxpbmU8L2NvZGU+LAogICAgICBhbmQgYWRkcyBhIGJhY2tncm91bmQgd2l0aCB0aGUgY2xhc3MgPGNvZGU+Q29kZU1pcnJvci1hY3RpdmVsaW5lLWJhY2tncm91bmQ8L2NvZGU+LgogICAgICBpcyBlbmFibGVkLiBTZWUgdGhlIDxhIGhyZWY9Ii4uL2RlbW8vYWN0aXZlbGluZS5odG1sIj5kZW1vPC9hPi48L2RkPgoKICAgICAgPGR0IGlkPSJhZGRvbl9sb2FkbW9kZSI+PGEgaHJlZj0iLi4vYWRkb24vbW9kZS9sb2FkbW9kZS5qcyI+PGNvZGU+bW9kZS9sb2FkbW9kZS5qczwvY29kZT48L2E+PC9kdD4KICAgICAgPGRkPkRlZmluZXMgYSA8Y29kZT5Db2RlTWlycm9yLnJlcXVpcmVNb2RlKG1vZGVuYW1lLAogICAgICBjYWxsYmFjayk8L2NvZGU+IGZ1bmN0aW9uIHRoYXQgd2lsbCB0cnkgdG8gbG9hZCBhIGdpdmVuIG1vZGUgYW5kCiAgICAgIGNhbGwgdGhlIGNhbGxiYWNrIHdoZW4gaXQgc3VjY2VlZGVkLiBZb3UnbGwgaGF2ZSB0bwogICAgICBzZXQgPGNvZGU+Q29kZU1pcnJvci5tb2RlVVJMPC9jb2RlPiB0byBhIHN0cmluZyB0aGF0IG1vZGUgcGF0aHMKICAgICAgY2FuIGJlIGNvbnN0cnVjdGVkIGZyb20sIGZvcgogICAgICBleGFtcGxlIDxjb2RlPiJtb2RlLyVOLyVOLmpzIjwvY29kZT7igJR0aGUgPGNvZGU+JU48L2NvZGU+J3Mgd2lsbAogICAgICBiZSByZXBsYWNlZCB3aXRoIHRoZSBtb2RlIG5hbWUuIEFsc28KICAgICAgZGVmaW5lcyA8Y29kZT5Db2RlTWlycm9yLmF1dG9Mb2FkTW9kZShpbnN0YW5jZSwgbW9kZSk8L2NvZGU+LAogICAgICB3aGljaCB3aWxsIGVuc3VyZSB0aGUgZ2l2ZW4gbW9kZSBpcyBsb2FkZWQgYW5kIGNhdXNlIHRoZSBnaXZlbgogICAgICBlZGl0b3IgaW5zdGFuY2UgdG8gcmVmcmVzaCBpdHMgbW9kZSB3aGVuIHRoZSBsb2FkaW5nCiAgICAgIHN1Y2NlZWRlZC4gU2VlIHRoZSA8YSBocmVmPSIuLi9kZW1vL2xvYWRtb2RlLmh0bWwiPmRlbW88L2E+LjwvZGQ+CgogICAgICA8ZHQgaWQ9ImFkZG9uX2NvbnRpbnVlY29tbWVudCI+PGEgaHJlZj0iLi4vYWRkb24vY29tbWVudC9jb250aW51ZWNvbW1lbnQuanMiPjxjb2RlPmNvbW1lbnQvY29udGludWVjb21tZW50LmpzPC9jb2RlPjwvYT48L2R0PgogICAgICA8ZGQ+QWRkcyBhIDxjb2RlPmNvbnRpbnVlQ29tbWVudHM8L2NvZGU+IG9wdGlvbiwgd2hpY2ggc2V0cyB3aGV0aGVyIHRoZQogICAgICBlZGl0b3Igd2lsbCBtYWtlIHRoZSBuZXh0IGxpbmUgY29udGludWUgYSBjb21tZW50IHdoZW4geW91IHByZXNzIEVudGVyCiAgICAgIGluc2lkZSBhIGNvbW1lbnQgYmxvY2suIENhbiBiZSBzZXQgdG8gYSBib29sZWFuIHRvIGVuYWJsZS9kaXNhYmxlIHRoaXMKICAgICAgZnVuY3Rpb25hbGl0eS4gU2V0IHRvIGEgc3RyaW5nLCBpdCB3aWxsIGNvbnRpbnVlIGNvbW1lbnRzIHVzaW5nIGEgY3VzdG9tCiAgICAgIHNob3J0Y3V0LiBTZXQgdG8gYW4gb2JqZWN0LCBpdCB3aWxsIHVzZSB0aGUgPGNvZGU+a2V5PC9jb2RlPiBwcm9wZXJ0eSBmb3IKICAgICAgYSBjdXN0b20gc2hvcnRjdXQgYW5kIHRoZSBib29sZWFuIDxjb2RlPmNvbnRpbnVlTGluZUNvbW1lbnQ8L2NvZGU+CiAgICAgIHByb3BlcnR5IHRvIGRldGVybWluZSB3aGV0aGVyIHNpbmdsZS1saW5lIGNvbW1lbnRzIHNob3VsZCBiZSBjb250aW51ZWQKICAgICAgKGRlZmF1bHRpbmcgdG8gPGNvZGU+dHJ1ZTwvY29kZT4pLjwvZGQ+CgogICAgICA8ZHQgaWQ9ImFkZG9uX3BsYWNlaG9sZGVyIj48YSBocmVmPSIuLi9hZGRvbi9kaXNwbGF5L3BsYWNlaG9sZGVyLmpzIj48Y29kZT5kaXNwbGF5L3BsYWNlaG9sZGVyLmpzPC9jb2RlPjwvYT48L2R0PgogICAgICA8ZGQ+QWRkcyBhIDxjb2RlPnBsYWNlaG9sZGVyPC9jb2RlPiBvcHRpb24gdGhhdCBjYW4gYmUgdXNlZCB0bwogICAgICBtYWtlIHRleHQgYXBwZWFyIGluIHRoZSBlZGl0b3Igd2hlbiBpdCBpcyBlbXB0eSBhbmQgbm90IGZvY3VzZWQuCiAgICAgIEFsc28gZ2l2ZXMgdGhlIGVkaXRvciBhIDxjb2RlPkNvZGVNaXJyb3ItZW1wdHk8L2NvZGU+IENTUyBjbGFzcwogICAgICB3aGVuZXZlciBpdCBkb2Vzbid0IGNvbnRhaW4gYW55IHRleHQuCiAgICAgIFNlZSA8YSBocmVmPSIuLi9kZW1vL3BsYWNlaG9sZGVyLmh0bWwiPnRoZSBkZW1vPC9hPi48L2RkPgoKICAgICAgPGR0IGlkPSJhZGRvbl9mdWxsc2NyZWVuIj48YSBocmVmPSIuLi9hZGRvbi9kaXNwbGF5L2Z1bGxzY3JlZW4uanMiPjxjb2RlPmRpc3BsYXkvZnVsbHNjcmVlbi5qczwvY29kZT48L2E+PC9kdD4KICAgICAgPGRkPkRlZmluZXMgYW4gb3B0aW9uIDxjb2RlPmZ1bGxTY3JlZW48L2NvZGU+IHRoYXQsIHdoZW4gc2V0CiAgICAgIHRvIDxjb2RlPnRydWU8L2NvZGU+LCB3aWxsIG1ha2UgdGhlIGVkaXRvciBmdWxsLXNjcmVlbiAoYXMgaW4sCiAgICAgIHRha2luZyB1cCB0aGUgd2hvbGUgYnJvd3NlciB3aW5kb3cpLiBEZXBlbmRzCiAgICAgIG9uIDxhIGhyZWY9Ii4uL2FkZG9uL2Rpc3BsYXkvZnVsbHNjcmVlbi5jc3MiPjxjb2RlPmZ1bGxzY3JlZW4uY3NzPC9jb2RlPjwvYT4uIDxhIGhyZWY9Ii4uL2RlbW8vZnVsbHNjcmVlbi5odG1sIj5EZW1vCiAgICAgIGhlcmU8L2E+LjwvZGQ+CgogICAgICA8ZHQgaWQ9ImFkZG9uX3J1bGVycyI+PGEgaHJlZj0iLi4vYWRkb24vZGlzcGxheS9ydWxlcnMuanMiPjxjb2RlPmRpc3BsYXkvcnVsZXJzLmpzPC9jb2RlPjwvYT48L2R0PgogICAgICA8ZGQ+QWRkcyBhIDxjb2RlPnJ1bGVyczwvY29kZT4gb3B0aW9uLCB3aGljaCBjYW4gYmUgdXNlZCB0byBzaG93CiAgICAgIG9uZSBvciBtb3JlIHZlcnRpY2FsIHJ1bGVycyBpbiB0aGUgZWRpdG9yLiBUaGUgb3B0aW9uLCBpZgogICAgICBkZWZpbmVkLCBzaG91bGQgYmUgZ2l2ZW4gYW4gYXJyYXkgb2YgPGNvZGU+e2NvbHVtbiBbLCBjbGFzc05hbWUsCiAgICAgIGNvbG9yLCBsaW5lU3R5bGUsIHdpZHRoXX08L2NvZGU+IG9iamVjdHMgb3IgbnVtYmVycyAod2ljaAogICAgICBpbmRpY2F0ZSBhIGNvbHVtbikuIFRoZSBydWxlciB3aWxsIGJlIGRpc3BsYXllZCBhdCB0aGUgY29sdW1uCiAgICAgIGluZGljYXRlZCBieSB0aGUgbnVtYmVyIG9yIHRoZSA8Y29kZT5jb2x1bW48L2NvZGU+IHByb3BlcnR5LgogICAgICBUaGUgPGNvZGU+Y2xhc3NOYW1lPC9jb2RlPiBwcm9wZXJ0eSBjYW4gYmUgdXNlZCB0byBhc3NpZ24gYQogICAgICBjdXN0b20gc3R5bGUgdG8gYSBydWxlci4gPGEgaHJlZj0iLi4vZGVtby9ydWxlcnMuaHRtbCI+RGVtbwogICAgICBoZXJlPC9hPi48L2RkPgoKICAgICAgPGR0IGlkPSJhZGRvbl9oYXJkd3JhcCI+PGEgaHJlZj0iLi4vYWRkb24vd3JhcC9oYXJkd3JhcC5qcyI+PGNvZGU+d3JhcC9oYXJkd3JhcC5qczwvY29kZT48L2E+PC9kdD4KICAgICAgPGRkPkFkZG9uIHRvIHBlcmZvcm0gaGFyZCBsaW5lIHdyYXBwaW5nL2JyZWFraW5nIGZvciBwYXJhZ3JhcGhzCiAgICAgIG9mIHRleHQuIEFkZHMgdGhlc2UgbWV0aG9kcyB0byBlZGl0b3IgaW5zdGFuY2VzOgogICAgICAgIDxkbD4KICAgICAgICAgIDxkdD48Y29kZT48c3Ryb25nPndyYXBQYXJhZ3JhcGg8L3N0cm9uZz4oP3Bvczoge2xpbmUsIGNofSwgP29wdGlvbnM6IG9iamVjdCk8L2NvZGU+PC9kdD4KICAgICAgICAgIDxkZD5XcmFwcyB0aGUgcGFyYWdyYXBoIGF0IHRoZSBnaXZlbiBwb3NpdGlvbi4KICAgICAgICAgIElmIDxjb2RlPnBvczwvY29kZT4gaXMgbm90IGdpdmVuLCBpdCBkZWZhdWx0cyB0byB0aGUgY3Vyc29yCiAgICAgICAgICBwb3NpdGlvbi48L2RkPgogICAgICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+d3JhcFJhbmdlPC9zdHJvbmc+KGZyb206IHtsaW5lLCBjaH0sIHRvOiB7bGluZSwgY2h9LCA/b3B0aW9uczogb2JqZWN0KTwvY29kZT48L2R0PgogICAgICAgICAgPGRkPldyYXBzIHRoZSBnaXZlbiByYW5nZSBhcyBvbmUgYmlnIHBhcmFncmFwaC48L2RkPgogICAgICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+d3JhcFBhcmFncmFwaHNJblJhbmdlPC9zdHJvbmc+KGZyb206IHtsaW5lLCBjaH0sIHRvOiB7bGluZSwgY2h9LCA/b3B0aW9uczogb2JqZWN0KTwvY29kZT48L2R0PgogICAgICAgICAgPGRkPldyYXBwcyB0aGUgcGFyYWdyYXBocyBpbiAoYW5kIG92ZXJsYXBwaW5nIHdpdGgpIHRoZQogICAgICAgICAgZ2l2ZW4gcmFuZ2UgaW5kaXZpZHVhbGx5LjwvZGQ+CiAgICAgICAgPC9kbD4KICAgICAgICBUaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIHJlY29nbml6ZWQ6CiAgICAgICAgPGRsPgogICAgICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+cGFyYWdyYXBoU3RhcnQ8L3N0cm9uZz4sIDxzdHJvbmc+cGFyYWdyYXBoRW5kPC9zdHJvbmc+OiBSZWdFeHA8L2NvZGU+PC9kdD4KICAgICAgICAgIDxkZD5CbGFuayBsaW5lcyBhcmUgYWx3YXlzIGNvbnNpZGVyZWQgcGFyYWdyYXBoIGJvdW5kYXJpZXMuCiAgICAgICAgICBUaGVzZSBvcHRpb25zIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBwYXR0ZXJuIHRoYXQgY2F1c2VzCiAgICAgICAgICBsaW5lcyB0byBiZSBjb25zaWRlcmVkIHRoZSBzdGFydCBvciBlbmQgb2YgYSBwYXJhZ3JhcGguPC9kZD4KICAgICAgICAgIDxkdD48Y29kZT48c3Ryb25nPmNvbHVtbjwvc3Ryb25nPjogbnVtYmVyPC9jb2RlPjwvZHQ+CiAgICAgICAgICA8ZGQ+VGhlIGNvbHVtbiB0byB3cmFwIGF0LiBEZWZhdWx0cyB0byA4MC48L2RkPgogICAgICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+d3JhcE9uPC9zdHJvbmc+OiBSZWdFeHA8L2NvZGU+PC9kdD4KICAgICAgICAgIDxkZD5BIHJlZ3VsYXIgZXhwcmVzc2lvbiB0aGF0IG1hdGNoZXMgb25seSB0aG9zZQogICAgICAgICAgdHdvLWNoYXJhY3RlciBzdHJpbmdzIHRoYXQgYWxsb3cgd3JhcHBpbmcuIEJ5IGRlZmF1bHQsIHRoZQogICAgICAgICAgYWRkb24gd3JhcHMgb24gd2hpdGVzcGFjZSBhbmQgYWZ0ZXIgZGFzaCBjaGFyYWN0ZXJzLjwvZGQ+CiAgICAgICAgICA8ZHQ+PGNvZGU+PHN0cm9uZz5raWxsVHJhaWxpbmdTcGFjZTwvc3Ryb25nPjogYm9vbGVhbjwvY29kZT48L2R0PgogICAgICAgICAgPGRkPldoZXRoZXIgdHJhaWxpbmcgc3BhY2UgY2F1c2VkIGJ5IHdyYXBwaW5nIHNob3VsZCBiZQogICAgICAgICAgcHJlc2VydmVkLCBvciBkZWxldGVkLiBEZWZhdWx0cyB0byB0cnVlLjwvZGQ+CiAgICAgICAgPC9kbD4KICAgICAgICBBIGRlbW8gb2YgdGhlIGFkZG9uIGlzIGF2YWlsYWJsZSA8YSBocmVmPSIuLi9kZW1vL2hhcmR3cmFwLmh0bWwiPmhlcmU8L2E+LgogICAgICA8L2RkPgoKICAgICAgPGR0IGlkPSJhZGRvbl9tZXJnZSI+PGEgaHJlZj0iLi4vYWRkb24vbWVyZ2UvbWVyZ2UuanMiPjxjb2RlPm1lcmdlL21lcmdlLmpzPC9jb2RlPjwvYT48L2R0PgogICAgICA8ZGQ+SW1wbGVtZW50cyBhbiBpbnRlcmZhY2UgZm9yIG1lcmdpbmcgY2hhbmdlcywgdXNpbmcgZWl0aGVyIGEKICAgICAgMi13YXkgb3IgYSAzLXdheSB2aWV3LiBUaGUgPGNvZGU+Q29kZU1pcnJvci5NZXJnZVZpZXc8L2NvZGU+CiAgICAgIGNvbnN0cnVjdG9yIHRha2VzIGFyZ3VtZW50cyBzaW1pbGFyIHRvCiAgICAgIHRoZSA8YSBocmVmPSIjQ29kZU1pcnJvciI+PGNvZGU+Q29kZU1pcnJvcjwvY29kZT48L2E+CiAgICAgIGNvbnN0cnVjdG9yLCBmaXJzdCBhIG5vZGUgdG8gYXBwZW5kIHRoZSBpbnRlcmZhY2UgdG8sIGFuZCB0aGVuCiAgICAgIGFuIG9wdGlvbnMgb2JqZWN0LiBUd28gZXh0cmEgb3B0aW9uYWwgb3B0aW9ucyBhcmUKICAgICAgcmVjb2duaXplZCwgPGNvZGU+b3JpZ0xlZnQ8L2NvZGU+IGFuZCA8Y29kZT5vcmlnUmlnaHQ8L2NvZGU+LAogICAgICB3aGljaCBtYXkgYmUgc3RyaW5ncyB0aGF0IHByb3ZpZGUgb3JpZ2luYWwgdmVyc2lvbnMgb2YgdGhlCiAgICAgIGRvY3VtZW50LCB3aGljaCB3aWxsIGJlIHNob3duIHRvIHRoZSBsZWZ0IGFuZCByaWdodCBvZiB0aGUKICAgICAgZWRpdG9yIGluIG5vbi1lZGl0YWJsZSBDb2RlTWlycm9yIGluc3RhbmNlcy4gVGhlIG1lcmdlIGludGVyZmFjZQogICAgICB3aWxsIGhpZ2hsaWdodCBjaGFuZ2VzIGJldHdlZW4gdGhlIGVkaXRhYmxlIGRvY3VtZW50IGFuZCB0aGUKICAgICAgb3JpZ2luYWwocykgKDxhIGhyZWY9Ii4uL2RlbW8vbWVyZ2UuaHRtbCI+ZGVtbzwvYT4pLjwvZGQ+CgogICAgICA8ZHQgaWQ9ImFkZG9uX3Rlcm4iPjxhIGhyZWY9Ii4uL2FkZG9uL3Rlcm4vdGVybi5qcyI+PGNvZGU+dGVybi90ZXJuLmpzPC9jb2RlPjwvYT48L2R0PgogICAgICA8ZGQ+UHJvdmlkZXMgaW50ZWdyYXRpb24gd2l0aAogICAgICB0aGUgPGEgaHJlZj0iaHR0cDovL3Rlcm5qcy5uZXQiPlRlcm48L2E+IEphdmFTY3JpcHQgYW5hbHlzaXMKICAgICAgZW5naW5lLCBmb3IgY29tcGxldGlvbiwgZGVmaW5pdGlvbiBmaW5kaW5nLCBhbmQgbWlub3IKICAgICAgcmVmYWN0b3JpbmcgaGVscC4gU2VlIHRoZSA8YSBocmVmPSIuLi9kZW1vL3Rlcm4uaHRtbCI+ZGVtbzwvYT4KICAgICAgZm9yIGEgdmVyeSBzaW1wbGUgaW50ZWdyYXRpb24uIEZvciBtb3JlIGludm9sdmVkIHNjZW5hcmlvcywgc2VlCiAgICAgIHRoZSBjb21tZW50cyBhdCB0aGUgdG9wIG9mCiAgICAgIHRoZSA8YSBocmVmPSIuLi9hZGRvbi90ZXJuL3Rlcm4uanMiPmFkZG9uPC9hPiBhbmQgdGhlCiAgICAgIGltcGxlbWVudGF0aW9uIG9mIHRoZQogICAgICAobXVsdGktZmlsZSkgPGEgaHJlZj0iaHR0cDovL3Rlcm5qcy5uZXQvZG9jL2RlbW8uaHRtbCI+ZGVtb25zdHJhdGlvbgogICAgICBvbiB0aGUgVGVybiB3ZWJzaXRlPC9hPi48L2RkPgogICAgPC9kbD4KPC9zZWN0aW9uPgoKPHNlY3Rpb24gaWQ9bW9kZWFwaT4KICAgIDxoMj5Xcml0aW5nIENvZGVNaXJyb3IgTW9kZXM8L2gyPgoKICAgIDxwPk1vZGVzIHR5cGljYWxseSBjb25zaXN0IG9mIGEgc2luZ2xlIEphdmFTY3JpcHQgZmlsZS4gVGhpcyBmaWxlCiAgICBkZWZpbmVzLCBpbiB0aGUgc2ltcGxlc3QgY2FzZSwgYSBsZXhlciAodG9rZW5pemVyKSBmb3IgeW91cgogICAgbGFuZ3VhZ2XigJRhIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYSBjaGFyYWN0ZXIgc3RyZWFtIGFzIGlucHV0LAogICAgYWR2YW5jZXMgaXQgcGFzdCBhIHRva2VuLCBhbmQgcmV0dXJucyBhIHN0eWxlIGZvciB0aGF0IHRva2VuLiBNb3JlCiAgICBhZHZhbmNlZCBtb2RlcyBjYW4gYWxzbyBoYW5kbGUgaW5kZW50YXRpb24gZm9yIHRoZSBsYW5ndWFnZS48L3A+CgogICAgPHAgaWQ9ImRlZmluZU1vZGUiPlRoZSBtb2RlIHNjcmlwdCBzaG91bGQKICAgIGNhbGwgPGNvZGU+PHN0cm9uZz5Db2RlTWlycm9yLmRlZmluZU1vZGU8L3N0cm9uZz48L2NvZGU+IHRvCiAgICByZWdpc3RlciBpdHNlbGYgd2l0aCBDb2RlTWlycm9yLiBUaGlzIGZ1bmN0aW9uIHRha2VzIHR3bwogICAgYXJndW1lbnRzLiBUaGUgZmlyc3Qgc2hvdWxkIGJlIHRoZSBuYW1lIG9mIHRoZSBtb2RlLCBmb3Igd2hpY2ggeW91CiAgICBzaG91bGQgdXNlIGEgbG93ZXJjYXNlIHN0cmluZywgcHJlZmVyYWJseSBvbmUgdGhhdCBpcyBhbHNvIHRoZQogICAgbmFtZSBvZiB0aGUgZmlsZXMgdGhhdCBkZWZpbmUgdGhlIG1vZGUgKGkuZS4gPGNvZGU+InhtbCI8L2NvZGU+IGlzCiAgICBkZWZpbmVkIGluIDxjb2RlPnhtbC5qczwvY29kZT4pLiBUaGUgc2Vjb25kIGFyZ3VtZW50IHNob3VsZCBiZSBhCiAgICBmdW5jdGlvbiB0aGF0LCBnaXZlbiBhIENvZGVNaXJyb3IgY29uZmlndXJhdGlvbiBvYmplY3QgKHRoZSB0aGluZwogICAgcGFzc2VkIHRvIHRoZSA8Y29kZT5Db2RlTWlycm9yPC9jb2RlPiBmdW5jdGlvbikgYW5kIGFuIG9wdGlvbmFsCiAgICBtb2RlIGNvbmZpZ3VyYXRpb24gb2JqZWN0IChhcyBpbgogICAgdGhlIDxhIGhyZWY9IiNvcHRpb25fbW9kZSI+PGNvZGU+bW9kZTwvY29kZT48L2E+IG9wdGlvbiksIHJldHVybnMKICAgIGEgbW9kZSBvYmplY3QuPC9wPgoKICAgIDxwPlR5cGljYWxseSwgeW91IHNob3VsZCB1c2UgdGhpcyBzZWNvbmQgYXJndW1lbnQKICAgIHRvIDxjb2RlPmRlZmluZU1vZGU8L2NvZGU+IGFzIHlvdXIgbW9kdWxlIHNjb3BlIGZ1bmN0aW9uIChtb2RlcwogICAgc2hvdWxkIG5vdCBsZWFrIGFueXRoaW5nIGludG8gdGhlIGdsb2JhbCBzY29wZSEpLCBpLmUuIHdyaXRlIHlvdXIKICAgIHdob2xlIG1vZGUgaW5zaWRlIHRoaXMgZnVuY3Rpb24uPC9wPgoKICAgIDxwPlRoZSBtYWluIHJlc3BvbnNpYmlsaXR5IG9mIGEgbW9kZSBzY3JpcHQgaXMgPGVtPnBhcnNpbmc8L2VtPgogICAgdGhlIGNvbnRlbnQgb2YgdGhlIGVkaXRvci4gRGVwZW5kaW5nIG9uIHRoZSBsYW5ndWFnZSBhbmQgdGhlCiAgICBhbW91bnQgb2YgZnVuY3Rpb25hbGl0eSBkZXNpcmVkLCB0aGlzIGNhbiBiZSBkb25lIGluIHJlYWxseSBlYXN5CiAgICBvciBleHRyZW1lbHkgY29tcGxpY2F0ZWQgd2F5cy4gU29tZSBwYXJzZXJzIGNhbiBiZSBzdGF0ZWxlc3MsCiAgICBtZWFuaW5nIHRoYXQgdGhleSBsb29rIGF0IG9uZSBlbGVtZW50ICg8ZW0+dG9rZW48L2VtPikgb2YgdGhlIGNvZGUKICAgIGF0IGEgdGltZSwgd2l0aCBubyBtZW1vcnkgb2Ygd2hhdCBjYW1lIGJlZm9yZS4gTW9zdCwgaG93ZXZlciwgd2lsbAogICAgbmVlZCB0byByZW1lbWJlciBzb21ldGhpbmcuIFRoaXMgaXMgZG9uZSBieSB1c2luZyBhIDxlbT5zdGF0ZQogICAgb2JqZWN0PC9lbT4sIHdoaWNoIGlzIGFuIG9iamVjdCB0aGF0IGlzIGFsd2F5cyBwYXNzZWQgd2hlbgogICAgcmVhZGluZyBhIHRva2VuLCBhbmQgd2hpY2ggY2FuIGJlIG11dGF0ZWQgYnkgdGhlIHRva2VuaXplci48L3A+CgogICAgPHAgaWQ9InN0YXJ0U3RhdGUiPk1vZGVzIHRoYXQgdXNlIGEgc3RhdGUgbXVzdCBkZWZpbmUKICAgIGEgPGNvZGU+PHN0cm9uZz5zdGFydFN0YXRlPC9zdHJvbmc+PC9jb2RlPiBtZXRob2Qgb24gdGhlaXIgbW9kZQogICAgb2JqZWN0LiBUaGlzIGlzIGEgZnVuY3Rpb24gb2Ygbm8gYXJndW1lbnRzIHRoYXQgcHJvZHVjZXMgYSBzdGF0ZQogICAgb2JqZWN0IHRvIGJlIHVzZWQgYXQgdGhlIHN0YXJ0IG9mIGEgZG9jdW1lbnQuPC9wPgoKICAgIDxwIGlkPSJ0b2tlbiI+VGhlIG1vc3QgaW1wb3J0YW50IHBhcnQgb2YgYSBtb2RlIG9iamVjdCBpcwogICAgaXRzIDxjb2RlPjxzdHJvbmc+dG9rZW48L3N0cm9uZz4oc3RyZWFtLCBzdGF0ZSk8L2NvZGU+IG1ldGhvZC4gQWxsCiAgICBtb2RlcyBtdXN0IGRlZmluZSB0aGlzIG1ldGhvZC4gSXQgc2hvdWxkIHJlYWQgb25lIHRva2VuIGZyb20gdGhlCiAgICBzdHJlYW0gaXQgaXMgZ2l2ZW4gYXMgYW4gYXJndW1lbnQsIG9wdGlvbmFsbHkgdXBkYXRlIGl0cyBzdGF0ZSwKICAgIGFuZCByZXR1cm4gYSBzdHlsZSBzdHJpbmcsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGZvciB0b2tlbnMgdGhhdCBkbwogICAgbm90IGhhdmUgdG8gYmUgc3R5bGVkLiBGb3IgeW91ciBzdHlsZXMsIHlvdSBhcmUgZW5jb3VyYWdlZCB0byB1c2UKICAgIHRoZSAnc3RhbmRhcmQnIG5hbWVzIGRlZmluZWQgaW4gdGhlIHRoZW1lcyAod2l0aG91dAogICAgdGhlIDxjb2RlPmNtLTwvY29kZT4gcHJlZml4KS4gSWYgdGhhdCBmYWlscywgaXQgaXMgYWxzbyBwb3NzaWJsZQogICAgdG8gY29tZSB1cCB3aXRoIHlvdXIgb3duIGFuZCB3cml0ZSB5b3VyIG93biBDU1MgdGhlbWUgZmlsZS48cD4KCiAgICA8cCBpZD0idG9rZW5fc3R5bGVfbGluZSI+QSB0eXBpY2FsIHRva2VuIHN0cmluZyB3b3VsZAogICAgYmUgPGNvZGU+InZhcmlhYmxlIjwvY29kZT4gb3IgPGNvZGU+ImNvbW1lbnQiPC9jb2RlPi4gTXVsdGlwbGUKICAgIHN0eWxlcyBjYW4gYmUgcmV0dXJuZWQgKHNlcGFyYXRlZCBieSBzcGFjZXMpLCBmb3IKICAgIGV4YW1wbGUgPGNvZGU+InN0cmluZyBlcnJvciI8L2NvZGU+IGZvciBhIHRoaW5nIHRoYXQgbG9va3MgbGlrZSBhCiAgICBzdHJpbmcgYnV0IGlzIGludmFsaWQgc29tZWhvdyAoc2F5LCBtaXNzaW5nIGl0cyBjbG9zaW5nIHF1b3RlKS4KICAgIFdoZW4gYSBzdHlsZSBpcyBwcmVmaXhlZCBieSA8Y29kZT4ibGluZS0iPC9jb2RlPgogICAgb3IgPGNvZGU+ImxpbmUtYmFja2dyb3VuZC0iPC9jb2RlPiwgdGhlIHN0eWxlIHdpbGwgYmUgYXBwbGllZCB0bwogICAgdGhlIHdob2xlIGxpbmUsIGFuYWxvZ291cyB0byB3aGF0CiAgICB0aGUgPGEgaHJlZj0iI2FkZExpbmVDbGFzcyI+PGNvZGU+YWRkTGluZUNsYXNzPC9jb2RlPjwvYT4gbWV0aG9kCiAgICBkb2Vz4oCUc3R5bGluZyB0aGUgPGNvZGU+InRleHQiPC9jb2RlPiBpbiB0aGUgc2ltcGxlIGNhc2UsIGFuZAogICAgdGhlIDxjb2RlPiJiYWNrZ3JvdW5kIjwvY29kZT4gZWxlbWVudAogICAgd2hlbiA8Y29kZT4ibGluZS1iYWNrZ3JvdW5kLSI8L2NvZGU+IGlzIHByZWZpeGVkLjwvcD4KCiAgICA8cCBpZD0iU3RyaW5nU3RyZWFtIj5UaGUgc3RyZWFtIG9iamVjdCB0aGF0J3MgcGFzc2VkCiAgICB0byA8Y29kZT50b2tlbjwvY29kZT4gZW5jYXBzdWxhdGVzIGEgbGluZSBvZiBjb2RlICh0b2tlbnMgbWF5CiAgICBuZXZlciBzcGFuIGxpbmVzKSBhbmQgb3VyIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhhdCBsaW5lLiBJdCBoYXMKICAgIHRoZSBmb2xsb3dpbmcgQVBJOjwvcD4KCiAgICA8ZGw+CiAgICAgIDxkdD48Y29kZT48c3Ryb25nPmVvbDwvc3Ryb25nPigpIOKGkiBib29sZWFuPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5SZXR1cm5zIHRydWUgb25seSBpZiB0aGUgc3RyZWFtIGlzIGF0IHRoZSBlbmQgb2YgdGhlCiAgICAgIGxpbmUuPC9kZD4KICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+c29sPC9zdHJvbmc+KCkg4oaSIGJvb2xlYW48L2NvZGU+PC9kdD4KICAgICAgPGRkPlJldHVybnMgdHJ1ZSBvbmx5IGlmIHRoZSBzdHJlYW0gaXMgYXQgdGhlIHN0YXJ0IG9mIHRoZQogICAgICBsaW5lLjwvZGQ+CgogICAgICA8ZHQ+PGNvZGU+PHN0cm9uZz5wZWVrPC9zdHJvbmc+KCkg4oaSIHN0cmluZzwvY29kZT48L2R0PgogICAgICA8ZGQ+UmV0dXJucyB0aGUgbmV4dCBjaGFyYWN0ZXIgaW4gdGhlIHN0cmVhbSB3aXRob3V0IGFkdmFuY2luZwogICAgICBpdC4gV2lsbCByZXR1cm4gYW4gPGNvZGU+bnVsbDwvY29kZT4gYXQgdGhlIGVuZCBvZiB0aGUKICAgICAgbGluZS48L2RkPgogICAgICA8ZHQ+PGNvZGU+PHN0cm9uZz5uZXh0PC9zdHJvbmc+KCkg4oaSIHN0cmluZzwvY29kZT48L2R0PgogICAgICA8ZGQ+UmV0dXJucyB0aGUgbmV4dCBjaGFyYWN0ZXIgaW4gdGhlIHN0cmVhbSBhbmQgYWR2YW5jZXMgaXQuCiAgICAgIEFsc28gcmV0dXJucyA8Y29kZT5udWxsPC9jb2RlPiB3aGVuIG5vIG1vcmUgY2hhcmFjdGVycyBhcmUKICAgICAgYXZhaWxhYmxlLjwvZGQ+CgogICAgICA8ZHQ+PGNvZGU+PHN0cm9uZz5lYXQ8L3N0cm9uZz4obWF0Y2g6IHN0cmluZ3xyZWdleHB8ZnVuY3Rpb24oY2hhcjogc3RyaW5nKSDihpIgYm9vbGVhbikg4oaSIHN0cmluZzwvY29kZT48L2R0PgogICAgICA8ZGQ+PGNvZGU+bWF0Y2g8L2NvZGU+IGNhbiBiZSBhIGNoYXJhY3RlciwgYSByZWd1bGFyIGV4cHJlc3Npb24sCiAgICAgIG9yIGEgZnVuY3Rpb24gdGhhdCB0YWtlcyBhIGNoYXJhY3RlciBhbmQgcmV0dXJucyBhIGJvb2xlYW4uIElmCiAgICAgIHRoZSBuZXh0IGNoYXJhY3RlciBpbiB0aGUgc3RyZWFtICdtYXRjaGVzJyB0aGUgZ2l2ZW4gYXJndW1lbnQsCiAgICAgIGl0IGlzIGNvbnN1bWVkIGFuZCByZXR1cm5lZC4gT3RoZXJ3aXNlLCA8Y29kZT51bmRlZmluZWQ8L2NvZGU+CiAgICAgIGlzIHJldHVybmVkLjwvZGQ+CiAgICAgIDxkdD48Y29kZT48c3Ryb25nPmVhdFdoaWxlPC9zdHJvbmc+KG1hdGNoOiBzdHJpbmd8cmVnZXhwfGZ1bmN0aW9uKGNoYXI6IHN0cmluZykg4oaSIGJvb2xlYW4pIOKGkiBib29sZWFuPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5SZXBlYXRlZGx5IGNhbGxzIDxjb2RlPmVhdDwvY29kZT4gd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnQsCiAgICAgIHVudGlsIGl0IGZhaWxzLiBSZXR1cm5zIHRydWUgaWYgYW55IGNoYXJhY3RlcnMgd2VyZSBlYXRlbi48L2RkPgogICAgICA8ZHQ+PGNvZGU+PHN0cm9uZz5lYXRTcGFjZTwvc3Ryb25nPigpIOKGkiBib29sZWFuPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5TaG9ydGN1dCBmb3IgPGNvZGU+ZWF0V2hpbGU8L2NvZGU+IHdoZW4gbWF0Y2hpbmcKICAgICAgd2hpdGUtc3BhY2UuPC9kZD4KICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+c2tpcFRvRW5kPC9zdHJvbmc+KCk8L2NvZGU+PC9kdD4KICAgICAgPGRkPk1vdmVzIHRoZSBwb3NpdGlvbiB0byB0aGUgZW5kIG9mIHRoZSBsaW5lLjwvZGQ+CiAgICAgIDxkdD48Y29kZT48c3Ryb25nPnNraXBUbzwvc3Ryb25nPihjaDogc3RyaW5nKSDihpIgYm9vbGVhbjwvY29kZT48L2R0PgogICAgICA8ZGQ+U2tpcHMgdG8gdGhlIG5leHQgb2NjdXJyZW5jZSBvZiB0aGUgZ2l2ZW4gY2hhcmFjdGVyLCBpZgogICAgICBmb3VuZCBvbiB0aGUgY3VycmVudCBsaW5lIChkb2Vzbid0IGFkdmFuY2UgdGhlIHN0cmVhbSBpZiB0aGUKICAgICAgY2hhcmFjdGVyIGRvZXMgbm90IG9jY3VyIG9uIHRoZSBsaW5lKS4gUmV0dXJucyB0cnVlIGlmIHRoZQogICAgICBjaGFyYWN0ZXIgd2FzIGZvdW5kLjwvZGQ+CiAgICAgIDxkdD48Y29kZT48c3Ryb25nPm1hdGNoPC9zdHJvbmc+KHBhdHRlcm46IHN0cmluZywgP2NvbnN1bWU6IGJvb2xlYW4sID9jYXNlRm9sZDogYm9vbGVhbikg4oaSIGJvb2xlYW48L2NvZGU+PC9kdD4KICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+bWF0Y2g8L3N0cm9uZz4ocGF0dGVybjogcmVnZXhwLCA/Y29uc3VtZTogYm9vbGVhbikg4oaSIGFycmF5Jmx0O3N0cmluZyZndDs8L2NvZGU+PC9kdD4KICAgICAgPGRkPkFjdCBsaWtlIGEKICAgICAgbXVsdGktY2hhcmFjdGVyIDxjb2RlPmVhdDwvY29kZT7igJRpZiA8Y29kZT5jb25zdW1lPC9jb2RlPiBpcyB0cnVlCiAgICAgIG9yIG5vdCBnaXZlbuKAlG9yIGEgbG9vay1haGVhZCB0aGF0IGRvZXNuJ3QgdXBkYXRlIHRoZSBzdHJlYW0KICAgICAgcG9zaXRpb27igJRpZiBpdCBpcyBmYWxzZS4gPGNvZGU+cGF0dGVybjwvY29kZT4gY2FuIGJlIGVpdGhlciBhCiAgICAgIHN0cmluZyBvciBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBzdGFydGluZyB3aXRoIDxjb2RlPl48L2NvZGU+LgogICAgICBXaGVuIGl0IGlzIGEgc3RyaW5nLCA8Y29kZT5jYXNlRm9sZDwvY29kZT4gY2FuIGJlIHNldCB0byB0cnVlIHRvCiAgICAgIG1ha2UgdGhlIG1hdGNoIGNhc2UtaW5zZW5zaXRpdmUuIFdoZW4gc3VjY2Vzc2Z1bGx5IG1hdGNoaW5nIGEKICAgICAgcmVndWxhciBleHByZXNzaW9uLCB0aGUgcmV0dXJuZWQgdmFsdWUgd2lsbCBiZSB0aGUgYXJyYXkKICAgICAgcmV0dXJuZWQgYnkgPGNvZGU+bWF0Y2g8L2NvZGU+LCBpbiBjYXNlIHlvdSBuZWVkIHRvIGV4dHJhY3QKICAgICAgbWF0Y2hlZCBncm91cHMuPC9kZD4KCiAgICAgIDxkdD48Y29kZT48c3Ryb25nPmJhY2tVcDwvc3Ryb25nPihuOiBpbnRlZ2VyKTwvY29kZT48L2R0PgogICAgICA8ZGQ+QmFja3MgdXAgdGhlIHN0cmVhbSA8Y29kZT5uPC9jb2RlPiBjaGFyYWN0ZXJzLiBCYWNraW5nIGl0IHVwCiAgICAgIGZ1cnRoZXIgdGhhbiB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgdG9rZW4gd2lsbCBjYXVzZSB0aGluZ3MgdG8KICAgICAgYnJlYWssIHNvIGJlIGNhcmVmdWwuPC9kZD4KICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+Y29sdW1uPC9zdHJvbmc+KCkg4oaSIGludGVnZXI8L2NvZGU+PC9kdD4KICAgICAgPGRkPlJldHVybnMgdGhlIGNvbHVtbiAodGFraW5nIGludG8gYWNjb3VudCB0YWJzKSBhdCB3aGljaCB0aGUKICAgICAgY3VycmVudCB0b2tlbiBzdGFydHMuPC9kZD4KICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+aW5kZW50YXRpb248L3N0cm9uZz4oKSDihpIgaW50ZWdlcjwvY29kZT48L2R0PgogICAgICA8ZGQ+VGVsbHMgeW91IGhvdyBmYXIgdGhlIGN1cnJlbnQgbGluZSBoYXMgYmVlbiBpbmRlbnRlZCwgaW4KICAgICAgc3BhY2VzLiBDb3JyZWN0cyBmb3IgdGFiIGNoYXJhY3RlcnMuPC9kZD4KCiAgICAgIDxkdD48Y29kZT48c3Ryb25nPmN1cnJlbnQ8L3N0cm9uZz4oKSDihpIgc3RyaW5nPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5HZXQgdGhlIHN0cmluZyBiZXR3ZWVuIHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCB0b2tlbiBhbmQKICAgICAgdGhlIGN1cnJlbnQgc3RyZWFtIHBvc2l0aW9uLjwvZGQ+CiAgICA8L2RsPgoKICAgIDxwIGlkPSJibGFua0xpbmUiPkJ5IGRlZmF1bHQsIGJsYW5rIGxpbmVzIGFyZSBzaW1wbHkgc2tpcHBlZCB3aGVuCiAgICB0b2tlbml6aW5nIGEgZG9jdW1lbnQuIEZvciBsYW5ndWFnZXMgdGhhdCBoYXZlIHNpZ25pZmljYW50IGJsYW5rCiAgICBsaW5lcywgeW91IGNhbiBkZWZpbmUKICAgIGEgPGNvZGU+PHN0cm9uZz5ibGFua0xpbmU8L3N0cm9uZz4oc3RhdGUpPC9jb2RlPiBtZXRob2Qgb24geW91cgogICAgbW9kZSB0aGF0IHdpbGwgZ2V0IGNhbGxlZCB3aGVuZXZlciBhIGJsYW5rIGxpbmUgaXMgcGFzc2VkIG92ZXIsIHNvCiAgICB0aGF0IGl0IGNhbiB1cGRhdGUgdGhlIHBhcnNlciBzdGF0ZS48L3A+CgogICAgPHAgaWQ9ImNvcHlTdGF0ZSI+QmVjYXVzZSBzdGF0ZSBvYmplY3QgYXJlIG11dGF0ZWQsIGFuZCBDb2RlTWlycm9yCiAgICBuZWVkcyB0byBrZWVwIHZhbGlkIHZlcnNpb25zIG9mIGEgc3RhdGUgYXJvdW5kIHNvIHRoYXQgaXQgY2FuCiAgICByZXN0YXJ0IGEgcGFyc2UgYXQgYW55IGxpbmUsIGNvcGllcyBtdXN0IGJlIG1hZGUgb2Ygc3RhdGUgb2JqZWN0cy4KICAgIFRoZSBkZWZhdWx0IGFsZ29yaXRobSB1c2VkIGlzIHRoYXQgYSBuZXcgc3RhdGUgb2JqZWN0IGlzIGNyZWF0ZWQsCiAgICB3aGljaCBnZXRzIGFsbCB0aGUgcHJvcGVydGllcyBvZiB0aGUgb2xkIG9iamVjdC4gQW55IHByb3BlcnRpZXMKICAgIHdoaWNoIGhvbGQgYXJyYXlzIGdldCBhIGNvcHkgb2YgdGhlc2UgYXJyYXlzIChzaW5jZSBhcnJheXMgdGVuZCB0bwogICAgYmUgdXNlZCBhcyBtdXRhYmxlIHN0YWNrcykuIFdoZW4gdGhpcyBpcyBub3QgY29ycmVjdCwgZm9yIGV4YW1wbGUKICAgIGJlY2F1c2UgYSBtb2RlIG11dGF0ZXMgbm9uLWFycmF5IHByb3BlcnRpZXMgb2YgaXRzIHN0YXRlIG9iamVjdCwgYQogICAgbW9kZSBvYmplY3Qgc2hvdWxkIGRlZmluZQogICAgYSA8Y29kZT48c3Ryb25nPmNvcHlTdGF0ZTwvc3Ryb25nPjwvY29kZT4gbWV0aG9kLCB3aGljaCBpcyBnaXZlbiBhCiAgICBzdGF0ZSBhbmQgc2hvdWxkIHJldHVybiBhIHNhZmUgY29weSBvZiB0aGF0IHN0YXRlLjwvcD4KCiAgICA8cCBpZD0iaW5kZW50Ij5JZiB5b3Ugd2FudCB5b3VyIG1vZGUgdG8gcHJvdmlkZSBzbWFydCBpbmRlbnRhdGlvbgogICAgKHRocm91Z2ggdGhlIDxhIGhyZWY9IiNpbmRlbnRMaW5lIj48Y29kZT5pbmRlbnRMaW5lPC9jb2RlPjwvYT4KICAgIG1ldGhvZCBhbmQgdGhlIDxjb2RlPmluZGVudEF1dG88L2NvZGU+CiAgICBhbmQgPGNvZGU+bmV3bGluZUFuZEluZGVudDwvY29kZT4gY29tbWFuZHMsIHRvIHdoaWNoIGtleXMgY2FuIGJlCiAgICA8YSBocmVmPSIjb3B0aW9uX2V4dHJhS2V5cyI+Ym91bmQ8L2E+KSwgeW91IG11c3QgZGVmaW5lCiAgICBhbiA8Y29kZT48c3Ryb25nPmluZGVudDwvc3Ryb25nPihzdGF0ZSwgdGV4dEFmdGVyKTwvY29kZT4gbWV0aG9kCiAgICBvbiB5b3VyIG1vZGUgb2JqZWN0LjwvcD4KCiAgICA8cD5UaGUgaW5kZW50YXRpb24gbWV0aG9kIHNob3VsZCBpbnNwZWN0IHRoZSBnaXZlbiBzdGF0ZSBvYmplY3QsCiAgICBhbmQgb3B0aW9uYWxseSB0aGUgPGNvZGU+dGV4dEFmdGVyPC9jb2RlPiBzdHJpbmcsIHdoaWNoIGNvbnRhaW5zCiAgICB0aGUgdGV4dCBvbiB0aGUgbGluZSB0aGF0IGlzIGJlaW5nIGluZGVudGVkLCBhbmQgcmV0dXJuIGFuCiAgICBpbnRlZ2VyLCB0aGUgYW1vdW50IG9mIHNwYWNlcyB0byBpbmRlbnQuIEl0IHNob3VsZCB1c3VhbGx5IHRha2UKICAgIHRoZSA8YSBocmVmPSIjb3B0aW9uX2luZGVudFVuaXQiPjxjb2RlPmluZGVudFVuaXQ8L2NvZGU+PC9hPgogICAgb3B0aW9uIGludG8gYWNjb3VudC4gQW4gaW5kZW50YXRpb24gbWV0aG9kIG1heQogICAgcmV0dXJuIDxjb2RlPkNvZGVNaXJyb3IuUGFzczwvY29kZT4gdG8gaW5kaWNhdGUgdGhhdCBpdAogICAgY291bGQgbm90IGNvbWUgdXAgd2l0aCBhIHByZWNpc2UgaW5kZW50YXRpb24uPC9wPgoKICAgIDxwIGlkPSJtb2RlX2NvbW1lbnQiPlRvIHdvcmsgd2VsbCB3aXRoCiAgICB0aGUgPGEgaHJlZj0iI2FkZG9uX2NvbW1lbnQiPmNvbW1lbnRpbmcgYWRkb248L2E+LCBhIG1vZGUgbWF5CiAgICBkZWZpbmUgPGNvZGU+PHN0cm9uZz5saW5lQ29tbWVudDwvc3Ryb25nPjwvY29kZT4gKHN0cmluZyB0aGF0CiAgICBzdGFydHMgYSBsaW5lCiAgICBjb21tZW50KSwgPGNvZGU+PHN0cm9uZz5ibG9ja0NvbW1lbnRTdGFydDwvc3Ryb25nPjwvY29kZT4sIDxjb2RlPjxzdHJvbmc+YmxvY2tDb21tZW50RW5kPC9zdHJvbmc+PC9jb2RlPgogICAgKHN0cmluZ3MgdGhhdCBzdGFydCBhbmQgZW5kIGJsb2NrIGNvbW1lbnRzKSwKICAgIGFuZCA8Y29kZT5ibG9ja0NvbW1lbnRMZWFkPC9jb2RlPiAoYSBzdHJpbmcgdG8gcHV0IGF0IHRoZSBzdGFydCBvZgogICAgY29udGludWVkIGxpbmVzIGluIGEgYmxvY2sgY29tbWVudCkuIEFsbCBvZiB0aGVzZSBhcmUKICAgIG9wdGlvbmFsLjwvcD4KCiAgICA8cCBpZD0iZWxlY3RyaWNDaGFycyI+RmluYWxseSwgYSBtb2RlIG1heSBkZWZpbmUgZWl0aGVyCiAgICBhbiA8Y29kZT5lbGVjdHJpY0NoYXJzPC9jb2RlPiBvciBhbiA8Y29kZT5lbGVjdHJpY0lucHV0PC9jb2RlPgogICAgcHJvcGVydHksIHdoaWNoIGFyZSB1c2VkIHRvIGF1dG9tYXRpY2FsbHkgcmVpbmRlbnQgdGhlIGxpbmUgd2hlbgogICAgY2VydGFpbiBwYXR0ZXJucyBhcmUgdHlwZWQgYW5kCiAgICB0aGUgPGEgaHJlZj0iI29wdGlvbl9lbGVjdHJpY0NoYXJzIj48Y29kZT5lbGVjdHJpY0NoYXJzPC9jb2RlPjwvYT4KICAgIG9wdGlvbiBpcyBlbmFibGVkLiA8Y29kZT5lbGVjdHJpY0NoYXJzPC9jb2RlPiBtYXkgYmUgYSBzdHJpbmcsIGFuZAogICAgd2lsbCB0cmlnZ2VyIGEgcmVpbmRlbnQgd2hlbmV2ZXIgb25lIG9mIHRoZSBjaGFyYWN0ZXJzIGluIHRoYXQKICAgIHN0cmluZyBhcmUgdHlwZWQuIE9mdGVuLCBpdCBpcyBtb3JlIGFwcHJvcHJpYXRlIHRvCiAgICB1c2UgPGNvZGU+ZWxlY3RyaWNJbnB1dDwvY29kZT4sIHdoaWNoIHNob3VsZCBob2xkIGEgcmVndWxhcgogICAgZXhwcmVzc2lvbiwgYW5kIHdpbGwgdHJpZ2dlciBpbmRlbnRhdGlvbiB3aGVuIHRoZSBwYXJ0IG9mIHRoZQogICAgbGluZSA8ZW0+YmVmb3JlPC9lbT4gdGhlIGN1cnNvciBtYXRjaGVzIHRoZSBleHByZXNzaW9uLiBJdCBzaG91bGQKICAgIHVzdWFsbHkgZW5kIHdpdGggYSA8Y29kZT4kPC9jb2RlPiBjaGFyYWN0ZXIsIHNvIHRoYXQgaXQgb25seQogICAgbWF0Y2hlcyB3aGVuIHRoZSBpbmRlbnRhdGlvbi1jaGFuZ2luZyBwYXR0ZXJuIHdhcyBqdXN0IHR5cGVkLCBub3Qgd2hlbiBzb21ldGhpbmcgd2FzCiAgICB0eXBlZCBhZnRlciB0aGUgcGF0dGVybi48L3A+CgogICAgPHA+U28sIHRvIHN1bW1hcml6ZSwgYSBtb2RlIDxlbT5tdXN0PC9lbT4gcHJvdmlkZQogICAgYSA8Y29kZT50b2tlbjwvY29kZT4gbWV0aG9kLCBhbmQgaXQgPGVtPm1heTwvZW0+CiAgICBwcm92aWRlIDxjb2RlPnN0YXJ0U3RhdGU8L2NvZGU+LCA8Y29kZT5jb3B5U3RhdGU8L2NvZGU+LAogICAgYW5kIDxjb2RlPmluZGVudDwvY29kZT4gbWV0aG9kcy4gRm9yIGFuIGV4YW1wbGUgb2YgYSB0cml2aWFsIG1vZGUsCiAgICBzZWUgdGhlIDxhIGhyZWY9Ii4uL21vZGUvZGlmZi9kaWZmLmpzIj5kaWZmIG1vZGU8L2E+LCBmb3IgYSBtb3JlCiAgICBpbnZvbHZlZCBleGFtcGxlLCBzZWUgdGhlIDxhIGhyZWY9Ii4uL21vZGUvY2xpa2UvY2xpa2UuanMiPkMtbGlrZQogICAgbW9kZTwvYT4uPC9wPgoKICAgIDxwPlNvbWV0aW1lcywgaXQgaXMgdXNlZnVsIGZvciBtb2RlcyB0byA8ZW0+bmVzdDwvZW0+4oCUdG8gaGF2ZSBvbmUKICAgIG1vZGUgZGVsZWdhdGUgd29yayB0byBhbm90aGVyIG1vZGUuIEFuIGV4YW1wbGUgb2YgdGhpcyBraW5kIG9mCiAgICBtb2RlIGlzIHRoZSA8YSBocmVmPSIuLi9tb2RlL2h0bWxtaXhlZC9odG1sbWl4ZWQuanMiPm1peGVkLW1vZGUgSFRNTAogICAgbW9kZTwvYT4uIFRvIGltcGxlbWVudCBzdWNoIG5lc3RpbmcsIGl0IGlzIHVzdWFsbHkgbmVjZXNzYXJ5IHRvCiAgICBjcmVhdGUgbW9kZSBvYmplY3RzIGFuZCBjb3B5IHN0YXRlcyB5b3Vyc2VsZi4gVG8gY3JlYXRlIGEgbW9kZQogICAgb2JqZWN0LCB0aGVyZSBhcmUgPGNvZGU+Q29kZU1pcnJvci5nZXRNb2RlKG9wdGlvbnMsCiAgICBwYXJzZXJDb25maWcpPC9jb2RlPiwgd2hlcmUgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIGEgY29uZmlndXJhdGlvbgogICAgb2JqZWN0IGFzIHBhc3NlZCB0byB0aGUgbW9kZSBjb25zdHJ1Y3RvciBmdW5jdGlvbiwgYW5kIHRoZSBzZWNvbmQKICAgIGFyZ3VtZW50IGlzIGEgbW9kZSBzcGVjaWZpY2F0aW9uIGFzIGluCiAgICB0aGUgPGEgaHJlZj0iI29wdGlvbl9tb2RlIj48Y29kZT5tb2RlPC9jb2RlPjwvYT4gb3B0aW9uLiBUbyBjb3B5IGEKICAgIHN0YXRlIG9iamVjdCwgY2FsbCA8Y29kZT5Db2RlTWlycm9yLmNvcHlTdGF0ZShtb2RlLCBzdGF0ZSk8L2NvZGU+LAogICAgd2hlcmUgPGNvZGU+bW9kZTwvY29kZT4gaXMgdGhlIG1vZGUgdGhhdCBjcmVhdGVkIHRoZSBnaXZlbgogICAgc3RhdGUuPC9wPgoKICAgIDxwIGlkPSJpbm5lck1vZGUiPkluIGEgbmVzdGVkIG1vZGUsIGl0IGlzIHJlY29tbWVuZGVkIHRvIGFkZCBhbgogICAgZXh0cmEgbWV0aG9kLCA8Y29kZT48c3Ryb25nPmlubmVyTW9kZTwvc3Ryb25nPjwvY29kZT4gd2hpY2gsIGdpdmVuCiAgICBhIHN0YXRlIG9iamVjdCwgcmV0dXJucyBhIDxjb2RlPntzdGF0ZSwgbW9kZX08L2NvZGU+IG9iamVjdCB3aXRoCiAgICB0aGUgaW5uZXIgbW9kZSBhbmQgaXRzIHN0YXRlIGZvciB0aGUgY3VycmVudCBwb3NpdGlvbi4gVGhlc2UgYXJlCiAgICB1c2VkIGJ5IHV0aWxpdHkgc2NyaXB0cyBzdWNoIGFzIHRoZSA8YSBocmVmPSIjYWRkb25fY2xvc2V0YWciPnRhZwogICAgY2xvc2VyPC9hPiB0byBnZXQgY29udGV4dCBpbmZvcm1hdGlvbi4gVXNlCiAgICB0aGUgPGNvZGU+Q29kZU1pcnJvci5pbm5lck1vZGU8L2NvZGU+IGhlbHBlciBmdW5jdGlvbiB0bywgc3RhcnRpbmcKICAgIGZyb20gYSBtb2RlIGFuZCBhIHN0YXRlLCByZWN1cnNpdmVseSB3YWxrIGRvd24gdG8gdGhlIGlubmVybW9zdAogICAgbW9kZSBhbmQgc3RhdGUuPC9wPgoKICAgIDxwPlRvIG1ha2UgaW5kZW50YXRpb24gd29yayBwcm9wZXJseSBpbiBhIG5lc3RlZCBwYXJzZXIsIGl0IGlzCiAgICBhZHZpc2FibGUgdG8gZ2l2ZSB0aGUgPGNvZGU+c3RhcnRTdGF0ZTwvY29kZT4gbWV0aG9kIG9mIG1vZGVzIHRoYXQKICAgIGFyZSBpbnRlbmRlZCB0byBiZSBuZXN0ZWQgYW4gb3B0aW9uYWwgYXJndW1lbnQgdGhhdCBwcm92aWRlcyB0aGUKICAgIGJhc2UgaW5kZW50YXRpb24gZm9yIHRoZSBibG9jayBvZiBjb2RlLiBUaGUgSmF2YVNjcmlwdCBhbmQgQ1NTCiAgICBwYXJzZXIgZG8gdGhpcywgZm9yIGV4YW1wbGUsIHRvIGFsbG93IEphdmFTY3JpcHQgYW5kIENTUyBjb2RlCiAgICBpbnNpZGUgdGhlIG1peGVkLW1vZGUgSFRNTCBtb2RlIHRvIGJlIHByb3Blcmx5IGluZGVudGVkLjwvcD4KCiAgICA8cCBpZD0iZGVmaW5lTUlNRSI+SXQgaXMgcG9zc2libGUsIGFuZCBlbmNvdXJhZ2VkLCB0byBhc3NvY2lhdGUKICAgIHlvdXIgbW9kZSwgb3IgYSBjZXJ0YWluIGNvbmZpZ3VyYXRpb24gb2YgeW91ciBtb2RlLCB3aXRoCiAgICBhIDxhIGhyZWY9Imh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTUlNRSI+TUlNRTwvYT4gdHlwZS4gRm9yCiAgICBleGFtcGxlLCB0aGUgSmF2YVNjcmlwdCBtb2RlIGFzc29jaWF0ZXMgaXRzZWxmCiAgICB3aXRoIDxjb2RlPnRleHQvamF2YXNjcmlwdDwvY29kZT4sIGFuZCBpdHMgSlNPTiB2YXJpYW50CiAgICB3aXRoIDxjb2RlPmFwcGxpY2F0aW9uL2pzb248L2NvZGU+LiBUbyBkbyB0aGlzLAogICAgY2FsbCA8Y29kZT48c3Ryb25nPkNvZGVNaXJyb3IuZGVmaW5lTUlNRTwvc3Ryb25nPihtaW1lLAogICAgbW9kZVNwZWMpPC9jb2RlPiwgd2hlcmUgPGNvZGU+bW9kZVNwZWM8L2NvZGU+IGNhbiBiZSBhIHN0cmluZyBvcgogICAgb2JqZWN0IHNwZWNpZnlpbmcgYSBtb2RlLCBhcyBpbgogICAgdGhlIDxhIGhyZWY9IiNvcHRpb25fbW9kZSI+PGNvZGU+bW9kZTwvY29kZT48L2E+IG9wdGlvbi48L3A+CgogICAgPHA+SWYgYSBtb2RlIHNwZWNpZmljYXRpb24gd2FudHMgdG8gYWRkIHNvbWUgcHJvcGVydGllcyB0byB0aGUKICAgIHJlc3VsdGluZyBtb2RlIG9iamVjdCwgdHlwaWNhbGx5IGZvciB1c2UKICAgIHdpdGggPGEgaHJlZj0iI2dldEhlbHBlcnMiPjxjb2RlPmdldEhlbHBlcnM8L2NvZGU+PC9hPiwgaXQgbWF5CiAgICBjb250YWluIGEgPGNvZGU+bW9kZVByb3BzPC9jb2RlPiBwcm9wZXJ0eSwgd2hpY2ggaG9sZHMgYW4gb2JqZWN0LgogICAgVGhpcyBvYmplY3QncyBwcm9wZXJ0aWVzIHdpbGwgYmUgY29waWVkIHRvIHRoZSBhY3R1YWwgbW9kZQogICAgb2JqZWN0LjwvcD4KCiAgICA8cCBpZD0iZXh0ZW5kTW9kZSI+U29tZXRpbWVzLCBpdCBpcyB1c2VmdWwgdG8gYWRkIG9yIG92ZXJyaWRlIG1vZGUKICAgIG9iamVjdCBwcm9wZXJ0aWVzIGZyb20gZXh0ZXJuYWwgY29kZS4KICAgIFRoZSA8Y29kZT48c3Ryb25nPkNvZGVNaXJyb3IuZXh0ZW5kTW9kZTwvc3Ryb25nPjwvY29kZT4gZnVuY3Rpb24KICAgIGNhbiBiZSB1c2VkIHRvIGFkZCBwcm9wZXJ0aWVzIHRvIG1vZGUgb2JqZWN0cyBwcm9kdWNlZCBmb3IgYQogICAgc3BlY2lmaWMgbW9kZS4gSXRzIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSBuYW1lIG9mIHRoZSBtb2RlLCBpdHMKICAgIHNlY29uZCBhbiBvYmplY3QgdGhhdCBzcGVjaWZpZXMgdGhlIHByb3BlcnRpZXMgdGhhdCBzaG91bGQgYmUKICAgIGFkZGVkLiBUaGlzIGlzIG1vc3RseSB1c2VmdWwgdG8gYWRkIHV0aWxpdGllcyB0aGF0IGNhbiBsYXRlciBiZQogICAgbG9va2VkIHVwIHRocm91Z2ggPGEgaHJlZj0iI2dldE1vZGUiPjxjb2RlPmdldE1vZGU8L2NvZGU+PC9hPi48L3A+Cjwvc2VjdGlvbj4KCjwvYXJ0aWNsZT4KCjxzY3JpcHQ+c2V0VGltZW91dChmdW5jdGlvbigpe0NvZGVNaXJyb3IuY29sb3JpemUoKTt9LCAyMCk7PC9zY3JpcHQ+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/doc/realworld.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogUmVhbC13b3JsZCBVc2VzPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iZG9jcy5jc3MiPgoKPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aW1nIGlkPWxvZ28gc3JjPSJsb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSJtYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPlJlYWwtd29ybGQgdXNlczwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgoKPGgyPkNvZGVNaXJyb3IgcmVhbC13b3JsZCB1c2VzPC9oMj4KCiAgICA8cD5DcmVhdGUgYSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9jb2RlbWlycm9yIj5wdWxsCiAgICByZXF1ZXN0PC9hPiBvciA8YSBocmVmPSJtYWlsdG86bWFyaWpuaEBnbWFpbC5jb20iPmVtYWlsIG1lPC9hPiBpZgogICAgeW91J2QgbGlrZSB5b3VyIHByb2plY3QgdG8gYmUgYWRkZWQgdG8gdGhpcyBsaXN0LjwvcD4KCiAgICA8dWw+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vYnJhY2tldHMuaW8iPkFkb2JlIEJyYWNrZXRzPC9hPiAoY29kZSBlZGl0b3IpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9hbWJlci1sYW5nLm5ldC8iPkFtYmVyPC9hPiAoSmF2YVNjcmlwdC1iYXNlZCBTbWFsbHRhbGsgc3lzdGVtKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vYXBhY2hlZ3VpLmNhLyI+QXBhY2hlIEdVSTwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2FwZXllLm9yZy8iPkFQRXllPC9hPiAodG9vbCBmb3IgdGVzdGluZyAmYW1wOyBkb2N1bWVudGluZyBBUElzKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwczovL2Nocm9tZS5nb29nbGUuY29tL3dlYnN0b3JlL2RldGFpbC9iZXR0ZXItdGV4dC12aWV3ZXIvbGNhaWRvcGRmZmhmZW1vZWZvYWFkZWNwcG5qZGtua2MiPkJldHRlciBUZXh0IFZpZXdlcjwvYT4gKHBsYWluIHRleHQgcmVhZGVyIGFwcCBmb3IgQ2hyb21lKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vYmxvZy5iaXRidWNrZXQub3JnLzIwMTMvMDUvMTQvZWRpdC15b3VyLWNvZGUtaW4tdGhlLWNsb3VkLXdpdGgtYml0YnVja2V0LyI+Qml0YnVja2V0PC9hPiAoY29kZSBob3N0aW5nKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vYnV6ei5ibG9nZ2VyLmNvbS8yMDEzLzA0L2ltcHJvdmVtZW50cy10by1ibG9nZ2VyLXRlbXBsYXRlLWh0bWwuaHRtbCI+QmxvZ2dlcidzIHRlbXBsYXRlIGVkaXRvcjwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2JsdWVncmlmZm9uLm9yZy8iPkJsdWVHcmlmZm9uPC9hPiAoSFRNTCBlZGl0b3IpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9jYXJnb2NvbGxlY3RpdmUuY29tLyI+Q2FyZ28gQ29sbGVjdGl2ZTwvYT4gKGNyZWF0aXZlIHB1Ymxpc2hpbmcgcGxhdGZvcm0pPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL2Nocm9tZS1kZXZlbG9wZXItdG9vbHMvIj5DaHJvbWUgRGV2VG9vbHM8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9jbGlja2hlbHAuY28vIj5DbGlja0hlbHA8L2E+ICh0ZWNobmljYWwgd3JpdGluZyB0b29sKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vY29kZXdvcmxkLmluZm8vIj5Db2RlV29ybGQ8L2E+IChIYXNrZWxsIHBsYXlncm91bmQpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9jb21wbGV0ZS1seS5hcHBzcG90LmNvbS9wbGF5Z3JvdW5kL2NvZGUucGxheWdyb3VuZC5odG1sIj5Db21wbGV0ZS5seSBwbGF5Z3JvdW5kPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vd3d3LmNyb3NzdWkuY29tLyI+Q3Jvc3NVSTwvYT4gKGNyb3NzLXBsYXRmb3JtIFVJIGJ1aWxkZXIpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9yc25vdXMuY29tL2NydW5jaGVyLyI+Q3J1bmNoZXI8L2E+IChub3RlcGFkIHdpdGggY2FsY3VsYXRpb24gZmVhdHVyZXMpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9kcnVwYWwub3JnL3Byb2plY3QvY3BuIj5Db2RlIHBlciBOb2RlPC9hPiAoRHJ1cGFsIG1vZHVsZSk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5jb2RlYnVnYXBwLmNvbS8iPkNvZGVidWc8L2E+IChQSFAgWGRlYnVnIGZyb250LWVuZCk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2FuZ2Vsb3plcnIvQ29kZU1pcnJvci1FY2xpcHNlIj5Db2RlTWlycm9yIEVjbGlwc2U8L2E+IChlbWJlZCBDTSBpbiBFY2xpcHNlKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vZW1tZXQuaW8vYmxvZy9jb2RlbWlycm9yLW1vdmllLyI+Q29kZU1pcnJvciBtb3ZpZTwvYT4gKHNjcmlwdGVkIGVkaXRpbmcgZGVtb3MpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9jb2RlbWlycm9yMi1nd3QvIj5Db2RlTWlycm9yMi1HV1Q8L2E+IChHb29nbGUgV2ViIFRvb2xraXQgd3JhcHBlcik8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5jcnVuY2h6aWxsYS5jb20vY29kZS1tb25zdGVyIj5Db2RlIE1vbnN0ZXI8L2E+ICYgPGEgaHJlZj0iaHR0cDovL3d3dy5jcnVuY2h6aWxsYS5jb20vY29kZS1tYXZlbiI+Q29kZSBNYXZlbjwvYT4gKGxlYXJuaW5nIGVudmlyb25tZW50KTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vY29kZXBlbi5pbyI+Q29kZXBlbjwvYT4gKGdhbGxlcnkgb2YgYW5pbWF0aW9ucyk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9jb2RlcnBhZC5pby8iPkNvZGVycGFkPC9hPiAoaW50ZXJ2aWV3aW5nIHRvb2wpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9zYXNzdHdvLmNvZGVzY2hvb2wuY29tL2xldmVscy8xL2NoYWxsZW5nZXMvMSI+Q29kZSBTY2hvb2w8L2E+IChvbmxpbmUgdGVjaCBsZWFybmluZyBlbnZpcm9ubWVudCk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2NvZGUtc25pcHBldHMuYnVuZ2VzaGVhLmNvbS8iPkNvZGUgU25pcHBldHM8L2E+IChXb3JkUHJlc3Mgc25pcHBldCBtYW5hZ2VtZW50IHBsdWdpbik8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2FudG9ubWkuZ2l0aHViLmlvL2NvZGVfdG9nZXRoZXIvIj5Db2RlIHRvZ2V0aGVyPC9hPiAoY29sbGFib3JhdGl2ZSBlZGl0aW5nKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vY29kZXYuaXQvIj5Db2RldjwvYT4gKGNvbGxhYm9yYXRpdmUgSURFKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vd3d3LmNvZGV6YW1wbGUuY29tIj5Db2RlWmFtcGxlPC9hPiAoY29kZSBzbmlwcGV0IHNoYXJpbmcpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9jb2Rpby5jb20iPkNvZGlvPC9hPiAoV2ViIElERSk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL290LnN1YnN0YW5jZS5pby9kZW1vLyI+Q29sbGFib3JhdGl2ZSBDb2RlTWlycm9yIGRlbW88L2E+IChDb2RlTWlycm9yICsgb3BlcmF0aW9uYWwgdHJhbnNmb3Jtcyk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5jb21tdW5pdHljb2RlY2FtcC5jb20vIj5Db21tdW5pdHkgQ29kZSBDYW1wPC9hPiAoY29kZSBzbmlwcGV0IHNoYXJpbmcpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cuY29tcGlsZWphdmEubmV0LyI+Y29tcGlsZWphdmEubmV0PC9hPiAob25saW5lIEphdmEgc2FuZGJveCk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5ja3duYy5jb20vIj5DS1dOQzwvYT4gKFVNTCBlZGl0b3IpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cuY3J1ZHppbGxhLmNvbS8iPkNydWR6aWxsYTwvYT4gKHNlbGYtaG9zdGVkIHdlYiBJREUpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9jc3NkZWNrLmNvbS8iPkNTU0RlY2s8L2E+IChDU1Mgc2hvd2Nhc2UpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9pcmVuZXJvcy5jb20vZGVjay9kZWNrLmpzLWNvZGVtaXJyb3IvaW50cm9kdWN0aW9uLyN0ZXh0YXJlYS1jb2RlIj5EZWNrLmpzIGludGVncmF0aW9uPC9hPiAoc2xpZGVzIHdpdGggZWRpdG9ycyk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5kYm5pbmphLmNvbSI+RGJOaW5qYTwvYT4gKE15U1FMIGFjY2VzcyBpbnRlcmZhY2UpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vY2hhdC5lY2hvcGxleC51cy8iPkVjaG9wbGV4dXM8L2E+IChjaGF0IGFuZCBjb2xsYWJvcmF0aXZlIGNvZGluZyk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5lY3NzcGVydC5jb20vIj5lQ1NTcGVydDwvYT4gKENTUyBkZW1vcyBhbmQgZXhwZXJpbWVudHMpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9lbG0tbGFuZy5vcmcvRXhhbXBsZXMuZWxtIj5FbG0gbGFuZ3VhZ2UgZXhhbXBsZXM8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9lbG9xdWVudGphdmFzY3JpcHQubmV0L2NoYXB0ZXIxLmh0bWwiPkVsb3F1ZW50IEphdmFTY3JpcHQ8L2E+IChib29rKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vZW1tZXQuaW8iPkVtbWV0PC9hPiAoZmFzdCBYTUwgZWRpdGluZyk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2VzcHJ1aW5vL0VzcHJ1aW5vV2ViSURFIj5Fc3BydWlubyBXZWIgSURFPC9hPiAoQ2hyb21lIEFwcCBmb3Igd3JpdGluZyBjb2RlIG9uIEVzcHJ1aW5vIGRldmljZXMpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cuZmFzdGZpZy5jb20vIj5GYXN0ZmlnPC9hPiAob25saW5lIGNvbXB1dGF0aW9uL21hdGggdG9vbCk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9tZXRhY3Bhbi5vcmcvbW9kdWxlL0ZhcmFiaSI+RmFyYWJpPC9hPiAobW9kZXJuIFBlcmwgSURFKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vYmxvZy5wYW1lbGFmb3gub3JnLzIwMTIvMDIvaW50ZXJhY3RpdmUtaHRtbDUtc2xpZGVzLXdpdGgtZmF0aG9tanMuaHRtbCI+RmF0aG9tSlMgaW50ZWdyYXRpb248L2E+IChzbGlkZXMgd2l0aCBlZGl0b3JzLCBhZ2Fpbik8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2ZpZGRsZXNhbGFkLmNvbS8iPkZpZGRsZSBTYWxhZDwvYT4gKHdlYiBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3NpbW9nZW8vRmlsZW1hbmFnZXIiPkZpbGVtYW5hZ2VyPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwczovL2hhY2tzLm1vemlsbGEub3JnLzIwMTMvMTEvZmlyZWZveC1kZXZlbG9wZXItdG9vbHMtZXBpc29kZS0yNy1lZGl0LWFzLWh0bWwtY29kZW1pcnJvci1tb3JlLyI+RmlyZWZveCBEZXZlbG9wZXIgVG9vbHM8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cuZmlyZXBhZC5pbyI+RmlyZXBhZDwvYT4gKGNvbGxhYm9yYXRpdmUgdGV4dCBlZGl0b3IpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvZ2Vycml0LyI+R2Vycml0PC9hPidzIGRpZmYgdmlldzwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWFrcy9naXQtY3J4Ij5HaXQgQ3J4PC9hPiAoQ2hyb21lIEFwcCBmb3IgYnJvd3NpbmcgbG9jYWwgZ2l0IHJlcG9zKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vdG91ci5nb2xhbmcub3JnIj5HbyBsYW5ndWFnZSB0b3VyPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vZ2l0aHViL2FuZHJvaWQiPkdpdEh1YidzIEFuZHJvaWQgYXBwPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwczovL3NjcmlwdC5nb29nbGUuY29tLyI+R29vZ2xlIEFwcHMgU2NyaXB0PC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vd2ViLnV2aWMuY2EvfnNpZWZrZW5qL2dyYXBoaXQvZ3JhcGhpdC5odG1sIj5HcmFwaGl0PC9hPiAoZnVuY3Rpb24gZ3JhcGhpbmcpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cuaGFuZGNyYWZ0LmNvbS8iPkhhbmRjcmFmdDwvYT4gKEhUTUwgcHJvdG90eXBpbmcpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly90cnkuaGF4ZS5vcmciPkhheGU8L2E+IChIYXhlIFBsYXlncm91bmQpIDwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vaGF4cGFkLmNvbS8iPkhheFBhZDwvYT4gKGVkaXRvciBmb3IgV2luIFJUKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vbWVnYWZvbndlYmxhYi5naXRodWIuY29tL2hpc3RvbmUtamF2YXNjcmlwdC8iPkhpc3RvbmUgdGVtcGxhdGUgZW5naW5lIHBsYXlncm91bmQ8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9pY2Vjb2Rlci5uZXQiPklDRWNvZGVyPC9hPiAod2ViIElERSk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2ktbW9zLm9yZy9pbW9zLyI+aS1NT1M8L2E+IChtb2RlbGluZyBhbmQgc2ltdWxhdGlvbiBwbGF0Zm9ybSk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5qYW52YXMuY29tLyI+SmFudmFzPC9hPiAodmVjdG9yIGdyYXBoaWNzIGVkaXRvcik8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2V4dGVuc2lvbnMuam9vbWxhLm9yZy9leHRlbnNpb25zL2VkaXRpb24vZWRpdG9ycy84NzIzIj5Kb29tbGEgcGx1Z2luPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vanFmdW5kYW1lbnRhbHMuY29tLyI+alF1ZXJ5IGZ1bmRhbWVudGFsczwvYT4gKGludGVyYWN0aXZlIHR1dG9yaWFsKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vanNiaW4uY29tIj5qc2Jpbi5jb208L2E+IChKUyBwbGF5Z3JvdW5kKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20va3VjaGVyZW5rby9qc2NwZCI+anNjcGQ8L2E+IChjb2RlIGR1cGxpY2F0aW9uIGRldGVjdG9yKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vanNmaWRkbGUuY29tIj5qc2ZpZGRsZS5jb208L2E+IChhbm90aGVyIEpTIHBsYXlncm91bmQpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cuanNoaW50LmNvbS8iPkpTSGludDwvYT4gKEpTIGxpbnRlcik8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2p1bXBzZWxsZXIuY29tLyI+SnVtcHNlbGxlcjwvYT4gKG9ubGluZSBzdG9yZSBidWlsZGVyKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8va2wxcC5jb20vY210ZXN0LzEiPmtsMXA8L2E+IChwYXN0ZSBzZXJ2aWNlKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8va29kdGVzdC5jb20vIj5Lb2R0ZXN0PC9hPiAoSFRNTC9KUy9DU1MgcGxheWdyb3VuZCk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9sYWJvcmF0ZS5pby8iPkxhYm9yYXRlPC9hPiAoY29sbGFib3JhdGl2ZSBjb2RpbmcpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9saWdodHRhYmxlLmNvbS8iPkxpZ2h0IFRhYmxlPC9hPiAoZXhwZXJpbWVudGFsIElERSk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2xpdmV3ZWF2ZS5jb20vIj5MaXZld2VhdmU8L2E+IChIVE1ML0NTUy9KUyBzY3JhdGNocGFkKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vbWFya2xpZ2h0ZWRpdG9yLmNvbS8iPk1hcmtsaWdodCBlZGl0b3I8L2E+IChsaWdodHdlaWdodCBtYXJrdXAgZWRpdG9yKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vd3d3Lm1lcmdlbHkuY29tLyI+TWVyZ2VseTwvYT4gKGludGVyYWN0aXZlIGRpZmZpbmcpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cuaXVuYnVnLmNvbS9taWh0b29sIj5NSUhUb29sPC9hPiAoaU9TIHdlYi1hcHAgZGVidWdnaW5nIHRvb2wpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9tb25nby1tYXByZWR1Y2Utd2ViYnJvd3Nlci5vcGVuc2FncmVzLmNsb3VkYmVlcy5uZXQvIj5Nb25nbyBNYXBSZWR1Y2UgV2ViQnJvd3NlcjwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL21vbnRhZ2VzdHVkaW8uY29tLyI+TW9udGFnZSBTdHVkaW88L2E+ICh3ZWIgYXBwIGNyZWF0b3Igc3VpdGUpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9tdmNwbGF5Z3JvdW5kLmFwcGhiLmNvbS8iPk1WQyBQbGF5Z3JvdW5kPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwczovL3d3dy5teTJuZGdlbmVyYXRpb24uY29tLyI+TXkybmRHZW5lcmF0aW9uPC9hPiAoc29jaWFsIGNvZGluZyk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5uYXZpZ2F0ZWNtcy5jb20iPk5hdmlnYXRlIENNUzwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3NvbGl0b240L25vZGVNaXJyb3IiPm5vZGVNaXJyb3I8L2E+IChJREUgcHJvamVjdCk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9ub3RleC5jaCI+Tm9UZXg8L2E+IChyU1QgYXV0aG9yaW5nKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vb2Frb3V0bGluZXIuY29tIj5PYWs8L2E+IChvbmxpbmUgb3V0bGluZXIpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9jbHJob21lLm9yZy9hc20vIj5PUkc8L2E+ICh6ODAgYXNzZW1ibHkgSURFKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWFtYWNkb24vb3Jpb24tY29kZW1pcnJvciI+T3Jpb24tQ29kZU1pcnJvciBpbnRlZ3JhdGlvbjwvYT4gKHJ1bm5pbmcgQ29kZU1pcnJvciBtb2RlcyBpbiBPcmlvbik8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3BhcGVyanMub3JnLyI+UGFwZXIuanM8L2E+IChncmFwaGljcyBzY3JpcHRpbmcpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9wcmluYml0LmNvbS8iPlByaW5CaXQ8L2E+IChjb2xsYWJvcmF0aXZlIGNvZGluZyB0b29sKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vcHJvc2UuaW8vIj5Qcm9zZS5pbzwvYT4gKGdpdGh1YiBjb250ZW50IGVkaXRvcik8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5wdXp6bGVzY3JpcHQubmV0LyI+UHV6emxlc2NyaXB0PC9hPiAocHV6emxlIGdhbWUgZW5naW5lKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vcWwuaW8vIj5xbC5pbzwvYT4gKGh0dHAgQVBJIHF1ZXJ5IGhlbHBlcik8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3F5YXBwLmNvbSI+UWlZdW4gd2ViIGFwcCBwbGF0Zm9ybTwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2FyaXlhLm9maWxhYnMuY29tLzIwMTEvMDkvaHlicmlkLXdlYm5hdGl2ZS1kZXNrdG9wLWNvZGVtaXJyb3IuaHRtbCI+UXQrV2Via2l0IGludGVncmF0aW9uPC9hPiAoYnVpbGRpbmcgYSBkZXNrdG9wIENvZGVNaXJyb3IgYXBwKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vd3d3LnF1aXZpdmUtZmlsZS1tYW5hZ2VyLmNvbSI+UXVpdml2ZSBGaWxlIE1hbmFnZXI8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9yYXNjYWxtaWNyby5jb20vZG9jcy9iYXNpYy10dXRvcmlhbC1nZXR0aW5nLXN0YXJ0ZWQuaHRtbCI+UmFzY2FsPC9hPiAodGlueSBjb21wdXRlcik8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly93d3cucmVhbHRpbWUuaW8vIj5SZWFsVGltZS5pbzwvYT4gKEludGVybmV0LW9mLVRoaW5ncyBpbmZyYXN0cnVjdHVyZSk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9jbG91ZC5zYWdlbWF0aC5jb20vIj5TYWdlTWF0aENsb3VkPC9hPiAoaW50ZXJhY3RpdmUgbWF0aGVtYXRpY2FsIHNvZnR3YXJlIGVudmlyb25tZW50KTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwczovL2Nocm9tZS5nb29nbGUuY29tL3dlYnN0b3JlL2RldGFpbC9zZXJ2ZXBocC9tbnBpa29tZGNoamhraGJobWJib2VoZmRqa29iYmZwbyI+U2VydmVQSFA8L2E+IChQSFAgY29kZSB0ZXN0aW5nIGluIENocm9tZSBkZXYgdG9vbHMpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vd3d3LnNoYWRlcnRveS5jb20vIj5TaGFkZXJ0b3k8L2E+IChzaGFkZXIgc2hhcmluZyk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5za2V0Y2hwYXRjaC5uZXQvbGFicy9saXZlY29kZWxhYkludHJvLmh0bWwiPnNrZXRjaFBhdGNoIExpdmVjb2RlbGFiPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vd3d3LnNrdWxwdC5vcmcvIj5Ta3VscHQ8L2E+IChpbi1icm93c2VyIFB5dGhvbiBlbnZpcm9ubWVudCk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3NuaXBwZXRzLnByby8iPlNuaXBwZXRzLnBybzwvYT4gKGNvZGUgc25pcHBldCBzaGFyaW5nKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vd3d3LnNvbGlkc2hvcHMuY29tLyI+U29saWRTaG9wczwvYT4gKGhvc3RlZCBlLWNvbW1lcmNlIHBsYXRmb3JtKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vc3FsZmlkZGxlLmNvbSI+U1FMRmlkZGxlPC9hPiAoU1FMIHBsYXlncm91bmQpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cudGFnc3BhY2VzLm9yZy8iPlRhZ1NwYWNlczwvYT4gKHBlcnNvbmFsIGRhdGEgbWFuYWdlcik8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly90aGVmaWxldHJlZS5jb20iPlRoZSBGaWxlIFRyZWU8L2E+IChjb2xsYWIgZWRpdG9yKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vd3d3Lm1hcGJveC5jb20vdGlsZW1pbGwvIj5UaWxlTWlsbDwvYT4gKG1hcCBkZXNpZ24gdG9vbCk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3d3dy50b29sc3ZlcnNlLmNvbS9wcm9kdWN0cy9kYXRhLWV4cGxvcmVyLyI+VG9vbHN2ZXJzZSBEYXRhIEV4cGxvcmVyPC9hPiAoZGF0YWJhc2UgbWFuYWdlbWVudCk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2VuamFsb3QuY29tL3RyaWJ1dGFyeS8yNjM2Mjk2L3NpbndhdmVzLmpzIj5UcmlidXRhcnk8L2E+IChhdWdtZW50ZWQgZWRpdGluZyk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2Jsb2cuZW5nbGFyZC5uZXQvcG9zdC8zOTYwODAwMDYyOS9jb2RlaW50dW1ibHIiPlR1bWJsciBjb2RlIGhpZ2hsaWdodGluZyBzaGltPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vdHVyYm9weS5jb20vIj5UdXJib1BZPC9hPiAod2ViIHB1Ymxpc2hpbmcgZnJhbWV3b3JrKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vdWljb2QuY29tLyI+dWlDb2Q8L2E+IChhbmltYXRpb24gZGVtbyBnYWxsZXJ5IGFuZCBzaGFyaW5nKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vY3J1aXNlLmVlY3MudW90dGF3YS5jYS91bXBsZW9ubGluZS8iPlVtcGxlT25saW5lPC9hPiAobW9kZWwtb3JpZW50ZWQgcHJvZ3JhbW1pbmcgdG9vbCk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly91cHNvdXJjZS5qZXRicmFpbnMuY29tLyNpZGVhL3ZpZXcvOTIzZjMwMzk1ZjI2MDNjZDlmNDJhMzJiY2FmZDEzYjZjMjhkZTBmZi9wbHVnaW5zL2dyb292eS9zcmMvb3JnL2pldGJyYWlucy9wbHVnaW5zL2dyb292eS9pbnRlbnRpb25zL3N0eWxlL1JlcGxhY2VBYnN0cmFjdENsYXNzSW5zdGFuY2VCeU1hcEludGVudGlvbi5qYXZhIj5VcHNvdXJjZTwvYT4gKGNvZGUgdmlld2VyKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vYnJldHR6OS93ZWJhcHBmaW5kIj53ZWJhcHBmaW5kPC9hPiAod2luZG93cyBmaWxlIGJpbmRpbmdzIGZvciB3ZWJhcHBzKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vd3d3LndlYmdsYWNhZGVteS5jb20vIj5XZWJHTCBhY2FkZW15PC9hPiAobGVhcm5pbmcgV2ViR0wpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93ZWJnbHBsYXlncm91bmQubmV0LyI+V2ViR0wgcGxheWdyb3VuZDwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly93d3cud2Via2l0Lm9yZy9ibG9nLzI1MTgvc3RhdGUtb2Ytd2ViLWluc3BlY3Rvci8jc291cmNlLWNvZGUiPldlYktpdCBXZWIgaW5zcGVjdG9yPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vd3d3Lndlc2NoZW1lLm9yZy8iPldlU2NoZW1lPC9hPiAobGVhcm5pbmcgdG9vbCk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3dvcmRwcmVzcy5vcmcvZXh0ZW5kL3BsdWdpbnMvY29kZW1pcnJvci1mb3ItY29kZWVkaXRvci8iPldvcmRQcmVzcyBwbHVnaW48L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vd3d3LndyaXRlbGF0ZXguY29tIj53cml0ZUxhVGVYPC9hPiAoQ29sbGFib3JhdGl2ZSBMYVRlWCBFZGl0b3IpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cueG9zeXN0ZW0ub3JnL2hvbWUvYXBwbGljYXRpb25zX3dlYnNpdGVzL3hvc3lzdGVtX3dlYnNpdGUveG9zaWRlX0VOLnBocCI+WE9TaWRlPC9hPiAob25saW5lIGVkaXRvcik8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3ZpZGVsaWJyaS5zb3VyY2Vmb3JnZS5uZXQvY2dpLWJpbi94aWRlbGNnaSI+WFF1ZXJ5IHRlc3RlcjwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3E0MmphYXAuZ2l0aHViLmlvL3hzZDJjb2RlbWlycm9yLyI+eHNkMmNvZGVtaXJyb3I8L2E+IChjb252ZXJ0IFhTRCB0byBDTSBYTUwgY29tcGxldGlvbiBpbmZvKTwvbGk+CiAgICA8L3VsPgoKPC9hcnRpY2xlPgoK]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/doc/releases.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogUmVsZWFzZSBIaXN0b3J5PC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iZG9jcy5jc3MiPgo8c2NyaXB0IHNyYz0iYWN0aXZlYm9va21hcmsuanMiPjwvc2NyaXB0PgoKPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aW1nIGlkPWxvZ28gc3JjPSJsb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSJtYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGRhdGEtZGVmYXVsdD0idHJ1ZSIgaHJlZj0iI3Y0Ij5WZXJzaW9uIDQueDwvYT4KICAgIDxsaT48YSBocmVmPSIjdjMiPlZlcnNpb24gMy54PC9hPgogICAgPGxpPjxhIGhyZWY9IiN2MiI+VmVyc2lvbiAyLng8L2E+CiAgICA8bGk+PGEgaHJlZj0iI3YxIj5WZXJzaW9uIDAueDwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgoKPGgyPlJlbGVhc2Ugbm90ZXMgYW5kIHZlcnNpb24gaGlzdG9yeTwvaDI+Cgo8c2VjdGlvbiBpZD12MyBjbGFzcz1maXJzdD4KCiAgPGgyIGlkPSJ2NCI+VmVyc2lvbiA0Lng8L2gyPgoKICA8cCBjbGFzcz0icmVsIj4yMS0wNy0yMDE0OiA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvY29kZW1pcnJvci00LjQuemlwIj5WZXJzaW9uIDQuNDwvYT46PC9wPgoKICA8dWwgY2xhc3M9InJlbC1ub3RlIj4KICAgIDxsaT48c3Ryb25nPk5vdGU6PC9zdHJvbmc+IFNvbWUgZXZlbnRzIG1pZ2h0IG5vdyBmaXJlIGluIHNsaWdodGx5CiAgICBkaWZmZXJlbnQgb3JkZXIgKDxjb2RlPiJjaGFuZ2UiPC9jb2RlPiBpcyBzdGlsbCBndWFyYW50ZWVkIHRvIGZpcmUKICAgIGJlZm9yZSA8Y29kZT4iY3Vyc29yQWN0aXZpdHkiPC9jb2RlPik8L2xpPgogICAgPGxpPk5lc3RlZCBvcGVyYXRpb25zIGluIG11bHRpcGxlIGVkaXRvcnMgYXJlIG5vdyBzeW5jZWQgKGNvbXBsZXRlCiAgICBhdCBzYW1lIHRpbWUsIHJlZHVjaW5nIERPTSByZWZsb3dzKTwvbGk+CiAgICA8bGk+VmlzdWFsIGJsb2NrIG1vZGUgZm9yIDxhIGhyZWY9Ii4uL2RlbW8vdmltLmh0bWwiPnZpbTwvYT4gKCZsdDtDLXY+KSBpcyBuZWFybHkgY29tcGxldGU8L2xpPgogICAgPGxpPk5ldyBtb2RlOiA8YSBocmVmPSIuLi9tb2RlL2tvdGxpbi9pbmRleC5odG1sIj5Lb3RsaW48L2E+PC9saT4KICAgIDxsaT5CZXR0ZXIgbXVsdGktc2VsZWN0aW9uIHBhc3RlIGZvciB0ZXh0IGNvcGllZCBmcm9tIG11bHRpcGxlIENvZGVNaXJyb3Igc2VsZWN0aW9uczwvbGk+CiAgICA8bGk+RnVsbCA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9Db2RlTWlycm9yL2NvbXBhcmUvNC4zLjAuLi40LjQuMCI+bGlzdCBvZiBwYXRjaGVzPC9hPi48L2xpPgogIDwvdWw+CgogIDxwIGNsYXNzPSJyZWwiPjIzLTA2LTIwMTQ6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTQuMy56aXAiPlZlcnNpb24gNC4zPC9hPjo8L3A+CgogIDx1bCBjbGFzcz0icmVsLW5vdGUiPgogICAgPGxpPlNldmVyYWwgPGEgaHJlZj0iLi4vZGVtby92aW0uaHRtbCI+dmltIGJpbmRpbmdzPC9hPgogICAgaW1wcm92ZW1lbnRzOiBzZWFyY2ggYW5kIGV4Q29tbWFuZCBoaXN0b3J5LCBnbG9iYWwgZmxhZwogICAgZm9yIDxjb2RlPjpzdWJzdGl0dXRlPC9jb2RlPiwgPGNvZGU+Omdsb2JhbDwvY29kZT4gY29tbWFuZC4KICAgIDxsaT5BbGxvdyBoaWRpbmcgdGhlIGN1cnNvciBieQogICAgc2V0dGluZyA8YSBocmVmPSJtYW51YWwuaHRtbCNvcHRpb25fY3Vyc29yQmxpbmtSYXRlIj48Y29kZT5jdXJzb3JCbGlua1JhdGU8L2NvZGU+PC9hPgogICAgdG8gYSBuZWdhdGl2ZSB2YWx1ZS48L2xpPgogICAgPGxpPk1ha2UgZ3V0dGVyIG1hcmtlcnMgdGhlbWVhYmxlLCB1c2UgdGhpcyBpbiBmb2xkZ3V0dGVyLjwvbGk+CiAgICA8bGk+RnVsbCA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9Db2RlTWlycm9yL2NvbXBhcmUvNC4yLjAuLi40LjMuMCI+bGlzdCBvZiBwYXRjaGVzPC9hPi48L2xpPgogIDwvdWw+CgogIDxwIGNsYXNzPSJyZWwiPjE5LTA1LTIwMTQ6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTQuMi56aXAiPlZlcnNpb24gNC4yPC9hPjo8L3A+CgogIDx1bCBjbGFzcz0icmVsLW5vdGUiPgogICAgPGxpPkZpeCBwcm9ibGVtIHdoZXJlIHNvbWUgbW9kZXMgd2VyZSBicm9rZW4gYnkgdGhlIGZhY3QgdGhhdCBlbXB0eSB0b2tlbnMgd2VyZSBmb3JiaWRkZW4uPC9saT4KICAgIDxsaT5TZXZlcmFsIGZpeGVzIHRvIGNvbnRleHQgbWVudSBoYW5kbGluZy48L2xpPgogICAgPGxpPk9uIHVuZG8sIHNjcm9sbCA8ZW0+Y2hhbmdlPC9lbT4sIG5vdCBjdXJzb3IsIGludG8gdmlldy48L2xpPgogICAgPGxpPlJld3JpdHRlbiA8YSBocmVmPSIuLi9tb2RlL2phZGUvaW5kZXguaHRtbCI+SmFkZTwvYT4gbW9kZS48L2xpPgogICAgPGxpPlZhcmlvdXMgaW1wcm92ZW1lbnRzIHRvIDxhIGhyZWY9Ii4uL21vZGUvc2hlbGwvaW5kZXguaHRtbCI+U2hlbGw8L2E+IChzdXBwb3J0IGZvciBtb3JlIHN5bnRheCkgYW5kIDxhIGhyZWY9Ii4uL21vZGUvcHl0aG9uL2luZGV4Lmh0bWwiPlB5dGhvbjwvYT4gKGJldHRlciBpbmRlbnRhdGlvbikgbW9kZXMuPC9saT4KICAgIDxsaT5OZXcgbW9kZTogPGEgaHJlZj0iLi4vbW9kZS9jeXBoZXIvaW5kZXguaHRtbCI+Q3lwaGVyPC9hPi48L2xpPgogICAgPGxpPk5ldyB0aGVtZTogPGEgaHJlZj0iLi4vZGVtby90aGVtZS5odG1sP25lbyI+TmVvPC9hPi48L2xpPgogICAgPGxpPlN1cHBvcnQgZGlyZWN0IHN0eWxpbmcgb3B0aW9ucyAoY29sb3IsIGxpbmUgc3R5bGUsIHdpZHRoKSBpbiB0aGUgPGEgaHJlZj0ibWFudWFsLmh0bWwjYWRkb25fcnVsZXJzIj5ydWxlcnM8L2E+IGFkZG9uLjwvbGk+CiAgICA8bGk+UmVjb2duaXplIHBlci1lZGl0b3IgY29uZmlndXJhdGlvbiBmb3IgdGhlIDxhIGhyZWY9Im1hbnVhbC5odG1sI2FkZG9uX3Nob3ctaGludCI+c2hvdy1oaW50PC9hPiBhbmQgPGEgaHJlZj0ibWFudWFsLmh0bWwjYWRkb25fZm9sZGNvZGUiPmZvbGRjb2RlPC9hPiBhZGRvbnMuPC9saT4KICAgIDxsaT5Nb3JlIGludGVsbGlnZW50IHNjYW5uaW5nIGZvciBleGlzdGluZyBjbG9zZSB0YWdzIGluIDxhIGhyZWY9Im1hbnVhbC5odG1sI2FkZG9uX2Nsb3NldGFnIj5jbG9zZXRhZzwvYT4gYWRkb24uPC9saT4KICAgIDxsaT5JbiB0aGUgPGEgaHJlZj0iLi4vZGVtby92aW0uaHRtbCI+VmltIGJpbmRpbmdzPC9hPjogRml4IGJyYWNrZXQgbWF0Y2hpbmcsIHN1cHBvcnQgY2FzZSBjb252ZXJzaW9uIGluIHZpc3VhbCBtb2RlLCB2aXN1YWwgcGFzdGUsIGFwcGVuZCBhY3Rpb24uPC9saT4KICAgIDxsaT5GdWxsIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL0NvZGVNaXJyb3IvY29tcGFyZS80LjEuMC4uLjQuMi4wIj5saXN0IG9mIHBhdGNoZXM8L2E+LjwvbGk+CiAgPC91bD4KCiAgPHAgY2xhc3M9InJlbCI+MjItMDQtMjAxNDogPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2NvZGVtaXJyb3ItNC4xLnppcCI+VmVyc2lvbiA0LjE8L2E+OjwvcD4KCiAgPHVsIGNsYXNzPSJyZWwtbm90ZSI+CiAgICA8bGk+PGVtPlNsaWdodGx5IGluY29tcGF0aWJsZTwvZW0+OgogICAgVGhlIDxhIGhyZWY9Im1hbnVhbC5odG1sI2V2ZW50X2N1cnNvckFjdGl2aXR5Ij48Y29kZT4iY3Vyc29yQWN0aXZpdHkiPC9jb2RlPjwvYT4KICAgIGV2ZW50IG5vdyBmaXJlcyBhZnRlciBhbGwgb3RoZXIgZXZlbnRzIGZvciB0aGUgb3BlcmF0aW9uIChhbmQgb25seQogICAgZm9yIGhhbmRsZXJzIHRoYXQgd2VyZSBhY3R1YWxseSByZWdpc3RlcmVkIGF0IHRoZSB0aW1lIHRoZQogICAgYWN0aXZpdHkgaGFwcGVuZWQpLjwvbGk+CiAgICA8bGk+TmV3IGNvbW1hbmQ6IDxhIGhyZWY9Im1hbnVhbC5odG1sI2NvbW1hbmRfaW5zZXJ0U29mdFRhYiI+PGNvZGU+aW5zZXJ0U29mdFRhYjwvY29kZT48L2E+LjwvbGk+CiAgICA8bGk+TmV3IG1vZGU6IDxhIGhyZWY9Ii4uL21vZGUvZGphbmdvL2luZGV4Lmh0bWwiPkRqYW5nbzwvYT4uPC9saT4KICAgIDxsaT5JbXByb3ZlZCBtb2RlczogPGEgaHJlZj0iLi4vbW9kZS92ZXJpbG9nL2luZGV4Lmh0bWwiPlZlcmlsb2c8L2E+IChyZXdyaXR0ZW4pLCA8YSBocmVmPSIuLi9tb2RlL2ppbmphMi9pbmRleC5odG1sIj5KaW5qYTI8L2E+LCA8YSBocmVmPSIuLi9tb2RlL2hheGUvaW5kZXguaHRtbCI+SGF4ZTwvYT4sIDxhIGhyZWY9Ii4uL21vZGUvcGhwL2luZGV4Lmh0bWwiPlBIUDwvYT4gKHN0cmluZyBpbnRlcnBvbGF0aW9uIGhpZ2hsaWdodGVkKSwgPGEgaHJlZj0iLi4vbW9kZS9qYXZhc2NyaXB0L2luZGV4Lmh0bWwiPkphdmFTY3JpcHQ8L2E+IChpbmRlbnRhdGlvbiBvZiB0cmFpbGluZyBlbHNlLCB0ZW1wbGF0ZSBzdHJpbmdzKSwgPGEgaHJlZj0iLi4vbW9kZS9saXZlc2NyaXB0L2luZGV4Lmh0bWwiPkxpdmVTY3JpcHQ8L2E+IChtdWx0aS1saW5lIHN0cmluZ3MpLjwvbGk+CiAgICA8bGk+TWFueSBzbWFsbCBpc3N1ZXMgZnJvbSB0aGUgMy544oaSNC54IHRyYW5zaXRpb24gd2VyZSBmb3VuZCBhbmQgZml4ZWQuPC9saT4KICAgIDxsaT5GdWxsIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL0NvZGVNaXJyb3IvY29tcGFyZS80LjAuMy4uLjQuMS4wIj5saXN0IG9mIHBhdGNoZXM8L2E+LjwvbGk+CiAgPC91bD4KCiAgPHAgY2xhc3M9InJlbCI+MjAtMDMtMjAxNDogPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2NvZGVtaXJyb3ItNC4wLnppcCI+VmVyc2lvbiA0LjA8L2E+OjwvcD4KCiAgPHAgY2xhc3M9InJlbC1ub3RlIj5UaGlzIGlzIGEgbmV3IG1ham9yIHZlcnNpb24gb2YgQ29kZU1pcnJvci4gVGhlcmUKICBhcmUgYSBmZXcgPHN0cm9uZz5pbmNvbXBhdGlibGU8L3N0cm9uZz4gY2hhbmdlcyBpbiB0aGUgQVBJLiBVcGdyYWRlCiAgd2l0aCBjYXJlLCBhbmQgcmVhZCB0aGUgPGEgaHJlZj0idXBncmFkZV92NC5odG1sIj51cGdyYWRpbmcKICBndWlkZTwvYT4uPC9wPgoKICA8dWwgY2xhc3M9InJlbC1ub3RlIj4KICAgIDxsaT5NdWx0aXBsZSBzZWxlY3Rpb25zIChjdHJsLWNsaWNrLCBhbHQtZHJhZywgPGEgaHJlZj0ibWFudWFsLmh0bWwjc2V0U2VsZWN0aW9ucyI+QVBJPC9hPikuPC9saT4KICAgIDxsaT5TdWJsaW1lIFRleHQgPGEgaHJlZj0iLi4vZGVtby9zdWJsaW1lLmh0bWwiPmJpbmRpbmdzPC9hPi48L2xpPgogICAgPGxpPjxhIGhyZWY9Im1hbnVhbC5odG1sI21vZGxvYWRlciI+TW9kdWxlIGxvYWRlciBzaGltczwvYT4gd3JhcHBlZCBhcm91bmQgYWxsIG1vZHVsZXMuPC9saT4KICAgIDxsaT5TZWxlY3Rpb24gPGEgaHJlZj0ibWFudWFsLmh0bWwjY29tbWFuZF91bmRvU2VsZWN0aW9uIj51bmRvPC9hPi88YSBocmVmPSJtYW51YWwuaHRtbCNjb21tYW5kX3JlZG9TZWxlY3Rpb24iPnJlZG88L2E+LjwvbGk+CiAgICA8bGk+SW1wcm92ZWQgY2hhcmFjdGVyIG1lYXN1cmluZyAoZmFzdGVyLCBoYW5kbGVzIHdyYXBwZWQgbGluZXMgbW9yZSByb2J1c3RseSkuPC9saT4KICAgIDxsaT5GdWxsIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL0NvZGVNaXJyb3IvY29tcGFyZS8zLjIzLjAuLi40LjAuMyI+bGlzdCBvZiBwYXRjaGVzPC9hPi48L2xpPgogIDwvdWw+CgogIDxoMiBpZD0idjMiPlZlcnNpb24gMy54PC9oMj4KCiAgPHAgY2xhc3M9InJlbCI+MjItMDQtMjAxNDogPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2NvZGVtaXJyb3ItMy4yNC56aXAiPlZlcnNpb24gMy4yNDwvYT46PC9wPgoKICA8cCBjbGFzcz0icmVsLW5vdGUiPk1lcmdlcyB0aGUgaW1wcm92ZW1lbnRzIGZyb20gNC4xIHRoYXQgY291bGQKICBlYXNpbHkgYmUgYXBwbGllZCB0byB0aGUgMy54IGNvZGUuIEFsc28gaW1wcm92ZXMgdGhlIHdheSB0aGUgZWRpdG9yCiAgc2l6ZSBpcyB1cGRhdGVkIHdoZW4gbGluZSB3aWRnZXRzIGNoYW5nZS48L3A+CgogIDxwIGNsYXNzPSJyZWwiPjIwLTAzLTIwMTQ6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTMuMjMuemlwIj5WZXJzaW9uIDMuMjM8L2E+OjwvcD4KCiAgPHVsIGNsYXNzPSJyZWwtbm90ZSI+CiAgICA8bGk+SW4gdGhlIDxhIGhyZWY9Ii4uL21vZGUveG1sL2luZGV4Lmh0bWwiPlhNTCBtb2RlPC9hPiwKICAgIGFkZCA8Y29kZT5icmFja2V0czwvY29kZT4gc3R5bGUgdG8gYW5nbGUgYnJhY2tldHMsIGZpeAogICAgY2FzZS1zZW5zaXRpdml0eSBvZiB0YWdzIGZvciBIVE1MLjwvbGk+CiAgICA8bGk+TmV3IG1vZGU6IDxhIGhyZWY9Ii4uL21vZGUvZHlsYW4vaW5kZXguaHRtbCI+RHlsYW48L2E+LjwvbGk+CiAgICA8bGk+TWFueSBpbXByb3ZlbWVudHMgdG8gdGhlIDxhIGhyZWY9Ii4uL2RlbW8vdmltLmh0bWwiPlZpbSBiaW5kaW5nczwvYT4uPC9saT4KICA8L3VsPgoKICA8cCBjbGFzcz0icmVsIj4yMS0wMi0yMDE0OiA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvY29kZW1pcnJvci0zLjIyLnppcCI+VmVyc2lvbiAzLjIyPC9hPjo8L3A+CgogIDx1bCBjbGFzcz0icmVsLW5vdGUiPgogICAgPGxpPkFkZHMgdGhlIDxhIGhyZWY9Im1hbnVhbC5odG1sI2ZpbmRNYXJrcyI+PGNvZGU+ZmluZE1hcmtzPC9jb2RlPjwvYT4gbWV0aG9kLjwvbGk+CiAgICA8bGk+TmV3IGFkZG9uczogPGEgaHJlZj0ibWFudWFsLmh0bWwjYWRkb25fcnVsZXJzIj5ydWxlcnM8L2E+LCBtYXJrZG93bi1mb2xkLCB5YW1sLWxpbnQuPC9saT4KICAgIDxsaT5OZXcgdGhlbWU6IDxhIGhyZWY9Ii4uL2RlbW8vdGhlbWUuaHRtbD9tZG4tbGlrZSI+bWRuLWxpa2U8L2E+LjwvbGk+CiAgICA8bGk+TmV3IG1vZGU6IDxhIGhyZWY9Ii4uL21vZGUvc29sci9pbmRleC5odG1sIj5Tb2xyPC9hPi48L2xpPgogICAgPGxpPkZ1bGwgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvQ29kZU1pcnJvci9jb21wYXJlLzMuMjEuMC4uLjMuMjIuMCI+bGlzdCBvZiBwYXRjaGVzPC9hPi48L2xpPgogIDwvdWw+CgogIDxwIGNsYXNzPSJyZWwiPjE2LTAxLTIwMTQ6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTMuMjEuemlwIj5WZXJzaW9uIDMuMjE8L2E+OjwvcD4KCiAgPHVsIGNsYXNzPSJyZWwtbm90ZSI+CiAgICA8bGk+QXV0by1pbmRlbnRpbmcgYSBibG9jayB3aWxsIG5vIGxvbmdlciBhZGQgdHJhaWxpbmcgd2hpdGVzcGFjZSB0byBibGFuayBsaW5lcy48L2E+CiAgICA8bGk+TWFya2luZyB0ZXh0IGhhcyBhIG5ldyBvcHRpb24gPGEgaHJlZj0ibWFudWFsLmh0bWwjbWFya1RleHQiPjxjb2RlPmNsZWFyV2hlbkVtcHR5PC9jb2RlPjwvYT4gdG8gY29udHJvbCBhdXRvLXJlbW92YWwuPC9saT4KICAgIDxsaT5TZXZlcmFsIGJ1Z2ZpeGVzIGluIHRoZSBoYW5kbGluZyBvZiBiaWRpcmVjdGlvbmFsIHRleHQuPC9saT4KICAgIDxsaT5UaGUgPGEgaHJlZj0iLi4vbW9kZS94bWwvaW5kZXguaHRtbCI+WE1MPC9hPiBhbmQgPGEgaHJlZj0iLi4vbW9kZS9jc3MvaW5kZXguaHRtbCI+Q1NTPC9hPiBtb2RlcyB3ZXJlIGxhcmdlbHkgcmV3cml0dGVuLiA8YSBocmVmPSIuLi9tb2RlL2Nzcy9sZXNzLmh0bWwiPkxFU1M8L2E+IHN1cHBvcnQgd2FzIGFkZGVkIHRvIHRoZSBDU1MgbW9kZS48L2xpPgogICAgPGxpPlRoZSBPQ2FtbCBtb2RlIHdhcyBtb3ZlZCB0byBhbiA8YSBocmVmPSIuLi9tb2RlL21sbGlrZS9pbmRleC5odG1sIj5tbGxpa2U8L2E+IG1vZGUsIEYjIHN1cHBvcnQgYWRkZWQuPC9saT4KICAgIDxsaT5NYWtlIGl0IHBvc3NpYmxlIHRvIGZldGNoIG11bHRpcGxlIGFwcGxpY2FibGUgaGVscGVyIHZhbHVlcyB3aXRoIDxhIGhyZWY9Im1hbnVhbC5odG1sI2dldEhlbHBlcnMiPjxjb2RlPmdldEhlbHBlcnM8L2NvZGU+PC9hPiwgYW5kIHRvIHJlZ2lzdGVyIGhlbHBlcnMgbWF0Y2hlZCBvbiBwcmVkaWNhdGVzIHdpdGggPGEgaHJlZj0ibWFudWFsLmh0bWwjcmVnaXN0ZXJHbG9iYWxIZWxwZXIiPjxjb2RlPnJlZ2lzdGVyR2xvYmFsSGVscGVyPC9jb2RlPjwvYT4uPC9saT4KICAgIDxsaT5OZXcgdGhlbWUgPGEgaHJlZj0iLi4vZGVtby90aGVtZS5odG1sP3Bhc3RlbC1vbi1kYXJrIj5wYXN0ZWwtb24tZGFyazwvYT4uPC9saT4KICAgIDxsaT5CZXR0ZXIgRUNNQVNjcmlwdCA2IHN1cHBvcnQgaW4gPGEgaHJlZj0iLi4vbW9kZS9qYXZhc2NyaXB0L2luZGV4Lmh0bWwiPkphdmFTY3JpcHQ8L2E+IG1vZGUuPC9saT4KICAgIDxsaT5GdWxsIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL0NvZGVNaXJyb3IvY29tcGFyZS8zLjIwLjAuLi4zLjIxLjAiPmxpc3Qgb2YgcGF0Y2hlczwvYT4uPC9saT4KICA8L3VsPgoKICA8cCBjbGFzcz0icmVsIj4yMS0xMS0yMDEzOiA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvY29kZW1pcnJvci0zLjIwLnppcCI+VmVyc2lvbiAzLjIwPC9hPjo8L3A+CgogIDx1bCBjbGFzcz0icmVsLW5vdGUiPgogICAgPGxpPk5ldyBtb2RlczogPGEgaHJlZj0iLi4vbW9kZS9qdWxpYS9pbmRleC5odG1sIj5KdWxpYTwvYT4gYW5kIDxhIGhyZWY9Ii4uL21vZGUvcGVnanMvaW5kZXguaHRtbCI+UEVHLmpzPC9hPi48L2xpPgogICAgPGxpPlN1cHBvcnQgRUNNQVNjcmlwdCA2IGluIHRoZSA8YSBocmVmPSIuLi9tb2RlL2phdmFzY3JpcHQvaW5kZXguaHRtbCI+SmF2YVNjcmlwdCBtb2RlPC9hPi48L2xpPgogICAgPGxpPkltcHJvdmVkIGluZGVudGF0aW9uIGZvciB0aGUgPGEgaHJlZj0iLi4vbW9kZS9jb2ZmZWVzY3JpcHQvaW5kZXguaHRtbCI+Q29mZmVlU2NyaXB0IG1vZGU8L2E+LjwvbGk+CiAgICA8bGk+TWFrZSBub24tcHJpbnRhYmxlLWNoYXJhY3RlciByZXByZXNlbnRhdGlvbiA8YSBocmVmPSJtYW51YWwuaHRtbCNvcHRpb25fc3BlY2lhbENoYXJzIj5jb25maWd1cmFibGU8L2E+LjwvbGk+CiAgICA8bGk+QWRkIOKAmG5vdGlmaWNhdGlvbuKAmSBmdW5jdGlvbmFsaXR5IHRvIDxhIGhyZWY9Im1hbnVhbC5odG1sI2FkZG9uX2RpYWxvZyI+ZGlhbG9nPC9hPiBhZGRvbi48L2xpPgogICAgPGxpPkZ1bGwgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvQ29kZU1pcnJvci9jb21wYXJlLzMuMTkuMC4uLjMuMjAuMCI+bGlzdCBvZiBwYXRjaGVzPC9hPi48L2xpPgogIDwvdWw+CgogIDxwIGNsYXNzPSJyZWwiPjIxLTEwLTIwMTM6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTMuMTkuemlwIj5WZXJzaW9uIDMuMTk8L2E+OjwvcD4KCiAgPHVsIGNsYXNzPSJyZWwtbm90ZSI+CiAgICA8bGk+TmV3IG1vZGVzOiA8YSBocmVmPSIuLi9tb2RlL2VpZmZlbC9pbmRleC5odG1sIj5FaWZmZWw8L2E+LCA8YSBocmVmPSIuLi9tb2RlL2doZXJraW4vaW5kZXguaHRtbCI+R2hlcmtpbjwvYT4sIDxhIGhyZWY9Ii4uL21vZGUvc3FsLz9taW1lPXRleHQveC1tc3NxbCI+TVNTUUwgZGlhbGVjdDwvYT4uPC9saT4KICAgIDxsaT5OZXcgYWRkb25zOiA8YSBocmVmPSJtYW51YWwuaHRtbCNhZGRvbl9oYXJkd3JhcCI+aGFyZHdyYXA8L2E+LCA8YSBocmVmPSJtYW51YWwuaHRtbCNhZGRvbl9zcWwtaGludCI+c3FsLWhpbnQ8L2E+LjwvbGk+CiAgICA8bGk+TmV3IHRoZW1lOiA8YSBocmVmPSIuLi9kZW1vL3RoZW1lLmh0bWw/bWJvIj5NQk88L2E+LjwvbGk+CiAgICA8bGk+QWRkIDxhIGhyZWY9Im1hbnVhbC5odG1sI3Rva2VuX3N0eWxlX2xpbmUiPnN1cHBvcnQ8L2E+IGZvciBsaW5lLWxldmVsIHN0eWxpbmcgZnJvbSBtb2RlIHRva2VuaXplcnMuPC9saT4KICAgIDxsaT5GdWxsIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL0NvZGVNaXJyb3IvY29tcGFyZS8zLjE4LjAuLi4zLjE5LjAiPmxpc3Qgb2YgcGF0Y2hlczwvYT4uPC9saT4KICA8L3VsPgoKICA8cCBjbGFzcz0icmVsIj4yMy0wOS0yMDEzOiA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvY29kZW1pcnJvci0zLjE4LnppcCI+VmVyc2lvbiAzLjE4PC9hPjo8L3A+CgogIDxwIGNsYXNzPSJyZWwtbm90ZSI+RW1lcmdlbmN5IHJlbGVhc2UgdG8gZml4IGEgcHJvYmxlbSBpbiAzLjE3CiAgd2hlcmUgPGNvZGU+LnNldE9wdGlvbigibGluZU51bWJlcnMiLCBmYWxzZSk8L2NvZGU+IHdvdWxkIHJhaXNlIGFuCiAgZXJyb3IuPC9wPgoKICA8cCBjbGFzcz0icmVsIj4yMy0wOS0yMDEzOiA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvY29kZW1pcnJvci0zLjE3LnppcCI+VmVyc2lvbiAzLjE3PC9hPjo8L3A+CgogIDx1bCBjbGFzcz0icmVsLW5vdGUiPgogICAgPGxpPk5ldyBtb2RlczogPGEgaHJlZj0iLi4vbW9kZS9mb3J0cmFuL2luZGV4Lmh0bWwiPkZvcnRyYW48L2E+LCA8YSBocmVmPSIuLi9tb2RlL29jdGF2ZS9pbmRleC5odG1sIj5PY3RhdmU8L2E+IChNYXRsYWIpLCA8YSBocmVmPSIuLi9tb2RlL3RvbWwvaW5kZXguaHRtbCI+VE9NTDwvYT4sIGFuZCA8YSBocmVmPSIuLi9tb2RlL2R0ZC9pbmRleC5odG1sIj5EVEQ8L2E+LjwvbGk+CiAgICA8bGk+TmV3IGFkZG9uczogPGEgaHJlZj0iLi4vYWRkb24vbGludC9jc3MtbGludC5qcyI+PGNvZGU+Y3NzLWxpbnQ8L2NvZGU+PC9hPiwgPGEgaHJlZj0ibWFudWFsLmh0bWwjYWRkb25fY3NzLWhpbnQiPjxjb2RlPmNzcy1oaW50PC9jb2RlPjwvYT4uPC9saT4KICAgIDxsaT5JbXByb3ZlIHJlc2lsaWVuY2UgdG8gQ1NTICdmcmFtZXdvcmtzJyB0aGF0IGdsb2JhbGx5IG1lc3MgdXAgPGNvZGU+Ym94LXNpemluZzwvY29kZT4uPC9saT4KICAgIDxsaT5GdWxsIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL0NvZGVNaXJyb3IvY29tcGFyZS8zLjE2LjAuLi4zLjE3LjAiPmxpc3Qgb2YgcGF0Y2hlczwvYT4uPC9saT4KICA8L3VsPgoKICA8cCBjbGFzcz0icmVsIj4yMS0wOC0yMDEzOiA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvY29kZW1pcnJvci0zLjE2LnppcCI+VmVyc2lvbiAzLjE2PC9hPjo8L3A+CgogIDx1bCBjbGFzcz0icmVsLW5vdGUiPgogICAgPGxpPlRoZSB3aG9sZSBjb2RlYmFzZSBpcyBub3cgdW5kZXIgYSBzaW5nbGUgPGEgaHJlZj0iLi4vTElDRU5TRSI+bGljZW5zZTwvYT4gZmlsZS48L2xpPgogICAgPGxpPlRoZSBwcm9qZWN0IHBhZ2Ugd2FzIG92ZXJoYXVsZWQgYW5kIHJlZGVzaWduZWQuPC9saT4KICAgIDxsaT5OZXcgdGhlbWVzOiA8YSBocmVmPSIuLi9kZW1vL3RoZW1lLmh0bWw/cGFyYWlzby1kYXJrIj5QYXJhaXNvPC9hPiAoPGEgaHJlZj0iLi4vZGVtby90aGVtZS5odG1sP3BhcmFpc28tbGlnaHQiPmxpZ2h0PC9hPiksIDxhIGhyZWY9Ii4uL2RlbW8vdGhlbWUuaHRtbD90aGUtbWF0cml4Ij5UaGUgTWF0cml4PC9hPi48L2xpPgogICAgPGxpPkltcHJvdmVkIGludGVyYWN0aW9uIGJldHdlZW4gdGhlbWVzIGFuZCA8YSBocmVmPSJtYW51YWwuaHRtbCNhZGRvbl9hY3RpdmUtbGluZSI+YWN0aXZlLWxpbmU8L2E+LzxhIGhyZWY9Im1hbnVhbC5odG1sI2FkZG9uX21hdGNoYnJhY2tldHMiPm1hdGNoYnJhY2tldHM8L2E+IGFkZG9ucy48L2xpPgogICAgPGxpPk5ldyA8YSBocmVmPSJtYW51YWwuaHRtbCNhZGRvbl9mb2xkY29kZSI+Zm9sZGluZzwvYT4gZnVuY3Rpb24gPGNvZGU+Q29kZU1pcnJvci5mb2xkLmNvbW1lbnQ8L2NvZGU+LjwvbGk+CiAgICA8bGk+QWRkZWQgPGEgaHJlZj0ibWFudWFsLmh0bWwjYWRkb25fZnVsbHNjcmVlbiI+ZnVsbHNjcmVlbjwvYT4gYWRkb24uPC9saT4KICAgIDxsaT5GdWxsIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL0NvZGVNaXJyb3IvY29tcGFyZS8zLjE1LjAuLi4zLjE2LjAiPmxpc3Qgb2YgcGF0Y2hlczwvYT4uPC9saT4KICA8L3VsPgoKICA8cCBjbGFzcz0icmVsIj4yOS0wNy0yMDEzOiA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvY29kZW1pcnJvci0zLjE1LnppcCI+VmVyc2lvbiAzLjE1PC9hPjo8L3A+CgogIDx1bCBjbGFzcz0icmVsLW5vdGUiPgogICAgPGxpPk5ldyBtb2RlczogPGEgaHJlZj0iLi4vbW9kZS9qYWRlL2luZGV4Lmh0bWwiPkphZGU8L2E+LCA8YSBocmVmPSIuLi9tb2RlL25naW54L2luZGV4Lmh0bWwiPk5naW54PC9hPi48L2xpPgogICAgPGxpPk5ldyBhZGRvbnM6IDxhIGhyZWY9Ii4uL2RlbW8vdGVybi5odG1sIj5UZXJuPC9hPiwgPGEgaHJlZj0ibWFudWFsLmh0bWwjYWRkb25fbWF0Y2h0YWdzIj5tYXRjaHRhZ3M8L2E+LCBhbmQgPGEgaHJlZj0ibWFudWFsLmh0bWwjYWRkb25fZm9sZGd1dHRlciI+Zm9sZGd1dHRlcjwvYT4uPC9saT4KICAgIDxsaT5JbnRyb2R1Y2VkIDxhIGhyZWY9Im1hbnVhbC5odG1sI2dldEhlbHBlciI+PGVtPmhlbHBlcjwvZW0+PC9hPiBjb25jZXB0ICg8YSBocmVmPSJodHRwczovL2dyb3Vwcy5nb29nbGUuY29tL2ZvcnVtLyMhbXNnL2NvZGVtaXJyb3IvY09jMHh2VVVFVVUvbkxyWDEtcW5pZGdKIj5jb250ZXh0PC9hPikuPC9saT4KICAgIDxsaT5OZXcgbWV0aG9kOiA8YSBocmVmPSJtYW51YWwuaHRtbCNnZXRNb2RlQXQiPjxjb2RlPmdldE1vZGVBdDwvY29kZT48L2E+LjwvbGk+CiAgICA8bGk+TmV3IHRoZW1lczogYmFzZTE2IDxhIGhyZWY9Ii4uL2RlbW8vdGhlbWUuaHRtbD9iYXNlMTYtZGFyayI+ZGFyazwvYT4vPGEgaHJlZj0iLi4vZGVtby90aGVtZS5odG1sP2Jhc2UxNi1saWdodCI+bGlnaHQ8L2E+LCAzMDI0IDxhIGhyZWY9Ii4uL2RlbW8vdGhlbWUuaHRtbD8zMDI0LW5pZ2h0Ij5kYXJrPC9hPi88YSBocmVmPSIuLi9kZW1vL3RoZW1lLmh0bWw/MzAyNC1kYXkiPmxpZ2h0PC9hPiwgPGEgaHJlZj0iLi4vZGVtby90aGVtZS5odG1sP3RvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzIj50b21vcnJvdy1uaWdodDwvYT4uPC9saT4KICAgIDxsaT5GdWxsIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL0NvZGVNaXJyb3IvY29tcGFyZS8zLjE0LjAuLi4zLjE1LjAiPmxpc3Qgb2YgcGF0Y2hlczwvYT4uPC9saT4KICA8L3VsPgoKICA8cCBjbGFzcz0icmVsIj4yMC0wNi0yMDEzOiA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvY29kZW1pcnJvci0zLjE0LnppcCI+VmVyc2lvbiAzLjE0PC9hPjo8L3A+CgogIDx1bCBjbGFzcz0icmVsLW5vdGUiPgogICAgPGxpPk5ldwogICAgYWRkb25zOiA8YSBocmVmPSJtYW51YWwuaHRtbCNhZGRvbl90cmFpbGluZ3NwYWNlIj50cmFpbGluZwogICAgc3BhY2UgaGlnaGxpZ2h0PC9hPiwgPGEgaHJlZj0ibWFudWFsLmh0bWwjYWRkb25feG1sLWhpbnQiPlhNTAogICAgY29tcGxldGlvbjwvYT4gKHJld3JpdHRlbiksCiAgICBhbmQgPGEgaHJlZj0ibWFudWFsLmh0bWwjYWRkb25fbWVyZ2UiPmRpZmYgbWVyZ2luZzwvYT4uPC9saT4KICAgIDxsaT48YSBocmVmPSJtYW51YWwuaHRtbCNtYXJrVGV4dCI+PGNvZGU+bWFya1RleHQ8L2NvZGU+PC9hPgogICAgYW5kIDxhIGhyZWY9Im1hbnVhbC5odG1sI2FkZExpbmVXaWRnZXQiPjxjb2RlPmFkZExpbmVXaWRnZXQ8L2NvZGU+PC9hPgogICAgbm93IHRha2UgYSA8Y29kZT5oYW5kbGVNb3VzZUV2ZW50czwvY29kZT4gb3B0aW9uLjwvbGk+CiAgICA8bGk+TmV3IG1ldGhvZHM6IDxhIGhyZWY9Im1hbnVhbC5odG1sI2xpbmVBdEhlaWdodCI+PGNvZGU+bGluZUF0SGVpZ2h0PC9jb2RlPjwvYT4sCiAgICA8YSBocmVmPSJtYW51YWwuaHRtbCNnZXRUb2tlblR5cGVBdCI+PGNvZGU+Z2V0VG9rZW5UeXBlQXQ8L2NvZGU+PC9hPi48L2xpPgogICAgPGxpPk1vcmUgcHJlY2lzZSBjbGVhbm5lc3MtdHJhY2tpbmcKICAgIHVzaW5nIDxhIGhyZWY9Im1hbnVhbC5odG1sI2NoYW5nZUdlbmVyYXRpb24iPjxjb2RlPmNoYW5nZUdlbmVyYXRpb248L2NvZGU+PC9hPgogICAgYW5kIDxhIGhyZWY9Im1hbnVhbC5odG1sI2lzQ2xlYW4iPjxjb2RlPmlzQ2xlYW48L2NvZGU+PC9hPi48L2xpPgogICAgPGxpPk1hbnkgZXh0ZW5zaW9ucyB0byA8YSBocmVmPSIuLi9kZW1vL2VtYWNzLmh0bWwiPkVtYWNzPC9hPiBtb2RlCiAgICAocHJlZml4ZXMsIG1vcmUgbmF2aWdhdGlvbiB1bml0cywgYW5kIG1vcmUpLjwvbGk+CiAgICA8bGk+TmV3CiAgICBldmVudHMgPGEgaHJlZj0ibWFudWFsLmh0bWwjZXZlbnRfa2V5SGFuZGxlZCI+PGNvZGU+ImtleUhhbmRsZWQiPC9jb2RlPjwvYT4KICAgIGFuZCA8YSBocmVmPSJtYW51YWwuaHRtbCNldmVudF9pbnB1dFJlYWQiPjxjb2RlPiJpbnB1dFJlYWQiPC9jb2RlPjwvYT4uPC9saT4KICAgIDxsaT5WYXJpb3VzIGltcHJvdmVtZW50cyB0byA8YSBocmVmPSIuLi9tb2RlL3J1YnkvaW5kZXguaHRtbCI+UnVieTwvYT4sCiAgICA8YSBocmVmPSIuLi9tb2RlL3NtYXJ0eS9pbmRleC5odG1sIj5TbWFydHk8L2E+LCA8YSBocmVmPSIuLi9tb2RlL3NxbC9pbmRleC5odG1sIj5TUUw8L2E+LAogICAgYW5kIDxhIGhyZWY9Ii4uL2RlbW8vdmltLmh0bWwiPlZpbTwvYT4gbW9kZXMuPC9saT4KICAgIDxsaT5GdWxsIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL0NvZGVNaXJyb3IvY29tcGFyZS8zLjEzLjAuLi4zLjE0LjAiPmxpc3Qgb2YgcGF0Y2hlczwvYT4uPC9saT4KICA8L3VsPgoKICA8cCBjbGFzcz0icmVsIj4yMC0wNS0yMDEzOiA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvY29kZW1pcnJvci0zLjEzLnppcCI+VmVyc2lvbiAzLjEzPC9hPjo8L3A+CgogIDx1bCBjbGFzcz0icmVsLW5vdGUiPgogICAgPGxpPk5ldyBtb2RlczogPGEgaHJlZj0iLi4vbW9kZS9jb2JvbC9pbmRleC5odG1sIj5DT0JPTDwvYT4gYW5kIDxhIGhyZWY9Ii4uL21vZGUvaGFtbC9pbmRleC5odG1sIj5IQU1MPC9hPi48L2xpPgogICAgPGxpPk5ldyBvcHRpb25zOiA8YSBocmVmPSJtYW51YWwuaHRtbCNvcHRpb25fY3Vyc29yU2Nyb2xsTWFyZ2luIj48Y29kZT5jdXJzb3JTY3JvbGxNYXJnaW48L2NvZGU+PC9hPiBhbmQgPGEgaHJlZj0ibWFudWFsLmh0bWwjb3B0aW9uX2NvdmVyR3V0dGVyTmV4dFRvU2Nyb2xsYmFyIj48Y29kZT5jb3Zlckd1dHRlck5leHRUb1Njcm9sbGJhcjwvY29kZT48L2E+LjwvbGk+CiAgICA8bGk+TmV3IGFkZG9uOiA8YSBocmVmPSJtYW51YWwuaHRtbCNhZGRvbl9jb21tZW50Ij5jb21tZW50aW5nPC9hPi48L2xpPgogICAgPGxpPk1vcmUgZmVhdHVyZXMgYWRkZWQgdG8gdGhlIDxhIGhyZWY9Ii4uL2RlbW8vdmltLmh0bWwiPlZpbSBrZXltYXA8L2E+LjwvbGk+CiAgICA8bGk+RnVsbCA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9Db2RlTWlycm9yL2NvbXBhcmUvdjMuMTIuLi4zLjEzLjAiPmxpc3Qgb2YgcGF0Y2hlczwvYT4uPC9saT4KICA8L3VsPgoKICA8cCBjbGFzcz0icmVsIj4xOS0wNC0yMDEzOiA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvY29kZW1pcnJvci0zLjEyLnppcCI+VmVyc2lvbiAzLjEyPC9hPjo8L3A+CgogIDx1bCBjbGFzcz0icmVsLW5vdGUiPgogICAgPGxpPk5ldyBtb2RlOiA8YSBocmVmPSIuLi9tb2RlL2dhcy9pbmRleC5odG1sIj5HTlUgYXNzZW1ibGVyPC9hPi48L2xpPgogICAgPGxpPk5ldwogICAgb3B0aW9uczogPGEgaHJlZj0ibWFudWFsLmh0bWwjb3B0aW9uX21heEhpZ2hsaWdodExlbmd0aCI+PGNvZGU+bWF4SGlnaGxpZ2h0TGVuZ3RoPC9jb2RlPjwvYT4KICAgIGFuZCA8YSBocmVmPSJtYW51YWwuaHRtbCNvcHRpb25faGlzdG9yeUV2ZW50RGVsYXkiPjxjb2RlPmhpc3RvcnlFdmVudERlbGF5PC9jb2RlPjwvYT4uPC9saT4KICAgIDxsaT5BZGRlZCA8YSBocmVmPSJtYW51YWwuaHRtbCNtYXJrX2FkZFRvSGlzdG9yeSI+PGNvZGU+YWRkVG9IaXN0b3J5PC9jb2RlPjwvYT4KICAgIG9wdGlvbiBmb3IgPGNvZGU+bWFya1RleHQ8L2NvZGU+LjwvbGk+CiAgICA8bGk+VmFyaW91cyBmaXhlcyB0byBKYXZhU2NyaXB0IHRva2VuaXphdGlvbiBhbmQgaW5kZW50YXRpb24gY29ybmVyIGNhc2VzLjwvbGk+CiAgICA8bGk+RnVydGhlciBpbXByb3ZlbWVudHMgdG8gdGhlIHZpbSBtb2RlLjwvbGk+CiAgICA8bGk+RnVsbCA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9Db2RlTWlycm9yL2NvbXBhcmUvdjMuMTEuLi52My4xMiI+bGlzdCBvZiBwYXRjaGVzPC9hPi48L2xpPgogIDwvdWw+CgogIDxwIGNsYXNzPSJyZWwiPjIwLTAzLTIwMTM6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTMuMTEuemlwIj5WZXJzaW9uIDMuMTE8L2E+OjwvcD4KCiAgPHVsIGNsYXNzPSJyZWwtbm90ZSI+CiAgICA8bGk+PHN0cm9uZz5SZW1vdmVkIGNvZGU6PC9zdHJvbmc+IDxjb2RlPmNvbGxhcHNlcmFuZ2U8L2NvZGU+LAogICAgPGNvZGU+Zm9ybWF0dGluZzwvY29kZT4sIGFuZCA8Y29kZT5zaW1wbGUtaGludDwvY29kZT4KICAgIGFkZG9ucy4gPGNvZGU+cGxzcWw8L2NvZGU+IGFuZCA8Y29kZT5teXNxbDwvY29kZT4gbW9kZXMKICAgICh1c2UgPGEgaHJlZj0iLi4vbW9kZS9zcWwvaW5kZXguaHRtbCI+PGNvZGU+c3FsPC9jb2RlPjwvYT4gbW9kZSkuPC9saT4KICAgIDxsaT48c3Ryb25nPk1vdmVkIGNvZGU6PC9zdHJvbmc+IHRoZSByYW5nZS1maW5kaW5nIGZ1bmN0aW9ucyBmb3IgZm9sZGluZyBub3cgaGF2ZSA8YSBocmVmPSIuLi9hZGRvbi9mb2xkLyI+dGhlaXIgb3duIGZpbGVzPC9hPi48L2xpPgogICAgPGxpPjxzdHJvbmc+Q2hhbmdlZCBpbnRlcmZhY2U6PC9zdHJvbmc+CiAgICB0aGUgPGEgaHJlZj0ibWFudWFsLmh0bWwjYWRkb25fY29udGludWVjb21tZW50Ij48Y29kZT5jb250aW51ZWNvbW1lbnQ8L2NvZGU+PC9hPgogICAgYWRkb24gbm93IGV4cG9zZXMgYW4gb3B0aW9uLCByYXRoZXIgdGhhbiBhIGNvbW1hbmQuPC9saT4KICAgIDxsaT5OZXcKICAgIG1vZGVzOiA8YSBocmVmPSIuLi9tb2RlL2Nzcy9zY3NzLmh0bWwiPlNDU1M8L2E+LCA8YSBocmVmPSIuLi9tb2RlL3RjbC9pbmRleC5odG1sIj5UY2w8L2E+LCA8YSBocmVmPSIuLi9tb2RlL2xpdmVzY3JpcHQvaW5kZXguaHRtbCI+TGl2ZVNjcmlwdDwvYT4sCiAgICBhbmQgPGEgaHJlZj0iLi4vbW9kZS9taXJjL2luZGV4Lmh0bWwiPm1JUkM8L2E+LjwvbGk+CiAgICA8bGk+TmV3IGFkZG9uczogPGEgaHJlZj0iLi4vZGVtby9wbGFjZWhvbGRlci5odG1sIj48Y29kZT5wbGFjZWhvbGRlcjwvY29kZT48L2E+LCA8YSBocmVmPSIuLi9kZW1vL2h0bWw1Y29tcGxldGUuaHRtbCI+SFRNTCBjb21wbGV0aW9uPC9hPi48L2xpPgogICAgPGxpPk5ldwogICAgbWV0aG9kczogPGEgaHJlZj0ibWFudWFsLmh0bWwjaGFzRm9jdXMiPjxjb2RlPmhhc0ZvY3VzPC9jb2RlPjwvYT4sIDxhIGhyZWY9Im1hbnVhbC5odG1sI2RlZmF1bHRDaGFyV2lkdGgiPjxjb2RlPmRlZmF1bHRDaGFyV2lkdGg8L2NvZGU+PC9hPi48L2xpPgogICAgPGxpPk5ldyBldmVudHM6IDxhIGhyZWY9Im1hbnVhbC5odG1sI2V2ZW50X2JlZm9yZUN1cnNvckVudGVyIj48Y29kZT5iZWZvcmVDdXJzb3JFbnRlcjwvY29kZT48L2E+LCA8YSBocmVmPSJtYW51YWwuaHRtbCNldmVudF9yZW5kZXJMaW5lIj48Y29kZT5yZW5kZXJMaW5lPC9jb2RlPjwvYT4uPC9saT4KICAgIDxsaT5NYW55IGltcHJvdmVtZW50cyB0byB0aGUgPGEgaHJlZj0ibWFudWFsLmh0bWwjYWRkb25fc2hvdy1oaW50Ij48Y29kZT5zaG93LWhpbnQ8L2NvZGU+PC9hPiBjb21wbGV0aW9uCiAgICBkaWFsb2cgYWRkb24uPC9saT4KICAgIDxsaT5Ud2VhayBiZWhhdmlvciBvZiBieS13b3JkIGN1cnNvciBtb3Rpb24uPC9saT4KICAgIDxsaT5GdXJ0aGVyIGltcHJvdmVtZW50cyB0byB0aGUgPGEgaHJlZj0iLi4vZGVtby92aW0uaHRtbCI+dmltIG1vZGU8L2E+LjwvbGk+CiAgICA8bGk+RnVsbCA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9Db2RlTWlycm9yL2NvbXBhcmUvdjMuMS4uLnYzLjExIj5saXN0IG9mIHBhdGNoZXM8L2E+LjwvbGk+CiAgPC91bD4KCiAgPHAgY2xhc3M9InJlbCI+MjEtMDItMjAxMzogPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2NvZGVtaXJyb3ItMy4xLnppcCI+VmVyc2lvbiAzLjE8L2E+OjwvcD4KCiAgPHVsIGNsYXNzPSJyZWwtbm90ZSI+CiAgICA8bGk+PHN0cm9uZz5JbmNvbXBhdGlibGU6PC9zdHJvbmc+IGtleSBoYW5kbGVycyBtYXkKICAgIG5vdyA8ZW0+cmV0dXJuPC9lbT4sIHJhdGhlcgogICAgdGhhbiA8ZW0+dGhyb3c8L2VtPiA8Y29kZT5Db2RlTWlycm9yLlBhc3M8L2NvZGU+IHRvIHNpZ25hbCB0aGV5CiAgICBkaWRuJ3QgaGFuZGxlIHRoZSBrZXkuPC9saT4KICAgIDxsaT5NYWtlIGRvY3VtZW50cyBhIDxhIGhyZWY9Im1hbnVhbC5odG1sI2FwaV9kb2MiPmZpcnN0LWNsYXNzCiAgICBjb25zdHJ1Y3Q8L2E+LCBzdXBwb3J0IHNwbGl0IHZpZXdzIGFuZCBzdWJ2aWV3cy48L2xpPgogICAgPGxpPkFkZCBhIDxhIGhyZWY9Im1hbnVhbC5odG1sI2FkZG9uX3Nob3ctaGludCI+bmV3IG1vZHVsZTwvYT4KICAgIGZvciBzaG93aW5nIGNvbXBsZXRpb24gaGludHMuCiAgICBEZXByZWNhdGUgPGNvZGU+c2ltcGxlLWhpbnQuanM8L2NvZGU+LjwvbGk+CiAgICA8bGk+RXh0ZW5kIDxhIGhyZWY9Ii4uL21vZGUvaHRtbG1peGVkL2luZGV4Lmh0bWwiPmh0bWxtaXhlZCBtb2RlPC9hPgogICAgdG8gYWxsb3cgY3VzdG9tIGhhbmRsaW5nIG9mIHNjcmlwdCB0eXBlcy48L2xpPgogICAgPGxpPlN1cHBvcnQgYW4gPGNvZGU+aW5zZXJ0TGVmdDwvY29kZT4gb3B0aW9uCiAgICB0byA8YSBocmVmPSJtYW51YWwuaHRtbCNzZXRCb29rbWFyayI+PGNvZGU+c2V0Qm9va21hcms8L2NvZGU+PC9hPi48L2xpPgogICAgPGxpPkFkZCBhbiA8YSBocmVmPSJtYW51YWwuaHRtbCNlYWNoTGluZSI+PGNvZGU+ZWFjaExpbmU8L2NvZGU+PC9hPgogICAgbWV0aG9kIHRvIGl0ZXJhdGUgb3ZlciBhIGRvY3VtZW50LjwvbGk+CiAgICA8bGk+TmV3IGFkZG9uIG1vZHVsZXM6IDxhIGhyZWY9Ii4uL2RlbW8vbWFya3NlbGVjdGlvbi5odG1sIj5zZWxlY3Rpb24KICAgIG1hcmtpbmc8L2E+LCA8YSBocmVmPSIuLi9kZW1vL2xpbnQuaHRtbCI+bGludGluZzwvYT4sCiAgICBhbmQgPGEgaHJlZj0iLi4vZGVtby9jbG9zZWJyYWNrZXRzLmh0bWwiPmF1dG9tYXRpYyBicmFja2V0CiAgICBjbG9zaW5nPC9hPi48L2xpPgogICAgPGxpPkFkZCA8YSBocmVmPSJtYW51YWwuaHRtbCNldmVudF9iZWZvcmVDaGFuZ2UiPjxjb2RlPiJiZWZvcmVDaGFuZ2UiPC9jb2RlPjwvYT4KICAgIGFuZCA8YSBocmVmPSJtYW51YWwuaHRtbCNldmVudF9iZWZvcmVTZWxlY3Rpb25DaGFuZ2UiPjxjb2RlPiJiZWZvcmVTZWxlY3Rpb25DaGFuZ2UiPC9jb2RlPjwvYT4KICAgIGV2ZW50cy48L2xpPgogICAgPGxpPkFkZCA8YSBocmVmPSJtYW51YWwuaHRtbCNldmVudF9oaWRlIj48Y29kZT4iaGlkZSI8L2NvZGU+PC9hPgogICAgYW5kIDxhIGhyZWY9Im1hbnVhbC5odG1sI2V2ZW50X3VuaGlkZSI+PGNvZGU+InVuaGlkZSI8L2NvZGU+PC9hPgogICAgZXZlbnRzIHRvIG1hcmtlZCByYW5nZXMuPC9saT4KICAgIDxsaT5GaXggPGEgaHJlZj0ibWFudWFsLmh0bWwjY29vcmRzQ2hhciI+PGNvZGU+Y29vcmRzQ2hhcjwvY29kZT48L2E+J3MKICAgIGludGVycHJldGF0aW9uIG9mIGl0cyBhcmd1bWVudCB0byBtYXRjaCB0aGUgZG9jdW1lbnRhdGlvbi48L2xpPgogICAgPGxpPk5ldyBtb2RlczogPGEgaHJlZj0iLi4vbW9kZS90dXJ0bGUvaW5kZXguaHRtbCI+VHVydGxlPC9hPgogICAgYW5kIDxhIGhyZWY9Ii4uL21vZGUvcS9pbmRleC5odG1sIj5RPC9hPi48L2xpPgogICAgPGxpPkZ1cnRoZXIgaW1wcm92ZW1lbnRzIHRvIHRoZSA8YSBocmVmPSIuLi9kZW1vL3ZpbS5odG1sIj52aW0gbW9kZTwvYT4uPC9saT4KICAgIDxsaT5GdWxsIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL0NvZGVNaXJyb3IvY29tcGFyZS92My4wMS4uLnYzLjEiPmxpc3Qgb2YgcGF0Y2hlczwvYT4uPC9saT4KICA8L3VsPgogIAoKICA8cCBjbGFzcz0icmVsIj4yNS0wMS0yMDEzOiA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvY29kZW1pcnJvci0zLjAyLnppcCI+VmVyc2lvbiAzLjAyPC9hPjo8L3A+CgogIDxwIGNsYXNzPSJyZWwtbm90ZSI+U2luZ2xlLWJ1Z2ZpeCByZWxlYXNlLiBGaXhlcyBhIHByb2JsZW0gdGhhdAogIHByZXZlbnRzIENvZGVNaXJyb3IgaW5zdGFuY2VzIGZyb20gYmVpbmcgZ2FyYmFnZS1jb2xsZWN0ZWQgYWZ0ZXIKICB0aGV5IGJlY29tZSB1bnVzZWQuPC9wPgoKICA8cCBjbGFzcz0icmVsIj4yMS0wMS0yMDEzOiA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvY29kZW1pcnJvci0zLjAxLnppcCI+VmVyc2lvbiAzLjAxPC9hPjo8L3A+CgogIDx1bCBjbGFzcz0icmVsLW5vdGUiPgogICAgPGxpPk1vdmUgYWxsIGFkZC1vbnMgaW50byBhbiBvcmdhbml6ZWQgZGlyZWN0b3J5IHN0cnVjdHVyZQogICAgdW5kZXIgPGEgaHJlZj0iLi4vYWRkb24vIj48Y29kZT4vYWRkb248L2NvZGU+PC9hPi4gPHN0cm9uZz5Zb3UgbWlnaHQgaGF2ZSB0byBhZGp1c3QgeW91cgogICAgcGF0aHMuPC9zdHJvbmc+PC9saT4KICAgIDxsaT5OZXcKICAgIG1vZGVzOiA8YSBocmVmPSIuLi9tb2RlL2QvaW5kZXguaHRtbCI+RDwvYT4sIDxhIGhyZWY9Ii4uL21vZGUvc2Fzcy9pbmRleC5odG1sIj5TYXNzPC9hPiwgPGEgaHJlZj0iLi4vbW9kZS9hcGwvaW5kZXguaHRtbCI+QVBMPC9hPiwgPGEgaHJlZj0iLi4vbW9kZS9zcWwvaW5kZXguaHRtbCI+U1FMPC9hPgogICAgKGNvbmZpZ3VyYWJsZSksIGFuZCA8YSBocmVmPSIuLi9tb2RlL2FzdGVyaXNrL2luZGV4Lmh0bWwiPkFzdGVyaXNrPC9hPi48L2xpPgogICAgPGxpPlNldmVyYWwgYnVnZml4ZXMgaW4gcmlnaHQtdG8tbGVmdCB0ZXh0IHN1cHBvcnQuPC9saT4KICAgIDxsaT5BZGQgPGEgaHJlZj0ibWFudWFsLmh0bWwjb3B0aW9uX3J0bE1vdmVWaXN1YWxseSI+PGNvZGU+cnRsTW92ZVZpc3VhbGx5PC9jb2RlPjwvYT4gb3B0aW9uLjwvbGk+CiAgICA8bGk+SW1wcm92ZW1lbnRzIHRvIHZpbSBrZXltYXAuPC9saT4KICAgIDxsaT5BZGQgYnVpbHQtaW4gKGxpZ2h0d2VpZ2h0KSA8YSBocmVmPSJtYW51YWwuaHRtbCNhZGRPdmVybGF5Ij5vdmVybGF5IG1vZGU8L2E+IHN1cHBvcnQuPC9saT4KICAgIDxsaT5TdXBwb3J0IDxjb2RlPnNob3dJZkhpZGRlbjwvY29kZT4gb3B0aW9uIGZvciA8YSBocmVmPSJtYW51YWwuaHRtbCNhZGRMaW5lV2lkZ2V0Ij5saW5lIHdpZGdldHM8L2E+LjwvbGk+CiAgICA8bGk+QWRkIHNpbXBsZSA8YSBocmVmPSJtYW51YWwuaHRtbCNhZGRvbl9weXRob24taGludCI+UHl0aG9uIGhpbnRlcjwvYT4uPC9saT4KICAgIDxsaT5CcmluZyBiYWNrIHRoZSA8YSBocmVmPSJtYW51YWwuaHRtbCNvcHRpb25fZml4ZWRHdXR0ZXIiPjxjb2RlPmZpeGVkR3V0dGVyPC9jb2RlPjwvYT4gb3B0aW9uLjwvbGk+CiAgICA8bGk+RnVsbCA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9Db2RlTWlycm9yL2NvbXBhcmUvdjMuMC4uLnYzLjAxIj5saXN0IG9mIHBhdGNoZXM8L2E+LjwvbGk+CiAgPC91bD4KCiAgPHAgY2xhc3M9InJlbCI+MTAtMTItMjAxMjogPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2NvZGVtaXJyb3ItMy4wLnppcCI+VmVyc2lvbiAzLjA8L2E+OjwvcD4KCiAgPHAgY2xhc3M9InJlbC1ub3RlIj48c3Ryb25nPk5ldyBtYWpvciB2ZXJzaW9uPC9zdHJvbmc+LiBPbmx5CiAgcGFydGlhbGx5IGJhY2t3YXJkcy1jb21wYXRpYmxlLiBTZWUKICB0aGUgPGEgaHJlZj0idXBncmFkZV92My5odG1sIj51cGdyYWRpbmcgZ3VpZGU8L2E+IGZvciBtb3JlCiAgaW5mb3JtYXRpb24uIENoYW5nZXMgc2luY2UgcmVsZWFzZSBjYW5kaWRhdGUgMjo8L3A+CgogIDx1bCBjbGFzcz0icmVsLW5vdGUiPgogICAgPGxpPlJld3JpdHRlbiBWSU0gbW9kZS48L2xpPgogICAgPGxpPkZpeCBhIGZldyBtaW5vciBzY3JvbGxpbmcgYW5kIHNpemluZyBpc3N1ZXMuPC9saT4KICAgIDxsaT5Xb3JrIGFyb3VuZCBTYWZhcmkgc2VnZmF1bHQgd2hlbiBkcmFnZ2luZy48L2xpPgogICAgPGxpPkZ1bGwgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvQ29kZU1pcnJvci9jb21wYXJlL3YzLjByYzIuLi52My4wIj5saXN0IG9mIHBhdGNoZXM8L2E+LjwvbGk+CiAgPC91bD4KICAKICA8cCBjbGFzcz0icmVsIj4yMC0xMS0yMDEyOiA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvY29kZW1pcnJvci0zLjByYzIuemlwIj5WZXJzaW9uIDMuMCwgcmVsZWFzZSBjYW5kaWRhdGUgMjwvYT46PC9wPgoKICA8dWwgY2xhc3M9InJlbC1ub3RlIj4KICAgIDxsaT5OZXcgbW9kZTogPGEgaHJlZj0iLi4vbW9kZS9odHRwL2luZGV4Lmh0bWwiPkhUVFA8L2E+LjwvbGk+CiAgICA8bGk+SW1wcm92ZWQgaGFuZGxpbmcgb2Ygc2VsZWN0aW9uIGFuY2hvciBwb3NpdGlvbi48L2xpPgogICAgPGxpPkltcHJvdmUgSUUgcGVyZm9ybWFuY2Ugb24gbG9uZ2VyIGxpbmVzLjwvbGk+CiAgICA8bGk+UmVkdWNlIGd1dHRlciBnbGl0Y2hlcyBkdXJpbmcgaG9yaXouIHNjcm9sbGluZy48L2xpPgogICAgPGxpPkFkZCA8YSBocmVmPSJtYW51YWwuaHRtbCNhZGRLZXlNYXAiPjxjb2RlPmFkZEtleU1hcDwvY29kZT48L2E+IGFuZCA8YSBocmVmPSJtYW51YWwuaHRtbCNyZW1vdmVLZXlNYXAiPjxjb2RlPnJlbW92ZUtleU1hcDwvY29kZT48L2E+IG1ldGhvZHMuPC9saT4KICAgIDxsaT5SZXdyaXRlIDxjb2RlPmZvcm1hdHRpbmc8L2NvZGU+IGFuZCA8Y29kZT5jbG9zZXRhZzwvY29kZT4gYWRkLW9ucy48L2xpPgogICAgPGxpPkZ1bGwgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvQ29kZU1pcnJvci9jb21wYXJlL3YzLjByYzEuLi52My4wcmMyIj5saXN0IG9mIHBhdGNoZXM8L2E+LjwvbGk+CiAgPC91bD4KCiAgPHAgY2xhc3M9InJlbCI+MjAtMTEtMjAxMjogPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2NvZGVtaXJyb3ItMy4wcmMxLnppcCI+VmVyc2lvbiAzLjAsIHJlbGVhc2UgY2FuZGlkYXRlIDE8L2E+OjwvcD4KCiAgPHVsIGNsYXNzPSJyZWwtbm90ZSI+CiAgICA8bGk+TmV3IHRoZW1lOiA8YSBocmVmPSIuLi9kZW1vL3RoZW1lLmh0bWw/c29sYXJpemVkJTIwbGlnaHQiPlNvbGFyaXplZDwvYT4uPC9saT4KICAgIDxsaT5JbnRyb2R1Y2UgPGEgaHJlZj0ibWFudWFsLmh0bWwjYWRkTGluZUNsYXNzIj48Y29kZT5hZGRMaW5lQ2xhc3M8L2NvZGU+PC9hPgogICAgYW5kIDxhIGhyZWY9Im1hbnVhbC5odG1sI3JlbW92ZUxpbmVDbGFzcyI+PGNvZGU+cmVtb3ZlTGluZUNsYXNzPC9jb2RlPjwvYT4sCiAgICBkcm9wIDxjb2RlPnNldExpbmVDbGFzczwvY29kZT4uPC9saT4KICAgIDxsaT5BZGQgYSA8ZW0+bG90PC9lbT4gb2YKICAgIG5ldyA8YSBocmVmPSJtYW51YWwuaHRtbCNtYXJrVGV4dCI+b3B0aW9ucyBmb3IgbWFya2VkIHRleHQ8L2E+CiAgICAocmVhZC1vbmx5LCBhdG9taWMsIGNvbGxhcHNlZCwgd2lkZ2V0IHJlcGxhY2VtZW50KS48L2xpPgogICAgPGxpPlJlbW92ZSB0aGUgb2xkIGNvZGUgZm9sZGluZyBpbnRlcmZhY2UgaW4gZmF2b3VyIG9mIHRoZXNlIG5ldyByYW5nZXMuPC9saT4KICAgIDxsaT5BZGQgPGEgaHJlZj0ibWFudWFsLmh0bWwjaXNDbGVhbiI+PGNvZGU+aXNDbGVhbjwvY29kZT48L2E+LzxhIGhyZWY9Im1hbnVhbC5odG1sI21hcmtDbGVhbiI+PGNvZGU+bWFya0NsZWFuPC9jb2RlPjwvYT4gbWV0aG9kcy48L2xpPgogICAgPGxpPlJlbW92ZSA8Y29kZT5jb21wb3VuZENoYW5nZTwvY29kZT4gbWV0aG9kLCB1c2UgYmV0dGVyIHVuZG8tZXZlbnQtY29tYmluaW5nIGhldXJpc3RpYy48L2xpPgogICAgPGxpPkltcHJvdmUgc2Nyb2xsaW5nIHBlcmZvcm1hbmNlIHNtb290aG5lc3MuPC9saT4KICAgIDxsaT5GdWxsIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL0NvZGVNaXJyb3IvY29tcGFyZS92My4wYmV0YTIuLi52My4wcmMxIj5saXN0IG9mIHBhdGNoZXM8L2E+LjwvbGk+CiAgPC91bD4KCiAgPHAgY2xhc3M9InJlbCI+MjItMTAtMjAxMjogPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2NvZGVtaXJyb3ItMy4wYmV0YTIuemlwIj5WZXJzaW9uIDMuMCwgYmV0YSAyPC9hPjo8L3A+CgogIDx1bCBjbGFzcz0icmVsLW5vdGUiPgogICAgPGxpPkZpeCBwYWdlLWJhc2VkIGNvb3JkaW5hdGUgY29tcHV0YXRpb24uPC9saT4KICAgIDxsaT5GaXggZmlyaW5nIG9mIDxhIGhyZWY9Im1hbnVhbC5odG1sI2V2ZW50X2d1dHRlckNsaWNrIj48Y29kZT5ndXR0ZXJDbGljazwvY29kZT48L2E+IGV2ZW50LjwvbGk+CiAgICA8bGk+QWRkIDxhIGhyZWY9Im1hbnVhbC5odG1sI29wdGlvbl9jdXJzb3JIZWlnaHQiPjxjb2RlPmN1cnNvckhlaWdodDwvY29kZT48L2E+IG9wdGlvbi48L2xpPgogICAgPGxpPkZpeCBiaS1kaXJlY3Rpb25hbCB0ZXh0IHJlZ3Jlc3Npb24uPC9saT4KICAgIDxsaT5BZGQgPGEgaHJlZj0ibWFudWFsLmh0bWwjb3B0aW9uX3ZpZXdwb3J0TWFyZ2luIj48Y29kZT52aWV3cG9ydE1hcmdpbjwvY29kZT48L2E+IG9wdGlvbi48L2xpPgogICAgPGxpPkRpcmVjdGx5IGhhbmRsZSBtb3VzZXdoZWVsIGV2ZW50cyAoYWdhaW4sIGhvcGVmdWxseSBiZXR0ZXIpLjwvbGk+CiAgICA8bGk+TWFrZSB2ZXJ0aWNhbCBjdXJzb3IgbW92ZW1lbnQgbW9yZSByb2J1c3QgKHRocm91Z2ggd2lkZ2V0cywgYmlnIGxpbmUgZ2FwcykuPC9saT4KICAgIDxsaT5BZGQgPGEgaHJlZj0ibWFudWFsLmh0bWwjb3B0aW9uX2ZsYXR0ZW5TcGFucyI+PGNvZGU+ZmxhdHRlblNwYW5zPC9jb2RlPjwvYT4gb3B0aW9uLjwvbGk+CiAgICA8bGk+TWFueSBvcHRpbWl6YXRpb25zLiBQb29yIHJlc3BvbnNpdmVuZXNzIHNob3VsZCBiZSBmaXhlZC48L2xpPgogICAgPGxpPkluaXRpYWxpemF0aW9uIGluIGhpZGRlbiBzdGF0ZSB3b3JrcyBhZ2Fpbi48L2xpPgogICAgPGxpPkZ1bGwgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvQ29kZU1pcnJvci9jb21wYXJlL3YzLjBiZXRhMS4uLnYzLjBiZXRhMiI+bGlzdCBvZiBwYXRjaGVzPC9hPi48L2xpPgogIDwvdWw+CgogIDxwIGNsYXNzPSJyZWwiPjE5LTA5LTIwMTI6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTMuMGJldGExLnppcCI+VmVyc2lvbiAzLjAsIGJldGEgMTwvYT46PC9wPgoKICA8dWwgY2xhc3M9InJlbC1ub3RlIj4KICAgIDxsaT5CaS1kaXJlY3Rpb25hbCB0ZXh0IHN1cHBvcnQuPC9saT4KICAgIDxsaT5Nb3JlIHBvd2VyZnVsIGd1dHRlciBtb2RlbC48L2xpPgogICAgPGxpPlN1cHBvcnQgZm9yIGFyYml0cmFyeSB0ZXh0L3dpZGdldCBoZWlnaHQuPC9saT4KICAgIDxsaT5Jbi1saW5lIHdpZGdldHMuPC9saT4KICAgIDxsaT5HZW5lcmFsaXplZCBldmVudCBoYW5kbGluZy48L2xpPgogIDwvdWw+Cgo8L3NlY3Rpb24+Cgo8c2VjdGlvbiBpZD12Mj4KCiAgPGgyPlZlcnNpb24gMi54PC9oMj4KCiAgPHAgY2xhc3M9InJlbCI+MjEtMDEtMjAxMzogPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2NvZGVtaXJyb3ItMi4zOC56aXAiPlZlcnNpb24gMi4zODwvYT46PC9wPgoKICA8cCBjbGFzcz0icmVsLW5vdGUiPkludGVncmF0ZSBzb21lIGJ1Z2ZpeGVzLCBlbmhhbmNlbWVudHMgdG8gdGhlIHZpbSBrZXltYXAsIGFuZCBuZXcKICBtb2RlcwogICg8YSBocmVmPSIuLi9tb2RlL2QvaW5kZXguaHRtbCI+RDwvYT4sIDxhIGhyZWY9Ii4uL21vZGUvc2Fzcy9pbmRleC5odG1sIj5TYXNzPC9hPiwgPGEgaHJlZj0iLi4vbW9kZS9hcGwvaW5kZXguaHRtbCI+QVBMPC9hPikKICBmcm9tIHRoZSB2MyBicmFuY2guPC9wPgoKICA8cCBjbGFzcz0icmVsIj4yMC0xMi0yMDEyOiA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvY29kZW1pcnJvci0yLjM3LnppcCI+VmVyc2lvbiAyLjM3PC9hPjo8L3A+CgogIDx1bCBjbGFzcz0icmVsLW5vdGUiPgogICAgPGxpPk5ldyBtb2RlOiA8YSBocmVmPSIuLi9tb2RlL3NxbC9pbmRleC5odG1sIj5TUUw8L2E+ICh3aWxsIHJlcGxhY2UgPGEgaHJlZj0iLi4vbW9kZS9wbHNxbC9pbmRleC5odG1sIj5wbHNxbDwvYT4gYW5kIDxhIGhyZWY9Ii4uL21vZGUvbXlzcWwvaW5kZXguaHRtbCI+bXlzcWw8L2E+IG1vZGVzKS48L2xpPgogICAgPGxpPkZ1cnRoZXIgd29yayBvbiB0aGUgbmV3IFZJTSBtb2RlLjwvbGk+CiAgICA8bGk+Rml4IENtZC9DdHJsIGtleXMgb24gcmVjZW50IE9wZXJhcyBvbiBPUyBYLjwvbGk+CiAgICA8bGk+RnVsbCA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9Db2RlTWlycm9yL2NvbXBhcmUvdjIuMzYuLi52Mi4zNyI+bGlzdCBvZiBwYXRjaGVzPC9hPi48L2xpPgogIDwvdWw+CgogIDxwIGNsYXNzPSJyZWwiPjIwLTExLTIwMTI6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTIuMzYuemlwIj5WZXJzaW9uIDIuMzY8L2E+OjwvcD4KCiAgPHVsIGNsYXNzPSJyZWwtbm90ZSI+CiAgICA8bGk+TmV3IG1vZGU6IDxhIGhyZWY9Ii4uL21vZGUvejgwL2luZGV4Lmh0bWwiPlo4MCBhc3NlbWJseTwvYT4uPC9saT4KICAgIDxsaT5OZXcgdGhlbWU6IDxhIGhyZWY9Ii4uL2RlbW8vdGhlbWUuaHRtbD90d2lsaWdodCI+VHdpbGlnaHQ8L2E+LjwvbGk+CiAgICA8bGk+QWRkIGNvbW1hbmQtbGluZSBjb21wcmVzc2lvbiBoZWxwZXIuPC9saT4KICAgIDxsaT5NYWtlIDxhIGhyZWY9Im1hbnVhbC5odG1sI3Njcm9sbEludG9WaWV3Ij48Y29kZT5zY3JvbGxJbnRvVmlldzwvY29kZT48L2E+IHB1YmxpYy48L2xpPgogICAgPGxpPkFkZCA8YSBocmVmPSJtYW51YWwuaHRtbCNkZWZhdWx0VGV4dEhlaWdodCI+PGNvZGU+ZGVmYXVsdFRleHRIZWlnaHQ8L2NvZGU+PC9hPiBtZXRob2QuPC9saT4KICAgIDxsaT5WYXJpb3VzIGV4dGVuc2lvbnMgdG8gdGhlIHZpbSBrZXltYXAuPC9saT4KICAgIDxsaT5NYWtlIDxhIGhyZWY9Ii4uL21vZGUvcGhwL2luZGV4Lmh0bWwiPlBIUCBtb2RlPC9hPiBidWlsZCBvbiA8YSBocmVmPSIuLi9tb2RlL2h0bWxtaXhlZC9pbmRleC5odG1sIj5taXhlZCBIVE1MIG1vZGU8L2E+LjwvbGk+CiAgICA8bGk+QWRkIDxhIGhyZWY9Im1hbnVhbC5odG1sI2FkZG9uX2NvbnRpbnVlY29tbWVudCI+Y29tbWVudC1jb250aW51aW5nPC9hPiBhZGQtb24uPC9saT4KICAgIDxsaT5GdWxsIDxhIGhyZWY9Ii4uL2h0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL0NvZGVNaXJyb3IvY29tcGFyZS92Mi4zNS4uLnYyLjM2Ij5saXN0IG9mIHBhdGNoZXM8L2E+LjwvbGk+CiAgPC91bD4KCiAgPHAgY2xhc3M9InJlbCI+MjItMTAtMjAxMjogPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2NvZGVtaXJyb3ItMi4zNS56aXAiPlZlcnNpb24gMi4zNTwvYT46PC9wPgoKICA8dWwgY2xhc3M9InJlbC1ub3RlIj4KICAgIDxsaT5OZXcgKHN1YikgbW9kZTogPGEgaHJlZj0iLi4vbW9kZS9qYXZhc2NyaXB0L3R5cGVzY3JpcHQuaHRtbCI+VHlwZVNjcmlwdDwvYT4uPC9saT4KICAgIDxsaT5Eb24ndCBvdmVyd3JpdGUgKGluc2VydCBrZXkpIHdoZW4gcGFzdGluZy48L2xpPgogICAgPGxpPkZpeCBzZXZlcmFsIGJ1Z3MgaW4gPGEgaHJlZj0ibWFudWFsLmh0bWwjbWFya1RleHQiPjxjb2RlPm1hcmtUZXh0PC9jb2RlPjwvYT4vdW5kbyBpbnRlcmFjdGlvbi48L2xpPgogICAgPGxpPkJldHRlciBpbmRlbnRhdGlvbiBvZiBKYXZhU2NyaXB0IGNvZGUgd2l0aG91dCBzZW1pY29sb25zLjwvbGk+CiAgICA8bGk+QWRkIDxhIGhyZWY9Im1hbnVhbC5odG1sI2RlZmluZUluaXRIb29rIj48Y29kZT5kZWZpbmVJbml0SG9vazwvY29kZT48L2E+IGZ1bmN0aW9uLjwvbGk+CiAgICA8bGk+RnVsbCA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9Db2RlTWlycm9yL2NvbXBhcmUvdjIuMzQuLi52Mi4zNSI+bGlzdCBvZiBwYXRjaGVzPC9hPi48L2xpPgogIDwvdWw+CgogIDxwIGNsYXNzPSJyZWwiPjE5LTA5LTIwMTI6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTIuMzQuemlwIj5WZXJzaW9uIDIuMzQ8L2E+OjwvcD4KCiAgPHVsIGNsYXNzPSJyZWwtbm90ZSI+CiAgICA8bGk+TmV3IG1vZGU6IDxhIGhyZWY9Ii4uL21vZGUvY29tbW9ubGlzcC9pbmRleC5odG1sIj5Db21tb24gTGlzcDwvYT4uPC9saT4KICAgIDxsaT5GaXggcmlnaHQtY2xpY2sgc2VsZWN0LWFsbCBvbiBtb3N0IGJyb3dzZXJzLjwvbGk+CiAgICA8bGk+Q2hhbmdlIHRoZSB3YXkgaGlnaGxpZ2h0aW5nIGhhcHBlbnM6PGJyPiZuYnNwOyBTYXZlcyBtZW1vcnkgYW5kIENQVSBjeWNsZXMuPGJyPiZuYnNwOyA8Y29kZT5jb21wYXJlU3RhdGVzPC9jb2RlPiBpcyBubyBsb25nZXIgbmVlZGVkLjxicj4mbmJzcDsgPGNvZGU+b25IaWdobGlnaHRDb21wbGV0ZTwvY29kZT4gbm8gbG9uZ2VyIHdvcmtzLjwvbGk+CiAgICA8bGk+SW50ZWdyYXRlIG1vZGUgKE1hcmtkb3duLCBYUXVlcnksIENTUywgc1RleCkgdGVzdHMgaW4gY2VudHJhbCB0ZXN0c3VpdGUuPC9saT4KICAgIDxsaT5BZGQgYSA8YSBocmVmPSJtYW51YWwuaHRtbCN2ZXJzaW9uIj48Y29kZT5Db2RlTWlycm9yLnZlcnNpb248L2NvZGU+PC9hPiBwcm9wZXJ0eS48L2xpPgogICAgPGxpPk1vcmUgcm9idXN0IGhhbmRsaW5nIG9mIG5lc3RlZCBtb2RlcyBpbiA8YSBocmVmPSIuLi9kZW1vL2Zvcm1hdHRpbmcuaHRtbCI+Zm9ybWF0dGluZzwvYT4gYW5kIDxhIGhyZWY9Ii4uL2RlbW8vY2xvc2V0YWcuaHRtbCI+Y2xvc2V0YWc8L2E+IHBsdWctaW5zLjwvbGk+CiAgICA8bGk+VW4vcmVkbyBub3cgcHJlc2VydmVzIDxhIGhyZWY9Im1hbnVhbC5odG1sI21hcmtUZXh0Ij5tYXJrZWQgdGV4dDwvYT4gYW5kIGJvb2ttYXJrcy48L2xpPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL0NvZGVNaXJyb3IvY29tcGFyZS92Mi4zMy4uLnYyLjM0Ij5GdWxsIGxpc3Q8L2E+IG9mIHBhdGNoZXMuPC9saT4KICA8L3VsPgoKICA8cCBjbGFzcz0icmVsIj4yMy0wOC0yMDEyOiA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvY29kZW1pcnJvci0yLjMzLnppcCI+VmVyc2lvbiAyLjMzPC9hPjo8L3A+CgogIDx1bCBjbGFzcz0icmVsLW5vdGUiPgogICAgPGxpPk5ldyBtb2RlOiA8YSBocmVmPSIuLi9tb2RlL3NpZXZlL2luZGV4Lmh0bWwiPlNpZXZlPC9hPi48L2xpPgogICAgPGxpPk5ldyA8YSBocmVmPSJtYW51YWwuaHRtbCNnZXRWaWV3cG9ydCI+PGNvZGU+Z2V0Vmlld1BvcnQ8L2NvZGU+PC9hPiBhbmQgPGEgaHJlZj0ibWFudWFsLmh0bWwjb3B0aW9uX29uVmlld3BvcnRDaGFuZ2UiPjxjb2RlPm9uVmlld3BvcnRDaGFuZ2U8L2NvZGU+PC9hPiBBUEkuPC9saT4KICAgIDxsaT48YSBocmVmPSJtYW51YWwuaHRtbCNvcHRpb25fY3Vyc29yQmxpbmtSYXRlIj5Db25maWd1cmFibGU8L2E+IGN1cnNvciBibGluayByYXRlLjwvbGk+CiAgICA8bGk+TWFrZSBiaW5kaW5nIGEga2V5IHRvIDxjb2RlPmZhbHNlPC9jb2RlPiBkaXNhYmxpbmcgaGFuZGxpbmcgKGFnYWluKS48L2xpPgogICAgPGxpPlNob3cgbm9uLXByaW50aW5nIGNoYXJhY3RlcnMgYXMgcmVkIGRvdHMuPC9saT4KICAgIDxsaT5Nb3JlIHR3ZWFrcyB0byB0aGUgc2Nyb2xsaW5nIG1vZGVsLjwvbGk+CiAgICA8bGk+RXhwYW5kZWQgdGVzdHN1aXRlLiBCYXNpYyBsaW50ZXIgYWRkZWQuPC9saT4KICAgIDxsaT5SZW1vdmUgbW9zdCB1c2VzIG9mIDxjb2RlPmlubmVySFRNTDwvY29kZT4uIFJlbW92ZSA8Y29kZT5Db2RlTWlycm9yLmh0bWxFc2NhcGU8L2NvZGU+LjwvbGk+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvQ29kZU1pcnJvci9jb21wYXJlL3YyLjMyLi4udjIuMzMiPkZ1bGwgbGlzdDwvYT4gb2YgcGF0Y2hlcy48L2xpPgogIDwvdWw+CgogIDxwIGNsYXNzPSJyZWwiPjIzLTA3LTIwMTI6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTIuMzIuemlwIj5WZXJzaW9uIDIuMzI8L2E+OjwvcD4KCiAgPHAgY2xhc3M9InJlbC1ub3RlIj5FbWVyZ2VuY3kgZml4IGZvciBhIGJ1ZyB3aGVyZSBhbiBlZGl0b3Igd2l0aAogIGxpbmUgd3JhcHBpbmcgb24gSUUgd2lsbCBicmVhayB3aGVuIHRoZXJlIGlzIDxlbT5ubzwvZW0+CiAgc2Nyb2xsYmFyLjwvcD4KCiAgPHAgY2xhc3M9InJlbCI+MjAtMDctMjAxMjogPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2NvZGVtaXJyb3ItMi4zMS56aXAiPlZlcnNpb24gMi4zMTwvYT46PC9wPgoKICA8dWwgY2xhc3M9InJlbC1ub3RlIj4KICAgIDxsaT5OZXcgbW9kZXM6IDxhIGhyZWY9Ii4uL21vZGUvb2NhbWwvaW5kZXguaHRtbCI+T0NhbWw8L2E+LCA8YSBocmVmPSIuLi9tb2RlL2hheGUvaW5kZXguaHRtbCI+SGF4ZTwvYT4sIGFuZCA8YSBocmVmPSIuLi9tb2RlL3ZiL2luZGV4Lmh0bWwiPlZCLk5FVDwvYT4uPC9saT4KICAgIDxsaT5TZXZlcmFsIGZpeGVzIHRvIHRoZSBuZXcgc2Nyb2xsaW5nIG1vZGVsLjwvbGk+CiAgICA8bGk+QWRkIGEgPGEgaHJlZj0ibWFudWFsLmh0bWwjc2V0U2l6ZSI+PGNvZGU+c2V0U2l6ZTwvY29kZT48L2E+IG1ldGhvZCBmb3IgcHJvZ3JhbW1hdGljIHJlc2l6aW5nLjwvbGk+CiAgICA8bGk+QWRkIDxhIGhyZWY9Im1hbnVhbC5odG1sI2dldEhpc3RvcnkiPjxjb2RlPmdldEhpc3Rvcnk8L2NvZGU+PC9hPiBhbmQgPGEgaHJlZj0ibWFudWFsLmh0bWwjc2V0SGlzdG9yeSI+PGNvZGU+c2V0SGlzdG9yeTwvY29kZT48L2E+IG1ldGhvZHMuPC9saT4KICAgIDxsaT5BbGxvdyBjdXN0b20gbGluZSBzZXBhcmF0b3Igc3RyaW5nIGluIDxhIGhyZWY9Im1hbnVhbC5odG1sI2dldFZhbHVlIj48Y29kZT5nZXRWYWx1ZTwvY29kZT48L2E+IGFuZCA8YSBocmVmPSJtYW51YWwuaHRtbCNnZXRSYW5nZSI+PGNvZGU+Z2V0UmFuZ2U8L2NvZGU+PC9hPi48L2xpPgogICAgPGxpPlN1cHBvcnQgZG91YmxlLSBhbmQgdHJpcGxlLWNsaWNrIGRyYWcsIGRvdWJsZS1jbGlja2luZyB3aGl0ZXNwYWNlLjwvbGk+CiAgICA8bGk+QW5kIG1vcmUuLi4gPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvQ29kZU1pcnJvci9jb21wYXJlL3YyLjMuLi52Mi4zMSI+KGFsbCBwYXRjaGVzKTwvYT48L2xpPgogIDwvdWw+CgogIDxwIGNsYXNzPSJyZWwiPjIyLTA2LTIwMTI6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTIuMy56aXAiPlZlcnNpb24gMi4zPC9hPjo8L3A+CgogIDx1bCBjbGFzcz0icmVsLW5vdGUiPgogICAgPGxpPjxzdHJvbmc+TmV3IHNjcm9sbGJhciBpbXBsZW1lbnRhdGlvbjwvc3Ryb25nPi4gU2hvdWxkIGZsaWNrZXIgbGVzcy4gQ2hhbmdlcyBET00gc3RydWN0dXJlIG9mIHRoZSBlZGl0b3IuPC9saT4KICAgIDxsaT5OZXcgdGhlbWU6IDxhIGhyZWY9Ii4uL2RlbW8vdGhlbWUuaHRtbD92aWJyYW50LWluayI+dmlicmFudC1pbms8L2E+LjwvbGk+CiAgICA8bGk+TWFueSBleHRlbnNpb25zIHRvIHRoZSBWSU0ga2V5bWFwIChpbmNsdWRpbmcgdGV4dCBvYmplY3RzKS48L2xpPgogICAgPGxpPkFkZCA8YSBocmVmPSIuLi9kZW1vL211bHRpcGxleC5odG1sIj5tb2RlLW11bHRpcGxleGluZzwvYT4gdXRpbGl0eSBzY3JpcHQuPC9saT4KICAgIDxsaT5GaXggYnVnIHdoZXJlIHJpZ2h0LWNsaWNrIHBhc3RlIHdvcmtzIGluIHJlYWQtb25seSBtb2RlLjwvbGk+CiAgICA8bGk+QWRkIGEgPGEgaHJlZj0ibWFudWFsLmh0bWwjZ2V0U2Nyb2xsSW5mbyI+PGNvZGU+Z2V0U2Nyb2xsSW5mbzwvY29kZT48L2E+IG1ldGhvZC48L2xpPgogICAgPGxpPkxvdHMgb2Ygb3RoZXIgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvQ29kZU1pcnJvci9jb21wYXJlL3YyLjI1Li4udjIuMyI+Zml4ZXM8L2E+LjwvbGk+CiAgPC91bD4KCiAgPHAgY2xhc3M9InJlbCI+MjMtMDUtMjAxMjogPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2NvZGVtaXJyb3ItMi4yNS56aXAiPlZlcnNpb24gMi4yNTwvYT46PC9wPgoKICA8dWwgY2xhc3M9InJlbC1ub3RlIj4KICAgIDxsaT5OZXcgbW9kZTogPGEgaHJlZj0iLi4vbW9kZS9lcmxhbmcvaW5kZXguaHRtbCI+RXJsYW5nPC9hPi48L2xpPgogICAgPGxpPjxzdHJvbmc+UmVtb3ZlIHhtbHB1cmUgbW9kZTwvc3Ryb25nPiAodXNlIDxhIGhyZWY9Ii4uL21vZGUveG1sL2luZGV4Lmh0bWwiPnhtbC5qczwvYT4pLjwvbGk+CiAgICA8bGk+Rml4IGxpbmUtd3JhcHBpbmcgaW4gT3BlcmEuPC9saT4KICAgIDxsaT5GaXggWCBXaW5kb3dzIG1pZGRsZS1jbGljayBwYXN0ZSBpbiBDaHJvbWUuPC9saT4KICAgIDxsaT5GaXggYnVnIHRoYXQgYnJva2UgcGFzdGluZyBvZiBodWdlIGRvY3VtZW50cy48L2xpPgogICAgPGxpPkZpeCBiYWNrc3BhY2UgYW5kIHRhYiBrZXkgcmVwZWF0IGluIE9wZXJhLjwvbGk+CiAgPC91bD4KCiAgPHAgY2xhc3M9InJlbCI+MjMtMDQtMjAxMjogPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2NvZGVtaXJyb3ItMi4yNC56aXAiPlZlcnNpb24gMi4yNDwvYT46PC9wPgoKICA8dWwgY2xhc3M9InJlbC1ub3RlIj4KICAgIDxsaT48c3Ryb25nPkRyb3Agc3VwcG9ydCBmb3IgSW50ZXJuZXQgRXhwbG9yZXIgNjwvc3Ryb25nPi48L2xpPgogICAgPGxpPk5ldwogICAgbW9kZXM6IDxhIGhyZWY9Ii4uL21vZGUvc2hlbGwvaW5kZXguaHRtbCI+U2hlbGw8L2E+LCA8YSBocmVmPSIuLi9tb2RlL3Rpa2kvaW5kZXguaHRtbCI+VGlraQogICAgd2lraTwvYT4sIDxhIGhyZWY9Ii4uL21vZGUvcGlnL2luZGV4Lmh0bWwiPlBpZyBMYXRpbjwvYT4uPC9saT4KICAgIDxsaT5OZXcgdGhlbWVzOiA8YSBocmVmPSIuLi9kZW1vL3RoZW1lLmh0bWw/YW1iaWFuY2UiPkFtYmlhbmNlPC9hPiwgPGEgaHJlZj0iLi4vZGVtby90aGVtZS5odG1sP2JsYWNrYm9hcmQiPkJsYWNrYm9hcmQ8L2E+LjwvbGk+CiAgICA8bGk+TW9yZSBjb250cm9sIG92ZXIgZHJhZy9kcm9wCiAgICB3aXRoIDxhIGhyZWY9Im1hbnVhbC5odG1sI29wdGlvbl9kcmFnRHJvcCI+PGNvZGU+ZHJhZ0Ryb3A8L2NvZGU+PC9hPgogICAgYW5kIDxhIGhyZWY9Im1hbnVhbC5odG1sI29wdGlvbl9vbkRyYWdFdmVudCI+PGNvZGU+b25EcmFnRXZlbnQ8L2NvZGU+PC9hPgogICAgb3B0aW9ucy48L2xpPgogICAgPGxpPk1ha2UgSFRNTCBtb2RlIGEgYml0IGxlc3MgcGVkYW50aWMuPC9saT4KICAgIDxsaT5BZGQgPGEgaHJlZj0ibWFudWFsLmh0bWwjY29tcG91bmRDaGFuZ2UiPjxjb2RlPmNvbXBvdW5kQ2hhbmdlPC9jb2RlPjwvYT4gQVBJIG1ldGhvZC48L2xpPgogICAgPGxpPlNldmVyYWwgZml4ZXMgaW4gdW5kbyBoaXN0b3J5IGFuZCBsaW5lIGhpZGluZy48L2xpPgogICAgPGxpPlJlbW92ZSAoYnJva2VuKSBzdXBwb3J0IGZvciA8Y29kZT5jYXRjaGFsbDwvY29kZT4gaW4ga2V5IG1hcHMsCiAgICBhZGQgPGNvZGU+bm9mYWxsdGhyb3VnaDwvY29kZT4gYm9vbGVhbiBmaWVsZCBpbnN0ZWFkLjwvbGk+CiAgPC91bD4KCiAgPHAgY2xhc3M9InJlbCI+MjYtMDMtMjAxMjogPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2NvZGVtaXJyb3ItMi4yMy56aXAiPlZlcnNpb24gMi4yMzwvYT46PC9wPgoKICA8dWwgY2xhc3M9InJlbC1ub3RlIj4KICAgIDxsaT5DaGFuZ2UgPHN0cm9uZz5kZWZhdWx0IGJpbmRpbmcgZm9yIHRhYjwvc3Ryb25nPiA8YSBocmVmPSJqYXZhc2NyaXB0OnZvaWQoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3RhYmJpbmRpbmcnKS5zdHlsZS5kaXNwbGF5PScnKSI+W21vcmVdPC9hPgogICAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OiBub25lIiBpZD10YWJiaW5kaW5nPgogICAgICAgIFN0YXJ0aW5nIGluIDIuMjMsIHRoZXNlIGJpbmRpbmdzIGFyZSBkZWZhdWx0OgogICAgICAgIDx1bD48bGk+VGFiOiBJbnNlcnQgdGFiIGNoYXJhY3RlcjwvbGk+CiAgICAgICAgICA8bGk+U2hpZnQtdGFiOiBSZXNldCBsaW5lIGluZGVudGF0aW9uIHRvIGRlZmF1bHQ8L2xpPgogICAgICAgICAgPGxpPkN0cmwvQ21kLVs6IFJlZHVjZSBsaW5lIGluZGVudGF0aW9uIChvbGQgdGFiIGJlaGF2aW91cik8L2xpPgogICAgICAgICAgPGxpPkN0cmwvQ21kLV06IEluY3JlYXNlIGxpbmUgaW5kZW50YXRpb24gKG9sZCBzaGlmdC10YWIgYmVoYXZpb3VyKTwvbGk+CiAgICAgICAgPC91bD4KICAgICAgPC9kaXY+CiAgICA8L2xpPgogICAgPGxpPk5ldyBtb2RlczogPGEgaHJlZj0iLi4vbW9kZS94cXVlcnkvaW5kZXguaHRtbCI+WFF1ZXJ5PC9hPiBhbmQgPGEgaHJlZj0iLi4vbW9kZS92YnNjcmlwdC9pbmRleC5odG1sIj5WQlNjcmlwdDwvYT4uPC9saT4KICAgIDxsaT5Ud28gbmV3IHRoZW1lczogPGEgaHJlZj0iLi4vbW9kZS9sZXNzL2luZGV4Lmh0bWwiPmxlc3Nlci1kYXJrPC9hPiBhbmQgPGEgaHJlZj0iLi4vbW9kZS94cXVlcnkvaW5kZXguaHRtbCI+eHEtZGFyazwvYT4uPC9saT4KICAgIDxsaT5EaWZmZXJlbnRpYXRlIGJldHdlZW4gYmFja2dyb3VuZCBhbmQgdGV4dCBzdHlsZXMgaW4gPGEgaHJlZj0ibWFudWFsLmh0bWwjc2V0TGluZUNsYXNzIj48Y29kZT5zZXRMaW5lQ2xhc3M8L2NvZGU+PC9hPi48L2xpPgogICAgPGxpPkZpeCBkcmFnLWFuZC1kcm9wIGluIElFOSsuPC9saT4KICAgIDxsaT5FeHRlbmQgPGEgaHJlZj0ibWFudWFsLmh0bWwjY2hhckNvb3JkcyI+PGNvZGU+Y2hhckNvb3JkczwvY29kZT48L2E+CiAgICBhbmQgPGEgaHJlZj0ibWFudWFsLmh0bWwjY3Vyc29yQ29vcmRzIj48Y29kZT5jdXJzb3JDb29yZHM8L2NvZGU+PC9hPiB3aXRoIGEgPGNvZGU+bW9kZTwvY29kZT4gYXJndW1lbnQuPC9saT4KICAgIDxsaT5BZGQgPGEgaHJlZj0ibWFudWFsLmh0bWwjb3B0aW9uX2F1dG9mb2N1cyI+PGNvZGU+YXV0b2ZvY3VzPC9jb2RlPjwvYT4gb3B0aW9uLjwvbGk+CiAgICA8bGk+QWRkIDxhIGhyZWY9Im1hbnVhbC5odG1sI2ZpbmRNYXJrc0F0Ij48Y29kZT5maW5kTWFya3NBdDwvY29kZT48L2E+IG1ldGhvZC48L2xpPgogIDwvdWw+CgogIDxwIGNsYXNzPSJyZWwiPjI3LTAyLTIwMTI6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTIuMjIuemlwIj5WZXJzaW9uIDIuMjI8L2E+OjwvcD4KCiAgPHVsIGNsYXNzPSJyZWwtbm90ZSI+CiAgICA8bGk+QWxsb3cgPGEgaHJlZj0ibWFudWFsLmh0bWwja2V5bWFwcyI+a2V5IGhhbmRsZXJzPC9hPiB0byBwYXNzIHVwIGV2ZW50cywgYWxsb3cgYmluZGluZyBjaGFyYWN0ZXJzLjwvbGk+CiAgICA8bGk+QWRkIDxhIGhyZWY9Im1hbnVhbC5odG1sI29wdGlvbl9hdXRvQ2xlYXJFbXB0eUxpbmVzIj48Y29kZT5hdXRvQ2xlYXJFbXB0eUxpbmVzPC9jb2RlPjwvYT4gb3B0aW9uLjwvbGk+CiAgICA8bGk+UHJvcGVybHkgdXNlIHRhYiBzdG9wcyB3aGVuIHJlbmRlcmluZyB0YWJzLjwvbGk+CiAgICA8bGk+TWFrZSBQSFAgbW9kZSBtb3JlIHJvYnVzdC48L2xpPgogICAgPGxpPlN1cHBvcnQgaW5kZW50YXRpb24gYmxvY2tzIGluIDxhIGhyZWY9Im1hbnVhbC5odG1sI2FkZG9uX2ZvbGRjb2RlIj5jb2RlIGZvbGRlcjwvYT4uPC9saT4KICAgIDxsaT5BZGQgYSBzY3JpcHQgZm9yIDxhIGhyZWY9Im1hbnVhbC5odG1sI2FkZG9uX21hdGNoLWhpZ2hsaWdodGVyIj5oaWdobGlnaHRpbmcgaW5zdGFuY2VzIG9mIHRoZSBzZWxlY3Rpb248L2E+LjwvbGk+CiAgICA8bGk+TmV3IDxhIGhyZWY9Ii4uL21vZGUvcHJvcGVydGllcy9pbmRleC5odG1sIj4ucHJvcGVydGllczwvYT4gbW9kZS48L2xpPgogICAgPGxpPkZpeCBtYW55IGJ1Z3MuPC9saT4KICA8L3VsPgoKICA8cCBjbGFzcz0icmVsIj4yNy0wMS0yMDEyOiA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvY29kZW1pcnJvci0yLjIxLnppcCI+VmVyc2lvbiAyLjIxPC9hPjo8L3A+CgogIDx1bCBjbGFzcz0icmVsLW5vdGUiPgogICAgPGxpPkFkZGVkIDxhIGhyZWY9Ii4uL21vZGUvbGVzcy9pbmRleC5odG1sIj5MRVNTPC9hPiwgPGEgaHJlZj0iLi4vbW9kZS9teXNxbC9pbmRleC5odG1sIj5NeVNRTDwvYT4sCiAgICA8YSBocmVmPSIuLi9tb2RlL2dvL2luZGV4Lmh0bWwiPkdvPC9hPiwgYW5kIDxhIGhyZWY9Ii4uL21vZGUvdmVyaWxvZy9pbmRleC5odG1sIj5WZXJpbG9nPC9hPiBtb2Rlcy48L2xpPgogICAgPGxpPkFkZCA8YSBocmVmPSJtYW51YWwuaHRtbCNvcHRpb25fc21hcnRJbmRlbnQiPjxjb2RlPnNtYXJ0SW5kZW50PC9jb2RlPjwvYT4KICAgIG9wdGlvbi48L2xpPgogICAgPGxpPlN1cHBvcnQgYSBjdXJzb3IgaW4gPGEgaHJlZj0ibWFudWFsLmh0bWwjb3B0aW9uX3JlYWRPbmx5Ij48Y29kZT5yZWFkT25seTwvY29kZT48L2E+LW1vZGUuPC9saT4KICAgIDxsaT5TdXBwb3J0IGFzc2lnbmluZyBtdWx0aXBsZSBzdHlsZXMgdG8gYSB0b2tlbi48L2xpPgogICAgPGxpPlVzZSBhIG5ldyBhcHByb2FjaCB0byBkcmF3aW5nIHRoZSBzZWxlY3Rpb24uPC9saT4KICAgIDxsaT5BZGQgPGEgaHJlZj0ibWFudWFsLmh0bWwjc2Nyb2xsVG8iPjxjb2RlPnNjcm9sbFRvPC9jb2RlPjwvYT4gbWV0aG9kLjwvbGk+CiAgICA8bGk+QWxsb3cgdW5kby9yZWRvIGV2ZW50cyB0byBzcGFuIG5vbi1hZGphY2VudCBsaW5lcy48L2xpPgogICAgPGxpPkxvdHMgYW5kIGxvdHMgb2YgYnVnZml4ZXMuPC9saT4KICA8L3VsPgoKICA8cCBjbGFzcz0icmVsIj4yMC0xMi0yMDExOiA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvY29kZW1pcnJvci0yLjIuemlwIj5WZXJzaW9uIDIuMjwvYT46PC9wPgoKICA8dWwgY2xhc3M9InJlbC1ub3RlIj4KICAgIDxsaT5TbGlnaHRseSBpbmNvbXBhdGlibGUgQVBJIGNoYW5nZXMuIFJlYWQgPGEgaHJlZj0idXBncmFkZV92Mi4yLmh0bWwiPnRoaXM8L2E+LjwvbGk+CiAgICA8bGk+TmV3IGFwcHJvYWNoCiAgICB0byA8YSBocmVmPSJtYW51YWwuaHRtbCNvcHRpb25fZXh0cmFLZXlzIj5iaW5kaW5nPC9hPiBrZXlzLAogICAgc3VwcG9ydCBmb3IgPGEgaHJlZj0ibWFudWFsLmh0bWwjb3B0aW9uX2tleU1hcCI+Y3VzdG9tCiAgICBiaW5kaW5nczwvYT4uPC9saT4KICAgIDxsaT5TdXBwb3J0IGZvciBvdmVyd3JpdGUgKGluc2VydCkuPC9saT4KICAgIDxsaT48YSBocmVmPSJtYW51YWwuaHRtbCNvcHRpb25fdGFiU2l6ZSI+Q3VzdG9tLXdpZHRoPC9hPgogICAgYW5kIDxhIGhyZWY9Ii4uL2RlbW8vdmlzaWJsZXRhYnMuaHRtbCI+c3R5bGFibGU8L2E+IHRhYnMuPC9saT4KICAgIDxsaT5Nb3ZlZCBtb3JlIGNvZGUgaW50byA8YSBocmVmPSJtYW51YWwuaHRtbCNhZGRvbnMiPmFkZC1vbiBzY3JpcHRzPC9hPi48L2xpPgogICAgPGxpPlN1cHBvcnQgZm9yIHNhbmUgdmVydGljYWwgY3Vyc29yIG1vdmVtZW50IGluIHdyYXBwZWQgbGluZXMuPC9saT4KICAgIDxsaT5Nb3JlIHJlbGlhYmxlIGhhbmRsaW5nIG9mCiAgICBlZGl0aW5nIDxhIGhyZWY9Im1hbnVhbC5odG1sI21hcmtUZXh0Ij5tYXJrZWQgdGV4dDwvYT4uPC9saT4KICAgIDxsaT5BZGQgbWluaW1hbCA8YSBocmVmPSIuLi9kZW1vL2VtYWNzLmh0bWwiPmVtYWNzPC9hPgogICAgYW5kIDxhIGhyZWY9Ii4uL2RlbW8vdmltLmh0bWwiPnZpbTwvYT4gYmluZGluZ3MuPC9saT4KICAgIDxsaT5SZW5hbWUgPGNvZGU+Y29vcmRzRnJvbUluZGV4PC9jb2RlPgogICAgdG8gPGEgaHJlZj0ibWFudWFsLmh0bWwjcG9zRnJvbUluZGV4Ij48Y29kZT5wb3NGcm9tSW5kZXg8L2NvZGU+PC9hPiwKICAgIGFkZCA8YSBocmVmPSJtYW51YWwuaHRtbCNpbmRleEZyb21Qb3MiPjxjb2RlPmluZGV4RnJvbVBvczwvY29kZT48L2E+CiAgICBtZXRob2QuPC9saT4KICA8L3VsPgoKICA8cCBjbGFzcz0icmVsIj4yMS0xMS0yMDExOiA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvY29kZW1pcnJvci0yLjE4LnppcCI+VmVyc2lvbiAyLjE4PC9hPjo8L3A+CiAgPHAgY2xhc3M9InJlbC1ub3RlIj5GaXhlcyA8Y29kZT5UZXh0TWFya2VyLmNsZWFyPC9jb2RlPiwgd2hpY2ggaXMgYnJva2VuIGluIDIuMTcuPC9wPgoKICA8cCBjbGFzcz0icmVsIj4yMS0xMS0yMDExOiA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvY29kZW1pcnJvci0yLjE3LnppcCI+VmVyc2lvbiAyLjE3PC9hPjo8L3A+CiAgPHVsIGNsYXNzPSJyZWwtbm90ZSI+CiAgICA8bGk+QWRkIHN1cHBvcnQgZm9yIDxhIGhyZWY9Im1hbnVhbC5odG1sI29wdGlvbl9saW5lV3JhcHBpbmciPmxpbmUKICAgIHdyYXBwaW5nPC9hPiBhbmQgPGEgaHJlZj0ibWFudWFsLmh0bWwjaGlkZUxpbmUiPmNvZGUKICAgIGZvbGRpbmc8L2E+LjwvbGk+CiAgICA8bGk+QWRkIDxhIGhyZWY9Ii4uL21vZGUvZ2ZtL2luZGV4Lmh0bWwiPkdpdGh1Yi1zdHlsZSBNYXJrZG93bjwvYT4gbW9kZS48L2xpPgogICAgPGxpPkFkZCA8YSBocmVmPSIuLi90aGVtZS9tb25va2FpLmNzcyI+TW9ub2thaTwvYT4KICAgIGFuZCA8YSBocmVmPSIuLi90aGVtZS9ydWJ5Ymx1ZS5jc3MiPlJ1YnlibHVlPC9hPiB0aGVtZXMuPC9saT4KICAgIDxsaT5BZGQgPGEgaHJlZj0ibWFudWFsLmh0bWwjc2V0Qm9va21hcmsiPjxjb2RlPnNldEJvb2ttYXJrPC9jb2RlPjwvYT4gbWV0aG9kLjwvbGk+CiAgICA8bGk+TW92ZSBzb21lIG9mIHRoZSBkZW1vIGNvZGUgaW50byByZXVzYWJsZSBjb21wb25lbnRzCiAgICB1bmRlciA8YSBocmVmPSIuLi9hZGRvbi8iPjxjb2RlPmxpYi91dGlsPC9jb2RlPjwvYT4uPC9saT4KICAgIDxsaT5NYWtlIHNjcmVlbi1jb29yZC1maW5kaW5nIGNvZGUgZmFzdGVyIGFuZCBtb3JlIHJlbGlhYmxlLjwvbGk+CiAgICA8bGk+Rml4IGRyYWctYW5kLWRyb3AgaW4gRmlyZWZveC48L2xpPgogICAgPGxpPkltcHJvdmUgc3VwcG9ydCBmb3IgSU1FLjwvbGk+CiAgICA8bGk+U3BlZWQgdXAgY29udGVudCByZW5kZXJpbmcuPC9saT4KICAgIDxsaT5GaXggYnJvd3NlcidzIGJ1aWx0LWluIHNlYXJjaCBpbiBXZWJraXQuPC9saT4KICAgIDxsaT5NYWtlIGRvdWJsZS0gYW5kIHRyaXBsZS1jbGljayB3b3JrIGluIElFLjwvbGk+CiAgICA8bGk+VmFyaW91cyBmaXhlcyB0byBtb2Rlcy48L2xpPgogIDwvdWw+CgogIDxwIGNsYXNzPSJyZWwiPjI3LTEwLTIwMTE6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTIuMTYuemlwIj5WZXJzaW9uIDIuMTY8L2E+OjwvcD4KICA8dWwgY2xhc3M9InJlbC1ub3RlIj4KICAgIDxsaT5BZGQgPGEgaHJlZj0iLi4vbW9kZS9wZXJsL2luZGV4Lmh0bWwiPlBlcmw8L2E+LCA8YSBocmVmPSIuLi9tb2RlL3J1c3QvaW5kZXguaHRtbCI+UnVzdDwvYT4sIDxhIGhyZWY9Ii4uL21vZGUvdGlkZGx5d2lraS9pbmRleC5odG1sIj5UaWRkbHlXaWtpPC9hPiwgYW5kIDxhIGhyZWY9Ii4uL21vZGUvZ3Jvb3Z5L2luZGV4Lmh0bWwiPkdyb292eTwvYT4gbW9kZXMuPC9saT4KICAgIDxsaT5EcmFnZ2luZyB0ZXh0IGluc2lkZSB0aGUgZWRpdG9yIG5vdyBtb3ZlcywgcmF0aGVyIHRoYW4gY29waWVzLjwvbGk+CiAgICA8bGk+QWRkIGEgPGEgaHJlZj0ibWFudWFsLmh0bWwjY29vcmRzRnJvbUluZGV4Ij48Y29kZT5jb29yZHNGcm9tSW5kZXg8L2NvZGU+PC9hPiBtZXRob2QuPC9saT4KICAgIDxsaT48c3Ryb25nPkFQSSBjaGFuZ2U8L3N0cm9uZz46IDxjb2RlPnNldFZhbHVlPC9jb2RlPiBub3cgbm8gbG9uZ2VyIGNsZWFycyBoaXN0b3J5LiBVc2UgPGEgaHJlZj0ibWFudWFsLmh0bWwjY2xlYXJIaXN0b3J5Ij48Y29kZT5jbGVhckhpc3Rvcnk8L2NvZGU+PC9hPiBmb3IgdGhhdC48L2xpPgogICAgPGxpPjxzdHJvbmc+QVBJIGNoYW5nZTwvc3Ryb25nPjogPGEgaHJlZj0ibWFudWFsLmh0bWwjbWFya1RleHQiPjxjb2RlPm1hcmtUZXh0PC9jb2RlPjwvYT4gbm93CiAgICByZXR1cm5zIGFuIG9iamVjdCB3aXRoIDxjb2RlPmNsZWFyPC9jb2RlPiBhbmQgPGNvZGU+ZmluZDwvY29kZT4KICAgIG1ldGhvZHMuIE1hcmtlZCB0ZXh0IGlzIG5vdyBtb3JlIHJvYnVzdCB3aGVuIGVkaXRlZC48L2xpPgogICAgPGxpPkZpeCBlZGl0aW5nIGNvZGUgd2l0aCB0YWJzIGluIEludGVybmV0IEV4cGxvcmVyLjwvbGk+CiAgPC91bD4KCiAgPHAgY2xhc3M9InJlbCI+MjYtMDktMjAxMTogPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2NvZGVtaXJyb3ItMi4xNS56aXAiPlZlcnNpb24gMi4xNTwvYT46PC9wPgogIDxwIGNsYXNzPSJyZWwtbm90ZSI+Rml4IGJ1ZyB0aGF0IHNudWNrIGludG8gMi4xNDogQ2xpY2tpbmcgdGhlCiAgY2hhcmFjdGVyIHRoYXQgY3VycmVudGx5IGhhcyB0aGUgY3Vyc29yIGRpZG4ndCByZS1mb2N1cyB0aGUKICBlZGl0b3IuPC9wPgoKICA8cCBjbGFzcz0icmVsIj4yNi0wOS0yMDExOiA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvY29kZW1pcnJvci0yLjE0LnppcCI+VmVyc2lvbiAyLjE0PC9hPjo8L3A+CiAgPHVsIGNsYXNzPSJyZWwtbm90ZSI+CiAgICA8bGk+QWRkIDxhIGhyZWY9Ii4uL21vZGUvY2xvanVyZS9pbmRleC5odG1sIj5DbG9qdXJlPC9hPiwgPGEgaHJlZj0iLi4vbW9kZS9wYXNjYWwvaW5kZXguaHRtbCI+UGFzY2FsPC9hPiwgPGEgaHJlZj0iLi4vbW9kZS9udHJpcGxlcy9pbmRleC5odG1sIj5OVHJpcGxlczwvYT4sIDxhIGhyZWY9Ii4uL21vZGUvamluamEyL2luZGV4Lmh0bWwiPkppbmphMjwvYT4sIGFuZCA8YSBocmVmPSIuLi9tb2RlL21hcmtkb3duL2luZGV4Lmh0bWwiPk1hcmtkb3duPC9hPiBtb2Rlcy48L2xpPgogICAgPGxpPkFkZCA8YSBocmVmPSIuLi90aGVtZS9jb2JhbHQuY3NzIj5Db2JhbHQ8L2E+IGFuZCA8YSBocmVmPSIuLi90aGVtZS9lY2xpcHNlLmNzcyI+RWNsaXBzZTwvYT4gdGhlbWVzLjwvbGk+CiAgICA8bGk+QWRkIGEgPGEgaHJlZj0ibWFudWFsLmh0bWwjb3B0aW9uX2ZpeGVkR3V0dGVyIj48Y29kZT5maXhlZEd1dHRlcjwvY29kZT48L2E+IG9wdGlvbi48L2xpPgogICAgPGxpPkZpeCBidWcgd2l0aCA8Y29kZT5zZXRWYWx1ZTwvY29kZT4gYnJlYWtpbmcgY3Vyc29yIG1vdmVtZW50LjwvbGk+CiAgICA8bGk+TWFrZSBndXR0ZXIgdXBkYXRlcyBtdWNoIG1vcmUgZWZmaWNpZW50LjwvbGk+CiAgICA8bGk+QWxsb3cgZHJhZ2dpbmcgb2YgdGV4dCBvdXQgb2YgdGhlIGVkaXRvciAob24gbW9kZXJuIGJyb3dzZXJzKS48L2xpPgogIDwvdWw+CgoKICA8cCBjbGFzcz0icmVsIj4yMy0wOC0yMDExOiA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvY29kZW1pcnJvci0yLjEzLnppcCI+VmVyc2lvbiAyLjEzPC9hPjo8L3A+CiAgPHVsIGNsYXNzPSJyZWwtbm90ZSI+CiAgICA8bGk+QWRkIDxhIGhyZWY9Ii4uL21vZGUvcnVieS9pbmRleC5odG1sIj5SdWJ5PC9hPiwgPGEgaHJlZj0iLi4vbW9kZS9yL2luZGV4Lmh0bWwiPlI8L2E+LCA8YSBocmVmPSIuLi9tb2RlL2NvZmZlZXNjcmlwdC9pbmRleC5odG1sIj5Db2ZmZWVTY3JpcHQ8L2E+LCBhbmQgPGEgaHJlZj0iLi4vbW9kZS92ZWxvY2l0eS9pbmRleC5odG1sIj5WZWxvY2l0eTwvYT4gbW9kZXMuPC9saT4KICAgIDxsaT5BZGQgPGEgaHJlZj0ibWFudWFsLmh0bWwjZ2V0R3V0dGVyRWxlbWVudCI+PGNvZGU+Z2V0R3V0dGVyRWxlbWVudDwvY29kZT48L2E+IHRvIEFQSS48L2xpPgogICAgPGxpPlNldmVyYWwgZml4ZXMgdG8gc2Nyb2xsaW5nIGFuZCBwb3NpdGlvbmluZy48L2xpPgogICAgPGxpPkFkZCA8YSBocmVmPSJtYW51YWwuaHRtbCNvcHRpb25fc21hcnRIb21lIj48Y29kZT5zbWFydEhvbWU8L2NvZGU+PC9hPiBvcHRpb24uPC9saT4KICAgIDxsaT5BZGQgYW4gZXhwZXJpbWVudGFsIDxhIGhyZWY9Ii4uL21vZGUveG1scHVyZS9pbmRleC5odG1sIj5wdXJlIFhNTDwvYT4gbW9kZS48L2xpPgogIDwvdWw+CgogIDxwIGNsYXNzPSJyZWwiPjI1LTA3LTIwMTE6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTIuMTIuemlwIj5WZXJzaW9uIDIuMTI8L2E+OjwvcD4KICA8dWwgY2xhc3M9InJlbC1ub3RlIj4KICAgIDxsaT5BZGQgYSA8YSBocmVmPSIuLi9tb2RlL3NwYXJxbC9pbmRleC5odG1sIj5TUEFSUUw8L2E+IG1vZGUuPC9saT4KICAgIDxsaT5GaXggYnVnIHdpdGggY3Vyc29yIGp1bXBpbmcgYXJvdW5kIGluIGFuIHVuZm9jdXNlZCBlZGl0b3IgaW4gSUUuPC9saT4KICAgIDxsaT5BbGxvdyBrZXkgYW5kIG1vdXNlIGV2ZW50cyB0byBidWJibGUgb3V0IG9mIHRoZSBlZGl0b3IuIElnbm9yZSB3aWRnZXQgY2xpY2tzLjwvbGk+CiAgICA8bGk+U29sdmUgY3Vyc29yIGZsYWtpbmVzcyBhZnRlciB1bmRvL3JlZG8uPC9saT4KICAgIDxsaT5GaXggYmxvY2stcmVpbmRlbnQgaWdub3JpbmcgdGhlIGxhc3QgZmV3IGxpbmVzLjwvbGk+CiAgICA8bGk+Rml4IHBhcnNpbmcgb2YgbXVsdGktbGluZSBhdHRycyBpbiBYTUwgbW9kZS48L2xpPgogICAgPGxpPlVzZSA8Y29kZT5pbm5lckhUTUw8L2NvZGU+IGZvciBIVE1MLWVzY2FwaW5nLjwvbGk+CiAgICA8bGk+U29tZSBmaXhlcyB0byBpbmRlbnRhdGlvbiBpbiBDLWxpa2UgbW9kZS48L2xpPgogICAgPGxpPlNocmluayBob3JpeiBzY3JvbGxiYXJzIHdoZW4gbG9uZyBsaW5lcyByZW1vdmVkLjwvbGk+CiAgICA8bGk+Rml4IHdpZHRoIGZlZWRiYWNrIGxvb3AgYnVnIHRoYXQgY2F1c2VkIHRoZSB3aWR0aCBvZiBhbiBpbm5lciBESVYgdG8gc2hyaW5rLjwvbGk+CiAgPC91bD4KCiAgPHAgY2xhc3M9InJlbCI+MDQtMDctMjAxMTogPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2NvZGVtaXJyb3ItMi4xMS56aXAiPlZlcnNpb24gMi4xMTwvYT46PC9wPgogIDx1bCBjbGFzcz0icmVsLW5vdGUiPgogICAgPGxpPkFkZCBhIDxhIGhyZWY9Ii4uL21vZGUvc2NoZW1lL2luZGV4Lmh0bWwiPlNjaGVtZSBtb2RlPC9hPi48L2xpPgogICAgPGxpPkFkZCBhIDxjb2RlPnJlcGxhY2U8L2NvZGU+IG1ldGhvZCB0byBzZWFyY2ggY3Vyc29ycywgZm9yIGN1cnNvci1wcmVzZXJ2aW5nIHJlcGxhY2VtZW50cy48L2xpPgogICAgPGxpPk1ha2UgdGhlIDxhIGhyZWY9Ii4uL21vZGUvY2xpa2UvaW5kZXguaHRtbCI+Qy1saWtlIG1vZGU8L2E+IG1vZGUgbW9yZSBjdXN0b21pemFibGUuPC9saT4KICAgIDxsaT5VcGRhdGUgWE1MIG1vZGUgdG8gc3BvdCBtaXNtYXRjaGVkIHRhZ3MuPC9saT4KICAgIDxsaT5BZGQgPGNvZGU+Z2V0U3RhdGVBZnRlcjwvY29kZT4gQVBJIGFuZCA8Y29kZT5jb21wYXJlU3RhdGU8L2NvZGU+IG1vZGUgQVBJIG1ldGhvZHMgZm9yIGZpbmVyLWdyYWluZWQgbW9kZSBtYWdpYy48L2xpPgogICAgPGxpPkFkZCBhIDxjb2RlPmdldFNjcm9sbGVyRWxlbWVudDwvY29kZT4gQVBJIG1ldGhvZCB0byBtYW5pcHVsYXRlIHRoZSBzY3JvbGxpbmcgRElWLjwvbGk+CiAgICA8bGk+Rml4IGRyYWctYW5kLWRyb3AgZm9yIEZpcmVmb3guPC9saT4KICAgIDxsaT5BZGQgYSBDIyBjb25maWd1cmF0aW9uIGZvciB0aGUgPGEgaHJlZj0iLi4vbW9kZS9jbGlrZS9pbmRleC5odG1sIj5DLWxpa2UgbW9kZTwvYT4uPC9saT4KICAgIDxsaT5BZGQgPGEgaHJlZj0iLi4vZGVtby9mdWxsc2NyZWVuLmh0bWwiPmZ1bGwtc2NyZWVuIGVkaXRpbmc8L2E+IGFuZCA8YSBocmVmPSIuLi9kZW1vL2NoYW5nZW1vZGUuaHRtbCI+bW9kZS1jaGFuZ2luZzwvYT4gZGVtb3MuPC9saT4KICA8L3VsPgoKICA8cCBjbGFzcz0icmVsIj4wNy0wNi0yMDExOiA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvY29kZW1pcnJvci0yLjEuemlwIj5WZXJzaW9uIDIuMTwvYT46PC9wPgogIDxwIGNsYXNzPSJyZWwtbm90ZSI+QWRkCiAgYSA8YSBocmVmPSJtYW51YWwuaHRtbCNvcHRpb25fdGhlbWUiPnRoZW1lPC9hPiBzeXN0ZW0KICAoPGEgaHJlZj0iLi4vZGVtby90aGVtZS5odG1sIj5kZW1vPC9hPikuIE5vdGUgdGhhdCB0aGlzIGlzIG5vdAogIGJhY2t3YXJkcy1jb21wYXRpYmxl4oCUeW91J2xsIGhhdmUgdG8gdXBkYXRlIHlvdXIgc3R5bGVzIGFuZAogIG1vZGVzITwvcD4KCiAgPHAgY2xhc3M9InJlbCI+MDctMDYtMjAxMTogPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2NvZGVtaXJyb3ItMi4wMi56aXAiPlZlcnNpb24gMi4wMjwvYT46PC9wPgogIDx1bCBjbGFzcz0icmVsLW5vdGUiPgogICAgPGxpPkFkZCBhIDxhIGhyZWY9Ii4uL21vZGUvbHVhL2luZGV4Lmh0bWwiPkx1YSBtb2RlPC9hPi48L2xpPgogICAgPGxpPkZpeCByZXZlcnNlLXNlYXJjaGluZyBmb3IgYSByZWdleHAuPC9saT4KICAgIDxsaT5FbXB0eSBsaW5lcyBjYW4gbm8gbG9uZ2VyIGJyZWFrIGhpZ2hsaWdodGluZy48L2xpPgogICAgPGxpPlJld29yayBzY3JvbGxpbmcgbW9kZWwgKHRoZSBvdXRlciB3cmFwcGVyIG5vIGxvbmdlciBkb2VzIHRoZSBzY3JvbGxpbmcpLjwvbGk+CiAgICA8bGk+U29sdmUgaG9yaXpvbnRhbCBqaXR0ZXJpbmcgb24gbG9uZyBsaW5lcy48L2xpPgogICAgPGxpPkFkZCA8YSBocmVmPSIuLi9kZW1vL3J1bm1vZGUuaHRtbCI+cnVubW9kZS5qczwvYT4uPC9saT4KICAgIDxsaT5JbW1lZGlhdGVseSByZS1oaWdobGlnaHQgdGV4dCB3aGVuIHR5cGluZy48L2xpPgogICAgPGxpPkZpeCBwcm9ibGVtIHdpdGggJ3N0aWNraW5nJyBob3Jpem9udGFsIHNjcm9sbGJhci48L2xpPgogIDwvdWw+CgogIDxwIGNsYXNzPSJyZWwiPjI2LTA1LTIwMTE6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTIuMDEuemlwIj5WZXJzaW9uIDIuMDE8L2E+OjwvcD4KICA8dWwgY2xhc3M9InJlbC1ub3RlIj4KICAgIDxsaT5BZGQgYSA8YSBocmVmPSIuLi9tb2RlL3NtYWxsdGFsay9pbmRleC5odG1sIj5TbWFsbHRhbGsgbW9kZTwvYT4uPC9saT4KICAgIDxsaT5BZGQgYSA8YSBocmVmPSIuLi9tb2RlL3JzdC9pbmRleC5odG1sIj5yZVN0cnVjdHVyZWRUZXh0IG1vZGU8L2E+LjwvbGk+CiAgICA8bGk+QWRkIGEgPGEgaHJlZj0iLi4vbW9kZS9weXRob24vaW5kZXguaHRtbCI+UHl0aG9uIG1vZGU8L2E+LjwvbGk+CiAgICA8bGk+QWRkIGEgPGEgaHJlZj0iLi4vbW9kZS9wbHNxbC9pbmRleC5odG1sIj5QTC9TUUwgbW9kZTwvYT4uPC9saT4KICAgIDxsaT48Y29kZT5jb29yZHNDaGFyPC9jb2RlPiBub3cgd29ya3M8L2xpPgogICAgPGxpPkZpeCBhIHByb2JsZW0gd2hlcmUgPGNvZGU+b25DdXJzb3JBY3Rpdml0eTwvY29kZT4gaW50ZXJmZXJlZCB3aXRoIDxjb2RlPm9uQ2hhbmdlPC9jb2RlPi48L2xpPgogICAgPGxpPkZpeCBhIG51bWJlciBvZiBzY3JvbGxpbmcgYW5kIG1vdXNlLWNsaWNrLXBvc2l0aW9uIGdsaXRjaGVzLjwvbGk+CiAgICA8bGk+UGFzcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY2hhbmdlZCBsaW5lcyB0byA8Y29kZT5vbkNoYW5nZTwvY29kZT4uPC9saT4KICAgIDxsaT5TdXBwb3J0IGNtZC11cC9kb3duIG9uIE9TIFguPC9saT4KICAgIDxsaT5BZGQgdHJpcGxlLWNsaWNrIGxpbmUgc2VsZWN0aW9uLjwvbGk+CiAgICA8bGk+RG9uJ3QgaGFuZGxlIHNoaWZ0IHdoZW4gY2hhbmdpbmcgdGhlIHNlbGVjdGlvbiB0aHJvdWdoIHRoZSBBUEkuPC9saT4KICAgIDxsaT5TdXBwb3J0IDxjb2RlPiJub2N1cnNvciI8L2NvZGU+IG1vZGUgZm9yIDxjb2RlPnJlYWRPbmx5PC9jb2RlPiBvcHRpb24uPC9saT4KICAgIDxsaT5BZGQgYW4gPGNvZGU+b25IaWdobGlnaHRDb21wbGV0ZTwvY29kZT4gb3B0aW9uLjwvbGk+CiAgICA8bGk+Rml4IHRoZSBjb250ZXh0IG1lbnUgZm9yIEZpcmVmb3guPC9saT4KICA8L3VsPgoKICA8cCBjbGFzcz0icmVsIj4yOC0wMy0yMDExOiA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvY29kZW1pcnJvci0yLjAuemlwIj5WZXJzaW9uIDIuMDwvYT46PC9wPgogIDxwIGNsYXNzPSJyZWwtbm90ZSI+Q29kZU1pcnJvciAyIGlzIGEgY29tcGxldGUgcmV3cml0ZSB0aGF0J3MKICBmYXN0ZXIsIHNtYWxsZXIsIHNpbXBsZXIgdG8gdXNlLCBhbmQgbGVzcyBkZXBlbmRlbnQgb24gYnJvd3NlcgogIHF1aXJrcy4gU2VlIDxhIGhyZWY9ImludGVybmFscy5odG1sIj50aGlzPC9hPgogIGFuZCA8YSBocmVmPSJodHRwOi8vZ3JvdXBzLmdvb2dsZS5jb20vZ3JvdXAvY29kZW1pcnJvci9icm93c2VfdGhyZWFkL3RocmVhZC81YThlODk0MDI0YTlmNTgwIj50aGlzPC9hPgogIGZvciBtb3JlIGluZm9ybWF0aW9uLjwvcD4KCiAgPHAgY2xhc3M9InJlbCI+MjItMDItMjAxMTogPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvY29kZW1pcnJvci90cmVlL2JldGEyIj5WZXJzaW9uIDIuMCBiZXRhIDI8L2E+OjwvcD4KICA8cCBjbGFzcz0icmVsLW5vdGUiPlNvbWV3aGF0IG1vcmUgbWF0dXJlIEFQSSwgbG90cyBvZiBidWdzIHNoYWtlbiBvdXQuPC9wPgoKICA8cCBjbGFzcz0icmVsIj4xNy0wMi0yMDExOiA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvY29kZW1pcnJvci0wLjk0LnppcCI+VmVyc2lvbiAwLjk0PC9hPjo8L3A+CiAgPHVsIGNsYXNzPSJyZWwtbm90ZSI+CiAgICA8bGk+PGNvZGU+dGFiTW9kZTogInNwYWNlcyI8L2NvZGU+IHdhcyBtb2RpZmllZCBzbGlnaHRseSAobm93IGluZGVudHMgd2hlbiBzb21ldGhpbmcgaXMgc2VsZWN0ZWQpLjwvbGk+CiAgICA8bGk+Rml4ZXMgYSBidWcgdGhhdCB3b3VsZCBjYXVzZSB0aGUgc2VsZWN0aW9uIGNvZGUgdG8gYnJlYWsgb24gc29tZSBJRSB2ZXJzaW9ucy48L2xpPgogICAgPGxpPkRpc2FibGluZyBzcGVsbC1jaGVjayBvbiBXZWJLaXQgYnJvd3NlcnMgbm93IHdvcmtzLjwvbGk+CiAgPC91bD4KCiAgPHAgY2xhc3M9InJlbCI+MDgtMDItMjAxMTogPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0LyI+VmVyc2lvbiAyLjAgYmV0YSAxPC9hPjo8L3A+CiAgPHAgY2xhc3M9InJlbC1ub3RlIj5Db2RlTWlycm9yIDIgaXMgYSBjb21wbGV0ZSByZXdyaXRlIG9mCiAgQ29kZU1pcnJvciwgbm8gbG9uZ2VyIGRlcGVuZGluZyBvbiBhbiBlZGl0YWJsZSBmcmFtZS48L3A+CgogIDxwIGNsYXNzPSJyZWwiPjE5LTAxLTIwMTE6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTAuOTMuemlwIj5WZXJzaW9uIDAuOTM8L2E+OjwvcD4KICA8dWwgY2xhc3M9InJlbC1ub3RlIj4KICAgIDxsaT5BZGRlZCBhIDxhIGhyZWY9ImNvbnRyaWIvcmVnZXgvaW5kZXguaHRtbCI+UmVndWxhciBFeHByZXNzaW9uPC9hPiBwYXJzZXIuPC9saT4KICAgIDxsaT5GaXhlcyB0byB0aGUgUEhQIHBhcnNlci48L2xpPgogICAgPGxpPlN1cHBvcnQgZm9yIHJlZ3VsYXIgZXhwcmVzc2lvbiBpbiBzZWFyY2gvcmVwbGFjZS48L2xpPgogICAgPGxpPkFkZCA8Y29kZT5zYXZlPC9jb2RlPiBtZXRob2QgdG8gaW5zdGFuY2VzIGNyZWF0ZWQgd2l0aCA8Y29kZT5mcm9tVGV4dEFyZWE8L2NvZGU+LjwvbGk+CiAgICA8bGk+QWRkIHN1cHBvcnQgZm9yIE1TIFQtU1FMIGluIHRoZSBTUUwgcGFyc2VyLjwvbGk+CiAgICA8bGk+U3VwcG9ydCB1c2Ugb2YgQ1NTIGNsYXNzZXMgZm9yIGhpZ2hsaWdodGluZyBicmFja2V0cy48L2xpPgogICAgPGxpPkZpeCB5ZXQgYW5vdGhlciBoYW5nIHdpdGggbGluZS1udW1iZXJpbmcgaW4gaGlkZGVuIGVkaXRvcnMuPC9saT4KICA8L3VsPgo8L3NlY3Rpb24+Cgo8c2VjdGlvbiBpZD12MT4KCiAgPGgyPlZlcnNpb24gMC54PC9oMj4KCiAgPHAgY2xhc3M9InJlbCI+MjgtMDMtMjAxMTogPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2NvZGVtaXJyb3ItMS4wLnppcCI+VmVyc2lvbiAxLjA8L2E+OjwvcD4KICA8dWwgY2xhc3M9InJlbC1ub3RlIj4KICAgIDxsaT5GaXggZXJyb3Igd2hlbiBkZWJ1ZyBoaXN0b3J5IG92ZXJmbG93cy48L2xpPgogICAgPGxpPlJlZmluZSBoYW5kbGluZyBvZiBDIyB2ZXJiYXRpbSBzdHJpbmdzLjwvbGk+CiAgICA8bGk+Rml4IHNvbWUgaXNzdWVzIHdpdGggSmF2YVNjcmlwdCBpbmRlbnRhdGlvbi48L2xpPgogIDwvdWw+CgogIDxwIGNsYXNzPSJyZWwiPjE3LTEyLTIwMTA6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTAuOTIuemlwIj5WZXJzaW9uIDAuOTI8L2E+OjwvcD4KICA8dWwgY2xhc3M9InJlbC1ub3RlIj4KICAgIDxsaT5NYWtlIENvZGVNaXJyb3Igd29yayBpbiBYSFRNTCBkb2N1bWVudHMuPC9saT4KICAgIDxsaT5GaXggYnVnIGluIGhhbmRsaW5nIG9mIGJhY2tzbGFzaGVzIGluIFB5dGhvbiBzdHJpbmdzLjwvbGk+CiAgICA8bGk+VGhlIDxjb2RlPnN0eWxlTnVtYmVyczwvY29kZT4gb3B0aW9uIGlzIG5vdyBvZmZpY2lhbGx5CiAgICBzdXBwb3J0ZWQgYW5kIGRvY3VtZW50ZWQuPC9saT4KICAgIDxsaT48Y29kZT5vbkxpbmVOdW1iZXJDbGljazwvY29kZT4gb3B0aW9uIGFkZGVkLjwvbGk+CiAgICA8bGk+TW9yZSBjb25zaXN0ZW50IG5hbWVzIDxjb2RlPm9uTG9hZDwvY29kZT4gYW5kCiAgICA8Y29kZT5vbkN1cnNvckFjdGl2aXR5PC9jb2RlPiBjYWxsYmFja3MuIE9sZCBuYW1lcyBzdGlsbCB3b3JrLCBidXQKICAgIGFyZSBkZXByZWNhdGVkLjwvbGk+CiAgICA8bGk+QWRkIGEgPGEgaHJlZj0iY29udHJpYi9mcmVlbWFya2VyL2luZGV4Lmh0bWwiPkZyZWVtYXJrZXI8L2E+IG1vZGUuPC9saT4KICA8L3VsPgoKICA8cCBjbGFzcz0icmVsIj4xMS0xMS0yMDEwOiA8YQogIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTAuOTEuemlwIj5WZXJzaW9uIDAuOTE8L2E+OjwvcD4KICA8dWwgY2xhc3M9InJlbC1ub3RlIj4KICAgIDxsaT5BZGRzIHN1cHBvcnQgZm9yIDxhIGhyZWY9ImNvbnRyaWIvamF2YSI+SmF2YTwvYT4uPC9saT4KICAgIDxsaT5TbWFsbCBhZGRpdGlvbnMgdG8gdGhlIDxhIGhyZWY9ImNvbnRyaWIvcGhwIj5QSFA8L2E+IGFuZCA8YSBocmVmPSJjb250cmliL3NxbCI+U1FMPC9hPiBwYXJzZXJzLjwvbGk+CiAgICA8bGk+V29yayBhcm91bmQgdmFyaW91cyA8YSBocmVmPSJodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDc4MDYiPldlYmtpdDwvYT4gPGEgaHJlZj0iaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTIzNDc0Ij5pc3N1ZXM8L2E+LjwvbGk+CiAgICA8bGk+Rml4IDxjb2RlPnRvVGV4dEFyZWE8L2NvZGU+IHRvIHVwZGF0ZSB0aGUgY29kZSBpbiB0aGUgdGV4dGFyZWEuPC9saT4KICAgIDxsaT5BZGQgYSA8Y29kZT5ub1NjcmlwdENhY2hpbmc8L2NvZGU+IG9wdGlvbiAoaGFjayB0byBlYXNlIGRldmVsb3BtZW50KS48L2xpPgogICAgPGxpPk1ha2Ugc3ViLW1vZGVzIG9mIDxhIGhyZWY9Im1peGVkdGVzdC5odG1sIj5IVE1MIG1peGVkPC9hPiBtb2RlIGNvbmZpZ3VyYWJsZS48L2xpPgogIDwvdWw+CgogIDxwIGNsYXNzPSJyZWwiPjAyLTEwLTIwMTA6IDxhCiAgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2NvZGVtaXJyb3ItMC45LnppcCI+VmVyc2lvbiAwLjk8L2E+OjwvcD4KICA8dWwgY2xhc3M9InJlbC1ub3RlIj4KICAgIDxsaT5BZGQgc3VwcG9ydCBmb3Igc2VhcmNoaW5nIGJhY2t3YXJkcy48L2xpPgogICAgPGxpPlRoZXJlIGFyZSBub3cgcGFyc2VycyBmb3IgPGEgaHJlZj0iY29udHJpYi9zY2hlbWUvaW5kZXguaHRtbCI+U2NoZW1lPC9hPiwgPGEgaHJlZj0iY29udHJpYi94cXVlcnkvaW5kZXguaHRtbCI+WFF1ZXJ5PC9hPiwgYW5kIDxhIGhyZWY9ImNvbnRyaWIvb21ldGEvaW5kZXguaHRtbCI+T21ldGFKUzwvYT4uPC9saT4KICAgIDxsaT5NYWtlcyA8Y29kZT5oZWlnaHQ6ICJkeW5hbWljIjwvY29kZT4gbW9yZSByb2J1c3QuPC9saT4KICAgIDxsaT5GaXhlcyBidWcgd2hlcmUgcGFzdGUgZGlkIG5vdCB3b3JrIG9uIE9TIFguPC9saT4KICAgIDxsaT5BZGQgYSA8Y29kZT5lbnRlck1vZGU8L2NvZGU+IGFuZCA8Y29kZT5lbGVjdHJpY0NoYXJzPC9jb2RlPiBvcHRpb25zIHRvIG1ha2UgaW5kZW50YXRpb24gZXZlbiBtb3JlIGN1c3RvbWl6YWJsZS48L2xpPgogICAgPGxpPkFkZCA8Y29kZT5maXJzdExpbmVOdW1iZXI8L2NvZGU+IG9wdGlvbi48L2xpPgogICAgPGxpPkZpeCBiYWQgaGFuZGxpbmcgb2YgPGNvZGU+QG1lZGlhPC9jb2RlPiBydWxlcyBieSB0aGUgQ1NTIHBhcnNlci48L2xpPgogICAgPGxpPlRha2UgYSBuZXcsIG1vcmUgcm9idXN0IGFwcHJvYWNoIHRvIHdvcmtpbmcgYXJvdW5kIHRoZSBpbnZpc2libGUtbGFzdC1saW5lIGJ1ZyBpbiBXZWJLaXQuPC9saT4KICA8L3VsPgoKICA8cCBjbGFzcz0icmVsIj4yMi0wNy0yMDEwOiA8YQogIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTAuOC56aXAiPlZlcnNpb24gMC44PC9hPjo8L3A+CiAgPHVsIGNsYXNzPSJyZWwtbm90ZSI+CiAgICA8bGk+QWRkIGEgPGNvZGU+Y3Vyc29yQ29vcmRzPC9jb2RlPiBtZXRob2QgdG8gZmluZCB0aGUgc2NyZWVuCiAgICBjb29yZGluYXRlcyBvZiB0aGUgY3Vyc29yLjwvbGk+CiAgICA8bGk+QSBudW1iZXIgb2YgZml4ZXMgYW5kIHN1cHBvcnQgZm9yIG1vcmUgc3ludGF4IGluIHRoZSBQSFAgcGFyc2VyLjwvbGk+CiAgICA8bGk+Rml4IGluZGVudGF0aW9uIHByb2JsZW0gd2l0aCBKU09OLW1vZGUgSlMgcGFyc2VyIGluIFdlYmtpdC48L2xpPgogICAgPGxpPkFkZCBhIDxhIGhyZWY9ImNvbXByZXNzLmh0bWwiPm1pbmlmaWNhdGlvbjwvYT4gVUkuPC9saT4KICAgIDxsaT5TdXBwb3J0IGEgPGNvZGU+aGVpZ2h0OiBkeW5hbWljPC9jb2RlPiBtb2RlLCB3aGVyZSB0aGUgZWRpdG9yJ3MKICAgIGhlaWdodCB3aWxsIGFkanVzdCB0byB0aGUgc2l6ZSBvZiBpdHMgY29udGVudC48L2xpPgogICAgPGxpPkJldHRlciBzdXBwb3J0IGZvciBJTUUgaW5wdXQgbW9kZS48L2xpPgogICAgPGxpPkZpeCBKYXZhU2NyaXB0IHBhcnNlciBnZXR0aW5nIGNvbmZ1c2VkIHdoZW4gc2VlaW5nIGEgbm8tYXJndW1lbnQKICAgIGZ1bmN0aW9uIGNhbGwuPC9saT4KICAgIDxsaT5IYXZlIENTUyBwYXJzZXIgc2VlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gc2VsZWN0b3JzIGFuZCBvdGhlcgogICAgaWRlbnRpZmllcnMuPC9saT4KICAgIDxsaT5GaXggc2Nyb2xsaW5nIGJ1ZyB3aGVuIHBhc3RpbmcgaW4gYSBob3Jpem9udGFsbHktc2Nyb2xsZWQKICAgIGVkaXRvci48L2xpPgogICAgPGxpPlN1cHBvcnQgPGNvZGU+dG9UZXh0QXJlYTwvY29kZT4gbWV0aG9kIGluIGluc3RhbmNlcyBjcmVhdGVkIHdpdGgKICAgIDxjb2RlPmZyb21UZXh0QXJlYTwvY29kZT4uPC9saT4KICAgIDxsaT5Xb3JrIGFyb3VuZCBuZXcgT3BlcmEgY3Vyc29yIGJ1ZyB0aGF0IGNhdXNlcyB0aGUgY3Vyc29yIHRvIGp1bXAKICAgIHdoZW4gcHJlc3NpbmcgYmFja3NwYWNlIGF0IHRoZSBlbmQgb2YgYSBsaW5lLjwvbGk+CiAgPC91bD4KCiAgPHAgY2xhc3M9InJlbCI+MjctMDQtMjAxMDogPGEKICBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvY29kZW1pcnJvci0wLjY3LnppcCI+VmVyc2lvbgogIDAuNjc8L2E+OjwvcD4KICA8cCBjbGFzcz0icmVsLW5vdGUiPk1vcmUgY29uc2lzdGVudCBwYWdlLXVwL3BhZ2UtZG93biBiZWhhdmlvdXIKICBhY3Jvc3MgYnJvd3NlcnMuIEZpeCBzb21lIGlzc3VlcyB3aXRoIGhpZGRlbiBlZGl0b3JzIGxvb3BpbmcgZm9yZXZlcgogIHdoZW4gbGluZS1udW1iZXJzIHdlcmUgZW5hYmxlZC4gTWFrZSBQSFAgcGFyc2VyIHBhcnNlCiAgPGNvZGU+IlxcIjwvY29kZT4gY29ycmVjdGx5LiBIYXZlIDxjb2RlPmp1bXBUb0xpbmU8L2NvZGU+IHdvcmsgb24KICBsaW5lIGhhbmRsZXMsIGFuZCBhZGQgPGNvZGU+Y3Vyc29yTGluZTwvY29kZT4gZnVuY3Rpb24gdG8gZmV0Y2ggdGhlCiAgbGluZSBoYW5kbGUgd2hlcmUgdGhlIGN1cnNvciBjdXJyZW50bHkgaXMuIEFkZCBuZXcKICA8Y29kZT5zZXRTdHlsZXNoZWV0PC9jb2RlPiBmdW5jdGlvbiB0byBzd2l0Y2ggc3R5bGUtc2hlZXRzIGluIGEKICBydW5uaW5nIGVkaXRvci48L3A+CgogIDxwIGNsYXNzPSJyZWwiPjAxLTAzLTIwMTA6IDxhCiAgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2NvZGVtaXJyb3ItMC42Ni56aXAiPlZlcnNpb24KICAwLjY2PC9hPjo8L3A+CiAgPHAgY2xhc3M9InJlbC1ub3RlIj5BZGRzIDxjb2RlPnJlbW92ZUxpbmU8L2NvZGU+IG1ldGhvZCB0byBBUEkuCiAgSW50cm9kdWNlcyB0aGUgPGEgaHJlZj0iY29udHJpYi9wbHNxbC9pbmRleC5odG1sIj5QTFNRTCBwYXJzZXI8L2E+LgogIE1hcmtzIFhNTCBlcnJvcnMgYnkgYWRkaW5nIChyYXRoZXIgdGhhbiByZXBsYWNpbmcpIGEgQ1NTIGNsYXNzLCBzbwogIHRoYXQgdGhleSBjYW4gYmUgZGlzYWJsZWQgYnkgbW9kaWZ5aW5nIHRoZWlyIHN0eWxlLiBGaXhlcyBzZXZlcmFsCiAgc2VsZWN0aW9uIGJ1Z3MsIGFuZCBhIG51bWJlciBvZiBzbWFsbCBnbGl0Y2hlcy48L3A+CgogIDxwIGNsYXNzPSJyZWwiPjEyLTExLTIwMDk6IDxhCiAgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2NvZGVtaXJyb3ItMC42NS56aXAiPlZlcnNpb24KICAwLjY1PC9hPjo8L3A+CiAgPHAgY2xhc3M9InJlbC1ub3RlIj5BZGQgc3VwcG9ydCBmb3IgaGF2aW5nIGJvdGggbGluZS13cmFwcGluZyBhbmQKICBsaW5lLW51bWJlcnMgdHVybmVkIG9uLCBtYWtlIHBhcmVuLWhpZ2hsaWdodGluZyBzdHlsZSBjdXN0b21pc2FibGUKICAoPGNvZGU+bWFya1BhcmVuPC9jb2RlPiBhbmQgPGNvZGU+dW5tYXJrUGFyZW48L2NvZGU+IGNvbmZpZwogIG9wdGlvbnMpLCB3b3JrIGFyb3VuZCBhIHNlbGVjdGlvbiBidWcgdGhhdCBPcGVyYQogIDxlbT5yZTwvZW0+aW50cm9kdWNlZCBpbiB2ZXJzaW9uIDEwLjwvcD4KCiAgPHAgY2xhc3M9InJlbCI+MjMtMTAtMjAwOTogPGEKICBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvY29kZW1pcnJvci0wLjY0LnppcCI+VmVyc2lvbgogIDAuNjQ8L2E+OjwvcD4KICA8cCBjbGFzcz0icmVsLW5vdGUiPlNvbHZlcyBzb21lIGlzc3VlcyBpbnRyb2R1Y2VkIGJ5IHRoZQogIHBhc3RlLWhhbmRsaW5nIGNoYW5nZXMgZnJvbSB0aGUgcHJldmlvdXMgcmVsZWFzZS4gQWRkcwogIDxjb2RlPnNldFNwZWxsY2hlY2s8L2NvZGU+LCA8Y29kZT5zZXRUZXh0V3JhcHBpbmc8L2NvZGU+LAogIDxjb2RlPnNldEluZGVudFVuaXQ8L2NvZGU+LCA8Y29kZT5zZXRVbmRvRGVwdGg8L2NvZGU+LAogIDxjb2RlPnNldFRhYk1vZGU8L2NvZGU+LCBhbmQgPGNvZGU+c2V0TGluZU51bWJlcnM8L2NvZGU+IHRvCiAgY3VzdG9taXNlIGEgcnVubmluZyBlZGl0b3IuIEludHJvZHVjZXMgYW4gPGEKICBocmVmPSJjb250cmliL3NxbC9pbmRleC5odG1sIj5TUUw8L2E+IHBhcnNlci4gRml4ZXMgYSBmZXcgc21hbGwKICBwcm9ibGVtcyBpbiB0aGUgPGEgaHJlZj0iY29udHJpYi9weXRob24vaW5kZXguaHRtbCI+UHl0aG9uPC9hPgogIHBhcnNlci4gQW5kLCBhcyB1c3VhbCwgYWRkIHdvcmthcm91bmRzIGZvciB2YXJpb3VzIG5ld2x5IGRpc2NvdmVyZWQKICBicm93c2VyIGluY29tcGF0aWJpbGl0aWVzLjwvcD4KCiAgPHAgY2xhc3M9InJlbCI+PGVtPjMxLTA4LTIwMDk8L2VtPjogPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2NvZGVtaXJyb3ItMC42My56aXAiPlZlcnNpb24gMC42MzwvYT46PC9wPgogIDxwIGNsYXNzPSJyZWwtbm90ZSI+IE92ZXJoYXVsIG9mIHBhc3RlLWhhbmRsaW5nIChsZXNzIGZyYWdpbGUpLCBmaXhlcyBmb3Igc2V2ZXJhbAogIHNlcmlvdXMgSUU4IGlzc3VlcyAoY3Vyc29yIGp1bXBpbmcsIGVuZC1vZi1kb2N1bWVudCBidWdzKSBhbmQgYSBudW1iZXIKICBvZiBzbWFsbCBwcm9ibGVtcy48L3A+CgogIDxwIGNsYXNzPSJyZWwiPjxlbT4zMC0wNS0yMDA5PC9lbT46IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTAuNjIuemlwIj5WZXJzaW9uIDAuNjI8L2E+OjwvcD4KICA8cCBjbGFzcz0icmVsLW5vdGUiPkludHJvZHVjZXMgPGEgaHJlZj0iY29udHJpYi9weXRob24vaW5kZXguaHRtbCI+UHl0aG9uPC9hPgogIGFuZCA8YSBocmVmPSJjb250cmliL2x1YS9pbmRleC5odG1sIj5MdWE8L2E+IHBhcnNlcnMuIEFkZAogIDxjb2RlPnNldFBhcnNlcjwvY29kZT4gKG9uLXRoZS1mbHkgbW9kZSBjaGFuZ2luZykgYW5kCiAgPGNvZGU+Y2xlYXJIaXN0b3J5PC9jb2RlPiBtZXRob2RzLiBNYWtlIHBhcnNpbmcgcGFzc2VzIHRpbWUtYmFzZWQKICBpbnN0ZWFkIG9mIGxpbmVzLWJhc2VkIChzZWUgdGhlIDxjb2RlPnBhc3NUaW1lPC9jb2RlPiBvcHRpb24pLjwvcD4KCjwvc2VjdGlvbj4KPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/doc/reporting.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogUmVwb3J0aW5nIEJ1Z3M8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSJkb2NzLmNzcyI+Cgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxpbWcgaWQ9bG9nbyBzcmM9ImxvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Im1hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+UmVwb3J0aW5nIGJ1Z3M8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KCjxoMj5SZXBvcnRpbmcgYnVncyBlZmZlY3RpdmVseTwvaDI+Cgo8ZGl2IGNsYXNzPSJsZWZ0Ij4KCjxwPlNvIHlvdSBmb3VuZCBhIHByb2JsZW0gaW4gQ29kZU1pcnJvci4gQnkgYWxsIG1lYW5zLCByZXBvcnQgaXQhIEJ1ZwpyZXBvcnRzIGZyb20gdXNlcnMgYXJlIHRoZSBtYWluIGRyaXZlIGJlaGluZCBpbXByb3ZlbWVudHMgdG8KQ29kZU1pcnJvci4gQnV0IGZpcnN0LCBwbGVhc2UgcmVhZCBvdmVyIHRoZXNlIHBvaW50czo8L3A+Cgo8b2w+CiAgPGxpPkNvZGVNaXJyb3IgaXMgbWFpbnRhaW5lZCBieSB2b2x1bnRlZXJzLiBUaGV5IGRvbid0IG93ZSB5b3UKICBhbnl0aGluZywgc28gYmUgcG9saXRlLiBSZXBvcnRzIHdpdGggYW4gaW5kaWduYW50IG9yIGJlbGxpZ2VyZW50CiAgdG9uZSB0ZW5kIHRvIGJlIG1vdmVkIHRvIHRoZSBib3R0b20gb2YgdGhlIHBpbGUuPC9saT4KCiAgPGxpPkluY2x1ZGUgaW5mb3JtYXRpb24gYWJvdXQgPHN0cm9uZz50aGUgYnJvd3NlciBpbiB3aGljaCB0aGUKICBwcm9ibGVtIG9jY3VycmVkPC9zdHJvbmc+LiBFdmVuIGlmIHlvdSB0ZXN0ZWQgc2V2ZXJhbCBicm93c2VycywgYW5kCiAgdGhlIHByb2JsZW0gb2NjdXJyZWQgaW4gYWxsIG9mIHRoZW0sIG1lbnRpb24gdGhpcyBmYWN0IGluIHRoZSBidWcKICByZXBvcnQuIEFsc28gaW5jbHVkZSBicm93c2VyIHZlcnNpb24gbnVtYmVycyBhbmQgdGhlIG9wZXJhdGluZwogIHN5c3RlbSB0aGF0IHlvdSdyZSBvbi48L2xpPgoKICA8bGk+TWVudGlvbiB3aGljaCByZWxlYXNlIG9mIENvZGVNaXJyb3IgeW91J3JlIHVzaW5nLiBQcmVmZXJhYmx5LAogIHRyeSBhbHNvIHdpdGggdGhlIGN1cnJlbnQgZGV2ZWxvcG1lbnQgc25hcHNob3QsIHRvIGVuc3VyZSB0aGUKICBwcm9ibGVtIGhhcyBub3QgYWxyZWFkeSBiZWVuIGZpeGVkLjwvbGk+CgogIDxsaT5NZW50aW9uIHZlcnkgcHJlY2lzZWx5IHdoYXQgd2VudCB3cm9uZy4gIlggaXMgYnJva2VuIiBpcyBub3QgYQogIGdvb2QgYnVnIHJlcG9ydC4gV2hhdCBkaWQgeW91IGV4cGVjdCB0byBoYXBwZW4/IFdoYXQgaGFwcGVuZWQKICBpbnN0ZWFkPyBEZXNjcmliZSB0aGUgZXhhY3Qgc3RlcHMgYSBtYWludGFpbmVyIGhhcyB0byB0YWtlIHRvIG1ha2UKICB0aGUgcHJvYmxlbSBvY2N1ci4gV2UgY2FuIG5vdCBmaXggc29tZXRoaW5nIHRoYXQgd2UgY2FuIG5vdAogIG9ic2VydmUuPC9saT4KCiAgPGxpPklmIHRoZSBwcm9ibGVtIGNhbiBub3QgYmUgcmVwcm9kdWNlZCBpbiBhbnkgb2YgdGhlIGRlbW9zCiAgaW5jbHVkZWQgaW4gdGhlIENvZGVNaXJyb3IgZGlzdHJpYnV0aW9uLCBwbGVhc2UgcHJvdmlkZSBhbiBIVE1MCiAgZG9jdW1lbnQgdGhhdCBkZW1vbnN0cmF0ZXMgdGhlIHByb2JsZW0uIFRoZSBiZXN0IHdheSB0byBkbyB0aGlzIGlzCiAgdG8gZ28gdG8gPGEgaHJlZj0iaHR0cDovL2pzYmluLmNvbS9paHVuaW4vMS9lZGl0Ij5qc2Jpbi5jb208L2E+LCBlbnRlcgogIGl0IHRoZXJlLCBwcmVzcyBzYXZlLCBhbmQgaW5jbHVkZSB0aGUgcmVzdWx0aW5nIGxpbmsgaW4geW91ciBidWcKICByZXBvcnQuPC9saT4KPC9vbD4KCjwvZGl2PgoKPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/doc/upgrade_v2.2.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogVmVyc2lvbiAyLjIgdXBncmFkZSBndWlkZTwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9ImRvY3MuY3NzIj4KCjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGltZyBpZD1sb2dvIHNyYz0ibG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0ibWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj4yLjIgdXBncmFkZSBndWlkZTwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgoKPGgyPlVwZ3JhZGluZyB0byB2Mi4yPC9oMj4KCjxwPlRoZXJlIGFyZSBhIGZldyB0aGluZ3MgaW4gdGhlIDIuMiByZWxlYXNlIHRoYXQgcmVxdWlyZSBzb21lIGNhcmUKd2hlbiB1cGdyYWRpbmcuPC9wPgoKPGgzPk5vIG1vcmUgZGVmYXVsdC5jc3M8L2gzPgoKPHA+VGhlIGRlZmF1bHQgdGhlbWUgaXMgbm93IGluY2x1ZGVkCmluIDxhIGhyZWY9Ii4uL2xpYi9jb2RlbWlycm9yLmNzcyI+PGNvZGU+Y29kZW1pcnJvci5jc3M8L2NvZGU+PC9hPiwgc28KeW91IGRvIG5vdCBoYXZlIHRvIGluY2x1ZGVkIGl0IHNlcGFyYXRlbHkgYW55bW9yZS4gKEl0IHdhcyB0aW55LCBzbwpldmVuIGlmIHlvdSdyZSBub3QgdXNpbmcgaXQsIHRoZSBleHRyYSBkYXRhIG92ZXJoZWFkIGlzIG5lZ2xpZ2libGUuKQoKPGgzPkRpZmZlcmVudCBrZXkgY3VzdG9taXphdGlvbjwvaDM+Cgo8cD5Db2RlTWlycm9yIGhhcyBtb3ZlZCB0byBhIHN5c3RlbQp3aGVyZSA8YSBocmVmPSJtYW51YWwuaHRtbCNvcHRpb25fa2V5TWFwIj5rZXltYXBzPC9hPiBhcmUgdXNlZCB0bwpiaW5kIGJlaGF2aW9yIHRvIGtleXMuIFRoaXMgbWVhbnMgPGEgaHJlZj0iLi4vZGVtby9lbWFjcy5odG1sIj5jdXN0b20KYmluZGluZ3M8L2E+IGFyZSBub3cgcG9zc2libGUuPC9wPgoKPHA+VGhyZWUgb3B0aW9ucyB0aGF0IGluZmx1ZW5jZWQga2V5CmJlaGF2aW9yLCA8Y29kZT50YWJNb2RlPC9jb2RlPiwgPGNvZGU+ZW50ZXJNb2RlPC9jb2RlPiwKYW5kIDxjb2RlPnNtYXJ0SG9tZTwvY29kZT4sIGFyZSBubyBsb25nZXIgc3VwcG9ydGVkLiBJbnN0ZWFkLCB5b3UgY2FuCnByb3ZpZGUgY3VzdG9tIGJpbmRpbmdzIHRvIGluZmx1ZW5jZSB0aGUgd2F5IHRoZXNlIGtleXMgYWN0LiBUaGlzIGlzCmRvbmUgdGhyb3VnaCB0aGUKbmV3IDxhIGhyZWY9Im1hbnVhbC5odG1sI29wdGlvbl9leHRyYUtleXMiPjxjb2RlPmV4dHJhS2V5czwvY29kZT48L2E+Cm9wdGlvbiwgd2hpY2ggY2FuIGhvbGQgYW4gb2JqZWN0IG1hcHBpbmcga2V5IG5hbWVzIHRvIGZ1bmN0aW9uYWxpdHkuIEEKc2ltcGxlIGV4YW1wbGUgd291bGQgYmU6PC9wPgoKPHByZT4gIGV4dHJhS2V5czogewogICAgIkN0cmwtUyI6IGZ1bmN0aW9uKGluc3RhbmNlKSB7IHNhdmVUZXh0KGluc3RhbmNlLmdldFZhbHVlKCkpOyB9LAogICAgIkN0cmwtLyI6ICJ1bmRvIgogIH08L3ByZT4KCjxwPktleXMgY2FuIGJlIG1hcHBlZCBlaXRoZXIgdG8gZnVuY3Rpb25zLCB3aGljaCB3aWxsIGJlIGdpdmVuIHRoZQplZGl0b3IgaW5zdGFuY2UgYXMgYXJndW1lbnQsIG9yIHRvIHN0cmluZ3MsIHdoaWNoIGFyZSBtYXBwZWQgdGhyb3VnaApmdW5jdGlvbnMgdGhyb3VnaCB0aGUgPGNvZGU+Q29kZU1pcnJvci5jb21tYW5kczwvY29kZT4gdGFibGUsIHdoaWNoCmNvbnRhaW5zIGFsbCB0aGUgYnVpbHQtaW4gZWRpdGluZyBjb21tYW5kcywgYW5kIGNhbiBiZSBpbnNwZWN0ZWQgYW5kCmV4dGVuZGVkIGJ5IGV4dGVybmFsIGNvZGUuPC9wPgoKPHA+QnkgZGVmYXVsdCwgdGhlIDxjb2RlPkhvbWU8L2NvZGU+IGtleSBpcyBib3VuZCB0bwp0aGUgPGNvZGU+ImdvTGluZVN0YXJ0U21hcnQiPC9jb2RlPiBjb21tYW5kLCB3aGljaCBtb3ZlcyB0aGUgY3Vyc29yIHRvCnRoZSBmaXJzdCBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIgb24gdGhlIGxpbmUuIFlvdSBjYW4gc2V0IGRvIHRoaXMgdG8KbWFrZSBpdCBhbHdheXMgZ28gdG8gdGhlIHZlcnkgc3RhcnQgaW5zdGVhZDo8L3A+Cgo8cHJlPiAgZXh0cmFLZXlzOiB7IkhvbWUiOiAiZ29MaW5lU3RhcnQifTwvcHJlPgoKPHA+U2ltaWxhcmx5LCA8Y29kZT5FbnRlcjwvY29kZT4gaXMgYm91bmQKdG8gPGNvZGU+Im5ld2xpbmVBbmRJbmRlbnQiPC9jb2RlPiBieSBkZWZhdWx0LiBZb3UgY2FuIGJpbmQgaXQgdG8Kc29tZXRoaW5nIGVsc2UgdG8gZ2V0IGRpZmZlcmVudCBiZWhhdmlvci4gVG8gZGlzYWJsZSBzcGVjaWFsIGhhbmRsaW5nCmNvbXBsZXRlbHkgYW5kIG9ubHkgZ2V0IGEgbmV3bGluZSBjaGFyYWN0ZXIgaW5zZXJ0ZWQsIHlvdSBjYW4gYmluZCBpdAp0byA8Y29kZT5mYWxzZTwvY29kZT46PC9wPgoKPHByZT4gIGV4dHJhS2V5czogeyJFbnRlciI6IGZhbHNlfTwvcHJlPgoKPHA+VGhlIHNhbWUgd29ya3MgZm9yIDxjb2RlPlRhYjwvY29kZT4uIElmIHlvdSBkb24ndCB3YW50IENvZGVNaXJyb3IKdG8gaGFuZGxlIGl0LCBiaW5kIGl0IHRvIDxjb2RlPmZhbHNlPC9jb2RlPi4gVGhlIGRlZmF1bHQgYmVoYXZpb3VyIGlzCnRvIGluZGVudCB0aGUgY3VycmVudCBsaW5lIG1vcmUgKDxjb2RlPiJpbmRlbnRNb3JlIjwvY29kZT4gY29tbWFuZCksCmFuZCBpbmRlbnQgaXQgbGVzcyB3aGVuIHNoaWZ0IGlzIGhlbGQgKDxjb2RlPiJpbmRlbnRMZXNzIjwvY29kZT4pLgpUaGVyZSBhcmUgYWxzbyA8Y29kZT4iaW5kZW50QXV0byI8L2NvZGU+IChzbWFydCBpbmRlbnQpCmFuZCA8Y29kZT4iaW5zZXJ0VGFiIjwvY29kZT4gY29tbWFuZHMgcHJvdmlkZWQgZm9yIGFsdGVybmF0ZQpiZWhhdmlvcnMuIE9yIHlvdSBjYW4gd3JpdGUgeW91ciBvd24gaGFuZGxlciBmdW5jdGlvbiB0byBkbyBzb21ldGhpbmcKZGlmZmVyZW50IGFsdG9nZXRoZXIuPC9wPgoKPGgzPlRhYnM8L2gzPgoKPHA+SGFuZGxpbmcgb2YgdGFicyBjaGFuZ2VkIGNvbXBsZXRlbHkuIFRoZSBkaXNwbGF5IHdpZHRoIG9mIHRhYnMgY2FuCm5vdyBiZSBzZXQgd2l0aCB0aGUgPGNvZGU+dGFiU2l6ZTwvY29kZT4gb3B0aW9uLCBhbmQgdGFicyBjYW4KYmUgPGEgaHJlZj0iLi4vZGVtby92aXNpYmxldGFicy5odG1sIj5zdHlsZWQ8L2E+IGJ5IHNldHRpbmcgQ1NTIHJ1bGVzCmZvciB0aGUgPGNvZGU+Y20tdGFiPC9jb2RlPiBjbGFzcy48L3A+Cgo8cD5UaGUgZGVmYXVsdCB3aWR0aCBmb3IgdGFicyBpcyBub3cgNCwgYXMgb3Bwb3NlZCB0byB0aGUgOCB0aGF0IGlzCmhhcmQtd2lyZWQgaW50byBicm93c2Vycy4gSWYgeW91IGFyZSByZWx5aW5nIG9uIDgtc3BhY2UgdGFicywgbWFrZQpzdXJlIHlvdSBleHBsaWNpdGx5IHNldCA8Y29kZT50YWJTaXplOiA4PC9jb2RlPiBpbiB5b3VyIG9wdGlvbnMuPC9wPgoKPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/doc/upgrade_v3.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogVmVyc2lvbiAzIHVwZ3JhZGUgZ3VpZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSJkb2NzLmNzcyI+CjxzY3JpcHQgc3JjPSIuLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uL2FkZG9uL3J1bm1vZGUvcnVubW9kZS5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9hZGRvbi9ydW5tb2RlL2NvbG9yaXplLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL21vZGUvamF2YXNjcmlwdC9qYXZhc2NyaXB0LmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL21vZGUveG1sL3htbC5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9tb2RlL2Nzcy9jc3MuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vbW9kZS9odG1sbWl4ZWQvaHRtbG1peGVkLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9ImFjdGl2ZWJvb2ttYXJrLmpzIj48L3NjcmlwdD4KCjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGltZyBpZD1sb2dvIHNyYz0ibG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0ibWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjdXBncmFkZSI+VXBncmFkZSBndWlkZTwvYT4KICAgIDxsaT48YSBocmVmPSIjZG9tIj5ET00gc3RydWN0dXJlPC9hPjwvbGk+CiAgICA8bGk+PGEgaHJlZj0iI2d1dHRlcnMiPkd1dHRlciBtb2RlbDwvYT48L2xpPgogICAgPGxpPjxhIGhyZWY9IiNldmVudHMiPkV2ZW50IGhhbmRsaW5nPC9hPjwvbGk+CiAgICA8bGk+PGEgaHJlZj0iI21hcmt0ZXh0Ij5tYXJrVGV4dCBtZXRob2QgYXJndW1lbnRzPC9hPjwvbGk+CiAgICA8bGk+PGEgaHJlZj0iI2ZvbGRpbmciPkxpbmUgZm9sZGluZzwvYT48L2xpPgogICAgPGxpPjxhIGhyZWY9IiNsaW5lY2xhc3MiPkxpbmUgQ1NTIGNsYXNzZXM8L2E+PC9saT4KICAgIDxsaT48YSBocmVmPSIjcG9zaXRpb25zIj5Qb3NpdGlvbiBwcm9wZXJ0aWVzPC9hPjwvbGk+CiAgICA8bGk+PGEgaHJlZj0iI21hdGNoYnJhY2tldHMiPkJyYWNrZXQgbWF0Y2hpbmc8L2E+PC9saT4KICAgIDxsaT48YSBocmVmPSIjbW9kZXMiPk1vZGUgbWFuYWdlbWVudDwvYT48L2xpPgogICAgPGxpPjxhIGhyZWY9IiNuZXciPk5ldyBmZWF0dXJlczwvYT48L2xpPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+Cgo8aDIgaWQ9dXBncmFkZT5VcGdyYWRpbmcgdG8gdmVyc2lvbiAzPC9oMj4KCjxwPlZlcnNpb24gMyBkb2VzIG5vdCBkZXBhcnQgdG9vIG11Y2ggZnJvbSAyLnggQVBJLCBhbmQgc2l0ZXMgdGhhdCB1c2UKQ29kZU1pcnJvciBpbiBhIHZlcnkgc2ltcGxlIHdheSBtaWdodCBiZSBhYmxlIHRvIHVwZ3JhZGUgd2l0aG91dAp0cm91YmxlLiBCdXQgaXQgZG9lcyBpbnRyb2R1Y2UgYSBudW1iZXIgb2YgaW5jb21wYXRpYmlsaXRpZXMuIFBsZWFzZQphdCBsZWFzdCBza2ltIHRoaXMgdGV4dCBiZWZvcmUgdXBncmFkaW5nLjwvcD4KCjxwPk5vdGUgdGhhdCA8c3Ryb25nPnZlcnNpb24gMyBkcm9wcyBmdWxsIHN1cHBvcnQgZm9yIEludGVybmV0CkV4cGxvcmVyIDc8L3N0cm9uZz4uIFRoZSBlZGl0b3Igd2lsbCBtb3N0bHkgd29yayBvbiB0aGF0IGJyb3dzZXIsIGJ1dAppdCdsbCBiZSBzaWduaWZpY2FudGx5IGdsaXRjaHkuPC9wPgoKPHNlY3Rpb24gaWQ9ZG9tPgogIDxoMj5ET00gc3RydWN0dXJlPC9oMj4KCjxwPlRoaXMgb25lIGlzIHRoZSBtb3N0IGxpa2VseSB0byBjYXVzZSBwcm9ibGVtcy4gVGhlIGludGVybmFsCnN0cnVjdHVyZSBvZiB0aGUgZWRpdG9yIGhhcyBjaGFuZ2VkIHF1aXRlIGEgbG90LCBtb3N0bHkgdG8gaW1wbGVtZW50IGEKbmV3IHNjcm9sbGluZyBtb2RlbC48L3A+Cgo8cD5FZGl0b3IgaGVpZ2h0IGlzIG5vdyBzZXQgb24gdGhlIG91dGVyIHdyYXBwZXIgZWxlbWVudCAoQ1NTCmNsYXNzIDxjb2RlPkNvZGVNaXJyb3I8L2NvZGU+KSwgbm90IG9uIHRoZSBzY3JvbGxlciBlbGVtZW50Cig8Y29kZT5Db2RlTWlycm9yLXNjcm9sbDwvY29kZT4pLjwvcD4KCjxwPk90aGVyIG5vZGVzIHdlcmUgbW92ZWQsIGRyb3BwZWQsIGFuZCBhZGRlZC4gSWYgeW91IGhhdmUgYW55IGNvZGUKdGhhdCBtYWtlcyBhc3N1bXB0aW9ucyBhYm91dCB0aGUgaW50ZXJuYWwgRE9NIHN0cnVjdHVyZSBvZiB0aGUgZWRpdG9yLAp5b3UnbGwgaGF2ZSB0byByZS10ZXN0IGl0IGFuZCBwcm9iYWJseSB1cGRhdGUgaXQgdG8gd29yayB3aXRoIHYzLjwvcD4KCjxwPlNlZSB0aGUgPGEgaHJlZj0ibWFudWFsLmh0bWwjc3R5bGluZyI+c3R5bGluZyBzZWN0aW9uPC9hPiBvZiB0aGUKbWFudWFsIGZvciBtb3JlIGluZm9ybWF0aW9uLjwvcD4KPC9zZWN0aW9uPgo8c2VjdGlvbiBpZD1ndXR0ZXJzPgogIDxoMj5HdXR0ZXIgbW9kZWw8L2gyPgoKPHA+SW4gQ29kZU1pcnJvciAyLngsIHRoZXJlIHdhcyBhIHNpbmdsZSBndXR0ZXIsIGFuZCBsaW5lIG1hcmtlcnMKY3JlYXRlZCB3aXRoIDxjb2RlPnNldE1hcmtlcjwvY29kZT4gd291bGQgaGF2ZSB0byBzb21laG93IGNvZXhpc3Qgd2l0aAp0aGUgbGluZSBudW1iZXJzIChpZiBwcmVzZW50KS4gVmVyc2lvbiAzIGFsbG93cyB5b3UgdG8gc3BlY2lmeSBhbgphcnJheSBvZiBndXR0ZXJzLCA8YSBocmVmPSJtYW51YWwuaHRtbCNvcHRpb25fZ3V0dGVycyI+YnkgY2xhc3MKbmFtZTwvYT4sCnVzZSA8YSBocmVmPSJtYW51YWwuaHRtbCNzZXRHdXR0ZXJNYXJrZXIiPjxjb2RlPnNldEd1dHRlck1hcmtlcjwvY29kZT48L2E+CnRvIGFkZCBvciByZW1vdmUgbWFya2VycyBpbiBpbmRpdmlkdWFsIGd1dHRlcnMsIGFuZCBjbGVhciB3aG9sZQpndXR0ZXJzCndpdGggPGEgaHJlZj0ibWFudWFsLmh0bWwjY2xlYXJHdXR0ZXIiPjxjb2RlPmNsZWFyR3V0dGVyPC9jb2RlPjwvYT4uCkd1dHRlciBtYXJrZXJzIGFyZSBub3cgc3BlY2lmaWVkIGFzIERPTSBub2RlcywgcmF0aGVyIHRoYW4gSFRNTApzbmlwcGV0cy48L3A+Cgo8cD5UaGUgZ3V0dGVycyBubyBsb25nZXIgaG9yaXpvbnRhbGx5IHNjcm9sbHMgYWxvbmcgd2l0aCB0aGUgY29udGVudC4KVGhlIDxjb2RlPmZpeGVkR3V0dGVyPC9jb2RlPiBvcHRpb24gd2FzIHJlbW92ZWQgKHNpbmNlIGl0IGlzIG5vdyB0aGUKb25seSBiZWhhdmlvcikuPC9wPgoKPHByZSBkYXRhLWxhbmc9InRleHQvaHRtbCI+CiZsdDtzdHlsZT4KICAvKiBEZWZpbmUgYSBndXR0ZXIgc3R5bGUgKi8KICAubm90ZS1ndXR0ZXIgeyB3aWR0aDogM2VtOyBiYWNrZ3JvdW5kOiBjeWFuOyB9CiZsdDsvc3R5bGU+CiZsdDtzY3JpcHQ+CiAgLy8gQ3JlYXRlIGFuIGluc3RhbmNlIHdpdGggdHdvIGd1dHRlcnMgLS0gbGluZSBudW1iZXJzIGFuZCBub3RlcwogIHZhciBjbSA9IG5ldyBDb2RlTWlycm9yKGRvY3VtZW50LmJvZHksIHsKICAgIGd1dHRlcnM6IFsibm90ZS1ndXR0ZXIiLCAiQ29kZU1pcnJvci1saW5lbnVtYmVycyJdLAogICAgbGluZU51bWJlcnM6IHRydWUKICB9KTsKICAvLyBBZGQgYSBub3RlIHRvIGxpbmUgMAogIGNtLnNldEd1dHRlck1hcmtlcigwLCAibm90ZS1ndXR0ZXIiLCBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiaGkiKSk7CiZsdDsvc2NyaXB0Pgo8L3ByZT4KPC9zZWN0aW9uPgo8c2VjdGlvbiBpZD1ldmVudHM+CiAgPGgyPkV2ZW50IGhhbmRsaW5nPC9oMj4KCjxwPk1vc3Qgb2YgdGhlIDxjb2RlPm9uWFlaPC9jb2RlPiBvcHRpb25zIGhhdmUgYmVlbiByZW1vdmVkLiBUaGUgc2FtZQplZmZlY3QgaXMgbm93IG9idGFpbmVkIGJ5IGNhbGxpbmcKdGhlIDxhIGhyZWY9Im1hbnVhbC5odG1sI29uIj48Y29kZT5vbjwvY29kZT48L2E+IG1ldGhvZCB3aXRoIGEgc3RyaW5nCmlkZW50aWZ5aW5nIHRoZSBldmVudCB0eXBlLiBNdWx0aXBsZSBoYW5kbGVycyBjYW4gbm93IGJlIHJlZ2lzdGVyZWQKKGFuZCBpbmRpdmlkdWFsbHkgdW5yZWdpc3RlcmVkKSBmb3IgYW4gZXZlbnQsIGFuZCBvYmplY3RzIHN1Y2ggYXMgbGluZQpoYW5kbGVycyBub3cgYWxzbyBleHBvc2UgZXZlbnRzLiBTZWUgPGEgaHJlZj0ibWFudWFsLmh0bWwjZXZlbnRzIj50aGUKZnVsbCBsaXN0IGhlcmU8L2E+LjwvcD4KCjxwPihUaGUgPGNvZGU+b25LZXlFdmVudDwvY29kZT4gYW5kIDxjb2RlPm9uRHJhZ0V2ZW50PC9jb2RlPiBvcHRpb25zLAp3aGljaCBhY3QgbW9yZSBhcyBob29rcyB0aGFuIGFzIGV2ZW50IGhhbmRsZXJzLCBhcmUgc3RpbGwgdGhlcmUgaW4KdGhlaXIgb2xkIGZvcm0uKTwvcD4KCjxwcmUgZGF0YS1sYW5nPSJqYXZhc2NyaXB0Ij4KY20ub24oImNoYW5nZSIsIGZ1bmN0aW9uKGNtLCBjaGFuZ2UpIHsKICBjb25zb2xlLmxvZygic29tZXRoaW5nIGNoYW5nZWQhICgiICsgY2hhbmdlLm9yaWdpbiArICIpIik7Cn0pOwo8L3ByZT4KPC9zZWN0aW9uPgo8c2VjdGlvbiBpZD1tYXJrdGV4dD4KICA8aDI+bWFya1RleHQgbWV0aG9kIGFyZ3VtZW50czwvaDI+Cgo8cD5UaGUgPGEgaHJlZj0ibWFudWFsLmh0bWwjbWFya1RleHQiPjxjb2RlPm1hcmtUZXh0PC9jb2RlPjwvYT4gbWV0aG9kCih3aGljaCBoYXMgZ2FpbmVkIHNvbWUgaW50ZXJlc3RpbmcgbmV3IGZlYXR1cmVzLCBzdWNoIGFzIGNyZWF0aW5nCmF0b21pYyBhbmQgcmVhZC1vbmx5IHNwYW5zLCBvciByZXBsYWNpbmcgc3BhbnMgd2l0aCB3aWRnZXRzKSBubyBsb25nZXIKdGFrZXMgdGhlIENTUyBjbGFzcyBuYW1lIGFzIGEgc2VwYXJhdGUgYXJndW1lbnQsIGJ1dCBtYWtlcyBpdCBhbgpvcHRpb25hbCBmaWVsZCBpbiB0aGUgb3B0aW9ucyBvYmplY3QgaW5zdGVhZC48L3A+Cgo8cHJlIGRhdGEtbGFuZz0iamF2YXNjcmlwdCI+Ci8vIFN0eWxlIGZpcnN0IHRlbiBsaW5lcywgYW5kIGZvcmJpZCB0aGUgY3Vyc29yIGZyb20gZW50ZXJpbmcgdGhlbQpjbS5tYXJrVGV4dCh7bGluZTogMCwgY2g6IDB9LCB7bGluZTogMTAsIGNoOiAwfSwgewogIGNsYXNzTmFtZTogIm1hZ2ljLXRleHQiLAogIGluY2x1c2l2ZUxlZnQ6IHRydWUsCiAgYXRvbWljOiB0cnVlCn0pOwo8L3ByZT4KPC9zZWN0aW9uPgo8c2VjdGlvbiBpZD1mb2xkaW5nPgogIDxoMj5MaW5lIGZvbGRpbmc8L2gyPgoKPHA+VGhlIGludGVyZmFjZSBmb3IgaGlkaW5nIGxpbmVzIGhhcyBiZWVuCnJlbW92ZWQuIDxhIGhyZWY9Im1hbnVhbC5odG1sI21hcmtUZXh0Ij48Y29kZT5tYXJrVGV4dDwvY29kZT48L2E+IGNhbgpub3cgYmUgdXNlZCB0byBkbyB0aGUgc2FtZSBpbiBhIG1vcmUgZmxleGlibGUgYW5kIHBvd2VyZnVsIHdheS48L3A+Cgo8cD5UaGUgPGEgaHJlZj0iLi4vZGVtby9mb2xkaW5nLmh0bWwiPmZvbGRpbmcgc2NyaXB0PC9hPiBoYXMgYmVlbgp1cGRhdGVkIHRvIHVzZSB0aGUgbmV3IGludGVyZmFjZSwgYW5kIHNob3VsZCBub3cgYmUgbW9yZSByb2J1c3QuPC9wPgoKPHByZSBkYXRhLWxhbmc9ImphdmFzY3JpcHQiPgovLyBGb2xkIGEgcmFuZ2UsIHJlcGxhY2luZyBpdCB3aXRoIHRoZSB0ZXh0ICI/PyIKdmFyIHJhbmdlID0gY20ubWFya1RleHQoe2xpbmU6IDQsIGNoOiAyfSwge2xpbmU6IDgsIGNoOiAxfSwgewogIHJlcGxhY2VkV2l0aDogZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIj8/IiksCiAgLy8gQXV0by11bmZvbGQgd2hlbiBjdXJzb3IgbW92ZXMgaW50byB0aGUgcmFuZ2UKICBjbGVhck9uRW50ZXI6IHRydWUKfSk7Ci8vIEdldCBub3RpZmllZCB3aGVuIGF1dG8tdW5mb2xkaW5nCkNvZGVNaXJyb3Iub24ocmFuZ2UsICJjbGVhciIsIGZ1bmN0aW9uKCkgewogIGNvbnNvbGUubG9nKCJib29tIik7Cn0pOwo8L3ByZT4KPC9zZWN0aW9uPgo8c2VjdGlvbiBpZD1saW5lY2xhc3M+CiAgPGgyPkxpbmUgQ1NTIGNsYXNzZXM8L2gyPgoKPHA+VGhlIDxjb2RlPnNldExpbmVDbGFzczwvY29kZT4gbWV0aG9kIGhhcyBiZWVuIHJlcGxhY2VkCmJ5IDxhIGhyZWY9Im1hbnVhbC5odG1sI2FkZExpbmVDbGFzcyI+PGNvZGU+YWRkTGluZUNsYXNzPC9jb2RlPjwvYT4KYW5kIDxhIGhyZWY9Im1hbnVhbC5odG1sI3JlbW92ZUxpbmVDbGFzcyI+PGNvZGU+cmVtb3ZlTGluZUNsYXNzPC9jb2RlPjwvYT4sCndoaWNoIGFsbG93IG1vcmUgbW9kdWxhciBjb250cm9sIG92ZXIgdGhlIGNsYXNzZXMgYXR0YWNoZWQgdG8gYSBsaW5lLjwvcD4KCjxwcmUgZGF0YS1sYW5nPSJqYXZhc2NyaXB0Ij4KdmFyIG1hcmtlZCA9IGNtLmFkZExpbmVDbGFzcygxMCwgImJhY2tncm91bmQiLCAiaGlnaGxpZ2h0ZWQtbGluZSIpOwpzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogIGNtLnJlbW92ZUxpbmVDbGFzcyhtYXJrZWQsICJiYWNrZ3JvdW5kIiwgImhpZ2hsaWdodGVkLWxpbmUiKTsKfSk7CjwvcHJlPgo8L3NlY3Rpb24+CjxzZWN0aW9uIGlkPXBvc2l0aW9ucz4KICA8aDI+UG9zaXRpb24gcHJvcGVydGllczwvaDI+Cgo8cD5BbGwgbWV0aG9kcyB0aGF0IHRha2Ugb3IgcmV0dXJuIG9iamVjdHMgdGhhdCByZXByZXNlbnQgc2NyZWVuCnBvc2l0aW9ucyBub3cgdXNlIDxjb2RlPntsZWZ0LCB0b3AsIGJvdHRvbSwgcmlnaHR9PC9jb2RlPiBwcm9wZXJ0aWVzCihub3QgYWx3YXlzIGFsbCBvZiB0aGVtKSBpbnN0ZWFkIG9mIHRoZSA8Y29kZT57eCwgeSwgeUJvdH08L2NvZGU+IHVzZWQKYnkgc29tZSBtZXRob2RzIGluIHYyLnguPC9wPgoKPHA+QWZmZWN0ZWQgbWV0aG9kcwphcmUgPGEgaHJlZj0ibWFudWFsLmh0bWwjY3Vyc29yQ29vcmRzIj48Y29kZT5jdXJzb3JDb29yZHM8L2NvZGU+PC9hPiwgPGEgaHJlZj0ibWFudWFsLmh0bWwjY2hhckNvb3JkcyI+PGNvZGU+Y2hhckNvb3JkczwvY29kZT48L2E+LCA8YSBocmVmPSJtYW51YWwuaHRtbCNjb29yZHNDaGFyIj48Y29kZT5jb29yZHNDaGFyPC9jb2RlPjwvYT4sCmFuZCA8YSBocmVmPSJtYW51YWwuaHRtbCNnZXRTY3JvbGxJbmZvIj48Y29kZT5nZXRTY3JvbGxJbmZvPC9jb2RlPjwvYT4uPC9wPgo8L3NlY3Rpb24+CjxzZWN0aW9uIGlkPW1hdGNoYnJhY2tldHM+CiAgPGgyPkJyYWNrZXQgbWF0Y2hpbmcgbm8gbG9uZ2VyIGluIGNvcmU8L2gyPgoKPHA+VGhlIDxhIGhyZWY9Im1hbnVhbC5odG1sI2FkZG9uX21hdGNoYnJhY2tldHMiPjxjb2RlPm1hdGNoQnJhY2tldHM8L2NvZGU+PC9hPgpvcHRpb24gaXMgbm8gbG9uZ2VyIGRlZmluZWQgaW4gdGhlIGNvcmUgZWRpdG9yLgpMb2FkIDxjb2RlPmFkZG9uL2VkaXQvbWF0Y2hicmFja2V0cy5qczwvY29kZT4gdG8gZW5hYmxlIGl0LjwvcD4KPC9zZWN0aW9uPgo8c2VjdGlvbiBpZD1tb2Rlcz4KICA8aDI+TW9kZSBtYW5hZ2VtZW50PC9oMj4KCjxwPlRoZSA8Y29kZT5Db2RlTWlycm9yLmxpc3RNb2RlczwvY29kZT4KYW5kIDxjb2RlPkNvZGVNaXJyb3IubGlzdE1JTUVzPC9jb2RlPiBmdW5jdGlvbnMsIHVzZWQgZm9yIGxpc3RpbmcKZGVmaW5lZCBtb2RlcywgYXJlIGdvbmUuIFlvdSBhcmUgbm93IGVuY291cmFnZWQgdG8gc2ltcGx5Cmluc3BlY3QgPGNvZGU+Q29kZU1pcnJvci5tb2RlczwvY29kZT4gKG1hcHBpbmcgbW9kZSBuYW1lcyB0byBtb2RlCmNvbnN0cnVjdG9ycykgYW5kIDxjb2RlPkNvZGVNaXJyb3IubWltZU1vZGVzPC9jb2RlPiAobWFwcGluZyBNSU1FCnN0cmluZ3MgdG8gbW9kZSBzcGVjcykuPC9wPgo8L3NlY3Rpb24+CjxzZWN0aW9uIGlkPW5ldz4KICA8aDI+TmV3IGZlYXR1cmVzPC9oMj4KCjxwPlNvbWUgbW9yZSByZWFzb25zIHRvIHVwZ3JhZGUgdG8gdmVyc2lvbiAzLjwvcD4KCjx1bD4KICA8bGk+QmktZGlyZWN0aW9uYWwgdGV4dCBzdXBwb3J0LiBDb2RlTWlycm9yIHdpbGwgbm93IG1vc3RseSBkbyB0aGUKICByaWdodCB0aGluZyB3aGVuIGVkaXRpbmcgQXJhYmljIG9yIEhlYnJldyB0ZXh0LjwvbGk+CiAgPGxpPkFyYml0cmFyeSBsaW5lIGhlaWdodHMuIFVzaW5nIGZvbnRzIHdpdGggZGlmZmVyZW50IGhlaWdodHMKICBpbnNpZGUgdGhlIGVkaXRvciAod2hldGhlciBvZmYgYnkgb25lIHBpeGVsIG9yIGZpZnR5KSBpcyBub3cKICBzdXBwb3J0ZWQgYW5kIGhhbmRsZWQgZ3JhY2VmdWxseS48L2xpPgogIDxsaT5Jbi1saW5lIHdpZGdldHMuIFNlZSA8YSBocmVmPSIuLi9kZW1vL3dpZGdldC5odG1sIj50aGUgZGVtbzwvYT4KICBhbmQgPGEgaHJlZj0ibWFudWFsLmh0bWwjYWRkTGluZVdpZGdldCI+dGhlIGRvY3M8L2E+LjwvbGk+CiAgPGxpPkRlZmluaW5nIGN1c3RvbSBvcHRpb25zCiAgd2l0aCA8YSBocmVmPSJtYW51YWwuaHRtbCNkZWZpbmVPcHRpb24iPjxjb2RlPkNvZGVNaXJyb3IuZGVmaW5lT3B0aW9uPC9jb2RlPjwvYT4uPC9saT4KPC91bD4KPC9zZWN0aW9uPgo8L2FydGljbGU+Cgo8c2NyaXB0PnNldFRpbWVvdXQoZnVuY3Rpb24oKXtDb2RlTWlycm9yLmNvbG9yaXplKCk7fSwgMjApOzwvc2NyaXB0Pgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/doc/upgrade_v4.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogVmVyc2lvbiA0IHVwZ3JhZGUgZ3VpZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSJkb2NzLmNzcyI+CjxzY3JpcHQgc3JjPSJhY3RpdmVib29rbWFyay5qcyI+PC9zY3JpcHQ+Cgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxpbWcgaWQ9bG9nbyBzcmM9ImxvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Im1hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iI3VwZ3JhZGUiPlVwZ3JhZGUgZ3VpZGU8L2E+CiAgICA8bGk+PGEgaHJlZj0iI211bHRpc2VsIj5NdWx0aXBsZSBzZWxlY3Rpb25zPC9hPgogICAgPGxpPjxhIGhyZWY9IiNiZWZvcmVTZWxlY3Rpb25DaGFuZ2UiPlRoZSBiZWZvcmVTZWxlY3Rpb25DaGFuZ2UgZXZlbnQ8L2E+CiAgICA8bGk+PGEgaHJlZj0iI3JlcGxhY2VTZWxlY3Rpb24iPnJlcGxhY2VTZWxlY3Rpb24gYW5kIGNvbGxhcHNpbmc8L2E+CiAgICA8bGk+PGEgaHJlZj0iI2NoYW5nZUV2ZW50Ij5jaGFuZ2UgZXZlbnQgZGF0YTwvYT4KICAgIDxsaT48YSBocmVmPSIjc2hvd0lmSGlkZGVuIj5zaG93SWZIaWRkZW4gb3B0aW9uIHRvIGxpbmUgd2lkZ2V0czwvYT4KICAgIDxsaT48YSBocmVmPSIjbW9kdWxlIj5Nb2R1bGUgbG9hZGVyczwvYT4KICAgIDxsaT48YSBocmVmPSIjc2hhcmVkZGF0YSI+TXV0YXRpbmcgc2hhcmVkIGRhdGEgc3RydWN0dXJlczwvYT48L2xpPgogICAgPGxpPjxhIGhyZWY9IiNkZXByZWNhdGVkIj5EZXByZWNhdGVkIGludGVyZmFjZXMgZHJvcHBlZDwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgoKPGgyIGlkPXVwZ3JhZGU+VXBncmFkaW5nIHRvIHZlcnNpb24gNDwvaDI+Cgo8cD5Db2RlTWlycm9yIDQncyBpbnRlcmZhY2UgaXMgPGVtPnZlcnk8L2VtPiBjbG9zZSB2ZXJzaW9uIDMsIGJ1dCBpdApkb2VzIGZpeCBhIGZldyBhd2t3YXJkIGRldGFpbHMgaW4gYSBiYWNrd2FyZHMtaW5jb21wYXRpYmxlIHdheXMuIEF0CmxlYXN0IHNraW0gdGhlIHRleHQgYmVsb3cgYmVmb3JlIHVwZ3JhZGluZy48L3A+Cgo8c2VjdGlvbiBpZD1tdWx0aXNlbD48aDI+TXVsdGlwbGUgc2VsZWN0aW9uczwvaDI+Cgo8cD5UaGUgbWFpbiBuZXcgZmVhdHVyZSBpbiB2ZXJzaW9uIDQgaXMgbXVsdGlwbGUgc2VsZWN0aW9ucy4gVGhlCnNpbmdsZS1zZWxlY3Rpb24gdmFyaWFudHMgb2YgbWV0aG9kcyBhcmUgc3RpbGwgdGhlcmUsIGJ1dCBub3cKdHlwaWNhbGx5IGFjdCBvbmx5IG9uIHRoZSA8ZW0+cHJpbWFyeTwvZW0+IHNlbGVjdGlvbiAodXN1YWxseSB0aGUgbGFzdApvbmUgYWRkZWQpLjwvcD4KCjxwPlRoZSBleGNlcHRpb24gdG8gdGhpcwppcyA8YSBocmVmPSJtYW51YWwuaHRtbCNnZXRTZWxlY3Rpb24iPjxzdHJvbmc+PGNvZGU+Z2V0U2VsZWN0aW9uPC9jb2RlPjwvc3Ryb25nPjwvYT4sCndoaWNoIHdpbGwgbm93IHJldHVybiB0aGUgY29udGVudCBvZiA8ZW0+YWxsPC9lbT4gc2VsZWN0aW9ucwooc2VwYXJhdGVkIGJ5IG5ld2xpbmVzLCBvciB3aGF0ZXZlciA8Y29kZT5saW5lU2VwPC9jb2RlPiBwYXJhbWV0ZXIgeW91IHBhc3NlZAppdCkuPC9wPgoKPC9zZWN0aW9uPgoKPHNlY3Rpb24gaWQ9YmVmb3JlU2VsZWN0aW9uQ2hhbmdlPjxoMj5UaGUgYmVmb3JlU2VsZWN0aW9uQ2hhbmdlIGV2ZW50PC9oMj4KCjxwPlRoaXMgZXZlbnQgc3RpbGwgZXhpc3RzLCBidXQgdGhlIG9iamVjdCBpdCBpcyBwYXNzZWQgaGFzCmEgPGEgaHJlZj0ibWFudWFsLmh0bWwjZXZlbnRfYmVmb3JlU2VsZWN0aW9uQ2hhbmdlIj5jb21wbGV0ZWx5IG5ldwppbnRlcmZhY2U8L2E+LCBiZWNhdXNlIHN1Y2ggY2hhbmdlcyBub3cgY29uY2VybiBtdWx0aXBsZQpzZWxlY3Rpb25zLjwvcD4KCjwvc2VjdGlvbj4KCjxzZWN0aW9uIGlkPXJlcGxhY2VTZWxlY3Rpb24+PGgyPnJlcGxhY2VTZWxlY3Rpb24ncyBjb2xsYXBzaW5nIGJlaGF2aW9yPC9oMj4KCjxwPkJ5CmRlZmF1bHQsIDxhIGhyZWY9Im1hbnVhbC5odG1sI3JlcGxhY2VTZWxlY3Rpb24iPjxjb2RlPnJlcGxhY2VTZWxlY3Rpb248L2NvZGU+PC9hPgp3b3VsZCBsZWF2ZSB0aGUgbmV3bHkgaW5zZXJ0ZWQgdGV4dCBzZWxlY3RlZC4gVGhpcyBpcyBvbmx5IHJhcmVseSB3aGF0CnlvdSB3YW50LCBhbmQgYWxzbyAoc2xpZ2h0bHkpIG1vcmUgZXhwZW5zaXZlIGluIHRoZSBuZXcgbW9kZWwsIHNvIHRoZQpkZWZhdWx0IHdhcyBjaGFuZ2VkIHRvIDxjb2RlPiJlbmQiPC9jb2RlPiwgbWVhbmluZyB0aGUgb2xkIGJlaGF2aW9yCm11c3QgYmUgZXhwbGljaXRseSBzcGVjaWZpZWQgYnkgcGFzc2luZyBhIHNlY29uZCBhcmd1bWVudApvZiA8Y29kZT4iYXJvdW5kIjwvY29kZT4uPC9wPgoKPC9zZWN0aW9uPgoKPHNlY3Rpb24gaWQ9Y2hhbmdlRXZlbnQ+PGgyPmNoYW5nZSBldmVudCBkYXRhPC9oMj4KCjxwPlJhdGhlciB0aGFuIGZvcmNpbmcgY2xpZW50IGNvZGUgdG8gZm9sbG93IDxjb2RlPm5leHQ8L2NvZGU+CnBvaW50ZXJzIGZyb20gb25lIGNoYW5nZSBvYmplY3QgdG8gdGhlIG5leHQsIHRoZSBsaWJyYXJ5IHdpbGwgbm93CnNpbXBseSBmaXJlCm11bHRpcGxlIDxhIGhyZWY9Im1hbnVhbC5odG1sI2V2ZW50X2NoYW5nZSI+PGNvZGU+ImNoYW5nZSI8L2NvZGU+PC9hPgpldmVudHMuIEV4aXN0aW5nIGNvZGUgd2lsbCBwcm9iYWJseSBjb250aW51ZSB0byB3b3JrIHVubW9kaWZpZWQuPC9wPgoKPC9zZWN0aW9uPgoKPHNlY3Rpb24gaWQ9c2hvd0lmSGlkZGVuPjxoMj5zaG93SWZIaWRkZW4gb3B0aW9uIHRvIGxpbmUgd2lkZ2V0czwvaDI+Cgo8cD5UaGlzIG9wdGlvbiwgd2hpY2ggY29uY2VwdHVhbGx5IGNhdXNlZCBsaW5lIHdpZGdldHMgdG8gYmUgdmlzaWJsZQpldmVuIGlmIHRoZWlyIGxpbmUgd2FzIGhpZGRlbiwgd2FzIG5ldmVyIHJlYWxseSB3ZWxsLWRlZmluZWQsIGFuZCB3YXMKYnVnZ3kgZnJvbSB0aGUgc3RhcnQuIEl0IHdvdWxkIGJlIGEgcmF0aGVyIGV4cGVuc2l2ZSBmZWF0dXJlLCBib3RoIGluCmNvZGUgY29tcGxleGl0eSBhbmQgcnVuLXRpbWUgcGVyZm9ybWFuY2UsIHRvIGltcGxlbWVudCBwcm9wZXJseS4gSXQKaGFzIGJlZW4gZHJvcHBlZCBlbnRpcmVseSBpbiA0LjAuPC9wPgoKPC9zZWN0aW9uPgoKPHNlY3Rpb24gaWQ9bW9kdWxlPjxoMj5Nb2R1bGUgbG9hZGVyczwvaDI+Cgo8cD5BbGwgbW9kdWxlcyBpbiB0aGUgQ29kZU1pcnJvciBkaXN0cmlidXRpb24gYXJlIG5vdyB3cmFwcGVkIGluIGEKc2hpbSBmdW5jdGlvbiB0byBtYWtlIHRoZW0gY29tcGF0aWJsZSB3aXRoIGJvdGggQU1ECig8YSBocmVmPSJodHRwOi8vcmVxdWlyZWpzLm9yZyI+cmVxdWlyZWpzPC9hPikgYW5kIENvbW1vbkpTIChhcyB1c2VkCmJ5IDxhIGhyZWY9Imh0dHA6Ly9ub2RlanMub3JnLyI+bm9kZTwvYT4KYW5kIDxhIGhyZWY9Imh0dHA6Ly9icm93c2VyaWZ5Lm9yZy8iPmJyb3dzZXJpZnk8L2E+KSBtb2R1bGUgbG9hZGVycy4KV2hlbiBuZWl0aGVyIG9mIHRoZXNlIGlzIHByZXNlbnQsIHRoZXkgZmFsbCBiYWNrIHRvIHNpbXBseSB1c2luZyB0aGUKZ2xvYmFsIDxjb2RlPkNvZGVNaXJyb3I8L2NvZGU+IHZhcmlhYmxlLjwvcD4KCjxwPklmIHlvdSBoYXZlIGEgbW9kdWxlIGxvYWRlciBwcmVzZW50IGluIHlvdXIgZW52aXJvbm1lbnQsIENvZGVNaXJyb3IKd2lsbCBhdHRlbXB0IHRvIHVzZSBpdCwgYW5kIHlvdSBtaWdodCBuZWVkIHRvIGNoYW5nZSB0aGUgd2F5IHlvdSBsb2FkCkNvZGVNaXJyb3IgbW9kdWxlcy48L3A+Cgo8L3NlY3Rpb24+Cgo8c2VjdGlvbiBpZD1zaGFyZWRkYXRhPjxoMj5NdXRhdGluZyBzaGFyZWQgZGF0YSBzdHJ1Y3R1cmVzPC9oMj4KCjxwPkRhdGEgc3RydWN0dXJlcyBwcm9kdWNlZCBieSB0aGUgbGlicmFyeSBzaG91bGQgbm90IGJlIG11dGF0ZWQKdW5sZXNzIGV4cGxpY2l0bHkgYWxsb3dlZCwgaW4gZ2VuZXJhbC4gVGhpcyBpcyBzbGlnaHRseSBtb3JlIHN0cmljdCBpbgo0LjAgdGhhbiBpdCB3YXMgaW4gZWFybGllciB2ZXJzaW9ucywgd2hpY2ggY29waWVkIHRoZSBwb3NpdGlvbiBvYmplY3RzCnJldHVybmVkIGJ5IDxhIGhyZWY9Im1hbnVhbC5odG1sI2dldEN1cnNvciI+PGNvZGU+Z2V0Q3Vyc29yPC9jb2RlPjwvYT4KZm9yIG5lYnVsb3VzLCBoaXN0b3JpYyByZWFzb25zLiBJbiA0LjAsIG11dGF0aW5nIHRoZXNlCm9iamVjdHMgPGVtPndpbGw8L2VtPiBjb3JydXB0IHlvdXIgZWRpdG9yJ3Mgc2VsZWN0aW9uLjwvcD4KCjwvc2VjdGlvbj4KCjxzZWN0aW9uIGlkPWRlcHJlY2F0ZWQ+PGgyPkRlcHJlY2F0ZWQgaW50ZXJmYWNlcyBkcm9wcGVkPC9oMj4KCjxwPkEgZmV3IHByb3BlcnRpZXMgYW5kIG1ldGhvZHMgdGhhdCBoYXZlIGJlZW4gZGVwcmVjYXRlZCBmb3IgYSB3aGlsZQphcmUgbm93IGdvbmUuIE1vc3Qgbm90YWJseSwgdGhlIDxjb2RlPm9uS2V5RXZlbnQ8L2NvZGU+CmFuZCA8Y29kZT5vbkRyYWdFdmVudDwvY29kZT4gb3B0aW9ucyAodXNlIHRoZQpjb3JyZXNwb25kaW5nIDxhIGhyZWY9Im1hbnVhbC5odG1sI2V2ZW50X2RvbSI+ZXZlbnRzPC9hPiBpbnN0ZWFkKS48L3A+Cgo8cD5Ud28gc2lsbHkgbWV0aG9kcywgd2hpY2ggd2VyZSBtb3N0bHkgdGhlcmUgdG8gc3RheSBjbG9zZSB0byB0aGUgMC54CkFQSSwgPGNvZGU+c2V0TGluZTwvY29kZT4gYW5kIDxjb2RlPnJlbW92ZUxpbmU8L2NvZGU+IGFyZSBub3cgZ29uZS4KVXNlIHRoZSBtb3JlCmZsZXhpYmxlIDxhIGhyZWY9Im1hbnVhbC5odG1sI3JlcGxhY2VSYW5nZSI+PGNvZGU+cmVwbGFjZVJhbmdlPC9jb2RlPjwvYT4KbWV0aG9kIGluc3RlYWQuPC9wPgoKPHA+VGhlIGxvbmcgbmFtZXMgZm9yIGZvbGRpbmcgYW5kIGNvbXBsZXRpbmcgZnVuY3Rpb25zCig8Y29kZT5Db2RlTWlycm9yLmJyYWNlUmFuZ2VGaW5kZXI8L2NvZGU+LCA8Y29kZT5Db2RlTWlycm9yLmphdmFzY3JpcHRIaW50PC9jb2RlPiwKZXRjKSBhcmUgYWxzbyBnb25lCih1c2UgPGNvZGU+Q29kZU1pcnJvci5mb2xkLmJyYWNlPC9jb2RlPiwgPGNvZGU+Q29kZU1pcnJvci5oaW50LmphdmFzY3JpcHQ8L2NvZGU+KS48L3A+Cgo8cD5UaGUgPGNvZGU+Y2xhc3NOYW1lPC9jb2RlPiBwcm9wZXJ0eSBpbiB0aGUgcmV0dXJuIHZhbHVlCm9mIDxhIGhyZWY9Im1hbnVhbC5odG1sI2dldFRva2VuQXQiPjxjb2RlPmdldFRva2VuQXQ8L2NvZGU+PC9hPiwgd2hpY2gKaGFzIGJlZW4gc3VwZXJzZWRlZCBieSB0aGUgPGNvZGU+dHlwZTwvY29kZT4gcHJvcGVydHksIGlzIGFsc28gbm8KbG9uZ2VyIHByZXNlbnQuPC9wPgoKPC9zZWN0aW9uPgo8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+Cgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSJsaWIvY29kZW1pcnJvci5jc3MiPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSJkb2MvZG9jcy5jc3MiPgo8c2NyaXB0IHNyYz0ibGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0ibW9kZS94bWwveG1sLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Im1vZGUvamF2YXNjcmlwdC9qYXZhc2NyaXB0LmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Im1vZGUvY3NzL2Nzcy5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJtb2RlL2h0bWxtaXhlZC9odG1sbWl4ZWQuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iYWRkb24vZWRpdC9tYXRjaGJyYWNrZXRzLmpzIj48L3NjcmlwdD4KCjxzY3JpcHQgc3JjPSJkb2MvYWN0aXZlYm9va21hcmsuanMiPjwvc2NyaXB0PgoKPHN0eWxlPgogIC5Db2RlTWlycm9yIHsgaGVpZ2h0OiBhdXRvOyBib3JkZXI6IDFweCBzb2xpZCAjZGRkOyB9CiAgLkNvZGVNaXJyb3Itc2Nyb2xsIHsgbWF4LWhlaWdodDogMjAwcHg7IH0KICAuQ29kZU1pcnJvciBwcmUgeyBwYWRkaW5nLWxlZnQ6IDdweDsgbGluZS1oZWlnaHQ6IDEuMjU7IH0KPC9zdHlsZT4KCjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGltZyBpZD1sb2dvIHNyYz0iZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgZGF0YS1kZWZhdWx0PSJ0cnVlIiBocmVmPSIjZGVzY3JpcHRpb24iPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIjZmVhdHVyZXMiPkZlYXR1cmVzPC9hPgogICAgPGxpPjxhIGhyZWY9IiNjb21tdW5pdHkiPkNvbW11bml0eTwvYT4KICAgIDxsaT48YSBocmVmPSIjYnJvd3NlcnN1cHBvcnQiPkJyb3dzZXIgc3VwcG9ydDwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgoKPHNlY3Rpb24gaWQ9ZGVzY3JpcHRpb24gY2xhc3M9Zmlyc3Q+CiAgPHA+PHN0cm9uZz5Db2RlTWlycm9yPC9zdHJvbmc+IGlzIGEgdmVyc2F0aWxlIHRleHQgZWRpdG9yCiAgaW1wbGVtZW50ZWQgaW4gSmF2YVNjcmlwdCBmb3IgdGhlIGJyb3dzZXIuIEl0IGlzIHNwZWNpYWxpemVkIGZvcgogIGVkaXRpbmcgY29kZSwgYW5kIGNvbWVzIHdpdGggYSBudW1iZXIgb2YgbGFuZ3VhZ2UgbW9kZXMgYW5kIGFkZG9ucwogIHRoYXQgaW1wbGVtZW50IG1vcmUgYWR2YW5jZWQgZWRpdGluZyBmdW5jdGlvbmFsaXR5LjwvcD4KCiAgPHA+QSByaWNoIDxhIGhyZWY9ImRvYy9tYW51YWwuaHRtbCNhcGkiPnByb2dyYW1taW5nIEFQSTwvYT4gYW5kIGEKICBDU1MgPGEgaHJlZj0iZG9jL21hbnVhbC5odG1sI3N0eWxpbmciPnRoZW1pbmc8L2E+IHN5c3RlbSBhcmUKICBhdmFpbGFibGUgZm9yIGN1c3RvbWl6aW5nIENvZGVNaXJyb3IgdG8gZml0IHlvdXIgYXBwbGljYXRpb24sIGFuZAogIGV4dGVuZGluZyBpdCB3aXRoIG5ldyBmdW5jdGlvbmFsaXR5LjwvcD4KPC9zZWN0aW9uPgoKPHNlY3Rpb24gaWQ9ZGVtbz4KICA8aDI+VGhpcyBpcyBDb2RlTWlycm9yPC9oMj4KICA8Zm9ybSBzdHlsZT0icG9zaXRpb246IHJlbGF0aXZlOyBtYXJnaW4tdG9wOiAuNWVtOyI+PHRleHRhcmVhIGlkPWRlbW90ZXh0Pgo8IS0tIENyZWF0ZSBhIHNpbXBsZSBDb2RlTWlycm9yIGluc3RhbmNlIC0tPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImxpYi9jb2RlbWlycm9yLmNzcyI+CjxzY3JpcHQgc3JjPSJsaWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQ+CiAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKG15VGV4dGFyZWEsIHsKICAgIG1vZGU6ICJ0ZXh0L2h0bWwiCiAgfSk7Cjwvc2NyaXB0PjwvdGV4dGFyZWE+CiAgPHNlbGVjdCBpZD0iZGVtb2xpc3QiIG9uY2hhbmdlPSJkb2N1bWVudC5sb2NhdGlvbiA9IHRoaXMub3B0aW9uc1t0aGlzLnNlbGVjdGVkSW5kZXhdLnZhbHVlOyI+CiAgICA8b3B0aW9uIHZhbHVlPSIjIj5PdGhlciBkZW1vcy4uLjwvb3B0aW9uPgogICAgPG9wdGlvbiB2YWx1ZT0iZGVtby9jb21wbGV0ZS5odG1sIj5BdXRvY29tcGxldGlvbjwvb3B0aW9uPgogICAgPG9wdGlvbiB2YWx1ZT0iZGVtby9mb2xkaW5nLmh0bWwiPkNvZGUgZm9sZGluZzwvb3B0aW9uPgogICAgPG9wdGlvbiB2YWx1ZT0iZGVtby90aGVtZS5odG1sIj5UaGVtZXM8L29wdGlvbj4KICAgIDxvcHRpb24gdmFsdWU9Im1vZGUvaHRtbG1peGVkL2luZGV4Lmh0bWwiPk1peGVkIGxhbmd1YWdlIG1vZGVzPC9vcHRpb24+CiAgICA8b3B0aW9uIHZhbHVlPSJkZW1vL2JpZGkuaHRtbCI+QmktZGlyZWN0aW9uYWwgdGV4dDwvb3B0aW9uPgogICAgPG9wdGlvbiB2YWx1ZT0iZGVtby92YXJpYWJsZWhlaWdodC5odG1sIj5WYXJpYWJsZSBmb250IHNpemVzPC9vcHRpb24+CiAgICA8b3B0aW9uIHZhbHVlPSJkZW1vL3NlYXJjaC5odG1sIj5TZWFyY2ggaW50ZXJmYWNlPC9vcHRpb24+CiAgICA8b3B0aW9uIHZhbHVlPSJkZW1vL3ZpbS5odG1sIj5WaW0gYmluZGluZ3M8L29wdGlvbj4KICAgIDxvcHRpb24gdmFsdWU9ImRlbW8vZW1hY3MuaHRtbCI+RW1hY3MgYmluZGluZ3M8L29wdGlvbj4KICAgIDxvcHRpb24gdmFsdWU9ImRlbW8vc3VibGltZS5odG1sIj5TdWJsaW1lIFRleHQgYmluZGluZ3M8L29wdGlvbj4KICAgIDxvcHRpb24gdmFsdWU9ImRlbW8vdGVybi5odG1sIj5UZXJuIGludGVncmF0aW9uPC9vcHRpb24+CiAgICA8b3B0aW9uIHZhbHVlPSJkZW1vL21lcmdlLmh0bWwiPk1lcmdlL2RpZmYgaW50ZXJmYWNlPC9vcHRpb24+CiAgICA8b3B0aW9uIHZhbHVlPSJkZW1vL2Z1bGxzY3JlZW4uaHRtbCI+RnVsbC1zY3JlZW4gZWRpdG9yPC9vcHRpb24+CiAgPC9zZWxlY3Q+PC9mb3JtPgogIDxzY3JpcHQ+CiAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImRlbW90ZXh0IiksIHsKICAgICAgbGluZU51bWJlcnM6IHRydWUsCiAgICAgIG1vZGU6ICJ0ZXh0L2h0bWwiLAogICAgICBtYXRjaEJyYWNrZXRzOiB0cnVlCiAgICB9KTsKICA8L3NjcmlwdD4KICA8ZGl2IHN0eWxlPSJwb3NpdGlvbjogcmVsYXRpdmU7IG1hcmdpbjogMWVtIDA7Ij4KICAgIDxhIGNsYXNzPSJiaWdidXR0b24gbGVmdCIgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2NvZGVtaXJyb3IuemlwIj5ET1dOTE9BRCBMQVRFU1QgUkVMRUFTRTwvYT4KICAgIDxkaXY+PHN0cm9uZz52ZXJzaW9uIDQuNDwvc3Ryb25nPiAoPGEgaHJlZj0iZG9jL3JlbGVhc2VzLmh0bWwiPlJlbGVhc2Ugbm90ZXM8L2E+KTwvZGl2PgogICAgPGRpdj5vciB1c2UgdGhlIDxhIGhyZWY9ImRvYy9jb21wcmVzcy5odG1sIj5taW5pZmljYXRpb24gaGVscGVyPC9hPjwvZGl2PgogICAgPGRpdiBzdHlsZT0icG9zaXRpb246IGFic29sdXRlOyB0b3A6IDA7IHJpZ2h0OiAwOyB0ZXh0LWFsaWduOiByaWdodCI+CiAgICAgIDxzcGFuIGNsYXNzPSJiaWdidXR0b24gcmlnaHQiIG9uY2xpY2s9ImRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwYXlwYWwnKS5zdWJtaXQoKTsiPkRPTkFURSBXSVRIIFBBWVBBTDwvc3Bhbj4KICAgICAgPGRpdiBzdHlsZT0icG9zaXRpb246IHJlbGF0aXZlIj4KICAgICAgICBvciA8c3BhbiBvbmNsaWNrPSJkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmFua2luZm8nKS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJzsiIGNsYXNzPXF1YXNpbGluaz5CYW5rPC9zcGFuPiwKICAgICAgICA8c3BhbiBvbmNsaWNrPSJkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnYmNpbmZvJykuc3R5bGUuZGlzcGxheSA9ICdibG9jayc7IiBjbGFzcz1xdWFzaWxpbms+Qml0Y29pbjwvc3Bhbj4sCiAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly93d3cuZ2l0dGlwLmNvbS9tYXJpam5oIj5HaXR0aXA8L2E+LAogICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vZmxhdHRyLmNvbS9wcm9maWxlL21hcmlqbmgiPkZsYXR0cjwvYT48YnI+CiAgICAgICAgPGRpdiBpZD1iYW5raW5mbyBjbGFzcz1iYW5raW5mbz4KICAgICAgICAgIDxzcGFuIGNsYXNzPWJhbmtpbmZvX2Nsb3NlIG9uY2xpY2s9ImRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYW5raW5mbycpLnN0eWxlLmRpc3BsYXkgPSAnJzsiPsOXPC9zcGFuPgogICAgICAgICAgQmFuazogPGk+UmFib2Jhbms8L2k+PGJyLz4KICAgICAgICAgIENvdW50cnk6IDxpPk5ldGhlcmxhbmRzPC9pPjxici8+CiAgICAgICAgICBTV0lGVDogPGk+UkFCT05MMlU8L2k+PGJyLz4KICAgICAgICAgIEFjY291bnQ6IDxpPjE0Nzg1MDc3MDwvaT48YnIvPgogICAgICAgICAgTmFtZTogPGk+TWFyaWpuIEhhdmVyYmVrZTwvaT48YnIvPgogICAgICAgICAgSUJBTjogPGk+TkwyNiBSQUJPIDAxNDcgODUwNyA3MDwvaT4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGlkPWJjaW5mbyBjbGFzcz1iYW5raW5mbz4KICAgICAgICAgIDxzcGFuIGNsYXNzPWJhbmtpbmZvX2Nsb3NlIG9uY2xpY2s9ImRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiY2luZm8nKS5zdHlsZS5kaXNwbGF5ID0gJyc7Ij7Dlzwvc3Bhbj4KICAgICAgICAgIEJpdGNvaW4gYWRkcmVzczogMUhWbm5VOEU5eUxQZUZ5TmdOdFVQQjVkZVhCdlVtWjZOeAogICAgICAgIDwvZGl2PgogICAgICAgIDxmb3JtIGFjdGlvbj0iaHR0cHM6Ly93d3cucGF5cGFsLmNvbS9jZ2ktYmluL3dlYnNjciIgbWV0aG9kPSJwb3N0IiBpZD0icGF5cGFsIj4KICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImNtZCIgdmFsdWU9Il9zLXhjbGljayIvPgogICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0iaG9zdGVkX2J1dHRvbl9pZCIgdmFsdWU9IjNGVkhTNUZHVVk3Q0MiLz4KICAgICAgICA8L2Zvcm0+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2PgogICAgICAgIFB1cmNoYXNlIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLmNvbSI+Y29tbWVyY2lhbCBzdXBwb3J0PC9hPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogIDwvZGl2Pgo8L3NlY3Rpb24+Cgo8c2VjdGlvbiBpZD1mZWF0dXJlcz4KICA8aDI+RmVhdHVyZXM8L2gyPgogIDx1bD4KICAgIDxsaT5TdXBwb3J0IGZvciA8YSBocmVmPSJtb2RlL2luZGV4Lmh0bWwiPm92ZXIgNjAgbGFuZ3VhZ2VzPC9hPiBvdXQgb2YgdGhlIGJveAogICAgPGxpPkEgcG93ZXJmdWwsIDxhIGhyZWY9Im1vZGUvaHRtbG1peGVkL2luZGV4Lmh0bWwiPmNvbXBvc2FibGU8L2E+IGxhbmd1YWdlIG1vZGUgPGEgaHJlZj0iZG9jL21hbnVhbC5odG1sI21vZGVhcGkiPnN5c3RlbTwvYT4KICAgIDxsaT48YSBocmVmPSJkb2MvbWFudWFsLmh0bWwjYWRkb25fc2hvdy1oaW50Ij5BdXRvY29tcGxldGlvbjwvYT4gKDxhIGhyZWY9ImRlbW8veG1sY29tcGxldGUuaHRtbCI+WE1MPC9hPikKICAgIDxsaT48YSBocmVmPSJkb2MvbWFudWFsLmh0bWwjYWRkb25fZm9sZGNvZGUiPkNvZGUgZm9sZGluZzwvYT4KICAgIDxsaT48YSBocmVmPSJkb2MvbWFudWFsLmh0bWwjb3B0aW9uX2V4dHJhS2V5cyI+Q29uZmlndXJhYmxlPC9hPiBrZXliaW5kaW5ncwogICAgPGxpPjxhIGhyZWY9ImRlbW8vdmltLmh0bWwiPlZpbTwvYT4sIDxhIGhyZWY9ImRlbW8vZW1hY3MuaHRtbCI+RW1hY3M8L2E+LCBhbmQgPGEgaHJlZj0iZGVtby9zdWJsaW1lLmh0bWwiPlN1YmxpbWUgVGV4dDwvYT4gYmluZGluZ3MKICAgIDxsaT48YSBocmVmPSJkb2MvbWFudWFsLmh0bWwjYWRkb25fc2VhcmNoIj5TZWFyY2ggYW5kIHJlcGxhY2U8L2E+IGludGVyZmFjZQogICAgPGxpPjxhIGhyZWY9ImRvYy9tYW51YWwuaHRtbCNhZGRvbl9tYXRjaGJyYWNrZXRzIj5CcmFja2V0PC9hPiBhbmQgPGEgaHJlZj0iZG9jL21hbnVhbC5odG1sI2FkZG9uX21hdGNodGFncyI+dGFnPC9hPiBtYXRjaGluZwogICAgPGxpPlN1cHBvcnQgZm9yIDxhIGhyZWY9ImRlbW8vYnVmZmVycy5odG1sIj5zcGxpdCB2aWV3czwvYT4KICAgIDxsaT48YSBocmVmPSJkb2MvbWFudWFsLmh0bWwjYWRkb25fbGludCI+TGludGVyIGludGVncmF0aW9uPC9hPgogICAgPGxpPjxhIGhyZWY9ImRlbW8vdmFyaWFibGVoZWlnaHQuaHRtbCI+TWl4aW5nIGZvbnQgc2l6ZXMgYW5kIHN0eWxlczwvYT4KICAgIDxsaT48YSBocmVmPSJkZW1vL3RoZW1lLmh0bWwiPlZhcmlvdXMgdGhlbWVzPC9hPgogICAgPGxpPkFibGUgdG8gPGEgaHJlZj0iZGVtby9yZXNpemUuaHRtbCI+cmVzaXplIHRvIGZpdCBjb250ZW50PC9hPgogICAgPGxpPjxhIGhyZWY9ImRvYy9tYW51YWwuaHRtbCNtYXJrX3JlcGxhY2VkV2l0aCI+SW5saW5lPC9hPiBhbmQgPGEgaHJlZj0iZG9jL21hbnVhbC5odG1sI2FkZExpbmVXaWRnZXQiPmJsb2NrPC9hPiB3aWRnZXRzCiAgICA8bGk+UHJvZ3JhbW1hYmxlIDxhIGhyZWY9ImRlbW8vbWFya2VyLmh0bWwiPmd1dHRlcnM8L2E+CiAgICA8bGk+TWFraW5nIHJhbmdlcyBvZiB0ZXh0IDxhIGhyZWY9ImRvYy9tYW51YWwuaHRtbCNtYXJrVGV4dCI+c3R5bGVkLCByZWFkLW9ubHksIG9yIGF0b21pYzwvYT4KICAgIDxsaT48YSBocmVmPSJkZW1vL2JpZGkuaHRtbCI+QmktZGlyZWN0aW9uYWwgdGV4dDwvYT4gc3VwcG9ydAogICAgPGxpPk1hbnkgb3RoZXIgPGEgaHJlZj0iZG9jL21hbnVhbC5odG1sI2FwaSI+bWV0aG9kczwvYT4gYW5kIDxhIGhyZWY9ImRvYy9tYW51YWwuaHRtbCNhZGRvbnMiPmFkZG9uczwvYT4uLi4KICA8L3VsPgo8L3NlY3Rpb24+Cgo8c2VjdGlvbiBpZD1jb21tdW5pdHk+CiAgPGgyPkNvbW11bml0eTwvaDI+CgogIDxwPkNvZGVNaXJyb3IgaXMgYW4gb3Blbi1zb3VyY2UgcHJvamVjdCBzaGFyZWQgdW5kZXIKICBhbiA8YSBocmVmPSJMSUNFTlNFIj5NSVQgbGljZW5zZTwvYT4uIEl0IGlzIHRoZSBlZGl0b3IgdXNlZCBpbiB0aGUKICBkZXYgdG9vbHMgZm9yCiAgYm90aCA8YSBocmVmPSJodHRwczovL2hhY2tzLm1vemlsbGEub3JnLzIwMTMvMTEvZmlyZWZveC1kZXZlbG9wZXItdG9vbHMtZXBpc29kZS0yNy1lZGl0LWFzLWh0bWwtY29kZW1pcnJvci1tb3JlLyI+RmlyZWZveDwvYT4KICBhbmQgPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vY2hyb21lLWRldmVsb3Blci10b29scy8iPkNocm9tZTwvYT4sIDxhIGhyZWY9Imh0dHA6Ly93d3cubGlnaHR0YWJsZS5jb20vIj5MaWdodAogIFRhYmxlPC9hPiwgPGEgaHJlZj0iaHR0cDovL2JyYWNrZXRzLmlvLyI+QWRvYmUKICBCcmFja2V0czwvYT4sIDxhIGhyZWY9Imh0dHA6Ly9ibG9nLmJpdGJ1Y2tldC5vcmcvMjAxMy8wNS8xNC9lZGl0LXlvdXItY29kZS1pbi10aGUtY2xvdWQtd2l0aC1iaXRidWNrZXQvIj5CaXRidWNrZXQ8L2E+LAogIGFuZCA8YSBocmVmPSJkb2MvcmVhbHdvcmxkLmh0bWwiPm1hbnkgb3RoZXIgcHJvamVjdHM8L2E+LjwvcD4KCiAgPHA+RGV2ZWxvcG1lbnQgYW5kIGJ1ZyB0cmFja2luZyBoYXBwZW5zCiAgb24gPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvQ29kZU1pcnJvci8iPmdpdGh1YjwvYT4KICAoPGEgaHJlZj0iaHR0cDovL21hcmlqbmhhdmVyYmVrZS5ubC9naXQvY29kZW1pcnJvciI+YWx0ZXJuYXRlIGdpdAogIHJlcG9zaXRvcnk8L2E+KS4KICBQbGVhc2UgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9yZXBvcnRpbmcuaHRtbCI+cmVhZCB0aGVzZQogIHBvaW50ZXJzPC9hPiBiZWZvcmUgc3VibWl0dGluZyBhIGJ1Zy4gVXNlIHB1bGwgcmVxdWVzdHMgdG8gc3VibWl0CiAgcGF0Y2hlcy4gQWxsIGNvbnRyaWJ1dGlvbnMgbXVzdCBiZSByZWxlYXNlZCB1bmRlciB0aGUgc2FtZSBNSVQKICBsaWNlbnNlIHRoYXQgQ29kZU1pcnJvciB1c2VzLjwvcD4KCiAgPHA+RGlzY3Vzc2lvbiBhcm91bmQgdGhlIHByb2plY3QgaXMgZG9uZSBvbgogIGEgPGEgaHJlZj0iaHR0cDovL2dyb3Vwcy5nb29nbGUuY29tL2dyb3VwL2NvZGVtaXJyb3IiPm1haWxpbmcgbGlzdDwvYT4uCiAgVGhlcmUgaXMgYWxzbwogIHRoZSA8YSBocmVmPSJodHRwOi8vZ3JvdXBzLmdvb2dsZS5jb20vZ3JvdXAvY29kZW1pcnJvci1hbm5vdW5jZSI+Y29kZW1pcnJvci1hbm5vdW5jZTwvYT4KICBsaXN0LCB3aGljaCBpcyBvbmx5IHVzZWQgZm9yIG1ham9yIGFubm91bmNlbWVudHMgKHN1Y2ggYXMgbmV3CiAgdmVyc2lvbnMpLiBJZiBuZWVkZWQsIHlvdSBjYW4KICBjb250YWN0IDxhIGhyZWY9Im1haWx0bzptYXJpam5oQGdtYWlsLmNvbSI+dGhlIG1haW50YWluZXI8L2E+CiAgZGlyZWN0bHkuPC9wPgoKICA8cD5BIGxpc3Qgb2YgQ29kZU1pcnJvci1yZWxhdGVkIHNvZnR3YXJlIHRoYXQgaXMgbm90IHBhcnQgb2YgdGhlCiAgbWFpbiBkaXN0cmlidXRpb24gaXMgbWFpbnRhaW5lZAogIG9uIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL0NvZGVNaXJyb3Ivd2lraS9Db2RlTWlycm9yLWFkZG9ucyI+b3VyCiAgd2lraTwvYT4uIEZlZWwgZnJlZSB0byBhZGQgeW91ciBwcm9qZWN0LjwvcD4KPC9zZWN0aW9uPgoKPHNlY3Rpb24gaWQ9YnJvd3NlcnN1cHBvcnQ+CiAgPGgyPkJyb3dzZXIgc3VwcG9ydDwvaDI+CiAgPHA+VGhlIDxlbT5kZXNrdG9wPC9lbT4gdmVyc2lvbnMgb2YgdGhlIGZvbGxvd2luZyBicm93c2VycywKICBpbiA8ZW0+c3RhbmRhcmRzIG1vZGU8L2VtPiAoSFRNTDUgPGNvZGU+Jmx0OyFkb2N0eXBlIGh0bWw+PC9jb2RlPgogIHJlY29tbWVuZGVkKSBhcmUgc3VwcG9ydGVkOjwvcD4KICA8dGFibGUgc3R5bGU9Im1hcmdpbi1ib3R0b206IDFlbSI+CiAgICA8dHI+PHRoPkZpcmVmb3g8L3RoPjx0ZD52ZXJzaW9uIDMgYW5kIHVwPC90ZD48L3RyPgogICAgPHRyPjx0aD5DaHJvbWU8L3RoPjx0ZD5hbnkgdmVyc2lvbjwvdGQ+PC90cj4KICAgIDx0cj48dGg+U2FmYXJpPC90aD48dGQ+dmVyc2lvbiA1LjIgYW5kIHVwPC90ZD48L3RyPgogICAgPHRyPjx0aCBzdHlsZT0icGFkZGluZy1yaWdodDogMWVtOyI+SW50ZXJuZXQgRXhwbG9yZXI8L3RoPjx0ZD52ZXJzaW9uIDggYW5kIHVwPC90ZD48L3RyPgogICAgPHRyPjx0aD5PcGVyYTwvdGg+PHRkPnZlcnNpb24gOSBhbmQgdXA8L3RkPjwvdHI+CiAgPC90YWJsZT4KICA8cD5Nb2Rlcm4gbW9iaWxlIGJyb3dzZXJzIHRlbmQgdG8gcGFydGx5IHdvcmsuIEJ1ZyByZXBvcnRzIGFuZAogIHBhdGNoZXMgZm9yIG1vYmlsZSBzdXBwb3J0IGFyZSB3ZWxjb21lLCBidXQgdGhlIG1haW50YWluZXIgZG9lcyBub3QKICBoYXZlIHRoZSB0aW1lIG9yIGJ1ZGdldCB0byBhY3R1YWxseSB3b3JrIG9uIGl0IGhpbXNlbGYuPC9wPgo8L3NlY3Rpb24+Cgo8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/keymap/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/keymap/emacs.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CgogIHZhciBQb3MgPSBDb2RlTWlycm9yLlBvczsKICBmdW5jdGlvbiBwb3NFcShhLCBiKSB7IHJldHVybiBhLmxpbmUgPT0gYi5saW5lICYmIGEuY2ggPT0gYi5jaDsgfQoKICAvLyBLaWxsICdyaW5nJwoKICB2YXIga2lsbFJpbmcgPSBbXTsKICBmdW5jdGlvbiBhZGRUb1Jpbmcoc3RyKSB7CiAgICBraWxsUmluZy5wdXNoKHN0cik7CiAgICBpZiAoa2lsbFJpbmcubGVuZ3RoID4gNTApIGtpbGxSaW5nLnNoaWZ0KCk7CiAgfQogIGZ1bmN0aW9uIGdyb3dSaW5nVG9wKHN0cikgewogICAgaWYgKCFraWxsUmluZy5sZW5ndGgpIHJldHVybiBhZGRUb1Jpbmcoc3RyKTsKICAgIGtpbGxSaW5nW2tpbGxSaW5nLmxlbmd0aCAtIDFdICs9IHN0cjsKICB9CiAgZnVuY3Rpb24gZ2V0RnJvbVJpbmcobikgeyByZXR1cm4ga2lsbFJpbmdba2lsbFJpbmcubGVuZ3RoIC0gKG4gPyBNYXRoLm1pbihuLCAxKSA6IDEpXSB8fCAiIjsgfQogIGZ1bmN0aW9uIHBvcEZyb21SaW5nKCkgeyBpZiAoa2lsbFJpbmcubGVuZ3RoID4gMSkga2lsbFJpbmcucG9wKCk7IHJldHVybiBnZXRGcm9tUmluZygpOyB9CgogIHZhciBsYXN0S2lsbCA9IG51bGw7CgogIGZ1bmN0aW9uIGtpbGwoY20sIGZyb20sIHRvLCBtYXlHcm93LCB0ZXh0KSB7CiAgICBpZiAodGV4dCA9PSBudWxsKSB0ZXh0ID0gY20uZ2V0UmFuZ2UoZnJvbSwgdG8pOwoKICAgIGlmIChtYXlHcm93ICYmIGxhc3RLaWxsICYmIGxhc3RLaWxsLmNtID09IGNtICYmIHBvc0VxKGZyb20sIGxhc3RLaWxsLnBvcykgJiYgY20uaXNDbGVhbihsYXN0S2lsbC5nZW4pKQogICAgICBncm93UmluZ1RvcCh0ZXh0KTsKICAgIGVsc2UKICAgICAgYWRkVG9SaW5nKHRleHQpOwogICAgY20ucmVwbGFjZVJhbmdlKCIiLCBmcm9tLCB0bywgIitkZWxldGUiKTsKCiAgICBpZiAobWF5R3JvdykgbGFzdEtpbGwgPSB7Y206IGNtLCBwb3M6IGZyb20sIGdlbjogY20uY2hhbmdlR2VuZXJhdGlvbigpfTsKICAgIGVsc2UgbGFzdEtpbGwgPSBudWxsOwogIH0KCiAgLy8gQm91bmRhcmllcyBvZiB2YXJpb3VzIHVuaXRzCgogIGZ1bmN0aW9uIGJ5Q2hhcihjbSwgcG9zLCBkaXIpIHsKICAgIHJldHVybiBjbS5maW5kUG9zSChwb3MsIGRpciwgImNoYXIiLCB0cnVlKTsKICB9CgogIGZ1bmN0aW9uIGJ5V29yZChjbSwgcG9zLCBkaXIpIHsKICAgIHJldHVybiBjbS5maW5kUG9zSChwb3MsIGRpciwgIndvcmQiLCB0cnVlKTsKICB9CgogIGZ1bmN0aW9uIGJ5TGluZShjbSwgcG9zLCBkaXIpIHsKICAgIHJldHVybiBjbS5maW5kUG9zVihwb3MsIGRpciwgImxpbmUiLCBjbS5kb2Muc2VsLmdvYWxDb2x1bW4pOwogIH0KCiAgZnVuY3Rpb24gYnlQYWdlKGNtLCBwb3MsIGRpcikgewogICAgcmV0dXJuIGNtLmZpbmRQb3NWKHBvcywgZGlyLCAicGFnZSIsIGNtLmRvYy5zZWwuZ29hbENvbHVtbik7CiAgfQoKICBmdW5jdGlvbiBieVBhcmFncmFwaChjbSwgcG9zLCBkaXIpIHsKICAgIHZhciBubyA9IHBvcy5saW5lLCBsaW5lID0gY20uZ2V0TGluZShubyk7CiAgICB2YXIgc2F3VGV4dCA9IC9cUy8udGVzdChkaXIgPCAwID8gbGluZS5zbGljZSgwLCBwb3MuY2gpIDogbGluZS5zbGljZShwb3MuY2gpKTsKICAgIHZhciBmc3QgPSBjbS5maXJzdExpbmUoKSwgbHN0ID0gY20ubGFzdExpbmUoKTsKICAgIGZvciAoOzspIHsKICAgICAgbm8gKz0gZGlyOwogICAgICBpZiAobm8gPCBmc3QgfHwgbm8gPiBsc3QpCiAgICAgICAgcmV0dXJuIGNtLmNsaXBQb3MoUG9zKG5vIC0gZGlyLCBkaXIgPCAwID8gMCA6IG51bGwpKTsKICAgICAgbGluZSA9IGNtLmdldExpbmUobm8pOwogICAgICB2YXIgaGFzVGV4dCA9IC9cUy8udGVzdChsaW5lKTsKICAgICAgaWYgKGhhc1RleHQpIHNhd1RleHQgPSB0cnVlOwogICAgICBlbHNlIGlmIChzYXdUZXh0KSByZXR1cm4gUG9zKG5vLCAwKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGJ5U2VudGVuY2UoY20sIHBvcywgZGlyKSB7CiAgICB2YXIgbGluZSA9IHBvcy5saW5lLCBjaCA9IHBvcy5jaDsKICAgIHZhciB0ZXh0ID0gY20uZ2V0TGluZShwb3MubGluZSksIHNhd1dvcmQgPSBmYWxzZTsKICAgIGZvciAoOzspIHsKICAgICAgdmFyIG5leHQgPSB0ZXh0LmNoYXJBdChjaCArIChkaXIgPCAwID8gLTEgOiAwKSk7CiAgICAgIGlmICghbmV4dCkgeyAvLyBFbmQvYmVnaW5uaW5nIG9mIGxpbmUgcmVhY2hlZAogICAgICAgIGlmIChsaW5lID09IChkaXIgPCAwID8gY20uZmlyc3RMaW5lKCkgOiBjbS5sYXN0TGluZSgpKSkgcmV0dXJuIFBvcyhsaW5lLCBjaCk7CiAgICAgICAgdGV4dCA9IGNtLmdldExpbmUobGluZSArIGRpcik7CiAgICAgICAgaWYgKCEvXFMvLnRlc3QodGV4dCkpIHJldHVybiBQb3MobGluZSwgY2gpOwogICAgICAgIGxpbmUgKz0gZGlyOwogICAgICAgIGNoID0gZGlyIDwgMCA/IHRleHQubGVuZ3RoIDogMDsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBpZiAoc2F3V29yZCAmJiAvWyE/Ll0vLnRlc3QobmV4dCkpIHJldHVybiBQb3MobGluZSwgY2ggKyAoZGlyID4gMCA/IDEgOiAwKSk7CiAgICAgIGlmICghc2F3V29yZCkgc2F3V29yZCA9IC9cdy8udGVzdChuZXh0KTsKICAgICAgY2ggKz0gZGlyOwogICAgfQogIH0KCiAgZnVuY3Rpb24gYnlFeHByKGNtLCBwb3MsIGRpcikgewogICAgdmFyIHdyYXA7CiAgICBpZiAoY20uZmluZE1hdGNoaW5nQnJhY2tldCAmJiAod3JhcCA9IGNtLmZpbmRNYXRjaGluZ0JyYWNrZXQocG9zLCB0cnVlKSkKICAgICAgICAmJiB3cmFwLm1hdGNoICYmICh3cmFwLmZvcndhcmQgPyAxIDogLTEpID09IGRpcikKICAgICAgcmV0dXJuIGRpciA+IDAgPyBQb3Mod3JhcC50by5saW5lLCB3cmFwLnRvLmNoICsgMSkgOiB3cmFwLnRvOwoKICAgIGZvciAodmFyIGZpcnN0ID0gdHJ1ZTs7IGZpcnN0ID0gZmFsc2UpIHsKICAgICAgdmFyIHRva2VuID0gY20uZ2V0VG9rZW5BdChwb3MpOwogICAgICB2YXIgYWZ0ZXIgPSBQb3MocG9zLmxpbmUsIGRpciA8IDAgPyB0b2tlbi5zdGFydCA6IHRva2VuLmVuZCk7CiAgICAgIGlmIChmaXJzdCAmJiBkaXIgPiAwICYmIHRva2VuLmVuZCA9PSBwb3MuY2ggfHwgIS9cdy8udGVzdCh0b2tlbi5zdHJpbmcpKSB7CiAgICAgICAgdmFyIG5ld1BvcyA9IGNtLmZpbmRQb3NIKGFmdGVyLCBkaXIsICJjaGFyIik7CiAgICAgICAgaWYgKHBvc0VxKGFmdGVyLCBuZXdQb3MpKSByZXR1cm4gcG9zOwogICAgICAgIGVsc2UgcG9zID0gbmV3UG9zOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBhZnRlcjsKICAgICAgfQogICAgfQogIH0KCiAgLy8gUHJlZml4ZXMgKG9ubHkgY3J1ZGVseSBzdXBwb3J0ZWQpCgogIGZ1bmN0aW9uIGdldFByZWZpeChjbSwgcHJlY2lzZSkgewogICAgdmFyIGRpZ2l0cyA9IGNtLnN0YXRlLmVtYWNzUHJlZml4OwogICAgaWYgKCFkaWdpdHMpIHJldHVybiBwcmVjaXNlID8gbnVsbCA6IDE7CiAgICBjbGVhclByZWZpeChjbSk7CiAgICByZXR1cm4gZGlnaXRzID09ICItIiA/IC0xIDogTnVtYmVyKGRpZ2l0cyk7CiAgfQoKICBmdW5jdGlvbiByZXBlYXRlZChjbWQpIHsKICAgIHZhciBmID0gdHlwZW9mIGNtZCA9PSAic3RyaW5nIiA/IGZ1bmN0aW9uKGNtKSB7IGNtLmV4ZWNDb21tYW5kKGNtZCk7IH0gOiBjbWQ7CiAgICByZXR1cm4gZnVuY3Rpb24oY20pIHsKICAgICAgdmFyIHByZWZpeCA9IGdldFByZWZpeChjbSk7CiAgICAgIGYoY20pOwogICAgICBmb3IgKHZhciBpID0gMTsgaSA8IHByZWZpeDsgKytpKSBmKGNtKTsKICAgIH07CiAgfQoKICBmdW5jdGlvbiBmaW5kRW5kKGNtLCBieSwgZGlyKSB7CiAgICB2YXIgcG9zID0gY20uZ2V0Q3Vyc29yKCksIHByZWZpeCA9IGdldFByZWZpeChjbSk7CiAgICBpZiAocHJlZml4IDwgMCkgeyBkaXIgPSAtZGlyOyBwcmVmaXggPSAtcHJlZml4OyB9CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByZWZpeDsgKytpKSB7CiAgICAgIHZhciBuZXdQb3MgPSBieShjbSwgcG9zLCBkaXIpOwogICAgICBpZiAocG9zRXEobmV3UG9zLCBwb3MpKSBicmVhazsKICAgICAgcG9zID0gbmV3UG9zOwogICAgfQogICAgcmV0dXJuIHBvczsKICB9CgogIGZ1bmN0aW9uIG1vdmUoYnksIGRpcikgewogICAgdmFyIGYgPSBmdW5jdGlvbihjbSkgewogICAgICBjbS5leHRlbmRTZWxlY3Rpb24oZmluZEVuZChjbSwgYnksIGRpcikpOwogICAgfTsKICAgIGYubW90aW9uID0gdHJ1ZTsKICAgIHJldHVybiBmOwogIH0KCiAgZnVuY3Rpb24ga2lsbFRvKGNtLCBieSwgZGlyKSB7CiAgICBraWxsKGNtLCBjbS5nZXRDdXJzb3IoKSwgZmluZEVuZChjbSwgYnksIGRpciksIHRydWUpOwogIH0KCiAgZnVuY3Rpb24gYWRkUHJlZml4KGNtLCBkaWdpdCkgewogICAgaWYgKGNtLnN0YXRlLmVtYWNzUHJlZml4KSB7CiAgICAgIGlmIChkaWdpdCAhPSAiLSIpIGNtLnN0YXRlLmVtYWNzUHJlZml4ICs9IGRpZ2l0OwogICAgICByZXR1cm47CiAgICB9CiAgICAvLyBOb3QgYWN0aXZlIHlldAogICAgY20uc3RhdGUuZW1hY3NQcmVmaXggPSBkaWdpdDsKICAgIGNtLm9uKCJrZXlIYW5kbGVkIiwgbWF5YmVDbGVhclByZWZpeCk7CiAgICBjbS5vbigiaW5wdXRSZWFkIiwgbWF5YmVEdXBsaWNhdGVJbnB1dCk7CiAgfQoKICB2YXIgcHJlZml4UHJlc2VydmluZ0tleXMgPSB7IkFsdC1HIjogdHJ1ZSwgIkN0cmwtWCI6IHRydWUsICJDdHJsLVEiOiB0cnVlLCAiQ3RybC1VIjogdHJ1ZX07CgogIGZ1bmN0aW9uIG1heWJlQ2xlYXJQcmVmaXgoY20sIGFyZykgewogICAgaWYgKCFjbS5zdGF0ZS5lbWFjc1ByZWZpeE1hcCAmJiAhcHJlZml4UHJlc2VydmluZ0tleXMuaGFzT3duUHJvcGVydHkoYXJnKSkKICAgICAgY2xlYXJQcmVmaXgoY20pOwogIH0KCiAgZnVuY3Rpb24gY2xlYXJQcmVmaXgoY20pIHsKICAgIGNtLnN0YXRlLmVtYWNzUHJlZml4ID0gbnVsbDsKICAgIGNtLm9mZigia2V5SGFuZGxlZCIsIG1heWJlQ2xlYXJQcmVmaXgpOwogICAgY20ub2ZmKCJpbnB1dFJlYWQiLCBtYXliZUR1cGxpY2F0ZUlucHV0KTsKICB9CgogIGZ1bmN0aW9uIG1heWJlRHVwbGljYXRlSW5wdXQoY20sIGV2ZW50KSB7CiAgICB2YXIgZHVwID0gZ2V0UHJlZml4KGNtKTsKICAgIGlmIChkdXAgPiAxICYmIGV2ZW50Lm9yaWdpbiA9PSAiK2lucHV0IikgewogICAgICB2YXIgb25lID0gZXZlbnQudGV4dC5qb2luKCJcbiIpLCB0eHQgPSAiIjsKICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBkdXA7ICsraSkgdHh0ICs9IG9uZTsKICAgICAgY20ucmVwbGFjZVNlbGVjdGlvbih0eHQpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gYWRkUHJlZml4TWFwKGNtKSB7CiAgICBjbS5zdGF0ZS5lbWFjc1ByZWZpeE1hcCA9IHRydWU7CiAgICBjbS5hZGRLZXlNYXAocHJlZml4TWFwKTsKICAgIGNtLm9uKCJrZXlIYW5kbGVkIiwgbWF5YmVSZW1vdmVQcmVmaXhNYXApOwogICAgY20ub24oImlucHV0UmVhZCIsIG1heWJlUmVtb3ZlUHJlZml4TWFwKTsKICB9CgogIGZ1bmN0aW9uIG1heWJlUmVtb3ZlUHJlZml4TWFwKGNtLCBhcmcpIHsKICAgIGlmICh0eXBlb2YgYXJnID09ICJzdHJpbmciICYmICgvXlxkJC8udGVzdChhcmcpIHx8IGFyZyA9PSAiQ3RybC1VIikpIHJldHVybjsKICAgIGNtLnJlbW92ZUtleU1hcChwcmVmaXhNYXApOwogICAgY20uc3RhdGUuZW1hY3NQcmVmaXhNYXAgPSBmYWxzZTsKICAgIGNtLm9mZigia2V5SGFuZGxlZCIsIG1heWJlUmVtb3ZlUHJlZml4TWFwKTsKICAgIGNtLm9mZigiaW5wdXRSZWFkIiwgbWF5YmVSZW1vdmVQcmVmaXhNYXApOwogIH0KCiAgLy8gVXRpbGl0aWVzCgogIGZ1bmN0aW9uIHNldE1hcmsoY20pIHsKICAgIGNtLnNldEN1cnNvcihjbS5nZXRDdXJzb3IoKSk7CiAgICBjbS5zZXRFeHRlbmRpbmcoIWNtLmdldEV4dGVuZGluZygpKTsKICAgIGNtLm9uKCJjaGFuZ2UiLCBmdW5jdGlvbigpIHsgY20uc2V0RXh0ZW5kaW5nKGZhbHNlKTsgfSk7CiAgfQoKICBmdW5jdGlvbiBjbGVhck1hcmsoY20pIHsKICAgIGNtLnNldEV4dGVuZGluZyhmYWxzZSk7CiAgICBjbS5zZXRDdXJzb3IoY20uZ2V0Q3Vyc29yKCkpOwogIH0KCiAgZnVuY3Rpb24gZ2V0SW5wdXQoY20sIG1zZywgZikgewogICAgaWYgKGNtLm9wZW5EaWFsb2cpCiAgICAgIGNtLm9wZW5EaWFsb2cobXNnICsgIjogPGlucHV0IHR5cGU9XCJ0ZXh0XCIgc3R5bGU9XCJ3aWR0aDogMTBlbVwiLz4iLCBmLCB7Ym90dG9tOiB0cnVlfSk7CiAgICBlbHNlCiAgICAgIGYocHJvbXB0KG1zZywgIiIpKTsKICB9CgogIGZ1bmN0aW9uIG9wZXJhdGVPbldvcmQoY20sIG9wKSB7CiAgICB2YXIgc3RhcnQgPSBjbS5nZXRDdXJzb3IoKSwgZW5kID0gY20uZmluZFBvc0goc3RhcnQsIDEsICJ3b3JkIik7CiAgICBjbS5yZXBsYWNlUmFuZ2Uob3AoY20uZ2V0UmFuZ2Uoc3RhcnQsIGVuZCkpLCBzdGFydCwgZW5kKTsKICAgIGNtLnNldEN1cnNvcihlbmQpOwogIH0KCiAgZnVuY3Rpb24gdG9FbmNsb3NpbmdFeHByKGNtKSB7CiAgICB2YXIgcG9zID0gY20uZ2V0Q3Vyc29yKCksIGxpbmUgPSBwb3MubGluZSwgY2ggPSBwb3MuY2g7CiAgICB2YXIgc3RhY2sgPSBbXTsKICAgIHdoaWxlIChsaW5lID49IGNtLmZpcnN0TGluZSgpKSB7CiAgICAgIHZhciB0ZXh0ID0gY20uZ2V0TGluZShsaW5lKTsKICAgICAgZm9yICh2YXIgaSA9IGNoID09IG51bGwgPyB0ZXh0Lmxlbmd0aCA6IGNoOyBpID4gMDspIHsKICAgICAgICB2YXIgY2ggPSB0ZXh0LmNoYXJBdCgtLWkpOwogICAgICAgIGlmIChjaCA9PSAiKSIpCiAgICAgICAgICBzdGFjay5wdXNoKCIoIik7CiAgICAgICAgZWxzZSBpZiAoY2ggPT0gIl0iKQogICAgICAgICAgc3RhY2sucHVzaCgiWyIpOwogICAgICAgIGVsc2UgaWYgKGNoID09ICJ9IikKICAgICAgICAgIHN0YWNrLnB1c2goInsiKTsKICAgICAgICBlbHNlIGlmICgvW1woXHtcW10vLnRlc3QoY2gpICYmICghc3RhY2subGVuZ3RoIHx8IHN0YWNrLnBvcCgpICE9IGNoKSkKICAgICAgICAgIHJldHVybiBjbS5leHRlbmRTZWxlY3Rpb24oUG9zKGxpbmUsIGkpKTsKICAgICAgfQogICAgICAtLWxpbmU7IGNoID0gbnVsbDsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHF1aXQoY20pIHsKICAgIGNtLmV4ZWNDb21tYW5kKCJjbGVhclNlYXJjaCIpOwogICAgY2xlYXJNYXJrKGNtKTsKICB9CgogIC8vIEFjdHVhbCBrZXltYXAKCiAgdmFyIGtleU1hcCA9IENvZGVNaXJyb3Iua2V5TWFwLmVtYWNzID0gewogICAgIkN0cmwtVyI6IGZ1bmN0aW9uKGNtKSB7a2lsbChjbSwgY20uZ2V0Q3Vyc29yKCJzdGFydCIpLCBjbS5nZXRDdXJzb3IoImVuZCIpKTt9LAogICAgIkN0cmwtSyI6IHJlcGVhdGVkKGZ1bmN0aW9uKGNtKSB7CiAgICAgIHZhciBzdGFydCA9IGNtLmdldEN1cnNvcigpLCBlbmQgPSBjbS5jbGlwUG9zKFBvcyhzdGFydC5saW5lKSk7CiAgICAgIHZhciB0ZXh0ID0gY20uZ2V0UmFuZ2Uoc3RhcnQsIGVuZCk7CiAgICAgIGlmICghL1xTLy50ZXN0KHRleHQpKSB7CiAgICAgICAgdGV4dCArPSAiXG4iOwogICAgICAgIGVuZCA9IFBvcyhzdGFydC5saW5lICsgMSwgMCk7CiAgICAgIH0KICAgICAga2lsbChjbSwgc3RhcnQsIGVuZCwgdHJ1ZSwgdGV4dCk7CiAgICB9KSwKICAgICJBbHQtVyI6IGZ1bmN0aW9uKGNtKSB7CiAgICAgIGFkZFRvUmluZyhjbS5nZXRTZWxlY3Rpb24oKSk7CiAgICAgIGNsZWFyTWFyayhjbSk7CiAgICB9LAogICAgIkN0cmwtWSI6IGZ1bmN0aW9uKGNtKSB7CiAgICAgIHZhciBzdGFydCA9IGNtLmdldEN1cnNvcigpOwogICAgICBjbS5yZXBsYWNlUmFuZ2UoZ2V0RnJvbVJpbmcoZ2V0UHJlZml4KGNtKSksIHN0YXJ0LCBzdGFydCwgInBhc3RlIik7CiAgICAgIGNtLnNldFNlbGVjdGlvbihzdGFydCwgY20uZ2V0Q3Vyc29yKCkpOwogICAgfSwKICAgICJBbHQtWSI6IGZ1bmN0aW9uKGNtKSB7Y20ucmVwbGFjZVNlbGVjdGlvbihwb3BGcm9tUmluZygpLCAiYXJvdW5kIiwgInBhc3RlIik7fSwKCiAgICAiQ3RybC1TcGFjZSI6IHNldE1hcmssICJDdHJsLVNoaWZ0LTIiOiBzZXRNYXJrLAoKICAgICJDdHJsLUYiOiBtb3ZlKGJ5Q2hhciwgMSksICJDdHJsLUIiOiBtb3ZlKGJ5Q2hhciwgLTEpLAogICAgIlJpZ2h0IjogbW92ZShieUNoYXIsIDEpLCAiTGVmdCI6IG1vdmUoYnlDaGFyLCAtMSksCiAgICAiQ3RybC1EIjogZnVuY3Rpb24oY20pIHsga2lsbFRvKGNtLCBieUNoYXIsIDEpOyB9LAogICAgIkRlbGV0ZSI6IGZ1bmN0aW9uKGNtKSB7IGtpbGxUbyhjbSwgYnlDaGFyLCAxKTsgfSwKICAgICJDdHJsLUgiOiBmdW5jdGlvbihjbSkgeyBraWxsVG8oY20sIGJ5Q2hhciwgLTEpOyB9LAogICAgIkJhY2tzcGFjZSI6IGZ1bmN0aW9uKGNtKSB7IGtpbGxUbyhjbSwgYnlDaGFyLCAtMSk7IH0sCgogICAgIkFsdC1GIjogbW92ZShieVdvcmQsIDEpLCAiQWx0LUIiOiBtb3ZlKGJ5V29yZCwgLTEpLAogICAgIkFsdC1EIjogZnVuY3Rpb24oY20pIHsga2lsbFRvKGNtLCBieVdvcmQsIDEpOyB9LAogICAgIkFsdC1CYWNrc3BhY2UiOiBmdW5jdGlvbihjbSkgeyBraWxsVG8oY20sIGJ5V29yZCwgLTEpOyB9LAoKICAgICJDdHJsLU4iOiBtb3ZlKGJ5TGluZSwgMSksICJDdHJsLVAiOiBtb3ZlKGJ5TGluZSwgLTEpLAogICAgIkRvd24iOiBtb3ZlKGJ5TGluZSwgMSksICJVcCI6IG1vdmUoYnlMaW5lLCAtMSksCiAgICAiQ3RybC1BIjogImdvTGluZVN0YXJ0IiwgIkN0cmwtRSI6ICJnb0xpbmVFbmQiLAogICAgIkVuZCI6ICJnb0xpbmVFbmQiLCAiSG9tZSI6ICJnb0xpbmVTdGFydCIsCgogICAgIkFsdC1WIjogbW92ZShieVBhZ2UsIC0xKSwgIkN0cmwtViI6IG1vdmUoYnlQYWdlLCAxKSwKICAgICJQYWdlVXAiOiBtb3ZlKGJ5UGFnZSwgLTEpLCAiUGFnZURvd24iOiBtb3ZlKGJ5UGFnZSwgMSksCgogICAgIkN0cmwtVXAiOiBtb3ZlKGJ5UGFyYWdyYXBoLCAtMSksICJDdHJsLURvd24iOiBtb3ZlKGJ5UGFyYWdyYXBoLCAxKSwKCiAgICAiQWx0LUEiOiBtb3ZlKGJ5U2VudGVuY2UsIC0xKSwgIkFsdC1FIjogbW92ZShieVNlbnRlbmNlLCAxKSwKICAgICJBbHQtSyI6IGZ1bmN0aW9uKGNtKSB7IGtpbGxUbyhjbSwgYnlTZW50ZW5jZSwgMSk7IH0sCgogICAgIkN0cmwtQWx0LUsiOiBmdW5jdGlvbihjbSkgeyBraWxsVG8oY20sIGJ5RXhwciwgMSk7IH0sCiAgICAiQ3RybC1BbHQtQmFja3NwYWNlIjogZnVuY3Rpb24oY20pIHsga2lsbFRvKGNtLCBieUV4cHIsIC0xKTsgfSwKICAgICJDdHJsLUFsdC1GIjogbW92ZShieUV4cHIsIDEpLCAiQ3RybC1BbHQtQiI6IG1vdmUoYnlFeHByLCAtMSksCgogICAgIlNoaWZ0LUN0cmwtQWx0LTIiOiBmdW5jdGlvbihjbSkgewogICAgICBjbS5zZXRTZWxlY3Rpb24oZmluZEVuZChjbSwgYnlFeHByLCAxKSwgY20uZ2V0Q3Vyc29yKCkpOwogICAgfSwKICAgICJDdHJsLUFsdC1UIjogZnVuY3Rpb24oY20pIHsKICAgICAgdmFyIGxlZnRTdGFydCA9IGJ5RXhwcihjbSwgY20uZ2V0Q3Vyc29yKCksIC0xKSwgbGVmdEVuZCA9IGJ5RXhwcihjbSwgbGVmdFN0YXJ0LCAxKTsKICAgICAgdmFyIHJpZ2h0RW5kID0gYnlFeHByKGNtLCBsZWZ0RW5kLCAxKSwgcmlnaHRTdGFydCA9IGJ5RXhwcihjbSwgcmlnaHRFbmQsIC0xKTsKICAgICAgY20ucmVwbGFjZVJhbmdlKGNtLmdldFJhbmdlKHJpZ2h0U3RhcnQsIHJpZ2h0RW5kKSArIGNtLmdldFJhbmdlKGxlZnRFbmQsIHJpZ2h0U3RhcnQpICsKICAgICAgICAgICAgICAgICAgICAgIGNtLmdldFJhbmdlKGxlZnRTdGFydCwgbGVmdEVuZCksIGxlZnRTdGFydCwgcmlnaHRFbmQpOwogICAgfSwKICAgICJDdHJsLUFsdC1VIjogcmVwZWF0ZWQodG9FbmNsb3NpbmdFeHByKSwKCiAgICAiQWx0LVNwYWNlIjogZnVuY3Rpb24oY20pIHsKICAgICAgdmFyIHBvcyA9IGNtLmdldEN1cnNvcigpLCBmcm9tID0gcG9zLmNoLCB0byA9IHBvcy5jaCwgdGV4dCA9IGNtLmdldExpbmUocG9zLmxpbmUpOwogICAgICB3aGlsZSAoZnJvbSAmJiAvXHMvLnRlc3QodGV4dC5jaGFyQXQoZnJvbSAtIDEpKSkgLS1mcm9tOwogICAgICB3aGlsZSAodG8gPCB0ZXh0Lmxlbmd0aCAmJiAvXHMvLnRlc3QodGV4dC5jaGFyQXQodG8pKSkgKyt0bzsKICAgICAgY20ucmVwbGFjZVJhbmdlKCIgIiwgUG9zKHBvcy5saW5lLCBmcm9tKSwgUG9zKHBvcy5saW5lLCB0bykpOwogICAgfSwKICAgICJDdHJsLU8iOiByZXBlYXRlZChmdW5jdGlvbihjbSkgeyBjbS5yZXBsYWNlU2VsZWN0aW9uKCJcbiIsICJzdGFydCIpOyB9KSwKICAgICJDdHJsLVQiOiByZXBlYXRlZChmdW5jdGlvbihjbSkgewogICAgICBjbS5leGVjQ29tbWFuZCgidHJhbnNwb3NlQ2hhcnMiKTsKICAgIH0pLAoKICAgICJBbHQtQyI6IHJlcGVhdGVkKGZ1bmN0aW9uKGNtKSB7CiAgICAgIG9wZXJhdGVPbldvcmQoY20sIGZ1bmN0aW9uKHcpIHsKICAgICAgICB2YXIgbGV0dGVyID0gdy5zZWFyY2goL1x3Lyk7CiAgICAgICAgaWYgKGxldHRlciA9PSAtMSkgcmV0dXJuIHc7CiAgICAgICAgcmV0dXJuIHcuc2xpY2UoMCwgbGV0dGVyKSArIHcuY2hhckF0KGxldHRlcikudG9VcHBlckNhc2UoKSArIHcuc2xpY2UobGV0dGVyICsgMSkudG9Mb3dlckNhc2UoKTsKICAgICAgfSk7CiAgICB9KSwKICAgICJBbHQtVSI6IHJlcGVhdGVkKGZ1bmN0aW9uKGNtKSB7CiAgICAgIG9wZXJhdGVPbldvcmQoY20sIGZ1bmN0aW9uKHcpIHsgcmV0dXJuIHcudG9VcHBlckNhc2UoKTsgfSk7CiAgICB9KSwKICAgICJBbHQtTCI6IHJlcGVhdGVkKGZ1bmN0aW9uKGNtKSB7CiAgICAgIG9wZXJhdGVPbldvcmQoY20sIGZ1bmN0aW9uKHcpIHsgcmV0dXJuIHcudG9Mb3dlckNhc2UoKTsgfSk7CiAgICB9KSwKCiAgICAiQWx0LTsiOiAidG9nZ2xlQ29tbWVudCIsCgogICAgIkN0cmwtLyI6IHJlcGVhdGVkKCJ1bmRvIiksICJTaGlmdC1DdHJsLS0iOiByZXBlYXRlZCgidW5kbyIpLAogICAgIkN0cmwtWiI6IHJlcGVhdGVkKCJ1bmRvIiksICJDbWQtWiI6IHJlcGVhdGVkKCJ1bmRvIiksCiAgICAiU2hpZnQtQWx0LSwiOiAiZ29Eb2NTdGFydCIsICJTaGlmdC1BbHQtLiI6ICJnb0RvY0VuZCIsCiAgICAiQ3RybC1TIjogImZpbmROZXh0IiwgIkN0cmwtUiI6ICJmaW5kUHJldiIsICJDdHJsLUciOiBxdWl0LCAiU2hpZnQtQWx0LTUiOiAicmVwbGFjZSIsCiAgICAiQWx0LS8iOiAiYXV0b2NvbXBsZXRlIiwKICAgICJDdHJsLUoiOiAibmV3bGluZUFuZEluZGVudCIsICJFbnRlciI6IGZhbHNlLCAiVGFiIjogImluZGVudEF1dG8iLAoKICAgICJBbHQtRyI6IGZ1bmN0aW9uKGNtKSB7Y20uc2V0T3B0aW9uKCJrZXlNYXAiLCAiZW1hY3MtQWx0LUciKTt9LAogICAgIkN0cmwtWCI6IGZ1bmN0aW9uKGNtKSB7Y20uc2V0T3B0aW9uKCJrZXlNYXAiLCAiZW1hY3MtQ3RybC1YIik7fSwKICAgICJDdHJsLVEiOiBmdW5jdGlvbihjbSkge2NtLnNldE9wdGlvbigia2V5TWFwIiwgImVtYWNzLUN0cmwtUSIpO30sCiAgICAiQ3RybC1VIjogYWRkUHJlZml4TWFwCiAgfTsKCiAgQ29kZU1pcnJvci5rZXlNYXBbImVtYWNzLUN0cmwtWCJdID0gewogICAgIlRhYiI6IGZ1bmN0aW9uKGNtKSB7CiAgICAgIGNtLmluZGVudFNlbGVjdGlvbihnZXRQcmVmaXgoY20sIHRydWUpIHx8IGNtLmdldE9wdGlvbigiaW5kZW50VW5pdCIpKTsKICAgIH0sCiAgICAiQ3RybC1YIjogZnVuY3Rpb24oY20pIHsKICAgICAgY20uc2V0U2VsZWN0aW9uKGNtLmdldEN1cnNvcigiaGVhZCIpLCBjbS5nZXRDdXJzb3IoImFuY2hvciIpKTsKICAgIH0sCgogICAgIkN0cmwtUyI6ICJzYXZlIiwgIkN0cmwtVyI6ICJzYXZlIiwgIlMiOiAic2F2ZUFsbCIsICJGIjogIm9wZW4iLCAiVSI6IHJlcGVhdGVkKCJ1bmRvIiksICJLIjogImNsb3NlIiwKICAgICJEZWxldGUiOiBmdW5jdGlvbihjbSkgeyBraWxsKGNtLCBjbS5nZXRDdXJzb3IoKSwgYnlTZW50ZW5jZShjbSwgY20uZ2V0Q3Vyc29yKCksIDEpLCB0cnVlKTsgfSwKICAgIGF1dG86ICJlbWFjcyIsIG5vZmFsbHRocm91Z2g6IHRydWUsIGRpc2FibGVJbnB1dDogdHJ1ZQogIH07CgogIENvZGVNaXJyb3Iua2V5TWFwWyJlbWFjcy1BbHQtRyJdID0gewogICAgIkciOiBmdW5jdGlvbihjbSkgewogICAgICB2YXIgcHJlZml4ID0gZ2V0UHJlZml4KGNtLCB0cnVlKTsKICAgICAgaWYgKHByZWZpeCAhPSBudWxsICYmIHByZWZpeCA+IDApIHJldHVybiBjbS5zZXRDdXJzb3IocHJlZml4IC0gMSk7CgogICAgICBnZXRJbnB1dChjbSwgIkdvdG8gbGluZSIsIGZ1bmN0aW9uKHN0cikgewogICAgICAgIHZhciBudW07CiAgICAgICAgaWYgKHN0ciAmJiAhaXNOYU4obnVtID0gTnVtYmVyKHN0cikpICYmIG51bSA9PSBudW18MCAmJiBudW0gPiAwKQogICAgICAgICAgY20uc2V0Q3Vyc29yKG51bSAtIDEpOwogICAgICB9KTsKICAgIH0sCiAgICBhdXRvOiAiZW1hY3MiLCBub2ZhbGx0aHJvdWdoOiB0cnVlLCBkaXNhYmxlSW5wdXQ6IHRydWUKICB9OwoKICBDb2RlTWlycm9yLmtleU1hcFsiZW1hY3MtQ3RybC1RIl0gPSB7CiAgICAiVGFiIjogcmVwZWF0ZWQoImluc2VydFRhYiIpLAogICAgYXV0bzogImVtYWNzIiwgbm9mYWxsdGhyb3VnaDogdHJ1ZQogIH07CgogIHZhciBwcmVmaXhNYXAgPSB7IkN0cmwtRyI6IGNsZWFyUHJlZml4fTsKICBmdW5jdGlvbiByZWdQcmVmaXgoZCkgewogICAgcHJlZml4TWFwW2RdID0gZnVuY3Rpb24oY20pIHsgYWRkUHJlZml4KGNtLCBkKTsgfTsKICAgIGtleU1hcFsiQ3RybC0iICsgZF0gPSBmdW5jdGlvbihjbSkgeyBhZGRQcmVmaXgoY20sIGQpOyB9OwogICAgcHJlZml4UHJlc2VydmluZ0tleXNbIkN0cmwtIiArIGRdID0gdHJ1ZTsKICB9CiAgZm9yICh2YXIgaSA9IDA7IGkgPCAxMDsgKytpKSByZWdQcmVmaXgoU3RyaW5nKGkpKTsKICByZWdQcmVmaXgoIi0iKTsKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/keymap/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCEtLSBEVU1NWSBIVE1MIEZJTEUgLS0+]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/keymap/sublime.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovLyBBIHJvdWdoIGFwcHJveGltYXRpb24gb2YgU3VibGltZSBUZXh0J3Mga2V5YmluZGluZ3MKLy8gRGVwZW5kcyBvbiBhZGRvbi9zZWFyY2gvc2VhcmNoY3Vyc29yLmpzIGFuZCBvcHRpb25hbGx5IGFkZG9uL2RpYWxvZy9kaWFsb2dzLmpzCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vbGliL2NvZGVtaXJyb3IiKSwgcmVxdWlyZSgiLi4vYWRkb24vc2VhcmNoL3NlYXJjaGN1cnNvciIpLCByZXF1aXJlKCIuLi9hZGRvbi9lZGl0L21hdGNoYnJhY2tldHMiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vbGliL2NvZGVtaXJyb3IiLCAiLi4vYWRkb24vc2VhcmNoL3NlYXJjaGN1cnNvciIsICIuLi9hZGRvbi9lZGl0L21hdGNoYnJhY2tldHMiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CgogIHZhciBtYXAgPSBDb2RlTWlycm9yLmtleU1hcC5zdWJsaW1lID0ge2ZhbGx0aHJvdWdoOiAiZGVmYXVsdCJ9OwogIHZhciBjbWRzID0gQ29kZU1pcnJvci5jb21tYW5kczsKICB2YXIgUG9zID0gQ29kZU1pcnJvci5Qb3M7CiAgdmFyIGN0cmwgPSBDb2RlTWlycm9yLmtleU1hcFsiZGVmYXVsdCJdID09IENvZGVNaXJyb3Iua2V5TWFwLnBjRGVmYXVsdCA/ICJDdHJsLSIgOiAiQ21kLSI7CgogIC8vIFRoaXMgaXMgbm90IGV4YWN0bHkgU3VibGltZSdzIGFsZ29yaXRobS4gSSBjb3VsZG4ndCBtYWtlIGhlYWRzIG9yIHRhaWxzIG9mIHRoYXQuCiAgZnVuY3Rpb24gZmluZFBvc1N1YndvcmQoZG9jLCBzdGFydCwgZGlyKSB7CiAgICBpZiAoZGlyIDwgMCAmJiBzdGFydC5jaCA9PSAwKSByZXR1cm4gZG9jLmNsaXBQb3MoUG9zKHN0YXJ0LmxpbmUgLSAxKSk7CiAgICB2YXIgbGluZSA9IGRvYy5nZXRMaW5lKHN0YXJ0LmxpbmUpOwogICAgaWYgKGRpciA+IDAgJiYgc3RhcnQuY2ggPj0gbGluZS5sZW5ndGgpIHJldHVybiBkb2MuY2xpcFBvcyhQb3Moc3RhcnQubGluZSArIDEsIDApKTsKICAgIHZhciBzdGF0ZSA9ICJzdGFydCIsIHR5cGU7CiAgICBmb3IgKHZhciBwb3MgPSBzdGFydC5jaCwgZSA9IGRpciA8IDAgPyAwIDogbGluZS5sZW5ndGgsIGkgPSAwOyBwb3MgIT0gZTsgcG9zICs9IGRpciwgaSsrKSB7CiAgICAgIHZhciBuZXh0ID0gbGluZS5jaGFyQXQoZGlyIDwgMCA/IHBvcyAtIDEgOiBwb3MpOwogICAgICB2YXIgY2F0ID0gbmV4dCAhPSAiXyIgJiYgQ29kZU1pcnJvci5pc1dvcmRDaGFyKG5leHQpID8gInciIDogIm8iOwogICAgICBpZiAoY2F0ID09ICJ3IiAmJiBuZXh0LnRvVXBwZXJDYXNlKCkgPT0gbmV4dCkgY2F0ID0gIlciOwogICAgICBpZiAoc3RhdGUgPT0gInN0YXJ0IikgewogICAgICAgIGlmIChjYXQgIT0gIm8iKSB7IHN0YXRlID0gImluIjsgdHlwZSA9IGNhdDsgfQogICAgICB9IGVsc2UgaWYgKHN0YXRlID09ICJpbiIpIHsKICAgICAgICBpZiAodHlwZSAhPSBjYXQpIHsKICAgICAgICAgIGlmICh0eXBlID09ICJ3IiAmJiBjYXQgPT0gIlciICYmIGRpciA8IDApIHBvcy0tOwogICAgICAgICAgaWYgKHR5cGUgPT0gIlciICYmIGNhdCA9PSAidyIgJiYgZGlyID4gMCkgeyB0eXBlID0gInciOyBjb250aW51ZTsgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gUG9zKHN0YXJ0LmxpbmUsIHBvcyk7CiAgfQoKICBmdW5jdGlvbiBtb3ZlU3Vid29yZChjbSwgZGlyKSB7CiAgICBjbS5leHRlbmRTZWxlY3Rpb25zQnkoZnVuY3Rpb24ocmFuZ2UpIHsKICAgICAgaWYgKGNtLmRpc3BsYXkuc2hpZnQgfHwgY20uZG9jLmV4dGVuZCB8fCByYW5nZS5lbXB0eSgpKQogICAgICAgIHJldHVybiBmaW5kUG9zU3Vid29yZChjbS5kb2MsIHJhbmdlLmhlYWQsIGRpcik7CiAgICAgIGVsc2UKICAgICAgICByZXR1cm4gZGlyIDwgMCA/IHJhbmdlLmZyb20oKSA6IHJhbmdlLnRvKCk7CiAgICB9KTsKICB9CgogIGNtZHNbbWFwWyJBbHQtTGVmdCJdID0gImdvU3Vid29yZExlZnQiXSA9IGZ1bmN0aW9uKGNtKSB7IG1vdmVTdWJ3b3JkKGNtLCAtMSk7IH07CiAgY21kc1ttYXBbIkFsdC1SaWdodCJdID0gImdvU3Vid29yZFJpZ2h0Il0gPSBmdW5jdGlvbihjbSkgeyBtb3ZlU3Vid29yZChjbSwgMSk7IH07CgogIGNtZHNbbWFwW2N0cmwgKyAiVXAiXSA9ICJzY3JvbGxMaW5lVXAiXSA9IGZ1bmN0aW9uKGNtKSB7CiAgICB2YXIgaW5mbyA9IGNtLmdldFNjcm9sbEluZm8oKTsKICAgIGlmICghY20uc29tZXRoaW5nU2VsZWN0ZWQoKSkgewogICAgICB2YXIgdmlzaWJsZUJvdHRvbUxpbmUgPSBjbS5saW5lQXRIZWlnaHQoaW5mby50b3AgKyBpbmZvLmNsaWVudEhlaWdodCwgImxvY2FsIik7CiAgICAgIGlmIChjbS5nZXRDdXJzb3IoKS5saW5lID49IHZpc2libGVCb3R0b21MaW5lKQogICAgICAgIGNtLmV4ZWNDb21tYW5kKCJnb0xpbmVVcCIpOwogICAgfQogICAgY20uc2Nyb2xsVG8obnVsbCwgaW5mby50b3AgLSBjbS5kZWZhdWx0VGV4dEhlaWdodCgpKTsKICB9OwogIGNtZHNbbWFwW2N0cmwgKyAiRG93biJdID0gInNjcm9sbExpbmVEb3duIl0gPSBmdW5jdGlvbihjbSkgewogICAgdmFyIGluZm8gPSBjbS5nZXRTY3JvbGxJbmZvKCk7CiAgICBpZiAoIWNtLnNvbWV0aGluZ1NlbGVjdGVkKCkpIHsKICAgICAgdmFyIHZpc2libGVUb3BMaW5lID0gY20ubGluZUF0SGVpZ2h0KGluZm8udG9wLCAibG9jYWwiKSsxOwogICAgICBpZiAoY20uZ2V0Q3Vyc29yKCkubGluZSA8PSB2aXNpYmxlVG9wTGluZSkKICAgICAgICBjbS5leGVjQ29tbWFuZCgiZ29MaW5lRG93biIpOwogICAgfQogICAgY20uc2Nyb2xsVG8obnVsbCwgaW5mby50b3AgKyBjbS5kZWZhdWx0VGV4dEhlaWdodCgpKTsKICB9OwoKICBjbWRzW21hcFsiU2hpZnQtIiArIGN0cmwgKyAiTCJdID0gInNwbGl0U2VsZWN0aW9uQnlMaW5lIl0gPSBmdW5jdGlvbihjbSkgewogICAgdmFyIHJhbmdlcyA9IGNtLmxpc3RTZWxlY3Rpb25zKCksIGxpbmVSYW5nZXMgPSBbXTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBmcm9tID0gcmFuZ2VzW2ldLmZyb20oKSwgdG8gPSByYW5nZXNbaV0udG8oKTsKICAgICAgZm9yICh2YXIgbGluZSA9IGZyb20ubGluZTsgbGluZSA8PSB0by5saW5lOyArK2xpbmUpCiAgICAgICAgaWYgKCEodG8ubGluZSA+IGZyb20ubGluZSAmJiBsaW5lID09IHRvLmxpbmUgJiYgdG8uY2ggPT0gMCkpCiAgICAgICAgICBsaW5lUmFuZ2VzLnB1c2goe2FuY2hvcjogbGluZSA9PSBmcm9tLmxpbmUgPyBmcm9tIDogUG9zKGxpbmUsIDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkOiBsaW5lID09IHRvLmxpbmUgPyB0byA6IFBvcyhsaW5lKX0pOwogICAgfQogICAgY20uc2V0U2VsZWN0aW9ucyhsaW5lUmFuZ2VzLCAwKTsKICB9OwoKICBtYXBbIlNoaWZ0LVRhYiJdID0gImluZGVudExlc3MiOwoKICBjbWRzW21hcFsiRXNjIl0gPSAic2luZ2xlU2VsZWN0aW9uVG9wIl0gPSBmdW5jdGlvbihjbSkgewogICAgdmFyIHJhbmdlID0gY20ubGlzdFNlbGVjdGlvbnMoKVswXTsKICAgIGNtLnNldFNlbGVjdGlvbihyYW5nZS5hbmNob3IsIHJhbmdlLmhlYWQsIHtzY3JvbGw6IGZhbHNlfSk7CiAgfTsKCiAgY21kc1ttYXBbY3RybCArICJMIl0gPSAic2VsZWN0TGluZSJdID0gZnVuY3Rpb24oY20pIHsKICAgIHZhciByYW5nZXMgPSBjbS5saXN0U2VsZWN0aW9ucygpLCBleHRlbmRlZCA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIHJhbmdlID0gcmFuZ2VzW2ldOwogICAgICBleHRlbmRlZC5wdXNoKHthbmNob3I6IFBvcyhyYW5nZS5mcm9tKCkubGluZSwgMCksCiAgICAgICAgICAgICAgICAgICAgIGhlYWQ6IFBvcyhyYW5nZS50bygpLmxpbmUgKyAxLCAwKX0pOwogICAgfQogICAgY20uc2V0U2VsZWN0aW9ucyhleHRlbmRlZCk7CiAgfTsKCiAgbWFwWyJTaGlmdC0iICsgY3RybCArICJLIl0gPSAiZGVsZXRlTGluZSI7CgogIGZ1bmN0aW9uIGluc2VydExpbmUoY20sIGFib3ZlKSB7CiAgICBjbS5vcGVyYXRpb24oZnVuY3Rpb24oKSB7CiAgICAgIHZhciBsZW4gPSBjbS5saXN0U2VsZWN0aW9ucygpLmxlbmd0aCwgbmV3U2VsZWN0aW9uID0gW10sIGxhc3QgPSAtMTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICAgIHZhciBoZWFkID0gY20ubGlzdFNlbGVjdGlvbnMoKVtpXS5oZWFkOwogICAgICAgIGlmIChoZWFkLmxpbmUgPD0gbGFzdCkgY29udGludWU7CiAgICAgICAgdmFyIGF0ID0gUG9zKGhlYWQubGluZSArIChhYm92ZSA/IDAgOiAxKSwgMCk7CiAgICAgICAgY20ucmVwbGFjZVJhbmdlKCJcbiIsIGF0LCBudWxsLCAiK2luc2VydExpbmUiKTsKICAgICAgICBjbS5pbmRlbnRMaW5lKGF0LmxpbmUsIG51bGwsIHRydWUpOwogICAgICAgIG5ld1NlbGVjdGlvbi5wdXNoKHtoZWFkOiBhdCwgYW5jaG9yOiBhdH0pOwogICAgICAgIGxhc3QgPSBoZWFkLmxpbmUgKyAxOwogICAgICB9CiAgICAgIGNtLnNldFNlbGVjdGlvbnMobmV3U2VsZWN0aW9uKTsKICAgIH0pOwogIH0KCiAgY21kc1ttYXBbY3RybCArICJFbnRlciJdID0gImluc2VydExpbmVBZnRlciJdID0gZnVuY3Rpb24oY20pIHsgaW5zZXJ0TGluZShjbSwgZmFsc2UpOyB9OwoKICBjbWRzW21hcFsiU2hpZnQtIiArIGN0cmwgKyAiRW50ZXIiXSA9ICJpbnNlcnRMaW5lQmVmb3JlIl0gPSBmdW5jdGlvbihjbSkgeyBpbnNlcnRMaW5lKGNtLCB0cnVlKTsgfTsKCiAgZnVuY3Rpb24gd29yZEF0KGNtLCBwb3MpIHsKICAgIHZhciBzdGFydCA9IHBvcy5jaCwgZW5kID0gc3RhcnQsIGxpbmUgPSBjbS5nZXRMaW5lKHBvcy5saW5lKTsKICAgIHdoaWxlIChzdGFydCAmJiBDb2RlTWlycm9yLmlzV29yZENoYXIobGluZS5jaGFyQXQoc3RhcnQgLSAxKSkpIC0tc3RhcnQ7CiAgICB3aGlsZSAoZW5kIDwgbGluZS5sZW5ndGggJiYgQ29kZU1pcnJvci5pc1dvcmRDaGFyKGxpbmUuY2hhckF0KGVuZCkpKSArK2VuZDsKICAgIHJldHVybiB7ZnJvbTogUG9zKHBvcy5saW5lLCBzdGFydCksIHRvOiBQb3MocG9zLmxpbmUsIGVuZCksIHdvcmQ6IGxpbmUuc2xpY2Uoc3RhcnQsIGVuZCl9OwogIH0KCiAgY21kc1ttYXBbY3RybCArICJEIl0gPSAic2VsZWN0TmV4dE9jY3VycmVuY2UiXSA9IGZ1bmN0aW9uKGNtKSB7CiAgICB2YXIgZnJvbSA9IGNtLmdldEN1cnNvcigiZnJvbSIpLCB0byA9IGNtLmdldEN1cnNvcigidG8iKTsKICAgIHZhciBmdWxsV29yZCA9IGNtLnN0YXRlLnN1YmxpbWVGaW5kRnVsbFdvcmQgPT0gY20uZG9jLnNlbDsKICAgIGlmIChDb2RlTWlycm9yLmNtcFBvcyhmcm9tLCB0bykgPT0gMCkgewogICAgICB2YXIgd29yZCA9IHdvcmRBdChjbSwgZnJvbSk7CiAgICAgIGlmICghd29yZC53b3JkKSByZXR1cm47CiAgICAgIGNtLnNldFNlbGVjdGlvbih3b3JkLmZyb20sIHdvcmQudG8pOwogICAgICBmdWxsV29yZCA9IHRydWU7CiAgICB9IGVsc2UgewogICAgICB2YXIgdGV4dCA9IGNtLmdldFJhbmdlKGZyb20sIHRvKTsKICAgICAgdmFyIHF1ZXJ5ID0gZnVsbFdvcmQgPyBuZXcgUmVnRXhwKCJcXGIiICsgdGV4dCArICJcXGIiKSA6IHRleHQ7CiAgICAgIHZhciBjdXIgPSBjbS5nZXRTZWFyY2hDdXJzb3IocXVlcnksIHRvKTsKICAgICAgaWYgKGN1ci5maW5kTmV4dCgpKSB7CiAgICAgICAgY20uYWRkU2VsZWN0aW9uKGN1ci5mcm9tKCksIGN1ci50bygpKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjdXIgPSBjbS5nZXRTZWFyY2hDdXJzb3IocXVlcnksIFBvcyhjbS5maXJzdExpbmUoKSwgMCkpOwogICAgICAgIGlmIChjdXIuZmluZE5leHQoKSkKICAgICAgICAgIGNtLmFkZFNlbGVjdGlvbihjdXIuZnJvbSgpLCBjdXIudG8oKSk7CiAgICAgIH0KICAgIH0KICAgIGlmIChmdWxsV29yZCkKICAgICAgY20uc3RhdGUuc3VibGltZUZpbmRGdWxsV29yZCA9IGNtLmRvYy5zZWw7CiAgfTsKCiAgdmFyIG1pcnJvciA9ICIoKXt9W10iOwogIGZ1bmN0aW9uIHNlbGVjdEJldHdlZW5CcmFja2V0cyhjbSkgewogICAgdmFyIHBvcyA9IGNtLmdldEN1cnNvcigpLCBvcGVuaW5nID0gY20uc2NhbkZvckJyYWNrZXQocG9zLCAtMSk7CiAgICBpZiAoIW9wZW5pbmcpIHJldHVybjsKICAgIGZvciAoOzspIHsKICAgICAgdmFyIGNsb3NpbmcgPSBjbS5zY2FuRm9yQnJhY2tldChwb3MsIDEpOwogICAgICBpZiAoIWNsb3NpbmcpIHJldHVybjsKICAgICAgaWYgKGNsb3NpbmcuY2ggPT0gbWlycm9yLmNoYXJBdChtaXJyb3IuaW5kZXhPZihvcGVuaW5nLmNoKSArIDEpKSB7CiAgICAgICAgY20uc2V0U2VsZWN0aW9uKFBvcyhvcGVuaW5nLnBvcy5saW5lLCBvcGVuaW5nLnBvcy5jaCArIDEpLCBjbG9zaW5nLnBvcywgZmFsc2UpOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIHBvcyA9IFBvcyhjbG9zaW5nLnBvcy5saW5lLCBjbG9zaW5nLnBvcy5jaCArIDEpOwogICAgfQogIH0KCiAgY21kc1ttYXBbIlNoaWZ0LSIgKyBjdHJsICsgIlNwYWNlIl0gPSAic2VsZWN0U2NvcGUiXSA9IGZ1bmN0aW9uKGNtKSB7CiAgICBzZWxlY3RCZXR3ZWVuQnJhY2tldHMoY20pIHx8IGNtLmV4ZWNDb21tYW5kKCJzZWxlY3RBbGwiKTsKICB9OwogIGNtZHNbbWFwWyJTaGlmdC0iICsgY3RybCArICJNIl0gPSAic2VsZWN0QmV0d2VlbkJyYWNrZXRzIl0gPSBmdW5jdGlvbihjbSkgewogICAgaWYgKCFzZWxlY3RCZXR3ZWVuQnJhY2tldHMoY20pKSByZXR1cm4gQ29kZU1pcnJvci5QYXNzOwogIH07CgogIGNtZHNbbWFwW2N0cmwgKyAiTSJdID0gImdvVG9CcmFja2V0Il0gPSBmdW5jdGlvbihjbSkgewogICAgY20uZXh0ZW5kU2VsZWN0aW9uc0J5KGZ1bmN0aW9uKHJhbmdlKSB7CiAgICAgIHZhciBuZXh0ID0gY20uc2NhbkZvckJyYWNrZXQocmFuZ2UuaGVhZCwgMSk7CiAgICAgIGlmIChuZXh0ICYmIENvZGVNaXJyb3IuY21wUG9zKG5leHQucG9zLCByYW5nZS5oZWFkKSAhPSAwKSByZXR1cm4gbmV4dC5wb3M7CiAgICAgIHZhciBwcmV2ID0gY20uc2NhbkZvckJyYWNrZXQocmFuZ2UuaGVhZCwgLTEpOwogICAgICByZXR1cm4gcHJldiAmJiBQb3MocHJldi5wb3MubGluZSwgcHJldi5wb3MuY2ggKyAxKSB8fCByYW5nZS5oZWFkOwogICAgfSk7CiAgfTsKCiAgY21kc1ttYXBbIlNoaWZ0LSIgKyBjdHJsICsgIlVwIl0gPSAic3dhcExpbmVVcCJdID0gZnVuY3Rpb24oY20pIHsKICAgIHZhciByYW5nZXMgPSBjbS5saXN0U2VsZWN0aW9ucygpLCBsaW5lc1RvTW92ZSA9IFtdLCBhdCA9IGNtLmZpcnN0TGluZSgpIC0gMSwgbmV3U2VscyA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIHJhbmdlID0gcmFuZ2VzW2ldLCBmcm9tID0gcmFuZ2UuZnJvbSgpLmxpbmUgLSAxLCB0byA9IHJhbmdlLnRvKCkubGluZTsKICAgICAgbmV3U2Vscy5wdXNoKHthbmNob3I6IFBvcyhyYW5nZS5hbmNob3IubGluZSAtIDEsIHJhbmdlLmFuY2hvci5jaCksCiAgICAgICAgICAgICAgICAgICAgaGVhZDogUG9zKHJhbmdlLmhlYWQubGluZSAtIDEsIHJhbmdlLmhlYWQuY2gpfSk7CiAgICAgIGlmIChyYW5nZS50bygpLmNoID09IDAgJiYgIXJhbmdlLmVtcHR5KCkpIC0tdG87CiAgICAgIGlmIChmcm9tID4gYXQpIGxpbmVzVG9Nb3ZlLnB1c2goZnJvbSwgdG8pOwogICAgICBlbHNlIGlmIChsaW5lc1RvTW92ZS5sZW5ndGgpIGxpbmVzVG9Nb3ZlW2xpbmVzVG9Nb3ZlLmxlbmd0aCAtIDFdID0gdG87CiAgICAgIGF0ID0gdG87CiAgICB9CiAgICBjbS5vcGVyYXRpb24oZnVuY3Rpb24oKSB7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZXNUb01vdmUubGVuZ3RoOyBpICs9IDIpIHsKICAgICAgICB2YXIgZnJvbSA9IGxpbmVzVG9Nb3ZlW2ldLCB0byA9IGxpbmVzVG9Nb3ZlW2kgKyAxXTsKICAgICAgICB2YXIgbGluZSA9IGNtLmdldExpbmUoZnJvbSk7CiAgICAgICAgY20ucmVwbGFjZVJhbmdlKCIiLCBQb3MoZnJvbSwgMCksIFBvcyhmcm9tICsgMSwgMCksICIrc3dhcExpbmUiKTsKICAgICAgICBpZiAodG8gPiBjbS5sYXN0TGluZSgpKQogICAgICAgICAgY20ucmVwbGFjZVJhbmdlKCJcbiIgKyBsaW5lLCBQb3MoY20ubGFzdExpbmUoKSksIG51bGwsICIrc3dhcExpbmUiKTsKICAgICAgICBlbHNlCiAgICAgICAgICBjbS5yZXBsYWNlUmFuZ2UobGluZSArICJcbiIsIFBvcyh0bywgMCksIG51bGwsICIrc3dhcExpbmUiKTsKICAgICAgfQogICAgICBjbS5zZXRTZWxlY3Rpb25zKG5ld1NlbHMpOwogICAgICBjbS5zY3JvbGxJbnRvVmlldygpOwogICAgfSk7CiAgfTsKCiAgY21kc1ttYXBbIlNoaWZ0LSIgKyBjdHJsICsgIkRvd24iXSA9ICJzd2FwTGluZURvd24iXSA9IGZ1bmN0aW9uKGNtKSB7CiAgICB2YXIgcmFuZ2VzID0gY20ubGlzdFNlbGVjdGlvbnMoKSwgbGluZXNUb01vdmUgPSBbXSwgYXQgPSBjbS5sYXN0TGluZSgpICsgMTsKICAgIGZvciAodmFyIGkgPSByYW5nZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgdmFyIHJhbmdlID0gcmFuZ2VzW2ldLCBmcm9tID0gcmFuZ2UudG8oKS5saW5lICsgMSwgdG8gPSByYW5nZS5mcm9tKCkubGluZTsKICAgICAgaWYgKHJhbmdlLnRvKCkuY2ggPT0gMCAmJiAhcmFuZ2UuZW1wdHkoKSkgZnJvbS0tOwogICAgICBpZiAoZnJvbSA8IGF0KSBsaW5lc1RvTW92ZS5wdXNoKGZyb20sIHRvKTsKICAgICAgZWxzZSBpZiAobGluZXNUb01vdmUubGVuZ3RoKSBsaW5lc1RvTW92ZVtsaW5lc1RvTW92ZS5sZW5ndGggLSAxXSA9IHRvOwogICAgICBhdCA9IHRvOwogICAgfQogICAgY20ub3BlcmF0aW9uKGZ1bmN0aW9uKCkgewogICAgICBmb3IgKHZhciBpID0gbGluZXNUb01vdmUubGVuZ3RoIC0gMjsgaSA+PSAwOyBpIC09IDIpIHsKICAgICAgICB2YXIgZnJvbSA9IGxpbmVzVG9Nb3ZlW2ldLCB0byA9IGxpbmVzVG9Nb3ZlW2kgKyAxXTsKICAgICAgICB2YXIgbGluZSA9IGNtLmdldExpbmUoZnJvbSk7CiAgICAgICAgaWYgKGZyb20gPT0gY20ubGFzdExpbmUoKSkKICAgICAgICAgIGNtLnJlcGxhY2VSYW5nZSgiIiwgUG9zKGZyb20gLSAxKSwgUG9zKGZyb20pLCAiK3N3YXBMaW5lIik7CiAgICAgICAgZWxzZQogICAgICAgICAgY20ucmVwbGFjZVJhbmdlKCIiLCBQb3MoZnJvbSwgMCksIFBvcyhmcm9tICsgMSwgMCksICIrc3dhcExpbmUiKTsKICAgICAgICBjbS5yZXBsYWNlUmFuZ2UobGluZSArICJcbiIsIFBvcyh0bywgMCksIG51bGwsICIrc3dhcExpbmUiKTsKICAgICAgfQogICAgICBjbS5zY3JvbGxJbnRvVmlldygpOwogICAgfSk7CiAgfTsKCiAgbWFwW2N0cmwgKyAiLyJdID0gInRvZ2dsZUNvbW1lbnQiOwoKICBjbWRzW21hcFtjdHJsICsgIkoiXSA9ICJqb2luTGluZXMiXSA9IGZ1bmN0aW9uKGNtKSB7CiAgICB2YXIgcmFuZ2VzID0gY20ubGlzdFNlbGVjdGlvbnMoKSwgam9pbmVkID0gW107CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJhbmdlcy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgcmFuZ2UgPSByYW5nZXNbaV0sIGZyb20gPSByYW5nZS5mcm9tKCk7CiAgICAgIHZhciBzdGFydCA9IGZyb20ubGluZSwgZW5kID0gcmFuZ2UudG8oKS5saW5lOwogICAgICB3aGlsZSAoaSA8IHJhbmdlcy5sZW5ndGggLSAxICYmIHJhbmdlc1tpICsgMV0uZnJvbSgpLmxpbmUgPT0gZW5kKQogICAgICAgIGVuZCA9IHJhbmdlc1srK2ldLnRvKCkubGluZTsKICAgICAgam9pbmVkLnB1c2goe3N0YXJ0OiBzdGFydCwgZW5kOiBlbmQsIGFuY2hvcjogIXJhbmdlLmVtcHR5KCkgJiYgZnJvbX0pOwogICAgfQogICAgY20ub3BlcmF0aW9uKGZ1bmN0aW9uKCkgewogICAgICB2YXIgb2Zmc2V0ID0gMCwgcmFuZ2VzID0gW107CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgam9pbmVkLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIG9iaiA9IGpvaW5lZFtpXTsKICAgICAgICB2YXIgYW5jaG9yID0gb2JqLmFuY2hvciAmJiBQb3Mob2JqLmFuY2hvci5saW5lIC0gb2Zmc2V0LCBvYmouYW5jaG9yLmNoKSwgaGVhZDsKICAgICAgICBmb3IgKHZhciBsaW5lID0gb2JqLnN0YXJ0OyBsaW5lIDw9IG9iai5lbmQ7IGxpbmUrKykgewogICAgICAgICAgdmFyIGFjdHVhbCA9IGxpbmUgLSBvZmZzZXQ7CiAgICAgICAgICBpZiAobGluZSA9PSBvYmouZW5kKSBoZWFkID0gUG9zKGFjdHVhbCwgY20uZ2V0TGluZShhY3R1YWwpLmxlbmd0aCArIDEpOwogICAgICAgICAgaWYgKGFjdHVhbCA8IGNtLmxhc3RMaW5lKCkpIHsKICAgICAgICAgICAgY20ucmVwbGFjZVJhbmdlKCIgIiwgUG9zKGFjdHVhbCksIFBvcyhhY3R1YWwgKyAxLCAvXlxzKi8uZXhlYyhjbS5nZXRMaW5lKGFjdHVhbCArIDEpKVswXS5sZW5ndGgpKTsKICAgICAgICAgICAgKytvZmZzZXQ7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJhbmdlcy5wdXNoKHthbmNob3I6IGFuY2hvciB8fCBoZWFkLCBoZWFkOiBoZWFkfSk7CiAgICAgIH0KICAgICAgY20uc2V0U2VsZWN0aW9ucyhyYW5nZXMsIDApOwogICAgfSk7CiAgfTsKCiAgY21kc1ttYXBbIlNoaWZ0LSIgKyBjdHJsICsgIkQiXSA9ICJkdXBsaWNhdGVMaW5lIl0gPSBmdW5jdGlvbihjbSkgewogICAgY20ub3BlcmF0aW9uKGZ1bmN0aW9uKCkgewogICAgICB2YXIgcmFuZ2VDb3VudCA9IGNtLmxpc3RTZWxlY3Rpb25zKCkubGVuZ3RoOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJhbmdlQ291bnQ7IGkrKykgewogICAgICAgIHZhciByYW5nZSA9IGNtLmxpc3RTZWxlY3Rpb25zKClbaV07CiAgICAgICAgaWYgKHJhbmdlLmVtcHR5KCkpCiAgICAgICAgICBjbS5yZXBsYWNlUmFuZ2UoY20uZ2V0TGluZShyYW5nZS5oZWFkLmxpbmUpICsgIlxuIiwgUG9zKHJhbmdlLmhlYWQubGluZSwgMCkpOwogICAgICAgIGVsc2UKICAgICAgICAgIGNtLnJlcGxhY2VSYW5nZShjbS5nZXRSYW5nZShyYW5nZS5mcm9tKCksIHJhbmdlLnRvKCkpLCByYW5nZS5mcm9tKCkpOwogICAgICB9CiAgICAgIGNtLnNjcm9sbEludG9WaWV3KCk7CiAgICB9KTsKICB9OwoKICBtYXBbY3RybCArICJUIl0gPSAidHJhbnNwb3NlQ2hhcnMiOwoKICBmdW5jdGlvbiBzb3J0TGluZXMoY20sIGNhc2VTZW5zaXRpdmUpIHsKICAgIHZhciByYW5nZXMgPSBjbS5saXN0U2VsZWN0aW9ucygpLCB0b1NvcnQgPSBbXSwgc2VsZWN0ZWQ7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJhbmdlcy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgcmFuZ2UgPSByYW5nZXNbaV07CiAgICAgIGlmIChyYW5nZS5lbXB0eSgpKSBjb250aW51ZTsKICAgICAgdmFyIGZyb20gPSByYW5nZS5mcm9tKCkubGluZSwgdG8gPSByYW5nZS50bygpLmxpbmU7CiAgICAgIHdoaWxlIChpIDwgcmFuZ2VzLmxlbmd0aCAtIDEgJiYgcmFuZ2VzW2kgKyAxXS5mcm9tKCkubGluZSA9PSB0bykKICAgICAgICB0byA9IHJhbmdlWysraV0udG8oKS5saW5lOwogICAgICB0b1NvcnQucHVzaChmcm9tLCB0byk7CiAgICB9CiAgICBpZiAodG9Tb3J0Lmxlbmd0aCkgc2VsZWN0ZWQgPSB0cnVlOwogICAgZWxzZSB0b1NvcnQucHVzaChjbS5maXJzdExpbmUoKSwgY20ubGFzdExpbmUoKSk7CgogICAgY20ub3BlcmF0aW9uKGZ1bmN0aW9uKCkgewogICAgICB2YXIgcmFuZ2VzID0gW107CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdG9Tb3J0Lmxlbmd0aDsgaSArPSAyKSB7CiAgICAgICAgdmFyIGZyb20gPSB0b1NvcnRbaV0sIHRvID0gdG9Tb3J0W2kgKyAxXTsKICAgICAgICB2YXIgc3RhcnQgPSBQb3MoZnJvbSwgMCksIGVuZCA9IFBvcyh0byk7CiAgICAgICAgdmFyIGxpbmVzID0gY20uZ2V0UmFuZ2Uoc3RhcnQsIGVuZCwgZmFsc2UpOwogICAgICAgIGlmIChjYXNlU2Vuc2l0aXZlKQogICAgICAgICAgbGluZXMuc29ydCgpOwogICAgICAgIGVsc2UKICAgICAgICAgIGxpbmVzLnNvcnQoZnVuY3Rpb24oYSwgYikgewogICAgICAgICAgICB2YXIgYXUgPSBhLnRvVXBwZXJDYXNlKCksIGJ1ID0gYi50b1VwcGVyQ2FzZSgpOwogICAgICAgICAgICBpZiAoYXUgIT0gYnUpIHsgYSA9IGF1OyBiID0gYnU7IH0KICAgICAgICAgICAgcmV0dXJuIGEgPCBiID8gLTEgOiBhID09IGIgPyAwIDogMTsKICAgICAgICAgIH0pOwogICAgICAgIGNtLnJlcGxhY2VSYW5nZShsaW5lcywgc3RhcnQsIGVuZCk7CiAgICAgICAgaWYgKHNlbGVjdGVkKSByYW5nZXMucHVzaCh7YW5jaG9yOiBzdGFydCwgaGVhZDogZW5kfSk7CiAgICAgIH0KICAgICAgaWYgKHNlbGVjdGVkKSBjbS5zZXRTZWxlY3Rpb25zKHJhbmdlcywgMCk7CiAgICB9KTsKICB9CgogIGNtZHNbbWFwWyJGOSJdID0gInNvcnRMaW5lcyJdID0gZnVuY3Rpb24oY20pIHsgc29ydExpbmVzKGNtLCB0cnVlKTsgfTsKICBjbWRzW21hcFtjdHJsICsgIkY5Il0gPSAic29ydExpbmVzSW5zZW5zaXRpdmUiXSA9IGZ1bmN0aW9uKGNtKSB7IHNvcnRMaW5lcyhjbSwgZmFsc2UpOyB9OwoKICBjbWRzW21hcFsiRjIiXSA9ICJuZXh0Qm9va21hcmsiXSA9IGZ1bmN0aW9uKGNtKSB7CiAgICB2YXIgbWFya3MgPSBjbS5zdGF0ZS5zdWJsaW1lQm9va21hcmtzOwogICAgaWYgKG1hcmtzKSB3aGlsZSAobWFya3MubGVuZ3RoKSB7CiAgICAgIHZhciBjdXJyZW50ID0gbWFya3Muc2hpZnQoKTsKICAgICAgdmFyIGZvdW5kID0gY3VycmVudC5maW5kKCk7CiAgICAgIGlmIChmb3VuZCkgewogICAgICAgIG1hcmtzLnB1c2goY3VycmVudCk7CiAgICAgICAgcmV0dXJuIGNtLnNldFNlbGVjdGlvbihmb3VuZC5mcm9tLCBmb3VuZC50byk7CiAgICAgIH0KICAgIH0KICB9OwoKICBjbWRzW21hcFsiU2hpZnQtRjIiXSA9ICJwcmV2Qm9va21hcmsiXSA9IGZ1bmN0aW9uKGNtKSB7CiAgICB2YXIgbWFya3MgPSBjbS5zdGF0ZS5zdWJsaW1lQm9va21hcmtzOwogICAgaWYgKG1hcmtzKSB3aGlsZSAobWFya3MubGVuZ3RoKSB7CiAgICAgIG1hcmtzLnVuc2hpZnQobWFya3MucG9wKCkpOwogICAgICB2YXIgZm91bmQgPSBtYXJrc1ttYXJrcy5sZW5ndGggLSAxXS5maW5kKCk7CiAgICAgIGlmICghZm91bmQpCiAgICAgICAgbWFya3MucG9wKCk7CiAgICAgIGVsc2UKICAgICAgICByZXR1cm4gY20uc2V0U2VsZWN0aW9uKGZvdW5kLmZyb20sIGZvdW5kLnRvKTsKICAgIH0KICB9OwoKICBjbWRzW21hcFtjdHJsICsgIkYyIl0gPSAidG9nZ2xlQm9va21hcmsiXSA9IGZ1bmN0aW9uKGNtKSB7CiAgICB2YXIgcmFuZ2VzID0gY20ubGlzdFNlbGVjdGlvbnMoKTsKICAgIHZhciBtYXJrcyA9IGNtLnN0YXRlLnN1YmxpbWVCb29rbWFya3MgfHwgKGNtLnN0YXRlLnN1YmxpbWVCb29rbWFya3MgPSBbXSk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJhbmdlcy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgZnJvbSA9IHJhbmdlc1tpXS5mcm9tKCksIHRvID0gcmFuZ2VzW2ldLnRvKCk7CiAgICAgIHZhciBmb3VuZCA9IGNtLmZpbmRNYXJrcyhmcm9tLCB0byk7CiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZm91bmQubGVuZ3RoOyBqKyspIHsKICAgICAgICBpZiAoZm91bmRbal0uc3VibGltZUJvb2ttYXJrKSB7CiAgICAgICAgICBmb3VuZFtqXS5jbGVhcigpOwogICAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBtYXJrcy5sZW5ndGg7IGsrKykKICAgICAgICAgICAgaWYgKG1hcmtzW2tdID09IGZvdW5kW2pdKQogICAgICAgICAgICAgIG1hcmtzLnNwbGljZShrLS0sIDEpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChqID09IGZvdW5kLmxlbmd0aCkKICAgICAgICBtYXJrcy5wdXNoKGNtLm1hcmtUZXh0KGZyb20sIHRvLCB7c3VibGltZUJvb2ttYXJrOiB0cnVlLCBjbGVhcldoZW5FbXB0eTogZmFsc2V9KSk7CiAgICB9CiAgfTsKCiAgY21kc1ttYXBbIlNoaWZ0LSIgKyBjdHJsICsgIkYyIl0gPSAiY2xlYXJCb29rbWFya3MiXSA9IGZ1bmN0aW9uKGNtKSB7CiAgICB2YXIgbWFya3MgPSBjbS5zdGF0ZS5zdWJsaW1lQm9va21hcmtzOwogICAgaWYgKG1hcmtzKSBmb3IgKHZhciBpID0gMDsgaSA8IG1hcmtzLmxlbmd0aDsgaSsrKSBtYXJrc1tpXS5jbGVhcigpOwogICAgbWFya3MubGVuZ3RoID0gMDsKICB9OwoKICBjbWRzW21hcFsiQWx0LUYyIl0gPSAic2VsZWN0Qm9va21hcmtzIl0gPSBmdW5jdGlvbihjbSkgewogICAgdmFyIG1hcmtzID0gY20uc3RhdGUuc3VibGltZUJvb2ttYXJrcywgcmFuZ2VzID0gW107CiAgICBpZiAobWFya3MpIGZvciAodmFyIGkgPSAwOyBpIDwgbWFya3MubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGZvdW5kID0gbWFya3NbaV0uZmluZCgpOwogICAgICBpZiAoIWZvdW5kKQogICAgICAgIG1hcmtzLnNwbGljZShpLS0sIDApOwogICAgICBlbHNlCiAgICAgICAgcmFuZ2VzLnB1c2goe2FuY2hvcjogZm91bmQuZnJvbSwgaGVhZDogZm91bmQudG99KTsKICAgIH0KICAgIGlmIChyYW5nZXMubGVuZ3RoKQogICAgICBjbS5zZXRTZWxlY3Rpb25zKHJhbmdlcywgMCk7CiAgfTsKCiAgbWFwWyJBbHQtUSJdID0gIndyYXBMaW5lcyI7CgogIHZhciBtYXBLID0gQ29kZU1pcnJvci5rZXlNYXBbInN1YmxpbWUtQ3RybC1LIl0gPSB7YXV0bzogInN1YmxpbWUiLCBub2ZhbGx0aHJvdWdoOiB0cnVlfTsKCiAgbWFwW2N0cmwgKyAiSyJdID0gZnVuY3Rpb24oY20pIHtjbS5zZXRPcHRpb24oImtleU1hcCIsICJzdWJsaW1lLUN0cmwtSyIpO307CgogIGZ1bmN0aW9uIG1vZGlmeVdvcmRPclNlbGVjdGlvbihjbSwgbW9kKSB7CiAgICBjbS5vcGVyYXRpb24oZnVuY3Rpb24oKSB7CiAgICAgIHZhciByYW5nZXMgPSBjbS5saXN0U2VsZWN0aW9ucygpLCBpbmRpY2VzID0gW10sIHJlcGxhY2VtZW50cyA9IFtdOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJhbmdlcy5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciByYW5nZSA9IHJhbmdlc1tpXTsKICAgICAgICBpZiAocmFuZ2UuZW1wdHkoKSkgeyBpbmRpY2VzLnB1c2goaSk7IHJlcGxhY2VtZW50cy5wdXNoKCIiKTsgfQogICAgICAgIGVsc2UgcmVwbGFjZW1lbnRzLnB1c2gobW9kKGNtLmdldFJhbmdlKHJhbmdlLmZyb20oKSwgcmFuZ2UudG8oKSkpKTsKICAgICAgfQogICAgICBjbS5yZXBsYWNlU2VsZWN0aW9ucyhyZXBsYWNlbWVudHMsICJhcm91bmQiLCAiY2FzZSIpOwogICAgICBmb3IgKHZhciBpID0gaW5kaWNlcy5sZW5ndGggLSAxLCBhdDsgaSA+PSAwOyBpLS0pIHsKICAgICAgICB2YXIgcmFuZ2UgPSByYW5nZXNbaW5kaWNlc1tpXV07CiAgICAgICAgaWYgKGF0ICYmIENvZGVNaXJyb3IuY21wUG9zKHJhbmdlLmhlYWQsIGF0KSA+IDApIGNvbnRpbnVlOwogICAgICAgIHZhciB3b3JkID0gd29yZEF0KGNtLCByYW5nZS5oZWFkKTsKICAgICAgICBhdCA9IHdvcmQuZnJvbTsKICAgICAgICBjbS5yZXBsYWNlUmFuZ2UobW9kKHdvcmQud29yZCksIHdvcmQuZnJvbSwgd29yZC50byk7CiAgICAgIH0KICAgIH0pOwogIH0KCiAgbWFwS1tjdHJsICsgIkJhY2tzcGFjZSJdID0gImRlbExpbmVMZWZ0IjsKCiAgY21kc1ttYXBLW2N0cmwgKyAiSyJdID0gImRlbExpbmVSaWdodCJdID0gZnVuY3Rpb24oY20pIHsKICAgIGNtLm9wZXJhdGlvbihmdW5jdGlvbigpIHsKICAgICAgdmFyIHJhbmdlcyA9IGNtLmxpc3RTZWxlY3Rpb25zKCk7CiAgICAgIGZvciAodmFyIGkgPSByYW5nZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pCiAgICAgICAgY20ucmVwbGFjZVJhbmdlKCIiLCByYW5nZXNbaV0uYW5jaG9yLCBQb3MocmFuZ2VzW2ldLnRvKCkubGluZSksICIrZGVsZXRlIik7CiAgICAgIGNtLnNjcm9sbEludG9WaWV3KCk7CiAgICB9KTsKICB9OwoKICBjbWRzW21hcEtbY3RybCArICJVIl0gPSAidXBjYXNlQXRDdXJzb3IiXSA9IGZ1bmN0aW9uKGNtKSB7CiAgICBtb2RpZnlXb3JkT3JTZWxlY3Rpb24oY20sIGZ1bmN0aW9uKHN0cikgeyByZXR1cm4gc3RyLnRvVXBwZXJDYXNlKCk7IH0pOwogIH07CiAgY21kc1ttYXBLW2N0cmwgKyAiTCJdID0gImRvd25jYXNlQXRDdXJzb3IiXSA9IGZ1bmN0aW9uKGNtKSB7CiAgICBtb2RpZnlXb3JkT3JTZWxlY3Rpb24oY20sIGZ1bmN0aW9uKHN0cikgeyByZXR1cm4gc3RyLnRvTG93ZXJDYXNlKCk7IH0pOwogIH07CgogIGNtZHNbbWFwS1tjdHJsICsgIlNwYWNlIl0gPSAic2V0U3VibGltZU1hcmsiXSA9IGZ1bmN0aW9uKGNtKSB7CiAgICBpZiAoY20uc3RhdGUuc3VibGltZU1hcmspIGNtLnN0YXRlLnN1YmxpbWVNYXJrLmNsZWFyKCk7CiAgICBjbS5zdGF0ZS5zdWJsaW1lTWFyayA9IGNtLnNldEJvb2ttYXJrKGNtLmdldEN1cnNvcigpKTsKICB9OwogIGNtZHNbbWFwS1tjdHJsICsgIkEiXSA9ICJzZWxlY3RUb1N1YmxpbWVNYXJrIl0gPSBmdW5jdGlvbihjbSkgewogICAgdmFyIGZvdW5kID0gY20uc3RhdGUuc3VibGltZU1hcmsgJiYgY20uc3RhdGUuc3VibGltZU1hcmsuZmluZCgpOwogICAgaWYgKGZvdW5kKSBjbS5zZXRTZWxlY3Rpb24oY20uZ2V0Q3Vyc29yKCksIGZvdW5kKTsKICB9OwogIGNtZHNbbWFwS1tjdHJsICsgIlciXSA9ICJkZWxldGVUb1N1YmxpbWVNYXJrIl0gPSBmdW5jdGlvbihjbSkgewogICAgdmFyIGZvdW5kID0gY20uc3RhdGUuc3VibGltZU1hcmsgJiYgY20uc3RhdGUuc3VibGltZU1hcmsuZmluZCgpOwogICAgaWYgKGZvdW5kKSB7CiAgICAgIHZhciBmcm9tID0gY20uZ2V0Q3Vyc29yKCksIHRvID0gZm91bmQ7CiAgICAgIGlmIChDb2RlTWlycm9yLmNtcFBvcyhmcm9tLCB0bykgPiAwKSB7IHZhciB0bXAgPSB0bzsgdG8gPSBmcm9tOyBmcm9tID0gdG1wOyB9CiAgICAgIGNtLnN0YXRlLnN1YmxpbWVLaWxsZWQgPSBjbS5nZXRSYW5nZShmcm9tLCB0byk7CiAgICAgIGNtLnJlcGxhY2VSYW5nZSgiIiwgZnJvbSwgdG8pOwogICAgfQogIH07CiAgY21kc1ttYXBLW2N0cmwgKyAiWCJdID0gInN3YXBXaXRoU3VibGltZU1hcmsiXSA9IGZ1bmN0aW9uKGNtKSB7CiAgICB2YXIgZm91bmQgPSBjbS5zdGF0ZS5zdWJsaW1lTWFyayAmJiBjbS5zdGF0ZS5zdWJsaW1lTWFyay5maW5kKCk7CiAgICBpZiAoZm91bmQpIHsKICAgICAgY20uc3RhdGUuc3VibGltZU1hcmsuY2xlYXIoKTsKICAgICAgY20uc3RhdGUuc3VibGltZU1hcmsgPSBjbS5zZXRCb29rbWFyayhjbS5nZXRDdXJzb3IoKSk7CiAgICAgIGNtLnNldEN1cnNvcihmb3VuZCk7CiAgICB9CiAgfTsKICBjbWRzW21hcEtbY3RybCArICJZIl0gPSAic3VibGltZVlhbmsiXSA9IGZ1bmN0aW9uKGNtKSB7CiAgICBpZiAoY20uc3RhdGUuc3VibGltZUtpbGxlZCAhPSBudWxsKQogICAgICBjbS5yZXBsYWNlU2VsZWN0aW9uKGNtLnN0YXRlLnN1YmxpbWVLaWxsZWQsIG51bGwsICJwYXN0ZSIpOwogIH07CgogIG1hcEtbY3RybCArICJHIl0gPSAiY2xlYXJCb29rbWFya3MiOwogIGNtZHNbbWFwS1tjdHJsICsgIkMiXSA9ICJzaG93SW5DZW50ZXIiXSA9IGZ1bmN0aW9uKGNtKSB7CiAgICB2YXIgcG9zID0gY20uY3Vyc29yQ29vcmRzKG51bGwsICJsb2NhbCIpOwogICAgY20uc2Nyb2xsVG8obnVsbCwgKHBvcy50b3AgKyBwb3MuYm90dG9tKSAvIDIgLSBjbS5nZXRTY3JvbGxJbmZvKCkuY2xpZW50SGVpZ2h0IC8gMik7CiAgfTsKCiAgY21kc1ttYXBbIlNoaWZ0LUFsdC1VcCJdID0gInNlbGVjdExpbmVzVXB3YXJkIl0gPSBmdW5jdGlvbihjbSkgewogICAgY20ub3BlcmF0aW9uKGZ1bmN0aW9uKCkgewogICAgICB2YXIgcmFuZ2VzID0gY20ubGlzdFNlbGVjdGlvbnMoKTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICB2YXIgcmFuZ2UgPSByYW5nZXNbaV07CiAgICAgICAgaWYgKHJhbmdlLmhlYWQubGluZSA+IGNtLmZpcnN0TGluZSgpKQogICAgICAgICAgY20uYWRkU2VsZWN0aW9uKFBvcyhyYW5nZS5oZWFkLmxpbmUgLSAxLCByYW5nZS5oZWFkLmNoKSk7CiAgICAgIH0KICAgIH0pOwogIH07CiAgY21kc1ttYXBbIlNoaWZ0LUFsdC1Eb3duIl0gPSAic2VsZWN0TGluZXNEb3dud2FyZCJdID0gZnVuY3Rpb24oY20pIHsKICAgIGNtLm9wZXJhdGlvbihmdW5jdGlvbigpIHsKICAgICAgdmFyIHJhbmdlcyA9IGNtLmxpc3RTZWxlY3Rpb25zKCk7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIHJhbmdlID0gcmFuZ2VzW2ldOwogICAgICAgIGlmIChyYW5nZS5oZWFkLmxpbmUgPCBjbS5sYXN0TGluZSgpKQogICAgICAgICAgY20uYWRkU2VsZWN0aW9uKFBvcyhyYW5nZS5oZWFkLmxpbmUgKyAxLCByYW5nZS5oZWFkLmNoKSk7CiAgICAgIH0KICAgIH0pOwogIH07CgogIGZ1bmN0aW9uIGdldFRhcmdldChjbSkgewogICAgdmFyIGZyb20gPSBjbS5nZXRDdXJzb3IoImZyb20iKSwgdG8gPSBjbS5nZXRDdXJzb3IoInRvIik7CiAgICBpZiAoQ29kZU1pcnJvci5jbXBQb3MoZnJvbSwgdG8pID09IDApIHsKICAgICAgdmFyIHdvcmQgPSB3b3JkQXQoY20sIGZyb20pOwogICAgICBpZiAoIXdvcmQud29yZCkgcmV0dXJuOwogICAgICBmcm9tID0gd29yZC5mcm9tOwogICAgICB0byA9IHdvcmQudG87CiAgICB9CiAgICByZXR1cm4ge2Zyb206IGZyb20sIHRvOiB0bywgcXVlcnk6IGNtLmdldFJhbmdlKGZyb20sIHRvKSwgd29yZDogd29yZH07CiAgfQoKICBmdW5jdGlvbiBmaW5kQW5kR29UbyhjbSwgZm9yd2FyZCkgewogICAgdmFyIHRhcmdldCA9IGdldFRhcmdldChjbSk7CiAgICBpZiAoIXRhcmdldCkgcmV0dXJuOwogICAgdmFyIHF1ZXJ5ID0gdGFyZ2V0LnF1ZXJ5OwogICAgdmFyIGN1ciA9IGNtLmdldFNlYXJjaEN1cnNvcihxdWVyeSwgZm9yd2FyZCA/IHRhcmdldC50byA6IHRhcmdldC5mcm9tKTsKCiAgICBpZiAoZm9yd2FyZCA/IGN1ci5maW5kTmV4dCgpIDogY3VyLmZpbmRQcmV2aW91cygpKSB7CiAgICAgIGNtLnNldFNlbGVjdGlvbihjdXIuZnJvbSgpLCBjdXIudG8oKSk7CiAgICB9IGVsc2UgewogICAgICBjdXIgPSBjbS5nZXRTZWFyY2hDdXJzb3IocXVlcnksIGZvcndhcmQgPyBQb3MoY20uZmlyc3RMaW5lKCksIDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGNtLmNsaXBQb3MoUG9zKGNtLmxhc3RMaW5lKCkpKSk7CiAgICAgIGlmIChmb3J3YXJkID8gY3VyLmZpbmROZXh0KCkgOiBjdXIuZmluZFByZXZpb3VzKCkpCiAgICAgICAgY20uc2V0U2VsZWN0aW9uKGN1ci5mcm9tKCksIGN1ci50bygpKTsKICAgICAgZWxzZSBpZiAodGFyZ2V0LndvcmQpCiAgICAgICAgY20uc2V0U2VsZWN0aW9uKHRhcmdldC5mcm9tLCB0YXJnZXQudG8pOwogICAgfQogIH07CiAgY21kc1ttYXBbY3RybCArICJGMyJdID0gImZpbmRVbmRlciJdID0gZnVuY3Rpb24oY20pIHsgZmluZEFuZEdvVG8oY20sIHRydWUpOyB9OwogIGNtZHNbbWFwWyJTaGlmdC0iICsgY3RybCArICJGMyJdID0gImZpbmRVbmRlclByZXZpb3VzIl0gPSBmdW5jdGlvbihjbSkgeyBmaW5kQW5kR29UbyhjbSxmYWxzZSk7IH07CiAgY21kc1ttYXBbIkFsdC1GMyJdID0gImZpbmRBbGxVbmRlciJdID0gZnVuY3Rpb24oY20pIHsKICAgIHZhciB0YXJnZXQgPSBnZXRUYXJnZXQoY20pOwogICAgaWYgKCF0YXJnZXQpIHJldHVybjsKICAgIHZhciBjdXIgPSBjbS5nZXRTZWFyY2hDdXJzb3IodGFyZ2V0LnF1ZXJ5KTsKICAgIHZhciBtYXRjaGVzID0gW107CiAgICB2YXIgcHJpbWFyeUluZGV4ID0gLTE7CiAgICB3aGlsZSAoY3VyLmZpbmROZXh0KCkpIHsKICAgICAgbWF0Y2hlcy5wdXNoKHthbmNob3I6IGN1ci5mcm9tKCksIGhlYWQ6IGN1ci50bygpfSk7CiAgICAgIGlmIChjdXIuZnJvbSgpLmxpbmUgPD0gdGFyZ2V0LmZyb20ubGluZSAmJiBjdXIuZnJvbSgpLmNoIDw9IHRhcmdldC5mcm9tLmNoKQogICAgICAgIHByaW1hcnlJbmRleCsrOwogICAgfQogICAgY20uc2V0U2VsZWN0aW9ucyhtYXRjaGVzLCBwcmltYXJ5SW5kZXgpOwogIH07CgogIG1hcFsiU2hpZnQtIiArIGN0cmwgKyAiWyJdID0gImZvbGQiOwogIG1hcFsiU2hpZnQtIiArIGN0cmwgKyAiXSJdID0gInVuZm9sZCI7CiAgbWFwS1tjdHJsICsgIjAiXSA9IG1hcEtbY3RybCArICJqIl0gPSAidW5mb2xkQWxsIjsKCiAgbWFwW2N0cmwgKyAiSSJdID0gImZpbmRJbmNyZW1lbnRhbCI7CiAgbWFwWyJTaGlmdC0iICsgY3RybCArICJJIl0gPSAiZmluZEluY3JlbWVudGFsUmV2ZXJzZSI7CiAgbWFwW2N0cmwgKyAiSCJdID0gInJlcGxhY2UiOwogIG1hcFsiRjMiXSA9ICJmaW5kTmV4dCI7CiAgbWFwWyJTaGlmdC1GMyJdID0gImZpbmRQcmV2IjsKCn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/keymap/vim.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovKioKICogU3VwcG9ydGVkIGtleWJpbmRpbmdzOgogKgogKiAgIE1vdGlvbjoKICogICBoLCBqLCBrLCBsCiAqICAgZ2osIGdrCiAqICAgZSwgRSwgdywgVywgYiwgQiwgZ2UsIGdFCiAqICAgZjxjaGFyYWN0ZXI+LCBGPGNoYXJhY3Rlcj4sIHQ8Y2hhcmFjdGVyPiwgVDxjaGFyYWN0ZXI+CiAqICAgJCwgXiwgMCwgLSwgKywgXwogKiAgIGdnLCBHCiAqICAgJQogKiAgICc8Y2hhcmFjdGVyPiwgYDxjaGFyYWN0ZXI+CiAqCiAqICAgT3BlcmF0b3I6CiAqICAgZCwgeSwgYwogKiAgIGRkLCB5eSwgY2MKICogICBnfiwgZ35nfgogKiAgID4sIDwsID4+LCA8PAogKgogKiAgIE9wZXJhdG9yLU1vdGlvbjoKICogICB4LCBYLCBELCBZLCBDLCB+CiAqCiAqICAgQWN0aW9uOgogKiAgIGEsIGksIHMsIEEsIEksIFMsIG8sIE8KICogICB6eiwgei4sIHo8Q1I+LCB6dCwgemIsIHotCiAqICAgSgogKiAgIHUsIEN0cmwtcgogKiAgIG08Y2hhcmFjdGVyPgogKiAgIHI8Y2hhcmFjdGVyPgogKgogKiAgIE1vZGVzOgogKiAgIEVTQyAtIGxlYXZlIGluc2VydCBtb2RlLCB2aXN1YWwgbW9kZSwgYW5kIGNsZWFyIGlucHV0IHN0YXRlLgogKiAgIEN0cmwtWywgQ3RybC1jIC0gc2FtZSBhcyBFU0MuCiAqCiAqIFJlZ2lzdGVyczogdW5uYW1lZCwgLSwgYS16LCBBLVosIDAtOQogKiAgIChEb2VzIG5vdCByZXNwZWN0IHRoZSBzcGVjaWFsIGNhc2UgZm9yIG51bWJlciByZWdpc3RlcnMgd2hlbiBkZWxldGUKICogICAgb3BlcmF0b3IgaXMgbWFkZSB3aXRoIHRoZXNlIGNvbW1hbmRzOiAlLCAoLCApLCAgLCAvLCA/LCBuLCBOLCB7LCB9ICkKICogICBUT0RPOiBJbXBsZW1lbnQgdGhlIHJlbWFpbmluZyByZWdpc3RlcnMuCiAqIE1hcmtzOiBhLXosIEEtWiwgYW5kIDAtOQogKiAgIFRPRE86IEltcGxlbWVudCB0aGUgcmVtYWluaW5nIHNwZWNpYWwgbWFya3MuIFRoZXkgaGF2ZSBtb3JlIGNvbXBsZXgKICogICAgICAgYmVoYXZpb3IuCiAqCiAqIEV2ZW50czoKICogICd2aW0tbW9kZS1jaGFuZ2UnIC0gcmFpc2VkIG9uIHRoZSBlZGl0b3IgYW55dGltZSB0aGUgY3VycmVudCBtb2RlIGNoYW5nZXMsCiAqICAgICAgICAgICAgICAgICAgICAgIEV2ZW50IG9iamVjdDoge21vZGU6ICJ2aXN1YWwiLCBzdWJNb2RlOiAibGluZXdpc2UifQogKgogKiBDb2RlIHN0cnVjdHVyZToKICogIDEuIERlZmF1bHQga2V5bWFwCiAqICAyLiBWYXJpYWJsZSBkZWNsYXJhdGlvbnMgYW5kIHNob3J0IGJhc2ljIGhlbHBlcnMKICogIDMuIEluc3RhbmNlIChFeHRlcm5hbCBBUEkpIGltcGxlbWVudGF0aW9uCiAqICA0LiBJbnRlcm5hbCBzdGF0ZSB0cmFja2luZyBvYmplY3RzIChpbnB1dCBzdGF0ZSwgY291bnRlcikgaW1wbGVtZW50YXRpb24KICogICAgIGFuZCBpbnN0YW5zdGlhdGlvbgogKiAgNS4gS2V5IGhhbmRsZXIgKHRoZSBtYWluIGNvbW1hbmQgZGlzcGF0Y2hlcikgaW1wbGVtZW50YXRpb24KICogIDYuIE1vdGlvbiwgb3BlcmF0b3IsIGFuZCBhY3Rpb24gaW1wbGVtZW50YXRpb25zCiAqICA3LiBIZWxwZXIgZnVuY3Rpb25zIGZvciB0aGUga2V5IGhhbmRsZXIsIG1vdGlvbnMsIG9wZXJhdG9ycywgYW5kIGFjdGlvbnMKICogIDguIFNldCB1cCBWaW0gdG8gd29yayBhcyBhIGtleW1hcCBmb3IgQ29kZU1pcnJvci4KICovCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vbGliL2NvZGVtaXJyb3IiKSwgcmVxdWlyZSgiLi4vYWRkb24vc2VhcmNoL3NlYXJjaGN1cnNvciIpLCByZXF1aXJlKCIuLi9hZGRvbi9kaWFsb2cvZGlhbG9nIiksIHJlcXVpcmUoIi4uL2FkZG9uL2VkaXQvbWF0Y2hicmFja2V0cy5qcyIpKTsKICBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCkgLy8gQU1ECiAgICBkZWZpbmUoWyIuLi9saWIvY29kZW1pcnJvciIsICIuLi9hZGRvbi9zZWFyY2gvc2VhcmNoY3Vyc29yIiwgIi4uL2FkZG9uL2RpYWxvZy9kaWFsb2ciLCAiLi4vYWRkb24vZWRpdC9tYXRjaGJyYWNrZXRzIl0sIG1vZCk7CiAgZWxzZSAvLyBQbGFpbiBicm93c2VyIGVudgogICAgbW9kKENvZGVNaXJyb3IpOwp9KShmdW5jdGlvbihDb2RlTWlycm9yKSB7CiAgJ3VzZSBzdHJpY3QnOwoKICB2YXIgZGVmYXVsdEtleW1hcCA9IFsKICAgIC8vIEtleSB0byBrZXkgbWFwcGluZy4gVGhpcyBnb2VzIGZpcnN0IHRvIG1ha2UgaXQgcG9zc2libGUgdG8gb3ZlcnJpZGUKICAgIC8vIGV4aXN0aW5nIG1hcHBpbmdzLgogICAgeyBrZXlzOiBbJzxMZWZ0PiddLCB0eXBlOiAna2V5VG9LZXknLCB0b0tleXM6IFsnaCddIH0sCiAgICB7IGtleXM6IFsnPFJpZ2h0PiddLCB0eXBlOiAna2V5VG9LZXknLCB0b0tleXM6IFsnbCddIH0sCiAgICB7IGtleXM6IFsnPFVwPiddLCB0eXBlOiAna2V5VG9LZXknLCB0b0tleXM6IFsnayddIH0sCiAgICB7IGtleXM6IFsnPERvd24+J10sIHR5cGU6ICdrZXlUb0tleScsIHRvS2V5czogWydqJ10gfSwKICAgIHsga2V5czogWyc8U3BhY2U+J10sIHR5cGU6ICdrZXlUb0tleScsIHRvS2V5czogWydsJ10gfSwKICAgIHsga2V5czogWyc8QlM+J10sIHR5cGU6ICdrZXlUb0tleScsIHRvS2V5czogWydoJ10gfSwKICAgIHsga2V5czogWyc8Qy1TcGFjZT4nXSwgdHlwZTogJ2tleVRvS2V5JywgdG9LZXlzOiBbJ1cnXSB9LAogICAgeyBrZXlzOiBbJzxDLUJTPiddLCB0eXBlOiAna2V5VG9LZXknLCB0b0tleXM6IFsnQiddIH0sCiAgICB7IGtleXM6IFsnPFMtU3BhY2U+J10sIHR5cGU6ICdrZXlUb0tleScsIHRvS2V5czogWyd3J10gfSwKICAgIHsga2V5czogWyc8Uy1CUz4nXSwgdHlwZTogJ2tleVRvS2V5JywgdG9LZXlzOiBbJ2InXSB9LAogICAgeyBrZXlzOiBbJzxDLW4+J10sIHR5cGU6ICdrZXlUb0tleScsIHRvS2V5czogWydqJ10gfSwKICAgIHsga2V5czogWyc8Qy1wPiddLCB0eXBlOiAna2V5VG9LZXknLCB0b0tleXM6IFsnayddIH0sCiAgICB7IGtleXM6IFsnPEMtWz4nXSwgdHlwZTogJ2tleVRvS2V5JywgdG9LZXlzOiBbJzxFc2M+J10gfSwKICAgIHsga2V5czogWyc8Qy1jPiddLCB0eXBlOiAna2V5VG9LZXknLCB0b0tleXM6IFsnPEVzYz4nXSB9LAogICAgeyBrZXlzOiBbJ3MnXSwgdHlwZTogJ2tleVRvS2V5JywgdG9LZXlzOiBbJ2MnLCAnbCddLCBjb250ZXh0OiAnbm9ybWFsJyB9LAogICAgeyBrZXlzOiBbJ3MnXSwgdHlwZTogJ2tleVRvS2V5JywgdG9LZXlzOiBbJ3gnLCAnaSddLCBjb250ZXh0OiAndmlzdWFsJ30sCiAgICB7IGtleXM6IFsnUyddLCB0eXBlOiAna2V5VG9LZXknLCB0b0tleXM6IFsnYycsICdjJ10sIGNvbnRleHQ6ICdub3JtYWwnIH0sCiAgICB7IGtleXM6IFsnUyddLCB0eXBlOiAna2V5VG9LZXknLCB0b0tleXM6IFsnZCcsICdjJywgJ2MnXSwgY29udGV4dDogJ3Zpc3VhbCcgfSwKICAgIHsga2V5czogWyc8SG9tZT4nXSwgdHlwZTogJ2tleVRvS2V5JywgdG9LZXlzOiBbJzAnXSB9LAogICAgeyBrZXlzOiBbJzxFbmQ+J10sIHR5cGU6ICdrZXlUb0tleScsIHRvS2V5czogWyckJ10gfSwKICAgIHsga2V5czogWyc8UGFnZVVwPiddLCB0eXBlOiAna2V5VG9LZXknLCB0b0tleXM6IFsnPEMtYj4nXSB9LAogICAgeyBrZXlzOiBbJzxQYWdlRG93bj4nXSwgdHlwZTogJ2tleVRvS2V5JywgdG9LZXlzOiBbJzxDLWY+J10gfSwKICAgIHsga2V5czogWyc8Q1I+J10sIHR5cGU6ICdrZXlUb0tleScsIHRvS2V5czogWydqJywgJ14nXSwgY29udGV4dDogJ25vcm1hbCcgfSwKICAgIC8vIE1vdGlvbnMKICAgIHsga2V5czogWydIJ10sIHR5cGU6ICdtb3Rpb24nLAogICAgICAgIG1vdGlvbjogJ21vdmVUb1RvcExpbmUnLAogICAgICAgIG1vdGlvbkFyZ3M6IHsgbGluZXdpc2U6IHRydWUsIHRvSnVtcGxpc3Q6IHRydWUgfX0sCiAgICB7IGtleXM6IFsnTSddLCB0eXBlOiAnbW90aW9uJywKICAgICAgICBtb3Rpb246ICdtb3ZlVG9NaWRkbGVMaW5lJywKICAgICAgICBtb3Rpb25BcmdzOiB7IGxpbmV3aXNlOiB0cnVlLCB0b0p1bXBsaXN0OiB0cnVlIH19LAogICAgeyBrZXlzOiBbJ0wnXSwgdHlwZTogJ21vdGlvbicsCiAgICAgICAgbW90aW9uOiAnbW92ZVRvQm90dG9tTGluZScsCiAgICAgICAgbW90aW9uQXJnczogeyBsaW5ld2lzZTogdHJ1ZSwgdG9KdW1wbGlzdDogdHJ1ZSB9fSwKICAgIHsga2V5czogWydoJ10sIHR5cGU6ICdtb3Rpb24nLAogICAgICAgIG1vdGlvbjogJ21vdmVCeUNoYXJhY3RlcnMnLAogICAgICAgIG1vdGlvbkFyZ3M6IHsgZm9yd2FyZDogZmFsc2UgfX0sCiAgICB7IGtleXM6IFsnbCddLCB0eXBlOiAnbW90aW9uJywKICAgICAgICBtb3Rpb246ICdtb3ZlQnlDaGFyYWN0ZXJzJywKICAgICAgICBtb3Rpb25BcmdzOiB7IGZvcndhcmQ6IHRydWUgfX0sCiAgICB7IGtleXM6IFsnaiddLCB0eXBlOiAnbW90aW9uJywKICAgICAgICBtb3Rpb246ICdtb3ZlQnlMaW5lcycsCiAgICAgICAgbW90aW9uQXJnczogeyBmb3J3YXJkOiB0cnVlLCBsaW5ld2lzZTogdHJ1ZSB9fSwKICAgIHsga2V5czogWydrJ10sIHR5cGU6ICdtb3Rpb24nLAogICAgICAgIG1vdGlvbjogJ21vdmVCeUxpbmVzJywKICAgICAgICBtb3Rpb25BcmdzOiB7IGZvcndhcmQ6IGZhbHNlLCBsaW5ld2lzZTogdHJ1ZSB9fSwKICAgIHsga2V5czogWydnJywnaiddLCB0eXBlOiAnbW90aW9uJywKICAgICAgICBtb3Rpb246ICdtb3ZlQnlEaXNwbGF5TGluZXMnLAogICAgICAgIG1vdGlvbkFyZ3M6IHsgZm9yd2FyZDogdHJ1ZSB9fSwKICAgIHsga2V5czogWydnJywnayddLCB0eXBlOiAnbW90aW9uJywKICAgICAgICBtb3Rpb246ICdtb3ZlQnlEaXNwbGF5TGluZXMnLAogICAgICAgIG1vdGlvbkFyZ3M6IHsgZm9yd2FyZDogZmFsc2UgfX0sCiAgICB7IGtleXM6IFsndyddLCB0eXBlOiAnbW90aW9uJywKICAgICAgICBtb3Rpb246ICdtb3ZlQnlXb3JkcycsCiAgICAgICAgbW90aW9uQXJnczogeyBmb3J3YXJkOiB0cnVlLCB3b3JkRW5kOiBmYWxzZSB9fSwKICAgIHsga2V5czogWydXJ10sIHR5cGU6ICdtb3Rpb24nLAogICAgICAgIG1vdGlvbjogJ21vdmVCeVdvcmRzJywKICAgICAgICBtb3Rpb25BcmdzOiB7IGZvcndhcmQ6IHRydWUsIHdvcmRFbmQ6IGZhbHNlLCBiaWdXb3JkOiB0cnVlIH19LAogICAgeyBrZXlzOiBbJ2UnXSwgdHlwZTogJ21vdGlvbicsCiAgICAgICAgbW90aW9uOiAnbW92ZUJ5V29yZHMnLAogICAgICAgIG1vdGlvbkFyZ3M6IHsgZm9yd2FyZDogdHJ1ZSwgd29yZEVuZDogdHJ1ZSwgaW5jbHVzaXZlOiB0cnVlIH19LAogICAgeyBrZXlzOiBbJ0UnXSwgdHlwZTogJ21vdGlvbicsCiAgICAgICAgbW90aW9uOiAnbW92ZUJ5V29yZHMnLAogICAgICAgIG1vdGlvbkFyZ3M6IHsgZm9yd2FyZDogdHJ1ZSwgd29yZEVuZDogdHJ1ZSwgYmlnV29yZDogdHJ1ZSwKICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlIH19LAogICAgeyBrZXlzOiBbJ2InXSwgdHlwZTogJ21vdGlvbicsCiAgICAgICAgbW90aW9uOiAnbW92ZUJ5V29yZHMnLAogICAgICAgIG1vdGlvbkFyZ3M6IHsgZm9yd2FyZDogZmFsc2UsIHdvcmRFbmQ6IGZhbHNlIH19LAogICAgeyBrZXlzOiBbJ0InXSwgdHlwZTogJ21vdGlvbicsCiAgICAgICAgbW90aW9uOiAnbW92ZUJ5V29yZHMnLAogICAgICAgIG1vdGlvbkFyZ3M6IHsgZm9yd2FyZDogZmFsc2UsIHdvcmRFbmQ6IGZhbHNlLCBiaWdXb3JkOiB0cnVlIH19LAogICAgeyBrZXlzOiBbJ2cnLCAnZSddLCB0eXBlOiAnbW90aW9uJywKICAgICAgICBtb3Rpb246ICdtb3ZlQnlXb3JkcycsCiAgICAgICAgbW90aW9uQXJnczogeyBmb3J3YXJkOiBmYWxzZSwgd29yZEVuZDogdHJ1ZSwgaW5jbHVzaXZlOiB0cnVlIH19LAogICAgeyBrZXlzOiBbJ2cnLCAnRSddLCB0eXBlOiAnbW90aW9uJywKICAgICAgICBtb3Rpb246ICdtb3ZlQnlXb3JkcycsCiAgICAgICAgbW90aW9uQXJnczogeyBmb3J3YXJkOiBmYWxzZSwgd29yZEVuZDogdHJ1ZSwgYmlnV29yZDogdHJ1ZSwKICAgICAgICAgICAgaW5jbHVzaXZlOiB0cnVlIH19LAogICAgeyBrZXlzOiBbJ3snXSwgdHlwZTogJ21vdGlvbicsIG1vdGlvbjogJ21vdmVCeVBhcmFncmFwaCcsCiAgICAgICAgbW90aW9uQXJnczogeyBmb3J3YXJkOiBmYWxzZSwgdG9KdW1wbGlzdDogdHJ1ZSB9fSwKICAgIHsga2V5czogWyd9J10sIHR5cGU6ICdtb3Rpb24nLCBtb3Rpb246ICdtb3ZlQnlQYXJhZ3JhcGgnLAogICAgICAgIG1vdGlvbkFyZ3M6IHsgZm9yd2FyZDogdHJ1ZSwgdG9KdW1wbGlzdDogdHJ1ZSB9fSwKICAgIHsga2V5czogWyc8Qy1mPiddLCB0eXBlOiAnbW90aW9uJywKICAgICAgICBtb3Rpb246ICdtb3ZlQnlQYWdlJywgbW90aW9uQXJnczogeyBmb3J3YXJkOiB0cnVlIH19LAogICAgeyBrZXlzOiBbJzxDLWI+J10sIHR5cGU6ICdtb3Rpb24nLAogICAgICAgIG1vdGlvbjogJ21vdmVCeVBhZ2UnLCBtb3Rpb25BcmdzOiB7IGZvcndhcmQ6IGZhbHNlIH19LAogICAgeyBrZXlzOiBbJzxDLWQ+J10sIHR5cGU6ICdtb3Rpb24nLAogICAgICAgIG1vdGlvbjogJ21vdmVCeVNjcm9sbCcsCiAgICAgICAgbW90aW9uQXJnczogeyBmb3J3YXJkOiB0cnVlLCBleHBsaWNpdFJlcGVhdDogdHJ1ZSB9fSwKICAgIHsga2V5czogWyc8Qy11PiddLCB0eXBlOiAnbW90aW9uJywKICAgICAgICBtb3Rpb246ICdtb3ZlQnlTY3JvbGwnLAogICAgICAgIG1vdGlvbkFyZ3M6IHsgZm9yd2FyZDogZmFsc2UsIGV4cGxpY2l0UmVwZWF0OiB0cnVlIH19LAogICAgeyBrZXlzOiBbJ2cnLCAnZyddLCB0eXBlOiAnbW90aW9uJywKICAgICAgICBtb3Rpb246ICdtb3ZlVG9MaW5lT3JFZGdlT2ZEb2N1bWVudCcsCiAgICAgICAgbW90aW9uQXJnczogeyBmb3J3YXJkOiBmYWxzZSwgZXhwbGljaXRSZXBlYXQ6IHRydWUsIGxpbmV3aXNlOiB0cnVlLCB0b0p1bXBsaXN0OiB0cnVlIH19LAogICAgeyBrZXlzOiBbJ0cnXSwgdHlwZTogJ21vdGlvbicsCiAgICAgICAgbW90aW9uOiAnbW92ZVRvTGluZU9yRWRnZU9mRG9jdW1lbnQnLAogICAgICAgIG1vdGlvbkFyZ3M6IHsgZm9yd2FyZDogdHJ1ZSwgZXhwbGljaXRSZXBlYXQ6IHRydWUsIGxpbmV3aXNlOiB0cnVlLCB0b0p1bXBsaXN0OiB0cnVlIH19LAogICAgeyBrZXlzOiBbJzAnXSwgdHlwZTogJ21vdGlvbicsIG1vdGlvbjogJ21vdmVUb1N0YXJ0T2ZMaW5lJyB9LAogICAgeyBrZXlzOiBbJ14nXSwgdHlwZTogJ21vdGlvbicsCiAgICAgICAgbW90aW9uOiAnbW92ZVRvRmlyc3ROb25XaGl0ZVNwYWNlQ2hhcmFjdGVyJyB9LAogICAgeyBrZXlzOiBbJysnXSwgdHlwZTogJ21vdGlvbicsCiAgICAgICAgbW90aW9uOiAnbW92ZUJ5TGluZXMnLAogICAgICAgIG1vdGlvbkFyZ3M6IHsgZm9yd2FyZDogdHJ1ZSwgdG9GaXJzdENoYXI6dHJ1ZSB9fSwKICAgIHsga2V5czogWyctJ10sIHR5cGU6ICdtb3Rpb24nLAogICAgICAgIG1vdGlvbjogJ21vdmVCeUxpbmVzJywKICAgICAgICBtb3Rpb25BcmdzOiB7IGZvcndhcmQ6IGZhbHNlLCB0b0ZpcnN0Q2hhcjp0cnVlIH19LAogICAgeyBrZXlzOiBbJ18nXSwgdHlwZTogJ21vdGlvbicsCiAgICAgICAgbW90aW9uOiAnbW92ZUJ5TGluZXMnLAogICAgICAgIG1vdGlvbkFyZ3M6IHsgZm9yd2FyZDogdHJ1ZSwgdG9GaXJzdENoYXI6dHJ1ZSwgcmVwZWF0T2Zmc2V0Oi0xIH19LAogICAgeyBrZXlzOiBbJyQnXSwgdHlwZTogJ21vdGlvbicsCiAgICAgICAgbW90aW9uOiAnbW92ZVRvRW9sJywKICAgICAgICBtb3Rpb25BcmdzOiB7IGluY2x1c2l2ZTogdHJ1ZSB9fSwKICAgIHsga2V5czogWyclJ10sIHR5cGU6ICdtb3Rpb24nLAogICAgICAgIG1vdGlvbjogJ21vdmVUb01hdGNoZWRTeW1ib2wnLAogICAgICAgIG1vdGlvbkFyZ3M6IHsgaW5jbHVzaXZlOiB0cnVlLCB0b0p1bXBsaXN0OiB0cnVlIH19LAogICAgeyBrZXlzOiBbJ2YnLCAnY2hhcmFjdGVyJ10sIHR5cGU6ICdtb3Rpb24nLAogICAgICAgIG1vdGlvbjogJ21vdmVUb0NoYXJhY3RlcicsCiAgICAgICAgbW90aW9uQXJnczogeyBmb3J3YXJkOiB0cnVlICwgaW5jbHVzaXZlOiB0cnVlIH19LAogICAgeyBrZXlzOiBbJ0YnLCAnY2hhcmFjdGVyJ10sIHR5cGU6ICdtb3Rpb24nLAogICAgICAgIG1vdGlvbjogJ21vdmVUb0NoYXJhY3RlcicsCiAgICAgICAgbW90aW9uQXJnczogeyBmb3J3YXJkOiBmYWxzZSB9fSwKICAgIHsga2V5czogWyd0JywgJ2NoYXJhY3RlciddLCB0eXBlOiAnbW90aW9uJywKICAgICAgICBtb3Rpb246ICdtb3ZlVGlsbENoYXJhY3RlcicsCiAgICAgICAgbW90aW9uQXJnczogeyBmb3J3YXJkOiB0cnVlLCBpbmNsdXNpdmU6IHRydWUgfX0sCiAgICB7IGtleXM6IFsnVCcsICdjaGFyYWN0ZXInXSwgdHlwZTogJ21vdGlvbicsCiAgICAgICAgbW90aW9uOiAnbW92ZVRpbGxDaGFyYWN0ZXInLAogICAgICAgIG1vdGlvbkFyZ3M6IHsgZm9yd2FyZDogZmFsc2UgfX0sCiAgICB7IGtleXM6IFsnOyddLCB0eXBlOiAnbW90aW9uJywgbW90aW9uOiAncmVwZWF0TGFzdENoYXJhY3RlclNlYXJjaCcsCiAgICAgICAgbW90aW9uQXJnczogeyBmb3J3YXJkOiB0cnVlIH19LAogICAgeyBrZXlzOiBbJywnXSwgdHlwZTogJ21vdGlvbicsIG1vdGlvbjogJ3JlcGVhdExhc3RDaGFyYWN0ZXJTZWFyY2gnLAogICAgICAgIG1vdGlvbkFyZ3M6IHsgZm9yd2FyZDogZmFsc2UgfX0sCiAgICB7IGtleXM6IFsnXCcnLCAnY2hhcmFjdGVyJ10sIHR5cGU6ICdtb3Rpb24nLCBtb3Rpb246ICdnb1RvTWFyaycsCiAgICAgICAgbW90aW9uQXJnczoge3RvSnVtcGxpc3Q6IHRydWUsIGxpbmV3aXNlOiB0cnVlfX0sCiAgICB7IGtleXM6IFsnYCcsICdjaGFyYWN0ZXInXSwgdHlwZTogJ21vdGlvbicsIG1vdGlvbjogJ2dvVG9NYXJrJywKICAgICAgICBtb3Rpb25BcmdzOiB7dG9KdW1wbGlzdDogdHJ1ZX19LAogICAgeyBrZXlzOiBbJ10nLCAnYCddLCB0eXBlOiAnbW90aW9uJywgbW90aW9uOiAnanVtcFRvTWFyaycsIG1vdGlvbkFyZ3M6IHsgZm9yd2FyZDogdHJ1ZSB9IH0sCiAgICB7IGtleXM6IFsnWycsICdgJ10sIHR5cGU6ICdtb3Rpb24nLCBtb3Rpb246ICdqdW1wVG9NYXJrJywgbW90aW9uQXJnczogeyBmb3J3YXJkOiBmYWxzZSB9IH0sCiAgICB7IGtleXM6IFsnXScsICdcJyddLCB0eXBlOiAnbW90aW9uJywgbW90aW9uOiAnanVtcFRvTWFyaycsIG1vdGlvbkFyZ3M6IHsgZm9yd2FyZDogdHJ1ZSwgbGluZXdpc2U6IHRydWUgfSB9LAogICAgeyBrZXlzOiBbJ1snLCAnXCcnXSwgdHlwZTogJ21vdGlvbicsIG1vdGlvbjogJ2p1bXBUb01hcmsnLCBtb3Rpb25BcmdzOiB7IGZvcndhcmQ6IGZhbHNlLCBsaW5ld2lzZTogdHJ1ZSB9IH0sCiAgICAvLyB0aGUgbmV4dCB0d28gYXJlbid0IG1vdGlvbnMgYnV0IG11c3QgY29tZSBiZWZvcmUgbW9yZSBnZW5lcmFsIG1vdGlvbiBkZWNsYXJhdGlvbnMKICAgIHsga2V5czogWyddJywgJ3AnXSwgdHlwZTogJ2FjdGlvbicsIGFjdGlvbjogJ3Bhc3RlJywgaXNFZGl0OiB0cnVlLAogICAgICAgIGFjdGlvbkFyZ3M6IHsgYWZ0ZXI6IHRydWUsIGlzRWRpdDogdHJ1ZSwgbWF0Y2hJbmRlbnQ6IHRydWV9fSwKICAgIHsga2V5czogWydbJywgJ3AnXSwgdHlwZTogJ2FjdGlvbicsIGFjdGlvbjogJ3Bhc3RlJywgaXNFZGl0OiB0cnVlLAogICAgICAgIGFjdGlvbkFyZ3M6IHsgYWZ0ZXI6IGZhbHNlLCBpc0VkaXQ6IHRydWUsIG1hdGNoSW5kZW50OiB0cnVlfX0sCiAgICB7IGtleXM6IFsnXScsICdjaGFyYWN0ZXInXSwgdHlwZTogJ21vdGlvbicsCiAgICAgICAgbW90aW9uOiAnbW92ZVRvU3ltYm9sJywKICAgICAgICBtb3Rpb25BcmdzOiB7IGZvcndhcmQ6IHRydWUsIHRvSnVtcGxpc3Q6IHRydWV9fSwKICAgIHsga2V5czogWydbJywgJ2NoYXJhY3RlciddLCB0eXBlOiAnbW90aW9uJywKICAgICAgICBtb3Rpb246ICdtb3ZlVG9TeW1ib2wnLAogICAgICAgIG1vdGlvbkFyZ3M6IHsgZm9yd2FyZDogZmFsc2UsIHRvSnVtcGxpc3Q6IHRydWV9fSwKICAgIHsga2V5czogWyd8J10sIHR5cGU6ICdtb3Rpb24nLAogICAgICAgIG1vdGlvbjogJ21vdmVUb0NvbHVtbicsCiAgICAgICAgbW90aW9uQXJnczogeyB9fSwKICAgIHsga2V5czogWydvJ10sIHR5cGU6ICdtb3Rpb24nLCBtb3Rpb246ICdtb3ZlVG9PdGhlckhpZ2hsaWdodGVkRW5kJywgbW90aW9uQXJnczogeyB9LCBjb250ZXh0Oid2aXN1YWwnfSwKICAgIHsga2V5czogWydPJ10sIHR5cGU6ICdtb3Rpb24nLCBtb3Rpb246ICdtb3ZlVG9PdGhlckhpZ2hsaWdodGVkRW5kJywgbW90aW9uQXJnczoge3NhbWVMaW5lOiB0cnVlfSwgY29udGV4dDondmlzdWFsJ30sCiAgICAvLyBPcGVyYXRvcnMKICAgIHsga2V5czogWydkJ10sIHR5cGU6ICdvcGVyYXRvcicsIG9wZXJhdG9yOiAnZGVsZXRlJyB9LAogICAgeyBrZXlzOiBbJ3knXSwgdHlwZTogJ29wZXJhdG9yJywgb3BlcmF0b3I6ICd5YW5rJyB9LAogICAgeyBrZXlzOiBbJ2MnXSwgdHlwZTogJ29wZXJhdG9yJywgb3BlcmF0b3I6ICdjaGFuZ2UnIH0sCiAgICB7IGtleXM6IFsnPiddLCB0eXBlOiAnb3BlcmF0b3InLCBvcGVyYXRvcjogJ2luZGVudCcsCiAgICAgICAgb3BlcmF0b3JBcmdzOiB7IGluZGVudFJpZ2h0OiB0cnVlIH19LAogICAgeyBrZXlzOiBbJzwnXSwgdHlwZTogJ29wZXJhdG9yJywgb3BlcmF0b3I6ICdpbmRlbnQnLAogICAgICAgIG9wZXJhdG9yQXJnczogeyBpbmRlbnRSaWdodDogZmFsc2UgfX0sCiAgICB7IGtleXM6IFsnZycsICd+J10sIHR5cGU6ICdvcGVyYXRvcicsIG9wZXJhdG9yOiAnc3dhcGNhc2UnIH0sCiAgICB7IGtleXM6IFsnbiddLCB0eXBlOiAnbW90aW9uJywgbW90aW9uOiAnZmluZE5leHQnLAogICAgICAgIG1vdGlvbkFyZ3M6IHsgZm9yd2FyZDogdHJ1ZSwgdG9KdW1wbGlzdDogdHJ1ZSB9fSwKICAgIHsga2V5czogWydOJ10sIHR5cGU6ICdtb3Rpb24nLCBtb3Rpb246ICdmaW5kTmV4dCcsCiAgICAgICAgbW90aW9uQXJnczogeyBmb3J3YXJkOiBmYWxzZSwgdG9KdW1wbGlzdDogdHJ1ZSB9fSwKICAgIC8vIE9wZXJhdG9yLU1vdGlvbiBkdWFsIGNvbW1hbmRzCiAgICB7IGtleXM6IFsneCddLCB0eXBlOiAnb3BlcmF0b3JNb3Rpb24nLCBvcGVyYXRvcjogJ2RlbGV0ZScsCiAgICAgICAgbW90aW9uOiAnbW92ZUJ5Q2hhcmFjdGVycycsIG1vdGlvbkFyZ3M6IHsgZm9yd2FyZDogdHJ1ZSB9LAogICAgICAgIG9wZXJhdG9yTW90aW9uQXJnczogeyB2aXN1YWxMaW5lOiBmYWxzZSB9fSwKICAgIHsga2V5czogWydYJ10sIHR5cGU6ICdvcGVyYXRvck1vdGlvbicsIG9wZXJhdG9yOiAnZGVsZXRlJywKICAgICAgICBtb3Rpb246ICdtb3ZlQnlDaGFyYWN0ZXJzJywgbW90aW9uQXJnczogeyBmb3J3YXJkOiBmYWxzZSB9LAogICAgICAgIG9wZXJhdG9yTW90aW9uQXJnczogeyB2aXN1YWxMaW5lOiB0cnVlIH19LAogICAgeyBrZXlzOiBbJ0QnXSwgdHlwZTogJ29wZXJhdG9yTW90aW9uJywgb3BlcmF0b3I6ICdkZWxldGUnLAogICAgICBtb3Rpb246ICdtb3ZlVG9Fb2wnLCBtb3Rpb25BcmdzOiB7IGluY2x1c2l2ZTogdHJ1ZSB9LAogICAgICAgIG9wZXJhdG9yTW90aW9uQXJnczogeyB2aXN1YWxMaW5lOiB0cnVlIH19LAogICAgeyBrZXlzOiBbJ1knXSwgdHlwZTogJ29wZXJhdG9yTW90aW9uJywgb3BlcmF0b3I6ICd5YW5rJywKICAgICAgICBtb3Rpb246ICdtb3ZlVG9Fb2wnLCBtb3Rpb25BcmdzOiB7IGluY2x1c2l2ZTogdHJ1ZSB9LAogICAgICAgIG9wZXJhdG9yTW90aW9uQXJnczogeyB2aXN1YWxMaW5lOiB0cnVlIH19LAogICAgeyBrZXlzOiBbJ0MnXSwgdHlwZTogJ29wZXJhdG9yTW90aW9uJywKICAgICAgICBvcGVyYXRvcjogJ2NoYW5nZScsCiAgICAgICAgbW90aW9uOiAnbW92ZVRvRW9sJywgbW90aW9uQXJnczogeyBpbmNsdXNpdmU6IHRydWUgfSwKICAgICAgICBvcGVyYXRvck1vdGlvbkFyZ3M6IHsgdmlzdWFsTGluZTogdHJ1ZSB9fSwKICAgIHsga2V5czogWyd+J10sIHR5cGU6ICdvcGVyYXRvck1vdGlvbicsCiAgICAgICAgb3BlcmF0b3I6ICdzd2FwY2FzZScsIG9wZXJhdG9yQXJnczogeyBzaG91bGRNb3ZlQ3Vyc29yOiB0cnVlIH0sCiAgICAgICAgbW90aW9uOiAnbW92ZUJ5Q2hhcmFjdGVycycsIG1vdGlvbkFyZ3M6IHsgZm9yd2FyZDogdHJ1ZSB9fSwKICAgIC8vIEFjdGlvbnMKICAgIHsga2V5czogWyc8Qy1pPiddLCB0eXBlOiAnYWN0aW9uJywgYWN0aW9uOiAnanVtcExpc3RXYWxrJywKICAgICAgICBhY3Rpb25BcmdzOiB7IGZvcndhcmQ6IHRydWUgfX0sCiAgICB7IGtleXM6IFsnPEMtbz4nXSwgdHlwZTogJ2FjdGlvbicsIGFjdGlvbjogJ2p1bXBMaXN0V2FsaycsCiAgICAgICAgYWN0aW9uQXJnczogeyBmb3J3YXJkOiBmYWxzZSB9fSwKICAgIHsga2V5czogWyc8Qy1lPiddLCB0eXBlOiAnYWN0aW9uJywKICAgICAgICBhY3Rpb246ICdzY3JvbGwnLAogICAgICAgIGFjdGlvbkFyZ3M6IHsgZm9yd2FyZDogdHJ1ZSwgbGluZXdpc2U6IHRydWUgfX0sCiAgICB7IGtleXM6IFsnPEMteT4nXSwgdHlwZTogJ2FjdGlvbicsCiAgICAgICAgYWN0aW9uOiAnc2Nyb2xsJywKICAgICAgICBhY3Rpb25BcmdzOiB7IGZvcndhcmQ6IGZhbHNlLCBsaW5ld2lzZTogdHJ1ZSB9fSwKICAgIHsga2V5czogWydhJ10sIHR5cGU6ICdhY3Rpb24nLCBhY3Rpb246ICdlbnRlckluc2VydE1vZGUnLCBpc0VkaXQ6IHRydWUsCiAgICAgICAgYWN0aW9uQXJnczogeyBpbnNlcnRBdDogJ2NoYXJBZnRlcicgfX0sCiAgICB7IGtleXM6IFsnQSddLCB0eXBlOiAnYWN0aW9uJywgYWN0aW9uOiAnZW50ZXJJbnNlcnRNb2RlJywgaXNFZGl0OiB0cnVlLAogICAgICAgIGFjdGlvbkFyZ3M6IHsgaW5zZXJ0QXQ6ICdlb2wnIH19LAogICAgeyBrZXlzOiBbJ0EnXSwgdHlwZTogJ2FjdGlvbicsIGFjdGlvbjogJ2VudGVySW5zZXJ0TW9kZScsIGlzRWRpdDogdHJ1ZSwgYWN0aW9uQXJnczogeyBpbnNlcnRBdDogJ2VuZE9mU2VsZWN0ZWRBcmVhJyB9LCBjb250ZXh0OiAndmlzdWFsJyB9LAogICAgeyBrZXlzOiBbJ2knXSwgdHlwZTogJ2FjdGlvbicsIGFjdGlvbjogJ2VudGVySW5zZXJ0TW9kZScsIGlzRWRpdDogdHJ1ZSwKICAgICAgICBhY3Rpb25BcmdzOiB7IGluc2VydEF0OiAnaW5wbGFjZScgfX0sCiAgICB7IGtleXM6IFsnSSddLCB0eXBlOiAnYWN0aW9uJywgYWN0aW9uOiAnZW50ZXJJbnNlcnRNb2RlJywgaXNFZGl0OiB0cnVlLAogICAgICAgIGFjdGlvbkFyZ3M6IHsgaW5zZXJ0QXQ6ICdmaXJzdE5vbkJsYW5rJyB9fSwKICAgIHsga2V5czogWydvJ10sIHR5cGU6ICdhY3Rpb24nLCBhY3Rpb246ICduZXdMaW5lQW5kRW50ZXJJbnNlcnRNb2RlJywKICAgICAgICBpc0VkaXQ6IHRydWUsIGludGVybGFjZUluc2VydFJlcGVhdDogdHJ1ZSwKICAgICAgICBhY3Rpb25BcmdzOiB7IGFmdGVyOiB0cnVlIH19LAogICAgeyBrZXlzOiBbJ08nXSwgdHlwZTogJ2FjdGlvbicsIGFjdGlvbjogJ25ld0xpbmVBbmRFbnRlckluc2VydE1vZGUnLAogICAgICAgIGlzRWRpdDogdHJ1ZSwgaW50ZXJsYWNlSW5zZXJ0UmVwZWF0OiB0cnVlLAogICAgICAgIGFjdGlvbkFyZ3M6IHsgYWZ0ZXI6IGZhbHNlIH19LAogICAgeyBrZXlzOiBbJ3YnXSwgdHlwZTogJ2FjdGlvbicsIGFjdGlvbjogJ3RvZ2dsZVZpc3VhbE1vZGUnIH0sCiAgICB7IGtleXM6IFsnViddLCB0eXBlOiAnYWN0aW9uJywgYWN0aW9uOiAndG9nZ2xlVmlzdWFsTW9kZScsCiAgICAgICAgYWN0aW9uQXJnczogeyBsaW5ld2lzZTogdHJ1ZSB9fSwKICAgIHsga2V5czogWyc8Qy12PiddLCB0eXBlOiAnYWN0aW9uJywgYWN0aW9uOiAndG9nZ2xlVmlzdWFsTW9kZScsCiAgICAgICAgYWN0aW9uQXJnczogeyBibG9ja3dpc2U6IHRydWUgfX0sCiAgICB7IGtleXM6IFsnZycsICd2J10sIHR5cGU6ICdhY3Rpb24nLCBhY3Rpb246ICdyZXNlbGVjdExhc3RTZWxlY3Rpb24nIH0sCiAgICB7IGtleXM6IFsnSiddLCB0eXBlOiAnYWN0aW9uJywgYWN0aW9uOiAnam9pbkxpbmVzJywgaXNFZGl0OiB0cnVlIH0sCiAgICB7IGtleXM6IFsncCddLCB0eXBlOiAnYWN0aW9uJywgYWN0aW9uOiAncGFzdGUnLCBpc0VkaXQ6IHRydWUsCiAgICAgICAgYWN0aW9uQXJnczogeyBhZnRlcjogdHJ1ZSwgaXNFZGl0OiB0cnVlIH19LAogICAgeyBrZXlzOiBbJ1AnXSwgdHlwZTogJ2FjdGlvbicsIGFjdGlvbjogJ3Bhc3RlJywgaXNFZGl0OiB0cnVlLAogICAgICAgIGFjdGlvbkFyZ3M6IHsgYWZ0ZXI6IGZhbHNlLCBpc0VkaXQ6IHRydWUgfX0sCiAgICB7IGtleXM6IFsncicsICdjaGFyYWN0ZXInXSwgdHlwZTogJ2FjdGlvbicsIGFjdGlvbjogJ3JlcGxhY2UnLCBpc0VkaXQ6IHRydWUgfSwKICAgIHsga2V5czogWydAJywgJ2NoYXJhY3RlciddLCB0eXBlOiAnYWN0aW9uJywgYWN0aW9uOiAncmVwbGF5TWFjcm8nIH0sCiAgICB7IGtleXM6IFsncScsICdjaGFyYWN0ZXInXSwgdHlwZTogJ2FjdGlvbicsIGFjdGlvbjogJ2VudGVyTWFjcm9SZWNvcmRNb2RlJyB9LAogICAgLy8gSGFuZGxlIFJlcGxhY2UtbW9kZSBhcyBhIHNwZWNpYWwgY2FzZSBvZiBpbnNlcnQgbW9kZS4KICAgIHsga2V5czogWydSJ10sIHR5cGU6ICdhY3Rpb24nLCBhY3Rpb246ICdlbnRlckluc2VydE1vZGUnLCBpc0VkaXQ6IHRydWUsCiAgICAgICAgYWN0aW9uQXJnczogeyByZXBsYWNlOiB0cnVlIH19LAogICAgeyBrZXlzOiBbJ3UnXSwgdHlwZTogJ2FjdGlvbicsIGFjdGlvbjogJ3VuZG8nIH0sCiAgICB7IGtleXM6IFsndSddLCB0eXBlOiAnYWN0aW9uJywgYWN0aW9uOiAnY2hhbmdlQ2FzZScsIGFjdGlvbkFyZ3M6IHt0b0xvd2VyOiB0cnVlfSwgY29udGV4dDogJ3Zpc3VhbCcsIGlzRWRpdDogdHJ1ZSB9LAogICAgeyBrZXlzOiBbJ1UnXSx0eXBlOiAnYWN0aW9uJywgYWN0aW9uOiAnY2hhbmdlQ2FzZScsIGFjdGlvbkFyZ3M6IHt0b0xvd2VyOiBmYWxzZX0sIGNvbnRleHQ6ICd2aXN1YWwnLCBpc0VkaXQ6IHRydWUgfSwKICAgIHsga2V5czogWyc8Qy1yPiddLCB0eXBlOiAnYWN0aW9uJywgYWN0aW9uOiAncmVkbycgfSwKICAgIHsga2V5czogWydtJywgJ2NoYXJhY3RlciddLCB0eXBlOiAnYWN0aW9uJywgYWN0aW9uOiAnc2V0TWFyaycgfSwKICAgIHsga2V5czogWyciJywgJ2NoYXJhY3RlciddLCB0eXBlOiAnYWN0aW9uJywgYWN0aW9uOiAnc2V0UmVnaXN0ZXInIH0sCiAgICB7IGtleXM6IFsneicsICd6J10sIHR5cGU6ICdhY3Rpb24nLCBhY3Rpb246ICdzY3JvbGxUb0N1cnNvcicsCiAgICAgICAgYWN0aW9uQXJnczogeyBwb3NpdGlvbjogJ2NlbnRlcicgfX0sCiAgICB7IGtleXM6IFsneicsICcuJ10sIHR5cGU6ICdhY3Rpb24nLCBhY3Rpb246ICdzY3JvbGxUb0N1cnNvcicsCiAgICAgICAgYWN0aW9uQXJnczogeyBwb3NpdGlvbjogJ2NlbnRlcicgfSwKICAgICAgICBtb3Rpb246ICdtb3ZlVG9GaXJzdE5vbldoaXRlU3BhY2VDaGFyYWN0ZXInIH0sCiAgICB7IGtleXM6IFsneicsICd0J10sIHR5cGU6ICdhY3Rpb24nLCBhY3Rpb246ICdzY3JvbGxUb0N1cnNvcicsCiAgICAgICAgYWN0aW9uQXJnczogeyBwb3NpdGlvbjogJ3RvcCcgfX0sCiAgICB7IGtleXM6IFsneicsICc8Q1I+J10sIHR5cGU6ICdhY3Rpb24nLCBhY3Rpb246ICdzY3JvbGxUb0N1cnNvcicsCiAgICAgICAgYWN0aW9uQXJnczogeyBwb3NpdGlvbjogJ3RvcCcgfSwKICAgICAgICBtb3Rpb246ICdtb3ZlVG9GaXJzdE5vbldoaXRlU3BhY2VDaGFyYWN0ZXInIH0sCiAgICB7IGtleXM6IFsneicsICctJ10sIHR5cGU6ICdhY3Rpb24nLCBhY3Rpb246ICdzY3JvbGxUb0N1cnNvcicsCiAgICAgICAgYWN0aW9uQXJnczogeyBwb3NpdGlvbjogJ2JvdHRvbScgfX0sCiAgICB7IGtleXM6IFsneicsICdiJ10sIHR5cGU6ICdhY3Rpb24nLCBhY3Rpb246ICdzY3JvbGxUb0N1cnNvcicsCiAgICAgICAgYWN0aW9uQXJnczogeyBwb3NpdGlvbjogJ2JvdHRvbScgfSwKICAgICAgICBtb3Rpb246ICdtb3ZlVG9GaXJzdE5vbldoaXRlU3BhY2VDaGFyYWN0ZXInIH0sCiAgICB7IGtleXM6IFsnLiddLCB0eXBlOiAnYWN0aW9uJywgYWN0aW9uOiAncmVwZWF0TGFzdEVkaXQnIH0sCiAgICB7IGtleXM6IFsnPEMtYT4nXSwgdHlwZTogJ2FjdGlvbicsIGFjdGlvbjogJ2luY3JlbWVudE51bWJlclRva2VuJywKICAgICAgICBpc0VkaXQ6IHRydWUsCiAgICAgICAgYWN0aW9uQXJnczoge2luY3JlYXNlOiB0cnVlLCBiYWNrdHJhY2s6IGZhbHNlfX0sCiAgICB7IGtleXM6IFsnPEMteD4nXSwgdHlwZTogJ2FjdGlvbicsIGFjdGlvbjogJ2luY3JlbWVudE51bWJlclRva2VuJywKICAgICAgICBpc0VkaXQ6IHRydWUsCiAgICAgICAgYWN0aW9uQXJnczoge2luY3JlYXNlOiBmYWxzZSwgYmFja3RyYWNrOiBmYWxzZX19LAogICAgLy8gVGV4dCBvYmplY3QgbW90aW9ucwogICAgeyBrZXlzOiBbJ2EnLCAnY2hhcmFjdGVyJ10sIHR5cGU6ICdtb3Rpb24nLAogICAgICAgIG1vdGlvbjogJ3RleHRPYmplY3RNYW5pcHVsYXRpb24nIH0sCiAgICB7IGtleXM6IFsnaScsICdjaGFyYWN0ZXInXSwgdHlwZTogJ21vdGlvbicsCiAgICAgICAgbW90aW9uOiAndGV4dE9iamVjdE1hbmlwdWxhdGlvbicsCiAgICAgICAgbW90aW9uQXJnczogeyB0ZXh0T2JqZWN0SW5uZXI6IHRydWUgfX0sCiAgICAvLyBTZWFyY2gKICAgIHsga2V5czogWycvJ10sIHR5cGU6ICdzZWFyY2gnLAogICAgICAgIHNlYXJjaEFyZ3M6IHsgZm9yd2FyZDogdHJ1ZSwgcXVlcnlTcmM6ICdwcm9tcHQnLCB0b0p1bXBsaXN0OiB0cnVlIH19LAogICAgeyBrZXlzOiBbJz8nXSwgdHlwZTogJ3NlYXJjaCcsCiAgICAgICAgc2VhcmNoQXJnczogeyBmb3J3YXJkOiBmYWxzZSwgcXVlcnlTcmM6ICdwcm9tcHQnLCB0b0p1bXBsaXN0OiB0cnVlIH19LAogICAgeyBrZXlzOiBbJyonXSwgdHlwZTogJ3NlYXJjaCcsCiAgICAgICAgc2VhcmNoQXJnczogeyBmb3J3YXJkOiB0cnVlLCBxdWVyeVNyYzogJ3dvcmRVbmRlckN1cnNvcicsIHdob2xlV29yZE9ubHk6IHRydWUsIHRvSnVtcGxpc3Q6IHRydWUgfX0sCiAgICB7IGtleXM6IFsnIyddLCB0eXBlOiAnc2VhcmNoJywKICAgICAgICBzZWFyY2hBcmdzOiB7IGZvcndhcmQ6IGZhbHNlLCBxdWVyeVNyYzogJ3dvcmRVbmRlckN1cnNvcicsIHdob2xlV29yZE9ubHk6IHRydWUsIHRvSnVtcGxpc3Q6IHRydWUgfX0sCiAgICB7IGtleXM6IFsnZycsICcqJ10sIHR5cGU6ICdzZWFyY2gnLCBzZWFyY2hBcmdzOiB7IGZvcndhcmQ6IHRydWUsIHF1ZXJ5U3JjOiAnd29yZFVuZGVyQ3Vyc29yJywgdG9KdW1wbGlzdDogdHJ1ZSB9fSwKICAgIHsga2V5czogWydnJywgJyMnXSwgdHlwZTogJ3NlYXJjaCcsIHNlYXJjaEFyZ3M6IHsgZm9yd2FyZDogZmFsc2UsIHF1ZXJ5U3JjOiAnd29yZFVuZGVyQ3Vyc29yJywgdG9KdW1wbGlzdDogdHJ1ZSB9fSwKICAgIC8vIEV4IGNvbW1hbmQKICAgIHsga2V5czogWyc6J10sIHR5cGU6ICdleCcgfQogIF07CgogIHZhciBQb3MgPSBDb2RlTWlycm9yLlBvczsKCiAgdmFyIFZpbSA9IGZ1bmN0aW9uKCkgewogICAgQ29kZU1pcnJvci5kZWZpbmVPcHRpb24oJ3ZpbU1vZGUnLCBmYWxzZSwgZnVuY3Rpb24oY20sIHZhbCkgewogICAgICBpZiAodmFsKSB7CiAgICAgICAgY20uc2V0T3B0aW9uKCdrZXlNYXAnLCAndmltJyk7CiAgICAgICAgY20uc2V0T3B0aW9uKCdkaXNhYmxlSW5wdXQnLCB0cnVlKTsKICAgICAgICBjbS5zZXRPcHRpb24oJ3Nob3dDdXJzb3JXaGVuU2VsZWN0aW5nJywgZmFsc2UpOwogICAgICAgIENvZGVNaXJyb3Iuc2lnbmFsKGNtLCAidmltLW1vZGUtY2hhbmdlIiwge21vZGU6ICJub3JtYWwifSk7CiAgICAgICAgY20ub24oJ2N1cnNvckFjdGl2aXR5Jywgb25DdXJzb3JBY3Rpdml0eSk7CiAgICAgICAgbWF5YmVJbml0VmltU3RhdGUoY20pOwogICAgICAgIENvZGVNaXJyb3Iub24oY20uZ2V0SW5wdXRGaWVsZCgpLCAncGFzdGUnLCBnZXRPblBhc3RlRm4oY20pKTsKICAgICAgfSBlbHNlIGlmIChjbS5zdGF0ZS52aW0pIHsKICAgICAgICBjbS5zZXRPcHRpb24oJ2tleU1hcCcsICdkZWZhdWx0Jyk7CiAgICAgICAgY20uc2V0T3B0aW9uKCdkaXNhYmxlSW5wdXQnLCBmYWxzZSk7CiAgICAgICAgY20ub2ZmKCdjdXJzb3JBY3Rpdml0eScsIG9uQ3Vyc29yQWN0aXZpdHkpOwogICAgICAgIENvZGVNaXJyb3Iub2ZmKGNtLmdldElucHV0RmllbGQoKSwgJ3Bhc3RlJywgZ2V0T25QYXN0ZUZuKGNtKSk7CiAgICAgICAgY20uc3RhdGUudmltID0gbnVsbDsKICAgICAgfQogICAgfSk7CiAgICBmdW5jdGlvbiBnZXRPblBhc3RlRm4oY20pIHsKICAgICAgdmFyIHZpbSA9IGNtLnN0YXRlLnZpbTsKICAgICAgaWYgKCF2aW0ub25QYXN0ZUZuKSB7CiAgICAgICAgdmltLm9uUGFzdGVGbiA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgaWYgKCF2aW0uaW5zZXJ0TW9kZSkgewogICAgICAgICAgICBjbS5zZXRDdXJzb3Iob2Zmc2V0Q3Vyc29yKGNtLmdldEN1cnNvcigpLCAwLCAxKSk7CiAgICAgICAgICAgIGFjdGlvbnMuZW50ZXJJbnNlcnRNb2RlKGNtLCB7fSwgdmltKTsKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICB9CiAgICAgIHJldHVybiB2aW0ub25QYXN0ZUZuOwogICAgfQoKICAgIHZhciBudW1iZXJSZWdleCA9IC9bXGRdLzsKICAgIHZhciB3b3JkUmVnZXhwID0gWygvXHcvKSwgKC9bXlx3XHNdLyldLCBiaWdXb3JkUmVnZXhwID0gWygvXFMvKV07CiAgICBmdW5jdGlvbiBtYWtlS2V5UmFuZ2Uoc3RhcnQsIHNpemUpIHsKICAgICAgdmFyIGtleXMgPSBbXTsKICAgICAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgc3RhcnQgKyBzaXplOyBpKyspIHsKICAgICAgICBrZXlzLnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZShpKSk7CiAgICAgIH0KICAgICAgcmV0dXJuIGtleXM7CiAgICB9CiAgICB2YXIgdXBwZXJDYXNlQWxwaGFiZXQgPSBtYWtlS2V5UmFuZ2UoNjUsIDI2KTsKICAgIHZhciBsb3dlckNhc2VBbHBoYWJldCA9IG1ha2VLZXlSYW5nZSg5NywgMjYpOwogICAgdmFyIG51bWJlcnMgPSBtYWtlS2V5UmFuZ2UoNDgsIDEwKTsKICAgIHZhciBzcGVjaWFsU3ltYm9scyA9ICd+YCFAIyQlXiYqKClfLSs9W3t9XVxcfC8/Liw8Pjo7IlwnJy5zcGxpdCgnJyk7CiAgICB2YXIgc3BlY2lhbEtleXMgPSBbJ0xlZnQnLCAnUmlnaHQnLCAnVXAnLCAnRG93bicsICdTcGFjZScsICdCYWNrc3BhY2UnLAogICAgICAgICdFc2MnLCAnSG9tZScsICdFbmQnLCAnUGFnZVVwJywgJ1BhZ2VEb3duJywgJ0VudGVyJ107CiAgICB2YXIgdmFsaWRNYXJrcyA9IFtdLmNvbmNhdCh1cHBlckNhc2VBbHBoYWJldCwgbG93ZXJDYXNlQWxwaGFiZXQsIG51bWJlcnMsIFsnPCcsICc+J10pOwogICAgdmFyIHZhbGlkUmVnaXN0ZXJzID0gW10uY29uY2F0KHVwcGVyQ2FzZUFscGhhYmV0LCBsb3dlckNhc2VBbHBoYWJldCwgbnVtYmVycywgWyctJywgJyInLCAnLicsICc6JywgJy8nXSk7CgogICAgZnVuY3Rpb24gaXNMaW5lKGNtLCBsaW5lKSB7CiAgICAgIHJldHVybiBsaW5lID49IGNtLmZpcnN0TGluZSgpICYmIGxpbmUgPD0gY20ubGFzdExpbmUoKTsKICAgIH0KICAgIGZ1bmN0aW9uIGlzTG93ZXJDYXNlKGspIHsKICAgICAgcmV0dXJuICgvXlthLXpdJC8pLnRlc3Qoayk7CiAgICB9CiAgICBmdW5jdGlvbiBpc01hdGNoYWJsZVN5bWJvbChrKSB7CiAgICAgIHJldHVybiAnKClbXXt9Jy5pbmRleE9mKGspICE9IC0xOwogICAgfQogICAgZnVuY3Rpb24gaXNOdW1iZXIoaykgewogICAgICByZXR1cm4gbnVtYmVyUmVnZXgudGVzdChrKTsKICAgIH0KICAgIGZ1bmN0aW9uIGlzVXBwZXJDYXNlKGspIHsKICAgICAgcmV0dXJuICgvXltBLVpdJC8pLnRlc3Qoayk7CiAgICB9CiAgICBmdW5jdGlvbiBpc1doaXRlU3BhY2VTdHJpbmcoaykgewogICAgICByZXR1cm4gKC9eXHMqJC8pLnRlc3Qoayk7CiAgICB9CiAgICBmdW5jdGlvbiBpbkFycmF5KHZhbCwgYXJyKSB7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgaWYgKGFycltpXSA9PSB2YWwpIHsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgdmFyIG9wdGlvbnMgPSB7fTsKICAgIGZ1bmN0aW9uIGRlZmluZU9wdGlvbihuYW1lLCBkZWZhdWx0VmFsdWUsIHR5cGUpIHsKICAgICAgaWYgKGRlZmF1bHRWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7IHRocm93IEVycm9yKCdkZWZhdWx0VmFsdWUgaXMgcmVxdWlyZWQnKTsgfQogICAgICBpZiAoIXR5cGUpIHsgdHlwZSA9ICdzdHJpbmcnOyB9CiAgICAgIG9wdGlvbnNbbmFtZV0gPSB7CiAgICAgICAgdHlwZTogdHlwZSwKICAgICAgICBkZWZhdWx0VmFsdWU6IGRlZmF1bHRWYWx1ZQogICAgICB9OwogICAgICBzZXRPcHRpb24obmFtZSwgZGVmYXVsdFZhbHVlKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZXRPcHRpb24obmFtZSwgdmFsdWUpIHsKICAgICAgdmFyIG9wdGlvbiA9IG9wdGlvbnNbbmFtZV07CiAgICAgIGlmICghb3B0aW9uKSB7CiAgICAgICAgdGhyb3cgRXJyb3IoJ1Vua25vd24gb3B0aW9uOiAnICsgbmFtZSk7CiAgICAgIH0KICAgICAgaWYgKG9wdGlvbi50eXBlID09ICdib29sZWFuJykgewogICAgICAgIGlmICh2YWx1ZSAmJiB2YWx1ZSAhPT0gdHJ1ZSkgewogICAgICAgICAgdGhyb3cgRXJyb3IoJ0ludmFsaWQgYXJndW1lbnQ6ICcgKyBuYW1lICsgJz0nICsgdmFsdWUpOwogICAgICAgIH0gZWxzZSBpZiAodmFsdWUgIT09IGZhbHNlKSB7CiAgICAgICAgICAvLyBCb29sZWFuIG9wdGlvbnMgYXJlIHNldCB0byB0cnVlIGlmIHZhbHVlIGlzIG5vdCBkZWZpbmVkLgogICAgICAgICAgdmFsdWUgPSB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgICBvcHRpb24udmFsdWUgPSBvcHRpb24udHlwZSA9PSAnYm9vbGVhbicgPyAhIXZhbHVlIDogdmFsdWU7CiAgICB9CgogICAgZnVuY3Rpb24gZ2V0T3B0aW9uKG5hbWUpIHsKICAgICAgdmFyIG9wdGlvbiA9IG9wdGlvbnNbbmFtZV07CiAgICAgIGlmICghb3B0aW9uKSB7CiAgICAgICAgdGhyb3cgRXJyb3IoJ1Vua25vd24gb3B0aW9uOiAnICsgbmFtZSk7CiAgICAgIH0KICAgICAgcmV0dXJuIG9wdGlvbi52YWx1ZTsKICAgIH0KCiAgICB2YXIgY3JlYXRlQ2lyY3VsYXJKdW1wTGlzdCA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgc2l6ZSA9IDEwMDsKICAgICAgdmFyIHBvaW50ZXIgPSAtMTsKICAgICAgdmFyIGhlYWQgPSAwOwogICAgICB2YXIgdGFpbCA9IDA7CiAgICAgIHZhciBidWZmZXIgPSBuZXcgQXJyYXkoc2l6ZSk7CiAgICAgIGZ1bmN0aW9uIGFkZChjbSwgb2xkQ3VyLCBuZXdDdXIpIHsKICAgICAgICB2YXIgY3VycmVudCA9IHBvaW50ZXIgJSBzaXplOwogICAgICAgIHZhciBjdXJNYXJrID0gYnVmZmVyW2N1cnJlbnRdOwogICAgICAgIGZ1bmN0aW9uIHVzZU5leHRTbG90KGN1cnNvcikgewogICAgICAgICAgdmFyIG5leHQgPSArK3BvaW50ZXIgJSBzaXplOwogICAgICAgICAgdmFyIHRyYXNoTWFyayA9IGJ1ZmZlcltuZXh0XTsKICAgICAgICAgIGlmICh0cmFzaE1hcmspIHsKICAgICAgICAgICAgdHJhc2hNYXJrLmNsZWFyKCk7CiAgICAgICAgICB9CiAgICAgICAgICBidWZmZXJbbmV4dF0gPSBjbS5zZXRCb29rbWFyayhjdXJzb3IpOwogICAgICAgIH0KICAgICAgICBpZiAoY3VyTWFyaykgewogICAgICAgICAgdmFyIG1hcmtQb3MgPSBjdXJNYXJrLmZpbmQoKTsKICAgICAgICAgIC8vIGF2b2lkIHJlY29yZGluZyByZWR1bmRhbnQgY3Vyc29yIHBvc2l0aW9uCiAgICAgICAgICBpZiAobWFya1BvcyAmJiAhY3Vyc29yRXF1YWwobWFya1Bvcywgb2xkQ3VyKSkgewogICAgICAgICAgICB1c2VOZXh0U2xvdChvbGRDdXIpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB1c2VOZXh0U2xvdChvbGRDdXIpOwogICAgICAgIH0KICAgICAgICB1c2VOZXh0U2xvdChuZXdDdXIpOwogICAgICAgIGhlYWQgPSBwb2ludGVyOwogICAgICAgIHRhaWwgPSBwb2ludGVyIC0gc2l6ZSArIDE7CiAgICAgICAgaWYgKHRhaWwgPCAwKSB7CiAgICAgICAgICB0YWlsID0gMDsKICAgICAgICB9CiAgICAgIH0KICAgICAgZnVuY3Rpb24gbW92ZShjbSwgb2Zmc2V0KSB7CiAgICAgICAgcG9pbnRlciArPSBvZmZzZXQ7CiAgICAgICAgaWYgKHBvaW50ZXIgPiBoZWFkKSB7CiAgICAgICAgICBwb2ludGVyID0gaGVhZDsKICAgICAgICB9IGVsc2UgaWYgKHBvaW50ZXIgPCB0YWlsKSB7CiAgICAgICAgICBwb2ludGVyID0gdGFpbDsKICAgICAgICB9CiAgICAgICAgdmFyIG1hcmsgPSBidWZmZXJbKHNpemUgKyBwb2ludGVyKSAlIHNpemVdOwogICAgICAgIC8vIHNraXAgbWFya3MgdGhhdCBhcmUgdGVtcG9yYXJpbHkgcmVtb3ZlZCBmcm9tIHRleHQgYnVmZmVyCiAgICAgICAgaWYgKG1hcmsgJiYgIW1hcmsuZmluZCgpKSB7CiAgICAgICAgICB2YXIgaW5jID0gb2Zmc2V0ID4gMCA/IDEgOiAtMTsKICAgICAgICAgIHZhciBuZXdDdXI7CiAgICAgICAgICB2YXIgb2xkQ3VyID0gY20uZ2V0Q3Vyc29yKCk7CiAgICAgICAgICBkbyB7CiAgICAgICAgICAgIHBvaW50ZXIgKz0gaW5jOwogICAgICAgICAgICBtYXJrID0gYnVmZmVyWyhzaXplICsgcG9pbnRlcikgJSBzaXplXTsKICAgICAgICAgICAgLy8gc2tpcCBtYXJrcyB0aGF0IGFyZSB0aGUgc2FtZSBhcyBjdXJyZW50IHBvc2l0aW9uCiAgICAgICAgICAgIGlmIChtYXJrICYmCiAgICAgICAgICAgICAgICAobmV3Q3VyID0gbWFyay5maW5kKCkpICYmCiAgICAgICAgICAgICAgICAhY3Vyc29yRXF1YWwob2xkQ3VyLCBuZXdDdXIpKSB7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gd2hpbGUgKHBvaW50ZXIgPCBoZWFkICYmIHBvaW50ZXIgPiB0YWlsKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG1hcms7CiAgICAgIH0KICAgICAgcmV0dXJuIHsKICAgICAgICBjYWNoZWRDdXJzb3I6IHVuZGVmaW5lZCwgLy91c2VkIGZvciAjIGFuZCAqIGp1bXBzCiAgICAgICAgYWRkOiBhZGQsCiAgICAgICAgbW92ZTogbW92ZQogICAgICB9OwogICAgfTsKCiAgICAvLyBSZXR1cm5zIGFuIG9iamVjdCB0byB0cmFjayB0aGUgY2hhbmdlcyBhc3NvY2lhdGVkIGluc2VydCBtb2RlLiAgSXQKICAgIC8vIGNsb25lcyB0aGUgb2JqZWN0IHRoYXQgaXMgcGFzc2VkIGluLCBvciBjcmVhdGVzIGFuIGVtcHR5IG9iamVjdCBvbmUgaWYKICAgIC8vIG5vbmUgaXMgcHJvdmlkZWQuCiAgICB2YXIgY3JlYXRlSW5zZXJ0TW9kZUNoYW5nZXMgPSBmdW5jdGlvbihjKSB7CiAgICAgIGlmIChjKSB7CiAgICAgICAgLy8gQ29weSBjb25zdHJ1Y3Rpb24KICAgICAgICByZXR1cm4gewogICAgICAgICAgY2hhbmdlczogYy5jaGFuZ2VzLAogICAgICAgICAgZXhwZWN0Q3Vyc29yQWN0aXZpdHlGb3JDaGFuZ2U6IGMuZXhwZWN0Q3Vyc29yQWN0aXZpdHlGb3JDaGFuZ2UKICAgICAgICB9OwogICAgICB9CiAgICAgIHJldHVybiB7CiAgICAgICAgLy8gQ2hhbmdlIGxpc3QKICAgICAgICBjaGFuZ2VzOiBbXSwKICAgICAgICAvLyBTZXQgdG8gdHJ1ZSBvbiBjaGFuZ2UsIGZhbHNlIG9uIGN1cnNvckFjdGl2aXR5LgogICAgICAgIGV4cGVjdEN1cnNvckFjdGl2aXR5Rm9yQ2hhbmdlOiBmYWxzZQogICAgICB9OwogICAgfTsKCiAgICBmdW5jdGlvbiBNYWNyb01vZGVTdGF0ZSgpIHsKICAgICAgdGhpcy5sYXRlc3RSZWdpc3RlciA9IHVuZGVmaW5lZDsKICAgICAgdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTsKICAgICAgdGhpcy5pc1JlY29yZGluZyA9IGZhbHNlOwogICAgICB0aGlzLnJlcGxheVNlYXJjaFF1ZXJpZXMgPSBbXTsKICAgICAgdGhpcy5vblJlY29yZGluZ0RvbmUgPSB1bmRlZmluZWQ7CiAgICAgIHRoaXMubGFzdEluc2VydE1vZGVDaGFuZ2VzID0gY3JlYXRlSW5zZXJ0TW9kZUNoYW5nZXMoKTsKICAgIH0KICAgIE1hY3JvTW9kZVN0YXRlLnByb3RvdHlwZSA9IHsKICAgICAgZXhpdE1hY3JvUmVjb3JkTW9kZTogZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIG1hY3JvTW9kZVN0YXRlID0gdmltR2xvYmFsU3RhdGUubWFjcm9Nb2RlU3RhdGU7CiAgICAgICAgaWYgKG1hY3JvTW9kZVN0YXRlLm9uUmVjb3JkaW5nRG9uZSkgewogICAgICAgICAgbWFjcm9Nb2RlU3RhdGUub25SZWNvcmRpbmdEb25lKCk7IC8vIGNsb3NlIGRpYWxvZwogICAgICAgIH0KICAgICAgICBtYWNyb01vZGVTdGF0ZS5vblJlY29yZGluZ0RvbmUgPSB1bmRlZmluZWQ7CiAgICAgICAgbWFjcm9Nb2RlU3RhdGUuaXNSZWNvcmRpbmcgPSBmYWxzZTsKICAgICAgfSwKICAgICAgZW50ZXJNYWNyb1JlY29yZE1vZGU6IGZ1bmN0aW9uKGNtLCByZWdpc3Rlck5hbWUpIHsKICAgICAgICB2YXIgcmVnaXN0ZXIgPQogICAgICAgICAgICB2aW1HbG9iYWxTdGF0ZS5yZWdpc3RlckNvbnRyb2xsZXIuZ2V0UmVnaXN0ZXIocmVnaXN0ZXJOYW1lKTsKICAgICAgICBpZiAocmVnaXN0ZXIpIHsKICAgICAgICAgIHJlZ2lzdGVyLmNsZWFyKCk7CiAgICAgICAgICB0aGlzLmxhdGVzdFJlZ2lzdGVyID0gcmVnaXN0ZXJOYW1lOwogICAgICAgICAgaWYgKGNtLm9wZW5EaWFsb2cpIHsKICAgICAgICAgICAgdGhpcy5vblJlY29yZGluZ0RvbmUgPSBjbS5vcGVuRGlhbG9nKAogICAgICAgICAgICAgICAgJyhyZWNvcmRpbmcpWycrcmVnaXN0ZXJOYW1lKyddJywgbnVsbCwge2JvdHRvbTp0cnVlfSk7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLmlzUmVjb3JkaW5nID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KICAgIH07CgogICAgZnVuY3Rpb24gbWF5YmVJbml0VmltU3RhdGUoY20pIHsKICAgICAgaWYgKCFjbS5zdGF0ZS52aW0pIHsKICAgICAgICAvLyBTdG9yZSBpbnN0YW5jZSBzdGF0ZSBpbiB0aGUgQ29kZU1pcnJvciBvYmplY3QuCiAgICAgICAgY20uc3RhdGUudmltID0gewogICAgICAgICAgaW5wdXRTdGF0ZTogbmV3IElucHV0U3RhdGUoKSwKICAgICAgICAgIC8vIFZpbSdzIGlucHV0IHN0YXRlIHRoYXQgdHJpZ2dlcmVkIHRoZSBsYXN0IGVkaXQsIHVzZWQgdG8gcmVwZWF0CiAgICAgICAgICAvLyBtb3Rpb25zIGFuZCBvcGVyYXRvcnMgd2l0aCAnLicuCiAgICAgICAgICBsYXN0RWRpdElucHV0U3RhdGU6IHVuZGVmaW5lZCwKICAgICAgICAgIC8vIFZpbSdzIGFjdGlvbiBjb21tYW5kIGJlZm9yZSB0aGUgbGFzdCBlZGl0LCB1c2VkIHRvIHJlcGVhdCBhY3Rpb25zCiAgICAgICAgICAvLyB3aXRoICcuJyBhbmQgaW5zZXJ0IG1vZGUgcmVwZWF0LgogICAgICAgICAgbGFzdEVkaXRBY3Rpb25Db21tYW5kOiB1bmRlZmluZWQsCiAgICAgICAgICAvLyBXaGVuIHVzaW5nIGprIGZvciBuYXZpZ2F0aW9uLCBpZiB5b3UgbW92ZSBmcm9tIGEgbG9uZ2VyIGxpbmUgdG8gYQogICAgICAgICAgLy8gc2hvcnRlciBsaW5lLCB0aGUgY3Vyc29yIG1heSBjbGlwIHRvIHRoZSBlbmQgb2YgdGhlIHNob3J0ZXIgbGluZS4KICAgICAgICAgIC8vIElmIGogaXMgcHJlc3NlZCBhZ2FpbiBhbmQgY3Vyc29yIGdvZXMgdG8gdGhlIG5leHQgbGluZSwgdGhlCiAgICAgICAgICAvLyBjdXJzb3Igc2hvdWxkIGdvIGJhY2sgdG8gaXRzIGhvcml6b250YWwgcG9zaXRpb24gb24gdGhlIGxvbmdlcgogICAgICAgICAgLy8gbGluZSBpZiBpdCBjYW4uIFRoaXMgaXMgdG8ga2VlcCB0cmFjayBvZiB0aGUgaG9yaXpvbnRhbCBwb3NpdGlvbi4KICAgICAgICAgIGxhc3RIUG9zOiAtMSwKICAgICAgICAgIC8vIERvaW5nIHRoZSBzYW1lIHdpdGggc2NyZWVuLXBvc2l0aW9uIGZvciBnai9nawogICAgICAgICAgbGFzdEhTUG9zOiAtMSwKICAgICAgICAgIC8vIFRoZSBsYXN0IG1vdGlvbiBjb21tYW5kIHJ1bi4gQ2xlYXJlZCBpZiBhIG5vbi1tb3Rpb24gY29tbWFuZCBnZXRzCiAgICAgICAgICAvLyBleGVjdXRlZCBpbiBiZXR3ZWVuLgogICAgICAgICAgbGFzdE1vdGlvbjogbnVsbCwKICAgICAgICAgIG1hcmtzOiB7fSwKICAgICAgICAgIC8vIE1hcmsgZm9yIHJlbmRlcmluZyBmYWtlIGN1cnNvciBmb3IgdmlzdWFsIG1vZGUuCiAgICAgICAgICBmYWtlQ3Vyc29yOiBudWxsLAogICAgICAgICAgaW5zZXJ0TW9kZTogZmFsc2UsCiAgICAgICAgICAvLyBSZXBlYXQgY291bnQgZm9yIGNoYW5nZXMgbWFkZSBpbiBpbnNlcnQgbW9kZSwgdHJpZ2dlcmVkIGJ5IGtleQogICAgICAgICAgLy8gc2VxdWVuY2VzIGxpa2UgMyxpLiBPbmx5IGV4aXN0cyB3aGVuIGluc2VydE1vZGUgaXMgdHJ1ZS4KICAgICAgICAgIGluc2VydE1vZGVSZXBlYXQ6IHVuZGVmaW5lZCwKICAgICAgICAgIHZpc3VhbE1vZGU6IGZhbHNlLAogICAgICAgICAgLy8gSWYgd2UgYXJlIGluIHZpc3VhbCBsaW5lIG1vZGUuIE5vIGVmZmVjdCBpZiB2aXN1YWxNb2RlIGlzIGZhbHNlLgogICAgICAgICAgdmlzdWFsTGluZTogZmFsc2UsCiAgICAgICAgICB2aXN1YWxCbG9jazogZmFsc2UsCiAgICAgICAgICBsYXN0U2VsZWN0aW9uOiBudWxsLAogICAgICAgICAgbGFzdFBhc3RlZFRleHQ6IG51bGwKICAgICAgICB9OwogICAgICB9CiAgICAgIHJldHVybiBjbS5zdGF0ZS52aW07CiAgICB9CiAgICB2YXIgdmltR2xvYmFsU3RhdGU7CiAgICBmdW5jdGlvbiByZXNldFZpbUdsb2JhbFN0YXRlKCkgewogICAgICB2aW1HbG9iYWxTdGF0ZSA9IHsKICAgICAgICAvLyBUaGUgY3VycmVudCBzZWFyY2ggcXVlcnkuCiAgICAgICAgc2VhcmNoUXVlcnk6IG51bGwsCiAgICAgICAgLy8gV2hldGhlciB3ZSBhcmUgc2VhcmNoaW5nIGJhY2t3YXJkcy4KICAgICAgICBzZWFyY2hJc1JldmVyc2VkOiBmYWxzZSwKICAgICAgICAvLyBSZXBsYWNlIHBhcnQgb2YgdGhlIGxhc3Qgc3Vic3RpdHV0ZWQgcGF0dGVybgogICAgICAgIGxhc3RTdWJzdGl0dXRlUmVwbGFjZVBhcnQ6IHVuZGVmaW5lZCwKICAgICAgICBqdW1wTGlzdDogY3JlYXRlQ2lyY3VsYXJKdW1wTGlzdCgpLAogICAgICAgIG1hY3JvTW9kZVN0YXRlOiBuZXcgTWFjcm9Nb2RlU3RhdGUsCiAgICAgICAgLy8gUmVjb3JkaW5nIGxhdGVzdCBmLCB0LCBGIG9yIFQgbW90aW9uIGNvbW1hbmQuCiAgICAgICAgbGFzdENoYXJhcmFjdGVyU2VhcmNoOiB7aW5jcmVtZW50OjAsIGZvcndhcmQ6dHJ1ZSwgc2VsZWN0ZWRDaGFyYWN0ZXI6Jyd9LAogICAgICAgIHJlZ2lzdGVyQ29udHJvbGxlcjogbmV3IFJlZ2lzdGVyQ29udHJvbGxlcih7fSksCiAgICAgICAgLy8gc2VhcmNoIGhpc3RvcnkgYnVmZmVyCiAgICAgICAgc2VhcmNoSGlzdG9yeUNvbnRyb2xsZXI6IG5ldyBIaXN0b3J5Q29udHJvbGxlcih7fSksCiAgICAgICAgLy8gZXggQ29tbWFuZCBoaXN0b3J5IGJ1ZmZlcgogICAgICAgIGV4Q29tbWFuZEhpc3RvcnlDb250cm9sbGVyIDogbmV3IEhpc3RvcnlDb250cm9sbGVyKHt9KQogICAgICB9OwogICAgICBmb3IgKHZhciBvcHRpb25OYW1lIGluIG9wdGlvbnMpIHsKICAgICAgICB2YXIgb3B0aW9uID0gb3B0aW9uc1tvcHRpb25OYW1lXTsKICAgICAgICBvcHRpb24udmFsdWUgPSBvcHRpb24uZGVmYXVsdFZhbHVlOwogICAgICB9CiAgICB9CgogICAgdmFyIHZpbUFwaT0gewogICAgICBidWlsZEtleU1hcDogZnVuY3Rpb24oKSB7CiAgICAgICAgLy8gVE9ETzogQ29udmVydCBrZXltYXAgaW50byBkaWN0aW9uYXJ5IGZvcm1hdCBmb3IgZmFzdCBsb29rdXAuCiAgICAgIH0sCiAgICAgIC8vIFRlc3RpbmcgaG9vaywgdGhvdWdoIGl0IG1pZ2h0IGJlIHVzZWZ1bCB0byBleHBvc2UgdGhlIHJlZ2lzdGVyCiAgICAgIC8vIGNvbnRyb2xsZXIgYW55d2F5cy4KICAgICAgZ2V0UmVnaXN0ZXJDb250cm9sbGVyOiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdmltR2xvYmFsU3RhdGUucmVnaXN0ZXJDb250cm9sbGVyOwogICAgICB9LAogICAgICAvLyBUZXN0aW5nIGhvb2suCiAgICAgIHJlc2V0VmltR2xvYmFsU3RhdGVfOiByZXNldFZpbUdsb2JhbFN0YXRlLAoKICAgICAgLy8gVGVzdGluZyBob29rLgogICAgICBnZXRWaW1HbG9iYWxTdGF0ZV86IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB2aW1HbG9iYWxTdGF0ZTsKICAgICAgfSwKCiAgICAgIC8vIFRlc3RpbmcgaG9vay4KICAgICAgbWF5YmVJbml0VmltU3RhdGVfOiBtYXliZUluaXRWaW1TdGF0ZSwKCiAgICAgIEluc2VydE1vZGVLZXk6IEluc2VydE1vZGVLZXksCiAgICAgIG1hcDogZnVuY3Rpb24obGhzLCByaHMsIGN0eCkgewogICAgICAgIC8vIEFkZCB1c2VyIGRlZmluZWQga2V5IGJpbmRpbmdzLgogICAgICAgIGV4Q29tbWFuZERpc3BhdGNoZXIubWFwKGxocywgcmhzLCBjdHgpOwogICAgICB9LAogICAgICBzZXRPcHRpb246IHNldE9wdGlvbiwKICAgICAgZ2V0T3B0aW9uOiBnZXRPcHRpb24sCiAgICAgIGRlZmluZU9wdGlvbjogZGVmaW5lT3B0aW9uLAogICAgICBkZWZpbmVFeDogZnVuY3Rpb24obmFtZSwgcHJlZml4LCBmdW5jKXsKICAgICAgICBpZiAobmFtZS5pbmRleE9mKHByZWZpeCkgIT09IDApIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcignKFZpbS5kZWZpbmVFeCkgIicrcHJlZml4KyciIGlzIG5vdCBhIHByZWZpeCBvZiAiJytuYW1lKyciLCBjb21tYW5kIG5vdCByZWdpc3RlcmVkJyk7CiAgICAgICAgfQogICAgICAgIGV4Q29tbWFuZHNbbmFtZV09ZnVuYzsKICAgICAgICBleENvbW1hbmREaXNwYXRjaGVyLmNvbW1hbmRNYXBfW3ByZWZpeF09e25hbWU6bmFtZSwgc2hvcnROYW1lOnByZWZpeCwgdHlwZTonYXBpJ307CiAgICAgIH0sCiAgICAgIC8vIFRoaXMgaXMgdGhlIG91dGVybW9zdCBmdW5jdGlvbiBjYWxsZWQgYnkgQ29kZU1pcnJvciwgYWZ0ZXIga2V5cyBoYXZlCiAgICAgIC8vIGJlZW4gbWFwcGVkIHRvIHRoZWlyIFZpbSBlcXVpdmFsZW50cy4KICAgICAgaGFuZGxlS2V5OiBmdW5jdGlvbihjbSwga2V5KSB7CiAgICAgICAgdmFyIGNvbW1hbmQ7CiAgICAgICAgdmFyIHZpbSA9IG1heWJlSW5pdFZpbVN0YXRlKGNtKTsKICAgICAgICB2YXIgbWFjcm9Nb2RlU3RhdGUgPSB2aW1HbG9iYWxTdGF0ZS5tYWNyb01vZGVTdGF0ZTsKICAgICAgICBpZiAobWFjcm9Nb2RlU3RhdGUuaXNSZWNvcmRpbmcpIHsKICAgICAgICAgIGlmIChrZXkgPT0gJ3EnKSB7CiAgICAgICAgICAgIG1hY3JvTW9kZVN0YXRlLmV4aXRNYWNyb1JlY29yZE1vZGUoKTsKICAgICAgICAgICAgY2xlYXJJbnB1dFN0YXRlKGNtKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoa2V5ID09ICc8RXNjPicpIHsKICAgICAgICAgIC8vIENsZWFyIGlucHV0IHN0YXRlIGFuZCBnZXQgYmFjayB0byBub3JtYWwgbW9kZS4KICAgICAgICAgIGNsZWFySW5wdXRTdGF0ZShjbSk7CiAgICAgICAgICBpZiAodmltLnZpc3VhbE1vZGUpIHsKICAgICAgICAgICAgZXhpdFZpc3VhbE1vZGUoY20pOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAvLyBFbnRlciB2aXN1YWwgbW9kZSB3aGVuIHRoZSBtb3VzZSBzZWxlY3RzIHRleHQuCiAgICAgICAgaWYgKCF2aW0udmlzdWFsTW9kZSAmJgogICAgICAgICAgICAhY3Vyc29yRXF1YWwoY20uZ2V0Q3Vyc29yKCdoZWFkJyksIGNtLmdldEN1cnNvcignYW5jaG9yJykpKSB7CiAgICAgICAgICB2aW0udmlzdWFsTW9kZSA9IHRydWU7CiAgICAgICAgICB2aW0udmlzdWFsTGluZSA9IGZhbHNlOwogICAgICAgICAgQ29kZU1pcnJvci5zaWduYWwoY20sICJ2aW0tbW9kZS1jaGFuZ2UiLCB7bW9kZTogInZpc3VhbCJ9KTsKICAgICAgICAgIGNtLm9uKCdtb3VzZWRvd24nLCBleGl0VmlzdWFsTW9kZSk7CiAgICAgICAgfQogICAgICAgIGlmIChrZXkgIT0gJzAnIHx8IChrZXkgPT0gJzAnICYmIHZpbS5pbnB1dFN0YXRlLmdldFJlcGVhdCgpID09PSAwKSkgewogICAgICAgICAgLy8gSGF2ZSB0byBzcGVjaWFsIGNhc2UgMCBzaW5jZSBpdCdzIGJvdGggYSBtb3Rpb24gYW5kIGEgbnVtYmVyLgogICAgICAgICAgY29tbWFuZCA9IGNvbW1hbmREaXNwYXRjaGVyLm1hdGNoQ29tbWFuZChrZXksIGRlZmF1bHRLZXltYXAsIHZpbSk7CiAgICAgICAgfQogICAgICAgIGlmICghY29tbWFuZCkgewogICAgICAgICAgaWYgKGlzTnVtYmVyKGtleSkpIHsKICAgICAgICAgICAgLy8gSW5jcmVtZW50IGNvdW50IHVubGVzcyBjb3VudCBpcyAwIGFuZCBrZXkgaXMgMC4KICAgICAgICAgICAgdmltLmlucHV0U3RhdGUucHVzaFJlcGVhdERpZ2l0KGtleSk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAobWFjcm9Nb2RlU3RhdGUuaXNSZWNvcmRpbmcpIHsKICAgICAgICAgICAgbG9nS2V5KG1hY3JvTW9kZVN0YXRlLCBrZXkpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoY29tbWFuZC50eXBlID09ICdrZXlUb0tleScpIHsKICAgICAgICAgIC8vIFRPRE86IHByZXZlbnQgaW5maW5pdGUgcmVjdXJzaW9uLgogICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb21tYW5kLnRvS2V5cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICB0aGlzLmhhbmRsZUtleShjbSwgY29tbWFuZC50b0tleXNbaV0pOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAobWFjcm9Nb2RlU3RhdGUuaXNSZWNvcmRpbmcpIHsKICAgICAgICAgICAgbG9nS2V5KG1hY3JvTW9kZVN0YXRlLCBrZXkpOwogICAgICAgICAgfQogICAgICAgICAgY29tbWFuZERpc3BhdGNoZXIucHJvY2Vzc0NvbW1hbmQoY20sIHZpbSwgY29tbWFuZCk7CiAgICAgICAgfQogICAgICB9LAogICAgICBoYW5kbGVFeDogZnVuY3Rpb24oY20sIGlucHV0KSB7CiAgICAgICAgZXhDb21tYW5kRGlzcGF0Y2hlci5wcm9jZXNzQ29tbWFuZChjbSwgaW5wdXQpOwogICAgICB9CiAgICB9OwoKICAgIC8vIFJlcHJlc2VudHMgdGhlIGN1cnJlbnQgaW5wdXQgc3RhdGUuCiAgICBmdW5jdGlvbiBJbnB1dFN0YXRlKCkgewogICAgICB0aGlzLnByZWZpeFJlcGVhdCA9IFtdOwogICAgICB0aGlzLm1vdGlvblJlcGVhdCA9IFtdOwoKICAgICAgdGhpcy5vcGVyYXRvciA9IG51bGw7CiAgICAgIHRoaXMub3BlcmF0b3JBcmdzID0gbnVsbDsKICAgICAgdGhpcy5tb3Rpb24gPSBudWxsOwogICAgICB0aGlzLm1vdGlvbkFyZ3MgPSBudWxsOwogICAgICB0aGlzLmtleUJ1ZmZlciA9IFtdOyAvLyBGb3IgbWF0Y2hpbmcgbXVsdGkta2V5IGNvbW1hbmRzLgogICAgICB0aGlzLnJlZ2lzdGVyTmFtZSA9IG51bGw7IC8vIERlZmF1bHRzIHRvIHRoZSB1bm5hbWVkIHJlZ2lzdGVyLgogICAgfQogICAgSW5wdXRTdGF0ZS5wcm90b3R5cGUucHVzaFJlcGVhdERpZ2l0ID0gZnVuY3Rpb24obikgewogICAgICBpZiAoIXRoaXMub3BlcmF0b3IpIHsKICAgICAgICB0aGlzLnByZWZpeFJlcGVhdCA9IHRoaXMucHJlZml4UmVwZWF0LmNvbmNhdChuKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0aGlzLm1vdGlvblJlcGVhdCA9IHRoaXMubW90aW9uUmVwZWF0LmNvbmNhdChuKTsKICAgICAgfQogICAgfTsKICAgIElucHV0U3RhdGUucHJvdG90eXBlLmdldFJlcGVhdCA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgcmVwZWF0ID0gMDsKICAgICAgaWYgKHRoaXMucHJlZml4UmVwZWF0Lmxlbmd0aCA+IDAgfHwgdGhpcy5tb3Rpb25SZXBlYXQubGVuZ3RoID4gMCkgewogICAgICAgIHJlcGVhdCA9IDE7CiAgICAgICAgaWYgKHRoaXMucHJlZml4UmVwZWF0Lmxlbmd0aCA+IDApIHsKICAgICAgICAgIHJlcGVhdCAqPSBwYXJzZUludCh0aGlzLnByZWZpeFJlcGVhdC5qb2luKCcnKSwgMTApOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5tb3Rpb25SZXBlYXQubGVuZ3RoID4gMCkgewogICAgICAgICAgcmVwZWF0ICo9IHBhcnNlSW50KHRoaXMubW90aW9uUmVwZWF0LmpvaW4oJycpLCAxMCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiByZXBlYXQ7CiAgICB9OwoKICAgIGZ1bmN0aW9uIGNsZWFySW5wdXRTdGF0ZShjbSwgcmVhc29uKSB7CiAgICAgIGNtLnN0YXRlLnZpbS5pbnB1dFN0YXRlID0gbmV3IElucHV0U3RhdGUoKTsKICAgICAgQ29kZU1pcnJvci5zaWduYWwoY20sICd2aW0tY29tbWFuZC1kb25lJywgcmVhc29uKTsKICAgIH0KCiAgICAvKgogICAgICogUmVnaXN0ZXIgc3RvcmVzIGluZm9ybWF0aW9uIGFib3V0IGNvcHkgYW5kIHBhc3RlIHJlZ2lzdGVycy4gIEJlc2lkZXMKICAgICAqIHRleHQsIGEgcmVnaXN0ZXIgbXVzdCBzdG9yZSB3aGV0aGVyIGl0IGlzIGxpbmV3aXNlIChpLmUuLCB3aGVuIGl0IGlzCiAgICAgKiBwYXN0ZWQsIHNob3VsZCBpdCBpbnNlcnQgaXRzZWxmIGludG8gYSBuZXcgbGluZSwgb3Igc2hvdWxkIHRoZSB0ZXh0IGJlCiAgICAgKiBpbnNlcnRlZCBhdCB0aGUgY3Vyc29yIHBvc2l0aW9uLikKICAgICAqLwogICAgZnVuY3Rpb24gUmVnaXN0ZXIodGV4dCwgbGluZXdpc2UpIHsKICAgICAgdGhpcy5jbGVhcigpOwogICAgICB0aGlzLmtleUJ1ZmZlciA9IFt0ZXh0IHx8ICcnXTsKICAgICAgdGhpcy5pbnNlcnRNb2RlQ2hhbmdlcyA9IFtdOwogICAgICB0aGlzLnNlYXJjaFF1ZXJpZXMgPSBbXTsKICAgICAgdGhpcy5saW5ld2lzZSA9ICEhbGluZXdpc2U7CiAgICB9CiAgICBSZWdpc3Rlci5wcm90b3R5cGUgPSB7CiAgICAgIHNldFRleHQ6IGZ1bmN0aW9uKHRleHQsIGxpbmV3aXNlKSB7CiAgICAgICAgdGhpcy5rZXlCdWZmZXIgPSBbdGV4dCB8fCAnJ107CiAgICAgICAgdGhpcy5saW5ld2lzZSA9ICEhbGluZXdpc2U7CiAgICAgIH0sCiAgICAgIHB1c2hUZXh0OiBmdW5jdGlvbih0ZXh0LCBsaW5ld2lzZSkgewogICAgICAgIC8vIGlmIHRoaXMgcmVnaXN0ZXIgaGFzIGV2ZXIgYmVlbiBzZXQgdG8gbGluZXdpc2UsIHVzZSBsaW5ld2lzZS4KICAgICAgICBpZiAobGluZXdpc2UpIHsKICAgICAgICAgIGlmICghdGhpcy5saW5ld2lzZSkgewogICAgICAgICAgICB0aGlzLmtleUJ1ZmZlci5wdXNoKCdcbicpOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5saW5ld2lzZSA9IHRydWU7CiAgICAgICAgfQogICAgICAgIHRoaXMua2V5QnVmZmVyLnB1c2godGV4dCk7CiAgICAgIH0sCiAgICAgIHB1c2hJbnNlcnRNb2RlQ2hhbmdlczogZnVuY3Rpb24oY2hhbmdlcykgewogICAgICAgIHRoaXMuaW5zZXJ0TW9kZUNoYW5nZXMucHVzaChjcmVhdGVJbnNlcnRNb2RlQ2hhbmdlcyhjaGFuZ2VzKSk7CiAgICAgIH0sCiAgICAgIHB1c2hTZWFyY2hRdWVyeTogZnVuY3Rpb24ocXVlcnkpIHsKICAgICAgICB0aGlzLnNlYXJjaFF1ZXJpZXMucHVzaChxdWVyeSk7CiAgICAgIH0sCiAgICAgIGNsZWFyOiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLmtleUJ1ZmZlciA9IFtdOwogICAgICAgIHRoaXMuaW5zZXJ0TW9kZUNoYW5nZXMgPSBbXTsKICAgICAgICB0aGlzLnNlYXJjaFF1ZXJpZXMgPSBbXTsKICAgICAgICB0aGlzLmxpbmV3aXNlID0gZmFsc2U7CiAgICAgIH0sCiAgICAgIHRvU3RyaW5nOiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5rZXlCdWZmZXIuam9pbignJyk7CiAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIHZpbSByZWdpc3RlcnMgYWxsb3cgeW91IHRvIGtlZXAgbWFueSBpbmRlcGVuZGVudCBjb3B5IGFuZCBwYXN0ZSBidWZmZXJzLgogICAgICogU2VlIGh0dHA6Ly91c2V2aW0uY29tLzIwMTIvMDQvMTMvcmVnaXN0ZXJzLyBmb3IgYW4gaW50cm9kdWN0aW9uLgogICAgICoKICAgICAqIFJlZ2lzdGVyQ29udHJvbGxlciBrZWVwcyB0aGUgc3RhdGUgb2YgYWxsIHRoZSByZWdpc3RlcnMuICBBbiBpbml0aWFsCiAgICAgKiBzdGF0ZSBtYXkgYmUgcGFzc2VkIGluLiAgVGhlIHVubmFtZWQgcmVnaXN0ZXIgJyInIHdpbGwgYWx3YXlzIGJlCiAgICAgKiBvdmVycmlkZGVuLgogICAgICovCiAgICBmdW5jdGlvbiBSZWdpc3RlckNvbnRyb2xsZXIocmVnaXN0ZXJzKSB7CiAgICAgIHRoaXMucmVnaXN0ZXJzID0gcmVnaXN0ZXJzOwogICAgICB0aGlzLnVubmFtZWRSZWdpc3RlciA9IHJlZ2lzdGVyc1snIiddID0gbmV3IFJlZ2lzdGVyKCk7CiAgICAgIHJlZ2lzdGVyc1snLiddID0gbmV3IFJlZ2lzdGVyKCk7CiAgICAgIHJlZ2lzdGVyc1snOiddID0gbmV3IFJlZ2lzdGVyKCk7CiAgICAgIHJlZ2lzdGVyc1snLyddID0gbmV3IFJlZ2lzdGVyKCk7CiAgICB9CiAgICBSZWdpc3RlckNvbnRyb2xsZXIucHJvdG90eXBlID0gewogICAgICBwdXNoVGV4dDogZnVuY3Rpb24ocmVnaXN0ZXJOYW1lLCBvcGVyYXRvciwgdGV4dCwgbGluZXdpc2UpIHsKICAgICAgICBpZiAobGluZXdpc2UgJiYgdGV4dC5jaGFyQXQoMCkgPT0gJ1xuJykgewogICAgICAgICAgdGV4dCA9IHRleHQuc2xpY2UoMSkgKyAnXG4nOwogICAgICAgIH0KICAgICAgICBpZiAobGluZXdpc2UgJiYgdGV4dC5jaGFyQXQodGV4dC5sZW5ndGggLSAxKSAhPT0gJ1xuJyl7CiAgICAgICAgICB0ZXh0ICs9ICdcbic7CiAgICAgICAgfQogICAgICAgIC8vIExvd2VyY2FzZSBhbmQgdXBwZXJjYXNlIHJlZ2lzdGVycyByZWZlciB0byB0aGUgc2FtZSByZWdpc3Rlci4KICAgICAgICAvLyBVcHBlcmNhc2UganVzdCBtZWFucyBhcHBlbmQuCiAgICAgICAgdmFyIHJlZ2lzdGVyID0gdGhpcy5pc1ZhbGlkUmVnaXN0ZXIocmVnaXN0ZXJOYW1lKSA/CiAgICAgICAgICAgIHRoaXMuZ2V0UmVnaXN0ZXIocmVnaXN0ZXJOYW1lKSA6IG51bGw7CiAgICAgICAgLy8gaWYgbm8gcmVnaXN0ZXIvYW4gaW52YWxpZCByZWdpc3RlciB3YXMgc3BlY2lmaWVkLCB0aGluZ3MgZ28gdG8gdGhlCiAgICAgICAgLy8gZGVmYXVsdCByZWdpc3RlcnMKICAgICAgICBpZiAoIXJlZ2lzdGVyKSB7CiAgICAgICAgICBzd2l0Y2ggKG9wZXJhdG9yKSB7CiAgICAgICAgICAgIGNhc2UgJ3lhbmsnOgogICAgICAgICAgICAgIC8vIFRoZSAwIHJlZ2lzdGVyIGNvbnRhaW5zIHRoZSB0ZXh0IGZyb20gdGhlIG1vc3QgcmVjZW50IHlhbmsuCiAgICAgICAgICAgICAgdGhpcy5yZWdpc3RlcnNbJzAnXSA9IG5ldyBSZWdpc3Rlcih0ZXh0LCBsaW5ld2lzZSk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2RlbGV0ZSc6CiAgICAgICAgICAgIGNhc2UgJ2NoYW5nZSc6CiAgICAgICAgICAgICAgaWYgKHRleHQuaW5kZXhPZignXG4nKSA9PSAtMSkgewogICAgICAgICAgICAgICAgLy8gRGVsZXRlIGxlc3MgdGhhbiAxIGxpbmUuIFVwZGF0ZSB0aGUgc21hbGwgZGVsZXRlIHJlZ2lzdGVyLgogICAgICAgICAgICAgICAgdGhpcy5yZWdpc3RlcnNbJy0nXSA9IG5ldyBSZWdpc3Rlcih0ZXh0LCBsaW5ld2lzZSk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIFNoaWZ0IGRvd24gdGhlIGNvbnRlbnRzIG9mIHRoZSBudW1iZXJlZCByZWdpc3RlcnMgYW5kIHB1dCB0aGUKICAgICAgICAgICAgICAgIC8vIGRlbGV0ZWQgdGV4dCBpbnRvIHJlZ2lzdGVyIDEuCiAgICAgICAgICAgICAgICB0aGlzLnNoaWZ0TnVtZXJpY1JlZ2lzdGVyc18oKTsKICAgICAgICAgICAgICAgIHRoaXMucmVnaXN0ZXJzWycxJ10gPSBuZXcgUmVnaXN0ZXIodGV4dCwgbGluZXdpc2UpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgdW5uYW1lZCByZWdpc3RlciBpcyBzZXQgdG8gd2hhdCBqdXN0IGhhcHBlbmVkCiAgICAgICAgICB0aGlzLnVubmFtZWRSZWdpc3Rlci5zZXRUZXh0KHRleHQsIGxpbmV3aXNlKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIElmIHdlJ3ZlIGdvdHRlbiB0byB0aGlzIHBvaW50LCB3ZSd2ZSBhY3R1YWxseSBzcGVjaWZpZWQgYSByZWdpc3RlcgogICAgICAgIHZhciBhcHBlbmQgPSBpc1VwcGVyQ2FzZShyZWdpc3Rlck5hbWUpOwogICAgICAgIGlmIChhcHBlbmQpIHsKICAgICAgICAgIHJlZ2lzdGVyLnB1c2hUZXh0KHRleHQsIGxpbmV3aXNlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmVnaXN0ZXIuc2V0VGV4dCh0ZXh0LCBsaW5ld2lzZSk7CiAgICAgICAgfQogICAgICAgIC8vIFRoZSB1bm5hbWVkIHJlZ2lzdGVyIGFsd2F5cyBoYXMgdGhlIHNhbWUgdmFsdWUgYXMgdGhlIGxhc3QgdXNlZAogICAgICAgIC8vIHJlZ2lzdGVyLgogICAgICAgIHRoaXMudW5uYW1lZFJlZ2lzdGVyLnNldFRleHQocmVnaXN0ZXIudG9TdHJpbmcoKSwgbGluZXdpc2UpOwogICAgICB9LAogICAgICAvLyBHZXRzIHRoZSByZWdpc3RlciBuYW1lZCBAbmFtZS4gIElmIG9uZSBvZiBAbmFtZSBkb2Vzbid0IGFscmVhZHkgZXhpc3QsCiAgICAgIC8vIGNyZWF0ZSBpdC4gIElmIEBuYW1lIGlzIGludmFsaWQsIHJldHVybiB0aGUgdW5uYW1lZFJlZ2lzdGVyLgogICAgICBnZXRSZWdpc3RlcjogZnVuY3Rpb24obmFtZSkgewogICAgICAgIGlmICghdGhpcy5pc1ZhbGlkUmVnaXN0ZXIobmFtZSkpIHsKICAgICAgICAgIHJldHVybiB0aGlzLnVubmFtZWRSZWdpc3RlcjsKICAgICAgICB9CiAgICAgICAgbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTsKICAgICAgICBpZiAoIXRoaXMucmVnaXN0ZXJzW25hbWVdKSB7CiAgICAgICAgICB0aGlzLnJlZ2lzdGVyc1tuYW1lXSA9IG5ldyBSZWdpc3RlcigpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5yZWdpc3RlcnNbbmFtZV07CiAgICAgIH0sCiAgICAgIGlzVmFsaWRSZWdpc3RlcjogZnVuY3Rpb24obmFtZSkgewogICAgICAgIHJldHVybiBuYW1lICYmIGluQXJyYXkobmFtZSwgdmFsaWRSZWdpc3RlcnMpOwogICAgICB9LAogICAgICBzaGlmdE51bWVyaWNSZWdpc3RlcnNfOiBmdW5jdGlvbigpIHsKICAgICAgICBmb3IgKHZhciBpID0gOTsgaSA+PSAyOyBpLS0pIHsKICAgICAgICAgIHRoaXMucmVnaXN0ZXJzW2ldID0gdGhpcy5nZXRSZWdpc3RlcignJyArIChpIC0gMSkpOwogICAgICAgIH0KICAgICAgfQogICAgfTsKICAgIGZ1bmN0aW9uIEhpc3RvcnlDb250cm9sbGVyKCkgewogICAgICAgIHRoaXMuaGlzdG9yeUJ1ZmZlciA9IFtdOwogICAgICAgIHRoaXMuaXRlcmF0b3I7CiAgICAgICAgdGhpcy5pbml0aWFsUHJlZml4ID0gbnVsbDsKICAgIH0KICAgIEhpc3RvcnlDb250cm9sbGVyLnByb3RvdHlwZSA9IHsKICAgICAgLy8gdGhlIGlucHV0IGFyZ3VtZW50IGhlcmUgYWN0cyBhIHVzZXIgZW50ZXJlZCBwcmVmaXggZm9yIGEgc21hbGwgdGltZQogICAgICAvLyB1bnRpbCB3ZSBzdGFydCBhdXRvY29tcGxldGlvbiBpbiB3aGljaCBjYXNlIGl0IGlzIHRoZSBhdXRvY29tcGxldGVkLgogICAgICBuZXh0TWF0Y2g6IGZ1bmN0aW9uIChpbnB1dCwgdXApIHsKICAgICAgICB2YXIgaGlzdG9yeUJ1ZmZlciA9IHRoaXMuaGlzdG9yeUJ1ZmZlcjsKICAgICAgICB2YXIgZGlyID0gdXAgPyAtMSA6IDE7CiAgICAgICAgaWYgKHRoaXMuaW5pdGlhbFByZWZpeCA9PT0gbnVsbCkgdGhpcy5pbml0aWFsUHJlZml4ID0gaW5wdXQ7CiAgICAgICAgZm9yICh2YXIgaSA9IHRoaXMuaXRlcmF0b3IgKyBkaXI7IHVwID8gaSA+PSAwIDogaSA8IGhpc3RvcnlCdWZmZXIubGVuZ3RoOyBpKz0gZGlyKSB7CiAgICAgICAgICB2YXIgZWxlbWVudCA9IGhpc3RvcnlCdWZmZXJbaV07CiAgICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8PSBlbGVtZW50Lmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgIGlmICh0aGlzLmluaXRpYWxQcmVmaXggPT0gZWxlbWVudC5zdWJzdHJpbmcoMCwgaikpIHsKICAgICAgICAgICAgICB0aGlzLml0ZXJhdG9yID0gaTsKICAgICAgICAgICAgICByZXR1cm4gZWxlbWVudDsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBzaG91bGQgcmV0dXJuIHRoZSB1c2VyIGlucHV0IGluIGNhc2Ugd2UgcmVhY2ggdGhlIGVuZCBvZiBidWZmZXIuCiAgICAgICAgaWYgKGkgPj0gaGlzdG9yeUJ1ZmZlci5sZW5ndGgpIHsKICAgICAgICAgIHRoaXMuaXRlcmF0b3IgPSBoaXN0b3J5QnVmZmVyLmxlbmd0aDsKICAgICAgICAgIHJldHVybiB0aGlzLmluaXRpYWxQcmVmaXg7CiAgICAgICAgfQogICAgICAgIC8vIHJldHVybiB0aGUgbGFzdCBhdXRvY29tcGxldGVkIHF1ZXJ5IG9yIGV4Q29tbWFuZCBhcyBpdCBpcy4KICAgICAgICBpZiAoaSA8IDAgKSByZXR1cm4gaW5wdXQ7CiAgICAgIH0sCiAgICAgIHB1c2hJbnB1dDogZnVuY3Rpb24oaW5wdXQpIHsKICAgICAgICB2YXIgaW5kZXggPSB0aGlzLmhpc3RvcnlCdWZmZXIuaW5kZXhPZihpbnB1dCk7CiAgICAgICAgaWYgKGluZGV4ID4gLTEpIHRoaXMuaGlzdG9yeUJ1ZmZlci5zcGxpY2UoaW5kZXgsIDEpOwogICAgICAgIGlmIChpbnB1dC5sZW5ndGgpIHRoaXMuaGlzdG9yeUJ1ZmZlci5wdXNoKGlucHV0KTsKICAgICAgfSwKICAgICAgcmVzZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuaW5pdGlhbFByZWZpeCA9IG51bGw7CiAgICAgICAgdGhpcy5pdGVyYXRvciA9IHRoaXMuaGlzdG9yeUJ1ZmZlci5sZW5ndGg7CiAgICAgIH0KICAgIH07CiAgICB2YXIgY29tbWFuZERpc3BhdGNoZXIgPSB7CiAgICAgIG1hdGNoQ29tbWFuZDogZnVuY3Rpb24oa2V5LCBrZXlNYXAsIHZpbSkgewogICAgICAgIHZhciBpbnB1dFN0YXRlID0gdmltLmlucHV0U3RhdGU7CiAgICAgICAgdmFyIGtleXMgPSBpbnB1dFN0YXRlLmtleUJ1ZmZlci5jb25jYXQoa2V5KTsKICAgICAgICB2YXIgbWF0Y2hlZENvbW1hbmRzID0gW107CiAgICAgICAgdmFyIHNlbGVjdGVkQ2hhcmFjdGVyOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5TWFwLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB2YXIgY29tbWFuZCA9IGtleU1hcFtpXTsKICAgICAgICAgIGlmIChtYXRjaEtleXNQYXJ0aWFsKGtleXMsIGNvbW1hbmQua2V5cykpIHsKICAgICAgICAgICAgaWYgKGlucHV0U3RhdGUub3BlcmF0b3IgJiYgY29tbWFuZC50eXBlID09ICdhY3Rpb24nKSB7CiAgICAgICAgICAgICAgLy8gSWdub3JlIG1hdGNoZWQgYWN0aW9uIGNvbW1hbmRzIGFmdGVyIGFuIG9wZXJhdG9yLiBPcGVyYXRvcnMKICAgICAgICAgICAgICAvLyBvbmx5IG9wZXJhdGUgb24gbW90aW9ucy4gVGhpcyBjaGVjayBpcyByZWFsbHkgZm9yIHRleHQKICAgICAgICAgICAgICAvLyBvYmplY3RzIHNpbmNlIGFXLCBhWyBldGNzIGNvbmZsaWN0cyB3aXRoIGEuCiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gTWF0Y2ggY29tbWFuZHMgdGhhdCB0YWtlIDxjaGFyYWN0ZXI+IGFzIGFuIGFyZ3VtZW50LgogICAgICAgICAgICBpZiAoY29tbWFuZC5rZXlzW2tleXMubGVuZ3RoIC0gMV0gPT0gJ2NoYXJhY3RlcicpIHsKICAgICAgICAgICAgICBzZWxlY3RlZENoYXJhY3RlciA9IGtleXNba2V5cy5sZW5ndGggLSAxXTsKICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRDaGFyYWN0ZXIubGVuZ3RoPjEpewogICAgICAgICAgICAgICAgc3dpdGNoKHNlbGVjdGVkQ2hhcmFjdGVyKXsKICAgICAgICAgICAgICAgICAgY2FzZSAnPENSPic6CiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRDaGFyYWN0ZXI9J1xuJzsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgY2FzZSAnPFNwYWNlPic6CiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRDaGFyYWN0ZXI9JyAnOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBBZGQgdGhlIGNvbW1hbmQgdG8gdGhlIGxpc3Qgb2YgbWF0Y2hlZCBjb21tYW5kcy4gQ2hvb3NlIHRoZSBiZXN0CiAgICAgICAgICAgIC8vIGNvbW1hbmQgbGF0ZXIuCiAgICAgICAgICAgIG1hdGNoZWRDb21tYW5kcy5wdXNoKGNvbW1hbmQpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gUmV0dXJucyB0aGUgY29tbWFuZCBpZiBpdCBpcyBhIGZ1bGwgbWF0Y2gsIG9yIG51bGwgaWYgbm90LgogICAgICAgIGZ1bmN0aW9uIGdldEZ1bGx5TWF0Y2hlZENvbW1hbmRPck51bGwoY29tbWFuZCkgewogICAgICAgICAgaWYgKGtleXMubGVuZ3RoIDwgY29tbWFuZC5rZXlzLmxlbmd0aCkgewogICAgICAgICAgICAvLyBNYXRjaGVzIHBhcnQgb2YgYSBtdWx0aS1rZXkgY29tbWFuZC4gQnVmZmVyIGFuZCB3YWl0IGZvciBuZXh0CiAgICAgICAgICAgIC8vIHN0cm9rZS4KICAgICAgICAgICAgaW5wdXRTdGF0ZS5rZXlCdWZmZXIucHVzaChrZXkpOwogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIChjb21tYW5kLmtleXNba2V5cy5sZW5ndGggLSAxXSA9PSAnY2hhcmFjdGVyJykgewogICAgICAgICAgICAgIGlucHV0U3RhdGUuc2VsZWN0ZWRDaGFyYWN0ZXIgPSBzZWxlY3RlZENoYXJhY3RlcjsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBDbGVhciB0aGUgYnVmZmVyIHNpbmNlIGEgZnVsbCBtYXRjaCB3YXMgZm91bmQuCiAgICAgICAgICAgIGlucHV0U3RhdGUua2V5QnVmZmVyID0gW107CiAgICAgICAgICAgIHJldHVybiBjb21tYW5kOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCFtYXRjaGVkQ29tbWFuZHMubGVuZ3RoKSB7CiAgICAgICAgICAvLyBDbGVhciB0aGUgYnVmZmVyIHNpbmNlIHRoZXJlIHdlcmUgbm8gbWF0Y2hlcy4KICAgICAgICAgIGlucHV0U3RhdGUua2V5QnVmZmVyID0gW107CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9IGVsc2UgaWYgKG1hdGNoZWRDb21tYW5kcy5sZW5ndGggPT0gMSkgewogICAgICAgICAgcmV0dXJuIGdldEZ1bGx5TWF0Y2hlZENvbW1hbmRPck51bGwobWF0Y2hlZENvbW1hbmRzWzBdKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gRmluZCB0aGUgYmVzdCBtYXRjaCBpbiB0aGUgbGlzdCBvZiBtYXRjaGVkQ29tbWFuZHMuCiAgICAgICAgICB2YXIgY29udGV4dCA9IHZpbS52aXN1YWxNb2RlID8gJ3Zpc3VhbCcgOiAnbm9ybWFsJzsKICAgICAgICAgIHZhciBiZXN0TWF0Y2g7IC8vIERlZmF1bHQgdG8gZmlyc3QgaW4gdGhlIGxpc3QuCiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1hdGNoZWRDb21tYW5kcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICB2YXIgY3VycmVudCA9IG1hdGNoZWRDb21tYW5kc1tpXTsKICAgICAgICAgICAgaWYgKGN1cnJlbnQuY29udGV4dCA9PSBjb250ZXh0KSB7CiAgICAgICAgICAgICAgYmVzdE1hdGNoID0gY3VycmVudDsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfSBlbHNlIGlmICghYmVzdE1hdGNoICYmICFjdXJyZW50LmNvbnRleHQpIHsKICAgICAgICAgICAgICAvLyBPbmx5IHNldCBhbiBpbXBlcmZlY3QgbWF0Y2ggdG8gYmVzdCBtYXRjaCBpZiBubyBiZXN0IG1hdGNoIGlzCiAgICAgICAgICAgICAgLy8gc2V0IGFuZCB0aGUgaW1wZXJmZWN0IG1hdGNoIGlzIG5vdCByZXN0cmljdGVkIHRvIGFub3RoZXIKICAgICAgICAgICAgICAvLyBjb250ZXh0LgogICAgICAgICAgICAgIGJlc3RNYXRjaCA9IGN1cnJlbnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBnZXRGdWxseU1hdGNoZWRDb21tYW5kT3JOdWxsKGJlc3RNYXRjaCk7CiAgICAgICAgfQogICAgICB9LAogICAgICBwcm9jZXNzQ29tbWFuZDogZnVuY3Rpb24oY20sIHZpbSwgY29tbWFuZCkgewogICAgICAgIHZpbS5pbnB1dFN0YXRlLnJlcGVhdE92ZXJyaWRlID0gY29tbWFuZC5yZXBlYXRPdmVycmlkZTsKICAgICAgICBzd2l0Y2ggKGNvbW1hbmQudHlwZSkgewogICAgICAgICAgY2FzZSAnbW90aW9uJzoKICAgICAgICAgICAgdGhpcy5wcm9jZXNzTW90aW9uKGNtLCB2aW0sIGNvbW1hbmQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ29wZXJhdG9yJzoKICAgICAgICAgICAgdGhpcy5wcm9jZXNzT3BlcmF0b3IoY20sIHZpbSwgY29tbWFuZCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnb3BlcmF0b3JNb3Rpb24nOgogICAgICAgICAgICB0aGlzLnByb2Nlc3NPcGVyYXRvck1vdGlvbihjbSwgdmltLCBjb21tYW5kKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdhY3Rpb24nOgogICAgICAgICAgICB0aGlzLnByb2Nlc3NBY3Rpb24oY20sIHZpbSwgY29tbWFuZCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnc2VhcmNoJzoKICAgICAgICAgICAgdGhpcy5wcm9jZXNzU2VhcmNoKGNtLCB2aW0sIGNvbW1hbmQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ2V4JzoKICAgICAgICAgIGNhc2UgJ2tleVRvRXgnOgogICAgICAgICAgICB0aGlzLnByb2Nlc3NFeChjbSwgdmltLCBjb21tYW5kKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIHByb2Nlc3NNb3Rpb246IGZ1bmN0aW9uKGNtLCB2aW0sIGNvbW1hbmQpIHsKICAgICAgICB2aW0uaW5wdXRTdGF0ZS5tb3Rpb24gPSBjb21tYW5kLm1vdGlvbjsKICAgICAgICB2aW0uaW5wdXRTdGF0ZS5tb3Rpb25BcmdzID0gY29weUFyZ3MoY29tbWFuZC5tb3Rpb25BcmdzKTsKICAgICAgICB0aGlzLmV2YWxJbnB1dChjbSwgdmltKTsKICAgICAgfSwKICAgICAgcHJvY2Vzc09wZXJhdG9yOiBmdW5jdGlvbihjbSwgdmltLCBjb21tYW5kKSB7CiAgICAgICAgdmFyIGlucHV0U3RhdGUgPSB2aW0uaW5wdXRTdGF0ZTsKICAgICAgICBpZiAoaW5wdXRTdGF0ZS5vcGVyYXRvcikgewogICAgICAgICAgaWYgKGlucHV0U3RhdGUub3BlcmF0b3IgPT0gY29tbWFuZC5vcGVyYXRvcikgewogICAgICAgICAgICAvLyBUeXBpbmcgYW4gb3BlcmF0b3IgdHdpY2UgbGlrZSAnZGQnIG1ha2VzIHRoZSBvcGVyYXRvciBvcGVyYXRlCiAgICAgICAgICAgIC8vIGxpbmV3aXNlCiAgICAgICAgICAgIGlucHV0U3RhdGUubW90aW9uID0gJ2V4cGFuZFRvTGluZSc7CiAgICAgICAgICAgIGlucHV0U3RhdGUubW90aW9uQXJncyA9IHsgbGluZXdpc2U6IHRydWUgfTsKICAgICAgICAgICAgdGhpcy5ldmFsSW5wdXQoY20sIHZpbSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIDIgZGlmZmVyZW50IG9wZXJhdG9ycyBpbiBhIHJvdyBkb2Vzbid0IG1ha2Ugc2Vuc2UuCiAgICAgICAgICAgIGNsZWFySW5wdXRTdGF0ZShjbSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlucHV0U3RhdGUub3BlcmF0b3IgPSBjb21tYW5kLm9wZXJhdG9yOwogICAgICAgIGlucHV0U3RhdGUub3BlcmF0b3JBcmdzID0gY29weUFyZ3MoY29tbWFuZC5vcGVyYXRvckFyZ3MpOwogICAgICAgIGlmICh2aW0udmlzdWFsTW9kZSkgewogICAgICAgICAgLy8gT3BlcmF0aW5nIG9uIGEgc2VsZWN0aW9uIGluIHZpc3VhbCBtb2RlLiBXZSBkb24ndCBuZWVkIGEgbW90aW9uLgogICAgICAgICAgdGhpcy5ldmFsSW5wdXQoY20sIHZpbSk7CiAgICAgICAgfQogICAgICB9LAogICAgICBwcm9jZXNzT3BlcmF0b3JNb3Rpb246IGZ1bmN0aW9uKGNtLCB2aW0sIGNvbW1hbmQpIHsKICAgICAgICB2YXIgdmlzdWFsTW9kZSA9IHZpbS52aXN1YWxNb2RlOwogICAgICAgIHZhciBvcGVyYXRvck1vdGlvbkFyZ3MgPSBjb3B5QXJncyhjb21tYW5kLm9wZXJhdG9yTW90aW9uQXJncyk7CiAgICAgICAgaWYgKG9wZXJhdG9yTW90aW9uQXJncykgewogICAgICAgICAgLy8gT3BlcmF0b3IgbW90aW9ucyBtYXkgaGF2ZSBzcGVjaWFsIGJlaGF2aW9yIGluIHZpc3VhbCBtb2RlLgogICAgICAgICAgaWYgKHZpc3VhbE1vZGUgJiYgb3BlcmF0b3JNb3Rpb25BcmdzLnZpc3VhbExpbmUpIHsKICAgICAgICAgICAgdmltLnZpc3VhbExpbmUgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0aGlzLnByb2Nlc3NPcGVyYXRvcihjbSwgdmltLCBjb21tYW5kKTsKICAgICAgICBpZiAoIXZpc3VhbE1vZGUpIHsKICAgICAgICAgIHRoaXMucHJvY2Vzc01vdGlvbihjbSwgdmltLCBjb21tYW5kKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIHByb2Nlc3NBY3Rpb246IGZ1bmN0aW9uKGNtLCB2aW0sIGNvbW1hbmQpIHsKICAgICAgICB2YXIgaW5wdXRTdGF0ZSA9IHZpbS5pbnB1dFN0YXRlOwogICAgICAgIHZhciByZXBlYXQgPSBpbnB1dFN0YXRlLmdldFJlcGVhdCgpOwogICAgICAgIHZhciByZXBlYXRJc0V4cGxpY2l0ID0gISFyZXBlYXQ7CiAgICAgICAgdmFyIGFjdGlvbkFyZ3MgPSBjb3B5QXJncyhjb21tYW5kLmFjdGlvbkFyZ3MpIHx8IHt9OwogICAgICAgIGlmIChpbnB1dFN0YXRlLnNlbGVjdGVkQ2hhcmFjdGVyKSB7CiAgICAgICAgICBhY3Rpb25BcmdzLnNlbGVjdGVkQ2hhcmFjdGVyID0gaW5wdXRTdGF0ZS5zZWxlY3RlZENoYXJhY3RlcjsKICAgICAgICB9CiAgICAgICAgLy8gQWN0aW9ucyBtYXkgb3IgbWF5IG5vdCBoYXZlIG1vdGlvbnMgYW5kIG9wZXJhdG9ycy4gRG8gdGhlc2UgZmlyc3QuCiAgICAgICAgaWYgKGNvbW1hbmQub3BlcmF0b3IpIHsKICAgICAgICAgIHRoaXMucHJvY2Vzc09wZXJhdG9yKGNtLCB2aW0sIGNvbW1hbmQpOwogICAgICAgIH0KICAgICAgICBpZiAoY29tbWFuZC5tb3Rpb24pIHsKICAgICAgICAgIHRoaXMucHJvY2Vzc01vdGlvbihjbSwgdmltLCBjb21tYW5kKTsKICAgICAgICB9CiAgICAgICAgaWYgKGNvbW1hbmQubW90aW9uIHx8IGNvbW1hbmQub3BlcmF0b3IpIHsKICAgICAgICAgIHRoaXMuZXZhbElucHV0KGNtLCB2aW0pOwogICAgICAgIH0KICAgICAgICBhY3Rpb25BcmdzLnJlcGVhdCA9IHJlcGVhdCB8fCAxOwogICAgICAgIGFjdGlvbkFyZ3MucmVwZWF0SXNFeHBsaWNpdCA9IHJlcGVhdElzRXhwbGljaXQ7CiAgICAgICAgYWN0aW9uQXJncy5yZWdpc3Rlck5hbWUgPSBpbnB1dFN0YXRlLnJlZ2lzdGVyTmFtZTsKICAgICAgICBjbGVhcklucHV0U3RhdGUoY20pOwogICAgICAgIHZpbS5sYXN0TW90aW9uID0gbnVsbDsKICAgICAgICBpZiAoY29tbWFuZC5pc0VkaXQpIHsKICAgICAgICAgIHRoaXMucmVjb3JkTGFzdEVkaXQodmltLCBpbnB1dFN0YXRlLCBjb21tYW5kKTsKICAgICAgICB9CiAgICAgICAgYWN0aW9uc1tjb21tYW5kLmFjdGlvbl0oY20sIGFjdGlvbkFyZ3MsIHZpbSk7CiAgICAgIH0sCiAgICAgIHByb2Nlc3NTZWFyY2g6IGZ1bmN0aW9uKGNtLCB2aW0sIGNvbW1hbmQpIHsKICAgICAgICBpZiAoIWNtLmdldFNlYXJjaEN1cnNvcikgewogICAgICAgICAgLy8gU2VhcmNoIGRlcGVuZHMgb24gU2VhcmNoQ3Vyc29yLgogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB2YXIgZm9yd2FyZCA9IGNvbW1hbmQuc2VhcmNoQXJncy5mb3J3YXJkOwogICAgICAgIHZhciB3aG9sZVdvcmRPbmx5ID0gY29tbWFuZC5zZWFyY2hBcmdzLndob2xlV29yZE9ubHk7CiAgICAgICAgZ2V0U2VhcmNoU3RhdGUoY20pLnNldFJldmVyc2VkKCFmb3J3YXJkKTsKICAgICAgICB2YXIgcHJvbXB0UHJlZml4ID0gKGZvcndhcmQpID8gJy8nIDogJz8nOwogICAgICAgIHZhciBvcmlnaW5hbFF1ZXJ5ID0gZ2V0U2VhcmNoU3RhdGUoY20pLmdldFF1ZXJ5KCk7CiAgICAgICAgdmFyIG9yaWdpbmFsU2Nyb2xsUG9zID0gY20uZ2V0U2Nyb2xsSW5mbygpOwogICAgICAgIGZ1bmN0aW9uIGhhbmRsZVF1ZXJ5KHF1ZXJ5LCBpZ25vcmVDYXNlLCBzbWFydENhc2UpIHsKICAgICAgICAgIHZpbUdsb2JhbFN0YXRlLnNlYXJjaEhpc3RvcnlDb250cm9sbGVyLnB1c2hJbnB1dChxdWVyeSk7CiAgICAgICAgICB2aW1HbG9iYWxTdGF0ZS5zZWFyY2hIaXN0b3J5Q29udHJvbGxlci5yZXNldCgpOwogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgdXBkYXRlU2VhcmNoUXVlcnkoY20sIHF1ZXJ5LCBpZ25vcmVDYXNlLCBzbWFydENhc2UpOwogICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICBzaG93Q29uZmlybShjbSwgJ0ludmFsaWQgcmVnZXg6ICcgKyBxdWVyeSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIGNvbW1hbmREaXNwYXRjaGVyLnByb2Nlc3NNb3Rpb24oY20sIHZpbSwgewogICAgICAgICAgICB0eXBlOiAnbW90aW9uJywKICAgICAgICAgICAgbW90aW9uOiAnZmluZE5leHQnLAogICAgICAgICAgICBtb3Rpb25BcmdzOiB7IGZvcndhcmQ6IHRydWUsIHRvSnVtcGxpc3Q6IGNvbW1hbmQuc2VhcmNoQXJncy50b0p1bXBsaXN0IH0KICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBvblByb21wdENsb3NlKHF1ZXJ5KSB7CiAgICAgICAgICBjbS5zY3JvbGxUbyhvcmlnaW5hbFNjcm9sbFBvcy5sZWZ0LCBvcmlnaW5hbFNjcm9sbFBvcy50b3ApOwogICAgICAgICAgaGFuZGxlUXVlcnkocXVlcnksIHRydWUgLyoqIGlnbm9yZUNhc2UgKi8sIHRydWUgLyoqIHNtYXJ0Q2FzZSAqLyk7CiAgICAgICAgICB2YXIgbWFjcm9Nb2RlU3RhdGUgPSB2aW1HbG9iYWxTdGF0ZS5tYWNyb01vZGVTdGF0ZTsKICAgICAgICAgIGlmIChtYWNyb01vZGVTdGF0ZS5pc1JlY29yZGluZykgewogICAgICAgICAgICBsb2dTZWFyY2hRdWVyeShtYWNyb01vZGVTdGF0ZSwgcXVlcnkpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBvblByb21wdEtleVVwKGUsIHF1ZXJ5LCBjbG9zZSkgewogICAgICAgICAgdmFyIGtleU5hbWUgPSBDb2RlTWlycm9yLmtleU5hbWUoZSksIHVwOwogICAgICAgICAgaWYgKGtleU5hbWUgPT0gJ1VwJyB8fCBrZXlOYW1lID09ICdEb3duJykgewogICAgICAgICAgICB1cCA9IGtleU5hbWUgPT0gJ1VwJyA/IHRydWUgOiBmYWxzZTsKICAgICAgICAgICAgcXVlcnkgPSB2aW1HbG9iYWxTdGF0ZS5zZWFyY2hIaXN0b3J5Q29udHJvbGxlci5uZXh0TWF0Y2gocXVlcnksIHVwKSB8fCAnJzsKICAgICAgICAgICAgY2xvc2UocXVlcnkpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCBrZXlOYW1lICE9ICdMZWZ0JyAmJiBrZXlOYW1lICE9ICdSaWdodCcgJiYga2V5TmFtZSAhPSAnQ3RybCcgJiYga2V5TmFtZSAhPSAnQWx0JyAmJiBrZXlOYW1lICE9ICdTaGlmdCcpCiAgICAgICAgICAgICAgdmltR2xvYmFsU3RhdGUuc2VhcmNoSGlzdG9yeUNvbnRyb2xsZXIucmVzZXQoKTsKICAgICAgICAgIH0KICAgICAgICAgIHZhciBwYXJzZWRRdWVyeTsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIHBhcnNlZFF1ZXJ5ID0gdXBkYXRlU2VhcmNoUXVlcnkoY20sIHF1ZXJ5LAogICAgICAgICAgICAgICAgdHJ1ZSAvKiogaWdub3JlQ2FzZSAqLywgdHJ1ZSAvKiogc21hcnRDYXNlICovKTsKICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgLy8gU3dhbGxvdyBiYWQgcmVnZXhlcyBmb3IgaW5jcmVtZW50YWwgc2VhcmNoLgogICAgICAgICAgfQogICAgICAgICAgaWYgKHBhcnNlZFF1ZXJ5KSB7CiAgICAgICAgICAgIGNtLnNjcm9sbEludG9WaWV3KGZpbmROZXh0KGNtLCAhZm9yd2FyZCwgcGFyc2VkUXVlcnkpLCAzMCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjbGVhclNlYXJjaEhpZ2hsaWdodChjbSk7CiAgICAgICAgICAgIGNtLnNjcm9sbFRvKG9yaWdpbmFsU2Nyb2xsUG9zLmxlZnQsIG9yaWdpbmFsU2Nyb2xsUG9zLnRvcCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIG9uUHJvbXB0S2V5RG93bihlLCBxdWVyeSwgY2xvc2UpIHsKICAgICAgICAgIHZhciBrZXlOYW1lID0gQ29kZU1pcnJvci5rZXlOYW1lKGUpOwogICAgICAgICAgaWYgKGtleU5hbWUgPT0gJ0VzYycgfHwga2V5TmFtZSA9PSAnQ3RybC1DJyB8fCBrZXlOYW1lID09ICdDdHJsLVsnKSB7CiAgICAgICAgICAgIHZpbUdsb2JhbFN0YXRlLnNlYXJjaEhpc3RvcnlDb250cm9sbGVyLnB1c2hJbnB1dChxdWVyeSk7CiAgICAgICAgICAgIHZpbUdsb2JhbFN0YXRlLnNlYXJjaEhpc3RvcnlDb250cm9sbGVyLnJlc2V0KCk7CiAgICAgICAgICAgIHVwZGF0ZVNlYXJjaFF1ZXJ5KGNtLCBvcmlnaW5hbFF1ZXJ5KTsKICAgICAgICAgICAgY2xlYXJTZWFyY2hIaWdobGlnaHQoY20pOwogICAgICAgICAgICBjbS5zY3JvbGxUbyhvcmlnaW5hbFNjcm9sbFBvcy5sZWZ0LCBvcmlnaW5hbFNjcm9sbFBvcy50b3ApOwogICAgICAgICAgICBDb2RlTWlycm9yLmVfc3RvcChlKTsKICAgICAgICAgICAgY2xvc2UoKTsKICAgICAgICAgICAgY20uZm9jdXMoKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgc3dpdGNoIChjb21tYW5kLnNlYXJjaEFyZ3MucXVlcnlTcmMpIHsKICAgICAgICAgIGNhc2UgJ3Byb21wdCc6CiAgICAgICAgICAgIHZhciBtYWNyb01vZGVTdGF0ZSA9IHZpbUdsb2JhbFN0YXRlLm1hY3JvTW9kZVN0YXRlOwogICAgICAgICAgICBpZiAobWFjcm9Nb2RlU3RhdGUuaXNQbGF5aW5nKSB7CiAgICAgICAgICAgICAgdmFyIHF1ZXJ5ID0gbWFjcm9Nb2RlU3RhdGUucmVwbGF5U2VhcmNoUXVlcmllcy5zaGlmdCgpOwogICAgICAgICAgICAgIGhhbmRsZVF1ZXJ5KHF1ZXJ5LCB0cnVlIC8qKiBpZ25vcmVDYXNlICovLCBmYWxzZSAvKiogc21hcnRDYXNlICovKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBzaG93UHJvbXB0KGNtLCB7CiAgICAgICAgICAgICAgICAgIG9uQ2xvc2U6IG9uUHJvbXB0Q2xvc2UsCiAgICAgICAgICAgICAgICAgIHByZWZpeDogcHJvbXB0UHJlZml4LAogICAgICAgICAgICAgICAgICBkZXNjOiBzZWFyY2hQcm9tcHREZXNjLAogICAgICAgICAgICAgICAgICBvbktleVVwOiBvblByb21wdEtleVVwLAogICAgICAgICAgICAgICAgICBvbktleURvd246IG9uUHJvbXB0S2V5RG93bgogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnd29yZFVuZGVyQ3Vyc29yJzoKICAgICAgICAgICAgdmFyIHdvcmQgPSBleHBhbmRXb3JkVW5kZXJDdXJzb3IoY20sIGZhbHNlIC8qKiBpbmNsdXNpdmUgKi8sCiAgICAgICAgICAgICAgICB0cnVlIC8qKiBmb3J3YXJkICovLCBmYWxzZSAvKiogYmlnV29yZCAqLywKICAgICAgICAgICAgICAgIHRydWUgLyoqIG5vU3ltYm9sICovKTsKICAgICAgICAgICAgdmFyIGlzS2V5d29yZCA9IHRydWU7CiAgICAgICAgICAgIGlmICghd29yZCkgewogICAgICAgICAgICAgIHdvcmQgPSBleHBhbmRXb3JkVW5kZXJDdXJzb3IoY20sIGZhbHNlIC8qKiBpbmNsdXNpdmUgKi8sCiAgICAgICAgICAgICAgICAgIHRydWUgLyoqIGZvcndhcmQgKi8sIGZhbHNlIC8qKiBiaWdXb3JkICovLAogICAgICAgICAgICAgICAgICBmYWxzZSAvKiogbm9TeW1ib2wgKi8pOwogICAgICAgICAgICAgIGlzS2V5d29yZCA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghd29yZCkgewogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgcXVlcnkgPSBjbS5nZXRMaW5lKHdvcmQuc3RhcnQubGluZSkuc3Vic3RyaW5nKHdvcmQuc3RhcnQuY2gsCiAgICAgICAgICAgICAgICB3b3JkLmVuZC5jaCk7CiAgICAgICAgICAgIGlmIChpc0tleXdvcmQgJiYgd2hvbGVXb3JkT25seSkgewogICAgICAgICAgICAgICAgcXVlcnkgPSAnXFxiJyArIHF1ZXJ5ICsgJ1xcYic7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgcXVlcnkgPSBlc2NhcGVSZWdleChxdWVyeSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIGNhY2hlZEN1cnNvciBpcyB1c2VkIHRvIHNhdmUgdGhlIG9sZCBwb3NpdGlvbiBvZiB0aGUgY3Vyc29yCiAgICAgICAgICAgIC8vIHdoZW4gKiBvciAjIGNhdXNlcyB2aW0gdG8gc2VlayBmb3IgdGhlIG5lYXJlc3Qgd29yZCBhbmQgc2hpZnQKICAgICAgICAgICAgLy8gdGhlIGN1cnNvciBiZWZvcmUgZW50ZXJpbmcgdGhlIG1vdGlvbi4KICAgICAgICAgICAgdmltR2xvYmFsU3RhdGUuanVtcExpc3QuY2FjaGVkQ3Vyc29yID0gY20uZ2V0Q3Vyc29yKCk7CiAgICAgICAgICAgIGNtLnNldEN1cnNvcih3b3JkLnN0YXJ0KTsKCiAgICAgICAgICAgIGhhbmRsZVF1ZXJ5KHF1ZXJ5LCB0cnVlIC8qKiBpZ25vcmVDYXNlICovLCBmYWxzZSAvKiogc21hcnRDYXNlICovKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9LAogICAgICBwcm9jZXNzRXg6IGZ1bmN0aW9uKGNtLCB2aW0sIGNvbW1hbmQpIHsKICAgICAgICBmdW5jdGlvbiBvblByb21wdENsb3NlKGlucHV0KSB7CiAgICAgICAgICAvLyBHaXZlIHRoZSBwcm9tcHQgc29tZSB0aW1lIHRvIGNsb3NlIHNvIHRoYXQgaWYgcHJvY2Vzc0NvbW1hbmQgc2hvd3MKICAgICAgICAgIC8vIGFuIGVycm9yLCB0aGUgZWxlbWVudHMgZG9uJ3Qgb3ZlcmxhcC4KICAgICAgICAgIHZpbUdsb2JhbFN0YXRlLmV4Q29tbWFuZEhpc3RvcnlDb250cm9sbGVyLnB1c2hJbnB1dChpbnB1dCk7CiAgICAgICAgICB2aW1HbG9iYWxTdGF0ZS5leENvbW1hbmRIaXN0b3J5Q29udHJvbGxlci5yZXNldCgpOwogICAgICAgICAgZXhDb21tYW5kRGlzcGF0Y2hlci5wcm9jZXNzQ29tbWFuZChjbSwgaW5wdXQpOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBvblByb21wdEtleURvd24oZSwgaW5wdXQsIGNsb3NlKSB7CiAgICAgICAgICB2YXIga2V5TmFtZSA9IENvZGVNaXJyb3Iua2V5TmFtZShlKSwgdXA7CiAgICAgICAgICBpZiAoa2V5TmFtZSA9PSAnRXNjJyB8fCBrZXlOYW1lID09ICdDdHJsLUMnIHx8IGtleU5hbWUgPT0gJ0N0cmwtWycpIHsKICAgICAgICAgICAgdmltR2xvYmFsU3RhdGUuZXhDb21tYW5kSGlzdG9yeUNvbnRyb2xsZXIucHVzaElucHV0KGlucHV0KTsKICAgICAgICAgICAgdmltR2xvYmFsU3RhdGUuZXhDb21tYW5kSGlzdG9yeUNvbnRyb2xsZXIucmVzZXQoKTsKICAgICAgICAgICAgQ29kZU1pcnJvci5lX3N0b3AoZSk7CiAgICAgICAgICAgIGNsb3NlKCk7CiAgICAgICAgICAgIGNtLmZvY3VzKCk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoa2V5TmFtZSA9PSAnVXAnIHx8IGtleU5hbWUgPT0gJ0Rvd24nKSB7CiAgICAgICAgICAgIHVwID0ga2V5TmFtZSA9PSAnVXAnID8gdHJ1ZSA6IGZhbHNlOwogICAgICAgICAgICBpbnB1dCA9IHZpbUdsb2JhbFN0YXRlLmV4Q29tbWFuZEhpc3RvcnlDb250cm9sbGVyLm5leHRNYXRjaChpbnB1dCwgdXApIHx8ICcnOwogICAgICAgICAgICBjbG9zZShpbnB1dCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoIGtleU5hbWUgIT0gJ0xlZnQnICYmIGtleU5hbWUgIT0gJ1JpZ2h0JyAmJiBrZXlOYW1lICE9ICdDdHJsJyAmJiBrZXlOYW1lICE9ICdBbHQnICYmIGtleU5hbWUgIT0gJ1NoaWZ0JykKICAgICAgICAgICAgICB2aW1HbG9iYWxTdGF0ZS5leENvbW1hbmRIaXN0b3J5Q29udHJvbGxlci5yZXNldCgpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoY29tbWFuZC50eXBlID09ICdrZXlUb0V4JykgewogICAgICAgICAgLy8gSGFuZGxlIHVzZXIgZGVmaW5lZCBFeCB0byBFeCBtYXBwaW5ncwogICAgICAgICAgZXhDb21tYW5kRGlzcGF0Y2hlci5wcm9jZXNzQ29tbWFuZChjbSwgY29tbWFuZC5leEFyZ3MuaW5wdXQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAodmltLnZpc3VhbE1vZGUpIHsKICAgICAgICAgICAgc2hvd1Byb21wdChjbSwgeyBvbkNsb3NlOiBvblByb21wdENsb3NlLCBwcmVmaXg6ICc6JywgdmFsdWU6ICdcJzwsXCc+JywKICAgICAgICAgICAgICAgIG9uS2V5RG93bjogb25Qcm9tcHRLZXlEb3dufSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzaG93UHJvbXB0KGNtLCB7IG9uQ2xvc2U6IG9uUHJvbXB0Q2xvc2UsIHByZWZpeDogJzonLAogICAgICAgICAgICAgICAgb25LZXlEb3duOiBvblByb21wdEtleURvd259KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgIGV2YWxJbnB1dDogZnVuY3Rpb24oY20sIHZpbSkgewogICAgICAgIC8vIElmIHRoZSBtb3Rpb24gY29tYW5kIGlzIHNldCwgZXhlY3V0ZSBib3RoIHRoZSBvcGVyYXRvciBhbmQgbW90aW9uLgogICAgICAgIC8vIE90aGVyd2lzZSByZXR1cm4uCiAgICAgICAgdmFyIGlucHV0U3RhdGUgPSB2aW0uaW5wdXRTdGF0ZTsKICAgICAgICB2YXIgbW90aW9uID0gaW5wdXRTdGF0ZS5tb3Rpb247CiAgICAgICAgdmFyIG1vdGlvbkFyZ3MgPSBpbnB1dFN0YXRlLm1vdGlvbkFyZ3MgfHwge307CiAgICAgICAgdmFyIG9wZXJhdG9yID0gaW5wdXRTdGF0ZS5vcGVyYXRvcjsKICAgICAgICB2YXIgb3BlcmF0b3JBcmdzID0gaW5wdXRTdGF0ZS5vcGVyYXRvckFyZ3MgfHwge307CiAgICAgICAgdmFyIHJlZ2lzdGVyTmFtZSA9IGlucHV0U3RhdGUucmVnaXN0ZXJOYW1lOwogICAgICAgIHZhciBzZWxlY3Rpb25FbmQgPSBjb3B5Q3Vyc29yKGNtLmdldEN1cnNvcignaGVhZCcpKTsKICAgICAgICB2YXIgc2VsZWN0aW9uU3RhcnQgPSBjb3B5Q3Vyc29yKGNtLmdldEN1cnNvcignYW5jaG9yJykpOwogICAgICAgIC8vIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gY3VyIGFuZCBzZWxlY3Rpb24gY3Vyc29ycyBhcmUgdGhhdCBjdXIgaXMKICAgICAgICAvLyBiZWluZyBvcGVyYXRlZCBvbiBhbmQgaWdub3JlcyB0aGF0IHRoZXJlIGlzIGEgc2VsZWN0aW9uLgogICAgICAgIHZhciBjdXJTdGFydCA9IGNvcHlDdXJzb3Ioc2VsZWN0aW9uRW5kKTsKICAgICAgICB2YXIgY3VyT3JpZ2luYWwgPSBjb3B5Q3Vyc29yKGN1clN0YXJ0KTsKICAgICAgICB2YXIgY3VyRW5kOwogICAgICAgIHZhciByZXBlYXQ7CiAgICAgICAgaWYgKG9wZXJhdG9yKSB7CiAgICAgICAgICB0aGlzLnJlY29yZExhc3RFZGl0KHZpbSwgaW5wdXRTdGF0ZSk7CiAgICAgICAgfQogICAgICAgIGlmIChpbnB1dFN0YXRlLnJlcGVhdE92ZXJyaWRlICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgIC8vIElmIHJlcGVhdE92ZXJyaWRlIGlzIHNwZWNpZmllZCwgdGhhdCB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgdGhlCiAgICAgICAgICAvLyBpbnB1dCBzdGF0ZSdzIHJlcGVhdC4gVXNlZCBieSBFeCBtb2RlIGFuZCBjYW4gYmUgdXNlciBkZWZpbmVkLgogICAgICAgICAgcmVwZWF0ID0gaW5wdXRTdGF0ZS5yZXBlYXRPdmVycmlkZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmVwZWF0ID0gaW5wdXRTdGF0ZS5nZXRSZXBlYXQoKTsKICAgICAgICB9CiAgICAgICAgaWYgKHJlcGVhdCA+IDAgJiYgbW90aW9uQXJncy5leHBsaWNpdFJlcGVhdCkgewogICAgICAgICAgbW90aW9uQXJncy5yZXBlYXRJc0V4cGxpY2l0ID0gdHJ1ZTsKICAgICAgICB9IGVsc2UgaWYgKG1vdGlvbkFyZ3Mubm9SZXBlYXQgfHwKICAgICAgICAgICAgKCFtb3Rpb25BcmdzLmV4cGxpY2l0UmVwZWF0ICYmIHJlcGVhdCA9PT0gMCkpIHsKICAgICAgICAgIHJlcGVhdCA9IDE7CiAgICAgICAgICBtb3Rpb25BcmdzLnJlcGVhdElzRXhwbGljaXQgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgaWYgKGlucHV0U3RhdGUuc2VsZWN0ZWRDaGFyYWN0ZXIpIHsKICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGEgY2hhcmFjdGVyIGlucHV0LCBzdGljayBpdCBpbiBhbGwgb2YgdGhlIGFyZyBhcnJheXMuCiAgICAgICAgICBtb3Rpb25BcmdzLnNlbGVjdGVkQ2hhcmFjdGVyID0gb3BlcmF0b3JBcmdzLnNlbGVjdGVkQ2hhcmFjdGVyID0KICAgICAgICAgICAgICBpbnB1dFN0YXRlLnNlbGVjdGVkQ2hhcmFjdGVyOwogICAgICAgIH0KICAgICAgICBtb3Rpb25BcmdzLnJlcGVhdCA9IHJlcGVhdDsKICAgICAgICBjbGVhcklucHV0U3RhdGUoY20pOwogICAgICAgIGlmIChtb3Rpb24pIHsKICAgICAgICAgIHZhciBtb3Rpb25SZXN1bHQgPSBtb3Rpb25zW21vdGlvbl0oY20sIG1vdGlvbkFyZ3MsIHZpbSk7CiAgICAgICAgICB2aW0ubGFzdE1vdGlvbiA9IG1vdGlvbnNbbW90aW9uXTsKICAgICAgICAgIGlmICghbW90aW9uUmVzdWx0KSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChtb3Rpb25BcmdzLnRvSnVtcGxpc3QpIHsKICAgICAgICAgICAgdmFyIGp1bXBMaXN0ID0gdmltR2xvYmFsU3RhdGUuanVtcExpc3Q7CiAgICAgICAgICAgIC8vIGlmIHRoZSBjdXJyZW50IG1vdGlvbiBpcyAjIG9yICosIHVzZSBjYWNoZWRDdXJzb3IKICAgICAgICAgICAgdmFyIGNhY2hlZEN1cnNvciA9IGp1bXBMaXN0LmNhY2hlZEN1cnNvcjsKICAgICAgICAgICAgaWYgKGNhY2hlZEN1cnNvcikgewogICAgICAgICAgICAgIHJlY29yZEp1bXBQb3NpdGlvbihjbSwgY2FjaGVkQ3Vyc29yLCBtb3Rpb25SZXN1bHQpOwogICAgICAgICAgICAgIGRlbGV0ZSBqdW1wTGlzdC5jYWNoZWRDdXJzb3I7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgcmVjb3JkSnVtcFBvc2l0aW9uKGNtLCBjdXJPcmlnaW5hbCwgbW90aW9uUmVzdWx0KTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKG1vdGlvblJlc3VsdCBpbnN0YW5jZW9mIEFycmF5KSB7CiAgICAgICAgICAgIGN1clN0YXJ0ID0gbW90aW9uUmVzdWx0WzBdOwogICAgICAgICAgICBjdXJFbmQgPSBtb3Rpb25SZXN1bHRbMV07CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjdXJFbmQgPSBtb3Rpb25SZXN1bHQ7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBUT0RPOiBIYW5kbGUgbnVsbCByZXR1cm5zIGZyb20gbW90aW9uIGNvbW1hbmRzIGJldHRlci4KICAgICAgICAgIGlmICghY3VyRW5kKSB7CiAgICAgICAgICAgIGN1ckVuZCA9IFBvcyhjdXJTdGFydC5saW5lLCBjdXJTdGFydC5jaCk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodmltLnZpc3VhbE1vZGUpIHsKICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHNlbGVjdGlvbiBjcm9zc2VkIG92ZXIgaXRzZWxmLiBXaWxsIG5lZWQgdG8gc2hpZnQKICAgICAgICAgICAgLy8gdGhlIHN0YXJ0IHBvaW50IGlmIHRoYXQgaGFwcGVuZWQuCiAgICAgICAgICAgIC8vIG9mZnNldCBpcyBzZXQgdG8gLTEgb3IgMSB0byBzaGlmdCB0aGUgY3VyRW5kCiAgICAgICAgICAgIC8vIGxlZnQgb3IgcmlnaHQKICAgICAgICAgICAgdmFyIG9mZnNldCA9IDA7CiAgICAgICAgICAgIGlmIChjdXJzb3JJc0JlZm9yZShzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kKSAmJgogICAgICAgICAgICAgICAgKGN1cnNvckVxdWFsKHNlbGVjdGlvblN0YXJ0LCBjdXJFbmQpIHx8CiAgICAgICAgICAgICAgICAgICAgY3Vyc29ySXNCZWZvcmUoY3VyRW5kLCBzZWxlY3Rpb25TdGFydCkpKSB7CiAgICAgICAgICAgICAgLy8gVGhlIGVuZCBvZiB0aGUgc2VsZWN0aW9uIGhhcyBtb3ZlZCBmcm9tIGFmdGVyIHRoZSBzdGFydCB0bwogICAgICAgICAgICAgIC8vIGJlZm9yZSB0aGUgc3RhcnQuIFdlIHdpbGwgc2hpZnQgdGhlIHN0YXJ0IHJpZ2h0IGJ5IDEuCiAgICAgICAgICAgICAgc2VsZWN0aW9uU3RhcnQuY2ggKz0gMTsKICAgICAgICAgICAgICBvZmZzZXQgPSAtMTsKICAgICAgICAgICAgfSBlbHNlIGlmIChjdXJzb3JJc0JlZm9yZShzZWxlY3Rpb25FbmQsIHNlbGVjdGlvblN0YXJ0KSAmJgogICAgICAgICAgICAgICAgKGN1cnNvckVxdWFsKHNlbGVjdGlvblN0YXJ0LCBjdXJFbmQpIHx8CiAgICAgICAgICAgICAgICAgICAgY3Vyc29ySXNCZWZvcmUoc2VsZWN0aW9uU3RhcnQsIGN1ckVuZCkpKSB7CiAgICAgICAgICAgICAgLy8gVGhlIG9wcG9zaXRlIGhhcHBlbmVkLiBXZSB3aWxsIHNoaWZ0IHRoZSBzdGFydCBsZWZ0IGJ5IDEuCiAgICAgICAgICAgICAgc2VsZWN0aW9uU3RhcnQuY2ggLT0gMTsKICAgICAgICAgICAgICBvZmZzZXQgPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIGluIGNhc2Ugb2YgdmlzdWFsIEJsb2NrIHNlbGVjdGlvblN0YXJ0IGFuZCBjdXJFbmQKICAgICAgICAgICAgLy8gbWF5IG5vdCBiZSBvbiB0aGUgc2FtZSBsaW5lLAogICAgICAgICAgICAvLyBBbHNvLCBJbiBjYXNlIG9mIHZfbyB0aGlzIHNob3VsZCBub3QgaGFwcGVuLgogICAgICAgICAgICBpZiAoIXZpbS52aXN1YWxCbG9jayAmJiAhKG1vdGlvblJlc3VsdCBpbnN0YW5jZW9mIEFycmF5KSkgewogICAgICAgICAgICAgIGN1ckVuZC5jaCArPSBvZmZzZXQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHZpbS5sYXN0SFBvcyAhPSBJbmZpbml0eSkgewogICAgICAgICAgICAgIHZpbS5sYXN0SFBvcyA9IGN1ckVuZC5jaDsKICAgICAgICAgICAgfQogICAgICAgICAgICBzZWxlY3Rpb25FbmQgPSBjdXJFbmQ7CiAgICAgICAgICAgIHNlbGVjdGlvblN0YXJ0ID0gKG1vdGlvblJlc3VsdCBpbnN0YW5jZW9mIEFycmF5KSA/IGN1clN0YXJ0IDogc2VsZWN0aW9uU3RhcnQ7CiAgICAgICAgICAgIGlmICh2aW0udmlzdWFsTGluZSkgewogICAgICAgICAgICAgIGlmIChjdXJzb3JJc0JlZm9yZShzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kKSkgewogICAgICAgICAgICAgICAgc2VsZWN0aW9uU3RhcnQuY2ggPSAwOwoKICAgICAgICAgICAgICAgIHZhciBsYXN0TGluZSA9IGNtLmxhc3RMaW5lKCk7CiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0aW9uRW5kLmxpbmUgPiBsYXN0TGluZSkgewogICAgICAgICAgICAgICAgICBzZWxlY3Rpb25FbmQubGluZSA9IGxhc3RMaW5lOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc2VsZWN0aW9uRW5kLmNoID0gbGluZUxlbmd0aChjbSwgc2VsZWN0aW9uRW5kLmxpbmUpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBzZWxlY3Rpb25FbmQuY2ggPSAwOwogICAgICAgICAgICAgICAgc2VsZWN0aW9uU3RhcnQuY2ggPSBsaW5lTGVuZ3RoKGNtLCBzZWxlY3Rpb25TdGFydC5saW5lKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZiAodmltLnZpc3VhbEJsb2NrKSB7CiAgICAgICAgICAgICAgLy8gU2VsZWN0IGEgYmxvY2sgYW5kCiAgICAgICAgICAgICAgLy8gcmV0dXJuIHRoZSBkaWFnb25hbGx5IG9wcG9zaXRlIGVuZC4KICAgICAgICAgICAgICBzZWxlY3Rpb25TdGFydCA9IHNlbGVjdEJsb2NrKGNtLCBzZWxlY3Rpb25FbmQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghdmltLnZpc3VhbEJsb2NrKSB7CiAgICAgICAgICAgICAgY20uc2V0U2VsZWN0aW9uKHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHVwZGF0ZU1hcmsoY20sIHZpbSwgJzwnLAogICAgICAgICAgICAgICAgY3Vyc29ySXNCZWZvcmUoc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkVuZCkgPyBzZWxlY3Rpb25TdGFydAogICAgICAgICAgICAgICAgICAgIDogc2VsZWN0aW9uRW5kKTsKICAgICAgICAgICAgdXBkYXRlTWFyayhjbSwgdmltLCAnPicsCiAgICAgICAgICAgICAgICBjdXJzb3JJc0JlZm9yZShzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kKSA/IHNlbGVjdGlvbkVuZAogICAgICAgICAgICAgICAgICAgIDogc2VsZWN0aW9uU3RhcnQpOwogICAgICAgICAgfSBlbHNlIGlmICghb3BlcmF0b3IpIHsKICAgICAgICAgICAgY3VyRW5kID0gY2xpcEN1cnNvclRvQ29udGVudChjbSwgY3VyRW5kKTsKICAgICAgICAgICAgY20uc2V0Q3Vyc29yKGN1ckVuZC5saW5lLCBjdXJFbmQuY2gpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKG9wZXJhdG9yKSB7CiAgICAgICAgICB2YXIgaW52ZXJ0ZWQgPSBmYWxzZTsKICAgICAgICAgIHZpbS5sYXN0TW90aW9uID0gbnVsbDsKICAgICAgICAgIHZhciBsYXN0U2VsZWN0aW9uID0gdmltLmxhc3RTZWxlY3Rpb247CiAgICAgICAgICBvcGVyYXRvckFyZ3MucmVwZWF0ID0gcmVwZWF0OyAvLyBJbmRlbnQgaW4gdmlzdWFsIG1vZGUgbmVlZHMgdGhpcy4KICAgICAgICAgIGlmICh2aW0udmlzdWFsTW9kZSkgewogICAgICAgICAgICBjdXJTdGFydCA9IHNlbGVjdGlvblN0YXJ0OwogICAgICAgICAgICBjdXJFbmQgPSBzZWxlY3Rpb25FbmQ7CiAgICAgICAgICAgIG1vdGlvbkFyZ3MuaW5jbHVzaXZlID0gdHJ1ZTsKICAgICAgICAgICAgb3BlcmF0b3JBcmdzLnNob3VsZE1vdmVDdXJzb3IgPSBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICAgIC8vIFN3YXAgc3RhcnQgYW5kIGVuZCBpZiBtb3Rpb24gd2FzIGJhY2t3YXJkLgogICAgICAgICAgaWYgKGN1ckVuZCAmJiBjdXJzb3JJc0JlZm9yZShjdXJFbmQsIGN1clN0YXJ0KSkgewogICAgICAgICAgICB2YXIgdG1wID0gY3VyU3RhcnQ7CiAgICAgICAgICAgIGN1clN0YXJ0ID0gY3VyRW5kOwogICAgICAgICAgICBjdXJFbmQgPSB0bXA7CiAgICAgICAgICAgIGludmVydGVkID0gdHJ1ZTsKICAgICAgICAgIH0gZWxzZSBpZiAoIWN1ckVuZCkgewogICAgICAgICAgICBjdXJFbmQgPSBjb3B5Q3Vyc29yKGN1clN0YXJ0KTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChtb3Rpb25BcmdzLmluY2x1c2l2ZSAmJiAhdmltLnZpc3VhbE1vZGUpIHsKICAgICAgICAgICAgLy8gTW92ZSB0aGUgc2VsZWN0aW9uIGVuZCBvbmUgdG8gdGhlIHJpZ2h0IHRvIGluY2x1ZGUgdGhlIGxhc3QKICAgICAgICAgICAgLy8gY2hhcmFjdGVyLgogICAgICAgICAgICBjdXJFbmQuY2grKzsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChvcGVyYXRvckFyZ3Muc2VsT2Zmc2V0KSB7CiAgICAgICAgICAgIC8vIFJlcGxheWluZyBhIHZpc3VhbCBtb2RlIG9wZXJhdGlvbgogICAgICAgICAgICBjdXJFbmQubGluZSA9IGN1clN0YXJ0LmxpbmUgKyBvcGVyYXRvckFyZ3Muc2VsT2Zmc2V0LmxpbmU7CiAgICAgICAgICAgIGlmIChvcGVyYXRvckFyZ3Muc2VsT2Zmc2V0LmxpbmUpIHtjdXJFbmQuY2ggPSBvcGVyYXRvckFyZ3Muc2VsT2Zmc2V0LmNoOyB9CiAgICAgICAgICAgIGVsc2UgeyBjdXJFbmQuY2ggPSBjdXJTdGFydC5jaCArIG9wZXJhdG9yQXJncy5zZWxPZmZzZXQuY2g7IH0KICAgICAgICAgICAgLy8gSW4gY2FzZSBvZiBibG9ja3dpc2UgdmlzdWFsCiAgICAgICAgICAgIGlmIChsYXN0U2VsZWN0aW9uICYmIGxhc3RTZWxlY3Rpb24udmlzdWFsQmxvY2spIHsKICAgICAgICAgICAgICB2YXIgYmxvY2sgPSBsYXN0U2VsZWN0aW9uLnZpc3VhbEJsb2NrOwogICAgICAgICAgICAgIHZhciB3aWR0aCA9IGJsb2NrLndpZHRoOwogICAgICAgICAgICAgIHZhciBoZWlnaHQgPSBibG9jay5oZWlnaHQ7CiAgICAgICAgICAgICAgY3VyRW5kID0gUG9zKGN1clN0YXJ0LmxpbmUgKyBoZWlnaHQsIGN1clN0YXJ0LmNoICsgd2lkdGgpOwogICAgICAgICAgICAgIC8vIHNlbGVjdEJsb2NrIGNyZWF0ZXMgYSAncHJvcGVyJyByZWN0YW5ndWxhciBibG9jay4KICAgICAgICAgICAgICAvLyBXZSBkbyBub3Qgd2FudCB0aGF0IGluIGFsbCBjYXNlcywgc28gd2UgbWFudWFsbHkgc2V0IHNlbGVjdGlvbnMuCiAgICAgICAgICAgICAgdmFyIHNlbGVjdGlvbnMgPSBbXTsKICAgICAgICAgICAgICBmb3IgKHZhciBpID0gY3VyU3RhcnQubGluZTsgaSA8IGN1ckVuZC5saW5lOyBpKyspIHsKICAgICAgICAgICAgICAgIHZhciBhbmNob3IgPSBQb3MoaSwgY3VyU3RhcnQuY2gpOwogICAgICAgICAgICAgICAgdmFyIGhlYWQgPSBQb3MoaSwgY3VyRW5kLmNoKTsKICAgICAgICAgICAgICAgIHZhciByYW5nZSA9IHthbmNob3I6IGFuY2hvciwgaGVhZDogaGVhZH07CiAgICAgICAgICAgICAgICBzZWxlY3Rpb25zLnB1c2gocmFuZ2UpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBjbS5zZXRTZWxlY3Rpb25zKHNlbGVjdGlvbnMpOwogICAgICAgICAgICAgIHZhciBibG9ja1NlbGVjdGVkID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIGlmICh2aW0udmlzdWFsTW9kZSkgewogICAgICAgICAgICB2YXIgc2VsT2Zmc2V0ID0gUG9zKCk7CiAgICAgICAgICAgIHNlbE9mZnNldC5saW5lID0gY3VyRW5kLmxpbmUgLSBjdXJTdGFydC5saW5lOwogICAgICAgICAgICBpZiAoc2VsT2Zmc2V0LmxpbmUpIHsgc2VsT2Zmc2V0LmNoID0gY3VyRW5kLmNoOyB9CiAgICAgICAgICAgIGVsc2UgeyBzZWxPZmZzZXQuY2ggPSBjdXJFbmQuY2ggLSBjdXJTdGFydC5jaDsgfQogICAgICAgICAgICBvcGVyYXRvckFyZ3Muc2VsT2Zmc2V0ID0gc2VsT2Zmc2V0OwogICAgICAgICAgfQogICAgICAgICAgdmFyIGxpbmV3aXNlID0gbW90aW9uQXJncy5saW5ld2lzZSB8fAogICAgICAgICAgICAgICh2aW0udmlzdWFsTW9kZSAmJiB2aW0udmlzdWFsTGluZSkgfHwKICAgICAgICAgICAgICBvcGVyYXRvckFyZ3MubGluZXdpc2U7CiAgICAgICAgICBpZiAobGluZXdpc2UpIHsKICAgICAgICAgICAgLy8gRXhwYW5kIHNlbGVjdGlvbiB0byBlbnRpcmUgbGluZS4KICAgICAgICAgICAgZXhwYW5kU2VsZWN0aW9uVG9MaW5lKGNtLCBjdXJTdGFydCwgY3VyRW5kKTsKICAgICAgICAgIH0gZWxzZSBpZiAobW90aW9uQXJncy5mb3J3YXJkKSB7CiAgICAgICAgICAgIC8vIENsaXAgdG8gdHJhaWxpbmcgbmV3bGluZXMgb25seSBpZiB0aGUgbW90aW9uIGdvZXMgZm9yd2FyZC4KICAgICAgICAgICAgY2xpcFRvTGluZShjbSwgY3VyU3RhcnQsIGN1ckVuZCk7CiAgICAgICAgICB9CiAgICAgICAgICBvcGVyYXRvckFyZ3MucmVnaXN0ZXJOYW1lID0gcmVnaXN0ZXJOYW1lOwogICAgICAgICAgLy8gS2VlcCB0cmFjayBvZiBsaW5ld2lzZSBhcyBpdCBhZmZlY3RzIGhvdyBwYXN0ZSBhbmQgY2hhbmdlIGJlaGF2ZS4KICAgICAgICAgIG9wZXJhdG9yQXJncy5saW5ld2lzZSA9IGxpbmV3aXNlOwogICAgICAgICAgaWYgKCF2aW0udmlzdWFsQmxvY2sgJiYgIWJsb2NrU2VsZWN0ZWQpIHsKICAgICAgICAgICAgY20uc2V0U2VsZWN0aW9uKGN1clN0YXJ0LCBjdXJFbmQpOwogICAgICAgICAgfQogICAgICAgICAgb3BlcmF0b3JzW29wZXJhdG9yXShjbSwgb3BlcmF0b3JBcmdzLCB2aW0sIGN1clN0YXJ0LAogICAgICAgICAgICAgIGN1ckVuZCwgY3VyT3JpZ2luYWwpOwogICAgICAgICAgaWYgKHZpbS52aXN1YWxNb2RlKSB7CiAgICAgICAgICAgIGV4aXRWaXN1YWxNb2RlKGNtKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgIHJlY29yZExhc3RFZGl0OiBmdW5jdGlvbih2aW0sIGlucHV0U3RhdGUsIGFjdGlvbkNvbW1hbmQpIHsKICAgICAgICB2YXIgbWFjcm9Nb2RlU3RhdGUgPSB2aW1HbG9iYWxTdGF0ZS5tYWNyb01vZGVTdGF0ZTsKICAgICAgICBpZiAobWFjcm9Nb2RlU3RhdGUuaXNQbGF5aW5nKSB7IHJldHVybjsgfQogICAgICAgIHZpbS5sYXN0RWRpdElucHV0U3RhdGUgPSBpbnB1dFN0YXRlOwogICAgICAgIHZpbS5sYXN0RWRpdEFjdGlvbkNvbW1hbmQgPSBhY3Rpb25Db21tYW5kOwogICAgICAgIG1hY3JvTW9kZVN0YXRlLmxhc3RJbnNlcnRNb2RlQ2hhbmdlcy5jaGFuZ2VzID0gW107CiAgICAgICAgbWFjcm9Nb2RlU3RhdGUubGFzdEluc2VydE1vZGVDaGFuZ2VzLmV4cGVjdEN1cnNvckFjdGl2aXR5Rm9yQ2hhbmdlID0gZmFsc2U7CiAgICAgIH0KICAgIH07CgogICAgLyoqCiAgICAgKiB0eXBlZGVmIHtPYmplY3R7bGluZTpudW1iZXIsY2g6bnVtYmVyfX0gQ3Vyc29yIEFuIG9iamVjdCBjb250YWluaW5nIHRoZQogICAgICogICAgIHBvc2l0aW9uIG9mIHRoZSBjdXJzb3IuCiAgICAgKi8KICAgIC8vIEFsbCBvZiB0aGUgZnVuY3Rpb25zIGJlbG93IHJldHVybiBDdXJzb3Igb2JqZWN0cy4KICAgIHZhciBtb3Rpb25zID0gewogICAgICBtb3ZlVG9Ub3BMaW5lOiBmdW5jdGlvbihjbSwgbW90aW9uQXJncykgewogICAgICAgIHZhciBsaW5lID0gZ2V0VXNlclZpc2libGVMaW5lcyhjbSkudG9wICsgbW90aW9uQXJncy5yZXBlYXQgLTE7CiAgICAgICAgcmV0dXJuIFBvcyhsaW5lLCBmaW5kRmlyc3ROb25XaGl0ZVNwYWNlQ2hhcmFjdGVyKGNtLmdldExpbmUobGluZSkpKTsKICAgICAgfSwKICAgICAgbW92ZVRvTWlkZGxlTGluZTogZnVuY3Rpb24oY20pIHsKICAgICAgICB2YXIgcmFuZ2UgPSBnZXRVc2VyVmlzaWJsZUxpbmVzKGNtKTsKICAgICAgICB2YXIgbGluZSA9IE1hdGguZmxvb3IoKHJhbmdlLnRvcCArIHJhbmdlLmJvdHRvbSkgKiAwLjUpOwogICAgICAgIHJldHVybiBQb3MobGluZSwgZmluZEZpcnN0Tm9uV2hpdGVTcGFjZUNoYXJhY3RlcihjbS5nZXRMaW5lKGxpbmUpKSk7CiAgICAgIH0sCiAgICAgIG1vdmVUb0JvdHRvbUxpbmU6IGZ1bmN0aW9uKGNtLCBtb3Rpb25BcmdzKSB7CiAgICAgICAgdmFyIGxpbmUgPSBnZXRVc2VyVmlzaWJsZUxpbmVzKGNtKS5ib3R0b20gLSBtb3Rpb25BcmdzLnJlcGVhdCArMTsKICAgICAgICByZXR1cm4gUG9zKGxpbmUsIGZpbmRGaXJzdE5vbldoaXRlU3BhY2VDaGFyYWN0ZXIoY20uZ2V0TGluZShsaW5lKSkpOwogICAgICB9LAogICAgICBleHBhbmRUb0xpbmU6IGZ1bmN0aW9uKGNtLCBtb3Rpb25BcmdzKSB7CiAgICAgICAgLy8gRXhwYW5kcyBmb3J3YXJkIHRvIGVuZCBvZiBsaW5lLCBhbmQgdGhlbiB0byBuZXh0IGxpbmUgaWYgcmVwZWF0IGlzCiAgICAgICAgLy8gPjEuIERvZXMgbm90IGhhbmRsZSBiYWNrd2FyZCBtb3Rpb24hCiAgICAgICAgdmFyIGN1ciA9IGNtLmdldEN1cnNvcigpOwogICAgICAgIHJldHVybiBQb3MoY3VyLmxpbmUgKyBtb3Rpb25BcmdzLnJlcGVhdCAtIDEsIEluZmluaXR5KTsKICAgICAgfSwKICAgICAgZmluZE5leHQ6IGZ1bmN0aW9uKGNtLCBtb3Rpb25BcmdzKSB7CiAgICAgICAgdmFyIHN0YXRlID0gZ2V0U2VhcmNoU3RhdGUoY20pOwogICAgICAgIHZhciBxdWVyeSA9IHN0YXRlLmdldFF1ZXJ5KCk7CiAgICAgICAgaWYgKCFxdWVyeSkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB2YXIgcHJldiA9ICFtb3Rpb25BcmdzLmZvcndhcmQ7CiAgICAgICAgLy8gSWYgc2VhcmNoIGlzIGluaXRpYXRlZCB3aXRoID8gaW5zdGVhZCBvZiAvLCBuZWdhdGUgZGlyZWN0aW9uLgogICAgICAgIHByZXYgPSAoc3RhdGUuaXNSZXZlcnNlZCgpKSA/ICFwcmV2IDogcHJldjsKICAgICAgICBoaWdobGlnaHRTZWFyY2hNYXRjaGVzKGNtLCBxdWVyeSk7CiAgICAgICAgcmV0dXJuIGZpbmROZXh0KGNtLCBwcmV2LyoqIHByZXYgKi8sIHF1ZXJ5LCBtb3Rpb25BcmdzLnJlcGVhdCk7CiAgICAgIH0sCiAgICAgIGdvVG9NYXJrOiBmdW5jdGlvbihjbSwgbW90aW9uQXJncywgdmltKSB7CiAgICAgICAgdmFyIG1hcmsgPSB2aW0ubWFya3NbbW90aW9uQXJncy5zZWxlY3RlZENoYXJhY3Rlcl07CiAgICAgICAgaWYgKG1hcmspIHsKICAgICAgICAgIHZhciBwb3MgPSBtYXJrLmZpbmQoKTsKICAgICAgICAgIHJldHVybiBtb3Rpb25BcmdzLmxpbmV3aXNlID8geyBsaW5lOiBwb3MubGluZSwgY2g6IGZpbmRGaXJzdE5vbldoaXRlU3BhY2VDaGFyYWN0ZXIoY20uZ2V0TGluZShwb3MubGluZSkpIH0gOiBwb3M7CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgICB9LAogICAgICBtb3ZlVG9PdGhlckhpZ2hsaWdodGVkRW5kOiBmdW5jdGlvbihjbSwgbW90aW9uQXJncywgdmltKSB7CiAgICAgICAgdmFyIHJhbmdlcyA9IGNtLmxpc3RTZWxlY3Rpb25zKCk7CiAgICAgICAgdmFyIGN1ckVuZCA9IGNtLmdldEN1cnNvcignaGVhZCcpOwogICAgICAgIHZhciBjdXJTdGFydCA9IHJhbmdlc1swXS5hbmNob3I7CiAgICAgICAgdmFyIGN1ckluZGV4ID0gY3Vyc29yRXF1YWwocmFuZ2VzWzBdLmhlYWQsIGN1ckVuZCkgPyByYW5nZXMubGVuZ3RoLTEgOiAwOwogICAgICAgIGlmIChtb3Rpb25BcmdzLnNhbWVMaW5lICYmIHZpbS52aXN1YWxCbG9jaykgewogICAgICAgICAgY3VyU3RhcnQgPSBQb3MoY3VyRW5kLmxpbmUsIHJhbmdlc1tjdXJJbmRleF0uYW5jaG9yLmNoKTsKICAgICAgICAgIGN1ckVuZCA9IFBvcyhyYW5nZXNbY3VySW5kZXhdLmhlYWQubGluZSwgY3VyRW5kLmNoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY3VyU3RhcnQgPSByYW5nZXNbY3VySW5kZXhdLmFuY2hvcjsKICAgICAgICB9CiAgICAgICAgY20uc2V0Q3Vyc29yKGN1ckVuZCk7CiAgICAgICAgcmV0dXJuIChbY3VyRW5kLCBjdXJTdGFydF0pOwogICAgICB9LAogICAgICBqdW1wVG9NYXJrOiBmdW5jdGlvbihjbSwgbW90aW9uQXJncywgdmltKSB7CiAgICAgICAgdmFyIGJlc3QgPSBjbS5nZXRDdXJzb3IoKTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1vdGlvbkFyZ3MucmVwZWF0OyBpKyspIHsKICAgICAgICAgIHZhciBjdXJzb3IgPSBiZXN0OwogICAgICAgICAgZm9yICh2YXIga2V5IGluIHZpbS5tYXJrcykgewogICAgICAgICAgICBpZiAoIWlzTG93ZXJDYXNlKGtleSkpIHsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgbWFyayA9IHZpbS5tYXJrc1trZXldLmZpbmQoKTsKICAgICAgICAgICAgdmFyIGlzV3JvbmdEaXJlY3Rpb24gPSAobW90aW9uQXJncy5mb3J3YXJkKSA/CiAgICAgICAgICAgICAgY3Vyc29ySXNCZWZvcmUobWFyaywgY3Vyc29yKSA6IGN1cnNvcklzQmVmb3JlKGN1cnNvciwgbWFyayk7CgogICAgICAgICAgICBpZiAoaXNXcm9uZ0RpcmVjdGlvbikgewogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChtb3Rpb25BcmdzLmxpbmV3aXNlICYmIChtYXJrLmxpbmUgPT0gY3Vyc29yLmxpbmUpKSB7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBlcXVhbCA9IGN1cnNvckVxdWFsKGN1cnNvciwgYmVzdCk7CiAgICAgICAgICAgIHZhciBiZXR3ZWVuID0gKG1vdGlvbkFyZ3MuZm9yd2FyZCkgPwogICAgICAgICAgICAgIGN1c3JvcklzQmV0d2VlbihjdXJzb3IsIG1hcmssIGJlc3QpIDoKICAgICAgICAgICAgICBjdXNyb3JJc0JldHdlZW4oYmVzdCwgbWFyaywgY3Vyc29yKTsKCiAgICAgICAgICAgIGlmIChlcXVhbCB8fCBiZXR3ZWVuKSB7CiAgICAgICAgICAgICAgYmVzdCA9IG1hcms7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChtb3Rpb25BcmdzLmxpbmV3aXNlKSB7CiAgICAgICAgICAvLyBWaW0gcGxhY2VzIHRoZSBjdXJzb3Igb24gdGhlIGZpcnN0IG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlciBvZgogICAgICAgICAgLy8gdGhlIGxpbmUgaWYgdGhlcmUgaXMgb25lLCBlbHNlIGl0IHBsYWNlcyB0aGUgY3Vyc29yIGF0IHRoZSBlbmQKICAgICAgICAgIC8vIG9mIHRoZSBsaW5lLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgYSBtYXJrIHdhcyBmb3VuZC4KICAgICAgICAgIGJlc3QgPSBQb3MoYmVzdC5saW5lLCBmaW5kRmlyc3ROb25XaGl0ZVNwYWNlQ2hhcmFjdGVyKGNtLmdldExpbmUoYmVzdC5saW5lKSkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gYmVzdDsKICAgICAgfSwKICAgICAgbW92ZUJ5Q2hhcmFjdGVyczogZnVuY3Rpb24oY20sIG1vdGlvbkFyZ3MpIHsKICAgICAgICB2YXIgY3VyID0gY20uZ2V0Q3Vyc29yKCk7CiAgICAgICAgdmFyIHJlcGVhdCA9IG1vdGlvbkFyZ3MucmVwZWF0OwogICAgICAgIHZhciBjaCA9IG1vdGlvbkFyZ3MuZm9yd2FyZCA/IGN1ci5jaCArIHJlcGVhdCA6IGN1ci5jaCAtIHJlcGVhdDsKICAgICAgICByZXR1cm4gUG9zKGN1ci5saW5lLCBjaCk7CiAgICAgIH0sCiAgICAgIG1vdmVCeUxpbmVzOiBmdW5jdGlvbihjbSwgbW90aW9uQXJncywgdmltKSB7CiAgICAgICAgdmFyIGN1ciA9IGNtLmdldEN1cnNvcigpOwogICAgICAgIHZhciBlbmRDaCA9IGN1ci5jaDsKICAgICAgICAvLyBEZXBlbmRpbmcgd2hhdCBvdXIgbGFzdCBtb3Rpb24gd2FzLCB3ZSBtYXkgd2FudCB0byBkbyBkaWZmZXJlbnQKICAgICAgICAvLyB0aGluZ3MuIElmIG91ciBsYXN0IG1vdGlvbiB3YXMgbW92aW5nIHZlcnRpY2FsbHksIHdlIHdhbnQgdG8KICAgICAgICAvLyBwcmVzZXJ2ZSB0aGUgSFBvcyBmcm9tIG91ciBsYXN0IGhvcml6b250YWwgbW92ZS4gIElmIG91ciBsYXN0IG1vdGlvbgogICAgICAgIC8vIHdhcyBnb2luZyB0byB0aGUgZW5kIG9mIGEgbGluZSwgbW92aW5nIHZlcnRpY2FsbHkgd2Ugc2hvdWxkIGdvIHRvCiAgICAgICAgLy8gdGhlIGVuZCBvZiB0aGUgbGluZSwgZXRjLgogICAgICAgIHN3aXRjaCAodmltLmxhc3RNb3Rpb24pIHsKICAgICAgICAgIGNhc2UgdGhpcy5tb3ZlQnlMaW5lczoKICAgICAgICAgIGNhc2UgdGhpcy5tb3ZlQnlEaXNwbGF5TGluZXM6CiAgICAgICAgICBjYXNlIHRoaXMubW92ZUJ5U2Nyb2xsOgogICAgICAgICAgY2FzZSB0aGlzLm1vdmVUb0NvbHVtbjoKICAgICAgICAgIGNhc2UgdGhpcy5tb3ZlVG9Fb2w6CiAgICAgICAgICAgIGVuZENoID0gdmltLmxhc3RIUG9zOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHZpbS5sYXN0SFBvcyA9IGVuZENoOwogICAgICAgIH0KICAgICAgICB2YXIgcmVwZWF0ID0gbW90aW9uQXJncy5yZXBlYXQrKG1vdGlvbkFyZ3MucmVwZWF0T2Zmc2V0fHwwKTsKICAgICAgICB2YXIgbGluZSA9IG1vdGlvbkFyZ3MuZm9yd2FyZCA/IGN1ci5saW5lICsgcmVwZWF0IDogY3VyLmxpbmUgLSByZXBlYXQ7CiAgICAgICAgdmFyIGZpcnN0ID0gY20uZmlyc3RMaW5lKCk7CiAgICAgICAgdmFyIGxhc3QgPSBjbS5sYXN0TGluZSgpOwogICAgICAgIC8vIFZpbSBjYW5jZWxzIGxpbmV3aXNlIG1vdGlvbnMgdGhhdCBzdGFydCBvbiBhbiBlZGdlIGFuZCBtb3ZlIGJleW9uZAogICAgICAgIC8vIHRoYXQgZWRnZS4gSXQgZG9lcyBub3QgY2FuY2VsIG1vdGlvbnMgdGhhdCBkbyBub3Qgc3RhcnQgb24gYW4gZWRnZS4KICAgICAgICBpZiAoKGxpbmUgPCBmaXJzdCAmJiBjdXIubGluZSA9PSBmaXJzdCkgfHwKICAgICAgICAgICAgKGxpbmUgPiBsYXN0ICYmIGN1ci5saW5lID09IGxhc3QpKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmIChtb3Rpb25BcmdzLnRvRmlyc3RDaGFyKXsKICAgICAgICAgIGVuZENoPWZpbmRGaXJzdE5vbldoaXRlU3BhY2VDaGFyYWN0ZXIoY20uZ2V0TGluZShsaW5lKSk7CiAgICAgICAgICB2aW0ubGFzdEhQb3MgPSBlbmRDaDsKICAgICAgICB9CiAgICAgICAgdmltLmxhc3RIU1BvcyA9IGNtLmNoYXJDb29yZHMoUG9zKGxpbmUsIGVuZENoKSwnZGl2JykubGVmdDsKICAgICAgICByZXR1cm4gUG9zKGxpbmUsIGVuZENoKTsKICAgICAgfSwKICAgICAgbW92ZUJ5RGlzcGxheUxpbmVzOiBmdW5jdGlvbihjbSwgbW90aW9uQXJncywgdmltKSB7CiAgICAgICAgdmFyIGN1ciA9IGNtLmdldEN1cnNvcigpOwogICAgICAgIHN3aXRjaCAodmltLmxhc3RNb3Rpb24pIHsKICAgICAgICAgIGNhc2UgdGhpcy5tb3ZlQnlEaXNwbGF5TGluZXM6CiAgICAgICAgICBjYXNlIHRoaXMubW92ZUJ5U2Nyb2xsOgogICAgICAgICAgY2FzZSB0aGlzLm1vdmVCeUxpbmVzOgogICAgICAgICAgY2FzZSB0aGlzLm1vdmVUb0NvbHVtbjoKICAgICAgICAgIGNhc2UgdGhpcy5tb3ZlVG9Fb2w6CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgdmltLmxhc3RIU1BvcyA9IGNtLmNoYXJDb29yZHMoY3VyLCdkaXYnKS5sZWZ0OwogICAgICAgIH0KICAgICAgICB2YXIgcmVwZWF0ID0gbW90aW9uQXJncy5yZXBlYXQ7CiAgICAgICAgdmFyIHJlcz1jbS5maW5kUG9zVihjdXIsKG1vdGlvbkFyZ3MuZm9yd2FyZCA/IHJlcGVhdCA6IC1yZXBlYXQpLCdsaW5lJyx2aW0ubGFzdEhTUG9zKTsKICAgICAgICBpZiAocmVzLmhpdFNpZGUpIHsKICAgICAgICAgIGlmIChtb3Rpb25BcmdzLmZvcndhcmQpIHsKICAgICAgICAgICAgdmFyIGxhc3RDaGFyQ29vcmRzID0gY20uY2hhckNvb3JkcyhyZXMsICdkaXYnKTsKICAgICAgICAgICAgdmFyIGdvYWxDb29yZHMgPSB7IHRvcDogbGFzdENoYXJDb29yZHMudG9wICsgOCwgbGVmdDogdmltLmxhc3RIU1BvcyB9OwogICAgICAgICAgICB2YXIgcmVzID0gY20uY29vcmRzQ2hhcihnb2FsQ29vcmRzLCAnZGl2Jyk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB2YXIgcmVzQ29vcmRzID0gY20uY2hhckNvb3JkcyhQb3MoY20uZmlyc3RMaW5lKCksIDApLCAnZGl2Jyk7CiAgICAgICAgICAgIHJlc0Nvb3Jkcy5sZWZ0ID0gdmltLmxhc3RIU1BvczsKICAgICAgICAgICAgcmVzID0gY20uY29vcmRzQ2hhcihyZXNDb29yZHMsICdkaXYnKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdmltLmxhc3RIUG9zID0gcmVzLmNoOwogICAgICAgIHJldHVybiByZXM7CiAgICAgIH0sCiAgICAgIG1vdmVCeVBhZ2U6IGZ1bmN0aW9uKGNtLCBtb3Rpb25BcmdzKSB7CiAgICAgICAgLy8gQ29kZU1pcnJvciBvbmx5IGV4cG9zZXMgZnVuY3Rpb25zIHRoYXQgbW92ZSB0aGUgY3Vyc29yIHBhZ2UgZG93biwgc28KICAgICAgICAvLyBkb2luZyB0aGlzIGJhZCBoYWNrIHRvIG1vdmUgdGhlIGN1cnNvciBhbmQgbW92ZSBpdCBiYWNrLiBldmFsSW5wdXQKICAgICAgICAvLyB3aWxsIG1vdmUgdGhlIGN1cnNvciB0byB3aGVyZSBpdCBzaG91bGQgYmUgaW4gdGhlIGVuZC4KICAgICAgICB2YXIgY3VyU3RhcnQgPSBjbS5nZXRDdXJzb3IoKTsKICAgICAgICB2YXIgcmVwZWF0ID0gbW90aW9uQXJncy5yZXBlYXQ7CiAgICAgICAgcmV0dXJuIGNtLmZpbmRQb3NWKGN1clN0YXJ0LCAobW90aW9uQXJncy5mb3J3YXJkID8gcmVwZWF0IDogLXJlcGVhdCksICdwYWdlJyk7CiAgICAgIH0sCiAgICAgIG1vdmVCeVBhcmFncmFwaDogZnVuY3Rpb24oY20sIG1vdGlvbkFyZ3MpIHsKICAgICAgICB2YXIgbGluZSA9IGNtLmdldEN1cnNvcigpLmxpbmU7CiAgICAgICAgdmFyIHJlcGVhdCA9IG1vdGlvbkFyZ3MucmVwZWF0OwogICAgICAgIHZhciBpbmMgPSBtb3Rpb25BcmdzLmZvcndhcmQgPyAxIDogLTE7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXBlYXQ7IGkrKykgewogICAgICAgICAgaWYgKCghbW90aW9uQXJncy5mb3J3YXJkICYmIGxpbmUgPT09IGNtLmZpcnN0TGluZSgpICkgfHwKICAgICAgICAgICAgICAobW90aW9uQXJncy5mb3J3YXJkICYmIGxpbmUgPT0gY20ubGFzdExpbmUoKSkpIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBsaW5lICs9IGluYzsKICAgICAgICAgIHdoaWxlIChsaW5lICE9PSBjbS5maXJzdExpbmUoKSAmJiBsaW5lICE9IGNtLmxhc3RMaW5lKCkgJiYgY20uZ2V0TGluZShsaW5lKSkgewogICAgICAgICAgICBsaW5lICs9IGluYzsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIFBvcyhsaW5lLCAwKTsKICAgICAgfSwKICAgICAgbW92ZUJ5U2Nyb2xsOiBmdW5jdGlvbihjbSwgbW90aW9uQXJncywgdmltKSB7CiAgICAgICAgdmFyIHNjcm9sbGJveCA9IGNtLmdldFNjcm9sbEluZm8oKTsKICAgICAgICB2YXIgY3VyRW5kID0gbnVsbDsKICAgICAgICB2YXIgcmVwZWF0ID0gbW90aW9uQXJncy5yZXBlYXQ7CiAgICAgICAgaWYgKCFyZXBlYXQpIHsKICAgICAgICAgIHJlcGVhdCA9IHNjcm9sbGJveC5jbGllbnRIZWlnaHQgLyAoMiAqIGNtLmRlZmF1bHRUZXh0SGVpZ2h0KCkpOwogICAgICAgIH0KICAgICAgICB2YXIgb3JpZyA9IGNtLmNoYXJDb29yZHMoY20uZ2V0Q3Vyc29yKCksICdsb2NhbCcpOwogICAgICAgIG1vdGlvbkFyZ3MucmVwZWF0ID0gcmVwZWF0OwogICAgICAgIHZhciBjdXJFbmQgPSBtb3Rpb25zLm1vdmVCeURpc3BsYXlMaW5lcyhjbSwgbW90aW9uQXJncywgdmltKTsKICAgICAgICBpZiAoIWN1ckVuZCkgewogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIHZhciBkZXN0ID0gY20uY2hhckNvb3JkcyhjdXJFbmQsICdsb2NhbCcpOwogICAgICAgIGNtLnNjcm9sbFRvKG51bGwsIHNjcm9sbGJveC50b3AgKyBkZXN0LnRvcCAtIG9yaWcudG9wKTsKICAgICAgICByZXR1cm4gY3VyRW5kOwogICAgICB9LAogICAgICBtb3ZlQnlXb3JkczogZnVuY3Rpb24oY20sIG1vdGlvbkFyZ3MpIHsKICAgICAgICByZXR1cm4gbW92ZVRvV29yZChjbSwgbW90aW9uQXJncy5yZXBlYXQsICEhbW90aW9uQXJncy5mb3J3YXJkLAogICAgICAgICAgICAhIW1vdGlvbkFyZ3Mud29yZEVuZCwgISFtb3Rpb25BcmdzLmJpZ1dvcmQpOwogICAgICB9LAogICAgICBtb3ZlVGlsbENoYXJhY3RlcjogZnVuY3Rpb24oY20sIG1vdGlvbkFyZ3MpIHsKICAgICAgICB2YXIgcmVwZWF0ID0gbW90aW9uQXJncy5yZXBlYXQ7CiAgICAgICAgdmFyIGN1ckVuZCA9IG1vdmVUb0NoYXJhY3RlcihjbSwgcmVwZWF0LCBtb3Rpb25BcmdzLmZvcndhcmQsCiAgICAgICAgICAgIG1vdGlvbkFyZ3Muc2VsZWN0ZWRDaGFyYWN0ZXIpOwogICAgICAgIHZhciBpbmNyZW1lbnQgPSBtb3Rpb25BcmdzLmZvcndhcmQgPyAtMSA6IDE7CiAgICAgICAgcmVjb3JkTGFzdENoYXJhY3RlclNlYXJjaChpbmNyZW1lbnQsIG1vdGlvbkFyZ3MpOwogICAgICAgIGlmICghY3VyRW5kKSByZXR1cm4gbnVsbDsKICAgICAgICBjdXJFbmQuY2ggKz0gaW5jcmVtZW50OwogICAgICAgIHJldHVybiBjdXJFbmQ7CiAgICAgIH0sCiAgICAgIG1vdmVUb0NoYXJhY3RlcjogZnVuY3Rpb24oY20sIG1vdGlvbkFyZ3MpIHsKICAgICAgICB2YXIgcmVwZWF0ID0gbW90aW9uQXJncy5yZXBlYXQ7CiAgICAgICAgcmVjb3JkTGFzdENoYXJhY3RlclNlYXJjaCgwLCBtb3Rpb25BcmdzKTsKICAgICAgICByZXR1cm4gbW92ZVRvQ2hhcmFjdGVyKGNtLCByZXBlYXQsIG1vdGlvbkFyZ3MuZm9yd2FyZCwKICAgICAgICAgICAgbW90aW9uQXJncy5zZWxlY3RlZENoYXJhY3RlcikgfHwgY20uZ2V0Q3Vyc29yKCk7CiAgICAgIH0sCiAgICAgIG1vdmVUb1N5bWJvbDogZnVuY3Rpb24oY20sIG1vdGlvbkFyZ3MpIHsKICAgICAgICB2YXIgcmVwZWF0ID0gbW90aW9uQXJncy5yZXBlYXQ7CiAgICAgICAgcmV0dXJuIGZpbmRTeW1ib2woY20sIHJlcGVhdCwgbW90aW9uQXJncy5mb3J3YXJkLAogICAgICAgICAgICBtb3Rpb25BcmdzLnNlbGVjdGVkQ2hhcmFjdGVyKSB8fCBjbS5nZXRDdXJzb3IoKTsKICAgICAgfSwKICAgICAgbW92ZVRvQ29sdW1uOiBmdW5jdGlvbihjbSwgbW90aW9uQXJncywgdmltKSB7CiAgICAgICAgdmFyIHJlcGVhdCA9IG1vdGlvbkFyZ3MucmVwZWF0OwogICAgICAgIC8vIHJlcGVhdCBpcyBlcXVpdmFsZW50IHRvIHdoaWNoIGNvbHVtbiB3ZSB3YW50IHRvIG1vdmUgdG8hCiAgICAgICAgdmltLmxhc3RIUG9zID0gcmVwZWF0IC0gMTsKICAgICAgICB2aW0ubGFzdEhTUG9zID0gY20uY2hhckNvb3JkcyhjbS5nZXRDdXJzb3IoKSwnZGl2JykubGVmdDsKICAgICAgICByZXR1cm4gbW92ZVRvQ29sdW1uKGNtLCByZXBlYXQpOwogICAgICB9LAogICAgICBtb3ZlVG9Fb2w6IGZ1bmN0aW9uKGNtLCBtb3Rpb25BcmdzLCB2aW0pIHsKICAgICAgICB2YXIgY3VyID0gY20uZ2V0Q3Vyc29yKCk7CiAgICAgICAgdmltLmxhc3RIUG9zID0gSW5maW5pdHk7CiAgICAgICAgdmFyIHJldHZhbD0gUG9zKGN1ci5saW5lICsgbW90aW9uQXJncy5yZXBlYXQgLSAxLCBJbmZpbml0eSk7CiAgICAgICAgdmFyIGVuZD1jbS5jbGlwUG9zKHJldHZhbCk7CiAgICAgICAgZW5kLmNoLS07CiAgICAgICAgdmltLmxhc3RIU1BvcyA9IGNtLmNoYXJDb29yZHMoZW5kLCdkaXYnKS5sZWZ0OwogICAgICAgIHJldHVybiByZXR2YWw7CiAgICAgIH0sCiAgICAgIG1vdmVUb0ZpcnN0Tm9uV2hpdGVTcGFjZUNoYXJhY3RlcjogZnVuY3Rpb24oY20pIHsKICAgICAgICAvLyBHbyB0byB0aGUgc3RhcnQgb2YgdGhlIGxpbmUgd2hlcmUgdGhlIHRleHQgYmVnaW5zLCBvciB0aGUgZW5kIGZvcgogICAgICAgIC8vIHdoaXRlc3BhY2Utb25seSBsaW5lcwogICAgICAgIHZhciBjdXJzb3IgPSBjbS5nZXRDdXJzb3IoKTsKICAgICAgICByZXR1cm4gUG9zKGN1cnNvci5saW5lLAogICAgICAgICAgICAgICAgICAgZmluZEZpcnN0Tm9uV2hpdGVTcGFjZUNoYXJhY3RlcihjbS5nZXRMaW5lKGN1cnNvci5saW5lKSkpOwogICAgICB9LAogICAgICBtb3ZlVG9NYXRjaGVkU3ltYm9sOiBmdW5jdGlvbihjbSkgewogICAgICAgIHZhciBjdXJzb3IgPSBjbS5nZXRDdXJzb3IoKTsKICAgICAgICB2YXIgbGluZSA9IGN1cnNvci5saW5lOwogICAgICAgIHZhciBjaCA9IGN1cnNvci5jaDsKICAgICAgICB2YXIgbGluZVRleHQgPSBjbS5nZXRMaW5lKGxpbmUpOwogICAgICAgIHZhciBzeW1ib2w7CiAgICAgICAgZG8gewogICAgICAgICAgc3ltYm9sID0gbGluZVRleHQuY2hhckF0KGNoKyspOwogICAgICAgICAgaWYgKHN5bWJvbCAmJiBpc01hdGNoYWJsZVN5bWJvbChzeW1ib2wpKSB7CiAgICAgICAgICAgIHZhciBzdHlsZSA9IGNtLmdldFRva2VuVHlwZUF0KFBvcyhsaW5lLCBjaCkpOwogICAgICAgICAgICBpZiAoc3R5bGUgIT09ICJzdHJpbmciICYmIHN0eWxlICE9PSAiY29tbWVudCIpIHsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gd2hpbGUgKHN5bWJvbCk7CiAgICAgICAgaWYgKHN5bWJvbCkgewogICAgICAgICAgdmFyIG1hdGNoZWQgPSBjbS5maW5kTWF0Y2hpbmdCcmFja2V0KFBvcyhsaW5lLCBjaCkpOwogICAgICAgICAgcmV0dXJuIG1hdGNoZWQudG87CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBjdXJzb3I7CiAgICAgICAgfQogICAgICB9LAogICAgICBtb3ZlVG9TdGFydE9mTGluZTogZnVuY3Rpb24oY20pIHsKICAgICAgICB2YXIgY3Vyc29yID0gY20uZ2V0Q3Vyc29yKCk7CiAgICAgICAgcmV0dXJuIFBvcyhjdXJzb3IubGluZSwgMCk7CiAgICAgIH0sCiAgICAgIG1vdmVUb0xpbmVPckVkZ2VPZkRvY3VtZW50OiBmdW5jdGlvbihjbSwgbW90aW9uQXJncykgewogICAgICAgIHZhciBsaW5lTnVtID0gbW90aW9uQXJncy5mb3J3YXJkID8gY20ubGFzdExpbmUoKSA6IGNtLmZpcnN0TGluZSgpOwogICAgICAgIGlmIChtb3Rpb25BcmdzLnJlcGVhdElzRXhwbGljaXQpIHsKICAgICAgICAgIGxpbmVOdW0gPSBtb3Rpb25BcmdzLnJlcGVhdCAtIGNtLmdldE9wdGlvbignZmlyc3RMaW5lTnVtYmVyJyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBQb3MobGluZU51bSwKICAgICAgICAgICAgICAgICAgIGZpbmRGaXJzdE5vbldoaXRlU3BhY2VDaGFyYWN0ZXIoY20uZ2V0TGluZShsaW5lTnVtKSkpOwogICAgICB9LAogICAgICB0ZXh0T2JqZWN0TWFuaXB1bGF0aW9uOiBmdW5jdGlvbihjbSwgbW90aW9uQXJncykgewogICAgICAgIC8vIFRPRE86IGxvdHMgb2YgcG9zc2libGUgZXhjZXB0aW9ucyB0aGF0IGNhbiBiZSB0aHJvd24gaGVyZS4gVHJ5IGRhKAogICAgICAgIC8vICAgICBvdXRzaWRlIG9mIGEgKCkgYmxvY2suCgogICAgICAgIC8vIFRPRE86IGFkZGluZyA8PiA+PCB0byB0aGlzIG1hcCBkb2Vzbid0IHdvcmssIHByZXN1bWFibHkgYmVjYXVzZQogICAgICAgIC8vIHRoZXkncmUgb3BlcmF0b3JzCiAgICAgICAgdmFyIG1pcnJvcmVkUGFpcnMgPSB7JygnOiAnKScsICcpJzogJygnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICd7JzogJ30nLCAnfSc6ICd7JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWyc6ICddJywgJ10nOiAnWyd9OwogICAgICAgIHZhciBzZWxmUGFpcmVkID0geydcJyc6IHRydWUsICciJzogdHJ1ZX07CgogICAgICAgIHZhciBjaGFyYWN0ZXIgPSBtb3Rpb25BcmdzLnNlbGVjdGVkQ2hhcmFjdGVyOwogICAgICAgIC8vICdiJyByZWZlcnMgdG8gICcoKScgYmxvY2suCiAgICAgICAgLy8gJ0InIHJlZmVycyB0byAgJ3t9JyBibG9jay4KICAgICAgICBpZiAoY2hhcmFjdGVyID09ICdiJykgewogICAgICAgICAgY2hhcmFjdGVyID0gJygnOwogICAgICAgIH0gZWxzZSBpZiAoY2hhcmFjdGVyID09ICdCJykgewogICAgICAgICAgY2hhcmFjdGVyID0gJ3snOwogICAgICAgIH0KCiAgICAgICAgLy8gSW5jbHVzaXZlIGlzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYSBhbmQgaQogICAgICAgIC8vIFRPRE86IEluc3RlYWQgb2YgdXNpbmcgdGhlIGFkZGl0aW9uYWwgdGV4dCBvYmplY3QgbWFwIHRvIHBlcmZvcm0gdGV4dAogICAgICAgIC8vICAgICBvYmplY3Qgb3BlcmF0aW9ucywgbWVyZ2UgdGhlIG1hcCBpbnRvIHRoZSBkZWZhdWx0S2V5TWFwIGFuZCB1c2UKICAgICAgICAvLyAgICAgbW90aW9uQXJncyB0byBkZWZpbmUgYmVoYXZpb3IuIERlZmluZSBzZXBhcmF0ZSBlbnRyaWVzIGZvciAnYXcnLAogICAgICAgIC8vICAgICAnaXcnLCAnYVsnLCAnaVsnLCBldGMuCiAgICAgICAgdmFyIGluY2x1c2l2ZSA9ICFtb3Rpb25BcmdzLnRleHRPYmplY3RJbm5lcjsKCiAgICAgICAgdmFyIHRtcDsKICAgICAgICBpZiAobWlycm9yZWRQYWlyc1tjaGFyYWN0ZXJdKSB7CiAgICAgICAgICB0bXAgPSBzZWxlY3RDb21wYW5pb25PYmplY3QoY20sIGNoYXJhY3RlciwgaW5jbHVzaXZlKTsKICAgICAgICB9IGVsc2UgaWYgKHNlbGZQYWlyZWRbY2hhcmFjdGVyXSkgewogICAgICAgICAgdG1wID0gZmluZEJlZ2lubmluZ0FuZEVuZChjbSwgY2hhcmFjdGVyLCBpbmNsdXNpdmUpOwogICAgICAgIH0gZWxzZSBpZiAoY2hhcmFjdGVyID09PSAnVycpIHsKICAgICAgICAgIHRtcCA9IGV4cGFuZFdvcmRVbmRlckN1cnNvcihjbSwgaW5jbHVzaXZlLCB0cnVlIC8qKiBmb3J3YXJkICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyoqIGJpZ1dvcmQgKi8pOwogICAgICAgIH0gZWxzZSBpZiAoY2hhcmFjdGVyID09PSAndycpIHsKICAgICAgICAgIHRtcCA9IGV4cGFuZFdvcmRVbmRlckN1cnNvcihjbSwgaW5jbHVzaXZlLCB0cnVlIC8qKiBmb3J3YXJkICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qKiBiaWdXb3JkICovKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gTm8gdGV4dCBvYmplY3QgZGVmaW5lZCBmb3IgdGhpcywgZG9uJ3QgbW92ZS4KICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIFt0bXAuc3RhcnQsIHRtcC5lbmRdOwogICAgICB9LAoKICAgICAgcmVwZWF0TGFzdENoYXJhY3RlclNlYXJjaDogZnVuY3Rpb24oY20sIG1vdGlvbkFyZ3MpIHsKICAgICAgICB2YXIgbGFzdFNlYXJjaCA9IHZpbUdsb2JhbFN0YXRlLmxhc3RDaGFyYXJhY3RlclNlYXJjaDsKICAgICAgICB2YXIgcmVwZWF0ID0gbW90aW9uQXJncy5yZXBlYXQ7CiAgICAgICAgdmFyIGZvcndhcmQgPSBtb3Rpb25BcmdzLmZvcndhcmQgPT09IGxhc3RTZWFyY2guZm9yd2FyZDsKICAgICAgICB2YXIgaW5jcmVtZW50ID0gKGxhc3RTZWFyY2guaW5jcmVtZW50ID8gMSA6IDApICogKGZvcndhcmQgPyAtMSA6IDEpOwogICAgICAgIGNtLm1vdmVIKC1pbmNyZW1lbnQsICdjaGFyJyk7CiAgICAgICAgbW90aW9uQXJncy5pbmNsdXNpdmUgPSBmb3J3YXJkID8gdHJ1ZSA6IGZhbHNlOwogICAgICAgIHZhciBjdXJFbmQgPSBtb3ZlVG9DaGFyYWN0ZXIoY20sIHJlcGVhdCwgZm9yd2FyZCwgbGFzdFNlYXJjaC5zZWxlY3RlZENoYXJhY3Rlcik7CiAgICAgICAgaWYgKCFjdXJFbmQpIHsKICAgICAgICAgIGNtLm1vdmVIKGluY3JlbWVudCwgJ2NoYXInKTsKICAgICAgICAgIHJldHVybiBjbS5nZXRDdXJzb3IoKTsKICAgICAgICB9CiAgICAgICAgY3VyRW5kLmNoICs9IGluY3JlbWVudDsKICAgICAgICByZXR1cm4gY3VyRW5kOwogICAgICB9CiAgICB9OwoKICAgIHZhciBvcGVyYXRvcnMgPSB7CiAgICAgIGNoYW5nZTogZnVuY3Rpb24oY20sIG9wZXJhdG9yQXJncywgdmltKSB7CiAgICAgICAgdmFyIHNlbGVjdGlvbnMgPSBjbS5saXN0U2VsZWN0aW9ucygpOwogICAgICAgIHZhciBzdGFydCA9IHNlbGVjdGlvbnNbMF0sIGVuZCA9IHNlbGVjdGlvbnNbc2VsZWN0aW9ucy5sZW5ndGgtMV07CiAgICAgICAgdmFyIGN1clN0YXJ0ID0gY3Vyc29ySXNCZWZvcmUoc3RhcnQuYW5jaG9yLCBzdGFydC5oZWFkKSA/IHN0YXJ0LmFuY2hvciA6IHN0YXJ0LmhlYWQ7CiAgICAgICAgdmFyIGN1ckVuZCA9IGN1cnNvcklzQmVmb3JlKGVuZC5hbmNob3IsIGVuZC5oZWFkKSA/IGVuZC5oZWFkIDogZW5kLmFuY2hvcjsKICAgICAgICB2YXIgdGV4dCA9IGNtLmdldFNlbGVjdGlvbigpOwogICAgICAgIHZhciByZXBsYWNlbWVudCA9IG5ldyBBcnJheShzZWxlY3Rpb25zLmxlbmd0aCkuam9pbignMScpLnNwbGl0KCcxJyk7CiAgICAgICAgLy8gc2F2ZSB0aGUgc2VsZWN0aW9uRW5kIG1hcmsKICAgICAgICB2YXIgc2VsZWN0aW9uRW5kID0gdmltLm1hcmtzWyc+J10gPyB2aW0ubWFya3NbJz4nXS5maW5kKCkgOiBjbS5nZXRDdXJzb3IoJ2hlYWQnKTsKICAgICAgICB2aW1HbG9iYWxTdGF0ZS5yZWdpc3RlckNvbnRyb2xsZXIucHVzaFRleHQoCiAgICAgICAgICAgIG9wZXJhdG9yQXJncy5yZWdpc3Rlck5hbWUsICdjaGFuZ2UnLCB0ZXh0LAogICAgICAgICAgICBvcGVyYXRvckFyZ3MubGluZXdpc2UpOwogICAgICAgIGlmIChvcGVyYXRvckFyZ3MubGluZXdpc2UpIHsKICAgICAgICAgIC8vICdDJyBpbiB2aXN1YWwgYmxvY2sgZXh0ZW5kcyB0aGUgYmxvY2sgdGlsbCBlb2wgZm9yIGFsbCBsaW5lcwogICAgICAgICAgaWYgKHZpbS52aXN1YWxCbG9jayl7CiAgICAgICAgICAgIHZhciBzdGFydExpbmUgPSBjdXJTdGFydC5saW5lOwogICAgICAgICAgICB3aGlsZSAoc3RhcnRMaW5lIDw9IGN1ckVuZC5saW5lKSB7CiAgICAgICAgICAgICAgdmFyIGVuZENoID0gbGluZUxlbmd0aChjbSwgc3RhcnRMaW5lKTsKICAgICAgICAgICAgICB2YXIgaGVhZCA9IFBvcyhzdGFydExpbmUsIGVuZENoKTsKICAgICAgICAgICAgICB2YXIgYW5jaG9yID0gUG9zKHN0YXJ0TGluZSwgY3VyU3RhcnQuY2gpOwogICAgICAgICAgICAgIHN0YXJ0TGluZSsrOwogICAgICAgICAgICAgIGNtLnJlcGxhY2VSYW5nZSgnJywgYW5jaG9yLCBoZWFkKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gUHVzaCB0aGUgbmV4dCBsaW5lIGJhY2sgZG93biwgaWYgdGhlcmUgaXMgYSBuZXh0IGxpbmUuCiAgICAgICAgICAgIHJlcGxhY2VtZW50ID0gJ1xuJzsKICAgICAgICAgICAgaWYgKGN1ckVuZC5saW5lID09IGN1clN0YXJ0LmxpbmUgJiYgY3VyRW5kLmxpbmUgPT0gY20ubGFzdExpbmUoKSkgewogICAgICAgICAgICAgIHJlcGxhY2VtZW50ID0gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY20ucmVwbGFjZVJhbmdlKHJlcGxhY2VtZW50LCBjdXJTdGFydCwgY3VyRW5kKTsKICAgICAgICAgICAgY20uaW5kZW50TGluZShjdXJTdGFydC5saW5lLCAnc21hcnQnKTsKICAgICAgICAgICAgLy8gbnVsbCBjaCBzbyBzZXRDdXJzb3IgbW92ZXMgdG8gZW5kIG9mIGxpbmUuCiAgICAgICAgICAgIGN1clN0YXJ0LmNoID0gbnVsbDsKICAgICAgICAgICAgY20uc2V0Q3Vyc29yKGN1clN0YXJ0KTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gRXhjbHVkZSB0cmFpbGluZyB3aGl0ZXNwYWNlIGlmIHRoZSByYW5nZSBpcyBub3QgYWxsIHdoaXRlc3BhY2UuCiAgICAgICAgICB2YXIgdGV4dCA9IGNtLmdldFJhbmdlKGN1clN0YXJ0LCBjdXJFbmQpOwogICAgICAgICAgaWYgKCFpc1doaXRlU3BhY2VTdHJpbmcodGV4dCkpIHsKICAgICAgICAgICAgdmFyIG1hdGNoID0gKC9ccyskLykuZXhlYyh0ZXh0KTsKICAgICAgICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgICAgICAgY3VyRW5kID0gb2Zmc2V0Q3Vyc29yKGN1ckVuZCwgMCwgLSBtYXRjaFswXS5sZW5ndGgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodmltLnZpc3VhbEJsb2NrKSB7CiAgICAgICAgICAgIGNtLnJlcGxhY2VTZWxlY3Rpb25zKHJlcGxhY2VtZW50KTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNtLnNldEN1cnNvcihjdXJTdGFydCk7CiAgICAgICAgICAgIGNtLnJlcGxhY2VSYW5nZSgnJywgY3VyU3RhcnQsIGN1ckVuZCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHZpbS5tYXJrc1snPiddID0gY20uc2V0Qm9va21hcmsoc2VsZWN0aW9uRW5kKTsKICAgICAgICBhY3Rpb25zLmVudGVySW5zZXJ0TW9kZShjbSwge30sIGNtLnN0YXRlLnZpbSk7CiAgICAgIH0sCiAgICAgIC8vIGRlbGV0ZSBpcyBhIGphdmFzY3JpcHQga2V5d29yZC4KICAgICAgJ2RlbGV0ZSc6IGZ1bmN0aW9uKGNtLCBvcGVyYXRvckFyZ3MsIHZpbSkgewogICAgICAgIHZhciBzZWxlY3Rpb25zID0gY20ubGlzdFNlbGVjdGlvbnMoKTsKICAgICAgICB2YXIgc3RhcnQgPSBzZWxlY3Rpb25zWzBdLCBlbmQgPSBzZWxlY3Rpb25zW3NlbGVjdGlvbnMubGVuZ3RoLTFdOwogICAgICAgIHZhciBjdXJTdGFydCA9IGN1cnNvcklzQmVmb3JlKHN0YXJ0LmFuY2hvciwgc3RhcnQuaGVhZCkgPyBzdGFydC5hbmNob3IgOiBzdGFydC5oZWFkOwogICAgICAgIHZhciBjdXJFbmQgPSBjdXJzb3JJc0JlZm9yZShlbmQuYW5jaG9yLCBlbmQuaGVhZCkgPyBlbmQuaGVhZCA6IGVuZC5hbmNob3I7CiAgICAgICAgLy8gU2F2ZSB0aGUgJz4nIG1hcmsgYmVmb3JlIGNtLnJlcGxhY2VSYW5nZSBjbGVhcnMgaXQuCiAgICAgICAgdmFyIHNlbGVjdGlvbkVuZCwgc2VsZWN0aW9uU3RhcnQ7CiAgICAgICAgaWYgKHZpbS52aXN1YWxNb2RlKSB7CiAgICAgICAgICBzZWxlY3Rpb25FbmQgPSB2aW0ubWFya3NbJz4nXS5maW5kKCk7CiAgICAgICAgICBzZWxlY3Rpb25TdGFydCA9IHZpbS5tYXJrc1snPCddLmZpbmQoKTsKICAgICAgICB9IGVsc2UgaWYgKHZpbS5sYXN0U2VsZWN0aW9uKSB7CiAgICAgICAgICBzZWxlY3Rpb25FbmQgPSB2aW0ubGFzdFNlbGVjdGlvbi5jdXJTdGFydE1hcmsuZmluZCgpOwogICAgICAgICAgc2VsZWN0aW9uU3RhcnQgPSB2aW0ubGFzdFNlbGVjdGlvbi5jdXJFbmRNYXJrLmZpbmQoKTsKICAgICAgICB9CiAgICAgICAgdmFyIHRleHQgPSBjbS5nZXRTZWxlY3Rpb24oKTsKICAgICAgICB2aW1HbG9iYWxTdGF0ZS5yZWdpc3RlckNvbnRyb2xsZXIucHVzaFRleHQoCiAgICAgICAgICAgIG9wZXJhdG9yQXJncy5yZWdpc3Rlck5hbWUsICdkZWxldGUnLCB0ZXh0LAogICAgICAgICAgICBvcGVyYXRvckFyZ3MubGluZXdpc2UpOwogICAgICAgIHZhciByZXBsYWNlbWVudCA9IG5ldyBBcnJheShzZWxlY3Rpb25zLmxlbmd0aCkuam9pbignMScpLnNwbGl0KCcxJyk7CiAgICAgICAgLy8gSWYgdGhlIGVuZGluZyBsaW5lIGlzIHBhc3QgdGhlIGxhc3QgbGluZSwgaW5jbHVzaXZlLCBpbnN0ZWFkIG9mCiAgICAgICAgLy8gaW5jbHVkaW5nIHRoZSB0cmFpbGluZyBcbiwgaW5jbHVkZSB0aGUgXG4gYmVmb3JlIHRoZSBzdGFydGluZyBsaW5lCiAgICAgICAgaWYgKG9wZXJhdG9yQXJncy5saW5ld2lzZSAmJgogICAgICAgICAgICBjdXJFbmQubGluZSA9PSBjbS5sYXN0TGluZSgpICYmIGN1clN0YXJ0LmxpbmUgPT0gY3VyRW5kLmxpbmUpIHsKICAgICAgICAgIHZhciB0bXAgPSBjb3B5Q3Vyc29yKGN1ckVuZCk7CiAgICAgICAgICBjdXJTdGFydC5saW5lLS07CiAgICAgICAgICBjdXJTdGFydC5jaCA9IGxpbmVMZW5ndGgoY20sIGN1clN0YXJ0LmxpbmUpOwogICAgICAgICAgY3VyRW5kID0gdG1wOwogICAgICAgICAgY20ucmVwbGFjZVJhbmdlKCcnLCBjdXJTdGFydCwgY3VyRW5kKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY20ucmVwbGFjZVNlbGVjdGlvbnMocmVwbGFjZW1lbnQpOwogICAgICAgIH0KICAgICAgICAvLyByZXN0b3JlIHRoZSBzYXZlZCBib29rbWFyawogICAgICAgIGlmIChzZWxlY3Rpb25FbmQpIHsKICAgICAgICAgIHZhciBjdXJTdGFydE1hcmsgPSBjbS5zZXRCb29rbWFyayhzZWxlY3Rpb25TdGFydCk7CiAgICAgICAgICB2YXIgY3VyRW5kTWFyayA9IGNtLnNldEJvb2ttYXJrKHNlbGVjdGlvbkVuZCk7CiAgICAgICAgICBpZiAodmltLnZpc3VhbE1vZGUpIHsKICAgICAgICAgICAgdmltLm1hcmtzWyc8J10gPSBjdXJTdGFydE1hcms7CiAgICAgICAgICAgIHZpbS5tYXJrc1snPiddID0gY3VyRW5kTWFyazsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHZpbS5sYXN0U2VsZWN0aW9uLmN1clN0YXJ0TWFyayA9IGN1clN0YXJ0TWFyazsKICAgICAgICAgICAgdmltLmxhc3RTZWxlY3Rpb24uY3VyRW5kTWFyayA9IGN1ckVuZE1hcms7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChvcGVyYXRvckFyZ3MubGluZXdpc2UpIHsKICAgICAgICAgIGNtLnNldEN1cnNvcihtb3Rpb25zLm1vdmVUb0ZpcnN0Tm9uV2hpdGVTcGFjZUNoYXJhY3RlcihjbSkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjbS5zZXRDdXJzb3IoY3VyU3RhcnQpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgaW5kZW50OiBmdW5jdGlvbihjbSwgb3BlcmF0b3JBcmdzLCB2aW0sIGN1clN0YXJ0LCBjdXJFbmQpIHsKICAgICAgICB2YXIgc3RhcnRMaW5lID0gY3VyU3RhcnQubGluZTsKICAgICAgICB2YXIgZW5kTGluZSA9IGN1ckVuZC5saW5lOwogICAgICAgIC8vIEluIHZpc3VhbCBtb2RlLCBuPiBzaGlmdHMgdGhlIHNlbGVjdGlvbiByaWdodCBuIHRpbWVzLCBpbnN0ZWFkIG9mCiAgICAgICAgLy8gc2hpZnRpbmcgbiBsaW5lcyByaWdodCBvbmNlLgogICAgICAgIHZhciByZXBlYXQgPSAodmltLnZpc3VhbE1vZGUpID8gb3BlcmF0b3JBcmdzLnJlcGVhdCA6IDE7CiAgICAgICAgaWYgKG9wZXJhdG9yQXJncy5saW5ld2lzZSkgewogICAgICAgICAgLy8gVGhlIG9ubHkgd2F5IHRvIGRlbGV0ZSBhIG5ld2xpbmUgaXMgdG8gZGVsZXRlIHVudGlsIHRoZSBzdGFydCBvZgogICAgICAgICAgLy8gdGhlIG5leHQgbGluZSwgc28gaW4gbGluZXdpc2UgbW9kZSBldmFsSW5wdXQgd2lsbCBpbmNsdWRlIHRoZSBuZXh0CiAgICAgICAgICAvLyBsaW5lLiBXZSBkb24ndCB3YW50IHRoaXMgaW4gaW5kZW50LCBzbyB3ZSBnbyBiYWNrIGEgbGluZS4KICAgICAgICAgIGVuZExpbmUtLTsKICAgICAgICB9CiAgICAgICAgZm9yICh2YXIgaSA9IHN0YXJ0TGluZTsgaSA8PSBlbmRMaW5lOyBpKyspIHsKICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgcmVwZWF0OyBqKyspIHsKICAgICAgICAgICAgY20uaW5kZW50TGluZShpLCBvcGVyYXRvckFyZ3MuaW5kZW50UmlnaHQpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjbS5zZXRDdXJzb3IoY3VyU3RhcnQpOwogICAgICAgIGNtLnNldEN1cnNvcihtb3Rpb25zLm1vdmVUb0ZpcnN0Tm9uV2hpdGVTcGFjZUNoYXJhY3RlcihjbSkpOwogICAgICB9LAogICAgICBzd2FwY2FzZTogZnVuY3Rpb24oY20sIG9wZXJhdG9yQXJncywgX3ZpbSwgX2N1clN0YXJ0LCBfY3VyRW5kLCBfY3VyT3JpZ2luYWwpIHsKICAgICAgICB2YXIgc2VsZWN0aW9ucyA9IGNtLmdldFNlbGVjdGlvbnMoKTsKICAgICAgICB2YXIgcmFuZ2VzID0gY20ubGlzdFNlbGVjdGlvbnMoKTsKICAgICAgICB2YXIgc3dhcHBlZCA9IFtdOwogICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgc2VsZWN0aW9ucy5sZW5ndGg7IGorKykgewogICAgICAgICAgdmFyIHRvU3dhcCA9IHNlbGVjdGlvbnNbal07CiAgICAgICAgICB2YXIgdGV4dCA9ICcnOwogICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0b1N3YXAubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdmFyIGNoYXJhY3RlciA9IHRvU3dhcC5jaGFyQXQoaSk7CiAgICAgICAgICAgIHRleHQgKz0gaXNVcHBlckNhc2UoY2hhcmFjdGVyKSA/IGNoYXJhY3Rlci50b0xvd2VyQ2FzZSgpIDoKICAgICAgICAgICAgICAgIGNoYXJhY3Rlci50b1VwcGVyQ2FzZSgpOwogICAgICAgICAgfQogICAgICAgICAgc3dhcHBlZC5wdXNoKHRleHQpOwogICAgICAgIH0KICAgICAgICBjbS5yZXBsYWNlU2VsZWN0aW9ucyhzd2FwcGVkKTsKICAgICAgICB2YXIgY3VyU3RhcnQgID0gcmFuZ2VzWzBdLmFuY2hvcjsKICAgICAgICB2YXIgY3VyRW5kID0gcmFuZ2VzWzBdLmhlYWQ7CiAgICAgICAgaWYgKCFvcGVyYXRvckFyZ3Muc2hvdWxkTW92ZUN1cnNvcikgewogICAgICAgICAgY20uc2V0Q3Vyc29yKGN1cnNvcklzQmVmb3JlKGN1clN0YXJ0LCBjdXJFbmQpID8gY3VyU3RhcnQgOiBjdXJFbmQpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgeWFuazogZnVuY3Rpb24oY20sIG9wZXJhdG9yQXJncywgX3ZpbSwgX2N1clN0YXJ0LCBfY3VyRW5kLCBjdXJPcmlnaW5hbCkgewogICAgICAgIHZhciB0ZXh0ID0gY20uZ2V0U2VsZWN0aW9uKCk7CiAgICAgICAgdmltR2xvYmFsU3RhdGUucmVnaXN0ZXJDb250cm9sbGVyLnB1c2hUZXh0KAogICAgICAgICAgICBvcGVyYXRvckFyZ3MucmVnaXN0ZXJOYW1lLCAneWFuaycsCiAgICAgICAgICAgIHRleHQsIG9wZXJhdG9yQXJncy5saW5ld2lzZSk7CiAgICAgICAgY20uc2V0Q3Vyc29yKGN1ck9yaWdpbmFsKTsKICAgICAgfQogICAgfTsKCiAgICB2YXIgYWN0aW9ucyA9IHsKICAgICAganVtcExpc3RXYWxrOiBmdW5jdGlvbihjbSwgYWN0aW9uQXJncywgdmltKSB7CiAgICAgICAgaWYgKHZpbS52aXN1YWxNb2RlKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHZhciByZXBlYXQgPSBhY3Rpb25BcmdzLnJlcGVhdDsKICAgICAgICB2YXIgZm9yd2FyZCA9IGFjdGlvbkFyZ3MuZm9yd2FyZDsKICAgICAgICB2YXIganVtcExpc3QgPSB2aW1HbG9iYWxTdGF0ZS5qdW1wTGlzdDsKCiAgICAgICAgdmFyIG1hcmsgPSBqdW1wTGlzdC5tb3ZlKGNtLCBmb3J3YXJkID8gcmVwZWF0IDogLXJlcGVhdCk7CiAgICAgICAgdmFyIG1hcmtQb3MgPSBtYXJrID8gbWFyay5maW5kKCkgOiB1bmRlZmluZWQ7CiAgICAgICAgbWFya1BvcyA9IG1hcmtQb3MgPyBtYXJrUG9zIDogY20uZ2V0Q3Vyc29yKCk7CiAgICAgICAgY20uc2V0Q3Vyc29yKG1hcmtQb3MpOwogICAgICB9LAogICAgICBzY3JvbGw6IGZ1bmN0aW9uKGNtLCBhY3Rpb25BcmdzLCB2aW0pIHsKICAgICAgICBpZiAodmltLnZpc3VhbE1vZGUpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdmFyIHJlcGVhdCA9IGFjdGlvbkFyZ3MucmVwZWF0IHx8IDE7CiAgICAgICAgdmFyIGxpbmVIZWlnaHQgPSBjbS5kZWZhdWx0VGV4dEhlaWdodCgpOwogICAgICAgIHZhciB0b3AgPSBjbS5nZXRTY3JvbGxJbmZvKCkudG9wOwogICAgICAgIHZhciBkZWx0YSA9IGxpbmVIZWlnaHQgKiByZXBlYXQ7CiAgICAgICAgdmFyIG5ld1BvcyA9IGFjdGlvbkFyZ3MuZm9yd2FyZCA/IHRvcCArIGRlbHRhIDogdG9wIC0gZGVsdGE7CiAgICAgICAgdmFyIGN1cnNvciA9IGNvcHlDdXJzb3IoY20uZ2V0Q3Vyc29yKCkpOwogICAgICAgIHZhciBjdXJzb3JDb29yZHMgPSBjbS5jaGFyQ29vcmRzKGN1cnNvciwgJ2xvY2FsJyk7CiAgICAgICAgaWYgKGFjdGlvbkFyZ3MuZm9yd2FyZCkgewogICAgICAgICAgaWYgKG5ld1BvcyA+IGN1cnNvckNvb3Jkcy50b3ApIHsKICAgICAgICAgICAgIGN1cnNvci5saW5lICs9IChuZXdQb3MgLSBjdXJzb3JDb29yZHMudG9wKSAvIGxpbmVIZWlnaHQ7CiAgICAgICAgICAgICBjdXJzb3IubGluZSA9IE1hdGguY2VpbChjdXJzb3IubGluZSk7CiAgICAgICAgICAgICBjbS5zZXRDdXJzb3IoY3Vyc29yKTsKICAgICAgICAgICAgIGN1cnNvckNvb3JkcyA9IGNtLmNoYXJDb29yZHMoY3Vyc29yLCAnbG9jYWwnKTsKICAgICAgICAgICAgIGNtLnNjcm9sbFRvKG51bGwsIGN1cnNvckNvb3Jkcy50b3ApOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIEN1cnNvciBzdGF5cyB3aXRoaW4gYm91bmRzLiAgSnVzdCByZXBvc2l0aW9uIHRoZSBzY3JvbGwgd2luZG93LgogICAgICAgICAgICAgY20uc2Nyb2xsVG8obnVsbCwgbmV3UG9zKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgdmFyIG5ld0JvdHRvbSA9IG5ld1BvcyArIGNtLmdldFNjcm9sbEluZm8oKS5jbGllbnRIZWlnaHQ7CiAgICAgICAgICBpZiAobmV3Qm90dG9tIDwgY3Vyc29yQ29vcmRzLmJvdHRvbSkgewogICAgICAgICAgICAgY3Vyc29yLmxpbmUgLT0gKGN1cnNvckNvb3Jkcy5ib3R0b20gLSBuZXdCb3R0b20pIC8gbGluZUhlaWdodDsKICAgICAgICAgICAgIGN1cnNvci5saW5lID0gTWF0aC5mbG9vcihjdXJzb3IubGluZSk7CiAgICAgICAgICAgICBjbS5zZXRDdXJzb3IoY3Vyc29yKTsKICAgICAgICAgICAgIGN1cnNvckNvb3JkcyA9IGNtLmNoYXJDb29yZHMoY3Vyc29yLCAnbG9jYWwnKTsKICAgICAgICAgICAgIGNtLnNjcm9sbFRvKAogICAgICAgICAgICAgICAgIG51bGwsIGN1cnNvckNvb3Jkcy5ib3R0b20gLSBjbS5nZXRTY3JvbGxJbmZvKCkuY2xpZW50SGVpZ2h0KTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBDdXJzb3Igc3RheXMgd2l0aGluIGJvdW5kcy4gIEp1c3QgcmVwb3NpdGlvbiB0aGUgc2Nyb2xsIHdpbmRvdy4KICAgICAgICAgICAgIGNtLnNjcm9sbFRvKG51bGwsIG5ld1Bvcyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICBzY3JvbGxUb0N1cnNvcjogZnVuY3Rpb24oY20sIGFjdGlvbkFyZ3MpIHsKICAgICAgICB2YXIgbGluZU51bSA9IGNtLmdldEN1cnNvcigpLmxpbmU7CiAgICAgICAgdmFyIGNoYXJDb29yZHMgPSBjbS5jaGFyQ29vcmRzKFBvcyhsaW5lTnVtLCAwKSwgJ2xvY2FsJyk7CiAgICAgICAgdmFyIGhlaWdodCA9IGNtLmdldFNjcm9sbEluZm8oKS5jbGllbnRIZWlnaHQ7CiAgICAgICAgdmFyIHkgPSBjaGFyQ29vcmRzLnRvcDsKICAgICAgICB2YXIgbGluZUhlaWdodCA9IGNoYXJDb29yZHMuYm90dG9tIC0geTsKICAgICAgICBzd2l0Y2ggKGFjdGlvbkFyZ3MucG9zaXRpb24pIHsKICAgICAgICAgIGNhc2UgJ2NlbnRlcic6IHkgPSB5IC0gKGhlaWdodCAvIDIpICsgbGluZUhlaWdodDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdib3R0b20nOiB5ID0geSAtIGhlaWdodCArIGxpbmVIZWlnaHQqMS40OwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ3RvcCc6IHkgPSB5ICsgbGluZUhlaWdodCowLjQ7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBjbS5zY3JvbGxUbyhudWxsLCB5KTsKICAgICAgfSwKICAgICAgcmVwbGF5TWFjcm86IGZ1bmN0aW9uKGNtLCBhY3Rpb25BcmdzLCB2aW0pIHsKICAgICAgICB2YXIgcmVnaXN0ZXJOYW1lID0gYWN0aW9uQXJncy5zZWxlY3RlZENoYXJhY3RlcjsKICAgICAgICB2YXIgcmVwZWF0ID0gYWN0aW9uQXJncy5yZXBlYXQ7CiAgICAgICAgdmFyIG1hY3JvTW9kZVN0YXRlID0gdmltR2xvYmFsU3RhdGUubWFjcm9Nb2RlU3RhdGU7CiAgICAgICAgaWYgKHJlZ2lzdGVyTmFtZSA9PSAnQCcpIHsKICAgICAgICAgIHJlZ2lzdGVyTmFtZSA9IG1hY3JvTW9kZVN0YXRlLmxhdGVzdFJlZ2lzdGVyOwogICAgICAgIH0KICAgICAgICB3aGlsZShyZXBlYXQtLSl7CiAgICAgICAgICBleGVjdXRlTWFjcm9SZWdpc3RlcihjbSwgdmltLCBtYWNyb01vZGVTdGF0ZSwgcmVnaXN0ZXJOYW1lKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGVudGVyTWFjcm9SZWNvcmRNb2RlOiBmdW5jdGlvbihjbSwgYWN0aW9uQXJncykgewogICAgICAgIHZhciBtYWNyb01vZGVTdGF0ZSA9IHZpbUdsb2JhbFN0YXRlLm1hY3JvTW9kZVN0YXRlOwogICAgICAgIHZhciByZWdpc3Rlck5hbWUgPSBhY3Rpb25BcmdzLnNlbGVjdGVkQ2hhcmFjdGVyOwogICAgICAgIG1hY3JvTW9kZVN0YXRlLmVudGVyTWFjcm9SZWNvcmRNb2RlKGNtLCByZWdpc3Rlck5hbWUpOwogICAgICB9LAogICAgICBlbnRlckluc2VydE1vZGU6IGZ1bmN0aW9uKGNtLCBhY3Rpb25BcmdzLCB2aW0pIHsKICAgICAgICBpZiAoY20uZ2V0T3B0aW9uKCdyZWFkT25seScpKSB7IHJldHVybjsgfQogICAgICAgIHZpbS5pbnNlcnRNb2RlID0gdHJ1ZTsKICAgICAgICB2aW0uaW5zZXJ0TW9kZVJlcGVhdCA9IGFjdGlvbkFyZ3MgJiYgYWN0aW9uQXJncy5yZXBlYXQgfHwgMTsKICAgICAgICB2YXIgaW5zZXJ0QXQgPSAoYWN0aW9uQXJncykgPyBhY3Rpb25BcmdzLmluc2VydEF0IDogbnVsbDsKICAgICAgICBpZiAoaW5zZXJ0QXQgPT0gJ2VvbCcpIHsKICAgICAgICAgIHZhciBjdXJzb3IgPSBjbS5nZXRDdXJzb3IoKTsKICAgICAgICAgIGN1cnNvciA9IFBvcyhjdXJzb3IubGluZSwgbGluZUxlbmd0aChjbSwgY3Vyc29yLmxpbmUpKTsKICAgICAgICAgIGNtLnNldEN1cnNvcihjdXJzb3IpOwogICAgICAgIH0gZWxzZSBpZiAoaW5zZXJ0QXQgPT0gJ2NoYXJBZnRlcicpIHsKICAgICAgICAgIGNtLnNldEN1cnNvcihvZmZzZXRDdXJzb3IoY20uZ2V0Q3Vyc29yKCksIDAsIDEpKTsKICAgICAgICB9IGVsc2UgaWYgKGluc2VydEF0ID09ICdmaXJzdE5vbkJsYW5rJykgewogICAgICAgICAgY20uc2V0Q3Vyc29yKG1vdGlvbnMubW92ZVRvRmlyc3ROb25XaGl0ZVNwYWNlQ2hhcmFjdGVyKGNtKSk7CiAgICAgICAgfSBlbHNlIGlmIChpbnNlcnRBdCA9PSAnZW5kT2ZTZWxlY3RlZEFyZWEnKSB7CiAgICAgICAgICB2YXIgc2VsZWN0aW9uRW5kID0gY20uZ2V0Q3Vyc29yKCdoZWFkJyk7CiAgICAgICAgICB2YXIgc2VsZWN0aW9uU3RhcnQgPSBjbS5nZXRDdXJzb3IoJ2FuY2hvcicpOwogICAgICAgICAgaWYgKHNlbGVjdGlvbkVuZC5saW5lIDwgc2VsZWN0aW9uU3RhcnQubGluZSkgewogICAgICAgICAgICBzZWxlY3Rpb25FbmQgPSBQb3Moc2VsZWN0aW9uU3RhcnQubGluZSwgMCk7CiAgICAgICAgICB9CiAgICAgICAgICBjbS5zZXRDdXJzb3Ioc2VsZWN0aW9uRW5kKTsKICAgICAgICAgIGV4aXRWaXN1YWxNb2RlKGNtKTsKICAgICAgICB9CiAgICAgICAgY20uc2V0T3B0aW9uKCdrZXlNYXAnLCAndmltLWluc2VydCcpOwogICAgICAgIGNtLnNldE9wdGlvbignZGlzYWJsZUlucHV0JywgZmFsc2UpOwogICAgICAgIGlmIChhY3Rpb25BcmdzICYmIGFjdGlvbkFyZ3MucmVwbGFjZSkgewogICAgICAgICAgLy8gSGFuZGxlIFJlcGxhY2UtbW9kZSBhcyBhIHNwZWNpYWwgY2FzZSBvZiBpbnNlcnQgbW9kZS4KICAgICAgICAgIGNtLnRvZ2dsZU92ZXJ3cml0ZSh0cnVlKTsKICAgICAgICAgIGNtLnNldE9wdGlvbigna2V5TWFwJywgJ3ZpbS1yZXBsYWNlJyk7CiAgICAgICAgICBDb2RlTWlycm9yLnNpZ25hbChjbSwgInZpbS1tb2RlLWNoYW5nZSIsIHttb2RlOiAicmVwbGFjZSJ9KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY20uc2V0T3B0aW9uKCdrZXlNYXAnLCAndmltLWluc2VydCcpOwogICAgICAgICAgQ29kZU1pcnJvci5zaWduYWwoY20sICJ2aW0tbW9kZS1jaGFuZ2UiLCB7bW9kZTogImluc2VydCJ9KTsKICAgICAgICB9CiAgICAgICAgaWYgKCF2aW1HbG9iYWxTdGF0ZS5tYWNyb01vZGVTdGF0ZS5pc1BsYXlpbmcpIHsKICAgICAgICAgIC8vIE9ubHkgcmVjb3JkIGlmIG5vdCByZXBsYXlpbmcuCiAgICAgICAgICBjbS5vbignY2hhbmdlJywgb25DaGFuZ2UpOwogICAgICAgICAgQ29kZU1pcnJvci5vbihjbS5nZXRJbnB1dEZpZWxkKCksICdrZXlkb3duJywgb25LZXlFdmVudFRhcmdldEtleURvd24pOwogICAgICAgIH0KICAgICAgfSwKICAgICAgdG9nZ2xlVmlzdWFsTW9kZTogZnVuY3Rpb24oY20sIGFjdGlvbkFyZ3MsIHZpbSkgewogICAgICAgIHZhciByZXBlYXQgPSBhY3Rpb25BcmdzLnJlcGVhdDsKICAgICAgICB2YXIgY3VyU3RhcnQgPSBjbS5nZXRDdXJzb3IoKTsKICAgICAgICB2YXIgY3VyRW5kOwogICAgICAgIHZhciBzZWxlY3Rpb25zID0gY20ubGlzdFNlbGVjdGlvbnMoKTsKICAgICAgICAvLyBUT0RPOiBUaGUgcmVwZWF0IHNob3VsZCBhY3R1YWxseSBzZWxlY3QgbnVtYmVyIG9mIGNoYXJhY3RlcnMvbGluZXMKICAgICAgICAvLyAgICAgZXF1YWwgdG8gdGhlIHJlcGVhdCB0aW1lcyB0aGUgc2l6ZSBvZiB0aGUgcHJldmlvdXMgdmlzdWFsCiAgICAgICAgLy8gICAgIG9wZXJhdGlvbi4KICAgICAgICBpZiAoIXZpbS52aXN1YWxNb2RlKSB7CiAgICAgICAgICBjbS5vbignbW91c2Vkb3duJywgZXhpdFZpc3VhbE1vZGUpOwogICAgICAgICAgdmltLnZpc3VhbE1vZGUgPSB0cnVlOwogICAgICAgICAgdmltLnZpc3VhbExpbmUgPSAhIWFjdGlvbkFyZ3MubGluZXdpc2U7CiAgICAgICAgICB2aW0udmlzdWFsQmxvY2sgPSAhIWFjdGlvbkFyZ3MuYmxvY2t3aXNlOwogICAgICAgICAgaWYgKHZpbS52aXN1YWxMaW5lKSB7CiAgICAgICAgICAgIGN1clN0YXJ0LmNoID0gMDsKICAgICAgICAgICAgY3VyRW5kID0gY2xpcEN1cnNvclRvQ29udGVudCgKICAgICAgICAgICAgICBjbSwgUG9zKGN1clN0YXJ0LmxpbmUgKyByZXBlYXQgLSAxLCBsaW5lTGVuZ3RoKGNtLCBjdXJTdGFydC5saW5lKSksCiAgICAgICAgICAgICAgdHJ1ZSAvKiogaW5jbHVkZUxpbmVCcmVhayAqLyk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjdXJFbmQgPSBjbGlwQ3Vyc29yVG9Db250ZW50KAogICAgICAgICAgICAgIGNtLCBQb3MoY3VyU3RhcnQubGluZSwgY3VyU3RhcnQuY2ggKyByZXBlYXQpLAogICAgICAgICAgICAgIHRydWUgLyoqIGluY2x1ZGVMaW5lQnJlYWsgKi8pOwogICAgICAgICAgfQogICAgICAgICAgY20uc2V0U2VsZWN0aW9uKGN1clN0YXJ0LCBjdXJFbmQpOwogICAgICAgICAgQ29kZU1pcnJvci5zaWduYWwoY20sICJ2aW0tbW9kZS1jaGFuZ2UiLCB7bW9kZTogInZpc3VhbCIsIHN1Yk1vZGU6IHZpbS52aXN1YWxMaW5lID8gImxpbmV3aXNlIiA6ICIifSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGN1clN0YXJ0ID0gY20uZ2V0Q3Vyc29yKCdhbmNob3InKTsKICAgICAgICAgIGN1ckVuZCA9IGNtLmdldEN1cnNvcignaGVhZCcpOwogICAgICAgICAgaWYgKHZpbS52aXN1YWxMaW5lKSB7CiAgICAgICAgICAgIGlmIChhY3Rpb25BcmdzLmJsb2Nrd2lzZSkgewogICAgICAgICAgICAgIC8vIFRoaXMgbWVhbnMgQ3RybC1WIHByZXNzZWQgaW4gbGluZXdpc2UgdmlzdWFsCiAgICAgICAgICAgICAgdmltLnZpc3VhbEJsb2NrID0gdHJ1ZTsKICAgICAgICAgICAgICBzZWxlY3RCbG9jayhjbSwgY3VyRW5kKTsKICAgICAgICAgICAgICBDb2RlTWlycm9yLnNpZ25hbChjbSwgJ3ZpbS1tb2RlLWNoYW5nZScsIHttb2RlOiAndmlzdWFsJywgc3ViTW9kZTogJ2Jsb2Nrd2lzZSd9KTsKICAgICAgICAgICAgfSBlbHNlIGlmICghYWN0aW9uQXJncy5saW5ld2lzZSkgewogICAgICAgICAgICAgIC8vIHYgcHJlc3NlZCBpbiBsaW5ld2lzZSwgc3dpdGNoIHRvIGNoYXJhY3Rlcndpc2UgdmlzdWFsIG1vZGUKICAgICAgICAgICAgICBDb2RlTWlycm9yLnNpZ25hbChjbSwgJ3ZpbS1tb2RlLWNoYW5nZScsIHttb2RlOiAndmlzdWFsJ30pOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGV4aXRWaXN1YWxNb2RlKGNtKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2aW0udmlzdWFsTGluZSA9IGZhbHNlOwogICAgICAgICAgfSBlbHNlIGlmICh2aW0udmlzdWFsQmxvY2spIHsKICAgICAgICAgICAgaWYgKGFjdGlvbkFyZ3MubGluZXdpc2UpIHsKICAgICAgICAgICAgICAvLyBTaGlmdC1WIHByZXNzZWQgaW4gYmxvY2t3aXNlIHZpc3VhbCBtb2RlCiAgICAgICAgICAgICAgdmltLnZpc3VhbExpbmUgPSB0cnVlOwogICAgICAgICAgICAgIGN1clN0YXJ0ID0gUG9zKHNlbGVjdGlvbnNbMF0uYW5jaG9yLmxpbmUsIDApOwogICAgICAgICAgICAgIGN1ckVuZCA9IFBvcyhzZWxlY3Rpb25zW3NlbGVjdGlvbnMubGVuZ3RoLTFdLmFuY2hvci5saW5lLCBsaW5lTGVuZ3RoKGNtLCBzZWxlY3Rpb25zW3NlbGVjdGlvbnMubGVuZ3RoLTFdLmFuY2hvci5saW5lKSk7CiAgICAgICAgICAgICAgY20uc2V0U2VsZWN0aW9uKGN1clN0YXJ0LCBjdXJFbmQpOwogICAgICAgICAgICAgIENvZGVNaXJyb3Iuc2lnbmFsKGNtLCAndmltLW1vZGUtY2hhbmdlJywge21vZGU6ICd2aXN1YWwnLCBzdWJNb2RlOiAnbGluZXdpc2UnfSk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoIWFjdGlvbkFyZ3MuYmxvY2t3aXNlKSB7CiAgICAgICAgICAgICAgLy8gdiBwcmVzc2VkIGluIGJsb2Nrd2lzZSBtb2RlLCBTd2l0Y2ggdG8gY2hhcmFjdGVyd2lzZQogICAgICAgICAgICAgIGlmIChjdXJFbmQgIT0gc2VsZWN0aW9uc1swXS5oZWFkKSB7CiAgICAgICAgICAgICAgICBjdXJTdGFydCA9IHNlbGVjdGlvbnNbMF0uYW5jaG9yOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBjdXJTdGFydCA9IHNlbGVjdGlvbnNbc2VsZWN0aW9ucy5sZW5ndGgtMV0uYW5jaG9yOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBjbS5zZXRTZWxlY3Rpb24oY3VyU3RhcnQsIGN1ckVuZCk7CiAgICAgICAgICAgICAgQ29kZU1pcnJvci5zaWduYWwoY20sICd2aW0tbW9kZS1jaGFuZ2UnLCB7bW9kZTogJ3Zpc3VhbCd9KTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBleGl0VmlzdWFsTW9kZShjbSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmltLnZpc3VhbEJsb2NrID0gZmFsc2U7CiAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbkFyZ3MubGluZXdpc2UpIHsKICAgICAgICAgICAgICAvLyBTaGlmdC1WIHByZXNzZWQgaW4gY2hhcmFjdGVyd2lzZSB2aXN1YWwgbW9kZS4gU3dpdGNoIHRvIGxpbmV3aXNlCiAgICAgICAgICAgICAgLy8gdmlzdWFsIG1vZGUgaW5zdGVhZCBvZiBleGl0aW5nIHZpc3VhbCBtb2RlLgogICAgICAgICAgICAgIHZpbS52aXN1YWxMaW5lID0gdHJ1ZTsKICAgICAgICAgICAgICBjdXJTdGFydC5jaCA9IGN1cnNvcklzQmVmb3JlKGN1clN0YXJ0LCBjdXJFbmQpID8gMCA6CiAgICAgICAgICAgICAgICBsaW5lTGVuZ3RoKGNtLCBjdXJTdGFydC5saW5lKTsKICAgICAgICAgICAgICBjdXJFbmQuY2ggPSBjdXJzb3JJc0JlZm9yZShjdXJTdGFydCwgY3VyRW5kKSA/CiAgICAgICAgICAgICAgICBsaW5lTGVuZ3RoKGNtLCBjdXJFbmQubGluZSkgOiAwOwogICAgICAgICAgICAgIGNtLnNldFNlbGVjdGlvbihjdXJTdGFydCwgY3VyRW5kKTsKICAgICAgICAgICAgICBDb2RlTWlycm9yLnNpZ25hbChjbSwgInZpbS1tb2RlLWNoYW5nZSIsIHttb2RlOiAidmlzdWFsIiwgc3ViTW9kZTogImxpbmV3aXNlIn0pOwogICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbkFyZ3MuYmxvY2t3aXNlKSB7CiAgICAgICAgICAgICAgdmltLnZpc3VhbEJsb2NrID0gdHJ1ZTsKICAgICAgICAgICAgICBzZWxlY3RCbG9jayhjbSwgY3VyRW5kKTsKICAgICAgICAgICAgICBDb2RlTWlycm9yLnNpZ25hbChjbSwgJ3ZpbS1tb2RlLWNoYW5nZScsIHttb2RlOiAndmlzdWFsJywgc3ViTW9kZTogJ2Jsb2Nrd2lzZSd9KTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBleGl0VmlzdWFsTW9kZShjbSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdXBkYXRlTWFyayhjbSwgdmltLCAnPCcsIGN1cnNvcklzQmVmb3JlKGN1clN0YXJ0LCBjdXJFbmQpID8gY3VyU3RhcnQKICAgICAgICAgICAgOiBjdXJFbmQpOwogICAgICAgIHVwZGF0ZU1hcmsoY20sIHZpbSwgJz4nLCBjdXJzb3JJc0JlZm9yZShjdXJTdGFydCwgY3VyRW5kKSA/IGN1ckVuZAogICAgICAgICAgICA6IGN1clN0YXJ0KTsKICAgICAgfSwKICAgICAgcmVzZWxlY3RMYXN0U2VsZWN0aW9uOiBmdW5jdGlvbihjbSwgX2FjdGlvbkFyZ3MsIHZpbSkgewogICAgICAgIHZhciBjdXJTdGFydCA9IHZpbS5tYXJrc1snPCddLmZpbmQoKTsKICAgICAgICB2YXIgY3VyRW5kID0gdmltLm1hcmtzWyc+J10uZmluZCgpOwogICAgICAgIHZhciBsYXN0U2VsZWN0aW9uID0gdmltLmxhc3RTZWxlY3Rpb247CiAgICAgICAgaWYgKGxhc3RTZWxlY3Rpb24pIHsKICAgICAgICAgIC8vIFNldCB0aGUgc2VsZWN0aW9ucyBhcyBwZXIgbGFzdCBzZWxlY3Rpb24KICAgICAgICAgIHZhciBzZWxlY3Rpb25TdGFydCA9IGxhc3RTZWxlY3Rpb24uY3VyU3RhcnRNYXJrLmZpbmQoKTsKICAgICAgICAgIHZhciBzZWxlY3Rpb25FbmQgPSBsYXN0U2VsZWN0aW9uLmN1ckVuZE1hcmsuZmluZCgpOwogICAgICAgICAgdmFyIGJsb2Nrd2lzZSA9IGxhc3RTZWxlY3Rpb24udmlzdWFsQmxvY2s7CiAgICAgICAgICAvLyB1cGRhdGUgbGFzdCBzZWxlY3Rpb24KICAgICAgICAgIHVwZGF0ZUxhc3RTZWxlY3Rpb24oY20sIHZpbSwgY3VyU3RhcnQsIGN1ckVuZCk7CiAgICAgICAgICBpZiAoYmxvY2t3aXNlKSB7CiAgICAgICAgICAgIGNtLnNldEN1cnNvcihzZWxlY3Rpb25TdGFydCk7CiAgICAgICAgICAgIHNlbGVjdGlvblN0YXJ0ID0gc2VsZWN0QmxvY2soY20sIHNlbGVjdGlvbkVuZCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjbS5zZXRTZWxlY3Rpb24oc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkVuZCk7CiAgICAgICAgICAgIHNlbGVjdGlvblN0YXJ0ID0gY20uZ2V0Q3Vyc29yKCdhbmNob3InKTsKICAgICAgICAgICAgc2VsZWN0aW9uRW5kID0gY20uZ2V0Q3Vyc29yKCdoZWFkJyk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodmltLnZpc3VhbE1vZGUpIHsKICAgICAgICAgICAgdXBkYXRlTWFyayhjbSwgdmltLCAnPCcsIGN1cnNvcklzQmVmb3JlKHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmQpID8gc2VsZWN0aW9uU3RhcnQKICAgICAgICAgICAgICA6IHNlbGVjdGlvbkVuZCk7CiAgICAgICAgICAgIHVwZGF0ZU1hcmsoY20sIHZpbSwgJz4nLCBjdXJzb3JJc0JlZm9yZShzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kKSA/IHNlbGVjdGlvbkVuZAogICAgICAgICAgICAgIDogc2VsZWN0aW9uU3RhcnQpOwogICAgICAgICAgfQogICAgICAgICAgLy8gTGFzdCBzZWxlY3Rpb24gaXMgdXBkYXRlZCBub3cKICAgICAgICAgIHZpbS52aXN1YWxNb2RlID0gdHJ1ZTsKICAgICAgICAgIGlmIChsYXN0U2VsZWN0aW9uLnZpc3VhbExpbmUpIHsKICAgICAgICAgICAgdmltLnZpc3VhbExpbmUgPSB0cnVlOwogICAgICAgICAgICB2aW0udmlzdWFsQmxvY2sgPSBmYWxzZTsKICAgICAgICAgIH0gZWxzZSBpZiAobGFzdFNlbGVjdGlvbi52aXN1YWxCbG9jaykgewogICAgICAgICAgICB2aW0udmlzdWFsTGluZSA9IGZhbHNlOwogICAgICAgICAgICB2aW0udmlzdWFsQmxvY2sgPSB0cnVlOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdmltLnZpc3VhbEJsb2NrID0gdmltLnZpc3VhbExpbmUgPSBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICAgIENvZGVNaXJyb3Iuc2lnbmFsKGNtLCAidmltLW1vZGUtY2hhbmdlIiwge21vZGU6ICJ2aXN1YWwiLCBzdWJNb2RlOiB2aW0udmlzdWFsTGluZSA/ICJsaW5ld2lzZSIgOiAiIn0pOwogICAgICAgIH0KICAgICAgfSwKICAgICAgam9pbkxpbmVzOiBmdW5jdGlvbihjbSwgYWN0aW9uQXJncywgdmltKSB7CiAgICAgICAgdmFyIGN1clN0YXJ0LCBjdXJFbmQ7CiAgICAgICAgaWYgKHZpbS52aXN1YWxNb2RlKSB7CiAgICAgICAgICBjdXJTdGFydCA9IGNtLmdldEN1cnNvcignYW5jaG9yJyk7CiAgICAgICAgICBjdXJFbmQgPSBjbS5nZXRDdXJzb3IoJ2hlYWQnKTsKICAgICAgICAgIGN1ckVuZC5jaCA9IGxpbmVMZW5ndGgoY20sIGN1ckVuZC5saW5lKSAtIDE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIFJlcGVhdCBpcyB0aGUgbnVtYmVyIG9mIGxpbmVzIHRvIGpvaW4uIE1pbmltdW0gMiBsaW5lcy4KICAgICAgICAgIHZhciByZXBlYXQgPSBNYXRoLm1heChhY3Rpb25BcmdzLnJlcGVhdCwgMik7CiAgICAgICAgICBjdXJTdGFydCA9IGNtLmdldEN1cnNvcigpOwogICAgICAgICAgY3VyRW5kID0gY2xpcEN1cnNvclRvQ29udGVudChjbSwgUG9zKGN1clN0YXJ0LmxpbmUgKyByZXBlYXQgLSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZmluaXR5KSk7CiAgICAgICAgfQogICAgICAgIHZhciBmaW5hbENoID0gMDsKICAgICAgICBjbS5vcGVyYXRpb24oZnVuY3Rpb24oKSB7CiAgICAgICAgICBmb3IgKHZhciBpID0gY3VyU3RhcnQubGluZTsgaSA8IGN1ckVuZC5saW5lOyBpKyspIHsKICAgICAgICAgICAgZmluYWxDaCA9IGxpbmVMZW5ndGgoY20sIGN1clN0YXJ0LmxpbmUpOwogICAgICAgICAgICB2YXIgdG1wID0gUG9zKGN1clN0YXJ0LmxpbmUgKyAxLAogICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVMZW5ndGgoY20sIGN1clN0YXJ0LmxpbmUgKyAxKSk7CiAgICAgICAgICAgIHZhciB0ZXh0ID0gY20uZ2V0UmFuZ2UoY3VyU3RhcnQsIHRtcCk7CiAgICAgICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoL1xuXHMqL2csICcgJyk7CiAgICAgICAgICAgIGNtLnJlcGxhY2VSYW5nZSh0ZXh0LCBjdXJTdGFydCwgdG1wKTsKICAgICAgICAgIH0KICAgICAgICAgIHZhciBjdXJGaW5hbFBvcyA9IFBvcyhjdXJTdGFydC5saW5lLCBmaW5hbENoKTsKICAgICAgICAgIGNtLnNldEN1cnNvcihjdXJGaW5hbFBvcyk7CiAgICAgICAgfSk7CiAgICAgIH0sCiAgICAgIG5ld0xpbmVBbmRFbnRlckluc2VydE1vZGU6IGZ1bmN0aW9uKGNtLCBhY3Rpb25BcmdzLCB2aW0pIHsKICAgICAgICB2aW0uaW5zZXJ0TW9kZSA9IHRydWU7CiAgICAgICAgdmFyIGluc2VydEF0ID0gY29weUN1cnNvcihjbS5nZXRDdXJzb3IoKSk7CiAgICAgICAgaWYgKGluc2VydEF0LmxpbmUgPT09IGNtLmZpcnN0TGluZSgpICYmICFhY3Rpb25BcmdzLmFmdGVyKSB7CiAgICAgICAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIGluc2VydGluZyBuZXdsaW5lIGJlZm9yZSBzdGFydCBvZiBkb2N1bWVudC4KICAgICAgICAgIGNtLnJlcGxhY2VSYW5nZSgnXG4nLCBQb3MoY20uZmlyc3RMaW5lKCksIDApKTsKICAgICAgICAgIGNtLnNldEN1cnNvcihjbS5maXJzdExpbmUoKSwgMCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGluc2VydEF0LmxpbmUgPSAoYWN0aW9uQXJncy5hZnRlcikgPyBpbnNlcnRBdC5saW5lIDoKICAgICAgICAgICAgICBpbnNlcnRBdC5saW5lIC0gMTsKICAgICAgICAgIGluc2VydEF0LmNoID0gbGluZUxlbmd0aChjbSwgaW5zZXJ0QXQubGluZSk7CiAgICAgICAgICBjbS5zZXRDdXJzb3IoaW5zZXJ0QXQpOwogICAgICAgICAgdmFyIG5ld2xpbmVGbiA9IENvZGVNaXJyb3IuY29tbWFuZHMubmV3bGluZUFuZEluZGVudENvbnRpbnVlQ29tbWVudCB8fAogICAgICAgICAgICAgIENvZGVNaXJyb3IuY29tbWFuZHMubmV3bGluZUFuZEluZGVudDsKICAgICAgICAgIG5ld2xpbmVGbihjbSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuZW50ZXJJbnNlcnRNb2RlKGNtLCB7IHJlcGVhdDogYWN0aW9uQXJncy5yZXBlYXQgfSwgdmltKTsKICAgICAgfSwKICAgICAgcGFzdGU6IGZ1bmN0aW9uKGNtLCBhY3Rpb25BcmdzLCB2aW0pIHsKICAgICAgICB2YXIgY3VyID0gY29weUN1cnNvcihjbS5nZXRDdXJzb3IoKSk7CiAgICAgICAgdmFyIHJlZ2lzdGVyID0gdmltR2xvYmFsU3RhdGUucmVnaXN0ZXJDb250cm9sbGVyLmdldFJlZ2lzdGVyKAogICAgICAgICAgICBhY3Rpb25BcmdzLnJlZ2lzdGVyTmFtZSk7CiAgICAgICAgdmFyIHRleHQgPSByZWdpc3Rlci50b1N0cmluZygpOwogICAgICAgIGlmICghdGV4dCkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoYWN0aW9uQXJncy5tYXRjaEluZGVudCkgewogICAgICAgICAgLy8gbGVuZ3RoIHRoYXQgY29uc2lkZXJzIHRhYnMgYW5kIGNtLm9wdGlvbnMudGFiU2l6ZQogICAgICAgICAgdmFyIHdoaXRlc3BhY2VMZW5ndGggPSBmdW5jdGlvbihzdHIpIHsKICAgICAgICAgICAgdmFyIHRhYnMgPSAoc3RyLnNwbGl0KCJcdCIpLmxlbmd0aCAtIDEpOwogICAgICAgICAgICB2YXIgc3BhY2VzID0gKHN0ci5zcGxpdCgiICIpLmxlbmd0aCAtIDEpOwogICAgICAgICAgICByZXR1cm4gdGFicyAqIGNtLm9wdGlvbnMudGFiU2l6ZSArIHNwYWNlcyAqIDE7CiAgICAgICAgICB9OwogICAgICAgICAgdmFyIGN1cnJlbnRMaW5lID0gY20uZ2V0TGluZShjbS5nZXRDdXJzb3IoKS5saW5lKTsKICAgICAgICAgIHZhciBpbmRlbnQgPSB3aGl0ZXNwYWNlTGVuZ3RoKGN1cnJlbnRMaW5lLm1hdGNoKC9eXHMqLylbMF0pOwogICAgICAgICAgLy8gY2hvbXAgbGFzdCBuZXdsaW5lIGIvYyBkb24ndCB3YW50IGl0IHRvIG1hdGNoIC9eXHMqL2dtCiAgICAgICAgICB2YXIgY2hvbXBlZFRleHQgPSB0ZXh0LnJlcGxhY2UoL1xuJC8sICcnKTsKICAgICAgICAgIHZhciB3YXNDaG9tcGVkID0gdGV4dCAhPT0gY2hvbXBlZFRleHQ7CiAgICAgICAgICB2YXIgZmlyc3RJbmRlbnQgPSB3aGl0ZXNwYWNlTGVuZ3RoKHRleHQubWF0Y2goL15ccyovKVswXSk7CiAgICAgICAgICB2YXIgdGV4dCA9IGNob21wZWRUZXh0LnJlcGxhY2UoL15ccyovZ20sIGZ1bmN0aW9uKHdzcGFjZSkgewogICAgICAgICAgICB2YXIgbmV3SW5kZW50ID0gaW5kZW50ICsgKHdoaXRlc3BhY2VMZW5ndGgod3NwYWNlKSAtIGZpcnN0SW5kZW50KTsKICAgICAgICAgICAgaWYgKG5ld0luZGVudCA8IDApIHsKICAgICAgICAgICAgICByZXR1cm4gIiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoY20ub3B0aW9ucy5pbmRlbnRXaXRoVGFicykgewogICAgICAgICAgICAgIHZhciBxdW90aWVudCA9IE1hdGguZmxvb3IobmV3SW5kZW50IC8gY20ub3B0aW9ucy50YWJTaXplKTsKICAgICAgICAgICAgICByZXR1cm4gQXJyYXkocXVvdGllbnQgKyAxKS5qb2luKCdcdCcpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgIHJldHVybiBBcnJheShuZXdJbmRlbnQgKyAxKS5qb2luKCcgJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgICAgdGV4dCArPSB3YXNDaG9tcGVkID8gIlxuIiA6ICIiOwogICAgICAgIH0KICAgICAgICBpZiAoYWN0aW9uQXJncy5yZXBlYXQgPiAxKSB7CiAgICAgICAgICB2YXIgdGV4dCA9IEFycmF5KGFjdGlvbkFyZ3MucmVwZWF0ICsgMSkuam9pbih0ZXh0KTsKICAgICAgICB9CiAgICAgICAgdmFyIGxpbmV3aXNlID0gcmVnaXN0ZXIubGluZXdpc2U7CiAgICAgICAgaWYgKGxpbmV3aXNlKSB7CiAgICAgICAgICBpZih2aW0udmlzdWFsTW9kZSkgewogICAgICAgICAgICB0ZXh0ID0gdmltLnZpc3VhbExpbmUgPyB0ZXh0LnNsaWNlKDAsIC0xKSA6ICdcbicgKyB0ZXh0LnNsaWNlKDAsIHRleHQubGVuZ3RoIC0gMSkgKyAnXG4nOwogICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb25BcmdzLmFmdGVyKSB7CiAgICAgICAgICAgIC8vIE1vdmUgdGhlIG5ld2xpbmUgYXQgdGhlIGVuZCB0byB0aGUgc3RhcnQgaW5zdGVhZCwgYW5kIHBhc3RlIGp1c3QKICAgICAgICAgICAgLy8gYmVmb3JlIHRoZSBuZXdsaW5lIGNoYXJhY3RlciBvZiB0aGUgbGluZSB3ZSBhcmUgb24gcmlnaHQgbm93LgogICAgICAgICAgICB0ZXh0ID0gJ1xuJyArIHRleHQuc2xpY2UoMCwgdGV4dC5sZW5ndGggLSAxKTsKICAgICAgICAgICAgY3VyLmNoID0gbGluZUxlbmd0aChjbSwgY3VyLmxpbmUpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY3VyLmNoID0gMDsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgY3VyLmNoICs9IGFjdGlvbkFyZ3MuYWZ0ZXIgPyAxIDogMDsKICAgICAgICB9CiAgICAgICAgdmFyIGN1clBvc0ZpbmFsOwogICAgICAgIHZhciBpZHg7CiAgICAgICAgaWYgKHZpbS52aXN1YWxNb2RlKSB7CiAgICAgICAgICAvLyAgc2F2ZSB0aGUgcGFzdGVkIHRleHQgZm9yIHJlc2VsZWN0aW9uIGlmIHRoZSBuZWVkIGFyaXNlcwogICAgICAgICAgdmltLmxhc3RQYXN0ZWRUZXh0ID0gdGV4dDsKICAgICAgICAgIHZhciBsYXN0U2VsZWN0aW9uQ3VyRW5kOwogICAgICAgICAgdmFyIHNlbGVjdGVkQXJlYSA9IGdldFNlbGVjdGVkQXJlYVJhbmdlKGNtLCB2aW0pOwogICAgICAgICAgdmFyIHNlbGVjdGlvblN0YXJ0ID0gc2VsZWN0ZWRBcmVhWzBdOwogICAgICAgICAgdmFyIHNlbGVjdGlvbkVuZCA9IHNlbGVjdGVkQXJlYVsxXTsKICAgICAgICAgIC8vIHNhdmUgdGhlIGN1ckVuZCBtYXJrZXIgYmVmb3JlIGl0IGdldCBjbGVhcmVkIGR1ZSB0byBjbS5yZXBsYWNlUmFuZ2UuCiAgICAgICAgICBpZiAodmltLmxhc3RTZWxlY3Rpb24pIGxhc3RTZWxlY3Rpb25DdXJFbmQgPSB2aW0ubGFzdFNlbGVjdGlvbi5jdXJFbmRNYXJrLmZpbmQoKTsKICAgICAgICAgIC8vIHB1c2ggdGhlIHByZXZpb3VzbHkgc2VsZWN0ZWQgdGV4dCB0byB1bm5hbWVkIHJlZ2lzdGVyCiAgICAgICAgICB2aW1HbG9iYWxTdGF0ZS5yZWdpc3RlckNvbnRyb2xsZXIudW5uYW1lZFJlZ2lzdGVyLnNldFRleHQoY20uZ2V0UmFuZ2Uoc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkVuZCkpOwogICAgICAgICAgY20ucmVwbGFjZVJhbmdlKHRleHQsIHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmQpOwogICAgICAgICAgLy8gcmVzdG9yZSB0aGUgdGhlIGN1ckVuZCBtYXJrZXIKICAgICAgICAgIGlmKGxhc3RTZWxlY3Rpb25DdXJFbmQpIHZpbS5sYXN0U2VsZWN0aW9uLmN1ckVuZE1hcmsgPSBjbS5zZXRCb29rbWFyayhsYXN0U2VsZWN0aW9uQ3VyRW5kKTsKICAgICAgICAgIGN1clBvc0ZpbmFsID0gY20ucG9zRnJvbUluZGV4KGNtLmluZGV4RnJvbVBvcyhzZWxlY3Rpb25TdGFydCkgKyB0ZXh0Lmxlbmd0aCAtIDEpOwogICAgICAgICAgaWYobGluZXdpc2UpY3VyUG9zRmluYWwuY2g9MDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY20ucmVwbGFjZVJhbmdlKHRleHQsIGN1cik7CiAgICAgICAgICAvLyBOb3cgZmluZSB0dW5lIHRoZSBjdXJzb3IgdG8gd2hlcmUgd2Ugd2FudCBpdC4KICAgICAgICAgIGlmIChsaW5ld2lzZSAmJiBhY3Rpb25BcmdzLmFmdGVyKSB7CiAgICAgICAgICAgIGN1clBvc0ZpbmFsID0gUG9zKAogICAgICAgICAgICAgIGN1ci5saW5lICsgMSwKICAgICAgICAgICAgICBmaW5kRmlyc3ROb25XaGl0ZVNwYWNlQ2hhcmFjdGVyKGNtLmdldExpbmUoY3VyLmxpbmUgKyAxKSkpOwogICAgICAgICAgfSBlbHNlIGlmIChsaW5ld2lzZSAmJiAhYWN0aW9uQXJncy5hZnRlcikgewogICAgICAgICAgICBjdXJQb3NGaW5hbCA9IFBvcygKICAgICAgICAgICAgICBjdXIubGluZSwKICAgICAgICAgICAgICBmaW5kRmlyc3ROb25XaGl0ZVNwYWNlQ2hhcmFjdGVyKGNtLmdldExpbmUoY3VyLmxpbmUpKSk7CiAgICAgICAgICB9IGVsc2UgaWYgKCFsaW5ld2lzZSAmJiBhY3Rpb25BcmdzLmFmdGVyKSB7CiAgICAgICAgICAgIGlkeCA9IGNtLmluZGV4RnJvbVBvcyhjdXIpOwogICAgICAgICAgICBjdXJQb3NGaW5hbCA9IGNtLnBvc0Zyb21JbmRleChpZHggKyB0ZXh0Lmxlbmd0aCAtIDEpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWR4ID0gY20uaW5kZXhGcm9tUG9zKGN1cik7CiAgICAgICAgICAgIGN1clBvc0ZpbmFsID0gY20ucG9zRnJvbUluZGV4KGlkeCArIHRleHQubGVuZ3RoKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY20uc2V0Q3Vyc29yKGN1clBvc0ZpbmFsKTsKICAgICAgICBpZiAodmltLnZpc3VhbE1vZGUpIHsKICAgICAgICAgIGV4aXRWaXN1YWxNb2RlKGNtKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIHVuZG86IGZ1bmN0aW9uKGNtLCBhY3Rpb25BcmdzKSB7CiAgICAgICAgY20ub3BlcmF0aW9uKGZ1bmN0aW9uKCkgewogICAgICAgICAgcmVwZWF0Rm4oY20sIENvZGVNaXJyb3IuY29tbWFuZHMudW5kbywgYWN0aW9uQXJncy5yZXBlYXQpKCk7CiAgICAgICAgICBjbS5zZXRDdXJzb3IoY20uZ2V0Q3Vyc29yKCdhbmNob3InKSk7CiAgICAgICAgfSk7CiAgICAgIH0sCiAgICAgIHJlZG86IGZ1bmN0aW9uKGNtLCBhY3Rpb25BcmdzKSB7CiAgICAgICAgcmVwZWF0Rm4oY20sIENvZGVNaXJyb3IuY29tbWFuZHMucmVkbywgYWN0aW9uQXJncy5yZXBlYXQpKCk7CiAgICAgIH0sCiAgICAgIHNldFJlZ2lzdGVyOiBmdW5jdGlvbihfY20sIGFjdGlvbkFyZ3MsIHZpbSkgewogICAgICAgIHZpbS5pbnB1dFN0YXRlLnJlZ2lzdGVyTmFtZSA9IGFjdGlvbkFyZ3Muc2VsZWN0ZWRDaGFyYWN0ZXI7CiAgICAgIH0sCiAgICAgIHNldE1hcms6IGZ1bmN0aW9uKGNtLCBhY3Rpb25BcmdzLCB2aW0pIHsKICAgICAgICB2YXIgbWFya05hbWUgPSBhY3Rpb25BcmdzLnNlbGVjdGVkQ2hhcmFjdGVyOwogICAgICAgIHVwZGF0ZU1hcmsoY20sIHZpbSwgbWFya05hbWUsIGNtLmdldEN1cnNvcigpKTsKICAgICAgfSwKICAgICAgcmVwbGFjZTogZnVuY3Rpb24oY20sIGFjdGlvbkFyZ3MsIHZpbSkgewogICAgICAgIHZhciByZXBsYWNlV2l0aCA9IGFjdGlvbkFyZ3Muc2VsZWN0ZWRDaGFyYWN0ZXI7CiAgICAgICAgdmFyIGN1clN0YXJ0ID0gY20uZ2V0Q3Vyc29yKCk7CiAgICAgICAgdmFyIHJlcGxhY2VUbzsKICAgICAgICB2YXIgY3VyRW5kOwogICAgICAgIHZhciBzZWxlY3Rpb25zID0gY20ubGlzdFNlbGVjdGlvbnMoKTsKICAgICAgICBpZiAodmltLnZpc3VhbE1vZGUpIHsKICAgICAgICAgIGN1clN0YXJ0ID0gY20uZ2V0Q3Vyc29yKCdzdGFydCcpOwogICAgICAgICAgY3VyRW5kID0gY20uZ2V0Q3Vyc29yKCdlbmQnKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdmFyIGxpbmUgPSBjbS5nZXRMaW5lKGN1clN0YXJ0LmxpbmUpOwogICAgICAgICAgcmVwbGFjZVRvID0gY3VyU3RhcnQuY2ggKyBhY3Rpb25BcmdzLnJlcGVhdDsKICAgICAgICAgIGlmIChyZXBsYWNlVG8gPiBsaW5lLmxlbmd0aCkgewogICAgICAgICAgICByZXBsYWNlVG89bGluZS5sZW5ndGg7CiAgICAgICAgICB9CiAgICAgICAgICBjdXJFbmQgPSBQb3MoY3VyU3RhcnQubGluZSwgcmVwbGFjZVRvKTsKICAgICAgICB9CiAgICAgICAgaWYgKHJlcGxhY2VXaXRoPT0nXG4nKSB7CiAgICAgICAgICBpZiAoIXZpbS52aXN1YWxNb2RlKSBjbS5yZXBsYWNlUmFuZ2UoJycsIGN1clN0YXJ0LCBjdXJFbmQpOwogICAgICAgICAgLy8gc3BlY2lhbCBjYXNlLCB3aGVyZSB2aW0gaGVscCBzYXlzIHRvIHJlcGxhY2UgYnkganVzdCBvbmUgbGluZS1icmVhawogICAgICAgICAgKENvZGVNaXJyb3IuY29tbWFuZHMubmV3bGluZUFuZEluZGVudENvbnRpbnVlQ29tbWVudCB8fCBDb2RlTWlycm9yLmNvbW1hbmRzLm5ld2xpbmVBbmRJbmRlbnQpKGNtKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdmFyIHJlcGxhY2VXaXRoU3RyID0gY20uZ2V0UmFuZ2UoY3VyU3RhcnQsIGN1ckVuZCk7CiAgICAgICAgICAvL3JlcGxhY2UgYWxsIGNoYXJhY3RlcnMgaW4gcmFuZ2UgYnkgc2VsZWN0ZWQsIGJ1dCBrZWVwIGxpbmVicmVha3MKICAgICAgICAgIHJlcGxhY2VXaXRoU3RyID0gcmVwbGFjZVdpdGhTdHIucmVwbGFjZSgvW15cbl0vZywgcmVwbGFjZVdpdGgpOwogICAgICAgICAgaWYgKHZpbS52aXN1YWxCbG9jaykgewogICAgICAgICAgICAvLyBUYWJzIGFyZSBzcGxpdCBpbiB2aXN1YSBibG9jayBiZWZvcmUgcmVwbGFjaW5nCiAgICAgICAgICAgIHZhciBzcGFjZXMgPSBuZXcgQXJyYXkoY20ub3B0aW9ucy50YWJTaXplKzEpLmpvaW4oJyAnKTsKICAgICAgICAgICAgcmVwbGFjZVdpdGhTdHIgPSBjbS5nZXRTZWxlY3Rpb24oKTsKICAgICAgICAgICAgcmVwbGFjZVdpdGhTdHIgPSByZXBsYWNlV2l0aFN0ci5yZXBsYWNlKC9cdC9nLCBzcGFjZXMpLnJlcGxhY2UoL1teXG5dL2csIHJlcGxhY2VXaXRoKS5zcGxpdCgnXG4nKTsKICAgICAgICAgICAgY20ucmVwbGFjZVNlbGVjdGlvbnMocmVwbGFjZVdpdGhTdHIpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY20ucmVwbGFjZVJhbmdlKHJlcGxhY2VXaXRoU3RyLCBjdXJTdGFydCwgY3VyRW5kKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh2aW0udmlzdWFsTW9kZSkgewogICAgICAgICAgICBjdXJTdGFydCA9IGN1cnNvcklzQmVmb3JlKHNlbGVjdGlvbnNbMF0uYW5jaG9yLCBzZWxlY3Rpb25zWzBdLmhlYWQpID8KICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbnNbMF0uYW5jaG9yIDogc2VsZWN0aW9uc1swXS5oZWFkOwogICAgICAgICAgICBjbS5zZXRDdXJzb3IoY3VyU3RhcnQpOwogICAgICAgICAgICBleGl0VmlzdWFsTW9kZShjbSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjbS5zZXRDdXJzb3Iob2Zmc2V0Q3Vyc29yKGN1ckVuZCwgMCwgLTEpKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgIGluY3JlbWVudE51bWJlclRva2VuOiBmdW5jdGlvbihjbSwgYWN0aW9uQXJncykgewogICAgICAgIHZhciBjdXIgPSBjbS5nZXRDdXJzb3IoKTsKICAgICAgICB2YXIgbGluZVN0ciA9IGNtLmdldExpbmUoY3VyLmxpbmUpOwogICAgICAgIHZhciByZSA9IC8tP1xkKy9nOwogICAgICAgIHZhciBtYXRjaDsKICAgICAgICB2YXIgc3RhcnQ7CiAgICAgICAgdmFyIGVuZDsKICAgICAgICB2YXIgbnVtYmVyU3RyOwogICAgICAgIHZhciB0b2tlbjsKICAgICAgICB3aGlsZSAoKG1hdGNoID0gcmUuZXhlYyhsaW5lU3RyKSkgIT09IG51bGwpIHsKICAgICAgICAgIHRva2VuID0gbWF0Y2hbMF07CiAgICAgICAgICBzdGFydCA9IG1hdGNoLmluZGV4OwogICAgICAgICAgZW5kID0gc3RhcnQgKyB0b2tlbi5sZW5ndGg7CiAgICAgICAgICBpZiAoY3VyLmNoIDwgZW5kKWJyZWFrOwogICAgICAgIH0KICAgICAgICBpZiAoIWFjdGlvbkFyZ3MuYmFja3RyYWNrICYmIChlbmQgPD0gY3VyLmNoKSlyZXR1cm47CiAgICAgICAgaWYgKHRva2VuKSB7CiAgICAgICAgICB2YXIgaW5jcmVtZW50ID0gYWN0aW9uQXJncy5pbmNyZWFzZSA/IDEgOiAtMTsKICAgICAgICAgIHZhciBudW1iZXIgPSBwYXJzZUludCh0b2tlbikgKyAoaW5jcmVtZW50ICogYWN0aW9uQXJncy5yZXBlYXQpOwogICAgICAgICAgdmFyIGZyb20gPSBQb3MoY3VyLmxpbmUsIHN0YXJ0KTsKICAgICAgICAgIHZhciB0byA9IFBvcyhjdXIubGluZSwgZW5kKTsKICAgICAgICAgIG51bWJlclN0ciA9IG51bWJlci50b1N0cmluZygpOwogICAgICAgICAgY20ucmVwbGFjZVJhbmdlKG51bWJlclN0ciwgZnJvbSwgdG8pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGNtLnNldEN1cnNvcihQb3MoY3VyLmxpbmUsIHN0YXJ0ICsgbnVtYmVyU3RyLmxlbmd0aCAtIDEpKTsKICAgICAgfSwKICAgICAgcmVwZWF0TGFzdEVkaXQ6IGZ1bmN0aW9uKGNtLCBhY3Rpb25BcmdzLCB2aW0pIHsKICAgICAgICB2YXIgbGFzdEVkaXRJbnB1dFN0YXRlID0gdmltLmxhc3RFZGl0SW5wdXRTdGF0ZTsKICAgICAgICBpZiAoIWxhc3RFZGl0SW5wdXRTdGF0ZSkgeyByZXR1cm47IH0KICAgICAgICB2YXIgcmVwZWF0ID0gYWN0aW9uQXJncy5yZXBlYXQ7CiAgICAgICAgaWYgKHJlcGVhdCAmJiBhY3Rpb25BcmdzLnJlcGVhdElzRXhwbGljaXQpIHsKICAgICAgICAgIHZpbS5sYXN0RWRpdElucHV0U3RhdGUucmVwZWF0T3ZlcnJpZGUgPSByZXBlYXQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJlcGVhdCA9IHZpbS5sYXN0RWRpdElucHV0U3RhdGUucmVwZWF0T3ZlcnJpZGUgfHwgcmVwZWF0OwogICAgICAgIH0KICAgICAgICByZXBlYXRMYXN0RWRpdChjbSwgdmltLCByZXBlYXQsIGZhbHNlIC8qKiByZXBlYXRGb3JJbnNlcnQgKi8pOwogICAgICB9LAogICAgICBjaGFuZ2VDYXNlOiBmdW5jdGlvbihjbSwgYWN0aW9uQXJncywgdmltKSB7CiAgICAgICAgdmFyIHNlbGVjdGlvblN0YXJ0ID0gZ2V0U2VsZWN0ZWRBcmVhUmFuZ2UoY20sIHZpbSlbMF07CiAgICAgICAgdmFyIHRleHQgPSBjbS5nZXRTZWxlY3Rpb24oKTsKICAgICAgICB2YXIgbGFzdFNlbGVjdGlvbkN1ckVuZDsKICAgICAgICB2YXIgYmxvY2tTZWxlY3Rpb247CiAgICAgICAgaWYgKHZpbS5sYXN0U2VsZWN0aW9uKSB7CiAgICAgICAgLy8gc2F2ZSB0aGUgY3VyRW5kIG1hcmtlciB0byBhdm9pZCBpdHMgcmVtb3ZhbCBkdWUgdG8gY20ucmVwbGFjZVJhbmdlCiAgICAgICAgICBsYXN0U2VsZWN0aW9uQ3VyRW5kID0gdmltLmxhc3RTZWxlY3Rpb24uY3VyRW5kTWFyay5maW5kKCk7CiAgICAgICAgICBibG9ja1NlbGVjdGlvbiA9IHZpbS5sYXN0U2VsZWN0aW9uLnZpc3VhbEJsb2NrOwogICAgICAgIH0KICAgICAgICB2YXIgdG9Mb3dlciA9IGFjdGlvbkFyZ3MudG9Mb3dlcjsKICAgICAgICB0ZXh0ID0gdG9Mb3dlciA/IHRleHQudG9Mb3dlckNhc2UoKSA6IHRleHQudG9VcHBlckNhc2UoKTsKICAgICAgICBjbS5yZXBsYWNlU2VsZWN0aW9ucyh2aW0udmlzdWFsQmxvY2sgfHwgYmxvY2tTZWxlY3Rpb24gPyB0ZXh0LnNwbGl0KCdcbicpIDogW3RleHRdKTsKICAgICAgICAvLyByZXN0b3JlIHRoZSBsYXN0IHNlbGVjdGlvbiBjdXJFbmQgbWFya2VyCiAgICAgICAgaWYgKGxhc3RTZWxlY3Rpb25DdXJFbmQpIHsKICAgICAgICAgIHZpbS5sYXN0U2VsZWN0aW9uLmN1ckVuZE1hcmsgPSBjbS5zZXRCb29rbWFyayhsYXN0U2VsZWN0aW9uQ3VyRW5kKTsKICAgICAgICB9CiAgICAgICAgY20uc2V0Q3Vyc29yKHNlbGVjdGlvblN0YXJ0KTsKICAgICAgICBpZiAodmltLnZpc3VhbE1vZGUpIHsKICAgICAgICAgIGV4aXRWaXN1YWxNb2RlKGNtKTsKICAgICAgICB9CiAgICAgIH0KICAgIH07CgogICAgLyoKICAgICAqIEJlbG93IGFyZSBtaXNjZWxsYW5lb3VzIHV0aWxpdHkgZnVuY3Rpb25zIHVzZWQgYnkgdmltLmpzCiAgICAgKi8KCiAgICAvKioKICAgICAqIENsaXBzIGN1cnNvciB0byBlbnN1cmUgdGhhdCBsaW5lIGlzIHdpdGhpbiB0aGUgYnVmZmVyJ3MgcmFuZ2UKICAgICAqIElmIGluY2x1ZGVMaW5lQnJlYWsgaXMgdHJ1ZSwgdGhlbiBhbGxvdyBjdXIuY2ggPT0gbGluZUxlbmd0aC4KICAgICAqLwogICAgZnVuY3Rpb24gY2xpcEN1cnNvclRvQ29udGVudChjbSwgY3VyLCBpbmNsdWRlTGluZUJyZWFrKSB7CiAgICAgIHZhciBsaW5lID0gTWF0aC5taW4oTWF0aC5tYXgoY20uZmlyc3RMaW5lKCksIGN1ci5saW5lKSwgY20ubGFzdExpbmUoKSApOwogICAgICB2YXIgbWF4Q2ggPSBsaW5lTGVuZ3RoKGNtLCBsaW5lKSAtIDE7CiAgICAgIG1heENoID0gKGluY2x1ZGVMaW5lQnJlYWspID8gbWF4Q2ggKyAxIDogbWF4Q2g7CiAgICAgIHZhciBjaCA9IE1hdGgubWluKE1hdGgubWF4KDAsIGN1ci5jaCksIG1heENoKTsKICAgICAgcmV0dXJuIFBvcyhsaW5lLCBjaCk7CiAgICB9CiAgICBmdW5jdGlvbiBjb3B5QXJncyhhcmdzKSB7CiAgICAgIHZhciByZXQgPSB7fTsKICAgICAgZm9yICh2YXIgcHJvcCBpbiBhcmdzKSB7CiAgICAgICAgaWYgKGFyZ3MuaGFzT3duUHJvcGVydHkocHJvcCkpIHsKICAgICAgICAgIHJldFtwcm9wXSA9IGFyZ3NbcHJvcF07CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiByZXQ7CiAgICB9CiAgICBmdW5jdGlvbiBvZmZzZXRDdXJzb3IoY3VyLCBvZmZzZXRMaW5lLCBvZmZzZXRDaCkgewogICAgICByZXR1cm4gUG9zKGN1ci5saW5lICsgb2Zmc2V0TGluZSwgY3VyLmNoICsgb2Zmc2V0Q2gpOwogICAgfQogICAgZnVuY3Rpb24gbWF0Y2hLZXlzUGFydGlhbChwcmVzc2VkLCBtYXBwZWQpIHsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcmVzc2VkLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgLy8gJ2NoYXJhY3RlcicgbWVhbnMgYW55IGNoYXJhY3Rlci4gRm9yIG1hcmssIHJlZ2lzdGVyIGNvbW1hZHMsIGV0Yy4KICAgICAgICBpZiAocHJlc3NlZFtpXSAhPSBtYXBwZWRbaV0gJiYgbWFwcGVkW2ldICE9ICdjaGFyYWN0ZXInKSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgZnVuY3Rpb24gcmVwZWF0Rm4oY20sIGZuLCByZXBlYXQpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVwZWF0OyBpKyspIHsKICAgICAgICAgIGZuKGNtKTsKICAgICAgICB9CiAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBjb3B5Q3Vyc29yKGN1cikgewogICAgICByZXR1cm4gUG9zKGN1ci5saW5lLCBjdXIuY2gpOwogICAgfQogICAgZnVuY3Rpb24gY3Vyc29yRXF1YWwoY3VyMSwgY3VyMikgewogICAgICByZXR1cm4gY3VyMS5jaCA9PSBjdXIyLmNoICYmIGN1cjEubGluZSA9PSBjdXIyLmxpbmU7CiAgICB9CiAgICBmdW5jdGlvbiBjdXJzb3JJc0JlZm9yZShjdXIxLCBjdXIyKSB7CiAgICAgIGlmIChjdXIxLmxpbmUgPCBjdXIyLmxpbmUpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBpZiAoY3VyMS5saW5lID09IGN1cjIubGluZSAmJiBjdXIxLmNoIDwgY3VyMi5jaCkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGZ1bmN0aW9uIGN1c3JvcklzQmV0d2VlbihjdXIxLCBjdXIyLCBjdXIzKSB7CiAgICAgIC8vIHJldHVybnMgdHJ1ZSBpZiBjdXIyIGlzIGJldHdlZW4gY3VyMSBhbmQgY3VyMy4KICAgICAgdmFyIGN1cjFiZWZvcmUyID0gY3Vyc29ySXNCZWZvcmUoY3VyMSwgY3VyMik7CiAgICAgIHZhciBjdXIyYmVmb3JlMyA9IGN1cnNvcklzQmVmb3JlKGN1cjIsIGN1cjMpOwogICAgICByZXR1cm4gY3VyMWJlZm9yZTIgJiYgY3VyMmJlZm9yZTM7CiAgICB9CiAgICBmdW5jdGlvbiBsaW5lTGVuZ3RoKGNtLCBsaW5lTnVtKSB7CiAgICAgIHJldHVybiBjbS5nZXRMaW5lKGxpbmVOdW0pLmxlbmd0aDsKICAgIH0KICAgIGZ1bmN0aW9uIHJldmVyc2Uocyl7CiAgICAgIHJldHVybiBzLnNwbGl0KCcnKS5yZXZlcnNlKCkuam9pbignJyk7CiAgICB9CiAgICBmdW5jdGlvbiB0cmltKHMpIHsKICAgICAgaWYgKHMudHJpbSkgewogICAgICAgIHJldHVybiBzLnRyaW0oKTsKICAgICAgfQogICAgICByZXR1cm4gcy5yZXBsYWNlKC9eXHMrfFxzKyQvZywgJycpOwogICAgfQogICAgZnVuY3Rpb24gZXNjYXBlUmVnZXgocykgewogICAgICByZXR1cm4gcy5yZXBsYWNlKC8oWy4/KiskXFtcXVwvXFwoKXt9fFwtXSkvZywgJ1xcJDEnKTsKICAgIH0KICAgIC8vIFRoaXMgZnVuY3Rpb25zIHNlbGVjdHMgYSByZWN0YW5ndWxhciBibG9jawogICAgLy8gb2YgdGV4dCB3aXRoIHNlbGVjdGlvbkVuZCBhcyBhbnkgb2YgaXRzIGNvcm5lcgogICAgLy8gSGVpZ2h0IG9mIGJsb2NrOgogICAgLy8gRGlmZmVyZW5jZSBpbiBzZWxlY3Rpb25FbmQubGluZSBhbmQgZmlyc3QvbGFzdCBzZWxlY3Rpb24ubGluZQogICAgLy8gV2lkdGggb2YgdGhlIGJsb2NrOgogICAgLy8gRGlzdGFuY2UgYmV0d2VlbiBzZWxlY3Rpb25FbmQuY2ggYW5kIGFueShmaXJzdCBjb25zaWRlcmVkIGhlcmUpIHNlbGVjdGlvbi5jaAogICAgZnVuY3Rpb24gc2VsZWN0QmxvY2soY20sIHNlbGVjdGlvbkVuZCkgewogICAgICB2YXIgc2VsZWN0aW9ucyA9IFtdLCByYW5nZXMgPSBjbS5saXN0U2VsZWN0aW9ucygpOwogICAgICB2YXIgZmlyc3RSYW5nZSA9IHJhbmdlc1swXS5hbmNob3IsIGxhc3RSYW5nZSA9IHJhbmdlc1tyYW5nZXMubGVuZ3RoLTFdLmFuY2hvcjsKICAgICAgdmFyIHN0YXJ0LCBlbmQsIHNlbGVjdGlvblN0YXJ0OwogICAgICB2YXIgY3VyRW5kID0gY20uZ2V0Q3Vyc29yKCdoZWFkJyk7CiAgICAgIHZhciBwcmltSW5kZXggPSBnZXRJbmRleChyYW5nZXMsIGN1ckVuZCk7CiAgICAgIC8vIHNldHMgdG8gdHJ1ZSB3aGVuIHNlbGVjdGlvbkVuZCBhbHJlYWR5IGxpZXMgaW5zaWRlIHRoZSBleGlzdGluZyBzZWxlY3Rpb25zCiAgICAgIHZhciBjb250YWlucyA9IGdldEluZGV4KHJhbmdlcywgc2VsZWN0aW9uRW5kKSA8IDAgPyBmYWxzZSA6IHRydWU7CiAgICAgIHNlbGVjdGlvbkVuZCA9IGNtLmNsaXBQb3Moc2VsZWN0aW9uRW5kKTsKICAgICAgLy8gZGlmZmVyZW5jZSBpbiBkaXN0YW5jZSBvZiBzZWxlY3Rpb25FbmQgZnJvbSBlYWNoIGVuZCBvZiB0aGUgYmxvY2suCiAgICAgIHZhciBuZWFyICA9IE1hdGguYWJzKGZpcnN0UmFuZ2UubGluZSAtIHNlbGVjdGlvbkVuZC5saW5lKSAtIE1hdGguYWJzKGxhc3RSYW5nZS5saW5lIC0gc2VsZWN0aW9uRW5kLmxpbmUpOwogICAgICBpZiAobmVhciA+IDApIHsKICAgICAgICBlbmQgPSBzZWxlY3Rpb25FbmQubGluZTsKICAgICAgICBzdGFydCA9IGZpcnN0UmFuZ2UubGluZTsKICAgICAgICBpZiAobGFzdFJhbmdlLmxpbmUgPT0gc2VsZWN0aW9uRW5kLmxpbmUgJiYgY29udGFpbnMpIHsKICAgICAgICAgIHN0YXJ0ID0gZW5kOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChuZWFyIDwgMCkgewogICAgICAgIHN0YXJ0ID0gc2VsZWN0aW9uRW5kLmxpbmU7CiAgICAgICAgZW5kID0gbGFzdFJhbmdlLmxpbmU7CiAgICAgICAgaWYgKGZpcnN0UmFuZ2UubGluZSA9PSBzZWxlY3Rpb25FbmQubGluZSAmJiBjb250YWlucykgewogICAgICAgICAgZW5kID0gc3RhcnQ7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIC8vIENhc2Ugd2hlcmUgc2VsZWN0aW9uRW5kIGxpbmUgaXMgaGFsZndheSBiZXR3ZWVuIHRoZSAyIGVuZHMuCiAgICAgICAgLy8gV2UgcmVtb3ZlIHRoZSBwcmltYXJ5IHNlbGVjdGlvbiBpbiB0aGlzIGNhc2UKICAgICAgICBpZiAocHJpbUluZGV4ID09IDApIHsKICAgICAgICAgIHN0YXJ0ID0gc2VsZWN0aW9uRW5kLmxpbmU7CiAgICAgICAgICBlbmQgPSBsYXN0UmFuZ2UubGluZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc3RhcnQgPSBmaXJzdFJhbmdlLmxpbmU7CiAgICAgICAgICBlbmQgPSBzZWxlY3Rpb25FbmQubGluZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHN0YXJ0ID4gZW5kKSB7CiAgICAgICAgdmFyIHRtcCA9IHN0YXJ0OwogICAgICAgIHN0YXJ0ID0gZW5kOwogICAgICAgIGVuZCA9IHRtcDsKICAgICAgfQogICAgICBzZWxlY3Rpb25TdGFydCA9IChuZWFyID4gMCkgPyBmaXJzdFJhbmdlIDogbGFzdFJhbmdlOwogICAgICB3aGlsZSAoc3RhcnQgPD0gZW5kKSB7CiAgICAgICAgdmFyIGFuY2hvciA9IHtsaW5lOiBzdGFydCwgY2g6IHNlbGVjdGlvblN0YXJ0LmNofTsKICAgICAgICB2YXIgaGVhZCA9IHtsaW5lOiBzdGFydCwgY2g6IHNlbGVjdGlvbkVuZC5jaH07CiAgICAgICAgLy8gU2hpZnQgdGhlIGFuY2hvciByaWdodCBvciBsZWZ0CiAgICAgICAgLy8gYXMgZWFjaCBzZWxlY3Rpb24gY3Jvc3NlcyBpdHNlbGYuCiAgICAgICAgaWYgKChhbmNob3IuY2ggPCBjdXJFbmQuY2gpICYmICgoaGVhZC5jaCA9PSBhbmNob3IuY2gpIHx8IChhbmNob3IuY2ggLSBoZWFkLmNoID09IDEpKSkgewogICAgICAgICAgYW5jaG9yLmNoKys7CiAgICAgICAgICBoZWFkLmNoLS07CiAgICAgICAgfSBlbHNlIGlmICgoYW5jaG9yLmNoID4gY3VyRW5kLmNoKSAmJiAoKGhlYWQuY2ggPT0gYW5jaG9yLmNoKSB8fCAoYW5jaG9yLmNoIC0gaGVhZC5jaCA9PSAtMSkpKSB7CiAgICAgICAgICBhbmNob3IuY2gtLTsKICAgICAgICAgIGhlYWQuY2grKzsKICAgICAgICB9CiAgICAgICAgdmFyIHJhbmdlID0ge2FuY2hvcjogYW5jaG9yLCBoZWFkOiBoZWFkfTsKICAgICAgICBzZWxlY3Rpb25zLnB1c2gocmFuZ2UpOwogICAgICAgIGlmIChjdXJzb3JFcXVhbChoZWFkLCBzZWxlY3Rpb25FbmQpKSB7CiAgICAgICAgICAgIHByaW1JbmRleCA9IHNlbGVjdGlvbnMuaW5kZXhPZihyYW5nZSk7CiAgICAgICAgfQogICAgICAgIHN0YXJ0Kys7CiAgICAgIH0KICAgICAgLy8gVXBkYXRlIHNlbGVjdGlvbkVuZCBhbmQgc2VsZWN0aW9uU3RhcnQKICAgICAgLy8gYWZ0ZXIgc2VsZWN0aW9uIGNyb3NzaW5nCiAgICAgIHNlbGVjdGlvbkVuZC5jaCA9IHNlbGVjdGlvbnNbMF0uaGVhZC5jaDsKICAgICAgc2VsZWN0aW9uU3RhcnQuY2ggPSBzZWxlY3Rpb25zWzBdLmFuY2hvci5jaDsKICAgICAgY20uc2V0U2VsZWN0aW9ucyhzZWxlY3Rpb25zLCBwcmltSW5kZXgpOwogICAgICByZXR1cm4gc2VsZWN0aW9uU3RhcnQ7CiAgICB9CiAgICBmdW5jdGlvbiBnZXRJbmRleChyYW5nZXMsIGhlYWQpIHsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICBpZiAoY3Vyc29yRXF1YWwocmFuZ2VzW2ldLmhlYWQsIGhlYWQpKSB7CiAgICAgICAgICByZXR1cm4gaTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIC0xOwogICAgfQogICAgZnVuY3Rpb24gZ2V0U2VsZWN0ZWRBcmVhUmFuZ2UoY20sIHZpbSkgewogICAgICB2YXIgbGFzdFNlbGVjdGlvbiA9IHZpbS5sYXN0U2VsZWN0aW9uOwogICAgICB2YXIgZ2V0Q3VycmVudFNlbGVjdGVkQXJlYVJhbmdlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHNlbGVjdGlvbnMgPSBjbS5saXN0U2VsZWN0aW9ucygpOwogICAgICAgIHZhciBzdGFydCA9ICBzZWxlY3Rpb25zWzBdOwogICAgICAgIHZhciBlbmQgPSBzZWxlY3Rpb25zW3NlbGVjdGlvbnMubGVuZ3RoLTFdOwogICAgICAgIHZhciBzZWxlY3Rpb25TdGFydCA9IGN1cnNvcklzQmVmb3JlKHN0YXJ0LmFuY2hvciwgc3RhcnQuaGVhZCkgPyBzdGFydC5hbmNob3IgOiBzdGFydC5oZWFkOwogICAgICAgIHZhciBzZWxlY3Rpb25FbmQgPSBjdXJzb3JJc0JlZm9yZShlbmQuYW5jaG9yLCBlbmQuaGVhZCkgPyBlbmQuaGVhZCA6IGVuZC5hbmNob3I7CiAgICAgICAgcmV0dXJuIFtzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kXTsKICAgICAgfTsKICAgICAgdmFyIGdldExhc3RTZWxlY3RlZEFyZWFSYW5nZSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBzZWxlY3Rpb25TdGFydCA9IGNtLmdldEN1cnNvcigpOwogICAgICAgIHZhciBzZWxlY3Rpb25FbmQgPSBjbS5nZXRDdXJzb3IoKTsKICAgICAgICB2YXIgYmxvY2sgPSBsYXN0U2VsZWN0aW9uLnZpc3VhbEJsb2NrOwogICAgICAgIGlmIChibG9jaykgewogICAgICAgICAgdmFyIHdpZHRoID0gYmxvY2sud2lkdGg7CiAgICAgICAgICB2YXIgaGVpZ2h0ID0gYmxvY2suaGVpZ2h0OwogICAgICAgICAgc2VsZWN0aW9uRW5kID0gUG9zKHNlbGVjdGlvblN0YXJ0LmxpbmUgKyBoZWlnaHQsIHNlbGVjdGlvblN0YXJ0LmNoICsgd2lkdGgpOwogICAgICAgICAgdmFyIHNlbGVjdGlvbnMgPSBbXTsKICAgICAgICAgIC8vIHNlbGVjdEJsb2NrIGNyZWF0ZXMgYSAncHJvcGVyJyByZWN0YW5ndWxhciBibG9jay4KICAgICAgICAgIC8vIFdlIGRvIG5vdCB3YW50IHRoYXQgaW4gYWxsIGNhc2VzLCBzbyB3ZSBtYW51YWxseSBzZXQgc2VsZWN0aW9ucy4KICAgICAgICAgIGZvciAodmFyIGkgPSBzZWxlY3Rpb25TdGFydC5saW5lOyBpIDwgc2VsZWN0aW9uRW5kLmxpbmU7IGkrKykgewogICAgICAgICAgICB2YXIgYW5jaG9yID0gUG9zKGksIHNlbGVjdGlvblN0YXJ0LmNoKTsKICAgICAgICAgICAgdmFyIGhlYWQgPSBQb3MoaSwgc2VsZWN0aW9uRW5kLmNoKTsKICAgICAgICAgICAgdmFyIHJhbmdlID0ge2FuY2hvcjogYW5jaG9yLCBoZWFkOiBoZWFkfTsKICAgICAgICAgICAgc2VsZWN0aW9ucy5wdXNoKHJhbmdlKTsKICAgICAgICAgIH0KICAgICAgICAgIGNtLnNldFNlbGVjdGlvbnMoc2VsZWN0aW9ucyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHZhciBzdGFydCA9IGxhc3RTZWxlY3Rpb24uY3VyU3RhcnRNYXJrLmZpbmQoKTsKICAgICAgICAgIHZhciBlbmQgPSBsYXN0U2VsZWN0aW9uLmN1ckVuZE1hcmsuZmluZCgpOwogICAgICAgICAgdmFyIGxpbmUgPSBlbmQubGluZSAtIHN0YXJ0LmxpbmU7CiAgICAgICAgICB2YXIgY2ggPSBlbmQuY2ggLSBzdGFydC5jaDsKICAgICAgICAgIHNlbGVjdGlvbkVuZCA9IHtsaW5lOiBzZWxlY3Rpb25FbmQubGluZSArIGxpbmUsIGNoOiBsaW5lID8gc2VsZWN0aW9uRW5kLmNoIDogY2ggKyBzZWxlY3Rpb25FbmQuY2h9OwogICAgICAgICAgaWYgKGxhc3RTZWxlY3Rpb24udmlzdWFsTGluZSkgewogICAgICAgICAgICBzZWxlY3Rpb25TdGFydCA9IFBvcyhzZWxlY3Rpb25TdGFydC5saW5lLCAwKTsKICAgICAgICAgICAgc2VsZWN0aW9uRW5kID0gUG9zKHNlbGVjdGlvbkVuZC5saW5lLCBsaW5lTGVuZ3RoKGNtLCBzZWxlY3Rpb25FbmQubGluZSkpOwogICAgICAgICAgfQogICAgICAgICAgY20uc2V0U2VsZWN0aW9uKHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmQpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gW3NlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmRdOwogICAgICB9OwogICAgICBpZiAoIXZpbS52aXN1YWxNb2RlKSB7CiAgICAgIC8vIEluIGNhc2Ugb2YgcmVwbGF5aW5nIHRoZSBhY3Rpb24uCiAgICAgICAgcmV0dXJuIGdldExhc3RTZWxlY3RlZEFyZWFSYW5nZSgpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBnZXRDdXJyZW50U2VsZWN0ZWRBcmVhUmFuZ2UoKTsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gdXBkYXRlTGFzdFNlbGVjdGlvbihjbSwgdmltLCBzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kKSB7CiAgICAgIGlmICghc2VsZWN0aW9uU3RhcnQgfHwgIXNlbGVjdGlvbkVuZCkgewogICAgICAgIHNlbGVjdGlvblN0YXJ0ID0gdmltLm1hcmtzWyc8J10uZmluZCgpIHx8IGNtLmdldEN1cnNvcignYW5jaG9yJyk7CiAgICAgICAgc2VsZWN0aW9uRW5kID0gdmltLm1hcmtzWyc+J10uZmluZCgpIHx8IGNtLmdldEN1cnNvcignaGVhZCcpOwogICAgICB9CiAgICAgIC8vIFRvIGFjY29tbW9kYXRlIHRoZSBlZmZlY3Qgb2YgbGFzdFBhc3RlZFRleHQgaW4gdGhlIGxhc3Qgc2VsZWN0aW9uCiAgICAgIGlmICh2aW0ubGFzdFBhc3RlZFRleHQpIHsKICAgICAgICBzZWxlY3Rpb25FbmQgPSBjbS5wb3NGcm9tSW5kZXgoY20uaW5kZXhGcm9tUG9zKHNlbGVjdGlvblN0YXJ0KSArIHZpbS5sYXN0UGFzdGVkVGV4dC5sZW5ndGgpOwogICAgICAgIHZpbS5sYXN0UGFzdGVkVGV4dCA9IG51bGw7CiAgICAgIH0KICAgICAgdmFyIHJhbmdlcyA9IGNtLmxpc3RTZWxlY3Rpb25zKCk7CiAgICAgIC8vIFRoaXMgY2hlY2sgZW5zdXJlcyB0byBzZXQgdGhlIGN1cnNvcgogICAgICAvLyBwb3NpdGlvbiB3aGVyZSB3ZSBsZWZ0IG9mZiBpbiBwcmV2aW91cyBzZWxlY3Rpb24KICAgICAgdmFyIHN3YXAgPSBnZXRJbmRleChyYW5nZXMsIHNlbGVjdGlvblN0YXJ0KSA+IC0xOwogICAgICBpZiAodmltLnZpc3VhbEJsb2NrKSB7CiAgICAgICAgdmFyIGhlaWdodCA9IE1hdGguYWJzKHNlbGVjdGlvblN0YXJ0LmxpbmUgLSBzZWxlY3Rpb25FbmQubGluZSkrMTsKICAgICAgICB2YXIgd2lkdGggPSAgTWF0aC5hYnMoc2VsZWN0aW9uU3RhcnQuY2ggLSBzZWxlY3Rpb25FbmQuY2gpOwogICAgICAgIHZhciBibG9jayA9IHtoZWlnaHQ6IGhlaWdodCwgd2lkdGg6IHdpZHRofTsKICAgICAgfQogICAgICAvLyBjYW4ndCB1c2Ugc2VsZWN0aW9uIHN0YXRlIGhlcmUgYmVjYXVzZSB5YW5rIGhhcyBhbHJlYWR5IHJlc2V0IGl0cyBjdXJzb3IKICAgICAgLy8gQWxzbywgQm9va21hcmtzIG1ha2UgdGhlIHZpc3VhbCBzZWxlY3Rpb25zIHJvYnVzdCB0byBlZGl0IG9wZXJhdGlvbnMKICAgICAgdmltLmxhc3RTZWxlY3Rpb24gPSB7J2N1clN0YXJ0TWFyayc6IGNtLnNldEJvb2ttYXJrKHN3YXAgPyBzZWxlY3Rpb25FbmQgOiBzZWxlY3Rpb25TdGFydCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICdjdXJFbmRNYXJrJzogY20uc2V0Qm9va21hcmsoc3dhcCA/IHNlbGVjdGlvblN0YXJ0IDogc2VsZWN0aW9uRW5kKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Zpc3VhbE1vZGUnOiB2aW0udmlzdWFsTW9kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Zpc3VhbExpbmUnOiB2aW0udmlzdWFsTGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Zpc3VhbEJsb2NrJzogYmxvY2t9OwogICAgfQoKICAgIGZ1bmN0aW9uIGV4aXRWaXN1YWxNb2RlKGNtKSB7CiAgICAgIGNtLm9mZignbW91c2Vkb3duJywgZXhpdFZpc3VhbE1vZGUpOwogICAgICB2YXIgdmltID0gY20uc3RhdGUudmltOwogICAgICB2YXIgc2VsZWN0aW9uU3RhcnQgPSBjbS5nZXRDdXJzb3IoJ2FuY2hvcicpOwogICAgICB2YXIgc2VsZWN0aW9uRW5kID0gY20uZ2V0Q3Vyc29yKCdoZWFkJyk7CiAgICAgIHVwZGF0ZUxhc3RTZWxlY3Rpb24oY20sIHZpbSk7CiAgICAgIHZpbS52aXN1YWxNb2RlID0gZmFsc2U7CiAgICAgIHZpbS52aXN1YWxMaW5lID0gZmFsc2U7CiAgICAgIHZpbS52aXN1YWxCbG9jayA9IGZhbHNlOwogICAgICBpZiAoIWN1cnNvckVxdWFsKHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmQpKSB7CiAgICAgICAgLy8gQ2xlYXIgdGhlIHNlbGVjdGlvbiBhbmQgc2V0IHRoZSBjdXJzb3Igb25seSBpZiB0aGUgc2VsZWN0aW9uIGhhcyBub3QKICAgICAgICAvLyBhbHJlYWR5IGJlZW4gY2xlYXJlZC4gT3RoZXJ3aXNlIHdlIHJpc2sgbW92aW5nIHRoZSBjdXJzb3Igc29tZXdoZXJlCiAgICAgICAgLy8gaXQncyBub3Qgc3VwcG9zZWQgdG8gYmUuCiAgICAgICAgY20uc2V0Q3Vyc29yKGNsaXBDdXJzb3JUb0NvbnRlbnQoY20sIHNlbGVjdGlvbkVuZCkpOwogICAgICB9CiAgICAgIENvZGVNaXJyb3Iuc2lnbmFsKGNtLCAidmltLW1vZGUtY2hhbmdlIiwge21vZGU6ICJub3JtYWwifSk7CiAgICAgIGlmICh2aW0uZmFrZUN1cnNvcikgewogICAgICAgIHZpbS5mYWtlQ3Vyc29yLmNsZWFyKCk7CiAgICAgIH0KICAgIH0KCiAgICAvLyBSZW1vdmUgYW55IHRyYWlsaW5nIG5ld2xpbmVzIGZyb20gdGhlIHNlbGVjdGlvbi4gRm9yCiAgICAvLyBleGFtcGxlLCB3aXRoIHRoZSBjYXJldCBhdCB0aGUgc3RhcnQgb2YgdGhlIGxhc3Qgd29yZCBvbiB0aGUgbGluZSwKICAgIC8vICdkdycgc2hvdWxkIHdvcmQsIGJ1dCBub3QgdGhlIG5ld2xpbmUsIHdoaWxlICd3JyBzaG91bGQgYWR2YW5jZSB0aGUKICAgIC8vIGNhcmV0IHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIG5leHQgbGluZS4KICAgIGZ1bmN0aW9uIGNsaXBUb0xpbmUoY20sIGN1clN0YXJ0LCBjdXJFbmQpIHsKICAgICAgdmFyIHNlbGVjdGlvbiA9IGNtLmdldFJhbmdlKGN1clN0YXJ0LCBjdXJFbmQpOwogICAgICAvLyBPbmx5IGNsaXAgaWYgdGhlIHNlbGVjdGlvbiBlbmRzIHdpdGggdHJhaWxpbmcgbmV3bGluZSArIHdoaXRlc3BhY2UKICAgICAgaWYgKC9cblxzKiQvLnRlc3Qoc2VsZWN0aW9uKSkgewogICAgICAgIHZhciBsaW5lcyA9IHNlbGVjdGlvbi5zcGxpdCgnXG4nKTsKICAgICAgICAvLyBXZSBrbm93IHRoaXMgaXMgYWxsIHdoaXRlcHNhY2UuCiAgICAgICAgbGluZXMucG9wKCk7CgogICAgICAgIC8vIENhc2VzOgogICAgICAgIC8vIDEuIExhc3Qgd29yZCBpcyBhbiBlbXB0eSBsaW5lIC0gZG8gbm90IGNsaXAgdGhlIHRyYWlsaW5nICdcbicKICAgICAgICAvLyAyLiBMYXN0IHdvcmQgaXMgbm90IGFuIGVtcHR5IGxpbmUgLSBjbGlwIHRoZSB0cmFpbGluZyAnXG4nCiAgICAgICAgdmFyIGxpbmU7CiAgICAgICAgLy8gRmluZCB0aGUgbGluZSBjb250YWluaW5nIHRoZSBsYXN0IHdvcmQsIGFuZCBjbGlwIGFsbCB3aGl0ZXNwYWNlIHVwCiAgICAgICAgLy8gdG8gaXQuCiAgICAgICAgZm9yICh2YXIgbGluZSA9IGxpbmVzLnBvcCgpOyBsaW5lcy5sZW5ndGggPiAwICYmIGxpbmUgJiYgaXNXaGl0ZVNwYWNlU3RyaW5nKGxpbmUpOyBsaW5lID0gbGluZXMucG9wKCkpIHsKICAgICAgICAgIGN1ckVuZC5saW5lLS07CiAgICAgICAgICBjdXJFbmQuY2ggPSAwOwogICAgICAgIH0KICAgICAgICAvLyBJZiB0aGUgbGFzdCB3b3JkIGlzIG5vdCBhbiBlbXB0eSBsaW5lLCBjbGlwIGFuIGFkZGl0aW9uYWwgbmV3bGluZQogICAgICAgIGlmIChsaW5lKSB7CiAgICAgICAgICBjdXJFbmQubGluZS0tOwogICAgICAgICAgY3VyRW5kLmNoID0gbGluZUxlbmd0aChjbSwgY3VyRW5kLmxpbmUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjdXJFbmQuY2ggPSAwOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8vIEV4cGFuZCB0aGUgc2VsZWN0aW9uIHRvIGxpbmUgZW5kcy4KICAgIGZ1bmN0aW9uIGV4cGFuZFNlbGVjdGlvblRvTGluZShfY20sIGN1clN0YXJ0LCBjdXJFbmQpIHsKICAgICAgY3VyU3RhcnQuY2ggPSAwOwogICAgICBjdXJFbmQuY2ggPSAwOwogICAgICBjdXJFbmQubGluZSsrOwogICAgfQoKICAgIGZ1bmN0aW9uIGZpbmRGaXJzdE5vbldoaXRlU3BhY2VDaGFyYWN0ZXIodGV4dCkgewogICAgICBpZiAoIXRleHQpIHsKICAgICAgICByZXR1cm4gMDsKICAgICAgfQogICAgICB2YXIgZmlyc3ROb25XUyA9IHRleHQuc2VhcmNoKC9cUy8pOwogICAgICByZXR1cm4gZmlyc3ROb25XUyA9PSAtMSA/IHRleHQubGVuZ3RoIDogZmlyc3ROb25XUzsKICAgIH0KCiAgICBmdW5jdGlvbiBleHBhbmRXb3JkVW5kZXJDdXJzb3IoY20sIGluY2x1c2l2ZSwgX2ZvcndhcmQsIGJpZ1dvcmQsIG5vU3ltYm9sKSB7CiAgICAgIHZhciBjdXIgPSBjbS5nZXRDdXJzb3IoKTsKICAgICAgdmFyIGxpbmUgPSBjbS5nZXRMaW5lKGN1ci5saW5lKTsKICAgICAgdmFyIGlkeCA9IGN1ci5jaDsKCiAgICAgIC8vIFNlZWsgdG8gZmlyc3Qgd29yZCBvciBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIsIGRlcGVuZGluZyBvbiBpZgogICAgICAvLyBub1N5bWJvbCBpcyB0cnVlLgogICAgICB2YXIgdGV4dEFmdGVySWR4ID0gbGluZS5zdWJzdHJpbmcoaWR4KTsKICAgICAgdmFyIGZpcnN0TWF0Y2hlZENoYXI7CiAgICAgIGlmIChub1N5bWJvbCkgewogICAgICAgIGZpcnN0TWF0Y2hlZENoYXIgPSB0ZXh0QWZ0ZXJJZHguc2VhcmNoKC9cdy8pOwogICAgICB9IGVsc2UgewogICAgICAgIGZpcnN0TWF0Y2hlZENoYXIgPSB0ZXh0QWZ0ZXJJZHguc2VhcmNoKC9cUy8pOwogICAgICB9CiAgICAgIGlmIChmaXJzdE1hdGNoZWRDaGFyID09IC0xKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgaWR4ICs9IGZpcnN0TWF0Y2hlZENoYXI7CiAgICAgIHRleHRBZnRlcklkeCA9IGxpbmUuc3Vic3RyaW5nKGlkeCk7CiAgICAgIHZhciB0ZXh0QmVmb3JlSWR4ID0gbGluZS5zdWJzdHJpbmcoMCwgaWR4KTsKCiAgICAgIHZhciBtYXRjaFJlZ2V4OwogICAgICAvLyBHcmVlZHkgbWF0Y2hlcnMgZm9yIHRoZSAid29yZCIgd2UgYXJlIHRyeWluZyB0byBleHBhbmQuCiAgICAgIGlmIChiaWdXb3JkKSB7CiAgICAgICAgbWF0Y2hSZWdleCA9IC9eXFMrLzsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoKC9cdy8pLnRlc3QobGluZS5jaGFyQXQoaWR4KSkpIHsKICAgICAgICAgIG1hdGNoUmVnZXggPSAvXlx3Ky87CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG1hdGNoUmVnZXggPSAvXlteXHdcc10rLzsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHZhciB3b3JkQWZ0ZXJSZWdleCA9IG1hdGNoUmVnZXguZXhlYyh0ZXh0QWZ0ZXJJZHgpOwogICAgICB2YXIgd29yZFN0YXJ0ID0gaWR4OwogICAgICB2YXIgd29yZEVuZCA9IGlkeCArIHdvcmRBZnRlclJlZ2V4WzBdLmxlbmd0aDsKICAgICAgLy8gVE9ETzogRmluZCBhIGJldHRlciB3YXkgdG8gZG8gdGhpcy4gSXQgd2lsbCBiZSBzbG93IG9uIHZlcnkgbG9uZyBsaW5lcy4KICAgICAgdmFyIHJldlRleHRCZWZvcmVJZHggPSByZXZlcnNlKHRleHRCZWZvcmVJZHgpOwogICAgICB2YXIgd29yZEJlZm9yZVJlZ2V4ID0gbWF0Y2hSZWdleC5leGVjKHJldlRleHRCZWZvcmVJZHgpOwogICAgICBpZiAod29yZEJlZm9yZVJlZ2V4KSB7CiAgICAgICAgd29yZFN0YXJ0IC09IHdvcmRCZWZvcmVSZWdleFswXS5sZW5ndGg7CiAgICAgIH0KCiAgICAgIGlmIChpbmNsdXNpdmUpIHsKICAgICAgICAvLyBJZiBwcmVzZW50LCB0cmltIGFsbCB3aGl0ZXNwYWNlIGFmdGVyIHdvcmQuCiAgICAgICAgLy8gT3RoZXJ3aXNlLCB0cmltIGFsbCB3aGl0ZXNwYWNlIGJlZm9yZSB3b3JkLgogICAgICAgIHZhciB0ZXh0QWZ0ZXJXb3JkRW5kID0gbGluZS5zdWJzdHJpbmcod29yZEVuZCk7CiAgICAgICAgdmFyIHdoaXRlc3BhY2VzQWZ0ZXJXb3JkID0gdGV4dEFmdGVyV29yZEVuZC5tYXRjaCgvXlxzKi8pWzBdLmxlbmd0aDsKICAgICAgICBpZiAod2hpdGVzcGFjZXNBZnRlcldvcmQgPiAwKSB7CiAgICAgICAgICB3b3JkRW5kICs9IHdoaXRlc3BhY2VzQWZ0ZXJXb3JkOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB2YXIgcmV2VHJpbSA9IHJldlRleHRCZWZvcmVJZHgubGVuZ3RoIC0gd29yZFN0YXJ0OwogICAgICAgICAgdmFyIHRleHRCZWZvcmVXb3JkU3RhcnQgPSByZXZUZXh0QmVmb3JlSWR4LnN1YnN0cmluZyhyZXZUcmltKTsKICAgICAgICAgIHZhciB3aGl0ZXNwYWNlc0JlZm9yZVdvcmQgPSB0ZXh0QmVmb3JlV29yZFN0YXJ0Lm1hdGNoKC9eXHMqLylbMF0ubGVuZ3RoOwogICAgICAgICAgd29yZFN0YXJ0IC09IHdoaXRlc3BhY2VzQmVmb3JlV29yZDsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiB7IHN0YXJ0OiBQb3MoY3VyLmxpbmUsIHdvcmRTdGFydCksCiAgICAgICAgICAgICAgIGVuZDogUG9zKGN1ci5saW5lLCB3b3JkRW5kKSB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHJlY29yZEp1bXBQb3NpdGlvbihjbSwgb2xkQ3VyLCBuZXdDdXIpIHsKICAgICAgaWYgKCFjdXJzb3JFcXVhbChvbGRDdXIsIG5ld0N1cikpIHsKICAgICAgICB2aW1HbG9iYWxTdGF0ZS5qdW1wTGlzdC5hZGQoY20sIG9sZEN1ciwgbmV3Q3VyKTsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHJlY29yZExhc3RDaGFyYWN0ZXJTZWFyY2goaW5jcmVtZW50LCBhcmdzKSB7CiAgICAgICAgdmltR2xvYmFsU3RhdGUubGFzdENoYXJhcmFjdGVyU2VhcmNoLmluY3JlbWVudCA9IGluY3JlbWVudDsKICAgICAgICB2aW1HbG9iYWxTdGF0ZS5sYXN0Q2hhcmFyYWN0ZXJTZWFyY2guZm9yd2FyZCA9IGFyZ3MuZm9yd2FyZDsKICAgICAgICB2aW1HbG9iYWxTdGF0ZS5sYXN0Q2hhcmFyYWN0ZXJTZWFyY2guc2VsZWN0ZWRDaGFyYWN0ZXIgPSBhcmdzLnNlbGVjdGVkQ2hhcmFjdGVyOwogICAgfQoKICAgIHZhciBzeW1ib2xUb01vZGUgPSB7CiAgICAgICAgJygnOiAnYnJhY2tldCcsICcpJzogJ2JyYWNrZXQnLCAneyc6ICdicmFja2V0JywgJ30nOiAnYnJhY2tldCcsCiAgICAgICAgJ1snOiAnc2VjdGlvbicsICddJzogJ3NlY3Rpb24nLAogICAgICAgICcqJzogJ2NvbW1lbnQnLCAnLyc6ICdjb21tZW50JywKICAgICAgICAnbSc6ICdtZXRob2QnLCAnTSc6ICdtZXRob2QnLAogICAgICAgICcjJzogJ3ByZXByb2Nlc3MnCiAgICB9OwogICAgdmFyIGZpbmRTeW1ib2xNb2RlcyA9IHsKICAgICAgYnJhY2tldDogewogICAgICAgIGlzQ29tcGxldGU6IGZ1bmN0aW9uKHN0YXRlKSB7CiAgICAgICAgICBpZiAoc3RhdGUubmV4dENoID09PSBzdGF0ZS5zeW1iKSB7CiAgICAgICAgICAgIHN0YXRlLmRlcHRoKys7CiAgICAgICAgICAgIGlmIChzdGF0ZS5kZXB0aCA+PSAxKXJldHVybiB0cnVlOwogICAgICAgICAgfSBlbHNlIGlmIChzdGF0ZS5uZXh0Q2ggPT09IHN0YXRlLnJldmVyc2VTeW1iKSB7CiAgICAgICAgICAgIHN0YXRlLmRlcHRoLS07CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICB9LAogICAgICBzZWN0aW9uOiB7CiAgICAgICAgaW5pdDogZnVuY3Rpb24oc3RhdGUpIHsKICAgICAgICAgIHN0YXRlLmN1ck1vdmVUaHJvdWdoID0gdHJ1ZTsKICAgICAgICAgIHN0YXRlLnN5bWIgPSAoc3RhdGUuZm9yd2FyZCA/ICddJyA6ICdbJykgPT09IHN0YXRlLnN5bWIgPyAneycgOiAnfSc7CiAgICAgICAgfSwKICAgICAgICBpc0NvbXBsZXRlOiBmdW5jdGlvbihzdGF0ZSkgewogICAgICAgICAgcmV0dXJuIHN0YXRlLmluZGV4ID09PSAwICYmIHN0YXRlLm5leHRDaCA9PT0gc3RhdGUuc3ltYjsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGNvbW1lbnQ6IHsKICAgICAgICBpc0NvbXBsZXRlOiBmdW5jdGlvbihzdGF0ZSkgewogICAgICAgICAgdmFyIGZvdW5kID0gc3RhdGUubGFzdENoID09PSAnKicgJiYgc3RhdGUubmV4dENoID09PSAnLyc7CiAgICAgICAgICBzdGF0ZS5sYXN0Q2ggPSBzdGF0ZS5uZXh0Q2g7CiAgICAgICAgICByZXR1cm4gZm91bmQ7CiAgICAgICAgfQogICAgICB9LAogICAgICAvLyBUT0RPOiBUaGUgb3JpZ2luYWwgVmltIGltcGxlbWVudGF0aW9uIG9ubHkgb3BlcmF0ZXMgb24gbGV2ZWwgMSBhbmQgMi4KICAgICAgLy8gVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gZG9lc24ndCBjaGVjayBmb3IgY29kZSBibG9jayBsZXZlbCBhbmQKICAgICAgLy8gdGhlcmVmb3JlIGl0IG9wZXJhdGVzIG9uIGFueSBsZXZlbHMuCiAgICAgIG1ldGhvZDogewogICAgICAgIGluaXQ6IGZ1bmN0aW9uKHN0YXRlKSB7CiAgICAgICAgICBzdGF0ZS5zeW1iID0gKHN0YXRlLnN5bWIgPT09ICdtJyA/ICd7JyA6ICd9Jyk7CiAgICAgICAgICBzdGF0ZS5yZXZlcnNlU3ltYiA9IHN0YXRlLnN5bWIgPT09ICd7JyA/ICd9JyA6ICd7JzsKICAgICAgICB9LAogICAgICAgIGlzQ29tcGxldGU6IGZ1bmN0aW9uKHN0YXRlKSB7CiAgICAgICAgICBpZiAoc3RhdGUubmV4dENoID09PSBzdGF0ZS5zeW1iKXJldHVybiB0cnVlOwogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfSwKICAgICAgcHJlcHJvY2VzczogewogICAgICAgIGluaXQ6IGZ1bmN0aW9uKHN0YXRlKSB7CiAgICAgICAgICBzdGF0ZS5pbmRleCA9IDA7CiAgICAgICAgfSwKICAgICAgICBpc0NvbXBsZXRlOiBmdW5jdGlvbihzdGF0ZSkgewogICAgICAgICAgaWYgKHN0YXRlLm5leHRDaCA9PT0gJyMnKSB7CiAgICAgICAgICAgIHZhciB0b2tlbiA9IHN0YXRlLmxpbmVUZXh0Lm1hdGNoKC8jKFx3KykvKVsxXTsKICAgICAgICAgICAgaWYgKHRva2VuID09PSAnZW5kaWYnKSB7CiAgICAgICAgICAgICAgaWYgKHN0YXRlLmZvcndhcmQgJiYgc3RhdGUuZGVwdGggPT09IDApIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBzdGF0ZS5kZXB0aCsrOwogICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnaWYnKSB7CiAgICAgICAgICAgICAgaWYgKCFzdGF0ZS5mb3J3YXJkICYmIHN0YXRlLmRlcHRoID09PSAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgc3RhdGUuZGVwdGgtLTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodG9rZW4gPT09ICdlbHNlJyAmJiBzdGF0ZS5kZXB0aCA9PT0gMClyZXR1cm4gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgIH0KICAgIH07CiAgICBmdW5jdGlvbiBmaW5kU3ltYm9sKGNtLCByZXBlYXQsIGZvcndhcmQsIHN5bWIpIHsKICAgICAgdmFyIGN1ciA9IGNvcHlDdXJzb3IoY20uZ2V0Q3Vyc29yKCkpOwogICAgICB2YXIgaW5jcmVtZW50ID0gZm9yd2FyZCA/IDEgOiAtMTsKICAgICAgdmFyIGVuZExpbmUgPSBmb3J3YXJkID8gY20ubGluZUNvdW50KCkgOiAtMTsKICAgICAgdmFyIGN1ckNoID0gY3VyLmNoOwogICAgICB2YXIgbGluZSA9IGN1ci5saW5lOwogICAgICB2YXIgbGluZVRleHQgPSBjbS5nZXRMaW5lKGxpbmUpOwogICAgICB2YXIgc3RhdGUgPSB7CiAgICAgICAgbGluZVRleHQ6IGxpbmVUZXh0LAogICAgICAgIG5leHRDaDogbGluZVRleHQuY2hhckF0KGN1ckNoKSwKICAgICAgICBsYXN0Q2g6IG51bGwsCiAgICAgICAgaW5kZXg6IGN1ckNoLAogICAgICAgIHN5bWI6IHN5bWIsCiAgICAgICAgcmV2ZXJzZVN5bWI6IChmb3J3YXJkID8gIHsgJyknOiAnKCcsICd9JzogJ3snIH0gOiB7ICcoJzogJyknLCAneyc6ICd9JyB9KVtzeW1iXSwKICAgICAgICBmb3J3YXJkOiBmb3J3YXJkLAogICAgICAgIGRlcHRoOiAwLAogICAgICAgIGN1ck1vdmVUaHJvdWdoOiBmYWxzZQogICAgICB9OwogICAgICB2YXIgbW9kZSA9IHN5bWJvbFRvTW9kZVtzeW1iXTsKICAgICAgaWYgKCFtb2RlKXJldHVybiBjdXI7CiAgICAgIHZhciBpbml0ID0gZmluZFN5bWJvbE1vZGVzW21vZGVdLmluaXQ7CiAgICAgIHZhciBpc0NvbXBsZXRlID0gZmluZFN5bWJvbE1vZGVzW21vZGVdLmlzQ29tcGxldGU7CiAgICAgIGlmIChpbml0KSB7IGluaXQoc3RhdGUpOyB9CiAgICAgIHdoaWxlIChsaW5lICE9PSBlbmRMaW5lICYmIHJlcGVhdCkgewogICAgICAgIHN0YXRlLmluZGV4ICs9IGluY3JlbWVudDsKICAgICAgICBzdGF0ZS5uZXh0Q2ggPSBzdGF0ZS5saW5lVGV4dC5jaGFyQXQoc3RhdGUuaW5kZXgpOwogICAgICAgIGlmICghc3RhdGUubmV4dENoKSB7CiAgICAgICAgICBsaW5lICs9IGluY3JlbWVudDsKICAgICAgICAgIHN0YXRlLmxpbmVUZXh0ID0gY20uZ2V0TGluZShsaW5lKSB8fCAnJzsKICAgICAgICAgIGlmIChpbmNyZW1lbnQgPiAwKSB7CiAgICAgICAgICAgIHN0YXRlLmluZGV4ID0gMDsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHZhciBsaW5lTGVuID0gc3RhdGUubGluZVRleHQubGVuZ3RoOwogICAgICAgICAgICBzdGF0ZS5pbmRleCA9IChsaW5lTGVuID4gMCkgPyAobGluZUxlbi0xKSA6IDA7CiAgICAgICAgICB9CiAgICAgICAgICBzdGF0ZS5uZXh0Q2ggPSBzdGF0ZS5saW5lVGV4dC5jaGFyQXQoc3RhdGUuaW5kZXgpOwogICAgICAgIH0KICAgICAgICBpZiAoaXNDb21wbGV0ZShzdGF0ZSkpIHsKICAgICAgICAgIGN1ci5saW5lID0gbGluZTsKICAgICAgICAgIGN1ci5jaCA9IHN0YXRlLmluZGV4OwogICAgICAgICAgcmVwZWF0LS07CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChzdGF0ZS5uZXh0Q2ggfHwgc3RhdGUuY3VyTW92ZVRocm91Z2gpIHsKICAgICAgICByZXR1cm4gUG9zKGxpbmUsIHN0YXRlLmluZGV4KTsKICAgICAgfQogICAgICByZXR1cm4gY3VyOwogICAgfQoKICAgIC8qCiAgICAgKiBSZXR1cm5zIHRoZSBib3VuZGFyaWVzIG9mIHRoZSBuZXh0IHdvcmQuIElmIHRoZSBjdXJzb3IgaW4gdGhlIG1pZGRsZSBvZgogICAgICogdGhlIHdvcmQsIHRoZW4gcmV0dXJucyB0aGUgYm91bmRhcmllcyBvZiB0aGUgY3VycmVudCB3b3JkLCBzdGFydGluZyBhdAogICAgICogdGhlIGN1cnNvci4gSWYgdGhlIGN1cnNvciBpcyBhdCB0aGUgc3RhcnQvZW5kIG9mIGEgd29yZCwgYW5kIHdlIGFyZSBnb2luZwogICAgICogZm9yd2FyZC9iYWNrd2FyZCwgcmVzcGVjdGl2ZWx5LCBmaW5kIHRoZSBib3VuZGFyaWVzIG9mIHRoZSBuZXh0IHdvcmQuCiAgICAgKgogICAgICogQHBhcmFtIHtDb2RlTWlycm9yfSBjbSBDb2RlTWlycm9yIG9iamVjdC4KICAgICAqIEBwYXJhbSB7Q3Vyc29yfSBjdXIgVGhlIGN1cnNvciBwb3NpdGlvbi4KICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZm9yd2FyZCBUcnVlIHRvIHNlYXJjaCBmb3J3YXJkLiBGYWxzZSB0byBzZWFyY2gKICAgICAqICAgICBiYWNrd2FyZC4KICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gYmlnV29yZCBUcnVlIGlmIHB1bmN0dWF0aW9uIGNvdW50IGFzIHBhcnQgb2YgdGhlIHdvcmQuCiAgICAgKiAgICAgRmFsc2UgaWYgb25seSBbYS16QS1aMC05XSBjaGFyYWN0ZXJzIGNvdW50IGFzIHBhcnQgb2YgdGhlIHdvcmQuCiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGVtcHR5TGluZUlzV29yZCBUcnVlIGlmIGVtcHR5IGxpbmVzIHNob3VsZCBiZSB0cmVhdGVkCiAgICAgKiAgICAgYXMgd29yZHMuCiAgICAgKiBAcmV0dXJuIHtPYmplY3R7ZnJvbTpudW1iZXIsIHRvOm51bWJlciwgbGluZTogbnVtYmVyfX0gVGhlIGJvdW5kYXJpZXMgb2YKICAgICAqICAgICB0aGUgd29yZCwgb3IgbnVsbCBpZiB0aGVyZSBhcmUgbm8gbW9yZSB3b3Jkcy4KICAgICAqLwogICAgZnVuY3Rpb24gZmluZFdvcmQoY20sIGN1ciwgZm9yd2FyZCwgYmlnV29yZCwgZW1wdHlMaW5lSXNXb3JkKSB7CiAgICAgIHZhciBsaW5lTnVtID0gY3VyLmxpbmU7CiAgICAgIHZhciBwb3MgPSBjdXIuY2g7CiAgICAgIHZhciBsaW5lID0gY20uZ2V0TGluZShsaW5lTnVtKTsKICAgICAgdmFyIGRpciA9IGZvcndhcmQgPyAxIDogLTE7CiAgICAgIHZhciByZWdleHBzID0gYmlnV29yZCA/IGJpZ1dvcmRSZWdleHAgOiB3b3JkUmVnZXhwOwoKICAgICAgaWYgKGVtcHR5TGluZUlzV29yZCAmJiBsaW5lID09ICcnKSB7CiAgICAgICAgbGluZU51bSArPSBkaXI7CiAgICAgICAgbGluZSA9IGNtLmdldExpbmUobGluZU51bSk7CiAgICAgICAgaWYgKCFpc0xpbmUoY20sIGxpbmVOdW0pKSB7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgcG9zID0gKGZvcndhcmQpID8gMCA6IGxpbmUubGVuZ3RoOwogICAgICB9CgogICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgIGlmIChlbXB0eUxpbmVJc1dvcmQgJiYgbGluZSA9PSAnJykgewogICAgICAgICAgcmV0dXJuIHsgZnJvbTogMCwgdG86IDAsIGxpbmU6IGxpbmVOdW0gfTsKICAgICAgICB9CiAgICAgICAgdmFyIHN0b3AgPSAoZGlyID4gMCkgPyBsaW5lLmxlbmd0aCA6IC0xOwogICAgICAgIHZhciB3b3JkU3RhcnQgPSBzdG9wLCB3b3JkRW5kID0gc3RvcDsKICAgICAgICAvLyBGaW5kIGJvdW5kcyBvZiBuZXh0IHdvcmQuCiAgICAgICAgd2hpbGUgKHBvcyAhPSBzdG9wKSB7CiAgICAgICAgICB2YXIgZm91bmRXb3JkID0gZmFsc2U7CiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlZ2V4cHMubGVuZ3RoICYmICFmb3VuZFdvcmQ7ICsraSkgewogICAgICAgICAgICBpZiAocmVnZXhwc1tpXS50ZXN0KGxpbmUuY2hhckF0KHBvcykpKSB7CiAgICAgICAgICAgICAgd29yZFN0YXJ0ID0gcG9zOwogICAgICAgICAgICAgIC8vIEFkdmFuY2UgdG8gZW5kIG9mIHdvcmQuCiAgICAgICAgICAgICAgd2hpbGUgKHBvcyAhPSBzdG9wICYmIHJlZ2V4cHNbaV0udGVzdChsaW5lLmNoYXJBdChwb3MpKSkgewogICAgICAgICAgICAgICAgcG9zICs9IGRpcjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgd29yZEVuZCA9IHBvczsKICAgICAgICAgICAgICBmb3VuZFdvcmQgPSB3b3JkU3RhcnQgIT0gd29yZEVuZDsKICAgICAgICAgICAgICBpZiAod29yZFN0YXJ0ID09IGN1ci5jaCAmJiBsaW5lTnVtID09IGN1ci5saW5lICYmCiAgICAgICAgICAgICAgICAgIHdvcmRFbmQgPT0gd29yZFN0YXJ0ICsgZGlyKSB7CiAgICAgICAgICAgICAgICAvLyBXZSBzdGFydGVkIGF0IHRoZSBlbmQgb2YgYSB3b3JkLiBGaW5kIHRoZSBuZXh0IG9uZS4KICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICBmcm9tOiBNYXRoLm1pbih3b3JkU3RhcnQsIHdvcmRFbmQgKyAxKSwKICAgICAgICAgICAgICAgICAgdG86IE1hdGgubWF4KHdvcmRTdGFydCwgd29yZEVuZCksCiAgICAgICAgICAgICAgICAgIGxpbmU6IGxpbmVOdW0gfTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmICghZm91bmRXb3JkKSB7CiAgICAgICAgICAgIHBvcyArPSBkaXI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIEFkdmFuY2UgdG8gbmV4dC9wcmV2IGxpbmUuCiAgICAgICAgbGluZU51bSArPSBkaXI7CiAgICAgICAgaWYgKCFpc0xpbmUoY20sIGxpbmVOdW0pKSB7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgbGluZSA9IGNtLmdldExpbmUobGluZU51bSk7CiAgICAgICAgcG9zID0gKGRpciA+IDApID8gMCA6IGxpbmUubGVuZ3RoOwogICAgICB9CiAgICAgIC8vIFNob3VsZCBuZXZlciBnZXQgaGVyZS4KICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgaW1wb3NzaWJsZSBoYXBwZW5lZC4nKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSB7Q29kZU1pcnJvcn0gY20gQ29kZU1pcnJvciBvYmplY3QuCiAgICAgKiBAcGFyYW0ge2ludH0gcmVwZWF0IE51bWJlciBvZiB3b3JkcyB0byBtb3ZlIHBhc3QuCiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGZvcndhcmQgVHJ1ZSB0byBzZWFyY2ggZm9yd2FyZC4gRmFsc2UgdG8gc2VhcmNoCiAgICAgKiAgICAgYmFja3dhcmQuCiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHdvcmRFbmQgVHJ1ZSB0byBtb3ZlIHRvIGVuZCBvZiB3b3JkLiBGYWxzZSB0byBtb3ZlIHRvCiAgICAgKiAgICAgYmVnaW5uaW5nIG9mIHdvcmQuCiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGJpZ1dvcmQgVHJ1ZSBpZiBwdW5jdHVhdGlvbiBjb3VudCBhcyBwYXJ0IG9mIHRoZSB3b3JkLgogICAgICogICAgIEZhbHNlIGlmIG9ubHkgYWxwaGFiZXQgY2hhcmFjdGVycyBjb3VudCBhcyBwYXJ0IG9mIHRoZSB3b3JkLgogICAgICogQHJldHVybiB7Q3Vyc29yfSBUaGUgcG9zaXRpb24gdGhlIGN1cnNvciBzaG91bGQgbW92ZSB0by4KICAgICAqLwogICAgZnVuY3Rpb24gbW92ZVRvV29yZChjbSwgcmVwZWF0LCBmb3J3YXJkLCB3b3JkRW5kLCBiaWdXb3JkKSB7CiAgICAgIHZhciBjdXIgPSBjbS5nZXRDdXJzb3IoKTsKICAgICAgdmFyIGN1clN0YXJ0ID0gY29weUN1cnNvcihjdXIpOwogICAgICB2YXIgd29yZHMgPSBbXTsKICAgICAgaWYgKGZvcndhcmQgJiYgIXdvcmRFbmQgfHwgIWZvcndhcmQgJiYgd29yZEVuZCkgewogICAgICAgIHJlcGVhdCsrOwogICAgICB9CiAgICAgIC8vIEZvciAnZScsIGVtcHR5IGxpbmVzIGFyZSBub3QgY29uc2lkZXJlZCB3b3JkcywgZ28gZmlndXJlLgogICAgICB2YXIgZW1wdHlMaW5lSXNXb3JkID0gIShmb3J3YXJkICYmIHdvcmRFbmQpOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlcGVhdDsgaSsrKSB7CiAgICAgICAgdmFyIHdvcmQgPSBmaW5kV29yZChjbSwgY3VyLCBmb3J3YXJkLCBiaWdXb3JkLCBlbXB0eUxpbmVJc1dvcmQpOwogICAgICAgIGlmICghd29yZCkgewogICAgICAgICAgdmFyIGVvZENoID0gbGluZUxlbmd0aChjbSwgY20ubGFzdExpbmUoKSk7CiAgICAgICAgICB3b3Jkcy5wdXNoKGZvcndhcmQKICAgICAgICAgICAgICA/IHtsaW5lOiBjbS5sYXN0TGluZSgpLCBmcm9tOiBlb2RDaCwgdG86IGVvZENofQogICAgICAgICAgICAgIDoge2xpbmU6IDAsIGZyb206IDAsIHRvOiAwfSk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgd29yZHMucHVzaCh3b3JkKTsKICAgICAgICBjdXIgPSBQb3Mod29yZC5saW5lLCBmb3J3YXJkID8gKHdvcmQudG8gLSAxKSA6IHdvcmQuZnJvbSk7CiAgICAgIH0KICAgICAgdmFyIHNob3J0Q2lyY3VpdCA9IHdvcmRzLmxlbmd0aCAhPSByZXBlYXQ7CiAgICAgIHZhciBmaXJzdFdvcmQgPSB3b3Jkc1swXTsKICAgICAgdmFyIGxhc3RXb3JkID0gd29yZHMucG9wKCk7CiAgICAgIGlmIChmb3J3YXJkICYmICF3b3JkRW5kKSB7CiAgICAgICAgLy8gdwogICAgICAgIGlmICghc2hvcnRDaXJjdWl0ICYmIChmaXJzdFdvcmQuZnJvbSAhPSBjdXJTdGFydC5jaCB8fCBmaXJzdFdvcmQubGluZSAhPSBjdXJTdGFydC5saW5lKSkgewogICAgICAgICAgLy8gV2UgZGlkIG5vdCBzdGFydCBpbiB0aGUgbWlkZGxlIG9mIGEgd29yZC4gRGlzY2FyZCB0aGUgZXh0cmEgd29yZCBhdCB0aGUgZW5kLgogICAgICAgICAgbGFzdFdvcmQgPSB3b3Jkcy5wb3AoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIFBvcyhsYXN0V29yZC5saW5lLCBsYXN0V29yZC5mcm9tKTsKICAgICAgfSBlbHNlIGlmIChmb3J3YXJkICYmIHdvcmRFbmQpIHsKICAgICAgICByZXR1cm4gUG9zKGxhc3RXb3JkLmxpbmUsIGxhc3RXb3JkLnRvIC0gMSk7CiAgICAgIH0gZWxzZSBpZiAoIWZvcndhcmQgJiYgd29yZEVuZCkgewogICAgICAgIC8vIGdlCiAgICAgICAgaWYgKCFzaG9ydENpcmN1aXQgJiYgKGZpcnN0V29yZC50byAhPSBjdXJTdGFydC5jaCB8fCBmaXJzdFdvcmQubGluZSAhPSBjdXJTdGFydC5saW5lKSkgewogICAgICAgICAgLy8gV2UgZGlkIG5vdCBzdGFydCBpbiB0aGUgbWlkZGxlIG9mIGEgd29yZC4gRGlzY2FyZCB0aGUgZXh0cmEgd29yZCBhdCB0aGUgZW5kLgogICAgICAgICAgbGFzdFdvcmQgPSB3b3Jkcy5wb3AoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIFBvcyhsYXN0V29yZC5saW5lLCBsYXN0V29yZC50byk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gYgogICAgICAgIHJldHVybiBQb3MobGFzdFdvcmQubGluZSwgbGFzdFdvcmQuZnJvbSk7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBtb3ZlVG9DaGFyYWN0ZXIoY20sIHJlcGVhdCwgZm9yd2FyZCwgY2hhcmFjdGVyKSB7CiAgICAgIHZhciBjdXIgPSBjbS5nZXRDdXJzb3IoKTsKICAgICAgdmFyIHN0YXJ0ID0gY3VyLmNoOwogICAgICB2YXIgaWR4OwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlcGVhdDsgaSArKykgewogICAgICAgIHZhciBsaW5lID0gY20uZ2V0TGluZShjdXIubGluZSk7CiAgICAgICAgaWR4ID0gY2hhcklkeEluTGluZShzdGFydCwgbGluZSwgY2hhcmFjdGVyLCBmb3J3YXJkLCB0cnVlKTsKICAgICAgICBpZiAoaWR4ID09IC0xKSB7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgc3RhcnQgPSBpZHg7CiAgICAgIH0KICAgICAgcmV0dXJuIFBvcyhjbS5nZXRDdXJzb3IoKS5saW5lLCBpZHgpOwogICAgfQoKICAgIGZ1bmN0aW9uIG1vdmVUb0NvbHVtbihjbSwgcmVwZWF0KSB7CiAgICAgIC8vIHJlcGVhdCBpcyBhbHdheXMgPj0gMSwgc28gcmVwZWF0IC0gMSBhbHdheXMgY29ycmVzcG9uZHMKICAgICAgLy8gdG8gdGhlIGNvbHVtbiB3ZSB3YW50IHRvIGdvIHRvLgogICAgICB2YXIgbGluZSA9IGNtLmdldEN1cnNvcigpLmxpbmU7CiAgICAgIHJldHVybiBjbGlwQ3Vyc29yVG9Db250ZW50KGNtLCBQb3MobGluZSwgcmVwZWF0IC0gMSkpOwogICAgfQoKICAgIGZ1bmN0aW9uIHVwZGF0ZU1hcmsoY20sIHZpbSwgbWFya05hbWUsIHBvcykgewogICAgICBpZiAoIWluQXJyYXkobWFya05hbWUsIHZhbGlkTWFya3MpKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmICh2aW0ubWFya3NbbWFya05hbWVdKSB7CiAgICAgICAgdmltLm1hcmtzW21hcmtOYW1lXS5jbGVhcigpOwogICAgICB9CiAgICAgIHZpbS5tYXJrc1ttYXJrTmFtZV0gPSBjbS5zZXRCb29rbWFyayhwb3MpOwogICAgfQoKICAgIGZ1bmN0aW9uIGNoYXJJZHhJbkxpbmUoc3RhcnQsIGxpbmUsIGNoYXJhY3RlciwgZm9yd2FyZCwgaW5jbHVkZUNoYXIpIHsKICAgICAgLy8gU2VhcmNoIGZvciBjaGFyIGluIGxpbmUuCiAgICAgIC8vIG1vdGlvbl9vcHRpb25zOiB7Zm9yd2FyZCwgaW5jbHVkZUNoYXJ9CiAgICAgIC8vIElmIGluY2x1ZGVDaGFyID0gdHJ1ZSwgaW5jbHVkZSBpdCB0b28uCiAgICAgIC8vIElmIGZvcndhcmQgPSB0cnVlLCBzZWFyY2ggZm9yd2FyZCwgZWxzZSBzZWFyY2ggYmFja3dhcmRzLgogICAgICAvLyBJZiBjaGFyIGlzIG5vdCBmb3VuZCBvbiB0aGlzIGxpbmUsIGRvIG5vdGhpbmcKICAgICAgdmFyIGlkeDsKICAgICAgaWYgKGZvcndhcmQpIHsKICAgICAgICBpZHggPSBsaW5lLmluZGV4T2YoY2hhcmFjdGVyLCBzdGFydCArIDEpOwogICAgICAgIGlmIChpZHggIT0gLTEgJiYgIWluY2x1ZGVDaGFyKSB7CiAgICAgICAgICBpZHggLT0gMTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWR4ID0gbGluZS5sYXN0SW5kZXhPZihjaGFyYWN0ZXIsIHN0YXJ0IC0gMSk7CiAgICAgICAgaWYgKGlkeCAhPSAtMSAmJiAhaW5jbHVkZUNoYXIpIHsKICAgICAgICAgIGlkeCArPSAxOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gaWR4OwogICAgfQoKICAgIC8vIFRPRE86IHBlcmhhcHMgdGhpcyBmaW5hZ2xpbmcgb2Ygc3RhcnQgYW5kIGVuZCBwb3NpdGlvbnMgYmVsb25kcwogICAgLy8gaW4gY29kbWlycm9yL3JlcGxhY2VSYW5nZT8KICAgIGZ1bmN0aW9uIHNlbGVjdENvbXBhbmlvbk9iamVjdChjbSwgc3ltYiwgaW5jbHVzaXZlKSB7CiAgICAgIHZhciBjdXIgPSBjbS5nZXRDdXJzb3IoKSwgc3RhcnQsIGVuZDsKCiAgICAgIHZhciBicmFja2V0UmVnZXhwID0gKHsKICAgICAgICAnKCc6IC9bKCldLywgJyknOiAvWygpXS8sCiAgICAgICAgJ1snOiAvW1tcXV0vLCAnXSc6IC9bW1xdXS8sCiAgICAgICAgJ3snOiAvW3t9XS8sICd9JzogL1t7fV0vfSlbc3ltYl07CiAgICAgIHZhciBvcGVuU3ltID0gKHsKICAgICAgICAnKCc6ICcoJywgJyknOiAnKCcsCiAgICAgICAgJ1snOiAnWycsICddJzogJ1snLAogICAgICAgICd7JzogJ3snLCAnfSc6ICd7J30pW3N5bWJdOwogICAgICB2YXIgY3VyQ2hhciA9IGNtLmdldExpbmUoY3VyLmxpbmUpLmNoYXJBdChjdXIuY2gpOwogICAgICAvLyBEdWUgdG8gdGhlIGJlaGF2aW9yIG9mIHNjYW5Gb3JCcmFja2V0LCB3ZSBuZWVkIHRvIGFkZCBhbiBvZmZzZXQgaWYgdGhlCiAgICAgIC8vIGN1cnNvciBpcyBvbiBhIG1hdGNoaW5nIG9wZW4gYnJhY2tldC4KICAgICAgdmFyIG9mZnNldCA9IGN1ckNoYXIgPT09IG9wZW5TeW0gPyAxIDogMDsKCiAgICAgIHN0YXJ0ID0gY20uc2NhbkZvckJyYWNrZXQoUG9zKGN1ci5saW5lLCBjdXIuY2ggKyBvZmZzZXQpLCAtMSwgbnVsbCwgeydicmFja2V0UmVnZXgnOiBicmFja2V0UmVnZXhwfSk7CiAgICAgIGVuZCA9IGNtLnNjYW5Gb3JCcmFja2V0KFBvcyhjdXIubGluZSwgY3VyLmNoICsgb2Zmc2V0KSwgMSwgbnVsbCwgeydicmFja2V0UmVnZXgnOiBicmFja2V0UmVnZXhwfSk7CgogICAgICBpZiAoIXN0YXJ0IHx8ICFlbmQpIHsKICAgICAgICByZXR1cm4geyBzdGFydDogY3VyLCBlbmQ6IGN1ciB9OwogICAgICB9CgogICAgICBzdGFydCA9IHN0YXJ0LnBvczsKICAgICAgZW5kID0gZW5kLnBvczsKCiAgICAgIGlmICgoc3RhcnQubGluZSA9PSBlbmQubGluZSAmJiBzdGFydC5jaCA+IGVuZC5jaCkKICAgICAgICAgIHx8IChzdGFydC5saW5lID4gZW5kLmxpbmUpKSB7CiAgICAgICAgdmFyIHRtcCA9IHN0YXJ0OwogICAgICAgIHN0YXJ0ID0gZW5kOwogICAgICAgIGVuZCA9IHRtcDsKICAgICAgfQoKICAgICAgaWYgKGluY2x1c2l2ZSkgewogICAgICAgIGVuZC5jaCArPSAxOwogICAgICB9IGVsc2UgewogICAgICAgIHN0YXJ0LmNoICs9IDE7CiAgICAgIH0KCiAgICAgIHJldHVybiB7IHN0YXJ0OiBzdGFydCwgZW5kOiBlbmQgfTsKICAgIH0KCiAgICAvLyBUYWtlcyBpbiBhIHN5bWJvbCBhbmQgYSBjdXJzb3IgYW5kIHRyaWVzIHRvIHNpbXVsYXRlIHRleHQgb2JqZWN0cyB0aGF0CiAgICAvLyBoYXZlIGlkZW50aWNhbCBvcGVuaW5nIGFuZCBjbG9zaW5nIHN5bWJvbHMKICAgIC8vIFRPRE8gc3VwcG9ydCBhY3Jvc3MgbXVsdGlwbGUgbGluZXMKICAgIGZ1bmN0aW9uIGZpbmRCZWdpbm5pbmdBbmRFbmQoY20sIHN5bWIsIGluY2x1c2l2ZSkgewogICAgICB2YXIgY3VyID0gY29weUN1cnNvcihjbS5nZXRDdXJzb3IoKSk7CiAgICAgIHZhciBsaW5lID0gY20uZ2V0TGluZShjdXIubGluZSk7CiAgICAgIHZhciBjaGFycyA9IGxpbmUuc3BsaXQoJycpOwogICAgICB2YXIgc3RhcnQsIGVuZCwgaSwgbGVuOwogICAgICB2YXIgZmlyc3RJbmRleCA9IGNoYXJzLmluZGV4T2Yoc3ltYik7CgogICAgICAvLyB0aGUgZGVjaXNpb24gdHJlZSBpcyB0byBhbHdheXMgbG9vayBiYWNrd2FyZHMgZm9yIHRoZSBiZWdpbm5pbmcgZmlyc3QsCiAgICAgIC8vIGJ1dCBpZiB0aGUgY3Vyc29yIGlzIGluIGZyb250IG9mIHRoZSBmaXJzdCBpbnN0YW5jZSBvZiB0aGUgc3ltYiwKICAgICAgLy8gdGhlbiBtb3ZlIHRoZSBjdXJzb3IgZm9yd2FyZAogICAgICBpZiAoY3VyLmNoIDwgZmlyc3RJbmRleCkgewogICAgICAgIGN1ci5jaCA9IGZpcnN0SW5kZXg7CiAgICAgICAgLy8gV2h5IGlzIHRoaXMgbGluZSBldmVuIGhlcmU/Pz8KICAgICAgICAvLyBjbS5zZXRDdXJzb3IoY3VyLmxpbmUsIGZpcnN0SW5kZXgrMSk7CiAgICAgIH0KICAgICAgLy8gb3RoZXJ3aXNlIGlmIHRoZSBjdXJzb3IgaXMgY3VycmVudGx5IG9uIHRoZSBjbG9zaW5nIHN5bWJvbAogICAgICBlbHNlIGlmIChmaXJzdEluZGV4IDwgY3VyLmNoICYmIGNoYXJzW2N1ci5jaF0gPT0gc3ltYikgewogICAgICAgIGVuZCA9IGN1ci5jaDsgLy8gYXNzaWduIGVuZCB0byB0aGUgY3VycmVudCBjdXJzb3IKICAgICAgICAtLWN1ci5jaDsgLy8gbWFrZSBzdXJlIHRvIGxvb2sgYmFja3dhcmRzCiAgICAgIH0KCiAgICAgIC8vIGlmIHdlJ3JlIGN1cnJlbnRseSBvbiB0aGUgc3ltYm9sLCB3ZSd2ZSBnb3QgYSBzdGFydAogICAgICBpZiAoY2hhcnNbY3VyLmNoXSA9PSBzeW1iICYmICFlbmQpIHsKICAgICAgICBzdGFydCA9IGN1ci5jaCArIDE7IC8vIGFzc2lnbiBzdGFydCB0byBhaGVhZCBvZiB0aGUgY3Vyc29yCiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gZ28gYmFja3dhcmRzIHRvIGZpbmQgdGhlIHN0YXJ0CiAgICAgICAgZm9yIChpID0gY3VyLmNoOyBpID4gLTEgJiYgIXN0YXJ0OyBpLS0pIHsKICAgICAgICAgIGlmIChjaGFyc1tpXSA9PSBzeW1iKSB7CiAgICAgICAgICAgIHN0YXJ0ID0gaSArIDE7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyBsb29rIGZvcndhcmRzIGZvciB0aGUgZW5kIHN5bWJvbAogICAgICBpZiAoc3RhcnQgJiYgIWVuZCkgewogICAgICAgIGZvciAoaSA9IHN0YXJ0LCBsZW4gPSBjaGFycy5sZW5ndGg7IGkgPCBsZW4gJiYgIWVuZDsgaSsrKSB7CiAgICAgICAgICBpZiAoY2hhcnNbaV0gPT0gc3ltYikgewogICAgICAgICAgICBlbmQgPSBpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gbm90aGluZyBmb3VuZAogICAgICBpZiAoIXN0YXJ0IHx8ICFlbmQpIHsKICAgICAgICByZXR1cm4geyBzdGFydDogY3VyLCBlbmQ6IGN1ciB9OwogICAgICB9CgogICAgICAvLyBpbmNsdWRlIHRoZSBzeW1ib2xzCiAgICAgIGlmIChpbmNsdXNpdmUpIHsKICAgICAgICAtLXN0YXJ0OyArK2VuZDsKICAgICAgfQoKICAgICAgcmV0dXJuIHsKICAgICAgICBzdGFydDogUG9zKGN1ci5saW5lLCBzdGFydCksCiAgICAgICAgZW5kOiBQb3MoY3VyLmxpbmUsIGVuZCkKICAgICAgfTsKICAgIH0KCiAgICAvLyBTZWFyY2ggZnVuY3Rpb25zCiAgICBkZWZpbmVPcHRpb24oJ3BjcmUnLCB0cnVlLCAnYm9vbGVhbicpOwogICAgZnVuY3Rpb24gU2VhcmNoU3RhdGUoKSB7fQogICAgU2VhcmNoU3RhdGUucHJvdG90eXBlID0gewogICAgICBnZXRRdWVyeTogZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHZpbUdsb2JhbFN0YXRlLnF1ZXJ5OwogICAgICB9LAogICAgICBzZXRRdWVyeTogZnVuY3Rpb24ocXVlcnkpIHsKICAgICAgICB2aW1HbG9iYWxTdGF0ZS5xdWVyeSA9IHF1ZXJ5OwogICAgICB9LAogICAgICBnZXRPdmVybGF5OiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5zZWFyY2hPdmVybGF5OwogICAgICB9LAogICAgICBzZXRPdmVybGF5OiBmdW5jdGlvbihvdmVybGF5KSB7CiAgICAgICAgdGhpcy5zZWFyY2hPdmVybGF5ID0gb3ZlcmxheTsKICAgICAgfSwKICAgICAgaXNSZXZlcnNlZDogZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHZpbUdsb2JhbFN0YXRlLmlzUmV2ZXJzZWQ7CiAgICAgIH0sCiAgICAgIHNldFJldmVyc2VkOiBmdW5jdGlvbihyZXZlcnNlZCkgewogICAgICAgIHZpbUdsb2JhbFN0YXRlLmlzUmV2ZXJzZWQgPSByZXZlcnNlZDsKICAgICAgfQogICAgfTsKICAgIGZ1bmN0aW9uIGdldFNlYXJjaFN0YXRlKGNtKSB7CiAgICAgIHZhciB2aW0gPSBjbS5zdGF0ZS52aW07CiAgICAgIHJldHVybiB2aW0uc2VhcmNoU3RhdGVfIHx8ICh2aW0uc2VhcmNoU3RhdGVfID0gbmV3IFNlYXJjaFN0YXRlKCkpOwogICAgfQogICAgZnVuY3Rpb24gZGlhbG9nKGNtLCB0ZW1wbGF0ZSwgc2hvcnRUZXh0LCBvbkNsb3NlLCBvcHRpb25zKSB7CiAgICAgIGlmIChjbS5vcGVuRGlhbG9nKSB7CiAgICAgICAgY20ub3BlbkRpYWxvZyh0ZW1wbGF0ZSwgb25DbG9zZSwgeyBib3R0b206IHRydWUsIHZhbHVlOiBvcHRpb25zLnZhbHVlLAogICAgICAgICAgICBvbktleURvd246IG9wdGlvbnMub25LZXlEb3duLCBvbktleVVwOiBvcHRpb25zLm9uS2V5VXAgfSk7CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgb25DbG9zZShwcm9tcHQoc2hvcnRUZXh0LCAnJykpOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBzcGxpdEJ5U2xhc2goYXJnU3RyaW5nKSB7CiAgICAgIHZhciBzbGFzaGVzID0gZmluZFVuZXNjYXBlZFNsYXNoZXMoYXJnU3RyaW5nKSB8fCBbXTsKICAgICAgaWYgKCFzbGFzaGVzLmxlbmd0aCkgcmV0dXJuIFtdOwogICAgICB2YXIgdG9rZW5zID0gW107CiAgICAgIC8vIGluIGNhc2Ugb2Ygc3RyaW5ncyBsaWtlIGZvby9iYXIKICAgICAgaWYgKHNsYXNoZXNbMF0gIT09IDApIHJldHVybjsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzbGFzaGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgaWYgKHR5cGVvZiBzbGFzaGVzW2ldID09ICdudW1iZXInKQogICAgICAgICAgdG9rZW5zLnB1c2goYXJnU3RyaW5nLnN1YnN0cmluZyhzbGFzaGVzW2ldICsgMSwgc2xhc2hlc1tpKzFdKSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHRva2VuczsKICAgIH0KCiAgICBmdW5jdGlvbiBmaW5kVW5lc2NhcGVkU2xhc2hlcyhzdHIpIHsKICAgICAgdmFyIGVzY2FwZU5leHRDaGFyID0gZmFsc2U7CiAgICAgIHZhciBzbGFzaGVzID0gW107CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIGMgPSBzdHIuY2hhckF0KGkpOwogICAgICAgIGlmICghZXNjYXBlTmV4dENoYXIgJiYgYyA9PSAnLycpIHsKICAgICAgICAgIHNsYXNoZXMucHVzaChpKTsKICAgICAgICB9CiAgICAgICAgZXNjYXBlTmV4dENoYXIgPSAhZXNjYXBlTmV4dENoYXIgJiYgKGMgPT0gJ1xcJyk7CiAgICAgIH0KICAgICAgcmV0dXJuIHNsYXNoZXM7CiAgICB9CgogICAgLy8gVHJhbnNsYXRlcyBhIHNlYXJjaCBzdHJpbmcgZnJvbSBleCAodmltKSBzeW50YXggaW50byBqYXZhc2NyaXB0IGZvcm0uCiAgICBmdW5jdGlvbiB0cmFuc2xhdGVSZWdleChzdHIpIHsKICAgICAgLy8gV2hlbiB0aGVzZSBtYXRjaCwgYWRkIGEgJ1wnIGlmIHVuZXNjYXBlZCBvciByZW1vdmUgb25lIGlmIGVzY2FwZWQuCiAgICAgIHZhciBzcGVjaWFscyA9ICd8KCl7JzsKICAgICAgLy8gUmVtb3ZlLCBidXQgbmV2ZXIgYWRkLCBhICdcJyBmb3IgdGhlc2UuCiAgICAgIHZhciB1bmVzY2FwZSA9ICd9JzsKICAgICAgdmFyIGVzY2FwZU5leHRDaGFyID0gZmFsc2U7CiAgICAgIHZhciBvdXQgPSBbXTsKICAgICAgZm9yICh2YXIgaSA9IC0xOyBpIDwgc3RyLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIGMgPSBzdHIuY2hhckF0KGkpIHx8ICcnOwogICAgICAgIHZhciBuID0gc3RyLmNoYXJBdChpKzEpIHx8ICcnOwogICAgICAgIHZhciBzcGVjaWFsQ29tZXNOZXh0ID0gKG4gJiYgc3BlY2lhbHMuaW5kZXhPZihuKSAhPSAtMSk7CiAgICAgICAgaWYgKGVzY2FwZU5leHRDaGFyKSB7CiAgICAgICAgICBpZiAoYyAhPT0gJ1xcJyB8fCAhc3BlY2lhbENvbWVzTmV4dCkgewogICAgICAgICAgICBvdXQucHVzaChjKTsKICAgICAgICAgIH0KICAgICAgICAgIGVzY2FwZU5leHRDaGFyID0gZmFsc2U7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmIChjID09PSAnXFwnKSB7CiAgICAgICAgICAgIGVzY2FwZU5leHRDaGFyID0gdHJ1ZTsKICAgICAgICAgICAgLy8gVHJlYXQgdGhlIHVuZXNjYXBlIGxpc3QgYXMgc3BlY2lhbCBmb3IgcmVtb3ZpbmcsIGJ1dCBub3QgYWRkaW5nICdcJy4KICAgICAgICAgICAgaWYgKG4gJiYgdW5lc2NhcGUuaW5kZXhPZihuKSAhPSAtMSkgewogICAgICAgICAgICAgIHNwZWNpYWxDb21lc05leHQgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIE5vdCBwYXNzaW5nIHRoaXMgdGVzdCBtZWFucyByZW1vdmluZyBhICdcJy4KICAgICAgICAgICAgaWYgKCFzcGVjaWFsQ29tZXNOZXh0IHx8IG4gPT09ICdcXCcpIHsKICAgICAgICAgICAgICBvdXQucHVzaChjKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgb3V0LnB1c2goYyk7CiAgICAgICAgICAgIGlmIChzcGVjaWFsQ29tZXNOZXh0ICYmIG4gIT09ICdcXCcpIHsKICAgICAgICAgICAgICBvdXQucHVzaCgnXFwnKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gb3V0LmpvaW4oJycpOwogICAgfQoKICAgIC8vIFRyYW5zbGF0ZXMgdGhlIHJlcGxhY2UgcGFydCBvZiBhIHNlYXJjaCBhbmQgcmVwbGFjZSBmcm9tIGV4ICh2aW0pIHN5bnRheCBpbnRvCiAgICAvLyBqYXZhc2NyaXB0IGZvcm0uICBTaW1pbGFyIHRvIHRyYW5zbGF0ZVJlZ2V4LCBidXQgYWRkaXRpb25hbGx5IGZpeGVzIGJhY2sgcmVmZXJlbmNlcwogICAgLy8gKHRyYW5zbGF0ZXMgJ1xbMC4uOV0nIHRvICckWzAuLjldJykgYW5kIGZvbGxvd3MgZGlmZmVyZW50IHJ1bGVzIGZvciBlc2NhcGluZyAnJCcuCiAgICBmdW5jdGlvbiB0cmFuc2xhdGVSZWdleFJlcGxhY2Uoc3RyKSB7CiAgICAgIHZhciBlc2NhcGVOZXh0Q2hhciA9IGZhbHNlOwogICAgICB2YXIgb3V0ID0gW107CiAgICAgIGZvciAodmFyIGkgPSAtMTsgaSA8IHN0ci5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciBjID0gc3RyLmNoYXJBdChpKSB8fCAnJzsKICAgICAgICB2YXIgbiA9IHN0ci5jaGFyQXQoaSsxKSB8fCAnJzsKICAgICAgICBpZiAoZXNjYXBlTmV4dENoYXIpIHsKICAgICAgICAgIC8vIEF0IGFueSBwb2ludCBpbiB0aGUgbG9vcCwgZXNjYXBlTmV4dENoYXIgaXMgdHJ1ZSBpZiB0aGUgcHJldmlvdXMKICAgICAgICAgIC8vIGNoYXJhY3RlciB3YXMgYSAnXCcgYW5kIHdhcyBub3QgZXNjYXBlZC4KICAgICAgICAgIG91dC5wdXNoKGMpOwogICAgICAgICAgZXNjYXBlTmV4dENoYXIgPSBmYWxzZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKGMgPT09ICdcXCcpIHsKICAgICAgICAgICAgZXNjYXBlTmV4dENoYXIgPSB0cnVlOwogICAgICAgICAgICBpZiAoKGlzTnVtYmVyKG4pIHx8IG4gPT09ICckJykpIHsKICAgICAgICAgICAgICBvdXQucHVzaCgnJCcpOwogICAgICAgICAgICB9IGVsc2UgaWYgKG4gIT09ICcvJyAmJiBuICE9PSAnXFwnKSB7CiAgICAgICAgICAgICAgb3V0LnB1c2goJ1xcJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIChjID09PSAnJCcpIHsKICAgICAgICAgICAgICBvdXQucHVzaCgnJCcpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG91dC5wdXNoKGMpOwogICAgICAgICAgICBpZiAobiA9PT0gJy8nKSB7CiAgICAgICAgICAgICAgb3V0LnB1c2goJ1xcJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIG91dC5qb2luKCcnKTsKICAgIH0KCiAgICAvLyBVbmVzY2FwZSBcIGFuZCAvIGluIHRoZSByZXBsYWNlIHBhcnQsIGZvciBQQ1JFIG1vZGUuCiAgICBmdW5jdGlvbiB1bmVzY2FwZVJlZ2V4UmVwbGFjZShzdHIpIHsKICAgICAgdmFyIHN0cmVhbSA9IG5ldyBDb2RlTWlycm9yLlN0cmluZ1N0cmVhbShzdHIpOwogICAgICB2YXIgb3V0cHV0ID0gW107CiAgICAgIHdoaWxlICghc3RyZWFtLmVvbCgpKSB7CiAgICAgICAgLy8gU2VhcmNoIGZvciBcLgogICAgICAgIHdoaWxlIChzdHJlYW0ucGVlaygpICYmIHN0cmVhbS5wZWVrKCkgIT0gJ1xcJykgewogICAgICAgICAgb3V0cHV0LnB1c2goc3RyZWFtLm5leHQoKSk7CiAgICAgICAgfQogICAgICAgIGlmIChzdHJlYW0ubWF0Y2goJ1xcLycsIHRydWUpKSB7CiAgICAgICAgICAvLyBcLyA9PiAvCiAgICAgICAgICBvdXRwdXQucHVzaCgnLycpOwogICAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLm1hdGNoKCdcXFxcJywgdHJ1ZSkpIHsKICAgICAgICAgIC8vIFxcID0+IFwKICAgICAgICAgIG91dHB1dC5wdXNoKCdcXCcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvLyBEb24ndCBjaGFuZ2UgYW55dGhpbmcKICAgICAgICAgIG91dHB1dC5wdXNoKHN0cmVhbS5uZXh0KCkpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gb3V0cHV0LmpvaW4oJycpOwogICAgfQoKICAgIC8qKgogICAgICogRXh0cmFjdCB0aGUgcmVndWxhciBleHByZXNzaW9uIGZyb20gdGhlIHF1ZXJ5IGFuZCByZXR1cm4gYSBSZWdleHAgb2JqZWN0LgogICAgICogUmV0dXJucyBudWxsIGlmIHRoZSBxdWVyeSBpcyBibGFuay4KICAgICAqIElmIGlnbm9yZUNhc2UgaXMgcGFzc2VkIGluLCB0aGUgUmVnZXhwIG9iamVjdCB3aWxsIGhhdmUgdGhlICdpJyBmbGFnIHNldC4KICAgICAqIElmIHNtYXJ0Q2FzZSBpcyBwYXNzZWQgaW4sIGFuZCB0aGUgcXVlcnkgY29udGFpbnMgdXBwZXIgY2FzZSBsZXR0ZXJzLAogICAgICogICB0aGVuIGlnbm9yZUNhc2UgaXMgb3ZlcnJpZGRlbiwgYW5kIHRoZSAnaScgZmxhZyB3aWxsIG5vdCBiZSBzZXQuCiAgICAgKiBJZiB0aGUgcXVlcnkgY29udGFpbnMgdGhlIC9pIGluIHRoZSBmbGFnIHBhcnQgb2YgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiwKICAgICAqICAgdGhlbiBib3RoIGlnbm9yZUNhc2UgYW5kIHNtYXJ0Q2FzZSBhcmUgaWdub3JlZCwgYW5kICdpJyB3aWxsIGJlIHBhc3NlZAogICAgICogICB0aHJvdWdoIHRvIHRoZSBSZWdleCBvYmplY3QuCiAgICAgKi8KICAgIGZ1bmN0aW9uIHBhcnNlUXVlcnkocXVlcnksIGlnbm9yZUNhc2UsIHNtYXJ0Q2FzZSkgewogICAgICAvLyBGaXJzdCB1cGRhdGUgdGhlIGxhc3Qgc2VhcmNoIHJlZ2lzdGVyCiAgICAgIHZhciBsYXN0U2VhcmNoUmVnaXN0ZXIgPSB2aW1HbG9iYWxTdGF0ZS5yZWdpc3RlckNvbnRyb2xsZXIuZ2V0UmVnaXN0ZXIoJy8nKTsKICAgICAgbGFzdFNlYXJjaFJlZ2lzdGVyLnNldFRleHQocXVlcnkpOwogICAgICAvLyBDaGVjayBpZiB0aGUgcXVlcnkgaXMgYWxyZWFkeSBhIHJlZ2V4LgogICAgICBpZiAocXVlcnkgaW5zdGFuY2VvZiBSZWdFeHApIHsgcmV0dXJuIHF1ZXJ5OyB9CiAgICAgIC8vIEZpcnN0IHRyeSB0byBleHRyYWN0IHJlZ2V4ICsgZmxhZ3MgZnJvbSB0aGUgaW5wdXQuIElmIG5vIGZsYWdzIGZvdW5kLAogICAgICAvLyBleHRyYWN0IGp1c3QgdGhlIHJlZ2V4LiBJRSBkb2VzIG5vdCBhY2NlcHQgZmxhZ3MgZGlyZWN0bHkgZGVmaW5lZCBpbgogICAgICAvLyB0aGUgcmVnZXggc3RyaW5nIGluIHRoZSBmb3JtIC9yZWdleC9mbGFncwogICAgICB2YXIgc2xhc2hlcyA9IGZpbmRVbmVzY2FwZWRTbGFzaGVzKHF1ZXJ5KTsKICAgICAgdmFyIHJlZ2V4UGFydDsKICAgICAgdmFyIGZvcmNlSWdub3JlQ2FzZTsKICAgICAgaWYgKCFzbGFzaGVzLmxlbmd0aCkgewogICAgICAgIC8vIFF1ZXJ5IGxvb2tzIGxpa2UgJ3JlZ2V4cCcKICAgICAgICByZWdleFBhcnQgPSBxdWVyeTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBRdWVyeSBsb29rcyBsaWtlICdyZWdleHAvLi4uJwogICAgICAgIHJlZ2V4UGFydCA9IHF1ZXJ5LnN1YnN0cmluZygwLCBzbGFzaGVzWzBdKTsKICAgICAgICB2YXIgZmxhZ3NQYXJ0ID0gcXVlcnkuc3Vic3RyaW5nKHNsYXNoZXNbMF0pOwogICAgICAgIGZvcmNlSWdub3JlQ2FzZSA9IChmbGFnc1BhcnQuaW5kZXhPZignaScpICE9IC0xKTsKICAgICAgfQogICAgICBpZiAoIXJlZ2V4UGFydCkgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGlmICghZ2V0T3B0aW9uKCdwY3JlJykpIHsKICAgICAgICByZWdleFBhcnQgPSB0cmFuc2xhdGVSZWdleChyZWdleFBhcnQpOwogICAgICB9CiAgICAgIGlmIChzbWFydENhc2UpIHsKICAgICAgICBpZ25vcmVDYXNlID0gKC9eW15BLVpdKiQvKS50ZXN0KHJlZ2V4UGFydCk7CiAgICAgIH0KICAgICAgdmFyIHJlZ2V4cCA9IG5ldyBSZWdFeHAocmVnZXhQYXJ0LAogICAgICAgICAgKGlnbm9yZUNhc2UgfHwgZm9yY2VJZ25vcmVDYXNlKSA/ICdpJyA6IHVuZGVmaW5lZCk7CiAgICAgIHJldHVybiByZWdleHA7CiAgICB9CiAgICBmdW5jdGlvbiBzaG93Q29uZmlybShjbSwgdGV4dCkgewogICAgICBpZiAoY20ub3Blbk5vdGlmaWNhdGlvbikgewogICAgICAgIGNtLm9wZW5Ob3RpZmljYXRpb24oJzxzcGFuIHN0eWxlPSJjb2xvcjogcmVkIj4nICsgdGV4dCArICc8L3NwYW4+JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtib3R0b206IHRydWUsIGR1cmF0aW9uOiA1MDAwfSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgYWxlcnQodGV4dCk7CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIG1ha2VQcm9tcHQocHJlZml4LCBkZXNjKSB7CiAgICAgIHZhciByYXcgPSAnJzsKICAgICAgaWYgKHByZWZpeCkgewogICAgICAgIHJhdyArPSAnPHNwYW4gc3R5bGU9ImZvbnQtZmFtaWx5OiBtb25vc3BhY2UiPicgKyBwcmVmaXggKyAnPC9zcGFuPic7CiAgICAgIH0KICAgICAgcmF3ICs9ICc8aW5wdXQgdHlwZT0idGV4dCIvPiAnICsKICAgICAgICAgICc8c3BhbiBzdHlsZT0iY29sb3I6ICM4ODgiPic7CiAgICAgIGlmIChkZXNjKSB7CiAgICAgICAgcmF3ICs9ICc8c3BhbiBzdHlsZT0iY29sb3I6ICM4ODgiPic7CiAgICAgICAgcmF3ICs9IGRlc2M7CiAgICAgICAgcmF3ICs9ICc8L3NwYW4+JzsKICAgICAgfQogICAgICByZXR1cm4gcmF3OwogICAgfQogICAgdmFyIHNlYXJjaFByb21wdERlc2MgPSAnKEphdmFzY3JpcHQgcmVnZXhwKSc7CiAgICBmdW5jdGlvbiBzaG93UHJvbXB0KGNtLCBvcHRpb25zKSB7CiAgICAgIHZhciBzaG9ydFRleHQgPSAob3B0aW9ucy5wcmVmaXggfHwgJycpICsgJyAnICsgKG9wdGlvbnMuZGVzYyB8fCAnJyk7CiAgICAgIHZhciBwcm9tcHQgPSBtYWtlUHJvbXB0KG9wdGlvbnMucHJlZml4LCBvcHRpb25zLmRlc2MpOwogICAgICBkaWFsb2coY20sIHByb21wdCwgc2hvcnRUZXh0LCBvcHRpb25zLm9uQ2xvc2UsIG9wdGlvbnMpOwogICAgfQogICAgZnVuY3Rpb24gcmVnZXhFcXVhbChyMSwgcjIpIHsKICAgICAgaWYgKHIxIGluc3RhbmNlb2YgUmVnRXhwICYmIHIyIGluc3RhbmNlb2YgUmVnRXhwKSB7CiAgICAgICAgICB2YXIgcHJvcHMgPSBbJ2dsb2JhbCcsICdtdWx0aWxpbmUnLCAnaWdub3JlQ2FzZScsICdzb3VyY2UnXTsKICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcHJvcHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICB2YXIgcHJvcCA9IHByb3BzW2ldOwogICAgICAgICAgICAgIGlmIChyMVtwcm9wXSAhPT0gcjJbcHJvcF0pIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgcXVlcnkgaXMgdmFsaWQuCiAgICBmdW5jdGlvbiB1cGRhdGVTZWFyY2hRdWVyeShjbSwgcmF3UXVlcnksIGlnbm9yZUNhc2UsIHNtYXJ0Q2FzZSkgewogICAgICBpZiAoIXJhd1F1ZXJ5KSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHZhciBzdGF0ZSA9IGdldFNlYXJjaFN0YXRlKGNtKTsKICAgICAgdmFyIHF1ZXJ5ID0gcGFyc2VRdWVyeShyYXdRdWVyeSwgISFpZ25vcmVDYXNlLCAhIXNtYXJ0Q2FzZSk7CiAgICAgIGlmICghcXVlcnkpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaGlnaGxpZ2h0U2VhcmNoTWF0Y2hlcyhjbSwgcXVlcnkpOwogICAgICBpZiAocmVnZXhFcXVhbChxdWVyeSwgc3RhdGUuZ2V0UXVlcnkoKSkpIHsKICAgICAgICByZXR1cm4gcXVlcnk7CiAgICAgIH0KICAgICAgc3RhdGUuc2V0UXVlcnkocXVlcnkpOwogICAgICByZXR1cm4gcXVlcnk7CiAgICB9CiAgICBmdW5jdGlvbiBzZWFyY2hPdmVybGF5KHF1ZXJ5KSB7CiAgICAgIGlmIChxdWVyeS5zb3VyY2UuY2hhckF0KDApID09ICdeJykgewogICAgICAgIHZhciBtYXRjaFNvbCA9IHRydWU7CiAgICAgIH0KICAgICAgcmV0dXJuIHsKICAgICAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtKSB7CiAgICAgICAgICBpZiAobWF0Y2hTb2wgJiYgIXN0cmVhbS5zb2woKSkgewogICAgICAgICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIHZhciBtYXRjaCA9IHN0cmVhbS5tYXRjaChxdWVyeSwgZmFsc2UpOwogICAgICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgICAgIGlmIChtYXRjaFswXS5sZW5ndGggPT0gMCkgewogICAgICAgICAgICAgIC8vIE1hdGNoZWQgZW1wdHkgc3RyaW5nLCBza2lwIHRvIG5leHQuCiAgICAgICAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgICAgICAgICByZXR1cm4gJ3NlYXJjaGluZyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFzdHJlYW0uc29sKCkpIHsKICAgICAgICAgICAgICAvLyBCYWNrdHJhY2sgMSB0byBtYXRjaCBcYgogICAgICAgICAgICAgIHN0cmVhbS5iYWNrVXAoMSk7CiAgICAgICAgICAgICAgaWYgKCFxdWVyeS5leGVjKHN0cmVhbS5uZXh0KCkgKyBtYXRjaFswXSkpIHsKICAgICAgICAgICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RyZWFtLm1hdGNoKHF1ZXJ5KTsKICAgICAgICAgICAgcmV0dXJuICdzZWFyY2hpbmcnOwogICAgICAgICAgfQogICAgICAgICAgd2hpbGUgKCFzdHJlYW0uZW9sKCkpIHsKICAgICAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgICAgICAgaWYgKHN0cmVhbS5tYXRjaChxdWVyeSwgZmFsc2UpKSBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIHF1ZXJ5OiBxdWVyeQogICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gaGlnaGxpZ2h0U2VhcmNoTWF0Y2hlcyhjbSwgcXVlcnkpIHsKICAgICAgdmFyIG92ZXJsYXkgPSBnZXRTZWFyY2hTdGF0ZShjbSkuZ2V0T3ZlcmxheSgpOwogICAgICBpZiAoIW92ZXJsYXkgfHwgcXVlcnkgIT0gb3ZlcmxheS5xdWVyeSkgewogICAgICAgIGlmIChvdmVybGF5KSB7CiAgICAgICAgICBjbS5yZW1vdmVPdmVybGF5KG92ZXJsYXkpOwogICAgICAgIH0KICAgICAgICBvdmVybGF5ID0gc2VhcmNoT3ZlcmxheShxdWVyeSk7CiAgICAgICAgY20uYWRkT3ZlcmxheShvdmVybGF5KTsKICAgICAgICBnZXRTZWFyY2hTdGF0ZShjbSkuc2V0T3ZlcmxheShvdmVybGF5KTsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gZmluZE5leHQoY20sIHByZXYsIHF1ZXJ5LCByZXBlYXQpIHsKICAgICAgaWYgKHJlcGVhdCA9PT0gdW5kZWZpbmVkKSB7IHJlcGVhdCA9IDE7IH0KICAgICAgcmV0dXJuIGNtLm9wZXJhdGlvbihmdW5jdGlvbigpIHsKICAgICAgICB2YXIgcG9zID0gY20uZ2V0Q3Vyc29yKCk7CiAgICAgICAgdmFyIGN1cnNvciA9IGNtLmdldFNlYXJjaEN1cnNvcihxdWVyeSwgcG9zKTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlcGVhdDsgaSsrKSB7CiAgICAgICAgICB2YXIgZm91bmQgPSBjdXJzb3IuZmluZChwcmV2KTsKICAgICAgICAgIGlmIChpID09IDAgJiYgZm91bmQgJiYgY3Vyc29yRXF1YWwoY3Vyc29yLmZyb20oKSwgcG9zKSkgeyBmb3VuZCA9IGN1cnNvci5maW5kKHByZXYpOyB9CiAgICAgICAgICBpZiAoIWZvdW5kKSB7CiAgICAgICAgICAgIC8vIFNlYXJjaEN1cnNvciBtYXkgaGF2ZSByZXR1cm5lZCBudWxsIGJlY2F1c2UgaXQgaGl0IEVPRiwgd3JhcAogICAgICAgICAgICAvLyBhcm91bmQgYW5kIHRyeSBhZ2Fpbi4KICAgICAgICAgICAgY3Vyc29yID0gY20uZ2V0U2VhcmNoQ3Vyc29yKHF1ZXJ5LAogICAgICAgICAgICAgICAgKHByZXYpID8gUG9zKGNtLmxhc3RMaW5lKCkpIDogUG9zKGNtLmZpcnN0TGluZSgpLCAwKSApOwogICAgICAgICAgICBpZiAoIWN1cnNvci5maW5kKHByZXYpKSB7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBjdXJzb3IuZnJvbSgpOwogICAgICB9KTsKICAgIH0KICAgIGZ1bmN0aW9uIGNsZWFyU2VhcmNoSGlnaGxpZ2h0KGNtKSB7CiAgICAgIGNtLnJlbW92ZU92ZXJsYXkoZ2V0U2VhcmNoU3RhdGUoY20pLmdldE92ZXJsYXkoKSk7CiAgICAgIGdldFNlYXJjaFN0YXRlKGNtKS5zZXRPdmVybGF5KG51bGwpOwogICAgfQogICAgLyoqCiAgICAgKiBDaGVjayBpZiBwb3MgaXMgaW4gdGhlIHNwZWNpZmllZCByYW5nZSwgSU5DTFVTSVZFLgogICAgICogUmFuZ2UgY2FuIGJlIHNwZWNpZmllZCB3aXRoIDEgb3IgMiBhcmd1bWVudHMuCiAgICAgKiBJZiB0aGUgZmlyc3QgcmFuZ2UgYXJndW1lbnQgaXMgYW4gYXJyYXksIHRyZWF0IGl0IGFzIGFuIGFycmF5IG9mIGxpbmUKICAgICAqIG51bWJlcnMuIE1hdGNoIHBvcyBhZ2FpbnN0IGFueSBvZiB0aGUgbGluZXMuCiAgICAgKiBJZiB0aGUgZmlyc3QgcmFuZ2UgYXJndW1lbnQgaXMgYSBudW1iZXIsCiAgICAgKiAgIGlmIHRoZXJlIGlzIG9ubHkgMSByYW5nZSBhcmd1bWVudCwgY2hlY2sgaWYgcG9zIGhhcyB0aGUgc2FtZSBsaW5lCiAgICAgKiAgICAgICBudW1iZXIKICAgICAqICAgaWYgdGhlcmUgYXJlIDIgcmFuZ2UgYXJndW1lbnRzLCB0aGVuIGNoZWNrIGlmIHBvcyBpcyBpbiBiZXR3ZWVuIHRoZSB0d28KICAgICAqICAgICAgIHJhbmdlIGFyZ3VtZW50cy4KICAgICAqLwogICAgZnVuY3Rpb24gaXNJblJhbmdlKHBvcywgc3RhcnQsIGVuZCkgewogICAgICBpZiAodHlwZW9mIHBvcyAhPSAnbnVtYmVyJykgewogICAgICAgIC8vIEFzc3VtZSBpdCBpcyBhIGN1cnNvciBwb3NpdGlvbi4gR2V0IHRoZSBsaW5lIG51bWJlci4KICAgICAgICBwb3MgPSBwb3MubGluZTsKICAgICAgfQogICAgICBpZiAoc3RhcnQgaW5zdGFuY2VvZiBBcnJheSkgewogICAgICAgIHJldHVybiBpbkFycmF5KHBvcywgc3RhcnQpOwogICAgICB9IGVsc2UgewogICAgICAgIGlmIChlbmQpIHsKICAgICAgICAgIHJldHVybiAocG9zID49IHN0YXJ0ICYmIHBvcyA8PSBlbmQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gcG9zID09IHN0YXJ0OwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gZ2V0VXNlclZpc2libGVMaW5lcyhjbSkgewogICAgICB2YXIgc2Nyb2xsSW5mbyA9IGNtLmdldFNjcm9sbEluZm8oKTsKICAgICAgdmFyIG9jY2x1ZGVUb2xlcmFuY2VUb3AgPSA2OwogICAgICB2YXIgb2NjbHVkZVRvbGVyYW5jZUJvdHRvbSA9IDEwOwogICAgICB2YXIgZnJvbSA9IGNtLmNvb3Jkc0NoYXIoe2xlZnQ6MCwgdG9wOiBvY2NsdWRlVG9sZXJhbmNlVG9wICsgc2Nyb2xsSW5mby50b3B9LCAnbG9jYWwnKTsKICAgICAgdmFyIGJvdHRvbVkgPSBzY3JvbGxJbmZvLmNsaWVudEhlaWdodCAtIG9jY2x1ZGVUb2xlcmFuY2VCb3R0b20gKyBzY3JvbGxJbmZvLnRvcDsKICAgICAgdmFyIHRvID0gY20uY29vcmRzQ2hhcih7bGVmdDowLCB0b3A6IGJvdHRvbVl9LCAnbG9jYWwnKTsKICAgICAgcmV0dXJuIHt0b3A6IGZyb20ubGluZSwgYm90dG9tOiB0by5saW5lfTsKICAgIH0KCiAgICAvLyBFeCBjb21tYW5kIGhhbmRsaW5nCiAgICAvLyBDYXJlIG11c3QgYmUgdGFrZW4gd2hlbiBhZGRpbmcgdG8gdGhlIGRlZmF1bHQgRXggY29tbWFuZCBtYXAuIEZvciBhbnkKICAgIC8vIHBhaXIgb2YgY29tbWFuZHMgdGhhdCBoYXZlIGEgc2hhcmVkIHByZWZpeCwgYXQgbGVhc3Qgb25lIG9mIHRoZWlyCiAgICAvLyBzaG9ydE5hbWVzIG11c3Qgbm90IG1hdGNoIHRoZSBwcmVmaXggb2YgdGhlIG90aGVyIGNvbW1hbmQuCiAgICB2YXIgZGVmYXVsdEV4Q29tbWFuZE1hcCA9IFsKICAgICAgeyBuYW1lOiAnbWFwJyB9LAogICAgICB7IG5hbWU6ICdubWFwJywgc2hvcnROYW1lOiAnbm0nIH0sCiAgICAgIHsgbmFtZTogJ3ZtYXAnLCBzaG9ydE5hbWU6ICd2bScgfSwKICAgICAgeyBuYW1lOiAndW5tYXAnIH0sCiAgICAgIHsgbmFtZTogJ3dyaXRlJywgc2hvcnROYW1lOiAndycgfSwKICAgICAgeyBuYW1lOiAndW5kbycsIHNob3J0TmFtZTogJ3UnIH0sCiAgICAgIHsgbmFtZTogJ3JlZG8nLCBzaG9ydE5hbWU6ICdyZWQnIH0sCiAgICAgIHsgbmFtZTogJ3NldCcsIHNob3J0TmFtZTogJ3NldCcgfSwKICAgICAgeyBuYW1lOiAnc29ydCcsIHNob3J0TmFtZTogJ3NvcicgfSwKICAgICAgeyBuYW1lOiAnc3Vic3RpdHV0ZScsIHNob3J0TmFtZTogJ3MnLCBwb3NzaWJseUFzeW5jOiB0cnVlIH0sCiAgICAgIHsgbmFtZTogJ25vaGxzZWFyY2gnLCBzaG9ydE5hbWU6ICdub2gnIH0sCiAgICAgIHsgbmFtZTogJ2RlbG1hcmtzJywgc2hvcnROYW1lOiAnZGVsbScgfSwKICAgICAgeyBuYW1lOiAncmVnaXN0ZXJzJywgc2hvcnROYW1lOiAncmVnJywgZXhjbHVkZUZyb21Db21tYW5kSGlzdG9yeTogdHJ1ZSB9LAogICAgICB7IG5hbWU6ICdnbG9iYWwnLCBzaG9ydE5hbWU6ICdnJyB9CiAgICBdOwogICAgVmltLkV4Q29tbWFuZERpc3BhdGNoZXIgPSBmdW5jdGlvbigpIHsKICAgICAgdGhpcy5idWlsZENvbW1hbmRNYXBfKCk7CiAgICB9OwogICAgVmltLkV4Q29tbWFuZERpc3BhdGNoZXIucHJvdG90eXBlID0gewogICAgICBwcm9jZXNzQ29tbWFuZDogZnVuY3Rpb24oY20sIGlucHV0LCBvcHRfcGFyYW1zKSB7CiAgICAgICAgdmFyIHZpbSA9IGNtLnN0YXRlLnZpbTsKICAgICAgICB2YXIgY29tbWFuZEhpc3RvcnlSZWdpc3RlciA9IHZpbUdsb2JhbFN0YXRlLnJlZ2lzdGVyQ29udHJvbGxlci5nZXRSZWdpc3RlcignOicpOwogICAgICAgIHZhciBwcmV2aW91c0NvbW1hbmQgPSBjb21tYW5kSGlzdG9yeVJlZ2lzdGVyLnRvU3RyaW5nKCk7CiAgICAgICAgaWYgKHZpbS52aXN1YWxNb2RlKSB7CiAgICAgICAgICBleGl0VmlzdWFsTW9kZShjbSk7CiAgICAgICAgfQogICAgICAgIHZhciBpbnB1dFN0cmVhbSA9IG5ldyBDb2RlTWlycm9yLlN0cmluZ1N0cmVhbShpbnB1dCk7CiAgICAgICAgLy8gdXBkYXRlICI6IHdpdGggdGhlIGxhdGVzdCBjb21tYW5kIHdoZXRoZXIgdmFsaWQgb3IgaW52YWxpZAogICAgICAgIGNvbW1hbmRIaXN0b3J5UmVnaXN0ZXIuc2V0VGV4dChpbnB1dCk7CiAgICAgICAgdmFyIHBhcmFtcyA9IG9wdF9wYXJhbXMgfHwge307CiAgICAgICAgcGFyYW1zLmlucHV0ID0gaW5wdXQ7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHRoaXMucGFyc2VJbnB1dF8oY20sIGlucHV0U3RyZWFtLCBwYXJhbXMpOwogICAgICAgIH0gY2F0Y2goZSkgewogICAgICAgICAgc2hvd0NvbmZpcm0oY20sIGUpOwogICAgICAgICAgdGhyb3cgZTsKICAgICAgICB9CiAgICAgICAgdmFyIGNvbW1hbmQ7CiAgICAgICAgdmFyIGNvbW1hbmROYW1lOwogICAgICAgIGlmICghcGFyYW1zLmNvbW1hbmROYW1lKSB7CiAgICAgICAgICAvLyBJZiBvbmx5IGEgbGluZSByYW5nZSBpcyBkZWZpbmVkLCBtb3ZlIHRvIHRoZSBsaW5lLgogICAgICAgICAgaWYgKHBhcmFtcy5saW5lICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgY29tbWFuZE5hbWUgPSAnbW92ZSc7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbW1hbmQgPSB0aGlzLm1hdGNoQ29tbWFuZF8ocGFyYW1zLmNvbW1hbmROYW1lKTsKICAgICAgICAgIGlmIChjb21tYW5kKSB7CiAgICAgICAgICAgIGNvbW1hbmROYW1lID0gY29tbWFuZC5uYW1lOwogICAgICAgICAgICBpZiAoY29tbWFuZC5leGNsdWRlRnJvbUNvbW1hbmRIaXN0b3J5KSB7CiAgICAgICAgICAgICAgY29tbWFuZEhpc3RvcnlSZWdpc3Rlci5zZXRUZXh0KHByZXZpb3VzQ29tbWFuZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5wYXJzZUNvbW1hbmRBcmdzXyhpbnB1dFN0cmVhbSwgcGFyYW1zLCBjb21tYW5kKTsKICAgICAgICAgICAgaWYgKGNvbW1hbmQudHlwZSA9PSAnZXhUb0tleScpIHsKICAgICAgICAgICAgICAvLyBIYW5kbGUgRXggdG8gS2V5IG1hcHBpbmcuCiAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb21tYW5kLnRvS2V5cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgQ29kZU1pcnJvci5WaW0uaGFuZGxlS2V5KGNtLCBjb21tYW5kLnRvS2V5c1tpXSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfSBlbHNlIGlmIChjb21tYW5kLnR5cGUgPT0gJ2V4VG9FeCcpIHsKICAgICAgICAgICAgICAvLyBIYW5kbGUgRXggdG8gRXggbWFwcGluZy4KICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NDb21tYW5kKGNtLCBjb21tYW5kLnRvSW5wdXQpOwogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoIWNvbW1hbmROYW1lKSB7CiAgICAgICAgICBzaG93Q29uZmlybShjbSwgJ05vdCBhbiBlZGl0b3IgY29tbWFuZCAiOicgKyBpbnB1dCArICciJyk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHRyeSB7CiAgICAgICAgICBleENvbW1hbmRzW2NvbW1hbmROYW1lXShjbSwgcGFyYW1zKTsKICAgICAgICAgIC8vIFBvc3NpYmx5IGFzeW5jaHJvbm91cyBjb21tYW5kcyAoZS5nLiBzdWJzdGl0dXRlLCB3aGljaCBtaWdodCBoYXZlIGEKICAgICAgICAgIC8vIHVzZXIgY29uZmlybWF0aW9uKSwgYXJlIHJlc3BvbnNpYmxlIGZvciBjYWxsaW5nIHRoZSBjYWxsYmFjayB3aGVuCiAgICAgICAgICAvLyBkb25lLiBBbGwgb3RoZXJzIGhhdmUgaXQgdGFrZW4gY2FyZSBvZiBmb3IgdGhlbSBoZXJlLgogICAgICAgICAgaWYgKCghY29tbWFuZCB8fCAhY29tbWFuZC5wb3NzaWJseUFzeW5jKSAmJiBwYXJhbXMuY2FsbGJhY2spIHsKICAgICAgICAgICAgcGFyYW1zLmNhbGxiYWNrKCk7CiAgICAgICAgICB9CiAgICAgICAgfSBjYXRjaChlKSB7CiAgICAgICAgICBzaG93Q29uZmlybShjbSwgZSk7CiAgICAgICAgICB0aHJvdyBlOwogICAgICAgIH0KICAgICAgfSwKICAgICAgcGFyc2VJbnB1dF86IGZ1bmN0aW9uKGNtLCBpbnB1dFN0cmVhbSwgcmVzdWx0KSB7CiAgICAgICAgaW5wdXRTdHJlYW0uZWF0V2hpbGUoJzonKTsKICAgICAgICAvLyBQYXJzZSByYW5nZS4KICAgICAgICBpZiAoaW5wdXRTdHJlYW0uZWF0KCclJykpIHsKICAgICAgICAgIHJlc3VsdC5saW5lID0gY20uZmlyc3RMaW5lKCk7CiAgICAgICAgICByZXN1bHQubGluZUVuZCA9IGNtLmxhc3RMaW5lKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJlc3VsdC5saW5lID0gdGhpcy5wYXJzZUxpbmVTcGVjXyhjbSwgaW5wdXRTdHJlYW0pOwogICAgICAgICAgaWYgKHJlc3VsdC5saW5lICE9PSB1bmRlZmluZWQgJiYgaW5wdXRTdHJlYW0uZWF0KCcsJykpIHsKICAgICAgICAgICAgcmVzdWx0LmxpbmVFbmQgPSB0aGlzLnBhcnNlTGluZVNwZWNfKGNtLCBpbnB1dFN0cmVhbSk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBQYXJzZSBjb21tYW5kIG5hbWUuCiAgICAgICAgdmFyIGNvbW1hbmRNYXRjaCA9IGlucHV0U3RyZWFtLm1hdGNoKC9eKFx3KykvKTsKICAgICAgICBpZiAoY29tbWFuZE1hdGNoKSB7CiAgICAgICAgICByZXN1bHQuY29tbWFuZE5hbWUgPSBjb21tYW5kTWF0Y2hbMV07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJlc3VsdC5jb21tYW5kTmFtZSA9IGlucHV0U3RyZWFtLm1hdGNoKC8uKi8pWzBdOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfSwKICAgICAgcGFyc2VMaW5lU3BlY186IGZ1bmN0aW9uKGNtLCBpbnB1dFN0cmVhbSkgewogICAgICAgIHZhciBudW1iZXJNYXRjaCA9IGlucHV0U3RyZWFtLm1hdGNoKC9eKFxkKykvKTsKICAgICAgICBpZiAobnVtYmVyTWF0Y2gpIHsKICAgICAgICAgIHJldHVybiBwYXJzZUludChudW1iZXJNYXRjaFsxXSwgMTApIC0gMTsKICAgICAgICB9CiAgICAgICAgc3dpdGNoIChpbnB1dFN0cmVhbS5uZXh0KCkpIHsKICAgICAgICAgIGNhc2UgJy4nOgogICAgICAgICAgICByZXR1cm4gY20uZ2V0Q3Vyc29yKCkubGluZTsKICAgICAgICAgIGNhc2UgJyQnOgogICAgICAgICAgICByZXR1cm4gY20ubGFzdExpbmUoKTsKICAgICAgICAgIGNhc2UgJ1wnJzoKICAgICAgICAgICAgdmFyIG1hcmsgPSBjbS5zdGF0ZS52aW0ubWFya3NbaW5wdXRTdHJlYW0ubmV4dCgpXTsKICAgICAgICAgICAgaWYgKG1hcmsgJiYgbWFyay5maW5kKCkpIHsKICAgICAgICAgICAgICByZXR1cm4gbWFyay5maW5kKCkubGluZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01hcmsgbm90IHNldCcpOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgaW5wdXRTdHJlYW0uYmFja1VwKDEpOwogICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgICAgIH0KICAgICAgfSwKICAgICAgcGFyc2VDb21tYW5kQXJnc186IGZ1bmN0aW9uKGlucHV0U3RyZWFtLCBwYXJhbXMsIGNvbW1hbmQpIHsKICAgICAgICBpZiAoaW5wdXRTdHJlYW0uZW9sKCkpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgcGFyYW1zLmFyZ1N0cmluZyA9IGlucHV0U3RyZWFtLm1hdGNoKC8uKi8pWzBdOwogICAgICAgIC8vIFBhcnNlIGNvbW1hbmQtbGluZSBhcmd1bWVudHMKICAgICAgICB2YXIgZGVsaW0gPSBjb21tYW5kLmFyZ0RlbGltaXRlciB8fCAvXHMrLzsKICAgICAgICB2YXIgYXJncyA9IHRyaW0ocGFyYW1zLmFyZ1N0cmluZykuc3BsaXQoZGVsaW0pOwogICAgICAgIGlmIChhcmdzLmxlbmd0aCAmJiBhcmdzWzBdKSB7CiAgICAgICAgICBwYXJhbXMuYXJncyA9IGFyZ3M7CiAgICAgICAgfQogICAgICB9LAogICAgICBtYXRjaENvbW1hbmRfOiBmdW5jdGlvbihjb21tYW5kTmFtZSkgewogICAgICAgIC8vIFJldHVybiB0aGUgY29tbWFuZCBpbiB0aGUgY29tbWFuZCBtYXAgdGhhdCBtYXRjaGVzIHRoZSBzaG9ydGVzdAogICAgICAgIC8vIHByZWZpeCBvZiB0aGUgcGFzc2VkIGluIGNvbW1hbmQgbmFtZS4gVGhlIG1hdGNoIGlzIGd1YXJhbnRlZWQgdG8gYmUKICAgICAgICAvLyB1bmFtYmlndW91cyBpZiB0aGUgZGVmYXVsdEV4Q29tbWFuZE1hcCdzIHNob3J0TmFtZXMgYXJlIHNldCB1cAogICAgICAgIC8vIGNvcnJlY3RseS4gKHNlZSBAY29kZXtkZWZhdWx0RXhDb21tYW5kTWFwfSkuCiAgICAgICAgZm9yICh2YXIgaSA9IGNvbW1hbmROYW1lLmxlbmd0aDsgaSA+IDA7IGktLSkgewogICAgICAgICAgdmFyIHByZWZpeCA9IGNvbW1hbmROYW1lLnN1YnN0cmluZygwLCBpKTsKICAgICAgICAgIGlmICh0aGlzLmNvbW1hbmRNYXBfW3ByZWZpeF0pIHsKICAgICAgICAgICAgdmFyIGNvbW1hbmQgPSB0aGlzLmNvbW1hbmRNYXBfW3ByZWZpeF07CiAgICAgICAgICAgIGlmIChjb21tYW5kLm5hbWUuaW5kZXhPZihjb21tYW5kTmFtZSkgPT09IDApIHsKICAgICAgICAgICAgICByZXR1cm4gY29tbWFuZDsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfSwKICAgICAgYnVpbGRDb21tYW5kTWFwXzogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5jb21tYW5kTWFwXyA9IHt9OwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGVmYXVsdEV4Q29tbWFuZE1hcC5sZW5ndGg7IGkrKykgewogICAgICAgICAgdmFyIGNvbW1hbmQgPSBkZWZhdWx0RXhDb21tYW5kTWFwW2ldOwogICAgICAgICAgdmFyIGtleSA9IGNvbW1hbmQuc2hvcnROYW1lIHx8IGNvbW1hbmQubmFtZTsKICAgICAgICAgIHRoaXMuY29tbWFuZE1hcF9ba2V5XSA9IGNvbW1hbmQ7CiAgICAgICAgfQogICAgICB9LAogICAgICBtYXA6IGZ1bmN0aW9uKGxocywgcmhzLCBjdHgpIHsKICAgICAgICBpZiAobGhzICE9ICc6JyAmJiBsaHMuY2hhckF0KDApID09ICc6JykgewogICAgICAgICAgaWYgKGN0eCkgeyB0aHJvdyBFcnJvcignTW9kZSBub3Qgc3VwcG9ydGVkIGZvciBleCBtYXBwaW5ncycpOyB9CiAgICAgICAgICB2YXIgY29tbWFuZE5hbWUgPSBsaHMuc3Vic3RyaW5nKDEpOwogICAgICAgICAgaWYgKHJocyAhPSAnOicgJiYgcmhzLmNoYXJBdCgwKSA9PSAnOicpIHsKICAgICAgICAgICAgLy8gRXggdG8gRXggbWFwcGluZwogICAgICAgICAgICB0aGlzLmNvbW1hbmRNYXBfW2NvbW1hbmROYW1lXSA9IHsKICAgICAgICAgICAgICBuYW1lOiBjb21tYW5kTmFtZSwKICAgICAgICAgICAgICB0eXBlOiAnZXhUb0V4JywKICAgICAgICAgICAgICB0b0lucHV0OiByaHMuc3Vic3RyaW5nKDEpLAogICAgICAgICAgICAgIHVzZXI6IHRydWUKICAgICAgICAgICAgfTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIEV4IHRvIGtleSBtYXBwaW5nCiAgICAgICAgICAgIHRoaXMuY29tbWFuZE1hcF9bY29tbWFuZE5hbWVdID0gewogICAgICAgICAgICAgIG5hbWU6IGNvbW1hbmROYW1lLAogICAgICAgICAgICAgIHR5cGU6ICdleFRvS2V5JywKICAgICAgICAgICAgICB0b0tleXM6IHBhcnNlS2V5U3RyaW5nKHJocyksCiAgICAgICAgICAgICAgdXNlcjogdHJ1ZQogICAgICAgICAgICB9OwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAocmhzICE9ICc6JyAmJiByaHMuY2hhckF0KDApID09ICc6JykgewogICAgICAgICAgICAvLyBLZXkgdG8gRXggbWFwcGluZy4KICAgICAgICAgICAgdmFyIG1hcHBpbmcgPSB7CiAgICAgICAgICAgICAga2V5czogcGFyc2VLZXlTdHJpbmcobGhzKSwKICAgICAgICAgICAgICB0eXBlOiAna2V5VG9FeCcsCiAgICAgICAgICAgICAgZXhBcmdzOiB7IGlucHV0OiByaHMuc3Vic3RyaW5nKDEpIH0sCiAgICAgICAgICAgICAgdXNlcjogdHJ1ZX07CiAgICAgICAgICAgIGlmIChjdHgpIHsgbWFwcGluZy5jb250ZXh0ID0gY3R4OyB9CiAgICAgICAgICAgIGRlZmF1bHRLZXltYXAudW5zaGlmdChtYXBwaW5nKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIEtleSB0byBrZXkgbWFwcGluZwogICAgICAgICAgICB2YXIgbWFwcGluZyA9IHsKICAgICAgICAgICAgICBrZXlzOiBwYXJzZUtleVN0cmluZyhsaHMpLAogICAgICAgICAgICAgIHR5cGU6ICdrZXlUb0tleScsCiAgICAgICAgICAgICAgdG9LZXlzOiBwYXJzZUtleVN0cmluZyhyaHMpLAogICAgICAgICAgICAgIHVzZXI6IHRydWUKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWYgKGN0eCkgeyBtYXBwaW5nLmNvbnRleHQgPSBjdHg7IH0KICAgICAgICAgICAgZGVmYXVsdEtleW1hcC51bnNoaWZ0KG1hcHBpbmcpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgdW5tYXA6IGZ1bmN0aW9uKGxocywgY3R4KSB7CiAgICAgICAgdmFyIGFycmF5RXF1YWxzID0gZnVuY3Rpb24oYSwgYikgewogICAgICAgICAgaWYgKGEgPT09IGIpIHJldHVybiB0cnVlOwogICAgICAgICAgaWYgKGEgPT0gbnVsbCB8fCBiID09IG51bGwpIHJldHVybiB0cnVlOwogICAgICAgICAgaWYgKGEubGVuZ3RoICE9IGIubGVuZ3RoKSByZXR1cm4gZmFsc2U7CiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgaWYgKGFbaV0gIT09IGJbaV0pIHJldHVybiBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH07CiAgICAgICAgaWYgKGxocyAhPSAnOicgJiYgbGhzLmNoYXJBdCgwKSA9PSAnOicpIHsKICAgICAgICAgIC8vIEV4IHRvIEV4IG9yIEV4IHRvIGtleSBtYXBwaW5nCiAgICAgICAgICBpZiAoY3R4KSB7IHRocm93IEVycm9yKCdNb2RlIG5vdCBzdXBwb3J0ZWQgZm9yIGV4IG1hcHBpbmdzJyk7IH0KICAgICAgICAgIHZhciBjb21tYW5kTmFtZSA9IGxocy5zdWJzdHJpbmcoMSk7CiAgICAgICAgICBpZiAodGhpcy5jb21tYW5kTWFwX1tjb21tYW5kTmFtZV0gJiYgdGhpcy5jb21tYW5kTWFwX1tjb21tYW5kTmFtZV0udXNlcikgewogICAgICAgICAgICBkZWxldGUgdGhpcy5jb21tYW5kTWFwX1tjb21tYW5kTmFtZV07CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gS2V5IHRvIEV4IG9yIGtleSB0byBrZXkgbWFwcGluZwogICAgICAgICAgdmFyIGtleXMgPSBwYXJzZUtleVN0cmluZyhsaHMpOwogICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZWZhdWx0S2V5bWFwLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGlmIChhcnJheUVxdWFscyhrZXlzLCBkZWZhdWx0S2V5bWFwW2ldLmtleXMpCiAgICAgICAgICAgICAgICAmJiBkZWZhdWx0S2V5bWFwW2ldLmNvbnRleHQgPT09IGN0eAogICAgICAgICAgICAgICAgJiYgZGVmYXVsdEtleW1hcFtpXS51c2VyKSB7CiAgICAgICAgICAgICAgZGVmYXVsdEtleW1hcC5zcGxpY2UoaSwgMSk7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRocm93IEVycm9yKCdObyBzdWNoIG1hcHBpbmcuJyk7CiAgICAgIH0KICAgIH07CgogICAgLy8gQ29udmVydHMgYSBrZXkgc3RyaW5nIHNlcXVlbmNlIG9mIHRoZSBmb3JtIGE8Qy13PmJkPExlZnQ+IGludG8gVmltJ3MKICAgIC8vIGtleW1hcCByZXByZXNlbnRhdGlvbi4KICAgIGZ1bmN0aW9uIHBhcnNlS2V5U3RyaW5nKHN0cikgewogICAgICB2YXIga2V5LCBtYXRjaDsKICAgICAgdmFyIGtleXMgPSBbXTsKICAgICAgd2hpbGUgKHN0cikgewogICAgICAgIG1hdGNoID0gKC88XHcrLS4rPz58PFx3Kz58Li8pLmV4ZWMoc3RyKTsKICAgICAgICBpZiAobWF0Y2ggPT09IG51bGwpYnJlYWs7CiAgICAgICAga2V5ID0gbWF0Y2hbMF07CiAgICAgICAgc3RyID0gc3RyLnN1YnN0cmluZyhtYXRjaC5pbmRleCArIGtleS5sZW5ndGgpOwogICAgICAgIGtleXMucHVzaChrZXkpOwogICAgICB9CiAgICAgIHJldHVybiBrZXlzOwogICAgfQoKICAgIHZhciBleENvbW1hbmRzID0gewogICAgICBtYXA6IGZ1bmN0aW9uKGNtLCBwYXJhbXMsIGN0eCkgewogICAgICAgIHZhciBtYXBBcmdzID0gcGFyYW1zLmFyZ3M7CiAgICAgICAgaWYgKCFtYXBBcmdzIHx8IG1hcEFyZ3MubGVuZ3RoIDwgMikgewogICAgICAgICAgaWYgKGNtKSB7CiAgICAgICAgICAgIHNob3dDb25maXJtKGNtLCAnSW52YWxpZCBtYXBwaW5nOiAnICsgcGFyYW1zLmlucHV0KTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgZXhDb21tYW5kRGlzcGF0Y2hlci5tYXAobWFwQXJnc1swXSwgbWFwQXJnc1sxXSwgY3R4KTsKICAgICAgfSwKICAgICAgbm1hcDogZnVuY3Rpb24oY20sIHBhcmFtcykgeyB0aGlzLm1hcChjbSwgcGFyYW1zLCAnbm9ybWFsJyk7IH0sCiAgICAgIHZtYXA6IGZ1bmN0aW9uKGNtLCBwYXJhbXMpIHsgdGhpcy5tYXAoY20sIHBhcmFtcywgJ3Zpc3VhbCcpOyB9LAogICAgICB1bm1hcDogZnVuY3Rpb24oY20sIHBhcmFtcywgY3R4KSB7CiAgICAgICAgdmFyIG1hcEFyZ3MgPSBwYXJhbXMuYXJnczsKICAgICAgICBpZiAoIW1hcEFyZ3MgfHwgbWFwQXJncy5sZW5ndGggPCAxKSB7CiAgICAgICAgICBpZiAoY20pIHsKICAgICAgICAgICAgc2hvd0NvbmZpcm0oY20sICdObyBzdWNoIG1hcHBpbmc6ICcgKyBwYXJhbXMuaW5wdXQpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBleENvbW1hbmREaXNwYXRjaGVyLnVubWFwKG1hcEFyZ3NbMF0sIGN0eCk7CiAgICAgIH0sCiAgICAgIG1vdmU6IGZ1bmN0aW9uKGNtLCBwYXJhbXMpIHsKICAgICAgICBjb21tYW5kRGlzcGF0Y2hlci5wcm9jZXNzQ29tbWFuZChjbSwgY20uc3RhdGUudmltLCB7CiAgICAgICAgICAgIHR5cGU6ICdtb3Rpb24nLAogICAgICAgICAgICBtb3Rpb246ICdtb3ZlVG9MaW5lT3JFZGdlT2ZEb2N1bWVudCcsCiAgICAgICAgICAgIG1vdGlvbkFyZ3M6IHsgZm9yd2FyZDogZmFsc2UsIGV4cGxpY2l0UmVwZWF0OiB0cnVlLAogICAgICAgICAgICAgIGxpbmV3aXNlOiB0cnVlIH0sCiAgICAgICAgICAgIHJlcGVhdE92ZXJyaWRlOiBwYXJhbXMubGluZSsxfSk7CiAgICAgIH0sCiAgICAgIHNldDogZnVuY3Rpb24oY20sIHBhcmFtcykgewogICAgICAgIHZhciBzZXRBcmdzID0gcGFyYW1zLmFyZ3M7CiAgICAgICAgaWYgKCFzZXRBcmdzIHx8IHNldEFyZ3MubGVuZ3RoIDwgMSkgewogICAgICAgICAgaWYgKGNtKSB7CiAgICAgICAgICAgIHNob3dDb25maXJtKGNtLCAnSW52YWxpZCBtYXBwaW5nOiAnICsgcGFyYW1zLmlucHV0KTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdmFyIGV4cHIgPSBzZXRBcmdzWzBdLnNwbGl0KCc9Jyk7CiAgICAgICAgdmFyIG9wdGlvbk5hbWUgPSBleHByWzBdOwogICAgICAgIHZhciB2YWx1ZSA9IGV4cHJbMV07CiAgICAgICAgdmFyIGZvcmNlR2V0ID0gZmFsc2U7CgogICAgICAgIGlmIChvcHRpb25OYW1lLmNoYXJBdChvcHRpb25OYW1lLmxlbmd0aCAtIDEpID09ICc/JykgewogICAgICAgICAgLy8gSWYgcG9zdC1maXhlZCB3aXRoID8sIHRoZW4gdGhlIHNldCBpcyBhY3R1YWxseSBhIGdldC4KICAgICAgICAgIGlmICh2YWx1ZSkgeyB0aHJvdyBFcnJvcignVHJhaWxpbmcgY2hhcmFjdGVyczogJyArIHBhcmFtcy5hcmdTdHJpbmcpOyB9CiAgICAgICAgICBvcHRpb25OYW1lID0gb3B0aW9uTmFtZS5zdWJzdHJpbmcoMCwgb3B0aW9uTmFtZS5sZW5ndGggLSAxKTsKICAgICAgICAgIGZvcmNlR2V0ID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgb3B0aW9uTmFtZS5zdWJzdHJpbmcoMCwgMikgPT0gJ25vJykgewogICAgICAgICAgLy8gVG8gc2V0IGJvb2xlYW4gb3B0aW9ucyB0byBmYWxzZSwgdGhlIG9wdGlvbiBuYW1lIGlzIHByZWZpeGVkIHdpdGgKICAgICAgICAgIC8vICdubycuCiAgICAgICAgICBvcHRpb25OYW1lID0gb3B0aW9uTmFtZS5zdWJzdHJpbmcoMik7CiAgICAgICAgICB2YWx1ZSA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICB2YXIgb3B0aW9uSXNCb29sZWFuID0gb3B0aW9uc1tvcHRpb25OYW1lXSAmJiBvcHRpb25zW29wdGlvbk5hbWVdLnR5cGUgPT0gJ2Jvb2xlYW4nOwogICAgICAgIGlmIChvcHRpb25Jc0Jvb2xlYW4gJiYgdmFsdWUgPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAvLyBDYWxsaW5nIHNldCB3aXRoIGEgYm9vbGVhbiBvcHRpb24gc2V0cyBpdCB0byB0cnVlLgogICAgICAgICAgdmFsdWUgPSB0cnVlOwogICAgICAgIH0KICAgICAgICBpZiAoIW9wdGlvbklzQm9vbGVhbiAmJiAhdmFsdWUgfHwgZm9yY2VHZXQpIHsKICAgICAgICAgIHZhciBvbGRWYWx1ZSA9IGdldE9wdGlvbihvcHRpb25OYW1lKTsKICAgICAgICAgIC8vIElmIG5vIHZhbHVlIGlzIHByb3ZpZGVkLCB0aGVuIHdlIGFzc3VtZSB0aGlzIGlzIGEgZ2V0LgogICAgICAgICAgaWYgKG9sZFZhbHVlID09PSB0cnVlIHx8IG9sZFZhbHVlID09PSBmYWxzZSkgewogICAgICAgICAgICBzaG93Q29uZmlybShjbSwgJyAnICsgKG9sZFZhbHVlID8gJycgOiAnbm8nKSArIG9wdGlvbk5hbWUpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2hvd0NvbmZpcm0oY20sICcgICcgKyBvcHRpb25OYW1lICsgJz0nICsgb2xkVmFsdWUpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzZXRPcHRpb24ob3B0aW9uTmFtZSwgdmFsdWUpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgcmVnaXN0ZXJzOiBmdW5jdGlvbihjbSxwYXJhbXMpIHsKICAgICAgICB2YXIgcmVnQXJncyA9IHBhcmFtcy5hcmdzOwogICAgICAgIHZhciByZWdpc3RlcnMgPSB2aW1HbG9iYWxTdGF0ZS5yZWdpc3RlckNvbnRyb2xsZXIucmVnaXN0ZXJzOwogICAgICAgIHZhciByZWdJbmZvID0gJy0tLS0tLS0tLS1SZWdpc3RlcnMtLS0tLS0tLS0tPGJyPjxicj4nOwogICAgICAgIGlmICghcmVnQXJncykgewogICAgICAgICAgZm9yICh2YXIgcmVnaXN0ZXJOYW1lIGluIHJlZ2lzdGVycykgewogICAgICAgICAgICB2YXIgdGV4dCA9IHJlZ2lzdGVyc1tyZWdpc3Rlck5hbWVdLnRvU3RyaW5nKCk7CiAgICAgICAgICAgIGlmICh0ZXh0Lmxlbmd0aCkgewogICAgICAgICAgICAgIHJlZ0luZm8gKz0gJyInICsgcmVnaXN0ZXJOYW1lICsgJyAgICAnICsgdGV4dCArICc8YnI+JzsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB2YXIgcmVnaXN0ZXJOYW1lOwogICAgICAgICAgcmVnQXJncyA9IHJlZ0FyZ3Muam9pbignJyk7CiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlZ0FyZ3MubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgcmVnaXN0ZXJOYW1lID0gcmVnQXJncy5jaGFyQXQoaSk7CiAgICAgICAgICAgIGlmICghdmltR2xvYmFsU3RhdGUucmVnaXN0ZXJDb250cm9sbGVyLmlzVmFsaWRSZWdpc3RlcihyZWdpc3Rlck5hbWUpKSB7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHJlZ2lzdGVyID0gcmVnaXN0ZXJzW3JlZ2lzdGVyTmFtZV0gfHwgbmV3IFJlZ2lzdGVyKCk7CiAgICAgICAgICAgIHJlZ0luZm8gKz0gJyInICsgcmVnaXN0ZXJOYW1lICsgJyAgICAnICsgcmVnaXN0ZXIudG9TdHJpbmcoKSArICc8YnI+JzsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgc2hvd0NvbmZpcm0oY20sIHJlZ0luZm8pOwogICAgICB9LAogICAgICBzb3J0OiBmdW5jdGlvbihjbSwgcGFyYW1zKSB7CiAgICAgICAgdmFyIHJldmVyc2UsIGlnbm9yZUNhc2UsIHVuaXF1ZSwgbnVtYmVyOwogICAgICAgIGZ1bmN0aW9uIHBhcnNlQXJncygpIHsKICAgICAgICAgIGlmIChwYXJhbXMuYXJnU3RyaW5nKSB7CiAgICAgICAgICAgIHZhciBhcmdzID0gbmV3IENvZGVNaXJyb3IuU3RyaW5nU3RyZWFtKHBhcmFtcy5hcmdTdHJpbmcpOwogICAgICAgICAgICBpZiAoYXJncy5lYXQoJyEnKSkgeyByZXZlcnNlID0gdHJ1ZTsgfQogICAgICAgICAgICBpZiAoYXJncy5lb2woKSkgeyByZXR1cm47IH0KICAgICAgICAgICAgaWYgKCFhcmdzLmVhdFNwYWNlKCkpIHsgcmV0dXJuICdJbnZhbGlkIGFyZ3VtZW50cyc7IH0KICAgICAgICAgICAgdmFyIG9wdHMgPSBhcmdzLm1hdGNoKC9bYS16XSsvKTsKICAgICAgICAgICAgaWYgKG9wdHMpIHsKICAgICAgICAgICAgICBvcHRzID0gb3B0c1swXTsKICAgICAgICAgICAgICBpZ25vcmVDYXNlID0gb3B0cy5pbmRleE9mKCdpJykgIT0gLTE7CiAgICAgICAgICAgICAgdW5pcXVlID0gb3B0cy5pbmRleE9mKCd1JykgIT0gLTE7CiAgICAgICAgICAgICAgdmFyIGRlY2ltYWwgPSBvcHRzLmluZGV4T2YoJ2QnKSAhPSAtMSAmJiAxOwogICAgICAgICAgICAgIHZhciBoZXggPSBvcHRzLmluZGV4T2YoJ3gnKSAhPSAtMSAmJiAxOwogICAgICAgICAgICAgIHZhciBvY3RhbCA9IG9wdHMuaW5kZXhPZignbycpICE9IC0xICYmIDE7CiAgICAgICAgICAgICAgaWYgKGRlY2ltYWwgKyBoZXggKyBvY3RhbCA+IDEpIHsgcmV0dXJuICdJbnZhbGlkIGFyZ3VtZW50cyc7IH0KICAgICAgICAgICAgICBudW1iZXIgPSBkZWNpbWFsICYmICdkZWNpbWFsJyB8fCBoZXggJiYgJ2hleCcgfHwgb2N0YWwgJiYgJ29jdGFsJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYXJncy5lYXRTcGFjZSgpICYmIGFyZ3MubWF0Y2goL1wvLipcLy8pKSB7ICdwYXR0ZXJucyBub3Qgc3VwcG9ydGVkJzsgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB2YXIgZXJyID0gcGFyc2VBcmdzKCk7CiAgICAgICAgaWYgKGVycikgewogICAgICAgICAgc2hvd0NvbmZpcm0oY20sIGVyciArICc6ICcgKyBwYXJhbXMuYXJnU3RyaW5nKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdmFyIGxpbmVTdGFydCA9IHBhcmFtcy5saW5lIHx8IGNtLmZpcnN0TGluZSgpOwogICAgICAgIHZhciBsaW5lRW5kID0gcGFyYW1zLmxpbmVFbmQgfHwgcGFyYW1zLmxpbmUgfHwgY20ubGFzdExpbmUoKTsKICAgICAgICBpZiAobGluZVN0YXJ0ID09IGxpbmVFbmQpIHsgcmV0dXJuOyB9CiAgICAgICAgdmFyIGN1clN0YXJ0ID0gUG9zKGxpbmVTdGFydCwgMCk7CiAgICAgICAgdmFyIGN1ckVuZCA9IFBvcyhsaW5lRW5kLCBsaW5lTGVuZ3RoKGNtLCBsaW5lRW5kKSk7CiAgICAgICAgdmFyIHRleHQgPSBjbS5nZXRSYW5nZShjdXJTdGFydCwgY3VyRW5kKS5zcGxpdCgnXG4nKTsKICAgICAgICB2YXIgbnVtYmVyUmVnZXggPSAobnVtYmVyID09ICdkZWNpbWFsJykgPyAvKC0/KShbXGRdKykvIDoKICAgICAgICAgICAobnVtYmVyID09ICdoZXgnKSA/IC8oLT8pKD86MHgpPyhbMC05YS1mXSspL2kgOgogICAgICAgICAgIChudW1iZXIgPT0gJ29jdGFsJykgPyAvKFswLTddKykvIDogbnVsbDsKICAgICAgICB2YXIgcmFkaXggPSAobnVtYmVyID09ICdkZWNpbWFsJykgPyAxMCA6IChudW1iZXIgPT0gJ2hleCcpID8gMTYgOiAobnVtYmVyID09ICdvY3RhbCcpID8gOCA6IG51bGw7CiAgICAgICAgdmFyIG51bVBhcnQgPSBbXSwgdGV4dFBhcnQgPSBbXTsKICAgICAgICBpZiAobnVtYmVyKSB7CiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRleHQubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgaWYgKG51bWJlclJlZ2V4LmV4ZWModGV4dFtpXSkpIHsKICAgICAgICAgICAgICBudW1QYXJ0LnB1c2godGV4dFtpXSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgdGV4dFBhcnQucHVzaCh0ZXh0W2ldKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0ZXh0UGFydCA9IHRleHQ7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGNvbXBhcmVGbihhLCBiKSB7CiAgICAgICAgICBpZiAocmV2ZXJzZSkgeyB2YXIgdG1wOyB0bXAgPSBhOyBhID0gYjsgYiA9IHRtcDsgfQogICAgICAgICAgaWYgKGlnbm9yZUNhc2UpIHsgYSA9IGEudG9Mb3dlckNhc2UoKTsgYiA9IGIudG9Mb3dlckNhc2UoKTsgfQogICAgICAgICAgdmFyIGFudW0gPSBudW1iZXIgJiYgbnVtYmVyUmVnZXguZXhlYyhhKTsKICAgICAgICAgIHZhciBibnVtID0gbnVtYmVyICYmIG51bWJlclJlZ2V4LmV4ZWMoYik7CiAgICAgICAgICBpZiAoIWFudW0pIHsgcmV0dXJuIGEgPCBiID8gLTEgOiAxOyB9CiAgICAgICAgICBhbnVtID0gcGFyc2VJbnQoKGFudW1bMV0gKyBhbnVtWzJdKS50b0xvd2VyQ2FzZSgpLCByYWRpeCk7CiAgICAgICAgICBibnVtID0gcGFyc2VJbnQoKGJudW1bMV0gKyBibnVtWzJdKS50b0xvd2VyQ2FzZSgpLCByYWRpeCk7CiAgICAgICAgICByZXR1cm4gYW51bSAtIGJudW07CiAgICAgICAgfQogICAgICAgIG51bVBhcnQuc29ydChjb21wYXJlRm4pOwogICAgICAgIHRleHRQYXJ0LnNvcnQoY29tcGFyZUZuKTsKICAgICAgICB0ZXh0ID0gKCFyZXZlcnNlKSA/IHRleHRQYXJ0LmNvbmNhdChudW1QYXJ0KSA6IG51bVBhcnQuY29uY2F0KHRleHRQYXJ0KTsKICAgICAgICBpZiAodW5pcXVlKSB7IC8vIFJlbW92ZSBkdXBsaWNhdGUgbGluZXMKICAgICAgICAgIHZhciB0ZXh0T2xkID0gdGV4dDsKICAgICAgICAgIHZhciBsYXN0TGluZTsKICAgICAgICAgIHRleHQgPSBbXTsKICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGV4dE9sZC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBpZiAodGV4dE9sZFtpXSAhPSBsYXN0TGluZSkgewogICAgICAgICAgICAgIHRleHQucHVzaCh0ZXh0T2xkW2ldKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBsYXN0TGluZSA9IHRleHRPbGRbaV07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNtLnJlcGxhY2VSYW5nZSh0ZXh0LmpvaW4oJ1xuJyksIGN1clN0YXJ0LCBjdXJFbmQpOwogICAgICB9LAogICAgICBnbG9iYWw6IGZ1bmN0aW9uKGNtLCBwYXJhbXMpIHsKICAgICAgICAvLyBhIGdsb2JhbCBjb21tYW5kIGlzIG9mIHRoZSBmb3JtCiAgICAgICAgLy8gOltyYW5nZV1nL3BhdHRlcm4vW2NtZF0KICAgICAgICAvLyBhcmdTdHJpbmcgaG9sZHMgdGhlIHN0cmluZyAvcGF0dGVybi9bY21kXQogICAgICAgIHZhciBhcmdTdHJpbmcgPSBwYXJhbXMuYXJnU3RyaW5nOwogICAgICAgIGlmICghYXJnU3RyaW5nKSB7CiAgICAgICAgICBzaG93Q29uZmlybShjbSwgJ1JlZ3VsYXIgRXhwcmVzc2lvbiBtaXNzaW5nIGZyb20gZ2xvYmFsJyk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIC8vIHJhbmdlIGlzIHNwZWNpZmllZCBoZXJlCiAgICAgICAgdmFyIGxpbmVTdGFydCA9IChwYXJhbXMubGluZSAhPT0gdW5kZWZpbmVkKSA/IHBhcmFtcy5saW5lIDogY20uZmlyc3RMaW5lKCk7CiAgICAgICAgdmFyIGxpbmVFbmQgPSBwYXJhbXMubGluZUVuZCB8fCBwYXJhbXMubGluZSB8fCBjbS5sYXN0TGluZSgpOwogICAgICAgIC8vIGdldCB0aGUgdG9rZW5zIGZyb20gYXJnU3RyaW5nCiAgICAgICAgdmFyIHRva2VucyA9IHNwbGl0QnlTbGFzaChhcmdTdHJpbmcpOwogICAgICAgIHZhciByZWdleFBhcnQgPSBhcmdTdHJpbmcsIGNtZDsKICAgICAgICBpZiAodG9rZW5zLmxlbmd0aCkgewogICAgICAgICAgcmVnZXhQYXJ0ID0gdG9rZW5zWzBdOwogICAgICAgICAgY21kID0gdG9rZW5zLnNsaWNlKDEsIHRva2Vucy5sZW5ndGgpLmpvaW4oJy8nKTsKICAgICAgICB9CiAgICAgICAgaWYgKHJlZ2V4UGFydCkgewogICAgICAgICAgLy8gSWYgcmVnZXggcGFydCBpcyBlbXB0eSwgdGhlbiB1c2UgdGhlIHByZXZpb3VzIHF1ZXJ5LiBPdGhlcndpc2UKICAgICAgICAgIC8vIHVzZSB0aGUgcmVnZXggcGFydCBhcyB0aGUgbmV3IHF1ZXJ5LgogICAgICAgICAgdHJ5IHsKICAgICAgICAgICB1cGRhdGVTZWFyY2hRdWVyeShjbSwgcmVnZXhQYXJ0LCB0cnVlIC8qKiBpZ25vcmVDYXNlICovLAogICAgICAgICAgICAgdHJ1ZSAvKiogc21hcnRDYXNlICovKTsKICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICBzaG93Q29uZmlybShjbSwgJ0ludmFsaWQgcmVnZXg6ICcgKyByZWdleFBhcnQpOwogICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gbm93IHRoYXQgd2UgaGF2ZSB0aGUgcmVnZXhQYXJ0LCBzZWFyY2ggZm9yIHJlZ2V4IG1hdGNoZXMgaW4gdGhlCiAgICAgICAgLy8gc3BlY2lmaWVkIHJhbmdlIG9mIGxpbmVzCiAgICAgICAgdmFyIHF1ZXJ5ID0gZ2V0U2VhcmNoU3RhdGUoY20pLmdldFF1ZXJ5KCk7CiAgICAgICAgdmFyIG1hdGNoZWRMaW5lcyA9IFtdLCBjb250ZW50ID0gJyc7CiAgICAgICAgZm9yICh2YXIgaSA9IGxpbmVTdGFydDsgaSA8PSBsaW5lRW5kOyBpKyspIHsKICAgICAgICAgIHZhciBtYXRjaGVkID0gcXVlcnkudGVzdChjbS5nZXRMaW5lKGkpKTsKICAgICAgICAgIGlmIChtYXRjaGVkKSB7CiAgICAgICAgICAgIG1hdGNoZWRMaW5lcy5wdXNoKGkrMSk7CiAgICAgICAgICAgIGNvbnRlbnQrPSBjbS5nZXRMaW5lKGkpICsgJzxicj4nOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBpZiB0aGVyZSBpcyBubyBbY21kXSwganVzdCBkaXNwbGF5IHRoZSBsaXN0IG9mIG1hdGNoZWQgbGluZXMKICAgICAgICBpZiAoIWNtZCkgewogICAgICAgICAgc2hvd0NvbmZpcm0oY20sIGNvbnRlbnQpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB2YXIgaW5kZXggPSAwOwogICAgICAgIHZhciBuZXh0Q29tbWFuZCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgaWYgKGluZGV4IDwgbWF0Y2hlZExpbmVzLmxlbmd0aCkgewogICAgICAgICAgICB2YXIgY29tbWFuZCA9IG1hdGNoZWRMaW5lc1tpbmRleF0gKyBjbWQ7CiAgICAgICAgICAgIGV4Q29tbWFuZERpc3BhdGNoZXIucHJvY2Vzc0NvbW1hbmQoY20sIGNvbW1hbmQsIHsKICAgICAgICAgICAgICBjYWxsYmFjazogbmV4dENvbW1hbmQKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgICBpbmRleCsrOwogICAgICAgIH07CiAgICAgICAgbmV4dENvbW1hbmQoKTsKICAgICAgfSwKICAgICAgc3Vic3RpdHV0ZTogZnVuY3Rpb24oY20sIHBhcmFtcykgewogICAgICAgIGlmICghY20uZ2V0U2VhcmNoQ3Vyc29yKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NlYXJjaCBmZWF0dXJlIG5vdCBhdmFpbGFibGUuIFJlcXVpcmVzIHNlYXJjaGN1cnNvci5qcyBvciAnICsKICAgICAgICAgICAgICAnYW55IG90aGVyIGdldFNlYXJjaEN1cnNvciBpbXBsZW1lbnRhdGlvbi4nKTsKICAgICAgICB9CiAgICAgICAgdmFyIGFyZ1N0cmluZyA9IHBhcmFtcy5hcmdTdHJpbmc7CiAgICAgICAgdmFyIHRva2VucyA9IGFyZ1N0cmluZyA/IHNwbGl0QnlTbGFzaChhcmdTdHJpbmcpIDogW107CiAgICAgICAgdmFyIHJlZ2V4UGFydCwgcmVwbGFjZVBhcnQgPSAnJywgdHJhaWxpbmcsIGZsYWdzUGFydCwgY291bnQ7CiAgICAgICAgdmFyIGNvbmZpcm0gPSBmYWxzZTsgLy8gV2hldGhlciB0byBjb25maXJtIGVhY2ggcmVwbGFjZS4KICAgICAgICB2YXIgZ2xvYmFsID0gZmFsc2U7IC8vIFRydWUgdG8gcmVwbGFjZSBhbGwgaW5zdGFuY2VzIG9uIGEgbGluZSwgZmFsc2UgdG8gcmVwbGFjZSBvbmx5IDEuCiAgICAgICAgaWYgKHRva2Vucy5sZW5ndGgpIHsKICAgICAgICAgIHJlZ2V4UGFydCA9IHRva2Vuc1swXTsKICAgICAgICAgIHJlcGxhY2VQYXJ0ID0gdG9rZW5zWzFdOwogICAgICAgICAgaWYgKHJlcGxhY2VQYXJ0ICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgaWYgKGdldE9wdGlvbigncGNyZScpKSB7CiAgICAgICAgICAgICAgcmVwbGFjZVBhcnQgPSB1bmVzY2FwZVJlZ2V4UmVwbGFjZShyZXBsYWNlUGFydCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgcmVwbGFjZVBhcnQgPSB0cmFuc2xhdGVSZWdleFJlcGxhY2UocmVwbGFjZVBhcnQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZpbUdsb2JhbFN0YXRlLmxhc3RTdWJzdGl0dXRlUmVwbGFjZVBhcnQgPSByZXBsYWNlUGFydDsKICAgICAgICAgIH0KICAgICAgICAgIHRyYWlsaW5nID0gdG9rZW5zWzJdID8gdG9rZW5zWzJdLnNwbGl0KCcgJykgOiBbXTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gZWl0aGVyIHRoZSBhcmdTdHJpbmcgaXMgZW1wdHkgb3IgaXRzIG9mIHRoZSBmb3JtICcgaGVsbG8vd29ybGQnCiAgICAgICAgICAvLyBhY3R1YWxseSBzcGxpdEJ5U2xhc2ggcmV0dXJucyBhIGxpc3Qgb2YgdG9rZW5zCiAgICAgICAgICAvLyBvbmx5IGlmIHRoZSBzdHJpbmcgc3RhcnRzIHdpdGggYSAnLycKICAgICAgICAgIGlmIChhcmdTdHJpbmcgJiYgYXJnU3RyaW5nLmxlbmd0aCkgewogICAgICAgICAgICBzaG93Q29uZmlybShjbSwgJ1N1YnN0aXR1dGlvbnMgc2hvdWxkIGJlIG9mIHRoZSBmb3JtICcgKwogICAgICAgICAgICAgICAgJzpzL3BhdHRlcm4vcmVwbGFjZS8nKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBBZnRlciB0aGUgM3JkIHNsYXNoLCB3ZSBjYW4gaGF2ZSBmbGFncyBmb2xsb3dlZCBieSBhIHNwYWNlIGZvbGxvd2VkCiAgICAgICAgLy8gYnkgY291bnQuCiAgICAgICAgaWYgKHRyYWlsaW5nKSB7CiAgICAgICAgICBmbGFnc1BhcnQgPSB0cmFpbGluZ1swXTsKICAgICAgICAgIGNvdW50ID0gcGFyc2VJbnQodHJhaWxpbmdbMV0pOwogICAgICAgICAgaWYgKGZsYWdzUGFydCkgewogICAgICAgICAgICBpZiAoZmxhZ3NQYXJ0LmluZGV4T2YoJ2MnKSAhPSAtMSkgewogICAgICAgICAgICAgIGNvbmZpcm0gPSB0cnVlOwogICAgICAgICAgICAgIGZsYWdzUGFydC5yZXBsYWNlKCdjJywgJycpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChmbGFnc1BhcnQuaW5kZXhPZignZycpICE9IC0xKSB7CiAgICAgICAgICAgICAgZ2xvYmFsID0gdHJ1ZTsKICAgICAgICAgICAgICBmbGFnc1BhcnQucmVwbGFjZSgnZycsICcnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZWdleFBhcnQgPSByZWdleFBhcnQgKyAnLycgKyBmbGFnc1BhcnQ7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChyZWdleFBhcnQpIHsKICAgICAgICAgIC8vIElmIHJlZ2V4IHBhcnQgaXMgZW1wdHksIHRoZW4gdXNlIHRoZSBwcmV2aW91cyBxdWVyeS4gT3RoZXJ3aXNlIHVzZQogICAgICAgICAgLy8gdGhlIHJlZ2V4IHBhcnQgYXMgdGhlIG5ldyBxdWVyeS4KICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIHVwZGF0ZVNlYXJjaFF1ZXJ5KGNtLCByZWdleFBhcnQsIHRydWUgLyoqIGlnbm9yZUNhc2UgKi8sCiAgICAgICAgICAgICAgdHJ1ZSAvKiogc21hcnRDYXNlICovKTsKICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgc2hvd0NvbmZpcm0oY20sICdJbnZhbGlkIHJlZ2V4OiAnICsgcmVnZXhQYXJ0KTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXBsYWNlUGFydCA9IHJlcGxhY2VQYXJ0IHx8IHZpbUdsb2JhbFN0YXRlLmxhc3RTdWJzdGl0dXRlUmVwbGFjZVBhcnQ7CiAgICAgICAgaWYgKHJlcGxhY2VQYXJ0ID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgIHNob3dDb25maXJtKGNtLCAnTm8gcHJldmlvdXMgc3Vic3RpdHV0ZSByZWd1bGFyIGV4cHJlc3Npb24nKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdmFyIHN0YXRlID0gZ2V0U2VhcmNoU3RhdGUoY20pOwogICAgICAgIHZhciBxdWVyeSA9IHN0YXRlLmdldFF1ZXJ5KCk7CiAgICAgICAgdmFyIGxpbmVTdGFydCA9IChwYXJhbXMubGluZSAhPT0gdW5kZWZpbmVkKSA/IHBhcmFtcy5saW5lIDogY20uZ2V0Q3Vyc29yKCkubGluZTsKICAgICAgICB2YXIgbGluZUVuZCA9IHBhcmFtcy5saW5lRW5kIHx8IGxpbmVTdGFydDsKICAgICAgICBpZiAoY291bnQpIHsKICAgICAgICAgIGxpbmVTdGFydCA9IGxpbmVFbmQ7CiAgICAgICAgICBsaW5lRW5kID0gbGluZVN0YXJ0ICsgY291bnQgLSAxOwogICAgICAgIH0KICAgICAgICB2YXIgc3RhcnRQb3MgPSBjbGlwQ3Vyc29yVG9Db250ZW50KGNtLCBQb3MobGluZVN0YXJ0LCAwKSk7CiAgICAgICAgdmFyIGN1cnNvciA9IGNtLmdldFNlYXJjaEN1cnNvcihxdWVyeSwgc3RhcnRQb3MpOwogICAgICAgIGRvUmVwbGFjZShjbSwgY29uZmlybSwgZ2xvYmFsLCBsaW5lU3RhcnQsIGxpbmVFbmQsIGN1cnNvciwgcXVlcnksIHJlcGxhY2VQYXJ0LCBwYXJhbXMuY2FsbGJhY2spOwogICAgICB9LAogICAgICByZWRvOiBDb2RlTWlycm9yLmNvbW1hbmRzLnJlZG8sCiAgICAgIHVuZG86IENvZGVNaXJyb3IuY29tbWFuZHMudW5kbywKICAgICAgd3JpdGU6IGZ1bmN0aW9uKGNtKSB7CiAgICAgICAgaWYgKENvZGVNaXJyb3IuY29tbWFuZHMuc2F2ZSkgewogICAgICAgICAgLy8gSWYgYSBzYXZlIGNvbW1hbmQgaXMgZGVmaW5lZCwgY2FsbCBpdC4KICAgICAgICAgIENvZGVNaXJyb3IuY29tbWFuZHMuc2F2ZShjbSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIFNhdmVzIHRvIHRleHQgYXJlYSBpZiBubyBzYXZlIGNvbW1hbmQgaXMgZGVmaW5lZC4KICAgICAgICAgIGNtLnNhdmUoKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIG5vaGxzZWFyY2g6IGZ1bmN0aW9uKGNtKSB7CiAgICAgICAgY2xlYXJTZWFyY2hIaWdobGlnaHQoY20pOwogICAgICB9LAogICAgICBkZWxtYXJrczogZnVuY3Rpb24oY20sIHBhcmFtcykgewogICAgICAgIGlmICghcGFyYW1zLmFyZ1N0cmluZyB8fCAhdHJpbShwYXJhbXMuYXJnU3RyaW5nKSkgewogICAgICAgICAgc2hvd0NvbmZpcm0oY20sICdBcmd1bWVudCByZXF1aXJlZCcpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgdmFyIHN0YXRlID0gY20uc3RhdGUudmltOwogICAgICAgIHZhciBzdHJlYW0gPSBuZXcgQ29kZU1pcnJvci5TdHJpbmdTdHJlYW0odHJpbShwYXJhbXMuYXJnU3RyaW5nKSk7CiAgICAgICAgd2hpbGUgKCFzdHJlYW0uZW9sKCkpIHsKICAgICAgICAgIHN0cmVhbS5lYXRTcGFjZSgpOwoKICAgICAgICAgIC8vIFJlY29yZCB0aGUgc3RyZWFtcyBwb3NpdGlvbiBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsb29wIGZvciB1c2UKICAgICAgICAgIC8vIGluIGVycm9yIG1lc3NhZ2VzLgogICAgICAgICAgdmFyIGNvdW50ID0gc3RyZWFtLnBvczsKCiAgICAgICAgICBpZiAoIXN0cmVhbS5tYXRjaCgvW2EtekEtWl0vLCBmYWxzZSkpIHsKICAgICAgICAgICAgc2hvd0NvbmZpcm0oY20sICdJbnZhbGlkIGFyZ3VtZW50OiAnICsgcGFyYW1zLmFyZ1N0cmluZy5zdWJzdHJpbmcoY291bnQpKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQoKICAgICAgICAgIHZhciBzeW0gPSBzdHJlYW0ubmV4dCgpOwogICAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyBzeW1ib2wgaXMgcGFydCBvZiBhIHJhbmdlCiAgICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKCctJywgdHJ1ZSkpIHsKICAgICAgICAgICAgLy8gVGhpcyBzeW1ib2wgaXMgcGFydCBvZiBhIHJhbmdlLgoKICAgICAgICAgICAgLy8gVGhlIHJhbmdlIG11c3QgdGVybWluYXRlIGF0IGFuIGFscGhhYmV0aWMgY2hhcmFjdGVyLgogICAgICAgICAgICBpZiAoIXN0cmVhbS5tYXRjaCgvW2EtekEtWl0vLCBmYWxzZSkpIHsKICAgICAgICAgICAgICBzaG93Q29uZmlybShjbSwgJ0ludmFsaWQgYXJndW1lbnQ6ICcgKyBwYXJhbXMuYXJnU3RyaW5nLnN1YnN0cmluZyhjb3VudCkpOwogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdmFyIHN0YXJ0TWFyayA9IHN5bTsKICAgICAgICAgICAgdmFyIGZpbmlzaE1hcmsgPSBzdHJlYW0ubmV4dCgpOwogICAgICAgICAgICAvLyBUaGUgcmFuZ2UgbXVzdCB0ZXJtaW5hdGUgYXQgYW4gYWxwaGFiZXRpYyBjaGFyYWN0ZXIgd2hpY2gKICAgICAgICAgICAgLy8gc2hhcmVzIHRoZSBzYW1lIGNhc2UgYXMgdGhlIHN0YXJ0IG9mIHRoZSByYW5nZS4KICAgICAgICAgICAgaWYgKGlzTG93ZXJDYXNlKHN0YXJ0TWFyaykgJiYgaXNMb3dlckNhc2UoZmluaXNoTWFyaykgfHwKICAgICAgICAgICAgICAgIGlzVXBwZXJDYXNlKHN0YXJ0TWFyaykgJiYgaXNVcHBlckNhc2UoZmluaXNoTWFyaykpIHsKICAgICAgICAgICAgICB2YXIgc3RhcnQgPSBzdGFydE1hcmsuY2hhckNvZGVBdCgwKTsKICAgICAgICAgICAgICB2YXIgZmluaXNoID0gZmluaXNoTWFyay5jaGFyQ29kZUF0KDApOwogICAgICAgICAgICAgIGlmIChzdGFydCA+PSBmaW5pc2gpIHsKICAgICAgICAgICAgICAgIHNob3dDb25maXJtKGNtLCAnSW52YWxpZCBhcmd1bWVudDogJyArIHBhcmFtcy5hcmdTdHJpbmcuc3Vic3RyaW5nKGNvdW50KSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAvLyBCZWNhdXNlIG1hcmtzIGFyZSBhbHdheXMgQVNDSUkgdmFsdWVzLCBhbmQgd2UgaGF2ZQogICAgICAgICAgICAgIC8vIGRldGVybWluZWQgdGhhdCB0aGV5IGFyZSB0aGUgc2FtZSBjYXNlLCB3ZSBjYW4gdXNlCiAgICAgICAgICAgICAgLy8gdGhlaXIgY2hhciBjb2RlcyB0byBpdGVyYXRlIHRocm91Z2ggdGhlIGRlZmluZWQgcmFuZ2UuCiAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPD0gZmluaXNoIC0gc3RhcnQ7IGorKykgewogICAgICAgICAgICAgICAgdmFyIG1hcmsgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHN0YXJ0ICsgaik7CiAgICAgICAgICAgICAgICBkZWxldGUgc3RhdGUubWFya3NbbWFya107CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHNob3dDb25maXJtKGNtLCAnSW52YWxpZCBhcmd1bWVudDogJyArIHN0YXJ0TWFyayArICctJyk7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBUaGlzIHN5bWJvbCBpcyBhIHZhbGlkIG1hcmssIGFuZCBpcyBub3QgcGFydCBvZiBhIHJhbmdlLgogICAgICAgICAgICBkZWxldGUgc3RhdGUubWFya3Nbc3ltXTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH07CgogICAgdmFyIGV4Q29tbWFuZERpc3BhdGNoZXIgPSBuZXcgVmltLkV4Q29tbWFuZERpc3BhdGNoZXIoKTsKCiAgICAvKioKICAgICogQHBhcmFtIHtDb2RlTWlycm9yfSBjbSBDb2RlTWlycm9yIGluc3RhbmNlIHdlIGFyZSBpbi4KICAgICogQHBhcmFtIHtib29sZWFufSBjb25maXJtIFdoZXRoZXIgdG8gY29uZmlybSBlYWNoIHJlcGxhY2UuCiAgICAqIEBwYXJhbSB7Q3Vyc29yfSBsaW5lU3RhcnQgTGluZSB0byBzdGFydCByZXBsYWNpbmcgZnJvbS4KICAgICogQHBhcmFtIHtDdXJzb3J9IGxpbmVFbmQgTGluZSB0byBzdG9wIHJlcGxhY2luZyBhdC4KICAgICogQHBhcmFtIHtSZWdFeHB9IHF1ZXJ5IFF1ZXJ5IGZvciBwZXJmb3JtaW5nIG1hdGNoZXMgd2l0aC4KICAgICogQHBhcmFtIHtzdHJpbmd9IHJlcGxhY2VXaXRoIFRleHQgdG8gcmVwbGFjZSBtYXRjaGVzIHdpdGguIE1heSBjb250YWluICQxLAogICAgKiAgICAgJDIsIGV0YyBmb3IgcmVwbGFjaW5nIGNhcHR1cmVkIGdyb3VwcyB1c2luZyBKYXZhc2NyaXB0IHJlcGxhY2UuCiAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oKX0gY2FsbGJhY2sgQSBjYWxsYmFjayBmb3Igd2hlbiB0aGUgcmVwbGFjZSBpcyBkb25lLgogICAgKi8KICAgIGZ1bmN0aW9uIGRvUmVwbGFjZShjbSwgY29uZmlybSwgZ2xvYmFsLCBsaW5lU3RhcnQsIGxpbmVFbmQsIHNlYXJjaEN1cnNvciwgcXVlcnksCiAgICAgICAgcmVwbGFjZVdpdGgsIGNhbGxiYWNrKSB7CiAgICAgIC8vIFNldCB1cCBhbGwgdGhlIGZ1bmN0aW9ucy4KICAgICAgY20uc3RhdGUudmltLmV4TW9kZSA9IHRydWU7CiAgICAgIHZhciBkb25lID0gZmFsc2U7CiAgICAgIHZhciBsYXN0UG9zID0gc2VhcmNoQ3Vyc29yLmZyb20oKTsKICAgICAgZnVuY3Rpb24gcmVwbGFjZUFsbCgpIHsKICAgICAgICBjbS5vcGVyYXRpb24oZnVuY3Rpb24oKSB7CiAgICAgICAgICB3aGlsZSAoIWRvbmUpIHsKICAgICAgICAgICAgcmVwbGFjZSgpOwogICAgICAgICAgICBuZXh0KCk7CiAgICAgICAgICB9CiAgICAgICAgICBzdG9wKCk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gcmVwbGFjZSgpIHsKICAgICAgICB2YXIgdGV4dCA9IGNtLmdldFJhbmdlKHNlYXJjaEN1cnNvci5mcm9tKCksIHNlYXJjaEN1cnNvci50bygpKTsKICAgICAgICB2YXIgbmV3VGV4dCA9IHRleHQucmVwbGFjZShxdWVyeSwgcmVwbGFjZVdpdGgpOwogICAgICAgIHNlYXJjaEN1cnNvci5yZXBsYWNlKG5ld1RleHQpOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIG5leHQoKSB7CiAgICAgICAgdmFyIGZvdW5kOwogICAgICAgIC8vIFRoZSBiZWxvdyBvbmx5IGxvb3BzIHRvIHNraXAgb3ZlciBtdWx0aXBsZSBvY2N1cnJlbmNlcyBvbiB0aGUgc2FtZQogICAgICAgIC8vIGxpbmUgd2hlbiAnZ2xvYmFsJyBpcyBub3QgdHJ1ZS4KICAgICAgICB3aGlsZShmb3VuZCA9IHNlYXJjaEN1cnNvci5maW5kTmV4dCgpICYmCiAgICAgICAgICAgICAgaXNJblJhbmdlKHNlYXJjaEN1cnNvci5mcm9tKCksIGxpbmVTdGFydCwgbGluZUVuZCkpIHsKICAgICAgICAgIGlmICghZ2xvYmFsICYmIGxhc3RQb3MgJiYgc2VhcmNoQ3Vyc29yLmZyb20oKS5saW5lID09IGxhc3RQb3MubGluZSkgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIGNtLnNjcm9sbEludG9WaWV3KHNlYXJjaEN1cnNvci5mcm9tKCksIDMwKTsKICAgICAgICAgIGNtLnNldFNlbGVjdGlvbihzZWFyY2hDdXJzb3IuZnJvbSgpLCBzZWFyY2hDdXJzb3IudG8oKSk7CiAgICAgICAgICBsYXN0UG9zID0gc2VhcmNoQ3Vyc29yLmZyb20oKTsKICAgICAgICAgIGRvbmUgPSBmYWxzZTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgZG9uZSA9IHRydWU7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gc3RvcChjbG9zZSkgewogICAgICAgIGlmIChjbG9zZSkgeyBjbG9zZSgpOyB9CiAgICAgICAgY20uZm9jdXMoKTsKICAgICAgICBpZiAobGFzdFBvcykgewogICAgICAgICAgY20uc2V0Q3Vyc29yKGxhc3RQb3MpOwogICAgICAgICAgdmFyIHZpbSA9IGNtLnN0YXRlLnZpbTsKICAgICAgICAgIHZpbS5leE1vZGUgPSBmYWxzZTsKICAgICAgICAgIHZpbS5sYXN0SFBvcyA9IHZpbS5sYXN0SFNQb3MgPSBsYXN0UG9zLmNoOwogICAgICAgIH0KICAgICAgICBpZiAoY2FsbGJhY2spIHsgY2FsbGJhY2soKTsgfQogICAgICB9CiAgICAgIGZ1bmN0aW9uIG9uUHJvbXB0S2V5RG93bihlLCBfdmFsdWUsIGNsb3NlKSB7CiAgICAgICAgLy8gU3dhbGxvdyBhbGwga2V5cy4KICAgICAgICBDb2RlTWlycm9yLmVfc3RvcChlKTsKICAgICAgICB2YXIga2V5TmFtZSA9IENvZGVNaXJyb3Iua2V5TmFtZShlKTsKICAgICAgICBzd2l0Y2ggKGtleU5hbWUpIHsKICAgICAgICAgIGNhc2UgJ1knOgogICAgICAgICAgICByZXBsYWNlKCk7IG5leHQoKTsgYnJlYWs7CiAgICAgICAgICBjYXNlICdOJzoKICAgICAgICAgICAgbmV4dCgpOyBicmVhazsKICAgICAgICAgIGNhc2UgJ0EnOgogICAgICAgICAgICAvLyByZXBsYWNlQWxsIGNvbnRhaW5zIGEgY2FsbCB0byBjbG9zZSBvZiBpdHMgb3duLiBXZSBkb24ndCB3YW50IGl0CiAgICAgICAgICAgIC8vIHRvIGZpcmUgdG9vIGVhcmx5IG9yIG11bHRpcGxlIHRpbWVzLgogICAgICAgICAgICB2YXIgc2F2ZWRDYWxsYmFjayA9IGNhbGxiYWNrOwogICAgICAgICAgICBjYWxsYmFjayA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgY20ub3BlcmF0aW9uKHJlcGxhY2VBbGwpOwogICAgICAgICAgICBjYWxsYmFjayA9IHNhdmVkQ2FsbGJhY2s7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnTCc6CiAgICAgICAgICAgIHJlcGxhY2UoKTsKICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoIGFuZCBleGl0LgogICAgICAgICAgY2FzZSAnUSc6CiAgICAgICAgICBjYXNlICdFc2MnOgogICAgICAgICAgY2FzZSAnQ3RybC1DJzoKICAgICAgICAgIGNhc2UgJ0N0cmwtWyc6CiAgICAgICAgICAgIHN0b3AoY2xvc2UpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgaWYgKGRvbmUpIHsgc3RvcChjbG9zZSk7IH0KICAgICAgfQoKICAgICAgLy8gQWN0dWFsbHkgZG8gcmVwbGFjZS4KICAgICAgbmV4dCgpOwogICAgICBpZiAoZG9uZSkgewogICAgICAgIHNob3dDb25maXJtKGNtLCAnTm8gbWF0Y2hlcyBmb3IgJyArIHF1ZXJ5LnNvdXJjZSk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmICghY29uZmlybSkgewogICAgICAgIHJlcGxhY2VBbGwoKTsKICAgICAgICBpZiAoY2FsbGJhY2spIHsgY2FsbGJhY2soKTsgfTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgc2hvd1Byb21wdChjbSwgewogICAgICAgIHByZWZpeDogJ3JlcGxhY2Ugd2l0aCA8c3Ryb25nPicgKyByZXBsYWNlV2l0aCArICc8L3N0cm9uZz4gKHkvbi9hL3EvbCknLAogICAgICAgIG9uS2V5RG93bjogb25Qcm9tcHRLZXlEb3duCiAgICAgIH0pOwogICAgfQoKICAgIC8vIFJlZ2lzdGVyIFZpbSB3aXRoIENvZGVNaXJyb3IKICAgIGZ1bmN0aW9uIGJ1aWxkVmltS2V5TWFwKCkgewogICAgICAvKioKICAgICAgICogSGFuZGxlIHRoZSByYXcga2V5IGV2ZW50IGZyb20gQ29kZU1pcnJvci4gVHJhbnNsYXRlIHRoZQogICAgICAgKiBTaGlmdCArIGtleSBtb2RpZmllciB0byB0aGUgcmVzdWx0aW5nIGxldHRlciwgd2hpbGUgcHJlc2VydmluZyBvdGhlcgogICAgICAgKiBtb2RpZmVycy4KICAgICAgICovCiAgICAgIGZ1bmN0aW9uIGNtS2V5VG9WaW1LZXkoa2V5LCBtb2RpZmllcikgewogICAgICAgIHZhciB2aW1LZXkgPSBrZXk7CiAgICAgICAgaWYgKGlzVXBwZXJDYXNlKHZpbUtleSkgJiYgbW9kaWZpZXIgPT0gJ0N0cmwnKSB7CiAgICAgICAgICAgIHZpbUtleSA9IHZpbUtleS50b0xvd2VyQ2FzZSgpOwogICAgICAgIH0KICAgICAgICBpZiAobW9kaWZpZXIpIHsKICAgICAgICAgIC8vIFZpbSB3aWxsIHBhcnNlIG1vZGlmaWVyK2tleSBjb21iaW5hdGlvbiBhcyBhIHNpbmdsZSBrZXkuCiAgICAgICAgICB2aW1LZXkgPSBtb2RpZmllci5jaGFyQXQoMCkgKyAnLScgKyB2aW1LZXk7CiAgICAgICAgfQogICAgICAgIHZhciBzcGVjaWFsS2V5ID0gKHtFbnRlcjonQ1InLEJhY2tzcGFjZTonQlMnLERlbGV0ZTonRGVsJ30pW3ZpbUtleV07CiAgICAgICAgdmltS2V5ID0gc3BlY2lhbEtleSA/IHNwZWNpYWxLZXkgOiB2aW1LZXk7CiAgICAgICAgdmltS2V5ID0gdmltS2V5Lmxlbmd0aCA+IDEgPyAnPCcrIHZpbUtleSArICc+JyA6IHZpbUtleTsKICAgICAgICByZXR1cm4gdmltS2V5OwogICAgICB9CgogICAgICAvLyBDbG9zdXJlIHRvIGJpbmQgQ29kZU1pcnJvciwga2V5LCBtb2RpZmllci4KICAgICAgZnVuY3Rpb24ga2V5TWFwcGVyKHZpbUtleSkgewogICAgICAgIHJldHVybiBmdW5jdGlvbihjbSkgewogICAgICAgICAgQ29kZU1pcnJvci5zaWduYWwoY20sICd2aW0ta2V5cHJlc3MnLCB2aW1LZXkpOwogICAgICAgICAgQ29kZU1pcnJvci5WaW0uaGFuZGxlS2V5KGNtLCB2aW1LZXkpOwogICAgICAgIH07CiAgICAgIH0KCiAgICAgIHZhciBjbVRvVmltS2V5bWFwID0gewogICAgICAgICdub2ZhbGx0aHJvdWdoJzogdHJ1ZSwKICAgICAgICAnc3R5bGUnOiAnZmF0LWN1cnNvcicKICAgICAgfTsKICAgICAgZnVuY3Rpb24gYmluZEtleXMoa2V5cywgbW9kaWZpZXIpIHsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHZhciBrZXkgPSBrZXlzW2ldOwogICAgICAgICAgaWYgKCFtb2RpZmllciAmJiBrZXkubGVuZ3RoID09IDEpIHsKICAgICAgICAgICAgLy8gV3JhcCBhbGwga2V5cyB3aXRob3V0IG1vZGlmaWVycyB3aXRoICcnIHRvIGlkZW50aWZ5IHRoZW0gYnkgdGhlaXIKICAgICAgICAgICAgLy8ga2V5IGNoYXJhY3RlcnMgaW5zdGVhZCBvZiBrZXkgaWRlbnRpZmllcnMuCiAgICAgICAgICAgIGtleSA9ICInIiArIGtleSArICInIjsKICAgICAgICAgIH0KICAgICAgICAgIHZhciB2aW1LZXkgPSBjbUtleVRvVmltS2V5KGtleXNbaV0sIG1vZGlmaWVyKTsKICAgICAgICAgIHZhciBjbUtleSA9IG1vZGlmaWVyID8gbW9kaWZpZXIgKyAnLScgKyBrZXkgOiBrZXk7CiAgICAgICAgICBjbVRvVmltS2V5bWFwW2NtS2V5XSA9IGtleU1hcHBlcih2aW1LZXkpOwogICAgICAgIH0KICAgICAgfQogICAgICBiaW5kS2V5cyh1cHBlckNhc2VBbHBoYWJldCk7CiAgICAgIGJpbmRLZXlzKGxvd2VyQ2FzZUFscGhhYmV0KTsKICAgICAgYmluZEtleXModXBwZXJDYXNlQWxwaGFiZXQsICdDdHJsJyk7CiAgICAgIGJpbmRLZXlzKHNwZWNpYWxTeW1ib2xzKTsKICAgICAgYmluZEtleXMoc3BlY2lhbFN5bWJvbHMsICdDdHJsJyk7CiAgICAgIGJpbmRLZXlzKG51bWJlcnMpOwogICAgICBiaW5kS2V5cyhudW1iZXJzLCAnQ3RybCcpOwogICAgICBiaW5kS2V5cyhzcGVjaWFsS2V5cyk7CiAgICAgIGJpbmRLZXlzKHNwZWNpYWxLZXlzLCAnQ3RybCcpOwogICAgICByZXR1cm4gY21Ub1ZpbUtleW1hcDsKICAgIH0KICAgIENvZGVNaXJyb3Iua2V5TWFwLnZpbSA9IGJ1aWxkVmltS2V5TWFwKCk7CgogICAgZnVuY3Rpb24gZXhpdEluc2VydE1vZGUoY20pIHsKICAgICAgdmFyIHZpbSA9IGNtLnN0YXRlLnZpbTsKICAgICAgdmFyIG1hY3JvTW9kZVN0YXRlID0gdmltR2xvYmFsU3RhdGUubWFjcm9Nb2RlU3RhdGU7CiAgICAgIHZhciBpbnNlcnRNb2RlQ2hhbmdlUmVnaXN0ZXIgPSB2aW1HbG9iYWxTdGF0ZS5yZWdpc3RlckNvbnRyb2xsZXIuZ2V0UmVnaXN0ZXIoJy4nKTsKICAgICAgdmFyIGlzUGxheWluZyA9IG1hY3JvTW9kZVN0YXRlLmlzUGxheWluZzsKICAgICAgaWYgKCFpc1BsYXlpbmcpIHsKICAgICAgICBjbS5vZmYoJ2NoYW5nZScsIG9uQ2hhbmdlKTsKICAgICAgICBDb2RlTWlycm9yLm9mZihjbS5nZXRJbnB1dEZpZWxkKCksICdrZXlkb3duJywgb25LZXlFdmVudFRhcmdldEtleURvd24pOwogICAgICB9CiAgICAgIGlmICghaXNQbGF5aW5nICYmIHZpbS5pbnNlcnRNb2RlUmVwZWF0ID4gMSkgewogICAgICAgIC8vIFBlcmZvcm0gaW5zZXJ0IG1vZGUgcmVwZWF0IGZvciBjb21tYW5kcyBsaWtlIDMsYSBhbmQgMyxvLgogICAgICAgIHJlcGVhdExhc3RFZGl0KGNtLCB2aW0sIHZpbS5pbnNlcnRNb2RlUmVwZWF0IC0gMSwKICAgICAgICAgICAgdHJ1ZSAvKiogcmVwZWF0Rm9ySW5zZXJ0ICovKTsKICAgICAgICB2aW0ubGFzdEVkaXRJbnB1dFN0YXRlLnJlcGVhdE92ZXJyaWRlID0gdmltLmluc2VydE1vZGVSZXBlYXQ7CiAgICAgIH0KICAgICAgZGVsZXRlIHZpbS5pbnNlcnRNb2RlUmVwZWF0OwogICAgICB2aW0uaW5zZXJ0TW9kZSA9IGZhbHNlOwogICAgICBjbS5zZXRDdXJzb3IoY20uZ2V0Q3Vyc29yKCkubGluZSwgY20uZ2V0Q3Vyc29yKCkuY2gtMSk7CiAgICAgIGNtLnNldE9wdGlvbigna2V5TWFwJywgJ3ZpbScpOwogICAgICBjbS5zZXRPcHRpb24oJ2Rpc2FibGVJbnB1dCcsIHRydWUpOwogICAgICBjbS50b2dnbGVPdmVyd3JpdGUoZmFsc2UpOyAvLyBleGl0IHJlcGxhY2UgbW9kZSBpZiB3ZSB3ZXJlIGluIGl0LgogICAgICAvLyB1cGRhdGUgdGhlICIuIHJlZ2lzdGVyIGJlZm9yZSBleGl0aW5nIGluc2VydCBtb2RlCiAgICAgIGluc2VydE1vZGVDaGFuZ2VSZWdpc3Rlci5zZXRUZXh0KG1hY3JvTW9kZVN0YXRlLmxhc3RJbnNlcnRNb2RlQ2hhbmdlcy5jaGFuZ2VzLmpvaW4oJycpKTsKICAgICAgQ29kZU1pcnJvci5zaWduYWwoY20sICJ2aW0tbW9kZS1jaGFuZ2UiLCB7bW9kZTogIm5vcm1hbCJ9KTsKICAgICAgaWYgKG1hY3JvTW9kZVN0YXRlLmlzUmVjb3JkaW5nKSB7CiAgICAgICAgbG9nSW5zZXJ0TW9kZUNoYW5nZShtYWNyb01vZGVTdGF0ZSk7CiAgICAgIH0KICAgIH0KCiAgICBDb2RlTWlycm9yLmtleU1hcFsndmltLWluc2VydCddID0gewogICAgICAvLyBUT0RPOiBvdmVycmlkZSBuYXZpZ2F0aW9uIGtleXMgc28gdGhhdCBFc2Mgd2lsbCBjYW5jZWwgYXV0b21hdGljCiAgICAgIC8vIGluZGVudGF0aW9uIGZyb20gbywgTywgaV88Q1I+CiAgICAgICdFc2MnOiBleGl0SW5zZXJ0TW9kZSwKICAgICAgJ0N0cmwtWyc6IGV4aXRJbnNlcnRNb2RlLAogICAgICAnQ3RybC1DJzogZXhpdEluc2VydE1vZGUsCiAgICAgICdDdHJsLU4nOiAnYXV0b2NvbXBsZXRlJywKICAgICAgJ0N0cmwtUCc6ICdhdXRvY29tcGxldGUnLAogICAgICAnRW50ZXInOiBmdW5jdGlvbihjbSkgewogICAgICAgIHZhciBmbiA9IENvZGVNaXJyb3IuY29tbWFuZHMubmV3bGluZUFuZEluZGVudENvbnRpbnVlQ29tbWVudCB8fAogICAgICAgICAgICBDb2RlTWlycm9yLmNvbW1hbmRzLm5ld2xpbmVBbmRJbmRlbnQ7CiAgICAgICAgZm4oY20pOwogICAgICB9LAogICAgICBmYWxsdGhyb3VnaDogWydkZWZhdWx0J10KICAgIH07CgogICAgQ29kZU1pcnJvci5rZXlNYXBbJ3ZpbS1yZXBsYWNlJ10gPSB7CiAgICAgICdCYWNrc3BhY2UnOiAnZ29DaGFyTGVmdCcsCiAgICAgIGZhbGx0aHJvdWdoOiBbJ3ZpbS1pbnNlcnQnXQogICAgfTsKCiAgICBmdW5jdGlvbiBleGVjdXRlTWFjcm9SZWdpc3RlcihjbSwgdmltLCBtYWNyb01vZGVTdGF0ZSwgcmVnaXN0ZXJOYW1lKSB7CiAgICAgIHZhciByZWdpc3RlciA9IHZpbUdsb2JhbFN0YXRlLnJlZ2lzdGVyQ29udHJvbGxlci5nZXRSZWdpc3RlcihyZWdpc3Rlck5hbWUpOwogICAgICB2YXIga2V5QnVmZmVyID0gcmVnaXN0ZXIua2V5QnVmZmVyOwogICAgICB2YXIgaW1jID0gMDsKICAgICAgbWFjcm9Nb2RlU3RhdGUuaXNQbGF5aW5nID0gdHJ1ZTsKICAgICAgbWFjcm9Nb2RlU3RhdGUucmVwbGF5U2VhcmNoUXVlcmllcyA9IHJlZ2lzdGVyLnNlYXJjaFF1ZXJpZXMuc2xpY2UoMCk7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5QnVmZmVyLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIHRleHQgPSBrZXlCdWZmZXJbaV07CiAgICAgICAgdmFyIG1hdGNoLCBrZXk7CiAgICAgICAgd2hpbGUgKHRleHQpIHsKICAgICAgICAgIC8vIFB1bGwgb2ZmIG9uZSBjb21tYW5kIGtleSwgd2hpY2ggaXMgZWl0aGVyIGEgc2luZ2xlIGNoYXJhY3RlcgogICAgICAgICAgLy8gb3IgYSBzcGVjaWFsIHNlcXVlbmNlIHdyYXBwZWQgaW4gJzwnIGFuZCAnPicsIGUuZy4gJzxTcGFjZT4nLgogICAgICAgICAgbWF0Y2ggPSAoLzxcdystLis/Pnw8XHcrPnwuLykuZXhlYyh0ZXh0KTsKICAgICAgICAgIGtleSA9IG1hdGNoWzBdOwogICAgICAgICAgdGV4dCA9IHRleHQuc3Vic3RyaW5nKG1hdGNoLmluZGV4ICsga2V5Lmxlbmd0aCk7CiAgICAgICAgICBDb2RlTWlycm9yLlZpbS5oYW5kbGVLZXkoY20sIGtleSk7CiAgICAgICAgICBpZiAodmltLmluc2VydE1vZGUpIHsKICAgICAgICAgICAgdmFyIGNoYW5nZXMgPSByZWdpc3Rlci5pbnNlcnRNb2RlQ2hhbmdlc1tpbWMrK10uY2hhbmdlczsKICAgICAgICAgICAgdmltR2xvYmFsU3RhdGUubWFjcm9Nb2RlU3RhdGUubGFzdEluc2VydE1vZGVDaGFuZ2VzLmNoYW5nZXMgPQogICAgICAgICAgICAgICAgY2hhbmdlczsKICAgICAgICAgICAgcmVwZWF0SW5zZXJ0TW9kZUNoYW5nZXMoY20sIGNoYW5nZXMsIDEpOwogICAgICAgICAgICBleGl0SW5zZXJ0TW9kZShjbSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9OwogICAgICBtYWNyb01vZGVTdGF0ZS5pc1BsYXlpbmcgPSBmYWxzZTsKICAgIH0KCiAgICBmdW5jdGlvbiBsb2dLZXkobWFjcm9Nb2RlU3RhdGUsIGtleSkgewogICAgICBpZiAobWFjcm9Nb2RlU3RhdGUuaXNQbGF5aW5nKSB7IHJldHVybjsgfQogICAgICB2YXIgcmVnaXN0ZXJOYW1lID0gbWFjcm9Nb2RlU3RhdGUubGF0ZXN0UmVnaXN0ZXI7CiAgICAgIHZhciByZWdpc3RlciA9IHZpbUdsb2JhbFN0YXRlLnJlZ2lzdGVyQ29udHJvbGxlci5nZXRSZWdpc3RlcihyZWdpc3Rlck5hbWUpOwogICAgICBpZiAocmVnaXN0ZXIpIHsKICAgICAgICByZWdpc3Rlci5wdXNoVGV4dChrZXkpOwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gbG9nSW5zZXJ0TW9kZUNoYW5nZShtYWNyb01vZGVTdGF0ZSkgewogICAgICBpZiAobWFjcm9Nb2RlU3RhdGUuaXNQbGF5aW5nKSB7IHJldHVybjsgfQogICAgICB2YXIgcmVnaXN0ZXJOYW1lID0gbWFjcm9Nb2RlU3RhdGUubGF0ZXN0UmVnaXN0ZXI7CiAgICAgIHZhciByZWdpc3RlciA9IHZpbUdsb2JhbFN0YXRlLnJlZ2lzdGVyQ29udHJvbGxlci5nZXRSZWdpc3RlcihyZWdpc3Rlck5hbWUpOwogICAgICBpZiAocmVnaXN0ZXIpIHsKICAgICAgICByZWdpc3Rlci5wdXNoSW5zZXJ0TW9kZUNoYW5nZXMobWFjcm9Nb2RlU3RhdGUubGFzdEluc2VydE1vZGVDaGFuZ2VzKTsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGxvZ1NlYXJjaFF1ZXJ5KG1hY3JvTW9kZVN0YXRlLCBxdWVyeSkgewogICAgICBpZiAobWFjcm9Nb2RlU3RhdGUuaXNQbGF5aW5nKSB7IHJldHVybjsgfQogICAgICB2YXIgcmVnaXN0ZXJOYW1lID0gbWFjcm9Nb2RlU3RhdGUubGF0ZXN0UmVnaXN0ZXI7CiAgICAgIHZhciByZWdpc3RlciA9IHZpbUdsb2JhbFN0YXRlLnJlZ2lzdGVyQ29udHJvbGxlci5nZXRSZWdpc3RlcihyZWdpc3Rlck5hbWUpOwogICAgICBpZiAocmVnaXN0ZXIpIHsKICAgICAgICByZWdpc3Rlci5wdXNoU2VhcmNoUXVlcnkocXVlcnkpOwogICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBMaXN0ZW5zIGZvciBjaGFuZ2VzIG1hZGUgaW4gaW5zZXJ0IG1vZGUuCiAgICAgKiBTaG91bGQgb25seSBiZSBhY3RpdmUgaW4gaW5zZXJ0IG1vZGUuCiAgICAgKi8KICAgIGZ1bmN0aW9uIG9uQ2hhbmdlKF9jbSwgY2hhbmdlT2JqKSB7CiAgICAgIHZhciBtYWNyb01vZGVTdGF0ZSA9IHZpbUdsb2JhbFN0YXRlLm1hY3JvTW9kZVN0YXRlOwogICAgICB2YXIgbGFzdENoYW5nZSA9IG1hY3JvTW9kZVN0YXRlLmxhc3RJbnNlcnRNb2RlQ2hhbmdlczsKICAgICAgaWYgKCFtYWNyb01vZGVTdGF0ZS5pc1BsYXlpbmcpIHsKICAgICAgICB3aGlsZShjaGFuZ2VPYmopIHsKICAgICAgICAgIGxhc3RDaGFuZ2UuZXhwZWN0Q3Vyc29yQWN0aXZpdHlGb3JDaGFuZ2UgPSB0cnVlOwogICAgICAgICAgaWYgKGNoYW5nZU9iai5vcmlnaW4gPT0gJytpbnB1dCcgfHwgY2hhbmdlT2JqLm9yaWdpbiA9PSAncGFzdGUnCiAgICAgICAgICAgICAgfHwgY2hhbmdlT2JqLm9yaWdpbiA9PT0gdW5kZWZpbmVkIC8qIG9ubHkgaW4gdGVzdGluZyAqLykgewogICAgICAgICAgICB2YXIgdGV4dCA9IGNoYW5nZU9iai50ZXh0LmpvaW4oJ1xuJyk7CiAgICAgICAgICAgIGxhc3RDaGFuZ2UuY2hhbmdlcy5wdXNoKHRleHQpOwogICAgICAgICAgfQogICAgICAgICAgLy8gQ2hhbmdlIG9iamVjdHMgbWF5IGJlIGNoYWluZWQgd2l0aCBuZXh0LgogICAgICAgICAgY2hhbmdlT2JqID0gY2hhbmdlT2JqLm5leHQ7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLyoqCiAgICAqIExpc3RlbnMgZm9yIGFueSBraW5kIG9mIGN1cnNvciBhY3Rpdml0eSBvbiBDb2RlTWlycm9yLgogICAgKi8KICAgIGZ1bmN0aW9uIG9uQ3Vyc29yQWN0aXZpdHkoY20pIHsKICAgICAgdmFyIHZpbSA9IGNtLnN0YXRlLnZpbTsKICAgICAgaWYgKHZpbS5pbnNlcnRNb2RlKSB7CiAgICAgICAgLy8gVHJhY2tpbmcgY3Vyc29yIGFjdGl2aXR5IGluIGluc2VydCBtb2RlIChmb3IgbWFjcm8gc3VwcG9ydCkuCiAgICAgICAgdmFyIG1hY3JvTW9kZVN0YXRlID0gdmltR2xvYmFsU3RhdGUubWFjcm9Nb2RlU3RhdGU7CiAgICAgICAgaWYgKG1hY3JvTW9kZVN0YXRlLmlzUGxheWluZykgeyByZXR1cm47IH0KICAgICAgICB2YXIgbGFzdENoYW5nZSA9IG1hY3JvTW9kZVN0YXRlLmxhc3RJbnNlcnRNb2RlQ2hhbmdlczsKICAgICAgICBpZiAobGFzdENoYW5nZS5leHBlY3RDdXJzb3JBY3Rpdml0eUZvckNoYW5nZSkgewogICAgICAgICAgbGFzdENoYW5nZS5leHBlY3RDdXJzb3JBY3Rpdml0eUZvckNoYW5nZSA9IGZhbHNlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvLyBDdXJzb3IgbW92ZWQgb3V0c2lkZSB0aGUgY29udGV4dCBvZiBhbiBlZGl0LiBSZXNldCB0aGUgY2hhbmdlLgogICAgICAgICAgbGFzdENoYW5nZS5jaGFuZ2VzID0gW107CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGNtLmRvYy5oaXN0b3J5Lmxhc3RTZWxPcmlnaW4gPT0gJyptb3VzZScpIHsKICAgICAgICAvLyBSZXNldCBsYXN0SFBvcyBpZiBtb3VzZSBjbGljayB3YXMgZG9uZSBpbiBub3JtYWwgbW9kZS4KICAgICAgICB2aW0ubGFzdEhQb3MgPSBjbS5kb2MuZ2V0Q3Vyc29yKCkuY2g7CiAgICAgICAgaWYgKGNtLnNvbWV0aGluZ1NlbGVjdGVkKCkpIHsKICAgICAgICAgIC8vIElmIHNvbWV0aGluZyBpcyBzdGlsbCBzZWxlY3RlZCwgZW50ZXIgdmlzdWFsIG1vZGUuCiAgICAgICAgICB2aW0udmlzdWFsTW9kZSA9IHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICh2aW0udmlzdWFsTW9kZSkgewogICAgICAgIHZhciBmcm9tLCBoZWFkOwogICAgICAgIGZyb20gPSBoZWFkID0gY20uZ2V0Q3Vyc29yKCdoZWFkJyk7CiAgICAgICAgdmFyIGFuY2hvciA9IGNtLmdldEN1cnNvcignYW5jaG9yJyk7CiAgICAgICAgdmFyIHRvID0gUG9zKGhlYWQubGluZSwgZnJvbS5jaCArIChjdXJzb3JJc0JlZm9yZShhbmNob3IsIGhlYWQpID8gLTEgOiAxKSk7CiAgICAgICAgaWYgKGN1cnNvcklzQmVmb3JlKHRvLCBmcm9tKSkgewogICAgICAgICAgdmFyIHRlbXAgPSBmcm9tOwogICAgICAgICAgZnJvbSA9IHRvOwogICAgICAgICAgdG8gPSB0ZW1wOwogICAgICAgIH0KICAgICAgICBpZiAodmltLmZha2VDdXJzb3IpIHsKICAgICAgICAgIHZpbS5mYWtlQ3Vyc29yLmNsZWFyKCk7CiAgICAgICAgfQogICAgICAgIHZpbS5mYWtlQ3Vyc29yID0gY20ubWFya1RleHQoZnJvbSwgdG8sIHtjbGFzc05hbWU6ICdjbS1hbmltYXRlLWZhdC1jdXJzb3InfSk7CiAgICAgIH0KICAgIH0KCiAgICAvKiogV3JhcHBlciBmb3Igc3BlY2lhbCBrZXlzIHByZXNzZWQgaW4gaW5zZXJ0IG1vZGUgKi8KICAgIGZ1bmN0aW9uIEluc2VydE1vZGVLZXkoa2V5TmFtZSkgewogICAgICB0aGlzLmtleU5hbWUgPSBrZXlOYW1lOwogICAgfQoKICAgIC8qKgogICAgKiBIYW5kbGVzIHJhdyBrZXkgZG93biBldmVudHMgZnJvbSB0aGUgdGV4dCBhcmVhLgogICAgKiAtIFNob3VsZCBvbmx5IGJlIGFjdGl2ZSBpbiBpbnNlcnQgbW9kZS4KICAgICogLSBGb3IgcmVjb3JkaW5nIGRlbGV0ZXMgaW4gaW5zZXJ0IG1vZGUuCiAgICAqLwogICAgZnVuY3Rpb24gb25LZXlFdmVudFRhcmdldEtleURvd24oZSkgewogICAgICB2YXIgbWFjcm9Nb2RlU3RhdGUgPSB2aW1HbG9iYWxTdGF0ZS5tYWNyb01vZGVTdGF0ZTsKICAgICAgdmFyIGxhc3RDaGFuZ2UgPSBtYWNyb01vZGVTdGF0ZS5sYXN0SW5zZXJ0TW9kZUNoYW5nZXM7CiAgICAgIHZhciBrZXlOYW1lID0gQ29kZU1pcnJvci5rZXlOYW1lKGUpOwogICAgICBmdW5jdGlvbiBvbktleUZvdW5kKCkgewogICAgICAgIGxhc3RDaGFuZ2UuY2hhbmdlcy5wdXNoKG5ldyBJbnNlcnRNb2RlS2V5KGtleU5hbWUpKTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBpZiAoa2V5TmFtZS5pbmRleE9mKCdEZWxldGUnKSAhPSAtMSB8fCBrZXlOYW1lLmluZGV4T2YoJ0JhY2tzcGFjZScpICE9IC0xKSB7CiAgICAgICAgQ29kZU1pcnJvci5sb29rdXBLZXkoa2V5TmFtZSwgWyd2aW0taW5zZXJ0J10sIG9uS2V5Rm91bmQpOwogICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXBlYXRzIHRoZSBsYXN0IGVkaXQsIHdoaWNoIGluY2x1ZGVzIGV4YWN0bHkgMSBjb21tYW5kIGFuZCBhdCBtb3N0IDEKICAgICAqIGluc2VydC4gT3BlcmF0b3IgYW5kIG1vdGlvbiBjb21tYW5kcyBhcmUgcmVhZCBmcm9tIGxhc3RFZGl0SW5wdXRTdGF0ZSwKICAgICAqIHdoaWxlIGFjdGlvbiBjb21tYW5kcyBhcmUgcmVhZCBmcm9tIGxhc3RFZGl0QWN0aW9uQ29tbWFuZC4KICAgICAqCiAgICAgKiBJZiByZXBlYXRGb3JJbnNlcnQgaXMgdHJ1ZSwgdGhlbiB0aGUgZnVuY3Rpb24gd2FzIGNhbGxlZCBieQogICAgICogZXhpdEluc2VydE1vZGUgdG8gcmVwZWF0IHRoZSBpbnNlcnQgbW9kZSBjaGFuZ2VzIHRoZSB1c2VyIGp1c3QgbWFkZS4gVGhlCiAgICAgKiBjb3JyZXNwb25kaW5nIGVudGVySW5zZXJ0TW9kZSBjYWxsIHdhcyBtYWRlIHdpdGggYSBjb3VudC4KICAgICAqLwogICAgZnVuY3Rpb24gcmVwZWF0TGFzdEVkaXQoY20sIHZpbSwgcmVwZWF0LCByZXBlYXRGb3JJbnNlcnQpIHsKICAgICAgdmFyIG1hY3JvTW9kZVN0YXRlID0gdmltR2xvYmFsU3RhdGUubWFjcm9Nb2RlU3RhdGU7CiAgICAgIG1hY3JvTW9kZVN0YXRlLmlzUGxheWluZyA9IHRydWU7CiAgICAgIHZhciBpc0FjdGlvbiA9ICEhdmltLmxhc3RFZGl0QWN0aW9uQ29tbWFuZDsKICAgICAgdmFyIGNhY2hlZElucHV0U3RhdGUgPSB2aW0uaW5wdXRTdGF0ZTsKICAgICAgZnVuY3Rpb24gcmVwZWF0Q29tbWFuZCgpIHsKICAgICAgICBpZiAoaXNBY3Rpb24pIHsKICAgICAgICAgIGNvbW1hbmREaXNwYXRjaGVyLnByb2Nlc3NBY3Rpb24oY20sIHZpbSwgdmltLmxhc3RFZGl0QWN0aW9uQ29tbWFuZCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbW1hbmREaXNwYXRjaGVyLmV2YWxJbnB1dChjbSwgdmltKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZnVuY3Rpb24gcmVwZWF0SW5zZXJ0KHJlcGVhdCkgewogICAgICAgIGlmIChtYWNyb01vZGVTdGF0ZS5sYXN0SW5zZXJ0TW9kZUNoYW5nZXMuY2hhbmdlcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAvLyBGb3Igc29tZSByZWFzb24sIHJlcGVhdCBjdyBpbiBkZXNrdG9wIFZJTSBkb2VzIG5vdCByZXBlYXQKICAgICAgICAgIC8vIGluc2VydCBtb2RlIGNoYW5nZXMuIFdpbGwgY29uZm9ybSB0byB0aGF0IGJlaGF2aW9yLgogICAgICAgICAgcmVwZWF0ID0gIXZpbS5sYXN0RWRpdEFjdGlvbkNvbW1hbmQgPyAxIDogcmVwZWF0OwogICAgICAgICAgdmFyIGNoYW5nZU9iamVjdCA9IG1hY3JvTW9kZVN0YXRlLmxhc3RJbnNlcnRNb2RlQ2hhbmdlczsKICAgICAgICAgIC8vIFRoaXMgaXNuJ3Qgc3RyaWN0bHkgbmVjZXNzYXJ5LCBidXQgc2luY2UgbGFzdEluc2VydE1vZGVDaGFuZ2VzIGlzCiAgICAgICAgICAvLyBzdXBwb3NlZCB0byBiZSBpbW11dGFibGUgZHVyaW5nIHJlcGxheSwgdGhpcyBoZWxwcyBjYXRjaCBidWdzLgogICAgICAgICAgbWFjcm9Nb2RlU3RhdGUubGFzdEluc2VydE1vZGVDaGFuZ2VzID0ge307CiAgICAgICAgICByZXBlYXRJbnNlcnRNb2RlQ2hhbmdlcyhjbSwgY2hhbmdlT2JqZWN0LmNoYW5nZXMsIHJlcGVhdCk7CiAgICAgICAgICBtYWNyb01vZGVTdGF0ZS5sYXN0SW5zZXJ0TW9kZUNoYW5nZXMgPSBjaGFuZ2VPYmplY3Q7CiAgICAgICAgfQogICAgICB9CiAgICAgIHZpbS5pbnB1dFN0YXRlID0gdmltLmxhc3RFZGl0SW5wdXRTdGF0ZTsKICAgICAgaWYgKGlzQWN0aW9uICYmIHZpbS5sYXN0RWRpdEFjdGlvbkNvbW1hbmQuaW50ZXJsYWNlSW5zZXJ0UmVwZWF0KSB7CiAgICAgICAgLy8gbyBhbmQgTyByZXBlYXQgaGF2ZSB0byBiZSBpbnRlcmxhY2VkIHdpdGggaW5zZXJ0IHJlcGVhdHMgc28gdGhhdCB0aGUKICAgICAgICAvLyBpbnNlcnRpb25zIGFwcGVhciBvbiBzZXBhcmF0ZSBsaW5lcyBpbnN0ZWFkIG9mIHRoZSBsYXN0IGxpbmUuCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXBlYXQ7IGkrKykgewogICAgICAgICAgcmVwZWF0Q29tbWFuZCgpOwogICAgICAgICAgcmVwZWF0SW5zZXJ0KDEpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoIXJlcGVhdEZvckluc2VydCkgewogICAgICAgICAgLy8gSGFjayB0byBnZXQgdGhlIGN1cnNvciB0byBlbmQgdXAgYXQgdGhlIHJpZ2h0IHBsYWNlLiBJZiBJIGlzCiAgICAgICAgICAvLyByZXBlYXRlZCBpbiBpbnNlcnQgbW9kZSByZXBlYXQsIGN1cnNvciB3aWxsIGJlIDEgaW5zZXJ0CiAgICAgICAgICAvLyBjaGFuZ2Ugc2V0IGxlZnQgb2Ygd2hlcmUgaXQgc2hvdWxkIGJlLgogICAgICAgICAgcmVwZWF0Q29tbWFuZCgpOwogICAgICAgIH0KICAgICAgICByZXBlYXRJbnNlcnQocmVwZWF0KTsKICAgICAgfQogICAgICB2aW0uaW5wdXRTdGF0ZSA9IGNhY2hlZElucHV0U3RhdGU7CiAgICAgIGlmICh2aW0uaW5zZXJ0TW9kZSAmJiAhcmVwZWF0Rm9ySW5zZXJ0KSB7CiAgICAgICAgLy8gRG9uJ3QgZXhpdCBpbnNlcnQgbW9kZSB0d2ljZS4gSWYgcmVwZWF0Rm9ySW5zZXJ0IGlzIHNldCwgdGhlbiB3ZQogICAgICAgIC8vIHdlcmUgY2FsbGVkIGJ5IGFuIGV4aXRJbnNlcnRNb2RlIGNhbGwgbG93ZXIgb24gdGhlIHN0YWNrLgogICAgICAgIGV4aXRJbnNlcnRNb2RlKGNtKTsKICAgICAgfQogICAgICBtYWNyb01vZGVTdGF0ZS5pc1BsYXlpbmcgPSBmYWxzZTsKICAgIH07CgogICAgZnVuY3Rpb24gcmVwZWF0SW5zZXJ0TW9kZUNoYW5nZXMoY20sIGNoYW5nZXMsIHJlcGVhdCkgewogICAgICBmdW5jdGlvbiBrZXlIYW5kbGVyKGJpbmRpbmcpIHsKICAgICAgICBpZiAodHlwZW9mIGJpbmRpbmcgPT0gJ3N0cmluZycpIHsKICAgICAgICAgIENvZGVNaXJyb3IuY29tbWFuZHNbYmluZGluZ10oY20pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBiaW5kaW5nKGNtKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXBlYXQ7IGkrKykgewogICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgY2hhbmdlcy5sZW5ndGg7IGorKykgewogICAgICAgICAgdmFyIGNoYW5nZSA9IGNoYW5nZXNbal07CiAgICAgICAgICBpZiAoY2hhbmdlIGluc3RhbmNlb2YgSW5zZXJ0TW9kZUtleSkgewogICAgICAgICAgICBDb2RlTWlycm9yLmxvb2t1cEtleShjaGFuZ2Uua2V5TmFtZSwgWyd2aW0taW5zZXJ0J10sIGtleUhhbmRsZXIpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdmFyIGN1ciA9IGNtLmdldEN1cnNvcigpOwogICAgICAgICAgICBjbS5yZXBsYWNlUmFuZ2UoY2hhbmdlLCBjdXIsIGN1cik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgcmVzZXRWaW1HbG9iYWxTdGF0ZSgpOwogICAgcmV0dXJuIHZpbUFwaTsKICB9OwogIC8vIEluaXRpYWxpemUgVmltIGFuZCBtYWtlIGl0IGF2YWlsYWJsZSBhcyBhbiBBUEkuCiAgQ29kZU1pcnJvci5WaW0gPSBWaW0oKTsKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/lib/codemirror.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogQkFTSUNTICovCgouQ29kZU1pcnJvciB7CiAgLyogU2V0IGhlaWdodCwgd2lkdGgsIGJvcmRlcnMsIGFuZCBnbG9iYWwgZm9udCBwcm9wZXJ0aWVzIGhlcmUgKi8KICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogIGhlaWdodDogMzAwcHg7Cn0KLkNvZGVNaXJyb3Itc2Nyb2xsIHsKICAvKiBTZXQgc2Nyb2xsaW5nIGJlaGF2aW91ciBoZXJlICovCiAgb3ZlcmZsb3c6IGF1dG87Cn0KCi8qIFBBRERJTkcgKi8KCi5Db2RlTWlycm9yLWxpbmVzIHsKICBwYWRkaW5nOiA0cHggMDsgLyogVmVydGljYWwgcGFkZGluZyBhcm91bmQgY29udGVudCAqLwp9Ci5Db2RlTWlycm9yIHByZSB7CiAgcGFkZGluZzogMCA0cHg7IC8qIEhvcml6b250YWwgcGFkZGluZyBvZiBjb250ZW50ICovCn0KCi5Db2RlTWlycm9yLXNjcm9sbGJhci1maWxsZXIsIC5Db2RlTWlycm9yLWd1dHRlci1maWxsZXIgewogIGJhY2tncm91bmQtY29sb3I6IHdoaXRlOyAvKiBUaGUgbGl0dGxlIHNxdWFyZSBiZXR3ZWVuIEggYW5kIFYgc2Nyb2xsYmFycyAqLwp9CgovKiBHVVRURVIgKi8KCi5Db2RlTWlycm9yLWd1dHRlcnMgewogIGJvcmRlci1yaWdodDogMXB4IHNvbGlkICNkZGQ7CiAgYmFja2dyb3VuZC1jb2xvcjogI2Y3ZjdmNzsKICB3aGl0ZS1zcGFjZTogbm93cmFwOwp9Ci5Db2RlTWlycm9yLWxpbmVudW1iZXJzIHt9Ci5Db2RlTWlycm9yLWxpbmVudW1iZXIgewogIHBhZGRpbmc6IDAgM3B4IDAgNXB4OwogIG1pbi13aWR0aDogMjBweDsKICB0ZXh0LWFsaWduOiByaWdodDsKICBjb2xvcjogIzk5OTsKICAtbW96LWJveC1zaXppbmc6IGNvbnRlbnQtYm94OwogIGJveC1zaXppbmc6IGNvbnRlbnQtYm94Owp9CgouQ29kZU1pcnJvci1ndXR0ZXJtYXJrZXIgeyBjb2xvcjogYmxhY2s7IH0KLkNvZGVNaXJyb3ItZ3V0dGVybWFya2VyLXN1YnRsZSB7IGNvbG9yOiAjOTk5OyB9CgovKiBDVVJTT1IgKi8KCi5Db2RlTWlycm9yIGRpdi5Db2RlTWlycm9yLWN1cnNvciB7CiAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCBibGFjazsKfQovKiBTaG93biB3aGVuIG1vdmluZyBpbiBiaS1kaXJlY3Rpb25hbCB0ZXh0ICovCi5Db2RlTWlycm9yIGRpdi5Db2RlTWlycm9yLXNlY29uZGFyeWN1cnNvciB7CiAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCBzaWx2ZXI7Cn0KLkNvZGVNaXJyb3IuY20ta2V5bWFwLWZhdC1jdXJzb3IgZGl2LkNvZGVNaXJyb3ItY3Vyc29yIHsKICB3aWR0aDogYXV0bzsKICBib3JkZXI6IDA7CiAgYmFja2dyb3VuZDogIzdlNzsKfQouY20tYW5pbWF0ZS1mYXQtY3Vyc29yIHsKICB3aWR0aDogYXV0bzsKICBib3JkZXI6IDA7CiAgLXdlYmtpdC1hbmltYXRpb246IGJsaW5rIDEuMDZzIHN0ZXBzKDEpIGluZmluaXRlOwogIC1tb3otYW5pbWF0aW9uOiBibGluayAxLjA2cyBzdGVwcygxKSBpbmZpbml0ZTsKICBhbmltYXRpb246IGJsaW5rIDEuMDZzIHN0ZXBzKDEpIGluZmluaXRlOwp9CkAtbW96LWtleWZyYW1lcyBibGluayB7CiAgMCUgeyBiYWNrZ3JvdW5kOiAjN2U3OyB9CiAgNTAlIHsgYmFja2dyb3VuZDogbm9uZTsgfQogIDEwMCUgeyBiYWNrZ3JvdW5kOiAjN2U3OyB9Cn0KQC13ZWJraXQta2V5ZnJhbWVzIGJsaW5rIHsKICAwJSB7IGJhY2tncm91bmQ6ICM3ZTc7IH0KICA1MCUgeyBiYWNrZ3JvdW5kOiBub25lOyB9CiAgMTAwJSB7IGJhY2tncm91bmQ6ICM3ZTc7IH0KfQpAa2V5ZnJhbWVzIGJsaW5rIHsKICAwJSB7IGJhY2tncm91bmQ6ICM3ZTc7IH0KICA1MCUgeyBiYWNrZ3JvdW5kOiBub25lOyB9CiAgMTAwJSB7IGJhY2tncm91bmQ6ICM3ZTc7IH0KfQoKLyogQ2FuIHN0eWxlIGN1cnNvciBkaWZmZXJlbnQgaW4gb3ZlcndyaXRlIChub24taW5zZXJ0KSBtb2RlICovCmRpdi5Db2RlTWlycm9yLW92ZXJ3cml0ZSBkaXYuQ29kZU1pcnJvci1jdXJzb3Ige30KCi5jbS10YWIgeyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IH0KCi5Db2RlTWlycm9yLXJ1bGVyIHsKICBib3JkZXItbGVmdDogMXB4IHNvbGlkICNjY2M7CiAgcG9zaXRpb246IGFic29sdXRlOwp9CgovKiBERUZBVUxUIFRIRU1FICovCgouY20tcy1kZWZhdWx0IC5jbS1rZXl3b3JkIHtjb2xvcjogIzcwODt9Ci5jbS1zLWRlZmF1bHQgLmNtLWF0b20ge2NvbG9yOiAjMjE5O30KLmNtLXMtZGVmYXVsdCAuY20tbnVtYmVyIHtjb2xvcjogIzE2NDt9Ci5jbS1zLWRlZmF1bHQgLmNtLWRlZiB7Y29sb3I6ICMwMGY7fQouY20tcy1kZWZhdWx0IC5jbS12YXJpYWJsZSwKLmNtLXMtZGVmYXVsdCAuY20tcHVuY3R1YXRpb24sCi5jbS1zLWRlZmF1bHQgLmNtLXByb3BlcnR5LAouY20tcy1kZWZhdWx0IC5jbS1vcGVyYXRvciB7fQouY20tcy1kZWZhdWx0IC5jbS12YXJpYWJsZS0yIHtjb2xvcjogIzA1YTt9Ci5jbS1zLWRlZmF1bHQgLmNtLXZhcmlhYmxlLTMge2NvbG9yOiAjMDg1O30KLmNtLXMtZGVmYXVsdCAuY20tY29tbWVudCB7Y29sb3I6ICNhNTA7fQouY20tcy1kZWZhdWx0IC5jbS1zdHJpbmcge2NvbG9yOiAjYTExO30KLmNtLXMtZGVmYXVsdCAuY20tc3RyaW5nLTIge2NvbG9yOiAjZjUwO30KLmNtLXMtZGVmYXVsdCAuY20tbWV0YSB7Y29sb3I6ICM1NTU7fQouY20tcy1kZWZhdWx0IC5jbS1xdWFsaWZpZXIge2NvbG9yOiAjNTU1O30KLmNtLXMtZGVmYXVsdCAuY20tYnVpbHRpbiB7Y29sb3I6ICMzMGE7fQouY20tcy1kZWZhdWx0IC5jbS1icmFja2V0IHtjb2xvcjogIzk5Nzt9Ci5jbS1zLWRlZmF1bHQgLmNtLXRhZyB7Y29sb3I6ICMxNzA7fQouY20tcy1kZWZhdWx0IC5jbS1hdHRyaWJ1dGUge2NvbG9yOiAjMDBjO30KLmNtLXMtZGVmYXVsdCAuY20taGVhZGVyIHtjb2xvcjogYmx1ZTt9Ci5jbS1zLWRlZmF1bHQgLmNtLXF1b3RlIHtjb2xvcjogIzA5MDt9Ci5jbS1zLWRlZmF1bHQgLmNtLWhyIHtjb2xvcjogIzk5OTt9Ci5jbS1zLWRlZmF1bHQgLmNtLWxpbmsge2NvbG9yOiAjMDBjO30KCi5jbS1uZWdhdGl2ZSB7Y29sb3I6ICNkNDQ7fQouY20tcG9zaXRpdmUge2NvbG9yOiAjMjkyO30KLmNtLWhlYWRlciwgLmNtLXN0cm9uZyB7Zm9udC13ZWlnaHQ6IGJvbGQ7fQouY20tZW0ge2ZvbnQtc3R5bGU6IGl0YWxpYzt9Ci5jbS1saW5rIHt0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTt9CgouY20tcy1kZWZhdWx0IC5jbS1lcnJvciB7Y29sb3I6ICNmMDA7fQouY20taW52YWxpZGNoYXIge2NvbG9yOiAjZjAwO30KCi8qIERlZmF1bHQgc3R5bGVzIGZvciBjb21tb24gYWRkb25zICovCgpkaXYuQ29kZU1pcnJvciBzcGFuLkNvZGVNaXJyb3ItbWF0Y2hpbmdicmFja2V0IHtjb2xvcjogIzBmMDt9CmRpdi5Db2RlTWlycm9yIHNwYW4uQ29kZU1pcnJvci1ub25tYXRjaGluZ2JyYWNrZXQge2NvbG9yOiAjZjIyO30KLkNvZGVNaXJyb3ItbWF0Y2hpbmd0YWcgeyBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMTUwLCAwLCAuMyk7IH0KLkNvZGVNaXJyb3ItYWN0aXZlbGluZS1iYWNrZ3JvdW5kIHtiYWNrZ3JvdW5kOiAjZThmMmZmO30KCi8qIFNUT1AgKi8KCi8qIFRoZSByZXN0IG9mIHRoaXMgZmlsZSBjb250YWlucyBzdHlsZXMgcmVsYXRlZCB0byB0aGUgbWVjaGFuaWNzIG9mCiAgIHRoZSBlZGl0b3IuIFlvdSBwcm9iYWJseSBzaG91bGRuJ3QgdG91Y2ggdGhlbS4gKi8KCi5Db2RlTWlycm9yIHsKICBsaW5lLWhlaWdodDogMTsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgb3ZlcmZsb3c6IGhpZGRlbjsKICBiYWNrZ3JvdW5kOiB3aGl0ZTsKICBjb2xvcjogYmxhY2s7Cn0KCi5Db2RlTWlycm9yLXNjcm9sbCB7CiAgLyogMzBweCBpcyB0aGUgbWFnaWMgbWFyZ2luIHVzZWQgdG8gaGlkZSB0aGUgZWxlbWVudCdzIHJlYWwgc2Nyb2xsYmFycyAqLwogIC8qIFNlZSBvdmVyZmxvdzogaGlkZGVuIGluIC5Db2RlTWlycm9yICovCiAgbWFyZ2luLWJvdHRvbTogLTMwcHg7IG1hcmdpbi1yaWdodDogLTMwcHg7CiAgcGFkZGluZy1ib3R0b206IDMwcHg7CiAgaGVpZ2h0OiAxMDAlOwogIG91dGxpbmU6IG5vbmU7IC8qIFByZXZlbnQgZHJhZ2dpbmcgZnJvbSBoaWdobGlnaHRpbmcgdGhlIGVsZW1lbnQgKi8KICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgLW1vei1ib3gtc2l6aW5nOiBjb250ZW50LWJveDsKICBib3gtc2l6aW5nOiBjb250ZW50LWJveDsKfQouQ29kZU1pcnJvci1zaXplciB7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIGJvcmRlci1yaWdodDogMzBweCBzb2xpZCB0cmFuc3BhcmVudDsKICAtbW96LWJveC1zaXppbmc6IGNvbnRlbnQtYm94OwogIGJveC1zaXppbmc6IGNvbnRlbnQtYm94Owp9CgovKiBUaGUgZmFrZSwgdmlzaWJsZSBzY3JvbGxiYXJzLiBVc2VkIHRvIGZvcmNlIHJlZHJhdyBkdXJpbmcgc2Nyb2xsaW5nCiAgIGJlZm9yZSBhY3R1YWxsIHNjcm9sbGluZyBoYXBwZW5zLCB0aHVzIHByZXZlbnRpbmcgc2hha2luZyBhbmQKICAgZmxpY2tlcmluZyBhcnRpZmFjdHMuICovCi5Db2RlTWlycm9yLXZzY3JvbGxiYXIsIC5Db2RlTWlycm9yLWhzY3JvbGxiYXIsIC5Db2RlTWlycm9yLXNjcm9sbGJhci1maWxsZXIsIC5Db2RlTWlycm9yLWd1dHRlci1maWxsZXIgewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB6LWluZGV4OiA2OwogIGRpc3BsYXk6IG5vbmU7Cn0KLkNvZGVNaXJyb3ItdnNjcm9sbGJhciB7CiAgcmlnaHQ6IDA7IHRvcDogMDsKICBvdmVyZmxvdy14OiBoaWRkZW47CiAgb3ZlcmZsb3cteTogc2Nyb2xsOwp9Ci5Db2RlTWlycm9yLWhzY3JvbGxiYXIgewogIGJvdHRvbTogMDsgbGVmdDogMDsKICBvdmVyZmxvdy15OiBoaWRkZW47CiAgb3ZlcmZsb3cteDogc2Nyb2xsOwp9Ci5Db2RlTWlycm9yLXNjcm9sbGJhci1maWxsZXIgewogIHJpZ2h0OiAwOyBib3R0b206IDA7Cn0KLkNvZGVNaXJyb3ItZ3V0dGVyLWZpbGxlciB7CiAgbGVmdDogMDsgYm90dG9tOiAwOwp9CgouQ29kZU1pcnJvci1ndXR0ZXJzIHsKICBwb3NpdGlvbjogYWJzb2x1dGU7IGxlZnQ6IDA7IHRvcDogMDsKICBwYWRkaW5nLWJvdHRvbTogMzBweDsKICB6LWluZGV4OiAzOwp9Ci5Db2RlTWlycm9yLWd1dHRlciB7CiAgd2hpdGUtc3BhY2U6IG5vcm1hbDsKICBoZWlnaHQ6IDEwMCU7CiAgLW1vei1ib3gtc2l6aW5nOiBjb250ZW50LWJveDsKICBib3gtc2l6aW5nOiBjb250ZW50LWJveDsKICBwYWRkaW5nLWJvdHRvbTogMzBweDsKICBtYXJnaW4tYm90dG9tOiAtMzJweDsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgLyogSGFjayB0byBtYWtlIElFNyBiZWhhdmUgKi8KICAqem9vbToxOwogICpkaXNwbGF5OmlubGluZTsKfQouQ29kZU1pcnJvci1ndXR0ZXItZWx0IHsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgY3Vyc29yOiBkZWZhdWx0OwogIHotaW5kZXg6IDQ7Cn0KCi5Db2RlTWlycm9yLWxpbmVzIHsKICBjdXJzb3I6IHRleHQ7Cn0KLkNvZGVNaXJyb3IgcHJlIHsKICAvKiBSZXNldCBzb21lIHN0eWxlcyB0aGF0IHRoZSByZXN0IG9mIHRoZSBwYWdlIG1pZ2h0IGhhdmUgc2V0ICovCiAgLW1vei1ib3JkZXItcmFkaXVzOiAwOyAtd2Via2l0LWJvcmRlci1yYWRpdXM6IDA7IGJvcmRlci1yYWRpdXM6IDA7CiAgYm9yZGVyLXdpZHRoOiAwOwogIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogIGZvbnQtZmFtaWx5OiBpbmhlcml0OwogIGZvbnQtc2l6ZTogaW5oZXJpdDsKICBtYXJnaW46IDA7CiAgd2hpdGUtc3BhY2U6IHByZTsKICB3b3JkLXdyYXA6IG5vcm1hbDsKICBsaW5lLWhlaWdodDogaW5oZXJpdDsKICBjb2xvcjogaW5oZXJpdDsKICB6LWluZGV4OiAyOwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICBvdmVyZmxvdzogdmlzaWJsZTsKfQouQ29kZU1pcnJvci13cmFwIHByZSB7CiAgd29yZC13cmFwOiBicmVhay13b3JkOwogIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKICB3b3JkLWJyZWFrOiBub3JtYWw7Cn0KCi5Db2RlTWlycm9yLWxpbmViYWNrZ3JvdW5kIHsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgbGVmdDogMDsgcmlnaHQ6IDA7IHRvcDogMDsgYm90dG9tOiAwOwogIHotaW5kZXg6IDA7Cn0KCi5Db2RlTWlycm9yLWxpbmV3aWRnZXQgewogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICB6LWluZGV4OiAyOwogIG92ZXJmbG93OiBhdXRvOwp9CgouQ29kZU1pcnJvci13aWRnZXQge30KCi5Db2RlTWlycm9yLXdyYXAgLkNvZGVNaXJyb3Itc2Nyb2xsIHsKICBvdmVyZmxvdy14OiBoaWRkZW47Cn0KCi5Db2RlTWlycm9yLW1lYXN1cmUgewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB3aWR0aDogMTAwJTsKICBoZWlnaHQ6IDA7CiAgb3ZlcmZsb3c6IGhpZGRlbjsKICB2aXNpYmlsaXR5OiBoaWRkZW47Cn0KLkNvZGVNaXJyb3ItbWVhc3VyZSBwcmUgeyBwb3NpdGlvbjogc3RhdGljOyB9CgouQ29kZU1pcnJvciBkaXYuQ29kZU1pcnJvci1jdXJzb3IgewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICBib3JkZXItcmlnaHQ6IG5vbmU7CiAgd2lkdGg6IDA7Cn0KCmRpdi5Db2RlTWlycm9yLWN1cnNvcnMgewogIHZpc2liaWxpdHk6IGhpZGRlbjsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgei1pbmRleDogMTsKfQouQ29kZU1pcnJvci1mb2N1c2VkIGRpdi5Db2RlTWlycm9yLWN1cnNvcnMgewogIHZpc2liaWxpdHk6IHZpc2libGU7Cn0KCi5Db2RlTWlycm9yLXNlbGVjdGVkIHsgYmFja2dyb3VuZDogI2Q5ZDlkOTsgfQouQ29kZU1pcnJvci1mb2N1c2VkIC5Db2RlTWlycm9yLXNlbGVjdGVkIHsgYmFja2dyb3VuZDogI2Q3ZDRmMDsgfQouQ29kZU1pcnJvci1jcm9zc2hhaXIgeyBjdXJzb3I6IGNyb3NzaGFpcjsgfQoKLmNtLXNlYXJjaGluZyB7CiAgYmFja2dyb3VuZDogI2ZmYTsKICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAwLCAuNCk7Cn0KCi8qIElFNyBoYWNrIHRvIHByZXZlbnQgaXQgZnJvbSByZXR1cm5pbmcgZnVubnkgb2Zmc2V0VG9wcyBvbiB0aGUgc3BhbnMgKi8KLkNvZGVNaXJyb3Igc3BhbiB7ICp2ZXJ0aWNhbC1hbGlnbjogdGV4dC1ib3R0b207IH0KCi8qIFVzZWQgdG8gZm9yY2UgYSBib3JkZXIgbW9kZWwgZm9yIGEgbm9kZSAqLwouY20tZm9yY2UtYm9yZGVyIHsgcGFkZGluZy1yaWdodDogLjFweDsgfQoKQG1lZGlhIHByaW50IHsKICAvKiBIaWRlIHRoZSBjdXJzb3Igd2hlbiBwcmludGluZyAqLwogIC5Db2RlTWlycm9yIGRpdi5Db2RlTWlycm9yLWN1cnNvcnMgewogICAgdmlzaWJpbGl0eTogaGlkZGVuOwogIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/lib/codemirror.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovLyBUaGlzIGlzIENvZGVNaXJyb3IgKGh0dHA6Ly9jb2RlbWlycm9yLm5ldCksIGEgY29kZSBlZGl0b3IKLy8gaW1wbGVtZW50ZWQgaW4gSmF2YVNjcmlwdCBvbiB0b3Agb2YgdGhlIGJyb3dzZXIncyBET00uCi8vCi8vIFlvdSBjYW4gZmluZCBzb21lIHRlY2huaWNhbCBiYWNrZ3JvdW5kIGZvciBzb21lIG9mIHRoZSBjb2RlIGJlbG93Ci8vIGF0IGh0dHA6Ly9tYXJpam5oYXZlcmJla2UubmwvYmxvZy8jY20taW50ZXJuYWxzIC4KCihmdW5jdGlvbihtb2QpIHsKICBpZiAodHlwZW9mIGV4cG9ydHMgPT0gIm9iamVjdCIgJiYgdHlwZW9mIG1vZHVsZSA9PSAib2JqZWN0IikgLy8gQ29tbW9uSlMKICAgIG1vZHVsZS5leHBvcnRzID0gbW9kKCk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgcmV0dXJuIGRlZmluZShbXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICB0aGlzLkNvZGVNaXJyb3IgPSBtb2QoKTsKfSkoZnVuY3Rpb24oKSB7CiAgInVzZSBzdHJpY3QiOwoKICAvLyBCUk9XU0VSIFNOSUZGSU5HCgogIC8vIEtsdWRnZXMgZm9yIGJ1Z3MgYW5kIGJlaGF2aW9yIGRpZmZlcmVuY2VzIHRoYXQgY2FuJ3QgYmUgZmVhdHVyZQogIC8vIGRldGVjdGVkIGFyZSBlbmFibGVkIGJhc2VkIG9uIHVzZXJBZ2VudCBldGMgc25pZmZpbmcuCgogIHZhciBnZWNrbyA9IC9nZWNrb1wvXGQvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpOwogIC8vIGllX3VwdG9OIG1lYW5zIEludGVybmV0IEV4cGxvcmVyIHZlcnNpb24gTiBvciBsb3dlcgogIHZhciBpZV91cHRvMTAgPSAvTVNJRSBcZC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTsKICB2YXIgaWVfMTF1cCA9IC9UcmlkZW50XC8oPzpbNy05XXxcZHsyLH0pXC4uKnJ2OihcZCspLy5leGVjKG5hdmlnYXRvci51c2VyQWdlbnQpOwogIHZhciBpZSA9IGllX3VwdG8xMCB8fCBpZV8xMXVwOwogIHZhciBpZV92ZXJzaW9uID0gaWUgJiYgKGllX3VwdG8xMCA/IGRvY3VtZW50LmRvY3VtZW50TW9kZSB8fCA2IDogaWVfMTF1cFsxXSk7CiAgdmFyIHdlYmtpdCA9IC9XZWJLaXRcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTsKICB2YXIgcXR3ZWJraXQgPSB3ZWJraXQgJiYgL1F0XC9cZCtcLlxkKy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTsKICB2YXIgY2hyb21lID0gL0Nocm9tZVwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpOwogIHZhciBwcmVzdG8gPSAvT3BlcmFcLy8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTsKICB2YXIgc2FmYXJpID0gL0FwcGxlIENvbXB1dGVyLy50ZXN0KG5hdmlnYXRvci52ZW5kb3IpOwogIHZhciBraHRtbCA9IC9LSFRNTFwvLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpOwogIHZhciBtYWNfZ2VNb3VudGFpbkxpb24gPSAvTWFjIE9TIFggMVxkXEQoWzgtOV18XGRcZClcRC8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTsKICB2YXIgcGhhbnRvbSA9IC9QaGFudG9tSlMvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7CgogIHZhciBpb3MgPSAvQXBwbGVXZWJLaXQvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkgJiYgL01vYmlsZVwvXHcrLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpOwogIC8vIFRoaXMgaXMgd29lZnVsbHkgaW5jb21wbGV0ZS4gU3VnZ2VzdGlvbnMgZm9yIGFsdGVybmF0aXZlIG1ldGhvZHMgd2VsY29tZS4KICB2YXIgbW9iaWxlID0gaW9zIHx8IC9BbmRyb2lkfHdlYk9TfEJsYWNrQmVycnl8T3BlcmEgTWluaXxPcGVyYSBNb2JpfElFTW9iaWxlL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTsKICB2YXIgbWFjID0gaW9zIHx8IC9NYWMvLnRlc3QobmF2aWdhdG9yLnBsYXRmb3JtKTsKICB2YXIgd2luZG93cyA9IC93aW4vaS50ZXN0KG5hdmlnYXRvci5wbGF0Zm9ybSk7CgogIHZhciBwcmVzdG9fdmVyc2lvbiA9IHByZXN0byAmJiBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9WZXJzaW9uXC8oXGQqXC5cZCopLyk7CiAgaWYgKHByZXN0b192ZXJzaW9uKSBwcmVzdG9fdmVyc2lvbiA9IE51bWJlcihwcmVzdG9fdmVyc2lvblsxXSk7CiAgaWYgKHByZXN0b192ZXJzaW9uICYmIHByZXN0b192ZXJzaW9uID49IDE1KSB7IHByZXN0byA9IGZhbHNlOyB3ZWJraXQgPSB0cnVlOyB9CiAgLy8gU29tZSBicm93c2VycyB1c2UgdGhlIHdyb25nIGV2ZW50IHByb3BlcnRpZXMgdG8gc2lnbmFsIGNtZC9jdHJsIG9uIE9TIFgKICB2YXIgZmxpcEN0cmxDbWQgPSBtYWMgJiYgKHF0d2Via2l0IHx8IHByZXN0byAmJiAocHJlc3RvX3ZlcnNpb24gPT0gbnVsbCB8fCBwcmVzdG9fdmVyc2lvbiA8IDEyLjExKSk7CiAgdmFyIGNhcHR1cmVSaWdodENsaWNrID0gZ2Vja28gfHwgKGllICYmIGllX3ZlcnNpb24gPj0gOSk7CgogIC8vIE9wdGltaXplIHNvbWUgY29kZSB3aGVuIHRoZXNlIGZlYXR1cmVzIGFyZSBub3QgdXNlZC4KICB2YXIgc2F3UmVhZE9ubHlTcGFucyA9IGZhbHNlLCBzYXdDb2xsYXBzZWRTcGFucyA9IGZhbHNlOwoKICAvLyBFRElUT1IgQ09OU1RSVUNUT1IKCiAgLy8gQSBDb2RlTWlycm9yIGluc3RhbmNlIHJlcHJlc2VudHMgYW4gZWRpdG9yLiBUaGlzIGlzIHRoZSBvYmplY3QKICAvLyB0aGF0IHVzZXIgY29kZSBpcyB1c3VhbGx5IGRlYWxpbmcgd2l0aC4KCiAgZnVuY3Rpb24gQ29kZU1pcnJvcihwbGFjZSwgb3B0aW9ucykgewogICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIENvZGVNaXJyb3IpKSByZXR1cm4gbmV3IENvZGVNaXJyb3IocGxhY2UsIG9wdGlvbnMpOwoKICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwogICAgLy8gRGV0ZXJtaW5lIGVmZmVjdGl2ZSBvcHRpb25zIGJhc2VkIG9uIGdpdmVuIHZhbHVlcyBhbmQgZGVmYXVsdHMuCiAgICBjb3B5T2JqKGRlZmF1bHRzLCBvcHRpb25zLCBmYWxzZSk7CiAgICBzZXRHdXR0ZXJzRm9yTGluZU51bWJlcnMob3B0aW9ucyk7CgogICAgdmFyIGRvYyA9IG9wdGlvbnMudmFsdWU7CiAgICBpZiAodHlwZW9mIGRvYyA9PSAic3RyaW5nIikgZG9jID0gbmV3IERvYyhkb2MsIG9wdGlvbnMubW9kZSk7CiAgICB0aGlzLmRvYyA9IGRvYzsKCiAgICB2YXIgZGlzcGxheSA9IHRoaXMuZGlzcGxheSA9IG5ldyBEaXNwbGF5KHBsYWNlLCBkb2MpOwogICAgZGlzcGxheS53cmFwcGVyLkNvZGVNaXJyb3IgPSB0aGlzOwogICAgdXBkYXRlR3V0dGVycyh0aGlzKTsKICAgIHRoZW1lQ2hhbmdlZCh0aGlzKTsKICAgIGlmIChvcHRpb25zLmxpbmVXcmFwcGluZykKICAgICAgdGhpcy5kaXNwbGF5LndyYXBwZXIuY2xhc3NOYW1lICs9ICIgQ29kZU1pcnJvci13cmFwIjsKICAgIGlmIChvcHRpb25zLmF1dG9mb2N1cyAmJiAhbW9iaWxlKSBmb2N1c0lucHV0KHRoaXMpOwoKICAgIHRoaXMuc3RhdGUgPSB7CiAgICAgIGtleU1hcHM6IFtdLCAgLy8gc3RvcmVzIG1hcHMgYWRkZWQgYnkgYWRkS2V5TWFwCiAgICAgIG92ZXJsYXlzOiBbXSwgLy8gaGlnaGxpZ2h0aW5nIG92ZXJsYXlzLCBhcyBhZGRlZCBieSBhZGRPdmVybGF5CiAgICAgIG1vZGVHZW46IDAsICAgLy8gYnVtcGVkIHdoZW4gbW9kZS9vdmVybGF5IGNoYW5nZXMsIHVzZWQgdG8gaW52YWxpZGF0ZSBoaWdobGlnaHRpbmcgaW5mbwogICAgICBvdmVyd3JpdGU6IGZhbHNlLCBmb2N1c2VkOiBmYWxzZSwKICAgICAgc3VwcHJlc3NFZGl0czogZmFsc2UsIC8vIHVzZWQgdG8gZGlzYWJsZSBlZGl0aW5nIGR1cmluZyBrZXkgaGFuZGxlcnMgd2hlbiBpbiByZWFkT25seSBtb2RlCiAgICAgIHBhc3RlSW5jb21pbmc6IGZhbHNlLCBjdXRJbmNvbWluZzogZmFsc2UsIC8vIGhlbHAgcmVjb2duaXplIHBhc3RlL2N1dCBlZGl0cyBpbiByZWFkSW5wdXQKICAgICAgZHJhZ2dpbmdUZXh0OiBmYWxzZSwKICAgICAgaGlnaGxpZ2h0OiBuZXcgRGVsYXllZCgpIC8vIHN0b3JlcyBoaWdobGlnaHQgd29ya2VyIHRpbWVvdXQKICAgIH07CgogICAgLy8gT3ZlcnJpZGUgbWFnaWMgdGV4dGFyZWEgY29udGVudCByZXN0b3JlIHRoYXQgSUUgc29tZXRpbWVzIGRvZXMKICAgIC8vIG9uIG91ciBoaWRkZW4gdGV4dGFyZWEgb24gcmVsb2FkCiAgICBpZiAoaWUgJiYgaWVfdmVyc2lvbiA8IDExKSBzZXRUaW1lb3V0KGJpbmQocmVzZXRJbnB1dCwgdGhpcywgdHJ1ZSksIDIwKTsKCiAgICByZWdpc3RlckV2ZW50SGFuZGxlcnModGhpcyk7CiAgICBlbnN1cmVHbG9iYWxIYW5kbGVycygpOwoKICAgIHZhciBjbSA9IHRoaXM7CiAgICBydW5Jbk9wKHRoaXMsIGZ1bmN0aW9uKCkgewogICAgICBjbS5jdXJPcC5mb3JjZVVwZGF0ZSA9IHRydWU7CiAgICAgIGF0dGFjaERvYyhjbSwgZG9jKTsKCiAgICAgIGlmICgob3B0aW9ucy5hdXRvZm9jdXMgJiYgIW1vYmlsZSkgfHwgYWN0aXZlRWx0KCkgPT0gZGlzcGxheS5pbnB1dCkKICAgICAgICBzZXRUaW1lb3V0KGJpbmQob25Gb2N1cywgY20pLCAyMCk7CiAgICAgIGVsc2UKICAgICAgICBvbkJsdXIoY20pOwoKICAgICAgZm9yICh2YXIgb3B0IGluIG9wdGlvbkhhbmRsZXJzKSBpZiAob3B0aW9uSGFuZGxlcnMuaGFzT3duUHJvcGVydHkob3B0KSkKICAgICAgICBvcHRpb25IYW5kbGVyc1tvcHRdKGNtLCBvcHRpb25zW29wdF0sIEluaXQpOwogICAgICBtYXliZVVwZGF0ZUxpbmVOdW1iZXJXaWR0aChjbSk7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW5pdEhvb2tzLmxlbmd0aDsgKytpKSBpbml0SG9va3NbaV0oY20pOwogICAgfSk7CiAgfQoKICAvLyBESVNQTEFZIENPTlNUUlVDVE9SCgogIC8vIFRoZSBkaXNwbGF5IGhhbmRsZXMgdGhlIERPTSBpbnRlZ3JhdGlvbiwgYm90aCBmb3IgaW5wdXQgcmVhZGluZwogIC8vIGFuZCBjb250ZW50IGRyYXdpbmcuIEl0IGhvbGRzIHJlZmVyZW5jZXMgdG8gRE9NIG5vZGVzIGFuZAogIC8vIGRpc3BsYXktcmVsYXRlZCBzdGF0ZS4KCiAgZnVuY3Rpb24gRGlzcGxheShwbGFjZSwgZG9jKSB7CiAgICB2YXIgZCA9IHRoaXM7CgogICAgLy8gVGhlIHNlbWloaWRkZW4gdGV4dGFyZWEgdGhhdCBpcyBmb2N1c2VkIHdoZW4gdGhlIGVkaXRvciBpcwogICAgLy8gZm9jdXNlZCwgYW5kIHJlY2VpdmVzIGlucHV0LgogICAgdmFyIGlucHV0ID0gZC5pbnB1dCA9IGVsdCgidGV4dGFyZWEiLCBudWxsLCBudWxsLCAicG9zaXRpb246IGFic29sdXRlOyBwYWRkaW5nOiAwOyB3aWR0aDogMXB4OyBoZWlnaHQ6IDFlbTsgb3V0bGluZTogbm9uZSIpOwogICAgLy8gVGhlIHRleHRhcmVhIGlzIGtlcHQgcG9zaXRpb25lZCBuZWFyIHRoZSBjdXJzb3IgdG8gcHJldmVudCB0aGUKICAgIC8vIGZhY3QgdGhhdCBpdCdsbCBiZSBzY3JvbGxlZCBpbnRvIHZpZXcgb24gaW5wdXQgZnJvbSBzY3JvbGxpbmcKICAgIC8vIG91ciBmYWtlIGN1cnNvciBvdXQgb2Ygdmlldy4gT24gd2Via2l0LCB3aGVuIHdyYXA9b2ZmLCBwYXN0ZSBpcwogICAgLy8gdmVyeSBzbG93LiBTbyBtYWtlIHRoZSBhcmVhIHdpZGUgaW5zdGVhZC4KICAgIGlmICh3ZWJraXQpIGlucHV0LnN0eWxlLndpZHRoID0gIjEwMDBweCI7CiAgICBlbHNlIGlucHV0LnNldEF0dHJpYnV0ZSgid3JhcCIsICJvZmYiKTsKICAgIC8vIElmIGJvcmRlcjogMDsgLS0gaU9TIGZhaWxzIHRvIG9wZW4ga2V5Ym9hcmQgKGlzc3VlICMxMjg3KQogICAgaWYgKGlvcykgaW5wdXQuc3R5bGUuYm9yZGVyID0gIjFweCBzb2xpZCBibGFjayI7CiAgICBpbnB1dC5zZXRBdHRyaWJ1dGUoImF1dG9jb3JyZWN0IiwgIm9mZiIpOyBpbnB1dC5zZXRBdHRyaWJ1dGUoImF1dG9jYXBpdGFsaXplIiwgIm9mZiIpOyBpbnB1dC5zZXRBdHRyaWJ1dGUoInNwZWxsY2hlY2siLCAiZmFsc2UiKTsKCiAgICAvLyBXcmFwcyBhbmQgaGlkZXMgaW5wdXQgdGV4dGFyZWEKICAgIGQuaW5wdXREaXYgPSBlbHQoImRpdiIsIFtpbnB1dF0sIG51bGwsICJvdmVyZmxvdzogaGlkZGVuOyBwb3NpdGlvbjogcmVsYXRpdmU7IHdpZHRoOiAzcHg7IGhlaWdodDogMHB4OyIpOwogICAgLy8gVGhlIGZha2Ugc2Nyb2xsYmFyIGVsZW1lbnRzLgogICAgZC5zY3JvbGxiYXJIID0gZWx0KCJkaXYiLCBbZWx0KCJkaXYiLCBudWxsLCBudWxsLCAiaGVpZ2h0OiAxMDAlOyBtaW4taGVpZ2h0OiAxcHgiKV0sICJDb2RlTWlycm9yLWhzY3JvbGxiYXIiKTsKICAgIGQuc2Nyb2xsYmFyViA9IGVsdCgiZGl2IiwgW2VsdCgiZGl2IiwgbnVsbCwgbnVsbCwgIm1pbi13aWR0aDogMXB4IildLCAiQ29kZU1pcnJvci12c2Nyb2xsYmFyIik7CiAgICAvLyBDb3ZlcnMgYm90dG9tLXJpZ2h0IHNxdWFyZSB3aGVuIGJvdGggc2Nyb2xsYmFycyBhcmUgcHJlc2VudC4KICAgIGQuc2Nyb2xsYmFyRmlsbGVyID0gZWx0KCJkaXYiLCBudWxsLCAiQ29kZU1pcnJvci1zY3JvbGxiYXItZmlsbGVyIik7CiAgICAvLyBDb3ZlcnMgYm90dG9tIG9mIGd1dHRlciB3aGVuIGNvdmVyR3V0dGVyTmV4dFRvU2Nyb2xsYmFyIGlzIG9uCiAgICAvLyBhbmQgaCBzY3JvbGxiYXIgaXMgcHJlc2VudC4KICAgIGQuZ3V0dGVyRmlsbGVyID0gZWx0KCJkaXYiLCBudWxsLCAiQ29kZU1pcnJvci1ndXR0ZXItZmlsbGVyIik7CiAgICAvLyBXaWxsIGNvbnRhaW4gdGhlIGFjdHVhbCBjb2RlLCBwb3NpdGlvbmVkIHRvIGNvdmVyIHRoZSB2aWV3cG9ydC4KICAgIGQubGluZURpdiA9IGVsdCgiZGl2IiwgbnVsbCwgIkNvZGVNaXJyb3ItY29kZSIpOwogICAgLy8gRWxlbWVudHMgYXJlIGFkZGVkIHRvIHRoZXNlIHRvIHJlcHJlc2VudCBzZWxlY3Rpb24gYW5kIGN1cnNvcnMuCiAgICBkLnNlbGVjdGlvbkRpdiA9IGVsdCgiZGl2IiwgbnVsbCwgbnVsbCwgInBvc2l0aW9uOiByZWxhdGl2ZTsgei1pbmRleDogMSIpOwogICAgZC5jdXJzb3JEaXYgPSBlbHQoImRpdiIsIG51bGwsICJDb2RlTWlycm9yLWN1cnNvcnMiKTsKICAgIC8vIEEgdmlzaWJpbGl0eTogaGlkZGVuIGVsZW1lbnQgdXNlZCB0byBmaW5kIHRoZSBzaXplIG9mIHRoaW5ncy4KICAgIGQubWVhc3VyZSA9IGVsdCgiZGl2IiwgbnVsbCwgIkNvZGVNaXJyb3ItbWVhc3VyZSIpOwogICAgLy8gV2hlbiBsaW5lcyBvdXRzaWRlIG9mIHRoZSB2aWV3cG9ydCBhcmUgbWVhc3VyZWQsIHRoZXkgYXJlIGRyYXduIGluIHRoaXMuCiAgICBkLmxpbmVNZWFzdXJlID0gZWx0KCJkaXYiLCBudWxsLCAiQ29kZU1pcnJvci1tZWFzdXJlIik7CiAgICAvLyBXcmFwcyBldmVyeXRoaW5nIHRoYXQgbmVlZHMgdG8gZXhpc3QgaW5zaWRlIHRoZSB2ZXJ0aWNhbGx5LXBhZGRlZCBjb29yZGluYXRlIHN5c3RlbQogICAgZC5saW5lU3BhY2UgPSBlbHQoImRpdiIsIFtkLm1lYXN1cmUsIGQubGluZU1lYXN1cmUsIGQuc2VsZWN0aW9uRGl2LCBkLmN1cnNvckRpdiwgZC5saW5lRGl2XSwKICAgICAgICAgICAgICAgICAgICAgIG51bGwsICJwb3NpdGlvbjogcmVsYXRpdmU7IG91dGxpbmU6IG5vbmUiKTsKICAgIC8vIE1vdmVkIGFyb3VuZCBpdHMgcGFyZW50IHRvIGNvdmVyIHZpc2libGUgdmlldy4KICAgIGQubW92ZXIgPSBlbHQoImRpdiIsIFtlbHQoImRpdiIsIFtkLmxpbmVTcGFjZV0sICJDb2RlTWlycm9yLWxpbmVzIildLCBudWxsLCAicG9zaXRpb246IHJlbGF0aXZlIik7CiAgICAvLyBTZXQgdG8gdGhlIGhlaWdodCBvZiB0aGUgZG9jdW1lbnQsIGFsbG93aW5nIHNjcm9sbGluZy4KICAgIGQuc2l6ZXIgPSBlbHQoImRpdiIsIFtkLm1vdmVyXSwgIkNvZGVNaXJyb3Itc2l6ZXIiKTsKICAgIC8vIEJlaGF2aW9yIG9mIGVsdHMgd2l0aCBvdmVyZmxvdzogYXV0byBhbmQgcGFkZGluZyBpcwogICAgLy8gaW5jb25zaXN0ZW50IGFjcm9zcyBicm93c2Vycy4gVGhpcyBpcyB1c2VkIHRvIGVuc3VyZSB0aGUKICAgIC8vIHNjcm9sbGFibGUgYXJlYSBpcyBiaWcgZW5vdWdoLgogICAgZC5oZWlnaHRGb3JjZXIgPSBlbHQoImRpdiIsIG51bGwsIG51bGwsICJwb3NpdGlvbjogYWJzb2x1dGU7IGhlaWdodDogIiArIHNjcm9sbGVyQ3V0T2ZmICsgInB4OyB3aWR0aDogMXB4OyIpOwogICAgLy8gV2lsbCBjb250YWluIHRoZSBndXR0ZXJzLCBpZiBhbnkuCiAgICBkLmd1dHRlcnMgPSBlbHQoImRpdiIsIG51bGwsICJDb2RlTWlycm9yLWd1dHRlcnMiKTsKICAgIGQubGluZUd1dHRlciA9IG51bGw7CiAgICAvLyBBY3R1YWwgc2Nyb2xsYWJsZSBlbGVtZW50LgogICAgZC5zY3JvbGxlciA9IGVsdCgiZGl2IiwgW2Quc2l6ZXIsIGQuaGVpZ2h0Rm9yY2VyLCBkLmd1dHRlcnNdLCAiQ29kZU1pcnJvci1zY3JvbGwiKTsKICAgIGQuc2Nyb2xsZXIuc2V0QXR0cmlidXRlKCJ0YWJJbmRleCIsICItMSIpOwogICAgLy8gVGhlIGVsZW1lbnQgaW4gd2hpY2ggdGhlIGVkaXRvciBsaXZlcy4KICAgIGQud3JhcHBlciA9IGVsdCgiZGl2IiwgW2QuaW5wdXREaXYsIGQuc2Nyb2xsYmFySCwgZC5zY3JvbGxiYXJWLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZC5zY3JvbGxiYXJGaWxsZXIsIGQuZ3V0dGVyRmlsbGVyLCBkLnNjcm9sbGVyXSwgIkNvZGVNaXJyb3IiKTsKCiAgICAvLyBXb3JrIGFyb3VuZCBJRTcgei1pbmRleCBidWcgKG5vdCBwZXJmZWN0LCBoZW5jZSBJRTcgbm90IHJlYWxseSBiZWluZyBzdXBwb3J0ZWQpCiAgICBpZiAoaWUgJiYgaWVfdmVyc2lvbiA8IDgpIHsgZC5ndXR0ZXJzLnN0eWxlLnpJbmRleCA9IC0xOyBkLnNjcm9sbGVyLnN0eWxlLnBhZGRpbmdSaWdodCA9IDA7IH0KICAgIC8vIE5lZWRlZCB0byBoaWRlIGJpZyBibHVlIGJsaW5raW5nIGN1cnNvciBvbiBNb2JpbGUgU2FmYXJpCiAgICBpZiAoaW9zKSBpbnB1dC5zdHlsZS53aWR0aCA9ICIwcHgiOwogICAgaWYgKCF3ZWJraXQpIGQuc2Nyb2xsZXIuZHJhZ2dhYmxlID0gdHJ1ZTsKICAgIC8vIE5lZWRlZCB0byBoYW5kbGUgVGFiIGtleSBpbiBLSFRNTAogICAgaWYgKGtodG1sKSB7IGQuaW5wdXREaXYuc3R5bGUuaGVpZ2h0ID0gIjFweCI7IGQuaW5wdXREaXYuc3R5bGUucG9zaXRpb24gPSAiYWJzb2x1dGUiOyB9CiAgICAvLyBOZWVkIHRvIHNldCBhIG1pbmltdW0gd2lkdGggdG8gc2VlIHRoZSBzY3JvbGxiYXIgb24gSUU3IChidXQgbXVzdCBub3Qgc2V0IGl0IG9uIElFOCkuCiAgICBpZiAoaWUgJiYgaWVfdmVyc2lvbiA8IDgpIGQuc2Nyb2xsYmFySC5zdHlsZS5taW5IZWlnaHQgPSBkLnNjcm9sbGJhclYuc3R5bGUubWluV2lkdGggPSAiMThweCI7CgogICAgaWYgKHBsYWNlLmFwcGVuZENoaWxkKSBwbGFjZS5hcHBlbmRDaGlsZChkLndyYXBwZXIpOwogICAgZWxzZSBwbGFjZShkLndyYXBwZXIpOwoKICAgIC8vIEN1cnJlbnQgcmVuZGVyZWQgcmFuZ2UgKG1heSBiZSBiaWdnZXIgdGhhbiB0aGUgdmlldyB3aW5kb3cpLgogICAgZC52aWV3RnJvbSA9IGQudmlld1RvID0gZG9jLmZpcnN0OwogICAgLy8gSW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlbmRlcmVkIGxpbmVzLgogICAgZC52aWV3ID0gW107CiAgICAvLyBIb2xkcyBpbmZvIGFib3V0IGEgc2luZ2xlIHJlbmRlcmVkIGxpbmUgd2hlbiBpdCB3YXMgcmVuZGVyZWQKICAgIC8vIGZvciBtZWFzdXJlbWVudCwgd2hpbGUgbm90IGluIHZpZXcuCiAgICBkLmV4dGVybmFsTWVhc3VyZWQgPSBudWxsOwogICAgLy8gRW1wdHkgc3BhY2UgKGluIHBpeGVscykgYWJvdmUgdGhlIHZpZXcKICAgIGQudmlld09mZnNldCA9IDA7CiAgICBkLmxhc3RTaXplQyA9IDA7CiAgICBkLnVwZGF0ZUxpbmVOdW1iZXJzID0gbnVsbDsKCiAgICAvLyBVc2VkIHRvIG9ubHkgcmVzaXplIHRoZSBsaW5lIG51bWJlciBndXR0ZXIgd2hlbiBuZWNlc3NhcnkgKHdoZW4KICAgIC8vIHRoZSBhbW91bnQgb2YgbGluZXMgY3Jvc3NlcyBhIGJvdW5kYXJ5IHRoYXQgbWFrZXMgaXRzIHdpZHRoIGNoYW5nZSkKICAgIGQubGluZU51bVdpZHRoID0gZC5saW5lTnVtSW5uZXJXaWR0aCA9IGQubGluZU51bUNoYXJzID0gbnVsbDsKICAgIC8vIFNlZSByZWFkSW5wdXQgYW5kIHJlc2V0SW5wdXQKICAgIGQucHJldklucHV0ID0gIiI7CiAgICAvLyBTZXQgdG8gdHJ1ZSB3aGVuIGEgbm9uLWhvcml6b250YWwtc2Nyb2xsaW5nIGxpbmUgd2lkZ2V0IGlzCiAgICAvLyBhZGRlZC4gQXMgYW4gb3B0aW1pemF0aW9uLCBsaW5lIHdpZGdldCBhbGlnbmluZyBpcyBza2lwcGVkIHdoZW4KICAgIC8vIHRoaXMgaXMgZmFsc2UuCiAgICBkLmFsaWduV2lkZ2V0cyA9IGZhbHNlOwogICAgLy8gRmxhZyB0aGF0IGluZGljYXRlcyB3aGV0aGVyIHdlIGV4cGVjdCBpbnB1dCB0byBhcHBlYXIgcmVhbCBzb29uCiAgICAvLyBub3cgKGFmdGVyIHNvbWUgZXZlbnQgbGlrZSAna2V5cHJlc3MnIG9yICdpbnB1dCcpIGFuZCBhcmUKICAgIC8vIHBvbGxpbmcgaW50ZW5zaXZlbHkuCiAgICBkLnBvbGxpbmdGYXN0ID0gZmFsc2U7CiAgICAvLyBTZWxmLXJlc2V0dGluZyB0aW1lb3V0IGZvciB0aGUgcG9sbGVyCiAgICBkLnBvbGwgPSBuZXcgRGVsYXllZCgpOwoKICAgIGQuY2FjaGVkQ2hhcldpZHRoID0gZC5jYWNoZWRUZXh0SGVpZ2h0ID0gZC5jYWNoZWRQYWRkaW5nSCA9IG51bGw7CgogICAgLy8gVHJhY2tzIHdoZW4gcmVzZXRJbnB1dCBoYXMgcHVudGVkIHRvIGp1c3QgcHV0dGluZyBhIHNob3J0CiAgICAvLyBzdHJpbmcgaW50byB0aGUgdGV4dGFyZWEgaW5zdGVhZCBvZiB0aGUgZnVsbCBzZWxlY3Rpb24uCiAgICBkLmluYWNjdXJhdGVTZWxlY3Rpb24gPSBmYWxzZTsKCiAgICAvLyBUcmFja3MgdGhlIG1heGltdW0gbGluZSBsZW5ndGggc28gdGhhdCB0aGUgaG9yaXpvbnRhbCBzY3JvbGxiYXIKICAgIC8vIGNhbiBiZSBrZXB0IHN0YXRpYyB3aGVuIHNjcm9sbGluZy4KICAgIGQubWF4TGluZSA9IG51bGw7CiAgICBkLm1heExpbmVMZW5ndGggPSAwOwogICAgZC5tYXhMaW5lQ2hhbmdlZCA9IGZhbHNlOwoKICAgIC8vIFVzZWQgZm9yIG1lYXN1cmluZyB3aGVlbCBzY3JvbGxpbmcgZ3JhbnVsYXJpdHkKICAgIGQud2hlZWxEWCA9IGQud2hlZWxEWSA9IGQud2hlZWxTdGFydFggPSBkLndoZWVsU3RhcnRZID0gbnVsbDsKCiAgICAvLyBUcnVlIHdoZW4gc2hpZnQgaXMgaGVsZCBkb3duLgogICAgZC5zaGlmdCA9IGZhbHNlOwoKICAgIC8vIFVzZWQgdG8gdHJhY2sgd2hldGhlciBhbnl0aGluZyBoYXBwZW5lZCBzaW5jZSB0aGUgY29udGV4dCBtZW51CiAgICAvLyB3YXMgb3BlbmVkLgogICAgZC5zZWxGb3JDb250ZXh0TWVudSA9IG51bGw7CiAgfQoKICAvLyBTVEFURSBVUERBVEVTCgogIC8vIFVzZWQgdG8gZ2V0IHRoZSBlZGl0b3IgaW50byBhIGNvbnNpc3RlbnQgc3RhdGUgYWdhaW4gd2hlbiBvcHRpb25zIGNoYW5nZS4KCiAgZnVuY3Rpb24gbG9hZE1vZGUoY20pIHsKICAgIGNtLmRvYy5tb2RlID0gQ29kZU1pcnJvci5nZXRNb2RlKGNtLm9wdGlvbnMsIGNtLmRvYy5tb2RlT3B0aW9uKTsKICAgIHJlc2V0TW9kZVN0YXRlKGNtKTsKICB9CgogIGZ1bmN0aW9uIHJlc2V0TW9kZVN0YXRlKGNtKSB7CiAgICBjbS5kb2MuaXRlcihmdW5jdGlvbihsaW5lKSB7CiAgICAgIGlmIChsaW5lLnN0YXRlQWZ0ZXIpIGxpbmUuc3RhdGVBZnRlciA9IG51bGw7CiAgICAgIGlmIChsaW5lLnN0eWxlcykgbGluZS5zdHlsZXMgPSBudWxsOwogICAgfSk7CiAgICBjbS5kb2MuZnJvbnRpZXIgPSBjbS5kb2MuZmlyc3Q7CiAgICBzdGFydFdvcmtlcihjbSwgMTAwKTsKICAgIGNtLnN0YXRlLm1vZGVHZW4rKzsKICAgIGlmIChjbS5jdXJPcCkgcmVnQ2hhbmdlKGNtKTsKICB9CgogIGZ1bmN0aW9uIHdyYXBwaW5nQ2hhbmdlZChjbSkgewogICAgaWYgKGNtLm9wdGlvbnMubGluZVdyYXBwaW5nKSB7CiAgICAgIGFkZENsYXNzKGNtLmRpc3BsYXkud3JhcHBlciwgIkNvZGVNaXJyb3Itd3JhcCIpOwogICAgICBjbS5kaXNwbGF5LnNpemVyLnN0eWxlLm1pbldpZHRoID0gIiI7CiAgICB9IGVsc2UgewogICAgICBybUNsYXNzKGNtLmRpc3BsYXkud3JhcHBlciwgIkNvZGVNaXJyb3Itd3JhcCIpOwogICAgICBmaW5kTWF4TGluZShjbSk7CiAgICB9CiAgICBlc3RpbWF0ZUxpbmVIZWlnaHRzKGNtKTsKICAgIHJlZ0NoYW5nZShjbSk7CiAgICBjbGVhckNhY2hlcyhjbSk7CiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dXBkYXRlU2Nyb2xsYmFycyhjbSk7fSwgMTAwKTsKICB9CgogIC8vIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGVzdGltYXRlcyB0aGUgaGVpZ2h0IG9mIGEgbGluZSwgdG8gdXNlIGFzCiAgLy8gZmlyc3QgYXBwcm94aW1hdGlvbiB1bnRpbCB0aGUgbGluZSBiZWNvbWVzIHZpc2libGUgKGFuZCBpcyB0aHVzCiAgLy8gcHJvcGVybHkgbWVhc3VyYWJsZSkuCiAgZnVuY3Rpb24gZXN0aW1hdGVIZWlnaHQoY20pIHsKICAgIHZhciB0aCA9IHRleHRIZWlnaHQoY20uZGlzcGxheSksIHdyYXBwaW5nID0gY20ub3B0aW9ucy5saW5lV3JhcHBpbmc7CiAgICB2YXIgcGVyTGluZSA9IHdyYXBwaW5nICYmIE1hdGgubWF4KDUsIGNtLmRpc3BsYXkuc2Nyb2xsZXIuY2xpZW50V2lkdGggLyBjaGFyV2lkdGgoY20uZGlzcGxheSkgLSAzKTsKICAgIHJldHVybiBmdW5jdGlvbihsaW5lKSB7CiAgICAgIGlmIChsaW5lSXNIaWRkZW4oY20uZG9jLCBsaW5lKSkgcmV0dXJuIDA7CgogICAgICB2YXIgd2lkZ2V0c0hlaWdodCA9IDA7CiAgICAgIGlmIChsaW5lLndpZGdldHMpIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZS53aWRnZXRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgaWYgKGxpbmUud2lkZ2V0c1tpXS5oZWlnaHQpIHdpZGdldHNIZWlnaHQgKz0gbGluZS53aWRnZXRzW2ldLmhlaWdodDsKICAgICAgfQoKICAgICAgaWYgKHdyYXBwaW5nKQogICAgICAgIHJldHVybiB3aWRnZXRzSGVpZ2h0ICsgKE1hdGguY2VpbChsaW5lLnRleHQubGVuZ3RoIC8gcGVyTGluZSkgfHwgMSkgKiB0aDsKICAgICAgZWxzZQogICAgICAgIHJldHVybiB3aWRnZXRzSGVpZ2h0ICsgdGg7CiAgICB9OwogIH0KCiAgZnVuY3Rpb24gZXN0aW1hdGVMaW5lSGVpZ2h0cyhjbSkgewogICAgdmFyIGRvYyA9IGNtLmRvYywgZXN0ID0gZXN0aW1hdGVIZWlnaHQoY20pOwogICAgZG9jLml0ZXIoZnVuY3Rpb24obGluZSkgewogICAgICB2YXIgZXN0SGVpZ2h0ID0gZXN0KGxpbmUpOwogICAgICBpZiAoZXN0SGVpZ2h0ICE9IGxpbmUuaGVpZ2h0KSB1cGRhdGVMaW5lSGVpZ2h0KGxpbmUsIGVzdEhlaWdodCk7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIGtleU1hcENoYW5nZWQoY20pIHsKICAgIHZhciBtYXAgPSBrZXlNYXBbY20ub3B0aW9ucy5rZXlNYXBdLCBzdHlsZSA9IG1hcC5zdHlsZTsKICAgIGNtLmRpc3BsYXkud3JhcHBlci5jbGFzc05hbWUgPSBjbS5kaXNwbGF5LndyYXBwZXIuY2xhc3NOYW1lLnJlcGxhY2UoL1xzKmNtLWtleW1hcC1cUysvZywgIiIpICsKICAgICAgKHN0eWxlID8gIiBjbS1rZXltYXAtIiArIHN0eWxlIDogIiIpOwogIH0KCiAgZnVuY3Rpb24gdGhlbWVDaGFuZ2VkKGNtKSB7CiAgICBjbS5kaXNwbGF5LndyYXBwZXIuY2xhc3NOYW1lID0gY20uZGlzcGxheS53cmFwcGVyLmNsYXNzTmFtZS5yZXBsYWNlKC9ccypjbS1zLVxTKy9nLCAiIikgKwogICAgICBjbS5vcHRpb25zLnRoZW1lLnJlcGxhY2UoLyhefFxzKVxzKi9nLCAiIGNtLXMtIik7CiAgICBjbGVhckNhY2hlcyhjbSk7CiAgfQoKICBmdW5jdGlvbiBndXR0ZXJzQ2hhbmdlZChjbSkgewogICAgdXBkYXRlR3V0dGVycyhjbSk7CiAgICByZWdDaGFuZ2UoY20pOwogICAgc2V0VGltZW91dChmdW5jdGlvbigpe2FsaWduSG9yaXpvbnRhbGx5KGNtKTt9LCAyMCk7CiAgfQoKICAvLyBSZWJ1aWxkIHRoZSBndXR0ZXIgZWxlbWVudHMsIGVuc3VyZSB0aGUgbWFyZ2luIHRvIHRoZSBsZWZ0IG9mIHRoZQogIC8vIGNvZGUgbWF0Y2hlcyB0aGVpciB3aWR0aC4KICBmdW5jdGlvbiB1cGRhdGVHdXR0ZXJzKGNtKSB7CiAgICB2YXIgZ3V0dGVycyA9IGNtLmRpc3BsYXkuZ3V0dGVycywgc3BlY3MgPSBjbS5vcHRpb25zLmd1dHRlcnM7CiAgICByZW1vdmVDaGlsZHJlbihndXR0ZXJzKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3BlY3MubGVuZ3RoOyArK2kpIHsKICAgICAgdmFyIGd1dHRlckNsYXNzID0gc3BlY3NbaV07CiAgICAgIHZhciBnRWx0ID0gZ3V0dGVycy5hcHBlbmRDaGlsZChlbHQoImRpdiIsIG51bGwsICJDb2RlTWlycm9yLWd1dHRlciAiICsgZ3V0dGVyQ2xhc3MpKTsKICAgICAgaWYgKGd1dHRlckNsYXNzID09ICJDb2RlTWlycm9yLWxpbmVudW1iZXJzIikgewogICAgICAgIGNtLmRpc3BsYXkubGluZUd1dHRlciA9IGdFbHQ7CiAgICAgICAgZ0VsdC5zdHlsZS53aWR0aCA9IChjbS5kaXNwbGF5LmxpbmVOdW1XaWR0aCB8fCAxKSArICJweCI7CiAgICAgIH0KICAgIH0KICAgIGd1dHRlcnMuc3R5bGUuZGlzcGxheSA9IGkgPyAiIiA6ICJub25lIjsKICAgIHVwZGF0ZUd1dHRlclNwYWNlKGNtKTsKICB9CgogIGZ1bmN0aW9uIHVwZGF0ZUd1dHRlclNwYWNlKGNtKSB7CiAgICB2YXIgd2lkdGggPSBjbS5kaXNwbGF5Lmd1dHRlcnMub2Zmc2V0V2lkdGg7CiAgICBjbS5kaXNwbGF5LnNpemVyLnN0eWxlLm1hcmdpbkxlZnQgPSB3aWR0aCArICJweCI7CiAgICBjbS5kaXNwbGF5LnNjcm9sbGJhckguc3R5bGUubGVmdCA9IGNtLm9wdGlvbnMuZml4ZWRHdXR0ZXIgPyB3aWR0aCArICJweCIgOiAwOwogIH0KCiAgLy8gQ29tcHV0ZSB0aGUgY2hhcmFjdGVyIGxlbmd0aCBvZiBhIGxpbmUsIHRha2luZyBpbnRvIGFjY291bnQKICAvLyBjb2xsYXBzZWQgcmFuZ2VzIChzZWUgbWFya1RleHQpIHRoYXQgbWlnaHQgaGlkZSBwYXJ0cywgYW5kIGpvaW4KICAvLyBvdGhlciBsaW5lcyBvbnRvIGl0LgogIGZ1bmN0aW9uIGxpbmVMZW5ndGgobGluZSkgewogICAgaWYgKGxpbmUuaGVpZ2h0ID09IDApIHJldHVybiAwOwogICAgdmFyIGxlbiA9IGxpbmUudGV4dC5sZW5ndGgsIG1lcmdlZCwgY3VyID0gbGluZTsKICAgIHdoaWxlIChtZXJnZWQgPSBjb2xsYXBzZWRTcGFuQXRTdGFydChjdXIpKSB7CiAgICAgIHZhciBmb3VuZCA9IG1lcmdlZC5maW5kKDAsIHRydWUpOwogICAgICBjdXIgPSBmb3VuZC5mcm9tLmxpbmU7CiAgICAgIGxlbiArPSBmb3VuZC5mcm9tLmNoIC0gZm91bmQudG8uY2g7CiAgICB9CiAgICBjdXIgPSBsaW5lOwogICAgd2hpbGUgKG1lcmdlZCA9IGNvbGxhcHNlZFNwYW5BdEVuZChjdXIpKSB7CiAgICAgIHZhciBmb3VuZCA9IG1lcmdlZC5maW5kKDAsIHRydWUpOwogICAgICBsZW4gLT0gY3VyLnRleHQubGVuZ3RoIC0gZm91bmQuZnJvbS5jaDsKICAgICAgY3VyID0gZm91bmQudG8ubGluZTsKICAgICAgbGVuICs9IGN1ci50ZXh0Lmxlbmd0aCAtIGZvdW5kLnRvLmNoOwogICAgfQogICAgcmV0dXJuIGxlbjsKICB9CgogIC8vIEZpbmQgdGhlIGxvbmdlc3QgbGluZSBpbiB0aGUgZG9jdW1lbnQuCiAgZnVuY3Rpb24gZmluZE1heExpbmUoY20pIHsKICAgIHZhciBkID0gY20uZGlzcGxheSwgZG9jID0gY20uZG9jOwogICAgZC5tYXhMaW5lID0gZ2V0TGluZShkb2MsIGRvYy5maXJzdCk7CiAgICBkLm1heExpbmVMZW5ndGggPSBsaW5lTGVuZ3RoKGQubWF4TGluZSk7CiAgICBkLm1heExpbmVDaGFuZ2VkID0gdHJ1ZTsKICAgIGRvYy5pdGVyKGZ1bmN0aW9uKGxpbmUpIHsKICAgICAgdmFyIGxlbiA9IGxpbmVMZW5ndGgobGluZSk7CiAgICAgIGlmIChsZW4gPiBkLm1heExpbmVMZW5ndGgpIHsKICAgICAgICBkLm1heExpbmVMZW5ndGggPSBsZW47CiAgICAgICAgZC5tYXhMaW5lID0gbGluZTsKICAgICAgfQogICAgfSk7CiAgfQoKICAvLyBNYWtlIHN1cmUgdGhlIGd1dHRlcnMgb3B0aW9ucyBjb250YWlucyB0aGUgZWxlbWVudAogIC8vICJDb2RlTWlycm9yLWxpbmVudW1iZXJzIiB3aGVuIHRoZSBsaW5lTnVtYmVycyBvcHRpb24gaXMgdHJ1ZS4KICBmdW5jdGlvbiBzZXRHdXR0ZXJzRm9yTGluZU51bWJlcnMob3B0aW9ucykgewogICAgdmFyIGZvdW5kID0gaW5kZXhPZihvcHRpb25zLmd1dHRlcnMsICJDb2RlTWlycm9yLWxpbmVudW1iZXJzIik7CiAgICBpZiAoZm91bmQgPT0gLTEgJiYgb3B0aW9ucy5saW5lTnVtYmVycykgewogICAgICBvcHRpb25zLmd1dHRlcnMgPSBvcHRpb25zLmd1dHRlcnMuY29uY2F0KFsiQ29kZU1pcnJvci1saW5lbnVtYmVycyJdKTsKICAgIH0gZWxzZSBpZiAoZm91bmQgPiAtMSAmJiAhb3B0aW9ucy5saW5lTnVtYmVycykgewogICAgICBvcHRpb25zLmd1dHRlcnMgPSBvcHRpb25zLmd1dHRlcnMuc2xpY2UoMCk7CiAgICAgIG9wdGlvbnMuZ3V0dGVycy5zcGxpY2UoZm91bmQsIDEpOwogICAgfQogIH0KCiAgLy8gU0NST0xMQkFSUwoKICBmdW5jdGlvbiBoU2Nyb2xsYmFyVGFrZXNTcGFjZShjbSkgewogICAgcmV0dXJuIGNtLmRpc3BsYXkuc2Nyb2xsZXIuY2xpZW50SGVpZ2h0IC0gY20uZGlzcGxheS53cmFwcGVyLmNsaWVudEhlaWdodCA8IHNjcm9sbGVyQ3V0T2ZmIC0gMzsKICB9CgogIC8vIFByZXBhcmUgRE9NIHJlYWRzIG5lZWRlZCB0byB1cGRhdGUgdGhlIHNjcm9sbGJhcnMuIERvbmUgaW4gb25lCiAgLy8gc2hvdCB0byBtaW5pbWl6ZSB1cGRhdGUvbWVhc3VyZSByb3VuZHRyaXBzLgogIGZ1bmN0aW9uIG1lYXN1cmVGb3JTY3JvbGxiYXJzKGNtKSB7CiAgICB2YXIgc2Nyb2xsID0gY20uZGlzcGxheS5zY3JvbGxlcjsKICAgIHJldHVybiB7CiAgICAgIGNsaWVudEhlaWdodDogc2Nyb2xsLmNsaWVudEhlaWdodCwKICAgICAgYmFySGVpZ2h0OiBjbS5kaXNwbGF5LnNjcm9sbGJhclYuY2xpZW50SGVpZ2h0LAogICAgICBzY3JvbGxXaWR0aDogc2Nyb2xsLnNjcm9sbFdpZHRoLCBjbGllbnRXaWR0aDogc2Nyb2xsLmNsaWVudFdpZHRoLAogICAgICBoU2Nyb2xsYmFyVGFrZXNTcGFjZTogaFNjcm9sbGJhclRha2VzU3BhY2UoY20pLAogICAgICBiYXJXaWR0aDogY20uZGlzcGxheS5zY3JvbGxiYXJILmNsaWVudFdpZHRoLAogICAgICBkb2NIZWlnaHQ6IE1hdGgucm91bmQoY20uZG9jLmhlaWdodCArIHBhZGRpbmdWZXJ0KGNtLmRpc3BsYXkpKQogICAgfTsKICB9CgogIC8vIFJlLXN5bmNocm9uaXplIHRoZSBmYWtlIHNjcm9sbGJhcnMgd2l0aCB0aGUgYWN0dWFsIHNpemUgb2YgdGhlCiAgLy8gY29udGVudC4KICBmdW5jdGlvbiB1cGRhdGVTY3JvbGxiYXJzKGNtLCBtZWFzdXJlKSB7CiAgICBpZiAoIW1lYXN1cmUpIG1lYXN1cmUgPSBtZWFzdXJlRm9yU2Nyb2xsYmFycyhjbSk7CiAgICB2YXIgZCA9IGNtLmRpc3BsYXksIHNXaWR0aCA9IHNjcm9sbGJhcldpZHRoKGQubWVhc3VyZSk7CiAgICB2YXIgc2Nyb2xsSGVpZ2h0ID0gbWVhc3VyZS5kb2NIZWlnaHQgKyBzY3JvbGxlckN1dE9mZjsKICAgIHZhciBuZWVkc0ggPSBtZWFzdXJlLnNjcm9sbFdpZHRoID4gbWVhc3VyZS5jbGllbnRXaWR0aDsKICAgIGlmIChuZWVkc0ggJiYgbWVhc3VyZS5zY3JvbGxXaWR0aCA8PSBtZWFzdXJlLmNsaWVudFdpZHRoICsgMSAmJgogICAgICAgIHNXaWR0aCA+IDAgJiYgIW1lYXN1cmUuaFNjcm9sbGJhclRha2VzU3BhY2UpCiAgICAgIG5lZWRzSCA9IGZhbHNlOyAvLyAoSXNzdWUgIzI1NjIpCiAgICB2YXIgbmVlZHNWID0gc2Nyb2xsSGVpZ2h0ID4gbWVhc3VyZS5jbGllbnRIZWlnaHQ7CgogICAgaWYgKG5lZWRzVikgewogICAgICBkLnNjcm9sbGJhclYuc3R5bGUuZGlzcGxheSA9ICJibG9jayI7CiAgICAgIGQuc2Nyb2xsYmFyVi5zdHlsZS5ib3R0b20gPSBuZWVkc0ggPyBzV2lkdGggKyAicHgiIDogIjAiOwogICAgICAvLyBBIGJ1ZyBpbiBJRTggY2FuIGNhdXNlIHRoaXMgdmFsdWUgdG8gYmUgbmVnYXRpdmUsIHNvIGd1YXJkIGl0LgogICAgICBkLnNjcm9sbGJhclYuZmlyc3RDaGlsZC5zdHlsZS5oZWlnaHQgPQogICAgICAgIE1hdGgubWF4KDAsIHNjcm9sbEhlaWdodCAtIG1lYXN1cmUuY2xpZW50SGVpZ2h0ICsgKG1lYXN1cmUuYmFySGVpZ2h0IHx8IGQuc2Nyb2xsYmFyVi5jbGllbnRIZWlnaHQpKSArICJweCI7CiAgICB9IGVsc2UgewogICAgICBkLnNjcm9sbGJhclYuc3R5bGUuZGlzcGxheSA9ICIiOwogICAgICBkLnNjcm9sbGJhclYuZmlyc3RDaGlsZC5zdHlsZS5oZWlnaHQgPSAiMCI7CiAgICB9CiAgICBpZiAobmVlZHNIKSB7CiAgICAgIGQuc2Nyb2xsYmFySC5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIjsKICAgICAgZC5zY3JvbGxiYXJILnN0eWxlLnJpZ2h0ID0gbmVlZHNWID8gc1dpZHRoICsgInB4IiA6ICIwIjsKICAgICAgZC5zY3JvbGxiYXJILmZpcnN0Q2hpbGQuc3R5bGUud2lkdGggPQogICAgICAgIChtZWFzdXJlLnNjcm9sbFdpZHRoIC0gbWVhc3VyZS5jbGllbnRXaWR0aCArIChtZWFzdXJlLmJhcldpZHRoIHx8IGQuc2Nyb2xsYmFySC5jbGllbnRXaWR0aCkpICsgInB4IjsKICAgIH0gZWxzZSB7CiAgICAgIGQuc2Nyb2xsYmFySC5zdHlsZS5kaXNwbGF5ID0gIiI7CiAgICAgIGQuc2Nyb2xsYmFySC5maXJzdENoaWxkLnN0eWxlLndpZHRoID0gIjAiOwogICAgfQogICAgaWYgKG5lZWRzSCAmJiBuZWVkc1YpIHsKICAgICAgZC5zY3JvbGxiYXJGaWxsZXIuc3R5bGUuZGlzcGxheSA9ICJibG9jayI7CiAgICAgIGQuc2Nyb2xsYmFyRmlsbGVyLnN0eWxlLmhlaWdodCA9IGQuc2Nyb2xsYmFyRmlsbGVyLnN0eWxlLndpZHRoID0gc1dpZHRoICsgInB4IjsKICAgIH0gZWxzZSBkLnNjcm9sbGJhckZpbGxlci5zdHlsZS5kaXNwbGF5ID0gIiI7CiAgICBpZiAobmVlZHNIICYmIGNtLm9wdGlvbnMuY292ZXJHdXR0ZXJOZXh0VG9TY3JvbGxiYXIgJiYgY20ub3B0aW9ucy5maXhlZEd1dHRlcikgewogICAgICBkLmd1dHRlckZpbGxlci5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIjsKICAgICAgZC5ndXR0ZXJGaWxsZXIuc3R5bGUuaGVpZ2h0ID0gc1dpZHRoICsgInB4IjsKICAgICAgZC5ndXR0ZXJGaWxsZXIuc3R5bGUud2lkdGggPSBkLmd1dHRlcnMub2Zmc2V0V2lkdGggKyAicHgiOwogICAgfSBlbHNlIGQuZ3V0dGVyRmlsbGVyLnN0eWxlLmRpc3BsYXkgPSAiIjsKCiAgICBpZiAoIWNtLnN0YXRlLmNoZWNrZWRPdmVybGF5U2Nyb2xsYmFyICYmIG1lYXN1cmUuY2xpZW50SGVpZ2h0ID4gMCkgewogICAgICBpZiAoc1dpZHRoID09PSAwKSB7CiAgICAgICAgdmFyIHcgPSBtYWMgJiYgIW1hY19nZU1vdW50YWluTGlvbiA/ICIxMnB4IiA6ICIxOHB4IjsKICAgICAgICBkLnNjcm9sbGJhclYuc3R5bGUubWluV2lkdGggPSBkLnNjcm9sbGJhckguc3R5bGUubWluSGVpZ2h0ID0gdzsKICAgICAgICB2YXIgYmFyTW91c2VEb3duID0gZnVuY3Rpb24oZSkgewogICAgICAgICAgaWYgKGVfdGFyZ2V0KGUpICE9IGQuc2Nyb2xsYmFyViAmJiBlX3RhcmdldChlKSAhPSBkLnNjcm9sbGJhckgpCiAgICAgICAgICAgIG9wZXJhdGlvbihjbSwgb25Nb3VzZURvd24pKGUpOwogICAgICAgIH07CiAgICAgICAgb24oZC5zY3JvbGxiYXJWLCAibW91c2Vkb3duIiwgYmFyTW91c2VEb3duKTsKICAgICAgICBvbihkLnNjcm9sbGJhckgsICJtb3VzZWRvd24iLCBiYXJNb3VzZURvd24pOwogICAgICB9CiAgICAgIGNtLnN0YXRlLmNoZWNrZWRPdmVybGF5U2Nyb2xsYmFyID0gdHJ1ZTsKICAgIH0KICB9CgogIC8vIENvbXB1dGUgdGhlIGxpbmVzIHRoYXQgYXJlIHZpc2libGUgaW4gYSBnaXZlbiB2aWV3cG9ydCAoZGVmYXVsdHMKICAvLyB0aGUgdGhlIGN1cnJlbnQgc2Nyb2xsIHBvc2l0aW9uKS4gdmlld3BvcnQgbWF5IGNvbnRhaW4gdG9wLAogIC8vIGhlaWdodCwgYW5kIGVuc3VyZSAoc2VlIG9wLnNjcm9sbFRvUG9zKSBwcm9wZXJ0aWVzLgogIGZ1bmN0aW9uIHZpc2libGVMaW5lcyhkaXNwbGF5LCBkb2MsIHZpZXdwb3J0KSB7CiAgICB2YXIgdG9wID0gdmlld3BvcnQgJiYgdmlld3BvcnQudG9wICE9IG51bGwgPyBNYXRoLm1heCgwLCB2aWV3cG9ydC50b3ApIDogZGlzcGxheS5zY3JvbGxlci5zY3JvbGxUb3A7CiAgICB0b3AgPSBNYXRoLmZsb29yKHRvcCAtIHBhZGRpbmdUb3AoZGlzcGxheSkpOwogICAgdmFyIGJvdHRvbSA9IHZpZXdwb3J0ICYmIHZpZXdwb3J0LmJvdHRvbSAhPSBudWxsID8gdmlld3BvcnQuYm90dG9tIDogdG9wICsgZGlzcGxheS53cmFwcGVyLmNsaWVudEhlaWdodDsKCiAgICB2YXIgZnJvbSA9IGxpbmVBdEhlaWdodChkb2MsIHRvcCksIHRvID0gbGluZUF0SGVpZ2h0KGRvYywgYm90dG9tKTsKICAgIC8vIEVuc3VyZSBpcyBhIHtmcm9tOiB7bGluZSwgY2h9LCB0bzoge2xpbmUsIGNofX0gb2JqZWN0LCBhbmQKICAgIC8vIGZvcmNlcyB0aG9zZSBsaW5lcyBpbnRvIHRoZSB2aWV3cG9ydCAoaWYgcG9zc2libGUpLgogICAgaWYgKHZpZXdwb3J0ICYmIHZpZXdwb3J0LmVuc3VyZSkgewogICAgICB2YXIgZW5zdXJlRnJvbSA9IHZpZXdwb3J0LmVuc3VyZS5mcm9tLmxpbmUsIGVuc3VyZVRvID0gdmlld3BvcnQuZW5zdXJlLnRvLmxpbmU7CiAgICAgIGlmIChlbnN1cmVGcm9tIDwgZnJvbSkKICAgICAgICByZXR1cm4ge2Zyb206IGVuc3VyZUZyb20sCiAgICAgICAgICAgICAgICB0bzogbGluZUF0SGVpZ2h0KGRvYywgaGVpZ2h0QXRMaW5lKGdldExpbmUoZG9jLCBlbnN1cmVGcm9tKSkgKyBkaXNwbGF5LndyYXBwZXIuY2xpZW50SGVpZ2h0KX07CiAgICAgIGlmIChNYXRoLm1pbihlbnN1cmVUbywgZG9jLmxhc3RMaW5lKCkpID49IHRvKQogICAgICAgIHJldHVybiB7ZnJvbTogbGluZUF0SGVpZ2h0KGRvYywgaGVpZ2h0QXRMaW5lKGdldExpbmUoZG9jLCBlbnN1cmVUbykpIC0gZGlzcGxheS53cmFwcGVyLmNsaWVudEhlaWdodCksCiAgICAgICAgICAgICAgICB0bzogZW5zdXJlVG99OwogICAgfQogICAgcmV0dXJuIHtmcm9tOiBmcm9tLCB0bzogTWF0aC5tYXgodG8sIGZyb20gKyAxKX07CiAgfQoKICAvLyBMSU5FIE5VTUJFUlMKCiAgLy8gUmUtYWxpZ24gbGluZSBudW1iZXJzIGFuZCBndXR0ZXIgbWFya3MgdG8gY29tcGVuc2F0ZSBmb3IKICAvLyBob3Jpem9udGFsIHNjcm9sbGluZy4KICBmdW5jdGlvbiBhbGlnbkhvcml6b250YWxseShjbSkgewogICAgdmFyIGRpc3BsYXkgPSBjbS5kaXNwbGF5LCB2aWV3ID0gZGlzcGxheS52aWV3OwogICAgaWYgKCFkaXNwbGF5LmFsaWduV2lkZ2V0cyAmJiAoIWRpc3BsYXkuZ3V0dGVycy5maXJzdENoaWxkIHx8ICFjbS5vcHRpb25zLmZpeGVkR3V0dGVyKSkgcmV0dXJuOwogICAgdmFyIGNvbXAgPSBjb21wZW5zYXRlRm9ySFNjcm9sbChkaXNwbGF5KSAtIGRpc3BsYXkuc2Nyb2xsZXIuc2Nyb2xsTGVmdCArIGNtLmRvYy5zY3JvbGxMZWZ0OwogICAgdmFyIGd1dHRlclcgPSBkaXNwbGF5Lmd1dHRlcnMub2Zmc2V0V2lkdGgsIGxlZnQgPSBjb21wICsgInB4IjsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmlldy5sZW5ndGg7IGkrKykgaWYgKCF2aWV3W2ldLmhpZGRlbikgewogICAgICBpZiAoY20ub3B0aW9ucy5maXhlZEd1dHRlciAmJiB2aWV3W2ldLmd1dHRlcikKICAgICAgICB2aWV3W2ldLmd1dHRlci5zdHlsZS5sZWZ0ID0gbGVmdDsKICAgICAgdmFyIGFsaWduID0gdmlld1tpXS5hbGlnbmFibGU7CiAgICAgIGlmIChhbGlnbikgZm9yICh2YXIgaiA9IDA7IGogPCBhbGlnbi5sZW5ndGg7IGorKykKICAgICAgICBhbGlnbltqXS5zdHlsZS5sZWZ0ID0gbGVmdDsKICAgIH0KICAgIGlmIChjbS5vcHRpb25zLmZpeGVkR3V0dGVyKQogICAgICBkaXNwbGF5Lmd1dHRlcnMuc3R5bGUubGVmdCA9IChjb21wICsgZ3V0dGVyVykgKyAicHgiOwogIH0KCiAgLy8gVXNlZCB0byBlbnN1cmUgdGhhdCB0aGUgbGluZSBudW1iZXIgZ3V0dGVyIGlzIHN0aWxsIHRoZSByaWdodAogIC8vIHNpemUgZm9yIHRoZSBjdXJyZW50IGRvY3VtZW50IHNpemUuIFJldHVybnMgdHJ1ZSB3aGVuIGFuIHVwZGF0ZQogIC8vIGlzIG5lZWRlZC4KICBmdW5jdGlvbiBtYXliZVVwZGF0ZUxpbmVOdW1iZXJXaWR0aChjbSkgewogICAgaWYgKCFjbS5vcHRpb25zLmxpbmVOdW1iZXJzKSByZXR1cm4gZmFsc2U7CiAgICB2YXIgZG9jID0gY20uZG9jLCBsYXN0ID0gbGluZU51bWJlckZvcihjbS5vcHRpb25zLCBkb2MuZmlyc3QgKyBkb2Muc2l6ZSAtIDEpLCBkaXNwbGF5ID0gY20uZGlzcGxheTsKICAgIGlmIChsYXN0Lmxlbmd0aCAhPSBkaXNwbGF5LmxpbmVOdW1DaGFycykgewogICAgICB2YXIgdGVzdCA9IGRpc3BsYXkubWVhc3VyZS5hcHBlbmRDaGlsZChlbHQoImRpdiIsIFtlbHQoImRpdiIsIGxhc3QpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb2RlTWlycm9yLWxpbmVudW1iZXIgQ29kZU1pcnJvci1ndXR0ZXItZWx0IikpOwogICAgICB2YXIgaW5uZXJXID0gdGVzdC5maXJzdENoaWxkLm9mZnNldFdpZHRoLCBwYWRkaW5nID0gdGVzdC5vZmZzZXRXaWR0aCAtIGlubmVyVzsKICAgICAgZGlzcGxheS5saW5lR3V0dGVyLnN0eWxlLndpZHRoID0gIiI7CiAgICAgIGRpc3BsYXkubGluZU51bUlubmVyV2lkdGggPSBNYXRoLm1heChpbm5lclcsIGRpc3BsYXkubGluZUd1dHRlci5vZmZzZXRXaWR0aCAtIHBhZGRpbmcpOwogICAgICBkaXNwbGF5LmxpbmVOdW1XaWR0aCA9IGRpc3BsYXkubGluZU51bUlubmVyV2lkdGggKyBwYWRkaW5nOwogICAgICBkaXNwbGF5LmxpbmVOdW1DaGFycyA9IGRpc3BsYXkubGluZU51bUlubmVyV2lkdGggPyBsYXN0Lmxlbmd0aCA6IC0xOwogICAgICBkaXNwbGF5LmxpbmVHdXR0ZXIuc3R5bGUud2lkdGggPSBkaXNwbGF5LmxpbmVOdW1XaWR0aCArICJweCI7CiAgICAgIHVwZGF0ZUd1dHRlclNwYWNlKGNtKTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBmdW5jdGlvbiBsaW5lTnVtYmVyRm9yKG9wdGlvbnMsIGkpIHsKICAgIHJldHVybiBTdHJpbmcob3B0aW9ucy5saW5lTnVtYmVyRm9ybWF0dGVyKGkgKyBvcHRpb25zLmZpcnN0TGluZU51bWJlcikpOwogIH0KCiAgLy8gQ29tcHV0ZXMgZGlzcGxheS5zY3JvbGxlci5zY3JvbGxMZWZ0ICsgZGlzcGxheS5ndXR0ZXJzLm9mZnNldFdpZHRoLAogIC8vIGJ1dCB1c2luZyBnZXRCb3VuZGluZ0NsaWVudFJlY3QgdG8gZ2V0IGEgc3ViLXBpeGVsLWFjY3VyYXRlCiAgLy8gcmVzdWx0LgogIGZ1bmN0aW9uIGNvbXBlbnNhdGVGb3JIU2Nyb2xsKGRpc3BsYXkpIHsKICAgIHJldHVybiBkaXNwbGF5LnNjcm9sbGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgLSBkaXNwbGF5LnNpemVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQ7CiAgfQoKICAvLyBESVNQTEFZIERSQVdJTkcKCiAgZnVuY3Rpb24gRGlzcGxheVVwZGF0ZShjbSwgdmlld3BvcnQsIGZvcmNlKSB7CiAgICB2YXIgZGlzcGxheSA9IGNtLmRpc3BsYXk7CgogICAgdGhpcy52aWV3cG9ydCA9IHZpZXdwb3J0OwogICAgLy8gU3RvcmUgc29tZSB2YWx1ZXMgdGhhdCB3ZSdsbCBuZWVkIGxhdGVyIChidXQgZG9uJ3Qgd2FudCB0byBmb3JjZSBhIHJlbGF5b3V0IGZvcikKICAgIHRoaXMudmlzaWJsZSA9IHZpc2libGVMaW5lcyhkaXNwbGF5LCBjbS5kb2MsIHZpZXdwb3J0KTsKICAgIHRoaXMuZWRpdG9ySXNIaWRkZW4gPSAhZGlzcGxheS53cmFwcGVyLm9mZnNldFdpZHRoOwogICAgdGhpcy53cmFwcGVySGVpZ2h0ID0gZGlzcGxheS53cmFwcGVyLmNsaWVudEhlaWdodDsKICAgIHRoaXMub2xkVmlld0Zyb20gPSBkaXNwbGF5LnZpZXdGcm9tOyB0aGlzLm9sZFZpZXdUbyA9IGRpc3BsYXkudmlld1RvOwogICAgdGhpcy5vbGRTY3JvbGxlcldpZHRoID0gZGlzcGxheS5zY3JvbGxlci5jbGllbnRXaWR0aDsKICAgIHRoaXMuZm9yY2UgPSBmb3JjZTsKICAgIHRoaXMuZGltcyA9IGdldERpbWVuc2lvbnMoY20pOwogIH0KCiAgLy8gRG9lcyB0aGUgYWN0dWFsIHVwZGF0aW5nIG9mIHRoZSBsaW5lIGRpc3BsYXkuIEJhaWxzIG91dAogIC8vIChyZXR1cm5pbmcgZmFsc2UpIHdoZW4gdGhlcmUgaXMgbm90aGluZyB0byBiZSBkb25lIGFuZCBmb3JjZWQgaXMKICAvLyBmYWxzZS4KICBmdW5jdGlvbiB1cGRhdGVEaXNwbGF5SWZOZWVkZWQoY20sIHVwZGF0ZSkgewogICAgdmFyIGRpc3BsYXkgPSBjbS5kaXNwbGF5LCBkb2MgPSBjbS5kb2M7CiAgICBpZiAodXBkYXRlLmVkaXRvcklzSGlkZGVuKSB7CiAgICAgIHJlc2V0VmlldyhjbSk7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvLyBCYWlsIG91dCBpZiB0aGUgdmlzaWJsZSBhcmVhIGlzIGFscmVhZHkgcmVuZGVyZWQgYW5kIG5vdGhpbmcgY2hhbmdlZC4KICAgIGlmICghdXBkYXRlLmZvcmNlICYmCiAgICAgICAgdXBkYXRlLnZpc2libGUuZnJvbSA+PSBkaXNwbGF5LnZpZXdGcm9tICYmIHVwZGF0ZS52aXNpYmxlLnRvIDw9IGRpc3BsYXkudmlld1RvICYmCiAgICAgICAgKGRpc3BsYXkudXBkYXRlTGluZU51bWJlcnMgPT0gbnVsbCB8fCBkaXNwbGF5LnVwZGF0ZUxpbmVOdW1iZXJzID49IGRpc3BsYXkudmlld1RvKSAmJgogICAgICAgIGNvdW50RGlydHlWaWV3KGNtKSA9PSAwKQogICAgICByZXR1cm4gZmFsc2U7CgogICAgaWYgKG1heWJlVXBkYXRlTGluZU51bWJlcldpZHRoKGNtKSkgewogICAgICByZXNldFZpZXcoY20pOwogICAgICB1cGRhdGUuZGltcyA9IGdldERpbWVuc2lvbnMoY20pOwogICAgfQoKICAgIC8vIENvbXB1dGUgYSBzdWl0YWJsZSBuZXcgdmlld3BvcnQgKGZyb20gJiB0bykKICAgIHZhciBlbmQgPSBkb2MuZmlyc3QgKyBkb2Muc2l6ZTsKICAgIHZhciBmcm9tID0gTWF0aC5tYXgodXBkYXRlLnZpc2libGUuZnJvbSAtIGNtLm9wdGlvbnMudmlld3BvcnRNYXJnaW4sIGRvYy5maXJzdCk7CiAgICB2YXIgdG8gPSBNYXRoLm1pbihlbmQsIHVwZGF0ZS52aXNpYmxlLnRvICsgY20ub3B0aW9ucy52aWV3cG9ydE1hcmdpbik7CiAgICBpZiAoZGlzcGxheS52aWV3RnJvbSA8IGZyb20gJiYgZnJvbSAtIGRpc3BsYXkudmlld0Zyb20gPCAyMCkgZnJvbSA9IE1hdGgubWF4KGRvYy5maXJzdCwgZGlzcGxheS52aWV3RnJvbSk7CiAgICBpZiAoZGlzcGxheS52aWV3VG8gPiB0byAmJiBkaXNwbGF5LnZpZXdUbyAtIHRvIDwgMjApIHRvID0gTWF0aC5taW4oZW5kLCBkaXNwbGF5LnZpZXdUbyk7CiAgICBpZiAoc2F3Q29sbGFwc2VkU3BhbnMpIHsKICAgICAgZnJvbSA9IHZpc3VhbExpbmVObyhjbS5kb2MsIGZyb20pOwogICAgICB0byA9IHZpc3VhbExpbmVFbmRObyhjbS5kb2MsIHRvKTsKICAgIH0KCiAgICB2YXIgZGlmZmVyZW50ID0gZnJvbSAhPSBkaXNwbGF5LnZpZXdGcm9tIHx8IHRvICE9IGRpc3BsYXkudmlld1RvIHx8CiAgICAgIGRpc3BsYXkubGFzdFNpemVDICE9IHVwZGF0ZS53cmFwcGVySGVpZ2h0OwogICAgYWRqdXN0VmlldyhjbSwgZnJvbSwgdG8pOwoKICAgIGRpc3BsYXkudmlld09mZnNldCA9IGhlaWdodEF0TGluZShnZXRMaW5lKGNtLmRvYywgZGlzcGxheS52aWV3RnJvbSkpOwogICAgLy8gUG9zaXRpb24gdGhlIG1vdmVyIGRpdiB0byBhbGlnbiB3aXRoIHRoZSBjdXJyZW50IHNjcm9sbCBwb3NpdGlvbgogICAgY20uZGlzcGxheS5tb3Zlci5zdHlsZS50b3AgPSBkaXNwbGF5LnZpZXdPZmZzZXQgKyAicHgiOwoKICAgIHZhciB0b1VwZGF0ZSA9IGNvdW50RGlydHlWaWV3KGNtKTsKICAgIGlmICghZGlmZmVyZW50ICYmIHRvVXBkYXRlID09IDAgJiYgIXVwZGF0ZS5mb3JjZSAmJgogICAgICAgIChkaXNwbGF5LnVwZGF0ZUxpbmVOdW1iZXJzID09IG51bGwgfHwgZGlzcGxheS51cGRhdGVMaW5lTnVtYmVycyA+PSBkaXNwbGF5LnZpZXdUbykpCiAgICAgIHJldHVybiBmYWxzZTsKCiAgICAvLyBGb3IgYmlnIGNoYW5nZXMsIHdlIGhpZGUgdGhlIGVuY2xvc2luZyBlbGVtZW50IGR1cmluZyB0aGUKICAgIC8vIHVwZGF0ZSwgc2luY2UgdGhhdCBzcGVlZHMgdXAgdGhlIG9wZXJhdGlvbnMgb24gbW9zdCBicm93c2Vycy4KICAgIHZhciBmb2N1c2VkID0gYWN0aXZlRWx0KCk7CiAgICBpZiAodG9VcGRhdGUgPiA0KSBkaXNwbGF5LmxpbmVEaXYuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKICAgIHBhdGNoRGlzcGxheShjbSwgZGlzcGxheS51cGRhdGVMaW5lTnVtYmVycywgdXBkYXRlLmRpbXMpOwogICAgaWYgKHRvVXBkYXRlID4gNCkgZGlzcGxheS5saW5lRGl2LnN0eWxlLmRpc3BsYXkgPSAiIjsKICAgIC8vIFRoZXJlIG1pZ2h0IGhhdmUgYmVlbiBhIHdpZGdldCB3aXRoIGEgZm9jdXNlZCBlbGVtZW50IHRoYXQgZ290CiAgICAvLyBoaWRkZW4gb3IgdXBkYXRlZCwgaWYgc28gcmUtZm9jdXMgaXQuCiAgICBpZiAoZm9jdXNlZCAmJiBhY3RpdmVFbHQoKSAhPSBmb2N1c2VkICYmIGZvY3VzZWQub2Zmc2V0SGVpZ2h0KSBmb2N1c2VkLmZvY3VzKCk7CgogICAgLy8gUHJldmVudCBzZWxlY3Rpb24gYW5kIGN1cnNvcnMgZnJvbSBpbnRlcmZlcmluZyB3aXRoIHRoZSBzY3JvbGwKICAgIC8vIHdpZHRoLgogICAgcmVtb3ZlQ2hpbGRyZW4oZGlzcGxheS5jdXJzb3JEaXYpOwogICAgcmVtb3ZlQ2hpbGRyZW4oZGlzcGxheS5zZWxlY3Rpb25EaXYpOwoKICAgIGlmIChkaWZmZXJlbnQpIHsKICAgICAgZGlzcGxheS5sYXN0U2l6ZUMgPSB1cGRhdGUud3JhcHBlckhlaWdodDsKICAgICAgc3RhcnRXb3JrZXIoY20sIDQwMCk7CiAgICB9CgogICAgZGlzcGxheS51cGRhdGVMaW5lTnVtYmVycyA9IG51bGw7CgogICAgcmV0dXJuIHRydWU7CiAgfQoKICBmdW5jdGlvbiBwb3N0VXBkYXRlRGlzcGxheShjbSwgdXBkYXRlKSB7CiAgICB2YXIgZm9yY2UgPSB1cGRhdGUuZm9yY2UsIHZpZXdwb3J0ID0gdXBkYXRlLnZpZXdwb3J0OwogICAgZm9yICh2YXIgZmlyc3QgPSB0cnVlOzsgZmlyc3QgPSBmYWxzZSkgewogICAgICBpZiAoZmlyc3QgJiYgY20ub3B0aW9ucy5saW5lV3JhcHBpbmcgJiYgdXBkYXRlLm9sZFNjcm9sbGVyV2lkdGggIT0gY20uZGlzcGxheS5zY3JvbGxlci5jbGllbnRXaWR0aCkgewogICAgICAgIGZvcmNlID0gdHJ1ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBmb3JjZSA9IGZhbHNlOwogICAgICAgIC8vIENsaXAgZm9yY2VkIHZpZXdwb3J0IHRvIGFjdHVhbCBzY3JvbGxhYmxlIGFyZWEuCiAgICAgICAgaWYgKHZpZXdwb3J0ICYmIHZpZXdwb3J0LnRvcCAhPSBudWxsKQogICAgICAgICAgdmlld3BvcnQgPSB7dG9wOiBNYXRoLm1pbihjbS5kb2MuaGVpZ2h0ICsgcGFkZGluZ1ZlcnQoY20uZGlzcGxheSkgLSBzY3JvbGxlckN1dE9mZiAtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNtLmRpc3BsYXkuc2Nyb2xsZXIuY2xpZW50SGVpZ2h0LCB2aWV3cG9ydC50b3ApfTsKICAgICAgICAvLyBVcGRhdGVkIGxpbmUgaGVpZ2h0cyBtaWdodCByZXN1bHQgaW4gdGhlIGRyYXduIGFyZWEgbm90CiAgICAgICAgLy8gYWN0dWFsbHkgY292ZXJpbmcgdGhlIHZpZXdwb3J0LiBLZWVwIGxvb3BpbmcgdW50aWwgaXQgZG9lcy4KICAgICAgICB1cGRhdGUudmlzaWJsZSA9IHZpc2libGVMaW5lcyhjbS5kaXNwbGF5LCBjbS5kb2MsIHZpZXdwb3J0KTsKICAgICAgICBpZiAodXBkYXRlLnZpc2libGUuZnJvbSA+PSBjbS5kaXNwbGF5LnZpZXdGcm9tICYmIHVwZGF0ZS52aXNpYmxlLnRvIDw9IGNtLmRpc3BsYXkudmlld1RvKQogICAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgaWYgKCF1cGRhdGVEaXNwbGF5SWZOZWVkZWQoY20sIHVwZGF0ZSkpIGJyZWFrOwogICAgICB1cGRhdGVIZWlnaHRzSW5WaWV3cG9ydChjbSk7CiAgICAgIHZhciBiYXJNZWFzdXJlID0gbWVhc3VyZUZvclNjcm9sbGJhcnMoY20pOwogICAgICB1cGRhdGVTZWxlY3Rpb24oY20pOwogICAgICBzZXREb2N1bWVudEhlaWdodChjbSwgYmFyTWVhc3VyZSk7CiAgICAgIHVwZGF0ZVNjcm9sbGJhcnMoY20sIGJhck1lYXN1cmUpOwogICAgfQoKICAgIHNpZ25hbExhdGVyKGNtLCAidXBkYXRlIiwgY20pOwogICAgaWYgKGNtLmRpc3BsYXkudmlld0Zyb20gIT0gdXBkYXRlLm9sZFZpZXdGcm9tIHx8IGNtLmRpc3BsYXkudmlld1RvICE9IHVwZGF0ZS5vbGRWaWV3VG8pCiAgICAgIHNpZ25hbExhdGVyKGNtLCAidmlld3BvcnRDaGFuZ2UiLCBjbSwgY20uZGlzcGxheS52aWV3RnJvbSwgY20uZGlzcGxheS52aWV3VG8pOwogIH0KCiAgZnVuY3Rpb24gdXBkYXRlRGlzcGxheVNpbXBsZShjbSwgdmlld3BvcnQpIHsKICAgIHZhciB1cGRhdGUgPSBuZXcgRGlzcGxheVVwZGF0ZShjbSwgdmlld3BvcnQpOwogICAgaWYgKHVwZGF0ZURpc3BsYXlJZk5lZWRlZChjbSwgdXBkYXRlKSkgewogICAgICBwb3N0VXBkYXRlRGlzcGxheShjbSwgdXBkYXRlKTsKICAgICAgdmFyIGJhck1lYXN1cmUgPSBtZWFzdXJlRm9yU2Nyb2xsYmFycyhjbSk7CiAgICAgIHVwZGF0ZVNlbGVjdGlvbihjbSk7CiAgICAgIHNldERvY3VtZW50SGVpZ2h0KGNtLCBiYXJNZWFzdXJlKTsKICAgICAgdXBkYXRlU2Nyb2xsYmFycyhjbSwgYmFyTWVhc3VyZSk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBzZXREb2N1bWVudEhlaWdodChjbSwgbWVhc3VyZSkgewogICAgY20uZGlzcGxheS5zaXplci5zdHlsZS5taW5IZWlnaHQgPSBjbS5kaXNwbGF5LmhlaWdodEZvcmNlci5zdHlsZS50b3AgPSBtZWFzdXJlLmRvY0hlaWdodCArICJweCI7CiAgICBjbS5kaXNwbGF5Lmd1dHRlcnMuc3R5bGUuaGVpZ2h0ID0gTWF0aC5tYXgobWVhc3VyZS5kb2NIZWlnaHQsIG1lYXN1cmUuY2xpZW50SGVpZ2h0IC0gc2Nyb2xsZXJDdXRPZmYpICsgInB4IjsKICB9CgogIGZ1bmN0aW9uIGNoZWNrRm9yV2Via2l0V2lkdGhCdWcoY20sIG1lYXN1cmUpIHsKICAgIC8vIFdvcmsgYXJvdW5kIFdlYmtpdCBidWcgd2hlcmUgaXQgc29tZXRpbWVzIHJlc2VydmVzIHNwYWNlIGZvciBhCiAgICAvLyBub24tZXhpc3RpbmcgcGhhbnRvbSBzY3JvbGxiYXIgaW4gdGhlIHNjcm9sbGVyIChJc3N1ZSAjMjQyMCkKICAgIGlmIChjbS5kaXNwbGF5LnNpemVyLm9mZnNldFdpZHRoICsgY20uZGlzcGxheS5ndXR0ZXJzLm9mZnNldFdpZHRoIDwgY20uZGlzcGxheS5zY3JvbGxlci5jbGllbnRXaWR0aCAtIDEpIHsKICAgICAgY20uZGlzcGxheS5zaXplci5zdHlsZS5taW5IZWlnaHQgPSBjbS5kaXNwbGF5LmhlaWdodEZvcmNlci5zdHlsZS50b3AgPSAiMHB4IjsKICAgICAgY20uZGlzcGxheS5ndXR0ZXJzLnN0eWxlLmhlaWdodCA9IG1lYXN1cmUuZG9jSGVpZ2h0ICsgInB4IjsKICAgIH0KICB9CgogIC8vIFJlYWQgdGhlIGFjdHVhbCBoZWlnaHRzIG9mIHRoZSByZW5kZXJlZCBsaW5lcywgYW5kIHVwZGF0ZSB0aGVpcgogIC8vIHN0b3JlZCBoZWlnaHRzIHRvIG1hdGNoLgogIGZ1bmN0aW9uIHVwZGF0ZUhlaWdodHNJblZpZXdwb3J0KGNtKSB7CiAgICB2YXIgZGlzcGxheSA9IGNtLmRpc3BsYXk7CiAgICB2YXIgcHJldkJvdHRvbSA9IGRpc3BsYXkubGluZURpdi5vZmZzZXRUb3A7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpc3BsYXkudmlldy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgY3VyID0gZGlzcGxheS52aWV3W2ldLCBoZWlnaHQ7CiAgICAgIGlmIChjdXIuaGlkZGVuKSBjb250aW51ZTsKICAgICAgaWYgKGllICYmIGllX3ZlcnNpb24gPCA4KSB7CiAgICAgICAgdmFyIGJvdCA9IGN1ci5ub2RlLm9mZnNldFRvcCArIGN1ci5ub2RlLm9mZnNldEhlaWdodDsKICAgICAgICBoZWlnaHQgPSBib3QgLSBwcmV2Qm90dG9tOwogICAgICAgIHByZXZCb3R0b20gPSBib3Q7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIGJveCA9IGN1ci5ub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgIGhlaWdodCA9IGJveC5ib3R0b20gLSBib3gudG9wOwogICAgICB9CiAgICAgIHZhciBkaWZmID0gY3VyLmxpbmUuaGVpZ2h0IC0gaGVpZ2h0OwogICAgICBpZiAoaGVpZ2h0IDwgMikgaGVpZ2h0ID0gdGV4dEhlaWdodChkaXNwbGF5KTsKICAgICAgaWYgKGRpZmYgPiAuMDAxIHx8IGRpZmYgPCAtLjAwMSkgewogICAgICAgIHVwZGF0ZUxpbmVIZWlnaHQoY3VyLmxpbmUsIGhlaWdodCk7CiAgICAgICAgdXBkYXRlV2lkZ2V0SGVpZ2h0KGN1ci5saW5lKTsKICAgICAgICBpZiAoY3VyLnJlc3QpIGZvciAodmFyIGogPSAwOyBqIDwgY3VyLnJlc3QubGVuZ3RoOyBqKyspCiAgICAgICAgICB1cGRhdGVXaWRnZXRIZWlnaHQoY3VyLnJlc3Rbal0pOwogICAgICB9CiAgICB9CiAgfQoKICAvLyBSZWFkIGFuZCBzdG9yZSB0aGUgaGVpZ2h0IG9mIGxpbmUgd2lkZ2V0cyBhc3NvY2lhdGVkIHdpdGggdGhlCiAgLy8gZ2l2ZW4gbGluZS4KICBmdW5jdGlvbiB1cGRhdGVXaWRnZXRIZWlnaHQobGluZSkgewogICAgaWYgKGxpbmUud2lkZ2V0cykgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW5lLndpZGdldHMubGVuZ3RoOyArK2kpCiAgICAgIGxpbmUud2lkZ2V0c1tpXS5oZWlnaHQgPSBsaW5lLndpZGdldHNbaV0ubm9kZS5vZmZzZXRIZWlnaHQ7CiAgfQoKICAvLyBEbyBhIGJ1bGstcmVhZCBvZiB0aGUgRE9NIHBvc2l0aW9ucyBhbmQgc2l6ZXMgbmVlZGVkIHRvIGRyYXcgdGhlCiAgLy8gdmlldywgc28gdGhhdCB3ZSBkb24ndCBpbnRlcmxlYXZlIHJlYWRpbmcgYW5kIHdyaXRpbmcgdG8gdGhlIERPTS4KICBmdW5jdGlvbiBnZXREaW1lbnNpb25zKGNtKSB7CiAgICB2YXIgZCA9IGNtLmRpc3BsYXksIGxlZnQgPSB7fSwgd2lkdGggPSB7fTsKICAgIGZvciAodmFyIG4gPSBkLmd1dHRlcnMuZmlyc3RDaGlsZCwgaSA9IDA7IG47IG4gPSBuLm5leHRTaWJsaW5nLCArK2kpIHsKICAgICAgbGVmdFtjbS5vcHRpb25zLmd1dHRlcnNbaV1dID0gbi5vZmZzZXRMZWZ0OwogICAgICB3aWR0aFtjbS5vcHRpb25zLmd1dHRlcnNbaV1dID0gbi5vZmZzZXRXaWR0aDsKICAgIH0KICAgIHJldHVybiB7Zml4ZWRQb3M6IGNvbXBlbnNhdGVGb3JIU2Nyb2xsKGQpLAogICAgICAgICAgICBndXR0ZXJUb3RhbFdpZHRoOiBkLmd1dHRlcnMub2Zmc2V0V2lkdGgsCiAgICAgICAgICAgIGd1dHRlckxlZnQ6IGxlZnQsCiAgICAgICAgICAgIGd1dHRlcldpZHRoOiB3aWR0aCwKICAgICAgICAgICAgd3JhcHBlcldpZHRoOiBkLndyYXBwZXIuY2xpZW50V2lkdGh9OwogIH0KCiAgLy8gU3luYyB0aGUgYWN0dWFsIGRpc3BsYXkgRE9NIHN0cnVjdHVyZSB3aXRoIGRpc3BsYXkudmlldywgcmVtb3ZpbmcKICAvLyBub2RlcyBmb3IgbGluZXMgdGhhdCBhcmUgbm8gbG9uZ2VyIGluIHZpZXcsIGFuZCBjcmVhdGluZyB0aGUgb25lcwogIC8vIHRoYXQgYXJlIG5vdCB0aGVyZSB5ZXQsIGFuZCB1cGRhdGluZyB0aGUgb25lcyB0aGF0IGFyZSBvdXQgb2YKICAvLyBkYXRlLgogIGZ1bmN0aW9uIHBhdGNoRGlzcGxheShjbSwgdXBkYXRlTnVtYmVyc0Zyb20sIGRpbXMpIHsKICAgIHZhciBkaXNwbGF5ID0gY20uZGlzcGxheSwgbGluZU51bWJlcnMgPSBjbS5vcHRpb25zLmxpbmVOdW1iZXJzOwogICAgdmFyIGNvbnRhaW5lciA9IGRpc3BsYXkubGluZURpdiwgY3VyID0gY29udGFpbmVyLmZpcnN0Q2hpbGQ7CgogICAgZnVuY3Rpb24gcm0obm9kZSkgewogICAgICB2YXIgbmV4dCA9IG5vZGUubmV4dFNpYmxpbmc7CiAgICAgIC8vIFdvcmtzIGFyb3VuZCBhIHRocm93LXNjcm9sbCBidWcgaW4gT1MgWCBXZWJraXQKICAgICAgaWYgKHdlYmtpdCAmJiBtYWMgJiYgY20uZGlzcGxheS5jdXJyZW50V2hlZWxUYXJnZXQgPT0gbm9kZSkKICAgICAgICBub2RlLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7CiAgICAgIGVsc2UKICAgICAgICBub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobm9kZSk7CiAgICAgIHJldHVybiBuZXh0OwogICAgfQoKICAgIHZhciB2aWV3ID0gZGlzcGxheS52aWV3LCBsaW5lTiA9IGRpc3BsYXkudmlld0Zyb207CiAgICAvLyBMb29wIG92ZXIgdGhlIGVsZW1lbnRzIGluIHRoZSB2aWV3LCBzeW5jaW5nIGN1ciAodGhlIERPTSBub2RlcwogICAgLy8gaW4gZGlzcGxheS5saW5lRGl2KSB3aXRoIHRoZSB2aWV3IGFzIHdlIGdvLgogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB2aWV3Lmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBsaW5lVmlldyA9IHZpZXdbaV07CiAgICAgIGlmIChsaW5lVmlldy5oaWRkZW4pIHsKICAgICAgfSBlbHNlIGlmICghbGluZVZpZXcubm9kZSkgeyAvLyBOb3QgZHJhd24geWV0CiAgICAgICAgdmFyIG5vZGUgPSBidWlsZExpbmVFbGVtZW50KGNtLCBsaW5lVmlldywgbGluZU4sIGRpbXMpOwogICAgICAgIGNvbnRhaW5lci5pbnNlcnRCZWZvcmUobm9kZSwgY3VyKTsKICAgICAgfSBlbHNlIHsgLy8gQWxyZWFkeSBkcmF3bgogICAgICAgIHdoaWxlIChjdXIgIT0gbGluZVZpZXcubm9kZSkgY3VyID0gcm0oY3VyKTsKICAgICAgICB2YXIgdXBkYXRlTnVtYmVyID0gbGluZU51bWJlcnMgJiYgdXBkYXRlTnVtYmVyc0Zyb20gIT0gbnVsbCAmJgogICAgICAgICAgdXBkYXRlTnVtYmVyc0Zyb20gPD0gbGluZU4gJiYgbGluZVZpZXcubGluZU51bWJlcjsKICAgICAgICBpZiAobGluZVZpZXcuY2hhbmdlcykgewogICAgICAgICAgaWYgKGluZGV4T2YobGluZVZpZXcuY2hhbmdlcywgImd1dHRlciIpID4gLTEpIHVwZGF0ZU51bWJlciA9IGZhbHNlOwogICAgICAgICAgdXBkYXRlTGluZUZvckNoYW5nZXMoY20sIGxpbmVWaWV3LCBsaW5lTiwgZGltcyk7CiAgICAgICAgfQogICAgICAgIGlmICh1cGRhdGVOdW1iZXIpIHsKICAgICAgICAgIHJlbW92ZUNoaWxkcmVuKGxpbmVWaWV3LmxpbmVOdW1iZXIpOwogICAgICAgICAgbGluZVZpZXcubGluZU51bWJlci5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShsaW5lTnVtYmVyRm9yKGNtLm9wdGlvbnMsIGxpbmVOKSkpOwogICAgICAgIH0KICAgICAgICBjdXIgPSBsaW5lVmlldy5ub2RlLm5leHRTaWJsaW5nOwogICAgICB9CiAgICAgIGxpbmVOICs9IGxpbmVWaWV3LnNpemU7CiAgICB9CiAgICB3aGlsZSAoY3VyKSBjdXIgPSBybShjdXIpOwogIH0KCiAgLy8gV2hlbiBhbiBhc3BlY3Qgb2YgYSBsaW5lIGNoYW5nZXMsIGEgc3RyaW5nIGlzIGFkZGVkIHRvCiAgLy8gbGluZVZpZXcuY2hhbmdlcy4gVGhpcyB1cGRhdGVzIHRoZSByZWxldmFudCBwYXJ0IG9mIHRoZSBsaW5lJ3MKICAvLyBET00gc3RydWN0dXJlLgogIGZ1bmN0aW9uIHVwZGF0ZUxpbmVGb3JDaGFuZ2VzKGNtLCBsaW5lVmlldywgbGluZU4sIGRpbXMpIHsKICAgIGZvciAodmFyIGogPSAwOyBqIDwgbGluZVZpZXcuY2hhbmdlcy5sZW5ndGg7IGorKykgewogICAgICB2YXIgdHlwZSA9IGxpbmVWaWV3LmNoYW5nZXNbal07CiAgICAgIGlmICh0eXBlID09ICJ0ZXh0IikgdXBkYXRlTGluZVRleHQoY20sIGxpbmVWaWV3KTsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAiZ3V0dGVyIikgdXBkYXRlTGluZUd1dHRlcihjbSwgbGluZVZpZXcsIGxpbmVOLCBkaW1zKTsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAiY2xhc3MiKSB1cGRhdGVMaW5lQ2xhc3NlcyhsaW5lVmlldyk7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gIndpZGdldCIpIHVwZGF0ZUxpbmVXaWRnZXRzKGxpbmVWaWV3LCBkaW1zKTsKICAgIH0KICAgIGxpbmVWaWV3LmNoYW5nZXMgPSBudWxsOwogIH0KCiAgLy8gTGluZXMgd2l0aCBndXR0ZXIgZWxlbWVudHMsIHdpZGdldHMgb3IgYSBiYWNrZ3JvdW5kIGNsYXNzIG5lZWQgdG8KICAvLyBiZSB3cmFwcGVkLCBhbmQgaGF2ZSB0aGUgZXh0cmEgZWxlbWVudHMgYWRkZWQgdG8gdGhlIHdyYXBwZXIgZGl2CiAgZnVuY3Rpb24gZW5zdXJlTGluZVdyYXBwZWQobGluZVZpZXcpIHsKICAgIGlmIChsaW5lVmlldy5ub2RlID09IGxpbmVWaWV3LnRleHQpIHsKICAgICAgbGluZVZpZXcubm9kZSA9IGVsdCgiZGl2IiwgbnVsbCwgbnVsbCwgInBvc2l0aW9uOiByZWxhdGl2ZSIpOwogICAgICBpZiAobGluZVZpZXcudGV4dC5wYXJlbnROb2RlKQogICAgICAgIGxpbmVWaWV3LnRleHQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQobGluZVZpZXcubm9kZSwgbGluZVZpZXcudGV4dCk7CiAgICAgIGxpbmVWaWV3Lm5vZGUuYXBwZW5kQ2hpbGQobGluZVZpZXcudGV4dCk7CiAgICAgIGlmIChpZSAmJiBpZV92ZXJzaW9uIDwgOCkgbGluZVZpZXcubm9kZS5zdHlsZS56SW5kZXggPSAyOwogICAgfQogICAgcmV0dXJuIGxpbmVWaWV3Lm5vZGU7CiAgfQoKICBmdW5jdGlvbiB1cGRhdGVMaW5lQmFja2dyb3VuZChsaW5lVmlldykgewogICAgdmFyIGNscyA9IGxpbmVWaWV3LmJnQ2xhc3MgPyBsaW5lVmlldy5iZ0NsYXNzICsgIiAiICsgKGxpbmVWaWV3LmxpbmUuYmdDbGFzcyB8fCAiIikgOiBsaW5lVmlldy5saW5lLmJnQ2xhc3M7CiAgICBpZiAoY2xzKSBjbHMgKz0gIiBDb2RlTWlycm9yLWxpbmViYWNrZ3JvdW5kIjsKICAgIGlmIChsaW5lVmlldy5iYWNrZ3JvdW5kKSB7CiAgICAgIGlmIChjbHMpIGxpbmVWaWV3LmJhY2tncm91bmQuY2xhc3NOYW1lID0gY2xzOwogICAgICBlbHNlIHsgbGluZVZpZXcuYmFja2dyb3VuZC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGxpbmVWaWV3LmJhY2tncm91bmQpOyBsaW5lVmlldy5iYWNrZ3JvdW5kID0gbnVsbDsgfQogICAgfSBlbHNlIGlmIChjbHMpIHsKICAgICAgdmFyIHdyYXAgPSBlbnN1cmVMaW5lV3JhcHBlZChsaW5lVmlldyk7CiAgICAgIGxpbmVWaWV3LmJhY2tncm91bmQgPSB3cmFwLmluc2VydEJlZm9yZShlbHQoImRpdiIsIG51bGwsIGNscyksIHdyYXAuZmlyc3RDaGlsZCk7CiAgICB9CiAgfQoKICAvLyBXcmFwcGVyIGFyb3VuZCBidWlsZExpbmVDb250ZW50IHdoaWNoIHdpbGwgcmV1c2UgdGhlIHN0cnVjdHVyZQogIC8vIGluIGRpc3BsYXkuZXh0ZXJuYWxNZWFzdXJlZCB3aGVuIHBvc3NpYmxlLgogIGZ1bmN0aW9uIGdldExpbmVDb250ZW50KGNtLCBsaW5lVmlldykgewogICAgdmFyIGV4dCA9IGNtLmRpc3BsYXkuZXh0ZXJuYWxNZWFzdXJlZDsKICAgIGlmIChleHQgJiYgZXh0LmxpbmUgPT0gbGluZVZpZXcubGluZSkgewogICAgICBjbS5kaXNwbGF5LmV4dGVybmFsTWVhc3VyZWQgPSBudWxsOwogICAgICBsaW5lVmlldy5tZWFzdXJlID0gZXh0Lm1lYXN1cmU7CiAgICAgIHJldHVybiBleHQuYnVpbHQ7CiAgICB9CiAgICByZXR1cm4gYnVpbGRMaW5lQ29udGVudChjbSwgbGluZVZpZXcpOwogIH0KCiAgLy8gUmVkcmF3IHRoZSBsaW5lJ3MgdGV4dC4gSW50ZXJhY3RzIHdpdGggdGhlIGJhY2tncm91bmQgYW5kIHRleHQKICAvLyBjbGFzc2VzIGJlY2F1c2UgdGhlIG1vZGUgbWF5IG91dHB1dCB0b2tlbnMgdGhhdCBpbmZsdWVuY2UgdGhlc2UKICAvLyBjbGFzc2VzLgogIGZ1bmN0aW9uIHVwZGF0ZUxpbmVUZXh0KGNtLCBsaW5lVmlldykgewogICAgdmFyIGNscyA9IGxpbmVWaWV3LnRleHQuY2xhc3NOYW1lOwogICAgdmFyIGJ1aWx0ID0gZ2V0TGluZUNvbnRlbnQoY20sIGxpbmVWaWV3KTsKICAgIGlmIChsaW5lVmlldy50ZXh0ID09IGxpbmVWaWV3Lm5vZGUpIGxpbmVWaWV3Lm5vZGUgPSBidWlsdC5wcmU7CiAgICBsaW5lVmlldy50ZXh0LnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGJ1aWx0LnByZSwgbGluZVZpZXcudGV4dCk7CiAgICBsaW5lVmlldy50ZXh0ID0gYnVpbHQucHJlOwogICAgaWYgKGJ1aWx0LmJnQ2xhc3MgIT0gbGluZVZpZXcuYmdDbGFzcyB8fCBidWlsdC50ZXh0Q2xhc3MgIT0gbGluZVZpZXcudGV4dENsYXNzKSB7CiAgICAgIGxpbmVWaWV3LmJnQ2xhc3MgPSBidWlsdC5iZ0NsYXNzOwogICAgICBsaW5lVmlldy50ZXh0Q2xhc3MgPSBidWlsdC50ZXh0Q2xhc3M7CiAgICAgIHVwZGF0ZUxpbmVDbGFzc2VzKGxpbmVWaWV3KTsKICAgIH0gZWxzZSBpZiAoY2xzKSB7CiAgICAgIGxpbmVWaWV3LnRleHQuY2xhc3NOYW1lID0gY2xzOwogICAgfQogIH0KCiAgZnVuY3Rpb24gdXBkYXRlTGluZUNsYXNzZXMobGluZVZpZXcpIHsKICAgIHVwZGF0ZUxpbmVCYWNrZ3JvdW5kKGxpbmVWaWV3KTsKICAgIGlmIChsaW5lVmlldy5saW5lLndyYXBDbGFzcykKICAgICAgZW5zdXJlTGluZVdyYXBwZWQobGluZVZpZXcpLmNsYXNzTmFtZSA9IGxpbmVWaWV3LmxpbmUud3JhcENsYXNzOwogICAgZWxzZSBpZiAobGluZVZpZXcubm9kZSAhPSBsaW5lVmlldy50ZXh0KQogICAgICBsaW5lVmlldy5ub2RlLmNsYXNzTmFtZSA9ICIiOwogICAgdmFyIHRleHRDbGFzcyA9IGxpbmVWaWV3LnRleHRDbGFzcyA/IGxpbmVWaWV3LnRleHRDbGFzcyArICIgIiArIChsaW5lVmlldy5saW5lLnRleHRDbGFzcyB8fCAiIikgOiBsaW5lVmlldy5saW5lLnRleHRDbGFzczsKICAgIGxpbmVWaWV3LnRleHQuY2xhc3NOYW1lID0gdGV4dENsYXNzIHx8ICIiOwogIH0KCiAgZnVuY3Rpb24gdXBkYXRlTGluZUd1dHRlcihjbSwgbGluZVZpZXcsIGxpbmVOLCBkaW1zKSB7CiAgICBpZiAobGluZVZpZXcuZ3V0dGVyKSB7CiAgICAgIGxpbmVWaWV3Lm5vZGUucmVtb3ZlQ2hpbGQobGluZVZpZXcuZ3V0dGVyKTsKICAgICAgbGluZVZpZXcuZ3V0dGVyID0gbnVsbDsKICAgIH0KICAgIHZhciBtYXJrZXJzID0gbGluZVZpZXcubGluZS5ndXR0ZXJNYXJrZXJzOwogICAgaWYgKGNtLm9wdGlvbnMubGluZU51bWJlcnMgfHwgbWFya2VycykgewogICAgICB2YXIgd3JhcCA9IGVuc3VyZUxpbmVXcmFwcGVkKGxpbmVWaWV3KTsKICAgICAgdmFyIGd1dHRlcldyYXAgPSBsaW5lVmlldy5ndXR0ZXIgPQogICAgICAgIHdyYXAuaW5zZXJ0QmVmb3JlKGVsdCgiZGl2IiwgbnVsbCwgIkNvZGVNaXJyb3ItZ3V0dGVyLXdyYXBwZXIiLCAicG9zaXRpb246IGFic29sdXRlOyBsZWZ0OiAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNtLm9wdGlvbnMuZml4ZWRHdXR0ZXIgPyBkaW1zLmZpeGVkUG9zIDogLWRpbXMuZ3V0dGVyVG90YWxXaWR0aCkgKyAicHgiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lVmlldy50ZXh0KTsKICAgICAgaWYgKGNtLm9wdGlvbnMubGluZU51bWJlcnMgJiYgKCFtYXJrZXJzIHx8ICFtYXJrZXJzWyJDb2RlTWlycm9yLWxpbmVudW1iZXJzIl0pKQogICAgICAgIGxpbmVWaWV3LmxpbmVOdW1iZXIgPSBndXR0ZXJXcmFwLmFwcGVuZENoaWxkKAogICAgICAgICAgZWx0KCJkaXYiLCBsaW5lTnVtYmVyRm9yKGNtLm9wdGlvbnMsIGxpbmVOKSwKICAgICAgICAgICAgICAiQ29kZU1pcnJvci1saW5lbnVtYmVyIENvZGVNaXJyb3ItZ3V0dGVyLWVsdCIsCiAgICAgICAgICAgICAgImxlZnQ6ICIgKyBkaW1zLmd1dHRlckxlZnRbIkNvZGVNaXJyb3ItbGluZW51bWJlcnMiXSArICJweDsgd2lkdGg6ICIKICAgICAgICAgICAgICArIGNtLmRpc3BsYXkubGluZU51bUlubmVyV2lkdGggKyAicHgiKSk7CiAgICAgIGlmIChtYXJrZXJzKSBmb3IgKHZhciBrID0gMDsgayA8IGNtLm9wdGlvbnMuZ3V0dGVycy5sZW5ndGg7ICsraykgewogICAgICAgIHZhciBpZCA9IGNtLm9wdGlvbnMuZ3V0dGVyc1trXSwgZm91bmQgPSBtYXJrZXJzLmhhc093blByb3BlcnR5KGlkKSAmJiBtYXJrZXJzW2lkXTsKICAgICAgICBpZiAoZm91bmQpCiAgICAgICAgICBndXR0ZXJXcmFwLmFwcGVuZENoaWxkKGVsdCgiZGl2IiwgW2ZvdW5kXSwgIkNvZGVNaXJyb3ItZ3V0dGVyLWVsdCIsICJsZWZ0OiAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpbXMuZ3V0dGVyTGVmdFtpZF0gKyAicHg7IHdpZHRoOiAiICsgZGltcy5ndXR0ZXJXaWR0aFtpZF0gKyAicHgiKSk7CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIHVwZGF0ZUxpbmVXaWRnZXRzKGxpbmVWaWV3LCBkaW1zKSB7CiAgICBpZiAobGluZVZpZXcuYWxpZ25hYmxlKSBsaW5lVmlldy5hbGlnbmFibGUgPSBudWxsOwogICAgZm9yICh2YXIgbm9kZSA9IGxpbmVWaWV3Lm5vZGUuZmlyc3RDaGlsZCwgbmV4dDsgbm9kZTsgbm9kZSA9IG5leHQpIHsKICAgICAgdmFyIG5leHQgPSBub2RlLm5leHRTaWJsaW5nOwogICAgICBpZiAobm9kZS5jbGFzc05hbWUgPT0gIkNvZGVNaXJyb3ItbGluZXdpZGdldCIpCiAgICAgICAgbGluZVZpZXcubm9kZS5yZW1vdmVDaGlsZChub2RlKTsKICAgIH0KICAgIGluc2VydExpbmVXaWRnZXRzKGxpbmVWaWV3LCBkaW1zKTsKICB9CgogIC8vIEJ1aWxkIGEgbGluZSdzIERPTSByZXByZXNlbnRhdGlvbiBmcm9tIHNjcmF0Y2gKICBmdW5jdGlvbiBidWlsZExpbmVFbGVtZW50KGNtLCBsaW5lVmlldywgbGluZU4sIGRpbXMpIHsKICAgIHZhciBidWlsdCA9IGdldExpbmVDb250ZW50KGNtLCBsaW5lVmlldyk7CiAgICBsaW5lVmlldy50ZXh0ID0gbGluZVZpZXcubm9kZSA9IGJ1aWx0LnByZTsKICAgIGlmIChidWlsdC5iZ0NsYXNzKSBsaW5lVmlldy5iZ0NsYXNzID0gYnVpbHQuYmdDbGFzczsKICAgIGlmIChidWlsdC50ZXh0Q2xhc3MpIGxpbmVWaWV3LnRleHRDbGFzcyA9IGJ1aWx0LnRleHRDbGFzczsKCiAgICB1cGRhdGVMaW5lQ2xhc3NlcyhsaW5lVmlldyk7CiAgICB1cGRhdGVMaW5lR3V0dGVyKGNtLCBsaW5lVmlldywgbGluZU4sIGRpbXMpOwogICAgaW5zZXJ0TGluZVdpZGdldHMobGluZVZpZXcsIGRpbXMpOwogICAgcmV0dXJuIGxpbmVWaWV3Lm5vZGU7CiAgfQoKICAvLyBBIGxpbmVWaWV3IG1heSBjb250YWluIG11bHRpcGxlIGxvZ2ljYWwgbGluZXMgKHdoZW4gbWVyZ2VkIGJ5CiAgLy8gY29sbGFwc2VkIHNwYW5zKS4gVGhlIHdpZGdldHMgZm9yIGFsbCBvZiB0aGVtIG5lZWQgdG8gYmUgZHJhd24uCiAgZnVuY3Rpb24gaW5zZXJ0TGluZVdpZGdldHMobGluZVZpZXcsIGRpbXMpIHsKICAgIGluc2VydExpbmVXaWRnZXRzRm9yKGxpbmVWaWV3LmxpbmUsIGxpbmVWaWV3LCBkaW1zLCB0cnVlKTsKICAgIGlmIChsaW5lVmlldy5yZXN0KSBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmVWaWV3LnJlc3QubGVuZ3RoOyBpKyspCiAgICAgIGluc2VydExpbmVXaWRnZXRzRm9yKGxpbmVWaWV3LnJlc3RbaV0sIGxpbmVWaWV3LCBkaW1zLCBmYWxzZSk7CiAgfQoKICBmdW5jdGlvbiBpbnNlcnRMaW5lV2lkZ2V0c0ZvcihsaW5lLCBsaW5lVmlldywgZGltcywgYWxsb3dBYm92ZSkgewogICAgaWYgKCFsaW5lLndpZGdldHMpIHJldHVybjsKICAgIHZhciB3cmFwID0gZW5zdXJlTGluZVdyYXBwZWQobGluZVZpZXcpOwogICAgZm9yICh2YXIgaSA9IDAsIHdzID0gbGluZS53aWRnZXRzOyBpIDwgd3MubGVuZ3RoOyArK2kpIHsKICAgICAgdmFyIHdpZGdldCA9IHdzW2ldLCBub2RlID0gZWx0KCJkaXYiLCBbd2lkZ2V0Lm5vZGVdLCAiQ29kZU1pcnJvci1saW5ld2lkZ2V0Iik7CiAgICAgIGlmICghd2lkZ2V0LmhhbmRsZU1vdXNlRXZlbnRzKSBub2RlLmlnbm9yZUV2ZW50cyA9IHRydWU7CiAgICAgIHBvc2l0aW9uTGluZVdpZGdldCh3aWRnZXQsIG5vZGUsIGxpbmVWaWV3LCBkaW1zKTsKICAgICAgaWYgKGFsbG93QWJvdmUgJiYgd2lkZ2V0LmFib3ZlKQogICAgICAgIHdyYXAuaW5zZXJ0QmVmb3JlKG5vZGUsIGxpbmVWaWV3Lmd1dHRlciB8fCBsaW5lVmlldy50ZXh0KTsKICAgICAgZWxzZQogICAgICAgIHdyYXAuYXBwZW5kQ2hpbGQobm9kZSk7CiAgICAgIHNpZ25hbExhdGVyKHdpZGdldCwgInJlZHJhdyIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gcG9zaXRpb25MaW5lV2lkZ2V0KHdpZGdldCwgbm9kZSwgbGluZVZpZXcsIGRpbXMpIHsKICAgIGlmICh3aWRnZXQubm9IU2Nyb2xsKSB7CiAgICAgIChsaW5lVmlldy5hbGlnbmFibGUgfHwgKGxpbmVWaWV3LmFsaWduYWJsZSA9IFtdKSkucHVzaChub2RlKTsKICAgICAgdmFyIHdpZHRoID0gZGltcy53cmFwcGVyV2lkdGg7CiAgICAgIG5vZGUuc3R5bGUubGVmdCA9IGRpbXMuZml4ZWRQb3MgKyAicHgiOwogICAgICBpZiAoIXdpZGdldC5jb3Zlckd1dHRlcikgewogICAgICAgIHdpZHRoIC09IGRpbXMuZ3V0dGVyVG90YWxXaWR0aDsKICAgICAgICBub2RlLnN0eWxlLnBhZGRpbmdMZWZ0ID0gZGltcy5ndXR0ZXJUb3RhbFdpZHRoICsgInB4IjsKICAgICAgfQogICAgICBub2RlLnN0eWxlLndpZHRoID0gd2lkdGggKyAicHgiOwogICAgfQogICAgaWYgKHdpZGdldC5jb3Zlckd1dHRlcikgewogICAgICBub2RlLnN0eWxlLnpJbmRleCA9IDU7CiAgICAgIG5vZGUuc3R5bGUucG9zaXRpb24gPSAicmVsYXRpdmUiOwogICAgICBpZiAoIXdpZGdldC5ub0hTY3JvbGwpIG5vZGUuc3R5bGUubWFyZ2luTGVmdCA9IC1kaW1zLmd1dHRlclRvdGFsV2lkdGggKyAicHgiOwogICAgfQogIH0KCiAgLy8gUE9TSVRJT04gT0JKRUNUCgogIC8vIEEgUG9zIGluc3RhbmNlIHJlcHJlc2VudHMgYSBwb3NpdGlvbiB3aXRoaW4gdGhlIHRleHQuCiAgdmFyIFBvcyA9IENvZGVNaXJyb3IuUG9zID0gZnVuY3Rpb24obGluZSwgY2gpIHsKICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBQb3MpKSByZXR1cm4gbmV3IFBvcyhsaW5lLCBjaCk7CiAgICB0aGlzLmxpbmUgPSBsaW5lOyB0aGlzLmNoID0gY2g7CiAgfTsKCiAgLy8gQ29tcGFyZSB0d28gcG9zaXRpb25zLCByZXR1cm4gMCBpZiB0aGV5IGFyZSB0aGUgc2FtZSwgYSBuZWdhdGl2ZQogIC8vIG51bWJlciB3aGVuIGEgaXMgbGVzcywgYW5kIGEgcG9zaXRpdmUgbnVtYmVyIG90aGVyd2lzZS4KICB2YXIgY21wID0gQ29kZU1pcnJvci5jbXBQb3MgPSBmdW5jdGlvbihhLCBiKSB7IHJldHVybiBhLmxpbmUgLSBiLmxpbmUgfHwgYS5jaCAtIGIuY2g7IH07CgogIGZ1bmN0aW9uIGNvcHlQb3MoeCkge3JldHVybiBQb3MoeC5saW5lLCB4LmNoKTt9CiAgZnVuY3Rpb24gbWF4UG9zKGEsIGIpIHsgcmV0dXJuIGNtcChhLCBiKSA8IDAgPyBiIDogYTsgfQogIGZ1bmN0aW9uIG1pblBvcyhhLCBiKSB7IHJldHVybiBjbXAoYSwgYikgPCAwID8gYSA6IGI7IH0KCiAgLy8gU0VMRUNUSU9OIC8gQ1VSU09SCgogIC8vIFNlbGVjdGlvbiBvYmplY3RzIGFyZSBpbW11dGFibGUuIEEgbmV3IG9uZSBpcyBjcmVhdGVkIGV2ZXJ5IHRpbWUKICAvLyB0aGUgc2VsZWN0aW9uIGNoYW5nZXMuIEEgc2VsZWN0aW9uIGlzIG9uZSBvciBtb3JlIG5vbi1vdmVybGFwcGluZwogIC8vIChhbmQgbm9uLXRvdWNoaW5nKSByYW5nZXMsIHNvcnRlZCwgYW5kIGFuIGludGVnZXIgdGhhdCBpbmRpY2F0ZXMKICAvLyB3aGljaCBvbmUgaXMgdGhlIHByaW1hcnkgc2VsZWN0aW9uICh0aGUgb25lIHRoYXQncyBzY3JvbGxlZCBpbnRvCiAgLy8gdmlldywgdGhhdCBnZXRDdXJzb3IgcmV0dXJucywgZXRjKS4KICBmdW5jdGlvbiBTZWxlY3Rpb24ocmFuZ2VzLCBwcmltSW5kZXgpIHsKICAgIHRoaXMucmFuZ2VzID0gcmFuZ2VzOwogICAgdGhpcy5wcmltSW5kZXggPSBwcmltSW5kZXg7CiAgfQoKICBTZWxlY3Rpb24ucHJvdG90eXBlID0gewogICAgcHJpbWFyeTogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLnJhbmdlc1t0aGlzLnByaW1JbmRleF07IH0sCiAgICBlcXVhbHM6IGZ1bmN0aW9uKG90aGVyKSB7CiAgICAgIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm4gdHJ1ZTsKICAgICAgaWYgKG90aGVyLnByaW1JbmRleCAhPSB0aGlzLnByaW1JbmRleCB8fCBvdGhlci5yYW5nZXMubGVuZ3RoICE9IHRoaXMucmFuZ2VzLmxlbmd0aCkgcmV0dXJuIGZhbHNlOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucmFuZ2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIGhlcmUgPSB0aGlzLnJhbmdlc1tpXSwgdGhlcmUgPSBvdGhlci5yYW5nZXNbaV07CiAgICAgICAgaWYgKGNtcChoZXJlLmFuY2hvciwgdGhlcmUuYW5jaG9yKSAhPSAwIHx8IGNtcChoZXJlLmhlYWQsIHRoZXJlLmhlYWQpICE9IDApIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0sCiAgICBkZWVwQ29weTogZnVuY3Rpb24oKSB7CiAgICAgIGZvciAodmFyIG91dCA9IFtdLCBpID0gMDsgaSA8IHRoaXMucmFuZ2VzLmxlbmd0aDsgaSsrKQogICAgICAgIG91dFtpXSA9IG5ldyBSYW5nZShjb3B5UG9zKHRoaXMucmFuZ2VzW2ldLmFuY2hvciksIGNvcHlQb3ModGhpcy5yYW5nZXNbaV0uaGVhZCkpOwogICAgICByZXR1cm4gbmV3IFNlbGVjdGlvbihvdXQsIHRoaXMucHJpbUluZGV4KTsKICAgIH0sCiAgICBzb21ldGhpbmdTZWxlY3RlZDogZnVuY3Rpb24oKSB7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5yYW5nZXMubGVuZ3RoOyBpKyspCiAgICAgICAgaWYgKCF0aGlzLnJhbmdlc1tpXS5lbXB0eSgpKSByZXR1cm4gdHJ1ZTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfSwKICAgIGNvbnRhaW5zOiBmdW5jdGlvbihwb3MsIGVuZCkgewogICAgICBpZiAoIWVuZCkgZW5kID0gcG9zOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucmFuZ2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIHJhbmdlID0gdGhpcy5yYW5nZXNbaV07CiAgICAgICAgaWYgKGNtcChlbmQsIHJhbmdlLmZyb20oKSkgPj0gMCAmJiBjbXAocG9zLCByYW5nZS50bygpKSA8PSAwKQogICAgICAgICAgcmV0dXJuIGk7CiAgICAgIH0KICAgICAgcmV0dXJuIC0xOwogICAgfQogIH07CgogIGZ1bmN0aW9uIFJhbmdlKGFuY2hvciwgaGVhZCkgewogICAgdGhpcy5hbmNob3IgPSBhbmNob3I7IHRoaXMuaGVhZCA9IGhlYWQ7CiAgfQoKICBSYW5nZS5wcm90b3R5cGUgPSB7CiAgICBmcm9tOiBmdW5jdGlvbigpIHsgcmV0dXJuIG1pblBvcyh0aGlzLmFuY2hvciwgdGhpcy5oZWFkKTsgfSwKICAgIHRvOiBmdW5jdGlvbigpIHsgcmV0dXJuIG1heFBvcyh0aGlzLmFuY2hvciwgdGhpcy5oZWFkKTsgfSwKICAgIGVtcHR5OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHRoaXMuaGVhZC5saW5lID09IHRoaXMuYW5jaG9yLmxpbmUgJiYgdGhpcy5oZWFkLmNoID09IHRoaXMuYW5jaG9yLmNoOwogICAgfQogIH07CgogIC8vIFRha2UgYW4gdW5zb3J0ZWQsIHBvdGVudGlhbGx5IG92ZXJsYXBwaW5nIHNldCBvZiByYW5nZXMsIGFuZAogIC8vIGJ1aWxkIGEgc2VsZWN0aW9uIG91dCBvZiBpdC4gJ0NvbnN1bWVzJyByYW5nZXMgYXJyYXkgKG1vZGlmeWluZwogIC8vIGl0KS4KICBmdW5jdGlvbiBub3JtYWxpemVTZWxlY3Rpb24ocmFuZ2VzLCBwcmltSW5kZXgpIHsKICAgIHZhciBwcmltID0gcmFuZ2VzW3ByaW1JbmRleF07CiAgICByYW5nZXMuc29ydChmdW5jdGlvbihhLCBiKSB7IHJldHVybiBjbXAoYS5mcm9tKCksIGIuZnJvbSgpKTsgfSk7CiAgICBwcmltSW5kZXggPSBpbmRleE9mKHJhbmdlcywgcHJpbSk7CiAgICBmb3IgKHZhciBpID0gMTsgaSA8IHJhbmdlcy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgY3VyID0gcmFuZ2VzW2ldLCBwcmV2ID0gcmFuZ2VzW2kgLSAxXTsKICAgICAgaWYgKGNtcChwcmV2LnRvKCksIGN1ci5mcm9tKCkpID49IDApIHsKICAgICAgICB2YXIgZnJvbSA9IG1pblBvcyhwcmV2LmZyb20oKSwgY3VyLmZyb20oKSksIHRvID0gbWF4UG9zKHByZXYudG8oKSwgY3VyLnRvKCkpOwogICAgICAgIHZhciBpbnYgPSBwcmV2LmVtcHR5KCkgPyBjdXIuZnJvbSgpID09IGN1ci5oZWFkIDogcHJldi5mcm9tKCkgPT0gcHJldi5oZWFkOwogICAgICAgIGlmIChpIDw9IHByaW1JbmRleCkgLS1wcmltSW5kZXg7CiAgICAgICAgcmFuZ2VzLnNwbGljZSgtLWksIDIsIG5ldyBSYW5nZShpbnYgPyB0byA6IGZyb20sIGludiA/IGZyb20gOiB0bykpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmV3IFNlbGVjdGlvbihyYW5nZXMsIHByaW1JbmRleCk7CiAgfQoKICBmdW5jdGlvbiBzaW1wbGVTZWxlY3Rpb24oYW5jaG9yLCBoZWFkKSB7CiAgICByZXR1cm4gbmV3IFNlbGVjdGlvbihbbmV3IFJhbmdlKGFuY2hvciwgaGVhZCB8fCBhbmNob3IpXSwgMCk7CiAgfQoKICAvLyBNb3N0IG9mIHRoZSBleHRlcm5hbCBBUEkgY2xpcHMgZ2l2ZW4gcG9zaXRpb25zIHRvIG1ha2Ugc3VyZSB0aGV5CiAgLy8gYWN0dWFsbHkgZXhpc3Qgd2l0aGluIHRoZSBkb2N1bWVudC4KICBmdW5jdGlvbiBjbGlwTGluZShkb2MsIG4pIHtyZXR1cm4gTWF0aC5tYXgoZG9jLmZpcnN0LCBNYXRoLm1pbihuLCBkb2MuZmlyc3QgKyBkb2Muc2l6ZSAtIDEpKTt9CiAgZnVuY3Rpb24gY2xpcFBvcyhkb2MsIHBvcykgewogICAgaWYgKHBvcy5saW5lIDwgZG9jLmZpcnN0KSByZXR1cm4gUG9zKGRvYy5maXJzdCwgMCk7CiAgICB2YXIgbGFzdCA9IGRvYy5maXJzdCArIGRvYy5zaXplIC0gMTsKICAgIGlmIChwb3MubGluZSA+IGxhc3QpIHJldHVybiBQb3MobGFzdCwgZ2V0TGluZShkb2MsIGxhc3QpLnRleHQubGVuZ3RoKTsKICAgIHJldHVybiBjbGlwVG9MZW4ocG9zLCBnZXRMaW5lKGRvYywgcG9zLmxpbmUpLnRleHQubGVuZ3RoKTsKICB9CiAgZnVuY3Rpb24gY2xpcFRvTGVuKHBvcywgbGluZWxlbikgewogICAgdmFyIGNoID0gcG9zLmNoOwogICAgaWYgKGNoID09IG51bGwgfHwgY2ggPiBsaW5lbGVuKSByZXR1cm4gUG9zKHBvcy5saW5lLCBsaW5lbGVuKTsKICAgIGVsc2UgaWYgKGNoIDwgMCkgcmV0dXJuIFBvcyhwb3MubGluZSwgMCk7CiAgICBlbHNlIHJldHVybiBwb3M7CiAgfQogIGZ1bmN0aW9uIGlzTGluZShkb2MsIGwpIHtyZXR1cm4gbCA+PSBkb2MuZmlyc3QgJiYgbCA8IGRvYy5maXJzdCArIGRvYy5zaXplO30KICBmdW5jdGlvbiBjbGlwUG9zQXJyYXkoZG9jLCBhcnJheSkgewogICAgZm9yICh2YXIgb3V0ID0gW10sIGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIG91dFtpXSA9IGNsaXBQb3MoZG9jLCBhcnJheVtpXSk7CiAgICByZXR1cm4gb3V0OwogIH0KCiAgLy8gU0VMRUNUSU9OIFVQREFURVMKCiAgLy8gVGhlICdzY3JvbGwnIHBhcmFtZXRlciBnaXZlbiB0byBtYW55IG9mIHRoZXNlIGluZGljYXRlZCB3aGV0aGVyCiAgLy8gdGhlIG5ldyBjdXJzb3IgcG9zaXRpb24gc2hvdWxkIGJlIHNjcm9sbGVkIGludG8gdmlldyBhZnRlcgogIC8vIG1vZGlmeWluZyB0aGUgc2VsZWN0aW9uLgoKICAvLyBJZiBzaGlmdCBpcyBoZWxkIG9yIHRoZSBleHRlbmQgZmxhZyBpcyBzZXQsIGV4dGVuZHMgYSByYW5nZSB0bwogIC8vIGluY2x1ZGUgYSBnaXZlbiBwb3NpdGlvbiAoYW5kIG9wdGlvbmFsbHkgYSBzZWNvbmQgcG9zaXRpb24pLgogIC8vIE90aGVyd2lzZSwgc2ltcGx5IHJldHVybnMgdGhlIHJhbmdlIGJldHdlZW4gdGhlIGdpdmVuIHBvc2l0aW9ucy4KICAvLyBVc2VkIGZvciBjdXJzb3IgbW90aW9uIGFuZCBzdWNoLgogIGZ1bmN0aW9uIGV4dGVuZFJhbmdlKGRvYywgcmFuZ2UsIGhlYWQsIG90aGVyKSB7CiAgICBpZiAoZG9jLmNtICYmIGRvYy5jbS5kaXNwbGF5LnNoaWZ0IHx8IGRvYy5leHRlbmQpIHsKICAgICAgdmFyIGFuY2hvciA9IHJhbmdlLmFuY2hvcjsKICAgICAgaWYgKG90aGVyKSB7CiAgICAgICAgdmFyIHBvc0JlZm9yZSA9IGNtcChoZWFkLCBhbmNob3IpIDwgMDsKICAgICAgICBpZiAocG9zQmVmb3JlICE9IChjbXAob3RoZXIsIGFuY2hvcikgPCAwKSkgewogICAgICAgICAgYW5jaG9yID0gaGVhZDsKICAgICAgICAgIGhlYWQgPSBvdGhlcjsKICAgICAgICB9IGVsc2UgaWYgKHBvc0JlZm9yZSAhPSAoY21wKGhlYWQsIG90aGVyKSA8IDApKSB7CiAgICAgICAgICBoZWFkID0gb3RoZXI7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBuZXcgUmFuZ2UoYW5jaG9yLCBoZWFkKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBuZXcgUmFuZ2Uob3RoZXIgfHwgaGVhZCwgaGVhZCk7CiAgICB9CiAgfQoKICAvLyBFeHRlbmQgdGhlIHByaW1hcnkgc2VsZWN0aW9uIHJhbmdlLCBkaXNjYXJkIHRoZSByZXN0LgogIGZ1bmN0aW9uIGV4dGVuZFNlbGVjdGlvbihkb2MsIGhlYWQsIG90aGVyLCBvcHRpb25zKSB7CiAgICBzZXRTZWxlY3Rpb24oZG9jLCBuZXcgU2VsZWN0aW9uKFtleHRlbmRSYW5nZShkb2MsIGRvYy5zZWwucHJpbWFyeSgpLCBoZWFkLCBvdGhlcildLCAwKSwgb3B0aW9ucyk7CiAgfQoKICAvLyBFeHRlbmQgYWxsIHNlbGVjdGlvbnMgKHBvcyBpcyBhbiBhcnJheSBvZiBzZWxlY3Rpb25zIHdpdGggbGVuZ3RoCiAgLy8gZXF1YWwgdGhlIG51bWJlciBvZiBzZWxlY3Rpb25zKQogIGZ1bmN0aW9uIGV4dGVuZFNlbGVjdGlvbnMoZG9jLCBoZWFkcywgb3B0aW9ucykgewogICAgZm9yICh2YXIgb3V0ID0gW10sIGkgPSAwOyBpIDwgZG9jLnNlbC5yYW5nZXMubGVuZ3RoOyBpKyspCiAgICAgIG91dFtpXSA9IGV4dGVuZFJhbmdlKGRvYywgZG9jLnNlbC5yYW5nZXNbaV0sIGhlYWRzW2ldLCBudWxsKTsKICAgIHZhciBuZXdTZWwgPSBub3JtYWxpemVTZWxlY3Rpb24ob3V0LCBkb2Muc2VsLnByaW1JbmRleCk7CiAgICBzZXRTZWxlY3Rpb24oZG9jLCBuZXdTZWwsIG9wdGlvbnMpOwogIH0KCiAgLy8gVXBkYXRlcyBhIHNpbmdsZSByYW5nZSBpbiB0aGUgc2VsZWN0aW9uLgogIGZ1bmN0aW9uIHJlcGxhY2VPbmVTZWxlY3Rpb24oZG9jLCBpLCByYW5nZSwgb3B0aW9ucykgewogICAgdmFyIHJhbmdlcyA9IGRvYy5zZWwucmFuZ2VzLnNsaWNlKDApOwogICAgcmFuZ2VzW2ldID0gcmFuZ2U7CiAgICBzZXRTZWxlY3Rpb24oZG9jLCBub3JtYWxpemVTZWxlY3Rpb24ocmFuZ2VzLCBkb2Muc2VsLnByaW1JbmRleCksIG9wdGlvbnMpOwogIH0KCiAgLy8gUmVzZXQgdGhlIHNlbGVjdGlvbiB0byBhIHNpbmdsZSByYW5nZS4KICBmdW5jdGlvbiBzZXRTaW1wbGVTZWxlY3Rpb24oZG9jLCBhbmNob3IsIGhlYWQsIG9wdGlvbnMpIHsKICAgIHNldFNlbGVjdGlvbihkb2MsIHNpbXBsZVNlbGVjdGlvbihhbmNob3IsIGhlYWQpLCBvcHRpb25zKTsKICB9CgogIC8vIEdpdmUgYmVmb3JlU2VsZWN0aW9uQ2hhbmdlIGhhbmRsZXJzIGEgY2hhbmdlIHRvIGluZmx1ZW5jZSBhCiAgLy8gc2VsZWN0aW9uIHVwZGF0ZS4KICBmdW5jdGlvbiBmaWx0ZXJTZWxlY3Rpb25DaGFuZ2UoZG9jLCBzZWwpIHsKICAgIHZhciBvYmogPSB7CiAgICAgIHJhbmdlczogc2VsLnJhbmdlcywKICAgICAgdXBkYXRlOiBmdW5jdGlvbihyYW5nZXMpIHsKICAgICAgICB0aGlzLnJhbmdlcyA9IFtdOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSsrKQogICAgICAgICAgdGhpcy5yYW5nZXNbaV0gPSBuZXcgUmFuZ2UoY2xpcFBvcyhkb2MsIHJhbmdlc1tpXS5hbmNob3IpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcFBvcyhkb2MsIHJhbmdlc1tpXS5oZWFkKSk7CiAgICAgIH0KICAgIH07CiAgICBzaWduYWwoZG9jLCAiYmVmb3JlU2VsZWN0aW9uQ2hhbmdlIiwgZG9jLCBvYmopOwogICAgaWYgKGRvYy5jbSkgc2lnbmFsKGRvYy5jbSwgImJlZm9yZVNlbGVjdGlvbkNoYW5nZSIsIGRvYy5jbSwgb2JqKTsKICAgIGlmIChvYmoucmFuZ2VzICE9IHNlbC5yYW5nZXMpIHJldHVybiBub3JtYWxpemVTZWxlY3Rpb24ob2JqLnJhbmdlcywgb2JqLnJhbmdlcy5sZW5ndGggLSAxKTsKICAgIGVsc2UgcmV0dXJuIHNlbDsKICB9CgogIGZ1bmN0aW9uIHNldFNlbGVjdGlvblJlcGxhY2VIaXN0b3J5KGRvYywgc2VsLCBvcHRpb25zKSB7CiAgICB2YXIgZG9uZSA9IGRvYy5oaXN0b3J5LmRvbmUsIGxhc3QgPSBsc3QoZG9uZSk7CiAgICBpZiAobGFzdCAmJiBsYXN0LnJhbmdlcykgewogICAgICBkb25lW2RvbmUubGVuZ3RoIC0gMV0gPSBzZWw7CiAgICAgIHNldFNlbGVjdGlvbk5vVW5kbyhkb2MsIHNlbCwgb3B0aW9ucyk7CiAgICB9IGVsc2UgewogICAgICBzZXRTZWxlY3Rpb24oZG9jLCBzZWwsIG9wdGlvbnMpOwogICAgfQogIH0KCiAgLy8gU2V0IGEgbmV3IHNlbGVjdGlvbi4KICBmdW5jdGlvbiBzZXRTZWxlY3Rpb24oZG9jLCBzZWwsIG9wdGlvbnMpIHsKICAgIHNldFNlbGVjdGlvbk5vVW5kbyhkb2MsIHNlbCwgb3B0aW9ucyk7CiAgICBhZGRTZWxlY3Rpb25Ub0hpc3RvcnkoZG9jLCBkb2Muc2VsLCBkb2MuY20gPyBkb2MuY20uY3VyT3AuaWQgOiBOYU4sIG9wdGlvbnMpOwogIH0KCiAgZnVuY3Rpb24gc2V0U2VsZWN0aW9uTm9VbmRvKGRvYywgc2VsLCBvcHRpb25zKSB7CiAgICBpZiAoaGFzSGFuZGxlcihkb2MsICJiZWZvcmVTZWxlY3Rpb25DaGFuZ2UiKSB8fCBkb2MuY20gJiYgaGFzSGFuZGxlcihkb2MuY20sICJiZWZvcmVTZWxlY3Rpb25DaGFuZ2UiKSkKICAgICAgc2VsID0gZmlsdGVyU2VsZWN0aW9uQ2hhbmdlKGRvYywgc2VsKTsKCiAgICB2YXIgYmlhcyA9IG9wdGlvbnMgJiYgb3B0aW9ucy5iaWFzIHx8CiAgICAgIChjbXAoc2VsLnByaW1hcnkoKS5oZWFkLCBkb2Muc2VsLnByaW1hcnkoKS5oZWFkKSA8IDAgPyAtMSA6IDEpOwogICAgc2V0U2VsZWN0aW9uSW5uZXIoZG9jLCBza2lwQXRvbWljSW5TZWxlY3Rpb24oZG9jLCBzZWwsIGJpYXMsIHRydWUpKTsKCiAgICBpZiAoIShvcHRpb25zICYmIG9wdGlvbnMuc2Nyb2xsID09PSBmYWxzZSkgJiYgZG9jLmNtKQogICAgICBlbnN1cmVDdXJzb3JWaXNpYmxlKGRvYy5jbSk7CiAgfQoKICBmdW5jdGlvbiBzZXRTZWxlY3Rpb25Jbm5lcihkb2MsIHNlbCkgewogICAgaWYgKHNlbC5lcXVhbHMoZG9jLnNlbCkpIHJldHVybjsKCiAgICBkb2Muc2VsID0gc2VsOwoKICAgIGlmIChkb2MuY20pIHsKICAgICAgZG9jLmNtLmN1ck9wLnVwZGF0ZUlucHV0ID0gZG9jLmNtLmN1ck9wLnNlbGVjdGlvbkNoYW5nZWQgPSB0cnVlOwogICAgICBzaWduYWxDdXJzb3JBY3Rpdml0eShkb2MuY20pOwogICAgfQogICAgc2lnbmFsTGF0ZXIoZG9jLCAiY3Vyc29yQWN0aXZpdHkiLCBkb2MpOwogIH0KCiAgLy8gVmVyaWZ5IHRoYXQgdGhlIHNlbGVjdGlvbiBkb2VzIG5vdCBwYXJ0aWFsbHkgc2VsZWN0IGFueSBhdG9taWMKICAvLyBtYXJrZWQgcmFuZ2VzLgogIGZ1bmN0aW9uIHJlQ2hlY2tTZWxlY3Rpb24oZG9jKSB7CiAgICBzZXRTZWxlY3Rpb25Jbm5lcihkb2MsIHNraXBBdG9taWNJblNlbGVjdGlvbihkb2MsIGRvYy5zZWwsIG51bGwsIGZhbHNlKSwgc2VsX2RvbnRTY3JvbGwpOwogIH0KCiAgLy8gUmV0dXJuIGEgc2VsZWN0aW9uIHRoYXQgZG9lcyBub3QgcGFydGlhbGx5IHNlbGVjdCBhbnkgYXRvbWljCiAgLy8gcmFuZ2VzLgogIGZ1bmN0aW9uIHNraXBBdG9taWNJblNlbGVjdGlvbihkb2MsIHNlbCwgYmlhcywgbWF5Q2xlYXIpIHsKICAgIHZhciBvdXQ7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbC5yYW5nZXMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIHJhbmdlID0gc2VsLnJhbmdlc1tpXTsKICAgICAgdmFyIG5ld0FuY2hvciA9IHNraXBBdG9taWMoZG9jLCByYW5nZS5hbmNob3IsIGJpYXMsIG1heUNsZWFyKTsKICAgICAgdmFyIG5ld0hlYWQgPSBza2lwQXRvbWljKGRvYywgcmFuZ2UuaGVhZCwgYmlhcywgbWF5Q2xlYXIpOwogICAgICBpZiAob3V0IHx8IG5ld0FuY2hvciAhPSByYW5nZS5hbmNob3IgfHwgbmV3SGVhZCAhPSByYW5nZS5oZWFkKSB7CiAgICAgICAgaWYgKCFvdXQpIG91dCA9IHNlbC5yYW5nZXMuc2xpY2UoMCwgaSk7CiAgICAgICAgb3V0W2ldID0gbmV3IFJhbmdlKG5ld0FuY2hvciwgbmV3SGVhZCk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBvdXQgPyBub3JtYWxpemVTZWxlY3Rpb24ob3V0LCBzZWwucHJpbUluZGV4KSA6IHNlbDsKICB9CgogIC8vIEVuc3VyZSBhIGdpdmVuIHBvc2l0aW9uIGlzIG5vdCBpbnNpZGUgYW4gYXRvbWljIHJhbmdlLgogIGZ1bmN0aW9uIHNraXBBdG9taWMoZG9jLCBwb3MsIGJpYXMsIG1heUNsZWFyKSB7CiAgICB2YXIgZmxpcHBlZCA9IGZhbHNlLCBjdXJQb3MgPSBwb3M7CiAgICB2YXIgZGlyID0gYmlhcyB8fCAxOwogICAgZG9jLmNhbnRFZGl0ID0gZmFsc2U7CiAgICBzZWFyY2g6IGZvciAoOzspIHsKICAgICAgdmFyIGxpbmUgPSBnZXRMaW5lKGRvYywgY3VyUG9zLmxpbmUpOwogICAgICBpZiAobGluZS5tYXJrZWRTcGFucykgewogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZS5tYXJrZWRTcGFucy5sZW5ndGg7ICsraSkgewogICAgICAgICAgdmFyIHNwID0gbGluZS5tYXJrZWRTcGFuc1tpXSwgbSA9IHNwLm1hcmtlcjsKICAgICAgICAgIGlmICgoc3AuZnJvbSA9PSBudWxsIHx8IChtLmluY2x1c2l2ZUxlZnQgPyBzcC5mcm9tIDw9IGN1clBvcy5jaCA6IHNwLmZyb20gPCBjdXJQb3MuY2gpKSAmJgogICAgICAgICAgICAgIChzcC50byA9PSBudWxsIHx8IChtLmluY2x1c2l2ZVJpZ2h0ID8gc3AudG8gPj0gY3VyUG9zLmNoIDogc3AudG8gPiBjdXJQb3MuY2gpKSkgewogICAgICAgICAgICBpZiAobWF5Q2xlYXIpIHsKICAgICAgICAgICAgICBzaWduYWwobSwgImJlZm9yZUN1cnNvckVudGVyIik7CiAgICAgICAgICAgICAgaWYgKG0uZXhwbGljaXRseUNsZWFyZWQpIHsKICAgICAgICAgICAgICAgIGlmICghbGluZS5tYXJrZWRTcGFucykgYnJlYWs7CiAgICAgICAgICAgICAgICBlbHNlIHstLWk7IGNvbnRpbnVlO30KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFtLmF0b21pYykgY29udGludWU7CiAgICAgICAgICAgIHZhciBuZXdQb3MgPSBtLmZpbmQoZGlyIDwgMCA/IC0xIDogMSk7CiAgICAgICAgICAgIGlmIChjbXAobmV3UG9zLCBjdXJQb3MpID09IDApIHsKICAgICAgICAgICAgICBuZXdQb3MuY2ggKz0gZGlyOwogICAgICAgICAgICAgIGlmIChuZXdQb3MuY2ggPCAwKSB7CiAgICAgICAgICAgICAgICBpZiAobmV3UG9zLmxpbmUgPiBkb2MuZmlyc3QpIG5ld1BvcyA9IGNsaXBQb3MoZG9jLCBQb3MobmV3UG9zLmxpbmUgLSAxKSk7CiAgICAgICAgICAgICAgICBlbHNlIG5ld1BvcyA9IG51bGw7CiAgICAgICAgICAgICAgfSBlbHNlIGlmIChuZXdQb3MuY2ggPiBsaW5lLnRleHQubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBpZiAobmV3UG9zLmxpbmUgPCBkb2MuZmlyc3QgKyBkb2Muc2l6ZSAtIDEpIG5ld1BvcyA9IFBvcyhuZXdQb3MubGluZSArIDEsIDApOwogICAgICAgICAgICAgICAgZWxzZSBuZXdQb3MgPSBudWxsOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAoIW5ld1BvcykgewogICAgICAgICAgICAgICAgaWYgKGZsaXBwZWQpIHsKICAgICAgICAgICAgICAgICAgLy8gRHJpdmVuIGluIGEgY29ybmVyIC0tIG5vIHZhbGlkIGN1cnNvciBwb3NpdGlvbiBmb3VuZCBhdCBhbGwKICAgICAgICAgICAgICAgICAgLy8gLS0gdHJ5IGFnYWluICp3aXRoKiBjbGVhcmluZywgaWYgd2UgZGlkbid0IGFscmVhZHkKICAgICAgICAgICAgICAgICAgaWYgKCFtYXlDbGVhcikgcmV0dXJuIHNraXBBdG9taWMoZG9jLCBwb3MsIGJpYXMsIHRydWUpOwogICAgICAgICAgICAgICAgICAvLyBPdGhlcndpc2UsIHR1cm4gb2ZmIGVkaXRpbmcgdW50aWwgZnVydGhlciBub3RpY2UsIGFuZCByZXR1cm4gdGhlIHN0YXJ0IG9mIHRoZSBkb2MKICAgICAgICAgICAgICAgICAgZG9jLmNhbnRFZGl0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgcmV0dXJuIFBvcyhkb2MuZmlyc3QsIDApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZmxpcHBlZCA9IHRydWU7IG5ld1BvcyA9IHBvczsgZGlyID0gLWRpcjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY3VyUG9zID0gbmV3UG9zOwogICAgICAgICAgICBjb250aW51ZSBzZWFyY2g7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBjdXJQb3M7CiAgICB9CiAgfQoKICAvLyBTRUxFQ1RJT04gRFJBV0lORwoKICAvLyBSZWRyYXcgdGhlIHNlbGVjdGlvbiBhbmQvb3IgY3Vyc29yCiAgZnVuY3Rpb24gZHJhd1NlbGVjdGlvbihjbSkgewogICAgdmFyIGRpc3BsYXkgPSBjbS5kaXNwbGF5LCBkb2MgPSBjbS5kb2MsIHJlc3VsdCA9IHt9OwogICAgdmFyIGN1ckZyYWdtZW50ID0gcmVzdWx0LmN1cnNvcnMgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7CiAgICB2YXIgc2VsRnJhZ21lbnQgPSByZXN1bHQuc2VsZWN0aW9uID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpOwoKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZG9jLnNlbC5yYW5nZXMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIHJhbmdlID0gZG9jLnNlbC5yYW5nZXNbaV07CiAgICAgIHZhciBjb2xsYXBzZWQgPSByYW5nZS5lbXB0eSgpOwogICAgICBpZiAoY29sbGFwc2VkIHx8IGNtLm9wdGlvbnMuc2hvd0N1cnNvcldoZW5TZWxlY3RpbmcpCiAgICAgICAgZHJhd1NlbGVjdGlvbkN1cnNvcihjbSwgcmFuZ2UsIGN1ckZyYWdtZW50KTsKICAgICAgaWYgKCFjb2xsYXBzZWQpCiAgICAgICAgZHJhd1NlbGVjdGlvblJhbmdlKGNtLCByYW5nZSwgc2VsRnJhZ21lbnQpOwogICAgfQoKICAgIC8vIE1vdmUgdGhlIGhpZGRlbiB0ZXh0YXJlYSBuZWFyIHRoZSBjdXJzb3IgdG8gcHJldmVudCBzY3JvbGxpbmcgYXJ0aWZhY3RzCiAgICBpZiAoY20ub3B0aW9ucy5tb3ZlSW5wdXRXaXRoQ3Vyc29yKSB7CiAgICAgIHZhciBoZWFkUG9zID0gY3Vyc29yQ29vcmRzKGNtLCBkb2Muc2VsLnByaW1hcnkoKS5oZWFkLCAiZGl2Iik7CiAgICAgIHZhciB3cmFwT2ZmID0gZGlzcGxheS53cmFwcGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCBsaW5lT2ZmID0gZGlzcGxheS5saW5lRGl2LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICByZXN1bHQudGVUb3AgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihkaXNwbGF5LndyYXBwZXIuY2xpZW50SGVpZ2h0IC0gMTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRQb3MudG9wICsgbGluZU9mZi50b3AgLSB3cmFwT2ZmLnRvcCkpOwogICAgICByZXN1bHQudGVMZWZ0ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oZGlzcGxheS53cmFwcGVyLmNsaWVudFdpZHRoIC0gMTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkUG9zLmxlZnQgKyBsaW5lT2ZmLmxlZnQgLSB3cmFwT2ZmLmxlZnQpKTsKICAgIH0KCiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgZnVuY3Rpb24gdXBkYXRlU2VsZWN0aW9uKGNtLCBkcmF3bikgewogICAgaWYgKCFkcmF3bikgZHJhd24gPSBkcmF3U2VsZWN0aW9uKGNtKTsKICAgIHJlbW92ZUNoaWxkcmVuQW5kQWRkKGNtLmRpc3BsYXkuY3Vyc29yRGl2LCBkcmF3bi5jdXJzb3JzKTsKICAgIHJlbW92ZUNoaWxkcmVuQW5kQWRkKGNtLmRpc3BsYXkuc2VsZWN0aW9uRGl2LCBkcmF3bi5zZWxlY3Rpb24pOwogICAgaWYgKGRyYXduLnRlVG9wICE9IG51bGwpIHsKICAgICAgY20uZGlzcGxheS5pbnB1dERpdi5zdHlsZS50b3AgPSBkcmF3bi50ZVRvcCArICJweCI7CiAgICAgIGNtLmRpc3BsYXkuaW5wdXREaXYuc3R5bGUubGVmdCA9IGRyYXduLnRlTGVmdCArICJweCI7CiAgICB9CiAgfQoKICAvLyBEcmF3cyBhIGN1cnNvciBmb3IgdGhlIGdpdmVuIHJhbmdlCiAgZnVuY3Rpb24gZHJhd1NlbGVjdGlvbkN1cnNvcihjbSwgcmFuZ2UsIG91dHB1dCkgewogICAgdmFyIHBvcyA9IGN1cnNvckNvb3JkcyhjbSwgcmFuZ2UuaGVhZCwgImRpdiIsIG51bGwsIG51bGwsICFjbS5vcHRpb25zLnNpbmdsZUN1cnNvckhlaWdodFBlckxpbmUpOwoKICAgIHZhciBjdXJzb3IgPSBvdXRwdXQuYXBwZW5kQ2hpbGQoZWx0KCJkaXYiLCAiXHUwMGEwIiwgIkNvZGVNaXJyb3ItY3Vyc29yIikpOwogICAgY3Vyc29yLnN0eWxlLmxlZnQgPSBwb3MubGVmdCArICJweCI7CiAgICBjdXJzb3Iuc3R5bGUudG9wID0gcG9zLnRvcCArICJweCI7CiAgICBjdXJzb3Iuc3R5bGUuaGVpZ2h0ID0gTWF0aC5tYXgoMCwgcG9zLmJvdHRvbSAtIHBvcy50b3ApICogY20ub3B0aW9ucy5jdXJzb3JIZWlnaHQgKyAicHgiOwoKICAgIGlmIChwb3Mub3RoZXIpIHsKICAgICAgLy8gU2Vjb25kYXJ5IGN1cnNvciwgc2hvd24gd2hlbiBvbiBhICdqdW1wJyBpbiBiaS1kaXJlY3Rpb25hbCB0ZXh0CiAgICAgIHZhciBvdGhlckN1cnNvciA9IG91dHB1dC5hcHBlbmRDaGlsZChlbHQoImRpdiIsICJcdTAwYTAiLCAiQ29kZU1pcnJvci1jdXJzb3IgQ29kZU1pcnJvci1zZWNvbmRhcnljdXJzb3IiKSk7CiAgICAgIG90aGVyQ3Vyc29yLnN0eWxlLmRpc3BsYXkgPSAiIjsKICAgICAgb3RoZXJDdXJzb3Iuc3R5bGUubGVmdCA9IHBvcy5vdGhlci5sZWZ0ICsgInB4IjsKICAgICAgb3RoZXJDdXJzb3Iuc3R5bGUudG9wID0gcG9zLm90aGVyLnRvcCArICJweCI7CiAgICAgIG90aGVyQ3Vyc29yLnN0eWxlLmhlaWdodCA9IChwb3Mub3RoZXIuYm90dG9tIC0gcG9zLm90aGVyLnRvcCkgKiAuODUgKyAicHgiOwogICAgfQogIH0KCiAgLy8gRHJhd3MgdGhlIGdpdmVuIHJhbmdlIGFzIGEgaGlnaGxpZ2h0ZWQgc2VsZWN0aW9uCiAgZnVuY3Rpb24gZHJhd1NlbGVjdGlvblJhbmdlKGNtLCByYW5nZSwgb3V0cHV0KSB7CiAgICB2YXIgZGlzcGxheSA9IGNtLmRpc3BsYXksIGRvYyA9IGNtLmRvYzsKICAgIHZhciBmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsKICAgIHZhciBwYWRkaW5nID0gcGFkZGluZ0goY20uZGlzcGxheSksIGxlZnRTaWRlID0gcGFkZGluZy5sZWZ0LCByaWdodFNpZGUgPSBkaXNwbGF5LmxpbmVTcGFjZS5vZmZzZXRXaWR0aCAtIHBhZGRpbmcucmlnaHQ7CgogICAgZnVuY3Rpb24gYWRkKGxlZnQsIHRvcCwgd2lkdGgsIGJvdHRvbSkgewogICAgICBpZiAodG9wIDwgMCkgdG9wID0gMDsKICAgICAgdG9wID0gTWF0aC5yb3VuZCh0b3ApOwogICAgICBib3R0b20gPSBNYXRoLnJvdW5kKGJvdHRvbSk7CiAgICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKGVsdCgiZGl2IiwgbnVsbCwgIkNvZGVNaXJyb3Itc2VsZWN0ZWQiLCAicG9zaXRpb246IGFic29sdXRlOyBsZWZ0OiAiICsgbGVmdCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHg7IHRvcDogIiArIHRvcCArICJweDsgd2lkdGg6ICIgKyAod2lkdGggPT0gbnVsbCA/IHJpZ2h0U2lkZSAtIGxlZnQgOiB3aWR0aCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInB4OyBoZWlnaHQ6ICIgKyAoYm90dG9tIC0gdG9wKSArICJweCIpKTsKICAgIH0KCiAgICBmdW5jdGlvbiBkcmF3Rm9yTGluZShsaW5lLCBmcm9tQXJnLCB0b0FyZykgewogICAgICB2YXIgbGluZU9iaiA9IGdldExpbmUoZG9jLCBsaW5lKTsKICAgICAgdmFyIGxpbmVMZW4gPSBsaW5lT2JqLnRleHQubGVuZ3RoOwogICAgICB2YXIgc3RhcnQsIGVuZDsKICAgICAgZnVuY3Rpb24gY29vcmRzKGNoLCBiaWFzKSB7CiAgICAgICAgcmV0dXJuIGNoYXJDb29yZHMoY20sIFBvcyhsaW5lLCBjaCksICJkaXYiLCBsaW5lT2JqLCBiaWFzKTsKICAgICAgfQoKICAgICAgaXRlcmF0ZUJpZGlTZWN0aW9ucyhnZXRPcmRlcihsaW5lT2JqKSwgZnJvbUFyZyB8fCAwLCB0b0FyZyA9PSBudWxsID8gbGluZUxlbiA6IHRvQXJnLCBmdW5jdGlvbihmcm9tLCB0bywgZGlyKSB7CiAgICAgICAgdmFyIGxlZnRQb3MgPSBjb29yZHMoZnJvbSwgImxlZnQiKSwgcmlnaHRQb3MsIGxlZnQsIHJpZ2h0OwogICAgICAgIGlmIChmcm9tID09IHRvKSB7CiAgICAgICAgICByaWdodFBvcyA9IGxlZnRQb3M7CiAgICAgICAgICBsZWZ0ID0gcmlnaHQgPSBsZWZ0UG9zLmxlZnQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJpZ2h0UG9zID0gY29vcmRzKHRvIC0gMSwgInJpZ2h0Iik7CiAgICAgICAgICBpZiAoZGlyID09ICJydGwiKSB7IHZhciB0bXAgPSBsZWZ0UG9zOyBsZWZ0UG9zID0gcmlnaHRQb3M7IHJpZ2h0UG9zID0gdG1wOyB9CiAgICAgICAgICBsZWZ0ID0gbGVmdFBvcy5sZWZ0OwogICAgICAgICAgcmlnaHQgPSByaWdodFBvcy5yaWdodDsKICAgICAgICB9CiAgICAgICAgaWYgKGZyb21BcmcgPT0gbnVsbCAmJiBmcm9tID09IDApIGxlZnQgPSBsZWZ0U2lkZTsKICAgICAgICBpZiAocmlnaHRQb3MudG9wIC0gbGVmdFBvcy50b3AgPiAzKSB7IC8vIERpZmZlcmVudCBsaW5lcywgZHJhdyB0b3AgcGFydAogICAgICAgICAgYWRkKGxlZnQsIGxlZnRQb3MudG9wLCBudWxsLCBsZWZ0UG9zLmJvdHRvbSk7CiAgICAgICAgICBsZWZ0ID0gbGVmdFNpZGU7CiAgICAgICAgICBpZiAobGVmdFBvcy5ib3R0b20gPCByaWdodFBvcy50b3ApIGFkZChsZWZ0LCBsZWZ0UG9zLmJvdHRvbSwgbnVsbCwgcmlnaHRQb3MudG9wKTsKICAgICAgICB9CiAgICAgICAgaWYgKHRvQXJnID09IG51bGwgJiYgdG8gPT0gbGluZUxlbikgcmlnaHQgPSByaWdodFNpZGU7CiAgICAgICAgaWYgKCFzdGFydCB8fCBsZWZ0UG9zLnRvcCA8IHN0YXJ0LnRvcCB8fCBsZWZ0UG9zLnRvcCA9PSBzdGFydC50b3AgJiYgbGVmdFBvcy5sZWZ0IDwgc3RhcnQubGVmdCkKICAgICAgICAgIHN0YXJ0ID0gbGVmdFBvczsKICAgICAgICBpZiAoIWVuZCB8fCByaWdodFBvcy5ib3R0b20gPiBlbmQuYm90dG9tIHx8IHJpZ2h0UG9zLmJvdHRvbSA9PSBlbmQuYm90dG9tICYmIHJpZ2h0UG9zLnJpZ2h0ID4gZW5kLnJpZ2h0KQogICAgICAgICAgZW5kID0gcmlnaHRQb3M7CiAgICAgICAgaWYgKGxlZnQgPCBsZWZ0U2lkZSArIDEpIGxlZnQgPSBsZWZ0U2lkZTsKICAgICAgICBhZGQobGVmdCwgcmlnaHRQb3MudG9wLCByaWdodCAtIGxlZnQsIHJpZ2h0UG9zLmJvdHRvbSk7CiAgICAgIH0pOwogICAgICByZXR1cm4ge3N0YXJ0OiBzdGFydCwgZW5kOiBlbmR9OwogICAgfQoKICAgIHZhciBzRnJvbSA9IHJhbmdlLmZyb20oKSwgc1RvID0gcmFuZ2UudG8oKTsKICAgIGlmIChzRnJvbS5saW5lID09IHNUby5saW5lKSB7CiAgICAgIGRyYXdGb3JMaW5lKHNGcm9tLmxpbmUsIHNGcm9tLmNoLCBzVG8uY2gpOwogICAgfSBlbHNlIHsKICAgICAgdmFyIGZyb21MaW5lID0gZ2V0TGluZShkb2MsIHNGcm9tLmxpbmUpLCB0b0xpbmUgPSBnZXRMaW5lKGRvYywgc1RvLmxpbmUpOwogICAgICB2YXIgc2luZ2xlVkxpbmUgPSB2aXN1YWxMaW5lKGZyb21MaW5lKSA9PSB2aXN1YWxMaW5lKHRvTGluZSk7CiAgICAgIHZhciBsZWZ0RW5kID0gZHJhd0ZvckxpbmUoc0Zyb20ubGluZSwgc0Zyb20uY2gsIHNpbmdsZVZMaW5lID8gZnJvbUxpbmUudGV4dC5sZW5ndGggKyAxIDogbnVsbCkuZW5kOwogICAgICB2YXIgcmlnaHRTdGFydCA9IGRyYXdGb3JMaW5lKHNUby5saW5lLCBzaW5nbGVWTGluZSA/IDAgOiBudWxsLCBzVG8uY2gpLnN0YXJ0OwogICAgICBpZiAoc2luZ2xlVkxpbmUpIHsKICAgICAgICBpZiAobGVmdEVuZC50b3AgPCByaWdodFN0YXJ0LnRvcCAtIDIpIHsKICAgICAgICAgIGFkZChsZWZ0RW5kLnJpZ2h0LCBsZWZ0RW5kLnRvcCwgbnVsbCwgbGVmdEVuZC5ib3R0b20pOwogICAgICAgICAgYWRkKGxlZnRTaWRlLCByaWdodFN0YXJ0LnRvcCwgcmlnaHRTdGFydC5sZWZ0LCByaWdodFN0YXJ0LmJvdHRvbSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGFkZChsZWZ0RW5kLnJpZ2h0LCBsZWZ0RW5kLnRvcCwgcmlnaHRTdGFydC5sZWZ0IC0gbGVmdEVuZC5yaWdodCwgbGVmdEVuZC5ib3R0b20pOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAobGVmdEVuZC5ib3R0b20gPCByaWdodFN0YXJ0LnRvcCkKICAgICAgICBhZGQobGVmdFNpZGUsIGxlZnRFbmQuYm90dG9tLCBudWxsLCByaWdodFN0YXJ0LnRvcCk7CiAgICB9CgogICAgb3V0cHV0LmFwcGVuZENoaWxkKGZyYWdtZW50KTsKICB9CgogIC8vIEN1cnNvci1ibGlua2luZwogIGZ1bmN0aW9uIHJlc3RhcnRCbGluayhjbSkgewogICAgaWYgKCFjbS5zdGF0ZS5mb2N1c2VkKSByZXR1cm47CiAgICB2YXIgZGlzcGxheSA9IGNtLmRpc3BsYXk7CiAgICBjbGVhckludGVydmFsKGRpc3BsYXkuYmxpbmtlcik7CiAgICB2YXIgb24gPSB0cnVlOwogICAgZGlzcGxheS5jdXJzb3JEaXYuc3R5bGUudmlzaWJpbGl0eSA9ICIiOwogICAgaWYgKGNtLm9wdGlvbnMuY3Vyc29yQmxpbmtSYXRlID4gMCkKICAgICAgZGlzcGxheS5ibGlua2VyID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7CiAgICAgICAgZGlzcGxheS5jdXJzb3JEaXYuc3R5bGUudmlzaWJpbGl0eSA9IChvbiA9ICFvbikgPyAiIiA6ICJoaWRkZW4iOwogICAgICB9LCBjbS5vcHRpb25zLmN1cnNvckJsaW5rUmF0ZSk7CiAgICBlbHNlIGlmIChjbS5vcHRpb25zLmN1cnNvckJsaW5rUmF0ZSA8IDApCiAgICAgIGRpc3BsYXkuY3Vyc29yRGl2LnN0eWxlLnZpc2liaWxpdHkgPSAiaGlkZGVuIjsKICB9CgogIC8vIEhJR0hMSUdIVCBXT1JLRVIKCiAgZnVuY3Rpb24gc3RhcnRXb3JrZXIoY20sIHRpbWUpIHsKICAgIGlmIChjbS5kb2MubW9kZS5zdGFydFN0YXRlICYmIGNtLmRvYy5mcm9udGllciA8IGNtLmRpc3BsYXkudmlld1RvKQogICAgICBjbS5zdGF0ZS5oaWdobGlnaHQuc2V0KHRpbWUsIGJpbmQoaGlnaGxpZ2h0V29ya2VyLCBjbSkpOwogIH0KCiAgZnVuY3Rpb24gaGlnaGxpZ2h0V29ya2VyKGNtKSB7CiAgICB2YXIgZG9jID0gY20uZG9jOwogICAgaWYgKGRvYy5mcm9udGllciA8IGRvYy5maXJzdCkgZG9jLmZyb250aWVyID0gZG9jLmZpcnN0OwogICAgaWYgKGRvYy5mcm9udGllciA+PSBjbS5kaXNwbGF5LnZpZXdUbykgcmV0dXJuOwogICAgdmFyIGVuZCA9ICtuZXcgRGF0ZSArIGNtLm9wdGlvbnMud29ya1RpbWU7CiAgICB2YXIgc3RhdGUgPSBjb3B5U3RhdGUoZG9jLm1vZGUsIGdldFN0YXRlQmVmb3JlKGNtLCBkb2MuZnJvbnRpZXIpKTsKICAgIHZhciBjaGFuZ2VkTGluZXMgPSBbXTsKCiAgICBkb2MuaXRlcihkb2MuZnJvbnRpZXIsIE1hdGgubWluKGRvYy5maXJzdCArIGRvYy5zaXplLCBjbS5kaXNwbGF5LnZpZXdUbyArIDUwMCksIGZ1bmN0aW9uKGxpbmUpIHsKICAgICAgaWYgKGRvYy5mcm9udGllciA+PSBjbS5kaXNwbGF5LnZpZXdGcm9tKSB7IC8vIFZpc2libGUKICAgICAgICB2YXIgb2xkU3R5bGVzID0gbGluZS5zdHlsZXM7CiAgICAgICAgdmFyIGhpZ2hsaWdodGVkID0gaGlnaGxpZ2h0TGluZShjbSwgbGluZSwgc3RhdGUsIHRydWUpOwogICAgICAgIGxpbmUuc3R5bGVzID0gaGlnaGxpZ2h0ZWQuc3R5bGVzOwogICAgICAgIHZhciBvbGRDbHMgPSBsaW5lLnN0eWxlQ2xhc3NlcywgbmV3Q2xzID0gaGlnaGxpZ2h0ZWQuY2xhc3NlczsKICAgICAgICBpZiAobmV3Q2xzKSBsaW5lLnN0eWxlQ2xhc3NlcyA9IG5ld0NsczsKICAgICAgICBlbHNlIGlmIChvbGRDbHMpIGxpbmUuc3R5bGVDbGFzc2VzID0gbnVsbDsKICAgICAgICB2YXIgaXNjaGFuZ2UgPSAhb2xkU3R5bGVzIHx8IG9sZFN0eWxlcy5sZW5ndGggIT0gbGluZS5zdHlsZXMubGVuZ3RoIHx8CiAgICAgICAgICBvbGRDbHMgIT0gbmV3Q2xzICYmICghb2xkQ2xzIHx8ICFuZXdDbHMgfHwgb2xkQ2xzLmJnQ2xhc3MgIT0gbmV3Q2xzLmJnQ2xhc3MgfHwgb2xkQ2xzLnRleHRDbGFzcyAhPSBuZXdDbHMudGV4dENsYXNzKTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgIWlzY2hhbmdlICYmIGkgPCBvbGRTdHlsZXMubGVuZ3RoOyArK2kpIGlzY2hhbmdlID0gb2xkU3R5bGVzW2ldICE9IGxpbmUuc3R5bGVzW2ldOwogICAgICAgIGlmIChpc2NoYW5nZSkgY2hhbmdlZExpbmVzLnB1c2goZG9jLmZyb250aWVyKTsKICAgICAgICBsaW5lLnN0YXRlQWZ0ZXIgPSBjb3B5U3RhdGUoZG9jLm1vZGUsIHN0YXRlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBwcm9jZXNzTGluZShjbSwgbGluZS50ZXh0LCBzdGF0ZSk7CiAgICAgICAgbGluZS5zdGF0ZUFmdGVyID0gZG9jLmZyb250aWVyICUgNSA9PSAwID8gY29weVN0YXRlKGRvYy5tb2RlLCBzdGF0ZSkgOiBudWxsOwogICAgICB9CiAgICAgICsrZG9jLmZyb250aWVyOwogICAgICBpZiAoK25ldyBEYXRlID4gZW5kKSB7CiAgICAgICAgc3RhcnRXb3JrZXIoY20sIGNtLm9wdGlvbnMud29ya0RlbGF5KTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfSk7CiAgICBpZiAoY2hhbmdlZExpbmVzLmxlbmd0aCkgcnVuSW5PcChjbSwgZnVuY3Rpb24oKSB7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hhbmdlZExpbmVzLmxlbmd0aDsgaSsrKQogICAgICAgIHJlZ0xpbmVDaGFuZ2UoY20sIGNoYW5nZWRMaW5lc1tpXSwgInRleHQiKTsKICAgIH0pOwogIH0KCiAgLy8gRmluZHMgdGhlIGxpbmUgdG8gc3RhcnQgd2l0aCB3aGVuIHN0YXJ0aW5nIGEgcGFyc2UuIFRyaWVzIHRvCiAgLy8gZmluZCBhIGxpbmUgd2l0aCBhIHN0YXRlQWZ0ZXIsIHNvIHRoYXQgaXQgY2FuIHN0YXJ0IHdpdGggYQogIC8vIHZhbGlkIHN0YXRlLiBJZiB0aGF0IGZhaWxzLCBpdCByZXR1cm5zIHRoZSBsaW5lIHdpdGggdGhlCiAgLy8gc21hbGxlc3QgaW5kZW50YXRpb24sIHdoaWNoIHRlbmRzIHRvIG5lZWQgdGhlIGxlYXN0IGNvbnRleHQgdG8KICAvLyBwYXJzZSBjb3JyZWN0bHkuCiAgZnVuY3Rpb24gZmluZFN0YXJ0TGluZShjbSwgbiwgcHJlY2lzZSkgewogICAgdmFyIG1pbmluZGVudCwgbWlubGluZSwgZG9jID0gY20uZG9jOwogICAgdmFyIGxpbSA9IHByZWNpc2UgPyAtMSA6IG4gLSAoY20uZG9jLm1vZGUuaW5uZXJNb2RlID8gMTAwMCA6IDEwMCk7CiAgICBmb3IgKHZhciBzZWFyY2ggPSBuOyBzZWFyY2ggPiBsaW07IC0tc2VhcmNoKSB7CiAgICAgIGlmIChzZWFyY2ggPD0gZG9jLmZpcnN0KSByZXR1cm4gZG9jLmZpcnN0OwogICAgICB2YXIgbGluZSA9IGdldExpbmUoZG9jLCBzZWFyY2ggLSAxKTsKICAgICAgaWYgKGxpbmUuc3RhdGVBZnRlciAmJiAoIXByZWNpc2UgfHwgc2VhcmNoIDw9IGRvYy5mcm9udGllcikpIHJldHVybiBzZWFyY2g7CiAgICAgIHZhciBpbmRlbnRlZCA9IGNvdW50Q29sdW1uKGxpbmUudGV4dCwgbnVsbCwgY20ub3B0aW9ucy50YWJTaXplKTsKICAgICAgaWYgKG1pbmxpbmUgPT0gbnVsbCB8fCBtaW5pbmRlbnQgPiBpbmRlbnRlZCkgewogICAgICAgIG1pbmxpbmUgPSBzZWFyY2ggLSAxOwogICAgICAgIG1pbmluZGVudCA9IGluZGVudGVkOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbWlubGluZTsKICB9CgogIGZ1bmN0aW9uIGdldFN0YXRlQmVmb3JlKGNtLCBuLCBwcmVjaXNlKSB7CiAgICB2YXIgZG9jID0gY20uZG9jLCBkaXNwbGF5ID0gY20uZGlzcGxheTsKICAgIGlmICghZG9jLm1vZGUuc3RhcnRTdGF0ZSkgcmV0dXJuIHRydWU7CiAgICB2YXIgcG9zID0gZmluZFN0YXJ0TGluZShjbSwgbiwgcHJlY2lzZSksIHN0YXRlID0gcG9zID4gZG9jLmZpcnN0ICYmIGdldExpbmUoZG9jLCBwb3MtMSkuc3RhdGVBZnRlcjsKICAgIGlmICghc3RhdGUpIHN0YXRlID0gc3RhcnRTdGF0ZShkb2MubW9kZSk7CiAgICBlbHNlIHN0YXRlID0gY29weVN0YXRlKGRvYy5tb2RlLCBzdGF0ZSk7CiAgICBkb2MuaXRlcihwb3MsIG4sIGZ1bmN0aW9uKGxpbmUpIHsKICAgICAgcHJvY2Vzc0xpbmUoY20sIGxpbmUudGV4dCwgc3RhdGUpOwogICAgICB2YXIgc2F2ZSA9IHBvcyA9PSBuIC0gMSB8fCBwb3MgJSA1ID09IDAgfHwgcG9zID49IGRpc3BsYXkudmlld0Zyb20gJiYgcG9zIDwgZGlzcGxheS52aWV3VG87CiAgICAgIGxpbmUuc3RhdGVBZnRlciA9IHNhdmUgPyBjb3B5U3RhdGUoZG9jLm1vZGUsIHN0YXRlKSA6IG51bGw7CiAgICAgICsrcG9zOwogICAgfSk7CiAgICBpZiAocHJlY2lzZSkgZG9jLmZyb250aWVyID0gcG9zOwogICAgcmV0dXJuIHN0YXRlOwogIH0KCiAgLy8gUE9TSVRJT04gTUVBU1VSRU1FTlQKCiAgZnVuY3Rpb24gcGFkZGluZ1RvcChkaXNwbGF5KSB7cmV0dXJuIGRpc3BsYXkubGluZVNwYWNlLm9mZnNldFRvcDt9CiAgZnVuY3Rpb24gcGFkZGluZ1ZlcnQoZGlzcGxheSkge3JldHVybiBkaXNwbGF5Lm1vdmVyLm9mZnNldEhlaWdodCAtIGRpc3BsYXkubGluZVNwYWNlLm9mZnNldEhlaWdodDt9CiAgZnVuY3Rpb24gcGFkZGluZ0goZGlzcGxheSkgewogICAgaWYgKGRpc3BsYXkuY2FjaGVkUGFkZGluZ0gpIHJldHVybiBkaXNwbGF5LmNhY2hlZFBhZGRpbmdIOwogICAgdmFyIGUgPSByZW1vdmVDaGlsZHJlbkFuZEFkZChkaXNwbGF5Lm1lYXN1cmUsIGVsdCgicHJlIiwgIngiKSk7CiAgICB2YXIgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSA/IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGUpIDogZS5jdXJyZW50U3R5bGU7CiAgICB2YXIgZGF0YSA9IHtsZWZ0OiBwYXJzZUludChzdHlsZS5wYWRkaW5nTGVmdCksIHJpZ2h0OiBwYXJzZUludChzdHlsZS5wYWRkaW5nUmlnaHQpfTsKICAgIGlmICghaXNOYU4oZGF0YS5sZWZ0KSAmJiAhaXNOYU4oZGF0YS5yaWdodCkpIGRpc3BsYXkuY2FjaGVkUGFkZGluZ0ggPSBkYXRhOwogICAgcmV0dXJuIGRhdGE7CiAgfQoKICAvLyBFbnN1cmUgdGhlIGxpbmVWaWV3LndyYXBwaW5nLmhlaWdodHMgYXJyYXkgaXMgcG9wdWxhdGVkLiBUaGlzIGlzCiAgLy8gYW4gYXJyYXkgb2YgYm90dG9tIG9mZnNldHMgZm9yIHRoZSBsaW5lcyB0aGF0IG1ha2UgdXAgYSBkcmF3bgogIC8vIGxpbmUuIFdoZW4gbGluZVdyYXBwaW5nIGlzIG9uLCB0aGVyZSBtaWdodCBiZSBtb3JlIHRoYW4gb25lCiAgLy8gaGVpZ2h0LgogIGZ1bmN0aW9uIGVuc3VyZUxpbmVIZWlnaHRzKGNtLCBsaW5lVmlldywgcmVjdCkgewogICAgdmFyIHdyYXBwaW5nID0gY20ub3B0aW9ucy5saW5lV3JhcHBpbmc7CiAgICB2YXIgY3VyV2lkdGggPSB3cmFwcGluZyAmJiBjbS5kaXNwbGF5LnNjcm9sbGVyLmNsaWVudFdpZHRoOwogICAgaWYgKCFsaW5lVmlldy5tZWFzdXJlLmhlaWdodHMgfHwgd3JhcHBpbmcgJiYgbGluZVZpZXcubWVhc3VyZS53aWR0aCAhPSBjdXJXaWR0aCkgewogICAgICB2YXIgaGVpZ2h0cyA9IGxpbmVWaWV3Lm1lYXN1cmUuaGVpZ2h0cyA9IFtdOwogICAgICBpZiAod3JhcHBpbmcpIHsKICAgICAgICBsaW5lVmlldy5tZWFzdXJlLndpZHRoID0gY3VyV2lkdGg7CiAgICAgICAgdmFyIHJlY3RzID0gbGluZVZpZXcudGV4dC5maXJzdENoaWxkLmdldENsaWVudFJlY3RzKCk7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZWN0cy5sZW5ndGggLSAxOyBpKyspIHsKICAgICAgICAgIHZhciBjdXIgPSByZWN0c1tpXSwgbmV4dCA9IHJlY3RzW2kgKyAxXTsKICAgICAgICAgIGlmIChNYXRoLmFicyhjdXIuYm90dG9tIC0gbmV4dC5ib3R0b20pID4gMikKICAgICAgICAgICAgaGVpZ2h0cy5wdXNoKChjdXIuYm90dG9tICsgbmV4dC50b3ApIC8gMiAtIHJlY3QudG9wKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaGVpZ2h0cy5wdXNoKHJlY3QuYm90dG9tIC0gcmVjdC50b3ApOwogICAgfQogIH0KCiAgLy8gRmluZCBhIGxpbmUgbWFwIChtYXBwaW5nIGNoYXJhY3RlciBvZmZzZXRzIHRvIHRleHQgbm9kZXMpIGFuZCBhCiAgLy8gbWVhc3VyZW1lbnQgY2FjaGUgZm9yIHRoZSBnaXZlbiBsaW5lIG51bWJlci4gKEEgbGluZSB2aWV3IG1pZ2h0CiAgLy8gY29udGFpbiBtdWx0aXBsZSBsaW5lcyB3aGVuIGNvbGxhcHNlZCByYW5nZXMgYXJlIHByZXNlbnQuKQogIGZ1bmN0aW9uIG1hcEZyb21MaW5lVmlldyhsaW5lVmlldywgbGluZSwgbGluZU4pIHsKICAgIGlmIChsaW5lVmlldy5saW5lID09IGxpbmUpCiAgICAgIHJldHVybiB7bWFwOiBsaW5lVmlldy5tZWFzdXJlLm1hcCwgY2FjaGU6IGxpbmVWaWV3Lm1lYXN1cmUuY2FjaGV9OwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW5lVmlldy5yZXN0Lmxlbmd0aDsgaSsrKQogICAgICBpZiAobGluZVZpZXcucmVzdFtpXSA9PSBsaW5lKQogICAgICAgIHJldHVybiB7bWFwOiBsaW5lVmlldy5tZWFzdXJlLm1hcHNbaV0sIGNhY2hlOiBsaW5lVmlldy5tZWFzdXJlLmNhY2hlc1tpXX07CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmVWaWV3LnJlc3QubGVuZ3RoOyBpKyspCiAgICAgIGlmIChsaW5lTm8obGluZVZpZXcucmVzdFtpXSkgPiBsaW5lTikKICAgICAgICByZXR1cm4ge21hcDogbGluZVZpZXcubWVhc3VyZS5tYXBzW2ldLCBjYWNoZTogbGluZVZpZXcubWVhc3VyZS5jYWNoZXNbaV0sIGJlZm9yZTogdHJ1ZX07CiAgfQoKICAvLyBSZW5kZXIgYSBsaW5lIGludG8gdGhlIGhpZGRlbiBub2RlIGRpc3BsYXkuZXh0ZXJuYWxNZWFzdXJlZC4gVXNlZAogIC8vIHdoZW4gbWVhc3VyZW1lbnQgaXMgbmVlZGVkIGZvciBhIGxpbmUgdGhhdCdzIG5vdCBpbiB0aGUgdmlld3BvcnQuCiAgZnVuY3Rpb24gdXBkYXRlRXh0ZXJuYWxNZWFzdXJlbWVudChjbSwgbGluZSkgewogICAgbGluZSA9IHZpc3VhbExpbmUobGluZSk7CiAgICB2YXIgbGluZU4gPSBsaW5lTm8obGluZSk7CiAgICB2YXIgdmlldyA9IGNtLmRpc3BsYXkuZXh0ZXJuYWxNZWFzdXJlZCA9IG5ldyBMaW5lVmlldyhjbS5kb2MsIGxpbmUsIGxpbmVOKTsKICAgIHZpZXcubGluZU4gPSBsaW5lTjsKICAgIHZhciBidWlsdCA9IHZpZXcuYnVpbHQgPSBidWlsZExpbmVDb250ZW50KGNtLCB2aWV3KTsKICAgIHZpZXcudGV4dCA9IGJ1aWx0LnByZTsKICAgIHJlbW92ZUNoaWxkcmVuQW5kQWRkKGNtLmRpc3BsYXkubGluZU1lYXN1cmUsIGJ1aWx0LnByZSk7CiAgICByZXR1cm4gdmlldzsKICB9CgogIC8vIEdldCBhIHt0b3AsIGJvdHRvbSwgbGVmdCwgcmlnaHR9IGJveCAoaW4gbGluZS1sb2NhbCBjb29yZGluYXRlcykKICAvLyBmb3IgYSBnaXZlbiBjaGFyYWN0ZXIuCiAgZnVuY3Rpb24gbWVhc3VyZUNoYXIoY20sIGxpbmUsIGNoLCBiaWFzKSB7CiAgICByZXR1cm4gbWVhc3VyZUNoYXJQcmVwYXJlZChjbSwgcHJlcGFyZU1lYXN1cmVGb3JMaW5lKGNtLCBsaW5lKSwgY2gsIGJpYXMpOwogIH0KCiAgLy8gRmluZCBhIGxpbmUgdmlldyB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBnaXZlbiBsaW5lIG51bWJlci4KICBmdW5jdGlvbiBmaW5kVmlld0ZvckxpbmUoY20sIGxpbmVOKSB7CiAgICBpZiAobGluZU4gPj0gY20uZGlzcGxheS52aWV3RnJvbSAmJiBsaW5lTiA8IGNtLmRpc3BsYXkudmlld1RvKQogICAgICByZXR1cm4gY20uZGlzcGxheS52aWV3W2ZpbmRWaWV3SW5kZXgoY20sIGxpbmVOKV07CiAgICB2YXIgZXh0ID0gY20uZGlzcGxheS5leHRlcm5hbE1lYXN1cmVkOwogICAgaWYgKGV4dCAmJiBsaW5lTiA+PSBleHQubGluZU4gJiYgbGluZU4gPCBleHQubGluZU4gKyBleHQuc2l6ZSkKICAgICAgcmV0dXJuIGV4dDsKICB9CgogIC8vIE1lYXN1cmVtZW50IGNhbiBiZSBzcGxpdCBpbiB0d28gc3RlcHMsIHRoZSBzZXQtdXAgd29yayB0aGF0CiAgLy8gYXBwbGllcyB0byB0aGUgd2hvbGUgbGluZSwgYW5kIHRoZSBtZWFzdXJlbWVudCBvZiB0aGUgYWN0dWFsCiAgLy8gY2hhcmFjdGVyLiBGdW5jdGlvbnMgbGlrZSBjb29yZHNDaGFyLCB0aGF0IG5lZWQgdG8gZG8gYSBsb3Qgb2YKICAvLyBtZWFzdXJlbWVudHMgaW4gYSByb3csIGNhbiB0aHVzIGVuc3VyZSB0aGF0IHRoZSBzZXQtdXAgd29yayBpcwogIC8vIG9ubHkgZG9uZSBvbmNlLgogIGZ1bmN0aW9uIHByZXBhcmVNZWFzdXJlRm9yTGluZShjbSwgbGluZSkgewogICAgdmFyIGxpbmVOID0gbGluZU5vKGxpbmUpOwogICAgdmFyIHZpZXcgPSBmaW5kVmlld0ZvckxpbmUoY20sIGxpbmVOKTsKICAgIGlmICh2aWV3ICYmICF2aWV3LnRleHQpCiAgICAgIHZpZXcgPSBudWxsOwogICAgZWxzZSBpZiAodmlldyAmJiB2aWV3LmNoYW5nZXMpCiAgICAgIHVwZGF0ZUxpbmVGb3JDaGFuZ2VzKGNtLCB2aWV3LCBsaW5lTiwgZ2V0RGltZW5zaW9ucyhjbSkpOwogICAgaWYgKCF2aWV3KQogICAgICB2aWV3ID0gdXBkYXRlRXh0ZXJuYWxNZWFzdXJlbWVudChjbSwgbGluZSk7CgogICAgdmFyIGluZm8gPSBtYXBGcm9tTGluZVZpZXcodmlldywgbGluZSwgbGluZU4pOwogICAgcmV0dXJuIHsKICAgICAgbGluZTogbGluZSwgdmlldzogdmlldywgcmVjdDogbnVsbCwKICAgICAgbWFwOiBpbmZvLm1hcCwgY2FjaGU6IGluZm8uY2FjaGUsIGJlZm9yZTogaW5mby5iZWZvcmUsCiAgICAgIGhhc0hlaWdodHM6IGZhbHNlCiAgICB9OwogIH0KCiAgLy8gR2l2ZW4gYSBwcmVwYXJlZCBtZWFzdXJlbWVudCBvYmplY3QsIG1lYXN1cmVzIHRoZSBwb3NpdGlvbiBvZiBhbgogIC8vIGFjdHVhbCBjaGFyYWN0ZXIgKG9yIGZldGNoZXMgaXQgZnJvbSB0aGUgY2FjaGUpLgogIGZ1bmN0aW9uIG1lYXN1cmVDaGFyUHJlcGFyZWQoY20sIHByZXBhcmVkLCBjaCwgYmlhcywgdmFySGVpZ2h0KSB7CiAgICBpZiAocHJlcGFyZWQuYmVmb3JlKSBjaCA9IC0xOwogICAgdmFyIGtleSA9IGNoICsgKGJpYXMgfHwgIiIpLCBmb3VuZDsKICAgIGlmIChwcmVwYXJlZC5jYWNoZS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CiAgICAgIGZvdW5kID0gcHJlcGFyZWQuY2FjaGVba2V5XTsKICAgIH0gZWxzZSB7CiAgICAgIGlmICghcHJlcGFyZWQucmVjdCkKICAgICAgICBwcmVwYXJlZC5yZWN0ID0gcHJlcGFyZWQudmlldy50ZXh0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICBpZiAoIXByZXBhcmVkLmhhc0hlaWdodHMpIHsKICAgICAgICBlbnN1cmVMaW5lSGVpZ2h0cyhjbSwgcHJlcGFyZWQudmlldywgcHJlcGFyZWQucmVjdCk7CiAgICAgICAgcHJlcGFyZWQuaGFzSGVpZ2h0cyA9IHRydWU7CiAgICAgIH0KICAgICAgZm91bmQgPSBtZWFzdXJlQ2hhcklubmVyKGNtLCBwcmVwYXJlZCwgY2gsIGJpYXMpOwogICAgICBpZiAoIWZvdW5kLmJvZ3VzKSBwcmVwYXJlZC5jYWNoZVtrZXldID0gZm91bmQ7CiAgICB9CiAgICByZXR1cm4ge2xlZnQ6IGZvdW5kLmxlZnQsIHJpZ2h0OiBmb3VuZC5yaWdodCwKICAgICAgICAgICAgdG9wOiB2YXJIZWlnaHQgPyBmb3VuZC5ydG9wIDogZm91bmQudG9wLAogICAgICAgICAgICBib3R0b206IHZhckhlaWdodCA/IGZvdW5kLnJib3R0b20gOiBmb3VuZC5ib3R0b219OwogIH0KCiAgdmFyIG51bGxSZWN0ID0ge2xlZnQ6IDAsIHJpZ2h0OiAwLCB0b3A6IDAsIGJvdHRvbTogMH07CgogIGZ1bmN0aW9uIG1lYXN1cmVDaGFySW5uZXIoY20sIHByZXBhcmVkLCBjaCwgYmlhcykgewogICAgdmFyIG1hcCA9IHByZXBhcmVkLm1hcDsKCiAgICB2YXIgbm9kZSwgc3RhcnQsIGVuZCwgY29sbGFwc2U7CiAgICAvLyBGaXJzdCwgc2VhcmNoIHRoZSBsaW5lIG1hcCBmb3IgdGhlIHRleHQgbm9kZSBjb3JyZXNwb25kaW5nIHRvLAogICAgLy8gb3IgY2xvc2VzdCB0bywgdGhlIHRhcmdldCBjaGFyYWN0ZXIuCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1hcC5sZW5ndGg7IGkgKz0gMykgewogICAgICB2YXIgbVN0YXJ0ID0gbWFwW2ldLCBtRW5kID0gbWFwW2kgKyAxXTsKICAgICAgaWYgKGNoIDwgbVN0YXJ0KSB7CiAgICAgICAgc3RhcnQgPSAwOyBlbmQgPSAxOwogICAgICAgIGNvbGxhcHNlID0gImxlZnQiOwogICAgICB9IGVsc2UgaWYgKGNoIDwgbUVuZCkgewogICAgICAgIHN0YXJ0ID0gY2ggLSBtU3RhcnQ7CiAgICAgICAgZW5kID0gc3RhcnQgKyAxOwogICAgICB9IGVsc2UgaWYgKGkgPT0gbWFwLmxlbmd0aCAtIDMgfHwgY2ggPT0gbUVuZCAmJiBtYXBbaSArIDNdID4gY2gpIHsKICAgICAgICBlbmQgPSBtRW5kIC0gbVN0YXJ0OwogICAgICAgIHN0YXJ0ID0gZW5kIC0gMTsKICAgICAgICBpZiAoY2ggPj0gbUVuZCkgY29sbGFwc2UgPSAicmlnaHQiOwogICAgICB9CiAgICAgIGlmIChzdGFydCAhPSBudWxsKSB7CiAgICAgICAgbm9kZSA9IG1hcFtpICsgMl07CiAgICAgICAgaWYgKG1TdGFydCA9PSBtRW5kICYmIGJpYXMgPT0gKG5vZGUuaW5zZXJ0TGVmdCA/ICJsZWZ0IiA6ICJyaWdodCIpKQogICAgICAgICAgY29sbGFwc2UgPSBiaWFzOwogICAgICAgIGlmIChiaWFzID09ICJsZWZ0IiAmJiBzdGFydCA9PSAwKQogICAgICAgICAgd2hpbGUgKGkgJiYgbWFwW2kgLSAyXSA9PSBtYXBbaSAtIDNdICYmIG1hcFtpIC0gMV0uaW5zZXJ0TGVmdCkgewogICAgICAgICAgICBub2RlID0gbWFwWyhpIC09IDMpICsgMl07CiAgICAgICAgICAgIGNvbGxhcHNlID0gImxlZnQiOwogICAgICAgICAgfQogICAgICAgIGlmIChiaWFzID09ICJyaWdodCIgJiYgc3RhcnQgPT0gbUVuZCAtIG1TdGFydCkKICAgICAgICAgIHdoaWxlIChpIDwgbWFwLmxlbmd0aCAtIDMgJiYgbWFwW2kgKyAzXSA9PSBtYXBbaSArIDRdICYmICFtYXBbaSArIDVdLmluc2VydExlZnQpIHsKICAgICAgICAgICAgbm9kZSA9IG1hcFsoaSArPSAzKSArIDJdOwogICAgICAgICAgICBjb2xsYXBzZSA9ICJyaWdodCI7CiAgICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KCiAgICB2YXIgcmVjdDsKICAgIGlmIChub2RlLm5vZGVUeXBlID09IDMpIHsgLy8gSWYgaXQgaXMgYSB0ZXh0IG5vZGUsIHVzZSBhIHJhbmdlIHRvIHJldHJpZXZlIHRoZSBjb29yZGluYXRlcy4KICAgICAgd2hpbGUgKHN0YXJ0ICYmIGlzRXh0ZW5kaW5nQ2hhcihwcmVwYXJlZC5saW5lLnRleHQuY2hhckF0KG1TdGFydCArIHN0YXJ0KSkpIC0tc3RhcnQ7CiAgICAgIHdoaWxlIChtU3RhcnQgKyBlbmQgPCBtRW5kICYmIGlzRXh0ZW5kaW5nQ2hhcihwcmVwYXJlZC5saW5lLnRleHQuY2hhckF0KG1TdGFydCArIGVuZCkpKSArK2VuZDsKICAgICAgaWYgKGllICYmIGllX3ZlcnNpb24gPCA5ICYmIHN0YXJ0ID09IDAgJiYgZW5kID09IG1FbmQgLSBtU3RhcnQpIHsKICAgICAgICByZWN0ID0gbm9kZS5wYXJlbnROb2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICB9IGVsc2UgaWYgKGllICYmIGNtLm9wdGlvbnMubGluZVdyYXBwaW5nKSB7CiAgICAgICAgdmFyIHJlY3RzID0gcmFuZ2Uobm9kZSwgc3RhcnQsIGVuZCkuZ2V0Q2xpZW50UmVjdHMoKTsKICAgICAgICBpZiAocmVjdHMubGVuZ3RoKQogICAgICAgICAgcmVjdCA9IHJlY3RzW2JpYXMgPT0gInJpZ2h0IiA/IHJlY3RzLmxlbmd0aCAtIDEgOiAwXTsKICAgICAgICBlbHNlCiAgICAgICAgICByZWN0ID0gbnVsbFJlY3Q7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmVjdCA9IHJhbmdlKG5vZGUsIHN0YXJ0LCBlbmQpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpIHx8IG51bGxSZWN0OwogICAgICB9CiAgICB9IGVsc2UgeyAvLyBJZiBpdCBpcyBhIHdpZGdldCwgc2ltcGx5IGdldCB0aGUgYm94IGZvciB0aGUgd2hvbGUgd2lkZ2V0LgogICAgICBpZiAoc3RhcnQgPiAwKSBjb2xsYXBzZSA9IGJpYXMgPSAicmlnaHQiOwogICAgICB2YXIgcmVjdHM7CiAgICAgIGlmIChjbS5vcHRpb25zLmxpbmVXcmFwcGluZyAmJiAocmVjdHMgPSBub2RlLmdldENsaWVudFJlY3RzKCkpLmxlbmd0aCA+IDEpCiAgICAgICAgcmVjdCA9IHJlY3RzW2JpYXMgPT0gInJpZ2h0IiA/IHJlY3RzLmxlbmd0aCAtIDEgOiAwXTsKICAgICAgZWxzZQogICAgICAgIHJlY3QgPSBub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgfQogICAgaWYgKGllICYmIGllX3ZlcnNpb24gPCA5ICYmICFzdGFydCAmJiAoIXJlY3QgfHwgIXJlY3QubGVmdCAmJiAhcmVjdC5yaWdodCkpIHsKICAgICAgdmFyIHJTcGFuID0gbm9kZS5wYXJlbnROb2RlLmdldENsaWVudFJlY3RzKClbMF07CiAgICAgIGlmIChyU3BhbikKICAgICAgICByZWN0ID0ge2xlZnQ6IHJTcGFuLmxlZnQsIHJpZ2h0OiByU3Bhbi5sZWZ0ICsgY2hhcldpZHRoKGNtLmRpc3BsYXkpLCB0b3A6IHJTcGFuLnRvcCwgYm90dG9tOiByU3Bhbi5ib3R0b219OwogICAgICBlbHNlCiAgICAgICAgcmVjdCA9IG51bGxSZWN0OwogICAgfQoKICAgIGlmIChpZSAmJiBpZV92ZXJzaW9uIDwgMTEpIHJlY3QgPSBtYXliZVVwZGF0ZVJlY3RGb3Jab29taW5nKGNtLmRpc3BsYXkubWVhc3VyZSwgcmVjdCk7CgogICAgdmFyIHJ0b3AgPSByZWN0LnRvcCAtIHByZXBhcmVkLnJlY3QudG9wLCByYm90ID0gcmVjdC5ib3R0b20gLSBwcmVwYXJlZC5yZWN0LnRvcDsKICAgIHZhciBtaWQgPSAocnRvcCArIHJib3QpIC8gMjsKICAgIHZhciBoZWlnaHRzID0gcHJlcGFyZWQudmlldy5tZWFzdXJlLmhlaWdodHM7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhlaWdodHMubGVuZ3RoIC0gMTsgaSsrKQogICAgICBpZiAobWlkIDwgaGVpZ2h0c1tpXSkgYnJlYWs7CiAgICB2YXIgdG9wID0gaSA/IGhlaWdodHNbaSAtIDFdIDogMCwgYm90ID0gaGVpZ2h0c1tpXTsKICAgIHZhciByZXN1bHQgPSB7bGVmdDogKGNvbGxhcHNlID09ICJyaWdodCIgPyByZWN0LnJpZ2h0IDogcmVjdC5sZWZ0KSAtIHByZXBhcmVkLnJlY3QubGVmdCwKICAgICAgICAgICAgICAgICAgcmlnaHQ6IChjb2xsYXBzZSA9PSAibGVmdCIgPyByZWN0LmxlZnQgOiByZWN0LnJpZ2h0KSAtIHByZXBhcmVkLnJlY3QubGVmdCwKICAgICAgICAgICAgICAgICAgdG9wOiB0b3AsIGJvdHRvbTogYm90fTsKICAgIGlmICghcmVjdC5sZWZ0ICYmICFyZWN0LnJpZ2h0KSByZXN1bHQuYm9ndXMgPSB0cnVlOwogICAgaWYgKCFjbS5vcHRpb25zLnNpbmdsZUN1cnNvckhlaWdodFBlckxpbmUpIHsgcmVzdWx0LnJ0b3AgPSBydG9wOyByZXN1bHQucmJvdHRvbSA9IHJib3Q7IH0KCiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLy8gV29yayBhcm91bmQgcHJvYmxlbSB3aXRoIGJvdW5kaW5nIGNsaWVudCByZWN0cyBvbiByYW5nZXMgYmVpbmcKICAvLyByZXR1cm5lZCBpbmNvcnJlY3RseSB3aGVuIHpvb21lZCBvbiBJRTEwIGFuZCBiZWxvdy4KICBmdW5jdGlvbiBtYXliZVVwZGF0ZVJlY3RGb3Jab29taW5nKG1lYXN1cmUsIHJlY3QpIHsKICAgIGlmICghd2luZG93LnNjcmVlbiB8fCBzY3JlZW4ubG9naWNhbFhEUEkgPT0gbnVsbCB8fAogICAgICAgIHNjcmVlbi5sb2dpY2FsWERQSSA9PSBzY3JlZW4uZGV2aWNlWERQSSB8fCAhaGFzQmFkWm9vbWVkUmVjdHMobWVhc3VyZSkpCiAgICAgIHJldHVybiByZWN0OwogICAgdmFyIHNjYWxlWCA9IHNjcmVlbi5sb2dpY2FsWERQSSAvIHNjcmVlbi5kZXZpY2VYRFBJOwogICAgdmFyIHNjYWxlWSA9IHNjcmVlbi5sb2dpY2FsWURQSSAvIHNjcmVlbi5kZXZpY2VZRFBJOwogICAgcmV0dXJuIHtsZWZ0OiByZWN0LmxlZnQgKiBzY2FsZVgsIHJpZ2h0OiByZWN0LnJpZ2h0ICogc2NhbGVYLAogICAgICAgICAgICB0b3A6IHJlY3QudG9wICogc2NhbGVZLCBib3R0b206IHJlY3QuYm90dG9tICogc2NhbGVZfTsKICB9CgogIGZ1bmN0aW9uIGNsZWFyTGluZU1lYXN1cmVtZW50Q2FjaGVGb3IobGluZVZpZXcpIHsKICAgIGlmIChsaW5lVmlldy5tZWFzdXJlKSB7CiAgICAgIGxpbmVWaWV3Lm1lYXN1cmUuY2FjaGUgPSB7fTsKICAgICAgbGluZVZpZXcubWVhc3VyZS5oZWlnaHRzID0gbnVsbDsKICAgICAgaWYgKGxpbmVWaWV3LnJlc3QpIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZVZpZXcucmVzdC5sZW5ndGg7IGkrKykKICAgICAgICBsaW5lVmlldy5tZWFzdXJlLmNhY2hlc1tpXSA9IHt9OwogICAgfQogIH0KCiAgZnVuY3Rpb24gY2xlYXJMaW5lTWVhc3VyZW1lbnRDYWNoZShjbSkgewogICAgY20uZGlzcGxheS5leHRlcm5hbE1lYXN1cmUgPSBudWxsOwogICAgcmVtb3ZlQ2hpbGRyZW4oY20uZGlzcGxheS5saW5lTWVhc3VyZSk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNtLmRpc3BsYXkudmlldy5sZW5ndGg7IGkrKykKICAgICAgY2xlYXJMaW5lTWVhc3VyZW1lbnRDYWNoZUZvcihjbS5kaXNwbGF5LnZpZXdbaV0pOwogIH0KCiAgZnVuY3Rpb24gY2xlYXJDYWNoZXMoY20pIHsKICAgIGNsZWFyTGluZU1lYXN1cmVtZW50Q2FjaGUoY20pOwogICAgY20uZGlzcGxheS5jYWNoZWRDaGFyV2lkdGggPSBjbS5kaXNwbGF5LmNhY2hlZFRleHRIZWlnaHQgPSBjbS5kaXNwbGF5LmNhY2hlZFBhZGRpbmdIID0gbnVsbDsKICAgIGlmICghY20ub3B0aW9ucy5saW5lV3JhcHBpbmcpIGNtLmRpc3BsYXkubWF4TGluZUNoYW5nZWQgPSB0cnVlOwogICAgY20uZGlzcGxheS5saW5lTnVtQ2hhcnMgPSBudWxsOwogIH0KCiAgZnVuY3Rpb24gcGFnZVNjcm9sbFgoKSB7IHJldHVybiB3aW5kb3cucGFnZVhPZmZzZXQgfHwgKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCB8fCBkb2N1bWVudC5ib2R5KS5zY3JvbGxMZWZ0OyB9CiAgZnVuY3Rpb24gcGFnZVNjcm9sbFkoKSB7IHJldHVybiB3aW5kb3cucGFnZVlPZmZzZXQgfHwgKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCB8fCBkb2N1bWVudC5ib2R5KS5zY3JvbGxUb3A7IH0KCiAgLy8gQ29udmVydHMgYSB7dG9wLCBib3R0b20sIGxlZnQsIHJpZ2h0fSBib3ggZnJvbSBsaW5lLWxvY2FsCiAgLy8gY29vcmRpbmF0ZXMgaW50byBhbm90aGVyIGNvb3JkaW5hdGUgc3lzdGVtLiBDb250ZXh0IG1heSBiZSBvbmUgb2YKICAvLyAibGluZSIsICJkaXYiIChkaXNwbGF5LmxpbmVEaXYpLCAibG9jYWwiL251bGwgKGVkaXRvciksIG9yICJwYWdlIi4KICBmdW5jdGlvbiBpbnRvQ29vcmRTeXN0ZW0oY20sIGxpbmVPYmosIHJlY3QsIGNvbnRleHQpIHsKICAgIGlmIChsaW5lT2JqLndpZGdldHMpIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZU9iai53aWRnZXRzLmxlbmd0aDsgKytpKSBpZiAobGluZU9iai53aWRnZXRzW2ldLmFib3ZlKSB7CiAgICAgIHZhciBzaXplID0gd2lkZ2V0SGVpZ2h0KGxpbmVPYmoud2lkZ2V0c1tpXSk7CiAgICAgIHJlY3QudG9wICs9IHNpemU7IHJlY3QuYm90dG9tICs9IHNpemU7CiAgICB9CiAgICBpZiAoY29udGV4dCA9PSAibGluZSIpIHJldHVybiByZWN0OwogICAgaWYgKCFjb250ZXh0KSBjb250ZXh0ID0gImxvY2FsIjsKICAgIHZhciB5T2ZmID0gaGVpZ2h0QXRMaW5lKGxpbmVPYmopOwogICAgaWYgKGNvbnRleHQgPT0gImxvY2FsIikgeU9mZiArPSBwYWRkaW5nVG9wKGNtLmRpc3BsYXkpOwogICAgZWxzZSB5T2ZmIC09IGNtLmRpc3BsYXkudmlld09mZnNldDsKICAgIGlmIChjb250ZXh0ID09ICJwYWdlIiB8fCBjb250ZXh0ID09ICJ3aW5kb3ciKSB7CiAgICAgIHZhciBsT2ZmID0gY20uZGlzcGxheS5saW5lU3BhY2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgIHlPZmYgKz0gbE9mZi50b3AgKyAoY29udGV4dCA9PSAid2luZG93IiA/IDAgOiBwYWdlU2Nyb2xsWSgpKTsKICAgICAgdmFyIHhPZmYgPSBsT2ZmLmxlZnQgKyAoY29udGV4dCA9PSAid2luZG93IiA/IDAgOiBwYWdlU2Nyb2xsWCgpKTsKICAgICAgcmVjdC5sZWZ0ICs9IHhPZmY7IHJlY3QucmlnaHQgKz0geE9mZjsKICAgIH0KICAgIHJlY3QudG9wICs9IHlPZmY7IHJlY3QuYm90dG9tICs9IHlPZmY7CiAgICByZXR1cm4gcmVjdDsKICB9CgogIC8vIENvdmVydHMgYSBib3ggZnJvbSAiZGl2IiBjb29yZHMgdG8gYW5vdGhlciBjb29yZGluYXRlIHN5c3RlbS4KICAvLyBDb250ZXh0IG1heSBiZSAid2luZG93IiwgInBhZ2UiLCAiZGl2Iiwgb3IgImxvY2FsIi9udWxsLgogIGZ1bmN0aW9uIGZyb21Db29yZFN5c3RlbShjbSwgY29vcmRzLCBjb250ZXh0KSB7CiAgICBpZiAoY29udGV4dCA9PSAiZGl2IikgcmV0dXJuIGNvb3JkczsKICAgIHZhciBsZWZ0ID0gY29vcmRzLmxlZnQsIHRvcCA9IGNvb3Jkcy50b3A7CiAgICAvLyBGaXJzdCBtb3ZlIGludG8gInBhZ2UiIGNvb3JkaW5hdGUgc3lzdGVtCiAgICBpZiAoY29udGV4dCA9PSAicGFnZSIpIHsKICAgICAgbGVmdCAtPSBwYWdlU2Nyb2xsWCgpOwogICAgICB0b3AgLT0gcGFnZVNjcm9sbFkoKTsKICAgIH0gZWxzZSBpZiAoY29udGV4dCA9PSAibG9jYWwiIHx8ICFjb250ZXh0KSB7CiAgICAgIHZhciBsb2NhbEJveCA9IGNtLmRpc3BsYXkuc2l6ZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgIGxlZnQgKz0gbG9jYWxCb3gubGVmdDsKICAgICAgdG9wICs9IGxvY2FsQm94LnRvcDsKICAgIH0KCiAgICB2YXIgbGluZVNwYWNlQm94ID0gY20uZGlzcGxheS5saW5lU3BhY2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICByZXR1cm4ge2xlZnQ6IGxlZnQgLSBsaW5lU3BhY2VCb3gubGVmdCwgdG9wOiB0b3AgLSBsaW5lU3BhY2VCb3gudG9wfTsKICB9CgogIGZ1bmN0aW9uIGNoYXJDb29yZHMoY20sIHBvcywgY29udGV4dCwgbGluZU9iaiwgYmlhcykgewogICAgaWYgKCFsaW5lT2JqKSBsaW5lT2JqID0gZ2V0TGluZShjbS5kb2MsIHBvcy5saW5lKTsKICAgIHJldHVybiBpbnRvQ29vcmRTeXN0ZW0oY20sIGxpbmVPYmosIG1lYXN1cmVDaGFyKGNtLCBsaW5lT2JqLCBwb3MuY2gsIGJpYXMpLCBjb250ZXh0KTsKICB9CgogIC8vIFJldHVybnMgYSBib3ggZm9yIGEgZ2l2ZW4gY3Vyc29yIHBvc2l0aW9uLCB3aGljaCBtYXkgaGF2ZSBhbgogIC8vICdvdGhlcicgcHJvcGVydHkgY29udGFpbmluZyB0aGUgcG9zaXRpb24gb2YgdGhlIHNlY29uZGFyeSBjdXJzb3IKICAvLyBvbiBhIGJpZGkgYm91bmRhcnkuCiAgZnVuY3Rpb24gY3Vyc29yQ29vcmRzKGNtLCBwb3MsIGNvbnRleHQsIGxpbmVPYmosIHByZXBhcmVkTWVhc3VyZSwgdmFySGVpZ2h0KSB7CiAgICBsaW5lT2JqID0gbGluZU9iaiB8fCBnZXRMaW5lKGNtLmRvYywgcG9zLmxpbmUpOwogICAgaWYgKCFwcmVwYXJlZE1lYXN1cmUpIHByZXBhcmVkTWVhc3VyZSA9IHByZXBhcmVNZWFzdXJlRm9yTGluZShjbSwgbGluZU9iaik7CiAgICBmdW5jdGlvbiBnZXQoY2gsIHJpZ2h0KSB7CiAgICAgIHZhciBtID0gbWVhc3VyZUNoYXJQcmVwYXJlZChjbSwgcHJlcGFyZWRNZWFzdXJlLCBjaCwgcmlnaHQgPyAicmlnaHQiIDogImxlZnQiLCB2YXJIZWlnaHQpOwogICAgICBpZiAocmlnaHQpIG0ubGVmdCA9IG0ucmlnaHQ7IGVsc2UgbS5yaWdodCA9IG0ubGVmdDsKICAgICAgcmV0dXJuIGludG9Db29yZFN5c3RlbShjbSwgbGluZU9iaiwgbSwgY29udGV4dCk7CiAgICB9CiAgICBmdW5jdGlvbiBnZXRCaWRpKGNoLCBwYXJ0UG9zKSB7CiAgICAgIHZhciBwYXJ0ID0gb3JkZXJbcGFydFBvc10sIHJpZ2h0ID0gcGFydC5sZXZlbCAlIDI7CiAgICAgIGlmIChjaCA9PSBiaWRpTGVmdChwYXJ0KSAmJiBwYXJ0UG9zICYmIHBhcnQubGV2ZWwgPCBvcmRlcltwYXJ0UG9zIC0gMV0ubGV2ZWwpIHsKICAgICAgICBwYXJ0ID0gb3JkZXJbLS1wYXJ0UG9zXTsKICAgICAgICBjaCA9IGJpZGlSaWdodChwYXJ0KSAtIChwYXJ0LmxldmVsICUgMiA/IDAgOiAxKTsKICAgICAgICByaWdodCA9IHRydWU7CiAgICAgIH0gZWxzZSBpZiAoY2ggPT0gYmlkaVJpZ2h0KHBhcnQpICYmIHBhcnRQb3MgPCBvcmRlci5sZW5ndGggLSAxICYmIHBhcnQubGV2ZWwgPCBvcmRlcltwYXJ0UG9zICsgMV0ubGV2ZWwpIHsKICAgICAgICBwYXJ0ID0gb3JkZXJbKytwYXJ0UG9zXTsKICAgICAgICBjaCA9IGJpZGlMZWZ0KHBhcnQpIC0gcGFydC5sZXZlbCAlIDI7CiAgICAgICAgcmlnaHQgPSBmYWxzZTsKICAgICAgfQogICAgICBpZiAocmlnaHQgJiYgY2ggPT0gcGFydC50byAmJiBjaCA+IHBhcnQuZnJvbSkgcmV0dXJuIGdldChjaCAtIDEpOwogICAgICByZXR1cm4gZ2V0KGNoLCByaWdodCk7CiAgICB9CiAgICB2YXIgb3JkZXIgPSBnZXRPcmRlcihsaW5lT2JqKSwgY2ggPSBwb3MuY2g7CiAgICBpZiAoIW9yZGVyKSByZXR1cm4gZ2V0KGNoKTsKICAgIHZhciBwYXJ0UG9zID0gZ2V0QmlkaVBhcnRBdChvcmRlciwgY2gpOwogICAgdmFyIHZhbCA9IGdldEJpZGkoY2gsIHBhcnRQb3MpOwogICAgaWYgKGJpZGlPdGhlciAhPSBudWxsKSB2YWwub3RoZXIgPSBnZXRCaWRpKGNoLCBiaWRpT3RoZXIpOwogICAgcmV0dXJuIHZhbDsKICB9CgogIC8vIFVzZWQgdG8gY2hlYXBseSBlc3RpbWF0ZSB0aGUgY29vcmRpbmF0ZXMgZm9yIGEgcG9zaXRpb24uIFVzZWQgZm9yCiAgLy8gaW50ZXJtZWRpYXRlIHNjcm9sbCB1cGRhdGVzLgogIGZ1bmN0aW9uIGVzdGltYXRlQ29vcmRzKGNtLCBwb3MpIHsKICAgIHZhciBsZWZ0ID0gMCwgcG9zID0gY2xpcFBvcyhjbS5kb2MsIHBvcyk7CiAgICBpZiAoIWNtLm9wdGlvbnMubGluZVdyYXBwaW5nKSBsZWZ0ID0gY2hhcldpZHRoKGNtLmRpc3BsYXkpICogcG9zLmNoOwogICAgdmFyIGxpbmVPYmogPSBnZXRMaW5lKGNtLmRvYywgcG9zLmxpbmUpOwogICAgdmFyIHRvcCA9IGhlaWdodEF0TGluZShsaW5lT2JqKSArIHBhZGRpbmdUb3AoY20uZGlzcGxheSk7CiAgICByZXR1cm4ge2xlZnQ6IGxlZnQsIHJpZ2h0OiBsZWZ0LCB0b3A6IHRvcCwgYm90dG9tOiB0b3AgKyBsaW5lT2JqLmhlaWdodH07CiAgfQoKICAvLyBQb3NpdGlvbnMgcmV0dXJuZWQgYnkgY29vcmRzQ2hhciBjb250YWluIHNvbWUgZXh0cmEgaW5mb3JtYXRpb24uCiAgLy8geFJlbCBpcyB0aGUgcmVsYXRpdmUgeCBwb3NpdGlvbiBvZiB0aGUgaW5wdXQgY29vcmRpbmF0ZXMgY29tcGFyZWQKICAvLyB0byB0aGUgZm91bmQgcG9zaXRpb24gKHNvIHhSZWwgPiAwIG1lYW5zIHRoZSBjb29yZGluYXRlcyBhcmUgdG8KICAvLyB0aGUgcmlnaHQgb2YgdGhlIGNoYXJhY3RlciBwb3NpdGlvbiwgZm9yIGV4YW1wbGUpLiBXaGVuIG91dHNpZGUKICAvLyBpcyB0cnVlLCB0aGF0IG1lYW5zIHRoZSBjb29yZGluYXRlcyBsaWUgb3V0c2lkZSB0aGUgbGluZSdzCiAgLy8gdmVydGljYWwgcmFuZ2UuCiAgZnVuY3Rpb24gUG9zV2l0aEluZm8obGluZSwgY2gsIG91dHNpZGUsIHhSZWwpIHsKICAgIHZhciBwb3MgPSBQb3MobGluZSwgY2gpOwogICAgcG9zLnhSZWwgPSB4UmVsOwogICAgaWYgKG91dHNpZGUpIHBvcy5vdXRzaWRlID0gdHJ1ZTsKICAgIHJldHVybiBwb3M7CiAgfQoKICAvLyBDb21wdXRlIHRoZSBjaGFyYWN0ZXIgcG9zaXRpb24gY2xvc2VzdCB0byB0aGUgZ2l2ZW4gY29vcmRpbmF0ZXMuCiAgLy8gSW5wdXQgbXVzdCBiZSBsaW5lU3BhY2UtbG9jYWwgKCJkaXYiIGNvb3JkaW5hdGUgc3lzdGVtKS4KICBmdW5jdGlvbiBjb29yZHNDaGFyKGNtLCB4LCB5KSB7CiAgICB2YXIgZG9jID0gY20uZG9jOwogICAgeSArPSBjbS5kaXNwbGF5LnZpZXdPZmZzZXQ7CiAgICBpZiAoeSA8IDApIHJldHVybiBQb3NXaXRoSW5mbyhkb2MuZmlyc3QsIDAsIHRydWUsIC0xKTsKICAgIHZhciBsaW5lTiA9IGxpbmVBdEhlaWdodChkb2MsIHkpLCBsYXN0ID0gZG9jLmZpcnN0ICsgZG9jLnNpemUgLSAxOwogICAgaWYgKGxpbmVOID4gbGFzdCkKICAgICAgcmV0dXJuIFBvc1dpdGhJbmZvKGRvYy5maXJzdCArIGRvYy5zaXplIC0gMSwgZ2V0TGluZShkb2MsIGxhc3QpLnRleHQubGVuZ3RoLCB0cnVlLCAxKTsKICAgIGlmICh4IDwgMCkgeCA9IDA7CgogICAgdmFyIGxpbmVPYmogPSBnZXRMaW5lKGRvYywgbGluZU4pOwogICAgZm9yICg7OykgewogICAgICB2YXIgZm91bmQgPSBjb29yZHNDaGFySW5uZXIoY20sIGxpbmVPYmosIGxpbmVOLCB4LCB5KTsKICAgICAgdmFyIG1lcmdlZCA9IGNvbGxhcHNlZFNwYW5BdEVuZChsaW5lT2JqKTsKICAgICAgdmFyIG1lcmdlZFBvcyA9IG1lcmdlZCAmJiBtZXJnZWQuZmluZCgwLCB0cnVlKTsKICAgICAgaWYgKG1lcmdlZCAmJiAoZm91bmQuY2ggPiBtZXJnZWRQb3MuZnJvbS5jaCB8fCBmb3VuZC5jaCA9PSBtZXJnZWRQb3MuZnJvbS5jaCAmJiBmb3VuZC54UmVsID4gMCkpCiAgICAgICAgbGluZU4gPSBsaW5lTm8obGluZU9iaiA9IG1lcmdlZFBvcy50by5saW5lKTsKICAgICAgZWxzZQogICAgICAgIHJldHVybiBmb3VuZDsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGNvb3Jkc0NoYXJJbm5lcihjbSwgbGluZU9iaiwgbGluZU5vLCB4LCB5KSB7CiAgICB2YXIgaW5uZXJPZmYgPSB5IC0gaGVpZ2h0QXRMaW5lKGxpbmVPYmopOwogICAgdmFyIHdyb25nTGluZSA9IGZhbHNlLCBhZGp1c3QgPSAyICogY20uZGlzcGxheS53cmFwcGVyLmNsaWVudFdpZHRoOwogICAgdmFyIHByZXBhcmVkTWVhc3VyZSA9IHByZXBhcmVNZWFzdXJlRm9yTGluZShjbSwgbGluZU9iaik7CgogICAgZnVuY3Rpb24gZ2V0WChjaCkgewogICAgICB2YXIgc3AgPSBjdXJzb3JDb29yZHMoY20sIFBvcyhsaW5lTm8sIGNoKSwgImxpbmUiLCBsaW5lT2JqLCBwcmVwYXJlZE1lYXN1cmUpOwogICAgICB3cm9uZ0xpbmUgPSB0cnVlOwogICAgICBpZiAoaW5uZXJPZmYgPiBzcC5ib3R0b20pIHJldHVybiBzcC5sZWZ0IC0gYWRqdXN0OwogICAgICBlbHNlIGlmIChpbm5lck9mZiA8IHNwLnRvcCkgcmV0dXJuIHNwLmxlZnQgKyBhZGp1c3Q7CiAgICAgIGVsc2Ugd3JvbmdMaW5lID0gZmFsc2U7CiAgICAgIHJldHVybiBzcC5sZWZ0OwogICAgfQoKICAgIHZhciBiaWRpID0gZ2V0T3JkZXIobGluZU9iaiksIGRpc3QgPSBsaW5lT2JqLnRleHQubGVuZ3RoOwogICAgdmFyIGZyb20gPSBsaW5lTGVmdChsaW5lT2JqKSwgdG8gPSBsaW5lUmlnaHQobGluZU9iaik7CiAgICB2YXIgZnJvbVggPSBnZXRYKGZyb20pLCBmcm9tT3V0c2lkZSA9IHdyb25nTGluZSwgdG9YID0gZ2V0WCh0byksIHRvT3V0c2lkZSA9IHdyb25nTGluZTsKCiAgICBpZiAoeCA+IHRvWCkgcmV0dXJuIFBvc1dpdGhJbmZvKGxpbmVObywgdG8sIHRvT3V0c2lkZSwgMSk7CiAgICAvLyBEbyBhIGJpbmFyeSBzZWFyY2ggYmV0d2VlbiB0aGVzZSBib3VuZHMuCiAgICBmb3IgKDs7KSB7CiAgICAgIGlmIChiaWRpID8gdG8gPT0gZnJvbSB8fCB0byA9PSBtb3ZlVmlzdWFsbHkobGluZU9iaiwgZnJvbSwgMSkgOiB0byAtIGZyb20gPD0gMSkgewogICAgICAgIHZhciBjaCA9IHggPCBmcm9tWCB8fCB4IC0gZnJvbVggPD0gdG9YIC0geCA/IGZyb20gOiB0bzsKICAgICAgICB2YXIgeERpZmYgPSB4IC0gKGNoID09IGZyb20gPyBmcm9tWCA6IHRvWCk7CiAgICAgICAgd2hpbGUgKGlzRXh0ZW5kaW5nQ2hhcihsaW5lT2JqLnRleHQuY2hhckF0KGNoKSkpICsrY2g7CiAgICAgICAgdmFyIHBvcyA9IFBvc1dpdGhJbmZvKGxpbmVObywgY2gsIGNoID09IGZyb20gPyBmcm9tT3V0c2lkZSA6IHRvT3V0c2lkZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeERpZmYgPCAtMSA/IC0xIDogeERpZmYgPiAxID8gMSA6IDApOwogICAgICAgIHJldHVybiBwb3M7CiAgICAgIH0KICAgICAgdmFyIHN0ZXAgPSBNYXRoLmNlaWwoZGlzdCAvIDIpLCBtaWRkbGUgPSBmcm9tICsgc3RlcDsKICAgICAgaWYgKGJpZGkpIHsKICAgICAgICBtaWRkbGUgPSBmcm9tOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RlcDsgKytpKSBtaWRkbGUgPSBtb3ZlVmlzdWFsbHkobGluZU9iaiwgbWlkZGxlLCAxKTsKICAgICAgfQogICAgICB2YXIgbWlkZGxlWCA9IGdldFgobWlkZGxlKTsKICAgICAgaWYgKG1pZGRsZVggPiB4KSB7dG8gPSBtaWRkbGU7IHRvWCA9IG1pZGRsZVg7IGlmICh0b091dHNpZGUgPSB3cm9uZ0xpbmUpIHRvWCArPSAxMDAwOyBkaXN0ID0gc3RlcDt9CiAgICAgIGVsc2Uge2Zyb20gPSBtaWRkbGU7IGZyb21YID0gbWlkZGxlWDsgZnJvbU91dHNpZGUgPSB3cm9uZ0xpbmU7IGRpc3QgLT0gc3RlcDt9CiAgICB9CiAgfQoKICB2YXIgbWVhc3VyZVRleHQ7CiAgLy8gQ29tcHV0ZSB0aGUgZGVmYXVsdCB0ZXh0IGhlaWdodC4KICBmdW5jdGlvbiB0ZXh0SGVpZ2h0KGRpc3BsYXkpIHsKICAgIGlmIChkaXNwbGF5LmNhY2hlZFRleHRIZWlnaHQgIT0gbnVsbCkgcmV0dXJuIGRpc3BsYXkuY2FjaGVkVGV4dEhlaWdodDsKICAgIGlmIChtZWFzdXJlVGV4dCA9PSBudWxsKSB7CiAgICAgIG1lYXN1cmVUZXh0ID0gZWx0KCJwcmUiKTsKICAgICAgLy8gTWVhc3VyZSBhIGJ1bmNoIG9mIGxpbmVzLCBmb3IgYnJvd3NlcnMgdGhhdCBjb21wdXRlCiAgICAgIC8vIGZyYWN0aW9uYWwgaGVpZ2h0cy4KICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA0OTsgKytpKSB7CiAgICAgICAgbWVhc3VyZVRleHQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIngiKSk7CiAgICAgICAgbWVhc3VyZVRleHQuYXBwZW5kQ2hpbGQoZWx0KCJiciIpKTsKICAgICAgfQogICAgICBtZWFzdXJlVGV4dC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgieCIpKTsKICAgIH0KICAgIHJlbW92ZUNoaWxkcmVuQW5kQWRkKGRpc3BsYXkubWVhc3VyZSwgbWVhc3VyZVRleHQpOwogICAgdmFyIGhlaWdodCA9IG1lYXN1cmVUZXh0Lm9mZnNldEhlaWdodCAvIDUwOwogICAgaWYgKGhlaWdodCA+IDMpIGRpc3BsYXkuY2FjaGVkVGV4dEhlaWdodCA9IGhlaWdodDsKICAgIHJlbW92ZUNoaWxkcmVuKGRpc3BsYXkubWVhc3VyZSk7CiAgICByZXR1cm4gaGVpZ2h0IHx8IDE7CiAgfQoKICAvLyBDb21wdXRlIHRoZSBkZWZhdWx0IGNoYXJhY3RlciB3aWR0aC4KICBmdW5jdGlvbiBjaGFyV2lkdGgoZGlzcGxheSkgewogICAgaWYgKGRpc3BsYXkuY2FjaGVkQ2hhcldpZHRoICE9IG51bGwpIHJldHVybiBkaXNwbGF5LmNhY2hlZENoYXJXaWR0aDsKICAgIHZhciBhbmNob3IgPSBlbHQoInNwYW4iLCAieHh4eHh4eHh4eCIpOwogICAgdmFyIHByZSA9IGVsdCgicHJlIiwgW2FuY2hvcl0pOwogICAgcmVtb3ZlQ2hpbGRyZW5BbmRBZGQoZGlzcGxheS5tZWFzdXJlLCBwcmUpOwogICAgdmFyIHJlY3QgPSBhbmNob3IuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIHdpZHRoID0gKHJlY3QucmlnaHQgLSByZWN0LmxlZnQpIC8gMTA7CiAgICBpZiAod2lkdGggPiAyKSBkaXNwbGF5LmNhY2hlZENoYXJXaWR0aCA9IHdpZHRoOwogICAgcmV0dXJuIHdpZHRoIHx8IDEwOwogIH0KCiAgLy8gT1BFUkFUSU9OUwoKICAvLyBPcGVyYXRpb25zIGFyZSB1c2VkIHRvIHdyYXAgYSBzZXJpZXMgb2YgY2hhbmdlcyB0byB0aGUgZWRpdG9yCiAgLy8gc3RhdGUgaW4gc3VjaCBhIHdheSB0aGF0IGVhY2ggY2hhbmdlIHdvbid0IGhhdmUgdG8gdXBkYXRlIHRoZQogIC8vIGN1cnNvciBhbmQgZGlzcGxheSAod2hpY2ggd291bGQgYmUgYXdrd2FyZCwgc2xvdywgYW5kCiAgLy8gZXJyb3ItcHJvbmUpLiBJbnN0ZWFkLCBkaXNwbGF5IHVwZGF0ZXMgYXJlIGJhdGNoZWQgYW5kIHRoZW4gYWxsCiAgLy8gY29tYmluZWQgYW5kIGV4ZWN1dGVkIGF0IG9uY2UuCgogIHZhciBvcGVyYXRpb25Hcm91cCA9IG51bGw7CgogIHZhciBuZXh0T3BJZCA9IDA7CiAgLy8gU3RhcnQgYSBuZXcgb3BlcmF0aW9uLgogIGZ1bmN0aW9uIHN0YXJ0T3BlcmF0aW9uKGNtKSB7CiAgICBjbS5jdXJPcCA9IHsKICAgICAgY206IGNtLAogICAgICB2aWV3Q2hhbmdlZDogZmFsc2UsICAgICAgLy8gRmxhZyB0aGF0IGluZGljYXRlcyB0aGF0IGxpbmVzIG1pZ2h0IG5lZWQgdG8gYmUgcmVkcmF3bgogICAgICBzdGFydEhlaWdodDogY20uZG9jLmhlaWdodCwgLy8gVXNlZCB0byBkZXRlY3QgbmVlZCB0byB1cGRhdGUgc2Nyb2xsYmFyCiAgICAgIGZvcmNlVXBkYXRlOiBmYWxzZSwgICAgICAvLyBVc2VkIHRvIGZvcmNlIGEgcmVkcmF3CiAgICAgIHVwZGF0ZUlucHV0OiBudWxsLCAgICAgICAvLyBXaGV0aGVyIHRvIHJlc2V0IHRoZSBpbnB1dCB0ZXh0YXJlYQogICAgICB0eXBpbmc6IGZhbHNlLCAgICAgICAgICAgLy8gV2hldGhlciB0aGlzIHJlc2V0IHNob3VsZCBiZSBjYXJlZnVsIHRvIGxlYXZlIGV4aXN0aW5nIHRleHQgKGZvciBjb21wb3NpdGluZykKICAgICAgY2hhbmdlT2JqczogbnVsbCwgICAgICAgIC8vIEFjY3VtdWxhdGVkIGNoYW5nZXMsIGZvciBmaXJpbmcgY2hhbmdlIGV2ZW50cwogICAgICBjdXJzb3JBY3Rpdml0eUhhbmRsZXJzOiBudWxsLCAvLyBTZXQgb2YgaGFuZGxlcnMgdG8gZmlyZSBjdXJzb3JBY3Rpdml0eSBvbgogICAgICBjdXJzb3JBY3Rpdml0eUNhbGxlZDogMCwgLy8gVHJhY2tzIHdoaWNoIGN1cnNvckFjdGl2aXR5IGhhbmRsZXJzIGhhdmUgYmVlbiBjYWxsZWQgYWxyZWFkeQogICAgICBzZWxlY3Rpb25DaGFuZ2VkOiBmYWxzZSwgLy8gV2hldGhlciB0aGUgc2VsZWN0aW9uIG5lZWRzIHRvIGJlIHJlZHJhd24KICAgICAgdXBkYXRlTWF4TGluZTogZmFsc2UsICAgIC8vIFNldCB3aGVuIHRoZSB3aWRlc3QgbGluZSBuZWVkcyB0byBiZSBkZXRlcm1pbmVkIGFuZXcKICAgICAgc2Nyb2xsTGVmdDogbnVsbCwgc2Nyb2xsVG9wOiBudWxsLCAvLyBJbnRlcm1lZGlhdGUgc2Nyb2xsIHBvc2l0aW9uLCBub3QgcHVzaGVkIHRvIERPTSB5ZXQKICAgICAgc2Nyb2xsVG9Qb3M6IG51bGwsICAgICAgIC8vIFVzZWQgdG8gc2Nyb2xsIHRvIGEgc3BlY2lmaWMgcG9zaXRpb24KICAgICAgaWQ6ICsrbmV4dE9wSWQgICAgICAgICAgIC8vIFVuaXF1ZSBJRAogICAgfTsKICAgIGlmIChvcGVyYXRpb25Hcm91cCkgewogICAgICBvcGVyYXRpb25Hcm91cC5vcHMucHVzaChjbS5jdXJPcCk7CiAgICB9IGVsc2UgewogICAgICBjbS5jdXJPcC5vd25zR3JvdXAgPSBvcGVyYXRpb25Hcm91cCA9IHsKICAgICAgICBvcHM6IFtjbS5jdXJPcF0sCiAgICAgICAgZGVsYXllZENhbGxiYWNrczogW10KICAgICAgfTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGZpcmVDYWxsYmFja3NGb3JPcHMoZ3JvdXApIHsKICAgIC8vIENhbGxzIGRlbGF5ZWQgY2FsbGJhY2tzIGFuZCBjdXJzb3JBY3Rpdml0eSBoYW5kbGVycyB1bnRpbCBubwogICAgLy8gbmV3IG9uZXMgYXBwZWFyCiAgICB2YXIgY2FsbGJhY2tzID0gZ3JvdXAuZGVsYXllZENhbGxiYWNrcywgaSA9IDA7CiAgICBkbyB7CiAgICAgIGZvciAoOyBpIDwgY2FsbGJhY2tzLmxlbmd0aDsgaSsrKQogICAgICAgIGNhbGxiYWNrc1tpXSgpOwogICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGdyb3VwLm9wcy5sZW5ndGg7IGorKykgewogICAgICAgIHZhciBvcCA9IGdyb3VwLm9wc1tqXTsKICAgICAgICBpZiAob3AuY3Vyc29yQWN0aXZpdHlIYW5kbGVycykKICAgICAgICAgIHdoaWxlIChvcC5jdXJzb3JBY3Rpdml0eUNhbGxlZCA8IG9wLmN1cnNvckFjdGl2aXR5SGFuZGxlcnMubGVuZ3RoKQogICAgICAgICAgICBvcC5jdXJzb3JBY3Rpdml0eUhhbmRsZXJzW29wLmN1cnNvckFjdGl2aXR5Q2FsbGVkKytdKG9wLmNtKTsKICAgICAgfQogICAgfSB3aGlsZSAoaSA8IGNhbGxiYWNrcy5sZW5ndGgpOwogIH0KCiAgLy8gRmluaXNoIGFuIG9wZXJhdGlvbiwgdXBkYXRpbmcgdGhlIGRpc3BsYXkgYW5kIHNpZ25hbGxpbmcgZGVsYXllZCBldmVudHMKICBmdW5jdGlvbiBlbmRPcGVyYXRpb24oY20pIHsKICAgIHZhciBvcCA9IGNtLmN1ck9wLCBncm91cCA9IG9wLm93bnNHcm91cDsKICAgIGlmICghZ3JvdXApIHJldHVybjsKCiAgICB0cnkgeyBmaXJlQ2FsbGJhY2tzRm9yT3BzKGdyb3VwKTsgfQogICAgZmluYWxseSB7CiAgICAgIG9wZXJhdGlvbkdyb3VwID0gbnVsbDsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBncm91cC5vcHMubGVuZ3RoOyBpKyspCiAgICAgICAgZ3JvdXAub3BzW2ldLmNtLmN1ck9wID0gbnVsbDsKICAgICAgZW5kT3BlcmF0aW9ucyhncm91cCk7CiAgICB9CiAgfQoKICAvLyBUaGUgRE9NIHVwZGF0ZXMgZG9uZSB3aGVuIGFuIG9wZXJhdGlvbiBmaW5pc2hlcyBhcmUgYmF0Y2hlZCBzbwogIC8vIHRoYXQgdGhlIG1pbmltdW0gbnVtYmVyIG9mIHJlbGF5b3V0cyBhcmUgcmVxdWlyZWQuCiAgZnVuY3Rpb24gZW5kT3BlcmF0aW9ucyhncm91cCkgewogICAgdmFyIG9wcyA9IGdyb3VwLm9wczsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb3BzLmxlbmd0aDsgaSsrKSAvLyBSZWFkIERPTQogICAgICBlbmRPcGVyYXRpb25fUjEob3BzW2ldKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb3BzLmxlbmd0aDsgaSsrKSAvLyBXcml0ZSBET00gKG1heWJlKQogICAgICBlbmRPcGVyYXRpb25fVzEob3BzW2ldKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb3BzLmxlbmd0aDsgaSsrKSAvLyBSZWFkIERPTQogICAgICBlbmRPcGVyYXRpb25fUjIob3BzW2ldKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb3BzLmxlbmd0aDsgaSsrKSAvLyBXcml0ZSBET00gKG1heWJlKQogICAgICBlbmRPcGVyYXRpb25fVzIob3BzW2ldKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb3BzLmxlbmd0aDsgaSsrKSAvLyBSZWFkIERPTQogICAgICBlbmRPcGVyYXRpb25fZmluaXNoKG9wc1tpXSk7CiAgfQoKICBmdW5jdGlvbiBlbmRPcGVyYXRpb25fUjEob3ApIHsKICAgIHZhciBjbSA9IG9wLmNtLCBkaXNwbGF5ID0gY20uZGlzcGxheTsKICAgIGlmIChvcC51cGRhdGVNYXhMaW5lKSBmaW5kTWF4TGluZShjbSk7CgogICAgb3AubXVzdFVwZGF0ZSA9IG9wLnZpZXdDaGFuZ2VkIHx8IG9wLmZvcmNlVXBkYXRlIHx8IG9wLnNjcm9sbFRvcCAhPSBudWxsIHx8CiAgICAgIG9wLnNjcm9sbFRvUG9zICYmIChvcC5zY3JvbGxUb1Bvcy5mcm9tLmxpbmUgPCBkaXNwbGF5LnZpZXdGcm9tIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICBvcC5zY3JvbGxUb1Bvcy50by5saW5lID49IGRpc3BsYXkudmlld1RvKSB8fAogICAgICBkaXNwbGF5Lm1heExpbmVDaGFuZ2VkICYmIGNtLm9wdGlvbnMubGluZVdyYXBwaW5nOwogICAgb3AudXBkYXRlID0gb3AubXVzdFVwZGF0ZSAmJgogICAgICBuZXcgRGlzcGxheVVwZGF0ZShjbSwgb3AubXVzdFVwZGF0ZSAmJiB7dG9wOiBvcC5zY3JvbGxUb3AsIGVuc3VyZTogb3Auc2Nyb2xsVG9Qb3N9LCBvcC5mb3JjZVVwZGF0ZSk7CiAgfQoKICBmdW5jdGlvbiBlbmRPcGVyYXRpb25fVzEob3ApIHsKICAgIG9wLnVwZGF0ZWREaXNwbGF5ID0gb3AubXVzdFVwZGF0ZSAmJiB1cGRhdGVEaXNwbGF5SWZOZWVkZWQob3AuY20sIG9wLnVwZGF0ZSk7CiAgfQoKICBmdW5jdGlvbiBlbmRPcGVyYXRpb25fUjIob3ApIHsKICAgIHZhciBjbSA9IG9wLmNtLCBkaXNwbGF5ID0gY20uZGlzcGxheTsKICAgIGlmIChvcC51cGRhdGVkRGlzcGxheSkgdXBkYXRlSGVpZ2h0c0luVmlld3BvcnQoY20pOwoKICAgIC8vIElmIHRoZSBtYXggbGluZSBjaGFuZ2VkIHNpbmNlIGl0IHdhcyBsYXN0IG1lYXN1cmVkLCBtZWFzdXJlIGl0LAogICAgLy8gYW5kIGVuc3VyZSB0aGUgZG9jdW1lbnQncyB3aWR0aCBtYXRjaGVzIGl0LgogICAgLy8gdXBkYXRlRGlzcGxheUlmTmVlZGVkIHdpbGwgdXNlIHRoZXNlIHByb3BlcnRpZXMgdG8gZG8gdGhlIGFjdHVhbCByZXNpemluZwogICAgaWYgKGRpc3BsYXkubWF4TGluZUNoYW5nZWQgJiYgIWNtLm9wdGlvbnMubGluZVdyYXBwaW5nKSB7CiAgICAgIG9wLmFkanVzdFdpZHRoVG8gPSBtZWFzdXJlQ2hhcihjbSwgZGlzcGxheS5tYXhMaW5lLCBkaXNwbGF5Lm1heExpbmUudGV4dC5sZW5ndGgpLmxlZnQ7CiAgICAgIG9wLm1heFNjcm9sbExlZnQgPSBNYXRoLm1heCgwLCBkaXNwbGF5LnNpemVyLm9mZnNldExlZnQgKyBvcC5hZGp1c3RXaWR0aFRvICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbGVyQ3V0T2ZmIC0gZGlzcGxheS5zY3JvbGxlci5jbGllbnRXaWR0aCk7CiAgICB9CgogICAgb3AuYmFyTWVhc3VyZSA9IG1lYXN1cmVGb3JTY3JvbGxiYXJzKGNtKTsKICAgIGlmIChvcC51cGRhdGVkRGlzcGxheSB8fCBvcC5zZWxlY3Rpb25DaGFuZ2VkKQogICAgICBvcC5uZXdTZWxlY3Rpb25Ob2RlcyA9IGRyYXdTZWxlY3Rpb24oY20pOwogIH0KCiAgZnVuY3Rpb24gZW5kT3BlcmF0aW9uX1cyKG9wKSB7CiAgICB2YXIgY20gPSBvcC5jbTsKCiAgICBpZiAob3AuYWRqdXN0V2lkdGhUbyAhPSBudWxsKSB7CiAgICAgIGNtLmRpc3BsYXkuc2l6ZXIuc3R5bGUubWluV2lkdGggPSBvcC5hZGp1c3RXaWR0aFRvICsgInB4IjsKICAgICAgaWYgKG9wLm1heFNjcm9sbExlZnQgPCBjbS5kb2Muc2Nyb2xsTGVmdCkKICAgICAgICBzZXRTY3JvbGxMZWZ0KGNtLCBNYXRoLm1pbihjbS5kaXNwbGF5LnNjcm9sbGVyLnNjcm9sbExlZnQsIG9wLm1heFNjcm9sbExlZnQpLCB0cnVlKTsKICAgIH0KCiAgICBpZiAob3AubmV3U2VsZWN0aW9uTm9kZXMpCiAgICAgIHVwZGF0ZVNlbGVjdGlvbihjbSwgb3AubmV3U2VsZWN0aW9uTm9kZXMpOwogICAgaWYgKG9wLnVwZGF0ZWREaXNwbGF5KQogICAgICBzZXREb2N1bWVudEhlaWdodChjbSwgb3AuYmFyTWVhc3VyZSk7CiAgICBpZiAob3AudXBkYXRlZERpc3BsYXkgfHwgb3Auc3RhcnRIZWlnaHQgIT0gY20uZG9jLmhlaWdodCkKICAgICAgdXBkYXRlU2Nyb2xsYmFycyhjbSwgb3AuYmFyTWVhc3VyZSk7CgogICAgaWYgKG9wLnNlbGVjdGlvbkNoYW5nZWQpIHJlc3RhcnRCbGluayhjbSk7CgogICAgaWYgKGNtLnN0YXRlLmZvY3VzZWQgJiYgb3AudXBkYXRlSW5wdXQpCiAgICAgIHJlc2V0SW5wdXQoY20sIG9wLnR5cGluZyk7CiAgfQoKICBmdW5jdGlvbiBlbmRPcGVyYXRpb25fZmluaXNoKG9wKSB7CiAgICB2YXIgY20gPSBvcC5jbSwgZGlzcGxheSA9IGNtLmRpc3BsYXksIGRvYyA9IGNtLmRvYzsKCiAgICBpZiAob3AudXBkYXRlZERpc3BsYXkpIHBvc3RVcGRhdGVEaXNwbGF5KGNtLCBvcC51cGRhdGUpOwoKICAgIC8vIEFib3J0IG1vdXNlIHdoZWVsIGRlbHRhIG1lYXN1cmVtZW50LCB3aGVuIHNjcm9sbGluZyBleHBsaWNpdGx5CiAgICBpZiAoZGlzcGxheS53aGVlbFN0YXJ0WCAhPSBudWxsICYmIChvcC5zY3JvbGxUb3AgIT0gbnVsbCB8fCBvcC5zY3JvbGxMZWZ0ICE9IG51bGwgfHwgb3Auc2Nyb2xsVG9Qb3MpKQogICAgICBkaXNwbGF5LndoZWVsU3RhcnRYID0gZGlzcGxheS53aGVlbFN0YXJ0WSA9IG51bGw7CgogICAgLy8gUHJvcGFnYXRlIHRoZSBzY3JvbGwgcG9zaXRpb24gdG8gdGhlIGFjdHVhbCBET00gc2Nyb2xsZXIKICAgIGlmIChvcC5zY3JvbGxUb3AgIT0gbnVsbCAmJiBkaXNwbGF5LnNjcm9sbGVyLnNjcm9sbFRvcCAhPSBvcC5zY3JvbGxUb3ApIHsKICAgICAgdmFyIHRvcCA9IE1hdGgubWF4KDAsIE1hdGgubWluKGRpc3BsYXkuc2Nyb2xsZXIuc2Nyb2xsSGVpZ2h0IC0gZGlzcGxheS5zY3JvbGxlci5jbGllbnRIZWlnaHQsIG9wLnNjcm9sbFRvcCkpOwogICAgICBkaXNwbGF5LnNjcm9sbGVyLnNjcm9sbFRvcCA9IGRpc3BsYXkuc2Nyb2xsYmFyVi5zY3JvbGxUb3AgPSBkb2Muc2Nyb2xsVG9wID0gdG9wOwogICAgfQogICAgaWYgKG9wLnNjcm9sbExlZnQgIT0gbnVsbCAmJiBkaXNwbGF5LnNjcm9sbGVyLnNjcm9sbExlZnQgIT0gb3Auc2Nyb2xsTGVmdCkgewogICAgICB2YXIgbGVmdCA9IE1hdGgubWF4KDAsIE1hdGgubWluKGRpc3BsYXkuc2Nyb2xsZXIuc2Nyb2xsV2lkdGggLSBkaXNwbGF5LnNjcm9sbGVyLmNsaWVudFdpZHRoLCBvcC5zY3JvbGxMZWZ0KSk7CiAgICAgIGRpc3BsYXkuc2Nyb2xsZXIuc2Nyb2xsTGVmdCA9IGRpc3BsYXkuc2Nyb2xsYmFySC5zY3JvbGxMZWZ0ID0gZG9jLnNjcm9sbExlZnQgPSBsZWZ0OwogICAgICBhbGlnbkhvcml6b250YWxseShjbSk7CiAgICB9CiAgICAvLyBJZiB3ZSBuZWVkIHRvIHNjcm9sbCBhIHNwZWNpZmljIHBvc2l0aW9uIGludG8gdmlldywgZG8gc28uCiAgICBpZiAob3Auc2Nyb2xsVG9Qb3MpIHsKICAgICAgdmFyIGNvb3JkcyA9IHNjcm9sbFBvc0ludG9WaWV3KGNtLCBjbGlwUG9zKGRvYywgb3Auc2Nyb2xsVG9Qb3MuZnJvbSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwUG9zKGRvYywgb3Auc2Nyb2xsVG9Qb3MudG8pLCBvcC5zY3JvbGxUb1Bvcy5tYXJnaW4pOwogICAgICBpZiAob3Auc2Nyb2xsVG9Qb3MuaXNDdXJzb3IgJiYgY20uc3RhdGUuZm9jdXNlZCkgbWF5YmVTY3JvbGxXaW5kb3coY20sIGNvb3Jkcyk7CiAgICB9CgogICAgLy8gRmlyZSBldmVudHMgZm9yIG1hcmtlcnMgdGhhdCBhcmUgaGlkZGVuL3VuaWRkZW4gYnkgZWRpdGluZyBvcgogICAgLy8gdW5kb2luZwogICAgdmFyIGhpZGRlbiA9IG9wLm1heWJlSGlkZGVuTWFya2VycywgdW5oaWRkZW4gPSBvcC5tYXliZVVuaGlkZGVuTWFya2VyczsKICAgIGlmIChoaWRkZW4pIGZvciAodmFyIGkgPSAwOyBpIDwgaGlkZGVuLmxlbmd0aDsgKytpKQogICAgICBpZiAoIWhpZGRlbltpXS5saW5lcy5sZW5ndGgpIHNpZ25hbChoaWRkZW5baV0sICJoaWRlIik7CiAgICBpZiAodW5oaWRkZW4pIGZvciAodmFyIGkgPSAwOyBpIDwgdW5oaWRkZW4ubGVuZ3RoOyArK2kpCiAgICAgIGlmICh1bmhpZGRlbltpXS5saW5lcy5sZW5ndGgpIHNpZ25hbCh1bmhpZGRlbltpXSwgInVuaGlkZSIpOwoKICAgIGlmIChkaXNwbGF5LndyYXBwZXIub2Zmc2V0SGVpZ2h0KQogICAgICBkb2Muc2Nyb2xsVG9wID0gY20uZGlzcGxheS5zY3JvbGxlci5zY3JvbGxUb3A7CgogICAgLy8gQXBwbHkgd29ya2Fyb3VuZCBmb3IgdHdvIHdlYmtpdCBidWdzCiAgICBpZiAob3AudXBkYXRlZERpc3BsYXkgJiYgd2Via2l0KSB7CiAgICAgIGlmIChjbS5vcHRpb25zLmxpbmVXcmFwcGluZykKICAgICAgICBjaGVja0ZvcldlYmtpdFdpZHRoQnVnKGNtLCBvcC5iYXJNZWFzdXJlKTsgLy8gKElzc3VlICMyNDIwKQogICAgICBpZiAob3AuYmFyTWVhc3VyZS5zY3JvbGxXaWR0aCA+IG9wLmJhck1lYXN1cmUuY2xpZW50V2lkdGggJiYKICAgICAgICAgIG9wLmJhck1lYXN1cmUuc2Nyb2xsV2lkdGggPCBvcC5iYXJNZWFzdXJlLmNsaWVudFdpZHRoICsgMSAmJgogICAgICAgICAgIWhTY3JvbGxiYXJUYWtlc1NwYWNlKGNtKSkKICAgICAgICB1cGRhdGVTY3JvbGxiYXJzKGNtKTsgLy8gKElzc3VlICMyNTYyKQogICAgfQoKICAgIC8vIEZpcmUgY2hhbmdlIGV2ZW50cywgYW5kIGRlbGF5ZWQgZXZlbnQgaGFuZGxlcnMKICAgIGlmIChvcC5jaGFuZ2VPYmpzKQogICAgICBzaWduYWwoY20sICJjaGFuZ2VzIiwgY20sIG9wLmNoYW5nZU9ianMpOwogIH0KCiAgLy8gUnVuIHRoZSBnaXZlbiBmdW5jdGlvbiBpbiBhbiBvcGVyYXRpb24KICBmdW5jdGlvbiBydW5Jbk9wKGNtLCBmKSB7CiAgICBpZiAoY20uY3VyT3ApIHJldHVybiBmKCk7CiAgICBzdGFydE9wZXJhdGlvbihjbSk7CiAgICB0cnkgeyByZXR1cm4gZigpOyB9CiAgICBmaW5hbGx5IHsgZW5kT3BlcmF0aW9uKGNtKTsgfQogIH0KICAvLyBXcmFwcyBhIGZ1bmN0aW9uIGluIGFuIG9wZXJhdGlvbi4gUmV0dXJucyB0aGUgd3JhcHBlZCBmdW5jdGlvbi4KICBmdW5jdGlvbiBvcGVyYXRpb24oY20sIGYpIHsKICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgaWYgKGNtLmN1ck9wKSByZXR1cm4gZi5hcHBseShjbSwgYXJndW1lbnRzKTsKICAgICAgc3RhcnRPcGVyYXRpb24oY20pOwogICAgICB0cnkgeyByZXR1cm4gZi5hcHBseShjbSwgYXJndW1lbnRzKTsgfQogICAgICBmaW5hbGx5IHsgZW5kT3BlcmF0aW9uKGNtKTsgfQogICAgfTsKICB9CiAgLy8gVXNlZCB0byBhZGQgbWV0aG9kcyB0byBlZGl0b3IgYW5kIGRvYyBpbnN0YW5jZXMsIHdyYXBwaW5nIHRoZW0gaW4KICAvLyBvcGVyYXRpb25zLgogIGZ1bmN0aW9uIG1ldGhvZE9wKGYpIHsKICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgaWYgKHRoaXMuY3VyT3ApIHJldHVybiBmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgIHN0YXJ0T3BlcmF0aW9uKHRoaXMpOwogICAgICB0cnkgeyByZXR1cm4gZi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9CiAgICAgIGZpbmFsbHkgeyBlbmRPcGVyYXRpb24odGhpcyk7IH0KICAgIH07CiAgfQogIGZ1bmN0aW9uIGRvY01ldGhvZE9wKGYpIHsKICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgdmFyIGNtID0gdGhpcy5jbTsKICAgICAgaWYgKCFjbSB8fCBjbS5jdXJPcCkgcmV0dXJuIGYuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgc3RhcnRPcGVyYXRpb24oY20pOwogICAgICB0cnkgeyByZXR1cm4gZi5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9CiAgICAgIGZpbmFsbHkgeyBlbmRPcGVyYXRpb24oY20pOyB9CiAgICB9OwogIH0KCiAgLy8gVklFVyBUUkFDS0lORwoKICAvLyBUaGVzZSBvYmplY3RzIGFyZSB1c2VkIHRvIHJlcHJlc2VudCB0aGUgdmlzaWJsZSAoY3VycmVudGx5IGRyYXduKQogIC8vIHBhcnQgb2YgdGhlIGRvY3VtZW50LiBBIExpbmVWaWV3IG1heSBjb3JyZXNwb25kIHRvIG11bHRpcGxlCiAgLy8gbG9naWNhbCBsaW5lcywgaWYgdGhvc2UgYXJlIGNvbm5lY3RlZCBieSBjb2xsYXBzZWQgcmFuZ2VzLgogIGZ1bmN0aW9uIExpbmVWaWV3KGRvYywgbGluZSwgbGluZU4pIHsKICAgIC8vIFRoZSBzdGFydGluZyBsaW5lCiAgICB0aGlzLmxpbmUgPSBsaW5lOwogICAgLy8gQ29udGludWluZyBsaW5lcywgaWYgYW55CiAgICB0aGlzLnJlc3QgPSB2aXN1YWxMaW5lQ29udGludWVkKGxpbmUpOwogICAgLy8gTnVtYmVyIG9mIGxvZ2ljYWwgbGluZXMgaW4gdGhpcyB2aXN1YWwgbGluZQogICAgdGhpcy5zaXplID0gdGhpcy5yZXN0ID8gbGluZU5vKGxzdCh0aGlzLnJlc3QpKSAtIGxpbmVOICsgMSA6IDE7CiAgICB0aGlzLm5vZGUgPSB0aGlzLnRleHQgPSBudWxsOwogICAgdGhpcy5oaWRkZW4gPSBsaW5lSXNIaWRkZW4oZG9jLCBsaW5lKTsKICB9CgogIC8vIENyZWF0ZSBhIHJhbmdlIG9mIExpbmVWaWV3IG9iamVjdHMgZm9yIHRoZSBnaXZlbiBsaW5lcy4KICBmdW5jdGlvbiBidWlsZFZpZXdBcnJheShjbSwgZnJvbSwgdG8pIHsKICAgIHZhciBhcnJheSA9IFtdLCBuZXh0UG9zOwogICAgZm9yICh2YXIgcG9zID0gZnJvbTsgcG9zIDwgdG87IHBvcyA9IG5leHRQb3MpIHsKICAgICAgdmFyIHZpZXcgPSBuZXcgTGluZVZpZXcoY20uZG9jLCBnZXRMaW5lKGNtLmRvYywgcG9zKSwgcG9zKTsKICAgICAgbmV4dFBvcyA9IHBvcyArIHZpZXcuc2l6ZTsKICAgICAgYXJyYXkucHVzaCh2aWV3KTsKICAgIH0KICAgIHJldHVybiBhcnJheTsKICB9CgogIC8vIFVwZGF0ZXMgdGhlIGRpc3BsYXkudmlldyBkYXRhIHN0cnVjdHVyZSBmb3IgYSBnaXZlbiBjaGFuZ2UgdG8gdGhlCiAgLy8gZG9jdW1lbnQuIEZyb20gYW5kIHRvIGFyZSBpbiBwcmUtY2hhbmdlIGNvb3JkaW5hdGVzLiBMZW5kaWZmIGlzCiAgLy8gdGhlIGFtb3VudCBvZiBsaW5lcyBhZGRlZCBvciBzdWJ0cmFjdGVkIGJ5IHRoZSBjaGFuZ2UuIFRoaXMgaXMKICAvLyB1c2VkIGZvciBjaGFuZ2VzIHRoYXQgc3BhbiBtdWx0aXBsZSBsaW5lcywgb3IgY2hhbmdlIHRoZSB3YXkKICAvLyBsaW5lcyBhcmUgZGl2aWRlZCBpbnRvIHZpc3VhbCBsaW5lcy4gcmVnTGluZUNoYW5nZSAoYmVsb3cpCiAgLy8gcmVnaXN0ZXJzIHNpbmdsZS1saW5lIGNoYW5nZXMuCiAgZnVuY3Rpb24gcmVnQ2hhbmdlKGNtLCBmcm9tLCB0bywgbGVuZGlmZikgewogICAgaWYgKGZyb20gPT0gbnVsbCkgZnJvbSA9IGNtLmRvYy5maXJzdDsKICAgIGlmICh0byA9PSBudWxsKSB0byA9IGNtLmRvYy5maXJzdCArIGNtLmRvYy5zaXplOwogICAgaWYgKCFsZW5kaWZmKSBsZW5kaWZmID0gMDsKCiAgICB2YXIgZGlzcGxheSA9IGNtLmRpc3BsYXk7CiAgICBpZiAobGVuZGlmZiAmJiB0byA8IGRpc3BsYXkudmlld1RvICYmCiAgICAgICAgKGRpc3BsYXkudXBkYXRlTGluZU51bWJlcnMgPT0gbnVsbCB8fCBkaXNwbGF5LnVwZGF0ZUxpbmVOdW1iZXJzID4gZnJvbSkpCiAgICAgIGRpc3BsYXkudXBkYXRlTGluZU51bWJlcnMgPSBmcm9tOwoKICAgIGNtLmN1ck9wLnZpZXdDaGFuZ2VkID0gdHJ1ZTsKCiAgICBpZiAoZnJvbSA+PSBkaXNwbGF5LnZpZXdUbykgeyAvLyBDaGFuZ2UgYWZ0ZXIKICAgICAgaWYgKHNhd0NvbGxhcHNlZFNwYW5zICYmIHZpc3VhbExpbmVObyhjbS5kb2MsIGZyb20pIDwgZGlzcGxheS52aWV3VG8pCiAgICAgICAgcmVzZXRWaWV3KGNtKTsKICAgIH0gZWxzZSBpZiAodG8gPD0gZGlzcGxheS52aWV3RnJvbSkgeyAvLyBDaGFuZ2UgYmVmb3JlCiAgICAgIGlmIChzYXdDb2xsYXBzZWRTcGFucyAmJiB2aXN1YWxMaW5lRW5kTm8oY20uZG9jLCB0byArIGxlbmRpZmYpID4gZGlzcGxheS52aWV3RnJvbSkgewogICAgICAgIHJlc2V0VmlldyhjbSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZGlzcGxheS52aWV3RnJvbSArPSBsZW5kaWZmOwogICAgICAgIGRpc3BsYXkudmlld1RvICs9IGxlbmRpZmY7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoZnJvbSA8PSBkaXNwbGF5LnZpZXdGcm9tICYmIHRvID49IGRpc3BsYXkudmlld1RvKSB7IC8vIEZ1bGwgb3ZlcmxhcAogICAgICByZXNldFZpZXcoY20pOwogICAgfSBlbHNlIGlmIChmcm9tIDw9IGRpc3BsYXkudmlld0Zyb20pIHsgLy8gVG9wIG92ZXJsYXAKICAgICAgdmFyIGN1dCA9IHZpZXdDdXR0aW5nUG9pbnQoY20sIHRvLCB0byArIGxlbmRpZmYsIDEpOwogICAgICBpZiAoY3V0KSB7CiAgICAgICAgZGlzcGxheS52aWV3ID0gZGlzcGxheS52aWV3LnNsaWNlKGN1dC5pbmRleCk7CiAgICAgICAgZGlzcGxheS52aWV3RnJvbSA9IGN1dC5saW5lTjsKICAgICAgICBkaXNwbGF5LnZpZXdUbyArPSBsZW5kaWZmOwogICAgICB9IGVsc2UgewogICAgICAgIHJlc2V0VmlldyhjbSk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAodG8gPj0gZGlzcGxheS52aWV3VG8pIHsgLy8gQm90dG9tIG92ZXJsYXAKICAgICAgdmFyIGN1dCA9IHZpZXdDdXR0aW5nUG9pbnQoY20sIGZyb20sIGZyb20sIC0xKTsKICAgICAgaWYgKGN1dCkgewogICAgICAgIGRpc3BsYXkudmlldyA9IGRpc3BsYXkudmlldy5zbGljZSgwLCBjdXQuaW5kZXgpOwogICAgICAgIGRpc3BsYXkudmlld1RvID0gY3V0LmxpbmVOOwogICAgICB9IGVsc2UgewogICAgICAgIHJlc2V0VmlldyhjbSk7CiAgICAgIH0KICAgIH0gZWxzZSB7IC8vIEdhcCBpbiB0aGUgbWlkZGxlCiAgICAgIHZhciBjdXRUb3AgPSB2aWV3Q3V0dGluZ1BvaW50KGNtLCBmcm9tLCBmcm9tLCAtMSk7CiAgICAgIHZhciBjdXRCb3QgPSB2aWV3Q3V0dGluZ1BvaW50KGNtLCB0bywgdG8gKyBsZW5kaWZmLCAxKTsKICAgICAgaWYgKGN1dFRvcCAmJiBjdXRCb3QpIHsKICAgICAgICBkaXNwbGF5LnZpZXcgPSBkaXNwbGF5LnZpZXcuc2xpY2UoMCwgY3V0VG9wLmluZGV4KQogICAgICAgICAgLmNvbmNhdChidWlsZFZpZXdBcnJheShjbSwgY3V0VG9wLmxpbmVOLCBjdXRCb3QubGluZU4pKQogICAgICAgICAgLmNvbmNhdChkaXNwbGF5LnZpZXcuc2xpY2UoY3V0Qm90LmluZGV4KSk7CiAgICAgICAgZGlzcGxheS52aWV3VG8gKz0gbGVuZGlmZjsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXNldFZpZXcoY20pOwogICAgICB9CiAgICB9CgogICAgdmFyIGV4dCA9IGRpc3BsYXkuZXh0ZXJuYWxNZWFzdXJlZDsKICAgIGlmIChleHQpIHsKICAgICAgaWYgKHRvIDwgZXh0LmxpbmVOKQogICAgICAgIGV4dC5saW5lTiArPSBsZW5kaWZmOwogICAgICBlbHNlIGlmIChmcm9tIDwgZXh0LmxpbmVOICsgZXh0LnNpemUpCiAgICAgICAgZGlzcGxheS5leHRlcm5hbE1lYXN1cmVkID0gbnVsbDsKICAgIH0KICB9CgogIC8vIFJlZ2lzdGVyIGEgY2hhbmdlIHRvIGEgc2luZ2xlIGxpbmUuIFR5cGUgbXVzdCBiZSBvbmUgb2YgInRleHQiLAogIC8vICJndXR0ZXIiLCAiY2xhc3MiLCAid2lkZ2V0IgogIGZ1bmN0aW9uIHJlZ0xpbmVDaGFuZ2UoY20sIGxpbmUsIHR5cGUpIHsKICAgIGNtLmN1ck9wLnZpZXdDaGFuZ2VkID0gdHJ1ZTsKICAgIHZhciBkaXNwbGF5ID0gY20uZGlzcGxheSwgZXh0ID0gY20uZGlzcGxheS5leHRlcm5hbE1lYXN1cmVkOwogICAgaWYgKGV4dCAmJiBsaW5lID49IGV4dC5saW5lTiAmJiBsaW5lIDwgZXh0LmxpbmVOICsgZXh0LnNpemUpCiAgICAgIGRpc3BsYXkuZXh0ZXJuYWxNZWFzdXJlZCA9IG51bGw7CgogICAgaWYgKGxpbmUgPCBkaXNwbGF5LnZpZXdGcm9tIHx8IGxpbmUgPj0gZGlzcGxheS52aWV3VG8pIHJldHVybjsKICAgIHZhciBsaW5lVmlldyA9IGRpc3BsYXkudmlld1tmaW5kVmlld0luZGV4KGNtLCBsaW5lKV07CiAgICBpZiAobGluZVZpZXcubm9kZSA9PSBudWxsKSByZXR1cm47CiAgICB2YXIgYXJyID0gbGluZVZpZXcuY2hhbmdlcyB8fCAobGluZVZpZXcuY2hhbmdlcyA9IFtdKTsKICAgIGlmIChpbmRleE9mKGFyciwgdHlwZSkgPT0gLTEpIGFyci5wdXNoKHR5cGUpOwogIH0KCiAgLy8gQ2xlYXIgdGhlIHZpZXcuCiAgZnVuY3Rpb24gcmVzZXRWaWV3KGNtKSB7CiAgICBjbS5kaXNwbGF5LnZpZXdGcm9tID0gY20uZGlzcGxheS52aWV3VG8gPSBjbS5kb2MuZmlyc3Q7CiAgICBjbS5kaXNwbGF5LnZpZXcgPSBbXTsKICAgIGNtLmRpc3BsYXkudmlld09mZnNldCA9IDA7CiAgfQoKICAvLyBGaW5kIHRoZSB2aWV3IGVsZW1lbnQgY29ycmVzcG9uZGluZyB0byBhIGdpdmVuIGxpbmUuIFJldHVybiBudWxsCiAgLy8gd2hlbiB0aGUgbGluZSBpc24ndCB2aXNpYmxlLgogIGZ1bmN0aW9uIGZpbmRWaWV3SW5kZXgoY20sIG4pIHsKICAgIGlmIChuID49IGNtLmRpc3BsYXkudmlld1RvKSByZXR1cm4gbnVsbDsKICAgIG4gLT0gY20uZGlzcGxheS52aWV3RnJvbTsKICAgIGlmIChuIDwgMCkgcmV0dXJuIG51bGw7CiAgICB2YXIgdmlldyA9IGNtLmRpc3BsYXkudmlldzsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmlldy5sZW5ndGg7IGkrKykgewogICAgICBuIC09IHZpZXdbaV0uc2l6ZTsKICAgICAgaWYgKG4gPCAwKSByZXR1cm4gaTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHZpZXdDdXR0aW5nUG9pbnQoY20sIG9sZE4sIG5ld04sIGRpcikgewogICAgdmFyIGluZGV4ID0gZmluZFZpZXdJbmRleChjbSwgb2xkTiksIGRpZmYsIHZpZXcgPSBjbS5kaXNwbGF5LnZpZXc7CiAgICBpZiAoIXNhd0NvbGxhcHNlZFNwYW5zIHx8IG5ld04gPT0gY20uZG9jLmZpcnN0ICsgY20uZG9jLnNpemUpCiAgICAgIHJldHVybiB7aW5kZXg6IGluZGV4LCBsaW5lTjogbmV3Tn07CiAgICBmb3IgKHZhciBpID0gMCwgbiA9IGNtLmRpc3BsYXkudmlld0Zyb207IGkgPCBpbmRleDsgaSsrKQogICAgICBuICs9IHZpZXdbaV0uc2l6ZTsKICAgIGlmIChuICE9IG9sZE4pIHsKICAgICAgaWYgKGRpciA+IDApIHsKICAgICAgICBpZiAoaW5kZXggPT0gdmlldy5sZW5ndGggLSAxKSByZXR1cm4gbnVsbDsKICAgICAgICBkaWZmID0gKG4gKyB2aWV3W2luZGV4XS5zaXplKSAtIG9sZE47CiAgICAgICAgaW5kZXgrKzsKICAgICAgfSBlbHNlIHsKICAgICAgICBkaWZmID0gbiAtIG9sZE47CiAgICAgIH0KICAgICAgb2xkTiArPSBkaWZmOyBuZXdOICs9IGRpZmY7CiAgICB9CiAgICB3aGlsZSAodmlzdWFsTGluZU5vKGNtLmRvYywgbmV3TikgIT0gbmV3TikgewogICAgICBpZiAoaW5kZXggPT0gKGRpciA8IDAgPyAwIDogdmlldy5sZW5ndGggLSAxKSkgcmV0dXJuIG51bGw7CiAgICAgIG5ld04gKz0gZGlyICogdmlld1tpbmRleCAtIChkaXIgPCAwID8gMSA6IDApXS5zaXplOwogICAgICBpbmRleCArPSBkaXI7CiAgICB9CiAgICByZXR1cm4ge2luZGV4OiBpbmRleCwgbGluZU46IG5ld059OwogIH0KCiAgLy8gRm9yY2UgdGhlIHZpZXcgdG8gY292ZXIgYSBnaXZlbiByYW5nZSwgYWRkaW5nIGVtcHR5IHZpZXcgZWxlbWVudAogIC8vIG9yIGNsaXBwaW5nIG9mZiBleGlzdGluZyBvbmVzIGFzIG5lZWRlZC4KICBmdW5jdGlvbiBhZGp1c3RWaWV3KGNtLCBmcm9tLCB0bykgewogICAgdmFyIGRpc3BsYXkgPSBjbS5kaXNwbGF5LCB2aWV3ID0gZGlzcGxheS52aWV3OwogICAgaWYgKHZpZXcubGVuZ3RoID09IDAgfHwgZnJvbSA+PSBkaXNwbGF5LnZpZXdUbyB8fCB0byA8PSBkaXNwbGF5LnZpZXdGcm9tKSB7CiAgICAgIGRpc3BsYXkudmlldyA9IGJ1aWxkVmlld0FycmF5KGNtLCBmcm9tLCB0byk7CiAgICAgIGRpc3BsYXkudmlld0Zyb20gPSBmcm9tOwogICAgfSBlbHNlIHsKICAgICAgaWYgKGRpc3BsYXkudmlld0Zyb20gPiBmcm9tKQogICAgICAgIGRpc3BsYXkudmlldyA9IGJ1aWxkVmlld0FycmF5KGNtLCBmcm9tLCBkaXNwbGF5LnZpZXdGcm9tKS5jb25jYXQoZGlzcGxheS52aWV3KTsKICAgICAgZWxzZSBpZiAoZGlzcGxheS52aWV3RnJvbSA8IGZyb20pCiAgICAgICAgZGlzcGxheS52aWV3ID0gZGlzcGxheS52aWV3LnNsaWNlKGZpbmRWaWV3SW5kZXgoY20sIGZyb20pKTsKICAgICAgZGlzcGxheS52aWV3RnJvbSA9IGZyb207CiAgICAgIGlmIChkaXNwbGF5LnZpZXdUbyA8IHRvKQogICAgICAgIGRpc3BsYXkudmlldyA9IGRpc3BsYXkudmlldy5jb25jYXQoYnVpbGRWaWV3QXJyYXkoY20sIGRpc3BsYXkudmlld1RvLCB0bykpOwogICAgICBlbHNlIGlmIChkaXNwbGF5LnZpZXdUbyA+IHRvKQogICAgICAgIGRpc3BsYXkudmlldyA9IGRpc3BsYXkudmlldy5zbGljZSgwLCBmaW5kVmlld0luZGV4KGNtLCB0bykpOwogICAgfQogICAgZGlzcGxheS52aWV3VG8gPSB0bzsKICB9CgogIC8vIENvdW50IHRoZSBudW1iZXIgb2YgbGluZXMgaW4gdGhlIHZpZXcgd2hvc2UgRE9NIHJlcHJlc2VudGF0aW9uIGlzCiAgLy8gb3V0IG9mIGRhdGUgKG9yIG5vbmV4aXN0ZW50KS4KICBmdW5jdGlvbiBjb3VudERpcnR5VmlldyhjbSkgewogICAgdmFyIHZpZXcgPSBjbS5kaXNwbGF5LnZpZXcsIGRpcnR5ID0gMDsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmlldy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgbGluZVZpZXcgPSB2aWV3W2ldOwogICAgICBpZiAoIWxpbmVWaWV3LmhpZGRlbiAmJiAoIWxpbmVWaWV3Lm5vZGUgfHwgbGluZVZpZXcuY2hhbmdlcykpICsrZGlydHk7CiAgICB9CiAgICByZXR1cm4gZGlydHk7CiAgfQoKICAvLyBJTlBVVCBIQU5ETElORwoKICAvLyBQb2xsIGZvciBpbnB1dCBjaGFuZ2VzLCB1c2luZyB0aGUgbm9ybWFsIHJhdGUgb2YgcG9sbGluZy4gVGhpcwogIC8vIHJ1bnMgYXMgbG9uZyBhcyB0aGUgZWRpdG9yIGlzIGZvY3VzZWQuCiAgZnVuY3Rpb24gc2xvd1BvbGwoY20pIHsKICAgIGlmIChjbS5kaXNwbGF5LnBvbGxpbmdGYXN0KSByZXR1cm47CiAgICBjbS5kaXNwbGF5LnBvbGwuc2V0KGNtLm9wdGlvbnMucG9sbEludGVydmFsLCBmdW5jdGlvbigpIHsKICAgICAgcmVhZElucHV0KGNtKTsKICAgICAgaWYgKGNtLnN0YXRlLmZvY3VzZWQpIHNsb3dQb2xsKGNtKTsKICAgIH0pOwogIH0KCiAgLy8gV2hlbiBhbiBldmVudCBoYXMganVzdCBjb21lIGluIHRoYXQgaXMgbGlrZWx5IHRvIGFkZCBvciBjaGFuZ2UKICAvLyBzb21ldGhpbmcgaW4gdGhlIGlucHV0IHRleHRhcmVhLCB3ZSBwb2xsIGZhc3RlciwgdG8gZW5zdXJlIHRoYXQKICAvLyB0aGUgY2hhbmdlIGFwcGVhcnMgb24gdGhlIHNjcmVlbiBxdWlja2x5LgogIGZ1bmN0aW9uIGZhc3RQb2xsKGNtKSB7CiAgICB2YXIgbWlzc2VkID0gZmFsc2U7CiAgICBjbS5kaXNwbGF5LnBvbGxpbmdGYXN0ID0gdHJ1ZTsKICAgIGZ1bmN0aW9uIHAoKSB7CiAgICAgIHZhciBjaGFuZ2VkID0gcmVhZElucHV0KGNtKTsKICAgICAgaWYgKCFjaGFuZ2VkICYmICFtaXNzZWQpIHttaXNzZWQgPSB0cnVlOyBjbS5kaXNwbGF5LnBvbGwuc2V0KDYwLCBwKTt9CiAgICAgIGVsc2Uge2NtLmRpc3BsYXkucG9sbGluZ0Zhc3QgPSBmYWxzZTsgc2xvd1BvbGwoY20pO30KICAgIH0KICAgIGNtLmRpc3BsYXkucG9sbC5zZXQoMjAsIHApOwogIH0KCiAgLy8gVGhpcyB3aWxsIGJlIHNldCB0byBhbiBhcnJheSBvZiBzdHJpbmdzIHdoZW4gY29weWluZywgc28gdGhhdCwKICAvLyB3aGVuIHBhc3RpbmcsIHdlIGtub3cgd2hhdCBraW5kIG9mIHNlbGVjdGlvbnMgdGhlIGNvcGllZCB0ZXh0CiAgLy8gd2FzIG1hZGUgb3V0IG9mLgogIHZhciBsYXN0Q29waWVkID0gbnVsbDsKCiAgLy8gUmVhZCBpbnB1dCBmcm9tIHRoZSB0ZXh0YXJlYSwgYW5kIHVwZGF0ZSB0aGUgZG9jdW1lbnQgdG8gbWF0Y2guCiAgLy8gV2hlbiBzb21ldGhpbmcgaXMgc2VsZWN0ZWQsIGl0IGlzIHByZXNlbnQgaW4gdGhlIHRleHRhcmVhLCBhbmQKICAvLyBzZWxlY3RlZCAodW5sZXNzIGl0IGlzIGh1Z2UsIGluIHdoaWNoIGNhc2UgYSBwbGFjZWhvbGRlciBpcwogIC8vIHVzZWQpLiBXaGVuIG5vdGhpbmcgaXMgc2VsZWN0ZWQsIHRoZSBjdXJzb3Igc2l0cyBhZnRlciBwcmV2aW91c2x5CiAgLy8gc2VlbiB0ZXh0IChjYW4gYmUgZW1wdHkpLCB3aGljaCBpcyBzdG9yZWQgaW4gcHJldklucHV0ICh3ZSBtdXN0CiAgLy8gbm90IHJlc2V0IHRoZSB0ZXh0YXJlYSB3aGVuIHR5cGluZywgYmVjYXVzZSB0aGF0IGJyZWFrcyBJTUUpLgogIGZ1bmN0aW9uIHJlYWRJbnB1dChjbSkgewogICAgdmFyIGlucHV0ID0gY20uZGlzcGxheS5pbnB1dCwgcHJldklucHV0ID0gY20uZGlzcGxheS5wcmV2SW5wdXQsIGRvYyA9IGNtLmRvYzsKICAgIC8vIFNpbmNlIHRoaXMgaXMgY2FsbGVkIGEgKmxvdCosIHRyeSB0byBiYWlsIG91dCBhcyBjaGVhcGx5IGFzCiAgICAvLyBwb3NzaWJsZSB3aGVuIGl0IGlzIGNsZWFyIHRoYXQgbm90aGluZyBoYXBwZW5lZC4gaGFzU2VsZWN0aW9uCiAgICAvLyB3aWxsIGJlIHRoZSBjYXNlIHdoZW4gdGhlcmUgaXMgYSBsb3Qgb2YgdGV4dCBpbiB0aGUgdGV4dGFyZWEsCiAgICAvLyBpbiB3aGljaCBjYXNlIHJlYWRpbmcgaXRzIHZhbHVlIHdvdWxkIGJlIGV4cGVuc2l2ZS4KICAgIGlmICghY20uc3RhdGUuZm9jdXNlZCB8fCAoaGFzU2VsZWN0aW9uKGlucHV0KSAmJiAhcHJldklucHV0KSB8fCBpc1JlYWRPbmx5KGNtKSB8fCBjbS5vcHRpb25zLmRpc2FibGVJbnB1dCkKICAgICAgcmV0dXJuIGZhbHNlOwogICAgLy8gU2VlIHBhc3RlIGhhbmRsZXIgZm9yIG1vcmUgb24gdGhlIGZha2VkTGFzdENoYXIga2x1ZGdlCiAgICBpZiAoY20uc3RhdGUucGFzdGVJbmNvbWluZyAmJiBjbS5zdGF0ZS5mYWtlZExhc3RDaGFyKSB7CiAgICAgIGlucHV0LnZhbHVlID0gaW5wdXQudmFsdWUuc3Vic3RyaW5nKDAsIGlucHV0LnZhbHVlLmxlbmd0aCAtIDEpOwogICAgICBjbS5zdGF0ZS5mYWtlZExhc3RDaGFyID0gZmFsc2U7CiAgICB9CiAgICB2YXIgdGV4dCA9IGlucHV0LnZhbHVlOwogICAgLy8gSWYgbm90aGluZyBjaGFuZ2VkLCBiYWlsLgogICAgaWYgKHRleHQgPT0gcHJldklucHV0ICYmICFjbS5zb21ldGhpbmdTZWxlY3RlZCgpKSByZXR1cm4gZmFsc2U7CiAgICAvLyBXb3JrIGFyb3VuZCBub25zZW5zaWNhbCBzZWxlY3Rpb24gcmVzZXR0aW5nIGluIElFOS8xMCwgYW5kCiAgICAvLyBpbmV4cGxpY2FibGUgYXBwZWFyYW5jZSBvZiBwcml2YXRlIGFyZWEgdW5pY29kZSBjaGFyYWN0ZXJzIG9uCiAgICAvLyBzb21lIGtleSBjb21ib3MgaW4gTWFjICgjMjY4OSkuCiAgICBpZiAoaWUgJiYgaWVfdmVyc2lvbiA+PSA5ICYmIGNtLmRpc3BsYXkuaW5wdXRIYXNTZWxlY3Rpb24gPT09IHRleHQgfHwKICAgICAgICBtYWMgJiYgL1tcdWY3MDAtXHVmN2ZmXS8udGVzdCh0ZXh0KSkgewogICAgICByZXNldElucHV0KGNtKTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIHZhciB3aXRoT3AgPSAhY20uY3VyT3A7CiAgICBpZiAod2l0aE9wKSBzdGFydE9wZXJhdGlvbihjbSk7CiAgICBjbS5kaXNwbGF5LnNoaWZ0ID0gZmFsc2U7CgogICAgaWYgKHRleHQuY2hhckNvZGVBdCgwKSA9PSAweDIwMGIgJiYgZG9jLnNlbCA9PSBjbS5kaXNwbGF5LnNlbEZvckNvbnRleHRNZW51ICYmICFwcmV2SW5wdXQpCiAgICAgIHByZXZJbnB1dCA9ICJcdTIwMGIiOwogICAgLy8gRmluZCB0aGUgcGFydCBvZiB0aGUgaW5wdXQgdGhhdCBpcyBhY3R1YWxseSBuZXcKICAgIHZhciBzYW1lID0gMCwgbCA9IE1hdGgubWluKHByZXZJbnB1dC5sZW5ndGgsIHRleHQubGVuZ3RoKTsKICAgIHdoaWxlIChzYW1lIDwgbCAmJiBwcmV2SW5wdXQuY2hhckNvZGVBdChzYW1lKSA9PSB0ZXh0LmNoYXJDb2RlQXQoc2FtZSkpICsrc2FtZTsKICAgIHZhciBpbnNlcnRlZCA9IHRleHQuc2xpY2Uoc2FtZSksIHRleHRMaW5lcyA9IHNwbGl0TGluZXMoaW5zZXJ0ZWQpOwoKICAgIC8vIFdoZW4gcGFzaW5nIE4gbGluZXMgaW50byBOIHNlbGVjdGlvbnMsIGluc2VydCBvbmUgbGluZSBwZXIgc2VsZWN0aW9uCiAgICB2YXIgbXVsdGlQYXN0ZSA9IG51bGw7CiAgICBpZiAoY20uc3RhdGUucGFzdGVJbmNvbWluZyAmJiBkb2Muc2VsLnJhbmdlcy5sZW5ndGggPiAxKSB7CiAgICAgIGlmIChsYXN0Q29waWVkICYmIGxhc3RDb3BpZWQuam9pbigiXG4iKSA9PSBpbnNlcnRlZCkKICAgICAgICBtdWx0aVBhc3RlID0gZG9jLnNlbC5yYW5nZXMubGVuZ3RoICUgbGFzdENvcGllZC5sZW5ndGggPT0gMCAmJiBtYXAobGFzdENvcGllZCwgc3BsaXRMaW5lcyk7CiAgICAgIGVsc2UgaWYgKHRleHRMaW5lcy5sZW5ndGggPT0gZG9jLnNlbC5yYW5nZXMubGVuZ3RoKQogICAgICAgIG11bHRpUGFzdGUgPSBtYXAodGV4dExpbmVzLCBmdW5jdGlvbihsKSB7IHJldHVybiBbbF07IH0pOwogICAgfQoKICAgIC8vIE5vcm1hbCBiZWhhdmlvciBpcyB0byBpbnNlcnQgdGhlIG5ldyB0ZXh0IGludG8gZXZlcnkgc2VsZWN0aW9uCiAgICBmb3IgKHZhciBpID0gZG9jLnNlbC5yYW5nZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgdmFyIHJhbmdlID0gZG9jLnNlbC5yYW5nZXNbaV07CiAgICAgIHZhciBmcm9tID0gcmFuZ2UuZnJvbSgpLCB0byA9IHJhbmdlLnRvKCk7CiAgICAgIC8vIEhhbmRsZSBkZWxldGlvbgogICAgICBpZiAoc2FtZSA8IHByZXZJbnB1dC5sZW5ndGgpCiAgICAgICAgZnJvbSA9IFBvcyhmcm9tLmxpbmUsIGZyb20uY2ggLSAocHJldklucHV0Lmxlbmd0aCAtIHNhbWUpKTsKICAgICAgLy8gSGFuZGxlIG92ZXJ3cml0ZQogICAgICBlbHNlIGlmIChjbS5zdGF0ZS5vdmVyd3JpdGUgJiYgcmFuZ2UuZW1wdHkoKSAmJiAhY20uc3RhdGUucGFzdGVJbmNvbWluZykKICAgICAgICB0byA9IFBvcyh0by5saW5lLCBNYXRoLm1pbihnZXRMaW5lKGRvYywgdG8ubGluZSkudGV4dC5sZW5ndGgsIHRvLmNoICsgbHN0KHRleHRMaW5lcykubGVuZ3RoKSk7CiAgICAgIHZhciB1cGRhdGVJbnB1dCA9IGNtLmN1ck9wLnVwZGF0ZUlucHV0OwogICAgICB2YXIgY2hhbmdlRXZlbnQgPSB7ZnJvbTogZnJvbSwgdG86IHRvLCB0ZXh0OiBtdWx0aVBhc3RlID8gbXVsdGlQYXN0ZVtpICUgbXVsdGlQYXN0ZS5sZW5ndGhdIDogdGV4dExpbmVzLAogICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luOiBjbS5zdGF0ZS5wYXN0ZUluY29taW5nID8gInBhc3RlIiA6IGNtLnN0YXRlLmN1dEluY29taW5nID8gImN1dCIgOiAiK2lucHV0In07CiAgICAgIG1ha2VDaGFuZ2UoY20uZG9jLCBjaGFuZ2VFdmVudCk7CiAgICAgIHNpZ25hbExhdGVyKGNtLCAiaW5wdXRSZWFkIiwgY20sIGNoYW5nZUV2ZW50KTsKICAgICAgLy8gV2hlbiBhbiAnZWxlY3RyaWMnIGNoYXJhY3RlciBpcyBpbnNlcnRlZCwgaW1tZWRpYXRlbHkgdHJpZ2dlciBhIHJlaW5kZW50CiAgICAgIGlmIChpbnNlcnRlZCAmJiAhY20uc3RhdGUucGFzdGVJbmNvbWluZyAmJiBjbS5vcHRpb25zLmVsZWN0cmljQ2hhcnMgJiYKICAgICAgICAgIGNtLm9wdGlvbnMuc21hcnRJbmRlbnQgJiYgcmFuZ2UuaGVhZC5jaCA8IDEwMCAmJgogICAgICAgICAgKCFpIHx8IGRvYy5zZWwucmFuZ2VzW2kgLSAxXS5oZWFkLmxpbmUgIT0gcmFuZ2UuaGVhZC5saW5lKSkgewogICAgICAgIHZhciBtb2RlID0gY20uZ2V0TW9kZUF0KHJhbmdlLmhlYWQpOwogICAgICAgIGlmIChtb2RlLmVsZWN0cmljQ2hhcnMpIHsKICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbW9kZS5lbGVjdHJpY0NoYXJzLmxlbmd0aDsgaisrKQogICAgICAgICAgICBpZiAoaW5zZXJ0ZWQuaW5kZXhPZihtb2RlLmVsZWN0cmljQ2hhcnMuY2hhckF0KGopKSA+IC0xKSB7CiAgICAgICAgICAgICAgaW5kZW50TGluZShjbSwgcmFuZ2UuaGVhZC5saW5lLCAic21hcnQiKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAobW9kZS5lbGVjdHJpY0lucHV0KSB7CiAgICAgICAgICB2YXIgZW5kID0gY2hhbmdlRW5kKGNoYW5nZUV2ZW50KTsKICAgICAgICAgIGlmIChtb2RlLmVsZWN0cmljSW5wdXQudGVzdChnZXRMaW5lKGRvYywgZW5kLmxpbmUpLnRleHQuc2xpY2UoMCwgZW5kLmNoKSkpCiAgICAgICAgICAgIGluZGVudExpbmUoY20sIHJhbmdlLmhlYWQubGluZSwgInNtYXJ0Iik7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBlbnN1cmVDdXJzb3JWaXNpYmxlKGNtKTsKICAgIGNtLmN1ck9wLnVwZGF0ZUlucHV0ID0gdXBkYXRlSW5wdXQ7CiAgICBjbS5jdXJPcC50eXBpbmcgPSB0cnVlOwoKICAgIC8vIERvbid0IGxlYXZlIGxvbmcgdGV4dCBpbiB0aGUgdGV4dGFyZWEsIHNpbmNlIGl0IG1ha2VzIGZ1cnRoZXIgcG9sbGluZyBzbG93CiAgICBpZiAodGV4dC5sZW5ndGggPiAxMDAwIHx8IHRleHQuaW5kZXhPZigiXG4iKSA+IC0xKSBpbnB1dC52YWx1ZSA9IGNtLmRpc3BsYXkucHJldklucHV0ID0gIiI7CiAgICBlbHNlIGNtLmRpc3BsYXkucHJldklucHV0ID0gdGV4dDsKICAgIGlmICh3aXRoT3ApIGVuZE9wZXJhdGlvbihjbSk7CiAgICBjbS5zdGF0ZS5wYXN0ZUluY29taW5nID0gY20uc3RhdGUuY3V0SW5jb21pbmcgPSBmYWxzZTsKICAgIHJldHVybiB0cnVlOwogIH0KCiAgLy8gUmVzZXQgdGhlIGlucHV0IHRvIGNvcnJlc3BvbmQgdG8gdGhlIHNlbGVjdGlvbiAob3IgdG8gYmUgZW1wdHksCiAgLy8gd2hlbiBub3QgdHlwaW5nIGFuZCBub3RoaW5nIGlzIHNlbGVjdGVkKQogIGZ1bmN0aW9uIHJlc2V0SW5wdXQoY20sIHR5cGluZykgewogICAgdmFyIG1pbmltYWwsIHNlbGVjdGVkLCBkb2MgPSBjbS5kb2M7CiAgICBpZiAoY20uc29tZXRoaW5nU2VsZWN0ZWQoKSkgewogICAgICBjbS5kaXNwbGF5LnByZXZJbnB1dCA9ICIiOwogICAgICB2YXIgcmFuZ2UgPSBkb2Muc2VsLnByaW1hcnkoKTsKICAgICAgbWluaW1hbCA9IGhhc0NvcHlFdmVudCAmJgogICAgICAgIChyYW5nZS50bygpLmxpbmUgLSByYW5nZS5mcm9tKCkubGluZSA+IDEwMCB8fCAoc2VsZWN0ZWQgPSBjbS5nZXRTZWxlY3Rpb24oKSkubGVuZ3RoID4gMTAwMCk7CiAgICAgIHZhciBjb250ZW50ID0gbWluaW1hbCA/ICItIiA6IHNlbGVjdGVkIHx8IGNtLmdldFNlbGVjdGlvbigpOwogICAgICBjbS5kaXNwbGF5LmlucHV0LnZhbHVlID0gY29udGVudDsKICAgICAgaWYgKGNtLnN0YXRlLmZvY3VzZWQpIHNlbGVjdElucHV0KGNtLmRpc3BsYXkuaW5wdXQpOwogICAgICBpZiAoaWUgJiYgaWVfdmVyc2lvbiA+PSA5KSBjbS5kaXNwbGF5LmlucHV0SGFzU2VsZWN0aW9uID0gY29udGVudDsKICAgIH0gZWxzZSBpZiAoIXR5cGluZykgewogICAgICBjbS5kaXNwbGF5LnByZXZJbnB1dCA9IGNtLmRpc3BsYXkuaW5wdXQudmFsdWUgPSAiIjsKICAgICAgaWYgKGllICYmIGllX3ZlcnNpb24gPj0gOSkgY20uZGlzcGxheS5pbnB1dEhhc1NlbGVjdGlvbiA9IG51bGw7CiAgICB9CiAgICBjbS5kaXNwbGF5LmluYWNjdXJhdGVTZWxlY3Rpb24gPSBtaW5pbWFsOwogIH0KCiAgZnVuY3Rpb24gZm9jdXNJbnB1dChjbSkgewogICAgaWYgKGNtLm9wdGlvbnMucmVhZE9ubHkgIT0gIm5vY3Vyc29yIiAmJiAoIW1vYmlsZSB8fCBhY3RpdmVFbHQoKSAhPSBjbS5kaXNwbGF5LmlucHV0KSkKICAgICAgY20uZGlzcGxheS5pbnB1dC5mb2N1cygpOwogIH0KCiAgZnVuY3Rpb24gZW5zdXJlRm9jdXMoY20pIHsKICAgIGlmICghY20uc3RhdGUuZm9jdXNlZCkgeyBmb2N1c0lucHV0KGNtKTsgb25Gb2N1cyhjbSk7IH0KICB9CgogIGZ1bmN0aW9uIGlzUmVhZE9ubHkoY20pIHsKICAgIHJldHVybiBjbS5vcHRpb25zLnJlYWRPbmx5IHx8IGNtLmRvYy5jYW50RWRpdDsKICB9CgogIC8vIEVWRU5UIEhBTkRMRVJTCgogIC8vIEF0dGFjaCB0aGUgbmVjZXNzYXJ5IGV2ZW50IGhhbmRsZXJzIHdoZW4gaW5pdGlhbGl6aW5nIHRoZSBlZGl0b3IKICBmdW5jdGlvbiByZWdpc3RlckV2ZW50SGFuZGxlcnMoY20pIHsKICAgIHZhciBkID0gY20uZGlzcGxheTsKICAgIG9uKGQuc2Nyb2xsZXIsICJtb3VzZWRvd24iLCBvcGVyYXRpb24oY20sIG9uTW91c2VEb3duKSk7CiAgICAvLyBPbGRlciBJRSdzIHdpbGwgbm90IGZpcmUgYSBzZWNvbmQgbW91c2Vkb3duIGZvciBhIGRvdWJsZSBjbGljawogICAgaWYgKGllICYmIGllX3ZlcnNpb24gPCAxMSkKICAgICAgb24oZC5zY3JvbGxlciwgImRibGNsaWNrIiwgb3BlcmF0aW9uKGNtLCBmdW5jdGlvbihlKSB7CiAgICAgICAgaWYgKHNpZ25hbERPTUV2ZW50KGNtLCBlKSkgcmV0dXJuOwogICAgICAgIHZhciBwb3MgPSBwb3NGcm9tTW91c2UoY20sIGUpOwogICAgICAgIGlmICghcG9zIHx8IGNsaWNrSW5HdXR0ZXIoY20sIGUpIHx8IGV2ZW50SW5XaWRnZXQoY20uZGlzcGxheSwgZSkpIHJldHVybjsKICAgICAgICBlX3ByZXZlbnREZWZhdWx0KGUpOwogICAgICAgIHZhciB3b3JkID0gZmluZFdvcmRBdChjbSwgcG9zKTsKICAgICAgICBleHRlbmRTZWxlY3Rpb24oY20uZG9jLCB3b3JkLmFuY2hvciwgd29yZC5oZWFkKTsKICAgICAgfSkpOwogICAgZWxzZQogICAgICBvbihkLnNjcm9sbGVyLCAiZGJsY2xpY2siLCBmdW5jdGlvbihlKSB7IHNpZ25hbERPTUV2ZW50KGNtLCBlKSB8fCBlX3ByZXZlbnREZWZhdWx0KGUpOyB9KTsKICAgIC8vIFByZXZlbnQgbm9ybWFsIHNlbGVjdGlvbiBpbiB0aGUgZWRpdG9yICh3ZSBoYW5kbGUgb3VyIG93bikKICAgIG9uKGQubGluZVNwYWNlLCAic2VsZWN0c3RhcnQiLCBmdW5jdGlvbihlKSB7CiAgICAgIGlmICghZXZlbnRJbldpZGdldChkLCBlKSkgZV9wcmV2ZW50RGVmYXVsdChlKTsKICAgIH0pOwogICAgLy8gU29tZSBicm93c2VycyBmaXJlIGNvbnRleHRtZW51ICphZnRlciogb3BlbmluZyB0aGUgbWVudSwgYXQKICAgIC8vIHdoaWNoIHBvaW50IHdlIGNhbid0IG1lc3Mgd2l0aCBpdCBhbnltb3JlLiBDb250ZXh0IG1lbnUgaXMKICAgIC8vIGhhbmRsZWQgaW4gb25Nb3VzZURvd24gZm9yIHRoZXNlIGJyb3dzZXJzLgogICAgaWYgKCFjYXB0dXJlUmlnaHRDbGljaykgb24oZC5zY3JvbGxlciwgImNvbnRleHRtZW51IiwgZnVuY3Rpb24oZSkge29uQ29udGV4dE1lbnUoY20sIGUpO30pOwoKICAgIC8vIFN5bmMgc2Nyb2xsaW5nIGJldHdlZW4gZmFrZSBzY3JvbGxiYXJzIGFuZCByZWFsIHNjcm9sbGFibGUKICAgIC8vIGFyZWEsIGVuc3VyZSB2aWV3cG9ydCBpcyB1cGRhdGVkIHdoZW4gc2Nyb2xsaW5nLgogICAgb24oZC5zY3JvbGxlciwgInNjcm9sbCIsIGZ1bmN0aW9uKCkgewogICAgICBpZiAoZC5zY3JvbGxlci5jbGllbnRIZWlnaHQpIHsKICAgICAgICBzZXRTY3JvbGxUb3AoY20sIGQuc2Nyb2xsZXIuc2Nyb2xsVG9wKTsKICAgICAgICBzZXRTY3JvbGxMZWZ0KGNtLCBkLnNjcm9sbGVyLnNjcm9sbExlZnQsIHRydWUpOwogICAgICAgIHNpZ25hbChjbSwgInNjcm9sbCIsIGNtKTsKICAgICAgfQogICAgfSk7CiAgICBvbihkLnNjcm9sbGJhclYsICJzY3JvbGwiLCBmdW5jdGlvbigpIHsKICAgICAgaWYgKGQuc2Nyb2xsZXIuY2xpZW50SGVpZ2h0KSBzZXRTY3JvbGxUb3AoY20sIGQuc2Nyb2xsYmFyVi5zY3JvbGxUb3ApOwogICAgfSk7CiAgICBvbihkLnNjcm9sbGJhckgsICJzY3JvbGwiLCBmdW5jdGlvbigpIHsKICAgICAgaWYgKGQuc2Nyb2xsZXIuY2xpZW50SGVpZ2h0KSBzZXRTY3JvbGxMZWZ0KGNtLCBkLnNjcm9sbGJhckguc2Nyb2xsTGVmdCk7CiAgICB9KTsKCiAgICAvLyBMaXN0ZW4gdG8gd2hlZWwgZXZlbnRzIGluIG9yZGVyIHRvIHRyeSBhbmQgdXBkYXRlIHRoZSB2aWV3cG9ydCBvbiB0aW1lLgogICAgb24oZC5zY3JvbGxlciwgIm1vdXNld2hlZWwiLCBmdW5jdGlvbihlKXtvblNjcm9sbFdoZWVsKGNtLCBlKTt9KTsKICAgIG9uKGQuc2Nyb2xsZXIsICJET01Nb3VzZVNjcm9sbCIsIGZ1bmN0aW9uKGUpe29uU2Nyb2xsV2hlZWwoY20sIGUpO30pOwoKICAgIC8vIFByZXZlbnQgY2xpY2tzIGluIHRoZSBzY3JvbGxiYXJzIGZyb20ga2lsbGluZyBmb2N1cwogICAgZnVuY3Rpb24gcmVGb2N1cygpIHsgaWYgKGNtLnN0YXRlLmZvY3VzZWQpIHNldFRpbWVvdXQoYmluZChmb2N1c0lucHV0LCBjbSksIDApOyB9CiAgICBvbihkLnNjcm9sbGJhckgsICJtb3VzZWRvd24iLCByZUZvY3VzKTsKICAgIG9uKGQuc2Nyb2xsYmFyViwgIm1vdXNlZG93biIsIHJlRm9jdXMpOwogICAgLy8gUHJldmVudCB3cmFwcGVyIGZyb20gZXZlciBzY3JvbGxpbmcKICAgIG9uKGQud3JhcHBlciwgInNjcm9sbCIsIGZ1bmN0aW9uKCkgeyBkLndyYXBwZXIuc2Nyb2xsVG9wID0gZC53cmFwcGVyLnNjcm9sbExlZnQgPSAwOyB9KTsKCiAgICBvbihkLmlucHV0LCAia2V5dXAiLCBmdW5jdGlvbihlKSB7IG9uS2V5VXAuY2FsbChjbSwgZSk7IH0pOwogICAgb24oZC5pbnB1dCwgImlucHV0IiwgZnVuY3Rpb24oKSB7CiAgICAgIGlmIChpZSAmJiBpZV92ZXJzaW9uID49IDkgJiYgY20uZGlzcGxheS5pbnB1dEhhc1NlbGVjdGlvbikgY20uZGlzcGxheS5pbnB1dEhhc1NlbGVjdGlvbiA9IG51bGw7CiAgICAgIGZhc3RQb2xsKGNtKTsKICAgIH0pOwogICAgb24oZC5pbnB1dCwgImtleWRvd24iLCBvcGVyYXRpb24oY20sIG9uS2V5RG93bikpOwogICAgb24oZC5pbnB1dCwgImtleXByZXNzIiwgb3BlcmF0aW9uKGNtLCBvbktleVByZXNzKSk7CiAgICBvbihkLmlucHV0LCAiZm9jdXMiLCBiaW5kKG9uRm9jdXMsIGNtKSk7CiAgICBvbihkLmlucHV0LCAiYmx1ciIsIGJpbmQob25CbHVyLCBjbSkpOwoKICAgIGZ1bmN0aW9uIGRyYWdfKGUpIHsKICAgICAgaWYgKCFzaWduYWxET01FdmVudChjbSwgZSkpIGVfc3RvcChlKTsKICAgIH0KICAgIGlmIChjbS5vcHRpb25zLmRyYWdEcm9wKSB7CiAgICAgIG9uKGQuc2Nyb2xsZXIsICJkcmFnc3RhcnQiLCBmdW5jdGlvbihlKXtvbkRyYWdTdGFydChjbSwgZSk7fSk7CiAgICAgIG9uKGQuc2Nyb2xsZXIsICJkcmFnZW50ZXIiLCBkcmFnXyk7CiAgICAgIG9uKGQuc2Nyb2xsZXIsICJkcmFnb3ZlciIsIGRyYWdfKTsKICAgICAgb24oZC5zY3JvbGxlciwgImRyb3AiLCBvcGVyYXRpb24oY20sIG9uRHJvcCkpOwogICAgfQogICAgb24oZC5zY3JvbGxlciwgInBhc3RlIiwgZnVuY3Rpb24oZSkgewogICAgICBpZiAoZXZlbnRJbldpZGdldChkLCBlKSkgcmV0dXJuOwogICAgICBjbS5zdGF0ZS5wYXN0ZUluY29taW5nID0gdHJ1ZTsKICAgICAgZm9jdXNJbnB1dChjbSk7CiAgICAgIGZhc3RQb2xsKGNtKTsKICAgIH0pOwogICAgb24oZC5pbnB1dCwgInBhc3RlIiwgZnVuY3Rpb24oKSB7CiAgICAgIC8vIFdvcmthcm91bmQgZm9yIHdlYmtpdCBidWcgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTkwMjA2CiAgICAgIC8vIEFkZCBhIGNoYXIgdG8gdGhlIGVuZCBvZiB0ZXh0YXJlYSBiZWZvcmUgcGFzdGUgb2NjdXIgc28gdGhhdAogICAgICAvLyBzZWxlY3Rpb24gZG9lc24ndCBzcGFuIHRvIHRoZSBlbmQgb2YgdGV4dGFyZWEuCiAgICAgIGlmICh3ZWJraXQgJiYgIWNtLnN0YXRlLmZha2VkTGFzdENoYXIgJiYgIShuZXcgRGF0ZSAtIGNtLnN0YXRlLmxhc3RNaWRkbGVEb3duIDwgMjAwKSkgewogICAgICAgIHZhciBzdGFydCA9IGQuaW5wdXQuc2VsZWN0aW9uU3RhcnQsIGVuZCA9IGQuaW5wdXQuc2VsZWN0aW9uRW5kOwogICAgICAgIGQuaW5wdXQudmFsdWUgKz0gIiQiOwogICAgICAgIC8vIFRoZSBzZWxlY3Rpb24gZW5kIG5lZWRzIHRvIGJlIHNldCBiZWZvcmUgdGhlIHN0YXJ0LCBvdGhlcndpc2UgdGhlcmUKICAgICAgICAvLyBjYW4gYmUgYW4gaW50ZXJtZWRpYXRlIG5vbi1lbXB0eSBzZWxlY3Rpb24gYmV0d2VlbiB0aGUgdHdvLCB3aGljaAogICAgICAgIC8vIGNhbiBvdmVycmlkZSB0aGUgbWlkZGxlLWNsaWNrIHBhc3RlIGJ1ZmZlciBvbiBsaW51eCBhbmQgY2F1c2UgdGhlCiAgICAgICAgLy8gd3JvbmcgdGhpbmcgdG8gZ2V0IHBhc3RlZC4KICAgICAgICBkLmlucHV0LnNlbGVjdGlvbkVuZCA9IGVuZDsKICAgICAgICBkLmlucHV0LnNlbGVjdGlvblN0YXJ0ID0gc3RhcnQ7CiAgICAgICAgY20uc3RhdGUuZmFrZWRMYXN0Q2hhciA9IHRydWU7CiAgICAgIH0KICAgICAgY20uc3RhdGUucGFzdGVJbmNvbWluZyA9IHRydWU7CiAgICAgIGZhc3RQb2xsKGNtKTsKICAgIH0pOwoKICAgIGZ1bmN0aW9uIHByZXBhcmVDb3B5Q3V0KGUpIHsKICAgICAgaWYgKGNtLnNvbWV0aGluZ1NlbGVjdGVkKCkpIHsKICAgICAgICBsYXN0Q29waWVkID0gY20uZ2V0U2VsZWN0aW9ucygpOwogICAgICAgIGlmIChkLmluYWNjdXJhdGVTZWxlY3Rpb24pIHsKICAgICAgICAgIGQucHJldklucHV0ID0gIiI7CiAgICAgICAgICBkLmluYWNjdXJhdGVTZWxlY3Rpb24gPSBmYWxzZTsKICAgICAgICAgIGQuaW5wdXQudmFsdWUgPSBsYXN0Q29waWVkLmpvaW4oIlxuIik7CiAgICAgICAgICBzZWxlY3RJbnB1dChkLmlucHV0KTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIHRleHQgPSBbXSwgcmFuZ2VzID0gW107CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbS5kb2Muc2VsLnJhbmdlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgdmFyIGxpbmUgPSBjbS5kb2Muc2VsLnJhbmdlc1tpXS5oZWFkLmxpbmU7CiAgICAgICAgICB2YXIgbGluZVJhbmdlID0ge2FuY2hvcjogUG9zKGxpbmUsIDApLCBoZWFkOiBQb3MobGluZSArIDEsIDApfTsKICAgICAgICAgIHJhbmdlcy5wdXNoKGxpbmVSYW5nZSk7CiAgICAgICAgICB0ZXh0LnB1c2goY20uZ2V0UmFuZ2UobGluZVJhbmdlLmFuY2hvciwgbGluZVJhbmdlLmhlYWQpKTsKICAgICAgICB9CiAgICAgICAgaWYgKGUudHlwZSA9PSAiY3V0IikgewogICAgICAgICAgY20uc2V0U2VsZWN0aW9ucyhyYW5nZXMsIG51bGwsIHNlbF9kb250U2Nyb2xsKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZC5wcmV2SW5wdXQgPSAiIjsKICAgICAgICAgIGQuaW5wdXQudmFsdWUgPSB0ZXh0LmpvaW4oIlxuIik7CiAgICAgICAgICBzZWxlY3RJbnB1dChkLmlucHV0KTsKICAgICAgICB9CiAgICAgICAgbGFzdENvcGllZCA9IHRleHQ7CiAgICAgIH0KICAgICAgaWYgKGUudHlwZSA9PSAiY3V0IikgY20uc3RhdGUuY3V0SW5jb21pbmcgPSB0cnVlOwogICAgfQogICAgb24oZC5pbnB1dCwgImN1dCIsIHByZXBhcmVDb3B5Q3V0KTsKICAgIG9uKGQuaW5wdXQsICJjb3B5IiwgcHJlcGFyZUNvcHlDdXQpOwoKICAgIC8vIE5lZWRlZCB0byBoYW5kbGUgVGFiIGtleSBpbiBLSFRNTAogICAgaWYgKGtodG1sKSBvbihkLnNpemVyLCAibW91c2V1cCIsIGZ1bmN0aW9uKCkgewogICAgICBpZiAoYWN0aXZlRWx0KCkgPT0gZC5pbnB1dCkgZC5pbnB1dC5ibHVyKCk7CiAgICAgIGZvY3VzSW5wdXQoY20pOwogICAgfSk7CiAgfQoKICAvLyBDYWxsZWQgd2hlbiB0aGUgd2luZG93IHJlc2l6ZXMKICBmdW5jdGlvbiBvblJlc2l6ZShjbSkgewogICAgLy8gTWlnaHQgYmUgYSB0ZXh0IHNjYWxpbmcgb3BlcmF0aW9uLCBjbGVhciBzaXplIGNhY2hlcy4KICAgIHZhciBkID0gY20uZGlzcGxheTsKICAgIGQuY2FjaGVkQ2hhcldpZHRoID0gZC5jYWNoZWRUZXh0SGVpZ2h0ID0gZC5jYWNoZWRQYWRkaW5nSCA9IG51bGw7CiAgICBjbS5zZXRTaXplKCk7CiAgfQoKICAvLyBNT1VTRSBFVkVOVFMKCiAgLy8gUmV0dXJuIHRydWUgd2hlbiB0aGUgZ2l2ZW4gbW91c2UgZXZlbnQgaGFwcGVuZWQgaW4gYSB3aWRnZXQKICBmdW5jdGlvbiBldmVudEluV2lkZ2V0KGRpc3BsYXksIGUpIHsKICAgIGZvciAodmFyIG4gPSBlX3RhcmdldChlKTsgbiAhPSBkaXNwbGF5LndyYXBwZXI7IG4gPSBuLnBhcmVudE5vZGUpIHsKICAgICAgaWYgKCFuIHx8IG4uaWdub3JlRXZlbnRzIHx8IG4ucGFyZW50Tm9kZSA9PSBkaXNwbGF5LnNpemVyICYmIG4gIT0gZGlzcGxheS5tb3ZlcikgcmV0dXJuIHRydWU7CiAgICB9CiAgfQoKICAvLyBHaXZlbiBhIG1vdXNlIGV2ZW50LCBmaW5kIHRoZSBjb3JyZXNwb25kaW5nIHBvc2l0aW9uLiBJZiBsaWJlcmFsCiAgLy8gaXMgZmFsc2UsIGl0IGNoZWNrcyB3aGV0aGVyIGEgZ3V0dGVyIG9yIHNjcm9sbGJhciB3YXMgY2xpY2tlZCwKICAvLyBhbmQgcmV0dXJucyBudWxsIGlmIGl0IHdhcy4gZm9yUmVjdCBpcyB1c2VkIGJ5IHJlY3Rhbmd1bGFyCiAgLy8gc2VsZWN0aW9ucywgYW5kIHRyaWVzIHRvIGVzdGltYXRlIGEgY2hhcmFjdGVyIHBvc2l0aW9uIGV2ZW4gZm9yCiAgLy8gY29vcmRpbmF0ZXMgYmV5b25kIHRoZSByaWdodCBvZiB0aGUgdGV4dC4KICBmdW5jdGlvbiBwb3NGcm9tTW91c2UoY20sIGUsIGxpYmVyYWwsIGZvclJlY3QpIHsKICAgIHZhciBkaXNwbGF5ID0gY20uZGlzcGxheTsKICAgIGlmICghbGliZXJhbCkgewogICAgICB2YXIgdGFyZ2V0ID0gZV90YXJnZXQoZSk7CiAgICAgIGlmICh0YXJnZXQgPT0gZGlzcGxheS5zY3JvbGxiYXJIIHx8IHRhcmdldCA9PSBkaXNwbGF5LnNjcm9sbGJhclYgfHwKICAgICAgICAgIHRhcmdldCA9PSBkaXNwbGF5LnNjcm9sbGJhckZpbGxlciB8fCB0YXJnZXQgPT0gZGlzcGxheS5ndXR0ZXJGaWxsZXIpIHJldHVybiBudWxsOwogICAgfQogICAgdmFyIHgsIHksIHNwYWNlID0gZGlzcGxheS5saW5lU3BhY2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAvLyBGYWlscyB1bnByZWRpY3RhYmx5IG9uIElFWzY3XSB3aGVuIG1vdXNlIGlzIGRyYWdnZWQgYXJvdW5kIHF1aWNrbHkuCiAgICB0cnkgeyB4ID0gZS5jbGllbnRYIC0gc3BhY2UubGVmdDsgeSA9IGUuY2xpZW50WSAtIHNwYWNlLnRvcDsgfQogICAgY2F0Y2ggKGUpIHsgcmV0dXJuIG51bGw7IH0KICAgIHZhciBjb29yZHMgPSBjb29yZHNDaGFyKGNtLCB4LCB5KSwgbGluZTsKICAgIGlmIChmb3JSZWN0ICYmIGNvb3Jkcy54UmVsID09IDEgJiYgKGxpbmUgPSBnZXRMaW5lKGNtLmRvYywgY29vcmRzLmxpbmUpLnRleHQpLmxlbmd0aCA9PSBjb29yZHMuY2gpIHsKICAgICAgdmFyIGNvbERpZmYgPSBjb3VudENvbHVtbihsaW5lLCBsaW5lLmxlbmd0aCwgY20ub3B0aW9ucy50YWJTaXplKSAtIGxpbmUubGVuZ3RoOwogICAgICBjb29yZHMgPSBQb3MoY29vcmRzLmxpbmUsIE1hdGgubWF4KDAsIE1hdGgucm91bmQoKHggLSBwYWRkaW5nSChjbS5kaXNwbGF5KS5sZWZ0KSAvIGNoYXJXaWR0aChjbS5kaXNwbGF5KSkgLSBjb2xEaWZmKSk7CiAgICB9CiAgICByZXR1cm4gY29vcmRzOwogIH0KCiAgLy8gQSBtb3VzZSBkb3duIGNhbiBiZSBhIHNpbmdsZSBjbGljaywgZG91YmxlIGNsaWNrLCB0cmlwbGUgY2xpY2ssCiAgLy8gc3RhcnQgb2Ygc2VsZWN0aW9uIGRyYWcsIHN0YXJ0IG9mIHRleHQgZHJhZywgbmV3IGN1cnNvcgogIC8vIChjdHJsLWNsaWNrKSwgcmVjdGFuZ2xlIGRyYWcgKGFsdC1kcmFnKSwgb3IgeHdpbgogIC8vIG1pZGRsZS1jbGljay1wYXN0ZS4gT3IgaXQgbWlnaHQgYmUgYSBjbGljayBvbiBzb21ldGhpbmcgd2Ugc2hvdWxkCiAgLy8gbm90IGludGVyZmVyZSB3aXRoLCBzdWNoIGFzIGEgc2Nyb2xsYmFyIG9yIHdpZGdldC4KICBmdW5jdGlvbiBvbk1vdXNlRG93bihlKSB7CiAgICBpZiAoc2lnbmFsRE9NRXZlbnQodGhpcywgZSkpIHJldHVybjsKICAgIHZhciBjbSA9IHRoaXMsIGRpc3BsYXkgPSBjbS5kaXNwbGF5OwogICAgZGlzcGxheS5zaGlmdCA9IGUuc2hpZnRLZXk7CgogICAgaWYgKGV2ZW50SW5XaWRnZXQoZGlzcGxheSwgZSkpIHsKICAgICAgaWYgKCF3ZWJraXQpIHsKICAgICAgICAvLyBCcmllZmx5IHR1cm4gb2ZmIGRyYWdnYWJpbGl0eSwgdG8gYWxsb3cgd2lkZ2V0cyB0byBkbwogICAgICAgIC8vIG5vcm1hbCBkcmFnZ2luZyB0aGluZ3MuCiAgICAgICAgZGlzcGxheS5zY3JvbGxlci5kcmFnZ2FibGUgPSBmYWxzZTsKICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZGlzcGxheS5zY3JvbGxlci5kcmFnZ2FibGUgPSB0cnVlO30sIDEwMCk7CiAgICAgIH0KICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKGNsaWNrSW5HdXR0ZXIoY20sIGUpKSByZXR1cm47CiAgICB2YXIgc3RhcnQgPSBwb3NGcm9tTW91c2UoY20sIGUpOwogICAgd2luZG93LmZvY3VzKCk7CgogICAgc3dpdGNoIChlX2J1dHRvbihlKSkgewogICAgY2FzZSAxOgogICAgICBpZiAoc3RhcnQpCiAgICAgICAgbGVmdEJ1dHRvbkRvd24oY20sIGUsIHN0YXJ0KTsKICAgICAgZWxzZSBpZiAoZV90YXJnZXQoZSkgPT0gZGlzcGxheS5zY3JvbGxlcikKICAgICAgICBlX3ByZXZlbnREZWZhdWx0KGUpOwogICAgICBicmVhazsKICAgIGNhc2UgMjoKICAgICAgaWYgKHdlYmtpdCkgY20uc3RhdGUubGFzdE1pZGRsZURvd24gPSArbmV3IERhdGU7CiAgICAgIGlmIChzdGFydCkgZXh0ZW5kU2VsZWN0aW9uKGNtLmRvYywgc3RhcnQpOwogICAgICBzZXRUaW1lb3V0KGJpbmQoZm9jdXNJbnB1dCwgY20pLCAyMCk7CiAgICAgIGVfcHJldmVudERlZmF1bHQoZSk7CiAgICAgIGJyZWFrOwogICAgY2FzZSAzOgogICAgICBpZiAoY2FwdHVyZVJpZ2h0Q2xpY2spIG9uQ29udGV4dE1lbnUoY20sIGUpOwogICAgICBicmVhazsKICAgIH0KICB9CgogIHZhciBsYXN0Q2xpY2ssIGxhc3REb3VibGVDbGljazsKICBmdW5jdGlvbiBsZWZ0QnV0dG9uRG93bihjbSwgZSwgc3RhcnQpIHsKICAgIHNldFRpbWVvdXQoYmluZChlbnN1cmVGb2N1cywgY20pLCAwKTsKCiAgICB2YXIgbm93ID0gK25ldyBEYXRlLCB0eXBlOwogICAgaWYgKGxhc3REb3VibGVDbGljayAmJiBsYXN0RG91YmxlQ2xpY2sudGltZSA+IG5vdyAtIDQwMCAmJiBjbXAobGFzdERvdWJsZUNsaWNrLnBvcywgc3RhcnQpID09IDApIHsKICAgICAgdHlwZSA9ICJ0cmlwbGUiOwogICAgfSBlbHNlIGlmIChsYXN0Q2xpY2sgJiYgbGFzdENsaWNrLnRpbWUgPiBub3cgLSA0MDAgJiYgY21wKGxhc3RDbGljay5wb3MsIHN0YXJ0KSA9PSAwKSB7CiAgICAgIHR5cGUgPSAiZG91YmxlIjsKICAgICAgbGFzdERvdWJsZUNsaWNrID0ge3RpbWU6IG5vdywgcG9zOiBzdGFydH07CiAgICB9IGVsc2UgewogICAgICB0eXBlID0gInNpbmdsZSI7CiAgICAgIGxhc3RDbGljayA9IHt0aW1lOiBub3csIHBvczogc3RhcnR9OwogICAgfQoKICAgIHZhciBzZWwgPSBjbS5kb2Muc2VsLCBtb2RpZmllciA9IG1hYyA/IGUubWV0YUtleSA6IGUuY3RybEtleTsKICAgIGlmIChjbS5vcHRpb25zLmRyYWdEcm9wICYmIGRyYWdBbmREcm9wICYmICFpc1JlYWRPbmx5KGNtKSAmJgogICAgICAgIHR5cGUgPT0gInNpbmdsZSIgJiYgc2VsLmNvbnRhaW5zKHN0YXJ0KSA+IC0xICYmIHNlbC5zb21ldGhpbmdTZWxlY3RlZCgpKQogICAgICBsZWZ0QnV0dG9uU3RhcnREcmFnKGNtLCBlLCBzdGFydCwgbW9kaWZpZXIpOwogICAgZWxzZQogICAgICBsZWZ0QnV0dG9uU2VsZWN0KGNtLCBlLCBzdGFydCwgdHlwZSwgbW9kaWZpZXIpOwogIH0KCiAgLy8gU3RhcnQgYSB0ZXh0IGRyYWcuIFdoZW4gaXQgZW5kcywgc2VlIGlmIGFueSBkcmFnZ2luZyBhY3R1YWxseQogIC8vIGhhcHBlbiwgYW5kIHRyZWF0IGFzIGEgY2xpY2sgaWYgaXQgZGlkbid0LgogIGZ1bmN0aW9uIGxlZnRCdXR0b25TdGFydERyYWcoY20sIGUsIHN0YXJ0LCBtb2RpZmllcikgewogICAgdmFyIGRpc3BsYXkgPSBjbS5kaXNwbGF5OwogICAgdmFyIGRyYWdFbmQgPSBvcGVyYXRpb24oY20sIGZ1bmN0aW9uKGUyKSB7CiAgICAgIGlmICh3ZWJraXQpIGRpc3BsYXkuc2Nyb2xsZXIuZHJhZ2dhYmxlID0gZmFsc2U7CiAgICAgIGNtLnN0YXRlLmRyYWdnaW5nVGV4dCA9IGZhbHNlOwogICAgICBvZmYoZG9jdW1lbnQsICJtb3VzZXVwIiwgZHJhZ0VuZCk7CiAgICAgIG9mZihkaXNwbGF5LnNjcm9sbGVyLCAiZHJvcCIsIGRyYWdFbmQpOwogICAgICBpZiAoTWF0aC5hYnMoZS5jbGllbnRYIC0gZTIuY2xpZW50WCkgKyBNYXRoLmFicyhlLmNsaWVudFkgLSBlMi5jbGllbnRZKSA8IDEwKSB7CiAgICAgICAgZV9wcmV2ZW50RGVmYXVsdChlMik7CiAgICAgICAgaWYgKCFtb2RpZmllcikKICAgICAgICAgIGV4dGVuZFNlbGVjdGlvbihjbS5kb2MsIHN0YXJ0KTsKICAgICAgICBmb2N1c0lucHV0KGNtKTsKICAgICAgICAvLyBXb3JrIGFyb3VuZCB1bmV4cGxhaW5hYmxlIGZvY3VzIHByb2JsZW0gaW4gSUU5ICgjMjEyNykKICAgICAgICBpZiAoaWUgJiYgaWVfdmVyc2lvbiA9PSA5KQogICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHtkb2N1bWVudC5ib2R5LmZvY3VzKCk7IGZvY3VzSW5wdXQoY20pO30sIDIwKTsKICAgICAgfQogICAgfSk7CiAgICAvLyBMZXQgdGhlIGRyYWcgaGFuZGxlciBoYW5kbGUgdGhpcy4KICAgIGlmICh3ZWJraXQpIGRpc3BsYXkuc2Nyb2xsZXIuZHJhZ2dhYmxlID0gdHJ1ZTsKICAgIGNtLnN0YXRlLmRyYWdnaW5nVGV4dCA9IGRyYWdFbmQ7CiAgICAvLyBJRSdzIGFwcHJvYWNoIHRvIGRyYWdnYWJsZQogICAgaWYgKGRpc3BsYXkuc2Nyb2xsZXIuZHJhZ0Ryb3ApIGRpc3BsYXkuc2Nyb2xsZXIuZHJhZ0Ryb3AoKTsKICAgIG9uKGRvY3VtZW50LCAibW91c2V1cCIsIGRyYWdFbmQpOwogICAgb24oZGlzcGxheS5zY3JvbGxlciwgImRyb3AiLCBkcmFnRW5kKTsKICB9CgogIC8vIE5vcm1hbCBzZWxlY3Rpb24sIGFzIG9wcG9zZWQgdG8gdGV4dCBkcmFnZ2luZy4KICBmdW5jdGlvbiBsZWZ0QnV0dG9uU2VsZWN0KGNtLCBlLCBzdGFydCwgdHlwZSwgYWRkTmV3KSB7CiAgICB2YXIgZGlzcGxheSA9IGNtLmRpc3BsYXksIGRvYyA9IGNtLmRvYzsKICAgIGVfcHJldmVudERlZmF1bHQoZSk7CgogICAgdmFyIG91clJhbmdlLCBvdXJJbmRleCwgc3RhcnRTZWwgPSBkb2Muc2VsOwogICAgaWYgKGFkZE5ldyAmJiAhZS5zaGlmdEtleSkgewogICAgICBvdXJJbmRleCA9IGRvYy5zZWwuY29udGFpbnMoc3RhcnQpOwogICAgICBpZiAob3VySW5kZXggPiAtMSkKICAgICAgICBvdXJSYW5nZSA9IGRvYy5zZWwucmFuZ2VzW291ckluZGV4XTsKICAgICAgZWxzZQogICAgICAgIG91clJhbmdlID0gbmV3IFJhbmdlKHN0YXJ0LCBzdGFydCk7CiAgICB9IGVsc2UgewogICAgICBvdXJSYW5nZSA9IGRvYy5zZWwucHJpbWFyeSgpOwogICAgfQoKICAgIGlmIChlLmFsdEtleSkgewogICAgICB0eXBlID0gInJlY3QiOwogICAgICBpZiAoIWFkZE5ldykgb3VyUmFuZ2UgPSBuZXcgUmFuZ2Uoc3RhcnQsIHN0YXJ0KTsKICAgICAgc3RhcnQgPSBwb3NGcm9tTW91c2UoY20sIGUsIHRydWUsIHRydWUpOwogICAgICBvdXJJbmRleCA9IC0xOwogICAgfSBlbHNlIGlmICh0eXBlID09ICJkb3VibGUiKSB7CiAgICAgIHZhciB3b3JkID0gZmluZFdvcmRBdChjbSwgc3RhcnQpOwogICAgICBpZiAoY20uZGlzcGxheS5zaGlmdCB8fCBkb2MuZXh0ZW5kKQogICAgICAgIG91clJhbmdlID0gZXh0ZW5kUmFuZ2UoZG9jLCBvdXJSYW5nZSwgd29yZC5hbmNob3IsIHdvcmQuaGVhZCk7CiAgICAgIGVsc2UKICAgICAgICBvdXJSYW5nZSA9IHdvcmQ7CiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gInRyaXBsZSIpIHsKICAgICAgdmFyIGxpbmUgPSBuZXcgUmFuZ2UoUG9zKHN0YXJ0LmxpbmUsIDApLCBjbGlwUG9zKGRvYywgUG9zKHN0YXJ0LmxpbmUgKyAxLCAwKSkpOwogICAgICBpZiAoY20uZGlzcGxheS5zaGlmdCB8fCBkb2MuZXh0ZW5kKQogICAgICAgIG91clJhbmdlID0gZXh0ZW5kUmFuZ2UoZG9jLCBvdXJSYW5nZSwgbGluZS5hbmNob3IsIGxpbmUuaGVhZCk7CiAgICAgIGVsc2UKICAgICAgICBvdXJSYW5nZSA9IGxpbmU7CiAgICB9IGVsc2UgewogICAgICBvdXJSYW5nZSA9IGV4dGVuZFJhbmdlKGRvYywgb3VyUmFuZ2UsIHN0YXJ0KTsKICAgIH0KCiAgICBpZiAoIWFkZE5ldykgewogICAgICBvdXJJbmRleCA9IDA7CiAgICAgIHNldFNlbGVjdGlvbihkb2MsIG5ldyBTZWxlY3Rpb24oW291clJhbmdlXSwgMCksIHNlbF9tb3VzZSk7CiAgICAgIHN0YXJ0U2VsID0gZG9jLnNlbDsKICAgIH0gZWxzZSBpZiAob3VySW5kZXggPiAtMSkgewogICAgICByZXBsYWNlT25lU2VsZWN0aW9uKGRvYywgb3VySW5kZXgsIG91clJhbmdlLCBzZWxfbW91c2UpOwogICAgfSBlbHNlIHsKICAgICAgb3VySW5kZXggPSBkb2Muc2VsLnJhbmdlcy5sZW5ndGg7CiAgICAgIHNldFNlbGVjdGlvbihkb2MsIG5vcm1hbGl6ZVNlbGVjdGlvbihkb2Muc2VsLnJhbmdlcy5jb25jYXQoW291clJhbmdlXSksIG91ckluZGV4KSwKICAgICAgICAgICAgICAgICAgIHtzY3JvbGw6IGZhbHNlLCBvcmlnaW46ICIqbW91c2UifSk7CiAgICB9CgogICAgdmFyIGxhc3RQb3MgPSBzdGFydDsKICAgIGZ1bmN0aW9uIGV4dGVuZFRvKHBvcykgewogICAgICBpZiAoY21wKGxhc3RQb3MsIHBvcykgPT0gMCkgcmV0dXJuOwogICAgICBsYXN0UG9zID0gcG9zOwoKICAgICAgaWYgKHR5cGUgPT0gInJlY3QiKSB7CiAgICAgICAgdmFyIHJhbmdlcyA9IFtdLCB0YWJTaXplID0gY20ub3B0aW9ucy50YWJTaXplOwogICAgICAgIHZhciBzdGFydENvbCA9IGNvdW50Q29sdW1uKGdldExpbmUoZG9jLCBzdGFydC5saW5lKS50ZXh0LCBzdGFydC5jaCwgdGFiU2l6ZSk7CiAgICAgICAgdmFyIHBvc0NvbCA9IGNvdW50Q29sdW1uKGdldExpbmUoZG9jLCBwb3MubGluZSkudGV4dCwgcG9zLmNoLCB0YWJTaXplKTsKICAgICAgICB2YXIgbGVmdCA9IE1hdGgubWluKHN0YXJ0Q29sLCBwb3NDb2wpLCByaWdodCA9IE1hdGgubWF4KHN0YXJ0Q29sLCBwb3NDb2wpOwogICAgICAgIGZvciAodmFyIGxpbmUgPSBNYXRoLm1pbihzdGFydC5saW5lLCBwb3MubGluZSksIGVuZCA9IE1hdGgubWluKGNtLmxhc3RMaW5lKCksIE1hdGgubWF4KHN0YXJ0LmxpbmUsIHBvcy5saW5lKSk7CiAgICAgICAgICAgICBsaW5lIDw9IGVuZDsgbGluZSsrKSB7CiAgICAgICAgICB2YXIgdGV4dCA9IGdldExpbmUoZG9jLCBsaW5lKS50ZXh0LCBsZWZ0UG9zID0gZmluZENvbHVtbih0ZXh0LCBsZWZ0LCB0YWJTaXplKTsKICAgICAgICAgIGlmIChsZWZ0ID09IHJpZ2h0KQogICAgICAgICAgICByYW5nZXMucHVzaChuZXcgUmFuZ2UoUG9zKGxpbmUsIGxlZnRQb3MpLCBQb3MobGluZSwgbGVmdFBvcykpKTsKICAgICAgICAgIGVsc2UgaWYgKHRleHQubGVuZ3RoID4gbGVmdFBvcykKICAgICAgICAgICAgcmFuZ2VzLnB1c2gobmV3IFJhbmdlKFBvcyhsaW5lLCBsZWZ0UG9zKSwgUG9zKGxpbmUsIGZpbmRDb2x1bW4odGV4dCwgcmlnaHQsIHRhYlNpemUpKSkpOwogICAgICAgIH0KICAgICAgICBpZiAoIXJhbmdlcy5sZW5ndGgpIHJhbmdlcy5wdXNoKG5ldyBSYW5nZShzdGFydCwgc3RhcnQpKTsKICAgICAgICBzZXRTZWxlY3Rpb24oZG9jLCBub3JtYWxpemVTZWxlY3Rpb24oc3RhcnRTZWwucmFuZ2VzLnNsaWNlKDAsIG91ckluZGV4KS5jb25jYXQocmFuZ2VzKSwgb3VySW5kZXgpLAogICAgICAgICAgICAgICAgICAgICB7b3JpZ2luOiAiKm1vdXNlIiwgc2Nyb2xsOiBmYWxzZX0pOwogICAgICAgIGNtLnNjcm9sbEludG9WaWV3KHBvcyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIG9sZFJhbmdlID0gb3VyUmFuZ2U7CiAgICAgICAgdmFyIGFuY2hvciA9IG9sZFJhbmdlLmFuY2hvciwgaGVhZCA9IHBvczsKICAgICAgICBpZiAodHlwZSAhPSAic2luZ2xlIikgewogICAgICAgICAgaWYgKHR5cGUgPT0gImRvdWJsZSIpCiAgICAgICAgICAgIHZhciByYW5nZSA9IGZpbmRXb3JkQXQoY20sIHBvcyk7CiAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHZhciByYW5nZSA9IG5ldyBSYW5nZShQb3MocG9zLmxpbmUsIDApLCBjbGlwUG9zKGRvYywgUG9zKHBvcy5saW5lICsgMSwgMCkpKTsKICAgICAgICAgIGlmIChjbXAocmFuZ2UuYW5jaG9yLCBhbmNob3IpID4gMCkgewogICAgICAgICAgICBoZWFkID0gcmFuZ2UuaGVhZDsKICAgICAgICAgICAgYW5jaG9yID0gbWluUG9zKG9sZFJhbmdlLmZyb20oKSwgcmFuZ2UuYW5jaG9yKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGhlYWQgPSByYW5nZS5hbmNob3I7CiAgICAgICAgICAgIGFuY2hvciA9IG1heFBvcyhvbGRSYW5nZS50bygpLCByYW5nZS5oZWFkKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdmFyIHJhbmdlcyA9IHN0YXJ0U2VsLnJhbmdlcy5zbGljZSgwKTsKICAgICAgICByYW5nZXNbb3VySW5kZXhdID0gbmV3IFJhbmdlKGNsaXBQb3MoZG9jLCBhbmNob3IpLCBoZWFkKTsKICAgICAgICBzZXRTZWxlY3Rpb24oZG9jLCBub3JtYWxpemVTZWxlY3Rpb24ocmFuZ2VzLCBvdXJJbmRleCksIHNlbF9tb3VzZSk7CiAgICAgIH0KICAgIH0KCiAgICB2YXIgZWRpdG9yU2l6ZSA9IGRpc3BsYXkud3JhcHBlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgIC8vIFVzZWQgdG8gZW5zdXJlIHRpbWVvdXQgcmUtdHJpZXMgZG9uJ3QgZmlyZSB3aGVuIGFub3RoZXIgZXh0ZW5kCiAgICAvLyBoYXBwZW5lZCBpbiB0aGUgbWVhbnRpbWUgKGNsZWFyVGltZW91dCBpc24ndCByZWxpYWJsZSAtLSBhdAogICAgLy8gbGVhc3Qgb24gQ2hyb21lLCB0aGUgdGltZW91dHMgc3RpbGwgaGFwcGVuIGV2ZW4gd2hlbiBjbGVhcmVkLAogICAgLy8gaWYgdGhlIGNsZWFyIGhhcHBlbnMgYWZ0ZXIgdGhlaXIgc2NoZWR1bGVkIGZpcmluZyB0aW1lKS4KICAgIHZhciBjb3VudGVyID0gMDsKCiAgICBmdW5jdGlvbiBleHRlbmQoZSkgewogICAgICB2YXIgY3VyQ291bnQgPSArK2NvdW50ZXI7CiAgICAgIHZhciBjdXIgPSBwb3NGcm9tTW91c2UoY20sIGUsIHRydWUsIHR5cGUgPT0gInJlY3QiKTsKICAgICAgaWYgKCFjdXIpIHJldHVybjsKICAgICAgaWYgKGNtcChjdXIsIGxhc3RQb3MpICE9IDApIHsKICAgICAgICBlbnN1cmVGb2N1cyhjbSk7CiAgICAgICAgZXh0ZW5kVG8oY3VyKTsKICAgICAgICB2YXIgdmlzaWJsZSA9IHZpc2libGVMaW5lcyhkaXNwbGF5LCBkb2MpOwogICAgICAgIGlmIChjdXIubGluZSA+PSB2aXNpYmxlLnRvIHx8IGN1ci5saW5lIDwgdmlzaWJsZS5mcm9tKQogICAgICAgICAgc2V0VGltZW91dChvcGVyYXRpb24oY20sIGZ1bmN0aW9uKCl7aWYgKGNvdW50ZXIgPT0gY3VyQ291bnQpIGV4dGVuZChlKTt9KSwgMTUwKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB2YXIgb3V0c2lkZSA9IGUuY2xpZW50WSA8IGVkaXRvclNpemUudG9wID8gLTIwIDogZS5jbGllbnRZID4gZWRpdG9yU2l6ZS5ib3R0b20gPyAyMCA6IDA7CiAgICAgICAgaWYgKG91dHNpZGUpIHNldFRpbWVvdXQob3BlcmF0aW9uKGNtLCBmdW5jdGlvbigpIHsKICAgICAgICAgIGlmIChjb3VudGVyICE9IGN1ckNvdW50KSByZXR1cm47CiAgICAgICAgICBkaXNwbGF5LnNjcm9sbGVyLnNjcm9sbFRvcCArPSBvdXRzaWRlOwogICAgICAgICAgZXh0ZW5kKGUpOwogICAgICAgIH0pLCA1MCk7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBkb25lKGUpIHsKICAgICAgY291bnRlciA9IEluZmluaXR5OwogICAgICBlX3ByZXZlbnREZWZhdWx0KGUpOwogICAgICBmb2N1c0lucHV0KGNtKTsKICAgICAgb2ZmKGRvY3VtZW50LCAibW91c2Vtb3ZlIiwgbW92ZSk7CiAgICAgIG9mZihkb2N1bWVudCwgIm1vdXNldXAiLCB1cCk7CiAgICAgIGRvYy5oaXN0b3J5Lmxhc3RTZWxPcmlnaW4gPSBudWxsOwogICAgfQoKICAgIHZhciBtb3ZlID0gb3BlcmF0aW9uKGNtLCBmdW5jdGlvbihlKSB7CiAgICAgIGlmICghZV9idXR0b24oZSkpIGRvbmUoZSk7CiAgICAgIGVsc2UgZXh0ZW5kKGUpOwogICAgfSk7CiAgICB2YXIgdXAgPSBvcGVyYXRpb24oY20sIGRvbmUpOwogICAgb24oZG9jdW1lbnQsICJtb3VzZW1vdmUiLCBtb3ZlKTsKICAgIG9uKGRvY3VtZW50LCAibW91c2V1cCIsIHVwKTsKICB9CgogIC8vIERldGVybWluZXMgd2hldGhlciBhbiBldmVudCBoYXBwZW5lZCBpbiB0aGUgZ3V0dGVyLCBhbmQgZmlyZXMgdGhlCiAgLy8gaGFuZGxlcnMgZm9yIHRoZSBjb3JyZXNwb25kaW5nIGV2ZW50LgogIGZ1bmN0aW9uIGd1dHRlckV2ZW50KGNtLCBlLCB0eXBlLCBwcmV2ZW50LCBzaWduYWxmbikgewogICAgdHJ5IHsgdmFyIG1YID0gZS5jbGllbnRYLCBtWSA9IGUuY2xpZW50WTsgfQogICAgY2F0Y2goZSkgeyByZXR1cm4gZmFsc2U7IH0KICAgIGlmIChtWCA+PSBNYXRoLmZsb29yKGNtLmRpc3BsYXkuZ3V0dGVycy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5yaWdodCkpIHJldHVybiBmYWxzZTsKICAgIGlmIChwcmV2ZW50KSBlX3ByZXZlbnREZWZhdWx0KGUpOwoKICAgIHZhciBkaXNwbGF5ID0gY20uZGlzcGxheTsKICAgIHZhciBsaW5lQm94ID0gZGlzcGxheS5saW5lRGl2LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwoKICAgIGlmIChtWSA+IGxpbmVCb3guYm90dG9tIHx8ICFoYXNIYW5kbGVyKGNtLCB0eXBlKSkgcmV0dXJuIGVfZGVmYXVsdFByZXZlbnRlZChlKTsKICAgIG1ZIC09IGxpbmVCb3gudG9wIC0gZGlzcGxheS52aWV3T2Zmc2V0OwoKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY20ub3B0aW9ucy5ndXR0ZXJzLmxlbmd0aDsgKytpKSB7CiAgICAgIHZhciBnID0gZGlzcGxheS5ndXR0ZXJzLmNoaWxkTm9kZXNbaV07CiAgICAgIGlmIChnICYmIGcuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkucmlnaHQgPj0gbVgpIHsKICAgICAgICB2YXIgbGluZSA9IGxpbmVBdEhlaWdodChjbS5kb2MsIG1ZKTsKICAgICAgICB2YXIgZ3V0dGVyID0gY20ub3B0aW9ucy5ndXR0ZXJzW2ldOwogICAgICAgIHNpZ25hbGZuKGNtLCB0eXBlLCBjbSwgbGluZSwgZ3V0dGVyLCBlKTsKICAgICAgICByZXR1cm4gZV9kZWZhdWx0UHJldmVudGVkKGUpOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBjbGlja0luR3V0dGVyKGNtLCBlKSB7CiAgICByZXR1cm4gZ3V0dGVyRXZlbnQoY20sIGUsICJndXR0ZXJDbGljayIsIHRydWUsIHNpZ25hbExhdGVyKTsKICB9CgogIC8vIEtsdWRnZSB0byB3b3JrIGFyb3VuZCBzdHJhbmdlIElFIGJlaGF2aW9yIHdoZXJlIGl0J2xsIHNvbWV0aW1lcwogIC8vIHJlLWZpcmUgYSBzZXJpZXMgb2YgZHJhZy1yZWxhdGVkIGV2ZW50cyByaWdodCBhZnRlciB0aGUgZHJvcCAoIzE1NTEpCiAgdmFyIGxhc3REcm9wID0gMDsKCiAgZnVuY3Rpb24gb25Ecm9wKGUpIHsKICAgIHZhciBjbSA9IHRoaXM7CiAgICBpZiAoc2lnbmFsRE9NRXZlbnQoY20sIGUpIHx8IGV2ZW50SW5XaWRnZXQoY20uZGlzcGxheSwgZSkpCiAgICAgIHJldHVybjsKICAgIGVfcHJldmVudERlZmF1bHQoZSk7CiAgICBpZiAoaWUpIGxhc3REcm9wID0gK25ldyBEYXRlOwogICAgdmFyIHBvcyA9IHBvc0Zyb21Nb3VzZShjbSwgZSwgdHJ1ZSksIGZpbGVzID0gZS5kYXRhVHJhbnNmZXIuZmlsZXM7CiAgICBpZiAoIXBvcyB8fCBpc1JlYWRPbmx5KGNtKSkgcmV0dXJuOwogICAgLy8gTWlnaHQgYmUgYSBmaWxlIGRyb3AsIGluIHdoaWNoIGNhc2Ugd2Ugc2ltcGx5IGV4dHJhY3QgdGhlIHRleHQKICAgIC8vIGFuZCBpbnNlcnQgaXQuCiAgICBpZiAoZmlsZXMgJiYgZmlsZXMubGVuZ3RoICYmIHdpbmRvdy5GaWxlUmVhZGVyICYmIHdpbmRvdy5GaWxlKSB7CiAgICAgIHZhciBuID0gZmlsZXMubGVuZ3RoLCB0ZXh0ID0gQXJyYXkobiksIHJlYWQgPSAwOwogICAgICB2YXIgbG9hZEZpbGUgPSBmdW5jdGlvbihmaWxlLCBpKSB7CiAgICAgICAgdmFyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyOwogICAgICAgIHJlYWRlci5vbmxvYWQgPSBvcGVyYXRpb24oY20sIGZ1bmN0aW9uKCkgewogICAgICAgICAgdGV4dFtpXSA9IHJlYWRlci5yZXN1bHQ7CiAgICAgICAgICBpZiAoKytyZWFkID09IG4pIHsKICAgICAgICAgICAgcG9zID0gY2xpcFBvcyhjbS5kb2MsIHBvcyk7CiAgICAgICAgICAgIHZhciBjaGFuZ2UgPSB7ZnJvbTogcG9zLCB0bzogcG9zLCB0ZXh0OiBzcGxpdExpbmVzKHRleHQuam9pbigiXG4iKSksIG9yaWdpbjogInBhc3RlIn07CiAgICAgICAgICAgIG1ha2VDaGFuZ2UoY20uZG9jLCBjaGFuZ2UpOwogICAgICAgICAgICBzZXRTZWxlY3Rpb25SZXBsYWNlSGlzdG9yeShjbS5kb2MsIHNpbXBsZVNlbGVjdGlvbihwb3MsIGNoYW5nZUVuZChjaGFuZ2UpKSk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgcmVhZGVyLnJlYWRBc1RleHQoZmlsZSk7CiAgICAgIH07CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgKytpKSBsb2FkRmlsZShmaWxlc1tpXSwgaSk7CiAgICB9IGVsc2UgeyAvLyBOb3JtYWwgZHJvcAogICAgICAvLyBEb24ndCBkbyBhIHJlcGxhY2UgaWYgdGhlIGRyb3AgaGFwcGVuZWQgaW5zaWRlIG9mIHRoZSBzZWxlY3RlZCB0ZXh0LgogICAgICBpZiAoY20uc3RhdGUuZHJhZ2dpbmdUZXh0ICYmIGNtLmRvYy5zZWwuY29udGFpbnMocG9zKSA+IC0xKSB7CiAgICAgICAgY20uc3RhdGUuZHJhZ2dpbmdUZXh0KGUpOwogICAgICAgIC8vIEVuc3VyZSB0aGUgZWRpdG9yIGlzIHJlLWZvY3VzZWQKICAgICAgICBzZXRUaW1lb3V0KGJpbmQoZm9jdXNJbnB1dCwgY20pLCAyMCk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHRyeSB7CiAgICAgICAgdmFyIHRleHQgPSBlLmRhdGFUcmFuc2Zlci5nZXREYXRhKCJUZXh0Iik7CiAgICAgICAgaWYgKHRleHQpIHsKICAgICAgICAgIGlmIChjbS5zdGF0ZS5kcmFnZ2luZ1RleHQgJiYgIShtYWMgPyBlLm1ldGFLZXkgOiBlLmN0cmxLZXkpKQogICAgICAgICAgICB2YXIgc2VsZWN0ZWQgPSBjbS5saXN0U2VsZWN0aW9ucygpOwogICAgICAgICAgc2V0U2VsZWN0aW9uTm9VbmRvKGNtLmRvYywgc2ltcGxlU2VsZWN0aW9uKHBvcywgcG9zKSk7CiAgICAgICAgICBpZiAoc2VsZWN0ZWQpIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZWN0ZWQubGVuZ3RoOyArK2kpCiAgICAgICAgICAgIHJlcGxhY2VSYW5nZShjbS5kb2MsICIiLCBzZWxlY3RlZFtpXS5hbmNob3IsIHNlbGVjdGVkW2ldLmhlYWQsICJkcmFnIik7CiAgICAgICAgICBjbS5yZXBsYWNlU2VsZWN0aW9uKHRleHQsICJhcm91bmQiLCAicGFzdGUiKTsKICAgICAgICAgIGZvY3VzSW5wdXQoY20pOwogICAgICAgIH0KICAgICAgfQogICAgICBjYXRjaChlKXt9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBvbkRyYWdTdGFydChjbSwgZSkgewogICAgaWYgKGllICYmICghY20uc3RhdGUuZHJhZ2dpbmdUZXh0IHx8ICtuZXcgRGF0ZSAtIGxhc3REcm9wIDwgMTAwKSkgeyBlX3N0b3AoZSk7IHJldHVybjsgfQogICAgaWYgKHNpZ25hbERPTUV2ZW50KGNtLCBlKSB8fCBldmVudEluV2lkZ2V0KGNtLmRpc3BsYXksIGUpKSByZXR1cm47CgogICAgZS5kYXRhVHJhbnNmZXIuc2V0RGF0YSgiVGV4dCIsIGNtLmdldFNlbGVjdGlvbigpKTsKCiAgICAvLyBVc2UgZHVtbXkgaW1hZ2UgaW5zdGVhZCBvZiBkZWZhdWx0IGJyb3dzZXJzIGltYWdlLgogICAgLy8gUmVjZW50IFNhZmFyaSAofjYuMC4yKSBoYXZlIGEgdGVuZGVuY3kgdG8gc2VnZmF1bHQgd2hlbiB0aGlzIGhhcHBlbnMsIHNvIHdlIGRvbid0IGRvIGl0IHRoZXJlLgogICAgaWYgKGUuZGF0YVRyYW5zZmVyLnNldERyYWdJbWFnZSAmJiAhc2FmYXJpKSB7CiAgICAgIHZhciBpbWcgPSBlbHQoImltZyIsIG51bGwsIG51bGwsICJwb3NpdGlvbjogZml4ZWQ7IGxlZnQ6IDA7IHRvcDogMDsiKTsKICAgICAgaW1nLnNyYyA9ICJkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhBUUFCQUFBQUFDSDVCQUVLQUFFQUxBQUFBQUFCQUFFQUFBSUNUQUVBT3c9PSI7CiAgICAgIGlmIChwcmVzdG8pIHsKICAgICAgICBpbWcud2lkdGggPSBpbWcuaGVpZ2h0ID0gMTsKICAgICAgICBjbS5kaXNwbGF5LndyYXBwZXIuYXBwZW5kQ2hpbGQoaW1nKTsKICAgICAgICAvLyBGb3JjZSBhIHJlbGF5b3V0LCBvciBPcGVyYSB3b24ndCB1c2Ugb3VyIGltYWdlIGZvciBzb21lIG9ic2N1cmUgcmVhc29uCiAgICAgICAgaW1nLl90b3AgPSBpbWcub2Zmc2V0VG9wOwogICAgICB9CiAgICAgIGUuZGF0YVRyYW5zZmVyLnNldERyYWdJbWFnZShpbWcsIDAsIDApOwogICAgICBpZiAocHJlc3RvKSBpbWcucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChpbWcpOwogICAgfQogIH0KCiAgLy8gU0NST0xMIEVWRU5UUwoKICAvLyBTeW5jIHRoZSBzY3JvbGxhYmxlIGFyZWEgYW5kIHNjcm9sbGJhcnMsIGVuc3VyZSB0aGUgdmlld3BvcnQKICAvLyBjb3ZlcnMgdGhlIHZpc2libGUgYXJlYS4KICBmdW5jdGlvbiBzZXRTY3JvbGxUb3AoY20sIHZhbCkgewogICAgaWYgKE1hdGguYWJzKGNtLmRvYy5zY3JvbGxUb3AgLSB2YWwpIDwgMikgcmV0dXJuOwogICAgY20uZG9jLnNjcm9sbFRvcCA9IHZhbDsKICAgIGlmICghZ2Vja28pIHVwZGF0ZURpc3BsYXlTaW1wbGUoY20sIHt0b3A6IHZhbH0pOwogICAgaWYgKGNtLmRpc3BsYXkuc2Nyb2xsZXIuc2Nyb2xsVG9wICE9IHZhbCkgY20uZGlzcGxheS5zY3JvbGxlci5zY3JvbGxUb3AgPSB2YWw7CiAgICBpZiAoY20uZGlzcGxheS5zY3JvbGxiYXJWLnNjcm9sbFRvcCAhPSB2YWwpIGNtLmRpc3BsYXkuc2Nyb2xsYmFyVi5zY3JvbGxUb3AgPSB2YWw7CiAgICBpZiAoZ2Vja28pIHVwZGF0ZURpc3BsYXlTaW1wbGUoY20pOwogICAgc3RhcnRXb3JrZXIoY20sIDEwMCk7CiAgfQogIC8vIFN5bmMgc2Nyb2xsZXIgYW5kIHNjcm9sbGJhciwgZW5zdXJlIHRoZSBndXR0ZXIgZWxlbWVudHMgYXJlCiAgLy8gYWxpZ25lZC4KICBmdW5jdGlvbiBzZXRTY3JvbGxMZWZ0KGNtLCB2YWwsIGlzU2Nyb2xsZXIpIHsKICAgIGlmIChpc1Njcm9sbGVyID8gdmFsID09IGNtLmRvYy5zY3JvbGxMZWZ0IDogTWF0aC5hYnMoY20uZG9jLnNjcm9sbExlZnQgLSB2YWwpIDwgMikgcmV0dXJuOwogICAgdmFsID0gTWF0aC5taW4odmFsLCBjbS5kaXNwbGF5LnNjcm9sbGVyLnNjcm9sbFdpZHRoIC0gY20uZGlzcGxheS5zY3JvbGxlci5jbGllbnRXaWR0aCk7CiAgICBjbS5kb2Muc2Nyb2xsTGVmdCA9IHZhbDsKICAgIGFsaWduSG9yaXpvbnRhbGx5KGNtKTsKICAgIGlmIChjbS5kaXNwbGF5LnNjcm9sbGVyLnNjcm9sbExlZnQgIT0gdmFsKSBjbS5kaXNwbGF5LnNjcm9sbGVyLnNjcm9sbExlZnQgPSB2YWw7CiAgICBpZiAoY20uZGlzcGxheS5zY3JvbGxiYXJILnNjcm9sbExlZnQgIT0gdmFsKSBjbS5kaXNwbGF5LnNjcm9sbGJhckguc2Nyb2xsTGVmdCA9IHZhbDsKICB9CgogIC8vIFNpbmNlIHRoZSBkZWx0YSB2YWx1ZXMgcmVwb3J0ZWQgb24gbW91c2Ugd2hlZWwgZXZlbnRzIGFyZQogIC8vIHVuc3RhbmRhcmRpemVkIGJldHdlZW4gYnJvd3NlcnMgYW5kIGV2ZW4gYnJvd3NlciB2ZXJzaW9ucywgYW5kCiAgLy8gZ2VuZXJhbGx5IGhvcnJpYmx5IHVucHJlZGljdGFibGUsIHRoaXMgY29kZSBzdGFydHMgYnkgbWVhc3VyaW5nCiAgLy8gdGhlIHNjcm9sbCBlZmZlY3QgdGhhdCB0aGUgZmlyc3QgZmV3IG1vdXNlIHdoZWVsIGV2ZW50cyBoYXZlLAogIC8vIGFuZCwgZnJvbSB0aGF0LCBkZXRlY3RzIHRoZSB3YXkgaXQgY2FuIGNvbnZlcnQgZGVsdGFzIHRvIHBpeGVsCiAgLy8gb2Zmc2V0cyBhZnRlcndhcmRzLgogIC8vCiAgLy8gVGhlIHJlYXNvbiB3ZSB3YW50IHRvIGtub3cgdGhlIGFtb3VudCBhIHdoZWVsIGV2ZW50IHdpbGwgc2Nyb2xsCiAgLy8gaXMgdGhhdCBpdCBnaXZlcyB1cyBhIGNoYW5jZSB0byB1cGRhdGUgdGhlIGRpc3BsYXkgYmVmb3JlIHRoZQogIC8vIGFjdHVhbCBzY3JvbGxpbmcgaGFwcGVucywgcmVkdWNpbmcgZmxpY2tlcmluZy4KCiAgdmFyIHdoZWVsU2FtcGxlcyA9IDAsIHdoZWVsUGl4ZWxzUGVyVW5pdCA9IG51bGw7CiAgLy8gRmlsbCBpbiBhIGJyb3dzZXItZGV0ZWN0ZWQgc3RhcnRpbmcgdmFsdWUgb24gYnJvd3NlcnMgd2hlcmUgd2UKICAvLyBrbm93IG9uZS4gVGhlc2UgZG9uJ3QgaGF2ZSB0byBiZSBhY2N1cmF0ZSAtLSB0aGUgcmVzdWx0IG9mIHRoZW0KICAvLyBiZWluZyB3cm9uZyB3b3VsZCBqdXN0IGJlIGEgc2xpZ2h0IGZsaWNrZXIgb24gdGhlIGZpcnN0IHdoZWVsCiAgLy8gc2Nyb2xsIChpZiBpdCBpcyBsYXJnZSBlbm91Z2gpLgogIGlmIChpZSkgd2hlZWxQaXhlbHNQZXJVbml0ID0gLS41MzsKICBlbHNlIGlmIChnZWNrbykgd2hlZWxQaXhlbHNQZXJVbml0ID0gMTU7CiAgZWxzZSBpZiAoY2hyb21lKSB3aGVlbFBpeGVsc1BlclVuaXQgPSAtLjc7CiAgZWxzZSBpZiAoc2FmYXJpKSB3aGVlbFBpeGVsc1BlclVuaXQgPSAtMS8zOwoKICBmdW5jdGlvbiBvblNjcm9sbFdoZWVsKGNtLCBlKSB7CiAgICB2YXIgZHggPSBlLndoZWVsRGVsdGFYLCBkeSA9IGUud2hlZWxEZWx0YVk7CiAgICBpZiAoZHggPT0gbnVsbCAmJiBlLmRldGFpbCAmJiBlLmF4aXMgPT0gZS5IT1JJWk9OVEFMX0FYSVMpIGR4ID0gZS5kZXRhaWw7CiAgICBpZiAoZHkgPT0gbnVsbCAmJiBlLmRldGFpbCAmJiBlLmF4aXMgPT0gZS5WRVJUSUNBTF9BWElTKSBkeSA9IGUuZGV0YWlsOwogICAgZWxzZSBpZiAoZHkgPT0gbnVsbCkgZHkgPSBlLndoZWVsRGVsdGE7CgogICAgdmFyIGRpc3BsYXkgPSBjbS5kaXNwbGF5LCBzY3JvbGwgPSBkaXNwbGF5LnNjcm9sbGVyOwogICAgLy8gUXVpdCBpZiB0aGVyZSdzIG5vdGhpbmcgdG8gc2Nyb2xsIGhlcmUKICAgIGlmICghKGR4ICYmIHNjcm9sbC5zY3JvbGxXaWR0aCA+IHNjcm9sbC5jbGllbnRXaWR0aCB8fAogICAgICAgICAgZHkgJiYgc2Nyb2xsLnNjcm9sbEhlaWdodCA+IHNjcm9sbC5jbGllbnRIZWlnaHQpKSByZXR1cm47CgogICAgLy8gV2Via2l0IGJyb3dzZXJzIG9uIE9TIFggYWJvcnQgbW9tZW50dW0gc2Nyb2xscyB3aGVuIHRoZSB0YXJnZXQKICAgIC8vIG9mIHRoZSBzY3JvbGwgZXZlbnQgaXMgcmVtb3ZlZCBmcm9tIHRoZSBzY3JvbGxhYmxlIGVsZW1lbnQuCiAgICAvLyBUaGlzIGhhY2sgKHNlZSByZWxhdGVkIGNvZGUgaW4gcGF0Y2hEaXNwbGF5KSBtYWtlcyBzdXJlIHRoZQogICAgLy8gZWxlbWVudCBpcyBrZXB0IGFyb3VuZC4KICAgIGlmIChkeSAmJiBtYWMgJiYgd2Via2l0KSB7CiAgICAgIG91dGVyOiBmb3IgKHZhciBjdXIgPSBlLnRhcmdldCwgdmlldyA9IGRpc3BsYXkudmlldzsgY3VyICE9IHNjcm9sbDsgY3VyID0gY3VyLnBhcmVudE5vZGUpIHsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZpZXcubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGlmICh2aWV3W2ldLm5vZGUgPT0gY3VyKSB7CiAgICAgICAgICAgIGNtLmRpc3BsYXkuY3VycmVudFdoZWVsVGFyZ2V0ID0gY3VyOwogICAgICAgICAgICBicmVhayBvdXRlcjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvLyBPbiBzb21lIGJyb3dzZXJzLCBob3Jpem9udGFsIHNjcm9sbGluZyB3aWxsIGNhdXNlIHJlZHJhd3MgdG8KICAgIC8vIGhhcHBlbiBiZWZvcmUgdGhlIGd1dHRlciBoYXMgYmVlbiByZWFsaWduZWQsIGNhdXNpbmcgaXQgdG8KICAgIC8vIHdyaWdnbGUgYXJvdW5kIGluIGEgbW9zdCB1bnNlZW1seSB3YXkuIFdoZW4gd2UgaGF2ZSBhbgogICAgLy8gZXN0aW1hdGVkIHBpeGVscy9kZWx0YSB2YWx1ZSwgd2UganVzdCBoYW5kbGUgaG9yaXpvbnRhbAogICAgLy8gc2Nyb2xsaW5nIGVudGlyZWx5IGhlcmUuIEl0J2xsIGJlIHNsaWdodGx5IG9mZiBmcm9tIG5hdGl2ZSwgYnV0CiAgICAvLyBiZXR0ZXIgdGhhbiBnbGl0Y2hpbmcgb3V0LgogICAgaWYgKGR4ICYmICFnZWNrbyAmJiAhcHJlc3RvICYmIHdoZWVsUGl4ZWxzUGVyVW5pdCAhPSBudWxsKSB7CiAgICAgIGlmIChkeSkKICAgICAgICBzZXRTY3JvbGxUb3AoY20sIE1hdGgubWF4KDAsIE1hdGgubWluKHNjcm9sbC5zY3JvbGxUb3AgKyBkeSAqIHdoZWVsUGl4ZWxzUGVyVW5pdCwgc2Nyb2xsLnNjcm9sbEhlaWdodCAtIHNjcm9sbC5jbGllbnRIZWlnaHQpKSk7CiAgICAgIHNldFNjcm9sbExlZnQoY20sIE1hdGgubWF4KDAsIE1hdGgubWluKHNjcm9sbC5zY3JvbGxMZWZ0ICsgZHggKiB3aGVlbFBpeGVsc1BlclVuaXQsIHNjcm9sbC5zY3JvbGxXaWR0aCAtIHNjcm9sbC5jbGllbnRXaWR0aCkpKTsKICAgICAgZV9wcmV2ZW50RGVmYXVsdChlKTsKICAgICAgZGlzcGxheS53aGVlbFN0YXJ0WCA9IG51bGw7IC8vIEFib3J0IG1lYXN1cmVtZW50LCBpZiBpbiBwcm9ncmVzcwogICAgICByZXR1cm47CiAgICB9CgogICAgLy8gJ1Byb2plY3QnIHRoZSB2aXNpYmxlIHZpZXdwb3J0IHRvIGNvdmVyIHRoZSBhcmVhIHRoYXQgaXMgYmVpbmcKICAgIC8vIHNjcm9sbGVkIGludG8gdmlldyAoaWYgd2Uga25vdyBlbm91Z2ggdG8gZXN0aW1hdGUgaXQpLgogICAgaWYgKGR5ICYmIHdoZWVsUGl4ZWxzUGVyVW5pdCAhPSBudWxsKSB7CiAgICAgIHZhciBwaXhlbHMgPSBkeSAqIHdoZWVsUGl4ZWxzUGVyVW5pdDsKICAgICAgdmFyIHRvcCA9IGNtLmRvYy5zY3JvbGxUb3AsIGJvdCA9IHRvcCArIGRpc3BsYXkud3JhcHBlci5jbGllbnRIZWlnaHQ7CiAgICAgIGlmIChwaXhlbHMgPCAwKSB0b3AgPSBNYXRoLm1heCgwLCB0b3AgKyBwaXhlbHMgLSA1MCk7CiAgICAgIGVsc2UgYm90ID0gTWF0aC5taW4oY20uZG9jLmhlaWdodCwgYm90ICsgcGl4ZWxzICsgNTApOwogICAgICB1cGRhdGVEaXNwbGF5U2ltcGxlKGNtLCB7dG9wOiB0b3AsIGJvdHRvbTogYm90fSk7CiAgICB9CgogICAgaWYgKHdoZWVsU2FtcGxlcyA8IDIwKSB7CiAgICAgIGlmIChkaXNwbGF5LndoZWVsU3RhcnRYID09IG51bGwpIHsKICAgICAgICBkaXNwbGF5LndoZWVsU3RhcnRYID0gc2Nyb2xsLnNjcm9sbExlZnQ7IGRpc3BsYXkud2hlZWxTdGFydFkgPSBzY3JvbGwuc2Nyb2xsVG9wOwogICAgICAgIGRpc3BsYXkud2hlZWxEWCA9IGR4OyBkaXNwbGF5LndoZWVsRFkgPSBkeTsKICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgaWYgKGRpc3BsYXkud2hlZWxTdGFydFggPT0gbnVsbCkgcmV0dXJuOwogICAgICAgICAgdmFyIG1vdmVkWCA9IHNjcm9sbC5zY3JvbGxMZWZ0IC0gZGlzcGxheS53aGVlbFN0YXJ0WDsKICAgICAgICAgIHZhciBtb3ZlZFkgPSBzY3JvbGwuc2Nyb2xsVG9wIC0gZGlzcGxheS53aGVlbFN0YXJ0WTsKICAgICAgICAgIHZhciBzYW1wbGUgPSAobW92ZWRZICYmIGRpc3BsYXkud2hlZWxEWSAmJiBtb3ZlZFkgLyBkaXNwbGF5LndoZWVsRFkpIHx8CiAgICAgICAgICAgIChtb3ZlZFggJiYgZGlzcGxheS53aGVlbERYICYmIG1vdmVkWCAvIGRpc3BsYXkud2hlZWxEWCk7CiAgICAgICAgICBkaXNwbGF5LndoZWVsU3RhcnRYID0gZGlzcGxheS53aGVlbFN0YXJ0WSA9IG51bGw7CiAgICAgICAgICBpZiAoIXNhbXBsZSkgcmV0dXJuOwogICAgICAgICAgd2hlZWxQaXhlbHNQZXJVbml0ID0gKHdoZWVsUGl4ZWxzUGVyVW5pdCAqIHdoZWVsU2FtcGxlcyArIHNhbXBsZSkgLyAod2hlZWxTYW1wbGVzICsgMSk7CiAgICAgICAgICArK3doZWVsU2FtcGxlczsKICAgICAgICB9LCAyMDApOwogICAgICB9IGVsc2UgewogICAgICAgIGRpc3BsYXkud2hlZWxEWCArPSBkeDsgZGlzcGxheS53aGVlbERZICs9IGR5OwogICAgICB9CiAgICB9CiAgfQoKICAvLyBLRVkgRVZFTlRTCgogIC8vIFJ1biBhIGhhbmRsZXIgdGhhdCB3YXMgYm91bmQgdG8gYSBrZXkuCiAgZnVuY3Rpb24gZG9IYW5kbGVCaW5kaW5nKGNtLCBib3VuZCwgZHJvcFNoaWZ0KSB7CiAgICBpZiAodHlwZW9mIGJvdW5kID09ICJzdHJpbmciKSB7CiAgICAgIGJvdW5kID0gY29tbWFuZHNbYm91bmRdOwogICAgICBpZiAoIWJvdW5kKSByZXR1cm4gZmFsc2U7CiAgICB9CiAgICAvLyBFbnN1cmUgcHJldmlvdXMgaW5wdXQgaGFzIGJlZW4gcmVhZCwgc28gdGhhdCB0aGUgaGFuZGxlciBzZWVzIGEKICAgIC8vIGNvbnNpc3RlbnQgdmlldyBvZiB0aGUgZG9jdW1lbnQKICAgIGlmIChjbS5kaXNwbGF5LnBvbGxpbmdGYXN0ICYmIHJlYWRJbnB1dChjbSkpIGNtLmRpc3BsYXkucG9sbGluZ0Zhc3QgPSBmYWxzZTsKICAgIHZhciBwcmV2U2hpZnQgPSBjbS5kaXNwbGF5LnNoaWZ0LCBkb25lID0gZmFsc2U7CiAgICB0cnkgewogICAgICBpZiAoaXNSZWFkT25seShjbSkpIGNtLnN0YXRlLnN1cHByZXNzRWRpdHMgPSB0cnVlOwogICAgICBpZiAoZHJvcFNoaWZ0KSBjbS5kaXNwbGF5LnNoaWZ0ID0gZmFsc2U7CiAgICAgIGRvbmUgPSBib3VuZChjbSkgIT0gUGFzczsKICAgIH0gZmluYWxseSB7CiAgICAgIGNtLmRpc3BsYXkuc2hpZnQgPSBwcmV2U2hpZnQ7CiAgICAgIGNtLnN0YXRlLnN1cHByZXNzRWRpdHMgPSBmYWxzZTsKICAgIH0KICAgIHJldHVybiBkb25lOwogIH0KCiAgLy8gQ29sbGVjdCB0aGUgY3VycmVudGx5IGFjdGl2ZSBrZXltYXBzLgogIGZ1bmN0aW9uIGFsbEtleU1hcHMoY20pIHsKICAgIHZhciBtYXBzID0gY20uc3RhdGUua2V5TWFwcy5zbGljZSgwKTsKICAgIGlmIChjbS5vcHRpb25zLmV4dHJhS2V5cykgbWFwcy5wdXNoKGNtLm9wdGlvbnMuZXh0cmFLZXlzKTsKICAgIG1hcHMucHVzaChjbS5vcHRpb25zLmtleU1hcCk7CiAgICByZXR1cm4gbWFwczsKICB9CgogIHZhciBtYXliZVRyYW5zaXRpb247CiAgLy8gSGFuZGxlIGEga2V5IGZyb20gdGhlIGtleWRvd24gZXZlbnQuCiAgZnVuY3Rpb24gaGFuZGxlS2V5QmluZGluZyhjbSwgZSkgewogICAgLy8gSGFuZGxlIGF1dG9tYXRpYyBrZXltYXAgdHJhbnNpdGlvbnMKICAgIHZhciBzdGFydE1hcCA9IGdldEtleU1hcChjbS5vcHRpb25zLmtleU1hcCksIG5leHQgPSBzdGFydE1hcC5hdXRvOwogICAgY2xlYXJUaW1lb3V0KG1heWJlVHJhbnNpdGlvbik7CiAgICBpZiAobmV4dCAmJiAhaXNNb2RpZmllcktleShlKSkgbWF5YmVUcmFuc2l0aW9uID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgaWYgKGdldEtleU1hcChjbS5vcHRpb25zLmtleU1hcCkgPT0gc3RhcnRNYXApIHsKICAgICAgICBjbS5vcHRpb25zLmtleU1hcCA9IChuZXh0LmNhbGwgPyBuZXh0LmNhbGwobnVsbCwgY20pIDogbmV4dCk7CiAgICAgICAga2V5TWFwQ2hhbmdlZChjbSk7CiAgICAgIH0KICAgIH0sIDUwKTsKCiAgICB2YXIgbmFtZSA9IGtleU5hbWUoZSwgdHJ1ZSksIGhhbmRsZWQgPSBmYWxzZTsKICAgIGlmICghbmFtZSkgcmV0dXJuIGZhbHNlOwogICAgdmFyIGtleW1hcHMgPSBhbGxLZXlNYXBzKGNtKTsKCiAgICBpZiAoZS5zaGlmdEtleSkgewogICAgICAvLyBGaXJzdCB0cnkgdG8gcmVzb2x2ZSBmdWxsIG5hbWUgKGluY2x1ZGluZyAnU2hpZnQtJykuIEZhaWxpbmcKICAgICAgLy8gdGhhdCwgc2VlIGlmIHRoZXJlIGlzIGEgY3Vyc29yLW1vdGlvbiBjb21tYW5kIChzdGFydGluZyB3aXRoCiAgICAgIC8vICdnbycpIGJvdW5kIHRvIHRoZSBrZXluYW1lIHdpdGhvdXQgJ1NoaWZ0LScuCiAgICAgIGhhbmRsZWQgPSBsb29rdXBLZXkoIlNoaWZ0LSIgKyBuYW1lLCBrZXltYXBzLCBmdW5jdGlvbihiKSB7cmV0dXJuIGRvSGFuZGxlQmluZGluZyhjbSwgYiwgdHJ1ZSk7fSkKICAgICAgICAgICAgIHx8IGxvb2t1cEtleShuYW1lLCBrZXltYXBzLCBmdW5jdGlvbihiKSB7CiAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYiA9PSAic3RyaW5nIiA/IC9eZ29bQS1aXS8udGVzdChiKSA6IGIubW90aW9uKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBkb0hhbmRsZUJpbmRpbmcoY20sIGIpOwogICAgICAgICAgICAgICAgfSk7CiAgICB9IGVsc2UgewogICAgICBoYW5kbGVkID0gbG9va3VwS2V5KG5hbWUsIGtleW1hcHMsIGZ1bmN0aW9uKGIpIHsgcmV0dXJuIGRvSGFuZGxlQmluZGluZyhjbSwgYik7IH0pOwogICAgfQoKICAgIGlmIChoYW5kbGVkKSB7CiAgICAgIGVfcHJldmVudERlZmF1bHQoZSk7CiAgICAgIHJlc3RhcnRCbGluayhjbSk7CiAgICAgIHNpZ25hbExhdGVyKGNtLCAia2V5SGFuZGxlZCIsIGNtLCBuYW1lLCBlKTsKICAgIH0KICAgIHJldHVybiBoYW5kbGVkOwogIH0KCiAgLy8gSGFuZGxlIGEga2V5IGZyb20gdGhlIGtleXByZXNzIGV2ZW50CiAgZnVuY3Rpb24gaGFuZGxlQ2hhckJpbmRpbmcoY20sIGUsIGNoKSB7CiAgICB2YXIgaGFuZGxlZCA9IGxvb2t1cEtleSgiJyIgKyBjaCArICInIiwgYWxsS2V5TWFwcyhjbSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbihiKSB7IHJldHVybiBkb0hhbmRsZUJpbmRpbmcoY20sIGIsIHRydWUpOyB9KTsKICAgIGlmIChoYW5kbGVkKSB7CiAgICAgIGVfcHJldmVudERlZmF1bHQoZSk7CiAgICAgIHJlc3RhcnRCbGluayhjbSk7CiAgICAgIHNpZ25hbExhdGVyKGNtLCAia2V5SGFuZGxlZCIsIGNtLCAiJyIgKyBjaCArICInIiwgZSk7CiAgICB9CiAgICByZXR1cm4gaGFuZGxlZDsKICB9CgogIHZhciBsYXN0U3RvcHBlZEtleSA9IG51bGw7CiAgZnVuY3Rpb24gb25LZXlEb3duKGUpIHsKICAgIHZhciBjbSA9IHRoaXM7CiAgICBlbnN1cmVGb2N1cyhjbSk7CiAgICBpZiAoc2lnbmFsRE9NRXZlbnQoY20sIGUpKSByZXR1cm47CiAgICAvLyBJRSBkb2VzIHN0cmFuZ2UgdGhpbmdzIHdpdGggZXNjYXBlLgogICAgaWYgKGllICYmIGllX3ZlcnNpb24gPCAxMSAmJiBlLmtleUNvZGUgPT0gMjcpIGUucmV0dXJuVmFsdWUgPSBmYWxzZTsKICAgIHZhciBjb2RlID0gZS5rZXlDb2RlOwogICAgY20uZGlzcGxheS5zaGlmdCA9IGNvZGUgPT0gMTYgfHwgZS5zaGlmdEtleTsKICAgIHZhciBoYW5kbGVkID0gaGFuZGxlS2V5QmluZGluZyhjbSwgZSk7CiAgICBpZiAocHJlc3RvKSB7CiAgICAgIGxhc3RTdG9wcGVkS2V5ID0gaGFuZGxlZCA/IGNvZGUgOiBudWxsOwogICAgICAvLyBPcGVyYSBoYXMgbm8gY3V0IGV2ZW50Li4uIHdlIHRyeSB0byBhdCBsZWFzdCBjYXRjaCB0aGUga2V5IGNvbWJvCiAgICAgIGlmICghaGFuZGxlZCAmJiBjb2RlID09IDg4ICYmICFoYXNDb3B5RXZlbnQgJiYgKG1hYyA/IGUubWV0YUtleSA6IGUuY3RybEtleSkpCiAgICAgICAgY20ucmVwbGFjZVNlbGVjdGlvbigiIiwgbnVsbCwgImN1dCIpOwogICAgfQoKICAgIC8vIFR1cm4gbW91c2UgaW50byBjcm9zc2hhaXIgd2hlbiBBbHQgaXMgaGVsZCBvbiBNYWMuCiAgICBpZiAoY29kZSA9PSAxOCAmJiAhL1xiQ29kZU1pcnJvci1jcm9zc2hhaXJcYi8udGVzdChjbS5kaXNwbGF5LmxpbmVEaXYuY2xhc3NOYW1lKSkKICAgICAgc2hvd0Nyb3NzSGFpcihjbSk7CiAgfQoKICBmdW5jdGlvbiBzaG93Q3Jvc3NIYWlyKGNtKSB7CiAgICB2YXIgbGluZURpdiA9IGNtLmRpc3BsYXkubGluZURpdjsKICAgIGFkZENsYXNzKGxpbmVEaXYsICJDb2RlTWlycm9yLWNyb3NzaGFpciIpOwoKICAgIGZ1bmN0aW9uIHVwKGUpIHsKICAgICAgaWYgKGUua2V5Q29kZSA9PSAxOCB8fCAhZS5hbHRLZXkpIHsKICAgICAgICBybUNsYXNzKGxpbmVEaXYsICJDb2RlTWlycm9yLWNyb3NzaGFpciIpOwogICAgICAgIG9mZihkb2N1bWVudCwgImtleXVwIiwgdXApOwogICAgICAgIG9mZihkb2N1bWVudCwgIm1vdXNlb3ZlciIsIHVwKTsKICAgICAgfQogICAgfQogICAgb24oZG9jdW1lbnQsICJrZXl1cCIsIHVwKTsKICAgIG9uKGRvY3VtZW50LCAibW91c2VvdmVyIiwgdXApOwogIH0KCiAgZnVuY3Rpb24gb25LZXlVcChlKSB7CiAgICBpZiAoZS5rZXlDb2RlID09IDE2KSB0aGlzLmRvYy5zZWwuc2hpZnQgPSBmYWxzZTsKICAgIHNpZ25hbERPTUV2ZW50KHRoaXMsIGUpOwogIH0KCiAgZnVuY3Rpb24gb25LZXlQcmVzcyhlKSB7CiAgICB2YXIgY20gPSB0aGlzOwogICAgaWYgKHNpZ25hbERPTUV2ZW50KGNtLCBlKSB8fCBlLmN0cmxLZXkgJiYgIWUuYWx0S2V5IHx8IG1hYyAmJiBlLm1ldGFLZXkpIHJldHVybjsKICAgIHZhciBrZXlDb2RlID0gZS5rZXlDb2RlLCBjaGFyQ29kZSA9IGUuY2hhckNvZGU7CiAgICBpZiAocHJlc3RvICYmIGtleUNvZGUgPT0gbGFzdFN0b3BwZWRLZXkpIHtsYXN0U3RvcHBlZEtleSA9IG51bGw7IGVfcHJldmVudERlZmF1bHQoZSk7IHJldHVybjt9CiAgICBpZiAoKChwcmVzdG8gJiYgKCFlLndoaWNoIHx8IGUud2hpY2ggPCAxMCkpIHx8IGtodG1sKSAmJiBoYW5kbGVLZXlCaW5kaW5nKGNtLCBlKSkgcmV0dXJuOwogICAgdmFyIGNoID0gU3RyaW5nLmZyb21DaGFyQ29kZShjaGFyQ29kZSA9PSBudWxsID8ga2V5Q29kZSA6IGNoYXJDb2RlKTsKICAgIGlmIChoYW5kbGVDaGFyQmluZGluZyhjbSwgZSwgY2gpKSByZXR1cm47CiAgICBpZiAoaWUgJiYgaWVfdmVyc2lvbiA+PSA5KSBjbS5kaXNwbGF5LmlucHV0SGFzU2VsZWN0aW9uID0gbnVsbDsKICAgIGZhc3RQb2xsKGNtKTsKICB9CgogIC8vIEZPQ1VTL0JMVVIgRVZFTlRTCgogIGZ1bmN0aW9uIG9uRm9jdXMoY20pIHsKICAgIGlmIChjbS5vcHRpb25zLnJlYWRPbmx5ID09ICJub2N1cnNvciIpIHJldHVybjsKICAgIGlmICghY20uc3RhdGUuZm9jdXNlZCkgewogICAgICBzaWduYWwoY20sICJmb2N1cyIsIGNtKTsKICAgICAgY20uc3RhdGUuZm9jdXNlZCA9IHRydWU7CiAgICAgIGFkZENsYXNzKGNtLmRpc3BsYXkud3JhcHBlciwgIkNvZGVNaXJyb3ItZm9jdXNlZCIpOwogICAgICAvLyBUaGUgcHJldklucHV0IHRlc3QgcHJldmVudHMgdGhpcyBmcm9tIGZpcmluZyB3aGVuIGEgY29udGV4dAogICAgICAvLyBtZW51IGlzIGNsb3NlZCAoc2luY2UgdGhlIHJlc2V0SW5wdXQgd291bGQga2lsbCB0aGUKICAgICAgLy8gc2VsZWN0LWFsbCBkZXRlY3Rpb24gaGFjaykKICAgICAgaWYgKCFjbS5jdXJPcCAmJiBjbS5kaXNwbGF5LnNlbEZvckNvbnRleHRNZW51ICE9IGNtLmRvYy5zZWwpIHsKICAgICAgICByZXNldElucHV0KGNtKTsKICAgICAgICBpZiAod2Via2l0KSBzZXRUaW1lb3V0KGJpbmQocmVzZXRJbnB1dCwgY20sIHRydWUpLCAwKTsgLy8gSXNzdWUgIzE3MzAKICAgICAgfQogICAgfQogICAgc2xvd1BvbGwoY20pOwogICAgcmVzdGFydEJsaW5rKGNtKTsKICB9CiAgZnVuY3Rpb24gb25CbHVyKGNtKSB7CiAgICBpZiAoY20uc3RhdGUuZm9jdXNlZCkgewogICAgICBzaWduYWwoY20sICJibHVyIiwgY20pOwogICAgICBjbS5zdGF0ZS5mb2N1c2VkID0gZmFsc2U7CiAgICAgIHJtQ2xhc3MoY20uZGlzcGxheS53cmFwcGVyLCAiQ29kZU1pcnJvci1mb2N1c2VkIik7CiAgICB9CiAgICBjbGVhckludGVydmFsKGNtLmRpc3BsYXkuYmxpbmtlcik7CiAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge2lmICghY20uc3RhdGUuZm9jdXNlZCkgY20uZGlzcGxheS5zaGlmdCA9IGZhbHNlO30sIDE1MCk7CiAgfQoKICAvLyBDT05URVhUIE1FTlUgSEFORExJTkcKCiAgLy8gVG8gbWFrZSB0aGUgY29udGV4dCBtZW51IHdvcmssIHdlIG5lZWQgdG8gYnJpZWZseSB1bmhpZGUgdGhlCiAgLy8gdGV4dGFyZWEgKG1ha2luZyBpdCBhcyB1bm9idHJ1c2l2ZSBhcyBwb3NzaWJsZSkgdG8gbGV0IHRoZQogIC8vIHJpZ2h0LWNsaWNrIHRha2UgZWZmZWN0IG9uIGl0LgogIGZ1bmN0aW9uIG9uQ29udGV4dE1lbnUoY20sIGUpIHsKICAgIGlmIChzaWduYWxET01FdmVudChjbSwgZSwgImNvbnRleHRtZW51IikpIHJldHVybjsKICAgIHZhciBkaXNwbGF5ID0gY20uZGlzcGxheTsKICAgIGlmIChldmVudEluV2lkZ2V0KGRpc3BsYXksIGUpIHx8IGNvbnRleHRNZW51SW5HdXR0ZXIoY20sIGUpKSByZXR1cm47CgogICAgdmFyIHBvcyA9IHBvc0Zyb21Nb3VzZShjbSwgZSksIHNjcm9sbFBvcyA9IGRpc3BsYXkuc2Nyb2xsZXIuc2Nyb2xsVG9wOwogICAgaWYgKCFwb3MgfHwgcHJlc3RvKSByZXR1cm47IC8vIE9wZXJhIGlzIGRpZmZpY3VsdC4KCiAgICAvLyBSZXNldCB0aGUgY3VycmVudCB0ZXh0IHNlbGVjdGlvbiBvbmx5IGlmIHRoZSBjbGljayBpcyBkb25lIG91dHNpZGUgb2YgdGhlIHNlbGVjdGlvbgogICAgLy8gYW5kICdyZXNldFNlbGVjdGlvbk9uQ29udGV4dE1lbnUnIG9wdGlvbiBpcyB0cnVlLgogICAgdmFyIHJlc2V0ID0gY20ub3B0aW9ucy5yZXNldFNlbGVjdGlvbk9uQ29udGV4dE1lbnU7CiAgICBpZiAocmVzZXQgJiYgY20uZG9jLnNlbC5jb250YWlucyhwb3MpID09IC0xKQogICAgICBvcGVyYXRpb24oY20sIHNldFNlbGVjdGlvbikoY20uZG9jLCBzaW1wbGVTZWxlY3Rpb24ocG9zKSwgc2VsX2RvbnRTY3JvbGwpOwoKICAgIHZhciBvbGRDU1MgPSBkaXNwbGF5LmlucHV0LnN0eWxlLmNzc1RleHQ7CiAgICBkaXNwbGF5LmlucHV0RGl2LnN0eWxlLnBvc2l0aW9uID0gImFic29sdXRlIjsKICAgIGRpc3BsYXkuaW5wdXQuc3R5bGUuY3NzVGV4dCA9ICJwb3NpdGlvbjogZml4ZWQ7IHdpZHRoOiAzMHB4OyBoZWlnaHQ6IDMwcHg7IHRvcDogIiArIChlLmNsaWVudFkgLSA1KSArCiAgICAgICJweDsgbGVmdDogIiArIChlLmNsaWVudFggLSA1KSArICJweDsgei1pbmRleDogMTAwMDsgYmFja2dyb3VuZDogIiArCiAgICAgIChpZSA/ICJyZ2JhKDI1NSwgMjU1LCAyNTUsIC4wNSkiIDogInRyYW5zcGFyZW50IikgKwogICAgICAiOyBvdXRsaW5lOiBub25lOyBib3JkZXItd2lkdGg6IDA7IG91dGxpbmU6IG5vbmU7IG92ZXJmbG93OiBoaWRkZW47IG9wYWNpdHk6IC4wNTsgZmlsdGVyOiBhbHBoYShvcGFjaXR5PTUpOyI7CiAgICBpZiAod2Via2l0KSB2YXIgb2xkU2Nyb2xsWSA9IHdpbmRvdy5zY3JvbGxZOyAvLyBXb3JrIGFyb3VuZCBDaHJvbWUgaXNzdWUgKCMyNzEyKQogICAgZm9jdXNJbnB1dChjbSk7CiAgICBpZiAod2Via2l0KSB3aW5kb3cuc2Nyb2xsVG8obnVsbCwgb2xkU2Nyb2xsWSk7CiAgICByZXNldElucHV0KGNtKTsKICAgIC8vIEFkZHMgIlNlbGVjdCBhbGwiIHRvIGNvbnRleHQgbWVudSBpbiBGRgogICAgaWYgKCFjbS5zb21ldGhpbmdTZWxlY3RlZCgpKSBkaXNwbGF5LmlucHV0LnZhbHVlID0gZGlzcGxheS5wcmV2SW5wdXQgPSAiICI7CiAgICBkaXNwbGF5LnNlbEZvckNvbnRleHRNZW51ID0gY20uZG9jLnNlbDsKICAgIGNsZWFyVGltZW91dChkaXNwbGF5LmRldGVjdGluZ1NlbGVjdEFsbCk7CgogICAgLy8gU2VsZWN0LWFsbCB3aWxsIGJlIGdyZXllZCBvdXQgaWYgdGhlcmUncyBub3RoaW5nIHRvIHNlbGVjdCwgc28KICAgIC8vIHRoaXMgYWRkcyBhIHplcm8td2lkdGggc3BhY2Ugc28gdGhhdCB3ZSBjYW4gbGF0ZXIgY2hlY2sgd2hldGhlcgogICAgLy8gaXQgZ290IHNlbGVjdGVkLgogICAgZnVuY3Rpb24gcHJlcGFyZVNlbGVjdEFsbEhhY2soKSB7CiAgICAgIGlmIChkaXNwbGF5LmlucHV0LnNlbGVjdGlvblN0YXJ0ICE9IG51bGwpIHsKICAgICAgICB2YXIgc2VsZWN0ZWQgPSBjbS5zb21ldGhpbmdTZWxlY3RlZCgpOwogICAgICAgIHZhciBleHR2YWwgPSBkaXNwbGF5LmlucHV0LnZhbHVlID0gIlx1MjAwYiIgKyAoc2VsZWN0ZWQgPyBkaXNwbGF5LmlucHV0LnZhbHVlIDogIiIpOwogICAgICAgIGRpc3BsYXkucHJldklucHV0ID0gc2VsZWN0ZWQgPyAiIiA6ICJcdTIwMGIiOwogICAgICAgIGRpc3BsYXkuaW5wdXQuc2VsZWN0aW9uU3RhcnQgPSAxOyBkaXNwbGF5LmlucHV0LnNlbGVjdGlvbkVuZCA9IGV4dHZhbC5sZW5ndGg7CiAgICAgICAgLy8gUmUtc2V0IHRoaXMsIGluIGNhc2Ugc29tZSBvdGhlciBoYW5kbGVyIHRvdWNoZWQgdGhlCiAgICAgICAgLy8gc2VsZWN0aW9uIGluIHRoZSBtZWFudGltZS4KICAgICAgICBkaXNwbGF5LnNlbEZvckNvbnRleHRNZW51ID0gY20uZG9jLnNlbDsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gcmVoaWRlKCkgewogICAgICBkaXNwbGF5LmlucHV0RGl2LnN0eWxlLnBvc2l0aW9uID0gInJlbGF0aXZlIjsKICAgICAgZGlzcGxheS5pbnB1dC5zdHlsZS5jc3NUZXh0ID0gb2xkQ1NTOwogICAgICBpZiAoaWUgJiYgaWVfdmVyc2lvbiA8IDkpIGRpc3BsYXkuc2Nyb2xsYmFyVi5zY3JvbGxUb3AgPSBkaXNwbGF5LnNjcm9sbGVyLnNjcm9sbFRvcCA9IHNjcm9sbFBvczsKICAgICAgc2xvd1BvbGwoY20pOwoKICAgICAgLy8gVHJ5IHRvIGRldGVjdCB0aGUgdXNlciBjaG9vc2luZyBzZWxlY3QtYWxsCiAgICAgIGlmIChkaXNwbGF5LmlucHV0LnNlbGVjdGlvblN0YXJ0ICE9IG51bGwpIHsKICAgICAgICBpZiAoIWllIHx8IChpZSAmJiBpZV92ZXJzaW9uIDwgOSkpIHByZXBhcmVTZWxlY3RBbGxIYWNrKCk7CiAgICAgICAgdmFyIGkgPSAwLCBwb2xsID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICBpZiAoZGlzcGxheS5zZWxGb3JDb250ZXh0TWVudSA9PSBjbS5kb2Muc2VsICYmIGRpc3BsYXkuaW5wdXQuc2VsZWN0aW9uU3RhcnQgPT0gMCkKICAgICAgICAgICAgb3BlcmF0aW9uKGNtLCBjb21tYW5kcy5zZWxlY3RBbGwpKGNtKTsKICAgICAgICAgIGVsc2UgaWYgKGkrKyA8IDEwKSBkaXNwbGF5LmRldGVjdGluZ1NlbGVjdEFsbCA9IHNldFRpbWVvdXQocG9sbCwgNTAwKTsKICAgICAgICAgIGVsc2UgcmVzZXRJbnB1dChjbSk7CiAgICAgICAgfTsKICAgICAgICBkaXNwbGF5LmRldGVjdGluZ1NlbGVjdEFsbCA9IHNldFRpbWVvdXQocG9sbCwgMjAwKTsKICAgICAgfQogICAgfQoKICAgIGlmIChpZSAmJiBpZV92ZXJzaW9uID49IDkpIHByZXBhcmVTZWxlY3RBbGxIYWNrKCk7CiAgICBpZiAoY2FwdHVyZVJpZ2h0Q2xpY2spIHsKICAgICAgZV9zdG9wKGUpOwogICAgICB2YXIgbW91c2V1cCA9IGZ1bmN0aW9uKCkgewogICAgICAgIG9mZih3aW5kb3csICJtb3VzZXVwIiwgbW91c2V1cCk7CiAgICAgICAgc2V0VGltZW91dChyZWhpZGUsIDIwKTsKICAgICAgfTsKICAgICAgb24od2luZG93LCAibW91c2V1cCIsIG1vdXNldXApOwogICAgfSBlbHNlIHsKICAgICAgc2V0VGltZW91dChyZWhpZGUsIDUwKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGNvbnRleHRNZW51SW5HdXR0ZXIoY20sIGUpIHsKICAgIGlmICghaGFzSGFuZGxlcihjbSwgImd1dHRlckNvbnRleHRNZW51IikpIHJldHVybiBmYWxzZTsKICAgIHJldHVybiBndXR0ZXJFdmVudChjbSwgZSwgImd1dHRlckNvbnRleHRNZW51IiwgZmFsc2UsIHNpZ25hbCk7CiAgfQoKICAvLyBVUERBVElORwoKICAvLyBDb21wdXRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgZW5kIG9mIGEgY2hhbmdlIChpdHMgJ3RvJyBwcm9wZXJ0eQogIC8vIHJlZmVycyB0byB0aGUgcHJlLWNoYW5nZSBlbmQpLgogIHZhciBjaGFuZ2VFbmQgPSBDb2RlTWlycm9yLmNoYW5nZUVuZCA9IGZ1bmN0aW9uKGNoYW5nZSkgewogICAgaWYgKCFjaGFuZ2UudGV4dCkgcmV0dXJuIGNoYW5nZS50bzsKICAgIHJldHVybiBQb3MoY2hhbmdlLmZyb20ubGluZSArIGNoYW5nZS50ZXh0Lmxlbmd0aCAtIDEsCiAgICAgICAgICAgICAgIGxzdChjaGFuZ2UudGV4dCkubGVuZ3RoICsgKGNoYW5nZS50ZXh0Lmxlbmd0aCA9PSAxID8gY2hhbmdlLmZyb20uY2ggOiAwKSk7CiAgfTsKCiAgLy8gQWRqdXN0IGEgcG9zaXRpb24gdG8gcmVmZXIgdG8gdGhlIHBvc3QtY2hhbmdlIHBvc2l0aW9uIG9mIHRoZQogIC8vIHNhbWUgdGV4dCwgb3IgdGhlIGVuZCBvZiB0aGUgY2hhbmdlIGlmIHRoZSBjaGFuZ2UgY292ZXJzIGl0LgogIGZ1bmN0aW9uIGFkanVzdEZvckNoYW5nZShwb3MsIGNoYW5nZSkgewogICAgaWYgKGNtcChwb3MsIGNoYW5nZS5mcm9tKSA8IDApIHJldHVybiBwb3M7CiAgICBpZiAoY21wKHBvcywgY2hhbmdlLnRvKSA8PSAwKSByZXR1cm4gY2hhbmdlRW5kKGNoYW5nZSk7CgogICAgdmFyIGxpbmUgPSBwb3MubGluZSArIGNoYW5nZS50ZXh0Lmxlbmd0aCAtIChjaGFuZ2UudG8ubGluZSAtIGNoYW5nZS5mcm9tLmxpbmUpIC0gMSwgY2ggPSBwb3MuY2g7CiAgICBpZiAocG9zLmxpbmUgPT0gY2hhbmdlLnRvLmxpbmUpIGNoICs9IGNoYW5nZUVuZChjaGFuZ2UpLmNoIC0gY2hhbmdlLnRvLmNoOwogICAgcmV0dXJuIFBvcyhsaW5lLCBjaCk7CiAgfQoKICBmdW5jdGlvbiBjb21wdXRlU2VsQWZ0ZXJDaGFuZ2UoZG9jLCBjaGFuZ2UpIHsKICAgIHZhciBvdXQgPSBbXTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZG9jLnNlbC5yYW5nZXMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIHJhbmdlID0gZG9jLnNlbC5yYW5nZXNbaV07CiAgICAgIG91dC5wdXNoKG5ldyBSYW5nZShhZGp1c3RGb3JDaGFuZ2UocmFuZ2UuYW5jaG9yLCBjaGFuZ2UpLAogICAgICAgICAgICAgICAgICAgICAgICAgYWRqdXN0Rm9yQ2hhbmdlKHJhbmdlLmhlYWQsIGNoYW5nZSkpKTsKICAgIH0KICAgIHJldHVybiBub3JtYWxpemVTZWxlY3Rpb24ob3V0LCBkb2Muc2VsLnByaW1JbmRleCk7CiAgfQoKICBmdW5jdGlvbiBvZmZzZXRQb3MocG9zLCBvbGQsIG53KSB7CiAgICBpZiAocG9zLmxpbmUgPT0gb2xkLmxpbmUpCiAgICAgIHJldHVybiBQb3MobncubGluZSwgcG9zLmNoIC0gb2xkLmNoICsgbncuY2gpOwogICAgZWxzZQogICAgICByZXR1cm4gUG9zKG53LmxpbmUgKyAocG9zLmxpbmUgLSBvbGQubGluZSksIHBvcy5jaCk7CiAgfQoKICAvLyBVc2VkIGJ5IHJlcGxhY2VTZWxlY3Rpb25zIHRvIGFsbG93IG1vdmluZyB0aGUgc2VsZWN0aW9uIHRvIHRoZQogIC8vIHN0YXJ0IG9yIGFyb3VuZCB0aGUgcmVwbGFjZWQgdGVzdC4gSGludCBtYXkgYmUgInN0YXJ0IiBvciAiYXJvdW5kIi4KICBmdW5jdGlvbiBjb21wdXRlUmVwbGFjZWRTZWwoZG9jLCBjaGFuZ2VzLCBoaW50KSB7CiAgICB2YXIgb3V0ID0gW107CiAgICB2YXIgb2xkUHJldiA9IFBvcyhkb2MuZmlyc3QsIDApLCBuZXdQcmV2ID0gb2xkUHJldjsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hhbmdlcy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgY2hhbmdlID0gY2hhbmdlc1tpXTsKICAgICAgdmFyIGZyb20gPSBvZmZzZXRQb3MoY2hhbmdlLmZyb20sIG9sZFByZXYsIG5ld1ByZXYpOwogICAgICB2YXIgdG8gPSBvZmZzZXRQb3MoY2hhbmdlRW5kKGNoYW5nZSksIG9sZFByZXYsIG5ld1ByZXYpOwogICAgICBvbGRQcmV2ID0gY2hhbmdlLnRvOwogICAgICBuZXdQcmV2ID0gdG87CiAgICAgIGlmIChoaW50ID09ICJhcm91bmQiKSB7CiAgICAgICAgdmFyIHJhbmdlID0gZG9jLnNlbC5yYW5nZXNbaV0sIGludiA9IGNtcChyYW5nZS5oZWFkLCByYW5nZS5hbmNob3IpIDwgMDsKICAgICAgICBvdXRbaV0gPSBuZXcgUmFuZ2UoaW52ID8gdG8gOiBmcm9tLCBpbnYgPyBmcm9tIDogdG8pOwogICAgICB9IGVsc2UgewogICAgICAgIG91dFtpXSA9IG5ldyBSYW5nZShmcm9tLCBmcm9tKTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5ldyBTZWxlY3Rpb24ob3V0LCBkb2Muc2VsLnByaW1JbmRleCk7CiAgfQoKICAvLyBBbGxvdyAiYmVmb3JlQ2hhbmdlIiBldmVudCBoYW5kbGVycyB0byBpbmZsdWVuY2UgYSBjaGFuZ2UKICBmdW5jdGlvbiBmaWx0ZXJDaGFuZ2UoZG9jLCBjaGFuZ2UsIHVwZGF0ZSkgewogICAgdmFyIG9iaiA9IHsKICAgICAgY2FuY2VsZWQ6IGZhbHNlLAogICAgICBmcm9tOiBjaGFuZ2UuZnJvbSwKICAgICAgdG86IGNoYW5nZS50bywKICAgICAgdGV4dDogY2hhbmdlLnRleHQsCiAgICAgIG9yaWdpbjogY2hhbmdlLm9yaWdpbiwKICAgICAgY2FuY2VsOiBmdW5jdGlvbigpIHsgdGhpcy5jYW5jZWxlZCA9IHRydWU7IH0KICAgIH07CiAgICBpZiAodXBkYXRlKSBvYmoudXBkYXRlID0gZnVuY3Rpb24oZnJvbSwgdG8sIHRleHQsIG9yaWdpbikgewogICAgICBpZiAoZnJvbSkgdGhpcy5mcm9tID0gY2xpcFBvcyhkb2MsIGZyb20pOwogICAgICBpZiAodG8pIHRoaXMudG8gPSBjbGlwUG9zKGRvYywgdG8pOwogICAgICBpZiAodGV4dCkgdGhpcy50ZXh0ID0gdGV4dDsKICAgICAgaWYgKG9yaWdpbiAhPT0gdW5kZWZpbmVkKSB0aGlzLm9yaWdpbiA9IG9yaWdpbjsKICAgIH07CiAgICBzaWduYWwoZG9jLCAiYmVmb3JlQ2hhbmdlIiwgZG9jLCBvYmopOwogICAgaWYgKGRvYy5jbSkgc2lnbmFsKGRvYy5jbSwgImJlZm9yZUNoYW5nZSIsIGRvYy5jbSwgb2JqKTsKCiAgICBpZiAob2JqLmNhbmNlbGVkKSByZXR1cm4gbnVsbDsKICAgIHJldHVybiB7ZnJvbTogb2JqLmZyb20sIHRvOiBvYmoudG8sIHRleHQ6IG9iai50ZXh0LCBvcmlnaW46IG9iai5vcmlnaW59OwogIH0KCiAgLy8gQXBwbHkgYSBjaGFuZ2UgdG8gYSBkb2N1bWVudCwgYW5kIGFkZCBpdCB0byB0aGUgZG9jdW1lbnQncwogIC8vIGhpc3RvcnksIGFuZCBwcm9wYWdhdGluZyBpdCB0byBhbGwgbGlua2VkIGRvY3VtZW50cy4KICBmdW5jdGlvbiBtYWtlQ2hhbmdlKGRvYywgY2hhbmdlLCBpZ25vcmVSZWFkT25seSkgewogICAgaWYgKGRvYy5jbSkgewogICAgICBpZiAoIWRvYy5jbS5jdXJPcCkgcmV0dXJuIG9wZXJhdGlvbihkb2MuY20sIG1ha2VDaGFuZ2UpKGRvYywgY2hhbmdlLCBpZ25vcmVSZWFkT25seSk7CiAgICAgIGlmIChkb2MuY20uc3RhdGUuc3VwcHJlc3NFZGl0cykgcmV0dXJuOwogICAgfQoKICAgIGlmIChoYXNIYW5kbGVyKGRvYywgImJlZm9yZUNoYW5nZSIpIHx8IGRvYy5jbSAmJiBoYXNIYW5kbGVyKGRvYy5jbSwgImJlZm9yZUNoYW5nZSIpKSB7CiAgICAgIGNoYW5nZSA9IGZpbHRlckNoYW5nZShkb2MsIGNoYW5nZSwgdHJ1ZSk7CiAgICAgIGlmICghY2hhbmdlKSByZXR1cm47CiAgICB9CgogICAgLy8gUG9zc2libHkgc3BsaXQgb3Igc3VwcHJlc3MgdGhlIHVwZGF0ZSBiYXNlZCBvbiB0aGUgcHJlc2VuY2UKICAgIC8vIG9mIHJlYWQtb25seSBzcGFucyBpbiBpdHMgcmFuZ2UuCiAgICB2YXIgc3BsaXQgPSBzYXdSZWFkT25seVNwYW5zICYmICFpZ25vcmVSZWFkT25seSAmJiByZW1vdmVSZWFkT25seVJhbmdlcyhkb2MsIGNoYW5nZS5mcm9tLCBjaGFuZ2UudG8pOwogICAgaWYgKHNwbGl0KSB7CiAgICAgIGZvciAodmFyIGkgPSBzcGxpdC5sZW5ndGggLSAxOyBpID49IDA7IC0taSkKICAgICAgICBtYWtlQ2hhbmdlSW5uZXIoZG9jLCB7ZnJvbTogc3BsaXRbaV0uZnJvbSwgdG86IHNwbGl0W2ldLnRvLCB0ZXh0OiBpID8gWyIiXSA6IGNoYW5nZS50ZXh0fSk7CiAgICB9IGVsc2UgewogICAgICBtYWtlQ2hhbmdlSW5uZXIoZG9jLCBjaGFuZ2UpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gbWFrZUNoYW5nZUlubmVyKGRvYywgY2hhbmdlKSB7CiAgICBpZiAoY2hhbmdlLnRleHQubGVuZ3RoID09IDEgJiYgY2hhbmdlLnRleHRbMF0gPT0gIiIgJiYgY21wKGNoYW5nZS5mcm9tLCBjaGFuZ2UudG8pID09IDApIHJldHVybjsKICAgIHZhciBzZWxBZnRlciA9IGNvbXB1dGVTZWxBZnRlckNoYW5nZShkb2MsIGNoYW5nZSk7CiAgICBhZGRDaGFuZ2VUb0hpc3RvcnkoZG9jLCBjaGFuZ2UsIHNlbEFmdGVyLCBkb2MuY20gPyBkb2MuY20uY3VyT3AuaWQgOiBOYU4pOwoKICAgIG1ha2VDaGFuZ2VTaW5nbGVEb2MoZG9jLCBjaGFuZ2UsIHNlbEFmdGVyLCBzdHJldGNoU3BhbnNPdmVyQ2hhbmdlKGRvYywgY2hhbmdlKSk7CiAgICB2YXIgcmViYXNlZCA9IFtdOwoKICAgIGxpbmtlZERvY3MoZG9jLCBmdW5jdGlvbihkb2MsIHNoYXJlZEhpc3QpIHsKICAgICAgaWYgKCFzaGFyZWRIaXN0ICYmIGluZGV4T2YocmViYXNlZCwgZG9jLmhpc3RvcnkpID09IC0xKSB7CiAgICAgICAgcmViYXNlSGlzdChkb2MuaGlzdG9yeSwgY2hhbmdlKTsKICAgICAgICByZWJhc2VkLnB1c2goZG9jLmhpc3RvcnkpOwogICAgICB9CiAgICAgIG1ha2VDaGFuZ2VTaW5nbGVEb2MoZG9jLCBjaGFuZ2UsIG51bGwsIHN0cmV0Y2hTcGFuc092ZXJDaGFuZ2UoZG9jLCBjaGFuZ2UpKTsKICAgIH0pOwogIH0KCiAgLy8gUmV2ZXJ0IGEgY2hhbmdlIHN0b3JlZCBpbiBhIGRvY3VtZW50J3MgaGlzdG9yeS4KICBmdW5jdGlvbiBtYWtlQ2hhbmdlRnJvbUhpc3RvcnkoZG9jLCB0eXBlLCBhbGxvd1NlbGVjdGlvbk9ubHkpIHsKICAgIGlmIChkb2MuY20gJiYgZG9jLmNtLnN0YXRlLnN1cHByZXNzRWRpdHMpIHJldHVybjsKCiAgICB2YXIgaGlzdCA9IGRvYy5oaXN0b3J5LCBldmVudCwgc2VsQWZ0ZXIgPSBkb2Muc2VsOwogICAgdmFyIHNvdXJjZSA9IHR5cGUgPT0gInVuZG8iID8gaGlzdC5kb25lIDogaGlzdC51bmRvbmUsIGRlc3QgPSB0eXBlID09ICJ1bmRvIiA/IGhpc3QudW5kb25lIDogaGlzdC5kb25lOwoKICAgIC8vIFZlcmlmeSB0aGF0IHRoZXJlIGlzIGEgdXNlYWJsZSBldmVudCAoc28gdGhhdCBjdHJsLXogd29uJ3QKICAgIC8vIG5lZWRsZXNzbHkgY2xlYXIgc2VsZWN0aW9uIGV2ZW50cykKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc291cmNlLmxlbmd0aDsgaSsrKSB7CiAgICAgIGV2ZW50ID0gc291cmNlW2ldOwogICAgICBpZiAoYWxsb3dTZWxlY3Rpb25Pbmx5ID8gZXZlbnQucmFuZ2VzICYmICFldmVudC5lcXVhbHMoZG9jLnNlbCkgOiAhZXZlbnQucmFuZ2VzKQogICAgICAgIGJyZWFrOwogICAgfQogICAgaWYgKGkgPT0gc291cmNlLmxlbmd0aCkgcmV0dXJuOwogICAgaGlzdC5sYXN0T3JpZ2luID0gaGlzdC5sYXN0U2VsT3JpZ2luID0gbnVsbDsKCiAgICBmb3IgKDs7KSB7CiAgICAgIGV2ZW50ID0gc291cmNlLnBvcCgpOwogICAgICBpZiAoZXZlbnQucmFuZ2VzKSB7CiAgICAgICAgcHVzaFNlbGVjdGlvblRvSGlzdG9yeShldmVudCwgZGVzdCk7CiAgICAgICAgaWYgKGFsbG93U2VsZWN0aW9uT25seSAmJiAhZXZlbnQuZXF1YWxzKGRvYy5zZWwpKSB7CiAgICAgICAgICBzZXRTZWxlY3Rpb24oZG9jLCBldmVudCwge2NsZWFyUmVkbzogZmFsc2V9KTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgc2VsQWZ0ZXIgPSBldmVudDsKICAgICAgfQogICAgICBlbHNlIGJyZWFrOwogICAgfQoKICAgIC8vIEJ1aWxkIHVwIGEgcmV2ZXJzZSBjaGFuZ2Ugb2JqZWN0IHRvIGFkZCB0byB0aGUgb3Bwb3NpdGUgaGlzdG9yeQogICAgLy8gc3RhY2sgKHJlZG8gd2hlbiB1bmRvaW5nLCBhbmQgdmljZSB2ZXJzYSkuCiAgICB2YXIgYW50aUNoYW5nZXMgPSBbXTsKICAgIHB1c2hTZWxlY3Rpb25Ub0hpc3Rvcnkoc2VsQWZ0ZXIsIGRlc3QpOwogICAgZGVzdC5wdXNoKHtjaGFuZ2VzOiBhbnRpQ2hhbmdlcywgZ2VuZXJhdGlvbjogaGlzdC5nZW5lcmF0aW9ufSk7CiAgICBoaXN0LmdlbmVyYXRpb24gPSBldmVudC5nZW5lcmF0aW9uIHx8ICsraGlzdC5tYXhHZW5lcmF0aW9uOwoKICAgIHZhciBmaWx0ZXIgPSBoYXNIYW5kbGVyKGRvYywgImJlZm9yZUNoYW5nZSIpIHx8IGRvYy5jbSAmJiBoYXNIYW5kbGVyKGRvYy5jbSwgImJlZm9yZUNoYW5nZSIpOwoKICAgIGZvciAodmFyIGkgPSBldmVudC5jaGFuZ2VzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7CiAgICAgIHZhciBjaGFuZ2UgPSBldmVudC5jaGFuZ2VzW2ldOwogICAgICBjaGFuZ2Uub3JpZ2luID0gdHlwZTsKICAgICAgaWYgKGZpbHRlciAmJiAhZmlsdGVyQ2hhbmdlKGRvYywgY2hhbmdlLCBmYWxzZSkpIHsKICAgICAgICBzb3VyY2UubGVuZ3RoID0gMDsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIGFudGlDaGFuZ2VzLnB1c2goaGlzdG9yeUNoYW5nZUZyb21DaGFuZ2UoZG9jLCBjaGFuZ2UpKTsKCiAgICAgIHZhciBhZnRlciA9IGkgPyBjb21wdXRlU2VsQWZ0ZXJDaGFuZ2UoZG9jLCBjaGFuZ2UpIDogbHN0KHNvdXJjZSk7CiAgICAgIG1ha2VDaGFuZ2VTaW5nbGVEb2MoZG9jLCBjaGFuZ2UsIGFmdGVyLCBtZXJnZU9sZFNwYW5zKGRvYywgY2hhbmdlKSk7CiAgICAgIGlmICghaSAmJiBkb2MuY20pIGRvYy5jbS5zY3JvbGxJbnRvVmlldyhjaGFuZ2UpOwogICAgICB2YXIgcmViYXNlZCA9IFtdOwoKICAgICAgLy8gUHJvcGFnYXRlIHRvIHRoZSBsaW5rZWQgZG9jdW1lbnRzCiAgICAgIGxpbmtlZERvY3MoZG9jLCBmdW5jdGlvbihkb2MsIHNoYXJlZEhpc3QpIHsKICAgICAgICBpZiAoIXNoYXJlZEhpc3QgJiYgaW5kZXhPZihyZWJhc2VkLCBkb2MuaGlzdG9yeSkgPT0gLTEpIHsKICAgICAgICAgIHJlYmFzZUhpc3QoZG9jLmhpc3RvcnksIGNoYW5nZSk7CiAgICAgICAgICByZWJhc2VkLnB1c2goZG9jLmhpc3RvcnkpOwogICAgICAgIH0KICAgICAgICBtYWtlQ2hhbmdlU2luZ2xlRG9jKGRvYywgY2hhbmdlLCBudWxsLCBtZXJnZU9sZFNwYW5zKGRvYywgY2hhbmdlKSk7CiAgICAgIH0pOwogICAgfQogIH0KCiAgLy8gU3ViLXZpZXdzIG5lZWQgdGhlaXIgbGluZSBudW1iZXJzIHNoaWZ0ZWQgd2hlbiB0ZXh0IGlzIGFkZGVkCiAgLy8gYWJvdmUgb3IgYmVsb3cgdGhlbSBpbiB0aGUgcGFyZW50IGRvY3VtZW50LgogIGZ1bmN0aW9uIHNoaWZ0RG9jKGRvYywgZGlzdGFuY2UpIHsKICAgIGlmIChkaXN0YW5jZSA9PSAwKSByZXR1cm47CiAgICBkb2MuZmlyc3QgKz0gZGlzdGFuY2U7CiAgICBkb2Muc2VsID0gbmV3IFNlbGVjdGlvbihtYXAoZG9jLnNlbC5yYW5nZXMsIGZ1bmN0aW9uKHJhbmdlKSB7CiAgICAgIHJldHVybiBuZXcgUmFuZ2UoUG9zKHJhbmdlLmFuY2hvci5saW5lICsgZGlzdGFuY2UsIHJhbmdlLmFuY2hvci5jaCksCiAgICAgICAgICAgICAgICAgICAgICAgUG9zKHJhbmdlLmhlYWQubGluZSArIGRpc3RhbmNlLCByYW5nZS5oZWFkLmNoKSk7CiAgICB9KSwgZG9jLnNlbC5wcmltSW5kZXgpOwogICAgaWYgKGRvYy5jbSkgewogICAgICByZWdDaGFuZ2UoZG9jLmNtLCBkb2MuZmlyc3QsIGRvYy5maXJzdCAtIGRpc3RhbmNlLCBkaXN0YW5jZSk7CiAgICAgIGZvciAodmFyIGQgPSBkb2MuY20uZGlzcGxheSwgbCA9IGQudmlld0Zyb207IGwgPCBkLnZpZXdUbzsgbCsrKQogICAgICAgIHJlZ0xpbmVDaGFuZ2UoZG9jLmNtLCBsLCAiZ3V0dGVyIik7CiAgICB9CiAgfQoKICAvLyBNb3JlIGxvd2VyLWxldmVsIGNoYW5nZSBmdW5jdGlvbiwgaGFuZGxpbmcgb25seSBhIHNpbmdsZSBkb2N1bWVudAogIC8vIChub3QgbGlua2VkIG9uZXMpLgogIGZ1bmN0aW9uIG1ha2VDaGFuZ2VTaW5nbGVEb2MoZG9jLCBjaGFuZ2UsIHNlbEFmdGVyLCBzcGFucykgewogICAgaWYgKGRvYy5jbSAmJiAhZG9jLmNtLmN1ck9wKQogICAgICByZXR1cm4gb3BlcmF0aW9uKGRvYy5jbSwgbWFrZUNoYW5nZVNpbmdsZURvYykoZG9jLCBjaGFuZ2UsIHNlbEFmdGVyLCBzcGFucyk7CgogICAgaWYgKGNoYW5nZS50by5saW5lIDwgZG9jLmZpcnN0KSB7CiAgICAgIHNoaWZ0RG9jKGRvYywgY2hhbmdlLnRleHQubGVuZ3RoIC0gMSAtIChjaGFuZ2UudG8ubGluZSAtIGNoYW5nZS5mcm9tLmxpbmUpKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKGNoYW5nZS5mcm9tLmxpbmUgPiBkb2MubGFzdExpbmUoKSkgcmV0dXJuOwoKICAgIC8vIENsaXAgdGhlIGNoYW5nZSB0byB0aGUgc2l6ZSBvZiB0aGlzIGRvYwogICAgaWYgKGNoYW5nZS5mcm9tLmxpbmUgPCBkb2MuZmlyc3QpIHsKICAgICAgdmFyIHNoaWZ0ID0gY2hhbmdlLnRleHQubGVuZ3RoIC0gMSAtIChkb2MuZmlyc3QgLSBjaGFuZ2UuZnJvbS5saW5lKTsKICAgICAgc2hpZnREb2MoZG9jLCBzaGlmdCk7CiAgICAgIGNoYW5nZSA9IHtmcm9tOiBQb3MoZG9jLmZpcnN0LCAwKSwgdG86IFBvcyhjaGFuZ2UudG8ubGluZSArIHNoaWZ0LCBjaGFuZ2UudG8uY2gpLAogICAgICAgICAgICAgICAgdGV4dDogW2xzdChjaGFuZ2UudGV4dCldLCBvcmlnaW46IGNoYW5nZS5vcmlnaW59OwogICAgfQogICAgdmFyIGxhc3QgPSBkb2MubGFzdExpbmUoKTsKICAgIGlmIChjaGFuZ2UudG8ubGluZSA+IGxhc3QpIHsKICAgICAgY2hhbmdlID0ge2Zyb206IGNoYW5nZS5mcm9tLCB0bzogUG9zKGxhc3QsIGdldExpbmUoZG9jLCBsYXN0KS50ZXh0Lmxlbmd0aCksCiAgICAgICAgICAgICAgICB0ZXh0OiBbY2hhbmdlLnRleHRbMF1dLCBvcmlnaW46IGNoYW5nZS5vcmlnaW59OwogICAgfQoKICAgIGNoYW5nZS5yZW1vdmVkID0gZ2V0QmV0d2Vlbihkb2MsIGNoYW5nZS5mcm9tLCBjaGFuZ2UudG8pOwoKICAgIGlmICghc2VsQWZ0ZXIpIHNlbEFmdGVyID0gY29tcHV0ZVNlbEFmdGVyQ2hhbmdlKGRvYywgY2hhbmdlKTsKICAgIGlmIChkb2MuY20pIG1ha2VDaGFuZ2VTaW5nbGVEb2NJbkVkaXRvcihkb2MuY20sIGNoYW5nZSwgc3BhbnMpOwogICAgZWxzZSB1cGRhdGVEb2MoZG9jLCBjaGFuZ2UsIHNwYW5zKTsKICAgIHNldFNlbGVjdGlvbk5vVW5kbyhkb2MsIHNlbEFmdGVyLCBzZWxfZG9udFNjcm9sbCk7CiAgfQoKICAvLyBIYW5kbGUgdGhlIGludGVyYWN0aW9uIG9mIGEgY2hhbmdlIHRvIGEgZG9jdW1lbnQgd2l0aCB0aGUgZWRpdG9yCiAgLy8gdGhhdCB0aGlzIGRvY3VtZW50IGlzIHBhcnQgb2YuCiAgZnVuY3Rpb24gbWFrZUNoYW5nZVNpbmdsZURvY0luRWRpdG9yKGNtLCBjaGFuZ2UsIHNwYW5zKSB7CiAgICB2YXIgZG9jID0gY20uZG9jLCBkaXNwbGF5ID0gY20uZGlzcGxheSwgZnJvbSA9IGNoYW5nZS5mcm9tLCB0byA9IGNoYW5nZS50bzsKCiAgICB2YXIgcmVjb21wdXRlTWF4TGVuZ3RoID0gZmFsc2UsIGNoZWNrV2lkdGhTdGFydCA9IGZyb20ubGluZTsKICAgIGlmICghY20ub3B0aW9ucy5saW5lV3JhcHBpbmcpIHsKICAgICAgY2hlY2tXaWR0aFN0YXJ0ID0gbGluZU5vKHZpc3VhbExpbmUoZ2V0TGluZShkb2MsIGZyb20ubGluZSkpKTsKICAgICAgZG9jLml0ZXIoY2hlY2tXaWR0aFN0YXJ0LCB0by5saW5lICsgMSwgZnVuY3Rpb24obGluZSkgewogICAgICAgIGlmIChsaW5lID09IGRpc3BsYXkubWF4TGluZSkgewogICAgICAgICAgcmVjb21wdXRlTWF4TGVuZ3RoID0gdHJ1ZTsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CgogICAgaWYgKGRvYy5zZWwuY29udGFpbnMoY2hhbmdlLmZyb20sIGNoYW5nZS50bykgPiAtMSkKICAgICAgc2lnbmFsQ3Vyc29yQWN0aXZpdHkoY20pOwoKICAgIHVwZGF0ZURvYyhkb2MsIGNoYW5nZSwgc3BhbnMsIGVzdGltYXRlSGVpZ2h0KGNtKSk7CgogICAgaWYgKCFjbS5vcHRpb25zLmxpbmVXcmFwcGluZykgewogICAgICBkb2MuaXRlcihjaGVja1dpZHRoU3RhcnQsIGZyb20ubGluZSArIGNoYW5nZS50ZXh0Lmxlbmd0aCwgZnVuY3Rpb24obGluZSkgewogICAgICAgIHZhciBsZW4gPSBsaW5lTGVuZ3RoKGxpbmUpOwogICAgICAgIGlmIChsZW4gPiBkaXNwbGF5Lm1heExpbmVMZW5ndGgpIHsKICAgICAgICAgIGRpc3BsYXkubWF4TGluZSA9IGxpbmU7CiAgICAgICAgICBkaXNwbGF5Lm1heExpbmVMZW5ndGggPSBsZW47CiAgICAgICAgICBkaXNwbGF5Lm1heExpbmVDaGFuZ2VkID0gdHJ1ZTsKICAgICAgICAgIHJlY29tcHV0ZU1heExlbmd0aCA9IGZhbHNlOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIGlmIChyZWNvbXB1dGVNYXhMZW5ndGgpIGNtLmN1ck9wLnVwZGF0ZU1heExpbmUgPSB0cnVlOwogICAgfQoKICAgIC8vIEFkanVzdCBmcm9udGllciwgc2NoZWR1bGUgd29ya2VyCiAgICBkb2MuZnJvbnRpZXIgPSBNYXRoLm1pbihkb2MuZnJvbnRpZXIsIGZyb20ubGluZSk7CiAgICBzdGFydFdvcmtlcihjbSwgNDAwKTsKCiAgICB2YXIgbGVuZGlmZiA9IGNoYW5nZS50ZXh0Lmxlbmd0aCAtICh0by5saW5lIC0gZnJvbS5saW5lKSAtIDE7CiAgICAvLyBSZW1lbWJlciB0aGF0IHRoZXNlIGxpbmVzIGNoYW5nZWQsIGZvciB1cGRhdGluZyB0aGUgZGlzcGxheQogICAgaWYgKGZyb20ubGluZSA9PSB0by5saW5lICYmIGNoYW5nZS50ZXh0Lmxlbmd0aCA9PSAxICYmICFpc1dob2xlTGluZVVwZGF0ZShjbS5kb2MsIGNoYW5nZSkpCiAgICAgIHJlZ0xpbmVDaGFuZ2UoY20sIGZyb20ubGluZSwgInRleHQiKTsKICAgIGVsc2UKICAgICAgcmVnQ2hhbmdlKGNtLCBmcm9tLmxpbmUsIHRvLmxpbmUgKyAxLCBsZW5kaWZmKTsKCiAgICB2YXIgY2hhbmdlc0hhbmRsZXIgPSBoYXNIYW5kbGVyKGNtLCAiY2hhbmdlcyIpLCBjaGFuZ2VIYW5kbGVyID0gaGFzSGFuZGxlcihjbSwgImNoYW5nZSIpOwogICAgaWYgKGNoYW5nZUhhbmRsZXIgfHwgY2hhbmdlc0hhbmRsZXIpIHsKICAgICAgdmFyIG9iaiA9IHsKICAgICAgICBmcm9tOiBmcm9tLCB0bzogdG8sCiAgICAgICAgdGV4dDogY2hhbmdlLnRleHQsCiAgICAgICAgcmVtb3ZlZDogY2hhbmdlLnJlbW92ZWQsCiAgICAgICAgb3JpZ2luOiBjaGFuZ2Uub3JpZ2luCiAgICAgIH07CiAgICAgIGlmIChjaGFuZ2VIYW5kbGVyKSBzaWduYWxMYXRlcihjbSwgImNoYW5nZSIsIGNtLCBvYmopOwogICAgICBpZiAoY2hhbmdlc0hhbmRsZXIpIChjbS5jdXJPcC5jaGFuZ2VPYmpzIHx8IChjbS5jdXJPcC5jaGFuZ2VPYmpzID0gW10pKS5wdXNoKG9iaik7CiAgICB9CiAgICBjbS5kaXNwbGF5LnNlbEZvckNvbnRleHRNZW51ID0gbnVsbDsKICB9CgogIGZ1bmN0aW9uIHJlcGxhY2VSYW5nZShkb2MsIGNvZGUsIGZyb20sIHRvLCBvcmlnaW4pIHsKICAgIGlmICghdG8pIHRvID0gZnJvbTsKICAgIGlmIChjbXAodG8sIGZyb20pIDwgMCkgeyB2YXIgdG1wID0gdG87IHRvID0gZnJvbTsgZnJvbSA9IHRtcDsgfQogICAgaWYgKHR5cGVvZiBjb2RlID09ICJzdHJpbmciKSBjb2RlID0gc3BsaXRMaW5lcyhjb2RlKTsKICAgIG1ha2VDaGFuZ2UoZG9jLCB7ZnJvbTogZnJvbSwgdG86IHRvLCB0ZXh0OiBjb2RlLCBvcmlnaW46IG9yaWdpbn0pOwogIH0KCiAgLy8gU0NST0xMSU5HIFRISU5HUyBJTlRPIFZJRVcKCiAgLy8gSWYgYW4gZWRpdG9yIHNpdHMgb24gdGhlIHRvcCBvciBib3R0b20gb2YgdGhlIHdpbmRvdywgcGFydGlhbGx5CiAgLy8gc2Nyb2xsZWQgb3V0IG9mIHZpZXcsIHRoaXMgZW5zdXJlcyB0aGF0IHRoZSBjdXJzb3IgaXMgdmlzaWJsZS4KICBmdW5jdGlvbiBtYXliZVNjcm9sbFdpbmRvdyhjbSwgY29vcmRzKSB7CiAgICB2YXIgZGlzcGxheSA9IGNtLmRpc3BsYXksIGJveCA9IGRpc3BsYXkuc2l6ZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIGRvU2Nyb2xsID0gbnVsbDsKICAgIGlmIChjb29yZHMudG9wICsgYm94LnRvcCA8IDApIGRvU2Nyb2xsID0gdHJ1ZTsKICAgIGVsc2UgaWYgKGNvb3Jkcy5ib3R0b20gKyBib3gudG9wID4gKHdpbmRvdy5pbm5lckhlaWdodCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSkgZG9TY3JvbGwgPSBmYWxzZTsKICAgIGlmIChkb1Njcm9sbCAhPSBudWxsICYmICFwaGFudG9tKSB7CiAgICAgIHZhciBzY3JvbGxOb2RlID0gZWx0KCJkaXYiLCAiXHUyMDBiIiwgbnVsbCwgInBvc2l0aW9uOiBhYnNvbHV0ZTsgdG9wOiAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvb3Jkcy50b3AgLSBkaXNwbGF5LnZpZXdPZmZzZXQgLSBwYWRkaW5nVG9wKGNtLmRpc3BsYXkpKSArICJweDsgaGVpZ2h0OiAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvb3Jkcy5ib3R0b20gLSBjb29yZHMudG9wICsgc2Nyb2xsZXJDdXRPZmYpICsgInB4OyBsZWZ0OiAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29vcmRzLmxlZnQgKyAicHg7IHdpZHRoOiAycHg7Iik7CiAgICAgIGNtLmRpc3BsYXkubGluZVNwYWNlLmFwcGVuZENoaWxkKHNjcm9sbE5vZGUpOwogICAgICBzY3JvbGxOb2RlLnNjcm9sbEludG9WaWV3KGRvU2Nyb2xsKTsKICAgICAgY20uZGlzcGxheS5saW5lU3BhY2UucmVtb3ZlQ2hpbGQoc2Nyb2xsTm9kZSk7CiAgICB9CiAgfQoKICAvLyBTY3JvbGwgYSBnaXZlbiBwb3NpdGlvbiBpbnRvIHZpZXcgKGltbWVkaWF0ZWx5KSwgdmVyaWZ5aW5nIHRoYXQKICAvLyBpdCBhY3R1YWxseSBiZWNhbWUgdmlzaWJsZSAoYXMgbGluZSBoZWlnaHRzIGFyZSBhY2N1cmF0ZWx5CiAgLy8gbWVhc3VyZWQsIHRoZSBwb3NpdGlvbiBvZiBzb21ldGhpbmcgbWF5ICdkcmlmdCcgZHVyaW5nIGRyYXdpbmcpLgogIGZ1bmN0aW9uIHNjcm9sbFBvc0ludG9WaWV3KGNtLCBwb3MsIGVuZCwgbWFyZ2luKSB7CiAgICBpZiAobWFyZ2luID09IG51bGwpIG1hcmdpbiA9IDA7CiAgICBmb3IgKDs7KSB7CiAgICAgIHZhciBjaGFuZ2VkID0gZmFsc2UsIGNvb3JkcyA9IGN1cnNvckNvb3JkcyhjbSwgcG9zKTsKICAgICAgdmFyIGVuZENvb3JkcyA9ICFlbmQgfHwgZW5kID09IHBvcyA/IGNvb3JkcyA6IGN1cnNvckNvb3JkcyhjbSwgZW5kKTsKICAgICAgdmFyIHNjcm9sbFBvcyA9IGNhbGN1bGF0ZVNjcm9sbFBvcyhjbSwgTWF0aC5taW4oY29vcmRzLmxlZnQsIGVuZENvb3Jkcy5sZWZ0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLm1pbihjb29yZHMudG9wLCBlbmRDb29yZHMudG9wKSAtIG1hcmdpbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLm1heChjb29yZHMubGVmdCwgZW5kQ29vcmRzLmxlZnQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGgubWF4KGNvb3Jkcy5ib3R0b20sIGVuZENvb3Jkcy5ib3R0b20pICsgbWFyZ2luKTsKICAgICAgdmFyIHN0YXJ0VG9wID0gY20uZG9jLnNjcm9sbFRvcCwgc3RhcnRMZWZ0ID0gY20uZG9jLnNjcm9sbExlZnQ7CiAgICAgIGlmIChzY3JvbGxQb3Muc2Nyb2xsVG9wICE9IG51bGwpIHsKICAgICAgICBzZXRTY3JvbGxUb3AoY20sIHNjcm9sbFBvcy5zY3JvbGxUb3ApOwogICAgICAgIGlmIChNYXRoLmFicyhjbS5kb2Muc2Nyb2xsVG9wIC0gc3RhcnRUb3ApID4gMSkgY2hhbmdlZCA9IHRydWU7CiAgICAgIH0KICAgICAgaWYgKHNjcm9sbFBvcy5zY3JvbGxMZWZ0ICE9IG51bGwpIHsKICAgICAgICBzZXRTY3JvbGxMZWZ0KGNtLCBzY3JvbGxQb3Muc2Nyb2xsTGVmdCk7CiAgICAgICAgaWYgKE1hdGguYWJzKGNtLmRvYy5zY3JvbGxMZWZ0IC0gc3RhcnRMZWZ0KSA+IDEpIGNoYW5nZWQgPSB0cnVlOwogICAgICB9CiAgICAgIGlmICghY2hhbmdlZCkgcmV0dXJuIGNvb3JkczsKICAgIH0KICB9CgogIC8vIFNjcm9sbCBhIGdpdmVuIHNldCBvZiBjb29yZGluYXRlcyBpbnRvIHZpZXcgKGltbWVkaWF0ZWx5KS4KICBmdW5jdGlvbiBzY3JvbGxJbnRvVmlldyhjbSwgeDEsIHkxLCB4MiwgeTIpIHsKICAgIHZhciBzY3JvbGxQb3MgPSBjYWxjdWxhdGVTY3JvbGxQb3MoY20sIHgxLCB5MSwgeDIsIHkyKTsKICAgIGlmIChzY3JvbGxQb3Muc2Nyb2xsVG9wICE9IG51bGwpIHNldFNjcm9sbFRvcChjbSwgc2Nyb2xsUG9zLnNjcm9sbFRvcCk7CiAgICBpZiAoc2Nyb2xsUG9zLnNjcm9sbExlZnQgIT0gbnVsbCkgc2V0U2Nyb2xsTGVmdChjbSwgc2Nyb2xsUG9zLnNjcm9sbExlZnQpOwogIH0KCiAgLy8gQ2FsY3VsYXRlIGEgbmV3IHNjcm9sbCBwb3NpdGlvbiBuZWVkZWQgdG8gc2Nyb2xsIHRoZSBnaXZlbgogIC8vIHJlY3RhbmdsZSBpbnRvIHZpZXcuIFJldHVybnMgYW4gb2JqZWN0IHdpdGggc2Nyb2xsVG9wIGFuZAogIC8vIHNjcm9sbExlZnQgcHJvcGVydGllcy4gV2hlbiB0aGVzZSBhcmUgdW5kZWZpbmVkLCB0aGUKICAvLyB2ZXJ0aWNhbC9ob3Jpem9udGFsIHBvc2l0aW9uIGRvZXMgbm90IG5lZWQgdG8gYmUgYWRqdXN0ZWQuCiAgZnVuY3Rpb24gY2FsY3VsYXRlU2Nyb2xsUG9zKGNtLCB4MSwgeTEsIHgyLCB5MikgewogICAgdmFyIGRpc3BsYXkgPSBjbS5kaXNwbGF5LCBzbmFwTWFyZ2luID0gdGV4dEhlaWdodChjbS5kaXNwbGF5KTsKICAgIGlmICh5MSA8IDApIHkxID0gMDsKICAgIHZhciBzY3JlZW50b3AgPSBjbS5jdXJPcCAmJiBjbS5jdXJPcC5zY3JvbGxUb3AgIT0gbnVsbCA/IGNtLmN1ck9wLnNjcm9sbFRvcCA6IGRpc3BsYXkuc2Nyb2xsZXIuc2Nyb2xsVG9wOwogICAgdmFyIHNjcmVlbiA9IGRpc3BsYXkuc2Nyb2xsZXIuY2xpZW50SGVpZ2h0IC0gc2Nyb2xsZXJDdXRPZmYsIHJlc3VsdCA9IHt9OwogICAgdmFyIGRvY0JvdHRvbSA9IGNtLmRvYy5oZWlnaHQgKyBwYWRkaW5nVmVydChkaXNwbGF5KTsKICAgIHZhciBhdFRvcCA9IHkxIDwgc25hcE1hcmdpbiwgYXRCb3R0b20gPSB5MiA+IGRvY0JvdHRvbSAtIHNuYXBNYXJnaW47CiAgICBpZiAoeTEgPCBzY3JlZW50b3ApIHsKICAgICAgcmVzdWx0LnNjcm9sbFRvcCA9IGF0VG9wID8gMCA6IHkxOwogICAgfSBlbHNlIGlmICh5MiA+IHNjcmVlbnRvcCArIHNjcmVlbikgewogICAgICB2YXIgbmV3VG9wID0gTWF0aC5taW4oeTEsIChhdEJvdHRvbSA/IGRvY0JvdHRvbSA6IHkyKSAtIHNjcmVlbik7CiAgICAgIGlmIChuZXdUb3AgIT0gc2NyZWVudG9wKSByZXN1bHQuc2Nyb2xsVG9wID0gbmV3VG9wOwogICAgfQoKICAgIHZhciBzY3JlZW5sZWZ0ID0gY20uY3VyT3AgJiYgY20uY3VyT3Auc2Nyb2xsTGVmdCAhPSBudWxsID8gY20uY3VyT3Auc2Nyb2xsTGVmdCA6IGRpc3BsYXkuc2Nyb2xsZXIuc2Nyb2xsTGVmdDsKICAgIHZhciBzY3JlZW53ID0gZGlzcGxheS5zY3JvbGxlci5jbGllbnRXaWR0aCAtIHNjcm9sbGVyQ3V0T2ZmOwogICAgeDEgKz0gZGlzcGxheS5ndXR0ZXJzLm9mZnNldFdpZHRoOyB4MiArPSBkaXNwbGF5Lmd1dHRlcnMub2Zmc2V0V2lkdGg7CiAgICB2YXIgZ3V0dGVydyA9IGRpc3BsYXkuZ3V0dGVycy5vZmZzZXRXaWR0aDsKICAgIHZhciBhdExlZnQgPSB4MSA8IGd1dHRlcncgKyAxMDsKICAgIGlmICh4MSA8IHNjcmVlbmxlZnQgKyBndXR0ZXJ3IHx8IGF0TGVmdCkgewogICAgICBpZiAoYXRMZWZ0KSB4MSA9IDA7CiAgICAgIHJlc3VsdC5zY3JvbGxMZWZ0ID0gTWF0aC5tYXgoMCwgeDEgLSAxMCAtIGd1dHRlcncpOwogICAgfSBlbHNlIGlmICh4MiA+IHNjcmVlbncgKyBzY3JlZW5sZWZ0IC0gMykgewogICAgICByZXN1bHQuc2Nyb2xsTGVmdCA9IHgyICsgMTAgLSBzY3JlZW53OwogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIC8vIFN0b3JlIGEgcmVsYXRpdmUgYWRqdXN0bWVudCB0byB0aGUgc2Nyb2xsIHBvc2l0aW9uIGluIHRoZSBjdXJyZW50CiAgLy8gb3BlcmF0aW9uICh0byBiZSBhcHBsaWVkIHdoZW4gdGhlIG9wZXJhdGlvbiBmaW5pc2hlcykuCiAgZnVuY3Rpb24gYWRkVG9TY3JvbGxQb3MoY20sIGxlZnQsIHRvcCkgewogICAgaWYgKGxlZnQgIT0gbnVsbCB8fCB0b3AgIT0gbnVsbCkgcmVzb2x2ZVNjcm9sbFRvUG9zKGNtKTsKICAgIGlmIChsZWZ0ICE9IG51bGwpCiAgICAgIGNtLmN1ck9wLnNjcm9sbExlZnQgPSAoY20uY3VyT3Auc2Nyb2xsTGVmdCA9PSBudWxsID8gY20uZG9jLnNjcm9sbExlZnQgOiBjbS5jdXJPcC5zY3JvbGxMZWZ0KSArIGxlZnQ7CiAgICBpZiAodG9wICE9IG51bGwpCiAgICAgIGNtLmN1ck9wLnNjcm9sbFRvcCA9IChjbS5jdXJPcC5zY3JvbGxUb3AgPT0gbnVsbCA/IGNtLmRvYy5zY3JvbGxUb3AgOiBjbS5jdXJPcC5zY3JvbGxUb3ApICsgdG9wOwogIH0KCiAgLy8gTWFrZSBzdXJlIHRoYXQgYXQgdGhlIGVuZCBvZiB0aGUgb3BlcmF0aW9uIHRoZSBjdXJyZW50IGN1cnNvciBpcwogIC8vIHNob3duLgogIGZ1bmN0aW9uIGVuc3VyZUN1cnNvclZpc2libGUoY20pIHsKICAgIHJlc29sdmVTY3JvbGxUb1BvcyhjbSk7CiAgICB2YXIgY3VyID0gY20uZ2V0Q3Vyc29yKCksIGZyb20gPSBjdXIsIHRvID0gY3VyOwogICAgaWYgKCFjbS5vcHRpb25zLmxpbmVXcmFwcGluZykgewogICAgICBmcm9tID0gY3VyLmNoID8gUG9zKGN1ci5saW5lLCBjdXIuY2ggLSAxKSA6IGN1cjsKICAgICAgdG8gPSBQb3MoY3VyLmxpbmUsIGN1ci5jaCArIDEpOwogICAgfQogICAgY20uY3VyT3Auc2Nyb2xsVG9Qb3MgPSB7ZnJvbTogZnJvbSwgdG86IHRvLCBtYXJnaW46IGNtLm9wdGlvbnMuY3Vyc29yU2Nyb2xsTWFyZ2luLCBpc0N1cnNvcjogdHJ1ZX07CiAgfQoKICAvLyBXaGVuIGFuIG9wZXJhdGlvbiBoYXMgaXRzIHNjcm9sbFRvUG9zIHByb3BlcnR5IHNldCwgYW5kIGFub3RoZXIKICAvLyBzY3JvbGwgYWN0aW9uIGlzIGFwcGxpZWQgYmVmb3JlIHRoZSBlbmQgb2YgdGhlIG9wZXJhdGlvbiwgdGhpcwogIC8vICdzaW11bGF0ZXMnIHNjcm9sbGluZyB0aGF0IHBvc2l0aW9uIGludG8gdmlldyBpbiBhIGNoZWFwIHdheSwgc28KICAvLyB0aGF0IHRoZSBlZmZlY3Qgb2YgaW50ZXJtZWRpYXRlIHNjcm9sbCBjb21tYW5kcyBpcyBub3QgaWdub3JlZC4KICBmdW5jdGlvbiByZXNvbHZlU2Nyb2xsVG9Qb3MoY20pIHsKICAgIHZhciByYW5nZSA9IGNtLmN1ck9wLnNjcm9sbFRvUG9zOwogICAgaWYgKHJhbmdlKSB7CiAgICAgIGNtLmN1ck9wLnNjcm9sbFRvUG9zID0gbnVsbDsKICAgICAgdmFyIGZyb20gPSBlc3RpbWF0ZUNvb3JkcyhjbSwgcmFuZ2UuZnJvbSksIHRvID0gZXN0aW1hdGVDb29yZHMoY20sIHJhbmdlLnRvKTsKICAgICAgdmFyIHNQb3MgPSBjYWxjdWxhdGVTY3JvbGxQb3MoY20sIE1hdGgubWluKGZyb20ubGVmdCwgdG8ubGVmdCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGgubWluKGZyb20udG9wLCB0by50b3ApIC0gcmFuZ2UubWFyZ2luLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLm1heChmcm9tLnJpZ2h0LCB0by5yaWdodCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGgubWF4KGZyb20uYm90dG9tLCB0by5ib3R0b20pICsgcmFuZ2UubWFyZ2luKTsKICAgICAgY20uc2Nyb2xsVG8oc1Bvcy5zY3JvbGxMZWZ0LCBzUG9zLnNjcm9sbFRvcCk7CiAgICB9CiAgfQoKICAvLyBBUEkgVVRJTElUSUVTCgogIC8vIEluZGVudCB0aGUgZ2l2ZW4gbGluZS4gVGhlIGhvdyBwYXJhbWV0ZXIgY2FuIGJlICJzbWFydCIsCiAgLy8gImFkZCIvbnVsbCwgInN1YnRyYWN0Iiwgb3IgInByZXYiLiBXaGVuIGFnZ3Jlc3NpdmUgaXMgZmFsc2UKICAvLyAodHlwaWNhbGx5IHNldCB0byB0cnVlIGZvciBmb3JjZWQgc2luZ2xlLWxpbmUgaW5kZW50cyksIGVtcHR5CiAgLy8gbGluZXMgYXJlIG5vdCBpbmRlbnRlZCwgYW5kIHBsYWNlcyB3aGVyZSB0aGUgbW9kZSByZXR1cm5zIFBhc3MKICAvLyBhcmUgbGVmdCBhbG9uZS4KICBmdW5jdGlvbiBpbmRlbnRMaW5lKGNtLCBuLCBob3csIGFnZ3Jlc3NpdmUpIHsKICAgIHZhciBkb2MgPSBjbS5kb2MsIHN0YXRlOwogICAgaWYgKGhvdyA9PSBudWxsKSBob3cgPSAiYWRkIjsKICAgIGlmIChob3cgPT0gInNtYXJ0IikgewogICAgICAvLyBGYWxsIGJhY2sgdG8gInByZXYiIHdoZW4gdGhlIG1vZGUgZG9lc24ndCBoYXZlIGFuIGluZGVudGF0aW9uCiAgICAgIC8vIG1ldGhvZC4KICAgICAgaWYgKCFkb2MubW9kZS5pbmRlbnQpIGhvdyA9ICJwcmV2IjsKICAgICAgZWxzZSBzdGF0ZSA9IGdldFN0YXRlQmVmb3JlKGNtLCBuKTsKICAgIH0KCiAgICB2YXIgdGFiU2l6ZSA9IGNtLm9wdGlvbnMudGFiU2l6ZTsKICAgIHZhciBsaW5lID0gZ2V0TGluZShkb2MsIG4pLCBjdXJTcGFjZSA9IGNvdW50Q29sdW1uKGxpbmUudGV4dCwgbnVsbCwgdGFiU2l6ZSk7CiAgICBpZiAobGluZS5zdGF0ZUFmdGVyKSBsaW5lLnN0YXRlQWZ0ZXIgPSBudWxsOwogICAgdmFyIGN1clNwYWNlU3RyaW5nID0gbGluZS50ZXh0Lm1hdGNoKC9eXHMqLylbMF0sIGluZGVudGF0aW9uOwogICAgaWYgKCFhZ2dyZXNzaXZlICYmICEvXFMvLnRlc3QobGluZS50ZXh0KSkgewogICAgICBpbmRlbnRhdGlvbiA9IDA7CiAgICAgIGhvdyA9ICJub3QiOwogICAgfSBlbHNlIGlmIChob3cgPT0gInNtYXJ0IikgewogICAgICBpbmRlbnRhdGlvbiA9IGRvYy5tb2RlLmluZGVudChzdGF0ZSwgbGluZS50ZXh0LnNsaWNlKGN1clNwYWNlU3RyaW5nLmxlbmd0aCksIGxpbmUudGV4dCk7CiAgICAgIGlmIChpbmRlbnRhdGlvbiA9PSBQYXNzIHx8IGluZGVudGF0aW9uID4gMTUwKSB7CiAgICAgICAgaWYgKCFhZ2dyZXNzaXZlKSByZXR1cm47CiAgICAgICAgaG93ID0gInByZXYiOwogICAgICB9CiAgICB9CiAgICBpZiAoaG93ID09ICJwcmV2IikgewogICAgICBpZiAobiA+IGRvYy5maXJzdCkgaW5kZW50YXRpb24gPSBjb3VudENvbHVtbihnZXRMaW5lKGRvYywgbi0xKS50ZXh0LCBudWxsLCB0YWJTaXplKTsKICAgICAgZWxzZSBpbmRlbnRhdGlvbiA9IDA7CiAgICB9IGVsc2UgaWYgKGhvdyA9PSAiYWRkIikgewogICAgICBpbmRlbnRhdGlvbiA9IGN1clNwYWNlICsgY20ub3B0aW9ucy5pbmRlbnRVbml0OwogICAgfSBlbHNlIGlmIChob3cgPT0gInN1YnRyYWN0IikgewogICAgICBpbmRlbnRhdGlvbiA9IGN1clNwYWNlIC0gY20ub3B0aW9ucy5pbmRlbnRVbml0OwogICAgfSBlbHNlIGlmICh0eXBlb2YgaG93ID09ICJudW1iZXIiKSB7CiAgICAgIGluZGVudGF0aW9uID0gY3VyU3BhY2UgKyBob3c7CiAgICB9CiAgICBpbmRlbnRhdGlvbiA9IE1hdGgubWF4KDAsIGluZGVudGF0aW9uKTsKCiAgICB2YXIgaW5kZW50U3RyaW5nID0gIiIsIHBvcyA9IDA7CiAgICBpZiAoY20ub3B0aW9ucy5pbmRlbnRXaXRoVGFicykKICAgICAgZm9yICh2YXIgaSA9IE1hdGguZmxvb3IoaW5kZW50YXRpb24gLyB0YWJTaXplKTsgaTsgLS1pKSB7cG9zICs9IHRhYlNpemU7IGluZGVudFN0cmluZyArPSAiXHQiO30KICAgIGlmIChwb3MgPCBpbmRlbnRhdGlvbikgaW5kZW50U3RyaW5nICs9IHNwYWNlU3RyKGluZGVudGF0aW9uIC0gcG9zKTsKCiAgICBpZiAoaW5kZW50U3RyaW5nICE9IGN1clNwYWNlU3RyaW5nKSB7CiAgICAgIHJlcGxhY2VSYW5nZShkb2MsIGluZGVudFN0cmluZywgUG9zKG4sIDApLCBQb3MobiwgY3VyU3BhY2VTdHJpbmcubGVuZ3RoKSwgIitpbnB1dCIpOwogICAgfSBlbHNlIHsKICAgICAgLy8gRW5zdXJlIHRoYXQsIGlmIHRoZSBjdXJzb3Igd2FzIGluIHRoZSB3aGl0ZXNwYWNlIGF0IHRoZSBzdGFydAogICAgICAvLyBvZiB0aGUgbGluZSwgaXQgaXMgbW92ZWQgdG8gdGhlIGVuZCBvZiB0aGF0IHNwYWNlLgogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRvYy5zZWwucmFuZ2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIHJhbmdlID0gZG9jLnNlbC5yYW5nZXNbaV07CiAgICAgICAgaWYgKHJhbmdlLmhlYWQubGluZSA9PSBuICYmIHJhbmdlLmhlYWQuY2ggPCBjdXJTcGFjZVN0cmluZy5sZW5ndGgpIHsKICAgICAgICAgIHZhciBwb3MgPSBQb3MobiwgY3VyU3BhY2VTdHJpbmcubGVuZ3RoKTsKICAgICAgICAgIHJlcGxhY2VPbmVTZWxlY3Rpb24oZG9jLCBpLCBuZXcgUmFuZ2UocG9zLCBwb3MpKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgbGluZS5zdGF0ZUFmdGVyID0gbnVsbDsKICB9CgogIC8vIFV0aWxpdHkgZm9yIGFwcGx5aW5nIGEgY2hhbmdlIHRvIGEgbGluZSBieSBoYW5kbGUgb3IgbnVtYmVyLAogIC8vIHJldHVybmluZyB0aGUgbnVtYmVyIGFuZCBvcHRpb25hbGx5IHJlZ2lzdGVyaW5nIHRoZSBsaW5lIGFzCiAgLy8gY2hhbmdlZC4KICBmdW5jdGlvbiBjaGFuZ2VMaW5lKGRvYywgaGFuZGxlLCBjaGFuZ2VUeXBlLCBvcCkgewogICAgdmFyIG5vID0gaGFuZGxlLCBsaW5lID0gaGFuZGxlOwogICAgaWYgKHR5cGVvZiBoYW5kbGUgPT0gIm51bWJlciIpIGxpbmUgPSBnZXRMaW5lKGRvYywgY2xpcExpbmUoZG9jLCBoYW5kbGUpKTsKICAgIGVsc2Ugbm8gPSBsaW5lTm8oaGFuZGxlKTsKICAgIGlmIChubyA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIGlmIChvcChsaW5lLCBubykgJiYgZG9jLmNtKSByZWdMaW5lQ2hhbmdlKGRvYy5jbSwgbm8sIGNoYW5nZVR5cGUpOwogICAgcmV0dXJuIGxpbmU7CiAgfQoKICAvLyBIZWxwZXIgZm9yIGRlbGV0aW5nIHRleHQgbmVhciB0aGUgc2VsZWN0aW9uKHMpLCB1c2VkIHRvIGltcGxlbWVudAogIC8vIGJhY2tzcGFjZSwgZGVsZXRlLCBhbmQgc2ltaWxhciBmdW5jdGlvbmFsaXR5LgogIGZ1bmN0aW9uIGRlbGV0ZU5lYXJTZWxlY3Rpb24oY20sIGNvbXB1dGUpIHsKICAgIHZhciByYW5nZXMgPSBjbS5kb2Muc2VsLnJhbmdlcywga2lsbCA9IFtdOwogICAgLy8gQnVpbGQgdXAgYSBzZXQgb2YgcmFuZ2VzIHRvIGtpbGwgZmlyc3QsIG1lcmdpbmcgb3ZlcmxhcHBpbmcKICAgIC8vIHJhbmdlcy4KICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciB0b0tpbGwgPSBjb21wdXRlKHJhbmdlc1tpXSk7CiAgICAgIHdoaWxlIChraWxsLmxlbmd0aCAmJiBjbXAodG9LaWxsLmZyb20sIGxzdChraWxsKS50bykgPD0gMCkgewogICAgICAgIHZhciByZXBsYWNlZCA9IGtpbGwucG9wKCk7CiAgICAgICAgaWYgKGNtcChyZXBsYWNlZC5mcm9tLCB0b0tpbGwuZnJvbSkgPCAwKSB7CiAgICAgICAgICB0b0tpbGwuZnJvbSA9IHJlcGxhY2VkLmZyb207CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAga2lsbC5wdXNoKHRvS2lsbCk7CiAgICB9CiAgICAvLyBOZXh0LCByZW1vdmUgdGhvc2UgYWN0dWFsIHJhbmdlcy4KICAgIHJ1bkluT3AoY20sIGZ1bmN0aW9uKCkgewogICAgICBmb3IgKHZhciBpID0ga2lsbC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkKICAgICAgICByZXBsYWNlUmFuZ2UoY20uZG9jLCAiIiwga2lsbFtpXS5mcm9tLCBraWxsW2ldLnRvLCAiK2RlbGV0ZSIpOwogICAgICBlbnN1cmVDdXJzb3JWaXNpYmxlKGNtKTsKICAgIH0pOwogIH0KCiAgLy8gVXNlZCBmb3IgaG9yaXpvbnRhbCByZWxhdGl2ZSBtb3Rpb24uIERpciBpcyAtMSBvciAxIChsZWZ0IG9yCiAgLy8gcmlnaHQpLCB1bml0IGNhbiBiZSAiY2hhciIsICJjb2x1bW4iIChsaWtlIGNoYXIsIGJ1dCBkb2Vzbid0CiAgLy8gY3Jvc3MgbGluZSBib3VuZGFyaWVzKSwgIndvcmQiIChhY3Jvc3MgbmV4dCB3b3JkKSwgb3IgImdyb3VwIiAodG8KICAvLyB0aGUgc3RhcnQgb2YgbmV4dCBncm91cCBvZiB3b3JkIG9yIG5vbi13b3JkLW5vbi13aGl0ZXNwYWNlCiAgLy8gY2hhcnMpLiBUaGUgdmlzdWFsbHkgcGFyYW0gY29udHJvbHMgd2hldGhlciwgaW4gcmlnaHQtdG8tbGVmdAogIC8vIHRleHQsIGRpcmVjdGlvbiAxIG1lYW5zIHRvIG1vdmUgdG93YXJkcyB0aGUgbmV4dCBpbmRleCBpbiB0aGUKICAvLyBzdHJpbmcsIG9yIHRvd2FyZHMgdGhlIGNoYXJhY3RlciB0byB0aGUgcmlnaHQgb2YgdGhlIGN1cnJlbnQKICAvLyBwb3NpdGlvbi4gVGhlIHJlc3VsdGluZyBwb3NpdGlvbiB3aWxsIGhhdmUgYSBoaXRTaWRlPXRydWUKICAvLyBwcm9wZXJ0eSBpZiBpdCByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50LgogIGZ1bmN0aW9uIGZpbmRQb3NIKGRvYywgcG9zLCBkaXIsIHVuaXQsIHZpc3VhbGx5KSB7CiAgICB2YXIgbGluZSA9IHBvcy5saW5lLCBjaCA9IHBvcy5jaCwgb3JpZ0RpciA9IGRpcjsKICAgIHZhciBsaW5lT2JqID0gZ2V0TGluZShkb2MsIGxpbmUpOwogICAgdmFyIHBvc3NpYmxlID0gdHJ1ZTsKICAgIGZ1bmN0aW9uIGZpbmROZXh0TGluZSgpIHsKICAgICAgdmFyIGwgPSBsaW5lICsgZGlyOwogICAgICBpZiAobCA8IGRvYy5maXJzdCB8fCBsID49IGRvYy5maXJzdCArIGRvYy5zaXplKSByZXR1cm4gKHBvc3NpYmxlID0gZmFsc2UpOwogICAgICBsaW5lID0gbDsKICAgICAgcmV0dXJuIGxpbmVPYmogPSBnZXRMaW5lKGRvYywgbCk7CiAgICB9CiAgICBmdW5jdGlvbiBtb3ZlT25jZShib3VuZFRvTGluZSkgewogICAgICB2YXIgbmV4dCA9ICh2aXN1YWxseSA/IG1vdmVWaXN1YWxseSA6IG1vdmVMb2dpY2FsbHkpKGxpbmVPYmosIGNoLCBkaXIsIHRydWUpOwogICAgICBpZiAobmV4dCA9PSBudWxsKSB7CiAgICAgICAgaWYgKCFib3VuZFRvTGluZSAmJiBmaW5kTmV4dExpbmUoKSkgewogICAgICAgICAgaWYgKHZpc3VhbGx5KSBjaCA9IChkaXIgPCAwID8gbGluZVJpZ2h0IDogbGluZUxlZnQpKGxpbmVPYmopOwogICAgICAgICAgZWxzZSBjaCA9IGRpciA8IDAgPyBsaW5lT2JqLnRleHQubGVuZ3RoIDogMDsKICAgICAgICB9IGVsc2UgcmV0dXJuIChwb3NzaWJsZSA9IGZhbHNlKTsKICAgICAgfSBlbHNlIGNoID0gbmV4dDsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgaWYgKHVuaXQgPT0gImNoYXIiKSBtb3ZlT25jZSgpOwogICAgZWxzZSBpZiAodW5pdCA9PSAiY29sdW1uIikgbW92ZU9uY2UodHJ1ZSk7CiAgICBlbHNlIGlmICh1bml0ID09ICJ3b3JkIiB8fCB1bml0ID09ICJncm91cCIpIHsKICAgICAgdmFyIHNhd1R5cGUgPSBudWxsLCBncm91cCA9IHVuaXQgPT0gImdyb3VwIjsKICAgICAgdmFyIGhlbHBlciA9IGRvYy5jbSAmJiBkb2MuY20uZ2V0SGVscGVyKHBvcywgIndvcmRDaGFycyIpOwogICAgICBmb3IgKHZhciBmaXJzdCA9IHRydWU7OyBmaXJzdCA9IGZhbHNlKSB7CiAgICAgICAgaWYgKGRpciA8IDAgJiYgIW1vdmVPbmNlKCFmaXJzdCkpIGJyZWFrOwogICAgICAgIHZhciBjdXIgPSBsaW5lT2JqLnRleHQuY2hhckF0KGNoKSB8fCAiXG4iOwogICAgICAgIHZhciB0eXBlID0gaXNXb3JkQ2hhcihjdXIsIGhlbHBlcikgPyAidyIKICAgICAgICAgIDogZ3JvdXAgJiYgY3VyID09ICJcbiIgPyAibiIKICAgICAgICAgIDogIWdyb3VwIHx8IC9ccy8udGVzdChjdXIpID8gbnVsbAogICAgICAgICAgOiAicCI7CiAgICAgICAgaWYgKGdyb3VwICYmICFmaXJzdCAmJiAhdHlwZSkgdHlwZSA9ICJzIjsKICAgICAgICBpZiAoc2F3VHlwZSAmJiBzYXdUeXBlICE9IHR5cGUpIHsKICAgICAgICAgIGlmIChkaXIgPCAwKSB7ZGlyID0gMTsgbW92ZU9uY2UoKTt9CiAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIGlmICh0eXBlKSBzYXdUeXBlID0gdHlwZTsKICAgICAgICBpZiAoZGlyID4gMCAmJiAhbW92ZU9uY2UoIWZpcnN0KSkgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIHZhciByZXN1bHQgPSBza2lwQXRvbWljKGRvYywgUG9zKGxpbmUsIGNoKSwgb3JpZ0RpciwgdHJ1ZSk7CiAgICBpZiAoIXBvc3NpYmxlKSByZXN1bHQuaGl0U2lkZSA9IHRydWU7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgLy8gRm9yIHJlbGF0aXZlIHZlcnRpY2FsIG1vdmVtZW50LiBEaXIgbWF5IGJlIC0xIG9yIDEuIFVuaXQgY2FuIGJlCiAgLy8gInBhZ2UiIG9yICJsaW5lIi4gVGhlIHJlc3VsdGluZyBwb3NpdGlvbiB3aWxsIGhhdmUgYSBoaXRTaWRlPXRydWUKICAvLyBwcm9wZXJ0eSBpZiBpdCByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50LgogIGZ1bmN0aW9uIGZpbmRQb3NWKGNtLCBwb3MsIGRpciwgdW5pdCkgewogICAgdmFyIGRvYyA9IGNtLmRvYywgeCA9IHBvcy5sZWZ0LCB5OwogICAgaWYgKHVuaXQgPT0gInBhZ2UiKSB7CiAgICAgIHZhciBwYWdlU2l6ZSA9IE1hdGgubWluKGNtLmRpc3BsYXkud3JhcHBlci5jbGllbnRIZWlnaHQsIHdpbmRvdy5pbm5lckhlaWdodCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KTsKICAgICAgeSA9IHBvcy50b3AgKyBkaXIgKiAocGFnZVNpemUgLSAoZGlyIDwgMCA/IDEuNSA6IC41KSAqIHRleHRIZWlnaHQoY20uZGlzcGxheSkpOwogICAgfSBlbHNlIGlmICh1bml0ID09ICJsaW5lIikgewogICAgICB5ID0gZGlyID4gMCA/IHBvcy5ib3R0b20gKyAzIDogcG9zLnRvcCAtIDM7CiAgICB9CiAgICBmb3IgKDs7KSB7CiAgICAgIHZhciB0YXJnZXQgPSBjb29yZHNDaGFyKGNtLCB4LCB5KTsKICAgICAgaWYgKCF0YXJnZXQub3V0c2lkZSkgYnJlYWs7CiAgICAgIGlmIChkaXIgPCAwID8geSA8PSAwIDogeSA+PSBkb2MuaGVpZ2h0KSB7IHRhcmdldC5oaXRTaWRlID0gdHJ1ZTsgYnJlYWs7IH0KICAgICAgeSArPSBkaXIgKiA1OwogICAgfQogICAgcmV0dXJuIHRhcmdldDsKICB9CgogIC8vIEZpbmQgdGhlIHdvcmQgYXQgdGhlIGdpdmVuIHBvc2l0aW9uIChhcyByZXR1cm5lZCBieSBjb29yZHNDaGFyKS4KICBmdW5jdGlvbiBmaW5kV29yZEF0KGNtLCBwb3MpIHsKICAgIHZhciBkb2MgPSBjbS5kb2MsIGxpbmUgPSBnZXRMaW5lKGRvYywgcG9zLmxpbmUpLnRleHQ7CiAgICB2YXIgc3RhcnQgPSBwb3MuY2gsIGVuZCA9IHBvcy5jaDsKICAgIGlmIChsaW5lKSB7CiAgICAgIHZhciBoZWxwZXIgPSBjbS5nZXRIZWxwZXIocG9zLCAid29yZENoYXJzIik7CiAgICAgIGlmICgocG9zLnhSZWwgPCAwIHx8IGVuZCA9PSBsaW5lLmxlbmd0aCkgJiYgc3RhcnQpIC0tc3RhcnQ7IGVsc2UgKytlbmQ7CiAgICAgIHZhciBzdGFydENoYXIgPSBsaW5lLmNoYXJBdChzdGFydCk7CiAgICAgIHZhciBjaGVjayA9IGlzV29yZENoYXIoc3RhcnRDaGFyLCBoZWxwZXIpCiAgICAgICAgPyBmdW5jdGlvbihjaCkgeyByZXR1cm4gaXNXb3JkQ2hhcihjaCwgaGVscGVyKTsgfQogICAgICAgIDogL1xzLy50ZXN0KHN0YXJ0Q2hhcikgPyBmdW5jdGlvbihjaCkge3JldHVybiAvXHMvLnRlc3QoY2gpO30KICAgICAgICA6IGZ1bmN0aW9uKGNoKSB7cmV0dXJuICEvXHMvLnRlc3QoY2gpICYmICFpc1dvcmRDaGFyKGNoKTt9OwogICAgICB3aGlsZSAoc3RhcnQgPiAwICYmIGNoZWNrKGxpbmUuY2hhckF0KHN0YXJ0IC0gMSkpKSAtLXN0YXJ0OwogICAgICB3aGlsZSAoZW5kIDwgbGluZS5sZW5ndGggJiYgY2hlY2sobGluZS5jaGFyQXQoZW5kKSkpICsrZW5kOwogICAgfQogICAgcmV0dXJuIG5ldyBSYW5nZShQb3MocG9zLmxpbmUsIHN0YXJ0KSwgUG9zKHBvcy5saW5lLCBlbmQpKTsKICB9CgogIC8vIEVESVRPUiBNRVRIT0RTCgogIC8vIFRoZSBwdWJsaWNseSB2aXNpYmxlIEFQSS4gTm90ZSB0aGF0IG1ldGhvZE9wKGYpIG1lYW5zCiAgLy8gJ3dyYXAgZiBpbiBhbiBvcGVyYXRpb24sIHBlcmZvcm1lZCBvbiBpdHMgYHRoaXNgIHBhcmFtZXRlcicuCgogIC8vIFRoaXMgaXMgbm90IHRoZSBjb21wbGV0ZSBzZXQgb2YgZWRpdG9yIG1ldGhvZHMuIE1vc3Qgb2YgdGhlCiAgLy8gbWV0aG9kcyBkZWZpbmVkIG9uIHRoZSBEb2MgdHlwZSBhcmUgYWxzbyBpbmplY3RlZCBpbnRvCiAgLy8gQ29kZU1pcnJvci5wcm90b3R5cGUsIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBhbmQKICAvLyBjb252ZW5pZW5jZS4KCiAgQ29kZU1pcnJvci5wcm90b3R5cGUgPSB7CiAgICBjb25zdHJ1Y3RvcjogQ29kZU1pcnJvciwKICAgIGZvY3VzOiBmdW5jdGlvbigpe3dpbmRvdy5mb2N1cygpOyBmb2N1c0lucHV0KHRoaXMpOyBmYXN0UG9sbCh0aGlzKTt9LAoKICAgIHNldE9wdGlvbjogZnVuY3Rpb24ob3B0aW9uLCB2YWx1ZSkgewogICAgICB2YXIgb3B0aW9ucyA9IHRoaXMub3B0aW9ucywgb2xkID0gb3B0aW9uc1tvcHRpb25dOwogICAgICBpZiAob3B0aW9uc1tvcHRpb25dID09IHZhbHVlICYmIG9wdGlvbiAhPSAibW9kZSIpIHJldHVybjsKICAgICAgb3B0aW9uc1tvcHRpb25dID0gdmFsdWU7CiAgICAgIGlmIChvcHRpb25IYW5kbGVycy5oYXNPd25Qcm9wZXJ0eShvcHRpb24pKQogICAgICAgIG9wZXJhdGlvbih0aGlzLCBvcHRpb25IYW5kbGVyc1tvcHRpb25dKSh0aGlzLCB2YWx1ZSwgb2xkKTsKICAgIH0sCgogICAgZ2V0T3B0aW9uOiBmdW5jdGlvbihvcHRpb24pIHtyZXR1cm4gdGhpcy5vcHRpb25zW29wdGlvbl07fSwKICAgIGdldERvYzogZnVuY3Rpb24oKSB7cmV0dXJuIHRoaXMuZG9jO30sCgogICAgYWRkS2V5TWFwOiBmdW5jdGlvbihtYXAsIGJvdHRvbSkgewogICAgICB0aGlzLnN0YXRlLmtleU1hcHNbYm90dG9tID8gInB1c2giIDogInVuc2hpZnQiXShtYXApOwogICAgfSwKICAgIHJlbW92ZUtleU1hcDogZnVuY3Rpb24obWFwKSB7CiAgICAgIHZhciBtYXBzID0gdGhpcy5zdGF0ZS5rZXlNYXBzOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1hcHMubGVuZ3RoOyArK2kpCiAgICAgICAgaWYgKG1hcHNbaV0gPT0gbWFwIHx8ICh0eXBlb2YgbWFwc1tpXSAhPSAic3RyaW5nIiAmJiBtYXBzW2ldLm5hbWUgPT0gbWFwKSkgewogICAgICAgICAgbWFwcy5zcGxpY2UoaSwgMSk7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICB9LAoKICAgIGFkZE92ZXJsYXk6IG1ldGhvZE9wKGZ1bmN0aW9uKHNwZWMsIG9wdGlvbnMpIHsKICAgICAgdmFyIG1vZGUgPSBzcGVjLnRva2VuID8gc3BlYyA6IENvZGVNaXJyb3IuZ2V0TW9kZSh0aGlzLm9wdGlvbnMsIHNwZWMpOwogICAgICBpZiAobW9kZS5zdGFydFN0YXRlKSB0aHJvdyBuZXcgRXJyb3IoIk92ZXJsYXlzIG1heSBub3QgYmUgc3RhdGVmdWwuIik7CiAgICAgIHRoaXMuc3RhdGUub3ZlcmxheXMucHVzaCh7bW9kZTogbW9kZSwgbW9kZVNwZWM6IHNwZWMsIG9wYXF1ZTogb3B0aW9ucyAmJiBvcHRpb25zLm9wYXF1ZX0pOwogICAgICB0aGlzLnN0YXRlLm1vZGVHZW4rKzsKICAgICAgcmVnQ2hhbmdlKHRoaXMpOwogICAgfSksCiAgICByZW1vdmVPdmVybGF5OiBtZXRob2RPcChmdW5jdGlvbihzcGVjKSB7CiAgICAgIHZhciBvdmVybGF5cyA9IHRoaXMuc3RhdGUub3ZlcmxheXM7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb3ZlcmxheXMubGVuZ3RoOyArK2kpIHsKICAgICAgICB2YXIgY3VyID0gb3ZlcmxheXNbaV0ubW9kZVNwZWM7CiAgICAgICAgaWYgKGN1ciA9PSBzcGVjIHx8IHR5cGVvZiBzcGVjID09ICJzdHJpbmciICYmIGN1ci5uYW1lID09IHNwZWMpIHsKICAgICAgICAgIG92ZXJsYXlzLnNwbGljZShpLCAxKTsKICAgICAgICAgIHRoaXMuc3RhdGUubW9kZUdlbisrOwogICAgICAgICAgcmVnQ2hhbmdlKHRoaXMpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgfQogICAgfSksCgogICAgaW5kZW50TGluZTogbWV0aG9kT3AoZnVuY3Rpb24obiwgZGlyLCBhZ2dyZXNzaXZlKSB7CiAgICAgIGlmICh0eXBlb2YgZGlyICE9ICJzdHJpbmciICYmIHR5cGVvZiBkaXIgIT0gIm51bWJlciIpIHsKICAgICAgICBpZiAoZGlyID09IG51bGwpIGRpciA9IHRoaXMub3B0aW9ucy5zbWFydEluZGVudCA/ICJzbWFydCIgOiAicHJldiI7CiAgICAgICAgZWxzZSBkaXIgPSBkaXIgPyAiYWRkIiA6ICJzdWJ0cmFjdCI7CiAgICAgIH0KICAgICAgaWYgKGlzTGluZSh0aGlzLmRvYywgbikpIGluZGVudExpbmUodGhpcywgbiwgZGlyLCBhZ2dyZXNzaXZlKTsKICAgIH0pLAogICAgaW5kZW50U2VsZWN0aW9uOiBtZXRob2RPcChmdW5jdGlvbihob3cpIHsKICAgICAgdmFyIHJhbmdlcyA9IHRoaXMuZG9jLnNlbC5yYW5nZXMsIGVuZCA9IC0xOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJhbmdlcy5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciByYW5nZSA9IHJhbmdlc1tpXTsKICAgICAgICBpZiAoIXJhbmdlLmVtcHR5KCkpIHsKICAgICAgICAgIHZhciBzdGFydCA9IE1hdGgubWF4KGVuZCwgcmFuZ2UuZnJvbSgpLmxpbmUpOwogICAgICAgICAgdmFyIHRvID0gcmFuZ2UudG8oKTsKICAgICAgICAgIGVuZCA9IE1hdGgubWluKHRoaXMubGFzdExpbmUoKSwgdG8ubGluZSAtICh0by5jaCA/IDAgOiAxKSkgKyAxOwogICAgICAgICAgZm9yICh2YXIgaiA9IHN0YXJ0OyBqIDwgZW5kOyArK2opCiAgICAgICAgICAgIGluZGVudExpbmUodGhpcywgaiwgaG93KTsKICAgICAgICB9IGVsc2UgaWYgKHJhbmdlLmhlYWQubGluZSA+IGVuZCkgewogICAgICAgICAgaW5kZW50TGluZSh0aGlzLCByYW5nZS5oZWFkLmxpbmUsIGhvdywgdHJ1ZSk7CiAgICAgICAgICBlbmQgPSByYW5nZS5oZWFkLmxpbmU7CiAgICAgICAgICBpZiAoaSA9PSB0aGlzLmRvYy5zZWwucHJpbUluZGV4KSBlbnN1cmVDdXJzb3JWaXNpYmxlKHRoaXMpOwogICAgICAgIH0KICAgICAgfQogICAgfSksCgogICAgLy8gRmV0Y2ggdGhlIHBhcnNlciB0b2tlbiBmb3IgYSBnaXZlbiBjaGFyYWN0ZXIuIFVzZWZ1bCBmb3IgaGFja3MKICAgIC8vIHRoYXQgd2FudCB0byBpbnNwZWN0IHRoZSBtb2RlIHN0YXRlIChzYXksIGZvciBjb21wbGV0aW9uKS4KICAgIGdldFRva2VuQXQ6IGZ1bmN0aW9uKHBvcywgcHJlY2lzZSkgewogICAgICB2YXIgZG9jID0gdGhpcy5kb2M7CiAgICAgIHBvcyA9IGNsaXBQb3MoZG9jLCBwb3MpOwogICAgICB2YXIgc3RhdGUgPSBnZXRTdGF0ZUJlZm9yZSh0aGlzLCBwb3MubGluZSwgcHJlY2lzZSksIG1vZGUgPSB0aGlzLmRvYy5tb2RlOwogICAgICB2YXIgbGluZSA9IGdldExpbmUoZG9jLCBwb3MubGluZSk7CiAgICAgIHZhciBzdHJlYW0gPSBuZXcgU3RyaW5nU3RyZWFtKGxpbmUudGV4dCwgdGhpcy5vcHRpb25zLnRhYlNpemUpOwogICAgICB3aGlsZSAoc3RyZWFtLnBvcyA8IHBvcy5jaCAmJiAhc3RyZWFtLmVvbCgpKSB7CiAgICAgICAgc3RyZWFtLnN0YXJ0ID0gc3RyZWFtLnBvczsKICAgICAgICB2YXIgc3R5bGUgPSByZWFkVG9rZW4obW9kZSwgc3RyZWFtLCBzdGF0ZSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHtzdGFydDogc3RyZWFtLnN0YXJ0LAogICAgICAgICAgICAgIGVuZDogc3RyZWFtLnBvcywKICAgICAgICAgICAgICBzdHJpbmc6IHN0cmVhbS5jdXJyZW50KCksCiAgICAgICAgICAgICAgdHlwZTogc3R5bGUgfHwgbnVsbCwKICAgICAgICAgICAgICBzdGF0ZTogc3RhdGV9OwogICAgfSwKCiAgICBnZXRUb2tlblR5cGVBdDogZnVuY3Rpb24ocG9zKSB7CiAgICAgIHBvcyA9IGNsaXBQb3ModGhpcy5kb2MsIHBvcyk7CiAgICAgIHZhciBzdHlsZXMgPSBnZXRMaW5lU3R5bGVzKHRoaXMsIGdldExpbmUodGhpcy5kb2MsIHBvcy5saW5lKSk7CiAgICAgIHZhciBiZWZvcmUgPSAwLCBhZnRlciA9IChzdHlsZXMubGVuZ3RoIC0gMSkgLyAyLCBjaCA9IHBvcy5jaDsKICAgICAgdmFyIHR5cGU7CiAgICAgIGlmIChjaCA9PSAwKSB0eXBlID0gc3R5bGVzWzJdOwogICAgICBlbHNlIGZvciAoOzspIHsKICAgICAgICB2YXIgbWlkID0gKGJlZm9yZSArIGFmdGVyKSA+PiAxOwogICAgICAgIGlmICgobWlkID8gc3R5bGVzW21pZCAqIDIgLSAxXSA6IDApID49IGNoKSBhZnRlciA9IG1pZDsKICAgICAgICBlbHNlIGlmIChzdHlsZXNbbWlkICogMiArIDFdIDwgY2gpIGJlZm9yZSA9IG1pZCArIDE7CiAgICAgICAgZWxzZSB7IHR5cGUgPSBzdHlsZXNbbWlkICogMiArIDJdOyBicmVhazsgfQogICAgICB9CiAgICAgIHZhciBjdXQgPSB0eXBlID8gdHlwZS5pbmRleE9mKCJjbS1vdmVybGF5ICIpIDogLTE7CiAgICAgIHJldHVybiBjdXQgPCAwID8gdHlwZSA6IGN1dCA9PSAwID8gbnVsbCA6IHR5cGUuc2xpY2UoMCwgY3V0IC0gMSk7CiAgICB9LAoKICAgIGdldE1vZGVBdDogZnVuY3Rpb24ocG9zKSB7CiAgICAgIHZhciBtb2RlID0gdGhpcy5kb2MubW9kZTsKICAgICAgaWYgKCFtb2RlLmlubmVyTW9kZSkgcmV0dXJuIG1vZGU7CiAgICAgIHJldHVybiBDb2RlTWlycm9yLmlubmVyTW9kZShtb2RlLCB0aGlzLmdldFRva2VuQXQocG9zKS5zdGF0ZSkubW9kZTsKICAgIH0sCgogICAgZ2V0SGVscGVyOiBmdW5jdGlvbihwb3MsIHR5cGUpIHsKICAgICAgcmV0dXJuIHRoaXMuZ2V0SGVscGVycyhwb3MsIHR5cGUpWzBdOwogICAgfSwKCiAgICBnZXRIZWxwZXJzOiBmdW5jdGlvbihwb3MsIHR5cGUpIHsKICAgICAgdmFyIGZvdW5kID0gW107CiAgICAgIGlmICghaGVscGVycy5oYXNPd25Qcm9wZXJ0eSh0eXBlKSkgcmV0dXJuIGhlbHBlcnM7CiAgICAgIHZhciBoZWxwID0gaGVscGVyc1t0eXBlXSwgbW9kZSA9IHRoaXMuZ2V0TW9kZUF0KHBvcyk7CiAgICAgIGlmICh0eXBlb2YgbW9kZVt0eXBlXSA9PSAic3RyaW5nIikgewogICAgICAgIGlmIChoZWxwW21vZGVbdHlwZV1dKSBmb3VuZC5wdXNoKGhlbHBbbW9kZVt0eXBlXV0pOwogICAgICB9IGVsc2UgaWYgKG1vZGVbdHlwZV0pIHsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1vZGVbdHlwZV0ubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHZhciB2YWwgPSBoZWxwW21vZGVbdHlwZV1baV1dOwogICAgICAgICAgaWYgKHZhbCkgZm91bmQucHVzaCh2YWwpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChtb2RlLmhlbHBlclR5cGUgJiYgaGVscFttb2RlLmhlbHBlclR5cGVdKSB7CiAgICAgICAgZm91bmQucHVzaChoZWxwW21vZGUuaGVscGVyVHlwZV0pOwogICAgICB9IGVsc2UgaWYgKGhlbHBbbW9kZS5uYW1lXSkgewogICAgICAgIGZvdW5kLnB1c2goaGVscFttb2RlLm5hbWVdKTsKICAgICAgfQogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhlbHAuX2dsb2JhbC5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciBjdXIgPSBoZWxwLl9nbG9iYWxbaV07CiAgICAgICAgaWYgKGN1ci5wcmVkKG1vZGUsIHRoaXMpICYmIGluZGV4T2YoZm91bmQsIGN1ci52YWwpID09IC0xKQogICAgICAgICAgZm91bmQucHVzaChjdXIudmFsKTsKICAgICAgfQogICAgICByZXR1cm4gZm91bmQ7CiAgICB9LAoKICAgIGdldFN0YXRlQWZ0ZXI6IGZ1bmN0aW9uKGxpbmUsIHByZWNpc2UpIHsKICAgICAgdmFyIGRvYyA9IHRoaXMuZG9jOwogICAgICBsaW5lID0gY2xpcExpbmUoZG9jLCBsaW5lID09IG51bGwgPyBkb2MuZmlyc3QgKyBkb2Muc2l6ZSAtIDE6IGxpbmUpOwogICAgICByZXR1cm4gZ2V0U3RhdGVCZWZvcmUodGhpcywgbGluZSArIDEsIHByZWNpc2UpOwogICAgfSwKCiAgICBjdXJzb3JDb29yZHM6IGZ1bmN0aW9uKHN0YXJ0LCBtb2RlKSB7CiAgICAgIHZhciBwb3MsIHJhbmdlID0gdGhpcy5kb2Muc2VsLnByaW1hcnkoKTsKICAgICAgaWYgKHN0YXJ0ID09IG51bGwpIHBvcyA9IHJhbmdlLmhlYWQ7CiAgICAgIGVsc2UgaWYgKHR5cGVvZiBzdGFydCA9PSAib2JqZWN0IikgcG9zID0gY2xpcFBvcyh0aGlzLmRvYywgc3RhcnQpOwogICAgICBlbHNlIHBvcyA9IHN0YXJ0ID8gcmFuZ2UuZnJvbSgpIDogcmFuZ2UudG8oKTsKICAgICAgcmV0dXJuIGN1cnNvckNvb3Jkcyh0aGlzLCBwb3MsIG1vZGUgfHwgInBhZ2UiKTsKICAgIH0sCgogICAgY2hhckNvb3JkczogZnVuY3Rpb24ocG9zLCBtb2RlKSB7CiAgICAgIHJldHVybiBjaGFyQ29vcmRzKHRoaXMsIGNsaXBQb3ModGhpcy5kb2MsIHBvcyksIG1vZGUgfHwgInBhZ2UiKTsKICAgIH0sCgogICAgY29vcmRzQ2hhcjogZnVuY3Rpb24oY29vcmRzLCBtb2RlKSB7CiAgICAgIGNvb3JkcyA9IGZyb21Db29yZFN5c3RlbSh0aGlzLCBjb29yZHMsIG1vZGUgfHwgInBhZ2UiKTsKICAgICAgcmV0dXJuIGNvb3Jkc0NoYXIodGhpcywgY29vcmRzLmxlZnQsIGNvb3Jkcy50b3ApOwogICAgfSwKCiAgICBsaW5lQXRIZWlnaHQ6IGZ1bmN0aW9uKGhlaWdodCwgbW9kZSkgewogICAgICBoZWlnaHQgPSBmcm9tQ29vcmRTeXN0ZW0odGhpcywge3RvcDogaGVpZ2h0LCBsZWZ0OiAwfSwgbW9kZSB8fCAicGFnZSIpLnRvcDsKICAgICAgcmV0dXJuIGxpbmVBdEhlaWdodCh0aGlzLmRvYywgaGVpZ2h0ICsgdGhpcy5kaXNwbGF5LnZpZXdPZmZzZXQpOwogICAgfSwKICAgIGhlaWdodEF0TGluZTogZnVuY3Rpb24obGluZSwgbW9kZSkgewogICAgICB2YXIgZW5kID0gZmFsc2UsIGxhc3QgPSB0aGlzLmRvYy5maXJzdCArIHRoaXMuZG9jLnNpemUgLSAxOwogICAgICBpZiAobGluZSA8IHRoaXMuZG9jLmZpcnN0KSBsaW5lID0gdGhpcy5kb2MuZmlyc3Q7CiAgICAgIGVsc2UgaWYgKGxpbmUgPiBsYXN0KSB7IGxpbmUgPSBsYXN0OyBlbmQgPSB0cnVlOyB9CiAgICAgIHZhciBsaW5lT2JqID0gZ2V0TGluZSh0aGlzLmRvYywgbGluZSk7CiAgICAgIHJldHVybiBpbnRvQ29vcmRTeXN0ZW0odGhpcywgbGluZU9iaiwge3RvcDogMCwgbGVmdDogMH0sIG1vZGUgfHwgInBhZ2UiKS50b3AgKwogICAgICAgIChlbmQgPyB0aGlzLmRvYy5oZWlnaHQgLSBoZWlnaHRBdExpbmUobGluZU9iaikgOiAwKTsKICAgIH0sCgogICAgZGVmYXVsdFRleHRIZWlnaHQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGV4dEhlaWdodCh0aGlzLmRpc3BsYXkpOyB9LAogICAgZGVmYXVsdENoYXJXaWR0aDogZnVuY3Rpb24oKSB7IHJldHVybiBjaGFyV2lkdGgodGhpcy5kaXNwbGF5KTsgfSwKCiAgICBzZXRHdXR0ZXJNYXJrZXI6IG1ldGhvZE9wKGZ1bmN0aW9uKGxpbmUsIGd1dHRlcklELCB2YWx1ZSkgewogICAgICByZXR1cm4gY2hhbmdlTGluZSh0aGlzLmRvYywgbGluZSwgImd1dHRlciIsIGZ1bmN0aW9uKGxpbmUpIHsKICAgICAgICB2YXIgbWFya2VycyA9IGxpbmUuZ3V0dGVyTWFya2VycyB8fCAobGluZS5ndXR0ZXJNYXJrZXJzID0ge30pOwogICAgICAgIG1hcmtlcnNbZ3V0dGVySURdID0gdmFsdWU7CiAgICAgICAgaWYgKCF2YWx1ZSAmJiBpc0VtcHR5KG1hcmtlcnMpKSBsaW5lLmd1dHRlck1hcmtlcnMgPSBudWxsOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9KTsKICAgIH0pLAoKICAgIGNsZWFyR3V0dGVyOiBtZXRob2RPcChmdW5jdGlvbihndXR0ZXJJRCkgewogICAgICB2YXIgY20gPSB0aGlzLCBkb2MgPSBjbS5kb2MsIGkgPSBkb2MuZmlyc3Q7CiAgICAgIGRvYy5pdGVyKGZ1bmN0aW9uKGxpbmUpIHsKICAgICAgICBpZiAobGluZS5ndXR0ZXJNYXJrZXJzICYmIGxpbmUuZ3V0dGVyTWFya2Vyc1tndXR0ZXJJRF0pIHsKICAgICAgICAgIGxpbmUuZ3V0dGVyTWFya2Vyc1tndXR0ZXJJRF0gPSBudWxsOwogICAgICAgICAgcmVnTGluZUNoYW5nZShjbSwgaSwgImd1dHRlciIpOwogICAgICAgICAgaWYgKGlzRW1wdHkobGluZS5ndXR0ZXJNYXJrZXJzKSkgbGluZS5ndXR0ZXJNYXJrZXJzID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgKytpOwogICAgICB9KTsKICAgIH0pLAoKICAgIGFkZExpbmVXaWRnZXQ6IG1ldGhvZE9wKGZ1bmN0aW9uKGhhbmRsZSwgbm9kZSwgb3B0aW9ucykgewogICAgICByZXR1cm4gYWRkTGluZVdpZGdldCh0aGlzLCBoYW5kbGUsIG5vZGUsIG9wdGlvbnMpOwogICAgfSksCgogICAgcmVtb3ZlTGluZVdpZGdldDogZnVuY3Rpb24od2lkZ2V0KSB7IHdpZGdldC5jbGVhcigpOyB9LAoKICAgIGxpbmVJbmZvOiBmdW5jdGlvbihsaW5lKSB7CiAgICAgIGlmICh0eXBlb2YgbGluZSA9PSAibnVtYmVyIikgewogICAgICAgIGlmICghaXNMaW5lKHRoaXMuZG9jLCBsaW5lKSkgcmV0dXJuIG51bGw7CiAgICAgICAgdmFyIG4gPSBsaW5lOwogICAgICAgIGxpbmUgPSBnZXRMaW5lKHRoaXMuZG9jLCBsaW5lKTsKICAgICAgICBpZiAoIWxpbmUpIHJldHVybiBudWxsOwogICAgICB9IGVsc2UgewogICAgICAgIHZhciBuID0gbGluZU5vKGxpbmUpOwogICAgICAgIGlmIChuID09IG51bGwpIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIHJldHVybiB7bGluZTogbiwgaGFuZGxlOiBsaW5lLCB0ZXh0OiBsaW5lLnRleHQsIGd1dHRlck1hcmtlcnM6IGxpbmUuZ3V0dGVyTWFya2VycywKICAgICAgICAgICAgICB0ZXh0Q2xhc3M6IGxpbmUudGV4dENsYXNzLCBiZ0NsYXNzOiBsaW5lLmJnQ2xhc3MsIHdyYXBDbGFzczogbGluZS53cmFwQ2xhc3MsCiAgICAgICAgICAgICAgd2lkZ2V0czogbGluZS53aWRnZXRzfTsKICAgIH0sCgogICAgZ2V0Vmlld3BvcnQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4ge2Zyb206IHRoaXMuZGlzcGxheS52aWV3RnJvbSwgdG86IHRoaXMuZGlzcGxheS52aWV3VG99O30sCgogICAgYWRkV2lkZ2V0OiBmdW5jdGlvbihwb3MsIG5vZGUsIHNjcm9sbCwgdmVydCwgaG9yaXopIHsKICAgICAgdmFyIGRpc3BsYXkgPSB0aGlzLmRpc3BsYXk7CiAgICAgIHBvcyA9IGN1cnNvckNvb3Jkcyh0aGlzLCBjbGlwUG9zKHRoaXMuZG9jLCBwb3MpKTsKICAgICAgdmFyIHRvcCA9IHBvcy5ib3R0b20sIGxlZnQgPSBwb3MubGVmdDsKICAgICAgbm9kZS5zdHlsZS5wb3NpdGlvbiA9ICJhYnNvbHV0ZSI7CiAgICAgIGRpc3BsYXkuc2l6ZXIuYXBwZW5kQ2hpbGQobm9kZSk7CiAgICAgIGlmICh2ZXJ0ID09ICJvdmVyIikgewogICAgICAgIHRvcCA9IHBvcy50b3A7CiAgICAgIH0gZWxzZSBpZiAodmVydCA9PSAiYWJvdmUiIHx8IHZlcnQgPT0gIm5lYXIiKSB7CiAgICAgICAgdmFyIHZzcGFjZSA9IE1hdGgubWF4KGRpc3BsYXkud3JhcHBlci5jbGllbnRIZWlnaHQsIHRoaXMuZG9jLmhlaWdodCksCiAgICAgICAgaHNwYWNlID0gTWF0aC5tYXgoZGlzcGxheS5zaXplci5jbGllbnRXaWR0aCwgZGlzcGxheS5saW5lU3BhY2UuY2xpZW50V2lkdGgpOwogICAgICAgIC8vIERlZmF1bHQgdG8gcG9zaXRpb25pbmcgYWJvdmUgKGlmIHNwZWNpZmllZCBhbmQgcG9zc2libGUpOyBvdGhlcndpc2UgZGVmYXVsdCB0byBwb3NpdGlvbmluZyBiZWxvdwogICAgICAgIGlmICgodmVydCA9PSAnYWJvdmUnIHx8IHBvcy5ib3R0b20gKyBub2RlLm9mZnNldEhlaWdodCA+IHZzcGFjZSkgJiYgcG9zLnRvcCA+IG5vZGUub2Zmc2V0SGVpZ2h0KQogICAgICAgICAgdG9wID0gcG9zLnRvcCAtIG5vZGUub2Zmc2V0SGVpZ2h0OwogICAgICAgIGVsc2UgaWYgKHBvcy5ib3R0b20gKyBub2RlLm9mZnNldEhlaWdodCA8PSB2c3BhY2UpCiAgICAgICAgICB0b3AgPSBwb3MuYm90dG9tOwogICAgICAgIGlmIChsZWZ0ICsgbm9kZS5vZmZzZXRXaWR0aCA+IGhzcGFjZSkKICAgICAgICAgIGxlZnQgPSBoc3BhY2UgLSBub2RlLm9mZnNldFdpZHRoOwogICAgICB9CiAgICAgIG5vZGUuc3R5bGUudG9wID0gdG9wICsgInB4IjsKICAgICAgbm9kZS5zdHlsZS5sZWZ0ID0gbm9kZS5zdHlsZS5yaWdodCA9ICIiOwogICAgICBpZiAoaG9yaXogPT0gInJpZ2h0IikgewogICAgICAgIGxlZnQgPSBkaXNwbGF5LnNpemVyLmNsaWVudFdpZHRoIC0gbm9kZS5vZmZzZXRXaWR0aDsKICAgICAgICBub2RlLnN0eWxlLnJpZ2h0ID0gIjBweCI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGhvcml6ID09ICJsZWZ0IikgbGVmdCA9IDA7CiAgICAgICAgZWxzZSBpZiAoaG9yaXogPT0gIm1pZGRsZSIpIGxlZnQgPSAoZGlzcGxheS5zaXplci5jbGllbnRXaWR0aCAtIG5vZGUub2Zmc2V0V2lkdGgpIC8gMjsKICAgICAgICBub2RlLnN0eWxlLmxlZnQgPSBsZWZ0ICsgInB4IjsKICAgICAgfQogICAgICBpZiAoc2Nyb2xsKQogICAgICAgIHNjcm9sbEludG9WaWV3KHRoaXMsIGxlZnQsIHRvcCwgbGVmdCArIG5vZGUub2Zmc2V0V2lkdGgsIHRvcCArIG5vZGUub2Zmc2V0SGVpZ2h0KTsKICAgIH0sCgogICAgdHJpZ2dlck9uS2V5RG93bjogbWV0aG9kT3Aob25LZXlEb3duKSwKICAgIHRyaWdnZXJPbktleVByZXNzOiBtZXRob2RPcChvbktleVByZXNzKSwKICAgIHRyaWdnZXJPbktleVVwOiBvbktleVVwLAoKICAgIGV4ZWNDb21tYW5kOiBmdW5jdGlvbihjbWQpIHsKICAgICAgaWYgKGNvbW1hbmRzLmhhc093blByb3BlcnR5KGNtZCkpCiAgICAgICAgcmV0dXJuIGNvbW1hbmRzW2NtZF0odGhpcyk7CiAgICB9LAoKICAgIGZpbmRQb3NIOiBmdW5jdGlvbihmcm9tLCBhbW91bnQsIHVuaXQsIHZpc3VhbGx5KSB7CiAgICAgIHZhciBkaXIgPSAxOwogICAgICBpZiAoYW1vdW50IDwgMCkgeyBkaXIgPSAtMTsgYW1vdW50ID0gLWFtb3VudDsgfQogICAgICBmb3IgKHZhciBpID0gMCwgY3VyID0gY2xpcFBvcyh0aGlzLmRvYywgZnJvbSk7IGkgPCBhbW91bnQ7ICsraSkgewogICAgICAgIGN1ciA9IGZpbmRQb3NIKHRoaXMuZG9jLCBjdXIsIGRpciwgdW5pdCwgdmlzdWFsbHkpOwogICAgICAgIGlmIChjdXIuaGl0U2lkZSkgYnJlYWs7CiAgICAgIH0KICAgICAgcmV0dXJuIGN1cjsKICAgIH0sCgogICAgbW92ZUg6IG1ldGhvZE9wKGZ1bmN0aW9uKGRpciwgdW5pdCkgewogICAgICB2YXIgY20gPSB0aGlzOwogICAgICBjbS5leHRlbmRTZWxlY3Rpb25zQnkoZnVuY3Rpb24ocmFuZ2UpIHsKICAgICAgICBpZiAoY20uZGlzcGxheS5zaGlmdCB8fCBjbS5kb2MuZXh0ZW5kIHx8IHJhbmdlLmVtcHR5KCkpCiAgICAgICAgICByZXR1cm4gZmluZFBvc0goY20uZG9jLCByYW5nZS5oZWFkLCBkaXIsIHVuaXQsIGNtLm9wdGlvbnMucnRsTW92ZVZpc3VhbGx5KTsKICAgICAgICBlbHNlCiAgICAgICAgICByZXR1cm4gZGlyIDwgMCA/IHJhbmdlLmZyb20oKSA6IHJhbmdlLnRvKCk7CiAgICAgIH0sIHNlbF9tb3ZlKTsKICAgIH0pLAoKICAgIGRlbGV0ZUg6IG1ldGhvZE9wKGZ1bmN0aW9uKGRpciwgdW5pdCkgewogICAgICB2YXIgc2VsID0gdGhpcy5kb2Muc2VsLCBkb2MgPSB0aGlzLmRvYzsKICAgICAgaWYgKHNlbC5zb21ldGhpbmdTZWxlY3RlZCgpKQogICAgICAgIGRvYy5yZXBsYWNlU2VsZWN0aW9uKCIiLCBudWxsLCAiK2RlbGV0ZSIpOwogICAgICBlbHNlCiAgICAgICAgZGVsZXRlTmVhclNlbGVjdGlvbih0aGlzLCBmdW5jdGlvbihyYW5nZSkgewogICAgICAgICAgdmFyIG90aGVyID0gZmluZFBvc0goZG9jLCByYW5nZS5oZWFkLCBkaXIsIHVuaXQsIGZhbHNlKTsKICAgICAgICAgIHJldHVybiBkaXIgPCAwID8ge2Zyb206IG90aGVyLCB0bzogcmFuZ2UuaGVhZH0gOiB7ZnJvbTogcmFuZ2UuaGVhZCwgdG86IG90aGVyfTsKICAgICAgICB9KTsKICAgIH0pLAoKICAgIGZpbmRQb3NWOiBmdW5jdGlvbihmcm9tLCBhbW91bnQsIHVuaXQsIGdvYWxDb2x1bW4pIHsKICAgICAgdmFyIGRpciA9IDEsIHggPSBnb2FsQ29sdW1uOwogICAgICBpZiAoYW1vdW50IDwgMCkgeyBkaXIgPSAtMTsgYW1vdW50ID0gLWFtb3VudDsgfQogICAgICBmb3IgKHZhciBpID0gMCwgY3VyID0gY2xpcFBvcyh0aGlzLmRvYywgZnJvbSk7IGkgPCBhbW91bnQ7ICsraSkgewogICAgICAgIHZhciBjb29yZHMgPSBjdXJzb3JDb29yZHModGhpcywgY3VyLCAiZGl2Iik7CiAgICAgICAgaWYgKHggPT0gbnVsbCkgeCA9IGNvb3Jkcy5sZWZ0OwogICAgICAgIGVsc2UgY29vcmRzLmxlZnQgPSB4OwogICAgICAgIGN1ciA9IGZpbmRQb3NWKHRoaXMsIGNvb3JkcywgZGlyLCB1bml0KTsKICAgICAgICBpZiAoY3VyLmhpdFNpZGUpIGJyZWFrOwogICAgICB9CiAgICAgIHJldHVybiBjdXI7CiAgICB9LAoKICAgIG1vdmVWOiBtZXRob2RPcChmdW5jdGlvbihkaXIsIHVuaXQpIHsKICAgICAgdmFyIGNtID0gdGhpcywgZG9jID0gdGhpcy5kb2MsIGdvYWxzID0gW107CiAgICAgIHZhciBjb2xsYXBzZSA9ICFjbS5kaXNwbGF5LnNoaWZ0ICYmICFkb2MuZXh0ZW5kICYmIGRvYy5zZWwuc29tZXRoaW5nU2VsZWN0ZWQoKTsKICAgICAgZG9jLmV4dGVuZFNlbGVjdGlvbnNCeShmdW5jdGlvbihyYW5nZSkgewogICAgICAgIGlmIChjb2xsYXBzZSkKICAgICAgICAgIHJldHVybiBkaXIgPCAwID8gcmFuZ2UuZnJvbSgpIDogcmFuZ2UudG8oKTsKICAgICAgICB2YXIgaGVhZFBvcyA9IGN1cnNvckNvb3JkcyhjbSwgcmFuZ2UuaGVhZCwgImRpdiIpOwogICAgICAgIGlmIChyYW5nZS5nb2FsQ29sdW1uICE9IG51bGwpIGhlYWRQb3MubGVmdCA9IHJhbmdlLmdvYWxDb2x1bW47CiAgICAgICAgZ29hbHMucHVzaChoZWFkUG9zLmxlZnQpOwogICAgICAgIHZhciBwb3MgPSBmaW5kUG9zVihjbSwgaGVhZFBvcywgZGlyLCB1bml0KTsKICAgICAgICBpZiAodW5pdCA9PSAicGFnZSIgJiYgcmFuZ2UgPT0gZG9jLnNlbC5wcmltYXJ5KCkpCiAgICAgICAgICBhZGRUb1Njcm9sbFBvcyhjbSwgbnVsbCwgY2hhckNvb3JkcyhjbSwgcG9zLCAiZGl2IikudG9wIC0gaGVhZFBvcy50b3ApOwogICAgICAgIHJldHVybiBwb3M7CiAgICAgIH0sIHNlbF9tb3ZlKTsKICAgICAgaWYgKGdvYWxzLmxlbmd0aCkgZm9yICh2YXIgaSA9IDA7IGkgPCBkb2Muc2VsLnJhbmdlcy5sZW5ndGg7IGkrKykKICAgICAgICBkb2Muc2VsLnJhbmdlc1tpXS5nb2FsQ29sdW1uID0gZ29hbHNbaV07CiAgICB9KSwKCiAgICB0b2dnbGVPdmVyd3JpdGU6IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgIGlmICh2YWx1ZSAhPSBudWxsICYmIHZhbHVlID09IHRoaXMuc3RhdGUub3ZlcndyaXRlKSByZXR1cm47CiAgICAgIGlmICh0aGlzLnN0YXRlLm92ZXJ3cml0ZSA9ICF0aGlzLnN0YXRlLm92ZXJ3cml0ZSkKICAgICAgICBhZGRDbGFzcyh0aGlzLmRpc3BsYXkuY3Vyc29yRGl2LCAiQ29kZU1pcnJvci1vdmVyd3JpdGUiKTsKICAgICAgZWxzZQogICAgICAgIHJtQ2xhc3ModGhpcy5kaXNwbGF5LmN1cnNvckRpdiwgIkNvZGVNaXJyb3Itb3ZlcndyaXRlIik7CgogICAgICBzaWduYWwodGhpcywgIm92ZXJ3cml0ZVRvZ2dsZSIsIHRoaXMsIHRoaXMuc3RhdGUub3ZlcndyaXRlKTsKICAgIH0sCiAgICBoYXNGb2N1czogZnVuY3Rpb24oKSB7IHJldHVybiBhY3RpdmVFbHQoKSA9PSB0aGlzLmRpc3BsYXkuaW5wdXQ7IH0sCgogICAgc2Nyb2xsVG86IG1ldGhvZE9wKGZ1bmN0aW9uKHgsIHkpIHsKICAgICAgaWYgKHggIT0gbnVsbCB8fCB5ICE9IG51bGwpIHJlc29sdmVTY3JvbGxUb1Bvcyh0aGlzKTsKICAgICAgaWYgKHggIT0gbnVsbCkgdGhpcy5jdXJPcC5zY3JvbGxMZWZ0ID0geDsKICAgICAgaWYgKHkgIT0gbnVsbCkgdGhpcy5jdXJPcC5zY3JvbGxUb3AgPSB5OwogICAgfSksCiAgICBnZXRTY3JvbGxJbmZvOiBmdW5jdGlvbigpIHsKICAgICAgdmFyIHNjcm9sbGVyID0gdGhpcy5kaXNwbGF5LnNjcm9sbGVyLCBjbyA9IHNjcm9sbGVyQ3V0T2ZmOwogICAgICByZXR1cm4ge2xlZnQ6IHNjcm9sbGVyLnNjcm9sbExlZnQsIHRvcDogc2Nyb2xsZXIuc2Nyb2xsVG9wLAogICAgICAgICAgICAgIGhlaWdodDogc2Nyb2xsZXIuc2Nyb2xsSGVpZ2h0IC0gY28sIHdpZHRoOiBzY3JvbGxlci5zY3JvbGxXaWR0aCAtIGNvLAogICAgICAgICAgICAgIGNsaWVudEhlaWdodDogc2Nyb2xsZXIuY2xpZW50SGVpZ2h0IC0gY28sIGNsaWVudFdpZHRoOiBzY3JvbGxlci5jbGllbnRXaWR0aCAtIGNvfTsKICAgIH0sCgogICAgc2Nyb2xsSW50b1ZpZXc6IG1ldGhvZE9wKGZ1bmN0aW9uKHJhbmdlLCBtYXJnaW4pIHsKICAgICAgaWYgKHJhbmdlID09IG51bGwpIHsKICAgICAgICByYW5nZSA9IHtmcm9tOiB0aGlzLmRvYy5zZWwucHJpbWFyeSgpLmhlYWQsIHRvOiBudWxsfTsKICAgICAgICBpZiAobWFyZ2luID09IG51bGwpIG1hcmdpbiA9IHRoaXMub3B0aW9ucy5jdXJzb3JTY3JvbGxNYXJnaW47CiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHJhbmdlID09ICJudW1iZXIiKSB7CiAgICAgICAgcmFuZ2UgPSB7ZnJvbTogUG9zKHJhbmdlLCAwKSwgdG86IG51bGx9OwogICAgICB9IGVsc2UgaWYgKHJhbmdlLmZyb20gPT0gbnVsbCkgewogICAgICAgIHJhbmdlID0ge2Zyb206IHJhbmdlLCB0bzogbnVsbH07CiAgICAgIH0KICAgICAgaWYgKCFyYW5nZS50bykgcmFuZ2UudG8gPSByYW5nZS5mcm9tOwogICAgICByYW5nZS5tYXJnaW4gPSBtYXJnaW4gfHwgMDsKCiAgICAgIGlmIChyYW5nZS5mcm9tLmxpbmUgIT0gbnVsbCkgewogICAgICAgIHJlc29sdmVTY3JvbGxUb1Bvcyh0aGlzKTsKICAgICAgICB0aGlzLmN1ck9wLnNjcm9sbFRvUG9zID0gcmFuZ2U7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIHNQb3MgPSBjYWxjdWxhdGVTY3JvbGxQb3ModGhpcywgTWF0aC5taW4ocmFuZ2UuZnJvbS5sZWZ0LCByYW5nZS50by5sZWZ0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLm1pbihyYW5nZS5mcm9tLnRvcCwgcmFuZ2UudG8udG9wKSAtIHJhbmdlLm1hcmdpbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLm1heChyYW5nZS5mcm9tLnJpZ2h0LCByYW5nZS50by5yaWdodCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5tYXgocmFuZ2UuZnJvbS5ib3R0b20sIHJhbmdlLnRvLmJvdHRvbSkgKyByYW5nZS5tYXJnaW4pOwogICAgICAgIHRoaXMuc2Nyb2xsVG8oc1Bvcy5zY3JvbGxMZWZ0LCBzUG9zLnNjcm9sbFRvcCk7CiAgICAgIH0KICAgIH0pLAoKICAgIHNldFNpemU6IG1ldGhvZE9wKGZ1bmN0aW9uKHdpZHRoLCBoZWlnaHQpIHsKICAgICAgdmFyIGNtID0gdGhpczsKICAgICAgZnVuY3Rpb24gaW50ZXJwcmV0KHZhbCkgewogICAgICAgIHJldHVybiB0eXBlb2YgdmFsID09ICJudW1iZXIiIHx8IC9eXGQrJC8udGVzdChTdHJpbmcodmFsKSkgPyB2YWwgKyAicHgiIDogdmFsOwogICAgICB9CiAgICAgIGlmICh3aWR0aCAhPSBudWxsKSBjbS5kaXNwbGF5LndyYXBwZXIuc3R5bGUud2lkdGggPSBpbnRlcnByZXQod2lkdGgpOwogICAgICBpZiAoaGVpZ2h0ICE9IG51bGwpIGNtLmRpc3BsYXkud3JhcHBlci5zdHlsZS5oZWlnaHQgPSBpbnRlcnByZXQoaGVpZ2h0KTsKICAgICAgaWYgKGNtLm9wdGlvbnMubGluZVdyYXBwaW5nKSBjbGVhckxpbmVNZWFzdXJlbWVudENhY2hlKHRoaXMpOwogICAgICB2YXIgbGluZU5vID0gY20uZGlzcGxheS52aWV3RnJvbTsKICAgICAgY20uZG9jLml0ZXIobGluZU5vLCBjbS5kaXNwbGF5LnZpZXdUbywgZnVuY3Rpb24obGluZSkgewogICAgICAgIGlmIChsaW5lLndpZGdldHMpIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZS53aWRnZXRzLmxlbmd0aDsgaSsrKQogICAgICAgICAgaWYgKGxpbmUud2lkZ2V0c1tpXS5ub0hTY3JvbGwpIHsgcmVnTGluZUNoYW5nZShjbSwgbGluZU5vLCAid2lkZ2V0Iik7IGJyZWFrOyB9CiAgICAgICAgKytsaW5lTm87CiAgICAgIH0pOwogICAgICBjbS5jdXJPcC5mb3JjZVVwZGF0ZSA9IHRydWU7CiAgICAgIHNpZ25hbChjbSwgInJlZnJlc2giLCB0aGlzKTsKICAgIH0pLAoKICAgIG9wZXJhdGlvbjogZnVuY3Rpb24oZil7cmV0dXJuIHJ1bkluT3AodGhpcywgZik7fSwKCiAgICByZWZyZXNoOiBtZXRob2RPcChmdW5jdGlvbigpIHsKICAgICAgdmFyIG9sZEhlaWdodCA9IHRoaXMuZGlzcGxheS5jYWNoZWRUZXh0SGVpZ2h0OwogICAgICByZWdDaGFuZ2UodGhpcyk7CiAgICAgIHRoaXMuY3VyT3AuZm9yY2VVcGRhdGUgPSB0cnVlOwogICAgICBjbGVhckNhY2hlcyh0aGlzKTsKICAgICAgdGhpcy5zY3JvbGxUbyh0aGlzLmRvYy5zY3JvbGxMZWZ0LCB0aGlzLmRvYy5zY3JvbGxUb3ApOwogICAgICB1cGRhdGVHdXR0ZXJTcGFjZSh0aGlzKTsKICAgICAgaWYgKG9sZEhlaWdodCA9PSBudWxsIHx8IE1hdGguYWJzKG9sZEhlaWdodCAtIHRleHRIZWlnaHQodGhpcy5kaXNwbGF5KSkgPiAuNSkKICAgICAgICBlc3RpbWF0ZUxpbmVIZWlnaHRzKHRoaXMpOwogICAgICBzaWduYWwodGhpcywgInJlZnJlc2giLCB0aGlzKTsKICAgIH0pLAoKICAgIHN3YXBEb2M6IG1ldGhvZE9wKGZ1bmN0aW9uKGRvYykgewogICAgICB2YXIgb2xkID0gdGhpcy5kb2M7CiAgICAgIG9sZC5jbSA9IG51bGw7CiAgICAgIGF0dGFjaERvYyh0aGlzLCBkb2MpOwogICAgICBjbGVhckNhY2hlcyh0aGlzKTsKICAgICAgcmVzZXRJbnB1dCh0aGlzKTsKICAgICAgdGhpcy5zY3JvbGxUbyhkb2Muc2Nyb2xsTGVmdCwgZG9jLnNjcm9sbFRvcCk7CiAgICAgIHNpZ25hbExhdGVyKHRoaXMsICJzd2FwRG9jIiwgdGhpcywgb2xkKTsKICAgICAgcmV0dXJuIG9sZDsKICAgIH0pLAoKICAgIGdldElucHV0RmllbGQ6IGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGlzcGxheS5pbnB1dDt9LAogICAgZ2V0V3JhcHBlckVsZW1lbnQ6IGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGlzcGxheS53cmFwcGVyO30sCiAgICBnZXRTY3JvbGxlckVsZW1lbnQ6IGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGlzcGxheS5zY3JvbGxlcjt9LAogICAgZ2V0R3V0dGVyRWxlbWVudDogZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kaXNwbGF5Lmd1dHRlcnM7fQogIH07CiAgZXZlbnRNaXhpbihDb2RlTWlycm9yKTsKCiAgLy8gT1BUSU9OIERFRkFVTFRTCgogIC8vIFRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gb3B0aW9ucy4KICB2YXIgZGVmYXVsdHMgPSBDb2RlTWlycm9yLmRlZmF1bHRzID0ge307CiAgLy8gRnVuY3Rpb25zIHRvIHJ1biB3aGVuIG9wdGlvbnMgYXJlIGNoYW5nZWQuCiAgdmFyIG9wdGlvbkhhbmRsZXJzID0gQ29kZU1pcnJvci5vcHRpb25IYW5kbGVycyA9IHt9OwoKICBmdW5jdGlvbiBvcHRpb24obmFtZSwgZGVmbHQsIGhhbmRsZSwgbm90T25Jbml0KSB7CiAgICBDb2RlTWlycm9yLmRlZmF1bHRzW25hbWVdID0gZGVmbHQ7CiAgICBpZiAoaGFuZGxlKSBvcHRpb25IYW5kbGVyc1tuYW1lXSA9CiAgICAgIG5vdE9uSW5pdCA/IGZ1bmN0aW9uKGNtLCB2YWwsIG9sZCkge2lmIChvbGQgIT0gSW5pdCkgaGFuZGxlKGNtLCB2YWwsIG9sZCk7fSA6IGhhbmRsZTsKICB9CgogIC8vIFBhc3NlZCB0byBvcHRpb24gaGFuZGxlcnMgd2hlbiB0aGVyZSBpcyBubyBvbGQgdmFsdWUuCiAgdmFyIEluaXQgPSBDb2RlTWlycm9yLkluaXQgPSB7dG9TdHJpbmc6IGZ1bmN0aW9uKCl7cmV0dXJuICJDb2RlTWlycm9yLkluaXQiO319OwoKICAvLyBUaGVzZSB0d28gYXJlLCBvbiBpbml0LCBjYWxsZWQgZnJvbSB0aGUgY29uc3RydWN0b3IgYmVjYXVzZSB0aGV5CiAgLy8gaGF2ZSB0byBiZSBpbml0aWFsaXplZCBiZWZvcmUgdGhlIGVkaXRvciBjYW4gc3RhcnQgYXQgYWxsLgogIG9wdGlvbigidmFsdWUiLCAiIiwgZnVuY3Rpb24oY20sIHZhbCkgewogICAgY20uc2V0VmFsdWUodmFsKTsKICB9LCB0cnVlKTsKICBvcHRpb24oIm1vZGUiLCBudWxsLCBmdW5jdGlvbihjbSwgdmFsKSB7CiAgICBjbS5kb2MubW9kZU9wdGlvbiA9IHZhbDsKICAgIGxvYWRNb2RlKGNtKTsKICB9LCB0cnVlKTsKCiAgb3B0aW9uKCJpbmRlbnRVbml0IiwgMiwgbG9hZE1vZGUsIHRydWUpOwogIG9wdGlvbigiaW5kZW50V2l0aFRhYnMiLCBmYWxzZSk7CiAgb3B0aW9uKCJzbWFydEluZGVudCIsIHRydWUpOwogIG9wdGlvbigidGFiU2l6ZSIsIDQsIGZ1bmN0aW9uKGNtKSB7CiAgICByZXNldE1vZGVTdGF0ZShjbSk7CiAgICBjbGVhckNhY2hlcyhjbSk7CiAgICByZWdDaGFuZ2UoY20pOwogIH0sIHRydWUpOwogIG9wdGlvbigic3BlY2lhbENoYXJzIiwgL1tcdFx1MDAwMC1cdTAwMTlcdTAwYWRcdTIwMGJcdTIwMjhcdTIwMjlcdWZlZmZdL2csIGZ1bmN0aW9uKGNtLCB2YWwpIHsKICAgIGNtLm9wdGlvbnMuc3BlY2lhbENoYXJzID0gbmV3IFJlZ0V4cCh2YWwuc291cmNlICsgKHZhbC50ZXN0KCJcdCIpID8gIiIgOiAifFx0IiksICJnIik7CiAgICBjbS5yZWZyZXNoKCk7CiAgfSwgdHJ1ZSk7CiAgb3B0aW9uKCJzcGVjaWFsQ2hhclBsYWNlaG9sZGVyIiwgZGVmYXVsdFNwZWNpYWxDaGFyUGxhY2Vob2xkZXIsIGZ1bmN0aW9uKGNtKSB7Y20ucmVmcmVzaCgpO30sIHRydWUpOwogIG9wdGlvbigiZWxlY3RyaWNDaGFycyIsIHRydWUpOwogIG9wdGlvbigicnRsTW92ZVZpc3VhbGx5IiwgIXdpbmRvd3MpOwogIG9wdGlvbigid2hvbGVMaW5lVXBkYXRlQmVmb3JlIiwgdHJ1ZSk7CgogIG9wdGlvbigidGhlbWUiLCAiZGVmYXVsdCIsIGZ1bmN0aW9uKGNtKSB7CiAgICB0aGVtZUNoYW5nZWQoY20pOwogICAgZ3V0dGVyc0NoYW5nZWQoY20pOwogIH0sIHRydWUpOwogIG9wdGlvbigia2V5TWFwIiwgImRlZmF1bHQiLCBrZXlNYXBDaGFuZ2VkKTsKICBvcHRpb24oImV4dHJhS2V5cyIsIG51bGwpOwoKICBvcHRpb24oImxpbmVXcmFwcGluZyIsIGZhbHNlLCB3cmFwcGluZ0NoYW5nZWQsIHRydWUpOwogIG9wdGlvbigiZ3V0dGVycyIsIFtdLCBmdW5jdGlvbihjbSkgewogICAgc2V0R3V0dGVyc0ZvckxpbmVOdW1iZXJzKGNtLm9wdGlvbnMpOwogICAgZ3V0dGVyc0NoYW5nZWQoY20pOwogIH0sIHRydWUpOwogIG9wdGlvbigiZml4ZWRHdXR0ZXIiLCB0cnVlLCBmdW5jdGlvbihjbSwgdmFsKSB7CiAgICBjbS5kaXNwbGF5Lmd1dHRlcnMuc3R5bGUubGVmdCA9IHZhbCA/IGNvbXBlbnNhdGVGb3JIU2Nyb2xsKGNtLmRpc3BsYXkpICsgInB4IiA6ICIwIjsKICAgIGNtLnJlZnJlc2goKTsKICB9LCB0cnVlKTsKICBvcHRpb24oImNvdmVyR3V0dGVyTmV4dFRvU2Nyb2xsYmFyIiwgZmFsc2UsIHVwZGF0ZVNjcm9sbGJhcnMsIHRydWUpOwogIG9wdGlvbigibGluZU51bWJlcnMiLCBmYWxzZSwgZnVuY3Rpb24oY20pIHsKICAgIHNldEd1dHRlcnNGb3JMaW5lTnVtYmVycyhjbS5vcHRpb25zKTsKICAgIGd1dHRlcnNDaGFuZ2VkKGNtKTsKICB9LCB0cnVlKTsKICBvcHRpb24oImZpcnN0TGluZU51bWJlciIsIDEsIGd1dHRlcnNDaGFuZ2VkLCB0cnVlKTsKICBvcHRpb24oImxpbmVOdW1iZXJGb3JtYXR0ZXIiLCBmdW5jdGlvbihpbnRlZ2VyKSB7cmV0dXJuIGludGVnZXI7fSwgZ3V0dGVyc0NoYW5nZWQsIHRydWUpOwogIG9wdGlvbigic2hvd0N1cnNvcldoZW5TZWxlY3RpbmciLCBmYWxzZSwgdXBkYXRlU2VsZWN0aW9uLCB0cnVlKTsKCiAgb3B0aW9uKCJyZXNldFNlbGVjdGlvbk9uQ29udGV4dE1lbnUiLCB0cnVlKTsKCiAgb3B0aW9uKCJyZWFkT25seSIsIGZhbHNlLCBmdW5jdGlvbihjbSwgdmFsKSB7CiAgICBpZiAodmFsID09ICJub2N1cnNvciIpIHsKICAgICAgb25CbHVyKGNtKTsKICAgICAgY20uZGlzcGxheS5pbnB1dC5ibHVyKCk7CiAgICAgIGNtLmRpc3BsYXkuZGlzYWJsZWQgPSB0cnVlOwogICAgfSBlbHNlIHsKICAgICAgY20uZGlzcGxheS5kaXNhYmxlZCA9IGZhbHNlOwogICAgICBpZiAoIXZhbCkgcmVzZXRJbnB1dChjbSk7CiAgICB9CiAgfSk7CiAgb3B0aW9uKCJkaXNhYmxlSW5wdXQiLCBmYWxzZSwgZnVuY3Rpb24oY20sIHZhbCkge2lmICghdmFsKSByZXNldElucHV0KGNtKTt9LCB0cnVlKTsKICBvcHRpb24oImRyYWdEcm9wIiwgdHJ1ZSk7CgogIG9wdGlvbigiY3Vyc29yQmxpbmtSYXRlIiwgNTMwKTsKICBvcHRpb24oImN1cnNvclNjcm9sbE1hcmdpbiIsIDApOwogIG9wdGlvbigiY3Vyc29ySGVpZ2h0IiwgMSwgdXBkYXRlU2VsZWN0aW9uLCB0cnVlKTsKICBvcHRpb24oInNpbmdsZUN1cnNvckhlaWdodFBlckxpbmUiLCB0cnVlLCB1cGRhdGVTZWxlY3Rpb24sIHRydWUpOwogIG9wdGlvbigid29ya1RpbWUiLCAxMDApOwogIG9wdGlvbigid29ya0RlbGF5IiwgMTAwKTsKICBvcHRpb24oImZsYXR0ZW5TcGFucyIsIHRydWUsIHJlc2V0TW9kZVN0YXRlLCB0cnVlKTsKICBvcHRpb24oImFkZE1vZGVDbGFzcyIsIGZhbHNlLCByZXNldE1vZGVTdGF0ZSwgdHJ1ZSk7CiAgb3B0aW9uKCJwb2xsSW50ZXJ2YWwiLCAxMDApOwogIG9wdGlvbigidW5kb0RlcHRoIiwgMjAwLCBmdW5jdGlvbihjbSwgdmFsKXtjbS5kb2MuaGlzdG9yeS51bmRvRGVwdGggPSB2YWw7fSk7CiAgb3B0aW9uKCJoaXN0b3J5RXZlbnREZWxheSIsIDEyNTApOwogIG9wdGlvbigidmlld3BvcnRNYXJnaW4iLCAxMCwgZnVuY3Rpb24oY20pe2NtLnJlZnJlc2goKTt9LCB0cnVlKTsKICBvcHRpb24oIm1heEhpZ2hsaWdodExlbmd0aCIsIDEwMDAwLCByZXNldE1vZGVTdGF0ZSwgdHJ1ZSk7CiAgb3B0aW9uKCJtb3ZlSW5wdXRXaXRoQ3Vyc29yIiwgdHJ1ZSwgZnVuY3Rpb24oY20sIHZhbCkgewogICAgaWYgKCF2YWwpIGNtLmRpc3BsYXkuaW5wdXREaXYuc3R5bGUudG9wID0gY20uZGlzcGxheS5pbnB1dERpdi5zdHlsZS5sZWZ0ID0gMDsKICB9KTsKCiAgb3B0aW9uKCJ0YWJpbmRleCIsIG51bGwsIGZ1bmN0aW9uKGNtLCB2YWwpIHsKICAgIGNtLmRpc3BsYXkuaW5wdXQudGFiSW5kZXggPSB2YWwgfHwgIiI7CiAgfSk7CiAgb3B0aW9uKCJhdXRvZm9jdXMiLCBudWxsKTsKCiAgLy8gTU9ERSBERUZJTklUSU9OIEFORCBRVUVSWUlORwoKICAvLyBLbm93biBtb2RlcywgYnkgbmFtZSBhbmQgYnkgTUlNRQogIHZhciBtb2RlcyA9IENvZGVNaXJyb3IubW9kZXMgPSB7fSwgbWltZU1vZGVzID0gQ29kZU1pcnJvci5taW1lTW9kZXMgPSB7fTsKCiAgLy8gRXh0cmEgYXJndW1lbnRzIGFyZSBzdG9yZWQgYXMgdGhlIG1vZGUncyBkZXBlbmRlbmNpZXMsIHdoaWNoIGlzCiAgLy8gdXNlZCBieSAobGVnYWN5KSBtZWNoYW5pc21zIGxpa2UgbG9hZG1vZGUuanMgdG8gYXV0b21hdGljYWxseQogIC8vIGxvYWQgYSBtb2RlLiAoUHJlZmVycmVkIG1lY2hhbmlzbSBpcyB0aGUgcmVxdWlyZS9kZWZpbmUgY2FsbHMuKQogIENvZGVNaXJyb3IuZGVmaW5lTW9kZSA9IGZ1bmN0aW9uKG5hbWUsIG1vZGUpIHsKICAgIGlmICghQ29kZU1pcnJvci5kZWZhdWx0cy5tb2RlICYmIG5hbWUgIT0gIm51bGwiKSBDb2RlTWlycm9yLmRlZmF1bHRzLm1vZGUgPSBuYW1lOwogICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAyKSB7CiAgICAgIG1vZGUuZGVwZW5kZW5jaWVzID0gW107CiAgICAgIGZvciAodmFyIGkgPSAyOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgKytpKSBtb2RlLmRlcGVuZGVuY2llcy5wdXNoKGFyZ3VtZW50c1tpXSk7CiAgICB9CiAgICBtb2Rlc1tuYW1lXSA9IG1vZGU7CiAgfTsKCiAgQ29kZU1pcnJvci5kZWZpbmVNSU1FID0gZnVuY3Rpb24obWltZSwgc3BlYykgewogICAgbWltZU1vZGVzW21pbWVdID0gc3BlYzsKICB9OwoKICAvLyBHaXZlbiBhIE1JTUUgdHlwZSwgYSB7bmFtZSwgLi4ub3B0aW9uc30gY29uZmlnIG9iamVjdCwgb3IgYSBuYW1lCiAgLy8gc3RyaW5nLCByZXR1cm4gYSBtb2RlIGNvbmZpZyBvYmplY3QuCiAgQ29kZU1pcnJvci5yZXNvbHZlTW9kZSA9IGZ1bmN0aW9uKHNwZWMpIHsKICAgIGlmICh0eXBlb2Ygc3BlYyA9PSAic3RyaW5nIiAmJiBtaW1lTW9kZXMuaGFzT3duUHJvcGVydHkoc3BlYykpIHsKICAgICAgc3BlYyA9IG1pbWVNb2Rlc1tzcGVjXTsKICAgIH0gZWxzZSBpZiAoc3BlYyAmJiB0eXBlb2Ygc3BlYy5uYW1lID09ICJzdHJpbmciICYmIG1pbWVNb2Rlcy5oYXNPd25Qcm9wZXJ0eShzcGVjLm5hbWUpKSB7CiAgICAgIHZhciBmb3VuZCA9IG1pbWVNb2Rlc1tzcGVjLm5hbWVdOwogICAgICBpZiAodHlwZW9mIGZvdW5kID09ICJzdHJpbmciKSBmb3VuZCA9IHtuYW1lOiBmb3VuZH07CiAgICAgIHNwZWMgPSBjcmVhdGVPYmooZm91bmQsIHNwZWMpOwogICAgICBzcGVjLm5hbWUgPSBmb3VuZC5uYW1lOwogICAgfSBlbHNlIGlmICh0eXBlb2Ygc3BlYyA9PSAic3RyaW5nIiAmJiAvXltcd1wtXStcL1tcd1wtXStcK3htbCQvLnRlc3Qoc3BlYykpIHsKICAgICAgcmV0dXJuIENvZGVNaXJyb3IucmVzb2x2ZU1vZGUoImFwcGxpY2F0aW9uL3htbCIpOwogICAgfQogICAgaWYgKHR5cGVvZiBzcGVjID09ICJzdHJpbmciKSByZXR1cm4ge25hbWU6IHNwZWN9OwogICAgZWxzZSByZXR1cm4gc3BlYyB8fCB7bmFtZTogIm51bGwifTsKICB9OwoKICAvLyBHaXZlbiBhIG1vZGUgc3BlYyAoYW55dGhpbmcgdGhhdCByZXNvbHZlTW9kZSBhY2NlcHRzKSwgZmluZCBhbmQKICAvLyBpbml0aWFsaXplIGFuIGFjdHVhbCBtb2RlIG9iamVjdC4KICBDb2RlTWlycm9yLmdldE1vZGUgPSBmdW5jdGlvbihvcHRpb25zLCBzcGVjKSB7CiAgICB2YXIgc3BlYyA9IENvZGVNaXJyb3IucmVzb2x2ZU1vZGUoc3BlYyk7CiAgICB2YXIgbWZhY3RvcnkgPSBtb2Rlc1tzcGVjLm5hbWVdOwogICAgaWYgKCFtZmFjdG9yeSkgcmV0dXJuIENvZGVNaXJyb3IuZ2V0TW9kZShvcHRpb25zLCAidGV4dC9wbGFpbiIpOwogICAgdmFyIG1vZGVPYmogPSBtZmFjdG9yeShvcHRpb25zLCBzcGVjKTsKICAgIGlmIChtb2RlRXh0ZW5zaW9ucy5oYXNPd25Qcm9wZXJ0eShzcGVjLm5hbWUpKSB7CiAgICAgIHZhciBleHRzID0gbW9kZUV4dGVuc2lvbnNbc3BlYy5uYW1lXTsKICAgICAgZm9yICh2YXIgcHJvcCBpbiBleHRzKSB7CiAgICAgICAgaWYgKCFleHRzLmhhc093blByb3BlcnR5KHByb3ApKSBjb250aW51ZTsKICAgICAgICBpZiAobW9kZU9iai5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgbW9kZU9ialsiXyIgKyBwcm9wXSA9IG1vZGVPYmpbcHJvcF07CiAgICAgICAgbW9kZU9ialtwcm9wXSA9IGV4dHNbcHJvcF07CiAgICAgIH0KICAgIH0KICAgIG1vZGVPYmoubmFtZSA9IHNwZWMubmFtZTsKICAgIGlmIChzcGVjLmhlbHBlclR5cGUpIG1vZGVPYmouaGVscGVyVHlwZSA9IHNwZWMuaGVscGVyVHlwZTsKICAgIGlmIChzcGVjLm1vZGVQcm9wcykgZm9yICh2YXIgcHJvcCBpbiBzcGVjLm1vZGVQcm9wcykKICAgICAgbW9kZU9ialtwcm9wXSA9IHNwZWMubW9kZVByb3BzW3Byb3BdOwoKICAgIHJldHVybiBtb2RlT2JqOwogIH07CgogIC8vIE1pbmltYWwgZGVmYXVsdCBtb2RlLgogIENvZGVNaXJyb3IuZGVmaW5lTW9kZSgibnVsbCIsIGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHt0b2tlbjogZnVuY3Rpb24oc3RyZWFtKSB7c3RyZWFtLnNraXBUb0VuZCgpO319OwogIH0pOwogIENvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC9wbGFpbiIsICJudWxsIik7CgogIC8vIFRoaXMgY2FuIGJlIHVzZWQgdG8gYXR0YWNoIHByb3BlcnRpZXMgdG8gbW9kZSBvYmplY3RzIGZyb20KICAvLyBvdXRzaWRlIHRoZSBhY3R1YWwgbW9kZSBkZWZpbml0aW9uLgogIHZhciBtb2RlRXh0ZW5zaW9ucyA9IENvZGVNaXJyb3IubW9kZUV4dGVuc2lvbnMgPSB7fTsKICBDb2RlTWlycm9yLmV4dGVuZE1vZGUgPSBmdW5jdGlvbihtb2RlLCBwcm9wZXJ0aWVzKSB7CiAgICB2YXIgZXh0cyA9IG1vZGVFeHRlbnNpb25zLmhhc093blByb3BlcnR5KG1vZGUpID8gbW9kZUV4dGVuc2lvbnNbbW9kZV0gOiAobW9kZUV4dGVuc2lvbnNbbW9kZV0gPSB7fSk7CiAgICBjb3B5T2JqKHByb3BlcnRpZXMsIGV4dHMpOwogIH07CgogIC8vIEVYVEVOU0lPTlMKCiAgQ29kZU1pcnJvci5kZWZpbmVFeHRlbnNpb24gPSBmdW5jdGlvbihuYW1lLCBmdW5jKSB7CiAgICBDb2RlTWlycm9yLnByb3RvdHlwZVtuYW1lXSA9IGZ1bmM7CiAgfTsKICBDb2RlTWlycm9yLmRlZmluZURvY0V4dGVuc2lvbiA9IGZ1bmN0aW9uKG5hbWUsIGZ1bmMpIHsKICAgIERvYy5wcm90b3R5cGVbbmFtZV0gPSBmdW5jOwogIH07CiAgQ29kZU1pcnJvci5kZWZpbmVPcHRpb24gPSBvcHRpb247CgogIHZhciBpbml0SG9va3MgPSBbXTsKICBDb2RlTWlycm9yLmRlZmluZUluaXRIb29rID0gZnVuY3Rpb24oZikge2luaXRIb29rcy5wdXNoKGYpO307CgogIHZhciBoZWxwZXJzID0gQ29kZU1pcnJvci5oZWxwZXJzID0ge307CiAgQ29kZU1pcnJvci5yZWdpc3RlckhlbHBlciA9IGZ1bmN0aW9uKHR5cGUsIG5hbWUsIHZhbHVlKSB7CiAgICBpZiAoIWhlbHBlcnMuaGFzT3duUHJvcGVydHkodHlwZSkpIGhlbHBlcnNbdHlwZV0gPSBDb2RlTWlycm9yW3R5cGVdID0ge19nbG9iYWw6IFtdfTsKICAgIGhlbHBlcnNbdHlwZV1bbmFtZV0gPSB2YWx1ZTsKICB9OwogIENvZGVNaXJyb3IucmVnaXN0ZXJHbG9iYWxIZWxwZXIgPSBmdW5jdGlvbih0eXBlLCBuYW1lLCBwcmVkaWNhdGUsIHZhbHVlKSB7CiAgICBDb2RlTWlycm9yLnJlZ2lzdGVySGVscGVyKHR5cGUsIG5hbWUsIHZhbHVlKTsKICAgIGhlbHBlcnNbdHlwZV0uX2dsb2JhbC5wdXNoKHtwcmVkOiBwcmVkaWNhdGUsIHZhbDogdmFsdWV9KTsKICB9OwoKICAvLyBNT0RFIFNUQVRFIEhBTkRMSU5HCgogIC8vIFV0aWxpdHkgZnVuY3Rpb25zIGZvciB3b3JraW5nIHdpdGggc3RhdGUuIEV4cG9ydGVkIGJlY2F1c2UgbmVzdGVkCiAgLy8gbW9kZXMgbmVlZCB0byBkbyB0aGlzIGZvciB0aGVpciBpbm5lciBtb2Rlcy4KCiAgdmFyIGNvcHlTdGF0ZSA9IENvZGVNaXJyb3IuY29weVN0YXRlID0gZnVuY3Rpb24obW9kZSwgc3RhdGUpIHsKICAgIGlmIChzdGF0ZSA9PT0gdHJ1ZSkgcmV0dXJuIHN0YXRlOwogICAgaWYgKG1vZGUuY29weVN0YXRlKSByZXR1cm4gbW9kZS5jb3B5U3RhdGUoc3RhdGUpOwogICAgdmFyIG5zdGF0ZSA9IHt9OwogICAgZm9yICh2YXIgbiBpbiBzdGF0ZSkgewogICAgICB2YXIgdmFsID0gc3RhdGVbbl07CiAgICAgIGlmICh2YWwgaW5zdGFuY2VvZiBBcnJheSkgdmFsID0gdmFsLmNvbmNhdChbXSk7CiAgICAgIG5zdGF0ZVtuXSA9IHZhbDsKICAgIH0KICAgIHJldHVybiBuc3RhdGU7CiAgfTsKCiAgdmFyIHN0YXJ0U3RhdGUgPSBDb2RlTWlycm9yLnN0YXJ0U3RhdGUgPSBmdW5jdGlvbihtb2RlLCBhMSwgYTIpIHsKICAgIHJldHVybiBtb2RlLnN0YXJ0U3RhdGUgPyBtb2RlLnN0YXJ0U3RhdGUoYTEsIGEyKSA6IHRydWU7CiAgfTsKCiAgLy8gR2l2ZW4gYSBtb2RlIGFuZCBhIHN0YXRlIChmb3IgdGhhdCBtb2RlKSwgZmluZCB0aGUgaW5uZXIgbW9kZSBhbmQKICAvLyBzdGF0ZSBhdCB0aGUgcG9zaXRpb24gdGhhdCB0aGUgc3RhdGUgcmVmZXJzIHRvLgogIENvZGVNaXJyb3IuaW5uZXJNb2RlID0gZnVuY3Rpb24obW9kZSwgc3RhdGUpIHsKICAgIHdoaWxlIChtb2RlLmlubmVyTW9kZSkgewogICAgICB2YXIgaW5mbyA9IG1vZGUuaW5uZXJNb2RlKHN0YXRlKTsKICAgICAgaWYgKCFpbmZvIHx8IGluZm8ubW9kZSA9PSBtb2RlKSBicmVhazsKICAgICAgc3RhdGUgPSBpbmZvLnN0YXRlOwogICAgICBtb2RlID0gaW5mby5tb2RlOwogICAgfQogICAgcmV0dXJuIGluZm8gfHwge21vZGU6IG1vZGUsIHN0YXRlOiBzdGF0ZX07CiAgfTsKCiAgLy8gU1RBTkRBUkQgQ09NTUFORFMKCiAgLy8gQ29tbWFuZHMgYXJlIHBhcmFtZXRlci1sZXNzIGFjdGlvbnMgdGhhdCBjYW4gYmUgcGVyZm9ybWVkIG9uIGFuCiAgLy8gZWRpdG9yLCBtb3N0bHkgdXNlZCBmb3Iga2V5YmluZGluZ3MuCiAgdmFyIGNvbW1hbmRzID0gQ29kZU1pcnJvci5jb21tYW5kcyA9IHsKICAgIHNlbGVjdEFsbDogZnVuY3Rpb24oY20pIHtjbS5zZXRTZWxlY3Rpb24oUG9zKGNtLmZpcnN0TGluZSgpLCAwKSwgUG9zKGNtLmxhc3RMaW5lKCkpLCBzZWxfZG9udFNjcm9sbCk7fSwKICAgIHNpbmdsZVNlbGVjdGlvbjogZnVuY3Rpb24oY20pIHsKICAgICAgY20uc2V0U2VsZWN0aW9uKGNtLmdldEN1cnNvcigiYW5jaG9yIiksIGNtLmdldEN1cnNvcigiaGVhZCIpLCBzZWxfZG9udFNjcm9sbCk7CiAgICB9LAogICAga2lsbExpbmU6IGZ1bmN0aW9uKGNtKSB7CiAgICAgIGRlbGV0ZU5lYXJTZWxlY3Rpb24oY20sIGZ1bmN0aW9uKHJhbmdlKSB7CiAgICAgICAgaWYgKHJhbmdlLmVtcHR5KCkpIHsKICAgICAgICAgIHZhciBsZW4gPSBnZXRMaW5lKGNtLmRvYywgcmFuZ2UuaGVhZC5saW5lKS50ZXh0Lmxlbmd0aDsKICAgICAgICAgIGlmIChyYW5nZS5oZWFkLmNoID09IGxlbiAmJiByYW5nZS5oZWFkLmxpbmUgPCBjbS5sYXN0TGluZSgpKQogICAgICAgICAgICByZXR1cm4ge2Zyb206IHJhbmdlLmhlYWQsIHRvOiBQb3MocmFuZ2UuaGVhZC5saW5lICsgMSwgMCl9OwogICAgICAgICAgZWxzZQogICAgICAgICAgICByZXR1cm4ge2Zyb206IHJhbmdlLmhlYWQsIHRvOiBQb3MocmFuZ2UuaGVhZC5saW5lLCBsZW4pfTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIHtmcm9tOiByYW5nZS5mcm9tKCksIHRvOiByYW5nZS50bygpfTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSwKICAgIGRlbGV0ZUxpbmU6IGZ1bmN0aW9uKGNtKSB7CiAgICAgIGRlbGV0ZU5lYXJTZWxlY3Rpb24oY20sIGZ1bmN0aW9uKHJhbmdlKSB7CiAgICAgICAgcmV0dXJuIHtmcm9tOiBQb3MocmFuZ2UuZnJvbSgpLmxpbmUsIDApLAogICAgICAgICAgICAgICAgdG86IGNsaXBQb3MoY20uZG9jLCBQb3MocmFuZ2UudG8oKS5saW5lICsgMSwgMCkpfTsKICAgICAgfSk7CiAgICB9LAogICAgZGVsTGluZUxlZnQ6IGZ1bmN0aW9uKGNtKSB7CiAgICAgIGRlbGV0ZU5lYXJTZWxlY3Rpb24oY20sIGZ1bmN0aW9uKHJhbmdlKSB7CiAgICAgICAgcmV0dXJuIHtmcm9tOiBQb3MocmFuZ2UuZnJvbSgpLmxpbmUsIDApLCB0bzogcmFuZ2UuZnJvbSgpfTsKICAgICAgfSk7CiAgICB9LAogICAgZGVsV3JhcHBlZExpbmVMZWZ0OiBmdW5jdGlvbihjbSkgewogICAgICBkZWxldGVOZWFyU2VsZWN0aW9uKGNtLCBmdW5jdGlvbihyYW5nZSkgewogICAgICAgIHZhciB0b3AgPSBjbS5jaGFyQ29vcmRzKHJhbmdlLmhlYWQsICJkaXYiKS50b3AgKyA1OwogICAgICAgIHZhciBsZWZ0UG9zID0gY20uY29vcmRzQ2hhcih7bGVmdDogMCwgdG9wOiB0b3B9LCAiZGl2Iik7CiAgICAgICAgcmV0dXJuIHtmcm9tOiBsZWZ0UG9zLCB0bzogcmFuZ2UuZnJvbSgpfTsKICAgICAgfSk7CiAgICB9LAogICAgZGVsV3JhcHBlZExpbmVSaWdodDogZnVuY3Rpb24oY20pIHsKICAgICAgZGVsZXRlTmVhclNlbGVjdGlvbihjbSwgZnVuY3Rpb24ocmFuZ2UpIHsKICAgICAgICB2YXIgdG9wID0gY20uY2hhckNvb3JkcyhyYW5nZS5oZWFkLCAiZGl2IikudG9wICsgNTsKICAgICAgICB2YXIgcmlnaHRQb3MgPSBjbS5jb29yZHNDaGFyKHtsZWZ0OiBjbS5kaXNwbGF5LmxpbmVEaXYub2Zmc2V0V2lkdGggKyAxMDAsIHRvcDogdG9wfSwgImRpdiIpOwogICAgICAgIHJldHVybiB7ZnJvbTogcmFuZ2UuZnJvbSgpLCB0bzogcmlnaHRQb3MgfTsKICAgICAgfSk7CiAgICB9LAogICAgdW5kbzogZnVuY3Rpb24oY20pIHtjbS51bmRvKCk7fSwKICAgIHJlZG86IGZ1bmN0aW9uKGNtKSB7Y20ucmVkbygpO30sCiAgICB1bmRvU2VsZWN0aW9uOiBmdW5jdGlvbihjbSkge2NtLnVuZG9TZWxlY3Rpb24oKTt9LAogICAgcmVkb1NlbGVjdGlvbjogZnVuY3Rpb24oY20pIHtjbS5yZWRvU2VsZWN0aW9uKCk7fSwKICAgIGdvRG9jU3RhcnQ6IGZ1bmN0aW9uKGNtKSB7Y20uZXh0ZW5kU2VsZWN0aW9uKFBvcyhjbS5maXJzdExpbmUoKSwgMCkpO30sCiAgICBnb0RvY0VuZDogZnVuY3Rpb24oY20pIHtjbS5leHRlbmRTZWxlY3Rpb24oUG9zKGNtLmxhc3RMaW5lKCkpKTt9LAogICAgZ29MaW5lU3RhcnQ6IGZ1bmN0aW9uKGNtKSB7CiAgICAgIGNtLmV4dGVuZFNlbGVjdGlvbnNCeShmdW5jdGlvbihyYW5nZSkgeyByZXR1cm4gbGluZVN0YXJ0KGNtLCByYW5nZS5oZWFkLmxpbmUpOyB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAge29yaWdpbjogIittb3ZlIiwgYmlhczogMX0pOwogICAgfSwKICAgIGdvTGluZVN0YXJ0U21hcnQ6IGZ1bmN0aW9uKGNtKSB7CiAgICAgIGNtLmV4dGVuZFNlbGVjdGlvbnNCeShmdW5jdGlvbihyYW5nZSkgewogICAgICAgIHZhciBzdGFydCA9IGxpbmVTdGFydChjbSwgcmFuZ2UuaGVhZC5saW5lKTsKICAgICAgICB2YXIgbGluZSA9IGNtLmdldExpbmVIYW5kbGUoc3RhcnQubGluZSk7CiAgICAgICAgdmFyIG9yZGVyID0gZ2V0T3JkZXIobGluZSk7CiAgICAgICAgaWYgKCFvcmRlciB8fCBvcmRlclswXS5sZXZlbCA9PSAwKSB7CiAgICAgICAgICB2YXIgZmlyc3ROb25XUyA9IE1hdGgubWF4KDAsIGxpbmUudGV4dC5zZWFyY2goL1xTLykpOwogICAgICAgICAgdmFyIGluV1MgPSByYW5nZS5oZWFkLmxpbmUgPT0gc3RhcnQubGluZSAmJiByYW5nZS5oZWFkLmNoIDw9IGZpcnN0Tm9uV1MgJiYgcmFuZ2UuaGVhZC5jaDsKICAgICAgICAgIHJldHVybiBQb3Moc3RhcnQubGluZSwgaW5XUyA/IDAgOiBmaXJzdE5vbldTKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHN0YXJ0OwogICAgICB9LCB7b3JpZ2luOiAiK21vdmUiLCBiaWFzOiAxfSk7CiAgICB9LAogICAgZ29MaW5lRW5kOiBmdW5jdGlvbihjbSkgewogICAgICBjbS5leHRlbmRTZWxlY3Rpb25zQnkoZnVuY3Rpb24ocmFuZ2UpIHsgcmV0dXJuIGxpbmVFbmQoY20sIHJhbmdlLmhlYWQubGluZSk7IH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7b3JpZ2luOiAiK21vdmUiLCBiaWFzOiAtMX0pOwogICAgfSwKICAgIGdvTGluZVJpZ2h0OiBmdW5jdGlvbihjbSkgewogICAgICBjbS5leHRlbmRTZWxlY3Rpb25zQnkoZnVuY3Rpb24ocmFuZ2UpIHsKICAgICAgICB2YXIgdG9wID0gY20uY2hhckNvb3JkcyhyYW5nZS5oZWFkLCAiZGl2IikudG9wICsgNTsKICAgICAgICByZXR1cm4gY20uY29vcmRzQ2hhcih7bGVmdDogY20uZGlzcGxheS5saW5lRGl2Lm9mZnNldFdpZHRoICsgMTAwLCB0b3A6IHRvcH0sICJkaXYiKTsKICAgICAgfSwgc2VsX21vdmUpOwogICAgfSwKICAgIGdvTGluZUxlZnQ6IGZ1bmN0aW9uKGNtKSB7CiAgICAgIGNtLmV4dGVuZFNlbGVjdGlvbnNCeShmdW5jdGlvbihyYW5nZSkgewogICAgICAgIHZhciB0b3AgPSBjbS5jaGFyQ29vcmRzKHJhbmdlLmhlYWQsICJkaXYiKS50b3AgKyA1OwogICAgICAgIHJldHVybiBjbS5jb29yZHNDaGFyKHtsZWZ0OiAwLCB0b3A6IHRvcH0sICJkaXYiKTsKICAgICAgfSwgc2VsX21vdmUpOwogICAgfSwKICAgIGdvTGluZVVwOiBmdW5jdGlvbihjbSkge2NtLm1vdmVWKC0xLCAibGluZSIpO30sCiAgICBnb0xpbmVEb3duOiBmdW5jdGlvbihjbSkge2NtLm1vdmVWKDEsICJsaW5lIik7fSwKICAgIGdvUGFnZVVwOiBmdW5jdGlvbihjbSkge2NtLm1vdmVWKC0xLCAicGFnZSIpO30sCiAgICBnb1BhZ2VEb3duOiBmdW5jdGlvbihjbSkge2NtLm1vdmVWKDEsICJwYWdlIik7fSwKICAgIGdvQ2hhckxlZnQ6IGZ1bmN0aW9uKGNtKSB7Y20ubW92ZUgoLTEsICJjaGFyIik7fSwKICAgIGdvQ2hhclJpZ2h0OiBmdW5jdGlvbihjbSkge2NtLm1vdmVIKDEsICJjaGFyIik7fSwKICAgIGdvQ29sdW1uTGVmdDogZnVuY3Rpb24oY20pIHtjbS5tb3ZlSCgtMSwgImNvbHVtbiIpO30sCiAgICBnb0NvbHVtblJpZ2h0OiBmdW5jdGlvbihjbSkge2NtLm1vdmVIKDEsICJjb2x1bW4iKTt9LAogICAgZ29Xb3JkTGVmdDogZnVuY3Rpb24oY20pIHtjbS5tb3ZlSCgtMSwgIndvcmQiKTt9LAogICAgZ29Hcm91cFJpZ2h0OiBmdW5jdGlvbihjbSkge2NtLm1vdmVIKDEsICJncm91cCIpO30sCiAgICBnb0dyb3VwTGVmdDogZnVuY3Rpb24oY20pIHtjbS5tb3ZlSCgtMSwgImdyb3VwIik7fSwKICAgIGdvV29yZFJpZ2h0OiBmdW5jdGlvbihjbSkge2NtLm1vdmVIKDEsICJ3b3JkIik7fSwKICAgIGRlbENoYXJCZWZvcmU6IGZ1bmN0aW9uKGNtKSB7Y20uZGVsZXRlSCgtMSwgImNoYXIiKTt9LAogICAgZGVsQ2hhckFmdGVyOiBmdW5jdGlvbihjbSkge2NtLmRlbGV0ZUgoMSwgImNoYXIiKTt9LAogICAgZGVsV29yZEJlZm9yZTogZnVuY3Rpb24oY20pIHtjbS5kZWxldGVIKC0xLCAid29yZCIpO30sCiAgICBkZWxXb3JkQWZ0ZXI6IGZ1bmN0aW9uKGNtKSB7Y20uZGVsZXRlSCgxLCAid29yZCIpO30sCiAgICBkZWxHcm91cEJlZm9yZTogZnVuY3Rpb24oY20pIHtjbS5kZWxldGVIKC0xLCAiZ3JvdXAiKTt9LAogICAgZGVsR3JvdXBBZnRlcjogZnVuY3Rpb24oY20pIHtjbS5kZWxldGVIKDEsICJncm91cCIpO30sCiAgICBpbmRlbnRBdXRvOiBmdW5jdGlvbihjbSkge2NtLmluZGVudFNlbGVjdGlvbigic21hcnQiKTt9LAogICAgaW5kZW50TW9yZTogZnVuY3Rpb24oY20pIHtjbS5pbmRlbnRTZWxlY3Rpb24oImFkZCIpO30sCiAgICBpbmRlbnRMZXNzOiBmdW5jdGlvbihjbSkge2NtLmluZGVudFNlbGVjdGlvbigic3VidHJhY3QiKTt9LAogICAgaW5zZXJ0VGFiOiBmdW5jdGlvbihjbSkge2NtLnJlcGxhY2VTZWxlY3Rpb24oIlx0Iik7fSwKICAgIGluc2VydFNvZnRUYWI6IGZ1bmN0aW9uKGNtKSB7CiAgICAgIHZhciBzcGFjZXMgPSBbXSwgcmFuZ2VzID0gY20ubGlzdFNlbGVjdGlvbnMoKSwgdGFiU2l6ZSA9IGNtLm9wdGlvbnMudGFiU2l6ZTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICB2YXIgcG9zID0gcmFuZ2VzW2ldLmZyb20oKTsKICAgICAgICB2YXIgY29sID0gY291bnRDb2x1bW4oY20uZ2V0TGluZShwb3MubGluZSksIHBvcy5jaCwgdGFiU2l6ZSk7CiAgICAgICAgc3BhY2VzLnB1c2gobmV3IEFycmF5KHRhYlNpemUgLSBjb2wgJSB0YWJTaXplICsgMSkuam9pbigiICIpKTsKICAgICAgfQogICAgICBjbS5yZXBsYWNlU2VsZWN0aW9ucyhzcGFjZXMpOwogICAgfSwKICAgIGRlZmF1bHRUYWI6IGZ1bmN0aW9uKGNtKSB7CiAgICAgIGlmIChjbS5zb21ldGhpbmdTZWxlY3RlZCgpKSBjbS5pbmRlbnRTZWxlY3Rpb24oImFkZCIpOwogICAgICBlbHNlIGNtLmV4ZWNDb21tYW5kKCJpbnNlcnRUYWIiKTsKICAgIH0sCiAgICB0cmFuc3Bvc2VDaGFyczogZnVuY3Rpb24oY20pIHsKICAgICAgcnVuSW5PcChjbSwgZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHJhbmdlcyA9IGNtLmxpc3RTZWxlY3Rpb25zKCksIG5ld1NlbCA9IFtdOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB2YXIgY3VyID0gcmFuZ2VzW2ldLmhlYWQsIGxpbmUgPSBnZXRMaW5lKGNtLmRvYywgY3VyLmxpbmUpLnRleHQ7CiAgICAgICAgICBpZiAobGluZSkgewogICAgICAgICAgICBpZiAoY3VyLmNoID09IGxpbmUubGVuZ3RoKSBjdXIgPSBuZXcgUG9zKGN1ci5saW5lLCBjdXIuY2ggLSAxKTsKICAgICAgICAgICAgaWYgKGN1ci5jaCA+IDApIHsKICAgICAgICAgICAgICBjdXIgPSBuZXcgUG9zKGN1ci5saW5lLCBjdXIuY2ggKyAxKTsKICAgICAgICAgICAgICBjbS5yZXBsYWNlUmFuZ2UobGluZS5jaGFyQXQoY3VyLmNoIC0gMSkgKyBsaW5lLmNoYXJBdChjdXIuY2ggLSAyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zKGN1ci5saW5lLCBjdXIuY2ggLSAyKSwgY3VyLCAiK3RyYW5zcG9zZSIpOwogICAgICAgICAgICB9IGVsc2UgaWYgKGN1ci5saW5lID4gY20uZG9jLmZpcnN0KSB7CiAgICAgICAgICAgICAgdmFyIHByZXYgPSBnZXRMaW5lKGNtLmRvYywgY3VyLmxpbmUgLSAxKS50ZXh0OwogICAgICAgICAgICAgIGlmIChwcmV2KQogICAgICAgICAgICAgICAgY20ucmVwbGFjZVJhbmdlKGxpbmUuY2hhckF0KDApICsgIlxuIiArIHByZXYuY2hhckF0KHByZXYubGVuZ3RoIC0gMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zKGN1ci5saW5lIC0gMSwgcHJldi5sZW5ndGggLSAxKSwgUG9zKGN1ci5saW5lLCAxKSwgIit0cmFuc3Bvc2UiKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgbmV3U2VsLnB1c2gobmV3IFJhbmdlKGN1ciwgY3VyKSk7CiAgICAgICAgfQogICAgICAgIGNtLnNldFNlbGVjdGlvbnMobmV3U2VsKTsKICAgICAgfSk7CiAgICB9LAogICAgbmV3bGluZUFuZEluZGVudDogZnVuY3Rpb24oY20pIHsKICAgICAgcnVuSW5PcChjbSwgZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGxlbiA9IGNtLmxpc3RTZWxlY3Rpb25zKCkubGVuZ3RoOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICAgIHZhciByYW5nZSA9IGNtLmxpc3RTZWxlY3Rpb25zKClbaV07CiAgICAgICAgICBjbS5yZXBsYWNlUmFuZ2UoIlxuIiwgcmFuZ2UuYW5jaG9yLCByYW5nZS5oZWFkLCAiK2lucHV0Iik7CiAgICAgICAgICBjbS5pbmRlbnRMaW5lKHJhbmdlLmZyb20oKS5saW5lICsgMSwgbnVsbCwgdHJ1ZSk7CiAgICAgICAgICBlbnN1cmVDdXJzb3JWaXNpYmxlKGNtKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSwKICAgIHRvZ2dsZU92ZXJ3cml0ZTogZnVuY3Rpb24oY20pIHtjbS50b2dnbGVPdmVyd3JpdGUoKTt9CiAgfTsKCiAgLy8gU1RBTkRBUkQgS0VZTUFQUwoKICB2YXIga2V5TWFwID0gQ29kZU1pcnJvci5rZXlNYXAgPSB7fTsKICBrZXlNYXAuYmFzaWMgPSB7CiAgICAiTGVmdCI6ICJnb0NoYXJMZWZ0IiwgIlJpZ2h0IjogImdvQ2hhclJpZ2h0IiwgIlVwIjogImdvTGluZVVwIiwgIkRvd24iOiAiZ29MaW5lRG93biIsCiAgICAiRW5kIjogImdvTGluZUVuZCIsICJIb21lIjogImdvTGluZVN0YXJ0U21hcnQiLCAiUGFnZVVwIjogImdvUGFnZVVwIiwgIlBhZ2VEb3duIjogImdvUGFnZURvd24iLAogICAgIkRlbGV0ZSI6ICJkZWxDaGFyQWZ0ZXIiLCAiQmFja3NwYWNlIjogImRlbENoYXJCZWZvcmUiLCAiU2hpZnQtQmFja3NwYWNlIjogImRlbENoYXJCZWZvcmUiLAogICAgIlRhYiI6ICJkZWZhdWx0VGFiIiwgIlNoaWZ0LVRhYiI6ICJpbmRlbnRBdXRvIiwKICAgICJFbnRlciI6ICJuZXdsaW5lQW5kSW5kZW50IiwgIkluc2VydCI6ICJ0b2dnbGVPdmVyd3JpdGUiLAogICAgIkVzYyI6ICJzaW5nbGVTZWxlY3Rpb24iCiAgfTsKICAvLyBOb3RlIHRoYXQgdGhlIHNhdmUgYW5kIGZpbmQtcmVsYXRlZCBjb21tYW5kcyBhcmVuJ3QgZGVmaW5lZCBieQogIC8vIGRlZmF1bHQuIFVzZXIgY29kZSBvciBhZGRvbnMgY2FuIGRlZmluZSB0aGVtLiBVbmtub3duIGNvbW1hbmRzCiAgLy8gYXJlIHNpbXBseSBpZ25vcmVkLgogIGtleU1hcC5wY0RlZmF1bHQgPSB7CiAgICAiQ3RybC1BIjogInNlbGVjdEFsbCIsICJDdHJsLUQiOiAiZGVsZXRlTGluZSIsICJDdHJsLVoiOiAidW5kbyIsICJTaGlmdC1DdHJsLVoiOiAicmVkbyIsICJDdHJsLVkiOiAicmVkbyIsCiAgICAiQ3RybC1Ib21lIjogImdvRG9jU3RhcnQiLCAiQ3RybC1VcCI6ICJnb0RvY1N0YXJ0IiwgIkN0cmwtRW5kIjogImdvRG9jRW5kIiwgIkN0cmwtRG93biI6ICJnb0RvY0VuZCIsCiAgICAiQ3RybC1MZWZ0IjogImdvR3JvdXBMZWZ0IiwgIkN0cmwtUmlnaHQiOiAiZ29Hcm91cFJpZ2h0IiwgIkFsdC1MZWZ0IjogImdvTGluZVN0YXJ0IiwgIkFsdC1SaWdodCI6ICJnb0xpbmVFbmQiLAogICAgIkN0cmwtQmFja3NwYWNlIjogImRlbEdyb3VwQmVmb3JlIiwgIkN0cmwtRGVsZXRlIjogImRlbEdyb3VwQWZ0ZXIiLCAiQ3RybC1TIjogInNhdmUiLCAiQ3RybC1GIjogImZpbmQiLAogICAgIkN0cmwtRyI6ICJmaW5kTmV4dCIsICJTaGlmdC1DdHJsLUciOiAiZmluZFByZXYiLCAiU2hpZnQtQ3RybC1GIjogInJlcGxhY2UiLCAiU2hpZnQtQ3RybC1SIjogInJlcGxhY2VBbGwiLAogICAgIkN0cmwtWyI6ICJpbmRlbnRMZXNzIiwgIkN0cmwtXSI6ICJpbmRlbnRNb3JlIiwKICAgICJDdHJsLVUiOiAidW5kb1NlbGVjdGlvbiIsICJTaGlmdC1DdHJsLVUiOiAicmVkb1NlbGVjdGlvbiIsICJBbHQtVSI6ICJyZWRvU2VsZWN0aW9uIiwKICAgIGZhbGx0aHJvdWdoOiAiYmFzaWMiCiAgfTsKICBrZXlNYXAubWFjRGVmYXVsdCA9IHsKICAgICJDbWQtQSI6ICJzZWxlY3RBbGwiLCAiQ21kLUQiOiAiZGVsZXRlTGluZSIsICJDbWQtWiI6ICJ1bmRvIiwgIlNoaWZ0LUNtZC1aIjogInJlZG8iLCAiQ21kLVkiOiAicmVkbyIsCiAgICAiQ21kLUhvbWUiOiAiZ29Eb2NTdGFydCIsICJDbWQtVXAiOiAiZ29Eb2NTdGFydCIsICJDbWQtRW5kIjogImdvRG9jRW5kIiwgIkNtZC1Eb3duIjogImdvRG9jRW5kIiwgIkFsdC1MZWZ0IjogImdvR3JvdXBMZWZ0IiwKICAgICJBbHQtUmlnaHQiOiAiZ29Hcm91cFJpZ2h0IiwgIkNtZC1MZWZ0IjogImdvTGluZUxlZnQiLCAiQ21kLVJpZ2h0IjogImdvTGluZVJpZ2h0IiwgIkFsdC1CYWNrc3BhY2UiOiAiZGVsR3JvdXBCZWZvcmUiLAogICAgIkN0cmwtQWx0LUJhY2tzcGFjZSI6ICJkZWxHcm91cEFmdGVyIiwgIkFsdC1EZWxldGUiOiAiZGVsR3JvdXBBZnRlciIsICJDbWQtUyI6ICJzYXZlIiwgIkNtZC1GIjogImZpbmQiLAogICAgIkNtZC1HIjogImZpbmROZXh0IiwgIlNoaWZ0LUNtZC1HIjogImZpbmRQcmV2IiwgIkNtZC1BbHQtRiI6ICJyZXBsYWNlIiwgIlNoaWZ0LUNtZC1BbHQtRiI6ICJyZXBsYWNlQWxsIiwKICAgICJDbWQtWyI6ICJpbmRlbnRMZXNzIiwgIkNtZC1dIjogImluZGVudE1vcmUiLCAiQ21kLUJhY2tzcGFjZSI6ICJkZWxXcmFwcGVkTGluZUxlZnQiLCAiQ21kLURlbGV0ZSI6ICJkZWxXcmFwcGVkTGluZVJpZ2h0IiwKICAgICJDbWQtVSI6ICJ1bmRvU2VsZWN0aW9uIiwgIlNoaWZ0LUNtZC1VIjogInJlZG9TZWxlY3Rpb24iLAogICAgZmFsbHRocm91Z2g6IFsiYmFzaWMiLCAiZW1hY3N5Il0KICB9OwogIC8vIFZlcnkgYmFzaWMgcmVhZGxpbmUvZW1hY3Mtc3R5bGUgYmluZGluZ3MsIHdoaWNoIGFyZSBzdGFuZGFyZCBvbiBNYWMuCiAga2V5TWFwLmVtYWNzeSA9IHsKICAgICJDdHJsLUYiOiAiZ29DaGFyUmlnaHQiLCAiQ3RybC1CIjogImdvQ2hhckxlZnQiLCAiQ3RybC1QIjogImdvTGluZVVwIiwgIkN0cmwtTiI6ICJnb0xpbmVEb3duIiwKICAgICJBbHQtRiI6ICJnb1dvcmRSaWdodCIsICJBbHQtQiI6ICJnb1dvcmRMZWZ0IiwgIkN0cmwtQSI6ICJnb0xpbmVTdGFydCIsICJDdHJsLUUiOiAiZ29MaW5lRW5kIiwKICAgICJDdHJsLVYiOiAiZ29QYWdlRG93biIsICJTaGlmdC1DdHJsLVYiOiAiZ29QYWdlVXAiLCAiQ3RybC1EIjogImRlbENoYXJBZnRlciIsICJDdHJsLUgiOiAiZGVsQ2hhckJlZm9yZSIsCiAgICAiQWx0LUQiOiAiZGVsV29yZEFmdGVyIiwgIkFsdC1CYWNrc3BhY2UiOiAiZGVsV29yZEJlZm9yZSIsICJDdHJsLUsiOiAia2lsbExpbmUiLCAiQ3RybC1UIjogInRyYW5zcG9zZUNoYXJzIgogIH07CiAga2V5TWFwWyJkZWZhdWx0Il0gPSBtYWMgPyBrZXlNYXAubWFjRGVmYXVsdCA6IGtleU1hcC5wY0RlZmF1bHQ7CgogIC8vIEtFWU1BUCBESVNQQVRDSAoKICBmdW5jdGlvbiBnZXRLZXlNYXAodmFsKSB7CiAgICBpZiAodHlwZW9mIHZhbCA9PSAic3RyaW5nIikgcmV0dXJuIGtleU1hcFt2YWxdOwogICAgZWxzZSByZXR1cm4gdmFsOwogIH0KCiAgLy8gR2l2ZW4gYW4gYXJyYXkgb2Yga2V5bWFwcyBhbmQgYSBrZXkgbmFtZSwgY2FsbCBoYW5kbGUgb24gYW55CiAgLy8gYmluZGluZ3MgZm91bmQsIHVudGlsIHRoYXQgcmV0dXJucyBhIHRydXRoeSB2YWx1ZSwgYXQgd2hpY2ggcG9pbnQKICAvLyB3ZSBjb25zaWRlciB0aGUga2V5IGhhbmRsZWQuIEltcGxlbWVudHMgdGhpbmdzIGxpa2UgYmluZGluZyBhIGtleQogIC8vIHRvIGZhbHNlIHN0b3BwaW5nIGZ1cnRoZXIgaGFuZGxpbmcgYW5kIGtleW1hcCBmYWxsdGhyb3VnaC4KICB2YXIgbG9va3VwS2V5ID0gQ29kZU1pcnJvci5sb29rdXBLZXkgPSBmdW5jdGlvbihuYW1lLCBtYXBzLCBoYW5kbGUpIHsKICAgIGZ1bmN0aW9uIGxvb2t1cChtYXApIHsKICAgICAgbWFwID0gZ2V0S2V5TWFwKG1hcCk7CiAgICAgIHZhciBmb3VuZCA9IG1hcFtuYW1lXTsKICAgICAgaWYgKGZvdW5kID09PSBmYWxzZSkgcmV0dXJuICJzdG9wIjsKICAgICAgaWYgKGZvdW5kICE9IG51bGwgJiYgaGFuZGxlKGZvdW5kKSkgcmV0dXJuIHRydWU7CiAgICAgIGlmIChtYXAubm9mYWxsdGhyb3VnaCkgcmV0dXJuICJzdG9wIjsKCiAgICAgIHZhciBmYWxsdGhyb3VnaCA9IG1hcC5mYWxsdGhyb3VnaDsKICAgICAgaWYgKGZhbGx0aHJvdWdoID09IG51bGwpIHJldHVybiBmYWxzZTsKICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChmYWxsdGhyb3VnaCkgIT0gIltvYmplY3QgQXJyYXldIikKICAgICAgICByZXR1cm4gbG9va3VwKGZhbGx0aHJvdWdoKTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmYWxsdGhyb3VnaC5sZW5ndGg7ICsraSkgewogICAgICAgIHZhciBkb25lID0gbG9va3VwKGZhbGx0aHJvdWdoW2ldKTsKICAgICAgICBpZiAoZG9uZSkgcmV0dXJuIGRvbmU7CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWFwcy5sZW5ndGg7ICsraSkgewogICAgICB2YXIgZG9uZSA9IGxvb2t1cChtYXBzW2ldKTsKICAgICAgaWYgKGRvbmUpIHJldHVybiBkb25lICE9ICJzdG9wIjsKICAgIH0KICB9OwoKICAvLyBNb2RpZmllciBrZXkgcHJlc3NlcyBkb24ndCBjb3VudCBhcyAncmVhbCcga2V5IHByZXNzZXMgZm9yIHRoZQogIC8vIHB1cnBvc2Ugb2Yga2V5bWFwIGZhbGx0aHJvdWdoLgogIHZhciBpc01vZGlmaWVyS2V5ID0gQ29kZU1pcnJvci5pc01vZGlmaWVyS2V5ID0gZnVuY3Rpb24oZXZlbnQpIHsKICAgIHZhciBuYW1lID0ga2V5TmFtZXNbZXZlbnQua2V5Q29kZV07CiAgICByZXR1cm4gbmFtZSA9PSAiQ3RybCIgfHwgbmFtZSA9PSAiQWx0IiB8fCBuYW1lID09ICJTaGlmdCIgfHwgbmFtZSA9PSAiTW9kIjsKICB9OwoKICAvLyBMb29rIHVwIHRoZSBuYW1lIG9mIGEga2V5IGFzIGluZGljYXRlZCBieSBhbiBldmVudCBvYmplY3QuCiAgdmFyIGtleU5hbWUgPSBDb2RlTWlycm9yLmtleU5hbWUgPSBmdW5jdGlvbihldmVudCwgbm9TaGlmdCkgewogICAgaWYgKHByZXN0byAmJiBldmVudC5rZXlDb2RlID09IDM0ICYmIGV2ZW50WyJjaGFyIl0pIHJldHVybiBmYWxzZTsKICAgIHZhciBuYW1lID0ga2V5TmFtZXNbZXZlbnQua2V5Q29kZV07CiAgICBpZiAobmFtZSA9PSBudWxsIHx8IGV2ZW50LmFsdEdyYXBoS2V5KSByZXR1cm4gZmFsc2U7CiAgICBpZiAoZXZlbnQuYWx0S2V5KSBuYW1lID0gIkFsdC0iICsgbmFtZTsKICAgIGlmIChmbGlwQ3RybENtZCA/IGV2ZW50Lm1ldGFLZXkgOiBldmVudC5jdHJsS2V5KSBuYW1lID0gIkN0cmwtIiArIG5hbWU7CiAgICBpZiAoZmxpcEN0cmxDbWQgPyBldmVudC5jdHJsS2V5IDogZXZlbnQubWV0YUtleSkgbmFtZSA9ICJDbWQtIiArIG5hbWU7CiAgICBpZiAoIW5vU2hpZnQgJiYgZXZlbnQuc2hpZnRLZXkpIG5hbWUgPSAiU2hpZnQtIiArIG5hbWU7CiAgICByZXR1cm4gbmFtZTsKICB9OwoKICAvLyBGUk9NVEVYVEFSRUEKCiAgQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEgPSBmdW5jdGlvbih0ZXh0YXJlYSwgb3B0aW9ucykgewogICAgaWYgKCFvcHRpb25zKSBvcHRpb25zID0ge307CiAgICBvcHRpb25zLnZhbHVlID0gdGV4dGFyZWEudmFsdWU7CiAgICBpZiAoIW9wdGlvbnMudGFiaW5kZXggJiYgdGV4dGFyZWEudGFiaW5kZXgpCiAgICAgIG9wdGlvbnMudGFiaW5kZXggPSB0ZXh0YXJlYS50YWJpbmRleDsKICAgIGlmICghb3B0aW9ucy5wbGFjZWhvbGRlciAmJiB0ZXh0YXJlYS5wbGFjZWhvbGRlcikKICAgICAgb3B0aW9ucy5wbGFjZWhvbGRlciA9IHRleHRhcmVhLnBsYWNlaG9sZGVyOwogICAgLy8gU2V0IGF1dG9mb2N1cyB0byB0cnVlIGlmIHRoaXMgdGV4dGFyZWEgaXMgZm9jdXNlZCwgb3IgaWYgaXQgaGFzCiAgICAvLyBhdXRvZm9jdXMgYW5kIG5vIG90aGVyIGVsZW1lbnQgaXMgZm9jdXNlZC4KICAgIGlmIChvcHRpb25zLmF1dG9mb2N1cyA9PSBudWxsKSB7CiAgICAgIHZhciBoYXNGb2N1cyA9IGFjdGl2ZUVsdCgpOwogICAgICBvcHRpb25zLmF1dG9mb2N1cyA9IGhhc0ZvY3VzID09IHRleHRhcmVhIHx8CiAgICAgICAgdGV4dGFyZWEuZ2V0QXR0cmlidXRlKCJhdXRvZm9jdXMiKSAhPSBudWxsICYmIGhhc0ZvY3VzID09IGRvY3VtZW50LmJvZHk7CiAgICB9CgogICAgZnVuY3Rpb24gc2F2ZSgpIHt0ZXh0YXJlYS52YWx1ZSA9IGNtLmdldFZhbHVlKCk7fQogICAgaWYgKHRleHRhcmVhLmZvcm0pIHsKICAgICAgb24odGV4dGFyZWEuZm9ybSwgInN1Ym1pdCIsIHNhdmUpOwogICAgICAvLyBEZXBsb3JhYmxlIGhhY2sgdG8gbWFrZSB0aGUgc3VibWl0IG1ldGhvZCBkbyB0aGUgcmlnaHQgdGhpbmcuCiAgICAgIGlmICghb3B0aW9ucy5sZWF2ZVN1Ym1pdE1ldGhvZEFsb25lKSB7CiAgICAgICAgdmFyIGZvcm0gPSB0ZXh0YXJlYS5mb3JtLCByZWFsU3VibWl0ID0gZm9ybS5zdWJtaXQ7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHZhciB3cmFwcGVkU3VibWl0ID0gZm9ybS5zdWJtaXQgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgc2F2ZSgpOwogICAgICAgICAgICBmb3JtLnN1Ym1pdCA9IHJlYWxTdWJtaXQ7CiAgICAgICAgICAgIGZvcm0uc3VibWl0KCk7CiAgICAgICAgICAgIGZvcm0uc3VibWl0ID0gd3JhcHBlZFN1Ym1pdDsKICAgICAgICAgIH07CiAgICAgICAgfSBjYXRjaChlKSB7fQogICAgICB9CiAgICB9CgogICAgdGV4dGFyZWEuc3R5bGUuZGlzcGxheSA9ICJub25lIjsKICAgIHZhciBjbSA9IENvZGVNaXJyb3IoZnVuY3Rpb24obm9kZSkgewogICAgICB0ZXh0YXJlYS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShub2RlLCB0ZXh0YXJlYS5uZXh0U2libGluZyk7CiAgICB9LCBvcHRpb25zKTsKICAgIGNtLnNhdmUgPSBzYXZlOwogICAgY20uZ2V0VGV4dEFyZWEgPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRleHRhcmVhOyB9OwogICAgY20udG9UZXh0QXJlYSA9IGZ1bmN0aW9uKCkgewogICAgICBzYXZlKCk7CiAgICAgIHRleHRhcmVhLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY20uZ2V0V3JhcHBlckVsZW1lbnQoKSk7CiAgICAgIHRleHRhcmVhLnN0eWxlLmRpc3BsYXkgPSAiIjsKICAgICAgaWYgKHRleHRhcmVhLmZvcm0pIHsKICAgICAgICBvZmYodGV4dGFyZWEuZm9ybSwgInN1Ym1pdCIsIHNhdmUpOwogICAgICAgIGlmICh0eXBlb2YgdGV4dGFyZWEuZm9ybS5zdWJtaXQgPT0gImZ1bmN0aW9uIikKICAgICAgICAgIHRleHRhcmVhLmZvcm0uc3VibWl0ID0gcmVhbFN1Ym1pdDsKICAgICAgfQogICAgfTsKICAgIHJldHVybiBjbTsKICB9OwoKICAvLyBTVFJJTkcgU1RSRUFNCgogIC8vIEZlZCB0byB0aGUgbW9kZSBwYXJzZXJzLCBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIG1ha2UKICAvLyBwYXJzZXJzIG1vcmUgc3VjY2luY3QuCgogIHZhciBTdHJpbmdTdHJlYW0gPSBDb2RlTWlycm9yLlN0cmluZ1N0cmVhbSA9IGZ1bmN0aW9uKHN0cmluZywgdGFiU2l6ZSkgewogICAgdGhpcy5wb3MgPSB0aGlzLnN0YXJ0ID0gMDsKICAgIHRoaXMuc3RyaW5nID0gc3RyaW5nOwogICAgdGhpcy50YWJTaXplID0gdGFiU2l6ZSB8fCA4OwogICAgdGhpcy5sYXN0Q29sdW1uUG9zID0gdGhpcy5sYXN0Q29sdW1uVmFsdWUgPSAwOwogICAgdGhpcy5saW5lU3RhcnQgPSAwOwogIH07CgogIFN0cmluZ1N0cmVhbS5wcm90b3R5cGUgPSB7CiAgICBlb2w6IGZ1bmN0aW9uKCkge3JldHVybiB0aGlzLnBvcyA+PSB0aGlzLnN0cmluZy5sZW5ndGg7fSwKICAgIHNvbDogZnVuY3Rpb24oKSB7cmV0dXJuIHRoaXMucG9zID09IHRoaXMubGluZVN0YXJ0O30sCiAgICBwZWVrOiBmdW5jdGlvbigpIHtyZXR1cm4gdGhpcy5zdHJpbmcuY2hhckF0KHRoaXMucG9zKSB8fCB1bmRlZmluZWQ7fSwKICAgIG5leHQ6IGZ1bmN0aW9uKCkgewogICAgICBpZiAodGhpcy5wb3MgPCB0aGlzLnN0cmluZy5sZW5ndGgpCiAgICAgICAgcmV0dXJuIHRoaXMuc3RyaW5nLmNoYXJBdCh0aGlzLnBvcysrKTsKICAgIH0sCiAgICBlYXQ6IGZ1bmN0aW9uKG1hdGNoKSB7CiAgICAgIHZhciBjaCA9IHRoaXMuc3RyaW5nLmNoYXJBdCh0aGlzLnBvcyk7CiAgICAgIGlmICh0eXBlb2YgbWF0Y2ggPT0gInN0cmluZyIpIHZhciBvayA9IGNoID09IG1hdGNoOwogICAgICBlbHNlIHZhciBvayA9IGNoICYmIChtYXRjaC50ZXN0ID8gbWF0Y2gudGVzdChjaCkgOiBtYXRjaChjaCkpOwogICAgICBpZiAob2spIHsrK3RoaXMucG9zOyByZXR1cm4gY2g7fQogICAgfSwKICAgIGVhdFdoaWxlOiBmdW5jdGlvbihtYXRjaCkgewogICAgICB2YXIgc3RhcnQgPSB0aGlzLnBvczsKICAgICAgd2hpbGUgKHRoaXMuZWF0KG1hdGNoKSl7fQogICAgICByZXR1cm4gdGhpcy5wb3MgPiBzdGFydDsKICAgIH0sCiAgICBlYXRTcGFjZTogZnVuY3Rpb24oKSB7CiAgICAgIHZhciBzdGFydCA9IHRoaXMucG9zOwogICAgICB3aGlsZSAoL1tcc1x1MDBhMF0vLnRlc3QodGhpcy5zdHJpbmcuY2hhckF0KHRoaXMucG9zKSkpICsrdGhpcy5wb3M7CiAgICAgIHJldHVybiB0aGlzLnBvcyA+IHN0YXJ0OwogICAgfSwKICAgIHNraXBUb0VuZDogZnVuY3Rpb24oKSB7dGhpcy5wb3MgPSB0aGlzLnN0cmluZy5sZW5ndGg7fSwKICAgIHNraXBUbzogZnVuY3Rpb24oY2gpIHsKICAgICAgdmFyIGZvdW5kID0gdGhpcy5zdHJpbmcuaW5kZXhPZihjaCwgdGhpcy5wb3MpOwogICAgICBpZiAoZm91bmQgPiAtMSkge3RoaXMucG9zID0gZm91bmQ7IHJldHVybiB0cnVlO30KICAgIH0sCiAgICBiYWNrVXA6IGZ1bmN0aW9uKG4pIHt0aGlzLnBvcyAtPSBuO30sCiAgICBjb2x1bW46IGZ1bmN0aW9uKCkgewogICAgICBpZiAodGhpcy5sYXN0Q29sdW1uUG9zIDwgdGhpcy5zdGFydCkgewogICAgICAgIHRoaXMubGFzdENvbHVtblZhbHVlID0gY291bnRDb2x1bW4odGhpcy5zdHJpbmcsIHRoaXMuc3RhcnQsIHRoaXMudGFiU2l6ZSwgdGhpcy5sYXN0Q29sdW1uUG9zLCB0aGlzLmxhc3RDb2x1bW5WYWx1ZSk7CiAgICAgICAgdGhpcy5sYXN0Q29sdW1uUG9zID0gdGhpcy5zdGFydDsKICAgICAgfQogICAgICByZXR1cm4gdGhpcy5sYXN0Q29sdW1uVmFsdWUgLSAodGhpcy5saW5lU3RhcnQgPyBjb3VudENvbHVtbih0aGlzLnN0cmluZywgdGhpcy5saW5lU3RhcnQsIHRoaXMudGFiU2l6ZSkgOiAwKTsKICAgIH0sCiAgICBpbmRlbnRhdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBjb3VudENvbHVtbih0aGlzLnN0cmluZywgbnVsbCwgdGhpcy50YWJTaXplKSAtCiAgICAgICAgKHRoaXMubGluZVN0YXJ0ID8gY291bnRDb2x1bW4odGhpcy5zdHJpbmcsIHRoaXMubGluZVN0YXJ0LCB0aGlzLnRhYlNpemUpIDogMCk7CiAgICB9LAogICAgbWF0Y2g6IGZ1bmN0aW9uKHBhdHRlcm4sIGNvbnN1bWUsIGNhc2VJbnNlbnNpdGl2ZSkgewogICAgICBpZiAodHlwZW9mIHBhdHRlcm4gPT0gInN0cmluZyIpIHsKICAgICAgICB2YXIgY2FzZWQgPSBmdW5jdGlvbihzdHIpIHtyZXR1cm4gY2FzZUluc2Vuc2l0aXZlID8gc3RyLnRvTG93ZXJDYXNlKCkgOiBzdHI7fTsKICAgICAgICB2YXIgc3Vic3RyID0gdGhpcy5zdHJpbmcuc3Vic3RyKHRoaXMucG9zLCBwYXR0ZXJuLmxlbmd0aCk7CiAgICAgICAgaWYgKGNhc2VkKHN1YnN0cikgPT0gY2FzZWQocGF0dGVybikpIHsKICAgICAgICAgIGlmIChjb25zdW1lICE9PSBmYWxzZSkgdGhpcy5wb3MgKz0gcGF0dGVybi5sZW5ndGg7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIG1hdGNoID0gdGhpcy5zdHJpbmcuc2xpY2UodGhpcy5wb3MpLm1hdGNoKHBhdHRlcm4pOwogICAgICAgIGlmIChtYXRjaCAmJiBtYXRjaC5pbmRleCA+IDApIHJldHVybiBudWxsOwogICAgICAgIGlmIChtYXRjaCAmJiBjb25zdW1lICE9PSBmYWxzZSkgdGhpcy5wb3MgKz0gbWF0Y2hbMF0ubGVuZ3RoOwogICAgICAgIHJldHVybiBtYXRjaDsKICAgICAgfQogICAgfSwKICAgIGN1cnJlbnQ6IGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RyaW5nLnNsaWNlKHRoaXMuc3RhcnQsIHRoaXMucG9zKTt9LAogICAgaGlkZUZpcnN0Q2hhcnM6IGZ1bmN0aW9uKG4sIGlubmVyKSB7CiAgICAgIHRoaXMubGluZVN0YXJ0ICs9IG47CiAgICAgIHRyeSB7IHJldHVybiBpbm5lcigpOyB9CiAgICAgIGZpbmFsbHkgeyB0aGlzLmxpbmVTdGFydCAtPSBuOyB9CiAgICB9CiAgfTsKCiAgLy8gVEVYVE1BUktFUlMKCiAgLy8gQ3JlYXRlZCB3aXRoIG1hcmtUZXh0IGFuZCBzZXRCb29rbWFyayBtZXRob2RzLiBBIFRleHRNYXJrZXIgaXMgYQogIC8vIGhhbmRsZSB0aGF0IGNhbiBiZSB1c2VkIHRvIGNsZWFyIG9yIGZpbmQgYSBtYXJrZWQgcG9zaXRpb24gaW4gdGhlCiAgLy8gZG9jdW1lbnQuIExpbmUgb2JqZWN0cyBob2xkIGFycmF5cyAobWFya2VkU3BhbnMpIGNvbnRhaW5pbmcKICAvLyB7ZnJvbSwgdG8sIG1hcmtlcn0gb2JqZWN0IHBvaW50aW5nIHRvIHN1Y2ggbWFya2VyIG9iamVjdHMsIGFuZAogIC8vIGluZGljYXRpbmcgdGhhdCBzdWNoIGEgbWFya2VyIGlzIHByZXNlbnQgb24gdGhhdCBsaW5lLiBNdWx0aXBsZQogIC8vIGxpbmVzIG1heSBwb2ludCB0byB0aGUgc2FtZSBtYXJrZXIgd2hlbiBpdCBzcGFucyBhY3Jvc3MgbGluZXMuCiAgLy8gVGhlIHNwYW5zIHdpbGwgaGF2ZSBudWxsIGZvciB0aGVpciBmcm9tL3RvIHByb3BlcnRpZXMgd2hlbiB0aGUKICAvLyBtYXJrZXIgY29udGludWVzIGJleW9uZCB0aGUgc3RhcnQvZW5kIG9mIHRoZSBsaW5lLiBNYXJrZXJzIGhhdmUKICAvLyBsaW5rcyBiYWNrIHRvIHRoZSBsaW5lcyB0aGV5IGN1cnJlbnRseSB0b3VjaC4KCiAgdmFyIFRleHRNYXJrZXIgPSBDb2RlTWlycm9yLlRleHRNYXJrZXIgPSBmdW5jdGlvbihkb2MsIHR5cGUpIHsKICAgIHRoaXMubGluZXMgPSBbXTsKICAgIHRoaXMudHlwZSA9IHR5cGU7CiAgICB0aGlzLmRvYyA9IGRvYzsKICB9OwogIGV2ZW50TWl4aW4oVGV4dE1hcmtlcik7CgogIC8vIENsZWFyIHRoZSBtYXJrZXIuCiAgVGV4dE1hcmtlci5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbigpIHsKICAgIGlmICh0aGlzLmV4cGxpY2l0bHlDbGVhcmVkKSByZXR1cm47CiAgICB2YXIgY20gPSB0aGlzLmRvYy5jbSwgd2l0aE9wID0gY20gJiYgIWNtLmN1ck9wOwogICAgaWYgKHdpdGhPcCkgc3RhcnRPcGVyYXRpb24oY20pOwogICAgaWYgKGhhc0hhbmRsZXIodGhpcywgImNsZWFyIikpIHsKICAgICAgdmFyIGZvdW5kID0gdGhpcy5maW5kKCk7CiAgICAgIGlmIChmb3VuZCkgc2lnbmFsTGF0ZXIodGhpcywgImNsZWFyIiwgZm91bmQuZnJvbSwgZm91bmQudG8pOwogICAgfQogICAgdmFyIG1pbiA9IG51bGwsIG1heCA9IG51bGw7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGluZXMubGVuZ3RoOyArK2kpIHsKICAgICAgdmFyIGxpbmUgPSB0aGlzLmxpbmVzW2ldOwogICAgICB2YXIgc3BhbiA9IGdldE1hcmtlZFNwYW5Gb3IobGluZS5tYXJrZWRTcGFucywgdGhpcyk7CiAgICAgIGlmIChjbSAmJiAhdGhpcy5jb2xsYXBzZWQpIHJlZ0xpbmVDaGFuZ2UoY20sIGxpbmVObyhsaW5lKSwgInRleHQiKTsKICAgICAgZWxzZSBpZiAoY20pIHsKICAgICAgICBpZiAoc3Bhbi50byAhPSBudWxsKSBtYXggPSBsaW5lTm8obGluZSk7CiAgICAgICAgaWYgKHNwYW4uZnJvbSAhPSBudWxsKSBtaW4gPSBsaW5lTm8obGluZSk7CiAgICAgIH0KICAgICAgbGluZS5tYXJrZWRTcGFucyA9IHJlbW92ZU1hcmtlZFNwYW4obGluZS5tYXJrZWRTcGFucywgc3Bhbik7CiAgICAgIGlmIChzcGFuLmZyb20gPT0gbnVsbCAmJiB0aGlzLmNvbGxhcHNlZCAmJiAhbGluZUlzSGlkZGVuKHRoaXMuZG9jLCBsaW5lKSAmJiBjbSkKICAgICAgICB1cGRhdGVMaW5lSGVpZ2h0KGxpbmUsIHRleHRIZWlnaHQoY20uZGlzcGxheSkpOwogICAgfQogICAgaWYgKGNtICYmIHRoaXMuY29sbGFwc2VkICYmICFjbS5vcHRpb25zLmxpbmVXcmFwcGluZykgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxpbmVzLmxlbmd0aDsgKytpKSB7CiAgICAgIHZhciB2aXN1YWwgPSB2aXN1YWxMaW5lKHRoaXMubGluZXNbaV0pLCBsZW4gPSBsaW5lTGVuZ3RoKHZpc3VhbCk7CiAgICAgIGlmIChsZW4gPiBjbS5kaXNwbGF5Lm1heExpbmVMZW5ndGgpIHsKICAgICAgICBjbS5kaXNwbGF5Lm1heExpbmUgPSB2aXN1YWw7CiAgICAgICAgY20uZGlzcGxheS5tYXhMaW5lTGVuZ3RoID0gbGVuOwogICAgICAgIGNtLmRpc3BsYXkubWF4TGluZUNoYW5nZWQgPSB0cnVlOwogICAgICB9CiAgICB9CgogICAgaWYgKG1pbiAhPSBudWxsICYmIGNtICYmIHRoaXMuY29sbGFwc2VkKSByZWdDaGFuZ2UoY20sIG1pbiwgbWF4ICsgMSk7CiAgICB0aGlzLmxpbmVzLmxlbmd0aCA9IDA7CiAgICB0aGlzLmV4cGxpY2l0bHlDbGVhcmVkID0gdHJ1ZTsKICAgIGlmICh0aGlzLmF0b21pYyAmJiB0aGlzLmRvYy5jYW50RWRpdCkgewogICAgICB0aGlzLmRvYy5jYW50RWRpdCA9IGZhbHNlOwogICAgICBpZiAoY20pIHJlQ2hlY2tTZWxlY3Rpb24oY20uZG9jKTsKICAgIH0KICAgIGlmIChjbSkgc2lnbmFsTGF0ZXIoY20sICJtYXJrZXJDbGVhcmVkIiwgY20sIHRoaXMpOwogICAgaWYgKHdpdGhPcCkgZW5kT3BlcmF0aW9uKGNtKTsKICAgIGlmICh0aGlzLnBhcmVudCkgdGhpcy5wYXJlbnQuY2xlYXIoKTsKICB9OwoKICAvLyBGaW5kIHRoZSBwb3NpdGlvbiBvZiB0aGUgbWFya2VyIGluIHRoZSBkb2N1bWVudC4gUmV0dXJucyBhIHtmcm9tLAogIC8vIHRvfSBvYmplY3QgYnkgZGVmYXVsdC4gU2lkZSBjYW4gYmUgcGFzc2VkIHRvIGdldCBhIHNwZWNpZmljIHNpZGUKICAvLyAtLSAwIChib3RoKSwgLTEgKGxlZnQpLCBvciAxIChyaWdodCkuIFdoZW4gbGluZU9iaiBpcyB0cnVlLCB0aGUKICAvLyBQb3Mgb2JqZWN0cyByZXR1cm5lZCBjb250YWluIGEgbGluZSBvYmplY3QsIHJhdGhlciB0aGFuIGEgbGluZQogIC8vIG51bWJlciAodXNlZCB0byBwcmV2ZW50IGxvb2tpbmcgdXAgdGhlIHNhbWUgbGluZSB0d2ljZSkuCiAgVGV4dE1hcmtlci5wcm90b3R5cGUuZmluZCA9IGZ1bmN0aW9uKHNpZGUsIGxpbmVPYmopIHsKICAgIGlmIChzaWRlID09IG51bGwgJiYgdGhpcy50eXBlID09ICJib29rbWFyayIpIHNpZGUgPSAxOwogICAgdmFyIGZyb20sIHRvOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxpbmVzLmxlbmd0aDsgKytpKSB7CiAgICAgIHZhciBsaW5lID0gdGhpcy5saW5lc1tpXTsKICAgICAgdmFyIHNwYW4gPSBnZXRNYXJrZWRTcGFuRm9yKGxpbmUubWFya2VkU3BhbnMsIHRoaXMpOwogICAgICBpZiAoc3Bhbi5mcm9tICE9IG51bGwpIHsKICAgICAgICBmcm9tID0gUG9zKGxpbmVPYmogPyBsaW5lIDogbGluZU5vKGxpbmUpLCBzcGFuLmZyb20pOwogICAgICAgIGlmIChzaWRlID09IC0xKSByZXR1cm4gZnJvbTsKICAgICAgfQogICAgICBpZiAoc3Bhbi50byAhPSBudWxsKSB7CiAgICAgICAgdG8gPSBQb3MobGluZU9iaiA/IGxpbmUgOiBsaW5lTm8obGluZSksIHNwYW4udG8pOwogICAgICAgIGlmIChzaWRlID09IDEpIHJldHVybiB0bzsKICAgICAgfQogICAgfQogICAgcmV0dXJuIGZyb20gJiYge2Zyb206IGZyb20sIHRvOiB0b307CiAgfTsKCiAgLy8gU2lnbmFscyB0aGF0IHRoZSBtYXJrZXIncyB3aWRnZXQgY2hhbmdlZCwgYW5kIHN1cnJvdW5kaW5nIGxheW91dAogIC8vIHNob3VsZCBiZSByZWNvbXB1dGVkLgogIFRleHRNYXJrZXIucHJvdG90eXBlLmNoYW5nZWQgPSBmdW5jdGlvbigpIHsKICAgIHZhciBwb3MgPSB0aGlzLmZpbmQoLTEsIHRydWUpLCB3aWRnZXQgPSB0aGlzLCBjbSA9IHRoaXMuZG9jLmNtOwogICAgaWYgKCFwb3MgfHwgIWNtKSByZXR1cm47CiAgICBydW5Jbk9wKGNtLCBmdW5jdGlvbigpIHsKICAgICAgdmFyIGxpbmUgPSBwb3MubGluZSwgbGluZU4gPSBsaW5lTm8ocG9zLmxpbmUpOwogICAgICB2YXIgdmlldyA9IGZpbmRWaWV3Rm9yTGluZShjbSwgbGluZU4pOwogICAgICBpZiAodmlldykgewogICAgICAgIGNsZWFyTGluZU1lYXN1cmVtZW50Q2FjaGVGb3Iodmlldyk7CiAgICAgICAgY20uY3VyT3Auc2VsZWN0aW9uQ2hhbmdlZCA9IGNtLmN1ck9wLmZvcmNlVXBkYXRlID0gdHJ1ZTsKICAgICAgfQogICAgICBjbS5jdXJPcC51cGRhdGVNYXhMaW5lID0gdHJ1ZTsKICAgICAgaWYgKCFsaW5lSXNIaWRkZW4od2lkZ2V0LmRvYywgbGluZSkgJiYgd2lkZ2V0LmhlaWdodCAhPSBudWxsKSB7CiAgICAgICAgdmFyIG9sZEhlaWdodCA9IHdpZGdldC5oZWlnaHQ7CiAgICAgICAgd2lkZ2V0LmhlaWdodCA9IG51bGw7CiAgICAgICAgdmFyIGRIZWlnaHQgPSB3aWRnZXRIZWlnaHQod2lkZ2V0KSAtIG9sZEhlaWdodDsKICAgICAgICBpZiAoZEhlaWdodCkKICAgICAgICAgIHVwZGF0ZUxpbmVIZWlnaHQobGluZSwgbGluZS5oZWlnaHQgKyBkSGVpZ2h0KTsKICAgICAgfQogICAgfSk7CiAgfTsKCiAgVGV4dE1hcmtlci5wcm90b3R5cGUuYXR0YWNoTGluZSA9IGZ1bmN0aW9uKGxpbmUpIHsKICAgIGlmICghdGhpcy5saW5lcy5sZW5ndGggJiYgdGhpcy5kb2MuY20pIHsKICAgICAgdmFyIG9wID0gdGhpcy5kb2MuY20uY3VyT3A7CiAgICAgIGlmICghb3AubWF5YmVIaWRkZW5NYXJrZXJzIHx8IGluZGV4T2Yob3AubWF5YmVIaWRkZW5NYXJrZXJzLCB0aGlzKSA9PSAtMSkKICAgICAgICAob3AubWF5YmVVbmhpZGRlbk1hcmtlcnMgfHwgKG9wLm1heWJlVW5oaWRkZW5NYXJrZXJzID0gW10pKS5wdXNoKHRoaXMpOwogICAgfQogICAgdGhpcy5saW5lcy5wdXNoKGxpbmUpOwogIH07CiAgVGV4dE1hcmtlci5wcm90b3R5cGUuZGV0YWNoTGluZSA9IGZ1bmN0aW9uKGxpbmUpIHsKICAgIHRoaXMubGluZXMuc3BsaWNlKGluZGV4T2YodGhpcy5saW5lcywgbGluZSksIDEpOwogICAgaWYgKCF0aGlzLmxpbmVzLmxlbmd0aCAmJiB0aGlzLmRvYy5jbSkgewogICAgICB2YXIgb3AgPSB0aGlzLmRvYy5jbS5jdXJPcDsKICAgICAgKG9wLm1heWJlSGlkZGVuTWFya2VycyB8fCAob3AubWF5YmVIaWRkZW5NYXJrZXJzID0gW10pKS5wdXNoKHRoaXMpOwogICAgfQogIH07CgogIC8vIENvbGxhcHNlZCBtYXJrZXJzIGhhdmUgdW5pcXVlIGlkcywgaW4gb3JkZXIgdG8gYmUgYWJsZSB0byBvcmRlcgogIC8vIHRoZW0sIHdoaWNoIGlzIG5lZWRlZCBmb3IgdW5pcXVlbHkgZGV0ZXJtaW5pbmcgYW4gb3V0ZXIgbWFya2VyCiAgLy8gd2hlbiB0aGV5IG92ZXJsYXAgKHRoZXkgbWF5IG5lc3QsIGJ1dCBub3QgcGFydGlhbGx5IG92ZXJsYXApLgogIHZhciBuZXh0TWFya2VySWQgPSAwOwoKICAvLyBDcmVhdGUgYSBtYXJrZXIsIHdpcmUgaXQgdXAgdG8gdGhlIHJpZ2h0IGxpbmVzLCBhbmQKICBmdW5jdGlvbiBtYXJrVGV4dChkb2MsIGZyb20sIHRvLCBvcHRpb25zLCB0eXBlKSB7CiAgICAvLyBTaGFyZWQgbWFya2VycyAoYWNyb3NzIGxpbmtlZCBkb2N1bWVudHMpIGFyZSBoYW5kbGVkIHNlcGFyYXRlbHkKICAgIC8vIChtYXJrVGV4dFNoYXJlZCB3aWxsIGNhbGwgb3V0IHRvIHRoaXMgYWdhaW4sIG9uY2UgcGVyCiAgICAvLyBkb2N1bWVudCkuCiAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnNoYXJlZCkgcmV0dXJuIG1hcmtUZXh0U2hhcmVkKGRvYywgZnJvbSwgdG8sIG9wdGlvbnMsIHR5cGUpOwogICAgLy8gRW5zdXJlIHdlIGFyZSBpbiBhbiBvcGVyYXRpb24uCiAgICBpZiAoZG9jLmNtICYmICFkb2MuY20uY3VyT3ApIHJldHVybiBvcGVyYXRpb24oZG9jLmNtLCBtYXJrVGV4dCkoZG9jLCBmcm9tLCB0bywgb3B0aW9ucywgdHlwZSk7CgogICAgdmFyIG1hcmtlciA9IG5ldyBUZXh0TWFya2VyKGRvYywgdHlwZSksIGRpZmYgPSBjbXAoZnJvbSwgdG8pOwogICAgaWYgKG9wdGlvbnMpIGNvcHlPYmoob3B0aW9ucywgbWFya2VyLCBmYWxzZSk7CiAgICAvLyBEb24ndCBjb25uZWN0IGVtcHR5IG1hcmtlcnMgdW5sZXNzIGNsZWFyV2hlbkVtcHR5IGlzIGZhbHNlCiAgICBpZiAoZGlmZiA+IDAgfHwgZGlmZiA9PSAwICYmIG1hcmtlci5jbGVhcldoZW5FbXB0eSAhPT0gZmFsc2UpCiAgICAgIHJldHVybiBtYXJrZXI7CiAgICBpZiAobWFya2VyLnJlcGxhY2VkV2l0aCkgewogICAgICAvLyBTaG93aW5nIHVwIGFzIGEgd2lkZ2V0IGltcGxpZXMgY29sbGFwc2VkICh3aWRnZXQgcmVwbGFjZXMgdGV4dCkKICAgICAgbWFya2VyLmNvbGxhcHNlZCA9IHRydWU7CiAgICAgIG1hcmtlci53aWRnZXROb2RlID0gZWx0KCJzcGFuIiwgW21hcmtlci5yZXBsYWNlZFdpdGhdLCAiQ29kZU1pcnJvci13aWRnZXQiKTsKICAgICAgaWYgKCFvcHRpb25zLmhhbmRsZU1vdXNlRXZlbnRzKSBtYXJrZXIud2lkZ2V0Tm9kZS5pZ25vcmVFdmVudHMgPSB0cnVlOwogICAgICBpZiAob3B0aW9ucy5pbnNlcnRMZWZ0KSBtYXJrZXIud2lkZ2V0Tm9kZS5pbnNlcnRMZWZ0ID0gdHJ1ZTsKICAgIH0KICAgIGlmIChtYXJrZXIuY29sbGFwc2VkKSB7CiAgICAgIGlmIChjb25mbGljdGluZ0NvbGxhcHNlZFJhbmdlKGRvYywgZnJvbS5saW5lLCBmcm9tLCB0bywgbWFya2VyKSB8fAogICAgICAgICAgZnJvbS5saW5lICE9IHRvLmxpbmUgJiYgY29uZmxpY3RpbmdDb2xsYXBzZWRSYW5nZShkb2MsIHRvLmxpbmUsIGZyb20sIHRvLCBtYXJrZXIpKQogICAgICAgIHRocm93IG5ldyBFcnJvcigiSW5zZXJ0aW5nIGNvbGxhcHNlZCBtYXJrZXIgcGFydGlhbGx5IG92ZXJsYXBwaW5nIGFuIGV4aXN0aW5nIG9uZSIpOwogICAgICBzYXdDb2xsYXBzZWRTcGFucyA9IHRydWU7CiAgICB9CgogICAgaWYgKG1hcmtlci5hZGRUb0hpc3RvcnkpCiAgICAgIGFkZENoYW5nZVRvSGlzdG9yeShkb2MsIHtmcm9tOiBmcm9tLCB0bzogdG8sIG9yaWdpbjogIm1hcmtUZXh0In0sIGRvYy5zZWwsIE5hTik7CgogICAgdmFyIGN1ckxpbmUgPSBmcm9tLmxpbmUsIGNtID0gZG9jLmNtLCB1cGRhdGVNYXhMaW5lOwogICAgZG9jLml0ZXIoY3VyTGluZSwgdG8ubGluZSArIDEsIGZ1bmN0aW9uKGxpbmUpIHsKICAgICAgaWYgKGNtICYmIG1hcmtlci5jb2xsYXBzZWQgJiYgIWNtLm9wdGlvbnMubGluZVdyYXBwaW5nICYmIHZpc3VhbExpbmUobGluZSkgPT0gY20uZGlzcGxheS5tYXhMaW5lKQogICAgICAgIHVwZGF0ZU1heExpbmUgPSB0cnVlOwogICAgICBpZiAobWFya2VyLmNvbGxhcHNlZCAmJiBjdXJMaW5lICE9IGZyb20ubGluZSkgdXBkYXRlTGluZUhlaWdodChsaW5lLCAwKTsKICAgICAgYWRkTWFya2VkU3BhbihsaW5lLCBuZXcgTWFya2VkU3BhbihtYXJrZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyTGluZSA9PSBmcm9tLmxpbmUgPyBmcm9tLmNoIDogbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJMaW5lID09IHRvLmxpbmUgPyB0by5jaCA6IG51bGwpKTsKICAgICAgKytjdXJMaW5lOwogICAgfSk7CiAgICAvLyBsaW5lSXNIaWRkZW4gZGVwZW5kcyBvbiB0aGUgcHJlc2VuY2Ugb2YgdGhlIHNwYW5zLCBzbyBuZWVkcyBhIHNlY29uZCBwYXNzCiAgICBpZiAobWFya2VyLmNvbGxhcHNlZCkgZG9jLml0ZXIoZnJvbS5saW5lLCB0by5saW5lICsgMSwgZnVuY3Rpb24obGluZSkgewogICAgICBpZiAobGluZUlzSGlkZGVuKGRvYywgbGluZSkpIHVwZGF0ZUxpbmVIZWlnaHQobGluZSwgMCk7CiAgICB9KTsKCiAgICBpZiAobWFya2VyLmNsZWFyT25FbnRlcikgb24obWFya2VyLCAiYmVmb3JlQ3Vyc29yRW50ZXIiLCBmdW5jdGlvbigpIHsgbWFya2VyLmNsZWFyKCk7IH0pOwoKICAgIGlmIChtYXJrZXIucmVhZE9ubHkpIHsKICAgICAgc2F3UmVhZE9ubHlTcGFucyA9IHRydWU7CiAgICAgIGlmIChkb2MuaGlzdG9yeS5kb25lLmxlbmd0aCB8fCBkb2MuaGlzdG9yeS51bmRvbmUubGVuZ3RoKQogICAgICAgIGRvYy5jbGVhckhpc3RvcnkoKTsKICAgIH0KICAgIGlmIChtYXJrZXIuY29sbGFwc2VkKSB7CiAgICAgIG1hcmtlci5pZCA9ICsrbmV4dE1hcmtlcklkOwogICAgICBtYXJrZXIuYXRvbWljID0gdHJ1ZTsKICAgIH0KICAgIGlmIChjbSkgewogICAgICAvLyBTeW5jIGVkaXRvciBzdGF0ZQogICAgICBpZiAodXBkYXRlTWF4TGluZSkgY20uY3VyT3AudXBkYXRlTWF4TGluZSA9IHRydWU7CiAgICAgIGlmIChtYXJrZXIuY29sbGFwc2VkKQogICAgICAgIHJlZ0NoYW5nZShjbSwgZnJvbS5saW5lLCB0by5saW5lICsgMSk7CiAgICAgIGVsc2UgaWYgKG1hcmtlci5jbGFzc05hbWUgfHwgbWFya2VyLnRpdGxlIHx8IG1hcmtlci5zdGFydFN0eWxlIHx8IG1hcmtlci5lbmRTdHlsZSkKICAgICAgICBmb3IgKHZhciBpID0gZnJvbS5saW5lOyBpIDw9IHRvLmxpbmU7IGkrKykgcmVnTGluZUNoYW5nZShjbSwgaSwgInRleHQiKTsKICAgICAgaWYgKG1hcmtlci5hdG9taWMpIHJlQ2hlY2tTZWxlY3Rpb24oY20uZG9jKTsKICAgICAgc2lnbmFsTGF0ZXIoY20sICJtYXJrZXJBZGRlZCIsIGNtLCBtYXJrZXIpOwogICAgfQogICAgcmV0dXJuIG1hcmtlcjsKICB9CgogIC8vIFNIQVJFRCBURVhUTUFSS0VSUwoKICAvLyBBIHNoYXJlZCBtYXJrZXIgc3BhbnMgbXVsdGlwbGUgbGlua2VkIGRvY3VtZW50cy4gSXQgaXMKICAvLyBpbXBsZW1lbnRlZCBhcyBhIG1ldGEtbWFya2VyLW9iamVjdCBjb250cm9sbGluZyBtdWx0aXBsZSBub3JtYWwKICAvLyBtYXJrZXJzLgogIHZhciBTaGFyZWRUZXh0TWFya2VyID0gQ29kZU1pcnJvci5TaGFyZWRUZXh0TWFya2VyID0gZnVuY3Rpb24obWFya2VycywgcHJpbWFyeSkgewogICAgdGhpcy5tYXJrZXJzID0gbWFya2VyczsKICAgIHRoaXMucHJpbWFyeSA9IHByaW1hcnk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyArK2kpCiAgICAgIG1hcmtlcnNbaV0ucGFyZW50ID0gdGhpczsKICB9OwogIGV2ZW50TWl4aW4oU2hhcmVkVGV4dE1hcmtlcik7CgogIFNoYXJlZFRleHRNYXJrZXIucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24oKSB7CiAgICBpZiAodGhpcy5leHBsaWNpdGx5Q2xlYXJlZCkgcmV0dXJuOwogICAgdGhpcy5leHBsaWNpdGx5Q2xlYXJlZCA9IHRydWU7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubWFya2Vycy5sZW5ndGg7ICsraSkKICAgICAgdGhpcy5tYXJrZXJzW2ldLmNsZWFyKCk7CiAgICBzaWduYWxMYXRlcih0aGlzLCAiY2xlYXIiKTsKICB9OwogIFNoYXJlZFRleHRNYXJrZXIucHJvdG90eXBlLmZpbmQgPSBmdW5jdGlvbihzaWRlLCBsaW5lT2JqKSB7CiAgICByZXR1cm4gdGhpcy5wcmltYXJ5LmZpbmQoc2lkZSwgbGluZU9iaik7CiAgfTsKCiAgZnVuY3Rpb24gbWFya1RleHRTaGFyZWQoZG9jLCBmcm9tLCB0bywgb3B0aW9ucywgdHlwZSkgewogICAgb3B0aW9ucyA9IGNvcHlPYmoob3B0aW9ucyk7CiAgICBvcHRpb25zLnNoYXJlZCA9IGZhbHNlOwogICAgdmFyIG1hcmtlcnMgPSBbbWFya1RleHQoZG9jLCBmcm9tLCB0bywgb3B0aW9ucywgdHlwZSldLCBwcmltYXJ5ID0gbWFya2Vyc1swXTsKICAgIHZhciB3aWRnZXQgPSBvcHRpb25zLndpZGdldE5vZGU7CiAgICBsaW5rZWREb2NzKGRvYywgZnVuY3Rpb24oZG9jKSB7CiAgICAgIGlmICh3aWRnZXQpIG9wdGlvbnMud2lkZ2V0Tm9kZSA9IHdpZGdldC5jbG9uZU5vZGUodHJ1ZSk7CiAgICAgIG1hcmtlcnMucHVzaChtYXJrVGV4dChkb2MsIGNsaXBQb3MoZG9jLCBmcm9tKSwgY2xpcFBvcyhkb2MsIHRvKSwgb3B0aW9ucywgdHlwZSkpOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRvYy5saW5rZWQubGVuZ3RoOyArK2kpCiAgICAgICAgaWYgKGRvYy5saW5rZWRbaV0uaXNQYXJlbnQpIHJldHVybjsKICAgICAgcHJpbWFyeSA9IGxzdChtYXJrZXJzKTsKICAgIH0pOwogICAgcmV0dXJuIG5ldyBTaGFyZWRUZXh0TWFya2VyKG1hcmtlcnMsIHByaW1hcnkpOwogIH0KCiAgZnVuY3Rpb24gZmluZFNoYXJlZE1hcmtlcnMoZG9jKSB7CiAgICByZXR1cm4gZG9jLmZpbmRNYXJrcyhQb3MoZG9jLmZpcnN0LCAwKSwgZG9jLmNsaXBQb3MoUG9zKGRvYy5sYXN0TGluZSgpKSksCiAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbihtKSB7IHJldHVybiBtLnBhcmVudDsgfSk7CiAgfQoKICBmdW5jdGlvbiBjb3B5U2hhcmVkTWFya2Vycyhkb2MsIG1hcmtlcnMpIHsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWFya2Vycy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgbWFya2VyID0gbWFya2Vyc1tpXSwgcG9zID0gbWFya2VyLmZpbmQoKTsKICAgICAgdmFyIG1Gcm9tID0gZG9jLmNsaXBQb3MocG9zLmZyb20pLCBtVG8gPSBkb2MuY2xpcFBvcyhwb3MudG8pOwogICAgICBpZiAoY21wKG1Gcm9tLCBtVG8pKSB7CiAgICAgICAgdmFyIHN1Yk1hcmsgPSBtYXJrVGV4dChkb2MsIG1Gcm9tLCBtVG8sIG1hcmtlci5wcmltYXJ5LCBtYXJrZXIucHJpbWFyeS50eXBlKTsKICAgICAgICBtYXJrZXIubWFya2Vycy5wdXNoKHN1Yk1hcmspOwogICAgICAgIHN1Yk1hcmsucGFyZW50ID0gbWFya2VyOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBkZXRhY2hTaGFyZWRNYXJrZXJzKG1hcmtlcnMpIHsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWFya2Vycy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgbWFya2VyID0gbWFya2Vyc1tpXSwgbGlua2VkID0gW21hcmtlci5wcmltYXJ5LmRvY107OwogICAgICBsaW5rZWREb2NzKG1hcmtlci5wcmltYXJ5LmRvYywgZnVuY3Rpb24oZCkgeyBsaW5rZWQucHVzaChkKTsgfSk7CiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbWFya2VyLm1hcmtlcnMubGVuZ3RoOyBqKyspIHsKICAgICAgICB2YXIgc3ViTWFya2VyID0gbWFya2VyLm1hcmtlcnNbal07CiAgICAgICAgaWYgKGluZGV4T2YobGlua2VkLCBzdWJNYXJrZXIuZG9jKSA9PSAtMSkgewogICAgICAgICAgc3ViTWFya2VyLnBhcmVudCA9IG51bGw7CiAgICAgICAgICBtYXJrZXIubWFya2Vycy5zcGxpY2Uoai0tLCAxKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIC8vIFRFWFRNQVJLRVIgU1BBTlMKCiAgZnVuY3Rpb24gTWFya2VkU3BhbihtYXJrZXIsIGZyb20sIHRvKSB7CiAgICB0aGlzLm1hcmtlciA9IG1hcmtlcjsKICAgIHRoaXMuZnJvbSA9IGZyb207IHRoaXMudG8gPSB0bzsKICB9CgogIC8vIFNlYXJjaCBhbiBhcnJheSBvZiBzcGFucyBmb3IgYSBzcGFuIG1hdGNoaW5nIHRoZSBnaXZlbiBtYXJrZXIuCiAgZnVuY3Rpb24gZ2V0TWFya2VkU3BhbkZvcihzcGFucywgbWFya2VyKSB7CiAgICBpZiAoc3BhbnMpIGZvciAodmFyIGkgPSAwOyBpIDwgc3BhbnMubGVuZ3RoOyArK2kpIHsKICAgICAgdmFyIHNwYW4gPSBzcGFuc1tpXTsKICAgICAgaWYgKHNwYW4ubWFya2VyID09IG1hcmtlcikgcmV0dXJuIHNwYW47CiAgICB9CiAgfQogIC8vIFJlbW92ZSBhIHNwYW4gZnJvbSBhbiBhcnJheSwgcmV0dXJuaW5nIHVuZGVmaW5lZCBpZiBubyBzcGFucyBhcmUKICAvLyBsZWZ0ICh3ZSBkb24ndCBzdG9yZSBhcnJheXMgZm9yIGxpbmVzIHdpdGhvdXQgc3BhbnMpLgogIGZ1bmN0aW9uIHJlbW92ZU1hcmtlZFNwYW4oc3BhbnMsIHNwYW4pIHsKICAgIGZvciAodmFyIHIsIGkgPSAwOyBpIDwgc3BhbnMubGVuZ3RoOyArK2kpCiAgICAgIGlmIChzcGFuc1tpXSAhPSBzcGFuKSAociB8fCAociA9IFtdKSkucHVzaChzcGFuc1tpXSk7CiAgICByZXR1cm4gcjsKICB9CiAgLy8gQWRkIGEgc3BhbiB0byBhIGxpbmUuCiAgZnVuY3Rpb24gYWRkTWFya2VkU3BhbihsaW5lLCBzcGFuKSB7CiAgICBsaW5lLm1hcmtlZFNwYW5zID0gbGluZS5tYXJrZWRTcGFucyA/IGxpbmUubWFya2VkU3BhbnMuY29uY2F0KFtzcGFuXSkgOiBbc3Bhbl07CiAgICBzcGFuLm1hcmtlci5hdHRhY2hMaW5lKGxpbmUpOwogIH0KCiAgLy8gVXNlZCBmb3IgdGhlIGFsZ29yaXRobSB0aGF0IGFkanVzdHMgbWFya2VycyBmb3IgYSBjaGFuZ2UgaW4gdGhlCiAgLy8gZG9jdW1lbnQuIFRoZXNlIGZ1bmN0aW9ucyBjdXQgYW4gYXJyYXkgb2Ygc3BhbnMgYXQgYSBnaXZlbgogIC8vIGNoYXJhY3RlciBwb3NpdGlvbiwgcmV0dXJuaW5nIGFuIGFycmF5IG9mIHJlbWFpbmluZyBjaHVua3MgKG9yCiAgLy8gdW5kZWZpbmVkIGlmIG5vdGhpbmcgcmVtYWlucykuCiAgZnVuY3Rpb24gbWFya2VkU3BhbnNCZWZvcmUob2xkLCBzdGFydENoLCBpc0luc2VydCkgewogICAgaWYgKG9sZCkgZm9yICh2YXIgaSA9IDAsIG53OyBpIDwgb2xkLmxlbmd0aDsgKytpKSB7CiAgICAgIHZhciBzcGFuID0gb2xkW2ldLCBtYXJrZXIgPSBzcGFuLm1hcmtlcjsKICAgICAgdmFyIHN0YXJ0c0JlZm9yZSA9IHNwYW4uZnJvbSA9PSBudWxsIHx8IChtYXJrZXIuaW5jbHVzaXZlTGVmdCA/IHNwYW4uZnJvbSA8PSBzdGFydENoIDogc3Bhbi5mcm9tIDwgc3RhcnRDaCk7CiAgICAgIGlmIChzdGFydHNCZWZvcmUgfHwgc3Bhbi5mcm9tID09IHN0YXJ0Q2ggJiYgbWFya2VyLnR5cGUgPT0gImJvb2ttYXJrIiAmJiAoIWlzSW5zZXJ0IHx8ICFzcGFuLm1hcmtlci5pbnNlcnRMZWZ0KSkgewogICAgICAgIHZhciBlbmRzQWZ0ZXIgPSBzcGFuLnRvID09IG51bGwgfHwgKG1hcmtlci5pbmNsdXNpdmVSaWdodCA/IHNwYW4udG8gPj0gc3RhcnRDaCA6IHNwYW4udG8gPiBzdGFydENoKTsKICAgICAgICAobncgfHwgKG53ID0gW10pKS5wdXNoKG5ldyBNYXJrZWRTcGFuKG1hcmtlciwgc3Bhbi5mcm9tLCBlbmRzQWZ0ZXIgPyBudWxsIDogc3Bhbi50bykpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbnc7CiAgfQogIGZ1bmN0aW9uIG1hcmtlZFNwYW5zQWZ0ZXIob2xkLCBlbmRDaCwgaXNJbnNlcnQpIHsKICAgIGlmIChvbGQpIGZvciAodmFyIGkgPSAwLCBudzsgaSA8IG9sZC5sZW5ndGg7ICsraSkgewogICAgICB2YXIgc3BhbiA9IG9sZFtpXSwgbWFya2VyID0gc3Bhbi5tYXJrZXI7CiAgICAgIHZhciBlbmRzQWZ0ZXIgPSBzcGFuLnRvID09IG51bGwgfHwgKG1hcmtlci5pbmNsdXNpdmVSaWdodCA/IHNwYW4udG8gPj0gZW5kQ2ggOiBzcGFuLnRvID4gZW5kQ2gpOwogICAgICBpZiAoZW5kc0FmdGVyIHx8IHNwYW4uZnJvbSA9PSBlbmRDaCAmJiBtYXJrZXIudHlwZSA9PSAiYm9va21hcmsiICYmICghaXNJbnNlcnQgfHwgc3Bhbi5tYXJrZXIuaW5zZXJ0TGVmdCkpIHsKICAgICAgICB2YXIgc3RhcnRzQmVmb3JlID0gc3Bhbi5mcm9tID09IG51bGwgfHwgKG1hcmtlci5pbmNsdXNpdmVMZWZ0ID8gc3Bhbi5mcm9tIDw9IGVuZENoIDogc3Bhbi5mcm9tIDwgZW5kQ2gpOwogICAgICAgIChudyB8fCAobncgPSBbXSkpLnB1c2gobmV3IE1hcmtlZFNwYW4obWFya2VyLCBzdGFydHNCZWZvcmUgPyBudWxsIDogc3Bhbi5mcm9tIC0gZW5kQ2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFuLnRvID09IG51bGwgPyBudWxsIDogc3Bhbi50byAtIGVuZENoKSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBudzsKICB9CgogIC8vIEdpdmVuIGEgY2hhbmdlIG9iamVjdCwgY29tcHV0ZSB0aGUgbmV3IHNldCBvZiBtYXJrZXIgc3BhbnMgdGhhdAogIC8vIGNvdmVyIHRoZSBsaW5lIGluIHdoaWNoIHRoZSBjaGFuZ2UgdG9vayBwbGFjZS4gUmVtb3ZlcyBzcGFucwogIC8vIGVudGlyZWx5IHdpdGhpbiB0aGUgY2hhbmdlLCByZWNvbm5lY3RzIHNwYW5zIGJlbG9uZ2luZyB0byB0aGUKICAvLyBzYW1lIG1hcmtlciB0aGF0IGFwcGVhciBvbiBib3RoIHNpZGVzIG9mIHRoZSBjaGFuZ2UsIGFuZCBjdXRzIG9mZgogIC8vIHNwYW5zIHBhcnRpYWxseSB3aXRoaW4gdGhlIGNoYW5nZS4gUmV0dXJucyBhbiBhcnJheSBvZiBzcGFuCiAgLy8gYXJyYXlzIHdpdGggb25lIGVsZW1lbnQgZm9yIGVhY2ggbGluZSBpbiAoYWZ0ZXIpIHRoZSBjaGFuZ2UuCiAgZnVuY3Rpb24gc3RyZXRjaFNwYW5zT3ZlckNoYW5nZShkb2MsIGNoYW5nZSkgewogICAgdmFyIG9sZEZpcnN0ID0gaXNMaW5lKGRvYywgY2hhbmdlLmZyb20ubGluZSkgJiYgZ2V0TGluZShkb2MsIGNoYW5nZS5mcm9tLmxpbmUpLm1hcmtlZFNwYW5zOwogICAgdmFyIG9sZExhc3QgPSBpc0xpbmUoZG9jLCBjaGFuZ2UudG8ubGluZSkgJiYgZ2V0TGluZShkb2MsIGNoYW5nZS50by5saW5lKS5tYXJrZWRTcGFuczsKICAgIGlmICghb2xkRmlyc3QgJiYgIW9sZExhc3QpIHJldHVybiBudWxsOwoKICAgIHZhciBzdGFydENoID0gY2hhbmdlLmZyb20uY2gsIGVuZENoID0gY2hhbmdlLnRvLmNoLCBpc0luc2VydCA9IGNtcChjaGFuZ2UuZnJvbSwgY2hhbmdlLnRvKSA9PSAwOwogICAgLy8gR2V0IHRoZSBzcGFucyB0aGF0ICdzdGljayBvdXQnIG9uIGJvdGggc2lkZXMKICAgIHZhciBmaXJzdCA9IG1hcmtlZFNwYW5zQmVmb3JlKG9sZEZpcnN0LCBzdGFydENoLCBpc0luc2VydCk7CiAgICB2YXIgbGFzdCA9IG1hcmtlZFNwYW5zQWZ0ZXIob2xkTGFzdCwgZW5kQ2gsIGlzSW5zZXJ0KTsKCiAgICAvLyBOZXh0LCBtZXJnZSB0aG9zZSB0d28gZW5kcwogICAgdmFyIHNhbWVMaW5lID0gY2hhbmdlLnRleHQubGVuZ3RoID09IDEsIG9mZnNldCA9IGxzdChjaGFuZ2UudGV4dCkubGVuZ3RoICsgKHNhbWVMaW5lID8gc3RhcnRDaCA6IDApOwogICAgaWYgKGZpcnN0KSB7CiAgICAgIC8vIEZpeCB1cCAudG8gcHJvcGVydGllcyBvZiBmaXJzdAogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpcnN0Lmxlbmd0aDsgKytpKSB7CiAgICAgICAgdmFyIHNwYW4gPSBmaXJzdFtpXTsKICAgICAgICBpZiAoc3Bhbi50byA9PSBudWxsKSB7CiAgICAgICAgICB2YXIgZm91bmQgPSBnZXRNYXJrZWRTcGFuRm9yKGxhc3QsIHNwYW4ubWFya2VyKTsKICAgICAgICAgIGlmICghZm91bmQpIHNwYW4udG8gPSBzdGFydENoOwogICAgICAgICAgZWxzZSBpZiAoc2FtZUxpbmUpIHNwYW4udG8gPSBmb3VuZC50byA9PSBudWxsID8gbnVsbCA6IGZvdW5kLnRvICsgb2Zmc2V0OwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKGxhc3QpIHsKICAgICAgLy8gRml4IHVwIC5mcm9tIGluIGxhc3QgKG9yIG1vdmUgdGhlbSBpbnRvIGZpcnN0IGluIGNhc2Ugb2Ygc2FtZUxpbmUpCiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGFzdC5sZW5ndGg7ICsraSkgewogICAgICAgIHZhciBzcGFuID0gbGFzdFtpXTsKICAgICAgICBpZiAoc3Bhbi50byAhPSBudWxsKSBzcGFuLnRvICs9IG9mZnNldDsKICAgICAgICBpZiAoc3Bhbi5mcm9tID09IG51bGwpIHsKICAgICAgICAgIHZhciBmb3VuZCA9IGdldE1hcmtlZFNwYW5Gb3IoZmlyc3QsIHNwYW4ubWFya2VyKTsKICAgICAgICAgIGlmICghZm91bmQpIHsKICAgICAgICAgICAgc3Bhbi5mcm9tID0gb2Zmc2V0OwogICAgICAgICAgICBpZiAoc2FtZUxpbmUpIChmaXJzdCB8fCAoZmlyc3QgPSBbXSkpLnB1c2goc3Bhbik7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHNwYW4uZnJvbSArPSBvZmZzZXQ7CiAgICAgICAgICBpZiAoc2FtZUxpbmUpIChmaXJzdCB8fCAoZmlyc3QgPSBbXSkpLnB1c2goc3Bhbik7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICAvLyBNYWtlIHN1cmUgd2UgZGlkbid0IGNyZWF0ZSBhbnkgemVyby1sZW5ndGggc3BhbnMKICAgIGlmIChmaXJzdCkgZmlyc3QgPSBjbGVhckVtcHR5U3BhbnMoZmlyc3QpOwogICAgaWYgKGxhc3QgJiYgbGFzdCAhPSBmaXJzdCkgbGFzdCA9IGNsZWFyRW1wdHlTcGFucyhsYXN0KTsKCiAgICB2YXIgbmV3TWFya2VycyA9IFtmaXJzdF07CiAgICBpZiAoIXNhbWVMaW5lKSB7CiAgICAgIC8vIEZpbGwgZ2FwIHdpdGggd2hvbGUtbGluZS1zcGFucwogICAgICB2YXIgZ2FwID0gY2hhbmdlLnRleHQubGVuZ3RoIC0gMiwgZ2FwTWFya2VyczsKICAgICAgaWYgKGdhcCA+IDAgJiYgZmlyc3QpCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaXJzdC5sZW5ndGg7ICsraSkKICAgICAgICAgIGlmIChmaXJzdFtpXS50byA9PSBudWxsKQogICAgICAgICAgICAoZ2FwTWFya2VycyB8fCAoZ2FwTWFya2VycyA9IFtdKSkucHVzaChuZXcgTWFya2VkU3BhbihmaXJzdFtpXS5tYXJrZXIsIG51bGwsIG51bGwpKTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBnYXA7ICsraSkKICAgICAgICBuZXdNYXJrZXJzLnB1c2goZ2FwTWFya2Vycyk7CiAgICAgIG5ld01hcmtlcnMucHVzaChsYXN0KTsKICAgIH0KICAgIHJldHVybiBuZXdNYXJrZXJzOwogIH0KCiAgLy8gUmVtb3ZlIHNwYW5zIHRoYXQgYXJlIGVtcHR5IGFuZCBkb24ndCBoYXZlIGEgY2xlYXJXaGVuRW1wdHkKICAvLyBvcHRpb24gb2YgZmFsc2UuCiAgZnVuY3Rpb24gY2xlYXJFbXB0eVNwYW5zKHNwYW5zKSB7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNwYW5zLmxlbmd0aDsgKytpKSB7CiAgICAgIHZhciBzcGFuID0gc3BhbnNbaV07CiAgICAgIGlmIChzcGFuLmZyb20gIT0gbnVsbCAmJiBzcGFuLmZyb20gPT0gc3Bhbi50byAmJiBzcGFuLm1hcmtlci5jbGVhcldoZW5FbXB0eSAhPT0gZmFsc2UpCiAgICAgICAgc3BhbnMuc3BsaWNlKGktLSwgMSk7CiAgICB9CiAgICBpZiAoIXNwYW5zLmxlbmd0aCkgcmV0dXJuIG51bGw7CiAgICByZXR1cm4gc3BhbnM7CiAgfQoKICAvLyBVc2VkIGZvciB1bi9yZS1kb2luZyBjaGFuZ2VzIGZyb20gdGhlIGhpc3RvcnkuIENvbWJpbmVzIHRoZQogIC8vIHJlc3VsdCBvZiBjb21wdXRpbmcgdGhlIGV4aXN0aW5nIHNwYW5zIHdpdGggdGhlIHNldCBvZiBzcGFucyB0aGF0CiAgLy8gZXhpc3RlZCBpbiB0aGUgaGlzdG9yeSAoc28gdGhhdCBkZWxldGluZyBhcm91bmQgYSBzcGFuIGFuZCB0aGVuCiAgLy8gdW5kb2luZyBicmluZ3MgYmFjayB0aGUgc3BhbikuCiAgZnVuY3Rpb24gbWVyZ2VPbGRTcGFucyhkb2MsIGNoYW5nZSkgewogICAgdmFyIG9sZCA9IGdldE9sZFNwYW5zKGRvYywgY2hhbmdlKTsKICAgIHZhciBzdHJldGNoZWQgPSBzdHJldGNoU3BhbnNPdmVyQ2hhbmdlKGRvYywgY2hhbmdlKTsKICAgIGlmICghb2xkKSByZXR1cm4gc3RyZXRjaGVkOwogICAgaWYgKCFzdHJldGNoZWQpIHJldHVybiBvbGQ7CgogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvbGQubGVuZ3RoOyArK2kpIHsKICAgICAgdmFyIG9sZEN1ciA9IG9sZFtpXSwgc3RyZXRjaEN1ciA9IHN0cmV0Y2hlZFtpXTsKICAgICAgaWYgKG9sZEN1ciAmJiBzdHJldGNoQ3VyKSB7CiAgICAgICAgc3BhbnM6IGZvciAodmFyIGogPSAwOyBqIDwgc3RyZXRjaEN1ci5sZW5ndGg7ICsraikgewogICAgICAgICAgdmFyIHNwYW4gPSBzdHJldGNoQ3VyW2pdOwogICAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBvbGRDdXIubGVuZ3RoOyArK2spCiAgICAgICAgICAgIGlmIChvbGRDdXJba10ubWFya2VyID09IHNwYW4ubWFya2VyKSBjb250aW51ZSBzcGFuczsKICAgICAgICAgIG9sZEN1ci5wdXNoKHNwYW4pOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChzdHJldGNoQ3VyKSB7CiAgICAgICAgb2xkW2ldID0gc3RyZXRjaEN1cjsKICAgICAgfQogICAgfQogICAgcmV0dXJuIG9sZDsKICB9CgogIC8vIFVzZWQgdG8gJ2NsaXAnIG91dCByZWFkT25seSByYW5nZXMgd2hlbiBtYWtpbmcgYSBjaGFuZ2UuCiAgZnVuY3Rpb24gcmVtb3ZlUmVhZE9ubHlSYW5nZXMoZG9jLCBmcm9tLCB0bykgewogICAgdmFyIG1hcmtlcnMgPSBudWxsOwogICAgZG9jLml0ZXIoZnJvbS5saW5lLCB0by5saW5lICsgMSwgZnVuY3Rpb24obGluZSkgewogICAgICBpZiAobGluZS5tYXJrZWRTcGFucykgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW5lLm1hcmtlZFNwYW5zLmxlbmd0aDsgKytpKSB7CiAgICAgICAgdmFyIG1hcmsgPSBsaW5lLm1hcmtlZFNwYW5zW2ldLm1hcmtlcjsKICAgICAgICBpZiAobWFyay5yZWFkT25seSAmJiAoIW1hcmtlcnMgfHwgaW5kZXhPZihtYXJrZXJzLCBtYXJrKSA9PSAtMSkpCiAgICAgICAgICAobWFya2VycyB8fCAobWFya2VycyA9IFtdKSkucHVzaChtYXJrKTsKICAgICAgfQogICAgfSk7CiAgICBpZiAoIW1hcmtlcnMpIHJldHVybiBudWxsOwogICAgdmFyIHBhcnRzID0gW3tmcm9tOiBmcm9tLCB0bzogdG99XTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWFya2Vycy5sZW5ndGg7ICsraSkgewogICAgICB2YXIgbWsgPSBtYXJrZXJzW2ldLCBtID0gbWsuZmluZCgwKTsKICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBwYXJ0cy5sZW5ndGg7ICsraikgewogICAgICAgIHZhciBwID0gcGFydHNbal07CiAgICAgICAgaWYgKGNtcChwLnRvLCBtLmZyb20pIDwgMCB8fCBjbXAocC5mcm9tLCBtLnRvKSA+IDApIGNvbnRpbnVlOwogICAgICAgIHZhciBuZXdQYXJ0cyA9IFtqLCAxXSwgZGZyb20gPSBjbXAocC5mcm9tLCBtLmZyb20pLCBkdG8gPSBjbXAocC50bywgbS50byk7CiAgICAgICAgaWYgKGRmcm9tIDwgMCB8fCAhbWsuaW5jbHVzaXZlTGVmdCAmJiAhZGZyb20pCiAgICAgICAgICBuZXdQYXJ0cy5wdXNoKHtmcm9tOiBwLmZyb20sIHRvOiBtLmZyb219KTsKICAgICAgICBpZiAoZHRvID4gMCB8fCAhbWsuaW5jbHVzaXZlUmlnaHQgJiYgIWR0bykKICAgICAgICAgIG5ld1BhcnRzLnB1c2goe2Zyb206IG0udG8sIHRvOiBwLnRvfSk7CiAgICAgICAgcGFydHMuc3BsaWNlLmFwcGx5KHBhcnRzLCBuZXdQYXJ0cyk7CiAgICAgICAgaiArPSBuZXdQYXJ0cy5sZW5ndGggLSAxOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gcGFydHM7CiAgfQoKICAvLyBDb25uZWN0IG9yIGRpc2Nvbm5lY3Qgc3BhbnMgZnJvbSBhIGxpbmUuCiAgZnVuY3Rpb24gZGV0YWNoTWFya2VkU3BhbnMobGluZSkgewogICAgdmFyIHNwYW5zID0gbGluZS5tYXJrZWRTcGFuczsKICAgIGlmICghc3BhbnMpIHJldHVybjsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3BhbnMubGVuZ3RoOyArK2kpCiAgICAgIHNwYW5zW2ldLm1hcmtlci5kZXRhY2hMaW5lKGxpbmUpOwogICAgbGluZS5tYXJrZWRTcGFucyA9IG51bGw7CiAgfQogIGZ1bmN0aW9uIGF0dGFjaE1hcmtlZFNwYW5zKGxpbmUsIHNwYW5zKSB7CiAgICBpZiAoIXNwYW5zKSByZXR1cm47CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNwYW5zLmxlbmd0aDsgKytpKQogICAgICBzcGFuc1tpXS5tYXJrZXIuYXR0YWNoTGluZShsaW5lKTsKICAgIGxpbmUubWFya2VkU3BhbnMgPSBzcGFuczsKICB9CgogIC8vIEhlbHBlcnMgdXNlZCB3aGVuIGNvbXB1dGluZyB3aGljaCBvdmVybGFwcGluZyBjb2xsYXBzZWQgc3BhbgogIC8vIGNvdW50cyBhcyB0aGUgbGFyZ2VyIG9uZS4KICBmdW5jdGlvbiBleHRyYUxlZnQobWFya2VyKSB7IHJldHVybiBtYXJrZXIuaW5jbHVzaXZlTGVmdCA/IC0xIDogMDsgfQogIGZ1bmN0aW9uIGV4dHJhUmlnaHQobWFya2VyKSB7IHJldHVybiBtYXJrZXIuaW5jbHVzaXZlUmlnaHQgPyAxIDogMDsgfQoKICAvLyBSZXR1cm5zIGEgbnVtYmVyIGluZGljYXRpbmcgd2hpY2ggb2YgdHdvIG92ZXJsYXBwaW5nIGNvbGxhcHNlZAogIC8vIHNwYW5zIGlzIGxhcmdlciAoYW5kIHRodXMgaW5jbHVkZXMgdGhlIG90aGVyKS4gRmFsbHMgYmFjayB0bwogIC8vIGNvbXBhcmluZyBpZHMgd2hlbiB0aGUgc3BhbnMgY292ZXIgZXhhY3RseSB0aGUgc2FtZSByYW5nZS4KICBmdW5jdGlvbiBjb21wYXJlQ29sbGFwc2VkTWFya2VycyhhLCBiKSB7CiAgICB2YXIgbGVuRGlmZiA9IGEubGluZXMubGVuZ3RoIC0gYi5saW5lcy5sZW5ndGg7CiAgICBpZiAobGVuRGlmZiAhPSAwKSByZXR1cm4gbGVuRGlmZjsKICAgIHZhciBhUG9zID0gYS5maW5kKCksIGJQb3MgPSBiLmZpbmQoKTsKICAgIHZhciBmcm9tQ21wID0gY21wKGFQb3MuZnJvbSwgYlBvcy5mcm9tKSB8fCBleHRyYUxlZnQoYSkgLSBleHRyYUxlZnQoYik7CiAgICBpZiAoZnJvbUNtcCkgcmV0dXJuIC1mcm9tQ21wOwogICAgdmFyIHRvQ21wID0gY21wKGFQb3MudG8sIGJQb3MudG8pIHx8IGV4dHJhUmlnaHQoYSkgLSBleHRyYVJpZ2h0KGIpOwogICAgaWYgKHRvQ21wKSByZXR1cm4gdG9DbXA7CiAgICByZXR1cm4gYi5pZCAtIGEuaWQ7CiAgfQoKICAvLyBGaW5kIG91dCB3aGV0aGVyIGEgbGluZSBlbmRzIG9yIHN0YXJ0cyBpbiBhIGNvbGxhcHNlZCBzcGFuLiBJZgogIC8vIHNvLCByZXR1cm4gdGhlIG1hcmtlciBmb3IgdGhhdCBzcGFuLgogIGZ1bmN0aW9uIGNvbGxhcHNlZFNwYW5BdFNpZGUobGluZSwgc3RhcnQpIHsKICAgIHZhciBzcHMgPSBzYXdDb2xsYXBzZWRTcGFucyAmJiBsaW5lLm1hcmtlZFNwYW5zLCBmb3VuZDsKICAgIGlmIChzcHMpIGZvciAodmFyIHNwLCBpID0gMDsgaSA8IHNwcy5sZW5ndGg7ICsraSkgewogICAgICBzcCA9IHNwc1tpXTsKICAgICAgaWYgKHNwLm1hcmtlci5jb2xsYXBzZWQgJiYgKHN0YXJ0ID8gc3AuZnJvbSA6IHNwLnRvKSA9PSBudWxsICYmCiAgICAgICAgICAoIWZvdW5kIHx8IGNvbXBhcmVDb2xsYXBzZWRNYXJrZXJzKGZvdW5kLCBzcC5tYXJrZXIpIDwgMCkpCiAgICAgICAgZm91bmQgPSBzcC5tYXJrZXI7CiAgICB9CiAgICByZXR1cm4gZm91bmQ7CiAgfQogIGZ1bmN0aW9uIGNvbGxhcHNlZFNwYW5BdFN0YXJ0KGxpbmUpIHsgcmV0dXJuIGNvbGxhcHNlZFNwYW5BdFNpZGUobGluZSwgdHJ1ZSk7IH0KICBmdW5jdGlvbiBjb2xsYXBzZWRTcGFuQXRFbmQobGluZSkgeyByZXR1cm4gY29sbGFwc2VkU3BhbkF0U2lkZShsaW5lLCBmYWxzZSk7IH0KCiAgLy8gVGVzdCB3aGV0aGVyIHRoZXJlIGV4aXN0cyBhIGNvbGxhcHNlZCBzcGFuIHRoYXQgcGFydGlhbGx5CiAgLy8gb3ZlcmxhcHMgKGNvdmVycyB0aGUgc3RhcnQgb3IgZW5kLCBidXQgbm90IGJvdGgpIG9mIGEgbmV3IHNwYW4uCiAgLy8gU3VjaCBvdmVybGFwIGlzIG5vdCBhbGxvd2VkLgogIGZ1bmN0aW9uIGNvbmZsaWN0aW5nQ29sbGFwc2VkUmFuZ2UoZG9jLCBsaW5lTm8sIGZyb20sIHRvLCBtYXJrZXIpIHsKICAgIHZhciBsaW5lID0gZ2V0TGluZShkb2MsIGxpbmVObyk7CiAgICB2YXIgc3BzID0gc2F3Q29sbGFwc2VkU3BhbnMgJiYgbGluZS5tYXJrZWRTcGFuczsKICAgIGlmIChzcHMpIGZvciAodmFyIGkgPSAwOyBpIDwgc3BzLmxlbmd0aDsgKytpKSB7CiAgICAgIHZhciBzcCA9IHNwc1tpXTsKICAgICAgaWYgKCFzcC5tYXJrZXIuY29sbGFwc2VkKSBjb250aW51ZTsKICAgICAgdmFyIGZvdW5kID0gc3AubWFya2VyLmZpbmQoMCk7CiAgICAgIHZhciBmcm9tQ21wID0gY21wKGZvdW5kLmZyb20sIGZyb20pIHx8IGV4dHJhTGVmdChzcC5tYXJrZXIpIC0gZXh0cmFMZWZ0KG1hcmtlcik7CiAgICAgIHZhciB0b0NtcCA9IGNtcChmb3VuZC50bywgdG8pIHx8IGV4dHJhUmlnaHQoc3AubWFya2VyKSAtIGV4dHJhUmlnaHQobWFya2VyKTsKICAgICAgaWYgKGZyb21DbXAgPj0gMCAmJiB0b0NtcCA8PSAwIHx8IGZyb21DbXAgPD0gMCAmJiB0b0NtcCA+PSAwKSBjb250aW51ZTsKICAgICAgaWYgKGZyb21DbXAgPD0gMCAmJiAoY21wKGZvdW5kLnRvLCBmcm9tKSA+IDAgfHwgKHNwLm1hcmtlci5pbmNsdXNpdmVSaWdodCAmJiBtYXJrZXIuaW5jbHVzaXZlTGVmdCkpIHx8CiAgICAgICAgICBmcm9tQ21wID49IDAgJiYgKGNtcChmb3VuZC5mcm9tLCB0bykgPCAwIHx8IChzcC5tYXJrZXIuaW5jbHVzaXZlTGVmdCAmJiBtYXJrZXIuaW5jbHVzaXZlUmlnaHQpKSkKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICB9CgogIC8vIEEgdmlzdWFsIGxpbmUgaXMgYSBsaW5lIGFzIGRyYXduIG9uIHRoZSBzY3JlZW4uIEZvbGRpbmcsIGZvcgogIC8vIGV4YW1wbGUsIGNhbiBjYXVzZSBtdWx0aXBsZSBsb2dpY2FsIGxpbmVzIHRvIGFwcGVhciBvbiB0aGUgc2FtZQogIC8vIHZpc3VhbCBsaW5lLiBUaGlzIGZpbmRzIHRoZSBzdGFydCBvZiB0aGUgdmlzdWFsIGxpbmUgdGhhdCB0aGUKICAvLyBnaXZlbiBsaW5lIGlzIHBhcnQgb2YgKHVzdWFsbHkgdGhhdCBpcyB0aGUgbGluZSBpdHNlbGYpLgogIGZ1bmN0aW9uIHZpc3VhbExpbmUobGluZSkgewogICAgdmFyIG1lcmdlZDsKICAgIHdoaWxlIChtZXJnZWQgPSBjb2xsYXBzZWRTcGFuQXRTdGFydChsaW5lKSkKICAgICAgbGluZSA9IG1lcmdlZC5maW5kKC0xLCB0cnVlKS5saW5lOwogICAgcmV0dXJuIGxpbmU7CiAgfQoKICAvLyBSZXR1cm5zIGFuIGFycmF5IG9mIGxvZ2ljYWwgbGluZXMgdGhhdCBjb250aW51ZSB0aGUgdmlzdWFsIGxpbmUKICAvLyBzdGFydGVkIGJ5IHRoZSBhcmd1bWVudCwgb3IgdW5kZWZpbmVkIGlmIHRoZXJlIGFyZSBubyBzdWNoIGxpbmVzLgogIGZ1bmN0aW9uIHZpc3VhbExpbmVDb250aW51ZWQobGluZSkgewogICAgdmFyIG1lcmdlZCwgbGluZXM7CiAgICB3aGlsZSAobWVyZ2VkID0gY29sbGFwc2VkU3BhbkF0RW5kKGxpbmUpKSB7CiAgICAgIGxpbmUgPSBtZXJnZWQuZmluZCgxLCB0cnVlKS5saW5lOwogICAgICAobGluZXMgfHwgKGxpbmVzID0gW10pKS5wdXNoKGxpbmUpOwogICAgfQogICAgcmV0dXJuIGxpbmVzOwogIH0KCiAgLy8gR2V0IHRoZSBsaW5lIG51bWJlciBvZiB0aGUgc3RhcnQgb2YgdGhlIHZpc3VhbCBsaW5lIHRoYXQgdGhlCiAgLy8gZ2l2ZW4gbGluZSBudW1iZXIgaXMgcGFydCBvZi4KICBmdW5jdGlvbiB2aXN1YWxMaW5lTm8oZG9jLCBsaW5lTikgewogICAgdmFyIGxpbmUgPSBnZXRMaW5lKGRvYywgbGluZU4pLCB2aXMgPSB2aXN1YWxMaW5lKGxpbmUpOwogICAgaWYgKGxpbmUgPT0gdmlzKSByZXR1cm4gbGluZU47CiAgICByZXR1cm4gbGluZU5vKHZpcyk7CiAgfQogIC8vIEdldCB0aGUgbGluZSBudW1iZXIgb2YgdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IHZpc3VhbCBsaW5lIGFmdGVyCiAgLy8gdGhlIGdpdmVuIGxpbmUuCiAgZnVuY3Rpb24gdmlzdWFsTGluZUVuZE5vKGRvYywgbGluZU4pIHsKICAgIGlmIChsaW5lTiA+IGRvYy5sYXN0TGluZSgpKSByZXR1cm4gbGluZU47CiAgICB2YXIgbGluZSA9IGdldExpbmUoZG9jLCBsaW5lTiksIG1lcmdlZDsKICAgIGlmICghbGluZUlzSGlkZGVuKGRvYywgbGluZSkpIHJldHVybiBsaW5lTjsKICAgIHdoaWxlIChtZXJnZWQgPSBjb2xsYXBzZWRTcGFuQXRFbmQobGluZSkpCiAgICAgIGxpbmUgPSBtZXJnZWQuZmluZCgxLCB0cnVlKS5saW5lOwogICAgcmV0dXJuIGxpbmVObyhsaW5lKSArIDE7CiAgfQoKICAvLyBDb21wdXRlIHdoZXRoZXIgYSBsaW5lIGlzIGhpZGRlbi4gTGluZXMgY291bnQgYXMgaGlkZGVuIHdoZW4gdGhleQogIC8vIGFyZSBwYXJ0IG9mIGEgdmlzdWFsIGxpbmUgdGhhdCBzdGFydHMgd2l0aCBhbm90aGVyIGxpbmUsIG9yIHdoZW4KICAvLyB0aGV5IGFyZSBlbnRpcmVseSBjb3ZlcmVkIGJ5IGNvbGxhcHNlZCwgbm9uLXdpZGdldCBzcGFuLgogIGZ1bmN0aW9uIGxpbmVJc0hpZGRlbihkb2MsIGxpbmUpIHsKICAgIHZhciBzcHMgPSBzYXdDb2xsYXBzZWRTcGFucyAmJiBsaW5lLm1hcmtlZFNwYW5zOwogICAgaWYgKHNwcykgZm9yICh2YXIgc3AsIGkgPSAwOyBpIDwgc3BzLmxlbmd0aDsgKytpKSB7CiAgICAgIHNwID0gc3BzW2ldOwogICAgICBpZiAoIXNwLm1hcmtlci5jb2xsYXBzZWQpIGNvbnRpbnVlOwogICAgICBpZiAoc3AuZnJvbSA9PSBudWxsKSByZXR1cm4gdHJ1ZTsKICAgICAgaWYgKHNwLm1hcmtlci53aWRnZXROb2RlKSBjb250aW51ZTsKICAgICAgaWYgKHNwLmZyb20gPT0gMCAmJiBzcC5tYXJrZXIuaW5jbHVzaXZlTGVmdCAmJiBsaW5lSXNIaWRkZW5Jbm5lcihkb2MsIGxpbmUsIHNwKSkKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICB9CiAgZnVuY3Rpb24gbGluZUlzSGlkZGVuSW5uZXIoZG9jLCBsaW5lLCBzcGFuKSB7CiAgICBpZiAoc3Bhbi50byA9PSBudWxsKSB7CiAgICAgIHZhciBlbmQgPSBzcGFuLm1hcmtlci5maW5kKDEsIHRydWUpOwogICAgICByZXR1cm4gbGluZUlzSGlkZGVuSW5uZXIoZG9jLCBlbmQubGluZSwgZ2V0TWFya2VkU3BhbkZvcihlbmQubGluZS5tYXJrZWRTcGFucywgc3Bhbi5tYXJrZXIpKTsKICAgIH0KICAgIGlmIChzcGFuLm1hcmtlci5pbmNsdXNpdmVSaWdodCAmJiBzcGFuLnRvID09IGxpbmUudGV4dC5sZW5ndGgpCiAgICAgIHJldHVybiB0cnVlOwogICAgZm9yICh2YXIgc3AsIGkgPSAwOyBpIDwgbGluZS5tYXJrZWRTcGFucy5sZW5ndGg7ICsraSkgewogICAgICBzcCA9IGxpbmUubWFya2VkU3BhbnNbaV07CiAgICAgIGlmIChzcC5tYXJrZXIuY29sbGFwc2VkICYmICFzcC5tYXJrZXIud2lkZ2V0Tm9kZSAmJiBzcC5mcm9tID09IHNwYW4udG8gJiYKICAgICAgICAgIChzcC50byA9PSBudWxsIHx8IHNwLnRvICE9IHNwYW4uZnJvbSkgJiYKICAgICAgICAgIChzcC5tYXJrZXIuaW5jbHVzaXZlTGVmdCB8fCBzcGFuLm1hcmtlci5pbmNsdXNpdmVSaWdodCkgJiYKICAgICAgICAgIGxpbmVJc0hpZGRlbklubmVyKGRvYywgbGluZSwgc3ApKSByZXR1cm4gdHJ1ZTsKICAgIH0KICB9CgogIC8vIExJTkUgV0lER0VUUwoKICAvLyBMaW5lIHdpZGdldHMgYXJlIGJsb2NrIGVsZW1lbnRzIGRpc3BsYXllZCBhYm92ZSBvciBiZWxvdyBhIGxpbmUuCgogIHZhciBMaW5lV2lkZ2V0ID0gQ29kZU1pcnJvci5MaW5lV2lkZ2V0ID0gZnVuY3Rpb24oY20sIG5vZGUsIG9wdGlvbnMpIHsKICAgIGlmIChvcHRpb25zKSBmb3IgKHZhciBvcHQgaW4gb3B0aW9ucykgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkob3B0KSkKICAgICAgdGhpc1tvcHRdID0gb3B0aW9uc1tvcHRdOwogICAgdGhpcy5jbSA9IGNtOwogICAgdGhpcy5ub2RlID0gbm9kZTsKICB9OwogIGV2ZW50TWl4aW4oTGluZVdpZGdldCk7CgogIGZ1bmN0aW9uIGFkanVzdFNjcm9sbFdoZW5BYm92ZVZpc2libGUoY20sIGxpbmUsIGRpZmYpIHsKICAgIGlmIChoZWlnaHRBdExpbmUobGluZSkgPCAoKGNtLmN1ck9wICYmIGNtLmN1ck9wLnNjcm9sbFRvcCkgfHwgY20uZG9jLnNjcm9sbFRvcCkpCiAgICAgIGFkZFRvU2Nyb2xsUG9zKGNtLCBudWxsLCBkaWZmKTsKICB9CgogIExpbmVXaWRnZXQucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgY20gPSB0aGlzLmNtLCB3cyA9IHRoaXMubGluZS53aWRnZXRzLCBsaW5lID0gdGhpcy5saW5lLCBubyA9IGxpbmVObyhsaW5lKTsKICAgIGlmIChubyA9PSBudWxsIHx8ICF3cykgcmV0dXJuOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB3cy5sZW5ndGg7ICsraSkgaWYgKHdzW2ldID09IHRoaXMpIHdzLnNwbGljZShpLS0sIDEpOwogICAgaWYgKCF3cy5sZW5ndGgpIGxpbmUud2lkZ2V0cyA9IG51bGw7CiAgICB2YXIgaGVpZ2h0ID0gd2lkZ2V0SGVpZ2h0KHRoaXMpOwogICAgcnVuSW5PcChjbSwgZnVuY3Rpb24oKSB7CiAgICAgIGFkanVzdFNjcm9sbFdoZW5BYm92ZVZpc2libGUoY20sIGxpbmUsIC1oZWlnaHQpOwogICAgICByZWdMaW5lQ2hhbmdlKGNtLCBubywgIndpZGdldCIpOwogICAgICB1cGRhdGVMaW5lSGVpZ2h0KGxpbmUsIE1hdGgubWF4KDAsIGxpbmUuaGVpZ2h0IC0gaGVpZ2h0KSk7CiAgICB9KTsKICB9OwogIExpbmVXaWRnZXQucHJvdG90eXBlLmNoYW5nZWQgPSBmdW5jdGlvbigpIHsKICAgIHZhciBvbGRIID0gdGhpcy5oZWlnaHQsIGNtID0gdGhpcy5jbSwgbGluZSA9IHRoaXMubGluZTsKICAgIHRoaXMuaGVpZ2h0ID0gbnVsbDsKICAgIHZhciBkaWZmID0gd2lkZ2V0SGVpZ2h0KHRoaXMpIC0gb2xkSDsKICAgIGlmICghZGlmZikgcmV0dXJuOwogICAgcnVuSW5PcChjbSwgZnVuY3Rpb24oKSB7CiAgICAgIGNtLmN1ck9wLmZvcmNlVXBkYXRlID0gdHJ1ZTsKICAgICAgYWRqdXN0U2Nyb2xsV2hlbkFib3ZlVmlzaWJsZShjbSwgbGluZSwgZGlmZik7CiAgICAgIHVwZGF0ZUxpbmVIZWlnaHQobGluZSwgbGluZS5oZWlnaHQgKyBkaWZmKTsKICAgIH0pOwogIH07CgogIGZ1bmN0aW9uIHdpZGdldEhlaWdodCh3aWRnZXQpIHsKICAgIGlmICh3aWRnZXQuaGVpZ2h0ICE9IG51bGwpIHJldHVybiB3aWRnZXQuaGVpZ2h0OwogICAgaWYgKCFjb250YWlucyhkb2N1bWVudC5ib2R5LCB3aWRnZXQubm9kZSkpIHsKICAgICAgdmFyIHBhcmVudFN0eWxlID0gInBvc2l0aW9uOiByZWxhdGl2ZTsiOwogICAgICBpZiAod2lkZ2V0LmNvdmVyR3V0dGVyKQogICAgICAgIHBhcmVudFN0eWxlICs9ICJtYXJnaW4tbGVmdDogLSIgKyB3aWRnZXQuY20uZ2V0R3V0dGVyRWxlbWVudCgpLm9mZnNldFdpZHRoICsgInB4OyI7CiAgICAgIHJlbW92ZUNoaWxkcmVuQW5kQWRkKHdpZGdldC5jbS5kaXNwbGF5Lm1lYXN1cmUsIGVsdCgiZGl2IiwgW3dpZGdldC5ub2RlXSwgbnVsbCwgcGFyZW50U3R5bGUpKTsKICAgIH0KICAgIHJldHVybiB3aWRnZXQuaGVpZ2h0ID0gd2lkZ2V0Lm5vZGUub2Zmc2V0SGVpZ2h0OwogIH0KCiAgZnVuY3Rpb24gYWRkTGluZVdpZGdldChjbSwgaGFuZGxlLCBub2RlLCBvcHRpb25zKSB7CiAgICB2YXIgd2lkZ2V0ID0gbmV3IExpbmVXaWRnZXQoY20sIG5vZGUsIG9wdGlvbnMpOwogICAgaWYgKHdpZGdldC5ub0hTY3JvbGwpIGNtLmRpc3BsYXkuYWxpZ25XaWRnZXRzID0gdHJ1ZTsKICAgIGNoYW5nZUxpbmUoY20uZG9jLCBoYW5kbGUsICJ3aWRnZXQiLCBmdW5jdGlvbihsaW5lKSB7CiAgICAgIHZhciB3aWRnZXRzID0gbGluZS53aWRnZXRzIHx8IChsaW5lLndpZGdldHMgPSBbXSk7CiAgICAgIGlmICh3aWRnZXQuaW5zZXJ0QXQgPT0gbnVsbCkgd2lkZ2V0cy5wdXNoKHdpZGdldCk7CiAgICAgIGVsc2Ugd2lkZ2V0cy5zcGxpY2UoTWF0aC5taW4od2lkZ2V0cy5sZW5ndGggLSAxLCBNYXRoLm1heCgwLCB3aWRnZXQuaW5zZXJ0QXQpKSwgMCwgd2lkZ2V0KTsKICAgICAgd2lkZ2V0LmxpbmUgPSBsaW5lOwogICAgICBpZiAoIWxpbmVJc0hpZGRlbihjbS5kb2MsIGxpbmUpKSB7CiAgICAgICAgdmFyIGFib3ZlVmlzaWJsZSA9IGhlaWdodEF0TGluZShsaW5lKSA8IGNtLmRvYy5zY3JvbGxUb3A7CiAgICAgICAgdXBkYXRlTGluZUhlaWdodChsaW5lLCBsaW5lLmhlaWdodCArIHdpZGdldEhlaWdodCh3aWRnZXQpKTsKICAgICAgICBpZiAoYWJvdmVWaXNpYmxlKSBhZGRUb1Njcm9sbFBvcyhjbSwgbnVsbCwgd2lkZ2V0LmhlaWdodCk7CiAgICAgICAgY20uY3VyT3AuZm9yY2VVcGRhdGUgPSB0cnVlOwogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfSk7CiAgICByZXR1cm4gd2lkZ2V0OwogIH0KCiAgLy8gTElORSBEQVRBIFNUUlVDVFVSRQoKICAvLyBMaW5lIG9iamVjdHMuIFRoZXNlIGhvbGQgc3RhdGUgcmVsYXRlZCB0byBhIGxpbmUsIGluY2x1ZGluZwogIC8vIGhpZ2hsaWdodGluZyBpbmZvICh0aGUgc3R5bGVzIGFycmF5KS4KICB2YXIgTGluZSA9IENvZGVNaXJyb3IuTGluZSA9IGZ1bmN0aW9uKHRleHQsIG1hcmtlZFNwYW5zLCBlc3RpbWF0ZUhlaWdodCkgewogICAgdGhpcy50ZXh0ID0gdGV4dDsKICAgIGF0dGFjaE1hcmtlZFNwYW5zKHRoaXMsIG1hcmtlZFNwYW5zKTsKICAgIHRoaXMuaGVpZ2h0ID0gZXN0aW1hdGVIZWlnaHQgPyBlc3RpbWF0ZUhlaWdodCh0aGlzKSA6IDE7CiAgfTsKICBldmVudE1peGluKExpbmUpOwogIExpbmUucHJvdG90eXBlLmxpbmVObyA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gbGluZU5vKHRoaXMpOyB9OwoKICAvLyBDaGFuZ2UgdGhlIGNvbnRlbnQgKHRleHQsIG1hcmtlcnMpIG9mIGEgbGluZS4gQXV0b21hdGljYWxseQogIC8vIGludmFsaWRhdGVzIGNhY2hlZCBpbmZvcm1hdGlvbiBhbmQgdHJpZXMgdG8gcmUtZXN0aW1hdGUgdGhlCiAgLy8gbGluZSdzIGhlaWdodC4KICBmdW5jdGlvbiB1cGRhdGVMaW5lKGxpbmUsIHRleHQsIG1hcmtlZFNwYW5zLCBlc3RpbWF0ZUhlaWdodCkgewogICAgbGluZS50ZXh0ID0gdGV4dDsKICAgIGlmIChsaW5lLnN0YXRlQWZ0ZXIpIGxpbmUuc3RhdGVBZnRlciA9IG51bGw7CiAgICBpZiAobGluZS5zdHlsZXMpIGxpbmUuc3R5bGVzID0gbnVsbDsKICAgIGlmIChsaW5lLm9yZGVyICE9IG51bGwpIGxpbmUub3JkZXIgPSBudWxsOwogICAgZGV0YWNoTWFya2VkU3BhbnMobGluZSk7CiAgICBhdHRhY2hNYXJrZWRTcGFucyhsaW5lLCBtYXJrZWRTcGFucyk7CiAgICB2YXIgZXN0SGVpZ2h0ID0gZXN0aW1hdGVIZWlnaHQgPyBlc3RpbWF0ZUhlaWdodChsaW5lKSA6IDE7CiAgICBpZiAoZXN0SGVpZ2h0ICE9IGxpbmUuaGVpZ2h0KSB1cGRhdGVMaW5lSGVpZ2h0KGxpbmUsIGVzdEhlaWdodCk7CiAgfQoKICAvLyBEZXRhY2ggYSBsaW5lIGZyb20gdGhlIGRvY3VtZW50IHRyZWUgYW5kIGl0cyBtYXJrZXJzLgogIGZ1bmN0aW9uIGNsZWFuVXBMaW5lKGxpbmUpIHsKICAgIGxpbmUucGFyZW50ID0gbnVsbDsKICAgIGRldGFjaE1hcmtlZFNwYW5zKGxpbmUpOwogIH0KCiAgZnVuY3Rpb24gZXh0cmFjdExpbmVDbGFzc2VzKHR5cGUsIG91dHB1dCkgewogICAgaWYgKHR5cGUpIGZvciAoOzspIHsKICAgICAgdmFyIGxpbmVDbGFzcyA9IHR5cGUubWF0Y2goLyg/Ol58XHMrKWxpbmUtKGJhY2tncm91bmQtKT8oXFMrKS8pOwogICAgICBpZiAoIWxpbmVDbGFzcykgYnJlYWs7CiAgICAgIHR5cGUgPSB0eXBlLnNsaWNlKDAsIGxpbmVDbGFzcy5pbmRleCkgKyB0eXBlLnNsaWNlKGxpbmVDbGFzcy5pbmRleCArIGxpbmVDbGFzc1swXS5sZW5ndGgpOwogICAgICB2YXIgcHJvcCA9IGxpbmVDbGFzc1sxXSA/ICJiZ0NsYXNzIiA6ICJ0ZXh0Q2xhc3MiOwogICAgICBpZiAob3V0cHV0W3Byb3BdID09IG51bGwpCiAgICAgICAgb3V0cHV0W3Byb3BdID0gbGluZUNsYXNzWzJdOwogICAgICBlbHNlIGlmICghKG5ldyBSZWdFeHAoIig/Ol58XHMpIiArIGxpbmVDbGFzc1syXSArICIoPzokfFxzKSIpKS50ZXN0KG91dHB1dFtwcm9wXSkpCiAgICAgICAgb3V0cHV0W3Byb3BdICs9ICIgIiArIGxpbmVDbGFzc1syXTsKICAgIH0KICAgIHJldHVybiB0eXBlOwogIH0KCiAgZnVuY3Rpb24gY2FsbEJsYW5rTGluZShtb2RlLCBzdGF0ZSkgewogICAgaWYgKG1vZGUuYmxhbmtMaW5lKSByZXR1cm4gbW9kZS5ibGFua0xpbmUoc3RhdGUpOwogICAgaWYgKCFtb2RlLmlubmVyTW9kZSkgcmV0dXJuOwogICAgdmFyIGlubmVyID0gQ29kZU1pcnJvci5pbm5lck1vZGUobW9kZSwgc3RhdGUpOwogICAgaWYgKGlubmVyLm1vZGUuYmxhbmtMaW5lKSByZXR1cm4gaW5uZXIubW9kZS5ibGFua0xpbmUoaW5uZXIuc3RhdGUpOwogIH0KCiAgZnVuY3Rpb24gcmVhZFRva2VuKG1vZGUsIHN0cmVhbSwgc3RhdGUpIHsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMTA7IGkrKykgewogICAgICB2YXIgc3R5bGUgPSBtb2RlLnRva2VuKHN0cmVhbSwgc3RhdGUpOwogICAgICBpZiAoc3RyZWFtLnBvcyA+IHN0cmVhbS5zdGFydCkgcmV0dXJuIHN0eWxlOwogICAgfQogICAgdGhyb3cgbmV3IEVycm9yKCJNb2RlICIgKyBtb2RlLm5hbWUgKyAiIGZhaWxlZCB0byBhZHZhbmNlIHN0cmVhbS4iKTsKICB9CgogIC8vIFJ1biB0aGUgZ2l2ZW4gbW9kZSdzIHBhcnNlciBvdmVyIGEgbGluZSwgY2FsbGluZyBmIGZvciBlYWNoIHRva2VuLgogIGZ1bmN0aW9uIHJ1bk1vZGUoY20sIHRleHQsIG1vZGUsIHN0YXRlLCBmLCBsaW5lQ2xhc3NlcywgZm9yY2VUb0VuZCkgewogICAgdmFyIGZsYXR0ZW5TcGFucyA9IG1vZGUuZmxhdHRlblNwYW5zOwogICAgaWYgKGZsYXR0ZW5TcGFucyA9PSBudWxsKSBmbGF0dGVuU3BhbnMgPSBjbS5vcHRpb25zLmZsYXR0ZW5TcGFuczsKICAgIHZhciBjdXJTdGFydCA9IDAsIGN1clN0eWxlID0gbnVsbDsKICAgIHZhciBzdHJlYW0gPSBuZXcgU3RyaW5nU3RyZWFtKHRleHQsIGNtLm9wdGlvbnMudGFiU2l6ZSksIHN0eWxlOwogICAgaWYgKHRleHQgPT0gIiIpIGV4dHJhY3RMaW5lQ2xhc3NlcyhjYWxsQmxhbmtMaW5lKG1vZGUsIHN0YXRlKSwgbGluZUNsYXNzZXMpOwogICAgd2hpbGUgKCFzdHJlYW0uZW9sKCkpIHsKICAgICAgaWYgKHN0cmVhbS5wb3MgPiBjbS5vcHRpb25zLm1heEhpZ2hsaWdodExlbmd0aCkgewogICAgICAgIGZsYXR0ZW5TcGFucyA9IGZhbHNlOwogICAgICAgIGlmIChmb3JjZVRvRW5kKSBwcm9jZXNzTGluZShjbSwgdGV4dCwgc3RhdGUsIHN0cmVhbS5wb3MpOwogICAgICAgIHN0cmVhbS5wb3MgPSB0ZXh0Lmxlbmd0aDsKICAgICAgICBzdHlsZSA9IG51bGw7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc3R5bGUgPSBleHRyYWN0TGluZUNsYXNzZXMocmVhZFRva2VuKG1vZGUsIHN0cmVhbSwgc3RhdGUpLCBsaW5lQ2xhc3Nlcyk7CiAgICAgIH0KICAgICAgaWYgKGNtLm9wdGlvbnMuYWRkTW9kZUNsYXNzKSB7CiAgICAgICAgdmFyIG1OYW1lID0gQ29kZU1pcnJvci5pbm5lck1vZGUobW9kZSwgc3RhdGUpLm1vZGUubmFtZTsKICAgICAgICBpZiAobU5hbWUpIHN0eWxlID0gIm0tIiArIChzdHlsZSA/IG1OYW1lICsgIiAiICsgc3R5bGUgOiBtTmFtZSk7CiAgICAgIH0KICAgICAgaWYgKCFmbGF0dGVuU3BhbnMgfHwgY3VyU3R5bGUgIT0gc3R5bGUpIHsKICAgICAgICBpZiAoY3VyU3RhcnQgPCBzdHJlYW0uc3RhcnQpIGYoc3RyZWFtLnN0YXJ0LCBjdXJTdHlsZSk7CiAgICAgICAgY3VyU3RhcnQgPSBzdHJlYW0uc3RhcnQ7IGN1clN0eWxlID0gc3R5bGU7CiAgICAgIH0KICAgICAgc3RyZWFtLnN0YXJ0ID0gc3RyZWFtLnBvczsKICAgIH0KICAgIHdoaWxlIChjdXJTdGFydCA8IHN0cmVhbS5wb3MpIHsKICAgICAgLy8gV2Via2l0IHNlZW1zIHRvIHJlZnVzZSB0byByZW5kZXIgdGV4dCBub2RlcyBsb25nZXIgdGhhbiA1NzQ0NCBjaGFyYWN0ZXJzCiAgICAgIHZhciBwb3MgPSBNYXRoLm1pbihzdHJlYW0ucG9zLCBjdXJTdGFydCArIDUwMDAwKTsKICAgICAgZihwb3MsIGN1clN0eWxlKTsKICAgICAgY3VyU3RhcnQgPSBwb3M7CiAgICB9CiAgfQoKICAvLyBDb21wdXRlIGEgc3R5bGUgYXJyYXkgKGFuIGFycmF5IHN0YXJ0aW5nIHdpdGggYSBtb2RlIGdlbmVyYXRpb24KICAvLyAtLSBmb3IgaW52YWxpZGF0aW9uIC0tIGZvbGxvd2VkIGJ5IHBhaXJzIG9mIGVuZCBwb3NpdGlvbnMgYW5kCiAgLy8gc3R5bGUgc3RyaW5ncyksIHdoaWNoIGlzIHVzZWQgdG8gaGlnaGxpZ2h0IHRoZSB0b2tlbnMgb24gdGhlCiAgLy8gbGluZS4KICBmdW5jdGlvbiBoaWdobGlnaHRMaW5lKGNtLCBsaW5lLCBzdGF0ZSwgZm9yY2VUb0VuZCkgewogICAgLy8gQSBzdHlsZXMgYXJyYXkgYWx3YXlzIHN0YXJ0cyB3aXRoIGEgbnVtYmVyIGlkZW50aWZ5aW5nIHRoZQogICAgLy8gbW9kZS9vdmVybGF5cyB0aGF0IGl0IGlzIGJhc2VkIG9uIChmb3IgZWFzeSBpbnZhbGlkYXRpb24pLgogICAgdmFyIHN0ID0gW2NtLnN0YXRlLm1vZGVHZW5dLCBsaW5lQ2xhc3NlcyA9IHt9OwogICAgLy8gQ29tcHV0ZSB0aGUgYmFzZSBhcnJheSBvZiBzdHlsZXMKICAgIHJ1bk1vZGUoY20sIGxpbmUudGV4dCwgY20uZG9jLm1vZGUsIHN0YXRlLCBmdW5jdGlvbihlbmQsIHN0eWxlKSB7CiAgICAgIHN0LnB1c2goZW5kLCBzdHlsZSk7CiAgICB9LCBsaW5lQ2xhc3NlcywgZm9yY2VUb0VuZCk7CgogICAgLy8gUnVuIG92ZXJsYXlzLCBhZGp1c3Qgc3R5bGUgYXJyYXkuCiAgICBmb3IgKHZhciBvID0gMDsgbyA8IGNtLnN0YXRlLm92ZXJsYXlzLmxlbmd0aDsgKytvKSB7CiAgICAgIHZhciBvdmVybGF5ID0gY20uc3RhdGUub3ZlcmxheXNbb10sIGkgPSAxLCBhdCA9IDA7CiAgICAgIHJ1bk1vZGUoY20sIGxpbmUudGV4dCwgb3ZlcmxheS5tb2RlLCB0cnVlLCBmdW5jdGlvbihlbmQsIHN0eWxlKSB7CiAgICAgICAgdmFyIHN0YXJ0ID0gaTsKICAgICAgICAvLyBFbnN1cmUgdGhlcmUncyBhIHRva2VuIGVuZCBhdCB0aGUgY3VycmVudCBwb3NpdGlvbiwgYW5kIHRoYXQgaSBwb2ludHMgYXQgaXQKICAgICAgICB3aGlsZSAoYXQgPCBlbmQpIHsKICAgICAgICAgIHZhciBpX2VuZCA9IHN0W2ldOwogICAgICAgICAgaWYgKGlfZW5kID4gZW5kKQogICAgICAgICAgICBzdC5zcGxpY2UoaSwgMSwgZW5kLCBzdFtpKzFdLCBpX2VuZCk7CiAgICAgICAgICBpICs9IDI7CiAgICAgICAgICBhdCA9IE1hdGgubWluKGVuZCwgaV9lbmQpOwogICAgICAgIH0KICAgICAgICBpZiAoIXN0eWxlKSByZXR1cm47CiAgICAgICAgaWYgKG92ZXJsYXkub3BhcXVlKSB7CiAgICAgICAgICBzdC5zcGxpY2Uoc3RhcnQsIGkgLSBzdGFydCwgZW5kLCAiY20tb3ZlcmxheSAiICsgc3R5bGUpOwogICAgICAgICAgaSA9IHN0YXJ0ICsgMjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZm9yICg7IHN0YXJ0IDwgaTsgc3RhcnQgKz0gMikgewogICAgICAgICAgICB2YXIgY3VyID0gc3Rbc3RhcnQrMV07CiAgICAgICAgICAgIHN0W3N0YXJ0KzFdID0gKGN1ciA/IGN1ciArICIgIiA6ICIiKSArICJjbS1vdmVybGF5ICIgKyBzdHlsZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sIGxpbmVDbGFzc2VzKTsKICAgIH0KCiAgICByZXR1cm4ge3N0eWxlczogc3QsIGNsYXNzZXM6IGxpbmVDbGFzc2VzLmJnQ2xhc3MgfHwgbGluZUNsYXNzZXMudGV4dENsYXNzID8gbGluZUNsYXNzZXMgOiBudWxsfTsKICB9CgogIGZ1bmN0aW9uIGdldExpbmVTdHlsZXMoY20sIGxpbmUpIHsKICAgIGlmICghbGluZS5zdHlsZXMgfHwgbGluZS5zdHlsZXNbMF0gIT0gY20uc3RhdGUubW9kZUdlbikgewogICAgICB2YXIgcmVzdWx0ID0gaGlnaGxpZ2h0TGluZShjbSwgbGluZSwgbGluZS5zdGF0ZUFmdGVyID0gZ2V0U3RhdGVCZWZvcmUoY20sIGxpbmVObyhsaW5lKSkpOwogICAgICBsaW5lLnN0eWxlcyA9IHJlc3VsdC5zdHlsZXM7CiAgICAgIGlmIChyZXN1bHQuY2xhc3NlcykgbGluZS5zdHlsZUNsYXNzZXMgPSByZXN1bHQuY2xhc3NlczsKICAgICAgZWxzZSBpZiAobGluZS5zdHlsZUNsYXNzZXMpIGxpbmUuc3R5bGVDbGFzc2VzID0gbnVsbDsKICAgIH0KICAgIHJldHVybiBsaW5lLnN0eWxlczsKICB9CgogIC8vIExpZ2h0d2VpZ2h0IGZvcm0gb2YgaGlnaGxpZ2h0IC0tIHByb2NlZWQgb3ZlciB0aGlzIGxpbmUgYW5kCiAgLy8gdXBkYXRlIHN0YXRlLCBidXQgZG9uJ3Qgc2F2ZSBhIHN0eWxlIGFycmF5LiBVc2VkIGZvciBsaW5lcyB0aGF0CiAgLy8gYXJlbid0IGN1cnJlbnRseSB2aXNpYmxlLgogIGZ1bmN0aW9uIHByb2Nlc3NMaW5lKGNtLCB0ZXh0LCBzdGF0ZSwgc3RhcnRBdCkgewogICAgdmFyIG1vZGUgPSBjbS5kb2MubW9kZTsKICAgIHZhciBzdHJlYW0gPSBuZXcgU3RyaW5nU3RyZWFtKHRleHQsIGNtLm9wdGlvbnMudGFiU2l6ZSk7CiAgICBzdHJlYW0uc3RhcnQgPSBzdHJlYW0ucG9zID0gc3RhcnRBdCB8fCAwOwogICAgaWYgKHRleHQgPT0gIiIpIGNhbGxCbGFua0xpbmUobW9kZSwgc3RhdGUpOwogICAgd2hpbGUgKCFzdHJlYW0uZW9sKCkgJiYgc3RyZWFtLnBvcyA8PSBjbS5vcHRpb25zLm1heEhpZ2hsaWdodExlbmd0aCkgewogICAgICByZWFkVG9rZW4obW9kZSwgc3RyZWFtLCBzdGF0ZSk7CiAgICAgIHN0cmVhbS5zdGFydCA9IHN0cmVhbS5wb3M7CiAgICB9CiAgfQoKICAvLyBDb252ZXJ0IGEgc3R5bGUgYXMgcmV0dXJuZWQgYnkgYSBtb2RlIChlaXRoZXIgbnVsbCwgb3IgYSBzdHJpbmcKICAvLyBjb250YWluaW5nIG9uZSBvciBtb3JlIHN0eWxlcykgdG8gYSBDU1Mgc3R5bGUuIFRoaXMgaXMgY2FjaGVkLAogIC8vIGFuZCBhbHNvIGxvb2tzIGZvciBsaW5lLXdpZGUgc3R5bGVzLgogIHZhciBzdHlsZVRvQ2xhc3NDYWNoZSA9IHt9LCBzdHlsZVRvQ2xhc3NDYWNoZVdpdGhNb2RlID0ge307CiAgZnVuY3Rpb24gaW50ZXJwcmV0VG9rZW5TdHlsZShzdHlsZSwgb3B0aW9ucykgewogICAgaWYgKCFzdHlsZSB8fCAvXlxzKiQvLnRlc3Qoc3R5bGUpKSByZXR1cm4gbnVsbDsKICAgIHZhciBjYWNoZSA9IG9wdGlvbnMuYWRkTW9kZUNsYXNzID8gc3R5bGVUb0NsYXNzQ2FjaGVXaXRoTW9kZSA6IHN0eWxlVG9DbGFzc0NhY2hlOwogICAgcmV0dXJuIGNhY2hlW3N0eWxlXSB8fAogICAgICAoY2FjaGVbc3R5bGVdID0gc3R5bGUucmVwbGFjZSgvXFMrL2csICJjbS0kJiIpKTsKICB9CgogIC8vIFJlbmRlciB0aGUgRE9NIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0ZXh0IG9mIGEgbGluZS4gQWxzbyBidWlsZHMKICAvLyB1cCBhICdsaW5lIG1hcCcsIHdoaWNoIHBvaW50cyBhdCB0aGUgRE9NIG5vZGVzIHRoYXQgcmVwcmVzZW50CiAgLy8gc3BlY2lmaWMgc3RyZXRjaGVzIG9mIHRleHQsIGFuZCBpcyB1c2VkIGJ5IHRoZSBtZWFzdXJpbmcgY29kZS4KICAvLyBUaGUgcmV0dXJuZWQgb2JqZWN0IGNvbnRhaW5zIHRoZSBET00gbm9kZSwgdGhpcyBtYXAsIGFuZAogIC8vIGluZm9ybWF0aW9uIGFib3V0IGxpbmUtd2lkZSBzdHlsZXMgdGhhdCB3ZXJlIHNldCBieSB0aGUgbW9kZS4KICBmdW5jdGlvbiBidWlsZExpbmVDb250ZW50KGNtLCBsaW5lVmlldykgewogICAgLy8gVGhlIHBhZGRpbmctcmlnaHQgZm9yY2VzIHRoZSBlbGVtZW50IHRvIGhhdmUgYSAnYm9yZGVyJywgd2hpY2gKICAgIC8vIGlzIG5lZWRlZCBvbiBXZWJraXQgdG8gYmUgYWJsZSB0byBnZXQgbGluZS1sZXZlbCBib3VuZGluZwogICAgLy8gcmVjdGFuZ2xlcyBmb3IgaXQgKGluIG1lYXN1cmVDaGFyKS4KICAgIHZhciBjb250ZW50ID0gZWx0KCJzcGFuIiwgbnVsbCwgbnVsbCwgd2Via2l0ID8gInBhZGRpbmctcmlnaHQ6IC4xcHgiIDogbnVsbCk7CiAgICB2YXIgYnVpbGRlciA9IHtwcmU6IGVsdCgicHJlIiwgW2NvbnRlbnRdKSwgY29udGVudDogY29udGVudCwgY29sOiAwLCBwb3M6IDAsIGNtOiBjbX07CiAgICBsaW5lVmlldy5tZWFzdXJlID0ge307CgogICAgLy8gSXRlcmF0ZSBvdmVyIHRoZSBsb2dpY2FsIGxpbmVzIHRoYXQgbWFrZSB1cCB0aGlzIHZpc3VhbCBsaW5lLgogICAgZm9yICh2YXIgaSA9IDA7IGkgPD0gKGxpbmVWaWV3LnJlc3QgPyBsaW5lVmlldy5yZXN0Lmxlbmd0aCA6IDApOyBpKyspIHsKICAgICAgdmFyIGxpbmUgPSBpID8gbGluZVZpZXcucmVzdFtpIC0gMV0gOiBsaW5lVmlldy5saW5lLCBvcmRlcjsKICAgICAgYnVpbGRlci5wb3MgPSAwOwogICAgICBidWlsZGVyLmFkZFRva2VuID0gYnVpbGRUb2tlbjsKICAgICAgLy8gT3B0aW9uYWxseSB3aXJlIGluIHNvbWUgaGFja3MgaW50byB0aGUgdG9rZW4tcmVuZGVyaW5nCiAgICAgIC8vIGFsZ29yaXRobSwgdG8gZGVhbCB3aXRoIGJyb3dzZXIgcXVpcmtzLgogICAgICBpZiAoKGllIHx8IHdlYmtpdCkgJiYgY20uZ2V0T3B0aW9uKCJsaW5lV3JhcHBpbmciKSkKICAgICAgICBidWlsZGVyLmFkZFRva2VuID0gYnVpbGRUb2tlblNwbGl0U3BhY2VzKGJ1aWxkZXIuYWRkVG9rZW4pOwogICAgICBpZiAoaGFzQmFkQmlkaVJlY3RzKGNtLmRpc3BsYXkubWVhc3VyZSkgJiYgKG9yZGVyID0gZ2V0T3JkZXIobGluZSkpKQogICAgICAgIGJ1aWxkZXIuYWRkVG9rZW4gPSBidWlsZFRva2VuQmFkQmlkaShidWlsZGVyLmFkZFRva2VuLCBvcmRlcik7CiAgICAgIGJ1aWxkZXIubWFwID0gW107CiAgICAgIGluc2VydExpbmVDb250ZW50KGxpbmUsIGJ1aWxkZXIsIGdldExpbmVTdHlsZXMoY20sIGxpbmUpKTsKICAgICAgaWYgKGxpbmUuc3R5bGVDbGFzc2VzKSB7CiAgICAgICAgaWYgKGxpbmUuc3R5bGVDbGFzc2VzLmJnQ2xhc3MpCiAgICAgICAgICBidWlsZGVyLmJnQ2xhc3MgPSBqb2luQ2xhc3NlcyhsaW5lLnN0eWxlQ2xhc3Nlcy5iZ0NsYXNzLCBidWlsZGVyLmJnQ2xhc3MgfHwgIiIpOwogICAgICAgIGlmIChsaW5lLnN0eWxlQ2xhc3Nlcy50ZXh0Q2xhc3MpCiAgICAgICAgICBidWlsZGVyLnRleHRDbGFzcyA9IGpvaW5DbGFzc2VzKGxpbmUuc3R5bGVDbGFzc2VzLnRleHRDbGFzcywgYnVpbGRlci50ZXh0Q2xhc3MgfHwgIiIpOwogICAgICB9CgogICAgICAvLyBFbnN1cmUgYXQgbGVhc3QgYSBzaW5nbGUgbm9kZSBpcyBwcmVzZW50LCBmb3IgbWVhc3VyaW5nLgogICAgICBpZiAoYnVpbGRlci5tYXAubGVuZ3RoID09IDApCiAgICAgICAgYnVpbGRlci5tYXAucHVzaCgwLCAwLCBidWlsZGVyLmNvbnRlbnQuYXBwZW5kQ2hpbGQoemVyb1dpZHRoRWxlbWVudChjbS5kaXNwbGF5Lm1lYXN1cmUpKSk7CgogICAgICAvLyBTdG9yZSB0aGUgbWFwIGFuZCBhIGNhY2hlIG9iamVjdCBmb3IgdGhlIGN1cnJlbnQgbG9naWNhbCBsaW5lCiAgICAgIGlmIChpID09IDApIHsKICAgICAgICBsaW5lVmlldy5tZWFzdXJlLm1hcCA9IGJ1aWxkZXIubWFwOwogICAgICAgIGxpbmVWaWV3Lm1lYXN1cmUuY2FjaGUgPSB7fTsKICAgICAgfSBlbHNlIHsKICAgICAgICAobGluZVZpZXcubWVhc3VyZS5tYXBzIHx8IChsaW5lVmlldy5tZWFzdXJlLm1hcHMgPSBbXSkpLnB1c2goYnVpbGRlci5tYXApOwogICAgICAgIChsaW5lVmlldy5tZWFzdXJlLmNhY2hlcyB8fCAobGluZVZpZXcubWVhc3VyZS5jYWNoZXMgPSBbXSkpLnB1c2goe30pOwogICAgICB9CiAgICB9CgogICAgc2lnbmFsKGNtLCAicmVuZGVyTGluZSIsIGNtLCBsaW5lVmlldy5saW5lLCBidWlsZGVyLnByZSk7CiAgICBpZiAoYnVpbGRlci5wcmUuY2xhc3NOYW1lKQogICAgICBidWlsZGVyLnRleHRDbGFzcyA9IGpvaW5DbGFzc2VzKGJ1aWxkZXIucHJlLmNsYXNzTmFtZSwgYnVpbGRlci50ZXh0Q2xhc3MgfHwgIiIpOwogICAgcmV0dXJuIGJ1aWxkZXI7CiAgfQoKICBmdW5jdGlvbiBkZWZhdWx0U3BlY2lhbENoYXJQbGFjZWhvbGRlcihjaCkgewogICAgdmFyIHRva2VuID0gZWx0KCJzcGFuIiwgIlx1MjAyMiIsICJjbS1pbnZhbGlkY2hhciIpOwogICAgdG9rZW4udGl0bGUgPSAiXFx1IiArIGNoLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpOwogICAgcmV0dXJuIHRva2VuOwogIH0KCiAgLy8gQnVpbGQgdXAgdGhlIERPTSByZXByZXNlbnRhdGlvbiBmb3IgYSBzaW5nbGUgdG9rZW4sIGFuZCBhZGQgaXQgdG8KICAvLyB0aGUgbGluZSBtYXAuIFRha2VzIGNhcmUgdG8gcmVuZGVyIHNwZWNpYWwgY2hhcmFjdGVycyBzZXBhcmF0ZWx5LgogIGZ1bmN0aW9uIGJ1aWxkVG9rZW4oYnVpbGRlciwgdGV4dCwgc3R5bGUsIHN0YXJ0U3R5bGUsIGVuZFN0eWxlLCB0aXRsZSkgewogICAgaWYgKCF0ZXh0KSByZXR1cm47CiAgICB2YXIgc3BlY2lhbCA9IGJ1aWxkZXIuY20ub3B0aW9ucy5zcGVjaWFsQ2hhcnMsIG11c3RXcmFwID0gZmFsc2U7CiAgICBpZiAoIXNwZWNpYWwudGVzdCh0ZXh0KSkgewogICAgICBidWlsZGVyLmNvbCArPSB0ZXh0Lmxlbmd0aDsKICAgICAgdmFyIGNvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSh0ZXh0KTsKICAgICAgYnVpbGRlci5tYXAucHVzaChidWlsZGVyLnBvcywgYnVpbGRlci5wb3MgKyB0ZXh0Lmxlbmd0aCwgY29udGVudCk7CiAgICAgIGlmIChpZSAmJiBpZV92ZXJzaW9uIDwgOSkgbXVzdFdyYXAgPSB0cnVlOwogICAgICBidWlsZGVyLnBvcyArPSB0ZXh0Lmxlbmd0aDsKICAgIH0gZWxzZSB7CiAgICAgIHZhciBjb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLCBwb3MgPSAwOwogICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgIHNwZWNpYWwubGFzdEluZGV4ID0gcG9zOwogICAgICAgIHZhciBtID0gc3BlY2lhbC5leGVjKHRleHQpOwogICAgICAgIHZhciBza2lwcGVkID0gbSA/IG0uaW5kZXggLSBwb3MgOiB0ZXh0Lmxlbmd0aCAtIHBvczsKICAgICAgICBpZiAoc2tpcHBlZCkgewogICAgICAgICAgdmFyIHR4dCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHRleHQuc2xpY2UocG9zLCBwb3MgKyBza2lwcGVkKSk7CiAgICAgICAgICBpZiAoaWUgJiYgaWVfdmVyc2lvbiA8IDkpIGNvbnRlbnQuYXBwZW5kQ2hpbGQoZWx0KCJzcGFuIiwgW3R4dF0pKTsKICAgICAgICAgIGVsc2UgY29udGVudC5hcHBlbmRDaGlsZCh0eHQpOwogICAgICAgICAgYnVpbGRlci5tYXAucHVzaChidWlsZGVyLnBvcywgYnVpbGRlci5wb3MgKyBza2lwcGVkLCB0eHQpOwogICAgICAgICAgYnVpbGRlci5jb2wgKz0gc2tpcHBlZDsKICAgICAgICAgIGJ1aWxkZXIucG9zICs9IHNraXBwZWQ7CiAgICAgICAgfQogICAgICAgIGlmICghbSkgYnJlYWs7CiAgICAgICAgcG9zICs9IHNraXBwZWQgKyAxOwogICAgICAgIGlmIChtWzBdID09ICJcdCIpIHsKICAgICAgICAgIHZhciB0YWJTaXplID0gYnVpbGRlci5jbS5vcHRpb25zLnRhYlNpemUsIHRhYldpZHRoID0gdGFiU2l6ZSAtIGJ1aWxkZXIuY29sICUgdGFiU2l6ZTsKICAgICAgICAgIHZhciB0eHQgPSBjb250ZW50LmFwcGVuZENoaWxkKGVsdCgic3BhbiIsIHNwYWNlU3RyKHRhYldpZHRoKSwgImNtLXRhYiIpKTsKICAgICAgICAgIGJ1aWxkZXIuY29sICs9IHRhYldpZHRoOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB2YXIgdHh0ID0gYnVpbGRlci5jbS5vcHRpb25zLnNwZWNpYWxDaGFyUGxhY2Vob2xkZXIobVswXSk7CiAgICAgICAgICBpZiAoaWUgJiYgaWVfdmVyc2lvbiA8IDkpIGNvbnRlbnQuYXBwZW5kQ2hpbGQoZWx0KCJzcGFuIiwgW3R4dF0pKTsKICAgICAgICAgIGVsc2UgY29udGVudC5hcHBlbmRDaGlsZCh0eHQpOwogICAgICAgICAgYnVpbGRlci5jb2wgKz0gMTsKICAgICAgICB9CiAgICAgICAgYnVpbGRlci5tYXAucHVzaChidWlsZGVyLnBvcywgYnVpbGRlci5wb3MgKyAxLCB0eHQpOwogICAgICAgIGJ1aWxkZXIucG9zKys7CiAgICAgIH0KICAgIH0KICAgIGlmIChzdHlsZSB8fCBzdGFydFN0eWxlIHx8IGVuZFN0eWxlIHx8IG11c3RXcmFwKSB7CiAgICAgIHZhciBmdWxsU3R5bGUgPSBzdHlsZSB8fCAiIjsKICAgICAgaWYgKHN0YXJ0U3R5bGUpIGZ1bGxTdHlsZSArPSBzdGFydFN0eWxlOwogICAgICBpZiAoZW5kU3R5bGUpIGZ1bGxTdHlsZSArPSBlbmRTdHlsZTsKICAgICAgdmFyIHRva2VuID0gZWx0KCJzcGFuIiwgW2NvbnRlbnRdLCBmdWxsU3R5bGUpOwogICAgICBpZiAodGl0bGUpIHRva2VuLnRpdGxlID0gdGl0bGU7CiAgICAgIHJldHVybiBidWlsZGVyLmNvbnRlbnQuYXBwZW5kQ2hpbGQodG9rZW4pOwogICAgfQogICAgYnVpbGRlci5jb250ZW50LmFwcGVuZENoaWxkKGNvbnRlbnQpOwogIH0KCiAgZnVuY3Rpb24gYnVpbGRUb2tlblNwbGl0U3BhY2VzKGlubmVyKSB7CiAgICBmdW5jdGlvbiBzcGxpdChvbGQpIHsKICAgICAgdmFyIG91dCA9ICIgIjsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvbGQubGVuZ3RoIC0gMjsgKytpKSBvdXQgKz0gaSAlIDIgPyAiICIgOiAiXHUwMGEwIjsKICAgICAgb3V0ICs9ICIgIjsKICAgICAgcmV0dXJuIG91dDsKICAgIH0KICAgIHJldHVybiBmdW5jdGlvbihidWlsZGVyLCB0ZXh0LCBzdHlsZSwgc3RhcnRTdHlsZSwgZW5kU3R5bGUsIHRpdGxlKSB7CiAgICAgIGlubmVyKGJ1aWxkZXIsIHRleHQucmVwbGFjZSgvIHszLH0vZywgc3BsaXQpLCBzdHlsZSwgc3RhcnRTdHlsZSwgZW5kU3R5bGUsIHRpdGxlKTsKICAgIH07CiAgfQoKICAvLyBXb3JrIGFyb3VuZCBub25zZW5zZSBkaW1lbnNpb25zIGJlaW5nIHJlcG9ydGVkIGZvciBzdHJldGNoZXMgb2YKICAvLyByaWdodC10by1sZWZ0IHRleHQuCiAgZnVuY3Rpb24gYnVpbGRUb2tlbkJhZEJpZGkoaW5uZXIsIG9yZGVyKSB7CiAgICByZXR1cm4gZnVuY3Rpb24oYnVpbGRlciwgdGV4dCwgc3R5bGUsIHN0YXJ0U3R5bGUsIGVuZFN0eWxlLCB0aXRsZSkgewogICAgICBzdHlsZSA9IHN0eWxlID8gc3R5bGUgKyAiIGNtLWZvcmNlLWJvcmRlciIgOiAiY20tZm9yY2UtYm9yZGVyIjsKICAgICAgdmFyIHN0YXJ0ID0gYnVpbGRlci5wb3MsIGVuZCA9IHN0YXJ0ICsgdGV4dC5sZW5ndGg7CiAgICAgIGZvciAoOzspIHsKICAgICAgICAvLyBGaW5kIHRoZSBwYXJ0IHRoYXQgb3ZlcmxhcHMgd2l0aCB0aGUgc3RhcnQgb2YgdGhpcyB0ZXh0CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvcmRlci5sZW5ndGg7IGkrKykgewogICAgICAgICAgdmFyIHBhcnQgPSBvcmRlcltpXTsKICAgICAgICAgIGlmIChwYXJ0LnRvID4gc3RhcnQgJiYgcGFydC5mcm9tIDw9IHN0YXJ0KSBicmVhazsKICAgICAgICB9CiAgICAgICAgaWYgKHBhcnQudG8gPj0gZW5kKSByZXR1cm4gaW5uZXIoYnVpbGRlciwgdGV4dCwgc3R5bGUsIHN0YXJ0U3R5bGUsIGVuZFN0eWxlLCB0aXRsZSk7CiAgICAgICAgaW5uZXIoYnVpbGRlciwgdGV4dC5zbGljZSgwLCBwYXJ0LnRvIC0gc3RhcnQpLCBzdHlsZSwgc3RhcnRTdHlsZSwgbnVsbCwgdGl0bGUpOwogICAgICAgIHN0YXJ0U3R5bGUgPSBudWxsOwogICAgICAgIHRleHQgPSB0ZXh0LnNsaWNlKHBhcnQudG8gLSBzdGFydCk7CiAgICAgICAgc3RhcnQgPSBwYXJ0LnRvOwogICAgICB9CiAgICB9OwogIH0KCiAgZnVuY3Rpb24gYnVpbGRDb2xsYXBzZWRTcGFuKGJ1aWxkZXIsIHNpemUsIG1hcmtlciwgaWdub3JlV2lkZ2V0KSB7CiAgICB2YXIgd2lkZ2V0ID0gIWlnbm9yZVdpZGdldCAmJiBtYXJrZXIud2lkZ2V0Tm9kZTsKICAgIGlmICh3aWRnZXQpIHsKICAgICAgYnVpbGRlci5tYXAucHVzaChidWlsZGVyLnBvcywgYnVpbGRlci5wb3MgKyBzaXplLCB3aWRnZXQpOwogICAgICBidWlsZGVyLmNvbnRlbnQuYXBwZW5kQ2hpbGQod2lkZ2V0KTsKICAgIH0KICAgIGJ1aWxkZXIucG9zICs9IHNpemU7CiAgfQoKICAvLyBPdXRwdXRzIGEgbnVtYmVyIG9mIHNwYW5zIHRvIG1ha2UgdXAgYSBsaW5lLCB0YWtpbmcgaGlnaGxpZ2h0aW5nCiAgLy8gYW5kIG1hcmtlZCB0ZXh0IGludG8gYWNjb3VudC4KICBmdW5jdGlvbiBpbnNlcnRMaW5lQ29udGVudChsaW5lLCBidWlsZGVyLCBzdHlsZXMpIHsKICAgIHZhciBzcGFucyA9IGxpbmUubWFya2VkU3BhbnMsIGFsbFRleHQgPSBsaW5lLnRleHQsIGF0ID0gMDsKICAgIGlmICghc3BhbnMpIHsKICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBzdHlsZXMubGVuZ3RoOyBpKz0yKQogICAgICAgIGJ1aWxkZXIuYWRkVG9rZW4oYnVpbGRlciwgYWxsVGV4dC5zbGljZShhdCwgYXQgPSBzdHlsZXNbaV0pLCBpbnRlcnByZXRUb2tlblN0eWxlKHN0eWxlc1tpKzFdLCBidWlsZGVyLmNtLm9wdGlvbnMpKTsKICAgICAgcmV0dXJuOwogICAgfQoKICAgIHZhciBsZW4gPSBhbGxUZXh0Lmxlbmd0aCwgcG9zID0gMCwgaSA9IDEsIHRleHQgPSAiIiwgc3R5bGU7CiAgICB2YXIgbmV4dENoYW5nZSA9IDAsIHNwYW5TdHlsZSwgc3BhbkVuZFN0eWxlLCBzcGFuU3RhcnRTdHlsZSwgdGl0bGUsIGNvbGxhcHNlZDsKICAgIGZvciAoOzspIHsKICAgICAgaWYgKG5leHRDaGFuZ2UgPT0gcG9zKSB7IC8vIFVwZGF0ZSBjdXJyZW50IG1hcmtlciBzZXQKICAgICAgICBzcGFuU3R5bGUgPSBzcGFuRW5kU3R5bGUgPSBzcGFuU3RhcnRTdHlsZSA9IHRpdGxlID0gIiI7CiAgICAgICAgY29sbGFwc2VkID0gbnVsbDsgbmV4dENoYW5nZSA9IEluZmluaXR5OwogICAgICAgIHZhciBmb3VuZEJvb2ttYXJrcyA9IFtdOwogICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgc3BhbnMubGVuZ3RoOyArK2opIHsKICAgICAgICAgIHZhciBzcCA9IHNwYW5zW2pdLCBtID0gc3AubWFya2VyOwogICAgICAgICAgaWYgKHNwLmZyb20gPD0gcG9zICYmIChzcC50byA9PSBudWxsIHx8IHNwLnRvID4gcG9zKSkgewogICAgICAgICAgICBpZiAoc3AudG8gIT0gbnVsbCAmJiBuZXh0Q2hhbmdlID4gc3AudG8pIHsgbmV4dENoYW5nZSA9IHNwLnRvOyBzcGFuRW5kU3R5bGUgPSAiIjsgfQogICAgICAgICAgICBpZiAobS5jbGFzc05hbWUpIHNwYW5TdHlsZSArPSAiICIgKyBtLmNsYXNzTmFtZTsKICAgICAgICAgICAgaWYgKG0uc3RhcnRTdHlsZSAmJiBzcC5mcm9tID09IHBvcykgc3BhblN0YXJ0U3R5bGUgKz0gIiAiICsgbS5zdGFydFN0eWxlOwogICAgICAgICAgICBpZiAobS5lbmRTdHlsZSAmJiBzcC50byA9PSBuZXh0Q2hhbmdlKSBzcGFuRW5kU3R5bGUgKz0gIiAiICsgbS5lbmRTdHlsZTsKICAgICAgICAgICAgaWYgKG0udGl0bGUgJiYgIXRpdGxlKSB0aXRsZSA9IG0udGl0bGU7CiAgICAgICAgICAgIGlmIChtLmNvbGxhcHNlZCAmJiAoIWNvbGxhcHNlZCB8fCBjb21wYXJlQ29sbGFwc2VkTWFya2Vycyhjb2xsYXBzZWQubWFya2VyLCBtKSA8IDApKQogICAgICAgICAgICAgIGNvbGxhcHNlZCA9IHNwOwogICAgICAgICAgfSBlbHNlIGlmIChzcC5mcm9tID4gcG9zICYmIG5leHRDaGFuZ2UgPiBzcC5mcm9tKSB7CiAgICAgICAgICAgIG5leHRDaGFuZ2UgPSBzcC5mcm9tOwogICAgICAgICAgfQogICAgICAgICAgaWYgKG0udHlwZSA9PSAiYm9va21hcmsiICYmIHNwLmZyb20gPT0gcG9zICYmIG0ud2lkZ2V0Tm9kZSkgZm91bmRCb29rbWFya3MucHVzaChtKTsKICAgICAgICB9CiAgICAgICAgaWYgKGNvbGxhcHNlZCAmJiAoY29sbGFwc2VkLmZyb20gfHwgMCkgPT0gcG9zKSB7CiAgICAgICAgICBidWlsZENvbGxhcHNlZFNwYW4oYnVpbGRlciwgKGNvbGxhcHNlZC50byA9PSBudWxsID8gbGVuICsgMSA6IGNvbGxhcHNlZC50bykgLSBwb3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGFwc2VkLm1hcmtlciwgY29sbGFwc2VkLmZyb20gPT0gbnVsbCk7CiAgICAgICAgICBpZiAoY29sbGFwc2VkLnRvID09IG51bGwpIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKCFjb2xsYXBzZWQgJiYgZm91bmRCb29rbWFya3MubGVuZ3RoKSBmb3IgKHZhciBqID0gMDsgaiA8IGZvdW5kQm9va21hcmtzLmxlbmd0aDsgKytqKQogICAgICAgICAgYnVpbGRDb2xsYXBzZWRTcGFuKGJ1aWxkZXIsIDAsIGZvdW5kQm9va21hcmtzW2pdKTsKICAgICAgfQogICAgICBpZiAocG9zID49IGxlbikgYnJlYWs7CgogICAgICB2YXIgdXB0byA9IE1hdGgubWluKGxlbiwgbmV4dENoYW5nZSk7CiAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgaWYgKHRleHQpIHsKICAgICAgICAgIHZhciBlbmQgPSBwb3MgKyB0ZXh0Lmxlbmd0aDsKICAgICAgICAgIGlmICghY29sbGFwc2VkKSB7CiAgICAgICAgICAgIHZhciB0b2tlblRleHQgPSBlbmQgPiB1cHRvID8gdGV4dC5zbGljZSgwLCB1cHRvIC0gcG9zKSA6IHRleHQ7CiAgICAgICAgICAgIGJ1aWxkZXIuYWRkVG9rZW4oYnVpbGRlciwgdG9rZW5UZXh0LCBzdHlsZSA/IHN0eWxlICsgc3BhblN0eWxlIDogc3BhblN0eWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYW5TdGFydFN0eWxlLCBwb3MgKyB0b2tlblRleHQubGVuZ3RoID09IG5leHRDaGFuZ2UgPyBzcGFuRW5kU3R5bGUgOiAiIiwgdGl0bGUpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGVuZCA+PSB1cHRvKSB7dGV4dCA9IHRleHQuc2xpY2UodXB0byAtIHBvcyk7IHBvcyA9IHVwdG87IGJyZWFrO30KICAgICAgICAgIHBvcyA9IGVuZDsKICAgICAgICAgIHNwYW5TdGFydFN0eWxlID0gIiI7CiAgICAgICAgfQogICAgICAgIHRleHQgPSBhbGxUZXh0LnNsaWNlKGF0LCBhdCA9IHN0eWxlc1tpKytdKTsKICAgICAgICBzdHlsZSA9IGludGVycHJldFRva2VuU3R5bGUoc3R5bGVzW2krK10sIGJ1aWxkZXIuY20ub3B0aW9ucyk7CiAgICAgIH0KICAgIH0KICB9CgogIC8vIERPQ1VNRU5UIERBVEEgU1RSVUNUVVJFCgogIC8vIEJ5IGRlZmF1bHQsIHVwZGF0ZXMgdGhhdCBzdGFydCBhbmQgZW5kIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lCiAgLy8gYXJlIHRyZWF0ZWQgc3BlY2lhbGx5LCBpbiBvcmRlciB0byBtYWtlIHRoZSBhc3NvY2lhdGlvbiBvZiBsaW5lCiAgLy8gd2lkZ2V0cyBhbmQgbWFya2VyIGVsZW1lbnRzIHdpdGggdGhlIHRleHQgYmVoYXZlIG1vcmUgaW50dWl0aXZlLgogIGZ1bmN0aW9uIGlzV2hvbGVMaW5lVXBkYXRlKGRvYywgY2hhbmdlKSB7CiAgICByZXR1cm4gY2hhbmdlLmZyb20uY2ggPT0gMCAmJiBjaGFuZ2UudG8uY2ggPT0gMCAmJiBsc3QoY2hhbmdlLnRleHQpID09ICIiICYmCiAgICAgICghZG9jLmNtIHx8IGRvYy5jbS5vcHRpb25zLndob2xlTGluZVVwZGF0ZUJlZm9yZSk7CiAgfQoKICAvLyBQZXJmb3JtIGEgY2hhbmdlIG9uIHRoZSBkb2N1bWVudCBkYXRhIHN0cnVjdHVyZS4KICBmdW5jdGlvbiB1cGRhdGVEb2MoZG9jLCBjaGFuZ2UsIG1hcmtlZFNwYW5zLCBlc3RpbWF0ZUhlaWdodCkgewogICAgZnVuY3Rpb24gc3BhbnNGb3Iobikge3JldHVybiBtYXJrZWRTcGFucyA/IG1hcmtlZFNwYW5zW25dIDogbnVsbDt9CiAgICBmdW5jdGlvbiB1cGRhdGUobGluZSwgdGV4dCwgc3BhbnMpIHsKICAgICAgdXBkYXRlTGluZShsaW5lLCB0ZXh0LCBzcGFucywgZXN0aW1hdGVIZWlnaHQpOwogICAgICBzaWduYWxMYXRlcihsaW5lLCAiY2hhbmdlIiwgbGluZSwgY2hhbmdlKTsKICAgIH0KCiAgICB2YXIgZnJvbSA9IGNoYW5nZS5mcm9tLCB0byA9IGNoYW5nZS50bywgdGV4dCA9IGNoYW5nZS50ZXh0OwogICAgdmFyIGZpcnN0TGluZSA9IGdldExpbmUoZG9jLCBmcm9tLmxpbmUpLCBsYXN0TGluZSA9IGdldExpbmUoZG9jLCB0by5saW5lKTsKICAgIHZhciBsYXN0VGV4dCA9IGxzdCh0ZXh0KSwgbGFzdFNwYW5zID0gc3BhbnNGb3IodGV4dC5sZW5ndGggLSAxKSwgbmxpbmVzID0gdG8ubGluZSAtIGZyb20ubGluZTsKCiAgICAvLyBBZGp1c3QgdGhlIGxpbmUgc3RydWN0dXJlCiAgICBpZiAoaXNXaG9sZUxpbmVVcGRhdGUoZG9jLCBjaGFuZ2UpKSB7CiAgICAgIC8vIFRoaXMgaXMgYSB3aG9sZS1saW5lIHJlcGxhY2UuIFRyZWF0ZWQgc3BlY2lhbGx5IHRvIG1ha2UKICAgICAgLy8gc3VyZSBsaW5lIG9iamVjdHMgbW92ZSB0aGUgd2F5IHRoZXkgYXJlIHN1cHBvc2VkIHRvLgogICAgICBmb3IgKHZhciBpID0gMCwgYWRkZWQgPSBbXTsgaSA8IHRleHQubGVuZ3RoIC0gMTsgKytpKQogICAgICAgIGFkZGVkLnB1c2gobmV3IExpbmUodGV4dFtpXSwgc3BhbnNGb3IoaSksIGVzdGltYXRlSGVpZ2h0KSk7CiAgICAgIHVwZGF0ZShsYXN0TGluZSwgbGFzdExpbmUudGV4dCwgbGFzdFNwYW5zKTsKICAgICAgaWYgKG5saW5lcykgZG9jLnJlbW92ZShmcm9tLmxpbmUsIG5saW5lcyk7CiAgICAgIGlmIChhZGRlZC5sZW5ndGgpIGRvYy5pbnNlcnQoZnJvbS5saW5lLCBhZGRlZCk7CiAgICB9IGVsc2UgaWYgKGZpcnN0TGluZSA9PSBsYXN0TGluZSkgewogICAgICBpZiAodGV4dC5sZW5ndGggPT0gMSkgewogICAgICAgIHVwZGF0ZShmaXJzdExpbmUsIGZpcnN0TGluZS50ZXh0LnNsaWNlKDAsIGZyb20uY2gpICsgbGFzdFRleHQgKyBmaXJzdExpbmUudGV4dC5zbGljZSh0by5jaCksIGxhc3RTcGFucyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZm9yICh2YXIgYWRkZWQgPSBbXSwgaSA9IDE7IGkgPCB0ZXh0Lmxlbmd0aCAtIDE7ICsraSkKICAgICAgICAgIGFkZGVkLnB1c2gobmV3IExpbmUodGV4dFtpXSwgc3BhbnNGb3IoaSksIGVzdGltYXRlSGVpZ2h0KSk7CiAgICAgICAgYWRkZWQucHVzaChuZXcgTGluZShsYXN0VGV4dCArIGZpcnN0TGluZS50ZXh0LnNsaWNlKHRvLmNoKSwgbGFzdFNwYW5zLCBlc3RpbWF0ZUhlaWdodCkpOwogICAgICAgIHVwZGF0ZShmaXJzdExpbmUsIGZpcnN0TGluZS50ZXh0LnNsaWNlKDAsIGZyb20uY2gpICsgdGV4dFswXSwgc3BhbnNGb3IoMCkpOwogICAgICAgIGRvYy5pbnNlcnQoZnJvbS5saW5lICsgMSwgYWRkZWQpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKHRleHQubGVuZ3RoID09IDEpIHsKICAgICAgdXBkYXRlKGZpcnN0TGluZSwgZmlyc3RMaW5lLnRleHQuc2xpY2UoMCwgZnJvbS5jaCkgKyB0ZXh0WzBdICsgbGFzdExpbmUudGV4dC5zbGljZSh0by5jaCksIHNwYW5zRm9yKDApKTsKICAgICAgZG9jLnJlbW92ZShmcm9tLmxpbmUgKyAxLCBubGluZXMpOwogICAgfSBlbHNlIHsKICAgICAgdXBkYXRlKGZpcnN0TGluZSwgZmlyc3RMaW5lLnRleHQuc2xpY2UoMCwgZnJvbS5jaCkgKyB0ZXh0WzBdLCBzcGFuc0ZvcigwKSk7CiAgICAgIHVwZGF0ZShsYXN0TGluZSwgbGFzdFRleHQgKyBsYXN0TGluZS50ZXh0LnNsaWNlKHRvLmNoKSwgbGFzdFNwYW5zKTsKICAgICAgZm9yICh2YXIgaSA9IDEsIGFkZGVkID0gW107IGkgPCB0ZXh0Lmxlbmd0aCAtIDE7ICsraSkKICAgICAgICBhZGRlZC5wdXNoKG5ldyBMaW5lKHRleHRbaV0sIHNwYW5zRm9yKGkpLCBlc3RpbWF0ZUhlaWdodCkpOwogICAgICBpZiAobmxpbmVzID4gMSkgZG9jLnJlbW92ZShmcm9tLmxpbmUgKyAxLCBubGluZXMgLSAxKTsKICAgICAgZG9jLmluc2VydChmcm9tLmxpbmUgKyAxLCBhZGRlZCk7CiAgICB9CgogICAgc2lnbmFsTGF0ZXIoZG9jLCAiY2hhbmdlIiwgZG9jLCBjaGFuZ2UpOwogIH0KCiAgLy8gVGhlIGRvY3VtZW50IGlzIHJlcHJlc2VudGVkIGFzIGEgQlRyZWUgY29uc2lzdGluZyBvZiBsZWF2ZXMsIHdpdGgKICAvLyBjaHVuayBvZiBsaW5lcyBpbiB0aGVtLCBhbmQgYnJhbmNoZXMsIHdpdGggdXAgdG8gdGVuIGxlYXZlcyBvcgogIC8vIG90aGVyIGJyYW5jaCBub2RlcyBiZWxvdyB0aGVtLiBUaGUgdG9wIG5vZGUgaXMgYWx3YXlzIGEgYnJhbmNoCiAgLy8gbm9kZSwgYW5kIGlzIHRoZSBkb2N1bWVudCBvYmplY3QgaXRzZWxmIChtZWFuaW5nIGl0IGhhcwogIC8vIGFkZGl0aW9uYWwgbWV0aG9kcyBhbmQgcHJvcGVydGllcykuCiAgLy8KICAvLyBBbGwgbm9kZXMgaGF2ZSBwYXJlbnQgbGlua3MuIFRoZSB0cmVlIGlzIHVzZWQgYm90aCB0byBnbyBmcm9tCiAgLy8gbGluZSBudW1iZXJzIHRvIGxpbmUgb2JqZWN0cywgYW5kIHRvIGdvIGZyb20gb2JqZWN0cyB0byBudW1iZXJzLgogIC8vIEl0IGFsc28gaW5kZXhlcyBieSBoZWlnaHQsIGFuZCBpcyB1c2VkIHRvIGNvbnZlcnQgYmV0d2VlbiBoZWlnaHQKICAvLyBhbmQgbGluZSBvYmplY3QsIGFuZCB0byBmaW5kIHRoZSB0b3RhbCBoZWlnaHQgb2YgdGhlIGRvY3VtZW50LgogIC8vCiAgLy8gU2VlIGFsc28gaHR0cDovL21hcmlqbmhhdmVyYmVrZS5ubC9ibG9nL2NvZGVtaXJyb3ItbGluZS10cmVlLmh0bWwKCiAgZnVuY3Rpb24gTGVhZkNodW5rKGxpbmVzKSB7CiAgICB0aGlzLmxpbmVzID0gbGluZXM7CiAgICB0aGlzLnBhcmVudCA9IG51bGw7CiAgICBmb3IgKHZhciBpID0gMCwgaGVpZ2h0ID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgKytpKSB7CiAgICAgIGxpbmVzW2ldLnBhcmVudCA9IHRoaXM7CiAgICAgIGhlaWdodCArPSBsaW5lc1tpXS5oZWlnaHQ7CiAgICB9CiAgICB0aGlzLmhlaWdodCA9IGhlaWdodDsKICB9CgogIExlYWZDaHVuay5wcm90b3R5cGUgPSB7CiAgICBjaHVua1NpemU6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5saW5lcy5sZW5ndGg7IH0sCiAgICAvLyBSZW1vdmUgdGhlIG4gbGluZXMgYXQgb2Zmc2V0ICdhdCcuCiAgICByZW1vdmVJbm5lcjogZnVuY3Rpb24oYXQsIG4pIHsKICAgICAgZm9yICh2YXIgaSA9IGF0LCBlID0gYXQgKyBuOyBpIDwgZTsgKytpKSB7CiAgICAgICAgdmFyIGxpbmUgPSB0aGlzLmxpbmVzW2ldOwogICAgICAgIHRoaXMuaGVpZ2h0IC09IGxpbmUuaGVpZ2h0OwogICAgICAgIGNsZWFuVXBMaW5lKGxpbmUpOwogICAgICAgIHNpZ25hbExhdGVyKGxpbmUsICJkZWxldGUiKTsKICAgICAgfQogICAgICB0aGlzLmxpbmVzLnNwbGljZShhdCwgbik7CiAgICB9LAogICAgLy8gSGVscGVyIHVzZWQgdG8gY29sbGFwc2UgYSBzbWFsbCBicmFuY2ggaW50byBhIHNpbmdsZSBsZWFmLgogICAgY29sbGFwc2U6IGZ1bmN0aW9uKGxpbmVzKSB7CiAgICAgIGxpbmVzLnB1c2guYXBwbHkobGluZXMsIHRoaXMubGluZXMpOwogICAgfSwKICAgIC8vIEluc2VydCB0aGUgZ2l2ZW4gYXJyYXkgb2YgbGluZXMgYXQgb2Zmc2V0ICdhdCcsIGNvdW50IHRoZW0gYXMKICAgIC8vIGhhdmluZyB0aGUgZ2l2ZW4gaGVpZ2h0LgogICAgaW5zZXJ0SW5uZXI6IGZ1bmN0aW9uKGF0LCBsaW5lcywgaGVpZ2h0KSB7CiAgICAgIHRoaXMuaGVpZ2h0ICs9IGhlaWdodDsKICAgICAgdGhpcy5saW5lcyA9IHRoaXMubGluZXMuc2xpY2UoMCwgYXQpLmNvbmNhdChsaW5lcykuY29uY2F0KHRoaXMubGluZXMuc2xpY2UoYXQpKTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7ICsraSkgbGluZXNbaV0ucGFyZW50ID0gdGhpczsKICAgIH0sCiAgICAvLyBVc2VkIHRvIGl0ZXJhdGUgb3ZlciBhIHBhcnQgb2YgdGhlIHRyZWUuCiAgICBpdGVyTjogZnVuY3Rpb24oYXQsIG4sIG9wKSB7CiAgICAgIGZvciAodmFyIGUgPSBhdCArIG47IGF0IDwgZTsgKythdCkKICAgICAgICBpZiAob3AodGhpcy5saW5lc1thdF0pKSByZXR1cm4gdHJ1ZTsKICAgIH0KICB9OwoKICBmdW5jdGlvbiBCcmFuY2hDaHVuayhjaGlsZHJlbikgewogICAgdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuOwogICAgdmFyIHNpemUgPSAwLCBoZWlnaHQgPSAwOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7ICsraSkgewogICAgICB2YXIgY2ggPSBjaGlsZHJlbltpXTsKICAgICAgc2l6ZSArPSBjaC5jaHVua1NpemUoKTsgaGVpZ2h0ICs9IGNoLmhlaWdodDsKICAgICAgY2gucGFyZW50ID0gdGhpczsKICAgIH0KICAgIHRoaXMuc2l6ZSA9IHNpemU7CiAgICB0aGlzLmhlaWdodCA9IGhlaWdodDsKICAgIHRoaXMucGFyZW50ID0gbnVsbDsKICB9CgogIEJyYW5jaENodW5rLnByb3RvdHlwZSA9IHsKICAgIGNodW5rU2l6ZTogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLnNpemU7IH0sCiAgICByZW1vdmVJbm5lcjogZnVuY3Rpb24oYXQsIG4pIHsKICAgICAgdGhpcy5zaXplIC09IG47CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7ICsraSkgewogICAgICAgIHZhciBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV0sIHN6ID0gY2hpbGQuY2h1bmtTaXplKCk7CiAgICAgICAgaWYgKGF0IDwgc3opIHsKICAgICAgICAgIHZhciBybSA9IE1hdGgubWluKG4sIHN6IC0gYXQpLCBvbGRIZWlnaHQgPSBjaGlsZC5oZWlnaHQ7CiAgICAgICAgICBjaGlsZC5yZW1vdmVJbm5lcihhdCwgcm0pOwogICAgICAgICAgdGhpcy5oZWlnaHQgLT0gb2xkSGVpZ2h0IC0gY2hpbGQuaGVpZ2h0OwogICAgICAgICAgaWYgKHN6ID09IHJtKSB7IHRoaXMuY2hpbGRyZW4uc3BsaWNlKGktLSwgMSk7IGNoaWxkLnBhcmVudCA9IG51bGw7IH0KICAgICAgICAgIGlmICgobiAtPSBybSkgPT0gMCkgYnJlYWs7CiAgICAgICAgICBhdCA9IDA7CiAgICAgICAgfSBlbHNlIGF0IC09IHN6OwogICAgICB9CiAgICAgIC8vIElmIHRoZSByZXN1bHQgaXMgc21hbGxlciB0aGFuIDI1IGxpbmVzLCBlbnN1cmUgdGhhdCBpdCBpcyBhCiAgICAgIC8vIHNpbmdsZSBsZWFmIG5vZGUuCiAgICAgIGlmICh0aGlzLnNpemUgLSBuIDwgMjUgJiYKICAgICAgICAgICh0aGlzLmNoaWxkcmVuLmxlbmd0aCA+IDEgfHwgISh0aGlzLmNoaWxkcmVuWzBdIGluc3RhbmNlb2YgTGVhZkNodW5rKSkpIHsKICAgICAgICB2YXIgbGluZXMgPSBbXTsKICAgICAgICB0aGlzLmNvbGxhcHNlKGxpbmVzKTsKICAgICAgICB0aGlzLmNoaWxkcmVuID0gW25ldyBMZWFmQ2h1bmsobGluZXMpXTsKICAgICAgICB0aGlzLmNoaWxkcmVuWzBdLnBhcmVudCA9IHRoaXM7CiAgICAgIH0KICAgIH0sCiAgICBjb2xsYXBzZTogZnVuY3Rpb24obGluZXMpIHsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgKytpKSB0aGlzLmNoaWxkcmVuW2ldLmNvbGxhcHNlKGxpbmVzKTsKICAgIH0sCiAgICBpbnNlcnRJbm5lcjogZnVuY3Rpb24oYXQsIGxpbmVzLCBoZWlnaHQpIHsKICAgICAgdGhpcy5zaXplICs9IGxpbmVzLmxlbmd0aDsKICAgICAgdGhpcy5oZWlnaHQgKz0gaGVpZ2h0OwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuY2hpbGRyZW4ubGVuZ3RoOyArK2kpIHsKICAgICAgICB2YXIgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldLCBzeiA9IGNoaWxkLmNodW5rU2l6ZSgpOwogICAgICAgIGlmIChhdCA8PSBzeikgewogICAgICAgICAgY2hpbGQuaW5zZXJ0SW5uZXIoYXQsIGxpbmVzLCBoZWlnaHQpOwogICAgICAgICAgaWYgKGNoaWxkLmxpbmVzICYmIGNoaWxkLmxpbmVzLmxlbmd0aCA+IDUwKSB7CiAgICAgICAgICAgIHdoaWxlIChjaGlsZC5saW5lcy5sZW5ndGggPiA1MCkgewogICAgICAgICAgICAgIHZhciBzcGlsbGVkID0gY2hpbGQubGluZXMuc3BsaWNlKGNoaWxkLmxpbmVzLmxlbmd0aCAtIDI1LCAyNSk7CiAgICAgICAgICAgICAgdmFyIG5ld2xlYWYgPSBuZXcgTGVhZkNodW5rKHNwaWxsZWQpOwogICAgICAgICAgICAgIGNoaWxkLmhlaWdodCAtPSBuZXdsZWFmLmhlaWdodDsKICAgICAgICAgICAgICB0aGlzLmNoaWxkcmVuLnNwbGljZShpICsgMSwgMCwgbmV3bGVhZik7CiAgICAgICAgICAgICAgbmV3bGVhZi5wYXJlbnQgPSB0aGlzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMubWF5YmVTcGlsbCgpOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGF0IC09IHN6OwogICAgICB9CiAgICB9LAogICAgLy8gV2hlbiBhIG5vZGUgaGFzIGdyb3duLCBjaGVjayB3aGV0aGVyIGl0IHNob3VsZCBiZSBzcGxpdC4KICAgIG1heWJlU3BpbGw6IGZ1bmN0aW9uKCkgewogICAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPD0gMTApIHJldHVybjsKICAgICAgdmFyIG1lID0gdGhpczsKICAgICAgZG8gewogICAgICAgIHZhciBzcGlsbGVkID0gbWUuY2hpbGRyZW4uc3BsaWNlKG1lLmNoaWxkcmVuLmxlbmd0aCAtIDUsIDUpOwogICAgICAgIHZhciBzaWJsaW5nID0gbmV3IEJyYW5jaENodW5rKHNwaWxsZWQpOwogICAgICAgIGlmICghbWUucGFyZW50KSB7IC8vIEJlY29tZSB0aGUgcGFyZW50IG5vZGUKICAgICAgICAgIHZhciBjb3B5ID0gbmV3IEJyYW5jaENodW5rKG1lLmNoaWxkcmVuKTsKICAgICAgICAgIGNvcHkucGFyZW50ID0gbWU7CiAgICAgICAgICBtZS5jaGlsZHJlbiA9IFtjb3B5LCBzaWJsaW5nXTsKICAgICAgICAgIG1lID0gY29weTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbWUuc2l6ZSAtPSBzaWJsaW5nLnNpemU7CiAgICAgICAgICBtZS5oZWlnaHQgLT0gc2libGluZy5oZWlnaHQ7CiAgICAgICAgICB2YXIgbXlJbmRleCA9IGluZGV4T2YobWUucGFyZW50LmNoaWxkcmVuLCBtZSk7CiAgICAgICAgICBtZS5wYXJlbnQuY2hpbGRyZW4uc3BsaWNlKG15SW5kZXggKyAxLCAwLCBzaWJsaW5nKTsKICAgICAgICB9CiAgICAgICAgc2libGluZy5wYXJlbnQgPSBtZS5wYXJlbnQ7CiAgICAgIH0gd2hpbGUgKG1lLmNoaWxkcmVuLmxlbmd0aCA+IDEwKTsKICAgICAgbWUucGFyZW50Lm1heWJlU3BpbGwoKTsKICAgIH0sCiAgICBpdGVyTjogZnVuY3Rpb24oYXQsIG4sIG9wKSB7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7ICsraSkgewogICAgICAgIHZhciBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV0sIHN6ID0gY2hpbGQuY2h1bmtTaXplKCk7CiAgICAgICAgaWYgKGF0IDwgc3opIHsKICAgICAgICAgIHZhciB1c2VkID0gTWF0aC5taW4obiwgc3ogLSBhdCk7CiAgICAgICAgICBpZiAoY2hpbGQuaXRlck4oYXQsIHVzZWQsIG9wKSkgcmV0dXJuIHRydWU7CiAgICAgICAgICBpZiAoKG4gLT0gdXNlZCkgPT0gMCkgYnJlYWs7CiAgICAgICAgICBhdCA9IDA7CiAgICAgICAgfSBlbHNlIGF0IC09IHN6OwogICAgICB9CiAgICB9CiAgfTsKCiAgdmFyIG5leHREb2NJZCA9IDA7CiAgdmFyIERvYyA9IENvZGVNaXJyb3IuRG9jID0gZnVuY3Rpb24odGV4dCwgbW9kZSwgZmlyc3RMaW5lKSB7CiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgRG9jKSkgcmV0dXJuIG5ldyBEb2ModGV4dCwgbW9kZSwgZmlyc3RMaW5lKTsKICAgIGlmIChmaXJzdExpbmUgPT0gbnVsbCkgZmlyc3RMaW5lID0gMDsKCiAgICBCcmFuY2hDaHVuay5jYWxsKHRoaXMsIFtuZXcgTGVhZkNodW5rKFtuZXcgTGluZSgiIiwgbnVsbCldKV0pOwogICAgdGhpcy5maXJzdCA9IGZpcnN0TGluZTsKICAgIHRoaXMuc2Nyb2xsVG9wID0gdGhpcy5zY3JvbGxMZWZ0ID0gMDsKICAgIHRoaXMuY2FudEVkaXQgPSBmYWxzZTsKICAgIHRoaXMuY2xlYW5HZW5lcmF0aW9uID0gMTsKICAgIHRoaXMuZnJvbnRpZXIgPSBmaXJzdExpbmU7CiAgICB2YXIgc3RhcnQgPSBQb3MoZmlyc3RMaW5lLCAwKTsKICAgIHRoaXMuc2VsID0gc2ltcGxlU2VsZWN0aW9uKHN0YXJ0KTsKICAgIHRoaXMuaGlzdG9yeSA9IG5ldyBIaXN0b3J5KG51bGwpOwogICAgdGhpcy5pZCA9ICsrbmV4dERvY0lkOwogICAgdGhpcy5tb2RlT3B0aW9uID0gbW9kZTsKCiAgICBpZiAodHlwZW9mIHRleHQgPT0gInN0cmluZyIpIHRleHQgPSBzcGxpdExpbmVzKHRleHQpOwogICAgdXBkYXRlRG9jKHRoaXMsIHtmcm9tOiBzdGFydCwgdG86IHN0YXJ0LCB0ZXh0OiB0ZXh0fSk7CiAgICBzZXRTZWxlY3Rpb24odGhpcywgc2ltcGxlU2VsZWN0aW9uKHN0YXJ0KSwgc2VsX2RvbnRTY3JvbGwpOwogIH07CgogIERvYy5wcm90b3R5cGUgPSBjcmVhdGVPYmooQnJhbmNoQ2h1bmsucHJvdG90eXBlLCB7CiAgICBjb25zdHJ1Y3RvcjogRG9jLAogICAgLy8gSXRlcmF0ZSBvdmVyIHRoZSBkb2N1bWVudC4gU3VwcG9ydHMgdHdvIGZvcm1zIC0tIHdpdGggb25seSBvbmUKICAgIC8vIGFyZ3VtZW50LCBpdCBjYWxscyB0aGF0IGZvciBlYWNoIGxpbmUgaW4gdGhlIGRvY3VtZW50LiBXaXRoCiAgICAvLyB0aHJlZSwgaXQgaXRlcmF0ZXMgb3ZlciB0aGUgcmFuZ2UgZ2l2ZW4gYnkgdGhlIGZpcnN0IHR3byAod2l0aAogICAgLy8gdGhlIHNlY29uZCBiZWluZyBub24taW5jbHVzaXZlKS4KICAgIGl0ZXI6IGZ1bmN0aW9uKGZyb20sIHRvLCBvcCkgewogICAgICBpZiAob3ApIHRoaXMuaXRlck4oZnJvbSAtIHRoaXMuZmlyc3QsIHRvIC0gZnJvbSwgb3ApOwogICAgICBlbHNlIHRoaXMuaXRlck4odGhpcy5maXJzdCwgdGhpcy5maXJzdCArIHRoaXMuc2l6ZSwgZnJvbSk7CiAgICB9LAoKICAgIC8vIE5vbi1wdWJsaWMgaW50ZXJmYWNlIGZvciBhZGRpbmcgYW5kIHJlbW92aW5nIGxpbmVzLgogICAgaW5zZXJ0OiBmdW5jdGlvbihhdCwgbGluZXMpIHsKICAgICAgdmFyIGhlaWdodCA9IDA7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyArK2kpIGhlaWdodCArPSBsaW5lc1tpXS5oZWlnaHQ7CiAgICAgIHRoaXMuaW5zZXJ0SW5uZXIoYXQgLSB0aGlzLmZpcnN0LCBsaW5lcywgaGVpZ2h0KTsKICAgIH0sCiAgICByZW1vdmU6IGZ1bmN0aW9uKGF0LCBuKSB7IHRoaXMucmVtb3ZlSW5uZXIoYXQgLSB0aGlzLmZpcnN0LCBuKTsgfSwKCiAgICAvLyBGcm9tIGhlcmUsIHRoZSBtZXRob2RzIGFyZSBwYXJ0IG9mIHRoZSBwdWJsaWMgaW50ZXJmYWNlLiBNb3N0CiAgICAvLyBhcmUgYWxzbyBhdmFpbGFibGUgZnJvbSBDb2RlTWlycm9yIChlZGl0b3IpIGluc3RhbmNlcy4KCiAgICBnZXRWYWx1ZTogZnVuY3Rpb24obGluZVNlcCkgewogICAgICB2YXIgbGluZXMgPSBnZXRMaW5lcyh0aGlzLCB0aGlzLmZpcnN0LCB0aGlzLmZpcnN0ICsgdGhpcy5zaXplKTsKICAgICAgaWYgKGxpbmVTZXAgPT09IGZhbHNlKSByZXR1cm4gbGluZXM7CiAgICAgIHJldHVybiBsaW5lcy5qb2luKGxpbmVTZXAgfHwgIlxuIik7CiAgICB9LAogICAgc2V0VmFsdWU6IGRvY01ldGhvZE9wKGZ1bmN0aW9uKGNvZGUpIHsKICAgICAgdmFyIHRvcCA9IFBvcyh0aGlzLmZpcnN0LCAwKSwgbGFzdCA9IHRoaXMuZmlyc3QgKyB0aGlzLnNpemUgLSAxOwogICAgICBtYWtlQ2hhbmdlKHRoaXMsIHtmcm9tOiB0b3AsIHRvOiBQb3MobGFzdCwgZ2V0TGluZSh0aGlzLCBsYXN0KS50ZXh0Lmxlbmd0aCksCiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IHNwbGl0TGluZXMoY29kZSksIG9yaWdpbjogInNldFZhbHVlIn0sIHRydWUpOwogICAgICBzZXRTZWxlY3Rpb24odGhpcywgc2ltcGxlU2VsZWN0aW9uKHRvcCkpOwogICAgfSksCiAgICByZXBsYWNlUmFuZ2U6IGZ1bmN0aW9uKGNvZGUsIGZyb20sIHRvLCBvcmlnaW4pIHsKICAgICAgZnJvbSA9IGNsaXBQb3ModGhpcywgZnJvbSk7CiAgICAgIHRvID0gdG8gPyBjbGlwUG9zKHRoaXMsIHRvKSA6IGZyb207CiAgICAgIHJlcGxhY2VSYW5nZSh0aGlzLCBjb2RlLCBmcm9tLCB0bywgb3JpZ2luKTsKICAgIH0sCiAgICBnZXRSYW5nZTogZnVuY3Rpb24oZnJvbSwgdG8sIGxpbmVTZXApIHsKICAgICAgdmFyIGxpbmVzID0gZ2V0QmV0d2Vlbih0aGlzLCBjbGlwUG9zKHRoaXMsIGZyb20pLCBjbGlwUG9zKHRoaXMsIHRvKSk7CiAgICAgIGlmIChsaW5lU2VwID09PSBmYWxzZSkgcmV0dXJuIGxpbmVzOwogICAgICByZXR1cm4gbGluZXMuam9pbihsaW5lU2VwIHx8ICJcbiIpOwogICAgfSwKCiAgICBnZXRMaW5lOiBmdW5jdGlvbihsaW5lKSB7dmFyIGwgPSB0aGlzLmdldExpbmVIYW5kbGUobGluZSk7IHJldHVybiBsICYmIGwudGV4dDt9LAoKICAgIGdldExpbmVIYW5kbGU6IGZ1bmN0aW9uKGxpbmUpIHtpZiAoaXNMaW5lKHRoaXMsIGxpbmUpKSByZXR1cm4gZ2V0TGluZSh0aGlzLCBsaW5lKTt9LAogICAgZ2V0TGluZU51bWJlcjogZnVuY3Rpb24obGluZSkge3JldHVybiBsaW5lTm8obGluZSk7fSwKCiAgICBnZXRMaW5lSGFuZGxlVmlzdWFsU3RhcnQ6IGZ1bmN0aW9uKGxpbmUpIHsKICAgICAgaWYgKHR5cGVvZiBsaW5lID09ICJudW1iZXIiKSBsaW5lID0gZ2V0TGluZSh0aGlzLCBsaW5lKTsKICAgICAgcmV0dXJuIHZpc3VhbExpbmUobGluZSk7CiAgICB9LAoKICAgIGxpbmVDb3VudDogZnVuY3Rpb24oKSB7cmV0dXJuIHRoaXMuc2l6ZTt9LAogICAgZmlyc3RMaW5lOiBmdW5jdGlvbigpIHtyZXR1cm4gdGhpcy5maXJzdDt9LAogICAgbGFzdExpbmU6IGZ1bmN0aW9uKCkge3JldHVybiB0aGlzLmZpcnN0ICsgdGhpcy5zaXplIC0gMTt9LAoKICAgIGNsaXBQb3M6IGZ1bmN0aW9uKHBvcykge3JldHVybiBjbGlwUG9zKHRoaXMsIHBvcyk7fSwKCiAgICBnZXRDdXJzb3I6IGZ1bmN0aW9uKHN0YXJ0KSB7CiAgICAgIHZhciByYW5nZSA9IHRoaXMuc2VsLnByaW1hcnkoKSwgcG9zOwogICAgICBpZiAoc3RhcnQgPT0gbnVsbCB8fCBzdGFydCA9PSAiaGVhZCIpIHBvcyA9IHJhbmdlLmhlYWQ7CiAgICAgIGVsc2UgaWYgKHN0YXJ0ID09ICJhbmNob3IiKSBwb3MgPSByYW5nZS5hbmNob3I7CiAgICAgIGVsc2UgaWYgKHN0YXJ0ID09ICJlbmQiIHx8IHN0YXJ0ID09ICJ0byIgfHwgc3RhcnQgPT09IGZhbHNlKSBwb3MgPSByYW5nZS50bygpOwogICAgICBlbHNlIHBvcyA9IHJhbmdlLmZyb20oKTsKICAgICAgcmV0dXJuIHBvczsKICAgIH0sCiAgICBsaXN0U2VsZWN0aW9uczogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLnNlbC5yYW5nZXM7IH0sCiAgICBzb21ldGhpbmdTZWxlY3RlZDogZnVuY3Rpb24oKSB7cmV0dXJuIHRoaXMuc2VsLnNvbWV0aGluZ1NlbGVjdGVkKCk7fSwKCiAgICBzZXRDdXJzb3I6IGRvY01ldGhvZE9wKGZ1bmN0aW9uKGxpbmUsIGNoLCBvcHRpb25zKSB7CiAgICAgIHNldFNpbXBsZVNlbGVjdGlvbih0aGlzLCBjbGlwUG9zKHRoaXMsIHR5cGVvZiBsaW5lID09ICJudW1iZXIiID8gUG9zKGxpbmUsIGNoIHx8IDApIDogbGluZSksIG51bGwsIG9wdGlvbnMpOwogICAgfSksCiAgICBzZXRTZWxlY3Rpb246IGRvY01ldGhvZE9wKGZ1bmN0aW9uKGFuY2hvciwgaGVhZCwgb3B0aW9ucykgewogICAgICBzZXRTaW1wbGVTZWxlY3Rpb24odGhpcywgY2xpcFBvcyh0aGlzLCBhbmNob3IpLCBjbGlwUG9zKHRoaXMsIGhlYWQgfHwgYW5jaG9yKSwgb3B0aW9ucyk7CiAgICB9KSwKICAgIGV4dGVuZFNlbGVjdGlvbjogZG9jTWV0aG9kT3AoZnVuY3Rpb24oaGVhZCwgb3RoZXIsIG9wdGlvbnMpIHsKICAgICAgZXh0ZW5kU2VsZWN0aW9uKHRoaXMsIGNsaXBQb3ModGhpcywgaGVhZCksIG90aGVyICYmIGNsaXBQb3ModGhpcywgb3RoZXIpLCBvcHRpb25zKTsKICAgIH0pLAogICAgZXh0ZW5kU2VsZWN0aW9uczogZG9jTWV0aG9kT3AoZnVuY3Rpb24oaGVhZHMsIG9wdGlvbnMpIHsKICAgICAgZXh0ZW5kU2VsZWN0aW9ucyh0aGlzLCBjbGlwUG9zQXJyYXkodGhpcywgaGVhZHMsIG9wdGlvbnMpKTsKICAgIH0pLAogICAgZXh0ZW5kU2VsZWN0aW9uc0J5OiBkb2NNZXRob2RPcChmdW5jdGlvbihmLCBvcHRpb25zKSB7CiAgICAgIGV4dGVuZFNlbGVjdGlvbnModGhpcywgbWFwKHRoaXMuc2VsLnJhbmdlcywgZiksIG9wdGlvbnMpOwogICAgfSksCiAgICBzZXRTZWxlY3Rpb25zOiBkb2NNZXRob2RPcChmdW5jdGlvbihyYW5nZXMsIHByaW1hcnksIG9wdGlvbnMpIHsKICAgICAgaWYgKCFyYW5nZXMubGVuZ3RoKSByZXR1cm47CiAgICAgIGZvciAodmFyIGkgPSAwLCBvdXQgPSBbXTsgaSA8IHJhbmdlcy5sZW5ndGg7IGkrKykKICAgICAgICBvdXRbaV0gPSBuZXcgUmFuZ2UoY2xpcFBvcyh0aGlzLCByYW5nZXNbaV0uYW5jaG9yKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcFBvcyh0aGlzLCByYW5nZXNbaV0uaGVhZCkpOwogICAgICBpZiAocHJpbWFyeSA9PSBudWxsKSBwcmltYXJ5ID0gTWF0aC5taW4ocmFuZ2VzLmxlbmd0aCAtIDEsIHRoaXMuc2VsLnByaW1JbmRleCk7CiAgICAgIHNldFNlbGVjdGlvbih0aGlzLCBub3JtYWxpemVTZWxlY3Rpb24ob3V0LCBwcmltYXJ5KSwgb3B0aW9ucyk7CiAgICB9KSwKICAgIGFkZFNlbGVjdGlvbjogZG9jTWV0aG9kT3AoZnVuY3Rpb24oYW5jaG9yLCBoZWFkLCBvcHRpb25zKSB7CiAgICAgIHZhciByYW5nZXMgPSB0aGlzLnNlbC5yYW5nZXMuc2xpY2UoMCk7CiAgICAgIHJhbmdlcy5wdXNoKG5ldyBSYW5nZShjbGlwUG9zKHRoaXMsIGFuY2hvciksIGNsaXBQb3ModGhpcywgaGVhZCB8fCBhbmNob3IpKSk7CiAgICAgIHNldFNlbGVjdGlvbih0aGlzLCBub3JtYWxpemVTZWxlY3Rpb24ocmFuZ2VzLCByYW5nZXMubGVuZ3RoIC0gMSksIG9wdGlvbnMpOwogICAgfSksCgogICAgZ2V0U2VsZWN0aW9uOiBmdW5jdGlvbihsaW5lU2VwKSB7CiAgICAgIHZhciByYW5nZXMgPSB0aGlzLnNlbC5yYW5nZXMsIGxpbmVzOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJhbmdlcy5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciBzZWwgPSBnZXRCZXR3ZWVuKHRoaXMsIHJhbmdlc1tpXS5mcm9tKCksIHJhbmdlc1tpXS50bygpKTsKICAgICAgICBsaW5lcyA9IGxpbmVzID8gbGluZXMuY29uY2F0KHNlbCkgOiBzZWw7CiAgICAgIH0KICAgICAgaWYgKGxpbmVTZXAgPT09IGZhbHNlKSByZXR1cm4gbGluZXM7CiAgICAgIGVsc2UgcmV0dXJuIGxpbmVzLmpvaW4obGluZVNlcCB8fCAiXG4iKTsKICAgIH0sCiAgICBnZXRTZWxlY3Rpb25zOiBmdW5jdGlvbihsaW5lU2VwKSB7CiAgICAgIHZhciBwYXJ0cyA9IFtdLCByYW5nZXMgPSB0aGlzLnNlbC5yYW5nZXM7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIHNlbCA9IGdldEJldHdlZW4odGhpcywgcmFuZ2VzW2ldLmZyb20oKSwgcmFuZ2VzW2ldLnRvKCkpOwogICAgICAgIGlmIChsaW5lU2VwICE9PSBmYWxzZSkgc2VsID0gc2VsLmpvaW4obGluZVNlcCB8fCAiXG4iKTsKICAgICAgICBwYXJ0c1tpXSA9IHNlbDsKICAgICAgfQogICAgICByZXR1cm4gcGFydHM7CiAgICB9LAogICAgcmVwbGFjZVNlbGVjdGlvbjogZnVuY3Rpb24oY29kZSwgY29sbGFwc2UsIG9yaWdpbikgewogICAgICB2YXIgZHVwID0gW107CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5zZWwucmFuZ2VzLmxlbmd0aDsgaSsrKQogICAgICAgIGR1cFtpXSA9IGNvZGU7CiAgICAgIHRoaXMucmVwbGFjZVNlbGVjdGlvbnMoZHVwLCBjb2xsYXBzZSwgb3JpZ2luIHx8ICIraW5wdXQiKTsKICAgIH0sCiAgICByZXBsYWNlU2VsZWN0aW9uczogZG9jTWV0aG9kT3AoZnVuY3Rpb24oY29kZSwgY29sbGFwc2UsIG9yaWdpbikgewogICAgICB2YXIgY2hhbmdlcyA9IFtdLCBzZWwgPSB0aGlzLnNlbDsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWwucmFuZ2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIHJhbmdlID0gc2VsLnJhbmdlc1tpXTsKICAgICAgICBjaGFuZ2VzW2ldID0ge2Zyb206IHJhbmdlLmZyb20oKSwgdG86IHJhbmdlLnRvKCksIHRleHQ6IHNwbGl0TGluZXMoY29kZVtpXSksIG9yaWdpbjogb3JpZ2lufTsKICAgICAgfQogICAgICB2YXIgbmV3U2VsID0gY29sbGFwc2UgJiYgY29sbGFwc2UgIT0gImVuZCIgJiYgY29tcHV0ZVJlcGxhY2VkU2VsKHRoaXMsIGNoYW5nZXMsIGNvbGxhcHNlKTsKICAgICAgZm9yICh2YXIgaSA9IGNoYW5nZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pCiAgICAgICAgbWFrZUNoYW5nZSh0aGlzLCBjaGFuZ2VzW2ldKTsKICAgICAgaWYgKG5ld1NlbCkgc2V0U2VsZWN0aW9uUmVwbGFjZUhpc3RvcnkodGhpcywgbmV3U2VsKTsKICAgICAgZWxzZSBpZiAodGhpcy5jbSkgZW5zdXJlQ3Vyc29yVmlzaWJsZSh0aGlzLmNtKTsKICAgIH0pLAogICAgdW5kbzogZG9jTWV0aG9kT3AoZnVuY3Rpb24oKSB7bWFrZUNoYW5nZUZyb21IaXN0b3J5KHRoaXMsICJ1bmRvIik7fSksCiAgICByZWRvOiBkb2NNZXRob2RPcChmdW5jdGlvbigpIHttYWtlQ2hhbmdlRnJvbUhpc3RvcnkodGhpcywgInJlZG8iKTt9KSwKICAgIHVuZG9TZWxlY3Rpb246IGRvY01ldGhvZE9wKGZ1bmN0aW9uKCkge21ha2VDaGFuZ2VGcm9tSGlzdG9yeSh0aGlzLCAidW5kbyIsIHRydWUpO30pLAogICAgcmVkb1NlbGVjdGlvbjogZG9jTWV0aG9kT3AoZnVuY3Rpb24oKSB7bWFrZUNoYW5nZUZyb21IaXN0b3J5KHRoaXMsICJyZWRvIiwgdHJ1ZSk7fSksCgogICAgc2V0RXh0ZW5kaW5nOiBmdW5jdGlvbih2YWwpIHt0aGlzLmV4dGVuZCA9IHZhbDt9LAogICAgZ2V0RXh0ZW5kaW5nOiBmdW5jdGlvbigpIHtyZXR1cm4gdGhpcy5leHRlbmQ7fSwKCiAgICBoaXN0b3J5U2l6ZTogZnVuY3Rpb24oKSB7CiAgICAgIHZhciBoaXN0ID0gdGhpcy5oaXN0b3J5LCBkb25lID0gMCwgdW5kb25lID0gMDsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBoaXN0LmRvbmUubGVuZ3RoOyBpKyspIGlmICghaGlzdC5kb25lW2ldLnJhbmdlcykgKytkb25lOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhpc3QudW5kb25lLmxlbmd0aDsgaSsrKSBpZiAoIWhpc3QudW5kb25lW2ldLnJhbmdlcykgKyt1bmRvbmU7CiAgICAgIHJldHVybiB7dW5kbzogZG9uZSwgcmVkbzogdW5kb25lfTsKICAgIH0sCiAgICBjbGVhckhpc3Rvcnk6IGZ1bmN0aW9uKCkge3RoaXMuaGlzdG9yeSA9IG5ldyBIaXN0b3J5KHRoaXMuaGlzdG9yeS5tYXhHZW5lcmF0aW9uKTt9LAoKICAgIG1hcmtDbGVhbjogZnVuY3Rpb24oKSB7CiAgICAgIHRoaXMuY2xlYW5HZW5lcmF0aW9uID0gdGhpcy5jaGFuZ2VHZW5lcmF0aW9uKHRydWUpOwogICAgfSwKICAgIGNoYW5nZUdlbmVyYXRpb246IGZ1bmN0aW9uKGZvcmNlU3BsaXQpIHsKICAgICAgaWYgKGZvcmNlU3BsaXQpCiAgICAgICAgdGhpcy5oaXN0b3J5Lmxhc3RPcCA9IHRoaXMuaGlzdG9yeS5sYXN0T3JpZ2luID0gbnVsbDsKICAgICAgcmV0dXJuIHRoaXMuaGlzdG9yeS5nZW5lcmF0aW9uOwogICAgfSwKICAgIGlzQ2xlYW46IGZ1bmN0aW9uIChnZW4pIHsKICAgICAgcmV0dXJuIHRoaXMuaGlzdG9yeS5nZW5lcmF0aW9uID09IChnZW4gfHwgdGhpcy5jbGVhbkdlbmVyYXRpb24pOwogICAgfSwKCiAgICBnZXRIaXN0b3J5OiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHtkb25lOiBjb3B5SGlzdG9yeUFycmF5KHRoaXMuaGlzdG9yeS5kb25lKSwKICAgICAgICAgICAgICB1bmRvbmU6IGNvcHlIaXN0b3J5QXJyYXkodGhpcy5oaXN0b3J5LnVuZG9uZSl9OwogICAgfSwKICAgIHNldEhpc3Rvcnk6IGZ1bmN0aW9uKGhpc3REYXRhKSB7CiAgICAgIHZhciBoaXN0ID0gdGhpcy5oaXN0b3J5ID0gbmV3IEhpc3RvcnkodGhpcy5oaXN0b3J5Lm1heEdlbmVyYXRpb24pOwogICAgICBoaXN0LmRvbmUgPSBjb3B5SGlzdG9yeUFycmF5KGhpc3REYXRhLmRvbmUuc2xpY2UoMCksIG51bGwsIHRydWUpOwogICAgICBoaXN0LnVuZG9uZSA9IGNvcHlIaXN0b3J5QXJyYXkoaGlzdERhdGEudW5kb25lLnNsaWNlKDApLCBudWxsLCB0cnVlKTsKICAgIH0sCgogICAgYWRkTGluZUNsYXNzOiBkb2NNZXRob2RPcChmdW5jdGlvbihoYW5kbGUsIHdoZXJlLCBjbHMpIHsKICAgICAgcmV0dXJuIGNoYW5nZUxpbmUodGhpcywgaGFuZGxlLCAiY2xhc3MiLCBmdW5jdGlvbihsaW5lKSB7CiAgICAgICAgdmFyIHByb3AgPSB3aGVyZSA9PSAidGV4dCIgPyAidGV4dENsYXNzIiA6IHdoZXJlID09ICJiYWNrZ3JvdW5kIiA/ICJiZ0NsYXNzIiA6ICJ3cmFwQ2xhc3MiOwogICAgICAgIGlmICghbGluZVtwcm9wXSkgbGluZVtwcm9wXSA9IGNsczsKICAgICAgICBlbHNlIGlmIChuZXcgUmVnRXhwKCIoPzpefFxccykiICsgY2xzICsgIig/OiR8XFxzKSIpLnRlc3QobGluZVtwcm9wXSkpIHJldHVybiBmYWxzZTsKICAgICAgICBlbHNlIGxpbmVbcHJvcF0gKz0gIiAiICsgY2xzOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9KTsKICAgIH0pLAogICAgcmVtb3ZlTGluZUNsYXNzOiBkb2NNZXRob2RPcChmdW5jdGlvbihoYW5kbGUsIHdoZXJlLCBjbHMpIHsKICAgICAgcmV0dXJuIGNoYW5nZUxpbmUodGhpcywgaGFuZGxlLCAiY2xhc3MiLCBmdW5jdGlvbihsaW5lKSB7CiAgICAgICAgdmFyIHByb3AgPSB3aGVyZSA9PSAidGV4dCIgPyAidGV4dENsYXNzIiA6IHdoZXJlID09ICJiYWNrZ3JvdW5kIiA/ICJiZ0NsYXNzIiA6ICJ3cmFwQ2xhc3MiOwogICAgICAgIHZhciBjdXIgPSBsaW5lW3Byb3BdOwogICAgICAgIGlmICghY3VyKSByZXR1cm4gZmFsc2U7CiAgICAgICAgZWxzZSBpZiAoY2xzID09IG51bGwpIGxpbmVbcHJvcF0gPSBudWxsOwogICAgICAgIGVsc2UgewogICAgICAgICAgdmFyIGZvdW5kID0gY3VyLm1hdGNoKG5ldyBSZWdFeHAoIig/Ol58XFxzKykiICsgY2xzICsgIig/OiR8XFxzKykiKSk7CiAgICAgICAgICBpZiAoIWZvdW5kKSByZXR1cm4gZmFsc2U7CiAgICAgICAgICB2YXIgZW5kID0gZm91bmQuaW5kZXggKyBmb3VuZFswXS5sZW5ndGg7CiAgICAgICAgICBsaW5lW3Byb3BdID0gY3VyLnNsaWNlKDAsIGZvdW5kLmluZGV4KSArICghZm91bmQuaW5kZXggfHwgZW5kID09IGN1ci5sZW5ndGggPyAiIiA6ICIgIikgKyBjdXIuc2xpY2UoZW5kKSB8fCBudWxsOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfSk7CiAgICB9KSwKCiAgICBtYXJrVGV4dDogZnVuY3Rpb24oZnJvbSwgdG8sIG9wdGlvbnMpIHsKICAgICAgcmV0dXJuIG1hcmtUZXh0KHRoaXMsIGNsaXBQb3ModGhpcywgZnJvbSksIGNsaXBQb3ModGhpcywgdG8pLCBvcHRpb25zLCAicmFuZ2UiKTsKICAgIH0sCiAgICBzZXRCb29rbWFyazogZnVuY3Rpb24ocG9zLCBvcHRpb25zKSB7CiAgICAgIHZhciByZWFsT3B0cyA9IHtyZXBsYWNlZFdpdGg6IG9wdGlvbnMgJiYgKG9wdGlvbnMubm9kZVR5cGUgPT0gbnVsbCA/IG9wdGlvbnMud2lkZ2V0IDogb3B0aW9ucyksCiAgICAgICAgICAgICAgICAgICAgICBpbnNlcnRMZWZ0OiBvcHRpb25zICYmIG9wdGlvbnMuaW5zZXJ0TGVmdCwKICAgICAgICAgICAgICAgICAgICAgIGNsZWFyV2hlbkVtcHR5OiBmYWxzZSwgc2hhcmVkOiBvcHRpb25zICYmIG9wdGlvbnMuc2hhcmVkfTsKICAgICAgcG9zID0gY2xpcFBvcyh0aGlzLCBwb3MpOwogICAgICByZXR1cm4gbWFya1RleHQodGhpcywgcG9zLCBwb3MsIHJlYWxPcHRzLCAiYm9va21hcmsiKTsKICAgIH0sCiAgICBmaW5kTWFya3NBdDogZnVuY3Rpb24ocG9zKSB7CiAgICAgIHBvcyA9IGNsaXBQb3ModGhpcywgcG9zKTsKICAgICAgdmFyIG1hcmtlcnMgPSBbXSwgc3BhbnMgPSBnZXRMaW5lKHRoaXMsIHBvcy5saW5lKS5tYXJrZWRTcGFuczsKICAgICAgaWYgKHNwYW5zKSBmb3IgKHZhciBpID0gMDsgaSA8IHNwYW5zLmxlbmd0aDsgKytpKSB7CiAgICAgICAgdmFyIHNwYW4gPSBzcGFuc1tpXTsKICAgICAgICBpZiAoKHNwYW4uZnJvbSA9PSBudWxsIHx8IHNwYW4uZnJvbSA8PSBwb3MuY2gpICYmCiAgICAgICAgICAgIChzcGFuLnRvID09IG51bGwgfHwgc3Bhbi50byA+PSBwb3MuY2gpKQogICAgICAgICAgbWFya2Vycy5wdXNoKHNwYW4ubWFya2VyLnBhcmVudCB8fCBzcGFuLm1hcmtlcik7CiAgICAgIH0KICAgICAgcmV0dXJuIG1hcmtlcnM7CiAgICB9LAogICAgZmluZE1hcmtzOiBmdW5jdGlvbihmcm9tLCB0bywgZmlsdGVyKSB7CiAgICAgIGZyb20gPSBjbGlwUG9zKHRoaXMsIGZyb20pOyB0byA9IGNsaXBQb3ModGhpcywgdG8pOwogICAgICB2YXIgZm91bmQgPSBbXSwgbGluZU5vID0gZnJvbS5saW5lOwogICAgICB0aGlzLml0ZXIoZnJvbS5saW5lLCB0by5saW5lICsgMSwgZnVuY3Rpb24obGluZSkgewogICAgICAgIHZhciBzcGFucyA9IGxpbmUubWFya2VkU3BhbnM7CiAgICAgICAgaWYgKHNwYW5zKSBmb3IgKHZhciBpID0gMDsgaSA8IHNwYW5zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB2YXIgc3BhbiA9IHNwYW5zW2ldOwogICAgICAgICAgaWYgKCEobGluZU5vID09IGZyb20ubGluZSAmJiBmcm9tLmNoID4gc3Bhbi50byB8fAogICAgICAgICAgICAgICAgc3Bhbi5mcm9tID09IG51bGwgJiYgbGluZU5vICE9IGZyb20ubGluZXx8CiAgICAgICAgICAgICAgICBsaW5lTm8gPT0gdG8ubGluZSAmJiBzcGFuLmZyb20gPiB0by5jaCkgJiYKICAgICAgICAgICAgICAoIWZpbHRlciB8fCBmaWx0ZXIoc3Bhbi5tYXJrZXIpKSkKICAgICAgICAgICAgZm91bmQucHVzaChzcGFuLm1hcmtlci5wYXJlbnQgfHwgc3Bhbi5tYXJrZXIpOwogICAgICAgIH0KICAgICAgICArK2xpbmVObzsKICAgICAgfSk7CiAgICAgIHJldHVybiBmb3VuZDsKICAgIH0sCiAgICBnZXRBbGxNYXJrczogZnVuY3Rpb24oKSB7CiAgICAgIHZhciBtYXJrZXJzID0gW107CiAgICAgIHRoaXMuaXRlcihmdW5jdGlvbihsaW5lKSB7CiAgICAgICAgdmFyIHNwcyA9IGxpbmUubWFya2VkU3BhbnM7CiAgICAgICAgaWYgKHNwcykgZm9yICh2YXIgaSA9IDA7IGkgPCBzcHMubGVuZ3RoOyArK2kpCiAgICAgICAgICBpZiAoc3BzW2ldLmZyb20gIT0gbnVsbCkgbWFya2Vycy5wdXNoKHNwc1tpXS5tYXJrZXIpOwogICAgICB9KTsKICAgICAgcmV0dXJuIG1hcmtlcnM7CiAgICB9LAoKICAgIHBvc0Zyb21JbmRleDogZnVuY3Rpb24ob2ZmKSB7CiAgICAgIHZhciBjaCwgbGluZU5vID0gdGhpcy5maXJzdDsKICAgICAgdGhpcy5pdGVyKGZ1bmN0aW9uKGxpbmUpIHsKICAgICAgICB2YXIgc3ogPSBsaW5lLnRleHQubGVuZ3RoICsgMTsKICAgICAgICBpZiAoc3ogPiBvZmYpIHsgY2ggPSBvZmY7IHJldHVybiB0cnVlOyB9CiAgICAgICAgb2ZmIC09IHN6OwogICAgICAgICsrbGluZU5vOwogICAgICB9KTsKICAgICAgcmV0dXJuIGNsaXBQb3ModGhpcywgUG9zKGxpbmVObywgY2gpKTsKICAgIH0sCiAgICBpbmRleEZyb21Qb3M6IGZ1bmN0aW9uIChjb29yZHMpIHsKICAgICAgY29vcmRzID0gY2xpcFBvcyh0aGlzLCBjb29yZHMpOwogICAgICB2YXIgaW5kZXggPSBjb29yZHMuY2g7CiAgICAgIGlmIChjb29yZHMubGluZSA8IHRoaXMuZmlyc3QgfHwgY29vcmRzLmNoIDwgMCkgcmV0dXJuIDA7CiAgICAgIHRoaXMuaXRlcih0aGlzLmZpcnN0LCBjb29yZHMubGluZSwgZnVuY3Rpb24gKGxpbmUpIHsKICAgICAgICBpbmRleCArPSBsaW5lLnRleHQubGVuZ3RoICsgMTsKICAgICAgfSk7CiAgICAgIHJldHVybiBpbmRleDsKICAgIH0sCgogICAgY29weTogZnVuY3Rpb24oY29weUhpc3RvcnkpIHsKICAgICAgdmFyIGRvYyA9IG5ldyBEb2MoZ2V0TGluZXModGhpcywgdGhpcy5maXJzdCwgdGhpcy5maXJzdCArIHRoaXMuc2l6ZSksIHRoaXMubW9kZU9wdGlvbiwgdGhpcy5maXJzdCk7CiAgICAgIGRvYy5zY3JvbGxUb3AgPSB0aGlzLnNjcm9sbFRvcDsgZG9jLnNjcm9sbExlZnQgPSB0aGlzLnNjcm9sbExlZnQ7CiAgICAgIGRvYy5zZWwgPSB0aGlzLnNlbDsKICAgICAgZG9jLmV4dGVuZCA9IGZhbHNlOwogICAgICBpZiAoY29weUhpc3RvcnkpIHsKICAgICAgICBkb2MuaGlzdG9yeS51bmRvRGVwdGggPSB0aGlzLmhpc3RvcnkudW5kb0RlcHRoOwogICAgICAgIGRvYy5zZXRIaXN0b3J5KHRoaXMuZ2V0SGlzdG9yeSgpKTsKICAgICAgfQogICAgICByZXR1cm4gZG9jOwogICAgfSwKCiAgICBsaW5rZWREb2M6IGZ1bmN0aW9uKG9wdGlvbnMpIHsKICAgICAgaWYgKCFvcHRpb25zKSBvcHRpb25zID0ge307CiAgICAgIHZhciBmcm9tID0gdGhpcy5maXJzdCwgdG8gPSB0aGlzLmZpcnN0ICsgdGhpcy5zaXplOwogICAgICBpZiAob3B0aW9ucy5mcm9tICE9IG51bGwgJiYgb3B0aW9ucy5mcm9tID4gZnJvbSkgZnJvbSA9IG9wdGlvbnMuZnJvbTsKICAgICAgaWYgKG9wdGlvbnMudG8gIT0gbnVsbCAmJiBvcHRpb25zLnRvIDwgdG8pIHRvID0gb3B0aW9ucy50bzsKICAgICAgdmFyIGNvcHkgPSBuZXcgRG9jKGdldExpbmVzKHRoaXMsIGZyb20sIHRvKSwgb3B0aW9ucy5tb2RlIHx8IHRoaXMubW9kZU9wdGlvbiwgZnJvbSk7CiAgICAgIGlmIChvcHRpb25zLnNoYXJlZEhpc3QpIGNvcHkuaGlzdG9yeSA9IHRoaXMuaGlzdG9yeTsKICAgICAgKHRoaXMubGlua2VkIHx8ICh0aGlzLmxpbmtlZCA9IFtdKSkucHVzaCh7ZG9jOiBjb3B5LCBzaGFyZWRIaXN0OiBvcHRpb25zLnNoYXJlZEhpc3R9KTsKICAgICAgY29weS5saW5rZWQgPSBbe2RvYzogdGhpcywgaXNQYXJlbnQ6IHRydWUsIHNoYXJlZEhpc3Q6IG9wdGlvbnMuc2hhcmVkSGlzdH1dOwogICAgICBjb3B5U2hhcmVkTWFya2Vycyhjb3B5LCBmaW5kU2hhcmVkTWFya2Vycyh0aGlzKSk7CiAgICAgIHJldHVybiBjb3B5OwogICAgfSwKICAgIHVubGlua0RvYzogZnVuY3Rpb24ob3RoZXIpIHsKICAgICAgaWYgKG90aGVyIGluc3RhbmNlb2YgQ29kZU1pcnJvcikgb3RoZXIgPSBvdGhlci5kb2M7CiAgICAgIGlmICh0aGlzLmxpbmtlZCkgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxpbmtlZC5sZW5ndGg7ICsraSkgewogICAgICAgIHZhciBsaW5rID0gdGhpcy5saW5rZWRbaV07CiAgICAgICAgaWYgKGxpbmsuZG9jICE9IG90aGVyKSBjb250aW51ZTsKICAgICAgICB0aGlzLmxpbmtlZC5zcGxpY2UoaSwgMSk7CiAgICAgICAgb3RoZXIudW5saW5rRG9jKHRoaXMpOwogICAgICAgIGRldGFjaFNoYXJlZE1hcmtlcnMoZmluZFNoYXJlZE1hcmtlcnModGhpcykpOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIC8vIElmIHRoZSBoaXN0b3JpZXMgd2VyZSBzaGFyZWQsIHNwbGl0IHRoZW0gYWdhaW4KICAgICAgaWYgKG90aGVyLmhpc3RvcnkgPT0gdGhpcy5oaXN0b3J5KSB7CiAgICAgICAgdmFyIHNwbGl0SWRzID0gW290aGVyLmlkXTsKICAgICAgICBsaW5rZWREb2NzKG90aGVyLCBmdW5jdGlvbihkb2MpIHtzcGxpdElkcy5wdXNoKGRvYy5pZCk7fSwgdHJ1ZSk7CiAgICAgICAgb3RoZXIuaGlzdG9yeSA9IG5ldyBIaXN0b3J5KG51bGwpOwogICAgICAgIG90aGVyLmhpc3RvcnkuZG9uZSA9IGNvcHlIaXN0b3J5QXJyYXkodGhpcy5oaXN0b3J5LmRvbmUsIHNwbGl0SWRzKTsKICAgICAgICBvdGhlci5oaXN0b3J5LnVuZG9uZSA9IGNvcHlIaXN0b3J5QXJyYXkodGhpcy5oaXN0b3J5LnVuZG9uZSwgc3BsaXRJZHMpOwogICAgICB9CiAgICB9LAogICAgaXRlckxpbmtlZERvY3M6IGZ1bmN0aW9uKGYpIHtsaW5rZWREb2NzKHRoaXMsIGYpO30sCgogICAgZ2V0TW9kZTogZnVuY3Rpb24oKSB7cmV0dXJuIHRoaXMubW9kZTt9LAogICAgZ2V0RWRpdG9yOiBmdW5jdGlvbigpIHtyZXR1cm4gdGhpcy5jbTt9CiAgfSk7CgogIC8vIFB1YmxpYyBhbGlhcy4KICBEb2MucHJvdG90eXBlLmVhY2hMaW5lID0gRG9jLnByb3RvdHlwZS5pdGVyOwoKICAvLyBTZXQgdXAgbWV0aG9kcyBvbiBDb2RlTWlycm9yJ3MgcHJvdG90eXBlIHRvIHJlZGlyZWN0IHRvIHRoZSBlZGl0b3IncyBkb2N1bWVudC4KICB2YXIgZG9udERlbGVnYXRlID0gIml0ZXIgaW5zZXJ0IHJlbW92ZSBjb3B5IGdldEVkaXRvciIuc3BsaXQoIiAiKTsKICBmb3IgKHZhciBwcm9wIGluIERvYy5wcm90b3R5cGUpIGlmIChEb2MucHJvdG90eXBlLmhhc093blByb3BlcnR5KHByb3ApICYmIGluZGV4T2YoZG9udERlbGVnYXRlLCBwcm9wKSA8IDApCiAgICBDb2RlTWlycm9yLnByb3RvdHlwZVtwcm9wXSA9IChmdW5jdGlvbihtZXRob2QpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge3JldHVybiBtZXRob2QuYXBwbHkodGhpcy5kb2MsIGFyZ3VtZW50cyk7fTsKICAgIH0pKERvYy5wcm90b3R5cGVbcHJvcF0pOwoKICBldmVudE1peGluKERvYyk7CgogIC8vIENhbGwgZiBmb3IgYWxsIGxpbmtlZCBkb2N1bWVudHMuCiAgZnVuY3Rpb24gbGlua2VkRG9jcyhkb2MsIGYsIHNoYXJlZEhpc3RPbmx5KSB7CiAgICBmdW5jdGlvbiBwcm9wYWdhdGUoZG9jLCBza2lwLCBzaGFyZWRIaXN0KSB7CiAgICAgIGlmIChkb2MubGlua2VkKSBmb3IgKHZhciBpID0gMDsgaSA8IGRvYy5saW5rZWQubGVuZ3RoOyArK2kpIHsKICAgICAgICB2YXIgcmVsID0gZG9jLmxpbmtlZFtpXTsKICAgICAgICBpZiAocmVsLmRvYyA9PSBza2lwKSBjb250aW51ZTsKICAgICAgICB2YXIgc2hhcmVkID0gc2hhcmVkSGlzdCAmJiByZWwuc2hhcmVkSGlzdDsKICAgICAgICBpZiAoc2hhcmVkSGlzdE9ubHkgJiYgIXNoYXJlZCkgY29udGludWU7CiAgICAgICAgZihyZWwuZG9jLCBzaGFyZWQpOwogICAgICAgIHByb3BhZ2F0ZShyZWwuZG9jLCBkb2MsIHNoYXJlZCk7CiAgICAgIH0KICAgIH0KICAgIHByb3BhZ2F0ZShkb2MsIG51bGwsIHRydWUpOwogIH0KCiAgLy8gQXR0YWNoIGEgZG9jdW1lbnQgdG8gYW4gZWRpdG9yLgogIGZ1bmN0aW9uIGF0dGFjaERvYyhjbSwgZG9jKSB7CiAgICBpZiAoZG9jLmNtKSB0aHJvdyBuZXcgRXJyb3IoIlRoaXMgZG9jdW1lbnQgaXMgYWxyZWFkeSBpbiB1c2UuIik7CiAgICBjbS5kb2MgPSBkb2M7CiAgICBkb2MuY20gPSBjbTsKICAgIGVzdGltYXRlTGluZUhlaWdodHMoY20pOwogICAgbG9hZE1vZGUoY20pOwogICAgaWYgKCFjbS5vcHRpb25zLmxpbmVXcmFwcGluZykgZmluZE1heExpbmUoY20pOwogICAgY20ub3B0aW9ucy5tb2RlID0gZG9jLm1vZGVPcHRpb247CiAgICByZWdDaGFuZ2UoY20pOwogIH0KCiAgLy8gTElORSBVVElMSVRJRVMKCiAgLy8gRmluZCB0aGUgbGluZSBvYmplY3QgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gbGluZSBudW1iZXIuCiAgZnVuY3Rpb24gZ2V0TGluZShkb2MsIG4pIHsKICAgIG4gLT0gZG9jLmZpcnN0OwogICAgaWYgKG4gPCAwIHx8IG4gPj0gZG9jLnNpemUpIHRocm93IG5ldyBFcnJvcigiVGhlcmUgaXMgbm8gbGluZSAiICsgKG4gKyBkb2MuZmlyc3QpICsgIiBpbiB0aGUgZG9jdW1lbnQuIik7CiAgICBmb3IgKHZhciBjaHVuayA9IGRvYzsgIWNodW5rLmxpbmVzOykgewogICAgICBmb3IgKHZhciBpID0gMDs7ICsraSkgewogICAgICAgIHZhciBjaGlsZCA9IGNodW5rLmNoaWxkcmVuW2ldLCBzeiA9IGNoaWxkLmNodW5rU2l6ZSgpOwogICAgICAgIGlmIChuIDwgc3opIHsgY2h1bmsgPSBjaGlsZDsgYnJlYWs7IH0KICAgICAgICBuIC09IHN6OwogICAgICB9CiAgICB9CiAgICByZXR1cm4gY2h1bmsubGluZXNbbl07CiAgfQoKICAvLyBHZXQgdGhlIHBhcnQgb2YgYSBkb2N1bWVudCBiZXR3ZWVuIHR3byBwb3NpdGlvbnMsIGFzIGFuIGFycmF5IG9mCiAgLy8gc3RyaW5ncy4KICBmdW5jdGlvbiBnZXRCZXR3ZWVuKGRvYywgc3RhcnQsIGVuZCkgewogICAgdmFyIG91dCA9IFtdLCBuID0gc3RhcnQubGluZTsKICAgIGRvYy5pdGVyKHN0YXJ0LmxpbmUsIGVuZC5saW5lICsgMSwgZnVuY3Rpb24obGluZSkgewogICAgICB2YXIgdGV4dCA9IGxpbmUudGV4dDsKICAgICAgaWYgKG4gPT0gZW5kLmxpbmUpIHRleHQgPSB0ZXh0LnNsaWNlKDAsIGVuZC5jaCk7CiAgICAgIGlmIChuID09IHN0YXJ0LmxpbmUpIHRleHQgPSB0ZXh0LnNsaWNlKHN0YXJ0LmNoKTsKICAgICAgb3V0LnB1c2godGV4dCk7CiAgICAgICsrbjsKICAgIH0pOwogICAgcmV0dXJuIG91dDsKICB9CiAgLy8gR2V0IHRoZSBsaW5lcyBiZXR3ZWVuIGZyb20gYW5kIHRvLCBhcyBhcnJheSBvZiBzdHJpbmdzLgogIGZ1bmN0aW9uIGdldExpbmVzKGRvYywgZnJvbSwgdG8pIHsKICAgIHZhciBvdXQgPSBbXTsKICAgIGRvYy5pdGVyKGZyb20sIHRvLCBmdW5jdGlvbihsaW5lKSB7IG91dC5wdXNoKGxpbmUudGV4dCk7IH0pOwogICAgcmV0dXJuIG91dDsKICB9CgogIC8vIFVwZGF0ZSB0aGUgaGVpZ2h0IG9mIGEgbGluZSwgcHJvcGFnYXRpbmcgdGhlIGhlaWdodCBjaGFuZ2UKICAvLyB1cHdhcmRzIHRvIHBhcmVudCBub2Rlcy4KICBmdW5jdGlvbiB1cGRhdGVMaW5lSGVpZ2h0KGxpbmUsIGhlaWdodCkgewogICAgdmFyIGRpZmYgPSBoZWlnaHQgLSBsaW5lLmhlaWdodDsKICAgIGlmIChkaWZmKSBmb3IgKHZhciBuID0gbGluZTsgbjsgbiA9IG4ucGFyZW50KSBuLmhlaWdodCArPSBkaWZmOwogIH0KCiAgLy8gR2l2ZW4gYSBsaW5lIG9iamVjdCwgZmluZCBpdHMgbGluZSBudW1iZXIgYnkgd2Fsa2luZyB1cCB0aHJvdWdoCiAgLy8gaXRzIHBhcmVudCBsaW5rcy4KICBmdW5jdGlvbiBsaW5lTm8obGluZSkgewogICAgaWYgKGxpbmUucGFyZW50ID09IG51bGwpIHJldHVybiBudWxsOwogICAgdmFyIGN1ciA9IGxpbmUucGFyZW50LCBubyA9IGluZGV4T2YoY3VyLmxpbmVzLCBsaW5lKTsKICAgIGZvciAodmFyIGNodW5rID0gY3VyLnBhcmVudDsgY2h1bms7IGN1ciA9IGNodW5rLCBjaHVuayA9IGNodW5rLnBhcmVudCkgewogICAgICBmb3IgKHZhciBpID0gMDs7ICsraSkgewogICAgICAgIGlmIChjaHVuay5jaGlsZHJlbltpXSA9PSBjdXIpIGJyZWFrOwogICAgICAgIG5vICs9IGNodW5rLmNoaWxkcmVuW2ldLmNodW5rU2l6ZSgpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbm8gKyBjdXIuZmlyc3Q7CiAgfQoKICAvLyBGaW5kIHRoZSBsaW5lIGF0IHRoZSBnaXZlbiB2ZXJ0aWNhbCBwb3NpdGlvbiwgdXNpbmcgdGhlIGhlaWdodAogIC8vIGluZm9ybWF0aW9uIGluIHRoZSBkb2N1bWVudCB0cmVlLgogIGZ1bmN0aW9uIGxpbmVBdEhlaWdodChjaHVuaywgaCkgewogICAgdmFyIG4gPSBjaHVuay5maXJzdDsKICAgIG91dGVyOiBkbyB7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2h1bmsuY2hpbGRyZW4ubGVuZ3RoOyArK2kpIHsKICAgICAgICB2YXIgY2hpbGQgPSBjaHVuay5jaGlsZHJlbltpXSwgY2ggPSBjaGlsZC5oZWlnaHQ7CiAgICAgICAgaWYgKGggPCBjaCkgeyBjaHVuayA9IGNoaWxkOyBjb250aW51ZSBvdXRlcjsgfQogICAgICAgIGggLT0gY2g7CiAgICAgICAgbiArPSBjaGlsZC5jaHVua1NpemUoKTsKICAgICAgfQogICAgICByZXR1cm4gbjsKICAgIH0gd2hpbGUgKCFjaHVuay5saW5lcyk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNodW5rLmxpbmVzLmxlbmd0aDsgKytpKSB7CiAgICAgIHZhciBsaW5lID0gY2h1bmsubGluZXNbaV0sIGxoID0gbGluZS5oZWlnaHQ7CiAgICAgIGlmIChoIDwgbGgpIGJyZWFrOwogICAgICBoIC09IGxoOwogICAgfQogICAgcmV0dXJuIG4gKyBpOwogIH0KCgogIC8vIEZpbmQgdGhlIGhlaWdodCBhYm92ZSB0aGUgZ2l2ZW4gbGluZS4KICBmdW5jdGlvbiBoZWlnaHRBdExpbmUobGluZU9iaikgewogICAgbGluZU9iaiA9IHZpc3VhbExpbmUobGluZU9iaik7CgogICAgdmFyIGggPSAwLCBjaHVuayA9IGxpbmVPYmoucGFyZW50OwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaHVuay5saW5lcy5sZW5ndGg7ICsraSkgewogICAgICB2YXIgbGluZSA9IGNodW5rLmxpbmVzW2ldOwogICAgICBpZiAobGluZSA9PSBsaW5lT2JqKSBicmVhazsKICAgICAgZWxzZSBoICs9IGxpbmUuaGVpZ2h0OwogICAgfQogICAgZm9yICh2YXIgcCA9IGNodW5rLnBhcmVudDsgcDsgY2h1bmsgPSBwLCBwID0gY2h1bmsucGFyZW50KSB7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcC5jaGlsZHJlbi5sZW5ndGg7ICsraSkgewogICAgICAgIHZhciBjdXIgPSBwLmNoaWxkcmVuW2ldOwogICAgICAgIGlmIChjdXIgPT0gY2h1bmspIGJyZWFrOwogICAgICAgIGVsc2UgaCArPSBjdXIuaGVpZ2h0OwogICAgICB9CiAgICB9CiAgICByZXR1cm4gaDsKICB9CgogIC8vIEdldCB0aGUgYmlkaSBvcmRlcmluZyBmb3IgdGhlIGdpdmVuIGxpbmUgKGFuZCBjYWNoZSBpdCkuIFJldHVybnMKICAvLyBmYWxzZSBmb3IgbGluZXMgdGhhdCBhcmUgZnVsbHkgbGVmdC10by1yaWdodCwgYW5kIGFuIGFycmF5IG9mCiAgLy8gQmlkaVNwYW4gb2JqZWN0cyBvdGhlcndpc2UuCiAgZnVuY3Rpb24gZ2V0T3JkZXIobGluZSkgewogICAgdmFyIG9yZGVyID0gbGluZS5vcmRlcjsKICAgIGlmIChvcmRlciA9PSBudWxsKSBvcmRlciA9IGxpbmUub3JkZXIgPSBiaWRpT3JkZXJpbmcobGluZS50ZXh0KTsKICAgIHJldHVybiBvcmRlcjsKICB9CgogIC8vIEhJU1RPUlkKCiAgZnVuY3Rpb24gSGlzdG9yeShzdGFydEdlbikgewogICAgLy8gQXJyYXlzIG9mIGNoYW5nZSBldmVudHMgYW5kIHNlbGVjdGlvbnMuIERvaW5nIHNvbWV0aGluZyBhZGRzIGFuCiAgICAvLyBldmVudCB0byBkb25lIGFuZCBjbGVhcnMgdW5kby4gVW5kb2luZyBtb3ZlcyBldmVudHMgZnJvbSBkb25lCiAgICAvLyB0byB1bmRvbmUsIHJlZG9pbmcgbW92ZXMgdGhlbSBpbiB0aGUgb3RoZXIgZGlyZWN0aW9uLgogICAgdGhpcy5kb25lID0gW107IHRoaXMudW5kb25lID0gW107CiAgICB0aGlzLnVuZG9EZXB0aCA9IEluZmluaXR5OwogICAgLy8gVXNlZCB0byB0cmFjayB3aGVuIGNoYW5nZXMgY2FuIGJlIG1lcmdlZCBpbnRvIGEgc2luZ2xlIHVuZG8KICAgIC8vIGV2ZW50CiAgICB0aGlzLmxhc3RNb2RUaW1lID0gdGhpcy5sYXN0U2VsVGltZSA9IDA7CiAgICB0aGlzLmxhc3RPcCA9IG51bGw7CiAgICB0aGlzLmxhc3RPcmlnaW4gPSB0aGlzLmxhc3RTZWxPcmlnaW4gPSBudWxsOwogICAgLy8gVXNlZCBieSB0aGUgaXNDbGVhbigpIG1ldGhvZAogICAgdGhpcy5nZW5lcmF0aW9uID0gdGhpcy5tYXhHZW5lcmF0aW9uID0gc3RhcnRHZW4gfHwgMTsKICB9CgogIC8vIENyZWF0ZSBhIGhpc3RvcnkgY2hhbmdlIGV2ZW50IGZyb20gYW4gdXBkYXRlRG9jLXN0eWxlIGNoYW5nZQogIC8vIG9iamVjdC4KICBmdW5jdGlvbiBoaXN0b3J5Q2hhbmdlRnJvbUNoYW5nZShkb2MsIGNoYW5nZSkgewogICAgdmFyIGhpc3RDaGFuZ2UgPSB7ZnJvbTogY29weVBvcyhjaGFuZ2UuZnJvbSksIHRvOiBjaGFuZ2VFbmQoY2hhbmdlKSwgdGV4dDogZ2V0QmV0d2Vlbihkb2MsIGNoYW5nZS5mcm9tLCBjaGFuZ2UudG8pfTsKICAgIGF0dGFjaExvY2FsU3BhbnMoZG9jLCBoaXN0Q2hhbmdlLCBjaGFuZ2UuZnJvbS5saW5lLCBjaGFuZ2UudG8ubGluZSArIDEpOwogICAgbGlua2VkRG9jcyhkb2MsIGZ1bmN0aW9uKGRvYykge2F0dGFjaExvY2FsU3BhbnMoZG9jLCBoaXN0Q2hhbmdlLCBjaGFuZ2UuZnJvbS5saW5lLCBjaGFuZ2UudG8ubGluZSArIDEpO30sIHRydWUpOwogICAgcmV0dXJuIGhpc3RDaGFuZ2U7CiAgfQoKICAvLyBQb3AgYWxsIHNlbGVjdGlvbiBldmVudHMgb2ZmIHRoZSBlbmQgb2YgYSBoaXN0b3J5IGFycmF5LiBTdG9wIGF0CiAgLy8gYSBjaGFuZ2UgZXZlbnQuCiAgZnVuY3Rpb24gY2xlYXJTZWxlY3Rpb25FdmVudHMoYXJyYXkpIHsKICAgIHdoaWxlIChhcnJheS5sZW5ndGgpIHsKICAgICAgdmFyIGxhc3QgPSBsc3QoYXJyYXkpOwogICAgICBpZiAobGFzdC5yYW5nZXMpIGFycmF5LnBvcCgpOwogICAgICBlbHNlIGJyZWFrOwogICAgfQogIH0KCiAgLy8gRmluZCB0aGUgdG9wIGNoYW5nZSBldmVudCBpbiB0aGUgaGlzdG9yeS4gUG9wIG9mZiBzZWxlY3Rpb24KICAvLyBldmVudHMgdGhhdCBhcmUgaW4gdGhlIHdheS4KICBmdW5jdGlvbiBsYXN0Q2hhbmdlRXZlbnQoaGlzdCwgZm9yY2UpIHsKICAgIGlmIChmb3JjZSkgewogICAgICBjbGVhclNlbGVjdGlvbkV2ZW50cyhoaXN0LmRvbmUpOwogICAgICByZXR1cm4gbHN0KGhpc3QuZG9uZSk7CiAgICB9IGVsc2UgaWYgKGhpc3QuZG9uZS5sZW5ndGggJiYgIWxzdChoaXN0LmRvbmUpLnJhbmdlcykgewogICAgICByZXR1cm4gbHN0KGhpc3QuZG9uZSk7CiAgICB9IGVsc2UgaWYgKGhpc3QuZG9uZS5sZW5ndGggPiAxICYmICFoaXN0LmRvbmVbaGlzdC5kb25lLmxlbmd0aCAtIDJdLnJhbmdlcykgewogICAgICBoaXN0LmRvbmUucG9wKCk7CiAgICAgIHJldHVybiBsc3QoaGlzdC5kb25lKTsKICAgIH0KICB9CgogIC8vIFJlZ2lzdGVyIGEgY2hhbmdlIGluIHRoZSBoaXN0b3J5LiBNZXJnZXMgY2hhbmdlcyB0aGF0IGFyZSB3aXRoaW4KICAvLyBhIHNpbmdsZSBvcGVyYXRpb24sIG9yZSBhcmUgY2xvc2UgdG9nZXRoZXIgd2l0aCBhbiBvcmlnaW4gdGhhdAogIC8vIGFsbG93cyBtZXJnaW5nIChzdGFydGluZyB3aXRoICIrIikgaW50byBhIHNpbmdsZSBldmVudC4KICBmdW5jdGlvbiBhZGRDaGFuZ2VUb0hpc3RvcnkoZG9jLCBjaGFuZ2UsIHNlbEFmdGVyLCBvcElkKSB7CiAgICB2YXIgaGlzdCA9IGRvYy5oaXN0b3J5OwogICAgaGlzdC51bmRvbmUubGVuZ3RoID0gMDsKICAgIHZhciB0aW1lID0gK25ldyBEYXRlLCBjdXI7CgogICAgaWYgKChoaXN0Lmxhc3RPcCA9PSBvcElkIHx8CiAgICAgICAgIGhpc3QubGFzdE9yaWdpbiA9PSBjaGFuZ2Uub3JpZ2luICYmIGNoYW5nZS5vcmlnaW4gJiYKICAgICAgICAgKChjaGFuZ2Uub3JpZ2luLmNoYXJBdCgwKSA9PSAiKyIgJiYgZG9jLmNtICYmIGhpc3QubGFzdE1vZFRpbWUgPiB0aW1lIC0gZG9jLmNtLm9wdGlvbnMuaGlzdG9yeUV2ZW50RGVsYXkpIHx8CiAgICAgICAgICBjaGFuZ2Uub3JpZ2luLmNoYXJBdCgwKSA9PSAiKiIpKSAmJgogICAgICAgIChjdXIgPSBsYXN0Q2hhbmdlRXZlbnQoaGlzdCwgaGlzdC5sYXN0T3AgPT0gb3BJZCkpKSB7CiAgICAgIC8vIE1lcmdlIHRoaXMgY2hhbmdlIGludG8gdGhlIGxhc3QgZXZlbnQKICAgICAgdmFyIGxhc3QgPSBsc3QoY3VyLmNoYW5nZXMpOwogICAgICBpZiAoY21wKGNoYW5nZS5mcm9tLCBjaGFuZ2UudG8pID09IDAgJiYgY21wKGNoYW5nZS5mcm9tLCBsYXN0LnRvKSA9PSAwKSB7CiAgICAgICAgLy8gT3B0aW1pemVkIGNhc2UgZm9yIHNpbXBsZSBpbnNlcnRpb24gLS0gZG9uJ3Qgd2FudCB0byBhZGQKICAgICAgICAvLyBuZXcgY2hhbmdlc2V0cyBmb3IgZXZlcnkgY2hhcmFjdGVyIHR5cGVkCiAgICAgICAgbGFzdC50byA9IGNoYW5nZUVuZChjaGFuZ2UpOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIEFkZCBuZXcgc3ViLWV2ZW50CiAgICAgICAgY3VyLmNoYW5nZXMucHVzaChoaXN0b3J5Q2hhbmdlRnJvbUNoYW5nZShkb2MsIGNoYW5nZSkpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICAvLyBDYW4gbm90IGJlIG1lcmdlZCwgc3RhcnQgYSBuZXcgZXZlbnQuCiAgICAgIHZhciBiZWZvcmUgPSBsc3QoaGlzdC5kb25lKTsKICAgICAgaWYgKCFiZWZvcmUgfHwgIWJlZm9yZS5yYW5nZXMpCiAgICAgICAgcHVzaFNlbGVjdGlvblRvSGlzdG9yeShkb2Muc2VsLCBoaXN0LmRvbmUpOwogICAgICBjdXIgPSB7Y2hhbmdlczogW2hpc3RvcnlDaGFuZ2VGcm9tQ2hhbmdlKGRvYywgY2hhbmdlKV0sCiAgICAgICAgICAgICBnZW5lcmF0aW9uOiBoaXN0LmdlbmVyYXRpb259OwogICAgICBoaXN0LmRvbmUucHVzaChjdXIpOwogICAgICB3aGlsZSAoaGlzdC5kb25lLmxlbmd0aCA+IGhpc3QudW5kb0RlcHRoKSB7CiAgICAgICAgaGlzdC5kb25lLnNoaWZ0KCk7CiAgICAgICAgaWYgKCFoaXN0LmRvbmVbMF0ucmFuZ2VzKSBoaXN0LmRvbmUuc2hpZnQoKTsKICAgICAgfQogICAgfQogICAgaGlzdC5kb25lLnB1c2goc2VsQWZ0ZXIpOwogICAgaGlzdC5nZW5lcmF0aW9uID0gKytoaXN0Lm1heEdlbmVyYXRpb247CiAgICBoaXN0Lmxhc3RNb2RUaW1lID0gaGlzdC5sYXN0U2VsVGltZSA9IHRpbWU7CiAgICBoaXN0Lmxhc3RPcCA9IG9wSWQ7CiAgICBoaXN0Lmxhc3RPcmlnaW4gPSBoaXN0Lmxhc3RTZWxPcmlnaW4gPSBjaGFuZ2Uub3JpZ2luOwoKICAgIGlmICghbGFzdCkgc2lnbmFsKGRvYywgImhpc3RvcnlBZGRlZCIpOwogIH0KCiAgZnVuY3Rpb24gc2VsZWN0aW9uRXZlbnRDYW5CZU1lcmdlZChkb2MsIG9yaWdpbiwgcHJldiwgc2VsKSB7CiAgICB2YXIgY2ggPSBvcmlnaW4uY2hhckF0KDApOwogICAgcmV0dXJuIGNoID09ICIqIiB8fAogICAgICBjaCA9PSAiKyIgJiYKICAgICAgcHJldi5yYW5nZXMubGVuZ3RoID09IHNlbC5yYW5nZXMubGVuZ3RoICYmCiAgICAgIHByZXYuc29tZXRoaW5nU2VsZWN0ZWQoKSA9PSBzZWwuc29tZXRoaW5nU2VsZWN0ZWQoKSAmJgogICAgICBuZXcgRGF0ZSAtIGRvYy5oaXN0b3J5Lmxhc3RTZWxUaW1lIDw9IChkb2MuY20gPyBkb2MuY20ub3B0aW9ucy5oaXN0b3J5RXZlbnREZWxheSA6IDUwMCk7CiAgfQoKICAvLyBDYWxsZWQgd2hlbmV2ZXIgdGhlIHNlbGVjdGlvbiBjaGFuZ2VzLCBzZXRzIHRoZSBuZXcgc2VsZWN0aW9uIGFzCiAgLy8gdGhlIHBlbmRpbmcgc2VsZWN0aW9uIGluIHRoZSBoaXN0b3J5LCBhbmQgcHVzaGVzIHRoZSBvbGQgcGVuZGluZwogIC8vIHNlbGVjdGlvbiBpbnRvIHRoZSAnZG9uZScgYXJyYXkgd2hlbiBpdCB3YXMgc2lnbmlmaWNhbnRseQogIC8vIGRpZmZlcmVudCAoaW4gbnVtYmVyIG9mIHNlbGVjdGVkIHJhbmdlcywgZW1wdGluZXNzLCBvciB0aW1lKS4KICBmdW5jdGlvbiBhZGRTZWxlY3Rpb25Ub0hpc3RvcnkoZG9jLCBzZWwsIG9wSWQsIG9wdGlvbnMpIHsKICAgIHZhciBoaXN0ID0gZG9jLmhpc3RvcnksIG9yaWdpbiA9IG9wdGlvbnMgJiYgb3B0aW9ucy5vcmlnaW47CgogICAgLy8gQSBuZXcgZXZlbnQgaXMgc3RhcnRlZCB3aGVuIHRoZSBwcmV2aW91cyBvcmlnaW4gZG9lcyBub3QgbWF0Y2gKICAgIC8vIHRoZSBjdXJyZW50LCBvciB0aGUgb3JpZ2lucyBkb24ndCBhbGxvdyBtYXRjaGluZy4gT3JpZ2lucwogICAgLy8gc3RhcnRpbmcgd2l0aCAqIGFyZSBhbHdheXMgbWVyZ2VkLCB0aG9zZSBzdGFydGluZyB3aXRoICsgYXJlCiAgICAvLyBtZXJnZWQgd2hlbiBzaW1pbGFyIGFuZCBjbG9zZSB0b2dldGhlciBpbiB0aW1lLgogICAgaWYgKG9wSWQgPT0gaGlzdC5sYXN0T3AgfHwKICAgICAgICAob3JpZ2luICYmIGhpc3QubGFzdFNlbE9yaWdpbiA9PSBvcmlnaW4gJiYKICAgICAgICAgKGhpc3QubGFzdE1vZFRpbWUgPT0gaGlzdC5sYXN0U2VsVGltZSAmJiBoaXN0Lmxhc3RPcmlnaW4gPT0gb3JpZ2luIHx8CiAgICAgICAgICBzZWxlY3Rpb25FdmVudENhbkJlTWVyZ2VkKGRvYywgb3JpZ2luLCBsc3QoaGlzdC5kb25lKSwgc2VsKSkpKQogICAgICBoaXN0LmRvbmVbaGlzdC5kb25lLmxlbmd0aCAtIDFdID0gc2VsOwogICAgZWxzZQogICAgICBwdXNoU2VsZWN0aW9uVG9IaXN0b3J5KHNlbCwgaGlzdC5kb25lKTsKCiAgICBoaXN0Lmxhc3RTZWxUaW1lID0gK25ldyBEYXRlOwogICAgaGlzdC5sYXN0U2VsT3JpZ2luID0gb3JpZ2luOwogICAgaGlzdC5sYXN0T3AgPSBvcElkOwogICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5jbGVhclJlZG8gIT09IGZhbHNlKQogICAgICBjbGVhclNlbGVjdGlvbkV2ZW50cyhoaXN0LnVuZG9uZSk7CiAgfQoKICBmdW5jdGlvbiBwdXNoU2VsZWN0aW9uVG9IaXN0b3J5KHNlbCwgZGVzdCkgewogICAgdmFyIHRvcCA9IGxzdChkZXN0KTsKICAgIGlmICghKHRvcCAmJiB0b3AucmFuZ2VzICYmIHRvcC5lcXVhbHMoc2VsKSkpCiAgICAgIGRlc3QucHVzaChzZWwpOwogIH0KCiAgLy8gVXNlZCB0byBzdG9yZSBtYXJrZWQgc3BhbiBpbmZvcm1hdGlvbiBpbiB0aGUgaGlzdG9yeS4KICBmdW5jdGlvbiBhdHRhY2hMb2NhbFNwYW5zKGRvYywgY2hhbmdlLCBmcm9tLCB0bykgewogICAgdmFyIGV4aXN0aW5nID0gY2hhbmdlWyJzcGFuc18iICsgZG9jLmlkXSwgbiA9IDA7CiAgICBkb2MuaXRlcihNYXRoLm1heChkb2MuZmlyc3QsIGZyb20pLCBNYXRoLm1pbihkb2MuZmlyc3QgKyBkb2Muc2l6ZSwgdG8pLCBmdW5jdGlvbihsaW5lKSB7CiAgICAgIGlmIChsaW5lLm1hcmtlZFNwYW5zKQogICAgICAgIChleGlzdGluZyB8fCAoZXhpc3RpbmcgPSBjaGFuZ2VbInNwYW5zXyIgKyBkb2MuaWRdID0ge30pKVtuXSA9IGxpbmUubWFya2VkU3BhbnM7CiAgICAgICsrbjsKICAgIH0pOwogIH0KCiAgLy8gV2hlbiB1bi9yZS1kb2luZyByZXN0b3JlcyB0ZXh0IGNvbnRhaW5pbmcgbWFya2VkIHNwYW5zLCB0aG9zZQogIC8vIHRoYXQgaGF2ZSBiZWVuIGV4cGxpY2l0bHkgY2xlYXJlZCBzaG91bGQgbm90IGJlIHJlc3RvcmVkLgogIGZ1bmN0aW9uIHJlbW92ZUNsZWFyZWRTcGFucyhzcGFucykgewogICAgaWYgKCFzcGFucykgcmV0dXJuIG51bGw7CiAgICBmb3IgKHZhciBpID0gMCwgb3V0OyBpIDwgc3BhbnMubGVuZ3RoOyArK2kpIHsKICAgICAgaWYgKHNwYW5zW2ldLm1hcmtlci5leHBsaWNpdGx5Q2xlYXJlZCkgeyBpZiAoIW91dCkgb3V0ID0gc3BhbnMuc2xpY2UoMCwgaSk7IH0KICAgICAgZWxzZSBpZiAob3V0KSBvdXQucHVzaChzcGFuc1tpXSk7CiAgICB9CiAgICByZXR1cm4gIW91dCA/IHNwYW5zIDogb3V0Lmxlbmd0aCA/IG91dCA6IG51bGw7CiAgfQoKICAvLyBSZXRyaWV2ZSBhbmQgZmlsdGVyIHRoZSBvbGQgbWFya2VkIHNwYW5zIHN0b3JlZCBpbiBhIGNoYW5nZSBldmVudC4KICBmdW5jdGlvbiBnZXRPbGRTcGFucyhkb2MsIGNoYW5nZSkgewogICAgdmFyIGZvdW5kID0gY2hhbmdlWyJzcGFuc18iICsgZG9jLmlkXTsKICAgIGlmICghZm91bmQpIHJldHVybiBudWxsOwogICAgZm9yICh2YXIgaSA9IDAsIG53ID0gW107IGkgPCBjaGFuZ2UudGV4dC5sZW5ndGg7ICsraSkKICAgICAgbncucHVzaChyZW1vdmVDbGVhcmVkU3BhbnMoZm91bmRbaV0pKTsKICAgIHJldHVybiBudzsKICB9CgogIC8vIFVzZWQgYm90aCB0byBwcm92aWRlIGEgSlNPTi1zYWZlIG9iamVjdCBpbiAuZ2V0SGlzdG9yeSwgYW5kLCB3aGVuCiAgLy8gZGV0YWNoaW5nIGEgZG9jdW1lbnQsIHRvIHNwbGl0IHRoZSBoaXN0b3J5IGluIHR3bwogIGZ1bmN0aW9uIGNvcHlIaXN0b3J5QXJyYXkoZXZlbnRzLCBuZXdHcm91cCwgaW5zdGFudGlhdGVTZWwpIHsKICAgIGZvciAodmFyIGkgPSAwLCBjb3B5ID0gW107IGkgPCBldmVudHMubGVuZ3RoOyArK2kpIHsKICAgICAgdmFyIGV2ZW50ID0gZXZlbnRzW2ldOwogICAgICBpZiAoZXZlbnQucmFuZ2VzKSB7CiAgICAgICAgY29weS5wdXNoKGluc3RhbnRpYXRlU2VsID8gU2VsZWN0aW9uLnByb3RvdHlwZS5kZWVwQ29weS5jYWxsKGV2ZW50KSA6IGV2ZW50KTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICB2YXIgY2hhbmdlcyA9IGV2ZW50LmNoYW5nZXMsIG5ld0NoYW5nZXMgPSBbXTsKICAgICAgY29weS5wdXNoKHtjaGFuZ2VzOiBuZXdDaGFuZ2VzfSk7CiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgY2hhbmdlcy5sZW5ndGg7ICsraikgewogICAgICAgIHZhciBjaGFuZ2UgPSBjaGFuZ2VzW2pdLCBtOwogICAgICAgIG5ld0NoYW5nZXMucHVzaCh7ZnJvbTogY2hhbmdlLmZyb20sIHRvOiBjaGFuZ2UudG8sIHRleHQ6IGNoYW5nZS50ZXh0fSk7CiAgICAgICAgaWYgKG5ld0dyb3VwKSBmb3IgKHZhciBwcm9wIGluIGNoYW5nZSkgaWYgKG0gPSBwcm9wLm1hdGNoKC9ec3BhbnNfKFxkKykkLykpIHsKICAgICAgICAgIGlmIChpbmRleE9mKG5ld0dyb3VwLCBOdW1iZXIobVsxXSkpID4gLTEpIHsKICAgICAgICAgICAgbHN0KG5ld0NoYW5nZXMpW3Byb3BdID0gY2hhbmdlW3Byb3BdOwogICAgICAgICAgICBkZWxldGUgY2hhbmdlW3Byb3BdOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIGNvcHk7CiAgfQoKICAvLyBSZWJhc2luZy9yZXNldHRpbmcgaGlzdG9yeSB0byBkZWFsIHdpdGggZXh0ZXJuYWxseS1zb3VyY2VkIGNoYW5nZXMKCiAgZnVuY3Rpb24gcmViYXNlSGlzdFNlbFNpbmdsZShwb3MsIGZyb20sIHRvLCBkaWZmKSB7CiAgICBpZiAodG8gPCBwb3MubGluZSkgewogICAgICBwb3MubGluZSArPSBkaWZmOwogICAgfSBlbHNlIGlmIChmcm9tIDwgcG9zLmxpbmUpIHsKICAgICAgcG9zLmxpbmUgPSBmcm9tOwogICAgICBwb3MuY2ggPSAwOwogICAgfQogIH0KCiAgLy8gVHJpZXMgdG8gcmViYXNlIGFuIGFycmF5IG9mIGhpc3RvcnkgZXZlbnRzIGdpdmVuIGEgY2hhbmdlIGluIHRoZQogIC8vIGRvY3VtZW50LiBJZiB0aGUgY2hhbmdlIHRvdWNoZXMgdGhlIHNhbWUgbGluZXMgYXMgdGhlIGV2ZW50LCB0aGUKICAvLyBldmVudCwgYW5kIGV2ZXJ5dGhpbmcgJ2JlaGluZCcgaXQsIGlzIGRpc2NhcmRlZC4gSWYgdGhlIGNoYW5nZSBpcwogIC8vIGJlZm9yZSB0aGUgZXZlbnQsIHRoZSBldmVudCdzIHBvc2l0aW9ucyBhcmUgdXBkYXRlZC4gVXNlcyBhCiAgLy8gY29weS1vbi13cml0ZSBzY2hlbWUgZm9yIHRoZSBwb3NpdGlvbnMsIHRvIGF2b2lkIGhhdmluZyB0bwogIC8vIHJlYWxsb2NhdGUgdGhlbSBhbGwgb24gZXZlcnkgcmViYXNlLCBidXQgYWxzbyBhdm9pZCBwcm9ibGVtcyB3aXRoCiAgLy8gc2hhcmVkIHBvc2l0aW9uIG9iamVjdHMgYmVpbmcgdW5zYWZlbHkgdXBkYXRlZC4KICBmdW5jdGlvbiByZWJhc2VIaXN0QXJyYXkoYXJyYXksIGZyb20sIHRvLCBkaWZmKSB7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgKytpKSB7CiAgICAgIHZhciBzdWIgPSBhcnJheVtpXSwgb2sgPSB0cnVlOwogICAgICBpZiAoc3ViLnJhbmdlcykgewogICAgICAgIGlmICghc3ViLmNvcGllZCkgeyBzdWIgPSBhcnJheVtpXSA9IHN1Yi5kZWVwQ29weSgpOyBzdWIuY29waWVkID0gdHJ1ZTsgfQogICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgc3ViLnJhbmdlcy5sZW5ndGg7IGorKykgewogICAgICAgICAgcmViYXNlSGlzdFNlbFNpbmdsZShzdWIucmFuZ2VzW2pdLmFuY2hvciwgZnJvbSwgdG8sIGRpZmYpOwogICAgICAgICAgcmViYXNlSGlzdFNlbFNpbmdsZShzdWIucmFuZ2VzW2pdLmhlYWQsIGZyb20sIHRvLCBkaWZmKTsKICAgICAgICB9CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBzdWIuY2hhbmdlcy5sZW5ndGg7ICsraikgewogICAgICAgIHZhciBjdXIgPSBzdWIuY2hhbmdlc1tqXTsKICAgICAgICBpZiAodG8gPCBjdXIuZnJvbS5saW5lKSB7CiAgICAgICAgICBjdXIuZnJvbSA9IFBvcyhjdXIuZnJvbS5saW5lICsgZGlmZiwgY3VyLmZyb20uY2gpOwogICAgICAgICAgY3VyLnRvID0gUG9zKGN1ci50by5saW5lICsgZGlmZiwgY3VyLnRvLmNoKTsKICAgICAgICB9IGVsc2UgaWYgKGZyb20gPD0gY3VyLnRvLmxpbmUpIHsKICAgICAgICAgIG9rID0gZmFsc2U7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKCFvaykgewogICAgICAgIGFycmF5LnNwbGljZSgwLCBpICsgMSk7CiAgICAgICAgaSA9IDA7CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIHJlYmFzZUhpc3QoaGlzdCwgY2hhbmdlKSB7CiAgICB2YXIgZnJvbSA9IGNoYW5nZS5mcm9tLmxpbmUsIHRvID0gY2hhbmdlLnRvLmxpbmUsIGRpZmYgPSBjaGFuZ2UudGV4dC5sZW5ndGggLSAodG8gLSBmcm9tKSAtIDE7CiAgICByZWJhc2VIaXN0QXJyYXkoaGlzdC5kb25lLCBmcm9tLCB0bywgZGlmZik7CiAgICByZWJhc2VIaXN0QXJyYXkoaGlzdC51bmRvbmUsIGZyb20sIHRvLCBkaWZmKTsKICB9CgogIC8vIEVWRU5UIFVUSUxJVElFUwoKICAvLyBEdWUgdG8gdGhlIGZhY3QgdGhhdCB3ZSBzdGlsbCBzdXBwb3J0IGp1cmFzc2ljIElFIHZlcnNpb25zLCBzb21lCiAgLy8gY29tcGF0aWJpbGl0eSB3cmFwcGVycyBhcmUgbmVlZGVkLgoKICB2YXIgZV9wcmV2ZW50RGVmYXVsdCA9IENvZGVNaXJyb3IuZV9wcmV2ZW50RGVmYXVsdCA9IGZ1bmN0aW9uKGUpIHsKICAgIGlmIChlLnByZXZlbnREZWZhdWx0KSBlLnByZXZlbnREZWZhdWx0KCk7CiAgICBlbHNlIGUucmV0dXJuVmFsdWUgPSBmYWxzZTsKICB9OwogIHZhciBlX3N0b3BQcm9wYWdhdGlvbiA9IENvZGVNaXJyb3IuZV9zdG9wUHJvcGFnYXRpb24gPSBmdW5jdGlvbihlKSB7CiAgICBpZiAoZS5zdG9wUHJvcGFnYXRpb24pIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICBlbHNlIGUuY2FuY2VsQnViYmxlID0gdHJ1ZTsKICB9OwogIGZ1bmN0aW9uIGVfZGVmYXVsdFByZXZlbnRlZChlKSB7CiAgICByZXR1cm4gZS5kZWZhdWx0UHJldmVudGVkICE9IG51bGwgPyBlLmRlZmF1bHRQcmV2ZW50ZWQgOiBlLnJldHVyblZhbHVlID09IGZhbHNlOwogIH0KICB2YXIgZV9zdG9wID0gQ29kZU1pcnJvci5lX3N0b3AgPSBmdW5jdGlvbihlKSB7ZV9wcmV2ZW50RGVmYXVsdChlKTsgZV9zdG9wUHJvcGFnYXRpb24oZSk7fTsKCiAgZnVuY3Rpb24gZV90YXJnZXQoZSkge3JldHVybiBlLnRhcmdldCB8fCBlLnNyY0VsZW1lbnQ7fQogIGZ1bmN0aW9uIGVfYnV0dG9uKGUpIHsKICAgIHZhciBiID0gZS53aGljaDsKICAgIGlmIChiID09IG51bGwpIHsKICAgICAgaWYgKGUuYnV0dG9uICYgMSkgYiA9IDE7CiAgICAgIGVsc2UgaWYgKGUuYnV0dG9uICYgMikgYiA9IDM7CiAgICAgIGVsc2UgaWYgKGUuYnV0dG9uICYgNCkgYiA9IDI7CiAgICB9CiAgICBpZiAobWFjICYmIGUuY3RybEtleSAmJiBiID09IDEpIGIgPSAzOwogICAgcmV0dXJuIGI7CiAgfQoKICAvLyBFVkVOVCBIQU5ETElORwoKICAvLyBMaWdodHdlaWdodCBldmVudCBmcmFtZXdvcmsuIG9uL29mZiBhbHNvIHdvcmsgb24gRE9NIG5vZGVzLAogIC8vIHJlZ2lzdGVyaW5nIG5hdGl2ZSBET00gaGFuZGxlcnMuCgogIHZhciBvbiA9IENvZGVNaXJyb3Iub24gPSBmdW5jdGlvbihlbWl0dGVyLCB0eXBlLCBmKSB7CiAgICBpZiAoZW1pdHRlci5hZGRFdmVudExpc3RlbmVyKQogICAgICBlbWl0dGVyLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgZiwgZmFsc2UpOwogICAgZWxzZSBpZiAoZW1pdHRlci5hdHRhY2hFdmVudCkKICAgICAgZW1pdHRlci5hdHRhY2hFdmVudCgib24iICsgdHlwZSwgZik7CiAgICBlbHNlIHsKICAgICAgdmFyIG1hcCA9IGVtaXR0ZXIuX2hhbmRsZXJzIHx8IChlbWl0dGVyLl9oYW5kbGVycyA9IHt9KTsKICAgICAgdmFyIGFyciA9IG1hcFt0eXBlXSB8fCAobWFwW3R5cGVdID0gW10pOwogICAgICBhcnIucHVzaChmKTsKICAgIH0KICB9OwoKICB2YXIgb2ZmID0gQ29kZU1pcnJvci5vZmYgPSBmdW5jdGlvbihlbWl0dGVyLCB0eXBlLCBmKSB7CiAgICBpZiAoZW1pdHRlci5yZW1vdmVFdmVudExpc3RlbmVyKQogICAgICBlbWl0dGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgZiwgZmFsc2UpOwogICAgZWxzZSBpZiAoZW1pdHRlci5kZXRhY2hFdmVudCkKICAgICAgZW1pdHRlci5kZXRhY2hFdmVudCgib24iICsgdHlwZSwgZik7CiAgICBlbHNlIHsKICAgICAgdmFyIGFyciA9IGVtaXR0ZXIuX2hhbmRsZXJzICYmIGVtaXR0ZXIuX2hhbmRsZXJzW3R5cGVdOwogICAgICBpZiAoIWFycikgcmV0dXJuOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7ICsraSkKICAgICAgICBpZiAoYXJyW2ldID09IGYpIHsgYXJyLnNwbGljZShpLCAxKTsgYnJlYWs7IH0KICAgIH0KICB9OwoKICB2YXIgc2lnbmFsID0gQ29kZU1pcnJvci5zaWduYWwgPSBmdW5jdGlvbihlbWl0dGVyLCB0eXBlIC8qLCB2YWx1ZXMuLi4qLykgewogICAgdmFyIGFyciA9IGVtaXR0ZXIuX2hhbmRsZXJzICYmIGVtaXR0ZXIuX2hhbmRsZXJzW3R5cGVdOwogICAgaWYgKCFhcnIpIHJldHVybjsKICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAyKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgKytpKSBhcnJbaV0uYXBwbHkobnVsbCwgYXJncyk7CiAgfTsKCiAgdmFyIG9ycGhhbkRlbGF5ZWRDYWxsYmFja3MgPSBudWxsOwoKICAvLyBPZnRlbiwgd2Ugd2FudCB0byBzaWduYWwgZXZlbnRzIGF0IGEgcG9pbnQgd2hlcmUgd2UgYXJlIGluIHRoZQogIC8vIG1pZGRsZSBvZiBzb21lIHdvcmssIGJ1dCBkb24ndCB3YW50IHRoZSBoYW5kbGVyIHRvIHN0YXJ0IGNhbGxpbmcKICAvLyBvdGhlciBtZXRob2RzIG9uIHRoZSBlZGl0b3IsIHdoaWNoIG1pZ2h0IGJlIGluIGFuIGluY29uc2lzdGVudAogIC8vIHN0YXRlIG9yIHNpbXBseSBub3QgZXhwZWN0IGFueSBvdGhlciBldmVudHMgdG8gaGFwcGVuLgogIC8vIHNpZ25hbExhdGVyIGxvb2tzIHdoZXRoZXIgdGhlcmUgYXJlIGFueSBoYW5kbGVycywgYW5kIHNjaGVkdWxlcwogIC8vIHRoZW0gdG8gYmUgZXhlY3V0ZWQgd2hlbiB0aGUgbGFzdCBvcGVyYXRpb24gZW5kcywgb3IsIGlmIG5vCiAgLy8gb3BlcmF0aW9uIGlzIGFjdGl2ZSwgd2hlbiBhIHRpbWVvdXQgZmlyZXMuCiAgZnVuY3Rpb24gc2lnbmFsTGF0ZXIoZW1pdHRlciwgdHlwZSAvKiwgdmFsdWVzLi4uKi8pIHsKICAgIHZhciBhcnIgPSBlbWl0dGVyLl9oYW5kbGVycyAmJiBlbWl0dGVyLl9oYW5kbGVyc1t0eXBlXTsKICAgIGlmICghYXJyKSByZXR1cm47CiAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMiksIGxpc3Q7CiAgICBpZiAob3BlcmF0aW9uR3JvdXApIHsKICAgICAgbGlzdCA9IG9wZXJhdGlvbkdyb3VwLmRlbGF5ZWRDYWxsYmFja3M7CiAgICB9IGVsc2UgaWYgKG9ycGhhbkRlbGF5ZWRDYWxsYmFja3MpIHsKICAgICAgbGlzdCA9IG9ycGhhbkRlbGF5ZWRDYWxsYmFja3M7CiAgICB9IGVsc2UgewogICAgICBsaXN0ID0gb3JwaGFuRGVsYXllZENhbGxiYWNrcyA9IFtdOwogICAgICBzZXRUaW1lb3V0KGZpcmVPcnBoYW5EZWxheWVkLCAwKTsKICAgIH0KICAgIGZ1bmN0aW9uIGJuZChmKSB7cmV0dXJuIGZ1bmN0aW9uKCl7Zi5hcHBseShudWxsLCBhcmdzKTt9O307CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7ICsraSkKICAgICAgbGlzdC5wdXNoKGJuZChhcnJbaV0pKTsKICB9CgogIGZ1bmN0aW9uIGZpcmVPcnBoYW5EZWxheWVkKCkgewogICAgdmFyIGRlbGF5ZWQgPSBvcnBoYW5EZWxheWVkQ2FsbGJhY2tzOwogICAgb3JwaGFuRGVsYXllZENhbGxiYWNrcyA9IG51bGw7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRlbGF5ZWQubGVuZ3RoOyArK2kpIGRlbGF5ZWRbaV0oKTsKICB9CgogIC8vIFRoZSBET00gZXZlbnRzIHRoYXQgQ29kZU1pcnJvciBoYW5kbGVzIGNhbiBiZSBvdmVycmlkZGVuIGJ5CiAgLy8gcmVnaXN0ZXJpbmcgYSAobm9uLURPTSkgaGFuZGxlciBvbiB0aGUgZWRpdG9yIGZvciB0aGUgZXZlbnQgbmFtZSwKICAvLyBhbmQgcHJldmVudERlZmF1bHQtaW5nIHRoZSBldmVudCBpbiB0aGF0IGhhbmRsZXIuCiAgZnVuY3Rpb24gc2lnbmFsRE9NRXZlbnQoY20sIGUsIG92ZXJyaWRlKSB7CiAgICBzaWduYWwoY20sIG92ZXJyaWRlIHx8IGUudHlwZSwgY20sIGUpOwogICAgcmV0dXJuIGVfZGVmYXVsdFByZXZlbnRlZChlKSB8fCBlLmNvZGVtaXJyb3JJZ25vcmU7CiAgfQoKICBmdW5jdGlvbiBzaWduYWxDdXJzb3JBY3Rpdml0eShjbSkgewogICAgdmFyIGFyciA9IGNtLl9oYW5kbGVycyAmJiBjbS5faGFuZGxlcnMuY3Vyc29yQWN0aXZpdHk7CiAgICBpZiAoIWFycikgcmV0dXJuOwogICAgdmFyIHNldCA9IGNtLmN1ck9wLmN1cnNvckFjdGl2aXR5SGFuZGxlcnMgfHwgKGNtLmN1ck9wLmN1cnNvckFjdGl2aXR5SGFuZGxlcnMgPSBbXSk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7ICsraSkgaWYgKGluZGV4T2Yoc2V0LCBhcnJbaV0pID09IC0xKQogICAgICBzZXQucHVzaChhcnJbaV0pOwogIH0KCiAgZnVuY3Rpb24gaGFzSGFuZGxlcihlbWl0dGVyLCB0eXBlKSB7CiAgICB2YXIgYXJyID0gZW1pdHRlci5faGFuZGxlcnMgJiYgZW1pdHRlci5faGFuZGxlcnNbdHlwZV07CiAgICByZXR1cm4gYXJyICYmIGFyci5sZW5ndGggPiAwOwogIH0KCiAgLy8gQWRkIG9uIGFuZCBvZmYgbWV0aG9kcyB0byBhIGNvbnN0cnVjdG9yJ3MgcHJvdG90eXBlLCB0byBtYWtlCiAgLy8gcmVnaXN0ZXJpbmcgZXZlbnRzIG9uIHN1Y2ggb2JqZWN0cyBtb3JlIGNvbnZlbmllbnQuCiAgZnVuY3Rpb24gZXZlbnRNaXhpbihjdG9yKSB7CiAgICBjdG9yLnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uKHR5cGUsIGYpIHtvbih0aGlzLCB0eXBlLCBmKTt9OwogICAgY3Rvci5wcm90b3R5cGUub2ZmID0gZnVuY3Rpb24odHlwZSwgZikge29mZih0aGlzLCB0eXBlLCBmKTt9OwogIH0KCiAgLy8gTUlTQyBVVElMSVRJRVMKCiAgLy8gTnVtYmVyIG9mIHBpeGVscyBhZGRlZCB0byBzY3JvbGxlciBhbmQgc2l6ZXIgdG8gaGlkZSBzY3JvbGxiYXIKICB2YXIgc2Nyb2xsZXJDdXRPZmYgPSAzMDsKCiAgLy8gUmV0dXJuZWQgb3IgdGhyb3duIGJ5IHZhcmlvdXMgcHJvdG9jb2xzIHRvIHNpZ25hbCAnSSdtIG5vdAogIC8vIGhhbmRsaW5nIHRoaXMnLgogIHZhciBQYXNzID0gQ29kZU1pcnJvci5QYXNzID0ge3RvU3RyaW5nOiBmdW5jdGlvbigpe3JldHVybiAiQ29kZU1pcnJvci5QYXNzIjt9fTsKCiAgLy8gUmV1c2VkIG9wdGlvbiBvYmplY3RzIGZvciBzZXRTZWxlY3Rpb24gJiBmcmllbmRzCiAgdmFyIHNlbF9kb250U2Nyb2xsID0ge3Njcm9sbDogZmFsc2V9LCBzZWxfbW91c2UgPSB7b3JpZ2luOiAiKm1vdXNlIn0sIHNlbF9tb3ZlID0ge29yaWdpbjogIittb3ZlIn07CgogIGZ1bmN0aW9uIERlbGF5ZWQoKSB7dGhpcy5pZCA9IG51bGw7fQogIERlbGF5ZWQucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uKG1zLCBmKSB7CiAgICBjbGVhclRpbWVvdXQodGhpcy5pZCk7CiAgICB0aGlzLmlkID0gc2V0VGltZW91dChmLCBtcyk7CiAgfTsKCiAgLy8gQ291bnRzIHRoZSBjb2x1bW4gb2Zmc2V0IGluIGEgc3RyaW5nLCB0YWtpbmcgdGFicyBpbnRvIGFjY291bnQuCiAgLy8gVXNlZCBtb3N0bHkgdG8gZmluZCBpbmRlbnRhdGlvbi4KICB2YXIgY291bnRDb2x1bW4gPSBDb2RlTWlycm9yLmNvdW50Q29sdW1uID0gZnVuY3Rpb24oc3RyaW5nLCBlbmQsIHRhYlNpemUsIHN0YXJ0SW5kZXgsIHN0YXJ0VmFsdWUpIHsKICAgIGlmIChlbmQgPT0gbnVsbCkgewogICAgICBlbmQgPSBzdHJpbmcuc2VhcmNoKC9bXlxzXHUwMGEwXS8pOwogICAgICBpZiAoZW5kID09IC0xKSBlbmQgPSBzdHJpbmcubGVuZ3RoOwogICAgfQogICAgZm9yICh2YXIgaSA9IHN0YXJ0SW5kZXggfHwgMCwgbiA9IHN0YXJ0VmFsdWUgfHwgMDs7KSB7CiAgICAgIHZhciBuZXh0VGFiID0gc3RyaW5nLmluZGV4T2YoIlx0IiwgaSk7CiAgICAgIGlmIChuZXh0VGFiIDwgMCB8fCBuZXh0VGFiID49IGVuZCkKICAgICAgICByZXR1cm4gbiArIChlbmQgLSBpKTsKICAgICAgbiArPSBuZXh0VGFiIC0gaTsKICAgICAgbiArPSB0YWJTaXplIC0gKG4gJSB0YWJTaXplKTsKICAgICAgaSA9IG5leHRUYWIgKyAxOwogICAgfQogIH07CgogIC8vIFRoZSBpbnZlcnNlIG9mIGNvdW50Q29sdW1uIC0tIGZpbmQgdGhlIG9mZnNldCB0aGF0IGNvcnJlc3BvbmRzIHRvCiAgLy8gYSBwYXJ0aWN1bGFyIGNvbHVtbi4KICBmdW5jdGlvbiBmaW5kQ29sdW1uKHN0cmluZywgZ29hbCwgdGFiU2l6ZSkgewogICAgZm9yICh2YXIgcG9zID0gMCwgY29sID0gMDs7KSB7CiAgICAgIHZhciBuZXh0VGFiID0gc3RyaW5nLmluZGV4T2YoIlx0IiwgcG9zKTsKICAgICAgaWYgKG5leHRUYWIgPT0gLTEpIG5leHRUYWIgPSBzdHJpbmcubGVuZ3RoOwogICAgICB2YXIgc2tpcHBlZCA9IG5leHRUYWIgLSBwb3M7CiAgICAgIGlmIChuZXh0VGFiID09IHN0cmluZy5sZW5ndGggfHwgY29sICsgc2tpcHBlZCA+PSBnb2FsKQogICAgICAgIHJldHVybiBwb3MgKyBNYXRoLm1pbihza2lwcGVkLCBnb2FsIC0gY29sKTsKICAgICAgY29sICs9IG5leHRUYWIgLSBwb3M7CiAgICAgIGNvbCArPSB0YWJTaXplIC0gKGNvbCAlIHRhYlNpemUpOwogICAgICBwb3MgPSBuZXh0VGFiICsgMTsKICAgICAgaWYgKGNvbCA+PSBnb2FsKSByZXR1cm4gcG9zOwogICAgfQogIH0KCiAgdmFyIHNwYWNlU3RycyA9IFsiIl07CiAgZnVuY3Rpb24gc3BhY2VTdHIobikgewogICAgd2hpbGUgKHNwYWNlU3Rycy5sZW5ndGggPD0gbikKICAgICAgc3BhY2VTdHJzLnB1c2gobHN0KHNwYWNlU3RycykgKyAiICIpOwogICAgcmV0dXJuIHNwYWNlU3Ryc1tuXTsKICB9CgogIGZ1bmN0aW9uIGxzdChhcnIpIHsgcmV0dXJuIGFyclthcnIubGVuZ3RoLTFdOyB9CgogIHZhciBzZWxlY3RJbnB1dCA9IGZ1bmN0aW9uKG5vZGUpIHsgbm9kZS5zZWxlY3QoKTsgfTsKICBpZiAoaW9zKSAvLyBNb2JpbGUgU2FmYXJpIGFwcGFyZW50bHkgaGFzIGEgYnVnIHdoZXJlIHNlbGVjdCgpIGlzIGJyb2tlbi4KICAgIHNlbGVjdElucHV0ID0gZnVuY3Rpb24obm9kZSkgeyBub2RlLnNlbGVjdGlvblN0YXJ0ID0gMDsgbm9kZS5zZWxlY3Rpb25FbmQgPSBub2RlLnZhbHVlLmxlbmd0aDsgfTsKICBlbHNlIGlmIChpZSkgLy8gU3VwcHJlc3MgbXlzdGVyaW91cyBJRTEwIGVycm9ycwogICAgc2VsZWN0SW5wdXQgPSBmdW5jdGlvbihub2RlKSB7IHRyeSB7IG5vZGUuc2VsZWN0KCk7IH0gY2F0Y2goX2UpIHt9IH07CgogIGZ1bmN0aW9uIGluZGV4T2YoYXJyYXksIGVsdCkgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7ICsraSkKICAgICAgaWYgKGFycmF5W2ldID09IGVsdCkgcmV0dXJuIGk7CiAgICByZXR1cm4gLTE7CiAgfQogIGlmIChbXS5pbmRleE9mKSBpbmRleE9mID0gZnVuY3Rpb24oYXJyYXksIGVsdCkgeyByZXR1cm4gYXJyYXkuaW5kZXhPZihlbHQpOyB9OwogIGZ1bmN0aW9uIG1hcChhcnJheSwgZikgewogICAgdmFyIG91dCA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgb3V0W2ldID0gZihhcnJheVtpXSwgaSk7CiAgICByZXR1cm4gb3V0OwogIH0KICBpZiAoW10ubWFwKSBtYXAgPSBmdW5jdGlvbihhcnJheSwgZikgeyByZXR1cm4gYXJyYXkubWFwKGYpOyB9OwoKICBmdW5jdGlvbiBjcmVhdGVPYmooYmFzZSwgcHJvcHMpIHsKICAgIHZhciBpbnN0OwogICAgaWYgKE9iamVjdC5jcmVhdGUpIHsKICAgICAgaW5zdCA9IE9iamVjdC5jcmVhdGUoYmFzZSk7CiAgICB9IGVsc2UgewogICAgICB2YXIgY3RvciA9IGZ1bmN0aW9uKCkge307CiAgICAgIGN0b3IucHJvdG90eXBlID0gYmFzZTsKICAgICAgaW5zdCA9IG5ldyBjdG9yKCk7CiAgICB9CiAgICBpZiAocHJvcHMpIGNvcHlPYmoocHJvcHMsIGluc3QpOwogICAgcmV0dXJuIGluc3Q7CiAgfTsKCiAgZnVuY3Rpb24gY29weU9iaihvYmosIHRhcmdldCwgb3ZlcndyaXRlKSB7CiAgICBpZiAoIXRhcmdldCkgdGFyZ2V0ID0ge307CiAgICBmb3IgKHZhciBwcm9wIGluIG9iaikKICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShwcm9wKSAmJiAob3ZlcndyaXRlICE9PSBmYWxzZSB8fCAhdGFyZ2V0Lmhhc093blByb3BlcnR5KHByb3ApKSkKICAgICAgICB0YXJnZXRbcHJvcF0gPSBvYmpbcHJvcF07CiAgICByZXR1cm4gdGFyZ2V0OwogIH0KCiAgZnVuY3Rpb24gYmluZChmKSB7CiAgICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CiAgICByZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZi5hcHBseShudWxsLCBhcmdzKTt9OwogIH0KCiAgdmFyIG5vbkFTQ0lJU2luZ2xlQ2FzZVdvcmRDaGFyID0gL1tcdTAwZGZcdTMwNDAtXHUzMDlmXHUzMGEwLVx1MzBmZlx1MzQwMC1cdTRkYjVcdTRlMDAtXHU5ZmNjXHVhYzAwLVx1ZDdhZl0vOwogIHZhciBpc1dvcmRDaGFyQmFzaWMgPSBDb2RlTWlycm9yLmlzV29yZENoYXIgPSBmdW5jdGlvbihjaCkgewogICAgcmV0dXJuIC9cdy8udGVzdChjaCkgfHwgY2ggPiAiXHg4MCIgJiYKICAgICAgKGNoLnRvVXBwZXJDYXNlKCkgIT0gY2gudG9Mb3dlckNhc2UoKSB8fCBub25BU0NJSVNpbmdsZUNhc2VXb3JkQ2hhci50ZXN0KGNoKSk7CiAgfTsKICBmdW5jdGlvbiBpc1dvcmRDaGFyKGNoLCBoZWxwZXIpIHsKICAgIGlmICghaGVscGVyKSByZXR1cm4gaXNXb3JkQ2hhckJhc2ljKGNoKTsKICAgIGlmIChoZWxwZXIuc291cmNlLmluZGV4T2YoIlxcdyIpID4gLTEgJiYgaXNXb3JkQ2hhckJhc2ljKGNoKSkgcmV0dXJuIHRydWU7CiAgICByZXR1cm4gaGVscGVyLnRlc3QoY2gpOwogIH0KCiAgZnVuY3Rpb24gaXNFbXB0eShvYmopIHsKICAgIGZvciAodmFyIG4gaW4gb2JqKSBpZiAob2JqLmhhc093blByb3BlcnR5KG4pICYmIG9ialtuXSkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIHRydWU7CiAgfQoKICAvLyBFeHRlbmRpbmcgdW5pY29kZSBjaGFyYWN0ZXJzLiBBIHNlcmllcyBvZiBhIG5vbi1leHRlbmRpbmcgY2hhciArCiAgLy8gYW55IG51bWJlciBvZiBleHRlbmRpbmcgY2hhcnMgaXMgdHJlYXRlZCBhcyBhIHNpbmdsZSB1bml0IGFzIGZhcgogIC8vIGFzIGVkaXRpbmcgYW5kIG1lYXN1cmluZyBpcyBjb25jZXJuZWQuIFRoaXMgaXMgbm90IGZ1bGx5IGNvcnJlY3QsCiAgLy8gc2luY2Ugc29tZSBzY3JpcHRzL2ZvbnRzL2Jyb3dzZXJzIGFsc28gdHJlYXQgb3RoZXIgY29uZmlndXJhdGlvbnMKICAvLyBvZiBjb2RlIHBvaW50cyBhcyBhIGdyb3VwLgogIHZhciBleHRlbmRpbmdDaGFycyA9IC9bXHUwMzAwLVx1MDM2Zlx1MDQ4My1cdTA0ODlcdTA1OTEtXHUwNWJkXHUwNWJmXHUwNWMxXHUwNWMyXHUwNWM0XHUwNWM1XHUwNWM3XHUwNjEwLVx1MDYxYVx1MDY0Yi1cdTA2NWVcdTA2NzBcdTA2ZDYtXHUwNmRjXHUwNmRlLVx1MDZlNFx1MDZlN1x1MDZlOFx1MDZlYS1cdTA2ZWRcdTA3MTFcdTA3MzAtXHUwNzRhXHUwN2E2LVx1MDdiMFx1MDdlYi1cdTA3ZjNcdTA4MTYtXHUwODE5XHUwODFiLVx1MDgyM1x1MDgyNS1cdTA4MjdcdTA4MjktXHUwODJkXHUwOTAwLVx1MDkwMlx1MDkzY1x1MDk0MS1cdTA5NDhcdTA5NGRcdTA5NTEtXHUwOTU1XHUwOTYyXHUwOTYzXHUwOTgxXHUwOWJjXHUwOWJlXHUwOWMxLVx1MDljNFx1MDljZFx1MDlkN1x1MDllMlx1MDllM1x1MGEwMVx1MGEwMlx1MGEzY1x1MGE0MVx1MGE0Mlx1MGE0N1x1MGE0OFx1MGE0Yi1cdTBhNGRcdTBhNTFcdTBhNzBcdTBhNzFcdTBhNzVcdTBhODFcdTBhODJcdTBhYmNcdTBhYzEtXHUwYWM1XHUwYWM3XHUwYWM4XHUwYWNkXHUwYWUyXHUwYWUzXHUwYjAxXHUwYjNjXHUwYjNlXHUwYjNmXHUwYjQxLVx1MGI0NFx1MGI0ZFx1MGI1Nlx1MGI1N1x1MGI2Mlx1MGI2M1x1MGI4Mlx1MGJiZVx1MGJjMFx1MGJjZFx1MGJkN1x1MGMzZS1cdTBjNDBcdTBjNDYtXHUwYzQ4XHUwYzRhLVx1MGM0ZFx1MGM1NVx1MGM1Nlx1MGM2Mlx1MGM2M1x1MGNiY1x1MGNiZlx1MGNjMlx1MGNjNlx1MGNjY1x1MGNjZFx1MGNkNVx1MGNkNlx1MGNlMlx1MGNlM1x1MGQzZVx1MGQ0MS1cdTBkNDRcdTBkNGRcdTBkNTdcdTBkNjJcdTBkNjNcdTBkY2FcdTBkY2ZcdTBkZDItXHUwZGQ0XHUwZGQ2XHUwZGRmXHUwZTMxXHUwZTM0LVx1MGUzYVx1MGU0Ny1cdTBlNGVcdTBlYjFcdTBlYjQtXHUwZWI5XHUwZWJiXHUwZWJjXHUwZWM4LVx1MGVjZFx1MGYxOFx1MGYxOVx1MGYzNVx1MGYzN1x1MGYzOVx1MGY3MS1cdTBmN2VcdTBmODAtXHUwZjg0XHUwZjg2XHUwZjg3XHUwZjkwLVx1MGY5N1x1MGY5OS1cdTBmYmNcdTBmYzZcdTEwMmQtXHUxMDMwXHUxMDMyLVx1MTAzN1x1MTAzOVx1MTAzYVx1MTAzZFx1MTAzZVx1MTA1OFx1MTA1OVx1MTA1ZS1cdTEwNjBcdTEwNzEtXHUxMDc0XHUxMDgyXHUxMDg1XHUxMDg2XHUxMDhkXHUxMDlkXHUxMzVmXHUxNzEyLVx1MTcxNFx1MTczMi1cdTE3MzRcdTE3NTJcdTE3NTNcdTE3NzJcdTE3NzNcdTE3YjctXHUxN2JkXHUxN2M2XHUxN2M5LVx1MTdkM1x1MTdkZFx1MTgwYi1cdTE4MGRcdTE4YTlcdTE5MjAtXHUxOTIyXHUxOTI3XHUxOTI4XHUxOTMyXHUxOTM5LVx1MTkzYlx1MWExN1x1MWExOFx1MWE1Nlx1MWE1OC1cdTFhNWVcdTFhNjBcdTFhNjJcdTFhNjUtXHUxYTZjXHUxYTczLVx1MWE3Y1x1MWE3Zlx1MWIwMC1cdTFiMDNcdTFiMzRcdTFiMzYtXHUxYjNhXHUxYjNjXHUxYjQyXHUxYjZiLVx1MWI3M1x1MWI4MFx1MWI4MVx1MWJhMi1cdTFiYTVcdTFiYThcdTFiYTlcdTFjMmMtXHUxYzMzXHUxYzM2XHUxYzM3XHUxY2QwLVx1MWNkMlx1MWNkNC1cdTFjZTBcdTFjZTItXHUxY2U4XHUxY2VkXHUxZGMwLVx1MWRlNlx1MWRmZC1cdTFkZmZcdTIwMGNcdTIwMGRcdTIwZDAtXHUyMGYwXHUyY2VmLVx1MmNmMVx1MmRlMC1cdTJkZmZcdTMwMmEtXHUzMDJmXHUzMDk5XHUzMDlhXHVhNjZmLVx1YTY3Mlx1YTY3Y1x1YTY3ZFx1YTZmMFx1YTZmMVx1YTgwMlx1YTgwNlx1YTgwYlx1YTgyNVx1YTgyNlx1YThjNFx1YThlMC1cdWE4ZjFcdWE5MjYtXHVhOTJkXHVhOTQ3LVx1YTk1MVx1YTk4MC1cdWE5ODJcdWE5YjNcdWE5YjYtXHVhOWI5XHVhOWJjXHVhYTI5LVx1YWEyZVx1YWEzMVx1YWEzMlx1YWEzNVx1YWEzNlx1YWE0M1x1YWE0Y1x1YWFiMFx1YWFiMi1cdWFhYjRcdWFhYjdcdWFhYjhcdWFhYmVcdWFhYmZcdWFhYzFcdWFiZTVcdWFiZThcdWFiZWRcdWRjMDAtXHVkZmZmXHVmYjFlXHVmZTAwLVx1ZmUwZlx1ZmUyMC1cdWZlMjZcdWZmOWVcdWZmOWZdLzsKICBmdW5jdGlvbiBpc0V4dGVuZGluZ0NoYXIoY2gpIHsgcmV0dXJuIGNoLmNoYXJDb2RlQXQoMCkgPj0gNzY4ICYmIGV4dGVuZGluZ0NoYXJzLnRlc3QoY2gpOyB9CgogIC8vIERPTSBVVElMSVRJRVMKCiAgZnVuY3Rpb24gZWx0KHRhZywgY29udGVudCwgY2xhc3NOYW1lLCBzdHlsZSkgewogICAgdmFyIGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7CiAgICBpZiAoY2xhc3NOYW1lKSBlLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKICAgIGlmIChzdHlsZSkgZS5zdHlsZS5jc3NUZXh0ID0gc3R5bGU7CiAgICBpZiAodHlwZW9mIGNvbnRlbnQgPT0gInN0cmluZyIpIGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY29udGVudCkpOwogICAgZWxzZSBpZiAoY29udGVudCkgZm9yICh2YXIgaSA9IDA7IGkgPCBjb250ZW50Lmxlbmd0aDsgKytpKSBlLmFwcGVuZENoaWxkKGNvbnRlbnRbaV0pOwogICAgcmV0dXJuIGU7CiAgfQoKICB2YXIgcmFuZ2U7CiAgaWYgKGRvY3VtZW50LmNyZWF0ZVJhbmdlKSByYW5nZSA9IGZ1bmN0aW9uKG5vZGUsIHN0YXJ0LCBlbmQpIHsKICAgIHZhciByID0gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKTsKICAgIHIuc2V0RW5kKG5vZGUsIGVuZCk7CiAgICByLnNldFN0YXJ0KG5vZGUsIHN0YXJ0KTsKICAgIHJldHVybiByOwogIH07CiAgZWxzZSByYW5nZSA9IGZ1bmN0aW9uKG5vZGUsIHN0YXJ0LCBlbmQpIHsKICAgIHZhciByID0gZG9jdW1lbnQuYm9keS5jcmVhdGVUZXh0UmFuZ2UoKTsKICAgIHIubW92ZVRvRWxlbWVudFRleHQobm9kZS5wYXJlbnROb2RlKTsKICAgIHIuY29sbGFwc2UodHJ1ZSk7CiAgICByLm1vdmVFbmQoImNoYXJhY3RlciIsIGVuZCk7CiAgICByLm1vdmVTdGFydCgiY2hhcmFjdGVyIiwgc3RhcnQpOwogICAgcmV0dXJuIHI7CiAgfTsKCiAgZnVuY3Rpb24gcmVtb3ZlQ2hpbGRyZW4oZSkgewogICAgZm9yICh2YXIgY291bnQgPSBlLmNoaWxkTm9kZXMubGVuZ3RoOyBjb3VudCA+IDA7IC0tY291bnQpCiAgICAgIGUucmVtb3ZlQ2hpbGQoZS5maXJzdENoaWxkKTsKICAgIHJldHVybiBlOwogIH0KCiAgZnVuY3Rpb24gcmVtb3ZlQ2hpbGRyZW5BbmRBZGQocGFyZW50LCBlKSB7CiAgICByZXR1cm4gcmVtb3ZlQ2hpbGRyZW4ocGFyZW50KS5hcHBlbmRDaGlsZChlKTsKICB9CgogIGZ1bmN0aW9uIGNvbnRhaW5zKHBhcmVudCwgY2hpbGQpIHsKICAgIGlmIChwYXJlbnQuY29udGFpbnMpCiAgICAgIHJldHVybiBwYXJlbnQuY29udGFpbnMoY2hpbGQpOwogICAgd2hpbGUgKGNoaWxkID0gY2hpbGQucGFyZW50Tm9kZSkKICAgICAgaWYgKGNoaWxkID09IHBhcmVudCkgcmV0dXJuIHRydWU7CiAgfQoKICBmdW5jdGlvbiBhY3RpdmVFbHQoKSB7IHJldHVybiBkb2N1bWVudC5hY3RpdmVFbGVtZW50OyB9CiAgLy8gT2xkZXIgdmVyc2lvbnMgb2YgSUUgdGhyb3dzIHVuc3BlY2lmaWVkIGVycm9yIHdoZW4gdG91Y2hpbmcKICAvLyBkb2N1bWVudC5hY3RpdmVFbGVtZW50IGluIHNvbWUgY2FzZXMgKGR1cmluZyBsb2FkaW5nLCBpbiBpZnJhbWUpCiAgaWYgKGllICYmIGllX3ZlcnNpb24gPCAxMSkgYWN0aXZlRWx0ID0gZnVuY3Rpb24oKSB7CiAgICB0cnkgeyByZXR1cm4gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDsgfQogICAgY2F0Y2goZSkgeyByZXR1cm4gZG9jdW1lbnQuYm9keTsgfQogIH07CgogIGZ1bmN0aW9uIGNsYXNzVGVzdChjbHMpIHsgcmV0dXJuIG5ldyBSZWdFeHAoIlxcYiIgKyBjbHMgKyAiXFxiXFxzKiIpOyB9CiAgZnVuY3Rpb24gcm1DbGFzcyhub2RlLCBjbHMpIHsKICAgIHZhciB0ZXN0ID0gY2xhc3NUZXN0KGNscyk7CiAgICBpZiAodGVzdC50ZXN0KG5vZGUuY2xhc3NOYW1lKSkgbm9kZS5jbGFzc05hbWUgPSBub2RlLmNsYXNzTmFtZS5yZXBsYWNlKHRlc3QsICIiKTsKICB9CiAgZnVuY3Rpb24gYWRkQ2xhc3Mobm9kZSwgY2xzKSB7CiAgICBpZiAoIWNsYXNzVGVzdChjbHMpLnRlc3Qobm9kZS5jbGFzc05hbWUpKSBub2RlLmNsYXNzTmFtZSArPSAiICIgKyBjbHM7CiAgfQogIGZ1bmN0aW9uIGpvaW5DbGFzc2VzKGEsIGIpIHsKICAgIHZhciBhcyA9IGEuc3BsaXQoIiAiKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXMubGVuZ3RoOyBpKyspCiAgICAgIGlmIChhc1tpXSAmJiAhY2xhc3NUZXN0KGFzW2ldKS50ZXN0KGIpKSBiICs9ICIgIiArIGFzW2ldOwogICAgcmV0dXJuIGI7CiAgfQoKICAvLyBXSU5ET1ctV0lERSBFVkVOVFMKCiAgLy8gVGhlc2UgbXVzdCBiZSBoYW5kbGVkIGNhcmVmdWxseSwgYmVjYXVzZSBuYWl2ZWx5IHJlZ2lzdGVyaW5nIGEKICAvLyBoYW5kbGVyIGZvciBlYWNoIGVkaXRvciB3aWxsIGNhdXNlIHRoZSBlZGl0b3JzIHRvIG5ldmVyIGJlCiAgLy8gZ2FyYmFnZSBjb2xsZWN0ZWQuCgogIGZ1bmN0aW9uIGZvckVhY2hDb2RlTWlycm9yKGYpIHsKICAgIGlmICghZG9jdW1lbnQuYm9keS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKSByZXR1cm47CiAgICB2YXIgYnlDbGFzcyA9IGRvY3VtZW50LmJvZHkuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSgiQ29kZU1pcnJvciIpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBieUNsYXNzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBjbSA9IGJ5Q2xhc3NbaV0uQ29kZU1pcnJvcjsKICAgICAgaWYgKGNtKSBmKGNtKTsKICAgIH0KICB9CgogIHZhciBnbG9iYWxzUmVnaXN0ZXJlZCA9IGZhbHNlOwogIGZ1bmN0aW9uIGVuc3VyZUdsb2JhbEhhbmRsZXJzKCkgewogICAgaWYgKGdsb2JhbHNSZWdpc3RlcmVkKSByZXR1cm47CiAgICByZWdpc3Rlckdsb2JhbEhhbmRsZXJzKCk7CiAgICBnbG9iYWxzUmVnaXN0ZXJlZCA9IHRydWU7CiAgfQogIGZ1bmN0aW9uIHJlZ2lzdGVyR2xvYmFsSGFuZGxlcnMoKSB7CiAgICAvLyBXaGVuIHRoZSB3aW5kb3cgcmVzaXplcywgd2UgbmVlZCB0byByZWZyZXNoIGFjdGl2ZSBlZGl0b3JzLgogICAgdmFyIHJlc2l6ZVRpbWVyOwogICAgb24od2luZG93LCAicmVzaXplIiwgZnVuY3Rpb24oKSB7CiAgICAgIGlmIChyZXNpemVUaW1lciA9PSBudWxsKSByZXNpemVUaW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgcmVzaXplVGltZXIgPSBudWxsOwogICAgICAgIGtub3duU2Nyb2xsYmFyV2lkdGggPSBudWxsOwogICAgICAgIGZvckVhY2hDb2RlTWlycm9yKG9uUmVzaXplKTsKICAgICAgfSwgMTAwKTsKICAgIH0pOwogICAgLy8gV2hlbiB0aGUgd2luZG93IGxvc2VzIGZvY3VzLCB3ZSB3YW50IHRvIHNob3cgdGhlIGVkaXRvciBhcyBibHVycmVkCiAgICBvbih3aW5kb3csICJibHVyIiwgZnVuY3Rpb24oKSB7CiAgICAgIGZvckVhY2hDb2RlTWlycm9yKG9uQmx1cik7CiAgICB9KTsKICB9CgogIC8vIEZFQVRVUkUgREVURUNUSU9OCgogIC8vIERldGVjdCBkcmFnLWFuZC1kcm9wCiAgdmFyIGRyYWdBbmREcm9wID0gZnVuY3Rpb24oKSB7CiAgICAvLyBUaGVyZSBpcyAqc29tZSoga2luZCBvZiBkcmFnLWFuZC1kcm9wIHN1cHBvcnQgaW4gSUU2LTgsIGJ1dCBJCiAgICAvLyBjb3VsZG4ndCBnZXQgaXQgdG8gd29yayB5ZXQuCiAgICBpZiAoaWUgJiYgaWVfdmVyc2lvbiA8IDkpIHJldHVybiBmYWxzZTsKICAgIHZhciBkaXYgPSBlbHQoJ2RpdicpOwogICAgcmV0dXJuICJkcmFnZ2FibGUiIGluIGRpdiB8fCAiZHJhZ0Ryb3AiIGluIGRpdjsKICB9KCk7CgogIHZhciBrbm93blNjcm9sbGJhcldpZHRoOwogIGZ1bmN0aW9uIHNjcm9sbGJhcldpZHRoKG1lYXN1cmUpIHsKICAgIGlmIChrbm93blNjcm9sbGJhcldpZHRoICE9IG51bGwpIHJldHVybiBrbm93blNjcm9sbGJhcldpZHRoOwogICAgdmFyIHRlc3QgPSBlbHQoImRpdiIsIG51bGwsIG51bGwsICJ3aWR0aDogNTBweDsgaGVpZ2h0OiA1MHB4OyBvdmVyZmxvdy14OiBzY3JvbGwiKTsKICAgIHJlbW92ZUNoaWxkcmVuQW5kQWRkKG1lYXN1cmUsIHRlc3QpOwogICAgaWYgKHRlc3Qub2Zmc2V0V2lkdGgpCiAgICAgIGtub3duU2Nyb2xsYmFyV2lkdGggPSB0ZXN0Lm9mZnNldEhlaWdodCAtIHRlc3QuY2xpZW50SGVpZ2h0OwogICAgcmV0dXJuIGtub3duU2Nyb2xsYmFyV2lkdGggfHwgMDsKICB9CgogIHZhciB6d3NwU3VwcG9ydGVkOwogIGZ1bmN0aW9uIHplcm9XaWR0aEVsZW1lbnQobWVhc3VyZSkgewogICAgaWYgKHp3c3BTdXBwb3J0ZWQgPT0gbnVsbCkgewogICAgICB2YXIgdGVzdCA9IGVsdCgic3BhbiIsICJcdTIwMGIiKTsKICAgICAgcmVtb3ZlQ2hpbGRyZW5BbmRBZGQobWVhc3VyZSwgZWx0KCJzcGFuIiwgW3Rlc3QsIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCJ4IildKSk7CiAgICAgIGlmIChtZWFzdXJlLmZpcnN0Q2hpbGQub2Zmc2V0SGVpZ2h0ICE9IDApCiAgICAgICAgendzcFN1cHBvcnRlZCA9IHRlc3Qub2Zmc2V0V2lkdGggPD0gMSAmJiB0ZXN0Lm9mZnNldEhlaWdodCA+IDIgJiYgIShpZSAmJiBpZV92ZXJzaW9uIDwgOCk7CiAgICB9CiAgICBpZiAoendzcFN1cHBvcnRlZCkgcmV0dXJuIGVsdCgic3BhbiIsICJcdTIwMGIiKTsKICAgIGVsc2UgcmV0dXJuIGVsdCgic3BhbiIsICJcdTAwYTAiLCBudWxsLCAiZGlzcGxheTogaW5saW5lLWJsb2NrOyB3aWR0aDogMXB4OyBtYXJnaW4tcmlnaHQ6IC0xcHgiKTsKICB9CgogIC8vIEZlYXR1cmUtZGV0ZWN0IElFJ3MgY3J1bW15IGNsaWVudCByZWN0IHJlcG9ydGluZyBmb3IgYmlkaSB0ZXh0CiAgdmFyIGJhZEJpZGlSZWN0czsKICBmdW5jdGlvbiBoYXNCYWRCaWRpUmVjdHMobWVhc3VyZSkgewogICAgaWYgKGJhZEJpZGlSZWN0cyAhPSBudWxsKSByZXR1cm4gYmFkQmlkaVJlY3RzOwogICAgdmFyIHR4dCA9IHJlbW92ZUNoaWxkcmVuQW5kQWRkKG1lYXN1cmUsIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCJBXHUwNjJlQSIpKTsKICAgIHZhciByMCA9IHJhbmdlKHR4dCwgMCwgMSkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICBpZiAocjAubGVmdCA9PSByMC5yaWdodCkgcmV0dXJuIGZhbHNlOwogICAgdmFyIHIxID0gcmFuZ2UodHh0LCAxLCAyKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgIHJldHVybiBiYWRCaWRpUmVjdHMgPSAocjEucmlnaHQgLSByMC5yaWdodCA8IDMpOwogIH0KCiAgLy8gU2VlIGlmICIiLnNwbGl0IGlzIHRoZSBicm9rZW4gSUUgdmVyc2lvbiwgaWYgc28sIHByb3ZpZGUgYW4KICAvLyBhbHRlcm5hdGl2ZSB3YXkgdG8gc3BsaXQgbGluZXMuCiAgdmFyIHNwbGl0TGluZXMgPSBDb2RlTWlycm9yLnNwbGl0TGluZXMgPSAiXG5cbmIiLnNwbGl0KC9cbi8pLmxlbmd0aCAhPSAzID8gZnVuY3Rpb24oc3RyaW5nKSB7CiAgICB2YXIgcG9zID0gMCwgcmVzdWx0ID0gW10sIGwgPSBzdHJpbmcubGVuZ3RoOwogICAgd2hpbGUgKHBvcyA8PSBsKSB7CiAgICAgIHZhciBubCA9IHN0cmluZy5pbmRleE9mKCJcbiIsIHBvcyk7CiAgICAgIGlmIChubCA9PSAtMSkgbmwgPSBzdHJpbmcubGVuZ3RoOwogICAgICB2YXIgbGluZSA9IHN0cmluZy5zbGljZShwb3MsIHN0cmluZy5jaGFyQXQobmwgLSAxKSA9PSAiXHIiID8gbmwgLSAxIDogbmwpOwogICAgICB2YXIgcnQgPSBsaW5lLmluZGV4T2YoIlxyIik7CiAgICAgIGlmIChydCAhPSAtMSkgewogICAgICAgIHJlc3VsdC5wdXNoKGxpbmUuc2xpY2UoMCwgcnQpKTsKICAgICAgICBwb3MgKz0gcnQgKyAxOwogICAgICB9IGVsc2UgewogICAgICAgIHJlc3VsdC5wdXNoKGxpbmUpOwogICAgICAgIHBvcyA9IG5sICsgMTsKICAgICAgfQogICAgfQogICAgcmV0dXJuIHJlc3VsdDsKICB9IDogZnVuY3Rpb24oc3RyaW5nKXtyZXR1cm4gc3RyaW5nLnNwbGl0KC9cclxuP3xcbi8pO307CgogIHZhciBoYXNTZWxlY3Rpb24gPSB3aW5kb3cuZ2V0U2VsZWN0aW9uID8gZnVuY3Rpb24odGUpIHsKICAgIHRyeSB7IHJldHVybiB0ZS5zZWxlY3Rpb25TdGFydCAhPSB0ZS5zZWxlY3Rpb25FbmQ7IH0KICAgIGNhdGNoKGUpIHsgcmV0dXJuIGZhbHNlOyB9CiAgfSA6IGZ1bmN0aW9uKHRlKSB7CiAgICB0cnkge3ZhciByYW5nZSA9IHRlLm93bmVyRG9jdW1lbnQuc2VsZWN0aW9uLmNyZWF0ZVJhbmdlKCk7fQogICAgY2F0Y2goZSkge30KICAgIGlmICghcmFuZ2UgfHwgcmFuZ2UucGFyZW50RWxlbWVudCgpICE9IHRlKSByZXR1cm4gZmFsc2U7CiAgICByZXR1cm4gcmFuZ2UuY29tcGFyZUVuZFBvaW50cygiU3RhcnRUb0VuZCIsIHJhbmdlKSAhPSAwOwogIH07CgogIHZhciBoYXNDb3B5RXZlbnQgPSAoZnVuY3Rpb24oKSB7CiAgICB2YXIgZSA9IGVsdCgiZGl2Iik7CiAgICBpZiAoIm9uY29weSIgaW4gZSkgcmV0dXJuIHRydWU7CiAgICBlLnNldEF0dHJpYnV0ZSgib25jb3B5IiwgInJldHVybjsiKTsKICAgIHJldHVybiB0eXBlb2YgZS5vbmNvcHkgPT0gImZ1bmN0aW9uIjsKICB9KSgpOwoKICB2YXIgYmFkWm9vbWVkUmVjdHMgPSBudWxsOwogIGZ1bmN0aW9uIGhhc0JhZFpvb21lZFJlY3RzKG1lYXN1cmUpIHsKICAgIGlmIChiYWRab29tZWRSZWN0cyAhPSBudWxsKSByZXR1cm4gYmFkWm9vbWVkUmVjdHM7CiAgICB2YXIgbm9kZSA9IHJlbW92ZUNoaWxkcmVuQW5kQWRkKG1lYXN1cmUsIGVsdCgic3BhbiIsICJ4IikpOwogICAgdmFyIG5vcm1hbCA9IG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICB2YXIgZnJvbVJhbmdlID0gcmFuZ2Uobm9kZSwgMCwgMSkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICByZXR1cm4gYmFkWm9vbWVkUmVjdHMgPSBNYXRoLmFicyhub3JtYWwubGVmdCAtIGZyb21SYW5nZS5sZWZ0KSA+IDE7CiAgfQoKICAvLyBLRVkgTkFNRVMKCiAgdmFyIGtleU5hbWVzID0gezM6ICJFbnRlciIsIDg6ICJCYWNrc3BhY2UiLCA5OiAiVGFiIiwgMTM6ICJFbnRlciIsIDE2OiAiU2hpZnQiLCAxNzogIkN0cmwiLCAxODogIkFsdCIsCiAgICAgICAgICAgICAgICAgIDE5OiAiUGF1c2UiLCAyMDogIkNhcHNMb2NrIiwgMjc6ICJFc2MiLCAzMjogIlNwYWNlIiwgMzM6ICJQYWdlVXAiLCAzNDogIlBhZ2VEb3duIiwgMzU6ICJFbmQiLAogICAgICAgICAgICAgICAgICAzNjogIkhvbWUiLCAzNzogIkxlZnQiLCAzODogIlVwIiwgMzk6ICJSaWdodCIsIDQwOiAiRG93biIsIDQ0OiAiUHJpbnRTY3JuIiwgNDU6ICJJbnNlcnQiLAogICAgICAgICAgICAgICAgICA0NjogIkRlbGV0ZSIsIDU5OiAiOyIsIDYxOiAiPSIsIDkxOiAiTW9kIiwgOTI6ICJNb2QiLCA5MzogIk1vZCIsIDEwNzogIj0iLCAxMDk6ICItIiwgMTI3OiAiRGVsZXRlIiwKICAgICAgICAgICAgICAgICAgMTczOiAiLSIsIDE4NjogIjsiLCAxODc6ICI9IiwgMTg4OiAiLCIsIDE4OTogIi0iLCAxOTA6ICIuIiwgMTkxOiAiLyIsIDE5MjogImAiLCAyMTk6ICJbIiwgMjIwOiAiXFwiLAogICAgICAgICAgICAgICAgICAyMjE6ICJdIiwgMjIyOiAiJyIsIDYzMjMyOiAiVXAiLCA2MzIzMzogIkRvd24iLCA2MzIzNDogIkxlZnQiLCA2MzIzNTogIlJpZ2h0IiwgNjMyNzI6ICJEZWxldGUiLAogICAgICAgICAgICAgICAgICA2MzI3MzogIkhvbWUiLCA2MzI3NTogIkVuZCIsIDYzMjc2OiAiUGFnZVVwIiwgNjMyNzc6ICJQYWdlRG93biIsIDYzMzAyOiAiSW5zZXJ0In07CiAgQ29kZU1pcnJvci5rZXlOYW1lcyA9IGtleU5hbWVzOwogIChmdW5jdGlvbigpIHsKICAgIC8vIE51bWJlciBrZXlzCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDEwOyBpKyspIGtleU5hbWVzW2kgKyA0OF0gPSBrZXlOYW1lc1tpICsgOTZdID0gU3RyaW5nKGkpOwogICAgLy8gQWxwaGFiZXRpYyBrZXlzCiAgICBmb3IgKHZhciBpID0gNjU7IGkgPD0gOTA7IGkrKykga2V5TmFtZXNbaV0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGkpOwogICAgLy8gRnVuY3Rpb24ga2V5cwogICAgZm9yICh2YXIgaSA9IDE7IGkgPD0gMTI7IGkrKykga2V5TmFtZXNbaSArIDExMV0gPSBrZXlOYW1lc1tpICsgNjMyMzVdID0gIkYiICsgaTsKICB9KSgpOwoKICAvLyBCSURJIEhFTFBFUlMKCiAgZnVuY3Rpb24gaXRlcmF0ZUJpZGlTZWN0aW9ucyhvcmRlciwgZnJvbSwgdG8sIGYpIHsKICAgIGlmICghb3JkZXIpIHJldHVybiBmKGZyb20sIHRvLCAibHRyIik7CiAgICB2YXIgZm91bmQgPSBmYWxzZTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb3JkZXIubGVuZ3RoOyArK2kpIHsKICAgICAgdmFyIHBhcnQgPSBvcmRlcltpXTsKICAgICAgaWYgKHBhcnQuZnJvbSA8IHRvICYmIHBhcnQudG8gPiBmcm9tIHx8IGZyb20gPT0gdG8gJiYgcGFydC50byA9PSBmcm9tKSB7CiAgICAgICAgZihNYXRoLm1heChwYXJ0LmZyb20sIGZyb20pLCBNYXRoLm1pbihwYXJ0LnRvLCB0byksIHBhcnQubGV2ZWwgPT0gMSA/ICJydGwiIDogImx0ciIpOwogICAgICAgIGZvdW5kID0gdHJ1ZTsKICAgICAgfQogICAgfQogICAgaWYgKCFmb3VuZCkgZihmcm9tLCB0bywgImx0ciIpOwogIH0KCiAgZnVuY3Rpb24gYmlkaUxlZnQocGFydCkgeyByZXR1cm4gcGFydC5sZXZlbCAlIDIgPyBwYXJ0LnRvIDogcGFydC5mcm9tOyB9CiAgZnVuY3Rpb24gYmlkaVJpZ2h0KHBhcnQpIHsgcmV0dXJuIHBhcnQubGV2ZWwgJSAyID8gcGFydC5mcm9tIDogcGFydC50bzsgfQoKICBmdW5jdGlvbiBsaW5lTGVmdChsaW5lKSB7IHZhciBvcmRlciA9IGdldE9yZGVyKGxpbmUpOyByZXR1cm4gb3JkZXIgPyBiaWRpTGVmdChvcmRlclswXSkgOiAwOyB9CiAgZnVuY3Rpb24gbGluZVJpZ2h0KGxpbmUpIHsKICAgIHZhciBvcmRlciA9IGdldE9yZGVyKGxpbmUpOwogICAgaWYgKCFvcmRlcikgcmV0dXJuIGxpbmUudGV4dC5sZW5ndGg7CiAgICByZXR1cm4gYmlkaVJpZ2h0KGxzdChvcmRlcikpOwogIH0KCiAgZnVuY3Rpb24gbGluZVN0YXJ0KGNtLCBsaW5lTikgewogICAgdmFyIGxpbmUgPSBnZXRMaW5lKGNtLmRvYywgbGluZU4pOwogICAgdmFyIHZpc3VhbCA9IHZpc3VhbExpbmUobGluZSk7CiAgICBpZiAodmlzdWFsICE9IGxpbmUpIGxpbmVOID0gbGluZU5vKHZpc3VhbCk7CiAgICB2YXIgb3JkZXIgPSBnZXRPcmRlcih2aXN1YWwpOwogICAgdmFyIGNoID0gIW9yZGVyID8gMCA6IG9yZGVyWzBdLmxldmVsICUgMiA/IGxpbmVSaWdodCh2aXN1YWwpIDogbGluZUxlZnQodmlzdWFsKTsKICAgIHJldHVybiBQb3MobGluZU4sIGNoKTsKICB9CiAgZnVuY3Rpb24gbGluZUVuZChjbSwgbGluZU4pIHsKICAgIHZhciBtZXJnZWQsIGxpbmUgPSBnZXRMaW5lKGNtLmRvYywgbGluZU4pOwogICAgd2hpbGUgKG1lcmdlZCA9IGNvbGxhcHNlZFNwYW5BdEVuZChsaW5lKSkgewogICAgICBsaW5lID0gbWVyZ2VkLmZpbmQoMSwgdHJ1ZSkubGluZTsKICAgICAgbGluZU4gPSBudWxsOwogICAgfQogICAgdmFyIG9yZGVyID0gZ2V0T3JkZXIobGluZSk7CiAgICB2YXIgY2ggPSAhb3JkZXIgPyBsaW5lLnRleHQubGVuZ3RoIDogb3JkZXJbMF0ubGV2ZWwgJSAyID8gbGluZUxlZnQobGluZSkgOiBsaW5lUmlnaHQobGluZSk7CiAgICByZXR1cm4gUG9zKGxpbmVOID09IG51bGwgPyBsaW5lTm8obGluZSkgOiBsaW5lTiwgY2gpOwogIH0KCiAgZnVuY3Rpb24gY29tcGFyZUJpZGlMZXZlbChvcmRlciwgYSwgYikgewogICAgdmFyIGxpbmVkaXIgPSBvcmRlclswXS5sZXZlbDsKICAgIGlmIChhID09IGxpbmVkaXIpIHJldHVybiB0cnVlOwogICAgaWYgKGIgPT0gbGluZWRpcikgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIGEgPCBiOwogIH0KICB2YXIgYmlkaU90aGVyOwogIGZ1bmN0aW9uIGdldEJpZGlQYXJ0QXQob3JkZXIsIHBvcykgewogICAgYmlkaU90aGVyID0gbnVsbDsKICAgIGZvciAodmFyIGkgPSAwLCBmb3VuZDsgaSA8IG9yZGVyLmxlbmd0aDsgKytpKSB7CiAgICAgIHZhciBjdXIgPSBvcmRlcltpXTsKICAgICAgaWYgKGN1ci5mcm9tIDwgcG9zICYmIGN1ci50byA+IHBvcykgcmV0dXJuIGk7CiAgICAgIGlmICgoY3VyLmZyb20gPT0gcG9zIHx8IGN1ci50byA9PSBwb3MpKSB7CiAgICAgICAgaWYgKGZvdW5kID09IG51bGwpIHsKICAgICAgICAgIGZvdW5kID0gaTsKICAgICAgICB9IGVsc2UgaWYgKGNvbXBhcmVCaWRpTGV2ZWwob3JkZXIsIGN1ci5sZXZlbCwgb3JkZXJbZm91bmRdLmxldmVsKSkgewogICAgICAgICAgaWYgKGN1ci5mcm9tICE9IGN1ci50bykgYmlkaU90aGVyID0gZm91bmQ7CiAgICAgICAgICByZXR1cm4gaTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKGN1ci5mcm9tICE9IGN1ci50bykgYmlkaU90aGVyID0gaTsKICAgICAgICAgIHJldHVybiBmb3VuZDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmb3VuZDsKICB9CgogIGZ1bmN0aW9uIG1vdmVJbkxpbmUobGluZSwgcG9zLCBkaXIsIGJ5VW5pdCkgewogICAgaWYgKCFieVVuaXQpIHJldHVybiBwb3MgKyBkaXI7CiAgICBkbyBwb3MgKz0gZGlyOwogICAgd2hpbGUgKHBvcyA+IDAgJiYgaXNFeHRlbmRpbmdDaGFyKGxpbmUudGV4dC5jaGFyQXQocG9zKSkpOwogICAgcmV0dXJuIHBvczsKICB9CgogIC8vIFRoaXMgaXMgbmVlZGVkIGluIG9yZGVyIHRvIG1vdmUgJ3Zpc3VhbGx5JyB0aHJvdWdoIGJpLWRpcmVjdGlvbmFsCiAgLy8gdGV4dCAtLSBpLmUuLCBwcmVzc2luZyBsZWZ0IHNob3VsZCBtYWtlIHRoZSBjdXJzb3IgZ28gbGVmdCwgZXZlbgogIC8vIHdoZW4gaW4gUlRMIHRleHQuIFRoZSB0cmlja3kgcGFydCBpcyB0aGUgJ2p1bXBzJywgd2hlcmUgUlRMIGFuZAogIC8vIExUUiB0ZXh0IHRvdWNoIGVhY2ggb3RoZXIuIFRoaXMgb2Z0ZW4gcmVxdWlyZXMgdGhlIGN1cnNvciBvZmZzZXQKICAvLyB0byBtb3ZlIG1vcmUgdGhhbiBvbmUgdW5pdCwgaW4gb3JkZXIgdG8gdmlzdWFsbHkgbW92ZSBvbmUgdW5pdC4KICBmdW5jdGlvbiBtb3ZlVmlzdWFsbHkobGluZSwgc3RhcnQsIGRpciwgYnlVbml0KSB7CiAgICB2YXIgYmlkaSA9IGdldE9yZGVyKGxpbmUpOwogICAgaWYgKCFiaWRpKSByZXR1cm4gbW92ZUxvZ2ljYWxseShsaW5lLCBzdGFydCwgZGlyLCBieVVuaXQpOwogICAgdmFyIHBvcyA9IGdldEJpZGlQYXJ0QXQoYmlkaSwgc3RhcnQpLCBwYXJ0ID0gYmlkaVtwb3NdOwogICAgdmFyIHRhcmdldCA9IG1vdmVJbkxpbmUobGluZSwgc3RhcnQsIHBhcnQubGV2ZWwgJSAyID8gLWRpciA6IGRpciwgYnlVbml0KTsKCiAgICBmb3IgKDs7KSB7CiAgICAgIGlmICh0YXJnZXQgPiBwYXJ0LmZyb20gJiYgdGFyZ2V0IDwgcGFydC50bykgcmV0dXJuIHRhcmdldDsKICAgICAgaWYgKHRhcmdldCA9PSBwYXJ0LmZyb20gfHwgdGFyZ2V0ID09IHBhcnQudG8pIHsKICAgICAgICBpZiAoZ2V0QmlkaVBhcnRBdChiaWRpLCB0YXJnZXQpID09IHBvcykgcmV0dXJuIHRhcmdldDsKICAgICAgICBwYXJ0ID0gYmlkaVtwb3MgKz0gZGlyXTsKICAgICAgICByZXR1cm4gKGRpciA+IDApID09IHBhcnQubGV2ZWwgJSAyID8gcGFydC50byA6IHBhcnQuZnJvbTsKICAgICAgfSBlbHNlIHsKICAgICAgICBwYXJ0ID0gYmlkaVtwb3MgKz0gZGlyXTsKICAgICAgICBpZiAoIXBhcnQpIHJldHVybiBudWxsOwogICAgICAgIGlmICgoZGlyID4gMCkgPT0gcGFydC5sZXZlbCAlIDIpCiAgICAgICAgICB0YXJnZXQgPSBtb3ZlSW5MaW5lKGxpbmUsIHBhcnQudG8sIC0xLCBieVVuaXQpOwogICAgICAgIGVsc2UKICAgICAgICAgIHRhcmdldCA9IG1vdmVJbkxpbmUobGluZSwgcGFydC5mcm9tLCAxLCBieVVuaXQpOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBtb3ZlTG9naWNhbGx5KGxpbmUsIHN0YXJ0LCBkaXIsIGJ5VW5pdCkgewogICAgdmFyIHRhcmdldCA9IHN0YXJ0ICsgZGlyOwogICAgaWYgKGJ5VW5pdCkgd2hpbGUgKHRhcmdldCA+IDAgJiYgaXNFeHRlbmRpbmdDaGFyKGxpbmUudGV4dC5jaGFyQXQodGFyZ2V0KSkpIHRhcmdldCArPSBkaXI7CiAgICByZXR1cm4gdGFyZ2V0IDwgMCB8fCB0YXJnZXQgPiBsaW5lLnRleHQubGVuZ3RoID8gbnVsbCA6IHRhcmdldDsKICB9CgogIC8vIEJpZGlyZWN0aW9uYWwgb3JkZXJpbmcgYWxnb3JpdGhtCiAgLy8gU2VlIGh0dHA6Ly91bmljb2RlLm9yZy9yZXBvcnRzL3RyOS90cjktMTMuaHRtbCBmb3IgdGhlIGFsZ29yaXRobQogIC8vIHRoYXQgdGhpcyAocGFydGlhbGx5KSBpbXBsZW1lbnRzLgoKICAvLyBPbmUtY2hhciBjb2RlcyB1c2VkIGZvciBjaGFyYWN0ZXIgdHlwZXM6CiAgLy8gTCAoTCk6ICAgTGVmdC10by1SaWdodAogIC8vIFIgKFIpOiAgIFJpZ2h0LXRvLUxlZnQKICAvLyByIChBTCk6ICBSaWdodC10by1MZWZ0IEFyYWJpYwogIC8vIDEgKEVOKTogIEV1cm9wZWFuIE51bWJlcgogIC8vICsgKEVTKTogIEV1cm9wZWFuIE51bWJlciBTZXBhcmF0b3IKICAvLyAlIChFVCk6ICBFdXJvcGVhbiBOdW1iZXIgVGVybWluYXRvcgogIC8vIG4gKEFOKTogIEFyYWJpYyBOdW1iZXIKICAvLyAsIChDUyk6ICBDb21tb24gTnVtYmVyIFNlcGFyYXRvcgogIC8vIG0gKE5TTSk6IE5vbi1TcGFjaW5nIE1hcmsKICAvLyBiIChCTik6ICBCb3VuZGFyeSBOZXV0cmFsCiAgLy8gcyAoQik6ICAgUGFyYWdyYXBoIFNlcGFyYXRvcgogIC8vIHQgKFMpOiAgIFNlZ21lbnQgU2VwYXJhdG9yCiAgLy8gdyAoV1MpOiAgV2hpdGVzcGFjZQogIC8vIE4gKE9OKTogIE90aGVyIE5ldXRyYWxzCgogIC8vIFJldHVybnMgbnVsbCBpZiBjaGFyYWN0ZXJzIGFyZSBvcmRlcmVkIGFzIHRoZXkgYXBwZWFyCiAgLy8gKGxlZnQtdG8tcmlnaHQpLCBvciBhbiBhcnJheSBvZiBzZWN0aW9ucyAoe2Zyb20sIHRvLCBsZXZlbH0KICAvLyBvYmplY3RzKSBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBvY2N1ciB2aXN1YWxseS4KICB2YXIgYmlkaU9yZGVyaW5nID0gKGZ1bmN0aW9uKCkgewogICAgLy8gQ2hhcmFjdGVyIHR5cGVzIGZvciBjb2RlcG9pbnRzIDAgdG8gMHhmZgogICAgdmFyIGxvd1R5cGVzID0gImJiYmJiYmJiYnRzdHdzYmJiYmJiYmJiYmJiYmJzc3N0d05OJSUlTk5OTk5OLE4sTjExMTExMTExMTFOTk5OTk5OTExMTExMTExMTExMTExMTExMTExMTExMTExOTk5OTk5MTExMTExMTExMTExMTExMTExMTExMTExMTE5OTk5iYmJiYmJzYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmIsTiUlJSVOTk5OTE5OTk5OJSUxMU5MTk5OMUxOTk5OTkxMTExMTExMTExMTExMTExMTExMTExMTkxMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExOIjsKICAgIC8vIENoYXJhY3RlciB0eXBlcyBmb3IgY29kZXBvaW50cyAweDYwMCB0byAweDZmZgogICAgdmFyIGFyYWJpY1R5cGVzID0gInJycnJycnJycnJycixyTk5tbW1tbW1ycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycm1tbW1tbW1tbW1tbW1tcnJycnJycm5ubm5ubm5ubm4lbm5ycnJtcnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJtbW1tbW1tbW1tbW1tbW1tbW1tTm1tbW0iOwogICAgZnVuY3Rpb24gY2hhclR5cGUoY29kZSkgewogICAgICBpZiAoY29kZSA8PSAweGY3KSByZXR1cm4gbG93VHlwZXMuY2hhckF0KGNvZGUpOwogICAgICBlbHNlIGlmICgweDU5MCA8PSBjb2RlICYmIGNvZGUgPD0gMHg1ZjQpIHJldHVybiAiUiI7CiAgICAgIGVsc2UgaWYgKDB4NjAwIDw9IGNvZGUgJiYgY29kZSA8PSAweDZlZCkgcmV0dXJuIGFyYWJpY1R5cGVzLmNoYXJBdChjb2RlIC0gMHg2MDApOwogICAgICBlbHNlIGlmICgweDZlZSA8PSBjb2RlICYmIGNvZGUgPD0gMHg4YWMpIHJldHVybiAiciI7CiAgICAgIGVsc2UgaWYgKDB4MjAwMCA8PSBjb2RlICYmIGNvZGUgPD0gMHgyMDBiKSByZXR1cm4gInciOwogICAgICBlbHNlIGlmIChjb2RlID09IDB4MjAwYykgcmV0dXJuICJiIjsKICAgICAgZWxzZSByZXR1cm4gIkwiOwogICAgfQoKICAgIHZhciBiaWRpUkUgPSAvW1x1MDU5MC1cdTA1ZjRcdTA2MDAtXHUwNmZmXHUwNzAwLVx1MDhhY10vOwogICAgdmFyIGlzTmV1dHJhbCA9IC9bc3R3Tl0vLCBpc1N0cm9uZyA9IC9bTFJyXS8sIGNvdW50c0FzTGVmdCA9IC9bTGIxbl0vLCBjb3VudHNBc051bSA9IC9bMW5dLzsKICAgIC8vIEJyb3dzZXJzIHNlZW0gdG8gYWx3YXlzIHRyZWF0IHRoZSBib3VuZGFyaWVzIG9mIGJsb2NrIGVsZW1lbnRzIGFzIGJlaW5nIEwuCiAgICB2YXIgb3V0ZXJUeXBlID0gIkwiOwoKICAgIGZ1bmN0aW9uIEJpZGlTcGFuKGxldmVsLCBmcm9tLCB0bykgewogICAgICB0aGlzLmxldmVsID0gbGV2ZWw7CiAgICAgIHRoaXMuZnJvbSA9IGZyb207IHRoaXMudG8gPSB0bzsKICAgIH0KCiAgICByZXR1cm4gZnVuY3Rpb24oc3RyKSB7CiAgICAgIGlmICghYmlkaVJFLnRlc3Qoc3RyKSkgcmV0dXJuIGZhbHNlOwogICAgICB2YXIgbGVuID0gc3RyLmxlbmd0aCwgdHlwZXMgPSBbXTsKICAgICAgZm9yICh2YXIgaSA9IDAsIHR5cGU7IGkgPCBsZW47ICsraSkKICAgICAgICB0eXBlcy5wdXNoKHR5cGUgPSBjaGFyVHlwZShzdHIuY2hhckNvZGVBdChpKSkpOwoKICAgICAgLy8gVzEuIEV4YW1pbmUgZWFjaCBub24tc3BhY2luZyBtYXJrIChOU00pIGluIHRoZSBsZXZlbCBydW4sIGFuZAogICAgICAvLyBjaGFuZ2UgdGhlIHR5cGUgb2YgdGhlIE5TTSB0byB0aGUgdHlwZSBvZiB0aGUgcHJldmlvdXMKICAgICAgLy8gY2hhcmFjdGVyLiBJZiB0aGUgTlNNIGlzIGF0IHRoZSBzdGFydCBvZiB0aGUgbGV2ZWwgcnVuLCBpdCB3aWxsCiAgICAgIC8vIGdldCB0aGUgdHlwZSBvZiBzb3IuCiAgICAgIGZvciAodmFyIGkgPSAwLCBwcmV2ID0gb3V0ZXJUeXBlOyBpIDwgbGVuOyArK2kpIHsKICAgICAgICB2YXIgdHlwZSA9IHR5cGVzW2ldOwogICAgICAgIGlmICh0eXBlID09ICJtIikgdHlwZXNbaV0gPSBwcmV2OwogICAgICAgIGVsc2UgcHJldiA9IHR5cGU7CiAgICAgIH0KCiAgICAgIC8vIFcyLiBTZWFyY2ggYmFja3dhcmRzIGZyb20gZWFjaCBpbnN0YW5jZSBvZiBhIEV1cm9wZWFuIG51bWJlcgogICAgICAvLyB1bnRpbCB0aGUgZmlyc3Qgc3Ryb25nIHR5cGUgKFIsIEwsIEFMLCBvciBzb3IpIGlzIGZvdW5kLiBJZiBhbgogICAgICAvLyBBTCBpcyBmb3VuZCwgY2hhbmdlIHRoZSB0eXBlIG9mIHRoZSBFdXJvcGVhbiBudW1iZXIgdG8gQXJhYmljCiAgICAgIC8vIG51bWJlci4KICAgICAgLy8gVzMuIENoYW5nZSBhbGwgQUxzIHRvIFIuCiAgICAgIGZvciAodmFyIGkgPSAwLCBjdXIgPSBvdXRlclR5cGU7IGkgPCBsZW47ICsraSkgewogICAgICAgIHZhciB0eXBlID0gdHlwZXNbaV07CiAgICAgICAgaWYgKHR5cGUgPT0gIjEiICYmIGN1ciA9PSAiciIpIHR5cGVzW2ldID0gIm4iOwogICAgICAgIGVsc2UgaWYgKGlzU3Ryb25nLnRlc3QodHlwZSkpIHsgY3VyID0gdHlwZTsgaWYgKHR5cGUgPT0gInIiKSB0eXBlc1tpXSA9ICJSIjsgfQogICAgICB9CgogICAgICAvLyBXNC4gQSBzaW5nbGUgRXVyb3BlYW4gc2VwYXJhdG9yIGJldHdlZW4gdHdvIEV1cm9wZWFuIG51bWJlcnMKICAgICAgLy8gY2hhbmdlcyB0byBhIEV1cm9wZWFuIG51bWJlci4gQSBzaW5nbGUgY29tbW9uIHNlcGFyYXRvciBiZXR3ZWVuCiAgICAgIC8vIHR3byBudW1iZXJzIG9mIHRoZSBzYW1lIHR5cGUgY2hhbmdlcyB0byB0aGF0IHR5cGUuCiAgICAgIGZvciAodmFyIGkgPSAxLCBwcmV2ID0gdHlwZXNbMF07IGkgPCBsZW4gLSAxOyArK2kpIHsKICAgICAgICB2YXIgdHlwZSA9IHR5cGVzW2ldOwogICAgICAgIGlmICh0eXBlID09ICIrIiAmJiBwcmV2ID09ICIxIiAmJiB0eXBlc1tpKzFdID09ICIxIikgdHlwZXNbaV0gPSAiMSI7CiAgICAgICAgZWxzZSBpZiAodHlwZSA9PSAiLCIgJiYgcHJldiA9PSB0eXBlc1tpKzFdICYmCiAgICAgICAgICAgICAgICAgKHByZXYgPT0gIjEiIHx8IHByZXYgPT0gIm4iKSkgdHlwZXNbaV0gPSBwcmV2OwogICAgICAgIHByZXYgPSB0eXBlOwogICAgICB9CgogICAgICAvLyBXNS4gQSBzZXF1ZW5jZSBvZiBFdXJvcGVhbiB0ZXJtaW5hdG9ycyBhZGphY2VudCB0byBFdXJvcGVhbgogICAgICAvLyBudW1iZXJzIGNoYW5nZXMgdG8gYWxsIEV1cm9wZWFuIG51bWJlcnMuCiAgICAgIC8vIFc2LiBPdGhlcndpc2UsIHNlcGFyYXRvcnMgYW5kIHRlcm1pbmF0b3JzIGNoYW5nZSB0byBPdGhlcgogICAgICAvLyBOZXV0cmFsLgogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7CiAgICAgICAgdmFyIHR5cGUgPSB0eXBlc1tpXTsKICAgICAgICBpZiAodHlwZSA9PSAiLCIpIHR5cGVzW2ldID0gIk4iOwogICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gIiUiKSB7CiAgICAgICAgICBmb3IgKHZhciBlbmQgPSBpICsgMTsgZW5kIDwgbGVuICYmIHR5cGVzW2VuZF0gPT0gIiUiOyArK2VuZCkge30KICAgICAgICAgIHZhciByZXBsYWNlID0gKGkgJiYgdHlwZXNbaS0xXSA9PSAiISIpIHx8IChlbmQgPCBsZW4gJiYgdHlwZXNbZW5kXSA9PSAiMSIpID8gIjEiIDogIk4iOwogICAgICAgICAgZm9yICh2YXIgaiA9IGk7IGogPCBlbmQ7ICsraikgdHlwZXNbal0gPSByZXBsYWNlOwogICAgICAgICAgaSA9IGVuZCAtIDE7CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyBXNy4gU2VhcmNoIGJhY2t3YXJkcyBmcm9tIGVhY2ggaW5zdGFuY2Ugb2YgYSBFdXJvcGVhbiBudW1iZXIKICAgICAgLy8gdW50aWwgdGhlIGZpcnN0IHN0cm9uZyB0eXBlIChSLCBMLCBvciBzb3IpIGlzIGZvdW5kLiBJZiBhbiBMIGlzCiAgICAgIC8vIGZvdW5kLCB0aGVuIGNoYW5nZSB0aGUgdHlwZSBvZiB0aGUgRXVyb3BlYW4gbnVtYmVyIHRvIEwuCiAgICAgIGZvciAodmFyIGkgPSAwLCBjdXIgPSBvdXRlclR5cGU7IGkgPCBsZW47ICsraSkgewogICAgICAgIHZhciB0eXBlID0gdHlwZXNbaV07CiAgICAgICAgaWYgKGN1ciA9PSAiTCIgJiYgdHlwZSA9PSAiMSIpIHR5cGVzW2ldID0gIkwiOwogICAgICAgIGVsc2UgaWYgKGlzU3Ryb25nLnRlc3QodHlwZSkpIGN1ciA9IHR5cGU7CiAgICAgIH0KCiAgICAgIC8vIE4xLiBBIHNlcXVlbmNlIG9mIG5ldXRyYWxzIHRha2VzIHRoZSBkaXJlY3Rpb24gb2YgdGhlCiAgICAgIC8vIHN1cnJvdW5kaW5nIHN0cm9uZyB0ZXh0IGlmIHRoZSB0ZXh0IG9uIGJvdGggc2lkZXMgaGFzIHRoZSBzYW1lCiAgICAgIC8vIGRpcmVjdGlvbi4gRXVyb3BlYW4gYW5kIEFyYWJpYyBudW1iZXJzIGFjdCBhcyBpZiB0aGV5IHdlcmUgUiBpbgogICAgICAvLyB0ZXJtcyBvZiB0aGVpciBpbmZsdWVuY2Ugb24gbmV1dHJhbHMuIFN0YXJ0LW9mLWxldmVsLXJ1biAoc29yKQogICAgICAvLyBhbmQgZW5kLW9mLWxldmVsLXJ1biAoZW9yKSBhcmUgdXNlZCBhdCBsZXZlbCBydW4gYm91bmRhcmllcy4KICAgICAgLy8gTjIuIEFueSByZW1haW5pbmcgbmV1dHJhbHMgdGFrZSB0aGUgZW1iZWRkaW5nIGRpcmVjdGlvbi4KICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkgewogICAgICAgIGlmIChpc05ldXRyYWwudGVzdCh0eXBlc1tpXSkpIHsKICAgICAgICAgIGZvciAodmFyIGVuZCA9IGkgKyAxOyBlbmQgPCBsZW4gJiYgaXNOZXV0cmFsLnRlc3QodHlwZXNbZW5kXSk7ICsrZW5kKSB7fQogICAgICAgICAgdmFyIGJlZm9yZSA9IChpID8gdHlwZXNbaS0xXSA6IG91dGVyVHlwZSkgPT0gIkwiOwogICAgICAgICAgdmFyIGFmdGVyID0gKGVuZCA8IGxlbiA/IHR5cGVzW2VuZF0gOiBvdXRlclR5cGUpID09ICJMIjsKICAgICAgICAgIHZhciByZXBsYWNlID0gYmVmb3JlIHx8IGFmdGVyID8gIkwiIDogIlIiOwogICAgICAgICAgZm9yICh2YXIgaiA9IGk7IGogPCBlbmQ7ICsraikgdHlwZXNbal0gPSByZXBsYWNlOwogICAgICAgICAgaSA9IGVuZCAtIDE7CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyBIZXJlIHdlIGRlcGFydCBmcm9tIHRoZSBkb2N1bWVudGVkIGFsZ29yaXRobSwgaW4gb3JkZXIgdG8gYXZvaWQKICAgICAgLy8gYnVpbGRpbmcgdXAgYW4gYWN0dWFsIGxldmVscyBhcnJheS4gU2luY2UgdGhlcmUgYXJlIG9ubHkgdGhyZWUKICAgICAgLy8gbGV2ZWxzICgwLCAxLCAyKSBpbiBhbiBpbXBsZW1lbnRhdGlvbiB0aGF0IGRvZXNuJ3QgdGFrZQogICAgICAvLyBleHBsaWNpdCBlbWJlZGRpbmcgaW50byBhY2NvdW50LCB3ZSBjYW4gYnVpbGQgdXAgdGhlIG9yZGVyIG9uCiAgICAgIC8vIHRoZSBmbHksIHdpdGhvdXQgZm9sbG93aW5nIHRoZSBsZXZlbC1iYXNlZCBhbGdvcml0aG0uCiAgICAgIHZhciBvcmRlciA9IFtdLCBtOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjspIHsKICAgICAgICBpZiAoY291bnRzQXNMZWZ0LnRlc3QodHlwZXNbaV0pKSB7CiAgICAgICAgICB2YXIgc3RhcnQgPSBpOwogICAgICAgICAgZm9yICgrK2k7IGkgPCBsZW4gJiYgY291bnRzQXNMZWZ0LnRlc3QodHlwZXNbaV0pOyArK2kpIHt9CiAgICAgICAgICBvcmRlci5wdXNoKG5ldyBCaWRpU3BhbigwLCBzdGFydCwgaSkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB2YXIgcG9zID0gaSwgYXQgPSBvcmRlci5sZW5ndGg7CiAgICAgICAgICBmb3IgKCsraTsgaSA8IGxlbiAmJiB0eXBlc1tpXSAhPSAiTCI7ICsraSkge30KICAgICAgICAgIGZvciAodmFyIGogPSBwb3M7IGogPCBpOykgewogICAgICAgICAgICBpZiAoY291bnRzQXNOdW0udGVzdCh0eXBlc1tqXSkpIHsKICAgICAgICAgICAgICBpZiAocG9zIDwgaikgb3JkZXIuc3BsaWNlKGF0LCAwLCBuZXcgQmlkaVNwYW4oMSwgcG9zLCBqKSk7CiAgICAgICAgICAgICAgdmFyIG5zdGFydCA9IGo7CiAgICAgICAgICAgICAgZm9yICgrK2o7IGogPCBpICYmIGNvdW50c0FzTnVtLnRlc3QodHlwZXNbal0pOyArK2opIHt9CiAgICAgICAgICAgICAgb3JkZXIuc3BsaWNlKGF0LCAwLCBuZXcgQmlkaVNwYW4oMiwgbnN0YXJ0LCBqKSk7CiAgICAgICAgICAgICAgcG9zID0gajsKICAgICAgICAgICAgfSBlbHNlICsrajsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChwb3MgPCBpKSBvcmRlci5zcGxpY2UoYXQsIDAsIG5ldyBCaWRpU3BhbigxLCBwb3MsIGkpKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKG9yZGVyWzBdLmxldmVsID09IDEgJiYgKG0gPSBzdHIubWF0Y2goL15ccysvKSkpIHsKICAgICAgICBvcmRlclswXS5mcm9tID0gbVswXS5sZW5ndGg7CiAgICAgICAgb3JkZXIudW5zaGlmdChuZXcgQmlkaVNwYW4oMCwgMCwgbVswXS5sZW5ndGgpKTsKICAgICAgfQogICAgICBpZiAobHN0KG9yZGVyKS5sZXZlbCA9PSAxICYmIChtID0gc3RyLm1hdGNoKC9ccyskLykpKSB7CiAgICAgICAgbHN0KG9yZGVyKS50byAtPSBtWzBdLmxlbmd0aDsKICAgICAgICBvcmRlci5wdXNoKG5ldyBCaWRpU3BhbigwLCBsZW4gLSBtWzBdLmxlbmd0aCwgbGVuKSk7CiAgICAgIH0KICAgICAgaWYgKG9yZGVyWzBdLmxldmVsICE9IGxzdChvcmRlcikubGV2ZWwpCiAgICAgICAgb3JkZXIucHVzaChuZXcgQmlkaVNwYW4ob3JkZXJbMF0ubGV2ZWwsIGxlbiwgbGVuKSk7CgogICAgICByZXR1cm4gb3JkZXI7CiAgICB9OwogIH0pKCk7CgogIC8vIFRIRSBFTkQKCiAgQ29kZU1pcnJvci52ZXJzaW9uID0gIjQuNC4wIjsKCiAgcmV0dXJuIENvZGVNaXJyb3I7Cn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/lib/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCEtLSBEVU1NWSBIVE1MIEZJTEUgLS0+]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/LICENSE</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Q29weXJpZ2h0IChDKSAyMDE0IGJ5IE1hcmlqbiBIYXZlcmJla2UgPG1hcmlqbmhAZ21haWwuY29tPiBhbmQgb3RoZXJzCgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbApjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCmFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KVEhFIFNPRlRXQVJFLgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/apl/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/apl/apl.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJhcGwiLCBmdW5jdGlvbigpIHsKICB2YXIgYnVpbHRJbk9wcyA9IHsKICAgICIuIjogImlubmVyUHJvZHVjdCIsCiAgICAiXFwiOiAic2NhbiIsCiAgICAiLyI6ICJyZWR1Y2UiLAogICAgIuKMvyI6ICJyZWR1Y2UxQXhpcyIsCiAgICAi4o2AIjogInNjYW4xQXhpcyIsCiAgICAiwqgiOiAiZWFjaCIsCiAgICAi4o2jIjogInBvd2VyIgogIH07CiAgdmFyIGJ1aWx0SW5GdW5jcyA9IHsKICAgICIrIjogWyJjb25qdWdhdGUiLCAiYWRkIl0sCiAgICAi4oiSIjogWyJuZWdhdGUiLCAic3VidHJhY3QiXSwKICAgICLDlyI6IFsic2lnbk9mIiwgIm11bHRpcGx5Il0sCiAgICAiw7ciOiBbInJlY2lwcm9jYWwiLCAiZGl2aWRlIl0sCiAgICAi4oyIIjogWyJjZWlsaW5nIiwgImdyZWF0ZXJPZiJdLAogICAgIuKMiiI6IFsiZmxvb3IiLCAibGVzc2VyT2YiXSwKICAgICLiiKMiOiBbImFic29sdXRlIiwgInJlc2lkdWUiXSwKICAgICLijbMiOiBbImluZGV4R2VuZXJhdGUiLCAiaW5kZXhPZiJdLAogICAgIj8iOiBbInJvbGwiLCAiZGVhbCJdLAogICAgIuKLhiI6IFsiZXhwb25lbnRpYXRlIiwgInRvVGhlUG93ZXJPZiJdLAogICAgIuKNnyI6IFsibmF0dXJhbExvZyIsICJsb2dUb1RoZUJhc2UiXSwKICAgICLil4siOiBbInBpVGltZXMiLCAiY2lyY3VsYXJGdW5jcyJdLAogICAgIiEiOiBbImZhY3RvcmlhbCIsICJiaW5vbWlhbCJdLAogICAgIuKMuSI6IFsibWF0cml4SW52ZXJzZSIsICJtYXRyaXhEaXZpZGUiXSwKICAgICI8IjogW251bGwsICJsZXNzVGhhbiJdLAogICAgIuKJpCI6IFtudWxsLCAibGVzc1RoYW5PckVxdWFsIl0sCiAgICAiPSI6IFtudWxsLCAiZXF1YWxzIl0sCiAgICAiPiI6IFtudWxsLCAiZ3JlYXRlclRoYW4iXSwKICAgICLiiaUiOiBbbnVsbCwgImdyZWF0ZXJUaGFuT3JFcXVhbCJdLAogICAgIuKJoCI6IFtudWxsLCAibm90RXF1YWwiXSwKICAgICLiiaEiOiBbImRlcHRoIiwgIm1hdGNoIl0sCiAgICAi4omiIjogW251bGwsICJub3RNYXRjaCJdLAogICAgIuKIiCI6IFsiZW5saXN0IiwgIm1lbWJlcnNoaXAiXSwKICAgICLijbciOiBbbnVsbCwgImZpbmQiXSwKICAgICLiiKoiOiBbInVuaXF1ZSIsICJ1bmlvbiJdLAogICAgIuKIqSI6IFtudWxsLCAiaW50ZXJzZWN0aW9uIl0sCiAgICAi4oi8IjogWyJub3QiLCAid2l0aG91dCJdLAogICAgIuKIqCI6IFtudWxsLCAib3IiXSwKICAgICLiiKciOiBbbnVsbCwgImFuZCJdLAogICAgIuKNsSI6IFtudWxsLCAibm9yIl0sCiAgICAi4o2yIjogW251bGwsICJuYW5kIl0sCiAgICAi4o20IjogWyJzaGFwZU9mIiwgInJlc2hhcGUiXSwKICAgICIsIjogWyJyYXZlbCIsICJjYXRlbmF0ZSJdLAogICAgIuKNqiI6IFtudWxsLCAiZmlyc3RBeGlzQ2F0ZW5hdGUiXSwKICAgICLijL0iOiBbInJldmVyc2UiLCAicm90YXRlIl0sCiAgICAi4oqWIjogWyJheGlzMVJldmVyc2UiLCAiYXhpczFSb3RhdGUiXSwKICAgICLijYkiOiBbInRyYW5zcG9zZSIsIG51bGxdLAogICAgIuKGkSI6IFsiZmlyc3QiLCAidGFrZSJdLAogICAgIuKGkyI6IFtudWxsLCAiZHJvcCJdLAogICAgIuKKgiI6IFsiZW5jbG9zZSIsICJwYXJ0aXRpb25XaXRoQXhpcyJdLAogICAgIuKKgyI6IFsiZGljbG9zZSIsICJwaWNrIl0sCiAgICAi4oy3IjogW251bGwsICJpbmRleCJdLAogICAgIuKNiyI6IFsiZ3JhZGVVcCIsIG51bGxdLAogICAgIuKNkiI6IFsiZ3JhZGVEb3duIiwgbnVsbF0sCiAgICAi4oqkIjogWyJlbmNvZGUiLCBudWxsXSwKICAgICLiiqUiOiBbImRlY29kZSIsIG51bGxdLAogICAgIuKNlSI6IFsiZm9ybWF0IiwgImZvcm1hdEJ5RXhhbXBsZSJdLAogICAgIuKNjiI6IFsiZXhlY3V0ZSIsIG51bGxdLAogICAgIuKKoyI6IFsic3RvcCIsICJsZWZ0Il0sCiAgICAi4oqiIjogWyJwYXNzIiwgInJpZ2h0Il0KICB9OwoKICB2YXIgaXNPcGVyYXRvciA9IC9bXC5cL+KMv+KNgMKo4o2jXS87CiAgdmFyIGlzTmlsYWRpYyA9IC/ijawvOwogIHZhciBpc0Z1bmN0aW9uID0gL1tcK+KIksOXw7fijIjijIriiKPijbNcP+KLhuKNn+KXiyHijLk84omkPT7iiaXiiaDiiaHiiaLiiIjijbfiiKriiKniiLziiKjiiKfijbHijbLijbQs4o2q4oy94oqW4o2J4oaR4oaT4oqC4oqD4oy34o2L4o2S4oqk4oql4o2V4o2O4oqj4oqiXS87CiAgdmFyIGlzQXJyb3cgPSAv4oaQLzsKICB2YXIgaXNDb21tZW50ID0gL1vijZ0jXS4qJC87CgogIHZhciBzdHJpbmdFYXRlciA9IGZ1bmN0aW9uKHR5cGUpIHsKICAgIHZhciBwcmV2OwogICAgcHJldiA9IGZhbHNlOwogICAgcmV0dXJuIGZ1bmN0aW9uKGMpIHsKICAgICAgcHJldiA9IGM7CiAgICAgIGlmIChjID09PSB0eXBlKSB7CiAgICAgICAgcmV0dXJuIHByZXYgPT09ICJcXCI7CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWU7CiAgICB9OwogIH07CiAgcmV0dXJuIHsKICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gewogICAgICAgIHByZXY6IGZhbHNlLAogICAgICAgIGZ1bmM6IGZhbHNlLAogICAgICAgIG9wOiBmYWxzZSwKICAgICAgICBzdHJpbmc6IGZhbHNlLAogICAgICAgIGVzY2FwZTogZmFsc2UKICAgICAgfTsKICAgIH0sCiAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICB2YXIgY2gsIGZ1bmNOYW1lLCB3b3JkOwogICAgICBpZiAoc3RyZWFtLmVhdFNwYWNlKCkpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBjaCA9IHN0cmVhbS5uZXh0KCk7CiAgICAgIGlmIChjaCA9PT0gJyInIHx8IGNoID09PSAiJyIpIHsKICAgICAgICBzdHJlYW0uZWF0V2hpbGUoc3RyaW5nRWF0ZXIoY2gpKTsKICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgIHN0YXRlLnByZXYgPSB0cnVlOwogICAgICAgIHJldHVybiAic3RyaW5nIjsKICAgICAgfQogICAgICBpZiAoL1tcW3tcKF0vLnRlc3QoY2gpKSB7CiAgICAgICAgc3RhdGUucHJldiA9IGZhbHNlOwogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGlmICgvW1xdfVwpXS8udGVzdChjaCkpIHsKICAgICAgICBzdGF0ZS5wcmV2ID0gdHJ1ZTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBpZiAoaXNOaWxhZGljLnRlc3QoY2gpKSB7CiAgICAgICAgc3RhdGUucHJldiA9IGZhbHNlOwogICAgICAgIHJldHVybiAibmlsYWRpYyI7CiAgICAgIH0KICAgICAgaWYgKC9bwq9cZF0vLnRlc3QoY2gpKSB7CiAgICAgICAgaWYgKHN0YXRlLmZ1bmMpIHsKICAgICAgICAgIHN0YXRlLmZ1bmMgPSBmYWxzZTsKICAgICAgICAgIHN0YXRlLnByZXYgPSBmYWxzZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc3RhdGUucHJldiA9IHRydWU7CiAgICAgICAgfQogICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1x3XC5dLyk7CiAgICAgICAgcmV0dXJuICJudW1iZXIiOwogICAgICB9CiAgICAgIGlmIChpc09wZXJhdG9yLnRlc3QoY2gpKSB7CiAgICAgICAgcmV0dXJuICJvcGVyYXRvciBhcGwtIiArIGJ1aWx0SW5PcHNbY2hdOwogICAgICB9CiAgICAgIGlmIChpc0Fycm93LnRlc3QoY2gpKSB7CiAgICAgICAgcmV0dXJuICJhcGwtYXJyb3ciOwogICAgICB9CiAgICAgIGlmIChpc0Z1bmN0aW9uLnRlc3QoY2gpKSB7CiAgICAgICAgZnVuY05hbWUgPSAiYXBsLSI7CiAgICAgICAgaWYgKGJ1aWx0SW5GdW5jc1tjaF0gIT0gbnVsbCkgewogICAgICAgICAgaWYgKHN0YXRlLnByZXYpIHsKICAgICAgICAgICAgZnVuY05hbWUgKz0gYnVpbHRJbkZ1bmNzW2NoXVsxXTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGZ1bmNOYW1lICs9IGJ1aWx0SW5GdW5jc1tjaF1bMF07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHN0YXRlLmZ1bmMgPSB0cnVlOwogICAgICAgIHN0YXRlLnByZXYgPSBmYWxzZTsKICAgICAgICByZXR1cm4gImZ1bmN0aW9uICIgKyBmdW5jTmFtZTsKICAgICAgfQogICAgICBpZiAoaXNDb21tZW50LnRlc3QoY2gpKSB7CiAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICAgIHJldHVybiAiY29tbWVudCI7CiAgICAgIH0KICAgICAgaWYgKGNoID09PSAi4oiYIiAmJiBzdHJlYW0ucGVlaygpID09PSAiLiIpIHsKICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgIHJldHVybiAiZnVuY3Rpb24gam90LWRvdCI7CiAgICAgIH0KICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXHdcJF9dLyk7CiAgICAgIHdvcmQgPSBzdHJlYW0uY3VycmVudCgpOwogICAgICBzdGF0ZS5wcmV2ID0gdHJ1ZTsKICAgICAgcmV0dXJuICJrZXl3b3JkIjsKICAgIH0KICB9Owp9KTsKCkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC9hcGwiLCAiYXBsIik7Cgp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/apl/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogQVBMIG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vLi4vYWRkb24vZWRpdC9tYXRjaGJyYWNrZXRzLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4vYXBsLmpzIj48L3NjcmlwdD4KPHN0eWxlPgoJLkNvZGVNaXJyb3IgeyBib3JkZXI6IDJweCBpbnNldCAjZGVlOyB9CiAgICA8L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5BUEw8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPkFQTCBtb2RlPC9oMj4KPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4K4o2dIENvbndheSdzIGdhbWUgb2YgbGlmZQoK4o2dIFRoaXMgZXhhbXBsZSB3YXMgaW5zcGlyZWQgYnkgdGhlIGltcHJlc3NpdmUgZGVtbyBhdArijZ0gaHR0cDovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PWE5eEFLdHRXZ1A0CgrijZ0gQ3JlYXRlIGEgbWF0cml4OgrijZ0gICAgIDAgMSAxCuKNnSAgICAgMSAxIDAK4o2dICAgICAwIDEgMApjcmVhdHVyZSDihpAgKDMgMyDijbQg4o2zIDkpIOKIiCAxIDIgMyA0IDcgICDijZ0gT3JpZ2luYWwgY3JlYXR1cmUgZnJvbSBkZW1vCmNyZWF0dXJlIOKGkCAoMyAzIOKNtCDijbMgOSkg4oiIIDEgMyA2IDcgOCAgIOKNnSBHbGlkZXIKCuKNnSBQbGFjZSB0aGUgY3JlYXR1cmUgb24gYSBsYXJnZXIgYm9hcmQsIG5lYXIgdGhlIGNlbnRyZQpib2FyZCDihpAgwq8xIOKKliDCrzIg4oy9IDUgNyDihpEgY3JlYXR1cmUKCuKNnSBBIGZ1bmN0aW9uIHRvIG1vdmUgZnJvbSBvbmUgZ2VuZXJhdGlvbiB0byB0aGUgbmV4dApsaWZlIOKGkCB74oioLyAxIOKNtSDiiKcgMyA0ID0g4oqCKy8gK+KMvyAxIDAgwq8xIOKImC7iipYgMSAwIMKvMSDijL3CqCDiioLijbV9CgrijZ0gQ29tcHV0ZSBuLXRoIGdlbmVyYXRpb24gYW5kIGZvcm1hdCBpdCBhcyBhCuKNnSBjaGFyYWN0ZXIgbWF0cml4CmdlbiDihpAgeycgIydbKGxpZmUg4o2jIOKNtSkgYm9hcmRdfQoK4o2dIFNob3cgZmlyc3QgdGhyZWUgZ2VuZXJhdGlvbnMKKGdlbiAxKSAoZ2VuIDIpIChnZW4gMykKPC90ZXh0YXJlYT48L2Zvcm0+CgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgICAgICBtYXRjaEJyYWNrZXRzOiB0cnVlLAogICAgICAgIG1vZGU6ICJ0ZXh0L2FwbCIKICAgICAgfSk7CiAgICA8L3NjcmlwdD4KCiAgICA8cD5TaW1wbGUgbW9kZSB0aGF0IHRyaWVzIHRvIGhhbmRsZSBBUEwgYXMgd2VsbCBhcyBpdCBjYW4uPC9wPgogICAgPHA+SXQgYXR0ZW1wdHMgdG8gbGFiZWwgZnVuY3Rpb25zL29wZXJhdG9ycyBiYXNlZCB1cG9uCiAgICBtb25hZGljL2R5YWRpYyB1c2FnZSAoYnV0IHRoaXMgaXMgZmFyIGZyb20gZnVsbHkgZmxlc2hlZCBvdXQpLgogICAgVGhpcyBtZWFucyB0aGVyZSBhcmUgbWVhbmluZ2Z1bCBjbGFzc25hbWVzIHNvIGhvdmVyIHN0YXRlcyBjYW4KICAgIGhhdmUgcG9wdXBzIGV0Yy48L3A+CgogICAgPHA+PHN0cm9uZz5NSU1FIHR5cGVzIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPnRleHQvYXBsPC9jb2RlPiAoQVBMIGNvZGUpPC9wPgogIDwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/asterisk/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/asterisk/asterisk.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovKgogKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqCiAqICAgICAgIEZpbGVuYW1lOiAgbW9kZS9hc3Rlcmlzay9hc3Rlcmlzay5qcwogKgogKiAgICBEZXNjcmlwdGlvbjogIENvZGVNaXJyb3IgbW9kZSBmb3IgQXN0ZXJpc2sgZGlhbHBsYW4KICoKICogICAgICAgIENyZWF0ZWQ6ICAwNS8xNy8yMDEyIDA5OjIwOjI1IFBNCiAqICAgICAgIFJldmlzaW9uOiAgbm9uZQogKgogKiAgICAgICAgIEF1dGhvcjogIFN0YXMgS29iemFyIChzdGFzQG1vZHVsaXMuY2EpLAogKiAgICAgICAgQ29tcGFueTogIE1vZHVsaXMuY2EgSW5jLgogKgogKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwoKKGZ1bmN0aW9uKG1vZCkgewogIGlmICh0eXBlb2YgZXhwb3J0cyA9PSAib2JqZWN0IiAmJiB0eXBlb2YgbW9kdWxlID09ICJvYmplY3QiKSAvLyBDb21tb25KUwogICAgbW9kKHJlcXVpcmUoIi4uLy4uL2xpYi9jb2RlbWlycm9yIikpOwogIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kKSAvLyBBTUQKICAgIGRlZmluZShbIi4uLy4uL2xpYi9jb2RlbWlycm9yIl0sIG1vZCk7CiAgZWxzZSAvLyBQbGFpbiBicm93c2VyIGVudgogICAgbW9kKENvZGVNaXJyb3IpOwp9KShmdW5jdGlvbihDb2RlTWlycm9yKSB7CiJ1c2Ugc3RyaWN0IjsKCkNvZGVNaXJyb3IuZGVmaW5lTW9kZSgiYXN0ZXJpc2siLCBmdW5jdGlvbigpIHsKICB2YXIgYXRvbXMgICAgPSBbImV4dGVuIiwgInNhbWUiLCAiaW5jbHVkZSIsImlnbm9yZXBhdCIsInN3aXRjaCJdLAogICAgICBkcGNtZCAgICA9IFsiI2luY2x1ZGUiLCIjZXhlYyJdLAogICAgICBhcHBzICAgICA9IFsKICAgICAgICAgICAgICAgICAgImFkZHF1ZXVlbWVtYmVyIiwiYWRzaXByb2ciLCJhZWxzdWIiLCJhZ2VudGxvZ2luIiwiYWdlbnRtb25pdG9yb3V0Z29pbmciLCJhZ2kiLAogICAgICAgICAgICAgICAgICAiYWxhcm1yZWNlaXZlciIsImFtZCIsImFuc3dlciIsImF1dGhlbnRpY2F0ZSIsImJhY2tncm91bmQiLCJiYWNrZ3JvdW5kZGV0ZWN0IiwKICAgICAgICAgICAgICAgICAgImJyaWRnZSIsImJ1c3kiLCJjYWxsY29tcGxldGlvbmNhbmNlbCIsImNhbGxjb21wbGV0aW9ucmVxdWVzdCIsImNlbGdlbnVzZXJldmVudCIsCiAgICAgICAgICAgICAgICAgICJjaGFuZ2Vtb25pdG9yIiwiY2hhbmlzYXZhaWwiLCJjaGFubmVscmVkaXJlY3QiLCJjaGFuc3B5IiwiY2xlYXJoYXNoIiwiY29uZmJyaWRnZSIsCiAgICAgICAgICAgICAgICAgICJjb25nZXN0aW9uIiwiY29udGludWV3aGlsZSIsImNvbnRyb2xwbGF5YmFjayIsImRhaGRpYWNjZXB0cjJjYWxsIiwiZGFoZGliYXJnZSIsCiAgICAgICAgICAgICAgICAgICJkYWhkaXJhcyIsImRhaGRpc2NhbiIsImRhaGRpc2VuZGNhbGxyZXJvdXRpbmdmYWNpbGl0eSIsImRhaGRpc2VuZGtleXBhZGZhY2lsaXR5IiwKICAgICAgICAgICAgICAgICAgImRhdGV0aW1lIiwiZGJkZWwiLCJkYmRlbHRyZWUiLCJkZWFkYWdpIiwiZGlhbCIsImRpY3RhdGUiLCJkaXJlY3RvcnkiLCJkaXNhIiwKICAgICAgICAgICAgICAgICAgImR1bXBjaGFuIiwiZWFnaSIsImVjaG8iLCJlbmR3aGlsZSIsImV4ZWMiLCJleGVjaWYiLCJleGVjaWZ0aW1lIiwiZXhpdHdoaWxlIiwiZXh0ZW5zcHkiLAogICAgICAgICAgICAgICAgICAiZXh0ZXJuYWxpdnIiLCJmZXN0aXZhbCIsImZsYXNoIiwiZm9sbG93bWUiLCJmb3JrY2RyIiwiZ2V0Y3BlaWQiLCJnb3N1YiIsImdvc3ViaWYiLAogICAgICAgICAgICAgICAgICAiZ290byIsImdvdG9pZiIsImdvdG9pZnRpbWUiLCJoYW5ndXAiLCJpYXgycHJvdmlzaW9uIiwiaWNlcyIsImltcG9ydHZhciIsImluY29tcGxldGUiLAogICAgICAgICAgICAgICAgICAiaXZyZGVtbyIsImphYmJlcmpvaW4iLCJqYWJiZXJsZWF2ZSIsImphYmJlcnNlbmQiLCJqYWJiZXJzZW5kZ3JvdXAiLCJqYWJiZXJzdGF0dXMiLAogICAgICAgICAgICAgICAgICAiamFjayIsImxvZyIsIm1hY3JvIiwibWFjcm9leGNsdXNpdmUiLCJtYWNyb2V4aXQiLCJtYWNyb2lmIiwibWFpbGJveGV4aXN0cyIsIm1lZXRtZSIsCiAgICAgICAgICAgICAgICAgICJtZWV0bWVhZG1pbiIsIm1lZXRtZWNoYW5uZWxhZG1pbiIsIm1lZXRtZWNvdW50IiwibWlsbGl3YXR0IiwibWluaXZtYWNjbWVzcyIsIm1pbml2bWRlbGV0ZSIsCiAgICAgICAgICAgICAgICAgICJtaW5pdm1ncmVldCIsIm1pbml2bW13aSIsIm1pbml2bW5vdGlmeSIsIm1pbml2bXJlY29yZCIsIm1peG1vbml0b3IiLCJtb25pdG9yIiwibW9yc2Vjb2RlIiwKICAgICAgICAgICAgICAgICAgIm1wM3BsYXllciIsIm1zZXQiLCJtdXNpY29uaG9sZCIsIm5ic2NhdCIsIm5vY2RyIiwibm9vcCIsIm9kYmMiLCJvZGJjIiwib2RiY2ZpbmlzaCIsCiAgICAgICAgICAgICAgICAgICJvcmlnaW5hdGUiLCJvc3BhdXRoIiwib3NwZmluaXNoIiwib3NwbG9va3VwIiwib3NwbmV4dCIsInBhZ2UiLCJwYXJrIiwicGFya2FuZGFubm91bmNlIiwKICAgICAgICAgICAgICAgICAgInBhcmtlZGNhbGwiLCJwYXVzZW1vbml0b3IiLCJwYXVzZXF1ZXVlbWVtYmVyIiwicGlja3VwIiwicGlja3VwY2hhbiIsInBsYXliYWNrIiwicGxheXRvbmVzIiwKICAgICAgICAgICAgICAgICAgInByaXZhY3ltYW5hZ2VyIiwicHJvY2VlZGluZyIsInByb2dyZXNzIiwicXVldWUiLCJxdWV1ZWxvZyIsInJhaXNlZXhjZXB0aW9uIiwicmVhZCIsInJlYWRleHRlbiIsCiAgICAgICAgICAgICAgICAgICJyZWFkZmlsZSIsInJlY2VpdmVmYXgiLCJyZWNlaXZlZmF4IiwicmVjZWl2ZWZheCIsInJlY29yZCIsInJlbW92ZXF1ZXVlbWVtYmVyIiwKICAgICAgICAgICAgICAgICAgInJlc2V0Y2RyIiwicmV0cnlkaWFsIiwicmV0dXJuIiwicmluZ2luZyIsInNheWFscGhhIiwic2F5Y291bnRlZGFkaiIsInNheWNvdW50ZWRub3VuIiwKICAgICAgICAgICAgICAgICAgInNheWNvdW50cGwiLCJzYXlkaWdpdHMiLCJzYXludW1iZXIiLCJzYXlwaG9uZXRpYyIsInNheXVuaXh0aW1lIiwic2VuZGR0bWYiLCJzZW5kZmF4IiwKICAgICAgICAgICAgICAgICAgInNlbmRmYXgiLCJzZW5kZmF4Iiwic2VuZGltYWdlIiwic2VuZHRleHQiLCJzZW5kdXJsIiwic2V0Iiwic2V0YW1hZmxhZ3MiLAogICAgICAgICAgICAgICAgICAic2V0Y2FsbGVycHJlcyIsInNldG11c2ljb25ob2xkIiwic2lwYWRkaGVhZGVyIiwic2lwZHRtZm1vZGUiLCJzaXByZW1vdmVoZWFkZXIiLCJza2VsIiwKICAgICAgICAgICAgICAgICAgInNsYXN0YXRpb24iLCJzbGF0cnVuayIsInNtcyIsInNvZnRoYW5ndXAiLCJzcGVlY2hhY3RpdmF0ZWdyYW1tYXIiLCJzcGVlY2hiYWNrZ3JvdW5kIiwKICAgICAgICAgICAgICAgICAgInNwZWVjaGNyZWF0ZSIsInNwZWVjaGRlYWN0aXZhdGVncmFtbWFyIiwic3BlZWNoZGVzdHJveSIsInNwZWVjaGxvYWRncmFtbWFyIiwic3BlZWNocHJvY2Vzc2luZ3NvdW5kIiwKICAgICAgICAgICAgICAgICAgInNwZWVjaHN0YXJ0Iiwic3BlZWNodW5sb2FkZ3JhbW1hciIsInN0YWNrcG9wIiwic3RhcnRtdXNpY29uaG9sZCIsInN0b3BtaXhtb25pdG9yIiwic3RvcG1vbml0b3IiLAogICAgICAgICAgICAgICAgICAic3RvcG11c2ljb25ob2xkIiwic3RvcHBsYXl0b25lcyIsInN5c3RlbSIsInRlc3RjbGllbnQiLCJ0ZXN0c2VydmVyIiwidHJhbnNmZXIiLCJ0cnlleGVjIiwKICAgICAgICAgICAgICAgICAgInRyeXN5c3RlbSIsInVucGF1c2Vtb25pdG9yIiwidW5wYXVzZXF1ZXVlbWVtYmVyIiwidXNlcmV2ZW50IiwidmVyYm9zZSIsInZtYXV0aGVudGljYXRlIiwKICAgICAgICAgICAgICAgICAgInZtc2F5bmFtZSIsInZvaWNlbWFpbCIsInZvaWNlbWFpbG1haW4iLCJ3YWl0Iiwid2FpdGV4dGVuIiwid2FpdGZvcm5vaXNlIiwid2FpdGZvcnJpbmciLAogICAgICAgICAgICAgICAgICAid2FpdGZvcnNpbGVuY2UiLCJ3YWl0bXVzaWNvbmhvbGQiLCJ3YWl0dW50aWwiLCJ3aGlsZSIsInphcGF0ZWxsZXIiCiAgICAgICAgICAgICAgICAgXTsKCiAgZnVuY3Rpb24gYmFzaWNUb2tlbihzdHJlYW0sc3RhdGUpewogICAgdmFyIGN1ciA9ICcnOwogICAgdmFyIGNoICA9ICcnOwogICAgY2ggPSBzdHJlYW0ubmV4dCgpOwogICAgLy8gY29tbWVudAogICAgaWYoY2ggPT0gIjsiKSB7CiAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgcmV0dXJuICJjb21tZW50IjsKICAgIH0KICAgIC8vIGNvbnRleHQKICAgIGlmKGNoID09ICdbJykgewogICAgICBzdHJlYW0uc2tpcFRvKCddJyk7CiAgICAgIHN0cmVhbS5lYXQoJ10nKTsKICAgICAgcmV0dXJuICJoZWFkZXIiOwogICAgfQogICAgLy8gc3RyaW5nCiAgICBpZihjaCA9PSAnIicpIHsKICAgICAgc3RyZWFtLnNraXBUbygnIicpOwogICAgICByZXR1cm4gInN0cmluZyI7CiAgICB9CiAgICBpZihjaCA9PSAiJyIpIHsKICAgICAgc3RyZWFtLnNraXBUbygiJyIpOwogICAgICByZXR1cm4gInN0cmluZy0yIjsKICAgIH0KICAgIC8vIGRpYWxwbGFuIGNvbW1hbmRzCiAgICBpZihjaCA9PSAnIycpIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKC9cdy8pOwogICAgICBjdXIgPSBzdHJlYW0uY3VycmVudCgpOwogICAgICBpZihkcGNtZC5pbmRleE9mKGN1cikgIT09IC0xKSB7CiAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICAgIHJldHVybiAic3Ryb25nIjsKICAgICAgfQogICAgfQogICAgLy8gYXBwbGljYXRpb24gYXJncwogICAgaWYoY2ggPT0gJyQnKXsKICAgICAgdmFyIGNoMSA9IHN0cmVhbS5wZWVrKCk7CiAgICAgIGlmKGNoMSA9PSAneycpewogICAgICAgIHN0cmVhbS5za2lwVG8oJ30nKTsKICAgICAgICBzdHJlYW0uZWF0KCd9Jyk7CiAgICAgICAgcmV0dXJuICJ2YXJpYWJsZS0zIjsKICAgICAgfQogICAgfQogICAgLy8gZXh0ZW5zaW9uCiAgICBzdHJlYW0uZWF0V2hpbGUoL1x3Lyk7CiAgICBjdXIgPSBzdHJlYW0uY3VycmVudCgpOwogICAgaWYoYXRvbXMuaW5kZXhPZihjdXIpICE9PSAtMSkgewogICAgICBzdGF0ZS5leHRlblN0YXJ0ID0gdHJ1ZTsKICAgICAgc3dpdGNoKGN1cikgewogICAgICAgIGNhc2UgJ3NhbWUnOiBzdGF0ZS5leHRlblNhbWUgPSB0cnVlOyBicmVhazsKICAgICAgICBjYXNlICdpbmNsdWRlJzoKICAgICAgICBjYXNlICdzd2l0Y2gnOgogICAgICAgIGNhc2UgJ2lnbm9yZXBhdCc6CiAgICAgICAgICBzdGF0ZS5leHRlbkluY2x1ZGUgPSB0cnVlO2JyZWFrOwogICAgICAgIGRlZmF1bHQ6YnJlYWs7CiAgICAgIH0KICAgICAgcmV0dXJuICJhdG9tIjsKICAgIH0KICB9CgogIHJldHVybiB7CiAgICBzdGFydFN0YXRlOiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBleHRlblN0YXJ0OiBmYWxzZSwKICAgICAgICBleHRlblNhbWU6ICBmYWxzZSwKICAgICAgICBleHRlbkluY2x1ZGU6IGZhbHNlLAogICAgICAgIGV4dGVuRXh0ZW46IGZhbHNlLAogICAgICAgIGV4dGVuUHJpb3JpdHk6IGZhbHNlLAogICAgICAgIGV4dGVuQXBwbGljYXRpb246IGZhbHNlCiAgICAgIH07CiAgICB9LAogICAgdG9rZW46IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKCiAgICAgIHZhciBjdXIgPSAnJzsKICAgICAgdmFyIGNoICA9ICcnOwogICAgICBpZihzdHJlYW0uZWF0U3BhY2UoKSkgcmV0dXJuIG51bGw7CiAgICAgIC8vIGV4dGVuc2lvbiBzdGFydGVkCiAgICAgIGlmKHN0YXRlLmV4dGVuU3RhcnQpewogICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW15cc10vKTsKICAgICAgICBjdXIgPSBzdHJlYW0uY3VycmVudCgpOwogICAgICAgIGlmKC9ePT4/JC8udGVzdChjdXIpKXsKICAgICAgICAgIHN0YXRlLmV4dGVuRXh0ZW4gPSB0cnVlOwogICAgICAgICAgc3RhdGUuZXh0ZW5TdGFydCA9IGZhbHNlOwogICAgICAgICAgcmV0dXJuICJzdHJvbmciOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzdGF0ZS5leHRlblN0YXJ0ID0gZmFsc2U7CiAgICAgICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICAgICAgICByZXR1cm4gImVycm9yIjsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZihzdGF0ZS5leHRlbkV4dGVuKSB7CiAgICAgICAgLy8gc2V0IGV4dGVuIGFuZCBwcmlvcml0eQogICAgICAgIHN0YXRlLmV4dGVuRXh0ZW4gPSBmYWxzZTsKICAgICAgICBzdGF0ZS5leHRlblByaW9yaXR5ID0gdHJ1ZTsKICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1teLF0vKTsKICAgICAgICBpZihzdGF0ZS5leHRlbkluY2x1ZGUpIHsKICAgICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgICAgIHN0YXRlLmV4dGVuUHJpb3JpdHkgPSBmYWxzZTsKICAgICAgICAgIHN0YXRlLmV4dGVuSW5jbHVkZSA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICBpZihzdGF0ZS5leHRlblNhbWUpIHsKICAgICAgICAgIHN0YXRlLmV4dGVuUHJpb3JpdHkgPSBmYWxzZTsKICAgICAgICAgIHN0YXRlLmV4dGVuU2FtZSA9IGZhbHNlOwogICAgICAgICAgc3RhdGUuZXh0ZW5BcHBsaWNhdGlvbiA9IHRydWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiAidGFnIjsKICAgICAgfSBlbHNlIGlmKHN0YXRlLmV4dGVuUHJpb3JpdHkpIHsKICAgICAgICBzdGF0ZS5leHRlblByaW9yaXR5ID0gZmFsc2U7CiAgICAgICAgc3RhdGUuZXh0ZW5BcHBsaWNhdGlvbiA9IHRydWU7CiAgICAgICAgY2ggPSBzdHJlYW0ubmV4dCgpOyAvLyBnZXQgY29tbWEKICAgICAgICBpZihzdGF0ZS5leHRlblNhbWUpIHJldHVybiBudWxsOwogICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW14sXS8pOwogICAgICAgIHJldHVybiAibnVtYmVyIjsKICAgICAgfSBlbHNlIGlmKHN0YXRlLmV4dGVuQXBwbGljYXRpb24pIHsKICAgICAgICBzdHJlYW0uZWF0V2hpbGUoLywvKTsKICAgICAgICBjdXIgPSBzdHJlYW0uY3VycmVudCgpOwogICAgICAgIGlmKGN1ciA9PT0gJywnKSByZXR1cm4gbnVsbDsKICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1x3Lyk7CiAgICAgICAgY3VyID0gc3RyZWFtLmN1cnJlbnQoKS50b0xvd2VyQ2FzZSgpOwogICAgICAgIHN0YXRlLmV4dGVuQXBwbGljYXRpb24gPSBmYWxzZTsKICAgICAgICBpZihhcHBzLmluZGV4T2YoY3VyKSAhPT0gLTEpewogICAgICAgICAgcmV0dXJuICJkZWYgc3Ryb25nIjsKICAgICAgICB9CiAgICAgIH0gZWxzZXsKICAgICAgICByZXR1cm4gYmFzaWNUb2tlbihzdHJlYW0sc3RhdGUpOwogICAgICB9CgogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICB9Owp9KTsKCkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC94LWFzdGVyaXNrIiwgImFzdGVyaXNrIik7Cgp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/asterisk/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogQXN0ZXJpc2sgZGlhbHBsYW4gbW9kZTwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uLy4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxzY3JpcHQgc3JjPSIuLi8uLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJhc3Rlcmlzay5qcyI+PC9zY3JpcHQ+CjxzdHlsZT4KICAgICAgLkNvZGVNaXJyb3Ige2JvcmRlcjogMXB4IHNvbGlkICM5OTk7fQogICAgICAuY20tcy1kZWZhdWx0IHNwYW4uY20tYXJyb3cgeyBjb2xvcjogcmVkOyB9CiAgICA8L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5Bc3RlcmlzayBkaWFscGxhbjwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+QXN0ZXJpc2sgZGlhbHBsYW4gbW9kZTwvaDI+Cjxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+CjsgZXh0ZW5zaW9ucy5jb25mIC0gdGhlIEFzdGVyaXNrIGRpYWwgcGxhbgo7CgpbZ2VuZXJhbF0KOwo7IElmIHN0YXRpYyBpcyBzZXQgdG8gbm8sIG9yIG9taXR0ZWQsIHRoZW4gdGhlIHBieF9jb25maWcgd2lsbCByZXdyaXRlCjsgdGhpcyBmaWxlIHdoZW4gZXh0ZW5zaW9ucyBhcmUgbW9kaWZpZWQuICBSZW1lbWJlciB0aGF0IGFsbCBjb21tZW50cwo7IG1hZGUgaW4gdGhlIGZpbGUgd2lsbCBiZSBsb3N0IHdoZW4gdGhhdCBoYXBwZW5zLgpzdGF0aWM9eWVzCgojaW5jbHVkZSAiL2V0Yy9hc3Rlcmlzay9hZGRpdGlvbmFsX2dlbmVyYWwuY29uZgoKW2lheHByb3ZpZGVyXQpzd2l0Y2ggPT4gSUFYMi91c2VyOltrZXldQG15c2VydmVyL215Y29udGV4dAoKW2R5bmFtaWNdCiNleGVjIC91c3IvYmluL2R5bmFtaWMtcGVlcnMucGwKClt0cnVua2ludF0KOwo7IEludGVybmF0aW9uYWwgbG9uZyBkaXN0YW5jZSB0aHJvdWdoIHRydW5rCjsKZXh0ZW4gPT4gXzkwMTEuLDEsTWFjcm8oZHVuZGktZTE2NCwke0VYVEVOOjR9KQpleHRlbiA9PiBfOTAxMS4sbixEaWFsKCR7R0xPQkFMKFRSVU5LKX0vJHtGSUxURVIoMC05LCR7RVhURU46JHtHTE9CQUwoVFJVTktNU0QpfX0pfSkKCltsb2NhbF0KOwo7IE1hc3RlciBjb250ZXh0IGZvciBsb2NhbCwgdG9sbC1mcmVlLCBhbmQgaWF4dGVsIGNhbGxzIG9ubHkKOwppZ25vcmVwYXQgPT4gOQppbmNsdWRlID0+IGRlZmF1bHQKCltkZW1vXQppbmNsdWRlID0+IHN0ZGV4dGVuCjsKOyBXZSBzdGFydCB3aXRoIHdoYXQgdG8gZG8gd2hlbiBhIGNhbGwgZmlyc3QgY29tZXMgaW4uCjsKZXh0ZW4gPT4gcywxLFdhaXQoMSkJCQk7IFdhaXQgYSBzZWNvbmQsIGp1c3QgZm9yIGZ1bgpzYW1lICA9PiBuLEFuc3dlcgkJCTsgQW5zd2VyIHRoZSBsaW5lCnNhbWUgID0+IG4sU2V0KFRJTUVPVVQoZGlnaXQpPTUpCTsgU2V0IERpZ2l0IFRpbWVvdXQgdG8gNSBzZWNvbmRzCnNhbWUgID0+IG4sU2V0KFRJTUVPVVQocmVzcG9uc2UpPTEwKQk7IFNldCBSZXNwb25zZSBUaW1lb3V0IHRvIDEwIHNlY29uZHMKc2FtZSAgPT4gbihyZXN0YXJ0KSxCYWNrR3JvdW5kKGRlbW8tY29uZ3JhdHMpCTsgUGxheSBhIGNvbmdyYXR1bGF0b3J5IG1lc3NhZ2UKc2FtZSAgPT4gbihpbnN0cnVjdCksQmFja0dyb3VuZChkZW1vLWluc3RydWN0KQk7IFBsYXkgc29tZSBpbnN0cnVjdGlvbnMKc2FtZSAgPT4gbixXYWl0RXh0ZW4JCQk7IFdhaXQgZm9yIGFuIGV4dGVuc2lvbiB0byBiZSBkaWFsZWQuCgpleHRlbiA9PiAyLDEsQmFja0dyb3VuZChkZW1vLW1vcmVpbmZvKQk7IEdpdmUgc29tZSBtb3JlIGluZm9ybWF0aW9uLgpleHRlbiA9PiAyLG4sR290byhzLGluc3RydWN0KQoKZXh0ZW4gPT4gMywxLFNldChMQU5HVUFHRSgpPWZyKQkJOyBTZXQgbGFuZ3VhZ2UgdG8gZnJlbmNoCmV4dGVuID0+IDMsbixHb3RvKHMscmVzdGFydCkJCTsgU3RhcnQgd2l0aCB0aGUgY29uZ3JhdHVsYXRpb25zCgpleHRlbiA9PiAxMDAwLDEsR290byhkZWZhdWx0LHMsMSkKOwo7IFdlIGFsc28gY3JlYXRlIGFuIGV4YW1wbGUgdXNlciwgMTIzNCwgd2hvIGlzIG9uIHRoZSBjb25zb2xlIGFuZCBoYXMKOyB2b2ljZW1haWwsIGV0Yy4KOwpleHRlbiA9PiAxMjM0LDEsUGxheWJhY2sodHJhbnNmZXIsc2tpcCkJCTsgIlBsZWFzZSBob2xkIHdoaWxlLi4uIgoJCQkJCTsgKGJ1dCBza2lwIGlmIGNoYW5uZWwgaXMgbm90IHVwKQpleHRlbiA9PiAxMjM0LG4sR29zdWIoJHtFWFRFTn0sc3RkZXh0ZW4oJHtHTE9CQUwoQ09OU09MRSl9KSkKZXh0ZW4gPT4gMTIzNCxuLEdvdG8oZGVmYXVsdCxzLDEpCQk7IGV4aXRlZCBWb2ljZW1haWwKCmV4dGVuID0+IDEyMzUsMSxWb2ljZW1haWwoMTIzNCx1KQkJOyBSaWdodCB0byB2b2ljZW1haWwKCmV4dGVuID0+IDEyMzYsMSxEaWFsKENvbnNvbGUvZHNwKQkJOyBSaW5nIGZvcmV2ZXIKZXh0ZW4gPT4gMTIzNixuLFZvaWNlbWFpbCgxMjM0LGIpCQk7IFVubGVzcyBidXN5Cgo7CjsgIyBmb3Igd2hlbiB0aGV5J3JlIGRvbmUgd2l0aCB0aGUgZGVtbwo7CmV4dGVuID0+ICMsMSxQbGF5YmFjayhkZW1vLXRoYW5rcykJOyAiVGhhbmtzIGZvciB0cnlpbmcgdGhlIGRlbW8iCmV4dGVuID0+ICMsbixIYW5ndXAJCQk7IEhhbmcgdGhlbSB1cC4KCjsKOyBBIHRpbWVvdXQgYW5kICJpbnZhbGlkIGV4dGVuc2lvbiBydWxlIgo7CmV4dGVuID0+IHQsMSxHb3RvKCMsMSkJCQk7IElmIHRoZXkgdGFrZSB0b28gbG9uZywgZ2l2ZSB1cApleHRlbiA9PiBpLDEsUGxheWJhY2soaW52YWxpZCkJCTsgIlRoYXQncyBub3QgdmFsaWQsIHRyeSBhZ2FpbiIKCjsKOyBDcmVhdGUgYW4gZXh0ZW5zaW9uLCA1MDAsIGZvciBkaWFsaW5nIHRoZQo7IEFzdGVyaXNrIGRlbW8uCjsKZXh0ZW4gPT4gNTAwLDEsUGxheWJhY2soZGVtby1hYm91dHRvdHJ5KTsgTGV0IHRoZW0ga25vdyB3aGF0J3MgZ29pbmcgb24KZXh0ZW4gPT4gNTAwLG4sRGlhbChJQVgyL2d1ZXN0QHBieC5kaWdpdW0uY29tL3NAZGVmYXVsdCkJOyBDYWxsIHRoZSBBc3RlcmlzayBkZW1vCmV4dGVuID0+IDUwMCxuLFBsYXliYWNrKGRlbW8tbm9nbykJOyBDb3VsZG4ndCBjb25uZWN0IHRvIHRoZSBkZW1vIHNpdGUKZXh0ZW4gPT4gNTAwLG4sR290byhzLDYpCQk7IFJldHVybiB0byB0aGUgc3RhcnQgb3ZlciBtZXNzYWdlLgoKOwo7IENyZWF0ZSBhbiBleHRlbnNpb24sIDYwMCwgZm9yIGV2YWx1YXRpbmcgZWNobyBsYXRlbmN5Lgo7CmV4dGVuID0+IDYwMCwxLFBsYXliYWNrKGRlbW8tZWNob3Rlc3QpCTsgTGV0IHRoZW0ga25vdyB3aGF0J3MgZ29pbmcgb24KZXh0ZW4gPT4gNjAwLG4sRWNobwkJCTsgRG8gdGhlIGVjaG8gdGVzdApleHRlbiA9PiA2MDAsbixQbGF5YmFjayhkZW1vLWVjaG9kb25lKQk7IExldCB0aGVtIGtub3cgaXQncyBvdmVyCmV4dGVuID0+IDYwMCxuLEdvdG8ocyw2KQkJOyBTdGFydCBvdmVyCgo7CjsJWW91IGNhbiB1c2UgdGhlIE1hY3JvIFBhZ2UgdG8gaW50ZXJjb20gYSBpbmRpdmlkdWFsIHVzZXIKZXh0ZW4gPT4gNzYyNDUsMSxNYWNybyhwYWdlLFNJUC9HcmFuZHN0cmVhbTEpCjsgb3IgaWYgeW91ciBwZWVybmFtZXMgYXJlIHRoZSBzYW1lIGFzIGV4dGVuc2lvbnMKZXh0ZW4gPT4gXzdYWFgsMSxNYWNybyhwYWdlLFNJUC8ke0VYVEVOfSkKOwo7CjsgU3lzdGVtIFdpZGUgUGFnZSBhdCBleHRlbnNpb24gNzk5OQo7CmV4dGVuID0+IDc5OTksMSxTZXQoVElNRU9VVChhYnNvbHV0ZSk9NjApCmV4dGVuID0+IDc5OTksMixQYWdlKExvY2FsL0dyYW5kc3RyZWFtMUBwYWdlJkxvY2FsL1hsaXRlMUBwYWdlJkxvY2FsLzEyMzRAcGFnZS9uLGQpCgo7IEdpdmUgdm9pY2VtYWlsIGF0IGV4dGVuc2lvbiA4NTAwCjsKZXh0ZW4gPT4gODUwMCwxLFZvaWNlbWFpbE1haW4KZXh0ZW4gPT4gODUwMCxuLEdvdG8ocyw2KQoKICAgIDwvdGV4dGFyZWE+PC9mb3JtPgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICBtb2RlOiAidGV4dC94LWFzdGVyaXNrIiwKICAgICAgICBtYXRjaEJyYWNrZXRzOiB0cnVlLAogICAgICAgIGxpbmVOdW1iZXI6IHRydWUKICAgICAgfSk7CiAgICA8L3NjcmlwdD4KCiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC94LWFzdGVyaXNrPC9jb2RlPi48L3A+CgogIDwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/clike/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/clike/clike.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJjbGlrZSIsIGZ1bmN0aW9uKGNvbmZpZywgcGFyc2VyQ29uZmlnKSB7CiAgdmFyIGluZGVudFVuaXQgPSBjb25maWcuaW5kZW50VW5pdCwKICAgICAgc3RhdGVtZW50SW5kZW50VW5pdCA9IHBhcnNlckNvbmZpZy5zdGF0ZW1lbnRJbmRlbnRVbml0IHx8IGluZGVudFVuaXQsCiAgICAgIGRvbnRBbGlnbkNhbGxzID0gcGFyc2VyQ29uZmlnLmRvbnRBbGlnbkNhbGxzLAogICAgICBrZXl3b3JkcyA9IHBhcnNlckNvbmZpZy5rZXl3b3JkcyB8fCB7fSwKICAgICAgYnVpbHRpbiA9IHBhcnNlckNvbmZpZy5idWlsdGluIHx8IHt9LAogICAgICBibG9ja0tleXdvcmRzID0gcGFyc2VyQ29uZmlnLmJsb2NrS2V5d29yZHMgfHwge30sCiAgICAgIGF0b21zID0gcGFyc2VyQ29uZmlnLmF0b21zIHx8IHt9LAogICAgICBob29rcyA9IHBhcnNlckNvbmZpZy5ob29rcyB8fCB7fSwKICAgICAgbXVsdGlMaW5lU3RyaW5ncyA9IHBhcnNlckNvbmZpZy5tdWx0aUxpbmVTdHJpbmdzOwogIHZhciBpc09wZXJhdG9yQ2hhciA9IC9bK1wtKiYlPTw+IT98XC9dLzsKCiAgdmFyIGN1clB1bmM7CgogIGZ1bmN0aW9uIHRva2VuQmFzZShzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpOwogICAgaWYgKGhvb2tzW2NoXSkgewogICAgICB2YXIgcmVzdWx0ID0gaG9va3NbY2hdKHN0cmVhbSwgc3RhdGUpOwogICAgICBpZiAocmVzdWx0ICE9PSBmYWxzZSkgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIGlmIChjaCA9PSAnIicgfHwgY2ggPT0gIiciKSB7CiAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5TdHJpbmcoY2gpOwogICAgICByZXR1cm4gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CiAgICB9CiAgICBpZiAoL1tcW1xde31cKFwpLDtcOlwuXS8udGVzdChjaCkpIHsKICAgICAgY3VyUHVuYyA9IGNoOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGlmICgvXGQvLnRlc3QoY2gpKSB7CiAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1x3XC5dLyk7CiAgICAgIHJldHVybiAibnVtYmVyIjsKICAgIH0KICAgIGlmIChjaCA9PSAiLyIpIHsKICAgICAgaWYgKHN0cmVhbS5lYXQoIioiKSkgewogICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5Db21tZW50OwogICAgICAgIHJldHVybiB0b2tlbkNvbW1lbnQoc3RyZWFtLCBzdGF0ZSk7CiAgICAgIH0KICAgICAgaWYgKHN0cmVhbS5lYXQoIi8iKSkgewogICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgICByZXR1cm4gImNvbW1lbnQiOwogICAgICB9CiAgICB9CiAgICBpZiAoaXNPcGVyYXRvckNoYXIudGVzdChjaCkpIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKGlzT3BlcmF0b3JDaGFyKTsKICAgICAgcmV0dXJuICJvcGVyYXRvciI7CiAgICB9CiAgICBzdHJlYW0uZWF0V2hpbGUoL1tcd1wkX10vKTsKICAgIHZhciBjdXIgPSBzdHJlYW0uY3VycmVudCgpOwogICAgaWYgKGtleXdvcmRzLnByb3BlcnR5SXNFbnVtZXJhYmxlKGN1cikpIHsKICAgICAgaWYgKGJsb2NrS2V5d29yZHMucHJvcGVydHlJc0VudW1lcmFibGUoY3VyKSkgY3VyUHVuYyA9ICJuZXdzdGF0ZW1lbnQiOwogICAgICByZXR1cm4gImtleXdvcmQiOwogICAgfQogICAgaWYgKGJ1aWx0aW4ucHJvcGVydHlJc0VudW1lcmFibGUoY3VyKSkgewogICAgICBpZiAoYmxvY2tLZXl3b3Jkcy5wcm9wZXJ0eUlzRW51bWVyYWJsZShjdXIpKSBjdXJQdW5jID0gIm5ld3N0YXRlbWVudCI7CiAgICAgIHJldHVybiAiYnVpbHRpbiI7CiAgICB9CiAgICBpZiAoYXRvbXMucHJvcGVydHlJc0VudW1lcmFibGUoY3VyKSkgcmV0dXJuICJhdG9tIjsKICAgIHJldHVybiAidmFyaWFibGUiOwogIH0KCiAgZnVuY3Rpb24gdG9rZW5TdHJpbmcocXVvdGUpIHsKICAgIHJldHVybiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHZhciBlc2NhcGVkID0gZmFsc2UsIG5leHQsIGVuZCA9IGZhbHNlOwogICAgICB3aGlsZSAoKG5leHQgPSBzdHJlYW0ubmV4dCgpKSAhPSBudWxsKSB7CiAgICAgICAgaWYgKG5leHQgPT0gcXVvdGUgJiYgIWVzY2FwZWQpIHtlbmQgPSB0cnVlOyBicmVhazt9CiAgICAgICAgZXNjYXBlZCA9ICFlc2NhcGVkICYmIG5leHQgPT0gIlxcIjsKICAgICAgfQogICAgICBpZiAoZW5kIHx8ICEoZXNjYXBlZCB8fCBtdWx0aUxpbmVTdHJpbmdzKSkKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IG51bGw7CiAgICAgIHJldHVybiAic3RyaW5nIjsKICAgIH07CiAgfQoKICBmdW5jdGlvbiB0b2tlbkNvbW1lbnQoc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIG1heWJlRW5kID0gZmFsc2UsIGNoOwogICAgd2hpbGUgKGNoID0gc3RyZWFtLm5leHQoKSkgewogICAgICBpZiAoY2ggPT0gIi8iICYmIG1heWJlRW5kKSB7CiAgICAgICAgc3RhdGUudG9rZW5pemUgPSBudWxsOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIG1heWJlRW5kID0gKGNoID09ICIqIik7CiAgICB9CiAgICByZXR1cm4gImNvbW1lbnQiOwogIH0KCiAgZnVuY3Rpb24gQ29udGV4dChpbmRlbnRlZCwgY29sdW1uLCB0eXBlLCBhbGlnbiwgcHJldikgewogICAgdGhpcy5pbmRlbnRlZCA9IGluZGVudGVkOwogICAgdGhpcy5jb2x1bW4gPSBjb2x1bW47CiAgICB0aGlzLnR5cGUgPSB0eXBlOwogICAgdGhpcy5hbGlnbiA9IGFsaWduOwogICAgdGhpcy5wcmV2ID0gcHJldjsKICB9CiAgZnVuY3Rpb24gcHVzaENvbnRleHQoc3RhdGUsIGNvbCwgdHlwZSkgewogICAgdmFyIGluZGVudCA9IHN0YXRlLmluZGVudGVkOwogICAgaWYgKHN0YXRlLmNvbnRleHQgJiYgc3RhdGUuY29udGV4dC50eXBlID09ICJzdGF0ZW1lbnQiKQogICAgICBpbmRlbnQgPSBzdGF0ZS5jb250ZXh0LmluZGVudGVkOwogICAgcmV0dXJuIHN0YXRlLmNvbnRleHQgPSBuZXcgQ29udGV4dChpbmRlbnQsIGNvbCwgdHlwZSwgbnVsbCwgc3RhdGUuY29udGV4dCk7CiAgfQogIGZ1bmN0aW9uIHBvcENvbnRleHQoc3RhdGUpIHsKICAgIHZhciB0ID0gc3RhdGUuY29udGV4dC50eXBlOwogICAgaWYgKHQgPT0gIikiIHx8IHQgPT0gIl0iIHx8IHQgPT0gIn0iKQogICAgICBzdGF0ZS5pbmRlbnRlZCA9IHN0YXRlLmNvbnRleHQuaW5kZW50ZWQ7CiAgICByZXR1cm4gc3RhdGUuY29udGV4dCA9IHN0YXRlLmNvbnRleHQucHJldjsKICB9CgogIC8vIEludGVyZmFjZQoKICByZXR1cm4gewogICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24oYmFzZWNvbHVtbikgewogICAgICByZXR1cm4gewogICAgICAgIHRva2VuaXplOiBudWxsLAogICAgICAgIGNvbnRleHQ6IG5ldyBDb250ZXh0KChiYXNlY29sdW1uIHx8IDApIC0gaW5kZW50VW5pdCwgMCwgInRvcCIsIGZhbHNlKSwKICAgICAgICBpbmRlbnRlZDogMCwKICAgICAgICBzdGFydE9mTGluZTogdHJ1ZQogICAgICB9OwogICAgfSwKCiAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICB2YXIgY3R4ID0gc3RhdGUuY29udGV4dDsKICAgICAgaWYgKHN0cmVhbS5zb2woKSkgewogICAgICAgIGlmIChjdHguYWxpZ24gPT0gbnVsbCkgY3R4LmFsaWduID0gZmFsc2U7CiAgICAgICAgc3RhdGUuaW5kZW50ZWQgPSBzdHJlYW0uaW5kZW50YXRpb24oKTsKICAgICAgICBzdGF0ZS5zdGFydE9mTGluZSA9IHRydWU7CiAgICAgIH0KICAgICAgaWYgKHN0cmVhbS5lYXRTcGFjZSgpKSByZXR1cm4gbnVsbDsKICAgICAgY3VyUHVuYyA9IG51bGw7CiAgICAgIHZhciBzdHlsZSA9IChzdGF0ZS50b2tlbml6ZSB8fCB0b2tlbkJhc2UpKHN0cmVhbSwgc3RhdGUpOwogICAgICBpZiAoc3R5bGUgPT0gImNvbW1lbnQiIHx8IHN0eWxlID09ICJtZXRhIikgcmV0dXJuIHN0eWxlOwogICAgICBpZiAoY3R4LmFsaWduID09IG51bGwpIGN0eC5hbGlnbiA9IHRydWU7CgogICAgICBpZiAoKGN1clB1bmMgPT0gIjsiIHx8IGN1clB1bmMgPT0gIjoiIHx8IGN1clB1bmMgPT0gIiwiKSAmJiBjdHgudHlwZSA9PSAic3RhdGVtZW50IikgcG9wQ29udGV4dChzdGF0ZSk7CiAgICAgIGVsc2UgaWYgKGN1clB1bmMgPT0gInsiKSBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLmNvbHVtbigpLCAifSIpOwogICAgICBlbHNlIGlmIChjdXJQdW5jID09ICJbIikgcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbS5jb2x1bW4oKSwgIl0iKTsKICAgICAgZWxzZSBpZiAoY3VyUHVuYyA9PSAiKCIpIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0uY29sdW1uKCksICIpIik7CiAgICAgIGVsc2UgaWYgKGN1clB1bmMgPT0gIn0iKSB7CiAgICAgICAgd2hpbGUgKGN0eC50eXBlID09ICJzdGF0ZW1lbnQiKSBjdHggPSBwb3BDb250ZXh0KHN0YXRlKTsKICAgICAgICBpZiAoY3R4LnR5cGUgPT0gIn0iKSBjdHggPSBwb3BDb250ZXh0KHN0YXRlKTsKICAgICAgICB3aGlsZSAoY3R4LnR5cGUgPT0gInN0YXRlbWVudCIpIGN0eCA9IHBvcENvbnRleHQoc3RhdGUpOwogICAgICB9CiAgICAgIGVsc2UgaWYgKGN1clB1bmMgPT0gY3R4LnR5cGUpIHBvcENvbnRleHQoc3RhdGUpOwogICAgICBlbHNlIGlmICgoKGN0eC50eXBlID09ICJ9IiB8fCBjdHgudHlwZSA9PSAidG9wIikgJiYgY3VyUHVuYyAhPSAnOycpIHx8IChjdHgudHlwZSA9PSAic3RhdGVtZW50IiAmJiBjdXJQdW5jID09ICJuZXdzdGF0ZW1lbnQiKSkKICAgICAgICBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLmNvbHVtbigpLCAic3RhdGVtZW50Iik7CiAgICAgIHN0YXRlLnN0YXJ0T2ZMaW5lID0gZmFsc2U7CiAgICAgIHJldHVybiBzdHlsZTsKICAgIH0sCgogICAgaW5kZW50OiBmdW5jdGlvbihzdGF0ZSwgdGV4dEFmdGVyKSB7CiAgICAgIGlmIChzdGF0ZS50b2tlbml6ZSAhPSB0b2tlbkJhc2UgJiYgc3RhdGUudG9rZW5pemUgIT0gbnVsbCkgcmV0dXJuIENvZGVNaXJyb3IuUGFzczsKICAgICAgdmFyIGN0eCA9IHN0YXRlLmNvbnRleHQsIGZpcnN0Q2hhciA9IHRleHRBZnRlciAmJiB0ZXh0QWZ0ZXIuY2hhckF0KDApOwogICAgICBpZiAoY3R4LnR5cGUgPT0gInN0YXRlbWVudCIgJiYgZmlyc3RDaGFyID09ICJ9IikgY3R4ID0gY3R4LnByZXY7CiAgICAgIHZhciBjbG9zaW5nID0gZmlyc3RDaGFyID09IGN0eC50eXBlOwogICAgICBpZiAoY3R4LnR5cGUgPT0gInN0YXRlbWVudCIpIHJldHVybiBjdHguaW5kZW50ZWQgKyAoZmlyc3RDaGFyID09ICJ7IiA/IDAgOiBzdGF0ZW1lbnRJbmRlbnRVbml0KTsKICAgICAgZWxzZSBpZiAoY3R4LmFsaWduICYmICghZG9udEFsaWduQ2FsbHMgfHwgY3R4LnR5cGUgIT0gIikiKSkgcmV0dXJuIGN0eC5jb2x1bW4gKyAoY2xvc2luZyA/IDAgOiAxKTsKICAgICAgZWxzZSBpZiAoY3R4LnR5cGUgPT0gIikiICYmICFjbG9zaW5nKSByZXR1cm4gY3R4LmluZGVudGVkICsgc3RhdGVtZW50SW5kZW50VW5pdDsKICAgICAgZWxzZSByZXR1cm4gY3R4LmluZGVudGVkICsgKGNsb3NpbmcgPyAwIDogaW5kZW50VW5pdCk7CiAgICB9LAoKICAgIGVsZWN0cmljQ2hhcnM6ICJ7fSIsCiAgICBibG9ja0NvbW1lbnRTdGFydDogIi8qIiwKICAgIGJsb2NrQ29tbWVudEVuZDogIiovIiwKICAgIGxpbmVDb21tZW50OiAiLy8iLAogICAgZm9sZDogImJyYWNlIgogIH07Cn0pOwoKICBmdW5jdGlvbiB3b3JkcyhzdHIpIHsKICAgIHZhciBvYmogPSB7fSwgd29yZHMgPSBzdHIuc3BsaXQoIiAiKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgd29yZHMubGVuZ3RoOyArK2kpIG9ialt3b3Jkc1tpXV0gPSB0cnVlOwogICAgcmV0dXJuIG9iajsKICB9CiAgdmFyIGNLZXl3b3JkcyA9ICJhdXRvIGlmIGJyZWFrIGludCBjYXNlIGxvbmcgY2hhciByZWdpc3RlciBjb250aW51ZSByZXR1cm4gZGVmYXVsdCBzaG9ydCBkbyBzaXplb2YgIiArCiAgICAiZG91YmxlIHN0YXRpYyBlbHNlIHN0cnVjdCBlbnRyeSBzd2l0Y2ggZXh0ZXJuIHR5cGVkZWYgZmxvYXQgdW5pb24gZm9yIHVuc2lnbmVkICIgKwogICAgImdvdG8gd2hpbGUgZW51bSB2b2lkIGNvbnN0IHNpZ25lZCB2b2xhdGlsZSI7CgogIGZ1bmN0aW9uIGNwcEhvb2soc3RyZWFtLCBzdGF0ZSkgewogICAgaWYgKCFzdGF0ZS5zdGFydE9mTGluZSkgcmV0dXJuIGZhbHNlOwogICAgZm9yICg7OykgewogICAgICBpZiAoc3RyZWFtLnNraXBUbygiXFwiKSkgewogICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgaWYgKHN0cmVhbS5lb2woKSkgewogICAgICAgICAgc3RhdGUudG9rZW5pemUgPSBjcHBIb29rOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IG51bGw7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiAibWV0YSI7CiAgfQoKICBmdW5jdGlvbiBjcHAxMVN0cmluZ0hvb2soc3RyZWFtLCBzdGF0ZSkgewogICAgc3RyZWFtLmJhY2tVcCgxKTsKICAgIC8vIFJhdyBzdHJpbmdzLgogICAgaWYgKHN0cmVhbS5tYXRjaCgvKFJ8dThSfHVSfFVSfExSKS8pKSB7CiAgICAgIHZhciBtYXRjaCA9IHN0cmVhbS5tYXRjaCgvIihbXlxzXFwoKV17MCwxNn0pXCgvKTsKICAgICAgaWYgKCFtYXRjaCkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICBzdGF0ZS5jcHAxMVJhd1N0cmluZ0RlbGltID0gbWF0Y2hbMV07CiAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5SYXdTdHJpbmc7CiAgICAgIHJldHVybiB0b2tlblJhd1N0cmluZyhzdHJlYW0sIHN0YXRlKTsKICAgIH0KICAgIC8vIFVuaWNvZGUgc3RyaW5ncy9jaGFycy4KICAgIGlmIChzdHJlYW0ubWF0Y2goLyh1OHx1fFV8TCkvKSkgewogICAgICBpZiAoc3RyZWFtLm1hdGNoKC9bIiddLywgLyogZWF0ICovIGZhbHNlKSkgewogICAgICAgIHJldHVybiAic3RyaW5nIjsKICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICAvLyBJZ25vcmUgdGhpcyBob29rLgogICAgc3RyZWFtLm5leHQoKTsKICAgIHJldHVybiBmYWxzZTsKICB9CgogIC8vIEMjLXN0eWxlIHN0cmluZ3Mgd2hlcmUgIiIgZXNjYXBlcyBhIHF1b3RlLgogIGZ1bmN0aW9uIHRva2VuQXRTdHJpbmcoc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIG5leHQ7CiAgICB3aGlsZSAoKG5leHQgPSBzdHJlYW0ubmV4dCgpKSAhPSBudWxsKSB7CiAgICAgIGlmIChuZXh0ID09ICciJyAmJiAhc3RyZWFtLmVhdCgnIicpKSB7CiAgICAgICAgc3RhdGUudG9rZW5pemUgPSBudWxsOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gInN0cmluZyI7CiAgfQoKICAvLyBDKysxMSByYXcgc3RyaW5nIGxpdGVyYWwgaXMgPHByZWZpeD4iPGRlbGltPiggYW55dGhpbmcgKTxkZWxpbT4iLCB3aGVyZQogIC8vIDxkZWxpbT4gY2FuIGJlIGEgc3RyaW5nIHVwIHRvIDE2IGNoYXJhY3RlcnMgbG9uZy4KICBmdW5jdGlvbiB0b2tlblJhd1N0cmluZyhzdHJlYW0sIHN0YXRlKSB7CiAgICAvLyBFc2NhcGUgY2hhcmFjdGVycyB0aGF0IGhhdmUgc3BlY2lhbCByZWdleCBtZWFuaW5ncy4KICAgIHZhciBkZWxpbSA9IHN0YXRlLmNwcDExUmF3U3RyaW5nRGVsaW0ucmVwbGFjZSgvW15cd1xzXS9nLCAnXFwkJicpOwogICAgdmFyIG1hdGNoID0gc3RyZWFtLm1hdGNoKG5ldyBSZWdFeHAoIi4qP1xcKSIgKyBkZWxpbSArICciJykpOwogICAgaWYgKG1hdGNoKQogICAgICBzdGF0ZS50b2tlbml6ZSA9IG51bGw7CiAgICBlbHNlCiAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgIHJldHVybiAic3RyaW5nIjsKICB9CgogIGZ1bmN0aW9uIGRlZihtaW1lcywgbW9kZSkgewogICAgaWYgKHR5cGVvZiBtaW1lcyA9PSAic3RyaW5nIikgbWltZXMgPSBbbWltZXNdOwogICAgdmFyIHdvcmRzID0gW107CiAgICBmdW5jdGlvbiBhZGQob2JqKSB7CiAgICAgIGlmIChvYmopIGZvciAodmFyIHByb3AgaW4gb2JqKSBpZiAob2JqLmhhc093blByb3BlcnR5KHByb3ApKQogICAgICAgIHdvcmRzLnB1c2gocHJvcCk7CiAgICB9CiAgICBhZGQobW9kZS5rZXl3b3Jkcyk7CiAgICBhZGQobW9kZS5idWlsdGluKTsKICAgIGFkZChtb2RlLmF0b21zKTsKICAgIGlmICh3b3Jkcy5sZW5ndGgpIHsKICAgICAgbW9kZS5oZWxwZXJUeXBlID0gbWltZXNbMF07CiAgICAgIENvZGVNaXJyb3IucmVnaXN0ZXJIZWxwZXIoImhpbnRXb3JkcyIsIG1pbWVzWzBdLCB3b3Jkcyk7CiAgICB9CgogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtaW1lcy5sZW5ndGg7ICsraSkKICAgICAgQ29kZU1pcnJvci5kZWZpbmVNSU1FKG1pbWVzW2ldLCBtb2RlKTsKICB9CgogIGRlZihbInRleHQveC1jc3JjIiwgInRleHQveC1jIiwgInRleHQveC1jaGRyIl0sIHsKICAgIG5hbWU6ICJjbGlrZSIsCiAgICBrZXl3b3Jkczogd29yZHMoY0tleXdvcmRzKSwKICAgIGJsb2NrS2V5d29yZHM6IHdvcmRzKCJjYXNlIGRvIGVsc2UgZm9yIGlmIHN3aXRjaCB3aGlsZSBzdHJ1Y3QiKSwKICAgIGF0b21zOiB3b3JkcygibnVsbCIpLAogICAgaG9va3M6IHsiIyI6IGNwcEhvb2t9LAogICAgbW9kZVByb3BzOiB7Zm9sZDogWyJicmFjZSIsICJpbmNsdWRlIl19CiAgfSk7CgogIGRlZihbInRleHQveC1jKytzcmMiLCAidGV4dC94LWMrK2hkciJdLCB7CiAgICBuYW1lOiAiY2xpa2UiLAogICAga2V5d29yZHM6IHdvcmRzKGNLZXl3b3JkcyArICIgYXNtIGR5bmFtaWNfY2FzdCBuYW1lc3BhY2UgcmVpbnRlcnByZXRfY2FzdCB0cnkgYm9vbCBleHBsaWNpdCBuZXcgIiArCiAgICAgICAgICAgICAgICAgICAgInN0YXRpY19jYXN0IHR5cGVpZCBjYXRjaCBvcGVyYXRvciB0ZW1wbGF0ZSB0eXBlbmFtZSBjbGFzcyBmcmllbmQgcHJpdmF0ZSAiICsKICAgICAgICAgICAgICAgICAgICAidGhpcyB1c2luZyBjb25zdF9jYXN0IGlubGluZSBwdWJsaWMgdGhyb3cgdmlydHVhbCBkZWxldGUgbXV0YWJsZSBwcm90ZWN0ZWQgIiArCiAgICAgICAgICAgICAgICAgICAgIndjaGFyX3QgYWxpZ25hcyBhbGlnbm9mIGNvbnN0ZXhwciBkZWNsdHlwZSBudWxscHRyIG5vZXhjZXB0IHRocmVhZF9sb2NhbCBmaW5hbCAiICsKICAgICAgICAgICAgICAgICAgICAic3RhdGljX2Fzc2VydCBvdmVycmlkZSIpLAogICAgYmxvY2tLZXl3b3Jkczogd29yZHMoImNhdGNoIGNsYXNzIGRvIGVsc2UgZmluYWxseSBmb3IgaWYgc3RydWN0IHN3aXRjaCB0cnkgd2hpbGUiKSwKICAgIGF0b21zOiB3b3JkcygidHJ1ZSBmYWxzZSBudWxsIiksCiAgICBob29rczogewogICAgICAiIyI6IGNwcEhvb2ssCiAgICAgICJ1IjogY3BwMTFTdHJpbmdIb29rLAogICAgICAiVSI6IGNwcDExU3RyaW5nSG9vaywKICAgICAgIkwiOiBjcHAxMVN0cmluZ0hvb2ssCiAgICAgICJSIjogY3BwMTFTdHJpbmdIb29rCiAgICB9LAogICAgbW9kZVByb3BzOiB7Zm9sZDogWyJicmFjZSIsICJpbmNsdWRlIl19CiAgfSk7CiAgZGVmKCJ0ZXh0L3gtamF2YSIsIHsKICAgIG5hbWU6ICJjbGlrZSIsCiAgICBrZXl3b3Jkczogd29yZHMoImFic3RyYWN0IGFzc2VydCBib29sZWFuIGJyZWFrIGJ5dGUgY2FzZSBjYXRjaCBjaGFyIGNsYXNzIGNvbnN0IGNvbnRpbnVlIGRlZmF1bHQgIiArCiAgICAgICAgICAgICAgICAgICAgImRvIGRvdWJsZSBlbHNlIGVudW0gZXh0ZW5kcyBmaW5hbCBmaW5hbGx5IGZsb2F0IGZvciBnb3RvIGlmIGltcGxlbWVudHMgaW1wb3J0ICIgKwogICAgICAgICAgICAgICAgICAgICJpbnN0YW5jZW9mIGludCBpbnRlcmZhY2UgbG9uZyBuYXRpdmUgbmV3IHBhY2thZ2UgcHJpdmF0ZSBwcm90ZWN0ZWQgcHVibGljICIgKwogICAgICAgICAgICAgICAgICAgICJyZXR1cm4gc2hvcnQgc3RhdGljIHN0cmljdGZwIHN1cGVyIHN3aXRjaCBzeW5jaHJvbml6ZWQgdGhpcyB0aHJvdyB0aHJvd3MgdHJhbnNpZW50ICIgKwogICAgICAgICAgICAgICAgICAgICJ0cnkgdm9pZCB2b2xhdGlsZSB3aGlsZSIpLAogICAgYmxvY2tLZXl3b3Jkczogd29yZHMoImNhdGNoIGNsYXNzIGRvIGVsc2UgZmluYWxseSBmb3IgaWYgc3dpdGNoIHRyeSB3aGlsZSIpLAogICAgYXRvbXM6IHdvcmRzKCJ0cnVlIGZhbHNlIG51bGwiKSwKICAgIGhvb2tzOiB7CiAgICAgICJAIjogZnVuY3Rpb24oc3RyZWFtKSB7CiAgICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXHdcJF9dLyk7CiAgICAgICAgcmV0dXJuICJtZXRhIjsKICAgICAgfQogICAgfSwKICAgIG1vZGVQcm9wczoge2ZvbGQ6IFsiYnJhY2UiLCAiaW1wb3J0Il19CiAgfSk7CiAgZGVmKCJ0ZXh0L3gtY3NoYXJwIiwgewogICAgbmFtZTogImNsaWtlIiwKICAgIGtleXdvcmRzOiB3b3JkcygiYWJzdHJhY3QgYXMgYmFzZSBicmVhayBjYXNlIGNhdGNoIGNoZWNrZWQgY2xhc3MgY29uc3QgY29udGludWUiICsKICAgICAgICAgICAgICAgICAgICAiIGRlZmF1bHQgZGVsZWdhdGUgZG8gZWxzZSBlbnVtIGV2ZW50IGV4cGxpY2l0IGV4dGVybiBmaW5hbGx5IGZpeGVkIGZvciIgKwogICAgICAgICAgICAgICAgICAgICIgZm9yZWFjaCBnb3RvIGlmIGltcGxpY2l0IGluIGludGVyZmFjZSBpbnRlcm5hbCBpcyBsb2NrIG5hbWVzcGFjZSBuZXciICsKICAgICAgICAgICAgICAgICAgICAiIG9wZXJhdG9yIG91dCBvdmVycmlkZSBwYXJhbXMgcHJpdmF0ZSBwcm90ZWN0ZWQgcHVibGljIHJlYWRvbmx5IHJlZiByZXR1cm4gc2VhbGVkIiArCiAgICAgICAgICAgICAgICAgICAgIiBzaXplb2Ygc3RhY2thbGxvYyBzdGF0aWMgc3RydWN0IHN3aXRjaCB0aGlzIHRocm93IHRyeSB0eXBlb2YgdW5jaGVja2VkIiArCiAgICAgICAgICAgICAgICAgICAgIiB1bnNhZmUgdXNpbmcgdmlydHVhbCB2b2lkIHZvbGF0aWxlIHdoaWxlIGFkZCBhbGlhcyBhc2NlbmRpbmcgZGVzY2VuZGluZyBkeW5hbWljIGZyb20gZ2V0IiArCiAgICAgICAgICAgICAgICAgICAgIiBnbG9iYWwgZ3JvdXAgaW50byBqb2luIGxldCBvcmRlcmJ5IHBhcnRpYWwgcmVtb3ZlIHNlbGVjdCBzZXQgdmFsdWUgdmFyIHlpZWxkIiksCiAgICBibG9ja0tleXdvcmRzOiB3b3JkcygiY2F0Y2ggY2xhc3MgZG8gZWxzZSBmaW5hbGx5IGZvciBmb3JlYWNoIGlmIHN0cnVjdCBzd2l0Y2ggdHJ5IHdoaWxlIiksCiAgICBidWlsdGluOiB3b3JkcygiQm9vbGVhbiBCeXRlIENoYXIgRGF0ZVRpbWUgRGF0ZVRpbWVPZmZzZXQgRGVjaW1hbCBEb3VibGUiICsKICAgICAgICAgICAgICAgICAgICAiIEd1aWQgSW50MTYgSW50MzIgSW50NjQgT2JqZWN0IFNCeXRlIFNpbmdsZSBTdHJpbmcgVGltZVNwYW4gVUludDE2IFVJbnQzMiIgKwogICAgICAgICAgICAgICAgICAgICIgVUludDY0IGJvb2wgYnl0ZSBjaGFyIGRlY2ltYWwgZG91YmxlIHNob3J0IGludCBsb25nIG9iamVjdCIgICsKICAgICAgICAgICAgICAgICAgICAiIHNieXRlIGZsb2F0IHN0cmluZyB1c2hvcnQgdWludCB1bG9uZyIpLAogICAgYXRvbXM6IHdvcmRzKCJ0cnVlIGZhbHNlIG51bGwiKSwKICAgIGhvb2tzOiB7CiAgICAgICJAIjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICAgIGlmIChzdHJlYW0uZWF0KCciJykpIHsKICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5BdFN0cmluZzsKICAgICAgICAgIHJldHVybiB0b2tlbkF0U3RyaW5nKHN0cmVhbSwgc3RhdGUpOwogICAgICAgIH0KICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcd1wkX10vKTsKICAgICAgICByZXR1cm4gIm1ldGEiOwogICAgICB9CiAgICB9CiAgfSk7CiAgZGVmKCJ0ZXh0L3gtc2NhbGEiLCB7CiAgICBuYW1lOiAiY2xpa2UiLAogICAga2V5d29yZHM6IHdvcmRzKAoKICAgICAgLyogc2NhbGEgKi8KICAgICAgImFic3RyYWN0IGNhc2UgY2F0Y2ggY2xhc3MgZGVmIGRvIGVsc2UgZXh0ZW5kcyBmYWxzZSBmaW5hbCBmaW5hbGx5IGZvciBmb3JTb21lIGlmICIgKwogICAgICAiaW1wbGljaXQgaW1wb3J0IGxhenkgbWF0Y2ggbmV3IG51bGwgb2JqZWN0IG92ZXJyaWRlIHBhY2thZ2UgcHJpdmF0ZSBwcm90ZWN0ZWQgcmV0dXJuICIgKwogICAgICAic2VhbGVkIHN1cGVyIHRoaXMgdGhyb3cgdHJhaXQgdHJ5IHRyeWUgdHlwZSB2YWwgdmFyIHdoaWxlIHdpdGggeWllbGQgXyA6ID0gPT4gPC0gPDogIiArCiAgICAgICI8JSA+OiAjIEAgIiArCgogICAgICAvKiBwYWNrYWdlIHNjYWxhICovCiAgICAgICJhc3NlcnQgYXNzdW1lIHJlcXVpcmUgcHJpbnQgcHJpbnRsbiBwcmludGYgcmVhZExpbmUgcmVhZEJvb2xlYW4gcmVhZEJ5dGUgcmVhZFNob3J0ICIgKwogICAgICAicmVhZENoYXIgcmVhZEludCByZWFkTG9uZyByZWFkRmxvYXQgcmVhZERvdWJsZSAiICsKCiAgICAgICJBbnlWYWwgQXBwIEFwcGxpY2F0aW9uIEFycmF5IEJ1ZmZlcmVkSXRlcmF0b3IgQmlnRGVjaW1hbCBCaWdJbnQgQ2hhciBDb25zb2xlIEVpdGhlciAiICsKICAgICAgIkVudW1lcmF0aW9uIEVxdWl2IEVycm9yIEV4Y2VwdGlvbiBGcmFjdGlvbmFsIEZ1bmN0aW9uIEluZGV4ZWRTZXEgSW50ZWdyYWwgSXRlcmFibGUgIiArCiAgICAgICJJdGVyYXRvciBMaXN0IE1hcCBOdW1lcmljIE5pbCBOb3ROdWxsIE9wdGlvbiBPcmRlcmVkIE9yZGVyaW5nIFBhcnRpYWxGdW5jdGlvbiBQYXJ0aWFsT3JkZXJpbmcgIiArCiAgICAgICJQcm9kdWN0IFByb3h5IFJhbmdlIFJlc3BvbmRlciBTZXEgU2VyaWFsaXphYmxlIFNldCBTcGVjaWFsaXphYmxlIFN0cmVhbSBTdHJpbmdCdWlsZGVyICIgKwogICAgICAiU3RyaW5nQ29udGV4dCBTeW1ib2wgVGhyb3dhYmxlIFRyYXZlcnNhYmxlIFRyYXZlcnNhYmxlT25jZSBUdXBsZSBVbml0IFZlY3RvciA6OiAjOjogIiArCgogICAgICAvKiBwYWNrYWdlIGphdmEubGFuZyAqLwogICAgICAiQm9vbGVhbiBCeXRlIENoYXJhY3RlciBDaGFyU2VxdWVuY2UgQ2xhc3MgQ2xhc3NMb2FkZXIgQ2xvbmVhYmxlIENvbXBhcmFibGUgIiArCiAgICAgICJDb21waWxlciBEb3VibGUgRXhjZXB0aW9uIEZsb2F0IEludGVnZXIgTG9uZyBNYXRoIE51bWJlciBPYmplY3QgUGFja2FnZSBQYWlyIFByb2Nlc3MgIiArCiAgICAgICJSdW50aW1lIFJ1bm5hYmxlIFNlY3VyaXR5TWFuYWdlciBTaG9ydCBTdGFja1RyYWNlRWxlbWVudCBTdHJpY3RNYXRoIFN0cmluZyAiICsKICAgICAgIlN0cmluZ0J1ZmZlciBTeXN0ZW0gVGhyZWFkIFRocmVhZEdyb3VwIFRocmVhZExvY2FsIFRocm93YWJsZSBUcmlwbGUgVm9pZCIKCgogICAgKSwKICAgIG11bHRpTGluZVN0cmluZ3M6IHRydWUsCiAgICBibG9ja0tleXdvcmRzOiB3b3JkcygiY2F0Y2ggY2xhc3MgZG8gZWxzZSBmaW5hbGx5IGZvciBmb3JTb21lIGlmIG1hdGNoIHN3aXRjaCB0cnkgd2hpbGUiKSwKICAgIGF0b21zOiB3b3JkcygidHJ1ZSBmYWxzZSBudWxsIiksCiAgICBob29rczogewogICAgICAiQCI6IGZ1bmN0aW9uKHN0cmVhbSkgewogICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1x3XCRfXS8pOwogICAgICAgIHJldHVybiAibWV0YSI7CiAgICAgIH0KICAgIH0KICB9KTsKICBkZWYoWyJ4LXNoYWRlci94LXZlcnRleCIsICJ4LXNoYWRlci94LWZyYWdtZW50Il0sIHsKICAgIG5hbWU6ICJjbGlrZSIsCiAgICBrZXl3b3Jkczogd29yZHMoImZsb2F0IGludCBib29sIHZvaWQgIiArCiAgICAgICAgICAgICAgICAgICAgInZlYzIgdmVjMyB2ZWM0IGl2ZWMyIGl2ZWMzIGl2ZWM0IGJ2ZWMyIGJ2ZWMzIGJ2ZWM0ICIgKwogICAgICAgICAgICAgICAgICAgICJtYXQyIG1hdDMgbWF0NCAiICsKICAgICAgICAgICAgICAgICAgICAic2FtcGxlcjFEIHNhbXBsZXIyRCBzYW1wbGVyM0Qgc2FtcGxlckN1YmUgIiArCiAgICAgICAgICAgICAgICAgICAgInNhbXBsZXIxRFNoYWRvdyBzYW1wbGVyMkRTaGFkb3ciICsKICAgICAgICAgICAgICAgICAgICAiY29uc3QgYXR0cmlidXRlIHVuaWZvcm0gdmFyeWluZyAiICsKICAgICAgICAgICAgICAgICAgICAiYnJlYWsgY29udGludWUgZGlzY2FyZCByZXR1cm4gIiArCiAgICAgICAgICAgICAgICAgICAgImZvciB3aGlsZSBkbyBpZiBlbHNlIHN0cnVjdCAiICsKICAgICAgICAgICAgICAgICAgICAiaW4gb3V0IGlub3V0IiksCiAgICBibG9ja0tleXdvcmRzOiB3b3JkcygiZm9yIHdoaWxlIGRvIGlmIGVsc2Ugc3RydWN0IiksCiAgICBidWlsdGluOiB3b3JkcygicmFkaWFucyBkZWdyZWVzIHNpbiBjb3MgdGFuIGFzaW4gYWNvcyBhdGFuICIgKwogICAgICAgICAgICAgICAgICAgICJwb3cgZXhwIGxvZyBleHAyIHNxcnQgaW52ZXJzZXNxcnQgIiArCiAgICAgICAgICAgICAgICAgICAgImFicyBzaWduIGZsb29yIGNlaWwgZnJhY3QgbW9kIG1pbiBtYXggY2xhbXAgbWl4IHN0ZXAgc21vb3RzdGVwICIgKwogICAgICAgICAgICAgICAgICAgICJsZW5ndGggZGlzdGFuY2UgZG90IGNyb3NzIG5vcm1hbGl6ZSBmdHJhbnNmb3JtIGZhY2Vmb3J3YXJkICIgKwogICAgICAgICAgICAgICAgICAgICJyZWZsZWN0IHJlZnJhY3QgbWF0cml4Q29tcE11bHQgIiArCiAgICAgICAgICAgICAgICAgICAgImxlc3NUaGFuIGxlc3NUaGFuRXF1YWwgZ3JlYXRlclRoYW4gZ3JlYXRlclRoYW5FcXVhbCAiICsKICAgICAgICAgICAgICAgICAgICAiZXF1YWwgbm90RXF1YWwgYW55IGFsbCBub3QgIiArCiAgICAgICAgICAgICAgICAgICAgInRleHR1cmUxRCB0ZXh0dXJlMURQcm9qIHRleHR1cmUxRExvZCB0ZXh0dXJlMURQcm9qTG9kICIgKwogICAgICAgICAgICAgICAgICAgICJ0ZXh0dXJlMkQgdGV4dHVyZTJEUHJvaiB0ZXh0dXJlMkRMb2QgdGV4dHVyZTJEUHJvakxvZCAiICsKICAgICAgICAgICAgICAgICAgICAidGV4dHVyZTNEIHRleHR1cmUzRFByb2ogdGV4dHVyZTNETG9kIHRleHR1cmUzRFByb2pMb2QgIiArCiAgICAgICAgICAgICAgICAgICAgInRleHR1cmVDdWJlIHRleHR1cmVDdWJlTG9kICIgKwogICAgICAgICAgICAgICAgICAgICJzaGFkb3cxRCBzaGFkb3cyRCBzaGFkb3cxRFByb2ogc2hhZG93MkRQcm9qICIgKwogICAgICAgICAgICAgICAgICAgICJzaGFkb3cxRExvZCBzaGFkb3cyRExvZCBzaGFkb3cxRFByb2pMb2Qgc2hhZG93MkRQcm9qTG9kICIgKwogICAgICAgICAgICAgICAgICAgICJkRmR4IGRGZHkgZndpZHRoICIgKwogICAgICAgICAgICAgICAgICAgICJub2lzZTEgbm9pc2UyIG5vaXNlMyBub2lzZTQiKSwKICAgIGF0b21zOiB3b3JkcygidHJ1ZSBmYWxzZSAiICsKICAgICAgICAgICAgICAgICJnbF9GcmFnQ29sb3IgZ2xfU2Vjb25kYXJ5Q29sb3IgZ2xfTm9ybWFsIGdsX1ZlcnRleCAiICsKICAgICAgICAgICAgICAgICJnbF9NdWx0aVRleENvb3JkMCBnbF9NdWx0aVRleENvb3JkMSBnbF9NdWx0aVRleENvb3JkMiBnbF9NdWx0aVRleENvb3JkMyAiICsKICAgICAgICAgICAgICAgICJnbF9NdWx0aVRleENvb3JkNCBnbF9NdWx0aVRleENvb3JkNSBnbF9NdWx0aVRleENvb3JkNiBnbF9NdWx0aVRleENvb3JkNyAiICsKICAgICAgICAgICAgICAgICJnbF9Gb2dDb29yZCAiICsKICAgICAgICAgICAgICAgICJnbF9Qb3NpdGlvbiBnbF9Qb2ludFNpemUgZ2xfQ2xpcFZlcnRleCAiICsKICAgICAgICAgICAgICAgICJnbF9Gcm9udENvbG9yIGdsX0JhY2tDb2xvciBnbF9Gcm9udFNlY29uZGFyeUNvbG9yIGdsX0JhY2tTZWNvbmRhcnlDb2xvciAiICsKICAgICAgICAgICAgICAgICJnbF9UZXhDb29yZCBnbF9Gb2dGcmFnQ29vcmQgIiArCiAgICAgICAgICAgICAgICAiZ2xfRnJhZ0Nvb3JkIGdsX0Zyb250RmFjaW5nICIgKwogICAgICAgICAgICAgICAgImdsX0ZyYWdDb2xvciBnbF9GcmFnRGF0YSBnbF9GcmFnRGVwdGggIiArCiAgICAgICAgICAgICAgICAiZ2xfTW9kZWxWaWV3TWF0cml4IGdsX1Byb2plY3Rpb25NYXRyaXggZ2xfTW9kZWxWaWV3UHJvamVjdGlvbk1hdHJpeCAiICsKICAgICAgICAgICAgICAgICJnbF9UZXh0dXJlTWF0cml4IGdsX05vcm1hbE1hdHJpeCBnbF9Nb2RlbFZpZXdNYXRyaXhJbnZlcnNlICIgKwogICAgICAgICAgICAgICAgImdsX1Byb2plY3Rpb25NYXRyaXhJbnZlcnNlIGdsX01vZGVsVmlld1Byb2plY3Rpb25NYXRyaXhJbnZlcnNlICIgKwogICAgICAgICAgICAgICAgImdsX1RleHVyZU1hdHJpeFRyYW5zcG9zZSBnbF9Nb2RlbFZpZXdNYXRyaXhJbnZlcnNlVHJhbnNwb3NlICIgKwogICAgICAgICAgICAgICAgImdsX1Byb2plY3Rpb25NYXRyaXhJbnZlcnNlVHJhbnNwb3NlICIgKwogICAgICAgICAgICAgICAgImdsX01vZGVsVmlld1Byb2plY3Rpb25NYXRyaXhJbnZlcnNlVHJhbnNwb3NlICIgKwogICAgICAgICAgICAgICAgImdsX1RleHR1cmVNYXRyaXhJbnZlcnNlVHJhbnNwb3NlICIgKwogICAgICAgICAgICAgICAgImdsX05vcm1hbFNjYWxlIGdsX0RlcHRoUmFuZ2UgZ2xfQ2xpcFBsYW5lICIgKwogICAgICAgICAgICAgICAgImdsX1BvaW50IGdsX0Zyb250TWF0ZXJpYWwgZ2xfQmFja01hdGVyaWFsIGdsX0xpZ2h0U291cmNlIGdsX0xpZ2h0TW9kZWwgIiArCiAgICAgICAgICAgICAgICAiZ2xfRnJvbnRMaWdodE1vZGVsUHJvZHVjdCBnbF9CYWNrTGlnaHRNb2RlbFByb2R1Y3QgIiArCiAgICAgICAgICAgICAgICAiZ2xfVGV4dHVyZUNvbG9yIGdsX0V5ZVBsYW5lUyBnbF9FeWVQbGFuZVQgZ2xfRXllUGxhbmVSIGdsX0V5ZVBsYW5lUSAiICsKICAgICAgICAgICAgICAgICJnbF9Gb2dQYXJhbWV0ZXJzICIgKwogICAgICAgICAgICAgICAgImdsX01heExpZ2h0cyBnbF9NYXhDbGlwUGxhbmVzIGdsX01heFRleHR1cmVVbml0cyBnbF9NYXhUZXh0dXJlQ29vcmRzICIgKwogICAgICAgICAgICAgICAgImdsX01heFZlcnRleEF0dHJpYnMgZ2xfTWF4VmVydGV4VW5pZm9ybUNvbXBvbmVudHMgZ2xfTWF4VmFyeWluZ0Zsb2F0cyAiICsKICAgICAgICAgICAgICAgICJnbF9NYXhWZXJ0ZXhUZXh0dXJlSW1hZ2VVbml0cyBnbF9NYXhUZXh0dXJlSW1hZ2VVbml0cyAiICsKICAgICAgICAgICAgICAgICJnbF9NYXhGcmFnbWVudFVuaWZvcm1Db21wb25lbnRzIGdsX01heENvbWJpbmVUZXh0dXJlSW1hZ2VVbml0cyAiICsKICAgICAgICAgICAgICAgICJnbF9NYXhEcmF3QnVmZmVycyIpLAogICAgaG9va3M6IHsiIyI6IGNwcEhvb2t9LAogICAgbW9kZVByb3BzOiB7Zm9sZDogWyJicmFjZSIsICJpbmNsdWRlIl19CiAgfSk7Cgp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/clike/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogQy1saWtlIG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vLi4vYWRkb24vZWRpdC9tYXRjaGJyYWNrZXRzLmpzIj48L3NjcmlwdD4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9hZGRvbi9oaW50L3Nob3ctaGludC5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vYWRkb24vaGludC9zaG93LWhpbnQuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iY2xpa2UuanMiPjwvc2NyaXB0Pgo8c3R5bGU+LkNvZGVNaXJyb3Ige2JvcmRlcjogMnB4IGluc2V0ICNkZWU7fTwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGltZyBpZD1sb2dvIHNyYz0iLi4vLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+TGFuZ3VhZ2UgbW9kZXM8L2E+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPkMtbGlrZTwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+Qy1saWtlIG1vZGU8L2gyPgoKPGRpdj48dGV4dGFyZWEgaWQ9ImMtY29kZSI+Ci8qIEMgZGVtbyBjb2RlICovCgojaW5jbHVkZSA8em1xLmg+CiNpbmNsdWRlIDxwdGhyZWFkLmg+CiNpbmNsdWRlIDxzZW1hcGhvcmUuaD4KI2luY2x1ZGUgPHRpbWUuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxmY250bC5oPgojaW5jbHVkZSA8bWFsbG9jLmg+Cgp0eXBlZGVmIHN0cnVjdCB7CiAgdm9pZCogYXJnX3NvY2tldDsKICB6bXFfbXNnX3QqIGFyZ19tc2c7CiAgY2hhciogYXJnX3N0cmluZzsKICB1bnNpZ25lZCBsb25nIGFyZ19sZW47CiAgaW50IGFyZ19pbnQsIGFyZ19jb21tYW5kOwoKICBpbnQgc2lnbmFsX2ZkOwogIGludCBwYWQ7CiAgdm9pZCogY29udGV4dDsKICBzZW1fdCBzZW07Cn0gYWNsX3ptcV9jb250ZXh0OwoKI2RlZmluZSBwKFgpIChjb250ZXh0LT5hcmdfIyNYKQoKdm9pZCogem1xX3RocmVhZCh2b2lkKiBjb250ZXh0X3BvaW50ZXIpIHsKICBhY2xfem1xX2NvbnRleHQqIGNvbnRleHQgPSAoYWNsX3ptcV9jb250ZXh0Kiljb250ZXh0X3BvaW50ZXI7CiAgY2hhciBvayA9ICdLJywgZXJyID0gJ1gnOwogIGludCByZXM7CgogIHdoaWxlICgxKSB7CiAgICB3aGlsZSAoKHJlcyA9IHNlbV93YWl0KCZhbXA7Y29udGV4dC0+c2VtKSkgPT0gRUlOVFIpOwogICAgaWYgKHJlcykge3dyaXRlKGNvbnRleHQtPnNpZ25hbF9mZCwgJmFtcDtlcnIsIDEpOyBnb3RvIGNsZWFudXA7fQogICAgc3dpdGNoKHAoY29tbWFuZCkpIHsKICAgIGNhc2UgMDogZ290byBjbGVhbnVwOwogICAgY2FzZSAxOiBwKHNvY2tldCkgPSB6bXFfc29ja2V0KGNvbnRleHQtPmNvbnRleHQsIHAoaW50KSk7IGJyZWFrOwogICAgY2FzZSAyOiBwKGludCkgPSB6bXFfY2xvc2UocChzb2NrZXQpKTsgYnJlYWs7CiAgICBjYXNlIDM6IHAoaW50KSA9IHptcV9iaW5kKHAoc29ja2V0KSwgcChzdHJpbmcpKTsgYnJlYWs7CiAgICBjYXNlIDQ6IHAoaW50KSA9IHptcV9jb25uZWN0KHAoc29ja2V0KSwgcChzdHJpbmcpKTsgYnJlYWs7CiAgICBjYXNlIDU6IHAoaW50KSA9IHptcV9nZXRzb2Nrb3B0KHAoc29ja2V0KSwgcChpbnQpLCAodm9pZCopcChzdHJpbmcpLCAmYW1wO3AobGVuKSk7IGJyZWFrOwogICAgY2FzZSA2OiBwKGludCkgPSB6bXFfc2V0c29ja29wdChwKHNvY2tldCksIHAoaW50KSwgKHZvaWQqKXAoc3RyaW5nKSwgcChsZW4pKTsgYnJlYWs7CiAgICBjYXNlIDc6IHAoaW50KSA9IHptcV9zZW5kKHAoc29ja2V0KSwgcChtc2cpLCBwKGludCkpOyBicmVhazsKICAgIGNhc2UgODogcChpbnQpID0gem1xX3JlY3YocChzb2NrZXQpLCBwKG1zZyksIHAoaW50KSk7IGJyZWFrOwogICAgY2FzZSA5OiBwKGludCkgPSB6bXFfcG9sbChwKHNvY2tldCksIHAoaW50KSwgcChsZW4pKTsgYnJlYWs7CiAgICB9CiAgICBwKGNvbW1hbmQpID0gZXJybm87CiAgICB3cml0ZShjb250ZXh0LT5zaWduYWxfZmQsICZhbXA7b2ssIDEpOwogIH0KIGNsZWFudXA6CiAgY2xvc2UoY29udGV4dC0+c2lnbmFsX2ZkKTsKICBmcmVlKGNvbnRleHRfcG9pbnRlcik7CiAgcmV0dXJuIDA7Cn0KCnZvaWQqIHptcV90aHJlYWRfaW5pdCh2b2lkKiB6bXFfY29udGV4dCwgaW50IHNpZ25hbF9mZCkgewogIGFjbF96bXFfY29udGV4dCogY29udGV4dCA9IG1hbGxvYyhzaXplb2YoYWNsX3ptcV9jb250ZXh0KSk7CiAgcHRocmVhZF90IHRocmVhZDsKCiAgY29udGV4dC0+Y29udGV4dCA9IHptcV9jb250ZXh0OwogIGNvbnRleHQtPnNpZ25hbF9mZCA9IHNpZ25hbF9mZDsKICBzZW1faW5pdCgmYW1wO2NvbnRleHQtPnNlbSwgMSwgMCk7CiAgcHRocmVhZF9jcmVhdGUoJmFtcDt0aHJlYWQsIDAsICZhbXA7em1xX3RocmVhZCwgY29udGV4dCk7CiAgcHRocmVhZF9kZXRhY2godGhyZWFkKTsKICByZXR1cm4gY29udGV4dDsKfQo8L3RleHRhcmVhPjwvZGl2PgoKPGgyPkMrKyBleGFtcGxlPC9oMj4KCjxkaXY+PHRleHRhcmVhIGlkPSJjcHAtY29kZSI+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgIm15c3R1ZmYvdXRpbC5oIgoKbmFtZXNwYWNlIHsKZW51bSBFbnVtIHsKICBWQUwxLCBWQUwyLCBWQUwzCn07CgpjaGFyMzJfdCB1bmljb2RlX3N0cmluZyA9IFUiXFUwMDEwRkZGRiI7CnN0cmluZyByYXdfc3RyaW5nID0gUiJkZWxpbShhbnl0aGluZwp5b3UKd2FudClkZWxpbSI7CgppbnQgSGVscGVyKGNvbnN0IE15VHlwZSYgcGFyYW0pIHsKICByZXR1cm4gMDsKfQp9IC8vIG5hbWVzcGFjZQoKY2xhc3MgRm9yd2FyZERlYzsKCnRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBWPgpjbGFzcyBDbGFzcyA6IHB1YmxpYyBCYXNlQ2xhc3MgewogIGNvbnN0IE15VHlwZTxULCBWPiBtZW1iZXJfOwoKIHB1YmxpYzoKICBjb25zdCBNeVR5cGU8VCwgVj4mIE1ldGhvZCgpIGNvbnN0IHsKICAgIHJldHVybiBtZW1iZXJfOwogIH0KCiAgdm9pZCBNZXRob2QyKE15VHlwZTxULCBWPiogdmFsdWUpOwp9Cgp0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVj4Kdm9pZCBDbGFzczo6TWV0aG9kMihNeVR5cGU8VCwgVj4qIHZhbHVlKSB7CiAgc3RkOjpvdXQgPDwgMSA+PiBtZXRob2QoKTsKICB2YWx1ZS0+TWV0aG9kMyhtZW1iZXJfKTsKICBtZW1iZXJfID0gdmFsdWU7Cn0KPC90ZXh0YXJlYT48L2Rpdj4KCjxoMj5KYXZhIGV4YW1wbGU8L2gyPgoKPGRpdj48dGV4dGFyZWEgaWQ9ImphdmEtY29kZSI+CmltcG9ydCBjb20uZGVtby51dGlsLk15VHlwZTsKaW1wb3J0IGNvbS5kZW1vLnV0aWwuTXlJbnRlcmZhY2U7CgpwdWJsaWMgZW51bSBFbnVtIHsKICBWQUwxLCBWQUwyLCBWQUwzCn0KCnB1YmxpYyBjbGFzcyBDbGFzczxULCBWPiBpbXBsZW1lbnRzIE15SW50ZXJmYWNlIHsKICBwdWJsaWMgc3RhdGljIGZpbmFsIE15VHlwZTxULCBWPiBtZW1iZXI7CiAgCiAgcHJpdmF0ZSBjbGFzcyBJbm5lckNsYXNzIHsKICAgIHB1YmxpYyBpbnQgemVybygpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9CiAgfQoKICBAT3ZlcnJpZGUKICBwdWJsaWMgTXlUeXBlIG1ldGhvZCgpIHsKICAgIHJldHVybiBtZW1iZXI7CiAgfQoKICBwdWJsaWMgdm9pZCBtZXRob2QyKE15VHlwZTxULCBWPiB2YWx1ZSkgewogICAgbWV0aG9kKCk7CiAgICB2YWx1ZS5tZXRob2QzKCk7CiAgICBtZW1iZXIgPSB2YWx1ZTsKICB9Cn0KPC90ZXh0YXJlYT48L2Rpdj4KCiAgICA8c2NyaXB0PgogICAgICB2YXIgY0VkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjLWNvZGUiKSwgewogICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgICAgIG1hdGNoQnJhY2tldHM6IHRydWUsCiAgICAgICAgbW9kZTogInRleHQveC1jc3JjIgogICAgICB9KTsKICAgICAgdmFyIGNwcEVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjcHAtY29kZSIpLCB7CiAgICAgICAgbGluZU51bWJlcnM6IHRydWUsCiAgICAgICAgbWF0Y2hCcmFja2V0czogdHJ1ZSwKICAgICAgICBtb2RlOiAidGV4dC94LWMrK3NyYyIKICAgICAgfSk7CiAgICAgIHZhciBqYXZhRWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImphdmEtY29kZSIpLCB7CiAgICAgICAgbGluZU51bWJlcnM6IHRydWUsCiAgICAgICAgbWF0Y2hCcmFja2V0czogdHJ1ZSwKICAgICAgICBtb2RlOiAidGV4dC94LWphdmEiCiAgICAgIH0pOwogICAgICB2YXIgbWFjID0gQ29kZU1pcnJvci5rZXlNYXAuZGVmYXVsdCA9PSBDb2RlTWlycm9yLmtleU1hcC5tYWNEZWZhdWx0OwogICAgICBDb2RlTWlycm9yLmtleU1hcC5kZWZhdWx0WyhtYWMgPyAiQ21kIiA6ICJDdHJsIikgKyAiLVNwYWNlIl0gPSAiYXV0b2NvbXBsZXRlIjsKICAgIDwvc2NyaXB0PgoKICAgIDxwPlNpbXBsZSBtb2RlIHRoYXQgdHJpZXMgdG8gaGFuZGxlIEMtbGlrZSBsYW5ndWFnZXMgYXMgd2VsbCBhcyBpdAogICAgY2FuLiBUYWtlcyB0d28gY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzOiA8Y29kZT5rZXl3b3JkczwvY29kZT4sIGFuCiAgICBvYmplY3Qgd2hvc2UgcHJvcGVydHkgbmFtZXMgYXJlIHRoZSBrZXl3b3JkcyBpbiB0aGUgbGFuZ3VhZ2UsCiAgICBhbmQgPGNvZGU+dXNlQ1BQPC9jb2RlPiwgd2hpY2ggZGV0ZXJtaW5lcyB3aGV0aGVyIEMgcHJlcHJvY2Vzc29yCiAgICBkaXJlY3RpdmVzIGFyZSByZWNvZ25pemVkLjwvcD4KCiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC94LWNzcmM8L2NvZGU+CiAgICAoQyBjb2RlKSwgPGNvZGU+dGV4dC94LWMrK3NyYzwvY29kZT4gKEMrKwogICAgY29kZSksIDxjb2RlPnRleHQveC1qYXZhPC9jb2RlPiAoSmF2YQogICAgY29kZSksIDxjb2RlPnRleHQveC1jc2hhcnA8L2NvZGU+IChDIykuPC9wPgo8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/clike/scala.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogU2NhbGEgbW9kZTwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uLy4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vdGhlbWUvYW1iaWFuY2UuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uLy4uL2FkZG9uL2VkaXQvbWF0Y2hicmFja2V0cy5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJjbGlrZS5qcyI+PC9zY3JpcHQ+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGltZyBpZD1sb2dvIHNyYz0iLi4vLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+TGFuZ3VhZ2UgbW9kZXM8L2E+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPlNjYWxhPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5TY2FsYSBtb2RlPC9oMj4KPGZvcm0+Cjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+CgogIC8qICAgICAgICAgICAgICAgICAgICAgX18gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcCiAgKiogICAgIF9fX19fX19fIF9fXyAgIC8gLyAgX19fICAgICBTY2FsYSBBUEkgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioKICAqKiAgICAvIF9fLyBfXy8vIF8gfCAvIC8gIC8gXyB8ICAgIChjKSAyMDAzLTIwMTEsIExBTVAvRVBGTCAgICAgICAgICAgICAqKgogICoqICBfX1wgXC8gL19fLyBfXyB8LyAvX18vIF9fIHwgICAgaHR0cDovL3NjYWxhLWxhbmcub3JnLyAgICAgICAgICAgICAgICoqCiAgKiogL19fX18vXF9fXy9fLyB8Xy9fX19fL18vIHwgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioKICAqKiAgICAgICAgICAgICAgICAgICAgICAgICAgfC8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKgogIFwqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgogIHBhY2thZ2Ugc2NhbGEuY29sbGVjdGlvbgoKICBpbXBvcnQgZ2VuZXJpYy5fCiAgaW1wb3J0IG11dGFibGUueyBCdWlsZGVyLCBMaXN0QnVmZmVyIH0KICBpbXBvcnQgYW5ub3RhdGlvbi57dGFpbHJlYywgbWlncmF0aW9uLCBicmlkZ2V9CiAgaW1wb3J0IGFubm90YXRpb24udW5jaGVja2VkLnsgdW5jaGVja2VkVmFyaWFuY2UgPT4gdVYgfQogIGltcG9ydCBwYXJhbGxlbC5QYXJJdGVyYWJsZQoKICAvKiogQSB0ZW1wbGF0ZSB0cmFpdCBmb3IgdHJhdmVyc2FibGUgY29sbGVjdGlvbnMgb2YgdHlwZSBgVHJhdmVyc2FibGVbQV1gLgogICAqICAKICAgKiAgJHRyYXZlcnNhYmxlSW5mbwogICAqICBAZGVmaW5lIG11dGFiaWxpdHkKICAgKiAgQGRlZmluZSB0cmF2ZXJzYWJsZUluZm8KICAgKiAgVGhpcyBpcyBhIGJhc2UgdHJhaXQgb2YgYWxsIGtpbmRzIG9mICRtdXRhYmlsaXR5IFNjYWxhIGNvbGxlY3Rpb25zLiBJdAogICAqICBpbXBsZW1lbnRzIHRoZSBiZWhhdmlvciBjb21tb24gdG8gYWxsIGNvbGxlY3Rpb25zLCBpbiB0ZXJtcyBvZiBhIG1ldGhvZAogICAqICBgZm9yZWFjaGAgd2l0aCBzaWduYXR1cmU6CiAgICoge3t7CiAgICogICAgIGRlZiBmb3JlYWNoW1VdKGY6IEVsZW0gPT4gVSk6IFVuaXQKICAgKiB9fX0KICAgKiAgQ29sbGVjdGlvbiBjbGFzc2VzIG1peGluZyBpbiB0aGlzIHRyYWl0IHByb3ZpZGUgYSBjb25jcmV0ZSAKICAgKiAgYGZvcmVhY2hgIG1ldGhvZCB3aGljaCB0cmF2ZXJzZXMgYWxsIHRoZQogICAqICBlbGVtZW50cyBjb250YWluZWQgaW4gdGhlIGNvbGxlY3Rpb24sIGFwcGx5aW5nIGEgZ2l2ZW4gZnVuY3Rpb24gdG8gZWFjaC4KICAgKiAgVGhleSBhbHNvIG5lZWQgdG8gcHJvdmlkZSBhIG1ldGhvZCBgbmV3QnVpbGRlcmAKICAgKiAgd2hpY2ggY3JlYXRlcyBhIGJ1aWxkZXIgZm9yIGNvbGxlY3Rpb25zIG9mIHRoZSBzYW1lIGtpbmQuCiAgICogIAogICAqICBBIHRyYXZlcnNhYmxlIGNsYXNzIG1pZ2h0IG9yIG1pZ2h0IG5vdCBoYXZlIHR3byBwcm9wZXJ0aWVzOiBzdHJpY3RuZXNzCiAgICogIGFuZCBvcmRlcmVkbmVzcy4gTmVpdGhlciBpcyByZXByZXNlbnRlZCBhcyBhIHR5cGUuCiAgICogIAogICAqICBUaGUgaW5zdGFuY2VzIG9mIGEgc3RyaWN0IGNvbGxlY3Rpb24gY2xhc3MgaGF2ZSBhbGwgdGhlaXIgZWxlbWVudHMKICAgKiAgY29tcHV0ZWQgYmVmb3JlIHRoZXkgY2FuIGJlIHVzZWQgYXMgdmFsdWVzLiBCeSBjb250cmFzdCwgaW5zdGFuY2VzIG9mCiAgICogIGEgbm9uLXN0cmljdCBjb2xsZWN0aW9uIGNsYXNzIG1heSBkZWZlciBjb21wdXRhdGlvbiBvZiBzb21lIG9mIHRoZWlyCiAgICogIGVsZW1lbnRzIHVudGlsIGFmdGVyIHRoZSBpbnN0YW5jZSBpcyBhdmFpbGFibGUgYXMgYSB2YWx1ZS4KICAgKiAgQSB0eXBpY2FsIGV4YW1wbGUgb2YgYSBub24tc3RyaWN0IGNvbGxlY3Rpb24gY2xhc3MgaXMgYQogICAqICA8YSBocmVmPSIuLi9pbW11dGFibGUvU3RyZWFtLmh0bWwiIHRhcmdldD0iQ29udGVudEZyYW1lIj4KICAgKiAgYHNjYWxhLmNvbGxlY3Rpb24uaW1tdXRhYmxlLlN0cmVhbWA8L2E+LgogICAqICBBIG1vcmUgZ2VuZXJhbCBjbGFzcyBvZiBleGFtcGxlcyBhcmUgYFRyYXZlcnNhYmxlVmlld3NgLgogICAqICAKICAgKiAgSWYgYSBjb2xsZWN0aW9uIGlzIGFuIGluc3RhbmNlIG9mIGFuIG9yZGVyZWQgY29sbGVjdGlvbiBjbGFzcywgdHJhdmVyc2luZwogICAqICBpdHMgZWxlbWVudHMgd2l0aCBgZm9yZWFjaGAgd2lsbCBhbHdheXMgdmlzaXQgZWxlbWVudHMgaW4gdGhlCiAgICogIHNhbWUgb3JkZXIsIGV2ZW4gZm9yIGRpZmZlcmVudCBydW5zIG9mIHRoZSBwcm9ncmFtLiBJZiB0aGUgY2xhc3MgaXMgbm90CiAgICogIG9yZGVyZWQsIGBmb3JlYWNoYCBjYW4gdmlzaXQgZWxlbWVudHMgaW4gZGlmZmVyZW50IG9yZGVycyBmb3IKICAgKiAgZGlmZmVyZW50IHJ1bnMgKGJ1dCBpdCB3aWxsIGtlZXAgdGhlIHNhbWUgb3JkZXIgaW4gdGhlIHNhbWUgcnVuKS4nCiAgICogCiAgICogIEEgdHlwaWNhbCBleGFtcGxlIG9mIGEgY29sbGVjdGlvbiBjbGFzcyB3aGljaCBpcyBub3Qgb3JkZXJlZCBpcyBhCiAgICogIGBIYXNoTWFwYCBvZiBvYmplY3RzLiBUaGUgdHJhdmVyc2FsIG9yZGVyIGZvciBoYXNoIG1hcHMgd2lsbAogICAqICBkZXBlbmQgb24gdGhlIGhhc2ggY29kZXMgb2YgaXRzIGVsZW1lbnRzLCBhbmQgdGhlc2UgaGFzaCBjb2RlcyBtaWdodAogICAqICBkaWZmZXIgZnJvbSBvbmUgcnVuIHRvIHRoZSBuZXh0LiBCeSBjb250cmFzdCwgYSBgTGlua2VkSGFzaE1hcGAKICAgKiAgaXMgb3JkZXJlZCBiZWNhdXNlIGl0J3MgYGZvcmVhY2hgIG1ldGhvZCB2aXNpdHMgZWxlbWVudHMgaW4gdGhlCiAgICogIG9yZGVyIHRoZXkgd2VyZSBpbnNlcnRlZCBpbnRvIHRoZSBgSGFzaE1hcGAuCiAgICoKICAgKiAgQGF1dGhvciBNYXJ0aW4gT2RlcnNreQogICAqICBAdmVyc2lvbiAyLjgKICAgKiAgQHNpbmNlICAgMi44CiAgICogIEB0cGFyYW0gQSAgICB0aGUgZWxlbWVudCB0eXBlIG9mIHRoZSBjb2xsZWN0aW9uCiAgICogIEB0cGFyYW0gUmVwciB0aGUgdHlwZSBvZiB0aGUgYWN0dWFsIGNvbGxlY3Rpb24gY29udGFpbmluZyB0aGUgZWxlbWVudHMuCiAgICoKICAgKiAgQGRlZmluZSBDb2xsIFRyYXZlcnNhYmxlCiAgICogIEBkZWZpbmUgY29sbCB0cmF2ZXJzYWJsZSBjb2xsZWN0aW9uCiAgICovCiAgdHJhaXQgVHJhdmVyc2FibGVMaWtlWytBLCArUmVwcl0gZXh0ZW5kcyBIYXNOZXdCdWlsZGVyW0EsIFJlcHJdIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggRmlsdGVyTW9uYWRpY1tBLCBSZXByXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggVHJhdmVyc2FibGVPbmNlW0FdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBHZW5UcmF2ZXJzYWJsZUxpa2VbQSwgUmVwcl0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIFBhcmFsbGVsaXphYmxlW0EsIFBhckl0ZXJhYmxlW0FdXQogIHsKICAgIHNlbGYgPT4KCiAgICBpbXBvcnQgVHJhdmVyc2FibGUuYnJlYWtzLl8KCiAgICAvKiogVGhlIHR5cGUgaW1wbGVtZW50aW5nIHRoaXMgdHJhdmVyc2FibGUgKi8KICAgIHByb3RlY3RlZCB0eXBlIFNlbGYgPSBSZXByCgogICAgLyoqIFRoZSBjb2xsZWN0aW9uIG9mIHR5cGUgJGNvbGwgdW5kZXJseWluZyB0aGlzIGBUcmF2ZXJzYWJsZUxpa2VgIG9iamVjdC4KICAgICAqICBCeSBkZWZhdWx0IHRoaXMgaXMgaW1wbGVtZW50ZWQgYXMgdGhlIGBUcmF2ZXJzYWJsZUxpa2VgIG9iamVjdCBpdHNlbGYsCiAgICAgKiAgYnV0IHRoaXMgY2FuIGJlIG92ZXJyaWRkZW4uCiAgICAgKi8KICAgIGRlZiByZXByOiBSZXByID0gdGhpcy5hc0luc3RhbmNlT2ZbUmVwcl0KCiAgICAvKiogVGhlIHVuZGVybHlpbmcgY29sbGVjdGlvbiBzZWVuIGFzIGFuIGluc3RhbmNlIG9mIGAkQ29sbGAuCiAgICAgKiAgQnkgZGVmYXVsdCB0aGlzIGlzIGltcGxlbWVudGVkIGFzIHRoZSBjdXJyZW50IGNvbGxlY3Rpb24gb2JqZWN0IGl0c2VsZiwKICAgICAqICBidXQgdGhpcyBjYW4gYmUgb3ZlcnJpZGRlbi4KICAgICAqLwogICAgcHJvdGVjdGVkW3RoaXNdIGRlZiB0aGlzQ29sbGVjdGlvbjogVHJhdmVyc2FibGVbQV0gPSB0aGlzLmFzSW5zdGFuY2VPZltUcmF2ZXJzYWJsZVtBXV0KCiAgICAvKiogQSBjb252ZXJzaW9uIGZyb20gY29sbGVjdGlvbnMgb2YgdHlwZSBgUmVwcmAgdG8gYCRDb2xsYCBvYmplY3RzLgogICAgICogIEJ5IGRlZmF1bHQgdGhpcyBpcyBpbXBsZW1lbnRlZCBhcyBqdXN0IGEgY2FzdCwgYnV0IHRoaXMgY2FuIGJlIG92ZXJyaWRkZW4uCiAgICAgKi8KICAgIHByb3RlY3RlZFt0aGlzXSBkZWYgdG9Db2xsZWN0aW9uKHJlcHI6IFJlcHIpOiBUcmF2ZXJzYWJsZVtBXSA9IHJlcHIuYXNJbnN0YW5jZU9mW1RyYXZlcnNhYmxlW0FdXQoKICAgIC8qKiBDcmVhdGVzIGEgbmV3IGJ1aWxkZXIgZm9yIHRoaXMgY29sbGVjdGlvbiB0eXBlLgogICAgICovCiAgICBwcm90ZWN0ZWRbdGhpc10gZGVmIG5ld0J1aWxkZXI6IEJ1aWxkZXJbQSwgUmVwcl0KCiAgICBwcm90ZWN0ZWRbdGhpc10gZGVmIHBhckNvbWJpbmVyID0gUGFySXRlcmFibGUubmV3Q29tYmluZXJbQV0KCiAgICAvKiogQXBwbGllcyBhIGZ1bmN0aW9uIGBmYCB0byBhbGwgZWxlbWVudHMgb2YgdGhpcyAkY29sbC4KICAgICAqICAKICAgICAqICAgIE5vdGU6IHRoaXMgbWV0aG9kIHVuZGVybGllcyB0aGUgaW1wbGVtZW50YXRpb24gb2YgbW9zdCBvdGhlciBidWxrIG9wZXJhdGlvbnMuCiAgICAgKiAgICBJdCdzIGltcG9ydGFudCB0byBpbXBsZW1lbnQgdGhpcyBtZXRob2QgaW4gYW4gZWZmaWNpZW50IHdheS4KICAgICAqICAKICAgICAqCiAgICAgKiAgQHBhcmFtICBmICAgdGhlIGZ1bmN0aW9uIHRoYXQgaXMgYXBwbGllZCBmb3IgaXRzIHNpZGUtZWZmZWN0IHRvIGV2ZXJ5IGVsZW1lbnQuCiAgICAgKiAgICAgICAgICAgICAgVGhlIHJlc3VsdCBvZiBmdW5jdGlvbiBgZmAgaXMgZGlzY2FyZGVkLgogICAgICogICAgICAgICAgICAgIAogICAgICogIEB0cGFyYW0gIFUgIHRoZSB0eXBlIHBhcmFtZXRlciBkZXNjcmliaW5nIHRoZSByZXN1bHQgb2YgZnVuY3Rpb24gYGZgLiAKICAgICAqICAgICAgICAgICAgICBUaGlzIHJlc3VsdCB3aWxsIGFsd2F5cyBiZSBpZ25vcmVkLiBUeXBpY2FsbHkgYFVgIGlzIGBVbml0YCwKICAgICAqICAgICAgICAgICAgICBidXQgdGhpcyBpcyBub3QgbmVjZXNzYXJ5LgogICAgICoKICAgICAqICBAdXNlY2FzZSBkZWYgZm9yZWFjaChmOiBBID0+IFVuaXQpOiBVbml0CiAgICAgKi8KICAgIGRlZiBmb3JlYWNoW1VdKGY6IEEgPT4gVSk6IFVuaXQKCiAgICAvKiogVGVzdHMgd2hldGhlciB0aGlzICRjb2xsIGlzIGVtcHR5LgogICAgICoKICAgICAqICBAcmV0dXJuICAgIGB0cnVlYCBpZiB0aGUgJGNvbGwgY29udGFpbiBubyBlbGVtZW50cywgYGZhbHNlYCBvdGhlcndpc2UuCiAgICAgKi8KICAgIGRlZiBpc0VtcHR5OiBCb29sZWFuID0gewogICAgICB2YXIgcmVzdWx0ID0gdHJ1ZQogICAgICBicmVha2FibGUgewogICAgICAgIGZvciAoeCA8LSB0aGlzKSB7CiAgICAgICAgICByZXN1bHQgPSBmYWxzZQogICAgICAgICAgYnJlYWsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmVzdWx0CiAgICB9CgogICAgLyoqIFRlc3RzIHdoZXRoZXIgdGhpcyAkY29sbCBpcyBrbm93biB0byBoYXZlIGEgZmluaXRlIHNpemUuCiAgICAgKiAgQWxsIHN0cmljdCBjb2xsZWN0aW9ucyBhcmUga25vd24gdG8gaGF2ZSBmaW5pdGUgc2l6ZS4gRm9yIGEgbm9uLXN0cmljdCBjb2xsZWN0aW9uCiAgICAgKiAgc3VjaCBhcyBgU3RyZWFtYCwgdGhlIHByZWRpY2F0ZSByZXR1cm5zIGB0cnVlYCBpZiBhbGwgZWxlbWVudHMgaGF2ZSBiZWVuIGNvbXB1dGVkLgogICAgICogIEl0IHJldHVybnMgYGZhbHNlYCBpZiB0aGUgc3RyZWFtIGlzIG5vdCB5ZXQgZXZhbHVhdGVkIHRvIHRoZSBlbmQuCiAgICAgKgogICAgICogIE5vdGU6IG1hbnkgY29sbGVjdGlvbiBtZXRob2RzIHdpbGwgbm90IHdvcmsgb24gY29sbGVjdGlvbnMgb2YgaW5maW5pdGUgc2l6ZXMuIAogICAgICoKICAgICAqICBAcmV0dXJuICBgdHJ1ZWAgaWYgdGhpcyBjb2xsZWN0aW9uIGlzIGtub3duIHRvIGhhdmUgZmluaXRlIHNpemUsIGBmYWxzZWAgb3RoZXJ3aXNlLgogICAgICovCiAgICBkZWYgaGFzRGVmaW5pdGVTaXplID0gdHJ1ZQoKICAgIGRlZiArK1tCID46IEEsIFRoYXRdKHRoYXQ6IEdlblRyYXZlcnNhYmxlT25jZVtCXSkoaW1wbGljaXQgYmY6IENhbkJ1aWxkRnJvbVtSZXByLCBCLCBUaGF0XSk6IFRoYXQgPSB7CiAgICAgIHZhbCBiID0gYmYocmVwcikKICAgICAgaWYgKHRoYXQuaXNJbnN0YW5jZU9mW0luZGV4ZWRTZXFMaWtlW18sIF9dXSkgYi5zaXplSGludCh0aGlzLCB0aGF0LnNlcS5zaXplKQogICAgICBiICsrPSB0aGlzQ29sbGVjdGlvbgogICAgICBiICsrPSB0aGF0LnNlcQogICAgICBiLnJlc3VsdAogICAgfQoKICAgIEBicmlkZ2UKICAgIGRlZiArK1tCID46IEEsIFRoYXRdKHRoYXQ6IFRyYXZlcnNhYmxlT25jZVtCXSkoaW1wbGljaXQgYmY6IENhbkJ1aWxkRnJvbVtSZXByLCBCLCBUaGF0XSk6IFRoYXQgPQogICAgICArKyh0aGF0OiBHZW5UcmF2ZXJzYWJsZU9uY2VbQl0pKGJmKQoKICAgIC8qKiBDb25jYXRlbmF0ZXMgdGhpcyAkY29sbCB3aXRoIHRoZSBlbGVtZW50cyBvZiBhIHRyYXZlcnNhYmxlIGNvbGxlY3Rpb24uCiAgICAgKiAgSXQgZGlmZmVycyBmcm9tICsrIGluIHRoYXQgdGhlIHJpZ2h0IG9wZXJhbmQgZGV0ZXJtaW5lcyB0aGUgdHlwZSBvZiB0aGUKICAgICAqICByZXN1bHRpbmcgY29sbGVjdGlvbiByYXRoZXIgdGhhbiB0aGUgbGVmdCBvbmUuCiAgICAgKiAKICAgICAqICBAcGFyYW0gdGhhdCAgIHRoZSB0cmF2ZXJzYWJsZSB0byBhcHBlbmQuCiAgICAgKiAgQHRwYXJhbSBCICAgICB0aGUgZWxlbWVudCB0eXBlIG9mIHRoZSByZXR1cm5lZCBjb2xsZWN0aW9uLiAKICAgICAqICBAdHBhcmFtIFRoYXQgICR0aGF0aW5mbwogICAgICogIEBwYXJhbSBiZiAgICAgJGJmaW5mbwogICAgICogIEByZXR1cm4gICAgICAgYSBuZXcgY29sbGVjdGlvbiBvZiB0eXBlIGBUaGF0YCB3aGljaCBjb250YWlucyBhbGwgZWxlbWVudHMKICAgICAqICAgICAgICAgICAgICAgIG9mIHRoaXMgJGNvbGwgZm9sbG93ZWQgYnkgYWxsIGVsZW1lbnRzIG9mIGB0aGF0YC4KICAgICAqIAogICAgICogIEB1c2VjYXNlIGRlZiArKzpbQl0odGhhdDogVHJhdmVyc2FibGVPbmNlW0JdKTogJENvbGxbQl0KICAgICAqICAKICAgICAqICBAcmV0dXJuICAgICAgIGEgbmV3ICRjb2xsIHdoaWNoIGNvbnRhaW5zIGFsbCBlbGVtZW50cyBvZiB0aGlzICRjb2xsCiAgICAgKiAgICAgICAgICAgICAgICBmb2xsb3dlZCBieSBhbGwgZWxlbWVudHMgb2YgYHRoYXRgLgogICAgICovCiAgICBkZWYgKys6W0IgPjogQSwgVGhhdF0odGhhdDogVHJhdmVyc2FibGVPbmNlW0JdKShpbXBsaWNpdCBiZjogQ2FuQnVpbGRGcm9tW1JlcHIsIEIsIFRoYXRdKTogVGhhdCA9IHsKICAgICAgdmFsIGIgPSBiZihyZXByKQogICAgICBpZiAodGhhdC5pc0luc3RhbmNlT2ZbSW5kZXhlZFNlcUxpa2VbXywgX11dKSBiLnNpemVIaW50KHRoaXMsIHRoYXQuc2l6ZSkKICAgICAgYiArKz0gdGhhdAogICAgICBiICsrPSB0aGlzQ29sbGVjdGlvbgogICAgICBiLnJlc3VsdAogICAgfQoKICAgIC8qKiBUaGlzIG92ZXJsb2FkIGV4aXN0cyBiZWNhdXNlOiBmb3IgdGhlIGltcGxlbWVudGF0aW9uIG9mICsrOiB3ZSBzaG91bGQgcmV1c2UKICAgICAqICB0aGF0IG9mICsrIGJlY2F1c2UgbWFueSBjb2xsZWN0aW9ucyBvdmVycmlkZSBpdCB3aXRoIG1vcmUgZWZmaWNpZW50IHZlcnNpb25zLgogICAgICogIFNpbmNlIFRyYXZlcnNhYmxlT25jZSBoYXMgbm8gJysrJyBtZXRob2QsIHdlIGhhdmUgdG8gaW1wbGVtZW50IHRoYXQgZGlyZWN0bHksCiAgICAgKiAgYnV0IFRyYXZlcnNhYmxlIGFuZCBkb3duIGNhbiB1c2UgdGhlIG92ZXJsb2FkLgogICAgICovCiAgICBkZWYgKys6W0IgPjogQSwgVGhhdF0odGhhdDogVHJhdmVyc2FibGVbQl0pKGltcGxpY2l0IGJmOiBDYW5CdWlsZEZyb21bUmVwciwgQiwgVGhhdF0pOiBUaGF0ID0KICAgICAgKHRoYXQgKysgc2VxKShicmVha091dCkKCiAgICBkZWYgbWFwW0IsIFRoYXRdKGY6IEEgPT4gQikoaW1wbGljaXQgYmY6IENhbkJ1aWxkRnJvbVtSZXByLCBCLCBUaGF0XSk6IFRoYXQgPSB7CiAgICAgIHZhbCBiID0gYmYocmVwcikKICAgICAgYi5zaXplSGludCh0aGlzKSAKICAgICAgZm9yICh4IDwtIHRoaXMpIGIgKz0gZih4KQogICAgICBiLnJlc3VsdAogICAgfQoKICAgIGRlZiBmbGF0TWFwW0IsIFRoYXRdKGY6IEEgPT4gR2VuVHJhdmVyc2FibGVPbmNlW0JdKShpbXBsaWNpdCBiZjogQ2FuQnVpbGRGcm9tW1JlcHIsIEIsIFRoYXRdKTogVGhhdCA9IHsKICAgICAgdmFsIGIgPSBiZihyZXByKQogICAgICBmb3IgKHggPC0gdGhpcykgYiArKz0gZih4KS5zZXEKICAgICAgYi5yZXN1bHQKICAgIH0KCiAgICAvKiogU2VsZWN0cyBhbGwgZWxlbWVudHMgb2YgdGhpcyAkY29sbCB3aGljaCBzYXRpc2Z5IGEgcHJlZGljYXRlLgogICAgICoKICAgICAqICBAcGFyYW0gcCAgICAgdGhlIHByZWRpY2F0ZSB1c2VkIHRvIHRlc3QgZWxlbWVudHMuCiAgICAgKiAgQHJldHVybiAgICAgIGEgbmV3ICRjb2xsIGNvbnNpc3Rpbmcgb2YgYWxsIGVsZW1lbnRzIG9mIHRoaXMgJGNvbGwgdGhhdCBzYXRpc2Z5IHRoZSBnaXZlbgogICAgICogICAgICAgICAgICAgICBwcmVkaWNhdGUgYHBgLiBUaGUgb3JkZXIgb2YgdGhlIGVsZW1lbnRzIGlzIHByZXNlcnZlZC4KICAgICAqLwogICAgZGVmIGZpbHRlcihwOiBBID0+IEJvb2xlYW4pOiBSZXByID0gewogICAgICB2YWwgYiA9IG5ld0J1aWxkZXIKICAgICAgZm9yICh4IDwtIHRoaXMpIAogICAgICAgIGlmIChwKHgpKSBiICs9IHgKICAgICAgYi5yZXN1bHQKICAgIH0KCiAgICAvKiogU2VsZWN0cyBhbGwgZWxlbWVudHMgb2YgdGhpcyAkY29sbCB3aGljaCBkbyBub3Qgc2F0aXNmeSBhIHByZWRpY2F0ZS4KICAgICAqCiAgICAgKiAgQHBhcmFtIHAgICAgIHRoZSBwcmVkaWNhdGUgdXNlZCB0byB0ZXN0IGVsZW1lbnRzLgogICAgICogIEByZXR1cm4gICAgICBhIG5ldyAkY29sbCBjb25zaXN0aW5nIG9mIGFsbCBlbGVtZW50cyBvZiB0aGlzICRjb2xsIHRoYXQgZG8gbm90IHNhdGlzZnkgdGhlIGdpdmVuCiAgICAgKiAgICAgICAgICAgICAgIHByZWRpY2F0ZSBgcGAuIFRoZSBvcmRlciBvZiB0aGUgZWxlbWVudHMgaXMgcHJlc2VydmVkLgogICAgICovCiAgICBkZWYgZmlsdGVyTm90KHA6IEEgPT4gQm9vbGVhbik6IFJlcHIgPSBmaWx0ZXIoIXAoXykpCgogICAgZGVmIGNvbGxlY3RbQiwgVGhhdF0ocGY6IFBhcnRpYWxGdW5jdGlvbltBLCBCXSkoaW1wbGljaXQgYmY6IENhbkJ1aWxkRnJvbVtSZXByLCBCLCBUaGF0XSk6IFRoYXQgPSB7CiAgICAgIHZhbCBiID0gYmYocmVwcikKICAgICAgZm9yICh4IDwtIHRoaXMpIGlmIChwZi5pc0RlZmluZWRBdCh4KSkgYiArPSBwZih4KQogICAgICBiLnJlc3VsdAogICAgfQoKICAgIC8qKiBCdWlsZHMgYSBuZXcgY29sbGVjdGlvbiBieSBhcHBseWluZyBhbiBvcHRpb24tdmFsdWVkIGZ1bmN0aW9uIHRvIGFsbAogICAgICogIGVsZW1lbnRzIG9mIHRoaXMgJGNvbGwgb24gd2hpY2ggdGhlIGZ1bmN0aW9uIGlzIGRlZmluZWQuCiAgICAgKgogICAgICogIEBwYXJhbSBmICAgICAgdGhlIG9wdGlvbi12YWx1ZWQgZnVuY3Rpb24gd2hpY2ggZmlsdGVycyBhbmQgbWFwcyB0aGUgJGNvbGwuCiAgICAgKiAgQHRwYXJhbSBCICAgICB0aGUgZWxlbWVudCB0eXBlIG9mIHRoZSByZXR1cm5lZCBjb2xsZWN0aW9uLgogICAgICogIEB0cGFyYW0gVGhhdCAgJHRoYXRpbmZvCiAgICAgKiAgQHBhcmFtIGJmICAgICAkYmZpbmZvCiAgICAgKiAgQHJldHVybiAgICAgICBhIG5ldyBjb2xsZWN0aW9uIG9mIHR5cGUgYFRoYXRgIHJlc3VsdGluZyBmcm9tIGFwcGx5aW5nIHRoZSBvcHRpb24tdmFsdWVkIGZ1bmN0aW9uCiAgICAgKiAgICAgICAgICAgICAgICBgZmAgdG8gZWFjaCBlbGVtZW50IGFuZCBjb2xsZWN0aW5nIGFsbCBkZWZpbmVkIHJlc3VsdHMuCiAgICAgKiAgICAgICAgICAgICAgICBUaGUgb3JkZXIgb2YgdGhlIGVsZW1lbnRzIGlzIHByZXNlcnZlZC4KICAgICAqCiAgICAgKiAgQHVzZWNhc2UgZGVmIGZpbHRlck1hcFtCXShmOiBBID0+IE9wdGlvbltCXSk6ICRDb2xsW0JdCiAgICAgKiAgCiAgICAgKiAgQHBhcmFtIHBmICAgICB0aGUgcGFydGlhbCBmdW5jdGlvbiB3aGljaCBmaWx0ZXJzIGFuZCBtYXBzIHRoZSAkY29sbC4KICAgICAqICBAcmV0dXJuICAgICAgIGEgbmV3ICRjb2xsIHJlc3VsdGluZyBmcm9tIGFwcGx5aW5nIHRoZSBnaXZlbiBvcHRpb24tdmFsdWVkIGZ1bmN0aW9uCiAgICAgKiAgICAgICAgICAgICAgICBgZmAgdG8gZWFjaCBlbGVtZW50IGFuZCBjb2xsZWN0aW5nIGFsbCBkZWZpbmVkIHJlc3VsdHMuCiAgICAgKiAgICAgICAgICAgICAgICBUaGUgb3JkZXIgb2YgdGhlIGVsZW1lbnRzIGlzIHByZXNlcnZlZC4KICAgIGRlZiBmaWx0ZXJNYXBbQiwgVGhhdF0oZjogQSA9PiBPcHRpb25bQl0pKGltcGxpY2l0IGJmOiBDYW5CdWlsZEZyb21bUmVwciwgQiwgVGhhdF0pOiBUaGF0ID0gewogICAgICB2YWwgYiA9IGJmKHJlcHIpCiAgICAgIGZvciAoeCA8LSB0aGlzKSAKICAgICAgICBmKHgpIG1hdGNoIHsKICAgICAgICAgIGNhc2UgU29tZSh5KSA9PiBiICs9IHkKICAgICAgICAgIGNhc2UgXyA9PgogICAgICAgIH0KICAgICAgYi5yZXN1bHQKICAgIH0KICAgICAqLwoKICAgIC8qKiBQYXJ0aXRpb25zIHRoaXMgJGNvbGwgaW4gdHdvICR7Y29sbH1zIGFjY29yZGluZyB0byBhIHByZWRpY2F0ZS4KICAgICAqCiAgICAgKiAgQHBhcmFtIHAgdGhlIHByZWRpY2F0ZSBvbiB3aGljaCB0byBwYXJ0aXRpb24uCiAgICAgKiAgQHJldHVybiAgYSBwYWlyIG9mICR7Y29sbH1zOiB0aGUgZmlyc3QgJGNvbGwgY29uc2lzdHMgb2YgYWxsIGVsZW1lbnRzIHRoYXQgCiAgICAgKiAgICAgICAgICAgc2F0aXNmeSB0aGUgcHJlZGljYXRlIGBwYCBhbmQgdGhlIHNlY29uZCAkY29sbCBjb25zaXN0cyBvZiBhbGwgZWxlbWVudHMKICAgICAqICAgICAgICAgICB0aGF0IGRvbid0LiBUaGUgcmVsYXRpdmUgb3JkZXIgb2YgdGhlIGVsZW1lbnRzIGluIHRoZSByZXN1bHRpbmcgJHtjb2xsfXMKICAgICAqICAgICAgICAgICBpcyB0aGUgc2FtZSBhcyBpbiB0aGUgb3JpZ2luYWwgJGNvbGwuCiAgICAgKi8KICAgIGRlZiBwYXJ0aXRpb24ocDogQSA9PiBCb29sZWFuKTogKFJlcHIsIFJlcHIpID0gewogICAgICB2YWwgbCwgciA9IG5ld0J1aWxkZXIKICAgICAgZm9yICh4IDwtIHRoaXMpIChpZiAocCh4KSkgbCBlbHNlIHIpICs9IHgKICAgICAgKGwucmVzdWx0LCByLnJlc3VsdCkKICAgIH0KCiAgICBkZWYgZ3JvdXBCeVtLXShmOiBBID0+IEspOiBpbW11dGFibGUuTWFwW0ssIFJlcHJdID0gewogICAgICB2YWwgbSA9IG11dGFibGUuTWFwLmVtcHR5W0ssIEJ1aWxkZXJbQSwgUmVwcl1dCiAgICAgIGZvciAoZWxlbSA8LSB0aGlzKSB7CiAgICAgICAgdmFsIGtleSA9IGYoZWxlbSkKICAgICAgICB2YWwgYmxkciA9IG0uZ2V0T3JFbHNlVXBkYXRlKGtleSwgbmV3QnVpbGRlcikKICAgICAgICBibGRyICs9IGVsZW0KICAgICAgfQogICAgICB2YWwgYiA9IGltbXV0YWJsZS5NYXAubmV3QnVpbGRlcltLLCBSZXByXQogICAgICBmb3IgKChrLCB2KSA8LSBtKQogICAgICAgIGIgKz0gKChrLCB2LnJlc3VsdCkpCgogICAgICBiLnJlc3VsdAogICAgfQoKICAgIC8qKiBUZXN0cyB3aGV0aGVyIGEgcHJlZGljYXRlIGhvbGRzIGZvciBhbGwgZWxlbWVudHMgb2YgdGhpcyAkY29sbC4KICAgICAqCiAgICAgKiAgJG1heU5vdFRlcm1pbmF0ZUluZgogICAgICoKICAgICAqICBAcGFyYW0gICBwICAgICB0aGUgcHJlZGljYXRlIHVzZWQgdG8gdGVzdCBlbGVtZW50cy4KICAgICAqICBAcmV0dXJuICAgICAgICBgdHJ1ZWAgaWYgdGhlIGdpdmVuIHByZWRpY2F0ZSBgcGAgaG9sZHMgZm9yIGFsbCBlbGVtZW50cwogICAgICogICAgICAgICAgICAgICAgIG9mIHRoaXMgJGNvbGwsIG90aGVyd2lzZSBgZmFsc2VgLgogICAgICovCiAgICBkZWYgZm9yYWxsKHA6IEEgPT4gQm9vbGVhbik6IEJvb2xlYW4gPSB7CiAgICAgIHZhciByZXN1bHQgPSB0cnVlCiAgICAgIGJyZWFrYWJsZSB7CiAgICAgICAgZm9yICh4IDwtIHRoaXMpCiAgICAgICAgICBpZiAoIXAoeCkpIHsgcmVzdWx0ID0gZmFsc2U7IGJyZWFrIH0KICAgICAgfQogICAgICByZXN1bHQKICAgIH0KCiAgICAvKiogVGVzdHMgd2hldGhlciBhIHByZWRpY2F0ZSBob2xkcyBmb3Igc29tZSBvZiB0aGUgZWxlbWVudHMgb2YgdGhpcyAkY29sbC4KICAgICAqCiAgICAgKiAgJG1heU5vdFRlcm1pbmF0ZUluZgogICAgICoKICAgICAqICBAcGFyYW0gICBwICAgICB0aGUgcHJlZGljYXRlIHVzZWQgdG8gdGVzdCBlbGVtZW50cy4KICAgICAqICBAcmV0dXJuICAgICAgICBgdHJ1ZWAgaWYgdGhlIGdpdmVuIHByZWRpY2F0ZSBgcGAgaG9sZHMgZm9yIHNvbWUgb2YgdGhlCiAgICAgKiAgICAgICAgICAgICAgICAgZWxlbWVudHMgb2YgdGhpcyAkY29sbCwgb3RoZXJ3aXNlIGBmYWxzZWAuCiAgICAgKi8KICAgIGRlZiBleGlzdHMocDogQSA9PiBCb29sZWFuKTogQm9vbGVhbiA9IHsKICAgICAgdmFyIHJlc3VsdCA9IGZhbHNlCiAgICAgIGJyZWFrYWJsZSB7CiAgICAgICAgZm9yICh4IDwtIHRoaXMpCiAgICAgICAgICBpZiAocCh4KSkgeyByZXN1bHQgPSB0cnVlOyBicmVhayB9CiAgICAgIH0KICAgICAgcmVzdWx0CiAgICB9CgogICAgLyoqIEZpbmRzIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSAkY29sbCBzYXRpc2Z5aW5nIGEgcHJlZGljYXRlLCBpZiBhbnkuCiAgICAgKiAKICAgICAqICAkbWF5Tm90VGVybWluYXRlSW5mCiAgICAgKiAgJG9yZGVyRGVwZW5kZW50CiAgICAgKgogICAgICogIEBwYXJhbSBwICAgIHRoZSBwcmVkaWNhdGUgdXNlZCB0byB0ZXN0IGVsZW1lbnRzLgogICAgICogIEByZXR1cm4gICAgIGFuIG9wdGlvbiB2YWx1ZSBjb250YWluaW5nIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSAkY29sbAogICAgICogICAgICAgICAgICAgIHRoYXQgc2F0aXNmaWVzIGBwYCwgb3IgYE5vbmVgIGlmIG5vbmUgZXhpc3RzLgogICAgICovCiAgICBkZWYgZmluZChwOiBBID0+IEJvb2xlYW4pOiBPcHRpb25bQV0gPSB7CiAgICAgIHZhciByZXN1bHQ6IE9wdGlvbltBXSA9IE5vbmUKICAgICAgYnJlYWthYmxlIHsKICAgICAgICBmb3IgKHggPC0gdGhpcykKICAgICAgICAgIGlmIChwKHgpKSB7IHJlc3VsdCA9IFNvbWUoeCk7IGJyZWFrIH0KICAgICAgfQogICAgICByZXN1bHQKICAgIH0KCiAgICBkZWYgc2NhbltCID46IEEsIFRoYXRdKHo6IEIpKG9wOiAoQiwgQikgPT4gQikoaW1wbGljaXQgY2JmOiBDYW5CdWlsZEZyb21bUmVwciwgQiwgVGhhdF0pOiBUaGF0ID0gc2NhbkxlZnQoeikob3ApCgogICAgZGVmIHNjYW5MZWZ0W0IsIFRoYXRdKHo6IEIpKG9wOiAoQiwgQSkgPT4gQikoaW1wbGljaXQgYmY6IENhbkJ1aWxkRnJvbVtSZXByLCBCLCBUaGF0XSk6IFRoYXQgPSB7CiAgICAgIHZhbCBiID0gYmYocmVwcikKICAgICAgYi5zaXplSGludCh0aGlzLCAxKQogICAgICB2YXIgYWNjID0gegogICAgICBiICs9IGFjYwogICAgICBmb3IgKHggPC0gdGhpcykgeyBhY2MgPSBvcChhY2MsIHgpOyBiICs9IGFjYyB9CiAgICAgIGIucmVzdWx0CiAgICB9CgogICAgQG1pZ3JhdGlvbigyLCA5LAogICAgICAiVGhpcyBzY2FuUmlnaHQgZGVmaW5pdGlvbiBoYXMgY2hhbmdlZCBpbiAyLjkuXG4iICsKICAgICAgIlRoZSBwcmV2aW91cyBiZWhhdmlvciBjYW4gYmUgcmVwcm9kdWNlZCB3aXRoIHNjYW5SaWdodC5yZXZlcnNlLiIKICAgICkKICAgIGRlZiBzY2FuUmlnaHRbQiwgVGhhdF0oejogQikob3A6IChBLCBCKSA9PiBCKShpbXBsaWNpdCBiZjogQ2FuQnVpbGRGcm9tW1JlcHIsIEIsIFRoYXRdKTogVGhhdCA9IHsKICAgICAgdmFyIHNjYW5uZWQgPSBMaXN0KHopCiAgICAgIHZhciBhY2MgPSB6CiAgICAgIGZvciAoeCA8LSByZXZlcnNlZCkgewogICAgICAgIGFjYyA9IG9wKHgsIGFjYykKICAgICAgICBzY2FubmVkIDo6PSBhY2MKICAgICAgfQogICAgICB2YWwgYiA9IGJmKHJlcHIpCiAgICAgIGZvciAoZWxlbSA8LSBzY2FubmVkKSBiICs9IGVsZW0KICAgICAgYi5yZXN1bHQKICAgIH0KCiAgICAvKiogU2VsZWN0cyB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGlzICRjb2xsLgogICAgICogICRvcmRlckRlcGVuZGVudAogICAgICogIEByZXR1cm4gIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoaXMgJGNvbGwuCiAgICAgKiAgQHRocm93cyBgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbmAgaWYgdGhlICRjb2xsIGlzIGVtcHR5LgogICAgICovCiAgICBkZWYgaGVhZDogQSA9IHsKICAgICAgdmFyIHJlc3VsdDogKCkgPT4gQSA9ICgpID0+IHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uCiAgICAgIGJyZWFrYWJsZSB7CiAgICAgICAgZm9yICh4IDwtIHRoaXMpIHsKICAgICAgICAgIHJlc3VsdCA9ICgpID0+IHgKICAgICAgICAgIGJyZWFrCiAgICAgICAgfQogICAgICB9CiAgICAgIHJlc3VsdCgpCiAgICB9CgogICAgLyoqIE9wdGlvbmFsbHkgc2VsZWN0cyB0aGUgZmlyc3QgZWxlbWVudC4KICAgICAqICAkb3JkZXJEZXBlbmRlbnQKICAgICAqICBAcmV0dXJuICB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGlzICRjb2xsIGlmIGl0IGlzIG5vbmVtcHR5LCBgTm9uZWAgaWYgaXQgaXMgZW1wdHkuCiAgICAgKi8KICAgIGRlZiBoZWFkT3B0aW9uOiBPcHRpb25bQV0gPSBpZiAoaXNFbXB0eSkgTm9uZSBlbHNlIFNvbWUoaGVhZCkKCiAgICAvKiogU2VsZWN0cyBhbGwgZWxlbWVudHMgZXhjZXB0IHRoZSBmaXJzdC4KICAgICAqICAkb3JkZXJEZXBlbmRlbnQKICAgICAqICBAcmV0dXJuICBhICRjb2xsIGNvbnNpc3Rpbmcgb2YgYWxsIGVsZW1lbnRzIG9mIHRoaXMgJGNvbGwKICAgICAqICAgICAgICAgICBleGNlcHQgdGhlIGZpcnN0IG9uZS4KICAgICAqICBAdGhyb3dzIGBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbmAgaWYgdGhlICRjb2xsIGlzIGVtcHR5LgogICAgICovIAogICAgb3ZlcnJpZGUgZGVmIHRhaWw6IFJlcHIgPSB7CiAgICAgIGlmIChpc0VtcHR5KSB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImVtcHR5LnRhaWwiKQogICAgICBkcm9wKDEpCiAgICB9CgogICAgLyoqIFNlbGVjdHMgdGhlIGxhc3QgZWxlbWVudC4KICAgICAgKiAkb3JkZXJEZXBlbmRlbnQKICAgICAgKiBAcmV0dXJuIFRoZSBsYXN0IGVsZW1lbnQgb2YgdGhpcyAkY29sbC4KICAgICAgKiBAdGhyb3dzIE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gSWYgdGhlICRjb2xsIGlzIGVtcHR5LgogICAgICAqLwogICAgZGVmIGxhc3Q6IEEgPSB7CiAgICAgIHZhciBsc3QgPSBoZWFkCiAgICAgIGZvciAoeCA8LSB0aGlzKQogICAgICAgIGxzdCA9IHgKICAgICAgbHN0CiAgICB9CgogICAgLyoqIE9wdGlvbmFsbHkgc2VsZWN0cyB0aGUgbGFzdCBlbGVtZW50LgogICAgICogICRvcmRlckRlcGVuZGVudAogICAgICogIEByZXR1cm4gIHRoZSBsYXN0IGVsZW1lbnQgb2YgdGhpcyAkY29sbCQgaWYgaXQgaXMgbm9uZW1wdHksIGBOb25lYCBpZiBpdCBpcyBlbXB0eS4KICAgICAqLwogICAgZGVmIGxhc3RPcHRpb246IE9wdGlvbltBXSA9IGlmIChpc0VtcHR5KSBOb25lIGVsc2UgU29tZShsYXN0KQoKICAgIC8qKiBTZWxlY3RzIGFsbCBlbGVtZW50cyBleGNlcHQgdGhlIGxhc3QuCiAgICAgKiAgJG9yZGVyRGVwZW5kZW50CiAgICAgKiAgQHJldHVybiAgYSAkY29sbCBjb25zaXN0aW5nIG9mIGFsbCBlbGVtZW50cyBvZiB0aGlzICRjb2xsCiAgICAgKiAgICAgICAgICAgZXhjZXB0IHRoZSBsYXN0IG9uZS4KICAgICAqICBAdGhyb3dzIGBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbmAgaWYgdGhlICRjb2xsIGlzIGVtcHR5LgogICAgICovCiAgICBkZWYgaW5pdDogUmVwciA9IHsKICAgICAgaWYgKGlzRW1wdHkpIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiZW1wdHkuaW5pdCIpCiAgICAgIHZhciBsc3QgPSBoZWFkCiAgICAgIHZhciBmb2xsb3cgPSBmYWxzZQogICAgICB2YWwgYiA9IG5ld0J1aWxkZXIKICAgICAgYi5zaXplSGludCh0aGlzLCAtMSkKICAgICAgZm9yICh4IDwtIHRoaXMuc2VxKSB7CiAgICAgICAgaWYgKGZvbGxvdykgYiArPSBsc3QKICAgICAgICBlbHNlIGZvbGxvdyA9IHRydWUKICAgICAgICBsc3QgPSB4CiAgICAgIH0KICAgICAgYi5yZXN1bHQKICAgIH0KCiAgICBkZWYgdGFrZShuOiBJbnQpOiBSZXByID0gc2xpY2UoMCwgbikKCiAgICBkZWYgZHJvcChuOiBJbnQpOiBSZXByID0gCiAgICAgIGlmIChuIDw9IDApIHsKICAgICAgICB2YWwgYiA9IG5ld0J1aWxkZXIKICAgICAgICBiLnNpemVIaW50KHRoaXMpCiAgICAgICAgYiArKz0gdGhpc0NvbGxlY3Rpb24gcmVzdWx0CiAgICAgIH0KICAgICAgZWxzZSBzbGljZVdpdGhLbm93bkRlbHRhKG4sIEludC5NYXhWYWx1ZSwgLW4pCgogICAgZGVmIHNsaWNlKGZyb206IEludCwgdW50aWw6IEludCk6IFJlcHIgPSBzbGljZVdpdGhLbm93bkJvdW5kKG1hdGgubWF4KGZyb20sIDApLCB1bnRpbCkKCiAgICAvLyBQcmVjb25kaXRpb246IGZyb20gPj0gMCwgdW50aWwgPiAwLCBidWlsZGVyIGFscmVhZHkgY29uZmlndXJlZCBmb3IgYnVpbGRpbmcuCiAgICBwcml2YXRlW3RoaXNdIGRlZiBzbGljZUludGVybmFsKGZyb206IEludCwgdW50aWw6IEludCwgYjogQnVpbGRlcltBLCBSZXByXSk6IFJlcHIgPSB7CiAgICAgIHZhciBpID0gMAogICAgICBicmVha2FibGUgewogICAgICAgIGZvciAoeCA8LSB0aGlzLnNlcSkgewogICAgICAgICAgaWYgKGkgPj0gZnJvbSkgYiArPSB4CiAgICAgICAgICBpICs9IDEKICAgICAgICAgIGlmIChpID49IHVudGlsKSBicmVhawogICAgICAgIH0KICAgICAgfQogICAgICBiLnJlc3VsdAogICAgfQogICAgLy8gUHJlY29uZGl0aW9uOiBmcm9tID49IDAKICAgIHByaXZhdGVbc2NhbGFdIGRlZiBzbGljZVdpdGhLbm93bkRlbHRhKGZyb206IEludCwgdW50aWw6IEludCwgZGVsdGE6IEludCk6IFJlcHIgPSB7CiAgICAgIHZhbCBiID0gbmV3QnVpbGRlcgogICAgICBpZiAodW50aWwgPD0gZnJvbSkgYi5yZXN1bHQKICAgICAgZWxzZSB7CiAgICAgICAgYi5zaXplSGludCh0aGlzLCBkZWx0YSkKICAgICAgICBzbGljZUludGVybmFsKGZyb20sIHVudGlsLCBiKQogICAgICB9CiAgICB9CiAgICAvLyBQcmVjb25kaXRpb246IGZyb20gPj0gMAogICAgcHJpdmF0ZVtzY2FsYV0gZGVmIHNsaWNlV2l0aEtub3duQm91bmQoZnJvbTogSW50LCB1bnRpbDogSW50KTogUmVwciA9IHsKICAgICAgdmFsIGIgPSBuZXdCdWlsZGVyCiAgICAgIGlmICh1bnRpbCA8PSBmcm9tKSBiLnJlc3VsdAogICAgICBlbHNlIHsKICAgICAgICBiLnNpemVIaW50Qm91bmRlZCh1bnRpbCAtIGZyb20sIHRoaXMpICAgICAgCiAgICAgICAgc2xpY2VJbnRlcm5hbChmcm9tLCB1bnRpbCwgYikKICAgICAgfQogICAgfQoKICAgIGRlZiB0YWtlV2hpbGUocDogQSA9PiBCb29sZWFuKTogUmVwciA9IHsKICAgICAgdmFsIGIgPSBuZXdCdWlsZGVyCiAgICAgIGJyZWFrYWJsZSB7CiAgICAgICAgZm9yICh4IDwtIHRoaXMpIHsKICAgICAgICAgIGlmICghcCh4KSkgYnJlYWsKICAgICAgICAgIGIgKz0geAogICAgICAgIH0KICAgICAgfQogICAgICBiLnJlc3VsdAogICAgfQoKICAgIGRlZiBkcm9wV2hpbGUocDogQSA9PiBCb29sZWFuKTogUmVwciA9IHsKICAgICAgdmFsIGIgPSBuZXdCdWlsZGVyCiAgICAgIHZhciBnbyA9IGZhbHNlCiAgICAgIGZvciAoeCA8LSB0aGlzKSB7CiAgICAgICAgaWYgKCFwKHgpKSBnbyA9IHRydWUKICAgICAgICBpZiAoZ28pIGIgKz0geAogICAgICB9CiAgICAgIGIucmVzdWx0CiAgICB9CgogICAgZGVmIHNwYW4ocDogQSA9PiBCb29sZWFuKTogKFJlcHIsIFJlcHIpID0gewogICAgICB2YWwgbCwgciA9IG5ld0J1aWxkZXIKICAgICAgdmFyIHRvTGVmdCA9IHRydWUKICAgICAgZm9yICh4IDwtIHRoaXMpIHsKICAgICAgICB0b0xlZnQgPSB0b0xlZnQgJiYgcCh4KQogICAgICAgIChpZiAodG9MZWZ0KSBsIGVsc2UgcikgKz0geAogICAgICB9CiAgICAgIChsLnJlc3VsdCwgci5yZXN1bHQpCiAgICB9CgogICAgZGVmIHNwbGl0QXQobjogSW50KTogKFJlcHIsIFJlcHIpID0gewogICAgICB2YWwgbCwgciA9IG5ld0J1aWxkZXIKICAgICAgbC5zaXplSGludEJvdW5kZWQobiwgdGhpcykKICAgICAgaWYgKG4gPj0gMCkgci5zaXplSGludCh0aGlzLCAtbikKICAgICAgdmFyIGkgPSAwCiAgICAgIGZvciAoeCA8LSB0aGlzKSB7CiAgICAgICAgKGlmIChpIDwgbikgbCBlbHNlIHIpICs9IHgKICAgICAgICBpICs9IDEKICAgICAgfQogICAgICAobC5yZXN1bHQsIHIucmVzdWx0KQogICAgfQoKICAgIC8qKiBJdGVyYXRlcyBvdmVyIHRoZSB0YWlscyBvZiB0aGlzICRjb2xsLiBUaGUgZmlyc3QgdmFsdWUgd2lsbCBiZSB0aGlzCiAgICAgKiAgJGNvbGwgYW5kIHRoZSBmaW5hbCBvbmUgd2lsbCBiZSBhbiBlbXB0eSAkY29sbCwgd2l0aCB0aGUgaW50ZXJ2ZW5pbmcKICAgICAqICB2YWx1ZXMgdGhlIHJlc3VsdHMgb2Ygc3VjY2Vzc2l2ZSBhcHBsaWNhdGlvbnMgb2YgYHRhaWxgLgogICAgICoKICAgICAqICBAcmV0dXJuICAgYW4gaXRlcmF0b3Igb3ZlciBhbGwgdGhlIHRhaWxzIG9mIHRoaXMgJGNvbGwKICAgICAqICBAZXhhbXBsZSAgYExpc3QoMSwyLDMpLnRhaWxzID0gSXRlcmF0b3IoTGlzdCgxLDIsMyksIExpc3QoMiwzKSwgTGlzdCgzKSwgTmlsKWAKICAgICAqLyAgCiAgICBkZWYgdGFpbHM6IEl0ZXJhdG9yW1JlcHJdID0gaXRlcmF0ZVVudGlsRW1wdHkoXy50YWlsKQoKICAgIC8qKiBJdGVyYXRlcyBvdmVyIHRoZSBpbml0cyBvZiB0aGlzICRjb2xsLiBUaGUgZmlyc3QgdmFsdWUgd2lsbCBiZSB0aGlzCiAgICAgKiAgJGNvbGwgYW5kIHRoZSBmaW5hbCBvbmUgd2lsbCBiZSBhbiBlbXB0eSAkY29sbCwgd2l0aCB0aGUgaW50ZXJ2ZW5pbmcKICAgICAqICB2YWx1ZXMgdGhlIHJlc3VsdHMgb2Ygc3VjY2Vzc2l2ZSBhcHBsaWNhdGlvbnMgb2YgYGluaXRgLgogICAgICoKICAgICAqICBAcmV0dXJuICBhbiBpdGVyYXRvciBvdmVyIGFsbCB0aGUgaW5pdHMgb2YgdGhpcyAkY29sbAogICAgICogIEBleGFtcGxlICBgTGlzdCgxLDIsMykuaW5pdHMgPSBJdGVyYXRvcihMaXN0KDEsMiwzKSwgTGlzdCgxLDIpLCBMaXN0KDEpLCBOaWwpYAogICAgICovCiAgICBkZWYgaW5pdHM6IEl0ZXJhdG9yW1JlcHJdID0gaXRlcmF0ZVVudGlsRW1wdHkoXy5pbml0KQoKICAgIC8qKiBDb3BpZXMgZWxlbWVudHMgb2YgdGhpcyAkY29sbCB0byBhbiBhcnJheS4KICAgICAqICBGaWxscyB0aGUgZ2l2ZW4gYXJyYXkgYHhzYCB3aXRoIGF0IG1vc3QgYGxlbmAgZWxlbWVudHMgb2YKICAgICAqICB0aGlzICRjb2xsLCBzdGFydGluZyBhdCBwb3NpdGlvbiBgc3RhcnRgLgogICAgICogIENvcHlpbmcgd2lsbCBzdG9wIG9uY2UgZWl0aGVyIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgJGNvbGwgaXMgcmVhY2hlZCwKICAgICAqICBvciB0aGUgZW5kIG9mIHRoZSBhcnJheSBpcyByZWFjaGVkLCBvciBgbGVuYCBlbGVtZW50cyBoYXZlIGJlZW4gY29waWVkLgogICAgICoKICAgICAqICAkd2lsbE5vdFRlcm1pbmF0ZUluZgogICAgICogCiAgICAgKiAgQHBhcmFtICB4cyAgICAgdGhlIGFycmF5IHRvIGZpbGwuCiAgICAgKiAgQHBhcmFtICBzdGFydCAgdGhlIHN0YXJ0aW5nIGluZGV4LgogICAgICogIEBwYXJhbSAgbGVuICAgIHRoZSBtYXhpbWFsIG51bWJlciBvZiBlbGVtZW50cyB0byBjb3B5LgogICAgICogIEB0cGFyYW0gQiAgICAgIHRoZSB0eXBlIG9mIHRoZSBlbGVtZW50cyBvZiB0aGUgYXJyYXkuIAogICAgICogCiAgICAgKgogICAgICogIEB1c2VjYXNlIGRlZiBjb3B5VG9BcnJheSh4czogQXJyYXlbQV0sIHN0YXJ0OiBJbnQsIGxlbjogSW50KTogVW5pdAogICAgICovCiAgICBkZWYgY29weVRvQXJyYXlbQiA+OiBBXSh4czogQXJyYXlbQl0sIHN0YXJ0OiBJbnQsIGxlbjogSW50KSB7CiAgICAgIHZhciBpID0gc3RhcnQKICAgICAgdmFsIGVuZCA9IChzdGFydCArIGxlbikgbWluIHhzLmxlbmd0aAogICAgICBicmVha2FibGUgewogICAgICAgIGZvciAoeCA8LSB0aGlzKSB7CiAgICAgICAgICBpZiAoaSA+PSBlbmQpIGJyZWFrCiAgICAgICAgICB4cyhpKSA9IHgKICAgICAgICAgIGkgKz0gMQogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGRlZiB0b1RyYXZlcnNhYmxlOiBUcmF2ZXJzYWJsZVtBXSA9IHRoaXNDb2xsZWN0aW9uCiAgICBkZWYgdG9JdGVyYXRvcjogSXRlcmF0b3JbQV0gPSB0b1N0cmVhbS5pdGVyYXRvcgogICAgZGVmIHRvU3RyZWFtOiBTdHJlYW1bQV0gPSB0b0J1ZmZlci50b1N0cmVhbQoKICAgIC8qKiBDb252ZXJ0cyB0aGlzICRjb2xsIHRvIGEgc3RyaW5nLgogICAgICoKICAgICAqICBAcmV0dXJuICAgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBjb2xsZWN0aW9uLiBCeSBkZWZhdWx0IHRoaXMKICAgICAqICAgICAgICAgICAgc3RyaW5nIGNvbnNpc3RzIG9mIHRoZSBgc3RyaW5nUHJlZml4YCBvZiB0aGlzICRjb2xsLAogICAgICogICAgICAgICAgICBmb2xsb3dlZCBieSBhbGwgZWxlbWVudHMgc2VwYXJhdGVkIGJ5IGNvbW1hcyBhbmQgZW5jbG9zZWQgaW4gcGFyZW50aGVzZXMuCiAgICAgKi8KICAgIG92ZXJyaWRlIGRlZiB0b1N0cmluZyA9IG1rU3RyaW5nKHN0cmluZ1ByZWZpeCArICIoIiwgIiwgIiwgIikiKQoKICAgIC8qKiBEZWZpbmVzIHRoZSBwcmVmaXggb2YgdGhpcyBvYmplY3QncyBgdG9TdHJpbmdgIHJlcHJlc2VudGF0aW9uLgogICAgICoKICAgICAqICBAcmV0dXJuICBhIHN0cmluZyByZXByZXNlbnRhdGlvbiB3aGljaCBzdGFydHMgdGhlIHJlc3VsdCBvZiBgdG9TdHJpbmdgCiAgICAgKiAgICAgICAgICAgYXBwbGllZCB0byB0aGlzICRjb2xsLiBCeSBkZWZhdWx0IHRoZSBzdHJpbmcgcHJlZml4IGlzIHRoZQogICAgICogICAgICAgICAgIHNpbXBsZSBuYW1lIG9mIHRoZSBjb2xsZWN0aW9uIGNsYXNzICRjb2xsLgogICAgICovCiAgICBkZWYgc3RyaW5nUHJlZml4IDogU3RyaW5nID0gewogICAgICB2YXIgc3RyaW5nID0gcmVwci5hc0luc3RhbmNlT2ZbQW55UmVmXS5nZXRDbGFzcy5nZXROYW1lCiAgICAgIHZhbCBpZHgxID0gc3RyaW5nLmxhc3RJbmRleE9mKCcuJyA6IEludCkKICAgICAgaWYgKGlkeDEgIT0gLTEpIHN0cmluZyA9IHN0cmluZy5zdWJzdHJpbmcoaWR4MSArIDEpCiAgICAgIHZhbCBpZHgyID0gc3RyaW5nLmluZGV4T2YoJyQnKQogICAgICBpZiAoaWR4MiAhPSAtMSkgc3RyaW5nID0gc3RyaW5nLnN1YnN0cmluZygwLCBpZHgyKQogICAgICBzdHJpbmcKICAgIH0KCiAgICAvKiogQ3JlYXRlcyBhIG5vbi1zdHJpY3QgdmlldyBvZiB0aGlzICRjb2xsLgogICAgICogCiAgICAgKiAgQHJldHVybiBhIG5vbi1zdHJpY3QgdmlldyBvZiB0aGlzICRjb2xsLgogICAgICovCiAgICBkZWYgdmlldyA9IG5ldyBUcmF2ZXJzYWJsZVZpZXdbQSwgUmVwcl0gewogICAgICBwcm90ZWN0ZWQgbGF6eSB2YWwgdW5kZXJseWluZyA9IHNlbGYucmVwcgogICAgICBvdmVycmlkZSBkZWYgZm9yZWFjaFtVXShmOiBBID0+IFUpID0gc2VsZiBmb3JlYWNoIGYKICAgIH0KCiAgICAvKiogQ3JlYXRlcyBhIG5vbi1zdHJpY3QgdmlldyBvZiBhIHNsaWNlIG9mIHRoaXMgJGNvbGwuCiAgICAgKgogICAgICogIE5vdGU6IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYHZpZXdgIGFuZCBgc2xpY2VgIGlzIHRoYXQgYHZpZXdgIHByb2R1Y2VzCiAgICAgKiAgICAgICAgYSB2aWV3IG9mIHRoZSBjdXJyZW50ICRjb2xsLCB3aGVyZWFzIGBzbGljZWAgcHJvZHVjZXMgYSBuZXcgJGNvbGwuCiAgICAgKiAKICAgICAqICBOb3RlOiBgdmlldyhmcm9tLCB0bylgIGlzIGVxdWl2YWxlbnQgdG8gYHZpZXcuc2xpY2UoZnJvbSwgdG8pYAogICAgICogICRvcmRlckRlcGVuZGVudAogICAgICogCiAgICAgKiAgQHBhcmFtIGZyb20gICB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhlIHZpZXcKICAgICAqICBAcGFyYW0gdW50aWwgIHRoZSBpbmRleCBvZiB0aGUgZWxlbWVudCBmb2xsb3dpbmcgdGhlIHZpZXcKICAgICAqICBAcmV0dXJuIGEgbm9uLXN0cmljdCB2aWV3IG9mIGEgc2xpY2Ugb2YgdGhpcyAkY29sbCwgc3RhcnRpbmcgYXQgaW5kZXggYGZyb21gCiAgICAgKiAgYW5kIGV4dGVuZGluZyB1cCB0byAoYnV0IG5vdCBpbmNsdWRpbmcpIGluZGV4IGB1bnRpbGAuCiAgICAgKi8KICAgIGRlZiB2aWV3KGZyb206IEludCwgdW50aWw6IEludCk6IFRyYXZlcnNhYmxlVmlld1tBLCBSZXByXSA9IHZpZXcuc2xpY2UoZnJvbSwgdW50aWwpCgogICAgLyoqIENyZWF0ZXMgYSBub24tc3RyaWN0IGZpbHRlciBvZiB0aGlzICRjb2xsLgogICAgICoKICAgICAqICBOb3RlOiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGBjIGZpbHRlciBwYCBhbmQgYGMgd2l0aEZpbHRlciBwYCBpcyB0aGF0CiAgICAgKiAgICAgICAgdGhlIGZvcm1lciBjcmVhdGVzIGEgbmV3IGNvbGxlY3Rpb24sIHdoZXJlYXMgdGhlIGxhdHRlciBvbmx5CiAgICAgKiAgICAgICAgcmVzdHJpY3RzIHRoZSBkb21haW4gb2Ygc3Vic2VxdWVudCBgbWFwYCwgYGZsYXRNYXBgLCBgZm9yZWFjaGAsCiAgICAgKiAgICAgICAgYW5kIGB3aXRoRmlsdGVyYCBvcGVyYXRpb25zLgogICAgICogICRvcmRlckRlcGVuZGVudAogICAgICogCiAgICAgKiAgQHBhcmFtIHAgICB0aGUgcHJlZGljYXRlIHVzZWQgdG8gdGVzdCBlbGVtZW50cy4KICAgICAqICBAcmV0dXJuICAgIGFuIG9iamVjdCBvZiBjbGFzcyBgV2l0aEZpbHRlcmAsIHdoaWNoIHN1cHBvcnRzCiAgICAgKiAgICAgICAgICAgICBgbWFwYCwgYGZsYXRNYXBgLCBgZm9yZWFjaGAsIGFuZCBgd2l0aEZpbHRlcmAgb3BlcmF0aW9ucy4KICAgICAqICAgICAgICAgICAgIEFsbCB0aGVzZSBvcGVyYXRpb25zIGFwcGx5IHRvIHRob3NlIGVsZW1lbnRzIG9mIHRoaXMgJGNvbGwgd2hpY2gKICAgICAqICAgICAgICAgICAgIHNhdGlzZnkgdGhlIHByZWRpY2F0ZSBgcGAuCiAgICAgKi8KICAgIGRlZiB3aXRoRmlsdGVyKHA6IEEgPT4gQm9vbGVhbik6IEZpbHRlck1vbmFkaWNbQSwgUmVwcl0gPSBuZXcgV2l0aEZpbHRlcihwKQoKICAgIC8qKiBBIGNsYXNzIHN1cHBvcnRpbmcgZmlsdGVyZWQgb3BlcmF0aW9ucy4gSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgYXJlCiAgICAgKiAgcmV0dXJuZWQgYnkgbWV0aG9kIGB3aXRoRmlsdGVyYC4KICAgICAqLwogICAgY2xhc3MgV2l0aEZpbHRlcihwOiBBID0+IEJvb2xlYW4pIGV4dGVuZHMgRmlsdGVyTW9uYWRpY1tBLCBSZXByXSB7CgogICAgICAvKiogQnVpbGRzIGEgbmV3IGNvbGxlY3Rpb24gYnkgYXBwbHlpbmcgYSBmdW5jdGlvbiB0byBhbGwgZWxlbWVudHMgb2YgdGhlCiAgICAgICAqICBvdXRlciAkY29sbCBjb250YWluaW5nIHRoaXMgYFdpdGhGaWx0ZXJgIGluc3RhbmNlIHRoYXQgc2F0aXNmeSBwcmVkaWNhdGUgYHBgLgogICAgICAgKgogICAgICAgKiAgQHBhcmFtIGYgICAgICB0aGUgZnVuY3Rpb24gdG8gYXBwbHkgdG8gZWFjaCBlbGVtZW50LgogICAgICAgKiAgQHRwYXJhbSBCICAgICB0aGUgZWxlbWVudCB0eXBlIG9mIHRoZSByZXR1cm5lZCBjb2xsZWN0aW9uLgogICAgICAgKiAgQHRwYXJhbSBUaGF0ICAkdGhhdGluZm8KICAgICAgICogIEBwYXJhbSBiZiAgICAgJGJmaW5mbwogICAgICAgKiAgQHJldHVybiAgICAgICBhIG5ldyBjb2xsZWN0aW9uIG9mIHR5cGUgYFRoYXRgIHJlc3VsdGluZyBmcm9tIGFwcGx5aW5nCiAgICAgICAqICAgICAgICAgICAgICAgIHRoZSBnaXZlbiBmdW5jdGlvbiBgZmAgdG8gZWFjaCBlbGVtZW50IG9mIHRoZSBvdXRlciAkY29sbAogICAgICAgKiAgICAgICAgICAgICAgICB0aGF0IHNhdGlzZmllcyBwcmVkaWNhdGUgYHBgIGFuZCBjb2xsZWN0aW5nIHRoZSByZXN1bHRzLgogICAgICAgKgogICAgICAgKiAgQHVzZWNhc2UgZGVmIG1hcFtCXShmOiBBID0+IEIpOiAkQ29sbFtCXSAKICAgICAgICogIAogICAgICAgKiAgQHJldHVybiAgICAgICBhIG5ldyAkY29sbCByZXN1bHRpbmcgZnJvbSBhcHBseWluZyB0aGUgZ2l2ZW4gZnVuY3Rpb24KICAgICAgICogICAgICAgICAgICAgICAgYGZgIHRvIGVhY2ggZWxlbWVudCBvZiB0aGUgb3V0ZXIgJGNvbGwgdGhhdCBzYXRpc2ZpZXMKICAgICAgICogICAgICAgICAgICAgICAgcHJlZGljYXRlIGBwYCBhbmQgY29sbGVjdGluZyB0aGUgcmVzdWx0cy4KICAgICAgICovCiAgICAgIGRlZiBtYXBbQiwgVGhhdF0oZjogQSA9PiBCKShpbXBsaWNpdCBiZjogQ2FuQnVpbGRGcm9tW1JlcHIsIEIsIFRoYXRdKTogVGhhdCA9IHsKICAgICAgICB2YWwgYiA9IGJmKHJlcHIpCiAgICAgICAgZm9yICh4IDwtIHNlbGYpIAogICAgICAgICAgaWYgKHAoeCkpIGIgKz0gZih4KQogICAgICAgIGIucmVzdWx0CiAgICAgIH0KCiAgICAgIC8qKiBCdWlsZHMgYSBuZXcgY29sbGVjdGlvbiBieSBhcHBseWluZyBhIGZ1bmN0aW9uIHRvIGFsbCBlbGVtZW50cyBvZiB0aGUKICAgICAgICogIG91dGVyICRjb2xsIGNvbnRhaW5pbmcgdGhpcyBgV2l0aEZpbHRlcmAgaW5zdGFuY2UgdGhhdCBzYXRpc2Z5CiAgICAgICAqICBwcmVkaWNhdGUgYHBgIGFuZCBjb25jYXRlbmF0aW5nIHRoZSByZXN1bHRzLiAKICAgICAgICoKICAgICAgICogIEBwYXJhbSBmICAgICAgdGhlIGZ1bmN0aW9uIHRvIGFwcGx5IHRvIGVhY2ggZWxlbWVudC4KICAgICAgICogIEB0cGFyYW0gQiAgICAgdGhlIGVsZW1lbnQgdHlwZSBvZiB0aGUgcmV0dXJuZWQgY29sbGVjdGlvbi4KICAgICAgICogIEB0cGFyYW0gVGhhdCAgJHRoYXRpbmZvCiAgICAgICAqICBAcGFyYW0gYmYgICAgICRiZmluZm8KICAgICAgICogIEByZXR1cm4gICAgICAgYSBuZXcgY29sbGVjdGlvbiBvZiB0eXBlIGBUaGF0YCByZXN1bHRpbmcgZnJvbSBhcHBseWluZwogICAgICAgKiAgICAgICAgICAgICAgICB0aGUgZ2l2ZW4gY29sbGVjdGlvbi12YWx1ZWQgZnVuY3Rpb24gYGZgIHRvIGVhY2ggZWxlbWVudAogICAgICAgKiAgICAgICAgICAgICAgICBvZiB0aGUgb3V0ZXIgJGNvbGwgdGhhdCBzYXRpc2ZpZXMgcHJlZGljYXRlIGBwYCBhbmQKICAgICAgICogICAgICAgICAgICAgICAgY29uY2F0ZW5hdGluZyB0aGUgcmVzdWx0cy4KICAgICAgICoKICAgICAgICogIEB1c2VjYXNlIGRlZiBmbGF0TWFwW0JdKGY6IEEgPT4gVHJhdmVyc2FibGVPbmNlW0JdKTogJENvbGxbQl0KICAgICAgICogCiAgICAgICAqICBAcmV0dXJuICAgICAgIGEgbmV3ICRjb2xsIHJlc3VsdGluZyBmcm9tIGFwcGx5aW5nIHRoZSBnaXZlbiBjb2xsZWN0aW9uLXZhbHVlZCBmdW5jdGlvbgogICAgICAgKiAgICAgICAgICAgICAgICBgZmAgdG8gZWFjaCBlbGVtZW50IG9mIHRoZSBvdXRlciAkY29sbCB0aGF0IHNhdGlzZmllcyBwcmVkaWNhdGUgYHBgIGFuZCBjb25jYXRlbmF0aW5nIHRoZSByZXN1bHRzLgogICAgICAgKi8KICAgICAgZGVmIGZsYXRNYXBbQiwgVGhhdF0oZjogQSA9PiBHZW5UcmF2ZXJzYWJsZU9uY2VbQl0pKGltcGxpY2l0IGJmOiBDYW5CdWlsZEZyb21bUmVwciwgQiwgVGhhdF0pOiBUaGF0ID0gewogICAgICAgIHZhbCBiID0gYmYocmVwcikKICAgICAgICBmb3IgKHggPC0gc2VsZikgCiAgICAgICAgICBpZiAocCh4KSkgYiArKz0gZih4KS5zZXEKICAgICAgICBiLnJlc3VsdAogICAgICB9CgogICAgICAvKiogQXBwbGllcyBhIGZ1bmN0aW9uIGBmYCB0byBhbGwgZWxlbWVudHMgb2YgdGhlIG91dGVyICRjb2xsIGNvbnRhaW5pbmcKICAgICAgICogIHRoaXMgYFdpdGhGaWx0ZXJgIGluc3RhbmNlIHRoYXQgc2F0aXNmeSBwcmVkaWNhdGUgYHBgLgogICAgICAgKgogICAgICAgKiAgQHBhcmFtICBmICAgdGhlIGZ1bmN0aW9uIHRoYXQgaXMgYXBwbGllZCBmb3IgaXRzIHNpZGUtZWZmZWN0IHRvIGV2ZXJ5IGVsZW1lbnQuCiAgICAgICAqICAgICAgICAgICAgICBUaGUgcmVzdWx0IG9mIGZ1bmN0aW9uIGBmYCBpcyBkaXNjYXJkZWQuCiAgICAgICAqICAgICAgICAgICAgICAKICAgICAgICogIEB0cGFyYW0gIFUgIHRoZSB0eXBlIHBhcmFtZXRlciBkZXNjcmliaW5nIHRoZSByZXN1bHQgb2YgZnVuY3Rpb24gYGZgLiAKICAgICAgICogICAgICAgICAgICAgIFRoaXMgcmVzdWx0IHdpbGwgYWx3YXlzIGJlIGlnbm9yZWQuIFR5cGljYWxseSBgVWAgaXMgYFVuaXRgLAogICAgICAgKiAgICAgICAgICAgICAgYnV0IHRoaXMgaXMgbm90IG5lY2Vzc2FyeS4KICAgICAgICoKICAgICAgICogIEB1c2VjYXNlIGRlZiBmb3JlYWNoKGY6IEEgPT4gVW5pdCk6IFVuaXQKICAgICAgICovICAgCiAgICAgIGRlZiBmb3JlYWNoW1VdKGY6IEEgPT4gVSk6IFVuaXQgPSAKICAgICAgICBmb3IgKHggPC0gc2VsZikgCiAgICAgICAgICBpZiAocCh4KSkgZih4KQoKICAgICAgLyoqIEZ1cnRoZXIgcmVmaW5lcyB0aGUgZmlsdGVyIGZvciB0aGlzICRjb2xsLgogICAgICAgKgogICAgICAgKiAgQHBhcmFtIHEgICB0aGUgcHJlZGljYXRlIHVzZWQgdG8gdGVzdCBlbGVtZW50cy4KICAgICAgICogIEByZXR1cm4gICAgYW4gb2JqZWN0IG9mIGNsYXNzIGBXaXRoRmlsdGVyYCwgd2hpY2ggc3VwcG9ydHMKICAgICAgICogICAgICAgICAgICAgYG1hcGAsIGBmbGF0TWFwYCwgYGZvcmVhY2hgLCBhbmQgYHdpdGhGaWx0ZXJgIG9wZXJhdGlvbnMuCiAgICAgICAqICAgICAgICAgICAgIEFsbCB0aGVzZSBvcGVyYXRpb25zIGFwcGx5IHRvIHRob3NlIGVsZW1lbnRzIG9mIHRoaXMgJGNvbGwgd2hpY2gKICAgICAgICogICAgICAgICAgICAgc2F0aXNmeSB0aGUgcHJlZGljYXRlIGBxYCBpbiBhZGRpdGlvbiB0byB0aGUgcHJlZGljYXRlIGBwYC4KICAgICAgICovCiAgICAgIGRlZiB3aXRoRmlsdGVyKHE6IEEgPT4gQm9vbGVhbik6IFdpdGhGaWx0ZXIgPSAKICAgICAgICBuZXcgV2l0aEZpbHRlcih4ID0+IHAoeCkgJiYgcSh4KSkKICAgIH0KCiAgICAvLyBBIGhlbHBlciBmb3IgdGFpbHMgYW5kIGluaXRzLgogICAgcHJpdmF0ZSBkZWYgaXRlcmF0ZVVudGlsRW1wdHkoZjogVHJhdmVyc2FibGVbQSBAdVZdID0+IFRyYXZlcnNhYmxlW0EgQHVWXSk6IEl0ZXJhdG9yW1JlcHJdID0gewogICAgICB2YWwgaXQgPSBJdGVyYXRvci5pdGVyYXRlKHRoaXNDb2xsZWN0aW9uKShmKSB0YWtlV2hpbGUgKHggPT4gIXguaXNFbXB0eSkKICAgICAgaXQgKysgSXRlcmF0b3IoTmlsKSBtYXAgKG5ld0J1aWxkZXIgKys9IF8gcmVzdWx0KQogICAgfQogIH0KCgo8L3RleHRhcmVhPgo8L2Zvcm0+CgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgICAgICBtYXRjaEJyYWNrZXRzOiB0cnVlLAogICAgICAgIHRoZW1lOiAiYW1iaWFuY2UiLAogICAgICAgIG1vZGU6ICJ0ZXh0L3gtc2NhbGEiCiAgICAgIH0pOwogICAgPC9zY3JpcHQ+CiAgPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/clojure/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/clojure/clojure.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovKioKICogQXV0aG9yOiBIYW5zIEVuZ2VsCiAqIEJyYW5jaGVkIGZyb20gQ29kZU1pcnJvcidzIFNjaGVtZSBtb2RlIChieSBLb2ggWmkgSGFuLCBiYXNlZCBvbiBpbXBsZW1lbnRhdGlvbiBieSBLb2ggWmkgQ2h1bikKICovCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJjbG9qdXJlIiwgZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgIHZhciBCVUlMVElOID0gImJ1aWx0aW4iLCBDT01NRU5UID0gImNvbW1lbnQiLCBTVFJJTkcgPSAic3RyaW5nIiwgQ0hBUkFDVEVSID0gInN0cmluZy0yIiwKICAgICAgICBBVE9NID0gImF0b20iLCBOVU1CRVIgPSAibnVtYmVyIiwgQlJBQ0tFVCA9ICJicmFja2V0IiwgS0VZV09SRCA9ICJrZXl3b3JkIjsKICAgIHZhciBJTkRFTlRfV09SRF9TS0lQID0gb3B0aW9ucy5pbmRlbnRVbml0IHx8IDI7CiAgICB2YXIgTk9STUFMX0lOREVOVF9VTklUID0gb3B0aW9ucy5pbmRlbnRVbml0IHx8IDI7CgogICAgZnVuY3Rpb24gbWFrZUtleXdvcmRzKHN0cikgewogICAgICAgIHZhciBvYmogPSB7fSwgd29yZHMgPSBzdHIuc3BsaXQoIiAiKTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHdvcmRzLmxlbmd0aDsgKytpKSBvYmpbd29yZHNbaV1dID0gdHJ1ZTsKICAgICAgICByZXR1cm4gb2JqOwogICAgfQoKICAgIHZhciBhdG9tcyA9IG1ha2VLZXl3b3JkcygidHJ1ZSBmYWxzZSBuaWwiKTsKCiAgICB2YXIga2V5d29yZHMgPSBtYWtlS2V5d29yZHMoCiAgICAgICJkZWZuIGRlZm4tIGRlZiBkZWYtIGRlZm9uY2UgZGVmbXVsdGkgZGVmbWV0aG9kIGRlZm1hY3JvIGRlZnN0cnVjdCBkZWZ0eXBlIGRlZnByb3RvY29sIGRlZnJlY29yZCBkZWZwcm9qZWN0IGRlZnRlc3Qgc2xpY2UgZGVmYWxpYXMgZGVmaGludGVkIGRlZm1hY3JvLSBkZWZuLW1lbW8gZGVmbmsgZGVmbmsgZGVmb25jZS0gZGVmdW5ib3VuZCBkZWZ1bmJvdW5kLSBkZWZ2YXIgZGVmdmFyLSBsZXQgbGV0Zm4gZG8gY2FzZSBjb25kIGNvbmRwIGZvciBsb29wIHJlY3VyIHdoZW4gd2hlbi1ub3Qgd2hlbi1sZXQgd2hlbi1maXJzdCBpZiBpZi1sZXQgaWYtbm90IC4gLi4gLT4gLT4+IGRvdG8gYW5kIG9yIGRvc3luYyBkb3NlcSBkb3RpbWVzIGRvcnVuIGRvYWxsIGxvYWQgaW1wb3J0IHVuaW1wb3J0IG5zIGluLW5zIHJlZmVyIHRyeSBjYXRjaCBmaW5hbGx5IHRocm93IHdpdGgtb3BlbiB3aXRoLWxvY2FsLXZhcnMgYmluZGluZyBnZW4tY2xhc3MgZ2VuLWFuZC1sb2FkLWNsYXNzIGdlbi1hbmQtc2F2ZS1jbGFzcyBoYW5kbGVyLWNhc2UgaGFuZGxlIik7CgogICAgdmFyIGJ1aWx0aW5zID0gbWFrZUtleXdvcmRzKAogICAgICAgICIqIConICoxICoyICozICphZ2VudCogKmFsbG93LXVucmVzb2x2ZWQtdmFycyogKmFzc2VydCogKmNsb2p1cmUtdmVyc2lvbiogKmNvbW1hbmQtbGluZS1hcmdzKiAqY29tcGlsZS1maWxlcyogKmNvbXBpbGUtcGF0aCogKmNvbXBpbGVyLW9wdGlvbnMqICpkYXRhLXJlYWRlcnMqICplICplcnIqICpmaWxlKiAqZmx1c2gtb24tbmV3bGluZSogKmZuLWxvYWRlciogKmluKiAqbWF0aC1jb250ZXh0KiAqbnMqICpvdXQqICpwcmludC1kdXAqICpwcmludC1sZW5ndGgqICpwcmludC1sZXZlbCogKnByaW50LW1ldGEqICpwcmludC1yZWFkYWJseSogKnJlYWQtZXZhbCogKnNvdXJjZS1wYXRoKiAqdW5jaGVja2VkLW1hdGgqICp1c2UtY29udGV4dC1jbGFzc2xvYWRlciogKnZlcmJvc2UtZGVmcmVjb3JkcyogKndhcm4tb24tcmVmbGVjdGlvbiogKyArJyAtIC0nIC0+IC0+PiAtPkFycmF5Q2h1bmsgLT5WZWMgLT5WZWNOb2RlIC0+VmVjU2VxIC1jYWNoZS1wcm90b2NvbC1mbiAtcmVzZXQtbWV0aG9kcyAuLiAvIDwgPD0gPSA9PSA+ID49IEVNUFRZLU5PREUgYWNjZXNzb3IgYWNsb25lIGFkZC1jbGFzc3BhdGggYWRkLXdhdGNoIGFnZW50IGFnZW50LWVycm9yIGFnZW50LWVycm9ycyBhZ2V0IGFsZW5ndGggYWxpYXMgYWxsLW5zIGFsdGVyIGFsdGVyLW1ldGEhIGFsdGVyLXZhci1yb290IGFtYXAgYW5jZXN0b3JzIGFuZCBhcHBseSBhcmVkdWNlIGFycmF5LW1hcCBhc2V0IGFzZXQtYm9vbGVhbiBhc2V0LWJ5dGUgYXNldC1jaGFyIGFzZXQtZG91YmxlIGFzZXQtZmxvYXQgYXNldC1pbnQgYXNldC1sb25nIGFzZXQtc2hvcnQgYXNzZXJ0IGFzc29jIGFzc29jISBhc3NvYy1pbiBhc3NvY2lhdGl2ZT8gYXRvbSBhd2FpdCBhd2FpdC1mb3IgYXdhaXQxIGJhc2VzIGJlYW4gYmlnZGVjIGJpZ2ludCBiaWdpbnRlZ2VyIGJpbmRpbmcgYml0LWFuZCBiaXQtYW5kLW5vdCBiaXQtY2xlYXIgYml0LWZsaXAgYml0LW5vdCBiaXQtb3IgYml0LXNldCBiaXQtc2hpZnQtbGVmdCBiaXQtc2hpZnQtcmlnaHQgYml0LXRlc3QgYml0LXhvciBib29sZWFuIGJvb2xlYW4tYXJyYXkgYm9vbGVhbnMgYm91bmQtZm4gYm91bmQtZm4qIGJvdW5kPyBidXRsYXN0IGJ5dGUgYnl0ZS1hcnJheSBieXRlcyBjYXNlIGNhc3QgY2hhciBjaGFyLWFycmF5IGNoYXItZXNjYXBlLXN0cmluZyBjaGFyLW5hbWUtc3RyaW5nIGNoYXI/IGNoYXJzIGNodW5rIGNodW5rLWFwcGVuZCBjaHVuay1idWZmZXIgY2h1bmstY29ucyBjaHVuay1maXJzdCBjaHVuay1uZXh0IGNodW5rLXJlc3QgY2h1bmtlZC1zZXE/IGNsYXNzIGNsYXNzPyBjbGVhci1hZ2VudC1lcnJvcnMgY2xvanVyZS12ZXJzaW9uIGNvbGw/IGNvbW1lbnQgY29tbXV0ZSBjb21wIGNvbXBhcmF0b3IgY29tcGFyZSBjb21wYXJlLWFuZC1zZXQhIGNvbXBpbGUgY29tcGxlbWVudCBjb25jYXQgY29uZCBjb25kcCBjb25qIGNvbmohIGNvbnMgY29uc3RhbnRseSBjb25zdHJ1Y3QtcHJveHkgY29udGFpbnM/IGNvdW50IGNvdW50ZWQ/IGNyZWF0ZS1ucyBjcmVhdGUtc3RydWN0IGN5Y2xlIGRlYyBkZWMnIGRlY2ltYWw/IGRlY2xhcmUgZGVmYXVsdC1kYXRhLXJlYWRlcnMgZGVmaW5saW5lIGRlZmludGVyZmFjZSBkZWZtYWNybyBkZWZtZXRob2QgZGVmbXVsdGkgZGVmbiBkZWZuLSBkZWZvbmNlIGRlZnByb3RvY29sIGRlZnJlY29yZCBkZWZzdHJ1Y3QgZGVmdHlwZSBkZWxheSBkZWxheT8gZGVsaXZlciBkZW5vbWluYXRvciBkZXJlZiBkZXJpdmUgZGVzY2VuZGFudHMgZGVzdHJ1Y3R1cmUgZGlzaiBkaXNqISBkaXNzb2MgZGlzc29jISBkaXN0aW5jdCBkaXN0aW5jdD8gZG9hbGwgZG9ydW4gZG9zZXEgZG9zeW5jIGRvdGltZXMgZG90byBkb3VibGUgZG91YmxlLWFycmF5IGRvdWJsZXMgZHJvcCBkcm9wLWxhc3QgZHJvcC13aGlsZSBlbXB0eSBlbXB0eT8gZW5zdXJlIGVudW1lcmF0aW9uLXNlcSBlcnJvci1oYW5kbGVyIGVycm9yLW1vZGUgZXZhbCBldmVuPyBldmVyeS1wcmVkIGV2ZXJ5PyBleC1kYXRhIGV4LWluZm8gZXh0ZW5kIGV4dGVuZC1wcm90b2NvbCBleHRlbmQtdHlwZSBleHRlbmRlcnMgZXh0ZW5kcz8gZmFsc2U/IGZmaXJzdCBmaWxlLXNlcSBmaWx0ZXIgZmlsdGVydiBmaW5kIGZpbmQta2V5d29yZCBmaW5kLW5zIGZpbmQtcHJvdG9jb2wtaW1wbCBmaW5kLXByb3RvY29sLW1ldGhvZCBmaW5kLXZhciBmaXJzdCBmbGF0dGVuIGZsb2F0IGZsb2F0LWFycmF5IGZsb2F0PyBmbG9hdHMgZmx1c2ggZm4gZm4/IGZuZXh0IGZuaWwgZm9yIGZvcmNlIGZvcm1hdCBmcmVxdWVuY2llcyBmdXR1cmUgZnV0dXJlLWNhbGwgZnV0dXJlLWNhbmNlbCBmdXR1cmUtY2FuY2VsbGVkPyBmdXR1cmUtZG9uZT8gZnV0dXJlPyBnZW4tY2xhc3MgZ2VuLWludGVyZmFjZSBnZW5zeW0gZ2V0IGdldC1pbiBnZXQtbWV0aG9kIGdldC1wcm94eS1jbGFzcyBnZXQtdGhyZWFkLWJpbmRpbmdzIGdldC12YWxpZGF0b3IgZ3JvdXAtYnkgaGFzaCBoYXNoLWNvbWJpbmUgaGFzaC1tYXAgaGFzaC1zZXQgaWRlbnRpY2FsPyBpZGVudGl0eSBpZi1sZXQgaWYtbm90IGlmbj8gaW1wb3J0IGluLW5zIGluYyBpbmMnIGluaXQtcHJveHkgaW5zdGFuY2U/IGludCBpbnQtYXJyYXkgaW50ZWdlcj8gaW50ZXJsZWF2ZSBpbnRlcm4gaW50ZXJwb3NlIGludG8gaW50by1hcnJheSBpbnRzIGlvISBpc2E/IGl0ZXJhdGUgaXRlcmF0b3Itc2VxIGp1eHQga2VlcCBrZWVwLWluZGV4ZWQga2V5IGtleXMga2V5d29yZCBrZXl3b3JkPyBsYXN0IGxhenktY2F0IGxhenktc2VxIGxldCBsZXRmbiBsaW5lLXNlcSBsaXN0IGxpc3QqIGxpc3Q/IGxvYWQgbG9hZC1maWxlIGxvYWQtcmVhZGVyIGxvYWQtc3RyaW5nIGxvYWRlZC1saWJzIGxvY2tpbmcgbG9uZyBsb25nLWFycmF5IGxvbmdzIGxvb3AgbWFjcm9leHBhbmQgbWFjcm9leHBhbmQtMSBtYWtlLWFycmF5IG1ha2UtaGllcmFyY2h5IG1hcCBtYXAtaW5kZXhlZCBtYXA/IG1hcGNhdCBtYXB2IG1heCBtYXgta2V5IG1lbWZuIG1lbW9pemUgbWVyZ2UgbWVyZ2Utd2l0aCBtZXRhIG1ldGhvZC1zaWcgbWV0aG9kcyBtaW4gbWluLWtleSBtb2QgbXVuZ2UgbmFtZSBuYW1lc3BhY2UgbmFtZXNwYWNlLW11bmdlIG5lZz8gbmV3bGluZSBuZXh0IG5maXJzdCBuaWw/IG5uZXh0IG5vdCBub3QtYW55PyBub3QtZW1wdHkgbm90LWV2ZXJ5PyBub3Q9IG5zIG5zLWFsaWFzZXMgbnMtaW1wb3J0cyBucy1pbnRlcm5zIG5zLW1hcCBucy1uYW1lIG5zLXB1YmxpY3MgbnMtcmVmZXJzIG5zLXJlc29sdmUgbnMtdW5hbGlhcyBucy11bm1hcCBudGggbnRobmV4dCBudGhyZXN0IG51bSBudW1iZXI/IG51bWVyYXRvciBvYmplY3QtYXJyYXkgb2RkPyBvciBwYXJlbnRzIHBhcnRpYWwgcGFydGl0aW9uIHBhcnRpdGlvbi1hbGwgcGFydGl0aW9uLWJ5IHBjYWxscyBwZWVrIHBlcnNpc3RlbnQhIHBtYXAgcG9wIHBvcCEgcG9wLXRocmVhZC1iaW5kaW5ncyBwb3M/IHByIHByLXN0ciBwcmVmZXItbWV0aG9kIHByZWZlcnMgcHJpbWl0aXZlcy1jbGFzc25hbWVzIHByaW50IHByaW50LWN0b3IgcHJpbnQtZHVwIHByaW50LW1ldGhvZCBwcmludC1zaW1wbGUgcHJpbnQtc3RyIHByaW50ZiBwcmludGxuIHByaW50bG4tc3RyIHBybiBwcm4tc3RyIHByb21pc2UgcHJveHkgcHJveHktY2FsbC13aXRoLXN1cGVyIHByb3h5LW1hcHBpbmdzIHByb3h5LW5hbWUgcHJveHktc3VwZXIgcHVzaC10aHJlYWQtYmluZGluZ3MgcHZhbHVlcyBxdW90IHJhbmQgcmFuZC1pbnQgcmFuZC1udGggcmFuZ2UgcmF0aW8/IHJhdGlvbmFsPyByYXRpb25hbGl6ZSByZS1maW5kIHJlLWdyb3VwcyByZS1tYXRjaGVyIHJlLW1hdGNoZXMgcmUtcGF0dGVybiByZS1zZXEgcmVhZCByZWFkLWxpbmUgcmVhZC1zdHJpbmcgcmVhbGl6ZWQ/IHJlZHVjZSByZWR1Y2Uta3YgcmVkdWN0aW9ucyByZWYgcmVmLWhpc3RvcnktY291bnQgcmVmLW1heC1oaXN0b3J5IHJlZi1taW4taGlzdG9yeSByZWYtc2V0IHJlZmVyIHJlZmVyLWNsb2p1cmUgcmVpZnkgcmVsZWFzZS1wZW5kaW5nLXNlbmRzIHJlbSByZW1vdmUgcmVtb3ZlLWFsbC1tZXRob2RzIHJlbW92ZS1tZXRob2QgcmVtb3ZlLW5zIHJlbW92ZS13YXRjaCByZXBlYXQgcmVwZWF0ZWRseSByZXBsYWNlIHJlcGxpY2F0ZSByZXF1aXJlIHJlc2V0ISByZXNldC1tZXRhISByZXNvbHZlIHJlc3QgcmVzdGFydC1hZ2VudCByZXN1bHRzZXQtc2VxIHJldmVyc2UgcmV2ZXJzaWJsZT8gcnNlcSByc3Vic2VxIHNhdGlzZmllcz8gc2Vjb25kIHNlbGVjdC1rZXlzIHNlbmQgc2VuZC1vZmYgc2VxIHNlcT8gc2VxdWUgc2VxdWVuY2Ugc2VxdWVudGlhbD8gc2V0IHNldC1lcnJvci1oYW5kbGVyISBzZXQtZXJyb3ItbW9kZSEgc2V0LXZhbGlkYXRvciEgc2V0PyBzaG9ydCBzaG9ydC1hcnJheSBzaG9ydHMgc2h1ZmZsZSBzaHV0ZG93bi1hZ2VudHMgc2x1cnAgc29tZSBzb21lLWZuIHNvcnQgc29ydC1ieSBzb3J0ZWQtbWFwIHNvcnRlZC1tYXAtYnkgc29ydGVkLXNldCBzb3J0ZWQtc2V0LWJ5IHNvcnRlZD8gc3BlY2lhbC1zeW1ib2w/IHNwaXQgc3BsaXQtYXQgc3BsaXQtd2l0aCBzdHIgc3RyaW5nPyBzdHJ1Y3Qgc3RydWN0LW1hcCBzdWJzIHN1YnNlcSBzdWJ2ZWMgc3VwZXJzIHN3YXAhIHN5bWJvbCBzeW1ib2w/IHN5bmMgdGFrZSB0YWtlLWxhc3QgdGFrZS1udGggdGFrZS13aGlsZSB0ZXN0IHRoZS1ucyB0aHJlYWQtYm91bmQ/IHRpbWUgdG8tYXJyYXkgdG8tYXJyYXktMmQgdHJhbXBvbGluZSB0cmFuc2llbnQgdHJlZS1zZXEgdHJ1ZT8gdHlwZSB1bmNoZWNrZWQtYWRkIHVuY2hlY2tlZC1hZGQtaW50IHVuY2hlY2tlZC1ieXRlIHVuY2hlY2tlZC1jaGFyIHVuY2hlY2tlZC1kZWMgdW5jaGVja2VkLWRlYy1pbnQgdW5jaGVja2VkLWRpdmlkZS1pbnQgdW5jaGVja2VkLWRvdWJsZSB1bmNoZWNrZWQtZmxvYXQgdW5jaGVja2VkLWluYyB1bmNoZWNrZWQtaW5jLWludCB1bmNoZWNrZWQtaW50IHVuY2hlY2tlZC1sb25nIHVuY2hlY2tlZC1tdWx0aXBseSB1bmNoZWNrZWQtbXVsdGlwbHktaW50IHVuY2hlY2tlZC1uZWdhdGUgdW5jaGVja2VkLW5lZ2F0ZS1pbnQgdW5jaGVja2VkLXJlbWFpbmRlci1pbnQgdW5jaGVja2VkLXNob3J0IHVuY2hlY2tlZC1zdWJ0cmFjdCB1bmNoZWNrZWQtc3VidHJhY3QtaW50IHVuZGVyaXZlIHVucXVvdGUgdW5xdW90ZS1zcGxpY2luZyB1cGRhdGUtaW4gdXBkYXRlLXByb3h5IHVzZSB2YWwgdmFscyB2YXItZ2V0IHZhci1zZXQgdmFyPyB2YXJ5LW1ldGEgdmVjIHZlY3RvciB2ZWN0b3Itb2YgdmVjdG9yPyB3aGVuIHdoZW4tZmlyc3Qgd2hlbi1sZXQgd2hlbi1ub3Qgd2hpbGUgd2l0aC1iaW5kaW5ncyB3aXRoLWJpbmRpbmdzKiB3aXRoLWluLXN0ciB3aXRoLWxvYWRpbmctY29udGV4dCB3aXRoLWxvY2FsLXZhcnMgd2l0aC1tZXRhIHdpdGgtb3BlbiB3aXRoLW91dC1zdHIgd2l0aC1wcmVjaXNpb24gd2l0aC1yZWRlZnMgd2l0aC1yZWRlZnMtZm4geG1sLXNlcSB6ZXJvPyB6aXBtYXAgKmRlZmF1bHQtZGF0YS1yZWFkZXItZm4qIGFzLT4gY29uZC0+IGNvbmQtPj4gcmVkdWNlZCByZWR1Y2VkPyBzZW5kLXZpYSBzZXQtYWdlbnQtc2VuZC1leGVjdXRvciEgc2V0LWFnZW50LXNlbmQtb2ZmLWV4ZWN1dG9yISBzb21lLT4gc29tZS0+PiIpOwoKICAgIHZhciBpbmRlbnRLZXlzID0gbWFrZUtleXdvcmRzKAogICAgICAgIC8vIEJ1aWx0LWlucwogICAgICAgICJucyBmbiBkZWYgZGVmbiBkZWZtZXRob2QgYm91bmQtZm4gaWYgaWYtbm90IGNhc2UgY29uZHAgd2hlbiB3aGlsZSB3aGVuLW5vdCB3aGVuLWZpcnN0IGRvIGZ1dHVyZSBjb21tZW50IGRvdG8gbG9ja2luZyBwcm94eSB3aXRoLW9wZW4gd2l0aC1wcmVjaXNpb24gcmVpZnkgZGVmdHlwZSBkZWZyZWNvcmQgZGVmcHJvdG9jb2wgZXh0ZW5kIGV4dGVuZC1wcm90b2NvbCBleHRlbmQtdHlwZSB0cnkgY2F0Y2ggIiArCgogICAgICAgIC8vIEJpbmRpbmcgZm9ybXMKICAgICAgICAibGV0IGxldGZuIGJpbmRpbmcgbG9vcCBmb3IgZG9zZXEgZG90aW1lcyB3aGVuLWxldCBpZi1sZXQgIiArCgogICAgICAgIC8vIERhdGEgc3RydWN0dXJlcwogICAgICAgICJkZWZzdHJ1Y3Qgc3RydWN0LW1hcCBhc3NvYyAiICsKCiAgICAgICAgLy8gY2xvanVyZS50ZXN0CiAgICAgICAgInRlc3RpbmcgZGVmdGVzdCAiICsKCiAgICAgICAgLy8gY29udHJpYgogICAgICAgICJoYW5kbGVyLWNhc2UgaGFuZGxlIGRvdHJhY2UgZGVmdHJhY2UiKTsKCiAgICB2YXIgdGVzdHMgPSB7CiAgICAgICAgZGlnaXQ6IC9cZC8sCiAgICAgICAgZGlnaXRfb3JfY29sb246IC9bXGQ6XS8sCiAgICAgICAgaGV4OiAvWzAtOWEtZl0vaSwKICAgICAgICBzaWduOiAvWystXS8sCiAgICAgICAgZXhwb25lbnQ6IC9lL2ksCiAgICAgICAga2V5d29yZF9jaGFyOiAvW15cc1woXFtcO1wpXF1dLywKICAgICAgICBzeW1ib2w6IC9bXHcqKyFcLVwuXz86PD5cL10vCiAgICB9OwoKICAgIGZ1bmN0aW9uIHN0YXRlU3RhY2soaW5kZW50LCB0eXBlLCBwcmV2KSB7IC8vIHJlcHJlc2VudHMgYSBzdGF0ZSBzdGFjayBvYmplY3QKICAgICAgICB0aGlzLmluZGVudCA9IGluZGVudDsKICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwogICAgICAgIHRoaXMucHJldiA9IHByZXY7CiAgICB9CgogICAgZnVuY3Rpb24gcHVzaFN0YWNrKHN0YXRlLCBpbmRlbnQsIHR5cGUpIHsKICAgICAgICBzdGF0ZS5pbmRlbnRTdGFjayA9IG5ldyBzdGF0ZVN0YWNrKGluZGVudCwgdHlwZSwgc3RhdGUuaW5kZW50U3RhY2spOwogICAgfQoKICAgIGZ1bmN0aW9uIHBvcFN0YWNrKHN0YXRlKSB7CiAgICAgICAgc3RhdGUuaW5kZW50U3RhY2sgPSBzdGF0ZS5pbmRlbnRTdGFjay5wcmV2OwogICAgfQoKICAgIGZ1bmN0aW9uIGlzTnVtYmVyKGNoLCBzdHJlYW0pewogICAgICAgIC8vIGhleAogICAgICAgIGlmICggY2ggPT09ICcwJyAmJiBzdHJlYW0uZWF0KC94L2kpICkgewogICAgICAgICAgICBzdHJlYW0uZWF0V2hpbGUodGVzdHMuaGV4KTsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICAvLyBsZWFkaW5nIHNpZ24KICAgICAgICBpZiAoICggY2ggPT0gJysnIHx8IGNoID09ICctJyApICYmICggdGVzdHMuZGlnaXQudGVzdChzdHJlYW0ucGVlaygpKSApICkgewogICAgICAgICAgc3RyZWFtLmVhdCh0ZXN0cy5zaWduKTsKICAgICAgICAgIGNoID0gc3RyZWFtLm5leHQoKTsKICAgICAgICB9CgogICAgICAgIGlmICggdGVzdHMuZGlnaXQudGVzdChjaCkgKSB7CiAgICAgICAgICAgIHN0cmVhbS5lYXQoY2gpOwogICAgICAgICAgICBzdHJlYW0uZWF0V2hpbGUodGVzdHMuZGlnaXQpOwoKICAgICAgICAgICAgaWYgKCAnLicgPT0gc3RyZWFtLnBlZWsoKSApIHsKICAgICAgICAgICAgICAgIHN0cmVhbS5lYXQoJy4nKTsKICAgICAgICAgICAgICAgIHN0cmVhbS5lYXRXaGlsZSh0ZXN0cy5kaWdpdCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICggc3RyZWFtLmVhdCh0ZXN0cy5leHBvbmVudCkgKSB7CiAgICAgICAgICAgICAgICBzdHJlYW0uZWF0KHRlc3RzLnNpZ24pOwogICAgICAgICAgICAgICAgc3RyZWFtLmVhdFdoaWxlKHRlc3RzLmRpZ2l0KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLy8gRWF0IGNoYXJhY3RlciB0aGF0IHN0YXJ0cyBhZnRlciBiYWNrc2xhc2ggXAogICAgZnVuY3Rpb24gZWF0Q2hhcmFjdGVyKHN0cmVhbSkgewogICAgICAgIHZhciBmaXJzdCA9IHN0cmVhbS5uZXh0KCk7CiAgICAgICAgLy8gUmVhZCBzcGVjaWFsIGxpdGVyYWxzOiBiYWNrc3BhY2UsIG5ld2xpbmUsIHNwYWNlLCByZXR1cm4uCiAgICAgICAgLy8gSnVzdCByZWFkIGFsbCBsb3dlcmNhc2UgbGV0dGVycy4KICAgICAgICBpZiAoZmlyc3QubWF0Y2goL1thLXpdLykgJiYgc3RyZWFtLm1hdGNoKC9bYS16XSsvLCB0cnVlKSkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIC8vIFJlYWQgdW5pY29kZSBjaGFyYWN0ZXI6IFx1MTAwMCBcdUEwYTEKICAgICAgICBpZiAoZmlyc3QgPT09ICJ1IikgewogICAgICAgICAgICBzdHJlYW0ubWF0Y2goL1swLTlhLXpdezR9L2ksIHRydWUpOwogICAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gewogICAgICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGluZGVudFN0YWNrOiBudWxsLAogICAgICAgICAgICAgICAgaW5kZW50YXRpb246IDAsCiAgICAgICAgICAgICAgICBtb2RlOiBmYWxzZQogICAgICAgICAgICB9OwogICAgICAgIH0sCgogICAgICAgIHRva2VuOiBmdW5jdGlvbiAoc3RyZWFtLCBzdGF0ZSkgewogICAgICAgICAgICBpZiAoc3RhdGUuaW5kZW50U3RhY2sgPT0gbnVsbCAmJiBzdHJlYW0uc29sKCkpIHsKICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBpbmRlbnRhdGlvbiwgYnV0IG9ubHkgaWYgaW5kZW50U3RhY2sgaXMgZW1wdHkKICAgICAgICAgICAgICAgIHN0YXRlLmluZGVudGF0aW9uID0gc3RyZWFtLmluZGVudGF0aW9uKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vIHNraXAgc3BhY2VzCiAgICAgICAgICAgIGlmIChzdHJlYW0uZWF0U3BhY2UoKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHJldHVyblR5cGUgPSBudWxsOwoKICAgICAgICAgICAgc3dpdGNoKHN0YXRlLm1vZGUpewogICAgICAgICAgICAgICAgY2FzZSAic3RyaW5nIjogLy8gbXVsdGktbGluZSBzdHJpbmcgcGFyc2luZyBtb2RlCiAgICAgICAgICAgICAgICAgICAgdmFyIG5leHQsIGVzY2FwZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKG5leHQgPSBzdHJlYW0ubmV4dCgpKSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0ID09ICJcIiIgJiYgIWVzY2FwZWQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlc2NhcGVkID0gIWVzY2FwZWQgJiYgbmV4dCA9PSAiXFwiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm5UeXBlID0gU1RSSU5HOyAvLyBjb250aW51ZSBvbiBpbiBzdHJpbmcgbW9kZQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgZGVmYXVsdDogLy8gZGVmYXVsdCBwYXJzaW5nIG1vZGUKICAgICAgICAgICAgICAgICAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gIlwiIikgewogICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gInN0cmluZyI7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblR5cGUgPSBTVFJJTkc7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAiXFwiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVhdENoYXJhY3RlcihzdHJlYW0pOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5UeXBlID0gQ0hBUkFDVEVSOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gIiciICYmICEoIHRlc3RzLmRpZ2l0X29yX2NvbG9uLnRlc3Qoc3RyZWFtLnBlZWsoKSkgKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5UeXBlID0gQVRPTTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICI7IikgeyAvLyBjb21tZW50CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsgLy8gcmVzdCBvZiB0aGUgbGluZSBpcyBhIGNvbW1lbnQKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVHlwZSA9IENPTU1FTlQ7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc051bWJlcihjaCxzdHJlYW0pKXsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVHlwZSA9IE5VTUJFUjsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICIoIiB8fCBjaCA9PSAiWyIgfHwgY2ggPT0gInsiICkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIga2V5V29yZCA9ICcnLCBpbmRlbnRUZW1wID0gc3RyZWFtLmNvbHVtbigpLCBsZXR0ZXI7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICAgICAgICAgICBFaXRoZXIKICAgICAgICAgICAgICAgICAgICAgICAgKGluZGVudC13b3JkIC4uCiAgICAgICAgICAgICAgICAgICAgICAgIChub24taW5kZW50LXdvcmQgLi4KICAgICAgICAgICAgICAgICAgICAgICAgKDtzb21ldGhpbmcgZWxzZSwgYnJhY2tldCwgZXRjLgogICAgICAgICAgICAgICAgICAgICAgICAqLwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09ICIoIikgd2hpbGUgKChsZXR0ZXIgPSBzdHJlYW0uZWF0KHRlc3RzLmtleXdvcmRfY2hhcikpICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleVdvcmQgKz0gbGV0dGVyOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoa2V5V29yZC5sZW5ndGggPiAwICYmIChpbmRlbnRLZXlzLnByb3BlcnR5SXNFbnVtZXJhYmxlKGtleVdvcmQpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC9eKD86ZGVmfHdpdGgpLy50ZXN0KGtleVdvcmQpKSkgeyAvLyBpbmRlbnQtd29yZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaFN0YWNrKHN0YXRlLCBpbmRlbnRUZW1wICsgSU5ERU5UX1dPUkRfU0tJUCwgY2gpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyBub24taW5kZW50IHdvcmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGNvbnRpbnVlIGVhdGluZyB0aGUgc3BhY2VzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0uZWF0U3BhY2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW0uZW9sKCkgfHwgc3RyZWFtLnBlZWsoKSA9PSAiOyIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub3RoaW5nIHNpZ25pZmljYW50IGFmdGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgcmVzdGFydCBpbmRlbnRhdGlvbiB0aGUgdXNlciBkZWZpbmVkIHNwYWNlcyBhZnRlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2hTdGFjayhzdGF0ZSwgaW5kZW50VGVtcCArIE5PUk1BTF9JTkRFTlRfVU5JVCwgY2gpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoU3RhY2soc3RhdGUsIGluZGVudFRlbXAgKyBzdHJlYW0uY3VycmVudCgpLmxlbmd0aCwgY2gpOyAvLyBlbHNlIHdlIG1hdGNoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLmJhY2tVcChzdHJlYW0uY3VycmVudCgpLmxlbmd0aCAtIDEpOyAvLyB1bmRvIGFsbCB0aGUgZWF0aW5nCgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5UeXBlID0gQlJBQ0tFVDsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICIpIiB8fCBjaCA9PSAiXSIgfHwgY2ggPT0gIn0iKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblR5cGUgPSBCUkFDS0VUOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuaW5kZW50U3RhY2sgIT0gbnVsbCAmJiBzdGF0ZS5pbmRlbnRTdGFjay50eXBlID09IChjaCA9PSAiKSIgPyAiKCIgOiAoY2ggPT0gIl0iID8gIlsiIDoieyIpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9wU3RhY2soc3RhdGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICggY2ggPT0gIjoiICkgewogICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0uZWF0V2hpbGUodGVzdHMuc3ltYm9sKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFUT007CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLmVhdFdoaWxlKHRlc3RzLnN5bWJvbCk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoa2V5d29yZHMgJiYga2V5d29yZHMucHJvcGVydHlJc0VudW1lcmFibGUoc3RyZWFtLmN1cnJlbnQoKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblR5cGUgPSBLRVlXT1JEOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJ1aWx0aW5zICYmIGJ1aWx0aW5zLnByb3BlcnR5SXNFbnVtZXJhYmxlKHN0cmVhbS5jdXJyZW50KCkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5UeXBlID0gQlVJTFRJTjsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhdG9tcyAmJiBhdG9tcy5wcm9wZXJ0eUlzRW51bWVyYWJsZShzdHJlYW0uY3VycmVudCgpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVHlwZSA9IEFUT007CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSByZXR1cm5UeXBlID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiByZXR1cm5UeXBlOwogICAgICAgIH0sCgogICAgICAgIGluZGVudDogZnVuY3Rpb24gKHN0YXRlKSB7CiAgICAgICAgICAgIGlmIChzdGF0ZS5pbmRlbnRTdGFjayA9PSBudWxsKSByZXR1cm4gc3RhdGUuaW5kZW50YXRpb247CiAgICAgICAgICAgIHJldHVybiBzdGF0ZS5pbmRlbnRTdGFjay5pbmRlbnQ7CiAgICAgICAgfSwKCiAgICAgICAgbGluZUNvbW1lbnQ6ICI7OyIKICAgIH07Cn0pOwoKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtY2xvanVyZSIsICJjbG9qdXJlIik7Cgp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/clojure/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogQ2xvanVyZSBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9ImNsb2p1cmUuanMiPjwvc2NyaXB0Pgo8c3R5bGU+LkNvZGVNaXJyb3Ige2JhY2tncm91bmQ6ICNmOGY4Zjg7fTwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGltZyBpZD1sb2dvIHNyYz0iLi4vLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+TGFuZ3VhZ2UgbW9kZXM8L2E+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPkNsb2p1cmU8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPkNsb2p1cmUgbW9kZTwvaDI+Cjxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+CjsgQ29ud2F5J3MgR2FtZSBvZiBMaWZlLCBiYXNlZCBvbiB0aGUgd29yayBvZjoKOzsgTGF1cmVudCBQZXRpdCBodHRwczovL2dpc3QuZ2l0aHViLmNvbS8xMjAwMzQzCjs7IENocmlzdG9waGUgR3JhbmQgaHR0cDovL2Nsai1tZS5jZ3JhbmQubmV0LzIwMTEvMDgvMTkvY29ud2F5cy1nYW1lLW9mLWxpZmUKCihucyBeezpkb2MgIkNvbndheSdzIEdhbWUgb2YgTGlmZS4ifQogZ2FtZS1vZi1saWZlKQoKOzsgQ29yZSBnYW1lIG9mIGxpZmUncyBhbGdvcml0aG0gZnVuY3Rpb25zCgooZGVmbiBuZWlnaGJvdXJzCiAgIkdpdmVuIGEgY2VsbCdzIGNvb3JkaW5hdGVzLCByZXR1cm5zIHRoZSBjb29yZGluYXRlcyBvZiBpdHMgbmVpZ2hib3Vycy4iCiAgW1t4IHldXQogIChmb3IgW2R4IFstMSAwIDFdIGR5IChpZiAoemVybz8gZHgpIFstMSAxXSBbLTEgMCAxXSldCiAgICBbKCsgZHggeCkgKCsgZHkgeSldKSkKCihkZWZuIHN0ZXAKICAiR2l2ZW4gYSBzZXQgb2YgbGl2aW5nIGNlbGxzLCBjb21wdXRlcyB0aGUgbmV3IHNldCBvZiBsaXZpbmcgY2VsbHMuIgogIFtjZWxsc10KICAoc2V0IChmb3IgW1tjZWxsIG5dIChmcmVxdWVuY2llcyAobWFwY2F0IG5laWdoYm91cnMgY2VsbHMpKQogICAgICAgICAgICAgOndoZW4gKG9yICg9IG4gMykgKGFuZCAoPSBuIDIpIChjZWxscyBjZWxsKSkpXQogICAgICAgICBjZWxsKSkpCgo7OyBVdGlsaXR5IG1ldGhvZHMgZm9yIGRpc3BsYXlpbmcgZ2FtZSBvbiBhIHRleHQgdGVybWluYWwKCihkZWZuIHByaW50LWJvYXJkCiAgIlByaW50cyBhIGJvYXJkIG9uICpvdXQqLCByZXByZXNlbnRpbmcgYSBzdGVwIGluIHRoZSBnYW1lLiIKICBbYm9hcmQgdyBoXQogIChkb3NlcSBbeCAocmFuZ2UgKGluYyB3KSkgeSAocmFuZ2UgKGluYyBoKSldCiAgICAoaWYgKD0geSAwKSAocHJpbnQgIlxuIikpCiAgICAocHJpbnQgKGlmIChib2FyZCBbeCB5XSkgIltYXSIgIiAuICIpKSkpCgooZGVmbiBkaXNwbGF5LWdyaWRzCiAgIlByaW50cyBhIHNxdWVuY2Ugb2YgYm9hcmRzIG9uICpvdXQqLCByZXByZXNlbnRpbmcgc2V2ZXJhbCBzdGVwcy4iCiAgW2dyaWRzIHcgaF0KICAoZG9zZXEgW2JvYXJkIGdyaWRzXQogICAgKHByaW50LWJvYXJkIGJvYXJkIHcgaCkKICAgIChwcmludCAiXG4iKSkpCgo7OyBMYXVuY2hlcyBhbiBleGFtcGxlIGJvYXJkCgooZGVmCiAgXns6ZG9jICJib2FyZCByZXByZXNlbnRzIHRoZSBpbml0aWFsIHNldCBvZiBsaXZpbmcgY2VsbHMifQogICBib2FyZCAje1syIDFdIFsyIDJdIFsyIDNdfSkKCihkaXNwbGF5LWdyaWRzICh0YWtlIDMgKGl0ZXJhdGUgc3RlcCBib2FyZCkpIDUgNSkKCjs7IExldCdzIHBsYXkgd2l0aCBjaGFyYWN0ZXJzCihwcmludGxuIFwxIFxhIFwjIFxcCiAgICAgICAgIFwiIFwoIFxuZXdsaW5lCiAgICAgICAgIFx9IFwiIFxzcGFjZQogICAgICAgICBcdGFiIFxyZXR1cm4gXGJhY2tzcGFjZQogICAgICAgICBcdTEwMDAgXHVBYUFhIFx1OUY5RikKCjwvdGV4dGFyZWE+PC9mb3JtPgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHt9KTsKICAgIDwvc2NyaXB0PgoKICAgIDxwPjxzdHJvbmc+TUlNRSB0eXBlcyBkZWZpbmVkOjwvc3Ryb25nPiA8Y29kZT50ZXh0L3gtY2xvanVyZTwvY29kZT4uPC9wPgoKICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/cobol/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/cobol/cobol.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovKioKICogQXV0aG9yOiBHYXV0YW0gTWVodGEKICogQnJhbmNoZWQgZnJvbSBDb2RlTWlycm9yJ3MgU2NoZW1lIG1vZGUKICovCihmdW5jdGlvbihtb2QpIHsKICBpZiAodHlwZW9mIGV4cG9ydHMgPT0gIm9iamVjdCIgJiYgdHlwZW9mIG1vZHVsZSA9PSAib2JqZWN0IikgLy8gQ29tbW9uSlMKICAgIG1vZChyZXF1aXJlKCIuLi8uLi9saWIvY29kZW1pcnJvciIpKTsKICBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCkgLy8gQU1ECiAgICBkZWZpbmUoWyIuLi8uLi9saWIvY29kZW1pcnJvciJdLCBtb2QpOwogIGVsc2UgLy8gUGxhaW4gYnJvd3NlciBlbnYKICAgIG1vZChDb2RlTWlycm9yKTsKfSkoZnVuY3Rpb24oQ29kZU1pcnJvcikgewoidXNlIHN0cmljdCI7CgpDb2RlTWlycm9yLmRlZmluZU1vZGUoImNvYm9sIiwgZnVuY3Rpb24gKCkgewogIHZhciBCVUlMVElOID0gImJ1aWx0aW4iLCBDT01NRU5UID0gImNvbW1lbnQiLCBTVFJJTkcgPSAic3RyaW5nIiwKICAgICAgQVRPTSA9ICJhdG9tIiwgTlVNQkVSID0gIm51bWJlciIsIEtFWVdPUkQgPSAia2V5d29yZCIsIE1PRFRBRyA9ICJoZWFkZXIiLAogICAgICBDT0JPTExJTkVOVU0gPSAiZGVmIiwgUEVSSU9EID0gImxpbmsiOwogIGZ1bmN0aW9uIG1ha2VLZXl3b3JkcyhzdHIpIHsKICAgIHZhciBvYmogPSB7fSwgd29yZHMgPSBzdHIuc3BsaXQoIiAiKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgd29yZHMubGVuZ3RoOyArK2kpIG9ialt3b3Jkc1tpXV0gPSB0cnVlOwogICAgcmV0dXJuIG9iajsKICB9CiAgdmFyIGF0b21zID0gbWFrZUtleXdvcmRzKCJUUlVFIEZBTFNFIFpFUk9FUyBaRVJPUyBaRVJPIFNQQUNFUyBTUEFDRSBMT1ctVkFMVUUgTE9XLVZBTFVFUyAiKTsKICB2YXIga2V5d29yZHMgPSBtYWtlS2V5d29yZHMoCiAgICAgICJBQ0NFUFQgQUNDRVNTIEFDUVVJUkUgQUREIEFERFJFU1MgIiArCiAgICAgICJBRFZBTkNJTkcgQUZURVIgQUxJQVMgQUxMIEFMUEhBQkVUICIgKwogICAgICAiQUxQSEFCRVRJQyBBTFBIQUJFVElDLUxPV0VSIEFMUEhBQkVUSUMtVVBQRVIgQUxQSEFOVU1FUklDIEFMUEhBTlVNRVJJQy1FRElURUQgIiArCiAgICAgICJBTFNPIEFMVEVSIEFMVEVSTkFURSBBTkQgQU5ZICIgKwogICAgICAiQVJFIEFSRUEgQVJFQVMgQVJJVEhNRVRJQyBBU0NFTkRJTkcgIiArCiAgICAgICJBU1NJR04gQVQgQVRUUklCVVRFIEFVVEhPUiBBVVRPICIgKwogICAgICAiQVVUTy1TS0lQIEFVVE9NQVRJQyBCLUFORCBCLUVYT1IgQi1MRVNTICIgKwogICAgICAiQi1OT1QgQi1PUiBCQUNLR1JPVU5ELUNPTE9SIEJBQ0tHUk9VTkQtQ09MT1VSIEJFRVAgIiArCiAgICAgICJCRUZPUkUgQkVMTCBCSU5BUlkgQklUIEJJVFMgIiArCiAgICAgICJCTEFOSyBCTElOSyBCTE9DSyBCT09MRUFOIEJPVFRPTSAiICsKICAgICAgIkJZIENBTEwgQ0FOQ0VMIENEIENGICIgKwogICAgICAiQ0ggQ0hBUkFDVEVSIENIQVJBQ1RFUlMgQ0xBU1MgQ0xPQ0stVU5JVFMgIiArCiAgICAgICJDTE9TRSBDT0JPTCBDT0RFIENPREUtU0VUIENPTCAiICsKICAgICAgIkNPTExBVElORyBDT0xVTU4gQ09NTUEgQ09NTUlUIENPTU1JVE1FTlQgIiArCiAgICAgICJDT01NT04gQ09NTVVOSUNBVElPTiBDT01QIENPTVAtMCBDT01QLTEgIiArCiAgICAgICJDT01QLTIgQ09NUC0zIENPTVAtNCBDT01QLTUgQ09NUC02ICIgKwogICAgICAiQ09NUC03IENPTVAtOCBDT01QLTkgQ09NUFVUQVRJT05BTCBDT01QVVRBVElPTkFMLTAgIiArCiAgICAgICJDT01QVVRBVElPTkFMLTEgQ09NUFVUQVRJT05BTC0yIENPTVBVVEFUSU9OQUwtMyBDT01QVVRBVElPTkFMLTQgQ09NUFVUQVRJT05BTC01ICIgKwogICAgICAiQ09NUFVUQVRJT05BTC02IENPTVBVVEFUSU9OQUwtNyBDT01QVVRBVElPTkFMLTggQ09NUFVUQVRJT05BTC05IENPTVBVVEUgIiArCiAgICAgICJDT05GSUdVUkFUSU9OIENPTk5FQ1QgQ09OU09MRSBDT05UQUlORUQgQ09OVEFJTlMgIiArCiAgICAgICJDT05URU5UIENPTlRJTlVFIENPTlRST0wgQ09OVFJPTC1BUkVBIENPTlRST0xTICIgKwogICAgICAiQ09OVkVSVElORyBDT1BZIENPUlIgQ09SUkVTUE9ORElORyBDT1VOVCAiICsKICAgICAgIkNSVCBDUlQtVU5ERVIgQ1VSUkVOQ1kgQ1VSUkVOVCBDVVJTT1IgIiArCiAgICAgICJEQVRBIERBVEUgREFURS1DT01QSUxFRCBEQVRFLVdSSVRURU4gREFZICIgKwogICAgICAiREFZLU9GLVdFRUsgREIgREItQUNDRVNTLUNPTlRST0wtS0VZIERCLURBVEEtTkFNRSBEQi1FWENFUFRJT04gIiArCiAgICAgICJEQi1GT1JNQVQtTkFNRSBEQi1SRUNPUkQtTkFNRSBEQi1TRVQtTkFNRSBEQi1TVEFUVVMgREJDUyAiICsKICAgICAgIkRCQ1MtRURJVEVEIERFIERFQlVHLUNPTlRFTlRTIERFQlVHLUlURU0gREVCVUctTElORSAiICsKICAgICAgIkRFQlVHLU5BTUUgREVCVUctU1VCLTEgREVCVUctU1VCLTIgREVCVUctU1VCLTMgREVCVUdHSU5HICIgKwogICAgICAiREVDSU1BTC1QT0lOVCBERUNMQVJBVElWRVMgREVGQVVMVCBERUxFVEUgREVMSU1JVEVEICIgKwogICAgICAiREVMSU1JVEVSIERFUEVORElORyBERVNDRU5ESU5HIERFU0NSSUJFRCBERVNUSU5BVElPTiAiICsKICAgICAgIkRFVEFJTCBESVNBQkxFIERJU0NPTk5FQ1QgRElTUExBWSBESVNQTEFZLTEgIiArCiAgICAgICJESVNQTEFZLTIgRElTUExBWS0zIERJU1BMQVktNCBESVNQTEFZLTUgRElTUExBWS02ICIgKwogICAgICAiRElTUExBWS03IERJU1BMQVktOCBESVNQTEFZLTkgRElWSURFIERJVklTSU9OICIgKwogICAgICAiRE9XTiBEUk9QIERVUExJQ0FURSBEVVBMSUNBVEVTIERZTkFNSUMgIiArCiAgICAgICJFQkNESUMgRUdJIEVKRUNUIEVMU0UgRU1JICIgKwogICAgICAiRU1QVFkgRU1QVFktQ0hFQ0sgRU5BQkxFIEVORCBFTkQuIEVORC1BQ0NFUFQgRU5ELUFDQ0VQVC4gIiArCiAgICAgICJFTkQtQUREIEVORC1DQUxMIEVORC1DT01QVVRFIEVORC1ERUxFVEUgRU5ELURJU1BMQVkgIiArCiAgICAgICJFTkQtRElWSURFIEVORC1FVkFMVUFURSBFTkQtSUYgRU5ELUlOVk9LRSBFTkQtTVVMVElQTFkgIiArCiAgICAgICJFTkQtT0YtUEFHRSBFTkQtUEVSRk9STSBFTkQtUkVBRCBFTkQtUkVDRUlWRSBFTkQtUkVUVVJOICIgKwogICAgICAiRU5ELVJFV1JJVEUgRU5ELVNFQVJDSCBFTkQtU1RBUlQgRU5ELVNUUklORyBFTkQtU1VCVFJBQ1QgIiArCiAgICAgICJFTkQtVU5TVFJJTkcgRU5ELVdSSVRFIEVORC1YTUwgRU5URVIgRU5UUlkgIiArCiAgICAgICJFTlZJUk9OTUVOVCBFT1AgRVFVQUwgRVFVQUxTIEVSQVNFICIgKwogICAgICAiRVJST1IgRVNJIEVWQUxVQVRFIEVWRVJZIEVYQ0VFRFMgIiArCiAgICAgICJFWENFUFRJT04gRVhDTFVTSVZFIEVYSVQgRVhURU5EIEVYVEVSTkFMICIgKwogICAgICAiRVhURVJOQUxMWS1ERVNDUklCRUQtS0VZIEZEIEZFVENIIEZJTEUgRklMRS1DT05UUk9MICIgKwogICAgICAiRklMRS1TVFJFQU0gRklMRVMgRklMTEVSIEZJTkFMIEZJTkQgIiArCiAgICAgICJGSU5JU0ggRklSU1QgRk9PVElORyBGT1IgRk9SRUdST1VORC1DT0xPUiAiICsKICAgICAgIkZPUkVHUk9VTkQtQ09MT1VSIEZPUk1BVCBGUkVFIEZST00gRlVMTCAiICsKICAgICAgIkZVTkNUSU9OIEdFTkVSQVRFIEdFVCBHSVZJTkcgR0xPQkFMICIgKwogICAgICAiR08gR09CQUNLIEdSRUFURVIgR1JPVVAgSEVBRElORyAiICsKICAgICAgIkhJR0gtVkFMVUUgSElHSC1WQUxVRVMgSElHSExJR0hUIEktTyBJLU8tQ09OVFJPTCAiICsKICAgICAgIklEIElERU5USUZJQ0FUSU9OIElGIElOIElOREVYICIgKwogICAgICAiSU5ERVgtMSBJTkRFWC0yIElOREVYLTMgSU5ERVgtNCBJTkRFWC01ICIgKwogICAgICAiSU5ERVgtNiBJTkRFWC03IElOREVYLTggSU5ERVgtOSBJTkRFWEVEICIgKwogICAgICAiSU5ESUMgSU5ESUNBVEUgSU5ESUNBVE9SIElORElDQVRPUlMgSU5JVElBTCAiICsKICAgICAgIklOSVRJQUxJWkUgSU5JVElBVEUgSU5QVVQgSU5QVVQtT1VUUFVUIElOU1BFQ1QgIiArCiAgICAgICJJTlNUQUxMQVRJT04gSU5UTyBJTlZBTElEIElOVk9LRSBJUyAiICsKICAgICAgIkpVU1QgSlVTVElGSUVEIEtBTkpJIEtFRVAgS0VZICIgKwogICAgICAiTEFCRUwgTEFTVCBMRCBMRUFESU5HIExFRlQgIiArCiAgICAgICJMRUZULUpVU1RJRlkgTEVOR1RIIExFTkdUSC1DSEVDSyBMRVNTIExJQlJBUlkgIiArCiAgICAgICJMSUtFIExJTUlUIExJTUlUUyBMSU5BR0UgTElOQUdFLUNPVU5URVIgIiArCiAgICAgICJMSU5FIExJTkUtQ09VTlRFUiBMSU5FUyBMSU5LQUdFIExPQ0FMLVNUT1JBR0UgIiArCiAgICAgICJMT0NBTEUgTE9DQUxMWSBMT0NLICIgKwogICAgICAiTUVNQkVSIE1FTU9SWSBNRVJHRSBNRVNTQUdFIE1FVEFDTEFTUyAiICsKICAgICAgIk1PREUgTU9ESUZJRUQgTU9ESUZZIE1PRFVMRVMgTU9WRSAiICsKICAgICAgIk1VTFRJUExFIE1VTFRJUExZIE5BVElPTkFMIE5BVElWRSBORUdBVElWRSAiICsKICAgICAgIk5FWFQgTk8gTk8tRUNITyBOT05FIE5PVCAiICsKICAgICAgIk5VTEwgTlVMTC1LRVktTUFQIE5VTEwtTUFQIE5VTExTIE5VTUJFUiAiICsKICAgICAgIk5VTUVSSUMgTlVNRVJJQy1FRElURUQgT0JKRUNUIE9CSkVDVC1DT01QVVRFUiBPQ0NVUlMgIiArCiAgICAgICJPRiBPRkYgT01JVFRFRCBPTiBPTkxZICIgKwogICAgICAiT1BFTiBPUFRJT05BTCBPUiBPUkRFUiBPUkdBTklaQVRJT04gIiArCiAgICAgICJPVEhFUiBPVVRQVVQgT1ZFUkZMT1cgT1dORVIgUEFDS0VELURFQ0lNQUwgIiArCiAgICAgICJQQURESU5HIFBBR0UgUEFHRS1DT1VOVEVSIFBBUlNFIFBFUkZPUk0gIiArCiAgICAgICJQRiBQSCBQSUMgUElDVFVSRSBQTFVTICIgKwogICAgICAiUE9JTlRFUiBQT1NJVElPTiBQT1NJVElWRSBQUkVGSVggUFJFU0VOVCAiICsKICAgICAgIlBSSU5USU5HIFBSSU9SIFBST0NFRFVSRSBQUk9DRURVUkUtUE9JTlRFUiBQUk9DRURVUkVTICIgKwogICAgICAiUFJPQ0VFRCBQUk9DRVNTIFBST0NFU1NJTkcgUFJPR1JBTSBQUk9HUkFNLUlEICIgKwogICAgICAiUFJPTVBUIFBST1RFQ1RFRCBQVVJHRSBRVUVVRSBRVU9URSAiICsKICAgICAgIlFVT1RFUyBSQU5ET00gUkQgUkVBRCBSRUFEWSAiICsKICAgICAgIlJFQUxNIFJFQ0VJVkUgUkVDT05ORUNUIFJFQ09SRCBSRUNPUkQtTkFNRSAiICsKICAgICAgIlJFQ09SRFMgUkVDVVJTSVZFIFJFREVGSU5FUyBSRUVMIFJFRkVSRU5DRSAiICsKICAgICAgIlJFRkVSRU5DRS1NT05JVE9SIFJFRkVSRU5DRVMgUkVMQVRJT04gUkVMQVRJVkUgUkVMRUFTRSAiICsKICAgICAgIlJFTUFJTkRFUiBSRU1PVkFMIFJFTkFNRVMgUkVQRUFURUQgUkVQTEFDRSAiICsKICAgICAgIlJFUExBQ0lORyBSRVBPUlQgUkVQT1JUSU5HIFJFUE9SVFMgUkVQT1NJVE9SWSAiICsKICAgICAgIlJFUVVJUkVEIFJFUlVOIFJFU0VSVkUgUkVTRVQgUkVUQUlOSU5HICIgKwogICAgICAiUkVUUklFVkFMIFJFVFVSTiBSRVRVUk4tQ09ERSBSRVRVUk5JTkcgUkVWRVJTRS1WSURFTyAiICsKICAgICAgIlJFVkVSU0VEIFJFV0lORCBSRVdSSVRFIFJGIFJIICIgKwogICAgICAiUklHSFQgUklHSFQtSlVTVElGWSBST0xMQkFDSyBST0xMSU5HIFJPVU5ERUQgIiArCiAgICAgICJSVU4gU0FNRSBTQ1JFRU4gU0QgU0VBUkNIICIgKwogICAgICAiU0VDVElPTiBTRUNVUkUgU0VDVVJJVFkgU0VHTUVOVCBTRUdNRU5ULUxJTUlUICIgKwogICAgICAiU0VMRUNUIFNFTkQgU0VOVEVOQ0UgU0VQQVJBVEUgU0VRVUVOQ0UgIiArCiAgICAgICJTRVFVRU5USUFMIFNFVCBTSEFSRUQgU0lHTiBTSVpFICIgKwogICAgICAiU0tJUDEgU0tJUDIgU0tJUDMgU09SVCBTT1JULU1FUkdFICIgKwogICAgICAiU09SVC1SRVRVUk4gU09VUkNFIFNPVVJDRS1DT01QVVRFUiBTUEFDRS1GSUxMICIgKwogICAgICAiU1BFQ0lBTC1OQU1FUyBTVEFOREFSRCBTVEFOREFSRC0xIFNUQU5EQVJELTIgIiArCiAgICAgICJTVEFSVCBTVEFSVElORyBTVEFUVVMgU1RPUCBTVE9SRSAiICsKICAgICAgIlNUUklORyBTVUItUVVFVUUtMSBTVUItUVVFVUUtMiBTVUItUVVFVUUtMyBTVUItU0NIRU1BICIgKwogICAgICAiU1VCRklMRSBTVUJTVElUVVRFIFNVQlRSQUNUIFNVTSBTVVBQUkVTUyAiICsKICAgICAgIlNZTUJPTElDIFNZTkMgU1lOQ0hST05JWkVEIFNZU0lOIFNZU09VVCAiICsKICAgICAgIlRBQkxFIFRBTExZSU5HIFRBUEUgVEVOQU5UIFRFUk1JTkFMICIgKwogICAgICAiVEVSTUlOQVRFIFRFU1QgVEVYVCBUSEFOIFRIRU4gIiArCiAgICAgICJUSFJPVUdIIFRIUlUgVElNRSBUSU1FUyBUSVRMRSAiICsKICAgICAgIlRPIFRPUCBUUkFJTElORyBUUkFJTElORy1TSUdOIFRSQU5TQUNUSU9OICIgKwogICAgICAiVFlQRSBUWVBFREVGIFVOREVSTElORSBVTkVRVUFMIFVOSVQgIiArCiAgICAgICJVTlNUUklORyBVTlRJTCBVUCBVUERBVEUgVVBPTiAiICsKICAgICAgIlVTQUdFIFVTQUdFLU1PREUgVVNFIFVTSU5HIFZBTElEICIgKwogICAgICAiVkFMSURBVEUgVkFMVUUgVkFMVUVTIFZBUllJTkcgVkxSICIgKwogICAgICAiV0FJVCBXSEVOIFdIRU4tQ09NUElMRUQgV0lUSCBXSVRISU4gIiArCiAgICAgICJXT1JEUyBXT1JLSU5HLVNUT1JBR0UgV1JJVEUgWE1MIFhNTC1DT0RFICIgKwogICAgICAiWE1MLUVWRU5UIFhNTC1OVEVYVCBYTUwtVEVYVCBaRVJPIFpFUk8tRklMTCAiICk7CgogIHZhciBidWlsdGlucyA9IG1ha2VLZXl3b3JkcygiLSAqICoqIC8gKyA8IDw9ID0gPiA+PSAiKTsKICB2YXIgdGVzdHMgPSB7CiAgICBkaWdpdDogL1xkLywKICAgIGRpZ2l0X29yX2NvbG9uOiAvW1xkOl0vLAogICAgaGV4OiAvWzAtOWEtZl0vaSwKICAgIHNpZ246IC9bKy1dLywKICAgIGV4cG9uZW50OiAvZS9pLAogICAga2V5d29yZF9jaGFyOiAvW15cc1woXFtcO1wpXF1dLywKICAgIHN5bWJvbDogL1tcdyorXC1dLwogIH07CiAgZnVuY3Rpb24gaXNOdW1iZXIoY2gsIHN0cmVhbSl7CiAgICAvLyBoZXgKICAgIGlmICggY2ggPT09ICcwJyAmJiBzdHJlYW0uZWF0KC94L2kpICkgewogICAgICBzdHJlYW0uZWF0V2hpbGUodGVzdHMuaGV4KTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICAvLyBsZWFkaW5nIHNpZ24KICAgIGlmICggKCBjaCA9PSAnKycgfHwgY2ggPT0gJy0nICkgJiYgKCB0ZXN0cy5kaWdpdC50ZXN0KHN0cmVhbS5wZWVrKCkpICkgKSB7CiAgICAgIHN0cmVhbS5lYXQodGVzdHMuc2lnbik7CiAgICAgIGNoID0gc3RyZWFtLm5leHQoKTsKICAgIH0KICAgIGlmICggdGVzdHMuZGlnaXQudGVzdChjaCkgKSB7CiAgICAgIHN0cmVhbS5lYXQoY2gpOwogICAgICBzdHJlYW0uZWF0V2hpbGUodGVzdHMuZGlnaXQpOwogICAgICBpZiAoICcuJyA9PSBzdHJlYW0ucGVlaygpKSB7CiAgICAgICAgc3RyZWFtLmVhdCgnLicpOwogICAgICAgIHN0cmVhbS5lYXRXaGlsZSh0ZXN0cy5kaWdpdCk7CiAgICAgIH0KICAgICAgaWYgKCBzdHJlYW0uZWF0KHRlc3RzLmV4cG9uZW50KSApIHsKICAgICAgICBzdHJlYW0uZWF0KHRlc3RzLnNpZ24pOwogICAgICAgIHN0cmVhbS5lYXRXaGlsZSh0ZXN0cy5kaWdpdCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIHJldHVybiB7CiAgICBzdGFydFN0YXRlOiBmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgaW5kZW50U3RhY2s6IG51bGwsCiAgICAgICAgaW5kZW50YXRpb246IDAsCiAgICAgICAgbW9kZTogZmFsc2UKICAgICAgfTsKICAgIH0sCiAgICB0b2tlbjogZnVuY3Rpb24gKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgaWYgKHN0YXRlLmluZGVudFN0YWNrID09IG51bGwgJiYgc3RyZWFtLnNvbCgpKSB7CiAgICAgICAgLy8gdXBkYXRlIGluZGVudGF0aW9uLCBidXQgb25seSBpZiBpbmRlbnRTdGFjayBpcyBlbXB0eQogICAgICAgIHN0YXRlLmluZGVudGF0aW9uID0gNiA7IC8vc3RyZWFtLmluZGVudGF0aW9uKCk7CiAgICAgIH0KICAgICAgLy8gc2tpcCBzcGFjZXMKICAgICAgaWYgKHN0cmVhbS5lYXRTcGFjZSgpKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgdmFyIHJldHVyblR5cGUgPSBudWxsOwogICAgICBzd2l0Y2goc3RhdGUubW9kZSl7CiAgICAgIGNhc2UgInN0cmluZyI6IC8vIG11bHRpLWxpbmUgc3RyaW5nIHBhcnNpbmcgbW9kZQogICAgICAgIHZhciBuZXh0ID0gZmFsc2U7CiAgICAgICAgd2hpbGUgKChuZXh0ID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkgewogICAgICAgICAgaWYgKG5leHQgPT0gIlwiIiB8fCBuZXh0ID09ICJcJyIpIHsKICAgICAgICAgICAgc3RhdGUubW9kZSA9IGZhbHNlOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuVHlwZSA9IFNUUklORzsgLy8gY29udGludWUgb24gaW4gc3RyaW5nIG1vZGUKICAgICAgICBicmVhazsKICAgICAgZGVmYXVsdDogLy8gZGVmYXVsdCBwYXJzaW5nIG1vZGUKICAgICAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpOwogICAgICAgIHZhciBjb2wgPSBzdHJlYW0uY29sdW1uKCk7CiAgICAgICAgaWYgKGNvbCA+PSAwICYmIGNvbCA8PSA1KSB7CiAgICAgICAgICByZXR1cm5UeXBlID0gQ09CT0xMSU5FTlVNOwogICAgICAgIH0gZWxzZSBpZiAoY29sID49IDcyICYmIGNvbCA8PSA3OSkgewogICAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICAgICAgcmV0dXJuVHlwZSA9IE1PRFRBRzsKICAgICAgICB9IGVsc2UgaWYgKGNoID09ICIqIiAmJiBjb2wgPT0gNikgeyAvLyBjb21tZW50CiAgICAgICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7IC8vIHJlc3Qgb2YgdGhlIGxpbmUgaXMgYSBjb21tZW50CiAgICAgICAgICByZXR1cm5UeXBlID0gQ09NTUVOVDsKICAgICAgICB9IGVsc2UgaWYgKGNoID09ICJcIiIgfHwgY2ggPT0gIlwnIikgewogICAgICAgICAgc3RhdGUubW9kZSA9ICJzdHJpbmciOwogICAgICAgICAgcmV0dXJuVHlwZSA9IFNUUklORzsKICAgICAgICB9IGVsc2UgaWYgKGNoID09ICInIiAmJiAhKCB0ZXN0cy5kaWdpdF9vcl9jb2xvbi50ZXN0KHN0cmVhbS5wZWVrKCkpICkpIHsKICAgICAgICAgIHJldHVyblR5cGUgPSBBVE9NOwogICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gIi4iKSB7CiAgICAgICAgICByZXR1cm5UeXBlID0gUEVSSU9EOwogICAgICAgIH0gZWxzZSBpZiAoaXNOdW1iZXIoY2gsc3RyZWFtKSl7CiAgICAgICAgICByZXR1cm5UeXBlID0gTlVNQkVSOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoc3RyZWFtLmN1cnJlbnQoKS5tYXRjaCh0ZXN0cy5zeW1ib2wpKSB7CiAgICAgICAgICAgIHdoaWxlIChjb2wgPCA3MSkgewogICAgICAgICAgICAgIGlmIChzdHJlYW0uZWF0KHRlc3RzLnN5bWJvbCkgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGNvbCsrOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKGtleXdvcmRzICYmIGtleXdvcmRzLnByb3BlcnR5SXNFbnVtZXJhYmxlKHN0cmVhbS5jdXJyZW50KCkudG9VcHBlckNhc2UoKSkpIHsKICAgICAgICAgICAgcmV0dXJuVHlwZSA9IEtFWVdPUkQ7CiAgICAgICAgICB9IGVsc2UgaWYgKGJ1aWx0aW5zICYmIGJ1aWx0aW5zLnByb3BlcnR5SXNFbnVtZXJhYmxlKHN0cmVhbS5jdXJyZW50KCkudG9VcHBlckNhc2UoKSkpIHsKICAgICAgICAgICAgcmV0dXJuVHlwZSA9IEJVSUxUSU47CiAgICAgICAgICB9IGVsc2UgaWYgKGF0b21zICYmIGF0b21zLnByb3BlcnR5SXNFbnVtZXJhYmxlKHN0cmVhbS5jdXJyZW50KCkudG9VcHBlckNhc2UoKSkpIHsKICAgICAgICAgICAgcmV0dXJuVHlwZSA9IEFUT007CiAgICAgICAgICB9IGVsc2UgcmV0dXJuVHlwZSA9IG51bGw7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiByZXR1cm5UeXBlOwogICAgfSwKICAgIGluZGVudDogZnVuY3Rpb24gKHN0YXRlKSB7CiAgICAgIGlmIChzdGF0ZS5pbmRlbnRTdGFjayA9PSBudWxsKSByZXR1cm4gc3RhdGUuaW5kZW50YXRpb247CiAgICAgIHJldHVybiBzdGF0ZS5pbmRlbnRTdGFjay5pbmRlbnQ7CiAgICB9CiAgfTsKfSk7CgpDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveC1jb2JvbCIsICJjb2JvbCIpOwoKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/cobol/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogQ09CT0wgbW9kZTwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uLy4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vdGhlbWUvbmVhdC5jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL3RoZW1lL2VsZWdhbnQuY3NzIj4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi90aGVtZS9lcmxhbmctZGFyay5jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL3RoZW1lL25pZ2h0LmNzcyI+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vdGhlbWUvbW9ub2thaS5jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL3RoZW1lL2NvYmFsdC5jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL3RoZW1lL2VjbGlwc2UuY3NzIj4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi90aGVtZS9ydWJ5Ymx1ZS5jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL3RoZW1lL2xlc3Nlci1kYXJrLmNzcyI+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vdGhlbWUveHEtZGFyay5jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL3RoZW1lL3hxLWxpZ2h0LmNzcyI+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vdGhlbWUvYW1iaWFuY2UuY3NzIj4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi90aGVtZS9ibGFja2JvYXJkLmNzcyI+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vdGhlbWUvdmlicmFudC1pbmsuY3NzIj4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi90aGVtZS9zb2xhcml6ZWQuY3NzIj4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi90aGVtZS90d2lsaWdodC5jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL3RoZW1lL21pZG5pZ2h0LmNzcyI+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vYWRkb24vZGlhbG9nL2RpYWxvZy5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vLi4vYWRkb24vZWRpdC9tYXRjaGJyYWNrZXRzLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9ImNvYm9sLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uLy4uL2FkZG9uL3NlbGVjdGlvbi9hY3RpdmUtbGluZS5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi8uLi9hZGRvbi9zZWFyY2gvc2VhcmNoLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uLy4uL2FkZG9uL2RpYWxvZy9kaWFsb2cuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vLi4vYWRkb24vc2VhcmNoL3NlYXJjaGN1cnNvci5qcyI+PC9zY3JpcHQ+CjxzdHlsZT4KICAgICAgICAuQ29kZU1pcnJvciB7CiAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZWVlOwogICAgICAgICAgZm9udC1zaXplIDogMjBweDsKICAgICAgICAgIGhlaWdodCA6IGF1dG8gIWltcG9ydGFudDsKICAgICAgICB9CiAgICAgICAgLkNvZGVNaXJyb3ItYWN0aXZlbGluZS1iYWNrZ3JvdW5kIHtiYWNrZ3JvdW5kOiAjNTU1NTU1ICFpbXBvcnRhbnQ7fQogICAgPC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aW1nIGlkPWxvZ28gc3JjPSIuLi8uLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5MYW5ndWFnZSBtb2RlczwvYT4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+Q09CT0w8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPkNPQk9MIG1vZGU8L2gyPgoKICAgIDxwPiBTZWxlY3QgVGhlbWUgPHNlbGVjdCBvbmNoYW5nZT0ic2VsZWN0VGhlbWUoKSIgaWQ9InNlbGVjdFRoZW1lIj4KICAgICAgICA8b3B0aW9uPmRlZmF1bHQ8L29wdGlvbj4KICAgICAgICA8b3B0aW9uPmFtYmlhbmNlPC9vcHRpb24+CiAgICAgICAgPG9wdGlvbj5ibGFja2JvYXJkPC9vcHRpb24+CiAgICAgICAgPG9wdGlvbj5jb2JhbHQ8L29wdGlvbj4KICAgICAgICA8b3B0aW9uPmVjbGlwc2U8L29wdGlvbj4KICAgICAgICA8b3B0aW9uPmVsZWdhbnQ8L29wdGlvbj4KICAgICAgICA8b3B0aW9uPmVybGFuZy1kYXJrPC9vcHRpb24+CiAgICAgICAgPG9wdGlvbj5sZXNzZXItZGFyazwvb3B0aW9uPgogICAgICAgIDxvcHRpb24+bWlkbmlnaHQ8L29wdGlvbj4KICAgICAgICA8b3B0aW9uPm1vbm9rYWk8L29wdGlvbj4KICAgICAgICA8b3B0aW9uPm5lYXQ8L29wdGlvbj4KICAgICAgICA8b3B0aW9uPm5pZ2h0PC9vcHRpb24+CiAgICAgICAgPG9wdGlvbj5ydWJ5Ymx1ZTwvb3B0aW9uPgogICAgICAgIDxvcHRpb24+c29sYXJpemVkIGRhcms8L29wdGlvbj4KICAgICAgICA8b3B0aW9uPnNvbGFyaXplZCBsaWdodDwvb3B0aW9uPgogICAgICAgIDxvcHRpb24gc2VsZWN0ZWQ+dHdpbGlnaHQ8L29wdGlvbj4KICAgICAgICA8b3B0aW9uPnZpYnJhbnQtaW5rPC9vcHRpb24+CiAgICAgICAgPG9wdGlvbj54cS1kYXJrPC9vcHRpb24+CiAgICAgICAgPG9wdGlvbj54cS1saWdodDwvb3B0aW9uPgogICAgPC9zZWxlY3Q+ICAgIFNlbGVjdCBGb250IFNpemUgPHNlbGVjdCBvbmNoYW5nZT0ic2VsZWN0Rm9udHNpemUoKSIgaWQ9InNlbGVjdEZvbnRTaXplIj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjEzcHgiPjEzcHg8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjE0cHgiPjE0cHg8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjE2cHgiPjE2cHg8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjE4cHgiPjE4cHg8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjIwcHgiIHNlbGVjdGVkPSJzZWxlY3RlZCI+MjBweDwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMjRweCI+MjRweDwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMjZweCI+MjZweDwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMjhweCI+MjhweDwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMzBweCI+MzBweDwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMzJweCI+MzJweDwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMzRweCI+MzRweDwvb3B0aW9uPgogICAgICAgICAgPG9wdGlvbiB2YWx1ZT0iMzZweCI+MzZweDwvb3B0aW9uPgogICAgICAgIDwvc2VsZWN0Pgo8bGFiZWwgZm9yPSJjaGVja0JveFJlYWRPbmx5Ij5SZWFkLW9ubHk8L2xhYmVsPgo8aW5wdXQgdHlwZT0iY2hlY2tib3giIGlkPSJjaGVja0JveFJlYWRPbmx5IiBvbmNoYW5nZT0ic2VsZWN0UmVhZE9ubHkoKSI+CjxsYWJlbCBmb3I9ImlkX3RhYlRvSW5kZW50U3BhY2UiPkluc2VydCBTcGFjZXMgb24gVGFiPC9sYWJlbD4KPGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0iaWRfdGFiVG9JbmRlbnRTcGFjZSIgb25jaGFuZ2U9InRhYlRvSW5kZW50U3BhY2UoKSI+CjwvcD4KPHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KLS0tLS0tLS0tMS0tLS0tLS0tLTItLS0tLS0tLS0zLS0tLS0tLS0tNC0tLS0tLS0tLTUtLS0tLS0tLS02LS0tLS0tLS0tNy0tLS0tLS0tLTgKMTIzNDU2Nzg5MTEyMzQ1Njc4OTIxMjM0NTY3ODkzMTIzNDU2Nzg5NDEyMzQ1Njc4OTUxMjM0NTY3ODk2MTIzNDU2Nzg5NzEyMzQ1Njc4OTgKMDAwMDEwIElERU5USUZJQ0FUSU9OIERJVklTSU9OLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNT0RUR0hFUkUKMDAwMDIwIFBST0dSQU0tSUQuICAgICAgIFNBTVBMRS4KMDAwMDMwIEFVVEhPUi4gICAgICAgICAgIFRFU1QgU0FNLiAKMDAwMDQwIERBVEUtV1JJVFRFTi4gICAgIDUgRmVicnVhcnkgMjAxMwowMDAwNDEKMDAwMDQyKiBBIHNhbXBsZSBwcm9ncmFtIGp1c3QgdG8gc2hvdyB0aGUgZm9ybS4KMDAwMDQzKiBUaGUgcHJvZ3JhbSBjb3BpZXMgaXRzIGlucHV0IHRvIHRoZSBvdXRwdXQsCjAwMDA0NCogYW5kIGNvdW50cyB0aGUgbnVtYmVyIG9mIHJlY29yZHMuCjAwMDA0NSogQXQgdGhlIGVuZCB0aGlzIG51bWJlciBpcyBwcmludGVkLgowMDAwNDYKMDAwMDUwIEVOVklST05NRU5UIERJVklTSU9OLgowMDAwNjAgSU5QVVQtT1VUUFVUIFNFQ1RJT04uCjAwMDA3MCBGSUxFLUNPTlRST0wuCjAwMDA4MCAgICAgU0VMRUNUIFNUVURFTlQtRklMRSAgICAgQVNTSUdOIFRPIFNZU0lOCjAwMDA5MCAgICAgICAgIE9SR0FOSVpBVElPTiBJUyBMSU5FIFNFUVVFTlRJQUwuCjAwMDEwMCAgICAgU0VMRUNUIFBSSU5ULUZJTEUgICAgICAgQVNTSUdOIFRPIFNZU09VVAowMDAxMTAgICAgICAgICBPUkdBTklaQVRJT04gSVMgTElORSBTRVFVRU5USUFMLgowMDAxMjAKMDAwMTMwIERBVEEgRElWSVNJT04uCjAwMDE0MCBGSUxFIFNFQ1RJT04uCjAwMDE1MCBGRCAgU1RVREVOVC1GSUxFCjAwMDE2MCAgICAgUkVDT1JEIENPTlRBSU5TIDQzIENIQVJBQ1RFUlMKMDAwMTcwICAgICBEQVRBIFJFQ09SRCBJUyBTVFVERU5ULUlOLgowMDAxODAgMDEgIFNUVURFTlQtSU4gICAgICAgICAgICAgIFBJQyBYKDQzKS4KMDAwMTkwCjAwMDIwMCBGRCAgUFJJTlQtRklMRQowMDAyMTAgICAgIFJFQ09SRCBDT05UQUlOUyA4MCBDSEFSQUNURVJTCjAwMDIyMCAgICAgREFUQSBSRUNPUkQgSVMgUFJJTlQtTElORS4KMDAwMjMwIDAxICBQUklOVC1MSU5FICAgICAgICAgICAgICBQSUMgWCg4MCkuCjAwMDI0MAowMDAyNTAgV09SS0lORy1TVE9SQUdFIFNFQ1RJT04uCjAwMDI2MCAwMSAgREFUQS1SRU1BSU5TLVNXSVRDSCAgICAgUElDIFgoMikgICAgICBWQUxVRSBTUEFDRVMuCjAwMDI2MSAwMSAgUkVDT1JEUy1XUklUVEVOICAgICAgICAgUElDIDk5LgowMDAyNzAKMDAwMjgwIDAxICBERVRBSUwtTElORS4KMDAwMjkwICAgICAwNSAgRklMTEVSICAgICAgICAgICAgICBQSUMgWCg3KSAgICAgIFZBTFVFIFNQQUNFUy4KMDAwMzAwICAgICAwNSAgUkVDT1JELUlNQUdFICAgICAgICBQSUMgWCg0MykuCjAwMDMxMCAgICAgMDUgIEZJTExFUiAgICAgICAgICAgICAgUElDIFgoMzApICAgICBWQUxVRSBTUEFDRVMuCjAwMDMxMSAKMDAwMzEyIDAxICBTVU1NQVJZLUxJTkUuCjAwMDMxMyAgICAgMDUgIEZJTExFUiAgICAgICAgICAgICAgUElDIFgoNykgICAgICBWQUxVRSBTUEFDRVMuCjAwMDMxNCAgICAgMDUgIFRPVEFMLVJFQUQgICAgICAgICAgUElDIDk5LgowMDAzMTUgICAgIDA1ICBGSUxMRVIgICAgICAgICAgICAgIFBJQyBYICAgICAgICAgVkFMVUUgU1BBQ0UuCjAwMDMxNiAgICAgMDUgIEZJTExFUiAgICAgICAgICAgICAgUElDIFgoMTcpICAgICAKMDAwMzE3ICAgICAgICAgICAgICAgICBWQUxVRSAgJ1JlY29yZHMgd2VyZSByZWFkJy4KMDAwMzE4ICAgICAwNSAgRklMTEVSICAgICAgICAgICAgICBQSUMgWCg1MykgICAgIFZBTFVFIFNQQUNFUy4KMDAwMzE5CjAwMDMyMCBQUk9DRURVUkUgRElWSVNJT04uCjAwMDMyMQowMDAzMzAgUFJFUEFSRS1TRU5JT1ItUkVQT1JULgowMDAzNDAgICAgIE9QRU4gSU5QVVQgIFNUVURFTlQtRklMRQowMDAzNTAgICAgICAgICAgT1VUUFVUIFBSSU5ULUZJTEUuCjAwMDM1MSAgICAgTU9WRSBaRVJPIFRPIFJFQ09SRFMtV1JJVFRFTi4KMDAwMzYwICAgICBSRUFEIFNUVURFTlQtRklMRQowMDAzNzAgICAgICAgICBBVCBFTkQgTU9WRSAnTk8nIFRPIERBVEEtUkVNQUlOUy1TV0lUQ0gKMDAwMzgwICAgICBFTkQtUkVBRC4KMDAwMzkwICAgICBQRVJGT1JNIFBST0NFU1MtUkVDT1JEUwowMDA0MTAgICAgICAgICBVTlRJTCBEQVRBLVJFTUFJTlMtU1dJVENIID0gJ05PJy4KMDAwNDExICAgICBQRVJGT1JNIFBSSU5ULVNVTU1BUlkuCjAwMDQyMCAgICAgQ0xPU0UgU1RVREVOVC1GSUxFCjAwMDQzMCAgICAgICAgICAgUFJJTlQtRklMRS4KMDAwNDQwICAgICBTVE9QIFJVTi4KMDAwNDUwCjAwMDQ2MCBQUk9DRVNTLVJFQ09SRFMuCjAwMDQ3MCAgICAgTU9WRSBTVFVERU5ULUlOIFRPIFJFQ09SRC1JTUFHRS4KMDAwNDgwICAgICBNT1ZFIERFVEFJTC1MSU5FIFRPIFBSSU5ULUxJTkUuCjAwMDQ5MCAgICAgV1JJVEUgUFJJTlQtTElORS4KMDAwNTAwICAgICBBREQgMSBUTyBSRUNPUkRTLVdSSVRURU4uCjAwMDUxMCAgICAgUkVBRCBTVFVERU5ULUZJTEUKMDAwNTIwICAgICAgICAgQVQgRU5EIE1PVkUgJ05PJyBUTyBEQVRBLVJFTUFJTlMtU1dJVENICjAwMDUzMCAgICAgRU5ELVJFQUQuIAowMDA1NDAKMDAwNTUwIFBSSU5ULVNVTU1BUlkuCjAwMDU2MCAgICAgTU9WRSBSRUNPUkRTLVdSSVRURU4gVE8gVE9UQUwtUkVBRC4KMDAwNTcwICAgICBNT1ZFIFNVTU1BUlktTElORSBUTyBQUklOVC1MSU5FLgowMDA1NzEgICAgIFdSSVRFIFBSSU5ULUxJTkUuIAowMDA1NzIKMDAwNTgwCjwvdGV4dGFyZWE+CiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgICAgIG1hdGNoQnJhY2tldHM6IHRydWUsCiAgICAgICAgbW9kZTogInRleHQveC1jb2JvbCIsCiAgICAgICAgdGhlbWUgOiAidHdpbGlnaHQiLAogICAgICAgIHN0eWxlQWN0aXZlTGluZTogdHJ1ZSwKICAgICAgICBzaG93Q3Vyc29yV2hlblNlbGVjdGluZyA6IHRydWUsICAKICAgICAgfSk7CiAgICAgIGZ1bmN0aW9uIHNlbGVjdFRoZW1lKCkgewogICAgICAgIHZhciB0aGVtZUlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNlbGVjdFRoZW1lIik7CiAgICAgICAgdmFyIHRoZW1lID0gdGhlbWVJbnB1dC5vcHRpb25zW3RoZW1lSW5wdXQuc2VsZWN0ZWRJbmRleF0uaW5uZXJIVE1MOwogICAgICAgIGVkaXRvci5zZXRPcHRpb24oInRoZW1lIiwgdGhlbWUpOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIHNlbGVjdEZvbnRzaXplKCkgewogICAgICAgIHZhciBmb250U2l6ZUlucHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInNlbGVjdEZvbnRTaXplIik7CiAgICAgICAgdmFyIGZvbnRTaXplID0gZm9udFNpemVJbnB1dC5vcHRpb25zW2ZvbnRTaXplSW5wdXQuc2VsZWN0ZWRJbmRleF0uaW5uZXJIVE1MOwogICAgICAgIGVkaXRvci5nZXRXcmFwcGVyRWxlbWVudCgpLnN0eWxlLmZvbnRTaXplID0gZm9udFNpemU7CiAgICAgICAgZWRpdG9yLnJlZnJlc2goKTsKICAgICAgfQogICAgICBmdW5jdGlvbiBzZWxlY3RSZWFkT25seSgpIHsKICAgICAgICBlZGl0b3Iuc2V0T3B0aW9uKCJyZWFkT25seSIsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjaGVja0JveFJlYWRPbmx5IikuY2hlY2tlZCk7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gdGFiVG9JbmRlbnRTcGFjZSgpIHsKICAgICAgICBpZiAoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImlkX3RhYlRvSW5kZW50U3BhY2UiKS5jaGVja2VkKSB7CiAgICAgICAgICAgIGVkaXRvci5zZXRPcHRpb24oImV4dHJhS2V5cyIsIHtUYWI6IGZ1bmN0aW9uKGNtKSB7IGNtLnJlcGxhY2VTZWxlY3Rpb24oIiAgICAiLCAiZW5kIik7IH19KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBlZGl0b3Iuc2V0T3B0aW9uKCJleHRyYUtleXMiLCB7VGFiOiBmdW5jdGlvbihjbSkgeyBjbS5yZXBsYWNlU2VsZWN0aW9uKCIgICAgIiwgImVuZCIpOyB9fSk7CiAgICAgICAgfQogICAgICB9CiAgICA8L3NjcmlwdD4KICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/coffeescript/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/coffeescript/coffeescript.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovKioKICogTGluayB0byB0aGUgcHJvamVjdCdzIEdpdEh1YiBwYWdlOgogKiBodHRwczovL2dpdGh1Yi5jb20vcGlja2hhcmR0L2NvZmZlZXNjcmlwdC1jb2RlbWlycm9yLW1vZGUKICovCihmdW5jdGlvbihtb2QpIHsKICBpZiAodHlwZW9mIGV4cG9ydHMgPT0gIm9iamVjdCIgJiYgdHlwZW9mIG1vZHVsZSA9PSAib2JqZWN0IikgLy8gQ29tbW9uSlMKICAgIG1vZChyZXF1aXJlKCIuLi8uLi9saWIvY29kZW1pcnJvciIpKTsKICBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCkgLy8gQU1ECiAgICBkZWZpbmUoWyIuLi8uLi9saWIvY29kZW1pcnJvciJdLCBtb2QpOwogIGVsc2UgLy8gUGxhaW4gYnJvd3NlciBlbnYKICAgIG1vZChDb2RlTWlycm9yKTsKfSkoZnVuY3Rpb24oQ29kZU1pcnJvcikgewoidXNlIHN0cmljdCI7CgpDb2RlTWlycm9yLmRlZmluZU1vZGUoImNvZmZlZXNjcmlwdCIsIGZ1bmN0aW9uKGNvbmYpIHsKICB2YXIgRVJST1JDTEFTUyA9ICJlcnJvciI7CgogIGZ1bmN0aW9uIHdvcmRSZWdleHAod29yZHMpIHsKICAgIHJldHVybiBuZXcgUmVnRXhwKCJeKCgiICsgd29yZHMuam9pbigiKXwoIikgKyAiKSlcXGIiKTsKICB9CgogIHZhciBvcGVyYXRvcnMgPSAvXig/Oi0+fD0+fFwrWys9XT98LVtcLT1dP3xcKltcKj1dP3xcL1tcLz1dP3xbPSFdPXw8Wz48XT89P3w+Pj89P3wlPT98Jj0/fFx8PT98XF49P3xcfnwhfFw/KS87CiAgdmFyIGRlbGltaXRlcnMgPSAvXig/OlsoKVxbXF17fSw6YD07XXxcLlwuP1wuPykvOwogIHZhciBpZGVudGlmaWVycyA9IC9eW19BLVphLXokXVtfQS1aYS16JDAtOV0qLzsKICB2YXIgcHJvcGVydGllcyA9IC9eKEB8dGhpc1wuKVtfQS1aYS16JF1bX0EtWmEteiQwLTldKi87CgogIHZhciB3b3JkT3BlcmF0b3JzID0gd29yZFJlZ2V4cChbImFuZCIsICJvciIsICJub3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlzIiwgImlzbnQiLCAiaW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluc3RhbmNlb2YiLCAidHlwZW9mIl0pOwogIHZhciBpbmRlbnRLZXl3b3JkcyA9IFsiZm9yIiwgIndoaWxlIiwgImxvb3AiLCAiaWYiLCAidW5sZXNzIiwgImVsc2UiLAogICAgICAgICAgICAgICAgICAgICAgICAic3dpdGNoIiwgInRyeSIsICJjYXRjaCIsICJmaW5hbGx5IiwgImNsYXNzIl07CiAgdmFyIGNvbW1vbktleXdvcmRzID0gWyJicmVhayIsICJieSIsICJjb250aW51ZSIsICJkZWJ1Z2dlciIsICJkZWxldGUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZG8iLCAiaW4iLCAib2YiLCAibmV3IiwgInJldHVybiIsICJ0aGVuIiwKICAgICAgICAgICAgICAgICAgICAgICAgInRoaXMiLCAidGhyb3ciLCAid2hlbiIsICJ1bnRpbCJdOwoKICB2YXIga2V5d29yZHMgPSB3b3JkUmVnZXhwKGluZGVudEtleXdvcmRzLmNvbmNhdChjb21tb25LZXl3b3JkcykpOwoKICBpbmRlbnRLZXl3b3JkcyA9IHdvcmRSZWdleHAoaW5kZW50S2V5d29yZHMpOwoKCiAgdmFyIHN0cmluZ1ByZWZpeGVzID0gL14oJ3szfXxcInszfXxbJ1wiXSkvOwogIHZhciByZWdleFByZWZpeGVzID0gL14oXC97M318XC8pLzsKICB2YXIgY29tbW9uQ29uc3RhbnRzID0gWyJJbmZpbml0eSIsICJOYU4iLCAidW5kZWZpbmVkIiwgIm51bGwiLCAidHJ1ZSIsICJmYWxzZSIsICJvbiIsICJvZmYiLCAieWVzIiwgIm5vIl07CiAgdmFyIGNvbnN0YW50cyA9IHdvcmRSZWdleHAoY29tbW9uQ29uc3RhbnRzKTsKCiAgLy8gVG9rZW5pemVycwogIGZ1bmN0aW9uIHRva2VuQmFzZShzdHJlYW0sIHN0YXRlKSB7CiAgICAvLyBIYW5kbGUgc2NvcGUgY2hhbmdlcwogICAgaWYgKHN0cmVhbS5zb2woKSkgewogICAgICBpZiAoc3RhdGUuc2NvcGUuYWxpZ24gPT09IG51bGwpIHN0YXRlLnNjb3BlLmFsaWduID0gZmFsc2U7CiAgICAgIHZhciBzY29wZU9mZnNldCA9IHN0YXRlLnNjb3BlLm9mZnNldDsKICAgICAgaWYgKHN0cmVhbS5lYXRTcGFjZSgpKSB7CiAgICAgICAgdmFyIGxpbmVPZmZzZXQgPSBzdHJlYW0uaW5kZW50YXRpb24oKTsKICAgICAgICBpZiAobGluZU9mZnNldCA+IHNjb3BlT2Zmc2V0ICYmIHN0YXRlLnNjb3BlLnR5cGUgPT0gImNvZmZlZSIpIHsKICAgICAgICAgIHJldHVybiAiaW5kZW50IjsKICAgICAgICB9IGVsc2UgaWYgKGxpbmVPZmZzZXQgPCBzY29wZU9mZnNldCkgewogICAgICAgICAgcmV0dXJuICJkZWRlbnQiOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoc2NvcGVPZmZzZXQgPiAwKSB7CiAgICAgICAgICBkZWRlbnQoc3RyZWFtLCBzdGF0ZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAoc3RyZWFtLmVhdFNwYWNlKCkpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgdmFyIGNoID0gc3RyZWFtLnBlZWsoKTsKCiAgICAvLyBIYW5kbGUgZG9jY28gdGl0bGUgY29tbWVudCAoc2luZ2xlIGxpbmUpCiAgICBpZiAoc3RyZWFtLm1hdGNoKCIjIyMjIikpIHsKICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICByZXR1cm4gImNvbW1lbnQiOwogICAgfQoKICAgIC8vIEhhbmRsZSBtdWx0aSBsaW5lIGNvbW1lbnRzCiAgICBpZiAoc3RyZWFtLm1hdGNoKCIjIyMiKSkgewogICAgICBzdGF0ZS50b2tlbml6ZSA9IGxvbmdDb21tZW50OwogICAgICByZXR1cm4gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CiAgICB9CgogICAgLy8gU2luZ2xlIGxpbmUgY29tbWVudAogICAgaWYgKGNoID09PSAiIyIpIHsKICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICByZXR1cm4gImNvbW1lbnQiOwogICAgfQoKICAgIC8vIEhhbmRsZSBudW1iZXIgbGl0ZXJhbHMKICAgIGlmIChzdHJlYW0ubWF0Y2goL14tP1swLTlcLl0vLCBmYWxzZSkpIHsKICAgICAgdmFyIGZsb2F0TGl0ZXJhbCA9IGZhbHNlOwogICAgICAvLyBGbG9hdHMKICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXi0/XGQqXC5cZCsoZVtcK1wtXT9cZCspPy9pKSkgewogICAgICAgIGZsb2F0TGl0ZXJhbCA9IHRydWU7CiAgICAgIH0KICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXi0/XGQrXC5cZCovKSkgewogICAgICAgIGZsb2F0TGl0ZXJhbCA9IHRydWU7CiAgICAgIH0KICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXi0/XC5cZCsvKSkgewogICAgICAgIGZsb2F0TGl0ZXJhbCA9IHRydWU7CiAgICAgIH0KCiAgICAgIGlmIChmbG9hdExpdGVyYWwpIHsKICAgICAgICAvLyBwcmV2ZW50IGZyb20gZ2V0dGluZyBleHRyYSAuIG9uIDEuLgogICAgICAgIGlmIChzdHJlYW0ucGVlaygpID09ICIuIil7CiAgICAgICAgICBzdHJlYW0uYmFja1VwKDEpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gIm51bWJlciI7CiAgICAgIH0KICAgICAgLy8gSW50ZWdlcnMKICAgICAgdmFyIGludExpdGVyYWwgPSBmYWxzZTsKICAgICAgLy8gSGV4CiAgICAgIGlmIChzdHJlYW0ubWF0Y2goL14tPzB4WzAtOWEtZl0rL2kpKSB7CiAgICAgICAgaW50TGl0ZXJhbCA9IHRydWU7CiAgICAgIH0KICAgICAgLy8gRGVjaW1hbAogICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eLT9bMS05XVxkKihlW1wrXC1dP1xkKyk/LykpIHsKICAgICAgICBpbnRMaXRlcmFsID0gdHJ1ZTsKICAgICAgfQogICAgICAvLyBaZXJvIGJ5IGl0c2VsZiB3aXRoIG5vIG90aGVyIHBpZWNlIG9mIG51bWJlci4KICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXi0/MCg/IVtcZHhdKS9pKSkgewogICAgICAgIGludExpdGVyYWwgPSB0cnVlOwogICAgICB9CiAgICAgIGlmIChpbnRMaXRlcmFsKSB7CiAgICAgICAgcmV0dXJuICJudW1iZXIiOwogICAgICB9CiAgICB9CgogICAgLy8gSGFuZGxlIHN0cmluZ3MKICAgIGlmIChzdHJlYW0ubWF0Y2goc3RyaW5nUHJlZml4ZXMpKSB7CiAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5GYWN0b3J5KHN0cmVhbS5jdXJyZW50KCksIGZhbHNlLCAic3RyaW5nIik7CiAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgIH0KICAgIC8vIEhhbmRsZSByZWdleCBsaXRlcmFscwogICAgaWYgKHN0cmVhbS5tYXRjaChyZWdleFByZWZpeGVzKSkgewogICAgICBpZiAoc3RyZWFtLmN1cnJlbnQoKSAhPSAiLyIgfHwgc3RyZWFtLm1hdGNoKC9eLipcLy8sIGZhbHNlKSkgeyAvLyBwcmV2ZW50IGhpZ2hsaWdodCBvZiBkaXZpc2lvbgogICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5GYWN0b3J5KHN0cmVhbS5jdXJyZW50KCksIHRydWUsICJzdHJpbmctMiIpOwogICAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzdHJlYW0uYmFja1VwKDEpOwogICAgICB9CiAgICB9CgogICAgLy8gSGFuZGxlIG9wZXJhdG9ycyBhbmQgZGVsaW1pdGVycwogICAgaWYgKHN0cmVhbS5tYXRjaChvcGVyYXRvcnMpIHx8IHN0cmVhbS5tYXRjaCh3b3JkT3BlcmF0b3JzKSkgewogICAgICByZXR1cm4gIm9wZXJhdG9yIjsKICAgIH0KICAgIGlmIChzdHJlYW0ubWF0Y2goZGVsaW1pdGVycykpIHsKICAgICAgcmV0dXJuICJwdW5jdHVhdGlvbiI7CiAgICB9CgogICAgaWYgKHN0cmVhbS5tYXRjaChjb25zdGFudHMpKSB7CiAgICAgIHJldHVybiAiYXRvbSI7CiAgICB9CgogICAgaWYgKHN0cmVhbS5tYXRjaChrZXl3b3JkcykpIHsKICAgICAgcmV0dXJuICJrZXl3b3JkIjsKICAgIH0KCiAgICBpZiAoc3RyZWFtLm1hdGNoKGlkZW50aWZpZXJzKSkgewogICAgICByZXR1cm4gInZhcmlhYmxlIjsKICAgIH0KCiAgICBpZiAoc3RyZWFtLm1hdGNoKHByb3BlcnRpZXMpKSB7CiAgICAgIHJldHVybiAicHJvcGVydHkiOwogICAgfQoKICAgIC8vIEhhbmRsZSBub24tZGV0ZWN0ZWQgaXRlbXMKICAgIHN0cmVhbS5uZXh0KCk7CiAgICByZXR1cm4gRVJST1JDTEFTUzsKICB9CgogIGZ1bmN0aW9uIHRva2VuRmFjdG9yeShkZWxpbWl0ZXIsIHNpbmdsZWxpbmUsIG91dGNsYXNzKSB7CiAgICByZXR1cm4gZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICB3aGlsZSAoIXN0cmVhbS5lb2woKSkgewogICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW14nIlwvXFxdLyk7CiAgICAgICAgaWYgKHN0cmVhbS5lYXQoIlxcIikpIHsKICAgICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgICBpZiAoc2luZ2xlbGluZSAmJiBzdHJlYW0uZW9sKCkpIHsKICAgICAgICAgICAgcmV0dXJuIG91dGNsYXNzOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLm1hdGNoKGRlbGltaXRlcikpIHsKICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlOwogICAgICAgICAgcmV0dXJuIG91dGNsYXNzOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzdHJlYW0uZWF0KC9bJyJcL10vKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHNpbmdsZWxpbmUpIHsKICAgICAgICBpZiAoY29uZi5tb2RlLnNpbmdsZUxpbmVTdHJpbmdFcnJvcnMpIHsKICAgICAgICAgIG91dGNsYXNzID0gRVJST1JDTEFTUzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBvdXRjbGFzczsKICAgIH07CiAgfQoKICBmdW5jdGlvbiBsb25nQ29tbWVudChzdHJlYW0sIHN0YXRlKSB7CiAgICB3aGlsZSAoIXN0cmVhbS5lb2woKSkgewogICAgICBzdHJlYW0uZWF0V2hpbGUoL1teI10vKTsKICAgICAgaWYgKHN0cmVhbS5tYXRjaCgiIyMjIikpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBzdHJlYW0uZWF0V2hpbGUoIiMiKTsKICAgIH0KICAgIHJldHVybiAiY29tbWVudCI7CiAgfQoKICBmdW5jdGlvbiBpbmRlbnQoc3RyZWFtLCBzdGF0ZSwgdHlwZSkgewogICAgdHlwZSA9IHR5cGUgfHwgImNvZmZlZSI7CiAgICB2YXIgb2Zmc2V0ID0gMCwgYWxpZ24gPSBmYWxzZSwgYWxpZ25PZmZzZXQgPSBudWxsOwogICAgZm9yICh2YXIgc2NvcGUgPSBzdGF0ZS5zY29wZTsgc2NvcGU7IHNjb3BlID0gc2NvcGUucHJldikgewogICAgICBpZiAoc2NvcGUudHlwZSA9PT0gImNvZmZlZSIpIHsKICAgICAgICBvZmZzZXQgPSBzY29wZS5vZmZzZXQgKyBjb25mLmluZGVudFVuaXQ7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIGlmICh0eXBlICE9PSAiY29mZmVlIikgewogICAgICBhbGlnbiA9IG51bGw7CiAgICAgIGFsaWduT2Zmc2V0ID0gc3RyZWFtLmNvbHVtbigpICsgc3RyZWFtLmN1cnJlbnQoKS5sZW5ndGg7CiAgICB9IGVsc2UgaWYgKHN0YXRlLnNjb3BlLmFsaWduKSB7CiAgICAgIHN0YXRlLnNjb3BlLmFsaWduID0gZmFsc2U7CiAgICB9CiAgICBzdGF0ZS5zY29wZSA9IHsKICAgICAgb2Zmc2V0OiBvZmZzZXQsCiAgICAgIHR5cGU6IHR5cGUsCiAgICAgIHByZXY6IHN0YXRlLnNjb3BlLAogICAgICBhbGlnbjogYWxpZ24sCiAgICAgIGFsaWduT2Zmc2V0OiBhbGlnbk9mZnNldAogICAgfTsKICB9CgogIGZ1bmN0aW9uIGRlZGVudChzdHJlYW0sIHN0YXRlKSB7CiAgICBpZiAoIXN0YXRlLnNjb3BlLnByZXYpIHJldHVybjsKICAgIGlmIChzdGF0ZS5zY29wZS50eXBlID09PSAiY29mZmVlIikgewogICAgICB2YXIgX2luZGVudCA9IHN0cmVhbS5pbmRlbnRhdGlvbigpOwogICAgICB2YXIgbWF0Y2hlZCA9IGZhbHNlOwogICAgICBmb3IgKHZhciBzY29wZSA9IHN0YXRlLnNjb3BlOyBzY29wZTsgc2NvcGUgPSBzY29wZS5wcmV2KSB7CiAgICAgICAgaWYgKF9pbmRlbnQgPT09IHNjb3BlLm9mZnNldCkgewogICAgICAgICAgbWF0Y2hlZCA9IHRydWU7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKCFtYXRjaGVkKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgd2hpbGUgKHN0YXRlLnNjb3BlLnByZXYgJiYgc3RhdGUuc2NvcGUub2Zmc2V0ICE9PSBfaW5kZW50KSB7CiAgICAgICAgc3RhdGUuc2NvcGUgPSBzdGF0ZS5zY29wZS5wcmV2OwogICAgICB9CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0gZWxzZSB7CiAgICAgIHN0YXRlLnNjb3BlID0gc3RhdGUuc2NvcGUucHJldjsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KCiAgZnVuY3Rpb24gdG9rZW5MZXhlcihzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgc3R5bGUgPSBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgIHZhciBjdXJyZW50ID0gc3RyZWFtLmN1cnJlbnQoKTsKCiAgICAvLyBIYW5kbGUgIi4iIGNvbm5lY3RlZCBpZGVudGlmaWVycwogICAgaWYgKGN1cnJlbnQgPT09ICIuIikgewogICAgICBzdHlsZSA9IHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgICBjdXJyZW50ID0gc3RyZWFtLmN1cnJlbnQoKTsKICAgICAgaWYgKC9eXC5bXHckXSskLy50ZXN0KGN1cnJlbnQpKSB7CiAgICAgICAgcmV0dXJuICJ2YXJpYWJsZSI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIEVSUk9SQ0xBU1M7CiAgICAgIH0KICAgIH0KCiAgICAvLyBIYW5kbGUgc2NvcGUgY2hhbmdlcy4KICAgIGlmIChjdXJyZW50ID09PSAicmV0dXJuIikgewogICAgICBzdGF0ZS5kZWRlbnQgKz0gMTsKICAgIH0KICAgIGlmICgoKGN1cnJlbnQgPT09ICItPiIgfHwgY3VycmVudCA9PT0gIj0+IikgJiYKICAgICAgICAgIXN0YXRlLmxhbWJkYSAmJgogICAgICAgICAhc3RyZWFtLnBlZWsoKSkKICAgICAgICB8fCBzdHlsZSA9PT0gImluZGVudCIpIHsKICAgICAgaW5kZW50KHN0cmVhbSwgc3RhdGUpOwogICAgfQogICAgdmFyIGRlbGltaXRlcl9pbmRleCA9ICJbKHsiLmluZGV4T2YoY3VycmVudCk7CiAgICBpZiAoZGVsaW1pdGVyX2luZGV4ICE9PSAtMSkgewogICAgICBpbmRlbnQoc3RyZWFtLCBzdGF0ZSwgIl0pfSIuc2xpY2UoZGVsaW1pdGVyX2luZGV4LCBkZWxpbWl0ZXJfaW5kZXgrMSkpOwogICAgfQogICAgaWYgKGluZGVudEtleXdvcmRzLmV4ZWMoY3VycmVudCkpewogICAgICBpbmRlbnQoc3RyZWFtLCBzdGF0ZSk7CiAgICB9CiAgICBpZiAoY3VycmVudCA9PSAidGhlbiIpewogICAgICBkZWRlbnQoc3RyZWFtLCBzdGF0ZSk7CiAgICB9CgoKICAgIGlmIChzdHlsZSA9PT0gImRlZGVudCIpIHsKICAgICAgaWYgKGRlZGVudChzdHJlYW0sIHN0YXRlKSkgewogICAgICAgIHJldHVybiBFUlJPUkNMQVNTOwogICAgICB9CiAgICB9CiAgICBkZWxpbWl0ZXJfaW5kZXggPSAiXSl9Ii5pbmRleE9mKGN1cnJlbnQpOwogICAgaWYgKGRlbGltaXRlcl9pbmRleCAhPT0gLTEpIHsKICAgICAgd2hpbGUgKHN0YXRlLnNjb3BlLnR5cGUgPT0gImNvZmZlZSIgJiYgc3RhdGUuc2NvcGUucHJldikKICAgICAgICBzdGF0ZS5zY29wZSA9IHN0YXRlLnNjb3BlLnByZXY7CiAgICAgIGlmIChzdGF0ZS5zY29wZS50eXBlID09IGN1cnJlbnQpCiAgICAgICAgc3RhdGUuc2NvcGUgPSBzdGF0ZS5zY29wZS5wcmV2OwogICAgfQogICAgaWYgKHN0YXRlLmRlZGVudCA+IDAgJiYgc3RyZWFtLmVvbCgpICYmIHN0YXRlLnNjb3BlLnR5cGUgPT0gImNvZmZlZSIpIHsKICAgICAgaWYgKHN0YXRlLnNjb3BlLnByZXYpIHN0YXRlLnNjb3BlID0gc3RhdGUuc2NvcGUucHJldjsKICAgICAgc3RhdGUuZGVkZW50IC09IDE7CiAgICB9CgogICAgcmV0dXJuIHN0eWxlOwogIH0KCiAgdmFyIGV4dGVybmFsID0gewogICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24oYmFzZWNvbHVtbikgewogICAgICByZXR1cm4gewogICAgICAgIHRva2VuaXplOiB0b2tlbkJhc2UsCiAgICAgICAgc2NvcGU6IHtvZmZzZXQ6YmFzZWNvbHVtbiB8fCAwLCB0eXBlOiJjb2ZmZWUiLCBwcmV2OiBudWxsLCBhbGlnbjogZmFsc2V9LAogICAgICAgIGxhc3RUb2tlbjogbnVsbCwKICAgICAgICBsYW1iZGE6IGZhbHNlLAogICAgICAgIGRlZGVudDogMAogICAgICB9OwogICAgfSwKCiAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICB2YXIgZmlsbEFsaWduID0gc3RhdGUuc2NvcGUuYWxpZ24gPT09IG51bGwgJiYgc3RhdGUuc2NvcGU7CiAgICAgIGlmIChmaWxsQWxpZ24gJiYgc3RyZWFtLnNvbCgpKSBmaWxsQWxpZ24uYWxpZ24gPSBmYWxzZTsKCiAgICAgIHZhciBzdHlsZSA9IHRva2VuTGV4ZXIoc3RyZWFtLCBzdGF0ZSk7CiAgICAgIGlmIChmaWxsQWxpZ24gJiYgc3R5bGUgJiYgc3R5bGUgIT0gImNvbW1lbnQiKSBmaWxsQWxpZ24uYWxpZ24gPSB0cnVlOwoKICAgICAgc3RhdGUubGFzdFRva2VuID0ge3N0eWxlOnN0eWxlLCBjb250ZW50OiBzdHJlYW0uY3VycmVudCgpfTsKCiAgICAgIGlmIChzdHJlYW0uZW9sKCkgJiYgc3RyZWFtLmxhbWJkYSkgewogICAgICAgIHN0YXRlLmxhbWJkYSA9IGZhbHNlOwogICAgICB9CgogICAgICByZXR1cm4gc3R5bGU7CiAgICB9LAoKICAgIGluZGVudDogZnVuY3Rpb24oc3RhdGUsIHRleHQpIHsKICAgICAgaWYgKHN0YXRlLnRva2VuaXplICE9IHRva2VuQmFzZSkgcmV0dXJuIDA7CiAgICAgIHZhciBzY29wZSA9IHN0YXRlLnNjb3BlOwogICAgICB2YXIgY2xvc2VyID0gdGV4dCAmJiAiXSl9Ii5pbmRleE9mKHRleHQuY2hhckF0KDApKSA+IC0xOwogICAgICBpZiAoY2xvc2VyKSB3aGlsZSAoc2NvcGUudHlwZSA9PSAiY29mZmVlIiAmJiBzY29wZS5wcmV2KSBzY29wZSA9IHNjb3BlLnByZXY7CiAgICAgIHZhciBjbG9zZXMgPSBjbG9zZXIgJiYgc2NvcGUudHlwZSA9PT0gdGV4dC5jaGFyQXQoMCk7CiAgICAgIGlmIChzY29wZS5hbGlnbikKICAgICAgICByZXR1cm4gc2NvcGUuYWxpZ25PZmZzZXQgLSAoY2xvc2VzID8gMSA6IDApOwogICAgICBlbHNlCiAgICAgICAgcmV0dXJuIChjbG9zZXMgPyBzY29wZS5wcmV2IDogc2NvcGUpLm9mZnNldDsKICAgIH0sCgogICAgbGluZUNvbW1lbnQ6ICIjIiwKICAgIGZvbGQ6ICJpbmRlbnQiCiAgfTsKICByZXR1cm4gZXh0ZXJuYWw7Cn0pOwoKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtY29mZmVlc2NyaXB0IiwgImNvZmZlZXNjcmlwdCIpOwoKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/coffeescript/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogQ29mZmVlU2NyaXB0IG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iY29mZmVlc2NyaXB0LmpzIj48L3NjcmlwdD4KPHN0eWxlPi5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgc2lsdmVyOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgc2lsdmVyO308L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5Db2ZmZWVTY3JpcHQ8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPkNvZmZlZVNjcmlwdCBtb2RlPC9oMj4KPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KIyBDb2ZmZWVTY3JpcHQgbW9kZSBmb3IgQ29kZU1pcnJvcgojIENvcHlyaWdodCAoYykgMjAxMSBKZWZmIFBpY2toYXJkdCwgcmVsZWFzZWQgdW5kZXIKIyB0aGUgTUlUIExpY2Vuc2UuCiMKIyBNb2RpZmllZCBmcm9tIHRoZSBQeXRob24gQ29kZU1pcnJvciBtb2RlLCB3aGljaCBhbHNvIGlzIAojIHVuZGVyIHRoZSBNSVQgTGljZW5zZSBDb3B5cmlnaHQgKGMpIDIwMTAgVGltb3RoeSBGYXJyZWxsLgojCiMgVGhlIGZvbGxvd2luZyBzY3JpcHQsIFVuZGVyc2NvcmUuY29mZmVlLCBpcyB1c2VkIHRvIAojIGRlbW9uc3RyYXRlIENvZmZlZVNjcmlwdCBtb2RlIGZvciBDb2RlTWlycm9yLgojCiMgVG8gZG93bmxvYWQgQ29mZmVlU2NyaXB0IG1vZGUgZm9yIENvZGVNaXJyb3IsIGdvIHRvOgojIGh0dHBzOi8vZ2l0aHViLmNvbS9waWNraGFyZHQvY29mZmVlc2NyaXB0LWNvZGVtaXJyb3ItbW9kZQoKIyAqKlVuZGVyc2NvcmUuY29mZmVlCiMgKGMpIDIwMTEgSmVyZW15IEFzaGtlbmFzLCBEb2N1bWVudENsb3VkIEluYy4qKgojIFVuZGVyc2NvcmUgaXMgZnJlZWx5IGRpc3RyaWJ1dGFibGUgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZQojIFtNSVQgbGljZW5zZV0oaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9NSVRfTGljZW5zZSkuCiMgUG9ydGlvbnMgb2YgVW5kZXJzY29yZSBhcmUgaW5zcGlyZWQgYnkgb3IgYm9ycm93ZWQgZnJvbQojIFtQcm90b3R5cGUuanNdKGh0dHA6Ly9wcm90b3R5cGVqcy5vcmcvYXBpKSwgT2xpdmVyIFN0ZWVsZSdzCiMgW0Z1bmN0aW9uYWxdKGh0dHA6Ly9vc3RlZWxlLmNvbSksIGFuZCBKb2huIFJlc2lnJ3MKIyBbTWljcm8tVGVtcGxhdGluZ10oaHR0cDovL2Vqb2huLm9yZykuCiMgRm9yIGFsbCBkZXRhaWxzIGFuZCBkb2N1bWVudGF0aW9uOgojIGh0dHA6Ly9kb2N1bWVudGNsb3VkLmdpdGh1Yi5jb20vdW5kZXJzY29yZS8KCgojIEJhc2VsaW5lIHNldHVwCiMgLS0tLS0tLS0tLS0tLS0KCiMgRXN0YWJsaXNoIHRoZSByb290IG9iamVjdCwgYHdpbmRvd2AgaW4gdGhlIGJyb3dzZXIsIG9yIGBnbG9iYWxgIG9uIHRoZSBzZXJ2ZXIuCnJvb3QgPSB0aGlzCgoKIyBTYXZlIHRoZSBwcmV2aW91cyB2YWx1ZSBvZiB0aGUgYF9gIHZhcmlhYmxlLgpwcmV2aW91c1VuZGVyc2NvcmUgPSByb290Ll8KCiMjIyBNdWx0aWxpbmUKICAgIGNvbW1lbnQKIyMjCgojIEVzdGFibGlzaCB0aGUgb2JqZWN0IHRoYXQgZ2V0cyB0aHJvd24gdG8gYnJlYWsgb3V0IG9mIGEgbG9vcCBpdGVyYXRpb24uCiMgYFN0b3BJdGVyYXRpb25gIGlzIFNPUCBvbiBNb3ppbGxhLgpicmVha2VyID0gaWYgdHlwZW9mKFN0b3BJdGVyYXRpb24pIGlzICd1bmRlZmluZWQnIHRoZW4gJ19fYnJlYWtfXycgZWxzZSBTdG9wSXRlcmF0aW9uCgoKIyMjIyBEb2NjbyBzdHlsZSBzaW5nbGUgbGluZSBjb21tZW50ICh0aXRsZSkKCgojIEhlbHBlciBmdW5jdGlvbiB0byBlc2NhcGUgKipSZWdFeHAqKiBjb250ZW50cywgYmVjYXVzZSBKUyBkb2Vzbid0IGhhdmUgb25lLgplc2NhcGVSZWdFeHAgPSAoc3RyaW5nKSAtPiBzdHJpbmcucmVwbGFjZSgvKFsuKis/XiR7fSgpfFtcXVwvXFxdKS9nLCAnXFwkMScpCgoKIyBTYXZlIGJ5dGVzIGluIHRoZSBtaW5pZmllZCAoYnV0IG5vdCBnemlwcGVkKSB2ZXJzaW9uOgpBcnJheVByb3RvID0gQXJyYXkucHJvdG90eXBlCk9ialByb3RvID0gT2JqZWN0LnByb3RvdHlwZQoKCiMgQ3JlYXRlIHF1aWNrIHJlZmVyZW5jZSB2YXJpYWJsZXMgZm9yIHNwZWVkIGFjY2VzcyB0byBjb3JlIHByb3RvdHlwZXMuCnNsaWNlID0gQXJyYXlQcm90by5zbGljZQp1bnNoaWZ0ID0gQXJyYXlQcm90by51bnNoaWZ0CnRvU3RyaW5nID0gT2JqUHJvdG8udG9TdHJpbmcKaGFzT3duUHJvcGVydHkgPSBPYmpQcm90by5oYXNPd25Qcm9wZXJ0eQpwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IE9ialByb3RvLnByb3BlcnR5SXNFbnVtZXJhYmxlCgoKIyBBbGwgKipFQ01BNSoqIG5hdGl2ZSBpbXBsZW1lbnRhdGlvbnMgd2UgaG9wZSB0byB1c2UgYXJlIGRlY2xhcmVkIGhlcmUuCm5hdGl2ZUZvckVhY2ggPSBBcnJheVByb3RvLmZvckVhY2gKbmF0aXZlTWFwID0gQXJyYXlQcm90by5tYXAKbmF0aXZlUmVkdWNlID0gQXJyYXlQcm90by5yZWR1Y2UKbmF0aXZlUmVkdWNlUmlnaHQgPSBBcnJheVByb3RvLnJlZHVjZVJpZ2h0Cm5hdGl2ZUZpbHRlciA9IEFycmF5UHJvdG8uZmlsdGVyCm5hdGl2ZUV2ZXJ5ID0gQXJyYXlQcm90by5ldmVyeQpuYXRpdmVTb21lID0gQXJyYXlQcm90by5zb21lCm5hdGl2ZUluZGV4T2YgPSBBcnJheVByb3RvLmluZGV4T2YKbmF0aXZlTGFzdEluZGV4T2YgPSBBcnJheVByb3RvLmxhc3RJbmRleE9mCm5hdGl2ZUlzQXJyYXkgPSBBcnJheS5pc0FycmF5Cm5hdGl2ZUtleXMgPSBPYmplY3Qua2V5cwoKCiMgQ3JlYXRlIGEgc2FmZSByZWZlcmVuY2UgdG8gdGhlIFVuZGVyc2NvcmUgb2JqZWN0IGZvciB1c2UgYmVsb3cuCl8gPSAob2JqKSAtPiBuZXcgd3JhcHBlcihvYmopCgoKIyBFeHBvcnQgdGhlIFVuZGVyc2NvcmUgb2JqZWN0IGZvciAqKkNvbW1vbkpTKiouCmlmIHR5cGVvZihleHBvcnRzKSAhPSAndW5kZWZpbmVkJyB0aGVuIGV4cG9ydHMuXyA9IF8KCgojIEV4cG9ydCBVbmRlcnNjb3JlIHRvIGdsb2JhbCBzY29wZS4Kcm9vdC5fID0gXwoKCiMgQ3VycmVudCB2ZXJzaW9uLgpfLlZFUlNJT04gPSAnMS4xLjAnCgoKIyBDb2xsZWN0aW9uIEZ1bmN0aW9ucwojIC0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIFRoZSBjb3JuZXJzdG9uZSwgYW4gKiplYWNoKiogaW1wbGVtZW50YXRpb24uCiMgSGFuZGxlcyBvYmplY3RzIGltcGxlbWVudGluZyAqKmZvckVhY2gqKiwgYXJyYXlzLCBhbmQgcmF3IG9iamVjdHMuCl8uZWFjaCA9IChvYmosIGl0ZXJhdG9yLCBjb250ZXh0KSAtPgogIHRyeQogICAgaWYgbmF0aXZlRm9yRWFjaCBhbmQgb2JqLmZvckVhY2ggaXMgbmF0aXZlRm9yRWFjaAogICAgICBvYmouZm9yRWFjaCBpdGVyYXRvciwgY29udGV4dAogICAgZWxzZSBpZiBfLmlzTnVtYmVyIG9iai5sZW5ndGgKICAgICAgaXRlcmF0b3IuY2FsbCBjb250ZXh0LCBvYmpbaV0sIGksIG9iaiBmb3IgaSBpbiBbMC4uLm9iai5sZW5ndGhdCiAgICBlbHNlCiAgICAgIGl0ZXJhdG9yLmNhbGwgY29udGV4dCwgdmFsLCBrZXksIG9iaiBmb3Igb3duIGtleSwgdmFsIG9mIG9iagogIGNhdGNoIGUKICAgIHRocm93IGUgaWYgZSBpc250IGJyZWFrZXIKICBvYmoKCgojIFJldHVybiB0aGUgcmVzdWx0cyBvZiBhcHBseWluZyB0aGUgaXRlcmF0b3IgdG8gZWFjaCBlbGVtZW50LiBVc2UgSmF2YVNjcmlwdAojIDEuNidzIHZlcnNpb24gb2YgKiptYXAqKiwgaWYgcG9zc2libGUuCl8ubWFwID0gKG9iaiwgaXRlcmF0b3IsIGNvbnRleHQpIC0+CiAgcmV0dXJuIG9iai5tYXAoaXRlcmF0b3IsIGNvbnRleHQpIGlmIG5hdGl2ZU1hcCBhbmQgb2JqLm1hcCBpcyBuYXRpdmVNYXAKICByZXN1bHRzID0gW10KICBfLmVhY2ggb2JqLCAodmFsdWUsIGluZGV4LCBsaXN0KSAtPgogICAgcmVzdWx0cy5wdXNoIGl0ZXJhdG9yLmNhbGwgY29udGV4dCwgdmFsdWUsIGluZGV4LCBsaXN0CiAgcmVzdWx0cwoKCiMgKipSZWR1Y2UqKiBidWlsZHMgdXAgYSBzaW5nbGUgcmVzdWx0IGZyb20gYSBsaXN0IG9mIHZhbHVlcy4gQWxzbyBrbm93biBhcwojICoqaW5qZWN0KiosIG9yICoqZm9sZGwqKi4gVXNlcyBKYXZhU2NyaXB0IDEuOCdzIHZlcnNpb24gb2YgKipyZWR1Y2UqKiwgaWYgcG9zc2libGUuCl8ucmVkdWNlID0gKG9iaiwgaXRlcmF0b3IsIG1lbW8sIGNvbnRleHQpIC0+CiAgaWYgbmF0aXZlUmVkdWNlIGFuZCBvYmoucmVkdWNlIGlzIG5hdGl2ZVJlZHVjZQogICAgaXRlcmF0b3IgPSBfLmJpbmQgaXRlcmF0b3IsIGNvbnRleHQgaWYgY29udGV4dAogICAgcmV0dXJuIG9iai5yZWR1Y2UgaXRlcmF0b3IsIG1lbW8KICBfLmVhY2ggb2JqLCAodmFsdWUsIGluZGV4LCBsaXN0KSAtPgogICAgbWVtbyA9IGl0ZXJhdG9yLmNhbGwgY29udGV4dCwgbWVtbywgdmFsdWUsIGluZGV4LCBsaXN0CiAgbWVtbwoKCiMgVGhlIHJpZ2h0LWFzc29jaWF0aXZlIHZlcnNpb24gb2YgKipyZWR1Y2UqKiwgYWxzbyBrbm93biBhcyAqKmZvbGRyKiouIFVzZXMKIyBKYXZhU2NyaXB0IDEuOCdzIHZlcnNpb24gb2YgKipyZWR1Y2VSaWdodCoqLCBpZiBhdmFpbGFibGUuCl8ucmVkdWNlUmlnaHQgPSAob2JqLCBpdGVyYXRvciwgbWVtbywgY29udGV4dCkgLT4KICBpZiBuYXRpdmVSZWR1Y2VSaWdodCBhbmQgb2JqLnJlZHVjZVJpZ2h0IGlzIG5hdGl2ZVJlZHVjZVJpZ2h0CiAgICBpdGVyYXRvciA9IF8uYmluZCBpdGVyYXRvciwgY29udGV4dCBpZiBjb250ZXh0CiAgICByZXR1cm4gb2JqLnJlZHVjZVJpZ2h0IGl0ZXJhdG9yLCBtZW1vCiAgcmV2ZXJzZWQgPSBfLmNsb25lKF8udG9BcnJheShvYmopKS5yZXZlcnNlKCkKICBfLnJlZHVjZSByZXZlcnNlZCwgaXRlcmF0b3IsIG1lbW8sIGNvbnRleHQKCgojIFJldHVybiB0aGUgZmlyc3QgdmFsdWUgd2hpY2ggcGFzc2VzIGEgdHJ1dGggdGVzdC4KXy5kZXRlY3QgPSAob2JqLCBpdGVyYXRvciwgY29udGV4dCkgLT4KICByZXN1bHQgPSBudWxsCiAgXy5lYWNoIG9iaiwgKHZhbHVlLCBpbmRleCwgbGlzdCkgLT4KICAgIGlmIGl0ZXJhdG9yLmNhbGwgY29udGV4dCwgdmFsdWUsIGluZGV4LCBsaXN0CiAgICAgIHJlc3VsdCA9IHZhbHVlCiAgICAgIF8uYnJlYWtMb29wKCkKICByZXN1bHQKCgojIFJldHVybiBhbGwgdGhlIGVsZW1lbnRzIHRoYXQgcGFzcyBhIHRydXRoIHRlc3QuIFVzZSBKYXZhU2NyaXB0IDEuNidzCiMgKipmaWx0ZXIqKiwgaWYgaXQgZXhpc3RzLgpfLmZpbHRlciA9IChvYmosIGl0ZXJhdG9yLCBjb250ZXh0KSAtPgogIHJldHVybiBvYmouZmlsdGVyIGl0ZXJhdG9yLCBjb250ZXh0IGlmIG5hdGl2ZUZpbHRlciBhbmQgb2JqLmZpbHRlciBpcyBuYXRpdmVGaWx0ZXIKICByZXN1bHRzID0gW10KICBfLmVhY2ggb2JqLCAodmFsdWUsIGluZGV4LCBsaXN0KSAtPgogICAgcmVzdWx0cy5wdXNoIHZhbHVlIGlmIGl0ZXJhdG9yLmNhbGwgY29udGV4dCwgdmFsdWUsIGluZGV4LCBsaXN0CiAgcmVzdWx0cwoKCiMgUmV0dXJuIGFsbCB0aGUgZWxlbWVudHMgZm9yIHdoaWNoIGEgdHJ1dGggdGVzdCBmYWlscy4KXy5yZWplY3QgPSAob2JqLCBpdGVyYXRvciwgY29udGV4dCkgLT4KICByZXN1bHRzID0gW10KICBfLmVhY2ggb2JqLCAodmFsdWUsIGluZGV4LCBsaXN0KSAtPgogICAgcmVzdWx0cy5wdXNoIHZhbHVlIGlmIG5vdCBpdGVyYXRvci5jYWxsIGNvbnRleHQsIHZhbHVlLCBpbmRleCwgbGlzdAogIHJlc3VsdHMKCgojIERldGVybWluZSB3aGV0aGVyIGFsbCBvZiB0aGUgZWxlbWVudHMgbWF0Y2ggYSB0cnV0aCB0ZXN0LiBEZWxlZ2F0ZSB0bwojIEphdmFTY3JpcHQgMS42J3MgKipldmVyeSoqLCBpZiBpdCBpcyBwcmVzZW50LgpfLmV2ZXJ5ID0gKG9iaiwgaXRlcmF0b3IsIGNvbnRleHQpIC0+CiAgaXRlcmF0b3IgfHw9IF8uaWRlbnRpdHkKICByZXR1cm4gb2JqLmV2ZXJ5IGl0ZXJhdG9yLCBjb250ZXh0IGlmIG5hdGl2ZUV2ZXJ5IGFuZCBvYmouZXZlcnkgaXMgbmF0aXZlRXZlcnkKICByZXN1bHQgPSB0cnVlCiAgXy5lYWNoIG9iaiwgKHZhbHVlLCBpbmRleCwgbGlzdCkgLT4KICAgIF8uYnJlYWtMb29wKCkgdW5sZXNzIChyZXN1bHQgPSByZXN1bHQgYW5kIGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgdmFsdWUsIGluZGV4LCBsaXN0KSkKICByZXN1bHQKCgojIERldGVybWluZSBpZiBhdCBsZWFzdCBvbmUgZWxlbWVudCBpbiB0aGUgb2JqZWN0IG1hdGNoZXMgYSB0cnV0aCB0ZXN0LiBVc2UKIyBKYXZhU2NyaXB0IDEuNidzICoqc29tZSoqLCBpZiBpdCBleGlzdHMuCl8uc29tZSA9IChvYmosIGl0ZXJhdG9yLCBjb250ZXh0KSAtPgogIGl0ZXJhdG9yIHx8PSBfLmlkZW50aXR5CiAgcmV0dXJuIG9iai5zb21lIGl0ZXJhdG9yLCBjb250ZXh0IGlmIG5hdGl2ZVNvbWUgYW5kIG9iai5zb21lIGlzIG5hdGl2ZVNvbWUKICByZXN1bHQgPSBmYWxzZQogIF8uZWFjaCBvYmosICh2YWx1ZSwgaW5kZXgsIGxpc3QpIC0+CiAgICBfLmJyZWFrTG9vcCgpIGlmIChyZXN1bHQgPSBpdGVyYXRvci5jYWxsKGNvbnRleHQsIHZhbHVlLCBpbmRleCwgbGlzdCkpCiAgcmVzdWx0CgoKIyBEZXRlcm1pbmUgaWYgYSBnaXZlbiB2YWx1ZSBpcyBpbmNsdWRlZCBpbiB0aGUgYXJyYXkgb3Igb2JqZWN0LAojIGJhc2VkIG9uIGA9PT1gLgpfLmluY2x1ZGUgPSAob2JqLCB0YXJnZXQpIC0+CiAgcmV0dXJuIF8uaW5kZXhPZihvYmosIHRhcmdldCkgaXNudCAtMSBpZiBuYXRpdmVJbmRleE9mIGFuZCBvYmouaW5kZXhPZiBpcyBuYXRpdmVJbmRleE9mCiAgcmV0dXJuIHRydWUgZm9yIG93biBrZXksIHZhbCBvZiBvYmogd2hlbiB2YWwgaXMgdGFyZ2V0CiAgZmFsc2UKCgojIEludm9rZSBhIG1ldGhvZCB3aXRoIGFyZ3VtZW50cyBvbiBldmVyeSBpdGVtIGluIGEgY29sbGVjdGlvbi4KXy5pbnZva2UgPSAob2JqLCBtZXRob2QpIC0+CiAgYXJncyA9IF8ucmVzdCBhcmd1bWVudHMsIDIKICAoaWYgbWV0aG9kIHRoZW4gdmFsW21ldGhvZF0gZWxzZSB2YWwpLmFwcGx5KHZhbCwgYXJncykgZm9yIHZhbCBpbiBvYmoKCgojIENvbnZlbmllbmNlIHZlcnNpb24gb2YgYSBjb21tb24gdXNlIGNhc2Ugb2YgKiptYXAqKjogZmV0Y2hpbmcgYSBwcm9wZXJ0eS4KXy5wbHVjayA9IChvYmosIGtleSkgLT4KICBfLm1hcChvYmosICh2YWwpIC0+IHZhbFtrZXldKQoKCiMgUmV0dXJuIHRoZSBtYXhpbXVtIGl0ZW0gb3IgKGl0ZW0tYmFzZWQgY29tcHV0YXRpb24pLgpfLm1heCA9IChvYmosIGl0ZXJhdG9yLCBjb250ZXh0KSAtPgogIHJldHVybiBNYXRoLm1heC5hcHBseShNYXRoLCBvYmopIGlmIG5vdCBpdGVyYXRvciBhbmQgXy5pc0FycmF5KG9iaikKICByZXN1bHQgPSBjb21wdXRlZDogLUluZmluaXR5CiAgXy5lYWNoIG9iaiwgKHZhbHVlLCBpbmRleCwgbGlzdCkgLT4KICAgIGNvbXB1dGVkID0gaWYgaXRlcmF0b3IgdGhlbiBpdGVyYXRvci5jYWxsKGNvbnRleHQsIHZhbHVlLCBpbmRleCwgbGlzdCkgZWxzZSB2YWx1ZQogICAgY29tcHV0ZWQgPj0gcmVzdWx0LmNvbXB1dGVkIGFuZCAocmVzdWx0ID0ge3ZhbHVlOiB2YWx1ZSwgY29tcHV0ZWQ6IGNvbXB1dGVkfSkKICByZXN1bHQudmFsdWUKCgojIFJldHVybiB0aGUgbWluaW11bSBlbGVtZW50IChvciBlbGVtZW50LWJhc2VkIGNvbXB1dGF0aW9uKS4KXy5taW4gPSAob2JqLCBpdGVyYXRvciwgY29udGV4dCkgLT4KICByZXR1cm4gTWF0aC5taW4uYXBwbHkoTWF0aCwgb2JqKSBpZiBub3QgaXRlcmF0b3IgYW5kIF8uaXNBcnJheShvYmopCiAgcmVzdWx0ID0gY29tcHV0ZWQ6IEluZmluaXR5CiAgXy5lYWNoIG9iaiwgKHZhbHVlLCBpbmRleCwgbGlzdCkgLT4KICAgIGNvbXB1dGVkID0gaWYgaXRlcmF0b3IgdGhlbiBpdGVyYXRvci5jYWxsKGNvbnRleHQsIHZhbHVlLCBpbmRleCwgbGlzdCkgZWxzZSB2YWx1ZQogICAgY29tcHV0ZWQgPCByZXN1bHQuY29tcHV0ZWQgYW5kIChyZXN1bHQgPSB7dmFsdWU6IHZhbHVlLCBjb21wdXRlZDogY29tcHV0ZWR9KQogIHJlc3VsdC52YWx1ZQoKCiMgU29ydCB0aGUgb2JqZWN0J3MgdmFsdWVzIGJ5IGEgY3JpdGVyaW9uIHByb2R1Y2VkIGJ5IGFuIGl0ZXJhdG9yLgpfLnNvcnRCeSA9IChvYmosIGl0ZXJhdG9yLCBjb250ZXh0KSAtPgogIF8ucGx1Y2soKChfLm1hcCBvYmosICh2YWx1ZSwgaW5kZXgsIGxpc3QpIC0+CiAgICB7dmFsdWU6IHZhbHVlLCBjcml0ZXJpYTogaXRlcmF0b3IuY2FsbChjb250ZXh0LCB2YWx1ZSwgaW5kZXgsIGxpc3QpfQogICkuc29ydCgobGVmdCwgcmlnaHQpIC0+CiAgICBhID0gbGVmdC5jcml0ZXJpYTsgYiA9IHJpZ2h0LmNyaXRlcmlhCiAgICBpZiBhIDwgYiB0aGVuIC0xIGVsc2UgaWYgYSA+IGIgdGhlbiAxIGVsc2UgMAogICkpLCAndmFsdWUnKQoKCiMgVXNlIGEgY29tcGFyYXRvciBmdW5jdGlvbiB0byBmaWd1cmUgb3V0IGF0IHdoYXQgaW5kZXggYW4gb2JqZWN0IHNob3VsZAojIGJlIGluc2VydGVkIHNvIGFzIHRvIG1haW50YWluIG9yZGVyLiBVc2VzIGJpbmFyeSBzZWFyY2guCl8uc29ydGVkSW5kZXggPSAoYXJyYXksIG9iaiwgaXRlcmF0b3IpIC0+CiAgaXRlcmF0b3IgfHw9IF8uaWRlbnRpdHkKICBsb3cgPSAwCiAgaGlnaCA9IGFycmF5Lmxlbmd0aAogIHdoaWxlIGxvdyA8IGhpZ2gKICAgIG1pZCA9IChsb3cgKyBoaWdoKSA+PiAxCiAgICBpZiBpdGVyYXRvcihhcnJheVttaWRdKSA8IGl0ZXJhdG9yKG9iaikgdGhlbiBsb3cgPSBtaWQgKyAxIGVsc2UgaGlnaCA9IG1pZAogIGxvdwoKCiMgQ29udmVydCBhbnl0aGluZyBpdGVyYWJsZSBpbnRvIGEgcmVhbCwgbGl2ZSBhcnJheS4KXy50b0FycmF5ID0gKGl0ZXJhYmxlKSAtPgogIHJldHVybiBbXSBpZiAoIWl0ZXJhYmxlKQogIHJldHVybiBpdGVyYWJsZS50b0FycmF5KCkgaWYgKGl0ZXJhYmxlLnRvQXJyYXkpCiAgcmV0dXJuIGl0ZXJhYmxlIGlmIChfLmlzQXJyYXkoaXRlcmFibGUpKQogIHJldHVybiBzbGljZS5jYWxsKGl0ZXJhYmxlKSBpZiAoXy5pc0FyZ3VtZW50cyhpdGVyYWJsZSkpCiAgXy52YWx1ZXMoaXRlcmFibGUpCgoKIyBSZXR1cm4gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBhbiBvYmplY3QuCl8uc2l6ZSA9IChvYmopIC0+IF8udG9BcnJheShvYmopLmxlbmd0aAoKCiMgQXJyYXkgRnVuY3Rpb25zCiMgLS0tLS0tLS0tLS0tLS0tCgojIEdldCB0aGUgZmlyc3QgZWxlbWVudCBvZiBhbiBhcnJheS4gUGFzc2luZyBgbmAgd2lsbCByZXR1cm4gdGhlIGZpcnN0IE4KIyB2YWx1ZXMgaW4gdGhlIGFycmF5LiBBbGlhc2VkIGFzICoqaGVhZCoqLiBUaGUgYGd1YXJkYCBjaGVjayBhbGxvd3MgaXQgdG8gd29yawojIHdpdGggKiptYXAqKi4KXy5maXJzdCA9IChhcnJheSwgbiwgZ3VhcmQpIC0+CiAgaWYgbiBhbmQgbm90IGd1YXJkIHRoZW4gc2xpY2UuY2FsbChhcnJheSwgMCwgbikgZWxzZSBhcnJheVswXQoKCiMgUmV0dXJucyBldmVyeXRoaW5nIGJ1dCB0aGUgZmlyc3QgZW50cnkgb2YgdGhlIGFycmF5LiBBbGlhc2VkIGFzICoqdGFpbCoqLgojIEVzcGVjaWFsbHkgdXNlZnVsIG9uIHRoZSBhcmd1bWVudHMgb2JqZWN0LiBQYXNzaW5nIGFuIGBpbmRleGAgd2lsbCByZXR1cm4KIyB0aGUgcmVzdCBvZiB0aGUgdmFsdWVzIGluIHRoZSBhcnJheSBmcm9tIHRoYXQgaW5kZXggb253YXJkLiBUaGUgYGd1YXJkYAojIGNoZWNrIGFsbG93cyBpdCB0byB3b3JrIHdpdGggKiptYXAqKi4KXy5yZXN0ID0gKGFycmF5LCBpbmRleCwgZ3VhcmQpIC0+CiAgc2xpY2UuY2FsbChhcnJheSwgaWYgXy5pc1VuZGVmaW5lZChpbmRleCkgb3IgZ3VhcmQgdGhlbiAxIGVsc2UgaW5kZXgpCgoKIyBHZXQgdGhlIGxhc3QgZWxlbWVudCBvZiBhbiBhcnJheS4KXy5sYXN0ID0gKGFycmF5KSAtPiBhcnJheVthcnJheS5sZW5ndGggLSAxXQoKCiMgVHJpbSBvdXQgYWxsIGZhbHN5IHZhbHVlcyBmcm9tIGFuIGFycmF5LgpfLmNvbXBhY3QgPSAoYXJyYXkpIC0+IGl0ZW0gZm9yIGl0ZW0gaW4gYXJyYXkgd2hlbiBpdGVtCgoKIyBSZXR1cm4gYSBjb21wbGV0ZWx5IGZsYXR0ZW5lZCB2ZXJzaW9uIG9mIGFuIGFycmF5LgpfLmZsYXR0ZW4gPSAoYXJyYXkpIC0+CiAgXy5yZWR1Y2UgYXJyYXksIChtZW1vLCB2YWx1ZSkgLT4KICAgIHJldHVybiBtZW1vLmNvbmNhdChfLmZsYXR0ZW4odmFsdWUpKSBpZiBfLmlzQXJyYXkgdmFsdWUKICAgIG1lbW8ucHVzaCB2YWx1ZQogICAgbWVtbwogICwgW10KCgojIFJldHVybiBhIHZlcnNpb24gb2YgdGhlIGFycmF5IHRoYXQgZG9lcyBub3QgY29udGFpbiB0aGUgc3BlY2lmaWVkIHZhbHVlKHMpLgpfLndpdGhvdXQgPSAoYXJyYXkpIC0+CiAgdmFsdWVzID0gXy5yZXN0IGFyZ3VtZW50cwogIHZhbCBmb3IgdmFsIGluIF8udG9BcnJheShhcnJheSkgd2hlbiBub3QgXy5pbmNsdWRlIHZhbHVlcywgdmFsCgoKIyBQcm9kdWNlIGEgZHVwbGljYXRlLWZyZWUgdmVyc2lvbiBvZiB0aGUgYXJyYXkuIElmIHRoZSBhcnJheSBoYXMgYWxyZWFkeQojIGJlZW4gc29ydGVkLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIHVzaW5nIGEgZmFzdGVyIGFsZ29yaXRobS4KXy51bmlxID0gKGFycmF5LCBpc1NvcnRlZCkgLT4KICBtZW1vID0gW10KICBmb3IgZWwsIGkgaW4gXy50b0FycmF5IGFycmF5CiAgICBtZW1vLnB1c2ggZWwgaWYgaSBpcyAwIHx8IChpZiBpc1NvcnRlZCBpcyB0cnVlIHRoZW4gXy5sYXN0KG1lbW8pIGlzbnQgZWwgZWxzZSBub3QgXy5pbmNsdWRlKG1lbW8sIGVsKSkKICBtZW1vCgoKIyBQcm9kdWNlIGFuIGFycmF5IHRoYXQgY29udGFpbnMgZXZlcnkgaXRlbSBzaGFyZWQgYmV0d2VlbiBhbGwgdGhlCiMgcGFzc2VkLWluIGFycmF5cy4KXy5pbnRlcnNlY3QgPSAoYXJyYXkpIC0+CiAgcmVzdCA9IF8ucmVzdCBhcmd1bWVudHMKICBfLnNlbGVjdCBfLnVuaXEoYXJyYXkpLCAoaXRlbSkgLT4KICAgIF8uYWxsIHJlc3QsIChvdGhlcikgLT4KICAgICAgXy5pbmRleE9mKG90aGVyLCBpdGVtKSA+PSAwCgoKIyBaaXAgdG9nZXRoZXIgbXVsdGlwbGUgbGlzdHMgaW50byBhIHNpbmdsZSBhcnJheSAtLSBlbGVtZW50cyB0aGF0IHNoYXJlCiMgYW4gaW5kZXggZ28gdG9nZXRoZXIuCl8uemlwID0gLT4KICBsZW5ndGggPSBfLm1heCBfLnBsdWNrIGFyZ3VtZW50cywgJ2xlbmd0aCcKICByZXN1bHRzID0gbmV3IEFycmF5IGxlbmd0aAogIGZvciBpIGluIFswLi4ubGVuZ3RoXQogICAgcmVzdWx0c1tpXSA9IF8ucGx1Y2sgYXJndW1lbnRzLCBTdHJpbmcgaQogIHJlc3VsdHMKCgojIElmIHRoZSBicm93c2VyIGRvZXNuJ3Qgc3VwcGx5IHVzIHdpdGggKippbmRleE9mKiogKEknbSBsb29raW5nIGF0IHlvdSwgTVNJRSksCiMgd2UgbmVlZCB0aGlzIGZ1bmN0aW9uLiBSZXR1cm4gdGhlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIGFuCiMgaXRlbSBpbiBhbiBhcnJheSwgb3IgLTEgaWYgdGhlIGl0ZW0gaXMgbm90IGluY2x1ZGVkIGluIHRoZSBhcnJheS4KXy5pbmRleE9mID0gKGFycmF5LCBpdGVtKSAtPgogIHJldHVybiBhcnJheS5pbmRleE9mIGl0ZW0gaWYgbmF0aXZlSW5kZXhPZiBhbmQgYXJyYXkuaW5kZXhPZiBpcyBuYXRpdmVJbmRleE9mCiAgaSA9IDA7IGwgPSBhcnJheS5sZW5ndGgKICB3aGlsZSBsIC0gaQogICAgaWYgYXJyYXlbaV0gaXMgaXRlbSB0aGVuIHJldHVybiBpIGVsc2UgaSsrCiAgLTEKCgojIFByb3ZpZGUgSmF2YVNjcmlwdCAxLjYncyAqKmxhc3RJbmRleE9mKiosIGRlbGVnYXRpbmcgdG8gdGhlIG5hdGl2ZSBmdW5jdGlvbiwKIyBpZiBwb3NzaWJsZS4KXy5sYXN0SW5kZXhPZiA9IChhcnJheSwgaXRlbSkgLT4KICByZXR1cm4gYXJyYXkubGFzdEluZGV4T2YoaXRlbSkgaWYgbmF0aXZlTGFzdEluZGV4T2YgYW5kIGFycmF5Lmxhc3RJbmRleE9mIGlzIG5hdGl2ZUxhc3RJbmRleE9mCiAgaSA9IGFycmF5Lmxlbmd0aAogIHdoaWxlIGkKICAgIGlmIGFycmF5W2ldIGlzIGl0ZW0gdGhlbiByZXR1cm4gaSBlbHNlIGktLQogIC0xCgoKIyBHZW5lcmF0ZSBhbiBpbnRlZ2VyIEFycmF5IGNvbnRhaW5pbmcgYW4gYXJpdGhtZXRpYyBwcm9ncmVzc2lvbi4gQSBwb3J0IG9mCiMgW3RoZSBuYXRpdmUgUHl0aG9uICoqcmFuZ2UqKiBmdW5jdGlvbl0oaHR0cDovL2RvY3MucHl0aG9uLm9yZy9saWJyYXJ5L2Z1bmN0aW9ucy5odG1sI3JhbmdlKS4KXy5yYW5nZSA9IChzdGFydCwgc3RvcCwgc3RlcCkgLT4KICBhID0gYXJndW1lbnRzCiAgc29sbyA9IGEubGVuZ3RoIDw9IDEKICBpID0gc3RhcnQgPSBpZiBzb2xvIHRoZW4gMCBlbHNlIGFbMF0KICBzdG9wID0gaWYgc29sbyB0aGVuIGFbMF0gZWxzZSBhWzFdCiAgc3RlcCA9IGFbMl0gb3IgMQogIGxlbiA9IE1hdGguY2VpbCgoc3RvcCAtIHN0YXJ0KSAvIHN0ZXApCiAgcmV0dXJuIFtdIGlmIGxlbiA8PSAwCiAgcmFuZ2UgPSBuZXcgQXJyYXkgbGVuCiAgaWR4ID0gMAogIGxvb3AKICAgIHJldHVybiByYW5nZSBpZiAoaWYgc3RlcCA+IDAgdGhlbiBpIC0gc3RvcCBlbHNlIHN0b3AgLSBpKSA+PSAwCiAgICByYW5nZVtpZHhdID0gaQogICAgaWR4KysKICAgIGkrPSBzdGVwCgoKIyBGdW5jdGlvbiBGdW5jdGlvbnMKIyAtLS0tLS0tLS0tLS0tLS0tLS0KCiMgQ3JlYXRlIGEgZnVuY3Rpb24gYm91bmQgdG8gYSBnaXZlbiBvYmplY3QgKGFzc2lnbmluZyBgdGhpc2AsIGFuZCBhcmd1bWVudHMsCiMgb3B0aW9uYWxseSkuIEJpbmRpbmcgd2l0aCBhcmd1bWVudHMgaXMgYWxzbyBrbm93biBhcyAqKmN1cnJ5KiouCl8uYmluZCA9IChmdW5jLCBvYmopIC0+CiAgYXJncyA9IF8ucmVzdCBhcmd1bWVudHMsIDIKICAtPiBmdW5jLmFwcGx5IG9iaiBvciByb290LCBhcmdzLmNvbmNhdCBhcmd1bWVudHMKCgojIEJpbmQgYWxsIG9mIGFuIG9iamVjdCdzIG1ldGhvZHMgdG8gdGhhdCBvYmplY3QuIFVzZWZ1bCBmb3IgZW5zdXJpbmcgdGhhdAojIGFsbCBjYWxsYmFja3MgZGVmaW5lZCBvbiBhbiBvYmplY3QgYmVsb25nIHRvIGl0LgpfLmJpbmRBbGwgPSAob2JqKSAtPgogIGZ1bmNzID0gaWYgYXJndW1lbnRzLmxlbmd0aCA+IDEgdGhlbiBfLnJlc3QoYXJndW1lbnRzKSBlbHNlIF8uZnVuY3Rpb25zKG9iaikKICBfLmVhY2ggZnVuY3MsIChmKSAtPiBvYmpbZl0gPSBfLmJpbmQgb2JqW2ZdLCBvYmoKICBvYmoKCgojIERlbGF5cyBhIGZ1bmN0aW9uIGZvciB0aGUgZ2l2ZW4gbnVtYmVyIG9mIG1pbGxpc2Vjb25kcywgYW5kIHRoZW4gY2FsbHMKIyBpdCB3aXRoIHRoZSBhcmd1bWVudHMgc3VwcGxpZWQuCl8uZGVsYXkgPSAoZnVuYywgd2FpdCkgLT4KICBhcmdzID0gXy5yZXN0IGFyZ3VtZW50cywgMgogIHNldFRpbWVvdXQoKC0+IGZ1bmMuYXBwbHkoZnVuYywgYXJncykpLCB3YWl0KQoKCiMgTWVtb2l6ZSBhbiBleHBlbnNpdmUgZnVuY3Rpb24gYnkgc3RvcmluZyBpdHMgcmVzdWx0cy4KXy5tZW1vaXplID0gKGZ1bmMsIGhhc2hlcikgLT4KICBtZW1vID0ge30KICBoYXNoZXIgb3I9IF8uaWRlbnRpdHkKICAtPgogICAga2V5ID0gaGFzaGVyLmFwcGx5IHRoaXMsIGFyZ3VtZW50cwogICAgcmV0dXJuIG1lbW9ba2V5XSBpZiBrZXkgb2YgbWVtbwogICAgbWVtb1trZXldID0gZnVuYy5hcHBseSB0aGlzLCBhcmd1bWVudHMKCgojIERlZmVycyBhIGZ1bmN0aW9uLCBzY2hlZHVsaW5nIGl0IHRvIHJ1biBhZnRlciB0aGUgY3VycmVudCBjYWxsIHN0YWNrIGhhcwojIGNsZWFyZWQuCl8uZGVmZXIgPSAoZnVuYykgLT4KICBfLmRlbGF5LmFwcGx5IF8sIFtmdW5jLCAxXS5jb25jYXQgXy5yZXN0IGFyZ3VtZW50cwoKCiMgUmV0dXJucyB0aGUgZmlyc3QgZnVuY3Rpb24gcGFzc2VkIGFzIGFuIGFyZ3VtZW50IHRvIHRoZSBzZWNvbmQsCiMgYWxsb3dpbmcgeW91IHRvIGFkanVzdCBhcmd1bWVudHMsIHJ1biBjb2RlIGJlZm9yZSBhbmQgYWZ0ZXIsIGFuZAojIGNvbmRpdGlvbmFsbHkgZXhlY3V0ZSB0aGUgb3JpZ2luYWwgZnVuY3Rpb24uCl8ud3JhcCA9IChmdW5jLCB3cmFwcGVyKSAtPgogIC0+IHdyYXBwZXIuYXBwbHkgd3JhcHBlciwgW2Z1bmNdLmNvbmNhdCBhcmd1bWVudHMKCgojIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGlzIHRoZSBjb21wb3NpdGlvbiBvZiBhIGxpc3Qgb2YgZnVuY3Rpb25zLCBlYWNoCiMgY29uc3VtaW5nIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGZ1bmN0aW9uIHRoYXQgZm9sbG93cy4KXy5jb21wb3NlID0gLT4KICBmdW5jcyA9IGFyZ3VtZW50cwogIC0+CiAgICBhcmdzID0gYXJndW1lbnRzCiAgICBmb3IgaSBpbiBbZnVuY3MubGVuZ3RoIC0gMS4uMF0gYnkgLTEKICAgICAgYXJncyA9IFtmdW5jc1tpXS5hcHBseSh0aGlzLCBhcmdzKV0KICAgIGFyZ3NbMF0KCgojIE9iamVjdCBGdW5jdGlvbnMKIyAtLS0tLS0tLS0tLS0tLS0tCgojIFJldHJpZXZlIHRoZSBuYW1lcyBvZiBhbiBvYmplY3QncyBwcm9wZXJ0aWVzLgpfLmtleXMgPSBuYXRpdmVLZXlzIG9yIChvYmopIC0+CiAgcmV0dXJuIF8ucmFuZ2UgMCwgb2JqLmxlbmd0aCBpZiBfLmlzQXJyYXkob2JqKQogIGtleSBmb3Iga2V5LCB2YWwgb2Ygb2JqCgoKIyBSZXRyaWV2ZSB0aGUgdmFsdWVzIG9mIGFuIG9iamVjdCdzIHByb3BlcnRpZXMuCl8udmFsdWVzID0gKG9iaikgLT4KICBfLm1hcCBvYmosIF8uaWRlbnRpdHkKCgojIFJldHVybiBhIHNvcnRlZCBsaXN0IG9mIHRoZSBmdW5jdGlvbiBuYW1lcyBhdmFpbGFibGUgaW4gVW5kZXJzY29yZS4KXy5mdW5jdGlvbnMgPSAob2JqKSAtPgogIF8uZmlsdGVyKF8ua2V5cyhvYmopLCAoa2V5KSAtPiBfLmlzRnVuY3Rpb24ob2JqW2tleV0pKS5zb3J0KCkKCgojIEV4dGVuZCBhIGdpdmVuIG9iamVjdCB3aXRoIGFsbCBvZiB0aGUgcHJvcGVydGllcyBpbiBhIHNvdXJjZSBvYmplY3QuCl8uZXh0ZW5kID0gKG9iaikgLT4KICBmb3Igc291cmNlIGluIF8ucmVzdChhcmd1bWVudHMpCiAgICBvYmpba2V5XSA9IHZhbCBmb3Iga2V5LCB2YWwgb2Ygc291cmNlCiAgb2JqCgoKIyBDcmVhdGUgYSAoc2hhbGxvdy1jbG9uZWQpIGR1cGxpY2F0ZSBvZiBhbiBvYmplY3QuCl8uY2xvbmUgPSAob2JqKSAtPgogIHJldHVybiBvYmouc2xpY2UgMCBpZiBfLmlzQXJyYXkgb2JqCiAgXy5leHRlbmQge30sIG9iagoKCiMgSW52b2tlcyBpbnRlcmNlcHRvciB3aXRoIHRoZSBvYmosIGFuZCB0aGVuIHJldHVybnMgb2JqLgojIFRoZSBwcmltYXJ5IHB1cnBvc2Ugb2YgdGhpcyBtZXRob2QgaXMgdG8gInRhcCBpbnRvIiBhIG1ldGhvZCBjaGFpbiwKIyBpbiBvcmRlciB0byBwZXJmb3JtIG9wZXJhdGlvbnMgb24gaW50ZXJtZWRpYXRlIHJlc3VsdHMgd2l0aGluCiB0aGUgY2hhaW4uCl8udGFwID0gKG9iaiwgaW50ZXJjZXB0b3IpIC0+CiAgaW50ZXJjZXB0b3Igb2JqCiAgb2JqCgoKIyBQZXJmb3JtIGEgZGVlcCBjb21wYXJpc29uIHRvIGNoZWNrIGlmIHR3byBvYmplY3RzIGFyZSBlcXVhbC4KXy5pc0VxdWFsID0gKGEsIGIpIC0+CiAgIyBDaGVjayBvYmplY3QgaWRlbnRpdHkuCiAgcmV0dXJuIHRydWUgaWYgYSBpcyBiCiAgIyBEaWZmZXJlbnQgdHlwZXM/CiAgYXR5cGUgPSB0eXBlb2YoYSk7IGJ0eXBlID0gdHlwZW9mKGIpCiAgcmV0dXJuIGZhbHNlIGlmIGF0eXBlIGlzbnQgYnR5cGUKICAjIEJhc2ljIGVxdWFsaXR5IHRlc3QgKHdhdGNoIG91dCBmb3IgY29lcmNpb25zKS4KICByZXR1cm4gdHJ1ZSBpZiBgYSA9PSBiYAogICMgT25lIGlzIGZhbHN5IGFuZCB0aGUgb3RoZXIgdHJ1dGh5LgogIHJldHVybiBmYWxzZSBpZiAoIWEgYW5kIGIpIG9yIChhIGFuZCAhYikKICAjIE9uZSBvZiB0aGVtIGltcGxlbWVudHMgYW4gYGlzRXF1YWwoKWA/CiAgcmV0dXJuIGEuaXNFcXVhbChiKSBpZiBhLmlzRXF1YWwKICAjIENoZWNrIGRhdGVzJyBpbnRlZ2VyIHZhbHVlcy4KICByZXR1cm4gYS5nZXRUaW1lKCkgaXMgYi5nZXRUaW1lKCkgaWYgXy5pc0RhdGUoYSkgYW5kIF8uaXNEYXRlKGIpCiAgIyBCb3RoIGFyZSBOYU4/CiAgcmV0dXJuIGZhbHNlIGlmIF8uaXNOYU4oYSkgYW5kIF8uaXNOYU4oYikKICAjIENvbXBhcmUgcmVndWxhciBleHByZXNzaW9ucy4KICBpZiBfLmlzUmVnRXhwKGEpIGFuZCBfLmlzUmVnRXhwKGIpCiAgICByZXR1cm4gYS5zb3VyY2UgaXMgYi5zb3VyY2UgYW5kCiAgICAgICAgICAgYS5nbG9iYWwgaXMgYi5nbG9iYWwgYW5kCiAgICAgICAgICAgYS5pZ25vcmVDYXNlIGlzIGIuaWdub3JlQ2FzZSBhbmQKICAgICAgICAgICBhLm11bHRpbGluZSBpcyBiLm11bHRpbGluZQogICMgSWYgYSBpcyBub3QgYW4gb2JqZWN0IGJ5IHRoaXMgcG9pbnQsIHdlIGNhbid0IGhhbmRsZSBpdC4KICByZXR1cm4gZmFsc2UgaWYgYXR5cGUgaXNudCAnb2JqZWN0JwogICMgQ2hlY2sgZm9yIGRpZmZlcmVudCBhcnJheSBsZW5ndGhzIGJlZm9yZSBjb21wYXJpbmcgY29udGVudHMuCiAgcmV0dXJuIGZhbHNlIGlmIGEubGVuZ3RoIGFuZCAoYS5sZW5ndGggaXNudCBiLmxlbmd0aCkKICAjIE5vdGhpbmcgZWxzZSB3b3JrZWQsIGRlZXAgY29tcGFyZSB0aGUgY29udGVudHMuCiAgYUtleXMgPSBfLmtleXMoYSk7IGJLZXlzID0gXy5rZXlzKGIpCiAgIyBEaWZmZXJlbnQgb2JqZWN0IHNpemVzPwogIHJldHVybiBmYWxzZSBpZiBhS2V5cy5sZW5ndGggaXNudCBiS2V5cy5sZW5ndGgKICAjIFJlY3Vyc2l2ZSBjb21wYXJpc29uIG9mIGNvbnRlbnRzLgogIHJldHVybiBmYWxzZSBmb3Iga2V5LCB2YWwgb2YgYSB3aGVuICEoa2V5IG9mIGIpIG9yICFfLmlzRXF1YWwodmFsLCBiW2tleV0pCiAgdHJ1ZQoKCiMgSXMgYSBnaXZlbiBhcnJheSBvciBvYmplY3QgZW1wdHk/Cl8uaXNFbXB0eSA9IChvYmopIC0+CiAgcmV0dXJuIG9iai5sZW5ndGggaXMgMCBpZiBfLmlzQXJyYXkob2JqKSBvciBfLmlzU3RyaW5nKG9iaikKICByZXR1cm4gZmFsc2UgZm9yIG93biBrZXkgb2Ygb2JqCiAgdHJ1ZQoKCiMgSXMgYSBnaXZlbiB2YWx1ZSBhIERPTSBlbGVtZW50PwpfLmlzRWxlbWVudCA9IChvYmopIC0+IG9iaiBhbmQgb2JqLm5vZGVUeXBlIGlzIDEKCgojIElzIGEgZ2l2ZW4gdmFsdWUgYW4gYXJyYXk/Cl8uaXNBcnJheSA9IG5hdGl2ZUlzQXJyYXkgb3IgKG9iaikgLT4gISEob2JqIGFuZCBvYmouY29uY2F0IGFuZCBvYmoudW5zaGlmdCBhbmQgbm90IG9iai5jYWxsZWUpCgoKIyBJcyBhIGdpdmVuIHZhcmlhYmxlIGFuIGFyZ3VtZW50cyBvYmplY3Q/Cl8uaXNBcmd1bWVudHMgPSAob2JqKSAtPiBvYmogYW5kIG9iai5jYWxsZWUKCgojIElzIHRoZSBnaXZlbiB2YWx1ZSBhIGZ1bmN0aW9uPwpfLmlzRnVuY3Rpb24gPSAob2JqKSAtPiAhIShvYmogYW5kIG9iai5jb25zdHJ1Y3RvciBhbmQgb2JqLmNhbGwgYW5kIG9iai5hcHBseSkKCgojIElzIHRoZSBnaXZlbiB2YWx1ZSBhIHN0cmluZz8KXy5pc1N0cmluZyA9IChvYmopIC0+ICEhKG9iaiBpcyAnJyBvciAob2JqIGFuZCBvYmouY2hhckNvZGVBdCBhbmQgb2JqLnN1YnN0cikpCgoKIyBJcyBhIGdpdmVuIHZhbHVlIGEgbnVtYmVyPwpfLmlzTnVtYmVyID0gKG9iaikgLT4gKG9iaiBpcyArb2JqKSBvciB0b1N0cmluZy5jYWxsKG9iaikgaXMgJ1tvYmplY3QgTnVtYmVyXScKCgojIElzIGEgZ2l2ZW4gdmFsdWUgYSBib29sZWFuPwpfLmlzQm9vbGVhbiA9IChvYmopIC0+IG9iaiBpcyB0cnVlIG9yIG9iaiBpcyBmYWxzZQoKCiMgSXMgYSBnaXZlbiB2YWx1ZSBhIERhdGU/Cl8uaXNEYXRlID0gKG9iaikgLT4gISEob2JqIGFuZCBvYmouZ2V0VGltZXpvbmVPZmZzZXQgYW5kIG9iai5zZXRVVENGdWxsWWVhcikKCgojIElzIHRoZSBnaXZlbiB2YWx1ZSBhIHJlZ3VsYXIgZXhwcmVzc2lvbj8KXy5pc1JlZ0V4cCA9IChvYmopIC0+ICEhKG9iaiBhbmQgb2JqLmV4ZWMgYW5kIChvYmouaWdub3JlQ2FzZSBvciBvYmouaWdub3JlQ2FzZSBpcyBmYWxzZSkpCgoKIyBJcyB0aGUgZ2l2ZW4gdmFsdWUgTmFOIC0tIHRoaXMgb25lIGlzIGludGVyZXN0aW5nLiBgTmFOICE9IE5hTmAsIGFuZAojIGBpc05hTih1bmRlZmluZWQpID09IHRydWVgLCBzbyB3ZSBtYWtlIHN1cmUgaXQncyBhIG51bWJlciBmaXJzdC4KXy5pc05hTiA9IChvYmopIC0+IF8uaXNOdW1iZXIob2JqKSBhbmQgd2luZG93LmlzTmFOKG9iaikKCgojIElzIGEgZ2l2ZW4gdmFsdWUgZXF1YWwgdG8gbnVsbD8KXy5pc051bGwgPSAob2JqKSAtPiBvYmogaXMgbnVsbAoKCiMgSXMgYSBnaXZlbiB2YXJpYWJsZSB1bmRlZmluZWQ/Cl8uaXNVbmRlZmluZWQgPSAob2JqKSAtPiB0eXBlb2Ygb2JqIGlzICd1bmRlZmluZWQnCgoKIyBVdGlsaXR5IEZ1bmN0aW9ucwojIC0tLS0tLS0tLS0tLS0tLS0tCgojIFJ1biBVbmRlcnNjb3JlLmpzIGluIG5vQ29uZmxpY3QgbW9kZSwgcmV0dXJuaW5nIHRoZSBgX2AgdmFyaWFibGUgdG8gaXRzCiMgcHJldmlvdXMgb3duZXIuIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIFVuZGVyc2NvcmUgb2JqZWN0LgpfLm5vQ29uZmxpY3QgPSAtPgogIHJvb3QuXyA9IHByZXZpb3VzVW5kZXJzY29yZQogIHRoaXMKCgojIEtlZXAgdGhlIGlkZW50aXR5IGZ1bmN0aW9uIGFyb3VuZCBmb3IgZGVmYXVsdCBpdGVyYXRvcnMuCl8uaWRlbnRpdHkgPSAodmFsdWUpIC0+IHZhbHVlCgoKIyBSdW4gYSBmdW5jdGlvbiBgbmAgdGltZXMuCl8udGltZXMgPSAobiwgaXRlcmF0b3IsIGNvbnRleHQpIC0+CiAgaXRlcmF0b3IuY2FsbCBjb250ZXh0LCBpIGZvciBpIGluIFswLi4ubl0KCgojIEJyZWFrIG91dCBvZiB0aGUgbWlkZGxlIG9mIGFuIGl0ZXJhdGlvbi4KXy5icmVha0xvb3AgPSAtPiB0aHJvdyBicmVha2VyCgoKIyBBZGQgeW91ciBvd24gY3VzdG9tIGZ1bmN0aW9ucyB0byB0aGUgVW5kZXJzY29yZSBvYmplY3QsIGVuc3VyaW5nIHRoYXQKIyB0aGV5J3JlIGNvcnJlY3RseSBhZGRlZCB0byB0aGUgT09QIHdyYXBwZXIgYXMgd2VsbC4KXy5taXhpbiA9IChvYmopIC0+CiAgZm9yIG5hbWUgaW4gXy5mdW5jdGlvbnMob2JqKQogICAgYWRkVG9XcmFwcGVyIG5hbWUsIF9bbmFtZV0gPSBvYmpbbmFtZV0KCgojIEdlbmVyYXRlIGEgdW5pcXVlIGludGVnZXIgaWQgKHVuaXF1ZSB3aXRoaW4gdGhlIGVudGlyZSBjbGllbnQgc2Vzc2lvbikuCiMgVXNlZnVsIGZvciB0ZW1wb3JhcnkgRE9NIGlkcy4KaWRDb3VudGVyID0gMApfLnVuaXF1ZUlkID0gKHByZWZpeCkgLT4KICAocHJlZml4IG9yICcnKSArIGlkQ291bnRlcisrCgoKIyBCeSBkZWZhdWx0LCBVbmRlcnNjb3JlIHVzZXMgKipFUkIqKi1zdHlsZSB0ZW1wbGF0ZSBkZWxpbWl0ZXJzLCBjaGFuZ2UgdGhlCiMgZm9sbG93aW5nIHRlbXBsYXRlIHNldHRpbmdzIHRvIHVzZSBhbHRlcm5hdGl2ZSBkZWxpbWl0ZXJzLgpfLnRlbXBsYXRlU2V0dGluZ3MgPSB7CiAgc3RhcnQ6ICc8JScKICBlbmQ6ICclPicKICBpbnRlcnBvbGF0ZTogLzwlPSguKz8pJT4vZwp9CgoKIyBKYXZhU2NyaXB0IHRlbXBsYXRpbmcgYS1sYSAqKkVSQioqLCBwaWxmZXJlZCBmcm9tIEpvaG4gUmVzaWcncwojICpTZWNyZXRzIG9mIHRoZSBKYXZhU2NyaXB0IE5pbmphKiwgcGFnZSA4My4KIyBTaW5nbGUtcXVvdGUgZml4IGZyb20gUmljayBTdHJhaGwuCiMgV2l0aCBhbHRlcmF0aW9ucyBmb3IgYXJiaXRyYXJ5IGRlbGltaXRlcnMsIGFuZCB0byBwcmVzZXJ2ZSB3aGl0ZXNwYWNlLgpfLnRlbXBsYXRlID0gKHN0ciwgZGF0YSkgLT4KICBjID0gXy50ZW1wbGF0ZVNldHRpbmdzCiAgZW5kTWF0Y2ggPSBuZXcgUmVnRXhwKCInKD89W14iK2MuZW5kLnN1YnN0cigwLCAxKSsiXSoiK2VzY2FwZVJlZ0V4cChjLmVuZCkrIikiLCJnIikKICBmbiA9IG5ldyBGdW5jdGlvbiAnb2JqJywKICAgICd2YXIgcD1bXSxwcmludD1mdW5jdGlvbigpe3AucHVzaC5hcHBseShwLGFyZ3VtZW50cyk7fTsnICsKICAgICd3aXRoKG9ianx8e30pe3AucHVzaChcJycgKwogICAgc3RyLnJlcGxhY2UoL1xyL2csICdcXHInKQogICAgICAgLnJlcGxhY2UoL1xuL2csICdcXG4nKQogICAgICAgLnJlcGxhY2UoL1x0L2csICdcXHQnKQogICAgICAgLnJlcGxhY2UoZW5kTWF0Y2gsIu+/ve+/ve+/vSIpCiAgICAgICAuc3BsaXQoIiciKS5qb2luKCJcXCciKQogICAgICAgLnNwbGl0KCLvv73vv73vv70iKS5qb2luKCInIikKICAgICAgIC5yZXBsYWNlKGMuaW50ZXJwb2xhdGUsICInLCQxLCciKQogICAgICAgLnNwbGl0KGMuc3RhcnQpLmpvaW4oIicpOyIpCiAgICAgICAuc3BsaXQoYy5lbmQpLmpvaW4oInAucHVzaCgnIikgKwogICAgICAgIicpO31yZXR1cm4gcC5qb2luKCcnKTsiCiAgaWYgZGF0YSB0aGVuIGZuKGRhdGEpIGVsc2UgZm4KCgojIEFsaWFzZXMKIyAtLS0tLS0tCgpfLmZvckVhY2ggPSBfLmVhY2gKXy5mb2xkbCA9IF8uaW5qZWN0ID0gXy5yZWR1Y2UKXy5mb2xkciA9IF8ucmVkdWNlUmlnaHQKXy5zZWxlY3QgPSBfLmZpbHRlcgpfLmFsbCA9IF8uZXZlcnkKXy5hbnkgPSBfLnNvbWUKXy5jb250YWlucyA9IF8uaW5jbHVkZQpfLmhlYWQgPSBfLmZpcnN0Cl8udGFpbCA9IF8ucmVzdApfLm1ldGhvZHMgPSBfLmZ1bmN0aW9ucwoKCiMgU2V0dXAgdGhlIE9PUCBXcmFwcGVyCiMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIElmIFVuZGVyc2NvcmUgaXMgY2FsbGVkIGFzIGEgZnVuY3Rpb24sIGl0IHJldHVybnMgYSB3cmFwcGVkIG9iamVjdCB0aGF0CiMgY2FuIGJlIHVzZWQgT08tc3R5bGUuIFRoaXMgd3JhcHBlciBob2xkcyBhbHRlcmVkIHZlcnNpb25zIG9mIGFsbCB0aGUKIyB1bmRlcnNjb3JlIGZ1bmN0aW9ucy4gV3JhcHBlZCBvYmplY3RzIG1heSBiZSBjaGFpbmVkLgp3cmFwcGVyID0gKG9iaikgLT4KICB0aGlzLl93cmFwcGVkID0gb2JqCiAgdGhpcwoKCiMgSGVscGVyIGZ1bmN0aW9uIHRvIGNvbnRpbnVlIGNoYWluaW5nIGludGVybWVkaWF0ZSByZXN1bHRzLgpyZXN1bHQgPSAob2JqLCBjaGFpbikgLT4KICBpZiBjaGFpbiB0aGVuIF8ob2JqKS5jaGFpbigpIGVsc2Ugb2JqCgoKIyBBIG1ldGhvZCB0byBlYXNpbHkgYWRkIGZ1bmN0aW9ucyB0byB0aGUgT09QIHdyYXBwZXIuCmFkZFRvV3JhcHBlciA9IChuYW1lLCBmdW5jKSAtPgogIHdyYXBwZXIucHJvdG90eXBlW25hbWVdID0gLT4KICAgIGFyZ3MgPSBfLnRvQXJyYXkgYXJndW1lbnRzCiAgICB1bnNoaWZ0LmNhbGwgYXJncywgdGhpcy5fd3JhcHBlZAogICAgcmVzdWx0IGZ1bmMuYXBwbHkoXywgYXJncyksIHRoaXMuX2NoYWluCgoKIyBBZGQgYWxsIG9mdGhlIFVuZGVyc2NvcmUgZnVuY3Rpb25zIHRvIHRoZSB3cmFwcGVyIG9iamVjdC4KXy5taXhpbiBfCgoKIyBBZGQgYWxsIG11dGF0b3IgQXJyYXkgZnVuY3Rpb25zIHRvIHRoZSB3cmFwcGVyLgpfLmVhY2ggWydwb3AnLCAncHVzaCcsICdyZXZlcnNlJywgJ3NoaWZ0JywgJ3NvcnQnLCAnc3BsaWNlJywgJ3Vuc2hpZnQnXSwgKG5hbWUpIC0+CiAgbWV0aG9kID0gQXJyYXkucHJvdG90eXBlW25hbWVdCiAgd3JhcHBlci5wcm90b3R5cGVbbmFtZV0gPSAtPgogICAgbWV0aG9kLmFwcGx5KHRoaXMuX3dyYXBwZWQsIGFyZ3VtZW50cykKICAgIHJlc3VsdCh0aGlzLl93cmFwcGVkLCB0aGlzLl9jaGFpbikKCgojIEFkZCBhbGwgYWNjZXNzb3IgQXJyYXkgZnVuY3Rpb25zIHRvIHRoZSB3cmFwcGVyLgpfLmVhY2ggWydjb25jYXQnLCAnam9pbicsICdzbGljZSddLCAobmFtZSkgLT4KICBtZXRob2QgPSBBcnJheS5wcm90b3R5cGVbbmFtZV0KICB3cmFwcGVyLnByb3RvdHlwZVtuYW1lXSA9IC0+CiAgICByZXN1bHQobWV0aG9kLmFwcGx5KHRoaXMuX3dyYXBwZWQsIGFyZ3VtZW50cyksIHRoaXMuX2NoYWluKQoKCiMgU3RhcnQgY2hhaW5pbmcgYSB3cmFwcGVkIFVuZGVyc2NvcmUgb2JqZWN0Lgp3cmFwcGVyOjpjaGFpbiA9IC0+CiAgdGhpcy5fY2hhaW4gPSB0cnVlCiAgdGhpcwoKCiMgRXh0cmFjdHMgdGhlIHJlc3VsdCBmcm9tIGEgd3JhcHBlZCBhbmQgY2hhaW5lZCBvYmplY3QuCndyYXBwZXI6OnZhbHVlID0gLT4gdGhpcy5fd3JhcHBlZAo8L3RleHRhcmVhPjwvZm9ybT4KICAgIDxzY3JpcHQ+CiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7fSk7CiAgICA8L3NjcmlwdD4KCiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC94LWNvZmZlZXNjcmlwdDwvY29kZT4uPC9wPgoKICAgIDxwPlRoZSBDb2ZmZWVTY3JpcHQgbW9kZSB3YXMgd3JpdHRlbiBieSBKZWZmIFBpY2toYXJkdC48L3A+CgogIDwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/commonlisp/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/commonlisp/commonlisp.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJjb21tb25saXNwIiwgZnVuY3Rpb24gKGNvbmZpZykgewogIHZhciBhc3N1bWVCb2R5ID0gL153aXRofF5kZWZ8XmRvfF5wcm9nfGNhc2UkfF5jb25kJHxiaW5kJHx3aGVuJHx1bmxlc3MkLzsKICB2YXIgbnVtTGl0ZXJhbCA9IC9eKD86WytcLV0/KD86XGQrfFxkKlwuXGQrKSg/OltlZmRdWytcLV0/XGQrKT98WytcLV0/XGQrKD86XC9bK1wtXT9cZCspP3wjYlsrXC1dP1swMV0rfCNvWytcLV0/WzAtN10rfCN4WytcLV0/W1xkYS1mXSspLzsKICB2YXIgc3ltYm9sID0gL1teXHMnYCxAKClcW1xdIjtdLzsKICB2YXIgdHlwZTsKCiAgZnVuY3Rpb24gcmVhZFN5bShzdHJlYW0pIHsKICAgIHZhciBjaDsKICAgIHdoaWxlIChjaCA9IHN0cmVhbS5uZXh0KCkpIHsKICAgICAgaWYgKGNoID09ICJcXCIpIHN0cmVhbS5uZXh0KCk7CiAgICAgIGVsc2UgaWYgKCFzeW1ib2wudGVzdChjaCkpIHsgc3RyZWFtLmJhY2tVcCgxKTsgYnJlYWs7IH0KICAgIH0KICAgIHJldHVybiBzdHJlYW0uY3VycmVudCgpOwogIH0KCiAgZnVuY3Rpb24gYmFzZShzdHJlYW0sIHN0YXRlKSB7CiAgICBpZiAoc3RyZWFtLmVhdFNwYWNlKCkpIHt0eXBlID0gIndzIjsgcmV0dXJuIG51bGw7fQogICAgaWYgKHN0cmVhbS5tYXRjaChudW1MaXRlcmFsKSkgcmV0dXJuICJudW1iZXIiOwogICAgdmFyIGNoID0gc3RyZWFtLm5leHQoKTsKICAgIGlmIChjaCA9PSAiXFwiKSBjaCA9IHN0cmVhbS5uZXh0KCk7CgogICAgaWYgKGNoID09ICciJykgcmV0dXJuIChzdGF0ZS50b2tlbml6ZSA9IGluU3RyaW5nKShzdHJlYW0sIHN0YXRlKTsKICAgIGVsc2UgaWYgKGNoID09ICIoIikgeyB0eXBlID0gIm9wZW4iOyByZXR1cm4gImJyYWNrZXQiOyB9CiAgICBlbHNlIGlmIChjaCA9PSAiKSIgfHwgY2ggPT0gIl0iKSB7IHR5cGUgPSAiY2xvc2UiOyByZXR1cm4gImJyYWNrZXQiOyB9CiAgICBlbHNlIGlmIChjaCA9PSAiOyIpIHsgc3RyZWFtLnNraXBUb0VuZCgpOyB0eXBlID0gIndzIjsgcmV0dXJuICJjb21tZW50IjsgfQogICAgZWxzZSBpZiAoL1snYCxAXS8udGVzdChjaCkpIHJldHVybiBudWxsOwogICAgZWxzZSBpZiAoY2ggPT0gInwiKSB7CiAgICAgIGlmIChzdHJlYW0uc2tpcFRvKCJ8IikpIHsgc3RyZWFtLm5leHQoKTsgcmV0dXJuICJzeW1ib2wiOyB9CiAgICAgIGVsc2UgeyBzdHJlYW0uc2tpcFRvRW5kKCk7IHJldHVybiAiZXJyb3IiOyB9CiAgICB9IGVsc2UgaWYgKGNoID09ICIjIikgewogICAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpOwogICAgICBpZiAoY2ggPT0gIlsiKSB7IHR5cGUgPSAib3BlbiI7IHJldHVybiAiYnJhY2tldCI7IH0KICAgICAgZWxzZSBpZiAoL1srXC09XC4nXS8udGVzdChjaCkpIHJldHVybiBudWxsOwogICAgICBlbHNlIGlmICgvXGQvLnRlc3QoY2gpICYmIHN0cmVhbS5tYXRjaCgvXlxkKiMvKSkgcmV0dXJuIG51bGw7CiAgICAgIGVsc2UgaWYgKGNoID09ICJ8IikgcmV0dXJuIChzdGF0ZS50b2tlbml6ZSA9IGluQ29tbWVudCkoc3RyZWFtLCBzdGF0ZSk7CiAgICAgIGVsc2UgaWYgKGNoID09ICI6IikgeyByZWFkU3ltKHN0cmVhbSk7IHJldHVybiAibWV0YSI7IH0KICAgICAgZWxzZSByZXR1cm4gImVycm9yIjsKICAgIH0gZWxzZSB7CiAgICAgIHZhciBuYW1lID0gcmVhZFN5bShzdHJlYW0pOwogICAgICBpZiAobmFtZSA9PSAiLiIpIHJldHVybiBudWxsOwogICAgICB0eXBlID0gInN5bWJvbCI7CiAgICAgIGlmIChuYW1lID09ICJuaWwiIHx8IG5hbWUgPT0gInQiKSByZXR1cm4gImF0b20iOwogICAgICBpZiAobmFtZS5jaGFyQXQoMCkgPT0gIjoiKSByZXR1cm4gImtleXdvcmQiOwogICAgICBpZiAobmFtZS5jaGFyQXQoMCkgPT0gIiYiKSByZXR1cm4gInZhcmlhYmxlLTIiOwogICAgICByZXR1cm4gInZhcmlhYmxlIjsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGluU3RyaW5nKHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBlc2NhcGVkID0gZmFsc2UsIG5leHQ7CiAgICB3aGlsZSAobmV4dCA9IHN0cmVhbS5uZXh0KCkpIHsKICAgICAgaWYgKG5leHQgPT0gJyInICYmICFlc2NhcGVkKSB7IHN0YXRlLnRva2VuaXplID0gYmFzZTsgYnJlYWs7IH0KICAgICAgZXNjYXBlZCA9ICFlc2NhcGVkICYmIG5leHQgPT0gIlxcIjsKICAgIH0KICAgIHJldHVybiAic3RyaW5nIjsKICB9CgogIGZ1bmN0aW9uIGluQ29tbWVudChzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgbmV4dCwgbGFzdDsKICAgIHdoaWxlIChuZXh0ID0gc3RyZWFtLm5leHQoKSkgewogICAgICBpZiAobmV4dCA9PSAiIyIgJiYgbGFzdCA9PSAifCIpIHsgc3RhdGUudG9rZW5pemUgPSBiYXNlOyBicmVhazsgfQogICAgICBsYXN0ID0gbmV4dDsKICAgIH0KICAgIHR5cGUgPSAid3MiOwogICAgcmV0dXJuICJjb21tZW50IjsKICB9CgogIHJldHVybiB7CiAgICBzdGFydFN0YXRlOiBmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiB7Y3R4OiB7cHJldjogbnVsbCwgc3RhcnQ6IDAsIGluZGVudFRvOiAwfSwgdG9rZW5pemU6IGJhc2V9OwogICAgfSwKCiAgICB0b2tlbjogZnVuY3Rpb24gKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgaWYgKHN0cmVhbS5zb2woKSAmJiB0eXBlb2Ygc3RhdGUuY3R4LmluZGVudFRvICE9ICJudW1iZXIiKQogICAgICAgIHN0YXRlLmN0eC5pbmRlbnRUbyA9IHN0YXRlLmN0eC5zdGFydCArIDE7CgogICAgICB0eXBlID0gbnVsbDsKICAgICAgdmFyIHN0eWxlID0gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CiAgICAgIGlmICh0eXBlICE9ICJ3cyIpIHsKICAgICAgICBpZiAoc3RhdGUuY3R4LmluZGVudFRvID09IG51bGwpIHsKICAgICAgICAgIGlmICh0eXBlID09ICJzeW1ib2wiICYmIGFzc3VtZUJvZHkudGVzdChzdHJlYW0uY3VycmVudCgpKSkKICAgICAgICAgICAgc3RhdGUuY3R4LmluZGVudFRvID0gc3RhdGUuY3R4LnN0YXJ0ICsgY29uZmlnLmluZGVudFVuaXQ7CiAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHN0YXRlLmN0eC5pbmRlbnRUbyA9ICJuZXh0IjsKICAgICAgICB9IGVsc2UgaWYgKHN0YXRlLmN0eC5pbmRlbnRUbyA9PSAibmV4dCIpIHsKICAgICAgICAgIHN0YXRlLmN0eC5pbmRlbnRUbyA9IHN0cmVhbS5jb2x1bW4oKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHR5cGUgPT0gIm9wZW4iKSBzdGF0ZS5jdHggPSB7cHJldjogc3RhdGUuY3R4LCBzdGFydDogc3RyZWFtLmNvbHVtbigpLCBpbmRlbnRUbzogbnVsbH07CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gImNsb3NlIikgc3RhdGUuY3R4ID0gc3RhdGUuY3R4LnByZXYgfHwgc3RhdGUuY3R4OwogICAgICByZXR1cm4gc3R5bGU7CiAgICB9LAoKICAgIGluZGVudDogZnVuY3Rpb24gKHN0YXRlLCBfdGV4dEFmdGVyKSB7CiAgICAgIHZhciBpID0gc3RhdGUuY3R4LmluZGVudFRvOwogICAgICByZXR1cm4gdHlwZW9mIGkgPT0gIm51bWJlciIgPyBpIDogc3RhdGUuY3R4LnN0YXJ0ICsgMTsKICAgIH0sCgogICAgbGluZUNvbW1lbnQ6ICI7OyIsCiAgICBibG9ja0NvbW1lbnRTdGFydDogIiN8IiwKICAgIGJsb2NrQ29tbWVudEVuZDogInwjIgogIH07Cn0pOwoKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtY29tbW9uLWxpc3AiLCAiY29tbW9ubGlzcCIpOwoKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/commonlisp/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogQ29tbW9uIExpc3AgbW9kZTwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uLy4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxzY3JpcHQgc3JjPSIuLi8uLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJjb21tb25saXNwLmpzIj48L3NjcmlwdD4KPHN0eWxlPi5Db2RlTWlycm9yIHtiYWNrZ3JvdW5kOiAjZjhmOGY4O308L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5Db21tb24gTGlzcDwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+Q29tbW9uIExpc3AgbW9kZTwvaDI+Cjxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+KGluLXBhY2thZ2UgOmNsLXBvc3RncmVzKQoKOzsgVGhlc2UgYXJlIHVzZWQgdG8gc3ludGhlc2l6ZSByZWFkZXIgYW5kIHdyaXRlciBuYW1lcyBmb3IgaW50ZWdlcgo7OyByZWFkaW5nL3dyaXRpbmcgZnVuY3Rpb25zIHdoZW4gdGhlIGFtb3VudCBvZiBieXRlcyBhbmQgdGhlCjs7IHNpZ25lZG5lc3MgaXMga25vd24uIEJvdGggdGhlIG1hY3JvIHRoYXQgY3JlYXRlcyB0aGUgZnVuY3Rpb25zIGFuZAo7OyBzb21lIG1hY3JvcyB0aGF0IHVzZSB0aGVtIGNyZWF0ZSBuYW1lcyB0aGlzIHdheS4KKGV2YWwtd2hlbiAoOmNvbXBpbGUtdG9wbGV2ZWwgOmxvYWQtdG9wbGV2ZWwgOmV4ZWN1dGUpCiAgKGRlZnVuIGludGVnZXItcmVhZGVyLW5hbWUgKGJ5dGVzIHNpZ25lZCkKICAgIChpbnRlcm4gKHdpdGgtc3RhbmRhcmQtaW8tc3ludGF4CiAgICAgICAgICAgICAgKGZvcm1hdCBuaWwgIn5hfmF+YX5hIiAnIzpyZWFkLSAoaWYgc2lnbmVkICIiICcjOnUpICcjOmludCBieXRlcykpKSkKICAoZGVmdW4gaW50ZWdlci13cml0ZXItbmFtZSAoYnl0ZXMgc2lnbmVkKQogICAgKGludGVybiAod2l0aC1zdGFuZGFyZC1pby1zeW50YXgKICAgICAgICAgICAgICAoZm9ybWF0IG5pbCAifmF+YX5hfmEiICcjOndyaXRlLSAoaWYgc2lnbmVkICIiICcjOnUpICcjOmludCBieXRlcykpKSkpCgooZGVmbWFjcm8gaW50ZWdlci1yZWFkZXIgKGJ5dGVzKQogICJDcmVhdGUgYSBmdW5jdGlvbiB0byByZWFkIGludGVnZXJzIGZyb20gYSBiaW5hcnkgc3RyZWFtLiIKICAobGV0ICgoYml0cyAoKiBieXRlcyA4KSkpCiAgICAobGFiZWxzICgocmV0dXJuLWZvcm0gKHNpZ25lZCkKICAgICAgICAgICAgICAgKGlmIHNpZ25lZAogICAgICAgICAgICAgICAgICAgYChpZiAobG9nYml0cCAsKDEtIGJpdHMpIHJlc3VsdCkKICAgICAgICAgICAgICAgICAgICAgICAgKGRwYiByZXN1bHQgKGJ5dGUgLCgxLSBiaXRzKSAwKSAtMSkKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KQogICAgICAgICAgICAgICAgICAgYHJlc3VsdCkpCiAgICAgICAgICAgICAoZ2VuZXJhdGUtcmVhZGVyIChzaWduZWQpCiAgICAgICAgICAgICAgIGAoZGVmdW4gLChpbnRlZ2VyLXJlYWRlci1uYW1lIGJ5dGVzIHNpZ25lZCkgKHNvY2tldCkKICAgICAgICAgICAgICAgICAgKGRlY2xhcmUgKHR5cGUgc3RyZWFtIHNvY2tldCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIy4qb3B0aW1pemUqKQogICAgICAgICAgICAgICAgICAsKGlmICg9IGJ5dGVzIDEpCiAgICAgICAgICAgICAgICAgICAgICAgYChsZXQgKChyZXN1bHQgKHRoZSAodW5zaWduZWQtYnl0ZSA4KSAocmVhZC1ieXRlIHNvY2tldCkpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVjbGFyZSAodHlwZSAodW5zaWduZWQtYnl0ZSA4KSByZXN1bHQpKQogICAgICAgICAgICAgICAgICAgICAgICAgICwocmV0dXJuLWZvcm0gc2lnbmVkKSkKICAgICAgICAgICAgICAgICAgICAgICBgKGxldCAoKHJlc3VsdCAwKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVjbGFyZSAodHlwZSAodW5zaWduZWQtYnl0ZSAsYml0cykgcmVzdWx0KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAsQChsb29wIDpmb3IgYnl0ZSA6ZnJvbSAoMS0gYnl0ZXMpIDpkb3dudG8gMAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpjb2xsZWN0IGAoc2V0ZiAobGRiIChieXRlIDggLCgqIDggYnl0ZSkpIHJlc3VsdCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRoZSAodW5zaWduZWQtYnl0ZSA4KSAocmVhZC1ieXRlIHNvY2tldCkpKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAsKHJldHVybi1mb3JtIHNpZ25lZCkpKSkpKQogICAgICBgKHByb2duCjs7IFRoaXMgY2F1c2VzIHdlaXJkIGVycm9ycyBvbiBTQkNMIGluIHNvbWUgY2lyY3Vtc3RhbmNlcy4gRGlzYWJsZWQgZm9yIG5vdy4KOzsgICAgICAgICAoZGVjbGFpbSAoaW5saW5lICwoaW50ZWdlci1yZWFkZXItbmFtZSBieXRlcyB0KQo7OyAgICAgICAgICAgICAgICAgICAgICAgICAgLChpbnRlZ2VyLXJlYWRlci1uYW1lIGJ5dGVzIG5pbCkpKQogICAgICAgICAoZGVjbGFpbSAoZnR5cGUgKGZ1bmN0aW9uICh0KSAoc2lnbmVkLWJ5dGUgLGJpdHMpKQogICAgICAgICAgICAgICAgICAgICAgICAgLChpbnRlZ2VyLXJlYWRlci1uYW1lIGJ5dGVzIHQpKSkKICAgICAgICAgLChnZW5lcmF0ZS1yZWFkZXIgdCkKICAgICAgICAgKGRlY2xhaW0gKGZ0eXBlIChmdW5jdGlvbiAodCkgKHVuc2lnbmVkLWJ5dGUgLGJpdHMpKQogICAgICAgICAgICAgICAgICAgICAgICAgLChpbnRlZ2VyLXJlYWRlci1uYW1lIGJ5dGVzIG5pbCkpKQogICAgICAgICAsKGdlbmVyYXRlLXJlYWRlciBuaWwpKSkpKQoKKGRlZm1hY3JvIGludGVnZXItd3JpdGVyIChieXRlcykKICAiQ3JlYXRlIGEgZnVuY3Rpb24gdG8gd3JpdGUgaW50ZWdlcnMgdG8gYSBiaW5hcnkgc3RyZWFtLiIKICAobGV0ICgoYml0cyAoKiA4IGJ5dGVzKSkpCiAgICBgKHByb2duCiAgICAgIChkZWNsYWltIChpbmxpbmUgLChpbnRlZ2VyLXdyaXRlci1uYW1lIGJ5dGVzIHQpCiAgICAgICAgICAgICAgICAgICAgICAgLChpbnRlZ2VyLXdyaXRlci1uYW1lIGJ5dGVzIG5pbCkpKQogICAgICAoZGVmdW4gLChpbnRlZ2VyLXdyaXRlci1uYW1lIGJ5dGVzIG5pbCkgKHNvY2tldCB2YWx1ZSkKICAgICAgICAoZGVjbGFyZSAodHlwZSBzdHJlYW0gc29ja2V0KQogICAgICAgICAgICAgICAgICh0eXBlICh1bnNpZ25lZC1ieXRlICxiaXRzKSB2YWx1ZSkKICAgICAgICAgICAgICAgICAjLipvcHRpbWl6ZSopCiAgICAgICAgLEAoaWYgKD0gYnl0ZXMgMSkKICAgICAgICAgICAgICBgKCh3cml0ZS1ieXRlIHZhbHVlIHNvY2tldCkpCiAgICAgICAgICAgICAgKGxvb3AgOmZvciBieXRlIDpmcm9tICgxLSBieXRlcykgOmRvd250byAwCiAgICAgICAgICAgICAgICAgICAgOmNvbGxlY3QgYCh3cml0ZS1ieXRlIChsZGIgKGJ5dGUgOCAsKCogYnl0ZSA4KSkgdmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXQpKSkKICAgICAgICAodmFsdWVzKSkKICAgICAgKGRlZnVuICwoaW50ZWdlci13cml0ZXItbmFtZSBieXRlcyB0KSAoc29ja2V0IHZhbHVlKQogICAgICAgIChkZWNsYXJlICh0eXBlIHN0cmVhbSBzb2NrZXQpCiAgICAgICAgICAgICAgICAgKHR5cGUgKHNpZ25lZC1ieXRlICxiaXRzKSB2YWx1ZSkKICAgICAgICAgICAgICAgICAjLipvcHRpbWl6ZSopCiAgICAgICAgLEAoaWYgKD0gYnl0ZXMgMSkKICAgICAgICAgICAgICBgKCh3cml0ZS1ieXRlIChsZGIgKGJ5dGUgOCAwKSB2YWx1ZSkgc29ja2V0KSkKICAgICAgICAgICAgICAobG9vcCA6Zm9yIGJ5dGUgOmZyb20gKDEtIGJ5dGVzKSA6ZG93bnRvIDAKICAgICAgICAgICAgICAgICAgICA6Y29sbGVjdCBgKHdyaXRlLWJ5dGUgKGxkYiAoYnl0ZSA4ICwoKiBieXRlIDgpKSB2YWx1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvY2tldCkpKQogICAgICAgICh2YWx1ZXMpKSkpKQoKOzsgQWxsIHRoZSBpbnN0YW5jZXMgb2YgdGhlIGFib3ZlIHRoYXQgd2UgbmVlZC4KCihpbnRlZ2VyLXJlYWRlciAxKQooaW50ZWdlci1yZWFkZXIgMikKKGludGVnZXItcmVhZGVyIDQpCihpbnRlZ2VyLXJlYWRlciA4KQoKKGludGVnZXItd3JpdGVyIDEpCihpbnRlZ2VyLXdyaXRlciAyKQooaW50ZWdlci13cml0ZXIgNCkKCihkZWZ1biB3cml0ZS1ieXRlcyAoc29ja2V0IGJ5dGVzKQogICJXcml0ZSBhIGJ5dGUtYXJyYXkgdG8gYSBzdHJlYW0uIgogIChkZWNsYXJlICh0eXBlIHN0cmVhbSBzb2NrZXQpCiAgICAgICAgICAgKHR5cGUgKHNpbXBsZS1hcnJheSAodW5zaWduZWQtYnl0ZSA4KSkgYnl0ZXMpCiAgICAgICAgICAgIy4qb3B0aW1pemUqKQogICh3cml0ZS1zZXF1ZW5jZSBieXRlcyBzb2NrZXQpKQoKKGRlZnVuIHdyaXRlLXN0ciAoc29ja2V0IHN0cmluZykKICAiV3JpdGUgYSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIHRvIGEgc3RyZWFtIFwoZW5jb2RpbmcgaXQgd2hlbiBVVEYtOApzdXBwb3J0IGlzIGVuYWJsZWQuKS4iCiAgKGRlY2xhcmUgKHR5cGUgc3RyZWFtIHNvY2tldCkKICAgICAgICAgICAodHlwZSBzdHJpbmcgc3RyaW5nKQogICAgICAgICAgICMuKm9wdGltaXplKikKICAoZW5jLXdyaXRlLXN0cmluZyBzdHJpbmcgc29ja2V0KQogICh3cml0ZS11aW50MSBzb2NrZXQgMCkpCgooZGVjbGFpbSAoZnR5cGUgKGZ1bmN0aW9uICh0IHVuc2lnbmVkLWJ5dGUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpbXBsZS1hcnJheSAodW5zaWduZWQtYnl0ZSA4KSAoKikpKQogICAgICAgICAgICAgICAgcmVhZC1ieXRlcykpCihkZWZ1biByZWFkLWJ5dGVzIChzb2NrZXQgbGVuZ3RoKQogICJSZWFkIGEgYnl0ZSBhcnJheSBvZiB0aGUgZ2l2ZW4gbGVuZ3RoIGZyb20gYSBzdHJlYW0uIgogIChkZWNsYXJlICh0eXBlIHN0cmVhbSBzb2NrZXQpCiAgICAgICAgICAgKHR5cGUgZml4bnVtIGxlbmd0aCkKICAgICAgICAgICAjLipvcHRpbWl6ZSopCiAgKGxldCAoKHJlc3VsdCAobWFrZS1hcnJheSBsZW5ndGggOmVsZW1lbnQtdHlwZSAnKHVuc2lnbmVkLWJ5dGUgOCkpKSkKICAgIChyZWFkLXNlcXVlbmNlIHJlc3VsdCBzb2NrZXQpCiAgICByZXN1bHQpKQoKKGRlY2xhaW0gKGZ0eXBlIChmdW5jdGlvbiAodCkgc3RyaW5nKSByZWFkLXN0cikpCihkZWZ1biByZWFkLXN0ciAoc29ja2V0KQogICJSZWFkIGEgbnVsbC10ZXJtaW5hdGVkIHN0cmluZyBmcm9tIGEgc3RyZWFtLiBUYWtlcyBjYXJlIG9mIGVuY29kaW5nCndoZW4gVVRGLTggc3VwcG9ydCBpcyBlbmFibGVkLiIKICAoZGVjbGFyZSAodHlwZSBzdHJlYW0gc29ja2V0KQogICAgICAgICAgICMuKm9wdGltaXplKikKICAoZW5jLXJlYWQtc3RyaW5nIHNvY2tldCA6bnVsbC10ZXJtaW5hdGVkIHQpKQoKKGRlZnVuIHNraXAtYnl0ZXMgKHNvY2tldCBsZW5ndGgpCiAgIlNraXAgYSBnaXZlbiBudW1iZXIgb2YgYnl0ZXMgaW4gYSBiaW5hcnkgc3RyZWFtLiIKICAoZGVjbGFyZSAodHlwZSBzdHJlYW0gc29ja2V0KQogICAgICAgICAgICh0eXBlICh1bnNpZ25lZC1ieXRlIDMyKSBsZW5ndGgpCiAgICAgICAgICAgIy4qb3B0aW1pemUqKQogIChkb3RpbWVzIChpIGxlbmd0aCkKICAgIChyZWFkLWJ5dGUgc29ja2V0KSkpCgooZGVmdW4gc2tpcC1zdHIgKHNvY2tldCkKICAiU2tpcCBhIG51bGwtdGVybWluYXRlZCBzdHJpbmcuIgogIChkZWNsYXJlICh0eXBlIHN0cmVhbSBzb2NrZXQpCiAgICAgICAgICAgIy4qb3B0aW1pemUqKQogIChsb29wIDpmb3IgY2hhciA6b2YtdHlwZSBmaXhudW0gPSAocmVhZC1ieXRlIHNvY2tldCkKICAgICAgICA6dW50aWwgKHplcm9wIGNoYXIpKSkKCihkZWZ1biBlbnN1cmUtc29ja2V0LWlzLWNsb3NlZCAoc29ja2V0ICZhbXA7a2V5IGFib3J0KQogICh3aGVuIChvcGVuLXN0cmVhbS1wIHNvY2tldCkKICAgIChoYW5kbGVyLWNhc2UKICAgICAgICAoY2xvc2Ugc29ja2V0IDphYm9ydCBhYm9ydCkKICAgICAgKGVycm9yIChlcnJvcikKICAgICAgICAod2FybiAiSWdub3JpbmcgdGhlIGVycm9yIHdoaWNoIGhhcHBlbmVkIHdoaWxlIHRyeWluZyB0byBjbG9zZSBQb3N0Z3JlU1FMIHNvY2tldDogfkEiIGVycm9yKSkpKSkKPC90ZXh0YXJlYT48L2Zvcm0+CiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwge2xpbmVOdW1iZXJzOiB0cnVlfSk7CiAgICA8L3NjcmlwdD4KCiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC94LWNvbW1vbi1saXNwPC9jb2RlPi48L3A+CgogIDwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/css/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/css/css.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJjc3MiLCBmdW5jdGlvbihjb25maWcsIHBhcnNlckNvbmZpZykgewogIGlmICghcGFyc2VyQ29uZmlnLnByb3BlcnR5S2V5d29yZHMpIHBhcnNlckNvbmZpZyA9IENvZGVNaXJyb3IucmVzb2x2ZU1vZGUoInRleHQvY3NzIik7CgogIHZhciBpbmRlbnRVbml0ID0gY29uZmlnLmluZGVudFVuaXQsCiAgICAgIHRva2VuSG9va3MgPSBwYXJzZXJDb25maWcudG9rZW5Ib29rcywKICAgICAgbWVkaWFUeXBlcyA9IHBhcnNlckNvbmZpZy5tZWRpYVR5cGVzIHx8IHt9LAogICAgICBtZWRpYUZlYXR1cmVzID0gcGFyc2VyQ29uZmlnLm1lZGlhRmVhdHVyZXMgfHwge30sCiAgICAgIHByb3BlcnR5S2V5d29yZHMgPSBwYXJzZXJDb25maWcucHJvcGVydHlLZXl3b3JkcyB8fCB7fSwKICAgICAgbm9uU3RhbmRhcmRQcm9wZXJ0eUtleXdvcmRzID0gcGFyc2VyQ29uZmlnLm5vblN0YW5kYXJkUHJvcGVydHlLZXl3b3JkcyB8fCB7fSwKICAgICAgY29sb3JLZXl3b3JkcyA9IHBhcnNlckNvbmZpZy5jb2xvcktleXdvcmRzIHx8IHt9LAogICAgICB2YWx1ZUtleXdvcmRzID0gcGFyc2VyQ29uZmlnLnZhbHVlS2V5d29yZHMgfHwge30sCiAgICAgIGZvbnRQcm9wZXJ0aWVzID0gcGFyc2VyQ29uZmlnLmZvbnRQcm9wZXJ0aWVzIHx8IHt9LAogICAgICBhbGxvd05lc3RlZCA9IHBhcnNlckNvbmZpZy5hbGxvd05lc3RlZDsKCiAgdmFyIHR5cGUsIG92ZXJyaWRlOwogIGZ1bmN0aW9uIHJldChzdHlsZSwgdHApIHsgdHlwZSA9IHRwOyByZXR1cm4gc3R5bGU7IH0KCiAgLy8gVG9rZW5pemVycwoKICBmdW5jdGlvbiB0b2tlbkJhc2Uoc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIGNoID0gc3RyZWFtLm5leHQoKTsKICAgIGlmICh0b2tlbkhvb2tzW2NoXSkgewogICAgICB2YXIgcmVzdWx0ID0gdG9rZW5Ib29rc1tjaF0oc3RyZWFtLCBzdGF0ZSk7CiAgICAgIGlmIChyZXN1bHQgIT09IGZhbHNlKSByZXR1cm4gcmVzdWx0OwogICAgfQogICAgaWYgKGNoID09ICJAIikgewogICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcd1xcXC1dLyk7CiAgICAgIHJldHVybiByZXQoImRlZiIsIHN0cmVhbS5jdXJyZW50KCkpOwogICAgfSBlbHNlIGlmIChjaCA9PSAiPSIgfHwgKGNoID09ICJ+IiB8fCBjaCA9PSAifCIpICYmIHN0cmVhbS5lYXQoIj0iKSkgewogICAgICByZXR1cm4gcmV0KG51bGwsICJjb21wYXJlIik7CiAgICB9IGVsc2UgaWYgKGNoID09ICJcIiIgfHwgY2ggPT0gIiciKSB7CiAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5TdHJpbmcoY2gpOwogICAgICByZXR1cm4gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CiAgICB9IGVsc2UgaWYgKGNoID09ICIjIikgewogICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcd1xcXC1dLyk7CiAgICAgIHJldHVybiByZXQoImF0b20iLCAiaGFzaCIpOwogICAgfSBlbHNlIGlmIChjaCA9PSAiISIpIHsKICAgICAgc3RyZWFtLm1hdGNoKC9eXHMqXHcqLyk7CiAgICAgIHJldHVybiByZXQoImtleXdvcmQiLCAiaW1wb3J0YW50Iik7CiAgICB9IGVsc2UgaWYgKC9cZC8udGVzdChjaCkgfHwgY2ggPT0gIi4iICYmIHN0cmVhbS5lYXQoL1xkLykpIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXHcuJV0vKTsKICAgICAgcmV0dXJuIHJldCgibnVtYmVyIiwgInVuaXQiKTsKICAgIH0gZWxzZSBpZiAoY2ggPT09ICItIikgewogICAgICBpZiAoL1tcZC5dLy50ZXN0KHN0cmVhbS5wZWVrKCkpKSB7CiAgICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXHcuJV0vKTsKICAgICAgICByZXR1cm4gcmV0KCJudW1iZXIiLCAidW5pdCIpOwogICAgICB9IGVsc2UgaWYgKHN0cmVhbS5tYXRjaCgvXlx3Ky0vKSkgewogICAgICAgIHJldHVybiByZXQoIm1ldGEiLCAibWV0YSIpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKC9bLCs+KlwvXS8udGVzdChjaCkpIHsKICAgICAgcmV0dXJuIHJldChudWxsLCAic2VsZWN0LW9wIik7CiAgICB9IGVsc2UgaWYgKGNoID09ICIuIiAmJiBzdHJlYW0ubWF0Y2goL14tP1tfYS16XVtfYS16MC05LV0qL2kpKSB7CiAgICAgIHJldHVybiByZXQoInF1YWxpZmllciIsICJxdWFsaWZpZXIiKTsKICAgIH0gZWxzZSBpZiAoL1s6O3t9XFtcXVwoXCldLy50ZXN0KGNoKSkgewogICAgICByZXR1cm4gcmV0KG51bGwsIGNoKTsKICAgIH0gZWxzZSBpZiAoY2ggPT0gInUiICYmIHN0cmVhbS5tYXRjaCgicmwoIikpIHsKICAgICAgc3RyZWFtLmJhY2tVcCgxKTsKICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlblBhcmVudGhlc2l6ZWQ7CiAgICAgIHJldHVybiByZXQoInByb3BlcnR5IiwgIndvcmQiKTsKICAgIH0gZWxzZSBpZiAoL1tcd1xcXC1dLy50ZXN0KGNoKSkgewogICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcd1xcXC1dLyk7CiAgICAgIHJldHVybiByZXQoInByb3BlcnR5IiwgIndvcmQiKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiByZXQobnVsbCwgbnVsbCk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiB0b2tlblN0cmluZyhxdW90ZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgdmFyIGVzY2FwZWQgPSBmYWxzZSwgY2g7CiAgICAgIHdoaWxlICgoY2ggPSBzdHJlYW0ubmV4dCgpKSAhPSBudWxsKSB7CiAgICAgICAgaWYgKGNoID09IHF1b3RlICYmICFlc2NhcGVkKSB7CiAgICAgICAgICBpZiAocXVvdGUgPT0gIikiKSBzdHJlYW0uYmFja1VwKDEpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGVzY2FwZWQgPSAhZXNjYXBlZCAmJiBjaCA9PSAiXFwiOwogICAgICB9CiAgICAgIGlmIChjaCA9PSBxdW90ZSB8fCAhZXNjYXBlZCAmJiBxdW90ZSAhPSAiKSIpIHN0YXRlLnRva2VuaXplID0gbnVsbDsKICAgICAgcmV0dXJuIHJldCgic3RyaW5nIiwgInN0cmluZyIpOwogICAgfTsKICB9CgogIGZ1bmN0aW9uIHRva2VuUGFyZW50aGVzaXplZChzdHJlYW0sIHN0YXRlKSB7CiAgICBzdHJlYW0ubmV4dCgpOyAvLyBNdXN0IGJlICcoJwogICAgaWYgKCFzdHJlYW0ubWF0Y2goL1xzKltcIlwnKV0vLCBmYWxzZSkpCiAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5TdHJpbmcoIikiKTsKICAgIGVsc2UKICAgICAgc3RhdGUudG9rZW5pemUgPSBudWxsOwogICAgcmV0dXJuIHJldChudWxsLCAiKCIpOwogIH0KCiAgLy8gQ29udGV4dCBtYW5hZ2VtZW50CgogIGZ1bmN0aW9uIENvbnRleHQodHlwZSwgaW5kZW50LCBwcmV2KSB7CiAgICB0aGlzLnR5cGUgPSB0eXBlOwogICAgdGhpcy5pbmRlbnQgPSBpbmRlbnQ7CiAgICB0aGlzLnByZXYgPSBwcmV2OwogIH0KCiAgZnVuY3Rpb24gcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbSwgdHlwZSkgewogICAgc3RhdGUuY29udGV4dCA9IG5ldyBDb250ZXh0KHR5cGUsIHN0cmVhbS5pbmRlbnRhdGlvbigpICsgaW5kZW50VW5pdCwgc3RhdGUuY29udGV4dCk7CiAgICByZXR1cm4gdHlwZTsKICB9CgogIGZ1bmN0aW9uIHBvcENvbnRleHQoc3RhdGUpIHsKICAgIHN0YXRlLmNvbnRleHQgPSBzdGF0ZS5jb250ZXh0LnByZXY7CiAgICByZXR1cm4gc3RhdGUuY29udGV4dC50eXBlOwogIH0KCiAgZnVuY3Rpb24gcGFzcyh0eXBlLCBzdHJlYW0sIHN0YXRlKSB7CiAgICByZXR1cm4gc3RhdGVzW3N0YXRlLmNvbnRleHQudHlwZV0odHlwZSwgc3RyZWFtLCBzdGF0ZSk7CiAgfQogIGZ1bmN0aW9uIHBvcEFuZFBhc3ModHlwZSwgc3RyZWFtLCBzdGF0ZSwgbikgewogICAgZm9yICh2YXIgaSA9IG4gfHwgMTsgaSA+IDA7IGktLSkKICAgICAgc3RhdGUuY29udGV4dCA9IHN0YXRlLmNvbnRleHQucHJldjsKICAgIHJldHVybiBwYXNzKHR5cGUsIHN0cmVhbSwgc3RhdGUpOwogIH0KCiAgLy8gUGFyc2VyCgogIGZ1bmN0aW9uIHdvcmRBc1ZhbHVlKHN0cmVhbSkgewogICAgdmFyIHdvcmQgPSBzdHJlYW0uY3VycmVudCgpLnRvTG93ZXJDYXNlKCk7CiAgICBpZiAodmFsdWVLZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eSh3b3JkKSkKICAgICAgb3ZlcnJpZGUgPSAiYXRvbSI7CiAgICBlbHNlIGlmIChjb2xvcktleXdvcmRzLmhhc093blByb3BlcnR5KHdvcmQpKQogICAgICBvdmVycmlkZSA9ICJrZXl3b3JkIjsKICAgIGVsc2UKICAgICAgb3ZlcnJpZGUgPSAidmFyaWFibGUiOwogIH0KCiAgdmFyIHN0YXRlcyA9IHt9OwoKICBzdGF0ZXMudG9wID0gZnVuY3Rpb24odHlwZSwgc3RyZWFtLCBzdGF0ZSkgewogICAgaWYgKHR5cGUgPT0gInsiKSB7CiAgICAgIHJldHVybiBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLCAiYmxvY2siKTsKICAgIH0gZWxzZSBpZiAodHlwZSA9PSAifSIgJiYgc3RhdGUuY29udGV4dC5wcmV2KSB7CiAgICAgIHJldHVybiBwb3BDb250ZXh0KHN0YXRlKTsKICAgIH0gZWxzZSBpZiAodHlwZSA9PSAiQG1lZGlhIikgewogICAgICByZXR1cm4gcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbSwgIm1lZGlhIik7CiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gIkBmb250LWZhY2UiKSB7CiAgICAgIHJldHVybiAiZm9udF9mYWNlX2JlZm9yZSI7CiAgICB9IGVsc2UgaWYgKC9eQCgtKG1venxtc3xvfHdlYmtpdCktKT9rZXlmcmFtZXMkLy50ZXN0KHR5cGUpKSB7CiAgICAgIHJldHVybiAia2V5ZnJhbWVzIjsKICAgIH0gZWxzZSBpZiAodHlwZSAmJiB0eXBlLmNoYXJBdCgwKSA9PSAiQCIpIHsKICAgICAgcmV0dXJuIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0sICJhdCIpOwogICAgfSBlbHNlIGlmICh0eXBlID09ICJoYXNoIikgewogICAgICBvdmVycmlkZSA9ICJidWlsdGluIjsKICAgIH0gZWxzZSBpZiAodHlwZSA9PSAid29yZCIpIHsKICAgICAgb3ZlcnJpZGUgPSAidGFnIjsKICAgIH0gZWxzZSBpZiAodHlwZSA9PSAidmFyaWFibGUtZGVmaW5pdGlvbiIpIHsKICAgICAgcmV0dXJuICJtYXliZXByb3AiOwogICAgfSBlbHNlIGlmICh0eXBlID09ICJpbnRlcnBvbGF0aW9uIikgewogICAgICByZXR1cm4gcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbSwgImludGVycG9sYXRpb24iKTsKICAgIH0gZWxzZSBpZiAodHlwZSA9PSAiOiIpIHsKICAgICAgcmV0dXJuICJwc2V1ZG8iOwogICAgfSBlbHNlIGlmIChhbGxvd05lc3RlZCAmJiB0eXBlID09ICIoIikgewogICAgICByZXR1cm4gcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbSwgInBhcmVucyIpOwogICAgfQogICAgcmV0dXJuIHN0YXRlLmNvbnRleHQudHlwZTsKICB9OwoKICBzdGF0ZXMuYmxvY2sgPSBmdW5jdGlvbih0eXBlLCBzdHJlYW0sIHN0YXRlKSB7CiAgICBpZiAodHlwZSA9PSAid29yZCIpIHsKICAgICAgdmFyIHdvcmQgPSBzdHJlYW0uY3VycmVudCgpLnRvTG93ZXJDYXNlKCk7CiAgICAgIGlmIChwcm9wZXJ0eUtleXdvcmRzLmhhc093blByb3BlcnR5KHdvcmQpKSB7CiAgICAgICAgb3ZlcnJpZGUgPSAicHJvcGVydHkiOwogICAgICAgIHJldHVybiAibWF5YmVwcm9wIjsKICAgICAgfSBlbHNlIGlmIChub25TdGFuZGFyZFByb3BlcnR5S2V5d29yZHMuaGFzT3duUHJvcGVydHkod29yZCkpIHsKICAgICAgICBvdmVycmlkZSA9ICJzdHJpbmctMiI7CiAgICAgICAgcmV0dXJuICJtYXliZXByb3AiOwogICAgICB9IGVsc2UgaWYgKGFsbG93TmVzdGVkKSB7CiAgICAgICAgb3ZlcnJpZGUgPSBzdHJlYW0ubWF0Y2goL15ccyo6LywgZmFsc2UpID8gInByb3BlcnR5IiA6ICJ0YWciOwogICAgICAgIHJldHVybiAiYmxvY2siOwogICAgICB9IGVsc2UgewogICAgICAgIG92ZXJyaWRlICs9ICIgZXJyb3IiOwogICAgICAgIHJldHVybiAibWF5YmVwcm9wIjsKICAgICAgfQogICAgfSBlbHNlIGlmICh0eXBlID09ICJtZXRhIikgewogICAgICByZXR1cm4gImJsb2NrIjsKICAgIH0gZWxzZSBpZiAoIWFsbG93TmVzdGVkICYmICh0eXBlID09ICJoYXNoIiB8fCB0eXBlID09ICJxdWFsaWZpZXIiKSkgewogICAgICBvdmVycmlkZSA9ICJlcnJvciI7CiAgICAgIHJldHVybiAiYmxvY2siOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHN0YXRlcy50b3AodHlwZSwgc3RyZWFtLCBzdGF0ZSk7CiAgICB9CiAgfTsKCiAgc3RhdGVzLm1heWJlcHJvcCA9IGZ1bmN0aW9uKHR5cGUsIHN0cmVhbSwgc3RhdGUpIHsKICAgIGlmICh0eXBlID09ICI6IikgcmV0dXJuIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0sICJwcm9wIik7CiAgICByZXR1cm4gcGFzcyh0eXBlLCBzdHJlYW0sIHN0YXRlKTsKICB9OwoKICBzdGF0ZXMucHJvcCA9IGZ1bmN0aW9uKHR5cGUsIHN0cmVhbSwgc3RhdGUpIHsKICAgIGlmICh0eXBlID09ICI7IikgcmV0dXJuIHBvcENvbnRleHQoc3RhdGUpOwogICAgaWYgKHR5cGUgPT0gInsiICYmIGFsbG93TmVzdGVkKSByZXR1cm4gcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbSwgInByb3BCbG9jayIpOwogICAgaWYgKHR5cGUgPT0gIn0iIHx8IHR5cGUgPT0gInsiKSByZXR1cm4gcG9wQW5kUGFzcyh0eXBlLCBzdHJlYW0sIHN0YXRlKTsKICAgIGlmICh0eXBlID09ICIoIikgcmV0dXJuIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0sICJwYXJlbnMiKTsKCiAgICBpZiAodHlwZSA9PSAiaGFzaCIgJiYgIS9eIyhbMC05YS1mQS1mXXszfXxbMC05YS1mQS1mXXs2fSkkLy50ZXN0KHN0cmVhbS5jdXJyZW50KCkpKSB7CiAgICAgIG92ZXJyaWRlICs9ICIgZXJyb3IiOwogICAgfSBlbHNlIGlmICh0eXBlID09ICJ3b3JkIikgewogICAgICB3b3JkQXNWYWx1ZShzdHJlYW0pOwogICAgfSBlbHNlIGlmICh0eXBlID09ICJpbnRlcnBvbGF0aW9uIikgewogICAgICByZXR1cm4gcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbSwgImludGVycG9sYXRpb24iKTsKICAgIH0KICAgIHJldHVybiAicHJvcCI7CiAgfTsKCiAgc3RhdGVzLnByb3BCbG9jayA9IGZ1bmN0aW9uKHR5cGUsIF9zdHJlYW0sIHN0YXRlKSB7CiAgICBpZiAodHlwZSA9PSAifSIpIHJldHVybiBwb3BDb250ZXh0KHN0YXRlKTsKICAgIGlmICh0eXBlID09ICJ3b3JkIikgeyBvdmVycmlkZSA9ICJwcm9wZXJ0eSI7IHJldHVybiAibWF5YmVwcm9wIjsgfQogICAgcmV0dXJuIHN0YXRlLmNvbnRleHQudHlwZTsKICB9OwoKICBzdGF0ZXMucGFyZW5zID0gZnVuY3Rpb24odHlwZSwgc3RyZWFtLCBzdGF0ZSkgewogICAgaWYgKHR5cGUgPT0gInsiIHx8IHR5cGUgPT0gIn0iKSByZXR1cm4gcG9wQW5kUGFzcyh0eXBlLCBzdHJlYW0sIHN0YXRlKTsKICAgIGlmICh0eXBlID09ICIpIikgcmV0dXJuIHBvcENvbnRleHQoc3RhdGUpOwogICAgaWYgKHR5cGUgPT0gIigiKSByZXR1cm4gcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbSwgInBhcmVucyIpOwogICAgaWYgKHR5cGUgPT0gIndvcmQiKSB3b3JkQXNWYWx1ZShzdHJlYW0pOwogICAgcmV0dXJuICJwYXJlbnMiOwogIH07CgogIHN0YXRlcy5wc2V1ZG8gPSBmdW5jdGlvbih0eXBlLCBzdHJlYW0sIHN0YXRlKSB7CiAgICBpZiAodHlwZSA9PSAid29yZCIpIHsKICAgICAgb3ZlcnJpZGUgPSAidmFyaWFibGUtMyI7CiAgICAgIHJldHVybiBzdGF0ZS5jb250ZXh0LnR5cGU7CiAgICB9CiAgICByZXR1cm4gcGFzcyh0eXBlLCBzdHJlYW0sIHN0YXRlKTsKICB9OwoKICBzdGF0ZXMubWVkaWEgPSBmdW5jdGlvbih0eXBlLCBzdHJlYW0sIHN0YXRlKSB7CiAgICBpZiAodHlwZSA9PSAiKCIpIHJldHVybiBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLCAibWVkaWFfcGFyZW5zIik7CiAgICBpZiAodHlwZSA9PSAifSIpIHJldHVybiBwb3BBbmRQYXNzKHR5cGUsIHN0cmVhbSwgc3RhdGUpOwogICAgaWYgKHR5cGUgPT0gInsiKSByZXR1cm4gcG9wQ29udGV4dChzdGF0ZSkgJiYgcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbSwgYWxsb3dOZXN0ZWQgPyAiYmxvY2siIDogInRvcCIpOwoKICAgIGlmICh0eXBlID09ICJ3b3JkIikgewogICAgICB2YXIgd29yZCA9IHN0cmVhbS5jdXJyZW50KCkudG9Mb3dlckNhc2UoKTsKICAgICAgaWYgKHdvcmQgPT0gIm9ubHkiIHx8IHdvcmQgPT0gIm5vdCIgfHwgd29yZCA9PSAiYW5kIikKICAgICAgICBvdmVycmlkZSA9ICJrZXl3b3JkIjsKICAgICAgZWxzZSBpZiAobWVkaWFUeXBlcy5oYXNPd25Qcm9wZXJ0eSh3b3JkKSkKICAgICAgICBvdmVycmlkZSA9ICJhdHRyaWJ1dGUiOwogICAgICBlbHNlIGlmIChtZWRpYUZlYXR1cmVzLmhhc093blByb3BlcnR5KHdvcmQpKQogICAgICAgIG92ZXJyaWRlID0gInByb3BlcnR5IjsKICAgICAgZWxzZQogICAgICAgIG92ZXJyaWRlID0gImVycm9yIjsKICAgIH0KICAgIHJldHVybiBzdGF0ZS5jb250ZXh0LnR5cGU7CiAgfTsKCiAgc3RhdGVzLm1lZGlhX3BhcmVucyA9IGZ1bmN0aW9uKHR5cGUsIHN0cmVhbSwgc3RhdGUpIHsKICAgIGlmICh0eXBlID09ICIpIikgcmV0dXJuIHBvcENvbnRleHQoc3RhdGUpOwogICAgaWYgKHR5cGUgPT0gInsiIHx8IHR5cGUgPT0gIn0iKSByZXR1cm4gcG9wQW5kUGFzcyh0eXBlLCBzdHJlYW0sIHN0YXRlLCAyKTsKICAgIHJldHVybiBzdGF0ZXMubWVkaWEodHlwZSwgc3RyZWFtLCBzdGF0ZSk7CiAgfTsKCiAgc3RhdGVzLmZvbnRfZmFjZV9iZWZvcmUgPSBmdW5jdGlvbih0eXBlLCBzdHJlYW0sIHN0YXRlKSB7CiAgICBpZiAodHlwZSA9PSAieyIpCiAgICAgIHJldHVybiBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLCAiZm9udF9mYWNlIik7CiAgICByZXR1cm4gcGFzcyh0eXBlLCBzdHJlYW0sIHN0YXRlKTsKICB9OwoKICBzdGF0ZXMuZm9udF9mYWNlID0gZnVuY3Rpb24odHlwZSwgc3RyZWFtLCBzdGF0ZSkgewogICAgaWYgKHR5cGUgPT0gIn0iKSByZXR1cm4gcG9wQ29udGV4dChzdGF0ZSk7CiAgICBpZiAodHlwZSA9PSAid29yZCIpIHsKICAgICAgaWYgKCFmb250UHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShzdHJlYW0uY3VycmVudCgpLnRvTG93ZXJDYXNlKCkpKQogICAgICAgIG92ZXJyaWRlID0gImVycm9yIjsKICAgICAgZWxzZQogICAgICAgIG92ZXJyaWRlID0gInByb3BlcnR5IjsKICAgICAgcmV0dXJuICJtYXliZXByb3AiOwogICAgfQogICAgcmV0dXJuICJmb250X2ZhY2UiOwogIH07CgogIHN0YXRlcy5rZXlmcmFtZXMgPSBmdW5jdGlvbih0eXBlLCBzdHJlYW0sIHN0YXRlKSB7CiAgICBpZiAodHlwZSA9PSAid29yZCIpIHsgb3ZlcnJpZGUgPSAidmFyaWFibGUiOyByZXR1cm4gImtleWZyYW1lcyI7IH0KICAgIGlmICh0eXBlID09ICJ7IikgcmV0dXJuIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0sICJ0b3AiKTsKICAgIHJldHVybiBwYXNzKHR5cGUsIHN0cmVhbSwgc3RhdGUpOwogIH07CgogIHN0YXRlcy5hdCA9IGZ1bmN0aW9uKHR5cGUsIHN0cmVhbSwgc3RhdGUpIHsKICAgIGlmICh0eXBlID09ICI7IikgcmV0dXJuIHBvcENvbnRleHQoc3RhdGUpOwogICAgaWYgKHR5cGUgPT0gInsiIHx8IHR5cGUgPT0gIn0iKSByZXR1cm4gcG9wQW5kUGFzcyh0eXBlLCBzdHJlYW0sIHN0YXRlKTsKICAgIGlmICh0eXBlID09ICJ3b3JkIikgb3ZlcnJpZGUgPSAidGFnIjsKICAgIGVsc2UgaWYgKHR5cGUgPT0gImhhc2giKSBvdmVycmlkZSA9ICJidWlsdGluIjsKICAgIHJldHVybiAiYXQiOwogIH07CgogIHN0YXRlcy5pbnRlcnBvbGF0aW9uID0gZnVuY3Rpb24odHlwZSwgc3RyZWFtLCBzdGF0ZSkgewogICAgaWYgKHR5cGUgPT0gIn0iKSByZXR1cm4gcG9wQ29udGV4dChzdGF0ZSk7CiAgICBpZiAodHlwZSA9PSAieyIgfHwgdHlwZSA9PSAiOyIpIHJldHVybiBwb3BBbmRQYXNzKHR5cGUsIHN0cmVhbSwgc3RhdGUpOwogICAgaWYgKHR5cGUgIT0gInZhcmlhYmxlIikgb3ZlcnJpZGUgPSAiZXJyb3IiOwogICAgcmV0dXJuICJpbnRlcnBvbGF0aW9uIjsKICB9OwoKICByZXR1cm4gewogICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24oYmFzZSkgewogICAgICByZXR1cm4ge3Rva2VuaXplOiBudWxsLAogICAgICAgICAgICAgIHN0YXRlOiAidG9wIiwKICAgICAgICAgICAgICBjb250ZXh0OiBuZXcgQ29udGV4dCgidG9wIiwgYmFzZSB8fCAwLCBudWxsKX07CiAgICB9LAoKICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIGlmICghc3RhdGUudG9rZW5pemUgJiYgc3RyZWFtLmVhdFNwYWNlKCkpIHJldHVybiBudWxsOwogICAgICB2YXIgc3R5bGUgPSAoc3RhdGUudG9rZW5pemUgfHwgdG9rZW5CYXNlKShzdHJlYW0sIHN0YXRlKTsKICAgICAgaWYgKHN0eWxlICYmIHR5cGVvZiBzdHlsZSA9PSAib2JqZWN0IikgewogICAgICAgIHR5cGUgPSBzdHlsZVsxXTsKICAgICAgICBzdHlsZSA9IHN0eWxlWzBdOwogICAgICB9CiAgICAgIG92ZXJyaWRlID0gc3R5bGU7CiAgICAgIHN0YXRlLnN0YXRlID0gc3RhdGVzW3N0YXRlLnN0YXRlXSh0eXBlLCBzdHJlYW0sIHN0YXRlKTsKICAgICAgcmV0dXJuIG92ZXJyaWRlOwogICAgfSwKCiAgICBpbmRlbnQ6IGZ1bmN0aW9uKHN0YXRlLCB0ZXh0QWZ0ZXIpIHsKICAgICAgdmFyIGN4ID0gc3RhdGUuY29udGV4dCwgY2ggPSB0ZXh0QWZ0ZXIgJiYgdGV4dEFmdGVyLmNoYXJBdCgwKTsKICAgICAgdmFyIGluZGVudCA9IGN4LmluZGVudDsKICAgICAgaWYgKGN4LnR5cGUgPT0gInByb3AiICYmIChjaCA9PSAifSIgfHwgY2ggPT0gIikiKSkgY3ggPSBjeC5wcmV2OwogICAgICBpZiAoY3gucHJldiAmJgogICAgICAgICAgKGNoID09ICJ9IiAmJiAoY3gudHlwZSA9PSAiYmxvY2siIHx8IGN4LnR5cGUgPT0gInRvcCIgfHwgY3gudHlwZSA9PSAiaW50ZXJwb2xhdGlvbiIgfHwgY3gudHlwZSA9PSAiZm9udF9mYWNlIikgfHwKICAgICAgICAgICBjaCA9PSAiKSIgJiYgKGN4LnR5cGUgPT0gInBhcmVucyIgfHwgY3gudHlwZSA9PSAibWVkaWFfcGFyZW5zIikgfHwKICAgICAgICAgICBjaCA9PSAieyIgJiYgKGN4LnR5cGUgPT0gImF0IiB8fCBjeC50eXBlID09ICJtZWRpYSIpKSkgewogICAgICAgIGluZGVudCA9IGN4LmluZGVudCAtIGluZGVudFVuaXQ7CiAgICAgICAgY3ggPSBjeC5wcmV2OwogICAgICB9CiAgICAgIHJldHVybiBpbmRlbnQ7CiAgICB9LAoKICAgIGVsZWN0cmljQ2hhcnM6ICJ9IiwKICAgIGJsb2NrQ29tbWVudFN0YXJ0OiAiLyoiLAogICAgYmxvY2tDb21tZW50RW5kOiAiKi8iLAogICAgZm9sZDogImJyYWNlIgogIH07Cn0pOwoKICBmdW5jdGlvbiBrZXlTZXQoYXJyYXkpIHsKICAgIHZhciBrZXlzID0ge307CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgKytpKSB7CiAgICAgIGtleXNbYXJyYXlbaV1dID0gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBrZXlzOwogIH0KCiAgdmFyIG1lZGlhVHlwZXNfID0gWwogICAgImFsbCIsICJhdXJhbCIsICJicmFpbGxlIiwgImhhbmRoZWxkIiwgInByaW50IiwgInByb2plY3Rpb24iLCAic2NyZWVuIiwKICAgICJ0dHkiLCAidHYiLCAiZW1ib3NzZWQiCiAgXSwgbWVkaWFUeXBlcyA9IGtleVNldChtZWRpYVR5cGVzXyk7CgogIHZhciBtZWRpYUZlYXR1cmVzXyA9IFsKICAgICJ3aWR0aCIsICJtaW4td2lkdGgiLCAibWF4LXdpZHRoIiwgImhlaWdodCIsICJtaW4taGVpZ2h0IiwgIm1heC1oZWlnaHQiLAogICAgImRldmljZS13aWR0aCIsICJtaW4tZGV2aWNlLXdpZHRoIiwgIm1heC1kZXZpY2Utd2lkdGgiLCAiZGV2aWNlLWhlaWdodCIsCiAgICAibWluLWRldmljZS1oZWlnaHQiLCAibWF4LWRldmljZS1oZWlnaHQiLCAiYXNwZWN0LXJhdGlvIiwKICAgICJtaW4tYXNwZWN0LXJhdGlvIiwgIm1heC1hc3BlY3QtcmF0aW8iLCAiZGV2aWNlLWFzcGVjdC1yYXRpbyIsCiAgICAibWluLWRldmljZS1hc3BlY3QtcmF0aW8iLCAibWF4LWRldmljZS1hc3BlY3QtcmF0aW8iLCAiY29sb3IiLCAibWluLWNvbG9yIiwKICAgICJtYXgtY29sb3IiLCAiY29sb3ItaW5kZXgiLCAibWluLWNvbG9yLWluZGV4IiwgIm1heC1jb2xvci1pbmRleCIsCiAgICAibW9ub2Nocm9tZSIsICJtaW4tbW9ub2Nocm9tZSIsICJtYXgtbW9ub2Nocm9tZSIsICJyZXNvbHV0aW9uIiwKICAgICJtaW4tcmVzb2x1dGlvbiIsICJtYXgtcmVzb2x1dGlvbiIsICJzY2FuIiwgImdyaWQiCiAgXSwgbWVkaWFGZWF0dXJlcyA9IGtleVNldChtZWRpYUZlYXR1cmVzXyk7CgogIHZhciBwcm9wZXJ0eUtleXdvcmRzXyA9IFsKICAgICJhbGlnbi1jb250ZW50IiwgImFsaWduLWl0ZW1zIiwgImFsaWduLXNlbGYiLCAiYWxpZ25tZW50LWFkanVzdCIsCiAgICAiYWxpZ25tZW50LWJhc2VsaW5lIiwgImFuY2hvci1wb2ludCIsICJhbmltYXRpb24iLCAiYW5pbWF0aW9uLWRlbGF5IiwKICAgICJhbmltYXRpb24tZGlyZWN0aW9uIiwgImFuaW1hdGlvbi1kdXJhdGlvbiIsICJhbmltYXRpb24tZmlsbC1tb2RlIiwKICAgICJhbmltYXRpb24taXRlcmF0aW9uLWNvdW50IiwgImFuaW1hdGlvbi1uYW1lIiwgImFuaW1hdGlvbi1wbGF5LXN0YXRlIiwKICAgICJhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uIiwgImFwcGVhcmFuY2UiLCAiYXppbXV0aCIsICJiYWNrZmFjZS12aXNpYmlsaXR5IiwKICAgICJiYWNrZ3JvdW5kIiwgImJhY2tncm91bmQtYXR0YWNobWVudCIsICJiYWNrZ3JvdW5kLWNsaXAiLCAiYmFja2dyb3VuZC1jb2xvciIsCiAgICAiYmFja2dyb3VuZC1pbWFnZSIsICJiYWNrZ3JvdW5kLW9yaWdpbiIsICJiYWNrZ3JvdW5kLXBvc2l0aW9uIiwKICAgICJiYWNrZ3JvdW5kLXJlcGVhdCIsICJiYWNrZ3JvdW5kLXNpemUiLCAiYmFzZWxpbmUtc2hpZnQiLCAiYmluZGluZyIsCiAgICAiYmxlZWQiLCAiYm9va21hcmstbGFiZWwiLCAiYm9va21hcmstbGV2ZWwiLCAiYm9va21hcmstc3RhdGUiLAogICAgImJvb2ttYXJrLXRhcmdldCIsICJib3JkZXIiLCAiYm9yZGVyLWJvdHRvbSIsICJib3JkZXItYm90dG9tLWNvbG9yIiwKICAgICJib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzIiwgImJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzIiwKICAgICJib3JkZXItYm90dG9tLXN0eWxlIiwgImJvcmRlci1ib3R0b20td2lkdGgiLCAiYm9yZGVyLWNvbGxhcHNlIiwKICAgICJib3JkZXItY29sb3IiLCAiYm9yZGVyLWltYWdlIiwgImJvcmRlci1pbWFnZS1vdXRzZXQiLAogICAgImJvcmRlci1pbWFnZS1yZXBlYXQiLCAiYm9yZGVyLWltYWdlLXNsaWNlIiwgImJvcmRlci1pbWFnZS1zb3VyY2UiLAogICAgImJvcmRlci1pbWFnZS13aWR0aCIsICJib3JkZXItbGVmdCIsICJib3JkZXItbGVmdC1jb2xvciIsCiAgICAiYm9yZGVyLWxlZnQtc3R5bGUiLCAiYm9yZGVyLWxlZnQtd2lkdGgiLCAiYm9yZGVyLXJhZGl1cyIsICJib3JkZXItcmlnaHQiLAogICAgImJvcmRlci1yaWdodC1jb2xvciIsICJib3JkZXItcmlnaHQtc3R5bGUiLCAiYm9yZGVyLXJpZ2h0LXdpZHRoIiwKICAgICJib3JkZXItc3BhY2luZyIsICJib3JkZXItc3R5bGUiLCAiYm9yZGVyLXRvcCIsICJib3JkZXItdG9wLWNvbG9yIiwKICAgICJib3JkZXItdG9wLWxlZnQtcmFkaXVzIiwgImJvcmRlci10b3AtcmlnaHQtcmFkaXVzIiwgImJvcmRlci10b3Atc3R5bGUiLAogICAgImJvcmRlci10b3Atd2lkdGgiLCAiYm9yZGVyLXdpZHRoIiwgImJvdHRvbSIsICJib3gtZGVjb3JhdGlvbi1icmVhayIsCiAgICAiYm94LXNoYWRvdyIsICJib3gtc2l6aW5nIiwgImJyZWFrLWFmdGVyIiwgImJyZWFrLWJlZm9yZSIsICJicmVhay1pbnNpZGUiLAogICAgImNhcHRpb24tc2lkZSIsICJjbGVhciIsICJjbGlwIiwgImNvbG9yIiwgImNvbG9yLXByb2ZpbGUiLCAiY29sdW1uLWNvdW50IiwKICAgICJjb2x1bW4tZmlsbCIsICJjb2x1bW4tZ2FwIiwgImNvbHVtbi1ydWxlIiwgImNvbHVtbi1ydWxlLWNvbG9yIiwKICAgICJjb2x1bW4tcnVsZS1zdHlsZSIsICJjb2x1bW4tcnVsZS13aWR0aCIsICJjb2x1bW4tc3BhbiIsICJjb2x1bW4td2lkdGgiLAogICAgImNvbHVtbnMiLCAiY29udGVudCIsICJjb3VudGVyLWluY3JlbWVudCIsICJjb3VudGVyLXJlc2V0IiwgImNyb3AiLCAiY3VlIiwKICAgICJjdWUtYWZ0ZXIiLCAiY3VlLWJlZm9yZSIsICJjdXJzb3IiLCAiZGlyZWN0aW9uIiwgImRpc3BsYXkiLAogICAgImRvbWluYW50LWJhc2VsaW5lIiwgImRyb3AtaW5pdGlhbC1hZnRlci1hZGp1c3QiLAogICAgImRyb3AtaW5pdGlhbC1hZnRlci1hbGlnbiIsICJkcm9wLWluaXRpYWwtYmVmb3JlLWFkanVzdCIsCiAgICAiZHJvcC1pbml0aWFsLWJlZm9yZS1hbGlnbiIsICJkcm9wLWluaXRpYWwtc2l6ZSIsICJkcm9wLWluaXRpYWwtdmFsdWUiLAogICAgImVsZXZhdGlvbiIsICJlbXB0eS1jZWxscyIsICJmaXQiLCAiZml0LXBvc2l0aW9uIiwgImZsZXgiLCAiZmxleC1iYXNpcyIsCiAgICAiZmxleC1kaXJlY3Rpb24iLCAiZmxleC1mbG93IiwgImZsZXgtZ3JvdyIsICJmbGV4LXNocmluayIsICJmbGV4LXdyYXAiLAogICAgImZsb2F0IiwgImZsb2F0LW9mZnNldCIsICJmbG93LWZyb20iLCAiZmxvdy1pbnRvIiwgImZvbnQiLCAiZm9udC1mZWF0dXJlLXNldHRpbmdzIiwKICAgICJmb250LWZhbWlseSIsICJmb250LWtlcm5pbmciLCAiZm9udC1sYW5ndWFnZS1vdmVycmlkZSIsICJmb250LXNpemUiLCAiZm9udC1zaXplLWFkanVzdCIsCiAgICAiZm9udC1zdHJldGNoIiwgImZvbnQtc3R5bGUiLCAiZm9udC1zeW50aGVzaXMiLCAiZm9udC12YXJpYW50IiwKICAgICJmb250LXZhcmlhbnQtYWx0ZXJuYXRlcyIsICJmb250LXZhcmlhbnQtY2FwcyIsICJmb250LXZhcmlhbnQtZWFzdC1hc2lhbiIsCiAgICAiZm9udC12YXJpYW50LWxpZ2F0dXJlcyIsICJmb250LXZhcmlhbnQtbnVtZXJpYyIsICJmb250LXZhcmlhbnQtcG9zaXRpb24iLAogICAgImZvbnQtd2VpZ2h0IiwgImdyaWQiLCAiZ3JpZC1hcmVhIiwgImdyaWQtYXV0by1jb2x1bW5zIiwgImdyaWQtYXV0by1mbG93IiwKICAgICJncmlkLWF1dG8tcG9zaXRpb24iLCAiZ3JpZC1hdXRvLXJvd3MiLCAiZ3JpZC1jb2x1bW4iLCAiZ3JpZC1jb2x1bW4tZW5kIiwKICAgICJncmlkLWNvbHVtbi1zdGFydCIsICJncmlkLXJvdyIsICJncmlkLXJvdy1lbmQiLCAiZ3JpZC1yb3ctc3RhcnQiLAogICAgImdyaWQtdGVtcGxhdGUiLCAiZ3JpZC10ZW1wbGF0ZS1hcmVhcyIsICJncmlkLXRlbXBsYXRlLWNvbHVtbnMiLAogICAgImdyaWQtdGVtcGxhdGUtcm93cyIsICJoYW5naW5nLXB1bmN0dWF0aW9uIiwgImhlaWdodCIsICJoeXBoZW5zIiwKICAgICJpY29uIiwgImltYWdlLW9yaWVudGF0aW9uIiwgImltYWdlLXJlbmRlcmluZyIsICJpbWFnZS1yZXNvbHV0aW9uIiwKICAgICJpbmxpbmUtYm94LWFsaWduIiwgImp1c3RpZnktY29udGVudCIsICJsZWZ0IiwgImxldHRlci1zcGFjaW5nIiwKICAgICJsaW5lLWJyZWFrIiwgImxpbmUtaGVpZ2h0IiwgImxpbmUtc3RhY2tpbmciLCAibGluZS1zdGFja2luZy1ydWJ5IiwKICAgICJsaW5lLXN0YWNraW5nLXNoaWZ0IiwgImxpbmUtc3RhY2tpbmctc3RyYXRlZ3kiLCAibGlzdC1zdHlsZSIsCiAgICAibGlzdC1zdHlsZS1pbWFnZSIsICJsaXN0LXN0eWxlLXBvc2l0aW9uIiwgImxpc3Qtc3R5bGUtdHlwZSIsICJtYXJnaW4iLAogICAgIm1hcmdpbi1ib3R0b20iLCAibWFyZ2luLWxlZnQiLCAibWFyZ2luLXJpZ2h0IiwgIm1hcmdpbi10b3AiLAogICAgIm1hcmtlci1vZmZzZXQiLCAibWFya3MiLCAibWFycXVlZS1kaXJlY3Rpb24iLCAibWFycXVlZS1sb29wIiwKICAgICJtYXJxdWVlLXBsYXktY291bnQiLCAibWFycXVlZS1zcGVlZCIsICJtYXJxdWVlLXN0eWxlIiwgIm1heC1oZWlnaHQiLAogICAgIm1heC13aWR0aCIsICJtaW4taGVpZ2h0IiwgIm1pbi13aWR0aCIsICJtb3ZlLXRvIiwgIm5hdi1kb3duIiwgIm5hdi1pbmRleCIsCiAgICAibmF2LWxlZnQiLCAibmF2LXJpZ2h0IiwgIm5hdi11cCIsICJvYmplY3QtZml0IiwgIm9iamVjdC1wb3NpdGlvbiIsCiAgICAib3BhY2l0eSIsICJvcmRlciIsICJvcnBoYW5zIiwgIm91dGxpbmUiLAogICAgIm91dGxpbmUtY29sb3IiLCAib3V0bGluZS1vZmZzZXQiLCAib3V0bGluZS1zdHlsZSIsICJvdXRsaW5lLXdpZHRoIiwKICAgICJvdmVyZmxvdyIsICJvdmVyZmxvdy1zdHlsZSIsICJvdmVyZmxvdy13cmFwIiwgIm92ZXJmbG93LXgiLCAib3ZlcmZsb3cteSIsCiAgICAicGFkZGluZyIsICJwYWRkaW5nLWJvdHRvbSIsICJwYWRkaW5nLWxlZnQiLCAicGFkZGluZy1yaWdodCIsICJwYWRkaW5nLXRvcCIsCiAgICAicGFnZSIsICJwYWdlLWJyZWFrLWFmdGVyIiwgInBhZ2UtYnJlYWstYmVmb3JlIiwgInBhZ2UtYnJlYWstaW5zaWRlIiwKICAgICJwYWdlLXBvbGljeSIsICJwYXVzZSIsICJwYXVzZS1hZnRlciIsICJwYXVzZS1iZWZvcmUiLCAicGVyc3BlY3RpdmUiLAogICAgInBlcnNwZWN0aXZlLW9yaWdpbiIsICJwaXRjaCIsICJwaXRjaC1yYW5nZSIsICJwbGF5LWR1cmluZyIsICJwb3NpdGlvbiIsCiAgICAicHJlc2VudGF0aW9uLWxldmVsIiwgInB1bmN0dWF0aW9uLXRyaW0iLCAicXVvdGVzIiwgInJlZ2lvbi1icmVhay1hZnRlciIsCiAgICAicmVnaW9uLWJyZWFrLWJlZm9yZSIsICJyZWdpb24tYnJlYWstaW5zaWRlIiwgInJlZ2lvbi1mcmFnbWVudCIsCiAgICAicmVuZGVyaW5nLWludGVudCIsICJyZXNpemUiLCAicmVzdCIsICJyZXN0LWFmdGVyIiwgInJlc3QtYmVmb3JlIiwgInJpY2huZXNzIiwKICAgICJyaWdodCIsICJyb3RhdGlvbiIsICJyb3RhdGlvbi1wb2ludCIsICJydWJ5LWFsaWduIiwgInJ1Ynktb3ZlcmhhbmciLAogICAgInJ1YnktcG9zaXRpb24iLCAicnVieS1zcGFuIiwgInNoYXBlLWltYWdlLXRocmVzaG9sZCIsICJzaGFwZS1pbnNpZGUiLCAic2hhcGUtbWFyZ2luIiwKICAgICJzaGFwZS1vdXRzaWRlIiwgInNpemUiLCAic3BlYWsiLCAic3BlYWstYXMiLCAic3BlYWstaGVhZGVyIiwKICAgICJzcGVhay1udW1lcmFsIiwgInNwZWFrLXB1bmN0dWF0aW9uIiwgInNwZWVjaC1yYXRlIiwgInN0cmVzcyIsICJzdHJpbmctc2V0IiwKICAgICJ0YWItc2l6ZSIsICJ0YWJsZS1sYXlvdXQiLCAidGFyZ2V0IiwgInRhcmdldC1uYW1lIiwgInRhcmdldC1uZXciLAogICAgInRhcmdldC1wb3NpdGlvbiIsICJ0ZXh0LWFsaWduIiwgInRleHQtYWxpZ24tbGFzdCIsICJ0ZXh0LWRlY29yYXRpb24iLAogICAgInRleHQtZGVjb3JhdGlvbi1jb2xvciIsICJ0ZXh0LWRlY29yYXRpb24tbGluZSIsICJ0ZXh0LWRlY29yYXRpb24tc2tpcCIsCiAgICAidGV4dC1kZWNvcmF0aW9uLXN0eWxlIiwgInRleHQtZW1waGFzaXMiLCAidGV4dC1lbXBoYXNpcy1jb2xvciIsCiAgICAidGV4dC1lbXBoYXNpcy1wb3NpdGlvbiIsICJ0ZXh0LWVtcGhhc2lzLXN0eWxlIiwgInRleHQtaGVpZ2h0IiwKICAgICJ0ZXh0LWluZGVudCIsICJ0ZXh0LWp1c3RpZnkiLCAidGV4dC1vdXRsaW5lIiwgInRleHQtb3ZlcmZsb3ciLCAidGV4dC1zaGFkb3ciLAogICAgInRleHQtc2l6ZS1hZGp1c3QiLCAidGV4dC1zcGFjZS1jb2xsYXBzZSIsICJ0ZXh0LXRyYW5zZm9ybSIsICJ0ZXh0LXVuZGVybGluZS1wb3NpdGlvbiIsCiAgICAidGV4dC13cmFwIiwgInRvcCIsICJ0cmFuc2Zvcm0iLCAidHJhbnNmb3JtLW9yaWdpbiIsICJ0cmFuc2Zvcm0tc3R5bGUiLAogICAgInRyYW5zaXRpb24iLCAidHJhbnNpdGlvbi1kZWxheSIsICJ0cmFuc2l0aW9uLWR1cmF0aW9uIiwKICAgICJ0cmFuc2l0aW9uLXByb3BlcnR5IiwgInRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uIiwgInVuaWNvZGUtYmlkaSIsCiAgICAidmVydGljYWwtYWxpZ24iLCAidmlzaWJpbGl0eSIsICJ2b2ljZS1iYWxhbmNlIiwgInZvaWNlLWR1cmF0aW9uIiwKICAgICJ2b2ljZS1mYW1pbHkiLCAidm9pY2UtcGl0Y2giLCAidm9pY2UtcmFuZ2UiLCAidm9pY2UtcmF0ZSIsICJ2b2ljZS1zdHJlc3MiLAogICAgInZvaWNlLXZvbHVtZSIsICJ2b2x1bWUiLCAid2hpdGUtc3BhY2UiLCAid2lkb3dzIiwgIndpZHRoIiwgIndvcmQtYnJlYWsiLAogICAgIndvcmQtc3BhY2luZyIsICJ3b3JkLXdyYXAiLCAiei1pbmRleCIsCiAgICAvLyBTVkctc3BlY2lmaWMKICAgICJjbGlwLXBhdGgiLCAiY2xpcC1ydWxlIiwgIm1hc2siLCAiZW5hYmxlLWJhY2tncm91bmQiLCAiZmlsdGVyIiwgImZsb29kLWNvbG9yIiwKICAgICJmbG9vZC1vcGFjaXR5IiwgImxpZ2h0aW5nLWNvbG9yIiwgInN0b3AtY29sb3IiLCAic3RvcC1vcGFjaXR5IiwgInBvaW50ZXItZXZlbnRzIiwKICAgICJjb2xvci1pbnRlcnBvbGF0aW9uIiwgImNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycyIsCiAgICAiY29sb3ItcmVuZGVyaW5nIiwgImZpbGwiLCAiZmlsbC1vcGFjaXR5IiwgImZpbGwtcnVsZSIsICJpbWFnZS1yZW5kZXJpbmciLAogICAgIm1hcmtlciIsICJtYXJrZXItZW5kIiwgIm1hcmtlci1taWQiLCAibWFya2VyLXN0YXJ0IiwgInNoYXBlLXJlbmRlcmluZyIsICJzdHJva2UiLAogICAgInN0cm9rZS1kYXNoYXJyYXkiLCAic3Ryb2tlLWRhc2hvZmZzZXQiLCAic3Ryb2tlLWxpbmVjYXAiLCAic3Ryb2tlLWxpbmVqb2luIiwKICAgICJzdHJva2UtbWl0ZXJsaW1pdCIsICJzdHJva2Utb3BhY2l0eSIsICJzdHJva2Utd2lkdGgiLCAidGV4dC1yZW5kZXJpbmciLAogICAgImJhc2VsaW5lLXNoaWZ0IiwgImRvbWluYW50LWJhc2VsaW5lIiwgImdseXBoLW9yaWVudGF0aW9uLWhvcml6b250YWwiLAogICAgImdseXBoLW9yaWVudGF0aW9uLXZlcnRpY2FsIiwgInRleHQtYW5jaG9yIiwgIndyaXRpbmctbW9kZSIKICBdLCBwcm9wZXJ0eUtleXdvcmRzID0ga2V5U2V0KHByb3BlcnR5S2V5d29yZHNfKTsKCiAgdmFyIG5vblN0YW5kYXJkUHJvcGVydHlLZXl3b3Jkc18gPSBbCiAgICAic2Nyb2xsYmFyLWFycm93LWNvbG9yIiwgInNjcm9sbGJhci1iYXNlLWNvbG9yIiwgInNjcm9sbGJhci1kYXJrLXNoYWRvdy1jb2xvciIsCiAgICAic2Nyb2xsYmFyLWZhY2UtY29sb3IiLCAic2Nyb2xsYmFyLWhpZ2hsaWdodC1jb2xvciIsICJzY3JvbGxiYXItc2hhZG93LWNvbG9yIiwKICAgICJzY3JvbGxiYXItM2QtbGlnaHQtY29sb3IiLCAic2Nyb2xsYmFyLXRyYWNrLWNvbG9yIiwgInNoYXBlLWluc2lkZSIsCiAgICAic2VhcmNoZmllbGQtY2FuY2VsLWJ1dHRvbiIsICJzZWFyY2hmaWVsZC1kZWNvcmF0aW9uIiwgInNlYXJjaGZpZWxkLXJlc3VsdHMtYnV0dG9uIiwKICAgICJzZWFyY2hmaWVsZC1yZXN1bHRzLWRlY29yYXRpb24iLCAiem9vbSIKICBdLCBub25TdGFuZGFyZFByb3BlcnR5S2V5d29yZHMgPSBrZXlTZXQobm9uU3RhbmRhcmRQcm9wZXJ0eUtleXdvcmRzXyk7CgogIHZhciBjb2xvcktleXdvcmRzXyA9IFsKICAgICJhbGljZWJsdWUiLCAiYW50aXF1ZXdoaXRlIiwgImFxdWEiLCAiYXF1YW1hcmluZSIsICJhenVyZSIsICJiZWlnZSIsCiAgICAiYmlzcXVlIiwgImJsYWNrIiwgImJsYW5jaGVkYWxtb25kIiwgImJsdWUiLCAiYmx1ZXZpb2xldCIsICJicm93biIsCiAgICAiYnVybHl3b29kIiwgImNhZGV0Ymx1ZSIsICJjaGFydHJldXNlIiwgImNob2NvbGF0ZSIsICJjb3JhbCIsICJjb3JuZmxvd2VyYmx1ZSIsCiAgICAiY29ybnNpbGsiLCAiY3JpbXNvbiIsICJjeWFuIiwgImRhcmtibHVlIiwgImRhcmtjeWFuIiwgImRhcmtnb2xkZW5yb2QiLAogICAgImRhcmtncmF5IiwgImRhcmtncmVlbiIsICJkYXJra2hha2kiLCAiZGFya21hZ2VudGEiLCAiZGFya29saXZlZ3JlZW4iLAogICAgImRhcmtvcmFuZ2UiLCAiZGFya29yY2hpZCIsICJkYXJrcmVkIiwgImRhcmtzYWxtb24iLCAiZGFya3NlYWdyZWVuIiwKICAgICJkYXJrc2xhdGVibHVlIiwgImRhcmtzbGF0ZWdyYXkiLCAiZGFya3R1cnF1b2lzZSIsICJkYXJrdmlvbGV0IiwKICAgICJkZWVwcGluayIsICJkZWVwc2t5Ymx1ZSIsICJkaW1ncmF5IiwgImRvZGdlcmJsdWUiLCAiZmlyZWJyaWNrIiwKICAgICJmbG9yYWx3aGl0ZSIsICJmb3Jlc3RncmVlbiIsICJmdWNoc2lhIiwgImdhaW5zYm9ybyIsICJnaG9zdHdoaXRlIiwKICAgICJnb2xkIiwgImdvbGRlbnJvZCIsICJncmF5IiwgImdyZXkiLCAiZ3JlZW4iLCAiZ3JlZW55ZWxsb3ciLCAiaG9uZXlkZXciLAogICAgImhvdHBpbmsiLCAiaW5kaWFucmVkIiwgImluZGlnbyIsICJpdm9yeSIsICJraGFraSIsICJsYXZlbmRlciIsCiAgICAibGF2ZW5kZXJibHVzaCIsICJsYXduZ3JlZW4iLCAibGVtb25jaGlmZm9uIiwgImxpZ2h0Ymx1ZSIsICJsaWdodGNvcmFsIiwKICAgICJsaWdodGN5YW4iLCAibGlnaHRnb2xkZW5yb2R5ZWxsb3ciLCAibGlnaHRncmF5IiwgImxpZ2h0Z3JlZW4iLCAibGlnaHRwaW5rIiwKICAgICJsaWdodHNhbG1vbiIsICJsaWdodHNlYWdyZWVuIiwgImxpZ2h0c2t5Ymx1ZSIsICJsaWdodHNsYXRlZ3JheSIsCiAgICAibGlnaHRzdGVlbGJsdWUiLCAibGlnaHR5ZWxsb3ciLCAibGltZSIsICJsaW1lZ3JlZW4iLCAibGluZW4iLCAibWFnZW50YSIsCiAgICAibWFyb29uIiwgIm1lZGl1bWFxdWFtYXJpbmUiLCAibWVkaXVtYmx1ZSIsICJtZWRpdW1vcmNoaWQiLCAibWVkaXVtcHVycGxlIiwKICAgICJtZWRpdW1zZWFncmVlbiIsICJtZWRpdW1zbGF0ZWJsdWUiLCAibWVkaXVtc3ByaW5nZ3JlZW4iLCAibWVkaXVtdHVycXVvaXNlIiwKICAgICJtZWRpdW12aW9sZXRyZWQiLCAibWlkbmlnaHRibHVlIiwgIm1pbnRjcmVhbSIsICJtaXN0eXJvc2UiLCAibW9jY2FzaW4iLAogICAgIm5hdmFqb3doaXRlIiwgIm5hdnkiLCAib2xkbGFjZSIsICJvbGl2ZSIsICJvbGl2ZWRyYWIiLCAib3JhbmdlIiwgIm9yYW5nZXJlZCIsCiAgICAib3JjaGlkIiwgInBhbGVnb2xkZW5yb2QiLCAicGFsZWdyZWVuIiwgInBhbGV0dXJxdW9pc2UiLCAicGFsZXZpb2xldHJlZCIsCiAgICAicGFwYXlhd2hpcCIsICJwZWFjaHB1ZmYiLCAicGVydSIsICJwaW5rIiwgInBsdW0iLCAicG93ZGVyYmx1ZSIsCiAgICAicHVycGxlIiwgInJlYmVjY2FwdXJwbGUiLCAicmVkIiwgInJvc3licm93biIsICJyb3lhbGJsdWUiLCAic2FkZGxlYnJvd24iLAogICAgInNhbG1vbiIsICJzYW5keWJyb3duIiwgInNlYWdyZWVuIiwgInNlYXNoZWxsIiwgInNpZW5uYSIsICJzaWx2ZXIiLCAic2t5Ymx1ZSIsCiAgICAic2xhdGVibHVlIiwgInNsYXRlZ3JheSIsICJzbm93IiwgInNwcmluZ2dyZWVuIiwgInN0ZWVsYmx1ZSIsICJ0YW4iLAogICAgInRlYWwiLCAidGhpc3RsZSIsICJ0b21hdG8iLCAidHVycXVvaXNlIiwgInZpb2xldCIsICJ3aGVhdCIsICJ3aGl0ZSIsCiAgICAid2hpdGVzbW9rZSIsICJ5ZWxsb3ciLCAieWVsbG93Z3JlZW4iCiAgXSwgY29sb3JLZXl3b3JkcyA9IGtleVNldChjb2xvcktleXdvcmRzXyk7CgogIHZhciB2YWx1ZUtleXdvcmRzXyA9IFsKICAgICJhYm92ZSIsICJhYnNvbHV0ZSIsICJhY3RpdmVib3JkZXIiLCAiYWN0aXZlY2FwdGlvbiIsICJhZmFyIiwKICAgICJhZnRlci13aGl0ZS1zcGFjZSIsICJhaGVhZCIsICJhbGlhcyIsICJhbGwiLCAiYWxsLXNjcm9sbCIsICJhbHRlcm5hdGUiLAogICAgImFsd2F5cyIsICJhbWhhcmljIiwgImFtaGFyaWMtYWJlZ2VkZSIsICJhbnRpYWxpYXNlZCIsICJhcHB3b3Jrc3BhY2UiLAogICAgImFyYWJpYy1pbmRpYyIsICJhcm1lbmlhbiIsICJhc3Rlcmlza3MiLCAiYXV0byIsICJhdm9pZCIsICJhdm9pZC1jb2x1bW4iLCAiYXZvaWQtcGFnZSIsCiAgICAiYXZvaWQtcmVnaW9uIiwgImJhY2tncm91bmQiLCAiYmFja3dhcmRzIiwgImJhc2VsaW5lIiwgImJlbG93IiwgImJpZGktb3ZlcnJpZGUiLCAiYmluYXJ5IiwKICAgICJiZW5nYWxpIiwgImJsaW5rIiwgImJsb2NrIiwgImJsb2NrLWF4aXMiLCAiYm9sZCIsICJib2xkZXIiLCAiYm9yZGVyIiwgImJvcmRlci1ib3giLAogICAgImJvdGgiLCAiYm90dG9tIiwgImJyZWFrIiwgImJyZWFrLWFsbCIsICJicmVhay13b3JkIiwgImJ1dHRvbiIsICJidXR0b24tYmV2ZWwiLAogICAgImJ1dHRvbmZhY2UiLCAiYnV0dG9uaGlnaGxpZ2h0IiwgImJ1dHRvbnNoYWRvdyIsICJidXR0b250ZXh0IiwgImNhbWJvZGlhbiIsCiAgICAiY2FwaXRhbGl6ZSIsICJjYXBzLWxvY2staW5kaWNhdG9yIiwgImNhcHRpb24iLCAiY2FwdGlvbnRleHQiLCAiY2FyZXQiLAogICAgImNlbGwiLCAiY2VudGVyIiwgImNoZWNrYm94IiwgImNpcmNsZSIsICJjamstZWFydGhseS1icmFuY2giLAogICAgImNqay1oZWF2ZW5seS1zdGVtIiwgImNqay1pZGVvZ3JhcGhpYyIsICJjbGVhciIsICJjbGlwIiwgImNsb3NlLXF1b3RlIiwKICAgICJjb2wtcmVzaXplIiwgImNvbGxhcHNlIiwgImNvbHVtbiIsICJjb21wYWN0IiwgImNvbmRlbnNlZCIsICJjb250YWluIiwgImNvbnRlbnQiLAogICAgImNvbnRlbnQtYm94IiwgImNvbnRleHQtbWVudSIsICJjb250aW51b3VzIiwgImNvcHkiLCAiY292ZXIiLCAiY3JvcCIsCiAgICAiY3Jvc3MiLCAiY3Jvc3NoYWlyIiwgImN1cnJlbnRjb2xvciIsICJjdXJzaXZlIiwgImRhc2hlZCIsICJkZWNpbWFsIiwKICAgICJkZWNpbWFsLWxlYWRpbmctemVybyIsICJkZWZhdWx0IiwgImRlZmF1bHQtYnV0dG9uIiwgImRlc3RpbmF0aW9uLWF0b3AiLAogICAgImRlc3RpbmF0aW9uLWluIiwgImRlc3RpbmF0aW9uLW91dCIsICJkZXN0aW5hdGlvbi1vdmVyIiwgImRldmFuYWdhcmkiLAogICAgImRpc2MiLCAiZGlzY2FyZCIsICJkb2N1bWVudCIsICJkb3QtZGFzaCIsICJkb3QtZG90LWRhc2giLCAiZG90dGVkIiwKICAgICJkb3VibGUiLCAiZG93biIsICJlLXJlc2l6ZSIsICJlYXNlIiwgImVhc2UtaW4iLCAiZWFzZS1pbi1vdXQiLCAiZWFzZS1vdXQiLAogICAgImVsZW1lbnQiLCAiZWxsaXBzZSIsICJlbGxpcHNpcyIsICJlbWJlZCIsICJlbmQiLCAiZXRoaW9waWMiLCAiZXRoaW9waWMtYWJlZ2VkZSIsCiAgICAiZXRoaW9waWMtYWJlZ2VkZS1hbS1ldCIsICJldGhpb3BpYy1hYmVnZWRlLWdleiIsICJldGhpb3BpYy1hYmVnZWRlLXRpLWVyIiwKICAgICJldGhpb3BpYy1hYmVnZWRlLXRpLWV0IiwgImV0aGlvcGljLWhhbGVoYW1lLWFhLWVyIiwKICAgICJldGhpb3BpYy1oYWxlaGFtZS1hYS1ldCIsICJldGhpb3BpYy1oYWxlaGFtZS1hbS1ldCIsCiAgICAiZXRoaW9waWMtaGFsZWhhbWUtZ2V6IiwgImV0aGlvcGljLWhhbGVoYW1lLW9tLWV0IiwKICAgICJldGhpb3BpYy1oYWxlaGFtZS1zaWQtZXQiLCAiZXRoaW9waWMtaGFsZWhhbWUtc28tZXQiLAogICAgImV0aGlvcGljLWhhbGVoYW1lLXRpLWVyIiwgImV0aGlvcGljLWhhbGVoYW1lLXRpLWV0IiwKICAgICJldGhpb3BpYy1oYWxlaGFtZS10aWciLCAiZXctcmVzaXplIiwgImV4cGFuZGVkIiwgImV4dHJhLWNvbmRlbnNlZCIsCiAgICAiZXh0cmEtZXhwYW5kZWQiLCAiZmFudGFzeSIsICJmYXN0IiwgImZpbGwiLCAiZml4ZWQiLCAiZmxhdCIsICJmb290bm90ZXMiLAogICAgImZvcndhcmRzIiwgImZyb20iLCAiZ2VvbWV0cmljUHJlY2lzaW9uIiwgImdlb3JnaWFuIiwgImdyYXl0ZXh0IiwgImdyb292ZSIsCiAgICAiZ3VqYXJhdGkiLCAiZ3VybXVraGkiLCAiaGFuZCIsICJoYW5ndWwiLCAiaGFuZ3VsLWNvbnNvbmFudCIsICJoZWJyZXciLAogICAgImhlbHAiLCAiaGlkZGVuIiwgImhpZGUiLCAiaGlnaGVyIiwgImhpZ2hsaWdodCIsICJoaWdobGlnaHR0ZXh0IiwKICAgICJoaXJhZ2FuYSIsICJoaXJhZ2FuYS1pcm9oYSIsICJob3Jpem9udGFsIiwgImhzbCIsICJoc2xhIiwgImljb24iLCAiaWdub3JlIiwKICAgICJpbmFjdGl2ZWJvcmRlciIsICJpbmFjdGl2ZWNhcHRpb24iLCAiaW5hY3RpdmVjYXB0aW9udGV4dCIsICJpbmZpbml0ZSIsCiAgICAiaW5mb2JhY2tncm91bmQiLCAiaW5mb3RleHQiLCAiaW5oZXJpdCIsICJpbml0aWFsIiwgImlubGluZSIsICJpbmxpbmUtYXhpcyIsCiAgICAiaW5saW5lLWJsb2NrIiwgImlubGluZS10YWJsZSIsICJpbnNldCIsICJpbnNpZGUiLCAiaW50cmluc2ljIiwgImludmVydCIsCiAgICAiaXRhbGljIiwgImp1c3RpZnkiLCAia2FubmFkYSIsICJrYXRha2FuYSIsICJrYXRha2FuYS1pcm9oYSIsICJrZWVwLWFsbCIsICJraG1lciIsCiAgICAibGFuZHNjYXBlIiwgImxhbyIsICJsYXJnZSIsICJsYXJnZXIiLCAibGVmdCIsICJsZXZlbCIsICJsaWdodGVyIiwKICAgICJsaW5lLXRocm91Z2giLCAibGluZWFyIiwgImxpbmVzIiwgImxpc3QtaXRlbSIsICJsaXN0Ym94IiwgImxpc3RpdGVtIiwKICAgICJsb2NhbCIsICJsb2dpY2FsIiwgImxvdWQiLCAibG93ZXIiLCAibG93ZXItYWxwaGEiLCAibG93ZXItYXJtZW5pYW4iLAogICAgImxvd2VyLWdyZWVrIiwgImxvd2VyLWhleGFkZWNpbWFsIiwgImxvd2VyLWxhdGluIiwgImxvd2VyLW5vcndlZ2lhbiIsCiAgICAibG93ZXItcm9tYW4iLCAibG93ZXJjYXNlIiwgImx0ciIsICJtYWxheWFsYW0iLCAibWF0Y2giLAogICAgIm1lZGlhLWNvbnRyb2xzLWJhY2tncm91bmQiLCAibWVkaWEtY3VycmVudC10aW1lLWRpc3BsYXkiLAogICAgIm1lZGlhLWZ1bGxzY3JlZW4tYnV0dG9uIiwgIm1lZGlhLW11dGUtYnV0dG9uIiwgIm1lZGlhLXBsYXktYnV0dG9uIiwKICAgICJtZWRpYS1yZXR1cm4tdG8tcmVhbHRpbWUtYnV0dG9uIiwgIm1lZGlhLXJld2luZC1idXR0b24iLAogICAgIm1lZGlhLXNlZWstYmFjay1idXR0b24iLCAibWVkaWEtc2Vlay1mb3J3YXJkLWJ1dHRvbiIsICJtZWRpYS1zbGlkZXIiLAogICAgIm1lZGlhLXNsaWRlcnRodW1iIiwgIm1lZGlhLXRpbWUtcmVtYWluaW5nLWRpc3BsYXkiLCAibWVkaWEtdm9sdW1lLXNsaWRlciIsCiAgICAibWVkaWEtdm9sdW1lLXNsaWRlci1jb250YWluZXIiLCAibWVkaWEtdm9sdW1lLXNsaWRlcnRodW1iIiwgIm1lZGl1bSIsCiAgICAibWVudSIsICJtZW51bGlzdCIsICJtZW51bGlzdC1idXR0b24iLCAibWVudWxpc3QtdGV4dCIsCiAgICAibWVudWxpc3QtdGV4dGZpZWxkIiwgIm1lbnV0ZXh0IiwgIm1lc3NhZ2UtYm94IiwgIm1pZGRsZSIsICJtaW4taW50cmluc2ljIiwKICAgICJtaXgiLCAibW9uZ29saWFuIiwgIm1vbm9zcGFjZSIsICJtb3ZlIiwgIm11bHRpcGxlIiwgIm15YW5tYXIiLCAibi1yZXNpemUiLAogICAgIm5hcnJvd2VyIiwgIm5lLXJlc2l6ZSIsICJuZXN3LXJlc2l6ZSIsICJuby1jbG9zZS1xdW90ZSIsICJuby1kcm9wIiwKICAgICJuby1vcGVuLXF1b3RlIiwgIm5vLXJlcGVhdCIsICJub25lIiwgIm5vcm1hbCIsICJub3QtYWxsb3dlZCIsICJub3dyYXAiLAogICAgIm5zLXJlc2l6ZSIsICJudy1yZXNpemUiLCAibndzZS1yZXNpemUiLCAib2JsaXF1ZSIsICJvY3RhbCIsICJvcGVuLXF1b3RlIiwKICAgICJvcHRpbWl6ZUxlZ2liaWxpdHkiLCAib3B0aW1pemVTcGVlZCIsICJvcml5YSIsICJvcm9tbyIsICJvdXRzZXQiLAogICAgIm91dHNpZGUiLCAib3V0c2lkZS1zaGFwZSIsICJvdmVybGF5IiwgIm92ZXJsaW5lIiwgInBhZGRpbmciLCAicGFkZGluZy1ib3giLAogICAgInBhaW50ZWQiLCAicGFnZSIsICJwYXVzZWQiLCAicGVyc2lhbiIsICJwbHVzLWRhcmtlciIsICJwbHVzLWxpZ2h0ZXIiLCAicG9pbnRlciIsCiAgICAicG9seWdvbiIsICJwb3J0cmFpdCIsICJwcmUiLCAicHJlLWxpbmUiLCAicHJlLXdyYXAiLCAicHJlc2VydmUtM2QiLCAicHJvZ3Jlc3MiLCAicHVzaC1idXR0b24iLAogICAgInJhZGlvIiwgInJlYWQtb25seSIsICJyZWFkLXdyaXRlIiwgInJlYWQtd3JpdGUtcGxhaW50ZXh0LW9ubHkiLCAicmVjdGFuZ2xlIiwgInJlZ2lvbiIsCiAgICAicmVsYXRpdmUiLCAicmVwZWF0IiwgInJlcGVhdC14IiwgInJlcGVhdC15IiwgInJlc2V0IiwgInJldmVyc2UiLCAicmdiIiwgInJnYmEiLAogICAgInJpZGdlIiwgInJpZ2h0IiwgInJvdW5kIiwgInJvdy1yZXNpemUiLCAicnRsIiwgInJ1bi1pbiIsICJydW5uaW5nIiwKICAgICJzLXJlc2l6ZSIsICJzYW5zLXNlcmlmIiwgInNjcm9sbCIsICJzY3JvbGxiYXIiLCAic2UtcmVzaXplIiwgInNlYXJjaGZpZWxkIiwKICAgICJzZWFyY2hmaWVsZC1jYW5jZWwtYnV0dG9uIiwgInNlYXJjaGZpZWxkLWRlY29yYXRpb24iLAogICAgInNlYXJjaGZpZWxkLXJlc3VsdHMtYnV0dG9uIiwgInNlYXJjaGZpZWxkLXJlc3VsdHMtZGVjb3JhdGlvbiIsCiAgICAic2VtaS1jb25kZW5zZWQiLCAic2VtaS1leHBhbmRlZCIsICJzZXBhcmF0ZSIsICJzZXJpZiIsICJzaG93IiwgInNpZGFtYSIsCiAgICAic2luZ2xlIiwgInNraXAtd2hpdGUtc3BhY2UiLCAic2xpZGUiLCAic2xpZGVyLWhvcml6b250YWwiLAogICAgInNsaWRlci12ZXJ0aWNhbCIsICJzbGlkZXJ0aHVtYi1ob3Jpem9udGFsIiwgInNsaWRlcnRodW1iLXZlcnRpY2FsIiwgInNsb3ciLAogICAgInNtYWxsIiwgInNtYWxsLWNhcHMiLCAic21hbGwtY2FwdGlvbiIsICJzbWFsbGVyIiwgInNvbGlkIiwgInNvbWFsaSIsCiAgICAic291cmNlLWF0b3AiLCAic291cmNlLWluIiwgInNvdXJjZS1vdXQiLCAic291cmNlLW92ZXIiLCAic3BhY2UiLCAic3F1YXJlIiwKICAgICJzcXVhcmUtYnV0dG9uIiwgInN0YXJ0IiwgInN0YXRpYyIsICJzdGF0dXMtYmFyIiwgInN0cmV0Y2giLCAic3Ryb2tlIiwKICAgICJzdWIiLCAic3VicGl4ZWwtYW50aWFsaWFzZWQiLCAic3VwZXIiLCAic3ctcmVzaXplIiwgInRhYmxlIiwKICAgICJ0YWJsZS1jYXB0aW9uIiwgInRhYmxlLWNlbGwiLCAidGFibGUtY29sdW1uIiwgInRhYmxlLWNvbHVtbi1ncm91cCIsCiAgICAidGFibGUtZm9vdGVyLWdyb3VwIiwgInRhYmxlLWhlYWRlci1ncm91cCIsICJ0YWJsZS1yb3ciLCAidGFibGUtcm93LWdyb3VwIiwKICAgICJ0ZWx1Z3UiLCAidGV4dCIsICJ0ZXh0LWJvdHRvbSIsICJ0ZXh0LXRvcCIsICJ0ZXh0YXJlYSIsICJ0ZXh0ZmllbGQiLCAidGhhaSIsCiAgICAidGhpY2siLCAidGhpbiIsICJ0aHJlZWRkYXJrc2hhZG93IiwgInRocmVlZGZhY2UiLCAidGhyZWVkaGlnaGxpZ2h0IiwKICAgICJ0aHJlZWRsaWdodHNoYWRvdyIsICJ0aHJlZWRzaGFkb3ciLCAidGliZXRhbiIsICJ0aWdyZSIsICJ0aWdyaW55YS1lciIsCiAgICAidGlncmlueWEtZXItYWJlZ2VkZSIsICJ0aWdyaW55YS1ldCIsICJ0aWdyaW55YS1ldC1hYmVnZWRlIiwgInRvIiwgInRvcCIsCiAgICAidHJhbnNwYXJlbnQiLCAidWx0cmEtY29uZGVuc2VkIiwgInVsdHJhLWV4cGFuZGVkIiwgInVuZGVybGluZSIsICJ1cCIsCiAgICAidXBwZXItYWxwaGEiLCAidXBwZXItYXJtZW5pYW4iLCAidXBwZXItZ3JlZWsiLCAidXBwZXItaGV4YWRlY2ltYWwiLAogICAgInVwcGVyLWxhdGluIiwgInVwcGVyLW5vcndlZ2lhbiIsICJ1cHBlci1yb21hbiIsICJ1cHBlcmNhc2UiLCAidXJkdSIsICJ1cmwiLAogICAgInZlcnRpY2FsIiwgInZlcnRpY2FsLXRleHQiLCAidmlzaWJsZSIsICJ2aXNpYmxlRmlsbCIsICJ2aXNpYmxlUGFpbnRlZCIsCiAgICAidmlzaWJsZVN0cm9rZSIsICJ2aXN1YWwiLCAidy1yZXNpemUiLCAid2FpdCIsICJ3YXZlIiwgIndpZGVyIiwKICAgICJ3aW5kb3ciLCAid2luZG93ZnJhbWUiLCAid2luZG93dGV4dCIsICJ4LWxhcmdlIiwgIngtc21hbGwiLCAieG9yIiwKICAgICJ4eC1sYXJnZSIsICJ4eC1zbWFsbCIKICBdLCB2YWx1ZUtleXdvcmRzID0ga2V5U2V0KHZhbHVlS2V5d29yZHNfKTsKCiAgdmFyIGZvbnRQcm9wZXJ0aWVzXyA9IFsKICAgICJmb250LWZhbWlseSIsICJzcmMiLCAidW5pY29kZS1yYW5nZSIsICJmb250LXZhcmlhbnQiLCAiZm9udC1mZWF0dXJlLXNldHRpbmdzIiwKICAgICJmb250LXN0cmV0Y2giLCAiZm9udC13ZWlnaHQiLCAiZm9udC1zdHlsZSIKICBdLCBmb250UHJvcGVydGllcyA9IGtleVNldChmb250UHJvcGVydGllc18pOwoKICB2YXIgYWxsV29yZHMgPSBtZWRpYVR5cGVzXy5jb25jYXQobWVkaWFGZWF0dXJlc18pLmNvbmNhdChwcm9wZXJ0eUtleXdvcmRzXykKICAgIC5jb25jYXQobm9uU3RhbmRhcmRQcm9wZXJ0eUtleXdvcmRzXykuY29uY2F0KGNvbG9yS2V5d29yZHNfKS5jb25jYXQodmFsdWVLZXl3b3Jkc18pOwogIENvZGVNaXJyb3IucmVnaXN0ZXJIZWxwZXIoImhpbnRXb3JkcyIsICJjc3MiLCBhbGxXb3Jkcyk7CgogIGZ1bmN0aW9uIHRva2VuQ0NvbW1lbnQoc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIG1heWJlRW5kID0gZmFsc2UsIGNoOwogICAgd2hpbGUgKChjaCA9IHN0cmVhbS5uZXh0KCkpICE9IG51bGwpIHsKICAgICAgaWYgKG1heWJlRW5kICYmIGNoID09ICIvIikgewogICAgICAgIHN0YXRlLnRva2VuaXplID0gbnVsbDsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBtYXliZUVuZCA9IChjaCA9PSAiKiIpOwogICAgfQogICAgcmV0dXJuIFsiY29tbWVudCIsICJjb21tZW50Il07CiAgfQoKICBmdW5jdGlvbiB0b2tlblNHTUxDb21tZW50KHN0cmVhbSwgc3RhdGUpIHsKICAgIGlmIChzdHJlYW0uc2tpcFRvKCItLT4iKSkgewogICAgICBzdHJlYW0ubWF0Y2goIi0tPiIpOwogICAgICBzdGF0ZS50b2tlbml6ZSA9IG51bGw7CiAgICB9IGVsc2UgewogICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICB9CiAgICByZXR1cm4gWyJjb21tZW50IiwgImNvbW1lbnQiXTsKICB9CgogIENvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC9jc3MiLCB7CiAgICBtZWRpYVR5cGVzOiBtZWRpYVR5cGVzLAogICAgbWVkaWFGZWF0dXJlczogbWVkaWFGZWF0dXJlcywKICAgIHByb3BlcnR5S2V5d29yZHM6IHByb3BlcnR5S2V5d29yZHMsCiAgICBub25TdGFuZGFyZFByb3BlcnR5S2V5d29yZHM6IG5vblN0YW5kYXJkUHJvcGVydHlLZXl3b3JkcywKICAgIGNvbG9yS2V5d29yZHM6IGNvbG9yS2V5d29yZHMsCiAgICB2YWx1ZUtleXdvcmRzOiB2YWx1ZUtleXdvcmRzLAogICAgZm9udFByb3BlcnRpZXM6IGZvbnRQcm9wZXJ0aWVzLAogICAgdG9rZW5Ib29rczogewogICAgICAiPCI6IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgICBpZiAoIXN0cmVhbS5tYXRjaCgiIS0tIikpIHJldHVybiBmYWxzZTsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuU0dNTENvbW1lbnQ7CiAgICAgICAgcmV0dXJuIHRva2VuU0dNTENvbW1lbnQoc3RyZWFtLCBzdGF0ZSk7CiAgICAgIH0sCiAgICAgICIvIjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICAgIGlmICghc3RyZWFtLmVhdCgiKiIpKSByZXR1cm4gZmFsc2U7CiAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkNDb21tZW50OwogICAgICAgIHJldHVybiB0b2tlbkNDb21tZW50KHN0cmVhbSwgc3RhdGUpOwogICAgICB9CiAgICB9LAogICAgbmFtZTogImNzcyIKICB9KTsKCiAgQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtc2NzcyIsIHsKICAgIG1lZGlhVHlwZXM6IG1lZGlhVHlwZXMsCiAgICBtZWRpYUZlYXR1cmVzOiBtZWRpYUZlYXR1cmVzLAogICAgcHJvcGVydHlLZXl3b3JkczogcHJvcGVydHlLZXl3b3JkcywKICAgIG5vblN0YW5kYXJkUHJvcGVydHlLZXl3b3Jkczogbm9uU3RhbmRhcmRQcm9wZXJ0eUtleXdvcmRzLAogICAgY29sb3JLZXl3b3JkczogY29sb3JLZXl3b3JkcywKICAgIHZhbHVlS2V5d29yZHM6IHZhbHVlS2V5d29yZHMsCiAgICBmb250UHJvcGVydGllczogZm9udFByb3BlcnRpZXMsCiAgICBhbGxvd05lc3RlZDogdHJ1ZSwKICAgIHRva2VuSG9va3M6IHsKICAgICAgIi8iOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgICAgaWYgKHN0cmVhbS5lYXQoIi8iKSkgewogICAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICAgICAgcmV0dXJuIFsiY29tbWVudCIsICJjb21tZW50Il07CiAgICAgICAgfSBlbHNlIGlmIChzdHJlYW0uZWF0KCIqIikpIHsKICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5DQ29tbWVudDsKICAgICAgICAgIHJldHVybiB0b2tlbkNDb21tZW50KHN0cmVhbSwgc3RhdGUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gWyJvcGVyYXRvciIsICJvcGVyYXRvciJdOwogICAgICAgIH0KICAgICAgfSwKICAgICAgIjoiOiBmdW5jdGlvbihzdHJlYW0pIHsKICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKC9ccypcey8pKQogICAgICAgICAgcmV0dXJuIFtudWxsLCAieyJdOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfSwKICAgICAgIiQiOiBmdW5jdGlvbihzdHJlYW0pIHsKICAgICAgICBzdHJlYW0ubWF0Y2goL15bXHctXSsvKTsKICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eXHMqOi8sIGZhbHNlKSkKICAgICAgICAgIHJldHVybiBbInZhcmlhYmxlLTIiLCAidmFyaWFibGUtZGVmaW5pdGlvbiJdOwogICAgICAgIHJldHVybiBbInZhcmlhYmxlLTIiLCAidmFyaWFibGUiXTsKICAgICAgfSwKICAgICAgIiMiOiBmdW5jdGlvbihzdHJlYW0pIHsKICAgICAgICBpZiAoIXN0cmVhbS5lYXQoInsiKSkgcmV0dXJuIGZhbHNlOwogICAgICAgIHJldHVybiBbbnVsbCwgImludGVycG9sYXRpb24iXTsKICAgICAgfQogICAgfSwKICAgIG5hbWU6ICJjc3MiLAogICAgaGVscGVyVHlwZTogInNjc3MiCiAgfSk7CgogIENvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC94LWxlc3MiLCB7CiAgICBtZWRpYVR5cGVzOiBtZWRpYVR5cGVzLAogICAgbWVkaWFGZWF0dXJlczogbWVkaWFGZWF0dXJlcywKICAgIHByb3BlcnR5S2V5d29yZHM6IHByb3BlcnR5S2V5d29yZHMsCiAgICBub25TdGFuZGFyZFByb3BlcnR5S2V5d29yZHM6IG5vblN0YW5kYXJkUHJvcGVydHlLZXl3b3JkcywKICAgIGNvbG9yS2V5d29yZHM6IGNvbG9yS2V5d29yZHMsCiAgICB2YWx1ZUtleXdvcmRzOiB2YWx1ZUtleXdvcmRzLAogICAgZm9udFByb3BlcnRpZXM6IGZvbnRQcm9wZXJ0aWVzLAogICAgYWxsb3dOZXN0ZWQ6IHRydWUsCiAgICB0b2tlbkhvb2tzOiB7CiAgICAgICIvIjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICAgIGlmIChzdHJlYW0uZWF0KCIvIikpIHsKICAgICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgICAgIHJldHVybiBbImNvbW1lbnQiLCAiY29tbWVudCJdOwogICAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLmVhdCgiKiIpKSB7CiAgICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQ0NvbW1lbnQ7CiAgICAgICAgICByZXR1cm4gdG9rZW5DQ29tbWVudChzdHJlYW0sIHN0YXRlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIFsib3BlcmF0b3IiLCAib3BlcmF0b3IiXTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgICJAIjogZnVuY3Rpb24oc3RyZWFtKSB7CiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXihjaGFyc2V0fGRvY3VtZW50fGZvbnQtZmFjZXxpbXBvcnR8KC0obW96fG1zfG98d2Via2l0KS0pP2tleWZyYW1lc3xtZWRpYXxuYW1lc3BhY2V8cGFnZXxzdXBwb3J0cylcYi8sIGZhbHNlKSkgcmV0dXJuIGZhbHNlOwogICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1x3XFxcLV0vKTsKICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eXHMqOi8sIGZhbHNlKSkKICAgICAgICAgIHJldHVybiBbInZhcmlhYmxlLTIiLCAidmFyaWFibGUtZGVmaW5pdGlvbiJdOwogICAgICAgIHJldHVybiBbInZhcmlhYmxlLTIiLCAidmFyaWFibGUiXTsKICAgICAgfSwKICAgICAgIiYiOiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gWyJhdG9tIiwgImF0b20iXTsKICAgICAgfQogICAgfSwKICAgIG5hbWU6ICJjc3MiLAogICAgaGVscGVyVHlwZTogImxlc3MiCiAgfSk7Cgp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/css/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogQ1NTIG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iY3NzLmpzIj48L3NjcmlwdD4KPHN0eWxlPi5Db2RlTWlycm9yIHtiYWNrZ3JvdW5kOiAjZjhmOGY4O308L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5DU1M8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPkNTUyBtb2RlPC9oMj4KPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KLyogU29tZSBleGFtcGxlIENTUyAqLwoKQGltcG9ydCB1cmwoInNvbWV0aGluZy5jc3MiKTsKCmJvZHkgewogIG1hcmdpbjogMDsKICBwYWRkaW5nOiAzZW0gNmVtOwogIGZvbnQtZmFtaWx5OiB0YWhvbWEsIGFyaWFsLCBzYW5zLXNlcmlmOwogIGNvbG9yOiAjMDAwOwp9CgojbmF2aWdhdGlvbiBhIHsKICBmb250LXdlaWdodDogYm9sZDsKICB0ZXh0LWRlY29yYXRpb246IG5vbmUgIWltcG9ydGFudDsKfQoKaDEgewogIGZvbnQtc2l6ZTogMi41ZW07Cn0KCmgyIHsKICBmb250LXNpemU6IDEuN2VtOwp9CgpoMTpiZWZvcmUsIGgyOmJlZm9yZSB7CiAgY29udGVudDogIjo6IjsKfQoKY29kZSB7CiAgZm9udC1mYW1pbHk6IGNvdXJpZXIsIG1vbm9zcGFjZTsKICBmb250LXNpemU6IDgwJTsKICBjb2xvcjogIzQxOEE4QTsKfQo8L3RleHRhcmVhPjwvZm9ybT4KICAgIDxzY3JpcHQ+CiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7fSk7CiAgICA8L3NjcmlwdD4KCiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC9jc3M8L2NvZGU+LCA8Y29kZT50ZXh0L3gtc2NzczwvY29kZT4gKDxhIGhyZWY9InNjc3MuaHRtbCI+ZGVtbzwvYT4pLCA8Y29kZT50ZXh0L3gtbGVzczwvY29kZT4gKDxhIGhyZWY9Imxlc3MuaHRtbCI+ZGVtbzwvYT4pLjwvcD4KCiAgICA8cD48c3Ryb25nPlBhcnNpbmcvSGlnaGxpZ2h0aW5nIFRlc3RzOjwvc3Ryb25nPiA8YSBocmVmPSIuLi8uLi90ZXN0L2luZGV4Lmh0bWwjY3NzXyoiPm5vcm1hbDwvYT4sICA8YSBocmVmPSIuLi8uLi90ZXN0L2luZGV4Lmh0bWwjdmVyYm9zZSxjc3NfKiI+dmVyYm9zZTwvYT4uPC9wPgoKICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/css/less.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogTEVTUyBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uLy4uL2FkZG9uL2VkaXQvbWF0Y2hicmFja2V0cy5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJjc3MuanMiPjwvc2NyaXB0Pgo8c3R5bGU+LkNvZGVNaXJyb3Ige2JvcmRlcjogMXB4IHNvbGlkICNkZGQ7IGxpbmUtaGVpZ2h0OiAxLjI7fTwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGltZyBpZD1sb2dvIHNyYz0iLi4vLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+TGFuZ3VhZ2UgbW9kZXM8L2E+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPkxFU1M8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPkxFU1MgbW9kZTwvaDI+Cjxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+QG1lZGlhIHNjcmVlbiBhbmQgKGRldmljZS1hc3BlY3QtcmF0aW86IDE2LzkpIHsg4oCmIH0KQG1lZGlhIHNjcmVlbiBhbmQgKGRldmljZS1hc3BlY3QtcmF0aW86IDEyODAvNzIwKSB7IOKApiB9CkBtZWRpYSBzY3JlZW4gYW5kIChkZXZpY2UtYXNwZWN0LXJhdGlvOiAyNTYwLzE0NDApIHsg4oCmIH0KCmh0bWw6bGFuZyhmci1iZSkKCnRyOm50aC1jaGlsZCgybisxKSAvKiByZXByZXNlbnRzIGV2ZXJ5IG9kZCByb3cgb2YgYW4gSFRNTCB0YWJsZSAqLwoKaW1nOm50aC1vZi10eXBlKDJuKzEpIHsgZmxvYXQ6IHJpZ2h0OyB9CmltZzpudGgtb2YtdHlwZSgybikgeyBmbG9hdDogbGVmdDsgfQoKYm9keSA+IGgyOm5vdCg6Zmlyc3Qtb2YtdHlwZSk6bm90KDpsYXN0LW9mLXR5cGUpCgpodG1sfCo6bm90KDpsaW5rKTpub3QoOnZpc2l0ZWQpCip8Kjpub3QoOmhvdmVyKQpwOjpmaXJzdC1saW5lIHsgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZSB9CgpAbmFtZXNwYWNlIGZvbyB1cmwoaHR0cDovL3d3dy5leGFtcGxlLmNvbSk7CmZvb3xoMSB7IGNvbG9yOiBibHVlIH0gIC8qIGZpcnN0IHJ1bGUgKi8KCnNwYW5baGVsbG89Ik9jZWFuIl1bZ29vZGJ5ZT0iTGFuZCJdCgpFW2Zvb117CiAgcGFkZGluZzo2NXB4Owp9CgppbnB1dFt0eXBlPSJzZWFyY2giXTo6LXdlYmtpdC1zZWFyY2gtZGVjb3JhdGlvbiwKaW5wdXRbdHlwZT0ic2VhcmNoIl06Oi13ZWJraXQtc2VhcmNoLWNhbmNlbC1idXR0b24gewogIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTsgLy8gSW5uZXItcGFkZGluZyBpc3N1ZXMgaW4gQ2hyb21lIE9TWCwgU2FmYXJpIDUKfQpidXR0b246Oi1tb3otZm9jdXMtaW5uZXIsCmlucHV0OjotbW96LWZvY3VzLWlubmVyIHsgLy8gSW5uZXIgcGFkZGluZyBhbmQgYm9yZGVyIG9kZGl0aWVzIGluIEZGMy80CiAgcGFkZGluZzogMDsKICBib3JkZXI6IDA7Cn0KLmJ0biB7CiAgLy8gcmVzZXQgaGVyZSBhcyBvZiAyLjAuMyBkdWUgdG8gUmVjZXNzIHByb3BlcnR5IG9yZGVyCiAgYm9yZGVyLWNvbG9yOiAjY2NjOwogIGJvcmRlci1jb2xvcjogcmdiYSgwLDAsMCwuMSkgcmdiYSgwLDAsMCwuMSkgcmdiYSgwLDAsMCwuMjUpOwp9CmZpZWxkc2V0IHNwYW4gYnV0dG9uLCBmaWVsZHNldCBzcGFuIGlucHV0W3R5cGU9ImZpbGUiXSB7CiAgZm9udC1zaXplOjEycHg7Cglmb250LWZhbWlseTpBcmlhbCwgSGVsdmV0aWNhLCBzYW5zLXNlcmlmOwp9Cgoucm91bmRlZC1jb3JuZXJzIChAcmFkaXVzOiA1cHgpIHsKICBib3JkZXItcmFkaXVzOiBAcmFkaXVzOwogIC13ZWJraXQtYm9yZGVyLXJhZGl1czogQHJhZGl1czsKICAtbW96LWJvcmRlci1yYWRpdXM6IEByYWRpdXM7Cn0KCkBpbXBvcnQgdXJsKCJzb21ldGhpbmcuY3NzIik7CgpAbGlnaHQtYmx1ZTogICBoc2woMTkwLCA1MCUsIDY1JSk7CgojbWVudSB7CiAgcG9zaXRpb246IGFic29sdXRlOwogIHdpZHRoOiAxMDAlOwogIHotaW5kZXg6IDM7CiAgY2xlYXI6IGJvdGg7CiAgZGlzcGxheTogYmxvY2s7CiAgYmFja2dyb3VuZC1jb2xvcjogQGJsdWU7CiAgaGVpZ2h0OiA0MnB4OwogIGJvcmRlci10b3A6IDJweCBzb2xpZCBsaWdodGVuKEBhbHBoYS1ibHVlLCAyMCUpOwogIGJvcmRlci1ib3R0b206IDJweCBzb2xpZCBkYXJrZW4oQGFscGhhLWJsdWUsIDI1JSk7CiAgLmJveC1zaGFkb3coMCwgMXB4LCA4cHgsIDAuNik7CiAgLW1vei1ib3gtc2hhZG93OiAwIDAgMCAjMDAwOyAvLyBCZWNhdXNlIGZpcmVmb3ggc3Vja3MuCgogICYuZG9ja2VkIHsKICAgIGJhY2tncm91bmQtY29sb3I6IGhzbGEoMjEwLCA2MCUsIDQwJSwgMC40KTsKICB9CiAgJjpob3ZlciB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBAYmx1ZTsKICB9CgogICNkcm9wZG93biB7CiAgICBtYXJnaW46IDAgMCAwIDExN3B4OwogICAgcGFkZGluZzogMDsKICAgIHBhZGRpbmctdG9wOiA1cHg7CiAgICBkaXNwbGF5OiBub25lOwogICAgd2lkdGg6IDE5MHB4OwogICAgYm9yZGVyLXRvcDogMnB4IHNvbGlkIEBtZWRpdW07CiAgICBjb2xvcjogQGhpZ2hsaWdodDsKICAgIGJvcmRlcjogMnB4IHNvbGlkIGRhcmtlbihAbWVkaXVtLCAyNSUpOwogICAgYm9yZGVyLWxlZnQtY29sb3I6IGRhcmtlbihAbWVkaXVtLCAxNSUpOwogICAgYm9yZGVyLXJpZ2h0LWNvbG9yOiBkYXJrZW4oQG1lZGl1bSwgMTUlKTsKICAgIGJvcmRlci10b3Atd2lkdGg6IDA7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBkYXJrZW4oQG1lZGl1bSwgMTAlKTsKICAgIHVsIHsKICAgICAgcGFkZGluZzogMHB4OyAgCiAgICB9CiAgICBsaSB7CiAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgIHBhZGRpbmc6IDA7CiAgICAgIGJvcmRlcjogMDsKICAgICAgYSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcGFkZGluZzogMHB4IDE1cHg7ICAKICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICAgICAgY29sb3I6IHdoaXRlOyAgCiAgICAgICAgJjpob3ZlciB7CiAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBkYXJrZW4oQG1lZGl1bSwgMTUlKTsKICAgICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIC5ib3JkZXItcmFkaXVzKDVweCwgYm90dG9tKTsKICAgIC5ib3gtc2hhZG93KDAsIDZweCwgOHB4LCAwLjUpOwogIH0KfQo8L3RleHRhcmVhPjwvZm9ybT4KICAgIDxzY3JpcHQ+CiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICAgICAgbGluZU51bWJlcnMgOiB0cnVlLAogICAgICAgIG1hdGNoQnJhY2tldHMgOiB0cnVlLAogICAgICAgIG1vZGU6ICJ0ZXh0L3gtbGVzcyIKICAgICAgfSk7CiAgICA8L3NjcmlwdD4KCiAgICA8cD5UaGUgTEVTUyBtb2RlIGlzIGEgc3ViLW1vZGUgb2YgdGhlIDxhIGhyZWY9ImluZGV4Lmh0bWwiPkNTUyBtb2RlPC9hPiAoZGVmaW5lZCBpbiA8Y29kZT5jc3MuanM8L2NvZGU+LjwvcD4KCiAgICA8cD48c3Ryb25nPlBhcnNpbmcvSGlnaGxpZ2h0aW5nIFRlc3RzOjwvc3Ryb25nPiA8YSBocmVmPSIuLi8uLi90ZXN0L2luZGV4Lmh0bWwjbGVzc18qIj5ub3JtYWw8L2E+LCAgPGEgaHJlZj0iLi4vLi4vdGVzdC9pbmRleC5odG1sI3ZlcmJvc2UsbGVzc18qIj52ZXJib3NlPC9hPi48L3A+CiAgPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/css/less_test.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24oKSB7CiAgInVzZSBzdHJpY3QiOwoKICB2YXIgbW9kZSA9IENvZGVNaXJyb3IuZ2V0TW9kZSh7aW5kZW50VW5pdDogMn0sICJ0ZXh0L3gtbGVzcyIpOwogIGZ1bmN0aW9uIE1UKG5hbWUpIHsgdGVzdC5tb2RlKG5hbWUsIG1vZGUsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSksICJsZXNzIik7IH0KCiAgTVQoInZhcmlhYmxlIiwKICAgICAiW3ZhcmlhYmxlLTIgQGJhc2VdOiBbYXRvbSAjZjA0NjE1XTsiLAogICAgICJbcXVhbGlmaWVyIC5jbGFzc10geyIsCiAgICAgIiAgW3Byb3BlcnR5IHdpZHRoXTogW3ZhcmlhYmxlIHBlcmNlbnRhZ2VdKFtudW1iZXIgMC41XSk7IFtjb21tZW50IC8vIHJldHVybnMgYDUwJWBdIiwKICAgICAiICBbcHJvcGVydHkgY29sb3JdOiBbdmFyaWFibGUgc2F0dXJhdGVdKFt2YXJpYWJsZS0yIEBiYXNlXSwgW251bWJlciA1JV0pOyIsCiAgICAgIn0iKTsKCiAgTVQoImFtcCIsCiAgICAgIltxdWFsaWZpZXIgLmNoaWxkXSwgW3F1YWxpZmllciAuc2libGluZ10geyIsCiAgICAgIiAgW3F1YWxpZmllciAucGFyZW50XSBbYXRvbSAmXSB7IiwKICAgICAiICAgIFtwcm9wZXJ0eSBjb2xvcl06IFtrZXl3b3JkIGJsYWNrXTsiLAogICAgICIgIH0iLAogICAgICIgIFthdG9tICZdICsgW2F0b20gJl0geyIsCiAgICAgIiAgICBbcHJvcGVydHkgY29sb3JdOiBba2V5d29yZCByZWRdOyIsCiAgICAgIiAgfSIsCiAgICAgIn0iKTsKCiAgTVQoIm1peGluIiwKICAgICAiW3F1YWxpZmllciAubWl4aW5dIChbdmFyaWFibGUgZGFya107IFt2YXJpYWJsZS0yIEBjb2xvcl0pIHsiLAogICAgICIgIFtwcm9wZXJ0eSBjb2xvcl06IFt2YXJpYWJsZSBkYXJrZW5dKFt2YXJpYWJsZS0yIEBjb2xvcl0sIFtudW1iZXIgMTAlXSk7IiwKICAgICAifSIsCiAgICAgIltxdWFsaWZpZXIgLm1peGluXSAoW3ZhcmlhYmxlIGxpZ2h0XTsgW3ZhcmlhYmxlLTIgQGNvbG9yXSkgeyIsCiAgICAgIiAgW3Byb3BlcnR5IGNvbG9yXTogW3ZhcmlhYmxlIGxpZ2h0ZW5dKFt2YXJpYWJsZS0yIEBjb2xvcl0sIFtudW1iZXIgMTAlXSk7IiwKICAgICAifSIsCiAgICAgIltxdWFsaWZpZXIgLm1peGluXSAoW3ZhcmlhYmxlLTIgQF9dOyBbdmFyaWFibGUtMiBAY29sb3JdKSB7IiwKICAgICAiICBbcHJvcGVydHkgZGlzcGxheV06IFthdG9tIGJsb2NrXTsiLAogICAgICJ9IiwKICAgICAiW3ZhcmlhYmxlLTIgQHN3aXRjaF06IFt2YXJpYWJsZSBsaWdodF07IiwKICAgICAiW3F1YWxpZmllciAuY2xhc3NdIHsiLAogICAgICIgIFtxdWFsaWZpZXIgLm1peGluXShbdmFyaWFibGUtMiBAc3dpdGNoXTsgW2F0b20gIzg4OF0pOyIsCiAgICAgIn0iKTsKCiAgTVQoIm5lc3QiLAogICAgICJbcXVhbGlmaWVyIC5vbmVdIHsiLAogICAgICIgIFtkZWYgQG1lZGlhXSAoW3Byb3BlcnR5IHdpZHRoXTogW251bWJlciA0MDBweF0pIHsiLAogICAgICIgICAgW3Byb3BlcnR5IGZvbnQtc2l6ZV06IFtudW1iZXIgMS4yZW1dOyIsCiAgICAgIiAgICBbZGVmIEBtZWRpYV0gW2F0dHJpYnV0ZSBwcmludF0gW2tleXdvcmQgYW5kXSBbcHJvcGVydHkgY29sb3JdIHsiLAogICAgICIgICAgICBbcHJvcGVydHkgY29sb3JdOiBba2V5d29yZCBibHVlXTsiLAogICAgICIgICAgfSIsCiAgICAgIiAgfSIsCiAgICAgIn0iKTsKfSkoKTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/css/scss.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogU0NTUyBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9ImNzcy5qcyI+PC9zY3JpcHQ+CjxzdHlsZT4uQ29kZU1pcnJvciB7YmFja2dyb3VuZDogI2Y4ZjhmODt9PC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aW1nIGlkPWxvZ28gc3JjPSIuLi8uLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5MYW5ndWFnZSBtb2RlczwvYT4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+U0NTUzwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+U0NTUyBtb2RlPC9oMj4KPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KLyogU29tZSBleGFtcGxlIFNDU1MgKi8KCkBpbXBvcnQgImNvbXBhc3MvY3NzMyI7CiR2YXJpYWJsZTogIzMzMzsKCiRibHVlOiAjM2JiZmNlOwokbWFyZ2luOiAxNnB4OwoKLmNvbnRlbnQtbmF2aWdhdGlvbiB7CiAgI25lc3RlZCB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBibGFjazsKICB9CiAgYm9yZGVyLWNvbG9yOiAkYmx1ZTsKICBjb2xvcjoKICAgIGRhcmtlbigkYmx1ZSwgOSUpOwp9CgouYm9yZGVyIHsKICBwYWRkaW5nOiAkbWFyZ2luIC8gMjsKICBtYXJnaW46ICRtYXJnaW4gLyAyOwogIGJvcmRlci1jb2xvcjogJGJsdWU7Cn0KCkBtaXhpbiB0YWJsZS1iYXNlIHsKICB0aCB7CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICBmb250LXdlaWdodDogYm9sZDsKICB9CiAgdGQsIHRoIHtwYWRkaW5nOiAycHh9Cn0KCnRhYmxlLmhsIHsKICBtYXJnaW46IDJlbSAwOwogIHRkLmxuIHsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogIH0KfQoKbGkgewogIGZvbnQ6IHsKICAgIGZhbWlseTogc2VyaWY7CiAgICB3ZWlnaHQ6IGJvbGQ7CiAgICBzaXplOiAxLjJlbTsKICB9Cn0KCkBtaXhpbiBsZWZ0KCRkaXN0KSB7CiAgZmxvYXQ6IGxlZnQ7CiAgbWFyZ2luLWxlZnQ6ICRkaXN0Owp9CgojZGF0YSB7CiAgQGluY2x1ZGUgbGVmdCgxMHB4KTsKICBAaW5jbHVkZSB0YWJsZS1iYXNlOwp9Cgouc291cmNlIHsKICBAaW5jbHVkZSBmbG93LWludG8odGFyZ2V0KTsKICBib3JkZXI6IDEwcHggc29saWQgZ3JlZW47CiAgbWFyZ2luOiAyMHB4OwogIHdpZHRoOiAyMDBweDsgfQoKLm5ldy1jb250YWluZXIgewogIEBpbmNsdWRlIGZsb3ctZnJvbSh0YXJnZXQpOwogIGJvcmRlcjogMTBweCBzb2xpZCByZWQ7CiAgbWFyZ2luOiAyMHB4OwogIHdpZHRoOiAyMDBweDsgfQoKYm9keSB7CiAgbWFyZ2luOiAwOwogIHBhZGRpbmc6IDNlbSA2ZW07CiAgZm9udC1mYW1pbHk6IHRhaG9tYSwgYXJpYWwsIHNhbnMtc2VyaWY7CiAgY29sb3I6ICMwMDA7Cn0KCkBtaXhpbiB5ZWxsb3coKSB7CiAgYmFja2dyb3VuZDogeWVsbG93Owp9CgouYmlnIHsKICBmb250LXNpemU6IDE0cHg7Cn0KCi5uZXN0ZWQgewogIEBpbmNsdWRlIGJvcmRlci1yYWRpdXMoM3B4KTsKICBAZXh0ZW5kIC5iaWc7CiAgcCB7CiAgICBiYWNrZ3JvdW5kOiB3aGl0ZXNtb2tlOwogICAgYSB7CiAgICAgIGNvbG9yOiByZWQ7CiAgICB9CiAgfQp9CgojbmF2aWdhdGlvbiBhIHsKICBmb250LXdlaWdodDogYm9sZDsKICB0ZXh0LWRlY29yYXRpb246IG5vbmUgIWltcG9ydGFudDsKfQoKaDEgewogIGZvbnQtc2l6ZTogMi41ZW07Cn0KCmgyIHsKICBmb250LXNpemU6IDEuN2VtOwp9CgpoMTpiZWZvcmUsIGgyOmJlZm9yZSB7CiAgY29udGVudDogIjo6IjsKfQoKY29kZSB7CiAgZm9udC1mYW1pbHk6IGNvdXJpZXIsIG1vbm9zcGFjZTsKICBmb250LXNpemU6IDgwJTsKICBjb2xvcjogIzQxOEE4QTsKfQo8L3RleHRhcmVhPjwvZm9ybT4KICAgIDxzY3JpcHQ+CiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICAgICAgbGluZU51bWJlcnM6IHRydWUsCiAgICAgICAgbWF0Y2hCcmFja2V0czogdHJ1ZSwKICAgICAgICBtb2RlOiAidGV4dC94LXNjc3MiCiAgICAgIH0pOwogICAgPC9zY3JpcHQ+CgogICAgPHA+VGhlIFNDU1MgbW9kZSBpcyBhIHN1Yi1tb2RlIG9mIHRoZSA8YSBocmVmPSJpbmRleC5odG1sIj5DU1MgbW9kZTwvYT4gKGRlZmluZWQgaW4gPGNvZGU+Y3NzLmpzPC9jb2RlPi48L3A+CgogICAgPHA+PHN0cm9uZz5QYXJzaW5nL0hpZ2hsaWdodGluZyBUZXN0czo8L3N0cm9uZz4gPGEgaHJlZj0iLi4vLi4vdGVzdC9pbmRleC5odG1sI3Njc3NfKiI+bm9ybWFsPC9hPiwgIDxhIGhyZWY9Ii4uLy4uL3Rlc3QvaW5kZXguaHRtbCN2ZXJib3NlLHNjc3NfKiI+dmVyYm9zZTwvYT4uPC9wPgoKICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/css/scss_test.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24oKSB7CiAgdmFyIG1vZGUgPSBDb2RlTWlycm9yLmdldE1vZGUoe2luZGVudFVuaXQ6IDJ9LCAidGV4dC94LXNjc3MiKTsKICBmdW5jdGlvbiBNVChuYW1lKSB7IHRlc3QubW9kZShuYW1lLCBtb2RlLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpLCAic2NzcyIpOyB9CgogIE1UKCd1cmxfd2l0aF9xdW90YXRpb24nLAogICAgIlt0YWcgZm9vXSB7IFtwcm9wZXJ0eSBiYWNrZ3JvdW5kXTpbYXRvbSB1cmxdKFtzdHJpbmcgdGVzdC5qcGddKSB9Iik7CgogIE1UKCd1cmxfd2l0aF9kb3VibGVfcXVvdGVzJywKICAgICJbdGFnIGZvb10geyBbcHJvcGVydHkgYmFja2dyb3VuZF06W2F0b20gdXJsXShbc3RyaW5nIFwidGVzdC5qcGdcIl0pIH0iKTsKCiAgTVQoJ3VybF93aXRoX3NpbmdsZV9xdW90ZXMnLAogICAgIlt0YWcgZm9vXSB7IFtwcm9wZXJ0eSBiYWNrZ3JvdW5kXTpbYXRvbSB1cmxdKFtzdHJpbmcgXCd0ZXN0LmpwZ1wnXSkgfSIpOwoKICBNVCgnc3RyaW5nJywKICAgICJbZGVmIEBpbXBvcnRdIFtzdHJpbmcgXCJjb21wYXNzL2NzczNcIl0iKTsKCiAgTVQoJ2ltcG9ydGFudF9rZXl3b3JkJywKICAgICJbdGFnIGZvb10geyBbcHJvcGVydHkgYmFja2dyb3VuZF06W2F0b20gdXJsXShbc3RyaW5nIFwndGVzdC5qcGdcJ10pIFtrZXl3b3JkICFpbXBvcnRhbnRdIH0iKTsKCiAgTVQoJ3ZhcmlhYmxlJywKICAgICJbdmFyaWFibGUtMiAkYmx1ZV06W2F0b20gIzMzM10iKTsKCiAgTVQoJ3ZhcmlhYmxlX2FzX2F0dHJpYnV0ZScsCiAgICAiW3RhZyBmb29dIHsgW3Byb3BlcnR5IGNvbG9yXTpbdmFyaWFibGUtMiAkYmx1ZV0gfSIpOwoKICBNVCgnbnVtYmVycycsCiAgICAiW3RhZyBmb29dIHsgW3Byb3BlcnR5IHBhZGRpbmddOltudW1iZXIgMTBweF0gW251bWJlciAxMF0gW251bWJlciAxMGVtXSBbbnVtYmVyIDhpbl0gfSIpOwoKICBNVCgnbnVtYmVyX3BlcmNlbnRhZ2UnLAogICAgIlt0YWcgZm9vXSB7IFtwcm9wZXJ0eSB3aWR0aF06W251bWJlciA4MCVdIH0iKTsKCiAgTVQoJ3NlbGVjdG9yJywKICAgICJbYnVpbHRpbiAjaGVsbG9dW3F1YWxpZmllciAud29ybGRde30iKTsKCiAgTVQoJ3NpbmdsZWxpbmVfY29tbWVudCcsCiAgICAiW2NvbW1lbnQgLy8gdGhpcyBpcyBhIGNvbW1lbnRdIik7CgogIE1UKCdtdWx0aWxpbmVfY29tbWVudCcsCiAgICAiW2NvbW1lbnQgLypmb29iYXIqL10iKTsKCiAgTVQoJ2F0dHJpYnV0ZV93aXRoX2h5cGhlbicsCiAgICAiW3RhZyBmb29dIHsgW3Byb3BlcnR5IGZvbnQtc2l6ZV06W251bWJlciAxMHB4XSB9Iik7CgogIE1UKCdzdHJpbmdfYWZ0ZXJfYXR0cmlidXRlJywKICAgICJbdGFnIGZvb10geyBbcHJvcGVydHkgY29udGVudF06W3N0cmluZyBcIjo6XCJdIH0iKTsKCiAgTVQoJ2RpcmVjdGl2ZXMnLAogICAgIltkZWYgQGluY2x1ZGVdIFtxdWFsaWZpZXIgLm1peGluXSIpOwoKICBNVCgnYmFzaWNfc3RydWN0dXJlJywKICAgICJbdGFnIHBdIHsgW3Byb3BlcnR5IGJhY2tncm91bmRdOltrZXl3b3JkIHJlZF07IH0iKTsKCiAgTVQoJ25lc3RlZF9zdHJ1Y3R1cmUnLAogICAgIlt0YWcgcF0geyBbdGFnIGFdIHsgW3Byb3BlcnR5IGNvbG9yXTpba2V5d29yZCByZWRdOyB9IH0iKTsKCiAgTVQoJ21peGluJywKICAgICJbZGVmIEBtaXhpbl0gW3RhZyB0YWJsZS1iYXNlXSB7fSIpOwoKICBNVCgnbnVtYmVyX3dpdGhvdXRfc2VtaWNvbG9uJywKICAgICJbdGFnIHBdIHtbcHJvcGVydHkgd2lkdGhdOltudW1iZXIgMTJdfSIsCiAgICAiW3RhZyBhXSB7W3Byb3BlcnR5IGNvbG9yXTpba2V5d29yZCByZWRdO30iKTsKCiAgTVQoJ2F0b21faW5fbmVzdGVkX2Jsb2NrJywKICAgICJbdGFnIHBdIHsgW3RhZyBhXSB7IFtwcm9wZXJ0eSBjb2xvcl06W2F0b20gIzAwMF07IH0gfSIpOwoKICBNVCgnaW50ZXJwb2xhdGlvbl9pbl9wcm9wZXJ0eScsCiAgICAiW3RhZyBmb29dIHsgI3tbdmFyaWFibGUtMiAkaGVsbG9dfTpbbnVtYmVyIDJdOyB9Iik7CgogIE1UKCdpbnRlcnBvbGF0aW9uX2luX3NlbGVjdG9yJywKICAgICJbdGFnIGZvb10je1t2YXJpYWJsZS0yICRoZWxsb119IHsgW3Byb3BlcnR5IGNvbG9yXTpbYXRvbSAjMDAwXTsgfSIpOwoKICBNVCgnaW50ZXJwb2xhdGlvbl9lcnJvcicsCiAgICAiW3RhZyBmb29dI3tbZXJyb3IgZm9vXX0geyBbcHJvcGVydHkgY29sb3JdOlthdG9tICMwMDBdOyB9Iik7CgogIE1UKCJkaXZpZGVfb3BlcmF0b3IiLAogICAgIlt0YWcgZm9vXSB7IFtwcm9wZXJ0eSB3aWR0aF06W251bWJlciA0XSBbb3BlcmF0b3IgL10gW251bWJlciAyXSB9Iik7CgogIE1UKCduZXN0ZWRfc3RydWN0dXJlX3dpdGhfaWRfc2VsZWN0b3InLAogICAgIlt0YWcgcF0geyBbYnVpbHRpbiAjaGVsbG9dIHsgW3Byb3BlcnR5IGNvbG9yXTpba2V5d29yZCByZWRdOyB9IH0iKTsKCiAgTVQoJ2luZGVudF9taXhpbicsCiAgICAgIltkZWYgQG1peGluXSBbdGFnIGNvbnRhaW5lcl0gKCIsCiAgICAgIiAgW3ZhcmlhYmxlLTIgJGFdOiBbbnVtYmVyIDEwXSwiLAogICAgICIgIFt2YXJpYWJsZS0yICRiXTogW251bWJlciAxMF0pIiwKICAgICAie30iKTsKCiAgTVQoJ2luZGVudF9uZXN0ZWQnLAogICAgICJbdGFnIGZvb10geyIsCiAgICAgIiAgW3RhZyBiYXJdIHsiLAogICAgICIgIH0iLAogICAgICJ9Iik7CgogIE1UKCdpbmRlbnRfcGFyZW50aGVzZXMnLAogICAgICJbdGFnIGZvb10geyIsCiAgICAgIiAgW3Byb3BlcnR5IGNvbG9yXTogW3ZhcmlhYmxlIGRhcmtlbl0oW3ZhcmlhYmxlLTIgJGJsdWVdLCIsCiAgICAgIiAgICBbbnVtYmVyIDklXSk7IiwKICAgICAifSIpOwoKICBNVCgnaW5kZW50X3ZhcmRlZicsCiAgICAgIlt2YXJpYWJsZS0yICRuYW1lXToiLAogICAgICIgIFtzdHJpbmcgJ3ZhbCddOyIsCiAgICAgIlt0YWcgdGFnXSB7IiwKICAgICAiICBbdGFnIGlubmVyXSB7IiwKICAgICAiICAgIFtwcm9wZXJ0eSBtYXJnaW5dOiBbbnVtYmVyIDNweF07IiwKICAgICAiICB9IiwKICAgICAifSIpOwp9KSgpOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/css/test.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24oKSB7CiAgdmFyIG1vZGUgPSBDb2RlTWlycm9yLmdldE1vZGUoe2luZGVudFVuaXQ6IDJ9LCAiY3NzIik7CiAgZnVuY3Rpb24gTVQobmFtZSkgeyB0ZXN0Lm1vZGUobmFtZSwgbW9kZSwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7IH0KCiAgLy8gRXJyb3IsIGJlY2F1c2UgImZvb2JhcmhlbGxvIiBpcyBuZWl0aGVyIGEga25vd24gdHlwZSBvciBwcm9wZXJ0eSwgYnV0CiAgLy8gcHJvcGVydHkgd2FzIGV4cGVjdGVkIChhZnRlciAiYW5kIiksIGFuZCBpdCBzaG91bGQgYmUgaW4gcGFyZW50aGVzZS4KICBNVCgiYXRNZWRpYVVua25vd25UeXBlIiwKICAgICAiW2RlZiBAbWVkaWFdIFthdHRyaWJ1dGUgc2NyZWVuXSBba2V5d29yZCBhbmRdIFtlcnJvciBmb29iYXJoZWxsb10geyB9Iik7CgogIC8vIFNvZnQgZXJyb3IsIGJlY2F1c2UgImZvb2JhcmhlbGxvIiBpcyBub3QgYSBrbm93biBwcm9wZXJ0eSBvciB0eXBlLgogIE1UKCJhdE1lZGlhVW5rbm93blByb3BlcnR5IiwKICAgICAiW2RlZiBAbWVkaWFdIFthdHRyaWJ1dGUgc2NyZWVuXSBba2V5d29yZCBhbmRdIChbZXJyb3IgZm9vYmFyaGVsbG9dKSB7IH0iKTsKCiAgLy8gTWFrZSBzdXJlIG5lc3Rpbmcgd29ya3Mgd2l0aCBtZWRpYSBxdWVyaWVzCiAgTVQoImF0TWVkaWFNYXhXaWR0aE5lc3RlZCIsCiAgICAgIltkZWYgQG1lZGlhXSBbYXR0cmlidXRlIHNjcmVlbl0gW2tleXdvcmQgYW5kXSAoW3Byb3BlcnR5IG1heC13aWR0aF06IFtudW1iZXIgMjVweF0pIHsgW3RhZyBmb29dIHsgfSB9Iik7CgogIE1UKCJ0YWdTZWxlY3RvciIsCiAgICAgIlt0YWcgZm9vXSB7IH0iKTsKCiAgTVQoImNsYXNzU2VsZWN0b3IiLAogICAgICJbcXVhbGlmaWVyIC5mb28tYmFyX2hlbGxvXSB7IH0iKTsKCiAgTVQoImlkU2VsZWN0b3IiLAogICAgICJbYnVpbHRpbiAjZm9vXSB7IFtlcnJvciAjZm9vXSB9Iik7CgogIE1UKCJ0YWdTZWxlY3RvclVuY2xvc2VkIiwKICAgICAiW3RhZyBmb29dIHsgW3Byb3BlcnR5IG1hcmdpbl06IFtudW1iZXIgMF0gfSBbdGFnIGJhcl0geyB9Iik7CgogIE1UKCJ0YWdTdHJpbmdOb1F1b3RlcyIsCiAgICAgIlt0YWcgZm9vXSB7IFtwcm9wZXJ0eSBmb250LWZhbWlseV06IFt2YXJpYWJsZSBoZWxsb10gW3ZhcmlhYmxlIHdvcmxkXTsgfSIpOwoKICBNVCgidGFnU3RyaW5nRG91YmxlIiwKICAgICAiW3RhZyBmb29dIHsgW3Byb3BlcnR5IGZvbnQtZmFtaWx5XTogW3N0cmluZyBcImhlbGxvIHdvcmxkXCJdOyB9Iik7CgogIE1UKCJ0YWdTdHJpbmdTaW5nbGUiLAogICAgICJbdGFnIGZvb10geyBbcHJvcGVydHkgZm9udC1mYW1pbHldOiBbc3RyaW5nICdoZWxsbyB3b3JsZCddOyB9Iik7CgogIE1UKCJ0YWdDb2xvcktleXdvcmQiLAogICAgICJbdGFnIGZvb10geyIsCiAgICAgIiAgW3Byb3BlcnR5IGNvbG9yXTogW2tleXdvcmQgYmxhY2tdOyIsCiAgICAgIiAgW3Byb3BlcnR5IGNvbG9yXTogW2tleXdvcmQgbmF2eV07IiwKICAgICAiICBbcHJvcGVydHkgY29sb3JdOiBba2V5d29yZCB5ZWxsb3ddOyIsCiAgICAgIn0iKTsKCiAgTVQoInRhZ0NvbG9ySGV4MyIsCiAgICAgIlt0YWcgZm9vXSB7IFtwcm9wZXJ0eSBiYWNrZ3JvdW5kXTogW2F0b20gI2ZmZl07IH0iKTsKCiAgTVQoInRhZ0NvbG9ySGV4NiIsCiAgICAgIlt0YWcgZm9vXSB7IFtwcm9wZXJ0eSBiYWNrZ3JvdW5kXTogW2F0b20gI2ZmZmZmZl07IH0iKTsKCiAgTVQoInRhZ0NvbG9ySGV4NCIsCiAgICAgIlt0YWcgZm9vXSB7IFtwcm9wZXJ0eSBiYWNrZ3JvdW5kXTogW2F0b20mZXJyb3IgI2ZmZmZdOyB9Iik7CgogIE1UKCJ0YWdDb2xvckhleEludmFsaWQiLAogICAgICJbdGFnIGZvb10geyBbcHJvcGVydHkgYmFja2dyb3VuZF06IFthdG9tJmVycm9yICNmZmddOyB9Iik7CgogIE1UKCJ0YWdOZWdhdGl2ZU51bWJlciIsCiAgICAgIlt0YWcgZm9vXSB7IFtwcm9wZXJ0eSBtYXJnaW5dOiBbbnVtYmVyIC01cHhdOyB9Iik7CgogIE1UKCJ0YWdQb3NpdGl2ZU51bWJlciIsCiAgICAgIlt0YWcgZm9vXSB7IFtwcm9wZXJ0eSBwYWRkaW5nXTogW251bWJlciA1cHhdOyB9Iik7CgogIE1UKCJ0YWdWZW5kb3IiLAogICAgICJbdGFnIGZvb10geyBbbWV0YSAtZm9vLV1bcHJvcGVydHkgYm94LXNpemluZ106IFttZXRhIC1mb28tXVthdG9tIGJvcmRlci1ib3hdOyB9Iik7CgogIE1UKCJ0YWdCb2d1c1Byb3BlcnR5IiwKICAgICAiW3RhZyBmb29dIHsgW3Byb3BlcnR5JmVycm9yIGJhcmhlbGxvd29ybGRdOiBbbnVtYmVyIDBdOyB9Iik7CgogIE1UKCJ0YWdUd29Qcm9wZXJ0aWVzIiwKICAgICAiW3RhZyBmb29dIHsgW3Byb3BlcnR5IG1hcmdpbl06IFtudW1iZXIgMF07IFtwcm9wZXJ0eSBwYWRkaW5nXTogW251bWJlciAwXTsgfSIpOwoKICBNVCgidGFnVHdvUHJvcGVydGllc1VSTCIsCiAgICAgIlt0YWcgZm9vXSB7IFtwcm9wZXJ0eSBiYWNrZ3JvdW5kXTogW2F0b20gdXJsXShbc3RyaW5nIC8vZXhhbXBsZS5jb20vZm9vLnBuZ10pOyBbcHJvcGVydHkgcGFkZGluZ106IFtudW1iZXIgMF07IH0iKTsKCiAgTVQoImNvbW1lbnRTR01MIiwKICAgICAiW2NvbW1lbnQgPCEtLWNvbW1lbnQtLT5dIik7CgogIE1UKCJjb21tZW50U0dNTDIiLAogICAgICJbY29tbWVudCA8IS0tY29tbWVudF0iLAogICAgICJbY29tbWVudCAtLT5dIFt0YWcgZGl2XSB7fSIpOwoKICBNVCgiaW5kZW50X3RhZ1NlbGVjdG9yIiwKICAgICAiW3RhZyBzdHJvbmddLCBbdGFnIGVtXSB7IiwKICAgICAiICBbcHJvcGVydHkgYmFja2dyb3VuZF06IFthdG9tIHJnYmFdKCIsCiAgICAgIiAgICBbbnVtYmVyIDI1NV0sIFtudW1iZXIgMjU1XSwgW251bWJlciAwXSwgW251bWJlciAuMl0iLAogICAgICIgICk7IiwKICAgICAifSIpOwoKICBNVCgiaW5kZW50X2F0TWVkaWEiLAogICAgICJbZGVmIEBtZWRpYV0geyIsCiAgICAgIiAgW3RhZyBmb29dIHsiLAogICAgICIgICAgW3Byb3BlcnR5IGNvbG9yXToiLAogICAgICIgICAgICBba2V5d29yZCB5ZWxsb3ddOyIsCiAgICAgIiAgfSIsCiAgICAgIn0iKTsKCiAgTVQoImluZGVudF9jb21tYSIsCiAgICAgIlt0YWcgZm9vXSB7IiwKICAgICAiICBbcHJvcGVydHkgZm9udC1mYW1pbHldOiBbdmFyaWFibGUgdmVyZGFuYV0sIiwKICAgICAiICAgIFthdG9tIHNhbnMtc2VyaWZdOyIsCiAgICAgIn0iKTsKCiAgTVQoImluZGVudF9wYXJlbnRoZXNlcyIsCiAgICAgIlt0YWcgZm9vXTpbdmFyaWFibGUtMyBiZWZvcmVdIHsiLAogICAgICIgIFtwcm9wZXJ0eSBiYWNrZ3JvdW5kXTogW2F0b20gdXJsXSgiLAogICAgICJbc3RyaW5nICAgICBibGFoYmxhaF0iLAogICAgICJbc3RyaW5nICAgICBldGNdIiwKICAgICAiW3N0cmluZyAgIF0pIFtrZXl3b3JkICFpbXBvcnRhbnRdOyIsCiAgICAgIn0iKTsKCiAgTVQoImZvbnRfZmFjZSIsCiAgICAgIltkZWYgQGZvbnQtZmFjZV0geyIsCiAgICAgIiAgW3Byb3BlcnR5IGZvbnQtZmFtaWx5XTogW3N0cmluZyAnbXlmb250J107IiwKICAgICAiICBbZXJyb3Igbm9uc2Vuc2VdOiBbc3RyaW5nICdhYmMnXTsiLAogICAgICIgIFtwcm9wZXJ0eSBzcmNdOiBbYXRvbSB1cmxdKFtzdHJpbmcgaHR0cDovL2JsYWhdKSwiLAogICAgICIgICAgW2F0b20gdXJsXShbc3RyaW5nIGh0dHA6Ly9mb29dKTsiLAogICAgICJ9Iik7CgogIE1UKCJlbXB0eV91cmwiLAogICAgICJbZGVmIEBpbXBvcnRdIFt0YWcgdXJsXSgpIFt0YWcgc2NyZWVuXTsiKTsKCiAgTVQoInBhcmVucyIsCiAgICAgIltxdWFsaWZpZXIgLmZvb10geyIsCiAgICAgIiAgW3Byb3BlcnR5IGJhY2tncm91bmQtaW1hZ2VdOiBbdmFyaWFibGUgZmFkZV0oW2F0b20gIzAwMF0sIFtudW1iZXIgMjAlXSk7IiwKICAgICAiICBbcHJvcGVydHkgYm9yZGVyLWltYWdlXTogW3ZhcmlhYmxlIGxpbmVhci1ncmFkaWVudF0oIiwKICAgICAiICAgIFthdG9tIHRvXSBbYXRvbSBib3R0b21dLCIsCiAgICAgIiAgICBbdmFyaWFibGUgZmFkZV0oW2F0b20gIzAwMF0sIFtudW1iZXIgMjAlXSkgW251bWJlciAwJV0sIiwKICAgICAiICAgIFt2YXJpYWJsZSBmYWRlXShbYXRvbSAjMDAwXSwgW251bWJlciAyMCVdKSBbbnVtYmVyIDEwMCVdIiwKICAgICAiICApOyIsCiAgICAgIn0iKTsKfSkoKTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/cypher/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/cypher/cypher.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovLyBCeSB0aGUgTmVvNGogVGVhbSBhbmQgY29udHJpYnV0b3JzLgovLyBodHRwczovL2dpdGh1Yi5jb20vbmVvNGotY29udHJpYi9Db2RlTWlycm9yCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CiAgdmFyIHdvcmRSZWdleHAgPSBmdW5jdGlvbih3b3JkcykgewogICAgcmV0dXJuIG5ldyBSZWdFeHAoIl4oPzoiICsgd29yZHMuam9pbigifCIpICsgIikkIiwgImkiKTsKICB9OwoKICBDb2RlTWlycm9yLmRlZmluZU1vZGUoImN5cGhlciIsIGZ1bmN0aW9uKGNvbmZpZykgewogICAgdmFyIHRva2VuQmFzZSA9IGZ1bmN0aW9uKHN0cmVhbS8qLCBzdGF0ZSovKSB7CiAgICAgIHZhciBjaCA9IHN0cmVhbS5uZXh0KCksIGN1clB1bmMgPSBudWxsOwogICAgICBpZiAoY2ggPT09ICJcIiIgfHwgY2ggPT09ICInIikgewogICAgICAgIHN0cmVhbS5tYXRjaCgvLis/WyInXS8pOwogICAgICAgIHJldHVybiAic3RyaW5nIjsKICAgICAgfQogICAgICBpZiAoL1t7fVwoXCksXC47XFtcXV0vLnRlc3QoY2gpKSB7CiAgICAgICAgY3VyUHVuYyA9IGNoOwogICAgICAgIHJldHVybiAibm9kZSI7CiAgICAgIH0gZWxzZSBpZiAoY2ggPT09ICIvIiAmJiBzdHJlYW0uZWF0KCIvIikpIHsKICAgICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICAgICAgcmV0dXJuICJjb21tZW50IjsKICAgICAgfSBlbHNlIGlmIChvcGVyYXRvckNoYXJzLnRlc3QoY2gpKSB7CiAgICAgICAgc3RyZWFtLmVhdFdoaWxlKG9wZXJhdG9yQ2hhcnMpOwogICAgICAgIHJldHVybiBudWxsOwogICAgICB9IGVsc2UgewogICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW19cd1xkXS8pOwogICAgICAgIGlmIChzdHJlYW0uZWF0KCI6IikpIHsKICAgICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1x3XGRfXC1dLyk7CiAgICAgICAgICByZXR1cm4gImF0b20iOwogICAgICAgIH0KICAgICAgICB2YXIgd29yZCA9IHN0cmVhbS5jdXJyZW50KCk7CiAgICAgICAgaWYgKGZ1bmNzLnRlc3Qod29yZCkpIHJldHVybiAiYnVpbHRpbiI7CiAgICAgICAgaWYgKHByZWRzLnRlc3Qod29yZCkpIHJldHVybiAiZGVmIjsKICAgICAgICBpZiAoa2V5d29yZHMudGVzdCh3b3JkKSkgcmV0dXJuICJrZXl3b3JkIjsKICAgICAgICByZXR1cm4gInZhcmlhYmxlIjsKICAgICAgfQogICAgfTsKICAgIHZhciBwdXNoQ29udGV4dCA9IGZ1bmN0aW9uKHN0YXRlLCB0eXBlLCBjb2wpIHsKICAgICAgcmV0dXJuIHN0YXRlLmNvbnRleHQgPSB7CiAgICAgICAgcHJldjogc3RhdGUuY29udGV4dCwKICAgICAgICBpbmRlbnQ6IHN0YXRlLmluZGVudCwKICAgICAgICBjb2w6IGNvbCwKICAgICAgICB0eXBlOiB0eXBlCiAgICAgIH07CiAgICB9OwogICAgdmFyIHBvcENvbnRleHQgPSBmdW5jdGlvbihzdGF0ZSkgewogICAgICBzdGF0ZS5pbmRlbnQgPSBzdGF0ZS5jb250ZXh0LmluZGVudDsKICAgICAgcmV0dXJuIHN0YXRlLmNvbnRleHQgPSBzdGF0ZS5jb250ZXh0LnByZXY7CiAgICB9OwogICAgdmFyIGluZGVudFVuaXQgPSBjb25maWcuaW5kZW50VW5pdDsKICAgIHZhciBjdXJQdW5jOwogICAgdmFyIGZ1bmNzID0gd29yZFJlZ2V4cChbImFicyIsICJhY29zIiwgImFsbFNob3J0ZXN0UGF0aHMiLCAiYXNpbiIsICJhdGFuIiwgImF0YW4yIiwgImF2ZyIsICJjZWlsIiwgImNvYWxlc2NlIiwgImNvbGxlY3QiLCAiY29zIiwgImNvdCIsICJjb3VudCIsICJkZWdyZWVzIiwgImUiLCAiZW5kbm9kZSIsICJleHAiLCAiZXh0cmFjdCIsICJmaWx0ZXIiLCAiZmxvb3IiLCAiaGF2ZXJzaW4iLCAiaGVhZCIsICJpZCIsICJsYWJlbHMiLCAibGFzdCIsICJsZWZ0IiwgImxlbmd0aCIsICJsb2ciLCAibG9nMTAiLCAibG93ZXIiLCAibHRyaW0iLCAibWF4IiwgIm1pbiIsICJub2RlIiwgIm5vZGVzIiwgInBlcmNlbnRpbGVDb250IiwgInBlcmNlbnRpbGVEaXNjIiwgInBpIiwgInJhZGlhbnMiLCAicmFuZCIsICJyYW5nZSIsICJyZWR1Y2UiLCAicmVsIiwgInJlbGF0aW9uc2hpcCIsICJyZWxhdGlvbnNoaXBzIiwgInJlcGxhY2UiLCAicmlnaHQiLCAicm91bmQiLCAicnRyaW0iLCAic2hvcnRlc3RQYXRoIiwgInNpZ24iLCAic2luIiwgInNwbGl0IiwgInNxcnQiLCAic3RhcnRub2RlIiwgInN0ZGV2IiwgInN0ZGV2cCIsICJzdHIiLCAic3Vic3RyaW5nIiwgInN1bSIsICJ0YWlsIiwgInRhbiIsICJ0aW1lc3RhbXAiLCAidG9GbG9hdCIsICJ0b0ludCIsICJ0cmltIiwgInR5cGUiLCAidXBwZXIiXSk7CiAgICB2YXIgcHJlZHMgPSB3b3JkUmVnZXhwKFsiYWxsIiwgImFuZCIsICJhbnkiLCAiaGFzIiwgImluIiwgIm5vbmUiLCAibm90IiwgIm9yIiwgInNpbmdsZSIsICJ4b3IiXSk7CiAgICB2YXIga2V5d29yZHMgPSB3b3JkUmVnZXhwKFsiYXMiLCAiYXNjIiwgImFzY2VuZGluZyIsICJhc3NlcnQiLCAiYnkiLCAiY2FzZSIsICJjb21taXQiLCAiY29uc3RyYWludCIsICJjcmVhdGUiLCAiY3N2IiwgImN5cGhlciIsICJkZWxldGUiLCAiZGVzYyIsICJkZXNjZW5kaW5nIiwgImRpc3RpbmN0IiwgImRyb3AiLCAiZWxzZSIsICJlbmQiLCAiZmFsc2UiLCAiZmllbGR0ZXJtaW5hdG9yIiwgImZvcmVhY2giLCAiZnJvbSIsICJoZWFkZXJzIiwgImluIiwgImluZGV4IiwgImlzIiwgImxpbWl0IiwgImxvYWQiLCAibWF0Y2giLCAibWVyZ2UiLCAibnVsbCIsICJvbiIsICJvcHRpb25hbCIsICJvcmRlciIsICJwZXJpb2RpYyIsICJyZW1vdmUiLCAicmV0dXJuIiwgInNjYW4iLCAic2V0IiwgInNraXAiLCAic3RhcnQiLCAidGhlbiIsICJ0cnVlIiwgInVuaW9uIiwgInVuaXF1ZSIsICJ1bndpbmQiLCAidXNpbmciLCAid2hlbiIsICJ3aGVyZSIsICJ3aXRoIl0pOwogICAgdmFyIG9wZXJhdG9yQ2hhcnMgPSAvWyorXC08Pj0mfH4lXl0vOwoKICAgIHJldHVybiB7CiAgICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKC8qYmFzZSovKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHRva2VuaXplOiB0b2tlbkJhc2UsCiAgICAgICAgICBjb250ZXh0OiBudWxsLAogICAgICAgICAgaW5kZW50OiAwLAogICAgICAgICAgY29sOiAwCiAgICAgICAgfTsKICAgICAgfSwKICAgICAgdG9rZW46IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgICBpZiAoc3RyZWFtLnNvbCgpKSB7CiAgICAgICAgICBpZiAoc3RhdGUuY29udGV4dCAmJiAoc3RhdGUuY29udGV4dC5hbGlnbiA9PSBudWxsKSkgewogICAgICAgICAgICBzdGF0ZS5jb250ZXh0LmFsaWduID0gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgICBzdGF0ZS5pbmRlbnQgPSBzdHJlYW0uaW5kZW50YXRpb24oKTsKICAgICAgICB9CiAgICAgICAgaWYgKHN0cmVhbS5lYXRTcGFjZSgpKSB7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgdmFyIHN0eWxlID0gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CiAgICAgICAgaWYgKHN0eWxlICE9PSAiY29tbWVudCIgJiYgc3RhdGUuY29udGV4dCAmJiAoc3RhdGUuY29udGV4dC5hbGlnbiA9PSBudWxsKSAmJiBzdGF0ZS5jb250ZXh0LnR5cGUgIT09ICJwYXR0ZXJuIikgewogICAgICAgICAgc3RhdGUuY29udGV4dC5hbGlnbiA9IHRydWU7CiAgICAgICAgfQogICAgICAgIGlmIChjdXJQdW5jID09PSAiKCIpIHsKICAgICAgICAgIHB1c2hDb250ZXh0KHN0YXRlLCAiKSIsIHN0cmVhbS5jb2x1bW4oKSk7CiAgICAgICAgfSBlbHNlIGlmIChjdXJQdW5jID09PSAiWyIpIHsKICAgICAgICAgIHB1c2hDb250ZXh0KHN0YXRlLCAiXSIsIHN0cmVhbS5jb2x1bW4oKSk7CiAgICAgICAgfSBlbHNlIGlmIChjdXJQdW5jID09PSAieyIpIHsKICAgICAgICAgIHB1c2hDb250ZXh0KHN0YXRlLCAifSIsIHN0cmVhbS5jb2x1bW4oKSk7CiAgICAgICAgfSBlbHNlIGlmICgvW1xdXH1cKV0vLnRlc3QoY3VyUHVuYykpIHsKICAgICAgICAgIHdoaWxlIChzdGF0ZS5jb250ZXh0ICYmIHN0YXRlLmNvbnRleHQudHlwZSA9PT0gInBhdHRlcm4iKSB7CiAgICAgICAgICAgIHBvcENvbnRleHQoc3RhdGUpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHN0YXRlLmNvbnRleHQgJiYgY3VyUHVuYyA9PT0gc3RhdGUuY29udGV4dC50eXBlKSB7CiAgICAgICAgICAgIHBvcENvbnRleHQoc3RhdGUpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoY3VyUHVuYyA9PT0gIi4iICYmIHN0YXRlLmNvbnRleHQgJiYgc3RhdGUuY29udGV4dC50eXBlID09PSAicGF0dGVybiIpIHsKICAgICAgICAgIHBvcENvbnRleHQoc3RhdGUpOwogICAgICAgIH0gZWxzZSBpZiAoL2F0b218c3RyaW5nfHZhcmlhYmxlLy50ZXN0KHN0eWxlKSAmJiBzdGF0ZS5jb250ZXh0KSB7CiAgICAgICAgICBpZiAoL1tcfVxdXS8udGVzdChzdGF0ZS5jb250ZXh0LnR5cGUpKSB7CiAgICAgICAgICAgIHB1c2hDb250ZXh0KHN0YXRlLCAicGF0dGVybiIsIHN0cmVhbS5jb2x1bW4oKSk7CiAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlLmNvbnRleHQudHlwZSA9PT0gInBhdHRlcm4iICYmICFzdGF0ZS5jb250ZXh0LmFsaWduKSB7CiAgICAgICAgICAgIHN0YXRlLmNvbnRleHQuYWxpZ24gPSB0cnVlOwogICAgICAgICAgICBzdGF0ZS5jb250ZXh0LmNvbCA9IHN0cmVhbS5jb2x1bW4oKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHN0eWxlOwogICAgICB9LAogICAgICBpbmRlbnQ6IGZ1bmN0aW9uKHN0YXRlLCB0ZXh0QWZ0ZXIpIHsKICAgICAgICB2YXIgZmlyc3RDaGFyID0gdGV4dEFmdGVyICYmIHRleHRBZnRlci5jaGFyQXQoMCk7CiAgICAgICAgdmFyIGNvbnRleHQgPSBzdGF0ZS5jb250ZXh0OwogICAgICAgIGlmICgvW1xdXH1dLy50ZXN0KGZpcnN0Q2hhcikpIHsKICAgICAgICAgIHdoaWxlIChjb250ZXh0ICYmIGNvbnRleHQudHlwZSA9PT0gInBhdHRlcm4iKSB7CiAgICAgICAgICAgIGNvbnRleHQgPSBjb250ZXh0LnByZXY7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHZhciBjbG9zaW5nID0gY29udGV4dCAmJiBmaXJzdENoYXIgPT09IGNvbnRleHQudHlwZTsKICAgICAgICBpZiAoIWNvbnRleHQpIHJldHVybiAwOwogICAgICAgIGlmIChjb250ZXh0LnR5cGUgPT09ICJrZXl3b3JkcyIpIHJldHVybiBDb2RlTWlycm9yLmNvbW1hbmRzLm5ld2xpbmVBbmRJbmRlbnQ7CiAgICAgICAgaWYgKGNvbnRleHQuYWxpZ24pIHJldHVybiBjb250ZXh0LmNvbCArIChjbG9zaW5nID8gMCA6IDEpOwogICAgICAgIHJldHVybiBjb250ZXh0LmluZGVudCArIChjbG9zaW5nID8gMCA6IGluZGVudFVuaXQpOwogICAgICB9CiAgICB9OwogIH0pOwoKICBDb2RlTWlycm9yLm1vZGVFeHRlbnNpb25zWyJjeXBoZXIiXSA9IHsKICAgIGF1dG9Gb3JtYXRMaW5lQnJlYWtzOiBmdW5jdGlvbih0ZXh0KSB7CiAgICAgIHZhciBpLCBsaW5lcywgcmVQcm9jZXNzZWRQb3J0aW9uOwogICAgICB2YXIgbGluZXMgPSB0ZXh0LnNwbGl0KCJcbiIpOwogICAgICB2YXIgcmVQcm9jZXNzZWRQb3J0aW9uID0gL1xzK1xiKHJldHVybnx3aGVyZXxvcmRlciBieXxtYXRjaHx3aXRofHNraXB8bGltaXR8Y3JlYXRlfGRlbGV0ZXxzZXQpXGJccy9nOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgaSsrKQogICAgICAgIGxpbmVzW2ldID0gbGluZXNbaV0ucmVwbGFjZShyZVByb2Nlc3NlZFBvcnRpb24sICIgXG4kMSAiKS50cmltKCk7CiAgICAgIHJldHVybiBsaW5lcy5qb2luKCJcbiIpOwogICAgfQogIH07CgogIENvZGVNaXJyb3IuZGVmaW5lTUlNRSgiYXBwbGljYXRpb24veC1jeXBoZXItcXVlcnkiLCAiY3lwaGVyIik7Cgp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/cypher/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogQ3lwaGVyIE1vZGUgZm9yIENvZGVNaXJyb3I8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiIC8+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vdGhlbWUvbmVvLmNzcyIgLz4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9ImN5cGhlci5qcyI+PC9zY3JpcHQ+CjxzdHlsZT4KLkNvZGVNaXJyb3IgewogICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIGJsYWNrOwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrOwp9CiAgICAgICAgPC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aW1nIGlkPWxvZ28gc3JjPSIuLi8uLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5MYW5ndWFnZSBtb2RlczwvYT4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+Q3lwaGVyIE1vZGUgZm9yIENvZGVNaXJyb3I8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPkN5cGhlciBNb2RlIGZvciBDb2RlTWlycm9yPC9oMj4KPGZvcm0+CiAgICAgICAgICAgIDx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+Ly8gQ3lwaGVyIE1vZGUgZm9yIENvZGVNaXJyb3IsIHVzaW5nIHRoZSBuZW8gdGhlbWUKTUFUQ0ggKGpvZSB7IG5hbWU6ICdKb2UnIH0pLVs6a25vd3MqMi4uMl0tKGZyaWVuZF9vZl9mcmllbmQpCldIRVJFIE5PVCAoam9lKS1bOmtub3dzXS0oZnJpZW5kX29mX2ZyaWVuZCkKUkVUVVJOIGZyaWVuZF9vZl9mcmllbmQubmFtZSwgQ09VTlQoKikKT1JERVIgQlkgQ09VTlQoKikgREVTQyAsIGZyaWVuZF9vZl9mcmllbmQubmFtZQo8L3RleHRhcmVhPgogICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgIDxwPjxzdHJvbmc+TUlNRSB0eXBlcyBkZWZpbmVkOjwvc3Ryb25nPiAKICAgICAgICAgICAgPGNvZGU+PGEgaHJlZj0iP21pbWU9YXBwbGljYXRpb24veC1jeXBoZXItcXVlcnkiPmFwcGxpY2F0aW9uL3gtY3lwaGVyLXF1ZXJ5PC9hPjwvY29kZT4KICAgICAgICA8L3A+CjxzY3JpcHQ+CndpbmRvdy5vbmxvYWQgPSBmdW5jdGlvbigpIHsKICB2YXIgbWltZSA9ICdhcHBsaWNhdGlvbi94LWN5cGhlci1xdWVyeSc7CiAgLy8gZ2V0IG1pbWUgdHlwZQogIGlmICh3aW5kb3cubG9jYXRpb24uaHJlZi5pbmRleE9mKCdtaW1lPScpID4gLTEpIHsKICAgIG1pbWUgPSB3aW5kb3cubG9jYXRpb24uaHJlZi5zdWJzdHIod2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZignbWltZT0nKSArIDUpOwogIH0KICB3aW5kb3cuZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvZGUnKSwgewogICAgbW9kZTogbWltZSwKICAgIGluZGVudFdpdGhUYWJzOiB0cnVlLAogICAgc21hcnRJbmRlbnQ6IHRydWUsCiAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgIG1hdGNoQnJhY2tldHMgOiB0cnVlLAogICAgYXV0b2ZvY3VzOiB0cnVlLAogICAgdGhlbWU6ICduZW8nCiAgfSk7Cn07Cjwvc2NyaXB0PgoKPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/d/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/d/d.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJkIiwgZnVuY3Rpb24oY29uZmlnLCBwYXJzZXJDb25maWcpIHsKICB2YXIgaW5kZW50VW5pdCA9IGNvbmZpZy5pbmRlbnRVbml0LAogICAgICBzdGF0ZW1lbnRJbmRlbnRVbml0ID0gcGFyc2VyQ29uZmlnLnN0YXRlbWVudEluZGVudFVuaXQgfHwgaW5kZW50VW5pdCwKICAgICAga2V5d29yZHMgPSBwYXJzZXJDb25maWcua2V5d29yZHMgfHwge30sCiAgICAgIGJ1aWx0aW4gPSBwYXJzZXJDb25maWcuYnVpbHRpbiB8fCB7fSwKICAgICAgYmxvY2tLZXl3b3JkcyA9IHBhcnNlckNvbmZpZy5ibG9ja0tleXdvcmRzIHx8IHt9LAogICAgICBhdG9tcyA9IHBhcnNlckNvbmZpZy5hdG9tcyB8fCB7fSwKICAgICAgaG9va3MgPSBwYXJzZXJDb25maWcuaG9va3MgfHwge30sCiAgICAgIG11bHRpTGluZVN0cmluZ3MgPSBwYXJzZXJDb25maWcubXVsdGlMaW5lU3RyaW5nczsKICB2YXIgaXNPcGVyYXRvckNoYXIgPSAvWytcLSomJT08PiE/fFwvXS87CgogIHZhciBjdXJQdW5jOwoKICBmdW5jdGlvbiB0b2tlbkJhc2Uoc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIGNoID0gc3RyZWFtLm5leHQoKTsKICAgIGlmIChob29rc1tjaF0pIHsKICAgICAgdmFyIHJlc3VsdCA9IGhvb2tzW2NoXShzdHJlYW0sIHN0YXRlKTsKICAgICAgaWYgKHJlc3VsdCAhPT0gZmFsc2UpIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBpZiAoY2ggPT0gJyInIHx8IGNoID09ICInIiB8fCBjaCA9PSAiYCIpIHsKICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlblN0cmluZyhjaCk7CiAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgIH0KICAgIGlmICgvW1xbXF17fVwoXCksO1w6XC5dLy50ZXN0KGNoKSkgewogICAgICBjdXJQdW5jID0gY2g7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgaWYgKC9cZC8udGVzdChjaCkpIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXHdcLl0vKTsKICAgICAgcmV0dXJuICJudW1iZXIiOwogICAgfQogICAgaWYgKGNoID09ICIvIikgewogICAgICBpZiAoc3RyZWFtLmVhdCgiKyIpKSB7CiAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkNvbW1lbnQ7CiAgICAgICAgcmV0dXJuIHRva2VuTmVzdGVkQ29tbWVudChzdHJlYW0sIHN0YXRlKTsKICAgICAgfQogICAgICBpZiAoc3RyZWFtLmVhdCgiKiIpKSB7CiAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkNvbW1lbnQ7CiAgICAgICAgcmV0dXJuIHRva2VuQ29tbWVudChzdHJlYW0sIHN0YXRlKTsKICAgICAgfQogICAgICBpZiAoc3RyZWFtLmVhdCgiLyIpKSB7CiAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICAgIHJldHVybiAiY29tbWVudCI7CiAgICAgIH0KICAgIH0KICAgIGlmIChpc09wZXJhdG9yQ2hhci50ZXN0KGNoKSkgewogICAgICBzdHJlYW0uZWF0V2hpbGUoaXNPcGVyYXRvckNoYXIpOwogICAgICByZXR1cm4gIm9wZXJhdG9yIjsKICAgIH0KICAgIHN0cmVhbS5lYXRXaGlsZSgvW1x3XCRfXS8pOwogICAgdmFyIGN1ciA9IHN0cmVhbS5jdXJyZW50KCk7CiAgICBpZiAoa2V5d29yZHMucHJvcGVydHlJc0VudW1lcmFibGUoY3VyKSkgewogICAgICBpZiAoYmxvY2tLZXl3b3Jkcy5wcm9wZXJ0eUlzRW51bWVyYWJsZShjdXIpKSBjdXJQdW5jID0gIm5ld3N0YXRlbWVudCI7CiAgICAgIHJldHVybiAia2V5d29yZCI7CiAgICB9CiAgICBpZiAoYnVpbHRpbi5wcm9wZXJ0eUlzRW51bWVyYWJsZShjdXIpKSB7CiAgICAgIGlmIChibG9ja0tleXdvcmRzLnByb3BlcnR5SXNFbnVtZXJhYmxlKGN1cikpIGN1clB1bmMgPSAibmV3c3RhdGVtZW50IjsKICAgICAgcmV0dXJuICJidWlsdGluIjsKICAgIH0KICAgIGlmIChhdG9tcy5wcm9wZXJ0eUlzRW51bWVyYWJsZShjdXIpKSByZXR1cm4gImF0b20iOwogICAgcmV0dXJuICJ2YXJpYWJsZSI7CiAgfQoKICBmdW5jdGlvbiB0b2tlblN0cmluZyhxdW90ZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgdmFyIGVzY2FwZWQgPSBmYWxzZSwgbmV4dCwgZW5kID0gZmFsc2U7CiAgICAgIHdoaWxlICgobmV4dCA9IHN0cmVhbS5uZXh0KCkpICE9IG51bGwpIHsKICAgICAgICBpZiAobmV4dCA9PSBxdW90ZSAmJiAhZXNjYXBlZCkge2VuZCA9IHRydWU7IGJyZWFrO30KICAgICAgICBlc2NhcGVkID0gIWVzY2FwZWQgJiYgbmV4dCA9PSAiXFwiOwogICAgICB9CiAgICAgIGlmIChlbmQgfHwgIShlc2NhcGVkIHx8IG11bHRpTGluZVN0cmluZ3MpKQogICAgICAgIHN0YXRlLnRva2VuaXplID0gbnVsbDsKICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgfTsKICB9CgogIGZ1bmN0aW9uIHRva2VuQ29tbWVudChzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgbWF5YmVFbmQgPSBmYWxzZSwgY2g7CiAgICB3aGlsZSAoY2ggPSBzdHJlYW0ubmV4dCgpKSB7CiAgICAgIGlmIChjaCA9PSAiLyIgJiYgbWF5YmVFbmQpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IG51bGw7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgbWF5YmVFbmQgPSAoY2ggPT0gIioiKTsKICAgIH0KICAgIHJldHVybiAiY29tbWVudCI7CiAgfQoKICBmdW5jdGlvbiB0b2tlbk5lc3RlZENvbW1lbnQoc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIG1heWJlRW5kID0gZmFsc2UsIGNoOwogICAgd2hpbGUgKGNoID0gc3RyZWFtLm5leHQoKSkgewogICAgICBpZiAoY2ggPT0gIi8iICYmIG1heWJlRW5kKSB7CiAgICAgICAgc3RhdGUudG9rZW5pemUgPSBudWxsOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIG1heWJlRW5kID0gKGNoID09ICIrIik7CiAgICB9CiAgICByZXR1cm4gImNvbW1lbnQiOwogIH0KCiAgZnVuY3Rpb24gQ29udGV4dChpbmRlbnRlZCwgY29sdW1uLCB0eXBlLCBhbGlnbiwgcHJldikgewogICAgdGhpcy5pbmRlbnRlZCA9IGluZGVudGVkOwogICAgdGhpcy5jb2x1bW4gPSBjb2x1bW47CiAgICB0aGlzLnR5cGUgPSB0eXBlOwogICAgdGhpcy5hbGlnbiA9IGFsaWduOwogICAgdGhpcy5wcmV2ID0gcHJldjsKICB9CiAgZnVuY3Rpb24gcHVzaENvbnRleHQoc3RhdGUsIGNvbCwgdHlwZSkgewogICAgdmFyIGluZGVudCA9IHN0YXRlLmluZGVudGVkOwogICAgaWYgKHN0YXRlLmNvbnRleHQgJiYgc3RhdGUuY29udGV4dC50eXBlID09ICJzdGF0ZW1lbnQiKQogICAgICBpbmRlbnQgPSBzdGF0ZS5jb250ZXh0LmluZGVudGVkOwogICAgcmV0dXJuIHN0YXRlLmNvbnRleHQgPSBuZXcgQ29udGV4dChpbmRlbnQsIGNvbCwgdHlwZSwgbnVsbCwgc3RhdGUuY29udGV4dCk7CiAgfQogIGZ1bmN0aW9uIHBvcENvbnRleHQoc3RhdGUpIHsKICAgIHZhciB0ID0gc3RhdGUuY29udGV4dC50eXBlOwogICAgaWYgKHQgPT0gIikiIHx8IHQgPT0gIl0iIHx8IHQgPT0gIn0iKQogICAgICBzdGF0ZS5pbmRlbnRlZCA9IHN0YXRlLmNvbnRleHQuaW5kZW50ZWQ7CiAgICByZXR1cm4gc3RhdGUuY29udGV4dCA9IHN0YXRlLmNvbnRleHQucHJldjsKICB9CgogIC8vIEludGVyZmFjZQoKICByZXR1cm4gewogICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24oYmFzZWNvbHVtbikgewogICAgICByZXR1cm4gewogICAgICAgIHRva2VuaXplOiBudWxsLAogICAgICAgIGNvbnRleHQ6IG5ldyBDb250ZXh0KChiYXNlY29sdW1uIHx8IDApIC0gaW5kZW50VW5pdCwgMCwgInRvcCIsIGZhbHNlKSwKICAgICAgICBpbmRlbnRlZDogMCwKICAgICAgICBzdGFydE9mTGluZTogdHJ1ZQogICAgICB9OwogICAgfSwKCiAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICB2YXIgY3R4ID0gc3RhdGUuY29udGV4dDsKICAgICAgaWYgKHN0cmVhbS5zb2woKSkgewogICAgICAgIGlmIChjdHguYWxpZ24gPT0gbnVsbCkgY3R4LmFsaWduID0gZmFsc2U7CiAgICAgICAgc3RhdGUuaW5kZW50ZWQgPSBzdHJlYW0uaW5kZW50YXRpb24oKTsKICAgICAgICBzdGF0ZS5zdGFydE9mTGluZSA9IHRydWU7CiAgICAgIH0KICAgICAgaWYgKHN0cmVhbS5lYXRTcGFjZSgpKSByZXR1cm4gbnVsbDsKICAgICAgY3VyUHVuYyA9IG51bGw7CiAgICAgIHZhciBzdHlsZSA9IChzdGF0ZS50b2tlbml6ZSB8fCB0b2tlbkJhc2UpKHN0cmVhbSwgc3RhdGUpOwogICAgICBpZiAoc3R5bGUgPT0gImNvbW1lbnQiIHx8IHN0eWxlID09ICJtZXRhIikgcmV0dXJuIHN0eWxlOwogICAgICBpZiAoY3R4LmFsaWduID09IG51bGwpIGN0eC5hbGlnbiA9IHRydWU7CgogICAgICBpZiAoKGN1clB1bmMgPT0gIjsiIHx8IGN1clB1bmMgPT0gIjoiIHx8IGN1clB1bmMgPT0gIiwiKSAmJiBjdHgudHlwZSA9PSAic3RhdGVtZW50IikgcG9wQ29udGV4dChzdGF0ZSk7CiAgICAgIGVsc2UgaWYgKGN1clB1bmMgPT0gInsiKSBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLmNvbHVtbigpLCAifSIpOwogICAgICBlbHNlIGlmIChjdXJQdW5jID09ICJbIikgcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbS5jb2x1bW4oKSwgIl0iKTsKICAgICAgZWxzZSBpZiAoY3VyUHVuYyA9PSAiKCIpIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0uY29sdW1uKCksICIpIik7CiAgICAgIGVsc2UgaWYgKGN1clB1bmMgPT0gIn0iKSB7CiAgICAgICAgd2hpbGUgKGN0eC50eXBlID09ICJzdGF0ZW1lbnQiKSBjdHggPSBwb3BDb250ZXh0KHN0YXRlKTsKICAgICAgICBpZiAoY3R4LnR5cGUgPT0gIn0iKSBjdHggPSBwb3BDb250ZXh0KHN0YXRlKTsKICAgICAgICB3aGlsZSAoY3R4LnR5cGUgPT0gInN0YXRlbWVudCIpIGN0eCA9IHBvcENvbnRleHQoc3RhdGUpOwogICAgICB9CiAgICAgIGVsc2UgaWYgKGN1clB1bmMgPT0gY3R4LnR5cGUpIHBvcENvbnRleHQoc3RhdGUpOwogICAgICBlbHNlIGlmICgoKGN0eC50eXBlID09ICJ9IiB8fCBjdHgudHlwZSA9PSAidG9wIikgJiYgY3VyUHVuYyAhPSAnOycpIHx8IChjdHgudHlwZSA9PSAic3RhdGVtZW50IiAmJiBjdXJQdW5jID09ICJuZXdzdGF0ZW1lbnQiKSkKICAgICAgICBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLmNvbHVtbigpLCAic3RhdGVtZW50Iik7CiAgICAgIHN0YXRlLnN0YXJ0T2ZMaW5lID0gZmFsc2U7CiAgICAgIHJldHVybiBzdHlsZTsKICAgIH0sCgogICAgaW5kZW50OiBmdW5jdGlvbihzdGF0ZSwgdGV4dEFmdGVyKSB7CiAgICAgIGlmIChzdGF0ZS50b2tlbml6ZSAhPSB0b2tlbkJhc2UgJiYgc3RhdGUudG9rZW5pemUgIT0gbnVsbCkgcmV0dXJuIENvZGVNaXJyb3IuUGFzczsKICAgICAgdmFyIGN0eCA9IHN0YXRlLmNvbnRleHQsIGZpcnN0Q2hhciA9IHRleHRBZnRlciAmJiB0ZXh0QWZ0ZXIuY2hhckF0KDApOwogICAgICBpZiAoY3R4LnR5cGUgPT0gInN0YXRlbWVudCIgJiYgZmlyc3RDaGFyID09ICJ9IikgY3R4ID0gY3R4LnByZXY7CiAgICAgIHZhciBjbG9zaW5nID0gZmlyc3RDaGFyID09IGN0eC50eXBlOwogICAgICBpZiAoY3R4LnR5cGUgPT0gInN0YXRlbWVudCIpIHJldHVybiBjdHguaW5kZW50ZWQgKyAoZmlyc3RDaGFyID09ICJ7IiA/IDAgOiBzdGF0ZW1lbnRJbmRlbnRVbml0KTsKICAgICAgZWxzZSBpZiAoY3R4LmFsaWduKSByZXR1cm4gY3R4LmNvbHVtbiArIChjbG9zaW5nID8gMCA6IDEpOwogICAgICBlbHNlIHJldHVybiBjdHguaW5kZW50ZWQgKyAoY2xvc2luZyA/IDAgOiBpbmRlbnRVbml0KTsKICAgIH0sCgogICAgZWxlY3RyaWNDaGFyczogInt9IgogIH07Cn0pOwoKICBmdW5jdGlvbiB3b3JkcyhzdHIpIHsKICAgIHZhciBvYmogPSB7fSwgd29yZHMgPSBzdHIuc3BsaXQoIiAiKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgd29yZHMubGVuZ3RoOyArK2kpIG9ialt3b3Jkc1tpXV0gPSB0cnVlOwogICAgcmV0dXJuIG9iajsKICB9CgogIHZhciBibG9ja0tleXdvcmRzID0gImJvZHkgY2F0Y2ggY2xhc3MgZG8gZWxzZSBlbnVtIGZvciBmb3JlYWNoIGZvcmVhY2hfcmV2ZXJzZSBpZiBpbiBpbnRlcmZhY2UgbWl4aW4gIiArCiAgICAgICAgICAgICAgICAgICAgICAib3V0IHNjb3BlIHN0cnVjdCBzd2l0Y2ggdHJ5IHVuaW9uIHVuaXR0ZXN0IHZlcnNpb24gd2hpbGUgd2l0aCI7CgogIENvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC94LWQiLCB7CiAgICBuYW1lOiAiZCIsCiAgICBrZXl3b3Jkczogd29yZHMoImFic3RyYWN0IGFsaWFzIGFsaWduIGFzbSBhc3NlcnQgYXV0byBicmVhayBjYXNlIGNhc3QgY2RvdWJsZSBjZW50IGNmbG9hdCBjb25zdCBjb250aW51ZSAiICsKICAgICAgICAgICAgICAgICAgICAiZGVidWcgZGVmYXVsdCBkZWxlZ2F0ZSBkZWxldGUgZGVwcmVjYXRlZCBleHBvcnQgZXh0ZXJuIGZpbmFsIGZpbmFsbHkgZnVuY3Rpb24gZ290byBpbW11dGFibGUgIiArCiAgICAgICAgICAgICAgICAgICAgImltcG9ydCBpbm91dCBpbnZhcmlhbnQgaXMgbGF6eSBtYWNybyBtb2R1bGUgbmV3IG5vdGhyb3cgb3ZlcnJpZGUgcGFja2FnZSBwcmFnbWEgcHJpdmF0ZSAiICsKICAgICAgICAgICAgICAgICAgICAicHJvdGVjdGVkIHB1YmxpYyBwdXJlIHJlZiByZXR1cm4gc2hhcmVkIHNob3J0IHN0YXRpYyBzdXBlciBzeW5jaHJvbml6ZWQgdGVtcGxhdGUgdGhpcyAiICsKICAgICAgICAgICAgICAgICAgICAidGhyb3cgdHlwZWRlZiB0eXBlaWQgdHlwZW9mIHZvbGF0aWxlIF9fRklMRV9fIF9fTElORV9fIF9fZ3NoYXJlZCBfX3RyYWl0cyBfX3ZlY3RvciBfX3BhcmFtZXRlcnMgIiArCiAgICAgICAgICAgICAgICAgICAgYmxvY2tLZXl3b3JkcyksCiAgICBibG9ja0tleXdvcmRzOiB3b3JkcyhibG9ja0tleXdvcmRzKSwKICAgIGJ1aWx0aW46IHdvcmRzKCJib29sIGJ5dGUgY2hhciBjcmVhbCBkY2hhciBkb3VibGUgZmxvYXQgaWRvdWJsZSBpZmxvYXQgaW50IGlyZWFsIGxvbmcgcmVhbCBzaG9ydCB1Ynl0ZSAiICsKICAgICAgICAgICAgICAgICAgICJ1Y2VudCB1aW50IHVsb25nIHVzaG9ydCB3Y2hhciB3c3RyaW5nIHZvaWQgc2l6ZV90IHNpemVkaWZmX3QiKSwKICAgIGF0b21zOiB3b3JkcygiZXhpdCBmYWlsdXJlIHN1Y2Nlc3MgdHJ1ZSBmYWxzZSBudWxsIiksCiAgICBob29rczogewogICAgICAiQCI6IGZ1bmN0aW9uKHN0cmVhbSwgX3N0YXRlKSB7CiAgICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXHdcJF9dLyk7CiAgICAgICAgcmV0dXJuICJtZXRhIjsKICAgICAgfQogICAgfQogIH0pOwoKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/d/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogRCBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uLy4uL2FkZG9uL2VkaXQvbWF0Y2hicmFja2V0cy5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJkLmpzIj48L3NjcmlwdD4KPHN0eWxlPi5Db2RlTWlycm9yIHtib3JkZXI6IDJweCBpbnNldCAjZGVlO308L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5EPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5EIG1vZGU8L2gyPgo8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgovKiBEIGRlbW8gY29kZSAvLyBjb3BpZWQgZnJvbSBwaG9ib3Mvc2QvbWV0YXN0cmluZ3MuZCAqLwovLyBXcml0dGVuIGluIHRoZSBEIHByb2dyYW1taW5nIGxhbmd1YWdlLgoKLyoqClRlbXBsYXRlcyB3aXRoIHdoaWNoIHRvIGRvIGNvbXBpbGUtdGltZSBtYW5pcHVsYXRpb24gb2Ygc3RyaW5ncy4KCk1hY3JvczoKIFdJS0kgPSBQaG9ib3MvU3RkTWV0YXN0cmluZ3MKCkNvcHlyaWdodDogQ29weXJpZ2h0IERpZ2l0YWwgTWFycyAyMDA3IC0gMjAwOS4KTGljZW5zZTogICA8YSBocmVmPSJodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQiPkJvb3N0IExpY2Vuc2UgMS4wPC9hPi4KQXV0aG9yczogICAkKFdFQiBkaWdpdGFsbWFycy5jb20sIFdhbHRlciBCcmlnaHQpLAogICAgICAgICAgIERvbiBDbHVnc3RvbgpTb3VyY2U6ICAgICQoUEhPQk9TU1JDIHN0ZC9fbWV0YXN0cmluZ3MuZCkKKi8KLyoKICAgICAgICAgQ29weXJpZ2h0IERpZ2l0YWwgTWFycyAyMDA3IC0gMjAwOS4KRGlzdHJpYnV0ZWQgdW5kZXIgdGhlIEJvb3N0IFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4wLgogICAoU2VlIGFjY29tcGFueWluZyBmaWxlIExJQ0VOU0VfMV8wLnR4dCBvciBjb3B5IGF0CiAgICAgICAgIGh0dHA6Ly93d3cuYm9vc3Qub3JnL0xJQ0VOU0VfMV8wLnR4dCkKICovCm1vZHVsZSBzdGQubWV0YXN0cmluZ3M7CgovKioKRm9ybWF0cyBjb25zdGFudHMgaW50byBhIHN0cmluZyBhdCBjb21waWxlIHRpbWUuICBBbmFsb2dvdXMgdG8gJChYUkVGCnN0cmluZyxmb3JtYXQpLgoKUGFyYW1ldGVyczoKCkEgPSB0dXBsZSBvZiBjb25zdGFudHMsIHdoaWNoIGNhbiBiZSBzdHJpbmdzLCBjaGFyYWN0ZXJzLCBvciBpbnRlZ3JhbAogICAgdmFsdWVzLgoKRm9ybWF0czoKICogICAgVGhlIGZvcm1hdHMgc3VwcG9ydGVkIGFyZSAlcyBmb3Igc3RyaW5ncywgYW5kICUlCiAqICAgIGZvciB0aGUgJSBjaGFyYWN0ZXIuCkV4YW1wbGU6Ci0tLQppbXBvcnQgc3RkLm1ldGFzdHJpbmdzOwppbXBvcnQgc3RkLnN0ZGlvOwoKdm9pZCBtYWluKCkKewogIHN0cmluZyBzID0gRm9ybWF0ISgiQXJnICVzID0gJXMiLCAiZm9vIiwgMjcpOwogIHdyaXRlZmxuKHMpOyAvLyAiQXJnIGZvbyA9IDI3Igp9CiAqIC0tLQogKi8KCnRlbXBsYXRlIEZvcm1hdChBLi4uKQp7CiAgICBzdGF0aWMgaWYgKEEubGVuZ3RoID09IDApCiAgICAgICAgZW51bSBGb3JtYXQgPSAiIjsKICAgIGVsc2Ugc3RhdGljIGlmIChpcyh0eXBlb2YoQVswXSkgOiBjb25zdChjaGFyKVtdKSkKICAgICAgICBlbnVtIEZvcm1hdCA9IEZvcm1hdFN0cmluZyEoQVswXSwgQVsxLi4kXSk7CiAgICBlbHNlCiAgICAgICAgZW51bSBGb3JtYXQgPSB0b1N0cmluZ05vdyEoQVswXSkgfiBGb3JtYXQhKEFbMS4uJF0pOwp9Cgp0ZW1wbGF0ZSBGb3JtYXRTdHJpbmcoY29uc3QoY2hhcilbXSBGLCBBLi4uKQp7CiAgICBzdGF0aWMgaWYgKEYubGVuZ3RoID09IDApCiAgICAgICAgZW51bSBGb3JtYXRTdHJpbmcgPSBGb3JtYXQhKEEpOwogICAgZWxzZSBzdGF0aWMgaWYgKEYubGVuZ3RoID09IDEpCiAgICAgICAgZW51bSBGb3JtYXRTdHJpbmcgPSBGWzBdIH4gRm9ybWF0IShBKTsKICAgIGVsc2Ugc3RhdGljIGlmIChGWzAuLjJdID09ICIlcyIpCiAgICAgICAgZW51bSBGb3JtYXRTdHJpbmcKICAgICAgICAgICAgPSB0b1N0cmluZ05vdyEoQVswXSkgfiBGb3JtYXRTdHJpbmchKEZbMi4uJF0sQVsxLi4kXSk7CiAgICBlbHNlIHN0YXRpYyBpZiAoRlswLi4yXSA9PSAiJSUiKQogICAgICAgIGVudW0gRm9ybWF0U3RyaW5nID0gIiUiIH4gRm9ybWF0U3RyaW5nIShGWzIuLiRdLEEpOwogICAgZWxzZQogICAgewogICAgICAgIHN0YXRpYyBhc3NlcnQoRlswXSAhPSAnJScsICJ1bnJlY29nbml6ZWQgZm9ybWF0ICUiIH4gRlsxXSk7CiAgICAgICAgZW51bSBGb3JtYXRTdHJpbmcgPSBGWzBdIH4gRm9ybWF0U3RyaW5nIShGWzEuLiRdLEEpOwogICAgfQp9Cgp1bml0dGVzdAp7CiAgICBhdXRvIHMgPSBGb3JtYXQhKCJoZWwlc2xvIiwgIndvcmxkIiwgLTEzOCwgJ2MnLCB0cnVlKTsKICAgIGFzc2VydChzID09ICJoZWx3b3JsZGxvLTEzOGN0cnVlIiwgIlsiIH4gcyB+ICJdIik7Cn0KCi8qKgogKiBDb252ZXJ0IGNvbnN0YW50IGFyZ3VtZW50IHRvIGEgc3RyaW5nLgogKi8KCnRlbXBsYXRlIHRvU3RyaW5nTm93KHVsb25nIHYpCnsKICAgIHN0YXRpYyBpZiAodiA8IDEwKQogICAgICAgIGVudW0gdG9TdHJpbmdOb3cgPSAiIiB+IGNhc3QoY2hhcikodiArICcwJyk7CiAgICBlbHNlCiAgICAgICAgZW51bSB0b1N0cmluZ05vdyA9IHRvU3RyaW5nTm93ISh2IC8gMTApIH4gdG9TdHJpbmdOb3chKHYgJSAxMCk7Cn0KCnVuaXR0ZXN0CnsKICAgIHN0YXRpYyBhc3NlcnQodG9TdHJpbmdOb3chKDF1TCA8PCA2MikgPT0gIjQ2MTE2ODYwMTg0MjczODc5MDQiKTsKfQoKLy8vIGRpdHRvCnRlbXBsYXRlIHRvU3RyaW5nTm93KGxvbmcgdikKewogICAgc3RhdGljIGlmICh2IDwgMCkKICAgICAgICBlbnVtIHRvU3RyaW5nTm93ID0gIi0iIH4gdG9TdHJpbmdOb3chKGNhc3QodWxvbmcpIC12KTsKICAgIGVsc2UKICAgICAgICBlbnVtIHRvU3RyaW5nTm93ID0gdG9TdHJpbmdOb3chKGNhc3QodWxvbmcpIHYpOwp9Cgp1bml0dGVzdAp7CiAgICBzdGF0aWMgYXNzZXJ0KHRvU3RyaW5nTm93ISgweDEwMDAwMDAwMCkgPT0gIjQyOTQ5NjcyOTYiKTsKICAgIHN0YXRpYyBhc3NlcnQodG9TdHJpbmdOb3chKC0xMzhMKSA9PSAiLTEzOCIpOwp9CgovLy8gZGl0dG8KdGVtcGxhdGUgdG9TdHJpbmdOb3codWludCBVKQp7CiAgICBlbnVtIHRvU3RyaW5nTm93ID0gdG9TdHJpbmdOb3chKGNhc3QodWxvbmcpVSk7Cn0KCi8vLyBkaXR0bwp0ZW1wbGF0ZSB0b1N0cmluZ05vdyhpbnQgSSkKewogICAgZW51bSB0b1N0cmluZ05vdyA9IHRvU3RyaW5nTm93IShjYXN0KGxvbmcpSSk7Cn0KCi8vLyBkaXR0bwp0ZW1wbGF0ZSB0b1N0cmluZ05vdyhib29sIEIpCnsKICAgIGVudW0gdG9TdHJpbmdOb3cgPSBCID8gInRydWUiIDogImZhbHNlIjsKfQoKLy8vIGRpdHRvCnRlbXBsYXRlIHRvU3RyaW5nTm93KHN0cmluZyBTKQp7CiAgICBlbnVtIHRvU3RyaW5nTm93ID0gUzsKfQoKLy8vIGRpdHRvCnRlbXBsYXRlIHRvU3RyaW5nTm93KGNoYXIgQykKewogICAgZW51bSB0b1N0cmluZ05vdyA9ICIiIH4gQzsKfQoKCi8qKioqKioqKgogKiBQYXJzZSB1bnNpZ25lZCBpbnRlZ2VyIGxpdGVyYWwgZnJvbSB0aGUgc3RhcnQgb2Ygc3RyaW5nIHMuCiAqIHJldHVybnM6CiAqICAgIC52YWx1ZSA9IHRoZSBpbnRlZ2VyIGxpdGVyYWwgYXMgYSBzdHJpbmcsCiAqICAgIC5yZXN0ID0gdGhlIHN0cmluZyBmb2xsb3dpbmcgdGhlIGludGVnZXIgbGl0ZXJhbAogKiBPdGhlcndpc2U6CiAqICAgIC52YWx1ZSA9IG51bGwsCiAqICAgIC5yZXN0ID0gcwogKi8KCnRlbXBsYXRlIHBhcnNlVWludGVnZXIoY29uc3QoY2hhcilbXSBzKQp7CiAgICBzdGF0aWMgaWYgKHMubGVuZ3RoID09IDApCiAgICB7CiAgICAgICAgZW51bSB2YWx1ZSA9ICIiOwogICAgICAgIGVudW0gcmVzdCA9ICIiOwogICAgfQogICAgZWxzZSBzdGF0aWMgaWYgKHNbMF0gPj0gJzAnICYmIHNbMF0gPD0gJzknKQogICAgewogICAgICAgIGVudW0gdmFsdWUgPSBzWzBdIH4gcGFyc2VVaW50ZWdlciEoc1sxLi4kXSkudmFsdWU7CiAgICAgICAgZW51bSByZXN0ID0gcGFyc2VVaW50ZWdlciEoc1sxLi4kXSkucmVzdDsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBlbnVtIHZhbHVlID0gIiI7CiAgICAgICAgZW51bSByZXN0ID0gczsKICAgIH0KfQoKLyoqKioqKioqClBhcnNlIGludGVnZXIgbGl0ZXJhbCBvcHRpb25hbGx5IHByZWNlZGVkIGJ5ICQoRCAnLScpIGZyb20gdGhlIHN0YXJ0Cm9mIHN0cmluZyAkKEQgcykuCgpSZXR1cm5zOgogICAudmFsdWUgPSB0aGUgaW50ZWdlciBsaXRlcmFsIGFzIGEgc3RyaW5nLAogICAucmVzdCA9IHRoZSBzdHJpbmcgZm9sbG93aW5nIHRoZSBpbnRlZ2VyIGxpdGVyYWwKCk90aGVyd2lzZToKICAgLnZhbHVlID0gbnVsbCwKICAgLnJlc3QgPSBzCiovCgp0ZW1wbGF0ZSBwYXJzZUludGVnZXIoY29uc3QoY2hhcilbXSBzKQp7CiAgICBzdGF0aWMgaWYgKHMubGVuZ3RoID09IDApCiAgICB7CiAgICAgICAgZW51bSB2YWx1ZSA9ICIiOwogICAgICAgIGVudW0gcmVzdCA9ICIiOwogICAgfQogICAgZWxzZSBzdGF0aWMgaWYgKHNbMF0gPj0gJzAnICYmIHNbMF0gPD0gJzknKQogICAgewogICAgICAgIGVudW0gdmFsdWUgPSBzWzBdIH4gcGFyc2VVaW50ZWdlciEoc1sxLi4kXSkudmFsdWU7CiAgICAgICAgZW51bSByZXN0ID0gcGFyc2VVaW50ZWdlciEoc1sxLi4kXSkucmVzdDsKICAgIH0KICAgIGVsc2Ugc3RhdGljIGlmIChzLmxlbmd0aCA+PSAyICYmCiAgICAgICAgICAgIHNbMF0gPT0gJy0nICYmIHNbMV0gPj0gJzAnICYmIHNbMV0gPD0gJzknKQogICAgewogICAgICAgIGVudW0gdmFsdWUgPSBzWzAuLjJdIH4gcGFyc2VVaW50ZWdlciEoc1syLi4kXSkudmFsdWU7CiAgICAgICAgZW51bSByZXN0ID0gcGFyc2VVaW50ZWdlciEoc1syLi4kXSkucmVzdDsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBlbnVtIHZhbHVlID0gIiI7CiAgICAgICAgZW51bSByZXN0ID0gczsKICAgIH0KfQoKdW5pdHRlc3QKewogICAgYXNzZXJ0KHBhcnNlVWludGVnZXIhKCIxMjM0YWJjIikudmFsdWUgPT0gIjEyMzQiKTsKICAgIGFzc2VydChwYXJzZVVpbnRlZ2VyISgiMTIzNGFiYyIpLnJlc3QgPT0gImFiYyIpOwogICAgYXNzZXJ0KHBhcnNlSW50ZWdlciEoIi0xMjM0YWJjIikudmFsdWUgPT0gIi0xMjM0Iik7CiAgICBhc3NlcnQocGFyc2VJbnRlZ2VyISgiLTEyMzRhYmMiKS5yZXN0ID09ICJhYmMiKTsKfQoKLyoqCkRlcHJlY2F0ZWQgYWxpYXNlcyBoZWxkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgoqLwpkZXByZWNhdGVkIGFsaWFzIHRvU3RyaW5nTm93IFRvU3RyaW5nOwovLy8gRGl0dG8KZGVwcmVjYXRlZCBhbGlhcyBwYXJzZVVpbnRlZ2VyIFBhcnNlVWludGVnZXI7Ci8vLyBEaXR0bwpkZXByZWNhdGVkIGFsaWFzIHBhcnNlVWludGVnZXIgUGFyc2VJbnRlZ2VyOwoKPC90ZXh0YXJlYT48L2Zvcm0+CgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgICAgICBtYXRjaEJyYWNrZXRzOiB0cnVlLAogICAgICAgIGluZGVudFVuaXQ6IDQsCiAgICAgICAgbW9kZTogInRleHQveC1kIgogICAgICB9KTsKICAgIDwvc2NyaXB0PgoKICAgIDxwPlNpbXBsZSBtb2RlIHRoYXQgaGFuZGxlIEQtU3ludGF4ICg8YSBocmVmPSJodHRwOi8vd3d3LmRsYW5nLm9yZyI+RExhbmcgSG9tZXBhZ2U8L2E+KS48L3A+CgogICAgPHA+PHN0cm9uZz5NSU1FIHR5cGVzIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPnRleHQveC1kPC9jb2RlPgogICAgLjwvcD4KICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/diff/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/diff/diff.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJkaWZmIiwgZnVuY3Rpb24oKSB7CgogIHZhciBUT0tFTl9OQU1FUyA9IHsKICAgICcrJzogJ3Bvc2l0aXZlJywKICAgICctJzogJ25lZ2F0aXZlJywKICAgICdAJzogJ21ldGEnCiAgfTsKCiAgcmV0dXJuIHsKICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0pIHsKICAgICAgdmFyIHR3X3BvcyA9IHN0cmVhbS5zdHJpbmcuc2VhcmNoKC9bXHQgXSs/JC8pOwoKICAgICAgaWYgKCFzdHJlYW0uc29sKCkgfHwgdHdfcG9zID09PSAwKSB7CiAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICAgIHJldHVybiAoImVycm9yICIgKyAoCiAgICAgICAgICBUT0tFTl9OQU1FU1tzdHJlYW0uc3RyaW5nLmNoYXJBdCgwKV0gfHwgJycpKS5yZXBsYWNlKC8gJC8sICcnKTsKICAgICAgfQoKICAgICAgdmFyIHRva2VuX25hbWUgPSBUT0tFTl9OQU1FU1tzdHJlYW0ucGVlaygpXSB8fCBzdHJlYW0uc2tpcFRvRW5kKCk7CgogICAgICBpZiAodHdfcG9zID09PSAtMSkgewogICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzdHJlYW0ucG9zID0gdHdfcG9zOwogICAgICB9CgogICAgICByZXR1cm4gdG9rZW5fbmFtZTsKICAgIH0KICB9Owp9KTsKCkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC94LWRpZmYiLCAiZGlmZiIpOwoKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/diff/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogRGlmZiBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9ImRpZmYuanMiPjwvc2NyaXB0Pgo8c3R5bGU+CiAgICAgIC5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgI2RkZDsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkZGQ7fQogICAgICBzcGFuLmNtLW1ldGEge2NvbG9yOiAjYTBiICFpbXBvcnRhbnQ7fQogICAgICBzcGFuLmNtLWVycm9yIHsgYmFja2dyb3VuZC1jb2xvcjogYmxhY2s7IG9wYWNpdHk6IDAuNDt9CiAgICAgIHNwYW4uY20tZXJyb3IuY20tc3RyaW5nIHsgYmFja2dyb3VuZC1jb2xvcjogcmVkOyB9CiAgICAgIHNwYW4uY20tZXJyb3IuY20tdGFnIHsgYmFja2dyb3VuZC1jb2xvcjogIzJiMjsgfQogICAgPC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aW1nIGlkPWxvZ28gc3JjPSIuLi8uLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5MYW5ndWFnZSBtb2RlczwvYT4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+RGlmZjwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+RGlmZiBtb2RlPC9oMj4KPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KZGlmZiAtLWdpdCBhL2luZGV4Lmh0bWwgYi9pbmRleC5odG1sCmluZGV4IGMxZDkxNTYuLjc3NjQ3NDQgMTAwNjQ0Ci0tLSBhL2luZGV4Lmh0bWwKKysrIGIvaW5kZXguaHRtbApAQCAtOTUsNyArOTUsOCBAQCBTdHJpbmdTdHJlYW0ucHJvdG90eXBlID0gewogICAgIDxzY3JpcHQ+CiAgICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKLSAgICAgICAgYXV0b01hdGNoQnJhY2tldHM6IHRydWUKKyAgICAgICAgYXV0b01hdGNoQnJhY2tldHM6IHRydWUsCisgICAgICBvbkd1dHRlckNsaWNrOiBmdW5jdGlvbih4KXtjb25zb2xlLmxvZyh4KTt9CiAgICAgICB9KTsKICAgICA8L3NjcmlwdD4KICAgPC9ib2R5PgpkaWZmIC0tZ2l0IGEvbGliL2NvZGVtaXJyb3IuanMgYi9saWIvY29kZW1pcnJvci5qcwppbmRleCAwNDY0NmE5Li45YTM5Y2M3IDEwMDY0NAotLS0gYS9saWIvY29kZW1pcnJvci5qcworKysgYi9saWIvY29kZW1pcnJvci5qcwpAQCAtMzk5LDEwICszOTksMTYgQEAgdmFyIENvZGVNaXJyb3IgPSAoZnVuY3Rpb24oKSB7CiAgICAgfQogCiAgICAgZnVuY3Rpb24gb25Nb3VzZURvd24oZSkgewotICAgICAgdmFyIHN0YXJ0ID0gcG9zRnJvbU1vdXNlKGUpLCBsYXN0ID0gc3RhcnQ7ICAgIAorICAgICAgdmFyIHN0YXJ0ID0gcG9zRnJvbU1vdXNlKGUpLCBsYXN0ID0gc3RhcnQsIHRhcmdldCA9IGUudGFyZ2V0KCk7CiAgICAgICBpZiAoIXN0YXJ0KSByZXR1cm47CiAgICAgICBzZXRDdXJzb3Ioc3RhcnQubGluZSwgc3RhcnQuY2gsIGZhbHNlKTsKICAgICAgIGlmIChlLmJ1dHRvbigpICE9IDEpIHJldHVybjsKKyAgICAgIGlmICh0YXJnZXQucGFyZW50Tm9kZSA9PSBndXR0ZXIpIHsgICAgCisgICAgICAgIGlmIChvcHRpb25zLm9uR3V0dGVyQ2xpY2spCisgICAgICAgICAgb3B0aW9ucy5vbkd1dHRlckNsaWNrKGluZGV4T2YoZ3V0dGVyLmNoaWxkTm9kZXMsIHRhcmdldCkgKyBzaG93aW5nRnJvbSk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKwogICAgICAgaWYgKCFmb2N1c2VkKSBvbkZvY3VzKCk7CiAKICAgICAgIGUuc3RvcCgpOwpAQCAtODA4LDcgKzgxNCw3IEBAIHZhciBDb2RlTWlycm9yID0gKGZ1bmN0aW9uKCkgewogICAgICAgZm9yICh2YXIgaSA9IHNob3dpbmdGcm9tOyBpIDwgc2hvd2luZ1RvOyArK2kpIHsKICAgICAgICAgdmFyIG1hcmtlciA9IGxpbmVzW2ldLmd1dHRlck1hcmtlcjsKICAgICAgICAgaWYgKG1hcmtlcikgaHRtbC5wdXNoKCc8ZGl2IGNsYXNzPSInICsgbWFya2VyLnN0eWxlICsgJyI+JyArIGh0bWxFc2NhcGUobWFya2VyLnRleHQpICsgJzwvZGl2PicpOwotICAgICAgICBlbHNlIGh0bWwucHVzaCgiPGRpdj4iICsgKG9wdGlvbnMubGluZU51bWJlcnMgPyBpICsgMSA6ICJcdTAwYTAiKSArICI8L2Rpdj4iKTsKKyAgICAgICAgZWxzZSBodG1sLnB1c2goIjxkaXY+IiArIChvcHRpb25zLmxpbmVOdW1iZXJzID8gaSArIG9wdGlvbnMuZmlyc3RMaW5lTnVtYmVyIDogIlx1MDBhMCIpICsgIjwvZGl2PiIpOwogICAgICAgfQogICAgICAgZ3V0dGVyLnN0eWxlLmRpc3BsYXkgPSAibm9uZSI7IC8vIFRPRE8gdGVzdCB3aGV0aGVyIHRoaXMgYWN0dWFsbHkgaGVscHMKICAgICAgIGd1dHRlci5pbm5lckhUTUwgPSBodG1sLmpvaW4oIiIpOwpAQCAtMTM3MSwxMCArMTM3Nyw4IEBAIHZhciBDb2RlTWlycm9yID0gKGZ1bmN0aW9uKCkgewogICAgICAgICBpZiAob3B0aW9uID09ICJwYXJzZXIiKSBzZXRQYXJzZXIodmFsdWUpOwogICAgICAgICBlbHNlIGlmIChvcHRpb24gPT09ICJsaW5lTnVtYmVycyIpIHNldExpbmVOdW1iZXJzKHZhbHVlKTsKICAgICAgICAgZWxzZSBpZiAob3B0aW9uID09PSAiZ3V0dGVyIikgc2V0R3V0dGVyKHZhbHVlKTsKLSAgICAgICAgZWxzZSBpZiAob3B0aW9uID09PSAicmVhZE9ubHkiKSBvcHRpb25zLnJlYWRPbmx5ID0gdmFsdWU7Ci0gICAgICAgIGVsc2UgaWYgKG9wdGlvbiA9PT0gImluZGVudFVuaXQiKSB7b3B0aW9ucy5pbmRlbnRVbml0ID0gaW5kZW50VW5pdCA9IHZhbHVlOyBzZXRQYXJzZXIob3B0aW9ucy5wYXJzZXIpO30KLSAgICAgICAgZWxzZSBpZiAoL14oPzplbnRlck1vZGV8dGFiTW9kZXxpbmRlbnRXaXRoVGFic3xyZWFkT25seXxhdXRvTWF0Y2hCcmFja2V0c3x1bmRvRGVwdGgpJC8udGVzdChvcHRpb24pKSBvcHRpb25zW29wdGlvbl0gPSB2YWx1ZTsKLSAgICAgICAgZWxzZSB0aHJvdyBuZXcgRXJyb3IoIkNhbid0IHNldCBvcHRpb24gIiArIG9wdGlvbik7CisgICAgICAgIGVsc2UgaWYgKG9wdGlvbiA9PT0gImluZGVudFVuaXQiKSB7b3B0aW9ucy5pbmRlbnRVbml0ID0gdmFsdWU7IHNldFBhcnNlcihvcHRpb25zLnBhcnNlcik7fQorICAgICAgICBlbHNlIG9wdGlvbnNbb3B0aW9uXSA9IHZhbHVlOwogICAgICAgfSwKICAgICAgIGN1cnNvckNvb3JkczogY3Vyc29yQ29vcmRzLAogICAgICAgdW5kbzogb3BlcmF0aW9uKHVuZG8pLApAQCAtMTQwMiw3ICsxNDA2LDggQEAgdmFyIENvZGVNaXJyb3IgPSAoZnVuY3Rpb24oKSB7CiAgICAgICByZXBsYWNlUmFuZ2U6IG9wZXJhdGlvbihyZXBsYWNlUmFuZ2UpLAogCiAgICAgICBvcGVyYXRpb246IGZ1bmN0aW9uKGYpe3JldHVybiBvcGVyYXRpb24oZikoKTt9LAotICAgICAgcmVmcmVzaDogZnVuY3Rpb24oKXt1cGRhdGVEaXNwbGF5KFt7ZnJvbTogMCwgdG86IGxpbmVzLmxlbmd0aH1dKTt9CisgICAgICByZWZyZXNoOiBmdW5jdGlvbigpe3VwZGF0ZURpc3BsYXkoW3tmcm9tOiAwLCB0bzogbGluZXMubGVuZ3RofV0pO30sCisgICAgICBnZXRJbnB1dEZpZWxkOiBmdW5jdGlvbigpe3JldHVybiBpbnB1dDt9CiAgICAgfTsKICAgICByZXR1cm4gaW5zdGFuY2U7CiAgIH0KQEAgLTE0MjAsNiArMTQyNSw3IEBAIHZhciBDb2RlTWlycm9yID0gKGZ1bmN0aW9uKCkgewogICAgIHJlYWRPbmx5OiBmYWxzZSwKICAgICBvbkNoYW5nZTogbnVsbCwKICAgICBvbkN1cnNvckFjdGl2aXR5OiBudWxsLAorICAgIG9uR3V0dGVyQ2xpY2s6IG51bGwsCiAgICAgYXV0b01hdGNoQnJhY2tldHM6IGZhbHNlLAogICAgIHdvcmtUaW1lOiAyMDAsCiAgICAgd29ya0RlbGF5OiAzMDAsCjwvdGV4dGFyZWE+PC9mb3JtPgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHt9KTsKICAgIDwvc2NyaXB0PgoKICAgIDxwPjxzdHJvbmc+TUlNRSB0eXBlcyBkZWZpbmVkOjwvc3Ryb25nPiA8Y29kZT50ZXh0L3gtZGlmZjwvY29kZT4uPC9wPgoKICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/django/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/django/django.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSwgcmVxdWlyZSgiLi4vaHRtbG1peGVkL2h0bWxtaXhlZCIpLAogICAgICAgIHJlcXVpcmUoIi4uLy4uL2FkZG9uL21vZGUvb3ZlcmxheSIpKTsKICBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCkgLy8gQU1ECiAgICBkZWZpbmUoWyIuLi8uLi9saWIvY29kZW1pcnJvciIsICIuLi9odG1sbWl4ZWQvaHRtbG1peGVkIiwKICAgICAgICAgICAgIi4uLy4uL2FkZG9uL21vZGUvb3ZlcmxheSJdLCBtb2QpOwogIGVsc2UgLy8gUGxhaW4gYnJvd3NlciBlbnYKICAgIG1vZChDb2RlTWlycm9yKTsKfSkoZnVuY3Rpb24oQ29kZU1pcnJvcikgewogICJ1c2Ugc3RyaWN0IjsKCiAgQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJkamFuZ286aW5uZXIiLCBmdW5jdGlvbigpIHsKICAgIHZhciBrZXl3b3JkcyA9IFsiYmxvY2siLCAiZW5kYmxvY2siLCAiZm9yIiwgImVuZGZvciIsICJpbiIsICJ0cnVlIiwgImZhbHNlIiwKICAgICAgICAgICAgICAgICAgICAibG9vcCIsICJub25lIiwgInNlbGYiLCAic3VwZXIiLCAiaWYiLCAiZW5kaWYiLCAiYXMiLCAibm90IiwgImFuZCIsCiAgICAgICAgICAgICAgICAgICAgImVsc2UiLCAiaW1wb3J0IiwgIndpdGgiLCAiZW5kd2l0aCIsICJ3aXRob3V0IiwgImNvbnRleHQiLCAiaWZlcXVhbCIsICJlbmRpZmVxdWFsIiwKICAgICAgICAgICAgICAgICAgICAiaWZub3RlcXVhbCIsICJlbmRpZm5vdGVxdWFsIiwgImV4dGVuZHMiLCAiaW5jbHVkZSIsICJsb2FkIiwgImxlbmd0aCIsICJjb21tZW50IiwKICAgICAgICAgICAgICAgICAgICAiZW5kY29tbWVudCIsICJlbXB0eSJdOwogICAga2V5d29yZHMgPSBuZXcgUmVnRXhwKCJeKCgiICsga2V5d29yZHMuam9pbigiKXwoIikgKyAiKSlcXGIiKTsKCiAgICBmdW5jdGlvbiB0b2tlbkJhc2UgKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXlx7XS8pOwogICAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpOwogICAgICBpZiAoY2ggPT0gInsiKSB7CiAgICAgICAgaWYgKGNoID0gc3RyZWFtLmVhdCgvXHt8JXwjLykpIHsKICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gaW5UYWcoY2gpOwogICAgICAgICAgcmV0dXJuICJ0YWciOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gaW5UYWcgKGNsb3NlKSB7CiAgICAgIGlmIChjbG9zZSA9PSAieyIpIHsKICAgICAgICBjbG9zZSA9ICJ9IjsKICAgICAgfQogICAgICByZXR1cm4gZnVuY3Rpb24gKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpOwogICAgICAgIGlmICgoY2ggPT0gY2xvc2UpICYmIHN0cmVhbS5lYXQoIn0iKSkgewogICAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICAgICAgICByZXR1cm4gInRhZyI7CiAgICAgICAgfQogICAgICAgIGlmIChzdHJlYW0ubWF0Y2goa2V5d29yZHMpKSB7CiAgICAgICAgICByZXR1cm4gImtleXdvcmQiOwogICAgICAgIH0KICAgICAgICByZXR1cm4gY2xvc2UgPT0gIiMiID8gImNvbW1lbnQiIDogInN0cmluZyI7CiAgICAgIH07CiAgICB9CiAgICByZXR1cm4gewogICAgICBzdGFydFN0YXRlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIHt0b2tlbml6ZTogdG9rZW5CYXNlfTsKICAgICAgfSwKICAgICAgdG9rZW46IGZ1bmN0aW9uIChzdHJlYW0sIHN0YXRlKSB7CiAgICAgICAgcmV0dXJuIHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgICB9CiAgICB9OwogIH0pOwoKICBDb2RlTWlycm9yLmRlZmluZU1vZGUoImRqYW5nbyIsIGZ1bmN0aW9uKGNvbmZpZykgewogICAgdmFyIGh0bWxCYXNlID0gQ29kZU1pcnJvci5nZXRNb2RlKGNvbmZpZywgInRleHQvaHRtbCIpOwogICAgdmFyIGRqYW5nb0lubmVyID0gQ29kZU1pcnJvci5nZXRNb2RlKGNvbmZpZywgImRqYW5nbzppbm5lciIpOwogICAgcmV0dXJuIENvZGVNaXJyb3Iub3ZlcmxheU1vZGUoaHRtbEJhc2UsIGRqYW5nb0lubmVyKTsKICB9KTsKCiAgQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtZGphbmdvIiwgImRqYW5nbyIpOwp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/django/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogRGphbmdvIHRlbXBsYXRlIG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vLi4vYWRkb24vbW9kZS9vdmVybGF5LmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL3htbC94bWwuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vaHRtbG1peGVkL2h0bWxtaXhlZC5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJkamFuZ28uanMiPjwvc2NyaXB0Pgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPi5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazt9PC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aW1nIGlkPWxvZ28gc3JjPSIuLi8uLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5MYW5ndWFnZSBtb2RlczwvYT4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+RGphbmdvPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5EamFuZ28gdGVtcGxhdGUgbW9kZTwvaDI+Cjxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KICAgIDxoZWFkPgogICAgICAgIDx0aXRsZT5NeSBEamFuZ28gd2ViIGFwcGxpY2F0aW9uPC90aXRsZT4KICAgIDwvaGVhZD4KICAgIDxib2R5PgogICAgICAgIDxoMT4KICAgICAgICAgICAge3sgcGFnZS50aXRsZSB9fQogICAgICAgIDwvaDE+CiAgICAgICAgPHVsIGNsYXNzPSJteS1saXN0Ij4KICAgICAgICAgICAgeyUgZm9yIGl0ZW0gaW4gaXRlbXMgJX0KICAgICAgICAgICAgICAgIDxsaT57JSBpdGVtLm5hbWUgJX08L2xpPgogICAgICAgICAgICB7JSBlbXB0eSAlfQogICAgICAgICAgICAgICAgPGxpPllvdSBoYXZlIG5vIGl0ZW1zIGluIHlvdXIgbGlzdC48L2xpPgogICAgICAgICAgICB7JSBlbmRmb3IgJX0KICAgICAgICA8L3VsPgogICAgPC9ib2R5Pgo8L2h0bWw+CjwvdGV4dGFyZWE+PC9mb3JtPgoKICAgIDxzY3JpcHQ+CiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICAgICAgbGluZU51bWJlcnM6IHRydWUsCiAgICAgICAgbW9kZTogImRqYW5nbyIsCiAgICAgICAgaW5kZW50VW5pdDogNCwKICAgICAgICBpbmRlbnRXaXRoVGFiczogdHJ1ZQogICAgICB9KTsKICAgIDwvc2NyaXB0PgoKICAgIDxwPk1vZGUgZm9yIEhUTUwgd2l0aCBlbWJlZGRlZCBEamFuZ28gdGVtcGxhdGUgbWFya3VwLjwvcD4KCiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC94LWRqYW5nbzwvY29kZT48L3A+CiAgPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/dtd/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/dtd/dtd.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovKgogIERURCBtb2RlCiAgUG9ydGVkIHRvIENvZGVNaXJyb3IgYnkgUGV0ZXIgS3Jvb24gPHBsYWtyb29uQGdtYWlsLmNvbT4KICBSZXBvcnQgYnVncy9pc3N1ZXMgaGVyZTogaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvQ29kZU1pcnJvci9pc3N1ZXMKICBHaXRIdWI6IEBwZXRlcmtyb29uCiovCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJkdGQiLCBmdW5jdGlvbihjb25maWcpIHsKICB2YXIgaW5kZW50VW5pdCA9IGNvbmZpZy5pbmRlbnRVbml0LCB0eXBlOwogIGZ1bmN0aW9uIHJldChzdHlsZSwgdHApIHt0eXBlID0gdHA7IHJldHVybiBzdHlsZTt9CgogIGZ1bmN0aW9uIHRva2VuQmFzZShzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpOwoKICAgIGlmIChjaCA9PSAiPCIgJiYgc3RyZWFtLmVhdCgiISIpICkgewogICAgICBpZiAoc3RyZWFtLmVhdFdoaWxlKC9bXC1dLykpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuU0dNTENvbW1lbnQ7CiAgICAgICAgcmV0dXJuIHRva2VuU0dNTENvbW1lbnQoc3RyZWFtLCBzdGF0ZSk7CiAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLmVhdFdoaWxlKC9bXHddLykpIHJldHVybiByZXQoImtleXdvcmQiLCAiZG9pbmRlbnQiKTsKICAgIH0gZWxzZSBpZiAoY2ggPT0gIjwiICYmIHN0cmVhbS5lYXQoIj8iKSkgeyAvL3htbCBkZWNsYXJhdGlvbgogICAgICBzdGF0ZS50b2tlbml6ZSA9IGluQmxvY2soIm1ldGEiLCAiPz4iKTsKICAgICAgcmV0dXJuIHJldCgibWV0YSIsIGNoKTsKICAgIH0gZWxzZSBpZiAoY2ggPT0gIiMiICYmIHN0cmVhbS5lYXRXaGlsZSgvW1x3XS8pKSByZXR1cm4gcmV0KCJhdG9tIiwgInRhZyIpOwogICAgZWxzZSBpZiAoY2ggPT0gInwiKSByZXR1cm4gcmV0KCJrZXl3b3JkIiwgInNlcGVyYXRvciIpOwogICAgZWxzZSBpZiAoY2gubWF0Y2goL1tcKFwpXFtcXVwtXC4sXCtcPz5dLykpIHJldHVybiByZXQobnVsbCwgY2gpOy8vaWYoY2ggPT09ICI+IikgcmV0dXJuIHJldChudWxsLCAiZW5kdGFnIik7IGVsc2UKICAgIGVsc2UgaWYgKGNoLm1hdGNoKC9bXFtcXV0vKSkgcmV0dXJuIHJldCgicnVsZSIsIGNoKTsKICAgIGVsc2UgaWYgKGNoID09ICJcIiIgfHwgY2ggPT0gIiciKSB7CiAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5TdHJpbmcoY2gpOwogICAgICByZXR1cm4gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CiAgICB9IGVsc2UgaWYgKHN0cmVhbS5lYXRXaGlsZSgvW2EtekEtWlw/XCtcZF0vKSkgewogICAgICB2YXIgc2MgPSBzdHJlYW0uY3VycmVudCgpOwogICAgICBpZiggc2Muc3Vic3RyKHNjLmxlbmd0aC0xLHNjLmxlbmd0aCkubWF0Y2goL1w/fFwrLykgIT09IG51bGwgKXN0cmVhbS5iYWNrVXAoMSk7CiAgICAgIHJldHVybiByZXQoInRhZyIsICJ0YWciKTsKICAgIH0gZWxzZSBpZiAoY2ggPT0gIiUiIHx8IGNoID09ICIqIiApIHJldHVybiByZXQoIm51bWJlciIsICJudW1iZXIiKTsKICAgIGVsc2UgewogICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcd1xcXC1fJS57LF0vKTsKICAgICAgcmV0dXJuIHJldChudWxsLCBudWxsKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHRva2VuU0dNTENvbW1lbnQoc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIGRhc2hlcyA9IDAsIGNoOwogICAgd2hpbGUgKChjaCA9IHN0cmVhbS5uZXh0KCkpICE9IG51bGwpIHsKICAgICAgaWYgKGRhc2hlcyA+PSAyICYmIGNoID09ICI+IikgewogICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGRhc2hlcyA9IChjaCA9PSAiLSIpID8gZGFzaGVzICsgMSA6IDA7CiAgICB9CiAgICByZXR1cm4gcmV0KCJjb21tZW50IiwgImNvbW1lbnQiKTsKICB9CgogIGZ1bmN0aW9uIHRva2VuU3RyaW5nKHF1b3RlKSB7CiAgICByZXR1cm4gZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICB2YXIgZXNjYXBlZCA9IGZhbHNlLCBjaDsKICAgICAgd2hpbGUgKChjaCA9IHN0cmVhbS5uZXh0KCkpICE9IG51bGwpIHsKICAgICAgICBpZiAoY2ggPT0gcXVvdGUgJiYgIWVzY2FwZWQpIHsKICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGVzY2FwZWQgPSAhZXNjYXBlZCAmJiBjaCA9PSAiXFwiOwogICAgICB9CiAgICAgIHJldHVybiByZXQoInN0cmluZyIsICJ0YWciKTsKICAgIH07CiAgfQoKICBmdW5jdGlvbiBpbkJsb2NrKHN0eWxlLCB0ZXJtaW5hdG9yKSB7CiAgICByZXR1cm4gZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICB3aGlsZSAoIXN0cmVhbS5lb2woKSkgewogICAgICAgIGlmIChzdHJlYW0ubWF0Y2godGVybWluYXRvcikpIHsKICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHN0eWxlOwogICAgfTsKICB9CgogIHJldHVybiB7CiAgICBzdGFydFN0YXRlOiBmdW5jdGlvbihiYXNlKSB7CiAgICAgIHJldHVybiB7dG9rZW5pemU6IHRva2VuQmFzZSwKICAgICAgICAgICAgICBiYXNlSW5kZW50OiBiYXNlIHx8IDAsCiAgICAgICAgICAgICAgc3RhY2s6IFtdfTsKICAgIH0sCgogICAgdG9rZW46IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgaWYgKHN0cmVhbS5lYXRTcGFjZSgpKSByZXR1cm4gbnVsbDsKICAgICAgdmFyIHN0eWxlID0gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CgogICAgICB2YXIgY29udGV4dCA9IHN0YXRlLnN0YWNrW3N0YXRlLnN0YWNrLmxlbmd0aC0xXTsKICAgICAgaWYgKHN0cmVhbS5jdXJyZW50KCkgPT0gIlsiIHx8IHR5cGUgPT09ICJkb2luZGVudCIgfHwgdHlwZSA9PSAiWyIpIHN0YXRlLnN0YWNrLnB1c2goInJ1bGUiKTsKICAgICAgZWxzZSBpZiAodHlwZSA9PT0gImVuZHRhZyIpIHN0YXRlLnN0YWNrW3N0YXRlLnN0YWNrLmxlbmd0aC0xXSA9ICJlbmR0YWciOwogICAgICBlbHNlIGlmIChzdHJlYW0uY3VycmVudCgpID09ICJdIiB8fCB0eXBlID09ICJdIiB8fCAodHlwZSA9PSAiPiIgJiYgY29udGV4dCA9PSAicnVsZSIpKSBzdGF0ZS5zdGFjay5wb3AoKTsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAiWyIpIHN0YXRlLnN0YWNrLnB1c2goIlsiKTsKICAgICAgcmV0dXJuIHN0eWxlOwogICAgfSwKCiAgICBpbmRlbnQ6IGZ1bmN0aW9uKHN0YXRlLCB0ZXh0QWZ0ZXIpIHsKICAgICAgdmFyIG4gPSBzdGF0ZS5zdGFjay5sZW5ndGg7CgogICAgICBpZiggdGV4dEFmdGVyLm1hdGNoKC9cXVxzK3xcXS8pICluPW4tMTsKICAgICAgZWxzZSBpZih0ZXh0QWZ0ZXIuc3Vic3RyKHRleHRBZnRlci5sZW5ndGgtMSwgdGV4dEFmdGVyLmxlbmd0aCkgPT09ICI+Iil7CiAgICAgICAgaWYodGV4dEFmdGVyLnN1YnN0cigwLDEpID09PSAiPCIpbjsKICAgICAgICBlbHNlIGlmKCB0eXBlID09ICJkb2luZGVudCIgJiYgdGV4dEFmdGVyLmxlbmd0aCA+IDEgKW47CiAgICAgICAgZWxzZSBpZiggdHlwZSA9PSAiZG9pbmRlbnQiKW4tLTsKICAgICAgICBlbHNlIGlmKCB0eXBlID09ICI+IiAmJiB0ZXh0QWZ0ZXIubGVuZ3RoID4gMSluOwogICAgICAgIGVsc2UgaWYoIHR5cGUgPT0gInRhZyIgJiYgdGV4dEFmdGVyICE9PSAiPiIpbjsKICAgICAgICBlbHNlIGlmKCB0eXBlID09ICJ0YWciICYmIHN0YXRlLnN0YWNrW3N0YXRlLnN0YWNrLmxlbmd0aC0xXSA9PSAicnVsZSIpbi0tOwogICAgICAgIGVsc2UgaWYoIHR5cGUgPT0gInRhZyIpbisrOwogICAgICAgIGVsc2UgaWYoIHRleHRBZnRlciA9PT0gIj4iICYmIHN0YXRlLnN0YWNrW3N0YXRlLnN0YWNrLmxlbmd0aC0xXSA9PSAicnVsZSIgJiYgdHlwZSA9PT0gIj4iKW4tLTsKICAgICAgICBlbHNlIGlmKCB0ZXh0QWZ0ZXIgPT09ICI+IiAmJiBzdGF0ZS5zdGFja1tzdGF0ZS5zdGFjay5sZW5ndGgtMV0gPT0gInJ1bGUiKW47CiAgICAgICAgZWxzZSBpZiggdGV4dEFmdGVyLnN1YnN0cigwLDEpICE9PSAiPCIgJiYgdGV4dEFmdGVyLnN1YnN0cigwLDEpID09PSAiPiIgKW49bi0xOwogICAgICAgIGVsc2UgaWYoIHRleHRBZnRlciA9PT0gIj4iKW47CiAgICAgICAgZWxzZSBuPW4tMTsKICAgICAgICAvL292ZXIgcnVsZSB0aGVtIGFsbAogICAgICAgIGlmKHR5cGUgPT0gbnVsbCB8fCB0eXBlID09ICJdIiluLS07CiAgICAgIH0KCiAgICAgIHJldHVybiBzdGF0ZS5iYXNlSW5kZW50ICsgbiAqIGluZGVudFVuaXQ7CiAgICB9LAoKICAgIGVsZWN0cmljQ2hhcnM6ICJdPiIKICB9Owp9KTsKCkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgiYXBwbGljYXRpb24veG1sLWR0ZCIsICJkdGQiKTsKCn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/dtd/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogRFREIG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iZHRkLmpzIj48L3NjcmlwdD4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4uQ29kZU1pcnJvciB7Ym9yZGVyLXRvcDogMXB4IHNvbGlkIGJsYWNrOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGltZyBpZD1sb2dvIHNyYz0iLi4vLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+TGFuZ3VhZ2UgbW9kZXM8L2E+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPkRURDwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+RFREIG1vZGU8L2gyPgo8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPjw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cgo8IUFUVExJU1QgdGl0bGUKICB4bWxucwlDREFUQQkjRklYRUQJImh0dHA6Ly9kb2Nib29rLm9yZy9ucy9kb2Nib29rIgogIHJvbGUJQ0RBVEEJI0lNUExJRUQKICAlZGIuY29tbW9uLmF0dHJpYnV0ZXM7CiAgJWRiLmNvbW1vbi5saW5raW5nLmF0dHJpYnV0ZXM7Cj4KCjwhLS0KICBUcnk6IGh0dHA6Ly9kb2Nib29rLm9yZy94bWwvNS4wL2R0ZC9kb2Nib29rLmR0ZAotLT4KCjwhRE9DVFlQRSB4c2w6c3R5bGVzaGVldAogIFsKICAgIDwhRU5USVRZIG5ic3AgICAiJmFtcDsjMTYwOyI+CiAgICA8IUVOVElUWSBjb3B5ICAgIiZhbXA7IzE2OTsiPgogICAgPCFFTlRJVFkgcmVnICAgICImYW1wOyMxNzQ7Ij4KICAgIDwhRU5USVRZIHRyYWRlICAiJmFtcDsjODQ4MjsiPgogICAgPCFFTlRJVFkgbWRhc2ggICImYW1wOyM4MjEyOyI+CiAgICA8IUVOVElUWSBsZHF1byAgIiZhbXA7IzgyMjA7Ij4KICAgIDwhRU5USVRZIHJkcXVvICAiJmFtcDsjODIyMTsiPgogICAgPCFFTlRJVFkgcG91bmQgICImYW1wOyMxNjM7Ij4KICAgIDwhRU5USVRZIHllbiAgICAiJmFtcDsjMTY1OyI+CiAgICA8IUVOVElUWSBldXJvICAgIiZhbXA7IzgzNjQ7Ij4KICAgIDwhRU5USVRZIG1hdGhtbCAiaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01hdGhNTCI+CiAgXQo+Cgo8IUVMRU1FTlQgdGl0bGUgKCNQQ0RBVEF8aW5saW5lbWVkaWFvYmplY3R8cmVtYXJrfHN1cGVyc2NyaXB0fHN1YnNjcmlwdHx4cmVmfGxpbmt8b2xpbmt8YW5jaG9yfGJpYmxpb3JlZnxhbHR8YW5ub3RhdGlvbnxpbmRleHRlcm18YWJicmV2fGFjcm9ueW18ZGF0ZXxlbXBoYXNpc3xmb290bm90ZXxmb290bm90ZXJlZnxmb3JlaWducGhyYXNlfHBocmFzZXxxdW90ZXx3b3JkYXN3b3JkfGZpcnN0dGVybXxnbG9zc3Rlcm18Y29yZWZ8dHJhZGVtYXJrfHByb2R1Y3RudW1iZXJ8cHJvZHVjdG5hbWV8ZGF0YWJhc2V8YXBwbGljYXRpb258aGFyZHdhcmV8Y2l0YXRpb258Y2l0ZXJlZmVudHJ5fGNpdGV0aXRsZXxjaXRlYmlibGlvaWR8YXV0aG9yfHBlcnNvbnxwZXJzb25uYW1lfG9yZ3xvcmduYW1lfGVkaXRvcnxqb2J0aXRsZXxyZXBsYWNlYWJsZXxwYWNrYWdlfHBhcmFtZXRlcnx0ZXJtZGVmfG5vbnRlcm1pbmFsfHN5c3RlbWl0ZW18b3B0aW9ufG9wdGlvbmFsfHByb3BlcnR5fGlubGluZWVxdWF0aW9ufHRhZ3xtYXJrdXB8dG9rZW58c3ltYm9sfGxpdGVyYWx8Y29kZXxjb25zdGFudHxlbWFpbHx1cml8Z3VpaWNvbnxndWlidXR0b258Z3VpbWVudWl0ZW18Z3VpbWVudXxndWlzdWJtZW51fGd1aWxhYmVsfG1lbnVjaG9pY2V8bW91c2VidXR0b258a2V5Y29tYm98a2V5Y2FwfGtleWNvZGV8a2V5c3ltfHNob3J0Y3V0fGFjY2VsfHByb21wdHxlbnZhcnxmaWxlbmFtZXxjb21tYW5kfGNvbXB1dGVyb3V0cHV0fHVzZXJpbnB1dHxmdW5jdGlvbnx2YXJuYW1lfHJldHVybnZhbHVlfHR5cGV8Y2xhc3NuYW1lfGV4Y2VwdGlvbm5hbWV8aW50ZXJmYWNlbmFtZXxtZXRob2RuYW1lfG1vZGlmaWVyfGluaXRpYWxpemVyfG9vY2xhc3N8b29leGNlcHRpb258b29pbnRlcmZhY2V8ZXJyb3Jjb2RlfGVycm9ydGV4dHxlcnJvcm5hbWV8ZXJyb3J0eXBlKSo+Cgo8IUVOVElUWSAlIGRiLmNvbW1vbi5hdHRyaWJ1dGVzICIKICB4bWw6aWQJSUQJI0lNUExJRUQKICB2ZXJzaW9uCUNEQVRBCSNJTVBMSUVECiAgeG1sOmxhbmcJQ0RBVEEJI0lNUExJRUQKICB4bWw6YmFzZQlDREFUQQkjSU1QTElFRAogIHJlbWFwCUNEQVRBCSNJTVBMSUVECiAgeHJlZmxhYmVsCUNEQVRBCSNJTVBMSUVECiAgcmV2aXNpb25mbGFnCShjaGFuZ2VkfGFkZGVkfGRlbGV0ZWR8b2ZmKQkjSU1QTElFRAogIGRpcgkobHRyfHJ0bHxscm98cmxvKQkjSU1QTElFRAogIGFyY2gJQ0RBVEEJI0lNUExJRUQKICBhdWRpZW5jZQlDREFUQQkjSU1QTElFRAogIGNvbmRpdGlvbglDREFUQQkjSU1QTElFRAogIGNvbmZvcm1hbmNlCUNEQVRBCSNJTVBMSUVECiAgb3MJQ0RBVEEJI0lNUExJRUQKICByZXZpc2lvbglDREFUQQkjSU1QTElFRAogIHNlY3VyaXR5CUNEQVRBCSNJTVBMSUVECiAgdXNlcmxldmVsCUNEQVRBCSNJTVBMSUVECiAgdmVuZG9yCUNEQVRBCSNJTVBMSUVECiAgd29yZHNpemUJQ0RBVEEJI0lNUExJRUQKICBhbm5vdGF0aW9ucwlDREFUQQkjSU1QTElFRAoKIj48L3RleHRhcmVhPjwvZm9ybT4KICAgIDxzY3JpcHQ+CiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICAgICAgbW9kZToge25hbWU6ICJkdGQiLCBhbGlnbkNEQVRBOiB0cnVlfSwKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgICAgICBsaW5lV3JhcHBpbmc6IHRydWUKICAgICAgfSk7CiAgICA8L3NjcmlwdD4KCiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+YXBwbGljYXRpb24veG1sLWR0ZDwvY29kZT4uPC9wPgogIDwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/dylan/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/dylan/dylan.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJkeWxhbiIsIGZ1bmN0aW9uKF9jb25maWcpIHsKICAvLyBXb3JkcwogIHZhciB3b3JkcyA9IHsKICAgIC8vIFdvcmRzIHRoYXQgaW50cm9kdWNlIHVubmFtZWQgZGVmaW5pdGlvbnMgbGlrZSAiZGVmaW5lIGludGVyZmFjZSIKICAgIHVubmFtZWREZWZpbml0aW9uOiBbImludGVyZmFjZSJdLAoKICAgIC8vIFdvcmRzIHRoYXQgaW50cm9kdWNlIHNpbXBsZSBuYW1lZCBkZWZpbml0aW9ucyBsaWtlICJkZWZpbmUgbGlicmFyeSIKICAgIG5hbWVkRGVmaW5pdGlvbjogWyJtb2R1bGUiLCAibGlicmFyeSIsICJtYWNybyIsCiAgICAgICAgICAgICAgICAgICAgICAiQy1zdHJ1Y3QiLCAiQy11bmlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAiQy1mdW5jdGlvbiIsICJDLWNhbGxhYmxlLXdyYXBwZXIiCiAgICAgICAgICAgICAgICAgICAgIF0sCgogICAgLy8gV29yZHMgdGhhdCBpbnRyb2R1Y2UgdHlwZSBkZWZpbml0aW9ucyBsaWtlICJkZWZpbmUgY2xhc3MiLgogICAgLy8gVGhlc2UgYXJlIGFsc28gcGFyYW1ldGVyaXplZCBsaWtlICJkZWZpbmUgbWV0aG9kIiBhbmQgYXJlCiAgICAvLyBhcHBlbmRlZCB0byBvdGhlclBhcmFtZXRlcml6ZWREZWZpbml0aW9uV29yZHMKICAgIHR5cGVQYXJhbWV0ZXJpemVkRGVmaW5pdGlvbjogWyJjbGFzcyIsICJDLXN1YnR5cGUiLCAiQy1tYXBwZWQtc3VidHlwZSJdLAoKICAgIC8vIFdvcmRzIHRoYXQgaW50cm9kdWNlIHRyaWNraWVyIGRlZmluaXRpb25zIGxpa2UgImRlZmluZSBtZXRob2QiLgogICAgLy8gVGhlc2UgcmVxdWlyZSBzcGVjaWFsIGRlZmluaXRpb25zIHRvIGJlIGFkZGVkIHRvIHN0YXJ0RXhwcmVzc2lvbnMKICAgIG90aGVyUGFyYW1ldGVyaXplZERlZmluaXRpb246IFsibWV0aG9kIiwgImZ1bmN0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQy12YXJpYWJsZSIsICJDLWFkZHJlc3MiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAoKICAgIC8vIFdvcmRzIHRoYXQgaW50cm9kdWNlIG1vZHVsZSBjb25zdGFudCBkZWZpbml0aW9ucy4KICAgIC8vIFRoZXNlIG11c3QgYWxzbyBiZSBzaW1wbGUgZGVmaW5pdGlvbnMgYW5kIGFyZQogICAgLy8gYXBwZW5kZWQgdG8gb3RoZXJTaW1wbGVEZWZpbml0aW9uV29yZHMKICAgIGNvbnN0YW50U2ltcGxlRGVmaW5pdGlvbjogWyJjb25zdGFudCJdLAoKICAgIC8vIFdvcmRzIHRoYXQgaW50cm9kdWNlIG1vZHVsZSB2YXJpYWJsZSBkZWZpbml0aW9ucy4KICAgIC8vIFRoZXNlIG11c3QgYWxzbyBiZSBzaW1wbGUgZGVmaW5pdGlvbnMgYW5kIGFyZQogICAgLy8gYXBwZW5kZWQgdG8gb3RoZXJTaW1wbGVEZWZpbml0aW9uV29yZHMKICAgIHZhcmlhYmxlU2ltcGxlRGVmaW5pdGlvbjogWyJ2YXJpYWJsZSJdLAoKICAgIC8vIE90aGVyIHdvcmRzIHRoYXQgaW50cm9kdWNlIHNpbXBsZSBkZWZpbml0aW9ucwogICAgLy8gKHdpdGhvdXQgaW1wbGljaXQgYm9kaWVzKS4KICAgIG90aGVyU2ltcGxlRGVmaW5pdGlvbjogWyJnZW5lcmljIiwgImRvbWFpbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQy1wb2ludGVyLXR5cGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhYmxlIgogICAgICAgICAgICAgICAgICAgICAgICAgICBdLAoKICAgIC8vIFdvcmRzIHRoYXQgYmVnaW4gc3RhdGVtZW50cyB3aXRoIGltcGxpY2l0IGJvZGllcy4KICAgIHN0YXRlbWVudDogWyJpZiIsICJibG9jayIsICJiZWdpbiIsICJtZXRob2QiLCAiY2FzZSIsCiAgICAgICAgICAgICAgICAiZm9yIiwgInNlbGVjdCIsICJ3aGVuIiwgInVubGVzcyIsICJ1bnRpbCIsCiAgICAgICAgICAgICAgICAid2hpbGUiLCAiaXRlcmF0ZSIsICJwcm9maWxpbmciLCAiZHluYW1pYy1iaW5kIgogICAgICAgICAgICAgICBdLAoKICAgIC8vIFBhdHRlcm5zIHRoYXQgYWN0IGFzIHNlcGFyYXRvcnMgaW4gY29tcG91bmQgc3RhdGVtZW50cy4KICAgIC8vIFRoaXMgbWF5IGluY2x1ZGUgYW55IGdlbmVyYWwgcGF0dGVybiB0aGF0IG11c3QgYmUgaW5kZW50ZWQKICAgIC8vIHNwZWNpYWxseS4KICAgIHNlcGFyYXRvcjogWyJmaW5hbGx5IiwgImV4Y2VwdGlvbiIsICJjbGVhbnVwIiwgImVsc2UiLAogICAgICAgICAgICAgICAgImVsc2VpZiIsICJhZnRlcndhcmRzIgogICAgICAgICAgICAgICBdLAoKICAgIC8vIEtleXdvcmRzIHRoYXQgZG8gbm90IHJlcXVpcmUgc3BlY2lhbCBpbmRlbnRhdGlvbiBoYW5kbGluZywKICAgIC8vIGJ1dCB3aGljaCBzaG91bGQgYmUgaGlnaGxpZ2h0ZWQKICAgIG90aGVyOiBbImFib3ZlIiwgImJlbG93IiwgImJ5IiwgImZyb20iLCAiaGFuZGxlciIsICJpbiIsCiAgICAgICAgICAgICJpbnN0YW5jZSIsICJsZXQiLCAibG9jYWwiLCAib3RoZXJ3aXNlIiwgInNsb3QiLAogICAgICAgICAgICAic3ViY2xhc3MiLCAidGhlbiIsICJ0byIsICJrZXllZC1ieSIsICJ2aXJ0dWFsIgogICAgICAgICAgIF0sCgogICAgLy8gQ29uZGl0aW9uIHNpZ25hbGluZyBmdW5jdGlvbiBjYWxscwogICAgc2lnbmFsaW5nQ2FsbHM6IFsic2lnbmFsIiwgImVycm9yIiwgImNlcnJvciIsCiAgICAgICAgICAgICAgICAgICAgICJicmVhayIsICJjaGVjay10eXBlIiwgImFib3J0IgogICAgICAgICAgICAgICAgICAgIF0KICB9OwoKICB3b3Jkc1sib3RoZXJEZWZpbml0aW9uIl0gPQogICAgd29yZHNbInVubmFtZWREZWZpbml0aW9uIl0KICAgIC5jb25jYXQod29yZHNbIm5hbWVkRGVmaW5pdGlvbiJdKQogICAgLmNvbmNhdCh3b3Jkc1sib3RoZXJQYXJhbWV0ZXJpemVkRGVmaW5pdGlvbiJdKTsKCiAgd29yZHNbImRlZmluaXRpb24iXSA9CiAgICB3b3Jkc1sidHlwZVBhcmFtZXRlcml6ZWREZWZpbml0aW9uIl0KICAgIC5jb25jYXQod29yZHNbIm90aGVyRGVmaW5pdGlvbiJdKTsKCiAgd29yZHNbInBhcmFtZXRlcml6ZWREZWZpbml0aW9uIl0gPQogICAgd29yZHNbInR5cGVQYXJhbWV0ZXJpemVkRGVmaW5pdGlvbiJdCiAgICAuY29uY2F0KHdvcmRzWyJvdGhlclBhcmFtZXRlcml6ZWREZWZpbml0aW9uIl0pOwoKICB3b3Jkc1sic2ltcGxlRGVmaW5pdGlvbiJdID0KICAgIHdvcmRzWyJjb25zdGFudFNpbXBsZURlZmluaXRpb24iXQogICAgLmNvbmNhdCh3b3Jkc1sidmFyaWFibGVTaW1wbGVEZWZpbml0aW9uIl0pCiAgICAuY29uY2F0KHdvcmRzWyJvdGhlclNpbXBsZURlZmluaXRpb24iXSk7CgogIHdvcmRzWyJrZXl3b3JkIl0gPQogICAgd29yZHNbInN0YXRlbWVudCJdCiAgICAuY29uY2F0KHdvcmRzWyJzZXBhcmF0b3IiXSkKICAgIC5jb25jYXQod29yZHNbIm90aGVyIl0pOwoKICAvLyBQYXR0ZXJucwogIHZhciBzeW1ib2xQYXR0ZXJuID0gIlstX2EtekEtWj8hKkA8PiQlXSsiOwogIHZhciBzeW1ib2wgPSBuZXcgUmVnRXhwKCJeIiArIHN5bWJvbFBhdHRlcm4pOwogIHZhciBwYXR0ZXJucyA9IHsKICAgIC8vIFN5bWJvbHMgd2l0aCBzcGVjaWFsIHN5bnRheAogICAgc3ltYm9sS2V5d29yZDogc3ltYm9sUGF0dGVybiArICI6IiwKICAgIHN5bWJvbENsYXNzOiAiPCIgKyBzeW1ib2xQYXR0ZXJuICsgIj4iLAogICAgc3ltYm9sR2xvYmFsOiAiXFwqIiArIHN5bWJvbFBhdHRlcm4gKyAiXFwqIiwKICAgIHN5bWJvbENvbnN0YW50OiAiXFwkIiArIHN5bWJvbFBhdHRlcm4KICB9OwogIHZhciBwYXR0ZXJuU3R5bGVzID0gewogICAgc3ltYm9sS2V5d29yZDogImF0b20iLAogICAgc3ltYm9sQ2xhc3M6ICJ0YWciLAogICAgc3ltYm9sR2xvYmFsOiAidmFyaWFibGUtMiIsCiAgICBzeW1ib2xDb25zdGFudDogInZhcmlhYmxlLTMiCiAgfTsKCiAgLy8gQ29tcGlsZSBhbGwgcGF0dGVybnMgdG8gcmVndWxhciBleHByZXNzaW9ucwogIGZvciAodmFyIHBhdHRlcm5OYW1lIGluIHBhdHRlcm5zKQogICAgaWYgKHBhdHRlcm5zLmhhc093blByb3BlcnR5KHBhdHRlcm5OYW1lKSkKICAgICAgcGF0dGVybnNbcGF0dGVybk5hbWVdID0gbmV3IFJlZ0V4cCgiXiIgKyBwYXR0ZXJuc1twYXR0ZXJuTmFtZV0pOwoKICAvLyBOYW1lcyBiZWdpbm5pbmcgIndpdGgtIiBhbmQgIndpdGhvdXQtIiBhcmUgY29tbW9ubHkKICAvLyB1c2VkIGFzIHN0YXRlbWVudCBtYWNybwogIHBhdHRlcm5zWyJrZXl3b3JkIl0gPSBbL153aXRoKD86b3V0KT8tWy1fYS16QS1aPyEqQDw+JCVdKy9dOwoKICB2YXIgc3R5bGVzID0ge307CiAgc3R5bGVzWyJrZXl3b3JkIl0gPSAia2V5d29yZCI7CiAgc3R5bGVzWyJkZWZpbml0aW9uIl0gPSAiZGVmIjsKICBzdHlsZXNbInNpbXBsZURlZmluaXRpb24iXSA9ICJkZWYiOwogIHN0eWxlc1sic2lnbmFsaW5nQ2FsbHMiXSA9ICJidWlsdGluIjsKCiAgLy8gcHJvdGVjdGVkIHdvcmRzIGxvb2t1cCB0YWJsZQogIHZhciB3b3JkTG9va3VwID0ge307CiAgdmFyIHN0eWxlTG9va3VwID0ge307CgogIFsKICAgICJrZXl3b3JkIiwKICAgICJkZWZpbml0aW9uIiwKICAgICJzaW1wbGVEZWZpbml0aW9uIiwKICAgICJzaWduYWxpbmdDYWxscyIKICBdLmZvckVhY2goZnVuY3Rpb24odHlwZSkgewogICAgd29yZHNbdHlwZV0uZm9yRWFjaChmdW5jdGlvbih3b3JkKSB7CiAgICAgIHdvcmRMb29rdXBbd29yZF0gPSB0eXBlOwogICAgICBzdHlsZUxvb2t1cFt3b3JkXSA9IHN0eWxlc1t0eXBlXTsKICAgIH0pOwogIH0pOwoKCiAgZnVuY3Rpb24gY2hhaW4oc3RyZWFtLCBzdGF0ZSwgZikgewogICAgc3RhdGUudG9rZW5pemUgPSBmOwogICAgcmV0dXJuIGYoc3RyZWFtLCBzdGF0ZSk7CiAgfQoKICB2YXIgdHlwZSwgY29udGVudDsKCiAgZnVuY3Rpb24gcmV0KF90eXBlLCBzdHlsZSwgX2NvbnRlbnQpIHsKICAgIHR5cGUgPSBfdHlwZTsKICAgIGNvbnRlbnQgPSBfY29udGVudDsKICAgIHJldHVybiBzdHlsZTsKICB9CgogIGZ1bmN0aW9uIHRva2VuQmFzZShzdHJlYW0sIHN0YXRlKSB7CiAgICAvLyBTdHJpbmcKICAgIHZhciBjaCA9IHN0cmVhbS5wZWVrKCk7CiAgICBpZiAoY2ggPT0gIiciIHx8IGNoID09ICciJykgewogICAgICBzdHJlYW0ubmV4dCgpOwogICAgICByZXR1cm4gY2hhaW4oc3RyZWFtLCBzdGF0ZSwgdG9rZW5TdHJpbmcoY2gsICJzdHJpbmciLCAic3RyaW5nIikpOwogICAgfQogICAgLy8gQ29tbWVudAogICAgZWxzZSBpZiAoY2ggPT0gIi8iKSB7CiAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgIGlmIChzdHJlYW0uZWF0KCIqIikpIHsKICAgICAgICByZXR1cm4gY2hhaW4oc3RyZWFtLCBzdGF0ZSwgdG9rZW5Db21tZW50KTsKICAgICAgfSBlbHNlIGlmIChzdHJlYW0uZWF0KCIvIikpIHsKICAgICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICAgICAgcmV0dXJuIHJldCgiY29tbWVudCIsICJjb21tZW50Iik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc3RyZWFtLnNraXBUbygiICIpOwogICAgICAgIHJldHVybiByZXQoIm9wZXJhdG9yIiwgIm9wZXJhdG9yIik7CiAgICAgIH0KICAgIH0KICAgIC8vIERlY2ltYWwKICAgIGVsc2UgaWYgKC9cZC8udGVzdChjaCkpIHsKICAgICAgc3RyZWFtLm1hdGNoKC9eXGQqKD86XC5cZCopPyg/OmVbK1wtXT9cZCspPy8pOwogICAgICByZXR1cm4gcmV0KCJudW1iZXIiLCAibnVtYmVyIik7CiAgICB9CiAgICAvLyBIYXNoCiAgICBlbHNlIGlmIChjaCA9PSAiIyIpIHsKICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgLy8gU3ltYm9sIHdpdGggc3RyaW5nIHN5bnRheAogICAgICBjaCA9IHN0cmVhbS5wZWVrKCk7CiAgICAgIGlmIChjaCA9PSAnIicpIHsKICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgIHJldHVybiBjaGFpbihzdHJlYW0sIHN0YXRlLCB0b2tlblN0cmluZygnIicsICJzeW1ib2wiLCAic3RyaW5nLTIiKSk7CiAgICAgIH0KICAgICAgLy8gQmluYXJ5IG51bWJlcgogICAgICBlbHNlIGlmIChjaCA9PSAiYiIpIHsKICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvWzAxXS8pOwogICAgICAgIHJldHVybiByZXQoIm51bWJlciIsICJudW1iZXIiKTsKICAgICAgfQogICAgICAvLyBIZXggbnVtYmVyCiAgICAgIGVsc2UgaWYgKGNoID09ICJ4IikgewogICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXGRhLWZdL2kpOwogICAgICAgIHJldHVybiByZXQoIm51bWJlciIsICJudW1iZXIiKTsKICAgICAgfQogICAgICAvLyBPY3RhbCBudW1iZXIKICAgICAgZWxzZSBpZiAoY2ggPT0gIm8iKSB7CiAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1swLTddLyk7CiAgICAgICAgcmV0dXJuIHJldCgibnVtYmVyIiwgIm51bWJlciIpOwogICAgICB9CiAgICAgIC8vIEhhc2ggc3ltYm9sCiAgICAgIGVsc2UgewogICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvWy1hLXpBLVpdLyk7CiAgICAgICAgcmV0dXJuIHJldCgiaGFzaCIsICJrZXl3b3JkIik7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoc3RyZWFtLm1hdGNoKCJlbmQiKSkgewogICAgICByZXR1cm4gcmV0KCJlbmQiLCAia2V5d29yZCIpOwogICAgfQogICAgZm9yICh2YXIgbmFtZSBpbiBwYXR0ZXJucykgewogICAgICBpZiAocGF0dGVybnMuaGFzT3duUHJvcGVydHkobmFtZSkpIHsKICAgICAgICB2YXIgcGF0dGVybiA9IHBhdHRlcm5zW25hbWVdOwogICAgICAgIGlmICgocGF0dGVybiBpbnN0YW5jZW9mIEFycmF5ICYmIHBhdHRlcm4uc29tZShmdW5jdGlvbihwKSB7CiAgICAgICAgICByZXR1cm4gc3RyZWFtLm1hdGNoKHApOwogICAgICAgIH0pKSB8fCBzdHJlYW0ubWF0Y2gocGF0dGVybikpCiAgICAgICAgICByZXR1cm4gcmV0KG5hbWUsIHBhdHRlcm5TdHlsZXNbbmFtZV0sIHN0cmVhbS5jdXJyZW50KCkpOwogICAgICB9CiAgICB9CiAgICBpZiAoc3RyZWFtLm1hdGNoKCJkZWZpbmUiKSkgewogICAgICByZXR1cm4gcmV0KCJkZWZpbml0aW9uIiwgImRlZiIpOwogICAgfSBlbHNlIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXHdcLV0vKTsKICAgICAgLy8gS2V5d29yZAogICAgICBpZiAod29yZExvb2t1cFtzdHJlYW0uY3VycmVudCgpXSkgewogICAgICAgIHJldHVybiByZXQod29yZExvb2t1cFtzdHJlYW0uY3VycmVudCgpXSwgc3R5bGVMb29rdXBbc3RyZWFtLmN1cnJlbnQoKV0sIHN0cmVhbS5jdXJyZW50KCkpOwogICAgICB9IGVsc2UgaWYgKHN0cmVhbS5jdXJyZW50KCkubWF0Y2goc3ltYm9sKSkgewogICAgICAgIHJldHVybiByZXQoInZhcmlhYmxlIiwgInZhcmlhYmxlIik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgICByZXR1cm4gcmV0KCJvdGhlciIsICJ2YXJpYWJsZS0yIik7CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIHRva2VuQ29tbWVudChzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgbWF5YmVFbmQgPSBmYWxzZSwKICAgIGNoOwogICAgd2hpbGUgKChjaCA9IHN0cmVhbS5uZXh0KCkpKSB7CiAgICAgIGlmIChjaCA9PSAiLyIgJiYgbWF5YmVFbmQpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBtYXliZUVuZCA9IChjaCA9PSAiKiIpOwogICAgfQogICAgcmV0dXJuIHJldCgiY29tbWVudCIsICJjb21tZW50Iik7CiAgfQoKICBmdW5jdGlvbiB0b2tlblN0cmluZyhxdW90ZSwgdHlwZSwgc3R5bGUpIHsKICAgIHJldHVybiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHZhciBuZXh0LCBlbmQgPSBmYWxzZTsKICAgICAgd2hpbGUgKChuZXh0ID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkgewogICAgICAgIGlmIChuZXh0ID09IHF1b3RlKSB7CiAgICAgICAgICBlbmQgPSB0cnVlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChlbmQpCiAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICAgIHJldHVybiByZXQodHlwZSwgc3R5bGUpOwogICAgfTsKICB9CgogIC8vIEludGVyZmFjZQogIHJldHVybiB7CiAgICBzdGFydFN0YXRlOiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICB0b2tlbml6ZTogdG9rZW5CYXNlLAogICAgICAgIGN1cnJlbnRJbmRlbnQ6IDAKICAgICAgfTsKICAgIH0sCiAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICBpZiAoc3RyZWFtLmVhdFNwYWNlKCkpCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIHZhciBzdHlsZSA9IHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgICByZXR1cm4gc3R5bGU7CiAgICB9LAogICAgYmxvY2tDb21tZW50U3RhcnQ6ICIvKiIsCiAgICBibG9ja0NvbW1lbnRFbmQ6ICIqLyIKICB9Owp9KTsKCkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC94LWR5bGFuIiwgImR5bGFuIik7Cgp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/dylan/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogRHlsYW4gbW9kZTwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uLy4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxzY3JpcHQgc3JjPSIuLi8uLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi8uLi9hZGRvbi9lZGl0L21hdGNoYnJhY2tldHMuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vLi4vYWRkb24vY29tbWVudC9jb250aW51ZWNvbW1lbnQuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vLi4vYWRkb24vY29tbWVudC9jb21tZW50LmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9ImR5bGFuLmpzIj48L3NjcmlwdD4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4uQ29kZU1pcnJvciB7Ym9yZGVyLXRvcDogMXB4IHNvbGlkIGJsYWNrOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGltZyBpZD1sb2dvIHNyYz0iLi4vLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+TGFuZ3VhZ2UgbW9kZXM8L2E+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPkR5bGFuPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5EeWxhbiBtb2RlPC9oMj4KCgo8ZGl2Pjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+Ck1vZHVsZTogICAgICAgbG9jYXRvcnMtaW50ZXJuYWxzClN5bm9wc2lzOiAgICAgQWJzdHJhY3QgbW9kZWxpbmcgb2YgbG9jYXRpb25zCkF1dGhvcjogICAgICAgQW5keSBBcm1zdHJvbmcKQ29weXJpZ2h0OiAgICBPcmlnaW5hbCBDb2RlIGlzIENvcHlyaWdodCAoYykgMTk5NS0yMDA0IEZ1bmN0aW9uYWwgT2JqZWN0cywgSW5jLgogICAgICAgICAgICAgIEFsbCByaWdodHMgcmVzZXJ2ZWQuCkxpY2Vuc2U6ICAgICAgU2VlIExpY2Vuc2UudHh0IGluIHRoaXMgZGlzdHJpYnV0aW9uIGZvciBkZXRhaWxzLgpXYXJyYW50eTogICAgIERpc3RyaWJ1dGVkIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQKCmRlZmluZSBvcGVuIGdlbmVyaWMgbG9jYXRvci1zZXJ2ZXIKICAgIChsb2NhdG9yIDo6IDxsb2NhdG9yPikgPT4gKHNlcnZlciA6OiBmYWxzZS1vcig8c2VydmVyLWxvY2F0b3I+KSk7CmRlZmluZSBvcGVuIGdlbmVyaWMgbG9jYXRvci1ob3N0CiAgICAobG9jYXRvciA6OiA8bG9jYXRvcj4pID0+IChob3N0IDo6IGZhbHNlLW9yKDxzdHJpbmc+KSk7CmRlZmluZSBvcGVuIGdlbmVyaWMgbG9jYXRvci12b2x1bWUKICAgIChsb2NhdG9yIDo6IDxsb2NhdG9yPikgPT4gKHZvbHVtZSA6OiBmYWxzZS1vcig8c3RyaW5nPikpOwpkZWZpbmUgb3BlbiBnZW5lcmljIGxvY2F0b3ItZGlyZWN0b3J5CiAgICAobG9jYXRvciA6OiA8bG9jYXRvcj4pID0+IChkaXJlY3RvcnkgOjogZmFsc2Utb3IoPGRpcmVjdG9yeS1sb2NhdG9yPikpOwpkZWZpbmUgb3BlbiBnZW5lcmljIGxvY2F0b3ItcmVsYXRpdmU/CiAgICAobG9jYXRvciA6OiA8bG9jYXRvcj4pID0+IChyZWxhdGl2ZT8gOjogPGJvb2xlYW4+KTsKZGVmaW5lIG9wZW4gZ2VuZXJpYyBsb2NhdG9yLXBhdGgKICAgIChsb2NhdG9yIDo6IDxsb2NhdG9yPikgPT4gKHBhdGggOjogPHNlcXVlbmNlPik7CmRlZmluZSBvcGVuIGdlbmVyaWMgbG9jYXRvci1iYXNlCiAgICAobG9jYXRvciA6OiA8bG9jYXRvcj4pID0+IChiYXNlIDo6IGZhbHNlLW9yKDxzdHJpbmc+KSk7CmRlZmluZSBvcGVuIGdlbmVyaWMgbG9jYXRvci1leHRlbnNpb24KICAgIChsb2NhdG9yIDo6IDxsb2NhdG9yPikgPT4gKGV4dGVuc2lvbiA6OiBmYWxzZS1vcig8c3RyaW5nPikpOwoKLy8vIExvY2F0b3IgY2xhc3NlcwoKZGVmaW5lIG9wZW4gYWJzdHJhY3QgY2xhc3MgPGRpcmVjdG9yeS1sb2NhdG9yPiAoPHBoeXNpY2FsLWxvY2F0b3I+KQplbmQgY2xhc3MgPGRpcmVjdG9yeS1sb2NhdG9yPjsKCmRlZmluZSBvcGVuIGFic3RyYWN0IGNsYXNzIDxmaWxlLWxvY2F0b3I+ICg8cGh5c2ljYWwtbG9jYXRvcj4pCmVuZCBjbGFzcyA8ZmlsZS1sb2NhdG9yPjsKCmRlZmluZSBtZXRob2QgYXMKICAgIChjbGFzcyA9PSA8ZGlyZWN0b3J5LWxvY2F0b3I+LCBzdHJpbmcgOjogPHN0cmluZz4pCiA9PiAobG9jYXRvciA6OiA8ZGlyZWN0b3J5LWxvY2F0b3I+KQogIGFzKDxuYXRpdmUtZGlyZWN0b3J5LWxvY2F0b3I+LCBzdHJpbmcpCmVuZCBtZXRob2QgYXM7CgpkZWZpbmUgbWV0aG9kIG1ha2UKICAgIChjbGFzcyA9PSA8ZGlyZWN0b3J5LWxvY2F0b3I+LAogICAgICNrZXkgc2VydmVyIDo6IGZhbHNlLW9yKDxzZXJ2ZXItbG9jYXRvcj4pID0gI2YsCiAgICAgICAgICBwYXRoIDo6IDxzZXF1ZW5jZT4gPSAjW10sCiAgICAgICAgICByZWxhdGl2ZT8gOjogPGJvb2xlYW4+ID0gI2YsCiAgICAgICAgICBuYW1lIDo6IGZhbHNlLW9yKDxzdHJpbmc+KSA9ICNmKQogPT4gKGxvY2F0b3IgOjogPGRpcmVjdG9yeS1sb2NhdG9yPikKICBtYWtlKDxuYXRpdmUtZGlyZWN0b3J5LWxvY2F0b3I+LAogICAgICAgc2VydmVyOiAgICBzZXJ2ZXIsCiAgICAgICBwYXRoOiAgICAgIHBhdGgsCiAgICAgICByZWxhdGl2ZT86IHJlbGF0aXZlPywKICAgICAgIG5hbWU6ICAgICAgbmFtZSkKZW5kIG1ldGhvZCBtYWtlOwoKZGVmaW5lIG1ldGhvZCBhcwogICAgKGNsYXNzID09IDxmaWxlLWxvY2F0b3I+LCBzdHJpbmcgOjogPHN0cmluZz4pCiA9PiAobG9jYXRvciA6OiA8ZmlsZS1sb2NhdG9yPikKICBhcyg8bmF0aXZlLWZpbGUtbG9jYXRvcj4sIHN0cmluZykKZW5kIG1ldGhvZCBhczsKCmRlZmluZSBtZXRob2QgbWFrZQogICAgKGNsYXNzID09IDxmaWxlLWxvY2F0b3I+LAogICAgICNrZXkgZGlyZWN0b3J5IDo6IGZhbHNlLW9yKDxkaXJlY3RvcnktbG9jYXRvcj4pID0gI2YsCiAgICAgICAgICBiYXNlIDo6IGZhbHNlLW9yKDxzdHJpbmc+KSA9ICNmLAogICAgICAgICAgZXh0ZW5zaW9uIDo6IGZhbHNlLW9yKDxzdHJpbmc+KSA9ICNmLAogICAgICAgICAgbmFtZSA6OiBmYWxzZS1vcig8c3RyaW5nPikgPSAjZikKID0+IChsb2NhdG9yIDo6IDxmaWxlLWxvY2F0b3I+KQogIG1ha2UoPG5hdGl2ZS1maWxlLWxvY2F0b3I+LAogICAgICAgZGlyZWN0b3J5OiBkaXJlY3RvcnksCiAgICAgICBiYXNlOiAgICAgIGJhc2UsCiAgICAgICBleHRlbnNpb246IGV4dGVuc2lvbiwKICAgICAgIG5hbWU6ICAgICAgbmFtZSkKZW5kIG1ldGhvZCBtYWtlOwoKLy8vIExvY2F0b3IgY29lcmNpb24KCi8vLS0tKioqIGFuZHJld2E6IFRoaXMgY2FjaGluZyBzY2hlbWUgZG9lc24ndCB3b3JrIHlldCwgc28gZGlzYWJsZSBpdC4KZGVmaW5lIGNvbnN0YW50ICRjYWNoZS1sb2NhdG9ycz8gICAgICAgID0gI2Y7CmRlZmluZSBjb25zdGFudCAkY2FjaGUtbG9jYXRvci1zdHJpbmdzPyA9ICNmOwoKZGVmaW5lIGNvbnN0YW50ICRsb2NhdG9yLXRvLXN0cmluZy1jYWNoZSA9IG1ha2UoPG9iamVjdC10YWJsZT4sIHdlYWs6ICMia2V5Iik7CmRlZmluZSBjb25zdGFudCAkc3RyaW5nLXRvLWxvY2F0b3ItY2FjaGUgPSBtYWtlKDxzdHJpbmctdGFibGU+LCB3ZWFrOiAjInZhbHVlIik7CgpkZWZpbmUgb3BlbiBnZW5lcmljIGxvY2F0b3ItYXMtc3RyaW5nCiAgICAoY2xhc3MgOjogc3ViY2xhc3MoPHN0cmluZz4pLCBsb2NhdG9yIDo6IDxsb2NhdG9yPikKID0+IChzdHJpbmcgOjogPHN0cmluZz4pOwoKZGVmaW5lIG9wZW4gZ2VuZXJpYyBzdHJpbmctYXMtbG9jYXRvcgogICAgKGNsYXNzIDo6IHN1YmNsYXNzKDxsb2NhdG9yPiksIHN0cmluZyA6OiA8c3RyaW5nPikKID0+IChsb2NhdG9yIDo6IDxsb2NhdG9yPik7CgpkZWZpbmUgc2VhbGVkIHNpZGV3YXlzIG1ldGhvZCBhcwogICAgKGNsYXNzIDo6IHN1YmNsYXNzKDxzdHJpbmc+KSwgbG9jYXRvciA6OiA8bG9jYXRvcj4pCiA9PiAoc3RyaW5nIDo6IDxzdHJpbmc+KQogIGxldCBzdHJpbmcgPSBlbGVtZW50KCRsb2NhdG9yLXRvLXN0cmluZy1jYWNoZSwgbG9jYXRvciwgZGVmYXVsdDogI2YpOwogIGlmIChzdHJpbmcpCiAgICBhcyhjbGFzcywgc3RyaW5nKQogIGVsc2UKICAgIGxldCBzdHJpbmcgPSBsb2NhdG9yLWFzLXN0cmluZyhjbGFzcywgbG9jYXRvcik7CiAgICBpZiAoJGNhY2hlLWxvY2F0b3Itc3RyaW5ncz8pCiAgICAgIGVsZW1lbnQoJGxvY2F0b3ItdG8tc3RyaW5nLWNhY2hlLCBsb2NhdG9yKSA6PSBzdHJpbmc7CiAgICBlbHNlCiAgICAgIHN0cmluZwogICAgZW5kCiAgZW5kCmVuZCBtZXRob2QgYXM7CgpkZWZpbmUgc2VhbGVkIHNpZGV3YXlzIG1ldGhvZCBhcwogICAgKGNsYXNzIDo6IHN1YmNsYXNzKDxsb2NhdG9yPiksIHN0cmluZyA6OiA8c3RyaW5nPikKID0+IChsb2NhdG9yIDo6IDxsb2NhdG9yPikKICBsZXQgbG9jYXRvciA9IGVsZW1lbnQoJHN0cmluZy10by1sb2NhdG9yLWNhY2hlLCBzdHJpbmcsIGRlZmF1bHQ6ICNmKTsKICBpZiAoaW5zdGFuY2U/KGxvY2F0b3IsIGNsYXNzKSkKICAgIGxvY2F0b3IKICBlbHNlCiAgICBsZXQgbG9jYXRvciA9IHN0cmluZy1hcy1sb2NhdG9yKGNsYXNzLCBzdHJpbmcpOwogICAgaWYgKCRjYWNoZS1sb2NhdG9ycz8pCiAgICAgIGVsZW1lbnQoJHN0cmluZy10by1sb2NhdG9yLWNhY2hlLCBzdHJpbmcpIDo9IGxvY2F0b3I7CiAgICBlbHNlCiAgICAgIGxvY2F0b3IKICAgIGVuZAogIGVuZAplbmQgbWV0aG9kIGFzOwoKLy8vIExvY2F0b3IgY29uZGl0aW9ucwoKZGVmaW5lIGNsYXNzIDxsb2NhdG9yLWVycm9yPiAoPGZvcm1hdC1zdHJpbmctY29uZGl0aW9uPiwgPGVycm9yPikKZW5kIGNsYXNzIDxsb2NhdG9yLWVycm9yPjsKCmRlZmluZSBmdW5jdGlvbiBsb2NhdG9yLWVycm9yCiAgICAoZm9ybWF0LXN0cmluZyA6OiA8c3RyaW5nPiwgI3Jlc3QgZm9ybWF0LWFyZ3VtZW50cykKICBlcnJvcihtYWtlKDxsb2NhdG9yLWVycm9yPiwgCiAgICAgICAgICAgICBmb3JtYXQtc3RyaW5nOiAgICBmb3JtYXQtc3RyaW5nLAogICAgICAgICAgICAgZm9ybWF0LWFyZ3VtZW50czogZm9ybWF0LWFyZ3VtZW50cykpCmVuZCBmdW5jdGlvbiBsb2NhdG9yLWVycm9yOwoKLy8vIFVzZWZ1bCBsb2NhdG9yIHByb3RvY29scwoKZGVmaW5lIG9wZW4gZ2VuZXJpYyBsb2NhdG9yLXRlc3QKICAgIChsb2NhdG9yIDo6IDxkaXJlY3RvcnktbG9jYXRvcj4pID0+ICh0ZXN0IDo6IDxmdW5jdGlvbj4pOwoKZGVmaW5lIG1ldGhvZCBsb2NhdG9yLXRlc3QKICAgIChsb2NhdG9yIDo6IDxkaXJlY3RvcnktbG9jYXRvcj4pID0+ICh0ZXN0IDo6IDxmdW5jdGlvbj4pCiAgXD0KZW5kIG1ldGhvZCBsb2NhdG9yLXRlc3Q7CgpkZWZpbmUgb3BlbiBnZW5lcmljIGxvY2F0b3ItbWlnaHQtaGF2ZS1saW5rcz8KICAgIChsb2NhdG9yIDo6IDxkaXJlY3RvcnktbG9jYXRvcj4pID0+IChsaW5rcz8gOjogPGJvb2xlYW4+KTsKCmRlZmluZSBtZXRob2QgbG9jYXRvci1taWdodC1oYXZlLWxpbmtzPwogICAgKGxvY2F0b3IgOjogPGRpcmVjdG9yeS1sb2NhdG9yPikgPT4gKGxpbmtzPyA6OiBzaW5nbGV0b24oI2YpKQogICNmCmVuZCBtZXRob2QgbG9jYXRvci1taWdodC1oYXZlLWxpbmtzPzsKCmRlZmluZSBtZXRob2QgbG9jYXRvci1yZWxhdGl2ZT8KICAgIChsb2NhdG9yIDo6IDxmaWxlLWxvY2F0b3I+KSA9PiAocmVsYXRpdmU/IDo6IDxib29sZWFuPikKICBsZXQgZGlyZWN0b3J5ID0gbG9jYXRvci5sb2NhdG9yLWRpcmVjdG9yeTsKICB+ZGlyZWN0b3J5IHwgZGlyZWN0b3J5LmxvY2F0b3ItcmVsYXRpdmU/CmVuZCBtZXRob2QgbG9jYXRvci1yZWxhdGl2ZT87CgpkZWZpbmUgbWV0aG9kIGN1cnJlbnQtZGlyZWN0b3J5LWxvY2F0b3I/CiAgICAobG9jYXRvciA6OiA8ZGlyZWN0b3J5LWxvY2F0b3I+KSA9PiAoY3VycmVudC1kaXJlY3Rvcnk/IDo6IDxib29sZWFuPikKICBsb2NhdG9yLmxvY2F0b3ItcmVsYXRpdmU/CiAgICAmIGxvY2F0b3IubG9jYXRvci1wYXRoID0gI1sjInNlbGYiXQplbmQgbWV0aG9kIGN1cnJlbnQtZGlyZWN0b3J5LWxvY2F0b3I/OwoKZGVmaW5lIG1ldGhvZCBsb2NhdG9yLWRpcmVjdG9yeQogICAgKGxvY2F0b3IgOjogPGRpcmVjdG9yeS1sb2NhdG9yPikgPT4gKHBhcmVudCA6OiBmYWxzZS1vcig8ZGlyZWN0b3J5LWxvY2F0b3I+KSkKICBsZXQgcGF0aCA9IGxvY2F0b3IubG9jYXRvci1wYXRoOwogIHVubGVzcyAoZW1wdHk/KHBhdGgpKQogICAgbWFrZShvYmplY3QtY2xhc3MobG9jYXRvciksCiAgICAgICAgIHNlcnZlcjogICAgbG9jYXRvci5sb2NhdG9yLXNlcnZlciwKICAgICAgICAgcGF0aDogICAgICBjb3B5LXNlcXVlbmNlKHBhdGgsIGVuZDogcGF0aC5zaXplIC0gMSksCiAgICAgICAgIHJlbGF0aXZlPzogbG9jYXRvci5sb2NhdG9yLXJlbGF0aXZlPykKICBlbmQKZW5kIG1ldGhvZCBsb2NhdG9yLWRpcmVjdG9yeTsKCi8vLyBTaW1wbGlmeSBsb2NhdG9yCgpkZWZpbmUgb3BlbiBnZW5lcmljIHNpbXBsaWZ5LWxvY2F0b3IKICAgIChsb2NhdG9yIDo6IDxwaHlzaWNhbC1sb2NhdG9yPikKID0+IChzaW1wbGlmaWVkLWxvY2F0b3IgOjogPHBoeXNpY2FsLWxvY2F0b3I+KTsKCmRlZmluZSBtZXRob2Qgc2ltcGxpZnktbG9jYXRvcgogICAgKGxvY2F0b3IgOjogPGRpcmVjdG9yeS1sb2NhdG9yPikKID0+IChzaW1wbGlmaWVkLWxvY2F0b3IgOjogPGRpcmVjdG9yeS1sb2NhdG9yPikKICBsZXQgcGF0aCA9IGxvY2F0b3IubG9jYXRvci1wYXRoOwogIGxldCByZWxhdGl2ZT8gPSBsb2NhdG9yLmxvY2F0b3ItcmVsYXRpdmU/OwogIGxldCByZXNvbHZlLXBhcmVudD8gPSB+bG9jYXRvci5sb2NhdG9yLW1pZ2h0LWhhdmUtbGlua3M/OwogIGxldCBzaW1wbGlmaWVkLXBhdGgKICAgID0gc2ltcGxpZnktcGF0aChwYXRoLCAKICAgICAgICAgICAgICAgICAgICByZXNvbHZlLXBhcmVudD86IHJlc29sdmUtcGFyZW50PywKICAgICAgICAgICAgICAgICAgICByZWxhdGl2ZT86IHJlbGF0aXZlPyk7CiAgaWYgKHBhdGggfj0gc2ltcGxpZmllZC1wYXRoKQogICAgbWFrZShvYmplY3QtY2xhc3MobG9jYXRvciksCiAgICAgICAgIHNlcnZlcjogICAgbG9jYXRvci5sb2NhdG9yLXNlcnZlciwKICAgICAgICAgcGF0aDogICAgICBzaW1wbGlmaWVkLXBhdGgsCiAgICAgICAgIHJlbGF0aXZlPzogbG9jYXRvci5sb2NhdG9yLXJlbGF0aXZlPykKICBlbHNlCiAgICBsb2NhdG9yCiAgZW5kCmVuZCBtZXRob2Qgc2ltcGxpZnktbG9jYXRvcjsKCmRlZmluZSBtZXRob2Qgc2ltcGxpZnktbG9jYXRvcgogICAgKGxvY2F0b3IgOjogPGZpbGUtbG9jYXRvcj4pID0+IChzaW1wbGlmaWVkLWxvY2F0b3IgOjogPGZpbGUtbG9jYXRvcj4pCiAgbGV0IGRpcmVjdG9yeSA9IGxvY2F0b3IubG9jYXRvci1kaXJlY3Rvcnk7CiAgbGV0IHNpbXBsaWZpZWQtZGlyZWN0b3J5ID0gZGlyZWN0b3J5ICYgc2ltcGxpZnktbG9jYXRvcihkaXJlY3RvcnkpOwogIGlmIChkaXJlY3Rvcnkgfj0gc2ltcGxpZmllZC1kaXJlY3RvcnkpCiAgICBtYWtlKG9iamVjdC1jbGFzcyhsb2NhdG9yKSwKICAgICAgICAgZGlyZWN0b3J5OiBzaW1wbGlmaWVkLWRpcmVjdG9yeSwKICAgICAgICAgYmFzZTogICAgICBsb2NhdG9yLmxvY2F0b3ItYmFzZSwKICAgICAgICAgZXh0ZW5zaW9uOiBsb2NhdG9yLmxvY2F0b3ItZXh0ZW5zaW9uKQogIGVsc2UKICAgIGxvY2F0b3IKICBlbmQKZW5kIG1ldGhvZCBzaW1wbGlmeS1sb2NhdG9yOwoKLy8vIFN1YmRpcmVjdG9yeSBsb2NhdG9yCgpkZWZpbmUgb3BlbiBnZW5lcmljIHN1YmRpcmVjdG9yeS1sb2NhdG9yCiAgICAobG9jYXRvciA6OiA8ZGlyZWN0b3J5LWxvY2F0b3I+LCAjcmVzdCBzdWItcGF0aCkKID0+IChzdWJkaXJlY3RvcnkgOjogPGRpcmVjdG9yeS1sb2NhdG9yPik7CgpkZWZpbmUgbWV0aG9kIHN1YmRpcmVjdG9yeS1sb2NhdG9yCiAgICAobG9jYXRvciA6OiA8ZGlyZWN0b3J5LWxvY2F0b3I+LCAjcmVzdCBzdWItcGF0aCkKID0+IChzdWJkaXJlY3RvcnkgOjogPGRpcmVjdG9yeS1sb2NhdG9yPikKICBsZXQgb2xkLXBhdGggPSBsb2NhdG9yLmxvY2F0b3ItcGF0aDsKICBsZXQgbmV3LXBhdGggPSBjb25jYXRlbmF0ZS1hcyg8c2ltcGxlLW9iamVjdC12ZWN0b3I+LCBvbGQtcGF0aCwgc3ViLXBhdGgpOwogIG1ha2Uob2JqZWN0LWNsYXNzKGxvY2F0b3IpLAogICAgICAgc2VydmVyOiAgICBsb2NhdG9yLmxvY2F0b3Itc2VydmVyLAogICAgICAgcGF0aDogICAgICBuZXctcGF0aCwKICAgICAgIHJlbGF0aXZlPzogbG9jYXRvci5sb2NhdG9yLXJlbGF0aXZlPykKZW5kIG1ldGhvZCBzdWJkaXJlY3RvcnktbG9jYXRvcjsKCi8vLyBSZWxhdGl2ZSBsb2NhdG9yCgpkZWZpbmUgb3BlbiBnZW5lcmljIHJlbGF0aXZlLWxvY2F0b3IKICAgIChsb2NhdG9yIDo6IDxwaHlzaWNhbC1sb2NhdG9yPiwgZnJvbS1sb2NhdG9yIDo6IDxwaHlzaWNhbC1sb2NhdG9yPikKID0+IChyZWxhdGl2ZS1sb2NhdG9yIDo6IDxwaHlzaWNhbC1sb2NhdG9yPik7CgpkZWZpbmUgbWV0aG9kIHJlbGF0aXZlLWxvY2F0b3IKICAgIChsb2NhdG9yIDo6IDxkaXJlY3RvcnktbG9jYXRvcj4sIGZyb20tbG9jYXRvciA6OiA8ZGlyZWN0b3J5LWxvY2F0b3I+KQogPT4gKHJlbGF0aXZlLWxvY2F0b3IgOjogPGRpcmVjdG9yeS1sb2NhdG9yPikKICBsZXQgcGF0aCA9IGxvY2F0b3IubG9jYXRvci1wYXRoOwogIGxldCBmcm9tLXBhdGggPSBmcm9tLWxvY2F0b3IubG9jYXRvci1wYXRoOwogIGNhc2UKICAgIH5sb2NhdG9yLmxvY2F0b3ItcmVsYXRpdmU/ICYgZnJvbS1sb2NhdG9yLmxvY2F0b3ItcmVsYXRpdmU/ID0+CiAgICAgIGxvY2F0b3ItZXJyb3IKICAgICAgICAoIkNhbm5vdCBmaW5kIHJlbGF0aXZlIHBhdGggb2YgYWJzb2x1dGUgbG9jYXRvciAlPSBmcm9tIHJlbGF0aXZlIGxvY2F0b3IgJT0iLAogICAgICAgICBsb2NhdG9yLCBmcm9tLWxvY2F0b3IpOwogICAgbG9jYXRvci5sb2NhdG9yLXNlcnZlciB+PSBmcm9tLWxvY2F0b3IubG9jYXRvci1zZXJ2ZXIgPT4KICAgICAgbG9jYXRvcjsKICAgIHBhdGggPSBmcm9tLXBhdGggPT4KICAgICAgbWFrZShvYmplY3QtY2xhc3MobG9jYXRvciksCiAgICAgICAgICAgcGF0aDogdmVjdG9yKCMic2VsZiIpLAogICAgICAgICAgIHJlbGF0aXZlPzogI3QpOwogICAgb3RoZXJ3aXNlID0+CiAgICAgIG1ha2Uob2JqZWN0LWNsYXNzKGxvY2F0b3IpLAogICAgICAgICAgIHBhdGg6IHJlbGF0aXZlLXBhdGgocGF0aCwgZnJvbS1wYXRoLCB0ZXN0OiBsb2NhdG9yLmxvY2F0b3ItdGVzdCksCiAgICAgICAgICAgcmVsYXRpdmU/OiAjdCk7CiAgZW5kCmVuZCBtZXRob2QgcmVsYXRpdmUtbG9jYXRvcjsKCmRlZmluZSBtZXRob2QgcmVsYXRpdmUtbG9jYXRvcgogICAgKGxvY2F0b3IgOjogPGZpbGUtbG9jYXRvcj4sIGZyb20tZGlyZWN0b3J5IDo6IDxkaXJlY3RvcnktbG9jYXRvcj4pCiA9PiAocmVsYXRpdmUtbG9jYXRvciA6OiA8ZmlsZS1sb2NhdG9yPikKICBsZXQgZGlyZWN0b3J5ID0gbG9jYXRvci5sb2NhdG9yLWRpcmVjdG9yeTsKICBsZXQgcmVsYXRpdmUtZGlyZWN0b3J5ID0gZGlyZWN0b3J5ICYgcmVsYXRpdmUtbG9jYXRvcihkaXJlY3RvcnksIGZyb20tZGlyZWN0b3J5KTsKICBpZiAocmVsYXRpdmUtZGlyZWN0b3J5IH49IGRpcmVjdG9yeSkKICAgIHNpbXBsaWZ5LWxvY2F0b3IKICAgICAgKG1ha2Uob2JqZWN0LWNsYXNzKGxvY2F0b3IpLAogICAgICAgICAgICBkaXJlY3Rvcnk6IHJlbGF0aXZlLWRpcmVjdG9yeSwKICAgICAgICAgICAgYmFzZTogICAgICBsb2NhdG9yLmxvY2F0b3ItYmFzZSwKICAgICAgICAgICAgZXh0ZW5zaW9uOiBsb2NhdG9yLmxvY2F0b3ItZXh0ZW5zaW9uKSkKICBlbHNlCiAgICBsb2NhdG9yCiAgZW5kCmVuZCBtZXRob2QgcmVsYXRpdmUtbG9jYXRvcjsKCmRlZmluZSBtZXRob2QgcmVsYXRpdmUtbG9jYXRvcgogICAgKGxvY2F0b3IgOjogPHBoeXNpY2FsLWxvY2F0b3I+LCBmcm9tLWxvY2F0b3IgOjogPGZpbGUtbG9jYXRvcj4pCiA9PiAocmVsYXRpdmUtbG9jYXRvciA6OiA8cGh5c2ljYWwtbG9jYXRvcj4pCiAgbGV0IGZyb20tZGlyZWN0b3J5ID0gZnJvbS1sb2NhdG9yLmxvY2F0b3ItZGlyZWN0b3J5OwogIGNhc2UKICAgIGZyb20tZGlyZWN0b3J5ID0+CiAgICAgIHJlbGF0aXZlLWxvY2F0b3IobG9jYXRvciwgZnJvbS1kaXJlY3RvcnkpOwogICAgfmxvY2F0b3IubG9jYXRvci1yZWxhdGl2ZT8gPT4KICAgICAgbG9jYXRvci1lcnJvcgogICAgICAgICgiQ2Fubm90IGZpbmQgcmVsYXRpdmUgcGF0aCBvZiBhYnNvbHV0ZSBsb2NhdG9yICU9IGZyb20gcmVsYXRpdmUgbG9jYXRvciAlPSIsCiAgICAgICAgIGxvY2F0b3IsIGZyb20tbG9jYXRvcik7CiAgICBvdGhlcndpc2UgPT4KICAgICAgbG9jYXRvcjsKICBlbmQKZW5kIG1ldGhvZCByZWxhdGl2ZS1sb2NhdG9yOwoKLy8vIE1lcmdlIGxvY2F0b3JzCgpkZWZpbmUgb3BlbiBnZW5lcmljIG1lcmdlLWxvY2F0b3JzCiAgICAobG9jYXRvciA6OiA8cGh5c2ljYWwtbG9jYXRvcj4sIGZyb20tbG9jYXRvciA6OiA8cGh5c2ljYWwtbG9jYXRvcj4pCiA9PiAobWVyZ2VkLWxvY2F0b3IgOjogPHBoeXNpY2FsLWxvY2F0b3I+KTsKCi8vLyBNZXJnZSBsb2NhdG9ycwoKZGVmaW5lIG1ldGhvZCBtZXJnZS1sb2NhdG9ycwogICAgKGxvY2F0b3IgOjogPGRpcmVjdG9yeS1sb2NhdG9yPiwgZnJvbS1sb2NhdG9yIDo6IDxkaXJlY3RvcnktbG9jYXRvcj4pCiA9PiAobWVyZ2VkLWxvY2F0b3IgOjogPGRpcmVjdG9yeS1sb2NhdG9yPikKICBpZiAobG9jYXRvci5sb2NhdG9yLXJlbGF0aXZlPykKICAgIGxldCBwYXRoID0gY29uY2F0ZW5hdGUoZnJvbS1sb2NhdG9yLmxvY2F0b3ItcGF0aCwgbG9jYXRvci5sb2NhdG9yLXBhdGgpOwogICAgc2ltcGxpZnktbG9jYXRvcgogICAgICAobWFrZShvYmplY3QtY2xhc3MobG9jYXRvciksCiAgICAgICAgICAgIHNlcnZlcjogICAgZnJvbS1sb2NhdG9yLmxvY2F0b3Itc2VydmVyLAogICAgICAgICAgICBwYXRoOiAgICAgIHBhdGgsCiAgICAgICAgICAgIHJlbGF0aXZlPzogZnJvbS1sb2NhdG9yLmxvY2F0b3ItcmVsYXRpdmU/KSkKICBlbHNlCiAgICBsb2NhdG9yCiAgZW5kCmVuZCBtZXRob2QgbWVyZ2UtbG9jYXRvcnM7CgpkZWZpbmUgbWV0aG9kIG1lcmdlLWxvY2F0b3JzCiAgICAobG9jYXRvciA6OiA8ZmlsZS1sb2NhdG9yPiwgZnJvbS1sb2NhdG9yIDo6IDxkaXJlY3RvcnktbG9jYXRvcj4pCiA9PiAobWVyZ2VkLWxvY2F0b3IgOjogPGZpbGUtbG9jYXRvcj4pCiAgbGV0IGRpcmVjdG9yeSA9IGxvY2F0b3IubG9jYXRvci1kaXJlY3Rvcnk7CiAgbGV0IG1lcmdlZC1kaXJlY3RvcnkgCiAgICA9IGlmIChkaXJlY3RvcnkpCiAgICAgICAgbWVyZ2UtbG9jYXRvcnMoZGlyZWN0b3J5LCBmcm9tLWxvY2F0b3IpCiAgICAgIGVsc2UKICAgICAgICBzaW1wbGlmeS1sb2NhdG9yKGZyb20tbG9jYXRvcikKICAgICAgZW5kOwogIGlmIChtZXJnZWQtZGlyZWN0b3J5IH49IGRpcmVjdG9yeSkKICAgIG1ha2Uob2JqZWN0LWNsYXNzKGxvY2F0b3IpLAogICAgICAgICBkaXJlY3Rvcnk6IG1lcmdlZC1kaXJlY3RvcnksCiAgICAgICAgIGJhc2U6ICAgICAgbG9jYXRvci5sb2NhdG9yLWJhc2UsCiAgICAgICAgIGV4dGVuc2lvbjogbG9jYXRvci5sb2NhdG9yLWV4dGVuc2lvbikKICBlbHNlCiAgICBsb2NhdG9yCiAgZW5kCmVuZCBtZXRob2QgbWVyZ2UtbG9jYXRvcnM7CgpkZWZpbmUgbWV0aG9kIG1lcmdlLWxvY2F0b3JzCiAgICAobG9jYXRvciA6OiA8cGh5c2ljYWwtbG9jYXRvcj4sIGZyb20tbG9jYXRvciA6OiA8ZmlsZS1sb2NhdG9yPikKID0+IChtZXJnZWQtbG9jYXRvciA6OiA8cGh5c2ljYWwtbG9jYXRvcj4pCiAgbGV0IGZyb20tZGlyZWN0b3J5ID0gZnJvbS1sb2NhdG9yLmxvY2F0b3ItZGlyZWN0b3J5OwogIGlmIChmcm9tLWRpcmVjdG9yeSkKICAgIG1lcmdlLWxvY2F0b3JzKGxvY2F0b3IsIGZyb20tZGlyZWN0b3J5KQogIGVsc2UKICAgIGxvY2F0b3IKICBlbmQKZW5kIG1ldGhvZCBtZXJnZS1sb2NhdG9yczsKCi8vLyBMb2NhdG9yIHByb3RvY29scwoKZGVmaW5lIHNpZGV3YXlzIG1ldGhvZCBzdXBwb3J0cy1vcGVuLWxvY2F0b3I/CiAgICAobG9jYXRvciA6OiA8ZmlsZS1sb2NhdG9yPikgPT4gKG9wZW5hYmxlPyA6OiA8Ym9vbGVhbj4pCiAgfmxvY2F0b3IubG9jYXRvci1yZWxhdGl2ZT8KZW5kIG1ldGhvZCBzdXBwb3J0cy1vcGVuLWxvY2F0b3I/OwoKZGVmaW5lIHNpZGV3YXlzIG1ldGhvZCBvcGVuLWxvY2F0b3IKICAgIChsb2NhdG9yIDo6IDxmaWxlLWxvY2F0b3I+LCAjcmVzdCBrZXl3b3JkcywgI2tleSwgI2FsbC1rZXlzKQogPT4gKHN0cmVhbSA6OiA8c3RyZWFtPikKICBhcHBseShvcGVuLWZpbGUtc3RyZWFtLCBsb2NhdG9yLCBrZXl3b3JkcykKZW5kIG1ldGhvZCBvcGVuLWxvY2F0b3I7CjwvdGV4dGFyZWE+PC9kaXY+CgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICBtb2RlOiAidGV4dC94LWR5bGFuIiwKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgICAgICBtYXRjaEJyYWNrZXRzOiB0cnVlLAogICAgICAgIGNvbnRpbnVlQ29tbWVudHM6ICJFbnRlciIsCiAgICAgICAgZXh0cmFLZXlzOiB7IkN0cmwtUSI6ICJ0b2dnbGVDb21tZW50In0sCiAgICAgICAgdGFiTW9kZTogImluZGVudCIsCiAgICAgICAgaW5kZW50VW5pdDogMgogICAgICB9KTsKICAgIDwvc2NyaXB0PgoKICAgIDxwPjxzdHJvbmc+TUlNRSB0eXBlcyBkZWZpbmVkOjwvc3Ryb25nPiA8Y29kZT50ZXh0L3gtZHlsYW48L2NvZGU+LjwvcD4KPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/ecl/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/ecl/ecl.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJlY2wiLCBmdW5jdGlvbihjb25maWcpIHsKCiAgZnVuY3Rpb24gd29yZHMoc3RyKSB7CiAgICB2YXIgb2JqID0ge30sIHdvcmRzID0gc3RyLnNwbGl0KCIgIik7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHdvcmRzLmxlbmd0aDsgKytpKSBvYmpbd29yZHNbaV1dID0gdHJ1ZTsKICAgIHJldHVybiBvYmo7CiAgfQoKICBmdW5jdGlvbiBtZXRhSG9vayhzdHJlYW0sIHN0YXRlKSB7CiAgICBpZiAoIXN0YXRlLnN0YXJ0T2ZMaW5lKSByZXR1cm4gZmFsc2U7CiAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICByZXR1cm4gIm1ldGEiOwogIH0KCiAgdmFyIGluZGVudFVuaXQgPSBjb25maWcuaW5kZW50VW5pdDsKICB2YXIga2V5d29yZCA9IHdvcmRzKCJhYnMgYWNvcyBhbGxub2RlcyBhc2NpaSBhc2luIGFzc3RyaW5nIGF0YW4gYXRhbjIgYXZlIGNhc2UgY2hvb3NlIGNob29zZW4gY2hvb3Nlc2V0cyBjbHVzdGVyc2l6ZSBjb21iaW5lIGNvcnJlbGF0aW9uIGNvcyBjb3NoIGNvdW50IGNvdmFyaWFuY2UgY3JvbiBkYXRhc2V0IGRlZHVwIGRlZmluZSBkZW5vcm1hbGl6ZSBkaXN0cmlidXRlIGRpc3RyaWJ1dGVkIGRpc3RyaWJ1dGlvbiBlYmNkaWMgZW50aCBlcnJvciBldmFsdWF0ZSBldmVudCBldmVudGV4dHJhIGV2ZW50bmFtZSBleGlzdHMgZXhwIGZhaWxjb2RlIGZhaWxtZXNzYWdlIGZldGNoIGZyb211bmljb2RlIGdldGlzdmFsaWQgZ2xvYmFsIGdyYXBoIGdyb3VwIGhhc2ggaGFzaDMyIGhhc2g2NCBoYXNoY3JjIGhhc2htZDUgaGF2aW5nIGlmIGluZGV4IGludGZvcm1hdCBpc3ZhbGlkIGl0ZXJhdGUgam9pbiBrZXl1bmljb2RlIGxlbmd0aCBsaWJyYXJ5IGxpbWl0IGxuIGxvY2FsIGxvZyBsb29wIG1hcCBtYXRjaGVkIG1hdGNobGVuZ3RoIG1hdGNocG9zaXRpb24gbWF0Y2h0ZXh0IG1hdGNodW5pY29kZSBtYXggbWVyZ2UgbWVyZ2Vqb2luIG1pbiBub2xvY2FsIG5vbmVtcHR5IG5vcm1hbGl6ZSBwYXJzZSBwaXBlIHBvd2VyIHByZWxvYWQgcHJvY2VzcyBwcm9qZWN0IHB1bGwgcmFuZG9tIHJhbmdlIHJhbmsgcmFua2VkIHJlYWxmb3JtYXQgcmVjb3Jkb2YgcmVnZXhmaW5kIHJlZ2V4cmVwbGFjZSByZWdyb3VwIHJlamVjdGVkIHJvbGx1cCByb3VuZCByb3VuZHVwIHJvdyByb3dkaWZmIHNhbXBsZSBzZXQgc2luIHNpbmggc2l6ZW9mIHNvYXBjYWxsIHNvcnQgc29ydGVkIHNxcnQgc3RlcHBlZCBzdG9yZWQgc3VtIHRhYmxlIHRhbiB0YW5oIHRoaXNub2RlIHRvcG4gdG91bmljb2RlIHRyYW5zZmVyIHRyaW0gdHJ1bmNhdGUgdHlwZW9mIHVuZ3JvdXAgdW5pY29kZW9yZGVyIHZhcmlhbmNlIHdoaWNoIHdvcmt1bml0IHhtbGRlY29kZSB4bWxlbmNvZGUgeG1sdGV4dCB4bWx1bmljb2RlIik7CiAgdmFyIHZhcmlhYmxlID0gd29yZHMoImFwcGx5IGFzc2VydCBidWlsZCBidWlsZGluZGV4IGV2YWx1YXRlIGZhaWwga2V5ZGlmZiBrZXlwYXRjaCBsb2FkeG1sIG5vdGhvciBub3RpZnkgb3V0cHV0IHBhcmFsbGVsIHNlcXVlbnRpYWwgc29hcGNhbGwgd2FpdCIpOwogIHZhciB2YXJpYWJsZV8yID0gd29yZHMoIl9fY29tcHJlc3NlZF9fIGFsbCBhbmQgYW55IGFzIGF0bW9zdCBiZWZvcmUgYmVnaW5jKysgYmVzdCBiZXR3ZWVuIGNhc2UgY29uc3QgY291bnRlciBjc3YgZGVzY2VuZCBlbmNyeXB0IGVuZCBlbmRjKysgZW5kbWFjcm8gZXhjZXB0IGV4Y2x1c2l2ZSBleHBpcmUgZXhwb3J0IGV4dGVuZCBmYWxzZSBmZXcgZmlyc3QgZmxhdCBmcm9tIGZ1bGwgZnVuY3Rpb24gZ3JvdXAgaGVhZGVyIGhlYWRpbmcgaG9sZSBpZmJsb2NrIGltcG9ydCBpbiBpbnRlcmZhY2Ugam9pbmVkIGtlZXAga2V5ZWQgbGFzdCBsZWZ0IGxpbWl0IGxvYWQgbG9jYWwgbG9jYWxlIGxvb2t1cCBtYWNybyBtYW55IG1heGNvdW50IG1heGxlbmd0aCBtaW4gc2tldyBtb2R1bGUgbmFtZWQgbm9jYXNlIG5vcm9vdCBub3NjYW4gbm9zb3J0IG5vdCBvZiBvbmx5IG9wdCBvciBvdXRlciBvdmVyd3JpdGUgcGFja2VkIHBhcnRpdGlvbiBwZW5hbHR5IHBoeXNpY2FsbGVuZ3RoIHBpcGUgcXVvdGUgcmVjb3JkIHJlbGF0aW9uc2hpcCByZXBlYXQgcmV0dXJuIHJpZ2h0IHNjYW4gc2VsZiBzZXBhcmF0b3Igc2VydmljZSBzaGFyZWQgc2tldyBza2lwIHNxbCBzdG9yZSB0ZXJtaW5hdG9yIHRob3IgdGhyZXNob2xkIHRva2VuIHRyYW5zZm9ybSB0cmltIHRydWUgdHlwZSB1bmljb2Rlb3JkZXIgdW5zb3J0ZWQgdmFsaWRhdGUgdmlydHVhbCB3aG9sZSB3aWxkIHdpdGhpbiB4bWwgeHBhdGgiKTsKICB2YXIgdmFyaWFibGVfMyA9IHdvcmRzKCJhc2NpaSBiaWdfZW5kaWFuIGJvb2xlYW4gZGF0YSBkZWNpbWFsIGViY2RpYyBpbnRlZ2VyIHBhdHRlcm4gcXN0cmluZyByZWFsIHJlY29yZCBydWxlIHNldCBvZiBzdHJpbmcgdG9rZW4gdWRlY2ltYWwgdW5pY29kZSB1bnNpZ25lZCB2YXJzdHJpbmcgdmFydW5pY29kZSIpOwogIHZhciBidWlsdGluID0gd29yZHMoImNoZWNrcG9pbnQgZGVwcmVjYXRlZCBmYWlsY29kZSBmYWlsbWVzc2FnZSBmYWlsdXJlIGdsb2JhbCBpbmRlcGVuZGVudCBvbndhcm5pbmcgcGVyc2lzdCBwcmlvcml0eSByZWNvdmVyeSBzdG9yZWQgc3VjY2VzcyB3YWl0IHdoZW4iKTsKICB2YXIgYmxvY2tLZXl3b3JkcyA9IHdvcmRzKCJjYXRjaCBjbGFzcyBkbyBlbHNlIGZpbmFsbHkgZm9yIGlmIHN3aXRjaCB0cnkgd2hpbGUiKTsKICB2YXIgYXRvbXMgPSB3b3JkcygidHJ1ZSBmYWxzZSBudWxsIik7CiAgdmFyIGhvb2tzID0geyIjIjogbWV0YUhvb2t9OwogIHZhciBtdWx0aUxpbmVTdHJpbmdzOwogIHZhciBpc09wZXJhdG9yQ2hhciA9IC9bK1wtKiYlPTw+IT98XC9dLzsKCiAgdmFyIGN1clB1bmM7CgogIGZ1bmN0aW9uIHRva2VuQmFzZShzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpOwogICAgaWYgKGhvb2tzW2NoXSkgewogICAgICB2YXIgcmVzdWx0ID0gaG9va3NbY2hdKHN0cmVhbSwgc3RhdGUpOwogICAgICBpZiAocmVzdWx0ICE9PSBmYWxzZSkgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIGlmIChjaCA9PSAnIicgfHwgY2ggPT0gIiciKSB7CiAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5TdHJpbmcoY2gpOwogICAgICByZXR1cm4gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CiAgICB9CiAgICBpZiAoL1tcW1xde31cKFwpLDtcOlwuXS8udGVzdChjaCkpIHsKICAgICAgY3VyUHVuYyA9IGNoOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGlmICgvXGQvLnRlc3QoY2gpKSB7CiAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1x3XC5dLyk7CiAgICAgIHJldHVybiAibnVtYmVyIjsKICAgIH0KICAgIGlmIChjaCA9PSAiLyIpIHsKICAgICAgaWYgKHN0cmVhbS5lYXQoIioiKSkgewogICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5Db21tZW50OwogICAgICAgIHJldHVybiB0b2tlbkNvbW1lbnQoc3RyZWFtLCBzdGF0ZSk7CiAgICAgIH0KICAgICAgaWYgKHN0cmVhbS5lYXQoIi8iKSkgewogICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgICByZXR1cm4gImNvbW1lbnQiOwogICAgICB9CiAgICB9CiAgICBpZiAoaXNPcGVyYXRvckNoYXIudGVzdChjaCkpIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKGlzT3BlcmF0b3JDaGFyKTsKICAgICAgcmV0dXJuICJvcGVyYXRvciI7CiAgICB9CiAgICBzdHJlYW0uZWF0V2hpbGUoL1tcd1wkX10vKTsKICAgIHZhciBjdXIgPSBzdHJlYW0uY3VycmVudCgpLnRvTG93ZXJDYXNlKCk7CiAgICBpZiAoa2V5d29yZC5wcm9wZXJ0eUlzRW51bWVyYWJsZShjdXIpKSB7CiAgICAgIGlmIChibG9ja0tleXdvcmRzLnByb3BlcnR5SXNFbnVtZXJhYmxlKGN1cikpIGN1clB1bmMgPSAibmV3c3RhdGVtZW50IjsKICAgICAgcmV0dXJuICJrZXl3b3JkIjsKICAgIH0gZWxzZSBpZiAodmFyaWFibGUucHJvcGVydHlJc0VudW1lcmFibGUoY3VyKSkgewogICAgICBpZiAoYmxvY2tLZXl3b3Jkcy5wcm9wZXJ0eUlzRW51bWVyYWJsZShjdXIpKSBjdXJQdW5jID0gIm5ld3N0YXRlbWVudCI7CiAgICAgIHJldHVybiAidmFyaWFibGUiOwogICAgfSBlbHNlIGlmICh2YXJpYWJsZV8yLnByb3BlcnR5SXNFbnVtZXJhYmxlKGN1cikpIHsKICAgICAgaWYgKGJsb2NrS2V5d29yZHMucHJvcGVydHlJc0VudW1lcmFibGUoY3VyKSkgY3VyUHVuYyA9ICJuZXdzdGF0ZW1lbnQiOwogICAgICByZXR1cm4gInZhcmlhYmxlLTIiOwogICAgfSBlbHNlIGlmICh2YXJpYWJsZV8zLnByb3BlcnR5SXNFbnVtZXJhYmxlKGN1cikpIHsKICAgICAgaWYgKGJsb2NrS2V5d29yZHMucHJvcGVydHlJc0VudW1lcmFibGUoY3VyKSkgY3VyUHVuYyA9ICJuZXdzdGF0ZW1lbnQiOwogICAgICByZXR1cm4gInZhcmlhYmxlLTMiOwogICAgfSBlbHNlIGlmIChidWlsdGluLnByb3BlcnR5SXNFbnVtZXJhYmxlKGN1cikpIHsKICAgICAgaWYgKGJsb2NrS2V5d29yZHMucHJvcGVydHlJc0VudW1lcmFibGUoY3VyKSkgY3VyUHVuYyA9ICJuZXdzdGF0ZW1lbnQiOwogICAgICByZXR1cm4gImJ1aWx0aW4iOwogICAgfSBlbHNlIHsgLy9EYXRhIHR5cGVzIGFyZSBvZiBmcm9tIEtFWVdPUkQjIwogICAgICAgICAgICAgICAgdmFyIGkgPSBjdXIubGVuZ3RoIC0gMTsKICAgICAgICAgICAgICAgIHdoaWxlKGkgPj0gMCAmJiAoIWlzTmFOKGN1cltpXSkgfHwgY3VyW2ldID09ICdfJykpCiAgICAgICAgICAgICAgICAgICAgICAgIC0taTsKCiAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGN1cjIgPSBjdXIuc3Vic3RyKDAsIGkgKyAxKTsKICAgICAgICAgICAgICAgIGlmICh2YXJpYWJsZV8zLnByb3BlcnR5SXNFbnVtZXJhYmxlKGN1cjIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChibG9ja0tleXdvcmRzLnByb3BlcnR5SXNFbnVtZXJhYmxlKGN1cjIpKSBjdXJQdW5jID0gIm5ld3N0YXRlbWVudCI7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAidmFyaWFibGUtMyI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgIH0KICAgIGlmIChhdG9tcy5wcm9wZXJ0eUlzRW51bWVyYWJsZShjdXIpKSByZXR1cm4gImF0b20iOwogICAgcmV0dXJuIG51bGw7CiAgfQoKICBmdW5jdGlvbiB0b2tlblN0cmluZyhxdW90ZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgdmFyIGVzY2FwZWQgPSBmYWxzZSwgbmV4dCwgZW5kID0gZmFsc2U7CiAgICAgIHdoaWxlICgobmV4dCA9IHN0cmVhbS5uZXh0KCkpICE9IG51bGwpIHsKICAgICAgICBpZiAobmV4dCA9PSBxdW90ZSAmJiAhZXNjYXBlZCkge2VuZCA9IHRydWU7IGJyZWFrO30KICAgICAgICBlc2NhcGVkID0gIWVzY2FwZWQgJiYgbmV4dCA9PSAiXFwiOwogICAgICB9CiAgICAgIGlmIChlbmQgfHwgIShlc2NhcGVkIHx8IG11bHRpTGluZVN0cmluZ3MpKQogICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlOwogICAgICByZXR1cm4gInN0cmluZyI7CiAgICB9OwogIH0KCiAgZnVuY3Rpb24gdG9rZW5Db21tZW50KHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBtYXliZUVuZCA9IGZhbHNlLCBjaDsKICAgIHdoaWxlIChjaCA9IHN0cmVhbS5uZXh0KCkpIHsKICAgICAgaWYgKGNoID09ICIvIiAmJiBtYXliZUVuZCkgewogICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIG1heWJlRW5kID0gKGNoID09ICIqIik7CiAgICB9CiAgICByZXR1cm4gImNvbW1lbnQiOwogIH0KCiAgZnVuY3Rpb24gQ29udGV4dChpbmRlbnRlZCwgY29sdW1uLCB0eXBlLCBhbGlnbiwgcHJldikgewogICAgdGhpcy5pbmRlbnRlZCA9IGluZGVudGVkOwogICAgdGhpcy5jb2x1bW4gPSBjb2x1bW47CiAgICB0aGlzLnR5cGUgPSB0eXBlOwogICAgdGhpcy5hbGlnbiA9IGFsaWduOwogICAgdGhpcy5wcmV2ID0gcHJldjsKICB9CiAgZnVuY3Rpb24gcHVzaENvbnRleHQoc3RhdGUsIGNvbCwgdHlwZSkgewogICAgcmV0dXJuIHN0YXRlLmNvbnRleHQgPSBuZXcgQ29udGV4dChzdGF0ZS5pbmRlbnRlZCwgY29sLCB0eXBlLCBudWxsLCBzdGF0ZS5jb250ZXh0KTsKICB9CiAgZnVuY3Rpb24gcG9wQ29udGV4dChzdGF0ZSkgewogICAgdmFyIHQgPSBzdGF0ZS5jb250ZXh0LnR5cGU7CiAgICBpZiAodCA9PSAiKSIgfHwgdCA9PSAiXSIgfHwgdCA9PSAifSIpCiAgICAgIHN0YXRlLmluZGVudGVkID0gc3RhdGUuY29udGV4dC5pbmRlbnRlZDsKICAgIHJldHVybiBzdGF0ZS5jb250ZXh0ID0gc3RhdGUuY29udGV4dC5wcmV2OwogIH0KCiAgLy8gSW50ZXJmYWNlCgogIHJldHVybiB7CiAgICBzdGFydFN0YXRlOiBmdW5jdGlvbihiYXNlY29sdW1uKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgdG9rZW5pemU6IG51bGwsCiAgICAgICAgY29udGV4dDogbmV3IENvbnRleHQoKGJhc2Vjb2x1bW4gfHwgMCkgLSBpbmRlbnRVbml0LCAwLCAidG9wIiwgZmFsc2UpLAogICAgICAgIGluZGVudGVkOiAwLAogICAgICAgIHN0YXJ0T2ZMaW5lOiB0cnVlCiAgICAgIH07CiAgICB9LAoKICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHZhciBjdHggPSBzdGF0ZS5jb250ZXh0OwogICAgICBpZiAoc3RyZWFtLnNvbCgpKSB7CiAgICAgICAgaWYgKGN0eC5hbGlnbiA9PSBudWxsKSBjdHguYWxpZ24gPSBmYWxzZTsKICAgICAgICBzdGF0ZS5pbmRlbnRlZCA9IHN0cmVhbS5pbmRlbnRhdGlvbigpOwogICAgICAgIHN0YXRlLnN0YXJ0T2ZMaW5lID0gdHJ1ZTsKICAgICAgfQogICAgICBpZiAoc3RyZWFtLmVhdFNwYWNlKCkpIHJldHVybiBudWxsOwogICAgICBjdXJQdW5jID0gbnVsbDsKICAgICAgdmFyIHN0eWxlID0gKHN0YXRlLnRva2VuaXplIHx8IHRva2VuQmFzZSkoc3RyZWFtLCBzdGF0ZSk7CiAgICAgIGlmIChzdHlsZSA9PSAiY29tbWVudCIgfHwgc3R5bGUgPT0gIm1ldGEiKSByZXR1cm4gc3R5bGU7CiAgICAgIGlmIChjdHguYWxpZ24gPT0gbnVsbCkgY3R4LmFsaWduID0gdHJ1ZTsKCiAgICAgIGlmICgoY3VyUHVuYyA9PSAiOyIgfHwgY3VyUHVuYyA9PSAiOiIpICYmIGN0eC50eXBlID09ICJzdGF0ZW1lbnQiKSBwb3BDb250ZXh0KHN0YXRlKTsKICAgICAgZWxzZSBpZiAoY3VyUHVuYyA9PSAieyIpIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0uY29sdW1uKCksICJ9Iik7CiAgICAgIGVsc2UgaWYgKGN1clB1bmMgPT0gIlsiKSBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLmNvbHVtbigpLCAiXSIpOwogICAgICBlbHNlIGlmIChjdXJQdW5jID09ICIoIikgcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbS5jb2x1bW4oKSwgIikiKTsKICAgICAgZWxzZSBpZiAoY3VyUHVuYyA9PSAifSIpIHsKICAgICAgICB3aGlsZSAoY3R4LnR5cGUgPT0gInN0YXRlbWVudCIpIGN0eCA9IHBvcENvbnRleHQoc3RhdGUpOwogICAgICAgIGlmIChjdHgudHlwZSA9PSAifSIpIGN0eCA9IHBvcENvbnRleHQoc3RhdGUpOwogICAgICAgIHdoaWxlIChjdHgudHlwZSA9PSAic3RhdGVtZW50IikgY3R4ID0gcG9wQ29udGV4dChzdGF0ZSk7CiAgICAgIH0KICAgICAgZWxzZSBpZiAoY3VyUHVuYyA9PSBjdHgudHlwZSkgcG9wQ29udGV4dChzdGF0ZSk7CiAgICAgIGVsc2UgaWYgKGN0eC50eXBlID09ICJ9IiB8fCBjdHgudHlwZSA9PSAidG9wIiB8fCAoY3R4LnR5cGUgPT0gInN0YXRlbWVudCIgJiYgY3VyUHVuYyA9PSAibmV3c3RhdGVtZW50IikpCiAgICAgICAgcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbS5jb2x1bW4oKSwgInN0YXRlbWVudCIpOwogICAgICBzdGF0ZS5zdGFydE9mTGluZSA9IGZhbHNlOwogICAgICByZXR1cm4gc3R5bGU7CiAgICB9LAoKICAgIGluZGVudDogZnVuY3Rpb24oc3RhdGUsIHRleHRBZnRlcikgewogICAgICBpZiAoc3RhdGUudG9rZW5pemUgIT0gdG9rZW5CYXNlICYmIHN0YXRlLnRva2VuaXplICE9IG51bGwpIHJldHVybiAwOwogICAgICB2YXIgY3R4ID0gc3RhdGUuY29udGV4dCwgZmlyc3RDaGFyID0gdGV4dEFmdGVyICYmIHRleHRBZnRlci5jaGFyQXQoMCk7CiAgICAgIGlmIChjdHgudHlwZSA9PSAic3RhdGVtZW50IiAmJiBmaXJzdENoYXIgPT0gIn0iKSBjdHggPSBjdHgucHJldjsKICAgICAgdmFyIGNsb3NpbmcgPSBmaXJzdENoYXIgPT0gY3R4LnR5cGU7CiAgICAgIGlmIChjdHgudHlwZSA9PSAic3RhdGVtZW50IikgcmV0dXJuIGN0eC5pbmRlbnRlZCArIChmaXJzdENoYXIgPT0gInsiID8gMCA6IGluZGVudFVuaXQpOwogICAgICBlbHNlIGlmIChjdHguYWxpZ24pIHJldHVybiBjdHguY29sdW1uICsgKGNsb3NpbmcgPyAwIDogMSk7CiAgICAgIGVsc2UgcmV0dXJuIGN0eC5pbmRlbnRlZCArIChjbG9zaW5nID8gMCA6IGluZGVudFVuaXQpOwogICAgfSwKCiAgICBlbGVjdHJpY0NoYXJzOiAie30iCiAgfTsKfSk7CgpDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveC1lY2wiLCAiZWNsIik7Cgp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/ecl/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogRUNMIG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iZWNsLmpzIj48L3NjcmlwdD4KPHN0eWxlPi5Db2RlTWlycm9yIHtib3JkZXI6IDFweCBzb2xpZCBibGFjazt9PC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aW1nIGlkPWxvZ28gc3JjPSIuLi8uLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5MYW5ndWFnZSBtb2RlczwvYT4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+RUNMPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5FQ0wgbW9kZTwvaDI+Cjxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+Ci8qCnNhbXBsZSB1c2VsZXNzIGNvZGUgdG8gZGVtb25zdHJhdGUgZWNsIHN5bnRheCBoaWdobGlnaHRpbmcKdGhpcyBpcyBhIG11bHRpbGluZSBjb21tZW50IQoqLwoKLy8gIHRoaXMgaXMgYSBzaW5nbGVsaW5lIGNvbW1lbnQhCgppbXBvcnQgdXQ7CnIgOj0gCiAgcmVjb3JkCiAgIHN0cmluZzIyIHMxIDo9ICcxMjMnOwogICBpbnRlZ2VyNCBpMSA6PSAxMjM7CiAgZW5kOwojb3B0aW9uKCd0bXAnLCB0cnVlKTsKZCA6PSBkYXRhc2V0KCd0bXA6OnFiJywgciwgdGhvcik7Cm91dHB1dChkKTsKPC90ZXh0YXJlYT48L2Zvcm0+CiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwge30pOwogICAgPC9zY3JpcHQ+CgogICAgPHA+QmFzZWQgb24gQ29kZU1pcnJvcidzIGNsaWtlIG1vZGUuICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgPGEgaHJlZj0iaHR0cDovL2hwY2NzeXN0ZW1zLmNvbSI+SFBDQyBTeXN0ZW1zPC9hPiB3ZWIgc2l0ZS48L3A+CiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC94LWVjbDwvY29kZT4uPC9wPgoKICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/eiffel/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/eiffel/eiffel.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJlaWZmZWwiLCBmdW5jdGlvbigpIHsKICBmdW5jdGlvbiB3b3JkT2JqKHdvcmRzKSB7CiAgICB2YXIgbyA9IHt9OwogICAgZm9yICh2YXIgaSA9IDAsIGUgPSB3b3Jkcy5sZW5ndGg7IGkgPCBlOyArK2kpIG9bd29yZHNbaV1dID0gdHJ1ZTsKICAgIHJldHVybiBvOwogIH0KICB2YXIga2V5d29yZHMgPSB3b3JkT2JqKFsKICAgICdub3RlJywKICAgICdhY3Jvc3MnLAogICAgJ3doZW4nLAogICAgJ3ZhcmlhbnQnLAogICAgJ3VudGlsJywKICAgICd1bmlxdWUnLAogICAgJ3VuZGVmaW5lJywKICAgICd0aGVuJywKICAgICdzdHJpcCcsCiAgICAnc2VsZWN0JywKICAgICdyZXRyeScsCiAgICAncmVzY3VlJywKICAgICdyZXF1aXJlJywKICAgICdyZW5hbWUnLAogICAgJ3JlZmVyZW5jZScsCiAgICAncmVkZWZpbmUnLAogICAgJ3ByZWZpeCcsCiAgICAnb25jZScsCiAgICAnb2xkJywKICAgICdvYnNvbGV0ZScsCiAgICAnbG9vcCcsCiAgICAnbG9jYWwnLAogICAgJ2xpa2UnLAogICAgJ2lzJywKICAgICdpbnNwZWN0JywKICAgICdpbmZpeCcsCiAgICAnaW5jbHVkZScsCiAgICAnaWYnLAogICAgJ2Zyb3plbicsCiAgICAnZnJvbScsCiAgICAnZXh0ZXJuYWwnLAogICAgJ2V4cG9ydCcsCiAgICAnZW5zdXJlJywKICAgICdlbmQnLAogICAgJ2Vsc2VpZicsCiAgICAnZWxzZScsCiAgICAnZG8nLAogICAgJ2NyZWF0aW9uJywKICAgICdjcmVhdGUnLAogICAgJ2NoZWNrJywKICAgICdhbGlhcycsCiAgICAnYWdlbnQnLAogICAgJ3NlcGFyYXRlJywKICAgICdpbnZhcmlhbnQnLAogICAgJ2luaGVyaXQnLAogICAgJ2luZGV4aW5nJywKICAgICdmZWF0dXJlJywKICAgICdleHBhbmRlZCcsCiAgICAnZGVmZXJyZWQnLAogICAgJ2NsYXNzJywKICAgICdWb2lkJywKICAgICdUcnVlJywKICAgICdSZXN1bHQnLAogICAgJ1ByZWN1cnNvcicsCiAgICAnRmFsc2UnLAogICAgJ0N1cnJlbnQnLAogICAgJ2NyZWF0ZScsCiAgICAnYXR0YWNoZWQnLAogICAgJ2RldGFjaGFibGUnLAogICAgJ2FzJywKICAgICdhbmQnLAogICAgJ2ltcGxpZXMnLAogICAgJ25vdCcsCiAgICAnb3InCiAgXSk7CiAgdmFyIG9wZXJhdG9ycyA9IHdvcmRPYmooWyI6PSIsICJhbmQgdGhlbiIsImFuZCIsICJvciIsIjw8IiwiPj4iXSk7CiAgdmFyIGN1clB1bmM7CgogIGZ1bmN0aW9uIGNoYWluKG5ld3Rvaywgc3RyZWFtLCBzdGF0ZSkgewogICAgc3RhdGUudG9rZW5pemUucHVzaChuZXd0b2spOwogICAgcmV0dXJuIG5ld3RvayhzdHJlYW0sIHN0YXRlKTsKICB9CgogIGZ1bmN0aW9uIHRva2VuQmFzZShzdHJlYW0sIHN0YXRlKSB7CiAgICBjdXJQdW5jID0gbnVsbDsKICAgIGlmIChzdHJlYW0uZWF0U3BhY2UoKSkgcmV0dXJuIG51bGw7CiAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpOwogICAgaWYgKGNoID09ICciJ3x8Y2ggPT0gIiciKSB7CiAgICAgIHJldHVybiBjaGFpbihyZWFkUXVvdGVkKGNoLCAic3RyaW5nIiksIHN0cmVhbSwgc3RhdGUpOwogICAgfSBlbHNlIGlmIChjaCA9PSAiLSImJnN0cmVhbS5lYXQoIi0iKSkgewogICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICAgIHJldHVybiAiY29tbWVudCI7CiAgICB9IGVsc2UgaWYgKGNoID09ICI6IiYmc3RyZWFtLmVhdCgiPSIpKSB7CiAgICAgIHJldHVybiAib3BlcmF0b3IiOwogICAgfSBlbHNlIGlmICgvWzAtOV0vLnRlc3QoY2gpKSB7CiAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW3hYYkJDYzAtOVwuXS8pOwogICAgICBzdHJlYW0uZWF0KC9bXD9cIV0vKTsKICAgICAgcmV0dXJuICJpZGVudCI7CiAgICB9IGVsc2UgaWYgKC9bYS16QS1aXzAtOV0vLnRlc3QoY2gpKSB7CiAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW2EtekEtWl8wLTldLyk7CiAgICAgIHN0cmVhbS5lYXQoL1tcP1whXS8pOwogICAgICByZXR1cm4gImlkZW50IjsKICAgIH0gZWxzZSBpZiAoL1s9K1wtXC8qXiU8Pn5dLy50ZXN0KGNoKSkgewogICAgICBzdHJlYW0uZWF0V2hpbGUoL1s9K1wtXC8qXiU8Pn5dLyk7CiAgICAgIHJldHVybiAib3BlcmF0b3IiOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfQoKICBmdW5jdGlvbiByZWFkUXVvdGVkKHF1b3RlLCBzdHlsZSwgIHVuZXNjYXBlZCkgewogICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgdmFyIGVzY2FwZWQgPSBmYWxzZSwgY2g7CiAgICAgIHdoaWxlICgoY2ggPSBzdHJlYW0ubmV4dCgpKSAhPSBudWxsKSB7CiAgICAgICAgaWYgKGNoID09IHF1b3RlICYmICh1bmVzY2FwZWQgfHwgIWVzY2FwZWQpKSB7CiAgICAgICAgICBzdGF0ZS50b2tlbml6ZS5wb3AoKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBlc2NhcGVkID0gIWVzY2FwZWQgJiYgY2ggPT0gIiUiOwogICAgICB9CiAgICAgIHJldHVybiBzdHlsZTsKICAgIH07CiAgfQoKICByZXR1cm4gewogICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB7dG9rZW5pemU6IFt0b2tlbkJhc2VdfTsKICAgIH0sCgogICAgdG9rZW46IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgdmFyIHN0eWxlID0gc3RhdGUudG9rZW5pemVbc3RhdGUudG9rZW5pemUubGVuZ3RoLTFdKHN0cmVhbSwgc3RhdGUpOwogICAgICBpZiAoc3R5bGUgPT0gImlkZW50IikgewogICAgICAgIHZhciB3b3JkID0gc3RyZWFtLmN1cnJlbnQoKTsKICAgICAgICBzdHlsZSA9IGtleXdvcmRzLnByb3BlcnR5SXNFbnVtZXJhYmxlKHN0cmVhbS5jdXJyZW50KCkpID8gImtleXdvcmQiCiAgICAgICAgICA6IG9wZXJhdG9ycy5wcm9wZXJ0eUlzRW51bWVyYWJsZShzdHJlYW0uY3VycmVudCgpKSA/ICJvcGVyYXRvciIKICAgICAgICAgIDogL15bQS1aXVtBLVpfMC05XSokL2cudGVzdCh3b3JkKSA/ICJ0YWciCiAgICAgICAgICA6IC9eMFtiQl1bMC0xXSskL2cudGVzdCh3b3JkKSA/ICJudW1iZXIiCiAgICAgICAgICA6IC9eMFtjQ11bMC03XSskL2cudGVzdCh3b3JkKSA/ICJudW1iZXIiCiAgICAgICAgICA6IC9eMFt4WF1bYS1mQS1GMC05XSskL2cudGVzdCh3b3JkKSA/ICJudW1iZXIiCiAgICAgICAgICA6IC9eKFswLTldK1wuWzAtOV0qKXwoWzAtOV0qXC5bMC05XSspJC9nLnRlc3Qod29yZCkgPyAibnVtYmVyIgogICAgICAgICAgOiAvXlswLTldKyQvZy50ZXN0KHdvcmQpID8gIm51bWJlciIKICAgICAgICAgIDogInZhcmlhYmxlIjsKICAgICAgfQogICAgICByZXR1cm4gc3R5bGU7CiAgICB9LAogICAgbGluZUNvbW1lbnQ6ICItLSIKICB9Owp9KTsKCkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC94LWVpZmZlbCIsICJlaWZmZWwiKTsKCn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/eiffel/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogRWlmZmVsIG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL3RoZW1lL25lYXQuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9ImVpZmZlbC5qcyI+PC9zY3JpcHQ+CjxzdHlsZT4KICAgICAgLkNvZGVNaXJyb3Ige2JvcmRlci10b3A6IDFweCBzb2xpZCBibGFjazsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO30KICAgICAgLmNtLXMtZGVmYXVsdCBzcGFuLmNtLWFycm93IHsgY29sb3I6IHJlZDsgfQogICAgPC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aW1nIGlkPWxvZ28gc3JjPSIuLi8uLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5MYW5ndWFnZSBtb2RlczwvYT4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+RWlmZmVsPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5FaWZmZWwgbW9kZTwvaDI+Cjxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+Cm5vdGUKICAgIGRlc2NyaXB0aW9uOiAiWwogICAgICAgIFByb2plY3Qtd2lkZSB1bml2ZXJzYWwgcHJvcGVydGllcy4KICAgICAgICBUaGlzIGNsYXNzIGlzIGFuIGFuY2VzdG9yIHRvIGFsbCBkZXZlbG9wZXItd3JpdHRlbiBjbGFzc2VzLgogICAgICAgIEFOWSBtYXkgYmUgY3VzdG9taXplZCBmb3IgaW5kaXZpZHVhbCBwcm9qZWN0cyBvciB0ZWFtcy4KICAgICAgICBdIgoKICAgIGxpYnJhcnk6ICJGcmVlIGltcGxlbWVudGF0aW9uIG9mIEVMS1MgbGlicmFyeSIKICAgIHN0YXR1czogIlNlZSBub3RpY2UgYXQgZW5kIG9mIGNsYXNzLiIKICAgIGxlZ2FsOiAiU2VlIG5vdGljZSBhdCBlbmQgb2YgY2xhc3MuIgogICAgZGF0ZTogIiREYXRlOiAyMDEzLTAxLTI1IDExOjQ5OjAwIC0wODAwIChGcmksIDI1IEphbiAyMDEzKSAkIgogICAgcmV2aXNpb246ICIkUmV2aXNpb246IDcxMiAkIgoKY2xhc3MKICAgIEFOWQoKZmVhdHVyZSAtLSBDdXN0b21pemF0aW9uCgpmZWF0dXJlIC0tIEFjY2VzcwoKICAgIGdlbmVyYXRvcjogU1RSSU5HCiAgICAgICAgICAgIC0tIE5hbWUgb2YgY3VycmVudCBvYmplY3QncyBnZW5lcmF0aW5nIGNsYXNzCiAgICAgICAgICAgIC0tIChiYXNlIGNsYXNzIG9mIHRoZSB0eXBlIG9mIHdoaWNoIGl0IGlzIGEgZGlyZWN0IGluc3RhbmNlKQogICAgICAgIGV4dGVybmFsCiAgICAgICAgICAgICJidWlsdF9pbiIKICAgICAgICBlbnN1cmUKICAgICAgICAgICAgZ2VuZXJhdG9yX25vdF92b2lkOiBSZXN1bHQgLz0gVm9pZAogICAgICAgICAgICBnZW5lcmF0b3Jfbm90X2VtcHR5OiBub3QgUmVzdWx0LmlzX2VtcHR5CiAgICAgICAgZW5kCgogICAgZ2VuZXJhdGluZ190eXBlOiBUWVBFIFtkZXRhY2hhYmxlIGxpa2UgQ3VycmVudF0KICAgICAgICAgICAgLS0gVHlwZSBvZiBjdXJyZW50IG9iamVjdAogICAgICAgICAgICAtLSAodHlwZSBvZiB3aGljaCBpdCBpcyBhIGRpcmVjdCBpbnN0YW5jZSkKICAgICAgICBkbwogICAgICAgICAgICBSZXN1bHQgOj0ge2RldGFjaGFibGUgbGlrZSBDdXJyZW50fQogICAgICAgIGVuc3VyZQogICAgICAgICAgICBnZW5lcmF0aW5nX3R5cGVfbm90X3ZvaWQ6IFJlc3VsdCAvPSBWb2lkCiAgICAgICAgZW5kCgpmZWF0dXJlIC0tIFN0YXR1cyByZXBvcnQKCiAgICBjb25mb3Jtc190byAob3RoZXI6IEFOWSk6IEJPT0xFQU4KICAgICAgICAgICAgLS0gRG9lcyB0eXBlIG9mIGN1cnJlbnQgb2JqZWN0IGNvbmZvcm0gdG8gdHlwZQogICAgICAgICAgICAtLSBvZiBgb3RoZXInIChhcyBwZXIgRWlmZmVsOiBUaGUgTGFuZ3VhZ2UsIGNoYXB0ZXIgMTMpPwogICAgICAgIHJlcXVpcmUKICAgICAgICAgICAgb3RoZXJfbm90X3ZvaWQ6IG90aGVyIC89IFZvaWQKICAgICAgICBleHRlcm5hbAogICAgICAgICAgICAiYnVpbHRfaW4iCiAgICAgICAgZW5kCgogICAgc2FtZV90eXBlIChvdGhlcjogQU5ZKTogQk9PTEVBTgogICAgICAgICAgICAtLSBJcyB0eXBlIG9mIGN1cnJlbnQgb2JqZWN0IGlkZW50aWNhbCB0byB0eXBlIG9mIGBvdGhlcic/CiAgICAgICAgcmVxdWlyZQogICAgICAgICAgICBvdGhlcl9ub3Rfdm9pZDogb3RoZXIgLz0gVm9pZAogICAgICAgIGV4dGVybmFsCiAgICAgICAgICAgICJidWlsdF9pbiIKICAgICAgICBlbnN1cmUKICAgICAgICAgICAgZGVmaW5pdGlvbjogUmVzdWx0ID0gKGNvbmZvcm1zX3RvIChvdGhlcikgYW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlci5jb25mb3Jtc190byAoQ3VycmVudCkpCiAgICAgICAgZW5kCgpmZWF0dXJlIC0tIENvbXBhcmlzb24KCiAgICBpc19lcXVhbCAob3RoZXI6IGxpa2UgQ3VycmVudCk6IEJPT0xFQU4KICAgICAgICAgICAgLS0gSXMgYG90aGVyJyBhdHRhY2hlZCB0byBhbiBvYmplY3QgY29uc2lkZXJlZAogICAgICAgICAgICAtLSBlcXVhbCB0byBjdXJyZW50IG9iamVjdD8KICAgICAgICByZXF1aXJlCiAgICAgICAgICAgIG90aGVyX25vdF92b2lkOiBvdGhlciAvPSBWb2lkCiAgICAgICAgZXh0ZXJuYWwKICAgICAgICAgICAgImJ1aWx0X2luIgogICAgICAgIGVuc3VyZQogICAgICAgICAgICBzeW1tZXRyaWM6IFJlc3VsdCBpbXBsaWVzIG90aGVyIH4gQ3VycmVudAogICAgICAgICAgICBjb25zaXN0ZW50OiBzdGFuZGFyZF9pc19lcXVhbCAob3RoZXIpIGltcGxpZXMgUmVzdWx0CiAgICAgICAgZW5kCgogICAgZnJvemVuIHN0YW5kYXJkX2lzX2VxdWFsIChvdGhlcjogbGlrZSBDdXJyZW50KTogQk9PTEVBTgogICAgICAgICAgICAtLSBJcyBgb3RoZXInIGF0dGFjaGVkIHRvIGFuIG9iamVjdCBvZiB0aGUgc2FtZSB0eXBlCiAgICAgICAgICAgIC0tIGFzIGN1cnJlbnQgb2JqZWN0LCBhbmQgZmllbGQtYnktZmllbGQgaWRlbnRpY2FsIHRvIGl0PwogICAgICAgIHJlcXVpcmUKICAgICAgICAgICAgb3RoZXJfbm90X3ZvaWQ6IG90aGVyIC89IFZvaWQKICAgICAgICBleHRlcm5hbAogICAgICAgICAgICAiYnVpbHRfaW4iCiAgICAgICAgZW5zdXJlCiAgICAgICAgICAgIHNhbWVfdHlwZTogUmVzdWx0IGltcGxpZXMgc2FtZV90eXBlIChvdGhlcikKICAgICAgICAgICAgc3ltbWV0cmljOiBSZXN1bHQgaW1wbGllcyBvdGhlci5zdGFuZGFyZF9pc19lcXVhbCAoQ3VycmVudCkKICAgICAgICBlbmQKCiAgICBmcm96ZW4gZXF1YWwgKGE6IGRldGFjaGFibGUgQU5ZOyBiOiBsaWtlIGEpOiBCT09MRUFOCiAgICAgICAgICAgIC0tIEFyZSBgYScgYW5kIGBiJyBlaXRoZXIgYm90aCB2b2lkIG9yIGF0dGFjaGVkCiAgICAgICAgICAgIC0tIHRvIG9iamVjdHMgY29uc2lkZXJlZCBlcXVhbD8KICAgICAgICBkbwogICAgICAgICAgICBpZiBhID0gVm9pZCB0aGVuCiAgICAgICAgICAgICAgICBSZXN1bHQgOj0gYiA9IFZvaWQKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgUmVzdWx0IDo9IGIgLz0gVm9pZCBhbmQgdGhlbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5pc19lcXVhbCAoYikKICAgICAgICAgICAgZW5kCiAgICAgICAgZW5zdXJlCiAgICAgICAgICAgIGRlZmluaXRpb246IFJlc3VsdCA9IChhID0gVm9pZCBhbmQgYiA9IFZvaWQpIG9yIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgKChhIC89IFZvaWQgYW5kIGIgLz0gVm9pZCkgYW5kIHRoZW4KICAgICAgICAgICAgICAgICAgICAgICAgYS5pc19lcXVhbCAoYikpCiAgICAgICAgZW5kCgogICAgZnJvemVuIHN0YW5kYXJkX2VxdWFsIChhOiBkZXRhY2hhYmxlIEFOWTsgYjogbGlrZSBhKTogQk9PTEVBTgogICAgICAgICAgICAtLSBBcmUgYGEnIGFuZCBgYicgZWl0aGVyIGJvdGggdm9pZCBvciBhdHRhY2hlZCB0bwogICAgICAgICAgICAtLSBmaWVsZC1ieS1maWVsZCBpZGVudGljYWwgb2JqZWN0cyBvZiB0aGUgc2FtZSB0eXBlPwogICAgICAgICAgICAtLSBBbHdheXMgdXNlcyBkZWZhdWx0IG9iamVjdCBjb21wYXJpc29uIGNyaXRlcmlvbi4KICAgICAgICBkbwogICAgICAgICAgICBpZiBhID0gVm9pZCB0aGVuCiAgICAgICAgICAgICAgICBSZXN1bHQgOj0gYiA9IFZvaWQKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgUmVzdWx0IDo9IGIgLz0gVm9pZCBhbmQgdGhlbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgYS5zdGFuZGFyZF9pc19lcXVhbCAoYikKICAgICAgICAgICAgZW5kCiAgICAgICAgZW5zdXJlCiAgICAgICAgICAgIGRlZmluaXRpb246IFJlc3VsdCA9IChhID0gVm9pZCBhbmQgYiA9IFZvaWQpIG9yIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgKChhIC89IFZvaWQgYW5kIGIgLz0gVm9pZCkgYW5kIHRoZW4KICAgICAgICAgICAgICAgICAgICAgICAgYS5zdGFuZGFyZF9pc19lcXVhbCAoYikpCiAgICAgICAgZW5kCgogICAgZnJvemVuIGlzX2RlZXBfZXF1YWwgKG90aGVyOiBsaWtlIEN1cnJlbnQpOiBCT09MRUFOCiAgICAgICAgICAgIC0tIEFyZSBgQ3VycmVudCcgYW5kIGBvdGhlcicgYXR0YWNoZWQgdG8gaXNvbW9ycGhpYyBvYmplY3Qgc3RydWN0dXJlcz8KICAgICAgICByZXF1aXJlCiAgICAgICAgICAgIG90aGVyX25vdF92b2lkOiBvdGhlciAvPSBWb2lkCiAgICAgICAgZXh0ZXJuYWwKICAgICAgICAgICAgImJ1aWx0X2luIgogICAgICAgIGVuc3VyZQogICAgICAgICAgICBzaGFsbG93X2ltcGxpZXNfZGVlcDogc3RhbmRhcmRfaXNfZXF1YWwgKG90aGVyKSBpbXBsaWVzIFJlc3VsdAogICAgICAgICAgICBzYW1lX3R5cGU6IFJlc3VsdCBpbXBsaWVzIHNhbWVfdHlwZSAob3RoZXIpCiAgICAgICAgICAgIHN5bW1ldHJpYzogUmVzdWx0IGltcGxpZXMgb3RoZXIuaXNfZGVlcF9lcXVhbCAoQ3VycmVudCkKICAgICAgICBlbmQKCiAgICBmcm96ZW4gZGVlcF9lcXVhbCAoYTogZGV0YWNoYWJsZSBBTlk7IGI6IGxpa2UgYSk6IEJPT0xFQU4KICAgICAgICAgICAgLS0gQXJlIGBhJyBhbmQgYGInIGVpdGhlciBib3RoIHZvaWQKICAgICAgICAgICAgLS0gb3IgYXR0YWNoZWQgdG8gaXNvbW9ycGhpYyBvYmplY3Qgc3RydWN0dXJlcz8KICAgICAgICBkbwogICAgICAgICAgICBpZiBhID0gVm9pZCB0aGVuCiAgICAgICAgICAgICAgICBSZXN1bHQgOj0gYiA9IFZvaWQKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgUmVzdWx0IDo9IGIgLz0gVm9pZCBhbmQgdGhlbiBhLmlzX2RlZXBfZXF1YWwgKGIpCiAgICAgICAgICAgIGVuZAogICAgICAgIGVuc3VyZQogICAgICAgICAgICBzaGFsbG93X2ltcGxpZXNfZGVlcDogc3RhbmRhcmRfZXF1YWwgKGEsIGIpIGltcGxpZXMgUmVzdWx0CiAgICAgICAgICAgIGJvdGhfb3Jfbm9uZV92b2lkOiAoYSA9IFZvaWQpIGltcGxpZXMgKFJlc3VsdCA9IChiID0gVm9pZCkpCiAgICAgICAgICAgIHNhbWVfdHlwZTogKFJlc3VsdCBhbmQgKGEgLz0gVm9pZCkpIGltcGxpZXMgKGIgLz0gVm9pZCBhbmQgdGhlbiBhLnNhbWVfdHlwZSAoYikpCiAgICAgICAgICAgIHN5bW1ldHJpYzogUmVzdWx0IGltcGxpZXMgZGVlcF9lcXVhbCAoYiwgYSkKICAgICAgICBlbmQKCmZlYXR1cmUgLS0gRHVwbGljYXRpb24KCiAgICBmcm96ZW4gdHdpbjogbGlrZSBDdXJyZW50CiAgICAgICAgICAgIC0tIE5ldyBvYmplY3QgZXF1YWwgdG8gYEN1cnJlbnQnCiAgICAgICAgICAgIC0tIGB0d2luJyBjYWxscyBgY29weSc7IHRvIGNoYW5nZSBjb3B5aW5nL3R3aW5uaW5nIHNlbWFudGljcywgcmVkZWZpbmUgYGNvcHknLgogICAgICAgIGV4dGVybmFsCiAgICAgICAgICAgICJidWlsdF9pbiIKICAgICAgICBlbnN1cmUKICAgICAgICAgICAgdHdpbl9ub3Rfdm9pZDogUmVzdWx0IC89IFZvaWQKICAgICAgICAgICAgaXNfZXF1YWw6IFJlc3VsdCB+IEN1cnJlbnQKICAgICAgICBlbmQKCiAgICBjb3B5IChvdGhlcjogbGlrZSBDdXJyZW50KQogICAgICAgICAgICAtLSBVcGRhdGUgY3VycmVudCBvYmplY3QgdXNpbmcgZmllbGRzIG9mIG9iamVjdCBhdHRhY2hlZAogICAgICAgICAgICAtLSB0byBgb3RoZXInLCBzbyBhcyB0byB5aWVsZCBlcXVhbCBvYmplY3RzLgogICAgICAgIHJlcXVpcmUKICAgICAgICAgICAgb3RoZXJfbm90X3ZvaWQ6IG90aGVyIC89IFZvaWQKICAgICAgICAgICAgdHlwZV9pZGVudGl0eTogc2FtZV90eXBlIChvdGhlcikKICAgICAgICBleHRlcm5hbAogICAgICAgICAgICAiYnVpbHRfaW4iCiAgICAgICAgZW5zdXJlCiAgICAgICAgICAgIGlzX2VxdWFsOiBDdXJyZW50IH4gb3RoZXIKICAgICAgICBlbmQKCiAgICBmcm96ZW4gc3RhbmRhcmRfY29weSAob3RoZXI6IGxpa2UgQ3VycmVudCkKICAgICAgICAgICAgLS0gQ29weSBldmVyeSBmaWVsZCBvZiBgb3RoZXInIG9udG8gY29ycmVzcG9uZGluZyBmaWVsZAogICAgICAgICAgICAtLSBvZiBjdXJyZW50IG9iamVjdC4KICAgICAgICByZXF1aXJlCiAgICAgICAgICAgIG90aGVyX25vdF92b2lkOiBvdGhlciAvPSBWb2lkCiAgICAgICAgICAgIHR5cGVfaWRlbnRpdHk6IHNhbWVfdHlwZSAob3RoZXIpCiAgICAgICAgZXh0ZXJuYWwKICAgICAgICAgICAgImJ1aWx0X2luIgogICAgICAgIGVuc3VyZQogICAgICAgICAgICBpc19zdGFuZGFyZF9lcXVhbDogc3RhbmRhcmRfaXNfZXF1YWwgKG90aGVyKQogICAgICAgIGVuZAoKICAgIGZyb3plbiBjbG9uZSAob3RoZXI6IGRldGFjaGFibGUgQU5ZKTogbGlrZSBvdGhlcgogICAgICAgICAgICAtLSBWb2lkIGlmIGBvdGhlcicgaXMgdm9pZDsgb3RoZXJ3aXNlIG5ldyBvYmplY3QKICAgICAgICAgICAgLS0gZXF1YWwgdG8gYG90aGVyJwogICAgICAgICAgICAtLQogICAgICAgICAgICAtLSBGb3Igbm9uLXZvaWQgYG90aGVyJywgYGNsb25lJyBjYWxscyBgY29weSc7CiAgICAgICAgICAgIC0tIHRvIGNoYW5nZSBjb3B5aW5nL2Nsb25pbmcgc2VtYW50aWNzLCByZWRlZmluZSBgY29weScuCiAgICAgICAgb2Jzb2xldGUKICAgICAgICAgICAgIlVzZSBgdHdpbicgaW5zdGVhZC4iCiAgICAgICAgZG8KICAgICAgICAgICAgaWYgb3RoZXIgLz0gVm9pZCB0aGVuCiAgICAgICAgICAgICAgICBSZXN1bHQgOj0gb3RoZXIudHdpbgogICAgICAgICAgICBlbmQKICAgICAgICBlbnN1cmUKICAgICAgICAgICAgZXF1YWw6IFJlc3VsdCB+IG90aGVyCiAgICAgICAgZW5kCgogICAgZnJvemVuIHN0YW5kYXJkX2Nsb25lIChvdGhlcjogZGV0YWNoYWJsZSBBTlkpOiBsaWtlIG90aGVyCiAgICAgICAgICAgIC0tIFZvaWQgaWYgYG90aGVyJyBpcyB2b2lkOyBvdGhlcndpc2UgbmV3IG9iamVjdAogICAgICAgICAgICAtLSBmaWVsZC1ieS1maWVsZCBpZGVudGljYWwgdG8gYG90aGVyJy4KICAgICAgICAgICAgLS0gQWx3YXlzIHVzZXMgZGVmYXVsdCBjb3B5aW5nIHNlbWFudGljcy4KICAgICAgICBvYnNvbGV0ZQogICAgICAgICAgICAiVXNlIGBzdGFuZGFyZF90d2luJyBpbnN0ZWFkLiIKICAgICAgICBkbwogICAgICAgICAgICBpZiBvdGhlciAvPSBWb2lkIHRoZW4KICAgICAgICAgICAgICAgIFJlc3VsdCA6PSBvdGhlci5zdGFuZGFyZF90d2luCiAgICAgICAgICAgIGVuZAogICAgICAgIGVuc3VyZQogICAgICAgICAgICBlcXVhbDogc3RhbmRhcmRfZXF1YWwgKFJlc3VsdCwgb3RoZXIpCiAgICAgICAgZW5kCgogICAgZnJvemVuIHN0YW5kYXJkX3R3aW46IGxpa2UgQ3VycmVudAogICAgICAgICAgICAtLSBOZXcgb2JqZWN0IGZpZWxkLWJ5LWZpZWxkIGlkZW50aWNhbCB0byBgb3RoZXInLgogICAgICAgICAgICAtLSBBbHdheXMgdXNlcyBkZWZhdWx0IGNvcHlpbmcgc2VtYW50aWNzLgogICAgICAgIGV4dGVybmFsCiAgICAgICAgICAgICJidWlsdF9pbiIKICAgICAgICBlbnN1cmUKICAgICAgICAgICAgc3RhbmRhcmRfdHdpbl9ub3Rfdm9pZDogUmVzdWx0IC89IFZvaWQKICAgICAgICAgICAgZXF1YWw6IHN0YW5kYXJkX2VxdWFsIChSZXN1bHQsIEN1cnJlbnQpCiAgICAgICAgZW5kCgogICAgZnJvemVuIGRlZXBfdHdpbjogbGlrZSBDdXJyZW50CiAgICAgICAgICAgIC0tIE5ldyBvYmplY3Qgc3RydWN0dXJlIHJlY3Vyc2l2ZWx5IGR1cGxpY2F0ZWQgZnJvbSBDdXJyZW50LgogICAgICAgIGV4dGVybmFsCiAgICAgICAgICAgICJidWlsdF9pbiIKICAgICAgICBlbnN1cmUKICAgICAgICAgICAgZGVlcF90d2luX25vdF92b2lkOiBSZXN1bHQgLz0gVm9pZAogICAgICAgICAgICBkZWVwX2VxdWFsOiBkZWVwX2VxdWFsIChDdXJyZW50LCBSZXN1bHQpCiAgICAgICAgZW5kCgogICAgZnJvemVuIGRlZXBfY2xvbmUgKG90aGVyOiBkZXRhY2hhYmxlIEFOWSk6IGxpa2Ugb3RoZXIKICAgICAgICAgICAgLS0gVm9pZCBpZiBgb3RoZXInIGlzIHZvaWQ6IG90aGVyd2lzZSwgbmV3IG9iamVjdCBzdHJ1Y3R1cmUKICAgICAgICAgICAgLS0gcmVjdXJzaXZlbHkgZHVwbGljYXRlZCBmcm9tIHRoZSBvbmUgYXR0YWNoZWQgdG8gYG90aGVyJwogICAgICAgIG9ic29sZXRlCiAgICAgICAgICAgICJVc2UgYGRlZXBfdHdpbicgaW5zdGVhZC4iCiAgICAgICAgZG8KICAgICAgICAgICAgaWYgb3RoZXIgLz0gVm9pZCB0aGVuCiAgICAgICAgICAgICAgICBSZXN1bHQgOj0gb3RoZXIuZGVlcF90d2luCiAgICAgICAgICAgIGVuZAogICAgICAgIGVuc3VyZQogICAgICAgICAgICBkZWVwX2VxdWFsOiBkZWVwX2VxdWFsIChvdGhlciwgUmVzdWx0KQogICAgICAgIGVuZAoKICAgIGZyb3plbiBkZWVwX2NvcHkgKG90aGVyOiBsaWtlIEN1cnJlbnQpCiAgICAgICAgICAgIC0tIEVmZmVjdCBlcXVpdmFsZW50IHRvIHRoYXQgb2Y6CiAgICAgICAgICAgIC0tICAgICAgYGNvcHknIChgb3RoZXInIC4gYGRlZXBfdHdpbicpCiAgICAgICAgcmVxdWlyZQogICAgICAgICAgICBvdGhlcl9ub3Rfdm9pZDogb3RoZXIgLz0gVm9pZAogICAgICAgIGRvCiAgICAgICAgICAgIGNvcHkgKG90aGVyLmRlZXBfdHdpbikKICAgICAgICBlbnN1cmUKICAgICAgICAgICAgZGVlcF9lcXVhbDogZGVlcF9lcXVhbCAoQ3VycmVudCwgb3RoZXIpCiAgICAgICAgZW5kCgpmZWF0dXJlIHtOT05FfSAtLSBSZXRyaWV2YWwKCiAgICBmcm96ZW4gaW50ZXJuYWxfY29ycmVjdF9taXNtYXRjaAogICAgICAgICAgICAtLSBDYWxsZWQgZnJvbSBydW50aW1lIHRvIHBlcmZvcm0gYSBwcm9wZXIgZHluYW1pYyBkaXNwYXRjaCBvbiBgY29ycmVjdF9taXNtYXRjaCcKICAgICAgICAgICAgLS0gZnJvbSBNSVNNQVRDSF9DT1JSRUNUT1IuCiAgICAgICAgbG9jYWwKICAgICAgICAgICAgbF9tc2c6IFNUUklORwogICAgICAgICAgICBsX2V4YzogRVhDRVBUSU9OUwogICAgICAgIGRvCiAgICAgICAgICAgIGlmIGF0dGFjaGVkIHtNSVNNQVRDSF9DT1JSRUNUT1J9IEN1cnJlbnQgYXMgbF9jb3JyZWN0b3IgdGhlbgogICAgICAgICAgICAgICAgbF9jb3JyZWN0b3IuY29ycmVjdF9taXNtYXRjaAogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBjcmVhdGUgbF9tc2cubWFrZV9mcm9tX3N0cmluZyAoIk1pc21hdGNoOiAiKQogICAgICAgICAgICAgICAgY3JlYXRlIGxfZXhjCiAgICAgICAgICAgICAgICBsX21zZy5hcHBlbmQgKGdlbmVyYXRpbmdfdHlwZS5uYW1lKQogICAgICAgICAgICAgICAgbF9leGMucmFpc2VfcmV0cmlldmFsX2V4Y2VwdGlvbiAobF9tc2cpCiAgICAgICAgICAgIGVuZAogICAgICAgIGVuZAoKZmVhdHVyZSAtLSBPdXRwdXQKCiAgICBpbzogU1REX0ZJTEVTCiAgICAgICAgICAgIC0tIEhhbmRsZSB0byBzdGFuZGFyZCBmaWxlIHNldHVwCiAgICAgICAgb25jZQogICAgICAgICAgICBjcmVhdGUgUmVzdWx0CiAgICAgICAgICAgIFJlc3VsdC5zZXRfb3V0cHV0X2RlZmF1bHQKICAgICAgICBlbnN1cmUKICAgICAgICAgICAgaW9fbm90X3ZvaWQ6IFJlc3VsdCAvPSBWb2lkCiAgICAgICAgZW5kCgogICAgb3V0OiBTVFJJTkcKICAgICAgICAgICAgLS0gTmV3IHN0cmluZyBjb250YWluaW5nIHRlcnNlIHByaW50YWJsZSByZXByZXNlbnRhdGlvbgogICAgICAgICAgICAtLSBvZiBjdXJyZW50IG9iamVjdAogICAgICAgIGRvCiAgICAgICAgICAgIFJlc3VsdCA6PSB0YWdnZWRfb3V0CiAgICAgICAgZW5zdXJlCiAgICAgICAgICAgIG91dF9ub3Rfdm9pZDogUmVzdWx0IC89IFZvaWQKICAgICAgICBlbmQKCiAgICBmcm96ZW4gdGFnZ2VkX291dDogU1RSSU5HCiAgICAgICAgICAgIC0tIE5ldyBzdHJpbmcgY29udGFpbmluZyB0ZXJzZSBwcmludGFibGUgcmVwcmVzZW50YXRpb24KICAgICAgICAgICAgLS0gb2YgY3VycmVudCBvYmplY3QKICAgICAgICBleHRlcm5hbAogICAgICAgICAgICAiYnVpbHRfaW4iCiAgICAgICAgZW5zdXJlCiAgICAgICAgICAgIHRhZ2dlZF9vdXRfbm90X3ZvaWQ6IFJlc3VsdCAvPSBWb2lkCiAgICAgICAgZW5kCgogICAgcHJpbnQgKG86IGRldGFjaGFibGUgQU5ZKQogICAgICAgICAgICAtLSBXcml0ZSB0ZXJzZSBleHRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiBgbycKICAgICAgICAgICAgLS0gb24gc3RhbmRhcmQgb3V0cHV0LgogICAgICAgIGRvCiAgICAgICAgICAgIGlmIG8gLz0gVm9pZCB0aGVuCiAgICAgICAgICAgICAgICBpby5wdXRfc3RyaW5nIChvLm91dCkKICAgICAgICAgICAgZW5kCiAgICAgICAgZW5kCgpmZWF0dXJlIC0tIFBsYXRmb3JtCgogICAgT3BlcmF0aW5nX2Vudmlyb25tZW50OiBPUEVSQVRJTkdfRU5WSVJPTk1FTlQKICAgICAgICAgICAgLS0gT2JqZWN0cyBhdmFpbGFibGUgZnJvbSB0aGUgb3BlcmF0aW5nIHN5c3RlbQogICAgICAgIG9uY2UKICAgICAgICAgICAgY3JlYXRlIFJlc3VsdAogICAgICAgIGVuc3VyZQogICAgICAgICAgICBvcGVyYXRpbmdfZW52aXJvbm1lbnRfbm90X3ZvaWQ6IFJlc3VsdCAvPSBWb2lkCiAgICAgICAgZW5kCgpmZWF0dXJlIHtOT05FfSAtLSBJbml0aWFsaXphdGlvbgoKICAgIGRlZmF1bHRfY3JlYXRlCiAgICAgICAgICAgIC0tIFByb2Nlc3MgaW5zdGFuY2VzIG9mIGNsYXNzZXMgd2l0aCBubyBjcmVhdGlvbiBjbGF1c2UuCiAgICAgICAgICAgIC0tIChEZWZhdWx0OiBkbyBub3RoaW5nLikKICAgICAgICBkbwogICAgICAgIGVuZAoKZmVhdHVyZSAtLSBCYXNpYyBvcGVyYXRpb25zCgogICAgZGVmYXVsdF9yZXNjdWUKICAgICAgICAgICAgLS0gUHJvY2VzcyBleGNlcHRpb24gZm9yIHJvdXRpbmVzIHdpdGggbm8gUmVzY3VlIGNsYXVzZS4KICAgICAgICAgICAgLS0gKERlZmF1bHQ6IGRvIG5vdGhpbmcuKQogICAgICAgIGRvCiAgICAgICAgZW5kCgogICAgZnJvemVuIGRvX25vdGhpbmcKICAgICAgICAgICAgLS0gRXhlY3V0ZSBhIG51bGwgYWN0aW9uLgogICAgICAgIGRvCiAgICAgICAgZW5kCgogICAgZnJvemVuIGRlZmF1bHQ6IGRldGFjaGFibGUgbGlrZSBDdXJyZW50CiAgICAgICAgICAgIC0tIERlZmF1bHQgdmFsdWUgb2Ygb2JqZWN0J3MgdHlwZQogICAgICAgIGRvCiAgICAgICAgZW5kCgogICAgZnJvemVuIGRlZmF1bHRfcG9pbnRlcjogUE9JTlRFUgogICAgICAgICAgICAtLSBEZWZhdWx0IHZhbHVlIG9mIHR5cGUgYFBPSU5URVInCiAgICAgICAgICAgIC0tIChBdm9pZCB0aGUgbmVlZCB0byB3cml0ZSBgcCcuYGRlZmF1bHQnIGZvcgogICAgICAgICAgICAtLSBzb21lIGBwJyBvZiB0eXBlIGBQT0lOVEVSJy4pCiAgICAgICAgZG8KICAgICAgICBlbnN1cmUKICAgICAgICAgICAgLS0gUmVzdWx0ID0gUmVzdWx0LmRlZmF1bHQKICAgICAgICBlbmQKCiAgICBmcm96ZW4gYXNfYXR0YWNoZWQ6IGF0dGFjaGVkIGxpa2UgQ3VycmVudAogICAgICAgICAgICAtLSBBdHRhY2hlZCB2ZXJzaW9uIG9mIEN1cnJlbnQKICAgICAgICAgICAgLS0gKENhbiBiZSB1c2VkIGR1cmluZyB0cmFuc2l0aW9uYWwgcGVyaW9kIHRvIGNvbnZlcnQKICAgICAgICAgICAgLS0gbm9uLXZvaWQtc2FmZSBjbGFzc2VzIHRvIHZvaWQtc2FmZSBvbmVzLikKICAgICAgICBkbwogICAgICAgICAgICBSZXN1bHQgOj0gQ3VycmVudAogICAgICAgIGVuZAoKaW52YXJpYW50CiAgICByZWZsZXhpdmVfZXF1YWxpdHk6IHN0YW5kYXJkX2lzX2VxdWFsIChDdXJyZW50KQogICAgcmVmbGV4aXZlX2NvbmZvcm1hbmNlOiBjb25mb3Jtc190byAoQ3VycmVudCkKCm5vdGUKICAgIGNvcHlyaWdodDogIkNvcHlyaWdodCAoYykgMTk4NC0yMDEyLCBFaWZmZWwgU29mdHdhcmUgYW5kIG90aGVycyIKICAgIGxpY2Vuc2U6ICAgIkVpZmZlbCBGb3J1bSBMaWNlbnNlIHYyIChzZWUgaHR0cDovL3d3dy5laWZmZWwuY29tL2xpY2Vuc2luZy9mb3J1bS50eHQpIgogICAgc291cmNlOiAiWwogICAgICAgICAgICBFaWZmZWwgU29mdHdhcmUKICAgICAgICAgICAgNTk0OSBIb2xsaXN0ZXIgQXZlLiwgR29sZXRhLCBDQSA5MzExNyBVU0EKICAgICAgICAgICAgVGVsZXBob25lIDgwNS02ODUtMTAwNiwgRmF4IDgwNS02ODUtNjg2OQogICAgICAgICAgICBXZWJzaXRlIGh0dHA6Ly93d3cuZWlmZmVsLmNvbQogICAgICAgICAgICBDdXN0b21lciBzdXBwb3J0IGh0dHA6Ly9zdXBwb3J0LmVpZmZlbC5jb20KICAgICAgICBdIgoKZW5kCgo8L3RleHRhcmVhPjwvZm9ybT4KICAgIDxzY3JpcHQ+CiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICAgICAgbW9kZTogInRleHQveC1laWZmZWwiLAogICAgICAgIGluZGVudFVuaXQ6IDQsCiAgICAgICAgbGluZU51bWJlcnM6IHRydWUsCiAgICAgICAgdGhlbWU6ICJuZWF0IgogICAgICB9KTsKICAgIDwvc2NyaXB0PgoKICAgIDxwPjxzdHJvbmc+TUlNRSB0eXBlcyBkZWZpbmVkOjwvc3Ryb25nPiA8Y29kZT50ZXh0L3gtZWlmZmVsPC9jb2RlPi48L3A+CiAKIDxwPiBDcmVhdGVkIGJ5IDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS95bmgiPllOSDwvYT4uPC9wPgogIDwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/erlang/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/erlang/erlang.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovKmpzaGludCB1bnVzZWQ6dHJ1ZSwgZXFudWxsOnRydWUsIGN1cmx5OnRydWUsIGJpdHdpc2U6dHJ1ZSAqLwovKmpzaGludCB1bmRlZjp0cnVlLCBsYXRlZGVmOnRydWUsIHRyYWlsaW5nOnRydWUgKi8KLypnbG9iYWwgQ29kZU1pcnJvcjp0cnVlICovCgovLyBlcmxhbmcgbW9kZS4KLy8gdG9rZW5pemVyIC0+IHRva2VuIHR5cGVzIC0+IENvZGVNaXJyb3Igc3R5bGVzCi8vIHRva2VuaXplciBtYWludGFpbnMgYSBwYXJzZSBzdGFjawovLyBpbmRlbnRlciB1c2VzIHRoZSBwYXJzZSBzdGFjawoKLy8gVE9ETyBpbmRlbnRlcjoKLy8gICBiaXQgc3ludGF4Ci8vICAgb2xkIGd1YXJkL2JpZi9jb252ZXJzaW9uIGNsYXNoZXMgKGUuZy4gImZsb2F0LzEiKQovLyAgIHR5cGUvc3BlYy9vcGFxdWUKCihmdW5jdGlvbihtb2QpIHsKICBpZiAodHlwZW9mIGV4cG9ydHMgPT0gIm9iamVjdCIgJiYgdHlwZW9mIG1vZHVsZSA9PSAib2JqZWN0IikgLy8gQ29tbW9uSlMKICAgIG1vZChyZXF1aXJlKCIuLi8uLi9saWIvY29kZW1pcnJvciIpKTsKICBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCkgLy8gQU1ECiAgICBkZWZpbmUoWyIuLi8uLi9saWIvY29kZW1pcnJvciJdLCBtb2QpOwogIGVsc2UgLy8gUGxhaW4gYnJvd3NlciBlbnYKICAgIG1vZChDb2RlTWlycm9yKTsKfSkoZnVuY3Rpb24oQ29kZU1pcnJvcikgewoidXNlIHN0cmljdCI7CgpDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveC1lcmxhbmciLCAiZXJsYW5nIik7CgpDb2RlTWlycm9yLmRlZmluZU1vZGUoImVybGFuZyIsIGZ1bmN0aW9uKGNtQ2ZnKSB7CiAgInVzZSBzdHJpY3QiOwoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8gY29uc3RhbnRzCgogIHZhciB0eXBlV29yZHMgPSBbCiAgICAiLXR5cGUiLCAiLXNwZWMiLCAiLWV4cG9ydF90eXBlIiwgIi1vcGFxdWUiXTsKCiAgdmFyIGtleXdvcmRXb3JkcyA9IFsKICAgICJhZnRlciIsImJlZ2luIiwiY2F0Y2giLCJjYXNlIiwiY29uZCIsImVuZCIsImZ1biIsImlmIiwKICAgICJsZXQiLCJvZiIsInF1ZXJ5IiwicmVjZWl2ZSIsInRyeSIsIndoZW4iXTsKCiAgdmFyIHNlcGFyYXRvclJFICAgID0gL1tcLT4sO10vOwogIHZhciBzZXBhcmF0b3JXb3JkcyA9IFsKICAgICItPiIsIjsiLCIsIl07CgogIHZhciBvcGVyYXRvckF0b21Xb3JkcyA9IFsKICAgICJhbmQiLCJhbmRhbHNvIiwiYmFuZCIsImJub3QiLCJib3IiLCJic2wiLCJic3IiLCJieG9yIiwKICAgICJkaXYiLCJub3QiLCJvciIsIm9yZWxzZSIsInJlbSIsInhvciJdOwoKICB2YXIgb3BlcmF0b3JTeW1ib2xSRSAgICA9IC9bXCtcLVwqXC88Pj1cfDohXS87CiAgdmFyIG9wZXJhdG9yU3ltYm9sV29yZHMgPSBbCiAgICAiPSIsIisiLCItIiwiKiIsIi8iLCI+IiwiPj0iLCI8IiwiPTwiLCI9Oj0iLCI9PSIsIj0vPSIsIi89IiwifHwiLCI8LSIsIiEiXTsKCiAgdmFyIG9wZW5QYXJlblJFICAgID0gL1s8XChcW1x7XS87CiAgdmFyIG9wZW5QYXJlbldvcmRzID0gWwogICAgIjw8IiwiKCIsIlsiLCJ7Il07CgogIHZhciBjbG9zZVBhcmVuUkUgICAgPSAvWz5cKVxdXH1dLzsKICB2YXIgY2xvc2VQYXJlbldvcmRzID0gWwogICAgIn0iLCJdIiwiKSIsIj4+Il07CgogIHZhciBndWFyZFdvcmRzID0gWwogICAgImlzX2F0b20iLCJpc19iaW5hcnkiLCJpc19iaXRzdHJpbmciLCJpc19ib29sZWFuIiwiaXNfZmxvYXQiLAogICAgImlzX2Z1bmN0aW9uIiwiaXNfaW50ZWdlciIsImlzX2xpc3QiLCJpc19udW1iZXIiLCJpc19waWQiLAogICAgImlzX3BvcnQiLCJpc19yZWNvcmQiLCJpc19yZWZlcmVuY2UiLCJpc190dXBsZSIsCiAgICAiYXRvbSIsImJpbmFyeSIsImJpdHN0cmluZyIsImJvb2xlYW4iLCJmdW5jdGlvbiIsImludGVnZXIiLCJsaXN0IiwKICAgICJudW1iZXIiLCJwaWQiLCJwb3J0IiwicmVjb3JkIiwicmVmZXJlbmNlIiwidHVwbGUiXTsKCiAgdmFyIGJpZldvcmRzID0gWwogICAgImFicyIsImFkbGVyMzIiLCJhZGxlcjMyX2NvbWJpbmUiLCJhbGl2ZSIsImFwcGx5IiwiYXRvbV90b19iaW5hcnkiLAogICAgImF0b21fdG9fbGlzdCIsImJpbmFyeV90b19hdG9tIiwiYmluYXJ5X3RvX2V4aXN0aW5nX2F0b20iLAogICAgImJpbmFyeV90b19saXN0IiwiYmluYXJ5X3RvX3Rlcm0iLCJiaXRfc2l6ZSIsImJpdHN0cmluZ190b19saXN0IiwKICAgICJieXRlX3NpemUiLCJjaGVja19wcm9jZXNzX2NvZGUiLCJjb250YWN0X2JpbmFyeSIsImNyYzMyIiwKICAgICJjcmMzMl9jb21iaW5lIiwiZGF0ZSIsImRlY29kZV9wYWNrZXQiLCJkZWxldGVfbW9kdWxlIiwKICAgICJkaXNjb25uZWN0X25vZGUiLCJlbGVtZW50IiwiZXJhc2UiLCJleGl0IiwiZmxvYXQiLCJmbG9hdF90b19saXN0IiwKICAgICJnYXJiYWdlX2NvbGxlY3QiLCJnZXQiLCJnZXRfa2V5cyIsImdyb3VwX2xlYWRlciIsImhhbHQiLCJoZCIsCiAgICAiaW50ZWdlcl90b19saXN0IiwiaW50ZXJuYWxfYmlmIiwiaW9saXN0X3NpemUiLCJpb2xpc3RfdG9fYmluYXJ5IiwKICAgICJpc19hbGl2ZSIsImlzX2F0b20iLCJpc19iaW5hcnkiLCJpc19iaXRzdHJpbmciLCJpc19ib29sZWFuIiwKICAgICJpc19mbG9hdCIsImlzX2Z1bmN0aW9uIiwiaXNfaW50ZWdlciIsImlzX2xpc3QiLCJpc19udW1iZXIiLCJpc19waWQiLAogICAgImlzX3BvcnQiLCJpc19wcm9jZXNzX2FsaXZlIiwiaXNfcmVjb3JkIiwiaXNfcmVmZXJlbmNlIiwiaXNfdHVwbGUiLAogICAgImxlbmd0aCIsImxpbmsiLCJsaXN0X3RvX2F0b20iLCJsaXN0X3RvX2JpbmFyeSIsImxpc3RfdG9fYml0c3RyaW5nIiwKICAgICJsaXN0X3RvX2V4aXN0aW5nX2F0b20iLCJsaXN0X3RvX2Zsb2F0IiwibGlzdF90b19pbnRlZ2VyIiwKICAgICJsaXN0X3RvX3BpZCIsImxpc3RfdG9fdHVwbGUiLCJsb2FkX21vZHVsZSIsIm1ha2VfcmVmIiwibW9kdWxlX2xvYWRlZCIsCiAgICAibW9uaXRvcl9ub2RlIiwibm9kZSIsIm5vZGVfbGluayIsIm5vZGVfdW5saW5rIiwibm9kZXMiLCJub3RhbGl2ZSIsCiAgICAibm93Iiwib3Blbl9wb3J0IiwicGlkX3RvX2xpc3QiLCJwb3J0X2Nsb3NlIiwicG9ydF9jb21tYW5kIiwKICAgICJwb3J0X2Nvbm5lY3QiLCJwb3J0X2NvbnRyb2wiLCJwcmVfbG9hZGVkIiwicHJvY2Vzc19mbGFnIiwKICAgICJwcm9jZXNzX2luZm8iLCJwcm9jZXNzZXMiLCJwdXJnZV9tb2R1bGUiLCJwdXQiLCJyZWdpc3RlciIsCiAgICAicmVnaXN0ZXJlZCIsInJvdW5kIiwic2VsZiIsInNldGVsZW1lbnQiLCJzaXplIiwic3Bhd24iLCJzcGF3bl9saW5rIiwKICAgICJzcGF3bl9tb25pdG9yIiwic3Bhd25fb3B0Iiwic3BsaXRfYmluYXJ5Iiwic3RhdGlzdGljcyIsCiAgICAidGVybV90b19iaW5hcnkiLCJ0aW1lIiwidGhyb3ciLCJ0bCIsInRydW5jIiwidHVwbGVfc2l6ZSIsCiAgICAidHVwbGVfdG9fbGlzdCIsInVubGluayIsInVucmVnaXN0ZXIiLCJ3aGVyZWlzIl07CgovLyB1cHBlciBjYXNlOiBbQS1aXSBbw5gtw55dIFvDgC3Dll0KLy8gbG93ZXIgY2FzZTogW2Etel0gW8OfLcO2XSBbw7gtw79dCiAgdmFyIGFudW1SRSAgICAgICA9IC9bXHdAw5gtw57DgC3DlsOfLcO2w7gtw79dLzsKICB2YXIgZXNjYXBlc1JFICAgID0KICAgIC9bMC03XXsxLDN9fFtiZGVmbnJzdHZcXCInXXxcXlthLXpBLVpdfHhbMC05YS16QS1aXXsyfXx4e1swLTlhLXpBLVpdK30vOwoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8gdG9rZW5pemVyCgogIGZ1bmN0aW9uIHRva2VuaXplcihzdHJlYW0sc3RhdGUpIHsKICAgIC8vIGluIG11bHRpLWxpbmUgc3RyaW5nCiAgICBpZiAoc3RhdGUuaW5fc3RyaW5nKSB7CiAgICAgIHN0YXRlLmluX3N0cmluZyA9ICghZG91YmxlUXVvdGUoc3RyZWFtKSk7CiAgICAgIHJldHVybiBydmFsKHN0YXRlLHN0cmVhbSwic3RyaW5nIik7CiAgICB9CgogICAgLy8gaW4gbXVsdGktbGluZSBhdG9tCiAgICBpZiAoc3RhdGUuaW5fYXRvbSkgewogICAgICBzdGF0ZS5pbl9hdG9tID0gKCFzaW5nbGVRdW90ZShzdHJlYW0pKTsKICAgICAgcmV0dXJuIHJ2YWwoc3RhdGUsc3RyZWFtLCJhdG9tIik7CiAgICB9CgogICAgLy8gd2hpdGVzcGFjZQogICAgaWYgKHN0cmVhbS5lYXRTcGFjZSgpKSB7CiAgICAgIHJldHVybiBydmFsKHN0YXRlLHN0cmVhbSwid2hpdGVzcGFjZSIpOwogICAgfQoKICAgIC8vIGF0dHJpYnV0ZXMgYW5kIHR5cGUgc3BlY3MKICAgIGlmICghcGVla1Rva2VuKHN0YXRlKSAmJgogICAgICAgIHN0cmVhbS5tYXRjaCgvLVxzKlthLXrDny3DtsO4LcO/XVtcd8OYLcOew4Atw5bDny3DtsO4LcO/XSovKSkgewogICAgICBpZiAoaXNfbWVtYmVyKHN0cmVhbS5jdXJyZW50KCksdHlwZVdvcmRzKSkgewogICAgICAgIHJldHVybiBydmFsKHN0YXRlLHN0cmVhbSwidHlwZSIpOwogICAgICB9ZWxzZXsKICAgICAgICByZXR1cm4gcnZhbChzdGF0ZSxzdHJlYW0sImF0dHJpYnV0ZSIpOwogICAgICB9CiAgICB9CgogICAgdmFyIGNoID0gc3RyZWFtLm5leHQoKTsKCiAgICAvLyBjb21tZW50CiAgICBpZiAoY2ggPT0gJyUnKSB7CiAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgcmV0dXJuIHJ2YWwoc3RhdGUsc3RyZWFtLCJjb21tZW50Iik7CiAgICB9CgogICAgLy8gY29sb24KICAgIGlmIChjaCA9PSAiOiIpIHsKICAgICAgcmV0dXJuIHJ2YWwoc3RhdGUsc3RyZWFtLCJjb2xvbiIpOwogICAgfQoKICAgIC8vIG1hY3JvCiAgICBpZiAoY2ggPT0gJz8nKSB7CiAgICAgIHN0cmVhbS5lYXRTcGFjZSgpOwogICAgICBzdHJlYW0uZWF0V2hpbGUoYW51bVJFKTsKICAgICAgcmV0dXJuIHJ2YWwoc3RhdGUsc3RyZWFtLCJtYWNybyIpOwogICAgfQoKICAgIC8vIHJlY29yZAogICAgaWYgKGNoID09ICIjIikgewogICAgICBzdHJlYW0uZWF0U3BhY2UoKTsKICAgICAgc3RyZWFtLmVhdFdoaWxlKGFudW1SRSk7CiAgICAgIHJldHVybiBydmFsKHN0YXRlLHN0cmVhbSwicmVjb3JkIik7CiAgICB9CgogICAgLy8gZG9sbGFyIGVzY2FwZQogICAgaWYgKGNoID09ICIkIikgewogICAgICBpZiAoc3RyZWFtLm5leHQoKSA9PSAiXFwiICYmICFzdHJlYW0ubWF0Y2goZXNjYXBlc1JFKSkgewogICAgICAgIHJldHVybiBydmFsKHN0YXRlLHN0cmVhbSwiZXJyb3IiKTsKICAgICAgfQogICAgICByZXR1cm4gcnZhbChzdGF0ZSxzdHJlYW0sIm51bWJlciIpOwogICAgfQoKICAgIC8vIGRvdAogICAgaWYgKGNoID09ICIuIikgewogICAgICByZXR1cm4gcnZhbChzdGF0ZSxzdHJlYW0sImRvdCIpOwogICAgfQoKICAgIC8vIHF1b3RlZCBhdG9tCiAgICBpZiAoY2ggPT0gJ1wnJykgewogICAgICBpZiAoIShzdGF0ZS5pbl9hdG9tID0gKCFzaW5nbGVRdW90ZShzdHJlYW0pKSkpIHsKICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKC9ccypcL1xzKlswLTldLyxmYWxzZSkpIHsKICAgICAgICAgIHN0cmVhbS5tYXRjaCgvXHMqXC9ccypbMC05XS8sdHJ1ZSk7CiAgICAgICAgICByZXR1cm4gcnZhbChzdGF0ZSxzdHJlYW0sImZ1biIpOyAgICAgIC8vICdmJy8wIHN0eWxlIGZ1bgogICAgICAgIH0KICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKC9ccypcKC8sZmFsc2UpIHx8IHN0cmVhbS5tYXRjaCgvXHMqOi8sZmFsc2UpKSB7CiAgICAgICAgICByZXR1cm4gcnZhbChzdGF0ZSxzdHJlYW0sImZ1bmN0aW9uIik7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBydmFsKHN0YXRlLHN0cmVhbSwiYXRvbSIpOwogICAgfQoKICAgIC8vIHN0cmluZwogICAgaWYgKGNoID09ICciJykgewogICAgICBzdGF0ZS5pbl9zdHJpbmcgPSAoIWRvdWJsZVF1b3RlKHN0cmVhbSkpOwogICAgICByZXR1cm4gcnZhbChzdGF0ZSxzdHJlYW0sInN0cmluZyIpOwogICAgfQoKICAgIC8vIHZhcmlhYmxlCiAgICBpZiAoL1tBLVpfw5gtw57DgC3Dll0vLnRlc3QoY2gpKSB7CiAgICAgIHN0cmVhbS5lYXRXaGlsZShhbnVtUkUpOwogICAgICByZXR1cm4gcnZhbChzdGF0ZSxzdHJlYW0sInZhcmlhYmxlIik7CiAgICB9CgogICAgLy8gYXRvbS9rZXl3b3JkL0JJRi9mdW5jdGlvbgogICAgaWYgKC9bYS16X8OfLcO2w7gtw79dLy50ZXN0KGNoKSkgewogICAgICBzdHJlYW0uZWF0V2hpbGUoYW51bVJFKTsKCiAgICAgIGlmIChzdHJlYW0ubWF0Y2goL1xzKlwvXHMqWzAtOV0vLGZhbHNlKSkgewogICAgICAgIHN0cmVhbS5tYXRjaCgvXHMqXC9ccypbMC05XS8sdHJ1ZSk7CiAgICAgICAgcmV0dXJuIHJ2YWwoc3RhdGUsc3RyZWFtLCJmdW4iKTsgICAgICAvLyBmLzAgc3R5bGUgZnVuCiAgICAgIH0KCiAgICAgIHZhciB3ID0gc3RyZWFtLmN1cnJlbnQoKTsKCiAgICAgIGlmIChpc19tZW1iZXIodyxrZXl3b3JkV29yZHMpKSB7CiAgICAgICAgcmV0dXJuIHJ2YWwoc3RhdGUsc3RyZWFtLCJrZXl3b3JkIik7CiAgICAgIH1lbHNlIGlmIChpc19tZW1iZXIodyxvcGVyYXRvckF0b21Xb3JkcykpIHsKICAgICAgICByZXR1cm4gcnZhbChzdGF0ZSxzdHJlYW0sIm9wZXJhdG9yIik7CiAgICAgIH1lbHNlIGlmIChzdHJlYW0ubWF0Y2goL1xzKlwoLyxmYWxzZSkpIHsKICAgICAgICAvLyAncHV0JyBhbmQgJ2VybGFuZzpwdXQnIGFyZSBiaWZzLCAnZm9vOnB1dCcgaXMgbm90CiAgICAgICAgaWYgKGlzX21lbWJlcih3LGJpZldvcmRzKSAmJgogICAgICAgICAgICAoKHBlZWtUb2tlbihzdGF0ZSkudG9rZW4gIT0gIjoiKSB8fAogICAgICAgICAgICAgKHBlZWtUb2tlbihzdGF0ZSwyKS50b2tlbiA9PSAiZXJsYW5nIikpKSB7CiAgICAgICAgICByZXR1cm4gcnZhbChzdGF0ZSxzdHJlYW0sImJ1aWx0aW4iKTsKICAgICAgICB9ZWxzZSBpZiAoaXNfbWVtYmVyKHcsZ3VhcmRXb3JkcykpIHsKICAgICAgICAgIHJldHVybiBydmFsKHN0YXRlLHN0cmVhbSwiZ3VhcmQiKTsKICAgICAgICB9ZWxzZXsKICAgICAgICAgIHJldHVybiBydmFsKHN0YXRlLHN0cmVhbSwiZnVuY3Rpb24iKTsKICAgICAgICB9CiAgICAgIH1lbHNlIGlmIChpc19tZW1iZXIodyxvcGVyYXRvckF0b21Xb3JkcykpIHsKICAgICAgICByZXR1cm4gcnZhbChzdGF0ZSxzdHJlYW0sIm9wZXJhdG9yIik7CiAgICAgIH1lbHNlIGlmIChsb29rYWhlYWQoc3RyZWFtKSA9PSAiOiIpIHsKICAgICAgICBpZiAodyA9PSAiZXJsYW5nIikgewogICAgICAgICAgcmV0dXJuIHJ2YWwoc3RhdGUsc3RyZWFtLCJidWlsdGluIik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBydmFsKHN0YXRlLHN0cmVhbSwiZnVuY3Rpb24iKTsKICAgICAgICB9CiAgICAgIH1lbHNlIGlmIChpc19tZW1iZXIodyxbInRydWUiLCJmYWxzZSJdKSkgewogICAgICAgIHJldHVybiBydmFsKHN0YXRlLHN0cmVhbSwiYm9vbGVhbiIpOwogICAgICB9ZWxzZSBpZiAoaXNfbWVtYmVyKHcsWyJ0cnVlIiwiZmFsc2UiXSkpIHsKICAgICAgICByZXR1cm4gcnZhbChzdGF0ZSxzdHJlYW0sImJvb2xlYW4iKTsKICAgICAgfWVsc2V7CiAgICAgICAgcmV0dXJuIHJ2YWwoc3RhdGUsc3RyZWFtLCJhdG9tIik7CiAgICAgIH0KICAgIH0KCiAgICAvLyBudW1iZXIKICAgIHZhciBkaWdpdFJFICAgICAgPSAvWzAtOV0vOwogICAgdmFyIHJhZGl4UkUgICAgICA9IC9bMC05YS16QS1aXS87ICAgICAgICAgLy8gMzYjelogc3R5bGUgaW50CiAgICBpZiAoZGlnaXRSRS50ZXN0KGNoKSkgewogICAgICBzdHJlYW0uZWF0V2hpbGUoZGlnaXRSRSk7CiAgICAgIGlmIChzdHJlYW0uZWF0KCcjJykpIHsgICAgICAgICAgICAgICAgLy8gMzYjYVogIHN0eWxlIGludGVnZXIKICAgICAgICBpZiAoIXN0cmVhbS5lYXRXaGlsZShyYWRpeFJFKSkgewogICAgICAgICAgc3RyZWFtLmJhY2tVcCgxKTsgICAgICAgICAgICAgICAgIC8vIjM2IyIgLSBzeW50YXggZXJyb3IKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLmVhdCgnLicpKSB7ICAgICAgIC8vIGZsb2F0CiAgICAgICAgaWYgKCFzdHJlYW0uZWF0V2hpbGUoZGlnaXRSRSkpIHsKICAgICAgICAgIHN0cmVhbS5iYWNrVXAoMSk7ICAgICAgICAvLyAiMy4iIC0gcHJvYmFibHkgZW5kIG9mIGZ1bmN0aW9uCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmIChzdHJlYW0uZWF0KC9bZUVdLykpIHsgICAgICAgIC8vIGZsb2F0IHdpdGggZXhwb25lbnQKICAgICAgICAgICAgaWYgKHN0cmVhbS5lYXQoL1stK10vKSkgewogICAgICAgICAgICAgIGlmICghc3RyZWFtLmVhdFdoaWxlKGRpZ2l0UkUpKSB7CiAgICAgICAgICAgICAgICBzdHJlYW0uYmFja1VwKDIpOyAgICAgICAgICAgIC8vICIyZS0iIC0gc3ludGF4IGVycm9yCiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGlmICghc3RyZWFtLmVhdFdoaWxlKGRpZ2l0UkUpKSB7CiAgICAgICAgICAgICAgICBzdHJlYW0uYmFja1VwKDEpOyAgICAgICAgICAgIC8vICIyZSIgLSBzeW50YXggZXJyb3IKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHJ2YWwoc3RhdGUsc3RyZWFtLCJudW1iZXIiKTsgICAvLyBub3JtYWwgaW50ZWdlcgogICAgfQoKICAgIC8vIG9wZW4gcGFyZW5zCiAgICBpZiAobm9uZ3JlZWR5KHN0cmVhbSxvcGVuUGFyZW5SRSxvcGVuUGFyZW5Xb3JkcykpIHsKICAgICAgcmV0dXJuIHJ2YWwoc3RhdGUsc3RyZWFtLCJvcGVuX3BhcmVuIik7CiAgICB9CgogICAgLy8gY2xvc2UgcGFyZW5zCiAgICBpZiAobm9uZ3JlZWR5KHN0cmVhbSxjbG9zZVBhcmVuUkUsY2xvc2VQYXJlbldvcmRzKSkgewogICAgICByZXR1cm4gcnZhbChzdGF0ZSxzdHJlYW0sImNsb3NlX3BhcmVuIik7CiAgICB9CgogICAgLy8gc2VwYXJhdG9ycwogICAgaWYgKGdyZWVkeShzdHJlYW0sc2VwYXJhdG9yUkUsc2VwYXJhdG9yV29yZHMpKSB7CiAgICAgIHJldHVybiBydmFsKHN0YXRlLHN0cmVhbSwic2VwYXJhdG9yIik7CiAgICB9CgogICAgLy8gb3BlcmF0b3JzCiAgICBpZiAoZ3JlZWR5KHN0cmVhbSxvcGVyYXRvclN5bWJvbFJFLG9wZXJhdG9yU3ltYm9sV29yZHMpKSB7CiAgICAgIHJldHVybiBydmFsKHN0YXRlLHN0cmVhbSwib3BlcmF0b3IiKTsKICAgIH0KCiAgICByZXR1cm4gcnZhbChzdGF0ZSxzdHJlYW0sbnVsbCk7CiAgfQoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8gdXRpbGl0aWVzCiAgZnVuY3Rpb24gbm9uZ3JlZWR5KHN0cmVhbSxyZSx3b3JkcykgewogICAgaWYgKHN0cmVhbS5jdXJyZW50KCkubGVuZ3RoID09IDEgJiYgcmUudGVzdChzdHJlYW0uY3VycmVudCgpKSkgewogICAgICBzdHJlYW0uYmFja1VwKDEpOwogICAgICB3aGlsZSAocmUudGVzdChzdHJlYW0ucGVlaygpKSkgewogICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgaWYgKGlzX21lbWJlcihzdHJlYW0uY3VycmVudCgpLHdvcmRzKSkgewogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIHN0cmVhbS5iYWNrVXAoc3RyZWFtLmN1cnJlbnQoKS5sZW5ndGgtMSk7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBmdW5jdGlvbiBncmVlZHkoc3RyZWFtLHJlLHdvcmRzKSB7CiAgICBpZiAoc3RyZWFtLmN1cnJlbnQoKS5sZW5ndGggPT0gMSAmJiByZS50ZXN0KHN0cmVhbS5jdXJyZW50KCkpKSB7CiAgICAgIHdoaWxlIChyZS50ZXN0KHN0cmVhbS5wZWVrKCkpKSB7CiAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgfQogICAgICB3aGlsZSAoMCA8IHN0cmVhbS5jdXJyZW50KCkubGVuZ3RoKSB7CiAgICAgICAgaWYgKGlzX21lbWJlcihzdHJlYW0uY3VycmVudCgpLHdvcmRzKSkgewogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfWVsc2V7CiAgICAgICAgICBzdHJlYW0uYmFja1VwKDEpOwogICAgICAgIH0KICAgICAgfQogICAgICBzdHJlYW0ubmV4dCgpOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgZnVuY3Rpb24gZG91YmxlUXVvdGUoc3RyZWFtKSB7CiAgICByZXR1cm4gcXVvdGUoc3RyZWFtLCAnIicsICdcXCcpOwogIH0KCiAgZnVuY3Rpb24gc2luZ2xlUXVvdGUoc3RyZWFtKSB7CiAgICByZXR1cm4gcXVvdGUoc3RyZWFtLCdcJycsJ1xcJyk7CiAgfQoKICBmdW5jdGlvbiBxdW90ZShzdHJlYW0scXVvdGVDaGFyLGVzY2FwZUNoYXIpIHsKICAgIHdoaWxlICghc3RyZWFtLmVvbCgpKSB7CiAgICAgIHZhciBjaCA9IHN0cmVhbS5uZXh0KCk7CiAgICAgIGlmIChjaCA9PSBxdW90ZUNoYXIpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfWVsc2UgaWYgKGNoID09IGVzY2FwZUNoYXIpIHsKICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBmdW5jdGlvbiBsb29rYWhlYWQoc3RyZWFtKSB7CiAgICB2YXIgbSA9IHN0cmVhbS5tYXRjaCgvKFtcblxzXSt8JVteXG5dKlxuKSooLikvLGZhbHNlKTsKICAgIHJldHVybiBtID8gbS5wb3AoKSA6ICIiOwogIH0KCiAgZnVuY3Rpb24gaXNfbWVtYmVyKGVsZW1lbnQsbGlzdCkgewogICAgcmV0dXJuICgtMSA8IGxpc3QuaW5kZXhPZihlbGVtZW50KSk7CiAgfQoKICBmdW5jdGlvbiBydmFsKHN0YXRlLHN0cmVhbSx0eXBlKSB7CgogICAgLy8gcGFyc2Ugc3RhY2sKICAgIHB1c2hUb2tlbihzdGF0ZSxyZWFsVG9rZW4odHlwZSxzdHJlYW0pKTsKCiAgICAvLyBtYXAgZXJsYW5nIHRva2VuIHR5cGUgdG8gQ29kZU1pcnJvciBzdHlsZSBjbGFzcwogICAgLy8gICAgIGVybGFuZyAgICAgICAgICAgICAtPiBDb2RlTWlycm9yIHRhZwogICAgc3dpdGNoICh0eXBlKSB7CiAgICAgIGNhc2UgImF0b20iOiAgICAgICAgcmV0dXJuICJhdG9tIjsKICAgICAgY2FzZSAiYXR0cmlidXRlIjogICByZXR1cm4gImF0dHJpYnV0ZSI7CiAgICAgIGNhc2UgImJvb2xlYW4iOiAgICAgcmV0dXJuICJhdG9tIjsKICAgICAgY2FzZSAiYnVpbHRpbiI6ICAgICByZXR1cm4gImJ1aWx0aW4iOwogICAgICBjYXNlICJjbG9zZV9wYXJlbiI6IHJldHVybiBudWxsOwogICAgICBjYXNlICJjb2xvbiI6ICAgICAgIHJldHVybiBudWxsOwogICAgICBjYXNlICJjb21tZW50IjogICAgIHJldHVybiAiY29tbWVudCI7CiAgICAgIGNhc2UgImRvdCI6ICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIGNhc2UgImVycm9yIjogICAgICAgcmV0dXJuICJlcnJvciI7CiAgICAgIGNhc2UgImZ1biI6ICAgICAgICAgcmV0dXJuICJtZXRhIjsKICAgICAgY2FzZSAiZnVuY3Rpb24iOiAgICByZXR1cm4gInRhZyI7CiAgICAgIGNhc2UgImd1YXJkIjogICAgICAgcmV0dXJuICJwcm9wZXJ0eSI7CiAgICAgIGNhc2UgImtleXdvcmQiOiAgICAgcmV0dXJuICJrZXl3b3JkIjsKICAgICAgY2FzZSAibWFjcm8iOiAgICAgICByZXR1cm4gInZhcmlhYmxlLTIiOwogICAgICBjYXNlICJudW1iZXIiOiAgICAgIHJldHVybiAibnVtYmVyIjsKICAgICAgY2FzZSAib3Blbl9wYXJlbiI6ICByZXR1cm4gbnVsbDsKICAgICAgY2FzZSAib3BlcmF0b3IiOiAgICByZXR1cm4gIm9wZXJhdG9yIjsKICAgICAgY2FzZSAicmVjb3JkIjogICAgICByZXR1cm4gImJyYWNrZXQiOwogICAgICBjYXNlICJzZXBhcmF0b3IiOiAgIHJldHVybiBudWxsOwogICAgICBjYXNlICJzdHJpbmciOiAgICAgIHJldHVybiAic3RyaW5nIjsKICAgICAgY2FzZSAidHlwZSI6ICAgICAgICByZXR1cm4gImRlZiI7CiAgICAgIGNhc2UgInZhcmlhYmxlIjogICAgcmV0dXJuICJ2YXJpYWJsZSI7CiAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBhVG9rZW4odG9rLGNvbCxpbmQsdHlwKSB7CiAgICByZXR1cm4ge3Rva2VuOiAgdG9rLAogICAgICAgICAgICBjb2x1bW46IGNvbCwKICAgICAgICAgICAgaW5kZW50OiBpbmQsCiAgICAgICAgICAgIHR5cGU6ICAgdHlwfTsKICB9CgogIGZ1bmN0aW9uIHJlYWxUb2tlbih0eXBlLHN0cmVhbSkgewogICAgcmV0dXJuIGFUb2tlbihzdHJlYW0uY3VycmVudCgpLAogICAgICAgICAgICAgICAgIHN0cmVhbS5jb2x1bW4oKSwKICAgICAgICAgICAgICAgICBzdHJlYW0uaW5kZW50YXRpb24oKSwKICAgICAgICAgICAgICAgICB0eXBlKTsKICB9CgogIGZ1bmN0aW9uIGZha2VUb2tlbih0eXBlKSB7CiAgICByZXR1cm4gYVRva2VuKHR5cGUsMCwwLHR5cGUpOwogIH0KCiAgZnVuY3Rpb24gcGVla1Rva2VuKHN0YXRlLGRlcHRoKSB7CiAgICB2YXIgbGVuID0gc3RhdGUudG9rZW5TdGFjay5sZW5ndGg7CiAgICB2YXIgZGVwID0gKGRlcHRoID8gZGVwdGggOiAxKTsKCiAgICBpZiAobGVuIDwgZGVwKSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH1lbHNlewogICAgICByZXR1cm4gc3RhdGUudG9rZW5TdGFja1tsZW4tZGVwXTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHB1c2hUb2tlbihzdGF0ZSx0b2tlbikgewoKICAgIGlmICghKHRva2VuLnR5cGUgPT0gImNvbW1lbnQiIHx8IHRva2VuLnR5cGUgPT0gIndoaXRlc3BhY2UiKSkgewogICAgICBzdGF0ZS50b2tlblN0YWNrID0gbWF5YmVfZHJvcF9wcmUoc3RhdGUudG9rZW5TdGFjayx0b2tlbik7CiAgICAgIHN0YXRlLnRva2VuU3RhY2sgPSBtYXliZV9kcm9wX3Bvc3Qoc3RhdGUudG9rZW5TdGFjayk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBtYXliZV9kcm9wX3ByZShzLHRva2VuKSB7CiAgICB2YXIgbGFzdCA9IHMubGVuZ3RoLTE7CgogICAgaWYgKDAgPCBsYXN0ICYmIHNbbGFzdF0udHlwZSA9PT0gInJlY29yZCIgJiYgdG9rZW4udHlwZSA9PT0gImRvdCIpIHsKICAgICAgcy5wb3AoKTsKICAgIH1lbHNlIGlmICgwIDwgbGFzdCAmJiBzW2xhc3RdLnR5cGUgPT09ICJncm91cCIpIHsKICAgICAgcy5wb3AoKTsKICAgICAgcy5wdXNoKHRva2VuKTsKICAgIH1lbHNlewogICAgICBzLnB1c2godG9rZW4pOwogICAgfQogICAgcmV0dXJuIHM7CiAgfQoKICBmdW5jdGlvbiBtYXliZV9kcm9wX3Bvc3QocykgewogICAgdmFyIGxhc3QgPSBzLmxlbmd0aC0xOwoKICAgIGlmIChzW2xhc3RdLnR5cGUgPT09ICJkb3QiKSB7CiAgICAgIHJldHVybiBbXTsKICAgIH0KICAgIGlmIChzW2xhc3RdLnR5cGUgPT09ICJmdW4iICYmIHNbbGFzdC0xXS50b2tlbiA9PT0gImZ1biIpIHsKICAgICAgcmV0dXJuIHMuc2xpY2UoMCxsYXN0LTEpOwogICAgfQogICAgc3dpdGNoIChzW3MubGVuZ3RoLTFdLnRva2VuKSB7CiAgICAgIGNhc2UgIn0iOiAgICByZXR1cm4gZChzLHtnOlsieyJdfSk7CiAgICAgIGNhc2UgIl0iOiAgICByZXR1cm4gZChzLHtpOlsiWyJdfSk7CiAgICAgIGNhc2UgIikiOiAgICByZXR1cm4gZChzLHtpOlsiKCJdfSk7CiAgICAgIGNhc2UgIj4+IjogICByZXR1cm4gZChzLHtpOlsiPDwiXX0pOwogICAgICBjYXNlICJlbmQiOiAgcmV0dXJuIGQocyx7aTpbImJlZ2luIiwiY2FzZSIsImZ1biIsImlmIiwicmVjZWl2ZSIsInRyeSJdfSk7CiAgICAgIGNhc2UgIiwiOiAgICByZXR1cm4gZChzLHtlOlsiYmVnaW4iLCJ0cnkiLCJ3aGVuIiwiLT4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwiLCIoIiwiWyIsInsiLCI8PCJdfSk7CiAgICAgIGNhc2UgIi0+IjogICByZXR1cm4gZChzLHtyOlsid2hlbiJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbTpbInRyeSIsImlmIiwiY2FzZSIsInJlY2VpdmUiXX0pOwogICAgICBjYXNlICI7IjogICAgcmV0dXJuIGQocyx7RTpbImNhc2UiLCJmdW4iLCJpZiIsInJlY2VpdmUiLCJ0cnkiLCJ3aGVuIl19KTsKICAgICAgY2FzZSAiY2F0Y2giOnJldHVybiBkKHMse2U6WyJ0cnkiXX0pOwogICAgICBjYXNlICJvZiI6ICAgcmV0dXJuIGQocyx7ZTpbImNhc2UiXX0pOwogICAgICBjYXNlICJhZnRlciI6cmV0dXJuIGQocyx7ZTpbInJlY2VpdmUiLCJ0cnkiXX0pOwogICAgICBkZWZhdWx0OiAgICAgcmV0dXJuIHM7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBkKHN0YWNrLHR0KSB7CiAgICAvLyBzdGFjayBpcyBhIHN0YWNrIG9mIFRva2VuIG9iamVjdHMuCiAgICAvLyB0dCBpcyBhbiBvYmplY3Q7IHt0eXBlOnRva2Vuc30KICAgIC8vIHR5cGUgaXMgYSBjaGFyLCB0b2tlbnMgaXMgYSBsaXN0IG9mIHRva2VuIHN0cmluZ3MuCiAgICAvLyBUaGUgZnVuY3Rpb24gcmV0dXJucyAocG9zc2libHkgdHJ1bmNhdGVkKSBzdGFjay4KICAgIC8vIEl0IHdpbGwgZGVzY2VuZCB0aGUgc3RhY2ssIGxvb2tpbmcgZm9yIGEgVG9rZW4gc3VjaCB0aGF0IFRva2VuLnRva2VuCiAgICAvLyAgaXMgYSBtZW1iZXIgb2YgdG9rZW5zLiBJZiBpdCBkb2VzIG5vdCBmaW5kIHRoYXQsIGl0IHdpbGwgbm9ybWFsbHkgKGJ1dAogICAgLy8gIHNlZSAiRSIgYmVsb3cpIHJldHVybiBzdGFjay4gSWYgaXQgZG9lcyBmaW5kIGEgbWF0Y2gsIGl0IHdpbGwgcmVtb3ZlCiAgICAvLyAgYWxsIHRoZSBUb2tlbnMgYmV0d2VlbiB0aGUgdG9wIGFuZCB0aGUgbWF0Y2hlZCBUb2tlbi4KICAgIC8vIElmIHR5cGUgaXMgIm0iLCB0aGF0IGlzIGFsbCBpdCBkb2VzLgogICAgLy8gSWYgdHlwZSBpcyAiaSIsIGl0IHdpbGwgYWxzbyByZW1vdmUgdGhlIG1hdGNoZWQgVG9rZW4gYW5kIHRoZSB0b3AgVG9rZW4uCiAgICAvLyBJZiB0eXBlIGlzICJnIiwgbGlrZSAiaSIsIGJ1dCBhZGQgYSBmYWtlICJncm91cCIgdG9rZW4gYXQgdGhlIHRvcC4KICAgIC8vIElmIHR5cGUgaXMgInIiLCBpdCB3aWxsIHJlbW92ZSB0aGUgbWF0Y2hlZCBUb2tlbiwgYnV0IG5vdCB0aGUgdG9wIFRva2VuLgogICAgLy8gSWYgdHlwZSBpcyAiZSIsIGl0IHdpbGwga2VlcCB0aGUgbWF0Y2hlZCBUb2tlbiBidXQgbm90IHRoZSB0b3AgVG9rZW4uCiAgICAvLyBJZiB0eXBlIGlzICJFIiwgaXQgYmVoYXZlcyBhcyBmb3IgdHlwZSAiZSIsIGV4Y2VwdCBpZiB0aGVyZSBpcyBubyBtYXRjaCwKICAgIC8vICBpbiB3aGljaCBjYXNlIGl0IHdpbGwgcmV0dXJuIGFuIGVtcHR5IHN0YWNrLgoKICAgIGZvciAodmFyIHR5cGUgaW4gdHQpIHsKICAgICAgdmFyIGxlbiA9IHN0YWNrLmxlbmd0aC0xOwogICAgICB2YXIgdG9rZW5zID0gdHRbdHlwZV07CiAgICAgIGZvciAodmFyIGkgPSBsZW4tMTsgLTEgPCBpIDsgaS0tKSB7CiAgICAgICAgaWYgKGlzX21lbWJlcihzdGFja1tpXS50b2tlbix0b2tlbnMpKSB7CiAgICAgICAgICB2YXIgc3MgPSBzdGFjay5zbGljZSgwLGkpOwogICAgICAgICAgc3dpdGNoICh0eXBlKSB7CiAgICAgICAgICAgICAgY2FzZSAibSI6IHJldHVybiBzcy5jb25jYXQoc3RhY2tbaV0pLmNvbmNhdChzdGFja1tsZW5dKTsKICAgICAgICAgICAgICBjYXNlICJyIjogcmV0dXJuIHNzLmNvbmNhdChzdGFja1tsZW5dKTsKICAgICAgICAgICAgICBjYXNlICJpIjogcmV0dXJuIHNzOwogICAgICAgICAgICAgIGNhc2UgImciOiByZXR1cm4gc3MuY29uY2F0KGZha2VUb2tlbigiZ3JvdXAiKSk7CiAgICAgICAgICAgICAgY2FzZSAiRSI6IHJldHVybiBzcy5jb25jYXQoc3RhY2tbaV0pOwogICAgICAgICAgICAgIGNhc2UgImUiOiByZXR1cm4gc3MuY29uY2F0KHN0YWNrW2ldKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiAodHlwZSA9PSAiRSIgPyBbXSA6IHN0YWNrKTsKICB9CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLyBpbmRlbnRlcgoKICBmdW5jdGlvbiBpbmRlbnRlcihzdGF0ZSx0ZXh0QWZ0ZXIpIHsKICAgIHZhciB0OwogICAgdmFyIHVuaXQgPSBjbUNmZy5pbmRlbnRVbml0OwogICAgdmFyIHdvcmRBZnRlciA9IHdvcmRhZnRlcih0ZXh0QWZ0ZXIpOwogICAgdmFyIGN1cnJUID0gcGVla1Rva2VuKHN0YXRlLDEpOwogICAgdmFyIHByZXZUID0gcGVla1Rva2VuKHN0YXRlLDIpOwoKICAgIGlmIChzdGF0ZS5pbl9zdHJpbmcgfHwgc3RhdGUuaW5fYXRvbSkgewogICAgICByZXR1cm4gQ29kZU1pcnJvci5QYXNzOwogICAgfWVsc2UgaWYgKCFwcmV2VCkgewogICAgICByZXR1cm4gMDsKICAgIH1lbHNlIGlmIChjdXJyVC50b2tlbiA9PSAid2hlbiIpIHsKICAgICAgcmV0dXJuIGN1cnJULmNvbHVtbit1bml0OwogICAgfWVsc2UgaWYgKHdvcmRBZnRlciA9PT0gIndoZW4iICYmIHByZXZULnR5cGUgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgcmV0dXJuIHByZXZULmluZGVudCt1bml0OwogICAgfWVsc2UgaWYgKHdvcmRBZnRlciA9PT0gIigiICYmIGN1cnJULnRva2VuID09PSAiZnVuIikgewogICAgICByZXR1cm4gIGN1cnJULmNvbHVtbiszOwogICAgfWVsc2UgaWYgKHdvcmRBZnRlciA9PT0gImNhdGNoIiAmJiAodCA9IGdldFRva2VuKHN0YXRlLFsidHJ5Il0pKSkgewogICAgICByZXR1cm4gdC5jb2x1bW47CiAgICB9ZWxzZSBpZiAoaXNfbWVtYmVyKHdvcmRBZnRlcixbImVuZCIsImFmdGVyIiwib2YiXSkpIHsKICAgICAgdCA9IGdldFRva2VuKHN0YXRlLFsiYmVnaW4iLCJjYXNlIiwiZnVuIiwiaWYiLCJyZWNlaXZlIiwidHJ5Il0pOwogICAgICByZXR1cm4gdCA/IHQuY29sdW1uIDogQ29kZU1pcnJvci5QYXNzOwogICAgfWVsc2UgaWYgKGlzX21lbWJlcih3b3JkQWZ0ZXIsY2xvc2VQYXJlbldvcmRzKSkgewogICAgICB0ID0gZ2V0VG9rZW4oc3RhdGUsb3BlblBhcmVuV29yZHMpOwogICAgICByZXR1cm4gdCA/IHQuY29sdW1uIDogQ29kZU1pcnJvci5QYXNzOwogICAgfWVsc2UgaWYgKGlzX21lbWJlcihjdXJyVC50b2tlbixbIiwiLCJ8IiwifHwiXSkgfHwKICAgICAgICAgICAgICBpc19tZW1iZXIod29yZEFmdGVyLFsiLCIsInwiLCJ8fCJdKSkgewogICAgICB0ID0gcG9zdGNvbW1hVG9rZW4oc3RhdGUpOwogICAgICByZXR1cm4gdCA/IHQuY29sdW1uK3QudG9rZW4ubGVuZ3RoIDogdW5pdDsKICAgIH1lbHNlIGlmIChjdXJyVC50b2tlbiA9PSAiLT4iKSB7CiAgICAgIGlmIChpc19tZW1iZXIocHJldlQudG9rZW4sIFsicmVjZWl2ZSIsImNhc2UiLCJpZiIsInRyeSJdKSkgewogICAgICAgIHJldHVybiBwcmV2VC5jb2x1bW4rdW5pdCt1bml0OwogICAgICB9ZWxzZXsKICAgICAgICByZXR1cm4gcHJldlQuY29sdW1uK3VuaXQ7CiAgICAgIH0KICAgIH1lbHNlIGlmIChpc19tZW1iZXIoY3VyclQudG9rZW4sb3BlblBhcmVuV29yZHMpKSB7CiAgICAgIHJldHVybiBjdXJyVC5jb2x1bW4rY3VyclQudG9rZW4ubGVuZ3RoOwogICAgfWVsc2V7CiAgICAgIHQgPSBkZWZhdWx0VG9rZW4oc3RhdGUpOwogICAgICByZXR1cm4gdHJ1dGh5KHQpID8gdC5jb2x1bW4rdW5pdCA6IDA7CiAgICB9CiAgfQoKICBmdW5jdGlvbiB3b3JkYWZ0ZXIoc3RyKSB7CiAgICB2YXIgbSA9IHN0ci5tYXRjaCgvLHxbYS16XSt8XH18XF18XCl8Pj58XHwrfFwoLyk7CgogICAgcmV0dXJuIHRydXRoeShtKSAmJiAobS5pbmRleCA9PT0gMCkgPyBtWzBdIDogIiI7CiAgfQoKICBmdW5jdGlvbiBwb3N0Y29tbWFUb2tlbihzdGF0ZSkgewogICAgdmFyIG9ianMgPSBzdGF0ZS50b2tlblN0YWNrLnNsaWNlKDAsLTEpOwogICAgdmFyIGkgPSBnZXRUb2tlbkluZGV4KG9ianMsInR5cGUiLFsib3Blbl9wYXJlbiJdKTsKCiAgICByZXR1cm4gdHJ1dGh5KG9ianNbaV0pID8gb2Jqc1tpXSA6IGZhbHNlOwogIH0KCiAgZnVuY3Rpb24gZGVmYXVsdFRva2VuKHN0YXRlKSB7CiAgICB2YXIgb2JqcyA9IHN0YXRlLnRva2VuU3RhY2s7CiAgICB2YXIgc3RvcCA9IGdldFRva2VuSW5kZXgob2JqcywidHlwZSIsWyJvcGVuX3BhcmVuIiwic2VwYXJhdG9yIiwia2V5d29yZCJdKTsKICAgIHZhciBvcGVyID0gZ2V0VG9rZW5JbmRleChvYmpzLCJ0eXBlIixbIm9wZXJhdG9yIl0pOwoKICAgIGlmICh0cnV0aHkoc3RvcCkgJiYgdHJ1dGh5KG9wZXIpICYmIHN0b3AgPCBvcGVyKSB7CiAgICAgIHJldHVybiBvYmpzW3N0b3ArMV07CiAgICB9IGVsc2UgaWYgKHRydXRoeShzdG9wKSkgewogICAgICByZXR1cm4gb2Jqc1tzdG9wXTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGdldFRva2VuKHN0YXRlLHRva2VucykgewogICAgdmFyIG9ianMgPSBzdGF0ZS50b2tlblN0YWNrOwogICAgdmFyIGkgPSBnZXRUb2tlbkluZGV4KG9ianMsInRva2VuIix0b2tlbnMpOwoKICAgIHJldHVybiB0cnV0aHkob2Jqc1tpXSkgPyBvYmpzW2ldIDogZmFsc2U7CiAgfQoKICBmdW5jdGlvbiBnZXRUb2tlbkluZGV4KG9ianMscHJvcG5hbWUscHJvcHZhbHMpIHsKCiAgICBmb3IgKHZhciBpID0gb2Jqcy5sZW5ndGgtMTsgLTEgPCBpIDsgaS0tKSB7CiAgICAgIGlmIChpc19tZW1iZXIob2Jqc1tpXVtwcm9wbmFtZV0scHJvcHZhbHMpKSB7CiAgICAgICAgcmV0dXJuIGk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIGZ1bmN0aW9uIHRydXRoeSh4KSB7CiAgICByZXR1cm4gKHggIT09IGZhbHNlKSAmJiAoeCAhPSBudWxsKTsKICB9CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLyB0aGlzIG9iamVjdCBkZWZpbmVzIHRoZSBtb2RlCgogIHJldHVybiB7CiAgICBzdGFydFN0YXRlOgogICAgICBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4ge3Rva2VuU3RhY2s6IFtdLAogICAgICAgICAgICAgICAgaW5fc3RyaW5nOiAgZmFsc2UsCiAgICAgICAgICAgICAgICBpbl9hdG9tOiAgICBmYWxzZX07CiAgICAgIH0sCgogICAgdG9rZW46CiAgICAgIGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgICByZXR1cm4gdG9rZW5pemVyKHN0cmVhbSwgc3RhdGUpOwogICAgICB9LAoKICAgIGluZGVudDoKICAgICAgZnVuY3Rpb24oc3RhdGUsIHRleHRBZnRlcikgewogICAgICAgIHJldHVybiBpbmRlbnRlcihzdGF0ZSx0ZXh0QWZ0ZXIpOwogICAgICB9LAoKICAgIGxpbmVDb21tZW50OiAiJSIKICB9Owp9KTsKCn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/erlang/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogRXJsYW5nIG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL3RoZW1lL2VybGFuZy1kYXJrLmNzcyI+CjxzY3JpcHQgc3JjPSIuLi8uLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi8uLi9hZGRvbi9lZGl0L21hdGNoYnJhY2tldHMuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iZXJsYW5nLmpzIj48L3NjcmlwdD4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4uQ29kZU1pcnJvciB7Ym9yZGVyLXRvcDogMXB4IHNvbGlkIGJsYWNrOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGltZyBpZD1sb2dvIHNyYz0iLi4vLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+TGFuZ3VhZ2UgbW9kZXM8L2E+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPkVybGFuZzwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+RXJsYW5nIG1vZGU8L2gyPgo8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgolJSAtKi0gbW9kZTogZXJsYW5nOyBlcmxhbmctaW5kZW50LWxldmVsOiAyIC0qLQolJSUgQ3JlYXRlZCA6ICA3IE1heSAyMDEyIGJ5IG1hdHMgY3JvbnF2aXN0IDxtYXNzZUBrbGFybmEuY29tPgoKJSUgQGRvYwolJSBEZW1vbnN0cmF0ZXMgaG93IHRvIHByaW50IGEgcmVjb3JkLgolJSBAZW5kCgotbW9kdWxlKCdleCcpLgotYXV0aG9yKCdtYXRzIGNyb25xdmlzdCcpLgotZXhwb3J0KFtkZW1vLzAsCiAgICAgICAgIHJlY19pbmZvLzFdKS4KCi1yZWNvcmQoZGVtbyx7YT0iT25lIixiPSJUd28iLGM9IlRocmVlIixkPSJGb3VyIn0pLgoKcmVjX2luZm8oZGVtbykgLT4gcmVjb3JkX2luZm8oZmllbGRzLGRlbW8pLgoKZGVtbygpIC0+IGV4cGFuZF9yZWNzKD9NT0RVTEUsI2RlbW97YT0iQSIsYj0iQkIifSkuCgpleHBhbmRfcmVjcyhNLExpc3QpIHdoZW4gaXNfbGlzdChMaXN0KSAtPgogIFtleHBhbmRfcmVjcyhNLEwpfHxMPC1MaXN0XTsKZXhwYW5kX3JlY3MoTSxUdXApIHdoZW4gaXNfdHVwbGUoVHVwKSAtPgogIGNhc2UgdHVwbGVfc2l6ZShUdXApIG9mCiAgICBMIHdoZW4gTCA8IDEgLT4gVHVwOwogICAgTCAtPgogICAgICB0cnkKICAgICAgICBGaWVsZHMgPSBNOnJlY19pbmZvKGVsZW1lbnQoMSxUdXApKSwKICAgICAgICBMID0gbGVuZ3RoKEZpZWxkcykrMSwKICAgICAgICBsaXN0czp6aXAoRmllbGRzLGV4cGFuZF9yZWNzKE0sdGwodHVwbGVfdG9fbGlzdChUdXApKSkpCiAgICAgIGNhdGNoCiAgICAgICAgXzpfIC0+IGxpc3RfdG9fdHVwbGUoZXhwYW5kX3JlY3MoTSx0dXBsZV90b19saXN0KFR1cCkpKQogICAgICBlbmQKICBlbmQ7CmV4cGFuZF9yZWNzKF8sVGVybSkgLT4KICBUZXJtLgo8L3RleHRhcmVhPjwvZm9ybT4KCiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgICAgIG1hdGNoQnJhY2tldHM6IHRydWUsCiAgICAgICAgZXh0cmFLZXlzOiB7IlRhYiI6ICAiaW5kZW50QXV0byJ9LAogICAgICAgIHRoZW1lOiAiZXJsYW5nLWRhcmsiCiAgICAgIH0pOwogICAgPC9zY3JpcHQ+CgogICAgPHA+PHN0cm9uZz5NSU1FIHR5cGVzIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPnRleHQveC1lcmxhbmc8L2NvZGU+LjwvcD4KICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/fortran/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/fortran/fortran.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJmb3J0cmFuIiwgZnVuY3Rpb24oKSB7CiAgZnVuY3Rpb24gd29yZHMoYXJyYXkpIHsKICAgIHZhciBrZXlzID0ge307CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgKytpKSB7CiAgICAgIGtleXNbYXJyYXlbaV1dID0gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBrZXlzOwogIH0KCiAgdmFyIGtleXdvcmRzID0gd29yZHMoWwogICAgICAgICAgICAgICAgICAiYWJzdHJhY3QiLCAiYWNjZXB0IiwgImFsbG9jYXRhYmxlIiwgImFsbG9jYXRlIiwKICAgICAgICAgICAgICAgICAgImFycmF5IiwgImFzc2lnbiIsICJhc3luY2hyb25vdXMiLCAiYmFja3NwYWNlIiwKICAgICAgICAgICAgICAgICAgImJpbmQiLCAiYmxvY2siLCAiYnl0ZSIsICJjYWxsIiwgImNhc2UiLAogICAgICAgICAgICAgICAgICAiY2xhc3MiLCAiY2xvc2UiLCAiY29tbW9uIiwgImNvbnRhaW5zIiwKICAgICAgICAgICAgICAgICAgImNvbnRpbnVlIiwgImN5Y2xlIiwgImRhdGEiLCAiZGVhbGxvY2F0ZSIsCiAgICAgICAgICAgICAgICAgICJkZWNvZGUiLCAiZGVmZXJyZWQiLCAiZGltZW5zaW9uIiwgImRvIiwKICAgICAgICAgICAgICAgICAgImVsZW1lbnRhbCIsICJlbHNlIiwgImVuY29kZSIsICJlbmQiLAogICAgICAgICAgICAgICAgICAiZW5kaWYiLCAiZW50cnkiLCAiZW51bWVyYXRvciIsICJlcXVpdmFsZW5jZSIsCiAgICAgICAgICAgICAgICAgICJleGl0IiwgImV4dGVybmFsIiwgImV4dHJpbnNpYyIsICJmaW5hbCIsCiAgICAgICAgICAgICAgICAgICJmb3JhbGwiLCAiZm9ybWF0IiwgImZ1bmN0aW9uIiwgImdlbmVyaWMiLAogICAgICAgICAgICAgICAgICAiZ28iLCAiZ290byIsICJpZiIsICJpbXBsaWNpdCIsICJpbXBvcnQiLCAiaW5jbHVkZSIsCiAgICAgICAgICAgICAgICAgICJpbnF1aXJlIiwgImludGVudCIsICJpbnRlcmZhY2UiLCAiaW50cmluc2ljIiwKICAgICAgICAgICAgICAgICAgIm1vZHVsZSIsICJuYW1lbGlzdCIsICJub25faW50cmluc2ljIiwKICAgICAgICAgICAgICAgICAgIm5vbl9vdmVycmlkYWJsZSIsICJub25lIiwgIm5vcGFzcyIsCiAgICAgICAgICAgICAgICAgICJudWxsaWZ5IiwgIm9wZW4iLCAib3B0aW9uYWwiLCAib3B0aW9ucyIsCiAgICAgICAgICAgICAgICAgICJwYXJhbWV0ZXIiLCAicGFzcyIsICJwYXVzZSIsICJwb2ludGVyIiwKICAgICAgICAgICAgICAgICAgInByaW50IiwgInByaXZhdGUiLCAicHJvZ3JhbSIsICJwcm90ZWN0ZWQiLAogICAgICAgICAgICAgICAgICAicHVibGljIiwgInB1cmUiLCAicmVhZCIsICJyZWN1cnNpdmUiLCAicmVzdWx0IiwKICAgICAgICAgICAgICAgICAgInJldHVybiIsICJyZXdpbmQiLCAic2F2ZSIsICJzZWxlY3QiLCAic2VxdWVuY2UiLAogICAgICAgICAgICAgICAgICAic3RvcCIsICJzdWJyb3V0aW5lIiwgInRhcmdldCIsICJ0aGVuIiwgInRvIiwgInR5cGUiLAogICAgICAgICAgICAgICAgICAidXNlIiwgInZhbHVlIiwgInZvbGF0aWxlIiwgIndoZXJlIiwgIndoaWxlIiwKICAgICAgICAgICAgICAgICAgIndyaXRlIl0pOwogIHZhciBidWlsdGlucyA9IHdvcmRzKFsiYWJvcnQiLCAiYWJzIiwgImFjY2VzcyIsICJhY2hhciIsICJhY29zIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRqdXN0bCIsICJhZGp1c3RyIiwgImFpbWFnIiwgImFpbnQiLCAiYWxhcm0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICJhbGwiLCAiYWxsb2NhdGVkIiwgImFsb2ciLCAiYW1heCIsICJhbWluIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAiYW1vZCIsICJhbmQiLCAiYW5pbnQiLCAiYW55IiwgImFzaW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICJhc3NvY2lhdGVkIiwgImF0YW4iLCAiYmVzaiIsICJiZXNqbiIsICJiZXN5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAiYmVzeW4iLCAiYml0X3NpemUiLCAiYnRlc3QiLCAiY2FicyIsICJjY29zIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAiY2VpbGluZyIsICJjZXhwIiwgImNoYXIiLCAiY2hkaXIiLCAiY2htb2QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJjbG9nIiwgImNtcGx4IiwgImNvbW1hbmRfYXJndW1lbnRfY291bnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJjb21wbGV4IiwgImNvbmpnIiwgImNvcyIsICJjb3NoIiwgImNvdW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAiY3B1X3RpbWUiLCAiY3NoaWZ0IiwgImNzaW4iLCAiY3NxcnQiLCAiY3RpbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJjX2Z1bmxvYyIsICJjX2xvYyIsICJjX2Fzc29jaWF0ZWQiLCAiY19udWxsX3B0ciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgImNfbnVsbF9mdW5wdHIiLCAiY19mX3BvaW50ZXIiLCAiY19udWxsX2NoYXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJjX2FsZXJ0IiwgImNfYmFja3NwYWNlIiwgImNfZm9ybV9mZWVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAiY19uZXdfbGluZSIsICJjX2NhcnJpYWdlX3JldHVybiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgImNfaG9yaXpvbnRhbF90YWIiLCAiY192ZXJ0aWNhbF90YWIiLCAiZGFicyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgImRhY29zIiwgImRhc2luIiwgImRhdGFuIiwgImRhdGVfYW5kX3RpbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJkYmVzaiIsICJkYmVzaiIsICJkYmVzam4iLCAiZGJlc3kiLCAiZGJlc3kiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJkYmVzeW4iLCAiZGJsZSIsICJkY29zIiwgImRjb3NoIiwgImRkaW0iLCAiZGVyZiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgImRlcmZjIiwgImRleHAiLCAiZGlnaXRzIiwgImRpbSIsICJkaW50IiwgImRsb2ciLAogICAgICAgICAgICAgICAgICAgICAgICAgICJkbG9nIiwgImRtYXgiLCAiZG1pbiIsICJkbW9kIiwgImRuaW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAiZG90X3Byb2R1Y3QiLCAiZHByb2QiLCAiZHNpZ24iLCAiZHNpbmgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJkc2luIiwgImRzcXJ0IiwgImR0YW5oIiwgImR0YW4iLCAiZHRpbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJlb3NoaWZ0IiwgImVwc2lsb24iLCAiZXJmIiwgImVyZmMiLCAiZXRpbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJleGl0IiwgImV4cCIsICJleHBvbmVudCIsICJleHRlbmRzX3R5cGVfb2YiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJmZGF0ZSIsICJmZ2V0IiwgImZnZXRjIiwgImZsb2F0IiwgImZsb29yIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAiZmx1c2giLCAiZm51bSIsICJmcHV0YyIsICJmcHV0IiwgImZyYWN0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAiZnNlZWsiLCAiZnN0YXQiLCAiZnRlbGwiLCAiZ2Vycm9yIiwgImdldGFyZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgImdldF9jb21tYW5kIiwgImdldF9jb21tYW5kX2FyZ3VtZW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2V0X2Vudmlyb25tZW50X3ZhcmlhYmxlIiwgImdldGN3ZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgImdldGVudiIsICJnZXRnaWQiLCAiZ2V0bG9nIiwgImdldHBpZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgImdldHVpZCIsICJnbXRpbWUiLCAiaG9zdG5tIiwgImh1Z2UiLCAiaWFicyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgImlhY2hhciIsICJpYW5kIiwgImlhcmdjIiwgImliY2xyIiwgImliaXRzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAiaWJzZXQiLCAiaWNoYXIiLCAiaWRhdGUiLCAiaWRpbSIsICJpZGludCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgImlkbmludCIsICJpZW9yIiwgImllcnJubyIsICJpZml4IiwgImltYWciLAogICAgICAgICAgICAgICAgICAgICAgICAgICJpbWFncGFydCIsICJpbmRleCIsICJpbnQiLCAiaW9yIiwgImlyYW5kIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAiaXNhdHR5IiwgImlzaGZ0IiwgImlzaGZ0YyIsICJpc2lnbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgImlzb19jX2JpbmRpbmciLCAiaXNfaW9zdGF0X2VuZCIsICJpc19pb3N0YXRfZW9yIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAiaXRpbWUiLCAia2lsbCIsICJraW5kIiwgImxib3VuZCIsICJsZW4iLCAibGVuX3RyaW0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICJsZ2UiLCAibGd0IiwgImxpbmsiLCAibGxlIiwgImxsdCIsICJsbmJsbmsiLCAibG9jIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAibG9nIiwgImxvZ2ljYWwiLCAibG9uZyIsICJsc2hpZnQiLCAibHN0YXQiLCAibHRpbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJtYXRtdWwiLCAibWF4IiwgIm1heGV4cG9uZW50IiwgIm1heGxvYyIsICJtYXh2YWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJtY2xvY2siLCAibWVyZ2UiLCAibW92ZV9hbGxvYyIsICJtaW4iLCAibWluZXhwb25lbnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJtaW5sb2MiLCAibWludmFsIiwgIm1vZCIsICJtb2R1bG8iLCAibXZiaXRzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAibmVhcmVzdCIsICJuZXdfbGluZSIsICJuaW50IiwgIm5vdCIsICJvciIsICJwYWNrIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAicGVycm9yIiwgInByZWNpc2lvbiIsICJwcmVzZW50IiwgInByb2R1Y3QiLCAicmFkaXgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJyYW5kIiwgInJhbmRvbV9udW1iZXIiLCAicmFuZG9tX3NlZWQiLCAicmFuZ2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJyZWFsIiwgInJlYWxwYXJ0IiwgInJlbmFtZSIsICJyZXBlYXQiLCAicmVzaGFwZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgInJyc3BhY2luZyIsICJyc2hpZnQiLCAic2FtZV90eXBlX2FzIiwgInNjYWxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAic2NhbiIsICJzZWNvbmQiLCAic2VsZWN0ZWRfaW50X2tpbmQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJzZWxlY3RlZF9yZWFsX2tpbmQiLCAic2V0X2V4cG9uZW50IiwgInNoYXBlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAic2hvcnQiLCAic2lnbiIsICJzaWduYWwiLCAic2luaCIsICJzaW4iLCAic2xlZXAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJzbmdsIiwgInNwYWNpbmciLCAic3ByZWFkIiwgInNxcnQiLCAic3JhbmQiLCAic3RhdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgInN1bSIsICJzeW1sbmsiLCAic3lzdGVtIiwgInN5c3RlbV9jbG9jayIsICJ0YW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICJ0YW5oIiwgInRpbWUiLCAidGlueSIsICJ0cmFuc2ZlciIsICJ0cmFuc3Bvc2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmltIiwgInR0eW5hbSIsICJ1Ym91bmQiLCAidW1hc2siLCAidW5saW5rIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAidW5wYWNrIiwgInZlcmlmeSIsICJ4b3IiLCAiemFicyIsICJ6Y29zIiwgInpleHAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJ6bG9nIiwgInpzaW4iLCAienNxcnQiXSk7CgogICAgdmFyIGRhdGFUeXBlcyA9ICB3b3JkcyhbImNfYm9vbCIsICJjX2NoYXIiLCAiY19kb3VibGUiLCAiY19kb3VibGVfY29tcGxleCIsCiAgICAgICAgICAgICAgICAgICAgICJjX2Zsb2F0IiwgImNfZmxvYXRfY29tcGxleCIsICJjX2Z1bnB0ciIsICJjX2ludCIsCiAgICAgICAgICAgICAgICAgICAgICJjX2ludDE2X3QiLCAiY19pbnQzMl90IiwgImNfaW50NjRfdCIsICJjX2ludDhfdCIsCiAgICAgICAgICAgICAgICAgICAgICJjX2ludF9mYXN0MTZfdCIsICJjX2ludF9mYXN0MzJfdCIsICJjX2ludF9mYXN0NjRfdCIsCiAgICAgICAgICAgICAgICAgICAgICJjX2ludF9mYXN0OF90IiwgImNfaW50X2xlYXN0MTZfdCIsICJjX2ludF9sZWFzdDMyX3QiLAogICAgICAgICAgICAgICAgICAgICAiY19pbnRfbGVhc3Q2NF90IiwgImNfaW50X2xlYXN0OF90IiwgImNfaW50bWF4X3QiLAogICAgICAgICAgICAgICAgICAgICAiY19pbnRwdHJfdCIsICJjX2xvbmciLCAiY19sb25nX2RvdWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICJjX2xvbmdfZG91YmxlX2NvbXBsZXgiLCAiY19sb25nX2xvbmciLCAiY19wdHIiLAogICAgICAgICAgICAgICAgICAgICAiY19zaG9ydCIsICJjX3NpZ25lZF9jaGFyIiwgImNfc2l6ZV90IiwgImNoYXJhY3RlciIsCiAgICAgICAgICAgICAgICAgICAgICJjb21wbGV4IiwgImRvdWJsZSIsICJpbnRlZ2VyIiwgImxvZ2ljYWwiLCAicmVhbCJdKTsKICB2YXIgaXNPcGVyYXRvckNoYXIgPSAvWytcLSomPTw+XC9cOl0vOwogIHZhciBsaXRPcGVyYXRvciA9IG5ldyBSZWdFeHAoIihcLmFuZFwufFwub3JcLnxcLmVxXC58XC5sdFwufFwubGVcLnxcLmd0XC58XC5nZVwufFwubmVcLnxcLm5vdFwufFwuZXF2XC58XC5uZXF2XC4pIiwgImkiKTsKCiAgZnVuY3Rpb24gdG9rZW5CYXNlKHN0cmVhbSwgc3RhdGUpIHsKCiAgICBpZiAoc3RyZWFtLm1hdGNoKGxpdE9wZXJhdG9yKSl7CiAgICAgICAgcmV0dXJuICdvcGVyYXRvcic7CiAgICB9CgogICAgdmFyIGNoID0gc3RyZWFtLm5leHQoKTsKICAgIGlmIChjaCA9PSAiISIpIHsKICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICByZXR1cm4gImNvbW1lbnQiOwogICAgfQogICAgaWYgKGNoID09ICciJyB8fCBjaCA9PSAiJyIpIHsKICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlblN0cmluZyhjaCk7CiAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgIH0KICAgIGlmICgvW1xbXF1cKFwpLF0vLnRlc3QoY2gpKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgaWYgKC9cZC8udGVzdChjaCkpIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXHdcLl0vKTsKICAgICAgcmV0dXJuICJudW1iZXIiOwogICAgfQogICAgaWYgKGlzT3BlcmF0b3JDaGFyLnRlc3QoY2gpKSB7CiAgICAgIHN0cmVhbS5lYXRXaGlsZShpc09wZXJhdG9yQ2hhcik7CiAgICAgIHJldHVybiAib3BlcmF0b3IiOwogICAgfQogICAgc3RyZWFtLmVhdFdoaWxlKC9bXHdcJF9dLyk7CiAgICB2YXIgd29yZCA9IHN0cmVhbS5jdXJyZW50KCkudG9Mb3dlckNhc2UoKTsKCiAgICBpZiAoa2V5d29yZHMuaGFzT3duUHJvcGVydHkod29yZCkpewogICAgICAgICAgICByZXR1cm4gJ2tleXdvcmQnOwogICAgfQogICAgaWYgKGJ1aWx0aW5zLmhhc093blByb3BlcnR5KHdvcmQpIHx8IGRhdGFUeXBlcy5oYXNPd25Qcm9wZXJ0eSh3b3JkKSkgewogICAgICAgICAgICByZXR1cm4gJ2J1aWx0aW4nOwogICAgfQogICAgcmV0dXJuICJ2YXJpYWJsZSI7CiAgfQoKICBmdW5jdGlvbiB0b2tlblN0cmluZyhxdW90ZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgdmFyIGVzY2FwZWQgPSBmYWxzZSwgbmV4dCwgZW5kID0gZmFsc2U7CiAgICAgIHdoaWxlICgobmV4dCA9IHN0cmVhbS5uZXh0KCkpICE9IG51bGwpIHsKICAgICAgICBpZiAobmV4dCA9PSBxdW90ZSAmJiAhZXNjYXBlZCkgewogICAgICAgICAgICBlbmQgPSB0cnVlOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgZXNjYXBlZCA9ICFlc2NhcGVkICYmIG5leHQgPT0gIlxcIjsKICAgICAgfQogICAgICBpZiAoZW5kIHx8ICFlc2NhcGVkKSBzdGF0ZS50b2tlbml6ZSA9IG51bGw7CiAgICAgIHJldHVybiAic3RyaW5nIjsKICAgIH07CiAgfQoKICAvLyBJbnRlcmZhY2UKCiAgcmV0dXJuIHsKICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4ge3Rva2VuaXplOiBudWxsfTsKICAgIH0sCgogICAgdG9rZW46IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgaWYgKHN0cmVhbS5lYXRTcGFjZSgpKSByZXR1cm4gbnVsbDsKICAgICAgdmFyIHN0eWxlID0gKHN0YXRlLnRva2VuaXplIHx8IHRva2VuQmFzZSkoc3RyZWFtLCBzdGF0ZSk7CiAgICAgIGlmIChzdHlsZSA9PSAiY29tbWVudCIgfHwgc3R5bGUgPT0gIm1ldGEiKSByZXR1cm4gc3R5bGU7CiAgICAgIHJldHVybiBzdHlsZTsKICAgIH0KICB9Owp9KTsKCkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC94LWZvcnRyYW4iLCAiZm9ydHJhbiIpOwoKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/fortran/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogRm9ydHJhbiBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9ImZvcnRyYW4uanMiPjwvc2NyaXB0Pgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPi5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazt9PC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aW1nIGlkPWxvZ28gc3JjPSIuLi8uLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5MYW5ndWFnZSBtb2RlczwvYT4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+Rm9ydHJhbjwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+Rm9ydHJhbiBtb2RlPC9oMj4KCgo8ZGl2Pjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+CiEgRXhhbXBsZSBGb3J0cmFuIGNvZGUKICBwcm9ncmFtIGF2ZXJhZ2UKCiAgISBSZWFkIGluIHNvbWUgbnVtYmVycyBhbmQgdGFrZSB0aGUgYXZlcmFnZQogICEgQXMgd3JpdHRlbiwgaWYgdGhlcmUgYXJlIG5vIGRhdGEgcG9pbnRzLCBhbiBhdmVyYWdlIG9mIHplcm8gaXMgcmV0dXJuZWQKICAhIFdoaWxlIHRoaXMgbWF5IG5vdCBiZSBkZXNpcmVkIGJlaGF2aW9yLCBpdCBrZWVwcyB0aGlzIGV4YW1wbGUgc2ltcGxlCgogIGltcGxpY2l0IG5vbmUKCiAgcmVhbCwgZGltZW5zaW9uKDopLCBhbGxvY2F0YWJsZSA6OiBwb2ludHMKICBpbnRlZ2VyICAgICAgICAgICAgICAgICAgICAgICAgIDo6IG51bWJlcl9vZl9wb2ludHMKICByZWFsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6IGF2ZXJhZ2VfcG9pbnRzPTAuLCBwb3NpdGl2ZV9hdmVyYWdlPTAuLCBuZWdhdGl2ZV9hdmVyYWdlPTAuCgogIHdyaXRlICgqLCopICJJbnB1dCBudW1iZXIgb2YgcG9pbnRzIHRvIGF2ZXJhZ2U6IgogIHJlYWQgICgqLCopIG51bWJlcl9vZl9wb2ludHMKCiAgYWxsb2NhdGUgKHBvaW50cyhudW1iZXJfb2ZfcG9pbnRzKSkKCiAgd3JpdGUgKCosKikgIkVudGVyIHRoZSBwb2ludHMgdG8gYXZlcmFnZToiCiAgcmVhZCAgKCosKikgcG9pbnRzCgogICEgVGFrZSB0aGUgYXZlcmFnZSBieSBzdW1taW5nIHBvaW50cyBhbmQgZGl2aWRpbmcgYnkgbnVtYmVyX29mX3BvaW50cwogIGlmIChudW1iZXJfb2ZfcG9pbnRzID4gMCkgYXZlcmFnZV9wb2ludHMgPSBzdW0ocG9pbnRzKSAvIG51bWJlcl9vZl9wb2ludHMKCiAgISBOb3cgZm9ybSBhdmVyYWdlIG92ZXIgcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIHBvaW50cyBvbmx5CiAgaWYgKGNvdW50KHBvaW50cyA+IDAuKSA+IDApIHRoZW4KICAgICBwb3NpdGl2ZV9hdmVyYWdlID0gc3VtKHBvaW50cywgcG9pbnRzID4gMC4pIC8gY291bnQocG9pbnRzID4gMC4pCiAgZW5kIGlmCgogIGlmIChjb3VudChwb2ludHMgPCAwLikgPiAwKSB0aGVuCiAgICAgbmVnYXRpdmVfYXZlcmFnZSA9IHN1bShwb2ludHMsIHBvaW50cyA8IDAuKSAvIGNvdW50KHBvaW50cyA8IDAuKQogIGVuZCBpZgoKICBkZWFsbG9jYXRlIChwb2ludHMpCgogICEgUHJpbnQgcmVzdWx0IHRvIHRlcm1pbmFsCiAgd3JpdGUgKCosJyhhLGcxMi40KScpICdBdmVyYWdlID0gJywgYXZlcmFnZV9wb2ludHMKICB3cml0ZSAoKiwnKGEsZzEyLjQpJykgJ0F2ZXJhZ2Ugb2YgcG9zaXRpdmUgcG9pbnRzID0gJywgcG9zaXRpdmVfYXZlcmFnZQogIHdyaXRlICgqLCcoYSxnMTIuNCknKSAnQXZlcmFnZSBvZiBuZWdhdGl2ZSBwb2ludHMgPSAnLCBuZWdhdGl2ZV9hdmVyYWdlCgogIGVuZCBwcm9ncmFtIGF2ZXJhZ2UKPC90ZXh0YXJlYT48L2Rpdj4KCiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgICAgIG1vZGU6ICJ0ZXh0L3gtZm9ydHJhbiIKICAgICAgfSk7CiAgICA8L3NjcmlwdD4KCiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC94LUZvcnRyYW48L2NvZGU+LjwvcD4KICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/gas/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/gas/gas.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJnYXMiLCBmdW5jdGlvbihfY29uZmlnLCBwYXJzZXJDb25maWcpIHsKICAndXNlIHN0cmljdCc7CgogIC8vIElmIGFuIGFyY2hpdGVjdHVyZSBpcyBzcGVjaWZpZWQsIGl0cyBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiBtYXkKICAvLyBwb3B1bGF0ZSB0aGlzIGFycmF5IHdpdGggY3VzdG9tIHBhcnNpbmcgZnVuY3Rpb25zIHdoaWNoIHdpbGwgYmUKICAvLyB0cmllZCBpbiB0aGUgZXZlbnQgdGhhdCB0aGUgc3RhbmRhcmQgZnVuY3Rpb25zIGRvIG5vdCBmaW5kIGEgbWF0Y2guCiAgdmFyIGN1c3RvbSA9IFtdOwoKICAvLyBUaGUgc3ltYm9sIHVzZWQgdG8gc3RhcnQgYSBsaW5lIGNvbW1lbnQgY2hhbmdlcyBiYXNlZCBvbiB0aGUgdGFyZ2V0CiAgLy8gYXJjaGl0ZWN0dXJlLgogIC8vIElmIG5vIGFyY2hpdGVjdHVyZSBpcyBwYXNlZCBpbiAicGFyc2VyQ29uZmlnIiB0aGVuIG9ubHkgbXVsdGlsaW5lCiAgLy8gY29tbWVudHMgd2lsbCBoYXZlIHN5bnRheCBzdXBwb3J0LgogIHZhciBsaW5lQ29tbWVudFN0YXJ0U3ltYm9sID0gIiI7CgogIC8vIFRoZXNlIGRpcmVjdGl2ZXMgYXJlIGFyY2hpdGVjdHVyZSBpbmRlcGVuZGVudC4KICAvLyBNYWNoaW5lIHNwZWNpZmljIGRpcmVjdGl2ZXMgc2hvdWxkIGdvIGluIHRoZWlyIHJlc3BlY3RpdmUKICAvLyBhcmNoaXRlY3R1cmUgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24uCiAgLy8gUmVmZXJlbmNlOgogIC8vIGh0dHA6Ly9zb3VyY2V3YXJlLm9yZy9iaW51dGlscy9kb2NzL2FzL1BzZXVkby1PcHMuaHRtbCNQc2V1ZG8tT3BzCiAgdmFyIGRpcmVjdGl2ZXMgPSB7CiAgICAiLmFib3J0IiA6ICJidWlsdGluIiwKICAgICIuYWxpZ24iIDogImJ1aWx0aW4iLAogICAgIi5hbHRtYWNybyIgOiAiYnVpbHRpbiIsCiAgICAiLmFzY2lpIiA6ICJidWlsdGluIiwKICAgICIuYXNjaXoiIDogImJ1aWx0aW4iLAogICAgIi5iYWxpZ24iIDogImJ1aWx0aW4iLAogICAgIi5iYWxpZ253IiA6ICJidWlsdGluIiwKICAgICIuYmFsaWdubCIgOiAiYnVpbHRpbiIsCiAgICAiLmJ1bmRsZV9hbGlnbl9tb2RlIiA6ICJidWlsdGluIiwKICAgICIuYnVuZGxlX2xvY2siIDogImJ1aWx0aW4iLAogICAgIi5idW5kbGVfdW5sb2NrIiA6ICJidWlsdGluIiwKICAgICIuYnl0ZSIgOiAiYnVpbHRpbiIsCiAgICAiLmNmaV9zdGFydHByb2MiIDogImJ1aWx0aW4iLAogICAgIi5jb21tIiA6ICJidWlsdGluIiwKICAgICIuZGF0YSIgOiAiYnVpbHRpbiIsCiAgICAiLmRlZiIgOiAiYnVpbHRpbiIsCiAgICAiLmRlc2MiIDogImJ1aWx0aW4iLAogICAgIi5kaW0iIDogImJ1aWx0aW4iLAogICAgIi5kb3VibGUiIDogImJ1aWx0aW4iLAogICAgIi5lamVjdCIgOiAiYnVpbHRpbiIsCiAgICAiLmVsc2UiIDogImJ1aWx0aW4iLAogICAgIi5lbHNlaWYiIDogImJ1aWx0aW4iLAogICAgIi5lbmQiIDogImJ1aWx0aW4iLAogICAgIi5lbmRlZiIgOiAiYnVpbHRpbiIsCiAgICAiLmVuZGZ1bmMiIDogImJ1aWx0aW4iLAogICAgIi5lbmRpZiIgOiAiYnVpbHRpbiIsCiAgICAiLmVxdSIgOiAiYnVpbHRpbiIsCiAgICAiLmVxdWl2IiA6ICJidWlsdGluIiwKICAgICIuZXF2IiA6ICJidWlsdGluIiwKICAgICIuZXJyIiA6ICJidWlsdGluIiwKICAgICIuZXJyb3IiIDogImJ1aWx0aW4iLAogICAgIi5leGl0bSIgOiAiYnVpbHRpbiIsCiAgICAiLmV4dGVybiIgOiAiYnVpbHRpbiIsCiAgICAiLmZhaWwiIDogImJ1aWx0aW4iLAogICAgIi5maWxlIiA6ICJidWlsdGluIiwKICAgICIuZmlsbCIgOiAiYnVpbHRpbiIsCiAgICAiLmZsb2F0IiA6ICJidWlsdGluIiwKICAgICIuZnVuYyIgOiAiYnVpbHRpbiIsCiAgICAiLmdsb2JhbCIgOiAiYnVpbHRpbiIsCiAgICAiLmdudV9hdHRyaWJ1dGUiIDogImJ1aWx0aW4iLAogICAgIi5oaWRkZW4iIDogImJ1aWx0aW4iLAogICAgIi5od29yZCIgOiAiYnVpbHRpbiIsCiAgICAiLmlkZW50IiA6ICJidWlsdGluIiwKICAgICIuaWYiIDogImJ1aWx0aW4iLAogICAgIi5pbmNiaW4iIDogImJ1aWx0aW4iLAogICAgIi5pbmNsdWRlIiA6ICJidWlsdGluIiwKICAgICIuaW50IiA6ICJidWlsdGluIiwKICAgICIuaW50ZXJuYWwiIDogImJ1aWx0aW4iLAogICAgIi5pcnAiIDogImJ1aWx0aW4iLAogICAgIi5pcnBjIiA6ICJidWlsdGluIiwKICAgICIubGNvbW0iIDogImJ1aWx0aW4iLAogICAgIi5sZmxhZ3MiIDogImJ1aWx0aW4iLAogICAgIi5saW5lIiA6ICJidWlsdGluIiwKICAgICIubGlua29uY2UiIDogImJ1aWx0aW4iLAogICAgIi5saXN0IiA6ICJidWlsdGluIiwKICAgICIubG4iIDogImJ1aWx0aW4iLAogICAgIi5sb2MiIDogImJ1aWx0aW4iLAogICAgIi5sb2NfbWFya19sYWJlbHMiIDogImJ1aWx0aW4iLAogICAgIi5sb2NhbCIgOiAiYnVpbHRpbiIsCiAgICAiLmxvbmciIDogImJ1aWx0aW4iLAogICAgIi5tYWNybyIgOiAiYnVpbHRpbiIsCiAgICAiLm1yaSIgOiAiYnVpbHRpbiIsCiAgICAiLm5vYWx0bWFjcm8iIDogImJ1aWx0aW4iLAogICAgIi5ub2xpc3QiIDogImJ1aWx0aW4iLAogICAgIi5vY3RhIiA6ICJidWlsdGluIiwKICAgICIub2Zmc2V0IiA6ICJidWlsdGluIiwKICAgICIub3JnIiA6ICJidWlsdGluIiwKICAgICIucDJhbGlnbiIgOiAiYnVpbHRpbiIsCiAgICAiLnBvcHNlY3Rpb24iIDogImJ1aWx0aW4iLAogICAgIi5wcmV2aW91cyIgOiAiYnVpbHRpbiIsCiAgICAiLnByaW50IiA6ICJidWlsdGluIiwKICAgICIucHJvdGVjdGVkIiA6ICJidWlsdGluIiwKICAgICIucHNpemUiIDogImJ1aWx0aW4iLAogICAgIi5wdXJnZW0iIDogImJ1aWx0aW4iLAogICAgIi5wdXNoc2VjdGlvbiIgOiAiYnVpbHRpbiIsCiAgICAiLnF1YWQiIDogImJ1aWx0aW4iLAogICAgIi5yZWxvYyIgOiAiYnVpbHRpbiIsCiAgICAiLnJlcHQiIDogImJ1aWx0aW4iLAogICAgIi5zYnR0bCIgOiAiYnVpbHRpbiIsCiAgICAiLnNjbCIgOiAiYnVpbHRpbiIsCiAgICAiLnNlY3Rpb24iIDogImJ1aWx0aW4iLAogICAgIi5zZXQiIDogImJ1aWx0aW4iLAogICAgIi5zaG9ydCIgOiAiYnVpbHRpbiIsCiAgICAiLnNpbmdsZSIgOiAiYnVpbHRpbiIsCiAgICAiLnNpemUiIDogImJ1aWx0aW4iLAogICAgIi5za2lwIiA6ICJidWlsdGluIiwKICAgICIuc2xlYjEyOCIgOiAiYnVpbHRpbiIsCiAgICAiLnNwYWNlIiA6ICJidWlsdGluIiwKICAgICIuc3RhYiIgOiAiYnVpbHRpbiIsCiAgICAiLnN0cmluZyIgOiAiYnVpbHRpbiIsCiAgICAiLnN0cnVjdCIgOiAiYnVpbHRpbiIsCiAgICAiLnN1YnNlY3Rpb24iIDogImJ1aWx0aW4iLAogICAgIi5zeW12ZXIiIDogImJ1aWx0aW4iLAogICAgIi50YWciIDogImJ1aWx0aW4iLAogICAgIi50ZXh0IiA6ICJidWlsdGluIiwKICAgICIudGl0bGUiIDogImJ1aWx0aW4iLAogICAgIi50eXBlIiA6ICJidWlsdGluIiwKICAgICIudWxlYjEyOCIgOiAiYnVpbHRpbiIsCiAgICAiLnZhbCIgOiAiYnVpbHRpbiIsCiAgICAiLnZlcnNpb24iIDogImJ1aWx0aW4iLAogICAgIi52dGFibGVfZW50cnkiIDogImJ1aWx0aW4iLAogICAgIi52dGFibGVfaW5oZXJpdCIgOiAiYnVpbHRpbiIsCiAgICAiLndhcm5pbmciIDogImJ1aWx0aW4iLAogICAgIi53ZWFrIiA6ICJidWlsdGluIiwKICAgICIud2Vha3JlZiIgOiAiYnVpbHRpbiIsCiAgICAiLndvcmQiIDogImJ1aWx0aW4iCiAgfTsKCiAgdmFyIHJlZ2lzdGVycyA9IHt9OwoKICBmdW5jdGlvbiB4ODYoX3BhcnNlckNvbmZpZykgewogICAgbGluZUNvbW1lbnRTdGFydFN5bWJvbCA9ICIjIjsKCiAgICByZWdpc3RlcnMuYXggID0gInZhcmlhYmxlIjsKICAgIHJlZ2lzdGVycy5lYXggPSAidmFyaWFibGUtMiI7CiAgICByZWdpc3RlcnMucmF4ID0gInZhcmlhYmxlLTMiOwoKICAgIHJlZ2lzdGVycy5ieCAgPSAidmFyaWFibGUiOwogICAgcmVnaXN0ZXJzLmVieCA9ICJ2YXJpYWJsZS0yIjsKICAgIHJlZ2lzdGVycy5yYnggPSAidmFyaWFibGUtMyI7CgogICAgcmVnaXN0ZXJzLmN4ICA9ICJ2YXJpYWJsZSI7CiAgICByZWdpc3RlcnMuZWN4ID0gInZhcmlhYmxlLTIiOwogICAgcmVnaXN0ZXJzLnJjeCA9ICJ2YXJpYWJsZS0zIjsKCiAgICByZWdpc3RlcnMuZHggID0gInZhcmlhYmxlIjsKICAgIHJlZ2lzdGVycy5lZHggPSAidmFyaWFibGUtMiI7CiAgICByZWdpc3RlcnMucmR4ID0gInZhcmlhYmxlLTMiOwoKICAgIHJlZ2lzdGVycy5zaSAgPSAidmFyaWFibGUiOwogICAgcmVnaXN0ZXJzLmVzaSA9ICJ2YXJpYWJsZS0yIjsKICAgIHJlZ2lzdGVycy5yc2kgPSAidmFyaWFibGUtMyI7CgogICAgcmVnaXN0ZXJzLmRpICA9ICJ2YXJpYWJsZSI7CiAgICByZWdpc3RlcnMuZWRpID0gInZhcmlhYmxlLTIiOwogICAgcmVnaXN0ZXJzLnJkaSA9ICJ2YXJpYWJsZS0zIjsKCiAgICByZWdpc3RlcnMuc3AgID0gInZhcmlhYmxlIjsKICAgIHJlZ2lzdGVycy5lc3AgPSAidmFyaWFibGUtMiI7CiAgICByZWdpc3RlcnMucnNwID0gInZhcmlhYmxlLTMiOwoKICAgIHJlZ2lzdGVycy5icCAgPSAidmFyaWFibGUiOwogICAgcmVnaXN0ZXJzLmVicCA9ICJ2YXJpYWJsZS0yIjsKICAgIHJlZ2lzdGVycy5yYnAgPSAidmFyaWFibGUtMyI7CgogICAgcmVnaXN0ZXJzLmlwICA9ICJ2YXJpYWJsZSI7CiAgICByZWdpc3RlcnMuZWlwID0gInZhcmlhYmxlLTIiOwogICAgcmVnaXN0ZXJzLnJpcCA9ICJ2YXJpYWJsZS0zIjsKCiAgICByZWdpc3RlcnMuY3MgID0gImtleXdvcmQiOwogICAgcmVnaXN0ZXJzLmRzICA9ICJrZXl3b3JkIjsKICAgIHJlZ2lzdGVycy5zcyAgPSAia2V5d29yZCI7CiAgICByZWdpc3RlcnMuZXMgID0gImtleXdvcmQiOwogICAgcmVnaXN0ZXJzLmZzICA9ICJrZXl3b3JkIjsKICAgIHJlZ2lzdGVycy5ncyAgPSAia2V5d29yZCI7CiAgfQoKICBmdW5jdGlvbiBhcm12NihfcGFyc2VyQ29uZmlnKSB7CiAgICAvLyBSZWZlcmVuY2U6CiAgICAvLyBodHRwOi8vaW5mb2NlbnRlci5hcm0uY29tL2hlbHAvdG9waWMvY29tLmFybS5kb2MucXJjMDAwMWwvUVJDMDAwMV9VQUwucGRmCiAgICAvLyBodHRwOi8vaW5mb2NlbnRlci5hcm0uY29tL2hlbHAvdG9waWMvY29tLmFybS5kb2MuZGRpMDMwMWgvRERJMDMwMUhfYXJtMTE3Nmp6ZnNfcjBwN190cm0ucGRmCiAgICBsaW5lQ29tbWVudFN0YXJ0U3ltYm9sID0gIkAiOwogICAgZGlyZWN0aXZlcy5zeW50YXggPSAiYnVpbHRpbiI7CgogICAgcmVnaXN0ZXJzLnIwICA9ICJ2YXJpYWJsZSI7CiAgICByZWdpc3RlcnMucjEgID0gInZhcmlhYmxlIjsKICAgIHJlZ2lzdGVycy5yMiAgPSAidmFyaWFibGUiOwogICAgcmVnaXN0ZXJzLnIzICA9ICJ2YXJpYWJsZSI7CiAgICByZWdpc3RlcnMucjQgID0gInZhcmlhYmxlIjsKICAgIHJlZ2lzdGVycy5yNSAgPSAidmFyaWFibGUiOwogICAgcmVnaXN0ZXJzLnI2ICA9ICJ2YXJpYWJsZSI7CiAgICByZWdpc3RlcnMucjcgID0gInZhcmlhYmxlIjsKICAgIHJlZ2lzdGVycy5yOCAgPSAidmFyaWFibGUiOwogICAgcmVnaXN0ZXJzLnI5ICA9ICJ2YXJpYWJsZSI7CiAgICByZWdpc3RlcnMucjEwID0gInZhcmlhYmxlIjsKICAgIHJlZ2lzdGVycy5yMTEgPSAidmFyaWFibGUiOwogICAgcmVnaXN0ZXJzLnIxMiA9ICJ2YXJpYWJsZSI7CgogICAgcmVnaXN0ZXJzLnNwICA9ICJ2YXJpYWJsZS0yIjsKICAgIHJlZ2lzdGVycy5sciAgPSAidmFyaWFibGUtMiI7CiAgICByZWdpc3RlcnMucGMgID0gInZhcmlhYmxlLTIiOwogICAgcmVnaXN0ZXJzLnIxMyA9IHJlZ2lzdGVycy5zcDsKICAgIHJlZ2lzdGVycy5yMTQgPSByZWdpc3RlcnMubHI7CiAgICByZWdpc3RlcnMucjE1ID0gcmVnaXN0ZXJzLnBjOwoKICAgIGN1c3RvbS5wdXNoKGZ1bmN0aW9uKGNoLCBzdHJlYW0pIHsKICAgICAgaWYgKGNoID09PSAnIycpIHsKICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1x3Lyk7CiAgICAgICAgcmV0dXJuICJudW1iZXIiOwogICAgICB9CiAgICB9KTsKICB9CgogIHZhciBhcmNoID0gKHBhcnNlckNvbmZpZy5hcmNoaXRlY3R1cmUgfHwgIng4NiIpLnRvTG93ZXJDYXNlKCk7CiAgaWYgKGFyY2ggPT09ICJ4ODYiKSB7CiAgICB4ODYocGFyc2VyQ29uZmlnKTsKICB9IGVsc2UgaWYgKGFyY2ggPT09ICJhcm0iIHx8IGFyY2ggPT09ICJhcm12NiIpIHsKICAgIGFybXY2KHBhcnNlckNvbmZpZyk7CiAgfQoKICBmdW5jdGlvbiBuZXh0VW50aWxVbmVzY2FwZWQoc3RyZWFtLCBlbmQpIHsKICAgIHZhciBlc2NhcGVkID0gZmFsc2UsIG5leHQ7CiAgICB3aGlsZSAoKG5leHQgPSBzdHJlYW0ubmV4dCgpKSAhPSBudWxsKSB7CiAgICAgIGlmIChuZXh0ID09PSBlbmQgJiYgIWVzY2FwZWQpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgZXNjYXBlZCA9ICFlc2NhcGVkICYmIG5leHQgPT09ICJcXCI7CiAgICB9CiAgICByZXR1cm4gZXNjYXBlZDsKICB9CgogIGZ1bmN0aW9uIGNsaWtlQ29tbWVudChzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgbWF5YmVFbmQgPSBmYWxzZSwgY2g7CiAgICB3aGlsZSAoKGNoID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkgewogICAgICBpZiAoY2ggPT09ICIvIiAmJiBtYXliZUVuZCkgewogICAgICAgIHN0YXRlLnRva2VuaXplID0gbnVsbDsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBtYXliZUVuZCA9IChjaCA9PT0gIioiKTsKICAgIH0KICAgIHJldHVybiAiY29tbWVudCI7CiAgfQoKICByZXR1cm4gewogICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgdG9rZW5pemU6IG51bGwKICAgICAgfTsKICAgIH0sCgogICAgdG9rZW46IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgaWYgKHN0YXRlLnRva2VuaXplKSB7CiAgICAgICAgcmV0dXJuIHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgICB9CgogICAgICBpZiAoc3RyZWFtLmVhdFNwYWNlKCkpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQoKICAgICAgdmFyIHN0eWxlLCBjdXIsIGNoID0gc3RyZWFtLm5leHQoKTsKCiAgICAgIGlmIChjaCA9PT0gIi8iKSB7CiAgICAgICAgaWYgKHN0cmVhbS5lYXQoIioiKSkgewogICAgICAgICAgc3RhdGUudG9rZW5pemUgPSBjbGlrZUNvbW1lbnQ7CiAgICAgICAgICByZXR1cm4gY2xpa2VDb21tZW50KHN0cmVhbSwgc3RhdGUpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgKGNoID09PSBsaW5lQ29tbWVudFN0YXJ0U3ltYm9sKSB7CiAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICAgIHJldHVybiAiY29tbWVudCI7CiAgICAgIH0KCiAgICAgIGlmIChjaCA9PT0gJyInKSB7CiAgICAgICAgbmV4dFVudGlsVW5lc2NhcGVkKHN0cmVhbSwgJyInKTsKICAgICAgICByZXR1cm4gInN0cmluZyI7CiAgICAgIH0KCiAgICAgIGlmIChjaCA9PT0gJy4nKSB7CiAgICAgICAgc3RyZWFtLmVhdFdoaWxlKC9cdy8pOwogICAgICAgIGN1ciA9IHN0cmVhbS5jdXJyZW50KCkudG9Mb3dlckNhc2UoKTsKICAgICAgICBzdHlsZSA9IGRpcmVjdGl2ZXNbY3VyXTsKICAgICAgICByZXR1cm4gc3R5bGUgfHwgbnVsbDsKICAgICAgfQoKICAgICAgaWYgKGNoID09PSAnPScpIHsKICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1x3Lyk7CiAgICAgICAgcmV0dXJuICJ0YWciOwogICAgICB9CgogICAgICBpZiAoY2ggPT09ICd7JykgewogICAgICAgIHJldHVybiAiYnJha2V0IjsKICAgICAgfQoKICAgICAgaWYgKGNoID09PSAnfScpIHsKICAgICAgICByZXR1cm4gImJyYWtldCI7CiAgICAgIH0KCiAgICAgIGlmICgvXGQvLnRlc3QoY2gpKSB7CiAgICAgICAgaWYgKGNoID09PSAiMCIgJiYgc3RyZWFtLmVhdCgieCIpKSB7CiAgICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1swLTlhLWZBLUZdLyk7CiAgICAgICAgICByZXR1cm4gIm51bWJlciI7CiAgICAgICAgfQogICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvXGQvKTsKICAgICAgICByZXR1cm4gIm51bWJlciI7CiAgICAgIH0KCiAgICAgIGlmICgvXHcvLnRlc3QoY2gpKSB7CiAgICAgICAgc3RyZWFtLmVhdFdoaWxlKC9cdy8pOwogICAgICAgIGlmIChzdHJlYW0uZWF0KCI6IikpIHsKICAgICAgICAgIHJldHVybiAndGFnJzsKICAgICAgICB9CiAgICAgICAgY3VyID0gc3RyZWFtLmN1cnJlbnQoKS50b0xvd2VyQ2FzZSgpOwogICAgICAgIHN0eWxlID0gcmVnaXN0ZXJzW2N1cl07CiAgICAgICAgcmV0dXJuIHN0eWxlIHx8IG51bGw7CiAgICAgIH0KCiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY3VzdG9tLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgc3R5bGUgPSBjdXN0b21baV0oY2gsIHN0cmVhbSwgc3RhdGUpOwogICAgICAgIGlmIChzdHlsZSkgewogICAgICAgICAgcmV0dXJuIHN0eWxlOwogICAgICAgIH0KICAgICAgfQogICAgfSwKCiAgICBsaW5lQ29tbWVudDogbGluZUNvbW1lbnRTdGFydFN5bWJvbCwKICAgIGJsb2NrQ29tbWVudFN0YXJ0OiAiLyoiLAogICAgYmxvY2tDb21tZW50RW5kOiAiKi8iCiAgfTsKfSk7Cgp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/gas/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogR2FzIG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iZ2FzLmpzIj48L3NjcmlwdD4KPHN0eWxlPi5Db2RlTWlycm9yIHtib3JkZXI6IDJweCBpbnNldCAjZGVlO308L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5HYXM8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPkdhcyBtb2RlPC9oMj4KPGZvcm0+Cjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+Ci5zeW50YXggdW5pZmllZAouZ2xvYmFsIG1haW4KCi8qIAogKiAgQQogKiAgbXVsdGktbGluZQogKiAgY29tbWVudC4KICovCgpAIEEgc2luZ2xlIGxpbmUgY29tbWVudC4KCm1haW46CiAgICAgICAgcHVzaCAgICB7c3AsIGxyfQogICAgICAgIGxkciAgICAgcjAsID1tZXNzYWdlCiAgICAgICAgYmwgICAgICBwdXRzCiAgICAgICAgbW92ICAgICByMCwgIzAKICAgICAgICBwb3AgICAgIHtzcCwgcGN9CgptZXNzYWdlOgogICAgICAgIC5hc2NpeiAiSGVsbG8gd29ybGQhPGJyIC8+Igo8L3RleHRhcmVhPgogICAgICAgIDwvZm9ybT4KCiAgICAgICAgPHNjcmlwdD4KICAgICAgICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICAgICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgICAgICAgICAgICAgbW9kZToge25hbWU6ICJnYXMiLCBhcmNoaXRlY3R1cmU6ICJBUk12NiJ9LAogICAgICAgICAgICB9KTsKICAgICAgICA8L3NjcmlwdD4KCiAgICAgICAgPHA+SGFuZGxlcyBBVCZhbXA7VCBhc3NlbWJsZXIgc3ludGF4IChtb3JlIHNwZWNpZmljYWxseSB0aGlzIGhhbmRsZXMKICAgICAgICB0aGUgR05VIEFzc2VtYmxlciAoZ2FzKSBzeW50YXguKQogICAgICAgIEl0IHRha2VzIGEgc2luZ2xlIG9wdGlvbmFsIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyOgogICAgICAgIDxjb2RlPmFyY2hpdGVjdHVyZTwvY29kZT4sIHdoaWNoIGNhbiBiZSBvbmUgb2YgPGNvZGU+IkFSTSI8L2NvZGU+LAogICAgICAgIDxjb2RlPiJBUk12NiI8L2NvZGU+IG9yIDxjb2RlPiJ4ODYiPC9jb2RlPi4KICAgICAgICBJbmNsdWRpbmcgdGhlIHBhcmFtZXRlciBhZGRzIHN5bnRheCBmb3IgdGhlIHJlZ2lzdGVycyBhbmQgc3BlY2lhbAogICAgICAgIGRpcmVjdGl2ZXMgZm9yIHRoZSBzdXBwbGllZCBhcmNoaXRlY3R1cmUuCgogICAgICAgIDxwPjxzdHJvbmc+TUlNRSB0eXBlcyBkZWZpbmVkOjwvc3Ryb25nPiA8Y29kZT50ZXh0L3gtZ2FzPC9jb2RlPjwvcD4KICAgIDwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/gfm/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/gfm/gfm.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSwgcmVxdWlyZSgiLi4vbWFya2Rvd24vbWFya2Rvd24iKSwgcmVxdWlyZSgiLi4vLi4vYWRkb24vbW9kZS9vdmVybGF5IikpOwogIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kKSAvLyBBTUQKICAgIGRlZmluZShbIi4uLy4uL2xpYi9jb2RlbWlycm9yIiwgIi4uL21hcmtkb3duL21hcmtkb3duIiwgIi4uLy4uL2FkZG9uL21vZGUvb3ZlcmxheSJdLCBtb2QpOwogIGVsc2UgLy8gUGxhaW4gYnJvd3NlciBlbnYKICAgIG1vZChDb2RlTWlycm9yKTsKfSkoZnVuY3Rpb24oQ29kZU1pcnJvcikgewoidXNlIHN0cmljdCI7CgpDb2RlTWlycm9yLmRlZmluZU1vZGUoImdmbSIsIGZ1bmN0aW9uKGNvbmZpZywgbW9kZUNvbmZpZykgewogIHZhciBjb2RlRGVwdGggPSAwOwogIGZ1bmN0aW9uIGJsYW5rTGluZShzdGF0ZSkgewogICAgc3RhdGUuY29kZSA9IGZhbHNlOwogICAgcmV0dXJuIG51bGw7CiAgfQogIHZhciBnZm1PdmVybGF5ID0gewogICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgY29kZTogZmFsc2UsCiAgICAgICAgY29kZUJsb2NrOiBmYWxzZSwKICAgICAgICBhdGVTcGFjZTogZmFsc2UKICAgICAgfTsKICAgIH0sCiAgICBjb3B5U3RhdGU6IGZ1bmN0aW9uKHMpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBjb2RlOiBzLmNvZGUsCiAgICAgICAgY29kZUJsb2NrOiBzLmNvZGVCbG9jaywKICAgICAgICBhdGVTcGFjZTogcy5hdGVTcGFjZQogICAgICB9OwogICAgfSwKICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHN0YXRlLmNvbWJpbmVUb2tlbnMgPSBudWxsOwoKICAgICAgLy8gSGFjayB0byBwcmV2ZW50IGZvcm1hdHRpbmcgb3ZlcnJpZGUgaW5zaWRlIGNvZGUgYmxvY2tzIChibG9jayBhbmQgaW5saW5lKQogICAgICBpZiAoc3RhdGUuY29kZUJsb2NrKSB7CiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXmBgYC8pKSB7CiAgICAgICAgICBzdGF0ZS5jb2RlQmxvY2sgPSBmYWxzZTsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgaWYgKHN0cmVhbS5zb2woKSkgewogICAgICAgIHN0YXRlLmNvZGUgPSBmYWxzZTsKICAgICAgfQogICAgICBpZiAoc3RyZWFtLnNvbCgpICYmIHN0cmVhbS5tYXRjaCgvXmBgYC8pKSB7CiAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICAgIHN0YXRlLmNvZGVCbG9jayA9IHRydWU7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgLy8gSWYgdGhpcyBibG9jayBpcyBjaGFuZ2VkLCBpdCBtYXkgbmVlZCB0byBiZSB1cGRhdGVkIGluIE1hcmtkb3duIG1vZGUKICAgICAgaWYgKHN0cmVhbS5wZWVrKCkgPT09ICdgJykgewogICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgdmFyIGJlZm9yZSA9IHN0cmVhbS5wb3M7CiAgICAgICAgc3RyZWFtLmVhdFdoaWxlKCdgJyk7CiAgICAgICAgdmFyIGRpZmZlcmVuY2UgPSAxICsgc3RyZWFtLnBvcyAtIGJlZm9yZTsKICAgICAgICBpZiAoIXN0YXRlLmNvZGUpIHsKICAgICAgICAgIGNvZGVEZXB0aCA9IGRpZmZlcmVuY2U7CiAgICAgICAgICBzdGF0ZS5jb2RlID0gdHJ1ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKGRpZmZlcmVuY2UgPT09IGNvZGVEZXB0aCkgeyAvLyBNdXN0IGJlIGV4YWN0CiAgICAgICAgICAgIHN0YXRlLmNvZGUgPSBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0gZWxzZSBpZiAoc3RhdGUuY29kZSkgewogICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgLy8gQ2hlY2sgaWYgc3BhY2UuIElmIHNvLCBsaW5rcyBjYW4gYmUgZm9ybWF0dGVkIGxhdGVyIG9uCiAgICAgIGlmIChzdHJlYW0uZWF0U3BhY2UoKSkgewogICAgICAgIHN0YXRlLmF0ZVNwYWNlID0gdHJ1ZTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBpZiAoc3RyZWFtLnNvbCgpIHx8IHN0YXRlLmF0ZVNwYWNlKSB7CiAgICAgICAgc3RhdGUuYXRlU3BhY2UgPSBmYWxzZTsKICAgICAgICBpZihzdHJlYW0ubWF0Y2goL14oPzpbYS16QS1aMC05XC1fXStcLyk/KD86W2EtekEtWjAtOVwtX10rQCk/KD86W2EtZjAtOV17Nyw0MH1cYikvKSkgewogICAgICAgICAgLy8gVXNlci9Qcm9qZWN0QFNIQQogICAgICAgICAgLy8gVXNlckBTSEEKICAgICAgICAgIC8vIFNIQQogICAgICAgICAgc3RhdGUuY29tYmluZVRva2VucyA9IHRydWU7CiAgICAgICAgICByZXR1cm4gImxpbmsiOwogICAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLm1hdGNoKC9eKD86W2EtekEtWjAtOVwtX10rXC8pPyg/OlthLXpBLVowLTlcLV9dKyk/I1swLTldK1xiLykpIHsKICAgICAgICAgIC8vIFVzZXIvUHJvamVjdCNOdW0KICAgICAgICAgIC8vIFVzZXIjTnVtCiAgICAgICAgICAvLyAjTnVtCiAgICAgICAgICBzdGF0ZS5jb21iaW5lVG9rZW5zID0gdHJ1ZTsKICAgICAgICAgIHJldHVybiAibGluayI7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChzdHJlYW0ubWF0Y2goL14oKD86W2Etel1bXHctXSs6KD86XC97MSwzfXxbYS16MC05JV0pfHd3d1xkezAsM31bLl18W2EtejAtOS5cLV0rWy5dW2Etel17Miw0fVwvKSg/OlteXHMoKTw+XXxcKFteXHMoKTw+XSpcKSkrKD86XChbXlxzKCk8Pl0qXCl8W15cc2AqISgpXFtcXXt9OzonIi4sPD4/wqvCu+KAnOKAneKAmOKAmV0pKS9pKSAmJgogICAgICAgICBzdHJlYW0uc3RyaW5nLnNsaWNlKHN0cmVhbS5zdGFydCAtIDIsIHN0cmVhbS5zdGFydCkgIT0gIl0oIikgewogICAgICAgIC8vIFVSTHMKICAgICAgICAvLyBUYWtlbiBmcm9tIGh0dHA6Ly9kYXJpbmdmaXJlYmFsbC5uZXQvMjAxMC8wNy9pbXByb3ZlZF9yZWdleF9mb3JfbWF0Y2hpbmdfdXJscwogICAgICAgIC8vIEFuZCB0aGVuIChpc3N1ZSAjMTE2MCkgc2ltcGxpZmllZCB0byBtYWtlIGl0IG5vdCBjcmFzaCB0aGUgQ2hyb21lIFJlZ2V4cCBlbmdpbmUKICAgICAgICBzdGF0ZS5jb21iaW5lVG9rZW5zID0gdHJ1ZTsKICAgICAgICByZXR1cm4gImxpbmsiOwogICAgICB9CiAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgIHJldHVybiBudWxsOwogICAgfSwKICAgIGJsYW5rTGluZTogYmxhbmtMaW5lCiAgfTsKCiAgdmFyIG1hcmtkb3duQ29uZmlnID0gewogICAgdW5kZXJzY29yZXNCcmVha1dvcmRzOiBmYWxzZSwKICAgIHRhc2tMaXN0czogdHJ1ZSwKICAgIGZlbmNlZENvZGVCbG9ja3M6IHRydWUKICB9OwogIGZvciAodmFyIGF0dHIgaW4gbW9kZUNvbmZpZykgewogICAgbWFya2Rvd25Db25maWdbYXR0cl0gPSBtb2RlQ29uZmlnW2F0dHJdOwogIH0KICBtYXJrZG93bkNvbmZpZy5uYW1lID0gIm1hcmtkb3duIjsKICBDb2RlTWlycm9yLmRlZmluZU1JTUUoImdmbUJhc2UiLCBtYXJrZG93bkNvbmZpZyk7CiAgcmV0dXJuIENvZGVNaXJyb3Iub3ZlcmxheU1vZGUoQ29kZU1pcnJvci5nZXRNb2RlKGNvbmZpZywgImdmbUJhc2UiKSwgZ2ZtT3ZlcmxheSk7Cn0sICJtYXJrZG93biIpOwoKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/gfm/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogR0ZNIG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vLi4vYWRkb24vbW9kZS9vdmVybGF5LmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL3htbC94bWwuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vbWFya2Rvd24vbWFya2Rvd24uanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iZ2ZtLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL2phdmFzY3JpcHQvamF2YXNjcmlwdC5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9jc3MvY3NzLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL2h0bWxtaXhlZC9odG1sbWl4ZWQuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vY2xpa2UvY2xpa2UuanMiPjwvc2NyaXB0Pgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPi5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazt9PC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aW1nIGlkPWxvZ28gc3JjPSIuLi8uLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5MYW5ndWFnZSBtb2RlczwvYT4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+R0ZNPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5HRk0gbW9kZTwvaDI+Cjxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+CkdpdEh1YiBGbGF2b3JlZCBNYXJrZG93bgo9PT09PT09PT09PT09PT09PT09PT09PT0KCkV2ZXJ5dGhpbmcgZnJvbSBtYXJrZG93biBwbHVzIEdGTSBmZWF0dXJlczoKCiMjIFVSTCBhdXRvbGlua2luZwoKVW5kZXJzY29yZXNfYXJlX2FsbG93ZWRfYmV0d2Vlbl93b3Jkcy4KCiMjIEZlbmNlZCBjb2RlIGJsb2NrcyAoYW5kIHN5bnRheCBoaWdobGlnaHRpbmcpCgpgYGBqYXZhc2NyaXB0CmZvciAodmFyIGkgPSAwOyBpICZsdDsgaXRlbXMubGVuZ3RoOyBpKyspIHsKICAgIGNvbnNvbGUubG9nKGl0ZW1zW2ldLCBpKTsgLy8gbG9nIHRoZW0KfQpgYGAKCiMjIFRhc2sgTGlzdHMKCi0gWyBdIEluY29tcGxldGUgdGFzayBsaXN0IGl0ZW0KLSBbeF0gKipDb21wbGV0ZWQqKiB0YXNrIGxpc3QgaXRlbQoKIyMgQSBiaXQgb2YgR2l0SHViIHNwaWNlCgoqIFNIQTogYmU2YThjYzFjMWVjZmU5NDg5ZmI1MWU0ODY5YWYxNWExM2ZjMmNkMgoqIFVzZXJAU0hBIHJlZjogbW9qb21ib0BiZTZhOGNjMWMxZWNmZTk0ODlmYjUxZTQ4NjlhZjE1YTEzZmMyY2QyCiogVXNlci9Qcm9qZWN0QFNIQTogbW9qb21iby9nb2RAYmU2YThjYzFjMWVjZmU5NDg5ZmI1MWU0ODY5YWYxNWExM2ZjMmNkMgoqIFwjTnVtOiAjMQoqIFVzZXIvI051bTogbW9qb21ibyMxCiogVXNlci9Qcm9qZWN0I051bTogbW9qb21iby9nb2QjMQoKU2VlIGh0dHA6Ly9naXRodWIuZ2l0aHViLmNvbS9naXRodWItZmxhdm9yZWQtbWFya2Rvd24vLgoKPC90ZXh0YXJlYT48L2Zvcm0+CgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICBtb2RlOiAnZ2ZtJywKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgICAgICB0aGVtZTogImRlZmF1bHQiCiAgICAgIH0pOwogICAgPC9zY3JpcHQ+CgogICAgPHA+T3B0aW9uYWxseSBkZXBlbmRzIG9uIG90aGVyIG1vZGVzIGZvciBwcm9wZXJseSBoaWdobGlnaHRlZCBjb2RlIGJsb2Nrcy48L3A+CgogICAgPHA+PHN0cm9uZz5QYXJzaW5nL0hpZ2hsaWdodGluZyBUZXN0czo8L3N0cm9uZz4gPGEgaHJlZj0iLi4vLi4vdGVzdC9pbmRleC5odG1sI2dmbV8qIj5ub3JtYWw8L2E+LCAgPGEgaHJlZj0iLi4vLi4vdGVzdC9pbmRleC5odG1sI3ZlcmJvc2UsZ2ZtXyoiPnZlcmJvc2U8L2E+LjwvcD4KCiAgPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/gfm/test.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24oKSB7CiAgdmFyIG1vZGUgPSBDb2RlTWlycm9yLmdldE1vZGUoe3RhYlNpemU6IDR9LCAiZ2ZtIik7CiAgZnVuY3Rpb24gTVQobmFtZSkgeyB0ZXN0Lm1vZGUobmFtZSwgbW9kZSwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7IH0KICB2YXIgbW9kZUhpZ2hsaWdodEZvcm1hdHRpbmcgPSBDb2RlTWlycm9yLmdldE1vZGUoe3RhYlNpemU6IDR9LCB7bmFtZTogImdmbSIsIGhpZ2hsaWdodEZvcm1hdHRpbmc6IHRydWV9KTsKICBmdW5jdGlvbiBGVChuYW1lKSB7IHRlc3QubW9kZShuYW1lLCBtb2RlSGlnaGxpZ2h0Rm9ybWF0dGluZywgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7IH0KCiAgRlQoImNvZGVCYWNrdGlja3MiLAogICAgICJbY29tbWVudCZmb3JtYXR0aW5nJmZvcm1hdHRpbmctY29kZSBgXVtjb21tZW50IGZvb11bY29tbWVudCZmb3JtYXR0aW5nJmZvcm1hdHRpbmctY29kZSBgXSIpOwoKICBGVCgiZG91YmxlQmFja3RpY2tzIiwKICAgICAiW2NvbW1lbnQmZm9ybWF0dGluZyZmb3JtYXR0aW5nLWNvZGUgYGBdW2NvbW1lbnQgZm9vIGAgYmFyXVtjb21tZW50JmZvcm1hdHRpbmcmZm9ybWF0dGluZy1jb2RlIGBgXSIpOwoKICBGVCgiY29kZUJsb2NrIiwKICAgICAiW2NvbW1lbnQmZm9ybWF0dGluZyZmb3JtYXR0aW5nLWNvZGUtYmxvY2sgYGBgY3NzXSIsCiAgICAgIlt0YWcgZm9vXSIsCiAgICAgIltjb21tZW50JmZvcm1hdHRpbmcmZm9ybWF0dGluZy1jb2RlLWJsb2NrIGBgYF0iKTsKCiAgRlQoInRhc2tMaXN0IiwKICAgICAiW3ZhcmlhYmxlLTImZm9ybWF0dGluZyZmb3JtYXR0aW5nLWxpc3QmZm9ybWF0dGluZy1saXN0LXVsIC0gXVttZXRhJmZvcm1hdHRpbmcmZm9ybWF0dGluZy10YXNrIFsgXV1dW3ZhcmlhYmxlLTIgIGZvb10iLAogICAgICJbdmFyaWFibGUtMiZmb3JtYXR0aW5nJmZvcm1hdHRpbmctbGlzdCZmb3JtYXR0aW5nLWxpc3QtdWwgLSBdW3Byb3BlcnR5JmZvcm1hdHRpbmcmZm9ybWF0dGluZy10YXNrIFt4XV1dW3ZhcmlhYmxlLTIgIGZvb10iKTsKCiAgTVQoImVtSW5Xb3JkQXN0ZXJpc2siLAogICAgICJmb29bZW0gKmJhcipdaGVsbG8iKTsKCiAgTVQoImVtSW5Xb3JkVW5kZXJzY29yZSIsCiAgICAgImZvb19iYXJfaGVsbG8iKTsKCiAgTVQoImVtU3Ryb25nVW5kZXJzY29yZSIsCiAgICAgIltzdHJvbmcgX19dW2VtJnN0cm9uZyBfZm9vX19dW2VtIF9dIGJhciIpOwoKICBNVCgiZmVuY2VkQ29kZUJsb2NrcyIsCiAgICAgIltjb21tZW50IGBgYF0iLAogICAgICJbY29tbWVudCBmb29dIiwKICAgICAiIiwKICAgICAiW2NvbW1lbnQgYGBgXSIsCiAgICAgImJhciIpOwoKICBNVCgiZmVuY2VkQ29kZUJsb2NrTW9kZVN3aXRjaGluZyIsCiAgICAgIltjb21tZW50IGBgYGphdmFzY3JpcHRdIiwKICAgICAiW3ZhcmlhYmxlIGZvb10iLAogICAgICIiLAogICAgICJbY29tbWVudCBgYGBdIiwKICAgICAiYmFyIik7CgogIE1UKCJ0YXNrTGlzdEFzdGVyaXNrIiwKICAgICAiW3ZhcmlhYmxlLTIgKiBbXV0gZm9vXSIsIC8vIEludmFsaWQ7IG11c3QgaGF2ZSBzcGFjZSBvciB4IGJldHdlZW4gW10KICAgICAiW3ZhcmlhYmxlLTIgKiBbIF1dYmFyXSIsIC8vIEludmFsaWQ7IG11c3QgaGF2ZSBzcGFjZSBhZnRlciBdCiAgICAgIlt2YXJpYWJsZS0yICogW3hdXWhlbGxvXSIsIC8vIEludmFsaWQ7IG11c3QgaGF2ZSBzcGFjZSBhZnRlciBdCiAgICAgIlt2YXJpYWJsZS0yICogXVttZXRhIFsgXV1dW3ZhcmlhYmxlLTIgIFt3b3JsZF1dXSIsIC8vIFZhbGlkOyB0ZXN0cyByZWZlcmVuY2Ugc3R5bGUgbGlua3MKICAgICAiICAgIFt2YXJpYWJsZS0zICogXVtwcm9wZXJ0eSBbeF1dXVt2YXJpYWJsZS0zICBmb29dIik7IC8vIFZhbGlkOyBjYW4gYmUgbmVzdGVkCgogIE1UKCJ0YXNrTGlzdFBsdXMiLAogICAgICJbdmFyaWFibGUtMiArIFtdXSBmb29dIiwgLy8gSW52YWxpZDsgbXVzdCBoYXZlIHNwYWNlIG9yIHggYmV0d2VlbiBbXQogICAgICJbdmFyaWFibGUtMiArIFsgXV1iYXJdIiwgLy8gSW52YWxpZDsgbXVzdCBoYXZlIHNwYWNlIGFmdGVyIF0KICAgICAiW3ZhcmlhYmxlLTIgKyBbeF1daGVsbG9dIiwgLy8gSW52YWxpZDsgbXVzdCBoYXZlIHNwYWNlIGFmdGVyIF0KICAgICAiW3ZhcmlhYmxlLTIgKyBdW21ldGEgWyBdXV1bdmFyaWFibGUtMiAgW3dvcmxkXV1dIiwgLy8gVmFsaWQ7IHRlc3RzIHJlZmVyZW5jZSBzdHlsZSBsaW5rcwogICAgICIgICAgW3ZhcmlhYmxlLTMgKyBdW3Byb3BlcnR5IFt4XV1dW3ZhcmlhYmxlLTMgIGZvb10iKTsgLy8gVmFsaWQ7IGNhbiBiZSBuZXN0ZWQKCiAgTVQoInRhc2tMaXN0RGFzaCIsCiAgICAgIlt2YXJpYWJsZS0yIC0gW11dIGZvb10iLCAvLyBJbnZhbGlkOyBtdXN0IGhhdmUgc3BhY2Ugb3IgeCBiZXR3ZWVuIFtdCiAgICAgIlt2YXJpYWJsZS0yIC0gWyBdXWJhcl0iLCAvLyBJbnZhbGlkOyBtdXN0IGhhdmUgc3BhY2UgYWZ0ZXIgXQogICAgICJbdmFyaWFibGUtMiAtIFt4XV1oZWxsb10iLCAvLyBJbnZhbGlkOyBtdXN0IGhhdmUgc3BhY2UgYWZ0ZXIgXQogICAgICJbdmFyaWFibGUtMiAtIF1bbWV0YSBbIF1dXVt2YXJpYWJsZS0yICBbd29ybGRdXV0iLCAvLyBWYWxpZDsgdGVzdHMgcmVmZXJlbmNlIHN0eWxlIGxpbmtzCiAgICAgIiAgICBbdmFyaWFibGUtMyAtIF1bcHJvcGVydHkgW3hdXV1bdmFyaWFibGUtMyAgZm9vXSIpOyAvLyBWYWxpZDsgY2FuIGJlIG5lc3RlZAoKICBNVCgidGFza0xpc3ROdW1iZXIiLAogICAgICJbdmFyaWFibGUtMiAxLiBbXV0gZm9vXSIsIC8vIEludmFsaWQ7IG11c3QgaGF2ZSBzcGFjZSBvciB4IGJldHdlZW4gW10KICAgICAiW3ZhcmlhYmxlLTIgMi4gWyBdXWJhcl0iLCAvLyBJbnZhbGlkOyBtdXN0IGhhdmUgc3BhY2UgYWZ0ZXIgXQogICAgICJbdmFyaWFibGUtMiAzLiBbeF1daGVsbG9dIiwgLy8gSW52YWxpZDsgbXVzdCBoYXZlIHNwYWNlIGFmdGVyIF0KICAgICAiW3ZhcmlhYmxlLTIgNC4gXVttZXRhIFsgXV1dW3ZhcmlhYmxlLTIgIFt3b3JsZF1dXSIsIC8vIFZhbGlkOyB0ZXN0cyByZWZlcmVuY2Ugc3R5bGUgbGlua3MKICAgICAiICAgIFt2YXJpYWJsZS0zIDEuIF1bcHJvcGVydHkgW3hdXV1bdmFyaWFibGUtMyAgZm9vXSIpOyAvLyBWYWxpZDsgY2FuIGJlIG5lc3RlZAoKICBNVCgiU0hBIiwKICAgICAiZm9vIFtsaW5rIGJlNmE4Y2MxYzFlY2ZlOTQ4OWZiNTFlNDg2OWFmMTVhMTNmYzJjZDJdIGJhciIpOwoKICBNVCgiU0hBRW1waGFzaXMiLAogICAgICJbZW0gKmZvbyBdW2VtJmxpbmsgYmU2YThjYzFjMWVjZmU5NDg5ZmI1MWU0ODY5YWYxNWExM2ZjMmNkMl1bZW0gKl0iKTsKCiAgTVQoInNob3J0U0hBIiwKICAgICAiZm9vIFtsaW5rIGJlNmE4Y2NdIGJhciIpOwoKICBNVCgidG9vU2hvcnRTSEEiLAogICAgICJmb28gYmU2YThjIGJhciIpOwoKICBNVCgibG9uZ1NIQSIsCiAgICAgImZvbyBiZTZhOGNjMWMxZWNmZTk0ODlmYjUxZTQ4NjlhZjE1YTEzZmMyY2QyMiBiYXIiKTsKCiAgTVQoImJhZFNIQSIsCiAgICAgImZvbyBiZTZhOGNjMWMxZWNmZTk0ODlmYjUxZTQ4NjlhZjE1YTEzZmMyY2cyIGJhciIpOwoKICBNVCgidXNlclNIQSIsCiAgICAgImZvbyBbbGluayBiYXJAYmU2YThjYzFjMWVjZmU5NDg5ZmI1MWU0ODY5YWYxNWExM2ZjMmNkMl0gaGVsbG8iKTsKCiAgTVQoInVzZXJTSEFFbXBoYXNpcyIsCiAgICAgIltlbSAqZm9vIF1bZW0mbGluayBiYXJAYmU2YThjYzFjMWVjZmU5NDg5ZmI1MWU0ODY5YWYxNWExM2ZjMmNkMl1bZW0gKl0iKTsKCiAgTVQoInVzZXJQcm9qZWN0U0hBIiwKICAgICAiZm9vIFtsaW5rIGJhci9oZWxsb0BiZTZhOGNjMWMxZWNmZTk0ODlmYjUxZTQ4NjlhZjE1YTEzZmMyY2QyXSB3b3JsZCIpOwoKICBNVCgidXNlclByb2plY3RTSEFFbXBoYXNpcyIsCiAgICAgIltlbSAqZm9vIF1bZW0mbGluayBiYXIvaGVsbG9AYmU2YThjYzFjMWVjZmU5NDg5ZmI1MWU0ODY5YWYxNWExM2ZjMmNkMl1bZW0gKl0iKTsKCiAgTVQoIm51bSIsCiAgICAgImZvbyBbbGluayAjMV0gYmFyIik7CgogIE1UKCJudW1FbXBoYXNpcyIsCiAgICAgIltlbSAqZm9vIF1bZW0mbGluayAjMV1bZW0gKl0iKTsKCiAgTVQoImJhZE51bSIsCiAgICAgImZvbyAjMWJhciBoZWxsbyIpOwoKICBNVCgidXNlck51bSIsCiAgICAgImZvbyBbbGluayBiYXIjMV0gaGVsbG8iKTsKCiAgTVQoInVzZXJOdW1FbXBoYXNpcyIsCiAgICAgIltlbSAqZm9vIF1bZW0mbGluayBiYXIjMV1bZW0gKl0iKTsKCiAgTVQoInVzZXJQcm9qZWN0TnVtIiwKICAgICAiZm9vIFtsaW5rIGJhci9oZWxsbyMxXSB3b3JsZCIpOwoKICBNVCgidXNlclByb2plY3ROdW1FbXBoYXNpcyIsCiAgICAgIltlbSAqZm9vIF1bZW0mbGluayBiYXIvaGVsbG8jMV1bZW0gKl0iKTsKCiAgTVQoInZhbmlsbGFMaW5rIiwKICAgICAiZm9vIFtsaW5rIGh0dHA6Ly93d3cuZXhhbXBsZS5jb20vXSBiYXIiKTsKCiAgTVQoInZhbmlsbGFMaW5rUHVuY3R1YXRpb24iLAogICAgICJmb28gW2xpbmsgaHR0cDovL3d3dy5leGFtcGxlLmNvbS9dLiBiYXIiKTsKCiAgTVQoInZhbmlsbGFMaW5rRXh0ZW5zaW9uIiwKICAgICAiZm9vIFtsaW5rIGh0dHA6Ly93d3cuZXhhbXBsZS5jb20vaW5kZXguaHRtbF0gYmFyIik7CgogIE1UKCJ2YW5pbGxhTGlua0VtcGhhc2lzIiwKICAgICAiZm9vIFtlbSAqXVtlbSZsaW5rIGh0dHA6Ly93d3cuZXhhbXBsZS5jb20vaW5kZXguaHRtbF1bZW0gKl0gYmFyIik7CgogIE1UKCJub3RBTGluayIsCiAgICAgIltjb21tZW50IGBgYGNzc10iLAogICAgICJbdGFnIGZvb10ge1twcm9wZXJ0eSBjb2xvcl06W2tleXdvcmQgYmxhY2tdO30iLAogICAgICJbY29tbWVudCBgYGBdW2xpbmsgaHR0cDovL3d3dy5leGFtcGxlLmNvbS9dIik7CgogIE1UKCJub3RBTGluayIsCiAgICAgIltjb21tZW50IGBgZm9vIGBiYXJgIGh0dHA6Ly93d3cuZXhhbXBsZS5jb20vYGBdIGhlbGxvIik7CgogIE1UKCJub3RBTGluayIsCiAgICAgIltjb21tZW50IGBmb29dIiwKICAgICAiW2xpbmsgaHR0cDovL3d3dy5leGFtcGxlLmNvbS9dIiwKICAgICAiW2NvbW1lbnQgYGZvb10iLAogICAgICIiLAogICAgICJbbGluayBodHRwOi8vd3d3LmV4YW1wbGUuY29tL10iKTsKfSkoKTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/gherkin/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/gherkin/gherkin.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovKgpHaGVya2luIG1vZGUgLSBodHRwOi8vd3d3LmN1a2VzLmluZm8vClJlcG9ydCBidWdzL2lzc3VlcyBoZXJlOiBodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9Db2RlTWlycm9yL2lzc3VlcwoqLwoKLy8gRm9sbG93aW5nIE9ianMgZnJvbSBCcmFja2V0cyBpbXBsZW1lbnRhdGlvbjogaHR0cHM6Ly9naXRodWIuY29tL3RyZWd1c3RpL2JyYWNrZXRzLWdoZXJraW4vYmxvYi9tYXN0ZXIvbWFpbi5qcwovL3ZhciBRdW90ZXMgPSB7Ci8vICBTSU5HTEU6IDEsCi8vICBET1VCTEU6IDIKLy99OwoKLy92YXIgcmVnZXggPSB7Ci8vICBrZXl3b3JkczogLyhGZWF0dXJlfCB7Mn0oU2NlbmFyaW98SW4gb3JkZXIgdG98QXN8SSl8IHs0fShHaXZlbnxXaGVufFRoZW58QW5kKSkvCi8vfTsKCihmdW5jdGlvbihtb2QpIHsKICBpZiAodHlwZW9mIGV4cG9ydHMgPT0gIm9iamVjdCIgJiYgdHlwZW9mIG1vZHVsZSA9PSAib2JqZWN0IikgLy8gQ29tbW9uSlMKICAgIG1vZChyZXF1aXJlKCIuLi8uLi9saWIvY29kZW1pcnJvciIpKTsKICBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCkgLy8gQU1ECiAgICBkZWZpbmUoWyIuLi8uLi9saWIvY29kZW1pcnJvciJdLCBtb2QpOwogIGVsc2UgLy8gUGxhaW4gYnJvd3NlciBlbnYKICAgIG1vZChDb2RlTWlycm9yKTsKfSkoZnVuY3Rpb24oQ29kZU1pcnJvcikgewoidXNlIHN0cmljdCI7CgpDb2RlTWlycm9yLmRlZmluZU1vZGUoImdoZXJraW4iLCBmdW5jdGlvbiAoKSB7CiAgcmV0dXJuIHsKICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uICgpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBsaW5lTnVtYmVyOiAwLAogICAgICAgIHRhYmxlSGVhZGVyTGluZTogZmFsc2UsCiAgICAgICAgYWxsb3dGZWF0dXJlOiB0cnVlLAogICAgICAgIGFsbG93QmFja2dyb3VuZDogZmFsc2UsCiAgICAgICAgYWxsb3dTY2VuYXJpbzogZmFsc2UsCiAgICAgICAgYWxsb3dTdGVwczogZmFsc2UsCiAgICAgICAgYWxsb3dQbGFjZWhvbGRlcnM6IGZhbHNlLAogICAgICAgIGFsbG93TXVsdGlsaW5lQXJndW1lbnQ6IGZhbHNlLAogICAgICAgIGluTXVsdGlsaW5lU3RyaW5nOiBmYWxzZSwKICAgICAgICBpbk11bHRpbGluZVRhYmxlOiBmYWxzZSwKICAgICAgICBpbktleXdvcmRMaW5lOiBmYWxzZQogICAgICB9OwogICAgfSwKICAgIHRva2VuOiBmdW5jdGlvbiAoc3RyZWFtLCBzdGF0ZSkgewogICAgICBpZiAoc3RyZWFtLnNvbCgpKSB7CiAgICAgICAgc3RhdGUubGluZU51bWJlcisrOwogICAgICAgIHN0YXRlLmluS2V5d29yZExpbmUgPSBmYWxzZTsKICAgICAgICBpZiAoc3RhdGUuaW5NdWx0aWxpbmVUYWJsZSkgewogICAgICAgICAgICBzdGF0ZS50YWJsZUhlYWRlckxpbmUgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKCFzdHJlYW0ubWF0Y2goL1xzKlx8LywgZmFsc2UpKSB7CiAgICAgICAgICAgICAgc3RhdGUuYWxsb3dNdWx0aWxpbmVBcmd1bWVudCA9IGZhbHNlOwogICAgICAgICAgICAgIHN0YXRlLmluTXVsdGlsaW5lVGFibGUgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgc3RyZWFtLmVhdFNwYWNlKCk7CgogICAgICBpZiAoc3RhdGUuYWxsb3dNdWx0aWxpbmVBcmd1bWVudCkgewoKICAgICAgICAvLyBTVFJJTkcKICAgICAgICBpZiAoc3RhdGUuaW5NdWx0aWxpbmVTdHJpbmcpIHsKICAgICAgICAgIGlmIChzdHJlYW0ubWF0Y2goJyIiIicpKSB7CiAgICAgICAgICAgIHN0YXRlLmluTXVsdGlsaW5lU3RyaW5nID0gZmFsc2U7CiAgICAgICAgICAgIHN0YXRlLmFsbG93TXVsdGlsaW5lQXJndW1lbnQgPSBmYWxzZTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHN0cmVhbS5tYXRjaCgvLiovKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiAic3RyaW5nIjsKICAgICAgICB9CgogICAgICAgIC8vIFRBQkxFCiAgICAgICAgaWYgKHN0YXRlLmluTXVsdGlsaW5lVGFibGUpIHsKICAgICAgICAgIGlmIChzdHJlYW0ubWF0Y2goL1x8XHMqLykpIHsKICAgICAgICAgICAgcmV0dXJuICJicmFja2V0IjsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHN0cmVhbS5tYXRjaCgvW15cfF0qLyk7CiAgICAgICAgICAgIHJldHVybiBzdGF0ZS50YWJsZUhlYWRlckxpbmUgPyAiaGVhZGVyIiA6ICJzdHJpbmciOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gREVURUNUIFNUQVJUCiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgnIiIiJykpIHsKICAgICAgICAgIC8vIFN0cmluZwogICAgICAgICAgc3RhdGUuaW5NdWx0aWxpbmVTdHJpbmcgPSB0cnVlOwogICAgICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLm1hdGNoKCJ8IikpIHsKICAgICAgICAgIC8vIFRhYmxlCiAgICAgICAgICBzdGF0ZS5pbk11bHRpbGluZVRhYmxlID0gdHJ1ZTsKICAgICAgICAgIHN0YXRlLnRhYmxlSGVhZGVyTGluZSA9IHRydWU7CiAgICAgICAgICByZXR1cm4gImJyYWNrZXQiOwogICAgICAgIH0KCiAgICAgIH0KCiAgICAgIC8vIExJTkUgQ09NTUVOVAogICAgICBpZiAoc3RyZWFtLm1hdGNoKC8jLiovKSkgewogICAgICAgIHJldHVybiAiY29tbWVudCI7CgogICAgICAvLyBUQUcKICAgICAgfSBlbHNlIGlmICghc3RhdGUuaW5LZXl3b3JkTGluZSAmJiBzdHJlYW0ubWF0Y2goL0BcUysvKSkgewogICAgICAgIHJldHVybiAidGFnIjsKCiAgICAgIC8vIEZFQVRVUkUKICAgICAgfSBlbHNlIGlmICghc3RhdGUuaW5LZXl3b3JkTGluZSAmJiBzdGF0ZS5hbGxvd0ZlYXR1cmUgJiYgc3RyZWFtLm1hdGNoKC8o5qmf6IO9fOWKn+iDvXzjg5XjgqPjg7zjg4Hjg6N86riw64qlfOC5guC4hOC4o+C4h+C4q+C4peC4seC4gXzguITguKfguLLguKHguKrguLLguKHguLLguKPguJZ84LiE4Lin4Liy4Lih4LiV4LmJ4Lit4LiH4LiB4Liy4Lij4LiX4Liy4LiH4LiY4Li44Lij4LiB4Li04LiIfOCyueCzhuCymuCzjeCymuCys3zgsJfgsYHgsKPgsK7gsYF84Kiu4KmB4Ki54Ki+4KiC4Kim4Kiw4Ki+fOCoqOColeCotiDgqKjgqYHgqLngqL7gqLB84KiW4Ki+4Ki44KmA4KiF4KikfOCksOClguCkqiDgpLLgpYfgpJZ82YjZkNuM2pjar9uMfNiu2KfYtdmK2Kl816rXm9eV16DXlHzQpNGD0L3QutGG0ZbQvtC90LDQu3zQpNGD0L3QutGG0LjRj3zQpNGD0L3QutGG0LjQvtC90LDQu9C90L7RgdGCfNCk0YPQvdC60YbQuNC+0L3QsNC7fNKu0LfQtdC90YfTmdC70LXQutC70LXQu9C10Lp80KHQstC+0LnRgdGC0LLQvnzQntGB0L7QsdC40L3QsHzQnNOp0LzQutC40L3Qu9C10Lp80JzQvtCz0YPRm9C90L7RgdGCfM6bzrXOuc+Ezr/Phc+BzrPOr86xfM6Uz4XOvc6xz4TPjM+EzrfPhM6xfFfFgmHFm2Npd2/Fm8SHfFZsYXN0bm9zxaV8VHJhanRvfFTDrW5oIG7Eg25nfFNhdnlixJd8UHJldHR5IG11Y2h8UG/FvmlhZGF2a2F8UG/FvmFkYXZla3xQb3RyemViYSBiaXpuZXNvd2F8w5Z6ZWxsaWt8T3NvYmluYXxPbWluYWlzdXVzfE9tYWR1c3xPSCBIQUl8TW9ndcSHbm9zdHxNb2d1Y25vc3R8SmVsbGVtesWRfEh3w6Z0fEh3YWV0fEZ1bnppb25hbGl0w6B8RnVua3Rpb25hbGl0w6lpdHxGdW5rdGlvbmFsaXTDpHR8RnVua2NqYXxGdW5rY2lvbmFsbm9zdHxGdW5rY2lvbmFsaXTEgXRlfEZ1bmtjaWF8RnVuZ3NpfEZ1bmN0aW9uYWxpdGVpdHxGdW5jyJtpb25hbGl0YXRlfEZ1bmPFo2lvbmFsaXRhdGV8RnVuY3Rpb25hbGl0YXRlfEZ1bmNpb25hbGl0YXR8RnVuY2lvbmFsaWRhZGV8Rm9uY3Rpb25uYWxpdMOpfEZpdHVyfEbEq8SNYXxGZWF0dXJlfEVpZ2lubGVpa2l8RWdlbnNrYXB8RWdlbnNrYWJ8Q2FyYWN0ZXLDrXN0aWNhfENhcmFjdGVyaXN0aWNhfEJ1c2luZXNzIE5lZWR8QXNwZWt0fEFyd2VkZHxBaG95IG1hdGV5IXxBYmlsaXR5KTovKSkgewogICAgICAgIHN0YXRlLmFsbG93U2NlbmFyaW8gPSB0cnVlOwogICAgICAgIHN0YXRlLmFsbG93QmFja2dyb3VuZCA9IHRydWU7CiAgICAgICAgc3RhdGUuYWxsb3dQbGFjZWhvbGRlcnMgPSBmYWxzZTsKICAgICAgICBzdGF0ZS5hbGxvd1N0ZXBzID0gZmFsc2U7CiAgICAgICAgc3RhdGUuYWxsb3dNdWx0aWxpbmVBcmd1bWVudCA9IGZhbHNlOwogICAgICAgIHN0YXRlLmluS2V5d29yZExpbmUgPSB0cnVlOwogICAgICAgIHJldHVybiAia2V5d29yZCI7CgogICAgICAvLyBCQUNLR1JPVU5ECiAgICAgIH0gZWxzZSBpZiAoIXN0YXRlLmluS2V5d29yZExpbmUgJiYgc3RhdGUuYWxsb3dCYWNrZ3JvdW5kICYmIHN0cmVhbS5tYXRjaCgvKOiDjOaZr3zrsLDqsr184LmB4LiZ4Lin4LiE4Li04LiUfOCyueCyv+CyqOCzjeCyqOCzhuCysuCzhnzgsKjgsYfgsKrgsKXgsY3gsK/gsIJ84Kiq4Ki/4Kib4KmL4KiV4KmcfOCkquClg+Ckt+CljeCkoOCkreClguCkruCkv3zYstmF24zZhtmHfNin2YTYrtmE2YHZitipfNeo16fXonzQotCw0YDQuNGFfNCf0YDQtdC00YvRgdGC0L7RgNC40Y980J/RgNC10LTQuNGB0YLQvtGA0LjRj3zQn9C+0LfQsNC00LjQvdCwfNCf0LXRgNC10LTRg9C80L7QstCwfNCe0YHQvdC+0LLQsHzQmtC+0L3RgtC10LrRgdGCfNCa0LXRgNC10Yh8zqXPgM+MzrLOsc64z4HOv3xaYcWCb8W8ZW5pYXxZb1wtaG9cLWhvfFRhdXN0YXxUYXVzdHxTaXR1xIFjaWphfFJlcmVmb25zfFBvemFkaW5hfFBvemFkaWV8UG96YWTDrXxPc25vdmF8TGF0YXIgQmVsYWthbmd8S29udGV4dHxLb250ZWtzdHN8S29udGVrc3Rhc3xLb250ZWtzdHxIw6F0dMOpcnxIYW5uZXJncm9uZHxHcnVuZGxhZ2V8R2XDp21pxZ98RnVuZG98Rm9ub3xGaXJzdCBvZmZ8RGlzIGlzIHdoYXQgd2VudCBkb3dufERhc2FyfENvbnRleHRvfENvbnRleHRlfENvbnRleHR8Q29udGVzdG98Q2Vuw6FyaW8gZGUgRnVuZG98Q2VuYXJpbyBkZSBGdW5kb3xDZWZuZGlyfELhu5FpIGPhuqNuaHxCYWtncnVubnVyfEJha2dydW5ufEJha2dydW5kfEJhZ2dydW5kfEJhY2tncm91bmR8QjR8QW50ZWNlZGVudHN8QW50ZWNlZGVudGVzfMOGcnxBZXJ8QWNodGVyZ3JvbmQpOi8pKSB7CiAgICAgICAgc3RhdGUuYWxsb3dQbGFjZWhvbGRlcnMgPSBmYWxzZTsKICAgICAgICBzdGF0ZS5hbGxvd1N0ZXBzID0gdHJ1ZTsKICAgICAgICBzdGF0ZS5hbGxvd0JhY2tncm91bmQgPSBmYWxzZTsKICAgICAgICBzdGF0ZS5hbGxvd011bHRpbGluZUFyZ3VtZW50ID0gZmFsc2U7CiAgICAgICAgc3RhdGUuaW5LZXl3b3JkTGluZSA9IHRydWU7CiAgICAgICAgcmV0dXJuICJrZXl3b3JkIjsKCiAgICAgIC8vIFNDRU5BUklPIE9VVExJTkUKICAgICAgfSBlbHNlIGlmICghc3RhdGUuaW5LZXl3b3JkTGluZSAmJiBzdGF0ZS5hbGxvd1NjZW5hcmlvICYmIHN0cmVhbS5tYXRjaCgvKOWgtOaZr+Wkp+e2sXzlnLrmma/lpKfnurJ85YqH5pys5aSn57axfOWJp+acrOWkp+e6snzjg4bjg7Pjg5fjg6x844K344OK44Oq44Kq44OG44Oz44OX44Os44O844OIfOOCt+ODiuODquOCquODhuODs+ODl+ODrHzjgrfjg4rjg6rjgqrjgqLjgqbjg4jjg6njgqTjg7N87Iuc64KY66as7JikIOqwnOyalHzguKrguKPguLjguJvguYDguKvguJXguLjguIHguLLguKPguJPguYx84LmC4LiE4Lij4LiH4Liq4Lij4LmJ4Liy4LiH4LiC4Lit4LiH4LmA4Lir4LiV4Li44LiB4Liy4Lij4LiT4LmMfOCyteCyv+CyteCysOCyo+CzhnzgsJXgsKXgsKjgsIJ84Kiq4Kif4KiV4Kil4Ki+IOCosOCpguCoqiDgqLDgqYfgqJbgqL584Kiq4Kif4KiV4Kil4Ki+IOCoouCovuCoguComuCovnzgpKrgpLDgpL/gpKbgpYPgpLbgpY3gpK8g4KSw4KWC4KSq4KSw4KWH4KSW4KS+fNiz2YrZhtin2LHZitmIINmF2K7Yt9i3fNin2YTar9mI24wg2LPZhtin2LHbjNmIfNeq15HXoNeZ16og16rXqNeX15nXqXzQodGG0LXQvdCw0YDQuNC50L3Ri9KjINGC06nQt9C10LvQtdGI0LV80KHRhtC10L3QsNGA0LjQuSDRgdGC0YDRg9C60YLRg9GA0LDRgdC4fNCh0YLRgNGD0LrRgtGD0YDQsCDRgdGG0LXQvdCw0YDRltGOfNCh0YLRgNGD0LrRgtGD0YDQsCDRgdGG0LXQvdCw0YDQuNGPfNCh0YLRgNGD0LrRgtGD0YDQsCDRgdGG0LXQvdCw0YDQuNGY0LB80KHQutC40YbQsHzQoNCw0LzQutCwINC90LAg0YHRhtC10L3QsNGA0LjQuXzQmtC+0L3RhtC10L/RgnzOoM61z4HOuc6zz4HOsc+Gzq4gzqPOtc69zrHPgc6vzr/PhXxXaGFycmltZWFuIGlzfFRlbXBsYXRlIFNpdHVhaXxUZW1wbGF0ZSBTZW5hcmlvfFRlbXBsYXRlIEtlYWRhYW58VGFwYXVzYWloaW98U3plbmFyaW9ncnVuZHJpc3N8U3phYmxvbiBzY2VuYXJpdXN6YXxTd2EgaHfDpnIgc3dhfFN3YSBod2FlciBzd2F8U3RydWt0dXJhIHNjZW5hcmlqYXxTdHJ1Y3R1csSDIHNjZW5hcml1fFN0cnVjdHVyYSBzY2VuYXJpdXxTa2ljYXxTa2VuYXJpbyBrb25zZXB8U2hpdmVyIG1lIHRpbWJlcnN8U2VuYXJ5byB0YXNsYcSfxLF8U2NoZW1hIGRlbGxvIHNjZW5hcmlvfFNjZW5hcmlvbWFsbHxTY2VuYXJpb21hbHxTY2VuYXJpbyBUZW1wbGF0ZXxTY2VuYXJpbyBPdXRsaW5lfFNjZW5hcmlvIEFtbGluZWxsb2x8U2NlbsSBcmlqcyBwxJNjIHBhcmF1Z2F8U2NlbmFyaWphdXMgxaFhYmxvbmFzfFJlY2tvbiBpdCdzIGxpa2V8UmFhbXN0c2VuYWFyaXVtfFBsYW5nIHZ1bSBTemVuYXJpb3xQbGFuIGR1IFNjw6luYXJpb3xQbGFuIGR1IHNjw6luYXJpb3xPc25vdmEgc2PDqW7DocWZZXxPc25vdmEgU2NlbsOhcmF8TsOhxI1ydCBTY2Vuw6FydXxOw6HEjXJ0IFNjw6luw6HFmWV8TsOhxI1ydCBTY2Vuw6FyYXxNSVNIVU4gU1JTTFl8TWVuZ2dhcmlza2FuIFNlbmFyaW98TMO9c2luZyBEw6ZtYXxMw71zaW5nIEF0YnVyw7BhcsOhc2FyfEtvbnR1cm8gZGUgbGEgc2NlbmFyb3xLb25jZXB0fEtodW5nIHTDrG5oIGh14buRbmd8S2h1bmcga+G7i2NoIGLhuqNufEZvcmdhdMOza8O2bnl2IHbDoXpsYXR8RXNxdWVtYSBkbyBDZW7DoXJpb3xFc3F1ZW1hIGRvIENlbmFyaW98RXNxdWVtYSBkZWwgZXNjZW5hcmlvfEVzcXVlbWEgZGUgbCdlc2NlbmFyaXxFc2Jvem8gZG8gZXNjZW5hcmlvfERlbGluZWHDp8OjbyBkbyBDZW7DoXJpb3xEZWxpbmVhY2FvIGRvIENlbmFyaW98QWxsIHknYWxsfEFic3RyYWt0IFNjZW5hcmlvfEFic3RyYWN0IFNjZW5hcmlvKTovKSkgewogICAgICAgIHN0YXRlLmFsbG93UGxhY2Vob2xkZXJzID0gdHJ1ZTsKICAgICAgICBzdGF0ZS5hbGxvd1N0ZXBzID0gdHJ1ZTsKICAgICAgICBzdGF0ZS5hbGxvd011bHRpbGluZUFyZ3VtZW50ID0gZmFsc2U7CiAgICAgICAgc3RhdGUuaW5LZXl3b3JkTGluZSA9IHRydWU7CiAgICAgICAgcmV0dXJuICJrZXl3b3JkIjsKCiAgICAgIC8vIEVYQU1QTEVTCiAgICAgIH0gZWxzZSBpZiAoc3RhdGUuYWxsb3dTY2VuYXJpbyAmJiBzdHJlYW0ubWF0Y2goLyjkvovlrZB85L6LfOOCteODs+ODl+ODq3zsmIh84LiK4Li44LiU4LiC4Lit4LiH4LmA4Lir4LiV4Li44LiB4Liy4Lij4LiT4LmMfOC4iuC4uOC4lOC4guC4reC4h+C4leC4seC4p+C4reC4ouC5iOC4suC4h3zgsongsqbgsr7gsrngsrDgsqPgs4bgspfgsrPgs4F84LCJ4LCm4LC+4LC54LCw4LCj4LCy4LGBfOCoieCopuCovuCoueCosOCoqOCovuCognzgpIngpKbgpL7gpLngpLDgpKN82YbZhdmI2YbZhyDZh9infNin2YXYq9mE2Kl815PXldeS157XkNeV16p80q7RgNC905nQutC705nRgHzQodGG0LXQvdCw0YDQuNGY0Lh80J/RgNC40LzQtdGA0Yt80J/RgNC40LzQtdGA0Lh80J/RgNC40LrQu9Cw0LTQuHzQnNC40YHQvtC70LvQsNGAfNCc0LjRgdCw0LvQu9Cw0YB8zqPOtc69zqzPgc65zrF8zqDOsc+BzrHOtM61zq/Os868zrHPhM6xfFlvdSdsbCB3YW5uYXxWb29yYmVlbGRlbnxWYXJpYW50YWl8VGFwYXVrc2V0fFNlIMO+ZXxTZSB0aGV8U2Ugw7BlfFNjZW5hcmlvc3xTY2VuYXJpaml8U2NlbmFyaWphaXxQcnp5a8WCYWR5fFByaW1qZXJpfFByaW1lcml8UMWZw61rbGFkeXxQcsOta2xhZHl8UGllbcSTcml8UMOpbGTDoWt8UGF2eXpkxb5pYWl8UGFyYXVnc3zDlnJuZWtsZXJ8SnVodHVtaWR8RXhlbXBsb3N8RXhlbXBsZXN8RXhlbXBsZXxFeGVtcGVsfEVYQU1QTFp8RXhhbXBsZXN8RXNlbXBpfEVuZ2hyZWlmZnRpYXV8RWt6ZW1wbG9qfEVrc2VtcGxlcnxFamVtcGxvc3xE4buvIGxp4buHdXxEZWFkIG1lbiB0ZWxsIG5vIHRhbGVzfETDpm1pfENvbnRvaHxDZW7DoXJpb3N8Q2VuYXJpb3N8QmVpc3BpbGxlcnxCZWlzcGllbGV8QXRidXLDsGFyw6FzaXIpOi8pKSB7CiAgICAgICAgc3RhdGUuYWxsb3dQbGFjZWhvbGRlcnMgPSBmYWxzZTsKICAgICAgICBzdGF0ZS5hbGxvd1N0ZXBzID0gdHJ1ZTsKICAgICAgICBzdGF0ZS5hbGxvd0JhY2tncm91bmQgPSBmYWxzZTsKICAgICAgICBzdGF0ZS5hbGxvd011bHRpbGluZUFyZ3VtZW50ID0gdHJ1ZTsKICAgICAgICByZXR1cm4gImtleXdvcmQiOwoKICAgICAgLy8gU0NFTkFSSU8KICAgICAgfSBlbHNlIGlmICghc3RhdGUuaW5LZXl3b3JkTGluZSAmJiBzdGF0ZS5hbGxvd1NjZW5hcmlvICYmIHN0cmVhbS5tYXRjaCgvKOWgtOaZr3zlnLrmma985YqH5pysfOWJp+acrHzjgrfjg4rjg6rjgqp87Iuc64KY66as7JikfOC5gOC4q+C4leC4uOC4geC4suC4o+C4k+C5jHzgspXgsqXgsr7gsrjgsr7gsrDgsr7gsoLgsrZ84LC44LCo4LGN4LCo4LC/4LC14LGH4LC24LCCfOCoquCon+ColeCopeCovnzgpKrgpLDgpL/gpKbgpYPgpLbgpY3gpK982LPZitmG2KfYsdmK2Yh82LPZhtin2LHbjNmIfNeq16jXl9eZ16l80KHRhtC10L3QsNGA0ZbQuXzQodGG0LXQvdCw0YDQuNC+fNCh0YbQtdC90LDRgNC40Ll80J/RgNC40LzQtdGAfM6jzrXOvc6sz4HOuc6/fFTDrG5oIGh14buRbmd8VGhlIHRoaW5nIG9mIGl0IGlzfFRhcGF1c3xTemVuYXJpb3xTd2F8U3RzZW5hYXJpdW18U2tlbmFyaW98U2l0dWFpfFNlbmFyeW98U2VuYXJpb3xTY2VuYXJvfFNjZW5hcml1c3p8U2NlbmFyaXV8U2PDqW5hcmlvfFNjZW5hcmlvfFNjZW5hcmlqdXN8U2NlbsSBcmlqc3xTY2VuYXJpanxTY2VuYXJpZXxTY8OpbsOhxZl8U2NlbsOhcnxQcmltZXJ8TUlTSFVOfEvhu4tjaCBi4bqjbnxLZWFkYWFufEhlYXZlIHRvfEZvcmdhdMOza8O2bnl2fEVzY2VuYXJpb3xFc2NlbmFyaXxDZW7DoXJpb3xDZW5hcmlvfEF3d3csIGxvb2sgbWF0ZXxBdGJ1csOwYXLDoXMpOi8pKSB7CiAgICAgICAgc3RhdGUuYWxsb3dQbGFjZWhvbGRlcnMgPSBmYWxzZTsKICAgICAgICBzdGF0ZS5hbGxvd1N0ZXBzID0gdHJ1ZTsKICAgICAgICBzdGF0ZS5hbGxvd0JhY2tncm91bmQgPSBmYWxzZTsKICAgICAgICBzdGF0ZS5hbGxvd011bHRpbGluZUFyZ3VtZW50ID0gZmFsc2U7CiAgICAgICAgc3RhdGUuaW5LZXl3b3JkTGluZSA9IHRydWU7CiAgICAgICAgcmV0dXJuICJrZXl3b3JkIjsKCiAgICAgIC8vIFNURVBTCiAgICAgIH0gZWxzZSBpZiAoIXN0YXRlLmluS2V5d29yZExpbmUgJiYgc3RhdGUuYWxsb3dTdGVwcyAmJiBzdHJlYW0ubWF0Y2goLyjpgqPpurx86YKj5LmIfOiAjOS4lHznlbZ85b2TfOW5tuS4lHzlkIzmmYJ85ZCM5pe2fOWJjeaPkHzlgYforr585YGH6KitfOWBh+WumnzlgYflpoJ85L2G5pivfOS9huOBl3zkuKbkuJR844KC44GXfOOBquOCieOBsHzjgZ/jgaDjgZd844GX44GL44GXfOOBi+OBpHztlZjsp4Drp4x87KGw6rG0fOuovOyggHzrp4zsnbx866eM7JW9fOuLqHzqt7jrpqzqs6B86re465+s66m0fOC5geC4peC4sCB84LmA4Lih4Li34LmI4LitIHzguYHguJXguYggfOC4lOC4seC4h+C4meC4seC5ieC4mSB84LiB4Liz4Lir4LiZ4LiU4LmD4Lir4LmJIHzgsrjgs43gsqXgsr/gsqTgsr/gsq/gsqjgs43gsqjgs4EgfOCyruCypOCzjeCypOCzgSB84LKo4LK/4LOV4LKh4LK/4LKmIHzgsqjgsoLgsqTgsrAgfOCyhuCypuCysOCzhiB84LCu4LCw4LC/4LCv4LGBIHzgsJrgsYbgsKrgsY3gsKrgsKzgsKHgsL/gsKjgsKbgsL8gfOCwleCwvuCwqOCwvyB84LCIIOCwquCwsOCwv+CwuOCxjeCwpeCwv+CwpOCwv+CwsuCxiyB84LCF4LCq4LGN4LCq4LGB4LCh4LGBIHzgqKrgqLAgfOCopOCopiB84Kic4KmH4KiV4KiwIHzgqJzgqL/gqLXgqYfgqIIg4KiV4Ki/IHzgqJzgqKbgqYvgqIIgfOCoheCopOCphyB84KSv4KSm4KS/IHzgpKrgpLDgpKjgpY3gpKTgpYEgfOCkquCksCB84KSk4KSsIHzgpKTgpKbgpL4gfOCkpOCkpeCkviB84KSc4KSsIHzgpJrgpYLgpILgpJXgpL8gfOCkleCkv+CkqOCljeCkpOClgSB84KSV4KSm4KS+IHzgpJTgpLAgfOCkheCkl+CksCB82YggfNmH2Ybar9in2YXbjCB82YXYqtmJIHzZhNmD2YYgfNi52YbYr9mF2KcgfNir2YUgfNio2YHYsdi2IHzYqNinINmB2LHYtiB82KfZhdinIHzYp9iw2KfZiyB82KLZhtqv2KfZhyB815vXkNep16ggfNeV15LXnSB815HXlNeZ16DXqtefIHzXkNeW15kgfNeQ15YgfNeQ15HXnCB80K/QutGJ0L4gfNK605nQvCB80KPQvdC00LAgfNCi0L7QtNGWIHzQotC+0LPQtNCwIHzQotC+IHzQotCw0LrQttC1IHzQotCwIHzQn9GD0YHRgtGMIHzQn9GA0LjQv9GD0YHRgtC40LzQviwg0YnQviB80J/RgNC40L/Rg9GB0YLQuNC80L4gfNCe0L3QtNCwIHzQndC+IHzQndC10YXQsNC5IHzQndOZ0YLQuNKX05nQtNOZIHzQm9C10LrQuNC9IHzQm9OZ0LrQuNC9IHzQmtC+0LvQuCB80JrQvtCz0LTQsCB80JrQvtCz0LDRgtC+IHzQmtCw0LTQsCB80JrQsNC0IHzQmiDRgtC+0LzRgyDQttC1IHzQhiB80JggfNCX0LDQtNCw0YLQviB80JfQsNC00LDRgtC4IHzQl9Cw0LTQsNGC0LUgfNCV0YHQu9C4IHzQlNC+0L/Rg9GB0YLQuNC8IHzQlNCw0L3QviB80JTQsNC00LXQvdC+IHzQktOZIHzQktCwIHzQkdC40YDQvtC6IHzTmNC80LzQsCB805jQudGC0LjQuiB805jQs9OZ0YAgfNCQ0LzQvNC+IHzQkNC70LggfNCQ0LvQtSB80JDQs9Cw0YAgfNCQINGC0LDQutC+0LYgfNCQIHzOpM+Mz4TOtSB8zozPhM6xzr0gfM6azrHOuSB8zpTOtc60zr/OvM6tzr3Ov8+FIHzOkc67zrvOrCB8w551cmggfMOeZWdhciB8w55hIMO+ZSB8w57DoSB8w55hIHxaYXRhdGkgfFpha8WCYWRhasSFYyB8WmFkYXRvIHxaYWRhdGUgfFphZGFubyB8WmFkYW5pIHxaYWRhbiB8WmEgcMWZZWRwb2tsYWR1IHxaYSBwcmVkcG9rbGFkdSB8WW91c2Uga25vdyB3aGVuIHlvdXNlIGdvdCB8WW91c2Uga25vdyBsaWtlIHdoZW4gfFluYSB8WWVhaCBuYWggfFkna25vdyB8WSB8V3VuIHxXdGVkeSB8V2hlbiB5J2FsbCB8V2hlbiB8V2VubiB8V0VOIHx3YW5uIHxWZSB8VsOgIHxVbmQgfFVuIHx1Z2Vob2xsIHxUb28gcmlnaHQgfFRodXJoIHxUaMOsIHxUaGVuIHknYWxsIHxUaGVuIHxUaGEgdGhlIHxUaGEgfFRldGFwaSB8VGFwaSB8VGFrIHxUYWRhIHxUYWQgfFN0ZWwgfFNvaXQgfFNpaXMgfMiYaSB8xZ5pIHxTaSB8U2VkIHxTZSB8U8OlIHxRdWFuZG8gfFF1YW5kIHxRdWFuIHxQcnlkIHxQb3RvbSB8UG9rdWQgfFBva2lhxL4gfFBlcsOyIHxQZXJvIHxQYWsgfE9yYXogfE9uZGEgfE9uZCB8T2xldGV0YWFuIHxPZyB8T2NoIHxPIHphbWFuIHxOaWluIHxOaMawbmcgfE7DpHIgfE7DpXIgfE11dHRhIHxNZW4gfE1hcyB8TWFrYSB8TWFqZCB8TWFqxIVjIHxNYWlzIHxNYWFyIHxtw6QgfE1hIHxMb3JzcXVlIHxMb3JzcXUnfExvZ28gfExldCBnbyBhbmQgaGF1bCB8S3VuIHxLdWlkIHxLdWkgfEtpZWR5IHxLaGkgfEtldGlrYSB8S2VtdWRpYW4gfEtlxI8gfEtkecW+IHxLYWogfEthaSB8S2FkYSB8S2FkIHxKZcW8ZWxpIHxKZcWbbGkgfEphIHxJdCdzIGp1c3QgdW5iZWxpZXZhYmxlIHxJciB8SSBDQU4gSEFaIHxJIHxIYSB8R2l2dW4gfEdpdmV0IHxHaXZlbiB5J2FsbCB8R2l2ZW4gfEdpdHQgfEdlZ2V2ZW4gfEdlZ2ViZW4gc2VpZW4gfEdlZ2ViZW4gc2VpIHxHZHkgfEdhbmd3YXkhIHxGYWthdCB8w4l0YW50IGRvbm7DqXMgfEV0YW50IGRvbm7DqXMgfMOJdGFudCBkb25uw6llcyB8RXRhbnQgZG9ubsOpZXMgfMOJdGFudCBkb25uw6llIHxFdGFudCBkb25uw6llIHzDiXRhbnQgZG9ubsOpIHxFdGFudCBkb25uw6kgfEV0IHzDiXMgfEVudG9uY2VzIHxFbnTDs24gfEVudMOjbyB8RW50YW8gfEVuIHxFxJ9lciBraSB8RWYgfEVlbGRhZGVzIHxFIHzDkHVyaCB8RHVvdGEgfER1biB8RG9uaXRhxLVvIHxEb25hdCB8RG9uYWRhIHxEbyB8RGl5ZWxpbSBraSB8RGliZXJpIHxEZW5nYW4gfERlbiB5b3VzZSBnb3R0YSB8REVOIHxEZSB8RGF0byB8RGHIm2kgZmlpbmQgfERhxaNpIGZpaW5kIHxEYXRpIGZpaW5kIHxEYXRpIHxEYXRlIGZpaW5kIHxEYXRlIHxEYXRhIHxEYXQgZmlpbmQgfERhciB8RGFubiB8ZGFubiB8RGFuIHxEYWRvcyB8RGFkbyB8RGFkYXMgfERhZGEgfMOQYSDDsGUgfMOQYSB8Q3VhbmRvIHxDaG8gfENhbmRvIHxDw6JuZCB8Q2FuZCB8Q2FsIHxCdXQgeSdhbGwgfEJ1dCBhdCB0aGUgZW5kIG9mIHRoZSBkYXkgSSByZWNrb24gfEJVVCB8QnV0IHxCdWggfEJsaW1leSEgfEJp4bq/dCB8QmV0IHxCYWdpIHxBeWUgfGF3ZXIgfEF2YXN0ISB8QXR1bmNpIHxBdGVzYSB8QXTDqHMgfEFwYWJpbGEgfEFucmhlZ2VkaWcgYSB8QW5nZW5vbW1lbiB8QW5kIHknYWxsIHxBbmQgfEFOIHxBbiB8YW4gfEFtaWtvciB8QW1lbm55aWJlbiB8QW1hIHxBbHMgfEFsb3JzIHxBbGxvcmEgfEFsaSB8QWxlc2hvcmVzIHxBbGUgfEFra29yIHxBayB8QWRvdHQgfEFjIHxBYmVyIHxBIHrDoXJvdmXFiCB8QSB0aWXFviB8QSB0YWt0aWXFviB8QSB0YWvDqSB8QSB8YSB8NyB8XCogKS8pKSB7CiAgICAgICAgc3RhdGUuaW5TdGVwID0gdHJ1ZTsKICAgICAgICBzdGF0ZS5hbGxvd1BsYWNlaG9sZGVycyA9IHRydWU7CiAgICAgICAgc3RhdGUuYWxsb3dNdWx0aWxpbmVBcmd1bWVudCA9IHRydWU7CiAgICAgICAgc3RhdGUuaW5LZXl3b3JkTGluZSA9IHRydWU7CiAgICAgICAgcmV0dXJuICJrZXl3b3JkIjsKCiAgICAgIC8vIElOTElORSBTVFJJTkcKICAgICAgfSBlbHNlIGlmIChzdHJlYW0ubWF0Y2goLyJbXiJdKiI/LykpIHsKICAgICAgICByZXR1cm4gInN0cmluZyI7CgogICAgICAvLyBQTEFDRUhPTERFUgogICAgICB9IGVsc2UgaWYgKHN0YXRlLmFsbG93UGxhY2Vob2xkZXJzICYmIHN0cmVhbS5tYXRjaCgvPFtePl0qPj8vKSkgewogICAgICAgIHJldHVybiAidmFyaWFibGUiOwoKICAgICAgLy8gRmFsbCB0aHJvdWdoCiAgICAgIH0gZWxzZSB7CiAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1teQCI8I10vKTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgfQogIH07Cn0pOwoKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtZmVhdHVyZSIsICJnaGVya2luIik7Cgp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/gherkin/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogR2hlcmtpbiBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9ImdoZXJraW4uanMiPjwvc2NyaXB0Pgo8c3R5bGU+LkNvZGVNaXJyb3IgeyBib3JkZXItdG9wOiAxcHggc29saWQgI2RkZDsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkZGQ7IH08L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5HaGVya2luPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5HaGVya2luIG1vZGU8L2gyPgo8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgpGZWF0dXJlOiBVc2luZyBHb29nbGUKICBCYWNrZ3JvdW5kOiAKICAgIFNvbWV0aGluZyBzb21ldGhpbmcKICAgIFNvbWV0aGluZyBlbHNlCiAgU2NlbmFyaW86IEhhcyBhIGhvbWVwYWdlCiAgICBXaGVuIEkgbmF2aWdhdGUgdG8gdGhlIGdvb2dsZSBob21lIHBhZ2UKICAgIFRoZW4gdGhlIGhvbWUgcGFnZSBzaG91bGQgY29udGFpbiB0aGUgbWVudSBhbmQgdGhlIHNlYXJjaCBmb3JtCiAgU2NlbmFyaW86IFNlYXJjaGluZyBmb3IgYSB0ZXJtIAogICAgV2hlbiBJIG5hdmlnYXRlIHRvIHRoZSBnb29nbGUgaG9tZSBwYWdlCiAgICBXaGVuIEkgc2VhcmNoIGZvciBUb2Z1CiAgICBUaGVuIHRoZSBzZWFyY2ggcmVzdWx0cyBwYWdlIGlzIGRpc3BsYXllZAogICAgVGhlbiB0aGUgc2VhcmNoIHJlc3VsdHMgcGFnZSBjb250YWlucyAxMCBpbmRpdmlkdWFsIHNlYXJjaCByZXN1bHRzCiAgICBUaGVuIHRoZSBzZWFyY2ggcmVzdWx0cyBjb250YWluIGEgbGluayB0byB0aGUgd2lraXBlZGlhIHRvZnUgcGFnZQo8L3RleHRhcmVhPjwvZm9ybT4KICAgIDxzY3JpcHQ+CiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7fSk7CiAgICA8L3NjcmlwdD4KCiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC94LWZlYXR1cmU8L2NvZGU+LjwvcD4KCiAgPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/go/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/go/go.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJnbyIsIGZ1bmN0aW9uKGNvbmZpZykgewogIHZhciBpbmRlbnRVbml0ID0gY29uZmlnLmluZGVudFVuaXQ7CgogIHZhciBrZXl3b3JkcyA9IHsKICAgICJicmVhayI6dHJ1ZSwgImNhc2UiOnRydWUsICJjaGFuIjp0cnVlLCAiY29uc3QiOnRydWUsICJjb250aW51ZSI6dHJ1ZSwKICAgICJkZWZhdWx0Ijp0cnVlLCAiZGVmZXIiOnRydWUsICJlbHNlIjp0cnVlLCAiZmFsbHRocm91Z2giOnRydWUsICJmb3IiOnRydWUsCiAgICAiZnVuYyI6dHJ1ZSwgImdvIjp0cnVlLCAiZ290byI6dHJ1ZSwgImlmIjp0cnVlLCAiaW1wb3J0Ijp0cnVlLAogICAgImludGVyZmFjZSI6dHJ1ZSwgIm1hcCI6dHJ1ZSwgInBhY2thZ2UiOnRydWUsICJyYW5nZSI6dHJ1ZSwgInJldHVybiI6dHJ1ZSwKICAgICJzZWxlY3QiOnRydWUsICJzdHJ1Y3QiOnRydWUsICJzd2l0Y2giOnRydWUsICJ0eXBlIjp0cnVlLCAidmFyIjp0cnVlLAogICAgImJvb2wiOnRydWUsICJieXRlIjp0cnVlLCAiY29tcGxleDY0Ijp0cnVlLCAiY29tcGxleDEyOCI6dHJ1ZSwKICAgICJmbG9hdDMyIjp0cnVlLCAiZmxvYXQ2NCI6dHJ1ZSwgImludDgiOnRydWUsICJpbnQxNiI6dHJ1ZSwgImludDMyIjp0cnVlLAogICAgImludDY0Ijp0cnVlLCAic3RyaW5nIjp0cnVlLCAidWludDgiOnRydWUsICJ1aW50MTYiOnRydWUsICJ1aW50MzIiOnRydWUsCiAgICAidWludDY0Ijp0cnVlLCAiaW50Ijp0cnVlLCAidWludCI6dHJ1ZSwgInVpbnRwdHIiOnRydWUKICB9OwoKICB2YXIgYXRvbXMgPSB7CiAgICAidHJ1ZSI6dHJ1ZSwgImZhbHNlIjp0cnVlLCAiaW90YSI6dHJ1ZSwgIm5pbCI6dHJ1ZSwgImFwcGVuZCI6dHJ1ZSwKICAgICJjYXAiOnRydWUsICJjbG9zZSI6dHJ1ZSwgImNvbXBsZXgiOnRydWUsICJjb3B5Ijp0cnVlLCAiaW1hZyI6dHJ1ZSwKICAgICJsZW4iOnRydWUsICJtYWtlIjp0cnVlLCAibmV3Ijp0cnVlLCAicGFuaWMiOnRydWUsICJwcmludCI6dHJ1ZSwKICAgICJwcmludGxuIjp0cnVlLCAicmVhbCI6dHJ1ZSwgInJlY292ZXIiOnRydWUKICB9OwoKICB2YXIgaXNPcGVyYXRvckNoYXIgPSAvWytcLSomXiU6PTw+IXxcL10vOwoKICB2YXIgY3VyUHVuYzsKCiAgZnVuY3Rpb24gdG9rZW5CYXNlKHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBjaCA9IHN0cmVhbS5uZXh0KCk7CiAgICBpZiAoY2ggPT0gJyInIHx8IGNoID09ICInIiB8fCBjaCA9PSAiYCIpIHsKICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlblN0cmluZyhjaCk7CiAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgIH0KICAgIGlmICgvW1xkXC5dLy50ZXN0KGNoKSkgewogICAgICBpZiAoY2ggPT0gIi4iKSB7CiAgICAgICAgc3RyZWFtLm1hdGNoKC9eWzAtOV0rKFtlRV1bXC0rXT9bMC05XSspPy8pOwogICAgICB9IGVsc2UgaWYgKGNoID09ICIwIikgewogICAgICAgIHN0cmVhbS5tYXRjaCgvXlt4WF1bMC05YS1mQS1GXSsvKSB8fCBzdHJlYW0ubWF0Y2goL14wWzAtN10rLyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc3RyZWFtLm1hdGNoKC9eWzAtOV0qXC4/WzAtOV0qKFtlRV1bXC0rXT9bMC05XSspPy8pOwogICAgICB9CiAgICAgIHJldHVybiAibnVtYmVyIjsKICAgIH0KICAgIGlmICgvW1xbXF17fVwoXCksO1w6XC5dLy50ZXN0KGNoKSkgewogICAgICBjdXJQdW5jID0gY2g7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgaWYgKGNoID09ICIvIikgewogICAgICBpZiAoc3RyZWFtLmVhdCgiKiIpKSB7CiAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkNvbW1lbnQ7CiAgICAgICAgcmV0dXJuIHRva2VuQ29tbWVudChzdHJlYW0sIHN0YXRlKTsKICAgICAgfQogICAgICBpZiAoc3RyZWFtLmVhdCgiLyIpKSB7CiAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICAgIHJldHVybiAiY29tbWVudCI7CiAgICAgIH0KICAgIH0KICAgIGlmIChpc09wZXJhdG9yQ2hhci50ZXN0KGNoKSkgewogICAgICBzdHJlYW0uZWF0V2hpbGUoaXNPcGVyYXRvckNoYXIpOwogICAgICByZXR1cm4gIm9wZXJhdG9yIjsKICAgIH0KICAgIHN0cmVhbS5lYXRXaGlsZSgvW1x3XCRfXS8pOwogICAgdmFyIGN1ciA9IHN0cmVhbS5jdXJyZW50KCk7CiAgICBpZiAoa2V5d29yZHMucHJvcGVydHlJc0VudW1lcmFibGUoY3VyKSkgewogICAgICBpZiAoY3VyID09ICJjYXNlIiB8fCBjdXIgPT0gImRlZmF1bHQiKSBjdXJQdW5jID0gImNhc2UiOwogICAgICByZXR1cm4gImtleXdvcmQiOwogICAgfQogICAgaWYgKGF0b21zLnByb3BlcnR5SXNFbnVtZXJhYmxlKGN1cikpIHJldHVybiAiYXRvbSI7CiAgICByZXR1cm4gInZhcmlhYmxlIjsKICB9CgogIGZ1bmN0aW9uIHRva2VuU3RyaW5nKHF1b3RlKSB7CiAgICByZXR1cm4gZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICB2YXIgZXNjYXBlZCA9IGZhbHNlLCBuZXh0LCBlbmQgPSBmYWxzZTsKICAgICAgd2hpbGUgKChuZXh0ID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkgewogICAgICAgIGlmIChuZXh0ID09IHF1b3RlICYmICFlc2NhcGVkKSB7ZW5kID0gdHJ1ZTsgYnJlYWs7fQogICAgICAgIGVzY2FwZWQgPSAhZXNjYXBlZCAmJiBuZXh0ID09ICJcXCI7CiAgICAgIH0KICAgICAgaWYgKGVuZCB8fCAhKGVzY2FwZWQgfHwgcXVvdGUgPT0gImAiKSkKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTsKICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgfTsKICB9CgogIGZ1bmN0aW9uIHRva2VuQ29tbWVudChzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgbWF5YmVFbmQgPSBmYWxzZSwgY2g7CiAgICB3aGlsZSAoY2ggPSBzdHJlYW0ubmV4dCgpKSB7CiAgICAgIGlmIChjaCA9PSAiLyIgJiYgbWF5YmVFbmQpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBtYXliZUVuZCA9IChjaCA9PSAiKiIpOwogICAgfQogICAgcmV0dXJuICJjb21tZW50IjsKICB9CgogIGZ1bmN0aW9uIENvbnRleHQoaW5kZW50ZWQsIGNvbHVtbiwgdHlwZSwgYWxpZ24sIHByZXYpIHsKICAgIHRoaXMuaW5kZW50ZWQgPSBpbmRlbnRlZDsKICAgIHRoaXMuY29sdW1uID0gY29sdW1uOwogICAgdGhpcy50eXBlID0gdHlwZTsKICAgIHRoaXMuYWxpZ24gPSBhbGlnbjsKICAgIHRoaXMucHJldiA9IHByZXY7CiAgfQogIGZ1bmN0aW9uIHB1c2hDb250ZXh0KHN0YXRlLCBjb2wsIHR5cGUpIHsKICAgIHJldHVybiBzdGF0ZS5jb250ZXh0ID0gbmV3IENvbnRleHQoc3RhdGUuaW5kZW50ZWQsIGNvbCwgdHlwZSwgbnVsbCwgc3RhdGUuY29udGV4dCk7CiAgfQogIGZ1bmN0aW9uIHBvcENvbnRleHQoc3RhdGUpIHsKICAgIHZhciB0ID0gc3RhdGUuY29udGV4dC50eXBlOwogICAgaWYgKHQgPT0gIikiIHx8IHQgPT0gIl0iIHx8IHQgPT0gIn0iKQogICAgICBzdGF0ZS5pbmRlbnRlZCA9IHN0YXRlLmNvbnRleHQuaW5kZW50ZWQ7CiAgICByZXR1cm4gc3RhdGUuY29udGV4dCA9IHN0YXRlLmNvbnRleHQucHJldjsKICB9CgogIC8vIEludGVyZmFjZQoKICByZXR1cm4gewogICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24oYmFzZWNvbHVtbikgewogICAgICByZXR1cm4gewogICAgICAgIHRva2VuaXplOiBudWxsLAogICAgICAgIGNvbnRleHQ6IG5ldyBDb250ZXh0KChiYXNlY29sdW1uIHx8IDApIC0gaW5kZW50VW5pdCwgMCwgInRvcCIsIGZhbHNlKSwKICAgICAgICBpbmRlbnRlZDogMCwKICAgICAgICBzdGFydE9mTGluZTogdHJ1ZQogICAgICB9OwogICAgfSwKCiAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICB2YXIgY3R4ID0gc3RhdGUuY29udGV4dDsKICAgICAgaWYgKHN0cmVhbS5zb2woKSkgewogICAgICAgIGlmIChjdHguYWxpZ24gPT0gbnVsbCkgY3R4LmFsaWduID0gZmFsc2U7CiAgICAgICAgc3RhdGUuaW5kZW50ZWQgPSBzdHJlYW0uaW5kZW50YXRpb24oKTsKICAgICAgICBzdGF0ZS5zdGFydE9mTGluZSA9IHRydWU7CiAgICAgICAgaWYgKGN0eC50eXBlID09ICJjYXNlIikgY3R4LnR5cGUgPSAifSI7CiAgICAgIH0KICAgICAgaWYgKHN0cmVhbS5lYXRTcGFjZSgpKSByZXR1cm4gbnVsbDsKICAgICAgY3VyUHVuYyA9IG51bGw7CiAgICAgIHZhciBzdHlsZSA9IChzdGF0ZS50b2tlbml6ZSB8fCB0b2tlbkJhc2UpKHN0cmVhbSwgc3RhdGUpOwogICAgICBpZiAoc3R5bGUgPT0gImNvbW1lbnQiKSByZXR1cm4gc3R5bGU7CiAgICAgIGlmIChjdHguYWxpZ24gPT0gbnVsbCkgY3R4LmFsaWduID0gdHJ1ZTsKCiAgICAgIGlmIChjdXJQdW5jID09ICJ7IikgcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbS5jb2x1bW4oKSwgIn0iKTsKICAgICAgZWxzZSBpZiAoY3VyUHVuYyA9PSAiWyIpIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0uY29sdW1uKCksICJdIik7CiAgICAgIGVsc2UgaWYgKGN1clB1bmMgPT0gIigiKSBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLmNvbHVtbigpLCAiKSIpOwogICAgICBlbHNlIGlmIChjdXJQdW5jID09ICJjYXNlIikgY3R4LnR5cGUgPSAiY2FzZSI7CiAgICAgIGVsc2UgaWYgKGN1clB1bmMgPT0gIn0iICYmIGN0eC50eXBlID09ICJ9IikgY3R4ID0gcG9wQ29udGV4dChzdGF0ZSk7CiAgICAgIGVsc2UgaWYgKGN1clB1bmMgPT0gY3R4LnR5cGUpIHBvcENvbnRleHQoc3RhdGUpOwogICAgICBzdGF0ZS5zdGFydE9mTGluZSA9IGZhbHNlOwogICAgICByZXR1cm4gc3R5bGU7CiAgICB9LAoKICAgIGluZGVudDogZnVuY3Rpb24oc3RhdGUsIHRleHRBZnRlcikgewogICAgICBpZiAoc3RhdGUudG9rZW5pemUgIT0gdG9rZW5CYXNlICYmIHN0YXRlLnRva2VuaXplICE9IG51bGwpIHJldHVybiAwOwogICAgICB2YXIgY3R4ID0gc3RhdGUuY29udGV4dCwgZmlyc3RDaGFyID0gdGV4dEFmdGVyICYmIHRleHRBZnRlci5jaGFyQXQoMCk7CiAgICAgIGlmIChjdHgudHlwZSA9PSAiY2FzZSIgJiYgL14oPzpjYXNlfGRlZmF1bHQpXGIvLnRlc3QodGV4dEFmdGVyKSkgewogICAgICAgIHN0YXRlLmNvbnRleHQudHlwZSA9ICJ9IjsKICAgICAgICByZXR1cm4gY3R4LmluZGVudGVkOwogICAgICB9CiAgICAgIHZhciBjbG9zaW5nID0gZmlyc3RDaGFyID09IGN0eC50eXBlOwogICAgICBpZiAoY3R4LmFsaWduKSByZXR1cm4gY3R4LmNvbHVtbiArIChjbG9zaW5nID8gMCA6IDEpOwogICAgICBlbHNlIHJldHVybiBjdHguaW5kZW50ZWQgKyAoY2xvc2luZyA/IDAgOiBpbmRlbnRVbml0KTsKICAgIH0sCgogICAgZWxlY3RyaWNDaGFyczogInt9KToiLAogICAgZm9sZDogImJyYWNlIiwKICAgIGJsb2NrQ29tbWVudFN0YXJ0OiAiLyoiLAogICAgYmxvY2tDb21tZW50RW5kOiAiKi8iLAogICAgbGluZUNvbW1lbnQ6ICIvLyIKICB9Owp9KTsKCkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC94LWdvIiwgImdvIik7Cgp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/go/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogR28gbW9kZTwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uLy4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vdGhlbWUvZWxlZ2FudC5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vLi4vYWRkb24vZWRpdC9tYXRjaGJyYWNrZXRzLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9ImdvLmpzIj48L3NjcmlwdD4KPHN0eWxlPi5Db2RlTWlycm9yIHtib3JkZXI6MXB4IHNvbGlkICM5OTk7IGJhY2tncm91bmQ6I2ZmY308L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5HbzwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+R28gbW9kZTwvaDI+Cjxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+Ci8vIFByaW1lIFNpZXZlIGluIEdvLgovLyBUYWtlbiBmcm9tIHRoZSBHbyBzcGVjaWZpY2F0aW9uLgovLyBDb3B5cmlnaHQgwqkgVGhlIEdvIEF1dGhvcnMuCgpwYWNrYWdlIG1haW4KCmltcG9ydCAiZm10IgoKLy8gU2VuZCB0aGUgc2VxdWVuY2UgMiwgMywgNCwgLi4uIHRvIGNoYW5uZWwgJ2NoJy4KZnVuYyBnZW5lcmF0ZShjaCBjaGFuJmx0Oy0gaW50KSB7Cglmb3IgaSA6PSAyOyA7IGkrKyB7CgkJY2ggJmx0Oy0gaSAgLy8gU2VuZCAnaScgdG8gY2hhbm5lbCAnY2gnCgl9Cn0KCi8vIENvcHkgdGhlIHZhbHVlcyBmcm9tIGNoYW5uZWwgJ3NyYycgdG8gY2hhbm5lbCAnZHN0JywKLy8gcmVtb3ZpbmcgdGhvc2UgZGl2aXNpYmxlIGJ5ICdwcmltZScuCmZ1bmMgZmlsdGVyKHNyYyAmbHQ7LWNoYW4gaW50LCBkc3QgY2hhbiZsdDstIGludCwgcHJpbWUgaW50KSB7Cglmb3IgaSA6PSByYW5nZSBzcmMgeyAgICAvLyBMb29wIG92ZXIgdmFsdWVzIHJlY2VpdmVkIGZyb20gJ3NyYycuCgkJaWYgaSVwcmltZSAhPSAwIHsKCQkJZHN0ICZsdDstIGkgIC8vIFNlbmQgJ2knIHRvIGNoYW5uZWwgJ2RzdCcuCgkJfQoJfQp9CgovLyBUaGUgcHJpbWUgc2lldmU6IERhaXN5LWNoYWluIGZpbHRlciBwcm9jZXNzZXMgdG9nZXRoZXIuCmZ1bmMgc2lldmUoKSB7CgljaCA6PSBtYWtlKGNoYW4gaW50KSAgLy8gQ3JlYXRlIGEgbmV3IGNoYW5uZWwuCglnbyBnZW5lcmF0ZShjaCkgICAgICAgLy8gU3RhcnQgZ2VuZXJhdGUoKSBhcyBhIHN1YnByb2Nlc3MuCglmb3IgewoJCXByaW1lIDo9ICZsdDstY2gKCQlmbXQuUHJpbnQocHJpbWUsICJcbiIpCgkJY2gxIDo9IG1ha2UoY2hhbiBpbnQpCgkJZ28gZmlsdGVyKGNoLCBjaDEsIHByaW1lKQoJCWNoID0gY2gxCgl9Cn0KCmZ1bmMgbWFpbigpIHsKCXNpZXZlKCkKfQo8L3RleHRhcmVhPjwvZm9ybT4KCiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgICAgIHRoZW1lOiAiZWxlZ2FudCIsCiAgICAgICAgbWF0Y2hCcmFja2V0czogdHJ1ZSwKICAgICAgICBpbmRlbnRVbml0OiA4LAogICAgICAgIHRhYlNpemU6IDgsCiAgICAgICAgaW5kZW50V2l0aFRhYnM6IHRydWUsCiAgICAgICAgbW9kZTogInRleHQveC1nbyIKICAgICAgfSk7CiAgICA8L3NjcmlwdD4KCiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZTo8L3N0cm9uZz4gPGNvZGU+dGV4dC94LWdvPC9jb2RlPjwvcD4KICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/groovy/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/groovy/groovy.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJncm9vdnkiLCBmdW5jdGlvbihjb25maWcpIHsKICBmdW5jdGlvbiB3b3JkcyhzdHIpIHsKICAgIHZhciBvYmogPSB7fSwgd29yZHMgPSBzdHIuc3BsaXQoIiAiKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgd29yZHMubGVuZ3RoOyArK2kpIG9ialt3b3Jkc1tpXV0gPSB0cnVlOwogICAgcmV0dXJuIG9iajsKICB9CiAgdmFyIGtleXdvcmRzID0gd29yZHMoCiAgICAiYWJzdHJhY3QgYXMgYXNzZXJ0IGJvb2xlYW4gYnJlYWsgYnl0ZSBjYXNlIGNhdGNoIGNoYXIgY2xhc3MgY29uc3QgY29udGludWUgZGVmIGRlZmF1bHQgIiArCiAgICAiZG8gZG91YmxlIGVsc2UgZW51bSBleHRlbmRzIGZpbmFsIGZpbmFsbHkgZmxvYXQgZm9yIGdvdG8gaWYgaW1wbGVtZW50cyBpbXBvcnQgaW4gIiArCiAgICAiaW5zdGFuY2VvZiBpbnQgaW50ZXJmYWNlIGxvbmcgbmF0aXZlIG5ldyBwYWNrYWdlIHByaXZhdGUgcHJvdGVjdGVkIHB1YmxpYyByZXR1cm4gIiArCiAgICAic2hvcnQgc3RhdGljIHN0cmljdGZwIHN1cGVyIHN3aXRjaCBzeW5jaHJvbml6ZWQgdGhyZWFkc2FmZSB0aHJvdyB0aHJvd3MgdHJhbnNpZW50ICIgKwogICAgInRyeSB2b2lkIHZvbGF0aWxlIHdoaWxlIik7CiAgdmFyIGJsb2NrS2V5d29yZHMgPSB3b3JkcygiY2F0Y2ggY2xhc3MgZG8gZWxzZSBmaW5hbGx5IGZvciBpZiBzd2l0Y2ggdHJ5IHdoaWxlIGVudW0gaW50ZXJmYWNlIGRlZiIpOwogIHZhciBhdG9tcyA9IHdvcmRzKCJudWxsIHRydWUgZmFsc2UgdGhpcyIpOwoKICB2YXIgY3VyUHVuYzsKICBmdW5jdGlvbiB0b2tlbkJhc2Uoc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIGNoID0gc3RyZWFtLm5leHQoKTsKICAgIGlmIChjaCA9PSAnIicgfHwgY2ggPT0gIiciKSB7CiAgICAgIHJldHVybiBzdGFydFN0cmluZyhjaCwgc3RyZWFtLCBzdGF0ZSk7CiAgICB9CiAgICBpZiAoL1tcW1xde31cKFwpLDtcOlwuXS8udGVzdChjaCkpIHsKICAgICAgY3VyUHVuYyA9IGNoOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGlmICgvXGQvLnRlc3QoY2gpKSB7CiAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1x3XC5dLyk7CiAgICAgIGlmIChzdHJlYW0uZWF0KC9lRS8pKSB7IHN0cmVhbS5lYXQoL1wrXC0vKTsgc3RyZWFtLmVhdFdoaWxlKC9cZC8pOyB9CiAgICAgIHJldHVybiAibnVtYmVyIjsKICAgIH0KICAgIGlmIChjaCA9PSAiLyIpIHsKICAgICAgaWYgKHN0cmVhbS5lYXQoIioiKSkgewogICAgICAgIHN0YXRlLnRva2VuaXplLnB1c2godG9rZW5Db21tZW50KTsKICAgICAgICByZXR1cm4gdG9rZW5Db21tZW50KHN0cmVhbSwgc3RhdGUpOwogICAgICB9CiAgICAgIGlmIChzdHJlYW0uZWF0KCIvIikpIHsKICAgICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICAgICAgcmV0dXJuICJjb21tZW50IjsKICAgICAgfQogICAgICBpZiAoZXhwZWN0RXhwcmVzc2lvbihzdGF0ZS5sYXN0VG9rZW4pKSB7CiAgICAgICAgcmV0dXJuIHN0YXJ0U3RyaW5nKGNoLCBzdHJlYW0sIHN0YXRlKTsKICAgICAgfQogICAgfQogICAgaWYgKGNoID09ICItIiAmJiBzdHJlYW0uZWF0KCI+IikpIHsKICAgICAgY3VyUHVuYyA9ICItPiI7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgaWYgKC9bK1wtKiYlPTw+IT98XC9+XS8udGVzdChjaCkpIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bK1wtKiYlPTw+fH5dLyk7CiAgICAgIHJldHVybiAib3BlcmF0b3IiOwogICAgfQogICAgc3RyZWFtLmVhdFdoaWxlKC9bXHdcJF9dLyk7CiAgICBpZiAoY2ggPT0gIkAiKSB7IHN0cmVhbS5lYXRXaGlsZSgvW1x3XCRfXC5dLyk7IHJldHVybiAibWV0YSI7IH0KICAgIGlmIChzdGF0ZS5sYXN0VG9rZW4gPT0gIi4iKSByZXR1cm4gInByb3BlcnR5IjsKICAgIGlmIChzdHJlYW0uZWF0KCI6IikpIHsgY3VyUHVuYyA9ICJwcm9wbGFiZWwiOyByZXR1cm4gInByb3BlcnR5IjsgfQogICAgdmFyIGN1ciA9IHN0cmVhbS5jdXJyZW50KCk7CiAgICBpZiAoYXRvbXMucHJvcGVydHlJc0VudW1lcmFibGUoY3VyKSkgeyByZXR1cm4gImF0b20iOyB9CiAgICBpZiAoa2V5d29yZHMucHJvcGVydHlJc0VudW1lcmFibGUoY3VyKSkgewogICAgICBpZiAoYmxvY2tLZXl3b3Jkcy5wcm9wZXJ0eUlzRW51bWVyYWJsZShjdXIpKSBjdXJQdW5jID0gIm5ld3N0YXRlbWVudCI7CiAgICAgIHJldHVybiAia2V5d29yZCI7CiAgICB9CiAgICByZXR1cm4gInZhcmlhYmxlIjsKICB9CiAgdG9rZW5CYXNlLmlzQmFzZSA9IHRydWU7CgogIGZ1bmN0aW9uIHN0YXJ0U3RyaW5nKHF1b3RlLCBzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgdHJpcGxlUXVvdGVkID0gZmFsc2U7CiAgICBpZiAocXVvdGUgIT0gIi8iICYmIHN0cmVhbS5lYXQocXVvdGUpKSB7CiAgICAgIGlmIChzdHJlYW0uZWF0KHF1b3RlKSkgdHJpcGxlUXVvdGVkID0gdHJ1ZTsKICAgICAgZWxzZSByZXR1cm4gInN0cmluZyI7CiAgICB9CiAgICBmdW5jdGlvbiB0KHN0cmVhbSwgc3RhdGUpIHsKICAgICAgdmFyIGVzY2FwZWQgPSBmYWxzZSwgbmV4dCwgZW5kID0gIXRyaXBsZVF1b3RlZDsKICAgICAgd2hpbGUgKChuZXh0ID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkgewogICAgICAgIGlmIChuZXh0ID09IHF1b3RlICYmICFlc2NhcGVkKSB7CiAgICAgICAgICBpZiAoIXRyaXBsZVF1b3RlZCkgeyBicmVhazsgfQogICAgICAgICAgaWYgKHN0cmVhbS5tYXRjaChxdW90ZSArIHF1b3RlKSkgeyBlbmQgPSB0cnVlOyBicmVhazsgfQogICAgICAgIH0KICAgICAgICBpZiAocXVvdGUgPT0gJyInICYmIG5leHQgPT0gIiQiICYmICFlc2NhcGVkICYmIHN0cmVhbS5lYXQoInsiKSkgewogICAgICAgICAgc3RhdGUudG9rZW5pemUucHVzaCh0b2tlbkJhc2VVbnRpbEJyYWNlKCkpOwogICAgICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgICAgIH0KICAgICAgICBlc2NhcGVkID0gIWVzY2FwZWQgJiYgbmV4dCA9PSAiXFwiOwogICAgICB9CiAgICAgIGlmIChlbmQpIHN0YXRlLnRva2VuaXplLnBvcCgpOwogICAgICByZXR1cm4gInN0cmluZyI7CiAgICB9CiAgICBzdGF0ZS50b2tlbml6ZS5wdXNoKHQpOwogICAgcmV0dXJuIHQoc3RyZWFtLCBzdGF0ZSk7CiAgfQoKICBmdW5jdGlvbiB0b2tlbkJhc2VVbnRpbEJyYWNlKCkgewogICAgdmFyIGRlcHRoID0gMTsKICAgIGZ1bmN0aW9uIHQoc3RyZWFtLCBzdGF0ZSkgewogICAgICBpZiAoc3RyZWFtLnBlZWsoKSA9PSAifSIpIHsKICAgICAgICBkZXB0aC0tOwogICAgICAgIGlmIChkZXB0aCA9PSAwKSB7CiAgICAgICAgICBzdGF0ZS50b2tlbml6ZS5wb3AoKTsKICAgICAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZVtzdGF0ZS50b2tlbml6ZS5sZW5ndGgtMV0oc3RyZWFtLCBzdGF0ZSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKHN0cmVhbS5wZWVrKCkgPT0gInsiKSB7CiAgICAgICAgZGVwdGgrKzsKICAgICAgfQogICAgICByZXR1cm4gdG9rZW5CYXNlKHN0cmVhbSwgc3RhdGUpOwogICAgfQogICAgdC5pc0Jhc2UgPSB0cnVlOwogICAgcmV0dXJuIHQ7CiAgfQoKICBmdW5jdGlvbiB0b2tlbkNvbW1lbnQoc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIG1heWJlRW5kID0gZmFsc2UsIGNoOwogICAgd2hpbGUgKGNoID0gc3RyZWFtLm5leHQoKSkgewogICAgICBpZiAoY2ggPT0gIi8iICYmIG1heWJlRW5kKSB7CiAgICAgICAgc3RhdGUudG9rZW5pemUucG9wKCk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgbWF5YmVFbmQgPSAoY2ggPT0gIioiKTsKICAgIH0KICAgIHJldHVybiAiY29tbWVudCI7CiAgfQoKICBmdW5jdGlvbiBleHBlY3RFeHByZXNzaW9uKGxhc3QpIHsKICAgIHJldHVybiAhbGFzdCB8fCBsYXN0ID09ICJvcGVyYXRvciIgfHwgbGFzdCA9PSAiLT4iIHx8IC9bXC5cW1x7XCgsOzpdLy50ZXN0KGxhc3QpIHx8CiAgICAgIGxhc3QgPT0gIm5ld3N0YXRlbWVudCIgfHwgbGFzdCA9PSAia2V5d29yZCIgfHwgbGFzdCA9PSAicHJvcGxhYmVsIjsKICB9CgogIGZ1bmN0aW9uIENvbnRleHQoaW5kZW50ZWQsIGNvbHVtbiwgdHlwZSwgYWxpZ24sIHByZXYpIHsKICAgIHRoaXMuaW5kZW50ZWQgPSBpbmRlbnRlZDsKICAgIHRoaXMuY29sdW1uID0gY29sdW1uOwogICAgdGhpcy50eXBlID0gdHlwZTsKICAgIHRoaXMuYWxpZ24gPSBhbGlnbjsKICAgIHRoaXMucHJldiA9IHByZXY7CiAgfQogIGZ1bmN0aW9uIHB1c2hDb250ZXh0KHN0YXRlLCBjb2wsIHR5cGUpIHsKICAgIHJldHVybiBzdGF0ZS5jb250ZXh0ID0gbmV3IENvbnRleHQoc3RhdGUuaW5kZW50ZWQsIGNvbCwgdHlwZSwgbnVsbCwgc3RhdGUuY29udGV4dCk7CiAgfQogIGZ1bmN0aW9uIHBvcENvbnRleHQoc3RhdGUpIHsKICAgIHZhciB0ID0gc3RhdGUuY29udGV4dC50eXBlOwogICAgaWYgKHQgPT0gIikiIHx8IHQgPT0gIl0iIHx8IHQgPT0gIn0iKQogICAgICBzdGF0ZS5pbmRlbnRlZCA9IHN0YXRlLmNvbnRleHQuaW5kZW50ZWQ7CiAgICByZXR1cm4gc3RhdGUuY29udGV4dCA9IHN0YXRlLmNvbnRleHQucHJldjsKICB9CgogIC8vIEludGVyZmFjZQoKICByZXR1cm4gewogICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24oYmFzZWNvbHVtbikgewogICAgICByZXR1cm4gewogICAgICAgIHRva2VuaXplOiBbdG9rZW5CYXNlXSwKICAgICAgICBjb250ZXh0OiBuZXcgQ29udGV4dCgoYmFzZWNvbHVtbiB8fCAwKSAtIGNvbmZpZy5pbmRlbnRVbml0LCAwLCAidG9wIiwgZmFsc2UpLAogICAgICAgIGluZGVudGVkOiAwLAogICAgICAgIHN0YXJ0T2ZMaW5lOiB0cnVlLAogICAgICAgIGxhc3RUb2tlbjogbnVsbAogICAgICB9OwogICAgfSwKCiAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICB2YXIgY3R4ID0gc3RhdGUuY29udGV4dDsKICAgICAgaWYgKHN0cmVhbS5zb2woKSkgewogICAgICAgIGlmIChjdHguYWxpZ24gPT0gbnVsbCkgY3R4LmFsaWduID0gZmFsc2U7CiAgICAgICAgc3RhdGUuaW5kZW50ZWQgPSBzdHJlYW0uaW5kZW50YXRpb24oKTsKICAgICAgICBzdGF0ZS5zdGFydE9mTGluZSA9IHRydWU7CiAgICAgICAgLy8gQXV0b21hdGljIHNlbWljb2xvbiBpbnNlcnRpb24KICAgICAgICBpZiAoY3R4LnR5cGUgPT0gInN0YXRlbWVudCIgJiYgIWV4cGVjdEV4cHJlc3Npb24oc3RhdGUubGFzdFRva2VuKSkgewogICAgICAgICAgcG9wQ29udGV4dChzdGF0ZSk7IGN0eCA9IHN0YXRlLmNvbnRleHQ7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChzdHJlYW0uZWF0U3BhY2UoKSkgcmV0dXJuIG51bGw7CiAgICAgIGN1clB1bmMgPSBudWxsOwogICAgICB2YXIgc3R5bGUgPSBzdGF0ZS50b2tlbml6ZVtzdGF0ZS50b2tlbml6ZS5sZW5ndGgtMV0oc3RyZWFtLCBzdGF0ZSk7CiAgICAgIGlmIChzdHlsZSA9PSAiY29tbWVudCIpIHJldHVybiBzdHlsZTsKICAgICAgaWYgKGN0eC5hbGlnbiA9PSBudWxsKSBjdHguYWxpZ24gPSB0cnVlOwoKICAgICAgaWYgKChjdXJQdW5jID09ICI7IiB8fCBjdXJQdW5jID09ICI6IikgJiYgY3R4LnR5cGUgPT0gInN0YXRlbWVudCIpIHBvcENvbnRleHQoc3RhdGUpOwogICAgICAvLyBIYW5kbGUgaW5kZW50YXRpb24gZm9yIHt4IC0+IFxuIC4uLiB9CiAgICAgIGVsc2UgaWYgKGN1clB1bmMgPT0gIi0+IiAmJiBjdHgudHlwZSA9PSAic3RhdGVtZW50IiAmJiBjdHgucHJldi50eXBlID09ICJ9IikgewogICAgICAgIHBvcENvbnRleHQoc3RhdGUpOwogICAgICAgIHN0YXRlLmNvbnRleHQuYWxpZ24gPSBmYWxzZTsKICAgICAgfQogICAgICBlbHNlIGlmIChjdXJQdW5jID09ICJ7IikgcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbS5jb2x1bW4oKSwgIn0iKTsKICAgICAgZWxzZSBpZiAoY3VyUHVuYyA9PSAiWyIpIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0uY29sdW1uKCksICJdIik7CiAgICAgIGVsc2UgaWYgKGN1clB1bmMgPT0gIigiKSBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLmNvbHVtbigpLCAiKSIpOwogICAgICBlbHNlIGlmIChjdXJQdW5jID09ICJ9IikgewogICAgICAgIHdoaWxlIChjdHgudHlwZSA9PSAic3RhdGVtZW50IikgY3R4ID0gcG9wQ29udGV4dChzdGF0ZSk7CiAgICAgICAgaWYgKGN0eC50eXBlID09ICJ9IikgY3R4ID0gcG9wQ29udGV4dChzdGF0ZSk7CiAgICAgICAgd2hpbGUgKGN0eC50eXBlID09ICJzdGF0ZW1lbnQiKSBjdHggPSBwb3BDb250ZXh0KHN0YXRlKTsKICAgICAgfQogICAgICBlbHNlIGlmIChjdXJQdW5jID09IGN0eC50eXBlKSBwb3BDb250ZXh0KHN0YXRlKTsKICAgICAgZWxzZSBpZiAoY3R4LnR5cGUgPT0gIn0iIHx8IGN0eC50eXBlID09ICJ0b3AiIHx8IChjdHgudHlwZSA9PSAic3RhdGVtZW50IiAmJiBjdXJQdW5jID09ICJuZXdzdGF0ZW1lbnQiKSkKICAgICAgICBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLmNvbHVtbigpLCAic3RhdGVtZW50Iik7CiAgICAgIHN0YXRlLnN0YXJ0T2ZMaW5lID0gZmFsc2U7CiAgICAgIHN0YXRlLmxhc3RUb2tlbiA9IGN1clB1bmMgfHwgc3R5bGU7CiAgICAgIHJldHVybiBzdHlsZTsKICAgIH0sCgogICAgaW5kZW50OiBmdW5jdGlvbihzdGF0ZSwgdGV4dEFmdGVyKSB7CiAgICAgIGlmICghc3RhdGUudG9rZW5pemVbc3RhdGUudG9rZW5pemUubGVuZ3RoLTFdLmlzQmFzZSkgcmV0dXJuIDA7CiAgICAgIHZhciBmaXJzdENoYXIgPSB0ZXh0QWZ0ZXIgJiYgdGV4dEFmdGVyLmNoYXJBdCgwKSwgY3R4ID0gc3RhdGUuY29udGV4dDsKICAgICAgaWYgKGN0eC50eXBlID09ICJzdGF0ZW1lbnQiICYmICFleHBlY3RFeHByZXNzaW9uKHN0YXRlLmxhc3RUb2tlbikpIGN0eCA9IGN0eC5wcmV2OwogICAgICB2YXIgY2xvc2luZyA9IGZpcnN0Q2hhciA9PSBjdHgudHlwZTsKICAgICAgaWYgKGN0eC50eXBlID09ICJzdGF0ZW1lbnQiKSByZXR1cm4gY3R4LmluZGVudGVkICsgKGZpcnN0Q2hhciA9PSAieyIgPyAwIDogY29uZmlnLmluZGVudFVuaXQpOwogICAgICBlbHNlIGlmIChjdHguYWxpZ24pIHJldHVybiBjdHguY29sdW1uICsgKGNsb3NpbmcgPyAwIDogMSk7CiAgICAgIGVsc2UgcmV0dXJuIGN0eC5pbmRlbnRlZCArIChjbG9zaW5nID8gMCA6IGNvbmZpZy5pbmRlbnRVbml0KTsKICAgIH0sCgogICAgZWxlY3RyaWNDaGFyczogInt9IiwKICAgIGZvbGQ6ICJicmFjZSIKICB9Owp9KTsKCkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC94LWdyb292eSIsICJncm9vdnkiKTsKCn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/groovy/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogR3Jvb3Z5IG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vLi4vYWRkb24vZWRpdC9tYXRjaGJyYWNrZXRzLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Imdyb292eS5qcyI+PC9zY3JpcHQ+CjxzdHlsZT4uQ29kZU1pcnJvciB7Ym9yZGVyLXRvcDogMXB4IHNvbGlkICM1MDA7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjNTAwO308L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5Hcm9vdnk8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPkdyb292eSBtb2RlPC9oMj4KPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KLy9QYXR0ZXJuIGZvciBncm9vdnkgc2NyaXB0CmRlZiBwID0gfi8uKlwuZ3Jvb3Z5LwpuZXcgRmlsZSggJ2Q6XFxzY3JpcHRzJyApLmVhY2hGaWxlTWF0Y2gocCkge2YgLT4KICAvLyBpbXBvcnRzIGxpc3QKICBkZWYgaW1wb3J0cyA9IFtdCiAgZi5lYWNoTGluZSB7CiAgICAvLyBjb25kaXRpb24gdG8gZGV0ZWN0IGFuIGltcG9ydCBpbnN0cnVjdGlvbgogICAgbG4gLT4gaWYgKCBsbiA9fiAnXmltcG9ydCAuKicgKSB7CiAgICAgIGltcG9ydHMgPDwgIiR7bG4gLSAnaW1wb3J0ICd9IgogICAgfQogIH0KICAvLyBwcmludCB0aG1lbgogIGlmICggISBpbXBvcnRzLmVtcHR5ICkgewogICAgcHJpbnRsbiBmCiAgICBpbXBvcnRzLmVhY2h7IHByaW50bG4gIiAgICRpdCIgfQogIH0KfQoKLyogQ29pbiBjaGFuZ2VyIGRlbW8gY29kZSBmcm9tIGh0dHA6Ly9ncm9vdnkuY29kZWhhdXMub3JnICovCgplbnVtIFVzQ29pbiB7CiAgcXVhcnRlcigyNSksIGRpbWUoMTApLCBuaWNrZWwoNSksIHBlbm55KDEpCiAgVXNDb2luKHYpIHsgdmFsdWUgPSB2IH0KICBmaW5hbCB2YWx1ZQp9CgplbnVtIE96emllQ29pbiB7CiAgZmlmdHkoNTApLCB0d2VudHkoMjApLCB0ZW4oMTApLCBmaXZlKDUpCiAgT3p6aWVDb2luKHYpIHsgdmFsdWUgPSB2IH0KICBmaW5hbCB2YWx1ZQp9CgpkZWYgcGx1cmFsKHdvcmQsIGNvdW50KSB7CiAgaWYgKGNvdW50ID09IDEpIHJldHVybiB3b3JkCiAgd29yZFstMV0gPT0gJ3knID8gd29yZFswLi4tMl0gKyAiaWVzIiA6IHdvcmQgKyAicyIKfQoKZGVmIGNoYW5nZShjdXJyZW5jeSwgYW1vdW50KSB7CiAgY3VycmVuY3kudmFsdWVzKCkuaW5qZWN0KFtdKXsgbGlzdCwgY29pbiAtPgogICAgIGludCBjb3VudCA9IGFtb3VudCAvIGNvaW4udmFsdWUKICAgICBhbW91bnQgPSBhbW91bnQgJSBjb2luLnZhbHVlCiAgICAgbGlzdCArPSAiJGNvdW50ICR7cGx1cmFsKGNvaW4udG9TdHJpbmcoKSwgY291bnQpfSIKICB9Cn0KPC90ZXh0YXJlYT48L2Zvcm0+CgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgICAgICBtYXRjaEJyYWNrZXRzOiB0cnVlLAogICAgICAgIG1vZGU6ICJ0ZXh0L3gtZ3Jvb3Z5IgogICAgICB9KTsKICAgIDwvc2NyaXB0PgoKICAgIDxwPjxzdHJvbmc+TUlNRSB0eXBlcyBkZWZpbmVkOjwvc3Ryb25nPiA8Y29kZT50ZXh0L3gtZ3Jvb3Z5PC9jb2RlPjwvcD4KICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/haml/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/haml/haml.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSwgcmVxdWlyZSgiLi4vaHRtbG1peGVkL2h0bWxtaXhlZCIpLCByZXF1aXJlKCIuLi9ydWJ5L3J1YnkiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiLCAiLi4vaHRtbG1peGVkL2h0bWxtaXhlZCIsICIuLi9ydWJ5L3J1YnkiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKICAvLyBmdWxsIGhhbWwgbW9kZS4gVGhpcyBoYW5kbGVkIGVtYmVkZWQgcnVieSBhbmQgaHRtbCBmcmFnbWVudHMgdG9vCiAgQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJoYW1sIiwgZnVuY3Rpb24oY29uZmlnKSB7CiAgICB2YXIgaHRtbE1vZGUgPSBDb2RlTWlycm9yLmdldE1vZGUoY29uZmlnLCB7bmFtZTogImh0bWxtaXhlZCJ9KTsKICAgIHZhciBydWJ5TW9kZSA9IENvZGVNaXJyb3IuZ2V0TW9kZShjb25maWcsICJydWJ5Iik7CgogICAgZnVuY3Rpb24gcnVieUluUXVvdGUoZW5kUXVvdGUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgICB2YXIgY2ggPSBzdHJlYW0ucGVlaygpOwogICAgICAgIGlmIChjaCA9PSBlbmRRdW90ZSAmJiBzdGF0ZS5ydWJ5U3RhdGUudG9rZW5pemUubGVuZ3RoID09IDEpIHsKICAgICAgICAgIC8vIHN0ZXAgb3V0IG9mIHJ1YnkgY29udGV4dCBhcyBpdCBzZWVtcyB0byBjb21wbGV0ZSBwcm9jZXNzaW5nIGFsbCB0aGUgYnJhY2VzCiAgICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgICAgc3RhdGUudG9rZW5pemUgPSBodG1sOwogICAgICAgICAgcmV0dXJuICJjbG9zZUF0dHJpYnV0ZVRhZyI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBydWJ5KHN0cmVhbSwgc3RhdGUpOwogICAgICAgIH0KICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBydWJ5KHN0cmVhbSwgc3RhdGUpIHsKICAgICAgaWYgKHN0cmVhbS5tYXRjaCgiLSMiKSkgewogICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgICByZXR1cm4gImNvbW1lbnQiOwogICAgICB9CiAgICAgIHJldHVybiBydWJ5TW9kZS50b2tlbihzdHJlYW0sIHN0YXRlLnJ1YnlTdGF0ZSk7CiAgICB9CgogICAgZnVuY3Rpb24gaHRtbChzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHZhciBjaCA9IHN0cmVhbS5wZWVrKCk7CgogICAgICAvLyBoYW5kbGUgaGFtbCBkZWNsYXJhdGlvbnMuIEFsbCBkZWNsYXJhdGlvbnMgdGhhdCBjYW50IGJlIGhhbmRsZWQgaGVyZQogICAgICAvLyB3aWxsIGJlIHBhc3NlZCB0byBodG1sIG1vZGUKICAgICAgaWYgKHN0YXRlLnByZXZpb3VzVG9rZW4uc3R5bGUgPT0gImNvbW1lbnQiICkgewogICAgICAgIGlmIChzdGF0ZS5pbmRlbnRlZCA+IHN0YXRlLnByZXZpb3VzVG9rZW4uaW5kZW50ZWQpIHsKICAgICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgICAgIHJldHVybiAiY29tbWVudExpbmUiOwogICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgKHN0YXRlLnN0YXJ0T2ZMaW5lKSB7CiAgICAgICAgaWYgKGNoID09ICIhIiAmJiBzdHJlYW0ubWF0Y2goIiEhIikpIHsKICAgICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgICAgIHJldHVybiAidGFnIjsKICAgICAgICB9IGVsc2UgaWYgKHN0cmVhbS5tYXRjaCgvXiVbXHc6I1wuXSs9LykpIHsKICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gcnVieTsKICAgICAgICAgIHJldHVybiAiaGFtbFRhZyI7CiAgICAgICAgfSBlbHNlIGlmIChzdHJlYW0ubWF0Y2goL14lW1x3Ol0rLykpIHsKICAgICAgICAgIHJldHVybiAiaGFtbFRhZyI7CiAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAiLyIgKSB7CiAgICAgICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICAgICAgICByZXR1cm4gImNvbW1lbnQiOwogICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgKHN0YXRlLnN0YXJ0T2ZMaW5lIHx8IHN0YXRlLnByZXZpb3VzVG9rZW4uc3R5bGUgPT0gImhhbWxUYWciKSB7CiAgICAgICAgaWYgKCBjaCA9PSAiIyIgfHwgY2ggPT0gIi4iKSB7CiAgICAgICAgICBzdHJlYW0ubWF0Y2goL1tcdy0jXC5dKi8pOwogICAgICAgICAgcmV0dXJuICJoYW1sQXR0cmlidXRlIjsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIGRvbm90IGhhbmRsZSAtLT4gYXMgdmFsaWQgcnVieSwgbWFrZSBpdCBIVE1MIGNsb3NlIGNvbW1lbnQgaW5zdGVhZAogICAgICBpZiAoc3RhdGUuc3RhcnRPZkxpbmUgJiYgIXN0cmVhbS5tYXRjaCgiLS0+IiwgZmFsc2UpICYmIChjaCA9PSAiPSIgfHwgY2ggPT0gIi0iICkpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHJ1Ynk7CiAgICAgICAgcmV0dXJuIHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgICB9CgogICAgICBpZiAoc3RhdGUucHJldmlvdXNUb2tlbi5zdHlsZSA9PSAiaGFtbFRhZyIgfHwKICAgICAgICAgIHN0YXRlLnByZXZpb3VzVG9rZW4uc3R5bGUgPT0gImNsb3NlQXR0cmlidXRlVGFnIiB8fAogICAgICAgICAgc3RhdGUucHJldmlvdXNUb2tlbi5zdHlsZSA9PSAiaGFtbEF0dHJpYnV0ZSIpIHsKICAgICAgICBpZiAoY2ggPT0gIigiKSB7CiAgICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHJ1YnlJblF1b3RlKCIpIik7CiAgICAgICAgICByZXR1cm4gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CiAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAieyIpIHsKICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gcnVieUluUXVvdGUoIn0iKTsKICAgICAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiBodG1sTW9kZS50b2tlbihzdHJlYW0sIHN0YXRlLmh0bWxTdGF0ZSk7CiAgICB9CgogICAgcmV0dXJuIHsKICAgICAgLy8gZGVmYXVsdCB0byBodG1sIG1vZGUKICAgICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGh0bWxTdGF0ZSA9IGh0bWxNb2RlLnN0YXJ0U3RhdGUoKTsKICAgICAgICB2YXIgcnVieVN0YXRlID0gcnVieU1vZGUuc3RhcnRTdGF0ZSgpOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICBodG1sU3RhdGU6IGh0bWxTdGF0ZSwKICAgICAgICAgIHJ1YnlTdGF0ZTogcnVieVN0YXRlLAogICAgICAgICAgaW5kZW50ZWQ6IDAsCiAgICAgICAgICBwcmV2aW91c1Rva2VuOiB7IHN0eWxlOiBudWxsLCBpbmRlbnRlZDogMH0sCiAgICAgICAgICB0b2tlbml6ZTogaHRtbAogICAgICAgIH07CiAgICAgIH0sCgogICAgICBjb3B5U3RhdGU6IGZ1bmN0aW9uKHN0YXRlKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIGh0bWxTdGF0ZSA6IENvZGVNaXJyb3IuY29weVN0YXRlKGh0bWxNb2RlLCBzdGF0ZS5odG1sU3RhdGUpLAogICAgICAgICAgcnVieVN0YXRlOiBDb2RlTWlycm9yLmNvcHlTdGF0ZShydWJ5TW9kZSwgc3RhdGUucnVieVN0YXRlKSwKICAgICAgICAgIGluZGVudGVkOiBzdGF0ZS5pbmRlbnRlZCwKICAgICAgICAgIHByZXZpb3VzVG9rZW46IHN0YXRlLnByZXZpb3VzVG9rZW4sCiAgICAgICAgICB0b2tlbml6ZTogc3RhdGUudG9rZW5pemUKICAgICAgICB9OwogICAgICB9LAoKICAgICAgdG9rZW46IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgICBpZiAoc3RyZWFtLnNvbCgpKSB7CiAgICAgICAgICBzdGF0ZS5pbmRlbnRlZCA9IHN0cmVhbS5pbmRlbnRhdGlvbigpOwogICAgICAgICAgc3RhdGUuc3RhcnRPZkxpbmUgPSB0cnVlOwogICAgICAgIH0KICAgICAgICBpZiAoc3RyZWFtLmVhdFNwYWNlKCkpIHJldHVybiBudWxsOwogICAgICAgIHZhciBzdHlsZSA9IHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgICAgIHN0YXRlLnN0YXJ0T2ZMaW5lID0gZmFsc2U7CiAgICAgICAgLy8gZG9udCByZWNvcmQgY29tbWVudCBsaW5lIGFzIHdlIG9ubHkgd2FudCB0byBtZWFzdXJlIGNvbW1lbnQgbGluZSB3aXRoCiAgICAgICAgLy8gdGhlIG9wZW5pbmcgY29tbWVudCBibG9jawogICAgICAgIGlmIChzdHlsZSAmJiBzdHlsZSAhPSAiY29tbWVudExpbmUiKSB7CiAgICAgICAgICBzdGF0ZS5wcmV2aW91c1Rva2VuID0geyBzdHlsZTogc3R5bGUsIGluZGVudGVkOiBzdGF0ZS5pbmRlbnRlZCB9OwogICAgICAgIH0KICAgICAgICAvLyBpZiBjdXJyZW50IHN0YXRlIGlzIHJ1YnkgYW5kIHRoZSBwcmV2aW91cyB0b2tlbiBpcyBub3QgYCxgIHJlc2V0IHRoZQogICAgICAgIC8vIHRva2VuaXplIHRvIGh0bWwKICAgICAgICBpZiAoc3RyZWFtLmVvbCgpICYmIHN0YXRlLnRva2VuaXplID09IHJ1YnkpIHsKICAgICAgICAgIHN0cmVhbS5iYWNrVXAoMSk7CiAgICAgICAgICB2YXIgY2ggPSBzdHJlYW0ucGVlaygpOwogICAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgICAgIGlmIChjaCAmJiBjaCAhPSAiLCIpIHsKICAgICAgICAgICAgc3RhdGUudG9rZW5pemUgPSBodG1sOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyByZXByb2Nlc3Mgc29tZSBvZiB0aGUgc3BlY2lmaWMgc3R5bGUgdGFnIHdoZW4gZmluaXNoIHNldHRpbmcgcHJldmlvdXNUb2tlbgogICAgICAgIGlmIChzdHlsZSA9PSAiaGFtbFRhZyIpIHsKICAgICAgICAgIHN0eWxlID0gInRhZyI7CiAgICAgICAgfSBlbHNlIGlmIChzdHlsZSA9PSAiY29tbWVudExpbmUiKSB7CiAgICAgICAgICBzdHlsZSA9ICJjb21tZW50IjsKICAgICAgICB9IGVsc2UgaWYgKHN0eWxlID09ICJoYW1sQXR0cmlidXRlIikgewogICAgICAgICAgc3R5bGUgPSAiYXR0cmlidXRlIjsKICAgICAgICB9IGVsc2UgaWYgKHN0eWxlID09ICJjbG9zZUF0dHJpYnV0ZVRhZyIpIHsKICAgICAgICAgIHN0eWxlID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHN0eWxlOwogICAgICB9CiAgICB9OwogIH0sICJodG1sbWl4ZWQiLCAicnVieSIpOwoKICBDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveC1oYW1sIiwgImhhbWwiKTsKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/haml/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogSEFNTCBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL3htbC94bWwuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vaHRtbG1peGVkL2h0bWxtaXhlZC5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9qYXZhc2NyaXB0L2phdmFzY3JpcHQuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vcnVieS9ydWJ5LmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9ImhhbWwuanMiPjwvc2NyaXB0Pgo8c3R5bGU+LkNvZGVNaXJyb3Ige2JhY2tncm91bmQ6ICNmOGY4Zjg7fTwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGltZyBpZD1sb2dvIHNyYz0iLi4vLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+TGFuZ3VhZ2UgbW9kZXM8L2E+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPkhBTUw8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPkhBTUwgbW9kZTwvaDI+Cjxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+CiEhIQojY29udGVudAoubGVmdC5jb2x1bW4odGl0bGU9InRpdGxlIil7OmhyZWYgPT4gIi9oZWxsbyIsIDp0ZXN0ID0+ICIje2hlbGxvfV8je3dvcmxkfSJ9CiAgICA8IS0tIFRoaXMgaXMgYSBjb21tZW50IC0tPgogICAgJWgyIFdlbGNvbWUgdG8gb3VyIHNpdGUhCiAgICAlcD0gcHV0cyAiSEFNTCBNT0RFIgogIC5yaWdodC5jb2x1bW4KICAgID0gcmVuZGVyIDpwYXJ0aWFsID0+ICJzaWRlYmFyIgoKLmNvbnRhaW5lcgogIC5yb3cKICAgIC5zcGFuOAogICAgICAlaDEudGl0bGU9IEBwYWdlX3RpdGxlCiVwLnRpdGxlPSBAcGFnZV90aXRsZQolcAogIC8KICAgIFRoZSBzYW1lIGFzIEhUTUwgY29tbWVudAogICAgSGVsbG8gbXVsdGlsaW5lIGNvbW1lbnQKCiAgLSMgaGFtbCBjb21tZW50CiAgICAgIFRoaXMgd29udCBiZSBkaXNwbGF5ZWQKICAgICAgbm9yIHdpbGwgdGhpcwogIERhdGUvVGltZToKICAtIG5vdyA9IERhdGVUaW1lLm5vdwogICVzdHJvbmc9IG5vdwogIC0gaWYgbm93ID4gRGF0ZVRpbWUucGFyc2UoIkRlY2VtYmVyIDMxLCAyMDA2IikKICAgID0gIkhhcHB5IG5ldyAiICsgInllYXIhIgoKJXRpdGxlCiAgPSBAdGl0bGUKICBcPSBAdGl0bGUKICA8aDE+VGl0bGU8L2gxPgogIDxoMSB0aXRsZT0iSEVMTE8iPgogICAgVGl0bGUKICA8L2gxPgogICAgPC90ZXh0YXJlYT48L2Zvcm0+CiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgICAgIG1vZGU6ICJ0ZXh0L3gtaGFtbCIKICAgICAgfSk7CiAgICA8L3NjcmlwdD4KCiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC94LWhhbWw8L2NvZGU+LjwvcD4KCiAgICA8cD48c3Ryb25nPlBhcnNpbmcvSGlnaGxpZ2h0aW5nIFRlc3RzOjwvc3Ryb25nPiA8YSBocmVmPSIuLi8uLi90ZXN0L2luZGV4Lmh0bWwjaGFtbF8qIj5ub3JtYWw8L2E+LCAgPGEgaHJlZj0iLi4vLi4vdGVzdC9pbmRleC5odG1sI3ZlcmJvc2UsaGFtbF8qIj52ZXJib3NlPC9hPi48L3A+CgogIDwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/haml/test.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24oKSB7CiAgdmFyIG1vZGUgPSBDb2RlTWlycm9yLmdldE1vZGUoe3RhYlNpemU6IDQsIGluZGVudFVuaXQ6IDJ9LCAiaGFtbCIpOwogIGZ1bmN0aW9uIE1UKG5hbWUpIHsgdGVzdC5tb2RlKG5hbWUsIG1vZGUsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpOyB9CgogIC8vIFJlcXVpcmVzIGF0IGxlYXN0IG9uZSBtZWRpYSBxdWVyeQogIE1UKCJlbGVtZW50TmFtZSIsCiAgICAgIlt0YWcgJWgxXSBIZXkgVGhlcmUiKTsKCiAgTVQoIm9uZUVsZW1lbnRQZXJMaW5lIiwKICAgICAiW3RhZyAlaDFdIEhleSBUaGVyZSAlaDIiKTsKCiAgTVQoImlkU2VsZWN0b3IiLAogICAgICJbdGFnICVoMV1bYXR0cmlidXRlICN0ZXN0XSBIZXkgVGhlcmUiKTsKCiAgTVQoImNsYXNzU2VsZWN0b3IiLAogICAgICJbdGFnICVoMV1bYXR0cmlidXRlIC5oZWxsb10gSGV5IFRoZXJlIik7CgogIE1UKCJkb2NUeXBlIiwKICAgICAiW3RhZyAhISEgWE1MXSIpOwoKICBNVCgiY29tbWVudCIsCiAgICAgIltjb21tZW50IC8gSGVsbG8gV09STERdIik7CgogIE1UKCJub3RDb21tZW50IiwKICAgICAiW3RhZyAlaDFdIFRoaXMgaXMgbm90IGEgLyBjb21tZW50ICIpOwoKICBNVCgiYXR0cmlidXRlcyIsCiAgICAgIlt0YWcgJWFdKFt2YXJpYWJsZSB0aXRsZV1bb3BlcmF0b3IgPV1bc3RyaW5nIFwidGVzdFwiXSl7W2F0b20gOnRpdGxlXSBbb3BlcmF0b3IgPT5dIFtzdHJpbmcgXCJ0ZXN0XCJdfSIpOwoKICBNVCgiaHRtbENvZGUiLAogICAgICJbdGFnJmJyYWNrZXQgPF1bdGFnIGgxXVt0YWcmYnJhY2tldCA+XVRpdGxlW3RhZyZicmFja2V0IDwvXVt0YWcgaDFdW3RhZyZicmFja2V0ID5dIik7CgogIE1UKCJydWJ5QmxvY2siLAogICAgICJbb3BlcmF0b3IgPV1bdmFyaWFibGUtMiBAaXRlbV0iKTsKCiAgTVQoInNlbGVjdG9yUnVieUJsb2NrIiwKICAgICAiW3RhZyAlYS5zZWxlY3Rvcj1dIFt2YXJpYWJsZS0yIEBpdGVtXSIpOwoKICBNVCgibmVzdGVkUnVieUJsb2NrIiwKICAgICAgIlt0YWcgJWFdIiwKICAgICAgIiAgIFtvcGVyYXRvciA9XVt2YXJpYWJsZSBwdXRzXSBbc3RyaW5nIFwidGVzdFwiXSIpOwoKICBNVCgibXVsdGlsaW5lUGxhaW50ZXh0IiwKICAgICAgIlt0YWcgJXBdIiwKICAgICAgIiAgSGVsbG8sIiwKICAgICAgIiAgV29ybGQiKTsKCiAgTVQoIm11bHRpbGluZVJ1YnkiLAogICAgICAiW3RhZyAlcF0iLAogICAgICAiICBbY29tbWVudCAtIyB0aGlzIGlzIGEgY29tbWVudF0iLAogICAgICAiICAgICBbY29tbWVudCBhbmQgdGhpcyBpcyBhIGNvbW1lbnQgdG9vXSIsCiAgICAgICIgIERhdGUvVGltZSIsCiAgICAgICIgIFtvcGVyYXRvciAtXSBbdmFyaWFibGUgbm93XSBbb3BlcmF0b3IgPV0gW3RhZyBEYXRlVGltZV1bb3BlcmF0b3IgLl1bdmFyaWFibGUgbm93XSIsCiAgICAgICIgIFt0YWcgJXN0cm9uZz1dIFt2YXJpYWJsZSBub3ddIiwKICAgICAgIiAgW29wZXJhdG9yIC1dIFtrZXl3b3JkIGlmXSBbdmFyaWFibGUgbm93XSBbb3BlcmF0b3IgPl0gW3RhZyBEYXRlVGltZV1bb3BlcmF0b3IgLl1bdmFyaWFibGUgcGFyc2VdKFtzdHJpbmcgXCJEZWNlbWJlciAzMSwgMjAwNlwiXSkiLAogICAgICAiICAgICBbb3BlcmF0b3IgPV1bc3RyaW5nIFwiSGFwcHlcIl0iLAogICAgICAiICAgICBbb3BlcmF0b3IgPV1bc3RyaW5nIFwiQmVsYXRlZFwiXSIsCiAgICAgICIgICAgIFtvcGVyYXRvciA9XVtzdHJpbmcgXCJCaXJ0aGRheVwiXSIpOwoKICBNVCgibXVsdGlsaW5lQ29tbWVudCIsCiAgICAgICJbY29tbWVudCAvXSIsCiAgICAgICIgIFtjb21tZW50IE11bHRpbGluZV0iLAogICAgICAiICBbY29tbWVudCBDb21tZW50XSIpOwoKICBNVCgiaGFtbENvbW1lbnQiLAogICAgICJbY29tbWVudCAtIyB0aGlzIGlzIGEgY29tbWVudF0iKTsKCiAgTVQoIm11bHRpbGluZUhhbWxDb21tZW50IiwKICAgICAiW2NvbW1lbnQgLSMgdGhpcyBpcyBhIGNvbW1lbnRdIiwKICAgICAiICAgW2NvbW1lbnQgYW5kIHRoaXMgaXMgYSBjb21tZW50IHRvb10iKTsKCiAgTVQoIm11bHRpbGluZUhUTUxDb21tZW50IiwKICAgICJbY29tbWVudCA8IS0tXSIsCiAgICAiICBbY29tbWVudCB3aGF0IGEgY29tbWVudF0iLAogICAgIiAgW2NvbW1lbnQgLS0+XSIpOwoKICBNVCgiaGFtbEFmdGVyUnVieVRhZyIsCiAgICAiW2F0dHJpYnV0ZSAuYmxvY2tdIiwKICAgICIgIFt0YWcgJXN0cm9uZz1dIFt2YXJpYWJsZSBub3ddIiwKICAgICIgIFthdHRyaWJ1dGUgLnRlc3RdIiwKICAgICIgICAgIFtvcGVyYXRvciA9XVt2YXJpYWJsZSBub3ddIiwKICAgICIgIFthdHRyaWJ1dGUgLnJpZ2h0XSIpOwoKICBNVCgic3RyZXRjaGVkUnVieSIsCiAgICAgIltvcGVyYXRvciA9XSBbdmFyaWFibGUgcHV0c10gW3N0cmluZyBcIkhlbGxvXCJdLCIsCiAgICAgIiAgIFtzdHJpbmcgXCJXb3JsZFwiXSIpOwoKICBNVCgiaW50ZXJwb2xhdGlvbkluSGFzaEF0dHJpYnV0ZSIsCiAgICAgLy8iW3RhZyAlZGl2XXtbYXRvbSA6aWRdIFtvcGVyYXRvciA9Pl0gW3N0cmluZyBcIiN7XVt2YXJpYWJsZSB0ZXN0XVtzdHJpbmcgfV8je11bdmFyaWFibGUgdGluZ11bc3RyaW5nIH1cIl19IHRlc3QiKTsKICAgICAiW3RhZyAlZGl2XXtbYXRvbSA6aWRdIFtvcGVyYXRvciA9Pl0gW3N0cmluZyBcIiN7XVt2YXJpYWJsZSB0ZXN0XVtzdHJpbmcgfV8je11bdmFyaWFibGUgdGluZ11bc3RyaW5nIH1cIl19IHRlc3QiKTsKCiAgTVQoImludGVycG9sYXRpb25JbkhUTUxBdHRyaWJ1dGUiLAogICAgICJbdGFnICVkaXZdKFt2YXJpYWJsZSB0aXRsZV1bb3BlcmF0b3IgPV1bc3RyaW5nIFwiI3tdW3ZhcmlhYmxlIHRlc3RdW3N0cmluZyB9XyN7XVt2YXJpYWJsZSB0aW5nXSgpW3N0cmluZyB9XCJdKSBUZXN0Iik7Cn0pKCk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/haskell/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/haskell/haskell.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJoYXNrZWxsIiwgZnVuY3Rpb24oX2NvbmZpZywgbW9kZUNvbmZpZykgewoKICBmdW5jdGlvbiBzd2l0Y2hTdGF0ZShzb3VyY2UsIHNldFN0YXRlLCBmKSB7CiAgICBzZXRTdGF0ZShmKTsKICAgIHJldHVybiBmKHNvdXJjZSwgc2V0U3RhdGUpOwogIH0KCiAgLy8gVGhlc2Ugc2hvdWxkIGFsbCBiZSBVbmljb2RlIGV4dGVuZGVkLCBhcyBwZXIgdGhlIEhhc2tlbGwgMjAxMCByZXBvcnQKICB2YXIgc21hbGxSRSA9IC9bYS16X10vOwogIHZhciBsYXJnZVJFID0gL1tBLVpdLzsKICB2YXIgZGlnaXRSRSA9IC9cZC87CiAgdmFyIGhleGl0UkUgPSAvWzAtOUEtRmEtZl0vOwogIHZhciBvY3RpdFJFID0gL1swLTddLzsKICB2YXIgaWRSRSA9IC9bYS16X0EtWjAtOSddLzsKICB2YXIgc3ltYm9sUkUgPSAvWy0hIyQlJiorLlwvPD0+P0BcXF58fjpdLzsKICB2YXIgc3BlY2lhbFJFID0gL1soKSw7W1xdYHt9XS87CiAgdmFyIHdoaXRlQ2hhclJFID0gL1sgXHRcdlxmXS87IC8vIG5ld2xpbmVzIGFyZSBoYW5kbGVkIGluIHRva2VuaXplcgoKICBmdW5jdGlvbiBub3JtYWwoc291cmNlLCBzZXRTdGF0ZSkgewogICAgaWYgKHNvdXJjZS5lYXRXaGlsZSh3aGl0ZUNoYXJSRSkpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgdmFyIGNoID0gc291cmNlLm5leHQoKTsKICAgIGlmIChzcGVjaWFsUkUudGVzdChjaCkpIHsKICAgICAgaWYgKGNoID09ICd7JyAmJiBzb3VyY2UuZWF0KCctJykpIHsKICAgICAgICB2YXIgdCA9ICJjb21tZW50IjsKICAgICAgICBpZiAoc291cmNlLmVhdCgnIycpKSB7CiAgICAgICAgICB0ID0gIm1ldGEiOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc3dpdGNoU3RhdGUoc291cmNlLCBzZXRTdGF0ZSwgbmNvbW1lbnQodCwgMSkpOwogICAgICB9CiAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIGlmIChjaCA9PSAnXCcnKSB7CiAgICAgIGlmIChzb3VyY2UuZWF0KCdcXCcpKSB7CiAgICAgICAgc291cmNlLm5leHQoKTsgIC8vIHNob3VsZCBoYW5kbGUgb3RoZXIgZXNjYXBlcyBoZXJlCiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgc291cmNlLm5leHQoKTsKICAgICAgfQogICAgICBpZiAoc291cmNlLmVhdCgnXCcnKSkgewogICAgICAgIHJldHVybiAic3RyaW5nIjsKICAgICAgfQogICAgICByZXR1cm4gImVycm9yIjsKICAgIH0KCiAgICBpZiAoY2ggPT0gJyInKSB7CiAgICAgIHJldHVybiBzd2l0Y2hTdGF0ZShzb3VyY2UsIHNldFN0YXRlLCBzdHJpbmdMaXRlcmFsKTsKICAgIH0KCiAgICBpZiAobGFyZ2VSRS50ZXN0KGNoKSkgewogICAgICBzb3VyY2UuZWF0V2hpbGUoaWRSRSk7CiAgICAgIGlmIChzb3VyY2UuZWF0KCcuJykpIHsKICAgICAgICByZXR1cm4gInF1YWxpZmllciI7CiAgICAgIH0KICAgICAgcmV0dXJuICJ2YXJpYWJsZS0yIjsKICAgIH0KCiAgICBpZiAoc21hbGxSRS50ZXN0KGNoKSkgewogICAgICBzb3VyY2UuZWF0V2hpbGUoaWRSRSk7CiAgICAgIHJldHVybiAidmFyaWFibGUiOwogICAgfQoKICAgIGlmIChkaWdpdFJFLnRlc3QoY2gpKSB7CiAgICAgIGlmIChjaCA9PSAnMCcpIHsKICAgICAgICBpZiAoc291cmNlLmVhdCgvW3hYXS8pKSB7CiAgICAgICAgICBzb3VyY2UuZWF0V2hpbGUoaGV4aXRSRSk7IC8vIHNob3VsZCByZXF1aXJlIGF0IGxlYXN0IDEKICAgICAgICAgIHJldHVybiAiaW50ZWdlciI7CiAgICAgICAgfQogICAgICAgIGlmIChzb3VyY2UuZWF0KC9bb09dLykpIHsKICAgICAgICAgIHNvdXJjZS5lYXRXaGlsZShvY3RpdFJFKTsgLy8gc2hvdWxkIHJlcXVpcmUgYXQgbGVhc3QgMQogICAgICAgICAgcmV0dXJuICJudW1iZXIiOwogICAgICAgIH0KICAgICAgfQogICAgICBzb3VyY2UuZWF0V2hpbGUoZGlnaXRSRSk7CiAgICAgIHZhciB0ID0gIm51bWJlciI7CiAgICAgIGlmIChzb3VyY2UubWF0Y2goL15cLlxkKy8pKSB7CiAgICAgICAgdCA9ICJudW1iZXIiOwogICAgICB9CiAgICAgIGlmIChzb3VyY2UuZWF0KC9bZUVdLykpIHsKICAgICAgICB0ID0gIm51bWJlciI7CiAgICAgICAgc291cmNlLmVhdCgvWy0rXS8pOwogICAgICAgIHNvdXJjZS5lYXRXaGlsZShkaWdpdFJFKTsgLy8gc2hvdWxkIHJlcXVpcmUgYXQgbGVhc3QgMQogICAgICB9CiAgICAgIHJldHVybiB0OwogICAgfQoKICAgIGlmIChjaCA9PSAiLiIgJiYgc291cmNlLmVhdCgiLiIpKQogICAgICByZXR1cm4gImtleXdvcmQiOwoKICAgIGlmIChzeW1ib2xSRS50ZXN0KGNoKSkgewogICAgICBpZiAoY2ggPT0gJy0nICYmIHNvdXJjZS5lYXQoLy0vKSkgewogICAgICAgIHNvdXJjZS5lYXRXaGlsZSgvLS8pOwogICAgICAgIGlmICghc291cmNlLmVhdChzeW1ib2xSRSkpIHsKICAgICAgICAgIHNvdXJjZS5za2lwVG9FbmQoKTsKICAgICAgICAgIHJldHVybiAiY29tbWVudCI7CiAgICAgICAgfQogICAgICB9CiAgICAgIHZhciB0ID0gInZhcmlhYmxlIjsKICAgICAgaWYgKGNoID09ICc6JykgewogICAgICAgIHQgPSAidmFyaWFibGUtMiI7CiAgICAgIH0KICAgICAgc291cmNlLmVhdFdoaWxlKHN5bWJvbFJFKTsKICAgICAgcmV0dXJuIHQ7CiAgICB9CgogICAgcmV0dXJuICJlcnJvciI7CiAgfQoKICBmdW5jdGlvbiBuY29tbWVudCh0eXBlLCBuZXN0KSB7CiAgICBpZiAobmVzdCA9PSAwKSB7CiAgICAgIHJldHVybiBub3JtYWw7CiAgICB9CiAgICByZXR1cm4gZnVuY3Rpb24oc291cmNlLCBzZXRTdGF0ZSkgewogICAgICB2YXIgY3Vyck5lc3QgPSBuZXN0OwogICAgICB3aGlsZSAoIXNvdXJjZS5lb2woKSkgewogICAgICAgIHZhciBjaCA9IHNvdXJjZS5uZXh0KCk7CiAgICAgICAgaWYgKGNoID09ICd7JyAmJiBzb3VyY2UuZWF0KCctJykpIHsKICAgICAgICAgICsrY3Vyck5lc3Q7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGNoID09ICctJyAmJiBzb3VyY2UuZWF0KCd9JykpIHsKICAgICAgICAgIC0tY3Vyck5lc3Q7CiAgICAgICAgICBpZiAoY3Vyck5lc3QgPT0gMCkgewogICAgICAgICAgICBzZXRTdGF0ZShub3JtYWwpOwogICAgICAgICAgICByZXR1cm4gdHlwZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgc2V0U3RhdGUobmNvbW1lbnQodHlwZSwgY3Vyck5lc3QpKTsKICAgICAgcmV0dXJuIHR5cGU7CiAgICB9OwogIH0KCiAgZnVuY3Rpb24gc3RyaW5nTGl0ZXJhbChzb3VyY2UsIHNldFN0YXRlKSB7CiAgICB3aGlsZSAoIXNvdXJjZS5lb2woKSkgewogICAgICB2YXIgY2ggPSBzb3VyY2UubmV4dCgpOwogICAgICBpZiAoY2ggPT0gJyInKSB7CiAgICAgICAgc2V0U3RhdGUobm9ybWFsKTsKICAgICAgICByZXR1cm4gInN0cmluZyI7CiAgICAgIH0KICAgICAgaWYgKGNoID09ICdcXCcpIHsKICAgICAgICBpZiAoc291cmNlLmVvbCgpIHx8IHNvdXJjZS5lYXQod2hpdGVDaGFyUkUpKSB7CiAgICAgICAgICBzZXRTdGF0ZShzdHJpbmdHYXApOwogICAgICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgICAgIH0KICAgICAgICBpZiAoc291cmNlLmVhdCgnJicpKSB7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgc291cmNlLm5leHQoKTsgLy8gc2hvdWxkIGhhbmRsZSBvdGhlciBlc2NhcGVzIGhlcmUKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHNldFN0YXRlKG5vcm1hbCk7CiAgICByZXR1cm4gImVycm9yIjsKICB9CgogIGZ1bmN0aW9uIHN0cmluZ0dhcChzb3VyY2UsIHNldFN0YXRlKSB7CiAgICBpZiAoc291cmNlLmVhdCgnXFwnKSkgewogICAgICByZXR1cm4gc3dpdGNoU3RhdGUoc291cmNlLCBzZXRTdGF0ZSwgc3RyaW5nTGl0ZXJhbCk7CiAgICB9CiAgICBzb3VyY2UubmV4dCgpOwogICAgc2V0U3RhdGUobm9ybWFsKTsKICAgIHJldHVybiAiZXJyb3IiOwogIH0KCgogIHZhciB3ZWxsS25vd25Xb3JkcyA9IChmdW5jdGlvbigpIHsKICAgIHZhciB3a3cgPSB7fTsKICAgIGZ1bmN0aW9uIHNldFR5cGUodCkgewogICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKQogICAgICAgICAgd2t3W2FyZ3VtZW50c1tpXV0gPSB0OwogICAgICB9OwogICAgfQoKICAgIHNldFR5cGUoImtleXdvcmQiKSgKICAgICAgImNhc2UiLCAiY2xhc3MiLCAiZGF0YSIsICJkZWZhdWx0IiwgImRlcml2aW5nIiwgImRvIiwgImVsc2UiLCAiZm9yZWlnbiIsCiAgICAgICJpZiIsICJpbXBvcnQiLCAiaW4iLCAiaW5maXgiLCAiaW5maXhsIiwgImluZml4ciIsICJpbnN0YW5jZSIsICJsZXQiLAogICAgICAibW9kdWxlIiwgIm5ld3R5cGUiLCAib2YiLCAidGhlbiIsICJ0eXBlIiwgIndoZXJlIiwgIl8iKTsKCiAgICBzZXRUeXBlKCJrZXl3b3JkIikoCiAgICAgICJcLlwuIiwgIjoiLCAiOjoiLCAiPSIsICJcXCIsICJcIiIsICI8LSIsICItPiIsICJAIiwgIn4iLCAiPT4iKTsKCiAgICBzZXRUeXBlKCJidWlsdGluIikoCiAgICAgICIhISIsICIkISIsICIkIiwgIiYmIiwgIisiLCAiKysiLCAiLSIsICIuIiwgIi8iLCAiLz0iLCAiPCIsICI8PSIsICI9PDwiLAogICAgICAiPT0iLCAiPiIsICI+PSIsICI+PiIsICI+Pj0iLCAiXiIsICJeXiIsICJ8fCIsICIqIiwgIioqIik7CgogICAgc2V0VHlwZSgiYnVpbHRpbiIpKAogICAgICAiQm9vbCIsICJCb3VuZGVkIiwgIkNoYXIiLCAiRG91YmxlIiwgIkVRIiwgIkVpdGhlciIsICJFbnVtIiwgIkVxIiwKICAgICAgIkZhbHNlIiwgIkZpbGVQYXRoIiwgIkZsb2F0IiwgIkZsb2F0aW5nIiwgIkZyYWN0aW9uYWwiLCAiRnVuY3RvciIsICJHVCIsCiAgICAgICJJTyIsICJJT0Vycm9yIiwgIkludCIsICJJbnRlZ2VyIiwgIkludGVncmFsIiwgIkp1c3QiLCAiTFQiLCAiTGVmdCIsCiAgICAgICJNYXliZSIsICJNb25hZCIsICJOb3RoaW5nIiwgIk51bSIsICJPcmQiLCAiT3JkZXJpbmciLCAiUmF0aW9uYWwiLCAiUmVhZCIsCiAgICAgICJSZWFkUyIsICJSZWFsIiwgIlJlYWxGbG9hdCIsICJSZWFsRnJhYyIsICJSaWdodCIsICJTaG93IiwgIlNob3dTIiwKICAgICAgIlN0cmluZyIsICJUcnVlIik7CgogICAgc2V0VHlwZSgiYnVpbHRpbiIpKAogICAgICAiYWJzIiwgImFjb3MiLCAiYWNvc2giLCAiYWxsIiwgImFuZCIsICJhbnkiLCAiYXBwZW5kRmlsZSIsICJhc1R5cGVPZiIsCiAgICAgICJhc2luIiwgImFzaW5oIiwgImF0YW4iLCAiYXRhbjIiLCAiYXRhbmgiLCAiYnJlYWsiLCAiY2F0Y2giLCAiY2VpbGluZyIsCiAgICAgICJjb21wYXJlIiwgImNvbmNhdCIsICJjb25jYXRNYXAiLCAiY29uc3QiLCAiY29zIiwgImNvc2giLCAiY3VycnkiLAogICAgICAiY3ljbGUiLCAiZGVjb2RlRmxvYXQiLCAiZGl2IiwgImRpdk1vZCIsICJkcm9wIiwgImRyb3BXaGlsZSIsICJlaXRoZXIiLAogICAgICAiZWxlbSIsICJlbmNvZGVGbG9hdCIsICJlbnVtRnJvbSIsICJlbnVtRnJvbVRoZW4iLCAiZW51bUZyb21UaGVuVG8iLAogICAgICAiZW51bUZyb21UbyIsICJlcnJvciIsICJldmVuIiwgImV4cCIsICJleHBvbmVudCIsICJmYWlsIiwgImZpbHRlciIsCiAgICAgICJmbGlwIiwgImZsb2F0RGlnaXRzIiwgImZsb2F0UmFkaXgiLCAiZmxvYXRSYW5nZSIsICJmbG9vciIsICJmbWFwIiwKICAgICAgImZvbGRsIiwgImZvbGRsMSIsICJmb2xkciIsICJmb2xkcjEiLCAiZnJvbUVudW0iLCAiZnJvbUludGVnZXIiLAogICAgICAiZnJvbUludGVncmFsIiwgImZyb21SYXRpb25hbCIsICJmc3QiLCAiZ2NkIiwgImdldENoYXIiLCAiZ2V0Q29udGVudHMiLAogICAgICAiZ2V0TGluZSIsICJoZWFkIiwgImlkIiwgImluaXQiLCAiaW50ZXJhY3QiLCAiaW9FcnJvciIsICJpc0Rlbm9ybWFsaXplZCIsCiAgICAgICJpc0lFRUUiLCAiaXNJbmZpbml0ZSIsICJpc05hTiIsICJpc05lZ2F0aXZlWmVybyIsICJpdGVyYXRlIiwgImxhc3QiLAogICAgICAibGNtIiwgImxlbmd0aCIsICJsZXgiLCAibGluZXMiLCAibG9nIiwgImxvZ0Jhc2UiLCAibG9va3VwIiwgIm1hcCIsCiAgICAgICJtYXBNIiwgIm1hcE1fIiwgIm1heCIsICJtYXhCb3VuZCIsICJtYXhpbXVtIiwgIm1heWJlIiwgIm1pbiIsICJtaW5Cb3VuZCIsCiAgICAgICJtaW5pbXVtIiwgIm1vZCIsICJuZWdhdGUiLCAibm90IiwgIm5vdEVsZW0iLCAibnVsbCIsICJvZGQiLCAib3IiLAogICAgICAib3RoZXJ3aXNlIiwgInBpIiwgInByZWQiLCAicHJpbnQiLCAicHJvZHVjdCIsICJwcm9wZXJGcmFjdGlvbiIsCiAgICAgICJwdXRDaGFyIiwgInB1dFN0ciIsICJwdXRTdHJMbiIsICJxdW90IiwgInF1b3RSZW0iLCAicmVhZCIsICJyZWFkRmlsZSIsCiAgICAgICJyZWFkSU8iLCAicmVhZExpc3QiLCAicmVhZExuIiwgInJlYWRQYXJlbiIsICJyZWFkcyIsICJyZWFkc1ByZWMiLAogICAgICAicmVhbFRvRnJhYyIsICJyZWNpcCIsICJyZW0iLCAicmVwZWF0IiwgInJlcGxpY2F0ZSIsICJyZXR1cm4iLCAicmV2ZXJzZSIsCiAgICAgICJyb3VuZCIsICJzY2FsZUZsb2F0IiwgInNjYW5sIiwgInNjYW5sMSIsICJzY2FuciIsICJzY2FucjEiLCAic2VxIiwKICAgICAgInNlcXVlbmNlIiwgInNlcXVlbmNlXyIsICJzaG93IiwgInNob3dDaGFyIiwgInNob3dMaXN0IiwgInNob3dQYXJlbiIsCiAgICAgICJzaG93U3RyaW5nIiwgInNob3dzIiwgInNob3dzUHJlYyIsICJzaWduaWZpY2FuZCIsICJzaWdudW0iLCAic2luIiwKICAgICAgInNpbmgiLCAic25kIiwgInNwYW4iLCAic3BsaXRBdCIsICJzcXJ0IiwgInN1YnRyYWN0IiwgInN1Y2MiLCAic3VtIiwKICAgICAgInRhaWwiLCAidGFrZSIsICJ0YWtlV2hpbGUiLCAidGFuIiwgInRhbmgiLCAidG9FbnVtIiwgInRvSW50ZWdlciIsCiAgICAgICJ0b1JhdGlvbmFsIiwgInRydW5jYXRlIiwgInVuY3VycnkiLCAidW5kZWZpbmVkIiwgInVubGluZXMiLCAidW50aWwiLAogICAgICAidW53b3JkcyIsICJ1bnppcCIsICJ1bnppcDMiLCAidXNlckVycm9yIiwgIndvcmRzIiwgIndyaXRlRmlsZSIsICJ6aXAiLAogICAgICAiemlwMyIsICJ6aXBXaXRoIiwgInppcFdpdGgzIik7CgogICAgdmFyIG92ZXJyaWRlID0gbW9kZUNvbmZpZy5vdmVycmlkZUtleXdvcmRzOwogICAgaWYgKG92ZXJyaWRlKSBmb3IgKHZhciB3b3JkIGluIG92ZXJyaWRlKSBpZiAob3ZlcnJpZGUuaGFzT3duUHJvcGVydHkod29yZCkpCiAgICAgIHdrd1t3b3JkXSA9IG92ZXJyaWRlW3dvcmRdOwoKICAgIHJldHVybiB3a3c7CiAgfSkoKTsKCgoKICByZXR1cm4gewogICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24gKCkgIHsgcmV0dXJuIHsgZjogbm9ybWFsIH07IH0sCiAgICBjb3B5U3RhdGU6ICBmdW5jdGlvbiAocykgeyByZXR1cm4geyBmOiBzLmYgfTsgfSwKCiAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICB2YXIgdCA9IHN0YXRlLmYoc3RyZWFtLCBmdW5jdGlvbihzKSB7IHN0YXRlLmYgPSBzOyB9KTsKICAgICAgdmFyIHcgPSBzdHJlYW0uY3VycmVudCgpOwogICAgICByZXR1cm4gd2VsbEtub3duV29yZHMuaGFzT3duUHJvcGVydHkodykgPyB3ZWxsS25vd25Xb3Jkc1t3XSA6IHQ7CiAgICB9LAoKICAgIGJsb2NrQ29tbWVudFN0YXJ0OiAiey0iLAogICAgYmxvY2tDb21tZW50RW5kOiAiLX0iLAogICAgbGluZUNvbW1lbnQ6ICItLSIKICB9OwoKfSk7CgpDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveC1oYXNrZWxsIiwgImhhc2tlbGwiKTsKCn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/haskell/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogSGFza2VsbCBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi90aGVtZS9lbGVnYW50LmNzcyI+CjxzY3JpcHQgc3JjPSIuLi8uLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi8uLi9hZGRvbi9lZGl0L21hdGNoYnJhY2tldHMuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iaGFza2VsbC5qcyI+PC9zY3JpcHQ+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+LkNvZGVNaXJyb3Ige2JvcmRlci10b3A6IDFweCBzb2xpZCBibGFjazsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO308L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5IYXNrZWxsPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5IYXNrZWxsIG1vZGU8L2gyPgo8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgptb2R1bGUgVW5pcXVlUGVybXMgKAogICAgdW5pcXVlUGVybXMKICAgICkKd2hlcmUKCi0tIHwgRmluZCBhbGwgdW5pcXVlIHBlcm11dGF0aW9ucyBvZiBhIGxpc3Qgd2hlcmUgdGhlcmUgbWlnaHQgYmUgZHVwbGljYXRlcy4KdW5pcXVlUGVybXMgOjogKEVxIGEpID0+IFthXSAtPiBbW2FdXQp1bmlxdWVQZXJtcyA9IHBlcm1CYWcgLiBtYWtlQmFnCgotLSB8IEFuIHVub3JkZXJlZCBjb2xsZWN0aW9uIHdoZXJlIGR1cGxpY2F0ZSB2YWx1ZXMgYXJlIGFsbG93ZWQsCi0tIGJ1dCByZXByZXNlbnRlZCB3aXRoIGEgc2luZ2xlIHZhbHVlIGFuZCBhIGNvdW50Lgp0eXBlIEJhZyBhID0gWyhhLCBJbnQpXQoKbWFrZUJhZyA6OiAoRXEgYSkgPT4gW2FdIC0+IEJhZyBhCm1ha2VCYWcgW10gPSBbXQptYWtlQmFnIChhOmFzKSA9IG1peCBhICQgbWFrZUJhZyBhcwogIHdoZXJlCiAgICBtaXggYSBbXSAgICAgICAgICAgICAgICAgICAgICAgID0gWyhhLDEpXQogICAgbWl4IGEgKGJuQChiLG4pOmJzKSB8IGEgPT0gYiAgICA9IChiLG4rMSk6YnMKICAgICAgICAgICAgICAgICAgICAgICAgfCBvdGhlcndpc2UgPSBibiA6IG1peCBhIGJzCgpwZXJtQmFnIDo6IEJhZyBhIC0+IFtbYV1dCnBlcm1CYWcgW10gPSBbW11dCnBlcm1CYWcgYnMgPSBjb25jYXRNYXAgKFwoZixjcykgLT4gbWFwIChmOikgJCBwZXJtQmFnIGNzKSAuIG9uZU9mRWFjaCAkIGJzCiAgd2hlcmUKICAgIG9uZU9mRWFjaCBbXSA9IFtdCiAgICBvbmVPZkVhY2ggKGFuQChhLG4pOmJzKSA9CiAgICAgICAgbGV0IGJzJyA9IGlmIG4gPT0gMSB0aGVuIGJzIGVsc2UgKGEsbi0xKTpicwogICAgICAgIGluIChhLGJzJykgOiBtYXBTbmQgKGFuOikgKG9uZU9mRWFjaCBicykKICAgIAogICAgYXBTbmQgZiAoYSxiKSA9IChhLCBmIGIpCiAgICBtYXBTbmQgPSBtYXAgLiBhcFNuZAo8L3RleHRhcmVhPjwvZm9ybT4KCiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgICAgIG1hdGNoQnJhY2tldHM6IHRydWUsCiAgICAgICAgdGhlbWU6ICJlbGVnYW50IgogICAgICB9KTsKICAgIDwvc2NyaXB0PgoKICAgIDxwPjxzdHJvbmc+TUlNRSB0eXBlcyBkZWZpbmVkOjwvc3Ryb25nPiA8Y29kZT50ZXh0L3gtaGFza2VsbDwvY29kZT4uPC9wPgogIDwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/haxe/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/haxe/haxe.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJoYXhlIiwgZnVuY3Rpb24oY29uZmlnLCBwYXJzZXJDb25maWcpIHsKICB2YXIgaW5kZW50VW5pdCA9IGNvbmZpZy5pbmRlbnRVbml0OwoKICAvLyBUb2tlbml6ZXIKCiAgdmFyIGtleXdvcmRzID0gZnVuY3Rpb24oKXsKICAgIGZ1bmN0aW9uIGt3KHR5cGUpIHtyZXR1cm4ge3R5cGU6IHR5cGUsIHN0eWxlOiAia2V5d29yZCJ9O30KICAgIHZhciBBID0ga3coImtleXdvcmQgYSIpLCBCID0ga3coImtleXdvcmQgYiIpLCBDID0ga3coImtleXdvcmQgYyIpOwogICAgdmFyIG9wZXJhdG9yID0ga3coIm9wZXJhdG9yIiksIGF0b20gPSB7dHlwZTogImF0b20iLCBzdHlsZTogImF0b20ifSwgYXR0cmlidXRlID0ge3R5cGU6ImF0dHJpYnV0ZSIsIHN0eWxlOiAiYXR0cmlidXRlIn07CiAgdmFyIHR5cGUgPSBrdygidHlwZWRlZiIpOwogICAgcmV0dXJuIHsKICAgICAgImlmIjogQSwgIndoaWxlIjogQSwgImVsc2UiOiBCLCAiZG8iOiBCLCAidHJ5IjogQiwKICAgICAgInJldHVybiI6IEMsICJicmVhayI6IEMsICJjb250aW51ZSI6IEMsICJuZXciOiBDLCAidGhyb3ciOiBDLAogICAgICAidmFyIjoga3coInZhciIpLCAiaW5saW5lIjphdHRyaWJ1dGUsICJzdGF0aWMiOiBhdHRyaWJ1dGUsICJ1c2luZyI6a3coImltcG9ydCIpLAogICAgInB1YmxpYyI6IGF0dHJpYnV0ZSwgInByaXZhdGUiOiBhdHRyaWJ1dGUsICJjYXN0Ijoga3coImNhc3QiKSwgImltcG9ydCI6IGt3KCJpbXBvcnQiKSwgIm1hY3JvIjoga3coIm1hY3JvIiksCiAgICAgICJmdW5jdGlvbiI6IGt3KCJmdW5jdGlvbiIpLCAiY2F0Y2giOiBrdygiY2F0Y2giKSwgInVudHlwZWQiOiBrdygidW50eXBlZCIpLCAiY2FsbGJhY2siOiBrdygiY2IiKSwKICAgICAgImZvciI6IGt3KCJmb3IiKSwgInN3aXRjaCI6IGt3KCJzd2l0Y2giKSwgImNhc2UiOiBrdygiY2FzZSIpLCAiZGVmYXVsdCI6IGt3KCJkZWZhdWx0IiksCiAgICAgICJpbiI6IG9wZXJhdG9yLCAibmV2ZXIiOiBrdygicHJvcGVydHlfYWNjZXNzIiksICJ0cmFjZSI6a3coInRyYWNlIiksCiAgICAiY2xhc3MiOiB0eXBlLCAiYWJzdHJhY3QiOnR5cGUsICJlbnVtIjp0eXBlLCAiaW50ZXJmYWNlIjp0eXBlLCAidHlwZWRlZiI6dHlwZSwgImV4dGVuZHMiOnR5cGUsICJpbXBsZW1lbnRzIjp0eXBlLCAiZHluYW1pYyI6dHlwZSwKICAgICAgInRydWUiOiBhdG9tLCAiZmFsc2UiOiBhdG9tLCAibnVsbCI6IGF0b20KICAgIH07CiAgfSgpOwoKICB2YXIgaXNPcGVyYXRvckNoYXIgPSAvWytcLSomJT08PiE/fF0vOwoKICBmdW5jdGlvbiBjaGFpbihzdHJlYW0sIHN0YXRlLCBmKSB7CiAgICBzdGF0ZS50b2tlbml6ZSA9IGY7CiAgICByZXR1cm4gZihzdHJlYW0sIHN0YXRlKTsKICB9CgogIGZ1bmN0aW9uIG5leHRVbnRpbFVuZXNjYXBlZChzdHJlYW0sIGVuZCkgewogICAgdmFyIGVzY2FwZWQgPSBmYWxzZSwgbmV4dDsKICAgIHdoaWxlICgobmV4dCA9IHN0cmVhbS5uZXh0KCkpICE9IG51bGwpIHsKICAgICAgaWYgKG5leHQgPT0gZW5kICYmICFlc2NhcGVkKQogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgZXNjYXBlZCA9ICFlc2NhcGVkICYmIG5leHQgPT0gIlxcIjsKICAgIH0KICAgIHJldHVybiBlc2NhcGVkOwogIH0KCiAgLy8gVXNlZCBhcyBzY3JhdGNoIHZhcmlhYmxlcyB0byBjb21tdW5pY2F0ZSBtdWx0aXBsZSB2YWx1ZXMgd2l0aG91dAogIC8vIGNvbnNpbmcgdXAgdG9ucyBvZiBvYmplY3RzLgogIHZhciB0eXBlLCBjb250ZW50OwogIGZ1bmN0aW9uIHJldCh0cCwgc3R5bGUsIGNvbnQpIHsKICAgIHR5cGUgPSB0cDsgY29udGVudCA9IGNvbnQ7CiAgICByZXR1cm4gc3R5bGU7CiAgfQoKICBmdW5jdGlvbiBoYXhlVG9rZW5CYXNlKHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBjaCA9IHN0cmVhbS5uZXh0KCk7CiAgICBpZiAoY2ggPT0gJyInIHx8IGNoID09ICInIikKICAgICAgcmV0dXJuIGNoYWluKHN0cmVhbSwgc3RhdGUsIGhheGVUb2tlblN0cmluZyhjaCkpOwogICAgZWxzZSBpZiAoL1tcW1xde31cKFwpLDtcOlwuXS8udGVzdChjaCkpCiAgICAgIHJldHVybiByZXQoY2gpOwogICAgZWxzZSBpZiAoY2ggPT0gIjAiICYmIHN0cmVhbS5lYXQoL3gvaSkpIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXGRhLWZdL2kpOwogICAgICByZXR1cm4gcmV0KCJudW1iZXIiLCAibnVtYmVyIik7CiAgICB9CiAgICBlbHNlIGlmICgvXGQvLnRlc3QoY2gpIHx8IGNoID09ICItIiAmJiBzdHJlYW0uZWF0KC9cZC8pKSB7CiAgICAgIHN0cmVhbS5tYXRjaCgvXlxkKig/OlwuXGQqKT8oPzpbZUVdWytcLV0/XGQrKT8vKTsKICAgICAgcmV0dXJuIHJldCgibnVtYmVyIiwgIm51bWJlciIpOwogICAgfQogICAgZWxzZSBpZiAoc3RhdGUucmVBbGxvd2VkICYmIChjaCA9PSAifiIgJiYgc3RyZWFtLmVhdCgvXC8vKSkpIHsKICAgICAgbmV4dFVudGlsVW5lc2NhcGVkKHN0cmVhbSwgIi8iKTsKICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bZ2ltc3VdLyk7CiAgICAgIHJldHVybiByZXQoInJlZ2V4cCIsICJzdHJpbmctMiIpOwogICAgfQogICAgZWxzZSBpZiAoY2ggPT0gIi8iKSB7CiAgICAgIGlmIChzdHJlYW0uZWF0KCIqIikpIHsKICAgICAgICByZXR1cm4gY2hhaW4oc3RyZWFtLCBzdGF0ZSwgaGF4ZVRva2VuQ29tbWVudCk7CiAgICAgIH0KICAgICAgZWxzZSBpZiAoc3RyZWFtLmVhdCgiLyIpKSB7CiAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICAgIHJldHVybiByZXQoImNvbW1lbnQiLCAiY29tbWVudCIpOwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIHN0cmVhbS5lYXRXaGlsZShpc09wZXJhdG9yQ2hhcik7CiAgICAgICAgcmV0dXJuIHJldCgib3BlcmF0b3IiLCBudWxsLCBzdHJlYW0uY3VycmVudCgpKTsKICAgICAgfQogICAgfQogICAgZWxzZSBpZiAoY2ggPT0gIiMiKSB7CiAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICAgIHJldHVybiByZXQoImNvbmRpdGlvbmFsIiwgIm1ldGEiKTsKICAgIH0KICAgIGVsc2UgaWYgKGNoID09ICJAIikgewogICAgICBzdHJlYW0uZWF0KC86Lyk7CiAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1x3X10vKTsKICAgICAgcmV0dXJuIHJldCAoIm1ldGFkYXRhIiwgIm1ldGEiKTsKICAgIH0KICAgIGVsc2UgaWYgKGlzT3BlcmF0b3JDaGFyLnRlc3QoY2gpKSB7CiAgICAgIHN0cmVhbS5lYXRXaGlsZShpc09wZXJhdG9yQ2hhcik7CiAgICAgIHJldHVybiByZXQoIm9wZXJhdG9yIiwgbnVsbCwgc3RyZWFtLmN1cnJlbnQoKSk7CiAgICB9CiAgICBlbHNlIHsKICAgIHZhciB3b3JkOwogICAgaWYoL1tBLVpdLy50ZXN0KGNoKSkKICAgIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXHdfPD5dLyk7CiAgICAgIHdvcmQgPSBzdHJlYW0uY3VycmVudCgpOwogICAgICByZXR1cm4gcmV0KCJ0eXBlIiwgInZhcmlhYmxlLTMiLCB3b3JkKTsKICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcd19dLyk7CiAgICAgICAgdmFyIHdvcmQgPSBzdHJlYW0uY3VycmVudCgpLCBrbm93biA9IGtleXdvcmRzLnByb3BlcnR5SXNFbnVtZXJhYmxlKHdvcmQpICYmIGtleXdvcmRzW3dvcmRdOwogICAgICAgIHJldHVybiAoa25vd24gJiYgc3RhdGUua3dBbGxvd2VkKSA/IHJldChrbm93bi50eXBlLCBrbm93bi5zdHlsZSwgd29yZCkgOgogICAgICAgICAgICAgICAgICAgICAgIHJldCgidmFyaWFibGUiLCAidmFyaWFibGUiLCB3b3JkKTsKICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIGhheGVUb2tlblN0cmluZyhxdW90ZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgaWYgKCFuZXh0VW50aWxVbmVzY2FwZWQoc3RyZWFtLCBxdW90ZSkpCiAgICAgICAgc3RhdGUudG9rZW5pemUgPSBoYXhlVG9rZW5CYXNlOwogICAgICByZXR1cm4gcmV0KCJzdHJpbmciLCAic3RyaW5nIik7CiAgICB9OwogIH0KCiAgZnVuY3Rpb24gaGF4ZVRva2VuQ29tbWVudChzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgbWF5YmVFbmQgPSBmYWxzZSwgY2g7CiAgICB3aGlsZSAoY2ggPSBzdHJlYW0ubmV4dCgpKSB7CiAgICAgIGlmIChjaCA9PSAiLyIgJiYgbWF5YmVFbmQpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IGhheGVUb2tlbkJhc2U7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgbWF5YmVFbmQgPSAoY2ggPT0gIioiKTsKICAgIH0KICAgIHJldHVybiByZXQoImNvbW1lbnQiLCAiY29tbWVudCIpOwogIH0KCiAgLy8gUGFyc2VyCgogIHZhciBhdG9taWNUeXBlcyA9IHsiYXRvbSI6IHRydWUsICJudW1iZXIiOiB0cnVlLCAidmFyaWFibGUiOiB0cnVlLCAic3RyaW5nIjogdHJ1ZSwgInJlZ2V4cCI6IHRydWV9OwoKICBmdW5jdGlvbiBIYXhlTGV4aWNhbChpbmRlbnRlZCwgY29sdW1uLCB0eXBlLCBhbGlnbiwgcHJldiwgaW5mbykgewogICAgdGhpcy5pbmRlbnRlZCA9IGluZGVudGVkOwogICAgdGhpcy5jb2x1bW4gPSBjb2x1bW47CiAgICB0aGlzLnR5cGUgPSB0eXBlOwogICAgdGhpcy5wcmV2ID0gcHJldjsKICAgIHRoaXMuaW5mbyA9IGluZm87CiAgICBpZiAoYWxpZ24gIT0gbnVsbCkgdGhpcy5hbGlnbiA9IGFsaWduOwogIH0KCiAgZnVuY3Rpb24gaW5TY29wZShzdGF0ZSwgdmFybmFtZSkgewogICAgZm9yICh2YXIgdiA9IHN0YXRlLmxvY2FsVmFyczsgdjsgdiA9IHYubmV4dCkKICAgICAgaWYgKHYubmFtZSA9PSB2YXJuYW1lKSByZXR1cm4gdHJ1ZTsKICB9CgogIGZ1bmN0aW9uIHBhcnNlSGF4ZShzdGF0ZSwgc3R5bGUsIHR5cGUsIGNvbnRlbnQsIHN0cmVhbSkgewogICAgdmFyIGNjID0gc3RhdGUuY2M7CiAgICAvLyBDb21tdW5pY2F0ZSBvdXIgY29udGV4dCB0byB0aGUgY29tYmluYXRvcnMuCiAgICAvLyAoTGVzcyB3YXN0ZWZ1bCB0aGFuIGNvbnNpbmcgdXAgYSBodW5kcmVkIGNsb3N1cmVzIG9uIGV2ZXJ5IGNhbGwuKQogICAgY3guc3RhdGUgPSBzdGF0ZTsgY3guc3RyZWFtID0gc3RyZWFtOyBjeC5tYXJrZWQgPSBudWxsLCBjeC5jYyA9IGNjOwoKICAgIGlmICghc3RhdGUubGV4aWNhbC5oYXNPd25Qcm9wZXJ0eSgiYWxpZ24iKSkKICAgICAgc3RhdGUubGV4aWNhbC5hbGlnbiA9IHRydWU7CgogICAgd2hpbGUodHJ1ZSkgewogICAgICB2YXIgY29tYmluYXRvciA9IGNjLmxlbmd0aCA/IGNjLnBvcCgpIDogc3RhdGVtZW50OwogICAgICBpZiAoY29tYmluYXRvcih0eXBlLCBjb250ZW50KSkgewogICAgICAgIHdoaWxlKGNjLmxlbmd0aCAmJiBjY1tjYy5sZW5ndGggLSAxXS5sZXgpCiAgICAgICAgICBjYy5wb3AoKSgpOwogICAgICAgIGlmIChjeC5tYXJrZWQpIHJldHVybiBjeC5tYXJrZWQ7CiAgICAgICAgaWYgKHR5cGUgPT0gInZhcmlhYmxlIiAmJiBpblNjb3BlKHN0YXRlLCBjb250ZW50KSkgcmV0dXJuICJ2YXJpYWJsZS0yIjsKICAgIGlmICh0eXBlID09ICJ2YXJpYWJsZSIgJiYgaW1wb3J0ZWQoc3RhdGUsIGNvbnRlbnQpKSByZXR1cm4gInZhcmlhYmxlLTMiOwogICAgICAgIHJldHVybiBzdHlsZTsKICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gaW1wb3J0ZWQoc3RhdGUsIHR5cGVuYW1lKQogIHsKICBpZiAoL1thLXpdLy50ZXN0KHR5cGVuYW1lLmNoYXJBdCgwKSkpCiAgICByZXR1cm4gZmFsc2U7CiAgdmFyIGxlbiA9IHN0YXRlLmltcG9ydGVkdHlwZXMubGVuZ3RoOwogIGZvciAodmFyIGkgPSAwOyBpPGxlbjsgaSsrKQogICAgaWYoc3RhdGUuaW1wb3J0ZWR0eXBlc1tpXT09dHlwZW5hbWUpIHJldHVybiB0cnVlOwogIH0KCgogIGZ1bmN0aW9uIHJlZ2lzdGVyaW1wb3J0KGltcG9ydG5hbWUpIHsKICB2YXIgc3RhdGUgPSBjeC5zdGF0ZTsKICBmb3IgKHZhciB0ID0gc3RhdGUuaW1wb3J0ZWR0eXBlczsgdDsgdCA9IHQubmV4dCkKICAgIGlmKHQubmFtZSA9PSBpbXBvcnRuYW1lKSByZXR1cm47CiAgc3RhdGUuaW1wb3J0ZWR0eXBlcyA9IHsgbmFtZTogaW1wb3J0bmFtZSwgbmV4dDogc3RhdGUuaW1wb3J0ZWR0eXBlcyB9OwogIH0KICAvLyBDb21iaW5hdG9yIHV0aWxzCgogIHZhciBjeCA9IHtzdGF0ZTogbnVsbCwgY29sdW1uOiBudWxsLCBtYXJrZWQ6IG51bGwsIGNjOiBudWxsfTsKICBmdW5jdGlvbiBwYXNzKCkgewogICAgZm9yICh2YXIgaSA9IGFyZ3VtZW50cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgY3guY2MucHVzaChhcmd1bWVudHNbaV0pOwogIH0KICBmdW5jdGlvbiBjb250KCkgewogICAgcGFzcy5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgcmV0dXJuIHRydWU7CiAgfQogIGZ1bmN0aW9uIHJlZ2lzdGVyKHZhcm5hbWUpIHsKICAgIHZhciBzdGF0ZSA9IGN4LnN0YXRlOwogICAgaWYgKHN0YXRlLmNvbnRleHQpIHsKICAgICAgY3gubWFya2VkID0gImRlZiI7CiAgICAgIGZvciAodmFyIHYgPSBzdGF0ZS5sb2NhbFZhcnM7IHY7IHYgPSB2Lm5leHQpCiAgICAgICAgaWYgKHYubmFtZSA9PSB2YXJuYW1lKSByZXR1cm47CiAgICAgIHN0YXRlLmxvY2FsVmFycyA9IHtuYW1lOiB2YXJuYW1lLCBuZXh0OiBzdGF0ZS5sb2NhbFZhcnN9OwogICAgfQogIH0KCiAgLy8gQ29tYmluYXRvcnMKCiAgdmFyIGRlZmF1bHRWYXJzID0ge25hbWU6ICJ0aGlzIiwgbmV4dDogbnVsbH07CiAgZnVuY3Rpb24gcHVzaGNvbnRleHQoKSB7CiAgICBpZiAoIWN4LnN0YXRlLmNvbnRleHQpIGN4LnN0YXRlLmxvY2FsVmFycyA9IGRlZmF1bHRWYXJzOwogICAgY3guc3RhdGUuY29udGV4dCA9IHtwcmV2OiBjeC5zdGF0ZS5jb250ZXh0LCB2YXJzOiBjeC5zdGF0ZS5sb2NhbFZhcnN9OwogIH0KICBmdW5jdGlvbiBwb3Bjb250ZXh0KCkgewogICAgY3guc3RhdGUubG9jYWxWYXJzID0gY3guc3RhdGUuY29udGV4dC52YXJzOwogICAgY3guc3RhdGUuY29udGV4dCA9IGN4LnN0YXRlLmNvbnRleHQucHJldjsKICB9CiAgZnVuY3Rpb24gcHVzaGxleCh0eXBlLCBpbmZvKSB7CiAgICB2YXIgcmVzdWx0ID0gZnVuY3Rpb24oKSB7CiAgICAgIHZhciBzdGF0ZSA9IGN4LnN0YXRlOwogICAgICBzdGF0ZS5sZXhpY2FsID0gbmV3IEhheGVMZXhpY2FsKHN0YXRlLmluZGVudGVkLCBjeC5zdHJlYW0uY29sdW1uKCksIHR5cGUsIG51bGwsIHN0YXRlLmxleGljYWwsIGluZm8pOwogICAgfTsKICAgIHJlc3VsdC5sZXggPSB0cnVlOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CiAgZnVuY3Rpb24gcG9wbGV4KCkgewogICAgdmFyIHN0YXRlID0gY3guc3RhdGU7CiAgICBpZiAoc3RhdGUubGV4aWNhbC5wcmV2KSB7CiAgICAgIGlmIChzdGF0ZS5sZXhpY2FsLnR5cGUgPT0gIikiKQogICAgICAgIHN0YXRlLmluZGVudGVkID0gc3RhdGUubGV4aWNhbC5pbmRlbnRlZDsKICAgICAgc3RhdGUubGV4aWNhbCA9IHN0YXRlLmxleGljYWwucHJldjsKICAgIH0KICB9CiAgcG9wbGV4LmxleCA9IHRydWU7CgogIGZ1bmN0aW9uIGV4cGVjdCh3YW50ZWQpIHsKICAgIGZ1bmN0aW9uIGYodHlwZSkgewogICAgICBpZiAodHlwZSA9PSB3YW50ZWQpIHJldHVybiBjb250KCk7CiAgICAgIGVsc2UgaWYgKHdhbnRlZCA9PSAiOyIpIHJldHVybiBwYXNzKCk7CiAgICAgIGVsc2UgcmV0dXJuIGNvbnQoZik7CiAgICB9OwogICAgcmV0dXJuIGY7CiAgfQoKICBmdW5jdGlvbiBzdGF0ZW1lbnQodHlwZSkgewogICAgaWYgKHR5cGUgPT0gIkAiKSByZXR1cm4gY29udChtZXRhZGVmKTsKICAgIGlmICh0eXBlID09ICJ2YXIiKSByZXR1cm4gY29udChwdXNobGV4KCJ2YXJkZWYiKSwgdmFyZGVmMSwgZXhwZWN0KCI7IiksIHBvcGxleCk7CiAgICBpZiAodHlwZSA9PSAia2V5d29yZCBhIikgcmV0dXJuIGNvbnQocHVzaGxleCgiZm9ybSIpLCBleHByZXNzaW9uLCBzdGF0ZW1lbnQsIHBvcGxleCk7CiAgICBpZiAodHlwZSA9PSAia2V5d29yZCBiIikgcmV0dXJuIGNvbnQocHVzaGxleCgiZm9ybSIpLCBzdGF0ZW1lbnQsIHBvcGxleCk7CiAgICBpZiAodHlwZSA9PSAieyIpIHJldHVybiBjb250KHB1c2hsZXgoIn0iKSwgcHVzaGNvbnRleHQsIGJsb2NrLCBwb3BsZXgsIHBvcGNvbnRleHQpOwogICAgaWYgKHR5cGUgPT0gIjsiKSByZXR1cm4gY29udCgpOwogICAgaWYgKHR5cGUgPT0gImF0dHJpYnV0ZSIpIHJldHVybiBjb250KG1heWJlYXR0cmlidXRlKTsKICAgIGlmICh0eXBlID09ICJmdW5jdGlvbiIpIHJldHVybiBjb250KGZ1bmN0aW9uZGVmKTsKICAgIGlmICh0eXBlID09ICJmb3IiKSByZXR1cm4gY29udChwdXNobGV4KCJmb3JtIiksIGV4cGVjdCgiKCIpLCBwdXNobGV4KCIpIiksIGZvcnNwZWMxLCBleHBlY3QoIikiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3BsZXgsIHN0YXRlbWVudCwgcG9wbGV4KTsKICAgIGlmICh0eXBlID09ICJ2YXJpYWJsZSIpIHJldHVybiBjb250KHB1c2hsZXgoInN0YXQiKSwgbWF5YmVsYWJlbCk7CiAgICBpZiAodHlwZSA9PSAic3dpdGNoIikgcmV0dXJuIGNvbnQocHVzaGxleCgiZm9ybSIpLCBleHByZXNzaW9uLCBwdXNobGV4KCJ9IiwgInN3aXRjaCIpLCBleHBlY3QoInsiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jaywgcG9wbGV4LCBwb3BsZXgpOwogICAgaWYgKHR5cGUgPT0gImNhc2UiKSByZXR1cm4gY29udChleHByZXNzaW9uLCBleHBlY3QoIjoiKSk7CiAgICBpZiAodHlwZSA9PSAiZGVmYXVsdCIpIHJldHVybiBjb250KGV4cGVjdCgiOiIpKTsKICAgIGlmICh0eXBlID09ICJjYXRjaCIpIHJldHVybiBjb250KHB1c2hsZXgoImZvcm0iKSwgcHVzaGNvbnRleHQsIGV4cGVjdCgiKCIpLCBmdW5hcmcsIGV4cGVjdCgiKSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50LCBwb3BsZXgsIHBvcGNvbnRleHQpOwogICAgaWYgKHR5cGUgPT0gImltcG9ydCIpIHJldHVybiBjb250KGltcG9ydGRlZiwgZXhwZWN0KCI7IikpOwogICAgaWYgKHR5cGUgPT0gInR5cGVkZWYiKSByZXR1cm4gY29udCh0eXBlZGVmKTsKICAgIHJldHVybiBwYXNzKHB1c2hsZXgoInN0YXQiKSwgZXhwcmVzc2lvbiwgZXhwZWN0KCI7IiksIHBvcGxleCk7CiAgfQogIGZ1bmN0aW9uIGV4cHJlc3Npb24odHlwZSkgewogICAgaWYgKGF0b21pY1R5cGVzLmhhc093blByb3BlcnR5KHR5cGUpKSByZXR1cm4gY29udChtYXliZW9wZXJhdG9yKTsKICAgIGlmICh0eXBlID09ICJmdW5jdGlvbiIpIHJldHVybiBjb250KGZ1bmN0aW9uZGVmKTsKICAgIGlmICh0eXBlID09ICJrZXl3b3JkIGMiKSByZXR1cm4gY29udChtYXliZWV4cHJlc3Npb24pOwogICAgaWYgKHR5cGUgPT0gIigiKSByZXR1cm4gY29udChwdXNobGV4KCIpIiksIG1heWJlZXhwcmVzc2lvbiwgZXhwZWN0KCIpIiksIHBvcGxleCwgbWF5YmVvcGVyYXRvcik7CiAgICBpZiAodHlwZSA9PSAib3BlcmF0b3IiKSByZXR1cm4gY29udChleHByZXNzaW9uKTsKICAgIGlmICh0eXBlID09ICJbIikgcmV0dXJuIGNvbnQocHVzaGxleCgiXSIpLCBjb21tYXNlcChleHByZXNzaW9uLCAiXSIpLCBwb3BsZXgsIG1heWJlb3BlcmF0b3IpOwogICAgaWYgKHR5cGUgPT0gInsiKSByZXR1cm4gY29udChwdXNobGV4KCJ9IiksIGNvbW1hc2VwKG9ianByb3AsICJ9IiksIHBvcGxleCwgbWF5YmVvcGVyYXRvcik7CiAgICByZXR1cm4gY29udCgpOwogIH0KICBmdW5jdGlvbiBtYXliZWV4cHJlc3Npb24odHlwZSkgewogICAgaWYgKHR5cGUubWF0Y2goL1s7XH1cKVxdLF0vKSkgcmV0dXJuIHBhc3MoKTsKICAgIHJldHVybiBwYXNzKGV4cHJlc3Npb24pOwogIH0KCiAgZnVuY3Rpb24gbWF5YmVvcGVyYXRvcih0eXBlLCB2YWx1ZSkgewogICAgaWYgKHR5cGUgPT0gIm9wZXJhdG9yIiAmJiAvXCtcK3wtLS8udGVzdCh2YWx1ZSkpIHJldHVybiBjb250KG1heWJlb3BlcmF0b3IpOwogICAgaWYgKHR5cGUgPT0gIm9wZXJhdG9yIiB8fCB0eXBlID09ICI6IikgcmV0dXJuIGNvbnQoZXhwcmVzc2lvbik7CiAgICBpZiAodHlwZSA9PSAiOyIpIHJldHVybjsKICAgIGlmICh0eXBlID09ICIoIikgcmV0dXJuIGNvbnQocHVzaGxleCgiKSIpLCBjb21tYXNlcChleHByZXNzaW9uLCAiKSIpLCBwb3BsZXgsIG1heWJlb3BlcmF0b3IpOwogICAgaWYgKHR5cGUgPT0gIi4iKSByZXR1cm4gY29udChwcm9wZXJ0eSwgbWF5YmVvcGVyYXRvcik7CiAgICBpZiAodHlwZSA9PSAiWyIpIHJldHVybiBjb250KHB1c2hsZXgoIl0iKSwgZXhwcmVzc2lvbiwgZXhwZWN0KCJdIiksIHBvcGxleCwgbWF5YmVvcGVyYXRvcik7CiAgfQoKICBmdW5jdGlvbiBtYXliZWF0dHJpYnV0ZSh0eXBlKSB7CiAgICBpZiAodHlwZSA9PSAiYXR0cmlidXRlIikgcmV0dXJuIGNvbnQobWF5YmVhdHRyaWJ1dGUpOwogICAgaWYgKHR5cGUgPT0gImZ1bmN0aW9uIikgcmV0dXJuIGNvbnQoZnVuY3Rpb25kZWYpOwogICAgaWYgKHR5cGUgPT0gInZhciIpIHJldHVybiBjb250KHZhcmRlZjEpOwogIH0KCiAgZnVuY3Rpb24gbWV0YWRlZih0eXBlKSB7CiAgICBpZih0eXBlID09ICI6IikgcmV0dXJuIGNvbnQobWV0YWRlZik7CiAgICBpZih0eXBlID09ICJ2YXJpYWJsZSIpIHJldHVybiBjb250KG1ldGFkZWYpOwogICAgaWYodHlwZSA9PSAiKCIpIHJldHVybiBjb250KHB1c2hsZXgoIikiKSwgY29tbWFzZXAobWV0YWFyZ3MsICIpIiksIHBvcGxleCwgc3RhdGVtZW50KTsKICB9CiAgZnVuY3Rpb24gbWV0YWFyZ3ModHlwZSkgewogICAgaWYodHlwZSA9PSAidmFyaWFibGUiKSByZXR1cm4gY29udCgpOwogIH0KCiAgZnVuY3Rpb24gaW1wb3J0ZGVmICh0eXBlLCB2YWx1ZSkgewogIGlmKHR5cGUgPT0gInZhcmlhYmxlIiAmJiAvW0EtWl0vLnRlc3QodmFsdWUuY2hhckF0KDApKSkgeyByZWdpc3RlcmltcG9ydCh2YWx1ZSk7IHJldHVybiBjb250KCk7IH0KICBlbHNlIGlmKHR5cGUgPT0gInZhcmlhYmxlIiB8fCB0eXBlID09ICJwcm9wZXJ0eSIgfHwgdHlwZSA9PSAiLiIgfHwgdmFsdWUgPT0gIioiKSByZXR1cm4gY29udChpbXBvcnRkZWYpOwogIH0KCiAgZnVuY3Rpb24gdHlwZWRlZiAodHlwZSwgdmFsdWUpCiAgewogIGlmKHR5cGUgPT0gInZhcmlhYmxlIiAmJiAvW0EtWl0vLnRlc3QodmFsdWUuY2hhckF0KDApKSkgeyByZWdpc3RlcmltcG9ydCh2YWx1ZSk7IHJldHVybiBjb250KCk7IH0KICBlbHNlIGlmICh0eXBlID09ICJ0eXBlIiAmJiAvW0EtWl0vLnRlc3QodmFsdWUuY2hhckF0KDApKSkgeyByZXR1cm4gY29udCgpOyB9CiAgfQoKICBmdW5jdGlvbiBtYXliZWxhYmVsKHR5cGUpIHsKICAgIGlmICh0eXBlID09ICI6IikgcmV0dXJuIGNvbnQocG9wbGV4LCBzdGF0ZW1lbnQpOwogICAgcmV0dXJuIHBhc3MobWF5YmVvcGVyYXRvciwgZXhwZWN0KCI7IiksIHBvcGxleCk7CiAgfQogIGZ1bmN0aW9uIHByb3BlcnR5KHR5cGUpIHsKICAgIGlmICh0eXBlID09ICJ2YXJpYWJsZSIpIHtjeC5tYXJrZWQgPSAicHJvcGVydHkiOyByZXR1cm4gY29udCgpO30KICB9CiAgZnVuY3Rpb24gb2JqcHJvcCh0eXBlKSB7CiAgICBpZiAodHlwZSA9PSAidmFyaWFibGUiKSBjeC5tYXJrZWQgPSAicHJvcGVydHkiOwogICAgaWYgKGF0b21pY1R5cGVzLmhhc093blByb3BlcnR5KHR5cGUpKSByZXR1cm4gY29udChleHBlY3QoIjoiKSwgZXhwcmVzc2lvbik7CiAgfQogIGZ1bmN0aW9uIGNvbW1hc2VwKHdoYXQsIGVuZCkgewogICAgZnVuY3Rpb24gcHJvY2VlZCh0eXBlKSB7CiAgICAgIGlmICh0eXBlID09ICIsIikgcmV0dXJuIGNvbnQod2hhdCwgcHJvY2VlZCk7CiAgICAgIGlmICh0eXBlID09IGVuZCkgcmV0dXJuIGNvbnQoKTsKICAgICAgcmV0dXJuIGNvbnQoZXhwZWN0KGVuZCkpOwogICAgfQogICAgcmV0dXJuIGZ1bmN0aW9uKHR5cGUpIHsKICAgICAgaWYgKHR5cGUgPT0gZW5kKSByZXR1cm4gY29udCgpOwogICAgICBlbHNlIHJldHVybiBwYXNzKHdoYXQsIHByb2NlZWQpOwogICAgfTsKICB9CiAgZnVuY3Rpb24gYmxvY2sodHlwZSkgewogICAgaWYgKHR5cGUgPT0gIn0iKSByZXR1cm4gY29udCgpOwogICAgcmV0dXJuIHBhc3Moc3RhdGVtZW50LCBibG9jayk7CiAgfQogIGZ1bmN0aW9uIHZhcmRlZjEodHlwZSwgdmFsdWUpIHsKICAgIGlmICh0eXBlID09ICJ2YXJpYWJsZSIpe3JlZ2lzdGVyKHZhbHVlKTsgcmV0dXJuIGNvbnQodHlwZXVzZSwgdmFyZGVmMik7fQogICAgcmV0dXJuIGNvbnQoKTsKICB9CiAgZnVuY3Rpb24gdmFyZGVmMih0eXBlLCB2YWx1ZSkgewogICAgaWYgKHZhbHVlID09ICI9IikgcmV0dXJuIGNvbnQoZXhwcmVzc2lvbiwgdmFyZGVmMik7CiAgICBpZiAodHlwZSA9PSAiLCIpIHJldHVybiBjb250KHZhcmRlZjEpOwogIH0KICBmdW5jdGlvbiBmb3JzcGVjMSh0eXBlLCB2YWx1ZSkgewogIGlmICh0eXBlID09ICJ2YXJpYWJsZSIpIHsKICAgIHJlZ2lzdGVyKHZhbHVlKTsKICB9CiAgcmV0dXJuIGNvbnQocHVzaGxleCgiKSIpLCBwdXNoY29udGV4dCwgZm9yaW4sIGV4cHJlc3Npb24sIHBvcGxleCwgc3RhdGVtZW50LCBwb3Bjb250ZXh0KTsKICB9CiAgZnVuY3Rpb24gZm9yaW4oX3R5cGUsIHZhbHVlKSB7CiAgICBpZiAodmFsdWUgPT0gImluIikgcmV0dXJuIGNvbnQoKTsKICB9CiAgZnVuY3Rpb24gZnVuY3Rpb25kZWYodHlwZSwgdmFsdWUpIHsKICAgIGlmICh0eXBlID09ICJ2YXJpYWJsZSIpIHtyZWdpc3Rlcih2YWx1ZSk7IHJldHVybiBjb250KGZ1bmN0aW9uZGVmKTt9CiAgICBpZiAodmFsdWUgPT0gIm5ldyIpIHJldHVybiBjb250KGZ1bmN0aW9uZGVmKTsKICAgIGlmICh0eXBlID09ICIoIikgcmV0dXJuIGNvbnQocHVzaGxleCgiKSIpLCBwdXNoY29udGV4dCwgY29tbWFzZXAoZnVuYXJnLCAiKSIpLCBwb3BsZXgsIHR5cGV1c2UsIHN0YXRlbWVudCwgcG9wY29udGV4dCk7CiAgfQogIGZ1bmN0aW9uIHR5cGV1c2UodHlwZSkgewogICAgaWYodHlwZSA9PSAiOiIpIHJldHVybiBjb250KHR5cGVzdHJpbmcpOwogIH0KICBmdW5jdGlvbiB0eXBlc3RyaW5nKHR5cGUpIHsKICAgIGlmKHR5cGUgPT0gInR5cGUiKSByZXR1cm4gY29udCgpOwogICAgaWYodHlwZSA9PSAidmFyaWFibGUiKSByZXR1cm4gY29udCgpOwogICAgaWYodHlwZSA9PSAieyIpIHJldHVybiBjb250KHB1c2hsZXgoIn0iKSwgY29tbWFzZXAodHlwZXByb3AsICJ9IiksIHBvcGxleCk7CiAgfQogIGZ1bmN0aW9uIHR5cGVwcm9wKHR5cGUpIHsKICAgIGlmKHR5cGUgPT0gInZhcmlhYmxlIikgcmV0dXJuIGNvbnQodHlwZXVzZSk7CiAgfQogIGZ1bmN0aW9uIGZ1bmFyZyh0eXBlLCB2YWx1ZSkgewogICAgaWYgKHR5cGUgPT0gInZhcmlhYmxlIikge3JlZ2lzdGVyKHZhbHVlKTsgcmV0dXJuIGNvbnQodHlwZXVzZSk7fQogIH0KCiAgLy8gSW50ZXJmYWNlCgogIHJldHVybiB7CiAgICBzdGFydFN0YXRlOiBmdW5jdGlvbihiYXNlY29sdW1uKSB7CiAgICB2YXIgZGVmYXVsdHR5cGVzID0gWyJJbnQiLCAiRmxvYXQiLCAiU3RyaW5nIiwgIlZvaWQiLCAiU3RkIiwgIkJvb2wiLCAiRHluYW1pYyIsICJBcnJheSJdOwogICAgICByZXR1cm4gewogICAgICAgIHRva2VuaXplOiBoYXhlVG9rZW5CYXNlLAogICAgICAgIHJlQWxsb3dlZDogdHJ1ZSwKICAgICAgICBrd0FsbG93ZWQ6IHRydWUsCiAgICAgICAgY2M6IFtdLAogICAgICAgIGxleGljYWw6IG5ldyBIYXhlTGV4aWNhbCgoYmFzZWNvbHVtbiB8fCAwKSAtIGluZGVudFVuaXQsIDAsICJibG9jayIsIGZhbHNlKSwKICAgICAgICBsb2NhbFZhcnM6IHBhcnNlckNvbmZpZy5sb2NhbFZhcnMsCiAgICBpbXBvcnRlZHR5cGVzOiBkZWZhdWx0dHlwZXMsCiAgICAgICAgY29udGV4dDogcGFyc2VyQ29uZmlnLmxvY2FsVmFycyAmJiB7dmFyczogcGFyc2VyQ29uZmlnLmxvY2FsVmFyc30sCiAgICAgICAgaW5kZW50ZWQ6IDAKICAgICAgfTsKICAgIH0sCgogICAgdG9rZW46IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgaWYgKHN0cmVhbS5zb2woKSkgewogICAgICAgIGlmICghc3RhdGUubGV4aWNhbC5oYXNPd25Qcm9wZXJ0eSgiYWxpZ24iKSkKICAgICAgICAgIHN0YXRlLmxleGljYWwuYWxpZ24gPSBmYWxzZTsKICAgICAgICBzdGF0ZS5pbmRlbnRlZCA9IHN0cmVhbS5pbmRlbnRhdGlvbigpOwogICAgICB9CiAgICAgIGlmIChzdHJlYW0uZWF0U3BhY2UoKSkgcmV0dXJuIG51bGw7CiAgICAgIHZhciBzdHlsZSA9IHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgICBpZiAodHlwZSA9PSAiY29tbWVudCIpIHJldHVybiBzdHlsZTsKICAgICAgc3RhdGUucmVBbGxvd2VkID0gISEodHlwZSA9PSAib3BlcmF0b3IiIHx8IHR5cGUgPT0gImtleXdvcmQgYyIgfHwgdHlwZS5tYXRjaCgvXltcW3t9XCgsOzpdJC8pKTsKICAgICAgc3RhdGUua3dBbGxvd2VkID0gdHlwZSAhPSAnLic7CiAgICAgIHJldHVybiBwYXJzZUhheGUoc3RhdGUsIHN0eWxlLCB0eXBlLCBjb250ZW50LCBzdHJlYW0pOwogICAgfSwKCiAgICBpbmRlbnQ6IGZ1bmN0aW9uKHN0YXRlLCB0ZXh0QWZ0ZXIpIHsKICAgICAgaWYgKHN0YXRlLnRva2VuaXplICE9IGhheGVUb2tlbkJhc2UpIHJldHVybiAwOwogICAgICB2YXIgZmlyc3RDaGFyID0gdGV4dEFmdGVyICYmIHRleHRBZnRlci5jaGFyQXQoMCksIGxleGljYWwgPSBzdGF0ZS5sZXhpY2FsOwogICAgICBpZiAobGV4aWNhbC50eXBlID09ICJzdGF0IiAmJiBmaXJzdENoYXIgPT0gIn0iKSBsZXhpY2FsID0gbGV4aWNhbC5wcmV2OwogICAgICB2YXIgdHlwZSA9IGxleGljYWwudHlwZSwgY2xvc2luZyA9IGZpcnN0Q2hhciA9PSB0eXBlOwogICAgICBpZiAodHlwZSA9PSAidmFyZGVmIikgcmV0dXJuIGxleGljYWwuaW5kZW50ZWQgKyA0OwogICAgICBlbHNlIGlmICh0eXBlID09ICJmb3JtIiAmJiBmaXJzdENoYXIgPT0gInsiKSByZXR1cm4gbGV4aWNhbC5pbmRlbnRlZDsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAic3RhdCIgfHwgdHlwZSA9PSAiZm9ybSIpIHJldHVybiBsZXhpY2FsLmluZGVudGVkICsgaW5kZW50VW5pdDsKICAgICAgZWxzZSBpZiAobGV4aWNhbC5pbmZvID09ICJzd2l0Y2giICYmICFjbG9zaW5nKQogICAgICAgIHJldHVybiBsZXhpY2FsLmluZGVudGVkICsgKC9eKD86Y2FzZXxkZWZhdWx0KVxiLy50ZXN0KHRleHRBZnRlcikgPyBpbmRlbnRVbml0IDogMiAqIGluZGVudFVuaXQpOwogICAgICBlbHNlIGlmIChsZXhpY2FsLmFsaWduKSByZXR1cm4gbGV4aWNhbC5jb2x1bW4gKyAoY2xvc2luZyA/IDAgOiAxKTsKICAgICAgZWxzZSByZXR1cm4gbGV4aWNhbC5pbmRlbnRlZCArIChjbG9zaW5nID8gMCA6IGluZGVudFVuaXQpOwogICAgfSwKCiAgICBlbGVjdHJpY0NoYXJzOiAie30iLAogICAgYmxvY2tDb21tZW50U3RhcnQ6ICIvKiIsCiAgICBibG9ja0NvbW1lbnRFbmQ6ICIqLyIsCiAgICBsaW5lQ29tbWVudDogIi8vIgogIH07Cn0pOwoKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtaGF4ZSIsICJoYXhlIik7CgpDb2RlTWlycm9yLmRlZmluZU1vZGUoImh4bWwiLCBmdW5jdGlvbiAoKSB7CgogIHJldHVybiB7CiAgICBzdGFydFN0YXRlOiBmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgZGVmaW5lOiBmYWxzZSwKICAgICAgICBpblN0cmluZzogZmFsc2UKICAgICAgfTsKICAgIH0sCiAgICB0b2tlbjogZnVuY3Rpb24gKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgdmFyIGNoID0gc3RyZWFtLnBlZWsoKTsKICAgICAgdmFyIHNvbCA9IHN0cmVhbS5zb2woKTsKCiAgICAgIC8vLyogY29tbWVudHMgKi8KICAgICAgaWYgKGNoID09ICIjIikgewogICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgICByZXR1cm4gImNvbW1lbnQiOwogICAgICB9CiAgICAgIGlmIChzb2wgJiYgY2ggPT0gIi0iKSB7CiAgICAgICAgdmFyIHN0eWxlID0gInZhcmlhYmxlLTIiOwoKICAgICAgICBzdHJlYW0uZWF0KC8tLyk7CgogICAgICAgIGlmIChzdHJlYW0ucGVlaygpID09ICItIikgewogICAgICAgICAgc3RyZWFtLmVhdCgvLS8pOwogICAgICAgICAgc3R5bGUgPSAia2V5d29yZCBhIjsKICAgICAgICB9CgogICAgICAgIGlmIChzdHJlYW0ucGVlaygpID09ICJEIikgewogICAgICAgICAgc3RyZWFtLmVhdCgvW0RdLyk7CiAgICAgICAgICBzdHlsZSA9ICJrZXl3b3JkIGMiOwogICAgICAgICAgc3RhdGUuZGVmaW5lID0gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW0EtWl0vaSk7CiAgICAgICAgcmV0dXJuIHN0eWxlOwogICAgICB9CgogICAgICB2YXIgY2ggPSBzdHJlYW0ucGVlaygpOwoKICAgICAgaWYgKHN0YXRlLmluU3RyaW5nID09IGZhbHNlICYmIGNoID09ICInIikgewogICAgICAgIHN0YXRlLmluU3RyaW5nID0gdHJ1ZTsKICAgICAgICBjaCA9IHN0cmVhbS5uZXh0KCk7CiAgICAgIH0KCiAgICAgIGlmIChzdGF0ZS5pblN0cmluZyA9PSB0cnVlKSB7CiAgICAgICAgaWYgKHN0cmVhbS5za2lwVG8oIiciKSkgewoKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICAgIH0KCiAgICAgICAgaWYgKHN0cmVhbS5wZWVrKCkgPT0gIiciKSB7CiAgICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgICAgc3RhdGUuaW5TdHJpbmcgPSBmYWxzZTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAic3RyaW5nIjsKICAgICAgfQoKICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9LAogICAgbGluZUNvbW1lbnQ6ICIjIgogIH07Cn0pOwoKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtaHhtbCIsICJoeG1sIik7Cgp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/haxe/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogSGF4ZSBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9ImhheGUuanMiPjwvc2NyaXB0Pgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPi5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazt9PC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aW1nIGlkPWxvZ28gc3JjPSIuLi8uLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5MYW5ndWFnZSBtb2RlczwvYT4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+SGF4ZTwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+SGF4ZSBtb2RlPC9oMj4KCgo8ZGl2PjxwPjx0ZXh0YXJlYSBpZD0iY29kZS1oYXhlIiBuYW1lPSJjb2RlIj4KaW1wb3J0IG9uZS50d28uVGhyZWU7CgpAYXR0cigidGVzdCIpCmNsYXNzIEZvbyZsdDtUJmd0OyBleHRlbmRzIFRocmVlCnsKCXB1YmxpYyBmdW5jdGlvbiBuZXcoKQoJewoJCW5vRm9vID0gMTI7Cgl9CgkKCXB1YmxpYyBzdGF0aWMgaW5saW5lIGZ1bmN0aW9uIGRvRm9vKG9iajp7azpJbnQsIGw6RmxvYXR9KTpJbnQKCXsKCQlmb3IoaSBpbiAwLi4uMTApCgkJewoJCQlvYmouaysrOwoJCQl0cmFjZShpKTsKCQkJdmFyIHZhcjEgPSBuZXcgQXJyYXkoKTsKCQkJaWYodmFyMS5sZW5ndGggPiAxKQoJCQkJdGhyb3cgIkVycm9yIjsKCQl9CgkJLy8gVGhlIGZvbGxvd2luZyBsaW5lIHNob3VsZCBub3QgYmUgY29sb3JlZCwgdGhlIHZhcmlhYmxlIGlzIHNjb3BlZCBvdXQKCQl2YXIxOwoJCS8qIE11bHRpIGxpbmUKCQkgKiBDb21tZW50IHRlc3QKCQkgKi8KCQlyZXR1cm4gb2JqLms7Cgl9Cglwcml2YXRlIGZ1bmN0aW9uIGJhcigpOlZvaWQKCXsKCQkjaWYgZmxhc2gKCQl2YXIgdDE6U3RyaW5nID0gIjEuMjEiOwoJCSNlbmQKCQl0cnkgewoJCQlkb0Zvbyh7azozLCBsOjEuMn0pOwoJCX0KCQljYXRjaCAoZSA6IFN0cmluZykgewoJCQl0cmFjZShlKTsKCQl9CgkJdmFyIHQyOkZsb2F0ID0gY2FzdCgzLjIpOwoJCXZhciB0MzpoYXhlLlRpbWVyID0gbmV3IGhheGUuVGltZXIoKTsKCQl2YXIgdDQgPSB7azpTdGQuaW50KHQyKSwgbDpTdGQucGFyc2VGbG9hdCh0MSl9OwoJCXZhciB0NSA9IH4vMTIzKy4qJC9pOwoJCWRvRm9vKHQ0KTsKCQl1bnR5cGVkIHQxID0gNDsKCQlib2IgPSBuZXcgRm9vJmx0O0ludCZndDsKCX0KCXB1YmxpYyB2YXIgb2tGb28oZGVmYXVsdCwgbmV2ZXIpOkZsb2F0OwoJdmFyIG5vRm9vKGdldEZvbywgbnVsbCk6SW50OwoJZnVuY3Rpb24gZ2V0Rm9vKCk6SW50IHsKCQlyZXR1cm4gbm9Gb287Cgl9CgkKCXB1YmxpYyB2YXIgdGhyZWU6SW50Owp9CmVudW0gQ29sb3IKewoJcmVkOwoJZ3JlZW47CglibHVlOwoJZ3JleSggdiA6IEludCApOwoJcmdiIChyOkludCxnOkludCxiOkludCk7Cn0KPC90ZXh0YXJlYT48L3A+Cgo8cD5IeG1sIG1vZGU6PC9wPgoKPHA+PHRleHRhcmVhIGlkPSJjb2RlLWh4bWwiPgotY3AgdGVzdAotanMgcGF0aC90by9maWxlLmpzCiMtcmVtYXAgbm1lOmZsYXNoCi0tbmV4dAotRCBzb3VyY2UtbWFwLWNvbnRlbnQKLWNtZCAndGVzdCcKLWxpYiBsaW1lCjwvdGV4dGFyZWE+PC9wPgo8L2Rpdj4KCiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUtaGF4ZSIpLCB7CiAgICAgIAltb2RlOiAiaGF4ZSIsCiAgICAgICAgbGluZU51bWJlcnM6IHRydWUsCiAgICAgICAgaW5kZW50VW5pdDogNCwKICAgICAgICBpbmRlbnRXaXRoVGFiczogdHJ1ZQogICAgICB9KTsKICAgICAgCiAgICAgIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlLWh4bWwiKSwgewogICAgICAJbW9kZTogImh4bWwiLAogICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgICAgIGluZGVudFVuaXQ6IDQsCiAgICAgICAgaW5kZW50V2l0aFRhYnM6IHRydWUKICAgICAgfSk7CiAgICA8L3NjcmlwdD4KCiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC94LWhheGUsIHRleHQveC1oeG1sPC9jb2RlPi48L3A+CiAgPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/htmlembedded/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/htmlembedded/htmlembedded.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSwgcmVxdWlyZSgiLi4vaHRtbG1peGVkL2h0bWxtaXhlZCIpKTsKICBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCkgLy8gQU1ECiAgICBkZWZpbmUoWyIuLi8uLi9saWIvY29kZW1pcnJvciIsICIuLi9odG1sbWl4ZWQvaHRtbG1peGVkIl0sIG1vZCk7CiAgZWxzZSAvLyBQbGFpbiBicm93c2VyIGVudgogICAgbW9kKENvZGVNaXJyb3IpOwp9KShmdW5jdGlvbihDb2RlTWlycm9yKSB7CiJ1c2Ugc3RyaWN0IjsKCkNvZGVNaXJyb3IuZGVmaW5lTW9kZSgiaHRtbGVtYmVkZGVkIiwgZnVuY3Rpb24oY29uZmlnLCBwYXJzZXJDb25maWcpIHsKCiAgLy9jb25maWcgc2V0dGluZ3MKICB2YXIgc2NyaXB0U3RhcnRSZWdleCA9IHBhcnNlckNvbmZpZy5zY3JpcHRTdGFydFJlZ2V4IHx8IC9ePCUvaSwKICAgICAgc2NyaXB0RW5kUmVnZXggPSBwYXJzZXJDb25maWcuc2NyaXB0RW5kUmVnZXggfHwgL14lPi9pOwoKICAvL2lubmVyIG1vZGVzCiAgdmFyIHNjcmlwdGluZ01vZGUsIGh0bWxNaXhlZE1vZGU7CgogIC8vdG9rZW5pemVyIHdoZW4gaW4gaHRtbCBtb2RlCiAgZnVuY3Rpb24gaHRtbERpc3BhdGNoKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgaWYgKHN0cmVhbS5tYXRjaChzY3JpcHRTdGFydFJlZ2V4LCBmYWxzZSkpIHsKICAgICAgICAgIHN0YXRlLnRva2VuPXNjcmlwdGluZ0Rpc3BhdGNoOwogICAgICAgICAgcmV0dXJuIHNjcmlwdGluZ01vZGUudG9rZW4oc3RyZWFtLCBzdGF0ZS5zY3JpcHRTdGF0ZSk7CiAgICAgICAgICB9CiAgICAgIGVsc2UKICAgICAgICAgIHJldHVybiBodG1sTWl4ZWRNb2RlLnRva2VuKHN0cmVhbSwgc3RhdGUuaHRtbFN0YXRlKTsKICAgIH0KCiAgLy90b2tlbml6ZXIgd2hlbiBpbiBzY3JpcHRpbmcgbW9kZQogIGZ1bmN0aW9uIHNjcmlwdGluZ0Rpc3BhdGNoKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgaWYgKHN0cmVhbS5tYXRjaChzY3JpcHRFbmRSZWdleCwgZmFsc2UpKSAgewogICAgICAgICAgc3RhdGUudG9rZW49aHRtbERpc3BhdGNoOwogICAgICAgICAgcmV0dXJuIGh0bWxNaXhlZE1vZGUudG9rZW4oc3RyZWFtLCBzdGF0ZS5odG1sU3RhdGUpOwogICAgICAgICB9CiAgICAgIGVsc2UKICAgICAgICAgIHJldHVybiBzY3JpcHRpbmdNb2RlLnRva2VuKHN0cmVhbSwgc3RhdGUuc2NyaXB0U3RhdGUpOwogICAgICAgICB9CgoKICByZXR1cm4gewogICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgIHNjcmlwdGluZ01vZGUgPSBzY3JpcHRpbmdNb2RlIHx8IENvZGVNaXJyb3IuZ2V0TW9kZShjb25maWcsIHBhcnNlckNvbmZpZy5zY3JpcHRpbmdNb2RlU3BlYyk7CiAgICAgIGh0bWxNaXhlZE1vZGUgPSBodG1sTWl4ZWRNb2RlIHx8IENvZGVNaXJyb3IuZ2V0TW9kZShjb25maWcsICJodG1sbWl4ZWQiKTsKICAgICAgcmV0dXJuIHsKICAgICAgICAgIHRva2VuIDogIHBhcnNlckNvbmZpZy5zdGFydE9wZW4gPyBzY3JpcHRpbmdEaXNwYXRjaCA6IGh0bWxEaXNwYXRjaCwKICAgICAgICAgIGh0bWxTdGF0ZSA6IENvZGVNaXJyb3Iuc3RhcnRTdGF0ZShodG1sTWl4ZWRNb2RlKSwKICAgICAgICAgIHNjcmlwdFN0YXRlIDogQ29kZU1pcnJvci5zdGFydFN0YXRlKHNjcmlwdGluZ01vZGUpCiAgICAgIH07CiAgICB9LAoKICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHJldHVybiBzdGF0ZS50b2tlbihzdHJlYW0sIHN0YXRlKTsKICAgIH0sCgogICAgaW5kZW50OiBmdW5jdGlvbihzdGF0ZSwgdGV4dEFmdGVyKSB7CiAgICAgIGlmIChzdGF0ZS50b2tlbiA9PSBodG1sRGlzcGF0Y2gpCiAgICAgICAgcmV0dXJuIGh0bWxNaXhlZE1vZGUuaW5kZW50KHN0YXRlLmh0bWxTdGF0ZSwgdGV4dEFmdGVyKTsKICAgICAgZWxzZSBpZiAoc2NyaXB0aW5nTW9kZS5pbmRlbnQpCiAgICAgICAgcmV0dXJuIHNjcmlwdGluZ01vZGUuaW5kZW50KHN0YXRlLnNjcmlwdFN0YXRlLCB0ZXh0QWZ0ZXIpOwogICAgfSwKCiAgICBjb3B5U3RhdGU6IGZ1bmN0aW9uKHN0YXRlKSB7CiAgICAgIHJldHVybiB7CiAgICAgICB0b2tlbiA6IHN0YXRlLnRva2VuLAogICAgICAgaHRtbFN0YXRlIDogQ29kZU1pcnJvci5jb3B5U3RhdGUoaHRtbE1peGVkTW9kZSwgc3RhdGUuaHRtbFN0YXRlKSwKICAgICAgIHNjcmlwdFN0YXRlIDogQ29kZU1pcnJvci5jb3B5U3RhdGUoc2NyaXB0aW5nTW9kZSwgc3RhdGUuc2NyaXB0U3RhdGUpCiAgICAgIH07CiAgICB9LAoKICAgIGlubmVyTW9kZTogZnVuY3Rpb24oc3RhdGUpIHsKICAgICAgaWYgKHN0YXRlLnRva2VuID09IHNjcmlwdGluZ0Rpc3BhdGNoKSByZXR1cm4ge3N0YXRlOiBzdGF0ZS5zY3JpcHRTdGF0ZSwgbW9kZTogc2NyaXB0aW5nTW9kZX07CiAgICAgIGVsc2UgcmV0dXJuIHtzdGF0ZTogc3RhdGUuaHRtbFN0YXRlLCBtb2RlOiBodG1sTWl4ZWRNb2RlfTsKICAgIH0KICB9Owp9LCAiaHRtbG1peGVkIik7CgpDb2RlTWlycm9yLmRlZmluZU1JTUUoImFwcGxpY2F0aW9uL3gtZWpzIiwgeyBuYW1lOiAiaHRtbGVtYmVkZGVkIiwgc2NyaXB0aW5nTW9kZVNwZWM6ImphdmFzY3JpcHQifSk7CkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgiYXBwbGljYXRpb24veC1hc3B4IiwgeyBuYW1lOiAiaHRtbGVtYmVkZGVkIiwgc2NyaXB0aW5nTW9kZVNwZWM6InRleHQveC1jc2hhcnAifSk7CkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgiYXBwbGljYXRpb24veC1qc3AiLCB7IG5hbWU6ICJodG1sZW1iZWRkZWQiLCBzY3JpcHRpbmdNb2RlU3BlYzoidGV4dC94LWphdmEifSk7CkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgiYXBwbGljYXRpb24veC1lcmIiLCB7IG5hbWU6ICJodG1sZW1iZWRkZWQiLCBzY3JpcHRpbmdNb2RlU3BlYzoicnVieSJ9KTsKCn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/htmlembedded/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogSHRtbCBFbWJlZGRlZCBTY3JpcHRzIG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4veG1sL3htbC5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9qYXZhc2NyaXB0L2phdmFzY3JpcHQuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vY3NzL2Nzcy5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9odG1sbWl4ZWQvaHRtbG1peGVkLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Imh0bWxlbWJlZGRlZC5qcyI+PC9zY3JpcHQ+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+LkNvZGVNaXJyb3Ige2JvcmRlci10b3A6IDFweCBzb2xpZCBibGFjazsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO308L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5IdG1sIEVtYmVkZGVkIFNjcmlwdHM8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPkh0bWwgRW1iZWRkZWQgU2NyaXB0cyBtb2RlPC9oMj4KPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KPCUKZnVuY3Rpb24gaGVsbG8od2hvKSB7CglyZXR1cm4gIkhlbGxvICIgKyB3aG87Cn0KJT4KVGhpcyBpcyBhbiBleGFtcGxlIG9mIEVKUyAoZW1iZWRkZWQgamF2YXNjcmlwdCkKPHA+VGhlIHByb2dyYW0gc2F5cyA8JT0gaGVsbG8oIndvcmxkIikgJT4uPC9wPgo8c2NyaXB0PgoJYWxlcnQoIkFuZCBoZXJlIGlzIHNvbWUgbm9ybWFsIEpTIGNvZGUiKTsgLy8gYWxzbyBjb2xvcmVkCjwvc2NyaXB0Pgo8L3RleHRhcmVhPjwvZm9ybT4KCiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgICAgIG1vZGU6ICJhcHBsaWNhdGlvbi94LWVqcyIsCiAgICAgICAgaW5kZW50VW5pdDogNCwKICAgICAgICBpbmRlbnRXaXRoVGFiczogdHJ1ZQogICAgICB9KTsKICAgIDwvc2NyaXB0PgoKICAgIDxwPk1vZGUgZm9yIGh0bWwgZW1iZWRkZWQgc2NyaXB0cyBsaWtlIEpTUCBhbmQgQVNQLk5FVC4gRGVwZW5kcyBvbiBIdG1sTWl4ZWQgd2hpY2ggaW4gdHVybiBkZXBlbmRzIG9uCiAgICBKYXZhU2NyaXB0LCBDU1MgYW5kIFhNTC48YnIgLz5PdGhlciBkZXBlbmRhbmNpZXMgaW5jbHVkZSB0aG9zZSBvZiB0aGUgc2NyaXBpbmcgbGFuZ3VhZ2UgY2hvc2VuLjwvcD4KCiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+YXBwbGljYXRpb24veC1hc3B4PC9jb2RlPiAoQVNQLk5FVCksIAogICAgPGNvZGU+YXBwbGljYXRpb24veC1lanM8L2NvZGU+IChFbWJlZGRlZCBKYXZhc2NyaXB0KSwgPGNvZGU+YXBwbGljYXRpb24veC1qc3A8L2NvZGU+IChKYXZhU2VydmVyIFBhZ2VzKTwvcD4KICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/htmlmixed/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/htmlmixed/htmlmixed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSwgcmVxdWlyZSgiLi4veG1sL3htbCIpLCByZXF1aXJlKCIuLi9qYXZhc2NyaXB0L2phdmFzY3JpcHQiKSwgcmVxdWlyZSgiLi4vY3NzL2NzcyIpKTsKICBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCkgLy8gQU1ECiAgICBkZWZpbmUoWyIuLi8uLi9saWIvY29kZW1pcnJvciIsICIuLi94bWwveG1sIiwgIi4uL2phdmFzY3JpcHQvamF2YXNjcmlwdCIsICIuLi9jc3MvY3NzIl0sIG1vZCk7CiAgZWxzZSAvLyBQbGFpbiBicm93c2VyIGVudgogICAgbW9kKENvZGVNaXJyb3IpOwp9KShmdW5jdGlvbihDb2RlTWlycm9yKSB7CiJ1c2Ugc3RyaWN0IjsKCkNvZGVNaXJyb3IuZGVmaW5lTW9kZSgiaHRtbG1peGVkIiwgZnVuY3Rpb24oY29uZmlnLCBwYXJzZXJDb25maWcpIHsKICB2YXIgaHRtbE1vZGUgPSBDb2RlTWlycm9yLmdldE1vZGUoY29uZmlnLCB7bmFtZTogInhtbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh0bWxNb2RlOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdWx0aWxpbmVUYWdJbmRlbnRGYWN0b3I6IHBhcnNlckNvbmZpZy5tdWx0aWxpbmVUYWdJbmRlbnRGYWN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpbGluZVRhZ0luZGVudFBhc3RUYWc6IHBhcnNlckNvbmZpZy5tdWx0aWxpbmVUYWdJbmRlbnRQYXN0VGFnfSk7CiAgdmFyIGNzc01vZGUgPSBDb2RlTWlycm9yLmdldE1vZGUoY29uZmlnLCAiY3NzIik7CgogIHZhciBzY3JpcHRUeXBlcyA9IFtdLCBzY3JpcHRUeXBlc0NvbmYgPSBwYXJzZXJDb25maWcgJiYgcGFyc2VyQ29uZmlnLnNjcmlwdFR5cGVzOwogIHNjcmlwdFR5cGVzLnB1c2goe21hdGNoZXM6IC9eKD86dGV4dHxhcHBsaWNhdGlvbilcLyg/OngtKT8oPzpqYXZhfGVjbWEpc2NyaXB0JHxeJC9pLAogICAgICAgICAgICAgICAgICAgIG1vZGU6IENvZGVNaXJyb3IuZ2V0TW9kZShjb25maWcsICJqYXZhc2NyaXB0Iil9KTsKICBpZiAoc2NyaXB0VHlwZXNDb25mKSBmb3IgKHZhciBpID0gMDsgaSA8IHNjcmlwdFR5cGVzQ29uZi5sZW5ndGg7ICsraSkgewogICAgdmFyIGNvbmYgPSBzY3JpcHRUeXBlc0NvbmZbaV07CiAgICBzY3JpcHRUeXBlcy5wdXNoKHttYXRjaGVzOiBjb25mLm1hdGNoZXMsIG1vZGU6IGNvbmYubW9kZSAmJiBDb2RlTWlycm9yLmdldE1vZGUoY29uZmlnLCBjb25mLm1vZGUpfSk7CiAgfQogIHNjcmlwdFR5cGVzLnB1c2goe21hdGNoZXM6IC8uLywKICAgICAgICAgICAgICAgICAgICBtb2RlOiBDb2RlTWlycm9yLmdldE1vZGUoY29uZmlnLCAidGV4dC9wbGFpbiIpfSk7CgogIGZ1bmN0aW9uIGh0bWwoc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIHRhZ05hbWUgPSBzdGF0ZS5odG1sU3RhdGUudGFnTmFtZTsKICAgIHZhciBzdHlsZSA9IGh0bWxNb2RlLnRva2VuKHN0cmVhbSwgc3RhdGUuaHRtbFN0YXRlKTsKICAgIGlmICh0YWdOYW1lID09ICJzY3JpcHQiICYmIC9cYnRhZ1xiLy50ZXN0KHN0eWxlKSAmJiBzdHJlYW0uY3VycmVudCgpID09ICI+IikgewogICAgICAvLyBTY3JpcHQgYmxvY2s6IG1vZGUgdG8gY2hhbmdlIHRvIGRlcGVuZHMgb24gdHlwZSBhdHRyaWJ1dGUKICAgICAgdmFyIHNjcmlwdFR5cGUgPSBzdHJlYW0uc3RyaW5nLnNsaWNlKE1hdGgubWF4KDAsIHN0cmVhbS5wb3MgLSAxMDApLCBzdHJlYW0ucG9zKS5tYXRjaCgvXGJ0eXBlXHMqPVxzKigiW14iXSsifCdbXiddKyd8XFMrKVtePF0qJC9pKTsKICAgICAgc2NyaXB0VHlwZSA9IHNjcmlwdFR5cGUgPyBzY3JpcHRUeXBlWzFdIDogIiI7CiAgICAgIGlmIChzY3JpcHRUeXBlICYmIC9bXCJcJ10vLnRlc3Qoc2NyaXB0VHlwZS5jaGFyQXQoMCkpKSBzY3JpcHRUeXBlID0gc2NyaXB0VHlwZS5zbGljZSgxLCBzY3JpcHRUeXBlLmxlbmd0aCAtIDEpOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNjcmlwdFR5cGVzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgdmFyIHRwID0gc2NyaXB0VHlwZXNbaV07CiAgICAgICAgaWYgKHR5cGVvZiB0cC5tYXRjaGVzID09ICJzdHJpbmciID8gc2NyaXB0VHlwZSA9PSB0cC5tYXRjaGVzIDogdHAubWF0Y2hlcy50ZXN0KHNjcmlwdFR5cGUpKSB7CiAgICAgICAgICBpZiAodHAubW9kZSkgewogICAgICAgICAgICBzdGF0ZS50b2tlbiA9IHNjcmlwdDsKICAgICAgICAgICAgc3RhdGUubG9jYWxNb2RlID0gdHAubW9kZTsKICAgICAgICAgICAgc3RhdGUubG9jYWxTdGF0ZSA9IHRwLm1vZGUuc3RhcnRTdGF0ZSAmJiB0cC5tb2RlLnN0YXJ0U3RhdGUoaHRtbE1vZGUuaW5kZW50KHN0YXRlLmh0bWxTdGF0ZSwgIiIpKTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIGlmICh0YWdOYW1lID09ICJzdHlsZSIgJiYgL1xidGFnXGIvLnRlc3Qoc3R5bGUpICYmIHN0cmVhbS5jdXJyZW50KCkgPT0gIj4iKSB7CiAgICAgIHN0YXRlLnRva2VuID0gY3NzOwogICAgICBzdGF0ZS5sb2NhbE1vZGUgPSBjc3NNb2RlOwogICAgICBzdGF0ZS5sb2NhbFN0YXRlID0gY3NzTW9kZS5zdGFydFN0YXRlKGh0bWxNb2RlLmluZGVudChzdGF0ZS5odG1sU3RhdGUsICIiKSk7CiAgICB9CiAgICByZXR1cm4gc3R5bGU7CiAgfQogIGZ1bmN0aW9uIG1heWJlQmFja3VwKHN0cmVhbSwgcGF0LCBzdHlsZSkgewogICAgdmFyIGN1ciA9IHN0cmVhbS5jdXJyZW50KCk7CiAgICB2YXIgY2xvc2UgPSBjdXIuc2VhcmNoKHBhdCksIG07CiAgICBpZiAoY2xvc2UgPiAtMSkgc3RyZWFtLmJhY2tVcChjdXIubGVuZ3RoIC0gY2xvc2UpOwogICAgZWxzZSBpZiAobSA9IGN1ci5tYXRjaCgvPFwvPyQvKSkgewogICAgICBzdHJlYW0uYmFja1VwKGN1ci5sZW5ndGgpOwogICAgICBpZiAoIXN0cmVhbS5tYXRjaChwYXQsIGZhbHNlKSkgc3RyZWFtLm1hdGNoKGN1cik7CiAgICB9CiAgICByZXR1cm4gc3R5bGU7CiAgfQogIGZ1bmN0aW9uIHNjcmlwdChzdHJlYW0sIHN0YXRlKSB7CiAgICBpZiAoc3RyZWFtLm1hdGNoKC9ePFwvXHMqc2NyaXB0XHMqPi9pLCBmYWxzZSkpIHsKICAgICAgc3RhdGUudG9rZW4gPSBodG1sOwogICAgICBzdGF0ZS5sb2NhbFN0YXRlID0gc3RhdGUubG9jYWxNb2RlID0gbnVsbDsKICAgICAgcmV0dXJuIGh0bWwoc3RyZWFtLCBzdGF0ZSk7CiAgICB9CiAgICByZXR1cm4gbWF5YmVCYWNrdXAoc3RyZWFtLCAvPFwvXHMqc2NyaXB0XHMqPi8sCiAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUubG9jYWxNb2RlLnRva2VuKHN0cmVhbSwgc3RhdGUubG9jYWxTdGF0ZSkpOwogIH0KICBmdW5jdGlvbiBjc3Moc3RyZWFtLCBzdGF0ZSkgewogICAgaWYgKHN0cmVhbS5tYXRjaCgvXjxcL1xzKnN0eWxlXHMqPi9pLCBmYWxzZSkpIHsKICAgICAgc3RhdGUudG9rZW4gPSBodG1sOwogICAgICBzdGF0ZS5sb2NhbFN0YXRlID0gc3RhdGUubG9jYWxNb2RlID0gbnVsbDsKICAgICAgcmV0dXJuIGh0bWwoc3RyZWFtLCBzdGF0ZSk7CiAgICB9CiAgICByZXR1cm4gbWF5YmVCYWNrdXAoc3RyZWFtLCAvPFwvXHMqc3R5bGVccyo+LywKICAgICAgICAgICAgICAgICAgICAgICBjc3NNb2RlLnRva2VuKHN0cmVhbSwgc3RhdGUubG9jYWxTdGF0ZSkpOwogIH0KCiAgcmV0dXJuIHsKICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKCkgewogICAgICB2YXIgc3RhdGUgPSBodG1sTW9kZS5zdGFydFN0YXRlKCk7CiAgICAgIHJldHVybiB7dG9rZW46IGh0bWwsIGxvY2FsTW9kZTogbnVsbCwgbG9jYWxTdGF0ZTogbnVsbCwgaHRtbFN0YXRlOiBzdGF0ZX07CiAgICB9LAoKICAgIGNvcHlTdGF0ZTogZnVuY3Rpb24oc3RhdGUpIHsKICAgICAgaWYgKHN0YXRlLmxvY2FsU3RhdGUpCiAgICAgICAgdmFyIGxvY2FsID0gQ29kZU1pcnJvci5jb3B5U3RhdGUoc3RhdGUubG9jYWxNb2RlLCBzdGF0ZS5sb2NhbFN0YXRlKTsKICAgICAgcmV0dXJuIHt0b2tlbjogc3RhdGUudG9rZW4sIGxvY2FsTW9kZTogc3RhdGUubG9jYWxNb2RlLCBsb2NhbFN0YXRlOiBsb2NhbCwKICAgICAgICAgICAgICBodG1sU3RhdGU6IENvZGVNaXJyb3IuY29weVN0YXRlKGh0bWxNb2RlLCBzdGF0ZS5odG1sU3RhdGUpfTsKICAgIH0sCgogICAgdG9rZW46IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgcmV0dXJuIHN0YXRlLnRva2VuKHN0cmVhbSwgc3RhdGUpOwogICAgfSwKCiAgICBpbmRlbnQ6IGZ1bmN0aW9uKHN0YXRlLCB0ZXh0QWZ0ZXIpIHsKICAgICAgaWYgKCFzdGF0ZS5sb2NhbE1vZGUgfHwgL15ccyo8XC8vLnRlc3QodGV4dEFmdGVyKSkKICAgICAgICByZXR1cm4gaHRtbE1vZGUuaW5kZW50KHN0YXRlLmh0bWxTdGF0ZSwgdGV4dEFmdGVyKTsKICAgICAgZWxzZSBpZiAoc3RhdGUubG9jYWxNb2RlLmluZGVudCkKICAgICAgICByZXR1cm4gc3RhdGUubG9jYWxNb2RlLmluZGVudChzdGF0ZS5sb2NhbFN0YXRlLCB0ZXh0QWZ0ZXIpOwogICAgICBlbHNlCiAgICAgICAgcmV0dXJuIENvZGVNaXJyb3IuUGFzczsKICAgIH0sCgogICAgaW5uZXJNb2RlOiBmdW5jdGlvbihzdGF0ZSkgewogICAgICByZXR1cm4ge3N0YXRlOiBzdGF0ZS5sb2NhbFN0YXRlIHx8IHN0YXRlLmh0bWxTdGF0ZSwgbW9kZTogc3RhdGUubG9jYWxNb2RlIHx8IGh0bWxNb2RlfTsKICAgIH0KICB9Owp9LCAieG1sIiwgImphdmFzY3JpcHQiLCAiY3NzIik7CgpDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQvaHRtbCIsICJodG1sbWl4ZWQiKTsKCn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/htmlmixed/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogSFRNTCBtaXhlZCBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL3htbC94bWwuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vamF2YXNjcmlwdC9qYXZhc2NyaXB0LmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL2Nzcy9jc3MuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vdmJzY3JpcHQvdmJzY3JpcHQuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iaHRtbG1peGVkLmpzIj48L3NjcmlwdD4KPHN0eWxlPi5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazt9PC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aW1nIGlkPWxvZ28gc3JjPSIuLi8uLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5MYW5ndWFnZSBtb2RlczwvYT4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+SFRNTCBtaXhlZDwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+SFRNTCBtaXhlZCBtb2RlPC9oMj4KPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KPGh0bWwgc3R5bGU9ImNvbG9yOiBncmVlbiI+CiAgPCEtLSB0aGlzIGlzIGEgY29tbWVudCAtLT4KICA8aGVhZD4KICAgIDx0aXRsZT5NaXhlZCBIVE1MIEV4YW1wbGU8L3RpdGxlPgogICAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KICAgICAgaDEge2ZvbnQtZmFtaWx5OiBjb21pYyBzYW5zOyBjb2xvcjogI2YwZjt9CiAgICAgIGRpdiB7YmFja2dyb3VuZDogeWVsbG93ICFpbXBvcnRhbnQ7fQogICAgICBib2R5IHsKICAgICAgICBtYXgtd2lkdGg6IDUwZW07CiAgICAgICAgbWFyZ2luOiAxZW0gMmVtIDFlbSA1ZW07CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC9oZWFkPgogIDxib2R5PgogICAgPGgxPk1peGVkIEhUTUwgRXhhbXBsZTwvaDE+CiAgICA8c2NyaXB0PgogICAgICBmdW5jdGlvbiBqc0Z1bmMoYXJnMSwgYXJnMikgewogICAgICAgIGlmIChhcmcxICYmIGFyZzIpIGRvY3VtZW50LmJvZHkuaW5uZXJIVE1MID0gImFjaG9vIjsKICAgICAgfQogICAgPC9zY3JpcHQ+CiAgPC9ib2R5Pgo8L2h0bWw+CjwvdGV4dGFyZWE+PC9mb3JtPgogICAgPHNjcmlwdD4KICAgICAgLy8gRGVmaW5lIGFuIGV4dGVuZGVkIG1peGVkLW1vZGUgdGhhdCB1bmRlcnN0YW5kcyB2YnNjcmlwdCBhbmQKICAgICAgLy8gbGVhdmVzIG11c3RhY2hlL2hhbmRsZWJhcnMgZW1iZWRkZWQgdGVtcGxhdGVzIGluIGh0bWwgbW9kZQogICAgICB2YXIgbWl4ZWRNb2RlID0gewogICAgICAgIG5hbWU6ICJodG1sbWl4ZWQiLAogICAgICAgIHNjcmlwdFR5cGVzOiBbe21hdGNoZXM6IC9cL3gtaGFuZGxlYmFycy10ZW1wbGF0ZXxcL3gtbXVzdGFjaGUvaSwKICAgICAgICAgICAgICAgICAgICAgICBtb2RlOiBudWxsfSwKICAgICAgICAgICAgICAgICAgICAgIHttYXRjaGVzOiAvKHRleHR8YXBwbGljYXRpb24pXC8oeC0pP3ZiKGF8c2NyaXB0KS9pLAogICAgICAgICAgICAgICAgICAgICAgIG1vZGU6ICJ2YnNjcmlwdCJ9XQogICAgICB9OwogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwge21vZGU6IG1peGVkTW9kZX0pOwogICAgPC9zY3JpcHQ+CgogICAgPHA+VGhlIEhUTUwgbWl4ZWQgbW9kZSBkZXBlbmRzIG9uIHRoZSBYTUwsIEphdmFTY3JpcHQsIGFuZCBDU1MgbW9kZXMuPC9wPgoKICAgIDxwPkl0IHRha2VzIGFuIG9wdGlvbmFsIG1vZGUgY29uZmlndXJhdGlvbgogICAgb3B0aW9uLCA8Y29kZT5zY3JpcHRUeXBlczwvY29kZT4sIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGFkZCBjdXN0b20KICAgIGJlaGF2aW9yIGZvciBzcGVjaWZpYyA8Y29kZT4mbHQ7c2NyaXB0IHR5cGU9Ii4uLiI+PC9jb2RlPiB0YWdzLiBJZgogICAgZ2l2ZW4sIGl0IHNob3VsZCBob2xkIGFuIGFycmF5IG9mIDxjb2RlPnttYXRjaGVzLCBtb2RlfTwvY29kZT4KICAgIG9iamVjdHMsIHdoZXJlIDxjb2RlPm1hdGNoZXM8L2NvZGU+IGlzIGEgc3RyaW5nIG9yIHJlZ2V4cCB0aGF0CiAgICBtYXRjaGVzIHRoZSBzY3JpcHQgdHlwZSwgYW5kIDxjb2RlPm1vZGU8L2NvZGU+IGlzCiAgICBlaXRoZXIgPGNvZGU+bnVsbDwvY29kZT4sIGZvciBzY3JpcHQgdHlwZXMgdGhhdCBzaG91bGQgc3RheSBpbgogICAgSFRNTCBtb2RlLCBvciBhIDxhIGhyZWY9Ii4uLy4uL2RvYy9tYW51YWwuaHRtbCNvcHRpb25fbW9kZSI+bW9kZQogICAgc3BlYzwvYT4gY29ycmVzcG9uZGluZyB0byB0aGUgbW9kZSB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciB0aGUKICAgIHNjcmlwdC48L3A+CgogICAgPHA+PHN0cm9uZz5NSU1FIHR5cGVzIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPnRleHQvaHRtbDwvY29kZT4KICAgIChyZWRlZmluZWQsIG9ubHkgdGFrZXMgZWZmZWN0IGlmIHlvdSBsb2FkIHRoaXMgcGFyc2VyIGFmdGVyIHRoZQogICAgWE1MIHBhcnNlcikuPC9wPgoKICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/http/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/http/http.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJodHRwIiwgZnVuY3Rpb24oKSB7CiAgZnVuY3Rpb24gZmFpbEZpcnN0TGluZShzdHJlYW0sIHN0YXRlKSB7CiAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICBzdGF0ZS5jdXIgPSBoZWFkZXI7CiAgICByZXR1cm4gImVycm9yIjsKICB9CgogIGZ1bmN0aW9uIHN0YXJ0KHN0cmVhbSwgc3RhdGUpIHsKICAgIGlmIChzdHJlYW0ubWF0Y2goL15IVFRQXC9cZFwuXGQvKSkgewogICAgICBzdGF0ZS5jdXIgPSByZXNwb25zZVN0YXR1c0NvZGU7CiAgICAgIHJldHVybiAia2V5d29yZCI7CiAgICB9IGVsc2UgaWYgKHN0cmVhbS5tYXRjaCgvXltBLVpdKy8pICYmIC9bIFx0XS8udGVzdChzdHJlYW0ucGVlaygpKSkgewogICAgICBzdGF0ZS5jdXIgPSByZXF1ZXN0UGF0aDsKICAgICAgcmV0dXJuICJrZXl3b3JkIjsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBmYWlsRmlyc3RMaW5lKHN0cmVhbSwgc3RhdGUpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gcmVzcG9uc2VTdGF0dXNDb2RlKHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBjb2RlID0gc3RyZWFtLm1hdGNoKC9eXGQrLyk7CiAgICBpZiAoIWNvZGUpIHJldHVybiBmYWlsRmlyc3RMaW5lKHN0cmVhbSwgc3RhdGUpOwoKICAgIHN0YXRlLmN1ciA9IHJlc3BvbnNlU3RhdHVzVGV4dDsKICAgIHZhciBzdGF0dXMgPSBOdW1iZXIoY29kZVswXSk7CiAgICBpZiAoc3RhdHVzID49IDEwMCAmJiBzdGF0dXMgPCAyMDApIHsKICAgICAgcmV0dXJuICJwb3NpdGl2ZSBpbmZvcm1hdGlvbmFsIjsKICAgIH0gZWxzZSBpZiAoc3RhdHVzID49IDIwMCAmJiBzdGF0dXMgPCAzMDApIHsKICAgICAgcmV0dXJuICJwb3NpdGl2ZSBzdWNjZXNzIjsKICAgIH0gZWxzZSBpZiAoc3RhdHVzID49IDMwMCAmJiBzdGF0dXMgPCA0MDApIHsKICAgICAgcmV0dXJuICJwb3NpdGl2ZSByZWRpcmVjdCI7CiAgICB9IGVsc2UgaWYgKHN0YXR1cyA+PSA0MDAgJiYgc3RhdHVzIDwgNTAwKSB7CiAgICAgIHJldHVybiAibmVnYXRpdmUgY2xpZW50LWVycm9yIjsKICAgIH0gZWxzZSBpZiAoc3RhdHVzID49IDUwMCAmJiBzdGF0dXMgPCA2MDApIHsKICAgICAgcmV0dXJuICJuZWdhdGl2ZSBzZXJ2ZXItZXJyb3IiOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICJlcnJvciI7CiAgICB9CiAgfQoKICBmdW5jdGlvbiByZXNwb25zZVN0YXR1c1RleHQoc3RyZWFtLCBzdGF0ZSkgewogICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgc3RhdGUuY3VyID0gaGVhZGVyOwogICAgcmV0dXJuIG51bGw7CiAgfQoKICBmdW5jdGlvbiByZXF1ZXN0UGF0aChzdHJlYW0sIHN0YXRlKSB7CiAgICBzdHJlYW0uZWF0V2hpbGUoL1xTLyk7CiAgICBzdGF0ZS5jdXIgPSByZXF1ZXN0UHJvdG9jb2w7CiAgICByZXR1cm4gInN0cmluZy0yIjsKICB9CgogIGZ1bmN0aW9uIHJlcXVlc3RQcm90b2NvbChzdHJlYW0sIHN0YXRlKSB7CiAgICBpZiAoc3RyZWFtLm1hdGNoKC9eSFRUUFwvXGRcLlxkJC8pKSB7CiAgICAgIHN0YXRlLmN1ciA9IGhlYWRlcjsKICAgICAgcmV0dXJuICJrZXl3b3JkIjsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBmYWlsRmlyc3RMaW5lKHN0cmVhbSwgc3RhdGUpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gaGVhZGVyKHN0cmVhbSkgewogICAgaWYgKHN0cmVhbS5zb2woKSAmJiAhc3RyZWFtLmVhdCgvWyBcdF0vKSkgewogICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eLio/Oi8pKSB7CiAgICAgICAgcmV0dXJuICJhdG9tIjsKICAgICAgfSBlbHNlIHsKICAgICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICAgICAgcmV0dXJuICJlcnJvciI7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgfQogIH0KCiAgZnVuY3Rpb24gYm9keShzdHJlYW0pIHsKICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgIHJldHVybiBudWxsOwogIH0KCiAgcmV0dXJuIHsKICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHZhciBjdXIgPSBzdGF0ZS5jdXI7CiAgICAgIGlmIChjdXIgIT0gaGVhZGVyICYmIGN1ciAhPSBib2R5ICYmIHN0cmVhbS5lYXRTcGFjZSgpKSByZXR1cm4gbnVsbDsKICAgICAgcmV0dXJuIGN1cihzdHJlYW0sIHN0YXRlKTsKICAgIH0sCgogICAgYmxhbmtMaW5lOiBmdW5jdGlvbihzdGF0ZSkgewogICAgICBzdGF0ZS5jdXIgPSBib2R5OwogICAgfSwKCiAgICBzdGFydFN0YXRlOiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHtjdXI6IHN0YXJ0fTsKICAgIH0KICB9Owp9KTsKCkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgibWVzc2FnZS9odHRwIiwgImh0dHAiKTsKCn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/http/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogSFRUUCBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Imh0dHAuanMiPjwvc2NyaXB0Pgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPi5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazt9PC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aW1nIGlkPWxvZ28gc3JjPSIuLi8uLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5MYW5ndWFnZSBtb2RlczwvYT4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+SFRUUDwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+SFRUUCBtb2RlPC9oMj4KCgo8ZGl2Pjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+ClBPU1QgL3NvbWV3aGVyZSBIVFRQLzEuMQpIb3N0OiBleGFtcGxlLmNvbQpJZi1Nb2RpZmllZC1TaW5jZTogU2F0LCAyOSBPY3QgMTk5NCAxOTo0MzozMSBHTVQKQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7CgljaGFyc2V0PXV0Zi04ClVzZXItQWdlbnQ6IE1vemlsbGEvNS4wIChYMTE7IExpbnV4IHg4Nl82NCkgQXBwbGVXZWJLaXQvNTM2LjExIChLSFRNTCwgbGlrZSBHZWNrbykgVWJ1bnR1LzEyLjA0IENocm9taXVtLzIwLjAuMTEzMi40NyBDaHJvbWUvMjAuMC4xMTMyLjQ3IFNhZmFyaS81MzYuMTEKClRoaXMgaXMgdGhlIHJlcXVlc3QgYm9keSEKPC90ZXh0YXJlYT48L2Rpdj4KCiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwge30pOwogICAgPC9zY3JpcHQ+CgogICAgPHA+PHN0cm9uZz5NSU1FIHR5cGVzIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPm1lc3NhZ2UvaHR0cDwvY29kZT4uPC9wPgogIDwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogTGFuZ3VhZ2UgTW9kZXM8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi9kb2MvZG9jcy5jc3MiPgoKPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aW1nIGlkPWxvZ28gc3JjPSIuLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+TGFuZ3VhZ2UgbW9kZXM8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KCjxoMj5MYW5ndWFnZSBtb2RlczwvaDI+Cgo8cD5UaGlzIGlzIGEgbGlzdCBvZiBldmVyeSBtb2RlIGluIHRoZSBkaXN0cmlidXRpb24uIEVhY2ggbW9kZSBsaXZlcwppbiBhIHN1YmRpcmVjdG9yeSBvZiB0aGUgPGNvZGU+bW9kZS88L2NvZGU+IGRpcmVjdG9yeSwgYW5kIHR5cGljYWxseQpkZWZpbmVzIGEgc2luZ2xlIEphdmFTY3JpcHQgZmlsZSB0aGF0IGltcGxlbWVudHMgdGhlIG1vZGUuIExvYWRpbmcKc3VjaCBmaWxlIHdpbGwgbWFrZSB0aGUgbGFuZ3VhZ2UgYXZhaWxhYmxlIHRvIENvZGVNaXJyb3IsIHRocm91Z2gKdGhlIDxhIGhyZWY9Im1hbnVhbC5odG1sI29wdGlvbl9tb2RlIj48Y29kZT5tb2RlPC9jb2RlPjwvYT4Kb3B0aW9uLjwvcD4KCjxkaXYgc3R5bGU9Ii13ZWJraXQtY29sdW1uczogMTAwcHggMjsgLW1vei1jb2x1bW5zOiAxMDBweCAyOyBjb2x1bW5zOiAxMDBweCAyOyI+CiAgICA8dWwgc3R5bGU9Im1hcmdpbi10b3A6IDAiPgogICAgICA8bGk+PGEgaHJlZj0iYXBsL2luZGV4Lmh0bWwiPkFQTDwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0iYXN0ZXJpc2svaW5kZXguaHRtbCI+QXN0ZXJpc2sgZGlhbHBsYW48L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9ImNsaWtlL2luZGV4Lmh0bWwiPkMsIEMrKywgQyM8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9ImNsb2p1cmUvaW5kZXguaHRtbCI+Q2xvanVyZTwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0iY29ib2wvaW5kZXguaHRtbCI+Q09CT0w8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9ImNvZmZlZXNjcmlwdC9pbmRleC5odG1sIj5Db2ZmZWVTY3JpcHQ8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9ImNvbW1vbmxpc3AvaW5kZXguaHRtbCI+Q29tbW9uIExpc3A8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9ImNzcy9pbmRleC5odG1sIj5DU1M8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9ImN5cGhlci9pbmRleC5odG1sIj5DeXBoZXI8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9InB5dGhvbi9pbmRleC5odG1sIj5DeXRob248L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9ImQvaW5kZXguaHRtbCI+RDwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0iZGphbmdvL2luZGV4Lmh0bWwiPkRqYW5nbzwvYT4gKHRlbXBsYXRpbmcgbGFuZ3VhZ2UpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9ImRpZmYvaW5kZXguaHRtbCI+ZGlmZjwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0iZHRkL2luZGV4Lmh0bWwiPkRURDwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0iZHlsYW4vaW5kZXguaHRtbCI+RHlsYW48L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9ImVjbC9pbmRleC5odG1sIj5FQ0w8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9ImVpZmZlbC9pbmRleC5odG1sIj5FaWZmZWw8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9ImVybGFuZy9pbmRleC5odG1sIj5Fcmxhbmc8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9ImZvcnRyYW4vaW5kZXguaHRtbCI+Rm9ydHJhbjwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0ibWxsaWtlL2luZGV4Lmh0bWwiPkYjPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJnYXMvaW5kZXguaHRtbCI+R2FzPC9hPiAoQVQmYW1wO1Qtc3R5bGUgYXNzZW1ibHkpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9ImdoZXJraW4vaW5kZXguaHRtbCI+R2hlcmtpbjwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0iZ28vaW5kZXguaHRtbCI+R288L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imdyb292eS9pbmRleC5odG1sIj5Hcm9vdnk8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9ImhhbWwvaW5kZXguaHRtbCI+SEFNTDwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaGFza2VsbC9pbmRleC5odG1sIj5IYXNrZWxsPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJoYXhlL2luZGV4Lmh0bWwiPkhheGU8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0bWxlbWJlZGRlZC9pbmRleC5odG1sIj5IVE1MIGVtYmVkZGVkIHNjcmlwdHM8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0bWxtaXhlZC9pbmRleC5odG1sIj5IVE1MIG1peGVkLW1vZGU8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHAvaW5kZXguaHRtbCI+SFRUUDwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0iY2xpa2UvaW5kZXguaHRtbCI+SmF2YTwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0iamFkZS9pbmRleC5odG1sIj5KYWRlPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJqYXZhc2NyaXB0L2luZGV4Lmh0bWwiPkphdmFTY3JpcHQ8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9ImppbmphMi9pbmRleC5odG1sIj5KaW5qYTI8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imp1bGlhL2luZGV4Lmh0bWwiPkp1bGlhPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJrb3RsaW4vaW5kZXguaHRtbCI+S290bGluPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJjc3MvbGVzcy5odG1sIj5MRVNTPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJsaXZlc2NyaXB0L2luZGV4Lmh0bWwiPkxpdmVTY3JpcHQ8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imx1YS9pbmRleC5odG1sIj5MdWE8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9Im1hcmtkb3duL2luZGV4Lmh0bWwiPk1hcmtkb3duPC9hPiAoPGEgaHJlZj0iZ2ZtL2luZGV4Lmh0bWwiPkdpdEh1Yi1mbGF2b3VyPC9hPik8L2xpPgogICAgICA8bGk+PGEgaHJlZj0ibWlyYy9pbmRleC5odG1sIj5tSVJDPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJuZ2lueC9pbmRleC5odG1sIj5OZ2lueDwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0ibnRyaXBsZXMvaW5kZXguaHRtbCI+TlRyaXBsZXM8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9Im1sbGlrZS9pbmRleC5odG1sIj5PQ2FtbDwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0ib2N0YXZlL2luZGV4Lmh0bWwiPk9jdGF2ZTwvYT4gKE1BVExBQik8L2xpPgogICAgICA8bGk+PGEgaHJlZj0icGFzY2FsL2luZGV4Lmh0bWwiPlBhc2NhbDwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0icGVnanMvaW5kZXguaHRtbCI+UEVHLmpzPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJwZXJsL2luZGV4Lmh0bWwiPlBlcmw8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9InBocC9pbmRleC5odG1sIj5QSFA8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9InBpZy9pbmRleC5odG1sIj5QaWcgTGF0aW48L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9InByb3BlcnRpZXMvaW5kZXguaHRtbCI+UHJvcGVydGllcyBmaWxlczwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0icHVwcGV0L2luZGV4Lmh0bWwiPlB1cHBldDwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0icHl0aG9uL2luZGV4Lmh0bWwiPlB5dGhvbjwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0icS9pbmRleC5odG1sIj5RPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJyL2luZGV4Lmh0bWwiPlI8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9InJwbS9pbmRleC5odG1sIj5SUE08L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9InJzdC9pbmRleC5odG1sIj5yZVN0cnVjdHVyZWRUZXh0PC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJydWJ5L2luZGV4Lmh0bWwiPlJ1Ynk8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9InJ1c3QvaW5kZXguaHRtbCI+UnVzdDwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0ic2Fzcy9pbmRleC5odG1sIj5TYXNzPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJjbGlrZS9zY2FsYS5odG1sIj5TY2FsYTwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0ic2NoZW1lL2luZGV4Lmh0bWwiPlNjaGVtZTwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0iY3NzL3Njc3MuaHRtbCI+U0NTUzwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0ic2hlbGwvaW5kZXguaHRtbCI+U2hlbGw8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9InNpZXZlL2luZGV4Lmh0bWwiPlNpZXZlPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJzbWFsbHRhbGsvaW5kZXguaHRtbCI+U21hbGx0YWxrPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJzbWFydHkvaW5kZXguaHRtbCI+U21hcnR5PC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJzbWFydHltaXhlZC9pbmRleC5odG1sIj5TbWFydHkvSFRNTCBtaXhlZDwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0ic29sci9pbmRleC5odG1sIj5Tb2xyPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJzcWwvaW5kZXguaHRtbCI+U1FMPC9hPiAoc2V2ZXJhbCBkaWFsZWN0cyk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0ic3BhcnFsL2luZGV4Lmh0bWwiPlNQQVJRTDwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0ic3RleC9pbmRleC5odG1sIj5zVGVYLCBMYVRlWDwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0idGNsL2luZGV4Lmh0bWwiPlRjbDwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0idGlkZGx5d2lraS9pbmRleC5odG1sIj5UaWRkbHl3aWtpPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJ0aWtpL2luZGV4Lmh0bWwiPlRpa2kgd2lraTwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0idG9tbC9pbmRleC5odG1sIj5UT01MPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJ0dXJ0bGUvaW5kZXguaHRtbCI+VHVydGxlPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJ2Yi9pbmRleC5odG1sIj5WQi5ORVQ8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9InZic2NyaXB0L2luZGV4Lmh0bWwiPlZCU2NyaXB0PC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJ2ZWxvY2l0eS9pbmRleC5odG1sIj5WZWxvY2l0eTwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0idmVyaWxvZy9pbmRleC5odG1sIj5WZXJpbG9nL1N5c3RlbVZlcmlsb2c8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9InhtbC9pbmRleC5odG1sIj5YTUwvSFRNTDwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0ieHF1ZXJ5L2luZGV4Lmh0bWwiPlhRdWVyeTwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0ieWFtbC9pbmRleC5odG1sIj5ZQU1MPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJ6ODAvaW5kZXguaHRtbCI+WjgwPC9hPjwvbGk+CiAgICA8L3VsPgogIDwvZGl2PgoKPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/jade/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/jade/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogSmFkZSBUZW1wbGF0aW5nIE1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vamF2YXNjcmlwdC9qYXZhc2NyaXB0LmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL2Nzcy9jc3MuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4veG1sL3htbC5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9odG1sbWl4ZWQvaHRtbG1peGVkLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9ImphZGUuanMiPjwvc2NyaXB0Pgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPi5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazt9PC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aW1nIGlkPWxvZ28gc3JjPSIuLi8uLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5MYW5ndWFnZSBtb2RlczwvYT4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+SmFkZSBUZW1wbGF0aW5nIE1vZGU8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPkphZGUgVGVtcGxhdGluZyBNb2RlPC9oMj4KPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KZG9jdHlwZSBodG1sCiAgaHRtbAogICAgaGVhZAogICAgICB0aXRsZT0gIkphZGUgVGVtcGxhdGluZyBDb2RlTWlycm9yIE1vZGUgRXhhbXBsZSIKICAgICAgbGluayhyZWw9J3N0eWxlc2hlZXQnLCBocmVmPScvY3NzL2Jvb3RzdHJhcC5taW4uY3NzJykKICAgICAgbGluayhyZWw9J3N0eWxlc2hlZXQnLCBocmVmPScvY3NzL2luZGV4LmNzcycpCiAgICAgIHNjcmlwdCh0eXBlPSd0ZXh0L2phdmFzY3JpcHQnLCBzcmM9Jy9qcy9qcXVlcnktMS45LjEubWluLmpzJykKICAgICAgc2NyaXB0KHR5cGU9J3RleHQvamF2YXNjcmlwdCcsIHNyYz0nL2pzL2Jvb3RzdHJhcC5taW4uanMnKQogICAgYm9keQogICAgICBkaXYuaGVhZGVyCiAgICAgICAgaDEgV2VsY29tZSB0byB0aGlzIEV4YW1wbGUKICAgICAgZGl2LnNwb3RzCiAgICAgICAgaWYgbG9jYWxzLnNwb3RzCiAgICAgICAgICBlYWNoIHNwb3QgaW4gc3BvdHMKICAgICAgICAgICAgZGl2LnNwb3Qud2VsbAogICAgICAgICBkaXYKICAgICAgICAgICBpZiBzcG90LmxvZ28KICAgICAgICAgICAgIGltZy5pbWctcm91bmRlZC5sb2dvKHNyYz1zcG90LmxvZ28pCiAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgaW1nLmltZy1yb3VuZGVkLmxvZ28oc3JjPSJpbWcvcGxhY2Vob2xkZXIucG5nIikKICAgICAgICAgaDMKICAgICAgICAgICBhKGhyZWY9c3BvdC5oYXNoKSAjI3tzcG90Lmhhc2h9CiAgICAgICAgICAgaWYgc3BvdC50aXRsZQogICAgICAgICAgICAgc3Bhbi50aXRsZSAje3Nwb3QudGl0bGV9CiAgICAgICAgICAgaWYgc3BvdC5kZXNjCiAgICAgICAgICAgICBkaXYgI3tzcG90LmRlc2N9CiAgICAgICAgZWxzZQogICAgICAgICAgaDMgVGhlcmUgYXJlIG5vIHNwb3RzIGN1cnJlbnRseSBhdmFpbGFibGUuCjwvdGV4dGFyZWE+PC9mb3JtPgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICBtb2RlOiB7bmFtZTogImphZGUiLCBhbGlnbkNEQVRBOiB0cnVlfSwKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZQogICAgICB9KTsKICAgIDwvc2NyaXB0PgogICAgPGgzPlRoZSBKYWRlIFRlbXBsYXRpbmcgTW9kZTwvaDM+CiAgICAgIDxwPiBDcmVhdGVkIGJ5IEZvcmJlcyBMaW5kZXNheS4gTWFuYWdlZCBhcyBwYXJ0IG9mIGEgQnJhY2tldHMgZXh0ZW5zaW9uIGF0IDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9Gb3JiZXNMaW5kZXNheS9qYWRlLWJyYWNrZXRzIj5odHRwczovL2dpdGh1Yi5jb20vRm9yYmVzTGluZGVzYXkvamFkZS1icmFja2V0czwvYT4uPC9wPgogICAgPHA+PHN0cm9uZz5NSU1FIHR5cGUgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC94LWphZGU8L2NvZGU+LjwvcD4KICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/jade/jade.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSwgcmVxdWlyZSgiLi4vamF2YXNjcmlwdC9qYXZhc2NyaXB0IiksIHJlcXVpcmUoIi4uL2Nzcy9jc3MiKSwgcmVxdWlyZSgiLi4vaHRtbG1peGVkL2h0bWxtaXhlZCIpKTsKICBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCkgLy8gQU1ECiAgICBkZWZpbmUoWyIuLi8uLi9saWIvY29kZW1pcnJvciIsICIuLi9qYXZhc2NyaXB0L2phdmFzY3JpcHQiLCAiLi4vY3NzL2NzcyIsICIuLi9odG1sbWl4ZWQvaHRtbG1peGVkIl0sIG1vZCk7CiAgZWxzZSAvLyBQbGFpbiBicm93c2VyIGVudgogICAgbW9kKENvZGVNaXJyb3IpOwp9KShmdW5jdGlvbihDb2RlTWlycm9yKSB7CiJ1c2Ugc3RyaWN0IjsKCkNvZGVNaXJyb3IuZGVmaW5lTW9kZSgnamFkZScsIGZ1bmN0aW9uIChjb25maWcpIHsKICAvLyB0b2tlbiB0eXBlcwogIHZhciBLRVlXT1JEID0gJ2tleXdvcmQnOwogIHZhciBET0NUWVBFID0gJ21ldGEnOwogIHZhciBJRCA9ICdidWlsdGluJzsKICB2YXIgQ0xBU1MgPSAncXVhbGlmaWVyJzsKCiAgdmFyIEFUVFJTX05FU1QgPSB7CiAgICAneyc6ICd9JywKICAgICcoJzogJyknLAogICAgJ1snOiAnXScKICB9OwoKICB2YXIganNNb2RlID0gQ29kZU1pcnJvci5nZXRNb2RlKGNvbmZpZywgJ2phdmFzY3JpcHQnKTsKCiAgZnVuY3Rpb24gU3RhdGUoKSB7CiAgICB0aGlzLmphdmFTY3JpcHRMaW5lID0gZmFsc2U7CiAgICB0aGlzLmphdmFTY3JpcHRMaW5lRXhjbHVkZXNDb2xvbiA9IGZhbHNlOwoKICAgIHRoaXMuamF2YVNjcmlwdEFyZ3VtZW50cyA9IGZhbHNlOwogICAgdGhpcy5qYXZhU2NyaXB0QXJndW1lbnRzRGVwdGggPSAwOwoKICAgIHRoaXMuaXNJbnRlcnBvbGF0aW5nID0gZmFsc2U7CiAgICB0aGlzLmludGVycG9sYXRpb25OZXN0aW5nID0gMDsKCiAgICB0aGlzLmpzU3RhdGUgPSBqc01vZGUuc3RhcnRTdGF0ZSgpOwoKICAgIHRoaXMucmVzdE9mTGluZSA9ICcnOwoKICAgIHRoaXMuaXNJbmNsdWRlRmlsdGVyZWQgPSBmYWxzZTsKICAgIHRoaXMuaXNFYWNoID0gZmFsc2U7CgogICAgdGhpcy5sYXN0VGFnID0gJyc7CiAgICB0aGlzLnNjcmlwdFR5cGUgPSAnJzsKCiAgICAvLyBBdHRyaWJ1dGVzIE1vZGUKICAgIHRoaXMuaXNBdHRycyA9IGZhbHNlOwogICAgdGhpcy5hdHRyc05lc3QgPSBbXTsKICAgIHRoaXMuaW5BdHRyaWJ1dGVOYW1lID0gdHJ1ZTsKICAgIHRoaXMuYXR0cmlidXRlSXNUeXBlID0gZmFsc2U7CiAgICB0aGlzLmF0dHJWYWx1ZSA9ICcnOwoKICAgIC8vIEluZGVudGVkIE1vZGUKICAgIHRoaXMuaW5kZW50T2YgPSBJbmZpbml0eTsKICAgIHRoaXMuaW5kZW50VG9rZW4gPSAnJzsKCiAgICB0aGlzLmlubmVyTW9kZSA9IG51bGw7CiAgICB0aGlzLmlubmVyU3RhdGUgPSBudWxsOwoKICAgIHRoaXMuaW5uZXJNb2RlRm9yTGluZSA9IGZhbHNlOwogIH0KICAvKioKICAgKiBTYWZlbHkgY29weSBhIHN0YXRlCiAgICoKICAgKiBAcmV0dXJuIHtTdGF0ZX0KICAgKi8KICBTdGF0ZS5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICgpIHsKICAgIHZhciByZXMgPSBuZXcgU3RhdGUoKTsKICAgIHJlcy5qYXZhU2NyaXB0TGluZSA9IHRoaXMuamF2YVNjcmlwdExpbmU7CiAgICByZXMuamF2YVNjcmlwdExpbmVFeGNsdWRlc0NvbG9uID0gdGhpcy5qYXZhU2NyaXB0TGluZUV4Y2x1ZGVzQ29sb247CiAgICByZXMuamF2YVNjcmlwdEFyZ3VtZW50cyA9IHRoaXMuamF2YVNjcmlwdEFyZ3VtZW50czsKICAgIHJlcy5qYXZhU2NyaXB0QXJndW1lbnRzRGVwdGggPSB0aGlzLmphdmFTY3JpcHRBcmd1bWVudHNEZXB0aDsKICAgIHJlcy5pc0ludGVycG9sYXRpbmcgPSB0aGlzLmlzSW50ZXJwb2xhdGluZzsKICAgIHJlcy5pbnRlcnBvbGF0aW9uTmVzdGluZyA9IHRoaXMuaW50cG9sYXRpb25OZXN0aW5nOwoKICAgIHJlcy5qc1N0YXRlID0gQ29kZU1pcnJvci5jb3B5U3RhdGUoanNNb2RlLCB0aGlzLmpzU3RhdGUpOwoKICAgIHJlcy5pbm5lck1vZGUgPSB0aGlzLmlubmVyTW9kZTsKICAgIGlmICh0aGlzLmlubmVyTW9kZSAmJiB0aGlzLmlubmVyU3RhdGUpIHsKICAgICAgcmVzLmlubmVyU3RhdGUgPSBDb2RlTWlycm9yLmNvcHlTdGF0ZSh0aGlzLmlubmVyTW9kZSwgdGhpcy5pbm5lclN0YXRlKTsKICAgIH0KCiAgICByZXMucmVzdE9mTGluZSA9IHRoaXMucmVzdE9mTGluZTsKCiAgICByZXMuaXNJbmNsdWRlRmlsdGVyZWQgPSB0aGlzLmlzSW5jbHVkZUZpbHRlcmVkOwogICAgcmVzLmlzRWFjaCA9IHRoaXMuaXNFYWNoOwogICAgcmVzLmxhc3RUYWcgPSB0aGlzLmxhc3RUYWc7CiAgICByZXMuc2NyaXB0VHlwZSA9IHRoaXMuc2NyaXB0VHlwZTsKICAgIHJlcy5pc0F0dHJzID0gdGhpcy5pc0F0dHJzOwogICAgcmVzLmF0dHJzTmVzdCA9IHRoaXMuYXR0cnNOZXN0LnNsaWNlKCk7CiAgICByZXMuaW5BdHRyaWJ1dGVOYW1lID0gdGhpcy5pbkF0dHJpYnV0ZU5hbWU7CiAgICByZXMuYXR0cmlidXRlSXNUeXBlID0gdGhpcy5hdHRyaWJ1dGVJc1R5cGU7CiAgICByZXMuYXR0clZhbHVlID0gdGhpcy5hdHRyVmFsdWU7CiAgICByZXMuaW5kZW50T2YgPSB0aGlzLmluZGVudE9mOwogICAgcmVzLmluZGVudFRva2VuID0gdGhpcy5pbmRlbnRUb2tlbjsKCiAgICByZXMuaW5uZXJNb2RlRm9yTGluZSA9IHRoaXMuaW5uZXJNb2RlRm9yTGluZTsKCiAgICByZXR1cm4gcmVzOwogIH07CgogIGZ1bmN0aW9uIGphdmFTY3JpcHQoc3RyZWFtLCBzdGF0ZSkgewogICAgaWYgKHN0cmVhbS5zb2woKSkgewogICAgICAvLyBpZiBqYXZhU2NyaXB0TGluZSB3YXMgc2V0IGF0IGVuZCBvZiBsaW5lLCBpZ25vcmUgaXQKICAgICAgc3RhdGUuamF2YVNjcmlwdExpbmUgPSBmYWxzZTsKICAgICAgc3RhdGUuamF2YVNjcmlwdExpbmVFeGNsdWRlc0NvbG9uID0gZmFsc2U7CiAgICB9CiAgICBpZiAoc3RhdGUuamF2YVNjcmlwdExpbmUpIHsKICAgICAgaWYgKHN0YXRlLmphdmFTY3JpcHRMaW5lRXhjbHVkZXNDb2xvbiAmJiBzdHJlYW0ucGVlaygpID09PSAnOicpIHsKICAgICAgICBzdGF0ZS5qYXZhU2NyaXB0TGluZSA9IGZhbHNlOwogICAgICAgIHN0YXRlLmphdmFTY3JpcHRMaW5lRXhjbHVkZXNDb2xvbiA9IGZhbHNlOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB2YXIgdG9rID0ganNNb2RlLnRva2VuKHN0cmVhbSwgc3RhdGUuanNTdGF0ZSk7CiAgICAgIGlmIChzdHJlYW0uZW9sKCkpIHN0YXRlLmphdmFTY3JpcHRMaW5lID0gZmFsc2U7CiAgICAgIHJldHVybiB0b2sgfHwgdHJ1ZTsKICAgIH0KICB9CiAgZnVuY3Rpb24gamF2YVNjcmlwdEFyZ3VtZW50cyhzdHJlYW0sIHN0YXRlKSB7CiAgICBpZiAoc3RhdGUuamF2YVNjcmlwdEFyZ3VtZW50cykgewogICAgICBpZiAoc3RhdGUuamF2YVNjcmlwdEFyZ3VtZW50c0RlcHRoID09PSAwICYmIHN0cmVhbS5wZWVrKCkgIT09ICcoJykgewogICAgICAgIHN0YXRlLmphdmFTY3JpcHRBcmd1bWVudHMgPSBmYWxzZTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgaWYgKHN0cmVhbS5wZWVrKCkgPT09ICcoJykgewogICAgICAgIHN0YXRlLmphdmFTY3JpcHRBcmd1bWVudHNEZXB0aCsrOwogICAgICB9IGVsc2UgaWYgKHN0cmVhbS5wZWVrKCkgPT09ICcpJykgewogICAgICAgIHN0YXRlLmphdmFTY3JpcHRBcmd1bWVudHNEZXB0aC0tOwogICAgICB9CiAgICAgIGlmIChzdGF0ZS5qYXZhU2NyaXB0QXJndW1lbnRzRGVwdGggPT09IDApIHsKICAgICAgICBzdGF0ZS5qYXZhU2NyaXB0QXJndW1lbnRzID0gZmFsc2U7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICB2YXIgdG9rID0ganNNb2RlLnRva2VuKHN0cmVhbSwgc3RhdGUuanNTdGF0ZSk7CiAgICAgIHJldHVybiB0b2sgfHwgdHJ1ZTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHlpZWxkU3RhdGVtZW50KHN0cmVhbSkgewogICAgaWYgKHN0cmVhbS5tYXRjaCgvXnlpZWxkXGIvKSkgewogICAgICAgIHJldHVybiAna2V5d29yZCc7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBkb2N0eXBlKHN0cmVhbSkgewogICAgaWYgKHN0cmVhbS5tYXRjaCgvXig/OmRvY3R5cGUpICooW15cbl0rKT8vKSkgewogICAgICAgIHJldHVybiBET0NUWVBFOwogICAgfQogIH0KCiAgZnVuY3Rpb24gaW50ZXJwb2xhdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICBpZiAoc3RyZWFtLm1hdGNoKCcjeycpKSB7CiAgICAgIHN0YXRlLmlzSW50ZXJwb2xhdGluZyA9IHRydWU7CiAgICAgIHN0YXRlLmludGVycG9sYXRpb25OZXN0aW5nID0gMDsKICAgICAgcmV0dXJuICdwdW5jdHVhdGlvbic7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBpbnRlcnBvbGF0aW9uQ29udGludWVkKHN0cmVhbSwgc3RhdGUpIHsKICAgIGlmIChzdGF0ZS5pc0ludGVycG9sYXRpbmcpIHsKICAgICAgaWYgKHN0cmVhbS5wZWVrKCkgPT09ICd9JykgewogICAgICAgIHN0YXRlLmludGVycG9sYXRpb25OZXN0aW5nLS07CiAgICAgICAgaWYgKHN0YXRlLmludGVycG9sYXRpb25OZXN0aW5nIDwgMCkgewogICAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgICAgIHN0YXRlLmlzSW50ZXJwb2xhdGluZyA9IGZhbHNlOwogICAgICAgICAgcmV0dXJuICdwdW5jdXRhdGlvbic7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKHN0cmVhbS5wZWVrKCkgPT09ICd7JykgewogICAgICAgIHN0YXRlLmludGVycG9sYXRpb25OZXN0aW5nKys7CiAgICAgIH0KICAgICAgcmV0dXJuIGpzTW9kZS50b2tlbihzdHJlYW0sIHN0YXRlLmpzU3RhdGUpIHx8IHRydWU7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBjYXNlU3RhdGVtZW50KHN0cmVhbSwgc3RhdGUpIHsKICAgIGlmIChzdHJlYW0ubWF0Y2goL15jYXNlXGIvKSkgewogICAgICBzdGF0ZS5qYXZhU2NyaXB0TGluZSA9IHRydWU7CiAgICAgIHJldHVybiBLRVlXT1JEOwogICAgfQogIH0KCiAgZnVuY3Rpb24gd2hlbihzdHJlYW0sIHN0YXRlKSB7CiAgICBpZiAoc3RyZWFtLm1hdGNoKC9ed2hlblxiLykpIHsKICAgICAgc3RhdGUuamF2YVNjcmlwdExpbmUgPSB0cnVlOwogICAgICBzdGF0ZS5qYXZhU2NyaXB0TGluZUV4Y2x1ZGVzQ29sb24gPSB0cnVlOwogICAgICByZXR1cm4gS0VZV09SRDsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGRlZmF1bHRTdGF0ZW1lbnQoc3RyZWFtKSB7CiAgICBpZiAoc3RyZWFtLm1hdGNoKC9eZGVmYXVsdFxiLykpIHsKICAgICAgcmV0dXJuIEtFWVdPUkQ7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBleHRlbmRzU3RhdGVtZW50KHN0cmVhbSwgc3RhdGUpIHsKICAgIGlmIChzdHJlYW0ubWF0Y2goL15leHRlbmRzP1xiLykpIHsKICAgICAgc3RhdGUucmVzdE9mTGluZSA9ICdzdHJpbmcnOwogICAgICByZXR1cm4gS0VZV09SRDsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGFwcGVuZChzdHJlYW0sIHN0YXRlKSB7CiAgICBpZiAoc3RyZWFtLm1hdGNoKC9eYXBwZW5kXGIvKSkgewogICAgICBzdGF0ZS5yZXN0T2ZMaW5lID0gJ3ZhcmlhYmxlJzsKICAgICAgcmV0dXJuIEtFWVdPUkQ7CiAgICB9CiAgfQogIGZ1bmN0aW9uIHByZXBlbmQoc3RyZWFtLCBzdGF0ZSkgewogICAgaWYgKHN0cmVhbS5tYXRjaCgvXnByZXBlbmRcYi8pKSB7CiAgICAgIHN0YXRlLnJlc3RPZkxpbmUgPSAndmFyaWFibGUnOwogICAgICByZXR1cm4gS0VZV09SRDsKICAgIH0KICB9CiAgZnVuY3Rpb24gYmxvY2soc3RyZWFtLCBzdGF0ZSkgewogICAgaWYgKHN0cmVhbS5tYXRjaCgvXmJsb2NrXGIgKig/OihwcmVwZW5kfGFwcGVuZClcYik/LykpIHsKICAgICAgc3RhdGUucmVzdE9mTGluZSA9ICd2YXJpYWJsZSc7CiAgICAgIHJldHVybiBLRVlXT1JEOwogICAgfQogIH0KCiAgZnVuY3Rpb24gaW5jbHVkZShzdHJlYW0sIHN0YXRlKSB7CiAgICBpZiAoc3RyZWFtLm1hdGNoKC9eaW5jbHVkZVxiLykpIHsKICAgICAgc3RhdGUucmVzdE9mTGluZSA9ICdzdHJpbmcnOwogICAgICByZXR1cm4gS0VZV09SRDsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGluY2x1ZGVGaWx0ZXJlZChzdHJlYW0sIHN0YXRlKSB7CiAgICBpZiAoc3RyZWFtLm1hdGNoKC9eaW5jbHVkZTooW2EtekEtWjAtOVwtXSspLywgZmFsc2UpICYmIHN0cmVhbS5tYXRjaCgnaW5jbHVkZScpKSB7CiAgICAgIHN0YXRlLmlzSW5jbHVkZUZpbHRlcmVkID0gdHJ1ZTsKICAgICAgcmV0dXJuIEtFWVdPUkQ7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBpbmNsdWRlRmlsdGVyZWRDb250aW51ZWQoc3RyZWFtLCBzdGF0ZSkgewogICAgaWYgKHN0YXRlLmlzSW5jbHVkZUZpbHRlcmVkKSB7CiAgICAgIHZhciB0b2sgPSBmaWx0ZXIoc3RyZWFtLCBzdGF0ZSk7CiAgICAgIHN0YXRlLmlzSW5jbHVkZUZpbHRlcmVkID0gZmFsc2U7CiAgICAgIHN0YXRlLnJlc3RPZkxpbmUgPSAnc3RyaW5nJzsKICAgICAgcmV0dXJuIHRvazsKICAgIH0KICB9CgogIGZ1bmN0aW9uIG1peGluKHN0cmVhbSwgc3RhdGUpIHsKICAgIGlmIChzdHJlYW0ubWF0Y2goL15taXhpblxiLykpIHsKICAgICAgc3RhdGUuamF2YVNjcmlwdExpbmUgPSB0cnVlOwogICAgICByZXR1cm4gS0VZV09SRDsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGNhbGwoc3RyZWFtLCBzdGF0ZSkgewogICAgaWYgKHN0cmVhbS5tYXRjaCgvXlwrKFstXHddKykvKSkgewogICAgICBpZiAoIXN0cmVhbS5tYXRjaCgvXlwoICpbLVx3XSsgKj0vLCBmYWxzZSkpIHsKICAgICAgICBzdGF0ZS5qYXZhU2NyaXB0QXJndW1lbnRzID0gdHJ1ZTsKICAgICAgICBzdGF0ZS5qYXZhU2NyaXB0QXJndW1lbnRzRGVwdGggPSAwOwogICAgICB9CiAgICAgIHJldHVybiAndmFyaWFibGUnOwogICAgfQogICAgaWYgKHN0cmVhbS5tYXRjaCgvXlwrI3svLCBmYWxzZSkpIHsKICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgc3RhdGUubWl4aW5DYWxsQWZ0ZXIgPSB0cnVlOwogICAgICByZXR1cm4gaW50ZXJwb2xhdGlvbihzdHJlYW0sIHN0YXRlKTsKICAgIH0KICB9CiAgZnVuY3Rpb24gY2FsbEFyZ3VtZW50cyhzdHJlYW0sIHN0YXRlKSB7CiAgICBpZiAoc3RhdGUubWl4aW5DYWxsQWZ0ZXIpIHsKICAgICAgc3RhdGUubWl4aW5DYWxsQWZ0ZXIgPSBmYWxzZTsKICAgICAgaWYgKCFzdHJlYW0ubWF0Y2goL15cKCAqWy1cd10rICo9LywgZmFsc2UpKSB7CiAgICAgICAgc3RhdGUuamF2YVNjcmlwdEFyZ3VtZW50cyA9IHRydWU7CiAgICAgICAgc3RhdGUuamF2YVNjcmlwdEFyZ3VtZW50c0RlcHRoID0gMDsKICAgICAgfQogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGNvbmRpdGlvbmFsKHN0cmVhbSwgc3RhdGUpIHsKICAgIGlmIChzdHJlYW0ubWF0Y2goL14oaWZ8dW5sZXNzfGVsc2UgaWZ8ZWxzZSlcYi8pKSB7CiAgICAgIHN0YXRlLmphdmFTY3JpcHRMaW5lID0gdHJ1ZTsKICAgICAgcmV0dXJuIEtFWVdPUkQ7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBlYWNoKHN0cmVhbSwgc3RhdGUpIHsKICAgIGlmIChzdHJlYW0ubWF0Y2goL14oLSAqKT8oZWFjaHxmb3IpXGIvKSkgewogICAgICBzdGF0ZS5pc0VhY2ggPSB0cnVlOwogICAgICByZXR1cm4gS0VZV09SRDsKICAgIH0KICB9CiAgZnVuY3Rpb24gZWFjaENvbnRpbnVlZChzdHJlYW0sIHN0YXRlKSB7CiAgICBpZiAoc3RhdGUuaXNFYWNoKSB7CiAgICAgIGlmIChzdHJlYW0ubWF0Y2goL14gaW5cYi8pKSB7CiAgICAgICAgc3RhdGUuamF2YVNjcmlwdExpbmUgPSB0cnVlOwogICAgICAgIHN0YXRlLmlzRWFjaCA9IGZhbHNlOwogICAgICAgIHJldHVybiBLRVlXT1JEOwogICAgICB9IGVsc2UgaWYgKHN0cmVhbS5zb2woKSB8fCBzdHJlYW0uZW9sKCkpIHsKICAgICAgICBzdGF0ZS5pc0VhY2ggPSBmYWxzZTsKICAgICAgfSBlbHNlIGlmIChzdHJlYW0ubmV4dCgpKSB7CiAgICAgICAgd2hpbGUgKCFzdHJlYW0ubWF0Y2goL14gaW5cYi8sIGZhbHNlKSAmJiBzdHJlYW0ubmV4dCgpKTsKICAgICAgICByZXR1cm4gJ3ZhcmlhYmxlJzsKICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gd2hpbGVTdGF0ZW1lbnQoc3RyZWFtLCBzdGF0ZSkgewogICAgaWYgKHN0cmVhbS5tYXRjaCgvXndoaWxlXGIvKSkgewogICAgICBzdGF0ZS5qYXZhU2NyaXB0TGluZSA9IHRydWU7CiAgICAgIHJldHVybiBLRVlXT1JEOwogICAgfQogIH0KCiAgZnVuY3Rpb24gdGFnKHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBjYXB0dXJlczsKICAgIGlmIChjYXB0dXJlcyA9IHN0cmVhbS5tYXRjaCgvXihcdyg/OlstOlx3XSpcdyk/KVwvPy8pKSB7CiAgICAgIHN0YXRlLmxhc3RUYWcgPSBjYXB0dXJlc1sxXS50b0xvd2VyQ2FzZSgpOwogICAgICBpZiAoc3RhdGUubGFzdFRhZyA9PT0gJ3NjcmlwdCcpIHsKICAgICAgICBzdGF0ZS5zY3JpcHRUeXBlID0gJ2FwcGxpY2F0aW9uL2phdmFzY3JpcHQnOwogICAgICB9CiAgICAgIHJldHVybiAndGFnJzsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGZpbHRlcihzdHJlYW0sIHN0YXRlKSB7CiAgICBpZiAoc3RyZWFtLm1hdGNoKC9eOihbXHdcLV0rKS8pKSB7CiAgICAgIHZhciBpbm5lck1vZGU7CiAgICAgIGlmIChjb25maWcgJiYgY29uZmlnLmlubmVyTW9kZXMpIHsKICAgICAgICBpbm5lck1vZGUgPSBjb25maWcuaW5uZXJNb2RlcyhzdHJlYW0uY3VycmVudCgpLnN1YnN0cmluZygxKSk7CiAgICAgIH0KICAgICAgaWYgKCFpbm5lck1vZGUpIHsKICAgICAgICBpbm5lck1vZGUgPSBzdHJlYW0uY3VycmVudCgpLnN1YnN0cmluZygxKTsKICAgICAgfQogICAgICBpZiAodHlwZW9mIGlubmVyTW9kZSA9PT0gJ3N0cmluZycpIHsKICAgICAgICBpbm5lck1vZGUgPSBDb2RlTWlycm9yLmdldE1vZGUoY29uZmlnLCBpbm5lck1vZGUpOwogICAgICB9CiAgICAgIHNldElubmVyTW9kZShzdHJlYW0sIHN0YXRlLCBpbm5lck1vZGUpOwogICAgICByZXR1cm4gJ2F0b20nOwogICAgfQogIH0KCiAgZnVuY3Rpb24gY29kZShzdHJlYW0sIHN0YXRlKSB7CiAgICBpZiAoc3RyZWFtLm1hdGNoKC9eKCE/PXwtKS8pKSB7CiAgICAgIHN0YXRlLmphdmFTY3JpcHRMaW5lID0gdHJ1ZTsKICAgICAgcmV0dXJuICdwdW5jdHVhdGlvbic7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBpZChzdHJlYW0pIHsKICAgIGlmIChzdHJlYW0ubWF0Y2goL14jKFtcdy1dKykvKSkgewogICAgICByZXR1cm4gSUQ7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBjbGFzc05hbWUoc3RyZWFtKSB7CiAgICBpZiAoc3RyZWFtLm1hdGNoKC9eXC4oW1x3LV0rKS8pKSB7CiAgICAgIHJldHVybiBDTEFTUzsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGF0dHJzKHN0cmVhbSwgc3RhdGUpIHsKICAgIGlmIChzdHJlYW0ucGVlaygpID09ICcoJykgewogICAgICBzdHJlYW0ubmV4dCgpOwogICAgICBzdGF0ZS5pc0F0dHJzID0gdHJ1ZTsKICAgICAgc3RhdGUuYXR0cnNOZXN0ID0gW107CiAgICAgIHN0YXRlLmluQXR0cmlidXRlTmFtZSA9IHRydWU7CiAgICAgIHN0YXRlLmF0dHJWYWx1ZSA9ICcnOwogICAgICBzdGF0ZS5hdHRyaWJ1dGVJc1R5cGUgPSBmYWxzZTsKICAgICAgcmV0dXJuICdwdW5jdHVhdGlvbic7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBhdHRyc0NvbnRpbnVlZChzdHJlYW0sIHN0YXRlKSB7CiAgICBpZiAoc3RhdGUuaXNBdHRycykgewogICAgICBpZiAoQVRUUlNfTkVTVFtzdHJlYW0ucGVlaygpXSkgewogICAgICAgIHN0YXRlLmF0dHJzTmVzdC5wdXNoKEFUVFJTX05FU1Rbc3RyZWFtLnBlZWsoKV0pOwogICAgICB9CiAgICAgIGlmIChzdGF0ZS5hdHRyc05lc3Rbc3RhdGUuYXR0cnNOZXN0Lmxlbmd0aCAtIDFdID09PSBzdHJlYW0ucGVlaygpKSB7CiAgICAgICAgc3RhdGUuYXR0cnNOZXN0LnBvcCgpOwogICAgICB9IGVsc2UgIGlmIChzdHJlYW0uZWF0KCcpJykpIHsKICAgICAgICBzdGF0ZS5pc0F0dHJzID0gZmFsc2U7CiAgICAgICAgcmV0dXJuICdwdW5jdHVhdGlvbic7CiAgICAgIH0KICAgICAgaWYgKHN0YXRlLmluQXR0cmlidXRlTmFtZSAmJiBzdHJlYW0ubWF0Y2goL15bXj0sXCkhXSsvKSkgewogICAgICAgIGlmIChzdHJlYW0ucGVlaygpID09PSAnPScgfHwgc3RyZWFtLnBlZWsoKSA9PT0gJyEnKSB7CiAgICAgICAgICBzdGF0ZS5pbkF0dHJpYnV0ZU5hbWUgPSBmYWxzZTsKICAgICAgICAgIHN0YXRlLmpzU3RhdGUgPSBqc01vZGUuc3RhcnRTdGF0ZSgpOwogICAgICAgICAgaWYgKHN0YXRlLmxhc3RUYWcgPT09ICdzY3JpcHQnICYmIHN0cmVhbS5jdXJyZW50KCkudHJpbSgpLnRvTG93ZXJDYXNlKCkgPT09ICd0eXBlJykgewogICAgICAgICAgICBzdGF0ZS5hdHRyaWJ1dGVJc1R5cGUgPSB0cnVlOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3RhdGUuYXR0cmlidXRlSXNUeXBlID0gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAnYXR0cmlidXRlJzsKICAgICAgfQoKICAgICAgdmFyIHRvayA9IGpzTW9kZS50b2tlbihzdHJlYW0sIHN0YXRlLmpzU3RhdGUpOwogICAgICBpZiAoc3RhdGUuYXR0cmlidXRlSXNUeXBlICYmIHRvayA9PT0gJ3N0cmluZycpIHsKICAgICAgICBzdGF0ZS5zY3JpcHRUeXBlID0gc3RyZWFtLmN1cnJlbnQoKS50b1N0cmluZygpOwogICAgICB9CiAgICAgIGlmIChzdGF0ZS5hdHRyc05lc3QubGVuZ3RoID09PSAwICYmICh0b2sgPT09ICdzdHJpbmcnIHx8IHRvayA9PT0gJ3ZhcmlhYmxlJyB8fCB0b2sgPT09ICdrZXl3b3JkJykpIHsKICAgICAgICB0cnkgewogICAgICAgICAgRnVuY3Rpb24oJycsICd2YXIgeCAnICsgc3RhdGUuYXR0clZhbHVlLnJlcGxhY2UoLyxccyokLywgJycpLnJlcGxhY2UoL14hLywgJycpKTsKICAgICAgICAgIHN0YXRlLmluQXR0cmlidXRlTmFtZSA9IHRydWU7CiAgICAgICAgICBzdGF0ZS5hdHRyVmFsdWUgPSAnJzsKICAgICAgICAgIHN0cmVhbS5iYWNrVXAoc3RyZWFtLmN1cnJlbnQoKS5sZW5ndGgpOwogICAgICAgICAgcmV0dXJuIGF0dHJzQ29udGludWVkKHN0cmVhbSwgc3RhdGUpOwogICAgICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgICAgICAvL25vdCB0aGUgZW5kIG9mIGFuIGF0dHJpYnV0ZQogICAgICAgIH0KICAgICAgfQogICAgICBzdGF0ZS5hdHRyVmFsdWUgKz0gc3RyZWFtLmN1cnJlbnQoKTsKICAgICAgcmV0dXJuIHRvayB8fCB0cnVlOwogICAgfQogIH0KCiAgZnVuY3Rpb24gYXR0cmlidXRlc0Jsb2NrKHN0cmVhbSwgc3RhdGUpIHsKICAgIGlmIChzdHJlYW0ubWF0Y2goL14mYXR0cmlidXRlc1xiLykpIHsKICAgICAgc3RhdGUuamF2YVNjcmlwdEFyZ3VtZW50cyA9IHRydWU7CiAgICAgIHN0YXRlLmphdmFTY3JpcHRBcmd1bWVudHNEZXB0aCA9IDA7CiAgICAgIHJldHVybiAna2V5d29yZCc7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBpbmRlbnQoc3RyZWFtKSB7CiAgICBpZiAoc3RyZWFtLnNvbCgpICYmIHN0cmVhbS5lYXRTcGFjZSgpKSB7CiAgICAgIHJldHVybiAnaW5kZW50JzsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGNvbW1lbnQoc3RyZWFtLCBzdGF0ZSkgewogICAgaWYgKHN0cmVhbS5tYXRjaCgvXiAqXC9cLygtKT8oW15cbl0qKS8pKSB7CiAgICAgIHN0YXRlLmluZGVudE9mID0gc3RyZWFtLmluZGVudGF0aW9uKCk7CiAgICAgIHN0YXRlLmluZGVudFRva2VuID0gJ2NvbW1lbnQnOwogICAgICByZXR1cm4gJ2NvbW1lbnQnOwogICAgfQogIH0KCiAgZnVuY3Rpb24gY29sb24oc3RyZWFtKSB7CiAgICBpZiAoc3RyZWFtLm1hdGNoKC9eOiAqLykpIHsKICAgICAgcmV0dXJuICdjb2xvbic7CiAgICB9CiAgfQoKICBmdW5jdGlvbiB0ZXh0KHN0cmVhbSwgc3RhdGUpIHsKICAgIGlmIChzdHJlYW0ubWF0Y2goL14oPzpcfCA/fCApKFteXG5dKykvKSkgewogICAgICByZXR1cm4gJ3N0cmluZyc7CiAgICB9CiAgICBpZiAoc3RyZWFtLm1hdGNoKC9eKDxbXlxuXSopLywgZmFsc2UpKSB7CiAgICAgIC8vIGh0bWwgc3RyaW5nCiAgICAgIHNldElubmVyTW9kZShzdHJlYW0sIHN0YXRlLCAnaHRtbG1peGVkJyk7CiAgICAgIHN0YXRlLmlubmVyTW9kZUZvckxpbmUgPSB0cnVlOwogICAgICByZXR1cm4gaW5uZXJNb2RlKHN0cmVhbSwgc3RhdGUsIHRydWUpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gZG90KHN0cmVhbSwgc3RhdGUpIHsKICAgIGlmIChzdHJlYW0uZWF0KCcuJykpIHsKICAgICAgdmFyIGlubmVyTW9kZSA9IG51bGw7CiAgICAgIGlmIChzdGF0ZS5sYXN0VGFnID09PSAnc2NyaXB0JyAmJiBzdGF0ZS5zY3JpcHRUeXBlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZignamF2YXNjcmlwdCcpICE9IC0xKSB7CiAgICAgICAgaW5uZXJNb2RlID0gc3RhdGUuc2NyaXB0VHlwZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoLyJ8Jy9nLCAnJyk7CiAgICAgIH0gZWxzZSBpZiAoc3RhdGUubGFzdFRhZyA9PT0gJ3N0eWxlJykgewogICAgICAgIGlubmVyTW9kZSA9ICdjc3MnOwogICAgICB9CiAgICAgIHNldElubmVyTW9kZShzdHJlYW0sIHN0YXRlLCBpbm5lck1vZGUpOwogICAgICByZXR1cm4gJ2RvdCc7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBmYWlsKHN0cmVhbSkgewogICAgc3RyZWFtLm5leHQoKTsKICAgIHJldHVybiBudWxsOwogIH0KCgogIGZ1bmN0aW9uIHNldElubmVyTW9kZShzdHJlYW0sIHN0YXRlLCBtb2RlKSB7CiAgICBtb2RlID0gQ29kZU1pcnJvci5taW1lTW9kZXNbbW9kZV0gfHwgbW9kZTsKICAgIG1vZGUgPSBjb25maWcuaW5uZXJNb2RlcyA/IGNvbmZpZy5pbm5lck1vZGVzKG1vZGUpIHx8IG1vZGUgOiBtb2RlOwogICAgbW9kZSA9IENvZGVNaXJyb3IubWltZU1vZGVzW21vZGVdIHx8IG1vZGU7CiAgICBtb2RlID0gQ29kZU1pcnJvci5nZXRNb2RlKGNvbmZpZywgbW9kZSk7CiAgICBzdGF0ZS5pbmRlbnRPZiA9IHN0cmVhbS5pbmRlbnRhdGlvbigpOwoKICAgIGlmIChtb2RlICYmIG1vZGUubmFtZSAhPT0gJ251bGwnKSB7CiAgICAgIHN0YXRlLmlubmVyTW9kZSA9IG1vZGU7CiAgICB9IGVsc2UgewogICAgICBzdGF0ZS5pbmRlbnRUb2tlbiA9ICdzdHJpbmcnOwogICAgfQogIH0KICBmdW5jdGlvbiBpbm5lck1vZGUoc3RyZWFtLCBzdGF0ZSwgZm9yY2UpIHsKICAgIGlmIChzdHJlYW0uaW5kZW50YXRpb24oKSA+IHN0YXRlLmluZGVudE9mIHx8IChzdGF0ZS5pbm5lck1vZGVGb3JMaW5lICYmICFzdHJlYW0uc29sKCkpIHx8IGZvcmNlKSB7CiAgICAgIGlmIChzdGF0ZS5pbm5lck1vZGUpIHsKICAgICAgICBpZiAoIXN0YXRlLmlubmVyU3RhdGUpIHsKICAgICAgICAgIHN0YXRlLmlubmVyU3RhdGUgPSBzdGF0ZS5pbm5lck1vZGUuc3RhcnRTdGF0ZSA/IHN0YXRlLmlubmVyTW9kZS5zdGFydFN0YXRlKHN0cmVhbS5pbmRlbnRhdGlvbigpKSA6IHt9OwogICAgICAgIH0KICAgICAgICByZXR1cm4gc3RyZWFtLmhpZGVGaXJzdENoYXJzKHN0YXRlLmluZGVudE9mICsgMiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgcmV0dXJuIHN0YXRlLmlubmVyTW9kZS50b2tlbihzdHJlYW0sIHN0YXRlLmlubmVyU3RhdGUpIHx8IHRydWU7CiAgICAgICAgfSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICAgIHJldHVybiBzdGF0ZS5pbmRlbnRUb2tlbjsKICAgICAgfQogICAgfSBlbHNlIGlmIChzdHJlYW0uc29sKCkpIHsKICAgICAgc3RhdGUuaW5kZW50T2YgPSBJbmZpbml0eTsKICAgICAgc3RhdGUuaW5kZW50VG9rZW4gPSBudWxsOwogICAgICBzdGF0ZS5pbm5lck1vZGUgPSBudWxsOwogICAgICBzdGF0ZS5pbm5lclN0YXRlID0gbnVsbDsKICAgIH0KICB9CiAgZnVuY3Rpb24gcmVzdE9mTGluZShzdHJlYW0sIHN0YXRlKSB7CiAgICBpZiAoc3RyZWFtLnNvbCgpKSB7CiAgICAgIC8vIGlmIHJlc3RPZkxpbmUgd2FzIHNldCBhdCBlbmQgb2YgbGluZSwgaWdub3JlIGl0CiAgICAgIHN0YXRlLnJlc3RPZkxpbmUgPSAnJzsKICAgIH0KICAgIGlmIChzdGF0ZS5yZXN0T2ZMaW5lKSB7CiAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgdmFyIHRvayA9IHN0YXRlLnJlc3RPZkxpbmU7CiAgICAgIHN0YXRlLnJlc3RPZkxpbmUgPSAnJzsKICAgICAgcmV0dXJuIHRvazsKICAgIH0KICB9CgoKICBmdW5jdGlvbiBzdGFydFN0YXRlKCkgewogICAgcmV0dXJuIG5ldyBTdGF0ZSgpOwogIH0KICBmdW5jdGlvbiBjb3B5U3RhdGUoc3RhdGUpIHsKICAgIHJldHVybiBzdGF0ZS5jb3B5KCk7CiAgfQogIC8qKgogICAqIEdldCB0aGUgbmV4dCB0b2tlbiBpbiB0aGUgc3RyZWFtCiAgICoKICAgKiBAcGFyYW0ge1N0cmVhbX0gc3RyZWFtCiAgICogQHBhcmFtIHtTdGF0ZX0gc3RhdGUKICAgKi8KICBmdW5jdGlvbiBuZXh0VG9rZW4oc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIHRvayA9IGlubmVyTW9kZShzdHJlYW0sIHN0YXRlKQogICAgICB8fCByZXN0T2ZMaW5lKHN0cmVhbSwgc3RhdGUpCiAgICAgIHx8IGludGVycG9sYXRpb25Db250aW51ZWQoc3RyZWFtLCBzdGF0ZSkKICAgICAgfHwgaW5jbHVkZUZpbHRlcmVkQ29udGludWVkKHN0cmVhbSwgc3RhdGUpCiAgICAgIHx8IGVhY2hDb250aW51ZWQoc3RyZWFtLCBzdGF0ZSkKICAgICAgfHwgYXR0cnNDb250aW51ZWQoc3RyZWFtLCBzdGF0ZSkKICAgICAgfHwgamF2YVNjcmlwdChzdHJlYW0sIHN0YXRlKQogICAgICB8fCBqYXZhU2NyaXB0QXJndW1lbnRzKHN0cmVhbSwgc3RhdGUpCiAgICAgIHx8IGNhbGxBcmd1bWVudHMoc3RyZWFtLCBzdGF0ZSkKCiAgICAgIHx8IHlpZWxkU3RhdGVtZW50KHN0cmVhbSwgc3RhdGUpCiAgICAgIHx8IGRvY3R5cGUoc3RyZWFtLCBzdGF0ZSkKICAgICAgfHwgaW50ZXJwb2xhdGlvbihzdHJlYW0sIHN0YXRlKQogICAgICB8fCBjYXNlU3RhdGVtZW50KHN0cmVhbSwgc3RhdGUpCiAgICAgIHx8IHdoZW4oc3RyZWFtLCBzdGF0ZSkKICAgICAgfHwgZGVmYXVsdFN0YXRlbWVudChzdHJlYW0sIHN0YXRlKQogICAgICB8fCBleHRlbmRzU3RhdGVtZW50KHN0cmVhbSwgc3RhdGUpCiAgICAgIHx8IGFwcGVuZChzdHJlYW0sIHN0YXRlKQogICAgICB8fCBwcmVwZW5kKHN0cmVhbSwgc3RhdGUpCiAgICAgIHx8IGJsb2NrKHN0cmVhbSwgc3RhdGUpCiAgICAgIHx8IGluY2x1ZGUoc3RyZWFtLCBzdGF0ZSkKICAgICAgfHwgaW5jbHVkZUZpbHRlcmVkKHN0cmVhbSwgc3RhdGUpCiAgICAgIHx8IG1peGluKHN0cmVhbSwgc3RhdGUpCiAgICAgIHx8IGNhbGwoc3RyZWFtLCBzdGF0ZSkKICAgICAgfHwgY29uZGl0aW9uYWwoc3RyZWFtLCBzdGF0ZSkKICAgICAgfHwgZWFjaChzdHJlYW0sIHN0YXRlKQogICAgICB8fCB3aGlsZVN0YXRlbWVudChzdHJlYW0sIHN0YXRlKQogICAgICB8fCB0YWcoc3RyZWFtLCBzdGF0ZSkKICAgICAgfHwgZmlsdGVyKHN0cmVhbSwgc3RhdGUpCiAgICAgIHx8IGNvZGUoc3RyZWFtLCBzdGF0ZSkKICAgICAgfHwgaWQoc3RyZWFtLCBzdGF0ZSkKICAgICAgfHwgY2xhc3NOYW1lKHN0cmVhbSwgc3RhdGUpCiAgICAgIHx8IGF0dHJzKHN0cmVhbSwgc3RhdGUpCiAgICAgIHx8IGF0dHJpYnV0ZXNCbG9jayhzdHJlYW0sIHN0YXRlKQogICAgICB8fCBpbmRlbnQoc3RyZWFtLCBzdGF0ZSkKICAgICAgfHwgdGV4dChzdHJlYW0sIHN0YXRlKQogICAgICB8fCBjb21tZW50KHN0cmVhbSwgc3RhdGUpCiAgICAgIHx8IGNvbG9uKHN0cmVhbSwgc3RhdGUpCiAgICAgIHx8IGRvdChzdHJlYW0sIHN0YXRlKQogICAgICB8fCBmYWlsKHN0cmVhbSwgc3RhdGUpOwoKICAgIHJldHVybiB0b2sgPT09IHRydWUgPyBudWxsIDogdG9rOwogIH0KICByZXR1cm4gewogICAgc3RhcnRTdGF0ZTogc3RhcnRTdGF0ZSwKICAgIGNvcHlTdGF0ZTogY29weVN0YXRlLAogICAgdG9rZW46IG5leHRUb2tlbgogIH07Cn0pOwoKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCd0ZXh0L3gtamFkZScsICdqYWRlJyk7Cgp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/javascript/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/javascript/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogSmF2YVNjcmlwdCBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uLy4uL2FkZG9uL2VkaXQvbWF0Y2hicmFja2V0cy5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi8uLi9hZGRvbi9jb21tZW50L2NvbnRpbnVlY29tbWVudC5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi8uLi9hZGRvbi9jb21tZW50L2NvbW1lbnQuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iamF2YXNjcmlwdC5qcyI+PC9zY3JpcHQ+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+LkNvZGVNaXJyb3Ige2JvcmRlci10b3A6IDFweCBzb2xpZCBibGFjazsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO308L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5KYXZhU2NyaXB0PC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5KYXZhU2NyaXB0IG1vZGU8L2gyPgoKCjxkaXY+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KLy8gRGVtbyBjb2RlICh0aGUgYWN0dWFsIG5ldyBwYXJzZXIgY2hhcmFjdGVyIHN0cmVhbSBpbXBsZW1lbnRhdGlvbikKCmZ1bmN0aW9uIFN0cmluZ1N0cmVhbShzdHJpbmcpIHsKICB0aGlzLnBvcyA9IDA7CiAgdGhpcy5zdHJpbmcgPSBzdHJpbmc7Cn0KClN0cmluZ1N0cmVhbS5wcm90b3R5cGUgPSB7CiAgZG9uZTogZnVuY3Rpb24oKSB7cmV0dXJuIHRoaXMucG9zID49IHRoaXMuc3RyaW5nLmxlbmd0aDt9LAogIHBlZWs6IGZ1bmN0aW9uKCkge3JldHVybiB0aGlzLnN0cmluZy5jaGFyQXQodGhpcy5wb3MpO30sCiAgbmV4dDogZnVuY3Rpb24oKSB7CiAgICBpZiAodGhpcy5wb3MgJmx0OyB0aGlzLnN0cmluZy5sZW5ndGgpCiAgICAgIHJldHVybiB0aGlzLnN0cmluZy5jaGFyQXQodGhpcy5wb3MrKyk7CiAgfSwKICBlYXQ6IGZ1bmN0aW9uKG1hdGNoKSB7CiAgICB2YXIgY2ggPSB0aGlzLnN0cmluZy5jaGFyQXQodGhpcy5wb3MpOwogICAgaWYgKHR5cGVvZiBtYXRjaCA9PSAic3RyaW5nIikgdmFyIG9rID0gY2ggPT0gbWF0Y2g7CiAgICBlbHNlIHZhciBvayA9IGNoICZhbXA7JmFtcDsgbWF0Y2gudGVzdCA/IG1hdGNoLnRlc3QoY2gpIDogbWF0Y2goY2gpOwogICAgaWYgKG9rKSB7dGhpcy5wb3MrKzsgcmV0dXJuIGNoO30KICB9LAogIGVhdFdoaWxlOiBmdW5jdGlvbihtYXRjaCkgewogICAgdmFyIHN0YXJ0ID0gdGhpcy5wb3M7CiAgICB3aGlsZSAodGhpcy5lYXQobWF0Y2gpKTsKICAgIGlmICh0aGlzLnBvcyA+IHN0YXJ0KSByZXR1cm4gdGhpcy5zdHJpbmcuc2xpY2Uoc3RhcnQsIHRoaXMucG9zKTsKICB9LAogIGJhY2tVcDogZnVuY3Rpb24obikge3RoaXMucG9zIC09IG47fSwKICBjb2x1bW46IGZ1bmN0aW9uKCkge3JldHVybiB0aGlzLnBvczt9LAogIGVhdFNwYWNlOiBmdW5jdGlvbigpIHsKICAgIHZhciBzdGFydCA9IHRoaXMucG9zOwogICAgd2hpbGUgKC9ccy8udGVzdCh0aGlzLnN0cmluZy5jaGFyQXQodGhpcy5wb3MpKSkgdGhpcy5wb3MrKzsKICAgIHJldHVybiB0aGlzLnBvcyAtIHN0YXJ0OwogIH0sCiAgbWF0Y2g6IGZ1bmN0aW9uKHBhdHRlcm4sIGNvbnN1bWUsIGNhc2VJbnNlbnNpdGl2ZSkgewogICAgaWYgKHR5cGVvZiBwYXR0ZXJuID09ICJzdHJpbmciKSB7CiAgICAgIGZ1bmN0aW9uIGNhc2VkKHN0cikge3JldHVybiBjYXNlSW5zZW5zaXRpdmUgPyBzdHIudG9Mb3dlckNhc2UoKSA6IHN0cjt9CiAgICAgIGlmIChjYXNlZCh0aGlzLnN0cmluZykuaW5kZXhPZihjYXNlZChwYXR0ZXJuKSwgdGhpcy5wb3MpID09IHRoaXMucG9zKSB7CiAgICAgICAgaWYgKGNvbnN1bWUgIT09IGZhbHNlKSB0aGlzLnBvcyArPSBzdHIubGVuZ3RoOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9CiAgICBlbHNlIHsKICAgICAgdmFyIG1hdGNoID0gdGhpcy5zdHJpbmcuc2xpY2UodGhpcy5wb3MpLm1hdGNoKHBhdHRlcm4pOwogICAgICBpZiAobWF0Y2ggJmFtcDsmYW1wOyBjb25zdW1lICE9PSBmYWxzZSkgdGhpcy5wb3MgKz0gbWF0Y2hbMF0ubGVuZ3RoOwogICAgICByZXR1cm4gbWF0Y2g7CiAgICB9CiAgfQp9Owo8L3RleHRhcmVhPjwvZGl2PgoKICAgIDxzY3JpcHQ+CiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICAgICAgbGluZU51bWJlcnM6IHRydWUsCiAgICAgICAgbWF0Y2hCcmFja2V0czogdHJ1ZSwKICAgICAgICBjb250aW51ZUNvbW1lbnRzOiAiRW50ZXIiLAogICAgICAgIGV4dHJhS2V5czogeyJDdHJsLVEiOiAidG9nZ2xlQ29tbWVudCJ9CiAgICAgIH0pOwogICAgPC9zY3JpcHQ+CgogICAgPHA+CiAgICAgIEphdmFTY3JpcHQgbW9kZSBzdXBwb3J0cyBzZXZlcmFsIGNvbmZpZ3VyYXRpb24gb3B0aW9uczoKICAgICAgPHVsPgogICAgICAgIDxsaT48Y29kZT5qc29uPC9jb2RlPiB3aGljaCB3aWxsIHNldCB0aGUgbW9kZSB0byBleHBlY3QgSlNPTgogICAgICAgIGRhdGEgcmF0aGVyIHRoYW4gYSBKYXZhU2NyaXB0IHByb2dyYW0uPC9saT4KICAgICAgICA8bGk+PGNvZGU+anNvbmxkPC9jb2RlPiB3aGljaCB3aWxsIHNldCB0aGUgbW9kZSB0byBleHBlY3QKICAgICAgICA8YSBocmVmPSJodHRwOi8vanNvbi1sZC5vcmciPkpTT04tTEQ8L2E+IGxpbmtlZCBkYXRhIHJhdGhlcgogICAgICAgIHRoYW4gYSBKYXZhU2NyaXB0IHByb2dyYW0gKDxhIGhyZWY9Impzb24tbGQuaHRtbCI+ZGVtbzwvYT4pLjwvbGk+CiAgICAgICAgPGxpPjxjb2RlPnR5cGVzY3JpcHQ8L2NvZGU+IHdoaWNoIHdpbGwgYWN0aXZhdGUgYWRkaXRpb25hbAogICAgICAgIHN5bnRheCBoaWdobGlnaHRpbmcgYW5kIHNvbWUgb3RoZXIgdGhpbmdzIGZvciBUeXBlU2NyaXB0IGNvZGUKICAgICAgICAoPGEgaHJlZj0idHlwZXNjcmlwdC5odG1sIj5kZW1vPC9hPikuPC9saT4KICAgICAgICA8bGk+PGNvZGU+c3RhdGVtZW50SW5kZW50PC9jb2RlPiB3aGljaCAoZ2l2ZW4gYSBudW1iZXIpIHdpbGwKICAgICAgICBkZXRlcm1pbmUgdGhlIGFtb3VudCBvZiBpbmRlbnRhdGlvbiB0byB1c2UgZm9yIHN0YXRlbWVudHMKICAgICAgICBjb250aW51ZWQgb24gYSBuZXcgbGluZS48L2xpPgogICAgICA8L3VsPgogICAgPC9wPgoKICAgIDxwPjxzdHJvbmc+TUlNRSB0eXBlcyBkZWZpbmVkOjwvc3Ryb25nPiA8Y29kZT50ZXh0L2phdmFzY3JpcHQ8L2NvZGU+LCA8Y29kZT5hcHBsaWNhdGlvbi9qc29uPC9jb2RlPiwgPGNvZGU+YXBwbGljYXRpb24vbGQranNvbjwvY29kZT4sIDxjb2RlPnRleHQvdHlwZXNjcmlwdDwvY29kZT4sIDxjb2RlPmFwcGxpY2F0aW9uL3R5cGVzY3JpcHQ8L2NvZGU+LjwvcD4KICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/javascript/javascript.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovLyBUT0RPIGFjdHVhbGx5IHJlY29nbml6ZSBzeW50YXggb2YgVHlwZVNjcmlwdCBjb25zdHJ1Y3RzCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJqYXZhc2NyaXB0IiwgZnVuY3Rpb24oY29uZmlnLCBwYXJzZXJDb25maWcpIHsKICB2YXIgaW5kZW50VW5pdCA9IGNvbmZpZy5pbmRlbnRVbml0OwogIHZhciBzdGF0ZW1lbnRJbmRlbnQgPSBwYXJzZXJDb25maWcuc3RhdGVtZW50SW5kZW50OwogIHZhciBqc29ubGRNb2RlID0gcGFyc2VyQ29uZmlnLmpzb25sZDsKICB2YXIganNvbk1vZGUgPSBwYXJzZXJDb25maWcuanNvbiB8fCBqc29ubGRNb2RlOwogIHZhciBpc1RTID0gcGFyc2VyQ29uZmlnLnR5cGVzY3JpcHQ7CgogIC8vIFRva2VuaXplcgoKICB2YXIga2V5d29yZHMgPSBmdW5jdGlvbigpewogICAgZnVuY3Rpb24ga3codHlwZSkge3JldHVybiB7dHlwZTogdHlwZSwgc3R5bGU6ICJrZXl3b3JkIn07fQogICAgdmFyIEEgPSBrdygia2V5d29yZCBhIiksIEIgPSBrdygia2V5d29yZCBiIiksIEMgPSBrdygia2V5d29yZCBjIik7CiAgICB2YXIgb3BlcmF0b3IgPSBrdygib3BlcmF0b3IiKSwgYXRvbSA9IHt0eXBlOiAiYXRvbSIsIHN0eWxlOiAiYXRvbSJ9OwoKICAgIHZhciBqc0tleXdvcmRzID0gewogICAgICAiaWYiOiBrdygiaWYiKSwgIndoaWxlIjogQSwgIndpdGgiOiBBLCAiZWxzZSI6IEIsICJkbyI6IEIsICJ0cnkiOiBCLCAiZmluYWxseSI6IEIsCiAgICAgICJyZXR1cm4iOiBDLCAiYnJlYWsiOiBDLCAiY29udGludWUiOiBDLCAibmV3IjogQywgImRlbGV0ZSI6IEMsICJ0aHJvdyI6IEMsICJkZWJ1Z2dlciI6IEMsCiAgICAgICJ2YXIiOiBrdygidmFyIiksICJjb25zdCI6IGt3KCJ2YXIiKSwgImxldCI6IGt3KCJ2YXIiKSwKICAgICAgImZ1bmN0aW9uIjoga3coImZ1bmN0aW9uIiksICJjYXRjaCI6IGt3KCJjYXRjaCIpLAogICAgICAiZm9yIjoga3coImZvciIpLCAic3dpdGNoIjoga3coInN3aXRjaCIpLCAiY2FzZSI6IGt3KCJjYXNlIiksICJkZWZhdWx0Ijoga3coImRlZmF1bHQiKSwKICAgICAgImluIjogb3BlcmF0b3IsICJ0eXBlb2YiOiBvcGVyYXRvciwgImluc3RhbmNlb2YiOiBvcGVyYXRvciwKICAgICAgInRydWUiOiBhdG9tLCAiZmFsc2UiOiBhdG9tLCAibnVsbCI6IGF0b20sICJ1bmRlZmluZWQiOiBhdG9tLCAiTmFOIjogYXRvbSwgIkluZmluaXR5IjogYXRvbSwKICAgICAgInRoaXMiOiBrdygidGhpcyIpLCAibW9kdWxlIjoga3coIm1vZHVsZSIpLCAiY2xhc3MiOiBrdygiY2xhc3MiKSwgInN1cGVyIjoga3coImF0b20iKSwKICAgICAgInlpZWxkIjogQywgImV4cG9ydCI6IGt3KCJleHBvcnQiKSwgImltcG9ydCI6IGt3KCJpbXBvcnQiKSwgImV4dGVuZHMiOiBDCiAgICB9OwoKICAgIC8vIEV4dGVuZCB0aGUgJ25vcm1hbCcga2V5d29yZHMgd2l0aCB0aGUgVHlwZVNjcmlwdCBsYW5ndWFnZSBleHRlbnNpb25zCiAgICBpZiAoaXNUUykgewogICAgICB2YXIgdHlwZSA9IHt0eXBlOiAidmFyaWFibGUiLCBzdHlsZTogInZhcmlhYmxlLTMifTsKICAgICAgdmFyIHRzS2V5d29yZHMgPSB7CiAgICAgICAgLy8gb2JqZWN0LWxpa2UgdGhpbmdzCiAgICAgICAgImludGVyZmFjZSI6IGt3KCJpbnRlcmZhY2UiKSwKICAgICAgICAiZXh0ZW5kcyI6IGt3KCJleHRlbmRzIiksCiAgICAgICAgImNvbnN0cnVjdG9yIjoga3coImNvbnN0cnVjdG9yIiksCgogICAgICAgIC8vIHNjb3BlIG1vZGlmaWVycwogICAgICAgICJwdWJsaWMiOiBrdygicHVibGljIiksCiAgICAgICAgInByaXZhdGUiOiBrdygicHJpdmF0ZSIpLAogICAgICAgICJwcm90ZWN0ZWQiOiBrdygicHJvdGVjdGVkIiksCiAgICAgICAgInN0YXRpYyI6IGt3KCJzdGF0aWMiKSwKCiAgICAgICAgLy8gdHlwZXMKICAgICAgICAic3RyaW5nIjogdHlwZSwgIm51bWJlciI6IHR5cGUsICJib29sIjogdHlwZSwgImFueSI6IHR5cGUKICAgICAgfTsKCiAgICAgIGZvciAodmFyIGF0dHIgaW4gdHNLZXl3b3JkcykgewogICAgICAgIGpzS2V5d29yZHNbYXR0cl0gPSB0c0tleXdvcmRzW2F0dHJdOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIGpzS2V5d29yZHM7CiAgfSgpOwoKICB2YXIgaXNPcGVyYXRvckNoYXIgPSAvWytcLSomJT08PiE/fH5eXS87CiAgdmFyIGlzSnNvbmxkS2V5d29yZCA9IC9eQChjb250ZXh0fGlkfHZhbHVlfGxhbmd1YWdlfHR5cGV8Y29udGFpbmVyfGxpc3R8c2V0fHJldmVyc2V8aW5kZXh8YmFzZXx2b2NhYnxncmFwaCkiLzsKCiAgZnVuY3Rpb24gcmVhZFJlZ2V4cChzdHJlYW0pIHsKICAgIHZhciBlc2NhcGVkID0gZmFsc2UsIG5leHQsIGluU2V0ID0gZmFsc2U7CiAgICB3aGlsZSAoKG5leHQgPSBzdHJlYW0ubmV4dCgpKSAhPSBudWxsKSB7CiAgICAgIGlmICghZXNjYXBlZCkgewogICAgICAgIGlmIChuZXh0ID09ICIvIiAmJiAhaW5TZXQpIHJldHVybjsKICAgICAgICBpZiAobmV4dCA9PSAiWyIpIGluU2V0ID0gdHJ1ZTsKICAgICAgICBlbHNlIGlmIChpblNldCAmJiBuZXh0ID09ICJdIikgaW5TZXQgPSBmYWxzZTsKICAgICAgfQogICAgICBlc2NhcGVkID0gIWVzY2FwZWQgJiYgbmV4dCA9PSAiXFwiOwogICAgfQogIH0KCiAgLy8gVXNlZCBhcyBzY3JhdGNoIHZhcmlhYmxlcyB0byBjb21tdW5pY2F0ZSBtdWx0aXBsZSB2YWx1ZXMgd2l0aG91dAogIC8vIGNvbnNpbmcgdXAgdG9ucyBvZiBvYmplY3RzLgogIHZhciB0eXBlLCBjb250ZW50OwogIGZ1bmN0aW9uIHJldCh0cCwgc3R5bGUsIGNvbnQpIHsKICAgIHR5cGUgPSB0cDsgY29udGVudCA9IGNvbnQ7CiAgICByZXR1cm4gc3R5bGU7CiAgfQogIGZ1bmN0aW9uIHRva2VuQmFzZShzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpOwogICAgaWYgKGNoID09ICciJyB8fCBjaCA9PSAiJyIpIHsKICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlblN0cmluZyhjaCk7CiAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgIH0gZWxzZSBpZiAoY2ggPT0gIi4iICYmIHN0cmVhbS5tYXRjaCgvXlxkKyg/OltlRV1bK1wtXT9cZCspPy8pKSB7CiAgICAgIHJldHVybiByZXQoIm51bWJlciIsICJudW1iZXIiKTsKICAgIH0gZWxzZSBpZiAoY2ggPT0gIi4iICYmIHN0cmVhbS5tYXRjaCgiLi4iKSkgewogICAgICByZXR1cm4gcmV0KCJzcHJlYWQiLCAibWV0YSIpOwogICAgfSBlbHNlIGlmICgvW1xbXF17fVwoXCksO1w6XC5dLy50ZXN0KGNoKSkgewogICAgICByZXR1cm4gcmV0KGNoKTsKICAgIH0gZWxzZSBpZiAoY2ggPT0gIj0iICYmIHN0cmVhbS5lYXQoIj4iKSkgewogICAgICByZXR1cm4gcmV0KCI9PiIsICJvcGVyYXRvciIpOwogICAgfSBlbHNlIGlmIChjaCA9PSAiMCIgJiYgc3RyZWFtLmVhdCgveC9pKSkgewogICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcZGEtZl0vaSk7CiAgICAgIHJldHVybiByZXQoIm51bWJlciIsICJudW1iZXIiKTsKICAgIH0gZWxzZSBpZiAoL1xkLy50ZXN0KGNoKSkgewogICAgICBzdHJlYW0ubWF0Y2goL15cZCooPzpcLlxkKik/KD86W2VFXVsrXC1dP1xkKyk/Lyk7CiAgICAgIHJldHVybiByZXQoIm51bWJlciIsICJudW1iZXIiKTsKICAgIH0gZWxzZSBpZiAoY2ggPT0gIi8iKSB7CiAgICAgIGlmIChzdHJlYW0uZWF0KCIqIikpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQ29tbWVudDsKICAgICAgICByZXR1cm4gdG9rZW5Db21tZW50KHN0cmVhbSwgc3RhdGUpOwogICAgICB9IGVsc2UgaWYgKHN0cmVhbS5lYXQoIi8iKSkgewogICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgICByZXR1cm4gcmV0KCJjb21tZW50IiwgImNvbW1lbnQiKTsKICAgICAgfSBlbHNlIGlmIChzdGF0ZS5sYXN0VHlwZSA9PSAib3BlcmF0b3IiIHx8IHN0YXRlLmxhc3RUeXBlID09ICJrZXl3b3JkIGMiIHx8CiAgICAgICAgICAgICAgIHN0YXRlLmxhc3RUeXBlID09ICJzb2YiIHx8IC9eW1xbe31cKCw7Ol0kLy50ZXN0KHN0YXRlLmxhc3RUeXBlKSkgewogICAgICAgIHJlYWRSZWdleHAoc3RyZWFtKTsKICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1tnaW15XS8pOyAvLyAneScgaXMgInN0aWNreSIgb3B0aW9uIGluIE1vemlsbGEKICAgICAgICByZXR1cm4gcmV0KCJyZWdleHAiLCAic3RyaW5nLTIiKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzdHJlYW0uZWF0V2hpbGUoaXNPcGVyYXRvckNoYXIpOwogICAgICAgIHJldHVybiByZXQoIm9wZXJhdG9yIiwgIm9wZXJhdG9yIiwgc3RyZWFtLmN1cnJlbnQoKSk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoY2ggPT0gImAiKSB7CiAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5RdWFzaTsKICAgICAgcmV0dXJuIHRva2VuUXVhc2koc3RyZWFtLCBzdGF0ZSk7CiAgICB9IGVsc2UgaWYgKGNoID09ICIjIikgewogICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICAgIHJldHVybiByZXQoImVycm9yIiwgImVycm9yIik7CiAgICB9IGVsc2UgaWYgKGlzT3BlcmF0b3JDaGFyLnRlc3QoY2gpKSB7CiAgICAgIHN0cmVhbS5lYXRXaGlsZShpc09wZXJhdG9yQ2hhcik7CiAgICAgIHJldHVybiByZXQoIm9wZXJhdG9yIiwgIm9wZXJhdG9yIiwgc3RyZWFtLmN1cnJlbnQoKSk7CiAgICB9IGVsc2UgewogICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcd1wkX10vKTsKICAgICAgdmFyIHdvcmQgPSBzdHJlYW0uY3VycmVudCgpLCBrbm93biA9IGtleXdvcmRzLnByb3BlcnR5SXNFbnVtZXJhYmxlKHdvcmQpICYmIGtleXdvcmRzW3dvcmRdOwogICAgICByZXR1cm4gKGtub3duICYmIHN0YXRlLmxhc3RUeXBlICE9ICIuIikgPyByZXQoa25vd24udHlwZSwga25vd24uc3R5bGUsIHdvcmQpIDoKICAgICAgICAgICAgICAgICAgICAgcmV0KCJ2YXJpYWJsZSIsICJ2YXJpYWJsZSIsIHdvcmQpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gdG9rZW5TdHJpbmcocXVvdGUpIHsKICAgIHJldHVybiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHZhciBlc2NhcGVkID0gZmFsc2UsIG5leHQ7CiAgICAgIGlmIChqc29ubGRNb2RlICYmIHN0cmVhbS5wZWVrKCkgPT0gIkAiICYmIHN0cmVhbS5tYXRjaChpc0pzb25sZEtleXdvcmQpKXsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTsKICAgICAgICByZXR1cm4gcmV0KCJqc29ubGQta2V5d29yZCIsICJtZXRhIik7CiAgICAgIH0KICAgICAgd2hpbGUgKChuZXh0ID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkgewogICAgICAgIGlmIChuZXh0ID09IHF1b3RlICYmICFlc2NhcGVkKSBicmVhazsKICAgICAgICBlc2NhcGVkID0gIWVzY2FwZWQgJiYgbmV4dCA9PSAiXFwiOwogICAgICB9CiAgICAgIGlmICghZXNjYXBlZCkgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICAgIHJldHVybiByZXQoInN0cmluZyIsICJzdHJpbmciKTsKICAgIH07CiAgfQoKICBmdW5jdGlvbiB0b2tlbkNvbW1lbnQoc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIG1heWJlRW5kID0gZmFsc2UsIGNoOwogICAgd2hpbGUgKGNoID0gc3RyZWFtLm5leHQoKSkgewogICAgICBpZiAoY2ggPT0gIi8iICYmIG1heWJlRW5kKSB7CiAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgbWF5YmVFbmQgPSAoY2ggPT0gIioiKTsKICAgIH0KICAgIHJldHVybiByZXQoImNvbW1lbnQiLCAiY29tbWVudCIpOwogIH0KCiAgZnVuY3Rpb24gdG9rZW5RdWFzaShzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgZXNjYXBlZCA9IGZhbHNlLCBuZXh0OwogICAgd2hpbGUgKChuZXh0ID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkgewogICAgICBpZiAoIWVzY2FwZWQgJiYgKG5leHQgPT0gImAiIHx8IG5leHQgPT0gIiQiICYmIHN0cmVhbS5lYXQoInsiKSkpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBlc2NhcGVkID0gIWVzY2FwZWQgJiYgbmV4dCA9PSAiXFwiOwogICAgfQogICAgcmV0dXJuIHJldCgicXVhc2kiLCAic3RyaW5nLTIiLCBzdHJlYW0uY3VycmVudCgpKTsKICB9CgogIHZhciBicmFja2V0cyA9ICIoW3t9XSkiOwogIC8vIFRoaXMgaXMgYSBjcnVkZSBsb29rYWhlYWQgdHJpY2sgdG8gdHJ5IGFuZCBub3RpY2UgdGhhdCB3ZSdyZQogIC8vIHBhcnNpbmcgdGhlIGFyZ3VtZW50IHBhdHRlcm5zIGZvciBhIGZhdC1hcnJvdyBmdW5jdGlvbiBiZWZvcmUgd2UKICAvLyBhY3R1YWxseSBoaXQgdGhlIGFycm93IHRva2VuLiBJdCBvbmx5IHdvcmtzIGlmIHRoZSBhcnJvdyBpcyBvbgogIC8vIHRoZSBzYW1lIGxpbmUgYXMgdGhlIGFyZ3VtZW50cyBhbmQgdGhlcmUncyBubyBzdHJhbmdlIG5vaXNlCiAgLy8gKGNvbW1lbnRzKSBpbiBiZXR3ZWVuLiBGYWxsYmFjayBpcyB0byBvbmx5IG5vdGljZSB3aGVuIHdlIGhpdCB0aGUKICAvLyBhcnJvdywgYW5kIG5vdCBkZWNsYXJlIHRoZSBhcmd1bWVudHMgYXMgbG9jYWxzIGZvciB0aGUgYXJyb3cKICAvLyBib2R5LgogIGZ1bmN0aW9uIGZpbmRGYXRBcnJvdyhzdHJlYW0sIHN0YXRlKSB7CiAgICBpZiAoc3RhdGUuZmF0QXJyb3dBdCkgc3RhdGUuZmF0QXJyb3dBdCA9IG51bGw7CiAgICB2YXIgYXJyb3cgPSBzdHJlYW0uc3RyaW5nLmluZGV4T2YoIj0+Iiwgc3RyZWFtLnN0YXJ0KTsKICAgIGlmIChhcnJvdyA8IDApIHJldHVybjsKCiAgICB2YXIgZGVwdGggPSAwLCBzYXdTb21ldGhpbmcgPSBmYWxzZTsKICAgIGZvciAodmFyIHBvcyA9IGFycm93IC0gMTsgcG9zID49IDA7IC0tcG9zKSB7CiAgICAgIHZhciBjaCA9IHN0cmVhbS5zdHJpbmcuY2hhckF0KHBvcyk7CiAgICAgIHZhciBicmFja2V0ID0gYnJhY2tldHMuaW5kZXhPZihjaCk7CiAgICAgIGlmIChicmFja2V0ID49IDAgJiYgYnJhY2tldCA8IDMpIHsKICAgICAgICBpZiAoIWRlcHRoKSB7ICsrcG9zOyBicmVhazsgfQogICAgICAgIGlmICgtLWRlcHRoID09IDApIGJyZWFrOwogICAgICB9IGVsc2UgaWYgKGJyYWNrZXQgPj0gMyAmJiBicmFja2V0IDwgNikgewogICAgICAgICsrZGVwdGg7CiAgICAgIH0gZWxzZSBpZiAoL1skXHddLy50ZXN0KGNoKSkgewogICAgICAgIHNhd1NvbWV0aGluZyA9IHRydWU7CiAgICAgIH0gZWxzZSBpZiAoc2F3U29tZXRoaW5nICYmICFkZXB0aCkgewogICAgICAgICsrcG9zOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICBpZiAoc2F3U29tZXRoaW5nICYmICFkZXB0aCkgc3RhdGUuZmF0QXJyb3dBdCA9IHBvczsKICB9CgogIC8vIFBhcnNlcgoKICB2YXIgYXRvbWljVHlwZXMgPSB7ImF0b20iOiB0cnVlLCAibnVtYmVyIjogdHJ1ZSwgInZhcmlhYmxlIjogdHJ1ZSwgInN0cmluZyI6IHRydWUsICJyZWdleHAiOiB0cnVlLCAidGhpcyI6IHRydWUsICJqc29ubGQta2V5d29yZCI6IHRydWV9OwoKICBmdW5jdGlvbiBKU0xleGljYWwoaW5kZW50ZWQsIGNvbHVtbiwgdHlwZSwgYWxpZ24sIHByZXYsIGluZm8pIHsKICAgIHRoaXMuaW5kZW50ZWQgPSBpbmRlbnRlZDsKICAgIHRoaXMuY29sdW1uID0gY29sdW1uOwogICAgdGhpcy50eXBlID0gdHlwZTsKICAgIHRoaXMucHJldiA9IHByZXY7CiAgICB0aGlzLmluZm8gPSBpbmZvOwogICAgaWYgKGFsaWduICE9IG51bGwpIHRoaXMuYWxpZ24gPSBhbGlnbjsKICB9CgogIGZ1bmN0aW9uIGluU2NvcGUoc3RhdGUsIHZhcm5hbWUpIHsKICAgIGZvciAodmFyIHYgPSBzdGF0ZS5sb2NhbFZhcnM7IHY7IHYgPSB2Lm5leHQpCiAgICAgIGlmICh2Lm5hbWUgPT0gdmFybmFtZSkgcmV0dXJuIHRydWU7CiAgICBmb3IgKHZhciBjeCA9IHN0YXRlLmNvbnRleHQ7IGN4OyBjeCA9IGN4LnByZXYpIHsKICAgICAgZm9yICh2YXIgdiA9IGN4LnZhcnM7IHY7IHYgPSB2Lm5leHQpCiAgICAgICAgaWYgKHYubmFtZSA9PSB2YXJuYW1lKSByZXR1cm4gdHJ1ZTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHBhcnNlSlMoc3RhdGUsIHN0eWxlLCB0eXBlLCBjb250ZW50LCBzdHJlYW0pIHsKICAgIHZhciBjYyA9IHN0YXRlLmNjOwogICAgLy8gQ29tbXVuaWNhdGUgb3VyIGNvbnRleHQgdG8gdGhlIGNvbWJpbmF0b3JzLgogICAgLy8gKExlc3Mgd2FzdGVmdWwgdGhhbiBjb25zaW5nIHVwIGEgaHVuZHJlZCBjbG9zdXJlcyBvbiBldmVyeSBjYWxsLikKICAgIGN4LnN0YXRlID0gc3RhdGU7IGN4LnN0cmVhbSA9IHN0cmVhbTsgY3gubWFya2VkID0gbnVsbCwgY3guY2MgPSBjYzsgY3guc3R5bGUgPSBzdHlsZTsKCiAgICBpZiAoIXN0YXRlLmxleGljYWwuaGFzT3duUHJvcGVydHkoImFsaWduIikpCiAgICAgIHN0YXRlLmxleGljYWwuYWxpZ24gPSB0cnVlOwoKICAgIHdoaWxlKHRydWUpIHsKICAgICAgdmFyIGNvbWJpbmF0b3IgPSBjYy5sZW5ndGggPyBjYy5wb3AoKSA6IGpzb25Nb2RlID8gZXhwcmVzc2lvbiA6IHN0YXRlbWVudDsKICAgICAgaWYgKGNvbWJpbmF0b3IodHlwZSwgY29udGVudCkpIHsKICAgICAgICB3aGlsZShjYy5sZW5ndGggJiYgY2NbY2MubGVuZ3RoIC0gMV0ubGV4KQogICAgICAgICAgY2MucG9wKCkoKTsKICAgICAgICBpZiAoY3gubWFya2VkKSByZXR1cm4gY3gubWFya2VkOwogICAgICAgIGlmICh0eXBlID09ICJ2YXJpYWJsZSIgJiYgaW5TY29wZShzdGF0ZSwgY29udGVudCkpIHJldHVybiAidmFyaWFibGUtMiI7CiAgICAgICAgcmV0dXJuIHN0eWxlOwogICAgICB9CiAgICB9CiAgfQoKICAvLyBDb21iaW5hdG9yIHV0aWxzCgogIHZhciBjeCA9IHtzdGF0ZTogbnVsbCwgY29sdW1uOiBudWxsLCBtYXJrZWQ6IG51bGwsIGNjOiBudWxsfTsKICBmdW5jdGlvbiBwYXNzKCkgewogICAgZm9yICh2YXIgaSA9IGFyZ3VtZW50cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgY3guY2MucHVzaChhcmd1bWVudHNbaV0pOwogIH0KICBmdW5jdGlvbiBjb250KCkgewogICAgcGFzcy5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgcmV0dXJuIHRydWU7CiAgfQogIGZ1bmN0aW9uIHJlZ2lzdGVyKHZhcm5hbWUpIHsKICAgIGZ1bmN0aW9uIGluTGlzdChsaXN0KSB7CiAgICAgIGZvciAodmFyIHYgPSBsaXN0OyB2OyB2ID0gdi5uZXh0KQogICAgICAgIGlmICh2Lm5hbWUgPT0gdmFybmFtZSkgcmV0dXJuIHRydWU7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIHZhciBzdGF0ZSA9IGN4LnN0YXRlOwogICAgaWYgKHN0YXRlLmNvbnRleHQpIHsKICAgICAgY3gubWFya2VkID0gImRlZiI7CiAgICAgIGlmIChpbkxpc3Qoc3RhdGUubG9jYWxWYXJzKSkgcmV0dXJuOwogICAgICBzdGF0ZS5sb2NhbFZhcnMgPSB7bmFtZTogdmFybmFtZSwgbmV4dDogc3RhdGUubG9jYWxWYXJzfTsKICAgIH0gZWxzZSB7CiAgICAgIGlmIChpbkxpc3Qoc3RhdGUuZ2xvYmFsVmFycykpIHJldHVybjsKICAgICAgaWYgKHBhcnNlckNvbmZpZy5nbG9iYWxWYXJzKQogICAgICAgIHN0YXRlLmdsb2JhbFZhcnMgPSB7bmFtZTogdmFybmFtZSwgbmV4dDogc3RhdGUuZ2xvYmFsVmFyc307CiAgICB9CiAgfQoKICAvLyBDb21iaW5hdG9ycwoKICB2YXIgZGVmYXVsdFZhcnMgPSB7bmFtZTogInRoaXMiLCBuZXh0OiB7bmFtZTogImFyZ3VtZW50cyJ9fTsKICBmdW5jdGlvbiBwdXNoY29udGV4dCgpIHsKICAgIGN4LnN0YXRlLmNvbnRleHQgPSB7cHJldjogY3guc3RhdGUuY29udGV4dCwgdmFyczogY3guc3RhdGUubG9jYWxWYXJzfTsKICAgIGN4LnN0YXRlLmxvY2FsVmFycyA9IGRlZmF1bHRWYXJzOwogIH0KICBmdW5jdGlvbiBwb3Bjb250ZXh0KCkgewogICAgY3guc3RhdGUubG9jYWxWYXJzID0gY3guc3RhdGUuY29udGV4dC52YXJzOwogICAgY3guc3RhdGUuY29udGV4dCA9IGN4LnN0YXRlLmNvbnRleHQucHJldjsKICB9CiAgZnVuY3Rpb24gcHVzaGxleCh0eXBlLCBpbmZvKSB7CiAgICB2YXIgcmVzdWx0ID0gZnVuY3Rpb24oKSB7CiAgICAgIHZhciBzdGF0ZSA9IGN4LnN0YXRlLCBpbmRlbnQgPSBzdGF0ZS5pbmRlbnRlZDsKICAgICAgaWYgKHN0YXRlLmxleGljYWwudHlwZSA9PSAic3RhdCIpIGluZGVudCA9IHN0YXRlLmxleGljYWwuaW5kZW50ZWQ7CiAgICAgIGVsc2UgZm9yICh2YXIgb3V0ZXIgPSBzdGF0ZS5sZXhpY2FsOyBvdXRlciAmJiBvdXRlci50eXBlID09ICIpIiAmJiBvdXRlci5hbGlnbjsgb3V0ZXIgPSBvdXRlci5wcmV2KQogICAgICAgIGluZGVudCA9IG91dGVyLmluZGVudGVkOwogICAgICBzdGF0ZS5sZXhpY2FsID0gbmV3IEpTTGV4aWNhbChpbmRlbnQsIGN4LnN0cmVhbS5jb2x1bW4oKSwgdHlwZSwgbnVsbCwgc3RhdGUubGV4aWNhbCwgaW5mbyk7CiAgICB9OwogICAgcmVzdWx0LmxleCA9IHRydWU7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KICBmdW5jdGlvbiBwb3BsZXgoKSB7CiAgICB2YXIgc3RhdGUgPSBjeC5zdGF0ZTsKICAgIGlmIChzdGF0ZS5sZXhpY2FsLnByZXYpIHsKICAgICAgaWYgKHN0YXRlLmxleGljYWwudHlwZSA9PSAiKSIpCiAgICAgICAgc3RhdGUuaW5kZW50ZWQgPSBzdGF0ZS5sZXhpY2FsLmluZGVudGVkOwogICAgICBzdGF0ZS5sZXhpY2FsID0gc3RhdGUubGV4aWNhbC5wcmV2OwogICAgfQogIH0KICBwb3BsZXgubGV4ID0gdHJ1ZTsKCiAgZnVuY3Rpb24gZXhwZWN0KHdhbnRlZCkgewogICAgZnVuY3Rpb24gZXhwKHR5cGUpIHsKICAgICAgaWYgKHR5cGUgPT0gd2FudGVkKSByZXR1cm4gY29udCgpOwogICAgICBlbHNlIGlmICh3YW50ZWQgPT0gIjsiKSByZXR1cm4gcGFzcygpOwogICAgICBlbHNlIHJldHVybiBjb250KGV4cCk7CiAgICB9OwogICAgcmV0dXJuIGV4cDsKICB9CgogIGZ1bmN0aW9uIHN0YXRlbWVudCh0eXBlLCB2YWx1ZSkgewogICAgaWYgKHR5cGUgPT0gInZhciIpIHJldHVybiBjb250KHB1c2hsZXgoInZhcmRlZiIsIHZhbHVlLmxlbmd0aCksIHZhcmRlZiwgZXhwZWN0KCI7IiksIHBvcGxleCk7CiAgICBpZiAodHlwZSA9PSAia2V5d29yZCBhIikgcmV0dXJuIGNvbnQocHVzaGxleCgiZm9ybSIpLCBleHByZXNzaW9uLCBzdGF0ZW1lbnQsIHBvcGxleCk7CiAgICBpZiAodHlwZSA9PSAia2V5d29yZCBiIikgcmV0dXJuIGNvbnQocHVzaGxleCgiZm9ybSIpLCBzdGF0ZW1lbnQsIHBvcGxleCk7CiAgICBpZiAodHlwZSA9PSAieyIpIHJldHVybiBjb250KHB1c2hsZXgoIn0iKSwgYmxvY2ssIHBvcGxleCk7CiAgICBpZiAodHlwZSA9PSAiOyIpIHJldHVybiBjb250KCk7CiAgICBpZiAodHlwZSA9PSAiaWYiKSB7CiAgICAgIGlmIChjeC5zdGF0ZS5sZXhpY2FsLmluZm8gPT0gImVsc2UiICYmIGN4LnN0YXRlLmNjW2N4LnN0YXRlLmNjLmxlbmd0aCAtIDFdID09IHBvcGxleCkKICAgICAgICBjeC5zdGF0ZS5jYy5wb3AoKSgpOwogICAgICByZXR1cm4gY29udChwdXNobGV4KCJmb3JtIiksIGV4cHJlc3Npb24sIHN0YXRlbWVudCwgcG9wbGV4LCBtYXliZWVsc2UpOwogICAgfQogICAgaWYgKHR5cGUgPT0gImZ1bmN0aW9uIikgcmV0dXJuIGNvbnQoZnVuY3Rpb25kZWYpOwogICAgaWYgKHR5cGUgPT0gImZvciIpIHJldHVybiBjb250KHB1c2hsZXgoImZvcm0iKSwgZm9yc3BlYywgc3RhdGVtZW50LCBwb3BsZXgpOwogICAgaWYgKHR5cGUgPT0gInZhcmlhYmxlIikgcmV0dXJuIGNvbnQocHVzaGxleCgic3RhdCIpLCBtYXliZWxhYmVsKTsKICAgIGlmICh0eXBlID09ICJzd2l0Y2giKSByZXR1cm4gY29udChwdXNobGV4KCJmb3JtIiksIGV4cHJlc3Npb24sIHB1c2hsZXgoIn0iLCAic3dpdGNoIiksIGV4cGVjdCgieyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrLCBwb3BsZXgsIHBvcGxleCk7CiAgICBpZiAodHlwZSA9PSAiY2FzZSIpIHJldHVybiBjb250KGV4cHJlc3Npb24sIGV4cGVjdCgiOiIpKTsKICAgIGlmICh0eXBlID09ICJkZWZhdWx0IikgcmV0dXJuIGNvbnQoZXhwZWN0KCI6IikpOwogICAgaWYgKHR5cGUgPT0gImNhdGNoIikgcmV0dXJuIGNvbnQocHVzaGxleCgiZm9ybSIpLCBwdXNoY29udGV4dCwgZXhwZWN0KCIoIiksIGZ1bmFyZywgZXhwZWN0KCIpIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQsIHBvcGxleCwgcG9wY29udGV4dCk7CiAgICBpZiAodHlwZSA9PSAibW9kdWxlIikgcmV0dXJuIGNvbnQocHVzaGxleCgiZm9ybSIpLCBwdXNoY29udGV4dCwgYWZ0ZXJNb2R1bGUsIHBvcGNvbnRleHQsIHBvcGxleCk7CiAgICBpZiAodHlwZSA9PSAiY2xhc3MiKSByZXR1cm4gY29udChwdXNobGV4KCJmb3JtIiksIGNsYXNzTmFtZSwgcG9wbGV4KTsKICAgIGlmICh0eXBlID09ICJleHBvcnQiKSByZXR1cm4gY29udChwdXNobGV4KCJmb3JtIiksIGFmdGVyRXhwb3J0LCBwb3BsZXgpOwogICAgaWYgKHR5cGUgPT0gImltcG9ydCIpIHJldHVybiBjb250KHB1c2hsZXgoImZvcm0iKSwgYWZ0ZXJJbXBvcnQsIHBvcGxleCk7CiAgICByZXR1cm4gcGFzcyhwdXNobGV4KCJzdGF0IiksIGV4cHJlc3Npb24sIGV4cGVjdCgiOyIpLCBwb3BsZXgpOwogIH0KICBmdW5jdGlvbiBleHByZXNzaW9uKHR5cGUpIHsKICAgIHJldHVybiBleHByZXNzaW9uSW5uZXIodHlwZSwgZmFsc2UpOwogIH0KICBmdW5jdGlvbiBleHByZXNzaW9uTm9Db21tYSh0eXBlKSB7CiAgICByZXR1cm4gZXhwcmVzc2lvbklubmVyKHR5cGUsIHRydWUpOwogIH0KICBmdW5jdGlvbiBleHByZXNzaW9uSW5uZXIodHlwZSwgbm9Db21tYSkgewogICAgaWYgKGN4LnN0YXRlLmZhdEFycm93QXQgPT0gY3guc3RyZWFtLnN0YXJ0KSB7CiAgICAgIHZhciBib2R5ID0gbm9Db21tYSA/IGFycm93Qm9keU5vQ29tbWEgOiBhcnJvd0JvZHk7CiAgICAgIGlmICh0eXBlID09ICIoIikgcmV0dXJuIGNvbnQocHVzaGNvbnRleHQsIHB1c2hsZXgoIikiKSwgY29tbWFzZXAocGF0dGVybiwgIikiKSwgcG9wbGV4LCBleHBlY3QoIj0+IiksIGJvZHksIHBvcGNvbnRleHQpOwogICAgICBlbHNlIGlmICh0eXBlID09ICJ2YXJpYWJsZSIpIHJldHVybiBwYXNzKHB1c2hjb250ZXh0LCBwYXR0ZXJuLCBleHBlY3QoIj0+IiksIGJvZHksIHBvcGNvbnRleHQpOwogICAgfQoKICAgIHZhciBtYXliZW9wID0gbm9Db21tYSA/IG1heWJlb3BlcmF0b3JOb0NvbW1hIDogbWF5YmVvcGVyYXRvckNvbW1hOwogICAgaWYgKGF0b21pY1R5cGVzLmhhc093blByb3BlcnR5KHR5cGUpKSByZXR1cm4gY29udChtYXliZW9wKTsKICAgIGlmICh0eXBlID09ICJmdW5jdGlvbiIpIHJldHVybiBjb250KGZ1bmN0aW9uZGVmLCBtYXliZW9wKTsKICAgIGlmICh0eXBlID09ICJrZXl3b3JkIGMiKSByZXR1cm4gY29udChub0NvbW1hID8gbWF5YmVleHByZXNzaW9uTm9Db21tYSA6IG1heWJlZXhwcmVzc2lvbik7CiAgICBpZiAodHlwZSA9PSAiKCIpIHJldHVybiBjb250KHB1c2hsZXgoIikiKSwgbWF5YmVleHByZXNzaW9uLCBjb21wcmVoZW5zaW9uLCBleHBlY3QoIikiKSwgcG9wbGV4LCBtYXliZW9wKTsKICAgIGlmICh0eXBlID09ICJvcGVyYXRvciIgfHwgdHlwZSA9PSAic3ByZWFkIikgcmV0dXJuIGNvbnQobm9Db21tYSA/IGV4cHJlc3Npb25Ob0NvbW1hIDogZXhwcmVzc2lvbik7CiAgICBpZiAodHlwZSA9PSAiWyIpIHJldHVybiBjb250KHB1c2hsZXgoIl0iKSwgYXJyYXlMaXRlcmFsLCBwb3BsZXgsIG1heWJlb3ApOwogICAgaWYgKHR5cGUgPT0gInsiKSByZXR1cm4gY29udENvbW1hc2VwKG9ianByb3AsICJ9IiwgbnVsbCwgbWF5YmVvcCk7CiAgICBpZiAodHlwZSA9PSAicXVhc2kiKSB7IHJldHVybiBwYXNzKHF1YXNpLCBtYXliZW9wKTsgfQogICAgcmV0dXJuIGNvbnQoKTsKICB9CiAgZnVuY3Rpb24gbWF5YmVleHByZXNzaW9uKHR5cGUpIHsKICAgIGlmICh0eXBlLm1hdGNoKC9bO1x9XClcXSxdLykpIHJldHVybiBwYXNzKCk7CiAgICByZXR1cm4gcGFzcyhleHByZXNzaW9uKTsKICB9CiAgZnVuY3Rpb24gbWF5YmVleHByZXNzaW9uTm9Db21tYSh0eXBlKSB7CiAgICBpZiAodHlwZS5tYXRjaCgvWztcfVwpXF0sXS8pKSByZXR1cm4gcGFzcygpOwogICAgcmV0dXJuIHBhc3MoZXhwcmVzc2lvbk5vQ29tbWEpOwogIH0KCiAgZnVuY3Rpb24gbWF5YmVvcGVyYXRvckNvbW1hKHR5cGUsIHZhbHVlKSB7CiAgICBpZiAodHlwZSA9PSAiLCIpIHJldHVybiBjb250KGV4cHJlc3Npb24pOwogICAgcmV0dXJuIG1heWJlb3BlcmF0b3JOb0NvbW1hKHR5cGUsIHZhbHVlLCBmYWxzZSk7CiAgfQogIGZ1bmN0aW9uIG1heWJlb3BlcmF0b3JOb0NvbW1hKHR5cGUsIHZhbHVlLCBub0NvbW1hKSB7CiAgICB2YXIgbWUgPSBub0NvbW1hID09IGZhbHNlID8gbWF5YmVvcGVyYXRvckNvbW1hIDogbWF5YmVvcGVyYXRvck5vQ29tbWE7CiAgICB2YXIgZXhwciA9IG5vQ29tbWEgPT0gZmFsc2UgPyBleHByZXNzaW9uIDogZXhwcmVzc2lvbk5vQ29tbWE7CiAgICBpZiAodmFsdWUgPT0gIj0+IikgcmV0dXJuIGNvbnQocHVzaGNvbnRleHQsIG5vQ29tbWEgPyBhcnJvd0JvZHlOb0NvbW1hIDogYXJyb3dCb2R5LCBwb3Bjb250ZXh0KTsKICAgIGlmICh0eXBlID09ICJvcGVyYXRvciIpIHsKICAgICAgaWYgKC9cK1wrfC0tLy50ZXN0KHZhbHVlKSkgcmV0dXJuIGNvbnQobWUpOwogICAgICBpZiAodmFsdWUgPT0gIj8iKSByZXR1cm4gY29udChleHByZXNzaW9uLCBleHBlY3QoIjoiKSwgZXhwcik7CiAgICAgIHJldHVybiBjb250KGV4cHIpOwogICAgfQogICAgaWYgKHR5cGUgPT0gInF1YXNpIikgeyByZXR1cm4gcGFzcyhxdWFzaSwgbWUpOyB9CiAgICBpZiAodHlwZSA9PSAiOyIpIHJldHVybjsKICAgIGlmICh0eXBlID09ICIoIikgcmV0dXJuIGNvbnRDb21tYXNlcChleHByZXNzaW9uTm9Db21tYSwgIikiLCAiY2FsbCIsIG1lKTsKICAgIGlmICh0eXBlID09ICIuIikgcmV0dXJuIGNvbnQocHJvcGVydHksIG1lKTsKICAgIGlmICh0eXBlID09ICJbIikgcmV0dXJuIGNvbnQocHVzaGxleCgiXSIpLCBtYXliZWV4cHJlc3Npb24sIGV4cGVjdCgiXSIpLCBwb3BsZXgsIG1lKTsKICB9CiAgZnVuY3Rpb24gcXVhc2kodHlwZSwgdmFsdWUpIHsKICAgIGlmICh0eXBlICE9ICJxdWFzaSIpIHJldHVybiBwYXNzKCk7CiAgICBpZiAodmFsdWUuc2xpY2UodmFsdWUubGVuZ3RoIC0gMikgIT0gIiR7IikgcmV0dXJuIGNvbnQocXVhc2kpOwogICAgcmV0dXJuIGNvbnQoZXhwcmVzc2lvbiwgY29udGludWVRdWFzaSk7CiAgfQogIGZ1bmN0aW9uIGNvbnRpbnVlUXVhc2kodHlwZSkgewogICAgaWYgKHR5cGUgPT0gIn0iKSB7CiAgICAgIGN4Lm1hcmtlZCA9ICJzdHJpbmctMiI7CiAgICAgIGN4LnN0YXRlLnRva2VuaXplID0gdG9rZW5RdWFzaTsKICAgICAgcmV0dXJuIGNvbnQocXVhc2kpOwogICAgfQogIH0KICBmdW5jdGlvbiBhcnJvd0JvZHkodHlwZSkgewogICAgZmluZEZhdEFycm93KGN4LnN0cmVhbSwgY3guc3RhdGUpOwogICAgaWYgKHR5cGUgPT0gInsiKSByZXR1cm4gcGFzcyhzdGF0ZW1lbnQpOwogICAgcmV0dXJuIHBhc3MoZXhwcmVzc2lvbik7CiAgfQogIGZ1bmN0aW9uIGFycm93Qm9keU5vQ29tbWEodHlwZSkgewogICAgZmluZEZhdEFycm93KGN4LnN0cmVhbSwgY3guc3RhdGUpOwogICAgaWYgKHR5cGUgPT0gInsiKSByZXR1cm4gcGFzcyhzdGF0ZW1lbnQpOwogICAgcmV0dXJuIHBhc3MoZXhwcmVzc2lvbk5vQ29tbWEpOwogIH0KICBmdW5jdGlvbiBtYXliZWxhYmVsKHR5cGUpIHsKICAgIGlmICh0eXBlID09ICI6IikgcmV0dXJuIGNvbnQocG9wbGV4LCBzdGF0ZW1lbnQpOwogICAgcmV0dXJuIHBhc3MobWF5YmVvcGVyYXRvckNvbW1hLCBleHBlY3QoIjsiKSwgcG9wbGV4KTsKICB9CiAgZnVuY3Rpb24gcHJvcGVydHkodHlwZSkgewogICAgaWYgKHR5cGUgPT0gInZhcmlhYmxlIikge2N4Lm1hcmtlZCA9ICJwcm9wZXJ0eSI7IHJldHVybiBjb250KCk7fQogIH0KICBmdW5jdGlvbiBvYmpwcm9wKHR5cGUsIHZhbHVlKSB7CiAgICBpZiAodHlwZSA9PSAidmFyaWFibGUiIHx8IGN4LnN0eWxlID09ICJrZXl3b3JkIikgewogICAgICBjeC5tYXJrZWQgPSAicHJvcGVydHkiOwogICAgICBpZiAodmFsdWUgPT0gImdldCIgfHwgdmFsdWUgPT0gInNldCIpIHJldHVybiBjb250KGdldHRlclNldHRlcik7CiAgICAgIHJldHVybiBjb250KGFmdGVycHJvcCk7CiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gIm51bWJlciIgfHwgdHlwZSA9PSAic3RyaW5nIikgewogICAgICBjeC5tYXJrZWQgPSBqc29ubGRNb2RlID8gInByb3BlcnR5IiA6IChjeC5zdHlsZSArICIgcHJvcGVydHkiKTsKICAgICAgcmV0dXJuIGNvbnQoYWZ0ZXJwcm9wKTsKICAgIH0gZWxzZSBpZiAodHlwZSA9PSAianNvbmxkLWtleXdvcmQiKSB7CiAgICAgIHJldHVybiBjb250KGFmdGVycHJvcCk7CiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gIlsiKSB7CiAgICAgIHJldHVybiBjb250KGV4cHJlc3Npb24sIGV4cGVjdCgiXSIpLCBhZnRlcnByb3ApOwogICAgfQogIH0KICBmdW5jdGlvbiBnZXR0ZXJTZXR0ZXIodHlwZSkgewogICAgaWYgKHR5cGUgIT0gInZhcmlhYmxlIikgcmV0dXJuIHBhc3MoYWZ0ZXJwcm9wKTsKICAgIGN4Lm1hcmtlZCA9ICJwcm9wZXJ0eSI7CiAgICByZXR1cm4gY29udChmdW5jdGlvbmRlZik7CiAgfQogIGZ1bmN0aW9uIGFmdGVycHJvcCh0eXBlKSB7CiAgICBpZiAodHlwZSA9PSAiOiIpIHJldHVybiBjb250KGV4cHJlc3Npb25Ob0NvbW1hKTsKICAgIGlmICh0eXBlID09ICIoIikgcmV0dXJuIHBhc3MoZnVuY3Rpb25kZWYpOwogIH0KICBmdW5jdGlvbiBjb21tYXNlcCh3aGF0LCBlbmQpIHsKICAgIGZ1bmN0aW9uIHByb2NlZWQodHlwZSkgewogICAgICBpZiAodHlwZSA9PSAiLCIpIHsKICAgICAgICB2YXIgbGV4ID0gY3guc3RhdGUubGV4aWNhbDsKICAgICAgICBpZiAobGV4LmluZm8gPT0gImNhbGwiKSBsZXgucG9zID0gKGxleC5wb3MgfHwgMCkgKyAxOwogICAgICAgIHJldHVybiBjb250KHdoYXQsIHByb2NlZWQpOwogICAgICB9CiAgICAgIGlmICh0eXBlID09IGVuZCkgcmV0dXJuIGNvbnQoKTsKICAgICAgcmV0dXJuIGNvbnQoZXhwZWN0KGVuZCkpOwogICAgfQogICAgcmV0dXJuIGZ1bmN0aW9uKHR5cGUpIHsKICAgICAgaWYgKHR5cGUgPT0gZW5kKSByZXR1cm4gY29udCgpOwogICAgICByZXR1cm4gcGFzcyh3aGF0LCBwcm9jZWVkKTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIGNvbnRDb21tYXNlcCh3aGF0LCBlbmQsIGluZm8pIHsKICAgIGZvciAodmFyIGkgPSAzOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKQogICAgICBjeC5jYy5wdXNoKGFyZ3VtZW50c1tpXSk7CiAgICByZXR1cm4gY29udChwdXNobGV4KGVuZCwgaW5mbyksIGNvbW1hc2VwKHdoYXQsIGVuZCksIHBvcGxleCk7CiAgfQogIGZ1bmN0aW9uIGJsb2NrKHR5cGUpIHsKICAgIGlmICh0eXBlID09ICJ9IikgcmV0dXJuIGNvbnQoKTsKICAgIHJldHVybiBwYXNzKHN0YXRlbWVudCwgYmxvY2spOwogIH0KICBmdW5jdGlvbiBtYXliZXR5cGUodHlwZSkgewogICAgaWYgKGlzVFMgJiYgdHlwZSA9PSAiOiIpIHJldHVybiBjb250KHR5cGVkZWYpOwogIH0KICBmdW5jdGlvbiB0eXBlZGVmKHR5cGUpIHsKICAgIGlmICh0eXBlID09ICJ2YXJpYWJsZSIpe2N4Lm1hcmtlZCA9ICJ2YXJpYWJsZS0zIjsgcmV0dXJuIGNvbnQoKTt9CiAgfQogIGZ1bmN0aW9uIHZhcmRlZigpIHsKICAgIHJldHVybiBwYXNzKHBhdHRlcm4sIG1heWJldHlwZSwgbWF5YmVBc3NpZ24sIHZhcmRlZkNvbnQpOwogIH0KICBmdW5jdGlvbiBwYXR0ZXJuKHR5cGUsIHZhbHVlKSB7CiAgICBpZiAodHlwZSA9PSAidmFyaWFibGUiKSB7IHJlZ2lzdGVyKHZhbHVlKTsgcmV0dXJuIGNvbnQoKTsgfQogICAgaWYgKHR5cGUgPT0gIlsiKSByZXR1cm4gY29udENvbW1hc2VwKHBhdHRlcm4sICJdIik7CiAgICBpZiAodHlwZSA9PSAieyIpIHJldHVybiBjb250Q29tbWFzZXAocHJvcHBhdHRlcm4sICJ9Iik7CiAgfQogIGZ1bmN0aW9uIHByb3BwYXR0ZXJuKHR5cGUsIHZhbHVlKSB7CiAgICBpZiAodHlwZSA9PSAidmFyaWFibGUiICYmICFjeC5zdHJlYW0ubWF0Y2goL15ccyo6LywgZmFsc2UpKSB7CiAgICAgIHJlZ2lzdGVyKHZhbHVlKTsKICAgICAgcmV0dXJuIGNvbnQobWF5YmVBc3NpZ24pOwogICAgfQogICAgaWYgKHR5cGUgPT0gInZhcmlhYmxlIikgY3gubWFya2VkID0gInByb3BlcnR5IjsKICAgIHJldHVybiBjb250KGV4cGVjdCgiOiIpLCBwYXR0ZXJuLCBtYXliZUFzc2lnbik7CiAgfQogIGZ1bmN0aW9uIG1heWJlQXNzaWduKF90eXBlLCB2YWx1ZSkgewogICAgaWYgKHZhbHVlID09ICI9IikgcmV0dXJuIGNvbnQoZXhwcmVzc2lvbk5vQ29tbWEpOwogIH0KICBmdW5jdGlvbiB2YXJkZWZDb250KHR5cGUpIHsKICAgIGlmICh0eXBlID09ICIsIikgcmV0dXJuIGNvbnQodmFyZGVmKTsKICB9CiAgZnVuY3Rpb24gbWF5YmVlbHNlKHR5cGUsIHZhbHVlKSB7CiAgICBpZiAodHlwZSA9PSAia2V5d29yZCBiIiAmJiB2YWx1ZSA9PSAiZWxzZSIpIHJldHVybiBjb250KHB1c2hsZXgoImZvcm0iLCAiZWxzZSIpLCBzdGF0ZW1lbnQsIHBvcGxleCk7CiAgfQogIGZ1bmN0aW9uIGZvcnNwZWModHlwZSkgewogICAgaWYgKHR5cGUgPT0gIigiKSByZXR1cm4gY29udChwdXNobGV4KCIpIiksIGZvcnNwZWMxLCBleHBlY3QoIikiKSwgcG9wbGV4KTsKICB9CiAgZnVuY3Rpb24gZm9yc3BlYzEodHlwZSkgewogICAgaWYgKHR5cGUgPT0gInZhciIpIHJldHVybiBjb250KHZhcmRlZiwgZXhwZWN0KCI7IiksIGZvcnNwZWMyKTsKICAgIGlmICh0eXBlID09ICI7IikgcmV0dXJuIGNvbnQoZm9yc3BlYzIpOwogICAgaWYgKHR5cGUgPT0gInZhcmlhYmxlIikgcmV0dXJuIGNvbnQoZm9ybWF5YmVpbm9mKTsKICAgIHJldHVybiBwYXNzKGV4cHJlc3Npb24sIGV4cGVjdCgiOyIpLCBmb3JzcGVjMik7CiAgfQogIGZ1bmN0aW9uIGZvcm1heWJlaW5vZihfdHlwZSwgdmFsdWUpIHsKICAgIGlmICh2YWx1ZSA9PSAiaW4iIHx8IHZhbHVlID09ICJvZiIpIHsgY3gubWFya2VkID0gImtleXdvcmQiOyByZXR1cm4gY29udChleHByZXNzaW9uKTsgfQogICAgcmV0dXJuIGNvbnQobWF5YmVvcGVyYXRvckNvbW1hLCBmb3JzcGVjMik7CiAgfQogIGZ1bmN0aW9uIGZvcnNwZWMyKHR5cGUsIHZhbHVlKSB7CiAgICBpZiAodHlwZSA9PSAiOyIpIHJldHVybiBjb250KGZvcnNwZWMzKTsKICAgIGlmICh2YWx1ZSA9PSAiaW4iIHx8IHZhbHVlID09ICJvZiIpIHsgY3gubWFya2VkID0gImtleXdvcmQiOyByZXR1cm4gY29udChleHByZXNzaW9uKTsgfQogICAgcmV0dXJuIHBhc3MoZXhwcmVzc2lvbiwgZXhwZWN0KCI7IiksIGZvcnNwZWMzKTsKICB9CiAgZnVuY3Rpb24gZm9yc3BlYzModHlwZSkgewogICAgaWYgKHR5cGUgIT0gIikiKSBjb250KGV4cHJlc3Npb24pOwogIH0KICBmdW5jdGlvbiBmdW5jdGlvbmRlZih0eXBlLCB2YWx1ZSkgewogICAgaWYgKHZhbHVlID09ICIqIikge2N4Lm1hcmtlZCA9ICJrZXl3b3JkIjsgcmV0dXJuIGNvbnQoZnVuY3Rpb25kZWYpO30KICAgIGlmICh0eXBlID09ICJ2YXJpYWJsZSIpIHtyZWdpc3Rlcih2YWx1ZSk7IHJldHVybiBjb250KGZ1bmN0aW9uZGVmKTt9CiAgICBpZiAodHlwZSA9PSAiKCIpIHJldHVybiBjb250KHB1c2hjb250ZXh0LCBwdXNobGV4KCIpIiksIGNvbW1hc2VwKGZ1bmFyZywgIikiKSwgcG9wbGV4LCBzdGF0ZW1lbnQsIHBvcGNvbnRleHQpOwogIH0KICBmdW5jdGlvbiBmdW5hcmcodHlwZSkgewogICAgaWYgKHR5cGUgPT0gInNwcmVhZCIpIHJldHVybiBjb250KGZ1bmFyZyk7CiAgICByZXR1cm4gcGFzcyhwYXR0ZXJuLCBtYXliZXR5cGUpOwogIH0KICBmdW5jdGlvbiBjbGFzc05hbWUodHlwZSwgdmFsdWUpIHsKICAgIGlmICh0eXBlID09ICJ2YXJpYWJsZSIpIHtyZWdpc3Rlcih2YWx1ZSk7IHJldHVybiBjb250KGNsYXNzTmFtZUFmdGVyKTt9CiAgfQogIGZ1bmN0aW9uIGNsYXNzTmFtZUFmdGVyKHR5cGUsIHZhbHVlKSB7CiAgICBpZiAodmFsdWUgPT0gImV4dGVuZHMiKSByZXR1cm4gY29udChleHByZXNzaW9uLCBjbGFzc05hbWVBZnRlcik7CiAgICBpZiAodHlwZSA9PSAieyIpIHJldHVybiBjb250KHB1c2hsZXgoIn0iKSwgY2xhc3NCb2R5LCBwb3BsZXgpOwogIH0KICBmdW5jdGlvbiBjbGFzc0JvZHkodHlwZSwgdmFsdWUpIHsKICAgIGlmICh0eXBlID09ICJ2YXJpYWJsZSIgfHwgY3guc3R5bGUgPT0gImtleXdvcmQiKSB7CiAgICAgIGN4Lm1hcmtlZCA9ICJwcm9wZXJ0eSI7CiAgICAgIGlmICh2YWx1ZSA9PSAiZ2V0IiB8fCB2YWx1ZSA9PSAic2V0IikgcmV0dXJuIGNvbnQoY2xhc3NHZXR0ZXJTZXR0ZXIsIGZ1bmN0aW9uZGVmLCBjbGFzc0JvZHkpOwogICAgICByZXR1cm4gY29udChmdW5jdGlvbmRlZiwgY2xhc3NCb2R5KTsKICAgIH0KICAgIGlmICh2YWx1ZSA9PSAiKiIpIHsKICAgICAgY3gubWFya2VkID0gImtleXdvcmQiOwogICAgICByZXR1cm4gY29udChjbGFzc0JvZHkpOwogICAgfQogICAgaWYgKHR5cGUgPT0gIjsiKSByZXR1cm4gY29udChjbGFzc0JvZHkpOwogICAgaWYgKHR5cGUgPT0gIn0iKSByZXR1cm4gY29udCgpOwogIH0KICBmdW5jdGlvbiBjbGFzc0dldHRlclNldHRlcih0eXBlKSB7CiAgICBpZiAodHlwZSAhPSAidmFyaWFibGUiKSByZXR1cm4gcGFzcygpOwogICAgY3gubWFya2VkID0gInByb3BlcnR5IjsKICAgIHJldHVybiBjb250KCk7CiAgfQogIGZ1bmN0aW9uIGFmdGVyTW9kdWxlKHR5cGUsIHZhbHVlKSB7CiAgICBpZiAodHlwZSA9PSAic3RyaW5nIikgcmV0dXJuIGNvbnQoc3RhdGVtZW50KTsKICAgIGlmICh0eXBlID09ICJ2YXJpYWJsZSIpIHsgcmVnaXN0ZXIodmFsdWUpOyByZXR1cm4gY29udChtYXliZUZyb20pOyB9CiAgfQogIGZ1bmN0aW9uIGFmdGVyRXhwb3J0KF90eXBlLCB2YWx1ZSkgewogICAgaWYgKHZhbHVlID09ICIqIikgeyBjeC5tYXJrZWQgPSAia2V5d29yZCI7IHJldHVybiBjb250KG1heWJlRnJvbSwgZXhwZWN0KCI7IikpOyB9CiAgICBpZiAodmFsdWUgPT0gImRlZmF1bHQiKSB7IGN4Lm1hcmtlZCA9ICJrZXl3b3JkIjsgcmV0dXJuIGNvbnQoZXhwcmVzc2lvbiwgZXhwZWN0KCI7IikpOyB9CiAgICByZXR1cm4gcGFzcyhzdGF0ZW1lbnQpOwogIH0KICBmdW5jdGlvbiBhZnRlckltcG9ydCh0eXBlKSB7CiAgICBpZiAodHlwZSA9PSAic3RyaW5nIikgcmV0dXJuIGNvbnQoKTsKICAgIHJldHVybiBwYXNzKGltcG9ydFNwZWMsIG1heWJlRnJvbSk7CiAgfQogIGZ1bmN0aW9uIGltcG9ydFNwZWModHlwZSwgdmFsdWUpIHsKICAgIGlmICh0eXBlID09ICJ7IikgcmV0dXJuIGNvbnRDb21tYXNlcChpbXBvcnRTcGVjLCAifSIpOwogICAgaWYgKHR5cGUgPT0gInZhcmlhYmxlIikgcmVnaXN0ZXIodmFsdWUpOwogICAgcmV0dXJuIGNvbnQoKTsKICB9CiAgZnVuY3Rpb24gbWF5YmVGcm9tKF90eXBlLCB2YWx1ZSkgewogICAgaWYgKHZhbHVlID09ICJmcm9tIikgeyBjeC5tYXJrZWQgPSAia2V5d29yZCI7IHJldHVybiBjb250KGV4cHJlc3Npb24pOyB9CiAgfQogIGZ1bmN0aW9uIGFycmF5TGl0ZXJhbCh0eXBlKSB7CiAgICBpZiAodHlwZSA9PSAiXSIpIHJldHVybiBjb250KCk7CiAgICByZXR1cm4gcGFzcyhleHByZXNzaW9uTm9Db21tYSwgbWF5YmVBcnJheUNvbXByZWhlbnNpb24pOwogIH0KICBmdW5jdGlvbiBtYXliZUFycmF5Q29tcHJlaGVuc2lvbih0eXBlKSB7CiAgICBpZiAodHlwZSA9PSAiZm9yIikgcmV0dXJuIHBhc3MoY29tcHJlaGVuc2lvbiwgZXhwZWN0KCJdIikpOwogICAgaWYgKHR5cGUgPT0gIiwiKSByZXR1cm4gY29udChjb21tYXNlcChleHByZXNzaW9uTm9Db21tYSwgIl0iKSk7CiAgICByZXR1cm4gcGFzcyhjb21tYXNlcChleHByZXNzaW9uTm9Db21tYSwgIl0iKSk7CiAgfQogIGZ1bmN0aW9uIGNvbXByZWhlbnNpb24odHlwZSkgewogICAgaWYgKHR5cGUgPT0gImZvciIpIHJldHVybiBjb250KGZvcnNwZWMsIGNvbXByZWhlbnNpb24pOwogICAgaWYgKHR5cGUgPT0gImlmIikgcmV0dXJuIGNvbnQoZXhwcmVzc2lvbiwgY29tcHJlaGVuc2lvbik7CiAgfQoKICAvLyBJbnRlcmZhY2UKCiAgcmV0dXJuIHsKICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKGJhc2Vjb2x1bW4pIHsKICAgICAgdmFyIHN0YXRlID0gewogICAgICAgIHRva2VuaXplOiB0b2tlbkJhc2UsCiAgICAgICAgbGFzdFR5cGU6ICJzb2YiLAogICAgICAgIGNjOiBbXSwKICAgICAgICBsZXhpY2FsOiBuZXcgSlNMZXhpY2FsKChiYXNlY29sdW1uIHx8IDApIC0gaW5kZW50VW5pdCwgMCwgImJsb2NrIiwgZmFsc2UpLAogICAgICAgIGxvY2FsVmFyczogcGFyc2VyQ29uZmlnLmxvY2FsVmFycywKICAgICAgICBjb250ZXh0OiBwYXJzZXJDb25maWcubG9jYWxWYXJzICYmIHt2YXJzOiBwYXJzZXJDb25maWcubG9jYWxWYXJzfSwKICAgICAgICBpbmRlbnRlZDogMAogICAgICB9OwogICAgICBpZiAocGFyc2VyQ29uZmlnLmdsb2JhbFZhcnMgJiYgdHlwZW9mIHBhcnNlckNvbmZpZy5nbG9iYWxWYXJzID09ICJvYmplY3QiKQogICAgICAgIHN0YXRlLmdsb2JhbFZhcnMgPSBwYXJzZXJDb25maWcuZ2xvYmFsVmFyczsKICAgICAgcmV0dXJuIHN0YXRlOwogICAgfSwKCiAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICBpZiAoc3RyZWFtLnNvbCgpKSB7CiAgICAgICAgaWYgKCFzdGF0ZS5sZXhpY2FsLmhhc093blByb3BlcnR5KCJhbGlnbiIpKQogICAgICAgICAgc3RhdGUubGV4aWNhbC5hbGlnbiA9IGZhbHNlOwogICAgICAgIHN0YXRlLmluZGVudGVkID0gc3RyZWFtLmluZGVudGF0aW9uKCk7CiAgICAgICAgZmluZEZhdEFycm93KHN0cmVhbSwgc3RhdGUpOwogICAgICB9CiAgICAgIGlmIChzdGF0ZS50b2tlbml6ZSAhPSB0b2tlbkNvbW1lbnQgJiYgc3RyZWFtLmVhdFNwYWNlKCkpIHJldHVybiBudWxsOwogICAgICB2YXIgc3R5bGUgPSBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgICAgaWYgKHR5cGUgPT0gImNvbW1lbnQiKSByZXR1cm4gc3R5bGU7CiAgICAgIHN0YXRlLmxhc3RUeXBlID0gdHlwZSA9PSAib3BlcmF0b3IiICYmIChjb250ZW50ID09ICIrKyIgfHwgY29udGVudCA9PSAiLS0iKSA/ICJpbmNkZWMiIDogdHlwZTsKICAgICAgcmV0dXJuIHBhcnNlSlMoc3RhdGUsIHN0eWxlLCB0eXBlLCBjb250ZW50LCBzdHJlYW0pOwogICAgfSwKCiAgICBpbmRlbnQ6IGZ1bmN0aW9uKHN0YXRlLCB0ZXh0QWZ0ZXIpIHsKICAgICAgaWYgKHN0YXRlLnRva2VuaXplID09IHRva2VuQ29tbWVudCkgcmV0dXJuIENvZGVNaXJyb3IuUGFzczsKICAgICAgaWYgKHN0YXRlLnRva2VuaXplICE9IHRva2VuQmFzZSkgcmV0dXJuIDA7CiAgICAgIHZhciBmaXJzdENoYXIgPSB0ZXh0QWZ0ZXIgJiYgdGV4dEFmdGVyLmNoYXJBdCgwKSwgbGV4aWNhbCA9IHN0YXRlLmxleGljYWw7CiAgICAgIC8vIEtsdWRnZSB0byBwcmV2ZW50ICdtYXliZWxzZScgZnJvbSBibG9ja2luZyBsZXhpY2FsIHNjb3BlIHBvcHMKICAgICAgaWYgKCEvXlxzKmVsc2VcYi8udGVzdCh0ZXh0QWZ0ZXIpKSBmb3IgKHZhciBpID0gc3RhdGUuY2MubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHsKICAgICAgICB2YXIgYyA9IHN0YXRlLmNjW2ldOwogICAgICAgIGlmIChjID09IHBvcGxleCkgbGV4aWNhbCA9IGxleGljYWwucHJldjsKICAgICAgICBlbHNlIGlmIChjICE9IG1heWJlZWxzZSkgYnJlYWs7CiAgICAgIH0KICAgICAgaWYgKGxleGljYWwudHlwZSA9PSAic3RhdCIgJiYgZmlyc3RDaGFyID09ICJ9IikgbGV4aWNhbCA9IGxleGljYWwucHJldjsKICAgICAgaWYgKHN0YXRlbWVudEluZGVudCAmJiBsZXhpY2FsLnR5cGUgPT0gIikiICYmIGxleGljYWwucHJldi50eXBlID09ICJzdGF0IikKICAgICAgICBsZXhpY2FsID0gbGV4aWNhbC5wcmV2OwogICAgICB2YXIgdHlwZSA9IGxleGljYWwudHlwZSwgY2xvc2luZyA9IGZpcnN0Q2hhciA9PSB0eXBlOwoKICAgICAgaWYgKHR5cGUgPT0gInZhcmRlZiIpIHJldHVybiBsZXhpY2FsLmluZGVudGVkICsgKHN0YXRlLmxhc3RUeXBlID09ICJvcGVyYXRvciIgfHwgc3RhdGUubGFzdFR5cGUgPT0gIiwiID8gbGV4aWNhbC5pbmZvICsgMSA6IDApOwogICAgICBlbHNlIGlmICh0eXBlID09ICJmb3JtIiAmJiBmaXJzdENoYXIgPT0gInsiKSByZXR1cm4gbGV4aWNhbC5pbmRlbnRlZDsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAiZm9ybSIpIHJldHVybiBsZXhpY2FsLmluZGVudGVkICsgaW5kZW50VW5pdDsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAic3RhdCIpCiAgICAgICAgcmV0dXJuIGxleGljYWwuaW5kZW50ZWQgKyAoc3RhdGUubGFzdFR5cGUgPT0gIm9wZXJhdG9yIiB8fCBzdGF0ZS5sYXN0VHlwZSA9PSAiLCIgPyBzdGF0ZW1lbnRJbmRlbnQgfHwgaW5kZW50VW5pdCA6IDApOwogICAgICBlbHNlIGlmIChsZXhpY2FsLmluZm8gPT0gInN3aXRjaCIgJiYgIWNsb3NpbmcgJiYgcGFyc2VyQ29uZmlnLmRvdWJsZUluZGVudFN3aXRjaCAhPSBmYWxzZSkKICAgICAgICByZXR1cm4gbGV4aWNhbC5pbmRlbnRlZCArICgvXig/OmNhc2V8ZGVmYXVsdClcYi8udGVzdCh0ZXh0QWZ0ZXIpID8gaW5kZW50VW5pdCA6IDIgKiBpbmRlbnRVbml0KTsKICAgICAgZWxzZSBpZiAobGV4aWNhbC5hbGlnbikgcmV0dXJuIGxleGljYWwuY29sdW1uICsgKGNsb3NpbmcgPyAwIDogMSk7CiAgICAgIGVsc2UgcmV0dXJuIGxleGljYWwuaW5kZW50ZWQgKyAoY2xvc2luZyA/IDAgOiBpbmRlbnRVbml0KTsKICAgIH0sCgogICAgZWxlY3RyaWNDaGFyczogIjp7fSIsCiAgICBibG9ja0NvbW1lbnRTdGFydDoganNvbk1vZGUgPyBudWxsIDogIi8qIiwKICAgIGJsb2NrQ29tbWVudEVuZDoganNvbk1vZGUgPyBudWxsIDogIiovIiwKICAgIGxpbmVDb21tZW50OiBqc29uTW9kZSA/IG51bGwgOiAiLy8iLAogICAgZm9sZDogImJyYWNlIiwKCiAgICBoZWxwZXJUeXBlOiBqc29uTW9kZSA/ICJqc29uIiA6ICJqYXZhc2NyaXB0IiwKICAgIGpzb25sZE1vZGU6IGpzb25sZE1vZGUsCiAgICBqc29uTW9kZToganNvbk1vZGUKICB9Owp9KTsKCkNvZGVNaXJyb3IucmVnaXN0ZXJIZWxwZXIoIndvcmRDaGFycyIsICJqYXZhc2NyaXB0IiwgL1tcXHckXS8pOwoKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L2phdmFzY3JpcHQiLCAiamF2YXNjcmlwdCIpOwpDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQvZWNtYXNjcmlwdCIsICJqYXZhc2NyaXB0Iik7CkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgiYXBwbGljYXRpb24vamF2YXNjcmlwdCIsICJqYXZhc2NyaXB0Iik7CkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgiYXBwbGljYXRpb24veC1qYXZhc2NyaXB0IiwgImphdmFzY3JpcHQiKTsKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0IiwgImphdmFzY3JpcHQiKTsKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJhcHBsaWNhdGlvbi9qc29uIiwge25hbWU6ICJqYXZhc2NyaXB0IiwganNvbjogdHJ1ZX0pOwpDb2RlTWlycm9yLmRlZmluZU1JTUUoImFwcGxpY2F0aW9uL3gtanNvbiIsIHtuYW1lOiAiamF2YXNjcmlwdCIsIGpzb246IHRydWV9KTsKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJhcHBsaWNhdGlvbi9sZCtqc29uIiwge25hbWU6ICJqYXZhc2NyaXB0IiwganNvbmxkOiB0cnVlfSk7CkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC90eXBlc2NyaXB0IiwgeyBuYW1lOiAiamF2YXNjcmlwdCIsIHR5cGVzY3JpcHQ6IHRydWUgfSk7CkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgiYXBwbGljYXRpb24vdHlwZXNjcmlwdCIsIHsgbmFtZTogImphdmFzY3JpcHQiLCB0eXBlc2NyaXB0OiB0cnVlIH0pOwoKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/javascript/json-ld.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogSlNPTi1MRCBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uLy4uL2FkZG9uL2VkaXQvbWF0Y2hicmFja2V0cy5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi8uLi9hZGRvbi9jb21tZW50L2NvbnRpbnVlY29tbWVudC5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi8uLi9hZGRvbi9jb21tZW50L2NvbW1lbnQuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iamF2YXNjcmlwdC5qcyI+PC9zY3JpcHQ+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+LkNvZGVNaXJyb3Ige2JvcmRlci10b3A6IDFweCBzb2xpZCBibGFjazsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO308L3N0eWxlPgo8ZGl2IGlkPSJuYXYiPgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGltZyBpZD1sb2dvIHNyYz0iLi4vLi4vZG9jL2xvZ28ucG5nIi8+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5KU09OLUxEPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5KU09OLUxEIG1vZGU8L2gyPgoKCjxkaXY+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KewogICJAY29udGV4dCI6IHsKICAgICJuYW1lIjogImh0dHA6Ly9zY2hlbWEub3JnL25hbWUiLAogICAgImRlc2NyaXB0aW9uIjogImh0dHA6Ly9zY2hlbWEub3JnL2Rlc2NyaXB0aW9uIiwKICAgICJpbWFnZSI6IHsKICAgICAgIkBpZCI6ICJodHRwOi8vc2NoZW1hLm9yZy9pbWFnZSIsCiAgICAgICJAdHlwZSI6ICJAaWQiCiAgICB9LAogICAgImdlbyI6ICJodHRwOi8vc2NoZW1hLm9yZy9nZW8iLAogICAgImxhdGl0dWRlIjogewogICAgICAiQGlkIjogImh0dHA6Ly9zY2hlbWEub3JnL2xhdGl0dWRlIiwKICAgICAgIkB0eXBlIjogInhzZDpmbG9hdCIKICAgIH0sCiAgICAibG9uZ2l0dWRlIjogewogICAgICAiQGlkIjogImh0dHA6Ly9zY2hlbWEub3JnL2xvbmdpdHVkZSIsCiAgICAgICJAdHlwZSI6ICJ4c2Q6ZmxvYXQiCiAgICB9LAogICAgInhzZCI6ICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSMiCiAgfSwKICAibmFtZSI6ICJUaGUgRW1waXJlIFN0YXRlIEJ1aWxkaW5nIiwKICAiZGVzY3JpcHRpb24iOiAiVGhlIEVtcGlyZSBTdGF0ZSBCdWlsZGluZyBpcyBhIDEwMi1zdG9yeSBsYW5kbWFyayBpbiBOZXcgWW9yayBDaXR5LiIsCiAgImltYWdlIjogImh0dHA6Ly93d3cuY2l2aWwudXNoZXJicm9va2UuY2EvY291cnMvZ2NpMjE1YS9lbXBpcmUtc3RhdGUtYnVpbGRpbmcuanBnIiwKICAiZ2VvIjogewogICAgImxhdGl0dWRlIjogIjQwLjc1IiwKICAgICJsb25naXR1ZGUiOiAiNzMuOTgiCiAgfQp9CjwvdGV4dGFyZWE+PC9kaXY+CgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICBtYXRjaEJyYWNrZXRzOiB0cnVlLAogICAgICAgIGF1dG9DbG9zZUJyYWNrZXRzOiB0cnVlLAogICAgICAgIG1vZGU6ICJhcHBsaWNhdGlvbi9sZCtqc29uIiwKICAgICAgICBsaW5lV3JhcHBpbmc6IHRydWUKICAgICAgfSk7CiAgICA8L3NjcmlwdD4KICAgIAogICAgPHA+VGhpcyBpcyBhIHNwZWNpYWxpemF0aW9uIG9mIHRoZSA8YSBocmVmPSJpbmRleC5odG1sIj5KYXZhU2NyaXB0IG1vZGU8L2E+LjwvcD4KICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/javascript/test.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24oKSB7CiAgdmFyIG1vZGUgPSBDb2RlTWlycm9yLmdldE1vZGUoe2luZGVudFVuaXQ6IDJ9LCAiamF2YXNjcmlwdCIpOwogIGZ1bmN0aW9uIE1UKG5hbWUpIHsgdGVzdC5tb2RlKG5hbWUsIG1vZGUsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpOyB9CgogIE1UKCJsb2NhbHMiLAogICAgICJba2V5d29yZCBmdW5jdGlvbl0gW3ZhcmlhYmxlIGZvb10oW2RlZiBhXSwgW2RlZiBiXSkgeyBba2V5d29yZCB2YXJdIFtkZWYgY10gW29wZXJhdG9yID1dIFtudW1iZXIgMTBdOyBba2V5d29yZCByZXR1cm5dIFt2YXJpYWJsZS0yIGFdIFtvcGVyYXRvciArXSBbdmFyaWFibGUtMiBjXSBbb3BlcmF0b3IgK10gW3ZhcmlhYmxlIGRdOyB9Iik7CgogIE1UKCJjb21tYS1hbmQtYmlub3AiLAogICAgICJba2V5d29yZCBmdW5jdGlvbl0oKXsgW2tleXdvcmQgdmFyXSBbZGVmIHhdIFtvcGVyYXRvciA9XSBbbnVtYmVyIDFdIFtvcGVyYXRvciArXSBbbnVtYmVyIDJdLCBbZGVmIHldOyB9Iik7CgogIE1UKCJkZXN0cnVjdHVyaW5nIiwKICAgICAiKFtrZXl3b3JkIGZ1bmN0aW9uXShbZGVmIGFdLCBbW1tkZWYgYl0sIFtkZWYgY10gXV0pIHsiLAogICAgICIgIFtrZXl3b3JkIGxldF0ge1tkZWYgZF0sIFtwcm9wZXJ0eSBmb29dOiBbZGVmIGNdW29wZXJhdG9yID1dW251bWJlciAxMF0sIFtkZWYgeF19IFtvcGVyYXRvciA9XSBbdmFyaWFibGUgZm9vXShbdmFyaWFibGUtMiBhXSk7IiwKICAgICAiICBbW1t2YXJpYWJsZS0yIGNdLCBbdmFyaWFibGUgeV0gXV0gW29wZXJhdG9yID1dIFt2YXJpYWJsZS0yIGNdOyIsCiAgICAgIn0pKCk7Iik7CgogIE1UKCJjbGFzc19ib2R5IiwKICAgICAiW2tleXdvcmQgY2xhc3NdIFt2YXJpYWJsZSBGb29dIHsiLAogICAgICIgIFtwcm9wZXJ0eSBjb25zdHJ1Y3Rvcl0oKSB7fSIsCiAgICAgIiAgW3Byb3BlcnR5IHNheU5hbWVdKCkgeyIsCiAgICAgIiAgICBba2V5d29yZCByZXR1cm5dIFtzdHJpbmctMiBgZm9vJHtdW3ZhcmlhYmxlIGZvb11bc3RyaW5nLTIgfW9vYF07IiwKICAgICAiICB9IiwKICAgICAifSIpOwoKICBNVCgiY2xhc3MiLAogICAgICJba2V5d29yZCBjbGFzc10gW3ZhcmlhYmxlIFBvaW50XSBba2V5d29yZCBleHRlbmRzXSBbdmFyaWFibGUgU3VwZXJUaGluZ10geyIsCiAgICAgIiAgW3Byb3BlcnR5IGdldF0gW3Byb3BlcnR5IHByb3BdKCkgeyBba2V5d29yZCByZXR1cm5dIFtudW1iZXIgMjRdOyB9IiwKICAgICAiICBbcHJvcGVydHkgY29uc3RydWN0b3JdKFtkZWYgeF0sIFtkZWYgeV0pIHsiLAogICAgICIgICAgW2tleXdvcmQgc3VwZXJdKFtzdHJpbmcgJ3NvbWV0aGluZyddKTsiLAogICAgICIgICAgW2tleXdvcmQgdGhpc10uW3Byb3BlcnR5IHhdIFtvcGVyYXRvciA9XSBbdmFyaWFibGUtMiB4XTsiLAogICAgICIgIH0iLAogICAgICJ9Iik7CgogIE1UKCJtb2R1bGUiLAogICAgICJba2V5d29yZCBtb2R1bGVdIFtzdHJpbmcgJ2ZvbyddIHsiLAogICAgICIgIFtrZXl3b3JkIGV4cG9ydF0gW2tleXdvcmQgbGV0XSBbZGVmIHhdIFtvcGVyYXRvciA9XSBbbnVtYmVyIDQyXTsiLAogICAgICIgIFtrZXl3b3JkIGV4cG9ydF0gW2tleXdvcmQgKl0gW2tleXdvcmQgZnJvbV0gW3N0cmluZyAnc29tZXdoZXJlJ107IiwKICAgICAifSIpOwoKICBNVCgiaW1wb3J0IiwKICAgICAiW2tleXdvcmQgZnVuY3Rpb25dIFt2YXJpYWJsZSBmb29dKCkgeyIsCiAgICAgIiAgW2tleXdvcmQgaW1wb3J0XSBbZGVmICRdIFtrZXl3b3JkIGZyb21dIFtzdHJpbmcgJ2pxdWVyeSddOyIsCiAgICAgIiAgW2tleXdvcmQgbW9kdWxlXSBbZGVmIGNyeXB0b10gW2tleXdvcmQgZnJvbV0gW3N0cmluZyAnY3J5cHRvJ107IiwKICAgICAiICBba2V5d29yZCBpbXBvcnRdIHsgW2RlZiBlbmNyeXB0XSwgW2RlZiBkZWNyeXB0XSB9IFtrZXl3b3JkIGZyb21dIFtzdHJpbmcgJ2NyeXB0byddOyIsCiAgICAgIn0iKTsKCiAgTVQoImNvbnN0IiwKICAgICAiW2tleXdvcmQgZnVuY3Rpb25dIFt2YXJpYWJsZSBmXSgpIHsiLAogICAgICIgIFtrZXl3b3JkIGNvbnN0XSBbWyBbZGVmIGFdLCBbZGVmIGJdIF1dIFtvcGVyYXRvciA9XSBbWyBbbnVtYmVyIDFdLCBbbnVtYmVyIDJdIF1dOyIsCiAgICAgIn0iKTsKCiAgTVQoImZvci9vZiIsCiAgICAgIltrZXl3b3JkIGZvcl0oW2tleXdvcmQgbGV0XSBbdmFyaWFibGUgb2ZdIFtrZXl3b3JkIG9mXSBbdmFyaWFibGUgc29tZXRoaW5nXSkge30iKTsKCiAgTVQoImdlbmVyYXRvciIsCiAgICAgIltrZXl3b3JkIGZ1bmN0aW9uKl0gW3ZhcmlhYmxlIHJlcGVhdF0oW2RlZiBuXSkgeyIsCiAgICAgIiAgW2tleXdvcmQgZm9yXShba2V5d29yZCB2YXJdIFtkZWYgaV0gW29wZXJhdG9yID1dIFtudW1iZXIgMF07IFt2YXJpYWJsZS0yIGldIFtvcGVyYXRvciA8XSBbdmFyaWFibGUtMiBuXTsgW29wZXJhdG9yICsrXVt2YXJpYWJsZS0yIGldKSIsCiAgICAgIiAgICBba2V5d29yZCB5aWVsZF0gW3ZhcmlhYmxlLTIgaV07IiwKICAgICAifSIpOwoKICBNVCgiZmF0QXJyb3ciLAogICAgICJbdmFyaWFibGUgYXJyYXldLltwcm9wZXJ0eSBmaWx0ZXJdKFtkZWYgYV0gW29wZXJhdG9yID0+XSBbdmFyaWFibGUtMiBhXSBbb3BlcmF0b3IgK10gW251bWJlciAxXSk7IiwKICAgICAiW3ZhcmlhYmxlIGFdOyIsIC8vIE5vIGxvbmdlciBpbiBzY29wZQogICAgICJba2V5d29yZCBsZXRdIFt2YXJpYWJsZSBmXSBbb3BlcmF0b3IgPV0gKFtbIFtkZWYgYV0sIFtkZWYgYl0gXV0sIFtkZWYgY10pIFtvcGVyYXRvciA9Pl0gW3ZhcmlhYmxlLTIgYV0gW29wZXJhdG9yICtdIFt2YXJpYWJsZS0yIGNdOyIsCiAgICAgIlt2YXJpYWJsZSBjXTsiKTsKCiAgTVQoInNwcmVhZCIsCiAgICAgIltrZXl3b3JkIGZ1bmN0aW9uXSBbdmFyaWFibGUgZl0oW2RlZiBhXSwgW21ldGEgLi4uXVtkZWYgYl0pIHsiLAogICAgICIgIFt2YXJpYWJsZSBzb21ldGhpbmddKFt2YXJpYWJsZS0yIGFdLCBbbWV0YSAuLi5dW3ZhcmlhYmxlLTIgYl0pOyIsCiAgICAgIn0iKTsKCiAgTVQoImNvbXByZWhlbnNpb24iLAogICAgICJba2V5d29yZCBmdW5jdGlvbl0gW3ZhcmlhYmxlIGZdKCkgeyIsCiAgICAgIiAgW1soW3ZhcmlhYmxlIHhdIFtvcGVyYXRvciArXSBbbnVtYmVyIDFdKSBba2V5d29yZCBmb3JdIChba2V5d29yZCB2YXJdIFtkZWYgeF0gW2tleXdvcmQgaW5dIFt2YXJpYWJsZSB5XSkgW2tleXdvcmQgaWZdIFt2YXJpYWJsZSBwcmVkXShbdmFyaWFibGUtMiB4XSkgXV07IiwKICAgICAiICAoW3ZhcmlhYmxlIHVdIFtrZXl3b3JkIGZvcl0gKFtrZXl3b3JkIHZhcl0gW2RlZiB1XSBba2V5d29yZCBvZl0gW3ZhcmlhYmxlIGdlbmVyYXRlVmFsdWVzXSgpKSBba2V5d29yZCBpZl0gKFt2YXJpYWJsZS0yIHVdLltwcm9wZXJ0eSBjb2xvcl0gW29wZXJhdG9yID09PV0gW3N0cmluZyAnYmx1ZSddKSk7IiwKICAgICAifSIpOwoKICBNVCgicXVhc2kiLAogICAgICJbdmFyaWFibGUgcmVdW3N0cmluZy0yIGBmb2ZkbGFraiR7XVt2YXJpYWJsZSB4XSBbb3BlcmF0b3IgK10gKFt2YXJpYWJsZSByZV1bc3RyaW5nLTIgYGZvb2BdKSBbb3BlcmF0b3IgK10gW251bWJlciAxXVtzdHJpbmctMiB9ZmRzYWBdIFtvcGVyYXRvciArXSBbbnVtYmVyIDJdIik7CgogIE1UKCJxdWFzaV9ub19mdW5jdGlvbiIsCiAgICAgIlt2YXJpYWJsZSB4XSBbb3BlcmF0b3IgPV0gW3N0cmluZy0yIGBmb2ZkbGFraiR7XVt2YXJpYWJsZSB4XSBbb3BlcmF0b3IgK10gW3N0cmluZy0yIGBmb29gXSBbb3BlcmF0b3IgK10gW251bWJlciAxXVtzdHJpbmctMiB9ZmRzYWBdIFtvcGVyYXRvciArXSBbbnVtYmVyIDJdIik7CgogIE1UKCJpbmRlbnRfc3RhdGVtZW50IiwKICAgICAiW2tleXdvcmQgdmFyXSBbdmFyaWFibGUgeF0gW29wZXJhdG9yID1dIFtudW1iZXIgMTBdIiwKICAgICAiW3ZhcmlhYmxlIHhdIFtvcGVyYXRvciArPV0gW3ZhcmlhYmxlIHldIFtvcGVyYXRvciArXSIsCiAgICAgIiAgW2F0b20gSW5maW5pdHldIiwKICAgICAiW2tleXdvcmQgZGVidWdnZXJdOyIpOwoKICBNVCgiaW5kZW50X2lmIiwKICAgICAiW2tleXdvcmQgaWZdIChbbnVtYmVyIDFdKSIsCiAgICAgIiAgW2tleXdvcmQgYnJlYWtdOyIsCiAgICAgIltrZXl3b3JkIGVsc2VdIFtrZXl3b3JkIGlmXSAoW251bWJlciAyXSkiLAogICAgICIgIFtrZXl3b3JkIGNvbnRpbnVlXTsiLAogICAgICJba2V5d29yZCBlbHNlXSIsCiAgICAgIiAgW251bWJlciAxMF07IiwKICAgICAiW2tleXdvcmQgaWZdIChbbnVtYmVyIDFdKSB7IiwKICAgICAiICBba2V5d29yZCBicmVha107IiwKICAgICAifSBba2V5d29yZCBlbHNlXSBba2V5d29yZCBpZl0gKFtudW1iZXIgMl0pIHsiLAogICAgICIgIFtrZXl3b3JkIGNvbnRpbnVlXTsiLAogICAgICJ9IFtrZXl3b3JkIGVsc2VdIHsiLAogICAgICIgIFtudW1iZXIgMTBdOyIsCiAgICAgIn0iKTsKCiAgTVQoImluZGVudF9mb3IiLAogICAgICJba2V5d29yZCBmb3JdIChba2V5d29yZCB2YXJdIFt2YXJpYWJsZSBpXSBbb3BlcmF0b3IgPV0gW251bWJlciAwXTsiLAogICAgICIgICAgIFt2YXJpYWJsZSBpXSBbb3BlcmF0b3IgPF0gW251bWJlciAxMDBdOyIsCiAgICAgIiAgICAgW3ZhcmlhYmxlIGldW29wZXJhdG9yICsrXSkiLAogICAgICIgIFt2YXJpYWJsZSBkb1NvbWV0aGluZ10oW3ZhcmlhYmxlIGldKTsiLAogICAgICJba2V5d29yZCBkZWJ1Z2dlcl07Iik7CgogIE1UKCJpbmRlbnRfY19zdHlsZSIsCiAgICAgIltrZXl3b3JkIGZ1bmN0aW9uXSBbdmFyaWFibGUgZm9vXSgpIiwKICAgICAieyIsCiAgICAgIiAgW2tleXdvcmQgZGVidWdnZXJdOyIsCiAgICAgIn0iKTsKCiAgTVQoImluZGVudF9lbHNlIiwKICAgICAiW2tleXdvcmQgZm9yXSAoOzspIiwKICAgICAiICBba2V5d29yZCBpZl0gKFt2YXJpYWJsZSBmb29dKSIsCiAgICAgIiAgICBba2V5d29yZCBpZl0gKFt2YXJpYWJsZSBiYXJdKSIsCiAgICAgIiAgICAgIFtudW1iZXIgMV07IiwKICAgICAiICAgIFtrZXl3b3JkIGVsc2VdIiwKICAgICAiICAgICAgW251bWJlciAyXTsiLAogICAgICIgIFtrZXl3b3JkIGVsc2VdIiwKICAgICAiICAgIFtudW1iZXIgM107Iik7CgogIE1UKCJpbmRlbnRfZnVuYXJnIiwKICAgICAiW3ZhcmlhYmxlIGZvb10oW251bWJlciAxMDAwMF0sIiwKICAgICAiICAgIFtrZXl3b3JkIGZ1bmN0aW9uXShbZGVmIGFdKSB7IiwKICAgICAiICBba2V5d29yZCBkZWJ1Z2dlcl07IiwKICAgICAifTsiKTsKCiAgTVQoImluZGVudF9iZWxvd19pZiIsCiAgICAgIltrZXl3b3JkIGZvcl0gKDs7KSIsCiAgICAgIiAgW2tleXdvcmQgaWZdIChbdmFyaWFibGUgZm9vXSkiLAogICAgICIgICAgW251bWJlciAxXTsiLAogICAgICJbbnVtYmVyIDJdOyIpOwoKICBNVCgibXVsdGlsaW5lc3RyaW5nIiwKICAgICAiW2tleXdvcmQgdmFyXSBbdmFyaWFibGUgeF0gW29wZXJhdG9yID1dIFtzdHJpbmcgJ2Zvb1xcXSIsCiAgICAgIltzdHJpbmcgYmFyJ107Iik7CgogIE1UKCJzY2FyeV9yZWdleHAiLAogICAgICJbc3RyaW5nLTIgL2Zvb1tbL11dYmFyL107Iik7CgogIHZhciBqc29ubGRfbW9kZSA9IENvZGVNaXJyb3IuZ2V0TW9kZSgKICAgIHtpbmRlbnRVbml0OiAyfSwKICAgIHtuYW1lOiAiamF2YXNjcmlwdCIsIGpzb25sZDogdHJ1ZX0KICApOwogIGZ1bmN0aW9uIExEKG5hbWUpIHsKICAgIHRlc3QubW9kZShuYW1lLCBqc29ubGRfbW9kZSwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7CiAgfQoKICBMRCgianNvbl9sZF9rZXl3b3JkcyIsCiAgICAneycsCiAgICAnICBbbWV0YSAiQGNvbnRleHQiXTogeycsCiAgICAnICAgIFttZXRhICJAYmFzZSJdOiBbc3RyaW5nICJodHRwOi8vZXhhbXBsZS5jb20iXSwnLAogICAgJyAgICBbbWV0YSAiQHZvY2FiIl06IFtzdHJpbmcgImh0dHA6Ly94bWxucy5jb20vZm9hZi8wLjEvIl0sJywKICAgICcgICAgW3Byb3BlcnR5ICJsaWtlc0ZsYXZvciJdOiB7JywKICAgICcgICAgICBbbWV0YSAiQGNvbnRhaW5lciJdOiBbbWV0YSAiQGxpc3QiXScsCiAgICAnICAgICAgW21ldGEgIkByZXZlcnNlIl06IFtzdHJpbmcgIkBiZUZhdm9yaXRlT2YiXScsCiAgICAnICAgIH0sJywKICAgICcgICAgW3Byb3BlcnR5ICJuaWNrIl06IHsgW21ldGEgIkBjb250YWluZXIiXTogW21ldGEgIkBzZXQiXSB9LCcsCiAgICAnICAgIFtwcm9wZXJ0eSAibmljayJdOiB7IFttZXRhICJAY29udGFpbmVyIl06IFttZXRhICJAaW5kZXgiXSB9JywKICAgICcgIH0sJywKICAgICcgIFttZXRhICJAZ3JhcGgiXTogW1sgeycsCiAgICAnICAgIFttZXRhICJAaWQiXTogW3N0cmluZyAiaHR0cDovL2RicGVkaWEub3JnL3Jlc291cmNlL0pvaG5fTGVubm9uIl0sJywKICAgICcgICAgW3Byb3BlcnR5ICJuYW1lIl06IFtzdHJpbmcgIkpvaG4gTGVubm9uIl0sJywKICAgICcgICAgW3Byb3BlcnR5ICJtb2RpZmllZCJdOiB7JywKICAgICcgICAgICBbbWV0YSAiQHZhbHVlIl06IFtzdHJpbmcgIjIwMTAtMDUtMjlUMTQ6MTc6MzkrMDI6MDAiXSwnLAogICAgJyAgICAgIFttZXRhICJAdHlwZSJdOiBbc3RyaW5nICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYSNkYXRlVGltZSJdJywKICAgICcgICAgfScsCiAgICAnICB9IF1dJywKICAgICd9Jyk7CgogIExEKCJqc29uX2xkX2Zha2UiLAogICAgJ3snLAogICAgJyAgW3Byb3BlcnR5ICJAZmFrZSJdOiBbc3RyaW5nICJAZmFrZSJdLCcsCiAgICAnICBbcHJvcGVydHkgIkBjb250ZXh0dWFsIl06IFtzdHJpbmcgIkBpZGVudGlmaWVyIl0sJywKICAgICcgIFtwcm9wZXJ0eSAidXNlckBkb21haW4uY29tIl06IFtzdHJpbmcgIkBncmFwaGljYWwiXSwnLAogICAgJyAgW3Byb3BlcnR5ICJASUQiXTogW3N0cmluZyAiQEBJRCJdJywKICAgICd9Jyk7Cn0pKCk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/javascript/typescript.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogVHlwZVNjcmlwdCBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9ImphdmFzY3JpcHQuanMiPjwvc2NyaXB0Pgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPi5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazt9PC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aW1nIGlkPWxvZ28gc3JjPSIuLi8uLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5MYW5ndWFnZSBtb2RlczwvYT4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+VHlwZVNjcmlwdDwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+VHlwZVNjcmlwdCBtb2RlPC9oMj4KCgo8ZGl2Pjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+CmNsYXNzIEdyZWV0ZXIgewoJZ3JlZXRpbmc6IHN0cmluZzsKCWNvbnN0cnVjdG9yIChtZXNzYWdlOiBzdHJpbmcpIHsKCQl0aGlzLmdyZWV0aW5nID0gbWVzc2FnZTsKCX0KCWdyZWV0KCkgewoJCXJldHVybiAiSGVsbG8sICIgKyB0aGlzLmdyZWV0aW5nOwoJfQp9ICAgCgp2YXIgZ3JlZXRlciA9IG5ldyBHcmVldGVyKCJ3b3JsZCIpOwoKdmFyIGJ1dHRvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpCmJ1dHRvbi5pbm5lclRleHQgPSAiU2F5IEhlbGxvIgpidXR0b24ub25jbGljayA9IGZ1bmN0aW9uKCkgewoJYWxlcnQoZ3JlZXRlci5ncmVldCgpKQp9Cgpkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGJ1dHRvbikKCjwvdGV4dGFyZWE+PC9kaXY+CgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgICAgICBtYXRjaEJyYWNrZXRzOiB0cnVlLAogICAgICAgIG1vZGU6ICJ0ZXh0L3R5cGVzY3JpcHQiCiAgICAgIH0pOwogICAgPC9zY3JpcHQ+CgogICAgPHA+VGhpcyBpcyBhIHNwZWNpYWxpemF0aW9uIG9mIHRoZSA8YSBocmVmPSJpbmRleC5odG1sIj5KYXZhU2NyaXB0IG1vZGU8L2E+LjwvcD4KICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/jinja2/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/jinja2/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogSmluamEyIG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iamluamEyLmpzIj48L3NjcmlwdD4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4uQ29kZU1pcnJvciB7Ym9yZGVyLXRvcDogMXB4IHNvbGlkIGJsYWNrOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGltZyBpZD1sb2dvIHNyYz0iLi4vLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+TGFuZ3VhZ2UgbW9kZXM8L2E+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPkppbmphMjwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+SmluamEyIG1vZGU8L2gyPgo8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgp7IyB0aGlzIGlzIGEgY29tbWVudCAjfQp7JS0gZm9yIGl0ZW0gaW4gbGkgLSV9CiAgJmx0O2xpJmd0O3t7IGl0ZW0ubGFiZWwgfX0mbHQ7L2xpJmd0Owp7JSBlbmRmb3IgLSV9Cnt7IGl0ZW0uc2FuZCA9PSB0cnVlIGFuZCBpdGVtLmtleXdvcmQgPT0gZmFsc2UgPyAxIDogMCB9fQp7eyBhcHAuZ2V0KDU1LCAxLjIsIHRydWUpIH19CnslIGlmIGFwcC5nZXQoJiMzOTtfcm91dGUmIzM5OykgPT0gKCYjMzk7X2hvbWUmIzM5OykgJX1ob21leyUgZW5kaWYgJX0KeyUgaWYgYXBwLnNlc3Npb24uZmxhc2hiYWcuaGFzKCYjMzk7bWVzc2FnZSYjMzk7KSAlfQogIHslIGZvciBtZXNzYWdlIGluIGFwcC5zZXNzaW9uLmZsYXNoYmFnLmdldCgmIzM5O21lc3NhZ2UmIzM5OykgJX0KICAgIHt7IG1lc3NhZ2UuY29udGVudCB9fQogIHslIGVuZGZvciAlfQp7JSBlbmRpZiAlfQp7eyBwYXRoKCYjMzk7X2hvbWUmIzM5OywgeyYjMzk7c2VjdGlvbiYjMzk7OiBhcHAucmVxdWVzdC5nZXQoJiMzOTtzZWN0aW9uJiMzOTspfSkgfX0Ke3sgcGF0aCgmIzM5O19ob21lJiMzOTssIHsKICAgICYjMzk7c2VjdGlvbiYjMzk7OiBhcHAucmVxdWVzdC5nZXQoJiMzOTtzZWN0aW9uJiMzOTspLAogICAgJiMzOTtib29sZWFuJiMzOTs6IHRydWUsCiAgICAmIzM5O251bWJlciYjMzk7OiA1NS4zMwogIH0pCn19CnslIGluY2x1ZGUgKCYjMzk7dGVzdC5pbmNsLmh0bWwudHdpZyYjMzk7KSAlfQo8L3RleHRhcmVhPjwvZm9ybT4KICAgIDxzY3JpcHQ+CiAgICAgIHZhciBlZGl0b3IgPQogICAgICBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7bW9kZToKICAgICAgICB7bmFtZTogImppbmphMiIsIGh0bWxNb2RlOiB0cnVlfX0pOwogICAgPC9zY3JpcHQ+CiAgPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/jinja2/jinja2.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CgogIENvZGVNaXJyb3IuZGVmaW5lTW9kZSgiamluamEyIiwgZnVuY3Rpb24oKSB7CiAgICB2YXIga2V5d29yZHMgPSBbImFuZCIsICJhcyIsICJibG9jayIsICJlbmRibG9jayIsICJieSIsICJjeWNsZSIsICJkZWJ1ZyIsICJlbHNlIiwgImVsaWYiLAogICAgICAiZXh0ZW5kcyIsICJmaWx0ZXIiLCAiZW5kZmlsdGVyIiwgImZpcnN0b2YiLCAiZm9yIiwKICAgICAgImVuZGZvciIsICJpZiIsICJlbmRpZiIsICJpZmNoYW5nZWQiLCAiZW5kaWZjaGFuZ2VkIiwKICAgICAgImlmZXF1YWwiLCAiZW5kaWZlcXVhbCIsICJpZm5vdGVxdWFsIiwKICAgICAgImVuZGlmbm90ZXF1YWwiLCAiaW4iLCAiaW5jbHVkZSIsICJsb2FkIiwgIm5vdCIsICJub3ciLCAib3IiLAogICAgICAicGFyc2VkIiwgInJlZ3JvdXAiLCAicmV2ZXJzZWQiLCAic3BhY2VsZXNzIiwKICAgICAgImVuZHNwYWNlbGVzcyIsICJzc2kiLCAidGVtcGxhdGV0YWciLCAib3BlbmJsb2NrIiwKICAgICAgImNsb3NlYmxvY2siLCAib3BlbnZhcmlhYmxlIiwgImNsb3NldmFyaWFibGUiLAogICAgICAib3BlbmJyYWNlIiwgImNsb3NlYnJhY2UiLCAib3BlbmNvbW1lbnQiLAogICAgICAiY2xvc2Vjb21tZW50IiwgIndpZHRocmF0aW8iLCAidXJsIiwgIndpdGgiLCAiZW5kd2l0aCIsCiAgICAgICJnZXRfY3VycmVudF9sYW5ndWFnZSIsICJ0cmFucyIsICJlbmR0cmFucyIsICJub29wIiwgImJsb2NrdHJhbnMiLAogICAgICAiZW5kYmxvY2t0cmFucyIsICJnZXRfYXZhaWxhYmxlX2xhbmd1YWdlcyIsCiAgICAgICJnZXRfY3VycmVudF9sYW5ndWFnZV9iaWRpIiwgInBsdXJhbCJdLAogICAgb3BlcmF0b3IgPSAvXlsrXC0qJiU9PD4hP3x+Xl0vLAogICAgc2lnbiA9IC9eWzpcW1woXHtdLywKICAgIGF0b20gPSBbInRydWUiLCAiZmFsc2UiXSwKICAgIG51bWJlciA9IC9eKFxkWytcLVwqXC9dKT9cZCsoXC5cZCspPy87CgogICAga2V5d29yZHMgPSBuZXcgUmVnRXhwKCIoKCIgKyBrZXl3b3Jkcy5qb2luKCIpfCgiKSArICIpKVxcYiIpOwogICAgYXRvbSA9IG5ldyBSZWdFeHAoIigoIiArIGF0b20uam9pbigiKXwoIikgKyAiKSlcXGIiKTsKCiAgICBmdW5jdGlvbiB0b2tlbkJhc2UgKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgdmFyIGNoID0gc3RyZWFtLnBlZWsoKTsKCiAgICAgIC8vQ29tbWVudAogICAgICBpZiAoc3RhdGUuaW5jb21tZW50KSB7CiAgICAgICAgaWYoIXN0cmVhbS5za2lwVG8oIiN9IikpIHsKICAgICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc3RyZWFtLmVhdFdoaWxlKC9cI3x9Lyk7CiAgICAgICAgICBzdGF0ZS5pbmNvbW1lbnQgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICJjb21tZW50IjsKICAgICAgLy9UYWcKICAgICAgfSBlbHNlIGlmIChzdGF0ZS5pbnRhZykgewogICAgICAgIC8vQWZ0ZXIgb3BlcmF0b3IKICAgICAgICBpZihzdGF0ZS5vcGVyYXRvcikgewogICAgICAgICAgc3RhdGUub3BlcmF0b3IgPSBmYWxzZTsKICAgICAgICAgIGlmKHN0cmVhbS5tYXRjaChhdG9tKSkgewogICAgICAgICAgICByZXR1cm4gImF0b20iOwogICAgICAgICAgfQogICAgICAgICAgaWYoc3RyZWFtLm1hdGNoKG51bWJlcikpIHsKICAgICAgICAgICAgcmV0dXJuICJudW1iZXIiOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvL0FmdGVyIHNpZ24KICAgICAgICBpZihzdGF0ZS5zaWduKSB7CiAgICAgICAgICBzdGF0ZS5zaWduID0gZmFsc2U7CiAgICAgICAgICBpZihzdHJlYW0ubWF0Y2goYXRvbSkpIHsKICAgICAgICAgICAgcmV0dXJuICJhdG9tIjsKICAgICAgICAgIH0KICAgICAgICAgIGlmKHN0cmVhbS5tYXRjaChudW1iZXIpKSB7CiAgICAgICAgICAgIHJldHVybiAibnVtYmVyIjsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmKHN0YXRlLmluc3RyaW5nKSB7CiAgICAgICAgICBpZihjaCA9PSBzdGF0ZS5pbnN0cmluZykgewogICAgICAgICAgICBzdGF0ZS5pbnN0cmluZyA9IGZhbHNlOwogICAgICAgICAgfQogICAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgICAgIHJldHVybiAic3RyaW5nIjsKICAgICAgICB9IGVsc2UgaWYoY2ggPT0gIiciIHx8IGNoID09ICciJykgewogICAgICAgICAgc3RhdGUuaW5zdHJpbmcgPSBjaDsKICAgICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgICByZXR1cm4gInN0cmluZyI7CiAgICAgICAgfSBlbHNlIGlmKHN0cmVhbS5tYXRjaChzdGF0ZS5pbnRhZyArICJ9IikgfHwgc3RyZWFtLmVhdCgiLSIpICYmIHN0cmVhbS5tYXRjaChzdGF0ZS5pbnRhZyArICJ9IikpIHsKICAgICAgICAgIHN0YXRlLmludGFnID0gZmFsc2U7CiAgICAgICAgICByZXR1cm4gInRhZyI7CiAgICAgICAgfSBlbHNlIGlmKHN0cmVhbS5tYXRjaChvcGVyYXRvcikpIHsKICAgICAgICAgIHN0YXRlLm9wZXJhdG9yID0gdHJ1ZTsKICAgICAgICAgIHJldHVybiAib3BlcmF0b3IiOwogICAgICAgIH0gZWxzZSBpZihzdHJlYW0ubWF0Y2goc2lnbikpIHsKICAgICAgICAgIHN0YXRlLnNpZ24gPSB0cnVlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZihzdHJlYW0uZWF0KCIgIikgfHwgc3RyZWFtLnNvbCgpKSB7CiAgICAgICAgICAgIGlmKHN0cmVhbS5tYXRjaChrZXl3b3JkcykpIHsKICAgICAgICAgICAgICByZXR1cm4gImtleXdvcmQiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmKHN0cmVhbS5tYXRjaChhdG9tKSkgewogICAgICAgICAgICAgIHJldHVybiAiYXRvbSI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYoc3RyZWFtLm1hdGNoKG51bWJlcikpIHsKICAgICAgICAgICAgICByZXR1cm4gIm51bWJlciI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYoc3RyZWFtLnNvbCgpKSB7CiAgICAgICAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgICAgIH0KCiAgICAgICAgfQogICAgICAgIHJldHVybiAidmFyaWFibGUiOwogICAgICB9IGVsc2UgaWYgKHN0cmVhbS5lYXQoInsiKSkgewogICAgICAgIGlmIChjaCA9IHN0cmVhbS5lYXQoIiMiKSkgewogICAgICAgICAgc3RhdGUuaW5jb21tZW50ID0gdHJ1ZTsKICAgICAgICAgIGlmKCFzdHJlYW0uc2tpcFRvKCIjfSIpKSB7CiAgICAgICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvXCN8fS8pOwogICAgICAgICAgICBzdGF0ZS5pbmNvbW1lbnQgPSBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiAiY29tbWVudCI7CiAgICAgICAgLy9PcGVuIHRhZwogICAgICAgIH0gZWxzZSBpZiAoY2ggPSBzdHJlYW0uZWF0KC9ce3wlLykpIHsKICAgICAgICAgIC8vQ2FjaGUgY2xvc2UgdGFnCiAgICAgICAgICBzdGF0ZS5pbnRhZyA9IGNoOwogICAgICAgICAgaWYoY2ggPT0gInsiKSB7CiAgICAgICAgICAgIHN0YXRlLmludGFnID0gIn0iOwogICAgICAgICAgfQogICAgICAgICAgc3RyZWFtLmVhdCgiLSIpOwogICAgICAgICAgcmV0dXJuICJ0YWciOwogICAgICAgIH0KICAgICAgfQogICAgICBzdHJlYW0ubmV4dCgpOwogICAgfTsKCiAgICByZXR1cm4gewogICAgICBzdGFydFN0YXRlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIHt0b2tlbml6ZTogdG9rZW5CYXNlfTsKICAgICAgfSwKICAgICAgdG9rZW46IGZ1bmN0aW9uIChzdHJlYW0sIHN0YXRlKSB7CiAgICAgICAgcmV0dXJuIHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgICB9CiAgICB9OwogIH0pOwp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/julia/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/julia/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogSnVsaWEgbW9kZTwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uLy4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxzY3JpcHQgc3JjPSIuLi8uLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJqdWxpYS5qcyI+PC9zY3JpcHQ+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+LkNvZGVNaXJyb3Ige2JvcmRlci10b3A6IDFweCBzb2xpZCBibGFjazsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO308L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5KdWxpYTwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+SnVsaWEgbW9kZTwvaDI+CgogICAgPGRpdj48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgojbnVtYmVycwoxMjM0CjEyMzRpbQouMjM0Ci4yMzRpbQoyLjIzaW0KMi4zZjMKMjNlMgoweDIzNAoKI3N0cmluZ3MKJ2EnCiJhc2RmIgpyInJlZ2V4IgpiImJ5dGVzdHJpbmciCgoiIiIKbXVsdGlsaW5lIHN0cmluZwoiIiIKCiNpZGVudGlmaWVycwphCmFzMTIzCmZ1bmN0aW9uX25hbWUhCgojbGl0ZXJhbCBpZGVudGlmaWVyIG11bHRpcGxlcwozeAo0WzEsIDIsIDNdCgojZGljdHMgYW5kIGluZGV4aW5nCng9WzEsIDIsIDNdCnhbZW5kLTFdCng9eyJqdWxpYSI9PiJsYW5ndWFnZSBvZiB0ZWNobmljYWwgY29tcHV0aW5nIn0KCiNleGNlcHRpb24gaGFuZGxpbmcKdHJ5CiAgZigpCmNhdGNoCiAgQHByaW50ZiAiRXJyb3IiCmZpbmFsbHkKICBnKCkKZW5kCgojdHlwZXMKaW1tdXRhYmxlIENvbG9ye1Q8Ok51bWJlcn0KICByOjpUCiAgZzo6VAogIGI6OlQKZW5kCgojZnVuY3Rpb25zCmZ1bmN0aW9uIGNoYW5nZSEoeDo6VmVjdG9ye0Zsb2F0NjR9KQogIGZvciBpID0gMTpsZW5ndGgoeCkKICAgIHhbaV0gKj0gMgogIGVuZAplbmQKCiNmdW5jdGlvbiBpbnZvY2F0aW9uCmYoJ2InLCAoMiwgMykuLi4pCgojb3BlcmF0b3JzCnw9CiY9Cl49ClwtCiU9Cio9Cis9Ci09Cjw9Cj49CiE9Cj09CiUKKgorCi0KPAo+CiEKPQp8CiYKXgpcCj8Kfgo6CiQKPDoKLjwKLj4KPDwKPDw9Cj4+Cj4+Pj4KPj49Cj4+Pj0KPDw9Cjw8PD0KLjw9Ci4+PQouPT0KLT4KLy8KaW4KLi4uCi8vCjo9Ci4vLz0KLio9Ci4vPQouXj0KLiU9Ci4rPQouLT0KXD0KXFw9Cnx8Cj09PQomJgp8PQoufD0KPDoKPjoKfD4KPHwKOjoKeCA/IHkgOiB6CgojbWFjcm9zCkBzcGF3bmF0IDIgMSsxCkBldmFsKDp4KQoKI2tleXdvcmRzIGFuZCBvcGVyYXRvcnMKaWYgZWxzZSBlbHNlaWYgd2hpbGUgZm9yCiBiZWdpbiBsZXQgZW5kIGRvCnRyeSBjYXRjaCBmaW5hbGx5IHJldHVybiBicmVhayBjb250aW51ZQpnbG9iYWwgbG9jYWwgY29uc3QgCmV4cG9ydCBpbXBvcnQgaW1wb3J0YWxsIHVzaW5nCmZ1bmN0aW9uIG1hY3JvIG1vZHVsZSBiYXJlbW9kdWxlIAp0eXBlIGltbXV0YWJsZSBxdW90ZQp0cnVlIGZhbHNlIGVudW1lcmF0ZQoKCiAgICA8L3RleHRhcmVhPjwvZGl2PgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICBtb2RlOiB7bmFtZTogImp1bGlhIiwKICAgICAgICAgICAgICAgfSwKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgICAgICBpbmRlbnRVbml0OiA0LAogICAgICAgIG1hdGNoQnJhY2tldHM6IHRydWUKICAgICAgfSk7CiAgICA8L3NjcmlwdD4KCiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC94LWp1bGlhPC9jb2RlPi48L3A+CjwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/julia/julia.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJqdWxpYSIsIGZ1bmN0aW9uKF9jb25mLCBwYXJzZXJDb25mKSB7CiAgdmFyIEVSUk9SQ0xBU1MgPSAnZXJyb3InOwoKICBmdW5jdGlvbiB3b3JkUmVnZXhwKHdvcmRzKSB7CiAgICByZXR1cm4gbmV3IFJlZ0V4cCgiXigoIiArIHdvcmRzLmpvaW4oIil8KCIpICsgIikpXFxiIik7CiAgfQoKICB2YXIgb3BlcmF0b3JzID0gcGFyc2VyQ29uZi5vcGVyYXRvcnMgfHwgL15cLj9bfCZeXFwlKitcLTw+IT1cL109P3xcP3x+fDp8XCR8XC5bPD5dfDw8PT98Pj4+Pz0/fFwuWzw+PV09fC0+P3xcL1wvfFxiaW5cYi87CiAgdmFyIGRlbGltaXRlcnMgPSBwYXJzZXJDb25mLmRlbGltaXRlcnMgfHwgL15bOywoKVtcXXt9XS87CiAgdmFyIGlkZW50aWZpZXJzID0gcGFyc2VyQ29uZi5pZGVudGlmaWVyc3x8IC9eW19BLVphLXpdW19BLVphLXowLTldKiEqLzsKICB2YXIgYmxvY2tPcGVuZXJzID0gWyJiZWdpbiIsICJmdW5jdGlvbiIsICJ0eXBlIiwgImltbXV0YWJsZSIsICJsZXQiLCAibWFjcm8iLCAiZm9yIiwgIndoaWxlIiwgInF1b3RlIiwgImlmIiwgImVsc2UiLCAiZWxzZWlmIiwgInRyeSIsICJmaW5hbGx5IiwgImNhdGNoIiwgImRvIl07CiAgdmFyIGJsb2NrQ2xvc2VycyA9IFsiZW5kIiwgImVsc2UiLCAiZWxzZWlmIiwgImNhdGNoIiwgImZpbmFsbHkiXTsKICB2YXIga2V5d29yZExpc3QgPSBbJ2lmJywgJ2Vsc2UnLCAnZWxzZWlmJywgJ3doaWxlJywgJ2ZvcicsICdiZWdpbicsICdsZXQnLCAnZW5kJywgJ2RvJywgJ3RyeScsICdjYXRjaCcsICdmaW5hbGx5JywgJ3JldHVybicsICdicmVhaycsICdjb250aW51ZScsICdnbG9iYWwnLCAnbG9jYWwnLCAnY29uc3QnLCAnZXhwb3J0JywgJ2ltcG9ydCcsICdpbXBvcnRhbGwnLCAndXNpbmcnLCAnZnVuY3Rpb24nLCAnbWFjcm8nLCAnbW9kdWxlJywgJ2JhcmVtb2R1bGUnLCAndHlwZScsICdpbW11dGFibGUnLCAncXVvdGUnLCAndHlwZWFsaWFzJywgJ2Fic3RyYWN0JywgJ2JpdHN0eXBlJywgJ2NjYWxsJ107CiAgdmFyIGJ1aWx0aW5MaXN0ID0gWyd0cnVlJywgJ2ZhbHNlJywgJ2VudW1lcmF0ZScsICdvcGVuJywgJ2Nsb3NlJywgJ25vdGhpbmcnLCAnTmFOJywgJ0luZicsICdwcmludCcsICdwcmludGxuJywgJ0ludCcsICdJbnQ4JywgJ1VpbnQ4JywgJ0ludDE2JywgJ1VpbnQxNicsICdJbnQzMicsICdVaW50MzInLCAnSW50NjQnLCAnVWludDY0JywgJ0ludDEyOCcsICdVaW50MTI4JywgJ0Jvb2wnLCAnQ2hhcicsICdGbG9hdDE2JywgJ0Zsb2F0MzInLCAnRmxvYXQ2NCcsICdBcnJheScsICdWZWN0b3InLCAnTWF0cml4JywgJ1N0cmluZycsICdVVEY4U3RyaW5nJywgJ0FTQ0lJU3RyaW5nJywgJ2Vycm9yJywgJ3dhcm4nLCAnaW5mbycsICdAcHJpbnRmJ107CgogIC8vdmFyIHN0cmluZ1ByZWZpeGVzID0gbmV3IFJlZ0V4cCgiXlticl0/KCd8XCIpIikKICB2YXIgc3RyaW5nUHJlZml4ZXMgPSAvXihgfCd8InszfXwoW2JyXT8iKSkvOwogIHZhciBrZXl3b3JkcyA9IHdvcmRSZWdleHAoa2V5d29yZExpc3QpOwogIHZhciBidWlsdGlucyA9IHdvcmRSZWdleHAoYnVpbHRpbkxpc3QpOwogIHZhciBvcGVuZXJzID0gd29yZFJlZ2V4cChibG9ja09wZW5lcnMpOwogIHZhciBjbG9zZXJzID0gd29yZFJlZ2V4cChibG9ja0Nsb3NlcnMpOwogIHZhciBtYWNybyA9IC9eQFtfQS1aYS16XVtfQS1aYS16MC05XSovOwogIHZhciBzeW1ib2wgPSAvXjpbX0EtWmEtel1bX0EtWmEtejAtOV0qLzsKICB2YXIgaW5kZW50SW5mbyA9IG51bGw7CgogIGZ1bmN0aW9uIGluX2FycmF5KHN0YXRlKSB7CiAgICB2YXIgY2ggPSBjdXJfc2NvcGUoc3RhdGUpOwogICAgaWYoY2g9PSJbIiB8fCBjaD09InsiKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgZWxzZSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGN1cl9zY29wZShzdGF0ZSkgewogICAgaWYoc3RhdGUuc2NvcGVzLmxlbmd0aD09MCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHJldHVybiBzdGF0ZS5zY29wZXNbc3RhdGUuc2NvcGVzLmxlbmd0aCAtIDFdOwogIH0KCiAgLy8gdG9rZW5pemVycwogIGZ1bmN0aW9uIHRva2VuQmFzZShzdHJlYW0sIHN0YXRlKSB7CiAgICAvLyBIYW5kbGUgc2NvcGUgY2hhbmdlcwogICAgdmFyIGxlYXZpbmdfZXhwciA9IHN0YXRlLmxlYXZpbmdfZXhwcjsKICAgIGlmKHN0cmVhbS5zb2woKSkgewogICAgICBsZWF2aW5nX2V4cHIgPSBmYWxzZTsKICAgIH0KICAgIHN0YXRlLmxlYXZpbmdfZXhwciA9IGZhbHNlOwogICAgaWYobGVhdmluZ19leHByKSB7CiAgICAgIGlmKHN0cmVhbS5tYXRjaCgvXicrLykpIHsKICAgICAgICByZXR1cm4gJ29wZXJhdG9yJzsKICAgICAgfQoKICAgIH0KCiAgICBpZihzdHJlYW0ubWF0Y2goL15cLnsyLDN9LykpIHsKICAgICAgcmV0dXJuICdvcGVyYXRvcic7CiAgICB9CgogICAgaWYgKHN0cmVhbS5lYXRTcGFjZSgpKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIHZhciBjaCA9IHN0cmVhbS5wZWVrKCk7CiAgICAvLyBIYW5kbGUgQ29tbWVudHMKICAgIGlmIChjaCA9PT0gJyMnKSB7CiAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICAgIHJldHVybiAnY29tbWVudCc7CiAgICB9CiAgICBpZihjaD09PSdbJykgewogICAgICBzdGF0ZS5zY29wZXMucHVzaCgiWyIpOwogICAgfQoKICAgIGlmKGNoPT09J3snKSB7CiAgICAgIHN0YXRlLnNjb3Blcy5wdXNoKCJ7Iik7CiAgICB9CgogICAgdmFyIHNjb3BlPWN1cl9zY29wZShzdGF0ZSk7CgogICAgaWYoc2NvcGU9PT0nWycgJiYgY2g9PT0nXScpIHsKICAgICAgc3RhdGUuc2NvcGVzLnBvcCgpOwogICAgICBzdGF0ZS5sZWF2aW5nX2V4cHI9dHJ1ZTsKICAgIH0KCiAgICBpZihzY29wZT09PSd7JyAmJiBjaD09PSd9JykgewogICAgICBzdGF0ZS5zY29wZXMucG9wKCk7CiAgICAgIHN0YXRlLmxlYXZpbmdfZXhwcj10cnVlOwogICAgfQoKICAgIGlmKGNoPT09JyknKSB7CiAgICAgIHN0YXRlLmxlYXZpbmdfZXhwciA9IHRydWU7CiAgICB9CgogICAgdmFyIG1hdGNoOwogICAgaWYoIWluX2FycmF5KHN0YXRlKSAmJiAobWF0Y2g9c3RyZWFtLm1hdGNoKG9wZW5lcnMsIGZhbHNlKSkpIHsKICAgICAgc3RhdGUuc2NvcGVzLnB1c2gobWF0Y2gpOwogICAgfQoKICAgIGlmKCFpbl9hcnJheShzdGF0ZSkgJiYgc3RyZWFtLm1hdGNoKGNsb3NlcnMsIGZhbHNlKSkgewogICAgICBzdGF0ZS5zY29wZXMucG9wKCk7CiAgICB9CgogICAgaWYoaW5fYXJyYXkoc3RhdGUpKSB7CiAgICAgIGlmKHN0cmVhbS5tYXRjaCgvXmVuZC8pKSB7CiAgICAgICAgcmV0dXJuICdudW1iZXInOwogICAgICB9CgogICAgfQoKICAgIGlmKHN0cmVhbS5tYXRjaCgvXj0+LykpIHsKICAgICAgcmV0dXJuICdvcGVyYXRvcic7CiAgICB9CgoKICAgIC8vIEhhbmRsZSBOdW1iZXIgTGl0ZXJhbHMKICAgIGlmIChzdHJlYW0ubWF0Y2goL15bMC05XC5dLywgZmFsc2UpKSB7CiAgICAgIHZhciBpbU1hdGNoZXIgPSBSZWdFeHAoL15pbVxiLyk7CiAgICAgIHZhciBmbG9hdExpdGVyYWwgPSBmYWxzZTsKICAgICAgLy8gRmxvYXRzCiAgICAgIGlmIChzdHJlYW0ubWF0Y2goL15cZCpcLig/IVwuKVxkKyhbZWZdW1wrXC1dP1xkKyk/L2kpKSB7IGZsb2F0TGl0ZXJhbCA9IHRydWU7IH0KICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXlxkK1wuKD8hXC4pXGQqLykpIHsgZmxvYXRMaXRlcmFsID0gdHJ1ZTsgfQogICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eXC5cZCsvKSkgeyBmbG9hdExpdGVyYWwgPSB0cnVlOyB9CiAgICAgIGlmIChmbG9hdExpdGVyYWwpIHsKICAgICAgICAgIC8vIEZsb2F0IGxpdGVyYWxzIG1heSBiZSAiaW1hZ2luYXJ5IgogICAgICAgICAgc3RyZWFtLm1hdGNoKGltTWF0Y2hlcik7CiAgICAgICAgICBzdGF0ZS5sZWF2aW5nX2V4cHIgPSB0cnVlOwogICAgICAgICAgcmV0dXJuICdudW1iZXInOwogICAgICB9CiAgICAgIC8vIEludGVnZXJzCiAgICAgIHZhciBpbnRMaXRlcmFsID0gZmFsc2U7CiAgICAgIC8vIEhleAogICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eMHhbMC05YS1mXSsvaSkpIHsgaW50TGl0ZXJhbCA9IHRydWU7IH0KICAgICAgLy8gQmluYXJ5CiAgICAgIGlmIChzdHJlYW0ubWF0Y2goL14wYlswMV0rL2kpKSB7IGludExpdGVyYWwgPSB0cnVlOyB9CiAgICAgIC8vIE9jdGFsCiAgICAgIGlmIChzdHJlYW0ubWF0Y2goL14wb1swLTddKy9pKSkgeyBpbnRMaXRlcmFsID0gdHJ1ZTsgfQogICAgICAvLyBEZWNpbWFsCiAgICAgIGlmIChzdHJlYW0ubWF0Y2goL15bMS05XVxkKihlW1wrXC1dP1xkKyk/LykpIHsKICAgICAgICAgIGludExpdGVyYWwgPSB0cnVlOwogICAgICB9CiAgICAgIC8vIFplcm8gYnkgaXRzZWxmIHdpdGggbm8gb3RoZXIgcGllY2Ugb2YgbnVtYmVyLgogICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eMCg/IVtcZHhdKS9pKSkgeyBpbnRMaXRlcmFsID0gdHJ1ZTsgfQogICAgICBpZiAoaW50TGl0ZXJhbCkgewogICAgICAgICAgLy8gSW50ZWdlciBsaXRlcmFscyBtYXkgYmUgImxvbmciCiAgICAgICAgICBzdHJlYW0ubWF0Y2goaW1NYXRjaGVyKTsKICAgICAgICAgIHN0YXRlLmxlYXZpbmdfZXhwciA9IHRydWU7CiAgICAgICAgICByZXR1cm4gJ251bWJlcic7CiAgICAgIH0KICAgIH0KCiAgICBpZihzdHJlYW0ubWF0Y2goL14oOjopfCg8OikvKSkgewogICAgICByZXR1cm4gJ29wZXJhdG9yJzsKICAgIH0KCiAgICAvLyBIYW5kbGUgc3ltYm9scwogICAgaWYoIWxlYXZpbmdfZXhwciAmJiBzdHJlYW0ubWF0Y2goc3ltYm9sKSkgewogICAgICByZXR1cm4gJ3N0cmluZyc7CiAgICB9CgogICAgLy8gSGFuZGxlIG9wZXJhdG9ycyBhbmQgRGVsaW1pdGVycwogICAgaWYgKHN0cmVhbS5tYXRjaChvcGVyYXRvcnMpKSB7CiAgICAgIHJldHVybiAnb3BlcmF0b3InOwogICAgfQoKCiAgICAvLyBIYW5kbGUgU3RyaW5ncwogICAgaWYgKHN0cmVhbS5tYXRjaChzdHJpbmdQcmVmaXhlcykpIHsKICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlblN0cmluZ0ZhY3Rvcnkoc3RyZWFtLmN1cnJlbnQoKSk7CiAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgIH0KCiAgICBpZiAoc3RyZWFtLm1hdGNoKG1hY3JvKSkgewogICAgICByZXR1cm4gJ21ldGEnOwogICAgfQoKCiAgICBpZiAoc3RyZWFtLm1hdGNoKGRlbGltaXRlcnMpKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIGlmIChzdHJlYW0ubWF0Y2goa2V5d29yZHMpKSB7CiAgICAgIHJldHVybiAna2V5d29yZCc7CiAgICB9CgogICAgaWYgKHN0cmVhbS5tYXRjaChidWlsdGlucykpIHsKICAgICAgcmV0dXJuICdidWlsdGluJzsKICAgIH0KCgogICAgaWYgKHN0cmVhbS5tYXRjaChpZGVudGlmaWVycykpIHsKICAgICAgc3RhdGUubGVhdmluZ19leHByPXRydWU7CiAgICAgIHJldHVybiAndmFyaWFibGUnOwogICAgfQogICAgLy8gSGFuZGxlIG5vbi1kZXRlY3RlZCBpdGVtcwogICAgc3RyZWFtLm5leHQoKTsKICAgIHJldHVybiBFUlJPUkNMQVNTOwogIH0KCiAgZnVuY3Rpb24gdG9rZW5TdHJpbmdGYWN0b3J5KGRlbGltaXRlcikgewogICAgd2hpbGUgKCdydWInLmluZGV4T2YoZGVsaW1pdGVyLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpKSA+PSAwKSB7CiAgICAgIGRlbGltaXRlciA9IGRlbGltaXRlci5zdWJzdHIoMSk7CiAgICB9CiAgICB2YXIgc2luZ2xlbGluZSA9IGRlbGltaXRlci5sZW5ndGggPT0gMTsKICAgIHZhciBPVVRDTEFTUyA9ICdzdHJpbmcnOwoKICAgIGZ1bmN0aW9uIHRva2VuU3RyaW5nKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgd2hpbGUgKCFzdHJlYW0uZW9sKCkpIHsKICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1teJyJcXF0vKTsKICAgICAgICBpZiAoc3RyZWFtLmVhdCgnXFwnKSkgewogICAgICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgICAgICBpZiAoc2luZ2xlbGluZSAmJiBzdHJlYW0uZW9sKCkpIHsKICAgICAgICAgICAgICByZXR1cm4gT1VUQ0xBU1M7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHN0cmVhbS5tYXRjaChkZWxpbWl0ZXIpKSB7CiAgICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlOwogICAgICAgICAgICByZXR1cm4gT1VUQ0xBU1M7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3RyZWFtLmVhdCgvWyciXS8pOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoc2luZ2xlbGluZSkgewogICAgICAgIGlmIChwYXJzZXJDb25mLnNpbmdsZUxpbmVTdHJpbmdFcnJvcnMpIHsKICAgICAgICAgICAgcmV0dXJuIEVSUk9SQ0xBU1M7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBPVVRDTEFTUzsKICAgIH0KICAgIHRva2VuU3RyaW5nLmlzU3RyaW5nID0gdHJ1ZTsKICAgIHJldHVybiB0b2tlblN0cmluZzsKICB9CgogIGZ1bmN0aW9uIHRva2VuTGV4ZXIoc3RyZWFtLCBzdGF0ZSkgewogICAgaW5kZW50SW5mbyA9IG51bGw7CiAgICB2YXIgc3R5bGUgPSBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgIHZhciBjdXJyZW50ID0gc3RyZWFtLmN1cnJlbnQoKTsKCiAgICAvLyBIYW5kbGUgJy4nIGNvbm5lY3RlZCBpZGVudGlmaWVycwogICAgaWYgKGN1cnJlbnQgPT09ICcuJykgewogICAgICBzdHlsZSA9IHN0cmVhbS5tYXRjaChpZGVudGlmaWVycywgZmFsc2UpID8gbnVsbCA6IEVSUk9SQ0xBU1M7CiAgICAgIGlmIChzdHlsZSA9PT0gbnVsbCAmJiBzdGF0ZS5sYXN0U3R5bGUgPT09ICdtZXRhJykgewogICAgICAgICAgLy8gQXBwbHkgJ21ldGEnIHN0eWxlIHRvICcuJyBjb25uZWN0ZWQgaWRlbnRpZmllcnMgd2hlbgogICAgICAgICAgLy8gYXBwcm9wcmlhdGUuCiAgICAgICAgc3R5bGUgPSAnbWV0YSc7CiAgICAgIH0KICAgICAgcmV0dXJuIHN0eWxlOwogICAgfQoKICAgIHJldHVybiBzdHlsZTsKICB9CgogIHZhciBleHRlcm5hbCA9IHsKICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gewogICAgICAgIHRva2VuaXplOiB0b2tlbkJhc2UsCiAgICAgICAgc2NvcGVzOiBbXSwKICAgICAgICBsZWF2aW5nX2V4cHI6IGZhbHNlCiAgICAgIH07CiAgICB9LAoKICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHZhciBzdHlsZSA9IHRva2VuTGV4ZXIoc3RyZWFtLCBzdGF0ZSk7CiAgICAgIHN0YXRlLmxhc3RTdHlsZSA9IHN0eWxlOwogICAgICByZXR1cm4gc3R5bGU7CiAgICB9LAoKICAgIGluZGVudDogZnVuY3Rpb24oc3RhdGUsIHRleHRBZnRlcikgewogICAgICB2YXIgZGVsdGEgPSAwOwogICAgICBpZih0ZXh0QWZ0ZXI9PSJlbmQiIHx8IHRleHRBZnRlcj09Il0iIHx8IHRleHRBZnRlcj09In0iIHx8IHRleHRBZnRlcj09ImVsc2UiIHx8IHRleHRBZnRlcj09ImVsc2VpZiIgfHwgdGV4dEFmdGVyPT0iY2F0Y2giIHx8IHRleHRBZnRlcj09ImZpbmFsbHkiKSB7CiAgICAgICAgZGVsdGEgPSAtMTsKICAgICAgfQogICAgICByZXR1cm4gKHN0YXRlLnNjb3Blcy5sZW5ndGggKyBkZWx0YSkgKiA0OwogICAgfSwKCiAgICBsaW5lQ29tbWVudDogIiMiLAogICAgZm9sZDogImluZGVudCIsCiAgICBlbGVjdHJpY0NoYXJzOiAiZWRsc2lmeWhdfSIKICB9OwogIHJldHVybiBleHRlcm5hbDsKfSk7CgoKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtanVsaWEiLCAianVsaWEiKTsKCn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/kotlin/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/kotlin/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogS290bGluIG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0ia290bGluLmpzIj48L3NjcmlwdD4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4uQ29kZU1pcnJvciB7Ym9yZGVyLXRvcDogMXB4IHNvbGlkIGJsYWNrOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGltZyBpZD1sb2dvIHNyYz0iLi4vLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+TGFuZ3VhZ2UgbW9kZXM8L2E+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPktvdGxpbjwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+S290bGluIG1vZGU8L2gyPgoKCjxkaXY+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KcGFja2FnZSBvcmcud2FzYWJpLmh0dHAKCmltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnMKaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzCmltcG9ydCBvcmcud2FzYWJpLmFwcC5BcHBDb25maWd1cmF0aW9uCmltcG9ydCBpby5uZXR0eS5ib290c3RyYXAuU2VydmVyQm9vdHN0cmFwCmltcG9ydCBpby5uZXR0eS5jaGFubmVsLm5pby5OaW9FdmVudExvb3BHcm91cAppbXBvcnQgaW8ubmV0dHkuY2hhbm5lbC5zb2NrZXQubmlvLk5pb1NlcnZlclNvY2tldENoYW5uZWwKaW1wb3J0IG9yZy53YXNhYmkuYXBwLkFwcFNlcnZlcgoKcHVibGljIGNsYXNzIEh0dHBTZXJ2ZXIocHJpdmF0ZSB2YWwgYXBwU2VydmVyOiBBcHBTZXJ2ZXIpIHsKCiAgICB2YWwgYm9vdHN0cmFwOiBTZXJ2ZXJCb290c3RyYXAKICAgIHZhbCBwcmltYXJ5R3JvdXA6IE5pb0V2ZW50TG9vcEdyb3VwCiAgICB2YWwgd29ya2VyR3JvdXA6ICBOaW9FdmVudExvb3BHcm91cAoKICAgIHsKICAgICAgICAvLyBEZWZpbmUgd29ya2VyIGdyb3VwcwogICAgICAgIHByaW1hcnlHcm91cCA9IE5pb0V2ZW50TG9vcEdyb3VwKCkKICAgICAgICB3b3JrZXJHcm91cCA9IE5pb0V2ZW50TG9vcEdyb3VwKCkKCiAgICAgICAgLy8gSW5pdGlhbGl6ZSBib290c3RyYXAgb2Ygc2VydmVyCiAgICAgICAgYm9vdHN0cmFwID0gU2VydmVyQm9vdHN0cmFwKCkKCiAgICAgICAgYm9vdHN0cmFwLmdyb3VwKHByaW1hcnlHcm91cCwgd29ya2VyR3JvdXApCiAgICAgICAgYm9vdHN0cmFwLmNoYW5uZWwoamF2YUNsYXNzPE5pb1NlcnZlclNvY2tldENoYW5uZWw+KCkpCiAgICAgICAgYm9vdHN0cmFwLmNoaWxkSGFuZGxlcihOZXR0eVBpcGVsaW5lSW5pdGlhbGl6ZXIoYXBwU2VydmVyKSkKICAgIH0KCiAgICBwdWJsaWMgZnVuIHN0YXJ0KHdhaXQ6IEJvb2xlYW4gPSB0cnVlKSB7CiAgICAgICAgdmFsIGNoYW5uZWwgPSBib290c3RyYXAuYmluZChhcHBTZXJ2ZXIuY29uZmlndXJhdGlvbi5wb3J0KT8uc3luYygpPy5jaGFubmVsKCkKCiAgICAgICAgaWYgKHdhaXQpIHsKICAgICAgICAgICAgY2hhbm5lbD8uY2xvc2VGdXR1cmUoKT8uc3luYygpCiAgICAgICAgfQogICAgfQoKICAgIHB1YmxpYyBmdW4gc3RvcCgpIHsKICAgICAgICAvLyBTaHV0ZG93biBhbGwgZXZlbnQgbG9vcHMKICAgICAgICBwcmltYXJ5R3JvdXAuc2h1dGRvd25HcmFjZWZ1bGx5KCkKICAgICAgICB3b3JrZXJHcm91cC5zaHV0ZG93bkdyYWNlZnVsbHkoKQoKICAgICAgICAvLyBXYWl0IHRpbGwgYWxsIHRocmVhZHMgYXJlIHRlcm1pbmF0ZWQKICAgICAgICBwcmltYXJ5R3JvdXAudGVybWluYXRpb25GdXR1cmUoKS5zeW5jKCkKICAgICAgICB3b3JrZXJHcm91cC50ZXJtaW5hdGlvbkZ1dHVyZSgpLnN5bmMoKQogICAgfQp9CjwvdGV4dGFyZWE+PC9kaXY+CgogICAgPHNjcmlwdD4KICAgICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgICAgICAgICBtb2RlOiB7bmFtZTogImtvdGxpbiJ9LAogICAgICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgICAgICAgICAgaW5kZW50VW5pdDogNAogICAgICAgIH0pOwogICAgPC9zY3JpcHQ+CiAgICA8aDM+TW9kZSBmb3IgS290bGluIChodHRwOi8va290bGluLmpldGJyYWlucy5vcmcvKTwvaDM+CiAgICA8cD5EZXZlbG9wZWQgYnkgSGFkaSBIYXJpcmkgKGh0dHBzOi8vZ2l0aHViLmNvbS9oaGFyaXJpKS48L3A+CiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZSBkZWZpbmVkOjwvc3Ryb25nPiA8Y29kZT50ZXh0L3gta290bGluPC9jb2RlPi48L3A+CjwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/kotlin/kotlin.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJrb3RsaW4iLCBmdW5jdGlvbiAoY29uZmlnLCBwYXJzZXJDb25maWcpIHsKICBmdW5jdGlvbiB3b3JkcyhzdHIpIHsKICAgIHZhciBvYmogPSB7fSwgd29yZHMgPSBzdHIuc3BsaXQoIiAiKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgd29yZHMubGVuZ3RoOyArK2kpIG9ialt3b3Jkc1tpXV0gPSB0cnVlOwogICAgcmV0dXJuIG9iajsKICB9CgogIHZhciBtdWx0aUxpbmVTdHJpbmdzID0gcGFyc2VyQ29uZmlnLm11bHRpTGluZVN0cmluZ3M7CgogIHZhciBrZXl3b3JkcyA9IHdvcmRzKAogICAgICAgICAgInBhY2thZ2UgY29udGludWUgcmV0dXJuIG9iamVjdCB3aGlsZSBicmVhayBjbGFzcyBkYXRhIHRyYWl0IHRocm93IHN1cGVyIiArCiAgICAgICAgICAiIHdoZW4gdHlwZSB0aGlzIGVsc2UgVGhpcyB0cnkgdmFsIHZhciBmdW4gZm9yIGlzIGluIGlmIGRvIGFzIHRydWUgZmFsc2UgbnVsbCBnZXQgc2V0Iik7CiAgdmFyIHNvZnRLZXl3b3JkcyA9IHdvcmRzKCJpbXBvcnQiICsKICAgICAgIiB3aGVyZSBieSBnZXQgc2V0IGFic3RyYWN0IGVudW0gb3BlbiBhbm5vdGF0aW9uIG92ZXJyaWRlIHByaXZhdGUgcHVibGljIGludGVybmFsIiArCiAgICAgICIgcHJvdGVjdGVkIGNhdGNoIG91dCB2YXJhcmcgaW5saW5lIGZpbmFsbHkgZmluYWwgcmVmIik7CiAgdmFyIGJsb2NrS2V5d29yZHMgPSB3b3JkcygiY2F0Y2ggY2xhc3MgZG8gZWxzZSBmaW5hbGx5IGZvciBpZiB3aGVyZSB0cnkgd2hpbGUgZW51bSIpOwogIHZhciBhdG9tcyA9IHdvcmRzKCJudWxsIHRydWUgZmFsc2UgdGhpcyIpOwoKICB2YXIgY3VyUHVuYzsKCiAgZnVuY3Rpb24gdG9rZW5CYXNlKHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBjaCA9IHN0cmVhbS5uZXh0KCk7CiAgICBpZiAoY2ggPT0gJyInIHx8IGNoID09ICInIikgewogICAgICByZXR1cm4gc3RhcnRTdHJpbmcoY2gsIHN0cmVhbSwgc3RhdGUpOwogICAgfQogICAgLy8gV2lsZGNhcmQgaW1wb3J0IHcvbyB0cmFpbGluZyBzZW1pY29sb24gKGltcG9ydCBzbXRoLiopCiAgICBpZiAoY2ggPT0gIi4iICYmIHN0cmVhbS5lYXQoIioiKSkgewogICAgICByZXR1cm4gIndvcmQiOwogICAgfQogICAgaWYgKC9bXFtcXXt9XChcKSw7XDpcLl0vLnRlc3QoY2gpKSB7CiAgICAgIGN1clB1bmMgPSBjaDsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBpZiAoL1xkLy50ZXN0KGNoKSkgewogICAgICBpZiAoc3RyZWFtLmVhdCgvZUUvKSkgewogICAgICAgIHN0cmVhbS5lYXQoL1wrXC0vKTsKICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1xkLyk7CiAgICAgIH0KICAgICAgcmV0dXJuICJudW1iZXIiOwogICAgfQogICAgaWYgKGNoID09ICIvIikgewogICAgICBpZiAoc3RyZWFtLmVhdCgiKiIpKSB7CiAgICAgICAgc3RhdGUudG9rZW5pemUucHVzaCh0b2tlbkNvbW1lbnQpOwogICAgICAgIHJldHVybiB0b2tlbkNvbW1lbnQoc3RyZWFtLCBzdGF0ZSk7CiAgICAgIH0KICAgICAgaWYgKHN0cmVhbS5lYXQoIi8iKSkgewogICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgICByZXR1cm4gImNvbW1lbnQiOwogICAgICB9CiAgICAgIGlmIChleHBlY3RFeHByZXNzaW9uKHN0YXRlLmxhc3RUb2tlbikpIHsKICAgICAgICByZXR1cm4gc3RhcnRTdHJpbmcoY2gsIHN0cmVhbSwgc3RhdGUpOwogICAgICB9CiAgICB9CiAgICAvLyBDb21tZW50ZWQKICAgIGlmIChjaCA9PSAiLSIgJiYgc3RyZWFtLmVhdCgiPiIpKSB7CiAgICAgIGN1clB1bmMgPSAiLT4iOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGlmICgvW1wtKyomJT08PiE/fFwvfl0vLnRlc3QoY2gpKSB7CiAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1wtKyomJT08Pnx+XS8pOwogICAgICByZXR1cm4gIm9wZXJhdG9yIjsKICAgIH0KICAgIHN0cmVhbS5lYXRXaGlsZSgvW1x3XCRfXS8pOwoKICAgIHZhciBjdXIgPSBzdHJlYW0uY3VycmVudCgpOwogICAgaWYgKGF0b21zLnByb3BlcnR5SXNFbnVtZXJhYmxlKGN1cikpIHsKICAgICAgcmV0dXJuICJhdG9tIjsKICAgIH0KICAgIGlmIChzb2Z0S2V5d29yZHMucHJvcGVydHlJc0VudW1lcmFibGUoY3VyKSkgewogICAgICBpZiAoYmxvY2tLZXl3b3Jkcy5wcm9wZXJ0eUlzRW51bWVyYWJsZShjdXIpKSBjdXJQdW5jID0gIm5ld3N0YXRlbWVudCI7CiAgICAgIHJldHVybiAic29mdEtleXdvcmQiOwogICAgfQoKICAgIGlmIChrZXl3b3Jkcy5wcm9wZXJ0eUlzRW51bWVyYWJsZShjdXIpKSB7CiAgICAgIGlmIChibG9ja0tleXdvcmRzLnByb3BlcnR5SXNFbnVtZXJhYmxlKGN1cikpIGN1clB1bmMgPSAibmV3c3RhdGVtZW50IjsKICAgICAgcmV0dXJuICJrZXl3b3JkIjsKICAgIH0KICAgIHJldHVybiAid29yZCI7CiAgfQoKICB0b2tlbkJhc2UuaXNCYXNlID0gdHJ1ZTsKCiAgZnVuY3Rpb24gc3RhcnRTdHJpbmcocXVvdGUsIHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciB0cmlwbGVRdW90ZWQgPSBmYWxzZTsKICAgIGlmIChxdW90ZSAhPSAiLyIgJiYgc3RyZWFtLmVhdChxdW90ZSkpIHsKICAgICAgaWYgKHN0cmVhbS5lYXQocXVvdGUpKSB0cmlwbGVRdW90ZWQgPSB0cnVlOwogICAgICBlbHNlIHJldHVybiAic3RyaW5nIjsKICAgIH0KICAgIGZ1bmN0aW9uIHQoc3RyZWFtLCBzdGF0ZSkgewogICAgICB2YXIgZXNjYXBlZCA9IGZhbHNlLCBuZXh0LCBlbmQgPSAhdHJpcGxlUXVvdGVkOwoKICAgICAgd2hpbGUgKChuZXh0ID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkgewogICAgICAgIGlmIChuZXh0ID09IHF1b3RlICYmICFlc2NhcGVkKSB7CiAgICAgICAgICBpZiAoIXRyaXBsZVF1b3RlZCkgewogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChzdHJlYW0ubWF0Y2gocXVvdGUgKyBxdW90ZSkpIHsKICAgICAgICAgICAgZW5kID0gdHJ1ZTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAocXVvdGUgPT0gJyInICYmIG5leHQgPT0gIiQiICYmICFlc2NhcGVkICYmIHN0cmVhbS5lYXQoInsiKSkgewogICAgICAgICAgc3RhdGUudG9rZW5pemUucHVzaCh0b2tlbkJhc2VVbnRpbEJyYWNlKCkpOwogICAgICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgICAgIH0KCiAgICAgICAgaWYgKG5leHQgPT0gIiQiICYmICFlc2NhcGVkICYmICFzdHJlYW0uZWF0KCIgIikpIHsKICAgICAgICAgIHN0YXRlLnRva2VuaXplLnB1c2godG9rZW5CYXNlVW50aWxTcGFjZSgpKTsKICAgICAgICAgIHJldHVybiAic3RyaW5nIjsKICAgICAgICB9CiAgICAgICAgZXNjYXBlZCA9ICFlc2NhcGVkICYmIG5leHQgPT0gIlxcIjsKICAgICAgfQogICAgICBpZiAobXVsdGlMaW5lU3RyaW5ncykKICAgICAgICBzdGF0ZS50b2tlbml6ZS5wdXNoKHQpOwogICAgICBpZiAoZW5kKSBzdGF0ZS50b2tlbml6ZS5wb3AoKTsKICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgfQoKICAgIHN0YXRlLnRva2VuaXplLnB1c2godCk7CiAgICByZXR1cm4gdChzdHJlYW0sIHN0YXRlKTsKICB9CgogIGZ1bmN0aW9uIHRva2VuQmFzZVVudGlsQnJhY2UoKSB7CiAgICB2YXIgZGVwdGggPSAxOwoKICAgIGZ1bmN0aW9uIHQoc3RyZWFtLCBzdGF0ZSkgewogICAgICBpZiAoc3RyZWFtLnBlZWsoKSA9PSAifSIpIHsKICAgICAgICBkZXB0aC0tOwogICAgICAgIGlmIChkZXB0aCA9PSAwKSB7CiAgICAgICAgICBzdGF0ZS50b2tlbml6ZS5wb3AoKTsKICAgICAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZVtzdGF0ZS50b2tlbml6ZS5sZW5ndGggLSAxXShzdHJlYW0sIHN0YXRlKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLnBlZWsoKSA9PSAieyIpIHsKICAgICAgICBkZXB0aCsrOwogICAgICB9CiAgICAgIHJldHVybiB0b2tlbkJhc2Uoc3RyZWFtLCBzdGF0ZSk7CiAgICB9CgogICAgdC5pc0Jhc2UgPSB0cnVlOwogICAgcmV0dXJuIHQ7CiAgfQoKICBmdW5jdGlvbiB0b2tlbkJhc2VVbnRpbFNwYWNlKCkgewogICAgZnVuY3Rpb24gdChzdHJlYW0sIHN0YXRlKSB7CiAgICAgIGlmIChzdHJlYW0uZWF0KC9bXHddLykpIHsKICAgICAgICB2YXIgaXNXb3JkID0gc3RyZWFtLmVhdFdoaWxlKC9bXHddLyk7CiAgICAgICAgaWYgKGlzV29yZCkgewogICAgICAgICAgc3RhdGUudG9rZW5pemUucG9wKCk7CiAgICAgICAgICByZXR1cm4gIndvcmQiOwogICAgICAgIH0KICAgICAgfQogICAgICBzdGF0ZS50b2tlbml6ZS5wb3AoKTsKICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgfQoKICAgIHQuaXNCYXNlID0gdHJ1ZTsKICAgIHJldHVybiB0OwogIH0KCiAgZnVuY3Rpb24gdG9rZW5Db21tZW50KHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBtYXliZUVuZCA9IGZhbHNlLCBjaDsKICAgIHdoaWxlIChjaCA9IHN0cmVhbS5uZXh0KCkpIHsKICAgICAgaWYgKGNoID09ICIvIiAmJiBtYXliZUVuZCkgewogICAgICAgIHN0YXRlLnRva2VuaXplLnBvcCgpOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIG1heWJlRW5kID0gKGNoID09ICIqIik7CiAgICB9CiAgICByZXR1cm4gImNvbW1lbnQiOwogIH0KCiAgZnVuY3Rpb24gZXhwZWN0RXhwcmVzc2lvbihsYXN0KSB7CiAgICByZXR1cm4gIWxhc3QgfHwgbGFzdCA9PSAib3BlcmF0b3IiIHx8IGxhc3QgPT0gIi0+IiB8fCAvW1wuXFtce1woLDs6XS8udGVzdChsYXN0KSB8fAogICAgICAgIGxhc3QgPT0gIm5ld3N0YXRlbWVudCIgfHwgbGFzdCA9PSAia2V5d29yZCIgfHwgbGFzdCA9PSAicHJvcGxhYmVsIjsKICB9CgogIGZ1bmN0aW9uIENvbnRleHQoaW5kZW50ZWQsIGNvbHVtbiwgdHlwZSwgYWxpZ24sIHByZXYpIHsKICAgIHRoaXMuaW5kZW50ZWQgPSBpbmRlbnRlZDsKICAgIHRoaXMuY29sdW1uID0gY29sdW1uOwogICAgdGhpcy50eXBlID0gdHlwZTsKICAgIHRoaXMuYWxpZ24gPSBhbGlnbjsKICAgIHRoaXMucHJldiA9IHByZXY7CiAgfQoKICBmdW5jdGlvbiBwdXNoQ29udGV4dChzdGF0ZSwgY29sLCB0eXBlKSB7CiAgICByZXR1cm4gc3RhdGUuY29udGV4dCA9IG5ldyBDb250ZXh0KHN0YXRlLmluZGVudGVkLCBjb2wsIHR5cGUsIG51bGwsIHN0YXRlLmNvbnRleHQpOwogIH0KCiAgZnVuY3Rpb24gcG9wQ29udGV4dChzdGF0ZSkgewogICAgdmFyIHQgPSBzdGF0ZS5jb250ZXh0LnR5cGU7CiAgICBpZiAodCA9PSAiKSIgfHwgdCA9PSAiXSIgfHwgdCA9PSAifSIpCiAgICAgIHN0YXRlLmluZGVudGVkID0gc3RhdGUuY29udGV4dC5pbmRlbnRlZDsKICAgIHJldHVybiBzdGF0ZS5jb250ZXh0ID0gc3RhdGUuY29udGV4dC5wcmV2OwogIH0KCiAgLy8gSW50ZXJmYWNlCgogIHJldHVybiB7CiAgICBzdGFydFN0YXRlOiBmdW5jdGlvbiAoYmFzZWNvbHVtbikgewogICAgICByZXR1cm4gewogICAgICAgIHRva2VuaXplOiBbdG9rZW5CYXNlXSwKICAgICAgICBjb250ZXh0OiBuZXcgQ29udGV4dCgoYmFzZWNvbHVtbiB8fCAwKSAtIGNvbmZpZy5pbmRlbnRVbml0LCAwLCAidG9wIiwgZmFsc2UpLAogICAgICAgIGluZGVudGVkOiAwLAogICAgICAgIHN0YXJ0T2ZMaW5lOiB0cnVlLAogICAgICAgIGxhc3RUb2tlbjogbnVsbAogICAgICB9OwogICAgfSwKCiAgICB0b2tlbjogZnVuY3Rpb24gKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgdmFyIGN0eCA9IHN0YXRlLmNvbnRleHQ7CiAgICAgIGlmIChzdHJlYW0uc29sKCkpIHsKICAgICAgICBpZiAoY3R4LmFsaWduID09IG51bGwpIGN0eC5hbGlnbiA9IGZhbHNlOwogICAgICAgIHN0YXRlLmluZGVudGVkID0gc3RyZWFtLmluZGVudGF0aW9uKCk7CiAgICAgICAgc3RhdGUuc3RhcnRPZkxpbmUgPSB0cnVlOwogICAgICAgIC8vIEF1dG9tYXRpYyBzZW1pY29sb24gaW5zZXJ0aW9uCiAgICAgICAgaWYgKGN0eC50eXBlID09ICJzdGF0ZW1lbnQiICYmICFleHBlY3RFeHByZXNzaW9uKHN0YXRlLmxhc3RUb2tlbikpIHsKICAgICAgICAgIHBvcENvbnRleHQoc3RhdGUpOwogICAgICAgICAgY3R4ID0gc3RhdGUuY29udGV4dDsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHN0cmVhbS5lYXRTcGFjZSgpKSByZXR1cm4gbnVsbDsKICAgICAgY3VyUHVuYyA9IG51bGw7CiAgICAgIHZhciBzdHlsZSA9IHN0YXRlLnRva2VuaXplW3N0YXRlLnRva2VuaXplLmxlbmd0aCAtIDFdKHN0cmVhbSwgc3RhdGUpOwogICAgICBpZiAoc3R5bGUgPT0gImNvbW1lbnQiKSByZXR1cm4gc3R5bGU7CiAgICAgIGlmIChjdHguYWxpZ24gPT0gbnVsbCkgY3R4LmFsaWduID0gdHJ1ZTsKICAgICAgaWYgKChjdXJQdW5jID09ICI7IiB8fCBjdXJQdW5jID09ICI6IikgJiYgY3R4LnR5cGUgPT0gInN0YXRlbWVudCIpIHBvcENvbnRleHQoc3RhdGUpOwogICAgICAvLyBIYW5kbGUgaW5kZW50YXRpb24gZm9yIHt4IC0+IFxuIC4uLiB9CiAgICAgIGVsc2UgaWYgKGN1clB1bmMgPT0gIi0+IiAmJiBjdHgudHlwZSA9PSAic3RhdGVtZW50IiAmJiBjdHgucHJldi50eXBlID09ICJ9IikgewogICAgICAgIHBvcENvbnRleHQoc3RhdGUpOwogICAgICAgIHN0YXRlLmNvbnRleHQuYWxpZ24gPSBmYWxzZTsKICAgICAgfQogICAgICBlbHNlIGlmIChjdXJQdW5jID09ICJ7IikgcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbS5jb2x1bW4oKSwgIn0iKTsKICAgICAgZWxzZSBpZiAoY3VyUHVuYyA9PSAiWyIpIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0uY29sdW1uKCksICJdIik7CiAgICAgIGVsc2UgaWYgKGN1clB1bmMgPT0gIigiKSBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLmNvbHVtbigpLCAiKSIpOwogICAgICBlbHNlIGlmIChjdXJQdW5jID09ICJ9IikgewogICAgICAgIHdoaWxlIChjdHgudHlwZSA9PSAic3RhdGVtZW50IikgY3R4ID0gcG9wQ29udGV4dChzdGF0ZSk7CiAgICAgICAgaWYgKGN0eC50eXBlID09ICJ9IikgY3R4ID0gcG9wQ29udGV4dChzdGF0ZSk7CiAgICAgICAgd2hpbGUgKGN0eC50eXBlID09ICJzdGF0ZW1lbnQiKSBjdHggPSBwb3BDb250ZXh0KHN0YXRlKTsKICAgICAgfQogICAgICBlbHNlIGlmIChjdXJQdW5jID09IGN0eC50eXBlKSBwb3BDb250ZXh0KHN0YXRlKTsKICAgICAgZWxzZSBpZiAoY3R4LnR5cGUgPT0gIn0iIHx8IGN0eC50eXBlID09ICJ0b3AiIHx8IChjdHgudHlwZSA9PSAic3RhdGVtZW50IiAmJiBjdXJQdW5jID09ICJuZXdzdGF0ZW1lbnQiKSkKICAgICAgICBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLmNvbHVtbigpLCAic3RhdGVtZW50Iik7CiAgICAgIHN0YXRlLnN0YXJ0T2ZMaW5lID0gZmFsc2U7CiAgICAgIHN0YXRlLmxhc3RUb2tlbiA9IGN1clB1bmMgfHwgc3R5bGU7CiAgICAgIHJldHVybiBzdHlsZTsKICAgIH0sCgogICAgaW5kZW50OiBmdW5jdGlvbiAoc3RhdGUsIHRleHRBZnRlcikgewogICAgICBpZiAoIXN0YXRlLnRva2VuaXplW3N0YXRlLnRva2VuaXplLmxlbmd0aCAtIDFdLmlzQmFzZSkgcmV0dXJuIDA7CiAgICAgIHZhciBmaXJzdENoYXIgPSB0ZXh0QWZ0ZXIgJiYgdGV4dEFmdGVyLmNoYXJBdCgwKSwgY3R4ID0gc3RhdGUuY29udGV4dDsKICAgICAgaWYgKGN0eC50eXBlID09ICJzdGF0ZW1lbnQiICYmICFleHBlY3RFeHByZXNzaW9uKHN0YXRlLmxhc3RUb2tlbikpIGN0eCA9IGN0eC5wcmV2OwogICAgICB2YXIgY2xvc2luZyA9IGZpcnN0Q2hhciA9PSBjdHgudHlwZTsKICAgICAgaWYgKGN0eC50eXBlID09ICJzdGF0ZW1lbnQiKSB7CiAgICAgICAgcmV0dXJuIGN0eC5pbmRlbnRlZCArIChmaXJzdENoYXIgPT0gInsiID8gMCA6IGNvbmZpZy5pbmRlbnRVbml0KTsKICAgICAgfQogICAgICBlbHNlIGlmIChjdHguYWxpZ24pIHJldHVybiBjdHguY29sdW1uICsgKGNsb3NpbmcgPyAwIDogMSk7CiAgICAgIGVsc2UgcmV0dXJuIGN0eC5pbmRlbnRlZCArIChjbG9zaW5nID8gMCA6IGNvbmZpZy5pbmRlbnRVbml0KTsKICAgIH0sCgogICAgZWxlY3RyaWNDaGFyczogInt9IgogIH07Cn0pOwoKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gta290bGluIiwgImtvdGxpbiIpOwoKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/livescript/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/livescript/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogTGl2ZVNjcmlwdCBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi90aGVtZS9zb2xhcml6ZWQuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9ImxpdmVzY3JpcHQuanMiPjwvc2NyaXB0Pgo8c3R5bGU+LkNvZGVNaXJyb3Ige2ZvbnQtc2l6ZTogODAlO2JvcmRlci10b3A6IDFweCBzb2xpZCBzaWx2ZXI7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBzaWx2ZXI7fTwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGltZyBpZD1sb2dvIHNyYz0iLi4vLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+TGFuZ3VhZ2UgbW9kZXM8L2E+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPkxpdmVTY3JpcHQ8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPkxpdmVTY3JpcHQgbW9kZTwvaDI+Cjxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+CiMgTGl2ZVNjcmlwdCBtb2RlIGZvciBDb2RlTWlycm9yCiMgVGhlIGZvbGxvd2luZyBzY3JpcHQsIHByZWx1ZGUubHMsIGlzIHVzZWQgdG8KIyBkZW1vbnN0cmF0ZSBMaXZlU2NyaXB0IG1vZGUgZm9yIENvZGVNaXJyb3IuCiMgICBodHRwczovL2dpdGh1Yi5jb20vZ2t6L3ByZWx1ZGUtbHMKCmV4cG9ydCBvYmpUb0Z1bmMgPSBvYmpUb0Z1bmMgPSAob2JqKSAtPgogIChrZXkpIC0+IG9ialtrZXldCgpleHBvcnQgZWFjaCA9IChmLCB4cykgLS0+CiAgaWYgdHlwZW9mISB4cyBpcyBcT2JqZWN0CiAgICBmb3IgLCB4IG9mIHhzIHRoZW4gZiB4CiAgZWxzZQogICAgZm9yIHggaW4geHMgdGhlbiBmIHgKICB4cwoKZXhwb3J0IG1hcCA9IChmLCB4cykgLS0+CiAgZiA9IG9ialRvRnVuYyBmIGlmIHR5cGVvZiEgZiBpc250IFxGdW5jdGlvbgogIHR5cGUgPSB0eXBlb2YhIHhzCiAgaWYgdHlwZSBpcyBcT2JqZWN0CiAgICB7W2tleSwgZiB4XSBmb3Iga2V5LCB4IG9mIHhzfQogIGVsc2UKICAgIHJlc3VsdCA9IFtmIHggZm9yIHggaW4geHNdCiAgICBpZiB0eXBlIGlzIFxTdHJpbmcgdGhlbiByZXN1bHQgKiAnJyBlbHNlIHJlc3VsdAoKZXhwb3J0IGZpbHRlciA9IChmLCB4cykgLS0+CiAgZiA9IG9ialRvRnVuYyBmIGlmIHR5cGVvZiEgZiBpc250IFxGdW5jdGlvbgogIHR5cGUgPSB0eXBlb2YhIHhzCiAgaWYgdHlwZSBpcyBcT2JqZWN0CiAgICB7W2tleSwgeF0gZm9yIGtleSwgeCBvZiB4cyB3aGVuIGYgeH0KICBlbHNlCiAgICByZXN1bHQgPSBbeCBmb3IgeCBpbiB4cyB3aGVuIGYgeF0KICAgIGlmIHR5cGUgaXMgXFN0cmluZyB0aGVuIHJlc3VsdCAqICcnIGVsc2UgcmVzdWx0CgpleHBvcnQgcmVqZWN0ID0gKGYsIHhzKSAtLT4KICBmID0gb2JqVG9GdW5jIGYgaWYgdHlwZW9mISBmIGlzbnQgXEZ1bmN0aW9uCiAgdHlwZSA9IHR5cGVvZiEgeHMKICBpZiB0eXBlIGlzIFxPYmplY3QKICAgIHtba2V5LCB4XSBmb3Iga2V5LCB4IG9mIHhzIHdoZW4gbm90IGYgeH0KICBlbHNlCiAgICByZXN1bHQgPSBbeCBmb3IgeCBpbiB4cyB3aGVuIG5vdCBmIHhdCiAgICBpZiB0eXBlIGlzIFxTdHJpbmcgdGhlbiByZXN1bHQgKiAnJyBlbHNlIHJlc3VsdAoKZXhwb3J0IHBhcnRpdGlvbiA9IChmLCB4cykgLS0+CiAgZiA9IG9ialRvRnVuYyBmIGlmIHR5cGVvZiEgZiBpc250IFxGdW5jdGlvbgogIHR5cGUgPSB0eXBlb2YhIHhzCiAgaWYgdHlwZSBpcyBcT2JqZWN0CiAgICBwYXNzZWQgPSB7fQogICAgZmFpbGVkID0ge30KICAgIGZvciBrZXksIHggb2YgeHMKICAgICAgKGlmIGYgeCB0aGVuIHBhc3NlZCBlbHNlIGZhaWxlZClba2V5XSA9IHgKICBlbHNlCiAgICBwYXNzZWQgPSBbXQogICAgZmFpbGVkID0gW10KICAgIGZvciB4IGluIHhzCiAgICAgIChpZiBmIHggdGhlbiBwYXNzZWQgZWxzZSBmYWlsZWQpcHVzaCB4CiAgICBpZiB0eXBlIGlzIFxTdHJpbmcKICAgICAgcGFzc2VkICo9ICcnCiAgICAgIGZhaWxlZCAqPSAnJwogIFtwYXNzZWQsIGZhaWxlZF0KCmV4cG9ydCBmaW5kID0gKGYsIHhzKSAtLT4KICBmID0gb2JqVG9GdW5jIGYgaWYgdHlwZW9mISBmIGlzbnQgXEZ1bmN0aW9uCiAgaWYgdHlwZW9mISB4cyBpcyBcT2JqZWN0CiAgICBmb3IgLCB4IG9mIHhzIHdoZW4gZiB4IHRoZW4gcmV0dXJuIHgKICBlbHNlCiAgICBmb3IgeCBpbiB4cyB3aGVuIGYgeCB0aGVuIHJldHVybiB4CiAgdm9pZAoKZXhwb3J0IGhlYWQgPSBleHBvcnQgZmlyc3QgPSAoeHMpIC0+CiAgcmV0dXJuIHZvaWQgaWYgbm90IHhzLmxlbmd0aAogIHhzLjAKCmV4cG9ydCB0YWlsID0gKHhzKSAtPgogIHJldHVybiB2b2lkIGlmIG5vdCB4cy5sZW5ndGgKICB4cy5zbGljZSAxCgpleHBvcnQgbGFzdCA9ICh4cykgLT4KICByZXR1cm4gdm9pZCBpZiBub3QgeHMubGVuZ3RoCiAgeHNbKi0xXQoKZXhwb3J0IGluaXRpYWwgPSAoeHMpIC0+CiAgcmV0dXJuIHZvaWQgaWYgbm90IHhzLmxlbmd0aAogIHhzLnNsaWNlIDAgeHMubGVuZ3RoIC0gMQoKZXhwb3J0IGVtcHR5ID0gKHhzKSAtPgogIGlmIHR5cGVvZiEgeHMgaXMgXE9iamVjdAogICAgZm9yIHggb2YgeHMgdGhlbiByZXR1cm4gZmFsc2UKICAgIHJldHVybiB5ZXMKICBub3QgeHMubGVuZ3RoCgpleHBvcnQgdmFsdWVzID0gKG9iaikgLT4KICBbeCBmb3IgLCB4IG9mIG9ial0KCmV4cG9ydCBrZXlzID0gKG9iaikgLT4KICBbeCBmb3IgeCBvZiBvYmpdCgpleHBvcnQgbGVuID0gKHhzKSAtPgogIHhzID0gdmFsdWVzIHhzIGlmIHR5cGVvZiEgeHMgaXMgXE9iamVjdAogIHhzLmxlbmd0aAoKZXhwb3J0IGNvbnMgPSAoeCwgeHMpIC0tPgogIGlmIHR5cGVvZiEgeHMgaXMgXFN0cmluZyB0aGVuIHggKyB4cyBlbHNlIFt4XSArKyB4cwoKZXhwb3J0IGFwcGVuZCA9ICh4cywgeXMpIC0tPgogIGlmIHR5cGVvZiEgeXMgaXMgXFN0cmluZyB0aGVuIHhzICsgeXMgZWxzZSB4cyArKyB5cwoKZXhwb3J0IGpvaW4gPSAoc2VwLCB4cykgLS0+CiAgeHMgPSB2YWx1ZXMgeHMgaWYgdHlwZW9mISB4cyBpcyBcT2JqZWN0CiAgeHMuam9pbiBzZXAKCmV4cG9ydCByZXZlcnNlID0gKHhzKSAtPgogIGlmIHR5cGVvZiEgeHMgaXMgXFN0cmluZwogIHRoZW4gKHhzIC8gJycpcmV2ZXJzZSEgKiAnJwogIGVsc2UgeHMuc2xpY2UhcmV2ZXJzZSEKCmV4cG9ydCBmb2xkID0gZXhwb3J0IGZvbGRsID0gKGYsIG1lbW8sIHhzKSAtLT4KICBpZiB0eXBlb2YhIHhzIGlzIFxPYmplY3QKICAgIGZvciAsIHggb2YgeHMgdGhlbiBtZW1vID0gZiBtZW1vLCB4CiAgZWxzZQogICAgZm9yIHggaW4geHMgdGhlbiBtZW1vID0gZiBtZW1vLCB4CiAgbWVtbwoKZXhwb3J0IGZvbGQxID0gZXhwb3J0IGZvbGRsMSA9IChmLCB4cykgLS0+IGZvbGQgZiwgeHMuMCwgeHMuc2xpY2UgMQoKZXhwb3J0IGZvbGRyID0gKGYsIG1lbW8sIHhzKSAtLT4gZm9sZCBmLCBtZW1vLCB4cy5zbGljZSFyZXZlcnNlIQoKZXhwb3J0IGZvbGRyMSA9IChmLCB4cykgLS0+CiAgeHMuPXNsaWNlIXJldmVyc2UhCiAgZm9sZCBmLCB4cy4wLCB4cy5zbGljZSAxCgpleHBvcnQgdW5mb2xkciA9IGV4cG9ydCB1bmZvbGQgPSAoZiwgYikgLS0+CiAgaWYgKGYgYik/CiAgICBbdGhhdC4wXSArKyB1bmZvbGRyIGYsIHRoYXQuMQogIGVsc2UKICAgIFtdCgpleHBvcnQgYW5kTGlzdCA9ICh4cykgLT4KICBmb3IgeCBpbiB4cyB3aGVuIG5vdCB4CiAgICByZXR1cm4gZmFsc2UKICB0cnVlCgpleHBvcnQgb3JMaXN0ID0gKHhzKSAtPgogIGZvciB4IGluIHhzIHdoZW4geAogICAgcmV0dXJuIHRydWUKICBmYWxzZQoKZXhwb3J0IGFueSA9IChmLCB4cykgLS0+CiAgZiA9IG9ialRvRnVuYyBmIGlmIHR5cGVvZiEgZiBpc250IFxGdW5jdGlvbgogIGZvciB4IGluIHhzIHdoZW4gZiB4CiAgICByZXR1cm4geWVzCiAgbm8KCmV4cG9ydCBhbGwgPSAoZiwgeHMpIC0tPgogIGYgPSBvYmpUb0Z1bmMgZiBpZiB0eXBlb2YhIGYgaXNudCBcRnVuY3Rpb24KICBmb3IgeCBpbiB4cyB3aGVuIG5vdCBmIHgKICAgIHJldHVybiBubwogIHllcwoKZXhwb3J0IHVuaXF1ZSA9ICh4cykgLT4KICByZXN1bHQgPSBbXQogIGlmIHR5cGVvZiEgeHMgaXMgXE9iamVjdAogICAgZm9yICwgeCBvZiB4cyB3aGVuIHggbm90IGluIHJlc3VsdCB0aGVuIHJlc3VsdC5wdXNoIHgKICBlbHNlCiAgICBmb3IgeCAgIGluIHhzIHdoZW4geCBub3QgaW4gcmVzdWx0IHRoZW4gcmVzdWx0LnB1c2ggeAogIGlmIHR5cGVvZiEgeHMgaXMgXFN0cmluZyB0aGVuIHJlc3VsdCAqICcnIGVsc2UgcmVzdWx0CgpleHBvcnQgc29ydCA9ICh4cykgLT4KICB4cy5jb25jYXQhc29ydCAoeCwgeSkgLT4KICAgIHwgeCA+IHkgPT4gIDEKICAgIHwgeCA8IHkgPT4gLTEKICAgIHwgXyAgICAgPT4gIDAKCmV4cG9ydCBzb3J0QnkgPSAoZiwgeHMpIC0tPgogIHJldHVybiBbXSB1bmxlc3MgeHMubGVuZ3RoCiAgeHMuY29uY2F0IXNvcnQgZgoKZXhwb3J0IGNvbXBhcmUgPSAoZiwgeCwgeSkgLS0+CiAgfCAoZiB4KSA+IChmIHkpID0+ICAxCiAgfCAoZiB4KSA8IChmIHkpID0+IC0xCiAgfCBvdGhlcndpc2UgICAgID0+ICAwCgpleHBvcnQgc3VtID0gKHhzKSAtPgogIHJlc3VsdCA9IDAKICBpZiB0eXBlb2YhIHhzIGlzIFxPYmplY3QKICAgIGZvciAsIHggb2YgeHMgdGhlbiByZXN1bHQgKz0geAogIGVsc2UKICAgIGZvciB4ICAgaW4geHMgdGhlbiByZXN1bHQgKz0geAogIHJlc3VsdAoKZXhwb3J0IHByb2R1Y3QgPSAoeHMpIC0+CiAgcmVzdWx0ID0gMQogIGlmIHR5cGVvZiEgeHMgaXMgXE9iamVjdAogICAgZm9yICwgeCBvZiB4cyB0aGVuIHJlc3VsdCAqPSB4CiAgZWxzZQogICAgZm9yIHggICBpbiB4cyB0aGVuIHJlc3VsdCAqPSB4CiAgcmVzdWx0CgpleHBvcnQgbWVhbiA9IGV4cG9ydCBhdmVyYWdlID0gKHhzKSAtPiAoc3VtIHhzKSAvIGxlbiB4cwoKZXhwb3J0IGNvbmNhdCA9ICh4c3MpIC0+IGZvbGQgYXBwZW5kLCBbXSwgeHNzCgpleHBvcnQgY29uY2F0TWFwID0gKGYsIHhzKSAtLT4gZm9sZCAoKG1lbW8sIHgpIC0+IGFwcGVuZCBtZW1vLCBmIHgpLCBbXSwgeHMKCmV4cG9ydCBsaXN0VG9PYmogPSAoeHMpIC0+CiAge1t4LjAsIHguMV0gZm9yIHggaW4geHN9CgpleHBvcnQgbWF4aW11bSA9ICh4cykgLT4gZm9sZDEgKD4/KSwgeHMKCmV4cG9ydCBtaW5pbXVtID0gKHhzKSAtPiBmb2xkMSAoPD8pLCB4cwoKZXhwb3J0IHNjYW4gPSBleHBvcnQgc2NhbmwgPSAoZiwgbWVtbywgeHMpIC0tPgogIGxhc3QgPSBtZW1vCiAgaWYgdHlwZW9mISB4cyBpcyBcT2JqZWN0CiAgdGhlbiBbbWVtb10gKysgW2xhc3QgPSBmIGxhc3QsIHggZm9yICwgeCBvZiB4c10KICBlbHNlIFttZW1vXSArKyBbbGFzdCA9IGYgbGFzdCwgeCBmb3IgeCBpbiB4c10KCmV4cG9ydCBzY2FuMSA9IGV4cG9ydCBzY2FubDEgPSAoZiwgeHMpIC0tPiBzY2FuIGYsIHhzLjAsIHhzLnNsaWNlIDEKCmV4cG9ydCBzY2FuciA9IChmLCBtZW1vLCB4cykgLS0+CiAgeHMuPXNsaWNlIXJldmVyc2UhCiAgc2NhbiBmLCBtZW1vLCB4cyAucmV2ZXJzZSEKCmV4cG9ydCBzY2FucjEgPSAoZiwgeHMpIC0tPgogIHhzLj1zbGljZSFyZXZlcnNlIQogIHNjYW4gZiwgeHMuMCwgeHMuc2xpY2UgMSAucmV2ZXJzZSEKCmV4cG9ydCByZXBsaWNhdGUgPSAobiwgeCkgLS0+CiAgcmVzdWx0ID0gW10KICBpID0gMAogIHdoaWxlIGkgPCBuLCArK2kgdGhlbiByZXN1bHQucHVzaCB4CiAgcmVzdWx0CgpleHBvcnQgdGFrZSA9IChuLCB4cykgLS0+CiAgfCBuIDw9IDAKICAgIGlmIHR5cGVvZiEgeHMgaXMgXFN0cmluZyB0aGVuICcnIGVsc2UgW10KICB8IG5vdCB4cy5sZW5ndGggPT4geHMKICB8IG90aGVyd2lzZSAgICAgPT4geHMuc2xpY2UgMCwgbgoKZXhwb3J0IGRyb3AgPSAobiwgeHMpIC0tPgogIHwgbiA8PSAwICAgICAgICA9PiB4cwogIHwgbm90IHhzLmxlbmd0aCA9PiB4cwogIHwgb3RoZXJ3aXNlICAgICA9PiB4cy5zbGljZSBuCgpleHBvcnQgc3BsaXRBdCA9IChuLCB4cykgLS0+IFsodGFrZSBuLCB4cyksIChkcm9wIG4sIHhzKV0KCmV4cG9ydCB0YWtlV2hpbGUgPSAocCwgeHMpIC0tPgogIHJldHVybiB4cyBpZiBub3QgeHMubGVuZ3RoCiAgcCA9IG9ialRvRnVuYyBwIGlmIHR5cGVvZiEgcCBpc250IFxGdW5jdGlvbgogIHJlc3VsdCA9IFtdCiAgZm9yIHggaW4geHMKICAgIGJyZWFrIGlmIG5vdCBwIHgKICAgIHJlc3VsdC5wdXNoIHgKICBpZiB0eXBlb2YhIHhzIGlzIFxTdHJpbmcgdGhlbiByZXN1bHQgKiAnJyBlbHNlIHJlc3VsdAoKZXhwb3J0IGRyb3BXaGlsZSA9IChwLCB4cykgLS0+CiAgcmV0dXJuIHhzIGlmIG5vdCB4cy5sZW5ndGgKICBwID0gb2JqVG9GdW5jIHAgaWYgdHlwZW9mISBwIGlzbnQgXEZ1bmN0aW9uCiAgaSA9IDAKICBmb3IgeCBpbiB4cwogICAgYnJlYWsgaWYgbm90IHAgeAogICAgKytpCiAgZHJvcCBpLCB4cwoKZXhwb3J0IHNwYW4gPSAocCwgeHMpIC0tPiBbKHRha2VXaGlsZSBwLCB4cyksIChkcm9wV2hpbGUgcCwgeHMpXQoKZXhwb3J0IGJyZWFrSXQgPSAocCwgeHMpIC0tPiBzcGFuIChub3QpIDw8IHAsIHhzCgpleHBvcnQgemlwID0gKHhzLCB5cykgLS0+CiAgcmVzdWx0ID0gW10KICBmb3IgenMsIGkgaW4gW3hzLCB5c10KICAgIGZvciB6LCBqIGluIHpzCiAgICAgIHJlc3VsdC5wdXNoIFtdIGlmIGkgaXMgMAogICAgICByZXN1bHRbal0/cHVzaCB6CiAgcmVzdWx0CgpleHBvcnQgemlwV2l0aCA9IChmLHhzLCB5cykgLS0+CiAgZiA9IG9ialRvRnVuYyBmIGlmIHR5cGVvZiEgZiBpc250IFxGdW5jdGlvbgogIGlmIG5vdCB4cy5sZW5ndGggb3Igbm90IHlzLmxlbmd0aAogICAgW10KICBlbHNlCiAgICBbZi5hcHBseSB0aGlzLCB6cyBmb3IgenMgaW4gemlwLmNhbGwgdGhpcywgeHMsIHlzXQoKZXhwb3J0IHppcEFsbCA9ICguLi54c3MpIC0+CiAgcmVzdWx0ID0gW10KICBmb3IgeHMsIGkgaW4geHNzCiAgICBmb3IgeCwgaiBpbiB4cwogICAgICByZXN1bHQucHVzaCBbXSBpZiBpIGlzIDAKICAgICAgcmVzdWx0W2pdP3B1c2ggeAogIHJlc3VsdAoKZXhwb3J0IHppcEFsbFdpdGggPSAoZiwgLi4ueHNzKSAtPgogIGYgPSBvYmpUb0Z1bmMgZiBpZiB0eXBlb2YhIGYgaXNudCBcRnVuY3Rpb24KICBpZiBub3QgeHNzLjAubGVuZ3RoIG9yIG5vdCB4c3MuMS5sZW5ndGgKICAgIFtdCiAgZWxzZQogICAgW2YuYXBwbHkgdGhpcywgeHMgZm9yIHhzIGluIHppcEFsbC5hcHBseSB0aGlzLCB4c3NdCgpleHBvcnQgY29tcG9zZSA9ICguLi5mdW5jcykgLT4KICAtPgogICAgYXJncyA9IGFyZ3VtZW50cwogICAgZm9yIGYgaW4gZnVuY3MKICAgICAgYXJncyA9IFtmLmFwcGx5IHRoaXMsIGFyZ3NdCiAgICBhcmdzLjAKCmV4cG9ydCBjdXJyeSA9IChmKSAtPgogIGN1cnJ5JCBmICMgdXNpbmcgdXRpbCBtZXRob2QgY3VycnkkIGZyb20gbGl2ZXNjcmlwdAoKZXhwb3J0IGlkID0gKHgpIC0+IHgKCmV4cG9ydCBmbGlwID0gKGYsIHgsIHkpIC0tPiBmIHksIHgKCmV4cG9ydCBmaXggPSAoZikgLT4KICAoIChnLCB4KSAtPiAtPiBmKGcgZykgLi4uYXJndW1lbnRzICkgZG8KICAgIChnLCB4KSAtPiAtPiBmKGcgZykgLi4uYXJndW1lbnRzCgpleHBvcnQgbGluZXMgPSAoc3RyKSAtPgogIHJldHVybiBbXSBpZiBub3Qgc3RyLmxlbmd0aAogIHN0ciAvIFxcbgoKZXhwb3J0IHVubGluZXMgPSAoc3RycykgLT4gc3RycyAqIFxcbgoKZXhwb3J0IHdvcmRzID0gKHN0cikgLT4KICByZXR1cm4gW10gaWYgbm90IHN0ci5sZW5ndGgKICBzdHIgLyAvWyBdKy8KCmV4cG9ydCB1bndvcmRzID0gKHN0cnMpIC0+IHN0cnMgKiAnICcKCmV4cG9ydCBtYXggPSAoPj8pCgpleHBvcnQgbWluID0gKDw/KQoKZXhwb3J0IG5lZ2F0ZSA9ICh4KSAtPiAteAoKZXhwb3J0IGFicyA9IE1hdGguYWJzCgpleHBvcnQgc2lnbnVtID0gKHgpIC0+CiAgfCB4IDwgMCAgICAgPT4gLTEKICB8IHggPiAwICAgICA9PiAgMQogIHwgb3RoZXJ3aXNlID0+ICAwCgpleHBvcnQgcXVvdCA9ICh4LCB5KSAtLT4gfn4oeCAvIHkpCgpleHBvcnQgcmVtID0gKCUpCgpleHBvcnQgZGl2ID0gKHgsIHkpIC0tPiBNYXRoLmZsb29yIHggLyB5CgpleHBvcnQgbW9kID0gKCUlKQoKZXhwb3J0IHJlY2lwID0gKDEgLykKCmV4cG9ydCBwaSA9IE1hdGguUEkKCmV4cG9ydCB0YXUgPSBwaSAqIDIKCmV4cG9ydCBleHAgPSBNYXRoLmV4cAoKZXhwb3J0IHNxcnQgPSBNYXRoLnNxcnQKCiMgY2hhbmdlZCBmcm9tIGxvZyBhcyBsb2cgaXMgYQojIGNvbW1vbiBmdW5jdGlvbiBmb3IgbG9nZ2luZyB0aGluZ3MKZXhwb3J0IGxuID0gTWF0aC5sb2cKCmV4cG9ydCBwb3cgPSAoXikKCmV4cG9ydCBzaW4gPSBNYXRoLnNpbgoKZXhwb3J0IHRhbiA9IE1hdGgudGFuCgpleHBvcnQgY29zID0gTWF0aC5jb3MKCmV4cG9ydCBhc2luID0gTWF0aC5hc2luCgpleHBvcnQgYWNvcyA9IE1hdGguYWNvcwoKZXhwb3J0IGF0YW4gPSBNYXRoLmF0YW4KCmV4cG9ydCBhdGFuMiA9ICh4LCB5KSAtLT4gTWF0aC5hdGFuMiB4LCB5CgojIHNpbmgKIyB0YW5oCiMgY29zaAojIGFzaW5oCiMgYXRhbmgKIyBhY29zaAoKZXhwb3J0IHRydW5jYXRlID0gKHgpIC0+IH5+eAoKZXhwb3J0IHJvdW5kID0gTWF0aC5yb3VuZAoKZXhwb3J0IGNlaWxpbmcgPSBNYXRoLmNlaWwKCmV4cG9ydCBmbG9vciA9IE1hdGguZmxvb3IKCmV4cG9ydCBpc0l0TmFOID0gKHgpIC0+IHggaXNudCB4CgpleHBvcnQgZXZlbiA9ICh4KSAtPiB4ICUgMiA9PSAwCgpleHBvcnQgb2RkID0gKHgpIC0+IHggJSAyICE9IDAKCmV4cG9ydCBnY2QgPSAoeCwgeSkgLS0+CiAgeCA9IE1hdGguYWJzIHgKICB5ID0gTWF0aC5hYnMgeQogIHVudGlsIHkgaXMgMAogICAgeiA9IHggJSB5CiAgICB4ID0geQogICAgeSA9IHoKICB4CgpleHBvcnQgbGNtID0gKHgsIHkpIC0tPgogIE1hdGguYWJzIE1hdGguZmxvb3IgKHggLyAoZ2NkIHgsIHkpICogeSkKCiMgbWV0YQpleHBvcnQgaW5zdGFsbFByZWx1ZGUgPSAhKHRhcmdldCkgLT4KICB1bmxlc3MgdGFyZ2V0LnByZWx1ZGU/aXNJbnN0YWxsZWQKICAgIHRhcmdldCA8PDwgb3V0JCAjIHVzaW5nIG91dCQgZ2VuZXJhdGVkIGJ5IGxpdmVzY3JpcHQKICAgIHRhcmdldCA8PDwgdGFyZ2V0LnByZWx1ZGUuaXNJbnN0YWxsZWQgPSB0cnVlCgpleHBvcnQgcHJlbHVkZSA9IG91dCQKPC90ZXh0YXJlYT48L2Zvcm0+CiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgICAgIHRoZW1lOiAic29sYXJpemVkIGxpZ2h0IiwKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZQogICAgICB9KTsKICAgIDwvc2NyaXB0PgoKICAgIDxwPjxzdHJvbmc+TUlNRSB0eXBlcyBkZWZpbmVkOjwvc3Ryb25nPiA8Y29kZT50ZXh0L3gtbGl2ZXNjcmlwdDwvY29kZT4uPC9wPgoKICAgIDxwPlRoZSBMaXZlU2NyaXB0IG1vZGUgd2FzIHdyaXR0ZW4gYnkgS2VubmV0aCBCZW50bGV5LjwvcD4KCiAgPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/livescript/livescript.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovKioKICogTGluayB0byB0aGUgcHJvamVjdCdzIEdpdEh1YiBwYWdlOgogKiBodHRwczovL2dpdGh1Yi5jb20vZHVyYWxvZy9Db2RlTWlycm9yCiAqLwoKKGZ1bmN0aW9uKG1vZCkgewogIGlmICh0eXBlb2YgZXhwb3J0cyA9PSAib2JqZWN0IiAmJiB0eXBlb2YgbW9kdWxlID09ICJvYmplY3QiKSAvLyBDb21tb25KUwogICAgbW9kKHJlcXVpcmUoIi4uLy4uL2xpYi9jb2RlbWlycm9yIikpOwogIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kKSAvLyBBTUQKICAgIGRlZmluZShbIi4uLy4uL2xpYi9jb2RlbWlycm9yIl0sIG1vZCk7CiAgZWxzZSAvLyBQbGFpbiBicm93c2VyIGVudgogICAgbW9kKENvZGVNaXJyb3IpOwp9KShmdW5jdGlvbihDb2RlTWlycm9yKSB7CiAgInVzZSBzdHJpY3QiOwoKICBDb2RlTWlycm9yLmRlZmluZU1vZGUoJ2xpdmVzY3JpcHQnLCBmdW5jdGlvbigpewogICAgdmFyIHRva2VuQmFzZSA9IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgdmFyIG5leHRfcnVsZSA9IHN0YXRlLm5leHQgfHwgInN0YXJ0IjsKICAgICAgaWYgKG5leHRfcnVsZSkgewogICAgICAgIHN0YXRlLm5leHQgPSBzdGF0ZS5uZXh0OwogICAgICAgIHZhciBuciA9IFJ1bGVzW25leHRfcnVsZV07CiAgICAgICAgaWYgKG5yLnNwbGljZSkgewogICAgICAgICAgZm9yICh2YXIgaSQgPSAwOyBpJCA8IG5yLmxlbmd0aDsgKytpJCkgewogICAgICAgICAgICB2YXIgciA9IG5yW2kkXSwgbTsKICAgICAgICAgICAgaWYgKHIucmVnZXggJiYgKG0gPSBzdHJlYW0ubWF0Y2goci5yZWdleCkpKSB7CiAgICAgICAgICAgICAgc3RhdGUubmV4dCA9IHIubmV4dCB8fCBzdGF0ZS5uZXh0OwogICAgICAgICAgICAgIHJldHVybiByLnRva2VuOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgICAgcmV0dXJuICdlcnJvcic7CiAgICAgICAgfQogICAgICAgIGlmIChzdHJlYW0ubWF0Y2gociA9IFJ1bGVzW25leHRfcnVsZV0pKSB7CiAgICAgICAgICBpZiAoci5yZWdleCAmJiBzdHJlYW0ubWF0Y2goci5yZWdleCkpIHsKICAgICAgICAgICAgc3RhdGUubmV4dCA9IHIubmV4dDsKICAgICAgICAgICAgcmV0dXJuIHIudG9rZW47CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgICAgICByZXR1cm4gJ2Vycm9yJzsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgcmV0dXJuICdlcnJvcic7CiAgICB9OwogICAgdmFyIGV4dGVybmFsID0gewogICAgICBzdGFydFN0YXRlOiBmdW5jdGlvbigpewogICAgICAgIHJldHVybiB7CiAgICAgICAgICBuZXh0OiAnc3RhcnQnLAogICAgICAgICAgbGFzdFRva2VuOiBudWxsCiAgICAgICAgfTsKICAgICAgfSwKICAgICAgdG9rZW46IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpewogICAgICAgIHdoaWxlIChzdHJlYW0ucG9zID09IHN0cmVhbS5zdGFydCkKICAgICAgICAgIHZhciBzdHlsZSA9IHRva2VuQmFzZShzdHJlYW0sIHN0YXRlKTsKICAgICAgICBzdGF0ZS5sYXN0VG9rZW4gPSB7CiAgICAgICAgICBzdHlsZTogc3R5bGUsCiAgICAgICAgICBpbmRlbnQ6IHN0cmVhbS5pbmRlbnRhdGlvbigpLAogICAgICAgICAgY29udGVudDogc3RyZWFtLmN1cnJlbnQoKQogICAgICAgIH07CiAgICAgICAgcmV0dXJuIHN0eWxlLnJlcGxhY2UoL1wuL2csICcgJyk7CiAgICAgIH0sCiAgICAgIGluZGVudDogZnVuY3Rpb24oc3RhdGUpewogICAgICAgIHZhciBpbmRlbnRhdGlvbiA9IHN0YXRlLmxhc3RUb2tlbi5pbmRlbnQ7CiAgICAgICAgaWYgKHN0YXRlLmxhc3RUb2tlbi5jb250ZW50Lm1hdGNoKGluZGVudGVyKSkgewogICAgICAgICAgaW5kZW50YXRpb24gKz0gMjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGluZGVudGF0aW9uOwogICAgICB9CiAgICB9OwogICAgcmV0dXJuIGV4dGVybmFsOwogIH0pOwoKICB2YXIgaWRlbnRpZmllciA9ICcoPyFbXFxkXFxzXSlbJFxcd1xceEFBLVxcdUZGRENdKD86KD8hXFxzKVskXFx3XFx4QUEtXFx1RkZEQ118LVtBLVphLXpdKSonOwogIHZhciBpbmRlbnRlciA9IFJlZ0V4cCgnKD86Wyh7Wz06XXxbLX5dPnxcXGIoPzplKD86bHNlfHhwb3J0KXxkKD86b3xlZmF1bHQpfHQoPzpyeXxoZW4pfGZpbmFsbHl8aW1wb3J0KD86XFxzKmFsbCk/fGNvbnN0fHZhcnxsZXR8bmV3fGNhdGNoKD86XFxzKicgKyBpZGVudGlmaWVyICsgJyk/KSlcXHMqJCcpOwogIHZhciBrZXl3b3JkZW5kID0gJyg/IVskXFx3XXwtW0EtWmEtel18XFxzKjooPyFbOj1dKSknOwogIHZhciBzdHJpbmdmaWxsID0gewogICAgdG9rZW46ICdzdHJpbmcnLAogICAgcmVnZXg6ICcuKycKICB9OwogIHZhciBSdWxlcyA9IHsKICAgIHN0YXJ0OiBbCiAgICAgIHsKICAgICAgICB0b2tlbjogJ2NvbW1lbnQuZG9jJywKICAgICAgICByZWdleDogJy9cXConLAogICAgICAgIG5leHQ6ICdjb21tZW50JwogICAgICB9LCB7CiAgICAgICAgdG9rZW46ICdjb21tZW50JywKICAgICAgICByZWdleDogJyMuKicKICAgICAgfSwgewogICAgICAgIHRva2VuOiAna2V5d29yZCcsCiAgICAgICAgcmVnZXg6ICcoPzp0KD86aCg/OmlzfHJvd3xlbil8cnl8eXBlb2YhPyl8Yyg/Om9uKD86dGludWV8c3QpfGEoPzpzZXx0Y2gpfGxhc3MpfGkoPzpuKD86c3RhbmNlb2YpP3xtcCg/Om9ydCg/OlxccythbGwpP3xsZW1lbnRzKXxbZnNdKXxkKD86ZSg/OmZhdWx0fGxldGV8YnVnZ2VyKXxvKXxmKD86b3IoPzpcXHMrb3duKT98aW5hbGx5fHVuY3Rpb24pfHMoPzp1cGVyfHdpdGNoKXxlKD86bHNlfHgoPzp0ZW5kc3xwb3J0KXx2YWwpfGEoPzpuZHxyZ3VtZW50cyl8big/OmV3fG90KXx1big/Omxlc3N8dGlsKXx3KD86aGlsZXxpdGgpfG9bZnJdfHJldHVybnxicmVha3xsZXR8dmFyfGxvb3ApJyArIGtleXdvcmRlbmQKICAgICAgfSwgewogICAgICAgIHRva2VuOiAnY29uc3RhbnQubGFuZ3VhZ2UnLAogICAgICAgIHJlZ2V4OiAnKD86dHJ1ZXxmYWxzZXx5ZXN8bm98b258b2ZmfG51bGx8dm9pZHx1bmRlZmluZWQpJyArIGtleXdvcmRlbmQKICAgICAgfSwgewogICAgICAgIHRva2VuOiAnaW52YWxpZC5pbGxlZ2FsJywKICAgICAgICByZWdleDogJyg/OnAoPzphY2thZ2V8cig/Oml2YXRlfG90ZWN0ZWQpfHVibGljKXxpKD86bXBsZW1lbnRzfG50ZXJmYWNlKXxlbnVtfHN0YXRpY3x5aWVsZCknICsga2V5d29yZGVuZAogICAgICB9LCB7CiAgICAgICAgdG9rZW46ICdsYW5ndWFnZS5zdXBwb3J0LmNsYXNzJywKICAgICAgICByZWdleDogJyg/OlIoPzplKD86Z0V4cHxmZXJlbmNlRXJyb3IpfGFuZ2VFcnJvcil8Uyg/OnRyaW5nfHludGF4RXJyb3IpfEUoPzpycm9yfHZhbEVycm9yKXxBcnJheXxCb29sZWFufERhdGV8RnVuY3Rpb258TnVtYmVyfE9iamVjdHxUeXBlRXJyb3J8VVJJRXJyb3IpJyArIGtleXdvcmRlbmQKICAgICAgfSwgewogICAgICAgIHRva2VuOiAnbGFuZ3VhZ2Uuc3VwcG9ydC5mdW5jdGlvbicsCiAgICAgICAgcmVnZXg6ICcoPzppcyg/Ok5hTnxGaW5pdGUpfHBhcnNlKD86SW50fEZsb2F0KXxNYXRofEpTT058KD86ZW58ZGUpY29kZVVSSSg/OkNvbXBvbmVudCk/KScgKyBrZXl3b3JkZW5kCiAgICAgIH0sIHsKICAgICAgICB0b2tlbjogJ3ZhcmlhYmxlLmxhbmd1YWdlJywKICAgICAgICByZWdleDogJyg/OnQoPzpoYXR8aWx8byl8Zig/OnJvbXxhbGx0aHJvdWdoKXxpdHxieXxlKScgKyBrZXl3b3JkZW5kCiAgICAgIH0sIHsKICAgICAgICB0b2tlbjogJ2lkZW50aWZpZXInLAogICAgICAgIHJlZ2V4OiBpZGVudGlmaWVyICsgJ1xccyo6KD8hWzo9XSknCiAgICAgIH0sIHsKICAgICAgICB0b2tlbjogJ3ZhcmlhYmxlJywKICAgICAgICByZWdleDogaWRlbnRpZmllcgogICAgICB9LCB7CiAgICAgICAgdG9rZW46ICdrZXl3b3JkLm9wZXJhdG9yJywKICAgICAgICByZWdleDogJyg/OlxcLnszfXxcXHMrXFw/KScKICAgICAgfSwgewogICAgICAgIHRva2VuOiAna2V5d29yZC52YXJpYWJsZScsCiAgICAgICAgcmVnZXg6ICcoPzpAK3w6OnxcXC5cXC4pJywKICAgICAgICBuZXh0OiAna2V5JwogICAgICB9LCB7CiAgICAgICAgdG9rZW46ICdrZXl3b3JkLm9wZXJhdG9yJywKICAgICAgICByZWdleDogJ1xcLlxccyonLAogICAgICAgIG5leHQ6ICdrZXknCiAgICAgIH0sIHsKICAgICAgICB0b2tlbjogJ3N0cmluZycsCiAgICAgICAgcmVnZXg6ICdcXFxcXFxTW15cXHMsOyl9XFxdXSonCiAgICAgIH0sIHsKICAgICAgICB0b2tlbjogJ3N0cmluZy5kb2MnLAogICAgICAgIHJlZ2V4OiAnXCdcJ1wnJywKICAgICAgICBuZXh0OiAncWRvYycKICAgICAgfSwgewogICAgICAgIHRva2VuOiAnc3RyaW5nLmRvYycsCiAgICAgICAgcmVnZXg6ICciIiInLAogICAgICAgIG5leHQ6ICdxcWRvYycKICAgICAgfSwgewogICAgICAgIHRva2VuOiAnc3RyaW5nJywKICAgICAgICByZWdleDogJ1wnJywKICAgICAgICBuZXh0OiAncXN0cmluZycKICAgICAgfSwgewogICAgICAgIHRva2VuOiAnc3RyaW5nJywKICAgICAgICByZWdleDogJyInLAogICAgICAgIG5leHQ6ICdxcXN0cmluZycKICAgICAgfSwgewogICAgICAgIHRva2VuOiAnc3RyaW5nJywKICAgICAgICByZWdleDogJ2AnLAogICAgICAgIG5leHQ6ICdqcycKICAgICAgfSwgewogICAgICAgIHRva2VuOiAnc3RyaW5nJywKICAgICAgICByZWdleDogJzxcXFsnLAogICAgICAgIG5leHQ6ICd3b3JkcycKICAgICAgfSwgewogICAgICAgIHRva2VuOiAnc3RyaW5nLnJlZ2V4JywKICAgICAgICByZWdleDogJy8vJywKICAgICAgICBuZXh0OiAnaGVyZWdleCcKICAgICAgfSwgewogICAgICAgIHRva2VuOiAnc3RyaW5nLnJlZ2V4JywKICAgICAgICByZWdleDogJ1xcLyg/OlteW1xcL1xcblxcXFxdKig/Oig/OlxcXFwufFxcW1teXFxdXFxuXFxcXF0qKD86XFxcXC5bXlxcXVxcblxcXFxdKikqXFxdKVteW1xcL1xcblxcXFxdKikqKVxcL1tnaW15JF17MCw0fScsCiAgICAgICAgbmV4dDogJ2tleScKICAgICAgfSwgewogICAgICAgIHRva2VuOiAnY29uc3RhbnQubnVtZXJpYycsCiAgICAgICAgcmVnZXg6ICcoPzoweFtcXGRhLWZBLUZdW1xcZGEtZkEtRl9dKnwoPzpbMi05XXxbMTJdXFxkfDNbMC02XSlyW1xcZGEtekEtWl1bXFxkYS16QS1aX10qfCg/OlxcZFtcXGRfXSooPzpcXC5cXGRbXFxkX10qKT98XFwuXFxkW1xcZF9dKikoPzplWystXT9cXGRbXFxkX10qKT9bXFx3JF0qKScKICAgICAgfSwgewogICAgICAgIHRva2VuOiAnbHBhcmVuJywKICAgICAgICByZWdleDogJ1soe1tdJwogICAgICB9LCB7CiAgICAgICAgdG9rZW46ICdycGFyZW4nLAogICAgICAgIHJlZ2V4OiAnWyl9XFxdXScsCiAgICAgICAgbmV4dDogJ2tleScKICAgICAgfSwgewogICAgICAgIHRva2VuOiAna2V5d29yZC5vcGVyYXRvcicsCiAgICAgICAgcmVnZXg6ICdcXFMrJwogICAgICB9LCB7CiAgICAgICAgdG9rZW46ICd0ZXh0JywKICAgICAgICByZWdleDogJ1xccysnCiAgICAgIH0KICAgIF0sCiAgICBoZXJlZ2V4OiBbCiAgICAgIHsKICAgICAgICB0b2tlbjogJ3N0cmluZy5yZWdleCcsCiAgICAgICAgcmVnZXg6ICcuKj8vL1tnaW15JD9dezAsNH0nLAogICAgICAgIG5leHQ6ICdzdGFydCcKICAgICAgfSwgewogICAgICAgIHRva2VuOiAnc3RyaW5nLnJlZ2V4JywKICAgICAgICByZWdleDogJ1xccyojeycKICAgICAgfSwgewogICAgICAgIHRva2VuOiAnY29tbWVudC5yZWdleCcsCiAgICAgICAgcmVnZXg6ICdcXHMrKD86Iy4qKT8nCiAgICAgIH0sIHsKICAgICAgICB0b2tlbjogJ3N0cmluZy5yZWdleCcsCiAgICAgICAgcmVnZXg6ICdcXFMrJwogICAgICB9CiAgICBdLAogICAga2V5OiBbCiAgICAgIHsKICAgICAgICB0b2tlbjogJ2tleXdvcmQub3BlcmF0b3InLAogICAgICAgIHJlZ2V4OiAnWy4/QCFdKycKICAgICAgfSwgewogICAgICAgIHRva2VuOiAnaWRlbnRpZmllcicsCiAgICAgICAgcmVnZXg6IGlkZW50aWZpZXIsCiAgICAgICAgbmV4dDogJ3N0YXJ0JwogICAgICB9LCB7CiAgICAgICAgdG9rZW46ICd0ZXh0JywKICAgICAgICByZWdleDogJycsCiAgICAgICAgbmV4dDogJ3N0YXJ0JwogICAgICB9CiAgICBdLAogICAgY29tbWVudDogWwogICAgICB7CiAgICAgICAgdG9rZW46ICdjb21tZW50LmRvYycsCiAgICAgICAgcmVnZXg6ICcuKj9cXCovJywKICAgICAgICBuZXh0OiAnc3RhcnQnCiAgICAgIH0sIHsKICAgICAgICB0b2tlbjogJ2NvbW1lbnQuZG9jJywKICAgICAgICByZWdleDogJy4rJwogICAgICB9CiAgICBdLAogICAgcWRvYzogWwogICAgICB7CiAgICAgICAgdG9rZW46ICdzdHJpbmcnLAogICAgICAgIHJlZ2V4OiAiLio/JycnIiwKICAgICAgICBuZXh0OiAna2V5JwogICAgICB9LCBzdHJpbmdmaWxsCiAgICBdLAogICAgcXFkb2M6IFsKICAgICAgewogICAgICAgIHRva2VuOiAnc3RyaW5nJywKICAgICAgICByZWdleDogJy4qPyIiIicsCiAgICAgICAgbmV4dDogJ2tleScKICAgICAgfSwgc3RyaW5nZmlsbAogICAgXSwKICAgIHFzdHJpbmc6IFsKICAgICAgewogICAgICAgIHRva2VuOiAnc3RyaW5nJywKICAgICAgICByZWdleDogJ1teXFxcXFwnXSooPzpcXFxcLlteXFxcXFwnXSopKlwnJywKICAgICAgICBuZXh0OiAna2V5JwogICAgICB9LCBzdHJpbmdmaWxsCiAgICBdLAogICAgcXFzdHJpbmc6IFsKICAgICAgewogICAgICAgIHRva2VuOiAnc3RyaW5nJywKICAgICAgICByZWdleDogJ1teXFxcXCJdKig/OlxcXFwuW15cXFxcIl0qKSoiJywKICAgICAgICBuZXh0OiAna2V5JwogICAgICB9LCBzdHJpbmdmaWxsCiAgICBdLAogICAganM6IFsKICAgICAgewogICAgICAgIHRva2VuOiAnc3RyaW5nJywKICAgICAgICByZWdleDogJ1teXFxcXGBdKig/OlxcXFwuW15cXFxcYF0qKSpgJywKICAgICAgICBuZXh0OiAna2V5JwogICAgICB9LCBzdHJpbmdmaWxsCiAgICBdLAogICAgd29yZHM6IFsKICAgICAgewogICAgICAgIHRva2VuOiAnc3RyaW5nJywKICAgICAgICByZWdleDogJy4qP1xcXT4nLAogICAgICAgIG5leHQ6ICdrZXknCiAgICAgIH0sIHN0cmluZ2ZpbGwKICAgIF0KICB9OwogIGZvciAodmFyIGlkeCBpbiBSdWxlcykgewogICAgdmFyIHIgPSBSdWxlc1tpZHhdOwogICAgaWYgKHIuc3BsaWNlKSB7CiAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSByLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7CiAgICAgICAgdmFyIHJyID0gcltpXTsKICAgICAgICBpZiAodHlwZW9mIHJyLnJlZ2V4ID09PSAnc3RyaW5nJykgewogICAgICAgICAgUnVsZXNbaWR4XVtpXS5yZWdleCA9IG5ldyBSZWdFeHAoJ14nICsgcnIucmVnZXgpOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIGlmICh0eXBlb2YgcnIucmVnZXggPT09ICdzdHJpbmcnKSB7CiAgICAgIFJ1bGVzW2lkeF0ucmVnZXggPSBuZXcgUmVnRXhwKCdeJyArIHIucmVnZXgpOwogICAgfQogIH0KCiAgQ29kZU1pcnJvci5kZWZpbmVNSU1FKCd0ZXh0L3gtbGl2ZXNjcmlwdCcsICdsaXZlc2NyaXB0Jyk7Cgp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/lua/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/lua/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogTHVhIG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL3RoZW1lL25lYXQuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2FkZG9uL2VkaXQvbWF0Y2hicmFja2V0cy5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi8uLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJsdWEuanMiPjwvc2NyaXB0Pgo8c3R5bGU+LkNvZGVNaXJyb3Ige2JvcmRlcjogMXB4IHNvbGlkIGJsYWNrO308L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5MdWE8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPkx1YSBtb2RlPC9oMj4KPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KLS1bWwpleGFtcGxlIHVzZWxlc3MgY29kZSB0byBzaG93IGx1YSBzeW50YXggaGlnaGxpZ2h0aW5nCnRoaXMgaXMgbXVsdGlsaW5lIGNvbW1lbnQKXV0KCmZ1bmN0aW9uIGJsYWhibGFoYmxhaCh4KQoKICBsb2NhbCB0YWJsZSA9IHsKICAgICJhc2QiID0gMTIzLAogICAgIngiID0gMC4zNCwgIAogIH0KICBpZiB4IH49IDMgdGhlbgogICAgcHJpbnQoIHggKQogIGVsc2VpZiB4ID09ICJzdHJpbmciCiAgICBteV9jdXN0b21fZnVuY3Rpb24oIDB4MzQgKQogIGVsc2UKICAgIHVua25vd25fZnVuY3Rpb24oICJzb21lIHN0cmluZyIgKQogIGVuZAoKICAtLXNpbmdsZSBsaW5lIGNvbW1lbnQKICAKZW5kCgpmdW5jdGlvbiBibGFibGFibGEzKCkKCiAgZm9yIGssdiBpbiBpcGFpcnMoIHRhYmxlICkgZG8KICAgIC0tYWJjZGUuLgogICAgeT1bPVsKICB4PVtbCiAgICAgIHggaXMgYSBtdWx0aSBsaW5lIHN0cmluZwogICBdXQogIGJ1dCBpdHMgZGVmaW5pdGlvbiBpcyBpc2lkZSBhIGhpZ2hlc3QgbGV2ZWwgc3RyaW5nIQogIF09XQogICAgcHJpbnQoIiBcIlwiICIpCgogICAgcyA9IG1hdGguc2luKCB4ICkKICBlbmQKCmVuZAo8L3RleHRhcmVhPjwvZm9ybT4KICAgIDxzY3JpcHQ+CiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICAgICAgbWF0Y2hCcmFja2V0czogdHJ1ZSwKICAgICAgICB0aGVtZTogIm5lYXQiCiAgICAgIH0pOwogICAgPC9zY3JpcHQ+CgogICAgPHA+TG9vc2VseSBiYXNlZCBvbiBGcmFuY2lzemVrCiAgICBXYXdyemFrJ3MgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0LzEvY29udHJpYi9sdWEiPkNvZGVNaXJyb3IKICAgIDEgbW9kZTwvYT4uIE9uZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlciBpcwogICAgc3VwcG9ydGVkLCA8Y29kZT5zcGVjaWFsczwvY29kZT4sIHRvIHdoaWNoIHlvdSBjYW4gcHJvdmlkZSBhbgogICAgYXJyYXkgb2Ygc3RyaW5ncyB0byBoYXZlIHRob3NlIGlkZW50aWZpZXJzIGhpZ2hsaWdodGVkIHdpdGgKICAgIHRoZSA8Y29kZT5sdWEtc3BlY2lhbDwvY29kZT4gc3R5bGUuPC9wPgogICAgPHA+PHN0cm9uZz5NSU1FIHR5cGVzIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPnRleHQveC1sdWE8L2NvZGU+LjwvcD4KCiAgPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/lua/lua.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovLyBMVUEgbW9kZS4gUG9ydGVkIHRvIENvZGVNaXJyb3IgMiBmcm9tIEZyYW5jaXN6ZWsgV2F3cnphaydzCi8vIENvZGVNaXJyb3IgMSBtb2RlLgovLyBoaWdobGlnaHRzIGtleXdvcmRzLCBzdHJpbmdzLCBjb21tZW50cyAobm8gbGV2ZWxpbmcgc3VwcG9ydGVkISAoIls9PVsiKSksIHRva2VucywgYmFzaWMgaW5kZW50aW5nCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJsdWEiLCBmdW5jdGlvbihjb25maWcsIHBhcnNlckNvbmZpZykgewogIHZhciBpbmRlbnRVbml0ID0gY29uZmlnLmluZGVudFVuaXQ7CgogIGZ1bmN0aW9uIHByZWZpeFJFKHdvcmRzKSB7CiAgICByZXR1cm4gbmV3IFJlZ0V4cCgiXig/OiIgKyB3b3Jkcy5qb2luKCJ8IikgKyAiKSIsICJpIik7CiAgfQogIGZ1bmN0aW9uIHdvcmRSRSh3b3JkcykgewogICAgcmV0dXJuIG5ldyBSZWdFeHAoIl4oPzoiICsgd29yZHMuam9pbigifCIpICsgIikkIiwgImkiKTsKICB9CiAgdmFyIHNwZWNpYWxzID0gd29yZFJFKHBhcnNlckNvbmZpZy5zcGVjaWFscyB8fCBbXSk7CgogIC8vIGxvbmcgbGlzdCBvZiBzdGFuZGFyZCBmdW5jdGlvbnMgZnJvbSBsdWEgbWFudWFsCiAgdmFyIGJ1aWx0aW5zID0gd29yZFJFKFsKICAgICJfRyIsIl9WRVJTSU9OIiwiYXNzZXJ0IiwiY29sbGVjdGdhcmJhZ2UiLCJkb2ZpbGUiLCJlcnJvciIsImdldGZlbnYiLCJnZXRtZXRhdGFibGUiLCJpcGFpcnMiLCJsb2FkIiwKICAgICJsb2FkZmlsZSIsImxvYWRzdHJpbmciLCJtb2R1bGUiLCJuZXh0IiwicGFpcnMiLCJwY2FsbCIsInByaW50IiwicmF3ZXF1YWwiLCJyYXdnZXQiLCJyYXdzZXQiLCJyZXF1aXJlIiwKICAgICJzZWxlY3QiLCJzZXRmZW52Iiwic2V0bWV0YXRhYmxlIiwidG9udW1iZXIiLCJ0b3N0cmluZyIsInR5cGUiLCJ1bnBhY2siLCJ4cGNhbGwiLAoKICAgICJjb3JvdXRpbmUuY3JlYXRlIiwiY29yb3V0aW5lLnJlc3VtZSIsImNvcm91dGluZS5ydW5uaW5nIiwiY29yb3V0aW5lLnN0YXR1cyIsImNvcm91dGluZS53cmFwIiwiY29yb3V0aW5lLnlpZWxkIiwKCiAgICAiZGVidWcuZGVidWciLCJkZWJ1Zy5nZXRmZW52IiwiZGVidWcuZ2V0aG9vayIsImRlYnVnLmdldGluZm8iLCJkZWJ1Zy5nZXRsb2NhbCIsImRlYnVnLmdldG1ldGF0YWJsZSIsCiAgICAiZGVidWcuZ2V0cmVnaXN0cnkiLCJkZWJ1Zy5nZXR1cHZhbHVlIiwiZGVidWcuc2V0ZmVudiIsImRlYnVnLnNldGhvb2siLCJkZWJ1Zy5zZXRsb2NhbCIsImRlYnVnLnNldG1ldGF0YWJsZSIsCiAgICAiZGVidWcuc2V0dXB2YWx1ZSIsImRlYnVnLnRyYWNlYmFjayIsCgogICAgImNsb3NlIiwiZmx1c2giLCJsaW5lcyIsInJlYWQiLCJzZWVrIiwic2V0dmJ1ZiIsIndyaXRlIiwKCiAgICAiaW8uY2xvc2UiLCJpby5mbHVzaCIsImlvLmlucHV0IiwiaW8ubGluZXMiLCJpby5vcGVuIiwiaW8ub3V0cHV0IiwiaW8ucG9wZW4iLCJpby5yZWFkIiwiaW8uc3RkZXJyIiwiaW8uc3RkaW4iLAogICAgImlvLnN0ZG91dCIsImlvLnRtcGZpbGUiLCJpby50eXBlIiwiaW8ud3JpdGUiLAoKICAgICJtYXRoLmFicyIsIm1hdGguYWNvcyIsIm1hdGguYXNpbiIsIm1hdGguYXRhbiIsIm1hdGguYXRhbjIiLCJtYXRoLmNlaWwiLCJtYXRoLmNvcyIsIm1hdGguY29zaCIsIm1hdGguZGVnIiwKICAgICJtYXRoLmV4cCIsIm1hdGguZmxvb3IiLCJtYXRoLmZtb2QiLCJtYXRoLmZyZXhwIiwibWF0aC5odWdlIiwibWF0aC5sZGV4cCIsIm1hdGgubG9nIiwibWF0aC5sb2cxMCIsIm1hdGgubWF4IiwKICAgICJtYXRoLm1pbiIsIm1hdGgubW9kZiIsIm1hdGgucGkiLCJtYXRoLnBvdyIsIm1hdGgucmFkIiwibWF0aC5yYW5kb20iLCJtYXRoLnJhbmRvbXNlZWQiLCJtYXRoLnNpbiIsIm1hdGguc2luaCIsCiAgICAibWF0aC5zcXJ0IiwibWF0aC50YW4iLCJtYXRoLnRhbmgiLAoKICAgICJvcy5jbG9jayIsIm9zLmRhdGUiLCJvcy5kaWZmdGltZSIsIm9zLmV4ZWN1dGUiLCJvcy5leGl0Iiwib3MuZ2V0ZW52Iiwib3MucmVtb3ZlIiwib3MucmVuYW1lIiwib3Muc2V0bG9jYWxlIiwKICAgICJvcy50aW1lIiwib3MudG1wbmFtZSIsCgogICAgInBhY2thZ2UuY3BhdGgiLCJwYWNrYWdlLmxvYWRlZCIsInBhY2thZ2UubG9hZGVycyIsInBhY2thZ2UubG9hZGxpYiIsInBhY2thZ2UucGF0aCIsInBhY2thZ2UucHJlbG9hZCIsCiAgICAicGFja2FnZS5zZWVhbGwiLAoKICAgICJzdHJpbmcuYnl0ZSIsInN0cmluZy5jaGFyIiwic3RyaW5nLmR1bXAiLCJzdHJpbmcuZmluZCIsInN0cmluZy5mb3JtYXQiLCJzdHJpbmcuZ21hdGNoIiwic3RyaW5nLmdzdWIiLAogICAgInN0cmluZy5sZW4iLCJzdHJpbmcubG93ZXIiLCJzdHJpbmcubWF0Y2giLCJzdHJpbmcucmVwIiwic3RyaW5nLnJldmVyc2UiLCJzdHJpbmcuc3ViIiwic3RyaW5nLnVwcGVyIiwKCiAgICAidGFibGUuY29uY2F0IiwidGFibGUuaW5zZXJ0IiwidGFibGUubWF4biIsInRhYmxlLnJlbW92ZSIsInRhYmxlLnNvcnQiCiAgXSk7CiAgdmFyIGtleXdvcmRzID0gd29yZFJFKFsiYW5kIiwiYnJlYWsiLCJlbHNlaWYiLCJmYWxzZSIsIm5pbCIsIm5vdCIsIm9yIiwicmV0dXJuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICJ0cnVlIiwiZnVuY3Rpb24iLCAiZW5kIiwgImlmIiwgInRoZW4iLCAiZWxzZSIsICJkbyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAid2hpbGUiLCAicmVwZWF0IiwgInVudGlsIiwgImZvciIsICJpbiIsICJsb2NhbCIgXSk7CgogIHZhciBpbmRlbnRUb2tlbnMgPSB3b3JkUkUoWyJmdW5jdGlvbiIsICJpZiIsInJlcGVhdCIsImRvIiwgIlxcKCIsICJ7Il0pOwogIHZhciBkZWRlbnRUb2tlbnMgPSB3b3JkUkUoWyJlbmQiLCAidW50aWwiLCAiXFwpIiwgIn0iXSk7CiAgdmFyIGRlZGVudFBhcnRpYWwgPSBwcmVmaXhSRShbImVuZCIsICJ1bnRpbCIsICJcXCkiLCAifSIsICJlbHNlIiwgImVsc2VpZiJdKTsKCiAgZnVuY3Rpb24gcmVhZEJyYWNrZXQoc3RyZWFtKSB7CiAgICB2YXIgbGV2ZWwgPSAwOwogICAgd2hpbGUgKHN0cmVhbS5lYXQoIj0iKSkgKytsZXZlbDsKICAgIHN0cmVhbS5lYXQoIlsiKTsKICAgIHJldHVybiBsZXZlbDsKICB9CgogIGZ1bmN0aW9uIG5vcm1hbChzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpOwogICAgaWYgKGNoID09ICItIiAmJiBzdHJlYW0uZWF0KCItIikpIHsKICAgICAgaWYgKHN0cmVhbS5lYXQoIlsiKSAmJiBzdHJlYW0uZWF0KCJbIikpCiAgICAgICAgcmV0dXJuIChzdGF0ZS5jdXIgPSBicmFja2V0ZWQocmVhZEJyYWNrZXQoc3RyZWFtKSwgImNvbW1lbnQiKSkoc3RyZWFtLCBzdGF0ZSk7CiAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgcmV0dXJuICJjb21tZW50IjsKICAgIH0KICAgIGlmIChjaCA9PSAiXCIiIHx8IGNoID09ICInIikKICAgICAgcmV0dXJuIChzdGF0ZS5jdXIgPSBzdHJpbmcoY2gpKShzdHJlYW0sIHN0YXRlKTsKICAgIGlmIChjaCA9PSAiWyIgJiYgL1tcWz1dLy50ZXN0KHN0cmVhbS5wZWVrKCkpKQogICAgICByZXR1cm4gKHN0YXRlLmN1ciA9IGJyYWNrZXRlZChyZWFkQnJhY2tldChzdHJlYW0pLCAic3RyaW5nIikpKHN0cmVhbSwgc3RhdGUpOwogICAgaWYgKC9cZC8udGVzdChjaCkpIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXHcuJV0vKTsKICAgICAgcmV0dXJuICJudW1iZXIiOwogICAgfQogICAgaWYgKC9bXHdfXS8udGVzdChjaCkpIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXHdcXFwtXy5dLyk7CiAgICAgIHJldHVybiAidmFyaWFibGUiOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBmdW5jdGlvbiBicmFja2V0ZWQobGV2ZWwsIHN0eWxlKSB7CiAgICByZXR1cm4gZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICB2YXIgY3VybGV2ID0gbnVsbCwgY2g7CiAgICAgIHdoaWxlICgoY2ggPSBzdHJlYW0ubmV4dCgpKSAhPSBudWxsKSB7CiAgICAgICAgaWYgKGN1cmxldiA9PSBudWxsKSB7aWYgKGNoID09ICJdIikgY3VybGV2ID0gMDt9CiAgICAgICAgZWxzZSBpZiAoY2ggPT0gIj0iKSArK2N1cmxldjsKICAgICAgICBlbHNlIGlmIChjaCA9PSAiXSIgJiYgY3VybGV2ID09IGxldmVsKSB7IHN0YXRlLmN1ciA9IG5vcm1hbDsgYnJlYWs7IH0KICAgICAgICBlbHNlIGN1cmxldiA9IG51bGw7CiAgICAgIH0KICAgICAgcmV0dXJuIHN0eWxlOwogICAgfTsKICB9CgogIGZ1bmN0aW9uIHN0cmluZyhxdW90ZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgdmFyIGVzY2FwZWQgPSBmYWxzZSwgY2g7CiAgICAgIHdoaWxlICgoY2ggPSBzdHJlYW0ubmV4dCgpKSAhPSBudWxsKSB7CiAgICAgICAgaWYgKGNoID09IHF1b3RlICYmICFlc2NhcGVkKSBicmVhazsKICAgICAgICBlc2NhcGVkID0gIWVzY2FwZWQgJiYgY2ggPT0gIlxcIjsKICAgICAgfQogICAgICBpZiAoIWVzY2FwZWQpIHN0YXRlLmN1ciA9IG5vcm1hbDsKICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgfTsKICB9CgogIHJldHVybiB7CiAgICBzdGFydFN0YXRlOiBmdW5jdGlvbihiYXNlY29sKSB7CiAgICAgIHJldHVybiB7YmFzZWNvbDogYmFzZWNvbCB8fCAwLCBpbmRlbnREZXB0aDogMCwgY3VyOiBub3JtYWx9OwogICAgfSwKCiAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICBpZiAoc3RyZWFtLmVhdFNwYWNlKCkpIHJldHVybiBudWxsOwogICAgICB2YXIgc3R5bGUgPSBzdGF0ZS5jdXIoc3RyZWFtLCBzdGF0ZSk7CiAgICAgIHZhciB3b3JkID0gc3RyZWFtLmN1cnJlbnQoKTsKICAgICAgaWYgKHN0eWxlID09ICJ2YXJpYWJsZSIpIHsKICAgICAgICBpZiAoa2V5d29yZHMudGVzdCh3b3JkKSkgc3R5bGUgPSAia2V5d29yZCI7CiAgICAgICAgZWxzZSBpZiAoYnVpbHRpbnMudGVzdCh3b3JkKSkgc3R5bGUgPSAiYnVpbHRpbiI7CiAgICAgICAgZWxzZSBpZiAoc3BlY2lhbHMudGVzdCh3b3JkKSkgc3R5bGUgPSAidmFyaWFibGUtMiI7CiAgICAgIH0KICAgICAgaWYgKChzdHlsZSAhPSAiY29tbWVudCIpICYmIChzdHlsZSAhPSAic3RyaW5nIikpewogICAgICAgIGlmIChpbmRlbnRUb2tlbnMudGVzdCh3b3JkKSkgKytzdGF0ZS5pbmRlbnREZXB0aDsKICAgICAgICBlbHNlIGlmIChkZWRlbnRUb2tlbnMudGVzdCh3b3JkKSkgLS1zdGF0ZS5pbmRlbnREZXB0aDsKICAgICAgfQogICAgICByZXR1cm4gc3R5bGU7CiAgICB9LAoKICAgIGluZGVudDogZnVuY3Rpb24oc3RhdGUsIHRleHRBZnRlcikgewogICAgICB2YXIgY2xvc2luZyA9IGRlZGVudFBhcnRpYWwudGVzdCh0ZXh0QWZ0ZXIpOwogICAgICByZXR1cm4gc3RhdGUuYmFzZWNvbCArIGluZGVudFVuaXQgKiAoc3RhdGUuaW5kZW50RGVwdGggLSAoY2xvc2luZyA/IDEgOiAwKSk7CiAgICB9LAoKICAgIGxpbmVDb21tZW50OiAiLS0iLAogICAgYmxvY2tDb21tZW50U3RhcnQ6ICItLVtbIiwKICAgIGJsb2NrQ29tbWVudEVuZDogIl1dIgogIH07Cn0pOwoKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtbHVhIiwgImx1YSIpOwoKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/markdown/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/markdown/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogTWFya2Rvd24gbW9kZTwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uLy4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxzY3JpcHQgc3JjPSIuLi8uLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi8uLi9hZGRvbi9lZGl0L2NvbnRpbnVlbGlzdC5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi94bWwveG1sLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Im1hcmtkb3duLmpzIj48L3NjcmlwdD4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KICAgICAgLkNvZGVNaXJyb3Ige2JvcmRlci10b3A6IDFweCBzb2xpZCBibGFjazsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO30KICAgICAgLmNtLXMtZGVmYXVsdCAuY20tdHJhaWxpbmctc3BhY2UtYTpiZWZvcmUsCiAgICAgIC5jbS1zLWRlZmF1bHQgLmNtLXRyYWlsaW5nLXNwYWNlLWI6YmVmb3JlIHtwb3NpdGlvbjogYWJzb2x1dGU7IGNvbnRlbnQ6ICJcMDBCNyI7IGNvbG9yOiAjNzc3O30KICAgICAgLmNtLXMtZGVmYXVsdCAuY20tdHJhaWxpbmctc3BhY2UtbmV3LWxpbmU6YmVmb3JlIHtwb3NpdGlvbjogYWJzb2x1dGU7IGNvbnRlbnQ6ICJcMjFCNSI7IGNvbG9yOiAjNzc3O30KICAgIDwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGltZyBpZD1sb2dvIHNyYz0iLi4vLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+TGFuZ3VhZ2UgbW9kZXM8L2E+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPk1hcmtkb3duPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5NYXJrZG93biBtb2RlPC9oMj4KPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KTWFya2Rvd246IEJhc2ljcwo9PT09PT09PT09PT09PT09CgombHQ7dWwgaWQ9IlByb2plY3RTdWJtZW51IiZndDsKICAgICZsdDtsaSZndDsmbHQ7YSBocmVmPSIvcHJvamVjdHMvbWFya2Rvd24vIiB0aXRsZT0iTWFya2Rvd24gUHJvamVjdCBQYWdlIiZndDtNYWluJmx0Oy9hJmd0OyZsdDsvbGkmZ3Q7CiAgICAmbHQ7bGkmZ3Q7Jmx0O2EgY2xhc3M9InNlbGVjdGVkIiB0aXRsZT0iTWFya2Rvd24gQmFzaWNzIiZndDtCYXNpY3MmbHQ7L2EmZ3Q7Jmx0Oy9saSZndDsKICAgICZsdDtsaSZndDsmbHQ7YSBocmVmPSIvcHJvamVjdHMvbWFya2Rvd24vc3ludGF4IiB0aXRsZT0iTWFya2Rvd24gU3ludGF4IERvY3VtZW50YXRpb24iJmd0O1N5bnRheCZsdDsvYSZndDsmbHQ7L2xpJmd0OwogICAgJmx0O2xpJmd0OyZsdDthIGhyZWY9Ii9wcm9qZWN0cy9tYXJrZG93bi9saWNlbnNlIiB0aXRsZT0iUHJpY2luZyBhbmQgTGljZW5zZSBJbmZvcm1hdGlvbiImZ3Q7TGljZW5zZSZsdDsvYSZndDsmbHQ7L2xpJmd0OwogICAgJmx0O2xpJmd0OyZsdDthIGhyZWY9Ii9wcm9qZWN0cy9tYXJrZG93bi9kaW5ndXMiIHRpdGxlPSJPbmxpbmUgTWFya2Rvd24gV2ViIEZvcm0iJmd0O0Rpbmd1cyZsdDsvYSZndDsmbHQ7L2xpJmd0OwombHQ7L3VsJmd0OwoKCkdldHRpbmcgdGhlIEdpc3Qgb2YgTWFya2Rvd24ncyBGb3JtYXR0aW5nIFN5bnRheAotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KClRoaXMgcGFnZSBvZmZlcnMgYSBicmllZiBvdmVydmlldyBvZiB3aGF0IGl0J3MgbGlrZSB0byB1c2UgTWFya2Rvd24uClRoZSBbc3ludGF4IHBhZ2VdIFtzXSBwcm92aWRlcyBjb21wbGV0ZSwgZGV0YWlsZWQgZG9jdW1lbnRhdGlvbiBmb3IKZXZlcnkgZmVhdHVyZSwgYnV0IE1hcmtkb3duIHNob3VsZCBiZSB2ZXJ5IGVhc3kgdG8gcGljayB1cCBzaW1wbHkgYnkKbG9va2luZyBhdCBhIGZldyBleGFtcGxlcyBvZiBpdCBpbiBhY3Rpb24uIFRoZSBleGFtcGxlcyBvbiB0aGlzIHBhZ2UKYXJlIHdyaXR0ZW4gaW4gYSBiZWZvcmUvYWZ0ZXIgc3R5bGUsIHNob3dpbmcgZXhhbXBsZSBzeW50YXggYW5kIHRoZQpIVE1MIG91dHB1dCBwcm9kdWNlZCBieSBNYXJrZG93bi4KCkl0J3MgYWxzbyBoZWxwZnVsIHRvIHNpbXBseSB0cnkgTWFya2Rvd24gb3V0OyB0aGUgW0Rpbmd1c10gW2RdIGlzIGEKd2ViIGFwcGxpY2F0aW9uIHRoYXQgYWxsb3dzIHlvdSB0eXBlIHlvdXIgb3duIE1hcmtkb3duLWZvcm1hdHRlZCB0ZXh0CmFuZCB0cmFuc2xhdGUgaXQgdG8gWEhUTUwuCgoqKk5vdGU6KiogVGhpcyBkb2N1bWVudCBpcyBpdHNlbGYgd3JpdHRlbiB1c2luZyBNYXJrZG93bjsgeW91CmNhbiBbc2VlIHRoZSBzb3VyY2UgZm9yIGl0IGJ5IGFkZGluZyAnLnRleHQnIHRvIHRoZSBVUkxdIFtzcmNdLgoKICBbc106IC9wcm9qZWN0cy9tYXJrZG93bi9zeW50YXggICJNYXJrZG93biBTeW50YXgiCiAgW2RdOiAvcHJvamVjdHMvbWFya2Rvd24vZGluZ3VzICAiTWFya2Rvd24gRGluZ3VzIgogIFtzcmNdOiAvcHJvamVjdHMvbWFya2Rvd24vYmFzaWNzLnRleHQKCgojIyBQYXJhZ3JhcGhzLCBIZWFkZXJzLCBCbG9ja3F1b3RlcyAjIwoKQSBwYXJhZ3JhcGggaXMgc2ltcGx5IG9uZSBvciBtb3JlIGNvbnNlY3V0aXZlIGxpbmVzIG9mIHRleHQsIHNlcGFyYXRlZApieSBvbmUgb3IgbW9yZSBibGFuayBsaW5lcy4gKEEgYmxhbmsgbGluZSBpcyBhbnkgbGluZSB0aGF0IGxvb2tzIGxpa2UKYSBibGFuayBsaW5lIC0tIGEgbGluZSBjb250YWluaW5nIG5vdGhpbmcgYnV0IHNwYWNlcyBvciB0YWJzIGlzCmNvbnNpZGVyZWQgYmxhbmsuKSBOb3JtYWwgcGFyYWdyYXBocyBzaG91bGQgbm90IGJlIGluZGVudGVkIHdpdGgKc3BhY2VzIG9yIHRhYnMuCgpNYXJrZG93biBvZmZlcnMgdHdvIHN0eWxlcyBvZiBoZWFkZXJzOiAqU2V0ZXh0KiBhbmQgKmF0eCouClNldGV4dC1zdHlsZSBoZWFkZXJzIGZvciBgJmx0O2gxJmd0O2AgYW5kIGAmbHQ7aDImZ3Q7YCBhcmUgY3JlYXRlZCBieQoidW5kZXJsaW5pbmciIHdpdGggZXF1YWwgc2lnbnMgKGA9YCkgYW5kIGh5cGhlbnMgKGAtYCksIHJlc3BlY3RpdmVseS4KVG8gY3JlYXRlIGFuIGF0eC1zdHlsZSBoZWFkZXIsIHlvdSBwdXQgMS02IGhhc2ggbWFya3MgKGAjYCkgYXQgdGhlCmJlZ2lubmluZyBvZiB0aGUgbGluZSAtLSB0aGUgbnVtYmVyIG9mIGhhc2hlcyBlcXVhbHMgdGhlIHJlc3VsdGluZwpIVE1MIGhlYWRlciBsZXZlbC4KCkJsb2NrcXVvdGVzIGFyZSBpbmRpY2F0ZWQgdXNpbmcgZW1haWwtc3R5bGUgJ2AmZ3Q7YCcgYW5nbGUgYnJhY2tldHMuCgpNYXJrZG93bjoKCiAgICBBIEZpcnN0IExldmVsIEhlYWRlcgogICAgPT09PT09PT09PT09PT09PT09PT0KICAgIAogICAgQSBTZWNvbmQgTGV2ZWwgSGVhZGVyCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICBOb3cgaXMgdGhlIHRpbWUgZm9yIGFsbCBnb29kIG1lbiB0byBjb21lIHRvCiAgICB0aGUgYWlkIG9mIHRoZWlyIGNvdW50cnkuIFRoaXMgaXMganVzdCBhCiAgICByZWd1bGFyIHBhcmFncmFwaC4KCiAgICBUaGUgcXVpY2sgYnJvd24gZm94IGp1bXBlZCBvdmVyIHRoZSBsYXp5CiAgICBkb2cncyBiYWNrLgogICAgCiAgICAjIyMgSGVhZGVyIDMKCiAgICAmZ3Q7IFRoaXMgaXMgYSBibG9ja3F1b3RlLgogICAgJmd0OyAKICAgICZndDsgVGhpcyBpcyB0aGUgc2Vjb25kIHBhcmFncmFwaCBpbiB0aGUgYmxvY2txdW90ZS4KICAgICZndDsKICAgICZndDsgIyMgVGhpcyBpcyBhbiBIMiBpbiBhIGJsb2NrcXVvdGUKCgpPdXRwdXQ6CgogICAgJmx0O2gxJmd0O0EgRmlyc3QgTGV2ZWwgSGVhZGVyJmx0Oy9oMSZndDsKICAgIAogICAgJmx0O2gyJmd0O0EgU2Vjb25kIExldmVsIEhlYWRlciZsdDsvaDImZ3Q7CiAgICAKICAgICZsdDtwJmd0O05vdyBpcyB0aGUgdGltZSBmb3IgYWxsIGdvb2QgbWVuIHRvIGNvbWUgdG8KICAgIHRoZSBhaWQgb2YgdGhlaXIgY291bnRyeS4gVGhpcyBpcyBqdXN0IGEKICAgIHJlZ3VsYXIgcGFyYWdyYXBoLiZsdDsvcCZndDsKICAgIAogICAgJmx0O3AmZ3Q7VGhlIHF1aWNrIGJyb3duIGZveCBqdW1wZWQgb3ZlciB0aGUgbGF6eQogICAgZG9nJ3MgYmFjay4mbHQ7L3AmZ3Q7CiAgICAKICAgICZsdDtoMyZndDtIZWFkZXIgMyZsdDsvaDMmZ3Q7CiAgICAKICAgICZsdDtibG9ja3F1b3RlJmd0OwogICAgICAgICZsdDtwJmd0O1RoaXMgaXMgYSBibG9ja3F1b3RlLiZsdDsvcCZndDsKICAgICAgICAKICAgICAgICAmbHQ7cCZndDtUaGlzIGlzIHRoZSBzZWNvbmQgcGFyYWdyYXBoIGluIHRoZSBibG9ja3F1b3RlLiZsdDsvcCZndDsKICAgICAgICAKICAgICAgICAmbHQ7aDImZ3Q7VGhpcyBpcyBhbiBIMiBpbiBhIGJsb2NrcXVvdGUmbHQ7L2gyJmd0OwogICAgJmx0Oy9ibG9ja3F1b3RlJmd0OwoKCgojIyMgUGhyYXNlIEVtcGhhc2lzICMjIwoKTWFya2Rvd24gdXNlcyBhc3Rlcmlza3MgYW5kIHVuZGVyc2NvcmVzIHRvIGluZGljYXRlIHNwYW5zIG9mIGVtcGhhc2lzLgoKTWFya2Rvd246CgogICAgU29tZSBvZiB0aGVzZSB3b3JkcyAqYXJlIGVtcGhhc2l6ZWQqLgogICAgU29tZSBvZiB0aGVzZSB3b3JkcyBfYXJlIGVtcGhhc2l6ZWQgYWxzb18uCiAgICAKICAgIFVzZSB0d28gYXN0ZXJpc2tzIGZvciAqKnN0cm9uZyBlbXBoYXNpcyoqLgogICAgT3IsIGlmIHlvdSBwcmVmZXIsIF9fdXNlIHR3byB1bmRlcnNjb3JlcyBpbnN0ZWFkX18uCgpPdXRwdXQ6CgogICAgJmx0O3AmZ3Q7U29tZSBvZiB0aGVzZSB3b3JkcyAmbHQ7ZW0mZ3Q7YXJlIGVtcGhhc2l6ZWQmbHQ7L2VtJmd0Oy4KICAgIFNvbWUgb2YgdGhlc2Ugd29yZHMgJmx0O2VtJmd0O2FyZSBlbXBoYXNpemVkIGFsc28mbHQ7L2VtJmd0Oy4mbHQ7L3AmZ3Q7CiAgICAKICAgICZsdDtwJmd0O1VzZSB0d28gYXN0ZXJpc2tzIGZvciAmbHQ7c3Ryb25nJmd0O3N0cm9uZyBlbXBoYXNpcyZsdDsvc3Ryb25nJmd0Oy4KICAgIE9yLCBpZiB5b3UgcHJlZmVyLCAmbHQ7c3Ryb25nJmd0O3VzZSB0d28gdW5kZXJzY29yZXMgaW5zdGVhZCZsdDsvc3Ryb25nJmd0Oy4mbHQ7L3AmZ3Q7CiAgIAoKCiMjIExpc3RzICMjCgpVbm9yZGVyZWQgKGJ1bGxldGVkKSBsaXN0cyB1c2UgYXN0ZXJpc2tzLCBwbHVzZXMsIGFuZCBoeXBoZW5zIChgKmAsCmArYCwgYW5kIGAtYCkgYXMgbGlzdCBtYXJrZXJzLiBUaGVzZSB0aHJlZSBtYXJrZXJzIGFyZQppbnRlcmNoYW5nYWJsZTsgdGhpczoKCiAgICAqICAgQ2FuZHkuCiAgICAqICAgR3VtLgogICAgKiAgIEJvb3plLgoKdGhpczoKCiAgICArICAgQ2FuZHkuCiAgICArICAgR3VtLgogICAgKyAgIEJvb3plLgoKYW5kIHRoaXM6CgogICAgLSAgIENhbmR5LgogICAgLSAgIEd1bS4KICAgIC0gICBCb296ZS4KCmFsbCBwcm9kdWNlIHRoZSBzYW1lIG91dHB1dDoKCiAgICAmbHQ7dWwmZ3Q7CiAgICAmbHQ7bGkmZ3Q7Q2FuZHkuJmx0Oy9saSZndDsKICAgICZsdDtsaSZndDtHdW0uJmx0Oy9saSZndDsKICAgICZsdDtsaSZndDtCb296ZS4mbHQ7L2xpJmd0OwogICAgJmx0Oy91bCZndDsKCk9yZGVyZWQgKG51bWJlcmVkKSBsaXN0cyB1c2UgcmVndWxhciBudW1iZXJzLCBmb2xsb3dlZCBieSBwZXJpb2RzLCBhcwpsaXN0IG1hcmtlcnM6CgogICAgMS4gIFJlZAogICAgMi4gIEdyZWVuCiAgICAzLiAgQmx1ZQoKT3V0cHV0OgoKICAgICZsdDtvbCZndDsKICAgICZsdDtsaSZndDtSZWQmbHQ7L2xpJmd0OwogICAgJmx0O2xpJmd0O0dyZWVuJmx0Oy9saSZndDsKICAgICZsdDtsaSZndDtCbHVlJmx0Oy9saSZndDsKICAgICZsdDsvb2wmZ3Q7CgpJZiB5b3UgcHV0IGJsYW5rIGxpbmVzIGJldHdlZW4gaXRlbXMsIHlvdSdsbCBnZXQgYCZsdDtwJmd0O2AgdGFncyBmb3IgdGhlCmxpc3QgaXRlbSB0ZXh0LiBZb3UgY2FuIGNyZWF0ZSBtdWx0aS1wYXJhZ3JhcGggbGlzdCBpdGVtcyBieSBpbmRlbnRpbmcKdGhlIHBhcmFncmFwaHMgYnkgNCBzcGFjZXMgb3IgMSB0YWI6CgogICAgKiAgIEEgbGlzdCBpdGVtLgogICAgCiAgICAgICAgV2l0aCBtdWx0aXBsZSBwYXJhZ3JhcGhzLgoKICAgICogICBBbm90aGVyIGl0ZW0gaW4gdGhlIGxpc3QuCgpPdXRwdXQ6CgogICAgJmx0O3VsJmd0OwogICAgJmx0O2xpJmd0OyZsdDtwJmd0O0EgbGlzdCBpdGVtLiZsdDsvcCZndDsKICAgICZsdDtwJmd0O1dpdGggbXVsdGlwbGUgcGFyYWdyYXBocy4mbHQ7L3AmZ3Q7Jmx0Oy9saSZndDsKICAgICZsdDtsaSZndDsmbHQ7cCZndDtBbm90aGVyIGl0ZW0gaW4gdGhlIGxpc3QuJmx0Oy9wJmd0OyZsdDsvbGkmZ3Q7CiAgICAmbHQ7L3VsJmd0OwogICAgCgoKIyMjIExpbmtzICMjIwoKTWFya2Rvd24gc3VwcG9ydHMgdHdvIHN0eWxlcyBmb3IgY3JlYXRpbmcgbGlua3M6ICppbmxpbmUqIGFuZAoqcmVmZXJlbmNlKi4gV2l0aCBib3RoIHN0eWxlcywgeW91IHVzZSBzcXVhcmUgYnJhY2tldHMgdG8gZGVsaW1pdCB0aGUKdGV4dCB5b3Ugd2FudCB0byB0dXJuIGludG8gYSBsaW5rLgoKSW5saW5lLXN0eWxlIGxpbmtzIHVzZSBwYXJlbnRoZXNlcyBpbW1lZGlhdGVseSBhZnRlciB0aGUgbGluayB0ZXh0LgpGb3IgZXhhbXBsZToKCiAgICBUaGlzIGlzIGFuIFtleGFtcGxlIGxpbmtdKGh0dHA6Ly9leGFtcGxlLmNvbS8pLgoKT3V0cHV0OgoKICAgICZsdDtwJmd0O1RoaXMgaXMgYW4gJmx0O2EgaHJlZj0iaHR0cDovL2V4YW1wbGUuY29tLyImZ3Q7CiAgICBleGFtcGxlIGxpbmsmbHQ7L2EmZ3Q7LiZsdDsvcCZndDsKCk9wdGlvbmFsbHksIHlvdSBtYXkgaW5jbHVkZSBhIHRpdGxlIGF0dHJpYnV0ZSBpbiB0aGUgcGFyZW50aGVzZXM6CgogICAgVGhpcyBpcyBhbiBbZXhhbXBsZSBsaW5rXShodHRwOi8vZXhhbXBsZS5jb20vICJXaXRoIGEgVGl0bGUiKS4KCk91dHB1dDoKCiAgICAmbHQ7cCZndDtUaGlzIGlzIGFuICZsdDthIGhyZWY9Imh0dHA6Ly9leGFtcGxlLmNvbS8iIHRpdGxlPSJXaXRoIGEgVGl0bGUiJmd0OwogICAgZXhhbXBsZSBsaW5rJmx0Oy9hJmd0Oy4mbHQ7L3AmZ3Q7CgpSZWZlcmVuY2Utc3R5bGUgbGlua3MgYWxsb3cgeW91IHRvIHJlZmVyIHRvIHlvdXIgbGlua3MgYnkgbmFtZXMsIHdoaWNoCnlvdSBkZWZpbmUgZWxzZXdoZXJlIGluIHlvdXIgZG9jdW1lbnQ6CgogICAgSSBnZXQgMTAgdGltZXMgbW9yZSB0cmFmZmljIGZyb20gW0dvb2dsZV1bMV0gdGhhbiBmcm9tCiAgICBbWWFob29dWzJdIG9yIFtNU05dWzNdLgoKICAgIFsxXTogaHR0cDovL2dvb2dsZS5jb20vICAgICAgICAiR29vZ2xlIgogICAgWzJdOiBodHRwOi8vc2VhcmNoLnlhaG9vLmNvbS8gICJZYWhvbyBTZWFyY2giCiAgICBbM106IGh0dHA6Ly9zZWFyY2gubXNuLmNvbS8gICAgIk1TTiBTZWFyY2giCgpPdXRwdXQ6CgogICAgJmx0O3AmZ3Q7SSBnZXQgMTAgdGltZXMgbW9yZSB0cmFmZmljIGZyb20gJmx0O2EgaHJlZj0iaHR0cDovL2dvb2dsZS5jb20vIgogICAgdGl0bGU9Ikdvb2dsZSImZ3Q7R29vZ2xlJmx0Oy9hJmd0OyB0aGFuIGZyb20gJmx0O2EgaHJlZj0iaHR0cDovL3NlYXJjaC55YWhvby5jb20vIgogICAgdGl0bGU9IllhaG9vIFNlYXJjaCImZ3Q7WWFob28mbHQ7L2EmZ3Q7IG9yICZsdDthIGhyZWY9Imh0dHA6Ly9zZWFyY2gubXNuLmNvbS8iCiAgICB0aXRsZT0iTVNOIFNlYXJjaCImZ3Q7TVNOJmx0Oy9hJmd0Oy4mbHQ7L3AmZ3Q7CgpUaGUgdGl0bGUgYXR0cmlidXRlIGlzIG9wdGlvbmFsLiBMaW5rIG5hbWVzIG1heSBjb250YWluIGxldHRlcnMsCm51bWJlcnMgYW5kIHNwYWNlcywgYnV0IGFyZSAqbm90KiBjYXNlIHNlbnNpdGl2ZToKCiAgICBJIHN0YXJ0IG15IG1vcm5pbmcgd2l0aCBhIGN1cCBvZiBjb2ZmZWUgYW5kCiAgICBbVGhlIE5ldyBZb3JrIFRpbWVzXVtOWSBUaW1lc10uCgogICAgW255IHRpbWVzXTogaHR0cDovL3d3dy5ueXRpbWVzLmNvbS8KCk91dHB1dDoKCiAgICAmbHQ7cCZndDtJIHN0YXJ0IG15IG1vcm5pbmcgd2l0aCBhIGN1cCBvZiBjb2ZmZWUgYW5kCiAgICAmbHQ7YSBocmVmPSJodHRwOi8vd3d3Lm55dGltZXMuY29tLyImZ3Q7VGhlIE5ldyBZb3JrIFRpbWVzJmx0Oy9hJmd0Oy4mbHQ7L3AmZ3Q7CgoKIyMjIEltYWdlcyAjIyMKCkltYWdlIHN5bnRheCBpcyB2ZXJ5IG11Y2ggbGlrZSBsaW5rIHN5bnRheC4KCklubGluZSAodGl0bGVzIGFyZSBvcHRpb25hbCk6CgogICAgIVthbHQgdGV4dF0oL3BhdGgvdG8vaW1nLmpwZyAiVGl0bGUiKQoKUmVmZXJlbmNlLXN0eWxlOgoKICAgICFbYWx0IHRleHRdW2lkXQoKICAgIFtpZF06IC9wYXRoL3RvL2ltZy5qcGcgIlRpdGxlIgoKQm90aCBvZiB0aGUgYWJvdmUgZXhhbXBsZXMgcHJvZHVjZSB0aGUgc2FtZSBvdXRwdXQ6CgogICAgJmx0O2ltZyBzcmM9Ii9wYXRoL3RvL2ltZy5qcGciIGFsdD0iYWx0IHRleHQiIHRpdGxlPSJUaXRsZSIgLyZndDsKCgoKIyMjIENvZGUgIyMjCgpJbiBhIHJlZ3VsYXIgcGFyYWdyYXBoLCB5b3UgY2FuIGNyZWF0ZSBjb2RlIHNwYW4gYnkgd3JhcHBpbmcgdGV4dCBpbgpiYWNrdGljayBxdW90ZXMuIEFueSBhbXBlcnNhbmRzIChgJmFtcDtgKSBhbmQgYW5nbGUgYnJhY2tldHMgKGAmbHQ7YCBvcgpgJmd0O2ApIHdpbGwgYXV0b21hdGljYWxseSBiZSB0cmFuc2xhdGVkIGludG8gSFRNTCBlbnRpdGllcy4gVGhpcyBtYWtlcwppdCBlYXN5IHRvIHVzZSBNYXJrZG93biB0byB3cml0ZSBhYm91dCBIVE1MIGV4YW1wbGUgY29kZToKCiAgICBJIHN0cm9uZ2x5IHJlY29tbWVuZCBhZ2FpbnN0IHVzaW5nIGFueSBgJmx0O2JsaW5rJmd0O2AgdGFncy4KCiAgICBJIHdpc2ggU21hcnR5UGFudHMgdXNlZCBuYW1lZCBlbnRpdGllcyBsaWtlIGAmYW1wO21kYXNoO2AKICAgIGluc3RlYWQgb2YgZGVjaW1hbC1lbmNvZGVkIGVudGl0ZXMgbGlrZSBgJmFtcDsjODIxMjtgLgoKT3V0cHV0OgoKICAgICZsdDtwJmd0O0kgc3Ryb25nbHkgcmVjb21tZW5kIGFnYWluc3QgdXNpbmcgYW55CiAgICAmbHQ7Y29kZSZndDsmYW1wO2x0O2JsaW5rJmFtcDtndDsmbHQ7L2NvZGUmZ3Q7IHRhZ3MuJmx0Oy9wJmd0OwogICAgCiAgICAmbHQ7cCZndDtJIHdpc2ggU21hcnR5UGFudHMgdXNlZCBuYW1lZCBlbnRpdGllcyBsaWtlCiAgICAmbHQ7Y29kZSZndDsmYW1wO2FtcDttZGFzaDsmbHQ7L2NvZGUmZ3Q7IGluc3RlYWQgb2YgZGVjaW1hbC1lbmNvZGVkCiAgICBlbnRpdGVzIGxpa2UgJmx0O2NvZGUmZ3Q7JmFtcDthbXA7IzgyMTI7Jmx0Oy9jb2RlJmd0Oy4mbHQ7L3AmZ3Q7CgoKVG8gc3BlY2lmeSBhbiBlbnRpcmUgYmxvY2sgb2YgcHJlLWZvcm1hdHRlZCBjb2RlLCBpbmRlbnQgZXZlcnkgbGluZSBvZgp0aGUgYmxvY2sgYnkgNCBzcGFjZXMgb3IgMSB0YWIuIEp1c3QgbGlrZSB3aXRoIGNvZGUgc3BhbnMsIGAmYW1wO2AsIGAmbHQ7YCwKYW5kIGAmZ3Q7YCBjaGFyYWN0ZXJzIHdpbGwgYmUgZXNjYXBlZCBhdXRvbWF0aWNhbGx5LgoKTWFya2Rvd246CgogICAgSWYgeW91IHdhbnQgeW91ciBwYWdlIHRvIHZhbGlkYXRlIHVuZGVyIFhIVE1MIDEuMCBTdHJpY3QsCiAgICB5b3UndmUgZ290IHRvIHB1dCBwYXJhZ3JhcGggdGFncyBpbiB5b3VyIGJsb2NrcXVvdGVzOgoKICAgICAgICAmbHQ7YmxvY2txdW90ZSZndDsKICAgICAgICAgICAgJmx0O3AmZ3Q7Rm9yIGV4YW1wbGUuJmx0Oy9wJmd0OwogICAgICAgICZsdDsvYmxvY2txdW90ZSZndDsKCk91dHB1dDoKCiAgICAmbHQ7cCZndDtJZiB5b3Ugd2FudCB5b3VyIHBhZ2UgdG8gdmFsaWRhdGUgdW5kZXIgWEhUTUwgMS4wIFN0cmljdCwKICAgIHlvdSd2ZSBnb3QgdG8gcHV0IHBhcmFncmFwaCB0YWdzIGluIHlvdXIgYmxvY2txdW90ZXM6Jmx0Oy9wJmd0OwogICAgCiAgICAmbHQ7cHJlJmd0OyZsdDtjb2RlJmd0OyZhbXA7bHQ7YmxvY2txdW90ZSZhbXA7Z3Q7CiAgICAgICAgJmFtcDtsdDtwJmFtcDtndDtGb3IgZXhhbXBsZS4mYW1wO2x0Oy9wJmFtcDtndDsKICAgICZhbXA7bHQ7L2Jsb2NrcXVvdGUmYW1wO2d0OwogICAgJmx0Oy9jb2RlJmd0OyZsdDsvcHJlJmd0Owo8L3RleHRhcmVhPjwvZm9ybT4KCiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgICAgIG1vZGU6ICdtYXJrZG93bicsCiAgICAgICAgbGluZU51bWJlcnM6IHRydWUsCiAgICAgICAgdGhlbWU6ICJkZWZhdWx0IiwKICAgICAgICBleHRyYUtleXM6IHsiRW50ZXIiOiAibmV3bGluZUFuZEluZGVudENvbnRpbnVlTWFya2Rvd25MaXN0In0KICAgICAgfSk7CiAgICA8L3NjcmlwdD4KCiAgICA8cD5PcHRpb25hbGx5IGRlcGVuZHMgb24gdGhlIFhNTCBtb2RlIGZvciBwcm9wZXJseSBoaWdobGlnaHRlZCBpbmxpbmUgWE1MIGJsb2Nrcy48L3A+CgogICAgPHA+PHN0cm9uZz5NSU1FIHR5cGVzIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPnRleHQveC1tYXJrZG93bjwvY29kZT4uPC9wPgoKICAgIDxwPjxzdHJvbmc+UGFyc2luZy9IaWdobGlnaHRpbmcgVGVzdHM6PC9zdHJvbmc+IDxhIGhyZWY9Ii4uLy4uL3Rlc3QvaW5kZXguaHRtbCNtYXJrZG93bl8qIj5ub3JtYWw8L2E+LCAgPGEgaHJlZj0iLi4vLi4vdGVzdC9pbmRleC5odG1sI3ZlcmJvc2UsbWFya2Rvd25fKiI+dmVyYm9zZTwvYT4uPC9wPgoKICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/markdown/markdown.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiLCByZXF1aXJlKCIuLi94bWwveG1sIikpKTsKICBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCkgLy8gQU1ECiAgICBkZWZpbmUoWyIuLi8uLi9saWIvY29kZW1pcnJvciIsICIuLi94bWwveG1sIl0sIG1vZCk7CiAgZWxzZSAvLyBQbGFpbiBicm93c2VyIGVudgogICAgbW9kKENvZGVNaXJyb3IpOwp9KShmdW5jdGlvbihDb2RlTWlycm9yKSB7CiJ1c2Ugc3RyaWN0IjsKCkNvZGVNaXJyb3IuZGVmaW5lTW9kZSgibWFya2Rvd24iLCBmdW5jdGlvbihjbUNmZywgbW9kZUNmZykgewoKICB2YXIgaHRtbEZvdW5kID0gQ29kZU1pcnJvci5tb2Rlcy5oYXNPd25Qcm9wZXJ0eSgieG1sIik7CiAgdmFyIGh0bWxNb2RlID0gQ29kZU1pcnJvci5nZXRNb2RlKGNtQ2ZnLCBodG1sRm91bmQgPyB7bmFtZTogInhtbCIsIGh0bWxNb2RlOiB0cnVlfSA6ICJ0ZXh0L3BsYWluIik7CiAgdmFyIGFsaWFzZXMgPSB7CiAgICBodG1sOiAiaHRtbG1peGVkIiwKICAgIGpzOiAiamF2YXNjcmlwdCIsCiAgICBqc29uOiAiYXBwbGljYXRpb24vanNvbiIsCiAgICBjOiAidGV4dC94LWNzcmMiLAogICAgImMrKyI6ICJ0ZXh0L3gtYysrc3JjIiwKICAgIGphdmE6ICJ0ZXh0L3gtamF2YSIsCiAgICBjc2hhcnA6ICJ0ZXh0L3gtY3NoYXJwIiwKICAgICJjIyI6ICJ0ZXh0L3gtY3NoYXJwIiwKICAgIHNjYWxhOiAidGV4dC94LXNjYWxhIgogIH07CgogIHZhciBnZXRNb2RlID0gKGZ1bmN0aW9uICgpIHsKICAgIHZhciBpLCBtb2RlcyA9IHt9LCBtaW1lcyA9IHt9LCBtaW1lOwoKICAgIHZhciBsaXN0ID0gW107CiAgICBmb3IgKHZhciBtIGluIENvZGVNaXJyb3IubW9kZXMpCiAgICAgIGlmIChDb2RlTWlycm9yLm1vZGVzLnByb3BlcnR5SXNFbnVtZXJhYmxlKG0pKSBsaXN0LnB1c2gobSk7CiAgICBmb3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewogICAgICBtb2Rlc1tsaXN0W2ldXSA9IGxpc3RbaV07CiAgICB9CiAgICB2YXIgbWltZXNMaXN0ID0gW107CiAgICBmb3IgKHZhciBtIGluIENvZGVNaXJyb3IubWltZU1vZGVzKQogICAgICBpZiAoQ29kZU1pcnJvci5taW1lTW9kZXMucHJvcGVydHlJc0VudW1lcmFibGUobSkpCiAgICAgICAgbWltZXNMaXN0LnB1c2goe21pbWU6IG0sIG1vZGU6IENvZGVNaXJyb3IubWltZU1vZGVzW21dfSk7CiAgICBmb3IgKGkgPSAwOyBpIDwgbWltZXNMaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgIG1pbWUgPSBtaW1lc0xpc3RbaV0ubWltZTsKICAgICAgbWltZXNbbWltZV0gPSBtaW1lc0xpc3RbaV0ubWltZTsKICAgIH0KCiAgICBmb3IgKHZhciBhIGluIGFsaWFzZXMpIHsKICAgICAgaWYgKGFsaWFzZXNbYV0gaW4gbW9kZXMgfHwgYWxpYXNlc1thXSBpbiBtaW1lcykKICAgICAgICBtb2Rlc1thXSA9IGFsaWFzZXNbYV07CiAgICB9CgogICAgcmV0dXJuIGZ1bmN0aW9uIChsYW5nKSB7CiAgICAgIHJldHVybiBtb2Rlc1tsYW5nXSA/IENvZGVNaXJyb3IuZ2V0TW9kZShjbUNmZywgbW9kZXNbbGFuZ10pIDogbnVsbDsKICAgIH07CiAgfSgpKTsKCiAgLy8gU2hvdWxkIGNoYXJhY3RlcnMgdGhhdCBhZmZlY3QgaGlnaGxpZ2h0aW5nIGJlIGhpZ2hsaWdodGVkIHNlcGFyYXRlPwogIC8vIERvZXMgbm90IGluY2x1ZGUgY2hhcmFjdGVycyB0aGF0IHdpbGwgYmUgb3V0cHV0IChzdWNoIGFzIGAxLmAgYW5kIGAtYCBmb3IgbGlzdHMpCiAgaWYgKG1vZGVDZmcuaGlnaGxpZ2h0Rm9ybWF0dGluZyA9PT0gdW5kZWZpbmVkKQogICAgbW9kZUNmZy5oaWdobGlnaHRGb3JtYXR0aW5nID0gZmFsc2U7CgogIC8vIE1heGltdW0gbnVtYmVyIG9mIG5lc3RlZCBibG9ja3F1b3Rlcy4gU2V0IHRvIDAgZm9yIGluZmluaXRlIG5lc3RpbmcuCiAgLy8gRXhjZXNzIGA+YCB3aWxsIGVtaXQgYGVycm9yYCB0b2tlbi4KICBpZiAobW9kZUNmZy5tYXhCbG9ja3F1b3RlRGVwdGggPT09IHVuZGVmaW5lZCkKICAgIG1vZGVDZmcubWF4QmxvY2txdW90ZURlcHRoID0gMDsKCiAgLy8gU2hvdWxkIHVuZGVyc2NvcmVzIGluIHdvcmRzIG9wZW4vY2xvc2UgZW0vc3Ryb25nPwogIGlmIChtb2RlQ2ZnLnVuZGVyc2NvcmVzQnJlYWtXb3JkcyA9PT0gdW5kZWZpbmVkKQogICAgbW9kZUNmZy51bmRlcnNjb3Jlc0JyZWFrV29yZHMgPSB0cnVlOwoKICAvLyBUdXJuIG9uIGZlbmNlZCBjb2RlIGJsb2Nrcz8gKCJgYGAiIHRvIHN0YXJ0L2VuZCkKICBpZiAobW9kZUNmZy5mZW5jZWRDb2RlQmxvY2tzID09PSB1bmRlZmluZWQpIG1vZGVDZmcuZmVuY2VkQ29kZUJsb2NrcyA9IGZhbHNlOwoKICAvLyBUdXJuIG9uIHRhc2sgbGlzdHM/ICgiLSBbIF0gIiBhbmQgIi0gW3hdICIpCiAgaWYgKG1vZGVDZmcudGFza0xpc3RzID09PSB1bmRlZmluZWQpIG1vZGVDZmcudGFza0xpc3RzID0gZmFsc2U7CgogIHZhciBjb2RlRGVwdGggPSAwOwoKICB2YXIgaGVhZGVyICAgPSAnaGVhZGVyJwogICwgICBjb2RlICAgICA9ICdjb21tZW50JwogICwgICBxdW90ZSAgICA9ICdxdW90ZScKICAsICAgbGlzdDEgICAgPSAndmFyaWFibGUtMicKICAsICAgbGlzdDIgICAgPSAndmFyaWFibGUtMycKICAsICAgbGlzdDMgICAgPSAna2V5d29yZCcKICAsICAgaHIgICAgICAgPSAnaHInCiAgLCAgIGltYWdlICAgID0gJ3RhZycKICAsICAgZm9ybWF0dGluZyA9ICdmb3JtYXR0aW5nJwogICwgICBsaW5raW5saW5lID0gJ2xpbmsnCiAgLCAgIGxpbmtlbWFpbCA9ICdsaW5rJwogICwgICBsaW5rdGV4dCA9ICdsaW5rJwogICwgICBsaW5raHJlZiA9ICdzdHJpbmcnCiAgLCAgIGVtICAgICAgID0gJ2VtJwogICwgICBzdHJvbmcgICA9ICdzdHJvbmcnOwoKICB2YXIgaHJSRSA9IC9eKFsqXC09X10pKD86XHMqXDEpezIsfVxzKiQvCiAgLCAgIHVsUkUgPSAvXlsqXC0rXVxzKy8KICAsICAgb2xSRSA9IC9eWzAtOV0rXC5ccysvCiAgLCAgIHRhc2tMaXN0UkUgPSAvXlxbKHh8IClcXSg/PVxzKS8gLy8gTXVzdCBmb2xsb3cgdWxSRSBvciBvbFJFCiAgLCAgIGF0eEhlYWRlclJFID0gL14jKy8KICAsICAgc2V0ZXh0SGVhZGVyUkUgPSAvXig/Olw9ezEsfXwtezEsfSkkLwogICwgICB0ZXh0UkUgPSAvXlteIyFcW1xdKl9cXDw+YCAiJyhdKy87CgogIGZ1bmN0aW9uIHN3aXRjaElubGluZShzdHJlYW0sIHN0YXRlLCBmKSB7CiAgICBzdGF0ZS5mID0gc3RhdGUuaW5saW5lID0gZjsKICAgIHJldHVybiBmKHN0cmVhbSwgc3RhdGUpOwogIH0KCiAgZnVuY3Rpb24gc3dpdGNoQmxvY2soc3RyZWFtLCBzdGF0ZSwgZikgewogICAgc3RhdGUuZiA9IHN0YXRlLmJsb2NrID0gZjsKICAgIHJldHVybiBmKHN0cmVhbSwgc3RhdGUpOwogIH0KCgogIC8vIEJsb2NrcwoKICBmdW5jdGlvbiBibGFua0xpbmUoc3RhdGUpIHsKICAgIC8vIFJlc2V0IGxpbmtUaXRsZSBzdGF0ZQogICAgc3RhdGUubGlua1RpdGxlID0gZmFsc2U7CiAgICAvLyBSZXNldCBFTSBzdGF0ZQogICAgc3RhdGUuZW0gPSBmYWxzZTsKICAgIC8vIFJlc2V0IFNUUk9ORyBzdGF0ZQogICAgc3RhdGUuc3Ryb25nID0gZmFsc2U7CiAgICAvLyBSZXNldCBzdGF0ZS5xdW90ZQogICAgc3RhdGUucXVvdGUgPSAwOwogICAgaWYgKCFodG1sRm91bmQgJiYgc3RhdGUuZiA9PSBodG1sQmxvY2spIHsKICAgICAgc3RhdGUuZiA9IGlubGluZU5vcm1hbDsKICAgICAgc3RhdGUuYmxvY2sgPSBibG9ja05vcm1hbDsKICAgIH0KICAgIC8vIFJlc2V0IHN0YXRlLnRyYWlsaW5nU3BhY2UKICAgIHN0YXRlLnRyYWlsaW5nU3BhY2UgPSAwOwogICAgc3RhdGUudHJhaWxpbmdTcGFjZU5ld0xpbmUgPSBmYWxzZTsKICAgIC8vIE1hcmsgdGhpcyBsaW5lIGFzIGJsYW5rCiAgICBzdGF0ZS50aGlzTGluZUhhc0NvbnRlbnQgPSBmYWxzZTsKICAgIHJldHVybiBudWxsOwogIH0KCiAgZnVuY3Rpb24gYmxvY2tOb3JtYWwoc3RyZWFtLCBzdGF0ZSkgewoKICAgIHZhciBzb2wgPSBzdHJlYW0uc29sKCk7CgogICAgdmFyIHByZXZMaW5lSXNMaXN0ID0gKHN0YXRlLmxpc3QgIT09IGZhbHNlKTsKICAgIGlmIChzdGF0ZS5saXN0ICE9PSBmYWxzZSAmJiBzdGF0ZS5pbmRlbnRhdGlvbkRpZmYgPj0gMCkgeyAvLyBDb250aW51ZWQgbGlzdAogICAgICBpZiAoc3RhdGUuaW5kZW50YXRpb25EaWZmIDwgNCkgeyAvLyBPbmx5IGFkanVzdCBpbmRlbnRhdGlvbiBpZiAqbm90KiBhIGNvZGUgYmxvY2sKICAgICAgICBzdGF0ZS5pbmRlbnRhdGlvbiAtPSBzdGF0ZS5pbmRlbnRhdGlvbkRpZmY7CiAgICAgIH0KICAgICAgc3RhdGUubGlzdCA9IG51bGw7CiAgICB9IGVsc2UgaWYgKHN0YXRlLmxpc3QgIT09IGZhbHNlICYmIHN0YXRlLmluZGVudGF0aW9uID4gMCkgewogICAgICBzdGF0ZS5saXN0ID0gbnVsbDsKICAgICAgc3RhdGUubGlzdERlcHRoID0gTWF0aC5mbG9vcihzdGF0ZS5pbmRlbnRhdGlvbiAvIDQpOwogICAgfSBlbHNlIGlmIChzdGF0ZS5saXN0ICE9PSBmYWxzZSkgeyAvLyBObyBsb25nZXIgYSBsaXN0CiAgICAgIHN0YXRlLmxpc3QgPSBmYWxzZTsKICAgICAgc3RhdGUubGlzdERlcHRoID0gMDsKICAgIH0KCiAgICB2YXIgbWF0Y2ggPSBudWxsOwogICAgaWYgKHN0YXRlLmluZGVudGF0aW9uRGlmZiA+PSA0KSB7CiAgICAgIHN0YXRlLmluZGVudGF0aW9uIC09IDQ7CiAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgcmV0dXJuIGNvZGU7CiAgICB9IGVsc2UgaWYgKHN0cmVhbS5lYXRTcGFjZSgpKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfSBlbHNlIGlmIChtYXRjaCA9IHN0cmVhbS5tYXRjaChhdHhIZWFkZXJSRSkpIHsKICAgICAgc3RhdGUuaGVhZGVyID0gbWF0Y2hbMF0ubGVuZ3RoIDw9IDYgPyBtYXRjaFswXS5sZW5ndGggOiA2OwogICAgICBpZiAobW9kZUNmZy5oaWdobGlnaHRGb3JtYXR0aW5nKSBzdGF0ZS5mb3JtYXR0aW5nID0gImhlYWRlciI7CiAgICAgIHN0YXRlLmYgPSBzdGF0ZS5pbmxpbmU7CiAgICAgIHJldHVybiBnZXRUeXBlKHN0YXRlKTsKICAgIH0gZWxzZSBpZiAoc3RhdGUucHJldkxpbmVIYXNDb250ZW50ICYmIChtYXRjaCA9IHN0cmVhbS5tYXRjaChzZXRleHRIZWFkZXJSRSkpKSB7CiAgICAgIHN0YXRlLmhlYWRlciA9IG1hdGNoWzBdLmNoYXJBdCgwKSA9PSAnPScgPyAxIDogMjsKICAgICAgaWYgKG1vZGVDZmcuaGlnaGxpZ2h0Rm9ybWF0dGluZykgc3RhdGUuZm9ybWF0dGluZyA9ICJoZWFkZXIiOwogICAgICBzdGF0ZS5mID0gc3RhdGUuaW5saW5lOwogICAgICByZXR1cm4gZ2V0VHlwZShzdGF0ZSk7CiAgICB9IGVsc2UgaWYgKHN0cmVhbS5lYXQoJz4nKSkgewogICAgICBzdGF0ZS5pbmRlbnRhdGlvbisrOwogICAgICBzdGF0ZS5xdW90ZSA9IHNvbCA/IDEgOiBzdGF0ZS5xdW90ZSArIDE7CiAgICAgIGlmIChtb2RlQ2ZnLmhpZ2hsaWdodEZvcm1hdHRpbmcpIHN0YXRlLmZvcm1hdHRpbmcgPSAicXVvdGUiOwogICAgICBzdHJlYW0uZWF0U3BhY2UoKTsKICAgICAgcmV0dXJuIGdldFR5cGUoc3RhdGUpOwogICAgfSBlbHNlIGlmIChzdHJlYW0ucGVlaygpID09PSAnWycpIHsKICAgICAgcmV0dXJuIHN3aXRjaElubGluZShzdHJlYW0sIHN0YXRlLCBmb290bm90ZUxpbmspOwogICAgfSBlbHNlIGlmIChzdHJlYW0ubWF0Y2goaHJSRSwgdHJ1ZSkpIHsKICAgICAgcmV0dXJuIGhyOwogICAgfSBlbHNlIGlmICgoIXN0YXRlLnByZXZMaW5lSGFzQ29udGVudCB8fCBwcmV2TGluZUlzTGlzdCkgJiYgKHN0cmVhbS5tYXRjaCh1bFJFLCBmYWxzZSkgfHwgc3RyZWFtLm1hdGNoKG9sUkUsIGZhbHNlKSkpIHsKICAgICAgdmFyIGxpc3RUeXBlID0gbnVsbDsKICAgICAgaWYgKHN0cmVhbS5tYXRjaCh1bFJFLCB0cnVlKSkgewogICAgICAgIGxpc3RUeXBlID0gJ3VsJzsKICAgICAgfSBlbHNlIHsKICAgICAgICBzdHJlYW0ubWF0Y2gob2xSRSwgdHJ1ZSk7CiAgICAgICAgbGlzdFR5cGUgPSAnb2wnOwogICAgICB9CiAgICAgIHN0YXRlLmluZGVudGF0aW9uICs9IDQ7CiAgICAgIHN0YXRlLmxpc3QgPSB0cnVlOwogICAgICBzdGF0ZS5saXN0RGVwdGgrKzsKICAgICAgaWYgKG1vZGVDZmcudGFza0xpc3RzICYmIHN0cmVhbS5tYXRjaCh0YXNrTGlzdFJFLCBmYWxzZSkpIHsKICAgICAgICBzdGF0ZS50YXNrTGlzdCA9IHRydWU7CiAgICAgIH0KICAgICAgc3RhdGUuZiA9IHN0YXRlLmlubGluZTsKICAgICAgaWYgKG1vZGVDZmcuaGlnaGxpZ2h0Rm9ybWF0dGluZykgc3RhdGUuZm9ybWF0dGluZyA9IFsibGlzdCIsICJsaXN0LSIgKyBsaXN0VHlwZV07CiAgICAgIHJldHVybiBnZXRUeXBlKHN0YXRlKTsKICAgIH0gZWxzZSBpZiAobW9kZUNmZy5mZW5jZWRDb2RlQmxvY2tzICYmIHN0cmVhbS5tYXRjaCgvXmBgYChbXHcrI10qKS8sIHRydWUpKSB7CiAgICAgIC8vIHRyeSBzd2l0Y2hpbmcgbW9kZQogICAgICBzdGF0ZS5sb2NhbE1vZGUgPSBnZXRNb2RlKFJlZ0V4cC4kMSk7CiAgICAgIGlmIChzdGF0ZS5sb2NhbE1vZGUpIHN0YXRlLmxvY2FsU3RhdGUgPSBzdGF0ZS5sb2NhbE1vZGUuc3RhcnRTdGF0ZSgpOwogICAgICBzd2l0Y2hCbG9jayhzdHJlYW0sIHN0YXRlLCBsb2NhbCk7CiAgICAgIGlmIChtb2RlQ2ZnLmhpZ2hsaWdodEZvcm1hdHRpbmcpIHN0YXRlLmZvcm1hdHRpbmcgPSAiY29kZS1ibG9jayI7CiAgICAgIHN0YXRlLmNvZGUgPSB0cnVlOwogICAgICByZXR1cm4gZ2V0VHlwZShzdGF0ZSk7CiAgICB9CgogICAgcmV0dXJuIHN3aXRjaElubGluZShzdHJlYW0sIHN0YXRlLCBzdGF0ZS5pbmxpbmUpOwogIH0KCiAgZnVuY3Rpb24gaHRtbEJsb2NrKHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBzdHlsZSA9IGh0bWxNb2RlLnRva2VuKHN0cmVhbSwgc3RhdGUuaHRtbFN0YXRlKTsKICAgIGlmICgoaHRtbEZvdW5kICYmIHN0YXRlLmh0bWxTdGF0ZS50YWdTdGFydCA9PT0gbnVsbCAmJiAhc3RhdGUuaHRtbFN0YXRlLmNvbnRleHQpIHx8CiAgICAgICAgKHN0YXRlLm1kX2luc2lkZSAmJiBzdHJlYW0uY3VycmVudCgpLmluZGV4T2YoIj4iKSA+IC0xKSkgewogICAgICBzdGF0ZS5mID0gaW5saW5lTm9ybWFsOwogICAgICBzdGF0ZS5ibG9jayA9IGJsb2NrTm9ybWFsOwogICAgICBzdGF0ZS5odG1sU3RhdGUgPSBudWxsOwogICAgfQogICAgcmV0dXJuIHN0eWxlOwogIH0KCiAgZnVuY3Rpb24gbG9jYWwoc3RyZWFtLCBzdGF0ZSkgewogICAgaWYgKHN0cmVhbS5zb2woKSAmJiBzdHJlYW0ubWF0Y2goL15gYGAvLCB0cnVlKSkgewogICAgICBzdGF0ZS5sb2NhbE1vZGUgPSBzdGF0ZS5sb2NhbFN0YXRlID0gbnVsbDsKICAgICAgc3RhdGUuZiA9IGlubGluZU5vcm1hbDsKICAgICAgc3RhdGUuYmxvY2sgPSBibG9ja05vcm1hbDsKICAgICAgaWYgKG1vZGVDZmcuaGlnaGxpZ2h0Rm9ybWF0dGluZykgc3RhdGUuZm9ybWF0dGluZyA9ICJjb2RlLWJsb2NrIjsKICAgICAgc3RhdGUuY29kZSA9IHRydWU7CiAgICAgIHZhciByZXR1cm5UeXBlID0gZ2V0VHlwZShzdGF0ZSk7CiAgICAgIHN0YXRlLmNvZGUgPSBmYWxzZTsKICAgICAgcmV0dXJuIHJldHVyblR5cGU7CiAgICB9IGVsc2UgaWYgKHN0YXRlLmxvY2FsTW9kZSkgewogICAgICByZXR1cm4gc3RhdGUubG9jYWxNb2RlLnRva2VuKHN0cmVhbSwgc3RhdGUubG9jYWxTdGF0ZSk7CiAgICB9IGVsc2UgewogICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICAgIHJldHVybiBjb2RlOwogICAgfQogIH0KCiAgLy8gSW5saW5lCiAgZnVuY3Rpb24gZ2V0VHlwZShzdGF0ZSkgewogICAgdmFyIHN0eWxlcyA9IFtdOwoKICAgIGlmIChzdGF0ZS5mb3JtYXR0aW5nKSB7CiAgICAgIHN0eWxlcy5wdXNoKGZvcm1hdHRpbmcpOwoKICAgICAgaWYgKHR5cGVvZiBzdGF0ZS5mb3JtYXR0aW5nID09PSAic3RyaW5nIikgc3RhdGUuZm9ybWF0dGluZyA9IFtzdGF0ZS5mb3JtYXR0aW5nXTsKCiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RhdGUuZm9ybWF0dGluZy5sZW5ndGg7IGkrKykgewogICAgICAgIHN0eWxlcy5wdXNoKGZvcm1hdHRpbmcgKyAiLSIgKyBzdGF0ZS5mb3JtYXR0aW5nW2ldKTsKCiAgICAgICAgaWYgKHN0YXRlLmZvcm1hdHRpbmdbaV0gPT09ICJoZWFkZXIiKSB7CiAgICAgICAgICBzdHlsZXMucHVzaChmb3JtYXR0aW5nICsgIi0iICsgc3RhdGUuZm9ybWF0dGluZ1tpXSArICItIiArIHN0YXRlLmhlYWRlcik7CiAgICAgICAgfQoKICAgICAgICAvLyBBZGQgYGZvcm1hdHRpbmctcXVvdGVgIGFuZCBgZm9ybWF0dGluZy1xdW90ZS0jYCBmb3IgYmxvY2txdW90ZXMKICAgICAgICAvLyBBZGQgYGVycm9yYCBpbnN0ZWFkIGlmIHRoZSBtYXhpbXVtIGJsb2NrcXVvdGUgbmVzdGluZyBkZXB0aCBpcyBwYXNzZWQKICAgICAgICBpZiAoc3RhdGUuZm9ybWF0dGluZ1tpXSA9PT0gInF1b3RlIikgewogICAgICAgICAgaWYgKCFtb2RlQ2ZnLm1heEJsb2NrcXVvdGVEZXB0aCB8fCBtb2RlQ2ZnLm1heEJsb2NrcXVvdGVEZXB0aCA+PSBzdGF0ZS5xdW90ZSkgewogICAgICAgICAgICBzdHlsZXMucHVzaChmb3JtYXR0aW5nICsgIi0iICsgc3RhdGUuZm9ybWF0dGluZ1tpXSArICItIiArIHN0YXRlLnF1b3RlKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHN0eWxlcy5wdXNoKCJlcnJvciIpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGlmIChzdGF0ZS50YXNrT3BlbikgewogICAgICBzdHlsZXMucHVzaCgibWV0YSIpOwogICAgICByZXR1cm4gc3R5bGVzLmxlbmd0aCA/IHN0eWxlcy5qb2luKCcgJykgOiBudWxsOwogICAgfQogICAgaWYgKHN0YXRlLnRhc2tDbG9zZWQpIHsKICAgICAgc3R5bGVzLnB1c2goInByb3BlcnR5Iik7CiAgICAgIHJldHVybiBzdHlsZXMubGVuZ3RoID8gc3R5bGVzLmpvaW4oJyAnKSA6IG51bGw7CiAgICB9CgogICAgaWYgKHN0YXRlLmxpbmtIcmVmKSB7CiAgICAgIHN0eWxlcy5wdXNoKGxpbmtocmVmKTsKICAgICAgcmV0dXJuIHN0eWxlcy5sZW5ndGggPyBzdHlsZXMuam9pbignICcpIDogbnVsbDsKICAgIH0KCiAgICBpZiAoc3RhdGUuc3Ryb25nKSB7IHN0eWxlcy5wdXNoKHN0cm9uZyk7IH0KICAgIGlmIChzdGF0ZS5lbSkgeyBzdHlsZXMucHVzaChlbSk7IH0KCiAgICBpZiAoc3RhdGUubGlua1RleHQpIHsgc3R5bGVzLnB1c2gobGlua3RleHQpOyB9CgogICAgaWYgKHN0YXRlLmNvZGUpIHsgc3R5bGVzLnB1c2goY29kZSk7IH0KCiAgICBpZiAoc3RhdGUuaGVhZGVyKSB7IHN0eWxlcy5wdXNoKGhlYWRlcik7IHN0eWxlcy5wdXNoKGhlYWRlciArICItIiArIHN0YXRlLmhlYWRlcik7IH0KCiAgICBpZiAoc3RhdGUucXVvdGUpIHsKICAgICAgc3R5bGVzLnB1c2gocXVvdGUpOwoKICAgICAgLy8gQWRkIGBxdW90ZS0jYCB3aGVyZSB0aGUgbWF4aW11bSBmb3IgYCNgIGlzIG1vZGVDZmcubWF4QmxvY2txdW90ZURlcHRoCiAgICAgIGlmICghbW9kZUNmZy5tYXhCbG9ja3F1b3RlRGVwdGggfHwgbW9kZUNmZy5tYXhCbG9ja3F1b3RlRGVwdGggPj0gc3RhdGUucXVvdGUpIHsKICAgICAgICBzdHlsZXMucHVzaChxdW90ZSArICItIiArIHN0YXRlLnF1b3RlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzdHlsZXMucHVzaChxdW90ZSArICItIiArIG1vZGVDZmcubWF4QmxvY2txdW90ZURlcHRoKTsKICAgICAgfQogICAgfQoKICAgIGlmIChzdGF0ZS5saXN0ICE9PSBmYWxzZSkgewogICAgICB2YXIgbGlzdE1vZCA9IChzdGF0ZS5saXN0RGVwdGggLSAxKSAlIDM7CiAgICAgIGlmICghbGlzdE1vZCkgewogICAgICAgIHN0eWxlcy5wdXNoKGxpc3QxKTsKICAgICAgfSBlbHNlIGlmIChsaXN0TW9kID09PSAxKSB7CiAgICAgICAgc3R5bGVzLnB1c2gobGlzdDIpOwogICAgICB9IGVsc2UgewogICAgICAgIHN0eWxlcy5wdXNoKGxpc3QzKTsKICAgICAgfQogICAgfQoKICAgIGlmIChzdGF0ZS50cmFpbGluZ1NwYWNlTmV3TGluZSkgewogICAgICBzdHlsZXMucHVzaCgidHJhaWxpbmctc3BhY2UtbmV3LWxpbmUiKTsKICAgIH0gZWxzZSBpZiAoc3RhdGUudHJhaWxpbmdTcGFjZSkgewogICAgICBzdHlsZXMucHVzaCgidHJhaWxpbmctc3BhY2UtIiArIChzdGF0ZS50cmFpbGluZ1NwYWNlICUgMiA/ICJhIiA6ICJiIikpOwogICAgfQoKICAgIHJldHVybiBzdHlsZXMubGVuZ3RoID8gc3R5bGVzLmpvaW4oJyAnKSA6IG51bGw7CiAgfQoKICBmdW5jdGlvbiBoYW5kbGVUZXh0KHN0cmVhbSwgc3RhdGUpIHsKICAgIGlmIChzdHJlYW0ubWF0Y2godGV4dFJFLCB0cnVlKSkgewogICAgICByZXR1cm4gZ2V0VHlwZShzdGF0ZSk7CiAgICB9CiAgICByZXR1cm4gdW5kZWZpbmVkOwogIH0KCiAgZnVuY3Rpb24gaW5saW5lTm9ybWFsKHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBzdHlsZSA9IHN0YXRlLnRleHQoc3RyZWFtLCBzdGF0ZSk7CiAgICBpZiAodHlwZW9mIHN0eWxlICE9PSAndW5kZWZpbmVkJykKICAgICAgcmV0dXJuIHN0eWxlOwoKICAgIGlmIChzdGF0ZS5saXN0KSB7IC8vIExpc3QgbWFya2VyICgqLCArLCAtLCAxLiwgZXRjKQogICAgICBzdGF0ZS5saXN0ID0gbnVsbDsKICAgICAgcmV0dXJuIGdldFR5cGUoc3RhdGUpOwogICAgfQoKICAgIGlmIChzdGF0ZS50YXNrTGlzdCkgewogICAgICB2YXIgdGFza09wZW4gPSBzdHJlYW0ubWF0Y2godGFza0xpc3RSRSwgdHJ1ZSlbMV0gIT09ICJ4IjsKICAgICAgaWYgKHRhc2tPcGVuKSBzdGF0ZS50YXNrT3BlbiA9IHRydWU7CiAgICAgIGVsc2Ugc3RhdGUudGFza0Nsb3NlZCA9IHRydWU7CiAgICAgIGlmIChtb2RlQ2ZnLmhpZ2hsaWdodEZvcm1hdHRpbmcpIHN0YXRlLmZvcm1hdHRpbmcgPSAidGFzayI7CiAgICAgIHN0YXRlLnRhc2tMaXN0ID0gZmFsc2U7CiAgICAgIHJldHVybiBnZXRUeXBlKHN0YXRlKTsKICAgIH0KCiAgICBzdGF0ZS50YXNrT3BlbiA9IGZhbHNlOwogICAgc3RhdGUudGFza0Nsb3NlZCA9IGZhbHNlOwoKICAgIGlmIChzdGF0ZS5oZWFkZXIgJiYgc3RyZWFtLm1hdGNoKC9eIyskLywgdHJ1ZSkpIHsKICAgICAgaWYgKG1vZGVDZmcuaGlnaGxpZ2h0Rm9ybWF0dGluZykgc3RhdGUuZm9ybWF0dGluZyA9ICJoZWFkZXIiOwogICAgICByZXR1cm4gZ2V0VHlwZShzdGF0ZSk7CiAgICB9CgogICAgLy8gR2V0IHNvbCgpIHZhbHVlIG5vdywgYmVmb3JlIGNoYXJhY3RlciBpcyBjb25zdW1lZAogICAgdmFyIHNvbCA9IHN0cmVhbS5zb2woKTsKCiAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpOwoKICAgIGlmIChzdGF0ZS5lc2NhcGUpIHsKICAgICAgc3RhdGUuZXNjYXBlID0gZmFsc2U7CiAgICAgIHJldHVybiBnZXRUeXBlKHN0YXRlKTsKICAgIH0KCiAgICBpZiAoY2ggPT09ICdcXCcpIHsKICAgICAgaWYgKG1vZGVDZmcuaGlnaGxpZ2h0Rm9ybWF0dGluZykgc3RhdGUuZm9ybWF0dGluZyA9ICJlc2NhcGUiOwogICAgICBzdGF0ZS5lc2NhcGUgPSB0cnVlOwogICAgICByZXR1cm4gZ2V0VHlwZShzdGF0ZSk7CiAgICB9CgogICAgLy8gTWF0Y2hlcyBsaW5rIHRpdGxlcyBwcmVzZW50IG9uIG5leHQgbGluZQogICAgaWYgKHN0YXRlLmxpbmtUaXRsZSkgewogICAgICBzdGF0ZS5saW5rVGl0bGUgPSBmYWxzZTsKICAgICAgdmFyIG1hdGNoQ2ggPSBjaDsKICAgICAgaWYgKGNoID09PSAnKCcpIHsKICAgICAgICBtYXRjaENoID0gJyknOwogICAgICB9CiAgICAgIG1hdGNoQ2ggPSAobWF0Y2hDaCsnJykucmVwbGFjZSgvKFsuPyorXiRbXF1cXCgpe318LV0pL2csICJcXCQxIik7CiAgICAgIHZhciByZWdleCA9ICdeXFxzKig/OlteJyArIG1hdGNoQ2ggKyAnXFxcXF0rfFxcXFxcXFxcfFxcXFwuKScgKyBtYXRjaENoOwogICAgICBpZiAoc3RyZWFtLm1hdGNoKG5ldyBSZWdFeHAocmVnZXgpLCB0cnVlKSkgewogICAgICAgIHJldHVybiBsaW5raHJlZjsKICAgICAgfQogICAgfQoKICAgIC8vIElmIHRoaXMgYmxvY2sgaXMgY2hhbmdlZCwgaXQgbWF5IG5lZWQgdG8gYmUgdXBkYXRlZCBpbiBHRk0gbW9kZQogICAgaWYgKGNoID09PSAnYCcpIHsKICAgICAgdmFyIHByZXZpb3VzRm9ybWF0dGluZyA9IHN0YXRlLmZvcm1hdHRpbmc7CiAgICAgIGlmIChtb2RlQ2ZnLmhpZ2hsaWdodEZvcm1hdHRpbmcpIHN0YXRlLmZvcm1hdHRpbmcgPSAiY29kZSI7CiAgICAgIHZhciB0ID0gZ2V0VHlwZShzdGF0ZSk7CiAgICAgIHZhciBiZWZvcmUgPSBzdHJlYW0ucG9zOwogICAgICBzdHJlYW0uZWF0V2hpbGUoJ2AnKTsKICAgICAgdmFyIGRpZmZlcmVuY2UgPSAxICsgc3RyZWFtLnBvcyAtIGJlZm9yZTsKICAgICAgaWYgKCFzdGF0ZS5jb2RlKSB7CiAgICAgICAgY29kZURlcHRoID0gZGlmZmVyZW5jZTsKICAgICAgICBzdGF0ZS5jb2RlID0gdHJ1ZTsKICAgICAgICByZXR1cm4gZ2V0VHlwZShzdGF0ZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGRpZmZlcmVuY2UgPT09IGNvZGVEZXB0aCkgeyAvLyBNdXN0IGJlIGV4YWN0CiAgICAgICAgICBzdGF0ZS5jb2RlID0gZmFsc2U7CiAgICAgICAgICByZXR1cm4gdDsKICAgICAgICB9CiAgICAgICAgc3RhdGUuZm9ybWF0dGluZyA9IHByZXZpb3VzRm9ybWF0dGluZzsKICAgICAgICByZXR1cm4gZ2V0VHlwZShzdGF0ZSk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoc3RhdGUuY29kZSkgewogICAgICByZXR1cm4gZ2V0VHlwZShzdGF0ZSk7CiAgICB9CgogICAgaWYgKGNoID09PSAnIScgJiYgc3RyZWFtLm1hdGNoKC9cW1teXF1dKlxdID8oPzpcKHxcWykvLCBmYWxzZSkpIHsKICAgICAgc3RyZWFtLm1hdGNoKC9cW1teXF1dKlxdLyk7CiAgICAgIHN0YXRlLmlubGluZSA9IHN0YXRlLmYgPSBsaW5rSHJlZjsKICAgICAgcmV0dXJuIGltYWdlOwogICAgfQoKICAgIGlmIChjaCA9PT0gJ1snICYmIHN0cmVhbS5tYXRjaCgvLipcXShcKHwgP1xbKS8sIGZhbHNlKSkgewogICAgICBzdGF0ZS5saW5rVGV4dCA9IHRydWU7CiAgICAgIGlmIChtb2RlQ2ZnLmhpZ2hsaWdodEZvcm1hdHRpbmcpIHN0YXRlLmZvcm1hdHRpbmcgPSAibGluayI7CiAgICAgIHJldHVybiBnZXRUeXBlKHN0YXRlKTsKICAgIH0KCiAgICBpZiAoY2ggPT09ICddJyAmJiBzdGF0ZS5saW5rVGV4dCkgewogICAgICBpZiAobW9kZUNmZy5oaWdobGlnaHRGb3JtYXR0aW5nKSBzdGF0ZS5mb3JtYXR0aW5nID0gImxpbmsiOwogICAgICB2YXIgdHlwZSA9IGdldFR5cGUoc3RhdGUpOwogICAgICBzdGF0ZS5saW5rVGV4dCA9IGZhbHNlOwogICAgICBzdGF0ZS5pbmxpbmUgPSBzdGF0ZS5mID0gbGlua0hyZWY7CiAgICAgIHJldHVybiB0eXBlOwogICAgfQoKICAgIGlmIChjaCA9PT0gJzwnICYmIHN0cmVhbS5tYXRjaCgvXihodHRwcz98ZnRwcz8pOlwvXC8oPzpbXlxcPl18XFwuKSs+LywgZmFsc2UpKSB7CiAgICAgIHN0YXRlLmYgPSBzdGF0ZS5pbmxpbmUgPSBsaW5rSW5saW5lOwogICAgICBpZiAobW9kZUNmZy5oaWdobGlnaHRGb3JtYXR0aW5nKSBzdGF0ZS5mb3JtYXR0aW5nID0gImxpbmsiOwogICAgICB2YXIgdHlwZSA9IGdldFR5cGUoc3RhdGUpOwogICAgICBpZiAodHlwZSl7CiAgICAgICAgdHlwZSArPSAiICI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdHlwZSA9ICIiOwogICAgICB9CiAgICAgIHJldHVybiB0eXBlICsgbGlua2lubGluZTsKICAgIH0KCiAgICBpZiAoY2ggPT09ICc8JyAmJiBzdHJlYW0ubWF0Y2goL15bXj4gXFxdK0AoPzpbXlxcPl18XFwuKSs+LywgZmFsc2UpKSB7CiAgICAgIHN0YXRlLmYgPSBzdGF0ZS5pbmxpbmUgPSBsaW5rSW5saW5lOwogICAgICBpZiAobW9kZUNmZy5oaWdobGlnaHRGb3JtYXR0aW5nKSBzdGF0ZS5mb3JtYXR0aW5nID0gImxpbmsiOwogICAgICB2YXIgdHlwZSA9IGdldFR5cGUoc3RhdGUpOwogICAgICBpZiAodHlwZSl7CiAgICAgICAgdHlwZSArPSAiICI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdHlwZSA9ICIiOwogICAgICB9CiAgICAgIHJldHVybiB0eXBlICsgbGlua2VtYWlsOwogICAgfQoKICAgIGlmIChjaCA9PT0gJzwnICYmIHN0cmVhbS5tYXRjaCgvXlx3LywgZmFsc2UpKSB7CiAgICAgIGlmIChzdHJlYW0uc3RyaW5nLmluZGV4T2YoIj4iKSAhPSAtMSkgewogICAgICAgIHZhciBhdHRzID0gc3RyZWFtLnN0cmluZy5zdWJzdHJpbmcoMSxzdHJlYW0uc3RyaW5nLmluZGV4T2YoIj4iKSk7CiAgICAgICAgaWYgKC9tYXJrZG93blxzKj1ccyooJ3wiKXswLDF9MSgnfCIpezAsMX0vLnRlc3QoYXR0cykpIHsKICAgICAgICAgIHN0YXRlLm1kX2luc2lkZSA9IHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIHN0cmVhbS5iYWNrVXAoMSk7CiAgICAgIHN0YXRlLmh0bWxTdGF0ZSA9IENvZGVNaXJyb3Iuc3RhcnRTdGF0ZShodG1sTW9kZSk7CiAgICAgIHJldHVybiBzd2l0Y2hCbG9jayhzdHJlYW0sIHN0YXRlLCBodG1sQmxvY2spOwogICAgfQoKICAgIGlmIChjaCA9PT0gJzwnICYmIHN0cmVhbS5tYXRjaCgvXlwvXHcqPz4vKSkgewogICAgICBzdGF0ZS5tZF9pbnNpZGUgPSBmYWxzZTsKICAgICAgcmV0dXJuICJ0YWciOwogICAgfQoKICAgIHZhciBpZ25vcmVVbmRlcnNjb3JlID0gZmFsc2U7CiAgICBpZiAoIW1vZGVDZmcudW5kZXJzY29yZXNCcmVha1dvcmRzKSB7CiAgICAgIGlmIChjaCA9PT0gJ18nICYmIHN0cmVhbS5wZWVrKCkgIT09ICdfJyAmJiBzdHJlYW0ubWF0Y2goLyhcdykvLCBmYWxzZSkpIHsKICAgICAgICB2YXIgcHJldlBvcyA9IHN0cmVhbS5wb3MgLSAyOwogICAgICAgIGlmIChwcmV2UG9zID49IDApIHsKICAgICAgICAgIHZhciBwcmV2Q2ggPSBzdHJlYW0uc3RyaW5nLmNoYXJBdChwcmV2UG9zKTsKICAgICAgICAgIGlmIChwcmV2Q2ggIT09ICdfJyAmJiBwcmV2Q2gubWF0Y2goLyhcdykvLCBmYWxzZSkpIHsKICAgICAgICAgICAgaWdub3JlVW5kZXJzY29yZSA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAoY2ggPT09ICcqJyB8fCAoY2ggPT09ICdfJyAmJiAhaWdub3JlVW5kZXJzY29yZSkpIHsKICAgICAgaWYgKHNvbCAmJiBzdHJlYW0ucGVlaygpID09PSAnICcpIHsKICAgICAgICAvLyBEbyBub3RoaW5nLCBzdXJyb3VuZGVkIGJ5IG5ld2xpbmUgYW5kIHNwYWNlCiAgICAgIH0gZWxzZSBpZiAoc3RhdGUuc3Ryb25nID09PSBjaCAmJiBzdHJlYW0uZWF0KGNoKSkgeyAvLyBSZW1vdmUgU1RST05HCiAgICAgICAgaWYgKG1vZGVDZmcuaGlnaGxpZ2h0Rm9ybWF0dGluZykgc3RhdGUuZm9ybWF0dGluZyA9ICJzdHJvbmciOwogICAgICAgIHZhciB0ID0gZ2V0VHlwZShzdGF0ZSk7CiAgICAgICAgc3RhdGUuc3Ryb25nID0gZmFsc2U7CiAgICAgICAgcmV0dXJuIHQ7CiAgICAgIH0gZWxzZSBpZiAoIXN0YXRlLnN0cm9uZyAmJiBzdHJlYW0uZWF0KGNoKSkgeyAvLyBBZGQgU1RST05HCiAgICAgICAgc3RhdGUuc3Ryb25nID0gY2g7CiAgICAgICAgaWYgKG1vZGVDZmcuaGlnaGxpZ2h0Rm9ybWF0dGluZykgc3RhdGUuZm9ybWF0dGluZyA9ICJzdHJvbmciOwogICAgICAgIHJldHVybiBnZXRUeXBlKHN0YXRlKTsKICAgICAgfSBlbHNlIGlmIChzdGF0ZS5lbSA9PT0gY2gpIHsgLy8gUmVtb3ZlIEVNCiAgICAgICAgaWYgKG1vZGVDZmcuaGlnaGxpZ2h0Rm9ybWF0dGluZykgc3RhdGUuZm9ybWF0dGluZyA9ICJlbSI7CiAgICAgICAgdmFyIHQgPSBnZXRUeXBlKHN0YXRlKTsKICAgICAgICBzdGF0ZS5lbSA9IGZhbHNlOwogICAgICAgIHJldHVybiB0OwogICAgICB9IGVsc2UgaWYgKCFzdGF0ZS5lbSkgeyAvLyBBZGQgRU0KICAgICAgICBzdGF0ZS5lbSA9IGNoOwogICAgICAgIGlmIChtb2RlQ2ZnLmhpZ2hsaWdodEZvcm1hdHRpbmcpIHN0YXRlLmZvcm1hdHRpbmcgPSAiZW0iOwogICAgICAgIHJldHVybiBnZXRUeXBlKHN0YXRlKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChjaCA9PT0gJyAnKSB7CiAgICAgIGlmIChzdHJlYW0uZWF0KCcqJykgfHwgc3RyZWFtLmVhdCgnXycpKSB7IC8vIFByb2JhYmx5IHN1cnJvdW5kZWQgYnkgc3BhY2VzCiAgICAgICAgaWYgKHN0cmVhbS5wZWVrKCkgPT09ICcgJykgeyAvLyBTdXJyb3VuZGVkIGJ5IHNwYWNlcywgaWdub3JlCiAgICAgICAgICByZXR1cm4gZ2V0VHlwZShzdGF0ZSk7CiAgICAgICAgfSBlbHNlIHsgLy8gTm90IHN1cnJvdW5kZWQgYnkgc3BhY2VzLCBiYWNrIHVwIHBvaW50ZXIKICAgICAgICAgIHN0cmVhbS5iYWNrVXAoMSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgaWYgKGNoID09PSAnICcpIHsKICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvICskLywgZmFsc2UpKSB7CiAgICAgICAgc3RhdGUudHJhaWxpbmdTcGFjZSsrOwogICAgICB9IGVsc2UgaWYgKHN0YXRlLnRyYWlsaW5nU3BhY2UpIHsKICAgICAgICBzdGF0ZS50cmFpbGluZ1NwYWNlTmV3TGluZSA9IHRydWU7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gZ2V0VHlwZShzdGF0ZSk7CiAgfQoKICBmdW5jdGlvbiBsaW5rSW5saW5lKHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBjaCA9IHN0cmVhbS5uZXh0KCk7CgogICAgaWYgKGNoID09PSAiPiIpIHsKICAgICAgc3RhdGUuZiA9IHN0YXRlLmlubGluZSA9IGlubGluZU5vcm1hbDsKICAgICAgaWYgKG1vZGVDZmcuaGlnaGxpZ2h0Rm9ybWF0dGluZykgc3RhdGUuZm9ybWF0dGluZyA9ICJsaW5rIjsKICAgICAgdmFyIHR5cGUgPSBnZXRUeXBlKHN0YXRlKTsKICAgICAgaWYgKHR5cGUpewogICAgICAgIHR5cGUgKz0gIiAiOwogICAgICB9IGVsc2UgewogICAgICAgIHR5cGUgPSAiIjsKICAgICAgfQogICAgICByZXR1cm4gdHlwZSArIGxpbmtpbmxpbmU7CiAgICB9CgogICAgc3RyZWFtLm1hdGNoKC9eW14+XSsvLCB0cnVlKTsKCiAgICByZXR1cm4gbGlua2lubGluZTsKICB9CgogIGZ1bmN0aW9uIGxpbmtIcmVmKHN0cmVhbSwgc3RhdGUpIHsKICAgIC8vIENoZWNrIGlmIHNwYWNlLCBhbmQgcmV0dXJuIE5VTEwgaWYgc28gKHRvIGF2b2lkIG1hcmtpbmcgdGhlIHNwYWNlKQogICAgaWYoc3RyZWFtLmVhdFNwYWNlKCkpewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHZhciBjaCA9IHN0cmVhbS5uZXh0KCk7CiAgICBpZiAoY2ggPT09ICcoJyB8fCBjaCA9PT0gJ1snKSB7CiAgICAgIHN0YXRlLmYgPSBzdGF0ZS5pbmxpbmUgPSBnZXRMaW5rSHJlZkluc2lkZShjaCA9PT0gIigiID8gIikiIDogIl0iKTsKICAgICAgaWYgKG1vZGVDZmcuaGlnaGxpZ2h0Rm9ybWF0dGluZykgc3RhdGUuZm9ybWF0dGluZyA9ICJsaW5rLXN0cmluZyI7CiAgICAgIHN0YXRlLmxpbmtIcmVmID0gdHJ1ZTsKICAgICAgcmV0dXJuIGdldFR5cGUoc3RhdGUpOwogICAgfQogICAgcmV0dXJuICdlcnJvcic7CiAgfQoKICBmdW5jdGlvbiBnZXRMaW5rSHJlZkluc2lkZShlbmRDaGFyKSB7CiAgICByZXR1cm4gZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpOwoKICAgICAgaWYgKGNoID09PSBlbmRDaGFyKSB7CiAgICAgICAgc3RhdGUuZiA9IHN0YXRlLmlubGluZSA9IGlubGluZU5vcm1hbDsKICAgICAgICBpZiAobW9kZUNmZy5oaWdobGlnaHRGb3JtYXR0aW5nKSBzdGF0ZS5mb3JtYXR0aW5nID0gImxpbmstc3RyaW5nIjsKICAgICAgICB2YXIgcmV0dXJuU3RhdGUgPSBnZXRUeXBlKHN0YXRlKTsKICAgICAgICBzdGF0ZS5saW5rSHJlZiA9IGZhbHNlOwogICAgICAgIHJldHVybiByZXR1cm5TdGF0ZTsKICAgICAgfQoKICAgICAgaWYgKHN0cmVhbS5tYXRjaChpbmxpbmVSRShlbmRDaGFyKSwgdHJ1ZSkpIHsKICAgICAgICBzdHJlYW0uYmFja1VwKDEpOwogICAgICB9CgogICAgICBzdGF0ZS5saW5rSHJlZiA9IHRydWU7CiAgICAgIHJldHVybiBnZXRUeXBlKHN0YXRlKTsKICAgIH07CiAgfQoKICBmdW5jdGlvbiBmb290bm90ZUxpbmsoc3RyZWFtLCBzdGF0ZSkgewogICAgaWYgKHN0cmVhbS5tYXRjaCgvXlteXF1dKlxdOi8sIGZhbHNlKSkgewogICAgICBzdGF0ZS5mID0gZm9vdG5vdGVMaW5rSW5zaWRlOwogICAgICBzdHJlYW0ubmV4dCgpOyAvLyBDb25zdW1lIFsKICAgICAgaWYgKG1vZGVDZmcuaGlnaGxpZ2h0Rm9ybWF0dGluZykgc3RhdGUuZm9ybWF0dGluZyA9ICJsaW5rIjsKICAgICAgc3RhdGUubGlua1RleHQgPSB0cnVlOwogICAgICByZXR1cm4gZ2V0VHlwZShzdGF0ZSk7CiAgICB9CiAgICByZXR1cm4gc3dpdGNoSW5saW5lKHN0cmVhbSwgc3RhdGUsIGlubGluZU5vcm1hbCk7CiAgfQoKICBmdW5jdGlvbiBmb290bm90ZUxpbmtJbnNpZGUoc3RyZWFtLCBzdGF0ZSkgewogICAgaWYgKHN0cmVhbS5tYXRjaCgvXlxdOi8sIHRydWUpKSB7CiAgICAgIHN0YXRlLmYgPSBzdGF0ZS5pbmxpbmUgPSBmb290bm90ZVVybDsKICAgICAgaWYgKG1vZGVDZmcuaGlnaGxpZ2h0Rm9ybWF0dGluZykgc3RhdGUuZm9ybWF0dGluZyA9ICJsaW5rIjsKICAgICAgdmFyIHJldHVyblR5cGUgPSBnZXRUeXBlKHN0YXRlKTsKICAgICAgc3RhdGUubGlua1RleHQgPSBmYWxzZTsKICAgICAgcmV0dXJuIHJldHVyblR5cGU7CiAgICB9CgogICAgc3RyZWFtLm1hdGNoKC9eW15cXV0rLywgdHJ1ZSk7CgogICAgcmV0dXJuIGxpbmt0ZXh0OwogIH0KCiAgZnVuY3Rpb24gZm9vdG5vdGVVcmwoc3RyZWFtLCBzdGF0ZSkgewogICAgLy8gQ2hlY2sgaWYgc3BhY2UsIGFuZCByZXR1cm4gTlVMTCBpZiBzbyAodG8gYXZvaWQgbWFya2luZyB0aGUgc3BhY2UpCiAgICBpZihzdHJlYW0uZWF0U3BhY2UoKSl7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgLy8gTWF0Y2ggVVJMCiAgICBzdHJlYW0ubWF0Y2goL15bXlxzXSsvLCB0cnVlKTsKICAgIC8vIENoZWNrIGZvciBsaW5rIHRpdGxlCiAgICBpZiAoc3RyZWFtLnBlZWsoKSA9PT0gdW5kZWZpbmVkKSB7IC8vIEVuZCBvZiBsaW5lLCBzZXQgZmxhZyB0byBjaGVjayBuZXh0IGxpbmUKICAgICAgc3RhdGUubGlua1RpdGxlID0gdHJ1ZTsKICAgIH0gZWxzZSB7IC8vIE1vcmUgY29udGVudCBvbiBsaW5lLCBjaGVjayBpZiBsaW5rIHRpdGxlCiAgICAgIHN0cmVhbS5tYXRjaCgvXig/OlxzKyg/OiIoPzpbXiJcXF18XFxcXHxcXC4pKyJ8Jyg/OlteJ1xcXXxcXFxcfFxcLikrJ3xcKCg/OlteKVxcXXxcXFxcfFxcLikrXCkpKT8vLCB0cnVlKTsKICAgIH0KICAgIHN0YXRlLmYgPSBzdGF0ZS5pbmxpbmUgPSBpbmxpbmVOb3JtYWw7CiAgICByZXR1cm4gbGlua2hyZWY7CiAgfQoKICB2YXIgc2F2ZWRJbmxpbmVSRSA9IFtdOwogIGZ1bmN0aW9uIGlubGluZVJFKGVuZENoYXIpIHsKICAgIGlmICghc2F2ZWRJbmxpbmVSRVtlbmRDaGFyXSkgewogICAgICAvLyBFc2NhcGUgZW5kQ2hhciBmb3IgUmVnRXhwICh0YWtlbiBmcm9tIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzQ5NDEyMi81MjY3NDEpCiAgICAgIGVuZENoYXIgPSAoZW5kQ2hhcisnJykucmVwbGFjZSgvKFsuPyorXiRbXF1cXCgpe318LV0pL2csICJcXCQxIik7CiAgICAgIC8vIE1hdGNoIGFueSBub24tZW5kQ2hhciwgZXNjYXBlZCBjaGFyYWN0ZXIsIGFzIHdlbGwgYXMgdGhlIGNsb3NpbmcKICAgICAgLy8gZW5kQ2hhci4KICAgICAgc2F2ZWRJbmxpbmVSRVtlbmRDaGFyXSA9IG5ldyBSZWdFeHAoJ14oPzpbXlxcXFxdfFxcXFwuKSo/KCcgKyBlbmRDaGFyICsgJyknKTsKICAgIH0KICAgIHJldHVybiBzYXZlZElubGluZVJFW2VuZENoYXJdOwogIH0KCiAgdmFyIG1vZGUgPSB7CiAgICBzdGFydFN0YXRlOiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBmOiBibG9ja05vcm1hbCwKCiAgICAgICAgcHJldkxpbmVIYXNDb250ZW50OiBmYWxzZSwKICAgICAgICB0aGlzTGluZUhhc0NvbnRlbnQ6IGZhbHNlLAoKICAgICAgICBibG9jazogYmxvY2tOb3JtYWwsCiAgICAgICAgaHRtbFN0YXRlOiBudWxsLAogICAgICAgIGluZGVudGF0aW9uOiAwLAoKICAgICAgICBpbmxpbmU6IGlubGluZU5vcm1hbCwKICAgICAgICB0ZXh0OiBoYW5kbGVUZXh0LAoKICAgICAgICBlc2NhcGU6IGZhbHNlLAogICAgICAgIGZvcm1hdHRpbmc6IGZhbHNlLAogICAgICAgIGxpbmtUZXh0OiBmYWxzZSwKICAgICAgICBsaW5rSHJlZjogZmFsc2UsCiAgICAgICAgbGlua1RpdGxlOiBmYWxzZSwKICAgICAgICBlbTogZmFsc2UsCiAgICAgICAgc3Ryb25nOiBmYWxzZSwKICAgICAgICBoZWFkZXI6IDAsCiAgICAgICAgdGFza0xpc3Q6IGZhbHNlLAogICAgICAgIGxpc3Q6IGZhbHNlLAogICAgICAgIGxpc3REZXB0aDogMCwKICAgICAgICBxdW90ZTogMCwKICAgICAgICB0cmFpbGluZ1NwYWNlOiAwLAogICAgICAgIHRyYWlsaW5nU3BhY2VOZXdMaW5lOiBmYWxzZQogICAgICB9OwogICAgfSwKCiAgICBjb3B5U3RhdGU6IGZ1bmN0aW9uKHMpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBmOiBzLmYsCgogICAgICAgIHByZXZMaW5lSGFzQ29udGVudDogcy5wcmV2TGluZUhhc0NvbnRlbnQsCiAgICAgICAgdGhpc0xpbmVIYXNDb250ZW50OiBzLnRoaXNMaW5lSGFzQ29udGVudCwKCiAgICAgICAgYmxvY2s6IHMuYmxvY2ssCiAgICAgICAgaHRtbFN0YXRlOiBzLmh0bWxTdGF0ZSAmJiBDb2RlTWlycm9yLmNvcHlTdGF0ZShodG1sTW9kZSwgcy5odG1sU3RhdGUpLAogICAgICAgIGluZGVudGF0aW9uOiBzLmluZGVudGF0aW9uLAoKICAgICAgICBsb2NhbE1vZGU6IHMubG9jYWxNb2RlLAogICAgICAgIGxvY2FsU3RhdGU6IHMubG9jYWxNb2RlID8gQ29kZU1pcnJvci5jb3B5U3RhdGUocy5sb2NhbE1vZGUsIHMubG9jYWxTdGF0ZSkgOiBudWxsLAoKICAgICAgICBpbmxpbmU6IHMuaW5saW5lLAogICAgICAgIHRleHQ6IHMudGV4dCwKICAgICAgICBlc2NhcGU6IGZhbHNlLAogICAgICAgIGZvcm1hdHRpbmc6IGZhbHNlLAogICAgICAgIGxpbmtUaXRsZTogcy5saW5rVGl0bGUsCiAgICAgICAgZW06IHMuZW0sCiAgICAgICAgc3Ryb25nOiBzLnN0cm9uZywKICAgICAgICBoZWFkZXI6IHMuaGVhZGVyLAogICAgICAgIHRhc2tMaXN0OiBzLnRhc2tMaXN0LAogICAgICAgIGxpc3Q6IHMubGlzdCwKICAgICAgICBsaXN0RGVwdGg6IHMubGlzdERlcHRoLAogICAgICAgIHF1b3RlOiBzLnF1b3RlLAogICAgICAgIHRyYWlsaW5nU3BhY2U6IHMudHJhaWxpbmdTcGFjZSwKICAgICAgICB0cmFpbGluZ1NwYWNlTmV3TGluZTogcy50cmFpbGluZ1NwYWNlTmV3TGluZSwKICAgICAgICBtZF9pbnNpZGU6IHMubWRfaW5zaWRlCiAgICAgIH07CiAgICB9LAoKICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CgogICAgICAvLyBSZXNldCBzdGF0ZS5mb3JtYXR0aW5nCiAgICAgIHN0YXRlLmZvcm1hdHRpbmcgPSBmYWxzZTsKCiAgICAgIGlmIChzdHJlYW0uc29sKCkpIHsKICAgICAgICB2YXIgZm9yY2VCbGFua0xpbmUgPSBzdHJlYW0ubWF0Y2goL15ccyokLywgdHJ1ZSkgfHwgc3RhdGUuaGVhZGVyOwoKICAgICAgICAvLyBSZXNldCBzdGF0ZS5oZWFkZXIKICAgICAgICBzdGF0ZS5oZWFkZXIgPSAwOwoKICAgICAgICBpZiAoZm9yY2VCbGFua0xpbmUpIHsKICAgICAgICAgIHN0YXRlLnByZXZMaW5lSGFzQ29udGVudCA9IGZhbHNlOwogICAgICAgICAgcmV0dXJuIGJsYW5rTGluZShzdGF0ZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHN0YXRlLnByZXZMaW5lSGFzQ29udGVudCA9IHN0YXRlLnRoaXNMaW5lSGFzQ29udGVudDsKICAgICAgICAgIHN0YXRlLnRoaXNMaW5lSGFzQ29udGVudCA9IHRydWU7CiAgICAgICAgfQoKICAgICAgICAvLyBSZXNldCBzdGF0ZS5lc2NhcGUKICAgICAgICBzdGF0ZS5lc2NhcGUgPSBmYWxzZTsKCiAgICAgICAgLy8gUmVzZXQgc3RhdGUudGFza0xpc3QKICAgICAgICBzdGF0ZS50YXNrTGlzdCA9IGZhbHNlOwoKICAgICAgICAvLyBSZXNldCBzdGF0ZS5jb2RlCiAgICAgICAgc3RhdGUuY29kZSA9IGZhbHNlOwoKICAgICAgICAvLyBSZXNldCBzdGF0ZS50cmFpbGluZ1NwYWNlCiAgICAgICAgc3RhdGUudHJhaWxpbmdTcGFjZSA9IDA7CiAgICAgICAgc3RhdGUudHJhaWxpbmdTcGFjZU5ld0xpbmUgPSBmYWxzZTsKCiAgICAgICAgc3RhdGUuZiA9IHN0YXRlLmJsb2NrOwogICAgICAgIHZhciBpbmRlbnRhdGlvbiA9IHN0cmVhbS5tYXRjaCgvXlxzKi8sIHRydWUpWzBdLnJlcGxhY2UoL1x0L2csICcgICAgJykubGVuZ3RoOwogICAgICAgIHZhciBkaWZmZXJlbmNlID0gTWF0aC5mbG9vcigoaW5kZW50YXRpb24gLSBzdGF0ZS5pbmRlbnRhdGlvbikgLyA0KSAqIDQ7CiAgICAgICAgaWYgKGRpZmZlcmVuY2UgPiA0KSBkaWZmZXJlbmNlID0gNDsKICAgICAgICB2YXIgYWRqdXN0ZWRJbmRlbnRhdGlvbiA9IHN0YXRlLmluZGVudGF0aW9uICsgZGlmZmVyZW5jZTsKICAgICAgICBzdGF0ZS5pbmRlbnRhdGlvbkRpZmYgPSBhZGp1c3RlZEluZGVudGF0aW9uIC0gc3RhdGUuaW5kZW50YXRpb247CiAgICAgICAgc3RhdGUuaW5kZW50YXRpb24gPSBhZGp1c3RlZEluZGVudGF0aW9uOwogICAgICAgIGlmIChpbmRlbnRhdGlvbiA+IDApIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIHZhciByZXN1bHQgPSBzdGF0ZS5mKHN0cmVhbSwgc3RhdGUpOwogICAgICBpZiAoc3RyZWFtLnN0YXJ0ID09IHN0cmVhbS5wb3MpIHJldHVybiB0aGlzLnRva2VuKHN0cmVhbSwgc3RhdGUpOwogICAgICBlbHNlIHJldHVybiByZXN1bHQ7CiAgICB9LAoKICAgIGlubmVyTW9kZTogZnVuY3Rpb24oc3RhdGUpIHsKICAgICAgaWYgKHN0YXRlLmJsb2NrID09IGh0bWxCbG9jaykgcmV0dXJuIHtzdGF0ZTogc3RhdGUuaHRtbFN0YXRlLCBtb2RlOiBodG1sTW9kZX07CiAgICAgIGlmIChzdGF0ZS5sb2NhbFN0YXRlKSByZXR1cm4ge3N0YXRlOiBzdGF0ZS5sb2NhbFN0YXRlLCBtb2RlOiBzdGF0ZS5sb2NhbE1vZGV9OwogICAgICByZXR1cm4ge3N0YXRlOiBzdGF0ZSwgbW9kZTogbW9kZX07CiAgICB9LAoKICAgIGJsYW5rTGluZTogYmxhbmtMaW5lLAoKICAgIGdldFR5cGU6IGdldFR5cGUsCgogICAgZm9sZDogIm1hcmtkb3duIgogIH07CiAgcmV0dXJuIG1vZGU7Cn0sICJ4bWwiKTsKCkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC94LW1hcmtkb3duIiwgIm1hcmtkb3duIik7Cgp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/markdown/test.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24oKSB7CiAgdmFyIG1vZGUgPSBDb2RlTWlycm9yLmdldE1vZGUoe3RhYlNpemU6IDR9LCAibWFya2Rvd24iKTsKICBmdW5jdGlvbiBNVChuYW1lKSB7IHRlc3QubW9kZShuYW1lLCBtb2RlLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKTsgfQogIHZhciBtb2RlSGlnaGxpZ2h0Rm9ybWF0dGluZyA9IENvZGVNaXJyb3IuZ2V0TW9kZSh7dGFiU2l6ZTogNH0sIHtuYW1lOiAibWFya2Rvd24iLCBoaWdobGlnaHRGb3JtYXR0aW5nOiB0cnVlfSk7CiAgZnVuY3Rpb24gRlQobmFtZSkgeyB0ZXN0Lm1vZGUobmFtZSwgbW9kZUhpZ2hsaWdodEZvcm1hdHRpbmcsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpOyB9CgogIEZUKCJmb3JtYXR0aW5nX2VtQXN0ZXJpc2siLAogICAgICJbZW0mZm9ybWF0dGluZyZmb3JtYXR0aW5nLWVtICpdW2VtIGZvb11bZW0mZm9ybWF0dGluZyZmb3JtYXR0aW5nLWVtICpdIik7CgogIEZUKCJmb3JtYXR0aW5nX2VtVW5kZXJzY29yZSIsCiAgICAgIltlbSZmb3JtYXR0aW5nJmZvcm1hdHRpbmctZW0gX11bZW0gZm9vXVtlbSZmb3JtYXR0aW5nJmZvcm1hdHRpbmctZW0gX10iKTsKCiAgRlQoImZvcm1hdHRpbmdfc3Ryb25nQXN0ZXJpc2siLAogICAgICJbc3Ryb25nJmZvcm1hdHRpbmcmZm9ybWF0dGluZy1zdHJvbmcgKipdW3N0cm9uZyBmb29dW3N0cm9uZyZmb3JtYXR0aW5nJmZvcm1hdHRpbmctc3Ryb25nICoqXSIpOwoKICBGVCgiZm9ybWF0dGluZ19zdHJvbmdVbmRlcnNjb3JlIiwKICAgICAiW3N0cm9uZyZmb3JtYXR0aW5nJmZvcm1hdHRpbmctc3Ryb25nIF9fXVtzdHJvbmcgZm9vXVtzdHJvbmcmZm9ybWF0dGluZyZmb3JtYXR0aW5nLXN0cm9uZyBfX10iKTsKCiAgRlQoImZvcm1hdHRpbmdfY29kZUJhY2t0aWNrcyIsCiAgICAgIltjb21tZW50JmZvcm1hdHRpbmcmZm9ybWF0dGluZy1jb2RlIGBdW2NvbW1lbnQgZm9vXVtjb21tZW50JmZvcm1hdHRpbmcmZm9ybWF0dGluZy1jb2RlIGBdIik7CgogIEZUKCJmb3JtYXR0aW5nX2RvdWJsZUJhY2t0aWNrcyIsCiAgICAgIltjb21tZW50JmZvcm1hdHRpbmcmZm9ybWF0dGluZy1jb2RlIGBgXVtjb21tZW50IGZvbyBgIGJhcl1bY29tbWVudCZmb3JtYXR0aW5nJmZvcm1hdHRpbmctY29kZSBgYF0iKTsKCiAgRlQoImZvcm1hdHRpbmdfYXR4SGVhZGVyIiwKICAgICAiW2hlYWRlciZoZWFkZXItMSZmb3JtYXR0aW5nJmZvcm1hdHRpbmctaGVhZGVyJmZvcm1hdHRpbmctaGVhZGVyLTEgI11baGVhZGVyJmhlYWRlci0xICBmb28gIyBiYXIgXVtoZWFkZXImaGVhZGVyLTEmZm9ybWF0dGluZyZmb3JtYXR0aW5nLWhlYWRlciZmb3JtYXR0aW5nLWhlYWRlci0xICNdIik7CgogIEZUKCJmb3JtYXR0aW5nX3NldGV4dEhlYWRlciIsCiAgICAgImZvbyIsCiAgICAgIltoZWFkZXImaGVhZGVyLTEmZm9ybWF0dGluZyZmb3JtYXR0aW5nLWhlYWRlciZmb3JtYXR0aW5nLWhlYWRlci0xID1dIik7CgogIEZUKCJmb3JtYXR0aW5nX2Jsb2NrcXVvdGUiLAogICAgICJbcXVvdGUmcXVvdGUtMSZmb3JtYXR0aW5nJmZvcm1hdHRpbmctcXVvdGUmZm9ybWF0dGluZy1xdW90ZS0xID4gXVtxdW90ZSZxdW90ZS0xIGZvb10iKTsKCiAgRlQoImZvcm1hdHRpbmdfbGlzdCIsCiAgICAgIlt2YXJpYWJsZS0yJmZvcm1hdHRpbmcmZm9ybWF0dGluZy1saXN0JmZvcm1hdHRpbmctbGlzdC11bCAtIF1bdmFyaWFibGUtMiBmb29dIik7CiAgRlQoImZvcm1hdHRpbmdfbGlzdCIsCiAgICAgIlt2YXJpYWJsZS0yJmZvcm1hdHRpbmcmZm9ybWF0dGluZy1saXN0JmZvcm1hdHRpbmctbGlzdC1vbCAxLiBdW3ZhcmlhYmxlLTIgZm9vXSIpOwoKICBGVCgiZm9ybWF0dGluZ19saW5rIiwKICAgICAiW2xpbmsmZm9ybWF0dGluZyZmb3JtYXR0aW5nLWxpbmsgW11bbGluayBmb29dW2xpbmsmZm9ybWF0dGluZyZmb3JtYXR0aW5nLWxpbmsgXV1dW3N0cmluZyZmb3JtYXR0aW5nJmZvcm1hdHRpbmctbGluay1zdHJpbmcgKF1bc3RyaW5nIGh0dHA6Ly9leGFtcGxlLmNvbS9dW3N0cmluZyZmb3JtYXR0aW5nJmZvcm1hdHRpbmctbGluay1zdHJpbmcgKV0iKTsKCiAgRlQoImZvcm1hdHRpbmdfbGlua1JlZmVyZW5jZSIsCiAgICAgIltsaW5rJmZvcm1hdHRpbmcmZm9ybWF0dGluZy1saW5rIFtdW2xpbmsgZm9vXVtsaW5rJmZvcm1hdHRpbmcmZm9ybWF0dGluZy1saW5rIF1dXVtzdHJpbmcmZm9ybWF0dGluZyZmb3JtYXR0aW5nLWxpbmstc3RyaW5nIFtdW3N0cmluZyBiYXJdW3N0cmluZyZmb3JtYXR0aW5nJmZvcm1hdHRpbmctbGluay1zdHJpbmcgXV1dIiwKICAgICAiW2xpbmsmZm9ybWF0dGluZyZmb3JtYXR0aW5nLWxpbmsgW11bbGluayBiYXJdW2xpbmsmZm9ybWF0dGluZyZmb3JtYXR0aW5nLWxpbmsgXV06XSBbc3RyaW5nIGh0dHA6Ly9leGFtcGxlLmNvbS9dIik7CgogIEZUKCJmb3JtYXR0aW5nX2xpbmtXZWIiLAogICAgICJbbGluayZmb3JtYXR0aW5nJmZvcm1hdHRpbmctbGluayA8XVtsaW5rIGh0dHA6Ly9leGFtcGxlLmNvbS9dW2xpbmsmZm9ybWF0dGluZyZmb3JtYXR0aW5nLWxpbmsgPl0iKTsKCiAgRlQoImZvcm1hdHRpbmdfbGlua0VtYWlsIiwKICAgICAiW2xpbmsmZm9ybWF0dGluZyZmb3JtYXR0aW5nLWxpbmsgPF1bbGluayB1c2VyQGV4YW1wbGUuY29tXVtsaW5rJmZvcm1hdHRpbmcmZm9ybWF0dGluZy1saW5rID5dIik7CgogIEZUKCJmb3JtYXR0aW5nX2VzY2FwZSIsCiAgICAgIltmb3JtYXR0aW5nJmZvcm1hdHRpbmctZXNjYXBlIFxcXSoiKTsKCiAgTVQoInBsYWluVGV4dCIsCiAgICAgImZvbyIpOwoKICAvLyBEb24ndCBzdHlsZSBzaW5nbGUgdHJhaWxpbmcgc3BhY2UKICBNVCgidHJhaWxpbmdTcGFjZTEiLAogICAgICJmb28gIik7CgogIC8vIFR3byBvciBtb3JlIHRyYWlsaW5nIHNwYWNlcyBzaG91bGQgYmUgc3R5bGVkIHdpdGggbGluZSBicmVhayBjaGFyYWN0ZXIKICBNVCgidHJhaWxpbmdTcGFjZTIiLAogICAgICJmb29bdHJhaWxpbmctc3BhY2UtYSAgXVt0cmFpbGluZy1zcGFjZS1uZXctbGluZSAgXSIpOwoKICBNVCgidHJhaWxpbmdTcGFjZTMiLAogICAgICJmb29bdHJhaWxpbmctc3BhY2UtYSAgXVt0cmFpbGluZy1zcGFjZS1iICBdW3RyYWlsaW5nLXNwYWNlLW5ldy1saW5lICBdIik7CgogIE1UKCJ0cmFpbGluZ1NwYWNlNCIsCiAgICAgImZvb1t0cmFpbGluZy1zcGFjZS1hICBdW3RyYWlsaW5nLXNwYWNlLWIgIF1bdHJhaWxpbmctc3BhY2UtYSAgXVt0cmFpbGluZy1zcGFjZS1uZXctbGluZSAgXSIpOwoKICAvLyBDb2RlIGJsb2NrcyB1c2luZyA0IHNwYWNlcyAocmVnYXJkbGVzcyBvZiBDb2RlTWlycm9yLnRhYlNpemUgdmFsdWUpCiAgTVQoImNvZGVCbG9ja3NVc2luZzRTcGFjZXMiLAogICAgICIgICAgW2NvbW1lbnQgZm9vXSIpOwoKICAvLyBDb2RlIGJsb2NrcyB1c2luZyA0IHNwYWNlcyB3aXRoIGludGVybmFsIGluZGVudGF0aW9uCiAgTVQoImNvZGVCbG9ja3NVc2luZzRTcGFjZXNJbmRlbnRhdGlvbiIsCiAgICAgIiAgICBbY29tbWVudCBiYXJdIiwKICAgICAiICAgICAgICBbY29tbWVudCBoZWxsb10iLAogICAgICIgICAgICAgICAgICBbY29tbWVudCB3b3JsZF0iLAogICAgICIgICAgW2NvbW1lbnQgZm9vXSIsCiAgICAgImJhciIpOwoKICAvLyBDb2RlIGJsb2NrcyB1c2luZyA0IHNwYWNlcyB3aXRoIGludGVybmFsIGluZGVudGF0aW9uCiAgTVQoImNvZGVCbG9ja3NVc2luZzRTcGFjZXNJbmRlbnRhdGlvbiIsCiAgICAgIiBmb28iLAogICAgICIgICAgW2NvbW1lbnQgYmFyXSIsCiAgICAgIiAgICAgICAgW2NvbW1lbnQgaGVsbG9dIiwKICAgICAiICAgIFtjb21tZW50IHdvcmxkXSIpOwoKICAvLyBDb2RlIGJsb2NrcyBzaG91bGQgZW5kIGV2ZW4gYWZ0ZXIgZXh0cmEgaW5kZW50ZWQgbGluZXMKICBNVCgiY29kZUJsb2Nrc1dpdGhUcmFpbGluZ0luZGVudGVkTGluZSIsCiAgICAgIiAgICBbY29tbWVudCBmb29dIiwKICAgICAiICAgICAgICBbY29tbWVudCBiYXJdIiwKICAgICAiICAgIFtjb21tZW50IGJhel0iLAogICAgICIgICAgIiwKICAgICAiaGVsbG8iKTsKCiAgLy8gQ29kZSBibG9ja3MgdXNpbmcgMSB0YWIgKHJlZ2FyZGxlc3Mgb2YgQ29kZU1pcnJvci5pbmRlbnRXaXRoVGFicyB2YWx1ZSkKICBNVCgiY29kZUJsb2Nrc1VzaW5nMVRhYiIsCiAgICAgIlx0W2NvbW1lbnQgZm9vXSIpOwoKICAvLyBJbmxpbmUgY29kZSB1c2luZyBiYWNrdGlja3MKICBNVCgiaW5saW5lQ29kZVVzaW5nQmFja3RpY2tzIiwKICAgICAiZm9vIFtjb21tZW50IGBiYXJgXSIpOwoKICAvLyBCbG9jayBjb2RlIHVzaW5nIHNpbmdsZSBiYWNrdGljayAoc2hvdWxkbid0IHdvcmspCiAgTVQoImJsb2NrQ29kZVNpbmdsZUJhY2t0aWNrIiwKICAgICAiW2NvbW1lbnQgYF0iLAogICAgICJmb28iLAogICAgICJbY29tbWVudCBgXSIpOwoKICAvLyBVbmNsb3NlZCBiYWNrdGlja3MKICAvLyBJbnN0ZWFkIG9mIHNpbXBseSBtYXJraW5nIGFzIENPREUsIGl0IHdvdWxkIGJlIG5pY2UgdG8gaGF2ZSBhbgogIC8vIGluY29tcGxldGUgZmxhZyBmb3IgQ09ERSwgdGhhdCBpcyBzdHlsZWQgc2xpZ2h0bHkgZGlmZmVyZW50LgogIE1UKCJ1bmNsb3NlZEJhY2t0aWNrcyIsCiAgICAgImZvbyBbY29tbWVudCBgYmFyXSIpOwoKICAvLyBQZXIgZG9jdW1lbnRhdGlvbjogIlRvIGluY2x1ZGUgYSBsaXRlcmFsIGJhY2t0aWNrIGNoYXJhY3RlciB3aXRoaW4gYQogIC8vIGNvZGUgc3BhbiwgeW91IGNhbiB1c2UgbXVsdGlwbGUgYmFja3RpY2tzIGFzIHRoZSBvcGVuaW5nIGFuZCBjbG9zaW5nCiAgLy8gZGVsaW1pdGVycyIKICBNVCgiZG91YmxlQmFja3RpY2tzIiwKICAgICAiW2NvbW1lbnQgYGBmb28gYCBiYXJgYF0iKTsKCiAgLy8gVGVzdHMgYmFzZWQgb24gRGluZ3VzCiAgLy8gaHR0cDovL2RhcmluZ2ZpcmViYWxsLm5ldC9wcm9qZWN0cy9tYXJrZG93bi9kaW5ndXMKICAvLwogIC8vIE11bHRpcGxlIGJhY2t0aWNrcyB3aXRoaW4gYW4gaW5saW5lIGNvZGUgYmxvY2sKICBNVCgiY29uc2VjdXRpdmVCYWNrdGlja3MiLAogICAgICJbY29tbWVudCBgZm9vYGBgYmFyYF0iKTsKCiAgLy8gTXVsdGlwbGUgYmFja3RpY2tzIHdpdGhpbiBhbiBpbmxpbmUgY29kZSBibG9jayB3aXRoIGEgc2Vjb25kIGNvZGUgYmxvY2sKICBNVCgiY29uc2VjdXRpdmVCYWNrdGlja3MiLAogICAgICJbY29tbWVudCBgZm9vYGBgYmFyYF0gaGVsbG8gW2NvbW1lbnQgYHdvcmxkYF0iKTsKCiAgLy8gVW5jbG9zZWQgd2l0aCBzZXZlcmFsIGRpZmZlcmVudCBncm91cHMgb2YgYmFja3RpY2tzCiAgTVQoInVuY2xvc2VkQmFja3RpY2tzIiwKICAgICAiW2NvbW1lbnQgYGBmb28gYGBgIGJhcmAgaGVsbG9dIik7CgogIC8vIENsb3NlZCB3aXRoIHNldmVyYWwgZGlmZmVyZW50IGdyb3VwcyBvZiBiYWNrdGlja3MKICBNVCgiY2xvc2VkQmFja3RpY2tzIiwKICAgICAiW2NvbW1lbnQgYGBmb28gYGBgIGJhcmAgaGVsbG9gYF0gd29ybGQiKTsKCiAgLy8gYXR4IGhlYWRlcnMKICAvLyBodHRwOi8vZGFyaW5nZmlyZWJhbGwubmV0L3Byb2plY3RzL21hcmtkb3duL3N5bnRheCNoZWFkZXIKCiAgTVQoImF0eEgxIiwKICAgICAiW2hlYWRlciZoZWFkZXItMSAjIGZvb10iKTsKCiAgTVQoImF0eEgyIiwKICAgICAiW2hlYWRlciZoZWFkZXItMiAjIyBmb29dIik7CgogIE1UKCJhdHhIMyIsCiAgICAgIltoZWFkZXImaGVhZGVyLTMgIyMjIGZvb10iKTsKCiAgTVQoImF0eEg0IiwKICAgICAiW2hlYWRlciZoZWFkZXItNCAjIyMjIGZvb10iKTsKCiAgTVQoImF0eEg1IiwKICAgICAiW2hlYWRlciZoZWFkZXItNSAjIyMjIyBmb29dIik7CgogIE1UKCJhdHhINiIsCiAgICAgIltoZWFkZXImaGVhZGVyLTYgIyMjIyMjIGZvb10iKTsKCiAgLy8gSDYgLSA3eCAnIycgc2hvdWxkIHN0aWxsIGJlIEg2LCBwZXIgRGluZ3VzCiAgLy8gaHR0cDovL2RhcmluZ2ZpcmViYWxsLm5ldC9wcm9qZWN0cy9tYXJrZG93bi9kaW5ndXMKICBNVCgiYXR4SDZOb3RINyIsCiAgICAgIltoZWFkZXImaGVhZGVyLTYgIyMjIyMjIyBmb29dIik7CgogIC8vIElubGluZSBzdHlsZXMgc2hvdWxkIGJlIHBhcnNlZCBpbnNpZGUgaGVhZGVycwogIE1UKCJhdHhIMWlubGluZSIsCiAgICAgIltoZWFkZXImaGVhZGVyLTEgIyBmb28gXVtoZWFkZXImaGVhZGVyLTEmZW0gKmJhcipdIik7CgogIC8vIFNldGV4dCBoZWFkZXJzIC0gSDEsIEgyCiAgLy8gUGVyIGRvY3VtZW50YXRpb24sICJBbnkgbnVtYmVyIG9mIHVuZGVybGluaW5nID3igJlzIG9yIC3igJlzIHdpbGwgd29yay4iCiAgLy8gaHR0cDovL2RhcmluZ2ZpcmViYWxsLm5ldC9wcm9qZWN0cy9tYXJrZG93bi9zeW50YXgjaGVhZGVyCiAgLy8gSWRlYWxseSwgdGhlIHRleHQgd291bGQgYmUgbWFya2VkIGFzIGBoZWFkZXJgIGFzIHdlbGwsIGJ1dCB0aGlzIGlzCiAgLy8gbm90IHJlYWxseSBmZWFzaWJsZSBhdCB0aGUgbW9tZW50LiBTbywgaW5zdGVhZCwgd2UncmUgdGVzdGluZyBhZ2FpbnN0CiAgLy8gd2hhdCB3b3JrcyB0b2RheSwgdG8gYXZvaWQgYW55IHJlZ3Jlc3Npb25zLgogIC8vCiAgLy8gQ2hlY2sgaWYgc2luZ2xlIHVuZGVybGluaW5nID0gd29ya3MKICBNVCgic2V0ZXh0SDEiLAogICAgICJmb28iLAogICAgICJbaGVhZGVyJmhlYWRlci0xID1dIik7CgogIC8vIENoZWNrIGlmIDMrID0ncyB3b3JrCiAgTVQoInNldGV4dEgxIiwKICAgICAiZm9vIiwKICAgICAiW2hlYWRlciZoZWFkZXItMSA9PT1dIik7CgogIC8vIENoZWNrIGlmIHNpbmdsZSB1bmRlcmxpbmluZyAtIHdvcmtzCiAgTVQoInNldGV4dEgyIiwKICAgICAiZm9vIiwKICAgICAiW2hlYWRlciZoZWFkZXItMiAtXSIpOwoKICAvLyBDaGVjayBpZiAzKyAtJ3Mgd29yawogIE1UKCJzZXRleHRIMiIsCiAgICAgImZvbyIsCiAgICAgIltoZWFkZXImaGVhZGVyLTIgLS0tXSIpOwoKICAvLyBTaW5nbGUtbGluZSBibG9ja3F1b3RlIHdpdGggdHJhaWxpbmcgc3BhY2UKICBNVCgiYmxvY2txdW90ZVNwYWNlIiwKICAgICAiW3F1b3RlJnF1b3RlLTEgPiBmb29dIik7CgogIC8vIFNpbmdsZS1saW5lIGJsb2NrcXVvdGUKICBNVCgiYmxvY2txdW90ZU5vU3BhY2UiLAogICAgICJbcXVvdGUmcXVvdGUtMSA+Zm9vXSIpOwoKICAvLyBObyBibGFuayBsaW5lIGJlZm9yZSBibG9ja3F1b3RlCiAgTVQoImJsb2NrcXVvdGVOb0JsYW5rTGluZSIsCiAgICAgImZvbyIsCiAgICAgIltxdW90ZSZxdW90ZS0xID4gYmFyXSIpOwoKICAvLyBOZXN0ZWQgYmxvY2txdW90ZQogIE1UKCJibG9ja3F1b3RlU3BhY2UiLAogICAgICJbcXVvdGUmcXVvdGUtMSA+IGZvb10iLAogICAgICJbcXVvdGUmcXVvdGUtMSA+XVtxdW90ZSZxdW90ZS0yID4gZm9vXSIsCiAgICAgIltxdW90ZSZxdW90ZS0xID5dW3F1b3RlJnF1b3RlLTIgPl1bcXVvdGUmcXVvdGUtMyA+IGZvb10iKTsKCiAgLy8gU2luZ2xlLWxpbmUgYmxvY2txdW90ZSBmb2xsb3dlZCBieSBub3JtYWwgcGFyYWdyYXBoCiAgTVQoImJsb2NrcXVvdGVUaGVuUGFyYWdyYXBoIiwKICAgICAiW3F1b3RlJnF1b3RlLTEgPmZvb10iLAogICAgICIiLAogICAgICJiYXIiKTsKCiAgLy8gTXVsdGktbGluZSBibG9ja3F1b3RlIChsYXp5IG1vZGUpCiAgTVQoIm11bHRpQmxvY2txdW90ZUxhenkiLAogICAgICJbcXVvdGUmcXVvdGUtMSA+Zm9vXSIsCiAgICAgIltxdW90ZSZxdW90ZS0xIGJhcl0iKTsKCiAgLy8gTXVsdGktbGluZSBibG9ja3F1b3RlIGZvbGxvd2VkIGJ5IG5vcm1hbCBwYXJhZ3JhcGggKGxhenkgbW9kZSkKICBNVCgibXVsdGlCbG9ja3F1b3RlTGF6eVRoZW5QYXJhZ3JhcGgiLAogICAgICJbcXVvdGUmcXVvdGUtMSA+Zm9vXSIsCiAgICAgIltxdW90ZSZxdW90ZS0xIGJhcl0iLAogICAgICIiLAogICAgICJoZWxsbyIpOwoKICAvLyBNdWx0aS1saW5lIGJsb2NrcXVvdGUgKG5vbi1sYXp5IG1vZGUpCiAgTVQoIm11bHRpQmxvY2txdW90ZSIsCiAgICAgIltxdW90ZSZxdW90ZS0xID5mb29dIiwKICAgICAiW3F1b3RlJnF1b3RlLTEgPmJhcl0iKTsKCiAgLy8gTXVsdGktbGluZSBibG9ja3F1b3RlIGZvbGxvd2VkIGJ5IG5vcm1hbCBwYXJhZ3JhcGggKG5vbi1sYXp5IG1vZGUpCiAgTVQoIm11bHRpQmxvY2txdW90ZVRoZW5QYXJhZ3JhcGgiLAogICAgICJbcXVvdGUmcXVvdGUtMSA+Zm9vXSIsCiAgICAgIltxdW90ZSZxdW90ZS0xID5iYXJdIiwKICAgICAiIiwKICAgICAiaGVsbG8iKTsKCiAgLy8gQ2hlY2sgbGlzdCB0eXBlcwoKICBNVCgibGlzdEFzdGVyaXNrIiwKICAgICAiZm9vIiwKICAgICAiYmFyIiwKICAgICAiIiwKICAgICAiW3ZhcmlhYmxlLTIgKiBmb29dIiwKICAgICAiW3ZhcmlhYmxlLTIgKiBiYXJdIik7CgogIE1UKCJsaXN0UGx1cyIsCiAgICAgImZvbyIsCiAgICAgImJhciIsCiAgICAgIiIsCiAgICAgIlt2YXJpYWJsZS0yICsgZm9vXSIsCiAgICAgIlt2YXJpYWJsZS0yICsgYmFyXSIpOwoKICBNVCgibGlzdERhc2giLAogICAgICJmb28iLAogICAgICJiYXIiLAogICAgICIiLAogICAgICJbdmFyaWFibGUtMiAtIGZvb10iLAogICAgICJbdmFyaWFibGUtMiAtIGJhcl0iKTsKCiAgTVQoImxpc3ROdW1iZXIiLAogICAgICJmb28iLAogICAgICJiYXIiLAogICAgICIiLAogICAgICJbdmFyaWFibGUtMiAxLiBmb29dIiwKICAgICAiW3ZhcmlhYmxlLTIgMi4gYmFyXSIpOwoKICAvLyBMaXN0cyByZXF1aXJlIGEgcHJlY2VkaW5nIGJsYW5rIGxpbmUgKHBlciBEaW5ndXMpCiAgTVQoImxpc3RCb2d1cyIsCiAgICAgImZvbyIsCiAgICAgIjEuIGJhciIsCiAgICAgIjIuIGhlbGxvIik7CgogIC8vIExpc3QgYWZ0ZXIgaGVhZGVyCiAgTVQoImxpc3RBZnRlckhlYWRlciIsCiAgICAgIltoZWFkZXImaGVhZGVyLTEgIyBmb29dIiwKICAgICAiW3ZhcmlhYmxlLTIgLSBiYXJdIik7CgogIC8vIEZvcm1hdHRpbmcgaW4gbGlzdHMgKCopCiAgTVQoImxpc3RBc3Rlcmlza0Zvcm1hdHRpbmciLAogICAgICJbdmFyaWFibGUtMiAqIF1bdmFyaWFibGUtMiZlbSAqZm9vKl1bdmFyaWFibGUtMiAgYmFyXSIsCiAgICAgIlt2YXJpYWJsZS0yICogXVt2YXJpYWJsZS0yJnN0cm9uZyAqKmZvbyoqXVt2YXJpYWJsZS0yICBiYXJdIiwKICAgICAiW3ZhcmlhYmxlLTIgKiBdW3ZhcmlhYmxlLTImc3Ryb25nICoqXVt2YXJpYWJsZS0yJmVtJnN0cm9uZyAqZm9vKipdW3ZhcmlhYmxlLTImZW0gKl1bdmFyaWFibGUtMiAgYmFyXSIsCiAgICAgIlt2YXJpYWJsZS0yICogXVt2YXJpYWJsZS0yJmNvbW1lbnQgYGZvb2BdW3ZhcmlhYmxlLTIgIGJhcl0iKTsKCiAgLy8gRm9ybWF0dGluZyBpbiBsaXN0cyAoKykKICBNVCgibGlzdFBsdXNGb3JtYXR0aW5nIiwKICAgICAiW3ZhcmlhYmxlLTIgKyBdW3ZhcmlhYmxlLTImZW0gKmZvbypdW3ZhcmlhYmxlLTIgIGJhcl0iLAogICAgICJbdmFyaWFibGUtMiArIF1bdmFyaWFibGUtMiZzdHJvbmcgKipmb28qKl1bdmFyaWFibGUtMiAgYmFyXSIsCiAgICAgIlt2YXJpYWJsZS0yICsgXVt2YXJpYWJsZS0yJnN0cm9uZyAqKl1bdmFyaWFibGUtMiZlbSZzdHJvbmcgKmZvbyoqXVt2YXJpYWJsZS0yJmVtICpdW3ZhcmlhYmxlLTIgIGJhcl0iLAogICAgICJbdmFyaWFibGUtMiArIF1bdmFyaWFibGUtMiZjb21tZW50IGBmb29gXVt2YXJpYWJsZS0yICBiYXJdIik7CgogIC8vIEZvcm1hdHRpbmcgaW4gbGlzdHMgKC0pCiAgTVQoImxpc3REYXNoRm9ybWF0dGluZyIsCiAgICAgIlt2YXJpYWJsZS0yIC0gXVt2YXJpYWJsZS0yJmVtICpmb28qXVt2YXJpYWJsZS0yICBiYXJdIiwKICAgICAiW3ZhcmlhYmxlLTIgLSBdW3ZhcmlhYmxlLTImc3Ryb25nICoqZm9vKipdW3ZhcmlhYmxlLTIgIGJhcl0iLAogICAgICJbdmFyaWFibGUtMiAtIF1bdmFyaWFibGUtMiZzdHJvbmcgKipdW3ZhcmlhYmxlLTImZW0mc3Ryb25nICpmb28qKl1bdmFyaWFibGUtMiZlbSAqXVt2YXJpYWJsZS0yICBiYXJdIiwKICAgICAiW3ZhcmlhYmxlLTIgLSBdW3ZhcmlhYmxlLTImY29tbWVudCBgZm9vYF1bdmFyaWFibGUtMiAgYmFyXSIpOwoKICAvLyBGb3JtYXR0aW5nIGluIGxpc3RzICgxLikKICBNVCgibGlzdE51bWJlckZvcm1hdHRpbmciLAogICAgICJbdmFyaWFibGUtMiAxLiBdW3ZhcmlhYmxlLTImZW0gKmZvbypdW3ZhcmlhYmxlLTIgIGJhcl0iLAogICAgICJbdmFyaWFibGUtMiAyLiBdW3ZhcmlhYmxlLTImc3Ryb25nICoqZm9vKipdW3ZhcmlhYmxlLTIgIGJhcl0iLAogICAgICJbdmFyaWFibGUtMiAzLiBdW3ZhcmlhYmxlLTImc3Ryb25nICoqXVt2YXJpYWJsZS0yJmVtJnN0cm9uZyAqZm9vKipdW3ZhcmlhYmxlLTImZW0gKl1bdmFyaWFibGUtMiAgYmFyXSIsCiAgICAgIlt2YXJpYWJsZS0yIDQuIF1bdmFyaWFibGUtMiZjb21tZW50IGBmb29gXVt2YXJpYWJsZS0yICBiYXJdIik7CgogIC8vIFBhcmFncmFwaCBsaXN0cwogIE1UKCJsaXN0UGFyYWdyYXBoIiwKICAgICAiW3ZhcmlhYmxlLTIgKiBmb29dIiwKICAgICAiIiwKICAgICAiW3ZhcmlhYmxlLTIgKiBiYXJdIik7CgogIC8vIE11bHRpLXBhcmFncmFwaCBsaXN0cwogIC8vCiAgLy8gNCBzcGFjZXMKICBNVCgibGlzdE11bHRpUGFyYWdyYXBoIiwKICAgICAiW3ZhcmlhYmxlLTIgKiBmb29dIiwKICAgICAiIiwKICAgICAiW3ZhcmlhYmxlLTIgKiBiYXJdIiwKICAgICAiIiwKICAgICAiICAgIFt2YXJpYWJsZS0yIGhlbGxvXSIpOwoKICAvLyA0IHNwYWNlcywgZXh0cmEgYmxhbmsgbGluZXMgKHNob3VsZCBzdGlsbCBiZSBsaXN0LCBwZXIgRGluZ3VzKQogIE1UKCJsaXN0TXVsdGlQYXJhZ3JhcGhFeHRyYSIsCiAgICAgIlt2YXJpYWJsZS0yICogZm9vXSIsCiAgICAgIiIsCiAgICAgIlt2YXJpYWJsZS0yICogYmFyXSIsCiAgICAgIiIsCiAgICAgIiIsCiAgICAgIiAgICBbdmFyaWFibGUtMiBoZWxsb10iKTsKCiAgLy8gNCBzcGFjZXMsIHBsdXMgMSBzcGFjZSAoc2hvdWxkIHN0aWxsIGJlIGxpc3QsIHBlciBEaW5ndXMpCiAgTVQoImxpc3RNdWx0aVBhcmFncmFwaEV4dHJhU3BhY2UiLAogICAgICJbdmFyaWFibGUtMiAqIGZvb10iLAogICAgICIiLAogICAgICJbdmFyaWFibGUtMiAqIGJhcl0iLAogICAgICIiLAogICAgICIgICAgIFt2YXJpYWJsZS0yIGhlbGxvXSIsCiAgICAgIiIsCiAgICAgIiAgICBbdmFyaWFibGUtMiB3b3JsZF0iKTsKCiAgLy8gMSB0YWIKICBNVCgibGlzdFRhYiIsCiAgICAgIlt2YXJpYWJsZS0yICogZm9vXSIsCiAgICAgIiIsCiAgICAgIlt2YXJpYWJsZS0yICogYmFyXSIsCiAgICAgIiIsCiAgICAgIlx0W3ZhcmlhYmxlLTIgaGVsbG9dIik7CgogIC8vIE5vIGluZGVudAogIE1UKCJsaXN0Tm9JbmRlbnQiLAogICAgICJbdmFyaWFibGUtMiAqIGZvb10iLAogICAgICIiLAogICAgICJbdmFyaWFibGUtMiAqIGJhcl0iLAogICAgICIiLAogICAgICJoZWxsbyIpOwoKICAvLyBCbG9ja3F1b3RlCiAgTVQoImJsb2NrcXVvdGUiLAogICAgICJbdmFyaWFibGUtMiAqIGZvb10iLAogICAgICIiLAogICAgICJbdmFyaWFibGUtMiAqIGJhcl0iLAogICAgICIiLAogICAgICIgICAgW3ZhcmlhYmxlLTImcXVvdGUmcXVvdGUtMSA+IGhlbGxvXSIpOwoKICAvLyBDb2RlIGJsb2NrCiAgTVQoImJsb2NrcXVvdGVDb2RlIiwKICAgICAiW3ZhcmlhYmxlLTIgKiBmb29dIiwKICAgICAiIiwKICAgICAiW3ZhcmlhYmxlLTIgKiBiYXJdIiwKICAgICAiIiwKICAgICAiICAgICAgICBbY29tbWVudCA+IGhlbGxvXSIsCiAgICAgIiIsCiAgICAgIiAgICBbdmFyaWFibGUtMiB3b3JsZF0iKTsKCiAgLy8gQ29kZSBibG9jayBmb2xsb3dlZCBieSB0ZXh0CiAgTVQoImJsb2NrcXVvdGVDb2RlVGV4dCIsCiAgICAgIlt2YXJpYWJsZS0yICogZm9vXSIsCiAgICAgIiIsCiAgICAgIiAgICBbdmFyaWFibGUtMiBiYXJdIiwKICAgICAiIiwKICAgICAiICAgICAgICBbY29tbWVudCBoZWxsb10iLAogICAgICIiLAogICAgICIgICAgW3ZhcmlhYmxlLTIgd29ybGRdIik7CgogIC8vIE5lc3RlZCBsaXN0CgogIE1UKCJsaXN0QXN0ZXJpc2tOZXN0ZWQiLAogICAgICJbdmFyaWFibGUtMiAqIGZvb10iLAogICAgICIiLAogICAgICIgICAgW3ZhcmlhYmxlLTMgKiBiYXJdIik7CgogIE1UKCJsaXN0UGx1c05lc3RlZCIsCiAgICAgIlt2YXJpYWJsZS0yICsgZm9vXSIsCiAgICAgIiIsCiAgICAgIiAgICBbdmFyaWFibGUtMyArIGJhcl0iKTsKCiAgTVQoImxpc3REYXNoTmVzdGVkIiwKICAgICAiW3ZhcmlhYmxlLTIgLSBmb29dIiwKICAgICAiIiwKICAgICAiICAgIFt2YXJpYWJsZS0zIC0gYmFyXSIpOwoKICBNVCgibGlzdE51bWJlck5lc3RlZCIsCiAgICAgIlt2YXJpYWJsZS0yIDEuIGZvb10iLAogICAgICIiLAogICAgICIgICAgW3ZhcmlhYmxlLTMgMi4gYmFyXSIpOwoKICBNVCgibGlzdE1peGVkIiwKICAgICAiW3ZhcmlhYmxlLTIgKiBmb29dIiwKICAgICAiIiwKICAgICAiICAgIFt2YXJpYWJsZS0zICsgYmFyXSIsCiAgICAgIiIsCiAgICAgIiAgICAgICAgW2tleXdvcmQgLSBoZWxsb10iLAogICAgICIiLAogICAgICIgICAgICAgICAgICBbdmFyaWFibGUtMiAxLiB3b3JsZF0iKTsKCiAgTVQoImxpc3RCbG9ja3F1b3RlIiwKICAgICAiW3ZhcmlhYmxlLTIgKiBmb29dIiwKICAgICAiIiwKICAgICAiICAgIFt2YXJpYWJsZS0zICsgYmFyXSIsCiAgICAgIiIsCiAgICAgIiAgICAgICAgW3F1b3RlJnF1b3RlLTEmdmFyaWFibGUtMyA+IGhlbGxvXSIpOwoKICBNVCgibGlzdENvZGUiLAogICAgICJbdmFyaWFibGUtMiAqIGZvb10iLAogICAgICIiLAogICAgICIgICAgW3ZhcmlhYmxlLTMgKyBiYXJdIiwKICAgICAiIiwKICAgICAiICAgICAgICAgICAgW2NvbW1lbnQgaGVsbG9dIik7CgogIC8vIENvZGUgd2l0aCBpbnRlcm5hbCBpbmRlbnRhdGlvbgogIE1UKCJsaXN0Q29kZUluZGVudGF0aW9uIiwKICAgICAiW3ZhcmlhYmxlLTIgKiBmb29dIiwKICAgICAiIiwKICAgICAiICAgICAgICBbY29tbWVudCBiYXJdIiwKICAgICAiICAgICAgICAgICAgW2NvbW1lbnQgaGVsbG9dIiwKICAgICAiICAgICAgICAgICAgICAgIFtjb21tZW50IHdvcmxkXSIsCiAgICAgIiAgICAgICAgW2NvbW1lbnQgZm9vXSIsCiAgICAgIiAgICBbdmFyaWFibGUtMiBiYXJdIik7CgogIC8vIExpc3QgbmVzdGluZyBlZGdlIGNhc2VzCiAgTVQoImxpc3ROZXN0ZWQiLAogICAgIlt2YXJpYWJsZS0yICogZm9vXSIsCiAgICAiIiwKICAgICIgICAgW3ZhcmlhYmxlLTMgKiBiYXJdIiwKICAgICIiLAogICAgIiAgICAgICBbdmFyaWFibGUtMiBoZWxsb10iCiAgKTsKICBNVCgibGlzdE5lc3RlZCIsCiAgICAiW3ZhcmlhYmxlLTIgKiBmb29dIiwKICAgICIiLAogICAgIiAgICBbdmFyaWFibGUtMyAqIGJhcl0iLAogICAgIiIsCiAgICAiICAgICAgW3ZhcmlhYmxlLTMgKiBmb29dIgogICk7CgogIC8vIENvZGUgZm9sbG93ZWQgYnkgdGV4dAogIE1UKCJsaXN0Q29kZVRleHQiLAogICAgICJbdmFyaWFibGUtMiAqIGZvb10iLAogICAgICIiLAogICAgICIgICAgICAgIFtjb21tZW50IGJhcl0iLAogICAgICIiLAogICAgICJoZWxsbyIpOwoKICAvLyBGb2xsb3dpbmcgdGVzdHMgZGlyZWN0bHkgZnJvbSBvZmZpY2lhbCBNYXJrZG93biBkb2N1bWVudGF0aW9uCiAgLy8gaHR0cDovL2RhcmluZ2ZpcmViYWxsLm5ldC9wcm9qZWN0cy9tYXJrZG93bi9zeW50YXgjaHIKCiAgTVQoImhyU3BhY2UiLAogICAgICJbaHIgKiAqICpdIik7CgogIE1UKCJociIsCiAgICAgIltociAqKipdIik7CgogIE1UKCJockxvbmciLAogICAgICJbaHIgKioqKipdIik7CgogIE1UKCJoclNwYWNlRGFzaCIsCiAgICAgIltociAtIC0gLV0iKTsKCiAgTVQoImhyRGFzaExvbmciLAogICAgICJbaHIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXSIpOwoKICAvLyBJbmxpbmUgbGluayB3aXRoIHRpdGxlCiAgTVQoImxpbmtUaXRsZSIsCiAgICAgIltsaW5rIFtbZm9vXV1dW3N0cmluZyAoaHR0cDovL2V4YW1wbGUuY29tLyBcImJhclwiKV0gaGVsbG8iKTsKCiAgLy8gSW5saW5lIGxpbmsgd2l0aG91dCB0aXRsZQogIE1UKCJsaW5rTm9UaXRsZSIsCiAgICAgIltsaW5rIFtbZm9vXV1dW3N0cmluZyAoaHR0cDovL2V4YW1wbGUuY29tLyldIGJhciIpOwoKICAvLyBJbmxpbmUgbGluayB3aXRoIGltYWdlCiAgTVQoImxpbmtJbWFnZSIsCiAgICAgIltsaW5rIFtbXVt0YWcgIVtbZm9vXV1dW3N0cmluZyAoaHR0cDovL2V4YW1wbGUuY29tLyldW2xpbmsgXV1dW3N0cmluZyAoaHR0cDovL2V4YW1wbGUuY29tLyldIGJhciIpOwoKICAvLyBJbmxpbmUgbGluayB3aXRoIEVtCiAgTVQoImxpbmtFbSIsCiAgICAgIltsaW5rIFtbXVtsaW5rJmVtICpmb28qXVtsaW5rIF1dXVtzdHJpbmcgKGh0dHA6Ly9leGFtcGxlLmNvbS8pXSBiYXIiKTsKCiAgLy8gSW5saW5lIGxpbmsgd2l0aCBTdHJvbmcKICBNVCgibGlua1N0cm9uZyIsCiAgICAgIltsaW5rIFtbXVtsaW5rJnN0cm9uZyAqKmZvbyoqXVtsaW5rIF1dXVtzdHJpbmcgKGh0dHA6Ly9leGFtcGxlLmNvbS8pXSBiYXIiKTsKCiAgLy8gSW5saW5lIGxpbmsgd2l0aCBFbVN0cm9uZwogIE1UKCJsaW5rRW1TdHJvbmciLAogICAgICJbbGluayBbW11bbGluayZzdHJvbmcgKipdW2xpbmsmZW0mc3Ryb25nICpmb28qKl1bbGluayZlbSAqXVtsaW5rIF1dXVtzdHJpbmcgKGh0dHA6Ly9leGFtcGxlLmNvbS8pXSBiYXIiKTsKCiAgLy8gSW1hZ2Ugd2l0aCB0aXRsZQogIE1UKCJpbWFnZVRpdGxlIiwKICAgICAiW3RhZyAhW1tmb29dXV1bc3RyaW5nIChodHRwOi8vZXhhbXBsZS5jb20vIFwiYmFyXCIpXSBoZWxsbyIpOwoKICAvLyBJbWFnZSB3aXRob3V0IHRpdGxlCiAgTVQoImltYWdlTm9UaXRsZSIsCiAgICAgIlt0YWcgIVtbZm9vXV1dW3N0cmluZyAoaHR0cDovL2V4YW1wbGUuY29tLyldIGJhciIpOwoKICAvLyBJbWFnZSB3aXRoIGFzdGVyaXNrcwogIE1UKCJpbWFnZUFzdGVyaXNrcyIsCiAgICAgIlt0YWcgIVtbKmZvbypdXV1bc3RyaW5nIChodHRwOi8vZXhhbXBsZS5jb20vKV0gYmFyIik7CgogIC8vIE5vdCBhIGxpbmsuIFNob3VsZCBiZSBub3JtYWwgdGV4dCBkdWUgdG8gc3F1YXJlIGJyYWNrZXRzIGJlaW5nIHVzZWQKICAvLyByZWd1bGFybHkgaW4gdGV4dCwgZXNwZWNpYWxseSBpbiBxdW90ZWQgbWF0ZXJpYWwsIGFuZCBubyBzcGFjZSBpcyBhbGxvd2VkCiAgLy8gYmV0d2VlbiBzcXVhcmUgYnJhY2tldHMgYW5kIHBhcmVudGhlc2VzIChwZXIgRGluZ3VzKS4KICBNVCgibm90QUxpbmsiLAogICAgICJbW2Zvb11dIChiYXIpIik7CgogIC8vIFJlZmVyZW5jZS1zdHlsZSBsaW5rcwogIE1UKCJsaW5rUmVmZXJlbmNlIiwKICAgICAiW2xpbmsgW1tmb29dXV1bc3RyaW5nIFtbYmFyXV1dIGhlbGxvIik7CgogIC8vIFJlZmVyZW5jZS1zdHlsZSBsaW5rcyB3aXRoIEVtCiAgTVQoImxpbmtSZWZlcmVuY2VFbSIsCiAgICAgIltsaW5rIFtbXVtsaW5rJmVtICpmb28qXVtsaW5rIF1dXVtzdHJpbmcgW1tiYXJdXV0gaGVsbG8iKTsKCiAgLy8gUmVmZXJlbmNlLXN0eWxlIGxpbmtzIHdpdGggU3Ryb25nCiAgTVQoImxpbmtSZWZlcmVuY2VTdHJvbmciLAogICAgICJbbGluayBbW11bbGluayZzdHJvbmcgKipmb28qKl1bbGluayBdXV1bc3RyaW5nIFtbYmFyXV1dIGhlbGxvIik7CgogIC8vIFJlZmVyZW5jZS1zdHlsZSBsaW5rcyB3aXRoIEVtU3Ryb25nCiAgTVQoImxpbmtSZWZlcmVuY2VFbVN0cm9uZyIsCiAgICAgIltsaW5rIFtbXVtsaW5rJnN0cm9uZyAqKl1bbGluayZlbSZzdHJvbmcgKmZvbyoqXVtsaW5rJmVtICpdW2xpbmsgXV1dW3N0cmluZyBbW2Jhcl1dXSBoZWxsbyIpOwoKICAvLyBSZWZlcmVuY2Utc3R5bGUgbGlua3Mgd2l0aCBvcHRpb25hbCBzcGFjZSBzZXBhcmF0b3IgKHBlciBkb2N1ZW50YXRpb24pCiAgLy8gIllvdSBjYW4gb3B0aW9uYWxseSB1c2UgYSBzcGFjZSB0byBzZXBhcmF0ZSB0aGUgc2V0cyBvZiBicmFja2V0cyIKICBNVCgibGlua1JlZmVyZW5jZVNwYWNlIiwKICAgICAiW2xpbmsgW1tmb29dXV0gW3N0cmluZyBbW2Jhcl1dXSBoZWxsbyIpOwoKICAvLyBTaG91bGQgb25seSBhbGxvdyBhIHNpbmdsZSBzcGFjZSAoIi4uLnVzZSAqYSogc3BhY2UuLi4iKQogIE1UKCJsaW5rUmVmZXJlbmNlRG91YmxlU3BhY2UiLAogICAgICJbW2Zvb11dICBbW2Jhcl1dIGhlbGxvIik7CgogIC8vIFJlZmVyZW5jZS1zdHlsZSBsaW5rcyB3aXRoIGltcGxpY2l0IGxpbmsgbmFtZQogIE1UKCJsaW5rSW1wbGljaXQiLAogICAgICJbbGluayBbW2Zvb11dXVtzdHJpbmcgW1tdXV0gaGVsbG8iKTsKCiAgLy8gQHRvZG8gSXQgd291bGQgYmUgbmljZSBpZiwgYXQgc29tZSBwb2ludCwgdGhlIGRvY3VtZW50IHdhcyBhY3R1YWxseQogIC8vIGNoZWNrZWQgdG8gc2VlIGlmIHRoZSByZWZlcmVuY2VkIGxpbmsgZXhpc3RzCgogIC8vIExpbmsgbGFiZWwsIGZvciByZWZlcmVuY2Utc3R5bGUgbGlua3MgKHRha2VuIGZyb20gZG9jdW1lbnRhdGlvbikKCiAgTVQoImxhYmVsTm9UaXRsZSIsCiAgICAgIltsaW5rIFtbZm9vXV06XSBbc3RyaW5nIGh0dHA6Ly9leGFtcGxlLmNvbS9dIik7CgogIE1UKCJsYWJlbEluZGVudGVkIiwKICAgICAiICAgW2xpbmsgW1tmb29dXTpdIFtzdHJpbmcgaHR0cDovL2V4YW1wbGUuY29tL10iKTsKCiAgTVQoImxhYmVsU3BhY2VUaXRsZSIsCiAgICAgIltsaW5rIFtbZm9vIGJhcl1dOl0gW3N0cmluZyBodHRwOi8vZXhhbXBsZS5jb20vIFwiaGVsbG9cIl0iKTsKCiAgTVQoImxhYmVsRG91YmxlVGl0bGUiLAogICAgICJbbGluayBbW2ZvbyBiYXJdXTpdIFtzdHJpbmcgaHR0cDovL2V4YW1wbGUuY29tLyBcImhlbGxvXCJdIFwid29ybGRcIiIpOwoKICBNVCgibGFiZWxUaXRsZURvdWJsZVF1b3RlcyIsCiAgICAgIltsaW5rIFtbZm9vXV06XSBbc3RyaW5nIGh0dHA6Ly9leGFtcGxlLmNvbS8gIFwiYmFyXCJdIik7CgogIE1UKCJsYWJlbFRpdGxlU2luZ2xlUXVvdGVzIiwKICAgICAiW2xpbmsgW1tmb29dXTpdIFtzdHJpbmcgaHR0cDovL2V4YW1wbGUuY29tLyAgJ2JhciddIik7CgogIE1UKCJsYWJlbFRpdGxlUGFyZW50aGVzZSIsCiAgICAgIltsaW5rIFtbZm9vXV06XSBbc3RyaW5nIGh0dHA6Ly9leGFtcGxlLmNvbS8gIChiYXIpXSIpOwoKICBNVCgibGFiZWxUaXRsZUludmFsaWQiLAogICAgICJbbGluayBbW2Zvb11dOl0gW3N0cmluZyBodHRwOi8vZXhhbXBsZS5jb20vXSBiYXIiKTsKCiAgTVQoImxhYmVsTGlua0FuZ2xlQnJhY2tldHMiLAogICAgICJbbGluayBbW2Zvb11dOl0gW3N0cmluZyA8aHR0cDovL2V4YW1wbGUuY29tLz4gIFwiYmFyXCJdIik7CgogIE1UKCJsYWJlbFRpdGxlTmV4dERvdWJsZVF1b3RlcyIsCiAgICAgIltsaW5rIFtbZm9vXV06XSBbc3RyaW5nIGh0dHA6Ly9leGFtcGxlLmNvbS9dIiwKICAgICAiW3N0cmluZyBcImJhclwiXSBoZWxsbyIpOwoKICBNVCgibGFiZWxUaXRsZU5leHRTaW5nbGVRdW90ZXMiLAogICAgICJbbGluayBbW2Zvb11dOl0gW3N0cmluZyBodHRwOi8vZXhhbXBsZS5jb20vXSIsCiAgICAgIltzdHJpbmcgJ2JhciddIGhlbGxvIik7CgogIE1UKCJsYWJlbFRpdGxlTmV4dFBhcmVudGhlc2UiLAogICAgICJbbGluayBbW2Zvb11dOl0gW3N0cmluZyBodHRwOi8vZXhhbXBsZS5jb20vXSIsCiAgICAgIltzdHJpbmcgKGJhcildIGhlbGxvIik7CgogIE1UKCJsYWJlbFRpdGxlTmV4dE1peGVkIiwKICAgICAiW2xpbmsgW1tmb29dXTpdIFtzdHJpbmcgaHR0cDovL2V4YW1wbGUuY29tL10iLAogICAgICIoYmFyXCIgaGVsbG8iKTsKCiAgTVQoImxpbmtXZWIiLAogICAgICJbbGluayA8aHR0cDovL2V4YW1wbGUuY29tLz5dIGZvbyIpOwoKICBNVCgibGlua1dlYkRvdWJsZSIsCiAgICAgIltsaW5rIDxodHRwOi8vZXhhbXBsZS5jb20vPl0gZm9vIFtsaW5rIDxodHRwOi8vZXhhbXBsZS5jb20vPl0iKTsKCiAgTVQoImxpbmtFbWFpbCIsCiAgICAgIltsaW5rIDx1c2VyQGV4YW1wbGUuY29tPl0gZm9vIik7CgogIE1UKCJsaW5rRW1haWxEb3VibGUiLAogICAgICJbbGluayA8dXNlckBleGFtcGxlLmNvbT5dIGZvbyBbbGluayA8dXNlckBleGFtcGxlLmNvbT5dIik7CgogIE1UKCJlbUFzdGVyaXNrIiwKICAgICAiW2VtICpmb28qXSBiYXIiKTsKCiAgTVQoImVtVW5kZXJzY29yZSIsCiAgICAgIltlbSBfZm9vX10gYmFyIik7CgogIE1UKCJlbUluV29yZEFzdGVyaXNrIiwKICAgICAiZm9vW2VtICpiYXIqXWhlbGxvIik7CgogIE1UKCJlbUluV29yZFVuZGVyc2NvcmUiLAogICAgICJmb29bZW0gX2Jhcl9daGVsbG8iKTsKCiAgLy8gUGVyIGRvY3VtZW50YXRpb246ICIuLi5zdXJyb3VuZCBhbiAqIG9yIF8gd2l0aCBzcGFjZXMsIGl04oCZbGwgYmUKICAvLyB0cmVhdGVkIGFzIGEgbGl0ZXJhbCBhc3RlcmlzayBvciB1bmRlcnNjb3JlLiIKCiAgTVQoImVtRXNjYXBlZEJ5U3BhY2VJbiIsCiAgICAgImZvbyBbZW0gX2JhciBfIGhlbGxvX10gd29ybGQiKTsKCiAgTVQoImVtRXNjYXBlZEJ5U3BhY2VPdXQiLAogICAgICJmb28gXyBiYXJbZW0gX2hlbGxvX113b3JsZCIpOwoKICBNVCgiZW1Fc2NhcGVkQnlOZXdsaW5lIiwKICAgICAiZm9vIiwKICAgICAiXyBiYXJbZW0gX2hlbGxvX113b3JsZCIpOwoKICAvLyBVbmNsb3NlZCBlbXBoYXNpcyBjaGFyYWN0ZXJzCiAgLy8gSW5zdGVhZCBvZiBzaW1wbHkgbWFya2luZyBhcyBFTSAvIFNUUk9ORywgaXQgd291bGQgYmUgbmljZSB0byBoYXZlIGFuCiAgLy8gaW5jb21wbGV0ZSBmbGFnIGZvciBFTSBhbmQgU1RST05HLCB0aGF0IGlzIHN0eWxlZCBzbGlnaHRseSBkaWZmZXJlbnQuCiAgTVQoImVtSW5jb21wbGV0ZUFzdGVyaXNrIiwKICAgICAiZm9vIFtlbSAqYmFyXSIpOwoKICBNVCgiZW1JbmNvbXBsZXRlVW5kZXJzY29yZSIsCiAgICAgImZvbyBbZW0gX2Jhcl0iKTsKCiAgTVQoInN0cm9uZ0FzdGVyaXNrIiwKICAgICAiW3N0cm9uZyAqKmZvbyoqXSBiYXIiKTsKCiAgTVQoInN0cm9uZ1VuZGVyc2NvcmUiLAogICAgICJbc3Ryb25nIF9fZm9vX19dIGJhciIpOwoKICBNVCgiZW1TdHJvbmdBc3RlcmlzayIsCiAgICAgIltlbSAqZm9vXVtlbSZzdHJvbmcgKipiYXIqXVtzdHJvbmcgaGVsbG8qKl0gd29ybGQiKTsKCiAgTVQoImVtU3Ryb25nVW5kZXJzY29yZSIsCiAgICAgIltlbSBfZm9vXVtlbSZzdHJvbmcgX19iYXJfXVtzdHJvbmcgaGVsbG9fX10gd29ybGQiKTsKCiAgLy8gIi4uLnNhbWUgY2hhcmFjdGVyIG11c3QgYmUgdXNlZCB0byBvcGVuIGFuZCBjbG9zZSBhbiBlbXBoYXNpcyBzcGFuLiIiCiAgTVQoImVtU3Ryb25nTWl4ZWQiLAogICAgICJbZW0gX2Zvb11bZW0mc3Ryb25nICoqYmFyKmhlbGxvX18gd29ybGRdIik7CgogIE1UKCJlbVN0cm9uZ01peGVkIiwKICAgICAiW2VtICpmb29dW2VtJnN0cm9uZyBfX2Jhcl9oZWxsbyoqIHdvcmxkXSIpOwoKICAvLyBUaGVzZSBjaGFyYWN0ZXJzIHNob3VsZCBiZSBlc2NhcGVkOgogIC8vIFwgICBiYWNrc2xhc2gKICAvLyBgICAgYmFja3RpY2sKICAvLyAqICAgYXN0ZXJpc2sKICAvLyBfICAgdW5kZXJzY29yZQogIC8vIHt9ICBjdXJseSBicmFjZXMKICAvLyBbXSAgc3F1YXJlIGJyYWNrZXRzCiAgLy8gKCkgIHBhcmVudGhlc2VzCiAgLy8gIyAgIGhhc2ggbWFyawogIC8vICsgICBwbHVzIHNpZ24KICAvLyAtICAgbWludXMgc2lnbiAoaHlwaGVuKQogIC8vIC4gICBkb3QKICAvLyAhICAgZXhjbGFtYXRpb24gbWFyawoKICBNVCgiZXNjYXBlQmFja3RpY2siLAogICAgICJmb28gXFxgYmFyXFxgIik7CgogIE1UKCJkb3VibGVFc2NhcGVCYWNrdGljayIsCiAgICAgImZvbyBcXFxcW2NvbW1lbnQgYGJhclxcXFxgXSIpOwoKICBNVCgiZXNjYXBlQXN0ZXJpc2siLAogICAgICJmb28gXFwqYmFyXFwqIik7CgogIE1UKCJkb3VibGVFc2NhcGVBc3RlcmlzayIsCiAgICAgImZvbyBcXFxcW2VtICpiYXJcXFxcKl0iKTsKCiAgTVQoImVzY2FwZVVuZGVyc2NvcmUiLAogICAgICJmb28gXFxfYmFyXFxfIik7CgogIE1UKCJkb3VibGVFc2NhcGVVbmRlcnNjb3JlIiwKICAgICAiZm9vIFxcXFxbZW0gX2JhclxcXFxfXSIpOwoKICBNVCgiZXNjYXBlSGFzaCIsCiAgICAgIlxcIyBmb28iKTsKCiAgTVQoImRvdWJsZUVzY2FwZUhhc2giLAogICAgICJcXFxcIyBmb28iKTsKCiAgTVQoImVzY2FwZU5ld2xpbmUiLAogICAgICJcXCIsCiAgICAgIltlbSAqZm9vKl0iKTsKCgogIC8vIFRlc3RzIHRvIG1ha2Ugc3VyZSBHRk0tc3BlY2lmaWMgdGhpbmdzIGFyZW4ndCBnZXR0aW5nIHRocm91Z2gKCiAgTVQoInRhc2tMaXN0IiwKICAgICAiW3ZhcmlhYmxlLTIgKiBbIF1dIGJhcl0iKTsKCiAgTVQoImZlbmNlZENvZGVCbG9ja3MiLAogICAgICJbY29tbWVudCBgYGBdIiwKICAgICAiZm9vIiwKICAgICAiW2NvbW1lbnQgYGBgXSIpOwoKICAvLyBUZXN0cyB0aGF0IHJlcXVpcmUgWE1MIG1vZGUKCiAgTVQoInhtbE1vZGUiLAogICAgICJbdGFnJmJyYWNrZXQgPF1bdGFnIGRpdl1bdGFnJmJyYWNrZXQgPl0iLAogICAgICIqZm9vKiIsCiAgICAgIlt0YWcmYnJhY2tldCA8XVt0YWcgaHR0cDovL2dpdGh1Yi5jb21dW3RhZyZicmFja2V0IC8+XSIsCiAgICAgIlt0YWcmYnJhY2tldCA8L11bdGFnIGRpdl1bdGFnJmJyYWNrZXQgPl0iLAogICAgICJbbGluayA8aHR0cDovL2dpdGh1Yi5jb20vPl0iKTsKCiAgTVQoInhtbE1vZGVXaXRoTWFya2Rvd25JbnNpZGUiLAogICAgICJbdGFnJmJyYWNrZXQgPF1bdGFnIGRpdl0gW2F0dHJpYnV0ZSBtYXJrZG93bl09W3N0cmluZyAxXVt0YWcmYnJhY2tldCA+XSIsCiAgICAgIltlbSAqZm9vKl0iLAogICAgICJbbGluayA8aHR0cDovL2dpdGh1Yi5jb20vPl0iLAogICAgICJbdGFnIDwvZGl2Pl0iLAogICAgICJbbGluayA8aHR0cDovL2dpdGh1Yi5jb20vPl0iLAogICAgICJbdGFnJmJyYWNrZXQgPF1bdGFnIGRpdl1bdGFnJmJyYWNrZXQgPl0iLAogICAgICJbdGFnJmJyYWNrZXQgPC9dW3RhZyBkaXZdW3RhZyZicmFja2V0ID5dIik7Cgp9KSgpOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/meta.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CgpDb2RlTWlycm9yLm1vZGVJbmZvID0gWwogIHtuYW1lOiAiQVBMIiwgbWltZTogInRleHQvYXBsIiwgbW9kZTogImFwbCJ9LAogIHtuYW1lOiAiQXN0ZXJpc2siLCBtaW1lOiAidGV4dC94LWFzdGVyaXNrIiwgbW9kZTogImFzdGVyaXNrIn0sCiAge25hbWU6ICJDIiwgbWltZTogInRleHQveC1jc3JjIiwgbW9kZTogImNsaWtlIn0sCiAge25hbWU6ICJDKysiLCBtaW1lOiAidGV4dC94LWMrK3NyYyIsIG1vZGU6ICJjbGlrZSJ9LAogIHtuYW1lOiAiQ29ib2wiLCBtaW1lOiAidGV4dC94LWNvYm9sIiwgbW9kZTogImNvYm9sIn0sCiAge25hbWU6ICJKYXZhIiwgbWltZTogInRleHQveC1qYXZhIiwgbW9kZTogImNsaWtlIn0sCiAge25hbWU6ICJDIyIsIG1pbWU6ICJ0ZXh0L3gtY3NoYXJwIiwgbW9kZTogImNsaWtlIn0sCiAge25hbWU6ICJTY2FsYSIsIG1pbWU6ICJ0ZXh0L3gtc2NhbGEiLCBtb2RlOiAiY2xpa2UifSwKICB7bmFtZTogIkNsb2p1cmUiLCBtaW1lOiAidGV4dC94LWNsb2p1cmUiLCBtb2RlOiAiY2xvanVyZSJ9LAogIHtuYW1lOiAiQ29mZmVlU2NyaXB0IiwgbWltZTogInRleHQveC1jb2ZmZWVzY3JpcHQiLCBtb2RlOiAiY29mZmVlc2NyaXB0In0sCiAge25hbWU6ICJDb21tb24gTGlzcCIsIG1pbWU6ICJ0ZXh0L3gtY29tbW9uLWxpc3AiLCBtb2RlOiAiY29tbW9ubGlzcCJ9LAogIHtuYW1lOiAiQ3lwaGVyIiwgbWltZTogImFwcGxpY2F0aW9uL3gtY3lwaGVyLXF1ZXJ5IiwgbW9kZTogImN5cGhlciJ9LAogIHtuYW1lOiAiQ1NTIiwgbWltZTogInRleHQvY3NzIiwgbW9kZTogImNzcyJ9LAogIHtuYW1lOiAiRCIsIG1pbWU6ICJ0ZXh0L3gtZCIsIG1vZGU6ICJkIn0sCiAge25hbWU6ICJkaWZmIiwgbWltZTogInRleHQveC1kaWZmIiwgbW9kZTogImRpZmYifSwKICB7bmFtZTogIkRURCIsIG1pbWU6ICJhcHBsaWNhdGlvbi94bWwtZHRkIiwgbW9kZTogImR0ZCJ9LAogIHtuYW1lOiAiRHlsYW4iLCBtaW1lOiAidGV4dC94LWR5bGFuIiwgbW9kZTogImR5bGFuIn0sCiAge25hbWU6ICJFQ0wiLCBtaW1lOiAidGV4dC94LWVjbCIsIG1vZGU6ICJlY2wifSwKICB7bmFtZTogIkVpZmZlbCIsIG1pbWU6ICJ0ZXh0L3gtZWlmZmVsIiwgbW9kZTogImVpZmZlbCJ9LAogIHtuYW1lOiAiRXJsYW5nIiwgbWltZTogInRleHQveC1lcmxhbmciLCBtb2RlOiAiZXJsYW5nIn0sCiAge25hbWU6ICJGb3J0cmFuIiwgbWltZTogInRleHQveC1mb3J0cmFuIiwgbW9kZTogImZvcnRyYW4ifSwKICB7bmFtZTogIkYjIiwgbWltZTogInRleHQveC1mc2hhcnAiLCBtb2RlOiAibWxsaWtlIn0sCiAge25hbWU6ICJHYXMiLCBtaW1lOiAidGV4dC94LWdhcyIsIG1vZGU6ICJnYXMifSwKICB7bmFtZTogIkdoZXJraW4iLCBtaW1lOiAidGV4dC94LWZlYXR1cmUiLCBtb2RlOiAiZ2hlcmtpbiJ9LAogIHtuYW1lOiAiR2l0SHViIEZsYXZvcmVkIE1hcmtkb3duIiwgbWltZTogInRleHQveC1nZm0iLCBtb2RlOiAiZ2ZtIn0sCiAge25hbWU6ICJHbyIsIG1pbWU6ICJ0ZXh0L3gtZ28iLCBtb2RlOiAiZ28ifSwKICB7bmFtZTogIkdyb292eSIsIG1pbWU6ICJ0ZXh0L3gtZ3Jvb3Z5IiwgbW9kZTogImdyb292eSJ9LAogIHtuYW1lOiAiSEFNTCIsIG1pbWU6ICJ0ZXh0L3gtaGFtbCIsIG1vZGU6ICJoYW1sIn0sCiAge25hbWU6ICJIYXNrZWxsIiwgbWltZTogInRleHQveC1oYXNrZWxsIiwgbW9kZTogImhhc2tlbGwifSwKICB7bmFtZTogIkhheGUiLCBtaW1lOiAidGV4dC94LWhheGUiLCBtb2RlOiAiaGF4ZSJ9LAogIHtuYW1lOiAiQVNQLk5FVCIsIG1pbWU6ICJhcHBsaWNhdGlvbi94LWFzcHgiLCBtb2RlOiAiaHRtbGVtYmVkZGVkIn0sCiAge25hbWU6ICJFbWJlZGRlZCBKYXZhc2NyaXB0IiwgbWltZTogImFwcGxpY2F0aW9uL3gtZWpzIiwgbW9kZTogImh0bWxlbWJlZGRlZCJ9LAogIHtuYW1lOiAiSmF2YVNlcnZlciBQYWdlcyIsIG1pbWU6ICJhcHBsaWNhdGlvbi94LWpzcCIsIG1vZGU6ICJodG1sZW1iZWRkZWQifSwKICB7bmFtZTogIkhUTUwiLCBtaW1lOiAidGV4dC9odG1sIiwgbW9kZTogImh0bWxtaXhlZCJ9LAogIHtuYW1lOiAiSFRUUCIsIG1pbWU6ICJtZXNzYWdlL2h0dHAiLCBtb2RlOiAiaHR0cCJ9LAogIHtuYW1lOiAiSmFkZSIsIG1pbWU6ICJ0ZXh0L3gtamFkZSIsIG1vZGU6ICJqYWRlIn0sCiAge25hbWU6ICJKYXZhU2NyaXB0IiwgbWltZTogInRleHQvamF2YXNjcmlwdCIsIG1vZGU6ICJqYXZhc2NyaXB0In0sCiAge25hbWU6ICJKYXZhU2NyaXB0IiwgbWltZTogImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiLCBtb2RlOiAiamF2YXNjcmlwdCJ9LAogIHtuYW1lOiAiSlNPTiIsIG1pbWU6ICJhcHBsaWNhdGlvbi94LWpzb24iLCBtb2RlOiAiamF2YXNjcmlwdCJ9LAogIHtuYW1lOiAiSlNPTiIsIG1pbWU6ICJhcHBsaWNhdGlvbi9qc29uIiwgbW9kZTogImphdmFzY3JpcHQifSwKICB7bmFtZTogIkpTT04tTEQiLCBtaW1lOiAiYXBwbGljYXRpb24vbGQranNvbiIsIG1vZGU6ICJqYXZhc2NyaXB0In0sCiAge25hbWU6ICJUeXBlU2NyaXB0IiwgbWltZTogImFwcGxpY2F0aW9uL3R5cGVzY3JpcHQiLCBtb2RlOiAiamF2YXNjcmlwdCJ9LAogIHtuYW1lOiAiSmluamEyIiwgbWltZTogbnVsbCwgbW9kZTogImppbmphMiJ9LAogIHtuYW1lOiAiSnVsaWEiLCBtaW1lOiAidGV4dC94LWp1bGlhIiwgbW9kZTogImp1bGlhIn0sCiAge25hbWU6ICJLb3RsaW4iLCBtaW1lOiAidGV4dC94LWtvdGxpbiIsIG1vZGU6ICJrb3RsaW4ifSwKICB7bmFtZTogIkxFU1MiLCBtaW1lOiAidGV4dC94LWxlc3MiLCBtb2RlOiAiY3NzIn0sCiAge25hbWU6ICJMaXZlU2NyaXB0IiwgbWltZTogInRleHQveC1saXZlc2NyaXB0IiwgbW9kZTogImxpdmVzY3JpcHQifSwKICB7bmFtZTogIkx1YSIsIG1pbWU6ICJ0ZXh0L3gtbHVhIiwgbW9kZTogImx1YSJ9LAogIHtuYW1lOiAiTWFya2Rvd24gKEdpdEh1Yi1mbGF2b3VyKSIsIG1pbWU6ICJ0ZXh0L3gtbWFya2Rvd24iLCBtb2RlOiAibWFya2Rvd24ifSwKICB7bmFtZTogIm1JUkMiLCBtaW1lOiAidGV4dC9taXJjIiwgbW9kZTogIm1pcmMifSwKICB7bmFtZTogIk5naW54IiwgbWltZTogInRleHQveC1uZ2lueC1jb25mIiwgbW9kZTogIm5naW54In0sCiAge25hbWU6ICJOVHJpcGxlcyIsIG1pbWU6ICJ0ZXh0L24tdHJpcGxlcyIsIG1vZGU6ICJudHJpcGxlcyJ9LAogIHtuYW1lOiAiT0NhbWwiLCBtaW1lOiAidGV4dC94LW9jYW1sIiwgbW9kZTogIm1sbGlrZSJ9LAogIHtuYW1lOiAiT2N0YXZlIiwgbWltZTogInRleHQveC1vY3RhdmUiLCBtb2RlOiAib2N0YXZlIn0sCiAge25hbWU6ICJQYXNjYWwiLCBtaW1lOiAidGV4dC94LXBhc2NhbCIsIG1vZGU6ICJwYXNjYWwifSwKICB7bmFtZTogIlBFRy5qcyIsIG1pbWU6IG51bGwsIG1vZGU6ICJwZWdqcyJ9LAogIHtuYW1lOiAiUGVybCIsIG1pbWU6ICJ0ZXh0L3gtcGVybCIsIG1vZGU6ICJwZXJsIn0sCiAge25hbWU6ICJQSFAiLCBtaW1lOiAidGV4dC94LXBocCIsIG1vZGU6ICJwaHAifSwKICB7bmFtZTogIlBIUChIVE1MKSIsIG1pbWU6ICJhcHBsaWNhdGlvbi94LWh0dHBkLXBocCIsIG1vZGU6ICJwaHAifSwKICB7bmFtZTogIlBpZyIsIG1pbWU6ICJ0ZXh0L3gtcGlnIiwgbW9kZTogInBpZyJ9LAogIHtuYW1lOiAiUGxhaW4gVGV4dCIsIG1pbWU6ICJ0ZXh0L3BsYWluIiwgbW9kZTogIm51bGwifSwKICB7bmFtZTogIlByb3BlcnRpZXMgZmlsZXMiLCBtaW1lOiAidGV4dC94LXByb3BlcnRpZXMiLCBtb2RlOiAicHJvcGVydGllcyJ9LAogIHtuYW1lOiAiUHl0aG9uIiwgbWltZTogInRleHQveC1weXRob24iLCBtb2RlOiAicHl0aG9uIn0sCiAge25hbWU6ICJQdXBwZXQiLCBtaW1lOiAidGV4dC94LXB1cHBldCIsIG1vZGU6ICJwdXBwZXQifSwKICB7bmFtZTogIkN5dGhvbiIsIG1pbWU6ICJ0ZXh0L3gtY3l0aG9uIiwgbW9kZTogInB5dGhvbiJ9LAogIHtuYW1lOiAiUiIsIG1pbWU6ICJ0ZXh0L3gtcnNyYyIsIG1vZGU6ICJyIn0sCiAge25hbWU6ICJyZVN0cnVjdHVyZWRUZXh0IiwgbWltZTogInRleHQveC1yc3QiLCBtb2RlOiAicnN0In0sCiAge25hbWU6ICJSdWJ5IiwgbWltZTogInRleHQveC1ydWJ5IiwgbW9kZTogInJ1YnkifSwKICB7bmFtZTogIlJ1c3QiLCBtaW1lOiAidGV4dC94LXJ1c3RzcmMiLCBtb2RlOiAicnVzdCJ9LAogIHtuYW1lOiAiU2FzcyIsIG1pbWU6ICJ0ZXh0L3gtc2FzcyIsIG1vZGU6ICJzYXNzIn0sCiAge25hbWU6ICJTY2hlbWUiLCBtaW1lOiAidGV4dC94LXNjaGVtZSIsIG1vZGU6ICJzY2hlbWUifSwKICB7bmFtZTogIlNDU1MiLCBtaW1lOiAidGV4dC94LXNjc3MiLCBtb2RlOiAiY3NzIn0sCiAge25hbWU6ICJTaGVsbCIsIG1pbWU6ICJ0ZXh0L3gtc2giLCBtb2RlOiAic2hlbGwifSwKICB7bmFtZTogIlNpZXZlIiwgbWltZTogImFwcGxpY2F0aW9uL3NpZXZlIiwgbW9kZTogInNpZXZlIn0sCiAge25hbWU6ICJTbWFsbHRhbGsiLCBtaW1lOiAidGV4dC94LXN0c3JjIiwgbW9kZTogInNtYWxsdGFsayJ9LAogIHtuYW1lOiAiU21hcnR5IiwgbWltZTogInRleHQveC1zbWFydHkiLCBtb2RlOiAic21hcnR5In0sCiAge25hbWU6ICJTbWFydHlNaXhlZCIsIG1pbWU6ICJ0ZXh0L3gtc21hcnR5IiwgbW9kZTogInNtYXJ0eW1peGVkIn0sCiAge25hbWU6ICJTb2xyIiwgbWltZTogInRleHQveC1zb2xyIiwgbW9kZTogInNvbHIifSwKICB7bmFtZTogIlNQQVJRTCIsIG1pbWU6ICJhcHBsaWNhdGlvbi94LXNwYXJxbC1xdWVyeSIsIG1vZGU6ICJzcGFycWwifSwKICB7bmFtZTogIlNRTCIsIG1pbWU6ICJ0ZXh0L3gtc3FsIiwgbW9kZTogInNxbCJ9LAogIHtuYW1lOiAiTWFyaWFEQiIsIG1pbWU6ICJ0ZXh0L3gtbWFyaWFkYiIsIG1vZGU6ICJzcWwifSwKICB7bmFtZTogInNUZVgiLCBtaW1lOiAidGV4dC94LXN0ZXgiLCBtb2RlOiAic3RleCJ9LAogIHtuYW1lOiAiTGFUZVgiLCBtaW1lOiAidGV4dC94LWxhdGV4IiwgbW9kZTogInN0ZXgifSwKICB7bmFtZTogIlN5c3RlbVZlcmlsb2ciLCBtaW1lOiAidGV4dC94LXN5c3RlbXZlcmlsb2ciLCBtb2RlOiAidmVyaWxvZyJ9LAogIHtuYW1lOiAiVGNsIiwgbWltZTogInRleHQveC10Y2wiLCBtb2RlOiAidGNsIn0sCiAge25hbWU6ICJUaWRkbHlXaWtpICIsIG1pbWU6ICJ0ZXh0L3gtdGlkZGx5d2lraSIsIG1vZGU6ICJ0aWRkbHl3aWtpIn0sCiAge25hbWU6ICJUaWtpIHdpa2kiLCBtaW1lOiAidGV4dC90aWtpIiwgbW9kZTogInRpa2kifSwKICB7bmFtZTogIlRPTUwiLCBtaW1lOiAidGV4dC94LXRvbWwiLCBtb2RlOiAidG9tbCJ9LAogIHtuYW1lOiAiVHVydGxlIiwgbWltZTogInRleHQvdHVydGxlIiwgbW9kZTogInR1cnRsZSJ9LAogIHtuYW1lOiAiVkIuTkVUIiwgbWltZTogInRleHQveC12YiIsIG1vZGU6ICJ2YiJ9LAogIHtuYW1lOiAiVkJTY3JpcHQiLCBtaW1lOiAidGV4dC92YnNjcmlwdCIsIG1vZGU6ICJ2YnNjcmlwdCJ9LAogIHtuYW1lOiAiVmVsb2NpdHkiLCBtaW1lOiAidGV4dC92ZWxvY2l0eSIsIG1vZGU6ICJ2ZWxvY2l0eSJ9LAogIHtuYW1lOiAiVmVyaWxvZyIsIG1pbWU6ICJ0ZXh0L3gtdmVyaWxvZyIsIG1vZGU6ICJ2ZXJpbG9nIn0sCiAge25hbWU6ICJYTUwiLCBtaW1lOiAiYXBwbGljYXRpb24veG1sIiwgbW9kZTogInhtbCJ9LAogIHtuYW1lOiAiWFF1ZXJ5IiwgbWltZTogImFwcGxpY2F0aW9uL3hxdWVyeSIsIG1vZGU6ICJ4cXVlcnkifSwKICB7bmFtZTogIllBTUwiLCBtaW1lOiAidGV4dC94LXlhbWwiLCBtb2RlOiAieWFtbCJ9LAogIHtuYW1lOiAiWjgwIiwgbWltZTogInRleHQveC16ODAiLCBtb2RlOiAiejgwIn0KXTsKCn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/mirc/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/mirc/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogbUlSQyBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi90aGVtZS90d2lsaWdodC5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0ibWlyYy5qcyI+PC9zY3JpcHQ+CjxzdHlsZT4uQ29kZU1pcnJvciB7Ym9yZGVyOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGltZyBpZD1sb2dvIHNyYz0iLi4vLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+TGFuZ3VhZ2UgbW9kZXM8L2E+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPm1JUkM8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPm1JUkMgbW9kZTwvaDI+Cjxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+CjtBS0EgTmljayBUcmFja2VyIGJ5IEZvcmRfTGF3bm1vd2VyIGlyYy5HZWVrU2hlZC5uZXQgI1NjcmlwdC1IZWxwCjsqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKjsKOyoqU3RhcnQgU2V0dXAKO0NoYW5nZSBKb2luRGlzcGxheSwgYmVsb3csIGZvciBPbiBKb2luIEFLQSBEaXNwbGF5LiBPbiA9IDEgLSBPZmYgPSAwCmFsaWFzIC1sIEpvaW5EaXNwbGF5IHsgcmV0dXJuIDEgfQo7Q2hhbmdlIE1heE5pY2tzLCBiZWxvdywgdG8gdGhlIG51bWJlciBvZiBuaWNrbmFtZXMgeW91IHdhbnQgdG8gc3RvcmUgZm9yIGVhY2ggaG9zdG1hc2suIEkgd291bGRuJ3QgZ28gb3ZlciA0MDAgd2l0aCB0aGlzIDsvCmFsaWFzIC1sIE1heE5pY2tzIHsgcmV0dXJuIDIwIH0KO0NoYW5nZSBBS0FMb2dvLCBiZWxvdywgVG8gdGhlIHRleHQgeW91IHdhbnQgZGlzcGxheWVkIGJlZm9yZSBlYWNoIEFLQSByZXN1bHQuCmFsaWFzIC1sIEFLQUxvZ28geyByZXR1cm4gAzA2ByADMDVBAzA2SwMwN0EgAzA2ByB9CjsqKkVuZCBTZXR1cAo7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKio7Ck9uICo6Sm9pbjojOiB7CiAgaWYgKCRuaWNrID09ICRtZSkgeyAudGltZXIgMSAxIGlhbHVwZGF0ZUNoZWNrICRjaGFuIH0KICBOaWNrTmFtZXNBZGQgJG5pY2sgJCsoJG5ldHdvcmssJHdpbGRzaXRlKQogIGlmICgkSm9pbkRpc3BsYXkpIHsgLnRpbWVyTmlja05hbWVzICQrICRuaWNrIDEgMiBOaWNrTmFtZXMuZGlzcGxheSAkbmljayAkY2hhbiAkbmV0d29yayAkd2lsZHNpdGUgfQp9Cm9uICo6TmljazogeyBOaWNrTmFtZXNBZGQgJG5ld25pY2sgJCsoJG5ldHdvcmssJHdpbGRzaXRlKSAkbmljayB9CmFsaWFzIC1sIE5pY2tOYW1lcy5kaXNwbGF5IHsKICBpZiAoJGdldHRvaygkaGdldChOaWNrTmFtZXMsJCsoJDMsJDQpKSwwLDEyNikgPiAxKSB7CiAgICBlY2hvIC1nICQyICRBS0FMb2dvICQrKAMwOSwkMSkgJEFLQUxvZ28gAzA3ICRtaWQoJHJlcGxhY2UoJGhnZXQoTmlja05hbWVzLCQrKCQzLCQ0KSksJGNocigxMjYpLCRjaHIoNDQpKSwyLC0xKQogIH0KfQphbGlhcyAtbCBOaWNrTmFtZXNBZGQgewogIGlmICgkaGdldChOaWNrTmFtZXMsJDIpKSB7CiAgICBpZiAoISRyZWdleCgkaGdldChOaWNrTmFtZXMsJDIpLC9+XFEgJCsgJHJlcGxhY2VjcygkMSxcRSxcRVxcRVxRKSAkKyBcRX4vaSkpIHsKICAgICAgaWYgKCRnZXR0b2soJGhnZXQoTmlja05hbWVzLCQyKSwwLDEyNikgPD0gJE1heE5pY2tzKSB7CiAgICAgICAgaGFkZCBOaWNrTmFtZXMgJDIgJCsoJGhnZXQoTmlja05hbWVzLCQyKSwkMSx+KQogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIGhhZGQgTmlja05hbWVzICQyICQrKCRtaWQoJGhnZXQoTmlja05hbWVzLCQyKSwkcG9zKCRoZ2V0KE5pY2tOYW1lcywkMiksfiwyKSksJDEsfikKICAgICAgfQogICAgfQogIH0KICBlbHNlIHsKICAgIGhhZGQgLW0gTmlja05hbWVzICQyICQrKH4sJDEsfiwkaWlmKCQzLCQrKCQzLH4pKSkKICB9Cn0KYWxpYXMgLWwgRml4LkFsbC5NaW5kVXNlciB7CiAgdmFyICVGaXguQ291bnQgPSAkaGZpbmQoTmlja05hbWVzLC9bXn5dK1swLTldezR9fi8sMCxyKS5kYXRhCiAgd2hpbGUgKCVGaXguQ291bnQpIHsKICAgIGlmICgkRml4Lk1pbmRVc2VyKCRoZ2V0KE5pY2tOYW1lcywkaGZpbmQoTmlja05hbWVzLC9bXn5dK1swLTldezR9fi8sJUZpeC5Db3VudCxyKS5kYXRhKSkpIHsKICAgICAgZWNobyAtYWcgUmVjb3JkICVGaXguQ291bnQgLSAkdjEgLSBXYXMgQ2xlYW5lZAogICAgICBoYWRkIE5pY2tOYW1lcyAkaGZpbmQoTmlja05hbWVzLC9bXn5dK1swLTldezR9fi8sJUZpeC5Db3VudCxyKS5kYXRhICR2MQogICAgfQogICAgZGVjICVGaXguQ291bnQKICB9Cn0KYWxpYXMgLWwgRml4Lk1pbmRVc2VyIHsgcmV0dXJuICRyZWdzdWJleCgkMSwvW15+XStbMC05XXs0fX4vZywkbnVsbCkgfQptZW51IG5pY2tsaXN0LHF1ZXJ5IHsKICAtCiAgLkFLQQogIC4uQ2hlY2sgJCQxOiB7CiAgICBpZiAoJGdldHRvaygkaGdldChOaWNrTmFtZXMsJCsoJG5ldHdvcmssJGFkZHJlc3MoJDEsMikpKSwwLDEyNikgPiAxKSB7CiAgICAgIE5pY2tOYW1lcy5kaXNwbGF5ICQxICRhY3RpdmUgJG5ldHdvcmsgJGFkZHJlc3MoJDEsMikKICAgIH0KICAgIGVsc2UgeyBlY2hvIC1hZyAkQUtBTG9nbyAkKygDMDksJDEpIAMwN2hhcyBub3QgYmVlbiBrbm93biBieSBhbnkgb3RoZXIgbmlja25hbWVzIHdoaWxlIEkgaGF2ZSBiZWVuIHdhdGNoaW5nLiB9CiAgfQogIC4uQ2xlYW51cCAkJDE6aGFkZCBOaWNrTmFtZXMgJCsoJG5ldHdvcmssJGFkZHJlc3MoJDEsMikpICRmaXgubWluZHVzZXIoJGhnZXQoTmlja05hbWVzLCQrKCRuZXR3b3JrLCRhZGRyZXNzKCQxLDIpKSkpCiAgLi5DbGVhciAkJDE6aGFkZCBOaWNrTmFtZXMgJCsoJG5ldHdvcmssJGFkZHJlc3MoJDEsMikpICQrKH4sJDEsfikKICAuLkFLQSBTZWFyY2ggRGlhbG9nOmRpYWxvZyAkaWlmKCRkaWFsb2coQUtBX1NlYXJjaCksLXYsLW0pIEFLQV9TZWFyY2ggQUtBX1NlYXJjaAogIC0KfQptZW51IHN0YXR1cyxjaGFubmVsIHsKICAtCiAgLkFLQQogIC4uQUtBIFNlYXJjaCBEaWFsb2c6ZGlhbG9nICRpaWYoJGRpYWxvZyhBS0FfU2VhcmNoKSwtdiwtbSkgQUtBX1NlYXJjaCBBS0FfU2VhcmNoCiAgLi5DbGVhbiBBbGwgUmVjb3JkczpGaXguQWxsLk1pbmR1c2VyCiAgLQp9CmRpYWxvZyBBS0FfU2VhcmNoIHsKICB0aXRsZSAiQUtBIFNlYXJjaCBFbmdpbmUiCiAgc2l6ZSAtMSAtMSAyMDYgMjIxCiAgb3B0aW9uIGRidQogIGVkaXQgIiIsIDEsIDggNSAxNDkgMTAsIGF1dG9ocwogIGJ1dHRvbiAiU2VhcmNoIiwgMiwgMTYzIDQgMzIgMTIKICByYWRpbyAiU2VhcmNoIEhvc3RNYXNrIiwgNCwgNjEgMjIgNTUgMTAKICByYWRpbyAiU2VhcmNoIE5pY2tuYW1lcyIsIDUsIDEyMyAyMiA1NiAxMAogIGxpc3QgNiwgOCAzOCAxOTAgMTY5LCBzb3J0IGV4dHNlbCB2c2JhcgogIGJ1dHRvbiAiQ2hlY2sgU2VsZWN0ZWQiLCA3LCA2NyAyMDYgNDAgMTIKICBidXR0b24gIkNsb3NlIiwgOCwgMTYwIDIwNiAzOCAxMiwgY2FuY2VsCiAgYm94ICJTZWFyY2ggVHlwZSIsIDMsIDExIDE3IDE4MyAxOAogIGJ1dHRvbiAiQ29weSB0byBDbGlwYm9hcmQiLCA5LCAxMTEgMjA2IDQ2IDEyCn0KT24gKjpEaWFsb2c6QWthX1NlYXJjaDppbml0Oio6IHsgZGlkIC1jICRkbmFtZSA1IH0KT24gKjpEaWFsb2c6QWthX1NlYXJjaDpTY2xpY2s6Miw3LDk6IHsKICBpZiAoJGRpZCA9PSAyKSAmJiAoJGRpZCgkZG5hbWUsMSkpIHsKICAgIGRpZCAtciAkZG5hbWUgNgogICAgdmFyICVzZWFyY2ggJCsoKiwkdjEsKiksICV0eXBlICRpaWYoJGRpZCgkZG5hbWUsNSkuc3RhdGUsZGF0YSxpdGVtKSwgJW1hdGNoZXMgPSAkaGZpbmQoTmlja05hbWVzLCVzZWFyY2gsMCx3KS4gWyAkKyBbICV0eXBlIF0gXQogICAgd2hpbGUgKCVtYXRjaGVzKSB7CiAgICAgIGRpZCAtYSAkZG5hbWUgNiAkaGZpbmQoTmlja05hbWVzLCVzZWFyY2gsJW1hdGNoZXMsdykuIFsgJCsgWyAldHlwZSBdIF0KICAgICAgZGVjICVtYXRjaGVzCiAgICB9CiAgICBkaWQgLWMgJGRuYW1lIDYgMQogIH0KICBlbHNlaWYgKCRkaWQgPT0gNykgJiYgKCRkaWQoJGRuYW1lLDYpLnNlbHRleHQpIHsgZWNobyAtZ2EgJEFLQUxvZ28gAzA3ICRtaWQoJHJlcGxhY2UoJGhnZXQoTmlja05hbWVzLCR2MSksJGNocigxMjYpLCRjaHIoNDQpKSwyLC0xKSB9CiAgZWxzZWlmICgkZGlkID09IDkpICYmICgkZGlkKCRkbmFtZSw2KS5zZWx0ZXh0KSB7IGNsaXBib2FyZCAkbWlkKCR2MSwkcG9zKCR2MSwqLDEpKSB9Cn0KT24gKjpTdGFydDp7CiAgaWYgKCEkaGdldChOaWNrTmFtZXMpKSB7IGhtYWtlIE5pY2tOYW1lcyAxMCB9CiAgaWYgKCRpc2ZpbGUoTmlja05hbWVzLmhzaCkpIHsgaGxvYWQgIE5pY2tOYW1lcyBOaWNrTmFtZXMuaHNoIH0KfQpPbiAqOkV4aXQ6IHsgaWYgKCRoZ2V0KE5pY2tOYW1lcykpIHsgaHNhdmUgTmlja05hbWVzIE5pY2tOYW1lcy5oc2ggfSB9Ck9uICo6RGlzY29ubmVjdDogeyBpZiAoJGhnZXQoTmlja05hbWVzKSkgeyBoc2F2ZSBOaWNrTmFtZXMgTmlja05hbWVzLmhzaCB9IH0KT24gKjpVbmxvYWQ6IHsgaGZyZWUgTmlja05hbWVzIH0KYWxpYXMgLWwgaWFsdXBkYXRlQ2hlY2sgewogIGluYyAteiAkKyglLGlhbHVwZGF0ZUNoZWNrLCRuZXR3b3JrKSAkY2FsYygkbmljaygkMSwwKSAvIDQpCiAgO0lmIHlvdXIgaWFsIGlzIGFscmVhZHkgYmVpbmcgdXBkYXRlZCBvbiBqb2luIC53aG8gJDEgb3V0LgogIDtJZiB5b3UgYXJlIHVzaW5nIC9uYW1lcyB0byB1cGRhdGUgaWFsIHlvdSB3aWxsIHN0aWxsIG5lZWQgdGhpcyBsaW5lLgogIC53aG8gJDEKfQpSYXcgMzUyOio6IHsKICBpZiAoJCgkKyglLGlhbHVwZGF0ZUNoZWNrLCRuZXR3b3JrKSwyKSkgaGFsdGRlZgogIE5pY2tOYW1lc0FkZCAkNiAkKygkbmV0d29yaywkYWRkcmVzcygkNiwyKSkKfQpSYXcgMzE1Oio6IHsKICBpZiAoJCgkKyglLGlhbHVwZGF0ZUNoZWNrLCRuZXR3b3JrKSwyKSkgaGFsdGRlZgp9Cgo8L3RleHRhcmVhPjwvZm9ybT4KICAgIDxzY3JpcHQ+CiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICAgICAgdGhlbWU6ICJ0d2lsaWdodCIsCiAgICAgICAgbGluZU51bWJlcnM6IHRydWUsCiAgICAgICAgbWF0Y2hCcmFja2V0czogdHJ1ZSwKICAgICAgICBpbmRlbnRVbml0OiA0LAogICAgICAgIG1vZGU6ICJ0ZXh0L21pcmMiCiAgICAgIH0pOwogICAgPC9zY3JpcHQ+CgogICAgPHA+PHN0cm9uZz5NSU1FIHR5cGVzIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPnRleHQvbWlyYzwvY29kZT4uPC9wPgoKICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/mirc/mirc.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovL21JUkMgbW9kZSBieSBGb3JkX0xhd25tb3dlciA6OiBCYXNlZCBvbiBWZWxvY2l0eSBtb2RlIGJ5IFN0ZXZlIE8nSGFyYQoKKGZ1bmN0aW9uKG1vZCkgewogIGlmICh0eXBlb2YgZXhwb3J0cyA9PSAib2JqZWN0IiAmJiB0eXBlb2YgbW9kdWxlID09ICJvYmplY3QiKSAvLyBDb21tb25KUwogICAgbW9kKHJlcXVpcmUoIi4uLy4uL2xpYi9jb2RlbWlycm9yIikpOwogIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kKSAvLyBBTUQKICAgIGRlZmluZShbIi4uLy4uL2xpYi9jb2RlbWlycm9yIl0sIG1vZCk7CiAgZWxzZSAvLyBQbGFpbiBicm93c2VyIGVudgogICAgbW9kKENvZGVNaXJyb3IpOwp9KShmdW5jdGlvbihDb2RlTWlycm9yKSB7CiJ1c2Ugc3RyaWN0IjsKCkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC9taXJjIiwgIm1pcmMiKTsKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJtaXJjIiwgZnVuY3Rpb24oKSB7CiAgZnVuY3Rpb24gcGFyc2VXb3JkcyhzdHIpIHsKICAgIHZhciBvYmogPSB7fSwgd29yZHMgPSBzdHIuc3BsaXQoIiAiKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgd29yZHMubGVuZ3RoOyArK2kpIG9ialt3b3Jkc1tpXV0gPSB0cnVlOwogICAgcmV0dXJuIG9iajsKICB9CiAgdmFyIHNwZWNpYWxzID0gcGFyc2VXb3JkcygiJCEgJCQgJCYgJD8gJCsgJGFib29rICRhYnMgJGFjdGl2ZSAkYWN0aXZlY2lkICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIiRhY3RpdmV3aWQgJGFkZHJlc3MgJGFkZHRvayAkYWdlbnQgJGFnZW50bmFtZSAkYWdlbnRzdGF0ICRhZ2VudHZlciAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICIkYWxpYXMgJGFuZCAkYW5pY2sgJGFuc2kybWlyYyAkYW9wICRhcHBhY3RpdmUgJGFwcHN0YXRlICRhc2MgJGFzY3RpbWUgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJGFzaW4gJGF0YW4gJGF2b2ljZSAkYXdheSAkYXdheW1zZyAkYXdheXRpbWUgJGJhbm1hc2sgJGJhc2UgJGJmaW5kICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIiRiaW5vZmYgJGJpdG9uICRibmljayAkYnZhciAkYnl0ZXMgJGNhbGMgJGNiICRjZCAkY2VpbCAkY2hhbiAkY2hhbm1vZGVzICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIiRjaGFudHlwZXMgJGNoYXQgJGNociAkY2lkICRjbGV2ZWwgJGNsaWNrICRjbWRib3ggJGNtZGxpbmUgJGNuaWNrICRjb2xvciAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICIkY29tICRjb21jYWxsICRjb21jaGFuICRjb21lcnIgJGNvbXBhY3QgJGNvbXByZXNzICRjb212YWwgJGNvcyAkY291bnQgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJGNyICRjcmMgJGNyZXEgJGNybGYgJGN0aW1lICRjdGltZXIgJGN0cmxlbnRlciAkZGF0ZSAkZGF5ICRkYXlsaWdodCAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICIkZGJ1aCAkZGJ1dyAkZGNjaWdub3JlICRkY2Nwb3J0ICRkZGUgJGRkZW5hbWUgJGRlYnVnICRkZWNvZGUgJGRlY29tcHJlc3MgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJGRlbHRvayAkZGV2ZW50ICRkaWFsb2cgJGRpZCAkZGlkcmVnICRkaWR0b2sgJGRpZHdtICRkaXNrICRkbGV2ZWwgJGRsbCAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICIkZGxsY2FsbCAkZG5hbWUgJGRucyAkZHVyYXRpb24gJGViZWVwcyAkZWRpdGJveCAkZW1haWxhZGRyICRlbmNvZGUgJGVycm9yICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIiRldmFsICRldmVudCAkZXhpc3QgJGZlb2YgJGZlcnIgJGZnZXRjICRmaWxlICRmaWxlbmFtZSAkZmlsdGVyZWQgJGZpbmRkaXIgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJGZpbmRkaXJuICRmaW5kZmlsZSAkZmluZGZpbGVuICRmaW5kdG9rICRmbGluZSAkZmxvb3IgJGZvcGVuICRmcmVhZCAkZnNlcnZlICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIiRmdWxsYWRkcmVzcyAkZnVsbGRhdGUgJGZ1bGxuYW1lICRmdWxsc2NyZWVuICRnZXQgJGdldGRpciAkZ2V0ZG90ICRnZXR0b2sgJGdtdCAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICIkZ3JvdXAgJGhhbHRlZCAkaGFzaCAkaGVpZ2h0ICRoZmluZCAkaGdldCAkaGlnaGxpZ2h0ICRobmljayAkaG90bGluZSAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICIkaG90bGluZXBvcyAkaWFsICRpYWxjaGFuICRpYmwgJGlkbGUgJGllbCAkaWZtYXRjaCAkaWdub3JlICRpaWYgJGlpbCAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICIkaW5lbGlwc2UgJGluaSAkaW5taWRpICRpbnBhc3RlICRpbnBvbHkgJGlucHV0ICRpbnJlY3QgJGlucm91bmRyZWN0ICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIiRpbnNvbmcgJGluc3RvayAkaW50ICRpbndhdmUgJGlwICRpc2FsaWFzICRpc2JpdCAkaXNkZGUgJGlzZGlyICRpc2ZpbGUgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJGlzaWQgJGlzbG93ZXIgJGlzdG9rICRpc3VwcGVyICRrZXljaGFyICRrZXlycHQgJGtleXZhbCAka25pY2sgJGxhY3RpdmUgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJGxhY3RpdmVjaWQgJGxhY3RpdmV3aWQgJGxlZnQgJGxlbiAkbGV2ZWwgJGxmICRsaW5lICRsaW5lcyAkbGluayAkbG9jayAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICIkbG9jayAkbG9ja2VkICRsb2cgJGxvZ3N0YW1wICRsb2dzdGFtcGZtdCAkbG9uZ2ZuICRsb25naXAgJGxvd2VyICRsdGltZXIgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJG1hZGRyZXNzICRtYXNrICRtYXRjaGtleSAkbWF0Y2h0b2sgJG1kNSAkbWUgJG1lbnUgJG1lbnViYXIgJG1lbnVjb250ZXh0ICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIiRtZW51dHlwZSAkbWlkICRtaWRkaXIgJG1pcmNkaXIgJG1pcmNleGUgJG1pcmNpbmkgJG1rbG9nZm4gJG1uaWNrICRtb2RlICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIiRtb2RlZmlyc3QgJG1vZGVsYXN0ICRtb2Rlc3BsICRtb3VzZSAkbXNmaWxlICRuZXR3b3JrICRuZXduaWNrICRuaWNrICRub2ZpbGUgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJG5vcGF0aCAkbm9xdCAkbm90ICRub3RhZ3MgJG5vdGlmeSAkbnVsbCAkbnVtZXJpYyAkbnVtb2sgJG9saW5lICRvbnBvbHkgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJG9wbmljayAkb3IgJG9yZCAkb3MgJHBhc3NpdmVkY2MgJHBpYyAkcGxheSAkcG5pY2sgJHBvcnQgJHBvcnRhYmxlICRwb3J0ZnJlZSAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICIkcG9zICRwcmVmaXggJHByb3AgJHByb3RlY3QgJHB1dHRvayAkcXQgJHF1ZXJ5ICRyYW5kICRyICRyYXdtc2cgJHJlYWQgJHJlYWRvbW8gIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJHJlYWRuICRyZWdleCAkcmVnbWwgJHJlZ3N1YiAkcmVnc3ViZXggJHJlbW92ZSAkcmVtdG9rICRyZXBsYWNlICRyZXBsYWNleCAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICIkcmVwdG9rICRyZXN1bHQgJHJnYiAkcmlnaHQgJHJvdW5kICRzY2lkICRzY29uICRzY3JpcHQgJHNjcmlwdGRpciAkc2NyaXB0bGluZSAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICIkc2RpciAkc2VuZCAkc2VydmVyICRzZXJ2ZXJpcCAkc2ZpbGUgJHNoYTEgJHNob3J0Zm4gJHNob3cgJHNpZ25hbCAkc2luICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIiRzaXRlICRzbGluZSAkc25pY2sgJHNuaWNrcyAkc25vdGlmeSAkc29jayAkc29ja2JyICRzb2NrZXJyICRzb2NrbmFtZSAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICIkc29ydHRvayAkc291bmQgJHNxcnQgJHNzbCAkc3JlcSAkc3NscmVhZHkgJHN0YXR1cyAkc3RyaXAgJHN0ciAkc3RyaXBwZWQgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJHN5bGUgJHN1Ym1lbnUgJHN3aXRjaGJhciAkdGFuICR0YXJnZXQgJHRpY2tzICR0aW1lICR0aW1lciAkdGltZXN0YW1wICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIiR0aW1lc3RhbXBmbXQgJHRpbWV6b25lICR0aXAgJHRpdGxlYmFyICR0b29sYmFyICR0cmVlYmFyICR0cnVzdCAkdWxldmVsICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIiR1bGlzdCAkdXBwZXIgJHVwdGltZSAkdXJsICR1c2VybW9kZSAkdjEgJHYyICR2YXIgJHZjbWQgJHZjbWRzdGF0ICR2Y21kdmVyICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIiR2ZXJzaW9uICR2bmljayAkdm9sICR3aWQgJHdpZHRoICR3aWxkc2l0ZSAkd2lsZHRvayAkd2luZG93ICR3cmFwICR4b3IiKTsKICB2YXIga2V5d29yZHMgPSBwYXJzZVdvcmRzKCJhYm9vayBhamludml0ZSBhbGlhcyBhbGluZSBhbWUgYW1zZyBhbmljayBhb3AgYXVzZXIgYXV0b2pvaW4gYXZvaWNlICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgImF3YXkgYmFja2dyb3VuZCBiYW4gYmNvcHkgYmVlcCBicmVhZCBicmVhayBicmVwbGFjZSBic2V0IGJ0cnVuYyBidW5zZXQgYndyaXRlICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgImNoYW5uZWwgY2xlYXIgY2xlYXJhbGwgY2xpbmUgY2xpcGJvYXJkIGNsb3NlIGNuaWNrIGNvbG9yIGNvbWNsb3NlIGNvbW9wZW4gIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tcmVnIGNvbnRpbnVlIGNvcHkgY3JlcSBjdGNwcmVwbHkgY3RjcHMgZGNjIGRjY3NlcnZlciBkZGUgZGRlc2VydmVyICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlYnVnIGRlYyBkZXNjcmliZSBkaWFsb2cgZGlkIGRpZHRvayBkaXNhYmxlIGRpc2Nvbm5lY3QgZGxldmVsIGRsaW5lIGRsbCAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkbnMgZHF3aW5kb3cgZHJhd2NvcHkgZHJhd2RvdCBkcmF3ZmlsbCBkcmF3bGluZSBkcmF3cGljIGRyYXdyZWN0IGRyYXdyZXBsYWNlICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgImRyYXdyb3QgZHJhd3NhdmUgZHJhd3Njcm9sbCBkcmF3dGV4dCBlYmVlcHMgZWNobyBlZGl0Ym94IGVtYWlsYWRkciBlbmFibGUgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXZlbnRzIGV4aXQgZmNsb3NlIGZpbHRlciBmaW5kdGV4dCBmaW5nZXIgZmlyZXdhbGwgZmxhc2ggZmxpc3QgZmxvb2QgZmx1c2ggIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmx1c2hpbmkgZm9udCBmb3BlbiBmc2VlayBmc2VuZCBmc2VydmUgZnVsbG5hbWUgZndyaXRlIGdoaWRlIGdsb2FkIGdtb3ZlICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgImdvcHRzIGdvdG8gZ3BsYXkgZ3BvaW50IGdxcmVxIGdyb3VwcyBnc2hvdyBnc2l6ZSBnc3RvcCBndGFsayBndW5sb2FkIGhhZGQgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGFsdCBoYWx0ZGVmIGhkZWMgaGRlbCBoZWxwIGhmcmVlIGhpbmMgaGxvYWQgaG1ha2UgaG9wIGhzYXZlIGlhbCBpYWxjbGVhciAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpYWxtYXJrIGlkZW50ZCBpZiBpZ25vcmUgaWxpbmUgaW5jIGludml0ZSBpdXNlciBqb2luIGtpY2sgbGluZXNlcCBsaW5rcyBsaXN0ICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvYWQgbG9hZGJ1ZiBsb2NhbGluZm8gbG9nIG1kaSBtZSBtZW51YmFyIG1rZGlyIG1uaWNrIG1vZGUgbXNnIG5pY2sgbm9vcCBub3RpY2UgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm90aWZ5IG9tc2cgb25vdGljZSBwYXJ0IHBhcnRhbGwgcGRjYyBwZXJmb3JtIHBsYXkgcGxheWN0cmwgcG9wIHByb3RlY3QgcHZvaWNlICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgInFtZSBxbXNnIHF1ZXJ5IHF1ZXJ5biBxdWl0IHJhdyByZWxvYWQgcmVtaW5pIHJlbW90ZSByZW1vdmUgcmVuYW1lIHJlbndpbiAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXNldGVycm9yIHJlc2V0aWRsZSByZXR1cm4gcmxldmVsIHJsaW5lIHJtZGlyIHJ1biBydXNlciBzYXZlIHNhdmVidWYgc2F2ZWluaSAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzYXkgc2NpZCBzY29uIHNlcnZlciBzZXQgc2hvd21pcmMgc2lnbmFtIHNsaW5lIHNvY2thY2NlcHQgc29ja2Nsb3NlIHNvY2tsaXN0ICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvY2tsaXN0ZW4gc29ja21hcmsgc29ja29wZW4gc29ja3BhdXNlIHNvY2tyZWFkIHNvY2tyZW5hbWUgc29ja3VkcCBzb2Nrd3JpdGUgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291bmQgc3BlYWsgc3BsYXkgc3JlcSBzdHJpcCBzd2l0Y2hiYXIgdGltZXIgdGltZXN0YW1wIHRpdGxlYmFyIHRuaWNrIHRva2VuaXplICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvb2xiYXIgdG9waWMgdHJheSB0cmVlYmFyIHVsaXN0IHVubG9hZCB1bnNldCB1bnNldGFsbCB1cGRhdGVubCB1cmwgdXdobyAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YXIgdmNhZGQgdmNtZCB2Y3JlbSB2b2wgd2hpbGUgd2hvaXMgd2luZG93IHdpbmhlbHAgd3JpdGUgd3JpdGVpbnQgaWYgaXNhbG51bSAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpc2FscGhhIGlzYW9wIGlzYXZvaWNlIGlzYmFuIGlzY2hhbiBpc2hvcCBpc2lnbm9yZSBpc2luIGlzaW5jcyBpc2xldHRlciBpc2xvd2VyICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgImlzbm90aWZ5IGlzbnVtIGlzb24gaXNvcCBpc3Byb3RlY3QgaXNyZWcgaXN1cHBlciBpc3ZvaWNlIGlzd20gaXN3bWNzICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgImVsc2VpZiBlbHNlIGdvdG8gbWVudSBuaWNrbGlzdCBzdGF0dXMgdGl0bGUgaWNvbiBzaXplIG9wdGlvbiB0ZXh0IGVkaXQgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnV0dG9uIGNoZWNrIHJhZGlvIGJveCBzY3JvbGwgbGlzdCBjb21ibyBsaW5rIHRhYiBpdGVtIik7CiAgdmFyIGZ1bmN0aW9ucyA9IHBhcnNlV29yZHMoImlmIGVsc2VpZiBlbHNlIGFuZCBub3Qgb3IgZXEgbmUgaW4gbmkgZm9yIGZvcmVhY2ggd2hpbGUgc3dpdGNoIik7CiAgdmFyIGlzT3BlcmF0b3JDaGFyID0gL1srXC0qJiU9PD4hP15cL1x8XS87CiAgZnVuY3Rpb24gY2hhaW4oc3RyZWFtLCBzdGF0ZSwgZikgewogICAgc3RhdGUudG9rZW5pemUgPSBmOwogICAgcmV0dXJuIGYoc3RyZWFtLCBzdGF0ZSk7CiAgfQogIGZ1bmN0aW9uIHRva2VuQmFzZShzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgYmVmb3JlUGFyYW1zID0gc3RhdGUuYmVmb3JlUGFyYW1zOwogICAgc3RhdGUuYmVmb3JlUGFyYW1zID0gZmFsc2U7CiAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpOwogICAgaWYgKC9bXFtcXXt9XChcKSxcLl0vLnRlc3QoY2gpKSB7CiAgICAgIGlmIChjaCA9PSAiKCIgJiYgYmVmb3JlUGFyYW1zKSBzdGF0ZS5pblBhcmFtcyA9IHRydWU7CiAgICAgIGVsc2UgaWYgKGNoID09ICIpIikgc3RhdGUuaW5QYXJhbXMgPSBmYWxzZTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBlbHNlIGlmICgvXGQvLnRlc3QoY2gpKSB7CiAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1x3XC5dLyk7CiAgICAgIHJldHVybiAibnVtYmVyIjsKICAgIH0KICAgIGVsc2UgaWYgKGNoID09ICJcXCIpIHsKICAgICAgc3RyZWFtLmVhdCgiXFwiKTsKICAgICAgc3RyZWFtLmVhdCgvLi8pOwogICAgICByZXR1cm4gIm51bWJlciI7CiAgICB9CiAgICBlbHNlIGlmIChjaCA9PSAiLyIgJiYgc3RyZWFtLmVhdCgiKiIpKSB7CiAgICAgIHJldHVybiBjaGFpbihzdHJlYW0sIHN0YXRlLCB0b2tlbkNvbW1lbnQpOwogICAgfQogICAgZWxzZSBpZiAoY2ggPT0gIjsiICYmIHN0cmVhbS5tYXRjaCgvICpcKCAqXCgvKSkgewogICAgICByZXR1cm4gY2hhaW4oc3RyZWFtLCBzdGF0ZSwgdG9rZW5VbnBhcnNlZCk7CiAgICB9CiAgICBlbHNlIGlmIChjaCA9PSAiOyIgJiYgIXN0YXRlLmluUGFyYW1zKSB7CiAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgcmV0dXJuICJjb21tZW50IjsKICAgIH0KICAgIGVsc2UgaWYgKGNoID09ICciJykgewogICAgICBzdHJlYW0uZWF0KC8iLyk7CiAgICAgIHJldHVybiAia2V5d29yZCI7CiAgICB9CiAgICBlbHNlIGlmIChjaCA9PSAiJCIpIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bJF9hLXowLTlBLVpcLjpdLyk7CiAgICAgIGlmIChzcGVjaWFscyAmJiBzcGVjaWFscy5wcm9wZXJ0eUlzRW51bWVyYWJsZShzdHJlYW0uY3VycmVudCgpLnRvTG93ZXJDYXNlKCkpKSB7CiAgICAgICAgcmV0dXJuICJrZXl3b3JkIjsKICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICBzdGF0ZS5iZWZvcmVQYXJhbXMgPSB0cnVlOwogICAgICAgIHJldHVybiAiYnVpbHRpbiI7CiAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYgKGNoID09ICIlIikgewogICAgICBzdHJlYW0uZWF0V2hpbGUoL1teLF5cc15cKF5cKV0vKTsKICAgICAgc3RhdGUuYmVmb3JlUGFyYW1zID0gdHJ1ZTsKICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgfQogICAgZWxzZSBpZiAoaXNPcGVyYXRvckNoYXIudGVzdChjaCkpIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKGlzT3BlcmF0b3JDaGFyKTsKICAgICAgcmV0dXJuICJvcGVyYXRvciI7CiAgICB9CiAgICBlbHNlIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXHdcJF97fV0vKTsKICAgICAgdmFyIHdvcmQgPSBzdHJlYW0uY3VycmVudCgpLnRvTG93ZXJDYXNlKCk7CiAgICAgIGlmIChrZXl3b3JkcyAmJiBrZXl3b3Jkcy5wcm9wZXJ0eUlzRW51bWVyYWJsZSh3b3JkKSkKICAgICAgICByZXR1cm4gImtleXdvcmQiOwogICAgICBpZiAoZnVuY3Rpb25zICYmIGZ1bmN0aW9ucy5wcm9wZXJ0eUlzRW51bWVyYWJsZSh3b3JkKSkgewogICAgICAgIHN0YXRlLmJlZm9yZVBhcmFtcyA9IHRydWU7CiAgICAgICAgcmV0dXJuICJrZXl3b3JkIjsKICAgICAgfQogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICB9CiAgZnVuY3Rpb24gdG9rZW5Db21tZW50KHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBtYXliZUVuZCA9IGZhbHNlLCBjaDsKICAgIHdoaWxlIChjaCA9IHN0cmVhbS5uZXh0KCkpIHsKICAgICAgaWYgKGNoID09ICIvIiAmJiBtYXliZUVuZCkgewogICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIG1heWJlRW5kID0gKGNoID09ICIqIik7CiAgICB9CiAgICByZXR1cm4gImNvbW1lbnQiOwogIH0KICBmdW5jdGlvbiB0b2tlblVucGFyc2VkKHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBtYXliZUVuZCA9IDAsIGNoOwogICAgd2hpbGUgKGNoID0gc3RyZWFtLm5leHQoKSkgewogICAgICBpZiAoY2ggPT0gIjsiICYmIG1heWJlRW5kID09IDIpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBpZiAoY2ggPT0gIikiKQogICAgICAgIG1heWJlRW5kKys7CiAgICAgIGVsc2UgaWYgKGNoICE9ICIgIikKICAgICAgICBtYXliZUVuZCA9IDA7CiAgICB9CiAgICByZXR1cm4gIm1ldGEiOwogIH0KICByZXR1cm4gewogICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgdG9rZW5pemU6IHRva2VuQmFzZSwKICAgICAgICBiZWZvcmVQYXJhbXM6IGZhbHNlLAogICAgICAgIGluUGFyYW1zOiBmYWxzZQogICAgICB9OwogICAgfSwKICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIGlmIChzdHJlYW0uZWF0U3BhY2UoKSkgcmV0dXJuIG51bGw7CiAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgIH0KICB9Owp9KTsKCn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/mllike/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/mllike/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogTUwtbGlrZSBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Li4vLi4vbGliL2NvZGVtaXJyb3IuY3NzPgo8c2NyaXB0IHNyYz0uLi8uLi9saWIvY29kZW1pcnJvci5qcz48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Li4vLi4vYWRkb24vZWRpdC9tYXRjaGJyYWNrZXRzLmpzPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz1tbGxpa2UuanM+PC9zY3JpcHQ+CjxzdHlsZSB0eXBlPXRleHQvY3NzPgogIC5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazt9Cjwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGltZyBpZD1sb2dvIHNyYz0iLi4vLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+TGFuZ3VhZ2UgbW9kZXM8L2E+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPk1MLWxpa2U8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPk9DYW1sIG1vZGU8L2gyPgoKCjx0ZXh0YXJlYSBpZD0ib2NhbWxDb2RlIj4KKCogU3VtbWluZyBhIGxpc3Qgb2YgaW50ZWdlcnMgKikKbGV0IHJlYyBzdW0geHMgPQogIG1hdGNoIHhzIHdpdGgKICAgIHwgW10gICAgICAgLSZndDsgMAogICAgfCB4IDo6IHhzJyAtJmd0OyB4ICsgc3VtIHhzJwoKKCogUXVpY2tzb3J0ICopCmxldCByZWMgcXNvcnQgPSBmdW5jdGlvbgogICB8IFtdIC0mZ3Q7IFtdCiAgIHwgcGl2b3QgOjogcmVzdCAtJmd0OwogICAgICAgbGV0IGlzX2xlc3MgeCA9IHggJmx0OyBwaXZvdCBpbgogICAgICAgbGV0IGxlZnQsIHJpZ2h0ID0gTGlzdC5wYXJ0aXRpb24gaXNfbGVzcyByZXN0IGluCiAgICAgICBxc29ydCBsZWZ0IEAgW3Bpdm90XSBAIHFzb3J0IHJpZ2h0CgooKiBGaWJvbmFjY2kgU2VxdWVuY2UgKikKbGV0IHJlYyBmaWJfYXV4IG4gYSBiID0KICBtYXRjaCBuIHdpdGgKICB8IDAgLSZndDsgYQogIHwgXyAtJmd0OyBmaWJfYXV4IChuIC0gMSkgKGEgKyBiKSBhCmxldCBmaWIgbiA9IGZpYl9hdXggbiAwIDEKCigqIEJpcnRoZGF5IHBhcmFkb3ggKikKbGV0IHllYXJfc2l6ZSA9IDM2NS4KCmxldCByZWMgYmlydGhkYXlfcGFyYWRveCBwcm9iIHBlb3BsZSA9CiAgICBsZXQgcHJvYicgPSAoeWVhcl9zaXplIC0uIGZsb2F0IHBlb3BsZSkgLy4geWVhcl9zaXplICouIHByb2IgIGluCiAgICBpZiBwcm9iJyAmbHQ7IDAuNSB0aGVuCiAgICAgICAgUHJpbnRmLnByaW50ZiAiYW5zd2VyID0gJWRcbiIgKHBlb3BsZSsxKQogICAgZWxzZQogICAgICAgIGJpcnRoZGF5X3BhcmFkb3ggcHJvYicgKHBlb3BsZSsxKSA7OwoKYmlydGhkYXlfcGFyYWRveCAxLjAgMQoKKCogQ2h1cmNoIG51bWVyYWxzICopCmxldCB6ZXJvIGYgeCA9IHgKbGV0IHN1Y2MgbiBmIHggPSBmIChuIGYgeCkKbGV0IG9uZSA9IHN1Y2MgemVybwpsZXQgdHdvID0gc3VjYyAoc3VjYyB6ZXJvKQpsZXQgYWRkIG4xIG4yIGYgeCA9IG4xIGYgKG4yIGYgeCkKbGV0IHRvX3N0cmluZyBuID0gbiAoZnVuIGsgLSZndDsgIlMiIF4gaykgIjAiCmxldCBfID0gdG9fc3RyaW5nIChhZGQgKHN1Y2MgdHdvKSB0d28pCgooKiBFbGVtZW50YXJ5IGZ1bmN0aW9ucyAqKQpsZXQgc3F1YXJlIHggPSB4ICogeDs7CmxldCByZWMgZmFjdCB4ID0KICBpZiB4ICZsdDs9IDEgdGhlbiAxIGVsc2UgeCAqIGZhY3QgKHggLSAxKTs7CgooKiBBdXRvbWF0aWMgbWVtb3J5IG1hbmFnZW1lbnQgKikKbGV0IGwgPSAxIDo6IDIgOjogMyA6OiBbXTs7ClsxOyAyOyAzXTs7CjUgOjogbDs7CgooKiBQb2x5bW9ycGhpc206IHNvcnRpbmcgbGlzdHMgKikKbGV0IHJlYyBzb3J0ID0gZnVuY3Rpb24KICB8IFtdIC0mZ3Q7IFtdCiAgfCB4IDo6IGwgLSZndDsgaW5zZXJ0IHggKHNvcnQgbCkKCmFuZCBpbnNlcnQgZWxlbSA9IGZ1bmN0aW9uCiAgfCBbXSAtJmd0OyBbZWxlbV0KICB8IHggOjogbCAtJmd0OwogICAgICBpZiBlbGVtICZsdDsgeCB0aGVuIGVsZW0gOjogeCA6OiBsIGVsc2UgeCA6OiBpbnNlcnQgZWxlbSBsOzsKCigqIEltcGVyYXRpdmUgZmVhdHVyZXMgKikKbGV0IGFkZF9wb2x5bm9tIHAxIHAyID0KICBsZXQgbjEgPSBBcnJheS5sZW5ndGggcDEKICBhbmQgbjIgPSBBcnJheS5sZW5ndGggcDIgaW4KICBsZXQgcmVzdWx0ID0gQXJyYXkuY3JlYXRlIChtYXggbjEgbjIpIDAgaW4KICBmb3IgaSA9IDAgdG8gbjEgLSAxIGRvIHJlc3VsdC4oaSkgJmx0Oy0gcDEuKGkpIGRvbmU7CiAgZm9yIGkgPSAwIHRvIG4yIC0gMSBkbyByZXN1bHQuKGkpICZsdDstIHJlc3VsdC4oaSkgKyBwMi4oaSkgZG9uZTsKICByZXN1bHQ7OwphZGRfcG9seW5vbSBbfCAxOyAyIHxdIFt8IDE7IDI7IDMgfF07OwoKKCogV2UgbWF5IHJlZGVmaW5lIGZhY3QgdXNpbmcgYSByZWZlcmVuY2UgY2VsbCBhbmQgYSBmb3IgbG9vcCAqKQpsZXQgZmFjdCBuID0KICBsZXQgcmVzdWx0ID0gcmVmIDEgaW4KICBmb3IgaSA9IDIgdG8gbiBkbwogICAgcmVzdWx0IDo9IGkgKiAhcmVzdWx0CiAgIGRvbmU7CiAgICFyZXN1bHQ7OwpmYWN0IDU7OwoKKCogVHJpYW5nbGUgKGdyYXBoaWNzKSAqKQpsZXQgKCkgPQogIGlnbm9yZSggR2x1dC5pbml0IFN5cy5hcmd2ICk7CiAgR2x1dC5pbml0RGlzcGxheU1vZGUgfmRvdWJsZV9idWZmZXI6dHJ1ZSAoKTsKICBpZ25vcmUgKEdsdXQuY3JlYXRlV2luZG93IH50aXRsZToiT3BlbkdMIERlbW8iKTsKICBsZXQgYW5nbGUgdCA9IDEwLiAqLiB0ICouIHQgaW4KICBsZXQgcmVuZGVyICgpID0KICAgIEdsQ2xlYXIuY2xlYXIgWyBgY29sb3IgXTsKICAgIEdsTWF0LmxvYWRfaWRlbnRpdHkgKCk7CiAgICBHbE1hdC5yb3RhdGUgfmFuZ2xlOiAoYW5nbGUgKFN5cy50aW1lICgpKSkgfno6MS4gKCk7CiAgICBHbERyYXcuYmVnaW5zIGB0cmlhbmdsZXM7CiAgICBMaXN0Lml0ZXIgR2xEcmF3LnZlcnRleDIgWy0xLiwgLTEuOyAwLiwgMS47IDEuLCAtMS5dOwogICAgR2xEcmF3LmVuZHMgKCk7CiAgICBHbHV0LnN3YXBCdWZmZXJzICgpIGluCiAgR2xNYXQubW9kZSBgbW9kZWx2aWV3OwogIEdsdXQuZGlzcGxheUZ1bmMgfmNiOnJlbmRlcjsKICBHbHV0LmlkbGVGdW5jIH5jYjooU29tZSBHbHV0LnBvc3RSZWRpc3BsYXkpOwogIEdsdXQubWFpbkxvb3AgKCkKCigqIEEgSHVuZHJlZCBMaW5lcyBvZiBDYW1sIC0gaHR0cDovL2NhbWwuaW5yaWEuZnIvYWJvdXQvdGFzdGUuZW4uaHRtbCAqKQooKiBPQ2FtbCBwYWdlIG9uIFdpa2lwZWRpYSAtIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvT0NhbWwgKikKPC90ZXh0YXJlYT4KCjxoMj5GIyBtb2RlPC9oMj4KPHRleHRhcmVhIGlkPSJmc2hhcnBDb2RlIj4KbW9kdWxlIENvZGVNaXJyb3IuRlNoYXJwCgpsZXQgcmVjIGZpYiA9IGZ1bmN0aW9uCiAgICB8IDAgLT4gMAogICAgfCAxIC0+IDEKICAgIHwgbiAtPiBmaWIgKG4gLSAxKSArIGZpYiAobiAtIDIpCgp0eXBlIFBvaW50ID0KICAgIHsKICAgICAgICB4IDogaW50CiAgICAgICAgeSA6IGludAogICAgfQoKdHlwZSBDb2xvciA9CiAgICB8IFJlZAogICAgfCBHcmVlbgogICAgfCBCbHVlCgpbMCAuLiAxMF0KfD4gTGlzdC5tYXAgKCgrKSAyKQp8PiBMaXN0LmZvbGQgKGZ1biB4IHkgLT4geCArIHkpIDAKfD4gcHJpbnRmICIlaSIKPC90ZXh0YXJlYT4KCgo8c2NyaXB0PgogIHZhciBvY2FtbEVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdvY2FtbENvZGUnKSwgewogICAgbW9kZTogJ3RleHQveC1vY2FtbCcsCiAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgIG1hdGNoQnJhY2tldHM6IHRydWUKICB9KTsKCiAgdmFyIGZzaGFycEVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdmc2hhcnBDb2RlJyksIHsKICAgIG1vZGU6ICd0ZXh0L3gtZnNoYXJwJywKICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgbWF0Y2hCcmFja2V0czogdHJ1ZQogIH0pOwo8L3NjcmlwdD4KCjxwPjxzdHJvbmc+TUlNRSB0eXBlcyBkZWZpbmVkOjwvc3Ryb25nPiA8Y29kZT50ZXh0L3gtb2NhbWw8L2NvZGU+IChPQ2FtbCkgYW5kIDxjb2RlPnRleHQveC1mc2hhcnA8L2NvZGU+IChGIykuPC9wPgo8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/mllike/mllike.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCdtbGxpa2UnLCBmdW5jdGlvbihfY29uZmlnLCBwYXJzZXJDb25maWcpIHsKICB2YXIgd29yZHMgPSB7CiAgICAnbGV0JzogJ2tleXdvcmQnLAogICAgJ3JlYyc6ICdrZXl3b3JkJywKICAgICdpbic6ICdrZXl3b3JkJywKICAgICdvZic6ICdrZXl3b3JkJywKICAgICdhbmQnOiAna2V5d29yZCcsCiAgICAnaWYnOiAna2V5d29yZCcsCiAgICAndGhlbic6ICdrZXl3b3JkJywKICAgICdlbHNlJzogJ2tleXdvcmQnLAogICAgJ2Zvcic6ICdrZXl3b3JkJywKICAgICd0byc6ICdrZXl3b3JkJywKICAgICd3aGlsZSc6ICdrZXl3b3JkJywKICAgICdkbyc6ICdrZXl3b3JkJywKICAgICdkb25lJzogJ2tleXdvcmQnLAogICAgJ2Z1bic6ICdrZXl3b3JkJywKICAgICdmdW5jdGlvbic6ICdrZXl3b3JkJywKICAgICd2YWwnOiAna2V5d29yZCcsCiAgICAndHlwZSc6ICdrZXl3b3JkJywKICAgICdtdXRhYmxlJzogJ2tleXdvcmQnLAogICAgJ21hdGNoJzogJ2tleXdvcmQnLAogICAgJ3dpdGgnOiAna2V5d29yZCcsCiAgICAndHJ5JzogJ2tleXdvcmQnLAogICAgJ29wZW4nOiAnYnVpbHRpbicsCiAgICAnaWdub3JlJzogJ2J1aWx0aW4nLAogICAgJ2JlZ2luJzogJ2tleXdvcmQnLAogICAgJ2VuZCc6ICdrZXl3b3JkJwogIH07CgogIHZhciBleHRyYVdvcmRzID0gcGFyc2VyQ29uZmlnLmV4dHJhV29yZHMgfHwge307CiAgZm9yICh2YXIgcHJvcCBpbiBleHRyYVdvcmRzKSB7CiAgICBpZiAoZXh0cmFXb3Jkcy5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgewogICAgICB3b3Jkc1twcm9wXSA9IHBhcnNlckNvbmZpZy5leHRyYVdvcmRzW3Byb3BdOwogICAgfQogIH0KCiAgZnVuY3Rpb24gdG9rZW5CYXNlKHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBjaCA9IHN0cmVhbS5uZXh0KCk7CgogICAgaWYgKGNoID09PSAnIicpIHsKICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlblN0cmluZzsKICAgICAgcmV0dXJuIHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgfQogICAgaWYgKGNoID09PSAnKCcpIHsKICAgICAgaWYgKHN0cmVhbS5lYXQoJyonKSkgewogICAgICAgIHN0YXRlLmNvbW1lbnRMZXZlbCsrOwogICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5Db21tZW50OwogICAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgICAgfQogICAgfQogICAgaWYgKGNoID09PSAnficpIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKC9cdy8pOwogICAgICByZXR1cm4gJ3ZhcmlhYmxlLTInOwogICAgfQogICAgaWYgKGNoID09PSAnYCcpIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKC9cdy8pOwogICAgICByZXR1cm4gJ3F1b3RlJzsKICAgIH0KICAgIGlmIChjaCA9PT0gJy8nICYmIHBhcnNlckNvbmZpZy5zbGFzaENvbW1lbnRzICYmIHN0cmVhbS5lYXQoJy8nKSkgewogICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICAgIHJldHVybiAnY29tbWVudCc7CiAgICB9CiAgICBpZiAoL1xkLy50ZXN0KGNoKSkgewogICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcZF0vKTsKICAgICAgaWYgKHN0cmVhbS5lYXQoJy4nKSkgewogICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1xkXS8pOwogICAgICB9CiAgICAgIHJldHVybiAnbnVtYmVyJzsKICAgIH0KICAgIGlmICggL1srXC0qJiU9PD4hP3xdLy50ZXN0KGNoKSkgewogICAgICByZXR1cm4gJ29wZXJhdG9yJzsKICAgIH0KICAgIHN0cmVhbS5lYXRXaGlsZSgvXHcvKTsKICAgIHZhciBjdXIgPSBzdHJlYW0uY3VycmVudCgpOwogICAgcmV0dXJuIHdvcmRzW2N1cl0gfHwgJ3ZhcmlhYmxlJzsKICB9CgogIGZ1bmN0aW9uIHRva2VuU3RyaW5nKHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBuZXh0LCBlbmQgPSBmYWxzZSwgZXNjYXBlZCA9IGZhbHNlOwogICAgd2hpbGUgKChuZXh0ID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkgewogICAgICBpZiAobmV4dCA9PT0gJyInICYmICFlc2NhcGVkKSB7CiAgICAgICAgZW5kID0gdHJ1ZTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBlc2NhcGVkID0gIWVzY2FwZWQgJiYgbmV4dCA9PT0gJ1xcJzsKICAgIH0KICAgIGlmIChlbmQgJiYgIWVzY2FwZWQpIHsKICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICB9CiAgICByZXR1cm4gJ3N0cmluZyc7CiAgfTsKCiAgZnVuY3Rpb24gdG9rZW5Db21tZW50KHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBwcmV2LCBuZXh0OwogICAgd2hpbGUoc3RhdGUuY29tbWVudExldmVsID4gMCAmJiAobmV4dCA9IHN0cmVhbS5uZXh0KCkpICE9IG51bGwpIHsKICAgICAgaWYgKHByZXYgPT09ICcoJyAmJiBuZXh0ID09PSAnKicpIHN0YXRlLmNvbW1lbnRMZXZlbCsrOwogICAgICBpZiAocHJldiA9PT0gJyonICYmIG5leHQgPT09ICcpJykgc3RhdGUuY29tbWVudExldmVsLS07CiAgICAgIHByZXYgPSBuZXh0OwogICAgfQogICAgaWYgKHN0YXRlLmNvbW1lbnRMZXZlbCA8PSAwKSB7CiAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlOwogICAgfQogICAgcmV0dXJuICdjb21tZW50JzsKICB9CgogIHJldHVybiB7CiAgICBzdGFydFN0YXRlOiBmdW5jdGlvbigpIHtyZXR1cm4ge3Rva2VuaXplOiB0b2tlbkJhc2UsIGNvbW1lbnRMZXZlbDogMH07fSwKICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIGlmIChzdHJlYW0uZWF0U3BhY2UoKSkgcmV0dXJuIG51bGw7CiAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgIH0sCgogICAgYmxvY2tDb21tZW50U3RhcnQ6ICIoKiIsCiAgICBibG9ja0NvbW1lbnRFbmQ6ICIqKSIsCiAgICBsaW5lQ29tbWVudDogcGFyc2VyQ29uZmlnLnNsYXNoQ29tbWVudHMgPyAiLy8iIDogbnVsbAogIH07Cn0pOwoKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCd0ZXh0L3gtb2NhbWwnLCB7CiAgbmFtZTogJ21sbGlrZScsCiAgZXh0cmFXb3JkczogewogICAgJ3N1Y2MnOiAna2V5d29yZCcsCiAgICAndHJhY2UnOiAnYnVpbHRpbicsCiAgICAnZXhpdCc6ICdidWlsdGluJywKICAgICdwcmludF9zdHJpbmcnOiAnYnVpbHRpbicsCiAgICAncHJpbnRfZW5kbGluZSc6ICdidWlsdGluJywKICAgICd0cnVlJzogJ2F0b20nLAogICAgJ2ZhbHNlJzogJ2F0b20nLAogICAgJ3JhaXNlJzogJ2tleXdvcmQnCiAgfQp9KTsKCkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgndGV4dC94LWZzaGFycCcsIHsKICBuYW1lOiAnbWxsaWtlJywKICBleHRyYVdvcmRzOiB7CiAgICAnYWJzdHJhY3QnOiAna2V5d29yZCcsCiAgICAnYXMnOiAna2V5d29yZCcsCiAgICAnYXNzZXJ0JzogJ2tleXdvcmQnLAogICAgJ2Jhc2UnOiAna2V5d29yZCcsCiAgICAnY2xhc3MnOiAna2V5d29yZCcsCiAgICAnZGVmYXVsdCc6ICdrZXl3b3JkJywKICAgICdkZWxlZ2F0ZSc6ICdrZXl3b3JkJywKICAgICdkb3duY2FzdCc6ICdrZXl3b3JkJywKICAgICdkb3dudG8nOiAna2V5d29yZCcsCiAgICAnZWxpZic6ICdrZXl3b3JkJywKICAgICdleGNlcHRpb24nOiAna2V5d29yZCcsCiAgICAnZXh0ZXJuJzogJ2tleXdvcmQnLAogICAgJ2ZpbmFsbHknOiAna2V5d29yZCcsCiAgICAnZ2xvYmFsJzogJ2tleXdvcmQnLAogICAgJ2luaGVyaXQnOiAna2V5d29yZCcsCiAgICAnaW5saW5lJzogJ2tleXdvcmQnLAogICAgJ2ludGVyZmFjZSc6ICdrZXl3b3JkJywKICAgICdpbnRlcm5hbCc6ICdrZXl3b3JkJywKICAgICdsYXp5JzogJ2tleXdvcmQnLAogICAgJ2xldCEnOiAna2V5d29yZCcsCiAgICAnbWVtYmVyJyA6ICdrZXl3b3JkJywKICAgICdtb2R1bGUnOiAna2V5d29yZCcsCiAgICAnbmFtZXNwYWNlJzogJ2tleXdvcmQnLAogICAgJ25ldyc6ICdrZXl3b3JkJywKICAgICdudWxsJzogJ2tleXdvcmQnLAogICAgJ292ZXJyaWRlJzogJ2tleXdvcmQnLAogICAgJ3ByaXZhdGUnOiAna2V5d29yZCcsCiAgICAncHVibGljJzogJ2tleXdvcmQnLAogICAgJ3JldHVybic6ICdrZXl3b3JkJywKICAgICdyZXR1cm4hJzogJ2tleXdvcmQnLAogICAgJ3NlbGVjdCc6ICdrZXl3b3JkJywKICAgICdzdGF0aWMnOiAna2V5d29yZCcsCiAgICAnc3RydWN0JzogJ2tleXdvcmQnLAogICAgJ3VwY2FzdCc6ICdrZXl3b3JkJywKICAgICd1c2UnOiAna2V5d29yZCcsCiAgICAndXNlISc6ICdrZXl3b3JkJywKICAgICd2YWwnOiAna2V5d29yZCcsCiAgICAnd2hlbic6ICdrZXl3b3JkJywKICAgICd5aWVsZCc6ICdrZXl3b3JkJywKICAgICd5aWVsZCEnOiAna2V5d29yZCcsCgogICAgJ0xpc3QnOiAnYnVpbHRpbicsCiAgICAnU2VxJzogJ2J1aWx0aW4nLAogICAgJ01hcCc6ICdidWlsdGluJywKICAgICdTZXQnOiAnYnVpbHRpbicsCiAgICAnaW50JzogJ2J1aWx0aW4nLAogICAgJ3N0cmluZyc6ICdidWlsdGluJywKICAgICdyYWlzZSc6ICdidWlsdGluJywKICAgICdmYWlsd2l0aCc6ICdidWlsdGluJywKICAgICdub3QnOiAnYnVpbHRpbicsCiAgICAndHJ1ZSc6ICdidWlsdGluJywKICAgICdmYWxzZSc6ICdidWlsdGluJwogIH0sCiAgc2xhc2hDb21tZW50czogdHJ1ZQp9KTsKCn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/nginx/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/nginx/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogTkdJTlggbW9kZTwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uLy4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxzY3JpcHQgc3JjPSIuLi8uLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJuZ2lueC5qcyI+PC9zY3JpcHQ+CjxzdHlsZT4uQ29kZU1pcnJvciB7YmFja2dyb3VuZDogI2Y4ZjhmODt9PC9zdHlsZT4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KICA8L2hlYWQ+CgogIDxzdHlsZT4KICAgIGJvZHkgewogICAgICBtYXJnaW46IDBlbSBhdXRvOwogICAgfQoKICAgIC5Db2RlTWlycm9yLCAuQ29kZU1pcnJvci1zY3JvbGwgewogICAgICBoZWlnaHQ6IDYwMHB4OwogICAgfQogIDwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGltZyBpZD1sb2dvIHNyYz0iLi4vLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+TGFuZ3VhZ2UgbW9kZXM8L2E+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPk5HSU5YPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5OR0lOWCBtb2RlPC9oMj4KPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIiBzdHlsZT0iaGVpZ2h0OiA4MDBweDsiPgpzZXJ2ZXIgewogIGxpc3RlbiAxNzMuMjU1LjIxOS4yMzU6ODA7CiAgc2VydmVyX25hbWUgd2Vic2l0ZS5jb20uYXU7CiAgcmV3cml0ZSAvICRzY2hlbWU6Ly93d3cuJGhvc3QkcmVxdWVzdF91cmkgcGVybWFuZW50OyAjIyBGb3JjaWJseSBwcmVwZW5kIGEgd3d3Cn0KCnNlcnZlciB7CiAgbGlzdGVuIDE3My4yNTUuMjE5LjIzNTo0NDM7CiAgc2VydmVyX25hbWUgd2Vic2l0ZS5jb20uYXU7CiAgcmV3cml0ZSAvICRzY2hlbWU6Ly93d3cuJGhvc3QkcmVxdWVzdF91cmkgcGVybWFuZW50OyAjIyBGb3JjaWJseSBwcmVwZW5kIGEgd3d3Cn0KCnNlcnZlciB7CgogIGxpc3RlbiAgICAgIDE3My4yNTUuMjE5LjIzNTo4MDsKICBzZXJ2ZXJfbmFtZSB3d3cud2Vic2l0ZS5jb20uYXU7CgoKCiAgcm9vdCAgICAgICAgL2RhdGEvd3d3OwogIGluZGV4ICAgICAgIGluZGV4Lmh0bWwgaW5kZXgucGhwOwoKICBsb2NhdGlvbiAvIHsKICAgIGluZGV4IGluZGV4Lmh0bWwgaW5kZXgucGhwOyAgICAgIyMgQWxsb3cgYSBzdGF0aWMgaHRtbCBmaWxlIHRvIGJlIHNob3duIGZpcnN0CiAgICB0cnlfZmlsZXMgJHVyaSAkdXJpLyBAaGFuZGxlcjsgICMjIElmIG1pc3NpbmcgcGFzcyB0aGUgVVJJIHRvIE1hZ2VudG8ncyBmcm9udCBoYW5kbGVyCiAgICBleHBpcmVzIDMwZDsgICAgICAgICAgICAgICAgICAgICMjIEFzc3VtZSBhbGwgZmlsZXMgYXJlIGNhY2hhYmxlCiAgfQoKICAjIyBUaGVzZSBsb2NhdGlvbnMgd291bGQgYmUgaGlkZGVuIGJ5IC5odGFjY2VzcyBub3JtYWxseQogIGxvY2F0aW9uIC9hcHAvICAgICAgICAgICAgICAgIHsgZGVueSBhbGw7IH0KICBsb2NhdGlvbiAvaW5jbHVkZXMvICAgICAgICAgICB7IGRlbnkgYWxsOyB9CiAgbG9jYXRpb24gL2xpYi8gICAgICAgICAgICAgICAgeyBkZW55IGFsbDsgfQogIGxvY2F0aW9uIC9tZWRpYS9kb3dubG9hZGFibGUvIHsgZGVueSBhbGw7IH0KICBsb2NhdGlvbiAvcGtnaW5mby8gICAgICAgICAgICB7IGRlbnkgYWxsOyB9CiAgbG9jYXRpb24gL3JlcG9ydC9jb25maWcueG1sICAgeyBkZW55IGFsbDsgfQogIGxvY2F0aW9uIC92YXIvICAgICAgICAgICAgICAgIHsgZGVueSBhbGw7IH0KCiAgbG9jYXRpb24gL3Zhci9leHBvcnQvIHsgIyMgQWxsb3cgYWRtaW5zIG9ubHkgdG8gdmlldyBleHBvcnQgZm9sZGVyCiAgICBhdXRoX2Jhc2ljICAgICAgICAgICAiUmVzdHJpY3RlZCI7ICMjIE1lc3NhZ2Ugc2hvd24gaW4gbG9naW4gd2luZG93CiAgICBhdXRoX2Jhc2ljX3VzZXJfZmlsZSAvcnMvcGFzc3dvcmRzL3Rlc3RmaWxlOyAjIyBTZWUgL2V0Yy9uZ2lueC9odHBhc3N3b3JkCiAgICBhdXRvaW5kZXggICAgICAgICAgICBvbjsKICB9CgogIGxvY2F0aW9uICAvLiB7ICMjIERpc2FibGUgLmh0YWNjZXNzIGFuZCBvdGhlciBoaWRkZW4gZmlsZXMKICAgIHJldHVybiA0MDQ7CiAgfQoKICBsb2NhdGlvbiBAaGFuZGxlciB7ICMjIE1hZ2VudG8gdXNlcyBhIGNvbW1vbiBmcm9udCBoYW5kbGVyCiAgICByZXdyaXRlIC8gL2luZGV4LnBocDsKICB9CgogIGxvY2F0aW9uIH4gLnBocC8geyAjIyBGb3J3YXJkIHBhdGhzIGxpa2UgL2pzL2luZGV4LnBocC94LmpzIHRvIHJlbGV2YW50IGhhbmRsZXIKICAgIHJld3JpdGUgXi8oLioucGhwKS8gLyQxIGxhc3Q7CiAgfQoKICBsb2NhdGlvbiB+IFwucGhwJCB7CiAgICBpZiAoIS1lICRyZXF1ZXN0X2ZpbGVuYW1lKSB7IHJld3JpdGUgLyAvaW5kZXgucGhwIGxhc3Q7IH0gIyMgQ2F0Y2ggNDA0cyB0aGF0IHRyeV9maWxlcyBtaXNzCgogICAgZmFzdGNnaV9wYXNzICAgMTI3LjAuMC4xOjkwMDA7CiAgICBmYXN0Y2dpX2luZGV4ICBpbmRleC5waHA7CiAgICBmYXN0Y2dpX3BhcmFtIFBBVEhfSU5GTyAkZmFzdGNnaV9zY3JpcHRfbmFtZTsKICAgIGZhc3RjZ2lfcGFyYW0gIFNDUklQVF9GSUxFTkFNRSAkZG9jdW1lbnRfcm9vdCRmYXN0Y2dpX3NjcmlwdF9uYW1lOwogICAgaW5jbHVkZSAgICAgICAgL3JzL2NvbmZzL25naW54L2Zhc3RjZ2lfcGFyYW1zOwogIH0KCn0KCgpzZXJ2ZXIgewoKICBsaXN0ZW4gICAgICAgICAgICAgIDE3My4yNTUuMjE5LjIzNTo0NDM7CiAgc2VydmVyX25hbWUgICAgICAgICB3ZWJzaXRlLmNvbS5hdSB3d3cud2Vic2l0ZS5jb20uYXU7CgogIHJvb3QgICAvZGF0YS93d3c7CiAgaW5kZXggaW5kZXguaHRtbCBpbmRleC5waHA7CgogIHNzbCAgICAgICAgICAgICAgICAgb247CiAgc3NsX2NlcnRpZmljYXRlICAgICAvcnMvc3NsL3NzbC5jcnQ7CiAgc3NsX2NlcnRpZmljYXRlX2tleSAvcnMvc3NsL3NzbC5rZXk7CgogIHNzbF9zZXNzaW9uX3RpbWVvdXQgIDVtOwoKICBzc2xfcHJvdG9jb2xzICBTU0x2MiBTU0x2MyBUTFN2MTsKICBzc2xfY2lwaGVycyAgQUxMOiFBREg6IUVYUE9SVDU2OlJDNCtSU0E6K0hJR0g6K01FRElVTTorTE9XOitTU0x2MjorRVhQOwogIHNzbF9wcmVmZXJfc2VydmVyX2NpcGhlcnMgICBvbjsKCgoKICBsb2NhdGlvbiAvIHsKICAgIGluZGV4IGluZGV4Lmh0bWwgaW5kZXgucGhwOyAjIyBBbGxvdyBhIHN0YXRpYyBodG1sIGZpbGUgdG8gYmUgc2hvd24gZmlyc3QKICAgIHRyeV9maWxlcyAkdXJpICR1cmkvIEBoYW5kbGVyOyAjIyBJZiBtaXNzaW5nIHBhc3MgdGhlIFVSSSB0byBNYWdlbnRvJ3MgZnJvbnQgaGFuZGxlcgogICAgZXhwaXJlcyAzMGQ7ICMjIEFzc3VtZSBhbGwgZmlsZXMgYXJlIGNhY2hhYmxlCiAgfQoKICAjIyBUaGVzZSBsb2NhdGlvbnMgd291bGQgYmUgaGlkZGVuIGJ5IC5odGFjY2VzcyBub3JtYWxseQogIGxvY2F0aW9uIC9hcHAvICAgICAgICAgICAgICAgIHsgZGVueSBhbGw7IH0KICBsb2NhdGlvbiAvaW5jbHVkZXMvICAgICAgICAgICB7IGRlbnkgYWxsOyB9CiAgbG9jYXRpb24gL2xpYi8gICAgICAgICAgICAgICAgeyBkZW55IGFsbDsgfQogIGxvY2F0aW9uIC9tZWRpYS9kb3dubG9hZGFibGUvIHsgZGVueSBhbGw7IH0KICBsb2NhdGlvbiAvcGtnaW5mby8gICAgICAgICAgICB7IGRlbnkgYWxsOyB9CiAgbG9jYXRpb24gL3JlcG9ydC9jb25maWcueG1sICAgeyBkZW55IGFsbDsgfQogIGxvY2F0aW9uIC92YXIvICAgICAgICAgICAgICAgIHsgZGVueSBhbGw7IH0KCiAgbG9jYXRpb24gL3Zhci9leHBvcnQvIHsgIyMgQWxsb3cgYWRtaW5zIG9ubHkgdG8gdmlldyBleHBvcnQgZm9sZGVyCiAgICBhdXRoX2Jhc2ljICAgICAgICAgICAiUmVzdHJpY3RlZCI7ICMjIE1lc3NhZ2Ugc2hvd24gaW4gbG9naW4gd2luZG93CiAgICBhdXRoX2Jhc2ljX3VzZXJfZmlsZSBodHBhc3N3ZDsgIyMgU2VlIC9ldGMvbmdpbngvaHRwYXNzd29yZAogICAgYXV0b2luZGV4ICAgICAgICAgICAgb247CiAgfQoKICBsb2NhdGlvbiAgLy4geyAjIyBEaXNhYmxlIC5odGFjY2VzcyBhbmQgb3RoZXIgaGlkZGVuIGZpbGVzCiAgICByZXR1cm4gNDA0OwogIH0KCiAgbG9jYXRpb24gQGhhbmRsZXIgeyAjIyBNYWdlbnRvIHVzZXMgYSBjb21tb24gZnJvbnQgaGFuZGxlcgogICAgcmV3cml0ZSAvIC9pbmRleC5waHA7CiAgfQoKICBsb2NhdGlvbiB+IC5waHAvIHsgIyMgRm9yd2FyZCBwYXRocyBsaWtlIC9qcy9pbmRleC5waHAveC5qcyB0byByZWxldmFudCBoYW5kbGVyCiAgICByZXdyaXRlIF4vKC4qLnBocCkvIC8kMSBsYXN0OwogIH0KCiAgbG9jYXRpb24gfiAucGhwJCB7ICMjIEV4ZWN1dGUgUEhQIHNjcmlwdHMKICAgIGlmICghLWUgJHJlcXVlc3RfZmlsZW5hbWUpIHsgcmV3cml0ZSAgL2luZGV4LnBocCBsYXN0OyB9ICMjIENhdGNoIDQwNHMgdGhhdCB0cnlfZmlsZXMgbWlzcwoKICAgIGZhc3RjZ2lfcGFzcyAxMjcuMC4wLjE6OTAwMDsKICAgIGZhc3RjZ2lfaW5kZXggIGluZGV4LnBocDsKICAgIGZhc3RjZ2lfcGFyYW0gUEFUSF9JTkZPICRmYXN0Y2dpX3NjcmlwdF9uYW1lOwogICAgZmFzdGNnaV9wYXJhbSAgU0NSSVBUX0ZJTEVOQU1FICRkb2N1bWVudF9yb290JGZhc3RjZ2lfc2NyaXB0X25hbWU7CiAgICBpbmNsdWRlICAgICAgICAvcnMvY29uZnMvbmdpbngvZmFzdGNnaV9wYXJhbXM7CgogICAgZmFzdGNnaV9wYXJhbSBIVFRQUyBvbjsKICB9Cgp9CjwvdGV4dGFyZWE+PC9mb3JtPgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHt9KTsKICAgIDwvc2NyaXB0PgoKICAgIDxwPjxzdHJvbmc+TUlNRSB0eXBlcyBkZWZpbmVkOjwvc3Ryb25nPiA8Y29kZT50ZXh0L25naW54PC9jb2RlPi48L3A+CgogIDwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/nginx/nginx.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJuZ2lueCIsIGZ1bmN0aW9uKGNvbmZpZykgewoKICBmdW5jdGlvbiB3b3JkcyhzdHIpIHsKICAgIHZhciBvYmogPSB7fSwgd29yZHMgPSBzdHIuc3BsaXQoIiAiKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgd29yZHMubGVuZ3RoOyArK2kpIG9ialt3b3Jkc1tpXV0gPSB0cnVlOwogICAgcmV0dXJuIG9iajsKICB9CgogIHZhciBrZXl3b3JkcyA9IHdvcmRzKAogICAgLyogbmd4RGlyZWN0aXZlQ29udHJvbCAqLyAiYnJlYWsgcmV0dXJuIHJld3JpdGUgc2V0IiArCiAgICAvKiBuZ3hEaXJlY3RpdmUgKi8gIiBhY2NlcHRfbXV0ZXggYWNjZXB0X211dGV4X2RlbGF5IGFjY2Vzc19sb2cgYWRkX2FmdGVyX2JvZHkgYWRkX2JlZm9yZV9ib2R5IGFkZF9oZWFkZXIgYWRkaXRpb25fdHlwZXMgYWlvIGFsaWFzIGFsbG93IGFuY2llbnRfYnJvd3NlciBhbmNpZW50X2Jyb3dzZXJfdmFsdWUgYXV0aF9iYXNpYyBhdXRoX2Jhc2ljX3VzZXJfZmlsZSBhdXRoX2h0dHAgYXV0aF9odHRwX2hlYWRlciBhdXRoX2h0dHBfdGltZW91dCBhdXRvaW5kZXggYXV0b2luZGV4X2V4YWN0X3NpemUgYXV0b2luZGV4X2xvY2FsdGltZSBjaGFyc2V0IGNoYXJzZXRfdHlwZXMgY2xpZW50X2JvZHlfYnVmZmVyX3NpemUgY2xpZW50X2JvZHlfaW5fZmlsZV9vbmx5IGNsaWVudF9ib2R5X2luX3NpbmdsZV9idWZmZXIgY2xpZW50X2JvZHlfdGVtcF9wYXRoIGNsaWVudF9ib2R5X3RpbWVvdXQgY2xpZW50X2hlYWRlcl9idWZmZXJfc2l6ZSBjbGllbnRfaGVhZGVyX3RpbWVvdXQgY2xpZW50X21heF9ib2R5X3NpemUgY29ubmVjdGlvbl9wb29sX3NpemUgY3JlYXRlX2Z1bGxfcHV0X3BhdGggZGFlbW9uIGRhdl9hY2Nlc3MgZGF2X21ldGhvZHMgZGVidWdfY29ubmVjdGlvbiBkZWJ1Z19wb2ludHMgZGVmYXVsdF90eXBlIGRlZ3JhZGF0aW9uIGRlZ3JhZGUgZGVueSBkZXZwb2xsX2NoYW5nZXMgZGV2cG9sbF9ldmVudHMgZGlyZWN0aW8gZGlyZWN0aW9fYWxpZ25tZW50IGVtcHR5X2dpZiBlbnYgZXBvbGxfZXZlbnRzIGVycm9yX2xvZyBldmVudHBvcnRfZXZlbnRzIGV4cGlyZXMgZmFzdGNnaV9iaW5kIGZhc3RjZ2lfYnVmZmVyX3NpemUgZmFzdGNnaV9idWZmZXJzIGZhc3RjZ2lfYnVzeV9idWZmZXJzX3NpemUgZmFzdGNnaV9jYWNoZSBmYXN0Y2dpX2NhY2hlX2tleSBmYXN0Y2dpX2NhY2hlX21ldGhvZHMgZmFzdGNnaV9jYWNoZV9taW5fdXNlcyBmYXN0Y2dpX2NhY2hlX3BhdGggZmFzdGNnaV9jYWNoZV91c2Vfc3RhbGUgZmFzdGNnaV9jYWNoZV92YWxpZCBmYXN0Y2dpX2NhdGNoX3N0ZGVyciBmYXN0Y2dpX2Nvbm5lY3RfdGltZW91dCBmYXN0Y2dpX2hpZGVfaGVhZGVyIGZhc3RjZ2lfaWdub3JlX2NsaWVudF9hYm9ydCBmYXN0Y2dpX2lnbm9yZV9oZWFkZXJzIGZhc3RjZ2lfaW5kZXggZmFzdGNnaV9pbnRlcmNlcHRfZXJyb3JzIGZhc3RjZ2lfbWF4X3RlbXBfZmlsZV9zaXplIGZhc3RjZ2lfbmV4dF91cHN0cmVhbSBmYXN0Y2dpX3BhcmFtIGZhc3RjZ2lfcGFzc19oZWFkZXIgZmFzdGNnaV9wYXNzX3JlcXVlc3RfYm9keSBmYXN0Y2dpX3Bhc3NfcmVxdWVzdF9oZWFkZXJzIGZhc3RjZ2lfcmVhZF90aW1lb3V0IGZhc3RjZ2lfc2VuZF9sb3dhdCBmYXN0Y2dpX3NlbmRfdGltZW91dCBmYXN0Y2dpX3NwbGl0X3BhdGhfaW5mbyBmYXN0Y2dpX3N0b3JlIGZhc3RjZ2lfc3RvcmVfYWNjZXNzIGZhc3RjZ2lfdGVtcF9maWxlX3dyaXRlX3NpemUgZmFzdGNnaV90ZW1wX3BhdGggZmFzdGNnaV91cHN0cmVhbV9mYWlsX3RpbWVvdXQgZmFzdGNnaV91cHN0cmVhbV9tYXhfZmFpbHMgZmx2IGdlb2lwX2NpdHkgZ2VvaXBfY291bnRyeSBnb29nbGVfcGVyZnRvb2xzX3Byb2ZpbGVzIGd6aXAgZ3ppcF9idWZmZXJzIGd6aXBfY29tcF9sZXZlbCBnemlwX2Rpc2FibGUgZ3ppcF9oYXNoIGd6aXBfaHR0cF92ZXJzaW9uIGd6aXBfbWluX2xlbmd0aCBnemlwX25vX2J1ZmZlciBnemlwX3Byb3hpZWQgZ3ppcF9zdGF0aWMgZ3ppcF90eXBlcyBnemlwX3ZhcnkgZ3ppcF93aW5kb3cgaWZfbW9kaWZpZWRfc2luY2UgaWdub3JlX2ludmFsaWRfaGVhZGVycyBpbWFnZV9maWx0ZXIgaW1hZ2VfZmlsdGVyX2J1ZmZlciBpbWFnZV9maWx0ZXJfanBlZ19xdWFsaXR5IGltYWdlX2ZpbHRlcl90cmFuc3BhcmVuY3kgaW1hcF9hdXRoIGltYXBfY2FwYWJpbGl0aWVzIGltYXBfY2xpZW50X2J1ZmZlciBpbmRleCBpcF9oYXNoIGtlZXBhbGl2ZV9yZXF1ZXN0cyBrZWVwYWxpdmVfdGltZW91dCBrcXVldWVfY2hhbmdlcyBrcXVldWVfZXZlbnRzIGxhcmdlX2NsaWVudF9oZWFkZXJfYnVmZmVycyBsaW1pdF9jb25uIGxpbWl0X2Nvbm5fbG9nX2xldmVsIGxpbWl0X3JhdGUgbGltaXRfcmF0ZV9hZnRlciBsaW1pdF9yZXEgbGltaXRfcmVxX2xvZ19sZXZlbCBsaW1pdF9yZXFfem9uZSBsaW1pdF96b25lIGxpbmdlcmluZ190aW1lIGxpbmdlcmluZ190aW1lb3V0IGxvY2tfZmlsZSBsb2dfZm9ybWF0IGxvZ19ub3RfZm91bmQgbG9nX3N1YnJlcXVlc3QgbWFwX2hhc2hfYnVja2V0X3NpemUgbWFwX2hhc2hfbWF4X3NpemUgbWFzdGVyX3Byb2Nlc3MgbWVtY2FjaGVkX2JpbmQgbWVtY2FjaGVkX2J1ZmZlcl9zaXplIG1lbWNhY2hlZF9jb25uZWN0X3RpbWVvdXQgbWVtY2FjaGVkX25leHRfdXBzdHJlYW0gbWVtY2FjaGVkX3JlYWRfdGltZW91dCBtZW1jYWNoZWRfc2VuZF90aW1lb3V0IG1lbWNhY2hlZF91cHN0cmVhbV9mYWlsX3RpbWVvdXQgbWVtY2FjaGVkX3Vwc3RyZWFtX21heF9mYWlscyBtZXJnZV9zbGFzaGVzIG1pbl9kZWxldGVfZGVwdGggbW9kZXJuX2Jyb3dzZXIgbW9kZXJuX2Jyb3dzZXJfdmFsdWUgbXNpZV9wYWRkaW5nIG1zaWVfcmVmcmVzaCBtdWx0aV9hY2NlcHQgb3Blbl9maWxlX2NhY2hlIG9wZW5fZmlsZV9jYWNoZV9lcnJvcnMgb3Blbl9maWxlX2NhY2hlX2V2ZW50cyBvcGVuX2ZpbGVfY2FjaGVfbWluX3VzZXMgb3Blbl9maWxlX2NhY2hlX3ZhbGlkIG9wZW5fbG9nX2ZpbGVfY2FjaGUgb3V0cHV0X2J1ZmZlcnMgb3ZlcnJpZGVfY2hhcnNldCBwZXJsIHBlcmxfbW9kdWxlcyBwZXJsX3JlcXVpcmUgcGVybF9zZXQgcGlkIHBvcDNfYXV0aCBwb3AzX2NhcGFiaWxpdGllcyBwb3J0X2luX3JlZGlyZWN0IHBvc3Rwb25lX2d6aXBwaW5nIHBvc3Rwb25lX291dHB1dCBwcm90b2NvbCBwcm94eSBwcm94eV9iaW5kIHByb3h5X2J1ZmZlciBwcm94eV9idWZmZXJfc2l6ZSBwcm94eV9idWZmZXJpbmcgcHJveHlfYnVmZmVycyBwcm94eV9idXN5X2J1ZmZlcnNfc2l6ZSBwcm94eV9jYWNoZSBwcm94eV9jYWNoZV9rZXkgcHJveHlfY2FjaGVfbWV0aG9kcyBwcm94eV9jYWNoZV9taW5fdXNlcyBwcm94eV9jYWNoZV9wYXRoIHByb3h5X2NhY2hlX3VzZV9zdGFsZSBwcm94eV9jYWNoZV92YWxpZCBwcm94eV9jb25uZWN0X3RpbWVvdXQgcHJveHlfaGVhZGVyc19oYXNoX2J1Y2tldF9zaXplIHByb3h5X2hlYWRlcnNfaGFzaF9tYXhfc2l6ZSBwcm94eV9oaWRlX2hlYWRlciBwcm94eV9pZ25vcmVfY2xpZW50X2Fib3J0IHByb3h5X2lnbm9yZV9oZWFkZXJzIHByb3h5X2ludGVyY2VwdF9lcnJvcnMgcHJveHlfbWF4X3RlbXBfZmlsZV9zaXplIHByb3h5X21ldGhvZCBwcm94eV9uZXh0X3Vwc3RyZWFtIHByb3h5X3Bhc3NfZXJyb3JfbWVzc2FnZSBwcm94eV9wYXNzX2hlYWRlciBwcm94eV9wYXNzX3JlcXVlc3RfYm9keSBwcm94eV9wYXNzX3JlcXVlc3RfaGVhZGVycyBwcm94eV9yZWFkX3RpbWVvdXQgcHJveHlfcmVkaXJlY3QgcHJveHlfc2VuZF9sb3dhdCBwcm94eV9zZW5kX3RpbWVvdXQgcHJveHlfc2V0X2JvZHkgcHJveHlfc2V0X2hlYWRlciBwcm94eV9zc2xfc2Vzc2lvbl9yZXVzZSBwcm94eV9zdG9yZSBwcm94eV9zdG9yZV9hY2Nlc3MgcHJveHlfdGVtcF9maWxlX3dyaXRlX3NpemUgcHJveHlfdGVtcF9wYXRoIHByb3h5X3RpbWVvdXQgcHJveHlfdXBzdHJlYW1fZmFpbF90aW1lb3V0IHByb3h5X3Vwc3RyZWFtX21heF9mYWlscyByYW5kb21faW5kZXggcmVhZF9haGVhZCByZWFsX2lwX2hlYWRlciByZWN1cnNpdmVfZXJyb3JfcGFnZXMgcmVxdWVzdF9wb29sX3NpemUgcmVzZXRfdGltZWRvdXRfY29ubmVjdGlvbiByZXNvbHZlciByZXNvbHZlcl90aW1lb3V0IHJld3JpdGVfbG9nIHJ0c2lnX292ZXJmbG93X2V2ZW50cyBydHNpZ19vdmVyZmxvd190ZXN0IHJ0c2lnX292ZXJmbG93X3RocmVzaG9sZCBydHNpZ19zaWdubyBzYXRpc2Z5IHNlY3VyZV9saW5rX3NlY3JldCBzZW5kX2xvd2F0IHNlbmRfdGltZW91dCBzZW5kZmlsZSBzZW5kZmlsZV9tYXhfY2h1bmsgc2VydmVyX25hbWVfaW5fcmVkaXJlY3Qgc2VydmVyX25hbWVzX2hhc2hfYnVja2V0X3NpemUgc2VydmVyX25hbWVzX2hhc2hfbWF4X3NpemUgc2VydmVyX3Rva2VucyBzZXRfcmVhbF9pcF9mcm9tIHNtdHBfYXV0aCBzbXRwX2NhcGFiaWxpdGllcyBzbXRwX2NsaWVudF9idWZmZXIgc210cF9ncmVldGluZ19kZWxheSBzb19rZWVwYWxpdmUgc291cmNlX2NoYXJzZXQgc3NpIHNzaV9pZ25vcmVfcmVjeWNsZWRfYnVmZmVycyBzc2lfbWluX2ZpbGVfY2h1bmsgc3NpX3NpbGVudF9lcnJvcnMgc3NpX3R5cGVzIHNzaV92YWx1ZV9sZW5ndGggc3NsIHNzbF9jZXJ0aWZpY2F0ZSBzc2xfY2VydGlmaWNhdGVfa2V5IHNzbF9jaXBoZXJzIHNzbF9jbGllbnRfY2VydGlmaWNhdGUgc3NsX2NybCBzc2xfZGhwYXJhbSBzc2xfZW5naW5lIHNzbF9wcmVmZXJfc2VydmVyX2NpcGhlcnMgc3NsX3Byb3RvY29scyBzc2xfc2Vzc2lvbl9jYWNoZSBzc2xfc2Vzc2lvbl90aW1lb3V0IHNzbF92ZXJpZnlfY2xpZW50IHNzbF92ZXJpZnlfZGVwdGggc3RhcnR0bHMgc3R1Yl9zdGF0dXMgc3ViX2ZpbHRlciBzdWJfZmlsdGVyX29uY2Ugc3ViX2ZpbHRlcl90eXBlcyB0Y3Bfbm9kZWxheSB0Y3Bfbm9wdXNoIHRocmVhZF9zdGFja19zaXplIHRpbWVvdXQgdGltZXJfcmVzb2x1dGlvbiB0eXBlc19oYXNoX2J1Y2tldF9zaXplIHR5cGVzX2hhc2hfbWF4X3NpemUgdW5kZXJzY29yZXNfaW5faGVhZGVycyB1bmluaXRpYWxpemVkX3ZhcmlhYmxlX3dhcm4gdXNlIHVzZXIgdXNlcmlkIHVzZXJpZF9kb21haW4gdXNlcmlkX2V4cGlyZXMgdXNlcmlkX21hcmsgdXNlcmlkX25hbWUgdXNlcmlkX3AzcCB1c2VyaWRfcGF0aCB1c2VyaWRfc2VydmljZSB2YWxpZF9yZWZlcmVycyB2YXJpYWJsZXNfaGFzaF9idWNrZXRfc2l6ZSB2YXJpYWJsZXNfaGFzaF9tYXhfc2l6ZSB3b3JrZXJfY29ubmVjdGlvbnMgd29ya2VyX2NwdV9hZmZpbml0eSB3b3JrZXJfcHJpb3JpdHkgd29ya2VyX3Byb2Nlc3NlcyB3b3JrZXJfcmxpbWl0X2NvcmUgd29ya2VyX3JsaW1pdF9ub2ZpbGUgd29ya2VyX3JsaW1pdF9zaWdwZW5kaW5nIHdvcmtlcl90aHJlYWRzIHdvcmtpbmdfZGlyZWN0b3J5IHhjbGllbnQgeG1sX2VudGl0aWVzIHhzbHRfc3R5bGVzaGVldCB4c2x0X3R5cGVzZHJld0BsaTIyOS0yMyIKICAgICk7CgogIHZhciBrZXl3b3Jkc19ibG9jayA9IHdvcmRzKAogICAgLyogbmd4RGlyZWN0aXZlQmxvY2sgKi8gImh0dHAgbWFpbCBldmVudHMgc2VydmVyIHR5cGVzIGxvY2F0aW9uIHVwc3RyZWFtIGNoYXJzZXRfbWFwIGxpbWl0X2V4Y2VwdCBpZiBnZW8gbWFwIgogICAgKTsKCiAgdmFyIGtleXdvcmRzX2ltcG9ydGFudCA9IHdvcmRzKAogICAgLyogbmd4RGlyZWN0aXZlSW1wb3J0YW50ICovICJpbmNsdWRlIHJvb3Qgc2VydmVyIHNlcnZlcl9uYW1lIGxpc3RlbiBpbnRlcm5hbCBwcm94eV9wYXNzIG1lbWNhY2hlZF9wYXNzIGZhc3RjZ2lfcGFzcyB0cnlfZmlsZXMiCiAgICApOwoKICB2YXIgaW5kZW50VW5pdCA9IGNvbmZpZy5pbmRlbnRVbml0LCB0eXBlOwogIGZ1bmN0aW9uIHJldChzdHlsZSwgdHApIHt0eXBlID0gdHA7IHJldHVybiBzdHlsZTt9CgogIGZ1bmN0aW9uIHRva2VuQmFzZShzdHJlYW0sIHN0YXRlKSB7CgoKICAgIHN0cmVhbS5lYXRXaGlsZSgvW1x3XCRfXS8pOwoKICAgIHZhciBjdXIgPSBzdHJlYW0uY3VycmVudCgpOwoKCiAgICBpZiAoa2V5d29yZHMucHJvcGVydHlJc0VudW1lcmFibGUoY3VyKSkgewogICAgICByZXR1cm4gImtleXdvcmQiOwogICAgfQogICAgZWxzZSBpZiAoa2V5d29yZHNfYmxvY2sucHJvcGVydHlJc0VudW1lcmFibGUoY3VyKSkgewogICAgICByZXR1cm4gInZhcmlhYmxlLTIiOwogICAgfQogICAgZWxzZSBpZiAoa2V5d29yZHNfaW1wb3J0YW50LnByb3BlcnR5SXNFbnVtZXJhYmxlKGN1cikpIHsKICAgICAgcmV0dXJuICJzdHJpbmctMiI7CiAgICB9CiAgICAvKiovCgogICAgdmFyIGNoID0gc3RyZWFtLm5leHQoKTsKICAgIGlmIChjaCA9PSAiQCIpIHtzdHJlYW0uZWF0V2hpbGUoL1tcd1xcXC1dLyk7IHJldHVybiByZXQoIm1ldGEiLCBzdHJlYW0uY3VycmVudCgpKTt9CiAgICBlbHNlIGlmIChjaCA9PSAiLyIgJiYgc3RyZWFtLmVhdCgiKiIpKSB7CiAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5DQ29tbWVudDsKICAgICAgcmV0dXJuIHRva2VuQ0NvbW1lbnQoc3RyZWFtLCBzdGF0ZSk7CiAgICB9CiAgICBlbHNlIGlmIChjaCA9PSAiPCIgJiYgc3RyZWFtLmVhdCgiISIpKSB7CiAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5TR01MQ29tbWVudDsKICAgICAgcmV0dXJuIHRva2VuU0dNTENvbW1lbnQoc3RyZWFtLCBzdGF0ZSk7CiAgICB9CiAgICBlbHNlIGlmIChjaCA9PSAiPSIpIHJldChudWxsLCAiY29tcGFyZSIpOwogICAgZWxzZSBpZiAoKGNoID09ICJ+IiB8fCBjaCA9PSAifCIpICYmIHN0cmVhbS5lYXQoIj0iKSkgcmV0dXJuIHJldChudWxsLCAiY29tcGFyZSIpOwogICAgZWxzZSBpZiAoY2ggPT0gIlwiIiB8fCBjaCA9PSAiJyIpIHsKICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlblN0cmluZyhjaCk7CiAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgIH0KICAgIGVsc2UgaWYgKGNoID09ICIjIikgewogICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICAgIHJldHVybiByZXQoImNvbW1lbnQiLCAiY29tbWVudCIpOwogICAgfQogICAgZWxzZSBpZiAoY2ggPT0gIiEiKSB7CiAgICAgIHN0cmVhbS5tYXRjaCgvXlxzKlx3Ki8pOwogICAgICByZXR1cm4gcmV0KCJrZXl3b3JkIiwgImltcG9ydGFudCIpOwogICAgfQogICAgZWxzZSBpZiAoL1xkLy50ZXN0KGNoKSkgewogICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcdy4lXS8pOwogICAgICByZXR1cm4gcmV0KCJudW1iZXIiLCAidW5pdCIpOwogICAgfQogICAgZWxzZSBpZiAoL1ssLis+KlwvXS8udGVzdChjaCkpIHsKICAgICAgcmV0dXJuIHJldChudWxsLCAic2VsZWN0LW9wIik7CiAgICB9CiAgICBlbHNlIGlmICgvWzt7fTpcW1xdXS8udGVzdChjaCkpIHsKICAgICAgcmV0dXJuIHJldChudWxsLCBjaCk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXHdcXFwtXS8pOwogICAgICByZXR1cm4gcmV0KCJ2YXJpYWJsZSIsICJ2YXJpYWJsZSIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gdG9rZW5DQ29tbWVudChzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgbWF5YmVFbmQgPSBmYWxzZSwgY2g7CiAgICB3aGlsZSAoKGNoID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkgewogICAgICBpZiAobWF5YmVFbmQgJiYgY2ggPT0gIi8iKSB7CiAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgbWF5YmVFbmQgPSAoY2ggPT0gIioiKTsKICAgIH0KICAgIHJldHVybiByZXQoImNvbW1lbnQiLCAiY29tbWVudCIpOwogIH0KCiAgZnVuY3Rpb24gdG9rZW5TR01MQ29tbWVudChzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgZGFzaGVzID0gMCwgY2g7CiAgICB3aGlsZSAoKGNoID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkgewogICAgICBpZiAoZGFzaGVzID49IDIgJiYgY2ggPT0gIj4iKSB7CiAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgZGFzaGVzID0gKGNoID09ICItIikgPyBkYXNoZXMgKyAxIDogMDsKICAgIH0KICAgIHJldHVybiByZXQoImNvbW1lbnQiLCAiY29tbWVudCIpOwogIH0KCiAgZnVuY3Rpb24gdG9rZW5TdHJpbmcocXVvdGUpIHsKICAgIHJldHVybiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHZhciBlc2NhcGVkID0gZmFsc2UsIGNoOwogICAgICB3aGlsZSAoKGNoID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkgewogICAgICAgIGlmIChjaCA9PSBxdW90ZSAmJiAhZXNjYXBlZCkKICAgICAgICAgIGJyZWFrOwogICAgICAgIGVzY2FwZWQgPSAhZXNjYXBlZCAmJiBjaCA9PSAiXFwiOwogICAgICB9CiAgICAgIGlmICghZXNjYXBlZCkgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICAgIHJldHVybiByZXQoInN0cmluZyIsICJzdHJpbmciKTsKICAgIH07CiAgfQoKICByZXR1cm4gewogICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24oYmFzZSkgewogICAgICByZXR1cm4ge3Rva2VuaXplOiB0b2tlbkJhc2UsCiAgICAgICAgICAgICAgYmFzZUluZGVudDogYmFzZSB8fCAwLAogICAgICAgICAgICAgIHN0YWNrOiBbXX07CiAgICB9LAoKICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIGlmIChzdHJlYW0uZWF0U3BhY2UoKSkgcmV0dXJuIG51bGw7CiAgICAgIHR5cGUgPSBudWxsOwogICAgICB2YXIgc3R5bGUgPSBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKCiAgICAgIHZhciBjb250ZXh0ID0gc3RhdGUuc3RhY2tbc3RhdGUuc3RhY2subGVuZ3RoLTFdOwogICAgICBpZiAodHlwZSA9PSAiaGFzaCIgJiYgY29udGV4dCA9PSAicnVsZSIpIHN0eWxlID0gImF0b20iOwogICAgICBlbHNlIGlmIChzdHlsZSA9PSAidmFyaWFibGUiKSB7CiAgICAgICAgaWYgKGNvbnRleHQgPT0gInJ1bGUiKSBzdHlsZSA9ICJudW1iZXIiOwogICAgICAgIGVsc2UgaWYgKCFjb250ZXh0IHx8IGNvbnRleHQgPT0gIkBtZWRpYXsiKSBzdHlsZSA9ICJ0YWciOwogICAgICB9CgogICAgICBpZiAoY29udGV4dCA9PSAicnVsZSIgJiYgL15bXHtcfTtdJC8udGVzdCh0eXBlKSkKICAgICAgICBzdGF0ZS5zdGFjay5wb3AoKTsKICAgICAgaWYgKHR5cGUgPT0gInsiKSB7CiAgICAgICAgaWYgKGNvbnRleHQgPT0gIkBtZWRpYSIpIHN0YXRlLnN0YWNrW3N0YXRlLnN0YWNrLmxlbmd0aC0xXSA9ICJAbWVkaWF7IjsKICAgICAgICBlbHNlIHN0YXRlLnN0YWNrLnB1c2goInsiKTsKICAgICAgfQogICAgICBlbHNlIGlmICh0eXBlID09ICJ9Iikgc3RhdGUuc3RhY2sucG9wKCk7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gIkBtZWRpYSIpIHN0YXRlLnN0YWNrLnB1c2goIkBtZWRpYSIpOwogICAgICBlbHNlIGlmIChjb250ZXh0ID09ICJ7IiAmJiB0eXBlICE9ICJjb21tZW50Iikgc3RhdGUuc3RhY2sucHVzaCgicnVsZSIpOwogICAgICByZXR1cm4gc3R5bGU7CiAgICB9LAoKICAgIGluZGVudDogZnVuY3Rpb24oc3RhdGUsIHRleHRBZnRlcikgewogICAgICB2YXIgbiA9IHN0YXRlLnN0YWNrLmxlbmd0aDsKICAgICAgaWYgKC9eXH0vLnRlc3QodGV4dEFmdGVyKSkKICAgICAgICBuIC09IHN0YXRlLnN0YWNrW3N0YXRlLnN0YWNrLmxlbmd0aC0xXSA9PSAicnVsZSIgPyAyIDogMTsKICAgICAgcmV0dXJuIHN0YXRlLmJhc2VJbmRlbnQgKyBuICogaW5kZW50VW5pdDsKICAgIH0sCgogICAgZWxlY3RyaWNDaGFyczogIn0iCiAgfTsKfSk7CgpDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQvbmdpbngiLCAidGV4dC94LW5naW54LWNvbmYiKTsKCn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/ntriples/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/ntriples/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogTlRyaXBsZXMgbW9kZTwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uLy4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxzY3JpcHQgc3JjPSIuLi8uLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJudHJpcGxlcy5qcyI+PC9zY3JpcHQ+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICAgIC5Db2RlTWlycm9yIHsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZWVlOwogICAgICB9CiAgICA8L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5OVHJpcGxlczwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+TlRyaXBsZXMgbW9kZTwvaDI+Cjxmb3JtPgo8dGV4dGFyZWEgaWQ9Im50cmlwbGVzIiBuYW1lPSJudHJpcGxlcyI+ICAgIAo8aHR0cDovL1N1YjE+ICAgICA8aHR0cDovL3ByZWQxPiAgICAgPGh0dHA6Ly9vYmo+IC4KPGh0dHA6Ly9TdWIyPiAgICAgPGh0dHA6Ly9wcmVkMiNhbjI+ICJsaXRlcmFsIDEiIC4KPGh0dHA6Ly9TdWIzI2FuMz4gPGh0dHA6Ly9wcmVkMz4gICAgIF86Ym5vZGUzIC4KXzpibm9kZTQgICAgICAgICAgPGh0dHA6Ly9wcmVkND4gICAgICJsaXRlcmFsIDIiQGxhbmcgLgpfOmJub2RlNSAgICAgICAgICA8aHR0cDovL3ByZWQ1PiAgICAgImxpdGVyYWwgMyJeXjxodHRwOi8vdHlwZT4gLgo8L3RleHRhcmVhPgo8L2Zvcm0+CgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJudHJpcGxlcyIpLCB7fSk7CiAgICA8L3NjcmlwdD4KICAgIDxwPjxzdHJvbmc+TUlNRSB0eXBlcyBkZWZpbmVkOjwvc3Ryb25nPiA8Y29kZT50ZXh0L24tdHJpcGxlczwvY29kZT4uPC9wPgogIDwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/ntriples/ntriples.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIFRoaXMgc2NyaXB0IHByb3ZpZGVzIHN5bnRheCBoaWdobGlnaHRpbmcgc3VwcG9ydCBmb3IKKiB0aGUgTnRyaXBsZXMgZm9ybWF0LgoqIE50cmlwbGVzIGZvcm1hdCBzcGVjaWZpY2F0aW9uOgoqICAgICBodHRwOi8vd3d3LnczLm9yZy9UUi9yZGYtdGVzdGNhc2VzLyNudHJpcGxlcwoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qCiAgICBUaGUgZm9sbG93aW5nIGV4cHJlc3Npb24gZGVmaW5lcyB0aGUgZGVmaW5lZCBBU0YgZ3JhbW1hciB0cmFuc2l0aW9ucy4KCiAgICBwcmVfc3ViamVjdCAtPgogICAgICAgIHsKICAgICAgICAoIHdyaXRpbmdfc3ViamVjdF91cmkgfCB3cml0aW5nX2Jub2RlX3VyaSApCiAgICAgICAgICAgIC0+IHByZV9wcmVkaWNhdGUKICAgICAgICAgICAgICAgIC0+IHdyaXRpbmdfcHJlZGljYXRlX3VyaQogICAgICAgICAgICAgICAgICAgIC0+IHByZV9vYmplY3QKICAgICAgICAgICAgICAgICAgICAgICAgLT4gd3JpdGluZ19vYmplY3RfdXJpIHwgd3JpdGluZ19vYmplY3RfYm5vZGUgfAogICAgICAgICAgICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRpbmdfb2JqZWN0X2xpdGVyYWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiB3cml0aW5nX2xpdGVyYWxfbGFuZyB8IHdyaXRpbmdfbGl0ZXJhbF90eXBlCiAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gcG9zdF9vYmplY3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiBCRUdJTgogICAgICAgICB9IG90aGVyd2lzZSB7CiAgICAgICAgICAgICAtPiBFUlJPUgogICAgICAgICB9CiovCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJudHJpcGxlcyIsIGZ1bmN0aW9uKCkgewoKICB2YXIgTG9jYXRpb24gPSB7CiAgICBQUkVfU1VCSkVDVCAgICAgICAgIDogMCwKICAgIFdSSVRJTkdfU1VCX1VSSSAgICAgOiAxLAogICAgV1JJVElOR19CTk9ERV9VUkkgICA6IDIsCiAgICBQUkVfUFJFRCAgICAgICAgICAgIDogMywKICAgIFdSSVRJTkdfUFJFRF9VUkkgICAgOiA0LAogICAgUFJFX09CSiAgICAgICAgICAgICA6IDUsCiAgICBXUklUSU5HX09CSl9VUkkgICAgIDogNiwKICAgIFdSSVRJTkdfT0JKX0JOT0RFICAgOiA3LAogICAgV1JJVElOR19PQkpfTElURVJBTCA6IDgsCiAgICBXUklUSU5HX0xJVF9MQU5HICAgIDogOSwKICAgIFdSSVRJTkdfTElUX1RZUEUgICAgOiAxMCwKICAgIFBPU1RfT0JKICAgICAgICAgICAgOiAxMSwKICAgIEVSUk9SICAgICAgICAgICAgICAgOiAxMgogIH07CiAgZnVuY3Rpb24gdHJhbnNpdFN0YXRlKGN1cnJTdGF0ZSwgYykgewogICAgdmFyIGN1cnJMb2NhdGlvbiA9IGN1cnJTdGF0ZS5sb2NhdGlvbjsKICAgIHZhciByZXQ7CgogICAgLy8gT3BlbmluZy4KICAgIGlmICAgICAoY3VyckxvY2F0aW9uID09IExvY2F0aW9uLlBSRV9TVUJKRUNUICYmIGMgPT0gJzwnKSByZXQgPSBMb2NhdGlvbi5XUklUSU5HX1NVQl9VUkk7CiAgICBlbHNlIGlmKGN1cnJMb2NhdGlvbiA9PSBMb2NhdGlvbi5QUkVfU1VCSkVDVCAmJiBjID09ICdfJykgcmV0ID0gTG9jYXRpb24uV1JJVElOR19CTk9ERV9VUkk7CiAgICBlbHNlIGlmKGN1cnJMb2NhdGlvbiA9PSBMb2NhdGlvbi5QUkVfUFJFRCAgICAmJiBjID09ICc8JykgcmV0ID0gTG9jYXRpb24uV1JJVElOR19QUkVEX1VSSTsKICAgIGVsc2UgaWYoY3VyckxvY2F0aW9uID09IExvY2F0aW9uLlBSRV9PQkogICAgICYmIGMgPT0gJzwnKSByZXQgPSBMb2NhdGlvbi5XUklUSU5HX09CSl9VUkk7CiAgICBlbHNlIGlmKGN1cnJMb2NhdGlvbiA9PSBMb2NhdGlvbi5QUkVfT0JKICAgICAmJiBjID09ICdfJykgcmV0ID0gTG9jYXRpb24uV1JJVElOR19PQkpfQk5PREU7CiAgICBlbHNlIGlmKGN1cnJMb2NhdGlvbiA9PSBMb2NhdGlvbi5QUkVfT0JKICAgICAmJiBjID09ICciJykgcmV0ID0gTG9jYXRpb24uV1JJVElOR19PQkpfTElURVJBTDsKCiAgICAvLyBDbG9zaW5nLgogICAgZWxzZSBpZihjdXJyTG9jYXRpb24gPT0gTG9jYXRpb24uV1JJVElOR19TVUJfVVJJICAgICAmJiBjID09ICc+JykgcmV0ID0gTG9jYXRpb24uUFJFX1BSRUQ7CiAgICBlbHNlIGlmKGN1cnJMb2NhdGlvbiA9PSBMb2NhdGlvbi5XUklUSU5HX0JOT0RFX1VSSSAgICYmIGMgPT0gJyAnKSByZXQgPSBMb2NhdGlvbi5QUkVfUFJFRDsKICAgIGVsc2UgaWYoY3VyckxvY2F0aW9uID09IExvY2F0aW9uLldSSVRJTkdfUFJFRF9VUkkgICAgJiYgYyA9PSAnPicpIHJldCA9IExvY2F0aW9uLlBSRV9PQko7CiAgICBlbHNlIGlmKGN1cnJMb2NhdGlvbiA9PSBMb2NhdGlvbi5XUklUSU5HX09CSl9VUkkgICAgICYmIGMgPT0gJz4nKSByZXQgPSBMb2NhdGlvbi5QT1NUX09CSjsKICAgIGVsc2UgaWYoY3VyckxvY2F0aW9uID09IExvY2F0aW9uLldSSVRJTkdfT0JKX0JOT0RFICAgJiYgYyA9PSAnICcpIHJldCA9IExvY2F0aW9uLlBPU1RfT0JKOwogICAgZWxzZSBpZihjdXJyTG9jYXRpb24gPT0gTG9jYXRpb24uV1JJVElOR19PQkpfTElURVJBTCAmJiBjID09ICciJykgcmV0ID0gTG9jYXRpb24uUE9TVF9PQko7CiAgICBlbHNlIGlmKGN1cnJMb2NhdGlvbiA9PSBMb2NhdGlvbi5XUklUSU5HX0xJVF9MQU5HICYmIGMgPT0gJyAnKSByZXQgPSBMb2NhdGlvbi5QT1NUX09CSjsKICAgIGVsc2UgaWYoY3VyckxvY2F0aW9uID09IExvY2F0aW9uLldSSVRJTkdfTElUX1RZUEUgJiYgYyA9PSAnPicpIHJldCA9IExvY2F0aW9uLlBPU1RfT0JKOwoKICAgIC8vIENsb3NpbmcgdHlwZWQgYW5kIGxhbmd1YWdlIGxpdGVyYWwuCiAgICBlbHNlIGlmKGN1cnJMb2NhdGlvbiA9PSBMb2NhdGlvbi5XUklUSU5HX09CSl9MSVRFUkFMICYmIGMgPT0gJ0AnKSByZXQgPSBMb2NhdGlvbi5XUklUSU5HX0xJVF9MQU5HOwogICAgZWxzZSBpZihjdXJyTG9jYXRpb24gPT0gTG9jYXRpb24uV1JJVElOR19PQkpfTElURVJBTCAmJiBjID09ICdeJykgcmV0ID0gTG9jYXRpb24uV1JJVElOR19MSVRfVFlQRTsKCiAgICAvLyBTcGFjZXMuCiAgICBlbHNlIGlmKCBjID09ICcgJyAmJgogICAgICAgICAgICAgKAogICAgICAgICAgICAgICBjdXJyTG9jYXRpb24gPT0gTG9jYXRpb24uUFJFX1NVQkpFQ1QgfHwKICAgICAgICAgICAgICAgY3VyckxvY2F0aW9uID09IExvY2F0aW9uLlBSRV9QUkVEICAgIHx8CiAgICAgICAgICAgICAgIGN1cnJMb2NhdGlvbiA9PSBMb2NhdGlvbi5QUkVfT0JKICAgICB8fAogICAgICAgICAgICAgICBjdXJyTG9jYXRpb24gPT0gTG9jYXRpb24uUE9TVF9PQkoKICAgICAgICAgICAgICkKICAgICAgICAgICApIHJldCA9IGN1cnJMb2NhdGlvbjsKCiAgICAvLyBSZXNldC4KICAgIGVsc2UgaWYoY3VyckxvY2F0aW9uID09IExvY2F0aW9uLlBPU1RfT0JKICYmIGMgPT0gJy4nKSByZXQgPSBMb2NhdGlvbi5QUkVfU1VCSkVDVDsKCiAgICAvLyBFcnJvcgogICAgZWxzZSByZXQgPSBMb2NhdGlvbi5FUlJPUjsKCiAgICBjdXJyU3RhdGUubG9jYXRpb249cmV0OwogIH0KCiAgcmV0dXJuIHsKICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKCkgewogICAgICAgcmV0dXJuIHsKICAgICAgICAgICBsb2NhdGlvbiA6IExvY2F0aW9uLlBSRV9TVUJKRUNULAogICAgICAgICAgIHVyaXMgICAgIDogW10sCiAgICAgICAgICAgYW5jaG9ycyAgOiBbXSwKICAgICAgICAgICBibm9kZXMgICA6IFtdLAogICAgICAgICAgIGxhbmdzICAgIDogW10sCiAgICAgICAgICAgdHlwZXMgICAgOiBbXQogICAgICAgfTsKICAgIH0sCiAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpOwogICAgICBpZihjaCA9PSAnPCcpIHsKICAgICAgICAgdHJhbnNpdFN0YXRlKHN0YXRlLCBjaCk7CiAgICAgICAgIHZhciBwYXJzZWRVUkkgPSAnJzsKICAgICAgICAgc3RyZWFtLmVhdFdoaWxlKCBmdW5jdGlvbihjKSB7IGlmKCBjICE9ICcjJyAmJiBjICE9ICc+JyApIHsgcGFyc2VkVVJJICs9IGM7IHJldHVybiB0cnVlOyB9IHJldHVybiBmYWxzZTt9ICk7CiAgICAgICAgIHN0YXRlLnVyaXMucHVzaChwYXJzZWRVUkkpOwogICAgICAgICBpZiggc3RyZWFtLm1hdGNoKCcjJywgZmFsc2UpICkgcmV0dXJuICd2YXJpYWJsZSc7CiAgICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgIHRyYW5zaXRTdGF0ZShzdGF0ZSwgJz4nKTsKICAgICAgICAgcmV0dXJuICd2YXJpYWJsZSc7CiAgICAgIH0KICAgICAgaWYoY2ggPT0gJyMnKSB7CiAgICAgICAgdmFyIHBhcnNlZEFuY2hvciA9ICcnOwogICAgICAgIHN0cmVhbS5lYXRXaGlsZShmdW5jdGlvbihjKSB7IGlmKGMgIT0gJz4nICYmIGMgIT0gJyAnKSB7IHBhcnNlZEFuY2hvcis9IGM7IHJldHVybiB0cnVlOyB9IHJldHVybiBmYWxzZTt9KTsKICAgICAgICBzdGF0ZS5hbmNob3JzLnB1c2gocGFyc2VkQW5jaG9yKTsKICAgICAgICByZXR1cm4gJ3ZhcmlhYmxlLTInOwogICAgICB9CiAgICAgIGlmKGNoID09ICc+JykgewogICAgICAgICAgdHJhbnNpdFN0YXRlKHN0YXRlLCAnPicpOwogICAgICAgICAgcmV0dXJuICd2YXJpYWJsZSc7CiAgICAgIH0KICAgICAgaWYoY2ggPT0gJ18nKSB7CiAgICAgICAgICB0cmFuc2l0U3RhdGUoc3RhdGUsIGNoKTsKICAgICAgICAgIHZhciBwYXJzZWRCTm9kZSA9ICcnOwogICAgICAgICAgc3RyZWFtLmVhdFdoaWxlKGZ1bmN0aW9uKGMpIHsgaWYoIGMgIT0gJyAnICkgeyBwYXJzZWRCTm9kZSArPSBjOyByZXR1cm4gdHJ1ZTsgfSByZXR1cm4gZmFsc2U7fSk7CiAgICAgICAgICBzdGF0ZS5ibm9kZXMucHVzaChwYXJzZWRCTm9kZSk7CiAgICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgICAgdHJhbnNpdFN0YXRlKHN0YXRlLCAnICcpOwogICAgICAgICAgcmV0dXJuICdidWlsdGluJzsKICAgICAgfQogICAgICBpZihjaCA9PSAnIicpIHsKICAgICAgICAgIHRyYW5zaXRTdGF0ZShzdGF0ZSwgY2gpOwogICAgICAgICAgc3RyZWFtLmVhdFdoaWxlKCBmdW5jdGlvbihjKSB7IHJldHVybiBjICE9ICciJzsgfSApOwogICAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgICAgIGlmKCBzdHJlYW0ucGVlaygpICE9ICdAJyAmJiBzdHJlYW0ucGVlaygpICE9ICdeJyApIHsKICAgICAgICAgICAgICB0cmFuc2l0U3RhdGUoc3RhdGUsICciJyk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gJ3N0cmluZyc7CiAgICAgIH0KICAgICAgaWYoIGNoID09ICdAJyApIHsKICAgICAgICAgIHRyYW5zaXRTdGF0ZShzdGF0ZSwgJ0AnKTsKICAgICAgICAgIHZhciBwYXJzZWRMYW5nID0gJyc7CiAgICAgICAgICBzdHJlYW0uZWF0V2hpbGUoZnVuY3Rpb24oYykgeyBpZiggYyAhPSAnICcgKSB7IHBhcnNlZExhbmcgKz0gYzsgcmV0dXJuIHRydWU7IH0gcmV0dXJuIGZhbHNlO30pOwogICAgICAgICAgc3RhdGUubGFuZ3MucHVzaChwYXJzZWRMYW5nKTsKICAgICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgICB0cmFuc2l0U3RhdGUoc3RhdGUsICcgJyk7CiAgICAgICAgICByZXR1cm4gJ3N0cmluZy0yJzsKICAgICAgfQogICAgICBpZiggY2ggPT0gJ14nICkgewogICAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgICAgIHRyYW5zaXRTdGF0ZShzdGF0ZSwgJ14nKTsKICAgICAgICAgIHZhciBwYXJzZWRUeXBlID0gJyc7CiAgICAgICAgICBzdHJlYW0uZWF0V2hpbGUoZnVuY3Rpb24oYykgeyBpZiggYyAhPSAnPicgKSB7IHBhcnNlZFR5cGUgKz0gYzsgcmV0dXJuIHRydWU7IH0gcmV0dXJuIGZhbHNlO30gKTsKICAgICAgICAgIHN0YXRlLnR5cGVzLnB1c2gocGFyc2VkVHlwZSk7CiAgICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgICAgdHJhbnNpdFN0YXRlKHN0YXRlLCAnPicpOwogICAgICAgICAgcmV0dXJuICd2YXJpYWJsZSc7CiAgICAgIH0KICAgICAgaWYoIGNoID09ICcgJyApIHsKICAgICAgICAgIHRyYW5zaXRTdGF0ZShzdGF0ZSwgY2gpOwogICAgICB9CiAgICAgIGlmKCBjaCA9PSAnLicgKSB7CiAgICAgICAgICB0cmFuc2l0U3RhdGUoc3RhdGUsIGNoKTsKICAgICAgfQogICAgfQogIH07Cn0pOwoKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L24tdHJpcGxlcyIsICJudHJpcGxlcyIpOwoKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/octave/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/octave/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogT2N0YXZlIG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0ib2N0YXZlLmpzIj48L3NjcmlwdD4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4uQ29kZU1pcnJvciB7Ym9yZGVyLXRvcDogMXB4IHNvbGlkIGJsYWNrOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGltZyBpZD1sb2dvIHNyYz0iLi4vLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+TGFuZ3VhZ2UgbW9kZXM8L2E+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPk9jdGF2ZTwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+T2N0YXZlIG1vZGU8L2gyPgoKICAgIDxkaXY+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KJW51bWJlcnMKWzEyMzQgMTIzNGkgMTIzNGpdClsuMjM0IC4yMzRqIDIuMjNpXQpbMjNlMiAxMkUxaiAxMjNELTQgMHgyMzRdCgolc3RyaW5ncwonYXNkYScnYScKImFzZGEiImEiCgolaWRlbnRpZmllcnMKYSArIGFzMTIzIC0gX19hc2RfXwoKJW9wZXJhdG9ycwotCisKPQo9PQo+CjwKPj0KPD0KJgp+Ci4uLgpicmVhayB6ZXJvcyBkZWZhdWx0IG1hcmdpbiByb3VuZCBvbmVzIHJhbmQKY2VpbCBmbG9vciBzaXplIGNsZWFyIHplcm9zIGV5ZSBtZWFuIHN0ZCBjb3YKZXJyb3IgZXZhbCBmdW5jdGlvbgphYnMgYWNvcyBhdGFuIGFzaW4gY29zIGNvc2ggZXhwIGxvZyBwcm9kIHN1bQpsb2cxMCBtYXggbWluIHNpZ24gc2luIHNpbmggc3FydCB0YW4gcmVzaGFwZQpyZXR1cm4KY2FzZSBzd2l0Y2gKZWxzZSBlbHNlaWYgZW5kIGlmIG90aGVyd2lzZQpkbyBmb3Igd2hpbGUKdHJ5IGNhdGNoCmNsYXNzZGVmIHByb3BlcnRpZXMgZXZlbnRzIG1ldGhvZHMKZ2xvYmFsIHBlcnNpc3RlbnQKCiVvbmUgbGluZSBjb21tZW50CiV7IG11bHRpIApsaW5lIGNvbW1tZW50ICV9CgogICAgPC90ZXh0YXJlYT48L2Rpdj4KICAgIDxzY3JpcHQ+CiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICAgICAgbW9kZToge25hbWU6ICJvY3RhdmUiLAogICAgICAgICAgICAgICB2ZXJzaW9uOiAyLAogICAgICAgICAgICAgICBzaW5nbGVMaW5lU3RyaW5nRXJyb3JzOiBmYWxzZX0sCiAgICAgICAgbGluZU51bWJlcnM6IHRydWUsCiAgICAgICAgaW5kZW50VW5pdDogNCwKICAgICAgICBtYXRjaEJyYWNrZXRzOiB0cnVlCiAgICAgIH0pOwogICAgPC9zY3JpcHQ+CgogICAgPHA+PHN0cm9uZz5NSU1FIHR5cGVzIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPnRleHQveC1vY3RhdmU8L2NvZGU+LjwvcD4KPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/octave/octave.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJvY3RhdmUiLCBmdW5jdGlvbigpIHsKICBmdW5jdGlvbiB3b3JkUmVnZXhwKHdvcmRzKSB7CiAgICByZXR1cm4gbmV3IFJlZ0V4cCgiXigoIiArIHdvcmRzLmpvaW4oIil8KCIpICsgIikpXFxiIik7CiAgfQoKICB2YXIgc2luZ2xlT3BlcmF0b3JzID0gbmV3IFJlZ0V4cCgiXltcXCtcXC1cXCovJnxcXF5+PD4hQCdcXFxcXSIpOwogIHZhciBzaW5nbGVEZWxpbWl0ZXJzID0gbmV3IFJlZ0V4cCgnXltcXChcXFtcXHtcXH0sOj07XScpOwogIHZhciBkb3VibGVPcGVyYXRvcnMgPSBuZXcgUmVnRXhwKCJeKCg9PSl8KH49KXwoPD0pfCg+PSl8KDw8KXwoPj4pfChcXC5bXFwrXFwtXFwqL1xcXlxcXFxdKSkiKTsKICB2YXIgZG91YmxlRGVsaW1pdGVycyA9IG5ldyBSZWdFeHAoIl4oKCE9KXwoXFwrPSl8KFxcLT0pfChcXCo9KXwoLz0pfCgmPSl8KFxcfD0pfChcXF49KSkiKTsKICB2YXIgdHJpcGxlRGVsaW1pdGVycyA9IG5ldyBSZWdFeHAoIl4oKD4+PSl8KDw8PSkpIik7CiAgdmFyIGV4cHJlc3Npb25FbmQgPSBuZXcgUmVnRXhwKCJeW1xcXVxcKV0iKTsKICB2YXIgaWRlbnRpZmllcnMgPSBuZXcgUmVnRXhwKCJeW19BLVphLXpdW19BLVphLXowLTldKiIpOwoKICB2YXIgYnVpbHRpbnMgPSB3b3JkUmVnZXhwKFsKICAgICdlcnJvcicsICdldmFsJywgJ2Z1bmN0aW9uJywgJ2FicycsICdhY29zJywgJ2F0YW4nLCAnYXNpbicsICdjb3MnLAogICAgJ2Nvc2gnLCAnZXhwJywgJ2xvZycsICdwcm9kJywgJ3N1bScsICdsb2cxMCcsICdtYXgnLCAnbWluJywgJ3NpZ24nLCAnc2luJywgJ3NpbmgnLAogICAgJ3NxcnQnLCAndGFuJywgJ3Jlc2hhcGUnLCAnYnJlYWsnLCAnemVyb3MnLCAnZGVmYXVsdCcsICdtYXJnaW4nLCAncm91bmQnLCAnb25lcycsCiAgICAncmFuZCcsICdzeW4nLCAnY2VpbCcsICdmbG9vcicsICdzaXplJywgJ2NsZWFyJywgJ3plcm9zJywgJ2V5ZScsICdtZWFuJywgJ3N0ZCcsICdjb3YnLAogICAgJ2RldCcsICdlaWcnLCAnaW52JywgJ25vcm0nLCAncmFuaycsICd0cmFjZScsICdleHBtJywgJ2xvZ20nLCAnc3FydG0nLCAnbGluc3BhY2UnLCAncGxvdCcsCiAgICAndGl0bGUnLCAneGxhYmVsJywgJ3lsYWJlbCcsICdsZWdlbmQnLCAndGV4dCcsICdncmlkJywgJ21lc2hncmlkJywgJ21lc2gnLCAnbnVtMnN0cicsCiAgICAnZmZ0JywgJ2lmZnQnLCAnYXJyYXlmdW4nLCAnY2VsbGZ1bicsICdpbnB1dCcsICdmbGlwbHInLCAnZmxpcHVkJywgJ2lzbWVtYmVyJwogIF0pOwoKICB2YXIga2V5d29yZHMgPSB3b3JkUmVnZXhwKFsKICAgICdyZXR1cm4nLCAnY2FzZScsICdzd2l0Y2gnLCAnZWxzZScsICdlbHNlaWYnLCAnZW5kJywgJ2VuZGlmJywgJ2VuZGZ1bmN0aW9uJywKICAgICdpZicsICdvdGhlcndpc2UnLCAnZG8nLCAnZm9yJywgJ3doaWxlJywgJ3RyeScsICdjYXRjaCcsICdjbGFzc2RlZicsICdwcm9wZXJ0aWVzJywgJ2V2ZW50cycsCiAgICAnbWV0aG9kcycsICdnbG9iYWwnLCAncGVyc2lzdGVudCcsICdlbmRmb3InLCAnZW5kd2hpbGUnLCAncHJpbnRmJywgJ3NwcmludGYnLCAnZGlzcCcsICd1bnRpbCcsCiAgICAnY29udGludWUnLCAncGtnJwogIF0pOwoKCiAgLy8gdG9rZW5pemVycwogIGZ1bmN0aW9uIHRva2VuVHJhbnNwb3NlKHN0cmVhbSwgc3RhdGUpIHsKICAgIGlmICghc3RyZWFtLnNvbCgpICYmIHN0cmVhbS5wZWVrKCkgPT09ICdcJycpIHsKICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICAgIHJldHVybiAnb3BlcmF0b3InOwogICAgfQogICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICByZXR1cm4gdG9rZW5CYXNlKHN0cmVhbSwgc3RhdGUpOwogIH0KCgogIGZ1bmN0aW9uIHRva2VuQ29tbWVudChzdHJlYW0sIHN0YXRlKSB7CiAgICBpZiAoc3RyZWFtLm1hdGNoKC9eLiolfS8pKSB7CiAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlOwogICAgICByZXR1cm4gJ2NvbW1lbnQnOwogICAgfTsKICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgIHJldHVybiAnY29tbWVudCc7CiAgfQoKICBmdW5jdGlvbiB0b2tlbkJhc2Uoc3RyZWFtLCBzdGF0ZSkgewogICAgLy8gd2hpdGVzcGFjZXMKICAgIGlmIChzdHJlYW0uZWF0U3BhY2UoKSkgcmV0dXJuIG51bGw7CgogICAgLy8gSGFuZGxlIG9uZSBsaW5lIENvbW1lbnRzCiAgICBpZiAoc3RyZWFtLm1hdGNoKCcleycpKXsKICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkNvbW1lbnQ7CiAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgcmV0dXJuICdjb21tZW50JzsKICAgIH0KCiAgICBpZiAoc3RyZWFtLm1hdGNoKC9eWyUjXS8pKXsKICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICByZXR1cm4gJ2NvbW1lbnQnOwogICAgfQoKICAgIC8vIEhhbmRsZSBOdW1iZXIgTGl0ZXJhbHMKICAgIGlmIChzdHJlYW0ubWF0Y2goL15bMC05XC4rLV0vLCBmYWxzZSkpIHsKICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXlsrLV0/MHhbMC05YS1mQS1GXStbaWpdPy8pKSB7CiAgICAgICAgc3RyZWFtLnRva2VuaXplID0gdG9rZW5CYXNlOwogICAgICAgIHJldHVybiAnbnVtYmVyJzsgfTsKICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXlsrLV0/XGQqXC5cZCsoW0VlRGRdWystXT9cZCspP1tpal0/LykpIHsgcmV0dXJuICdudW1iZXInOyB9OwogICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eWystXT9cZCsoW0VlRGRdWystXT9cZCspP1tpal0/LykpIHsgcmV0dXJuICdudW1iZXInOyB9OwogICAgfQogICAgaWYgKHN0cmVhbS5tYXRjaCh3b3JkUmVnZXhwKFsnbmFuJywnTmFOJywnaW5mJywnSW5mJ10pKSkgeyByZXR1cm4gJ251bWJlcic7IH07CgogICAgLy8gSGFuZGxlIFN0cmluZ3MKICAgIGlmIChzdHJlYW0ubWF0Y2goL14iKFteIl18KCIiKSkqIi8pKSB7IHJldHVybiAnc3RyaW5nJzsgfSA7CiAgICBpZiAoc3RyZWFtLm1hdGNoKC9eJyhbXiddfCgnJykpKicvKSkgeyByZXR1cm4gJ3N0cmluZyc7IH0gOwoKICAgIC8vIEhhbmRsZSB3b3JkcwogICAgaWYgKHN0cmVhbS5tYXRjaChrZXl3b3JkcykpIHsgcmV0dXJuICdrZXl3b3JkJzsgfSA7CiAgICBpZiAoc3RyZWFtLm1hdGNoKGJ1aWx0aW5zKSkgeyByZXR1cm4gJ2J1aWx0aW4nOyB9IDsKICAgIGlmIChzdHJlYW0ubWF0Y2goaWRlbnRpZmllcnMpKSB7IHJldHVybiAndmFyaWFibGUnOyB9IDsKCiAgICBpZiAoc3RyZWFtLm1hdGNoKHNpbmdsZU9wZXJhdG9ycykgfHwgc3RyZWFtLm1hdGNoKGRvdWJsZU9wZXJhdG9ycykpIHsgcmV0dXJuICdvcGVyYXRvcic7IH07CiAgICBpZiAoc3RyZWFtLm1hdGNoKHNpbmdsZURlbGltaXRlcnMpIHx8IHN0cmVhbS5tYXRjaChkb3VibGVEZWxpbWl0ZXJzKSB8fCBzdHJlYW0ubWF0Y2godHJpcGxlRGVsaW1pdGVycykpIHsgcmV0dXJuIG51bGw7IH07CgogICAgaWYgKHN0cmVhbS5tYXRjaChleHByZXNzaW9uRW5kKSkgewogICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuVHJhbnNwb3NlOwogICAgICByZXR1cm4gbnVsbDsKICAgIH07CgoKICAgIC8vIEhhbmRsZSBub24tZGV0ZWN0ZWQgaXRlbXMKICAgIHN0cmVhbS5uZXh0KCk7CiAgICByZXR1cm4gJ2Vycm9yJzsKICB9OwoKCiAgcmV0dXJuIHsKICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gewogICAgICAgIHRva2VuaXplOiB0b2tlbkJhc2UKICAgICAgfTsKICAgIH0sCgogICAgdG9rZW46IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgdmFyIHN0eWxlID0gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CiAgICAgIGlmIChzdHlsZSA9PT0gJ251bWJlcicgfHwgc3R5bGUgPT09ICd2YXJpYWJsZScpewogICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5UcmFuc3Bvc2U7CiAgICAgIH0KICAgICAgcmV0dXJuIHN0eWxlOwogICAgfQogIH07Cn0pOwoKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtb2N0YXZlIiwgIm9jdGF2ZSIpOwoKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/pascal/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/pascal/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogUGFzY2FsIG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0icGFzY2FsLmpzIj48L3NjcmlwdD4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4uQ29kZU1pcnJvciB7Ym9yZGVyLXRvcDogMXB4IHNvbGlkIGJsYWNrOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGltZyBpZD1sb2dvIHNyYz0iLi4vLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+TGFuZ3VhZ2UgbW9kZXM8L2E+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPlBhc2NhbDwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+UGFzY2FsIG1vZGU8L2gyPgoKCjxkaXY+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KKCogRXhhbXBsZSBQYXNjYWwgY29kZSAqKQoKd2hpbGUgYSA8PiBiIGRvIHdyaXRlbG4oJ1dhaXRpbmcnKTsKIAppZiBhID4gYiB0aGVuIAogIHdyaXRlbG4oJ0NvbmRpdGlvbiBtZXQnKQplbHNlIAogIHdyaXRlbG4oJ0NvbmRpdGlvbiBub3QgbWV0Jyk7CiAKZm9yIGkgOj0gMSB0byAxMCBkbyAKICB3cml0ZWxuKCdJdGVyYXRpb246ICcsIGk6MSk7CiAKcmVwZWF0CiAgYSA6PSBhICsgMQp1bnRpbCBhID0gMTA7CiAKY2FzZSBpIG9mCiAgMDogd3JpdGUoJ3plcm8nKTsKICAxOiB3cml0ZSgnb25lJyk7CiAgMjogd3JpdGUoJ3R3bycpCmVuZDsKPC90ZXh0YXJlYT48L2Rpdj4KCiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgICAgIG1vZGU6ICJ0ZXh0L3gtcGFzY2FsIgogICAgICB9KTsKICAgIDwvc2NyaXB0PgoKICAgIDxwPjxzdHJvbmc+TUlNRSB0eXBlcyBkZWZpbmVkOjwvc3Ryb25nPiA8Y29kZT50ZXh0L3gtcGFzY2FsPC9jb2RlPi48L3A+CiAgPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/pascal/pascal.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJwYXNjYWwiLCBmdW5jdGlvbigpIHsKICBmdW5jdGlvbiB3b3JkcyhzdHIpIHsKICAgIHZhciBvYmogPSB7fSwgd29yZHMgPSBzdHIuc3BsaXQoIiAiKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgd29yZHMubGVuZ3RoOyArK2kpIG9ialt3b3Jkc1tpXV0gPSB0cnVlOwogICAgcmV0dXJuIG9iajsKICB9CiAgdmFyIGtleXdvcmRzID0gd29yZHMoImFuZCBhcnJheSBiZWdpbiBjYXNlIGNvbnN0IGRpdiBkbyBkb3dudG8gZWxzZSBlbmQgZmlsZSBmb3IgZm9yd2FyZCBpbnRlZ2VyICIgKwogICAgICAgICAgICAgICAgICAgICAgICJib29sZWFuIGNoYXIgZnVuY3Rpb24gZ290byBpZiBpbiBsYWJlbCBtb2QgbmlsIG5vdCBvZiBvciBwYWNrZWQgcHJvY2VkdXJlICIgKwogICAgICAgICAgICAgICAgICAgICAgICJwcm9ncmFtIHJlY29yZCByZXBlYXQgc2V0IHN0cmluZyB0aGVuIHRvIHR5cGUgdW50aWwgdmFyIHdoaWxlIHdpdGgiKTsKICB2YXIgYXRvbXMgPSB7Im51bGwiOiB0cnVlfTsKCiAgdmFyIGlzT3BlcmF0b3JDaGFyID0gL1srXC0qJiU9PD4hP3xcL10vOwoKICBmdW5jdGlvbiB0b2tlbkJhc2Uoc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIGNoID0gc3RyZWFtLm5leHQoKTsKICAgIGlmIChjaCA9PSAiIyIgJiYgc3RhdGUuc3RhcnRPZkxpbmUpIHsKICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICByZXR1cm4gIm1ldGEiOwogICAgfQogICAgaWYgKGNoID09ICciJyB8fCBjaCA9PSAiJyIpIHsKICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlblN0cmluZyhjaCk7CiAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgIH0KICAgIGlmIChjaCA9PSAiKCIgJiYgc3RyZWFtLmVhdCgiKiIpKSB7CiAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5Db21tZW50OwogICAgICByZXR1cm4gdG9rZW5Db21tZW50KHN0cmVhbSwgc3RhdGUpOwogICAgfQogICAgaWYgKC9bXFtcXXt9XChcKSw7XDpcLl0vLnRlc3QoY2gpKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgaWYgKC9cZC8udGVzdChjaCkpIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXHdcLl0vKTsKICAgICAgcmV0dXJuICJudW1iZXIiOwogICAgfQogICAgaWYgKGNoID09ICIvIikgewogICAgICBpZiAoc3RyZWFtLmVhdCgiLyIpKSB7CiAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICAgIHJldHVybiAiY29tbWVudCI7CiAgICAgIH0KICAgIH0KICAgIGlmIChpc09wZXJhdG9yQ2hhci50ZXN0KGNoKSkgewogICAgICBzdHJlYW0uZWF0V2hpbGUoaXNPcGVyYXRvckNoYXIpOwogICAgICByZXR1cm4gIm9wZXJhdG9yIjsKICAgIH0KICAgIHN0cmVhbS5lYXRXaGlsZSgvW1x3XCRfXS8pOwogICAgdmFyIGN1ciA9IHN0cmVhbS5jdXJyZW50KCk7CiAgICBpZiAoa2V5d29yZHMucHJvcGVydHlJc0VudW1lcmFibGUoY3VyKSkgcmV0dXJuICJrZXl3b3JkIjsKICAgIGlmIChhdG9tcy5wcm9wZXJ0eUlzRW51bWVyYWJsZShjdXIpKSByZXR1cm4gImF0b20iOwogICAgcmV0dXJuICJ2YXJpYWJsZSI7CiAgfQoKICBmdW5jdGlvbiB0b2tlblN0cmluZyhxdW90ZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgdmFyIGVzY2FwZWQgPSBmYWxzZSwgbmV4dCwgZW5kID0gZmFsc2U7CiAgICAgIHdoaWxlICgobmV4dCA9IHN0cmVhbS5uZXh0KCkpICE9IG51bGwpIHsKICAgICAgICBpZiAobmV4dCA9PSBxdW90ZSAmJiAhZXNjYXBlZCkge2VuZCA9IHRydWU7IGJyZWFrO30KICAgICAgICBlc2NhcGVkID0gIWVzY2FwZWQgJiYgbmV4dCA9PSAiXFwiOwogICAgICB9CiAgICAgIGlmIChlbmQgfHwgIWVzY2FwZWQpIHN0YXRlLnRva2VuaXplID0gbnVsbDsKICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgfTsKICB9CgogIGZ1bmN0aW9uIHRva2VuQ29tbWVudChzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgbWF5YmVFbmQgPSBmYWxzZSwgY2g7CiAgICB3aGlsZSAoY2ggPSBzdHJlYW0ubmV4dCgpKSB7CiAgICAgIGlmIChjaCA9PSAiKSIgJiYgbWF5YmVFbmQpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IG51bGw7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgbWF5YmVFbmQgPSAoY2ggPT0gIioiKTsKICAgIH0KICAgIHJldHVybiAiY29tbWVudCI7CiAgfQoKICAvLyBJbnRlcmZhY2UKCiAgcmV0dXJuIHsKICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4ge3Rva2VuaXplOiBudWxsfTsKICAgIH0sCgogICAgdG9rZW46IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgaWYgKHN0cmVhbS5lYXRTcGFjZSgpKSByZXR1cm4gbnVsbDsKICAgICAgdmFyIHN0eWxlID0gKHN0YXRlLnRva2VuaXplIHx8IHRva2VuQmFzZSkoc3RyZWFtLCBzdGF0ZSk7CiAgICAgIGlmIChzdHlsZSA9PSAiY29tbWVudCIgfHwgc3R5bGUgPT0gIm1ldGEiKSByZXR1cm4gc3R5bGU7CiAgICAgIHJldHVybiBzdHlsZTsKICAgIH0sCgogICAgZWxlY3RyaWNDaGFyczogInt9IgogIH07Cn0pOwoKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtcGFzY2FsIiwgInBhc2NhbCIpOwoKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/pegjs/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/pegjs/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IFBFRy5qcyBNb2RlPC90aXRsZT4KICAgIDxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CiAgICA8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KICAgIDxzY3JpcHQgc3JjPSIuLi8uLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iLi4vamF2YXNjcmlwdC9qYXZhc2NyaXB0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJwZWdqcy5qcyI+PC9zY3JpcHQ+CiAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPi5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazt9PC9zdHlsZT4KICA8L2hlYWQ+CiAgPGJvZHk+CiAgICA8ZGl2IGlkPW5hdj4KICAgICAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aW1nIGlkPWxvZ28gc3JjPSIuLi8uLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgICAgIDx1bD4KICAgICAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgICAgICA8bGk+PGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgICAgIDwvdWw+CiAgICAgIDx1bD4KICAgICAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+TGFuZ3VhZ2UgbW9kZXM8L2E+CiAgICAgICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5QRUcuanMgTW9kZTwvYT4KICAgICAgPC91bD4KICAgIDwvZGl2PgoKICAgIDxhcnRpY2xlPgogICAgICA8aDI+UEVHLmpzIE1vZGU8L2gyPgogICAgICA8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgovKgogKiBDbGFzc2ljIGV4YW1wbGUgZ3JhbW1hciwgd2hpY2ggcmVjb2duaXplcyBzaW1wbGUgYXJpdGhtZXRpYyBleHByZXNzaW9ucyBsaWtlCiAqICIyKigzKzQpIi4gVGhlIHBhcnNlciBnZW5lcmF0ZWQgZnJvbSB0aGlzIGdyYW1tYXIgdGhlbiBjb21wdXRlcyB0aGVpciB2YWx1ZS4KICovCgpzdGFydAogID0gYWRkaXRpdmUKCmFkZGl0aXZlCiAgPSBsZWZ0Om11bHRpcGxpY2F0aXZlICIrIiByaWdodDphZGRpdGl2ZSB7IHJldHVybiBsZWZ0ICsgcmlnaHQ7IH0KICAvIG11bHRpcGxpY2F0aXZlCgptdWx0aXBsaWNhdGl2ZQogID0gbGVmdDpwcmltYXJ5ICIqIiByaWdodDptdWx0aXBsaWNhdGl2ZSB7IHJldHVybiBsZWZ0ICogcmlnaHQ7IH0KICAvIHByaW1hcnkKCnByaW1hcnkKICA9IGludGVnZXIKICAvICIoIiBhZGRpdGl2ZTphZGRpdGl2ZSAiKSIgeyByZXR1cm4gYWRkaXRpdmU7IH0KCmludGVnZXIgImludGVnZXIiCiAgPSBkaWdpdHM6WzAtOV0rIHsgcmV0dXJuIHBhcnNlSW50KGRpZ2l0cy5qb2luKCIiKSwgMTApOyB9CgpsZXR0ZXIgPSBbYS16XSs8L3RleHRhcmVhPjwvZm9ybT4KICAgICAgPHNjcmlwdD4KICAgICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgICAgICAgbW9kZToge25hbWU6ICJwZWdqcyJ9LAogICAgICAgICAgbGluZU51bWJlcnM6IHRydWUKICAgICAgICB9KTsKICAgICAgPC9zY3JpcHQ+CiAgICAgIDxoMz5UaGUgUEVHLmpzIE1vZGU8L2gzPgogICAgICA8cD4gQ3JlYXRlZCBieSBGb3JiZXMgTGluZGVzYXkuPC9wPgogICAgPC9hcnRpY2xlPgogIDwvYm9keT4KPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/pegjs/pegjs.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSwgcmVxdWlyZSgiLi4vamF2YXNjcmlwdC9qYXZhc2NyaXB0IikpOwogIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kKSAvLyBBTUQKICAgIGRlZmluZShbIi4uLy4uL2xpYi9jb2RlbWlycm9yIiwgIi4uL2phdmFzY3JpcHQvamF2YXNjcmlwdCJdLCBtb2QpOwogIGVsc2UgLy8gUGxhaW4gYnJvd3NlciBlbnYKICAgIG1vZChDb2RlTWlycm9yKTsKfSkoZnVuY3Rpb24oQ29kZU1pcnJvcikgewoidXNlIHN0cmljdCI7CgpDb2RlTWlycm9yLmRlZmluZU1vZGUoInBlZ2pzIiwgZnVuY3Rpb24gKGNvbmZpZykgewogIHZhciBqc01vZGUgPSBDb2RlTWlycm9yLmdldE1vZGUoY29uZmlnLCAiamF2YXNjcmlwdCIpOwoKICBmdW5jdGlvbiBpZGVudGlmaWVyKHN0cmVhbSkgewogICAgcmV0dXJuIHN0cmVhbS5tYXRjaCgvXlthLXpBLVpfXVthLXpBLVowLTlfXSovKTsKICB9CgogIHJldHVybiB7CiAgICBzdGFydFN0YXRlOiBmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgaW5TdHJpbmc6IGZhbHNlLAogICAgICAgIHN0cmluZ1R5cGU6IG51bGwsCiAgICAgICAgaW5Db21tZW50OiBmYWxzZSwKICAgICAgICBpbkNocmFjdGVyQ2xhc3M6IGZhbHNlLAogICAgICAgIGJyYWNlZDogMCwKICAgICAgICBsaHM6IHRydWUsCiAgICAgICAgbG9jYWxTdGF0ZTogbnVsbAogICAgICB9OwogICAgfSwKICAgIHRva2VuOiBmdW5jdGlvbiAoc3RyZWFtLCBzdGF0ZSkgewogICAgICBpZiAoc3RyZWFtKQoKICAgICAgLy9jaGVjayBmb3Igc3RhdGUgY2hhbmdlcwogICAgICBpZiAoIXN0YXRlLmluU3RyaW5nICYmICFzdGF0ZS5pbkNvbW1lbnQgJiYgKChzdHJlYW0ucGVlaygpID09ICciJykgfHwgKHN0cmVhbS5wZWVrKCkgPT0gIiciKSkpIHsKICAgICAgICBzdGF0ZS5zdHJpbmdUeXBlID0gc3RyZWFtLnBlZWsoKTsKICAgICAgICBzdHJlYW0ubmV4dCgpOyAvLyBTa2lwIHF1b3RlCiAgICAgICAgc3RhdGUuaW5TdHJpbmcgPSB0cnVlOyAvLyBVcGRhdGUgc3RhdGUKICAgICAgfQogICAgICBpZiAoIXN0YXRlLmluU3RyaW5nICYmICFzdGF0ZS5pbkNvbW1lbnQgJiYgc3RyZWFtLm1hdGNoKC9eXC9cKi8pKSB7CiAgICAgICAgc3RhdGUuaW5Db21tZW50ID0gdHJ1ZTsKICAgICAgfQoKICAgICAgLy9yZXR1cm4gc3RhdGUKICAgICAgaWYgKHN0YXRlLmluU3RyaW5nKSB7CiAgICAgICAgd2hpbGUgKHN0YXRlLmluU3RyaW5nICYmICFzdHJlYW0uZW9sKCkpIHsKICAgICAgICAgIGlmIChzdHJlYW0ucGVlaygpID09PSBzdGF0ZS5zdHJpbmdUeXBlKSB7CiAgICAgICAgICAgIHN0cmVhbS5uZXh0KCk7IC8vIFNraXAgcXVvdGUKICAgICAgICAgICAgc3RhdGUuaW5TdHJpbmcgPSBmYWxzZTsgLy8gQ2xlYXIgZmxhZwogICAgICAgICAgfSBlbHNlIGlmIChzdHJlYW0ucGVlaygpID09PSAnXFwnKSB7CiAgICAgICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdHJlYW0ubWF0Y2goL14uW15cXFwiXCddKi8pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gc3RhdGUubGhzID8gInByb3BlcnR5IHN0cmluZyIgOiAic3RyaW5nIjsgLy8gVG9rZW4gc3R5bGUKICAgICAgfSBlbHNlIGlmIChzdGF0ZS5pbkNvbW1lbnQpIHsKICAgICAgICB3aGlsZSAoc3RhdGUuaW5Db21tZW50ICYmICFzdHJlYW0uZW9sKCkpIHsKICAgICAgICAgIGlmIChzdHJlYW0ubWF0Y2goL1wqXC8vKSkgewogICAgICAgICAgICBzdGF0ZS5pbkNvbW1lbnQgPSBmYWxzZTsgLy8gQ2xlYXIgZmxhZwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3RyZWFtLm1hdGNoKC9eLlteXCpdKi8pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gImNvbW1lbnQiOwogICAgICB9IGVsc2UgaWYgKHN0YXRlLmluQ2hyYWN0ZXJDbGFzcykgewogICAgICAgICAgd2hpbGUgKHN0YXRlLmluQ2hyYWN0ZXJDbGFzcyAmJiAhc3RyZWFtLmVvbCgpKSB7CiAgICAgICAgICAgIGlmICghKHN0cmVhbS5tYXRjaCgvXlteXF1cXF0rLykgfHwgc3RyZWFtLm1hdGNoKC9eXFwuLykpKSB7CiAgICAgICAgICAgICAgc3RhdGUuaW5DaHJhY3RlckNsYXNzID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChzdHJlYW0ucGVlaygpID09PSAnWycpIHsKICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgIHN0YXRlLmluQ2hyYWN0ZXJDbGFzcyA9IHRydWU7CiAgICAgICAgcmV0dXJuICdicmFja2V0JzsKICAgICAgfSBlbHNlIGlmIChzdHJlYW0ubWF0Y2goL15cL1wvLykpIHsKICAgICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICAgICAgcmV0dXJuICJjb21tZW50IjsKICAgICAgfSBlbHNlIGlmIChzdGF0ZS5icmFjZWQgfHwgc3RyZWFtLnBlZWsoKSA9PT0gJ3snKSB7CiAgICAgICAgaWYgKHN0YXRlLmxvY2FsU3RhdGUgPT09IG51bGwpIHsKICAgICAgICAgIHN0YXRlLmxvY2FsU3RhdGUgPSBqc01vZGUuc3RhcnRTdGF0ZSgpOwogICAgICAgIH0KICAgICAgICB2YXIgdG9rZW4gPSBqc01vZGUudG9rZW4oc3RyZWFtLCBzdGF0ZS5sb2NhbFN0YXRlKTsKICAgICAgICB2YXIgdGV4dCA9IHN0cmVhbS5jdXJyZW50KCk7CiAgICAgICAgaWYgKCF0b2tlbikgewogICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGlmICh0ZXh0W2ldID09PSAneycpIHsKICAgICAgICAgICAgICBzdGF0ZS5icmFjZWQrKzsKICAgICAgICAgICAgfSBlbHNlIGlmICh0ZXh0W2ldID09PSAnfScpIHsKICAgICAgICAgICAgICBzdGF0ZS5icmFjZWQtLTsKICAgICAgICAgICAgfQogICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRva2VuOwogICAgICB9IGVsc2UgaWYgKGlkZW50aWZpZXIoc3RyZWFtKSkgewogICAgICAgIGlmIChzdHJlYW0ucGVlaygpID09PSAnOicpIHsKICAgICAgICAgIHJldHVybiAndmFyaWFibGUnOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJ3ZhcmlhYmxlLTInOwogICAgICB9IGVsc2UgaWYgKFsnWycsICddJywgJygnLCAnKSddLmluZGV4T2Yoc3RyZWFtLnBlZWsoKSkgIT0gLTEpIHsKICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgIHJldHVybiAnYnJhY2tldCc7CiAgICAgIH0gZWxzZSBpZiAoIXN0cmVhbS5lYXRTcGFjZSgpKSB7CiAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgfQogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICB9Owp9LCAiamF2YXNjcmlwdCIpOwoKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/perl/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/perl/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogUGVybCBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9InBlcmwuanMiPjwvc2NyaXB0Pgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPi5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazt9PC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aW1nIGlkPWxvZ28gc3JjPSIuLi8uLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5MYW5ndWFnZSBtb2RlczwvYT4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+UGVybDwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+UGVybCBtb2RlPC9oMj4KCgo8ZGl2Pjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+CiMhL3Vzci9iaW4vcGVybAoKdXNlIFNvbWV0aGluZyBxdyhmdW5jMSBmdW5jMik7CgojIHN0cmluZ3MKbXkgJHMxID0gcXEnc2luZ2xlIGxpbmUnOwpvdXIgJHMyID0gcShtdWx0aS0KICAgICAgICAgICAgICBsaW5lKTsKCj1pdGVtIFNvbWV0aGluZwoJRXhhbXBsZS4KPWN1dAoKbXkgJGh0bWw9PDwnSFRNTCcKPGh0bWw+Cjx0aXRsZT5oaSE8L3RpdGxlPgo8L2h0bWw+CkhUTUwKCnByaW50ICJmaXJzdCwiLmpvaW4oJywnLCAnc2Vjb25kJywgcXF+dGhpcmR+KTsKCmlmKCRzMSA9fiBtWyg/PCFccykobC5uZSlcel1vKSB7CgkkaC0+eyQxfT0kJC4nIHByZWRlZmluZWQgdmFyaWFibGVzJzsKCSRzMiA9fiBzL1wtbGluZS8vb3g7CgkkczEgPX4gc1sKCQkgIGxpbmUgXQoJCVsKCQkgIGJsb2NrCgkJXW94Owp9CgoxOyAjIG51bWJlcnMgYW5kIGNvbW1lbnRzCgpfX0VORF9fCnNvbWV0aGluZy4uLgoKPC90ZXh0YXJlYT48L2Rpdj4KCiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlCiAgICAgIH0pOwogICAgPC9zY3JpcHQ+CgogICAgPHA+PHN0cm9uZz5NSU1FIHR5cGVzIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPnRleHQveC1wZXJsPC9jb2RlPi48L3A+CiAgPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/perl/perl.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovLyBDb2RlTWlycm9yMiBtb2RlL3BlcmwvcGVybC5qcyAodGV4dC94LXBlcmwpIGJldGEgMC4xMCAoMjAxMS0xMS0wOCkKLy8gVGhpcyBpcyBhIHBhcnQgb2YgQ29kZU1pcnJvciBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9zYWJhY2EvQ29kZU1pcnJvcl9tb2RlX3BlcmwgKG1haWxAc2FiYWNhLmNvbSkKCihmdW5jdGlvbihtb2QpIHsKICBpZiAodHlwZW9mIGV4cG9ydHMgPT0gIm9iamVjdCIgJiYgdHlwZW9mIG1vZHVsZSA9PSAib2JqZWN0IikgLy8gQ29tbW9uSlMKICAgIG1vZChyZXF1aXJlKCIuLi8uLi9saWIvY29kZW1pcnJvciIpKTsKICBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCkgLy8gQU1ECiAgICBkZWZpbmUoWyIuLi8uLi9saWIvY29kZW1pcnJvciJdLCBtb2QpOwogIGVsc2UgLy8gUGxhaW4gYnJvd3NlciBlbnYKICAgIG1vZChDb2RlTWlycm9yKTsKfSkoZnVuY3Rpb24oQ29kZU1pcnJvcikgewoidXNlIHN0cmljdCI7CgpDb2RlTWlycm9yLmRlZmluZU1vZGUoInBlcmwiLGZ1bmN0aW9uKCl7CiAgICAgICAgLy8gaHR0cDovL3Blcmxkb2MucGVybC5vcmcKICAgICAgICB2YXIgUEVSTD17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgIG51bGwgLSBtYWdpYyB0b3VjaAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgMSAtIGtleXdvcmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgIDIgLSBkZWYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgIDMgLSBhdG9tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICA0IC0gb3BlcmF0b3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgIDUgLSB2YXJpYWJsZS0yIChwcmVkZWZpbmVkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgW3gseV0gLSB4PTEsMiwzOyB5PW11c3QgYmUgZGVmaW5lZCBpZiB4ey4uLn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICBQRVJMIG9wZXJhdG9ycwogICAgICAgICAgICAgICAgJy0+JyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgNCwKICAgICAgICAgICAgICAgICcrKycgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgIDQsCiAgICAgICAgICAgICAgICAnLS0nICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICA0LAogICAgICAgICAgICAgICAgJyoqJyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICEgfiBcIGFuZCB1bmFyeSArIGFuZCAtCiAgICAgICAgICAgICAgICAnPX4nICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICA0LAogICAgICAgICAgICAgICAgJyF+JyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgNCwKICAgICAgICAgICAgICAgICcqJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgIDQsCiAgICAgICAgICAgICAgICAnLycgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICA0LAogICAgICAgICAgICAgICAgJyUnICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgNCwKICAgICAgICAgICAgICAgICd4JyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgIDQsCiAgICAgICAgICAgICAgICAnKycgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICA0LAogICAgICAgICAgICAgICAgJy0nICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgNCwKICAgICAgICAgICAgICAgICcuJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgIDQsCiAgICAgICAgICAgICAgICAnPDwnICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICA0LAogICAgICAgICAgICAgICAgJz4+JyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgIG5hbWVkIHVuYXJ5IG9wZXJhdG9ycwogICAgICAgICAgICAgICAgJzwnICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgNCwKICAgICAgICAgICAgICAgICc+JyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgIDQsCiAgICAgICAgICAgICAgICAnPD0nICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICA0LAogICAgICAgICAgICAgICAgJz49JyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgNCwKICAgICAgICAgICAgICAgICdsdCcgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgIDQsCiAgICAgICAgICAgICAgICAnZ3QnICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICA0LAogICAgICAgICAgICAgICAgJ2xlJyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgNCwKICAgICAgICAgICAgICAgICdnZScgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgIDQsCiAgICAgICAgICAgICAgICAnPT0nICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICA0LAogICAgICAgICAgICAgICAgJyE9JyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgNCwKICAgICAgICAgICAgICAgICc8PT4nICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgIDQsCiAgICAgICAgICAgICAgICAnZXEnICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICA0LAogICAgICAgICAgICAgICAgJ25lJyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgNCwKICAgICAgICAgICAgICAgICdjbXAnICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgIDQsCiAgICAgICAgICAgICAgICAnfn4nICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICA0LAogICAgICAgICAgICAgICAgJyYnICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgNCwKICAgICAgICAgICAgICAgICd8JyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgIDQsCiAgICAgICAgICAgICAgICAnXicgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICA0LAogICAgICAgICAgICAgICAgJyYmJyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgNCwKICAgICAgICAgICAgICAgICd8fCcgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgIDQsCiAgICAgICAgICAgICAgICAnLy8nICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICA0LAogICAgICAgICAgICAgICAgJy4uJyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgNCwKICAgICAgICAgICAgICAgICcuLi4nICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgIDQsCiAgICAgICAgICAgICAgICAnPycgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICA0LAogICAgICAgICAgICAgICAgJzonICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgNCwKICAgICAgICAgICAgICAgICc9JyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgIDQsCiAgICAgICAgICAgICAgICAnKz0nICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICA0LAogICAgICAgICAgICAgICAgJy09JyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgNCwKICAgICAgICAgICAgICAgICcqPScgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgIDQsICAvLyAgIGV0Yy4gPz8/CiAgICAgICAgICAgICAgICAnLCcgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICA0LAogICAgICAgICAgICAgICAgJz0+JyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgNCwKICAgICAgICAgICAgICAgICc6OicgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgIDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBsaXN0IG9wZXJhdG9ycyAocmlnaHR3YXJkKQogICAgICAgICAgICAgICAgJ25vdCcgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgNCwKICAgICAgICAgICAgICAgICdhbmQnICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgIDQsCiAgICAgICAgICAgICAgICAnb3InICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICA0LAogICAgICAgICAgICAgICAgJ3hvcicgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICBQRVJMIHByZWRlZmluZWQgdmFyaWFibGVzIChJIGtub3csIHdoYXQgdGhpcyBpcyBhIHBhcmFub2lkIGlkZWEsIGJ1dCBtYXkgYmUgbmVlZGVkIGZvciBwZW9wbGUsIHdobyBsZWFybiBQRVJMLCBhbmQgZm9yIG1lIGFzIHdlbGwsIC4uLmFuZCBtYXkgYmUgZm9yIHlvdT87KQogICAgICAgICAgICAgICAgJ0JFR0lOJyAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgWzUsMV0sCiAgICAgICAgICAgICAgICAnRU5EJyAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICBbNSwxXSwKICAgICAgICAgICAgICAgICdQUklOVCcgICAgICAgICAgICAgICAgICAgICAgICAgOiAgIFs1LDFdLAogICAgICAgICAgICAgICAgJ1BSSU5URicgICAgICAgICAgICAgICAgICAgICAgICA6ICAgWzUsMV0sCiAgICAgICAgICAgICAgICAnR0VUQycgICAgICAgICAgICAgICAgICAgICAgICAgIDogICBbNSwxXSwKICAgICAgICAgICAgICAgICdSRUFEJyAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgIFs1LDFdLAogICAgICAgICAgICAgICAgJ1JFQURMSU5FJyAgICAgICAgICAgICAgICAgICAgICA6ICAgWzUsMV0sCiAgICAgICAgICAgICAgICAnREVTVFJPWScgICAgICAgICAgICAgICAgICAgICAgIDogICBbNSwxXSwKICAgICAgICAgICAgICAgICdUSUUnICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgIFs1LDFdLAogICAgICAgICAgICAgICAgJ1RJRUhBTkRMRScgICAgICAgICAgICAgICAgICAgICA6ICAgWzUsMV0sCiAgICAgICAgICAgICAgICAnVU5USUUnICAgICAgICAgICAgICAgICAgICAgICAgIDogICBbNSwxXSwKICAgICAgICAgICAgICAgICdTVERJTicgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJ1NURElOX1RPUCcgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnU1RET1VUJyAgICAgICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICdTVERPVVRfVE9QJyAgICAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJ1NUREVSUicgICAgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnU1RERVJSX1RPUCcgICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckQVJHJyAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyRfJyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnQEFSRycgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICdAXycgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyRMSVNUX1NFUEFSQVRPUicgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJCInICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckUFJPQ0VTU19JRCcgICAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyRQSUQnICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJCQnICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckUkVBTF9HUk9VUF9JRCcgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyRHSUQnICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJCgnICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckRUZGRUNUSVZFX0dST1VQX0lEJyAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyRFR0lEJyAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJCknICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckUFJPR1JBTV9OQU1FJyAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyQwJyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJFNVQlNDUklQVF9TRVBBUkFUT1InICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckU1VCU0VQJyAgICAgICAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyQ7JyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJFJFQUxfVVNFUl9JRCcgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckVUlEJyAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyQ8JyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJEVGRkVDVElWRV9VU0VSX0lEJyAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckRVVJRCcgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyQ+JyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJGEnICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckYicgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyRDT01QSUxJTkcnICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJF5DJyAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckREVCVUdHSU5HJyAgICAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyReRCcgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJHteRU5DT0RJTkd9JyAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckRU5WJyAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyVFTlYnICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJFNZU1RFTV9GRF9NQVgnICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckXkYnICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJ0BGJyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJHteR0xPQkFMX1BIQVNFfScgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckXkgnICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyVeSCcgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnQElOQycgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICclSU5DJyAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyRJTlBMQUNFX0VESVQnICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJF5JJyAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckXk0nICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyRPU05BTUUnICAgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJF5PJyAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICcke15PUEVOfScgICAgICAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyRQRVJMREInICAgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJF5QJyAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckU0lHJyAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyVTSUcnICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJEJBU0VUSU1FJyAgICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckXlQnICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyR7XlRBSU5UfScgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJHteVU5JQ09ERX0nICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICcke15VVEY4Q0FDSEV9JyAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyR7XlVURjhMT0NBTEV9JyAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJFBFUkxfVkVSU0lPTicgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckXlYnICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyR7XldJTjMyX1NMT1BQWV9TVEFUfScgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJEVYRUNVVEFCTEVfTkFNRScgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckXlgnICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyQxJyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsIC8vIC0gcmVnZXhwICQxLCAkMi4uLgogICAgICAgICAgICAgICAgJyRNQVRDSCcgICAgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJCYnICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICcke15NQVRDSH0nICAgICAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyRQUkVNQVRDSCcgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJGAnICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICcke15QUkVNQVRDSH0nICAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyRQT1NUTUFUQ0gnICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAiJCciICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICcke15QT1NUTUFUQ0h9JyAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyRMQVNUX1BBUkVOX01BVENIJyAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJCsnICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckTEFTVF9TVUJNQVRDSF9SRVNVTFQnICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyReTicgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnQExBU1RfTUFUQ0hfRU5EJyAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICdAKycgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyVMQVNUX1BBUkVOX01BVENIJyAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJSsnICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICdATEFTVF9NQVRDSF9TVEFSVCcgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJ0AtJyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJUxBU1RfTUFUQ0hfU1RBUlQnICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICclLScgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyRMQVNUX1JFR0VYUF9DT0RFX1JFU1VMVCcgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJF5SJyAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICcke15SRV9ERUJVR19GTEFHU30nICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyR7XlJFX1RSSUVfTUFYQlVGfScgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJEFSR1YnICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICdAQVJHVicgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJ0FSR1YnICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnQVJHVk9VVCcgICAgICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckT1VUUFVUX0ZJRUxEX1NFUEFSQVRPUicgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyRPRlMnICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJCwnICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckSU5QVVRfTElORV9OVU1CRVInICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyROUicgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJC4nICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckSU5QVVRfUkVDT1JEX1NFUEFSQVRPUicgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyRSUycgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJC8nICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckT1VUUFVUX1JFQ09SRF9TRVBBUkFUT1InICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyRPUlMnICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJFxcJyAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckT1VUUFVUX0FVVE9GTFVTSCcgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyR8JyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJEFDQ1VNVUxBVE9SJyAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckXkEnICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyRGT1JNQVRfRk9STUZFRUQnICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJF5MJyAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckRk9STUFUX1BBR0VfTlVNQkVSJyAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyQlJyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJEZPUk1BVF9MSU5FU19MRUZUJyAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckLScgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyRGT1JNQVRfTElORV9CUkVBS19DSEFSQUNURVJTJyA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJDonICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckRk9STUFUX0xJTkVTX1BFUl9QQUdFJyAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyQ9JyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJEZPUk1BVF9UT1BfTkFNRScgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckXicgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyRGT1JNQVRfTkFNRScgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJH4nICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICcke15DSElMRF9FUlJPUl9OQVRJVkV9JyAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyRFWFRFTkRFRF9PU19FUlJPUicgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJF5FJyAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckRVhDRVBUSU9OU19CRUlOR19DQVVHSFQnICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyReUycgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJFdBUk5JTkcnICAgICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckXlcnICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyR7XldBUk5JTkdfQklUU30nICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJE9TX0VSUk9SJyAgICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckRVJSTk8nICAgICAgICAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyQhJyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJU9TX0VSUk9SJyAgICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICclRVJSTk8nICAgICAgICAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyUhJyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJENISUxEX0VSUk9SJyAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckPycgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyRFVkFMX0VSUk9SJyAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJEAnICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckT0ZNVCcgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyQjJyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJConICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckQVJSQVlfQkFTRScgICAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyRbJyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJE9MRF9QRVJMX1ZFUlNJT04nICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckXScgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgIFBFUkwgYmxvY2tzCiAgICAgICAgICAgICAgICAnaWYnICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpbMSwxXSwKICAgICAgICAgICAgICAgIGVsc2lmICAgICAgICAgICAgICAgICAgICAgICAgICAgOlsxLDFdLAogICAgICAgICAgICAgICAgJ2Vsc2UnICAgICAgICAgICAgICAgICAgICAgICAgICA6WzEsMV0sCiAgICAgICAgICAgICAgICAnd2hpbGUnICAgICAgICAgICAgICAgICAgICAgICAgIDpbMSwxXSwKICAgICAgICAgICAgICAgIHVubGVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgOlsxLDFdLAogICAgICAgICAgICAgICAgJ2ZvcicgICAgICAgICAgICAgICAgICAgICAgICAgICA6WzEsMV0sCiAgICAgICAgICAgICAgICBmb3JlYWNoICAgICAgICAgICAgICAgICAgICAgICAgIDpbMSwxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICBQRVJMIGZ1bmN0aW9ucwogICAgICAgICAgICAgICAgJ2FicycgICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gYWJzb2x1dGUgdmFsdWUgZnVuY3Rpb24KICAgICAgICAgICAgICAgIGFjY2VwdCAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGFjY2VwdCBhbiBpbmNvbWluZyBzb2NrZXQgY29ubmVjdAogICAgICAgICAgICAgICAgYWxhcm0gICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gc2NoZWR1bGUgYSBTSUdBTFJNCiAgICAgICAgICAgICAgICAnYXRhbjInICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBhcmN0YW5nZW50IG9mIFkvWCBpbiB0aGUgcmFuZ2UgLVBJIHRvIFBJCiAgICAgICAgICAgICAgICBiaW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBiaW5kcyBhbiBhZGRyZXNzIHRvIGEgc29ja2V0CiAgICAgICAgICAgICAgICBiaW5tb2RlICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBwcmVwYXJlIGJpbmFyeSBmaWxlcyBmb3IgSS9PCiAgICAgICAgICAgICAgICBibGVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBjcmVhdGUgYW4gb2JqZWN0CiAgICAgICAgICAgICAgICBib290c3RyYXAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8KICAgICAgICAgICAgICAgICdicmVhaycgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGJyZWFrIG91dCBvZiBhICJnaXZlbiIgYmxvY2sKICAgICAgICAgICAgICAgIGNhbGxlciAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGdldCBjb250ZXh0IG9mIHRoZSBjdXJyZW50IHN1YnJvdXRpbmUgY2FsbAogICAgICAgICAgICAgICAgY2hkaXIgICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gY2hhbmdlIHlvdXIgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeQogICAgICAgICAgICAgICAgY2htb2QgICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gY2hhbmdlcyB0aGUgcGVybWlzc2lvbnMgb24gYSBsaXN0IG9mIGZpbGVzCiAgICAgICAgICAgICAgICBjaG9tcCAgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSByZW1vdmUgYSB0cmFpbGluZyByZWNvcmQgc2VwYXJhdG9yIGZyb20gYSBzdHJpbmcKICAgICAgICAgICAgICAgIGNob3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIHJlbW92ZSB0aGUgbGFzdCBjaGFyYWN0ZXIgZnJvbSBhIHN0cmluZwogICAgICAgICAgICAgICAgY2hvd24gICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gY2hhbmdlIHRoZSBvd2Vyc2hpcCBvbiBhIGxpc3Qgb2YgZmlsZXMKICAgICAgICAgICAgICAgIGNociAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGdldCBjaGFyYWN0ZXIgdGhpcyBudW1iZXIgcmVwcmVzZW50cwogICAgICAgICAgICAgICAgY2hyb290ICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gbWFrZSBkaXJlY3RvcnkgbmV3IHJvb3QgZm9yIHBhdGggbG9va3VwcwogICAgICAgICAgICAgICAgY2xvc2UgICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gY2xvc2UgZmlsZSAob3IgcGlwZSBvciBzb2NrZXQpIGhhbmRsZQogICAgICAgICAgICAgICAgY2xvc2VkaXIgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gY2xvc2UgZGlyZWN0b3J5IGhhbmRsZQogICAgICAgICAgICAgICAgY29ubmVjdCAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gY29ubmVjdCB0byBhIHJlbW90ZSBzb2NrZXQKICAgICAgICAgICAgICAgICdjb250aW51ZScgICAgICAgICAgICAgICAgICAgICAgOlsxLDFdLCAvLyAtIG9wdGlvbmFsIHRyYWlsaW5nIGJsb2NrIGluIGEgd2hpbGUgb3IgZm9yZWFjaAogICAgICAgICAgICAgICAgJ2NvcycgICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gY29zaW5lIGZ1bmN0aW9uCiAgICAgICAgICAgICAgICBjcnlwdCAgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBvbmUtd2F5IHBhc3N3ZC1zdHlsZSBlbmNyeXB0aW9uCiAgICAgICAgICAgICAgICBkYm1jbG9zZSAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBicmVha3MgYmluZGluZyBvbiBhIHRpZWQgZGJtIGZpbGUKICAgICAgICAgICAgICAgIGRibW9wZW4gICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGNyZWF0ZSBiaW5kaW5nIG9uIGEgdGllZCBkYm0gZmlsZQogICAgICAgICAgICAgICAgJ2RlZmF1bHQnICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vCiAgICAgICAgICAgICAgICBkZWZpbmVkICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSB0ZXN0IHdoZXRoZXIgYSB2YWx1ZSwgdmFyaWFibGUsIG9yIGZ1bmN0aW9uIGlzIGRlZmluZWQKICAgICAgICAgICAgICAgICdkZWxldGUnICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGRlbGV0ZXMgYSB2YWx1ZSBmcm9tIGEgaGFzaAogICAgICAgICAgICAgICAgZGllICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gcmFpc2UgYW4gZXhjZXB0aW9uIG9yIGJhaWwgb3V0CiAgICAgICAgICAgICAgICAnZG8nICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSB0dXJuIGEgQkxPQ0sgaW50byBhIFRFUk0KICAgICAgICAgICAgICAgIGR1bXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGNyZWF0ZSBhbiBpbW1lZGlhdGUgY29yZSBkdW1wCiAgICAgICAgICAgICAgICBlYWNoICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSByZXRyaWV2ZSB0aGUgbmV4dCBrZXkvdmFsdWUgcGFpciBmcm9tIGEgaGFzaAogICAgICAgICAgICAgICAgZW5kZ3JlbnQgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gYmUgZG9uZSB1c2luZyBncm91cCBmaWxlCiAgICAgICAgICAgICAgICBlbmRob3N0ZW50ICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBiZSBkb25lIHVzaW5nIGhvc3RzIGZpbGUKICAgICAgICAgICAgICAgIGVuZG5ldGVudCAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGJlIGRvbmUgdXNpbmcgbmV0d29ya3MgZmlsZQogICAgICAgICAgICAgICAgZW5kcHJvdG9lbnQgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gYmUgZG9uZSB1c2luZyBwcm90b2NvbHMgZmlsZQogICAgICAgICAgICAgICAgZW5kcHdlbnQgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gYmUgZG9uZSB1c2luZyBwYXNzd2QgZmlsZQogICAgICAgICAgICAgICAgZW5kc2VydmVudCAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gYmUgZG9uZSB1c2luZyBzZXJ2aWNlcyBmaWxlCiAgICAgICAgICAgICAgICBlb2YgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSB0ZXN0IGEgZmlsZWhhbmRsZSBmb3IgaXRzIGVuZAogICAgICAgICAgICAgICAgJ2V2YWwnICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gY2F0Y2ggZXhjZXB0aW9ucyBvciBjb21waWxlIGFuZCBydW4gY29kZQogICAgICAgICAgICAgICAgJ2V4ZWMnICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gYWJhbmRvbiB0aGlzIHByb2dyYW0gdG8gcnVuIGFub3RoZXIKICAgICAgICAgICAgICAgIGV4aXN0cyAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIHRlc3Qgd2hldGhlciBhIGhhc2gga2V5IGlzIHByZXNlbnQKICAgICAgICAgICAgICAgIGV4aXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIHRlcm1pbmF0ZSB0aGlzIHByb2dyYW0KICAgICAgICAgICAgICAgICdleHAnICAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIHJhaXNlIEkgdG8gYSBwb3dlcgogICAgICAgICAgICAgICAgZmNudGwgICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gZmlsZSBjb250cm9sIHN5c3RlbSBjYWxsCiAgICAgICAgICAgICAgICBmaWxlbm8gICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSByZXR1cm4gZmlsZSBkZXNjcmlwdG9yIGZyb20gZmlsZWhhbmRsZQogICAgICAgICAgICAgICAgZmxvY2sgICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gbG9jayBhbiBlbnRpcmUgZmlsZSB3aXRoIGFuIGFkdmlzb3J5IGxvY2sKICAgICAgICAgICAgICAgIGZvcmsgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGNyZWF0ZSBhIG5ldyBwcm9jZXNzIGp1c3QgbGlrZSB0aGlzIG9uZQogICAgICAgICAgICAgICAgZm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gZGVjbGFyZSBhIHBpY3R1cmUgZm9ybWF0IHdpdGggdXNlIGJ5IHRoZSB3cml0ZSgpIGZ1bmN0aW9uCiAgICAgICAgICAgICAgICBmb3JtbGluZSAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBpbnRlcm5hbCBmdW5jdGlvbiB1c2VkIGZvciBmb3JtYXRzCiAgICAgICAgICAgICAgICBnZXRjICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBnZXQgdGhlIG5leHQgY2hhcmFjdGVyIGZyb20gdGhlIGZpbGVoYW5kbGUKICAgICAgICAgICAgICAgIGdldGdyZW50ICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGdldCBuZXh0IGdyb3VwIHJlY29yZAogICAgICAgICAgICAgICAgZ2V0Z3JnaWQgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gZ2V0IGdyb3VwIHJlY29yZCBnaXZlbiBncm91cCB1c2VyIElECiAgICAgICAgICAgICAgICBnZXRncm5hbSAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBnZXQgZ3JvdXAgcmVjb3JkIGdpdmVuIGdyb3VwIG5hbWUKICAgICAgICAgICAgICAgIGdldGhvc3RieWFkZHIgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGdldCBob3N0IHJlY29yZCBnaXZlbiBpdHMgYWRkcmVzcwogICAgICAgICAgICAgICAgZ2V0aG9zdGJ5bmFtZSAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gZ2V0IGhvc3QgcmVjb3JkIGdpdmVuIG5hbWUKICAgICAgICAgICAgICAgIGdldGhvc3RlbnQgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGdldCBuZXh0IGhvc3RzIHJlY29yZAogICAgICAgICAgICAgICAgZ2V0bG9naW4gICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gcmV0dXJuIHdobyBsb2dnZWQgaW4gYXQgdGhpcyB0dHkKICAgICAgICAgICAgICAgIGdldG5ldGJ5YWRkciAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGdldCBuZXR3b3JrIHJlY29yZCBnaXZlbiBpdHMgYWRkcmVzcwogICAgICAgICAgICAgICAgZ2V0bmV0YnluYW1lICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gZ2V0IG5ldHdvcmtzIHJlY29yZCBnaXZlbiBuYW1lCiAgICAgICAgICAgICAgICBnZXRuZXRlbnQgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBnZXQgbmV4dCBuZXR3b3JrcyByZWNvcmQKICAgICAgICAgICAgICAgIGdldHBlZXJuYW1lICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGZpbmQgdGhlIG90aGVyIGVuZCBvZiBhIHNvY2tldCBjb25uZWN0aW9uCiAgICAgICAgICAgICAgICBnZXRwZ3JwICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBnZXQgcHJvY2VzcyBncm91cAogICAgICAgICAgICAgICAgZ2V0cHBpZCAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gZ2V0IHBhcmVudCBwcm9jZXNzIElECiAgICAgICAgICAgICAgICBnZXRwcmlvcml0eSAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBnZXQgY3VycmVudCBuaWNlIHZhbHVlCiAgICAgICAgICAgICAgICBnZXRwcm90b2J5bmFtZSAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBnZXQgcHJvdG9jb2wgcmVjb3JkIGdpdmVuIG5hbWUKICAgICAgICAgICAgICAgIGdldHByb3RvYnludW1iZXIgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGdldCBwcm90b2NvbCByZWNvcmQgbnVtZXJpYyBwcm90b2NvbAogICAgICAgICAgICAgICAgZ2V0cHJvdG9lbnQgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gZ2V0IG5leHQgcHJvdG9jb2xzIHJlY29yZAogICAgICAgICAgICAgICAgZ2V0cHdlbnQgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gZ2V0IG5leHQgcGFzc3dkIHJlY29yZAogICAgICAgICAgICAgICAgZ2V0cHduYW0gICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gZ2V0IHBhc3N3ZCByZWNvcmQgZ2l2ZW4gdXNlciBsb2dpbiBuYW1lCiAgICAgICAgICAgICAgICBnZXRwd3VpZCAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBnZXQgcGFzc3dkIHJlY29yZCBnaXZlbiB1c2VyIElECiAgICAgICAgICAgICAgICBnZXRzZXJ2YnluYW1lICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBnZXQgc2VydmljZXMgcmVjb3JkIGdpdmVuIGl0cyBuYW1lCiAgICAgICAgICAgICAgICBnZXRzZXJ2Ynlwb3J0ICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBnZXQgc2VydmljZXMgcmVjb3JkIGdpdmVuIG51bWVyaWMgcG9ydAogICAgICAgICAgICAgICAgZ2V0c2VydmVudCAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gZ2V0IG5leHQgc2VydmljZXMgcmVjb3JkCiAgICAgICAgICAgICAgICBnZXRzb2NrbmFtZSAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSByZXRyaWV2ZSB0aGUgc29ja2FkZHIgZm9yIGEgZ2l2ZW4gc29ja2V0CiAgICAgICAgICAgICAgICBnZXRzb2Nrb3B0ICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBnZXQgc29ja2V0IG9wdGlvbnMgb24gYSBnaXZlbiBzb2NrZXQKICAgICAgICAgICAgICAgIGdpdmVuICAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLwogICAgICAgICAgICAgICAgZ2xvYiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gZXhwYW5kIGZpbGVuYW1lcyB1c2luZyB3aWxkY2FyZHMKICAgICAgICAgICAgICAgIGdtdGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGNvbnZlcnQgVU5JWCB0aW1lIGludG8gcmVjb3JkIG9yIHN0cmluZyB1c2luZyBHcmVlbndpY2ggdGltZQogICAgICAgICAgICAgICAgJ2dvdG8nICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gY3JlYXRlIHNwYWdoZXR0aSBjb2RlCiAgICAgICAgICAgICAgICBncmVwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBsb2NhdGUgZWxlbWVudHMgaW4gYSBsaXN0IHRlc3QgdHJ1ZSBhZ2FpbnN0IGEgZ2l2ZW4gY3JpdGVyaW9uCiAgICAgICAgICAgICAgICBoZXggICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBjb252ZXJ0IGEgc3RyaW5nIHRvIGEgaGV4YWRlY2ltYWwgbnVtYmVyCiAgICAgICAgICAgICAgICAnaW1wb3J0JyAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBwYXRjaCBhIG1vZHVsZSdzIG5hbWVzcGFjZSBpbnRvIHlvdXIgb3duCiAgICAgICAgICAgICAgICBpbmRleCAgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBmaW5kIGEgc3Vic3RyaW5nIHdpdGhpbiBhIHN0cmluZwogICAgICAgICAgICAgICAgJ2ludCcgICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gZ2V0IHRoZSBpbnRlZ2VyIHBvcnRpb24gb2YgYSBudW1iZXIKICAgICAgICAgICAgICAgIGlvY3RsICAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIHN5c3RlbS1kZXBlbmRlbnQgZGV2aWNlIGNvbnRyb2wgc3lzdGVtIGNhbGwKICAgICAgICAgICAgICAgICdqb2luJyAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGpvaW4gYSBsaXN0IGludG8gYSBzdHJpbmcgdXNpbmcgYSBzZXBhcmF0b3IKICAgICAgICAgICAgICAgIGtleXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIHJldHJpZXZlIGxpc3Qgb2YgaW5kaWNlcyBmcm9tIGEgaGFzaAogICAgICAgICAgICAgICAga2lsbCAgICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gc2VuZCBhIHNpZ25hbCB0byBhIHByb2Nlc3Mgb3IgcHJvY2VzcyBncm91cAogICAgICAgICAgICAgICAgbGFzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gZXhpdCBhIGJsb2NrIHByZW1hdHVyZWx5CiAgICAgICAgICAgICAgICBsYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSByZXR1cm4gbG93ZXItY2FzZSB2ZXJzaW9uIG9mIGEgc3RyaW5nCiAgICAgICAgICAgICAgICBsY2ZpcnN0ICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSByZXR1cm4gYSBzdHJpbmcgd2l0aCBqdXN0IHRoZSBuZXh0IGxldHRlciBpbiBsb3dlciBjYXNlCiAgICAgICAgICAgICAgICBsZW5ndGggICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSByZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBpbiBhIHN0cmluZwogICAgICAgICAgICAgICAgJ2xpbmsnICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gY3JlYXRlIGEgaGFyZCBsaW5rIGluIHRoZSBmaWxlc3l0ZW0KICAgICAgICAgICAgICAgIGxpc3RlbiAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIHJlZ2lzdGVyIHlvdXIgc29ja2V0IGFzIGEgc2VydmVyCiAgICAgICAgICAgICAgICBsb2NhbCAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMiwgICAgLy8gLSBjcmVhdGUgYSB0ZW1wb3JhcnkgdmFsdWUgZm9yIGEgZ2xvYmFsIHZhcmlhYmxlIChkeW5hbWljIHNjb3BpbmcpCiAgICAgICAgICAgICAgICBsb2NhbHRpbWUgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBjb252ZXJ0IFVOSVggdGltZSBpbnRvIHJlY29yZCBvciBzdHJpbmcgdXNpbmcgbG9jYWwgdGltZQogICAgICAgICAgICAgICAgbG9jayAgICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gZ2V0IGEgdGhyZWFkIGxvY2sgb24gYSB2YXJpYWJsZSwgc3Vicm91dGluZSwgb3IgbWV0aG9kCiAgICAgICAgICAgICAgICAnbG9nJyAgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSByZXRyaWV2ZSB0aGUgbmF0dXJhbCBsb2dhcml0aG0gZm9yIGEgbnVtYmVyCiAgICAgICAgICAgICAgICBsc3RhdCAgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBzdGF0IGEgc3ltYm9saWMgbGluawogICAgICAgICAgICAgICAgbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6bnVsbCwgIC8vIC0gbWF0Y2ggYSBzdHJpbmcgd2l0aCBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuCiAgICAgICAgICAgICAgICBtYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBhcHBseSBhIGNoYW5nZSB0byBhIGxpc3QgdG8gZ2V0IGJhY2sgYSBuZXcgbGlzdCB3aXRoIHRoZSBjaGFuZ2VzCiAgICAgICAgICAgICAgICBta2RpciAgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBjcmVhdGUgYSBkaXJlY3RvcnkKICAgICAgICAgICAgICAgIG1zZ2N0bCAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIFN5c1YgSVBDIG1lc3NhZ2UgY29udHJvbCBvcGVyYXRpb25zCiAgICAgICAgICAgICAgICBtc2dnZXQgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBnZXQgU3lzViBJUEMgbWVzc2FnZSBxdWV1ZQogICAgICAgICAgICAgICAgbXNncmN2ICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gcmVjZWl2ZSBhIFN5c1YgSVBDIG1lc3NhZ2UgZnJvbSBhIG1lc3NhZ2UgcXVldWUKICAgICAgICAgICAgICAgIG1zZ3NuZCAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIHNlbmQgYSBTeXNWIElQQyBtZXNzYWdlIHRvIGEgbWVzc2FnZSBxdWV1ZQogICAgICAgICAgICAgICAgbXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDIsICAgIC8vIC0gZGVjbGFyZSBhbmQgYXNzaWduIGEgbG9jYWwgdmFyaWFibGUgKGxleGljYWwgc2NvcGluZykKICAgICAgICAgICAgICAgICduZXcnICAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLwogICAgICAgICAgICAgICAgbmV4dCAgICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gaXRlcmF0ZSBhIGJsb2NrIHByZW1hdHVyZWx5CiAgICAgICAgICAgICAgICBubyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSB1bmltcG9ydCBzb21lIG1vZHVsZSBzeW1ib2xzIG9yIHNlbWFudGljcyBhdCBjb21waWxlIHRpbWUKICAgICAgICAgICAgICAgIG9jdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGNvbnZlcnQgYSBzdHJpbmcgdG8gYW4gb2N0YWwgbnVtYmVyCiAgICAgICAgICAgICAgICBvcGVuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBvcGVuIGEgZmlsZSwgcGlwZSwgb3IgZGVzY3JpcHRvcgogICAgICAgICAgICAgICAgb3BlbmRpciAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gb3BlbiBhIGRpcmVjdG9yeQogICAgICAgICAgICAgICAgb3JkICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gZmluZCBhIGNoYXJhY3RlcidzIG51bWVyaWMgcmVwcmVzZW50YXRpb24KICAgICAgICAgICAgICAgIG91ciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAyLCAgICAvLyAtIGRlY2xhcmUgYW5kIGFzc2lnbiBhIHBhY2thZ2UgdmFyaWFibGUgKGxleGljYWwgc2NvcGluZykKICAgICAgICAgICAgICAgIHBhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGNvbnZlcnQgYSBsaXN0IGludG8gYSBiaW5hcnkgcmVwcmVzZW50YXRpb24KICAgICAgICAgICAgICAgICdwYWNrYWdlJyAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGRlY2xhcmUgYSBzZXBhcmF0ZSBnbG9iYWwgbmFtZXNwYWNlCiAgICAgICAgICAgICAgICBwaXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBvcGVuIGEgcGFpciBvZiBjb25uZWN0ZWQgZmlsZWhhbmRsZXMKICAgICAgICAgICAgICAgIHBvcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIHJlbW92ZSB0aGUgbGFzdCBlbGVtZW50IGZyb20gYW4gYXJyYXkgYW5kIHJldHVybiBpdAogICAgICAgICAgICAgICAgcG9zICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gZmluZCBvciBzZXQgdGhlIG9mZnNldCBmb3IgdGhlIGxhc3QvbmV4dCBtLy9nIHNlYXJjaAogICAgICAgICAgICAgICAgcHJpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gb3V0cHV0IGEgbGlzdCB0byBhIGZpbGVoYW5kbGUKICAgICAgICAgICAgICAgIHByaW50ZiAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIG91dHB1dCBhIGZvcm1hdHRlZCBsaXN0IHRvIGEgZmlsZWhhbmRsZQogICAgICAgICAgICAgICAgcHJvdG90eXBlICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gZ2V0IHRoZSBwcm90b3R5cGUgKGlmIGFueSkgb2YgYSBzdWJyb3V0aW5lCiAgICAgICAgICAgICAgICBwdXNoICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBhcHBlbmQgb25lIG9yIG1vcmUgZWxlbWVudHMgdG8gYW4gYXJyYXkKICAgICAgICAgICAgICAgIHEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOm51bGwsICAvLyAtIHNpbmdseSBxdW90ZSBhIHN0cmluZwogICAgICAgICAgICAgICAgcXEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6bnVsbCwgIC8vIC0gZG91Ymx5IHF1b3RlIGEgc3RyaW5nCiAgICAgICAgICAgICAgICBxciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpudWxsLCAgLy8gLSBDb21waWxlIHBhdHRlcm4KICAgICAgICAgICAgICAgIHF1b3RlbWV0YSAgICAgICAgICAgICAgICAgICAgICAgOm51bGwsICAvLyAtIHF1b3RlIHJlZ3VsYXIgZXhwcmVzc2lvbiBtYWdpYyBjaGFyYWN0ZXJzCiAgICAgICAgICAgICAgICBxdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpudWxsLCAgLy8gLSBxdW90ZSBhIGxpc3Qgb2Ygd29yZHMKICAgICAgICAgICAgICAgIHF4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOm51bGwsICAvLyAtIGJhY2txdW90ZSBxdW90ZSBhIHN0cmluZwogICAgICAgICAgICAgICAgcmFuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gcmV0cmlldmUgdGhlIG5leHQgcHNldWRvcmFuZG9tIG51bWJlcgogICAgICAgICAgICAgICAgcmVhZCAgICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gZml4ZWQtbGVuZ3RoIGJ1ZmZlcmVkIGlucHV0IGZyb20gYSBmaWxlaGFuZGxlCiAgICAgICAgICAgICAgICByZWFkZGlyICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBnZXQgYSBkaXJlY3RvcnkgZnJvbSBhIGRpcmVjdG9yeSBoYW5kbGUKICAgICAgICAgICAgICAgIHJlYWRsaW5lICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGZldGNoIGEgcmVjb3JkIGZyb20gYSBmaWxlCiAgICAgICAgICAgICAgICByZWFkbGluayAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBkZXRlcm1pbmUgd2hlcmUgYSBzeW1ib2xpYyBsaW5rIGlzIHBvaW50aW5nCiAgICAgICAgICAgICAgICByZWFkcGlwZSAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBleGVjdXRlIGEgc3lzdGVtIGNvbW1hbmQgYW5kIGNvbGxlY3Qgc3RhbmRhcmQgb3V0cHV0CiAgICAgICAgICAgICAgICByZWN2ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSByZWNlaXZlIGEgbWVzc2FnZSBvdmVyIGEgU29ja2V0CiAgICAgICAgICAgICAgICByZWRvICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBzdGFydCB0aGlzIGxvb3AgaXRlcmF0aW9uIG92ZXIgYWdhaW4KICAgICAgICAgICAgICAgIHJlZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGZpbmQgb3V0IHRoZSB0eXBlIG9mIHRoaW5nIGJlaW5nIHJlZmVyZW5jZWQKICAgICAgICAgICAgICAgIHJlbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGNoYW5nZSBhIGZpbGVuYW1lCiAgICAgICAgICAgICAgICByZXF1aXJlICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBsb2FkIGluIGV4dGVybmFsIGZ1bmN0aW9ucyBmcm9tIGEgbGlicmFyeSBhdCBydW50aW1lCiAgICAgICAgICAgICAgICByZXNldCAgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBjbGVhciBhbGwgdmFyaWFibGVzIG9mIGEgZ2l2ZW4gbmFtZQogICAgICAgICAgICAgICAgJ3JldHVybicgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gZ2V0IG91dCBvZiBhIGZ1bmN0aW9uIGVhcmx5CiAgICAgICAgICAgICAgICByZXZlcnNlICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBmbGlwIGEgc3RyaW5nIG9yIGEgbGlzdAogICAgICAgICAgICAgICAgcmV3aW5kZGlyICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gcmVzZXQgZGlyZWN0b3J5IGhhbmRsZQogICAgICAgICAgICAgICAgcmluZGV4ICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gcmlnaHQtdG8tbGVmdCBzdWJzdHJpbmcgc2VhcmNoCiAgICAgICAgICAgICAgICBybWRpciAgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSByZW1vdmUgYSBkaXJlY3RvcnkKICAgICAgICAgICAgICAgIHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOm51bGwsICAvLyAtIHJlcGxhY2UgYSBwYXR0ZXJuIHdpdGggYSBzdHJpbmcKICAgICAgICAgICAgICAgIHNheSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIHByaW50IHdpdGggbmV3bGluZQogICAgICAgICAgICAgICAgc2NhbGFyICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gZm9yY2UgYSBzY2FsYXIgY29udGV4dAogICAgICAgICAgICAgICAgc2VlayAgICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gcmVwb3NpdGlvbiBmaWxlIHBvaW50ZXIgZm9yIHJhbmRvbS1hY2Nlc3MgSS9PCiAgICAgICAgICAgICAgICBzZWVrZGlyICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSByZXBvc2l0aW9uIGRpcmVjdG9yeSBwb2ludGVyCiAgICAgICAgICAgICAgICBzZWxlY3QgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSByZXNldCBkZWZhdWx0IG91dHB1dCBvciBkbyBJL08gbXVsdGlwbGV4aW5nCiAgICAgICAgICAgICAgICBzZW1jdGwgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBTeXNWIHNlbWFwaG9yZSBjb250cm9sIG9wZXJhdGlvbnMKICAgICAgICAgICAgICAgIHNlbWdldCAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGdldCBzZXQgb2YgU3lzViBzZW1hcGhvcmVzCiAgICAgICAgICAgICAgICBzZW1vcCAgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBTeXNWIHNlbWFwaG9yZSBvcGVyYXRpb25zCiAgICAgICAgICAgICAgICBzZW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBzZW5kIGEgbWVzc2FnZSBvdmVyIGEgc29ja2V0CiAgICAgICAgICAgICAgICBzZXRncmVudCAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBwcmVwYXJlIGdyb3VwIGZpbGUgZm9yIHVzZQogICAgICAgICAgICAgICAgc2V0aG9zdGVudCAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gcHJlcGFyZSBob3N0cyBmaWxlIGZvciB1c2UKICAgICAgICAgICAgICAgIHNldG5ldGVudCAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIHByZXBhcmUgbmV0d29ya3MgZmlsZSBmb3IgdXNlCiAgICAgICAgICAgICAgICBzZXRwZ3JwICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBzZXQgdGhlIHByb2Nlc3MgZ3JvdXAgb2YgYSBwcm9jZXNzCiAgICAgICAgICAgICAgICBzZXRwcmlvcml0eSAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBzZXQgYSBwcm9jZXNzJ3MgbmljZSB2YWx1ZQogICAgICAgICAgICAgICAgc2V0cHJvdG9lbnQgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gcHJlcGFyZSBwcm90b2NvbHMgZmlsZSBmb3IgdXNlCiAgICAgICAgICAgICAgICBzZXRwd2VudCAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBwcmVwYXJlIHBhc3N3ZCBmaWxlIGZvciB1c2UKICAgICAgICAgICAgICAgIHNldHNlcnZlbnQgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIHByZXBhcmUgc2VydmljZXMgZmlsZSBmb3IgdXNlCiAgICAgICAgICAgICAgICBzZXRzb2Nrb3B0ICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBzZXQgc29tZSBzb2NrZXQgb3B0aW9ucwogICAgICAgICAgICAgICAgc2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gcmVtb3ZlIHRoZSBmaXJzdCBlbGVtZW50IG9mIGFuIGFycmF5LCBhbmQgcmV0dXJuIGl0CiAgICAgICAgICAgICAgICBzaG1jdGwgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBTeXNWIHNoYXJlZCBtZW1vcnkgb3BlcmF0aW9ucwogICAgICAgICAgICAgICAgc2htZ2V0ICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gZ2V0IFN5c1Ygc2hhcmVkIG1lbW9yeSBzZWdtZW50IGlkZW50aWZpZXIKICAgICAgICAgICAgICAgIHNobXJlYWQgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIHJlYWQgU3lzViBzaGFyZWQgbWVtb3J5CiAgICAgICAgICAgICAgICBzaG13cml0ZSAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSB3cml0ZSBTeXNWIHNoYXJlZCBtZW1vcnkKICAgICAgICAgICAgICAgIHNodXRkb3duICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGNsb3NlIGRvd24ganVzdCBoYWxmIG9mIGEgc29ja2V0IGNvbm5lY3Rpb24KICAgICAgICAgICAgICAgICdzaW4nICAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIHJldHVybiB0aGUgc2luZSBvZiBhIG51bWJlcgogICAgICAgICAgICAgICAgc2xlZXAgICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gYmxvY2sgZm9yIHNvbWUgbnVtYmVyIG9mIHNlY29uZHMKICAgICAgICAgICAgICAgIHNvY2tldCAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGNyZWF0ZSBhIHNvY2tldAogICAgICAgICAgICAgICAgc29ja2V0cGFpciAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gY3JlYXRlIGEgcGFpciBvZiBzb2NrZXRzCiAgICAgICAgICAgICAgICAnc29ydCcgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBzb3J0IGEgbGlzdCBvZiB2YWx1ZXMKICAgICAgICAgICAgICAgIHNwbGljZSAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGFkZCBvciByZW1vdmUgZWxlbWVudHMgYW55d2hlcmUgaW4gYW4gYXJyYXkKICAgICAgICAgICAgICAgICdzcGxpdCcgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIHNwbGl0IHVwIGEgc3RyaW5nIHVzaW5nIGEgcmVnZXhwIGRlbGltaXRlcgogICAgICAgICAgICAgICAgc3ByaW50ZiAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gZm9ybWF0dGVkIHByaW50IGludG8gYSBzdHJpbmcKICAgICAgICAgICAgICAgICdzcXJ0JyAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIHNxdWFyZSByb290IGZ1bmN0aW9uCiAgICAgICAgICAgICAgICBzcmFuZCAgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBzZWVkIHRoZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgogICAgICAgICAgICAgICAgc3RhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gZ2V0IGEgZmlsZSdzIHN0YXR1cyBpbmZvcm1hdGlvbgogICAgICAgICAgICAgICAgc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gZGVjbGFyZSBhbmQgYXNzaWduIGEgc3RhdGUgdmFyaWFibGUgKHBlcnNpc3RlbnQgbGV4aWNhbCBzY29waW5nKQogICAgICAgICAgICAgICAgc3R1ZHkgICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gb3B0aW1pemUgaW5wdXQgZGF0YSBmb3IgcmVwZWF0ZWQgc2VhcmNoZXMKICAgICAgICAgICAgICAgICdzdWInICAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGRlY2xhcmUgYSBzdWJyb3V0aW5lLCBwb3NzaWJseSBhbm9ueW1vdXNseQogICAgICAgICAgICAgICAgJ3N1YnN0cicgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gZ2V0IG9yIGFsdGVyIGEgcG9ydGlvbiBvZiBhIHN0aXJuZwogICAgICAgICAgICAgICAgc3ltbGluayAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gY3JlYXRlIGEgc3ltYm9saWMgbGluayB0byBhIGZpbGUKICAgICAgICAgICAgICAgIHN5c2NhbGwgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGV4ZWN1dGUgYW4gYXJiaXRyYXJ5IHN5c3RlbSBjYWxsCiAgICAgICAgICAgICAgICBzeXNvcGVuICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBvcGVuIGEgZmlsZSwgcGlwZSwgb3IgZGVzY3JpcHRvcgogICAgICAgICAgICAgICAgc3lzcmVhZCAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gZml4ZWQtbGVuZ3RoIHVuYnVmZmVyZWQgaW5wdXQgZnJvbSBhIGZpbGVoYW5kbGUKICAgICAgICAgICAgICAgIHN5c3NlZWsgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIHBvc2l0aW9uIEkvTyBwb2ludGVyIG9uIGhhbmRsZSB1c2VkIHdpdGggc3lzcmVhZCBhbmQgc3lzd3JpdGUKICAgICAgICAgICAgICAgIHN5c3RlbSAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIHJ1biBhIHNlcGFyYXRlIHByb2dyYW0KICAgICAgICAgICAgICAgIHN5c3dyaXRlICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGZpeGVkLWxlbmd0aCB1bmJ1ZmZlcmVkIG91dHB1dCB0byBhIGZpbGVoYW5kbGUKICAgICAgICAgICAgICAgIHRlbGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGdldCBjdXJyZW50IHNlZWtwb2ludGVyIG9uIGEgZmlsZWhhbmRsZQogICAgICAgICAgICAgICAgdGVsbGRpciAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gZ2V0IGN1cnJlbnQgc2Vla3BvaW50ZXIgb24gYSBkaXJlY3RvcnkgaGFuZGxlCiAgICAgICAgICAgICAgICB0aWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBiaW5kIGEgdmFyaWFibGUgdG8gYW4gb2JqZWN0IGNsYXNzCiAgICAgICAgICAgICAgICB0aWVkICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBnZXQgYSByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCB1bmRlcmx5aW5nIGEgdGllZCB2YXJpYWJsZQogICAgICAgICAgICAgICAgdGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gcmV0dXJuIG51bWJlciBvZiBzZWNvbmRzIHNpbmNlIDE5NzAKICAgICAgICAgICAgICAgIHRpbWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIHJldHVybiBlbGFwc2VkIHRpbWUgZm9yIHNlbGYgYW5kIGNoaWxkIHByb2Nlc3NlcwogICAgICAgICAgICAgICAgdHIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6bnVsbCwgIC8vIC0gdHJhbnNsaXRlcmF0ZSBhIHN0cmluZwogICAgICAgICAgICAgICAgdHJ1bmNhdGUgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gc2hvcnRlbiBhIGZpbGUKICAgICAgICAgICAgICAgIHVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIHJldHVybiB1cHBlci1jYXNlIHZlcnNpb24gb2YgYSBzdHJpbmcKICAgICAgICAgICAgICAgIHVjZmlyc3QgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIHJldHVybiBhIHN0cmluZyB3aXRoIGp1c3QgdGhlIG5leHQgbGV0dGVyIGluIHVwcGVyIGNhc2UKICAgICAgICAgICAgICAgIHVtYXNrICAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIHNldCBmaWxlIGNyZWF0aW9uIG1vZGUgbWFzawogICAgICAgICAgICAgICAgdW5kZWYgICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gcmVtb3ZlIGEgdmFyaWFibGUgb3IgZnVuY3Rpb24gZGVmaW5pdGlvbgogICAgICAgICAgICAgICAgdW5saW5rICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gcmVtb3ZlIG9uZSBsaW5rIHRvIGEgZmlsZQogICAgICAgICAgICAgICAgdW5wYWNrICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gY29udmVydCBiaW5hcnkgc3RydWN0dXJlIGludG8gbm9ybWFsIHBlcmwgdmFyaWFibGVzCiAgICAgICAgICAgICAgICB1bnNoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBwcmVwZW5kIG1vcmUgZWxlbWVudHMgdG8gdGhlIGJlZ2lubmluZyBvZiBhIGxpc3QKICAgICAgICAgICAgICAgIHVudGllICAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGJyZWFrIGEgdGllIGJpbmRpbmcgdG8gYSB2YXJpYWJsZQogICAgICAgICAgICAgICAgdXNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gbG9hZCBpbiBhIG1vZHVsZSBhdCBjb21waWxlIHRpbWUKICAgICAgICAgICAgICAgIHV0aW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIHNldCBhIGZpbGUncyBsYXN0IGFjY2VzcyBhbmQgbW9kaWZ5IHRpbWVzCiAgICAgICAgICAgICAgICB2YWx1ZXMgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSByZXR1cm4gYSBsaXN0IG9mIHRoZSB2YWx1ZXMgaW4gYSBoYXNoCiAgICAgICAgICAgICAgICB2ZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSB0ZXN0IG9yIHNldCBwYXJ0aWN1bGFyIGJpdHMgaW4gYSBzdHJpbmcKICAgICAgICAgICAgICAgIHdhaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIHdhaXQgZm9yIGFueSBjaGlsZCBwcm9jZXNzIHRvIGRpZQogICAgICAgICAgICAgICAgd2FpdHBpZCAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gd2FpdCBmb3IgYSBwYXJ0aWN1bGFyIGNoaWxkIHByb2Nlc3MgdG8gZGllCiAgICAgICAgICAgICAgICB3YW50YXJyYXkgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBnZXQgdm9pZCB2cyBzY2FsYXIgdnMgbGlzdCBjb250ZXh0IG9mIGN1cnJlbnQgc3Vicm91dGluZSBjYWxsCiAgICAgICAgICAgICAgICB3YXJuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBwcmludCBkZWJ1Z2dpbmcgaW5mbwogICAgICAgICAgICAgICAgd2hlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vCiAgICAgICAgICAgICAgICB3cml0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBwcmludCBhIHBpY3R1cmUgcmVjb3JkCiAgICAgICAgICAgICAgICB5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpudWxsfTsgLy8gLSB0cmFuc2xpdGVyYXRlIGEgc3RyaW5nCgogICAgICAgIHZhciBSWHN0eWxlPSJzdHJpbmctMiI7CiAgICAgICAgdmFyIFJYbW9kaWZpZXJzPS9bZ29zZXhpbWFjcGx1ZF0vOyAgICAgICAgICAgICAgLy8gTk9URTogIm0iLCAicyIsICJ5IiBhbmQgInRyIiBuZWVkIHRvIGNvcnJlY3QgcmVhbCBtb2RpZmllcnMgZm9yIGVhY2ggcmVnZXhwIHR5cGUKCiAgICAgICAgZnVuY3Rpb24gdG9rZW5DaGFpbihzdHJlYW0sc3RhdGUsY2hhaW4sc3R5bGUsdGFpbCl7ICAgICAvLyBOT1RFOiBjaGFpbi5sZW5ndGggPiAyIGlzIG5vdCB3b3JraW5nIG5vdyAoaXQncyBmb3Igc1suLi5dWy4uLl1nZW9zOykKICAgICAgICAgICAgICAgIHN0YXRlLmNoYWluPW51bGw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyICAgM3RhaWwKICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlPW51bGw7CiAgICAgICAgICAgICAgICBzdGF0ZS50YWlsPW51bGw7CiAgICAgICAgICAgICAgICBzdGF0ZS50b2tlbml6ZT1mdW5jdGlvbihzdHJlYW0sc3RhdGUpewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZT1mYWxzZSxjLGk9MDsKICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUoYz1zdHJlYW0ubmV4dCgpKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihjPT09Y2hhaW5baV0mJiFlKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNoYWluWysraV0hPT11bmRlZmluZWQpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5jaGFpbj1jaGFpbltpXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuc3R5bGU9c3R5bGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnRhaWw9dGFpbDt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKHRhaWwpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5lYXRXaGlsZSh0YWlsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnRva2VuaXplPXRva2VuUGVybDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHlsZTt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZT0hZSYmYz09IlxcIjt9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHlsZTt9OwogICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRlLnRva2VuaXplKHN0cmVhbSxzdGF0ZSk7fQoKICAgICAgICBmdW5jdGlvbiB0b2tlblNPTUVUSElORyhzdHJlYW0sc3RhdGUsc3RyaW5nKXsKICAgICAgICAgICAgICAgIHN0YXRlLnRva2VuaXplPWZ1bmN0aW9uKHN0cmVhbSxzdGF0ZSl7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHN0cmVhbS5zdHJpbmc9PXN0cmluZykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS50b2tlbml6ZT10b2tlblBlcmw7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJzdHJpbmciO307CiAgICAgICAgICAgICAgICByZXR1cm4gc3RhdGUudG9rZW5pemUoc3RyZWFtLHN0YXRlKTt9CgogICAgICAgIGZ1bmN0aW9uIHRva2VuUGVybChzdHJlYW0sc3RhdGUpewogICAgICAgICAgICAgICAgaWYoc3RyZWFtLmVhdFNwYWNlKCkpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgaWYoc3RhdGUuY2hhaW4pCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbkNoYWluKHN0cmVhbSxzdGF0ZSxzdGF0ZS5jaGFpbixzdGF0ZS5zdHlsZSxzdGF0ZS50YWlsKTsKICAgICAgICAgICAgICAgIGlmKHN0cmVhbS5tYXRjaCgvXlwtP1tcZFwuXS8sZmFsc2UpKQogICAgICAgICAgICAgICAgICAgICAgICBpZihzdHJlYW0ubWF0Y2goL14oXC0/KFxkKlwuXGQrKGVbKy1dP1xkKyk/fFxkK1wuXGQqKXwweFtcZGEtZkEtRl0rfDBiWzAxXSt8XGQrKGVbKy1dP1xkKyk/KS8pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnbnVtYmVyJzsKICAgICAgICAgICAgICAgIGlmKHN0cmVhbS5tYXRjaCgvXjw8KD89XHcpLykpeyAgICAgICAgICAgICAgICAgIC8vIE5PVEU6IDw8U09NRVRISU5HXG4uLi5cblNPTUVUSElOR1xuCiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvXHcvKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuU09NRVRISU5HKHN0cmVhbSxzdGF0ZSxzdHJlYW0uY3VycmVudCgpLnN1YnN0cigyKSk7fQogICAgICAgICAgICAgICAgaWYoc3RyZWFtLnNvbCgpJiZzdHJlYW0ubWF0Y2goL15cPWl0ZW0oPyFcdykvKSl7Ly8gTk9URTogXG49aXRlbS4uLlxuPWN1dFxuCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlblNPTUVUSElORyhzdHJlYW0sc3RhdGUsJz1jdXQnKTt9CiAgICAgICAgICAgICAgICB2YXIgY2g9c3RyZWFtLm5leHQoKTsKICAgICAgICAgICAgICAgIGlmKGNoPT0nIid8fGNoPT0iJyIpeyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5PVEU6ICcgb3IgIiBvciA8PCdTT01FVEhJTkcnXG4uLi5cblNPTUVUSElOR1xuIG9yIDw8IlNPTUVUSElORyJcbi4uLlxuU09NRVRISU5HXG4KICAgICAgICAgICAgICAgICAgICAgICAgaWYocHJlZml4KHN0cmVhbSwgMyk9PSI8PCIrY2gpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwPXN0cmVhbS5wb3M7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLmVhdFdoaWxlKC9cdy8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuPXN0cmVhbS5jdXJyZW50KCkuc3Vic3RyKDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKG4mJnN0cmVhbS5lYXQoY2gpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuU09NRVRISU5HKHN0cmVhbSxzdGF0ZSxuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucG9zPXA7fQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5DaGFpbihzdHJlYW0sc3RhdGUsW2NoXSwic3RyaW5nIik7fQogICAgICAgICAgICAgICAgaWYoY2g9PSJxIil7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjPWxvb2soc3RyZWFtLCAtMik7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCEoYyYmL1x3Ly50ZXN0KGMpKSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYz1sb29rKHN0cmVhbSwgMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYz09IngiKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGM9bG9vayhzdHJlYW0sIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYz09IigiKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWF0U3VmZml4KHN0cmVhbSwgMik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbkNoYWluKHN0cmVhbSxzdGF0ZSxbIikiXSxSWHN0eWxlLFJYbW9kaWZpZXJzKTt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihjPT0iWyIpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYXRTdWZmaXgoc3RyZWFtLCAyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuQ2hhaW4oc3RyZWFtLHN0YXRlLFsiXSJdLFJYc3R5bGUsUlhtb2RpZmllcnMpO30KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGM9PSJ7Iil7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhdFN1ZmZpeChzdHJlYW0sIDIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5DaGFpbihzdHJlYW0sc3RhdGUsWyJ9Il0sUlhzdHlsZSxSWG1vZGlmaWVycyk7fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYz09IjwiKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWF0U3VmZml4KHN0cmVhbSwgMik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbkNoYWluKHN0cmVhbSxzdGF0ZSxbIj4iXSxSWHN0eWxlLFJYbW9kaWZpZXJzKTt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigvW1xeJyIhflwvXS8udGVzdChjKSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhdFN1ZmZpeChzdHJlYW0sIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5DaGFpbihzdHJlYW0sc3RhdGUsW3N0cmVhbS5lYXQoYyldLFJYc3R5bGUsUlhtb2RpZmllcnMpO319CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihjPT0icSIpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYz1sb29rKHN0cmVhbSwgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihjPT0iKCIpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYXRTdWZmaXgoc3RyZWFtLCAyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuQ2hhaW4oc3RyZWFtLHN0YXRlLFsiKSJdLCJzdHJpbmciKTt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihjPT0iWyIpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYXRTdWZmaXgoc3RyZWFtLCAyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuQ2hhaW4oc3RyZWFtLHN0YXRlLFsiXSJdLCJzdHJpbmciKTt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihjPT0ieyIpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYXRTdWZmaXgoc3RyZWFtLCAyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuQ2hhaW4oc3RyZWFtLHN0YXRlLFsifSJdLCJzdHJpbmciKTt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihjPT0iPCIpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYXRTdWZmaXgoc3RyZWFtLCAyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuQ2hhaW4oc3RyZWFtLHN0YXRlLFsiPiJdLCJzdHJpbmciKTt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigvW1xeJyIhflwvXS8udGVzdChjKSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhdFN1ZmZpeChzdHJlYW0sIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5DaGFpbihzdHJlYW0sc3RhdGUsW3N0cmVhbS5lYXQoYyldLCJzdHJpbmciKTt9fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoYz09InciKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGM9bG9vayhzdHJlYW0sIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYz09IigiKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWF0U3VmZml4KHN0cmVhbSwgMik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbkNoYWluKHN0cmVhbSxzdGF0ZSxbIikiXSwiYnJhY2tldCIpO30KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGM9PSJbIil7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhdFN1ZmZpeChzdHJlYW0sIDIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5DaGFpbihzdHJlYW0sc3RhdGUsWyJdIl0sImJyYWNrZXQiKTt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihjPT0ieyIpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYXRTdWZmaXgoc3RyZWFtLCAyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuQ2hhaW4oc3RyZWFtLHN0YXRlLFsifSJdLCJicmFja2V0Iik7fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYz09IjwiKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWF0U3VmZml4KHN0cmVhbSwgMik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbkNoYWluKHN0cmVhbSxzdGF0ZSxbIj4iXSwiYnJhY2tldCIpO30KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKC9bXF4nIiF+XC9dLy50ZXN0KGMpKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWF0U3VmZml4KHN0cmVhbSwgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbkNoYWluKHN0cmVhbSxzdGF0ZSxbc3RyZWFtLmVhdChjKV0sImJyYWNrZXQiKTt9fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoYz09InIiKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGM9bG9vayhzdHJlYW0sIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYz09IigiKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWF0U3VmZml4KHN0cmVhbSwgMik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbkNoYWluKHN0cmVhbSxzdGF0ZSxbIikiXSxSWHN0eWxlLFJYbW9kaWZpZXJzKTt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihjPT0iWyIpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYXRTdWZmaXgoc3RyZWFtLCAyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuQ2hhaW4oc3RyZWFtLHN0YXRlLFsiXSJdLFJYc3R5bGUsUlhtb2RpZmllcnMpO30KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGM9PSJ7Iil7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhdFN1ZmZpeChzdHJlYW0sIDIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5DaGFpbihzdHJlYW0sc3RhdGUsWyJ9Il0sUlhzdHlsZSxSWG1vZGlmaWVycyk7fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYz09IjwiKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWF0U3VmZml4KHN0cmVhbSwgMik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbkNoYWluKHN0cmVhbSxzdGF0ZSxbIj4iXSxSWHN0eWxlLFJYbW9kaWZpZXJzKTt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigvW1xeJyIhflwvXS8udGVzdChjKSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhdFN1ZmZpeChzdHJlYW0sIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5DaGFpbihzdHJlYW0sc3RhdGUsW3N0cmVhbS5lYXQoYyldLFJYc3R5bGUsUlhtb2RpZmllcnMpO319CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZigvW1xeJyIhflwvKFxbezxdLy50ZXN0KGMpKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGM9PSIoIil7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhdFN1ZmZpeChzdHJlYW0sIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5DaGFpbihzdHJlYW0sc3RhdGUsWyIpIl0sInN0cmluZyIpO30KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGM9PSJbIil7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhdFN1ZmZpeChzdHJlYW0sIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5DaGFpbihzdHJlYW0sc3RhdGUsWyJdIl0sInN0cmluZyIpO30KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGM9PSJ7Iil7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhdFN1ZmZpeChzdHJlYW0sIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5DaGFpbihzdHJlYW0sc3RhdGUsWyJ9Il0sInN0cmluZyIpO30KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGM9PSI8Iil7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhdFN1ZmZpeChzdHJlYW0sIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5DaGFpbihzdHJlYW0sc3RhdGUsWyI+Il0sInN0cmluZyIpO30KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKC9bXF4nIiF+XC9dLy50ZXN0KGMpKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuQ2hhaW4oc3RyZWFtLHN0YXRlLFtzdHJlYW0uZWF0KGMpXSwic3RyaW5nIik7fX19fQogICAgICAgICAgICAgICAgaWYoY2g9PSJtIil7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjPWxvb2soc3RyZWFtLCAtMik7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCEoYyYmL1x3Ly50ZXN0KGMpKSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYz1zdHJlYW0uZWF0KC9bKFxbezxcXiciIX5cL10vKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihjKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKC9bXF4nIiF+XC9dLy50ZXN0KGMpKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuQ2hhaW4oc3RyZWFtLHN0YXRlLFtjXSxSWHN0eWxlLFJYbW9kaWZpZXJzKTt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihjPT0iKCIpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5DaGFpbihzdHJlYW0sc3RhdGUsWyIpIl0sUlhzdHlsZSxSWG1vZGlmaWVycyk7fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYz09IlsiKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuQ2hhaW4oc3RyZWFtLHN0YXRlLFsiXSJdLFJYc3R5bGUsUlhtb2RpZmllcnMpO30KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGM9PSJ7Iil7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbkNoYWluKHN0cmVhbSxzdGF0ZSxbIn0iXSxSWHN0eWxlLFJYbW9kaWZpZXJzKTt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihjPT0iPCIpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5DaGFpbihzdHJlYW0sc3RhdGUsWyI+Il0sUlhzdHlsZSxSWG1vZGlmaWVycyk7fX19fQogICAgICAgICAgICAgICAgaWYoY2g9PSJzIil7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjPS9bXC8+XF19KVx3XS8udGVzdChsb29rKHN0cmVhbSwgLTIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWMpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGM9c3RyZWFtLmVhdCgvWyhcW3s8XF4nIiF+XC9dLyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYyl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihjPT0iWyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbkNoYWluKHN0cmVhbSxzdGF0ZSxbIl0iLCJdIl0sUlhzdHlsZSxSWG1vZGlmaWVycyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihjPT0ieyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbkNoYWluKHN0cmVhbSxzdGF0ZSxbIn0iLCJ9Il0sUlhzdHlsZSxSWG1vZGlmaWVycyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihjPT0iPCIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbkNoYWluKHN0cmVhbSxzdGF0ZSxbIj4iLCI+Il0sUlhzdHlsZSxSWG1vZGlmaWVycyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihjPT0iKCIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbkNoYWluKHN0cmVhbSxzdGF0ZSxbIikiLCIpIl0sUlhzdHlsZSxSWG1vZGlmaWVycyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5DaGFpbihzdHJlYW0sc3RhdGUsW2MsY10sUlhzdHlsZSxSWG1vZGlmaWVycyk7fX19CiAgICAgICAgICAgICAgICBpZihjaD09InkiKXsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGM9L1tcLz5cXX0pXHddLy50ZXN0KGxvb2soc3RyZWFtLCAtMikpOwogICAgICAgICAgICAgICAgICAgICAgICBpZighYyl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYz1zdHJlYW0uZWF0KC9bKFxbezxcXiciIX5cL10vKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihjKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGM9PSJbIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuQ2hhaW4oc3RyZWFtLHN0YXRlLFsiXSIsIl0iXSxSWHN0eWxlLFJYbW9kaWZpZXJzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGM9PSJ7IikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuQ2hhaW4oc3RyZWFtLHN0YXRlLFsifSIsIn0iXSxSWHN0eWxlLFJYbW9kaWZpZXJzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGM9PSI8IikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuQ2hhaW4oc3RyZWFtLHN0YXRlLFsiPiIsIj4iXSxSWHN0eWxlLFJYbW9kaWZpZXJzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGM9PSIoIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuQ2hhaW4oc3RyZWFtLHN0YXRlLFsiKSIsIikiXSxSWHN0eWxlLFJYbW9kaWZpZXJzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbkNoYWluKHN0cmVhbSxzdGF0ZSxbYyxjXSxSWHN0eWxlLFJYbW9kaWZpZXJzKTt9fX0KICAgICAgICAgICAgICAgIGlmKGNoPT0idCIpewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYz0vW1wvPlxdfSlcd10vLnRlc3QobG9vayhzdHJlYW0sIC0yKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFjKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjPXN0cmVhbS5lYXQoInIiKTtpZihjKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjPXN0cmVhbS5lYXQoL1soXFt7PFxeJyIhflwvXS8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGMpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYz09IlsiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5DaGFpbihzdHJlYW0sc3RhdGUsWyJdIiwiXSJdLFJYc3R5bGUsUlhtb2RpZmllcnMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYz09InsiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5DaGFpbihzdHJlYW0sc3RhdGUsWyJ9IiwifSJdLFJYc3R5bGUsUlhtb2RpZmllcnMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYz09IjwiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5DaGFpbihzdHJlYW0sc3RhdGUsWyI+IiwiPiJdLFJYc3R5bGUsUlhtb2RpZmllcnMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYz09IigiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5DaGFpbihzdHJlYW0sc3RhdGUsWyIpIiwiKSJdLFJYc3R5bGUsUlhtb2RpZmllcnMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuQ2hhaW4oc3RyZWFtLHN0YXRlLFtjLGNdLFJYc3R5bGUsUlhtb2RpZmllcnMpO319fX0KICAgICAgICAgICAgICAgIGlmKGNoPT0iYCIpewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5DaGFpbihzdHJlYW0sc3RhdGUsW2NoXSwidmFyaWFibGUtMiIpO30KICAgICAgICAgICAgICAgIGlmKGNoPT0iLyIpewogICAgICAgICAgICAgICAgICAgICAgICBpZighL35ccyokLy50ZXN0KHByZWZpeChzdHJlYW0pKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIm9wZXJhdG9yIjsKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbkNoYWluKHN0cmVhbSxzdGF0ZSxbY2hdLFJYc3R5bGUsUlhtb2RpZmllcnMpO30KICAgICAgICAgICAgICAgIGlmKGNoPT0iJCIpewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcD1zdHJlYW0ucG9zOwogICAgICAgICAgICAgICAgICAgICAgICBpZihzdHJlYW0uZWF0V2hpbGUoL1xkLyl8fHN0cmVhbS5lYXQoInsiKSYmc3RyZWFtLmVhdFdoaWxlKC9cZC8pJiZzdHJlYW0uZWF0KCJ9IikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJ2YXJpYWJsZS0yIjsKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wb3M9cDt9CiAgICAgICAgICAgICAgICBpZigvWyRAJV0vLnRlc3QoY2gpKXsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHA9c3RyZWFtLnBvczsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoc3RyZWFtLmVhdCgiXiIpJiZzdHJlYW0uZWF0KC9bQS1aXS8pfHwhL1tAJCUmXS8udGVzdChsb29rKHN0cmVhbSwgLTIpKSYmc3RyZWFtLmVhdCgvWz18XFxcLSM/QDs6JmB+XF4hXFtcXSonIiQrLixcLzw+KCldLykpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjPXN0cmVhbS5jdXJyZW50KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoUEVSTFtjXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAidmFyaWFibGUtMiI7fQogICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucG9zPXA7fQogICAgICAgICAgICAgICAgaWYoL1skQCUmXS8udGVzdChjaCkpewogICAgICAgICAgICAgICAgICAgICAgICBpZihzdHJlYW0uZWF0V2hpbGUoL1tcdyRcW1xdXS8pfHxzdHJlYW0uZWF0KCJ7IikmJnN0cmVhbS5lYXRXaGlsZSgvW1x3JFxbXF1dLykmJnN0cmVhbS5lYXQoIn0iKSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGM9c3RyZWFtLmN1cnJlbnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihQRVJMW2NdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJ2YXJpYWJsZS0yIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gInZhcmlhYmxlIjt9fQogICAgICAgICAgICAgICAgaWYoY2g9PSIjIil7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxvb2soc3RyZWFtLCAtMikhPSIkIil7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiY29tbWVudCI7fX0KICAgICAgICAgICAgICAgIGlmKC9bOitcLVxeKiQmJUA9PD4hP3xcL35cLl0vLnRlc3QoY2gpKXsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHA9c3RyZWFtLnBvczsKICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bOitcLVxeKiQmJUA9PD4hP3xcL35cLl0vKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoUEVSTFtzdHJlYW0uY3VycmVudCgpXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIm9wZXJhdG9yIjsKICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wb3M9cDt9CiAgICAgICAgICAgICAgICBpZihjaD09Il8iKXsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoc3RyZWFtLnBvcz09MSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoc3VmZml4KHN0cmVhbSwgNik9PSJfRU5EX18iKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbkNoYWluKHN0cmVhbSxzdGF0ZSxbJ1wwJ10sImNvbW1lbnQiKTt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihzdWZmaXgoc3RyZWFtLCA3KT09Il9EQVRBX18iKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbkNoYWluKHN0cmVhbSxzdGF0ZSxbJ1wwJ10sInZhcmlhYmxlLTIiKTt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihzdWZmaXgoc3RyZWFtLCA3KT09Il9DX18iKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbkNoYWluKHN0cmVhbSxzdGF0ZSxbJ1wwJ10sInN0cmluZyIpO319fQogICAgICAgICAgICAgICAgaWYoL1x3Ly50ZXN0KGNoKSl7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwPXN0cmVhbS5wb3M7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGxvb2soc3RyZWFtLCAtMik9PSJ7IiYmKGxvb2soc3RyZWFtLCAwKT09In0ifHxzdHJlYW0uZWF0V2hpbGUoL1x3LykmJmxvb2soc3RyZWFtLCAwKT09In0iKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gInN0cmluZyI7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucG9zPXA7fQogICAgICAgICAgICAgICAgaWYoL1tBLVpdLy50ZXN0KGNoKSl7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsPWxvb2soc3RyZWFtLCAtMik7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwPXN0cmVhbS5wb3M7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW0EtWl9dLyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKC9bXGRhLXpdLy50ZXN0KGxvb2soc3RyZWFtLCAwKSkpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5wb3M9cDt9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2V7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGM9UEVSTFtzdHJlYW0uY3VycmVudCgpXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZighYykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAibWV0YSI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoY1sxXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGM9Y1swXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihsIT0iOiIpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYz09MSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJrZXl3b3JkIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoYz09MikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJkZWYiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihjPT0zKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImF0b20iOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihjPT00KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIm9wZXJhdG9yIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoYz09NSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJ2YXJpYWJsZS0yIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJtZXRhIjt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJtZXRhIjt9fQogICAgICAgICAgICAgICAgaWYoL1thLXpBLVpfXS8udGVzdChjaCkpewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbD1sb29rKHN0cmVhbSwgLTIpOwogICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1x3Lyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjPVBFUkxbc3RyZWFtLmN1cnJlbnQoKV07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFjKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAibWV0YSI7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNbMV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYz1jWzBdOwogICAgICAgICAgICAgICAgICAgICAgICBpZihsIT0iOiIpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGM9PTEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImtleXdvcmQiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoYz09MikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiZGVmIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKGM9PTMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImF0b20iOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoYz09NCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAib3BlcmF0b3IiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoYz09NSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAidmFyaWFibGUtMiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJtZXRhIjt9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIm1ldGEiO30KICAgICAgICAgICAgICAgIHJldHVybiBudWxsO30KCiAgICAgICAgcmV0dXJuewogICAgICAgICAgICAgICAgc3RhcnRTdGF0ZTpmdW5jdGlvbigpewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm57CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9rZW5pemU6dG9rZW5QZXJsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYWluOm51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU6bnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWlsOm51bGx9O30sCiAgICAgICAgICAgICAgICB0b2tlbjpmdW5jdGlvbihzdHJlYW0sc3RhdGUpewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHN0YXRlLnRva2VuaXplfHx0b2tlblBlcmwpKHN0cmVhbSxzdGF0ZSk7fSwKICAgICAgICAgICAgICAgIGVsZWN0cmljQ2hhcnM6Int9In07fSk7CgpDb2RlTWlycm9yLnJlZ2lzdGVySGVscGVyKCJ3b3JkQ2hhcnMiLCAicGVybCIsIC9bXFx3JF0vKTsKCkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC94LXBlcmwiLCAicGVybCIpOwoKLy8gaXQncyBsaWtlICJwZWVrIiwgYnV0IG5lZWQgZm9yIGxvb2stYWhlYWQgb3IgbG9vay1iZWhpbmQgaWYgaW5kZXggPCAwCmZ1bmN0aW9uIGxvb2soc3RyZWFtLCBjKXsKICByZXR1cm4gc3RyZWFtLnN0cmluZy5jaGFyQXQoc3RyZWFtLnBvcysoY3x8MCkpOwp9CgovLyByZXR1cm4gYSBwYXJ0IG9mIHByZWZpeCBvZiBjdXJyZW50IHN0cmVhbSBmcm9tIGN1cnJlbnQgcG9zaXRpb24KZnVuY3Rpb24gcHJlZml4KHN0cmVhbSwgYyl7CiAgaWYoYyl7CiAgICB2YXIgeD1zdHJlYW0ucG9zLWM7CiAgICByZXR1cm4gc3RyZWFtLnN0cmluZy5zdWJzdHIoKHg+PTA/eDowKSxjKTt9CiAgZWxzZXsKICAgIHJldHVybiBzdHJlYW0uc3RyaW5nLnN1YnN0cigwLHN0cmVhbS5wb3MtMSk7CiAgfQp9CgovLyByZXR1cm4gYSBwYXJ0IG9mIHN1ZmZpeCBvZiBjdXJyZW50IHN0cmVhbSBmcm9tIGN1cnJlbnQgcG9zaXRpb24KZnVuY3Rpb24gc3VmZml4KHN0cmVhbSwgYyl7CiAgdmFyIHk9c3RyZWFtLnN0cmluZy5sZW5ndGg7CiAgdmFyIHg9eS1zdHJlYW0ucG9zKzE7CiAgcmV0dXJuIHN0cmVhbS5zdHJpbmcuc3Vic3RyKHN0cmVhbS5wb3MsKGMmJmM8eT9jOngpKTsKfQoKLy8gZWF0aW5nIGFuZCB2b21pdGluZyBhIHBhcnQgb2Ygc3RyZWFtIGZyb20gY3VycmVudCBwb3NpdGlvbgpmdW5jdGlvbiBlYXRTdWZmaXgoc3RyZWFtLCBjKXsKICB2YXIgeD1zdHJlYW0ucG9zK2M7CiAgdmFyIHk7CiAgaWYoeDw9MCkKICAgIHN0cmVhbS5wb3M9MDsKICBlbHNlIGlmKHg+PSh5PXN0cmVhbS5zdHJpbmcubGVuZ3RoLTEpKQogICAgc3RyZWFtLnBvcz15OwogIGVsc2UKICAgIHN0cmVhbS5wb3M9eDsKfQoKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/php/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/php/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogUEhQIG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vLi4vYWRkb24vZWRpdC9tYXRjaGJyYWNrZXRzLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL2h0bWxtaXhlZC9odG1sbWl4ZWQuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4veG1sL3htbC5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9qYXZhc2NyaXB0L2phdmFzY3JpcHQuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vY3NzL2Nzcy5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9jbGlrZS9jbGlrZS5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJwaHAuanMiPjwvc2NyaXB0Pgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPi5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazt9PC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aW1nIGlkPWxvZ28gc3JjPSIuLi8uLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5MYW5ndWFnZSBtb2RlczwvYT4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+UEhQPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5QSFAgbW9kZTwvaDI+Cjxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+Cjw/cGhwCiRhID0gYXJyYXkoJ2EnID0+IDEsICdiJyA9PiAyLCAzID0+ICdjJyk7CgplY2hvICIkYVthXSAke2FbM10gLyogfSBjb21tZW50ICovfSB7JGFbYl19IFwkYVthXSI7CgpmdW5jdGlvbiBoZWxsbygkd2hvKSB7CglyZXR1cm4gIkhlbGxvICR3aG8hIjsKfQo/Pgo8cD5UaGUgcHJvZ3JhbSBzYXlzIDw/PSBoZWxsbygiV29ybGQiKSA/Pi48L3A+CjxzY3JpcHQ+CglhbGVydCgiQW5kIGhlcmUgaXMgc29tZSBKUyBjb2RlIik7IC8vIGFsc28gY29sb3JlZAo8L3NjcmlwdD4KPC90ZXh0YXJlYT48L2Zvcm0+CgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgICAgICBtYXRjaEJyYWNrZXRzOiB0cnVlLAogICAgICAgIG1vZGU6ICJhcHBsaWNhdGlvbi94LWh0dHBkLXBocCIsCiAgICAgICAgaW5kZW50VW5pdDogNCwKICAgICAgICBpbmRlbnRXaXRoVGFiczogdHJ1ZQogICAgICB9KTsKICAgIDwvc2NyaXB0PgoKICAgIDxwPlNpbXBsZSBIVE1ML1BIUCBtb2RlIGJhc2VkIG9uCiAgICB0aGUgPGEgaHJlZj0iLi4vY2xpa2UvIj5DLWxpa2U8L2E+IG1vZGUuIERlcGVuZHMgb24gWE1MLAogICAgSmF2YVNjcmlwdCwgQ1NTLCBIVE1MTWl4ZWQsIGFuZCBDLWxpa2UgbW9kZXMuPC9wPgoKICAgIDxwPjxzdHJvbmc+TUlNRSB0eXBlcyBkZWZpbmVkOjwvc3Ryb25nPiA8Y29kZT5hcHBsaWNhdGlvbi94LWh0dHBkLXBocDwvY29kZT4gKEhUTUwgd2l0aCBQSFAgY29kZSksIDxjb2RlPnRleHQveC1waHA8L2NvZGU+IChwbGFpbiwgbm9uLXdyYXBwZWQgUEhQIGNvZGUpLjwvcD4KICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/php/php.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSwgcmVxdWlyZSgiLi4vaHRtbG1peGVkL2h0bWxtaXhlZCIpLCByZXF1aXJlKCIuLi9jbGlrZS9jbGlrZSIpKTsKICBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCkgLy8gQU1ECiAgICBkZWZpbmUoWyIuLi8uLi9saWIvY29kZW1pcnJvciIsICIuLi9odG1sbWl4ZWQvaHRtbG1peGVkIiwgIi4uL2NsaWtlL2NsaWtlIl0sIG1vZCk7CiAgZWxzZSAvLyBQbGFpbiBicm93c2VyIGVudgogICAgbW9kKENvZGVNaXJyb3IpOwp9KShmdW5jdGlvbihDb2RlTWlycm9yKSB7CiAgInVzZSBzdHJpY3QiOwoKICBmdW5jdGlvbiBrZXl3b3JkcyhzdHIpIHsKICAgIHZhciBvYmogPSB7fSwgd29yZHMgPSBzdHIuc3BsaXQoIiAiKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgd29yZHMubGVuZ3RoOyArK2kpIG9ialt3b3Jkc1tpXV0gPSB0cnVlOwogICAgcmV0dXJuIG9iajsKICB9CiAgZnVuY3Rpb24gaGVyZWRvYyhkZWxpbSkgewogICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgaWYgKHN0cmVhbS5tYXRjaChkZWxpbSkpIHN0YXRlLnRva2VuaXplID0gbnVsbDsKICAgICAgZWxzZSBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICAgIHJldHVybiAic3RyaW5nIjsKICAgIH07CiAgfQoKICAvLyBIZWxwZXIgZm9yIHN0cmluZ1dpdGhFc2NhcGVzCiAgZnVuY3Rpb24gbWF0Y2hTZXF1ZW5jZShsaXN0KSB7CiAgICBpZiAobGlzdC5sZW5ndGggPT0gMCkgcmV0dXJuIHN0cmluZ1dpdGhFc2NhcGVzOwogICAgcmV0dXJuIGZ1bmN0aW9uIChzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHZhciBwYXR0ZXJucyA9IGxpc3RbMF07CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcGF0dGVybnMubGVuZ3RoOyBpKyspIGlmIChzdHJlYW0ubWF0Y2gocGF0dGVybnNbaV1bMF0pKSB7CiAgICAgICAgc3RhdGUudG9rZW5pemUgPSBtYXRjaFNlcXVlbmNlKGxpc3Quc2xpY2UoMSkpOwogICAgICAgIHJldHVybiBwYXR0ZXJuc1tpXVsxXTsKICAgICAgfQogICAgICBzdGF0ZS50b2tlbml6ZSA9IHN0cmluZ1dpdGhFc2NhcGVzOwogICAgICByZXR1cm4gInN0cmluZyI7CiAgICB9OwogIH0KICBmdW5jdGlvbiBzdHJpbmdXaXRoRXNjYXBlcyhzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgZXNjYXBlZCA9IGZhbHNlLCBuZXh0LCBlbmQgPSBmYWxzZTsKCiAgICBpZiAoc3RyZWFtLmN1cnJlbnQoKSA9PSAnIicpIHJldHVybiAic3RyaW5nIjsKCiAgICAvLyAiQ29tcGxleCIgc3ludGF4CiAgICBpZiAoc3RyZWFtLm1hdGNoKCIkeyIsIGZhbHNlKSB8fCBzdHJlYW0ubWF0Y2goInskIiwgZmFsc2UpKSB7CiAgICAgIHN0YXRlLnRva2VuaXplID0gbnVsbDsKICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgfQoKICAgIC8vIFNpbXBsZSBzeW50YXgKICAgIGlmIChzdHJlYW0ubWF0Y2goL1wkW2EtekEtWl9dW2EtekEtWjAtOV9dKi8pKSB7CiAgICAgIC8vIEFmdGVyIHRoZSB2YXJpYWJsZSBuYW1lIHRoZXJlIG1heSBhcHBlYXIgYXJyYXkgb3Igb2JqZWN0IG9wZXJhdG9yLgogICAgICBpZiAoc3RyZWFtLm1hdGNoKCJbIiwgZmFsc2UpKSB7CiAgICAgICAgLy8gTWF0Y2ggYXJyYXkgb3BlcmF0b3IKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IG1hdGNoU2VxdWVuY2UoWwogICAgICAgICAgW1siWyIsIG51bGxdXSwKICAgICAgICAgIFtbL1xkW1x3XC5dKi8sICJudW1iZXIiXSwKICAgICAgICAgICBbL1wkW2EtekEtWl9dW2EtekEtWjAtOV9dKi8sICJ2YXJpYWJsZS0yIl0sCiAgICAgICAgICAgWy9bXHdcJF0rLywgInZhcmlhYmxlIl1dLAogICAgICAgICAgW1siXSIsIG51bGxdXQogICAgICAgIF0pOwogICAgICB9CiAgICAgIGlmIChzdHJlYW0ubWF0Y2goL1wtXD5cdy8sIGZhbHNlKSkgewogICAgICAgIC8vIE1hdGNoIG9iamVjdCBvcGVyYXRvcgogICAgICAgIHN0YXRlLnRva2VuaXplID0gbWF0Y2hTZXF1ZW5jZShbCiAgICAgICAgICBbWyItPiIsIG51bGxdXSwKICAgICAgICAgIFtbL1tcd10rLywgInZhcmlhYmxlIl1dCiAgICAgICAgXSk7CiAgICAgIH0KICAgICAgcmV0dXJuICJ2YXJpYWJsZS0yIjsKICAgIH0KCiAgICAvLyBOb3JtYWwgc3RyaW5nCiAgICB3aGlsZSAoCiAgICAgICFzdHJlYW0uZW9sKCkgJiYKICAgICAgKCFzdHJlYW0ubWF0Y2goInskIiwgZmFsc2UpKSAmJgogICAgICAoIXN0cmVhbS5tYXRjaCgvKFwkW2EtekEtWl9dW2EtekEtWjAtOV9dKnxcJFx7KS8sIGZhbHNlKSB8fCBlc2NhcGVkKQogICAgKSB7CiAgICAgIG5leHQgPSBzdHJlYW0ubmV4dCgpOwogICAgICBpZiAoIWVzY2FwZWQgJiYgbmV4dCA9PSAnIicpIHsgZW5kID0gdHJ1ZTsgYnJlYWs7IH0KICAgICAgZXNjYXBlZCA9ICFlc2NhcGVkICYmIG5leHQgPT0gIlxcIjsKICAgIH0KICAgIGlmIChlbmQpIHsKICAgICAgc3RhdGUudG9rZW5pemUgPSBudWxsOwogICAgICBzdGF0ZS5waHBFbmNhcHNTdGFjay5wb3AoKTsKICAgIH0KICAgIHJldHVybiAic3RyaW5nIjsKICB9CgogIHZhciBwaHBLZXl3b3JkcyA9ICJhYnN0cmFjdCBhbmQgYXJyYXkgYXMgYnJlYWsgY2FzZSBjYXRjaCBjbGFzcyBjbG9uZSBjb25zdCBjb250aW51ZSBkZWNsYXJlIGRlZmF1bHQgIiArCiAgICAiZG8gZWxzZSBlbHNlaWYgZW5kZGVjbGFyZSBlbmRmb3IgZW5kZm9yZWFjaCBlbmRpZiBlbmRzd2l0Y2ggZW5kd2hpbGUgZXh0ZW5kcyBmaW5hbCAiICsKICAgICJmb3IgZm9yZWFjaCBmdW5jdGlvbiBnbG9iYWwgZ290byBpZiBpbXBsZW1lbnRzIGludGVyZmFjZSBpbnN0YW5jZW9mIG5hbWVzcGFjZSAiICsKICAgICJuZXcgb3IgcHJpdmF0ZSBwcm90ZWN0ZWQgcHVibGljIHN0YXRpYyBzd2l0Y2ggdGhyb3cgdHJhaXQgdHJ5IHVzZSB2YXIgd2hpbGUgeG9yICIgKwogICAgImRpZSBlY2hvIGVtcHR5IGV4aXQgZXZhbCBpbmNsdWRlIGluY2x1ZGVfb25jZSBpc3NldCBsaXN0IHJlcXVpcmUgcmVxdWlyZV9vbmNlIHJldHVybiAiICsKICAgICJwcmludCB1bnNldCBfX2hhbHRfY29tcGlsZXIgc2VsZiBzdGF0aWMgcGFyZW50IHlpZWxkIGluc3RlYWRvZiBmaW5hbGx5IjsKICB2YXIgcGhwQXRvbXMgPSAidHJ1ZSBmYWxzZSBudWxsIFRSVUUgRkFMU0UgTlVMTCBfX0NMQVNTX18gX19ESVJfXyBfX0ZJTEVfXyBfX0xJTkVfXyBfX01FVEhPRF9fIF9fRlVOQ1RJT05fXyBfX05BTUVTUEFDRV9fIF9fVFJBSVRfXyI7CiAgdmFyIHBocEJ1aWx0aW4gPSAiZnVuY19udW1fYXJncyBmdW5jX2dldF9hcmcgZnVuY19nZXRfYXJncyBzdHJsZW4gc3RyY21wIHN0cm5jbXAgc3RyY2FzZWNtcCBzdHJuY2FzZWNtcCBlYWNoIGVycm9yX3JlcG9ydGluZyBkZWZpbmUgZGVmaW5lZCB0cmlnZ2VyX2Vycm9yIHVzZXJfZXJyb3Igc2V0X2Vycm9yX2hhbmRsZXIgcmVzdG9yZV9lcnJvcl9oYW5kbGVyIGdldF9kZWNsYXJlZF9jbGFzc2VzIGdldF9sb2FkZWRfZXh0ZW5zaW9ucyBleHRlbnNpb25fbG9hZGVkIGdldF9leHRlbnNpb25fZnVuY3MgZGVidWdfYmFja3RyYWNlIGNvbnN0YW50IGJpbjJoZXggaGV4MmJpbiBzbGVlcCB1c2xlZXAgdGltZSBta3RpbWUgZ21ta3RpbWUgc3RyZnRpbWUgZ21zdHJmdGltZSBzdHJ0b3RpbWUgZGF0ZSBnbWRhdGUgZ2V0ZGF0ZSBsb2NhbHRpbWUgY2hlY2tkYXRlIGZsdXNoIHdvcmR3cmFwIGh0bWxzcGVjaWFsY2hhcnMgaHRtbGVudGl0aWVzIGh0bWxfZW50aXR5X2RlY29kZSBtZDUgbWQ1X2ZpbGUgY3JjMzIgZ2V0aW1hZ2VzaXplIGltYWdlX3R5cGVfdG9fbWltZV90eXBlIHBocGluZm8gcGhwdmVyc2lvbiBwaHBjcmVkaXRzIHN0cm5hdGNtcCBzdHJuYXRjYXNlY21wIHN1YnN0cl9jb3VudCBzdHJzcG4gc3RyY3NwbiBzdHJ0b2sgc3RydG91cHBlciBzdHJ0b2xvd2VyIHN0cnBvcyBzdHJycG9zIHN0cnJldiBoZWJyZXYgaGVicmV2YyBubDJiciBiYXNlbmFtZSBkaXJuYW1lIHBhdGhpbmZvIHN0cmlwc2xhc2hlcyBzdHJpcGNzbGFzaGVzIHN0cnN0ciBzdHJpc3RyIHN0cnJjaHIgc3RyX3NodWZmbGUgc3RyX3dvcmRfY291bnQgc3RyY29sbCBzdWJzdHIgc3Vic3RyX3JlcGxhY2UgcXVvdGVtZXRhIHVjZmlyc3QgdWN3b3JkcyBzdHJ0ciBhZGRzbGFzaGVzIGFkZGNzbGFzaGVzIHJ0cmltIHN0cl9yZXBsYWNlIHN0cl9yZXBlYXQgY291bnRfY2hhcnMgY2h1bmtfc3BsaXQgdHJpbSBsdHJpbSBzdHJpcF90YWdzIHNpbWlsYXJfdGV4dCBleHBsb2RlIGltcGxvZGUgc2V0bG9jYWxlIGxvY2FsZWNvbnYgcGFyc2Vfc3RyIHN0cl9wYWQgY2hvcCBzdHJjaHIgc3ByaW50ZiBwcmludGYgdnByaW50ZiB2c3ByaW50ZiBzc2NhbmYgZnNjYW5mIHBhcnNlX3VybCB1cmxlbmNvZGUgdXJsZGVjb2RlIHJhd3VybGVuY29kZSByYXd1cmxkZWNvZGUgcmVhZGxpbmsgbGlua2luZm8gbGluayB1bmxpbmsgZXhlYyBzeXN0ZW0gZXNjYXBlc2hlbGxjbWQgZXNjYXBlc2hlbGxhcmcgcGFzc3RocnUgc2hlbGxfZXhlYyBwcm9jX29wZW4gcHJvY19jbG9zZSByYW5kIHNyYW5kIGdldHJhbmRtYXggbXRfcmFuZCBtdF9zcmFuZCBtdF9nZXRyYW5kbWF4IGJhc2U2NF9kZWNvZGUgYmFzZTY0X2VuY29kZSBhYnMgY2VpbCBmbG9vciByb3VuZCBpc19maW5pdGUgaXNfbmFuIGlzX2luZmluaXRlIGJpbmRlYyBoZXhkZWMgb2N0ZGVjIGRlY2JpbiBkZWNvY3QgZGVjaGV4IGJhc2VfY29udmVydCBudW1iZXJfZm9ybWF0IGZtb2QgaXAybG9uZyBsb25nMmlwIGdldGVudiBwdXRlbnYgZ2V0b3B0IG1pY3JvdGltZSBnZXR0aW1lb2ZkYXkgZ2V0cnVzYWdlIHVuaXFpZCBxdW90ZWRfcHJpbnRhYmxlX2RlY29kZSBzZXRfdGltZV9saW1pdCBnZXRfY2ZnX3ZhciBtYWdpY19xdW90ZXNfcnVudGltZSBzZXRfbWFnaWNfcXVvdGVzX3J1bnRpbWUgZ2V0X21hZ2ljX3F1b3Rlc19ncGMgZ2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lIGltcG9ydF9yZXF1ZXN0X3ZhcmlhYmxlcyBlcnJvcl9sb2cgc2VyaWFsaXplIHVuc2VyaWFsaXplIG1lbW9yeV9nZXRfdXNhZ2UgdmFyX2R1bXAgdmFyX2V4cG9ydCBkZWJ1Z196dmFsX2R1bXAgcHJpbnRfciBoaWdobGlnaHRfZmlsZSBzaG93X3NvdXJjZSBoaWdobGlnaHRfc3RyaW5nIGluaV9nZXQgaW5pX2dldF9hbGwgaW5pX3NldCBpbmlfYWx0ZXIgaW5pX3Jlc3RvcmUgZ2V0X2luY2x1ZGVfcGF0aCBzZXRfaW5jbHVkZV9wYXRoIHJlc3RvcmVfaW5jbHVkZV9wYXRoIHNldGNvb2tpZSBoZWFkZXIgaGVhZGVyc19zZW50IGNvbm5lY3Rpb25fYWJvcnRlZCBjb25uZWN0aW9uX3N0YXR1cyBpZ25vcmVfdXNlcl9hYm9ydCBwYXJzZV9pbmlfZmlsZSBpc191cGxvYWRlZF9maWxlIG1vdmVfdXBsb2FkZWRfZmlsZSBpbnR2YWwgZmxvYXR2YWwgZG91YmxldmFsIHN0cnZhbCBnZXR0eXBlIHNldHR5cGUgaXNfbnVsbCBpc19yZXNvdXJjZSBpc19ib29sIGlzX2xvbmcgaXNfZmxvYXQgaXNfaW50IGlzX2ludGVnZXIgaXNfZG91YmxlIGlzX3JlYWwgaXNfbnVtZXJpYyBpc19zdHJpbmcgaXNfYXJyYXkgaXNfb2JqZWN0IGlzX3NjYWxhciBlcmVnIGVyZWdfcmVwbGFjZSBlcmVnaSBlcmVnaV9yZXBsYWNlIHNwbGl0IHNwbGl0aSBqb2luIHNxbF9yZWdjYXNlIGRsIHBjbG9zZSBwb3BlbiByZWFkZmlsZSByZXdpbmQgcm1kaXIgdW1hc2sgZmNsb3NlIGZlb2YgZmdldGMgZmdldHMgZmdldHNzIGZyZWFkIGZvcGVuIGZwYXNzdGhydSBmdHJ1bmNhdGUgZnN0YXQgZnNlZWsgZnRlbGwgZmZsdXNoIGZ3cml0ZSBmcHV0cyBta2RpciByZW5hbWUgY29weSB0ZW1wbmFtIHRtcGZpbGUgZmlsZSBmaWxlX2dldF9jb250ZW50cyBzdHJlYW1fc2VsZWN0IHN0cmVhbV9jb250ZXh0X2NyZWF0ZSBzdHJlYW1fY29udGV4dF9zZXRfcGFyYW1zIHN0cmVhbV9jb250ZXh0X3NldF9vcHRpb24gc3RyZWFtX2NvbnRleHRfZ2V0X29wdGlvbnMgc3RyZWFtX2ZpbHRlcl9wcmVwZW5kIHN0cmVhbV9maWx0ZXJfYXBwZW5kIGZnZXRjc3YgZmxvY2sgZ2V0X21ldGFfdGFncyBzdHJlYW1fc2V0X3dyaXRlX2J1ZmZlciBzZXRfZmlsZV9idWZmZXIgc2V0X3NvY2tldF9ibG9ja2luZyBzdHJlYW1fc2V0X2Jsb2NraW5nIHNvY2tldF9zZXRfYmxvY2tpbmcgc3RyZWFtX2dldF9tZXRhX2RhdGEgc3RyZWFtX3JlZ2lzdGVyX3dyYXBwZXIgc3RyZWFtX3dyYXBwZXJfcmVnaXN0ZXIgc3RyZWFtX3NldF90aW1lb3V0IHNvY2tldF9zZXRfdGltZW91dCBzb2NrZXRfZ2V0X3N0YXR1cyByZWFscGF0aCBmbm1hdGNoIGZzb2Nrb3BlbiBwZnNvY2tvcGVuIHBhY2sgdW5wYWNrIGdldF9icm93c2VyIGNyeXB0IG9wZW5kaXIgY2xvc2VkaXIgY2hkaXIgZ2V0Y3dkIHJld2luZGRpciByZWFkZGlyIGRpciBnbG9iIGZpbGVhdGltZSBmaWxlY3RpbWUgZmlsZWdyb3VwIGZpbGVpbm9kZSBmaWxlbXRpbWUgZmlsZW93bmVyIGZpbGVwZXJtcyBmaWxlc2l6ZSBmaWxldHlwZSBmaWxlX2V4aXN0cyBpc193cml0YWJsZSBpc193cml0ZWFibGUgaXNfcmVhZGFibGUgaXNfZXhlY3V0YWJsZSBpc19maWxlIGlzX2RpciBpc19saW5rIHN0YXQgbHN0YXQgY2hvd24gdG91Y2ggY2xlYXJzdGF0Y2FjaGUgbWFpbCBvYl9zdGFydCBvYl9mbHVzaCBvYl9jbGVhbiBvYl9lbmRfZmx1c2ggb2JfZW5kX2NsZWFuIG9iX2dldF9mbHVzaCBvYl9nZXRfY2xlYW4gb2JfZ2V0X2xlbmd0aCBvYl9nZXRfbGV2ZWwgb2JfZ2V0X3N0YXR1cyBvYl9nZXRfY29udGVudHMgb2JfaW1wbGljaXRfZmx1c2ggb2JfbGlzdF9oYW5kbGVycyBrc29ydCBrcnNvcnQgbmF0c29ydCBuYXRjYXNlc29ydCBhc29ydCBhcnNvcnQgc29ydCByc29ydCB1c29ydCB1YXNvcnQgdWtzb3J0IHNodWZmbGUgYXJyYXlfd2FsayBjb3VudCBlbmQgcHJldiBuZXh0IHJlc2V0IGN1cnJlbnQga2V5IG1pbiBtYXggaW5fYXJyYXkgYXJyYXlfc2VhcmNoIGV4dHJhY3QgY29tcGFjdCBhcnJheV9maWxsIHJhbmdlIGFycmF5X211bHRpc29ydCBhcnJheV9wdXNoIGFycmF5X3BvcCBhcnJheV9zaGlmdCBhcnJheV91bnNoaWZ0IGFycmF5X3NwbGljZSBhcnJheV9zbGljZSBhcnJheV9tZXJnZSBhcnJheV9tZXJnZV9yZWN1cnNpdmUgYXJyYXlfa2V5cyBhcnJheV92YWx1ZXMgYXJyYXlfY291bnRfdmFsdWVzIGFycmF5X3JldmVyc2UgYXJyYXlfcmVkdWNlIGFycmF5X3BhZCBhcnJheV9mbGlwIGFycmF5X2NoYW5nZV9rZXlfY2FzZSBhcnJheV9yYW5kIGFycmF5X3VuaXF1ZSBhcnJheV9pbnRlcnNlY3QgYXJyYXlfaW50ZXJzZWN0X2Fzc29jIGFycmF5X2RpZmYgYXJyYXlfZGlmZl9hc3NvYyBhcnJheV9zdW0gYXJyYXlfZmlsdGVyIGFycmF5X21hcCBhcnJheV9jaHVuayBhcnJheV9rZXlfZXhpc3RzIHBvcyBzaXplb2Yga2V5X2V4aXN0cyBhc3NlcnQgYXNzZXJ0X29wdGlvbnMgdmVyc2lvbl9jb21wYXJlIGZ0b2sgc3RyX3JvdDEzIGFnZ3JlZ2F0ZSBzZXNzaW9uX25hbWUgc2Vzc2lvbl9tb2R1bGVfbmFtZSBzZXNzaW9uX3NhdmVfcGF0aCBzZXNzaW9uX2lkIHNlc3Npb25fcmVnZW5lcmF0ZV9pZCBzZXNzaW9uX2RlY29kZSBzZXNzaW9uX3JlZ2lzdGVyIHNlc3Npb25fdW5yZWdpc3RlciBzZXNzaW9uX2lzX3JlZ2lzdGVyZWQgc2Vzc2lvbl9lbmNvZGUgc2Vzc2lvbl9zdGFydCBzZXNzaW9uX2Rlc3Ryb3kgc2Vzc2lvbl91bnNldCBzZXNzaW9uX3NldF9zYXZlX2hhbmRsZXIgc2Vzc2lvbl9jYWNoZV9saW1pdGVyIHNlc3Npb25fY2FjaGVfZXhwaXJlIHNlc3Npb25fc2V0X2Nvb2tpZV9wYXJhbXMgc2Vzc2lvbl9nZXRfY29va2llX3BhcmFtcyBzZXNzaW9uX3dyaXRlX2Nsb3NlIHByZWdfbWF0Y2ggcHJlZ19tYXRjaF9hbGwgcHJlZ19yZXBsYWNlIHByZWdfcmVwbGFjZV9jYWxsYmFjayBwcmVnX3NwbGl0IHByZWdfcXVvdGUgcHJlZ19ncmVwIG92ZXJsb2FkIGN0eXBlX2FsbnVtIGN0eXBlX2FscGhhIGN0eXBlX2NudHJsIGN0eXBlX2RpZ2l0IGN0eXBlX2xvd2VyIGN0eXBlX2dyYXBoIGN0eXBlX3ByaW50IGN0eXBlX3B1bmN0IGN0eXBlX3NwYWNlIGN0eXBlX3VwcGVyIGN0eXBlX3hkaWdpdCB2aXJ0dWFsIGFwYWNoZV9yZXF1ZXN0X2hlYWRlcnMgYXBhY2hlX25vdGUgYXBhY2hlX2xvb2t1cF91cmkgYXBhY2hlX2NoaWxkX3Rlcm1pbmF0ZSBhcGFjaGVfc2V0ZW52IGFwYWNoZV9yZXNwb25zZV9oZWFkZXJzIGFwYWNoZV9nZXRfdmVyc2lvbiBnZXRhbGxoZWFkZXJzIG15c3FsX2Nvbm5lY3QgbXlzcWxfcGNvbm5lY3QgbXlzcWxfY2xvc2UgbXlzcWxfc2VsZWN0X2RiIG15c3FsX2NyZWF0ZV9kYiBteXNxbF9kcm9wX2RiIG15c3FsX3F1ZXJ5IG15c3FsX3VuYnVmZmVyZWRfcXVlcnkgbXlzcWxfZGJfcXVlcnkgbXlzcWxfbGlzdF9kYnMgbXlzcWxfbGlzdF90YWJsZXMgbXlzcWxfbGlzdF9maWVsZHMgbXlzcWxfbGlzdF9wcm9jZXNzZXMgbXlzcWxfZXJyb3IgbXlzcWxfZXJybm8gbXlzcWxfYWZmZWN0ZWRfcm93cyBteXNxbF9pbnNlcnRfaWQgbXlzcWxfcmVzdWx0IG15c3FsX251bV9yb3dzIG15c3FsX251bV9maWVsZHMgbXlzcWxfZmV0Y2hfcm93IG15c3FsX2ZldGNoX2FycmF5IG15c3FsX2ZldGNoX2Fzc29jIG15c3FsX2ZldGNoX29iamVjdCBteXNxbF9kYXRhX3NlZWsgbXlzcWxfZmV0Y2hfbGVuZ3RocyBteXNxbF9mZXRjaF9maWVsZCBteXNxbF9maWVsZF9zZWVrIG15c3FsX2ZyZWVfcmVzdWx0IG15c3FsX2ZpZWxkX25hbWUgbXlzcWxfZmllbGRfdGFibGUgbXlzcWxfZmllbGRfbGVuIG15c3FsX2ZpZWxkX3R5cGUgbXlzcWxfZmllbGRfZmxhZ3MgbXlzcWxfZXNjYXBlX3N0cmluZyBteXNxbF9yZWFsX2VzY2FwZV9zdHJpbmcgbXlzcWxfc3RhdCBteXNxbF90aHJlYWRfaWQgbXlzcWxfY2xpZW50X2VuY29kaW5nIG15c3FsX2dldF9jbGllbnRfaW5mbyBteXNxbF9nZXRfaG9zdF9pbmZvIG15c3FsX2dldF9wcm90b19pbmZvIG15c3FsX2dldF9zZXJ2ZXJfaW5mbyBteXNxbF9pbmZvIG15c3FsIG15c3FsX2ZpZWxkbmFtZSBteXNxbF9maWVsZHRhYmxlIG15c3FsX2ZpZWxkbGVuIG15c3FsX2ZpZWxkdHlwZSBteXNxbF9maWVsZGZsYWdzIG15c3FsX3NlbGVjdGRiIG15c3FsX2NyZWF0ZWRiIG15c3FsX2Ryb3BkYiBteXNxbF9mcmVlcmVzdWx0IG15c3FsX251bWZpZWxkcyBteXNxbF9udW1yb3dzIG15c3FsX2xpc3RkYnMgbXlzcWxfbGlzdHRhYmxlcyBteXNxbF9saXN0ZmllbGRzIG15c3FsX2RiX25hbWUgbXlzcWxfZGJuYW1lIG15c3FsX3RhYmxlbmFtZSBteXNxbF90YWJsZV9uYW1lIHBnX2Nvbm5lY3QgcGdfcGNvbm5lY3QgcGdfY2xvc2UgcGdfY29ubmVjdGlvbl9zdGF0dXMgcGdfY29ubmVjdGlvbl9idXN5IHBnX2Nvbm5lY3Rpb25fcmVzZXQgcGdfaG9zdCBwZ19kYm5hbWUgcGdfcG9ydCBwZ190dHkgcGdfb3B0aW9ucyBwZ19waW5nIHBnX3F1ZXJ5IHBnX3NlbmRfcXVlcnkgcGdfY2FuY2VsX3F1ZXJ5IHBnX2ZldGNoX3Jlc3VsdCBwZ19mZXRjaF9yb3cgcGdfZmV0Y2hfYXNzb2MgcGdfZmV0Y2hfYXJyYXkgcGdfZmV0Y2hfb2JqZWN0IHBnX2ZldGNoX2FsbCBwZ19hZmZlY3RlZF9yb3dzIHBnX2dldF9yZXN1bHQgcGdfcmVzdWx0X3NlZWsgcGdfcmVzdWx0X3N0YXR1cyBwZ19mcmVlX3Jlc3VsdCBwZ19sYXN0X29pZCBwZ19udW1fcm93cyBwZ19udW1fZmllbGRzIHBnX2ZpZWxkX25hbWUgcGdfZmllbGRfbnVtIHBnX2ZpZWxkX3NpemUgcGdfZmllbGRfdHlwZSBwZ19maWVsZF9wcnRsZW4gcGdfZmllbGRfaXNfbnVsbCBwZ19nZXRfbm90aWZ5IHBnX2dldF9waWQgcGdfcmVzdWx0X2Vycm9yIHBnX2xhc3RfZXJyb3IgcGdfbGFzdF9ub3RpY2UgcGdfcHV0X2xpbmUgcGdfZW5kX2NvcHkgcGdfY29weV90byBwZ19jb3B5X2Zyb20gcGdfdHJhY2UgcGdfdW50cmFjZSBwZ19sb19jcmVhdGUgcGdfbG9fdW5saW5rIHBnX2xvX29wZW4gcGdfbG9fY2xvc2UgcGdfbG9fcmVhZCBwZ19sb193cml0ZSBwZ19sb19yZWFkX2FsbCBwZ19sb19pbXBvcnQgcGdfbG9fZXhwb3J0IHBnX2xvX3NlZWsgcGdfbG9fdGVsbCBwZ19lc2NhcGVfc3RyaW5nIHBnX2VzY2FwZV9ieXRlYSBwZ191bmVzY2FwZV9ieXRlYSBwZ19jbGllbnRfZW5jb2RpbmcgcGdfc2V0X2NsaWVudF9lbmNvZGluZyBwZ19tZXRhX2RhdGEgcGdfY29udmVydCBwZ19pbnNlcnQgcGdfdXBkYXRlIHBnX2RlbGV0ZSBwZ19zZWxlY3QgcGdfZXhlYyBwZ19nZXRsYXN0b2lkIHBnX2NtZHR1cGxlcyBwZ19lcnJvcm1lc3NhZ2UgcGdfbnVtcm93cyBwZ19udW1maWVsZHMgcGdfZmllbGRuYW1lIHBnX2ZpZWxkc2l6ZSBwZ19maWVsZHR5cGUgcGdfZmllbGRudW0gcGdfZmllbGRwcnRsZW4gcGdfZmllbGRpc251bGwgcGdfZnJlZXJlc3VsdCBwZ19yZXN1bHQgcGdfbG9yZWFkYWxsIHBnX2xvY3JlYXRlIHBnX2xvdW5saW5rIHBnX2xvb3BlbiBwZ19sb2Nsb3NlIHBnX2xvcmVhZCBwZ19sb3dyaXRlIHBnX2xvaW1wb3J0IHBnX2xvZXhwb3J0IGh0dHBfcmVzcG9uc2VfY29kZSBnZXRfZGVjbGFyZWRfdHJhaXRzIGdldGltYWdlc2l6ZWZyb21zdHJpbmcgc29ja2V0X2ltcG9ydF9zdHJlYW0gc3RyZWFtX3NldF9jaHVua19zaXplIHRyYWl0X2V4aXN0cyBoZWFkZXJfcmVnaXN0ZXJfY2FsbGJhY2sgY2xhc3NfdXNlcyBzZXNzaW9uX3N0YXR1cyBzZXNzaW9uX3JlZ2lzdGVyX3NodXRkb3duIGVjaG8gcHJpbnQgZ2xvYmFsIHN0YXRpYyBleGl0IGFycmF5IGVtcHR5IGV2YWwgaXNzZXQgdW5zZXQgZGllIGluY2x1ZGUgcmVxdWlyZSBpbmNsdWRlX29uY2UgcmVxdWlyZV9vbmNlIjsKICBDb2RlTWlycm9yLnJlZ2lzdGVySGVscGVyKCJoaW50V29yZHMiLCAicGhwIiwgW3BocEtleXdvcmRzLCBwaHBBdG9tcywgcGhwQnVpbHRpbl0uam9pbigiICIpLnNwbGl0KCIgIikpOwogIENvZGVNaXJyb3IucmVnaXN0ZXJIZWxwZXIoIndvcmRDaGFycyIsICJwaHAiLCAvW1xcdyRdLyk7CgogIHZhciBwaHBDb25maWcgPSB7CiAgICBuYW1lOiAiY2xpa2UiLAogICAgaGVscGVyVHlwZTogInBocCIsCiAgICBrZXl3b3Jkczoga2V5d29yZHMocGhwS2V5d29yZHMpLAogICAgYmxvY2tLZXl3b3Jkczoga2V5d29yZHMoImNhdGNoIGRvIGVsc2UgZWxzZWlmIGZvciBmb3JlYWNoIGlmIHN3aXRjaCB0cnkgd2hpbGUgZmluYWxseSIpLAogICAgYXRvbXM6IGtleXdvcmRzKHBocEF0b21zKSwKICAgIGJ1aWx0aW46IGtleXdvcmRzKHBocEJ1aWx0aW4pLAogICAgbXVsdGlMaW5lU3RyaW5nczogdHJ1ZSwKICAgIGhvb2tzOiB7CiAgICAgICIkIjogZnVuY3Rpb24oc3RyZWFtKSB7CiAgICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXHdcJF9dLyk7CiAgICAgICAgcmV0dXJuICJ2YXJpYWJsZS0yIjsKICAgICAgfSwKICAgICAgIjwiOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvPDwvKSkgewogICAgICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXHdcLl0vKTsKICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gaGVyZWRvYyhzdHJlYW0uY3VycmVudCgpLnNsaWNlKDMpKTsKICAgICAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9LAogICAgICAiIyI6IGZ1bmN0aW9uKHN0cmVhbSkgewogICAgICAgIHdoaWxlICghc3RyZWFtLmVvbCgpICYmICFzdHJlYW0ubWF0Y2goIj8+IiwgZmFsc2UpKSBzdHJlYW0ubmV4dCgpOwogICAgICAgIHJldHVybiAiY29tbWVudCI7CiAgICAgIH0sCiAgICAgICIvIjogZnVuY3Rpb24oc3RyZWFtKSB7CiAgICAgICAgaWYgKHN0cmVhbS5lYXQoIi8iKSkgewogICAgICAgICAgd2hpbGUgKCFzdHJlYW0uZW9sKCkgJiYgIXN0cmVhbS5tYXRjaCgiPz4iLCBmYWxzZSkpIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgICByZXR1cm4gImNvbW1lbnQiOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0sCiAgICAgICciJzogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICAgIGlmICghc3RhdGUucGhwRW5jYXBzU3RhY2spCiAgICAgICAgICBzdGF0ZS5waHBFbmNhcHNTdGFjayA9IFtdOwogICAgICAgIHN0YXRlLnBocEVuY2Fwc1N0YWNrLnB1c2goMCk7CiAgICAgICAgc3RhdGUudG9rZW5pemUgPSBzdHJpbmdXaXRoRXNjYXBlczsKICAgICAgICByZXR1cm4gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CiAgICAgIH0sCiAgICAgICJ7IjogZnVuY3Rpb24oX3N0cmVhbSwgc3RhdGUpIHsKICAgICAgICBpZiAoc3RhdGUucGhwRW5jYXBzU3RhY2sgJiYgc3RhdGUucGhwRW5jYXBzU3RhY2subGVuZ3RoID4gMCkKICAgICAgICAgIHN0YXRlLnBocEVuY2Fwc1N0YWNrW3N0YXRlLnBocEVuY2Fwc1N0YWNrLmxlbmd0aCAtIDFdKys7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9LAogICAgICAifSI6IGZ1bmN0aW9uKF9zdHJlYW0sIHN0YXRlKSB7CiAgICAgICAgaWYgKHN0YXRlLnBocEVuY2Fwc1N0YWNrICYmIHN0YXRlLnBocEVuY2Fwc1N0YWNrLmxlbmd0aCA+IDApCiAgICAgICAgICBpZiAoLS1zdGF0ZS5waHBFbmNhcHNTdGFja1tzdGF0ZS5waHBFbmNhcHNTdGFjay5sZW5ndGggLSAxXSA9PSAwKQogICAgICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHN0cmluZ1dpdGhFc2NhcGVzOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfQogIH07CgogIENvZGVNaXJyb3IuZGVmaW5lTW9kZSgicGhwIiwgZnVuY3Rpb24oY29uZmlnLCBwYXJzZXJDb25maWcpIHsKICAgIHZhciBodG1sTW9kZSA9IENvZGVNaXJyb3IuZ2V0TW9kZShjb25maWcsICJ0ZXh0L2h0bWwiKTsKICAgIHZhciBwaHBNb2RlID0gQ29kZU1pcnJvci5nZXRNb2RlKGNvbmZpZywgcGhwQ29uZmlnKTsKCiAgICBmdW5jdGlvbiBkaXNwYXRjaChzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHZhciBpc1BIUCA9IHN0YXRlLmN1ck1vZGUgPT0gcGhwTW9kZTsKICAgICAgaWYgKHN0cmVhbS5zb2woKSAmJiBzdGF0ZS5wZW5kaW5nICYmIHN0YXRlLnBlbmRpbmcgIT0gJyInICYmIHN0YXRlLnBlbmRpbmcgIT0gIiciKSBzdGF0ZS5wZW5kaW5nID0gbnVsbDsKICAgICAgaWYgKCFpc1BIUCkgewogICAgICAgIGlmIChzdHJlYW0ubWF0Y2goL148XD9cdyovKSkgewogICAgICAgICAgc3RhdGUuY3VyTW9kZSA9IHBocE1vZGU7CiAgICAgICAgICBzdGF0ZS5jdXJTdGF0ZSA9IHN0YXRlLnBocDsKICAgICAgICAgIHJldHVybiAibWV0YSI7CiAgICAgICAgfQogICAgICAgIGlmIChzdGF0ZS5wZW5kaW5nID09ICciJyB8fCBzdGF0ZS5wZW5kaW5nID09ICInIikgewogICAgICAgICAgd2hpbGUgKCFzdHJlYW0uZW9sKCkgJiYgc3RyZWFtLm5leHQoKSAhPSBzdGF0ZS5wZW5kaW5nKSB7fQogICAgICAgICAgdmFyIHN0eWxlID0gInN0cmluZyI7CiAgICAgICAgfSBlbHNlIGlmIChzdGF0ZS5wZW5kaW5nICYmIHN0cmVhbS5wb3MgPCBzdGF0ZS5wZW5kaW5nLmVuZCkgewogICAgICAgICAgc3RyZWFtLnBvcyA9IHN0YXRlLnBlbmRpbmcuZW5kOwogICAgICAgICAgdmFyIHN0eWxlID0gc3RhdGUucGVuZGluZy5zdHlsZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdmFyIHN0eWxlID0gaHRtbE1vZGUudG9rZW4oc3RyZWFtLCBzdGF0ZS5jdXJTdGF0ZSk7CiAgICAgICAgfQogICAgICAgIGlmIChzdGF0ZS5wZW5kaW5nKSBzdGF0ZS5wZW5kaW5nID0gbnVsbDsKICAgICAgICB2YXIgY3VyID0gc3RyZWFtLmN1cnJlbnQoKSwgb3BlblBIUCA9IGN1ci5zZWFyY2goLzxcPy8pLCBtOwogICAgICAgIGlmIChvcGVuUEhQICE9IC0xKSB7CiAgICAgICAgICBpZiAoc3R5bGUgPT0gInN0cmluZyIgJiYgKG0gPSBjdXIubWF0Y2goL1tcJ1wiXSQvKSkgJiYgIS9cPz4vLnRlc3QoY3VyKSkgc3RhdGUucGVuZGluZyA9IG1bMF07CiAgICAgICAgICBlbHNlIHN0YXRlLnBlbmRpbmcgPSB7ZW5kOiBzdHJlYW0ucG9zLCBzdHlsZTogc3R5bGV9OwogICAgICAgICAgc3RyZWFtLmJhY2tVcChjdXIubGVuZ3RoIC0gb3BlblBIUCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzdHlsZTsKICAgICAgfSBlbHNlIGlmIChpc1BIUCAmJiBzdGF0ZS5waHAudG9rZW5pemUgPT0gbnVsbCAmJiBzdHJlYW0ubWF0Y2goIj8+IikpIHsKICAgICAgICBzdGF0ZS5jdXJNb2RlID0gaHRtbE1vZGU7CiAgICAgICAgc3RhdGUuY3VyU3RhdGUgPSBzdGF0ZS5odG1sOwogICAgICAgIHJldHVybiAibWV0YSI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIHBocE1vZGUudG9rZW4oc3RyZWFtLCBzdGF0ZS5jdXJTdGF0ZSk7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gewogICAgICBzdGFydFN0YXRlOiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgaHRtbCA9IENvZGVNaXJyb3Iuc3RhcnRTdGF0ZShodG1sTW9kZSksIHBocCA9IENvZGVNaXJyb3Iuc3RhcnRTdGF0ZShwaHBNb2RlKTsKICAgICAgICByZXR1cm4ge2h0bWw6IGh0bWwsCiAgICAgICAgICAgICAgICBwaHA6IHBocCwKICAgICAgICAgICAgICAgIGN1ck1vZGU6IHBhcnNlckNvbmZpZy5zdGFydE9wZW4gPyBwaHBNb2RlIDogaHRtbE1vZGUsCiAgICAgICAgICAgICAgICBjdXJTdGF0ZTogcGFyc2VyQ29uZmlnLnN0YXJ0T3BlbiA/IHBocCA6IGh0bWwsCiAgICAgICAgICAgICAgICBwZW5kaW5nOiBudWxsfTsKICAgICAgfSwKCiAgICAgIGNvcHlTdGF0ZTogZnVuY3Rpb24oc3RhdGUpIHsKICAgICAgICB2YXIgaHRtbCA9IHN0YXRlLmh0bWwsIGh0bWxOZXcgPSBDb2RlTWlycm9yLmNvcHlTdGF0ZShodG1sTW9kZSwgaHRtbCksCiAgICAgICAgICAgIHBocCA9IHN0YXRlLnBocCwgcGhwTmV3ID0gQ29kZU1pcnJvci5jb3B5U3RhdGUocGhwTW9kZSwgcGhwKSwgY3VyOwogICAgICAgIGlmIChzdGF0ZS5jdXJNb2RlID09IGh0bWxNb2RlKSBjdXIgPSBodG1sTmV3OwogICAgICAgIGVsc2UgY3VyID0gcGhwTmV3OwogICAgICAgIHJldHVybiB7aHRtbDogaHRtbE5ldywgcGhwOiBwaHBOZXcsIGN1ck1vZGU6IHN0YXRlLmN1ck1vZGUsIGN1clN0YXRlOiBjdXIsCiAgICAgICAgICAgICAgICBwZW5kaW5nOiBzdGF0ZS5wZW5kaW5nfTsKICAgICAgfSwKCiAgICAgIHRva2VuOiBkaXNwYXRjaCwKCiAgICAgIGluZGVudDogZnVuY3Rpb24oc3RhdGUsIHRleHRBZnRlcikgewogICAgICAgIGlmICgoc3RhdGUuY3VyTW9kZSAhPSBwaHBNb2RlICYmIC9eXHMqPFwvLy50ZXN0KHRleHRBZnRlcikpIHx8CiAgICAgICAgICAgIChzdGF0ZS5jdXJNb2RlID09IHBocE1vZGUgJiYgL15cPz4vLnRlc3QodGV4dEFmdGVyKSkpCiAgICAgICAgICByZXR1cm4gaHRtbE1vZGUuaW5kZW50KHN0YXRlLmh0bWwsIHRleHRBZnRlcik7CiAgICAgICAgcmV0dXJuIHN0YXRlLmN1ck1vZGUuaW5kZW50KHN0YXRlLmN1clN0YXRlLCB0ZXh0QWZ0ZXIpOwogICAgICB9LAoKICAgICAgYmxvY2tDb21tZW50U3RhcnQ6ICIvKiIsCiAgICAgIGJsb2NrQ29tbWVudEVuZDogIiovIiwKICAgICAgbGluZUNvbW1lbnQ6ICIvLyIsCgogICAgICBpbm5lck1vZGU6IGZ1bmN0aW9uKHN0YXRlKSB7IHJldHVybiB7c3RhdGU6IHN0YXRlLmN1clN0YXRlLCBtb2RlOiBzdGF0ZS5jdXJNb2RlfTsgfQogICAgfTsKICB9LCAiaHRtbG1peGVkIiwgImNsaWtlIik7CgogIENvZGVNaXJyb3IuZGVmaW5lTUlNRSgiYXBwbGljYXRpb24veC1odHRwZC1waHAiLCAicGhwIik7CiAgQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJhcHBsaWNhdGlvbi94LWh0dHBkLXBocC1vcGVuIiwge25hbWU6ICJwaHAiLCBzdGFydE9wZW46IHRydWV9KTsKICBDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveC1waHAiLCBwaHBDb25maWcpOwp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/php/test.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24oKSB7CiAgdmFyIG1vZGUgPSBDb2RlTWlycm9yLmdldE1vZGUoe2luZGVudFVuaXQ6IDJ9LCAicGhwIik7CiAgZnVuY3Rpb24gTVQobmFtZSkgeyB0ZXN0Lm1vZGUobmFtZSwgbW9kZSwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7IH0KCiAgTVQoJ3NpbXBsZV90ZXN0JywKICAgICAnW21ldGEgPD9waHBdICcgKwogICAgICdba2V5d29yZCBlY2hvXSBbc3RyaW5nICJhYWEiXTsgJyArCiAgICAgJ1ttZXRhID8+XScpOwoKICBNVCgndmFyaWFibGVfaW50ZXJwb2xhdGlvbl9ub25fYWxwaGFudW1lcmljJywKICAgICAnW21ldGEgPD9waHBdJywKICAgICAnW2tleXdvcmQgZWNob10gW3N0cmluZyAiYWFhJH4kISRAJCMkJCQlJF4kJiQqJCgkKSQuJDwkPiQvJFxcJH0kXFxcIiQ6JDskPyR8JFtbJF1dJCskPWFhYSJdJywKICAgICAnW21ldGEgPz5dJyk7CgogIE1UKCd2YXJpYWJsZV9pbnRlcnBvbGF0aW9uX2RpZ2l0cycsCiAgICAgJ1ttZXRhIDw/cGhwXScsCiAgICAgJ1trZXl3b3JkIGVjaG9dIFtzdHJpbmcgImFhYSQxJDIkMyQ0JDUkNiQ3JDgkOSQwYWFhIl0nLAogICAgICdbbWV0YSA/Pl0nKTsKCiAgTVQoJ3ZhcmlhYmxlX2ludGVycG9sYXRpb25fc2ltcGxlX3N5bnRheF8xJywKICAgICAnW21ldGEgPD9waHBdJywKICAgICAnW2tleXdvcmQgZWNob10gW3N0cmluZyAiYWFhXVt2YXJpYWJsZS0yICRhYWFdW3N0cmluZyAuYWFhIl07JywKICAgICAnW21ldGEgPz5dJyk7CgogIE1UKCd2YXJpYWJsZV9pbnRlcnBvbGF0aW9uX3NpbXBsZV9zeW50YXhfMicsCiAgICAgJ1ttZXRhIDw/cGhwXScsCiAgICAgJ1trZXl3b3JkIGVjaG9dIFtzdHJpbmcgIl1bdmFyaWFibGUtMiAkYWFhYV1bWycsJ1tudW1iZXIgMl0nLCAgICAgICAgICddXVtzdHJpbmcgYWEiXTsnLAogICAgICdba2V5d29yZCBlY2hvXSBbc3RyaW5nICJdW3ZhcmlhYmxlLTIgJGFhYWFdW1snLCdbbnVtYmVyIDIzNDVdJywgICAgICAnXV1bc3RyaW5nIGFhIl07JywKICAgICAnW2tleXdvcmQgZWNob10gW3N0cmluZyAiXVt2YXJpYWJsZS0yICRhYWFhXVtbJywnW251bWJlciAyLjNdJywgICAgICAgJ11dW3N0cmluZyBhYSJdOycsCiAgICAgJ1trZXl3b3JkIGVjaG9dIFtzdHJpbmcgIl1bdmFyaWFibGUtMiAkYWFhYV1bWycsJ1t2YXJpYWJsZSBhYWFhYV0nLCAgICddXVtzdHJpbmcgYWEiXTsnLAogICAgICdba2V5d29yZCBlY2hvXSBbc3RyaW5nICJdW3ZhcmlhYmxlLTIgJGFhYWFdW1snLCdbdmFyaWFibGUtMiAkYWFhYWFdJywnXV1bc3RyaW5nIGFhIl07JywKCiAgICAgJ1trZXl3b3JkIGVjaG9dIFtzdHJpbmcgIjFhYWFdW3ZhcmlhYmxlLTIgJGFhYWFdW1snLCdbbnVtYmVyIDJdJywgICAgICAgICAnXV1bc3RyaW5nIGFhIl07JywKICAgICAnW2tleXdvcmQgZWNob10gW3N0cmluZyAiYWFhXVt2YXJpYWJsZS0yICRhYWFhXVtbJywnW251bWJlciAyMzQ1XScsICAgICAgJ11dW3N0cmluZyBhYSJdOycsCiAgICAgJ1trZXl3b3JkIGVjaG9dIFtzdHJpbmcgImFhYV1bdmFyaWFibGUtMiAkYWFhYV1bWycsJ1tudW1iZXIgMi4zXScsICAgICAgICddXVtzdHJpbmcgYWEiXTsnLAogICAgICdba2V5d29yZCBlY2hvXSBbc3RyaW5nICJhYWFdW3ZhcmlhYmxlLTIgJGFhYWFdW1snLCdbdmFyaWFibGUgYWFhYWFdJywgICAnXV1bc3RyaW5nIGFhIl07JywKICAgICAnW2tleXdvcmQgZWNob10gW3N0cmluZyAiYWFhXVt2YXJpYWJsZS0yICRhYWFhXVtbJywnW3ZhcmlhYmxlLTIgJGFhYWFhXScsJ11dW3N0cmluZyBhYSJdOycsCiAgICAgJ1ttZXRhID8+XScpOwoKICBNVCgndmFyaWFibGVfaW50ZXJwb2xhdGlvbl9zaW1wbGVfc3ludGF4XzMnLAogICAgICdbbWV0YSA8P3BocF0nLAogICAgICdba2V5d29yZCBlY2hvXSBbc3RyaW5nICJhYWFdW3ZhcmlhYmxlLTIgJGFhYWFdLT5bdmFyaWFibGUgYWFhYWFdW3N0cmluZyAuYWFhYWFhIl07JywKICAgICAnW2tleXdvcmQgZWNob10gW3N0cmluZyAiYWFhXVt2YXJpYWJsZS0yICRhYWFhXVtzdHJpbmcgLT5dW3ZhcmlhYmxlLTIgJGFhYWFhXVtzdHJpbmcgLmFhYWFhYSJdOycsCiAgICAgJ1trZXl3b3JkIGVjaG9dIFtzdHJpbmcgImFhYV1bdmFyaWFibGUtMiAkYWFhYV0tPlt2YXJpYWJsZSBhYWFhYV1bc3RyaW5nIFtbMl1dLmFhYWFhYSJdOycsCiAgICAgJ1trZXl3b3JkIGVjaG9dIFtzdHJpbmcgImFhYV1bdmFyaWFibGUtMiAkYWFhYV0tPlt2YXJpYWJsZSBhYWFhYV1bc3RyaW5nIC0+YWFhYTIuYWFhYWFhIl07JywKICAgICAnW21ldGEgPz5dJyk7CgogIE1UKCd2YXJpYWJsZV9pbnRlcnBvbGF0aW9uX2VzY2FwaW5nJywKICAgICAnW21ldGEgPD9waHBdIFtjb21tZW50IC8qIEVzY2FwaW5nICovXScsCiAgICAgJ1trZXl3b3JkIGVjaG9dIFtzdHJpbmcgImFhYVxcJGFhYWEtPmFhYS5hYWEiXTsnLAogICAgICdba2V5d29yZCBlY2hvXSBbc3RyaW5nICJhYWFcXCRhYWFhW1syXV1hYWEuYWFhIl07JywKICAgICAnW2tleXdvcmQgZWNob10gW3N0cmluZyAiYWFhXFwkYWFhYVtbYXNkXV1hYWEuYWFhIl07JywKICAgICAnW2tleXdvcmQgZWNob10gW3N0cmluZyAiYWFhe1xcJGFhYWEtPmFhYS5hYWEiXTsnLAogICAgICdba2V5d29yZCBlY2hvXSBbc3RyaW5nICJhYWF7XFwkYWFhYVtbMl1dYWFhLmFhYSJdOycsCiAgICAgJ1trZXl3b3JkIGVjaG9dIFtzdHJpbmcgImFhYXtcXGFhYWFhW1thc2RdXWFhYS5hYWEiXTsnLAogICAgICdba2V5d29yZCBlY2hvXSBbc3RyaW5nICJhYWFcXCR7YWFhYS0+YWFhLmFhYSJdOycsCiAgICAgJ1trZXl3b3JkIGVjaG9dIFtzdHJpbmcgImFhYVxcJHthYWFhW1syXV1hYWEuYWFhIl07JywKICAgICAnW2tleXdvcmQgZWNob10gW3N0cmluZyAiYWFhXFwke2FhYWFbW2FzZF1dYWFhLmFhYSJdOycsCiAgICAgJ1ttZXRhID8+XScpOwoKICBNVCgndmFyaWFibGVfaW50ZXJwb2xhdGlvbl9jb21wbGV4X3N5bnRheF8xJywKICAgICAnW21ldGEgPD9waHBdJywKICAgICAnW2tleXdvcmQgZWNob10gW3N0cmluZyAiYWFhXVt2YXJpYWJsZS0yICRde1t2YXJpYWJsZSBhYWFhXX1bc3RyaW5nIC0+YWFhLmFhYSJdOycsCiAgICAgJ1trZXl3b3JkIGVjaG9dIFtzdHJpbmcgImFhYV1bdmFyaWFibGUtMiAkXXtbdmFyaWFibGUtMiAkYWFhYV19W3N0cmluZyAtPmFhYS5hYWEiXTsnLAogICAgICdba2V5d29yZCBlY2hvXSBbc3RyaW5nICJhYWFdW3ZhcmlhYmxlLTIgJF17W3ZhcmlhYmxlLTIgJGFhYWFdW1snLCcgIFtudW1iZXIgNDJdJywnXV19W3N0cmluZyAtPmFhYS5hYWEiXTsnLAogICAgICdba2V5d29yZCBlY2hvXSBbc3RyaW5nICJhYWFdW3ZhcmlhYmxlLTIgJF17W3ZhcmlhYmxlIGFhYWFdW21ldGEgPz5dYWFhYWFhJyk7CgogIE1UKCd2YXJpYWJsZV9pbnRlcnBvbGF0aW9uX2NvbXBsZXhfc3ludGF4XzInLAogICAgICdbbWV0YSA8P3BocF0gW2NvbW1lbnQgLyogTW9uc3RlcnMgKi9dJywKICAgICAnW2tleXdvcmQgZWNob10gW3N0cmluZyAiXVt2YXJpYWJsZS0yICRde1t2YXJpYWJsZSBhYWFdW2NvbW1lbnQgLyp9Pz59ICRhYWE8P3BocCB9ICovXX1bc3RyaW5nIC0+YWFhLmFhYSJdOycsCiAgICAgJ1trZXl3b3JkIGVjaG9dIFtzdHJpbmcgIl1bdmFyaWFibGUtMiAkXXtbdmFyaWFibGUgYWFhXVtjb21tZW50IC8qfT8+Ki9dW1snLCcgIFtzdHJpbmcgImFhYV1bdmFyaWFibGUtMiAkYWFhXVtzdHJpbmcge31dW3ZhcmlhYmxlLTIgJF17W3ZhcmlhYmxlIGFhYV19W3N0cmluZyAiXScsJ11dfVtzdHJpbmcgLT5hYWEuYWFhIl07JywKICAgICAnW2tleXdvcmQgZWNob10gW3N0cmluZyAiXVt2YXJpYWJsZS0yICRde1t2YXJpYWJsZSBhYWFdW2NvbW1lbnQgLyp9IH0gJGFhYSB9ICovXX1bc3RyaW5nIC0+YWFhLmFhYSJdOycpOwoKCiAgZnVuY3Rpb24gYnVpbGRfcmVjdXJzaXZlX21vbnN0ZXJzKG50LCB0LCBuKXsKICAgIHZhciBtb25zdGVycyA9IFt0XTsKICAgIGZvciAodmFyIGkgPSAxOyBpIDw9IG47ICsraSkKICAgICAgbW9uc3RlcnNbaV0gPSBudC5qb2luKG1vbnN0ZXJzW2kgLSAxXSk7CiAgICByZXR1cm4gbW9uc3RlcnM7CiAgfQoKICB2YXIgbTEgPSBidWlsZF9yZWN1cnNpdmVfbW9uc3RlcnMoCiAgICBbJ1tzdHJpbmcgIl1bdmFyaWFibGUtMiAkXXtbdmFyaWFibGUgYWFhXSBbb3BlcmF0b3IgK10gJywgJ31bc3RyaW5nICJdJ10sCiAgICAnW2NvbW1lbnQgLyogfT8+fSAqL10gW3N0cmluZyAiYWFhXVt2YXJpYWJsZS0yICRhYWFdW3N0cmluZyAuYWFhIl0nLAogICAgMTAKICApOwoKICBNVCgndmFyaWFibGVfaW50ZXJwb2xhdGlvbl9jb21wbGV4X3N5bnRheF8zXzEnLAogICAgICdbbWV0YSA8P3BocF0gW2NvbW1lbnQgLyogUmVjdXJzaXZlIG1vbnN0ZXJzICovXScsCiAgICAgJ1trZXl3b3JkIGVjaG9dICcgKyBtMVs0XSArICc7JywKICAgICAnW2tleXdvcmQgZWNob10gJyArIG0xWzddICsgJzsnLAogICAgICdba2V5d29yZCBlY2hvXSAnICsgbTFbOF0gKyAnOycsCiAgICAgJ1trZXl3b3JkIGVjaG9dICcgKyBtMVs1XSArICc7JywKICAgICAnW2tleXdvcmQgZWNob10gJyArIG0xWzFdICsgJzsnLAogICAgICdba2V5d29yZCBlY2hvXSAnICsgbTFbNl0gKyAnOycsCiAgICAgJ1trZXl3b3JkIGVjaG9dICcgKyBtMVs5XSArICc7JywKICAgICAnW2tleXdvcmQgZWNob10gJyArIG0xWzBdICsgJzsnLAogICAgICdba2V5d29yZCBlY2hvXSAnICsgbTFbMTBdICsgJzsnLAogICAgICdba2V5d29yZCBlY2hvXSAnICsgbTFbMl0gKyAnOycsCiAgICAgJ1trZXl3b3JkIGVjaG9dICcgKyBtMVszXSArICc7JywKICAgICAnW2tleXdvcmQgZWNob10gW3N0cmluZyAiZW5kIl07JywKICAgICAnW21ldGEgPz5dJyk7CgogIHZhciBtMiA9IGJ1aWxkX3JlY3Vyc2l2ZV9tb25zdGVycygKICAgIFsnW3N0cmluZyAiYV1bdmFyaWFibGUtMiAkXXtbdmFyaWFibGUgYWFhXSBbb3BlcmF0b3IgK10gJywgJyBbb3BlcmF0b3IgK10gJywgJ31bc3RyaW5nIC5hIl0nXSwKICAgICdbY29tbWVudCAvKiB9Pz57eyAqL10gW3N0cmluZyAiYT8+fXt7YWFdW3ZhcmlhYmxlLTIgJGFhYV1bc3RyaW5nIC5hfWE/PmEiXScsCiAgICA1CiAgKTsKCiAgTVQoJ3ZhcmlhYmxlX2ludGVycG9sYXRpb25fY29tcGxleF9zeW50YXhfM18yJywKICAgICAnW21ldGEgPD9waHBdIFtjb21tZW50IC8qIFJlY3Vyc2l2ZSBtb25zdGVycyAyICovXScsCiAgICAgJ1trZXl3b3JkIGVjaG9dICcgKyBtMlswXSArICc7JywKICAgICAnW2tleXdvcmQgZWNob10gJyArIG0yWzFdICsgJzsnLAogICAgICdba2V5d29yZCBlY2hvXSAnICsgbTJbNV0gKyAnOycsCiAgICAgJ1trZXl3b3JkIGVjaG9dICcgKyBtMls0XSArICc7JywKICAgICAnW2tleXdvcmQgZWNob10gJyArIG0yWzJdICsgJzsnLAogICAgICdba2V5d29yZCBlY2hvXSAnICsgbTJbM10gKyAnOycsCiAgICAgJ1trZXl3b3JkIGVjaG9dIFtzdHJpbmcgImVuZCJdOycsCiAgICAgJ1ttZXRhID8+XScpOwoKICBmdW5jdGlvbiBidWlsZF9yZWN1cnNpdmVfbW9uc3RlcnNfMihtZjEsIG1mMiwgbnQsIHQsIG4pewogICAgdmFyIG1vbnN0ZXJzID0gW3RdOwogICAgZm9yICh2YXIgaSA9IDE7IGkgPD0gbjsgKytpKQogICAgICBtb25zdGVyc1tpXSA9IG50WzBdICsgbWYxW2kgLSAxXSArIG50WzFdICsgbWYyW2kgLSAxXSArIG50WzJdICsgbW9uc3RlcnNbaSAtIDFdICsgbnRbM107CiAgICByZXR1cm4gbW9uc3RlcnM7CiAgfQoKICB2YXIgbTMgPSBidWlsZF9yZWN1cnNpdmVfbW9uc3RlcnNfMigKICAgIG0xLAogICAgbTIsCiAgICBbJ1tzdHJpbmcgImFdW3ZhcmlhYmxlLTIgJF17W3ZhcmlhYmxlIGFhYV0gW29wZXJhdG9yICtdICcsICcgW29wZXJhdG9yICtdICcsICcgW29wZXJhdG9yICtdICcsICd9W3N0cmluZyAuYSJdJ10sCiAgICAnW2NvbW1lbnQgLyogfT8+e3sgKi9dIFtzdHJpbmcgImE/Pn17e2FhXVt2YXJpYWJsZS0yICRhYWFdW3N0cmluZyAuYX1hPz5hIl0nLAogICAgNAogICk7CgogIE1UKCd2YXJpYWJsZV9pbnRlcnBvbGF0aW9uX2NvbXBsZXhfc3ludGF4XzNfMycsCiAgICAgJ1ttZXRhIDw/cGhwXSBbY29tbWVudCAvKiBSZWN1cnNpdmUgbW9uc3RlcnMgMiAqL10nLAogICAgICdba2V5d29yZCBlY2hvXSAnICsgbTNbNF0gKyAnOycsCiAgICAgJ1trZXl3b3JkIGVjaG9dICcgKyBtM1swXSArICc7JywKICAgICAnW2tleXdvcmQgZWNob10gJyArIG0zWzNdICsgJzsnLAogICAgICdba2V5d29yZCBlY2hvXSAnICsgbTNbMV0gKyAnOycsCiAgICAgJ1trZXl3b3JkIGVjaG9dICcgKyBtM1syXSArICc7JywKICAgICAnW2tleXdvcmQgZWNob10gW3N0cmluZyAiZW5kIl07JywKICAgICAnW21ldGEgPz5dJyk7Cn0pKCk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/pig/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/pig/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogUGlnIExhdGluIG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0icGlnLmpzIj48L3NjcmlwdD4KPHN0eWxlPi5Db2RlTWlycm9yIHtib3JkZXI6IDJweCBpbnNldCAjZGVlO308L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5QaWcgTGF0aW48L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPlBpZyBMYXRpbiBtb2RlPC9oMj4KPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KLS0gQXBhY2hlIFBpZyAoUGlnIExhdGluIExhbmd1YWdlKSBEZW1vCi8qIApUaGlzIGlzIGEgbXVsdGlsaW5lIGNvbW1lbnQuCiovCmEgPSBMT0FEICJccGF0aFx0b1xpbnB1dCIgVVNJTkcgUGlnU3RvcmFnZSgnXHQnKSBBUyAoeDpsb25nLCB5OmNoYXJhcnJheSwgejpieXRlYXJyYXkpOwpiID0gR1JPVVAgYSBCWSAoeCx5LDMrNCk7CmMgPSBGT1JFQUNIIGIgR0VORVJBVEUgZmxhdHRlbihncm91cCkgYXMgKHgseSksIFNVTShncm91cC4kMikgYXMgejsKU1RPUkUgYyBJTlRPICJccGF0aFx0b1xvdXRwdXQiOwoKLS0KPC90ZXh0YXJlYT48L2Zvcm0+CgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgICAgICBpbmRlbnRVbml0OiA0LAogICAgICAgIG1vZGU6ICJ0ZXh0L3gtcGlnIgogICAgICB9KTsKICAgIDwvc2NyaXB0PgoKICAgIDxwPgogICAgICAgIFNpbXBsZSBtb2RlIHRoYXQgaGFuZGxlcyBQaWcgTGF0aW4gbGFuZ3VhZ2UuCiAgICA8L3A+CgogICAgPHA+PHN0cm9uZz5NSU1FIHR5cGUgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC94LXBpZzwvY29kZT4KICAgIChQSUcgY29kZSkKPC9odG1sPgo8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/pig/pig.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovKgogKiAgICAgIFBpZyBMYXRpbiBNb2RlIGZvciBDb2RlTWlycm9yIDIKICogICAgICBAYXV0aG9yIFByYXNhbnRoIEpheWFjaGFuZHJhbgogKiAgICAgIEBsaW5rICAgaHR0cHM6Ly9naXRodWIuY29tL3ByYXNhbnRoai9waWctY29kZW1pcnJvci0yCiAqICBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGFkYXB0ZWQgZnJvbSBQTC9TUUwgbW9kZSBpbiBDb2RlTWlycm9yIDIuCiAqLwooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJwaWciLCBmdW5jdGlvbihfY29uZmlnLCBwYXJzZXJDb25maWcpIHsKICB2YXIga2V5d29yZHMgPSBwYXJzZXJDb25maWcua2V5d29yZHMsCiAgYnVpbHRpbnMgPSBwYXJzZXJDb25maWcuYnVpbHRpbnMsCiAgdHlwZXMgPSBwYXJzZXJDb25maWcudHlwZXMsCiAgbXVsdGlMaW5lU3RyaW5ncyA9IHBhcnNlckNvbmZpZy5tdWx0aUxpbmVTdHJpbmdzOwoKICB2YXIgaXNPcGVyYXRvckNoYXIgPSAvWyorXC0lPD49Jj86XC8hfF0vOwoKICBmdW5jdGlvbiBjaGFpbihzdHJlYW0sIHN0YXRlLCBmKSB7CiAgICBzdGF0ZS50b2tlbml6ZSA9IGY7CiAgICByZXR1cm4gZihzdHJlYW0sIHN0YXRlKTsKICB9CgogIHZhciB0eXBlOwogIGZ1bmN0aW9uIHJldCh0cCwgc3R5bGUpIHsKICAgIHR5cGUgPSB0cDsKICAgIHJldHVybiBzdHlsZTsKICB9CgogIGZ1bmN0aW9uIHRva2VuQ29tbWVudChzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgaXNFbmQgPSBmYWxzZTsKICAgIHZhciBjaDsKICAgIHdoaWxlKGNoID0gc3RyZWFtLm5leHQoKSkgewogICAgICBpZihjaCA9PSAiLyIgJiYgaXNFbmQpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBpc0VuZCA9IChjaCA9PSAiKiIpOwogICAgfQogICAgcmV0dXJuIHJldCgiY29tbWVudCIsICJjb21tZW50Iik7CiAgfQoKICBmdW5jdGlvbiB0b2tlblN0cmluZyhxdW90ZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgdmFyIGVzY2FwZWQgPSBmYWxzZSwgbmV4dCwgZW5kID0gZmFsc2U7CiAgICAgIHdoaWxlKChuZXh0ID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkgewogICAgICAgIGlmIChuZXh0ID09IHF1b3RlICYmICFlc2NhcGVkKSB7CiAgICAgICAgICBlbmQgPSB0cnVlOyBicmVhazsKICAgICAgICB9CiAgICAgICAgZXNjYXBlZCA9ICFlc2NhcGVkICYmIG5leHQgPT0gIlxcIjsKICAgICAgfQogICAgICBpZiAoZW5kIHx8ICEoZXNjYXBlZCB8fCBtdWx0aUxpbmVTdHJpbmdzKSkKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTsKICAgICAgcmV0dXJuIHJldCgic3RyaW5nIiwgImVycm9yIik7CiAgICB9OwogIH0KCiAgZnVuY3Rpb24gdG9rZW5CYXNlKHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBjaCA9IHN0cmVhbS5uZXh0KCk7CgogICAgLy8gaXMgYSBzdGFydCBvZiBzdHJpbmc/CiAgICBpZiAoY2ggPT0gJyInIHx8IGNoID09ICInIikKICAgICAgcmV0dXJuIGNoYWluKHN0cmVhbSwgc3RhdGUsIHRva2VuU3RyaW5nKGNoKSk7CiAgICAvLyBpcyBpdCBvbmUgb2YgdGhlIHNwZWNpYWwgY2hhcnMKICAgIGVsc2UgaWYoL1tcW1xde31cKFwpLDtcLl0vLnRlc3QoY2gpKQogICAgICByZXR1cm4gcmV0KGNoKTsKICAgIC8vIGlzIGl0IGEgbnVtYmVyPwogICAgZWxzZSBpZigvXGQvLnRlc3QoY2gpKSB7CiAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1x3XC5dLyk7CiAgICAgIHJldHVybiByZXQoIm51bWJlciIsICJudW1iZXIiKTsKICAgIH0KICAgIC8vIG11bHRpIGxpbmUgY29tbWVudCBvciBvcGVyYXRvcgogICAgZWxzZSBpZiAoY2ggPT0gIi8iKSB7CiAgICAgIGlmIChzdHJlYW0uZWF0KCIqIikpIHsKICAgICAgICByZXR1cm4gY2hhaW4oc3RyZWFtLCBzdGF0ZSwgdG9rZW5Db21tZW50KTsKICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICBzdHJlYW0uZWF0V2hpbGUoaXNPcGVyYXRvckNoYXIpOwogICAgICAgIHJldHVybiByZXQoIm9wZXJhdG9yIiwgIm9wZXJhdG9yIik7CiAgICAgIH0KICAgIH0KICAgIC8vIHNpbmdsZSBsaW5lIGNvbW1lbnQgb3Igb3BlcmF0b3IKICAgIGVsc2UgaWYgKGNoPT0iLSIpIHsKICAgICAgaWYoc3RyZWFtLmVhdCgiLSIpKXsKICAgICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICAgICAgcmV0dXJuIHJldCgiY29tbWVudCIsICJjb21tZW50Iik7CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgc3RyZWFtLmVhdFdoaWxlKGlzT3BlcmF0b3JDaGFyKTsKICAgICAgICByZXR1cm4gcmV0KCJvcGVyYXRvciIsICJvcGVyYXRvciIpOwogICAgICB9CiAgICB9CiAgICAvLyBpcyBpdCBhbiBvcGVyYXRvcgogICAgZWxzZSBpZiAoaXNPcGVyYXRvckNoYXIudGVzdChjaCkpIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKGlzT3BlcmF0b3JDaGFyKTsKICAgICAgcmV0dXJuIHJldCgib3BlcmF0b3IiLCAib3BlcmF0b3IiKTsKICAgIH0KICAgIGVsc2UgewogICAgICAvLyBnZXQgdGhlIHdoaWxlIHdvcmQKICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXHdcJF9dLyk7CiAgICAgIC8vIGlzIGl0IG9uZSBvZiB0aGUgbGlzdGVkIGtleXdvcmRzPwogICAgICBpZiAoa2V5d29yZHMgJiYga2V5d29yZHMucHJvcGVydHlJc0VudW1lcmFibGUoc3RyZWFtLmN1cnJlbnQoKS50b1VwcGVyQ2FzZSgpKSkgewogICAgICAgIGlmIChzdHJlYW0uZWF0KCIpIikgfHwgc3RyZWFtLmVhdCgiLiIpKSB7CiAgICAgICAgICAvL2tleXdvcmRzIGNhbiBiZSB1c2VkIGFzIHZhcmlhYmxlcyBsaWtlIGZsYXR0ZW4oZ3JvdXApLCBncm91cC4kMCBldGMuLgogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgIHJldHVybiAoImtleXdvcmQiLCAia2V5d29yZCIpOwogICAgICAgIH0KICAgICAgfQogICAgICAvLyBpcyBpdCBvbmUgb2YgdGhlIGJ1aWx0aW4gZnVuY3Rpb25zPwogICAgICBpZiAoYnVpbHRpbnMgJiYgYnVpbHRpbnMucHJvcGVydHlJc0VudW1lcmFibGUoc3RyZWFtLmN1cnJlbnQoKS50b1VwcGVyQ2FzZSgpKSkKICAgICAgewogICAgICAgIHJldHVybiAoImtleXdvcmQiLCAidmFyaWFibGUtMiIpOwogICAgICB9CiAgICAgIC8vIGlzIGl0IG9uZSBvZiB0aGUgbGlzdGVkIHR5cGVzPwogICAgICBpZiAodHlwZXMgJiYgdHlwZXMucHJvcGVydHlJc0VudW1lcmFibGUoc3RyZWFtLmN1cnJlbnQoKS50b1VwcGVyQ2FzZSgpKSkKICAgICAgICByZXR1cm4gKCJrZXl3b3JkIiwgInZhcmlhYmxlLTMiKTsKICAgICAgLy8gZGVmYXVsdCBpcyBhICd2YXJpYWJsZScKICAgICAgcmV0dXJuIHJldCgidmFyaWFibGUiLCAicGlnLXdvcmQiKTsKICAgIH0KICB9CgogIC8vIEludGVyZmFjZQogIHJldHVybiB7CiAgICBzdGFydFN0YXRlOiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICB0b2tlbml6ZTogdG9rZW5CYXNlLAogICAgICAgIHN0YXJ0T2ZMaW5lOiB0cnVlCiAgICAgIH07CiAgICB9LAoKICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIGlmKHN0cmVhbS5lYXRTcGFjZSgpKSByZXR1cm4gbnVsbDsKICAgICAgdmFyIHN0eWxlID0gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CiAgICAgIHJldHVybiBzdHlsZTsKICAgIH0KICB9Owp9KTsKCihmdW5jdGlvbigpIHsKICBmdW5jdGlvbiBrZXl3b3JkcyhzdHIpIHsKICAgIHZhciBvYmogPSB7fSwgd29yZHMgPSBzdHIuc3BsaXQoIiAiKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgd29yZHMubGVuZ3RoOyArK2kpIG9ialt3b3Jkc1tpXV0gPSB0cnVlOwogICAgcmV0dXJuIG9iajsKICB9CgogIC8vIGJ1aWx0aW4gZnVuY3MgdGFrZW4gZnJvbSB0cnVuayByZXZpc2lvbiAxMzAzMjM3CiAgdmFyIHBCdWlsdGlucyA9ICJBQlMgQUNPUyBBUklUWSBBU0lOIEFUQU4gQVZHIEJBR1NJWkUgQklOU1RPUkFHRSBCTE9PTSBCVUlMREJMT09NIENCUlQgQ0VJTCAiCiAgICArICJDT05DQVQgQ09SIENPUyBDT1NIIENPVU5UIENPVU5UX1NUQVIgQ09WIENPTlNUQU5UU0laRSBDVUJFRElNRU5TSU9OUyBESUZGIERJU1RJTkNUIERPVUJMRUFCUyAiCiAgICArICJET1VCTEVBVkcgRE9VQkxFQkFTRSBET1VCTEVNQVggRE9VQkxFTUlOIERPVUJMRVJPVU5EIERPVUJMRVNVTSBFWFAgRkxPT1IgRkxPQVRBQlMgRkxPQVRBVkcgIgogICAgKyAiRkxPQVRNQVggRkxPQVRNSU4gRkxPQVRST1VORCBGTE9BVFNVTSBHRU5FUklDSU5WT0tFUiBJTkRFWE9GIElOVEFCUyBJTlRBVkcgSU5UTUFYIElOVE1JTiAiCiAgICArICJJTlRTVU0gSU5WT0tFRk9SRE9VQkxFIElOVk9LRUZPUkZMT0FUIElOVk9LRUZPUklOVCBJTlZPS0VGT1JMT05HIElOVk9LRUZPUlNUUklORyBJTlZPS0VSICIKICAgICsgIklTRU1QVFkgSlNPTkxPQURFUiBKU09OTUVUQURBVEEgSlNPTlNUT1JBR0UgTEFTVF9JTkRFWF9PRiBMQ0ZJUlNUIExPRyBMT0cxMCBMT1dFUiBMT05HQUJTICIKICAgICsgIkxPTkdBVkcgTE9OR01BWCBMT05HTUlOIExPTkdTVU0gTUFYIE1JTiBNQVBTSVpFIE1PTklUT1JFRFVERiBOT05ERVRFUk1JTklTVElDIE9VVFBVVFNDSEVNQSAgIgogICAgKyAiUElHU1RPUkFHRSBQSUdTVFJFQU1JTkcgUkFORE9NIFJFR0VYX0VYVFJBQ1QgUkVHRVhfRVhUUkFDVF9BTEwgUkVQTEFDRSBST1VORCBTSU4gU0lOSCBTSVpFICIKICAgICsgIlNRUlQgU1RSU1BMSVQgU1VCU1RSSU5HIFNVTSBTVFJJTkdDT05DQVQgU1RSSU5HTUFYIFNUUklOR01JTiBTVFJJTkdTSVpFIFRBTiBUQU5IIFRPQkFHICIKICAgICsgIlRPS0VOSVpFIFRPTUFQIFRPUCBUT1RVUExFIFRSSU0gVEVYVExPQURFUiBUVVBMRVNJWkUgVUNGSVJTVCBVUFBFUiBVVEY4U1RPUkFHRUNPTlZFUlRFUiAiOwoKICAvLyB0YWtlbiBmcm9tIFF1ZXJ5TGV4ZXIuZwogIHZhciBwS2V5d29yZHMgPSAiVk9JRCBJTVBPUlQgUkVUVVJOUyBERUZJTkUgTE9BRCBGSUxURVIgRk9SRUFDSCBPUkRFUiBDVUJFIERJU1RJTkNUIENPR1JPVVAgIgogICAgKyAiSk9JTiBDUk9TUyBVTklPTiBTUExJVCBJTlRPIElGIE9USEVSV0lTRSBBTEwgQVMgQlkgVVNJTkcgSU5ORVIgT1VURVIgT05TQ0hFTUEgUEFSQUxMRUwgIgogICAgKyAiUEFSVElUSU9OIEdST1VQIEFORCBPUiBOT1QgR0VORVJBVEUgRkxBVFRFTiBBU0MgREVTQyBJUyBTVFJFQU0gVEhST1VHSCBTVE9SRSBNQVBSRURVQ0UgIgogICAgKyAiU0hJUCBDQUNIRSBJTlBVVCBPVVRQVVQgU1RERVJST1IgU1RESU4gU1RET1VUIExJTUlUIFNBTVBMRSBMRUZUIFJJR0hUIEZVTEwgRVEgR1QgTFQgR1RFIExURSAiCiAgICArICJORVEgTUFUQ0hFUyBUUlVFIEZBTFNFIERVTVAiOwoKICAvLyBkYXRhIHR5cGVzCiAgdmFyIHBUeXBlcyA9ICJCT09MRUFOIElOVCBMT05HIEZMT0FUIERPVUJMRSBDSEFSQVJSQVkgQllURUFSUkFZIEJBRyBUVVBMRSBNQVAgIjsKCiAgQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtcGlnIiwgewogICAgbmFtZTogInBpZyIsCiAgICBidWlsdGluczoga2V5d29yZHMocEJ1aWx0aW5zKSwKICAgIGtleXdvcmRzOiBrZXl3b3JkcyhwS2V5d29yZHMpLAogICAgdHlwZXM6IGtleXdvcmRzKHBUeXBlcykKICB9KTsKCiAgQ29kZU1pcnJvci5yZWdpc3RlckhlbHBlcigiaGludFdvcmRzIiwgInBpZyIsIChwQnVpbHRpbnMgKyBwVHlwZXMgKyBwS2V5d29yZHMpLnNwbGl0KCIgIikpOwp9KCkpOwoKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/properties/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/properties/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogUHJvcGVydGllcyBmaWxlcyBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9InByb3BlcnRpZXMuanMiPjwvc2NyaXB0Pgo8c3R5bGU+LkNvZGVNaXJyb3Ige2JvcmRlci10b3A6IDFweCBzb2xpZCAjZGRkOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2RkZDt9PC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aW1nIGlkPWxvZ28gc3JjPSIuLi8uLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5MYW5ndWFnZSBtb2RlczwvYT4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+UHJvcGVydGllcyBmaWxlczwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+UHJvcGVydGllcyBmaWxlcyBtb2RlPC9oMj4KPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KIyBUaGlzIGlzIGEgcHJvcGVydGllcyBmaWxlCmEua2V5ID0gQSB2YWx1ZQphbm90aGVyLmtleSA9IGh0dHA6Ly9leGFtcGxlLmNvbQohIEV4Y2xhbWF0aW9uIG1hcmsgYXMgY29tbWVudApidXQubm90PVdpdGhpbiAhIEEgdmFsdWUgIyBpbmRlZWQKICAgIyBTcGFjZXMgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGxpbmUKICAgc3BhY2VzLmJlZm9yZS5rZXk9dmFsdWUKYmFja3NsYXNoPVVzZWQgZm9yIG11bHRpXAogICAgICAgICAgbGluZSBlbnRyaWVzLFwKICAgICAgICAgIHRoYXQncyBjb252ZW5pZW50LgojIFVuaWNvZGUgc2VxdWVuY2VzCnVuaWNvZGUua2V5PVRoaXMgaXMgXHUwMDIwIFVuaWNvZGUKbm8ubXVsdGlsaW5lPWhlcmUKIyBDb2xvbnMKY29sb25zIDogY2FuIGJlIHVzZWQgdG9vCiMgU3BhY2VzCnNwYWNlc1wgaW5cIGtleXM9Tm90IHZlcnkgY29tbW9uLi4uCjwvdGV4dGFyZWE+PC9mb3JtPgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHt9KTsKICAgIDwvc2NyaXB0PgoKICAgIDxwPjxzdHJvbmc+TUlNRSB0eXBlcyBkZWZpbmVkOjwvc3Ryb25nPiA8Y29kZT50ZXh0L3gtcHJvcGVydGllczwvY29kZT4sCiAgICA8Y29kZT50ZXh0L3gtaW5pPC9jb2RlPi48L3A+CgogIDwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/properties/properties.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJwcm9wZXJ0aWVzIiwgZnVuY3Rpb24oKSB7CiAgcmV0dXJuIHsKICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHZhciBzb2wgPSBzdHJlYW0uc29sKCkgfHwgc3RhdGUuYWZ0ZXJTZWN0aW9uOwogICAgICB2YXIgZW9sID0gc3RyZWFtLmVvbCgpOwoKICAgICAgc3RhdGUuYWZ0ZXJTZWN0aW9uID0gZmFsc2U7CgogICAgICBpZiAoc29sKSB7CiAgICAgICAgaWYgKHN0YXRlLm5leHRNdWx0aWxpbmUpIHsKICAgICAgICAgIHN0YXRlLmluTXVsdGlsaW5lID0gdHJ1ZTsKICAgICAgICAgIHN0YXRlLm5leHRNdWx0aWxpbmUgPSBmYWxzZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc3RhdGUucG9zaXRpb24gPSAiZGVmIjsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGlmIChlb2wgJiYgISBzdGF0ZS5uZXh0TXVsdGlsaW5lKSB7CiAgICAgICAgc3RhdGUuaW5NdWx0aWxpbmUgPSBmYWxzZTsKICAgICAgICBzdGF0ZS5wb3NpdGlvbiA9ICJkZWYiOwogICAgICB9CgogICAgICBpZiAoc29sKSB7CiAgICAgICAgd2hpbGUoc3RyZWFtLmVhdFNwYWNlKCkpOwogICAgICB9CgogICAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpOwoKICAgICAgaWYgKHNvbCAmJiAoY2ggPT09ICIjIiB8fCBjaCA9PT0gIiEiIHx8IGNoID09PSAiOyIpKSB7CiAgICAgICAgc3RhdGUucG9zaXRpb24gPSAiY29tbWVudCI7CiAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICAgIHJldHVybiAiY29tbWVudCI7CiAgICAgIH0gZWxzZSBpZiAoc29sICYmIGNoID09PSAiWyIpIHsKICAgICAgICBzdGF0ZS5hZnRlclNlY3Rpb24gPSB0cnVlOwogICAgICAgIHN0cmVhbS5za2lwVG8oIl0iKTsgc3RyZWFtLmVhdCgiXSIpOwogICAgICAgIHJldHVybiAiaGVhZGVyIjsKICAgICAgfSBlbHNlIGlmIChjaCA9PT0gIj0iIHx8IGNoID09PSAiOiIpIHsKICAgICAgICBzdGF0ZS5wb3NpdGlvbiA9ICJxdW90ZSI7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0gZWxzZSBpZiAoY2ggPT09ICJcXCIgJiYgc3RhdGUucG9zaXRpb24gPT09ICJxdW90ZSIpIHsKICAgICAgICBpZiAoc3RyZWFtLm5leHQoKSAhPT0gInUiKSB7ICAgIC8vIHUgPSBVbmljb2RlIHNlcXVlbmNlIFx1MTIzNAogICAgICAgICAgLy8gTXVsdGlsaW5lIHZhbHVlCiAgICAgICAgICBzdGF0ZS5uZXh0TXVsdGlsaW5lID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiBzdGF0ZS5wb3NpdGlvbjsKICAgIH0sCgogICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgcG9zaXRpb24gOiAiZGVmIiwgICAgICAgLy8gQ3VycmVudCBwb3NpdGlvbiwgImRlZiIsICJxdW90ZSIgb3IgImNvbW1lbnQiCiAgICAgICAgbmV4dE11bHRpbGluZSA6IGZhbHNlLCAgLy8gSXMgdGhlIG5leHQgbGluZSBtdWx0aWxpbmUgdmFsdWUKICAgICAgICBpbk11bHRpbGluZSA6IGZhbHNlLCAgICAvLyBJcyB0aGUgY3VycmVudCBsaW5lIGEgbXVsdGlsaW5lIHZhbHVlCiAgICAgICAgYWZ0ZXJTZWN0aW9uIDogZmFsc2UgICAgLy8gRGlkIHdlIGp1c3Qgb3BlbiBhIHNlY3Rpb24KICAgICAgfTsKICAgIH0KCiAgfTsKfSk7CgpDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveC1wcm9wZXJ0aWVzIiwgInByb3BlcnRpZXMiKTsKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtaW5pIiwgInByb3BlcnRpZXMiKTsKCn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/puppet/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/puppet/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogUHVwcGV0IG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vLi4vYWRkb24vZWRpdC9tYXRjaGJyYWNrZXRzLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9InB1cHBldC5qcyI+PC9zY3JpcHQ+CjxzdHlsZT4KICAgICAgLkNvZGVNaXJyb3Ige2JvcmRlci10b3A6IDFweCBzb2xpZCBibGFjazsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO30KICAgICAgLmNtLXMtZGVmYXVsdCBzcGFuLmNtLWFycm93IHsgY29sb3I6IHJlZDsgfQogICAgPC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aW1nIGlkPWxvZ28gc3JjPSIuLi8uLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5MYW5ndWFnZSBtb2RlczwvYT4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+UHVwcGV0PC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5QdXBwZXQgbW9kZTwvaDI+Cjxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+CiMgPT0gQ2xhc3M6IGF1dG9teXNxbGJhY2t1cAojCiMgUHVwcGV0IG1vZHVsZSB0byBpbnN0YWxsIEF1dG9NeVNRTEJhY2t1cCBmb3IgcGVyaW9kaWMgTXlTUUwgYmFja3Vwcy4KIwojIGNsYXNzIHsgJ2F1dG9teXNxbGJhY2t1cCc6CiMgICBiYWNrdXBfZGlyID0+ICcvbW50L2JhY2t1cHMnLAojIH0KIwoKY2xhc3MgYXV0b215c3FsYmFja3VwICgKICAkYmluX2RpciA9ICRhdXRvbXlzcWxiYWNrdXA6OnBhcmFtczo6YmluX2RpciwKICAkZXRjX2RpciA9ICRhdXRvbXlzcWxiYWNrdXA6OnBhcmFtczo6ZXRjX2RpciwKICAkYmFja3VwX2RpciA9ICRhdXRvbXlzcWxiYWNrdXA6OnBhcmFtczo6YmFja3VwX2RpciwKICAkaW5zdGFsbF9tdWx0aWNvcmUgPSB1bmRlZiwKICAkY29uZmlnID0ge30sCiAgJGNvbmZpZ19kZWZhdWx0cyA9IHt9LAopIGluaGVyaXRzIGF1dG9teXNxbGJhY2t1cDo6cGFyYW1zIHsKCiMgRW5zdXJlIHZhbGlkIHBhdGhzIGFyZSBhc3NpZ25lZAogIHZhbGlkYXRlX2Fic29sdXRlX3BhdGgoJGJpbl9kaXIpCiAgdmFsaWRhdGVfYWJzb2x1dGVfcGF0aCgkZXRjX2RpcikKICB2YWxpZGF0ZV9hYnNvbHV0ZV9wYXRoKCRiYWNrdXBfZGlyKQoKIyBDcmVhdGUgYSBzdWJkaXJlY3RvcnkgaW4gL2V0YyBmb3IgY29uZmlnIGZpbGVzCiAgZmlsZSB7ICRldGNfZGlyOgogICAgZW5zdXJlID0+IGRpcmVjdG9yeSwKICAgIG93bmVyID0+ICdyb290JywKICAgIGdyb3VwID0+ICdyb290JywKICAgIG1vZGUgPT4gJzA3NTAnLAogIH0KCiMgQ3JlYXRlIGFuIGV4YW1wbGUgYmFja3VwIGZpbGUsIHVzZWZ1bCBmb3IgcmVmZXJlbmNlCiAgZmlsZSB7ICIke2V0Y19kaXJ9L2F1dG9teXNxbGJhY2t1cC5jb25mLmV4YW1wbGUiOgogICAgZW5zdXJlID0+IGZpbGUsCiAgICBvd25lciA9PiAncm9vdCcsCiAgICBncm91cCA9PiAncm9vdCcsCiAgICBtb2RlID0+ICcwNjYwJywKICAgIHNvdXJjZSA9PiAncHVwcGV0Oi8vL21vZHVsZXMvYXV0b215c3FsYmFja3VwL2F1dG9teXNxbGJhY2t1cC5jb25mJywKICB9CgojIEFkZCBmaWxlcyBmcm9tIHRoZSBkZXZlbG9wZXIKICBmaWxlIHsgIiR7ZXRjX2Rpcn0vQU1CX1JFQURNRSI6CiAgICBlbnN1cmUgPT4gZmlsZSwKICAgIHNvdXJjZSA9PiAncHVwcGV0Oi8vL21vZHVsZXMvYXV0b215c3FsYmFja3VwL0FNQl9SRUFETUUnLAogIH0KICBmaWxlIHsgIiR7ZXRjX2Rpcn0vQU1CX0xJQ0VOU0UiOgogICAgZW5zdXJlID0+IGZpbGUsCiAgICBzb3VyY2UgPT4gJ3B1cHBldDovLy9tb2R1bGVzL2F1dG9teXNxbGJhY2t1cC9BTUJfTElDRU5TRScsCiAgfQoKIyBJbnN0YWxsIHRoZSBhY3R1YWwgYmluYXJ5IGZpbGUKICBmaWxlIHsgIiR7YmluX2Rpcn0vYXV0b215c3FsYmFja3VwIjoKICAgIGVuc3VyZSA9PiBmaWxlLAogICAgb3duZXIgPT4gJ3Jvb3QnLAogICAgZ3JvdXAgPT4gJ3Jvb3QnLAogICAgbW9kZSA9PiAnMDc1NScsCiAgICBzb3VyY2UgPT4gJ3B1cHBldDovLy9tb2R1bGVzL2F1dG9teXNxbGJhY2t1cC9hdXRvbXlzcWxiYWNrdXAnLAogIH0KCiMgQ3JlYXRlIHRoZSBiYXNlIGJhY2t1cCBkaXJlY3RvcnkKICBmaWxlIHsgJGJhY2t1cF9kaXI6CiAgICBlbnN1cmUgPT4gZGlyZWN0b3J5LAogICAgb3duZXIgPT4gJ3Jvb3QnLAogICAgZ3JvdXAgPT4gJ3Jvb3QnLAogICAgbW9kZSA9PiAnMDc1NScsCiAgfQoKIyBJZiB5b3UnZCBsaWtlIHRvIGtlZXAgeW91ciBjb25maWcgaW4gaGllcmEgYW5kIHBhc3MgaXQgdG8gdGhpcyBjbGFzcwogIGlmICFlbXB0eSgkY29uZmlnKSB7CiAgICBjcmVhdGVfcmVzb3VyY2VzKCdhdXRvbXlzcWxiYWNrdXA6OmJhY2t1cCcsICRjb25maWcsICRjb25maWdfZGVmYXVsdHMpCiAgfQoKIyBJZiB1c2luZyBSZWRIYXQgZmFtaWx5LCBtdXN0IGhhdmUgdGhlIFJQTWZvcmdlIHJlcG8ncyBlbmFibGVkCiAgaWYgJGluc3RhbGxfbXVsdGljb3JlIHsKICAgIHBhY2thZ2UgeyBbJ3BpZ3onLCAncGJ6aXAyJ106IGVuc3VyZSA9PiBpbnN0YWxsZWQgfQogIH0KCn0KPC90ZXh0YXJlYT48L2Zvcm0+CiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgICAgIG1vZGU6ICJ0ZXh0L3gtcHVwcGV0IiwKICAgICAgICBtYXRjaEJyYWNrZXRzOiB0cnVlLAogICAgICAgIGluZGVudFVuaXQ6IDQKICAgICAgfSk7CiAgICA8L3NjcmlwdD4KCiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC94LXB1cHBldDwvY29kZT4uPC9wPgoKICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/puppet/puppet.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJwdXBwZXQiLCBmdW5jdGlvbiAoKSB7CiAgLy8gU3RvcmVzIHRoZSB3b3JkcyBmcm9tIHRoZSBkZWZpbmUgbWV0aG9kCiAgdmFyIHdvcmRzID0ge307CiAgLy8gVGFrZW4sIG1vc3RseSwgZnJvbSB0aGUgUHVwcGV0IG9mZmljaWFsIHZhcmlhYmxlIHN0YW5kYXJkcyByZWdleAogIHZhciB2YXJpYWJsZV9yZWdleCA9IC8oeyk/KFthLXpdW2EtejAtOV9dKik/KCg6OlthLXpdW2EtejAtOV9dKikqOjopP1thLXpBLVowLTlfXSsofSk/LzsKCiAgLy8gVGFrZXMgYSBzdHJpbmcgb2Ygd29yZHMgc2VwYXJhdGVkIGJ5IHNwYWNlcyBhbmQgYWRkcyB0aGVtIGFzCiAgLy8ga2V5cyB3aXRoIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgYXJndW1lbnQgJ3N0eWxlJwogIGZ1bmN0aW9uIGRlZmluZShzdHlsZSwgc3RyaW5nKSB7CiAgICB2YXIgc3BsaXQgPSBzdHJpbmcuc3BsaXQoJyAnKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3BsaXQubGVuZ3RoOyBpKyspIHsKICAgICAgd29yZHNbc3BsaXRbaV1dID0gc3R5bGU7CiAgICB9CiAgfQoKICAvLyBUYWtlcyBjb21tb25seSBrbm93biBwdXBwZXQgdHlwZXMvd29yZHMgYW5kIGNsYXNzaWZpZXMgdGhlbSB0byBhIHN0eWxlCiAgZGVmaW5lKCdrZXl3b3JkJywgJ2NsYXNzIGRlZmluZSBzaXRlIG5vZGUgaW5jbHVkZSBpbXBvcnQgaW5oZXJpdHMnKTsKICBkZWZpbmUoJ2tleXdvcmQnLCAnY2FzZSBpZiBlbHNlIGluIGFuZCBlbHNpZiBkZWZhdWx0IG9yJyk7CiAgZGVmaW5lKCdhdG9tJywgJ2ZhbHNlIHRydWUgcnVubmluZyBwcmVzZW50IGFic2VudCBmaWxlIGRpcmVjdG9yeSB1bmRlZicpOwogIGRlZmluZSgnYnVpbHRpbicsICdhY3Rpb24gYXVnZWFzIGJ1cnN0IGNoYWluIGNvbXB1dGVyIGNyb24gZGVzdGluYXRpb24gZHBvcnQgZXhlYyAnICsKICAgICdmaWxlIGZpbGVidWNrZXQgZ3JvdXAgaG9zdCBpY21wIGluaWZhY2UgaW50ZXJmYWNlIGp1bXAgazVsb2dpbiBsaW1pdCBsb2dfbGV2ZWwgJyArCiAgICAnbG9nX3ByZWZpeCBtYWNhdXRob3JpemF0aW9uIG1haWxhbGlhcyBtYWlsbGlzdCBtY3ggbW91bnQgbmFnaW9zX2NvbW1hbmQgJyArCiAgICAnbmFnaW9zX2NvbnRhY3QgbmFnaW9zX2NvbnRhY3Rncm91cCBuYWdpb3NfaG9zdCBuYWdpb3NfaG9zdGRlcGVuZGVuY3kgJyArCiAgICAnbmFnaW9zX2hvc3Rlc2NhbGF0aW9uIG5hZ2lvc19ob3N0ZXh0aW5mbyBuYWdpb3NfaG9zdGdyb3VwIG5hZ2lvc19zZXJ2aWNlICcgKwogICAgJ25hZ2lvc19zZXJ2aWNlZGVwZW5kZW5jeSBuYWdpb3Nfc2VydmljZWVzY2FsYXRpb24gbmFnaW9zX3NlcnZpY2VleHRpbmZvICcgKwogICAgJ25hZ2lvc19zZXJ2aWNlZ3JvdXAgbmFnaW9zX3RpbWVwZXJpb2QgbmFtZSBub3RpZnkgb3V0aWZhY2UgcGFja2FnZSBwcm90byByZWplY3QgJyArCiAgICAncmVzb3VyY2VzIHJvdXRlciBzY2hlZHVsZSBzY2hlZHVsZWRfdGFzayBzZWxib29sZWFuIHNlbG1vZHVsZSBzZXJ2aWNlIHNvdXJjZSAnICsKICAgICdzcG9ydCBzc2hfYXV0aG9yaXplZF9rZXkgc3Noa2V5IHN0YWdlIHN0YXRlIHRhYmxlIHRpZHkgdG9kZXN0IHRvcG9ydHMgdG9zb3VyY2UgJyArCiAgICAndXNlciB2bGFuIHl1bXJlcG8gemZzIHpvbmUgenBvb2wnKTsKCiAgLy8gQWZ0ZXIgZmluZGluZyBhIHN0YXJ0IG9mIGEgc3RyaW5nICgnfCIpIHRoaXMgZnVuY3Rpb24gYXR0ZW1wdHMgdG8gZmluZCB0aGUgZW5kOwogIC8vIElmIGEgdmFyaWFibGUgaXMgZW5jb3VudGVyZWQgYWxvbmcgdGhlIHdheSwgd2UgZGlzcGxheSBpdCBkaWZmZXJlbnRseSB3aGVuIGl0CiAgLy8gaXMgZW5jYXBzdWxhdGVkIGluIGEgZG91YmxlLXF1b3RlZCBzdHJpbmcuCiAgZnVuY3Rpb24gdG9rZW5TdHJpbmcoc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIGN1cnJlbnQsIHByZXYsIGZvdW5kX3ZhciA9IGZhbHNlOwogICAgd2hpbGUgKCFzdHJlYW0uZW9sKCkgJiYgKGN1cnJlbnQgPSBzdHJlYW0ubmV4dCgpKSAhPSBzdGF0ZS5wZW5kaW5nKSB7CiAgICAgIGlmIChjdXJyZW50ID09PSAnJCcgJiYgcHJldiAhPSAnXFwnICYmIHN0YXRlLnBlbmRpbmcgPT0gJyInKSB7CiAgICAgICAgZm91bmRfdmFyID0gdHJ1ZTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBwcmV2ID0gY3VycmVudDsKICAgIH0KICAgIGlmIChmb3VuZF92YXIpIHsKICAgICAgc3RyZWFtLmJhY2tVcCgxKTsKICAgIH0KICAgIGlmIChjdXJyZW50ID09IHN0YXRlLnBlbmRpbmcpIHsKICAgICAgc3RhdGUuY29udGludWVTdHJpbmcgPSBmYWxzZTsKICAgIH0gZWxzZSB7CiAgICAgIHN0YXRlLmNvbnRpbnVlU3RyaW5nID0gdHJ1ZTsKICAgIH0KICAgIHJldHVybiAic3RyaW5nIjsKICB9CgogIC8vIE1haW4gZnVuY3Rpb24KICBmdW5jdGlvbiB0b2tlbml6ZShzdHJlYW0sIHN0YXRlKSB7CiAgICAvLyBNYXRjaGVzIG9uZSB3aG9sZSB3b3JkCiAgICB2YXIgd29yZCA9IHN0cmVhbS5tYXRjaCgvW1x3XSsvLCBmYWxzZSk7CiAgICAvLyBNYXRjaGVzIGF0dHJpYnV0ZXMgKGkuZS4gZW5zdXJlID0+IHByZXNlbnQgOyAnZW5zdXJlJyB3b3VsZCBiZSBtYXRjaGVkKQogICAgdmFyIGF0dHJpYnV0ZSA9IHN0cmVhbS5tYXRjaCgvKFxzKyk/XHcrXHMrPT4uKi8sIGZhbHNlKTsKICAgIC8vIE1hdGNoZXMgbm9uLWJ1aWx0aW4gcmVzb3VyY2UgZGVjbGFyYXRpb25zCiAgICAvLyAoaS5lLiAiYXBhY2hlOjp2aG9zdCB7IiBvciAibXljdXN0b21jbGFzc3MgeyIgd291bGQgYmUgbWF0Y2hlZCkKICAgIHZhciByZXNvdXJjZSA9IHN0cmVhbS5tYXRjaCgvKFxzKyk/W1x3Ol9dKyhccyspP3svLCBmYWxzZSk7CiAgICAvLyBNYXRjaGVzIHZpcnR1YWwgYW5kIGV4cG9ydGVkIHJlc291cmNlcyAoaS5lLiBAQHVzZXIgeyA7IGFuZCB0aGUgbGlrZSkKICAgIHZhciBzcGVjaWFsX3Jlc291cmNlID0gc3RyZWFtLm1hdGNoKC8oXHMrKT9bQF17MSwyfVtcdzpfXSsoXHMrKT97LywgZmFsc2UpOwoKICAgIC8vIEZpbmFsbHkgYWR2YW5jZSB0aGUgc3RyZWFtCiAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpOwoKICAgIC8vIEhhdmUgd2UgZm91bmQgYSB2YXJpYWJsZT8KICAgIGlmIChjaCA9PT0gJyQnKSB7CiAgICAgIGlmIChzdHJlYW0ubWF0Y2godmFyaWFibGVfcmVnZXgpKSB7CiAgICAgICAgLy8gSWYgc28sIGFuZCBpdHMgaW4gYSBzdHJpbmcsIGFzc2lnbiBpdCBhIGRpZmZlcmVudCBjb2xvcgogICAgICAgIHJldHVybiBzdGF0ZS5jb250aW51ZVN0cmluZyA/ICd2YXJpYWJsZS0yJyA6ICd2YXJpYWJsZSc7CiAgICAgIH0KICAgICAgLy8gT3RoZXJ3aXNlIHJldHVybiBhbiBpbnZhbGlkIHZhcmlhYmxlCiAgICAgIHJldHVybiAiZXJyb3IiOwogICAgfQogICAgLy8gU2hvdWxkIHdlIHN0aWxsIGJlIGxvb2tpbmcgZm9yIHRoZSBlbmQgb2YgYSBzdHJpbmc/CiAgICBpZiAoc3RhdGUuY29udGludWVTdHJpbmcpIHsKICAgICAgLy8gSWYgc28sIGdvIHRocm91Z2ggdGhlIGxvb3AgYWdhaW4KICAgICAgc3RyZWFtLmJhY2tVcCgxKTsKICAgICAgcmV0dXJuIHRva2VuU3RyaW5nKHN0cmVhbSwgc3RhdGUpOwogICAgfQogICAgLy8gQXJlIHdlIGluIGEgZGVmaW5pdGlvbiAoY2xhc3MsIG5vZGUsIGRlZmluZSk/CiAgICBpZiAoc3RhdGUuaW5EZWZpbml0aW9uKSB7CiAgICAgIC8vIElmIHNvLCByZXR1cm4gZGVmIChpLmUuIGZvciAnY2xhc3MgbXljbGFzcyB7JyA7ICdteWNsYXNzJyB3b3VsZCBiZSBtYXRjaGVkKQogICAgICBpZiAoc3RyZWFtLm1hdGNoKC8oXHMrKT9bXHc6X10rKFxzKyk/LykpIHsKICAgICAgICByZXR1cm4gJ2RlZic7CiAgICAgIH0KICAgICAgLy8gTWF0Y2ggdGhlIHJlc3QgaXQgdGhlIG5leHQgdGltZSBhcm91bmQKICAgICAgc3RyZWFtLm1hdGNoKC9ccyt7Lyk7CiAgICAgIHN0YXRlLmluRGVmaW5pdGlvbiA9IGZhbHNlOwogICAgfQogICAgLy8gQXJlIHdlIGluIGFuICdpbmNsdWRlJyBzdGF0ZW1lbnQ/CiAgICBpZiAoc3RhdGUuaW5JbmNsdWRlKSB7CiAgICAgIC8vIE1hdGNoIGFuZCByZXR1cm4gdGhlIGluY2x1ZGVkIGNsYXNzCiAgICAgIHN0cmVhbS5tYXRjaCgvKFxzKyk/XFMrKFxzKyk/Lyk7CiAgICAgIHN0YXRlLmluSW5jbHVkZSA9IGZhbHNlOwogICAgICByZXR1cm4gJ2RlZic7CiAgICB9CiAgICAvLyBEbyB3ZSBqdXN0IGhhdmUgYSBmdW5jdGlvbiBvbiBvdXIgaGFuZHM/CiAgICAvLyBJbiAnZW5zdXJlX3Jlc291cmNlKCJteWNsYXNzIiknLCAnZW5zdXJlX3Jlc291cmNlJyBpcyBtYXRjaGVkCiAgICBpZiAoc3RyZWFtLm1hdGNoKC8oXHMrKT9cdytcKC8pKSB7CiAgICAgIHN0cmVhbS5iYWNrVXAoMSk7CiAgICAgIHJldHVybiAnZGVmJzsKICAgIH0KICAgIC8vIEhhdmUgd2UgbWF0Y2hlZCB0aGUgcHJpb3IgYXR0cmlidXRlIHJlZ2V4PwogICAgaWYgKGF0dHJpYnV0ZSkgewogICAgICBzdHJlYW0ubWF0Y2goLyhccyspP1x3Ky8pOwogICAgICByZXR1cm4gJ3RhZyc7CiAgICB9CiAgICAvLyBEbyB3ZSBoYXZlIFB1cHBldCBzcGVjaWZpYyB3b3Jkcz8KICAgIGlmICh3b3JkICYmIHdvcmRzLmhhc093blByb3BlcnR5KHdvcmQpKSB7CiAgICAgIC8vIE5lZ2F0ZXMgdGhlIGluaXRpYWwgbmV4dCgpCiAgICAgIHN0cmVhbS5iYWNrVXAoMSk7CiAgICAgIC8vIEFjdXRhbGx5IG1vdmUgdGhlIHN0cmVhbQogICAgICBzdHJlYW0ubWF0Y2goL1tcd10rLyk7CiAgICAgIC8vIFdlIHdhbnQgdG8gcHJvY2VzcyB0aGVzZSB3b3JkcyBkaWZmZXJlbnRseQogICAgICAvLyBkbyB0byB0aGUgaW1wb3J0YW5jZSB0aGV5IGhhdmUgaW4gUHVwcGV0CiAgICAgIGlmIChzdHJlYW0ubWF0Y2goL1xzK1xTK1xzK3svLCBmYWxzZSkpIHsKICAgICAgICBzdGF0ZS5pbkRlZmluaXRpb24gPSB0cnVlOwogICAgICB9CiAgICAgIGlmICh3b3JkID09ICdpbmNsdWRlJykgewogICAgICAgIHN0YXRlLmluSW5jbHVkZSA9IHRydWU7CiAgICAgIH0KICAgICAgLy8gUmV0dXJucyB0aGVpciB2YWx1ZSBhcyBzdGF0ZSBpbiB0aGUgcHJpb3IgZGVmaW5lIG1ldGhvZHMKICAgICAgcmV0dXJuIHdvcmRzW3dvcmRdOwogICAgfQogICAgLy8gSXMgdGhlcmUgYSBtYXRjaCBvbiBhIHJlZmVyZW5jZT8KICAgIGlmICgvKFxzKyk/W0EtWl0vLnRlc3Qod29yZCkpIHsKICAgICAgLy8gTmVnYXRlIHRoZSBuZXh0KCkKICAgICAgc3RyZWFtLmJhY2tVcCgxKTsKICAgICAgLy8gTWF0Y2ggdGhlIGZ1bGwgcmVmZXJlbmNlCiAgICAgIHN0cmVhbS5tYXRjaCgvKFxzKyk/W0EtWl1bXHc6X10rLyk7CiAgICAgIHJldHVybiAnZGVmJzsKICAgIH0KICAgIC8vIEhhdmUgd2UgbWF0Y2hlZCB0aGUgcHJpb3IgcmVzb3VyY2UgcmVnZXg/CiAgICBpZiAocmVzb3VyY2UpIHsKICAgICAgc3RyZWFtLm1hdGNoKC8oXHMrKT9bXHc6X10rLyk7CiAgICAgIHJldHVybiAnZGVmJzsKICAgIH0KICAgIC8vIEhhdmUgd2UgbWF0Y2hlZCB0aGUgcHJpb3Igc3BlY2lhbF9yZXNvdXJjZSByZWdleD8KICAgIGlmIChzcGVjaWFsX3Jlc291cmNlKSB7CiAgICAgIHN0cmVhbS5tYXRjaCgvKFxzKyk/W0BdezEsMn0vKTsKICAgICAgcmV0dXJuICdzcGVjaWFsJzsKICAgIH0KICAgIC8vIE1hdGNoIGFsbCB0aGUgY29tbWVudHMuIEFsbCBvZiB0aGVtLgogICAgaWYgKGNoID09ICIjIikgewogICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICAgIHJldHVybiAiY29tbWVudCI7CiAgICB9CiAgICAvLyBIYXZlIHdlIGZvdW5kIGEgc3RyaW5nPwogICAgaWYgKGNoID09ICInIiB8fCBjaCA9PSAnIicpIHsKICAgICAgLy8gU3RvcmUgdGhlIHR5cGUgKHNpbmdsZSBvciBkb3VibGUpCiAgICAgIHN0YXRlLnBlbmRpbmcgPSBjaDsKICAgICAgLy8gUGVyZm9ybSB0aGUgbG9vcGluZyBmdW5jdGlvbiB0byBmaW5kIHRoZSBlbmQKICAgICAgcmV0dXJuIHRva2VuU3RyaW5nKHN0cmVhbSwgc3RhdGUpOwogICAgfQogICAgLy8gTWF0Y2ggYWxsIHRoZSBicmFja2V0cwogICAgaWYgKGNoID09ICd7JyB8fCBjaCA9PSAnfScpIHsKICAgICAgcmV0dXJuICdicmFja2V0JzsKICAgIH0KICAgIC8vIE1hdGNoIGNoYXJhY3RlcnMgdGhhdCB3ZSBhcmUgZ29pbmcgdG8gYXNzdW1lCiAgICAvLyBhcmUgdHJ5aW5nIHRvIGJlIHJlZ2V4CiAgICBpZiAoY2ggPT0gJy8nKSB7CiAgICAgIHN0cmVhbS5tYXRjaCgvLio/XC8vKTsKICAgICAgcmV0dXJuICd2YXJpYWJsZS0zJzsKICAgIH0KICAgIC8vIE1hdGNoIGFsbCB0aGUgbnVtYmVycwogICAgaWYgKGNoLm1hdGNoKC9bMC05XS8pKSB7CiAgICAgIHN0cmVhbS5lYXRXaGlsZSgvWzAtOV0rLyk7CiAgICAgIHJldHVybiAnbnVtYmVyJzsKICAgIH0KICAgIC8vIE1hdGNoIHRoZSAnPScgYW5kICc9Picgb3BlcmF0b3JzCiAgICBpZiAoY2ggPT0gJz0nKSB7CiAgICAgIGlmIChzdHJlYW0ucGVlaygpID09ICc+JykgewogICAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgfQogICAgICByZXR1cm4gIm9wZXJhdG9yIjsKICAgIH0KICAgIC8vIEtlZXAgYWR2YW5jaW5nIHRocm91Z2ggYWxsIHRoZSByZXN0CiAgICBzdHJlYW0uZWF0V2hpbGUoL1tcdy1dLyk7CiAgICAvLyBSZXR1cm4gYSBibGFuayBsaW5lIGZvciBldmVyeXRoaW5nIGVsc2UKICAgIHJldHVybiBudWxsOwogIH0KICAvLyBTdGFydCBpdCBhbGwKICByZXR1cm4gewogICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24gKCkgewogICAgICB2YXIgc3RhdGUgPSB7fTsKICAgICAgc3RhdGUuaW5EZWZpbml0aW9uID0gZmFsc2U7CiAgICAgIHN0YXRlLmluSW5jbHVkZSA9IGZhbHNlOwogICAgICBzdGF0ZS5jb250aW51ZVN0cmluZyA9IGZhbHNlOwogICAgICBzdGF0ZS5wZW5kaW5nID0gZmFsc2U7CiAgICAgIHJldHVybiBzdGF0ZTsKICAgIH0sCiAgICB0b2tlbjogZnVuY3Rpb24gKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgLy8gU3RyaXAgdGhlIHNwYWNlcywgYnV0IHJlZ2V4IHdpbGwgYWNjb3VudCBmb3IgdGhlbSBlaXRoZXJ3YXkKICAgICAgaWYgKHN0cmVhbS5lYXRTcGFjZSgpKSByZXR1cm4gbnVsbDsKICAgICAgLy8gR28gdGhyb3VnaCB0aGUgbWFpbiBwcm9jZXNzCiAgICAgIHJldHVybiB0b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgIH0KICB9Owp9KTsKCkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC94LXB1cHBldCIsICJwdXBwZXQiKTsKCn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/python/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/python/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogUHl0aG9uIG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vLi4vYWRkb24vZWRpdC9tYXRjaGJyYWNrZXRzLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9InB5dGhvbi5qcyI+PC9zY3JpcHQ+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+LkNvZGVNaXJyb3Ige2JvcmRlci10b3A6IDFweCBzb2xpZCBibGFjazsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO308L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5QeXRob248L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPlB5dGhvbiBtb2RlPC9oMj4KCiAgICA8ZGl2Pjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+CiMgTGl0ZXJhbHMKMTIzNAowLjBlMTAxCi4xMjMKMGIwMTAxMDAxMTEwMAowbzAxMjM0NTY3CjB4MDk4NzY1NDMyMWFiY2RlZgo3CjIxNDc0ODM2NDcKM0wKNzkyMjgxNjI1MTQyNjQzMzc1OTM1NDM5NTAzMzZMCjB4MTAwMDAwMDAwTAo3OTIyODE2MjUxNDI2NDMzNzU5MzU0Mzk1MDMzNgoweGRlYWRiZWVmCjMuMTRqCjEwLmoKMTBqCi4wMDFqCjFlMTAwagozLjE0ZS0xMGoKCgojIFN0cmluZyBMaXRlcmFscwonRm9yXCcnCiJHb2RcIiIKIiIic28gbG92ZWQKdGhlIHdvcmxkIiIiCicnJ3RoYXQgaGUgZ2F2ZQpoaXMgb25seSBiZWdvdHRlblwnICcnJwondGhhdCB3aG9zb2V2ZXIgYmVsaWV2ZXRoIFwKaW4gaGltJwonJwoKIyBJZGVudGlmaWVycwpfX2FfXwphLmIKYS5iLmMKCiMgT3BlcmF0b3JzCisgLSAqIC8gJSAmIHwgXiB+IDwgPgo9PSAhPSA8PSA+PSA8PiA8PCA+PiAvLyAqKgphbmQgb3Igbm90IGluIGlzCgojIERlbGltaXRlcnMKKCkgW10ge30gLCA6IGAgPSA7IEAgLiAgIyBOb3RlIHRoYXQgQCBhbmQgLiByZXF1aXJlIHRoZSBwcm9wZXIgY29udGV4dC4KKz0gLT0gKj0gLz0gJT0gJj0gfD0gXj0KLy89ID4+PSA8PD0gKio9CgojIEtleXdvcmRzCmFzIGFzc2VydCBicmVhayBjbGFzcyBjb250aW51ZSBkZWYgZGVsIGVsaWYgZWxzZSBleGNlcHQKZmluYWxseSBmb3IgZnJvbSBnbG9iYWwgaWYgaW1wb3J0IGxhbWJkYSBwYXNzIHJhaXNlCnJldHVybiB0cnkgd2hpbGUgd2l0aCB5aWVsZAoKIyBQeXRob24gMiBLZXl3b3JkcyAob3RoZXJ3aXNlIElkZW50aWZpZXJzKQpleGVjIHByaW50CgojIFB5dGhvbiAzIEtleXdvcmRzIChvdGhlcndpc2UgSWRlbnRpZmllcnMpCm5vbmxvY2FsCgojIFR5cGVzCmJvb2wgY2xhc3NtZXRob2QgY29tcGxleCBkaWN0IGVudW1lcmF0ZSBmbG9hdCBmcm96ZW5zZXQgaW50IGxpc3Qgb2JqZWN0CnByb3BlcnR5IHJldmVyc2VkIHNldCBzbGljZSBzdGF0aWNtZXRob2Qgc3RyIHN1cGVyIHR1cGxlIHR5cGUKCiMgUHl0aG9uIDIgVHlwZXMgKG90aGVyd2lzZSBJZGVudGlmaWVycykKYmFzZXN0cmluZyBidWZmZXIgZmlsZSBsb25nIHVuaWNvZGUgeHJhbmdlCgojIFB5dGhvbiAzIFR5cGVzIChvdGhlcndpc2UgSWRlbnRpZmllcnMpCmJ5dGVhcnJheSBieXRlcyBmaWx0ZXIgbWFwIG1lbW9yeXZpZXcgb3BlbiByYW5nZSB6aXAKCiMgU29tZSBFeGFtcGxlIGNvZGUKaW1wb3J0IG9zCmZyb20gcGFja2FnZSBpbXBvcnQgUGFyZW50Q2xhc3MKCkBub25zZW5zZURlY29yYXRvcgpkZWYgZG9lc05vdGhpbmcoKToKICAgIHBhc3MKCmNsYXNzIEV4YW1wbGVDbGFzcyhQYXJlbnRDbGFzcyk6CiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgZXhhbXBsZShpbnB1dFN0cik6CiAgICAgICAgYSA9IGxpc3QoaW5wdXRTdHIpCiAgICAgICAgYS5yZXZlcnNlKCkKICAgICAgICByZXR1cm4gJycuam9pbihhKQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtaXhpbiA9ICdIZWxsbycpOgogICAgICAgIHNlbGYubWl4aW4gPSBtaXhpbgoKPC90ZXh0YXJlYT48L2Rpdj4KCgo8aDI+Q3l0aG9uIG1vZGU8L2gyPgoKPGRpdj48dGV4dGFyZWEgaWQ9ImNvZGUtY3l0aG9uIiBuYW1lPSJjb2RlLWN5dGhvbiI+CgppbXBvcnQgbnVtcHkgYXMgbnAKY2ltcG9ydCBjeXRob24KZnJvbSBsaWJjLm1hdGggY2ltcG9ydCBzcXJ0CgpAY3l0aG9uLmJvdW5kc2NoZWNrKEZhbHNlKQpAY3l0aG9uLndyYXBhcm91bmQoRmFsc2UpCmRlZiBwYWlyd2lzZV9jeXRob24oZG91YmxlWzosIDo6MV0gWCk6CiAgICBjZGVmIGludCBNID0gWC5zaGFwZVswXQogICAgY2RlZiBpbnQgTiA9IFguc2hhcGVbMV0KICAgIGNkZWYgZG91YmxlIHRtcCwgZAogICAgY2RlZiBkb3VibGVbOiwgOjoxXSBEID0gbnAuZW1wdHkoKE0sIE0pLCBkdHlwZT1ucC5mbG9hdDY0KQogICAgZm9yIGkgaW4gcmFuZ2UoTSk6CiAgICAgICAgZm9yIGogaW4gcmFuZ2UoTSk6CiAgICAgICAgICAgIGQgPSAwLjAKICAgICAgICAgICAgZm9yIGsgaW4gcmFuZ2UoTik6CiAgICAgICAgICAgICAgICB0bXAgPSBYW2ksIGtdIC0gWFtqLCBrXQogICAgICAgICAgICAgICAgZCArPSB0bXAgKiB0bXAKICAgICAgICAgICAgRFtpLCBqXSA9IHNxcnQoZCkKICAgIHJldHVybiBucC5hc2FycmF5KEQpCgo8L3RleHRhcmVhPjwvZGl2PgoKICAgIDxzY3JpcHQ+CiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICAgICAgbW9kZToge25hbWU6ICJweXRob24iLAogICAgICAgICAgICAgICB2ZXJzaW9uOiAyLAogICAgICAgICAgICAgICBzaW5nbGVMaW5lU3RyaW5nRXJyb3JzOiBmYWxzZX0sCiAgICAgICAgbGluZU51bWJlcnM6IHRydWUsCiAgICAgICAgaW5kZW50VW5pdDogNCwKICAgICAgICBtYXRjaEJyYWNrZXRzOiB0cnVlCiAgICB9KTsKCiAgICBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZS1jeXRob24iKSwgewogICAgICAgIG1vZGU6IHtuYW1lOiAidGV4dC94LWN5dGhvbiIsCiAgICAgICAgICAgICAgIHZlcnNpb246IDIsCiAgICAgICAgICAgICAgIHNpbmdsZUxpbmVTdHJpbmdFcnJvcnM6IGZhbHNlfSwKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgICAgICBpbmRlbnRVbml0OiA0LAogICAgICAgIG1hdGNoQnJhY2tldHM6IHRydWUKICAgICAgfSk7CiAgICA8L3NjcmlwdD4KICAgIDxoMj5Db25maWd1cmF0aW9uIE9wdGlvbnMgZm9yIFB5dGhvbiBtb2RlOjwvaDI+CiAgICA8dWw+CiAgICAgIDxsaT52ZXJzaW9uIC0gMi8zIC0gVGhlIHZlcnNpb24gb2YgUHl0aG9uIHRvIHJlY29nbml6ZS4gIERlZmF1bHQgaXMgMi48L2xpPgogICAgICA8bGk+c2luZ2xlTGluZVN0cmluZ0Vycm9ycyAtIHRydWUvZmFsc2UgLSBJZiB5b3UgaGF2ZSBhIHNpbmdsZS1saW5lIHN0cmluZyB0aGF0IGlzIG5vdCB0ZXJtaW5hdGVkIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUsIHRoaXMgd2lsbCBzaG93IHN1YnNlcXVlbnQgbGluZXMgYXMgZXJyb3JzIGlmIHRydWUsIG90aGVyd2lzZSBpdCB3aWxsIGNvbnNpZGVyIHRoZSBuZXdsaW5lIGFzIHRoZSBlbmQgb2YgdGhlIHN0cmluZy4gRGVmYXVsdCBpcyBmYWxzZS48L2xpPgogICAgICA8bGk+aGFuZ2luZ0luZGVudCAtIGludCAtIElmIHlvdSB3YW50IHRvIHdyaXRlIGxvbmcgYXJndW1lbnRzIHRvIGEgZnVuY3Rpb24gc3RhcnRpbmcgb24gYSBuZXcgbGluZSwgaG93IG11Y2ggdGhhdCBsaW5lIHNob3VsZCBiZSBpbmRlbnRlZC4gRGVmYXVsdHMgdG8gb25lIG5vcm1hbCBpbmRlbnRhdGlvbiB1bml0LjwvbGk+CiAgICA8L3VsPgogICAgPGgyPkFkdmFuY2VkIENvbmZpZ3VyYXRpb24gT3B0aW9uczo8L2gyPgogICAgPHA+VXNlZnVsbCBmb3Igc3VwZXJzZXQgb2YgcHl0aG9uIHN5bnRheCBsaWtlIEVudGhvdWdodCBlbmFtbCwgSVB5dGhvbiBtYWdpY3MgYW5kICBxdWVzdGlvbm1hcmsgaGVscDwvcD4KICAgIDx1bD4KICAgICAgPGxpPnNpbmdsZU9wZXJhdG9ycyAtIFJlZ0V4IC0gUmVndWxhciBFeHByZXNzaW9uIGZvciBzaW5nbGUgb3BlcmF0b3IgbWF0Y2hpbmcsICBkZWZhdWx0IDogPHByZT5eW1xcK1xcLVxcKi8lJmFtcDt8XFxefiZsdDsmZ3Q7IV08L3ByZT48L2xpPgogICAgICA8bGk+c2luZ2xlRGVsaW1pdGVycyAtIFJlZ0V4IC0gUmVndWxhciBFeHByZXNzaW9uIGZvciBzaW5nbGUgZGVsaW1pdGVyIG1hdGNoaW5nLCBkZWZhdWx0IDogIDxwcmU+XltcXChcXClcXFtcXF1cXHtcXH1ALDpgPTtcXC5dPC9wcmU+PC9saT4KICAgICAgPGxpPmRvdWJsZU9wZXJhdG9ycyAtIFJlZ0V4IC0gUmVndWxhciBFeHByZXNzaW9uIGZvciBkb3VibGUgb3BlcmF0b3JzIG1hdGNoaW5nLCBkZWZhdWx0IDogPHByZT5eKCg9PSl8KCE9KXwoJmx0Oz0pfCgmZ3Q7PSl8KCZsdDsmZ3Q7KXwoJmx0OyZsdDspfCgmZ3Q7Jmd0Oyl8KC8vKXwoXFwqXFwqKSk8L3ByZT48L2xpPgogICAgICA8bGk+ZG91YmxlRGVsaW1pdGVycyAtIFJlZ0V4IC0gUmVndWxhciBFeHByZXNzb2luIGZvciBkb3VibGUgZGVsaW1pdGVycyBtYXRjaGluZywgZGVmYXVsdCA6IDxwcmU+XigoXFwrPSl8KFxcLT0pfChcXCo9KXwoJT0pfCgvPSl8KCZhbXA7PSl8KFxcfD0pfChcXF49KSk8L3ByZT48L2xpPgogICAgICA8bGk+dHJpcGxlRGVsaW1pdGVycyAtIFJlZ0V4IC0gUmVndWxhciBFeHByZXNzaW9uIGZvciB0cmlwbGUgZGVsaW1pdGVycyBtYXRjaGluZywgZGVmYXVsdCA6IDxwcmU+XigoLy89KXwoJmd0OyZndDs9KXwoJmx0OyZsdDs9KXwoXFwqXFwqPSkpPC9wcmU+PC9saT4KICAgICAgPGxpPmlkZW50aWZpZXJzIC0gUmVnRXggLSBSZWd1bGFyIEV4cHJlc3Npb24gZm9yIGlkZW50aWZpZXIsIGRlZmF1bHQgOiA8cHJlPl5bX0EtWmEtel1bX0EtWmEtejAtOV0qPC9wcmU+PC9saT4KICAgICAgPGxpPmV4dHJhX2tleXdvcmRzIC0gbGlzdCBvZiBzdHJpbmcgLSBMaXN0IG9mIGV4dHJhIHdvcmRzIHRvbiBjb25zaWRlciBhcyBrZXl3b3JkczwvbGk+CiAgICAgIDxsaT5leHRyYV9idWlsdGlucyAtIGxpc3Qgb2Ygc3RyaW5nIC0gTGlzdCBvZiBleHRyYSB3b3JkcyB0b24gY29uc2lkZXIgYXMgYnVpbHRpbnM8L2xpPgogICAgPC91bD4KCgogICAgPHA+PHN0cm9uZz5NSU1FIHR5cGVzIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPnRleHQveC1weXRob248L2NvZGU+IGFuZCA8Y29kZT50ZXh0L3gtY3l0aG9uPC9jb2RlPi48L3A+CiAgPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/python/python.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CgogIGZ1bmN0aW9uIHdvcmRSZWdleHAod29yZHMpIHsKICAgIHJldHVybiBuZXcgUmVnRXhwKCJeKCgiICsgd29yZHMuam9pbigiKXwoIikgKyAiKSlcXGIiKTsKICB9CgogIHZhciB3b3JkT3BlcmF0b3JzID0gd29yZFJlZ2V4cChbImFuZCIsICJvciIsICJub3QiLCAiaXMiLCAiaW4iXSk7CiAgdmFyIGNvbW1vbktleXdvcmRzID0gWyJhcyIsICJhc3NlcnQiLCAiYnJlYWsiLCAiY2xhc3MiLCAiY29udGludWUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmIiwgImRlbCIsICJlbGlmIiwgImVsc2UiLCAiZXhjZXB0IiwgImZpbmFsbHkiLAogICAgICAgICAgICAgICAgICAgICAgICAiZm9yIiwgImZyb20iLCAiZ2xvYmFsIiwgImlmIiwgImltcG9ydCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJsYW1iZGEiLCAicGFzcyIsICJyYWlzZSIsICJyZXR1cm4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHJ5IiwgIndoaWxlIiwgIndpdGgiLCAieWllbGQiXTsKICB2YXIgY29tbW9uQnVpbHRpbnMgPSBbImFicyIsICJhbGwiLCAiYW55IiwgImJpbiIsICJib29sIiwgImJ5dGVhcnJheSIsICJjYWxsYWJsZSIsICJjaHIiLAogICAgICAgICAgICAgICAgICAgICAgICAiY2xhc3NtZXRob2QiLCAiY29tcGlsZSIsICJjb21wbGV4IiwgImRlbGF0dHIiLCAiZGljdCIsICJkaXIiLCAiZGl2bW9kIiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW1lcmF0ZSIsICJldmFsIiwgImZpbHRlciIsICJmbG9hdCIsICJmb3JtYXQiLCAiZnJvemVuc2V0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImdldGF0dHIiLCAiZ2xvYmFscyIsICJoYXNhdHRyIiwgImhhc2giLCAiaGVscCIsICJoZXgiLCAiaWQiLAogICAgICAgICAgICAgICAgICAgICAgICAiaW5wdXQiLCAiaW50IiwgImlzaW5zdGFuY2UiLCAiaXNzdWJjbGFzcyIsICJpdGVyIiwgImxlbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJsaXN0IiwgImxvY2FscyIsICJtYXAiLCAibWF4IiwgIm1lbW9yeXZpZXciLCAibWluIiwgIm5leHQiLAogICAgICAgICAgICAgICAgICAgICAgICAib2JqZWN0IiwgIm9jdCIsICJvcGVuIiwgIm9yZCIsICJwb3ciLCAicHJvcGVydHkiLCAicmFuZ2UiLAogICAgICAgICAgICAgICAgICAgICAgICAicmVwciIsICJyZXZlcnNlZCIsICJyb3VuZCIsICJzZXQiLCAic2V0YXR0ciIsICJzbGljZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJzb3J0ZWQiLCAic3RhdGljbWV0aG9kIiwgInN0ciIsICJzdW0iLCAic3VwZXIiLCAidHVwbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSIsICJ2YXJzIiwgInppcCIsICJfX2ltcG9ydF9fIiwgIk5vdEltcGxlbWVudGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgIkVsbGlwc2lzIiwgIl9fZGVidWdfXyJdOwogIHZhciBweTIgPSB7YnVpbHRpbnM6IFsiYXBwbHkiLCAiYmFzZXN0cmluZyIsICJidWZmZXIiLCAiY21wIiwgImNvZXJjZSIsICJleGVjZmlsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJmaWxlIiwgImludGVybiIsICJsb25nIiwgInJhd19pbnB1dCIsICJyZWR1Y2UiLCAicmVsb2FkIiwKICAgICAgICAgICAgICAgICAgICAgICAgInVuaWNociIsICJ1bmljb2RlIiwgInhyYW5nZSIsICJGYWxzZSIsICJUcnVlIiwgIk5vbmUiXSwKICAgICAgICAgICAgIGtleXdvcmRzOiBbImV4ZWMiLCAicHJpbnQiXX07CiAgdmFyIHB5MyA9IHtidWlsdGluczogWyJhc2NpaSIsICJieXRlcyIsICJleGVjIiwgInByaW50Il0sCiAgICAgICAgICAgICBrZXl3b3JkczogWyJub25sb2NhbCIsICJGYWxzZSIsICJUcnVlIiwgIk5vbmUiXX07CgogIENvZGVNaXJyb3IucmVnaXN0ZXJIZWxwZXIoImhpbnRXb3JkcyIsICJweXRob24iLCBjb21tb25LZXl3b3Jkcy5jb25jYXQoY29tbW9uQnVpbHRpbnMpKTsKCiAgZnVuY3Rpb24gdG9wKHN0YXRlKSB7CiAgICByZXR1cm4gc3RhdGUuc2NvcGVzW3N0YXRlLnNjb3Blcy5sZW5ndGggLSAxXTsKICB9CgogIENvZGVNaXJyb3IuZGVmaW5lTW9kZSgicHl0aG9uIiwgZnVuY3Rpb24oY29uZiwgcGFyc2VyQ29uZikgewogICAgdmFyIEVSUk9SQ0xBU1MgPSAiZXJyb3IiOwoKICAgIHZhciBzaW5nbGVPcGVyYXRvcnMgPSBwYXJzZXJDb25mLnNpbmdsZU9wZXJhdG9ycyB8fCBuZXcgUmVnRXhwKCJeW1xcK1xcLVxcKi8lJnxcXF5+PD4hXSIpOwogICAgdmFyIHNpbmdsZURlbGltaXRlcnMgPSBwYXJzZXJDb25mLnNpbmdsZURlbGltaXRlcnMgfHwgbmV3IFJlZ0V4cCgiXltcXChcXClcXFtcXF1cXHtcXH1ALDpgPTtcXC5dIik7CiAgICB2YXIgZG91YmxlT3BlcmF0b3JzID0gcGFyc2VyQ29uZi5kb3VibGVPcGVyYXRvcnMgfHwgbmV3IFJlZ0V4cCgiXigoPT0pfCghPSl8KDw9KXwoPj0pfCg8Pil8KDw8KXwoPj4pfCgvLyl8KFxcKlxcKikpIik7CiAgICB2YXIgZG91YmxlRGVsaW1pdGVycyA9IHBhcnNlckNvbmYuZG91YmxlRGVsaW1pdGVycyB8fCBuZXcgUmVnRXhwKCJeKChcXCs9KXwoXFwtPSl8KFxcKj0pfCglPSl8KC89KXwoJj0pfChcXHw9KXwoXFxePSkpIik7CiAgICB2YXIgdHJpcGxlRGVsaW1pdGVycyA9IHBhcnNlckNvbmYudHJpcGxlRGVsaW1pdGVycyB8fCBuZXcgUmVnRXhwKCJeKCgvLz0pfCg+Pj0pfCg8PD0pfChcXCpcXCo9KSkiKTsKICAgIHZhciBpZGVudGlmaWVycyA9IHBhcnNlckNvbmYuaWRlbnRpZmllcnN8fCBuZXcgUmVnRXhwKCJeW19BLVphLXpdW19BLVphLXowLTldKiIpOwogICAgdmFyIGhhbmdpbmdJbmRlbnQgPSBwYXJzZXJDb25mLmhhbmdpbmdJbmRlbnQgfHwgY29uZi5pbmRlbnRVbml0OwoKICAgIHZhciBteUtleXdvcmRzID0gY29tbW9uS2V5d29yZHMsIG15QnVpbHRpbnMgPSBjb21tb25CdWlsdGluczsKICAgIGlmKHBhcnNlckNvbmYuZXh0cmFfa2V5d29yZHMgIT0gdW5kZWZpbmVkKXsKICAgICAgbXlLZXl3b3JkcyA9IG15S2V5d29yZHMuY29uY2F0KHBhcnNlckNvbmYuZXh0cmFfa2V5d29yZHMpOwogICAgfQogICAgaWYocGFyc2VyQ29uZi5leHRyYV9idWlsdGlucyAhPSB1bmRlZmluZWQpewogICAgICBteUJ1aWx0aW5zID0gbXlCdWlsdGlucy5jb25jYXQocGFyc2VyQ29uZi5leHRyYV9idWlsdGlucyk7CiAgICB9CiAgICBpZiAocGFyc2VyQ29uZi52ZXJzaW9uICYmIHBhcnNlSW50KHBhcnNlckNvbmYudmVyc2lvbiwgMTApID09IDMpIHsKICAgICAgbXlLZXl3b3JkcyA9IG15S2V5d29yZHMuY29uY2F0KHB5My5rZXl3b3Jkcyk7CiAgICAgIG15QnVpbHRpbnMgPSBteUJ1aWx0aW5zLmNvbmNhdChweTMuYnVpbHRpbnMpOwogICAgICB2YXIgc3RyaW5nUHJlZml4ZXMgPSBuZXcgUmVnRXhwKCJeKChbcmJdfChicikpPygnezN9fFwiezN9fFsnXCJdKSkiLCAiaSIpOwogICAgfSBlbHNlIHsKICAgICAgbXlLZXl3b3JkcyA9IG15S2V5d29yZHMuY29uY2F0KHB5Mi5rZXl3b3Jkcyk7CiAgICAgIG15QnVpbHRpbnMgPSBteUJ1aWx0aW5zLmNvbmNhdChweTIuYnVpbHRpbnMpOwogICAgICB2YXIgc3RyaW5nUHJlZml4ZXMgPSBuZXcgUmVnRXhwKCJeKChbcnViXXwodXIpfChicikpPygnezN9fFwiezN9fFsnXCJdKSkiLCAiaSIpOwogICAgfQogICAgdmFyIGtleXdvcmRzID0gd29yZFJlZ2V4cChteUtleXdvcmRzKTsKICAgIHZhciBidWlsdGlucyA9IHdvcmRSZWdleHAobXlCdWlsdGlucyk7CgogICAgLy8gdG9rZW5pemVycwogICAgZnVuY3Rpb24gdG9rZW5CYXNlKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgLy8gSGFuZGxlIHNjb3BlIGNoYW5nZXMKICAgICAgaWYgKHN0cmVhbS5zb2woKSAmJiB0b3Aoc3RhdGUpLnR5cGUgPT0gInB5IikgewogICAgICAgIHZhciBzY29wZU9mZnNldCA9IHRvcChzdGF0ZSkub2Zmc2V0OwogICAgICAgIGlmIChzdHJlYW0uZWF0U3BhY2UoKSkgewogICAgICAgICAgdmFyIGxpbmVPZmZzZXQgPSBzdHJlYW0uaW5kZW50YXRpb24oKTsKICAgICAgICAgIGlmIChsaW5lT2Zmc2V0ID4gc2NvcGVPZmZzZXQpCiAgICAgICAgICAgIHB1c2hTY29wZShzdHJlYW0sIHN0YXRlLCAicHkiKTsKICAgICAgICAgIGVsc2UgaWYgKGxpbmVPZmZzZXQgPCBzY29wZU9mZnNldCAmJiBkZWRlbnQoc3RyZWFtLCBzdGF0ZSkpCiAgICAgICAgICAgIHN0YXRlLmVycm9yVG9rZW4gPSB0cnVlOwogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHZhciBzdHlsZSA9IHRva2VuQmFzZUlubmVyKHN0cmVhbSwgc3RhdGUpOwogICAgICAgICAgaWYgKHNjb3BlT2Zmc2V0ID4gMCAmJiBkZWRlbnQoc3RyZWFtLCBzdGF0ZSkpCiAgICAgICAgICAgIHN0eWxlICs9ICIgIiArIEVSUk9SQ0xBU1M7CiAgICAgICAgICByZXR1cm4gc3R5bGU7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB0b2tlbkJhc2VJbm5lcihzdHJlYW0sIHN0YXRlKTsKICAgIH0KCiAgICBmdW5jdGlvbiB0b2tlbkJhc2VJbm5lcihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIGlmIChzdHJlYW0uZWF0U3BhY2UoKSkgcmV0dXJuIG51bGw7CgogICAgICB2YXIgY2ggPSBzdHJlYW0ucGVlaygpOwoKICAgICAgLy8gSGFuZGxlIENvbW1lbnRzCiAgICAgIGlmIChjaCA9PSAiIyIpIHsKICAgICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICAgICAgcmV0dXJuICJjb21tZW50IjsKICAgICAgfQoKICAgICAgLy8gSGFuZGxlIE51bWJlciBMaXRlcmFscwogICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eWzAtOVwuXS8sIGZhbHNlKSkgewogICAgICAgIHZhciBmbG9hdExpdGVyYWwgPSBmYWxzZTsKICAgICAgICAvLyBGbG9hdHMKICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eXGQqXC5cZCsoZVtcK1wtXT9cZCspPy9pKSkgeyBmbG9hdExpdGVyYWwgPSB0cnVlOyB9CiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXlxkK1wuXGQqLykpIHsgZmxvYXRMaXRlcmFsID0gdHJ1ZTsgfQogICAgICAgIGlmIChzdHJlYW0ubWF0Y2goL15cLlxkKy8pKSB7IGZsb2F0TGl0ZXJhbCA9IHRydWU7IH0KICAgICAgICBpZiAoZmxvYXRMaXRlcmFsKSB7CiAgICAgICAgICAvLyBGbG9hdCBsaXRlcmFscyBtYXkgYmUgImltYWdpbmFyeSIKICAgICAgICAgIHN0cmVhbS5lYXQoL0ovaSk7CiAgICAgICAgICByZXR1cm4gIm51bWJlciI7CiAgICAgICAgfQogICAgICAgIC8vIEludGVnZXJzCiAgICAgICAgdmFyIGludExpdGVyYWwgPSBmYWxzZTsKICAgICAgICAvLyBIZXgKICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eMHhbMC05YS1mXSsvaSkpIGludExpdGVyYWwgPSB0cnVlOwogICAgICAgIC8vIEJpbmFyeQogICAgICAgIGlmIChzdHJlYW0ubWF0Y2goL14wYlswMV0rL2kpKSBpbnRMaXRlcmFsID0gdHJ1ZTsKICAgICAgICAvLyBPY3RhbAogICAgICAgIGlmIChzdHJlYW0ubWF0Y2goL14wb1swLTddKy9pKSkgaW50TGl0ZXJhbCA9IHRydWU7CiAgICAgICAgLy8gRGVjaW1hbAogICAgICAgIGlmIChzdHJlYW0ubWF0Y2goL15bMS05XVxkKihlW1wrXC1dP1xkKyk/LykpIHsKICAgICAgICAgIC8vIERlY2ltYWwgbGl0ZXJhbHMgbWF5IGJlICJpbWFnaW5hcnkiCiAgICAgICAgICBzdHJlYW0uZWF0KC9KL2kpOwogICAgICAgICAgLy8gVE9ETyAtIENhbiB5b3UgaGF2ZSBpbWFnaW5hcnkgbG9uZ3M/CiAgICAgICAgICBpbnRMaXRlcmFsID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgLy8gWmVybyBieSBpdHNlbGYgd2l0aCBubyBvdGhlciBwaWVjZSBvZiBudW1iZXIuCiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXjAoPyFbXGR4XSkvaSkpIGludExpdGVyYWwgPSB0cnVlOwogICAgICAgIGlmIChpbnRMaXRlcmFsKSB7CiAgICAgICAgICAvLyBJbnRlZ2VyIGxpdGVyYWxzIG1heSBiZSAibG9uZyIKICAgICAgICAgIHN0cmVhbS5lYXQoL0wvaSk7CiAgICAgICAgICByZXR1cm4gIm51bWJlciI7CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyBIYW5kbGUgU3RyaW5ncwogICAgICBpZiAoc3RyZWFtLm1hdGNoKHN0cmluZ1ByZWZpeGVzKSkgewogICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5TdHJpbmdGYWN0b3J5KHN0cmVhbS5jdXJyZW50KCkpOwogICAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgICAgfQoKICAgICAgLy8gSGFuZGxlIG9wZXJhdG9ycyBhbmQgRGVsaW1pdGVycwogICAgICBpZiAoc3RyZWFtLm1hdGNoKHRyaXBsZURlbGltaXRlcnMpIHx8IHN0cmVhbS5tYXRjaChkb3VibGVEZWxpbWl0ZXJzKSkKICAgICAgICByZXR1cm4gbnVsbDsKCiAgICAgIGlmIChzdHJlYW0ubWF0Y2goZG91YmxlT3BlcmF0b3JzKQogICAgICAgICAgfHwgc3RyZWFtLm1hdGNoKHNpbmdsZU9wZXJhdG9ycykKICAgICAgICAgIHx8IHN0cmVhbS5tYXRjaCh3b3JkT3BlcmF0b3JzKSkKICAgICAgICByZXR1cm4gIm9wZXJhdG9yIjsKCiAgICAgIGlmIChzdHJlYW0ubWF0Y2goc2luZ2xlRGVsaW1pdGVycykpCiAgICAgICAgcmV0dXJuIG51bGw7CgogICAgICBpZiAoc3RyZWFtLm1hdGNoKGtleXdvcmRzKSkKICAgICAgICByZXR1cm4gImtleXdvcmQiOwoKICAgICAgaWYgKHN0cmVhbS5tYXRjaChidWlsdGlucykpCiAgICAgICAgcmV0dXJuICJidWlsdGluIjsKCiAgICAgIGlmIChzdHJlYW0ubWF0Y2goL14oc2VsZnxjbHMpXGIvKSkKICAgICAgICByZXR1cm4gInZhcmlhYmxlLTIiOwoKICAgICAgaWYgKHN0cmVhbS5tYXRjaChpZGVudGlmaWVycykpIHsKICAgICAgICBpZiAoc3RhdGUubGFzdFRva2VuID09ICJkZWYiIHx8IHN0YXRlLmxhc3RUb2tlbiA9PSAiY2xhc3MiKQogICAgICAgICAgcmV0dXJuICJkZWYiOwogICAgICAgIHJldHVybiAidmFyaWFibGUiOwogICAgICB9CgogICAgICAvLyBIYW5kbGUgbm9uLWRldGVjdGVkIGl0ZW1zCiAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgIHJldHVybiBFUlJPUkNMQVNTOwogICAgfQoKICAgIGZ1bmN0aW9uIHRva2VuU3RyaW5nRmFjdG9yeShkZWxpbWl0ZXIpIHsKICAgICAgd2hpbGUgKCJydWIiLmluZGV4T2YoZGVsaW1pdGVyLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpKSA+PSAwKQogICAgICAgIGRlbGltaXRlciA9IGRlbGltaXRlci5zdWJzdHIoMSk7CgogICAgICB2YXIgc2luZ2xlbGluZSA9IGRlbGltaXRlci5sZW5ndGggPT0gMTsKICAgICAgdmFyIE9VVENMQVNTID0gInN0cmluZyI7CgogICAgICBmdW5jdGlvbiB0b2tlblN0cmluZyhzdHJlYW0sIHN0YXRlKSB7CiAgICAgICAgd2hpbGUgKCFzdHJlYW0uZW9sKCkpIHsKICAgICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW14nIlxcXS8pOwogICAgICAgICAgaWYgKHN0cmVhbS5lYXQoIlxcIikpIHsKICAgICAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgICAgICAgaWYgKHNpbmdsZWxpbmUgJiYgc3RyZWFtLmVvbCgpKQogICAgICAgICAgICAgIHJldHVybiBPVVRDTEFTUzsKICAgICAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLm1hdGNoKGRlbGltaXRlcikpIHsKICAgICAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICAgICAgICAgIHJldHVybiBPVVRDTEFTUzsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHN0cmVhbS5lYXQoL1snIl0vKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHNpbmdsZWxpbmUpIHsKICAgICAgICAgIGlmIChwYXJzZXJDb25mLnNpbmdsZUxpbmVTdHJpbmdFcnJvcnMpCiAgICAgICAgICAgIHJldHVybiBFUlJPUkNMQVNTOwogICAgICAgICAgZWxzZQogICAgICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIE9VVENMQVNTOwogICAgICB9CiAgICAgIHRva2VuU3RyaW5nLmlzU3RyaW5nID0gdHJ1ZTsKICAgICAgcmV0dXJuIHRva2VuU3RyaW5nOwogICAgfQoKICAgIGZ1bmN0aW9uIHB1c2hTY29wZShzdHJlYW0sIHN0YXRlLCB0eXBlKSB7CiAgICAgIHZhciBvZmZzZXQgPSAwLCBhbGlnbiA9IG51bGw7CiAgICAgIGlmICh0eXBlID09ICJweSIpIHsKICAgICAgICB3aGlsZSAodG9wKHN0YXRlKS50eXBlICE9ICJweSIpCiAgICAgICAgICBzdGF0ZS5zY29wZXMucG9wKCk7CiAgICAgIH0KICAgICAgb2Zmc2V0ID0gdG9wKHN0YXRlKS5vZmZzZXQgKyAodHlwZSA9PSAicHkiID8gY29uZi5pbmRlbnRVbml0IDogaGFuZ2luZ0luZGVudCk7CiAgICAgIGlmICh0eXBlICE9ICJweSIgJiYgIXN0cmVhbS5tYXRjaCgvXihcc3wjLiopKiQvLCBmYWxzZSkpCiAgICAgICAgYWxpZ24gPSBzdHJlYW0uY29sdW1uKCkgKyAxOwogICAgICBzdGF0ZS5zY29wZXMucHVzaCh7b2Zmc2V0OiBvZmZzZXQsIHR5cGU6IHR5cGUsIGFsaWduOiBhbGlnbn0pOwogICAgfQoKICAgIGZ1bmN0aW9uIGRlZGVudChzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHZhciBpbmRlbnRlZCA9IHN0cmVhbS5pbmRlbnRhdGlvbigpOwogICAgICB3aGlsZSAodG9wKHN0YXRlKS5vZmZzZXQgPiBpbmRlbnRlZCkgewogICAgICAgIGlmICh0b3Aoc3RhdGUpLnR5cGUgIT0gInB5IikgcmV0dXJuIHRydWU7CiAgICAgICAgc3RhdGUuc2NvcGVzLnBvcCgpOwogICAgICB9CiAgICAgIHJldHVybiB0b3Aoc3RhdGUpLm9mZnNldCAhPSBpbmRlbnRlZDsKICAgIH0KCiAgICBmdW5jdGlvbiB0b2tlbkxleGVyKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgdmFyIHN0eWxlID0gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CiAgICAgIHZhciBjdXJyZW50ID0gc3RyZWFtLmN1cnJlbnQoKTsKCiAgICAgIC8vIEhhbmRsZSAnLicgY29ubmVjdGVkIGlkZW50aWZpZXJzCiAgICAgIGlmIChjdXJyZW50ID09ICIuIikgewogICAgICAgIHN0eWxlID0gc3RyZWFtLm1hdGNoKGlkZW50aWZpZXJzLCBmYWxzZSkgPyBudWxsIDogRVJST1JDTEFTUzsKICAgICAgICBpZiAoc3R5bGUgPT0gbnVsbCAmJiBzdGF0ZS5sYXN0U3R5bGUgPT0gIm1ldGEiKSB7CiAgICAgICAgICAvLyBBcHBseSAnbWV0YScgc3R5bGUgdG8gJy4nIGNvbm5lY3RlZCBpZGVudGlmaWVycyB3aGVuCiAgICAgICAgICAvLyBhcHByb3ByaWF0ZS4KICAgICAgICAgIHN0eWxlID0gIm1ldGEiOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc3R5bGU7CiAgICAgIH0KCiAgICAgIC8vIEhhbmRsZSBkZWNvcmF0b3JzCiAgICAgIGlmIChjdXJyZW50ID09ICJAIikKICAgICAgICByZXR1cm4gc3RyZWFtLm1hdGNoKGlkZW50aWZpZXJzLCBmYWxzZSkgPyAibWV0YSIgOiBFUlJPUkNMQVNTOwoKICAgICAgaWYgKChzdHlsZSA9PSAidmFyaWFibGUiIHx8IHN0eWxlID09ICJidWlsdGluIikKICAgICAgICAgICYmIHN0YXRlLmxhc3RTdHlsZSA9PSAibWV0YSIpCiAgICAgICAgc3R5bGUgPSAibWV0YSI7CgogICAgICAvLyBIYW5kbGUgc2NvcGUgY2hhbmdlcy4KICAgICAgaWYgKGN1cnJlbnQgPT0gInBhc3MiIHx8IGN1cnJlbnQgPT0gInJldHVybiIpCiAgICAgICAgc3RhdGUuZGVkZW50ICs9IDE7CgogICAgICBpZiAoY3VycmVudCA9PSAibGFtYmRhIikgc3RhdGUubGFtYmRhID0gdHJ1ZTsKICAgICAgaWYgKGN1cnJlbnQgPT0gIjoiICYmICFzdGF0ZS5sYW1iZGEgJiYgdG9wKHN0YXRlKS50eXBlID09ICJweSIpCiAgICAgICAgcHVzaFNjb3BlKHN0cmVhbSwgc3RhdGUsICJweSIpOwoKICAgICAgdmFyIGRlbGltaXRlcl9pbmRleCA9IGN1cnJlbnQubGVuZ3RoID09IDEgPyAiWyh7Ii5pbmRleE9mKGN1cnJlbnQpIDogLTE7CiAgICAgIGlmIChkZWxpbWl0ZXJfaW5kZXggIT0gLTEpCiAgICAgICAgcHVzaFNjb3BlKHN0cmVhbSwgc3RhdGUsICJdKX0iLnNsaWNlKGRlbGltaXRlcl9pbmRleCwgZGVsaW1pdGVyX2luZGV4KzEpKTsKCiAgICAgIGRlbGltaXRlcl9pbmRleCA9ICJdKX0iLmluZGV4T2YoY3VycmVudCk7CiAgICAgIGlmIChkZWxpbWl0ZXJfaW5kZXggIT0gLTEpIHsKICAgICAgICBpZiAodG9wKHN0YXRlKS50eXBlID09IGN1cnJlbnQpIHN0YXRlLnNjb3Blcy5wb3AoKTsKICAgICAgICBlbHNlIHJldHVybiBFUlJPUkNMQVNTOwogICAgICB9CiAgICAgIGlmIChzdGF0ZS5kZWRlbnQgPiAwICYmIHN0cmVhbS5lb2woKSAmJiB0b3Aoc3RhdGUpLnR5cGUgPT0gInB5IikgewogICAgICAgIGlmIChzdGF0ZS5zY29wZXMubGVuZ3RoID4gMSkgc3RhdGUuc2NvcGVzLnBvcCgpOwogICAgICAgIHN0YXRlLmRlZGVudCAtPSAxOwogICAgICB9CgogICAgICByZXR1cm4gc3R5bGU7CiAgICB9CgogICAgdmFyIGV4dGVybmFsID0gewogICAgICBzdGFydFN0YXRlOiBmdW5jdGlvbihiYXNlY29sdW1uKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHRva2VuaXplOiB0b2tlbkJhc2UsCiAgICAgICAgICBzY29wZXM6IFt7b2Zmc2V0OiBiYXNlY29sdW1uIHx8IDAsIHR5cGU6ICJweSIsIGFsaWduOiBudWxsfV0sCiAgICAgICAgICBsYXN0U3R5bGU6IG51bGwsCiAgICAgICAgICBsYXN0VG9rZW46IG51bGwsCiAgICAgICAgICBsYW1iZGE6IGZhbHNlLAogICAgICAgICAgZGVkZW50OiAwCiAgICAgICAgfTsKICAgICAgfSwKCiAgICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgICAgdmFyIGFkZEVyciA9IHN0YXRlLmVycm9yVG9rZW47CiAgICAgICAgaWYgKGFkZEVycikgc3RhdGUuZXJyb3JUb2tlbiA9IGZhbHNlOwogICAgICAgIHZhciBzdHlsZSA9IHRva2VuTGV4ZXIoc3RyZWFtLCBzdGF0ZSk7CgogICAgICAgIHN0YXRlLmxhc3RTdHlsZSA9IHN0eWxlOwoKICAgICAgICB2YXIgY3VycmVudCA9IHN0cmVhbS5jdXJyZW50KCk7CiAgICAgICAgaWYgKGN1cnJlbnQgJiYgc3R5bGUpCiAgICAgICAgICBzdGF0ZS5sYXN0VG9rZW4gPSBjdXJyZW50OwoKICAgICAgICBpZiAoc3RyZWFtLmVvbCgpICYmIHN0YXRlLmxhbWJkYSkKICAgICAgICAgIHN0YXRlLmxhbWJkYSA9IGZhbHNlOwogICAgICAgIHJldHVybiBhZGRFcnIgPyBzdHlsZSArICIgIiArIEVSUk9SQ0xBU1MgOiBzdHlsZTsKICAgICAgfSwKCiAgICAgIGluZGVudDogZnVuY3Rpb24oc3RhdGUsIHRleHRBZnRlcikgewogICAgICAgIGlmIChzdGF0ZS50b2tlbml6ZSAhPSB0b2tlbkJhc2UpCiAgICAgICAgICByZXR1cm4gc3RhdGUudG9rZW5pemUuaXNTdHJpbmcgPyBDb2RlTWlycm9yLlBhc3MgOiAwOwoKICAgICAgICB2YXIgc2NvcGUgPSB0b3Aoc3RhdGUpOwogICAgICAgIHZhciBjbG9zaW5nID0gdGV4dEFmdGVyICYmIHRleHRBZnRlci5jaGFyQXQoMCkgPT0gc2NvcGUudHlwZTsKICAgICAgICBpZiAoc2NvcGUuYWxpZ24gIT0gbnVsbCkKICAgICAgICAgIHJldHVybiBzY29wZS5hbGlnbiAtIChjbG9zaW5nID8gMSA6IDApOwogICAgICAgIGVsc2UgaWYgKGNsb3NpbmcgJiYgc3RhdGUuc2NvcGVzLmxlbmd0aCA+IDEpCiAgICAgICAgICByZXR1cm4gc3RhdGUuc2NvcGVzW3N0YXRlLnNjb3Blcy5sZW5ndGggLSAyXS5vZmZzZXQ7CiAgICAgICAgZWxzZQogICAgICAgICAgcmV0dXJuIHNjb3BlLm9mZnNldDsKICAgICAgfSwKCiAgICAgIGxpbmVDb21tZW50OiAiIyIsCiAgICAgIGZvbGQ6ICJpbmRlbnQiCiAgICB9OwogICAgcmV0dXJuIGV4dGVybmFsOwogIH0pOwoKICBDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveC1weXRob24iLCAicHl0aG9uIik7CgogIHZhciB3b3JkcyA9IGZ1bmN0aW9uKHN0cikgeyByZXR1cm4gc3RyLnNwbGl0KCIgIik7IH07CgogIENvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC94LWN5dGhvbiIsIHsKICAgIG5hbWU6ICJweXRob24iLAogICAgZXh0cmFfa2V5d29yZHM6IHdvcmRzKCJieSBjZGVmIGNpbXBvcnQgY3BkZWYgY3R5cGVkZWYgZW51bSBleGNlcHQiKwogICAgICAgICAgICAgICAgICAgICAgICAgICJleHRlcm4gZ2lsIGluY2x1ZGUgbm9naWwgcHJvcGVydHkgcHVibGljIisKICAgICAgICAgICAgICAgICAgICAgICAgICAicmVhZG9ubHkgc3RydWN0IHVuaW9uIERFRiBJRiBFTElGIEVMU0UiKQogIH0pOwoKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/q/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/q/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogUSBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uLy4uL2FkZG9uL2VkaXQvbWF0Y2hicmFja2V0cy5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJxLmpzIj48L3NjcmlwdD4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4uQ29kZU1pcnJvciB7Ym9yZGVyLXRvcDogMXB4IHNvbGlkIGJsYWNrOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGltZyBpZD1sb2dvIHNyYz0iLi4vLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+TGFuZ3VhZ2UgbW9kZXM8L2E+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPlE8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPlEgbW9kZTwvaDI+CgoKPGRpdj48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgovIHV0aWxpdGllcyB0byBxdWlja2x5IGxvYWQgYSBjc3YgZmlsZSAtIGZvciBtb3JlIGV4aGF1c3RpdmUgYW5hbHlzaXMgb2YgdGhlIGNzdiBjb250ZW50cyBzZWUgY3N2Z3Vlc3MucQovIDIwMDkuMDkuMjAgLSB1cGRhdGVkIHRvIG1hdGNoIGxhdGVzdCBjc3ZndWVzcy5xIAoKLyAuY3N2LmNvbGhkcnNbZmlsZV0gLSByZXR1cm4gYSBsaXN0IG9mIGNvbGhkcnMgZnJvbSBmaWxlCi8gaW5mbzouY3N2LmluZm9bZmlsZV0gLSByZXR1cm4gYSB0YWJsZSBvZiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZmlsZQovIGNvbHVtbnMgYXJlOiAKLwljIC0gY29sdW1uIG5hbWU7IGNpIC0gY29sdW1uIGluZGV4OyB0IC0gbG9hZCB0eXBlOyBtdyAtIG1heCB3aWR0aDsgCi8JZGNoYXIgLSBkaXN0aW5jdCBjaGFyYWN0ZXJzIGluIHZhbHVlczsgcnVsZSAtIHJ1bGUgdGhhdCBjYXVnaHQgdGhlIHR5cGUKLwltYXliZSAtIG5lZWRzIGNoZWNraW5nLCBfY291bGRfIGJlIHNheSBhIGRhdGUsIGJ1dCBwZXJoYXBzIGp1c3QgYSBmbG9hdD8KLyAuY3N2LmluZm8wW2ZpbGU7b25seWNvbHNdIC0gbGlrZSAuY3N2LmluZm8gZXhjZXB0IHRoYXQgaXQgb25seSBhbmFseXNlcyA8b25seWNvbHM+Ci8gZXhhbXBsZToKLwlpbmZvOi5jc3YuaW5mbzBbZmlsZTsoLmNzdi5jb2xoZHJzIGZpbGUpbGlrZSIqcHJpY2UiXQovCWluZm86LmNzdi5pbmZvbGlrZVtmaWxlOyIqcHJpY2UiXQovCXNob3cgZGVsZXRlIGZyb20gaW5mbyB3aGVyZSB0PSIgIgovIC5jc3YuZGF0YVtmaWxlO2luZm9dIC0gdXNlIHRoZSBpbmZvIGZyb20gLmNzdi5pbmZvIHRvIHJlYWQgdGhlIGRhdGEKLyAuY3N2LmRhdGExMFtmaWxlO2luZm9dIC0gbGlrZSAuY3N2LmRhdGEgYnV0IG9ubHkgcmV0dXJucyB0aGUgZmlyc3QgMTAgcm93cwovIGJ1bGtsb2FkW2ZpbGU7aW5mb10gLSBidWxrIGxvYWRzIGZpbGUgaW50byB0YWJsZSBEQVRBICh3aGljaCBtdXN0IGJlIGFscmVhZHkgZGVmaW5lZCA6OiBEQVRBOigpICkKLyAuY3N2LnJlYWRbZmlsZV0vcmVhZDEwW2ZpbGVdIC0gZm9yIHdoZW4geW91IGRvbid0IGNhcmUgYWJvdXQgY2hlY2tpbmcvdHdlYWtpbmcgdGhlIDxpbmZvPiBiZWZvcmUgcmVhZGluZyAKClxkIC5jc3YKREVMSU06IiwiClpBUEhEUlM6MGIgLyBsb3dlcmNhc2UgYW5kIHJlbW92ZSBfIGZyb20gY29saGRycyAoanVuayBjaGFyYWN0ZXJzIGFyZSBhbHdheXMgcmVtb3ZlZCkKV0lEVEhIRFI6MjUwMDAgLyBudW1iZXIgb2YgY2hhcmFjdGVycyByZWFkIHRvIGdldCB0aGUgaGVhZGVyClJFQURMSU5FUzoyMjIgLyBudW1iZXIgb2YgbGluZXMgcmVhZCBhbmQgdXNlZCB0byBndWVzcyB0aGUgdHlwZXMKU1lNTUFYV0lEVEg6MTEgLyBjaGFyYWN0ZXIgY29sdW1ucyBuYXJyb3dlciB0aGFuIHRoaXMgYXJlIHN0b3JlZCBhcyBzeW1ib2xzClNZTU1BWEdSOjEwIC8gbWF4IHN5bWJvbCBncmFudWxhcml0eSUgYmVmb3JlIHdlIGdpdmUgdXAgYW5kIGtlZXAgYXMgYSAqIHN0cmluZwpGT1JDRUNIQVJXSURUSDozMCAvIGV2ZXJ5IGZpZWxkIChvZiBhbnkgdHlwZSkgd2l0aCB2YWx1ZXMgdGhpcyB3aWRlIG9yIG1vcmUgaXMgZm9yY2VkIHRvIGNoYXJhY3RlciAiKiIKRElTQ0FSREVNUFRZOjBiIC8gY29tcGxldGVseSBpZ25vcmUgZW1wdHkgY29sdW1ucyBpZiB0cnVlIGVsc2Ugc2V0IHRoZW0gdG8gIkMiCkNIVU5LU0laRTo1MDAwMDAwMCAvIHVzZWQgaW4gZnMyIChtb2RpZmllZCAuUS5mcykKCmspbmFtZWx0cmltOnskW35AeDsuei5zJ3g7figqeClpbiBhQTouUS5hLC5RLkE7KCsvJlx+eCBpbiBhQSlfeDt4XX0KaylmczI6e1tmO3NdKCgtNyFzKT4pe1tmO3M7eF1pOjErbGFzdEAmMHhhPXI6MTooczt4O0NIVU5LU0laRSk7ZkBgXDppI3I7eCtpfVtmO3NdLzBqfQpjbGVhbmhkcnM6e3skW1pBUEhEUlM7bG93ZXIgeCBleGNlcHQiXyI7eF19eCB3aGVyZSB4IGluIERFTElNLC5RLmFufQpjYW5jYXN0Ontudzp4JCIiO2lmW25vdCB4IGluIkJYQ1MiO253OihtaW4gMCM7bWF4IDAjOzo6KUBcOm53XTskW25vdCBhbnkgbncgaW4geCQoMTEmY291bnQgeSkjeTskWzExPGNvdW50IHk7bm90IGFueSBudyBpbiB4JHk7MWJdOzBiXX0KCnJlYWQ6e1tmaWxlXWRhdGFbZmlsZTtpbmZvW2ZpbGVdXX0gIApyZWFkMTA6e1tmaWxlXWRhdGExMFtmaWxlO2luZm9bZmlsZV1dfSAgCgpjb2xoZHJzOntbZmlsZV0KCWAkbmFtZWx0cmltIERFTElNIHZzIGNsZWFuaGRycyBmaXJzdCByZWFkMChmaWxlOzA7MStmaXJzdCB3aGVyZSAweGE9cmVhZDEoZmlsZTswO1dJRFRISERSKSl9CmRhdGE6e1tmaWxlO2luZm9dCgkoZXhlYyBjIGZyb20gaW5mbyB3aGVyZSBub3QgdD0iICIpeGNvbChleGVjIHQgZnJvbSBpbmZvO2VubGlzdCBERUxJTSkwOmZpbGV9CmRhdGExMDp7W2ZpbGU7aW5mb10KCWRhdGFbO2luZm9dKGZpbGU7MDsxK2xhc3QgMTEjd2hlcmUgMHhhPXJlYWQxKGZpbGU7MDsxNSpXSURUSEhEUikpfQppbmZvMDp7W2ZpbGU7b25seWNvbHNdCgljb2xoZHJzOmAkbmFtZWx0cmltIERFTElNIHZzIGNsZWFuaGRycyBmaXJzdCBoZWFkOnJlYWQwKGZpbGU7MDsxK2xhc3Qgd2hlcmUgMHhhPXJlYWQxKGZpbGU7MDtXSURUSEhEUikpOwoJbG9hZGZtdHM6KGNvdW50IGNvbGhkcnMpIyJTIjtpZltjb3VudCBvbmx5Y29scztsb2FkZm10c1t3aGVyZSBub3QgY29saGRycyBpbiBvbmx5Y29sc106IkMiXTsKCWJyZWFrczp3aGVyZSAweGE9cmVhZDEoZmlsZTswO2Zsb29yKDEwK1JFQURMSU5FUykqV0lEVEhIRFIlY291bnQgaGVhZCk7CgluYXM6Y291bnQgYXM6Y29saGRycyB4Y29sKGxvYWRmbXRzO2VubGlzdCBERUxJTSkwOihmaWxlOzA7MStsYXN0KCgxK1JFQURMSU5FUykmY291bnQgYnJlYWtzKSNicmVha3MpOwoJaW5mbzooW11jOmtleSBmbGlwIGFzO3Y6dmFsdWUgZmxpcCBhcyk7YXM6KCk7CglyZXNlcnZlZDprZXlgLnE7cmVzZXJ2ZWQsOi5RLnJlcztyZXNlcnZlZCw6YGk7CglpbmZvOnVwZGF0ZSByZXM6YyBpbiByZXNlcnZlZCBmcm9tIGluZm87CglpbmZvOnVwZGF0ZSBjaTppLHQ6Ij8iLGlwYTowYixtZG90OjAsbXc6MCxydWxlOjAsZ3I6MCxuZHY6MCxtYXliZTowYixlbXB0eTowYixqMTA6MGIsajEyOjBiIGZyb20gaW5mbzsKCWluZm86dXBkYXRlIGNpOmBzI2NpIGZyb20gaW5mbzsKCWlmW2NvdW50IG9ubHljb2xzO2luZm86dXBkYXRlIHQ6IiAiLHJ1bGU6MTAgZnJvbSBpbmZvIHdoZXJlIG5vdCBjIGluIG9ubHljb2xzXTsKCWluZm86dXBkYXRlIHNkdjp7c3RyaW5nKGRpc3RpbmN0IHgpZXhjZXB0YH1wZWFjaCB2IGZyb20gaW5mbzsgCglpbmZvOnVwZGF0ZSBuZHY6Y291bnQgZWFjaCBzZHYgZnJvbSBpbmZvOwoJaW5mbzp1cGRhdGUgZ3I6Zmxvb3IgMC41KzEwMCpuZHYlbmFzLG13OnttYXggY291bnQgZWFjaCB4fXBlYWNoIHNkdiBmcm9tIGluZm8gd2hlcmUgMDxuZHY7CglpbmZvOnVwZGF0ZSB0OiIqIixydWxlOjIwIGZyb20gaW5mbyB3aGVyZSBtdz4uY3N2LkZPUkNFQ0hBUldJRFRIOyAvIGxvbmcgdmFsdWVzCglpbmZvOnVwZGF0ZSB0OiJDICJbLmNzdi5ESVNDQVJERU1QVFldLHJ1bGU6MzAsZW1wdHk6MWIgZnJvbSBpbmZvIHdoZXJlIHQ9Ij8iLG13PTA7IC8gZW1wdHkgY29sdW1ucwoJaW5mbzp1cGRhdGUgZGNoYXI6e2FzYyBkaXN0aW5jdCByYXplIHh9cGVhY2ggc2R2IGZyb20gaW5mbyB3aGVyZSB0PSI/IjsKCWluZm86dXBkYXRlIG1kb3Q6e21heCBzdW0gZWFjaCIuIj14fXBlYWNoIHNkdiBmcm9tIGluZm8gd2hlcmUgdD0iPyIseyIuImluIHh9ZWFjaCBkY2hhcjsKCWluZm86dXBkYXRlIHQ6Im4iLHJ1bGU6NDAgZnJvbSBpbmZvIHdoZXJlIHQ9Ij8iLHthbnkgeCBpbiIwMTIzNDU2Nzg5In1lYWNoIGRjaGFyOyAvIHZhZ3VlbHkgbnVtZXJpYy4uCglpbmZvOnVwZGF0ZSB0OiJJIixydWxlOjUwLGlwYToxYiBmcm9tIGluZm8gd2hlcmUgdD0ibiIsbXcgd2l0aGluIDcgMTUsbWRvdD0zLHthbGwgeCBpbiIuMDEyMzQ1Njc4OSJ9ZWFjaCBkY2hhciwuY3N2LmNhbmNhc3RbIkkiXXBlYWNoIHNkdjsgLyBpcC1hZGRyZXNzCglpbmZvOnVwZGF0ZSB0OiJKIixydWxlOjYwIGZyb20gaW5mbyB3aGVyZSB0PSJuIixtZG90PTAse2FsbCB4IGluIistMDEyMzQ1Njc4OSJ9ZWFjaCBkY2hhciwuY3N2LmNhbmNhc3RbIkoiXXBlYWNoIHNkdjsKCWluZm86dXBkYXRlIHQ6IkkiLHJ1bGU6NzAgZnJvbSBpbmZvIHdoZXJlIHQ9IkoiLG13PDEyLC5jc3YuY2FuY2FzdFsiSSJdcGVhY2ggc2R2OwoJaW5mbzp1cGRhdGUgdDoiSCIscnVsZTo4MCBmcm9tIGluZm8gd2hlcmUgdD0iSSIsbXc8NywuY3N2LmNhbmNhc3RbIkgiXXBlYWNoIHNkdjsKCWluZm86dXBkYXRlIHQ6IkYiLHJ1bGU6OTAgZnJvbSBpbmZvIHdoZXJlIHQ9Im4iLG1kb3Q8Mixtdz4xLC5jc3YuY2FuY2FzdFsiRiJdcGVhY2ggc2R2OwoJaW5mbzp1cGRhdGUgdDoiRSIscnVsZToxMDAsbWF5YmU6MWIgZnJvbSBpbmZvIHdoZXJlIHQ9IkYiLG13PDk7CglpbmZvOnVwZGF0ZSB0OiJNIixydWxlOjExMCxtYXliZToxYiBmcm9tIGluZm8gd2hlcmUgdCBpbiJuSUhFRiIsbWRvdDwyLG13IHdpdGhpbiA0IDcsLmNzdi5jYW5jYXN0WyJNIl1wZWFjaCBzZHY7IAoJaW5mbzp1cGRhdGUgdDoiRCIscnVsZToxMjAsbWF5YmU6MWIgZnJvbSBpbmZvIHdoZXJlIHQgaW4ibkkiLG1kb3QgaW4gMCAyLG13IHdpdGhpbiA2IDExLC5jc3YuY2FuY2FzdFsiRCJdcGVhY2ggc2R2OyAKCWluZm86dXBkYXRlIHQ6IlYiLHJ1bGU6MTMwLG1heWJlOjFiIGZyb20gaW5mbyB3aGVyZSB0PSJJIixtdyBpbiA1IDYsNzxjb3VudCBlYWNoIGRjaGFyLHthbGwgeCBsaWtlIipbMC05XVswLTVdWzAtOV1bMC01XVswLTldIn1wZWFjaCBzZHYsLmNzdi5jYW5jYXN0WyJWIl1wZWFjaCBzZHY7IC8gMjM1OTU5IDEyMzQ1ICAgICAgICAKCWluZm86dXBkYXRlIHQ6IlUiLHJ1bGU6MTQwLG1heWJlOjFiIGZyb20gaW5mbyB3aGVyZSB0PSJIIixtdyBpbiAzIDQsNzxjb3VudCBlYWNoIGRjaGFyLHthbGwgeCBsaWtlIipbMC05XVswLTVdWzAtOV0ifXBlYWNoIHNkdiwuY3N2LmNhbmNhc3RbIlUiXXBlYWNoIHNkdjsgLzIzNTkKCWluZm86dXBkYXRlIHQ6IlUiLHJ1bGU6MTUwLG1heWJlOjBiIGZyb20gaW5mbyB3aGVyZSB0PSJuIixtdyBpbiA0IDUsbWRvdD0wLHthbGwgeCBsaWtlIipbMC05XTpbMC01XVswLTldIn1wZWFjaCBzZHYsLmNzdi5jYW5jYXN0WyJVIl1wZWFjaCBzZHY7CglpbmZvOnVwZGF0ZSB0OiJUIixydWxlOjE2MCxtYXliZTowYiBmcm9tIGluZm8gd2hlcmUgdD0ibiIsbXcgd2l0aGluIDcgMTIsbWRvdDwyLHthbGwgeCBsaWtlIipbMC05XTpbMC01XVswLTldOlswLTVdWzAtOV0qIn1wZWFjaCBzZHYsLmNzdi5jYW5jYXN0WyJUIl1wZWFjaCBzZHY7CglpbmZvOnVwZGF0ZSB0OiJWIixydWxlOjE3MCxtYXliZTowYiBmcm9tIGluZm8gd2hlcmUgdD0iVCIsbXcgaW4gNyA4LG1kb3Q9MCwuY3N2LmNhbmNhc3RbIlYiXXBlYWNoIHNkdjsKCWluZm86dXBkYXRlIHQ6IlQiLHJ1bGU6MTgwLG1heWJlOjFiIGZyb20gaW5mbyB3aGVyZSB0IGluIkVGIixtdyB3aXRoaW4gNyAxMCxtZG90PTEse2FsbCB4IGxpa2UiKlswLTldWzAtNV1bMC05XVswLTVdWzAtOV0uKiJ9cGVhY2ggc2R2LC5jc3YuY2FuY2FzdFsiVCJdcGVhY2ggc2R2OwoJaW5mbzp1cGRhdGUgdDoiWiIscnVsZToxOTAsbWF5YmU6MGIgZnJvbSBpbmZvIHdoZXJlIHQ9Im4iLG13IHdpdGhpbiAxMSAyNCxtZG90PDQsLmNzdi5jYW5jYXN0WyJaIl1wZWFjaCBzZHY7CglpbmZvOnVwZGF0ZSB0OiJQIixydWxlOjIwMCxtYXliZToxYiBmcm9tIGluZm8gd2hlcmUgdD0ibiIsbXcgd2l0aGluIDEyIDI5LG1kb3Q8NCx7YWxsIHggbGlrZSJbMTJdKiJ9cGVhY2ggc2R2LC5jc3YuY2FuY2FzdFsiUCJdcGVhY2ggc2R2OwoJaW5mbzp1cGRhdGUgdDoiTiIscnVsZToyMTAsbWF5YmU6MWIgZnJvbSBpbmZvIHdoZXJlIHQ9Im4iLG13IHdpdGhpbiAzIDI4LG1kb3Q9MSwuY3N2LmNhbmNhc3RbIk4iXXBlYWNoIHNkdjsKCWluZm86dXBkYXRlIHQ6Ij8iLHJ1bGU6MjIwLG1heWJlOjBiIGZyb20gaW5mbyB3aGVyZSB0PSJuIjsgLyByZXNldCByZW1haW5pbmcgbWF5YmUgbnVtZXJpYwoJaW5mbzp1cGRhdGUgdDoiQyIscnVsZToyMzAsbWF5YmU6MGIgZnJvbSBpbmZvIHdoZXJlIHQ9Ij8iLG13PTE7IC8gY2hhcgoJaW5mbzp1cGRhdGUgdDoiQiIscnVsZToyNDAsbWF5YmU6MGIgZnJvbSBpbmZvIHdoZXJlIHQgaW4iSEMiLG13PTEsbWRvdD0wLHskW2FsbCB4IGluIjAxdFRmRnlZbk4iOyhhbnkiMGZGbk4iaW4geClhbmQgYW55IjF0VHlZImluIHg7MGJdfWVhY2ggZGNoYXI7IC8gYm9vbGVhbgoJaW5mbzp1cGRhdGUgdDoiQiIscnVsZToyNTAsbWF5YmU6MWIgZnJvbSBpbmZvIHdoZXJlIHQgaW4iSEMiLG13PTEsbWRvdD0wLHthbGwgeCBpbiIwMXRUZkZ5WW5OIn1lYWNoIGRjaGFyOyAvIGJvb2xlYW4KCWluZm86dXBkYXRlIHQ6IlgiLHJ1bGU6MjYwLG1heWJlOjBiIGZyb20gaW5mbyB3aGVyZSB0PSI/Iixtdz0yLHskW2FsbCB4IGluIjAxMjM0NTY3ODlhYmNkZWZBQkNERUYiOyhhbnkgLlEubiBpbiB4KWFuZCBhbnkiYWJjZGVmQUJDREVGImluIHg7MGJdfWVhY2ggZGNoYXI7IC9oZXgKCWluZm86dXBkYXRlIHQ6IlMiLHJ1bGU6MjcwLG1heWJlOjFiIGZyb20gaW5mbyB3aGVyZSB0PSI/IixtdzwuY3N2LlNZTU1BWFdJRFRILG13PjEsZ3I8LmNzdi5TWU1NQVhHUjsgLyBzeW1ib2xzIChtYXggd2lkdGggcGVybWl0dGluZykKCWluZm86dXBkYXRlIHQ6IioiLHJ1bGU6MjgwLG1heWJlOjBiIGZyb20gaW5mbyB3aGVyZSB0PSI/IjsgLyB0aGUgcmVzdCBhcyBzdHJpbmdzCgkvIGZsYWcgdGhvc2UgUy8qIGNvbHVtbnMgd2hpY2ggY291bGQgYmUgZW5jb2RlZCB0byBpbnRlZ2VycyAoLlEuajEwL3gxMC9qMTIveDEyKSB0byBhdm9pZCBzeW1ib2xzCglpbmZvOnVwZGF0ZSBqMTI6MWIgZnJvbSBpbmZvIHdoZXJlIHQgaW4iUyoiLG13PDEzLHthbGwgeCBpbiAuUS5uQX1lYWNoIGRjaGFyOwoJaW5mbzp1cGRhdGUgajEwOjFiIGZyb20gaW5mbyB3aGVyZSB0IGluIlMqIixtdzwxMSx7YWxsIHggaW4gLlEuYjZ9ZWFjaCBkY2hhcjsgCglzZWxlY3QgYyxjaSx0LG1heWJlLGVtcHR5LHJlcyxqMTAsajEyLGlwYSxtdyxtZG90LHJ1bGUsZ3IsbmR2LGRjaGFyIGZyb20gaW5mb30KaW5mbzppbmZvMFs7KCldIC8gYnkgZGVmYXVsdCBkb24ndCByZXN0cmljdCBjb2x1bW5zCmluZm9saWtlOntbZmlsZTtwYXR0ZXJuXSBpbmZvMFtmaWxlO3t4IHdoZXJlIHggbGlrZSB5fVtsb3dlciBjb2xoZHJzW2ZpbGVdO3BhdHRlcm5dXX0gLyAuY3N2LmluZm9saWtlW2ZpbGU7Iip0aW1lIl0KClxkIC4KLyBEQVRBOigpCmJ1bGtsb2FkOntbZmlsZTtpbmZvXQoJaWZbbm90YERBVEEgaW4gc3lzdGVtInYiOydgREFUQS5ub3QuZGVmaW5lZF07CglpZltjb3VudCBEQVRBOydgREFUQS5ub3QuZW1wdHldOwoJbG9hZGhkcnM6ZXhlYyBjIGZyb20gaW5mbyB3aGVyZSBub3QgdD0iICI7bG9hZGZtdHM6ZXhlYyB0IGZyb20gaW5mbzsKCS5jc3YuZnMyW3tbZmlsZTtsb2FkaGRycztsb2FkZm10c10gYERBVEEgaW5zZXJ0ICRbY291bnQgREFUQTtmbGlwIGxvYWRoZHJzIShsb2FkZm10czsuY3N2LkRFTElNKTA6ZmlsZTtsb2FkaGRycyB4Y29sKGxvYWRmbXRzO2VubGlzdCAuY3N2LkRFTElNKTA6ZmlsZV19W2ZpbGU7bG9hZGhkcnM7bG9hZGZtdHNdXTsKCWNvdW50IERBVEF9CkBbLjo7IlxcbCBjc3Z1dGlsLmN1c3RvbS5xIjs6Ol07IC8gc2F2ZSB5b3VyIGN1c3RvbSBzZXR0aW5ncyBpbiBjc3Z1dGlsLmN1c3RvbS5xIHRvIG92ZXJyaWRlIHRob3NlIHNldCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmaWxlIAo8L3RleHRhcmVhPjwvZGl2PgoKICAgIDxzY3JpcHQ+CiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICAgICAgbGluZU51bWJlcnM6IHRydWUsCiAgICAgICAgbWF0Y2hCcmFja2V0czogdHJ1ZQogICAgICB9KTsKICAgIDwvc2NyaXB0PgoKICAgIDxwPjxzdHJvbmc+TUlNRSB0eXBlIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPnRleHQveC1xPC9jb2RlPi48L3A+CiAgPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/q/q.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJxIixmdW5jdGlvbihjb25maWcpewogIHZhciBpbmRlbnRVbml0PWNvbmZpZy5pbmRlbnRVbml0LAogICAgICBjdXJQdW5jLAogICAgICBrZXl3b3Jkcz1idWlsZFJFKFsiYWJzIiwiYWNvcyIsImFqIiwiYWowIiwiYWxsIiwiYW5kIiwiYW55IiwiYXNjIiwiYXNpbiIsImFzb2YiLCJhdGFuIiwiYXR0ciIsImF2ZyIsImF2Z3MiLCJiaW4iLCJieSIsImNlaWxpbmciLCJjb2xzIiwiY29yIiwiY29zIiwiY291bnQiLCJjb3YiLCJjcm9zcyIsImNzdiIsImN1dCIsImRlbGV0ZSIsImRlbHRhcyIsImRlc2MiLCJkZXYiLCJkaWZmZXIiLCJkaXN0aW5jdCIsImRpdiIsImRvIiwiZWFjaCIsImVqIiwiZW5saXN0IiwiZXZhbCIsImV4Y2VwdCIsImV4ZWMiLCJleGl0IiwiZXhwIiwiZmJ5IiwiZmlsbHMiLCJmaXJzdCIsImZrZXlzIiwiZmxpcCIsImZsb29yIiwiZnJvbSIsImdldCIsImdldGVudiIsImdyb3VwIiwiZ3RpbWUiLCJoY2xvc2UiLCJoY291bnQiLCJoZGVsIiwiaG9wZW4iLCJoc3ltIiwiaWFzYyIsImlkZXNjIiwiaWYiLCJpaiIsImluIiwiaW5zZXJ0IiwiaW50ZXIiLCJpbnYiLCJrZXkiLCJrZXlzIiwibGFzdCIsImxpa2UiLCJsaXN0IiwibGoiLCJsb2FkIiwibG9nIiwibG93ZXIiLCJsc3EiLCJsdGltZSIsImx0cmltIiwibWF2ZyIsIm1heCIsIm1heHMiLCJtY291bnQiLCJtZDUiLCJtZGV2IiwibWVkIiwibWV0YSIsIm1pbiIsIm1pbnMiLCJtbWF4IiwibW1pbiIsIm1tdSIsIm1vZCIsIm1zdW0iLCJuZWciLCJuZXh0Iiwibm90IiwibnVsbCIsIm9yIiwib3ZlciIsInBhcnNlIiwicGVhY2giLCJwaiIsInBsaXN0IiwicHJkIiwicHJkcyIsInByZXYiLCJwcmlvciIsInJhbmQiLCJyYW5rIiwicmF0aW9zIiwicmF6ZSIsInJlYWQwIiwicmVhZDEiLCJyZWNpcHJvY2FsIiwicmV2ZXJzZSIsInJsb2FkIiwicm90YXRlIiwicnNhdmUiLCJydHJpbSIsInNhdmUiLCJzY2FuIiwic2VsZWN0Iiwic2V0Iiwic2V0ZW52Iiwic2hvdyIsInNpZ251bSIsInNpbiIsInNxcnQiLCJzcyIsInNzciIsInN0cmluZyIsInN1Ymxpc3QiLCJzdW0iLCJzdW1zIiwic3YiLCJzeXN0ZW0iLCJ0YWJsZXMiLCJ0YW4iLCJ0aWwiLCJ0cmltIiwidHhmIiwidHlwZSIsInVqIiwidW5ncm91cCIsInVuaW9uIiwidXBkYXRlIiwidXBwZXIiLCJ1cHNlcnQiLCJ2YWx1ZSIsInZhciIsInZpZXciLCJ2aWV3cyIsInZzIiwid2F2ZyIsIndoZXJlIiwid2hlcmUiLCJ3aGlsZSIsIndpdGhpbiIsIndqIiwid2oxIiwid3N1bSIsInhhc2MiLCJ4YmFyIiwieGNvbCIsInhjb2xzIiwieGRlc2MiLCJ4ZXhwIiwieGdyb3VwIiwieGtleSIsInhsb2ciLCJ4cHJldiIsInhyYW5rIl0pLAogICAgICBFPS9bfC8mXiErOlxcXC0qJSQ9fiM7QD48LD9fXCdcIlxbXChcXVwpXHN7fV0vOwogIGZ1bmN0aW9uIGJ1aWxkUkUodyl7cmV0dXJuIG5ldyBSZWdFeHAoIl4oIit3LmpvaW4oInwiKSsiKSQiKTt9CiAgZnVuY3Rpb24gdG9rZW5CYXNlKHN0cmVhbSxzdGF0ZSl7CiAgICB2YXIgc29sPXN0cmVhbS5zb2woKSxjPXN0cmVhbS5uZXh0KCk7CiAgICBjdXJQdW5jPW51bGw7CiAgICBpZihzb2wpCiAgICAgIGlmKGM9PSIvIikKICAgICAgICByZXR1cm4oc3RhdGUudG9rZW5pemU9dG9rZW5MaW5lQ29tbWVudCkoc3RyZWFtLHN0YXRlKTsKICAgICAgZWxzZSBpZihjPT0iXFwiKXsKICAgICAgICBpZihzdHJlYW0uZW9sKCl8fC9ccy8udGVzdChzdHJlYW0ucGVlaygpKSkKICAgICAgICAgIHJldHVybiBzdHJlYW0uc2tpcFRvRW5kKCksL15cXFxzKiQvLnRlc3Qoc3RyZWFtLmN1cnJlbnQoKSk/KHN0YXRlLnRva2VuaXplPXRva2VuQ29tbWVudFRvRU9GKShzdHJlYW0sIHN0YXRlKTpzdGF0ZS50b2tlbml6ZT10b2tlbkJhc2UsImNvbW1lbnQiOwogICAgICAgIGVsc2UKICAgICAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZT10b2tlbkJhc2UsImJ1aWx0aW4iOwogICAgICB9CiAgICBpZigvXHMvLnRlc3QoYykpCiAgICAgIHJldHVybiBzdHJlYW0ucGVlaygpPT0iLyI/KHN0cmVhbS5za2lwVG9FbmQoKSwiY29tbWVudCIpOiJ3aGl0ZXNwYWNlIjsKICAgIGlmKGM9PSciJykKICAgICAgcmV0dXJuKHN0YXRlLnRva2VuaXplPXRva2VuU3RyaW5nKShzdHJlYW0sc3RhdGUpOwogICAgaWYoYz09J2AnKQogICAgICByZXR1cm4gc3RyZWFtLmVhdFdoaWxlKC9bQS1afGEtenxcZHxffDp8XC98XC5dLyksInN5bWJvbCI7CiAgICBpZigoIi4iPT1jJiYvXGQvLnRlc3Qoc3RyZWFtLnBlZWsoKSkpfHwvXGQvLnRlc3QoYykpewogICAgICB2YXIgdD1udWxsOwogICAgICBzdHJlYW0uYmFja1VwKDEpOwogICAgICBpZihzdHJlYW0ubWF0Y2goL15cZHs0fVwuXGR7Mn0obXxcLlxkezJ9KFtEfFRdKFxkezJ9KDpcZHsyfSg6XGR7Mn0oXC5cZHsxLDl9KT8pPyk/KT8pPykvKQogICAgICB8fCBzdHJlYW0ubWF0Y2goL15cZCtEKFxkezJ9KDpcZHsyfSg6XGR7Mn0oXC5cZHsxLDl9KT8pPyk/KS8pCiAgICAgIHx8IHN0cmVhbS5tYXRjaCgvXlxkezJ9OlxkezJ9KDpcZHsyfShcLlxkezEsOX0pPyk/LykKICAgICAgfHwgc3RyZWFtLm1hdGNoKC9eXGQrW3B0dXZdezF9LykpCiAgICAgICAgdD0idGVtcG9yYWwiOwogICAgICBlbHNlIGlmKHN0cmVhbS5tYXRjaCgvXjBbTndXXXsxfS8pCiAgICAgIHx8IHN0cmVhbS5tYXRjaCgvXjB4W1xkfGEtZnxBLUZdKi8pCiAgICAgIHx8IHN0cmVhbS5tYXRjaCgvXlswfDFdK1tiXXsxfS8pCiAgICAgIHx8IHN0cmVhbS5tYXRjaCgvXlxkK1tjaGlqbl17MX0vKQogICAgICB8fCBzdHJlYW0ubWF0Y2goLy0/XGQqKFwuXGQqKT8oZVsrXC1dP1xkKyk/KGV8Zik/LykpCiAgICAgICAgdD0ibnVtYmVyIjsKICAgICAgcmV0dXJuKHQmJighKGM9c3RyZWFtLnBlZWsoKSl8fEUudGVzdChjKSkpP3Q6KHN0cmVhbS5uZXh0KCksImVycm9yIik7CiAgICB9CiAgICBpZigvW0EtWnxhLXpdfFwuLy50ZXN0KGMpKQogICAgICByZXR1cm4gc3RyZWFtLmVhdFdoaWxlKC9bQS1afGEtenxcLnxffFxkXS8pLGtleXdvcmRzLnRlc3Qoc3RyZWFtLmN1cnJlbnQoKSk/ImtleXdvcmQiOiJ2YXJpYWJsZSI7CiAgICBpZigvW3wvJl4hKzpcXFwtKiUkPX4jO0A+PFwuLD9fXCddLy50ZXN0KGMpKQogICAgICByZXR1cm4gbnVsbDsKICAgIGlmKC9be31cKFxbXF1cKV0vLnRlc3QoYykpCiAgICAgIHJldHVybiBudWxsOwogICAgcmV0dXJuImVycm9yIjsKICB9CiAgZnVuY3Rpb24gdG9rZW5MaW5lQ29tbWVudChzdHJlYW0sc3RhdGUpewogICAgcmV0dXJuIHN0cmVhbS5za2lwVG9FbmQoKSwvXC9ccyokLy50ZXN0KHN0cmVhbS5jdXJyZW50KCkpPyhzdGF0ZS50b2tlbml6ZT10b2tlbkJsb2NrQ29tbWVudCkoc3RyZWFtLHN0YXRlKTooc3RhdGUudG9rZW5pemU9dG9rZW5CYXNlKSwiY29tbWVudCI7CiAgfQogIGZ1bmN0aW9uIHRva2VuQmxvY2tDb21tZW50KHN0cmVhbSxzdGF0ZSl7CiAgICB2YXIgZj1zdHJlYW0uc29sKCkmJnN0cmVhbS5wZWVrKCk9PSJcXCI7CiAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICBpZihmJiYvXlxcXHMqJC8udGVzdChzdHJlYW0uY3VycmVudCgpKSkKICAgICAgc3RhdGUudG9rZW5pemU9dG9rZW5CYXNlOwogICAgcmV0dXJuImNvbW1lbnQiOwogIH0KICBmdW5jdGlvbiB0b2tlbkNvbW1lbnRUb0VPRihzdHJlYW0pe3JldHVybiBzdHJlYW0uc2tpcFRvRW5kKCksImNvbW1lbnQiO30KICBmdW5jdGlvbiB0b2tlblN0cmluZyhzdHJlYW0sc3RhdGUpewogICAgdmFyIGVzY2FwZWQ9ZmFsc2UsbmV4dCxlbmQ9ZmFsc2U7CiAgICB3aGlsZSgobmV4dD1zdHJlYW0ubmV4dCgpKSl7CiAgICAgIGlmKG5leHQ9PSJcIiImJiFlc2NhcGVkKXtlbmQ9dHJ1ZTticmVhazt9CiAgICAgIGVzY2FwZWQ9IWVzY2FwZWQmJm5leHQ9PSJcXCI7CiAgICB9CiAgICBpZihlbmQpc3RhdGUudG9rZW5pemU9dG9rZW5CYXNlOwogICAgcmV0dXJuInN0cmluZyI7CiAgfQogIGZ1bmN0aW9uIHB1c2hDb250ZXh0KHN0YXRlLHR5cGUsY29sKXtzdGF0ZS5jb250ZXh0PXtwcmV2OnN0YXRlLmNvbnRleHQsaW5kZW50OnN0YXRlLmluZGVudCxjb2w6Y29sLHR5cGU6dHlwZX07fQogIGZ1bmN0aW9uIHBvcENvbnRleHQoc3RhdGUpe3N0YXRlLmluZGVudD1zdGF0ZS5jb250ZXh0LmluZGVudDtzdGF0ZS5jb250ZXh0PXN0YXRlLmNvbnRleHQucHJldjt9CiAgcmV0dXJuewogICAgc3RhcnRTdGF0ZTpmdW5jdGlvbigpewogICAgICByZXR1cm57dG9rZW5pemU6dG9rZW5CYXNlLAogICAgICAgICAgICAgY29udGV4dDpudWxsLAogICAgICAgICAgICAgaW5kZW50OjAsCiAgICAgICAgICAgICBjb2w6MH07CiAgICB9LAogICAgdG9rZW46ZnVuY3Rpb24oc3RyZWFtLHN0YXRlKXsKICAgICAgaWYoc3RyZWFtLnNvbCgpKXsKICAgICAgICBpZihzdGF0ZS5jb250ZXh0JiZzdGF0ZS5jb250ZXh0LmFsaWduPT1udWxsKQogICAgICAgICAgc3RhdGUuY29udGV4dC5hbGlnbj1mYWxzZTsKICAgICAgICBzdGF0ZS5pbmRlbnQ9c3RyZWFtLmluZGVudGF0aW9uKCk7CiAgICAgIH0KICAgICAgLy9pZiAoc3RyZWFtLmVhdFNwYWNlKCkpIHJldHVybiBudWxsOwogICAgICB2YXIgc3R5bGU9c3RhdGUudG9rZW5pemUoc3RyZWFtLHN0YXRlKTsKICAgICAgaWYoc3R5bGUhPSJjb21tZW50IiYmc3RhdGUuY29udGV4dCYmc3RhdGUuY29udGV4dC5hbGlnbj09bnVsbCYmc3RhdGUuY29udGV4dC50eXBlIT0icGF0dGVybiIpewogICAgICAgIHN0YXRlLmNvbnRleHQuYWxpZ249dHJ1ZTsKICAgICAgfQogICAgICBpZihjdXJQdW5jPT0iKCIpcHVzaENvbnRleHQoc3RhdGUsIikiLHN0cmVhbS5jb2x1bW4oKSk7CiAgICAgIGVsc2UgaWYoY3VyUHVuYz09IlsiKXB1c2hDb250ZXh0KHN0YXRlLCJdIixzdHJlYW0uY29sdW1uKCkpOwogICAgICBlbHNlIGlmKGN1clB1bmM9PSJ7IilwdXNoQ29udGV4dChzdGF0ZSwifSIsc3RyZWFtLmNvbHVtbigpKTsKICAgICAgZWxzZSBpZigvW1xdXH1cKV0vLnRlc3QoY3VyUHVuYykpewogICAgICAgIHdoaWxlKHN0YXRlLmNvbnRleHQmJnN0YXRlLmNvbnRleHQudHlwZT09InBhdHRlcm4iKXBvcENvbnRleHQoc3RhdGUpOwogICAgICAgIGlmKHN0YXRlLmNvbnRleHQmJmN1clB1bmM9PXN0YXRlLmNvbnRleHQudHlwZSlwb3BDb250ZXh0KHN0YXRlKTsKICAgICAgfQogICAgICBlbHNlIGlmKGN1clB1bmM9PSIuIiYmc3RhdGUuY29udGV4dCYmc3RhdGUuY29udGV4dC50eXBlPT0icGF0dGVybiIpcG9wQ29udGV4dChzdGF0ZSk7CiAgICAgIGVsc2UgaWYoL2F0b218c3RyaW5nfHZhcmlhYmxlLy50ZXN0KHN0eWxlKSYmc3RhdGUuY29udGV4dCl7CiAgICAgICAgaWYoL1tcfVxdXS8udGVzdChzdGF0ZS5jb250ZXh0LnR5cGUpKQogICAgICAgICAgcHVzaENvbnRleHQoc3RhdGUsInBhdHRlcm4iLHN0cmVhbS5jb2x1bW4oKSk7CiAgICAgICAgZWxzZSBpZihzdGF0ZS5jb250ZXh0LnR5cGU9PSJwYXR0ZXJuIiYmIXN0YXRlLmNvbnRleHQuYWxpZ24pewogICAgICAgICAgc3RhdGUuY29udGV4dC5hbGlnbj10cnVlOwogICAgICAgICAgc3RhdGUuY29udGV4dC5jb2w9c3RyZWFtLmNvbHVtbigpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gc3R5bGU7CiAgICB9LAogICAgaW5kZW50OmZ1bmN0aW9uKHN0YXRlLHRleHRBZnRlcil7CiAgICAgIHZhciBmaXJzdENoYXI9dGV4dEFmdGVyJiZ0ZXh0QWZ0ZXIuY2hhckF0KDApOwogICAgICB2YXIgY29udGV4dD1zdGF0ZS5jb250ZXh0OwogICAgICBpZigvW1xdXH1dLy50ZXN0KGZpcnN0Q2hhcikpCiAgICAgICAgd2hpbGUgKGNvbnRleHQmJmNvbnRleHQudHlwZT09InBhdHRlcm4iKWNvbnRleHQ9Y29udGV4dC5wcmV2OwogICAgICB2YXIgY2xvc2luZz1jb250ZXh0JiZmaXJzdENoYXI9PWNvbnRleHQudHlwZTsKICAgICAgaWYoIWNvbnRleHQpCiAgICAgICAgcmV0dXJuIDA7CiAgICAgIGVsc2UgaWYoY29udGV4dC50eXBlPT0icGF0dGVybiIpCiAgICAgICAgcmV0dXJuIGNvbnRleHQuY29sOwogICAgICBlbHNlIGlmKGNvbnRleHQuYWxpZ24pCiAgICAgICAgcmV0dXJuIGNvbnRleHQuY29sKyhjbG9zaW5nPzA6MSk7CiAgICAgIGVsc2UKICAgICAgICByZXR1cm4gY29udGV4dC5pbmRlbnQrKGNsb3Npbmc/MDppbmRlbnRVbml0KTsKICAgIH0KICB9Owp9KTsKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtcSIsInEiKTsKCn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/r/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/r/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogUiBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9InIuanMiPjwvc2NyaXB0Pgo8c3R5bGU+CiAgICAgIC5Db2RlTWlycm9yIHsgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHNpbHZlcjsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHNpbHZlcjsgfQogICAgICAuY20tcy1kZWZhdWx0IHNwYW4uY20tc2VtaSB7IGNvbG9yOiBibHVlOyBmb250LXdlaWdodDogYm9sZDsgfQogICAgICAuY20tcy1kZWZhdWx0IHNwYW4uY20tZG9sbGFyIHsgY29sb3I6IG9yYW5nZTsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KICAgICAgLmNtLXMtZGVmYXVsdCBzcGFuLmNtLWFycm93IHsgY29sb3I6IGJyb3duOyB9CiAgICAgIC5jbS1zLWRlZmF1bHQgc3Bhbi5jbS1hcmctaXMgeyBjb2xvcjogYnJvd247IH0KICAgIDwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGltZyBpZD1sb2dvIHNyYz0iLi4vLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+TGFuZ3VhZ2UgbW9kZXM8L2E+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPlI8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPlIgbW9kZTwvaDI+Cjxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+CiMgQ29kZSBmcm9tIGh0dHA6Ly93d3cubWF5aW4ub3JnL2FqYXlzaGFoL0tCL1IvCgojIEZJUlNUIExFQVJOIEFCT1VUIExJU1RTIC0tClggPSBsaXN0KGhlaWdodD01LjQsIHdlaWdodD01NCkKcHJpbnQoIlVzZSBkZWZhdWx0IHByaW50aW5nIC0tIikKcHJpbnQoWCkKcHJpbnQoIkFjY2Vzc2luZyBpbmRpdmlkdWFsIGVsZW1lbnRzIC0tIikKY2F0KCJZb3VyIGhlaWdodCBpcyAiLCBYJGhlaWdodCwgIiBhbmQgeW91ciB3ZWlnaHQgaXMgIiwgWCR3ZWlnaHQsICJcbiIpCgojIEZVTkNUSU9OUyAtLQpzcXVhcmUgPC0gZnVuY3Rpb24oeCkgewogIHJldHVybih4KngpCn0KY2F0KCJUaGUgc3F1YXJlIG9mIDMgaXMgIiwgc3F1YXJlKDMpLCAiXG4iKQoKICAgICAgICAgICAgICAgICAjIGRlZmF1bHQgdmFsdWUgb2YgdGhlIGFyZyBpcyBzZXQgdG8gNS4KY3ViZSA8LSBmdW5jdGlvbih4PTUpIHsKICByZXR1cm4oeCp4KngpOwp9CmNhdCgiQ2FsbGluZyBjdWJlIHdpdGggMiA6ICIsIGN1YmUoMiksICJcbiIpICAgICMgd2lsbCBnaXZlIDJeMwpjYXQoIkNhbGxpbmcgY3ViZSAgICAgICAgOiAiLCBjdWJlKCksICJcbiIpICAgICAjIHdpbGwgZGVmYXVsdCB0byA1XjMuCgojIExFQVJOIEFCT1VUIEZVTkNUSU9OUyBUSEFUIFJFVFVSTiBNVUxUSVBMRSBPQkpFQ1RTIC0tCnBvd2VycyA8LSBmdW5jdGlvbih4KSB7CiAgcGFyY2VsID0gbGlzdCh4Mj14KngsIHgzPXgqeCp4LCB4ND14KngqeCp4KTsKICByZXR1cm4ocGFyY2VsKTsKfQoKWCA9IHBvd2VycygzKTsKcHJpbnQoIlNob3dpbmcgcG93ZXJzIG9mIDMgLS0iKTsgcHJpbnQoWCk7CgojIFdSSVRJTkcgVEhJUyBDT01QQUNUTFkgKDQgbGluZXMgaW5zdGVhZCBvZiA3KQoKcG93ZXJmdWwgPC0gZnVuY3Rpb24oeCkgewogIHJldHVybihsaXN0KHgyPXgqeCwgeDM9eCp4KngsIHg0PXgqeCp4KngpKTsKfQpwcmludCgiU2hvd2luZyBwb3dlcnMgb2YgMyAtLSIpOyBwcmludChwb3dlcmZ1bCgzKSk7CgojIEluIFIsIHRoZSBsYXN0IGV4cHJlc3Npb24gaW4gYSBmdW5jdGlvbiBpcywgYnkgZGVmYXVsdCwgd2hhdCBpcwojIHJldHVybmVkLiBTbyB5b3UgY291bGQgZXF1YWxseSBqdXN0IHNheToKcG93ZXJmdWwgPC0gZnVuY3Rpb24oeCkge2xpc3QoeDI9eCp4LCB4Mz14KngqeCwgeDQ9eCp4KngqeCl9CjwvdGV4dGFyZWE+PC9mb3JtPgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHt9KTsKICAgIDwvc2NyaXB0PgoKICAgIDxwPjxzdHJvbmc+TUlNRSB0eXBlcyBkZWZpbmVkOjwvc3Ryb25nPiA8Y29kZT50ZXh0L3gtcnNyYzwvY29kZT4uPC9wPgoKICAgIDxwPkRldmVsb3BtZW50IG9mIHRoZSBDb2RlTWlycm9yIFIgbW9kZSB3YXMga2luZGx5IHNwb25zb3JlZAogICAgYnkgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS91YmFsbyI+VWJhbG88L2E+LjwvcD4KCiAgPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/r/r.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJyIiwgZnVuY3Rpb24oY29uZmlnKSB7CiAgZnVuY3Rpb24gd29yZE9iaihzdHIpIHsKICAgIHZhciB3b3JkcyA9IHN0ci5zcGxpdCgiICIpLCByZXMgPSB7fTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgd29yZHMubGVuZ3RoOyArK2kpIHJlc1t3b3Jkc1tpXV0gPSB0cnVlOwogICAgcmV0dXJuIHJlczsKICB9CiAgdmFyIGF0b21zID0gd29yZE9iaigiTlVMTCBOQSBJbmYgTmFOIE5BX2ludGVnZXJfIE5BX3JlYWxfIE5BX2NvbXBsZXhfIE5BX2NoYXJhY3Rlcl8iKTsKICB2YXIgYnVpbHRpbnMgPSB3b3JkT2JqKCJsaXN0IHF1b3RlIGJxdW90ZSBldmFsIHJldHVybiBjYWxsIHBhcnNlIGRlcGFyc2UiKTsKICB2YXIga2V5d29yZHMgPSB3b3JkT2JqKCJpZiBlbHNlIHJlcGVhdCB3aGlsZSBmdW5jdGlvbiBmb3IgaW4gbmV4dCBicmVhayIpOwogIHZhciBibG9ja2tleXdvcmRzID0gd29yZE9iaigiaWYgZWxzZSByZXBlYXQgd2hpbGUgZnVuY3Rpb24gZm9yIik7CiAgdmFyIG9wQ2hhcnMgPSAvWytcLSpcL148Pj0hJnx+JDpdLzsKICB2YXIgY3VyUHVuYzsKCiAgZnVuY3Rpb24gdG9rZW5CYXNlKHN0cmVhbSwgc3RhdGUpIHsKICAgIGN1clB1bmMgPSBudWxsOwogICAgdmFyIGNoID0gc3RyZWFtLm5leHQoKTsKICAgIGlmIChjaCA9PSAiIyIpIHsKICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICByZXR1cm4gImNvbW1lbnQiOwogICAgfSBlbHNlIGlmIChjaCA9PSAiMCIgJiYgc3RyZWFtLmVhdCgieCIpKSB7CiAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1xkYS1mXS9pKTsKICAgICAgcmV0dXJuICJudW1iZXIiOwogICAgfSBlbHNlIGlmIChjaCA9PSAiLiIgJiYgc3RyZWFtLmVhdCgvXGQvKSkgewogICAgICBzdHJlYW0ubWF0Y2goL1xkKig/OmVbK1wtXT9cZCspPy8pOwogICAgICByZXR1cm4gIm51bWJlciI7CiAgICB9IGVsc2UgaWYgKC9cZC8udGVzdChjaCkpIHsKICAgICAgc3RyZWFtLm1hdGNoKC9cZCooPzpcLlxkKyk/KD86ZVsrXC1dXGQrKT9MPy8pOwogICAgICByZXR1cm4gIm51bWJlciI7CiAgICB9IGVsc2UgaWYgKGNoID09ICInIiB8fCBjaCA9PSAnIicpIHsKICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlblN0cmluZyhjaCk7CiAgICAgIHJldHVybiAic3RyaW5nIjsKICAgIH0gZWxzZSBpZiAoY2ggPT0gIi4iICYmIHN0cmVhbS5tYXRjaCgvLlsuXGRdKy8pKSB7CiAgICAgIHJldHVybiAia2V5d29yZCI7CiAgICB9IGVsc2UgaWYgKC9bXHdcLl0vLnRlc3QoY2gpICYmIGNoICE9ICJfIikgewogICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcd1wuXS8pOwogICAgICB2YXIgd29yZCA9IHN0cmVhbS5jdXJyZW50KCk7CiAgICAgIGlmIChhdG9tcy5wcm9wZXJ0eUlzRW51bWVyYWJsZSh3b3JkKSkgcmV0dXJuICJhdG9tIjsKICAgICAgaWYgKGtleXdvcmRzLnByb3BlcnR5SXNFbnVtZXJhYmxlKHdvcmQpKSB7CiAgICAgICAgLy8gQmxvY2sga2V5d29yZHMgc3RhcnQgbmV3IGJsb2NrcywgZXhjZXB0ICdlbHNlIGlmJywgd2hpY2ggb25seSBzdGFydHMKICAgICAgICAvLyBvbmUgbmV3IGJsb2NrIGZvciB0aGUgJ2lmJywgbm8gYmxvY2sgZm9yIHRoZSAnZWxzZScuCiAgICAgICAgaWYgKGJsb2Nra2V5d29yZHMucHJvcGVydHlJc0VudW1lcmFibGUod29yZCkgJiYKICAgICAgICAgICAgIXN0cmVhbS5tYXRjaCgvXHMqaWYoXHMrfCQpLywgZmFsc2UpKQogICAgICAgICAgY3VyUHVuYyA9ICJibG9jayI7CiAgICAgICAgcmV0dXJuICJrZXl3b3JkIjsKICAgICAgfQogICAgICBpZiAoYnVpbHRpbnMucHJvcGVydHlJc0VudW1lcmFibGUod29yZCkpIHJldHVybiAiYnVpbHRpbiI7CiAgICAgIHJldHVybiAidmFyaWFibGUiOwogICAgfSBlbHNlIGlmIChjaCA9PSAiJSIpIHsKICAgICAgaWYgKHN0cmVhbS5za2lwVG8oIiUiKSkgc3RyZWFtLm5leHQoKTsKICAgICAgcmV0dXJuICJ2YXJpYWJsZS0yIjsKICAgIH0gZWxzZSBpZiAoY2ggPT0gIjwiICYmIHN0cmVhbS5lYXQoIi0iKSkgewogICAgICByZXR1cm4gImFycm93IjsKICAgIH0gZWxzZSBpZiAoY2ggPT0gIj0iICYmIHN0YXRlLmN0eC5hcmdMaXN0KSB7CiAgICAgIHJldHVybiAiYXJnLWlzIjsKICAgIH0gZWxzZSBpZiAob3BDaGFycy50ZXN0KGNoKSkgewogICAgICBpZiAoY2ggPT0gIiQiKSByZXR1cm4gImRvbGxhciI7CiAgICAgIHN0cmVhbS5lYXRXaGlsZShvcENoYXJzKTsKICAgICAgcmV0dXJuICJvcGVyYXRvciI7CiAgICB9IGVsc2UgaWYgKC9bXChcKXt9XFtcXTtdLy50ZXN0KGNoKSkgewogICAgICBjdXJQdW5jID0gY2g7CiAgICAgIGlmIChjaCA9PSAiOyIpIHJldHVybiAic2VtaSI7CiAgICAgIHJldHVybiBudWxsOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfQoKICBmdW5jdGlvbiB0b2tlblN0cmluZyhxdW90ZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgaWYgKHN0cmVhbS5lYXQoIlxcIikpIHsKICAgICAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpOwogICAgICAgIGlmIChjaCA9PSAieCIpIHN0cmVhbS5tYXRjaCgvXlthLWYwLTldezJ9L2kpOwogICAgICAgIGVsc2UgaWYgKChjaCA9PSAidSIgfHwgY2ggPT0gIlUiKSAmJiBzdHJlYW0uZWF0KCJ7IikgJiYgc3RyZWFtLnNraXBUbygifSIpKSBzdHJlYW0ubmV4dCgpOwogICAgICAgIGVsc2UgaWYgKGNoID09ICJ1Iikgc3RyZWFtLm1hdGNoKC9eW2EtZjAtOV17NH0vaSk7CiAgICAgICAgZWxzZSBpZiAoY2ggPT0gIlUiKSBzdHJlYW0ubWF0Y2goL15bYS1mMC05XXs4fS9pKTsKICAgICAgICBlbHNlIGlmICgvWzAtN10vLnRlc3QoY2gpKSBzdHJlYW0ubWF0Y2goL15bMC03XXsxLDJ9Lyk7CiAgICAgICAgcmV0dXJuICJzdHJpbmctMiI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIG5leHQ7CiAgICAgICAgd2hpbGUgKChuZXh0ID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkgewogICAgICAgICAgaWYgKG5leHQgPT0gcXVvdGUpIHsgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7IGJyZWFrOyB9CiAgICAgICAgICBpZiAobmV4dCA9PSAiXFwiKSB7IHN0cmVhbS5iYWNrVXAoMSk7IGJyZWFrOyB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAic3RyaW5nIjsKICAgICAgfQogICAgfTsKICB9CgogIGZ1bmN0aW9uIHB1c2goc3RhdGUsIHR5cGUsIHN0cmVhbSkgewogICAgc3RhdGUuY3R4ID0ge3R5cGU6IHR5cGUsCiAgICAgICAgICAgICAgICAgaW5kZW50OiBzdGF0ZS5pbmRlbnQsCiAgICAgICAgICAgICAgICAgYWxpZ246IG51bGwsCiAgICAgICAgICAgICAgICAgY29sdW1uOiBzdHJlYW0uY29sdW1uKCksCiAgICAgICAgICAgICAgICAgcHJldjogc3RhdGUuY3R4fTsKICB9CiAgZnVuY3Rpb24gcG9wKHN0YXRlKSB7CiAgICBzdGF0ZS5pbmRlbnQgPSBzdGF0ZS5jdHguaW5kZW50OwogICAgc3RhdGUuY3R4ID0gc3RhdGUuY3R4LnByZXY7CiAgfQoKICByZXR1cm4gewogICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB7dG9rZW5pemU6IHRva2VuQmFzZSwKICAgICAgICAgICAgICBjdHg6IHt0eXBlOiAidG9wIiwKICAgICAgICAgICAgICAgICAgICBpbmRlbnQ6IC1jb25maWcuaW5kZW50VW5pdCwKICAgICAgICAgICAgICAgICAgICBhbGlnbjogZmFsc2V9LAogICAgICAgICAgICAgIGluZGVudDogMCwKICAgICAgICAgICAgICBhZnRlcklkZW50OiBmYWxzZX07CiAgICB9LAoKICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIGlmIChzdHJlYW0uc29sKCkpIHsKICAgICAgICBpZiAoc3RhdGUuY3R4LmFsaWduID09IG51bGwpIHN0YXRlLmN0eC5hbGlnbiA9IGZhbHNlOwogICAgICAgIHN0YXRlLmluZGVudCA9IHN0cmVhbS5pbmRlbnRhdGlvbigpOwogICAgICB9CiAgICAgIGlmIChzdHJlYW0uZWF0U3BhY2UoKSkgcmV0dXJuIG51bGw7CiAgICAgIHZhciBzdHlsZSA9IHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgICBpZiAoc3R5bGUgIT0gImNvbW1lbnQiICYmIHN0YXRlLmN0eC5hbGlnbiA9PSBudWxsKSBzdGF0ZS5jdHguYWxpZ24gPSB0cnVlOwoKICAgICAgdmFyIGN0eXBlID0gc3RhdGUuY3R4LnR5cGU7CiAgICAgIGlmICgoY3VyUHVuYyA9PSAiOyIgfHwgY3VyUHVuYyA9PSAieyIgfHwgY3VyUHVuYyA9PSAifSIpICYmIGN0eXBlID09ICJibG9jayIpIHBvcChzdGF0ZSk7CiAgICAgIGlmIChjdXJQdW5jID09ICJ7IikgcHVzaChzdGF0ZSwgIn0iLCBzdHJlYW0pOwogICAgICBlbHNlIGlmIChjdXJQdW5jID09ICIoIikgewogICAgICAgIHB1c2goc3RhdGUsICIpIiwgc3RyZWFtKTsKICAgICAgICBpZiAoc3RhdGUuYWZ0ZXJJZGVudCkgc3RhdGUuY3R4LmFyZ0xpc3QgPSB0cnVlOwogICAgICB9CiAgICAgIGVsc2UgaWYgKGN1clB1bmMgPT0gIlsiKSBwdXNoKHN0YXRlLCAiXSIsIHN0cmVhbSk7CiAgICAgIGVsc2UgaWYgKGN1clB1bmMgPT0gImJsb2NrIikgcHVzaChzdGF0ZSwgImJsb2NrIiwgc3RyZWFtKTsKICAgICAgZWxzZSBpZiAoY3VyUHVuYyA9PSBjdHlwZSkgcG9wKHN0YXRlKTsKICAgICAgc3RhdGUuYWZ0ZXJJZGVudCA9IHN0eWxlID09ICJ2YXJpYWJsZSIgfHwgc3R5bGUgPT0gImtleXdvcmQiOwogICAgICByZXR1cm4gc3R5bGU7CiAgICB9LAoKICAgIGluZGVudDogZnVuY3Rpb24oc3RhdGUsIHRleHRBZnRlcikgewogICAgICBpZiAoc3RhdGUudG9rZW5pemUgIT0gdG9rZW5CYXNlKSByZXR1cm4gMDsKICAgICAgdmFyIGZpcnN0Q2hhciA9IHRleHRBZnRlciAmJiB0ZXh0QWZ0ZXIuY2hhckF0KDApLCBjdHggPSBzdGF0ZS5jdHgsCiAgICAgICAgICBjbG9zaW5nID0gZmlyc3RDaGFyID09IGN0eC50eXBlOwogICAgICBpZiAoY3R4LnR5cGUgPT0gImJsb2NrIikgcmV0dXJuIGN0eC5pbmRlbnQgKyAoZmlyc3RDaGFyID09ICJ7IiA/IDAgOiBjb25maWcuaW5kZW50VW5pdCk7CiAgICAgIGVsc2UgaWYgKGN0eC5hbGlnbikgcmV0dXJuIGN0eC5jb2x1bW4gKyAoY2xvc2luZyA/IDAgOiAxKTsKICAgICAgZWxzZSByZXR1cm4gY3R4LmluZGVudCArIChjbG9zaW5nID8gMCA6IGNvbmZpZy5pbmRlbnRVbml0KTsKICAgIH0sCgogICAgbGluZUNvbW1lbnQ6ICIjIgogIH07Cn0pOwoKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtcnNyYyIsICJyIik7Cgp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/rpm/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/rpm/changes/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/rpm/changes/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogUlBNIGNoYW5nZXMgbW9kZTwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uLy4uL2RvYy9kb2NzLmNzcyI+CgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgogICAgPHNjcmlwdCBzcmM9Ii4uLy4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJjaGFuZ2VzLmpzIj48L3NjcmlwdD4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vLi4vZG9jL2RvY3MuY3NzIj4KICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+LkNvZGVNaXJyb3Ige2JvcmRlci10b3A6IDFweCBzb2xpZCBibGFjazsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO308L3N0eWxlPgoKPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aW1nIGlkPWxvZ28gc3JjPSIuLi8uLi8uLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5MYW5ndWFnZSBtb2RlczwvYT4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+UlBNIGNoYW5nZXM8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPlJQTSBjaGFuZ2VzIG1vZGU8L2gyPgoKICAgIDxkaXY+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpUdWUgT2N0IDE4IDEzOjU4OjQwIFVUQyAyMDExIC0gbWlzdGVyeEBleGFtcGxlLmNvbQoKLSBVcGRhdGUgdG8gcjYwLjMKLSBGaXhlcyBidWcgaW4gdGhlIHJlZmxlY3QgcGFja2FnZQogICogZGlzYWxsb3cgSW50ZXJmYWNlIG1ldGhvZCBvbiBWYWx1ZSBvYnRhaW5lZCB2aWEgdW5leHBvcnRlZCBuYW1lCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClRodSBPY3QgIDYgMDg6MTQ6MjQgVVRDIDIwMTEgLSBtaXN0ZXJ4QGV4YW1wbGUuY29tCgotIFVwZGF0ZSB0byByNjAuMgotIEZpeGVzIG1lbW9yeSBsZWFrIGluIGNlcnRhaW4gbWFwIHR5cGVzCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCldlZCBPY3QgIDUgMTQ6MzQ6MTAgVVRDIDIwMTEgLSBtaXN0ZXJ4QGV4YW1wbGUuY29tCgotIFR3ZWFrcyBmb3IgZ2RiIGRlYnVnZ2luZwotIGdvLnNwZWMgY2hhbmdlczoKICAtIG1vdmUgJWdvX2FyY2ggZGVmaW5pdGlvbiB0byAlcHJlcCBzZWN0aW9uCiAgLSBwYXNzIGNvcnJlY3QgbG9jYXRpb24gb2YgZ28gc3BlY2lmaWMgZ2RiIHByZXR0eSBwcmludGVyIGFuZAogICAgZnVuY3Rpb25zIHRvIGNwcCBhcyBIT1NUX0VYVFJBX0NGTEFHUyBtYWNybwogIC0gaW5zdGFsbCBnbyBnZGIgZnVuY3Rpb25zICYgcHJpbnRlcgotIGdkYi1wcmludGVyLnBhdGNoCiAgLSBwYXRjaCBsaW5rZXIgKHNyYy9jbWQvbGQvZHdhcmYuYykgdG8gZW1pdCBjb3JyZWN0IGxvY2F0aW9uIG9mIGdvCiAgICBnZGIgZnVuY3Rpb25zIGFuZCBwcmV0dHkgcHJpbnRlcgo8L3RleHRhcmVhPjwvZGl2PgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICBtb2RlOiB7bmFtZTogImNoYW5nZXMifSwKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgICAgICBpbmRlbnRVbml0OiA0CiAgICAgIH0pOwogICAgPC9zY3JpcHQ+CgogICAgPHA+PHN0cm9uZz5NSU1FIHR5cGVzIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPnRleHQveC1ycG0tY2hhbmdlczwvY29kZT4uPC9wPgo8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/rpm/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogUlBNIGNoYW5nZXMgbW9kZTwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uLy4uL2RvYy9kb2NzLmNzcyI+CgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgogICAgPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJycG0uanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgogICAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4uQ29kZU1pcnJvciB7Ym9yZGVyLXRvcDogMXB4IHNvbGlkIGJsYWNrOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+Cgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5SUE08L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPlJQTSBjaGFuZ2VzIG1vZGU8L2gyPgoKICAgIDxkaXY+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpUdWUgT2N0IDE4IDEzOjU4OjQwIFVUQyAyMDExIC0gbWlzdGVyeEBleGFtcGxlLmNvbQoKLSBVcGRhdGUgdG8gcjYwLjMKLSBGaXhlcyBidWcgaW4gdGhlIHJlZmxlY3QgcGFja2FnZQogICogZGlzYWxsb3cgSW50ZXJmYWNlIG1ldGhvZCBvbiBWYWx1ZSBvYnRhaW5lZCB2aWEgdW5leHBvcnRlZCBuYW1lCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClRodSBPY3QgIDYgMDg6MTQ6MjQgVVRDIDIwMTEgLSBtaXN0ZXJ4QGV4YW1wbGUuY29tCgotIFVwZGF0ZSB0byByNjAuMgotIEZpeGVzIG1lbW9yeSBsZWFrIGluIGNlcnRhaW4gbWFwIHR5cGVzCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCldlZCBPY3QgIDUgMTQ6MzQ6MTAgVVRDIDIwMTEgLSBtaXN0ZXJ4QGV4YW1wbGUuY29tCgotIFR3ZWFrcyBmb3IgZ2RiIGRlYnVnZ2luZwotIGdvLnNwZWMgY2hhbmdlczoKICAtIG1vdmUgJWdvX2FyY2ggZGVmaW5pdGlvbiB0byAlcHJlcCBzZWN0aW9uCiAgLSBwYXNzIGNvcnJlY3QgbG9jYXRpb24gb2YgZ28gc3BlY2lmaWMgZ2RiIHByZXR0eSBwcmludGVyIGFuZAogICAgZnVuY3Rpb25zIHRvIGNwcCBhcyBIT1NUX0VYVFJBX0NGTEFHUyBtYWNybwogIC0gaW5zdGFsbCBnbyBnZGIgZnVuY3Rpb25zICYgcHJpbnRlcgotIGdkYi1wcmludGVyLnBhdGNoCiAgLSBwYXRjaCBsaW5rZXIgKHNyYy9jbWQvbGQvZHdhcmYuYykgdG8gZW1pdCBjb3JyZWN0IGxvY2F0aW9uIG9mIGdvCiAgICBnZGIgZnVuY3Rpb25zIGFuZCBwcmV0dHkgcHJpbnRlcgo8L3RleHRhcmVhPjwvZGl2PgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICBtb2RlOiB7bmFtZTogInJwbS1jaGFuZ2VzIn0sCiAgICAgICAgbGluZU51bWJlcnM6IHRydWUsCiAgICAgICAgaW5kZW50VW5pdDogNAogICAgICB9KTsKICAgIDwvc2NyaXB0PgoKPGgyPlJQTSBzcGVjIG1vZGU8L2gyPgogICAgCiAgICA8ZGl2Pjx0ZXh0YXJlYSBpZD0iY29kZTIiIG5hbWU9ImNvZGUyIj4KIwojIHNwZWMgZmlsZSBmb3IgcGFja2FnZSBtaW5pZGxuYQojCiMgQ29weXJpZ2h0IChjKSAyMDExLCBTYXNjaGEgUGVpbGlja2UgPHNhc2NocGVAZ214LmRlPgojCiMgQWxsIG1vZGlmaWNhdGlvbnMgYW5kIGFkZGl0aW9ucyB0byB0aGUgZmlsZSBjb250cmlidXRlZCBieSB0aGlyZCBwYXJ0aWVzCiMgcmVtYWluIHRoZSBwcm9wZXJ0eSBvZiB0aGVpciBjb3B5cmlnaHQgb3duZXJzLCB1bmxlc3Mgb3RoZXJ3aXNlIGFncmVlZAojIHVwb24uIFRoZSBsaWNlbnNlIGZvciB0aGlzIGZpbGUsIGFuZCBtb2RpZmljYXRpb25zIGFuZCBhZGRpdGlvbnMgdG8gdGhlCiMgZmlsZSwgaXMgdGhlIHNhbWUgbGljZW5zZSBhcyBmb3IgdGhlIHByaXN0aW5lIHBhY2thZ2UgaXRzZWxmICh1bmxlc3MgdGhlCiMgbGljZW5zZSBmb3IgdGhlIHByaXN0aW5lIHBhY2thZ2UgaXMgbm90IGFuIE9wZW4gU291cmNlIExpY2Vuc2UsIGluIHdoaWNoCiMgY2FzZSB0aGUgbGljZW5zZSBpcyB0aGUgTUlUIExpY2Vuc2UpLiBBbiAiT3BlbiBTb3VyY2UgTGljZW5zZSIgaXMgYQojIGxpY2Vuc2UgdGhhdCBjb25mb3JtcyB0byB0aGUgT3BlbiBTb3VyY2UgRGVmaW5pdGlvbiAoVmVyc2lvbiAxLjkpCiMgcHVibGlzaGVkIGJ5IHRoZSBPcGVuIFNvdXJjZSBJbml0aWF0aXZlLgoKCk5hbWU6ICAgICAgICAgICBsaWJ1cG5wNgpWZXJzaW9uOiAgICAgICAgMS42LjEzClJlbGVhc2U6ICAgICAgICAwClN1bW1hcnk6ICAgICAgICBQb3J0YWJsZSBVbml2ZXJzYWwgUGx1ZyBhbmQgUGxheSAoVVBuUCkgU0RLCkdyb3VwOiAgICAgICAgICBTeXN0ZW0vTGlicmFyaWVzCkxpY2Vuc2U6ICAgICAgICBCU0QtMy1DbGF1c2UKVXJsOiAgICAgICAgICAgIGh0dHA6Ly9zb3VyY2Vmb3JnZS5uZXQvcHJvamVjdHMvcHVwbnAvClNvdXJjZTA6ICAgICAgICBodHRwOi8vZG93bmxvYWRzLnNvdXJjZWZvcmdlLm5ldC9wdXBucC9saWJ1cG5wLSV7dmVyc2lvbn0udGFyLmJ6MgpCdWlsZFJvb3Q6ICAgICAgJXtfdG1wcGF0aH0vJXtuYW1lfS0le3ZlcnNpb259LWJ1aWxkCgolZGVzY3JpcHRpb24KVGhlIHBvcnRhYmxlIFVuaXZlcnNhbCBQbHVnIGFuZCBQbGF5IChVUG5QKSBTREsgcHJvdmlkZXMgc3VwcG9ydCBmb3IgYnVpbGRpbmcKVVBuUC1jb21wbGlhbnQgY29udHJvbCBwb2ludHMsIGRldmljZXMsIGFuZCBicmlkZ2VzIG9uIHNldmVyYWwgb3BlcmF0aW5nCnN5c3RlbXMuCgolcGFja2FnZSAtbiBsaWJ1cG5wLWRldmVsClN1bW1hcnk6ICAgICAgICBQb3J0YWJsZSBVbml2ZXJzYWwgUGx1ZyBhbmQgUGxheSAoVVBuUCkgU0RLCkdyb3VwOiAgICAgICAgICBEZXZlbG9wbWVudC9MaWJyYXJpZXMvQyBhbmQgQysrClByb3ZpZGVzOiAgICAgICBwa2djb25maWcobGlidXBucCkKUmVxdWlyZXM6ICAgICAgICV7bmFtZX0gPSAle3ZlcnNpb259CgolZGVzY3JpcHRpb24gLW4gbGlidXBucC1kZXZlbApUaGUgcG9ydGFibGUgVW5pdmVyc2FsIFBsdWcgYW5kIFBsYXkgKFVQblApIFNESyBwcm92aWRlcyBzdXBwb3J0IGZvciBidWlsZGluZwpVUG5QLWNvbXBsaWFudCBjb250cm9sIHBvaW50cywgZGV2aWNlcywgYW5kIGJyaWRnZXMgb24gc2V2ZXJhbCBvcGVyYXRpbmcKc3lzdGVtcy4KCiVwcmVwCiVzZXR1cCAtbiBsaWJ1cG5wLSV7dmVyc2lvbn0KCiVidWlsZAolY29uZmlndXJlIC0tZGlzYWJsZS1zdGF0aWMKbWFrZSAlez9fc21wX21mbGFnc30KCiVpbnN0YWxsCiVtYWtlaW5zdGFsbApmaW5kICV7YnVpbGRyb290fSAtdHlwZSBmIC1uYW1lICcqLmxhJyAtZXhlYyBybSAtZiB7fSAnOycKCiVwb3N0IC1wIC9zYmluL2xkY29uZmlnCgolcG9zdHVuIC1wIC9zYmluL2xkY29uZmlnCgolZmlsZXMKJWRlZmF0dHIoLSxyb290LHJvb3QsLSkKJWRvYyBDaGFuZ2VMb2cgTkVXUyBSRUFETUUgVE9ETwole19saWJkaXJ9L2xpYml4bWwuc28uKgole19saWJkaXJ9L2xpYnRocmVhZHV0aWwuc28uKgole19saWJkaXJ9L2xpYnVwbnAuc28uKgoKJWZpbGVzIC1uIGxpYnVwbnAtZGV2ZWwKJWRlZmF0dHIoLSxyb290LHJvb3QsLSkKJXtfbGliZGlyfS9wa2djb25maWcvbGlidXBucC5wYwole19saWJkaXJ9L2xpYml4bWwuc28KJXtfbGliZGlyfS9saWJ0aHJlYWR1dGlsLnNvCiV7X2xpYmRpcn0vbGlidXBucC5zbwole19pbmNsdWRlZGlyfS91cG5wLwoKJWNoYW5nZWxvZzwvdGV4dGFyZWE+PC9kaXY+CiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUyIiksIHsKICAgICAgICBtb2RlOiB7bmFtZTogInJwbS1zcGVjIn0sCiAgICAgICAgbGluZU51bWJlcnM6IHRydWUsCiAgICAgICAgaW5kZW50VW5pdDogNAogICAgICB9KTsKICAgIDwvc2NyaXB0PgoKICAgIDxwPjxzdHJvbmc+TUlNRSB0eXBlcyBkZWZpbmVkOjwvc3Ryb25nPiA8Y29kZT50ZXh0L3gtcnBtLXNwZWM8L2NvZGU+LCA8Y29kZT50ZXh0L3gtcnBtLWNoYW5nZXM8L2NvZGU+LjwvcD4KPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/rpm/rpm.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJycG0tY2hhbmdlcyIsIGZ1bmN0aW9uKCkgewogIHZhciBoZWFkZXJTZXBlcmF0b3IgPSAvXi0rJC87CiAgdmFyIGhlYWRlckxpbmUgPSAvXihNb258VHVlfFdlZHxUaHV8RnJpfFNhdHxTdW4pIChKYW58RmVifE1hcnxBcHJ8TWF5fEp1bnxKdWx8QXVnfFNlcHxPY3R8Tm92fERlYykgID9cZHsxLDJ9IFxkezJ9OlxkezJ9KDpcZHsyfSk/IFtBLVpdezMsNH0gXGR7NH0gLSAvOwogIHZhciBzaW1wbGVFbWFpbCA9IC9eW1x3Ky4tXStAW1x3Li1dKy87CgogIHJldHVybiB7CiAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtKSB7CiAgICAgIGlmIChzdHJlYW0uc29sKCkpIHsKICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKGhlYWRlclNlcGVyYXRvcikpIHsgcmV0dXJuICd0YWcnOyB9CiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaChoZWFkZXJMaW5lKSkgeyByZXR1cm4gJ3RhZyc7IH0KICAgICAgfQogICAgICBpZiAoc3RyZWFtLm1hdGNoKHNpbXBsZUVtYWlsKSkgeyByZXR1cm4gJ3N0cmluZyc7IH0KICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfTsKfSk7CgpDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveC1ycG0tY2hhbmdlcyIsICJycG0tY2hhbmdlcyIpOwoKLy8gUXVpY2sgYW5kIGRpcnR5IHNwZWMgZmlsZSBoaWdobGlnaHRpbmcKCkNvZGVNaXJyb3IuZGVmaW5lTW9kZSgicnBtLXNwZWMiLCBmdW5jdGlvbigpIHsKICB2YXIgYXJjaCA9IC9eKGkzODZ8aTU4NnxpNjg2fHg4Nl82NHxwcGM2NHxwcGN8aWE2NHxzMzkweHxzMzkwfHNwYXJjNjR8c3BhcmN2OXxzcGFyY3xub2FyY2h8YWxwaGFldjZ8YWxwaGF8aHBwYXxtaXBzZWwpLzsKCiAgdmFyIHByZWFtYmxlID0gL14oTmFtZXxWZXJzaW9ufFJlbGVhc2V8TGljZW5zZXxTdW1tYXJ5fFVybHxHcm91cHxTb3VyY2V8QnVpbGRBcmNofEJ1aWxkUmVxdWlyZXN8QnVpbGRSb290fEF1dG9SZXFQcm92fFByb3ZpZGVzfFJlcXVpcmVzKFwoXHcrXCkpP3xPYnNvbGV0ZXN8Q29uZmxpY3RzfFJlY29tbWVuZHN8U291cmNlXGQqfFBhdGNoXGQqfEV4Y2x1c2l2ZUFyY2h8Tm9Tb3VyY2V8U3VwcGxlbWVudHMpOi87CiAgdmFyIHNlY3Rpb24gPSAvXiUoZGVidWdfcGFja2FnZXxwYWNrYWdlfGRlc2NyaXB0aW9ufHByZXB8YnVpbGR8aW5zdGFsbHxmaWxlc3xjbGVhbnxjaGFuZ2Vsb2d8cHJlaW5zdGFsbHxwcmV1bnxwb3N0aW5zdGFsbHxwb3N0dW58cHJlfHBvc3R8dHJpZ2dlcmlufHRyaWdnZXJ1bnxwcmV0cmFuc3xwb3N0dHJhbnN8dmVyaWZ5c2NyaXB0fGNoZWNrfHRyaWdnZXJwb3N0dW58dHJpZ2dlcnByZWlufHRyaWdnZXIpLzsKICB2YXIgY29udHJvbF9mbG93X2NvbXBsZXggPSAvXiUoaWZuYXJjaHxpZmFyY2h8aWYpLzsgLy8gcnBtIGNvbnRyb2wgZmxvdyBtYWNyb3MKICB2YXIgY29udHJvbF9mbG93X3NpbXBsZSA9IC9eJShlbHNlfGVuZGlmKS87IC8vIHJwbSBjb250cm9sIGZsb3cgbWFjcm9zCiAgdmFyIG9wZXJhdG9ycyA9IC9eKFwhfFw/fFw8XD18XDx8XD5cPXxcPnxcPVw9fFwmXCZ8XHxcfCkvOyAvLyBvcGVyYXRvcnMgaW4gY29udHJvbCBmbG93IG1hY3JvcwoKICByZXR1cm4gewogICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24gKCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICBjb250cm9sRmxvdzogZmFsc2UsCiAgICAgICAgICBtYWNyb1BhcmFtZXRlcnM6IGZhbHNlLAogICAgICAgICAgc2VjdGlvbjogZmFsc2UKICAgICAgICB9OwogICAgfSwKICAgIHRva2VuOiBmdW5jdGlvbiAoc3RyZWFtLCBzdGF0ZSkgewogICAgICB2YXIgY2ggPSBzdHJlYW0ucGVlaygpOwogICAgICBpZiAoY2ggPT0gIiMiKSB7IHN0cmVhbS5za2lwVG9FbmQoKTsgcmV0dXJuICJjb21tZW50IjsgfQoKICAgICAgaWYgKHN0cmVhbS5zb2woKSkgewogICAgICAgIGlmIChzdHJlYW0ubWF0Y2gocHJlYW1ibGUpKSB7IHJldHVybiAicHJlYW1ibGUiOyB9CiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaChzZWN0aW9uKSkgeyByZXR1cm4gInNlY3Rpb24iOyB9CiAgICAgIH0KCiAgICAgIGlmIChzdHJlYW0ubWF0Y2goL15cJFx3Ky8pKSB7IHJldHVybiAiZGVmIjsgfSAvLyBWYXJpYWJsZXMgbGlrZSAnJFJQTV9CVUlMRF9ST09UJwogICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eXCRce1x3K1x9LykpIHsgcmV0dXJuICJkZWYiOyB9IC8vIFZhcmlhYmxlcyBsaWtlICcke1JQTV9CVUlMRF9ST09UfScKCiAgICAgIGlmIChzdHJlYW0ubWF0Y2goY29udHJvbF9mbG93X3NpbXBsZSkpIHsgcmV0dXJuICJrZXl3b3JkIjsgfQogICAgICBpZiAoc3RyZWFtLm1hdGNoKGNvbnRyb2xfZmxvd19jb21wbGV4KSkgewogICAgICAgIHN0YXRlLmNvbnRyb2xGbG93ID0gdHJ1ZTsKICAgICAgICByZXR1cm4gImtleXdvcmQiOwogICAgICB9CiAgICAgIGlmIChzdGF0ZS5jb250cm9sRmxvdykgewogICAgICAgIGlmIChzdHJlYW0ubWF0Y2gob3BlcmF0b3JzKSkgeyByZXR1cm4gIm9wZXJhdG9yIjsgfQogICAgICAgIGlmIChzdHJlYW0ubWF0Y2goL14oXGQrKS8pKSB7IHJldHVybiAibnVtYmVyIjsgfQogICAgICAgIGlmIChzdHJlYW0uZW9sKCkpIHsgc3RhdGUuY29udHJvbEZsb3cgPSBmYWxzZTsgfQogICAgICB9CgogICAgICBpZiAoc3RyZWFtLm1hdGNoKGFyY2gpKSB7IHJldHVybiAibnVtYmVyIjsgfQoKICAgICAgLy8gTWFjcm9zIGxpa2UgJyVtYWtlX2luc3RhbGwnIG9yICclYXR0cigwNzc1LHJvb3Qscm9vdCknCiAgICAgIGlmIChzdHJlYW0ubWF0Y2goL14lW1x3XSsvKSkgewogICAgICAgIGlmIChzdHJlYW0ubWF0Y2goL15cKC8pKSB7IHN0YXRlLm1hY3JvUGFyYW1ldGVycyA9IHRydWU7IH0KICAgICAgICByZXR1cm4gIm1hY3JvIjsKICAgICAgfQogICAgICBpZiAoc3RhdGUubWFjcm9QYXJhbWV0ZXJzKSB7CiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXlxkKy8pKSB7IHJldHVybiAibnVtYmVyIjt9CiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXlwpLykpIHsKICAgICAgICAgIHN0YXRlLm1hY3JvUGFyYW1ldGVycyA9IGZhbHNlOwogICAgICAgICAgcmV0dXJuICJtYWNybyI7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChzdHJlYW0ubWF0Y2goL14lXHtcPz9bXHcgXC1dK1x9LykpIHsgcmV0dXJuICJtYWNybyI7IH0gLy8gTWFjcm9zIGxpa2UgJyV7ZGVmaW5lZCBmZWRvcmF9JwoKICAgICAgLy9UT0RPOiBJbmNsdWRlIGJhc2ggc2NyaXB0IHN1Yi1wYXJzZXIgKENvZGVNaXJyb3Igc3VwcG9ydHMgdGhhdCkKICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfTsKfSk7CgpDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveC1ycG0tc3BlYyIsICJycG0tc3BlYyIpOwoKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/rst/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/rst/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogcmVTdHJ1Y3R1cmVkVGV4dCBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uLy4uL2FkZG9uL21vZGUvb3ZlcmxheS5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJyc3QuanMiPjwvc2NyaXB0Pgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPi5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazt9PC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aW1nIGlkPWxvZ28gc3JjPSIuLi8uLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5MYW5ndWFnZSBtb2RlczwvYT4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+cmVTdHJ1Y3R1cmVkVGV4dDwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+cmVTdHJ1Y3R1cmVkVGV4dCBtb2RlPC9oMj4KPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KLi4gVGhpcyBpcyBhbiBleGNlcnB0IGZyb20gU3BoaW54IGRvY3VtZW50YXRpb246IGh0dHA6Ly9zcGhpbngucG9jb28ub3JnL19zb3VyY2VzL3Jlc3QudHh0CgouLiBoaWdobGlnaHRsYW5nOjogcmVzdAoKLi4gX3JzdC1wcmltZXI6CgpyZVN0cnVjdHVyZWRUZXh0IFByaW1lcgo9PT09PT09PT09PT09PT09PT09PT09PQoKVGhpcyBzZWN0aW9uIGlzIGEgYnJpZWYgaW50cm9kdWN0aW9uIHRvIHJlU3RydWN0dXJlZFRleHQgKHJlU1QpIGNvbmNlcHRzIGFuZApzeW50YXgsIGludGVuZGVkIHRvIHByb3ZpZGUgYXV0aG9ycyB3aXRoIGVub3VnaCBpbmZvcm1hdGlvbiB0byBhdXRob3IgZG9jdW1lbnRzCnByb2R1Y3RpdmVseS4gIFNpbmNlIHJlU1Qgd2FzIGRlc2lnbmVkIHRvIGJlIGEgc2ltcGxlLCB1bm9idHJ1c2l2ZSBtYXJrdXAKbGFuZ3VhZ2UsIHRoaXMgd2lsbCBub3QgdGFrZSB0b28gbG9uZy4KCi4uIHNlZWFsc286OgoKICAgVGhlIGF1dGhvcml0YXRpdmUgYHJlU3RydWN0dXJlZFRleHQgVXNlciBEb2N1bWVudGF0aW9uCiAgICZsdDtodHRwOi8vZG9jdXRpbHMuc291cmNlZm9yZ2UubmV0L3JzdC5odG1sJmd0O2BfLiAgVGhlICJyZWYiIGxpbmtzIGluIHRoaXMKICAgZG9jdW1lbnQgbGluayB0byB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGluZGl2aWR1YWwgY29uc3RydWN0cyBpbiB0aGUgcmVTVAogICByZWZlcmVuY2UuCgoKUGFyYWdyYXBocwotLS0tLS0tLS0tCgpUaGUgcGFyYWdyYXBoICg6ZHVyZWY6YHJlZiAmbHQ7cGFyYWdyYXBocyZndDtgKSBpcyB0aGUgbW9zdCBiYXNpYyBibG9jayBpbiBhIHJlU1QKZG9jdW1lbnQuICBQYXJhZ3JhcGhzIGFyZSBzaW1wbHkgY2h1bmtzIG9mIHRleHQgc2VwYXJhdGVkIGJ5IG9uZSBvciBtb3JlIGJsYW5rCmxpbmVzLiAgQXMgaW4gUHl0aG9uLCBpbmRlbnRhdGlvbiBpcyBzaWduaWZpY2FudCBpbiByZVNULCBzbyBhbGwgbGluZXMgb2YgdGhlCnNhbWUgcGFyYWdyYXBoIG11c3QgYmUgbGVmdC1hbGlnbmVkIHRvIHRoZSBzYW1lIGxldmVsIG9mIGluZGVudGF0aW9uLgoKCi4uIF9pbmxpbmVtYXJrdXA6CgpJbmxpbmUgbWFya3VwCi0tLS0tLS0tLS0tLS0KClRoZSBzdGFuZGFyZCByZVNUIGlubGluZSBtYXJrdXAgaXMgcXVpdGUgc2ltcGxlOiB1c2UKCiogb25lIGFzdGVyaXNrOiBgYCp0ZXh0KmBgIGZvciBlbXBoYXNpcyAoaXRhbGljcyksCiogdHdvIGFzdGVyaXNrczogYGAqKnRleHQqKmBgIGZvciBzdHJvbmcgZW1waGFzaXMgKGJvbGRmYWNlKSwgYW5kCiogYmFja3F1b3RlczogYGBgYHRleHRgYGBgIGZvciBjb2RlIHNhbXBsZXMuCgpJZiBhc3Rlcmlza3Mgb3IgYmFja3F1b3RlcyBhcHBlYXIgaW4gcnVubmluZyB0ZXh0IGFuZCBjb3VsZCBiZSBjb25mdXNlZCB3aXRoCmlubGluZSBtYXJrdXAgZGVsaW1pdGVycywgdGhleSBoYXZlIHRvIGJlIGVzY2FwZWQgd2l0aCBhIGJhY2tzbGFzaC4KCkJlIGF3YXJlIG9mIHNvbWUgcmVzdHJpY3Rpb25zIG9mIHRoaXMgbWFya3VwOgoKKiBpdCBtYXkgbm90IGJlIG5lc3RlZCwKKiBjb250ZW50IG1heSBub3Qgc3RhcnQgb3IgZW5kIHdpdGggd2hpdGVzcGFjZTogYGAqIHRleHQqYGAgaXMgd3JvbmcsCiogaXQgbXVzdCBiZSBzZXBhcmF0ZWQgZnJvbSBzdXJyb3VuZGluZyB0ZXh0IGJ5IG5vbi13b3JkIGNoYXJhY3RlcnMuICBVc2UgYQogIGJhY2tzbGFzaCBlc2NhcGVkIHNwYWNlIHRvIHdvcmsgYXJvdW5kIHRoYXQ6IGBgdGhpc2lzXCAqb25lKlwgd29yZGBgLgoKVGhlc2UgcmVzdHJpY3Rpb25zIG1heSBiZSBsaWZ0ZWQgaW4gZnV0dXJlIHZlcnNpb25zIG9mIHRoZSBkb2N1dGlscy4KCnJlU1QgYWxzbyBhbGxvd3MgZm9yIGN1c3RvbSAiaW50ZXJwcmV0ZWQgdGV4dCByb2xlcyInLCB3aGljaCBzaWduaWZ5IHRoYXQgdGhlCmVuY2xvc2VkIHRleHQgc2hvdWxkIGJlIGludGVycHJldGVkIGluIGEgc3BlY2lmaWMgd2F5LiAgU3BoaW54IHVzZXMgdGhpcyB0bwpwcm92aWRlIHNlbWFudGljIG1hcmt1cCBhbmQgY3Jvc3MtcmVmZXJlbmNpbmcgb2YgaWRlbnRpZmllcnMsIGFzIGRlc2NyaWJlZCBpbgp0aGUgYXBwcm9wcmlhdGUgc2VjdGlvbi4gIFRoZSBnZW5lcmFsIHN5bnRheCBpcyBgYDpyb2xlbmFtZTpgY29udGVudGBgYC4KClN0YW5kYXJkIHJlU1QgcHJvdmlkZXMgdGhlIGZvbGxvd2luZyByb2xlczoKCiogOmR1cm9sZTpgZW1waGFzaXNgIC0tIGFsdGVybmF0ZSBzcGVsbGluZyBmb3IgYGAqZW1waGFzaXMqYGAKKiA6ZHVyb2xlOmBzdHJvbmdgIC0tIGFsdGVybmF0ZSBzcGVsbGluZyBmb3IgYGAqKnN0cm9uZyoqYGAKKiA6ZHVyb2xlOmBsaXRlcmFsYCAtLSBhbHRlcm5hdGUgc3BlbGxpbmcgZm9yIGBgYGBsaXRlcmFsYGBgYAoqIDpkdXJvbGU6YHN1YnNjcmlwdGAgLS0gc3Vic2NyaXB0IHRleHQKKiA6ZHVyb2xlOmBzdXBlcnNjcmlwdGAgLS0gc3VwZXJzY3JpcHQgdGV4dAoqIDpkdXJvbGU6YHRpdGxlLXJlZmVyZW5jZWAgLS0gZm9yIHRpdGxlcyBvZiBib29rcywgcGVyaW9kaWNhbHMsIGFuZCBvdGhlcgogIG1hdGVyaWFscwoKU2VlIDpyZWY6YGlubGluZS1tYXJrdXBgIGZvciByb2xlcyBhZGRlZCBieSBTcGhpbnguCgoKTGlzdHMgYW5kIFF1b3RlLWxpa2UgYmxvY2tzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKTGlzdCBtYXJrdXAgKDpkdXJlZjpgcmVmICZsdDtidWxsZXQtbGlzdHMmZ3Q7YCkgaXMgbmF0dXJhbDoganVzdCBwbGFjZSBhbiBhc3RlcmlzayBhdAp0aGUgc3RhcnQgb2YgYSBwYXJhZ3JhcGggYW5kIGluZGVudCBwcm9wZXJseS4gIFRoZSBzYW1lIGdvZXMgZm9yIG51bWJlcmVkIGxpc3RzOwp0aGV5IGNhbiBhbHNvIGJlIGF1dG9udW1iZXJlZCB1c2luZyBhIGBgI2BgIHNpZ246OgoKICAgKiBUaGlzIGlzIGEgYnVsbGV0ZWQgbGlzdC4KICAgKiBJdCBoYXMgdHdvIGl0ZW1zLCB0aGUgc2Vjb25kCiAgICAgaXRlbSB1c2VzIHR3byBsaW5lcy4KCiAgIDEuIFRoaXMgaXMgYSBudW1iZXJlZCBsaXN0LgogICAyLiBJdCBoYXMgdHdvIGl0ZW1zIHRvby4KCiAgICMuIFRoaXMgaXMgYSBudW1iZXJlZCBsaXN0LgogICAjLiBJdCBoYXMgdHdvIGl0ZW1zIHRvby4KCgpOZXN0ZWQgbGlzdHMgYXJlIHBvc3NpYmxlLCBidXQgYmUgYXdhcmUgdGhhdCB0aGV5IG11c3QgYmUgc2VwYXJhdGVkIGZyb20gdGhlCnBhcmVudCBsaXN0IGl0ZW1zIGJ5IGJsYW5rIGxpbmVzOjoKCiAgICogdGhpcyBpcwogICAqIGEgbGlzdAoKICAgICAqIHdpdGggYSBuZXN0ZWQgbGlzdAogICAgICogYW5kIHNvbWUgc3ViaXRlbXMKCiAgICogYW5kIGhlcmUgdGhlIHBhcmVudCBsaXN0IGNvbnRpbnVlcwoKRGVmaW5pdGlvbiBsaXN0cyAoOmR1cmVmOmByZWYgJmx0O2RlZmluaXRpb24tbGlzdHMmZ3Q7YCkgYXJlIGNyZWF0ZWQgYXMgZm9sbG93czo6CgogICB0ZXJtICh1cCB0byBhIGxpbmUgb2YgdGV4dCkKICAgICAgRGVmaW5pdGlvbiBvZiB0aGUgdGVybSwgd2hpY2ggbXVzdCBiZSBpbmRlbnRlZAoKICAgICAgYW5kIGNhbiBldmVuIGNvbnNpc3Qgb2YgbXVsdGlwbGUgcGFyYWdyYXBocwoKICAgbmV4dCB0ZXJtCiAgICAgIERlc2NyaXB0aW9uLgoKTm90ZSB0aGF0IHRoZSB0ZXJtIGNhbm5vdCBoYXZlIG1vcmUgdGhhbiBvbmUgbGluZSBvZiB0ZXh0LgoKUXVvdGVkIHBhcmFncmFwaHMgKDpkdXJlZjpgcmVmICZsdDtibG9jay1xdW90ZXMmZ3Q7YCkgYXJlIGNyZWF0ZWQgYnkganVzdCBpbmRlbnRpbmcKdGhlbSBtb3JlIHRoYW4gdGhlIHN1cnJvdW5kaW5nIHBhcmFncmFwaHMuCgpMaW5lIGJsb2NrcyAoOmR1cmVmOmByZWYgJmx0O2xpbmUtYmxvY2tzJmd0O2ApIGFyZSBhIHdheSBvZiBwcmVzZXJ2aW5nIGxpbmUgYnJlYWtzOjoKCiAgIHwgVGhlc2UgbGluZXMgYXJlCiAgIHwgYnJva2VuIGV4YWN0bHkgbGlrZSBpbgogICB8IHRoZSBzb3VyY2UgZmlsZS4KClRoZXJlIGFyZSBhbHNvIHNldmVyYWwgbW9yZSBzcGVjaWFsIGJsb2NrcyBhdmFpbGFibGU6CgoqIGZpZWxkIGxpc3RzICg6ZHVyZWY6YHJlZiAmbHQ7ZmllbGQtbGlzdHMmZ3Q7YCkKKiBvcHRpb24gbGlzdHMgKDpkdXJlZjpgcmVmICZsdDtvcHRpb24tbGlzdHMmZ3Q7YCkKKiBxdW90ZWQgbGl0ZXJhbCBibG9ja3MgKDpkdXJlZjpgcmVmICZsdDtxdW90ZWQtbGl0ZXJhbC1ibG9ja3MmZ3Q7YCkKKiBkb2N0ZXN0IGJsb2NrcyAoOmR1cmVmOmByZWYgJmx0O2RvY3Rlc3QtYmxvY2tzJmd0O2ApCgoKU291cmNlIENvZGUKLS0tLS0tLS0tLS0KCkxpdGVyYWwgY29kZSBibG9ja3MgKDpkdXJlZjpgcmVmICZsdDtsaXRlcmFsLWJsb2NrcyZndDtgKSBhcmUgaW50cm9kdWNlZCBieSBlbmRpbmcgYQpwYXJhZ3JhcGggd2l0aCB0aGUgc3BlY2lhbCBtYXJrZXIgYGA6OmBgLiAgVGhlIGxpdGVyYWwgYmxvY2sgbXVzdCBiZSBpbmRlbnRlZAooYW5kLCBsaWtlIGFsbCBwYXJhZ3JhcGhzLCBzZXBhcmF0ZWQgZnJvbSB0aGUgc3Vycm91bmRpbmcgb25lcyBieSBibGFuayBsaW5lcyk6OgoKICAgVGhpcyBpcyBhIG5vcm1hbCB0ZXh0IHBhcmFncmFwaC4gVGhlIG5leHQgcGFyYWdyYXBoIGlzIGEgY29kZSBzYW1wbGU6OgoKICAgICAgSXQgaXMgbm90IHByb2Nlc3NlZCBpbiBhbnkgd2F5LCBleGNlcHQKICAgICAgdGhhdCB0aGUgaW5kZW50YXRpb24gaXMgcmVtb3ZlZC4KCiAgICAgIEl0IGNhbiBzcGFuIG11bHRpcGxlIGxpbmVzLgoKICAgVGhpcyBpcyBhIG5vcm1hbCB0ZXh0IHBhcmFncmFwaCBhZ2Fpbi4KClRoZSBoYW5kbGluZyBvZiB0aGUgYGA6OmBgIG1hcmtlciBpcyBzbWFydDoKCiogSWYgaXQgb2NjdXJzIGFzIGEgcGFyYWdyYXBoIG9mIGl0cyBvd24sIHRoYXQgcGFyYWdyYXBoIGlzIGNvbXBsZXRlbHkgbGVmdAogIG91dCBvZiB0aGUgZG9jdW1lbnQuCiogSWYgaXQgaXMgcHJlY2VkZWQgYnkgd2hpdGVzcGFjZSwgdGhlIG1hcmtlciBpcyByZW1vdmVkLgoqIElmIGl0IGlzIHByZWNlZGVkIGJ5IG5vbi13aGl0ZXNwYWNlLCB0aGUgbWFya2VyIGlzIHJlcGxhY2VkIGJ5IGEgc2luZ2xlCiAgY29sb24uCgpUaGF0IHdheSwgdGhlIHNlY29uZCBzZW50ZW5jZSBpbiB0aGUgYWJvdmUgZXhhbXBsZSdzIGZpcnN0IHBhcmFncmFwaCB3b3VsZCBiZQpyZW5kZXJlZCBhcyAiVGhlIG5leHQgcGFyYWdyYXBoIGlzIGEgY29kZSBzYW1wbGU6Ii4KCgouLiBfcnN0LXRhYmxlczoKClRhYmxlcwotLS0tLS0KClR3byBmb3JtcyBvZiB0YWJsZXMgYXJlIHN1cHBvcnRlZC4gIEZvciAqZ3JpZCB0YWJsZXMqICg6ZHVyZWY6YHJlZgombHQ7Z3JpZC10YWJsZXMmZ3Q7YCksIHlvdSBoYXZlIHRvICJwYWludCIgdGhlIGNlbGwgZ3JpZCB5b3Vyc2VsZi4gIFRoZXkgbG9vayBsaWtlCnRoaXM6OgoKICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tKwogICB8IEhlYWRlciByb3csIGNvbHVtbiAxICAgfCBIZWFkZXIgMiAgIHwgSGVhZGVyIDMgfCBIZWFkZXIgNCB8CiAgIHwgKGhlYWRlciByb3dzIG9wdGlvbmFsKSB8ICAgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgIHwKICAgKz09PT09PT09PT09PT09PT09PT09PT09PSs9PT09PT09PT09PT0rPT09PT09PT09PSs9PT09PT09PT09KwogICB8IGJvZHkgcm93IDEsIGNvbHVtbiAxICAgfCBjb2x1bW4gMiAgIHwgY29sdW1uIDMgfCBjb2x1bW4gNCB8CiAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLSsKICAgfCBib2R5IHJvdyAyICAgICAgICAgICAgIHwgLi4uICAgICAgICB8IC4uLiAgICAgIHwgICAgICAgICAgfAogICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0rCgoqU2ltcGxlIHRhYmxlcyogKDpkdXJlZjpgcmVmICZsdDtzaW1wbGUtdGFibGVzJmd0O2ApIGFyZSBlYXNpZXIgdG8gd3JpdGUsIGJ1dApsaW1pdGVkOiB0aGV5IG11c3QgY29udGFpbiBtb3JlIHRoYW4gb25lIHJvdywgYW5kIHRoZSBmaXJzdCBjb2x1bW4gY2Fubm90CmNvbnRhaW4gbXVsdGlwbGUgbGluZXMuICBUaGV5IGxvb2sgbGlrZSB0aGlzOjoKCiAgID09PT09ICA9PT09PSAgPT09PT09PQogICBBICAgICAgQiAgICAgIEEgYW5kIEIKICAgPT09PT0gID09PT09ICA9PT09PT09CiAgIEZhbHNlICBGYWxzZSAgRmFsc2UKICAgVHJ1ZSAgIEZhbHNlICBGYWxzZQogICBGYWxzZSAgVHJ1ZSAgIEZhbHNlCiAgIFRydWUgICBUcnVlICAgVHJ1ZQogICA9PT09PSAgPT09PT0gID09PT09PT0KCgpIeXBlcmxpbmtzCi0tLS0tLS0tLS0KCkV4dGVybmFsIGxpbmtzCl5eXl5eXl5eXl5eXl5eCgpVc2UgYGBgTGluayB0ZXh0ICZsdDtodHRwOi8vZXhhbXBsZS5jb20vJmd0O2BfYGAgZm9yIGlubGluZSB3ZWIgbGlua3MuICBJZiB0aGUgbGluawp0ZXh0IHNob3VsZCBiZSB0aGUgd2ViIGFkZHJlc3MsIHlvdSBkb24ndCBuZWVkIHNwZWNpYWwgbWFya3VwIGF0IGFsbCwgdGhlIHBhcnNlcgpmaW5kcyBsaW5rcyBhbmQgbWFpbCBhZGRyZXNzZXMgaW4gb3JkaW5hcnkgdGV4dC4KCllvdSBjYW4gYWxzbyBzZXBhcmF0ZSB0aGUgbGluayBhbmQgdGhlIHRhcmdldCBkZWZpbml0aW9uICg6ZHVyZWY6YHJlZgombHQ7aHlwZXJsaW5rLXRhcmdldHMmZ3Q7YCksIGxpa2UgdGhpczo6CgogICBUaGlzIGlzIGEgcGFyYWdyYXBoIHRoYXQgY29udGFpbnMgYGEgbGlua2BfLgoKICAgLi4gX2EgbGluazogaHR0cDovL2V4YW1wbGUuY29tLwoKCkludGVybmFsIGxpbmtzCl5eXl5eXl5eXl5eXl5eCgpJbnRlcm5hbCBsaW5raW5nIGlzIGRvbmUgdmlhIGEgc3BlY2lhbCByZVNUIHJvbGUgcHJvdmlkZWQgYnkgU3BoaW54LCBzZWUgdGhlCnNlY3Rpb24gb24gc3BlY2lmaWMgbWFya3VwLCA6cmVmOmByZWYtcm9sZWAuCgoKU2VjdGlvbnMKLS0tLS0tLS0KClNlY3Rpb24gaGVhZGVycyAoOmR1cmVmOmByZWYgJmx0O3NlY3Rpb25zJmd0O2ApIGFyZSBjcmVhdGVkIGJ5IHVuZGVybGluaW5nIChhbmQKb3B0aW9uYWxseSBvdmVybGluaW5nKSB0aGUgc2VjdGlvbiB0aXRsZSB3aXRoIGEgcHVuY3R1YXRpb24gY2hhcmFjdGVyLCBhdCBsZWFzdAphcyBsb25nIGFzIHRoZSB0ZXh0OjoKCiAgID09PT09PT09PT09PT09PT09CiAgIFRoaXMgaXMgYSBoZWFkaW5nCiAgID09PT09PT09PT09PT09PT09CgpOb3JtYWxseSwgdGhlcmUgYXJlIG5vIGhlYWRpbmcgbGV2ZWxzIGFzc2lnbmVkIHRvIGNlcnRhaW4gY2hhcmFjdGVycyBhcyB0aGUKc3RydWN0dXJlIGlzIGRldGVybWluZWQgZnJvbSB0aGUgc3VjY2Vzc2lvbiBvZiBoZWFkaW5ncy4gIEhvd2V2ZXIsIGZvciB0aGUKUHl0aG9uIGRvY3VtZW50YXRpb24sIHRoaXMgY29udmVudGlvbiBpcyB1c2VkIHdoaWNoIHlvdSBtYXkgZm9sbG93OgoKKiBgYCNgYCB3aXRoIG92ZXJsaW5lLCBmb3IgcGFydHMKKiBgYCpgYCB3aXRoIG92ZXJsaW5lLCBmb3IgY2hhcHRlcnMKKiBgYD1gYCwgZm9yIHNlY3Rpb25zCiogYGAtYGAsIGZvciBzdWJzZWN0aW9ucwoqIGBgXmBgLCBmb3Igc3Vic3Vic2VjdGlvbnMKKiBgYCJgYCwgZm9yIHBhcmFncmFwaHMKCk9mIGNvdXJzZSwgeW91IGFyZSBmcmVlIHRvIHVzZSB5b3VyIG93biBtYXJrZXIgY2hhcmFjdGVycyAoc2VlIHRoZSByZVNUCmRvY3VtZW50YXRpb24pLCBhbmQgdXNlIGEgZGVlcGVyIG5lc3RpbmcgbGV2ZWwsIGJ1dCBrZWVwIGluIG1pbmQgdGhhdCBtb3N0CnRhcmdldCBmb3JtYXRzIChIVE1MLCBMYVRlWCkgaGF2ZSBhIGxpbWl0ZWQgc3VwcG9ydGVkIG5lc3RpbmcgZGVwdGguCgoKRXhwbGljaXQgTWFya3VwCi0tLS0tLS0tLS0tLS0tLQoKIkV4cGxpY2l0IG1hcmt1cCIgKDpkdXJlZjpgcmVmICZsdDtleHBsaWNpdC1tYXJrdXAtYmxvY2tzJmd0O2ApIGlzIHVzZWQgaW4gcmVTVCBmb3IKbW9zdCBjb25zdHJ1Y3RzIHRoYXQgbmVlZCBzcGVjaWFsIGhhbmRsaW5nLCBzdWNoIGFzIGZvb3Rub3RlcywKc3BlY2lhbGx5LWhpZ2hsaWdodGVkIHBhcmFncmFwaHMsIGNvbW1lbnRzLCBhbmQgZ2VuZXJpYyBkaXJlY3RpdmVzLgoKQW4gZXhwbGljaXQgbWFya3VwIGJsb2NrIGJlZ2lucyB3aXRoIGEgbGluZSBzdGFydGluZyB3aXRoIGBgLi5gYCBmb2xsb3dlZCBieQp3aGl0ZXNwYWNlIGFuZCBpcyB0ZXJtaW5hdGVkIGJ5IHRoZSBuZXh0IHBhcmFncmFwaCBhdCB0aGUgc2FtZSBsZXZlbCBvZgppbmRlbnRhdGlvbi4gIChUaGVyZSBuZWVkcyB0byBiZSBhIGJsYW5rIGxpbmUgYmV0d2VlbiBleHBsaWNpdCBtYXJrdXAgYW5kIG5vcm1hbApwYXJhZ3JhcGhzLiAgVGhpcyBtYXkgYWxsIHNvdW5kIGEgYml0IGNvbXBsaWNhdGVkLCBidXQgaXQgaXMgaW50dWl0aXZlIGVub3VnaAp3aGVuIHlvdSB3cml0ZSBpdC4pCgoKLi4gX2RpcmVjdGl2ZXM6CgpEaXJlY3RpdmVzCi0tLS0tLS0tLS0KCkEgZGlyZWN0aXZlICg6ZHVyZWY6YHJlZiAmbHQ7ZGlyZWN0aXZlcyZndDtgKSBpcyBhIGdlbmVyaWMgYmxvY2sgb2YgZXhwbGljaXQgbWFya3VwLgpCZXNpZGVzIHJvbGVzLCBpdCBpcyBvbmUgb2YgdGhlIGV4dGVuc2lvbiBtZWNoYW5pc21zIG9mIHJlU1QsIGFuZCBTcGhpbnggbWFrZXMKaGVhdnkgdXNlIG9mIGl0LgoKRG9jdXRpbHMgc3VwcG9ydHMgdGhlIGZvbGxvd2luZyBkaXJlY3RpdmVzOgoKKiBBZG1vbml0aW9uczogOmR1ZGlyOmBhdHRlbnRpb25gLCA6ZHVkaXI6YGNhdXRpb25gLCA6ZHVkaXI6YGRhbmdlcmAsCiAgOmR1ZGlyOmBlcnJvcmAsIDpkdWRpcjpgaGludGAsIDpkdWRpcjpgaW1wb3J0YW50YCwgOmR1ZGlyOmBub3RlYCwKICA6ZHVkaXI6YHRpcGAsIDpkdWRpcjpgd2FybmluZ2AgYW5kIHRoZSBnZW5lcmljIDpkdWRpcjpgYWRtb25pdGlvbmAuCiAgKE1vc3QgdGhlbWVzIHN0eWxlIG9ubHkgIm5vdGUiIGFuZCAid2FybmluZyIgc3BlY2lhbGx5LikKCiogSW1hZ2VzOgoKICAtIDpkdWRpcjpgaW1hZ2VgIChzZWUgYWxzbyBJbWFnZXNfIGJlbG93KQogIC0gOmR1ZGlyOmBmaWd1cmVgIChhbiBpbWFnZSB3aXRoIGNhcHRpb24gYW5kIG9wdGlvbmFsIGxlZ2VuZCkKCiogQWRkaXRpb25hbCBib2R5IGVsZW1lbnRzOgoKICAtIDpkdWRpcjpgY29udGVudHNgIChhIGxvY2FsLCBpLmUuIGZvciB0aGUgY3VycmVudCBmaWxlIG9ubHksIHRhYmxlIG9mCiAgICBjb250ZW50cykKICAtIDpkdWRpcjpgY29udGFpbmVyYCAoYSBjb250YWluZXIgd2l0aCBhIGN1c3RvbSBjbGFzcywgdXNlZnVsIHRvIGdlbmVyYXRlIGFuCiAgICBvdXRlciBgYCZsdDtkaXYmZ3Q7YGAgaW4gSFRNTCkKICAtIDpkdWRpcjpgcnVicmljYCAoYSBoZWFkaW5nIHdpdGhvdXQgcmVsYXRpb24gdG8gdGhlIGRvY3VtZW50IHNlY3Rpb25pbmcpCiAgLSA6ZHVkaXI6YHRvcGljYCwgOmR1ZGlyOmBzaWRlYmFyYCAoc3BlY2lhbCBoaWdobGlnaHRlZCBib2R5IGVsZW1lbnRzKQogIC0gOmR1ZGlyOmBwYXJzZWQtbGl0ZXJhbGAgKGxpdGVyYWwgYmxvY2sgdGhhdCBzdXBwb3J0cyBpbmxpbmUgbWFya3VwKQogIC0gOmR1ZGlyOmBlcGlncmFwaGAgKGEgYmxvY2sgcXVvdGUgd2l0aCBvcHRpb25hbCBhdHRyaWJ1dGlvbiBsaW5lKQogIC0gOmR1ZGlyOmBoaWdobGlnaHRzYCwgOmR1ZGlyOmBwdWxsLXF1b3RlYCAoYmxvY2sgcXVvdGVzIHdpdGggdGhlaXIgb3duCiAgICBjbGFzcyBhdHRyaWJ1dGUpCiAgLSA6ZHVkaXI6YGNvbXBvdW5kYCAoYSBjb21wb3VuZCBwYXJhZ3JhcGgpCgoqIFNwZWNpYWwgdGFibGVzOgoKICAtIDpkdWRpcjpgdGFibGVgIChhIHRhYmxlIHdpdGggdGl0bGUpCiAgLSA6ZHVkaXI6YGNzdi10YWJsZWAgKGEgdGFibGUgZ2VuZXJhdGVkIGZyb20gY29tbWEtc2VwYXJhdGVkIHZhbHVlcykKICAtIDpkdWRpcjpgbGlzdC10YWJsZWAgKGEgdGFibGUgZ2VuZXJhdGVkIGZyb20gYSBsaXN0IG9mIGxpc3RzKQoKKiBTcGVjaWFsIGRpcmVjdGl2ZXM6CgogIC0gOmR1ZGlyOmByYXdgIChpbmNsdWRlIHJhdyB0YXJnZXQtZm9ybWF0IG1hcmt1cCkKICAtIDpkdWRpcjpgaW5jbHVkZWAgKGluY2x1ZGUgcmVTdHJ1Y3R1cmVkVGV4dCBmcm9tIGFub3RoZXIgZmlsZSkKICAgIC0tIGluIFNwaGlueCwgd2hlbiBnaXZlbiBhbiBhYnNvbHV0ZSBpbmNsdWRlIGZpbGUgcGF0aCwgdGhpcyBkaXJlY3RpdmUgdGFrZXMKICAgIGl0IGFzIHJlbGF0aXZlIHRvIHRoZSBzb3VyY2UgZGlyZWN0b3J5CiAgLSA6ZHVkaXI6YGNsYXNzYCAoYXNzaWduIGEgY2xhc3MgYXR0cmlidXRlIHRvIHRoZSBuZXh0IGVsZW1lbnQpIFsxXV8KCiogSFRNTCBzcGVjaWZpY3M6CgogIC0gOmR1ZGlyOmBtZXRhYCAoZ2VuZXJhdGlvbiBvZiBIVE1MIGBgJmx0O21ldGEmZ3Q7YGAgdGFncykKICAtIDpkdWRpcjpgdGl0bGVgIChvdmVycmlkZSBkb2N1bWVudCB0aXRsZSkKCiogSW5mbHVlbmNpbmcgbWFya3VwOgoKICAtIDpkdWRpcjpgZGVmYXVsdC1yb2xlYCAoc2V0IGEgbmV3IGRlZmF1bHQgcm9sZSkKICAtIDpkdWRpcjpgcm9sZWAgKGNyZWF0ZSBhIG5ldyByb2xlKQoKICBTaW5jZSB0aGVzZSBhcmUgb25seSBwZXItZmlsZSwgYmV0dGVyIHVzZSBTcGhpbngnIGZhY2lsaXRpZXMgZm9yIHNldHRpbmcgdGhlCiAgOmNvbmZ2YWw6YGRlZmF1bHRfcm9sZWAuCgpEbyAqbm90KiB1c2UgdGhlIGRpcmVjdGl2ZXMgOmR1ZGlyOmBzZWN0bnVtYCwgOmR1ZGlyOmBoZWFkZXJgIGFuZAo6ZHVkaXI6YGZvb3RlcmAuCgpEaXJlY3RpdmVzIGFkZGVkIGJ5IFNwaGlueCBhcmUgZGVzY3JpYmVkIGluIDpyZWY6YHNwaGlueG1hcmt1cGAuCgpCYXNpY2FsbHksIGEgZGlyZWN0aXZlIGNvbnNpc3RzIG9mIGEgbmFtZSwgYXJndW1lbnRzLCBvcHRpb25zIGFuZCBjb250ZW50LiAoS2VlcAp0aGlzIHRlcm1pbm9sb2d5IGluIG1pbmQsIGl0IGlzIHVzZWQgaW4gdGhlIG5leHQgY2hhcHRlciBkZXNjcmliaW5nIGN1c3RvbQpkaXJlY3RpdmVzLikgIExvb2tpbmcgYXQgdGhpcyBleGFtcGxlLCA6OgoKICAgLi4gZnVuY3Rpb246OiBmb28oeCkKICAgICAgICAgICAgICAgICBmb28oeSwgeikKICAgICAgOm1vZHVsZTogc29tZS5tb2R1bGUubmFtZQoKICAgICAgUmV0dXJuIGEgbGluZSBvZiB0ZXh0IGlucHV0IGZyb20gdGhlIHVzZXIuCgpgYGZ1bmN0aW9uYGAgaXMgdGhlIGRpcmVjdGl2ZSBuYW1lLiAgSXQgaXMgZ2l2ZW4gdHdvIGFyZ3VtZW50cyBoZXJlLCB0aGUKcmVtYWluZGVyIG9mIHRoZSBmaXJzdCBsaW5lIGFuZCB0aGUgc2Vjb25kIGxpbmUsIGFzIHdlbGwgYXMgb25lIG9wdGlvbgpgYG1vZHVsZWBgIChhcyB5b3UgY2FuIHNlZSwgb3B0aW9ucyBhcmUgZ2l2ZW4gaW4gdGhlIGxpbmVzIGltbWVkaWF0ZWx5IGZvbGxvd2luZwp0aGUgYXJndW1lbnRzIGFuZCBpbmRpY2F0ZWQgYnkgdGhlIGNvbG9ucykuICBPcHRpb25zIG11c3QgYmUgaW5kZW50ZWQgdG8gdGhlCnNhbWUgbGV2ZWwgYXMgdGhlIGRpcmVjdGl2ZSBjb250ZW50LgoKVGhlIGRpcmVjdGl2ZSBjb250ZW50IGZvbGxvd3MgYWZ0ZXIgYSBibGFuayBsaW5lIGFuZCBpcyBpbmRlbnRlZCByZWxhdGl2ZSB0byB0aGUKZGlyZWN0aXZlIHN0YXJ0LgoKCkltYWdlcwotLS0tLS0KCnJlU1Qgc3VwcG9ydHMgYW4gaW1hZ2UgZGlyZWN0aXZlICg6ZHVkaXI6YHJlZiAmbHQ7aW1hZ2UmZ3Q7YCksIHVzZWQgbGlrZSBzbzo6CgogICAuLiBpbWFnZTo6IGdudS5wbmcKICAgICAgKG9wdGlvbnMpCgpXaGVuIHVzZWQgd2l0aGluIFNwaGlueCwgdGhlIGZpbGUgbmFtZSBnaXZlbiAoaGVyZSBgYGdudS5wbmdgYCkgbXVzdCBlaXRoZXIgYmUKcmVsYXRpdmUgdG8gdGhlIHNvdXJjZSBmaWxlLCBvciBhYnNvbHV0ZSB3aGljaCBtZWFucyB0aGF0IHRoZXkgYXJlIHJlbGF0aXZlIHRvCnRoZSB0b3Agc291cmNlIGRpcmVjdG9yeS4gIEZvciBleGFtcGxlLCB0aGUgZmlsZSBgYHNrZXRjaC9zcGFtLnJzdGBgIGNvdWxkIHJlZmVyCnRvIHRoZSBpbWFnZSBgYGltYWdlcy9zcGFtLnBuZ2BgIGFzIGBgLi4vaW1hZ2VzL3NwYW0ucG5nYGAgb3IKYGAvaW1hZ2VzL3NwYW0ucG5nYGAuCgpTcGhpbnggd2lsbCBhdXRvbWF0aWNhbGx5IGNvcHkgaW1hZ2UgZmlsZXMgb3ZlciB0byBhIHN1YmRpcmVjdG9yeSBvZiB0aGUgb3V0cHV0CmRpcmVjdG9yeSBvbiBidWlsZGluZyAoZS5nLiB0aGUgYGBfc3RhdGljYGAgZGlyZWN0b3J5IGZvciBIVE1MIG91dHB1dC4pCgpJbnRlcnByZXRhdGlvbiBvZiBpbWFnZSBzaXplIG9wdGlvbnMgKGBgd2lkdGhgYCBhbmQgYGBoZWlnaHRgYCkgaXMgYXMgZm9sbG93czoKaWYgdGhlIHNpemUgaGFzIG5vIHVuaXQgb3IgdGhlIHVuaXQgaXMgcGl4ZWxzLCB0aGUgZ2l2ZW4gc2l6ZSB3aWxsIG9ubHkgYmUKcmVzcGVjdGVkIGZvciBvdXRwdXQgY2hhbm5lbHMgdGhhdCBzdXBwb3J0IHBpeGVscyAoaS5lLiBub3QgaW4gTGFUZVggb3V0cHV0KS4KT3RoZXIgdW5pdHMgKGxpa2UgYGBwdGBgIGZvciBwb2ludHMpIHdpbGwgYmUgdXNlZCBmb3IgSFRNTCBhbmQgTGFUZVggb3V0cHV0LgoKU3BoaW54IGV4dGVuZHMgdGhlIHN0YW5kYXJkIGRvY3V0aWxzIGJlaGF2aW9yIGJ5IGFsbG93aW5nIGFuIGFzdGVyaXNrIGZvciB0aGUKZXh0ZW5zaW9uOjoKCiAgIC4uIGltYWdlOjogZ251LioKClNwaGlueCB0aGVuIHNlYXJjaGVzIGZvciBhbGwgaW1hZ2VzIG1hdGNoaW5nIHRoZSBwcm92aWRlZCBwYXR0ZXJuIGFuZCBkZXRlcm1pbmVzCnRoZWlyIHR5cGUuICBFYWNoIGJ1aWxkZXIgdGhlbiBjaG9vc2VzIHRoZSBiZXN0IGltYWdlIG91dCBvZiB0aGVzZSBjYW5kaWRhdGVzLgpGb3IgaW5zdGFuY2UsIGlmIHRoZSBmaWxlIG5hbWUgYGBnbnUuKmBgIHdhcyBnaXZlbiBhbmQgdHdvIGZpbGVzIDpmaWxlOmBnbnUucGRmYAphbmQgOmZpbGU6YGdudS5wbmdgIGV4aXN0ZWQgaW4gdGhlIHNvdXJjZSB0cmVlLCB0aGUgTGFUZVggYnVpbGRlciB3b3VsZCBjaG9vc2UKdGhlIGZvcm1lciwgd2hpbGUgdGhlIEhUTUwgYnVpbGRlciB3b3VsZCBwcmVmZXIgdGhlIGxhdHRlci4KCi4uIHZlcnNpb25jaGFuZ2VkOjogMC40CiAgIEFkZGVkIHRoZSBzdXBwb3J0IGZvciBmaWxlIG5hbWVzIGVuZGluZyBpbiBhbiBhc3Rlcmlzay4KCi4uIHZlcnNpb25jaGFuZ2VkOjogMC42CiAgIEltYWdlIHBhdGhzIGNhbiBub3cgYmUgYWJzb2x1dGUuCgoKRm9vdG5vdGVzCi0tLS0tLS0tLQoKRm9yIGZvb3Rub3RlcyAoOmR1cmVmOmByZWYgJmx0O2Zvb3Rub3RlcyZndDtgKSwgdXNlIGBgWyNuYW1lXV9gYCB0byBtYXJrIHRoZSBmb290bm90ZQpsb2NhdGlvbiwgYW5kIGFkZCB0aGUgZm9vdG5vdGUgYm9keSBhdCB0aGUgYm90dG9tIG9mIHRoZSBkb2N1bWVudCBhZnRlciBhCiJGb290bm90ZXMiIHJ1YnJpYyBoZWFkaW5nLCBsaWtlIHNvOjoKCiAgIExvcmVtIGlwc3VtIFsjZjFdXyBkb2xvciBzaXQgYW1ldCAuLi4gWyNmMl1fCgogICAuLiBydWJyaWM6OiBGb290bm90ZXMKCiAgIC4uIFsjZjFdIFRleHQgb2YgdGhlIGZpcnN0IGZvb3Rub3RlLgogICAuLiBbI2YyXSBUZXh0IG9mIHRoZSBzZWNvbmQgZm9vdG5vdGUuCgpZb3UgY2FuIGFsc28gZXhwbGljaXRseSBudW1iZXIgdGhlIGZvb3Rub3RlcyAoYGBbMV1fYGApIG9yIHVzZSBhdXRvLW51bWJlcmVkCmZvb3Rub3RlcyB3aXRob3V0IG5hbWVzIChgYFsjXV9gYCkuCgoKQ2l0YXRpb25zCi0tLS0tLS0tLQoKU3RhbmRhcmQgcmVTVCBjaXRhdGlvbnMgKDpkdXJlZjpgcmVmICZsdDtjaXRhdGlvbnMmZ3Q7YCkgYXJlIHN1cHBvcnRlZCwgd2l0aCB0aGUKYWRkaXRpb25hbCBmZWF0dXJlIHRoYXQgdGhleSBhcmUgImdsb2JhbCIsIGkuZS4gYWxsIGNpdGF0aW9ucyBjYW4gYmUgcmVmZXJlbmNlZApmcm9tIGFsbCBmaWxlcy4gIFVzZSB0aGVtIGxpa2Ugc286OgoKICAgTG9yZW0gaXBzdW0gW1JlZl1fIGRvbG9yIHNpdCBhbWV0LgoKICAgLi4gW1JlZl0gQm9vayBvciBhcnRpY2xlIHJlZmVyZW5jZSwgVVJMIG9yIHdoYXRldmVyLgoKQ2l0YXRpb24gdXNhZ2UgaXMgc2ltaWxhciB0byBmb290bm90ZSB1c2FnZSwgYnV0IHdpdGggYSBsYWJlbCB0aGF0IGlzIG5vdApudW1lcmljIG9yIGJlZ2lucyB3aXRoIGBgI2BgLgoKClN1YnN0aXR1dGlvbnMKLS0tLS0tLS0tLS0tLQoKcmVTVCBzdXBwb3J0cyAic3Vic3RpdHV0aW9ucyIgKDpkdXJlZjpgcmVmICZsdDtzdWJzdGl0dXRpb24tZGVmaW5pdGlvbnMmZ3Q7YCksIHdoaWNoCmFyZSBwaWVjZXMgb2YgdGV4dCBhbmQvb3IgbWFya3VwIHJlZmVycmVkIHRvIGluIHRoZSB0ZXh0IGJ5IGBgfG5hbWV8YGAuICBUaGV5CmFyZSBkZWZpbmVkIGxpa2UgZm9vdG5vdGVzIHdpdGggZXhwbGljaXQgbWFya3VwIGJsb2NrcywgbGlrZSB0aGlzOjoKCiAgIC4uIHxuYW1lfCByZXBsYWNlOjogcmVwbGFjZW1lbnQgKnRleHQqCgpvciB0aGlzOjoKCiAgIC4uIHxjYXV0aW9ufCBpbWFnZTo6IHdhcm5pbmcucG5nCiAgICAgICAgICAgICAgICA6YWx0OiBXYXJuaW5nIQoKU2VlIHRoZSA6ZHVyZWY6YHJlU1QgcmVmZXJlbmNlIGZvciBzdWJzdGl0dXRpb25zICZsdDtzdWJzdGl0dXRpb24tZGVmaW5pdGlvbnMmZ3Q7YApmb3IgZGV0YWlscy4KCklmIHlvdSB3YW50IHRvIHVzZSBzb21lIHN1YnN0aXR1dGlvbnMgZm9yIGFsbCBkb2N1bWVudHMsIHB1dCB0aGVtIGludG8KOmNvbmZ2YWw6YHJzdF9wcm9sb2dgIG9yIHB1dCB0aGVtIGludG8gYSBzZXBhcmF0ZSBmaWxlIGFuZCBpbmNsdWRlIGl0IGludG8gYWxsCmRvY3VtZW50cyB5b3Ugd2FudCB0byB1c2UgdGhlbSBpbiwgdXNpbmcgdGhlIDpyc3Q6ZGlyOmBpbmNsdWRlYCBkaXJlY3RpdmUuICAoQmUKc3VyZSB0byBnaXZlIHRoZSBpbmNsdWRlIGZpbGUgYSBmaWxlIG5hbWUgZXh0ZW5zaW9uIGRpZmZlcmluZyBmcm9tIHRoYXQgb2Ygb3RoZXIKc291cmNlIGZpbGVzLCB0byBhdm9pZCBTcGhpbnggZmluZGluZyBpdCBhcyBhIHN0YW5kYWxvbmUgZG9jdW1lbnQuKQoKU3BoaW54IGRlZmluZXMgc29tZSBkZWZhdWx0IHN1YnN0aXR1dGlvbnMsIHNlZSA6cmVmOmBkZWZhdWx0LXN1YnN0aXR1dGlvbnNgLgoKCkNvbW1lbnRzCi0tLS0tLS0tCgpFdmVyeSBleHBsaWNpdCBtYXJrdXAgYmxvY2sgd2hpY2ggaXNuJ3QgYSB2YWxpZCBtYXJrdXAgY29uc3RydWN0IChsaWtlIHRoZQpmb290bm90ZXMgYWJvdmUpIGlzIHJlZ2FyZGVkIGFzIGEgY29tbWVudCAoOmR1cmVmOmByZWYgJmx0O2NvbW1lbnRzJmd0O2ApLiAgRm9yCmV4YW1wbGU6OgoKICAgLi4gVGhpcyBpcyBhIGNvbW1lbnQuCgpZb3UgY2FuIGluZGVudCB0ZXh0IGFmdGVyIGEgY29tbWVudCBzdGFydCB0byBmb3JtIG11bHRpbGluZSBjb21tZW50czo6CgogICAuLgogICAgICBUaGlzIHdob2xlIGluZGVudGVkIGJsb2NrCiAgICAgIGlzIGEgY29tbWVudC4KCiAgICAgIFN0aWxsIGluIHRoZSBjb21tZW50LgoKClNvdXJjZSBlbmNvZGluZwotLS0tLS0tLS0tLS0tLS0KClNpbmNlIHRoZSBlYXNpZXN0IHdheSB0byBpbmNsdWRlIHNwZWNpYWwgY2hhcmFjdGVycyBsaWtlIGVtIGRhc2hlcyBvciBjb3B5cmlnaHQKc2lnbnMgaW4gcmVTVCBpcyB0byBkaXJlY3RseSB3cml0ZSB0aGVtIGFzIFVuaWNvZGUgY2hhcmFjdGVycywgb25lIGhhcyB0bwpzcGVjaWZ5IGFuIGVuY29kaW5nLiAgU3BoaW54IGFzc3VtZXMgc291cmNlIGZpbGVzIHRvIGJlIGVuY29kZWQgaW4gVVRGLTggYnkKZGVmYXVsdDsgeW91IGNhbiBjaGFuZ2UgdGhpcyB3aXRoIHRoZSA6Y29uZnZhbDpgc291cmNlX2VuY29kaW5nYCBjb25maWcgdmFsdWUuCgoKR290Y2hhcwotLS0tLS0tCgpUaGVyZSBhcmUgc29tZSBwcm9ibGVtcyBvbmUgY29tbW9ubHkgcnVucyBpbnRvIHdoaWxlIGF1dGhvcmluZyByZVNUIGRvY3VtZW50czoKCiogKipTZXBhcmF0aW9uIG9mIGlubGluZSBtYXJrdXA6KiogQXMgc2FpZCBhYm92ZSwgaW5saW5lIG1hcmt1cCBzcGFucyBtdXN0IGJlCiAgc2VwYXJhdGVkIGZyb20gdGhlIHN1cnJvdW5kaW5nIHRleHQgYnkgbm9uLXdvcmQgY2hhcmFjdGVycywgeW91IGhhdmUgdG8gdXNlIGEKICBiYWNrc2xhc2gtZXNjYXBlZCBzcGFjZSB0byBnZXQgYXJvdW5kIHRoYXQuICBTZWUgYHRoZSByZWZlcmVuY2UKICAmbHQ7aHR0cDovL2RvY3V0aWxzLnNmLm5ldC9kb2NzL3JlZi9yc3QvcmVzdHJ1Y3R1cmVkdGV4dC5odG1sI2lubGluZS1tYXJrdXAmZ3Q7YF8KICBmb3IgdGhlIGRldGFpbHMuCgoqICoqTm8gbmVzdGVkIGlubGluZSBtYXJrdXA6KiogU29tZXRoaW5nIGxpa2UgYGAqc2VlIDpmdW5jOmBmb29gKmBgIGlzIG5vdAogIHBvc3NpYmxlLgoKCi4uIHJ1YnJpYzo6IEZvb3Rub3RlcwoKLi4gWzFdIFdoZW4gdGhlIGRlZmF1bHQgZG9tYWluIGNvbnRhaW5zIGEgOnJzdDpkaXI6YGNsYXNzYCBkaXJlY3RpdmUsIHRoaXMgZGlyZWN0aXZlCiAgICAgICB3aWxsIGJlIHNoYWRvd2VkLiAgVGhlcmVmb3JlLCBTcGhpbnggcmUtZXhwb3J0cyBpdCBhcyA6cnN0OmRpcjpgcnN0LWNsYXNzYC4KPC90ZXh0YXJlYT48L2Zvcm0+CgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgICAgfSk7CiAgICA8L3NjcmlwdD4KICAgIDxwPgogICAgICAgIFRoZSA8Y29kZT5weXRob248L2NvZGU+IG1vZGUgd2lsbCBiZSB1c2VkIGZvciBoaWdobGlnaHRpbmcgYmxvY2tzCiAgICAgICAgY29udGFpbmluZyBQeXRob24vSVB5dGhvbiB0ZXJtaW5hbCBzZXNzaW9uczogYmxvY2tzIHN0YXJ0aW5nIHdpdGgKICAgICAgICA8Y29kZT4mZ3Q7Jmd0OyZndDs8L2NvZGU+IChmb3IgUHl0aG9uKSBvciA8Y29kZT5JbiBbbnVtXTo8L2NvZGU+IChmb3IKICAgICAgICBJUHl0aG9uKS4KCiAgICAgICAgRnVydGhlciwgdGhlIDxjb2RlPnN0ZXg8L2NvZGU+IG1vZGUgd2lsbCBiZSB1c2VkIGZvciBoaWdobGlnaHRpbmcKICAgICAgICBibG9ja3MgY29udGFpbmluZyBMYVRleCBjb2RlLgogICAgPC9wPgoKICAgIDxwPjxzdHJvbmc+TUlNRSB0eXBlcyBkZWZpbmVkOjwvc3Ryb25nPiA8Y29kZT50ZXh0L3gtcnN0PC9jb2RlPi48L3A+CiAgPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/rst/rst.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSwgcmVxdWlyZSgiLi4vcHl0aG9uL3B5dGhvbiIpLCByZXF1aXJlKCIuLi9zdGV4L3N0ZXgiKSwgcmVxdWlyZSgiLi4vLi4vYWRkb24vbW9kZS9vdmVybGF5IikpOwogIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kKSAvLyBBTUQKICAgIGRlZmluZShbIi4uLy4uL2xpYi9jb2RlbWlycm9yIiwgIi4uL3B5dGhvbi9weXRob24iLCAiLi4vc3RleC9zdGV4IiwgIi4uLy4uL2FkZG9uL21vZGUvb3ZlcmxheSJdLCBtb2QpOwogIGVsc2UgLy8gUGxhaW4gYnJvd3NlciBlbnYKICAgIG1vZChDb2RlTWlycm9yKTsKfSkoZnVuY3Rpb24oQ29kZU1pcnJvcikgewoidXNlIHN0cmljdCI7CgpDb2RlTWlycm9yLmRlZmluZU1vZGUoJ3JzdCcsIGZ1bmN0aW9uIChjb25maWcsIG9wdGlvbnMpIHsKCiAgdmFyIHJ4X3N0cm9uZyA9IC9eXCpcKlteXCpcc10oPzpbXlwqXSpbXlwqXHNdKT9cKlwqLzsKICB2YXIgcnhfZW1waGFzaXMgPSAvXlwqW15cKlxzXSg/OlteXCpdKlteXCpcc10pP1wqLzsKICB2YXIgcnhfbGl0ZXJhbCA9IC9eYGBbXmBcc10oPzpbXmBdKlteYFxzXSlgYC87CgogIHZhciByeF9udW1iZXIgPSAvXig/OltcZF0rKD86W1wuLF1cZCspKikvOwogIHZhciByeF9wb3NpdGl2ZSA9IC9eKD86XHNcK1tcZF0rKD86W1wuLF1cZCspKikvOwogIHZhciByeF9uZWdhdGl2ZSA9IC9eKD86XHNcLVtcZF0rKD86W1wuLF1cZCspKikvOwoKICB2YXIgcnhfdXJpX3Byb3RvY29sID0gIltIaF1bVHRdW1R0XVtQcF1bU3NdPzovLyI7CiAgdmFyIHJ4X3VyaV9kb21haW4gPSAiKD86W1xcZFxcdy4tXSspXFwuKD86XFx3ezIsNn0pIjsKICB2YXIgcnhfdXJpX3BhdGggPSAiKD86L1tcXGRcXHdcXCNcXCVcXCZcXC1cXC5cXCxcXC9cXDpcXD1cXD9cXH5dKykqIjsKICB2YXIgcnhfdXJpID0gbmV3IFJlZ0V4cCgiXiIgKyByeF91cmlfcHJvdG9jb2wgKyByeF91cmlfZG9tYWluICsgcnhfdXJpX3BhdGgpOwoKICB2YXIgb3ZlcmxheSA9IHsKICAgIHRva2VuOiBmdW5jdGlvbiAoc3RyZWFtKSB7CgogICAgICBpZiAoc3RyZWFtLm1hdGNoKHJ4X3N0cm9uZykgJiYgc3RyZWFtLm1hdGNoICgvXFcrfCQvLCBmYWxzZSkpCiAgICAgICAgcmV0dXJuICdzdHJvbmcnOwogICAgICBpZiAoc3RyZWFtLm1hdGNoKHJ4X2VtcGhhc2lzKSAmJiBzdHJlYW0ubWF0Y2ggKC9cVyt8JC8sIGZhbHNlKSkKICAgICAgICByZXR1cm4gJ2VtJzsKICAgICAgaWYgKHN0cmVhbS5tYXRjaChyeF9saXRlcmFsKSAmJiBzdHJlYW0ubWF0Y2ggKC9cVyt8JC8sIGZhbHNlKSkKICAgICAgICByZXR1cm4gJ3N0cmluZy0yJzsKICAgICAgaWYgKHN0cmVhbS5tYXRjaChyeF9udW1iZXIpKQogICAgICAgIHJldHVybiAnbnVtYmVyJzsKICAgICAgaWYgKHN0cmVhbS5tYXRjaChyeF9wb3NpdGl2ZSkpCiAgICAgICAgcmV0dXJuICdwb3NpdGl2ZSc7CiAgICAgIGlmIChzdHJlYW0ubWF0Y2gocnhfbmVnYXRpdmUpKQogICAgICAgIHJldHVybiAnbmVnYXRpdmUnOwogICAgICBpZiAoc3RyZWFtLm1hdGNoKHJ4X3VyaSkpCiAgICAgICAgcmV0dXJuICdsaW5rJzsKCiAgICAgIHdoaWxlIChzdHJlYW0ubmV4dCgpICE9IG51bGwpIHsKICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKHJ4X3N0cm9uZywgZmFsc2UpKSBicmVhazsKICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKHJ4X2VtcGhhc2lzLCBmYWxzZSkpIGJyZWFrOwogICAgICAgIGlmIChzdHJlYW0ubWF0Y2gocnhfbGl0ZXJhbCwgZmFsc2UpKSBicmVhazsKICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKHJ4X251bWJlciwgZmFsc2UpKSBicmVhazsKICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKHJ4X3Bvc2l0aXZlLCBmYWxzZSkpIGJyZWFrOwogICAgICAgIGlmIChzdHJlYW0ubWF0Y2gocnhfbmVnYXRpdmUsIGZhbHNlKSkgYnJlYWs7CiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaChyeF91cmksIGZhbHNlKSkgYnJlYWs7CiAgICAgIH0KCiAgICAgIHJldHVybiBudWxsOwogICAgfQogIH07CgogIHZhciBtb2RlID0gQ29kZU1pcnJvci5nZXRNb2RlKAogICAgY29uZmlnLCBvcHRpb25zLmJhY2tkcm9wIHx8ICdyc3QtYmFzZScKICApOwoKICByZXR1cm4gQ29kZU1pcnJvci5vdmVybGF5TW9kZShtb2RlLCBvdmVybGF5LCB0cnVlKTsgLy8gY29tYmluZQp9LCAncHl0aG9uJywgJ3N0ZXgnKTsKCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCdyc3QtYmFzZScsIGZ1bmN0aW9uIChjb25maWcpIHsKCiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogIGZ1bmN0aW9uIGZvcm1hdChzdHJpbmcpIHsKICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgveyhcZCspfS9nLCBmdW5jdGlvbiAobWF0Y2gsIG4pIHsKICAgICAgcmV0dXJuIHR5cGVvZiBhcmdzW25dICE9ICd1bmRlZmluZWQnID8gYXJnc1tuXSA6IG1hdGNoOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBBc3NlcnRFeGNlcHRpb24obWVzc2FnZSkgewogICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKICB9CgogIEFzc2VydEV4Y2VwdGlvbi5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7CiAgICByZXR1cm4gJ0Fzc2VydEV4Y2VwdGlvbjogJyArIHRoaXMubWVzc2FnZTsKICB9OwoKICBmdW5jdGlvbiBhc3NlcnQoZXhwcmVzc2lvbiwgbWVzc2FnZSkgewogICAgaWYgKCFleHByZXNzaW9uKSB0aHJvdyBuZXcgQXNzZXJ0RXhjZXB0aW9uKG1lc3NhZ2UpOwogICAgcmV0dXJuIGV4cHJlc3Npb247CiAgfQoKICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgdmFyIG1vZGVfcHl0aG9uID0gQ29kZU1pcnJvci5nZXRNb2RlKGNvbmZpZywgJ3B5dGhvbicpOwogIHZhciBtb2RlX3N0ZXggPSBDb2RlTWlycm9yLmdldE1vZGUoY29uZmlnLCAnc3RleCcpOwoKICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgdmFyIFNFUEEgPSAiXFxzKyI7CiAgdmFyIFRBSUwgPSAiKD86XFxzKnxcXFd8JCkiLAogIHJ4X1RBSUwgPSBuZXcgUmVnRXhwKGZvcm1hdCgnXnswfScsIFRBSUwpKTsKCiAgdmFyIE5BTUUgPQogICAgIig/OlteXFxXXFxkX10oPzpbXFx3IVwiIyQlJicoKVxcKlxcKyxcXC1cXC5cLzo7PD0+XFw/XSpbXlxcV19dKT8pIiwKICByeF9OQU1FID0gbmV3IFJlZ0V4cChmb3JtYXQoJ157MH0nLCBOQU1FKSk7CiAgdmFyIE5BTUVfV1dTID0KICAgICIoPzpbXlxcV1xcZF9dKD86W1xcd1xccyFcIiMkJSYnKClcXCpcXCssXFwtXFwuXC86Ozw9PlxcP10qW15cXFdfXSk/KSI7CiAgdmFyIFJFRl9OQU1FID0gZm9ybWF0KCcoPzp7MH18YHsxfWApJywgTkFNRSwgTkFNRV9XV1MpOwoKICB2YXIgVEVYVDEgPSAiKD86W15cXHNcXHxdKD86W15cXHxdKlteXFxzXFx8XSk/KSI7CiAgdmFyIFRFWFQyID0gIig/OlteXFxgXSspIiwKICByeF9URVhUMiA9IG5ldyBSZWdFeHAoZm9ybWF0KCdeezB9JywgVEVYVDIpKTsKCiAgdmFyIHJ4X3NlY3Rpb24gPSBuZXcgUmVnRXhwKAogICAgIl4oWyEnIyQlJlwiKCkqKywtLi86Ozw9Pj9AXFxbXFxcXFxcXV5fYHt8fX5dKVxcMXszLH1cXHMqJCIpOwogIHZhciByeF9leHBsaWNpdCA9IG5ldyBSZWdFeHAoCiAgICBmb3JtYXQoJ15cXC5cXC57MH0nLCBTRVBBKSk7CiAgdmFyIHJ4X2xpbmsgPSBuZXcgUmVnRXhwKAogICAgZm9ybWF0KCdeX3swfTp7MX18Xl9fOnsxfScsIFJFRl9OQU1FLCBUQUlMKSk7CiAgdmFyIHJ4X2RpcmVjdGl2ZSA9IG5ldyBSZWdFeHAoCiAgICBmb3JtYXQoJ157MH06OnsxfScsIFJFRl9OQU1FLCBUQUlMKSk7CiAgdmFyIHJ4X3N1YnN0aXR1dGlvbiA9IG5ldyBSZWdFeHAoCiAgICBmb3JtYXQoJ15cXHx7MH1cXHx7MX17Mn06OnszfScsIFRFWFQxLCBTRVBBLCBSRUZfTkFNRSwgVEFJTCkpOwogIHZhciByeF9mb290bm90ZSA9IG5ldyBSZWdFeHAoCiAgICBmb3JtYXQoJ15cXFsoPzpcXGQrfCN7MH0/fFxcKildezF9JywgUkVGX05BTUUsIFRBSUwpKTsKICB2YXIgcnhfY2l0YXRpb24gPSBuZXcgUmVnRXhwKAogICAgZm9ybWF0KCdeXFxbezB9XFxdezF9JywgUkVGX05BTUUsIFRBSUwpKTsKCiAgdmFyIHJ4X3N1YnN0aXR1dGlvbl9yZWYgPSBuZXcgUmVnRXhwKAogICAgZm9ybWF0KCdeXFx8ezB9XFx8JywgVEVYVDEpKTsKICB2YXIgcnhfZm9vdG5vdGVfcmVmID0gbmV3IFJlZ0V4cCgKICAgIGZvcm1hdCgnXlxcWyg/OlxcZCt8I3swfT98XFwqKV1fJywgUkVGX05BTUUpKTsKICB2YXIgcnhfY2l0YXRpb25fcmVmID0gbmV3IFJlZ0V4cCgKICAgIGZvcm1hdCgnXlxcW3swfVxcXV8nLCBSRUZfTkFNRSkpOwogIHZhciByeF9saW5rX3JlZjEgPSBuZXcgUmVnRXhwKAogICAgZm9ybWF0KCdeezB9X18/JywgUkVGX05BTUUpKTsKICB2YXIgcnhfbGlua19yZWYyID0gbmV3IFJlZ0V4cCgKICAgIGZvcm1hdCgnXmB7MH1gXycsIFRFWFQyKSk7CgogIHZhciByeF9yb2xlX3ByZSA9IG5ldyBSZWdFeHAoCiAgICBmb3JtYXQoJ146ezB9OmB7MX1gezJ9JywgTkFNRSwgVEVYVDIsIFRBSUwpKTsKICB2YXIgcnhfcm9sZV9zdWYgPSBuZXcgUmVnRXhwKAogICAgZm9ybWF0KCdeYHsxfWA6ezB9OnsyfScsIE5BTUUsIFRFWFQyLCBUQUlMKSk7CiAgdmFyIHJ4X3JvbGUgPSBuZXcgUmVnRXhwKAogICAgZm9ybWF0KCdeOnswfTp7MX0nLCBOQU1FLCBUQUlMKSk7CgogIHZhciByeF9kaXJlY3RpdmVfbmFtZSA9IG5ldyBSZWdFeHAoZm9ybWF0KCdeezB9JywgUkVGX05BTUUpKTsKICB2YXIgcnhfZGlyZWN0aXZlX3RhaWwgPSBuZXcgUmVnRXhwKGZvcm1hdCgnXjo6ezB9JywgVEFJTCkpOwogIHZhciByeF9zdWJzdGl0dXRpb25fdGV4dCA9IG5ldyBSZWdFeHAoZm9ybWF0KCdeXFx8ezB9XFx8JywgVEVYVDEpKTsKICB2YXIgcnhfc3Vic3RpdHV0aW9uX3NlcGEgPSBuZXcgUmVnRXhwKGZvcm1hdCgnXnswfScsIFNFUEEpKTsKICB2YXIgcnhfc3Vic3RpdHV0aW9uX25hbWUgPSBuZXcgUmVnRXhwKGZvcm1hdCgnXnswfScsIFJFRl9OQU1FKSk7CiAgdmFyIHJ4X3N1YnN0aXR1dGlvbl90YWlsID0gbmV3IFJlZ0V4cChmb3JtYXQoJ146OnswfScsIFRBSUwpKTsKICB2YXIgcnhfbGlua19oZWFkID0gbmV3IFJlZ0V4cCgiXl8iKTsKICB2YXIgcnhfbGlua19uYW1lID0gbmV3IFJlZ0V4cChmb3JtYXQoJ157MH18XycsIFJFRl9OQU1FKSk7CiAgdmFyIHJ4X2xpbmtfdGFpbCA9IG5ldyBSZWdFeHAoZm9ybWF0KCdeOnswfScsIFRBSUwpKTsKCiAgdmFyIHJ4X3ZlcmJhdGltID0gbmV3IFJlZ0V4cCgnXjo6XFxzKiQnKTsKICB2YXIgcnhfZXhhbXBsZXMgPSBuZXcgUmVnRXhwKCdeXFxzKyg/Oj4+PnxJbiBcXFtcXGQrXFxdOilcXHMnKTsKCiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogIGZ1bmN0aW9uIHRvX25vcm1hbChzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgdG9rZW4gPSBudWxsOwoKICAgIGlmIChzdHJlYW0uc29sKCkgJiYgc3RyZWFtLm1hdGNoKHJ4X2V4YW1wbGVzLCBmYWxzZSkpIHsKICAgICAgY2hhbmdlKHN0YXRlLCB0b19tb2RlLCB7CiAgICAgICAgbW9kZTogbW9kZV9weXRob24sIGxvY2FsOiBDb2RlTWlycm9yLnN0YXJ0U3RhdGUobW9kZV9weXRob24pCiAgICAgIH0pOwogICAgfSBlbHNlIGlmIChzdHJlYW0uc29sKCkgJiYgc3RyZWFtLm1hdGNoKHJ4X2V4cGxpY2l0KSkgewogICAgICBjaGFuZ2Uoc3RhdGUsIHRvX2V4cGxpY2l0KTsKICAgICAgdG9rZW4gPSAnbWV0YSc7CiAgICB9IGVsc2UgaWYgKHN0cmVhbS5zb2woKSAmJiBzdHJlYW0ubWF0Y2gocnhfc2VjdGlvbikpIHsKICAgICAgY2hhbmdlKHN0YXRlLCB0b19ub3JtYWwpOwogICAgICB0b2tlbiA9ICdoZWFkZXInOwogICAgfSBlbHNlIGlmIChwaGFzZShzdGF0ZSkgPT0gcnhfcm9sZV9wcmUgfHwKICAgICAgICAgICAgICAgc3RyZWFtLm1hdGNoKHJ4X3JvbGVfcHJlLCBmYWxzZSkpIHsKCiAgICAgIHN3aXRjaCAoc3RhZ2Uoc3RhdGUpKSB7CiAgICAgIGNhc2UgMDoKICAgICAgICBjaGFuZ2Uoc3RhdGUsIHRvX25vcm1hbCwgY29udGV4dChyeF9yb2xlX3ByZSwgMSkpOwogICAgICAgIGFzc2VydChzdHJlYW0ubWF0Y2goL146LykpOwogICAgICAgIHRva2VuID0gJ21ldGEnOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDE6CiAgICAgICAgY2hhbmdlKHN0YXRlLCB0b19ub3JtYWwsIGNvbnRleHQocnhfcm9sZV9wcmUsIDIpKTsKICAgICAgICBhc3NlcnQoc3RyZWFtLm1hdGNoKHJ4X05BTUUpKTsKICAgICAgICB0b2tlbiA9ICdrZXl3b3JkJzsKCiAgICAgICAgaWYgKHN0cmVhbS5jdXJyZW50KCkubWF0Y2goL14oPzptYXRofGxhdGV4KS8pKSB7CiAgICAgICAgICBzdGF0ZS50bXBfc3RleCA9IHRydWU7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDI6CiAgICAgICAgY2hhbmdlKHN0YXRlLCB0b19ub3JtYWwsIGNvbnRleHQocnhfcm9sZV9wcmUsIDMpKTsKICAgICAgICBhc3NlcnQoc3RyZWFtLm1hdGNoKC9eOmAvKSk7CiAgICAgICAgdG9rZW4gPSAnbWV0YSc7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgMzoKICAgICAgICBpZiAoc3RhdGUudG1wX3N0ZXgpIHsKICAgICAgICAgIHN0YXRlLnRtcF9zdGV4ID0gdW5kZWZpbmVkOyBzdGF0ZS50bXAgPSB7CiAgICAgICAgICAgIG1vZGU6IG1vZGVfc3RleCwgbG9jYWw6IENvZGVNaXJyb3Iuc3RhcnRTdGF0ZShtb2RlX3N0ZXgpCiAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgaWYgKHN0YXRlLnRtcCkgewogICAgICAgICAgaWYgKHN0cmVhbS5wZWVrKCkgPT0gJ2AnKSB7CiAgICAgICAgICAgIGNoYW5nZShzdGF0ZSwgdG9fbm9ybWFsLCBjb250ZXh0KHJ4X3JvbGVfcHJlLCA0KSk7CiAgICAgICAgICAgIHN0YXRlLnRtcCA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CgogICAgICAgICAgdG9rZW4gPSBzdGF0ZS50bXAubW9kZS50b2tlbihzdHJlYW0sIHN0YXRlLnRtcC5sb2NhbCk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIGNoYW5nZShzdGF0ZSwgdG9fbm9ybWFsLCBjb250ZXh0KHJ4X3JvbGVfcHJlLCA0KSk7CiAgICAgICAgYXNzZXJ0KHN0cmVhbS5tYXRjaChyeF9URVhUMikpOwogICAgICAgIHRva2VuID0gJ3N0cmluZyc7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgNDoKICAgICAgICBjaGFuZ2Uoc3RhdGUsIHRvX25vcm1hbCwgY29udGV4dChyeF9yb2xlX3ByZSwgNSkpOwogICAgICAgIGFzc2VydChzdHJlYW0ubWF0Y2goL15gLykpOwogICAgICAgIHRva2VuID0gJ21ldGEnOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDU6CiAgICAgICAgY2hhbmdlKHN0YXRlLCB0b19ub3JtYWwsIGNvbnRleHQocnhfcm9sZV9wcmUsIDYpKTsKICAgICAgICBhc3NlcnQoc3RyZWFtLm1hdGNoKHJ4X1RBSUwpKTsKICAgICAgICBicmVhazsKICAgICAgZGVmYXVsdDoKICAgICAgICBjaGFuZ2Uoc3RhdGUsIHRvX25vcm1hbCk7CiAgICAgICAgYXNzZXJ0KHN0cmVhbS5jdXJyZW50KCkgPT0gJycpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKHBoYXNlKHN0YXRlKSA9PSByeF9yb2xlX3N1ZiB8fAogICAgICAgICAgICAgICBzdHJlYW0ubWF0Y2gocnhfcm9sZV9zdWYsIGZhbHNlKSkgewoKICAgICAgc3dpdGNoIChzdGFnZShzdGF0ZSkpIHsKICAgICAgY2FzZSAwOgogICAgICAgIGNoYW5nZShzdGF0ZSwgdG9fbm9ybWFsLCBjb250ZXh0KHJ4X3JvbGVfc3VmLCAxKSk7CiAgICAgICAgYXNzZXJ0KHN0cmVhbS5tYXRjaCgvXmAvKSk7CiAgICAgICAgdG9rZW4gPSAnbWV0YSc7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgMToKICAgICAgICBjaGFuZ2Uoc3RhdGUsIHRvX25vcm1hbCwgY29udGV4dChyeF9yb2xlX3N1ZiwgMikpOwogICAgICAgIGFzc2VydChzdHJlYW0ubWF0Y2gocnhfVEVYVDIpKTsKICAgICAgICB0b2tlbiA9ICdzdHJpbmcnOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDI6CiAgICAgICAgY2hhbmdlKHN0YXRlLCB0b19ub3JtYWwsIGNvbnRleHQocnhfcm9sZV9zdWYsIDMpKTsKICAgICAgICBhc3NlcnQoc3RyZWFtLm1hdGNoKC9eYDovKSk7CiAgICAgICAgdG9rZW4gPSAnbWV0YSc7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgMzoKICAgICAgICBjaGFuZ2Uoc3RhdGUsIHRvX25vcm1hbCwgY29udGV4dChyeF9yb2xlX3N1ZiwgNCkpOwogICAgICAgIGFzc2VydChzdHJlYW0ubWF0Y2gocnhfTkFNRSkpOwogICAgICAgIHRva2VuID0gJ2tleXdvcmQnOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDQ6CiAgICAgICAgY2hhbmdlKHN0YXRlLCB0b19ub3JtYWwsIGNvbnRleHQocnhfcm9sZV9zdWYsIDUpKTsKICAgICAgICBhc3NlcnQoc3RyZWFtLm1hdGNoKC9eOi8pKTsKICAgICAgICB0b2tlbiA9ICdtZXRhJzsKICAgICAgICBicmVhazsKICAgICAgY2FzZSA1OgogICAgICAgIGNoYW5nZShzdGF0ZSwgdG9fbm9ybWFsLCBjb250ZXh0KHJ4X3JvbGVfc3VmLCA2KSk7CiAgICAgICAgYXNzZXJ0KHN0cmVhbS5tYXRjaChyeF9UQUlMKSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgY2hhbmdlKHN0YXRlLCB0b19ub3JtYWwpOwogICAgICAgIGFzc2VydChzdHJlYW0uY3VycmVudCgpID09ICcnKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChwaGFzZShzdGF0ZSkgPT0gcnhfcm9sZSB8fCBzdHJlYW0ubWF0Y2gocnhfcm9sZSwgZmFsc2UpKSB7CgogICAgICBzd2l0Y2ggKHN0YWdlKHN0YXRlKSkgewogICAgICBjYXNlIDA6CiAgICAgICAgY2hhbmdlKHN0YXRlLCB0b19ub3JtYWwsIGNvbnRleHQocnhfcm9sZSwgMSkpOwogICAgICAgIGFzc2VydChzdHJlYW0ubWF0Y2goL146LykpOwogICAgICAgIHRva2VuID0gJ21ldGEnOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDE6CiAgICAgICAgY2hhbmdlKHN0YXRlLCB0b19ub3JtYWwsIGNvbnRleHQocnhfcm9sZSwgMikpOwogICAgICAgIGFzc2VydChzdHJlYW0ubWF0Y2gocnhfTkFNRSkpOwogICAgICAgIHRva2VuID0gJ2tleXdvcmQnOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDI6CiAgICAgICAgY2hhbmdlKHN0YXRlLCB0b19ub3JtYWwsIGNvbnRleHQocnhfcm9sZSwgMykpOwogICAgICAgIGFzc2VydChzdHJlYW0ubWF0Y2goL146LykpOwogICAgICAgIHRva2VuID0gJ21ldGEnOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDM6CiAgICAgICAgY2hhbmdlKHN0YXRlLCB0b19ub3JtYWwsIGNvbnRleHQocnhfcm9sZSwgNCkpOwogICAgICAgIGFzc2VydChzdHJlYW0ubWF0Y2gocnhfVEFJTCkpOwogICAgICAgIGJyZWFrOwogICAgICBkZWZhdWx0OgogICAgICAgIGNoYW5nZShzdGF0ZSwgdG9fbm9ybWFsKTsKICAgICAgICBhc3NlcnQoc3RyZWFtLmN1cnJlbnQoKSA9PSAnJyk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAocGhhc2Uoc3RhdGUpID09IHJ4X3N1YnN0aXR1dGlvbl9yZWYgfHwKICAgICAgICAgICAgICAgc3RyZWFtLm1hdGNoKHJ4X3N1YnN0aXR1dGlvbl9yZWYsIGZhbHNlKSkgewoKICAgICAgc3dpdGNoIChzdGFnZShzdGF0ZSkpIHsKICAgICAgY2FzZSAwOgogICAgICAgIGNoYW5nZShzdGF0ZSwgdG9fbm9ybWFsLCBjb250ZXh0KHJ4X3N1YnN0aXR1dGlvbl9yZWYsIDEpKTsKICAgICAgICBhc3NlcnQoc3RyZWFtLm1hdGNoKHJ4X3N1YnN0aXR1dGlvbl90ZXh0KSk7CiAgICAgICAgdG9rZW4gPSAndmFyaWFibGUtMic7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgMToKICAgICAgICBjaGFuZ2Uoc3RhdGUsIHRvX25vcm1hbCwgY29udGV4dChyeF9zdWJzdGl0dXRpb25fcmVmLCAyKSk7CiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXl8/Xz8vKSkgdG9rZW4gPSAnbGluayc7CiAgICAgICAgYnJlYWs7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgY2hhbmdlKHN0YXRlLCB0b19ub3JtYWwpOwogICAgICAgIGFzc2VydChzdHJlYW0uY3VycmVudCgpID09ICcnKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChzdHJlYW0ubWF0Y2gocnhfZm9vdG5vdGVfcmVmKSkgewogICAgICBjaGFuZ2Uoc3RhdGUsIHRvX25vcm1hbCk7CiAgICAgIHRva2VuID0gJ3F1b3RlJzsKICAgIH0gZWxzZSBpZiAoc3RyZWFtLm1hdGNoKHJ4X2NpdGF0aW9uX3JlZikpIHsKICAgICAgY2hhbmdlKHN0YXRlLCB0b19ub3JtYWwpOwogICAgICB0b2tlbiA9ICdxdW90ZSc7CiAgICB9IGVsc2UgaWYgKHN0cmVhbS5tYXRjaChyeF9saW5rX3JlZjEpKSB7CiAgICAgIGNoYW5nZShzdGF0ZSwgdG9fbm9ybWFsKTsKICAgICAgaWYgKCFzdHJlYW0ucGVlaygpIHx8IHN0cmVhbS5wZWVrKCkubWF0Y2goL15cVyQvKSkgewogICAgICAgIHRva2VuID0gJ2xpbmsnOwogICAgICB9CiAgICB9IGVsc2UgaWYgKHBoYXNlKHN0YXRlKSA9PSByeF9saW5rX3JlZjIgfHwKICAgICAgICAgICAgICAgc3RyZWFtLm1hdGNoKHJ4X2xpbmtfcmVmMiwgZmFsc2UpKSB7CgogICAgICBzd2l0Y2ggKHN0YWdlKHN0YXRlKSkgewogICAgICBjYXNlIDA6CiAgICAgICAgaWYgKCFzdHJlYW0ucGVlaygpIHx8IHN0cmVhbS5wZWVrKCkubWF0Y2goL15cVyQvKSkgewogICAgICAgICAgY2hhbmdlKHN0YXRlLCB0b19ub3JtYWwsIGNvbnRleHQocnhfbGlua19yZWYyLCAxKSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHN0cmVhbS5tYXRjaChyeF9saW5rX3JlZjIpOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSAxOgogICAgICAgIGNoYW5nZShzdGF0ZSwgdG9fbm9ybWFsLCBjb250ZXh0KHJ4X2xpbmtfcmVmMiwgMikpOwogICAgICAgIGFzc2VydChzdHJlYW0ubWF0Y2goL15gLykpOwogICAgICAgIHRva2VuID0gJ2xpbmsnOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDI6CiAgICAgICAgY2hhbmdlKHN0YXRlLCB0b19ub3JtYWwsIGNvbnRleHQocnhfbGlua19yZWYyLCAzKSk7CiAgICAgICAgYXNzZXJ0KHN0cmVhbS5tYXRjaChyeF9URVhUMikpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDM6CiAgICAgICAgY2hhbmdlKHN0YXRlLCB0b19ub3JtYWwsIGNvbnRleHQocnhfbGlua19yZWYyLCA0KSk7CiAgICAgICAgYXNzZXJ0KHN0cmVhbS5tYXRjaCgvXmBfLykpOwogICAgICAgIHRva2VuID0gJ2xpbmsnOwogICAgICAgIGJyZWFrOwogICAgICBkZWZhdWx0OgogICAgICAgIGNoYW5nZShzdGF0ZSwgdG9fbm9ybWFsKTsKICAgICAgICBhc3NlcnQoc3RyZWFtLmN1cnJlbnQoKSA9PSAnJyk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoc3RyZWFtLm1hdGNoKHJ4X3ZlcmJhdGltKSkgewogICAgICBjaGFuZ2Uoc3RhdGUsIHRvX3ZlcmJhdGltKTsKICAgIH0KCiAgICBlbHNlIHsKICAgICAgaWYgKHN0cmVhbS5uZXh0KCkpIGNoYW5nZShzdGF0ZSwgdG9fbm9ybWFsKTsKICAgIH0KCiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgZnVuY3Rpb24gdG9fZXhwbGljaXQoc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIHRva2VuID0gbnVsbDsKCiAgICBpZiAocGhhc2Uoc3RhdGUpID09IHJ4X3N1YnN0aXR1dGlvbiB8fAogICAgICAgIHN0cmVhbS5tYXRjaChyeF9zdWJzdGl0dXRpb24sIGZhbHNlKSkgewoKICAgICAgc3dpdGNoIChzdGFnZShzdGF0ZSkpIHsKICAgICAgY2FzZSAwOgogICAgICAgIGNoYW5nZShzdGF0ZSwgdG9fZXhwbGljaXQsIGNvbnRleHQocnhfc3Vic3RpdHV0aW9uLCAxKSk7CiAgICAgICAgYXNzZXJ0KHN0cmVhbS5tYXRjaChyeF9zdWJzdGl0dXRpb25fdGV4dCkpOwogICAgICAgIHRva2VuID0gJ3ZhcmlhYmxlLTInOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDE6CiAgICAgICAgY2hhbmdlKHN0YXRlLCB0b19leHBsaWNpdCwgY29udGV4dChyeF9zdWJzdGl0dXRpb24sIDIpKTsKICAgICAgICBhc3NlcnQoc3RyZWFtLm1hdGNoKHJ4X3N1YnN0aXR1dGlvbl9zZXBhKSk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgMjoKICAgICAgICBjaGFuZ2Uoc3RhdGUsIHRvX2V4cGxpY2l0LCBjb250ZXh0KHJ4X3N1YnN0aXR1dGlvbiwgMykpOwogICAgICAgIGFzc2VydChzdHJlYW0ubWF0Y2gocnhfc3Vic3RpdHV0aW9uX25hbWUpKTsKICAgICAgICB0b2tlbiA9ICdrZXl3b3JkJzsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAzOgogICAgICAgIGNoYW5nZShzdGF0ZSwgdG9fZXhwbGljaXQsIGNvbnRleHQocnhfc3Vic3RpdHV0aW9uLCA0KSk7CiAgICAgICAgYXNzZXJ0KHN0cmVhbS5tYXRjaChyeF9zdWJzdGl0dXRpb25fdGFpbCkpOwogICAgICAgIHRva2VuID0gJ21ldGEnOwogICAgICAgIGJyZWFrOwogICAgICBkZWZhdWx0OgogICAgICAgIGNoYW5nZShzdGF0ZSwgdG9fbm9ybWFsKTsKICAgICAgICBhc3NlcnQoc3RyZWFtLmN1cnJlbnQoKSA9PSAnJyk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAocGhhc2Uoc3RhdGUpID09IHJ4X2RpcmVjdGl2ZSB8fAogICAgICAgICAgICAgICBzdHJlYW0ubWF0Y2gocnhfZGlyZWN0aXZlLCBmYWxzZSkpIHsKCiAgICAgIHN3aXRjaCAoc3RhZ2Uoc3RhdGUpKSB7CiAgICAgIGNhc2UgMDoKICAgICAgICBjaGFuZ2Uoc3RhdGUsIHRvX2V4cGxpY2l0LCBjb250ZXh0KHJ4X2RpcmVjdGl2ZSwgMSkpOwogICAgICAgIGFzc2VydChzdHJlYW0ubWF0Y2gocnhfZGlyZWN0aXZlX25hbWUpKTsKICAgICAgICB0b2tlbiA9ICdrZXl3b3JkJzsKCiAgICAgICAgaWYgKHN0cmVhbS5jdXJyZW50KCkubWF0Y2goL14oPzptYXRofGxhdGV4KS8pKQogICAgICAgICAgc3RhdGUudG1wX3N0ZXggPSB0cnVlOwogICAgICAgIGVsc2UgaWYgKHN0cmVhbS5jdXJyZW50KCkubWF0Y2goL15weXRob24vKSkKICAgICAgICAgIHN0YXRlLnRtcF9weSA9IHRydWU7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgMToKICAgICAgICBjaGFuZ2Uoc3RhdGUsIHRvX2V4cGxpY2l0LCBjb250ZXh0KHJ4X2RpcmVjdGl2ZSwgMikpOwogICAgICAgIGFzc2VydChzdHJlYW0ubWF0Y2gocnhfZGlyZWN0aXZlX3RhaWwpKTsKICAgICAgICB0b2tlbiA9ICdtZXRhJzsKCiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXmxhdGV4XHMqJC8pIHx8IHN0YXRlLnRtcF9zdGV4KSB7CiAgICAgICAgICBzdGF0ZS50bXBfc3RleCA9IHVuZGVmaW5lZDsgY2hhbmdlKHN0YXRlLCB0b19tb2RlLCB7CiAgICAgICAgICAgIG1vZGU6IG1vZGVfc3RleCwgbG9jYWw6IENvZGVNaXJyb3Iuc3RhcnRTdGF0ZShtb2RlX3N0ZXgpCiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgMjoKICAgICAgICBjaGFuZ2Uoc3RhdGUsIHRvX2V4cGxpY2l0LCBjb250ZXh0KHJ4X2RpcmVjdGl2ZSwgMykpOwogICAgICAgIGlmIChzdHJlYW0ubWF0Y2goL15weXRob25ccyokLykgfHwgc3RhdGUudG1wX3B5KSB7CiAgICAgICAgICBzdGF0ZS50bXBfcHkgPSB1bmRlZmluZWQ7IGNoYW5nZShzdGF0ZSwgdG9fbW9kZSwgewogICAgICAgICAgICBtb2RlOiBtb2RlX3B5dGhvbiwgbG9jYWw6IENvZGVNaXJyb3Iuc3RhcnRTdGF0ZShtb2RlX3B5dGhvbikKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgZGVmYXVsdDoKICAgICAgICBjaGFuZ2Uoc3RhdGUsIHRvX25vcm1hbCk7CiAgICAgICAgYXNzZXJ0KHN0cmVhbS5jdXJyZW50KCkgPT0gJycpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKHBoYXNlKHN0YXRlKSA9PSByeF9saW5rIHx8IHN0cmVhbS5tYXRjaChyeF9saW5rLCBmYWxzZSkpIHsKCiAgICAgIHN3aXRjaCAoc3RhZ2Uoc3RhdGUpKSB7CiAgICAgIGNhc2UgMDoKICAgICAgICBjaGFuZ2Uoc3RhdGUsIHRvX2V4cGxpY2l0LCBjb250ZXh0KHJ4X2xpbmssIDEpKTsKICAgICAgICBhc3NlcnQoc3RyZWFtLm1hdGNoKHJ4X2xpbmtfaGVhZCkpOwogICAgICAgIGFzc2VydChzdHJlYW0ubWF0Y2gocnhfbGlua19uYW1lKSk7CiAgICAgICAgdG9rZW4gPSAnbGluayc7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgMToKICAgICAgICBjaGFuZ2Uoc3RhdGUsIHRvX2V4cGxpY2l0LCBjb250ZXh0KHJ4X2xpbmssIDIpKTsKICAgICAgICBhc3NlcnQoc3RyZWFtLm1hdGNoKHJ4X2xpbmtfdGFpbCkpOwogICAgICAgIHRva2VuID0gJ21ldGEnOwogICAgICAgIGJyZWFrOwogICAgICBkZWZhdWx0OgogICAgICAgIGNoYW5nZShzdGF0ZSwgdG9fbm9ybWFsKTsKICAgICAgICBhc3NlcnQoc3RyZWFtLmN1cnJlbnQoKSA9PSAnJyk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoc3RyZWFtLm1hdGNoKHJ4X2Zvb3Rub3RlKSkgewogICAgICBjaGFuZ2Uoc3RhdGUsIHRvX25vcm1hbCk7CiAgICAgIHRva2VuID0gJ3F1b3RlJzsKICAgIH0gZWxzZSBpZiAoc3RyZWFtLm1hdGNoKHJ4X2NpdGF0aW9uKSkgewogICAgICBjaGFuZ2Uoc3RhdGUsIHRvX25vcm1hbCk7CiAgICAgIHRva2VuID0gJ3F1b3RlJzsKICAgIH0KCiAgICBlbHNlIHsKICAgICAgc3RyZWFtLmVhdFNwYWNlKCk7CiAgICAgIGlmIChzdHJlYW0uZW9sKCkpIHsKICAgICAgICBjaGFuZ2Uoc3RhdGUsIHRvX25vcm1hbCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICAgIGNoYW5nZShzdGF0ZSwgdG9fY29tbWVudCk7CiAgICAgICAgdG9rZW4gPSAnY29tbWVudCc7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgZnVuY3Rpb24gdG9fY29tbWVudChzdHJlYW0sIHN0YXRlKSB7CiAgICByZXR1cm4gYXNfYmxvY2soc3RyZWFtLCBzdGF0ZSwgJ2NvbW1lbnQnKTsKICB9CgogIGZ1bmN0aW9uIHRvX3ZlcmJhdGltKHN0cmVhbSwgc3RhdGUpIHsKICAgIHJldHVybiBhc19ibG9jayhzdHJlYW0sIHN0YXRlLCAnbWV0YScpOwogIH0KCiAgZnVuY3Rpb24gYXNfYmxvY2soc3RyZWFtLCBzdGF0ZSwgdG9rZW4pIHsKICAgIGlmIChzdHJlYW0uZW9sKCkgfHwgc3RyZWFtLmVhdFNwYWNlKCkpIHsKICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICByZXR1cm4gdG9rZW47CiAgICB9IGVsc2UgewogICAgICBjaGFuZ2Uoc3RhdGUsIHRvX25vcm1hbCk7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogIH0KCiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogIGZ1bmN0aW9uIHRvX21vZGUoc3RyZWFtLCBzdGF0ZSkgewoKICAgIGlmIChzdGF0ZS5jdHgubW9kZSAmJiBzdGF0ZS5jdHgubG9jYWwpIHsKCiAgICAgIGlmIChzdHJlYW0uc29sKCkpIHsKICAgICAgICBpZiAoIXN0cmVhbS5lYXRTcGFjZSgpKSBjaGFuZ2Uoc3RhdGUsIHRvX25vcm1hbCk7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KCiAgICAgIHJldHVybiBzdGF0ZS5jdHgubW9kZS50b2tlbihzdHJlYW0sIHN0YXRlLmN0eC5sb2NhbCk7CiAgICB9CgogICAgY2hhbmdlKHN0YXRlLCB0b19ub3JtYWwpOwogICAgcmV0dXJuIG51bGw7CiAgfQoKICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgZnVuY3Rpb24gY29udGV4dChwaGFzZSwgc3RhZ2UsIG1vZGUsIGxvY2FsKSB7CiAgICByZXR1cm4ge3BoYXNlOiBwaGFzZSwgc3RhZ2U6IHN0YWdlLCBtb2RlOiBtb2RlLCBsb2NhbDogbG9jYWx9OwogIH0KCiAgZnVuY3Rpb24gY2hhbmdlKHN0YXRlLCB0b2ssIGN0eCkgewogICAgc3RhdGUudG9rID0gdG9rOwogICAgc3RhdGUuY3R4ID0gY3R4IHx8IHt9OwogIH0KCiAgZnVuY3Rpb24gc3RhZ2Uoc3RhdGUpIHsKICAgIHJldHVybiBzdGF0ZS5jdHguc3RhZ2UgfHwgMDsKICB9CgogIGZ1bmN0aW9uIHBoYXNlKHN0YXRlKSB7CiAgICByZXR1cm4gc3RhdGUuY3R4LnBoYXNlOwogIH0KCiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogIHJldHVybiB7CiAgICBzdGFydFN0YXRlOiBmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiB7dG9rOiB0b19ub3JtYWwsIGN0eDogY29udGV4dCh1bmRlZmluZWQsIDApfTsKICAgIH0sCgogICAgY29weVN0YXRlOiBmdW5jdGlvbiAoc3RhdGUpIHsKICAgICAgdmFyIGN0eCA9IHN0YXRlLmN0eCwgdG1wID0gc3RhdGUudG1wOwogICAgICBpZiAoY3R4LmxvY2FsKQogICAgICAgIGN0eCA9IHttb2RlOiBjdHgubW9kZSwgbG9jYWw6IENvZGVNaXJyb3IuY29weVN0YXRlKGN0eC5tb2RlLCBjdHgubG9jYWwpfTsKICAgICAgaWYgKHRtcCkKICAgICAgICB0bXAgPSB7bW9kZTogdG1wLm1vZGUsIGxvY2FsOiBDb2RlTWlycm9yLmNvcHlTdGF0ZSh0bXAubW9kZSwgdG1wLmxvY2FsKX07CiAgICAgIHJldHVybiB7dG9rOiBzdGF0ZS50b2ssIGN0eDogY3R4LCB0bXA6IHRtcH07CiAgICB9LAoKICAgIGlubmVyTW9kZTogZnVuY3Rpb24gKHN0YXRlKSB7CiAgICAgIHJldHVybiBzdGF0ZS50bXAgICAgICA/IHtzdGF0ZTogc3RhdGUudG1wLmxvY2FsLCBtb2RlOiBzdGF0ZS50bXAubW9kZX0KICAgICAgOiBzdGF0ZS5jdHgubW9kZSA/IHtzdGF0ZTogc3RhdGUuY3R4LmxvY2FsLCBtb2RlOiBzdGF0ZS5jdHgubW9kZX0KICAgICAgOiBudWxsOwogICAgfSwKCiAgICB0b2tlbjogZnVuY3Rpb24gKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgcmV0dXJuIHN0YXRlLnRvayhzdHJlYW0sIHN0YXRlKTsKICAgIH0KICB9Owp9LCAncHl0aG9uJywgJ3N0ZXgnKTsKCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCd0ZXh0L3gtcnN0JywgJ3JzdCcpOwoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/ruby/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/ruby/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogUnVieSBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uLy4uL2FkZG9uL2VkaXQvbWF0Y2hicmFja2V0cy5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJydWJ5LmpzIj48L3NjcmlwdD4KPHN0eWxlPgogICAgICAuQ29kZU1pcnJvciB7Ym9yZGVyLXRvcDogMXB4IHNvbGlkIGJsYWNrOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7fQogICAgICAuY20tcy1kZWZhdWx0IHNwYW4uY20tYXJyb3cgeyBjb2xvcjogcmVkOyB9CiAgICA8L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5SdWJ5PC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5SdWJ5IG1vZGU8L2gyPgo8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgojIENvZGUgZnJvbSBodHRwOi8vc2FuZGJveC5tYy5lZHUvfmJlbm5ldC9ydWJ5L2NvZGUvcG9seV9yYi5odG1sCiMKIyBUaGlzIHByb2dyYW0gZXZhbHVhdGVzIHBvbHlub21pYWxzLiAgSXQgZmlyc3QgYXNrcyBmb3IgdGhlIGNvZWZmaWNpZW50cwojIG9mIGEgcG9seW5vbWlhbCwgd2hpY2ggbXVzdCBiZSBlbnRlcmVkIG9uIG9uZSBsaW5lLCBoaWdoZXN0LW9yZGVyIGZpcnN0LgojIEl0IHRoZW4gcmVxdWVzdHMgdmFsdWVzIG9mIHggYW5kIHdpbGwgY29tcHV0ZSB0aGUgdmFsdWUgb2YgdGhlIHBvbHkgZm9yCiMgZWFjaCB4LiAgSXQgd2lsbCByZXBlYXRseSBhc2sgZm9yIHggdmFsdWVzLCB1bmxlc3MgeW91IHRoZSB1c2VyIGVudGVycwojIGEgYmxhbmsgbGluZS4gIEl0IHRoYXQgY2FzZSwgaXQgd2lsbCBhc2sgZm9yIGFub3RoZXIgcG9seW5vbWlhbC4gIElmIHRoZQojIHVzZXIgdHlwZXMgcXVpdCBmb3IgZWl0aGVyIGlucHV0LCB0aGUgcHJvZ3JhbSBpbW1lZGlhdGVseSBleGl0cy4KIwoKIwojIEZ1bmN0aW9uIHRvIGV2YWx1YXRlIGEgcG9seW5vbWlhbCBhdCB4LiAgVGhlIHBvbHlub21pYWwgaXMgZ2l2ZW4KIyBhcyBhIGxpc3Qgb2YgY29lZmZpY2llbnRzLCBmcm9tIHRoZSBncmVhdGVzdCB0byB0aGUgbGVhc3QuCmRlZiBwb2x5dmFsKHgsIGNvZWYpCiAgICBzdW0gPSAwCiAgICBjb2VmID0gY29lZi5jbG9uZSAgICAgICAgICAgIyBEb24ndCB3YW50IHRvIGRlc3Ryb3kgdGhlIG9yaWdpbmFsCiAgICB3aGlsZSB0cnVlCiAgICAgICAgc3VtICs9IGNvZWYuc2hpZnQgICAgICAgIyBBZGQgYW5kIHJlbW92ZSB0aGUgbmV4dCBjb2VmCiAgICAgICAgYnJlYWsgaWYgY29lZi5lbXB0eT8gICAgIyBJZiBubyBtb3JlLCBkb25lIGVudGlyZWx5LgogICAgICAgIHN1bSAqPSB4ICAgICAgICAgICAgICAgICMgVGhpcyBoYXBwZW5zIHRoZSByaWdodCBudW1iZXIgb2YgdGltZXMuCiAgICBlbmQKICAgIHJldHVybiBzdW0KZW5kCgojCiMgRnVuY3Rpb24gdG8gcmVhZCBhIGxpbmUgY29udGFpbmluZyBhIGxpc3Qgb2YgaW50ZWdlcnMgYW5kIHJldHVybgojIHRoZW0gYXMgYW4gYXJyYXkgb2YgaW50ZWdlcnMuICBJZiB0aGUgc3RyaW5nIGNvbnZlcnNpb24gZmFpbHMsIGl0CiMgdGhyb3dzIFR5cGVFcnJvci4gIElmIHRoZSBpbnB1dCBsaW5lIGlzIHRoZSB3b3JkICdxdWl0JywgdGhlbiBpdAojIGNvbnZlcnRzIGl0IHRvIGFuIGVuZC1vZi1maWxlIGV4Y2VwdGlvbgpkZWYgcmVhZGludHMocHJvbXB0KQogICAgIyBSZWFkIGEgbGluZQogICAgcHJpbnQgcHJvbXB0CiAgICBsaW5lID0gcmVhZGxpbmUuY2hvbXAKICAgIHJhaXNlIEVPRkVycm9yLm5ldyBpZiBsaW5lID09ICdxdWl0JyAjIFlvdSBjYW4gYWxzbyB1c2UgYSByZWFsIEVPRi4KICAgICAgICAgICAgCiAgICAjIEdvIHRocm91Z2ggZWFjaCBpdGVtIG9uIHRoZSBsaW5lLCBjb252ZXJ0aW5nIGVhY2ggb25lIGFuZCBhZGRpbmcgaXQKICAgICMgdG8gcmV0dmFsLgogICAgcmV0dmFsID0gWyBdCiAgICBmb3Igc3RyIGluIGxpbmUuc3BsaXQoL1xzKy8pCiAgICAgICAgaWYgc3RyID1+IC9eXC0/XGQrJC8KICAgICAgICAgICAgcmV0dmFsLnB1c2goc3RyLnRvX2kpCiAgICAgICAgZWxzZQogICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IubmV3CiAgICAgICAgZW5kCiAgICBlbmQKCiAgICByZXR1cm4gcmV0dmFsCmVuZAoKIwojIFRha2UgYSBjb2VmZiBhbmQgYW4gZXhwb25lbnQgYW5kIHJldHVybiB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uLCBpZ25vcmluZwojIHRoZSBzaWduIG9mIHRoZSBjb2VmZmljaWVudC4KZGVmIHRlcm1fdG9fc3RyKGNvZWYsIGV4cCkKICAgIHJldCA9ICIiCgogICAgIyBTaG93IGNvZWZmLCB1bmxlc3MgaXQncyAxIG9yIGF0IHRoZSByaWdodAogICAgY29lZiA9IGNvZWYuYWJzCiAgICByZXQgPSBjb2VmLnRvX3MgICAgIHVubGVzcyBjb2VmID09IDEgJiYgZXhwID4gMAogICAgcmV0ICs9ICJ4IiBpZiBleHAgPiAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgeCBpZiBleHBvbmVudCBub3QgMAogICAgcmV0ICs9ICJeIiArIGV4cC50b19zIGlmIGV4cCA+IDEgICAgICAgICAgICAgICAgICAgICMgXmV4cG9uZW50LCBpZiA+IDEuCgogICAgcmV0dXJuIHJldAplbmQKCiMKIyBDcmVhdGUgYSBzdHJpbmcgb2YgdGhlIHBvbHlub21pYWwgaW4gc29ydC1vZi1yZWFkYWJsZSBmb3JtLgpkZWYgcG9seXN0cihwKQogICAgIyBHZXQgdGhlIGV4cG9uZW50IG9mIGZpcnN0IGNvZWZmaWNpZW50LCBwbHVzIDEuCiAgICBleHAgPSBwLmxlbmd0aAoKICAgICMgQXNzaWduIGV4cG9uZW50cyB0byBlYWNoIHRlcm0sIG1ha2luZyBwYWlycyBvZiBjb2VmZiBhbmQgZXhwb25lbnQsCiAgICAjIFRoZW4gZ2V0IHJpZCBvZiB0aGUgemVybyB0ZXJtcy4KICAgIHAgPSAocC5tYXAgeyB8Y3wgZXhwIC09IDE7IFsgYywgZXhwIF0gfSkuc2VsZWN0IHsgfHB8IHBbMF0gIT0gMCB9CgogICAgIyBJZiB0aGVyZSdzIG5vdGhpbmcgbGVmdCwgaXQncyBhIHplcm8KICAgIHJldHVybiAiMCIgaWYgcC5lbXB0eT8KCiAgICAjICoqKiBOb3cgcCBpcyBhIG5vbi1lbXB0eSBsaXN0IG9mIFsgY29lZiwgZXhwb25lbnQgXSBwYWlycy4gKioqCgogICAgIyBDb252ZXJ0IHRoZSBmaXJzdCB0ZXJtLCBwcmVjZWRlZCBieSBhICItIiBpZiBpdCdzIG5lZ2F0aXZlLgogICAgcmVzdWx0ID0gKGlmIHBbMF1bMF0gPCAwIHRoZW4gIi0iIGVsc2UgIiIgZW5kKSArIHRlcm1fdG9fc3RyKCpwWzBdKQoKICAgICMgQ29udmVydCB0aGUgcmVzdCBvZiB0aGUgdGVybXMsIGluIGVhY2ggY2FzZSBhZGRpbmcgdGhlIGFwcHJvcHJpYXRlCiAgICAjICsgb3IgLSBzZXBhcmF0aW5nIHRoZW0uICAKICAgIGZvciB0ZXJtIGluIHBbMS4uLnAubGVuZ3RoXQogICAgICAgICMgQWRkIHRoZSBzZXBhcmF0b3IgdGhlbiB0aGUgcmVwLiBvZiB0aGUgdGVybS4KICAgICAgICByZXN1bHQgKz0gKGlmIHRlcm1bMF0gPCAwIHRoZW4gIiAtICIgZWxzZSAiICsgIiBlbmQpICsgCiAgICAgICAgICAgICAgICB0ZXJtX3RvX3N0cigqdGVybSkKICAgIGVuZAoKICAgIHJldHVybiByZXN1bHQKZW5kCiAgICAgICAgCiMKIyBSdW4gdW50aWwgc29tZSBraW5kIG9mIGVuZGZpbGUuCmJlZ2luCiAgICAjIFJlcGVhdCB1bnRpbCBhbiBleGNlcHRpb24gb3IgcXVpdCBnZXRzIHVzIG91dC4KICAgIHdoaWxlIHRydWUKICAgICAgICAjIFJlYWQgYSBwb2x5IHVudGlsIGl0IHdvcmtzLiAgQW4gRU9GIHdpbGwgZXhjZXB0IG91dCBvZiB0aGUKICAgICAgICAjIHByb2dyYW0uCiAgICAgICAgcHJpbnQgIlxuIgogICAgICAgIGJlZ2luCiAgICAgICAgICAgIHBvbHkgPSByZWFkaW50cygiRW50ZXIgYSBwb2x5bm9taWFsIGNvZWZmaWNpZW50czogIikKICAgICAgICByZXNjdWUgVHlwZUVycm9yCiAgICAgICAgICAgIHByaW50ICJUcnkgYWdhaW4uXG4iCiAgICAgICAgICAgIHJldHJ5CiAgICAgICAgZW5kCiAgICAgICAgYnJlYWsgaWYgcG9seS5lbXB0eT8KCiAgICAgICAgIyBSZWFkIGFuZCBldmFsdWF0ZSB4IHZhbHVlcyB1bnRpbCB0aGUgdXNlciB0eXBlcyBhIGJsYW5rIGxpbmUuCiAgICAgICAgIyBBZ2FpbiwgYW4gRU9GIHdpbGwgZXhjZXB0IG91dCBvZiB0aGUgcGdtLgogICAgICAgIHdoaWxlIHRydWUKICAgICAgICAgICAgIyBSZXF1ZXN0IGFuIGludGVnZXIuCiAgICAgICAgICAgIHByaW50ICJFbnRlciB4IHZhbHVlIG9yIGJsYW5rIGxpbmU6ICIKICAgICAgICAgICAgeCA9IHJlYWRsaW5lLmNob21wCiAgICAgICAgICAgIGJyZWFrIGlmIHggPT0gJycKICAgICAgICAgICAgcmFpc2UgRU9GRXJyb3IubmV3IGlmIHggPT0gJ3F1aXQnCgogICAgICAgICAgICAjIElmIGl0IGxvb2tzIGJhZCwgbGV0J3MgdHJ5IGFnYWluLgogICAgICAgICAgICBpZiB4ICF+IC9eXC0/XGQrJC8KICAgICAgICAgICAgICAgIHByaW50ICJUaGF0IGRvZXNuJ3QgbG9vayBsaWtlIGFuIGludGVnZXIuICBQbGVhc2UgdHJ5IGFnYWluLlxuIgogICAgICAgICAgICAgICAgbmV4dAogICAgICAgICAgICBlbmQKCiAgICAgICAgICAgICMgQ29udmVydCB0byBhbiBpbnRlZ2VyIGFuZCBwcmludCB0aGUgcmVzdWx0LgogICAgICAgICAgICB4ID0geC50b19pCiAgICAgICAgICAgIHByaW50ICJwKHgpID0gIiwgcG9seXN0cihwb2x5KSwgIlxuIgogICAgICAgICAgICBwcmludCAicCgiLCB4LCAiKSA9ICIsIHBvbHl2YWwoeCwgcG9seSksICJcbiIKICAgICAgICBlbmQKICAgIGVuZApyZXNjdWUgRU9GRXJyb3IKICAgIHByaW50ICJcbj09PSBFT0YgPT09XG4iCnJlc2N1ZSBJbnRlcnJ1cHQsIFNpZ25hbEV4Y2VwdGlvbgogICAgcHJpbnQgIlxuPT09IEludGVycnVwdGVkID09PVxuIgplbHNlCiAgICBwcmludCAiLS0tIEJ5ZSAtLS1cbiIKZW5kCjwvdGV4dGFyZWE+PC9mb3JtPgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICBtb2RlOiAidGV4dC94LXJ1YnkiLAogICAgICAgIG1hdGNoQnJhY2tldHM6IHRydWUsCiAgICAgICAgaW5kZW50VW5pdDogNAogICAgICB9KTsKICAgIDwvc2NyaXB0PgoKICAgIDxwPjxzdHJvbmc+TUlNRSB0eXBlcyBkZWZpbmVkOjwvc3Ryb25nPiA8Y29kZT50ZXh0L3gtcnVieTwvY29kZT4uPC9wPgoKICAgIDxwPkRldmVsb3BtZW50IG9mIHRoZSBDb2RlTWlycm9yIFJ1YnkgbW9kZSB3YXMga2luZGx5IHNwb25zb3JlZAogICAgYnkgPGEgaHJlZj0iaHR0cDovL3ViYWxvLmNvbS8iPlViYWxvPC9hPiwgd2hvIGhvbGQKICAgIHRoZSA8YSBocmVmPSJMSUNFTlNFIj5saWNlbnNlPC9hPi48L3A+CgogIDwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/ruby/ruby.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJydWJ5IiwgZnVuY3Rpb24oY29uZmlnKSB7CiAgZnVuY3Rpb24gd29yZE9iaih3b3JkcykgewogICAgdmFyIG8gPSB7fTsKICAgIGZvciAodmFyIGkgPSAwLCBlID0gd29yZHMubGVuZ3RoOyBpIDwgZTsgKytpKSBvW3dvcmRzW2ldXSA9IHRydWU7CiAgICByZXR1cm4gbzsKICB9CiAgdmFyIGtleXdvcmRzID0gd29yZE9iaihbCiAgICAiYWxpYXMiLCAiYW5kIiwgIkJFR0lOIiwgImJlZ2luIiwgImJyZWFrIiwgImNhc2UiLCAiY2xhc3MiLCAiZGVmIiwgImRlZmluZWQ/IiwgImRvIiwgImVsc2UiLAogICAgImVsc2lmIiwgIkVORCIsICJlbmQiLCAiZW5zdXJlIiwgImZhbHNlIiwgImZvciIsICJpZiIsICJpbiIsICJtb2R1bGUiLCAibmV4dCIsICJub3QiLCAib3IiLAogICAgInJlZG8iLCAicmVzY3VlIiwgInJldHJ5IiwgInJldHVybiIsICJzZWxmIiwgInN1cGVyIiwgInRoZW4iLCAidHJ1ZSIsICJ1bmRlZiIsICJ1bmxlc3MiLAogICAgInVudGlsIiwgIndoZW4iLCAid2hpbGUiLCAieWllbGQiLCAibmlsIiwgInJhaXNlIiwgInRocm93IiwgImNhdGNoIiwgImZhaWwiLCAibG9vcCIsICJjYWxsY2MiLAogICAgImNhbGxlciIsICJsYW1iZGEiLCAicHJvYyIsICJwdWJsaWMiLCAicHJvdGVjdGVkIiwgInByaXZhdGUiLCAicmVxdWlyZSIsICJsb2FkIiwKICAgICJyZXF1aXJlX3JlbGF0aXZlIiwgImV4dGVuZCIsICJhdXRvbG9hZCIsICJfX0VORF9fIiwgIl9fRklMRV9fIiwgIl9fTElORV9fIiwgIl9fZGlyX18iCiAgXSk7CiAgdmFyIGluZGVudFdvcmRzID0gd29yZE9iaihbImRlZiIsICJjbGFzcyIsICJjYXNlIiwgImZvciIsICJ3aGlsZSIsICJtb2R1bGUiLCAidGhlbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhdGNoIiwgImxvb3AiLCAicHJvYyIsICJiZWdpbiJdKTsKICB2YXIgZGVkZW50V29yZHMgPSB3b3JkT2JqKFsiZW5kIiwgInVudGlsIl0pOwogIHZhciBtYXRjaGluZyA9IHsiWyI6ICJdIiwgInsiOiAifSIsICIoIjogIikifTsKICB2YXIgY3VyUHVuYzsKCiAgZnVuY3Rpb24gY2hhaW4obmV3dG9rLCBzdHJlYW0sIHN0YXRlKSB7CiAgICBzdGF0ZS50b2tlbml6ZS5wdXNoKG5ld3Rvayk7CiAgICByZXR1cm4gbmV3dG9rKHN0cmVhbSwgc3RhdGUpOwogIH0KCiAgZnVuY3Rpb24gdG9rZW5CYXNlKHN0cmVhbSwgc3RhdGUpIHsKICAgIGN1clB1bmMgPSBudWxsOwogICAgaWYgKHN0cmVhbS5zb2woKSAmJiBzdHJlYW0ubWF0Y2goIj1iZWdpbiIpICYmIHN0cmVhbS5lb2woKSkgewogICAgICBzdGF0ZS50b2tlbml6ZS5wdXNoKHJlYWRCbG9ja0NvbW1lbnQpOwogICAgICByZXR1cm4gImNvbW1lbnQiOwogICAgfQogICAgaWYgKHN0cmVhbS5lYXRTcGFjZSgpKSByZXR1cm4gbnVsbDsKICAgIHZhciBjaCA9IHN0cmVhbS5uZXh0KCksIG07CiAgICBpZiAoY2ggPT0gImAiIHx8IGNoID09ICInIiB8fCBjaCA9PSAnIicpIHsKICAgICAgcmV0dXJuIGNoYWluKHJlYWRRdW90ZWQoY2gsICJzdHJpbmciLCBjaCA9PSAnIicgfHwgY2ggPT0gImAiKSwgc3RyZWFtLCBzdGF0ZSk7CiAgICB9IGVsc2UgaWYgKGNoID09ICIvIikgewogICAgICB2YXIgY3VycmVudEluZGV4ID0gc3RyZWFtLmN1cnJlbnQoKS5sZW5ndGg7CiAgICAgIGlmIChzdHJlYW0uc2tpcFRvKCIvIikpIHsKICAgICAgICB2YXIgc2VhcmNoX3RpbGwgPSBzdHJlYW0uY3VycmVudCgpLmxlbmd0aDsKICAgICAgICBzdHJlYW0uYmFja1VwKHN0cmVhbS5jdXJyZW50KCkubGVuZ3RoIC0gY3VycmVudEluZGV4KTsKICAgICAgICB2YXIgYmFsYW5jZSA9IDA7ICAvLyBiYWxhbmNlIGJyYWNrZXRzCiAgICAgICAgd2hpbGUgKHN0cmVhbS5jdXJyZW50KCkubGVuZ3RoIDwgc2VhcmNoX3RpbGwpIHsKICAgICAgICAgIHZhciBjaGNociA9IHN0cmVhbS5uZXh0KCk7CiAgICAgICAgICBpZiAoY2hjaHIgPT0gIigiKSBiYWxhbmNlICs9IDE7CiAgICAgICAgICBlbHNlIGlmIChjaGNociA9PSAiKSIpIGJhbGFuY2UgLT0gMTsKICAgICAgICAgIGlmIChiYWxhbmNlIDwgMCkgYnJlYWs7CiAgICAgICAgfQogICAgICAgIHN0cmVhbS5iYWNrVXAoc3RyZWFtLmN1cnJlbnQoKS5sZW5ndGggLSBjdXJyZW50SW5kZXgpOwogICAgICAgIGlmIChiYWxhbmNlID09IDApCiAgICAgICAgICByZXR1cm4gY2hhaW4ocmVhZFF1b3RlZChjaCwgInN0cmluZy0yIiwgdHJ1ZSksIHN0cmVhbSwgc3RhdGUpOwogICAgICB9CiAgICAgIHJldHVybiAib3BlcmF0b3IiOwogICAgfSBlbHNlIGlmIChjaCA9PSAiJSIpIHsKICAgICAgdmFyIHN0eWxlID0gInN0cmluZyIsIGVtYmVkID0gdHJ1ZTsKICAgICAgaWYgKHN0cmVhbS5lYXQoInMiKSkgc3R5bGUgPSAiYXRvbSI7CiAgICAgIGVsc2UgaWYgKHN0cmVhbS5lYXQoL1tXUV0vKSkgc3R5bGUgPSAic3RyaW5nIjsKICAgICAgZWxzZSBpZiAoc3RyZWFtLmVhdCgvW3JdLykpIHN0eWxlID0gInN0cmluZy0yIjsKICAgICAgZWxzZSBpZiAoc3RyZWFtLmVhdCgvW3d4cV0vKSkgeyBzdHlsZSA9ICJzdHJpbmciOyBlbWJlZCA9IGZhbHNlOyB9CiAgICAgIHZhciBkZWxpbSA9IHN0cmVhbS5lYXQoL1teXHdccz1dLyk7CiAgICAgIGlmICghZGVsaW0pIHJldHVybiAib3BlcmF0b3IiOwogICAgICBpZiAobWF0Y2hpbmcucHJvcGVydHlJc0VudW1lcmFibGUoZGVsaW0pKSBkZWxpbSA9IG1hdGNoaW5nW2RlbGltXTsKICAgICAgcmV0dXJuIGNoYWluKHJlYWRRdW90ZWQoZGVsaW0sIHN0eWxlLCBlbWJlZCwgdHJ1ZSksIHN0cmVhbSwgc3RhdGUpOwogICAgfSBlbHNlIGlmIChjaCA9PSAiIyIpIHsKICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICByZXR1cm4gImNvbW1lbnQiOwogICAgfSBlbHNlIGlmIChjaCA9PSAiPCIgJiYgKG0gPSBzdHJlYW0ubWF0Y2goL148LT9bXGBcIlwnXT8oW2EtekEtWl8/XVx3KilbXGBcIlwnXT8oPzo7fCQpLykpKSB7CiAgICAgIHJldHVybiBjaGFpbihyZWFkSGVyZURvYyhtWzFdKSwgc3RyZWFtLCBzdGF0ZSk7CiAgICB9IGVsc2UgaWYgKGNoID09ICIwIikgewogICAgICBpZiAoc3RyZWFtLmVhdCgieCIpKSBzdHJlYW0uZWF0V2hpbGUoL1tcZGEtZkEtRl0vKTsKICAgICAgZWxzZSBpZiAoc3RyZWFtLmVhdCgiYiIpKSBzdHJlYW0uZWF0V2hpbGUoL1swMV0vKTsKICAgICAgZWxzZSBzdHJlYW0uZWF0V2hpbGUoL1swLTddLyk7CiAgICAgIHJldHVybiAibnVtYmVyIjsKICAgIH0gZWxzZSBpZiAoL1xkLy50ZXN0KGNoKSkgewogICAgICBzdHJlYW0ubWF0Y2goL15bXGRfXSooPzpcLltcZF9dKyk/KD86W2VFXVsrXC1dP1tcZF9dKyk/Lyk7CiAgICAgIHJldHVybiAibnVtYmVyIjsKICAgIH0gZWxzZSBpZiAoY2ggPT0gIj8iKSB7CiAgICAgIHdoaWxlIChzdHJlYW0ubWF0Y2goL15cXFtDTV0tLykpIHt9CiAgICAgIGlmIChzdHJlYW0uZWF0KCJcXCIpKSBzdHJlYW0uZWF0V2hpbGUoL1x3Lyk7CiAgICAgIGVsc2Ugc3RyZWFtLm5leHQoKTsKICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgfSBlbHNlIGlmIChjaCA9PSAiOiIpIHsKICAgICAgaWYgKHN0cmVhbS5lYXQoIiciKSkgcmV0dXJuIGNoYWluKHJlYWRRdW90ZWQoIiciLCAiYXRvbSIsIGZhbHNlKSwgc3RyZWFtLCBzdGF0ZSk7CiAgICAgIGlmIChzdHJlYW0uZWF0KCciJykpIHJldHVybiBjaGFpbihyZWFkUXVvdGVkKCciJywgImF0b20iLCB0cnVlKSwgc3RyZWFtLCBzdGF0ZSk7CgogICAgICAvLyA6PiA6Pj4gOjwgOjw8IGFyZSB2YWxpZCBzeW1ib2xzCiAgICAgIGlmIChzdHJlYW0uZWF0KC9bXDxcPl0vKSkgewogICAgICAgIHN0cmVhbS5lYXQoL1tcPFw+XS8pOwogICAgICAgIHJldHVybiAiYXRvbSI7CiAgICAgIH0KCiAgICAgIC8vIDorIDotIDovIDoqIDp8IDomIDohIGFyZSB2YWxpZCBzeW1ib2xzCiAgICAgIGlmIChzdHJlYW0uZWF0KC9bXCtcLVwqXC9cJlx8XDpcIV0vKSkgewogICAgICAgIHJldHVybiAiYXRvbSI7CiAgICAgIH0KCiAgICAgIC8vIFN5bWJvbHMgY2FuJ3Qgc3RhcnQgYnkgYSBkaWdpdAogICAgICBpZiAoc3RyZWFtLmVhdCgvW2EtekEtWiRAX10vKSkgewogICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1x3XS8pOwogICAgICAgIC8vIE9ubHkgb25lID8gISA9IGlzIGFsbG93ZWQgYW5kIG9ubHkgYXMgdGhlIGxhc3QgY2hhcmFjdGVyCiAgICAgICAgc3RyZWFtLmVhdCgvW1w/XCFcPV0vKTsKICAgICAgICByZXR1cm4gImF0b20iOwogICAgICB9CiAgICAgIHJldHVybiAib3BlcmF0b3IiOwogICAgfSBlbHNlIGlmIChjaCA9PSAiQCIgJiYgc3RyZWFtLm1hdGNoKC9eQD9bYS16QS1aX10vKSkgewogICAgICBzdHJlYW0uZWF0KCJAIik7CiAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1x3XS8pOwogICAgICByZXR1cm4gInZhcmlhYmxlLTIiOwogICAgfSBlbHNlIGlmIChjaCA9PSAiJCIpIHsKICAgICAgaWYgKHN0cmVhbS5lYXQoL1thLXpBLVpfXS8pKSB7CiAgICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXHddLyk7CiAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLmVhdCgvXGQvKSkgewogICAgICAgIHN0cmVhbS5lYXQoL1xkLyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc3RyZWFtLm5leHQoKTsgLy8gTXVzdCBiZSBhIHNwZWNpYWwgZ2xvYmFsIGxpa2UgJDogb3IgJCEKICAgICAgfQogICAgICByZXR1cm4gInZhcmlhYmxlLTMiOwogICAgfSBlbHNlIGlmICgvW2EtekEtWl9dLy50ZXN0KGNoKSkgewogICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcd10vKTsKICAgICAgc3RyZWFtLmVhdCgvW1w/XCFdLyk7CiAgICAgIGlmIChzdHJlYW0uZWF0KCI6IikpIHJldHVybiAiYXRvbSI7CiAgICAgIHJldHVybiAiaWRlbnQiOwogICAgfSBlbHNlIGlmIChjaCA9PSAifCIgJiYgKHN0YXRlLnZhckxpc3QgfHwgc3RhdGUubGFzdFRvayA9PSAieyIgfHwgc3RhdGUubGFzdFRvayA9PSAiZG8iKSkgewogICAgICBjdXJQdW5jID0gInwiOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0gZWxzZSBpZiAoL1tcKFwpXFtcXXt9XFw7XS8udGVzdChjaCkpIHsKICAgICAgY3VyUHVuYyA9IGNoOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0gZWxzZSBpZiAoY2ggPT0gIi0iICYmIHN0cmVhbS5lYXQoIj4iKSkgewogICAgICByZXR1cm4gImFycm93IjsKICAgIH0gZWxzZSBpZiAoL1s9K1wtXC8qOlwuXiU8Pn58XS8udGVzdChjaCkpIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bPStcLVwvKjpcLl4lPD5+fF0vKTsKICAgICAgcmV0dXJuICJvcGVyYXRvciI7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHRva2VuQmFzZVVudGlsQnJhY2UoKSB7CiAgICB2YXIgZGVwdGggPSAxOwogICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgaWYgKHN0cmVhbS5wZWVrKCkgPT0gIn0iKSB7CiAgICAgICAgZGVwdGgtLTsKICAgICAgICBpZiAoZGVwdGggPT0gMCkgewogICAgICAgICAgc3RhdGUudG9rZW5pemUucG9wKCk7CiAgICAgICAgICByZXR1cm4gc3RhdGUudG9rZW5pemVbc3RhdGUudG9rZW5pemUubGVuZ3RoLTFdKHN0cmVhbSwgc3RhdGUpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChzdHJlYW0ucGVlaygpID09ICJ7IikgewogICAgICAgIGRlcHRoKys7CiAgICAgIH0KICAgICAgcmV0dXJuIHRva2VuQmFzZShzdHJlYW0sIHN0YXRlKTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIHRva2VuQmFzZU9uY2UoKSB7CiAgICB2YXIgYWxyZWFkeUNhbGxlZCA9IGZhbHNlOwogICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgaWYgKGFscmVhZHlDYWxsZWQpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZS5wb3AoKTsKICAgICAgICByZXR1cm4gc3RhdGUudG9rZW5pemVbc3RhdGUudG9rZW5pemUubGVuZ3RoLTFdKHN0cmVhbSwgc3RhdGUpOwogICAgICB9CiAgICAgIGFscmVhZHlDYWxsZWQgPSB0cnVlOwogICAgICByZXR1cm4gdG9rZW5CYXNlKHN0cmVhbSwgc3RhdGUpOwogICAgfTsKICB9CiAgZnVuY3Rpb24gcmVhZFF1b3RlZChxdW90ZSwgc3R5bGUsIGVtYmVkLCB1bmVzY2FwZWQpIHsKICAgIHJldHVybiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHZhciBlc2NhcGVkID0gZmFsc2UsIGNoOwoKICAgICAgaWYgKHN0YXRlLmNvbnRleHQudHlwZSA9PT0gJ3JlYWQtcXVvdGVkLXBhdXNlZCcpIHsKICAgICAgICBzdGF0ZS5jb250ZXh0ID0gc3RhdGUuY29udGV4dC5wcmV2OwogICAgICAgIHN0cmVhbS5lYXQoIn0iKTsKICAgICAgfQoKICAgICAgd2hpbGUgKChjaCA9IHN0cmVhbS5uZXh0KCkpICE9IG51bGwpIHsKICAgICAgICBpZiAoY2ggPT0gcXVvdGUgJiYgKHVuZXNjYXBlZCB8fCAhZXNjYXBlZCkpIHsKICAgICAgICAgIHN0YXRlLnRva2VuaXplLnBvcCgpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmIChlbWJlZCAmJiBjaCA9PSAiIyIgJiYgIWVzY2FwZWQpIHsKICAgICAgICAgIGlmIChzdHJlYW0uZWF0KCJ7IikpIHsKICAgICAgICAgICAgaWYgKHF1b3RlID09ICJ9IikgewogICAgICAgICAgICAgIHN0YXRlLmNvbnRleHQgPSB7cHJldjogc3RhdGUuY29udGV4dCwgdHlwZTogJ3JlYWQtcXVvdGVkLXBhdXNlZCd9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0YXRlLnRva2VuaXplLnB1c2godG9rZW5CYXNlVW50aWxCcmFjZSgpKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9IGVsc2UgaWYgKC9bQFwkXS8udGVzdChzdHJlYW0ucGVlaygpKSkgewogICAgICAgICAgICBzdGF0ZS50b2tlbml6ZS5wdXNoKHRva2VuQmFzZU9uY2UoKSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlc2NhcGVkID0gIWVzY2FwZWQgJiYgY2ggPT0gIlxcIjsKICAgICAgfQogICAgICByZXR1cm4gc3R5bGU7CiAgICB9OwogIH0KICBmdW5jdGlvbiByZWFkSGVyZURvYyhwaHJhc2UpIHsKICAgIHJldHVybiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIGlmIChzdHJlYW0ubWF0Y2gocGhyYXNlKSkgc3RhdGUudG9rZW5pemUucG9wKCk7CiAgICAgIGVsc2Ugc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICByZXR1cm4gInN0cmluZyI7CiAgICB9OwogIH0KICBmdW5jdGlvbiByZWFkQmxvY2tDb21tZW50KHN0cmVhbSwgc3RhdGUpIHsKICAgIGlmIChzdHJlYW0uc29sKCkgJiYgc3RyZWFtLm1hdGNoKCI9ZW5kIikgJiYgc3RyZWFtLmVvbCgpKQogICAgICBzdGF0ZS50b2tlbml6ZS5wb3AoKTsKICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgIHJldHVybiAiY29tbWVudCI7CiAgfQoKICByZXR1cm4gewogICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB7dG9rZW5pemU6IFt0b2tlbkJhc2VdLAogICAgICAgICAgICAgIGluZGVudGVkOiAwLAogICAgICAgICAgICAgIGNvbnRleHQ6IHt0eXBlOiAidG9wIiwgaW5kZW50ZWQ6IC1jb25maWcuaW5kZW50VW5pdH0sCiAgICAgICAgICAgICAgY29udGludWVkTGluZTogZmFsc2UsCiAgICAgICAgICAgICAgbGFzdFRvazogbnVsbCwKICAgICAgICAgICAgICB2YXJMaXN0OiBmYWxzZX07CiAgICB9LAoKICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIGlmIChzdHJlYW0uc29sKCkpIHN0YXRlLmluZGVudGVkID0gc3RyZWFtLmluZGVudGF0aW9uKCk7CiAgICAgIHZhciBzdHlsZSA9IHN0YXRlLnRva2VuaXplW3N0YXRlLnRva2VuaXplLmxlbmd0aC0xXShzdHJlYW0sIHN0YXRlKSwga3d0eXBlOwogICAgICBpZiAoc3R5bGUgPT0gImlkZW50IikgewogICAgICAgIHZhciB3b3JkID0gc3RyZWFtLmN1cnJlbnQoKTsKICAgICAgICBzdHlsZSA9IGtleXdvcmRzLnByb3BlcnR5SXNFbnVtZXJhYmxlKHN0cmVhbS5jdXJyZW50KCkpID8gImtleXdvcmQiCiAgICAgICAgICA6IC9eW0EtWl0vLnRlc3Qod29yZCkgPyAidGFnIgogICAgICAgICAgOiAoc3RhdGUubGFzdFRvayA9PSAiZGVmIiB8fCBzdGF0ZS5sYXN0VG9rID09ICJjbGFzcyIgfHwgc3RhdGUudmFyTGlzdCkgPyAiZGVmIgogICAgICAgICAgOiAidmFyaWFibGUiOwogICAgICAgIGlmIChpbmRlbnRXb3Jkcy5wcm9wZXJ0eUlzRW51bWVyYWJsZSh3b3JkKSkga3d0eXBlID0gImluZGVudCI7CiAgICAgICAgZWxzZSBpZiAoZGVkZW50V29yZHMucHJvcGVydHlJc0VudW1lcmFibGUod29yZCkpIGt3dHlwZSA9ICJkZWRlbnQiOwogICAgICAgIGVsc2UgaWYgKCh3b3JkID09ICJpZiIgfHwgd29yZCA9PSAidW5sZXNzIikgJiYgc3RyZWFtLmNvbHVtbigpID09IHN0cmVhbS5pbmRlbnRhdGlvbigpKQogICAgICAgICAga3d0eXBlID0gImluZGVudCI7CiAgICAgICAgZWxzZSBpZiAod29yZCA9PSAiZG8iICYmIHN0YXRlLmNvbnRleHQuaW5kZW50ZWQgPCBzdGF0ZS5pbmRlbnRlZCkKICAgICAgICAgIGt3dHlwZSA9ICJpbmRlbnQiOwogICAgICB9CiAgICAgIGlmIChjdXJQdW5jIHx8IChzdHlsZSAmJiBzdHlsZSAhPSAiY29tbWVudCIpKSBzdGF0ZS5sYXN0VG9rID0gd29yZCB8fCBjdXJQdW5jIHx8IHN0eWxlOwogICAgICBpZiAoY3VyUHVuYyA9PSAifCIpIHN0YXRlLnZhckxpc3QgPSAhc3RhdGUudmFyTGlzdDsKCiAgICAgIGlmIChrd3R5cGUgPT0gImluZGVudCIgfHwgL1tcKFxbXHtdLy50ZXN0KGN1clB1bmMpKQogICAgICAgIHN0YXRlLmNvbnRleHQgPSB7cHJldjogc3RhdGUuY29udGV4dCwgdHlwZTogY3VyUHVuYyB8fCBzdHlsZSwgaW5kZW50ZWQ6IHN0YXRlLmluZGVudGVkfTsKICAgICAgZWxzZSBpZiAoKGt3dHlwZSA9PSAiZGVkZW50IiB8fCAvW1wpXF1cfV0vLnRlc3QoY3VyUHVuYykpICYmIHN0YXRlLmNvbnRleHQucHJldikKICAgICAgICBzdGF0ZS5jb250ZXh0ID0gc3RhdGUuY29udGV4dC5wcmV2OwoKICAgICAgaWYgKHN0cmVhbS5lb2woKSkKICAgICAgICBzdGF0ZS5jb250aW51ZWRMaW5lID0gKGN1clB1bmMgPT0gIlxcIiB8fCBzdHlsZSA9PSAib3BlcmF0b3IiKTsKICAgICAgcmV0dXJuIHN0eWxlOwogICAgfSwKCiAgICBpbmRlbnQ6IGZ1bmN0aW9uKHN0YXRlLCB0ZXh0QWZ0ZXIpIHsKICAgICAgaWYgKHN0YXRlLnRva2VuaXplW3N0YXRlLnRva2VuaXplLmxlbmd0aC0xXSAhPSB0b2tlbkJhc2UpIHJldHVybiAwOwogICAgICB2YXIgZmlyc3RDaGFyID0gdGV4dEFmdGVyICYmIHRleHRBZnRlci5jaGFyQXQoMCk7CiAgICAgIHZhciBjdCA9IHN0YXRlLmNvbnRleHQ7CiAgICAgIHZhciBjbG9zaW5nID0gY3QudHlwZSA9PSBtYXRjaGluZ1tmaXJzdENoYXJdIHx8CiAgICAgICAgY3QudHlwZSA9PSAia2V5d29yZCIgJiYgL14oPzplbmR8dW50aWx8ZWxzZXxlbHNpZnx3aGVufHJlc2N1ZSlcYi8udGVzdCh0ZXh0QWZ0ZXIpOwogICAgICByZXR1cm4gY3QuaW5kZW50ZWQgKyAoY2xvc2luZyA/IDAgOiBjb25maWcuaW5kZW50VW5pdCkgKwogICAgICAgIChzdGF0ZS5jb250aW51ZWRMaW5lID8gY29uZmlnLmluZGVudFVuaXQgOiAwKTsKICAgIH0sCgogICAgZWxlY3RyaWNDaGFyczogIn1kZSIsIC8vIGVuRCBhbmQgcmVzY3VFCiAgICBsaW5lQ29tbWVudDogIiMiCiAgfTsKfSk7CgpDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveC1ydWJ5IiwgInJ1YnkiKTsKCn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/ruby/test.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24oKSB7CiAgdmFyIG1vZGUgPSBDb2RlTWlycm9yLmdldE1vZGUoe2luZGVudFVuaXQ6IDJ9LCAicnVieSIpOwogIGZ1bmN0aW9uIE1UKG5hbWUpIHsgdGVzdC5tb2RlKG5hbWUsIG1vZGUsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpOyB9CgogIE1UKCJkaXZpZGVfZXF1YWxfb3BlcmF0b3IiLAogICAgICJbdmFyaWFibGUgYmFyXSBbb3BlcmF0b3IgLz1dIFt2YXJpYWJsZSBmb29dIik7CgogIE1UKCJkaXZpZGVfZXF1YWxfb3BlcmF0b3Jfbm9fc3BhY2luZyIsCiAgICAgIlt2YXJpYWJsZSBmb29dW29wZXJhdG9yIC89XVtudW1iZXIgNDJdIik7Cgp9KSgpOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/rust/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/rust/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogUnVzdCBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9InJ1c3QuanMiPjwvc2NyaXB0Pgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPi5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazt9PC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aW1nIGlkPWxvZ28gc3JjPSIuLi8uLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5MYW5ndWFnZSBtb2RlczwvYT4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+UnVzdDwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+UnVzdCBtb2RlPC9oMj4KCgo8ZGl2Pjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+Ci8vIERlbW8gY29kZS4KCnR5cGUgZm9vPFQ+ID0gaW50OwplbnVtIGJhciB7CiAgICBzb21lKGludCwgZm9vPGZsb2F0PiksCiAgICBub25lCn0KCmZuIGNoZWNrX2NyYXRlKHg6IGludCkgewogICAgbGV0IHYgPSAxMDsKICAgIGFsdCBmb28gewogICAgICAxIHRvIDMgewogICAgICAgIHByaW50X2ZvbygpOwogICAgICAgIGlmIHggewogICAgICAgICAgICBibGFoKCkgKyAxMDsKICAgICAgICB9CiAgICAgIH0KICAgICAgKHgsIHkpIHsgImJ5ZSIgfQogICAgICBfIHsgImhpIiB9CiAgICB9Cn0KPC90ZXh0YXJlYT48L2Rpdj4KCiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlCiAgICAgIH0pOwogICAgPC9zY3JpcHQ+CgogICAgPHA+PHN0cm9uZz5NSU1FIHR5cGVzIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPnRleHQveC1ydXN0c3JjPC9jb2RlPi48L3A+CiAgPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/rust/rust.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJydXN0IiwgZnVuY3Rpb24oKSB7CiAgdmFyIGluZGVudFVuaXQgPSA0LCBhbHRJbmRlbnRVbml0ID0gMjsKICB2YXIgdmFsS2V5d29yZHMgPSB7CiAgICAiaWYiOiAiaWYtc3R5bGUiLCAid2hpbGUiOiAiaWYtc3R5bGUiLCAiZWxzZSI6ICJlbHNlLXN0eWxlIiwKICAgICJkbyI6ICJlbHNlLXN0eWxlIiwgInJldCI6ICJlbHNlLXN0eWxlIiwgImZhaWwiOiAiZWxzZS1zdHlsZSIsCiAgICAiYnJlYWsiOiAiYXRvbSIsICJjb250IjogImF0b20iLCAiY29uc3QiOiAibGV0IiwgInJlc291cmNlIjogImZuIiwKICAgICJsZXQiOiAibGV0IiwgImZuIjogImZuIiwgImZvciI6ICJmb3IiLCAiYWx0IjogImFsdCIsICJpZmFjZSI6ICJpZmFjZSIsCiAgICAiaW1wbCI6ICJpbXBsIiwgInR5cGUiOiAidHlwZSIsICJlbnVtIjogImVudW0iLCAibW9kIjogIm1vZCIsCiAgICAiYXMiOiAib3AiLCAidHJ1ZSI6ICJhdG9tIiwgImZhbHNlIjogImF0b20iLCAiYXNzZXJ0IjogIm9wIiwgImNoZWNrIjogIm9wIiwKICAgICJjbGFpbSI6ICJvcCIsICJuYXRpdmUiOiAiaWdub3JlIiwgInVuc2FmZSI6ICJpZ25vcmUiLCAiaW1wb3J0IjogImVsc2Utc3R5bGUiLAogICAgImV4cG9ydCI6ICJlbHNlLXN0eWxlIiwgImNvcHkiOiAib3AiLCAibG9nIjogIm9wIiwgImxvZ19lcnIiOiAib3AiLAogICAgInVzZSI6ICJvcCIsICJiaW5kIjogIm9wIiwgInNlbGYiOiAiYXRvbSIKICB9OwogIHZhciB0eXBlS2V5d29yZHMgPSBmdW5jdGlvbigpIHsKICAgIHZhciBrZXl3b3JkcyA9IHsiZm4iOiAiZm4iLCAiYmxvY2siOiAiZm4iLCAib2JqIjogIm9iaiJ9OwogICAgdmFyIGF0b21zID0gImJvb2wgdWludCBpbnQgaTggaTE2IGkzMiBpNjQgdTggdTE2IHUzMiB1NjQgZmxvYXQgZjMyIGY2NCBzdHIgY2hhciIuc3BsaXQoIiAiKTsKICAgIGZvciAodmFyIGkgPSAwLCBlID0gYXRvbXMubGVuZ3RoOyBpIDwgZTsgKytpKSBrZXl3b3Jkc1thdG9tc1tpXV0gPSAiYXRvbSI7CiAgICByZXR1cm4ga2V5d29yZHM7CiAgfSgpOwogIHZhciBvcGVyYXRvckNoYXIgPSAvWytcLSomJT08PiE/fFwuQF0vOwoKICAvLyBUb2tlbml6ZXIKCiAgLy8gVXNlZCBhcyBzY3JhdGNoIHZhcmlhYmxlIHRvIGNvbW11bmljYXRlIG11bHRpcGxlIHZhbHVlcyB3aXRob3V0CiAgLy8gY29uc2luZyB1cCB0b25zIG9mIG9iamVjdHMuCiAgdmFyIHRjYXQsIGNvbnRlbnQ7CiAgZnVuY3Rpb24gcih0Yywgc3R5bGUpIHsKICAgIHRjYXQgPSB0YzsKICAgIHJldHVybiBzdHlsZTsKICB9CgogIGZ1bmN0aW9uIHRva2VuQmFzZShzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpOwogICAgaWYgKGNoID09ICciJykgewogICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuU3RyaW5nOwogICAgICByZXR1cm4gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CiAgICB9CiAgICBpZiAoY2ggPT0gIiciKSB7CiAgICAgIHRjYXQgPSAiYXRvbSI7CiAgICAgIGlmIChzdHJlYW0uZWF0KCJcXCIpKSB7CiAgICAgICAgaWYgKHN0cmVhbS5za2lwVG8oIiciKSkgeyBzdHJlYW0ubmV4dCgpOyByZXR1cm4gInN0cmluZyI7IH0KICAgICAgICBlbHNlIHsgcmV0dXJuICJlcnJvciI7IH0KICAgICAgfSBlbHNlIHsKICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgIHJldHVybiBzdHJlYW0uZWF0KCInIikgPyAic3RyaW5nIiA6ICJlcnJvciI7CiAgICAgIH0KICAgIH0KICAgIGlmIChjaCA9PSAiLyIpIHsKICAgICAgaWYgKHN0cmVhbS5lYXQoIi8iKSkgeyBzdHJlYW0uc2tpcFRvRW5kKCk7IHJldHVybiAiY29tbWVudCI7IH0KICAgICAgaWYgKHN0cmVhbS5lYXQoIioiKSkgewogICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5Db21tZW50KDEpOwogICAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgICAgfQogICAgfQogICAgaWYgKGNoID09ICIjIikgewogICAgICBpZiAoc3RyZWFtLmVhdCgiWyIpKSB7IHRjYXQgPSAib3Blbi1hdHRyIjsgcmV0dXJuIG51bGw7IH0KICAgICAgc3RyZWFtLmVhdFdoaWxlKC9cdy8pOwogICAgICByZXR1cm4gcigibWFjcm8iLCAibWV0YSIpOwogICAgfQogICAgaWYgKGNoID09ICI6IiAmJiBzdHJlYW0ubWF0Y2goIjo8IikpIHsKICAgICAgcmV0dXJuIHIoIm9wIiwgbnVsbCk7CiAgICB9CiAgICBpZiAoY2gubWF0Y2goL1xkLykgfHwgKGNoID09ICIuIiAmJiBzdHJlYW0uZWF0KC9cZC8pKSkgewogICAgICB2YXIgZmxwID0gZmFsc2U7CiAgICAgIGlmICghc3RyZWFtLm1hdGNoKC9eeFtcZGEtZl0rL2kpICYmICFzdHJlYW0ubWF0Y2goL15iWzAxXSsvKSkgewogICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvXGQvKTsKICAgICAgICBpZiAoc3RyZWFtLmVhdCgiLiIpKSB7IGZscCA9IHRydWU7IHN0cmVhbS5lYXRXaGlsZSgvXGQvKTsgfQogICAgICAgIGlmIChzdHJlYW0ubWF0Y2goL15lWytcLV0/XGQrL2kpKSB7IGZscCA9IHRydWU7IH0KICAgICAgfQogICAgICBpZiAoZmxwKSBzdHJlYW0ubWF0Y2goL15mKD86MzJ8NjQpLyk7CiAgICAgIGVsc2Ugc3RyZWFtLm1hdGNoKC9eW3VpXSg/Ojh8MTZ8MzJ8NjQpLyk7CiAgICAgIHJldHVybiByKCJhdG9tIiwgIm51bWJlciIpOwogICAgfQogICAgaWYgKGNoLm1hdGNoKC9bKClcW1xde306OyxdLykpIHJldHVybiByKGNoLCBudWxsKTsKICAgIGlmIChjaCA9PSAiLSIgJiYgc3RyZWFtLmVhdCgiPiIpKSByZXR1cm4gcigiLT4iLCBudWxsKTsKICAgIGlmIChjaC5tYXRjaChvcGVyYXRvckNoYXIpKSB7CiAgICAgIHN0cmVhbS5lYXRXaGlsZShvcGVyYXRvckNoYXIpOwogICAgICByZXR1cm4gcigib3AiLCBudWxsKTsKICAgIH0KICAgIHN0cmVhbS5lYXRXaGlsZSgvXHcvKTsKICAgIGNvbnRlbnQgPSBzdHJlYW0uY3VycmVudCgpOwogICAgaWYgKHN0cmVhbS5tYXRjaCgvXjo6XHcvKSkgewogICAgICBzdHJlYW0uYmFja1VwKDEpOwogICAgICByZXR1cm4gcigicHJlZml4IiwgInZhcmlhYmxlLTIiKTsKICAgIH0KICAgIGlmIChzdGF0ZS5rZXl3b3Jkcy5wcm9wZXJ0eUlzRW51bWVyYWJsZShjb250ZW50KSkKICAgICAgcmV0dXJuIHIoc3RhdGUua2V5d29yZHNbY29udGVudF0sIGNvbnRlbnQubWF0Y2goL3RydWV8ZmFsc2UvKSA/ICJhdG9tIiA6ICJrZXl3b3JkIik7CiAgICByZXR1cm4gcigibmFtZSIsICJ2YXJpYWJsZSIpOwogIH0KCiAgZnVuY3Rpb24gdG9rZW5TdHJpbmcoc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIGNoLCBlc2NhcGVkID0gZmFsc2U7CiAgICB3aGlsZSAoY2ggPSBzdHJlYW0ubmV4dCgpKSB7CiAgICAgIGlmIChjaCA9PSAnIicgJiYgIWVzY2FwZWQpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTsKICAgICAgICByZXR1cm4gcigiYXRvbSIsICJzdHJpbmciKTsKICAgICAgfQogICAgICBlc2NhcGVkID0gIWVzY2FwZWQgJiYgY2ggPT0gIlxcIjsKICAgIH0KICAgIC8vIEhhY2sgdG8gbm90IGNvbmZ1c2UgdGhlIHBhcnNlciB3aGVuIGEgc3RyaW5nIGlzIHNwbGl0IGluCiAgICAvLyBwaWVjZXMuCiAgICByZXR1cm4gcigib3AiLCAic3RyaW5nIik7CiAgfQoKICBmdW5jdGlvbiB0b2tlbkNvbW1lbnQoZGVwdGgpIHsKICAgIHJldHVybiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHZhciBsYXN0Q2ggPSBudWxsLCBjaDsKICAgICAgd2hpbGUgKGNoID0gc3RyZWFtLm5leHQoKSkgewogICAgICAgIGlmIChjaCA9PSAiLyIgJiYgbGFzdENoID09ICIqIikgewogICAgICAgICAgaWYgKGRlcHRoID09IDEpIHsKICAgICAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkNvbW1lbnQoZGVwdGggLSAxKTsKICAgICAgICAgICAgcmV0dXJuIHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoY2ggPT0gIioiICYmIGxhc3RDaCA9PSAiLyIpIHsKICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5Db21tZW50KGRlcHRoICsgMSk7CiAgICAgICAgICByZXR1cm4gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CiAgICAgICAgfQogICAgICAgIGxhc3RDaCA9IGNoOwogICAgICB9CiAgICAgIHJldHVybiAiY29tbWVudCI7CiAgICB9OwogIH0KCiAgLy8gUGFyc2VyCgogIHZhciBjeCA9IHtzdGF0ZTogbnVsbCwgc3RyZWFtOiBudWxsLCBtYXJrZWQ6IG51bGwsIGNjOiBudWxsfTsKICBmdW5jdGlvbiBwYXNzKCkgewogICAgZm9yICh2YXIgaSA9IGFyZ3VtZW50cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgY3guY2MucHVzaChhcmd1bWVudHNbaV0pOwogIH0KICBmdW5jdGlvbiBjb250KCkgewogICAgcGFzcy5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgcmV0dXJuIHRydWU7CiAgfQoKICBmdW5jdGlvbiBwdXNobGV4KHR5cGUsIGluZm8pIHsKICAgIHZhciByZXN1bHQgPSBmdW5jdGlvbigpIHsKICAgICAgdmFyIHN0YXRlID0gY3guc3RhdGU7CiAgICAgIHN0YXRlLmxleGljYWwgPSB7aW5kZW50ZWQ6IHN0YXRlLmluZGVudGVkLCBjb2x1bW46IGN4LnN0cmVhbS5jb2x1bW4oKSwKICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB0eXBlLCBwcmV2OiBzdGF0ZS5sZXhpY2FsLCBpbmZvOiBpbmZvfTsKICAgIH07CiAgICByZXN1bHQubGV4ID0gdHJ1ZTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQogIGZ1bmN0aW9uIHBvcGxleCgpIHsKICAgIHZhciBzdGF0ZSA9IGN4LnN0YXRlOwogICAgaWYgKHN0YXRlLmxleGljYWwucHJldikgewogICAgICBpZiAoc3RhdGUubGV4aWNhbC50eXBlID09ICIpIikKICAgICAgICBzdGF0ZS5pbmRlbnRlZCA9IHN0YXRlLmxleGljYWwuaW5kZW50ZWQ7CiAgICAgIHN0YXRlLmxleGljYWwgPSBzdGF0ZS5sZXhpY2FsLnByZXY7CiAgICB9CiAgfQogIGZ1bmN0aW9uIHR5cGVjeCgpIHsgY3guc3RhdGUua2V5d29yZHMgPSB0eXBlS2V5d29yZHM7IH0KICBmdW5jdGlvbiB2YWxjeCgpIHsgY3guc3RhdGUua2V5d29yZHMgPSB2YWxLZXl3b3JkczsgfQogIHBvcGxleC5sZXggPSB0eXBlY3gubGV4ID0gdmFsY3gubGV4ID0gdHJ1ZTsKCiAgZnVuY3Rpb24gY29tbWFzZXAoY29tYiwgZW5kKSB7CiAgICBmdW5jdGlvbiBtb3JlKHR5cGUpIHsKICAgICAgaWYgKHR5cGUgPT0gIiwiKSByZXR1cm4gY29udChjb21iLCBtb3JlKTsKICAgICAgaWYgKHR5cGUgPT0gZW5kKSByZXR1cm4gY29udCgpOwogICAgICByZXR1cm4gY29udChtb3JlKTsKICAgIH0KICAgIHJldHVybiBmdW5jdGlvbih0eXBlKSB7CiAgICAgIGlmICh0eXBlID09IGVuZCkgcmV0dXJuIGNvbnQoKTsKICAgICAgcmV0dXJuIHBhc3MoY29tYiwgbW9yZSk7CiAgICB9OwogIH0KCiAgZnVuY3Rpb24gc3RhdF9vZihjb21iLCB0YWcpIHsKICAgIHJldHVybiBjb250KHB1c2hsZXgoInN0YXQiLCB0YWcpLCBjb21iLCBwb3BsZXgsIGJsb2NrKTsKICB9CiAgZnVuY3Rpb24gYmxvY2sodHlwZSkgewogICAgaWYgKHR5cGUgPT0gIn0iKSByZXR1cm4gY29udCgpOwogICAgaWYgKHR5cGUgPT0gImxldCIpIHJldHVybiBzdGF0X29mKGxldGRlZjEsICJsZXQiKTsKICAgIGlmICh0eXBlID09ICJmbiIpIHJldHVybiBzdGF0X29mKGZuZGVmKTsKICAgIGlmICh0eXBlID09ICJ0eXBlIikgcmV0dXJuIGNvbnQocHVzaGxleCgic3RhdCIpLCB0eWRlZiwgZW5kc3RhdGVtZW50LCBwb3BsZXgsIGJsb2NrKTsKICAgIGlmICh0eXBlID09ICJlbnVtIikgcmV0dXJuIHN0YXRfb2YoZW51bWRlZik7CiAgICBpZiAodHlwZSA9PSAibW9kIikgcmV0dXJuIHN0YXRfb2YobW9kKTsKICAgIGlmICh0eXBlID09ICJpZmFjZSIpIHJldHVybiBzdGF0X29mKGlmYWNlKTsKICAgIGlmICh0eXBlID09ICJpbXBsIikgcmV0dXJuIHN0YXRfb2YoaW1wbCk7CiAgICBpZiAodHlwZSA9PSAib3Blbi1hdHRyIikgcmV0dXJuIGNvbnQocHVzaGxleCgiXSIpLCBjb21tYXNlcChleHByZXNzaW9uLCAiXSIpLCBwb3BsZXgpOwogICAgaWYgKHR5cGUgPT0gImlnbm9yZSIgfHwgdHlwZS5tYXRjaCgvW1xdXCk7LF0vKSkgcmV0dXJuIGNvbnQoYmxvY2spOwogICAgcmV0dXJuIHBhc3MocHVzaGxleCgic3RhdCIpLCBleHByZXNzaW9uLCBwb3BsZXgsIGVuZHN0YXRlbWVudCwgYmxvY2spOwogIH0KICBmdW5jdGlvbiBlbmRzdGF0ZW1lbnQodHlwZSkgewogICAgaWYgKHR5cGUgPT0gIjsiKSByZXR1cm4gY29udCgpOwogICAgcmV0dXJuIHBhc3MoKTsKICB9CiAgZnVuY3Rpb24gZXhwcmVzc2lvbih0eXBlKSB7CiAgICBpZiAodHlwZSA9PSAiYXRvbSIgfHwgdHlwZSA9PSAibmFtZSIpIHJldHVybiBjb250KG1heWJlb3ApOwogICAgaWYgKHR5cGUgPT0gInsiKSByZXR1cm4gY29udChwdXNobGV4KCJ9IiksIGV4cHJicmFjZSwgcG9wbGV4KTsKICAgIGlmICh0eXBlLm1hdGNoKC9bXFtcKF0vKSkgcmV0dXJuIG1hdGNoQnJhY2tldHModHlwZSwgZXhwcmVzc2lvbik7CiAgICBpZiAodHlwZS5tYXRjaCgvW1xdXClcfTssXS8pKSByZXR1cm4gcGFzcygpOwogICAgaWYgKHR5cGUgPT0gImlmLXN0eWxlIikgcmV0dXJuIGNvbnQoZXhwcmVzc2lvbiwgZXhwcmVzc2lvbik7CiAgICBpZiAodHlwZSA9PSAiZWxzZS1zdHlsZSIgfHwgdHlwZSA9PSAib3AiKSByZXR1cm4gY29udChleHByZXNzaW9uKTsKICAgIGlmICh0eXBlID09ICJmb3IiKSByZXR1cm4gY29udChwYXR0ZXJuLCBtYXliZXR5cGUsIGlub3AsIGV4cHJlc3Npb24sIGV4cHJlc3Npb24pOwogICAgaWYgKHR5cGUgPT0gImFsdCIpIHJldHVybiBjb250KGV4cHJlc3Npb24sIGFsdGJvZHkpOwogICAgaWYgKHR5cGUgPT0gImZuIikgcmV0dXJuIGNvbnQoZm5kZWYpOwogICAgaWYgKHR5cGUgPT0gIm1hY3JvIikgcmV0dXJuIGNvbnQobWFjcm8pOwogICAgcmV0dXJuIGNvbnQoKTsKICB9CiAgZnVuY3Rpb24gbWF5YmVvcCh0eXBlKSB7CiAgICBpZiAoY29udGVudCA9PSAiLiIpIHJldHVybiBjb250KG1heWJlcHJvcCk7CiAgICBpZiAoY29udGVudCA9PSAiOjo8Iil7cmV0dXJuIGNvbnQodHlwYXJhbXMsIG1heWJlb3ApO30KICAgIGlmICh0eXBlID09ICJvcCIgfHwgY29udGVudCA9PSAiOiIpIHJldHVybiBjb250KGV4cHJlc3Npb24pOwogICAgaWYgKHR5cGUgPT0gIigiIHx8IHR5cGUgPT0gIlsiKSByZXR1cm4gbWF0Y2hCcmFja2V0cyh0eXBlLCBleHByZXNzaW9uKTsKICAgIHJldHVybiBwYXNzKCk7CiAgfQogIGZ1bmN0aW9uIG1heWJlcHJvcCgpIHsKICAgIGlmIChjb250ZW50Lm1hdGNoKC9eXHcrJC8pKSB7Y3gubWFya2VkID0gInZhcmlhYmxlIjsgcmV0dXJuIGNvbnQobWF5YmVvcCk7fQogICAgcmV0dXJuIHBhc3MoZXhwcmVzc2lvbik7CiAgfQogIGZ1bmN0aW9uIGV4cHJicmFjZSh0eXBlKSB7CiAgICBpZiAodHlwZSA9PSAib3AiKSB7CiAgICAgIGlmIChjb250ZW50ID09ICJ8IikgcmV0dXJuIGNvbnQoYmxvY2t2YXJzLCBwb3BsZXgsIHB1c2hsZXgoIn0iLCAiYmxvY2siKSwgYmxvY2spOwogICAgICBpZiAoY29udGVudCA9PSAifHwiKSByZXR1cm4gY29udChwb3BsZXgsIHB1c2hsZXgoIn0iLCAiYmxvY2siKSwgYmxvY2spOwogICAgfQogICAgaWYgKGNvbnRlbnQgPT0gIm11dGFibGUiIHx8IChjb250ZW50Lm1hdGNoKC9eXHcrJC8pICYmIGN4LnN0cmVhbS5wZWVrKCkgPT0gIjoiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICFjeC5zdHJlYW0ubWF0Y2goIjo6IiwgZmFsc2UpKSkKICAgICAgcmV0dXJuIHBhc3MocmVjb3JkX29mKGV4cHJlc3Npb24pKTsKICAgIHJldHVybiBwYXNzKGJsb2NrKTsKICB9CiAgZnVuY3Rpb24gcmVjb3JkX29mKGNvbWIpIHsKICAgIGZ1bmN0aW9uIHJvKHR5cGUpIHsKICAgICAgaWYgKGNvbnRlbnQgPT0gIm11dGFibGUiIHx8IGNvbnRlbnQgPT0gIndpdGgiKSB7Y3gubWFya2VkID0gImtleXdvcmQiOyByZXR1cm4gY29udChybyk7fQogICAgICBpZiAoY29udGVudC5tYXRjaCgvXlx3KiQvKSkge2N4Lm1hcmtlZCA9ICJ2YXJpYWJsZSI7IHJldHVybiBjb250KHJvKTt9CiAgICAgIGlmICh0eXBlID09ICI6IikgcmV0dXJuIGNvbnQoY29tYiwgcm8pOwogICAgICBpZiAodHlwZSA9PSAifSIpIHJldHVybiBjb250KCk7CiAgICAgIHJldHVybiBjb250KHJvKTsKICAgIH0KICAgIHJldHVybiBybzsKICB9CiAgZnVuY3Rpb24gYmxvY2t2YXJzKHR5cGUpIHsKICAgIGlmICh0eXBlID09ICJuYW1lIikge2N4Lm1hcmtlZCA9ICJkZWYiOyByZXR1cm4gY29udChibG9ja3ZhcnMpO30KICAgIGlmICh0eXBlID09ICJvcCIgJiYgY29udGVudCA9PSAifCIpIHJldHVybiBjb250KCk7CiAgICByZXR1cm4gY29udChibG9ja3ZhcnMpOwogIH0KCiAgZnVuY3Rpb24gbGV0ZGVmMSh0eXBlKSB7CiAgICBpZiAodHlwZS5tYXRjaCgvW1xdXClcfTtdLykpIHJldHVybiBjb250KCk7CiAgICBpZiAoY29udGVudCA9PSAiPSIpIHJldHVybiBjb250KGV4cHJlc3Npb24sIGxldGRlZjIpOwogICAgaWYgKHR5cGUgPT0gIiwiKSByZXR1cm4gY29udChsZXRkZWYxKTsKICAgIHJldHVybiBwYXNzKHBhdHRlcm4sIG1heWJldHlwZSwgbGV0ZGVmMSk7CiAgfQogIGZ1bmN0aW9uIGxldGRlZjIodHlwZSkgewogICAgaWYgKHR5cGUubWF0Y2goL1tcXVwpXH07LF0vKSkgcmV0dXJuIHBhc3MobGV0ZGVmMSk7CiAgICBlbHNlIHJldHVybiBwYXNzKGV4cHJlc3Npb24sIGxldGRlZjIpOwogIH0KICBmdW5jdGlvbiBtYXliZXR5cGUodHlwZSkgewogICAgaWYgKHR5cGUgPT0gIjoiKSByZXR1cm4gY29udCh0eXBlY3gsIHJ0eXBlLCB2YWxjeCk7CiAgICByZXR1cm4gcGFzcygpOwogIH0KICBmdW5jdGlvbiBpbm9wKHR5cGUpIHsKICAgIGlmICh0eXBlID09ICJuYW1lIiAmJiBjb250ZW50ID09ICJpbiIpIHtjeC5tYXJrZWQgPSAia2V5d29yZCI7IHJldHVybiBjb250KCk7fQogICAgcmV0dXJuIHBhc3MoKTsKICB9CiAgZnVuY3Rpb24gZm5kZWYodHlwZSkgewogICAgaWYgKGNvbnRlbnQgPT0gIkAiIHx8IGNvbnRlbnQgPT0gIn4iKSB7Y3gubWFya2VkID0gImtleXdvcmQiOyByZXR1cm4gY29udChmbmRlZik7fQogICAgaWYgKHR5cGUgPT0gIm5hbWUiKSB7Y3gubWFya2VkID0gImRlZiI7IHJldHVybiBjb250KGZuZGVmKTt9CiAgICBpZiAoY29udGVudCA9PSAiPCIpIHJldHVybiBjb250KHR5cGFyYW1zLCBmbmRlZik7CiAgICBpZiAodHlwZSA9PSAieyIpIHJldHVybiBwYXNzKGV4cHJlc3Npb24pOwogICAgaWYgKHR5cGUgPT0gIigiKSByZXR1cm4gY29udChwdXNobGV4KCIpIiksIGNvbW1hc2VwKGFyZ2RlZiwgIikiKSwgcG9wbGV4LCBmbmRlZik7CiAgICBpZiAodHlwZSA9PSAiLT4iKSByZXR1cm4gY29udCh0eXBlY3gsIHJ0eXBlLCB2YWxjeCwgZm5kZWYpOwogICAgaWYgKHR5cGUgPT0gIjsiKSByZXR1cm4gY29udCgpOwogICAgcmV0dXJuIGNvbnQoZm5kZWYpOwogIH0KICBmdW5jdGlvbiB0eWRlZih0eXBlKSB7CiAgICBpZiAodHlwZSA9PSAibmFtZSIpIHtjeC5tYXJrZWQgPSAiZGVmIjsgcmV0dXJuIGNvbnQodHlkZWYpO30KICAgIGlmIChjb250ZW50ID09ICI8IikgcmV0dXJuIGNvbnQodHlwYXJhbXMsIHR5ZGVmKTsKICAgIGlmIChjb250ZW50ID09ICI9IikgcmV0dXJuIGNvbnQodHlwZWN4LCBydHlwZSwgdmFsY3gpOwogICAgcmV0dXJuIGNvbnQodHlkZWYpOwogIH0KICBmdW5jdGlvbiBlbnVtZGVmKHR5cGUpIHsKICAgIGlmICh0eXBlID09ICJuYW1lIikge2N4Lm1hcmtlZCA9ICJkZWYiOyByZXR1cm4gY29udChlbnVtZGVmKTt9CiAgICBpZiAoY29udGVudCA9PSAiPCIpIHJldHVybiBjb250KHR5cGFyYW1zLCBlbnVtZGVmKTsKICAgIGlmIChjb250ZW50ID09ICI9IikgcmV0dXJuIGNvbnQodHlwZWN4LCBydHlwZSwgdmFsY3gsIGVuZHN0YXRlbWVudCk7CiAgICBpZiAodHlwZSA9PSAieyIpIHJldHVybiBjb250KHB1c2hsZXgoIn0iKSwgdHlwZWN4LCBlbnVtYmxvY2ssIHZhbGN4LCBwb3BsZXgpOwogICAgcmV0dXJuIGNvbnQoZW51bWRlZik7CiAgfQogIGZ1bmN0aW9uIGVudW1ibG9jayh0eXBlKSB7CiAgICBpZiAodHlwZSA9PSAifSIpIHJldHVybiBjb250KCk7CiAgICBpZiAodHlwZSA9PSAiKCIpIHJldHVybiBjb250KHB1c2hsZXgoIikiKSwgY29tbWFzZXAocnR5cGUsICIpIiksIHBvcGxleCwgZW51bWJsb2NrKTsKICAgIGlmIChjb250ZW50Lm1hdGNoKC9eXHcrJC8pKSBjeC5tYXJrZWQgPSAiZGVmIjsKICAgIHJldHVybiBjb250KGVudW1ibG9jayk7CiAgfQogIGZ1bmN0aW9uIG1vZCh0eXBlKSB7CiAgICBpZiAodHlwZSA9PSAibmFtZSIpIHtjeC5tYXJrZWQgPSAiZGVmIjsgcmV0dXJuIGNvbnQobW9kKTt9CiAgICBpZiAodHlwZSA9PSAieyIpIHJldHVybiBjb250KHB1c2hsZXgoIn0iKSwgYmxvY2ssIHBvcGxleCk7CiAgICByZXR1cm4gcGFzcygpOwogIH0KICBmdW5jdGlvbiBpZmFjZSh0eXBlKSB7CiAgICBpZiAodHlwZSA9PSAibmFtZSIpIHtjeC5tYXJrZWQgPSAiZGVmIjsgcmV0dXJuIGNvbnQoaWZhY2UpO30KICAgIGlmIChjb250ZW50ID09ICI8IikgcmV0dXJuIGNvbnQodHlwYXJhbXMsIGlmYWNlKTsKICAgIGlmICh0eXBlID09ICJ7IikgcmV0dXJuIGNvbnQocHVzaGxleCgifSIpLCBibG9jaywgcG9wbGV4KTsKICAgIHJldHVybiBwYXNzKCk7CiAgfQogIGZ1bmN0aW9uIGltcGwodHlwZSkgewogICAgaWYgKGNvbnRlbnQgPT0gIjwiKSByZXR1cm4gY29udCh0eXBhcmFtcywgaW1wbCk7CiAgICBpZiAoY29udGVudCA9PSAib2YiIHx8IGNvbnRlbnQgPT0gImZvciIpIHtjeC5tYXJrZWQgPSAia2V5d29yZCI7IHJldHVybiBjb250KHJ0eXBlLCBpbXBsKTt9CiAgICBpZiAodHlwZSA9PSAibmFtZSIpIHtjeC5tYXJrZWQgPSAiZGVmIjsgcmV0dXJuIGNvbnQoaW1wbCk7fQogICAgaWYgKHR5cGUgPT0gInsiKSByZXR1cm4gY29udChwdXNobGV4KCJ9IiksIGJsb2NrLCBwb3BsZXgpOwogICAgcmV0dXJuIHBhc3MoKTsKICB9CiAgZnVuY3Rpb24gdHlwYXJhbXMoKSB7CiAgICBpZiAoY29udGVudCA9PSAiPiIpIHJldHVybiBjb250KCk7CiAgICBpZiAoY29udGVudCA9PSAiLCIpIHJldHVybiBjb250KHR5cGFyYW1zKTsKICAgIGlmIChjb250ZW50ID09ICI6IikgcmV0dXJuIGNvbnQocnR5cGUsIHR5cGFyYW1zKTsKICAgIHJldHVybiBwYXNzKHJ0eXBlLCB0eXBhcmFtcyk7CiAgfQogIGZ1bmN0aW9uIGFyZ2RlZih0eXBlKSB7CiAgICBpZiAodHlwZSA9PSAibmFtZSIpIHtjeC5tYXJrZWQgPSAiZGVmIjsgcmV0dXJuIGNvbnQoYXJnZGVmKTt9CiAgICBpZiAodHlwZSA9PSAiOiIpIHJldHVybiBjb250KHR5cGVjeCwgcnR5cGUsIHZhbGN4KTsKICAgIHJldHVybiBwYXNzKCk7CiAgfQogIGZ1bmN0aW9uIHJ0eXBlKHR5cGUpIHsKICAgIGlmICh0eXBlID09ICJuYW1lIikge2N4Lm1hcmtlZCA9ICJ2YXJpYWJsZS0zIjsgcmV0dXJuIGNvbnQocnR5cGVtYXliZXBhcmFtKTsgfQogICAgaWYgKGNvbnRlbnQgPT0gIm11dGFibGUiKSB7Y3gubWFya2VkID0gImtleXdvcmQiOyByZXR1cm4gY29udChydHlwZSk7fQogICAgaWYgKHR5cGUgPT0gImF0b20iKSByZXR1cm4gY29udChydHlwZW1heWJlcGFyYW0pOwogICAgaWYgKHR5cGUgPT0gIm9wIiB8fCB0eXBlID09ICJvYmoiKSByZXR1cm4gY29udChydHlwZSk7CiAgICBpZiAodHlwZSA9PSAiZm4iKSByZXR1cm4gY29udChmbnR5cGUpOwogICAgaWYgKHR5cGUgPT0gInsiKSByZXR1cm4gY29udChwdXNobGV4KCJ7IiksIHJlY29yZF9vZihydHlwZSksIHBvcGxleCk7CiAgICByZXR1cm4gbWF0Y2hCcmFja2V0cyh0eXBlLCBydHlwZSk7CiAgfQogIGZ1bmN0aW9uIHJ0eXBlbWF5YmVwYXJhbSgpIHsKICAgIGlmIChjb250ZW50ID09ICI8IikgcmV0dXJuIGNvbnQodHlwYXJhbXMpOwogICAgcmV0dXJuIHBhc3MoKTsKICB9CiAgZnVuY3Rpb24gZm50eXBlKHR5cGUpIHsKICAgIGlmICh0eXBlID09ICIoIikgcmV0dXJuIGNvbnQocHVzaGxleCgiKCIpLCBjb21tYXNlcChydHlwZSwgIikiKSwgcG9wbGV4LCBmbnR5cGUpOwogICAgaWYgKHR5cGUgPT0gIi0+IikgcmV0dXJuIGNvbnQocnR5cGUpOwogICAgcmV0dXJuIHBhc3MoKTsKICB9CiAgZnVuY3Rpb24gcGF0dGVybih0eXBlKSB7CiAgICBpZiAodHlwZSA9PSAibmFtZSIpIHtjeC5tYXJrZWQgPSAiZGVmIjsgcmV0dXJuIGNvbnQocGF0dGVybm1heWJlb3ApO30KICAgIGlmICh0eXBlID09ICJhdG9tIikgcmV0dXJuIGNvbnQocGF0dGVybm1heWJlb3ApOwogICAgaWYgKHR5cGUgPT0gIm9wIikgcmV0dXJuIGNvbnQocGF0dGVybik7CiAgICBpZiAodHlwZS5tYXRjaCgvW1xdXClcfTssXS8pKSByZXR1cm4gcGFzcygpOwogICAgcmV0dXJuIG1hdGNoQnJhY2tldHModHlwZSwgcGF0dGVybik7CiAgfQogIGZ1bmN0aW9uIHBhdHRlcm5tYXliZW9wKHR5cGUpIHsKICAgIGlmICh0eXBlID09ICJvcCIgJiYgY29udGVudCA9PSAiLiIpIHJldHVybiBjb250KCk7CiAgICBpZiAoY29udGVudCA9PSAidG8iKSB7Y3gubWFya2VkID0gImtleXdvcmQiOyByZXR1cm4gY29udChwYXR0ZXJuKTt9CiAgICBlbHNlIHJldHVybiBwYXNzKCk7CiAgfQogIGZ1bmN0aW9uIGFsdGJvZHkodHlwZSkgewogICAgaWYgKHR5cGUgPT0gInsiKSByZXR1cm4gY29udChwdXNobGV4KCJ9IiwgImFsdCIpLCBhbHRibG9jazEsIHBvcGxleCk7CiAgICByZXR1cm4gcGFzcygpOwogIH0KICBmdW5jdGlvbiBhbHRibG9jazEodHlwZSkgewogICAgaWYgKHR5cGUgPT0gIn0iKSByZXR1cm4gY29udCgpOwogICAgaWYgKHR5cGUgPT0gInwiKSByZXR1cm4gY29udChhbHRibG9jazEpOwogICAgaWYgKGNvbnRlbnQgPT0gIndoZW4iKSB7Y3gubWFya2VkID0gImtleXdvcmQiOyByZXR1cm4gY29udChleHByZXNzaW9uLCBhbHRibG9jazIpO30KICAgIGlmICh0eXBlLm1hdGNoKC9bXF1cKTssXS8pKSByZXR1cm4gY29udChhbHRibG9jazEpOwogICAgcmV0dXJuIHBhc3MocGF0dGVybiwgYWx0YmxvY2syKTsKICB9CiAgZnVuY3Rpb24gYWx0YmxvY2syKHR5cGUpIHsKICAgIGlmICh0eXBlID09ICJ7IikgcmV0dXJuIGNvbnQocHVzaGxleCgifSIsICJhbHQiKSwgYmxvY2ssIHBvcGxleCwgYWx0YmxvY2sxKTsKICAgIGVsc2UgcmV0dXJuIHBhc3MoYWx0YmxvY2sxKTsKICB9CgogIGZ1bmN0aW9uIG1hY3JvKHR5cGUpIHsKICAgIGlmICh0eXBlLm1hdGNoKC9bXFtcKFx7XS8pKSByZXR1cm4gbWF0Y2hCcmFja2V0cyh0eXBlLCBleHByZXNzaW9uKTsKICAgIHJldHVybiBwYXNzKCk7CiAgfQogIGZ1bmN0aW9uIG1hdGNoQnJhY2tldHModHlwZSwgY29tYikgewogICAgaWYgKHR5cGUgPT0gIlsiKSByZXR1cm4gY29udChwdXNobGV4KCJdIiksIGNvbW1hc2VwKGNvbWIsICJdIiksIHBvcGxleCk7CiAgICBpZiAodHlwZSA9PSAiKCIpIHJldHVybiBjb250KHB1c2hsZXgoIikiKSwgY29tbWFzZXAoY29tYiwgIikiKSwgcG9wbGV4KTsKICAgIGlmICh0eXBlID09ICJ7IikgcmV0dXJuIGNvbnQocHVzaGxleCgifSIpLCBjb21tYXNlcChjb21iLCAifSIpLCBwb3BsZXgpOwogICAgcmV0dXJuIGNvbnQoKTsKICB9CgogIGZ1bmN0aW9uIHBhcnNlKHN0YXRlLCBzdHJlYW0sIHN0eWxlKSB7CiAgICB2YXIgY2MgPSBzdGF0ZS5jYzsKICAgIC8vIENvbW11bmljYXRlIG91ciBjb250ZXh0IHRvIHRoZSBjb21iaW5hdG9ycy4KICAgIC8vIChMZXNzIHdhc3RlZnVsIHRoYW4gY29uc2luZyB1cCBhIGh1bmRyZWQgY2xvc3VyZXMgb24gZXZlcnkgY2FsbC4pCiAgICBjeC5zdGF0ZSA9IHN0YXRlOyBjeC5zdHJlYW0gPSBzdHJlYW07IGN4Lm1hcmtlZCA9IG51bGwsIGN4LmNjID0gY2M7CgogICAgd2hpbGUgKHRydWUpIHsKICAgICAgdmFyIGNvbWJpbmF0b3IgPSBjYy5sZW5ndGggPyBjYy5wb3AoKSA6IGJsb2NrOwogICAgICBpZiAoY29tYmluYXRvcih0Y2F0KSkgewogICAgICAgIHdoaWxlKGNjLmxlbmd0aCAmJiBjY1tjYy5sZW5ndGggLSAxXS5sZXgpCiAgICAgICAgICBjYy5wb3AoKSgpOwogICAgICAgIHJldHVybiBjeC5tYXJrZWQgfHwgc3R5bGU7CiAgICAgIH0KICAgIH0KICB9CgogIHJldHVybiB7CiAgICBzdGFydFN0YXRlOiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICB0b2tlbml6ZTogdG9rZW5CYXNlLAogICAgICAgIGNjOiBbXSwKICAgICAgICBsZXhpY2FsOiB7aW5kZW50ZWQ6IC1pbmRlbnRVbml0LCBjb2x1bW46IDAsIHR5cGU6ICJ0b3AiLCBhbGlnbjogZmFsc2V9LAogICAgICAgIGtleXdvcmRzOiB2YWxLZXl3b3JkcywKICAgICAgICBpbmRlbnRlZDogMAogICAgICB9OwogICAgfSwKCiAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICBpZiAoc3RyZWFtLnNvbCgpKSB7CiAgICAgICAgaWYgKCFzdGF0ZS5sZXhpY2FsLmhhc093blByb3BlcnR5KCJhbGlnbiIpKQogICAgICAgICAgc3RhdGUubGV4aWNhbC5hbGlnbiA9IGZhbHNlOwogICAgICAgIHN0YXRlLmluZGVudGVkID0gc3RyZWFtLmluZGVudGF0aW9uKCk7CiAgICAgIH0KICAgICAgaWYgKHN0cmVhbS5lYXRTcGFjZSgpKSByZXR1cm4gbnVsbDsKICAgICAgdGNhdCA9IGNvbnRlbnQgPSBudWxsOwogICAgICB2YXIgc3R5bGUgPSBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgICAgaWYgKHN0eWxlID09ICJjb21tZW50IikgcmV0dXJuIHN0eWxlOwogICAgICBpZiAoIXN0YXRlLmxleGljYWwuaGFzT3duUHJvcGVydHkoImFsaWduIikpCiAgICAgICAgc3RhdGUubGV4aWNhbC5hbGlnbiA9IHRydWU7CiAgICAgIGlmICh0Y2F0ID09ICJwcmVmaXgiKSByZXR1cm4gc3R5bGU7CiAgICAgIGlmICghY29udGVudCkgY29udGVudCA9IHN0cmVhbS5jdXJyZW50KCk7CiAgICAgIHJldHVybiBwYXJzZShzdGF0ZSwgc3RyZWFtLCBzdHlsZSk7CiAgICB9LAoKICAgIGluZGVudDogZnVuY3Rpb24oc3RhdGUsIHRleHRBZnRlcikgewogICAgICBpZiAoc3RhdGUudG9rZW5pemUgIT0gdG9rZW5CYXNlKSByZXR1cm4gMDsKICAgICAgdmFyIGZpcnN0Q2hhciA9IHRleHRBZnRlciAmJiB0ZXh0QWZ0ZXIuY2hhckF0KDApLCBsZXhpY2FsID0gc3RhdGUubGV4aWNhbCwKICAgICAgICAgIHR5cGUgPSBsZXhpY2FsLnR5cGUsIGNsb3NpbmcgPSBmaXJzdENoYXIgPT0gdHlwZTsKICAgICAgaWYgKHR5cGUgPT0gInN0YXQiKSByZXR1cm4gbGV4aWNhbC5pbmRlbnRlZCArIGluZGVudFVuaXQ7CiAgICAgIGlmIChsZXhpY2FsLmFsaWduKSByZXR1cm4gbGV4aWNhbC5jb2x1bW4gKyAoY2xvc2luZyA/IDAgOiAxKTsKICAgICAgcmV0dXJuIGxleGljYWwuaW5kZW50ZWQgKyAoY2xvc2luZyA/IDAgOiAobGV4aWNhbC5pbmZvID09ICJhbHQiID8gYWx0SW5kZW50VW5pdCA6IGluZGVudFVuaXQpKTsKICAgIH0sCgogICAgZWxlY3RyaWNDaGFyczogInt9IiwKICAgIGJsb2NrQ29tbWVudFN0YXJ0OiAiLyoiLAogICAgYmxvY2tDb21tZW50RW5kOiAiKi8iLAogICAgbGluZUNvbW1lbnQ6ICIvLyIsCiAgICBmb2xkOiAiYnJhY2UiCiAgfTsKfSk7CgpDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveC1ydXN0c3JjIiwgInJ1c3QiKTsKCn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/sass/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/sass/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogU2FzcyBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uLy4uL2FkZG9uL2VkaXQvbWF0Y2hicmFja2V0cy5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJzYXNzLmpzIj48L3NjcmlwdD4KPHN0eWxlPi5Db2RlTWlycm9yIHtib3JkZXI6IDFweCBzb2xpZCAjZGRkOyBmb250LXNpemU6MTJweDsgaGVpZ2h0OiA0MDBweH08L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5TYXNzPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5TYXNzIG1vZGU8L2gyPgo8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPi8vIFZhcmlhYmxlIERlZmluaXRpb25zCgokcGFnZS13aWR0aDogICAgODAwcHgKJHNpZGViYXItd2lkdGg6IDIwMHB4CiRwcmltYXJ5LWNvbG9yOiAjZWVlZWVlCgovLyBHbG9iYWwgQXR0cmlidXRlcwoKYm9keQogIGZvbnQ6CiAgICBmYW1pbHk6IHNhbnMtc2VyaWYKICAgIHNpemU6IDMwZW0KICAgIHdlaWdodDogYm9sZAoKLy8gU2NvcGVkIFN0eWxlcwoKI2NvbnRlbnRzCiAgd2lkdGg6ICRwYWdlLXdpZHRoCiAgI3NpZGViYXIKICAgIGZsb2F0OiByaWdodAogICAgd2lkdGg6ICRzaWRlYmFyLXdpZHRoCiAgI21haW4KICAgIHdpZHRoOiAkcGFnZS13aWR0aCAtICRzaWRlYmFyLXdpZHRoCiAgICBiYWNrZ3JvdW5kOiAkcHJpbWFyeS1jb2xvcgogICAgaDIKICAgICAgY29sb3I6IGJsdWUKCiNmb290ZXIKICBoZWlnaHQ6IDIwMHB4CjwvdGV4dGFyZWE+PC9mb3JtPgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICBsaW5lTnVtYmVycyA6IHRydWUsCiAgICAgICAgbWF0Y2hCcmFja2V0cyA6IHRydWUKICAgICAgfSk7CiAgICA8L3NjcmlwdD4KCiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC94LXNhc3M8L2NvZGU+LjwvcD4KICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/sass/sass.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJzYXNzIiwgZnVuY3Rpb24oY29uZmlnKSB7CiAgdmFyIHRva2VuUmVnZXhwID0gZnVuY3Rpb24od29yZHMpewogICAgcmV0dXJuIG5ldyBSZWdFeHAoIl4iICsgd29yZHMuam9pbigifCIpKTsKICB9OwoKICB2YXIga2V5d29yZHMgPSBbInRydWUiLCAiZmFsc2UiLCAibnVsbCIsICJhdXRvIl07CiAgdmFyIGtleXdvcmRzUmVnZXhwID0gbmV3IFJlZ0V4cCgiXiIgKyBrZXl3b3Jkcy5qb2luKCJ8IikpOwoKICB2YXIgb3BlcmF0b3JzID0gWyJcXCgiLCAiXFwpIiwgIj0iLCAiPiIsICI8IiwgIj09IiwgIj49IiwgIjw9IiwgIlxcKyIsICItIiwgIlxcIT0iLCAiLyIsICJcXCoiLCAiJSIsICJhbmQiLCAib3IiLCAibm90Il07CiAgdmFyIG9wUmVnZXhwID0gdG9rZW5SZWdleHAob3BlcmF0b3JzKTsKCiAgdmFyIHBzZXVkb0VsZW1lbnRzUmVnZXhwID0gL146Oj9bXHdcLV0rLzsKCiAgdmFyIHVybFRva2VucyA9IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpewogICAgdmFyIGNoID0gc3RyZWFtLnBlZWsoKTsKCiAgICBpZiAoY2ggPT09ICIpIil7CiAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgIHN0YXRlLnRva2VuaXplciA9IHRva2VuQmFzZTsKICAgICAgcmV0dXJuICJvcGVyYXRvciI7CiAgICB9ZWxzZSBpZiAoY2ggPT09ICIoIil7CiAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgIHN0cmVhbS5lYXRTcGFjZSgpOwoKICAgICAgcmV0dXJuICJvcGVyYXRvciI7CiAgICB9ZWxzZSBpZiAoY2ggPT09ICInIiB8fCBjaCA9PT0gJyInKXsKICAgICAgc3RhdGUudG9rZW5pemVyID0gYnVpbGRTdHJpbmdUb2tlbml6ZXIoc3RyZWFtLm5leHQoKSk7CiAgICAgIHJldHVybiAic3RyaW5nIjsKICAgIH1lbHNlewogICAgICBzdGF0ZS50b2tlbml6ZXIgPSBidWlsZFN0cmluZ1Rva2VuaXplcigiKSIsIGZhbHNlKTsKICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgfQogIH07CiAgdmFyIG11bHRpbGluZUNvbW1lbnQgPSBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICBpZiAoc3RyZWFtLnNraXBUbygiKi8iKSl7CiAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgIHN0YXRlLnRva2VuaXplciA9IHRva2VuQmFzZTsKICAgIH1lbHNlIHsKICAgICAgc3RyZWFtLm5leHQoKTsKICAgIH0KCiAgICByZXR1cm4gImNvbW1lbnQiOwogIH07CgogIHZhciBidWlsZFN0cmluZ1Rva2VuaXplciA9IGZ1bmN0aW9uKHF1b3RlLCBncmVlZHkpewogICAgaWYoZ3JlZWR5ID09IG51bGwpeyBncmVlZHkgPSB0cnVlOyB9CgogICAgZnVuY3Rpb24gc3RyaW5nVG9rZW5pemVyKHN0cmVhbSwgc3RhdGUpewogICAgICB2YXIgbmV4dENoYXIgPSBzdHJlYW0ubmV4dCgpOwogICAgICB2YXIgcGVla0NoYXIgPSBzdHJlYW0ucGVlaygpOwogICAgICB2YXIgcHJldmlvdXNDaGFyID0gc3RyZWFtLnN0cmluZy5jaGFyQXQoc3RyZWFtLnBvcy0yKTsKCiAgICAgIHZhciBlbmRpbmdTdHJpbmcgPSAoKG5leHRDaGFyICE9PSAiXFwiICYmIHBlZWtDaGFyID09PSBxdW90ZSkgfHwgKG5leHRDaGFyID09PSBxdW90ZSAmJiBwcmV2aW91c0NoYXIgIT09ICJcXCIpKTsKCiAgICAgIC8qCiAgICAgIGNvbnNvbGUubG9nKCJwcmV2aW91c0NoYXI6ICIgKyBwcmV2aW91c0NoYXIpOwogICAgICBjb25zb2xlLmxvZygibmV4dENoYXI6ICIgKyBuZXh0Q2hhcik7CiAgICAgIGNvbnNvbGUubG9nKCJwZWVrQ2hhcjogIiArIHBlZWtDaGFyKTsKICAgICAgY29uc29sZS5sb2coImVuZGluZzogIiArIGVuZGluZ1N0cmluZyk7CiAgICAgICovCgogICAgICBpZiAoZW5kaW5nU3RyaW5nKXsKICAgICAgICBpZiAobmV4dENoYXIgIT09IHF1b3RlICYmIGdyZWVkeSkgeyBzdHJlYW0ubmV4dCgpOyB9CiAgICAgICAgc3RhdGUudG9rZW5pemVyID0gdG9rZW5CYXNlOwogICAgICAgIHJldHVybiAic3RyaW5nIjsKICAgICAgfWVsc2UgaWYgKG5leHRDaGFyID09PSAiIyIgJiYgcGVla0NoYXIgPT09ICJ7Iil7CiAgICAgICAgc3RhdGUudG9rZW5pemVyID0gYnVpbGRJbnRlcnBvbGF0aW9uVG9rZW5pemVyKHN0cmluZ1Rva2VuaXplcik7CiAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgICByZXR1cm4gIm9wZXJhdG9yIjsKICAgICAgfWVsc2UgewogICAgICAgIHJldHVybiAic3RyaW5nIjsKICAgICAgfQogICAgfQoKICAgIHJldHVybiBzdHJpbmdUb2tlbml6ZXI7CiAgfTsKCiAgdmFyIGJ1aWxkSW50ZXJwb2xhdGlvblRva2VuaXplciA9IGZ1bmN0aW9uKGN1cnJlbnRUb2tlbml6ZXIpewogICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpewogICAgICBpZiAoc3RyZWFtLnBlZWsoKSA9PT0gIn0iKXsKICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgIHN0YXRlLnRva2VuaXplciA9IGN1cnJlbnRUb2tlbml6ZXI7CiAgICAgICAgcmV0dXJuICJvcGVyYXRvciI7CiAgICAgIH1lbHNlewogICAgICAgIHJldHVybiB0b2tlbkJhc2Uoc3RyZWFtLCBzdGF0ZSk7CiAgICAgIH0KICAgIH07CiAgfTsKCiAgdmFyIGluZGVudCA9IGZ1bmN0aW9uKHN0YXRlKXsKICAgIGlmIChzdGF0ZS5pbmRlbnRDb3VudCA9PSAwKXsKICAgICAgc3RhdGUuaW5kZW50Q291bnQrKzsKICAgICAgdmFyIGxhc3RTY29wZU9mZnNldCA9IHN0YXRlLnNjb3Blc1swXS5vZmZzZXQ7CiAgICAgIHZhciBjdXJyZW50T2Zmc2V0ID0gbGFzdFNjb3BlT2Zmc2V0ICsgY29uZmlnLmluZGVudFVuaXQ7CiAgICAgIHN0YXRlLnNjb3Blcy51bnNoaWZ0KHsgb2Zmc2V0OmN1cnJlbnRPZmZzZXQgfSk7CiAgICB9CiAgfTsKCiAgdmFyIGRlZGVudCA9IGZ1bmN0aW9uKHN0YXRlKXsKICAgIGlmIChzdGF0ZS5zY29wZXMubGVuZ3RoID09IDEpIHsgcmV0dXJuOyB9CgogICAgc3RhdGUuc2NvcGVzLnNoaWZ0KCk7CiAgfTsKCiAgdmFyIHRva2VuQmFzZSA9IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBjaCA9IHN0cmVhbS5wZWVrKCk7CgogICAgLy8gU2luZ2xlIGxpbmUgQ29tbWVudAogICAgaWYgKHN0cmVhbS5tYXRjaCgnLy8nKSkgewogICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICAgIHJldHVybiAiY29tbWVudCI7CiAgICB9CgogICAgLy8gTXVsdGlsaW5lIENvbW1lbnQKICAgIGlmIChzdHJlYW0ubWF0Y2goJy8qJykpewogICAgICBzdGF0ZS50b2tlbml6ZXIgPSBtdWx0aWxpbmVDb21tZW50OwogICAgICByZXR1cm4gc3RhdGUudG9rZW5pemVyKHN0cmVhbSwgc3RhdGUpOwogICAgfQoKICAgIC8vIEludGVycG9sYXRpb24KICAgIGlmIChzdHJlYW0ubWF0Y2goJyN7JykpewogICAgc3RhdGUudG9rZW5pemVyID0gYnVpbGRJbnRlcnBvbGF0aW9uVG9rZW5pemVyKHRva2VuQmFzZSk7CiAgICAgIHJldHVybiAib3BlcmF0b3IiOwogICAgfQoKICAgIGlmIChjaCA9PT0gIi4iKXsKICAgICAgc3RyZWFtLm5leHQoKTsKCiAgICAgIC8vIE1hdGNoIGNsYXNzIHNlbGVjdG9ycwogICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eW1x3LV0rLykpewogICAgICAgIGluZGVudChzdGF0ZSk7CiAgICAgICAgcmV0dXJuICJhdG9tIjsKICAgICAgfWVsc2UgaWYgKHN0cmVhbS5wZWVrKCkgPT09ICIjIil7CiAgICAgICAgaW5kZW50KHN0YXRlKTsKICAgICAgICByZXR1cm4gImF0b20iOwogICAgICB9ZWxzZXsKICAgICAgICByZXR1cm4gIm9wZXJhdG9yIjsKICAgICAgfQogICAgfQoKICAgIGlmIChjaCA9PT0gIiMiKXsKICAgICAgc3RyZWFtLm5leHQoKTsKCiAgICAgIC8vIEhleCBudW1iZXJzCiAgICAgIGlmIChzdHJlYW0ubWF0Y2goL1swLTlhLWZBLUZdezZ9fFswLTlhLWZBLUZdezN9LykpewogICAgICAgIHJldHVybiAibnVtYmVyIjsKICAgICAgfQoKICAgICAgLy8gSUQgc2VsZWN0b3JzCiAgICAgIGlmIChzdHJlYW0ubWF0Y2goL15bXHctXSsvKSl7CiAgICAgICAgaW5kZW50KHN0YXRlKTsKICAgICAgICByZXR1cm4gImF0b20iOwogICAgICB9CgogICAgICBpZiAoc3RyZWFtLnBlZWsoKSA9PT0gIiMiKXsKICAgICAgICBpbmRlbnQoc3RhdGUpOwogICAgICAgIHJldHVybiAiYXRvbSI7CiAgICAgIH0KICAgIH0KCiAgICAvLyBOdW1iZXJzCiAgICBpZiAoc3RyZWFtLm1hdGNoKC9eLT9bMC05XC5dKy8pKXsKICAgICAgcmV0dXJuICJudW1iZXIiOwogICAgfQoKICAgIC8vIFVuaXRzCiAgICBpZiAoc3RyZWFtLm1hdGNoKC9eKHB4fGVtfGluKVxiLykpewogICAgICByZXR1cm4gInVuaXQiOwogICAgfQoKICAgIGlmIChzdHJlYW0ubWF0Y2goa2V5d29yZHNSZWdleHApKXsKICAgICAgcmV0dXJuICJrZXl3b3JkIjsKICAgIH0KCiAgICBpZiAoc3RyZWFtLm1hdGNoKC9edXJsLykgJiYgc3RyZWFtLnBlZWsoKSA9PT0gIigiKXsKICAgICAgc3RhdGUudG9rZW5pemVyID0gdXJsVG9rZW5zOwogICAgICByZXR1cm4gImF0b20iOwogICAgfQoKICAgIC8vIFZhcmlhYmxlcwogICAgaWYgKGNoID09PSAiJCIpewogICAgICBzdHJlYW0ubmV4dCgpOwogICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcdy1dLyk7CgogICAgICBpZiAoc3RyZWFtLnBlZWsoKSA9PT0gIjoiKXsKICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgIHJldHVybiAidmFyaWFibGUtMiI7CiAgICAgIH1lbHNlewogICAgICAgIHJldHVybiAidmFyaWFibGUtMyI7CiAgICAgIH0KICAgIH0KCiAgICBpZiAoY2ggPT09ICIhIil7CiAgICAgIHN0cmVhbS5uZXh0KCk7CgogICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eW1x3XSsvKSl7CiAgICAgICAgcmV0dXJuICJrZXl3b3JkIjsKICAgICAgfQoKICAgICAgcmV0dXJuICJvcGVyYXRvciI7CiAgICB9CgogICAgaWYgKGNoID09PSAiPSIpewogICAgICBzdHJlYW0ubmV4dCgpOwoKICAgICAgLy8gTWF0Y2ggc2hvcnRjdXQgbWl4aW4gZGVmaW5pdGlvbgogICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eW1x3LV0rLykpewogICAgICAgIGluZGVudChzdGF0ZSk7CiAgICAgICAgcmV0dXJuICJtZXRhIjsKICAgICAgfWVsc2UgewogICAgICAgIHJldHVybiAib3BlcmF0b3IiOwogICAgICB9CiAgICB9CgogICAgaWYgKGNoID09PSAiKyIpewogICAgICBzdHJlYW0ubmV4dCgpOwoKICAgICAgLy8gTWF0Y2ggc2hvcnRjdXQgbWl4aW4gZGVmaW5pdGlvbgogICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eW1x3LV0rLykpewogICAgICAgIHJldHVybiAidmFyaWFibGUtMyI7CiAgICAgIH1lbHNlIHsKICAgICAgICByZXR1cm4gIm9wZXJhdG9yIjsKICAgICAgfQogICAgfQoKICAgIC8vIEluZGVudCBEaXJlY3RpdmVzCiAgICBpZiAoc3RyZWFtLm1hdGNoKC9eQChlbHNlIGlmfGlmfG1lZGlhfGVsc2V8Zm9yfGVhY2h8d2hpbGV8bWl4aW58ZnVuY3Rpb24pLykpewogICAgICBpbmRlbnQoc3RhdGUpOwogICAgICByZXR1cm4gIm1ldGEiOwogICAgfQoKICAgIC8vIE90aGVyIERpcmVjdGl2ZXMKICAgIGlmIChjaCA9PT0gIkAiKXsKICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXHctXS8pOwogICAgICByZXR1cm4gIm1ldGEiOwogICAgfQoKICAgIC8vIFN0cmluZ3MKICAgIGlmIChjaCA9PT0gJyInIHx8IGNoID09PSAiJyIpewogICAgICBzdHJlYW0ubmV4dCgpOwogICAgICBzdGF0ZS50b2tlbml6ZXIgPSBidWlsZFN0cmluZ1Rva2VuaXplcihjaCk7CiAgICAgIHJldHVybiAic3RyaW5nIjsKICAgIH0KCiAgICAvLyBQc2V1ZG8gZWxlbWVudCBzZWxlY3RvcnMKICAgIGlmIChjaCA9PSAnOicgJiYgc3RyZWFtLm1hdGNoKHBzZXVkb0VsZW1lbnRzUmVnZXhwKSl7CiAgICAgIHJldHVybiAia2V5d29yZCI7CiAgICB9CgogICAgLy8gYXRvbXMKICAgIGlmIChzdHJlYW0uZWF0V2hpbGUoL1tcdy0mXS8pKXsKICAgICAgLy8gbWF0Y2hlcyBhIHByb3BlcnR5IGRlZmluaXRpb24KICAgICAgaWYgKHN0cmVhbS5wZWVrKCkgPT09ICI6IiAmJiAhc3RyZWFtLm1hdGNoKHBzZXVkb0VsZW1lbnRzUmVnZXhwLCBmYWxzZSkpCiAgICAgICAgcmV0dXJuICJwcm9wZXJ0eSI7CiAgICAgIGVsc2UKICAgICAgICByZXR1cm4gImF0b20iOwogICAgfQoKICAgIGlmIChzdHJlYW0ubWF0Y2gob3BSZWdleHApKXsKICAgICAgcmV0dXJuICJvcGVyYXRvciI7CiAgICB9CgogICAgLy8gSWYgd2UgaGF2ZW4ndCByZXR1cm5lZCBieSBub3csIHdlIG1vdmUgMSBjaGFyYWN0ZXIKICAgIC8vIGFuZCByZXR1cm4gYW4gZXJyb3IKICAgIHN0cmVhbS5uZXh0KCk7CiAgICByZXR1cm4gbnVsbDsKICB9OwoKICB2YXIgdG9rZW5MZXhlciA9IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgIGlmIChzdHJlYW0uc29sKCkpewogICAgICBzdGF0ZS5pbmRlbnRDb3VudCA9IDA7CiAgICB9CiAgICB2YXIgc3R5bGUgPSBzdGF0ZS50b2tlbml6ZXIoc3RyZWFtLCBzdGF0ZSk7CiAgICB2YXIgY3VycmVudCA9IHN0cmVhbS5jdXJyZW50KCk7CgogICAgaWYgKGN1cnJlbnQgPT09ICJAcmV0dXJuIil7CiAgICAgIGRlZGVudChzdGF0ZSk7CiAgICB9CgogICAgaWYgKHN0eWxlID09PSAiYXRvbSIpewogICAgICBpbmRlbnQoc3RhdGUpOwogICAgfQoKICAgIGlmIChzdHlsZSAhPT0gbnVsbCl7CiAgICAgIHZhciBzdGFydE9mVG9rZW4gPSBzdHJlYW0ucG9zIC0gY3VycmVudC5sZW5ndGg7CiAgICAgIHZhciB3aXRoQ3VycmVudEluZGVudCA9IHN0YXJ0T2ZUb2tlbiArIChjb25maWcuaW5kZW50VW5pdCAqIHN0YXRlLmluZGVudENvdW50KTsKCiAgICAgIHZhciBuZXdTY29wZXMgPSBbXTsKCiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RhdGUuc2NvcGVzLmxlbmd0aDsgaSsrKXsKICAgICAgICB2YXIgc2NvcGUgPSBzdGF0ZS5zY29wZXNbaV07CgogICAgICAgIGlmIChzY29wZS5vZmZzZXQgPD0gd2l0aEN1cnJlbnRJbmRlbnQpewogICAgICAgICAgbmV3U2NvcGVzLnB1c2goc2NvcGUpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgc3RhdGUuc2NvcGVzID0gbmV3U2NvcGVzOwogICAgfQoKCiAgICByZXR1cm4gc3R5bGU7CiAgfTsKCiAgcmV0dXJuIHsKICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gewogICAgICAgIHRva2VuaXplcjogdG9rZW5CYXNlLAogICAgICAgIHNjb3BlczogW3tvZmZzZXQ6IDAsIHR5cGU6ICdzYXNzJ31dLAogICAgICAgIGRlZmluZWRWYXJzOiBbXSwKICAgICAgICBkZWZpbmVkTWl4aW5zOiBbXQogICAgICB9OwogICAgfSwKICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHZhciBzdHlsZSA9IHRva2VuTGV4ZXIoc3RyZWFtLCBzdGF0ZSk7CgogICAgICBzdGF0ZS5sYXN0VG9rZW4gPSB7IHN0eWxlOiBzdHlsZSwgY29udGVudDogc3RyZWFtLmN1cnJlbnQoKSB9OwoKICAgICAgcmV0dXJuIHN0eWxlOwogICAgfSwKCiAgICBpbmRlbnQ6IGZ1bmN0aW9uKHN0YXRlKSB7CiAgICAgIHJldHVybiBzdGF0ZS5zY29wZXNbMF0ub2Zmc2V0OwogICAgfQogIH07Cn0pOwoKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtc2FzcyIsICJzYXNzIik7Cgp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/scheme/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/scheme/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogU2NoZW1lIG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0ic2NoZW1lLmpzIj48L3NjcmlwdD4KPHN0eWxlPi5Db2RlTWlycm9yIHtiYWNrZ3JvdW5kOiAjZjhmOGY4O308L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5TY2hlbWU8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPlNjaGVtZSBtb2RlPC9oMj4KPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KOyBTZWUgaWYgdGhlIGlucHV0IHN0YXJ0cyB3aXRoIGEgZ2l2ZW4gc3ltYm9sLgooZGVmaW5lIChtYXRjaC1zeW1ib2wgaW5wdXQgcGF0dGVybikKICAoY29uZCAoKG51bGw/IChyZW1haW4gaW5wdXQpKSAjZikKCSgoZXF2PyAoY2FyIChyZW1haW4gaW5wdXQpKSBwYXR0ZXJuKSAoci1jZHIgaW5wdXQpKQoJKGVsc2UgI2YpKSkKCjsgQWxsb3cgdGhlIGlucHV0IHRvIHN0YXJ0IHdpdGggb25lIG9mIGEgbGlzdCBvZiBwYXR0ZXJucy4KKGRlZmluZSAobWF0Y2gtb3IgaW5wdXQgcGF0dGVybikKICAoY29uZCAoKG51bGw/IHBhdHRlcm4pICNmKQoJKChtYXRjaC1wYXR0ZXJuIGlucHV0IChjYXIgcGF0dGVybikpKQoJKGVsc2UgKG1hdGNoLW9yIGlucHV0IChjZHIgcGF0dGVybikpKSkpCgo7IEFsbG93IGEgc2VxdWVuY2Ugb2YgcGF0dGVybnMuCihkZWZpbmUgKG1hdGNoLXNlcSBpbnB1dCBwYXR0ZXJuKQogIChpZiAobnVsbD8gcGF0dGVybikKICAgICAgaW5wdXQKICAgICAgKGxldCAoKG1hdGNoIChtYXRjaC1wYXR0ZXJuIGlucHV0IChjYXIgcGF0dGVybikpKSkKCShpZiBtYXRjaCAobWF0Y2gtc2VxIG1hdGNoIChjZHIgcGF0dGVybikpICNmKSkpKQoKOyBNYXRjaCB3aXRoIHRoZSBwYXR0ZXJuIGJ1dCBubyBwcm9ibGVtIGlmIGl0IGRvZXMgbm90IG1hdGNoLgooZGVmaW5lIChtYXRjaC1vcHQgaW5wdXQgcGF0dGVybikKICAobGV0ICgobWF0Y2ggKG1hdGNoLXBhdHRlcm4gaW5wdXQgKGNhciBwYXR0ZXJuKSkpKQogICAgKGlmIG1hdGNoIG1hdGNoIGlucHV0KSkpCgo7IE1hdGNoIGFueXRoaW5nIChvdGhlciB0aGFuICcoKSksIHVudGlsIHBhdHRlcm4gaXMgZm91bmQuIFRoZSByYXRoZXIKOyBjbHVtc3kgZm9ybSBvZiByZXF1aXJpbmcgYW4gZW5kaW5nIHBhdHRlcm4gaXMgbmVlZGVkIHRvIGRlY2lkZSB3aGVyZQo7IHRoZSBlbmQgb2YgdGhlIG1hdGNoIGlzLiBJZiBub25lIGlzIGdpdmVuLCB0aGlzIHdpbGwgbWF0Y2ggdGhlIHJlc3QKOyBvZiB0aGUgc2VudGVuY2UuCihkZWZpbmUgKG1hdGNoLWFueSBpbnB1dCBwYXR0ZXJuKQogIChjb25kICgobnVsbD8gKHJlbWFpbiBpbnB1dCkpICNmKQoJKChudWxsPyBwYXR0ZXJuKSAoZi1jb25zIChyZW1haW4gaW5wdXQpIChjbGVhci1yZW1haW4gaW5wdXQpKSkKCShlbHNlCgkgKGxldCAoKGFjY3VtLWFueSAoY29sbGVjdG9yKSkpCgkgICAoZGVmaW5lIChtYXRjaC1wYXR0ZXJuLWFueSBpbnB1dCBwYXR0ZXJuKQoJICAgICAoY29uZCAoKG51bGw/IChyZW1haW4gaW5wdXQpKSAjZikKCQkgICAoZWxzZSAoYWNjdW0tYW55IChjYXIgKHJlbWFpbiBpbnB1dCkpKQoJCQkgKGNvbmQgKChtYXRjaC1wYXR0ZXJuIChyLWNkciBpbnB1dCkgcGF0dGVybikpCgkJCSAgICAgICAoZWxzZSAobWF0Y2gtcGF0dGVybi1hbnkgKHItY2RyIGlucHV0KSBwYXR0ZXJuKSkpKSkpCgkgICAobGV0ICgocmV0dmFsIChtYXRjaC1wYXR0ZXJuLWFueSBpbnB1dCAoY2FyIHBhdHRlcm4pKSkpCgkgICAgIChpZiByZXR2YWwKCQkgKGYtY29ucyAoYWNjdW0tYW55KSByZXR2YWwpCgkJICNmKSkpKSkpCjwvdGV4dGFyZWE+PC9mb3JtPgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHt9KTsKICAgIDwvc2NyaXB0PgoKICAgIDxwPjxzdHJvbmc+TUlNRSB0eXBlcyBkZWZpbmVkOjwvc3Ryb25nPiA8Y29kZT50ZXh0L3gtc2NoZW1lPC9jb2RlPi48L3A+CgogIDwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/scheme/scheme.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovKioKICogQXV0aG9yOiBLb2ggWmkgSGFuLCBiYXNlZCBvbiBpbXBsZW1lbnRhdGlvbiBieSBLb2ggWmkgQ2h1bgogKi8KCihmdW5jdGlvbihtb2QpIHsKICBpZiAodHlwZW9mIGV4cG9ydHMgPT0gIm9iamVjdCIgJiYgdHlwZW9mIG1vZHVsZSA9PSAib2JqZWN0IikgLy8gQ29tbW9uSlMKICAgIG1vZChyZXF1aXJlKCIuLi8uLi9saWIvY29kZW1pcnJvciIpKTsKICBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCkgLy8gQU1ECiAgICBkZWZpbmUoWyIuLi8uLi9saWIvY29kZW1pcnJvciJdLCBtb2QpOwogIGVsc2UgLy8gUGxhaW4gYnJvd3NlciBlbnYKICAgIG1vZChDb2RlTWlycm9yKTsKfSkoZnVuY3Rpb24oQ29kZU1pcnJvcikgewoidXNlIHN0cmljdCI7CgpDb2RlTWlycm9yLmRlZmluZU1vZGUoInNjaGVtZSIsIGZ1bmN0aW9uICgpIHsKICAgIHZhciBCVUlMVElOID0gImJ1aWx0aW4iLCBDT01NRU5UID0gImNvbW1lbnQiLCBTVFJJTkcgPSAic3RyaW5nIiwKICAgICAgICBBVE9NID0gImF0b20iLCBOVU1CRVIgPSAibnVtYmVyIiwgQlJBQ0tFVCA9ICJicmFja2V0IjsKICAgIHZhciBJTkRFTlRfV09SRF9TS0lQID0gMjsKCiAgICBmdW5jdGlvbiBtYWtlS2V5d29yZHMoc3RyKSB7CiAgICAgICAgdmFyIG9iaiA9IHt9LCB3b3JkcyA9IHN0ci5zcGxpdCgiICIpOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgd29yZHMubGVuZ3RoOyArK2kpIG9ialt3b3Jkc1tpXV0gPSB0cnVlOwogICAgICAgIHJldHVybiBvYmo7CiAgICB9CgogICAgdmFyIGtleXdvcmRzID0gbWFrZUtleXdvcmRzKCLOuyBjYXNlLWxhbWJkYSBjYWxsL2NjIGNsYXNzIGRlZmluZS1jbGFzcyBleGl0LWhhbmRsZXIgZmllbGQgaW1wb3J0IGluaGVyaXQgaW5pdC1maWVsZCBpbnRlcmZhY2UgbGV0Ki12YWx1ZXMgbGV0LXZhbHVlcyBsZXQvZWMgbWl4aW4gb3B0LWxhbWJkYSBvdmVycmlkZSBwcm90ZWN0IHByb3ZpZGUgcHVibGljIHJlbmFtZSByZXF1aXJlIHJlcXVpcmUtZm9yLXN5bnRheCBzeW50YXggc3ludGF4LWNhc2Ugc3ludGF4LWVycm9yIHVuaXQvc2lnIHVubGVzcyB3aGVuIHdpdGgtc3ludGF4IGFuZCBiZWdpbiBjYWxsLXdpdGgtY3VycmVudC1jb250aW51YXRpb24gY2FsbC13aXRoLWlucHV0LWZpbGUgY2FsbC13aXRoLW91dHB1dC1maWxlIGNhc2UgY29uZCBkZWZpbmUgZGVmaW5lLXN5bnRheCBkZWxheSBkbyBkeW5hbWljLXdpbmQgZWxzZSBmb3ItZWFjaCBpZiBsYW1iZGEgbGV0IGxldCogbGV0LXN5bnRheCBsZXRyZWMgbGV0cmVjLXN5bnRheCBtYXAgb3Igc3ludGF4LXJ1bGVzIGFicyBhY29zIGFuZ2xlIGFwcGVuZCBhcHBseSBhc2luIGFzc29jIGFzc3EgYXNzdiBhdGFuIGJvb2xlYW4/IGNhYXIgY2FkciBjYWxsLXdpdGgtaW5wdXQtZmlsZSBjYWxsLXdpdGgtb3V0cHV0LWZpbGUgY2FsbC13aXRoLXZhbHVlcyBjYXIgY2RkZGFyIGNkZGRkciBjZHIgY2VpbGluZyBjaGFyLT5pbnRlZ2VyIGNoYXItYWxwaGFiZXRpYz8gY2hhci1jaTw9PyBjaGFyLWNpPD8gY2hhci1jaT0/IGNoYXItY2k+PT8gY2hhci1jaT4/IGNoYXItZG93bmNhc2UgY2hhci1sb3dlci1jYXNlPyBjaGFyLW51bWVyaWM/IGNoYXItcmVhZHk/IGNoYXItdXBjYXNlIGNoYXItdXBwZXItY2FzZT8gY2hhci13aGl0ZXNwYWNlPyBjaGFyPD0/IGNoYXI8PyBjaGFyPT8gY2hhcj49PyBjaGFyPj8gY2hhcj8gY2xvc2UtaW5wdXQtcG9ydCBjbG9zZS1vdXRwdXQtcG9ydCBjb21wbGV4PyBjb25zIGNvcyBjdXJyZW50LWlucHV0LXBvcnQgY3VycmVudC1vdXRwdXQtcG9ydCBkZW5vbWluYXRvciBkaXNwbGF5IGVvZi1vYmplY3Q/IGVxPyBlcXVhbD8gZXF2PyBldmFsIGV2ZW4/IGV4YWN0LT5pbmV4YWN0IGV4YWN0PyBleHAgZXhwdCAjZiBmbG9vciBmb3JjZSBnY2QgaW1hZy1wYXJ0IGluZXhhY3QtPmV4YWN0IGluZXhhY3Q/IGlucHV0LXBvcnQ/IGludGVnZXItPmNoYXIgaW50ZWdlcj8gaW50ZXJhY3Rpb24tZW52aXJvbm1lbnQgbGNtIGxlbmd0aCBsaXN0IGxpc3QtPnN0cmluZyBsaXN0LT52ZWN0b3IgbGlzdC1yZWYgbGlzdC10YWlsIGxpc3Q/IGxvYWQgbG9nIG1hZ25pdHVkZSBtYWtlLXBvbGFyIG1ha2UtcmVjdGFuZ3VsYXIgbWFrZS1zdHJpbmcgbWFrZS12ZWN0b3IgbWF4IG1lbWJlciBtZW1xIG1lbXYgbWluIG1vZHVsbyBuZWdhdGl2ZT8gbmV3bGluZSBub3QgbnVsbC1lbnZpcm9ubWVudCBudWxsPyBudW1iZXItPnN0cmluZyBudW1iZXI/IG51bWVyYXRvciBvZGQ/IG9wZW4taW5wdXQtZmlsZSBvcGVuLW91dHB1dC1maWxlIG91dHB1dC1wb3J0PyBwYWlyPyBwZWVrLWNoYXIgcG9ydD8gcG9zaXRpdmU/IHByb2NlZHVyZT8gcXVhc2lxdW90ZSBxdW90ZSBxdW90aWVudCByYXRpb25hbD8gcmF0aW9uYWxpemUgcmVhZCByZWFkLWNoYXIgcmVhbC1wYXJ0IHJlYWw/IHJlbWFpbmRlciByZXZlcnNlIHJvdW5kIHNjaGVtZS1yZXBvcnQtZW52aXJvbm1lbnQgc2V0ISBzZXQtY2FyISBzZXQtY2RyISBzaW4gc3FydCBzdHJpbmcgc3RyaW5nLT5saXN0IHN0cmluZy0+bnVtYmVyIHN0cmluZy0+c3ltYm9sIHN0cmluZy1hcHBlbmQgc3RyaW5nLWNpPD0/IHN0cmluZy1jaTw/IHN0cmluZy1jaT0/IHN0cmluZy1jaT49PyBzdHJpbmctY2k+PyBzdHJpbmctY29weSBzdHJpbmctZmlsbCEgc3RyaW5nLWxlbmd0aCBzdHJpbmctcmVmIHN0cmluZy1zZXQhIHN0cmluZzw9PyBzdHJpbmc8PyBzdHJpbmc9PyBzdHJpbmc+PT8gc3RyaW5nPj8gc3RyaW5nPyBzdWJzdHJpbmcgc3ltYm9sLT5zdHJpbmcgc3ltYm9sPyAjdCB0YW4gdHJhbnNjcmlwdC1vZmYgdHJhbnNjcmlwdC1vbiB0cnVuY2F0ZSB2YWx1ZXMgdmVjdG9yIHZlY3Rvci0+bGlzdCB2ZWN0b3ItZmlsbCEgdmVjdG9yLWxlbmd0aCB2ZWN0b3ItcmVmIHZlY3Rvci1zZXQhIHdpdGgtaW5wdXQtZnJvbS1maWxlIHdpdGgtb3V0cHV0LXRvLWZpbGUgd3JpdGUgd3JpdGUtY2hhciB6ZXJvPyIpOwogICAgdmFyIGluZGVudEtleXMgPSBtYWtlS2V5d29yZHMoImRlZmluZSBsZXQgbGV0cmVjIGxldCogbGFtYmRhIik7CgogICAgZnVuY3Rpb24gc3RhdGVTdGFjayhpbmRlbnQsIHR5cGUsIHByZXYpIHsgLy8gcmVwcmVzZW50cyBhIHN0YXRlIHN0YWNrIG9iamVjdAogICAgICAgIHRoaXMuaW5kZW50ID0gaW5kZW50OwogICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CiAgICAgICAgdGhpcy5wcmV2ID0gcHJldjsKICAgIH0KCiAgICBmdW5jdGlvbiBwdXNoU3RhY2soc3RhdGUsIGluZGVudCwgdHlwZSkgewogICAgICAgIHN0YXRlLmluZGVudFN0YWNrID0gbmV3IHN0YXRlU3RhY2soaW5kZW50LCB0eXBlLCBzdGF0ZS5pbmRlbnRTdGFjayk7CiAgICB9CgogICAgZnVuY3Rpb24gcG9wU3RhY2soc3RhdGUpIHsKICAgICAgICBzdGF0ZS5pbmRlbnRTdGFjayA9IHN0YXRlLmluZGVudFN0YWNrLnByZXY7CiAgICB9CgogICAgdmFyIGJpbmFyeU1hdGNoZXIgPSBuZXcgUmVnRXhwKC9eKD86Wy0rXWl8Wy0rXVswMV0rIyooPzpcL1swMV0rIyopP2l8Wy0rXT9bMDFdKyMqKD86XC9bMDFdKyMqKT9AWy0rXT9bMDFdKyMqKD86XC9bMDFdKyMqKT98Wy0rXT9bMDFdKyMqKD86XC9bMDFdKyMqKT9bLStdKD86WzAxXSsjKig/OlwvWzAxXSsjKik/KT9pfFstK10/WzAxXSsjKig/OlwvWzAxXSsjKik/KSg/PVsoKVxzOyJdfCQpL2kpOwogICAgdmFyIG9jdGFsTWF0Y2hlciA9IG5ldyBSZWdFeHAoL14oPzpbLStdaXxbLStdWzAtN10rIyooPzpcL1swLTddKyMqKT9pfFstK10/WzAtN10rIyooPzpcL1swLTddKyMqKT9AWy0rXT9bMC03XSsjKig/OlwvWzAtN10rIyopP3xbLStdP1swLTddKyMqKD86XC9bMC03XSsjKik/Wy0rXSg/OlswLTddKyMqKD86XC9bMC03XSsjKik/KT9pfFstK10/WzAtN10rIyooPzpcL1swLTddKyMqKT8pKD89WygpXHM7Il18JCkvaSk7CiAgICB2YXIgaGV4TWF0Y2hlciA9IG5ldyBSZWdFeHAoL14oPzpbLStdaXxbLStdW1xkYS1mXSsjKig/OlwvW1xkYS1mXSsjKik/aXxbLStdP1tcZGEtZl0rIyooPzpcL1tcZGEtZl0rIyopP0BbLStdP1tcZGEtZl0rIyooPzpcL1tcZGEtZl0rIyopP3xbLStdP1tcZGEtZl0rIyooPzpcL1tcZGEtZl0rIyopP1stK10oPzpbXGRhLWZdKyMqKD86XC9bXGRhLWZdKyMqKT8pP2l8Wy0rXT9bXGRhLWZdKyMqKD86XC9bXGRhLWZdKyMqKT8pKD89WygpXHM7Il18JCkvaSk7CiAgICB2YXIgZGVjaW1hbE1hdGNoZXIgPSBuZXcgUmVnRXhwKC9eKD86Wy0rXWl8Wy0rXSg/Oig/Oig/OlxkKyMrXC4/Iyp8XGQrXC5cZCojKnxcLlxkKyMqfFxkKykoPzpbZXNmZGxdWy0rXT9cZCspPyl8XGQrIypcL1xkKyMqKWl8Wy0rXT8oPzooPzooPzpcZCsjK1wuPyMqfFxkK1wuXGQqIyp8XC5cZCsjKnxcZCspKD86W2VzZmRsXVstK10/XGQrKT8pfFxkKyMqXC9cZCsjKilAWy0rXT8oPzooPzooPzpcZCsjK1wuPyMqfFxkK1wuXGQqIyp8XC5cZCsjKnxcZCspKD86W2VzZmRsXVstK10/XGQrKT8pfFxkKyMqXC9cZCsjKil8Wy0rXT8oPzooPzooPzpcZCsjK1wuPyMqfFxkK1wuXGQqIyp8XC5cZCsjKnxcZCspKD86W2VzZmRsXVstK10/XGQrKT8pfFxkKyMqXC9cZCsjKilbLStdKD86KD86KD86XGQrIytcLj8jKnxcZCtcLlxkKiMqfFwuXGQrIyp8XGQrKSg/Oltlc2ZkbF1bLStdP1xkKyk/KXxcZCsjKlwvXGQrIyopP2l8KD86KD86KD86XGQrIytcLj8jKnxcZCtcLlxkKiMqfFwuXGQrIyp8XGQrKSg/Oltlc2ZkbF1bLStdP1xkKyk/KXxcZCsjKlwvXGQrIyopKSg/PVsoKVxzOyJdfCQpL2kpOwoKICAgIGZ1bmN0aW9uIGlzQmluYXJ5TnVtYmVyIChzdHJlYW0pIHsKICAgICAgICByZXR1cm4gc3RyZWFtLm1hdGNoKGJpbmFyeU1hdGNoZXIpOwogICAgfQoKICAgIGZ1bmN0aW9uIGlzT2N0YWxOdW1iZXIgKHN0cmVhbSkgewogICAgICAgIHJldHVybiBzdHJlYW0ubWF0Y2gob2N0YWxNYXRjaGVyKTsKICAgIH0KCiAgICBmdW5jdGlvbiBpc0RlY2ltYWxOdW1iZXIgKHN0cmVhbSwgYmFja3VwKSB7CiAgICAgICAgaWYgKGJhY2t1cCA9PT0gdHJ1ZSkgewogICAgICAgICAgICBzdHJlYW0uYmFja1VwKDEpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc3RyZWFtLm1hdGNoKGRlY2ltYWxNYXRjaGVyKTsKICAgIH0KCiAgICBmdW5jdGlvbiBpc0hleE51bWJlciAoc3RyZWFtKSB7CiAgICAgICAgcmV0dXJuIHN0cmVhbS5tYXRjaChoZXhNYXRjaGVyKTsKICAgIH0KCiAgICByZXR1cm4gewogICAgICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGluZGVudFN0YWNrOiBudWxsLAogICAgICAgICAgICAgICAgaW5kZW50YXRpb246IDAsCiAgICAgICAgICAgICAgICBtb2RlOiBmYWxzZSwKICAgICAgICAgICAgICAgIHNFeHByQ29tbWVudDogZmFsc2UKICAgICAgICAgICAgfTsKICAgICAgICB9LAoKICAgICAgICB0b2tlbjogZnVuY3Rpb24gKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgICAgICAgaWYgKHN0YXRlLmluZGVudFN0YWNrID09IG51bGwgJiYgc3RyZWFtLnNvbCgpKSB7CiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgaW5kZW50YXRpb24sIGJ1dCBvbmx5IGlmIGluZGVudFN0YWNrIGlzIGVtcHR5CiAgICAgICAgICAgICAgICBzdGF0ZS5pbmRlbnRhdGlvbiA9IHN0cmVhbS5pbmRlbnRhdGlvbigpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBza2lwIHNwYWNlcwogICAgICAgICAgICBpZiAoc3RyZWFtLmVhdFNwYWNlKCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciByZXR1cm5UeXBlID0gbnVsbDsKCiAgICAgICAgICAgIHN3aXRjaChzdGF0ZS5tb2RlKXsKICAgICAgICAgICAgICAgIGNhc2UgInN0cmluZyI6IC8vIG11bHRpLWxpbmUgc3RyaW5nIHBhcnNpbmcgbW9kZQogICAgICAgICAgICAgICAgICAgIHZhciBuZXh0LCBlc2NhcGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChuZXh0ID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV4dCA9PSAiXCIiICYmICFlc2NhcGVkKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlZCA9ICFlc2NhcGVkICYmIG5leHQgPT0gIlxcIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuVHlwZSA9IFNUUklORzsgLy8gY29udGludWUgb24gaW4gc2NoZW1lLXN0cmluZyBtb2RlCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICJjb21tZW50IjogLy8gY29tbWVudCBwYXJzaW5nIG1vZGUKICAgICAgICAgICAgICAgICAgICB2YXIgbmV4dCwgbWF5YmVFbmQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKG5leHQgPSBzdHJlYW0ubmV4dCgpKSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0ID09ICIjIiAmJiBtYXliZUVuZCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIG1heWJlRW5kID0gKG5leHQgPT0gInwiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuVHlwZSA9IENPTU1FTlQ7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICJzLWV4cHItY29tbWVudCI6IC8vIHMtZXhwciBjb21tZW50aW5nIG1vZGUKICAgICAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgaWYoc3RyZWFtLnBlZWsoKSA9PSAiKCIgfHwgc3RyZWFtLnBlZWsoKSA9PSAiWyIpewogICAgICAgICAgICAgICAgICAgICAgICAvLyBhY3R1YWxseSBzdGFydCBzY2hlbWUgcy1leHByIGNvbW1lbnRpbmcgbW9kZQogICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5zRXhwckNvbW1lbnQgPSAwOwogICAgICAgICAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBub3Qgd2UganVzdCBjb21tZW50IHRoZSBlbnRpcmUgb2YgdGhlIG5leHQgdG9rZW4KICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXi9zXS8pOyAvLyBlYXQgbm9uIHNwYWNlcwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5UeXBlID0gQ09NTUVOVDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZGVmYXVsdDogLy8gZGVmYXVsdCBwYXJzaW5nIG1vZGUKICAgICAgICAgICAgICAgICAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gIlwiIikgewogICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gInN0cmluZyI7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblR5cGUgPSBTVFJJTkc7CgogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gIiciKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblR5cGUgPSBBVE9NOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJyMnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW0uZWF0KCJ8IikpIHsgICAgICAgICAgICAgICAgICAgIC8vIE11bHRpLWxpbmUgY29tbWVudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUubW9kZSA9ICJjb21tZW50IjsgLy8gdG9nZ2xlIHRvIGNvbW1lbnQgbW9kZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVHlwZSA9IENPTU1FTlQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLmVhdCgvW3RmXS9pKSkgeyAgICAgICAgICAgIC8vICN0LyNmIChhdG9tKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVHlwZSA9IEFUT007CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLmVhdCgnOycpKSB7ICAgICAgICAgICAgICAgIC8vIFMtRXhwciBjb21tZW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gInMtZXhwci1jb21tZW50IjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblR5cGUgPSBDT01NRU5UOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG51bVRlc3QgPSBudWxsLCBoYXNFeGFjdG5lc3MgPSBmYWxzZSwgaGFzUmFkaXggPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbS5lYXQoL1tlaV0vaSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNFeGFjdG5lc3MgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0uYmFja1VwKDEpOyAgICAgICAvLyBtdXN0IGJlIHJhZGl4IHNwZWNpZmllcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXiNiL2kpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtVGVzdCA9IGlzQmluYXJ5TnVtYmVyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJlYW0ubWF0Y2goL14jby9pKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bVRlc3QgPSBpc09jdGFsTnVtYmVyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJlYW0ubWF0Y2goL14jeC9pKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bVRlc3QgPSBpc0hleE51bWJlcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLm1hdGNoKC9eI2QvaSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1UZXN0ID0gaXNEZWNpbWFsTnVtYmVyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJlYW0ubWF0Y2goL15bLSswLTkuXS8sIGZhbHNlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1JhZGl4ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtVGVzdCA9IGlzRGVjaW1hbE51bWJlcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlLWNvbnN1bWUgdGhlIGludGlhbCAjIGlmIGFsbCBtYXRjaGVzIGZhaWxlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghaGFzRXhhY3RuZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLmVhdCgnIycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bVRlc3QgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNSYWRpeCAmJiAhaGFzRXhhY3RuZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnN1bWUgb3B0aW9uYWwgZXhhY3RuZXNzIGFmdGVyIHJhZGl4CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5tYXRjaCgvXiNbZWldL2kpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVtVGVzdChzdHJlYW0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5UeXBlID0gTlVNQkVSOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgvXlstKzAtOS5dLy50ZXN0KGNoKSAmJiBpc0RlY2ltYWxOdW1iZXIoc3RyZWFtLCB0cnVlKSkgeyAvLyBtYXRjaCBub24tcHJlZml4ZWQgbnVtYmVyLCBtdXN0IGJlIGRlY2ltYWwKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVHlwZSA9IE5VTUJFUjsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICI7IikgeyAvLyBjb21tZW50CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsgLy8gcmVzdCBvZiB0aGUgbGluZSBpcyBhIGNvbW1lbnQKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVHlwZSA9IENPTU1FTlQ7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAiKCIgfHwgY2ggPT0gIlsiKSB7CiAgICAgICAgICAgICAgICAgICAgICB2YXIga2V5V29yZCA9ICcnOyB2YXIgaW5kZW50VGVtcCA9IHN0cmVhbS5jb2x1bW4oKSwgbGV0dGVyOwogICAgICAgICAgICAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAgICAgICAgICAgRWl0aGVyCiAgICAgICAgICAgICAgICAgICAgICAgIChpbmRlbnQtd29yZCAuLgogICAgICAgICAgICAgICAgICAgICAgICAobm9uLWluZGVudC13b3JkIC4uCiAgICAgICAgICAgICAgICAgICAgICAgICg7c29tZXRoaW5nIGVsc2UsIGJyYWNrZXQsIGV0Yy4KICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgobGV0dGVyID0gc3RyZWFtLmVhdCgvW15cc1woXFtcO1wpXF1dLykpICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleVdvcmQgKz0gbGV0dGVyOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoa2V5V29yZC5sZW5ndGggPiAwICYmIGluZGVudEtleXMucHJvcGVydHlJc0VudW1lcmFibGUoa2V5V29yZCkpIHsgLy8gaW5kZW50LXdvcmQKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoU3RhY2soc3RhdGUsIGluZGVudFRlbXAgKyBJTkRFTlRfV09SRF9TS0lQLCBjaCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIG5vbi1pbmRlbnQgd29yZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgY29udGludWUgZWF0aW5nIHRoZSBzcGFjZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5lYXRTcGFjZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbS5lb2woKSB8fCBzdHJlYW0ucGVlaygpID09ICI7IikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcgc2lnbmlmaWNhbnQgYWZ0ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSByZXN0YXJ0IGluZGVudGF0aW9uIDEgc3BhY2UgYWZ0ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoU3RhY2soc3RhdGUsIGluZGVudFRlbXAgKyAxLCBjaCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2hTdGFjayhzdGF0ZSwgaW5kZW50VGVtcCArIHN0cmVhbS5jdXJyZW50KCkubGVuZ3RoLCBjaCk7IC8vIGVsc2Ugd2UgbWF0Y2gKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0uYmFja1VwKHN0cmVhbS5jdXJyZW50KCkubGVuZ3RoIC0gMSk7IC8vIHVuZG8gYWxsIHRoZSBlYXRpbmcKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHR5cGVvZiBzdGF0ZS5zRXhwckNvbW1lbnQgPT0gIm51bWJlciIpIHN0YXRlLnNFeHByQ29tbWVudCsrOwoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVHlwZSA9IEJSQUNLRVQ7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAiKSIgfHwgY2ggPT0gIl0iKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblR5cGUgPSBCUkFDS0VUOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuaW5kZW50U3RhY2sgIT0gbnVsbCAmJiBzdGF0ZS5pbmRlbnRTdGFjay50eXBlID09IChjaCA9PSAiKSIgPyAiKCIgOiAiWyIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3BTdGFjayhzdGF0ZSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodHlwZW9mIHN0YXRlLnNFeHByQ29tbWVudCA9PSAibnVtYmVyIil7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoLS1zdGF0ZS5zRXhwckNvbW1lbnQgPT0gMCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblR5cGUgPSBDT01NRU5UOyAvLyBmaW5hbCBjbG9zaW5nIGJyYWNrZXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuc0V4cHJDb21tZW50ID0gZmFsc2U7IC8vIHR1cm4gb2ZmIHMtZXhwciBjb21tZW50aW5nIG1vZGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcd1wkX1wtISQlJiorXC5cLzo8PT4/QFxefl0vKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXl3b3JkcyAmJiBrZXl3b3Jkcy5wcm9wZXJ0eUlzRW51bWVyYWJsZShzdHJlYW0uY3VycmVudCgpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVHlwZSA9IEJVSUxUSU47CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSByZXR1cm5UeXBlID0gInZhcmlhYmxlIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICh0eXBlb2Ygc3RhdGUuc0V4cHJDb21tZW50ID09ICJudW1iZXIiKSA/IENPTU1FTlQgOiByZXR1cm5UeXBlOwogICAgICAgIH0sCgogICAgICAgIGluZGVudDogZnVuY3Rpb24gKHN0YXRlKSB7CiAgICAgICAgICAgIGlmIChzdGF0ZS5pbmRlbnRTdGFjayA9PSBudWxsKSByZXR1cm4gc3RhdGUuaW5kZW50YXRpb247CiAgICAgICAgICAgIHJldHVybiBzdGF0ZS5pbmRlbnRTdGFjay5pbmRlbnQ7CiAgICAgICAgfSwKCiAgICAgICAgbGluZUNvbW1lbnQ6ICI7OyIKICAgIH07Cn0pOwoKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtc2NoZW1lIiwgInNjaGVtZSIpOwoKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/shell/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/shell/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogU2hlbGwgbW9kZTwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uLy4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPS4uLy4uL2xpYi9jb2RlbWlycm9yLmNzcz4KPHNjcmlwdCBzcmM9Li4vLi4vbGliL2NvZGVtaXJyb3IuanM+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi8uLi9hZGRvbi9lZGl0L21hdGNoYnJhY2tldHMuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz1zaGVsbC5qcz48L3NjcmlwdD4KPHN0eWxlIHR5cGU9dGV4dC9jc3M+CiAgLkNvZGVNaXJyb3Ige2JvcmRlci10b3A6IDFweCBzb2xpZCBibGFjazsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO30KPC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aW1nIGlkPWxvZ28gc3JjPSIuLi8uLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5MYW5ndWFnZSBtb2RlczwvYT4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+U2hlbGw8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPlNoZWxsIG1vZGU8L2gyPgoKCjx0ZXh0YXJlYSBpZD1jb2RlPgojIS9iaW4vYmFzaAoKIyBjbG9uZSB0aGUgcmVwb3NpdG9yeQpnaXQgY2xvbmUgaHR0cDovL2dpdGh1Yi5jb20vZ2FyZGVuL3RyZWUKCiMgZ2VuZXJhdGUgSFRUUFMgY3JlZGVudGlhbHMKY2QgdHJlZQpvcGVuc3NsIGdlbnJzYSAtYWVzMjU2IC1vdXQgaHR0cHMua2V5IDEwMjQKb3BlbnNzbCByZXEgLW5ldyAtbm9kZXMgLWtleSBodHRwcy5rZXkgLW91dCBodHRwcy5jc3IKb3BlbnNzbCB4NTA5IC1yZXEgLWRheXMgMzY1IC1pbiBodHRwcy5jc3IgLXNpZ25rZXkgaHR0cHMua2V5IC1vdXQgaHR0cHMuY3J0CmNwIGh0dHBzLmtleXssLm9yaWd9Cm9wZW5zc2wgcnNhIC1pbiBodHRwcy5rZXkub3JpZyAtb3V0IGh0dHBzLmtleQoKIyBzdGFydCB0aGUgc2VydmVyIGluIEhUVFBTIG1vZGUKY2Qgd2ViCnN1ZG8gbm9kZSAuLi9zZXJ2ZXIuanMgNDQzICd5ZXMnICZndDsmZ3Q7IC4uL25vZGUubG9nICZhbXA7CgojIGhlcmUgaXMgaG93IHRvIHN0b3AgdGhlIHNlcnZlcgpmb3IgcGlkIGluIGBwcyBhdXggfCBncmVwICdub2RlIC4uL3NlcnZlci5qcycgfCBhd2sgJ3twcmludCAkMn0nYCA7IGRvCiAgc3VkbyBraWxsIC05ICRwaWQgMiZndDsgL2Rldi9udWxsCmRvbmUKCmV4aXQgMDwvdGV4dGFyZWE+Cgo8c2NyaXB0PgogIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29kZScpLCB7CiAgICBtb2RlOiAnc2hlbGwnLAogICAgbGluZU51bWJlcnM6IHRydWUsCiAgICBtYXRjaEJyYWNrZXRzOiB0cnVlCiAgfSk7Cjwvc2NyaXB0PgoKPHA+PHN0cm9uZz5NSU1FIHR5cGVzIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPnRleHQveC1zaDwvY29kZT4uPC9wPgo8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/shell/shell.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCdzaGVsbCcsIGZ1bmN0aW9uKCkgewoKICB2YXIgd29yZHMgPSB7fTsKICBmdW5jdGlvbiBkZWZpbmUoc3R5bGUsIHN0cmluZykgewogICAgdmFyIHNwbGl0ID0gc3RyaW5nLnNwbGl0KCcgJyk7CiAgICBmb3IodmFyIGkgPSAwOyBpIDwgc3BsaXQubGVuZ3RoOyBpKyspIHsKICAgICAgd29yZHNbc3BsaXRbaV1dID0gc3R5bGU7CiAgICB9CiAgfTsKCiAgLy8gQXRvbXMKICBkZWZpbmUoJ2F0b20nLCAndHJ1ZSBmYWxzZScpOwoKICAvLyBLZXl3b3JkcwogIGRlZmluZSgna2V5d29yZCcsICdpZiB0aGVuIGRvIGVsc2UgZWxpZiB3aGlsZSB1bnRpbCBmb3IgaW4gZXNhYyBmaSBmaW4gJyArCiAgICAnZmlsIGRvbmUgZXhpdCBzZXQgdW5zZXQgZXhwb3J0IGZ1bmN0aW9uJyk7CgogIC8vIENvbW1hbmRzCiAgZGVmaW5lKCdidWlsdGluJywgJ2FiIGF3ayBiYXNoIGJlZXAgY2F0IGNjIGNkIGNob3duIGNobW9kIGNocm9vdCBjbGVhciBjcCAnICsKICAgICdjdXJsIGN1dCBkaWZmIGVjaG8gZmluZCBnYXdrIGdjYyBnZXQgZ2l0IGdyZXAga2lsbCBraWxsYWxsIGxuIGxzIG1ha2UgJyArCiAgICAnbWtkaXIgb3BlbnNzbCBtdiBuYyBub2RlIG5wbSBwaW5nIHBzIHJlc3RhcnQgcm0gcm1kaXIgc2VkIHNlcnZpY2Ugc2ggJyArCiAgICAnc2hvcHQgc2hyZWQgc291cmNlIHNvcnQgc2xlZXAgc3NoIHN0YXJ0IHN0b3Agc3Ugc3VkbyB0ZWUgdGVsbmV0IHRvcCAnICsKICAgICd0b3VjaCB2aSB2aW0gd2FsbCB3YyB3Z2V0IHdobyB3cml0ZSB5ZXMgenNoJyk7CgogIGZ1bmN0aW9uIHRva2VuQmFzZShzdHJlYW0sIHN0YXRlKSB7CiAgICBpZiAoc3RyZWFtLmVhdFNwYWNlKCkpIHJldHVybiBudWxsOwoKICAgIHZhciBzb2wgPSBzdHJlYW0uc29sKCk7CiAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpOwoKICAgIGlmIChjaCA9PT0gJ1xcJykgewogICAgICBzdHJlYW0ubmV4dCgpOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGlmIChjaCA9PT0gJ1wnJyB8fCBjaCA9PT0gJyInIHx8IGNoID09PSAnYCcpIHsKICAgICAgc3RhdGUudG9rZW5zLnVuc2hpZnQodG9rZW5TdHJpbmcoY2gpKTsKICAgICAgcmV0dXJuIHRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgfQogICAgaWYgKGNoID09PSAnIycpIHsKICAgICAgaWYgKHNvbCAmJiBzdHJlYW0uZWF0KCchJykpIHsKICAgICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICAgICAgcmV0dXJuICdtZXRhJzsgLy8gJ2NvbW1lbnQnPwogICAgICB9CiAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgcmV0dXJuICdjb21tZW50JzsKICAgIH0KICAgIGlmIChjaCA9PT0gJyQnKSB7CiAgICAgIHN0YXRlLnRva2Vucy51bnNoaWZ0KHRva2VuRG9sbGFyKTsKICAgICAgcmV0dXJuIHRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgfQogICAgaWYgKGNoID09PSAnKycgfHwgY2ggPT09ICc9JykgewogICAgICByZXR1cm4gJ29wZXJhdG9yJzsKICAgIH0KICAgIGlmIChjaCA9PT0gJy0nKSB7CiAgICAgIHN0cmVhbS5lYXQoJy0nKTsKICAgICAgc3RyZWFtLmVhdFdoaWxlKC9cdy8pOwogICAgICByZXR1cm4gJ2F0dHJpYnV0ZSc7CiAgICB9CiAgICBpZiAoL1xkLy50ZXN0KGNoKSkgewogICAgICBzdHJlYW0uZWF0V2hpbGUoL1xkLyk7CiAgICAgIGlmKHN0cmVhbS5lb2woKSB8fCAhL1x3Ly50ZXN0KHN0cmVhbS5wZWVrKCkpKSB7CiAgICAgICAgcmV0dXJuICdudW1iZXInOwogICAgICB9CiAgICB9CiAgICBzdHJlYW0uZWF0V2hpbGUoL1tcdy1dLyk7CiAgICB2YXIgY3VyID0gc3RyZWFtLmN1cnJlbnQoKTsKICAgIGlmIChzdHJlYW0ucGVlaygpID09PSAnPScgJiYgL1x3Ky8udGVzdChjdXIpKSByZXR1cm4gJ2RlZic7CiAgICByZXR1cm4gd29yZHMuaGFzT3duUHJvcGVydHkoY3VyKSA/IHdvcmRzW2N1cl0gOiBudWxsOwogIH0KCiAgZnVuY3Rpb24gdG9rZW5TdHJpbmcocXVvdGUpIHsKICAgIHJldHVybiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHZhciBuZXh0LCBlbmQgPSBmYWxzZSwgZXNjYXBlZCA9IGZhbHNlOwogICAgICB3aGlsZSAoKG5leHQgPSBzdHJlYW0ubmV4dCgpKSAhPSBudWxsKSB7CiAgICAgICAgaWYgKG5leHQgPT09IHF1b3RlICYmICFlc2NhcGVkKSB7CiAgICAgICAgICBlbmQgPSB0cnVlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmIChuZXh0ID09PSAnJCcgJiYgIWVzY2FwZWQgJiYgcXVvdGUgIT09ICdcJycpIHsKICAgICAgICAgIGVzY2FwZWQgPSB0cnVlOwogICAgICAgICAgc3RyZWFtLmJhY2tVcCgxKTsKICAgICAgICAgIHN0YXRlLnRva2Vucy51bnNoaWZ0KHRva2VuRG9sbGFyKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBlc2NhcGVkID0gIWVzY2FwZWQgJiYgbmV4dCA9PT0gJ1xcJzsKICAgICAgfQogICAgICBpZiAoZW5kIHx8ICFlc2NhcGVkKSB7CiAgICAgICAgc3RhdGUudG9rZW5zLnNoaWZ0KCk7CiAgICAgIH0KICAgICAgcmV0dXJuIChxdW90ZSA9PT0gJ2AnIHx8IHF1b3RlID09PSAnKScgPyAncXVvdGUnIDogJ3N0cmluZycpOwogICAgfTsKICB9OwoKICB2YXIgdG9rZW5Eb2xsYXIgPSBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICBpZiAoc3RhdGUudG9rZW5zLmxlbmd0aCA+IDEpIHN0cmVhbS5lYXQoJyQnKTsKICAgIHZhciBjaCA9IHN0cmVhbS5uZXh0KCksIGh1bmdyeSA9IC9cdy87CiAgICBpZiAoY2ggPT09ICd7JykgaHVuZ3J5ID0gL1tefV0vOwogICAgaWYgKGNoID09PSAnKCcpIHsKICAgICAgc3RhdGUudG9rZW5zWzBdID0gdG9rZW5TdHJpbmcoJyknKTsKICAgICAgcmV0dXJuIHRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgfQogICAgaWYgKCEvXGQvLnRlc3QoY2gpKSB7CiAgICAgIHN0cmVhbS5lYXRXaGlsZShodW5ncnkpOwogICAgICBzdHJlYW0uZWF0KCd9Jyk7CiAgICB9CiAgICBzdGF0ZS50b2tlbnMuc2hpZnQoKTsKICAgIHJldHVybiAnZGVmJzsKICB9OwoKICBmdW5jdGlvbiB0b2tlbml6ZShzdHJlYW0sIHN0YXRlKSB7CiAgICByZXR1cm4gKHN0YXRlLnRva2Vuc1swXSB8fCB0b2tlbkJhc2UpIChzdHJlYW0sIHN0YXRlKTsKICB9OwoKICByZXR1cm4gewogICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24oKSB7cmV0dXJuIHt0b2tlbnM6W119O30sCiAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICByZXR1cm4gdG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CiAgICB9CiAgfTsKfSk7CgpDb2RlTWlycm9yLmRlZmluZU1JTUUoJ3RleHQveC1zaCcsICdzaGVsbCcpOwoKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/shell/test.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24oKSB7CiAgdmFyIG1vZGUgPSBDb2RlTWlycm9yLmdldE1vZGUoe30sICJzaGVsbCIpOwogIGZ1bmN0aW9uIE1UKG5hbWUpIHsgdGVzdC5tb2RlKG5hbWUsIG1vZGUsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpOyB9CgogIE1UKCJ2YXIiLAogICAgICJ0ZXh0IFtkZWYgJHZhcl0gdGV4dCIpOwogIE1UKCJ2YXJCcmFjZXMiLAogICAgICJ0ZXh0W2RlZiAke3Zhcn1ddGV4dCIpOwogIE1UKCJ2YXJWYXIiLAogICAgICJ0ZXh0IFtkZWYgJGEkYl0gdGV4dCIpOwogIE1UKCJ2YXJCcmFjZXNWYXJCcmFjZXMiLAogICAgICJ0ZXh0W2RlZiAke2F9JHtifV10ZXh0Iik7CgogIE1UKCJzaW5nbGVRdW90ZWRWYXIiLAogICAgICJbc3RyaW5nICd0ZXh0ICR2YXIgdGV4dCddIik7CiAgTVQoInNpbmdsZVF1b3RlZFZhckJyYWNlcyIsCiAgICAgIltzdHJpbmcgJ3RleHQgJHt2YXJ9IHRleHQnXSIpOwoKICBNVCgiZG91YmxlUXVvdGVkVmFyIiwKICAgICAnW3N0cmluZyAidGV4dCBdW2RlZiAkdmFyXVtzdHJpbmcgIHRleHQiXScpOwogIE1UKCJkb3VibGVRdW90ZWRWYXJCcmFjZXMiLAogICAgICdbc3RyaW5nICJ0ZXh0XVtkZWYgJHt2YXJ9XVtzdHJpbmcgdGV4dCJdJyk7CiAgTVQoImRvdWJsZVF1b3RlZFZhclB1bmN0IiwKICAgICAnW3N0cmluZyAidGV4dCBdW2RlZiAkQF1bc3RyaW5nICB0ZXh0Il0nKTsKICBNVCgiZG91YmxlUXVvdGVkVmFyVmFyIiwKICAgICAnW3N0cmluZyAiXVtkZWYgJGEkYl1bc3RyaW5nICJdJyk7CiAgTVQoImRvdWJsZVF1b3RlZFZhckJyYWNlc1ZhckJyYWNlcyIsCiAgICAgJ1tzdHJpbmcgIl1bZGVmICR7YX0ke2J9XVtzdHJpbmcgIl0nKTsKCiAgTVQoIm5vdEFTdHJpbmciLAogICAgICJ0ZXh0XFwndGV4dCIpOwogIE1UKCJlc2NhcGVzIiwKICAgICAib3V0c2lkZVxcJ1xcXCJcXGBcXFxcW3N0cmluZyBcImluc2lkZVxcYFxcJ1xcXCJcXFxcYFxcJG5vdEFWYXJcIl1vdXRzaWRlXFwkXFwobm90QVN1YlNoZWxsXFwpIik7CgogIE1UKCJzdWJzaGVsbCIsCiAgICAgIltidWlsdGluIGVjaG9dIFtxdW90ZSAkKHdob2FtaSldIHMgbG9nLCBzdGFyZGF0ZSBbcXVvdGUgYGRhdGVgXS4iKTsKICBNVCgiZG91YmxlUXVvdGVkU3Vic2hlbGwiLAogICAgICJbYnVpbHRpbiBlY2hvXSBbc3RyaW5nIFwiXVtxdW90ZSAkKHdob2FtaSldW3N0cmluZyAncyBsb2csIHN0YXJkYXRlIGBkYXRlYC5cIl0iKTsKCiAgTVQoImhhc2hiYW5nIiwKICAgICAiW21ldGEgIyEvYmluL2Jhc2hdIik7CiAgTVQoImNvbW1lbnQiLAogICAgICJ0ZXh0IFtjb21tZW50ICMgQmx1cmJdIik7CgogIE1UKCJudW1iZXJzIiwKICAgICAiW251bWJlciAwXSBbbnVtYmVyIDFdIFtudW1iZXIgMl0iKTsKICBNVCgia2V5d29yZHMiLAogICAgICJba2V5d29yZCB3aGlsZV0gW2F0b20gdHJ1ZV07IFtrZXl3b3JkIGRvXSIsCiAgICAgIiAgW2J1aWx0aW4gc2xlZXBdIFtudW1iZXIgM10iLAogICAgICJba2V5d29yZCBkb25lXSIpOwogIE1UKCJvcHRpb25zIiwKICAgICAiW2J1aWx0aW4gbHNdIFthdHRyaWJ1dGUgLWxdIFthdHRyaWJ1dGUgLS1odW1hbi1yZWFkYWJsZV0iKTsKICBNVCgib3BlcmF0b3IiLAogICAgICJbZGVmIHZhcl1bb3BlcmF0b3IgPV12YWx1ZSIpOwp9KSgpOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/sieve/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/sieve/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogU2lldmUgKFJGQzUyMjgpIG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0ic2lldmUuanMiPjwvc2NyaXB0Pgo8c3R5bGU+LkNvZGVNaXJyb3Ige2JhY2tncm91bmQ6ICNmOGY4Zjg7fTwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGltZyBpZD1sb2dvIHNyYz0iLi4vLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+TGFuZ3VhZ2UgbW9kZXM8L2E+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPlNpZXZlIChSRkM1MjI4KTwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+U2lldmUgKFJGQzUyMjgpIG1vZGU8L2gyPgo8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgojCiMgRXhhbXBsZSBTaWV2ZSBGaWx0ZXIKIyBEZWNsYXJlIGFueSBvcHRpb25hbCBmZWF0dXJlcyBvciBleHRlbnNpb24gdXNlZCBieSB0aGUgc2NyaXB0CiMKCnJlcXVpcmUgWyJmaWxlaW50byIsICJyZWplY3QiXTsKCiMKIyBSZWplY3QgYW55IGxhcmdlIG1lc3NhZ2VzIChub3RlIHRoYXQgdGhlIGZvdXIgbGVhZGluZyBkb3RzIGdldAojICJzdHVmZmVkIiB0byB0aHJlZSkKIwppZiBzaXplIDpvdmVyIDFNCnsKICByZWplY3QgdGV4dDoKUGxlYXNlIGRvIG5vdCBzZW5kIG1lIGxhcmdlIGF0dGFjaG1lbnRzLgpQdXQgeW91ciBmaWxlIG9uIGEgc2VydmVyIGFuZCBzZW5kIG1lIHRoZSBVUkwuClRoYW5rIHlvdS4KLi4uLiBGcmVkCi4KOwogIHN0b3A7Cn0KCiMKIyBIYW5kbGUgbWVzc2FnZXMgZnJvbSBrbm93biBtYWlsaW5nIGxpc3RzCiMgTW92ZSBtZXNzYWdlcyBmcm9tIElFVEYgZmlsdGVyIGRpc2N1c3Npb24gbGlzdCB0byBmaWx0ZXIgZm9sZGVyCiMKaWYgaGVhZGVyIDppcyAiU2VuZGVyIiAib3duZXItaWV0Zi1tdGEtZmlsdGVyc0BpbWMub3JnIgp7CiAgZmlsZWludG8gImZpbHRlciI7ICAjIG1vdmUgdG8gImZpbHRlciIgZm9sZGVyCn0KIwojIEtlZXAgYWxsIG1lc3NhZ2VzIHRvIG9yIGZyb20gcGVvcGxlIGluIG15IGNvbXBhbnkKIwplbHNpZiBhZGRyZXNzIDpkb21haW4gOmlzIFsiRnJvbSIsICJUbyJdICJleGFtcGxlLmNvbSIKewogIGtlZXA7ICAgICAgICAgICAgICAgIyBrZWVwIGluICJJbiIgZm9sZGVyCn0KCiMKIyBUcnkgYW5kIGNhdGNoIHVuc29saWNpdGVkIGVtYWlsLiAgSWYgYSBtZXNzYWdlIGlzIG5vdCB0byBtZSwKIyBvciBpdCBjb250YWlucyBhIHN1YmplY3Qga25vd24gdG8gYmUgc3BhbSwgZmlsZSBpdCBhd2F5LgojCmVsc2lmIGFueW9mIChub3QgYWRkcmVzcyA6YWxsIDpjb250YWlucwogICAgICAgICAgICAgICBbIlRvIiwgIkNjIiwgIkJjYyJdICJtZUBleGFtcGxlLmNvbSIsCiAgICAgICAgICAgICBoZWFkZXIgOm1hdGNoZXMgInN1YmplY3QiCiAgICAgICAgICAgICAgIFsiKm1ha2UqbW9uZXkqZmFzdCoiLCAiKnVuaXZlcnNpdHkqZGlwbCptYXMqIl0pCnsKICAjIElmIG1lc3NhZ2UgaGVhZGVyIGRvZXMgbm90IGNvbnRhaW4gbXkgYWRkcmVzcywKICAjIGl0J3MgZnJvbSBhIGxpc3QuCiAgZmlsZWludG8gInNwYW0iOyAgICMgbW92ZSB0byAic3BhbSIgZm9sZGVyCn0KZWxzZQp7CiAgIyBNb3ZlIGFsbCBvdGhlciAobm9uLWNvbXBhbnkpIG1haWwgdG8gInBlcnNvbmFsIgogICMgZm9sZGVyLgogIGZpbGVpbnRvICJwZXJzb25hbCI7Cn0KPC90ZXh0YXJlYT48L2Zvcm0+CiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwge30pOwogICAgPC9zY3JpcHQ+CgogICAgPHA+PHN0cm9uZz5NSU1FIHR5cGVzIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPmFwcGxpY2F0aW9uL3NpZXZlPC9jb2RlPi48L3A+CgogIDwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/sieve/sieve.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJzaWV2ZSIsIGZ1bmN0aW9uKGNvbmZpZykgewogIGZ1bmN0aW9uIHdvcmRzKHN0cikgewogICAgdmFyIG9iaiA9IHt9LCB3b3JkcyA9IHN0ci5zcGxpdCgiICIpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB3b3Jkcy5sZW5ndGg7ICsraSkgb2JqW3dvcmRzW2ldXSA9IHRydWU7CiAgICByZXR1cm4gb2JqOwogIH0KCiAgdmFyIGtleXdvcmRzID0gd29yZHMoImlmIGVsc2lmIGVsc2Ugc3RvcCByZXF1aXJlIik7CiAgdmFyIGF0b21zID0gd29yZHMoInRydWUgZmFsc2Ugbm90Iik7CiAgdmFyIGluZGVudFVuaXQgPSBjb25maWcuaW5kZW50VW5pdDsKCiAgZnVuY3Rpb24gdG9rZW5CYXNlKHN0cmVhbSwgc3RhdGUpIHsKCiAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpOwogICAgaWYgKGNoID09ICIvIiAmJiBzdHJlYW0uZWF0KCIqIikpIHsKICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkNDb21tZW50OwogICAgICByZXR1cm4gdG9rZW5DQ29tbWVudChzdHJlYW0sIHN0YXRlKTsKICAgIH0KCiAgICBpZiAoY2ggPT09ICcjJykgewogICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICAgIHJldHVybiAiY29tbWVudCI7CiAgICB9CgogICAgaWYgKGNoID09ICJcIiIpIHsKICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlblN0cmluZyhjaCk7CiAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgIH0KCiAgICBpZiAoY2ggPT0gIigiKSB7CiAgICAgIHN0YXRlLl9pbmRlbnQucHVzaCgiKCIpOwogICAgICAvLyBhZGQgdmlydHVhbCBhbmdlbCB3aW5ncyBzbyB0aGF0IGVkaXRvciBiZWhhdmVzLi4uCiAgICAgIC8vIC4uLm1vcmUgc2FuZSBpbmNhc2Ugb2YgYnJva2VuIGJyYWNrZXRzCiAgICAgIHN0YXRlLl9pbmRlbnQucHVzaCgieyIpOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICBpZiAoY2ggPT09ICJ7IikgewogICAgICBzdGF0ZS5faW5kZW50LnB1c2goInsiKTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgaWYgKGNoID09ICIpIikgIHsKICAgICAgc3RhdGUuX2luZGVudC5wb3AoKTsKICAgICAgc3RhdGUuX2luZGVudC5wb3AoKTsKICAgIH0KCiAgICBpZiAoY2ggPT09ICJ9IikgewogICAgICBzdGF0ZS5faW5kZW50LnBvcCgpOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICBpZiAoY2ggPT0gIiwiKQogICAgICByZXR1cm4gbnVsbDsKCiAgICBpZiAoY2ggPT0gIjsiKQogICAgICByZXR1cm4gbnVsbDsKCgogICAgaWYgKC9be31cKFwpLDtdLy50ZXN0KGNoKSkKICAgICAgcmV0dXJuIG51bGw7CgogICAgLy8gMSpESUdJVCAiSyIgLyAiTSIgLyAiRyIKICAgIGlmICgvXGQvLnRlc3QoY2gpKSB7CiAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1xkXS8pOwogICAgICBzdHJlYW0uZWF0KC9bS2tNbUdnXS8pOwogICAgICByZXR1cm4gIm51bWJlciI7CiAgICB9CgogICAgLy8gIjoiIChBTFBIQSAvICJfIikgKihBTFBIQSAvIERJR0lUIC8gIl8iKQogICAgaWYgKGNoID09ICI6IikgewogICAgICBzdHJlYW0uZWF0V2hpbGUoL1thLXpBLVpfXS8pOwogICAgICBzdHJlYW0uZWF0V2hpbGUoL1thLXpBLVowLTlfXS8pOwoKICAgICAgcmV0dXJuICJvcGVyYXRvciI7CiAgICB9CgogICAgc3RyZWFtLmVhdFdoaWxlKC9cdy8pOwogICAgdmFyIGN1ciA9IHN0cmVhbS5jdXJyZW50KCk7CgogICAgLy8gInRleHQ6IiAqKFNQIC8gSFRBQikgKGhhc2gtY29tbWVudCAvIENSTEYpCiAgICAvLyAqKG11bHRpbGluZS1saXRlcmFsIC8gbXVsdGlsaW5lLWRvdHN0YXJ0KQogICAgLy8gIi4iIENSTEYKICAgIGlmICgoY3VyID09ICJ0ZXh0IikgJiYgc3RyZWFtLmVhdCgiOiIpKQogICAgewogICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuTXVsdGlMaW5lU3RyaW5nOwogICAgICByZXR1cm4gInN0cmluZyI7CiAgICB9CgogICAgaWYgKGtleXdvcmRzLnByb3BlcnR5SXNFbnVtZXJhYmxlKGN1cikpCiAgICAgIHJldHVybiAia2V5d29yZCI7CgogICAgaWYgKGF0b21zLnByb3BlcnR5SXNFbnVtZXJhYmxlKGN1cikpCiAgICAgIHJldHVybiAiYXRvbSI7CgogICAgcmV0dXJuIG51bGw7CiAgfQoKICBmdW5jdGlvbiB0b2tlbk11bHRpTGluZVN0cmluZyhzdHJlYW0sIHN0YXRlKQogIHsKICAgIHN0YXRlLl9tdWx0aUxpbmVTdHJpbmcgPSB0cnVlOwogICAgLy8gdGhlIGZpcnN0IGxpbmUgaXMgc3BlY2lhbCBpdCBtYXkgY29udGFpbiBhIGNvbW1lbnQKICAgIGlmICghc3RyZWFtLnNvbCgpKSB7CiAgICAgIHN0cmVhbS5lYXRTcGFjZSgpOwoKICAgICAgaWYgKHN0cmVhbS5wZWVrKCkgPT0gIiMiKSB7CiAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICAgIHJldHVybiAiY29tbWVudCI7CiAgICAgIH0KCiAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgfQoKICAgIGlmICgoc3RyZWFtLm5leHQoKSA9PSAiLiIpICAmJiAoc3RyZWFtLmVvbCgpKSkKICAgIHsKICAgICAgc3RhdGUuX211bHRpTGluZVN0cmluZyA9IGZhbHNlOwogICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTsKICAgIH0KCiAgICByZXR1cm4gInN0cmluZyI7CiAgfQoKICBmdW5jdGlvbiB0b2tlbkNDb21tZW50KHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBtYXliZUVuZCA9IGZhbHNlLCBjaDsKICAgIHdoaWxlICgoY2ggPSBzdHJlYW0ubmV4dCgpKSAhPSBudWxsKSB7CiAgICAgIGlmIChtYXliZUVuZCAmJiBjaCA9PSAiLyIpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBtYXliZUVuZCA9IChjaCA9PSAiKiIpOwogICAgfQogICAgcmV0dXJuICJjb21tZW50IjsKICB9CgogIGZ1bmN0aW9uIHRva2VuU3RyaW5nKHF1b3RlKSB7CiAgICByZXR1cm4gZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICB2YXIgZXNjYXBlZCA9IGZhbHNlLCBjaDsKICAgICAgd2hpbGUgKChjaCA9IHN0cmVhbS5uZXh0KCkpICE9IG51bGwpIHsKICAgICAgICBpZiAoY2ggPT0gcXVvdGUgJiYgIWVzY2FwZWQpCiAgICAgICAgICBicmVhazsKICAgICAgICBlc2NhcGVkID0gIWVzY2FwZWQgJiYgY2ggPT0gIlxcIjsKICAgICAgfQogICAgICBpZiAoIWVzY2FwZWQpIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlOwogICAgICByZXR1cm4gInN0cmluZyI7CiAgICB9OwogIH0KCiAgcmV0dXJuIHsKICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKGJhc2UpIHsKICAgICAgcmV0dXJuIHt0b2tlbml6ZTogdG9rZW5CYXNlLAogICAgICAgICAgICAgIGJhc2VJbmRlbnQ6IGJhc2UgfHwgMCwKICAgICAgICAgICAgICBfaW5kZW50OiBbXX07CiAgICB9LAoKICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIGlmIChzdHJlYW0uZWF0U3BhY2UoKSkKICAgICAgICByZXR1cm4gbnVsbDsKCiAgICAgIHJldHVybiAoc3RhdGUudG9rZW5pemUgfHwgdG9rZW5CYXNlKShzdHJlYW0sIHN0YXRlKTs7CiAgICB9LAoKICAgIGluZGVudDogZnVuY3Rpb24oc3RhdGUsIF90ZXh0QWZ0ZXIpIHsKICAgICAgdmFyIGxlbmd0aCA9IHN0YXRlLl9pbmRlbnQubGVuZ3RoOwogICAgICBpZiAoX3RleHRBZnRlciAmJiAoX3RleHRBZnRlclswXSA9PSAifSIpKQogICAgICAgIGxlbmd0aC0tOwoKICAgICAgaWYgKGxlbmd0aCA8MCkKICAgICAgICBsZW5ndGggPSAwOwoKICAgICAgcmV0dXJuIGxlbmd0aCAqIGluZGVudFVuaXQ7CiAgICB9LAoKICAgIGVsZWN0cmljQ2hhcnM6ICJ9IgogIH07Cn0pOwoKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJhcHBsaWNhdGlvbi9zaWV2ZSIsICJzaWV2ZSIpOwoKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/smalltalk/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/smalltalk/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogU21hbGx0YWxrIG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vLi4vYWRkb24vZWRpdC9tYXRjaGJyYWNrZXRzLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9InNtYWxsdGFsay5qcyI+PC9zY3JpcHQ+CjxzdHlsZT4KICAgICAgLkNvZGVNaXJyb3Ige2JvcmRlcjogMnB4IHNvbGlkICNkZWU7IGJvcmRlci1yaWdodC13aWR0aDogMTBweDt9CiAgICAgIC5Db2RlTWlycm9yLWd1dHRlciB7Ym9yZGVyOiBub25lOyBiYWNrZ3JvdW5kOiAjZGVlO30KICAgICAgLkNvZGVNaXJyb3ItZ3V0dGVyIHByZSB7Y29sb3I6IHdoaXRlOyBmb250LXdlaWdodDogYm9sZDt9CiAgICA8L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5TbWFsbHRhbGs8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPlNtYWxsdGFsayBtb2RlPC9oMj4KPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KIiAKICAgIFRoaXMgaXMgYSB0ZXN0IG9mIHRoZSBTbWFsbHRhbGsgY29kZQoiClNlYXNpZGUuV0FDb21wb25lbnQgc3ViY2xhc3M6ICNNeUNvdW50ZXIgWwogICAgfCBjb3VudCB8CiAgICBNeUNvdW50ZXIgY2xhc3MgJmd0OyZndDsgY2FuQmVSb290IFsgXnRydWUgXQoKICAgIGluaXRpYWxpemUgWwogICAgICAgIHN1cGVyIGluaXRpYWxpemUuCiAgICAgICAgY291bnQgOj0gMC4KICAgIF0KICAgIHN0YXRlcyBbIF57IHNlbGYgfSBdCiAgICByZW5kZXJDb250ZW50T246IGh0bWwgWwogICAgICAgIGh0bWwgaGVhZGluZzogY291bnQuCiAgICAgICAgaHRtbCBhbmNob3IgY2FsbGJhY2s6IFsgY291bnQgOj0gY291bnQgKyAxIF07IHdpdGg6ICcrKycuCiAgICAgICAgaHRtbCBzcGFjZS4KICAgICAgICBodG1sIGFuY2hvciBjYWxsYmFjazogWyBjb3VudCA6PSBjb3VudCAtIDEgXTsgd2l0aDogJy0tJy4KICAgIF0KXQoKTXlDb3VudGVyIHJlZ2lzdGVyQXNBcHBsaWNhdGlvbjogJ215Y291bnRlcicKPC90ZXh0YXJlYT48L2Zvcm0+CgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgICAgICBtYXRjaEJyYWNrZXRzOiB0cnVlLAogICAgICAgIG1vZGU6ICJ0ZXh0L3gtc3RzcmMiLAogICAgICAgIGluZGVudFVuaXQ6IDQKICAgICAgfSk7CiAgICA8L3NjcmlwdD4KCiAgICA8cD5TaW1wbGUgU21hbGx0YWxrIG1vZGUuPC9wPgoKICAgIDxwPjxzdHJvbmc+TUlNRSB0eXBlcyBkZWZpbmVkOjwvc3Ryb25nPiA8Y29kZT50ZXh0L3gtc3RzcmM8L2NvZGU+LjwvcD4KICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/smalltalk/smalltalk.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCdzbWFsbHRhbGsnLCBmdW5jdGlvbihjb25maWcpIHsKCiAgdmFyIHNwZWNpYWxDaGFycyA9IC9bK1wtXC9cXCp+PD49QCV8Jj8hLiw6O15dLzsKICB2YXIga2V5d29yZHMgPSAvdHJ1ZXxmYWxzZXxuaWx8c2VsZnxzdXBlcnx0aGlzQ29udGV4dC87CgogIHZhciBDb250ZXh0ID0gZnVuY3Rpb24odG9rZW5pemVyLCBwYXJlbnQpIHsKICAgIHRoaXMubmV4dCA9IHRva2VuaXplcjsKICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwogIH07CgogIHZhciBUb2tlbiA9IGZ1bmN0aW9uKG5hbWUsIGNvbnRleHQsIGVvcykgewogICAgdGhpcy5uYW1lID0gbmFtZTsKICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7CiAgICB0aGlzLmVvcyA9IGVvczsKICB9OwoKICB2YXIgU3RhdGUgPSBmdW5jdGlvbigpIHsKICAgIHRoaXMuY29udGV4dCA9IG5ldyBDb250ZXh0KG5leHQsIG51bGwpOwogICAgdGhpcy5leHBlY3RWYXJpYWJsZSA9IHRydWU7CiAgICB0aGlzLmluZGVudGF0aW9uID0gMDsKICAgIHRoaXMudXNlckluZGVudGF0aW9uRGVsdGEgPSAwOwogIH07CgogIFN0YXRlLnByb3RvdHlwZS51c2VySW5kZW50ID0gZnVuY3Rpb24oaW5kZW50YXRpb24pIHsKICAgIHRoaXMudXNlckluZGVudGF0aW9uRGVsdGEgPSBpbmRlbnRhdGlvbiA+IDAgPyAoaW5kZW50YXRpb24gLyBjb25maWcuaW5kZW50VW5pdCAtIHRoaXMuaW5kZW50YXRpb24pIDogMDsKICB9OwoKICB2YXIgbmV4dCA9IGZ1bmN0aW9uKHN0cmVhbSwgY29udGV4dCwgc3RhdGUpIHsKICAgIHZhciB0b2tlbiA9IG5ldyBUb2tlbihudWxsLCBjb250ZXh0LCBmYWxzZSk7CiAgICB2YXIgYUNoYXIgPSBzdHJlYW0ubmV4dCgpOwoKICAgIGlmIChhQ2hhciA9PT0gJyInKSB7CiAgICAgIHRva2VuID0gbmV4dENvbW1lbnQoc3RyZWFtLCBuZXcgQ29udGV4dChuZXh0Q29tbWVudCwgY29udGV4dCkpOwoKICAgIH0gZWxzZSBpZiAoYUNoYXIgPT09ICdcJycpIHsKICAgICAgdG9rZW4gPSBuZXh0U3RyaW5nKHN0cmVhbSwgbmV3IENvbnRleHQobmV4dFN0cmluZywgY29udGV4dCkpOwoKICAgIH0gZWxzZSBpZiAoYUNoYXIgPT09ICcjJykgewogICAgICBpZiAoc3RyZWFtLnBlZWsoKSA9PT0gJ1wnJykgewogICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgdG9rZW4gPSBuZXh0U3ltYm9sKHN0cmVhbSwgbmV3IENvbnRleHQobmV4dFN5bWJvbCwgY29udGV4dCkpOwogICAgICB9IGVsc2UgewogICAgICAgIGlmIChzdHJlYW0uZWF0V2hpbGUoL1teIC57fVxbXF0oKV0vKSkKICAgICAgICAgIHRva2VuLm5hbWUgPSAnc3RyaW5nLTInOwogICAgICAgIGVsc2UKICAgICAgICAgIHRva2VuLm5hbWUgPSAnbWV0YSc7CiAgICAgIH0KCiAgICB9IGVsc2UgaWYgKGFDaGFyID09PSAnJCcpIHsKICAgICAgaWYgKHN0cmVhbS5uZXh0KCkgPT09ICc8JykgewogICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW14gPl0vKTsKICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICB9CiAgICAgIHRva2VuLm5hbWUgPSAnc3RyaW5nLTInOwoKICAgIH0gZWxzZSBpZiAoYUNoYXIgPT09ICd8JyAmJiBzdGF0ZS5leHBlY3RWYXJpYWJsZSkgewogICAgICB0b2tlbi5jb250ZXh0ID0gbmV3IENvbnRleHQobmV4dFRlbXBvcmFyaWVzLCBjb250ZXh0KTsKCiAgICB9IGVsc2UgaWYgKC9bXFtcXXt9KCldLy50ZXN0KGFDaGFyKSkgewogICAgICB0b2tlbi5uYW1lID0gJ2JyYWNrZXQnOwogICAgICB0b2tlbi5lb3MgPSAvW1xbeyhdLy50ZXN0KGFDaGFyKTsKCiAgICAgIGlmIChhQ2hhciA9PT0gJ1snKSB7CiAgICAgICAgc3RhdGUuaW5kZW50YXRpb24rKzsKICAgICAgfSBlbHNlIGlmIChhQ2hhciA9PT0gJ10nKSB7CiAgICAgICAgc3RhdGUuaW5kZW50YXRpb24gPSBNYXRoLm1heCgwLCBzdGF0ZS5pbmRlbnRhdGlvbiAtIDEpOwogICAgICB9CgogICAgfSBlbHNlIGlmIChzcGVjaWFsQ2hhcnMudGVzdChhQ2hhcikpIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKHNwZWNpYWxDaGFycyk7CiAgICAgIHRva2VuLm5hbWUgPSAnb3BlcmF0b3InOwogICAgICB0b2tlbi5lb3MgPSBhQ2hhciAhPT0gJzsnOyAvLyA7IGNhc2NhZGVkIG1lc3NhZ2UgZXhwcmVzc2lvbgoKICAgIH0gZWxzZSBpZiAoL1xkLy50ZXN0KGFDaGFyKSkgewogICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcd1xkXS8pOwogICAgICB0b2tlbi5uYW1lID0gJ251bWJlcic7CgogICAgfSBlbHNlIGlmICgvW1x3X10vLnRlc3QoYUNoYXIpKSB7CiAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1x3XGRfXS8pOwogICAgICB0b2tlbi5uYW1lID0gc3RhdGUuZXhwZWN0VmFyaWFibGUgPyAoa2V5d29yZHMudGVzdChzdHJlYW0uY3VycmVudCgpKSA/ICdrZXl3b3JkJyA6ICd2YXJpYWJsZScpIDogbnVsbDsKCiAgICB9IGVsc2UgewogICAgICB0b2tlbi5lb3MgPSBzdGF0ZS5leHBlY3RWYXJpYWJsZTsKICAgIH0KCiAgICByZXR1cm4gdG9rZW47CiAgfTsKCiAgdmFyIG5leHRDb21tZW50ID0gZnVuY3Rpb24oc3RyZWFtLCBjb250ZXh0KSB7CiAgICBzdHJlYW0uZWF0V2hpbGUoL1teIl0vKTsKICAgIHJldHVybiBuZXcgVG9rZW4oJ2NvbW1lbnQnLCBzdHJlYW0uZWF0KCciJykgPyBjb250ZXh0LnBhcmVudCA6IGNvbnRleHQsIHRydWUpOwogIH07CgogIHZhciBuZXh0U3RyaW5nID0gZnVuY3Rpb24oc3RyZWFtLCBjb250ZXh0KSB7CiAgICBzdHJlYW0uZWF0V2hpbGUoL1teJ10vKTsKICAgIHJldHVybiBuZXcgVG9rZW4oJ3N0cmluZycsIHN0cmVhbS5lYXQoJ1wnJykgPyBjb250ZXh0LnBhcmVudCA6IGNvbnRleHQsIGZhbHNlKTsKICB9OwoKICB2YXIgbmV4dFN5bWJvbCA9IGZ1bmN0aW9uKHN0cmVhbSwgY29udGV4dCkgewogICAgc3RyZWFtLmVhdFdoaWxlKC9bXiddLyk7CiAgICByZXR1cm4gbmV3IFRva2VuKCdzdHJpbmctMicsIHN0cmVhbS5lYXQoJ1wnJykgPyBjb250ZXh0LnBhcmVudCA6IGNvbnRleHQsIGZhbHNlKTsKICB9OwoKICB2YXIgbmV4dFRlbXBvcmFyaWVzID0gZnVuY3Rpb24oc3RyZWFtLCBjb250ZXh0KSB7CiAgICB2YXIgdG9rZW4gPSBuZXcgVG9rZW4obnVsbCwgY29udGV4dCwgZmFsc2UpOwogICAgdmFyIGFDaGFyID0gc3RyZWFtLm5leHQoKTsKCiAgICBpZiAoYUNoYXIgPT09ICd8JykgewogICAgICB0b2tlbi5jb250ZXh0ID0gY29udGV4dC5wYXJlbnQ7CiAgICAgIHRva2VuLmVvcyA9IHRydWU7CgogICAgfSBlbHNlIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXnxdLyk7CiAgICAgIHRva2VuLm5hbWUgPSAndmFyaWFibGUnOwogICAgfQoKICAgIHJldHVybiB0b2tlbjsKICB9OwoKICByZXR1cm4gewogICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBuZXcgU3RhdGU7CiAgICB9LAoKICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHN0YXRlLnVzZXJJbmRlbnQoc3RyZWFtLmluZGVudGF0aW9uKCkpOwoKICAgICAgaWYgKHN0cmVhbS5lYXRTcGFjZSgpKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KCiAgICAgIHZhciB0b2tlbiA9IHN0YXRlLmNvbnRleHQubmV4dChzdHJlYW0sIHN0YXRlLmNvbnRleHQsIHN0YXRlKTsKICAgICAgc3RhdGUuY29udGV4dCA9IHRva2VuLmNvbnRleHQ7CiAgICAgIHN0YXRlLmV4cGVjdFZhcmlhYmxlID0gdG9rZW4uZW9zOwoKICAgICAgcmV0dXJuIHRva2VuLm5hbWU7CiAgICB9LAoKICAgIGJsYW5rTGluZTogZnVuY3Rpb24oc3RhdGUpIHsKICAgICAgc3RhdGUudXNlckluZGVudCgwKTsKICAgIH0sCgogICAgaW5kZW50OiBmdW5jdGlvbihzdGF0ZSwgdGV4dEFmdGVyKSB7CiAgICAgIHZhciBpID0gc3RhdGUuY29udGV4dC5uZXh0ID09PSBuZXh0ICYmIHRleHRBZnRlciAmJiB0ZXh0QWZ0ZXIuY2hhckF0KDApID09PSAnXScgPyAtMSA6IHN0YXRlLnVzZXJJbmRlbnRhdGlvbkRlbHRhOwogICAgICByZXR1cm4gKHN0YXRlLmluZGVudGF0aW9uICsgaSkgKiBjb25maWcuaW5kZW50VW5pdDsKICAgIH0sCgogICAgZWxlY3RyaWNDaGFyczogJ10nCiAgfTsKCn0pOwoKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCd0ZXh0L3gtc3RzcmMnLCB7bmFtZTogJ3NtYWxsdGFsayd9KTsKCn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/smarty/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/smarty/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogU21hcnR5IG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0ic21hcnR5LmpzIj48L3NjcmlwdD4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4uQ29kZU1pcnJvciB7Ym9yZGVyLXRvcDogMXB4IHNvbGlkIGJsYWNrOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGltZyBpZD1sb2dvIHNyYz0iLi4vLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+TGFuZ3VhZ2UgbW9kZXM8L2E+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPlNtYXJ0eTwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+U21hcnR5IG1vZGU8L2gyPgo8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgp7ZXh0ZW5kcyBmaWxlPSJwYXJlbnQudHBsIn0Ke2luY2x1ZGUgZmlsZT0idGVtcGxhdGUudHBsIn0KCnsqIHNvbWUgZXhhbXBsZSBTbWFydHkgY29udGVudCAqfQp7aWYgaXNzZXQoJG5hbWUpICYmICRuYW1lID09ICdCbG9nJ30KICBUaGlzIGlzIGEgeyR2YXJ9LgogIHskaW50ZWdlciA9IDQ1MX0sIHskYXJyYXlbXSA9ICJhIn0sIHskc3RyaW5ndmFyID0gInN0cmluZyJ9CiAge2Fzc2lnbiB2YXI9J2JvYicgdmFsdWU9JHZhci5wcm9wfQp7ZWxzZWlmICRuYW1lID09ICRmb299CiAge2Z1bmN0aW9uIG5hbWU9bWVudSBsZXZlbD0wfQogICAge2ZvcmVhY2ggJGRhdGEgYXMgJGVudHJ5fQogICAgICB7aWYgaXNfYXJyYXkoJGVudHJ5KX0KICAgICAgICAtIHskZW50cnlAa2V5fQogICAgICAgIHttZW51IGRhdGE9JGVudHJ5IGxldmVsPSRsZXZlbCsxfQogICAgICB7ZWxzZX0KICAgICAgICB7JGVudHJ5fQogICAgICB7L2lmfQogICAgey9mb3JlYWNofQogIHsvZnVuY3Rpb259CnsvaWZ9PC90ZXh0YXJlYT48L2Zvcm0+CgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgICAgICBtb2RlOiAic21hcnR5IgogICAgICB9KTsKICAgIDwvc2NyaXB0PgoKICAgIDxiciAvPgoKCTxoMz5TbWFydHkgMiwgY3VzdG9tIGRlbGltaXRlcnM8L2gzPgogICAgPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlMiIgbmFtZT0iY29kZTIiPgp7LS1leHRlbmRzIGZpbGU9InBhcmVudC50cGwiLS19CnstLWluY2x1ZGUgZmlsZT0idGVtcGxhdGUudHBsIi0tfQoKey0tKiBzb21lIGV4YW1wbGUgU21hcnR5IGNvbnRlbnQgKi0tfQp7LS1pZiBpc3NldCgkbmFtZSkgJiYgJG5hbWUgPT0gJ0Jsb2cnLS19CiAgVGhpcyBpcyBhIHstLSR2YXItLX0uCiAgey0tJGludGVnZXIgPSA0NTEtLX0sIHstLSRhcnJheVtdID0gImEiLS19LCB7LS0kc3RyaW5ndmFyID0gInN0cmluZyItLX0KICB7LS1hc3NpZ24gdmFyPSdib2InIHZhbHVlPSR2YXIucHJvcC0tfQp7LS1lbHNlaWYgJG5hbWUgPT0gJGZvby0tfQogIHstLWZ1bmN0aW9uIG5hbWU9bWVudSBsZXZlbD0wLS19CiAgICB7LS1mb3JlYWNoICRkYXRhIGFzICRlbnRyeS0tfQogICAgICB7LS1pZiBpc19hcnJheSgkZW50cnkpLS19CiAgICAgICAgLSB7LS0kZW50cnlAa2V5LS19CiAgICAgICAgey0tbWVudSBkYXRhPSRlbnRyeSBsZXZlbD0kbGV2ZWwrMS0tfQogICAgICB7LS1lbHNlLS19CiAgICAgICAgey0tJGVudHJ5LS19CiAgICAgIHstLS9pZi0tfQogICAgey0tL2ZvcmVhY2gtLX0KICB7LS0vZnVuY3Rpb24tLX0Key0tL2lmLS19PC90ZXh0YXJlYT48L2Zvcm0+CgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlMiIpLCB7CiAgICAgICAgbGluZU51bWJlcnM6IHRydWUsCiAgICAgICAgbW9kZTogewogICAgICAgICAgbmFtZTogInNtYXJ0eSIsCiAgICAgICAgICBsZWZ0RGVsaW1pdGVyOiAiey0tIiwKICAgICAgICAgIHJpZ2h0RGVsaW1pdGVyOiAiLS19IgogICAgICAgIH0KICAgICAgfSk7CiAgICA8L3NjcmlwdD4KCgk8YnIgLz4KCgk8aDM+U21hcnR5IDM8L2gzPgoKCTx0ZXh0YXJlYSBpZD0iY29kZTMiIG5hbWU9ImNvZGUzIj4KTmVzdGVkIHRhZ3MgeyRmb289e2NvdW50ZXIgb25lPTEgdHdvPXtpbmNlcHRpb259fSszfSBhcmUgbm93IHZhbGlkIGluIFNtYXJ0eSAzLgoKPHNjcmlwdD4KZnVuY3Rpb24gdGVzdCgpIHsKCWNvbnNvbGUubG9nKCJTbWFydHkgMyBwZXJtaXRzIHNpbmdsZSBjdXJseSBicmFjZXMgZm9sbG93ZWQgYnkgd2hpdGVzcGFjZSB0byBOT1Qgc2xpcCBpbnRvIFNtYXJ0eSBtb2RlLiIpOwp9Cjwvc2NyaXB0PgoKe2Fzc2lnbiB2YXI9Zm9vIHZhbHVlPVsxLDIsM119Cnthc3NpZ24gdmFyPWZvbyB2YWx1ZT1bJ3knPT4neWVsbG93JywnYic9PidibHVlJ119Cnthc3NpZ24gdmFyPWZvbyB2YWx1ZT1bMSxbOSw4XSwzXX0KCnskZm9vPSRiYXIrMn0geyogYSBjb21tZW50ICp9CnskZm9vLmJhcj0xfSAgeyogYW5vdGhlciBjb21tZW50ICp9CnskZm9vID0gbXlmdW5jdCgoJHgrJHkpKjMpfQp7JGZvbyA9IHN0cmxlbigkYmFyKX0KeyRmb28uYmFyLmJhej0xfSwgeyRmb29bXT0xfQoKU21hcnR5ICJkb3QiIHN5bnRheCAobm90ZTogZW1iZWRkZWQge30gYXJlIHVzZWQgdG8gYWRkcmVzcyBhbWJpZ3VpdGllcyk6Cgp7JGZvby5hLmIuY30gICAgICA9PiAkZm9vWydhJ11bJ2InXVsnYyddCnskZm9vLmEuJGIuY30gICAgID0+ICRmb29bJ2EnXVskYl1bJ2MnXQp7JGZvby5hLnskYis0fS5jfSA9PiAkZm9vWydhJ11bJGIrNF1bJ2MnXQp7JGZvby5hLnskYi5jfX0gICA9PiAkZm9vWydhJ11bJGJbJ2MnXV0KCnskb2JqZWN0LT5tZXRob2QxKCR4KS0+bWV0aG9kMigkeSl9PC90ZXh0YXJlYT4KCgk8c2NyaXB0PgoJCXZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZTMiKSwgewoJCQlsaW5lTnVtYmVyczogdHJ1ZSwKCQkJbW9kZTogInNtYXJ0eSIsCgkJCXNtYXJ0eVZlcnNpb246IDMKCQl9KTsKCTwvc2NyaXB0PgoKCiAgICA8cD5BIHBsYWluIHRleHQvU21hcnR5IHZlcnNpb24gMiBvciAzIG1vZGUsIHdoaWNoIGFsbG93cyBmb3IgY3VzdG9tIGRlbGltaXRlciB0YWdzLjwvcD4KCiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC94LXNtYXJ0eTwvY29kZT48L3A+CiAgPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/smarty/smarty.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovKioKICogU21hcnR5IDIgYW5kIDMgbW9kZS4KICovCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJzbWFydHkiLCBmdW5jdGlvbihjb25maWcpIHsKICAidXNlIHN0cmljdCI7CgogIC8vIG91ciBkZWZhdWx0IHNldHRpbmdzOyBjaGVjayB0byBzZWUgaWYgdGhleSdyZSBvdmVycmlkZGVuCiAgdmFyIHNldHRpbmdzID0gewogICAgcmlnaHREZWxpbWl0ZXI6ICd9JywKICAgIGxlZnREZWxpbWl0ZXI6ICd7JywKICAgIHNtYXJ0eVZlcnNpb246IDIgLy8gZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKICB9OwogIGlmIChjb25maWcuaGFzT3duUHJvcGVydHkoImxlZnREZWxpbWl0ZXIiKSkgewogICAgc2V0dGluZ3MubGVmdERlbGltaXRlciA9IGNvbmZpZy5sZWZ0RGVsaW1pdGVyOwogIH0KICBpZiAoY29uZmlnLmhhc093blByb3BlcnR5KCJyaWdodERlbGltaXRlciIpKSB7CiAgICBzZXR0aW5ncy5yaWdodERlbGltaXRlciA9IGNvbmZpZy5yaWdodERlbGltaXRlcjsKICB9CiAgaWYgKGNvbmZpZy5oYXNPd25Qcm9wZXJ0eSgic21hcnR5VmVyc2lvbiIpICYmIGNvbmZpZy5zbWFydHlWZXJzaW9uID09PSAzKSB7CiAgICBzZXR0aW5ncy5zbWFydHlWZXJzaW9uID0gMzsKICB9CgogIHZhciBrZXlGdW5jdGlvbnMgPSBbImRlYnVnIiwgImV4dGVuZHMiLCAiZnVuY3Rpb24iLCAiaW5jbHVkZSIsICJsaXRlcmFsIl07CiAgdmFyIGxhc3Q7CiAgdmFyIHJlZ3MgPSB7CiAgICBvcGVyYXRvckNoYXJzOiAvWytcLSomJT08PiE/XS8sCiAgICB2YWxpZElkZW50aWZpZXI6IC9bYS16QS1aMC05X10vLAogICAgc3RyaW5nQ2hhcjogL1snIl0vCiAgfTsKCiAgdmFyIGhlbHBlcnMgPSB7CiAgICBjb250OiBmdW5jdGlvbihzdHlsZSwgbGFzdFR5cGUpIHsKICAgICAgbGFzdCA9IGxhc3RUeXBlOwogICAgICByZXR1cm4gc3R5bGU7CiAgICB9LAogICAgY2hhaW46IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUsIHBhcnNlcikgewogICAgICBzdGF0ZS50b2tlbml6ZSA9IHBhcnNlcjsKICAgICAgcmV0dXJuIHBhcnNlcihzdHJlYW0sIHN0YXRlKTsKICAgIH0KICB9OwoKCiAgLy8gb3VyIHZhcmlvdXMgcGFyc2VycwogIHZhciBwYXJzZXJzID0gewoKICAgIC8vIHRoZSBtYWluIHRva2VuaXplcgogICAgdG9rZW5pemVyOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIGlmIChzdHJlYW0ubWF0Y2goc2V0dGluZ3MubGVmdERlbGltaXRlciwgdHJ1ZSkpIHsKICAgICAgICBpZiAoc3RyZWFtLmVhdCgiKiIpKSB7CiAgICAgICAgICByZXR1cm4gaGVscGVycy5jaGFpbihzdHJlYW0sIHN0YXRlLCBwYXJzZXJzLmluQmxvY2soImNvbW1lbnQiLCAiKiIgKyBzZXR0aW5ncy5yaWdodERlbGltaXRlcikpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvLyBTbWFydHkgMyBhbGxvd3MgeyBhbmQgfSBzdXJyb3VuZGVkIGJ5IHdoaXRlc3BhY2UgdG8gTk9UIHNsaXAgaW50byBTbWFydHkgbW9kZQogICAgICAgICAgc3RhdGUuZGVwdGgrKzsKICAgICAgICAgIHZhciBpc0VvbCA9IHN0cmVhbS5lb2woKTsKICAgICAgICAgIHZhciBpc0ZvbGxvd2VkQnlXaGl0ZXNwYWNlID0gL1xzLy50ZXN0KHN0cmVhbS5wZWVrKCkpOwogICAgICAgICAgaWYgKHNldHRpbmdzLnNtYXJ0eVZlcnNpb24gPT09IDMgJiYgc2V0dGluZ3MubGVmdERlbGltaXRlciA9PT0gInsiICYmIChpc0VvbCB8fCBpc0ZvbGxvd2VkQnlXaGl0ZXNwYWNlKSkgewogICAgICAgICAgICBzdGF0ZS5kZXB0aC0tOwogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gcGFyc2Vycy5zbWFydHk7CiAgICAgICAgICAgIGxhc3QgPSAic3RhcnRUYWciOwogICAgICAgICAgICByZXR1cm4gInRhZyI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgIH0sCgogICAgLy8gcGFyc2luZyBTbWFydHkgY29udGVudAogICAgc21hcnR5OiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIGlmIChzdHJlYW0ubWF0Y2goc2V0dGluZ3MucmlnaHREZWxpbWl0ZXIsIHRydWUpKSB7CiAgICAgICAgaWYgKHNldHRpbmdzLnNtYXJ0eVZlcnNpb24gPT09IDMpIHsKICAgICAgICAgIHN0YXRlLmRlcHRoLS07CiAgICAgICAgICBpZiAoc3RhdGUuZGVwdGggPD0gMCkgewogICAgICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHBhcnNlcnMudG9rZW5pemVyOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHBhcnNlcnMudG9rZW5pemVyOwogICAgICAgIH0KICAgICAgICByZXR1cm4gaGVscGVycy5jb250KCJ0YWciLCBudWxsKTsKICAgICAgfQoKICAgICAgaWYgKHN0cmVhbS5tYXRjaChzZXR0aW5ncy5sZWZ0RGVsaW1pdGVyLCB0cnVlKSkgewogICAgICAgIHN0YXRlLmRlcHRoKys7CiAgICAgICAgcmV0dXJuIGhlbHBlcnMuY29udCgidGFnIiwgInN0YXJ0VGFnIik7CiAgICAgIH0KCiAgICAgIHZhciBjaCA9IHN0cmVhbS5uZXh0KCk7CiAgICAgIGlmIChjaCA9PSAiJCIpIHsKICAgICAgICBzdHJlYW0uZWF0V2hpbGUocmVncy52YWxpZElkZW50aWZpZXIpOwogICAgICAgIHJldHVybiBoZWxwZXJzLmNvbnQoInZhcmlhYmxlLTIiLCAidmFyaWFibGUiKTsKICAgICAgfSBlbHNlIGlmIChjaCA9PSAifCIpIHsKICAgICAgICByZXR1cm4gaGVscGVycy5jb250KCJvcGVyYXRvciIsICJwaXBlIik7CiAgICAgIH0gZWxzZSBpZiAoY2ggPT0gIi4iKSB7CiAgICAgICAgcmV0dXJuIGhlbHBlcnMuY29udCgib3BlcmF0b3IiLCAicHJvcGVydHkiKTsKICAgICAgfSBlbHNlIGlmIChyZWdzLnN0cmluZ0NoYXIudGVzdChjaCkpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHBhcnNlcnMuaW5BdHRyaWJ1dGUoY2gpOwogICAgICAgIHJldHVybiBoZWxwZXJzLmNvbnQoInN0cmluZyIsICJzdHJpbmciKTsKICAgICAgfSBlbHNlIGlmIChyZWdzLm9wZXJhdG9yQ2hhcnMudGVzdChjaCkpIHsKICAgICAgICBzdHJlYW0uZWF0V2hpbGUocmVncy5vcGVyYXRvckNoYXJzKTsKICAgICAgICByZXR1cm4gaGVscGVycy5jb250KCJvcGVyYXRvciIsICJvcGVyYXRvciIpOwogICAgICB9IGVsc2UgaWYgKGNoID09ICJbIiB8fCBjaCA9PSAiXSIpIHsKICAgICAgICByZXR1cm4gaGVscGVycy5jb250KCJicmFja2V0IiwgImJyYWNrZXQiKTsKICAgICAgfSBlbHNlIGlmIChjaCA9PSAiKCIgfHwgY2ggPT0gIikiKSB7CiAgICAgICAgcmV0dXJuIGhlbHBlcnMuY29udCgiYnJhY2tldCIsICJvcGVyYXRvciIpOwogICAgICB9IGVsc2UgaWYgKC9cZC8udGVzdChjaCkpIHsKICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1xkLyk7CiAgICAgICAgcmV0dXJuIGhlbHBlcnMuY29udCgibnVtYmVyIiwgIm51bWJlciIpOwogICAgICB9IGVsc2UgewoKICAgICAgICBpZiAoc3RhdGUubGFzdCA9PSAidmFyaWFibGUiKSB7CiAgICAgICAgICBpZiAoY2ggPT0gIkAiKSB7CiAgICAgICAgICAgIHN0cmVhbS5lYXRXaGlsZShyZWdzLnZhbGlkSWRlbnRpZmllcik7CiAgICAgICAgICAgIHJldHVybiBoZWxwZXJzLmNvbnQoInByb3BlcnR5IiwgInByb3BlcnR5Iik7CiAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICJ8IikgewogICAgICAgICAgICBzdHJlYW0uZWF0V2hpbGUocmVncy52YWxpZElkZW50aWZpZXIpOwogICAgICAgICAgICByZXR1cm4gaGVscGVycy5jb250KCJxdWFsaWZpZXIiLCAibW9kaWZpZXIiKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHN0YXRlLmxhc3QgPT0gInBpcGUiKSB7CiAgICAgICAgICBzdHJlYW0uZWF0V2hpbGUocmVncy52YWxpZElkZW50aWZpZXIpOwogICAgICAgICAgcmV0dXJuIGhlbHBlcnMuY29udCgicXVhbGlmaWVyIiwgIm1vZGlmaWVyIik7CiAgICAgICAgfSBlbHNlIGlmIChzdGF0ZS5sYXN0ID09ICJ3aGl0ZXNwYWNlIikgewogICAgICAgICAgc3RyZWFtLmVhdFdoaWxlKHJlZ3MudmFsaWRJZGVudGlmaWVyKTsKICAgICAgICAgIHJldHVybiBoZWxwZXJzLmNvbnQoImF0dHJpYnV0ZSIsICJtb2RpZmllciIpOwogICAgICAgIH0gaWYgKHN0YXRlLmxhc3QgPT0gInByb3BlcnR5IikgewogICAgICAgICAgc3RyZWFtLmVhdFdoaWxlKHJlZ3MudmFsaWRJZGVudGlmaWVyKTsKICAgICAgICAgIHJldHVybiBoZWxwZXJzLmNvbnQoInByb3BlcnR5IiwgbnVsbCk7CiAgICAgICAgfSBlbHNlIGlmICgvXHMvLnRlc3QoY2gpKSB7CiAgICAgICAgICBsYXN0ID0gIndoaXRlc3BhY2UiOwogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICB2YXIgc3RyID0gIiI7CiAgICAgICAgaWYgKGNoICE9ICIvIikgewogICAgICAgICAgc3RyICs9IGNoOwogICAgICAgIH0KICAgICAgICB2YXIgYyA9IG51bGw7CiAgICAgICAgd2hpbGUgKGMgPSBzdHJlYW0uZWF0KHJlZ3MudmFsaWRJZGVudGlmaWVyKSkgewogICAgICAgICAgc3RyICs9IGM7CiAgICAgICAgfQogICAgICAgIGZvciAodmFyIGk9MCwgaj1rZXlGdW5jdGlvbnMubGVuZ3RoOyBpPGo7IGkrKykgewogICAgICAgICAgaWYgKGtleUZ1bmN0aW9uc1tpXSA9PSBzdHIpIHsKICAgICAgICAgICAgcmV0dXJuIGhlbHBlcnMuY29udCgia2V5d29yZCIsICJrZXl3b3JkIik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICgvXHMvLnRlc3QoY2gpKSB7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGhlbHBlcnMuY29udCgidGFnIiwgInRhZyIpOwogICAgICB9CiAgICB9LAoKICAgIGluQXR0cmlidXRlOiBmdW5jdGlvbihxdW90ZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICAgIHZhciBwcmV2Q2hhciA9IG51bGw7CiAgICAgICAgdmFyIGN1cnJDaGFyID0gbnVsbDsKICAgICAgICB3aGlsZSAoIXN0cmVhbS5lb2woKSkgewogICAgICAgICAgY3VyckNoYXIgPSBzdHJlYW0ucGVlaygpOwogICAgICAgICAgaWYgKHN0cmVhbS5uZXh0KCkgPT0gcXVvdGUgJiYgcHJldkNoYXIgIT09ICdcXCcpIHsKICAgICAgICAgICAgc3RhdGUudG9rZW5pemUgPSBwYXJzZXJzLnNtYXJ0eTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBwcmV2Q2hhciA9IGN1cnJDaGFyOwogICAgICAgIH0KICAgICAgICByZXR1cm4gInN0cmluZyI7CiAgICAgIH07CiAgICB9LAoKICAgIGluQmxvY2s6IGZ1bmN0aW9uKHN0eWxlLCB0ZXJtaW5hdG9yKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgICAgd2hpbGUgKCFzdHJlYW0uZW9sKCkpIHsKICAgICAgICAgIGlmIChzdHJlYW0ubWF0Y2godGVybWluYXRvcikpIHsKICAgICAgICAgICAgc3RhdGUudG9rZW5pemUgPSBwYXJzZXJzLnRva2VuaXplcjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc3R5bGU7CiAgICAgIH07CiAgICB9CiAgfTsKCgogIC8vIHRoZSBwdWJsaWMgQVBJIGZvciBDb2RlTWlycm9yCiAgcmV0dXJuIHsKICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gewogICAgICAgIHRva2VuaXplOiBwYXJzZXJzLnRva2VuaXplciwKICAgICAgICBtb2RlOiAic21hcnR5IiwKICAgICAgICBsYXN0OiBudWxsLAogICAgICAgIGRlcHRoOiAwCiAgICAgIH07CiAgICB9LAogICAgdG9rZW46IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgdmFyIHN0eWxlID0gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CiAgICAgIHN0YXRlLmxhc3QgPSBsYXN0OwogICAgICByZXR1cm4gc3R5bGU7CiAgICB9LAogICAgZWxlY3RyaWNDaGFyczogIiIKICB9Owp9KTsKCkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC94LXNtYXJ0eSIsICJzbWFydHkiKTsKCn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/smartymixed/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/smartymixed/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogU21hcnR5IG1peGVkIG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vLi4vbW9kZS94bWwveG1sLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uLy4uL21vZGUvamF2YXNjcmlwdC9qYXZhc2NyaXB0LmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uLy4uL21vZGUvY3NzL2Nzcy5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi8uLi9tb2RlL2h0bWxtaXhlZC9odG1sbWl4ZWQuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vLi4vbW9kZS9zbWFydHkvc21hcnR5LmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uLy4uL21vZGUvc21hcnR5bWl4ZWQvc21hcnR5bWl4ZWQuanMiPjwvc2NyaXB0Pgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5TbWFydHkgbWl4ZWQ8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPlNtYXJ0eSBtaXhlZCBtb2RlPC9oMj4KPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KeyoqCiogQGJyaWVmIFNtYXJ0eSBtaXhlZCBtb2RlCiogQGF1dGhvciBSdXNsYW4gT3NtYW5vdgoqIEBkYXRlIDI5LjA2LjIwMTMKKn0KPGh0bWw+CjxoZWFkPgogIDx0aXRsZT57JHRpdGxlfGh0bWxzcGVjaWFsY2hhcnN8dHJ1bmNhdGU6MzB9PC90aXRsZT4KPC9oZWFkPgo8Ym9keSBjbGFzcz0ieyRib2R5Y2xhc3N9Ij4KICB7KiBNdWx0aWxpbmUgc21hcnR5CiAgKiBjb21tZW50LCBubyB7JHZhcmlhYmxlc30gaGVyZQogICp9CiAge2xpdGVyYWx9CiAge2xpdGVyYWx9IGlzIGp1c3QgYW4gSFRNTCB0ZXh0LgogIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4vLzwhW0NEQVRBWwogICAgdmFyIGEgPSB7JGp1c3RfYV9ub3JtYWxfanNfb2JqZWN0IDogInZhbHVlIn07CiAgICB2YXIgbXlDb2RlTWlycm9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgICBtb2RlICAgICAgICAgICA6ICJzbWFydHltaXhlZCIsCiAgICAgIHRhYlNpemUgICAgICAgIDogMiwKICAgICAgaW5kZW50VW5pdCAgICAgOiAyLAogICAgICBpbmRlbnRXaXRoVGFicyA6IGZhbHNlLAogICAgICBsaW5lTnVtYmVycyAgICA6IHRydWUsCiAgICAgIHNtYXJ0eVZlcnNpb24gIDogMwogICAgfSk7CiAgICAvLyBdXT4KICA8L3NjcmlwdD4KICA8c3R5bGU+CiAgICAvKiBDU1MgY29udGVudCAKICAgIHskbm9fc21hcnR5fSAqLwogICAgLnNvbWUtY2xhc3MgeyBmb250LXdlaWdodDogYm9sZGVyOyBjb2xvcjogIm9yYW5nZSI7IH0KICA8L3N0eWxlPgogIHsvbGl0ZXJhbH0KCiAge2V4dGVuZHMgZmlsZT0icGFyZW50LnRwbCJ9CiAge2luY2x1ZGUgZmlsZT0idGVtcGxhdGUudHBsIn0KCiAgeyogc29tZSBleGFtcGxlIFNtYXJ0eSBjb250ZW50ICp9CiAge2lmIGlzc2V0KCRuYW1lKSAmJiAkbmFtZSA9PSAnQmxvZyd9CiAgICBUaGlzIGlzIGEgeyR2YXJ9LgogICAgeyRpbnRlZ2VyID0gNDUxMX0sIHskYXJyYXlbXSA9ICJhIn0sIHskc3RyaW5ndmFyID0gInN0cmluZyJ9CiAgICB7JGludGVnZXIgPSA0NTEyfSB7JGFycmF5W10gPSAiYSJ9IHskc3RyaW5ndmFyID0gInN0cmluZyJ9CiAgICB7YXNzaWduIHZhcj0nYm9iJyB2YWx1ZT0kdmFyLnByb3B9CiAge2Vsc2VpZiAkbmFtZSA9PSAkZm9vfQogICAge2Z1bmN0aW9uIG5hbWU9bWVudSBsZXZlbD0wfQogICAge2ZvcmVhY2ggJGRhdGEgYXMgJGVudHJ5fQogICAgICB7aWYgaXNfYXJyYXkoJGVudHJ5KX0KICAgICAgLSB7JGVudHJ5QGtleX0KICAgICAge21lbnUgZGF0YT0kZW50cnkgbGV2ZWw9JGxldmVsKzF9CiAgICAgIHtlbHNlfQogICAgICB7JGVudHJ5fQogICAgICB7KiBPbmUKICAgICAgKiBUd28KICAgICAgKiBUaHJlZQogICAgICAqfQogICAgICB7L2lmfQogICAgey9mb3JlYWNofQogICAgey9mdW5jdGlvbn0KICB7L2lmfQogIDwvYm9keT4KICA8IS0tIFIuTy4gLS0+CjwvaHRtbD4KPC90ZXh0YXJlYT48L2Zvcm0+CgogICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgogICAgICB2YXIgbXlDb2RlTWlycm9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgICAgIG1vZGUgICAgICAgICAgIDogInNtYXJ0eW1peGVkIiwKICAgICAgICB0YWJTaXplICAgICAgICA6IDIsCiAgICAgICAgaW5kZW50VW5pdCAgICAgOiAyLAogICAgICAgIGluZGVudFdpdGhUYWJzIDogZmFsc2UsCiAgICAgICAgbGluZU51bWJlcnMgICAgOiB0cnVlLAogICAgICAgIHNtYXJ0eVZlcnNpb24gIDogMywKICAgICAgICBtYXRjaEJyYWNrZXRzICA6IHRydWUsCiAgICAgIH0pOwogICAgPC9zY3JpcHQ+CgogICAgPHA+VGhlIFNtYXJ0eSBtaXhlZCBtb2RlIGRlcGVuZHMgb24gdGhlIFNtYXJ0eSBhbmQgSFRNTCBtaXhlZCBtb2Rlcy4gSFRNTAogICAgbWl4ZWQgbW9kZSBpdHNlbGYgZGVwZW5kcyBvbiBYTUwsIEphdmFTY3JpcHQsIGFuZCBDU1MgbW9kZXMuPC9wPgoKICAgIDxwPkl0IHRha2VzIHRoZSBzYW1lIG9wdGlvbnMsIGFzIFNtYXJ0eSBhbmQgSFRNTCBtaXhlZCBtb2Rlcy48L3A+CgogICAgPHA+PHN0cm9uZz5NSU1FIHR5cGVzIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPnRleHQveC1zbWFydHk8L2NvZGU+LjwvcD4KICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/smartymixed/smartymixed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovKioKKiBAZmlsZSBzbWFydHltaXhlZC5qcwoqIEBicmllZiBTbWFydHkgTWl4ZWQgQ29kZW1pcnJvciBtb2RlIChTbWFydHkgKyBNaXhlZCBIVE1MKQoqIEBhdXRob3IgUnVzbGFuIE9zbWFub3YgPHJyb3NtYW5vdiBhdCBnbWFpbCBkb3QgY29tPgoqIEB2ZXJzaW9uIDMuMAoqIEBkYXRlIDA1LjA3LjIwMTMKKi8KCi8vIFdhcm5pbmc6IERvbid0IGJhc2Ugb3RoZXIgbW9kZXMgb24gdGhpcyBvbmUuIFRoaXMgaGVyZSBpcyBhCi8vIHRlcnJpYmxlIHdheSB0byB3cml0ZSBhIG1peGVkIG1vZGUuCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSwgcmVxdWlyZSgiLi4vaHRtbG1peGVkL2h0bWxtaXhlZCIpLCByZXF1aXJlKCIuLi9zbWFydHkvc21hcnR5IikpOwogIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kKSAvLyBBTUQKICAgIGRlZmluZShbIi4uLy4uL2xpYi9jb2RlbWlycm9yIiwgIi4uL2h0bWxtaXhlZC9odG1sbWl4ZWQiLCAiLi4vc21hcnR5L3NtYXJ0eSJdLCBtb2QpOwogIGVsc2UgLy8gUGxhaW4gYnJvd3NlciBlbnYKICAgIG1vZChDb2RlTWlycm9yKTsKfSkoZnVuY3Rpb24oQ29kZU1pcnJvcikgewoidXNlIHN0cmljdCI7CgpDb2RlTWlycm9yLmRlZmluZU1vZGUoInNtYXJ0eW1peGVkIiwgZnVuY3Rpb24oY29uZmlnKSB7CiAgdmFyIGh0bWxNaXhlZE1vZGUgPSBDb2RlTWlycm9yLmdldE1vZGUoY29uZmlnLCAiaHRtbG1peGVkIik7CiAgdmFyIHNtYXJ0eU1vZGUgPSBDb2RlTWlycm9yLmdldE1vZGUoY29uZmlnLCAic21hcnR5Iik7CgogIHZhciBzZXR0aW5ncyA9IHsKICAgIHJpZ2h0RGVsaW1pdGVyOiAnfScsCiAgICBsZWZ0RGVsaW1pdGVyOiAneycKICB9OwoKICBpZiAoY29uZmlnLmhhc093blByb3BlcnR5KCJsZWZ0RGVsaW1pdGVyIikpIHsKICAgIHNldHRpbmdzLmxlZnREZWxpbWl0ZXIgPSBjb25maWcubGVmdERlbGltaXRlcjsKICB9CiAgaWYgKGNvbmZpZy5oYXNPd25Qcm9wZXJ0eSgicmlnaHREZWxpbWl0ZXIiKSkgewogICAgc2V0dGluZ3MucmlnaHREZWxpbWl0ZXIgPSBjb25maWcucmlnaHREZWxpbWl0ZXI7CiAgfQoKICBmdW5jdGlvbiByZUVzYyhzdHIpIHsgcmV0dXJuIHN0ci5yZXBsYWNlKC9bXlxzXHddL2csICJcXCQmIik7IH0KCiAgdmFyIHJlTGVmdCA9IHJlRXNjKHNldHRpbmdzLmxlZnREZWxpbWl0ZXIpLCByZVJpZ2h0ID0gcmVFc2Moc2V0dGluZ3MucmlnaHREZWxpbWl0ZXIpOwogIHZhciByZWdzID0gewogICAgc21hcnR5Q29tbWVudDogbmV3IFJlZ0V4cCgiXiIgKyByZVJpZ2h0ICsgIlxcKiIpLAogICAgbGl0ZXJhbE9wZW46IG5ldyBSZWdFeHAocmVMZWZ0ICsgImxpdGVyYWwiICsgcmVSaWdodCksCiAgICBsaXRlcmFsQ2xvc2U6IG5ldyBSZWdFeHAocmVMZWZ0ICsgIlwvbGl0ZXJhbCIgKyByZVJpZ2h0KSwKICAgIGhhc0xlZnREZWxpbWV0ZXI6IG5ldyBSZWdFeHAoIi4qIiArIHJlTGVmdCksCiAgICBodG1sSGFzTGVmdERlbGltZXRlcjogbmV3IFJlZ0V4cCgiW148Pl0qIiArIHJlTGVmdCkKICB9OwoKICB2YXIgaGVscGVycyA9IHsKICAgIGNoYWluOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlLCBwYXJzZXIpIHsKICAgICAgc3RhdGUudG9rZW5pemUgPSBwYXJzZXI7CiAgICAgIHJldHVybiBwYXJzZXIoc3RyZWFtLCBzdGF0ZSk7CiAgICB9LAoKICAgIGNsZWFuQ2hhaW46IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUsIHBhcnNlcikgewogICAgICBzdGF0ZS50b2tlbml6ZSA9IG51bGw7CiAgICAgIHN0YXRlLmxvY2FsU3RhdGUgPSBudWxsOwogICAgICBzdGF0ZS5sb2NhbE1vZGUgPSBudWxsOwogICAgICByZXR1cm4gKHR5cGVvZiBwYXJzZXIgPT0gInN0cmluZyIpID8gKHBhcnNlciA/IHBhcnNlciA6IG51bGwpIDogcGFyc2VyKHN0cmVhbSwgc3RhdGUpOwogICAgfSwKCiAgICBtYXliZUJhY2t1cDogZnVuY3Rpb24oc3RyZWFtLCBwYXQsIHN0eWxlKSB7CiAgICAgIHZhciBjdXIgPSBzdHJlYW0uY3VycmVudCgpOwogICAgICB2YXIgY2xvc2UgPSBjdXIuc2VhcmNoKHBhdCksCiAgICAgIG07CiAgICAgIGlmIChjbG9zZSA+IC0gMSkgc3RyZWFtLmJhY2tVcChjdXIubGVuZ3RoIC0gY2xvc2UpOwogICAgICBlbHNlIGlmIChtID0gY3VyLm1hdGNoKC88XC8/JC8pKSB7CiAgICAgICAgc3RyZWFtLmJhY2tVcChjdXIubGVuZ3RoKTsKICAgICAgICBpZiAoIXN0cmVhbS5tYXRjaChwYXQsIGZhbHNlKSkgc3RyZWFtLm1hdGNoKGN1clswXSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHN0eWxlOwogICAgfQogIH07CgogIHZhciBwYXJzZXJzID0gewogICAgaHRtbDogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICBpZiAoIXN0YXRlLmluTGl0ZXJhbCAmJiBzdHJlYW0ubWF0Y2gocmVncy5odG1sSGFzTGVmdERlbGltZXRlciwgZmFsc2UpICYmIHN0YXRlLmh0bWxNaXhlZFN0YXRlLmh0bWxTdGF0ZS50YWdOYW1lID09PSBudWxsKSB7CiAgICAgICAgc3RhdGUudG9rZW5pemUgPSBwYXJzZXJzLnNtYXJ0eTsKICAgICAgICBzdGF0ZS5sb2NhbE1vZGUgPSBzbWFydHlNb2RlOwogICAgICAgIHN0YXRlLmxvY2FsU3RhdGUgPSBzbWFydHlNb2RlLnN0YXJ0U3RhdGUoaHRtbE1peGVkTW9kZS5pbmRlbnQoc3RhdGUuaHRtbE1peGVkU3RhdGUsICIiKSk7CiAgICAgICAgcmV0dXJuIGhlbHBlcnMubWF5YmVCYWNrdXAoc3RyZWFtLCBzZXR0aW5ncy5sZWZ0RGVsaW1pdGVyLCBzbWFydHlNb2RlLnRva2VuKHN0cmVhbSwgc3RhdGUubG9jYWxTdGF0ZSkpOwogICAgICB9IGVsc2UgaWYgKCFzdGF0ZS5pbkxpdGVyYWwgJiYgc3RyZWFtLm1hdGNoKHNldHRpbmdzLmxlZnREZWxpbWl0ZXIsIGZhbHNlKSkgewogICAgICAgIHN0YXRlLnRva2VuaXplID0gcGFyc2Vycy5zbWFydHk7CiAgICAgICAgc3RhdGUubG9jYWxNb2RlID0gc21hcnR5TW9kZTsKICAgICAgICBzdGF0ZS5sb2NhbFN0YXRlID0gc21hcnR5TW9kZS5zdGFydFN0YXRlKGh0bWxNaXhlZE1vZGUuaW5kZW50KHN0YXRlLmh0bWxNaXhlZFN0YXRlLCAiIikpOwogICAgICAgIHJldHVybiBoZWxwZXJzLm1heWJlQmFja3VwKHN0cmVhbSwgc2V0dGluZ3MubGVmdERlbGltaXRlciwgc21hcnR5TW9kZS50b2tlbihzdHJlYW0sIHN0YXRlLmxvY2FsU3RhdGUpKTsKICAgICAgfQogICAgICByZXR1cm4gaHRtbE1peGVkTW9kZS50b2tlbihzdHJlYW0sIHN0YXRlLmh0bWxNaXhlZFN0YXRlKTsKICAgIH0sCgogICAgc21hcnR5OiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIGlmIChzdHJlYW0ubWF0Y2goc2V0dGluZ3MubGVmdERlbGltaXRlciwgZmFsc2UpKSB7CiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaChyZWdzLnNtYXJ0eUNvbW1lbnQsIGZhbHNlKSkgewogICAgICAgICAgcmV0dXJuIGhlbHBlcnMuY2hhaW4oc3RyZWFtLCBzdGF0ZSwgcGFyc2Vycy5pbkJsb2NrKCJjb21tZW50IiwgIioiICsgc2V0dGluZ3MucmlnaHREZWxpbWl0ZXIpKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLm1hdGNoKHNldHRpbmdzLnJpZ2h0RGVsaW1pdGVyLCBmYWxzZSkpIHsKICAgICAgICBzdHJlYW0uZWF0KHNldHRpbmdzLnJpZ2h0RGVsaW1pdGVyKTsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHBhcnNlcnMuaHRtbDsKICAgICAgICBzdGF0ZS5sb2NhbE1vZGUgPSBodG1sTWl4ZWRNb2RlOwogICAgICAgIHN0YXRlLmxvY2FsU3RhdGUgPSBzdGF0ZS5odG1sTWl4ZWRTdGF0ZTsKICAgICAgICByZXR1cm4gInRhZyI7CiAgICAgIH0KCiAgICAgIHJldHVybiBoZWxwZXJzLm1heWJlQmFja3VwKHN0cmVhbSwgc2V0dGluZ3MucmlnaHREZWxpbWl0ZXIsIHNtYXJ0eU1vZGUudG9rZW4oc3RyZWFtLCBzdGF0ZS5sb2NhbFN0YXRlKSk7CiAgICB9LAoKICAgIGluQmxvY2s6IGZ1bmN0aW9uKHN0eWxlLCB0ZXJtaW5hdG9yKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgICAgd2hpbGUgKCFzdHJlYW0uZW9sKCkpIHsKICAgICAgICAgIGlmIChzdHJlYW0ubWF0Y2godGVybWluYXRvcikpIHsKICAgICAgICAgICAgaGVscGVycy5jbGVhbkNoYWluKHN0cmVhbSwgc3RhdGUsICIiKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc3R5bGU7CiAgICAgIH07CiAgICB9CiAgfTsKCiAgcmV0dXJuIHsKICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKCkgewogICAgICB2YXIgc3RhdGUgPSBodG1sTWl4ZWRNb2RlLnN0YXJ0U3RhdGUoKTsKICAgICAgcmV0dXJuIHsKICAgICAgICB0b2tlbjogcGFyc2Vycy5odG1sLAogICAgICAgIGxvY2FsTW9kZTogbnVsbCwKICAgICAgICBsb2NhbFN0YXRlOiBudWxsLAogICAgICAgIGh0bWxNaXhlZFN0YXRlOiBzdGF0ZSwKICAgICAgICB0b2tlbml6ZTogbnVsbCwKICAgICAgICBpbkxpdGVyYWw6IGZhbHNlCiAgICAgIH07CiAgICB9LAoKICAgIGNvcHlTdGF0ZTogZnVuY3Rpb24oc3RhdGUpIHsKICAgICAgdmFyIGxvY2FsID0gbnVsbCwgdG9rID0gKHN0YXRlLnRva2VuaXplIHx8IHN0YXRlLnRva2VuKTsKICAgICAgaWYgKHN0YXRlLmxvY2FsU3RhdGUpIHsKICAgICAgICBsb2NhbCA9IENvZGVNaXJyb3IuY29weVN0YXRlKCh0b2sgIT0gcGFyc2Vycy5odG1sID8gc21hcnR5TW9kZSA6IGh0bWxNaXhlZE1vZGUpLCBzdGF0ZS5sb2NhbFN0YXRlKTsKICAgICAgfQogICAgICByZXR1cm4gewogICAgICAgIHRva2VuOiBzdGF0ZS50b2tlbiwKICAgICAgICB0b2tlbml6ZTogc3RhdGUudG9rZW5pemUsCiAgICAgICAgbG9jYWxNb2RlOiBzdGF0ZS5sb2NhbE1vZGUsCiAgICAgICAgbG9jYWxTdGF0ZTogbG9jYWwsCiAgICAgICAgaHRtbE1peGVkU3RhdGU6IENvZGVNaXJyb3IuY29weVN0YXRlKGh0bWxNaXhlZE1vZGUsIHN0YXRlLmh0bWxNaXhlZFN0YXRlKSwKICAgICAgICBpbkxpdGVyYWw6IHN0YXRlLmluTGl0ZXJhbAogICAgICB9OwogICAgfSwKCiAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICBpZiAoc3RyZWFtLm1hdGNoKHNldHRpbmdzLmxlZnREZWxpbWl0ZXIsIGZhbHNlKSkgewogICAgICAgIGlmICghc3RhdGUuaW5MaXRlcmFsICYmIHN0cmVhbS5tYXRjaChyZWdzLmxpdGVyYWxPcGVuLCB0cnVlKSkgewogICAgICAgICAgc3RhdGUuaW5MaXRlcmFsID0gdHJ1ZTsKICAgICAgICAgIHJldHVybiAia2V5d29yZCI7CiAgICAgICAgfSBlbHNlIGlmIChzdGF0ZS5pbkxpdGVyYWwgJiYgc3RyZWFtLm1hdGNoKHJlZ3MubGl0ZXJhbENsb3NlLCB0cnVlKSkgewogICAgICAgICAgc3RhdGUuaW5MaXRlcmFsID0gZmFsc2U7CiAgICAgICAgICByZXR1cm4gImtleXdvcmQiOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoc3RhdGUuaW5MaXRlcmFsICYmIHN0YXRlLmxvY2FsU3RhdGUgIT0gc3RhdGUuaHRtbE1peGVkU3RhdGUpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHBhcnNlcnMuaHRtbDsKICAgICAgICBzdGF0ZS5sb2NhbE1vZGUgPSBodG1sTWl4ZWRNb2RlOwogICAgICAgIHN0YXRlLmxvY2FsU3RhdGUgPSBzdGF0ZS5odG1sTWl4ZWRTdGF0ZTsKICAgICAgfQoKICAgICAgdmFyIHN0eWxlID0gKHN0YXRlLnRva2VuaXplIHx8IHN0YXRlLnRva2VuKShzdHJlYW0sIHN0YXRlKTsKICAgICAgcmV0dXJuIHN0eWxlOwogICAgfSwKCiAgICBpbmRlbnQ6IGZ1bmN0aW9uKHN0YXRlLCB0ZXh0QWZ0ZXIpIHsKICAgICAgaWYgKHN0YXRlLmxvY2FsTW9kZSA9PSBzbWFydHlNb2RlCiAgICAgICAgICB8fCAoc3RhdGUuaW5MaXRlcmFsICYmICFzdGF0ZS5sb2NhbE1vZGUpCiAgICAgICAgIHx8IHJlZ3MuaGFzTGVmdERlbGltZXRlci50ZXN0KHRleHRBZnRlcikpIHsKICAgICAgICByZXR1cm4gQ29kZU1pcnJvci5QYXNzOwogICAgICB9CiAgICAgIHJldHVybiBodG1sTWl4ZWRNb2RlLmluZGVudChzdGF0ZS5odG1sTWl4ZWRTdGF0ZSwgdGV4dEFmdGVyKTsKICAgIH0sCgogICAgaW5uZXJNb2RlOiBmdW5jdGlvbihzdGF0ZSkgewogICAgICByZXR1cm4gewogICAgICAgIHN0YXRlOiBzdGF0ZS5sb2NhbFN0YXRlIHx8IHN0YXRlLmh0bWxNaXhlZFN0YXRlLAogICAgICAgIG1vZGU6IHN0YXRlLmxvY2FsTW9kZSB8fCBodG1sTWl4ZWRNb2RlCiAgICAgIH07CiAgICB9CiAgfTsKfSwgImh0bWxtaXhlZCIsICJzbWFydHkiKTsKCkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC94LXNtYXJ0eSIsICJzbWFydHltaXhlZCIpOwovLyB2aW06IGV0IHRzPTIgc3RzPTIgc3c9MgoKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/solr/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/solr/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogU29sciBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9InNvbHIuanMiPjwvc2NyaXB0Pgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgogIC5Db2RlTWlycm9yIHsKICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCBibGFjazsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazsKICB9CgogIC5Db2RlTWlycm9yIC5jbS1vcGVyYXRvciB7CiAgICBjb2xvcjogb3JhbmdlOwogIH0KPC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aW1nIGlkPWxvZ28gc3JjPSIuLi8uLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5MYW5ndWFnZSBtb2RlczwvYT4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+U29scjwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgogIDxoMj5Tb2xyIG1vZGU8L2gyPgoKICA8ZGl2PgogICAgPHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj5hdXRob3I6Q2FtdXMKCnRpdGxlOiJUaGUgUmViZWwiIGFuZCBhdXRob3I6Q2FtdXMKCnBoaWxvc29waHk6RXhpc3RlbnRpYWxpc20gLWF1dGhvcjpLaWVya2VnYWFyZAoKaGFyZFRvU3BlbGw6RG9zdG9ldnNreX4KCnB1Ymxpc2hlZDpbMTk0KiBUTyAxOTYwXSBhbmQgYXV0aG9yOihTYXJ0cmUgb3IgIlNpbW9uZSBkZSBCZWF1dm9pciIpPC90ZXh0YXJlYT4KICA8L2Rpdj4KCiAgPHNjcmlwdD4KICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICAgIG1vZGU6ICdzb2xyJywKICAgICAgbGluZU51bWJlcnM6IHRydWUKICAgIH0pOwogIDwvc2NyaXB0PgoKICA8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC94LXNvbHI8L2NvZGU+LjwvcD4KPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/solr/solr.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJzb2xyIiwgZnVuY3Rpb24oKSB7CiAgInVzZSBzdHJpY3QiOwoKICB2YXIgaXNTdHJpbmdDaGFyID0gL1teXHNcfFwhXCtcLVwqXD9cflxeXCZcOlwoXClcW1xdXHtcfVxeXCJcXF0vOwogIHZhciBpc09wZXJhdG9yQ2hhciA9IC9bXHxcIVwrXC1cKlw/XH5cXlwmXS87CiAgdmFyIGlzT3BlcmF0b3JTdHJpbmcgPSAvXihPUnxBTkR8Tk9UfFRPKSQvaTsKCiAgZnVuY3Rpb24gaXNOdW1iZXIod29yZCkgewogICAgcmV0dXJuIHBhcnNlRmxvYXQod29yZCwgMTApLnRvU3RyaW5nKCkgPT09IHdvcmQ7CiAgfQoKICBmdW5jdGlvbiB0b2tlblN0cmluZyhxdW90ZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgdmFyIGVzY2FwZWQgPSBmYWxzZSwgbmV4dDsKICAgICAgd2hpbGUgKChuZXh0ID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkgewogICAgICAgIGlmIChuZXh0ID09IHF1b3RlICYmICFlc2NhcGVkKSBicmVhazsKICAgICAgICBlc2NhcGVkID0gIWVzY2FwZWQgJiYgbmV4dCA9PSAiXFwiOwogICAgICB9CgogICAgICBpZiAoIWVzY2FwZWQpIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlOwogICAgICByZXR1cm4gInN0cmluZyI7CiAgICB9OwogIH0KCiAgZnVuY3Rpb24gdG9rZW5PcGVyYXRvcihvcGVyYXRvcikgewogICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgdmFyIHN0eWxlID0gIm9wZXJhdG9yIjsKICAgICAgaWYgKG9wZXJhdG9yID09ICIrIikKICAgICAgICBzdHlsZSArPSAiIHBvc2l0aXZlIjsKICAgICAgZWxzZSBpZiAob3BlcmF0b3IgPT0gIi0iKQogICAgICAgIHN0eWxlICs9ICIgbmVnYXRpdmUiOwogICAgICBlbHNlIGlmIChvcGVyYXRvciA9PSAifCIpCiAgICAgICAgc3RyZWFtLmVhdCgvXHwvKTsKICAgICAgZWxzZSBpZiAob3BlcmF0b3IgPT0gIiYiKQogICAgICAgIHN0cmVhbS5lYXQoL1wmLyk7CiAgICAgIGVsc2UgaWYgKG9wZXJhdG9yID09ICJeIikKICAgICAgICBzdHlsZSArPSAiIGJvb3N0IjsKCiAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlOwogICAgICByZXR1cm4gc3R5bGU7CiAgICB9OwogIH0KCiAgZnVuY3Rpb24gdG9rZW5Xb3JkKGNoKSB7CiAgICByZXR1cm4gZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICB2YXIgd29yZCA9IGNoOwogICAgICB3aGlsZSAoKGNoID0gc3RyZWFtLnBlZWsoKSkgJiYgY2gubWF0Y2goaXNTdHJpbmdDaGFyKSAhPSBudWxsKSB7CiAgICAgICAgd29yZCArPSBzdHJlYW0ubmV4dCgpOwogICAgICB9CgogICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTsKICAgICAgaWYgKGlzT3BlcmF0b3JTdHJpbmcudGVzdCh3b3JkKSkKICAgICAgICByZXR1cm4gIm9wZXJhdG9yIjsKICAgICAgZWxzZSBpZiAoaXNOdW1iZXIod29yZCkpCiAgICAgICAgcmV0dXJuICJudW1iZXIiOwogICAgICBlbHNlIGlmIChzdHJlYW0ucGVlaygpID09ICI6IikKICAgICAgICByZXR1cm4gImZpZWxkIjsKICAgICAgZWxzZQogICAgICAgIHJldHVybiAic3RyaW5nIjsKICAgIH07CiAgfQoKICBmdW5jdGlvbiB0b2tlbkJhc2Uoc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIGNoID0gc3RyZWFtLm5leHQoKTsKICAgIGlmIChjaCA9PSAnIicpCiAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5TdHJpbmcoY2gpOwogICAgZWxzZSBpZiAoaXNPcGVyYXRvckNoYXIudGVzdChjaCkpCiAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5PcGVyYXRvcihjaCk7CiAgICBlbHNlIGlmIChpc1N0cmluZ0NoYXIudGVzdChjaCkpCiAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5Xb3JkKGNoKTsKCiAgICByZXR1cm4gKHN0YXRlLnRva2VuaXplICE9IHRva2VuQmFzZSkgPyBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKSA6IG51bGw7CiAgfQoKICByZXR1cm4gewogICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgdG9rZW5pemU6IHRva2VuQmFzZQogICAgICB9OwogICAgfSwKCiAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICBpZiAoc3RyZWFtLmVhdFNwYWNlKCkpIHJldHVybiBudWxsOwogICAgICByZXR1cm4gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CiAgICB9CiAgfTsKfSk7CgpDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveC1zb2xyIiwgInNvbHIiKTsKCn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/sparql/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/sparql/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogU1BBUlFMIG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vLi4vYWRkb24vZWRpdC9tYXRjaGJyYWNrZXRzLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9InNwYXJxbC5qcyI+PC9zY3JpcHQ+CjxzdHlsZT4uQ29kZU1pcnJvciB7Ym9yZGVyLXRvcDogMXB4IHNvbGlkIGJsYWNrOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGltZyBpZD1sb2dvIHNyYz0iLi4vLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+TGFuZ3VhZ2UgbW9kZXM8L2E+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPlNQQVJRTDwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+U1BBUlFMIG1vZGU8L2gyPgo8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgpQUkVGSVggYTogJmx0O2h0dHA6Ly93d3cudzMub3JnLzIwMDAvMTAvYW5ub3RhdGlvbi1ucyM+ClBSRUZJWCBkYzogJmx0O2h0dHA6Ly9wdXJsLm9yZy9kYy9lbGVtZW50cy8xLjEvPgpQUkVGSVggZm9hZjogJmx0O2h0dHA6Ly94bWxucy5jb20vZm9hZi8wLjEvPgoKIyBDb21tZW50IQoKU0VMRUNUID9naXZlbiA/ZmFtaWx5CldIRVJFIHsKICA/YW5ub3QgYTphbm5vdGF0ZXMgJmx0O2h0dHA6Ly93d3cudzMub3JnL1RSL3JkZi1zcGFycWwtcXVlcnkvPiAuCiAgP2Fubm90IGRjOmNyZWF0b3IgP2MgLgogIE9QVElPTkFMIHs/YyBmb2FmOmdpdmVuID9naXZlbiA7CiAgICAgICAgICAgICAgIGZvYWY6ZmFtaWx5ID9mYW1pbHkgfSAuCiAgRklMVEVSIGlzQmxhbmsoP2MpCn0KPC90ZXh0YXJlYT48L2Zvcm0+CiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgICAgIG1vZGU6ICJhcHBsaWNhdGlvbi94LXNwYXJxbC1xdWVyeSIsCiAgICAgICAgbWF0Y2hCcmFja2V0czogdHJ1ZQogICAgICB9KTsKICAgIDwvc2NyaXB0PgoKICAgIDxwPjxzdHJvbmc+TUlNRSB0eXBlcyBkZWZpbmVkOjwvc3Ryb25nPiA8Y29kZT5hcHBsaWNhdGlvbi94LXNwYXJxbC1xdWVyeTwvY29kZT4uPC9wPgoKICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/sparql/sparql.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJzcGFycWwiLCBmdW5jdGlvbihjb25maWcpIHsKICB2YXIgaW5kZW50VW5pdCA9IGNvbmZpZy5pbmRlbnRVbml0OwogIHZhciBjdXJQdW5jOwoKICBmdW5jdGlvbiB3b3JkUmVnZXhwKHdvcmRzKSB7CiAgICByZXR1cm4gbmV3IFJlZ0V4cCgiXig/OiIgKyB3b3Jkcy5qb2luKCJ8IikgKyAiKSQiLCAiaSIpOwogIH0KICB2YXIgb3BzID0gd29yZFJlZ2V4cChbInN0ciIsICJsYW5nIiwgImxhbmdtYXRjaGVzIiwgImRhdGF0eXBlIiwgImJvdW5kIiwgInNhbWV0ZXJtIiwgImlzaXJpIiwgImlzdXJpIiwKICAgICAgICAgICAgICAgICAgICAgICAgImlzYmxhbmsiLCAiaXNsaXRlcmFsIiwgImEiXSk7CiAgdmFyIGtleXdvcmRzID0gd29yZFJlZ2V4cChbImJhc2UiLCAicHJlZml4IiwgInNlbGVjdCIsICJkaXN0aW5jdCIsICJyZWR1Y2VkIiwgImNvbnN0cnVjdCIsICJkZXNjcmliZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFzayIsICJmcm9tIiwgIm5hbWVkIiwgIndoZXJlIiwgIm9yZGVyIiwgImxpbWl0IiwgIm9mZnNldCIsICJmaWx0ZXIiLCAib3B0aW9uYWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncmFwaCIsICJieSIsICJhc2MiLCAiZGVzYyIsICJhcyIsICJoYXZpbmciLCAidW5kZWYiLCAidmFsdWVzIiwgImdyb3VwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWludXMiLCAiaW4iLCAibm90IiwgInNlcnZpY2UiLCAic2lsZW50IiwgInVzaW5nIiwgImluc2VydCIsICJkZWxldGUiLCAidW5pb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkYXRhIiwgImNvcHkiLCAidG8iLCAibW92ZSIsICJhZGQiLCAiY3JlYXRlIiwgImRyb3AiLCAiY2xlYXIiLCAibG9hZCJdKTsKICB2YXIgb3BlcmF0b3JDaGFycyA9IC9bKitcLTw+PSZ8XS87CgogIGZ1bmN0aW9uIHRva2VuQmFzZShzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpOwogICAgY3VyUHVuYyA9IG51bGw7CiAgICBpZiAoY2ggPT0gIiQiIHx8IGNoID09ICI/IikgewogICAgICBzdHJlYW0ubWF0Y2goL15bXHdcZF0qLyk7CiAgICAgIHJldHVybiAidmFyaWFibGUtMiI7CiAgICB9CiAgICBlbHNlIGlmIChjaCA9PSAiPCIgJiYgIXN0cmVhbS5tYXRjaCgvXltcc1x1MDBhMD1dLywgZmFsc2UpKSB7CiAgICAgIHN0cmVhbS5tYXRjaCgvXlteXHNcdTAwYTA+XSo+Py8pOwogICAgICByZXR1cm4gImF0b20iOwogICAgfQogICAgZWxzZSBpZiAoY2ggPT0gIlwiIiB8fCBjaCA9PSAiJyIpIHsKICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkxpdGVyYWwoY2gpOwogICAgICByZXR1cm4gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CiAgICB9CiAgICBlbHNlIGlmICgvW3t9XChcKSxcLjtcW1xdXS8udGVzdChjaCkpIHsKICAgICAgY3VyUHVuYyA9IGNoOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGVsc2UgaWYgKGNoID09ICIjIikgewogICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICAgIHJldHVybiAiY29tbWVudCI7CiAgICB9CiAgICBlbHNlIGlmIChvcGVyYXRvckNoYXJzLnRlc3QoY2gpKSB7CiAgICAgIHN0cmVhbS5lYXRXaGlsZShvcGVyYXRvckNoYXJzKTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBlbHNlIGlmIChjaCA9PSAiOiIpIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXHdcZFwuX1wtXS8pOwogICAgICByZXR1cm4gImF0b20iOwogICAgfQogICAgZWxzZSB7CiAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW19cd1xkXS8pOwogICAgICBpZiAoc3RyZWFtLmVhdCgiOiIpKSB7CiAgICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXHdcZF9cLV0vKTsKICAgICAgICByZXR1cm4gImF0b20iOwogICAgICB9CiAgICAgIHZhciB3b3JkID0gc3RyZWFtLmN1cnJlbnQoKTsKICAgICAgaWYgKG9wcy50ZXN0KHdvcmQpKQogICAgICAgIHJldHVybiBudWxsOwogICAgICBlbHNlIGlmIChrZXl3b3Jkcy50ZXN0KHdvcmQpKQogICAgICAgIHJldHVybiAia2V5d29yZCI7CiAgICAgIGVsc2UKICAgICAgICByZXR1cm4gInZhcmlhYmxlIjsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHRva2VuTGl0ZXJhbChxdW90ZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgdmFyIGVzY2FwZWQgPSBmYWxzZSwgY2g7CiAgICAgIHdoaWxlICgoY2ggPSBzdHJlYW0ubmV4dCgpKSAhPSBudWxsKSB7CiAgICAgICAgaWYgKGNoID09IHF1b3RlICYmICFlc2NhcGVkKSB7CiAgICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBlc2NhcGVkID0gIWVzY2FwZWQgJiYgY2ggPT0gIlxcIjsKICAgICAgfQogICAgICByZXR1cm4gInN0cmluZyI7CiAgICB9OwogIH0KCiAgZnVuY3Rpb24gcHVzaENvbnRleHQoc3RhdGUsIHR5cGUsIGNvbCkgewogICAgc3RhdGUuY29udGV4dCA9IHtwcmV2OiBzdGF0ZS5jb250ZXh0LCBpbmRlbnQ6IHN0YXRlLmluZGVudCwgY29sOiBjb2wsIHR5cGU6IHR5cGV9OwogIH0KICBmdW5jdGlvbiBwb3BDb250ZXh0KHN0YXRlKSB7CiAgICBzdGF0ZS5pbmRlbnQgPSBzdGF0ZS5jb250ZXh0LmluZGVudDsKICAgIHN0YXRlLmNvbnRleHQgPSBzdGF0ZS5jb250ZXh0LnByZXY7CiAgfQoKICByZXR1cm4gewogICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB7dG9rZW5pemU6IHRva2VuQmFzZSwKICAgICAgICAgICAgICBjb250ZXh0OiBudWxsLAogICAgICAgICAgICAgIGluZGVudDogMCwKICAgICAgICAgICAgICBjb2w6IDB9OwogICAgfSwKCiAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICBpZiAoc3RyZWFtLnNvbCgpKSB7CiAgICAgICAgaWYgKHN0YXRlLmNvbnRleHQgJiYgc3RhdGUuY29udGV4dC5hbGlnbiA9PSBudWxsKSBzdGF0ZS5jb250ZXh0LmFsaWduID0gZmFsc2U7CiAgICAgICAgc3RhdGUuaW5kZW50ID0gc3RyZWFtLmluZGVudGF0aW9uKCk7CiAgICAgIH0KICAgICAgaWYgKHN0cmVhbS5lYXRTcGFjZSgpKSByZXR1cm4gbnVsbDsKICAgICAgdmFyIHN0eWxlID0gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CgogICAgICBpZiAoc3R5bGUgIT0gImNvbW1lbnQiICYmIHN0YXRlLmNvbnRleHQgJiYgc3RhdGUuY29udGV4dC5hbGlnbiA9PSBudWxsICYmIHN0YXRlLmNvbnRleHQudHlwZSAhPSAicGF0dGVybiIpIHsKICAgICAgICBzdGF0ZS5jb250ZXh0LmFsaWduID0gdHJ1ZTsKICAgICAgfQoKICAgICAgaWYgKGN1clB1bmMgPT0gIigiKSBwdXNoQ29udGV4dChzdGF0ZSwgIikiLCBzdHJlYW0uY29sdW1uKCkpOwogICAgICBlbHNlIGlmIChjdXJQdW5jID09ICJbIikgcHVzaENvbnRleHQoc3RhdGUsICJdIiwgc3RyZWFtLmNvbHVtbigpKTsKICAgICAgZWxzZSBpZiAoY3VyUHVuYyA9PSAieyIpIHB1c2hDb250ZXh0KHN0YXRlLCAifSIsIHN0cmVhbS5jb2x1bW4oKSk7CiAgICAgIGVsc2UgaWYgKC9bXF1cfVwpXS8udGVzdChjdXJQdW5jKSkgewogICAgICAgIHdoaWxlIChzdGF0ZS5jb250ZXh0ICYmIHN0YXRlLmNvbnRleHQudHlwZSA9PSAicGF0dGVybiIpIHBvcENvbnRleHQoc3RhdGUpOwogICAgICAgIGlmIChzdGF0ZS5jb250ZXh0ICYmIGN1clB1bmMgPT0gc3RhdGUuY29udGV4dC50eXBlKSBwb3BDb250ZXh0KHN0YXRlKTsKICAgICAgfQogICAgICBlbHNlIGlmIChjdXJQdW5jID09ICIuIiAmJiBzdGF0ZS5jb250ZXh0ICYmIHN0YXRlLmNvbnRleHQudHlwZSA9PSAicGF0dGVybiIpIHBvcENvbnRleHQoc3RhdGUpOwogICAgICBlbHNlIGlmICgvYXRvbXxzdHJpbmd8dmFyaWFibGUvLnRlc3Qoc3R5bGUpICYmIHN0YXRlLmNvbnRleHQpIHsKICAgICAgICBpZiAoL1tcfVxdXS8udGVzdChzdGF0ZS5jb250ZXh0LnR5cGUpKQogICAgICAgICAgcHVzaENvbnRleHQoc3RhdGUsICJwYXR0ZXJuIiwgc3RyZWFtLmNvbHVtbigpKTsKICAgICAgICBlbHNlIGlmIChzdGF0ZS5jb250ZXh0LnR5cGUgPT0gInBhdHRlcm4iICYmICFzdGF0ZS5jb250ZXh0LmFsaWduKSB7CiAgICAgICAgICBzdGF0ZS5jb250ZXh0LmFsaWduID0gdHJ1ZTsKICAgICAgICAgIHN0YXRlLmNvbnRleHQuY29sID0gc3RyZWFtLmNvbHVtbigpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgcmV0dXJuIHN0eWxlOwogICAgfSwKCiAgICBpbmRlbnQ6IGZ1bmN0aW9uKHN0YXRlLCB0ZXh0QWZ0ZXIpIHsKICAgICAgdmFyIGZpcnN0Q2hhciA9IHRleHRBZnRlciAmJiB0ZXh0QWZ0ZXIuY2hhckF0KDApOwogICAgICB2YXIgY29udGV4dCA9IHN0YXRlLmNvbnRleHQ7CiAgICAgIGlmICgvW1xdXH1dLy50ZXN0KGZpcnN0Q2hhcikpCiAgICAgICAgd2hpbGUgKGNvbnRleHQgJiYgY29udGV4dC50eXBlID09ICJwYXR0ZXJuIikgY29udGV4dCA9IGNvbnRleHQucHJldjsKCiAgICAgIHZhciBjbG9zaW5nID0gY29udGV4dCAmJiBmaXJzdENoYXIgPT0gY29udGV4dC50eXBlOwogICAgICBpZiAoIWNvbnRleHQpCiAgICAgICAgcmV0dXJuIDA7CiAgICAgIGVsc2UgaWYgKGNvbnRleHQudHlwZSA9PSAicGF0dGVybiIpCiAgICAgICAgcmV0dXJuIGNvbnRleHQuY29sOwogICAgICBlbHNlIGlmIChjb250ZXh0LmFsaWduKQogICAgICAgIHJldHVybiBjb250ZXh0LmNvbCArIChjbG9zaW5nID8gMCA6IDEpOwogICAgICBlbHNlCiAgICAgICAgcmV0dXJuIGNvbnRleHQuaW5kZW50ICsgKGNsb3NpbmcgPyAwIDogaW5kZW50VW5pdCk7CiAgICB9CiAgfTsKfSk7CgpDb2RlTWlycm9yLmRlZmluZU1JTUUoImFwcGxpY2F0aW9uL3gtc3BhcnFsLXF1ZXJ5IiwgInNwYXJxbCIpOwoKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/sql/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/sql/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogU1FMIE1vZGUgZm9yIENvZGVNaXJyb3I8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiIC8+CjxzY3JpcHQgc3JjPSIuLi8uLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJzcWwuanMiPjwvc2NyaXB0Pgo8c3R5bGU+Ci5Db2RlTWlycm9yIHsKICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCBibGFjazsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazsKfQogICAgICAgIDwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGltZyBpZD1sb2dvIHNyYz0iLi4vLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+TGFuZ3VhZ2UgbW9kZXM8L2E+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPlNRTCBNb2RlIGZvciBDb2RlTWlycm9yPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5TUUwgTW9kZSBmb3IgQ29kZU1pcnJvcjwvaDI+Cjxmb3JtPgogICAgICAgICAgICA8dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPi0tIFNRTCBNb2RlIGZvciBDb2RlTWlycm9yClNFTEVDVCBTUUxfTk9fQ0FDSEUgRElTVElOQ1QKCQlAdmFyMSBBUyBgdmFsMWAsIEAndmFsMicsIEBnbG9iYWwuJ3NxbF9tb2RlJywKCQkxLjEgQVMgYGZsb2F0X3ZhbGAsIC4xNCBBUyBgYW5vdGhlcl9mbG9hdGAsIDAuMDllMyBBUyBgaW50X3dpdGhfZXNwYCwKCQkweEZBNSBBUyBgaGV4YCwgeCdmYTUnIEFTIGBoZXgyYCwgMGIxMDEgQVMgYGJpbmAsIGInMTAxJyBBUyBgYmluMmAsCgkJREFURSAnMTk5NC0wMS0wMScgQVMgYHNxbF9kYXRlYCwgeyBUICIxOTk0LTAxLTAxIiB9IEFTIGBvZGJjX2RhdGVgLAoJCSdteSBzdHJpbmcnLCBfdXRmOCd5b3VyIHN0cmluZycsIE4naGVyIHN0cmluZycsCiAgICAgICAgVFJVRSwgRkFMU0UsIFVOS05PV04KCUZST00gRFVBTAoJLS0gc3BhY2UgbmVlZGVkIGFmdGVyICctLScKCSMgMSBsaW5lIGNvbW1lbnQKCS8qIG11bHRpbGluZQoJY29tbWVudCEgKi8KCUxJTUlUIDEgT0ZGU0VUIDA7CjwvdGV4dGFyZWE+CiAgICAgICAgICAgIDwvZm9ybT4KICAgICAgICAgICAgPHA+PHN0cm9uZz5NSU1FIHR5cGVzIGRlZmluZWQ6PC9zdHJvbmc+IAogICAgICAgICAgICA8Y29kZT48YSBocmVmPSI/bWltZT10ZXh0L3gtc3FsIj50ZXh0L3gtc3FsPC9hPjwvY29kZT4sCiAgICAgICAgICAgIDxjb2RlPjxhIGhyZWY9Ij9taW1lPXRleHQveC1teXNxbCI+dGV4dC94LW15c3FsPC9hPjwvY29kZT4sCiAgICAgICAgICAgIDxjb2RlPjxhIGhyZWY9Ij9taW1lPXRleHQveC1tYXJpYWRiIj50ZXh0L3gtbWFyaWFkYjwvYT48L2NvZGU+LAogICAgICAgICAgICA8Y29kZT48YSBocmVmPSI/bWltZT10ZXh0L3gtY2Fzc2FuZHJhIj50ZXh0L3gtY2Fzc2FuZHJhPC9hPjwvY29kZT4sCiAgICAgICAgICAgIDxjb2RlPjxhIGhyZWY9Ij9taW1lPXRleHQveC1wbHNxbCI+dGV4dC94LXBsc3FsPC9hPjwvY29kZT4sCiAgICAgICAgICAgIDxjb2RlPjxhIGhyZWY9Ij9taW1lPXRleHQveC1tc3NxbCI+dGV4dC94LW1zc3FsPC9hPjwvY29kZT4sCiAgICAgICAgICAgIDxjb2RlPjxhIGhyZWY9Ij9taW1lPXRleHQveC1oaXZlIj50ZXh0L3gtaGl2ZTwvYT48L2NvZGU+LgogICAgICAgIDwvcD4KPHNjcmlwdD4Kd2luZG93Lm9ubG9hZCA9IGZ1bmN0aW9uKCkgewogIHZhciBtaW1lID0gJ3RleHQveC1tYXJpYWRiJzsKICAvLyBnZXQgbWltZSB0eXBlCiAgaWYgKHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluZGV4T2YoJ21pbWU9JykgPiAtMSkgewogICAgbWltZSA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmLnN1YnN0cih3aW5kb3cubG9jYXRpb24uaHJlZi5pbmRleE9mKCdtaW1lPScpICsgNSk7CiAgfQogIHdpbmRvdy5lZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29kZScpLCB7CiAgICBtb2RlOiBtaW1lLAogICAgaW5kZW50V2l0aFRhYnM6IHRydWUsCiAgICBzbWFydEluZGVudDogdHJ1ZSwKICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgbWF0Y2hCcmFja2V0cyA6IHRydWUsCiAgICBhdXRvZm9jdXM6IHRydWUKICB9KTsKfTsKPC9zY3JpcHQ+Cgo8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/sql/sql.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJzcWwiLCBmdW5jdGlvbihjb25maWcsIHBhcnNlckNvbmZpZykgewogICJ1c2Ugc3RyaWN0IjsKCiAgdmFyIGNsaWVudCAgICAgICAgID0gcGFyc2VyQ29uZmlnLmNsaWVudCB8fCB7fSwKICAgICAgYXRvbXMgICAgICAgICAgPSBwYXJzZXJDb25maWcuYXRvbXMgfHwgeyJmYWxzZSI6IHRydWUsICJ0cnVlIjogdHJ1ZSwgIm51bGwiOiB0cnVlfSwKICAgICAgYnVpbHRpbiAgICAgICAgPSBwYXJzZXJDb25maWcuYnVpbHRpbiB8fCB7fSwKICAgICAga2V5d29yZHMgICAgICAgPSBwYXJzZXJDb25maWcua2V5d29yZHMgfHwge30sCiAgICAgIG9wZXJhdG9yQ2hhcnMgID0gcGFyc2VyQ29uZmlnLm9wZXJhdG9yQ2hhcnMgfHwgL15bKitcLSU8PiE9Jnx+Xl0vLAogICAgICBzdXBwb3J0ICAgICAgICA9IHBhcnNlckNvbmZpZy5zdXBwb3J0IHx8IHt9LAogICAgICBob29rcyAgICAgICAgICA9IHBhcnNlckNvbmZpZy5ob29rcyB8fCB7fSwKICAgICAgZGF0ZVNRTCAgICAgICAgPSBwYXJzZXJDb25maWcuZGF0ZVNRTCB8fCB7ImRhdGUiIDogdHJ1ZSwgInRpbWUiIDogdHJ1ZSwgInRpbWVzdGFtcCIgOiB0cnVlfTsKCiAgZnVuY3Rpb24gdG9rZW5CYXNlKHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBjaCA9IHN0cmVhbS5uZXh0KCk7CgogICAgLy8gY2FsbCBob29rcyBmcm9tIHRoZSBtaW1lIHR5cGUKICAgIGlmIChob29rc1tjaF0pIHsKICAgICAgdmFyIHJlc3VsdCA9IGhvb2tzW2NoXShzdHJlYW0sIHN0YXRlKTsKICAgICAgaWYgKHJlc3VsdCAhPT0gZmFsc2UpIHJldHVybiByZXN1bHQ7CiAgICB9CgogICAgaWYgKHN1cHBvcnQuaGV4TnVtYmVyID09IHRydWUgJiYKICAgICAgKChjaCA9PSAiMCIgJiYgc3RyZWFtLm1hdGNoKC9eW3hYXVswLTlhLWZBLUZdKy8pKQogICAgICB8fCAoY2ggPT0gIngiIHx8IGNoID09ICJYIikgJiYgc3RyZWFtLm1hdGNoKC9eJ1swLTlhLWZBLUZdKycvKSkpIHsKICAgICAgLy8gaGV4CiAgICAgIC8vIHJlZjogaHR0cDovL2Rldi5teXNxbC5jb20vZG9jL3JlZm1hbi81LjUvZW4vaGV4YWRlY2ltYWwtbGl0ZXJhbHMuaHRtbAogICAgICByZXR1cm4gIm51bWJlciI7CiAgICB9IGVsc2UgaWYgKHN1cHBvcnQuYmluYXJ5TnVtYmVyID09IHRydWUgJiYKICAgICAgKCgoY2ggPT0gImIiIHx8IGNoID09ICJCIikgJiYgc3RyZWFtLm1hdGNoKC9eJ1swMV0rJy8pKQogICAgICB8fCAoY2ggPT0gIjAiICYmIHN0cmVhbS5tYXRjaCgvXmJbMDFdKy8pKSkpIHsKICAgICAgLy8gYml0c3RyaW5nCiAgICAgIC8vIHJlZjogaHR0cDovL2Rldi5teXNxbC5jb20vZG9jL3JlZm1hbi81LjUvZW4vYml0LWZpZWxkLWxpdGVyYWxzLmh0bWwKICAgICAgcmV0dXJuICJudW1iZXIiOwogICAgfSBlbHNlIGlmIChjaC5jaGFyQ29kZUF0KDApID4gNDcgJiYgY2guY2hhckNvZGVBdCgwKSA8IDU4KSB7CiAgICAgIC8vIG51bWJlcnMKICAgICAgLy8gcmVmOiBodHRwOi8vZGV2Lm15c3FsLmNvbS9kb2MvcmVmbWFuLzUuNS9lbi9udW1iZXItbGl0ZXJhbHMuaHRtbAogICAgICAgICAgc3RyZWFtLm1hdGNoKC9eWzAtOV0qXC4/WzAtOV0rKFtlRV1bLStdP1swLTldKyk/Lyk7CiAgICAgIHN1cHBvcnQuZGVjaW1hbGxlc3NGbG9hdCA9PSB0cnVlICYmIHN0cmVhbS5lYXQoJy4nKTsKICAgICAgcmV0dXJuICJudW1iZXIiOwogICAgfSBlbHNlIGlmIChjaCA9PSAiPyIgJiYgKHN0cmVhbS5lYXRTcGFjZSgpIHx8IHN0cmVhbS5lb2woKSB8fCBzdHJlYW0uZWF0KCI7IikpKSB7CiAgICAgIC8vIHBsYWNlaG9sZGVycwogICAgICByZXR1cm4gInZhcmlhYmxlLTMiOwogICAgfSBlbHNlIGlmIChjaCA9PSAiJyIgfHwgKGNoID09ICciJyAmJiBzdXBwb3J0LmRvdWJsZVF1b3RlKSkgewogICAgICAvLyBzdHJpbmdzCiAgICAgIC8vIHJlZjogaHR0cDovL2Rldi5teXNxbC5jb20vZG9jL3JlZm1hbi81LjUvZW4vc3RyaW5nLWxpdGVyYWxzLmh0bWwKICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkxpdGVyYWwoY2gpOwogICAgICByZXR1cm4gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CiAgICB9IGVsc2UgaWYgKCgoKHN1cHBvcnQubkNoYXJDYXN0ID09IHRydWUgJiYgKGNoID09ICJuIiB8fCBjaCA9PSAiTiIpKQogICAgICAgIHx8IChzdXBwb3J0LmNoYXJzZXRDYXN0ID09IHRydWUgJiYgY2ggPT0gIl8iICYmIHN0cmVhbS5tYXRjaCgvW2Etel1bYS16MC05XSovaSkpKQogICAgICAgICYmIChzdHJlYW0ucGVlaygpID09ICInIiB8fCBzdHJlYW0ucGVlaygpID09ICciJykpKSB7CiAgICAgIC8vIGNoYXJzZXQgY2FzdGluZzogX3V0Zjgnc3RyJywgTidzdHInLCBuJ3N0cicKICAgICAgLy8gcmVmOiBodHRwOi8vZGV2Lm15c3FsLmNvbS9kb2MvcmVmbWFuLzUuNS9lbi9zdHJpbmctbGl0ZXJhbHMuaHRtbAogICAgICByZXR1cm4gImtleXdvcmQiOwogICAgfSBlbHNlIGlmICgvXltcKFwpLFw7XFtcXV0vLnRlc3QoY2gpKSB7CiAgICAgIC8vIG5vIGhpZ2hsaWdodG5pbmcKICAgICAgcmV0dXJuIG51bGw7CiAgICB9IGVsc2UgaWYgKHN1cHBvcnQuY29tbWVudFNsYXNoU2xhc2ggJiYgY2ggPT0gIi8iICYmIHN0cmVhbS5lYXQoIi8iKSkgewogICAgICAvLyAxLWxpbmUgY29tbWVudAogICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICAgIHJldHVybiAiY29tbWVudCI7CiAgICB9IGVsc2UgaWYgKChzdXBwb3J0LmNvbW1lbnRIYXNoICYmIGNoID09ICIjIikKICAgICAgICB8fCAoY2ggPT0gIi0iICYmIHN0cmVhbS5lYXQoIi0iKSAmJiAoIXN1cHBvcnQuY29tbWVudFNwYWNlUmVxdWlyZWQgfHwgc3RyZWFtLmVhdCgiICIpKSkpIHsKICAgICAgLy8gMS1saW5lIGNvbW1lbnRzCiAgICAgIC8vIHJlZjogaHR0cHM6Ly9rYi5hc2ttb250eS5vcmcvZW4vY29tbWVudC1zeW50YXgvCiAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgcmV0dXJuICJjb21tZW50IjsKICAgIH0gZWxzZSBpZiAoY2ggPT0gIi8iICYmIHN0cmVhbS5lYXQoIioiKSkgewogICAgICAvLyBtdWx0aS1saW5lIGNvbW1lbnRzCiAgICAgIC8vIHJlZjogaHR0cHM6Ly9rYi5hc2ttb250eS5vcmcvZW4vY29tbWVudC1zeW50YXgvCiAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5Db21tZW50OwogICAgICByZXR1cm4gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CiAgICB9IGVsc2UgaWYgKGNoID09ICIuIikgewogICAgICAvLyAuMSBmb3IgMC4xCiAgICAgIGlmIChzdXBwb3J0Lnplcm9sZXNzRmxvYXQgPT0gdHJ1ZSAmJiBzdHJlYW0ubWF0Y2goL14oPzpcZCsoPzplWystXT9cZCspPykvaSkpIHsKICAgICAgICByZXR1cm4gIm51bWJlciI7CiAgICAgIH0KICAgICAgLy8gLnRhYmxlX25hbWUgKE9EQkMpCiAgICAgIC8vIC8vIHJlZjogaHR0cDovL2Rldi5teXNxbC5jb20vZG9jL3JlZm1hbi81LjYvZW4vaWRlbnRpZmllci1xdWFsaWZpZXJzLmh0bWwKICAgICAgaWYgKHN1cHBvcnQuT0RCQ2RvdFRhYmxlID09IHRydWUgJiYgc3RyZWFtLm1hdGNoKC9eW2EtekEtWl9dKy8pKSB7CiAgICAgICAgcmV0dXJuICJ2YXJpYWJsZS0yIjsKICAgICAgfQogICAgfSBlbHNlIGlmIChvcGVyYXRvckNoYXJzLnRlc3QoY2gpKSB7CiAgICAgIC8vIG9wZXJhdG9ycwogICAgICBzdHJlYW0uZWF0V2hpbGUob3BlcmF0b3JDaGFycyk7CiAgICAgIHJldHVybiBudWxsOwogICAgfSBlbHNlIGlmIChjaCA9PSAneycgJiYKICAgICAgICAoc3RyZWFtLm1hdGNoKC9eKCApKihkfER8dHxUfHRzfFRTKSggKSonW14nXSonKCApKn0vKSB8fCBzdHJlYW0ubWF0Y2goL14oICkqKGR8RHx0fFR8dHN8VFMpKCApKiJbXiJdKiIoICkqfS8pKSkgewogICAgICAvLyBkYXRlcyAod2VpcmQgT0RCQyBzeW50YXgpCiAgICAgIC8vIHJlZjogaHR0cDovL2Rldi5teXNxbC5jb20vZG9jL3JlZm1hbi81LjUvZW4vZGF0ZS1hbmQtdGltZS1saXRlcmFscy5odG1sCiAgICAgIHJldHVybiAibnVtYmVyIjsKICAgIH0gZWxzZSB7CiAgICAgIHN0cmVhbS5lYXRXaGlsZSgvXltfXHdcZF0vKTsKICAgICAgdmFyIHdvcmQgPSBzdHJlYW0uY3VycmVudCgpLnRvTG93ZXJDYXNlKCk7CiAgICAgIC8vIGRhdGVzIChzdGFuZGFyZCBTUUwgc3ludGF4KQogICAgICAvLyByZWY6IGh0dHA6Ly9kZXYubXlzcWwuY29tL2RvYy9yZWZtYW4vNS41L2VuL2RhdGUtYW5kLXRpbWUtbGl0ZXJhbHMuaHRtbAogICAgICBpZiAoZGF0ZVNRTC5oYXNPd25Qcm9wZXJ0eSh3b3JkKSAmJiAoc3RyZWFtLm1hdGNoKC9eKCApKydbXiddKicvKSB8fCBzdHJlYW0ubWF0Y2goL14oICkrIlteIl0qIi8pKSkKICAgICAgICByZXR1cm4gIm51bWJlciI7CiAgICAgIGlmIChhdG9tcy5oYXNPd25Qcm9wZXJ0eSh3b3JkKSkgcmV0dXJuICJhdG9tIjsKICAgICAgaWYgKGJ1aWx0aW4uaGFzT3duUHJvcGVydHkod29yZCkpIHJldHVybiAiYnVpbHRpbiI7CiAgICAgIGlmIChrZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eSh3b3JkKSkgcmV0dXJuICJrZXl3b3JkIjsKICAgICAgaWYgKGNsaWVudC5oYXNPd25Qcm9wZXJ0eSh3b3JkKSkgcmV0dXJuICJzdHJpbmctMiI7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogIH0KCiAgLy8gJ3N0cmluZycsIHdpdGggY2hhciBzcGVjaWZpZWQgaW4gcXVvdGUgZXNjYXBlZCBieSAnXCcKICBmdW5jdGlvbiB0b2tlbkxpdGVyYWwocXVvdGUpIHsKICAgIHJldHVybiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHZhciBlc2NhcGVkID0gZmFsc2UsIGNoOwogICAgICB3aGlsZSAoKGNoID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkgewogICAgICAgIGlmIChjaCA9PSBxdW90ZSAmJiAhZXNjYXBlZCkgewogICAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgZXNjYXBlZCA9ICFlc2NhcGVkICYmIGNoID09ICJcXCI7CiAgICAgIH0KICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgfTsKICB9CiAgZnVuY3Rpb24gdG9rZW5Db21tZW50KHN0cmVhbSwgc3RhdGUpIHsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIGlmIChzdHJlYW0uc2tpcFRvKCIqIikpIHsKICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgIGlmIChzdHJlYW0uZWF0KCIvIikpIHsKICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgcmV0dXJuICJjb21tZW50IjsKICB9CgogIGZ1bmN0aW9uIHB1c2hDb250ZXh0KHN0cmVhbSwgc3RhdGUsIHR5cGUpIHsKICAgIHN0YXRlLmNvbnRleHQgPSB7CiAgICAgIHByZXY6IHN0YXRlLmNvbnRleHQsCiAgICAgIGluZGVudDogc3RyZWFtLmluZGVudGF0aW9uKCksCiAgICAgIGNvbDogc3RyZWFtLmNvbHVtbigpLAogICAgICB0eXBlOiB0eXBlCiAgICB9OwogIH0KCiAgZnVuY3Rpb24gcG9wQ29udGV4dChzdGF0ZSkgewogICAgc3RhdGUuaW5kZW50ID0gc3RhdGUuY29udGV4dC5pbmRlbnQ7CiAgICBzdGF0ZS5jb250ZXh0ID0gc3RhdGUuY29udGV4dC5wcmV2OwogIH0KCiAgcmV0dXJuIHsKICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4ge3Rva2VuaXplOiB0b2tlbkJhc2UsIGNvbnRleHQ6IG51bGx9OwogICAgfSwKCiAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICBpZiAoc3RyZWFtLnNvbCgpKSB7CiAgICAgICAgaWYgKHN0YXRlLmNvbnRleHQgJiYgc3RhdGUuY29udGV4dC5hbGlnbiA9PSBudWxsKQogICAgICAgICAgc3RhdGUuY29udGV4dC5hbGlnbiA9IGZhbHNlOwogICAgICB9CiAgICAgIGlmIChzdHJlYW0uZWF0U3BhY2UoKSkgcmV0dXJuIG51bGw7CgogICAgICB2YXIgc3R5bGUgPSBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgICAgaWYgKHN0eWxlID09ICJjb21tZW50IikgcmV0dXJuIHN0eWxlOwoKICAgICAgaWYgKHN0YXRlLmNvbnRleHQgJiYgc3RhdGUuY29udGV4dC5hbGlnbiA9PSBudWxsKQogICAgICAgIHN0YXRlLmNvbnRleHQuYWxpZ24gPSB0cnVlOwoKICAgICAgdmFyIHRvayA9IHN0cmVhbS5jdXJyZW50KCk7CiAgICAgIGlmICh0b2sgPT0gIigiKQogICAgICAgIHB1c2hDb250ZXh0KHN0cmVhbSwgc3RhdGUsICIpIik7CiAgICAgIGVsc2UgaWYgKHRvayA9PSAiWyIpCiAgICAgICAgcHVzaENvbnRleHQoc3RyZWFtLCBzdGF0ZSwgIl0iKTsKICAgICAgZWxzZSBpZiAoc3RhdGUuY29udGV4dCAmJiBzdGF0ZS5jb250ZXh0LnR5cGUgPT0gdG9rKQogICAgICAgIHBvcENvbnRleHQoc3RhdGUpOwogICAgICByZXR1cm4gc3R5bGU7CiAgICB9LAoKICAgIGluZGVudDogZnVuY3Rpb24oc3RhdGUsIHRleHRBZnRlcikgewogICAgICB2YXIgY3ggPSBzdGF0ZS5jb250ZXh0OwogICAgICBpZiAoIWN4KSByZXR1cm4gMDsKICAgICAgdmFyIGNsb3NpbmcgPSB0ZXh0QWZ0ZXIuY2hhckF0KDApID09IGN4LnR5cGU7CiAgICAgIGlmIChjeC5hbGlnbikgcmV0dXJuIGN4LmNvbCArIChjbG9zaW5nID8gMCA6IDEpOwogICAgICBlbHNlIHJldHVybiBjeC5pbmRlbnQgKyAoY2xvc2luZyA/IDAgOiBjb25maWcuaW5kZW50VW5pdCk7CiAgICB9LAoKICAgIGJsb2NrQ29tbWVudFN0YXJ0OiAiLyoiLAogICAgYmxvY2tDb21tZW50RW5kOiAiKi8iLAogICAgbGluZUNvbW1lbnQ6IHN1cHBvcnQuY29tbWVudFNsYXNoU2xhc2ggPyAiLy8iIDogc3VwcG9ydC5jb21tZW50SGFzaCA/ICIjIiA6IG51bGwKICB9Owp9KTsKCihmdW5jdGlvbigpIHsKICAidXNlIHN0cmljdCI7CgogIC8vIGBpZGVudGlmaWVyYAogIGZ1bmN0aW9uIGhvb2tJZGVudGlmaWVyKHN0cmVhbSkgewogICAgLy8gTXlTUUwvTWFyaWFEQiBpZGVudGlmaWVycwogICAgLy8gcmVmOiBodHRwOi8vZGV2Lm15c3FsLmNvbS9kb2MvcmVmbWFuLzUuNi9lbi9pZGVudGlmaWVyLXF1YWxpZmllcnMuaHRtbAogICAgdmFyIGNoOwogICAgd2hpbGUgKChjaCA9IHN0cmVhbS5uZXh0KCkpICE9IG51bGwpIHsKICAgICAgaWYgKGNoID09ICJgIiAmJiAhc3RyZWFtLmVhdCgiYCIpKSByZXR1cm4gInZhcmlhYmxlLTIiOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICAvLyB2YXJpYWJsZSB0b2tlbgogIGZ1bmN0aW9uIGhvb2tWYXIoc3RyZWFtKSB7CiAgICAvLyB2YXJpYWJsZXMKICAgIC8vIEBAcHJlZml4LnZhck5hbWUgQHZhck5hbWUKICAgIC8vIHZhck5hbWUgY2FuIGJlIHF1b3RlZCB3aXRoIGAgb3IgJyBvciAiCiAgICAvLyByZWY6IGh0dHA6Ly9kZXYubXlzcWwuY29tL2RvYy9yZWZtYW4vNS41L2VuL3VzZXItdmFyaWFibGVzLmh0bWwKICAgIGlmIChzdHJlYW0uZWF0KCJAIikpIHsKICAgICAgc3RyZWFtLm1hdGNoKC9ec2Vzc2lvblwuLyk7CiAgICAgIHN0cmVhbS5tYXRjaCgvXmxvY2FsXC4vKTsKICAgICAgc3RyZWFtLm1hdGNoKC9eZ2xvYmFsXC4vKTsKICAgIH0KCiAgICBpZiAoc3RyZWFtLmVhdCgiJyIpKSB7CiAgICAgIHN0cmVhbS5tYXRjaCgvXi4qJy8pOwogICAgICByZXR1cm4gInZhcmlhYmxlLTIiOwogICAgfSBlbHNlIGlmIChzdHJlYW0uZWF0KCciJykpIHsKICAgICAgc3RyZWFtLm1hdGNoKC9eLioiLyk7CiAgICAgIHJldHVybiAidmFyaWFibGUtMiI7CiAgICB9IGVsc2UgaWYgKHN0cmVhbS5lYXQoImAiKSkgewogICAgICBzdHJlYW0ubWF0Y2goL14uKmAvKTsKICAgICAgcmV0dXJuICJ2YXJpYWJsZS0yIjsKICAgIH0gZWxzZSBpZiAoc3RyZWFtLm1hdGNoKC9eWzAtOWEtekEtWiRcLlxfXSsvKSkgewogICAgICByZXR1cm4gInZhcmlhYmxlLTIiOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfTsKCiAgLy8gc2hvcnQgY2xpZW50IGtleXdvcmQgdG9rZW4KICBmdW5jdGlvbiBob29rQ2xpZW50KHN0cmVhbSkgewogICAgLy8gXE4gbWVhbnMgTlVMTAogICAgLy8gcmVmOiBodHRwOi8vZGV2Lm15c3FsLmNvbS9kb2MvcmVmbWFuLzUuNS9lbi9udWxsLXZhbHVlcy5odG1sCiAgICBpZiAoc3RyZWFtLmVhdCgiTiIpKSB7CiAgICAgICAgcmV0dXJuICJhdG9tIjsKICAgIH0KICAgIC8vIFxnLCBldGMKICAgIC8vIHJlZjogaHR0cDovL2Rldi5teXNxbC5jb20vZG9jL3JlZm1hbi81LjUvZW4vbXlzcWwtY29tbWFuZHMuaHRtbAogICAgcmV0dXJuIHN0cmVhbS5tYXRjaCgvXlthLXpBLVouIyE/XS8pID8gInZhcmlhYmxlLTIiIDogbnVsbDsKICB9CgogIC8vIHRoZXNlIGtleXdvcmRzIGFyZSB1c2VkIGJ5IGFsbCBTUUwgZGlhbGVjdHMgKGhvd2V2ZXIsIGEgbW9kZSBjYW4gc3RpbGwgb3ZlcndyaXRlIGl0KQogIHZhciBzcWxLZXl3b3JkcyA9ICJhbHRlciBhbmQgYXMgYXNjIGJldHdlZW4gYnkgY291bnQgY3JlYXRlIGRlbGV0ZSBkZXNjIGRpc3RpbmN0IGRyb3AgZnJvbSBoYXZpbmcgaW4gaW5zZXJ0IGludG8gaXMgam9pbiBsaWtlIG5vdCBvbiBvciBvcmRlciBzZWxlY3Qgc2V0IHRhYmxlIHVuaW9uIHVwZGF0ZSB2YWx1ZXMgd2hlcmUgIjsKCiAgLy8gdHVybiBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IGludG8gYW4gYXJyYXkKICBmdW5jdGlvbiBzZXQoc3RyKSB7CiAgICB2YXIgb2JqID0ge30sIHdvcmRzID0gc3RyLnNwbGl0KCIgIik7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHdvcmRzLmxlbmd0aDsgKytpKSBvYmpbd29yZHNbaV1dID0gdHJ1ZTsKICAgIHJldHVybiBvYmo7CiAgfQoKICAvLyBBIGdlbmVyaWMgU1FMIE1vZGUuIEl0J3Mgbm90IGEgc3RhbmRhcmQsIGl0IGp1c3QgdHJ5IHRvIHN1cHBvcnQgd2hhdCBpcyBnZW5lcmFsbHkgc3VwcG9ydGVkCiAgQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtc3FsIiwgewogICAgbmFtZTogInNxbCIsCiAgICBrZXl3b3Jkczogc2V0KHNxbEtleXdvcmRzICsgImJlZ2luIiksCiAgICBidWlsdGluOiBzZXQoImJvb2wgYm9vbGVhbiBiaXQgYmxvYiBlbnVtIGxvbmcgbG9uZ2Jsb2IgbG9uZ3RleHQgbWVkaXVtIG1lZGl1bWJsb2IgbWVkaXVtaW50IG1lZGl1bXRleHQgdGltZSB0aW1lc3RhbXAgdGlueWJsb2IgdGlueWludCB0aW55dGV4dCB0ZXh0IGJpZ2ludCBpbnQgaW50MSBpbnQyIGludDMgaW50NCBpbnQ4IGludGVnZXIgZmxvYXQgZmxvYXQ0IGZsb2F0OCBkb3VibGUgY2hhciB2YXJiaW5hcnkgdmFyY2hhciB2YXJjaGFyYWN0ZXIgcHJlY2lzaW9uIHJlYWwgZGF0ZSBkYXRldGltZSB5ZWFyIHVuc2lnbmVkIHNpZ25lZCBkZWNpbWFsIG51bWVyaWMiKSwKICAgIGF0b21zOiBzZXQoImZhbHNlIHRydWUgbnVsbCB1bmtub3duIiksCiAgICBvcGVyYXRvckNoYXJzOiAvXlsqK1wtJTw+IT1dLywKICAgIGRhdGVTUUw6IHNldCgiZGF0ZSB0aW1lIHRpbWVzdGFtcCIpLAogICAgc3VwcG9ydDogc2V0KCJPREJDZG90VGFibGUgZG91YmxlUXVvdGUgYmluYXJ5TnVtYmVyIGhleE51bWJlciIpCiAgfSk7CgogIENvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC94LW1zc3FsIiwgewogICAgbmFtZTogInNxbCIsCiAgICBjbGllbnQ6IHNldCgiY2hhcnNldCBjbGVhciBjb25uZWN0IGVkaXQgZWdvIGV4aXQgZ28gaGVscCBub3BhZ2VyIG5vdGVlIG5vd2FybmluZyBwYWdlciBwcmludCBwcm9tcHQgcXVpdCByZWhhc2ggc291cmNlIHN0YXR1cyBzeXN0ZW0gdGVlIiksCiAgICBrZXl3b3Jkczogc2V0KHNxbEtleXdvcmRzICsgImJlZ2luIHRyaWdnZXIgcHJvYyB2aWV3IGluZGV4IGZvciBhZGQgY29uc3RyYWludCBrZXkgcHJpbWFyeSBmb3JlaWduIGNvbGxhdGUgY2x1c3RlcmVkIG5vbmNsdXN0ZXJlZCIpLAogICAgYnVpbHRpbjogc2V0KCJiaWdpbnQgbnVtZXJpYyBiaXQgc21hbGxpbnQgZGVjaW1hbCBzbWFsbG1vbmV5IGludCB0aW55aW50IG1vbmV5IGZsb2F0IHJlYWwgY2hhciB2YXJjaGFyIHRleHQgbmNoYXIgbnZhcmNoYXIgbnRleHQgYmluYXJ5IHZhcmJpbmFyeSBpbWFnZSBjdXJzb3IgdGltZXN0YW1wIGhpZXJhcmNoeWlkIHVuaXF1ZWlkZW50aWZpZXIgc3FsX3ZhcmlhbnQgeG1sIHRhYmxlICIpLAogICAgYXRvbXM6IHNldCgiZmFsc2UgdHJ1ZSBudWxsIHVua25vd24iKSwKICAgIG9wZXJhdG9yQ2hhcnM6IC9eWyorXC0lPD4hPV0vLAogICAgZGF0ZVNRTDogc2V0KCJkYXRlIGRhdGV0aW1lb2Zmc2V0IGRhdGV0aW1lMiBzbWFsbGRhdGV0aW1lIGRhdGV0aW1lIHRpbWUiKSwKICAgIGhvb2tzOiB7CiAgICAgICJAIjogICBob29rVmFyCiAgICB9CiAgfSk7CgogIENvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC94LW15c3FsIiwgewogICAgbmFtZTogInNxbCIsCiAgICBjbGllbnQ6IHNldCgiY2hhcnNldCBjbGVhciBjb25uZWN0IGVkaXQgZWdvIGV4aXQgZ28gaGVscCBub3BhZ2VyIG5vdGVlIG5vd2FybmluZyBwYWdlciBwcmludCBwcm9tcHQgcXVpdCByZWhhc2ggc291cmNlIHN0YXR1cyBzeXN0ZW0gdGVlIiksCiAgICBrZXl3b3Jkczogc2V0KHNxbEtleXdvcmRzICsgImFjY2Vzc2libGUgYWN0aW9uIGFkZCBhZnRlciBhbGdvcml0aG0gYWxsIGFuYWx5emUgYXNlbnNpdGl2ZSBhdCBhdXRob3JzIGF1dG9faW5jcmVtZW50IGF1dG9jb21taXQgYXZnIGF2Z19yb3dfbGVuZ3RoIGJlZm9yZSBiaW5hcnkgYmlubG9nIGJvdGggYnRyZWUgY2FjaGUgY2FsbCBjYXNjYWRlIGNhc2NhZGVkIGNhc2UgY2F0YWxvZ19uYW1lIGNoYWluIGNoYW5nZSBjaGFuZ2VkIGNoYXJhY3RlciBjaGVjayBjaGVja3BvaW50IGNoZWNrc3VtIGNsYXNzX29yaWdpbiBjbGllbnRfc3RhdGlzdGljcyBjbG9zZSBjb2FsZXNjZSBjb2RlIGNvbGxhdGUgY29sbGF0aW9uIGNvbGxhdGlvbnMgY29sdW1uIGNvbHVtbnMgY29tbWVudCBjb21taXQgY29tbWl0dGVkIGNvbXBsZXRpb24gY29uY3VycmVudCBjb25kaXRpb24gY29ubmVjdGlvbiBjb25zaXN0ZW50IGNvbnN0cmFpbnQgY29udGFpbnMgY29udGludWUgY29udHJpYnV0b3JzIGNvbnZlcnQgY3Jvc3MgY3VycmVudCBjdXJyZW50X2RhdGUgY3VycmVudF90aW1lIGN1cnJlbnRfdGltZXN0YW1wIGN1cnJlbnRfdXNlciBjdXJzb3IgZGF0YSBkYXRhYmFzZSBkYXRhYmFzZXMgZGF5X2hvdXIgZGF5X21pY3Jvc2Vjb25kIGRheV9taW51dGUgZGF5X3NlY29uZCBkZWFsbG9jYXRlIGRlYyBkZWNsYXJlIGRlZmF1bHQgZGVsYXlfa2V5X3dyaXRlIGRlbGF5ZWQgZGVsaW1pdGVyIGRlc19rZXlfZmlsZSBkZXNjcmliZSBkZXRlcm1pbmlzdGljIGRldl9wb3AgZGV2X3NhbXAgZGV2aWFuY2UgZGlhZ25vc3RpY3MgZGlyZWN0b3J5IGRpc2FibGUgZGlzY2FyZCBkaXN0aW5jdHJvdyBkaXYgZHVhbCBkdW1wZmlsZSBlYWNoIGVsc2VpZiBlbmFibGUgZW5jbG9zZWQgZW5kIGVuZHMgZW5naW5lIGVuZ2luZXMgZW51bSBlcnJvcnMgZXNjYXBlIGVzY2FwZWQgZXZlbiBldmVudCBldmVudHMgZXZlcnkgZXhlY3V0ZSBleGlzdHMgZXhpdCBleHBsYWluIGV4dGVuZGVkIGZhc3QgZmV0Y2ggZmllbGQgZmllbGRzIGZpcnN0IGZsdXNoIGZvciBmb3JjZSBmb3JlaWduIGZvdW5kX3Jvd3MgZnVsbCBmdWxsdGV4dCBmdW5jdGlvbiBnZW5lcmFsIGdldCBnbG9iYWwgZ3JhbnQgZ3JhbnRzIGdyb3VwIGdyb3VwYnlfY29uY2F0IGhhbmRsZXIgaGFzaCBoZWxwIGhpZ2hfcHJpb3JpdHkgaG9zdHMgaG91cl9taWNyb3NlY29uZCBob3VyX21pbnV0ZSBob3VyX3NlY29uZCBpZiBpZ25vcmUgaWdub3JlX3NlcnZlcl9pZHMgaW1wb3J0IGluZGV4IGluZGV4X3N0YXRpc3RpY3MgaW5maWxlIGlubmVyIGlubm9kYiBpbm91dCBpbnNlbnNpdGl2ZSBpbnNlcnRfbWV0aG9kIGluc3RhbGwgaW50ZXJ2YWwgaW52b2tlciBpc29sYXRpb24gaXRlcmF0ZSBrZXkga2V5cyBraWxsIGxhbmd1YWdlIGxhc3QgbGVhZGluZyBsZWF2ZSBsZWZ0IGxldmVsIGxpbWl0IGxpbmVhciBsaW5lcyBsaXN0IGxvYWQgbG9jYWwgbG9jYWx0aW1lIGxvY2FsdGltZXN0YW1wIGxvY2sgbG9ncyBsb3dfcHJpb3JpdHkgbWFzdGVyIG1hc3Rlcl9oZWFydGJlYXRfcGVyaW9kIG1hc3Rlcl9zc2xfdmVyaWZ5X3NlcnZlcl9jZXJ0IG1hc3RlcnMgbWF0Y2ggbWF4IG1heF9yb3dzIG1heHZhbHVlIG1lc3NhZ2VfdGV4dCBtaWRkbGVpbnQgbWlncmF0ZSBtaW4gbWluX3Jvd3MgbWludXRlX21pY3Jvc2Vjb25kIG1pbnV0ZV9zZWNvbmQgbW9kIG1vZGUgbW9kaWZpZXMgbW9kaWZ5IG11dGV4IG15c3FsX2Vycm5vIG5hdHVyYWwgbmV4dCBubyBub193cml0ZV90b19iaW5sb2cgb2ZmbGluZSBvZmZzZXQgb25lIG9ubGluZSBvcGVuIG9wdGltaXplIG9wdGlvbiBvcHRpb25hbGx5IG91dCBvdXRlciBvdXRmaWxlIHBhY2tfa2V5cyBwYXJzZXIgcGFydGl0aW9uIHBhcnRpdGlvbnMgcGFzc3dvcmQgcGhhc2UgcGx1Z2luIHBsdWdpbnMgcHJlcGFyZSBwcmVzZXJ2ZSBwcmV2IHByaW1hcnkgcHJpdmlsZWdlcyBwcm9jZWR1cmUgcHJvY2Vzc2xpc3QgcHJvZmlsZSBwcm9maWxlcyBwdXJnZSBxdWVyeSBxdWljayByYW5nZSByZWFkIHJlYWRfd3JpdGUgcmVhZHMgcmVhbCByZWJ1aWxkIHJlY292ZXIgcmVmZXJlbmNlcyByZWdleHAgcmVsYXlsb2cgcmVsZWFzZSByZW1vdmUgcmVuYW1lIHJlb3JnYW5pemUgcmVwYWlyIHJlcGVhdGFibGUgcmVwbGFjZSByZXF1aXJlIHJlc2lnbmFsIHJlc3RyaWN0IHJlc3VtZSByZXR1cm4gcmV0dXJucyByZXZva2UgcmlnaHQgcmxpa2Ugcm9sbGJhY2sgcm9sbHVwIHJvdyByb3dfZm9ybWF0IHJ0cmVlIHNhdmVwb2ludCBzY2hlZHVsZSBzY2hlbWEgc2NoZW1hX25hbWUgc2NoZW1hcyBzZWNvbmRfbWljcm9zZWNvbmQgc2VjdXJpdHkgc2Vuc2l0aXZlIHNlcGFyYXRvciBzZXJpYWxpemFibGUgc2VydmVyIHNlc3Npb24gc2hhcmUgc2hvdyBzaWduYWwgc2xhdmUgc2xvdyBzbWFsbGludCBzbmFwc2hvdCBzb25hbWUgc3BhdGlhbCBzcGVjaWZpYyBzcWwgc3FsX2JpZ19yZXN1bHQgc3FsX2J1ZmZlcl9yZXN1bHQgc3FsX2NhY2hlIHNxbF9jYWxjX2ZvdW5kX3Jvd3Mgc3FsX25vX2NhY2hlIHNxbF9zbWFsbF9yZXN1bHQgc3FsZXhjZXB0aW9uIHNxbHN0YXRlIHNxbHdhcm5pbmcgc3NsIHN0YXJ0IHN0YXJ0aW5nIHN0YXJ0cyBzdGF0dXMgc3RkIHN0ZGRldiBzdGRkZXZfcG9wIHN0ZGRldl9zYW1wIHN0b3JhZ2Ugc3RyYWlnaHRfam9pbiBzdWJjbGFzc19vcmlnaW4gc3VtIHN1c3BlbmQgdGFibGVfbmFtZSB0YWJsZV9zdGF0aXN0aWNzIHRhYmxlcyB0YWJsZXNwYWNlIHRlbXBvcmFyeSB0ZXJtaW5hdGVkIHRvIHRyYWlsaW5nIHRyYW5zYWN0aW9uIHRyaWdnZXIgdHJpZ2dlcnMgdHJ1bmNhdGUgdW5jb21taXR0ZWQgdW5kbyB1bmluc3RhbGwgdW5pcXVlIHVubG9jayB1cGdyYWRlIHVzYWdlIHVzZSB1c2VfZnJtIHVzZXIgdXNlcl9yZXNvdXJjZXMgdXNlcl9zdGF0aXN0aWNzIHVzaW5nIHV0Y19kYXRlIHV0Y190aW1lIHV0Y190aW1lc3RhbXAgdmFsdWUgdmFyaWFibGVzIHZhcnlpbmcgdmlldyB2aWV3cyB3YXJuaW5ncyB3aGVuIHdoaWxlIHdpdGggd29yayB3cml0ZSB4YSB4b3IgeWVhcl9tb250aCB6ZXJvZmlsbCBiZWdpbiBkbyB0aGVuIGVsc2UgbG9vcCByZXBlYXQiKSwKICAgIGJ1aWx0aW46IHNldCgiYm9vbCBib29sZWFuIGJpdCBibG9iIGRlY2ltYWwgZG91YmxlIGZsb2F0IGxvbmcgbG9uZ2Jsb2IgbG9uZ3RleHQgbWVkaXVtIG1lZGl1bWJsb2IgbWVkaXVtaW50IG1lZGl1bXRleHQgdGltZSB0aW1lc3RhbXAgdGlueWJsb2IgdGlueWludCB0aW55dGV4dCB0ZXh0IGJpZ2ludCBpbnQgaW50MSBpbnQyIGludDMgaW50NCBpbnQ4IGludGVnZXIgZmxvYXQgZmxvYXQ0IGZsb2F0OCBkb3VibGUgY2hhciB2YXJiaW5hcnkgdmFyY2hhciB2YXJjaGFyYWN0ZXIgcHJlY2lzaW9uIGRhdGUgZGF0ZXRpbWUgeWVhciB1bnNpZ25lZCBzaWduZWQgbnVtZXJpYyIpLAogICAgYXRvbXM6IHNldCgiZmFsc2UgdHJ1ZSBudWxsIHVua25vd24iKSwKICAgIG9wZXJhdG9yQ2hhcnM6IC9eWyorXC0lPD4hPSZ8Xl0vLAogICAgZGF0ZVNRTDogc2V0KCJkYXRlIHRpbWUgdGltZXN0YW1wIiksCiAgICBzdXBwb3J0OiBzZXQoIk9EQkNkb3RUYWJsZSBkZWNpbWFsbGVzc0Zsb2F0IHplcm9sZXNzRmxvYXQgYmluYXJ5TnVtYmVyIGhleE51bWJlciBkb3VibGVRdW90ZSBuQ2hhckNhc3QgY2hhcnNldENhc3QgY29tbWVudEhhc2ggY29tbWVudFNwYWNlUmVxdWlyZWQiKSwKICAgIGhvb2tzOiB7CiAgICAgICJAIjogICBob29rVmFyLAogICAgICAiYCI6ICAgaG9va0lkZW50aWZpZXIsCiAgICAgICJcXCI6ICBob29rQ2xpZW50CiAgICB9CiAgfSk7CgogIENvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC94LW1hcmlhZGIiLCB7CiAgICBuYW1lOiAic3FsIiwKICAgIGNsaWVudDogc2V0KCJjaGFyc2V0IGNsZWFyIGNvbm5lY3QgZWRpdCBlZ28gZXhpdCBnbyBoZWxwIG5vcGFnZXIgbm90ZWUgbm93YXJuaW5nIHBhZ2VyIHByaW50IHByb21wdCBxdWl0IHJlaGFzaCBzb3VyY2Ugc3RhdHVzIHN5c3RlbSB0ZWUiKSwKICAgIGtleXdvcmRzOiBzZXQoc3FsS2V5d29yZHMgKyAiYWNjZXNzaWJsZSBhY3Rpb24gYWRkIGFmdGVyIGFsZ29yaXRobSBhbGwgYWx3YXlzIGFuYWx5emUgYXNlbnNpdGl2ZSBhdCBhdXRob3JzIGF1dG9faW5jcmVtZW50IGF1dG9jb21taXQgYXZnIGF2Z19yb3dfbGVuZ3RoIGJlZm9yZSBiaW5hcnkgYmlubG9nIGJvdGggYnRyZWUgY2FjaGUgY2FsbCBjYXNjYWRlIGNhc2NhZGVkIGNhc2UgY2F0YWxvZ19uYW1lIGNoYWluIGNoYW5nZSBjaGFuZ2VkIGNoYXJhY3RlciBjaGVjayBjaGVja3BvaW50IGNoZWNrc3VtIGNsYXNzX29yaWdpbiBjbGllbnRfc3RhdGlzdGljcyBjbG9zZSBjb2FsZXNjZSBjb2RlIGNvbGxhdGUgY29sbGF0aW9uIGNvbGxhdGlvbnMgY29sdW1uIGNvbHVtbnMgY29tbWVudCBjb21taXQgY29tbWl0dGVkIGNvbXBsZXRpb24gY29uY3VycmVudCBjb25kaXRpb24gY29ubmVjdGlvbiBjb25zaXN0ZW50IGNvbnN0cmFpbnQgY29udGFpbnMgY29udGludWUgY29udHJpYnV0b3JzIGNvbnZlcnQgY3Jvc3MgY3VycmVudCBjdXJyZW50X2RhdGUgY3VycmVudF90aW1lIGN1cnJlbnRfdGltZXN0YW1wIGN1cnJlbnRfdXNlciBjdXJzb3IgZGF0YSBkYXRhYmFzZSBkYXRhYmFzZXMgZGF5X2hvdXIgZGF5X21pY3Jvc2Vjb25kIGRheV9taW51dGUgZGF5X3NlY29uZCBkZWFsbG9jYXRlIGRlYyBkZWNsYXJlIGRlZmF1bHQgZGVsYXlfa2V5X3dyaXRlIGRlbGF5ZWQgZGVsaW1pdGVyIGRlc19rZXlfZmlsZSBkZXNjcmliZSBkZXRlcm1pbmlzdGljIGRldl9wb3AgZGV2X3NhbXAgZGV2aWFuY2UgZGlhZ25vc3RpY3MgZGlyZWN0b3J5IGRpc2FibGUgZGlzY2FyZCBkaXN0aW5jdHJvdyBkaXYgZHVhbCBkdW1wZmlsZSBlYWNoIGVsc2VpZiBlbmFibGUgZW5jbG9zZWQgZW5kIGVuZHMgZW5naW5lIGVuZ2luZXMgZW51bSBlcnJvcnMgZXNjYXBlIGVzY2FwZWQgZXZlbiBldmVudCBldmVudHMgZXZlcnkgZXhlY3V0ZSBleGlzdHMgZXhpdCBleHBsYWluIGV4dGVuZGVkIGZhc3QgZmV0Y2ggZmllbGQgZmllbGRzIGZpcnN0IGZsdXNoIGZvciBmb3JjZSBmb3JlaWduIGZvdW5kX3Jvd3MgZnVsbCBmdWxsdGV4dCBmdW5jdGlvbiBnZW5lcmFsIGdlbmVyYXRlZCBnZXQgZ2xvYmFsIGdyYW50IGdyYW50cyBncm91cCBncm91cGJ5X2NvbmNhdCBoYW5kbGVyIGhhcmQgaGFzaCBoZWxwIGhpZ2hfcHJpb3JpdHkgaG9zdHMgaG91cl9taWNyb3NlY29uZCBob3VyX21pbnV0ZSBob3VyX3NlY29uZCBpZiBpZ25vcmUgaWdub3JlX3NlcnZlcl9pZHMgaW1wb3J0IGluZGV4IGluZGV4X3N0YXRpc3RpY3MgaW5maWxlIGlubmVyIGlubm9kYiBpbm91dCBpbnNlbnNpdGl2ZSBpbnNlcnRfbWV0aG9kIGluc3RhbGwgaW50ZXJ2YWwgaW52b2tlciBpc29sYXRpb24gaXRlcmF0ZSBrZXkga2V5cyBraWxsIGxhbmd1YWdlIGxhc3QgbGVhZGluZyBsZWF2ZSBsZWZ0IGxldmVsIGxpbWl0IGxpbmVhciBsaW5lcyBsaXN0IGxvYWQgbG9jYWwgbG9jYWx0aW1lIGxvY2FsdGltZXN0YW1wIGxvY2sgbG9ncyBsb3dfcHJpb3JpdHkgbWFzdGVyIG1hc3Rlcl9oZWFydGJlYXRfcGVyaW9kIG1hc3Rlcl9zc2xfdmVyaWZ5X3NlcnZlcl9jZXJ0IG1hc3RlcnMgbWF0Y2ggbWF4IG1heF9yb3dzIG1heHZhbHVlIG1lc3NhZ2VfdGV4dCBtaWRkbGVpbnQgbWlncmF0ZSBtaW4gbWluX3Jvd3MgbWludXRlX21pY3Jvc2Vjb25kIG1pbnV0ZV9zZWNvbmQgbW9kIG1vZGUgbW9kaWZpZXMgbW9kaWZ5IG11dGV4IG15c3FsX2Vycm5vIG5hdHVyYWwgbmV4dCBubyBub193cml0ZV90b19iaW5sb2cgb2ZmbGluZSBvZmZzZXQgb25lIG9ubGluZSBvcGVuIG9wdGltaXplIG9wdGlvbiBvcHRpb25hbGx5IG91dCBvdXRlciBvdXRmaWxlIHBhY2tfa2V5cyBwYXJzZXIgcGFydGl0aW9uIHBhcnRpdGlvbnMgcGFzc3dvcmQgcGVyc2lzdGVudCBwaGFzZSBwbHVnaW4gcGx1Z2lucyBwcmVwYXJlIHByZXNlcnZlIHByZXYgcHJpbWFyeSBwcml2aWxlZ2VzIHByb2NlZHVyZSBwcm9jZXNzbGlzdCBwcm9maWxlIHByb2ZpbGVzIHB1cmdlIHF1ZXJ5IHF1aWNrIHJhbmdlIHJlYWQgcmVhZF93cml0ZSByZWFkcyByZWFsIHJlYnVpbGQgcmVjb3ZlciByZWZlcmVuY2VzIHJlZ2V4cCByZWxheWxvZyByZWxlYXNlIHJlbW92ZSByZW5hbWUgcmVvcmdhbml6ZSByZXBhaXIgcmVwZWF0YWJsZSByZXBsYWNlIHJlcXVpcmUgcmVzaWduYWwgcmVzdHJpY3QgcmVzdW1lIHJldHVybiByZXR1cm5zIHJldm9rZSByaWdodCBybGlrZSByb2xsYmFjayByb2xsdXAgcm93IHJvd19mb3JtYXQgcnRyZWUgc2F2ZXBvaW50IHNjaGVkdWxlIHNjaGVtYSBzY2hlbWFfbmFtZSBzY2hlbWFzIHNlY29uZF9taWNyb3NlY29uZCBzZWN1cml0eSBzZW5zaXRpdmUgc2VwYXJhdG9yIHNlcmlhbGl6YWJsZSBzZXJ2ZXIgc2Vzc2lvbiBzaGFyZSBzaG93IHNodXRkb3duIHNpZ25hbCBzbGF2ZSBzbG93IHNtYWxsaW50IHNuYXBzaG90IHNvZnQgc29uYW1lIHNwYXRpYWwgc3BlY2lmaWMgc3FsIHNxbF9iaWdfcmVzdWx0IHNxbF9idWZmZXJfcmVzdWx0IHNxbF9jYWNoZSBzcWxfY2FsY19mb3VuZF9yb3dzIHNxbF9ub19jYWNoZSBzcWxfc21hbGxfcmVzdWx0IHNxbGV4Y2VwdGlvbiBzcWxzdGF0ZSBzcWx3YXJuaW5nIHNzbCBzdGFydCBzdGFydGluZyBzdGFydHMgc3RhdHVzIHN0ZCBzdGRkZXYgc3RkZGV2X3BvcCBzdGRkZXZfc2FtcCBzdG9yYWdlIHN0cmFpZ2h0X2pvaW4gc3ViY2xhc3Nfb3JpZ2luIHN1bSBzdXNwZW5kIHRhYmxlX25hbWUgdGFibGVfc3RhdGlzdGljcyB0YWJsZXMgdGFibGVzcGFjZSB0ZW1wb3JhcnkgdGVybWluYXRlZCB0byB0cmFpbGluZyB0cmFuc2FjdGlvbiB0cmlnZ2VyIHRyaWdnZXJzIHRydW5jYXRlIHVuY29tbWl0dGVkIHVuZG8gdW5pbnN0YWxsIHVuaXF1ZSB1bmxvY2sgdXBncmFkZSB1c2FnZSB1c2UgdXNlX2ZybSB1c2VyIHVzZXJfcmVzb3VyY2VzIHVzZXJfc3RhdGlzdGljcyB1c2luZyB1dGNfZGF0ZSB1dGNfdGltZSB1dGNfdGltZXN0YW1wIHZhbHVlIHZhcmlhYmxlcyB2YXJ5aW5nIHZpZXcgdmlld3MgdmlydHVhbCB3YXJuaW5ncyB3aGVuIHdoaWxlIHdpdGggd29yayB3cml0ZSB4YSB4b3IgeWVhcl9tb250aCB6ZXJvZmlsbCBiZWdpbiBkbyB0aGVuIGVsc2UgbG9vcCByZXBlYXQiKSwKICAgIGJ1aWx0aW46IHNldCgiYm9vbCBib29sZWFuIGJpdCBibG9iIGRlY2ltYWwgZG91YmxlIGZsb2F0IGxvbmcgbG9uZ2Jsb2IgbG9uZ3RleHQgbWVkaXVtIG1lZGl1bWJsb2IgbWVkaXVtaW50IG1lZGl1bXRleHQgdGltZSB0aW1lc3RhbXAgdGlueWJsb2IgdGlueWludCB0aW55dGV4dCB0ZXh0IGJpZ2ludCBpbnQgaW50MSBpbnQyIGludDMgaW50NCBpbnQ4IGludGVnZXIgZmxvYXQgZmxvYXQ0IGZsb2F0OCBkb3VibGUgY2hhciB2YXJiaW5hcnkgdmFyY2hhciB2YXJjaGFyYWN0ZXIgcHJlY2lzaW9uIGRhdGUgZGF0ZXRpbWUgeWVhciB1bnNpZ25lZCBzaWduZWQgbnVtZXJpYyIpLAogICAgYXRvbXM6IHNldCgiZmFsc2UgdHJ1ZSBudWxsIHVua25vd24iKSwKICAgIG9wZXJhdG9yQ2hhcnM6IC9eWyorXC0lPD4hPSZ8Xl0vLAogICAgZGF0ZVNRTDogc2V0KCJkYXRlIHRpbWUgdGltZXN0YW1wIiksCiAgICBzdXBwb3J0OiBzZXQoIk9EQkNkb3RUYWJsZSBkZWNpbWFsbGVzc0Zsb2F0IHplcm9sZXNzRmxvYXQgYmluYXJ5TnVtYmVyIGhleE51bWJlciBkb3VibGVRdW90ZSBuQ2hhckNhc3QgY2hhcnNldENhc3QgY29tbWVudEhhc2ggY29tbWVudFNwYWNlUmVxdWlyZWQiKSwKICAgIGhvb2tzOiB7CiAgICAgICJAIjogICBob29rVmFyLAogICAgICAiYCI6ICAgaG9va0lkZW50aWZpZXIsCiAgICAgICJcXCI6ICBob29rQ2xpZW50CiAgICB9CiAgfSk7CgogIC8vIHRoZSBxdWVyeSBsYW5ndWFnZSB1c2VkIGJ5IEFwYWNoZSBDYXNzYW5kcmEgaXMgY2FsbGVkIENRTCwgYnV0IHRoaXMgbWltZSB0eXBlCiAgLy8gaXMgY2FsbGVkIENhc3NhbmRyYSB0byBhdm9pZCBjb25mdXNpb24gd2l0aCBDb250ZXh0dWFsIFF1ZXJ5IExhbmd1YWdlCiAgQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtY2Fzc2FuZHJhIiwgewogICAgbmFtZTogInNxbCIsCiAgICBjbGllbnQ6IHsgfSwKICAgIGtleXdvcmRzOiBzZXQoInVzZSBzZWxlY3QgZnJvbSB1c2luZyBjb25zaXN0ZW5jeSB3aGVyZSBsaW1pdCBmaXJzdCByZXZlcnNlZCBmaXJzdCBhbmQgaW4gaW5zZXJ0IGludG8gdmFsdWVzIHVzaW5nIGNvbnNpc3RlbmN5IHR0bCB1cGRhdGUgc2V0IGRlbGV0ZSB0cnVuY2F0ZSBiZWdpbiBiYXRjaCBhcHBseSBjcmVhdGUga2V5c3BhY2Ugd2l0aCBjb2x1bW5mYW1pbHkgcHJpbWFyeSBrZXkgaW5kZXggb24gZHJvcCBhbHRlciB0eXBlIGFkZCBhbnkgb25lIHF1b3J1bSBhbGwgbG9jYWxfcXVvcnVtIGVhY2hfcXVvcnVtIiksCiAgICBidWlsdGluOiBzZXQoImFzY2lpIGJpZ2ludCBibG9iIGJvb2xlYW4gY291bnRlciBkZWNpbWFsIGRvdWJsZSBmbG9hdCBpbnQgdGV4dCB0aW1lc3RhbXAgdXVpZCB2YXJjaGFyIHZhcmludCIpLAogICAgYXRvbXM6IHNldCgiZmFsc2UgdHJ1ZSIpLAogICAgb3BlcmF0b3JDaGFyczogL15bPD49XS8sCiAgICBkYXRlU1FMOiB7IH0sCiAgICBzdXBwb3J0OiBzZXQoImNvbW1lbnRTbGFzaFNsYXNoIGRlY2ltYWxsZXNzRmxvYXQiKSwKICAgIGhvb2tzOiB7IH0KICB9KTsKCiAgLy8gdGhpcyBpcyBiYXNlZCBvbiBQZXRlciBSYWdhbml0c2NoJ3MgJ3Bsc3FsJyBtb2RlCiAgQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtcGxzcWwiLCB7CiAgICBuYW1lOiAgICAgICAic3FsIiwKICAgIGNsaWVudDogICAgIHNldCgiYXBwaW5mbyBhcnJheXNpemUgYXV0b2NvbW1pdCBhdXRvcHJpbnQgYXV0b3JlY292ZXJ5IGF1dG90cmFjZSBibG9ja3Rlcm1pbmF0b3IgYnJlYWsgYnRpdGxlIGNtZHNlcCBjb2xzZXAgY29tcGF0aWJpbGl0eSBjb21wdXRlIGNvbmNhdCBjb3B5Y29tbWl0IGNvcHl0eXBlY2hlY2sgZGVmaW5lIGRlc2NyaWJlIGVjaG8gZWRpdGZpbGUgZW1iZWRkZWQgZXNjYXBlIGV4ZWMgZXhlY3V0ZSBmZWVkYmFjayBmbGFnZ2VyIGZsdXNoIGhlYWRpbmcgaGVhZHNlcCBpbnN0YW5jZSBsaW5lc2l6ZSBsbm8gbG9ib2Zmc2V0IGxvZ3NvdXJjZSBsb25nIGxvbmdjaHVua3NpemUgbWFya3VwIG5hdGl2ZSBuZXdwYWdlIG51bWZvcm1hdCBudW13aWR0aCBwYWdlc2l6ZSBwYXVzZSBwbm8gcmVjc2VwIHJlY3NlcGNoYXIgcmVsZWFzZSByZXBmb290ZXIgcmVwaGVhZGVyIHNlcnZlcm91dHB1dCBzaGlmdGlub3V0IHNob3cgc2hvd21vZGUgc2l6ZSBzcG9vbCBzcWxibGFua2xpbmVzIHNxbGNhc2Ugc3FsY29kZSBzcWxjb250aW51ZSBzcWxudW1iZXIgc3FscGx1c2NvbXBhdGliaWxpdHkgc3FscHJlZml4IHNxbHByb21wdCBzcWx0ZXJtaW5hdG9yIHN1ZmZpeCB0YWIgdGVybSB0ZXJtb3V0IHRpbWUgdGltaW5nIHRyaW1vdXQgdHJpbXNwb29sIHR0aXRsZSB1bmRlcmxpbmUgdmVyaWZ5IHZlcnNpb24gd3JhcCIpLAogICAga2V5d29yZHM6ICAgc2V0KCJhYm9ydCBhY2NlcHQgYWNjZXNzIGFkZCBhbGwgYWx0ZXIgYW5kIGFueSBhcnJheSBhcnJheWxlbiBhcyBhc2MgYXNzZXJ0IGFzc2lnbiBhdCBhdHRyaWJ1dGVzIGF1ZGl0IGF1dGhvcml6YXRpb24gYXZnIGJhc2VfdGFibGUgYmVnaW4gYmV0d2VlbiBiaW5hcnlfaW50ZWdlciBib2R5IGJvb2xlYW4gYnkgY2FzZSBjYXN0IGNoYXIgY2hhcl9iYXNlIGNoZWNrIGNsb3NlIGNsdXN0ZXIgY2x1c3RlcnMgY29sYXV0aCBjb2x1bW4gY29tbWVudCBjb21taXQgY29tcHJlc3MgY29ubmVjdCBjb25uZWN0ZWQgY29uc3RhbnQgY29uc3RyYWludCBjcmFzaCBjcmVhdGUgY3VycmVudCBjdXJydmFsIGN1cnNvciBkYXRhX2Jhc2UgZGF0YWJhc2UgZGF0ZSBkYmEgZGVhbGxvY2F0ZSBkZWJ1Z29mZiBkZWJ1Z29uIGRlY2ltYWwgZGVjbGFyZSBkZWZhdWx0IGRlZmluaXRpb24gZGVsYXkgZGVsZXRlIGRlc2MgZGlnaXRzIGRpc3Bvc2UgZGlzdGluY3QgZG8gZHJvcCBlbHNlIGVsc2VpZiBlbHNpZiBlbmFibGUgZW5kIGVudHJ5IGVzY2FwZSBleGNlcHRpb24gZXhjZXB0aW9uX2luaXQgZXhjaGFuZ2UgZXhjbHVzaXZlIGV4aXN0cyBleGl0IGV4dGVybmFsIGZhc3QgZmV0Y2ggZmlsZSBmb3IgZm9yY2UgZm9ybSBmcm9tIGZ1bmN0aW9uIGdlbmVyaWMgZ290byBncmFudCBncm91cCBoYXZpbmcgaWRlbnRpZmllZCBpZiBpbW1lZGlhdGUgaW4gaW5jcmVtZW50IGluZGV4IGluZGV4ZXMgaW5kaWNhdG9yIGluaXRpYWwgaW5pdHJhbnMgaW5zZXJ0IGludGVyZmFjZSBpbnRlcnNlY3QgaW50byBpcyBrZXkgbGV2ZWwgbGlicmFyeSBsaWtlIGxpbWl0ZWQgbG9jYWwgbG9jayBsb2cgbG9nZ2luZyBsb25nIGxvb3AgbWFzdGVyIG1heGV4dGVudHMgbWF4dHJhbnMgbWVtYmVyIG1pbmV4dGVudHMgbWludXMgbWlzbGFiZWwgbW9kZSBtb2RpZnkgbXVsdGlzZXQgbmV3IG5leHQgbm8gbm9hdWRpdCBub2NvbXByZXNzIG5vbG9nZ2luZyBub3BhcmFsbGVsIG5vdCBub3dhaXQgbnVtYmVyX2Jhc2Ugb2JqZWN0IG9mIG9mZiBvZmZsaW5lIG9uIG9ubGluZSBvbmx5IG9wZW4gb3B0aW9uIG9yIG9yZGVyIG91dCBwYWNrYWdlIHBhcmFsbGVsIHBhcnRpdGlvbiBwY3RmcmVlIHBjdGluY3JlYXNlIHBjdHVzZWQgcGxzX2ludGVnZXIgcG9zaXRpdmUgcG9zaXRpdmVuIHByYWdtYSBwcmltYXJ5IHByaW9yIHByaXZhdGUgcHJpdmlsZWdlcyBwcm9jZWR1cmUgcHVibGljIHJhaXNlIHJhbmdlIHJhdyByZWFkIHJlYnVpbGQgcmVjb3JkIHJlZiByZWZlcmVuY2VzIHJlZnJlc2ggcmVsZWFzZSByZW5hbWUgcmVwbGFjZSByZXNvdXJjZSByZXN0cmljdCByZXR1cm4gcmV0dXJuaW5nIHJldHVybnMgcmV2ZXJzZSByZXZva2Ugcm9sbGJhY2sgcm93IHJvd2lkIHJvd2xhYmVsIHJvd251bSByb3dzIHJ1biBzYXZlcG9pbnQgc2NoZW1hIHNlZ21lbnQgc2VsZWN0IHNlcGFyYXRlIHNlc3Npb24gc2V0IHNoYXJlIHNuYXBzaG90IHNvbWUgc3BhY2Ugc3BsaXQgc3FsIHN0YXJ0IHN0YXRlbWVudCBzdG9yYWdlIHN1YnR5cGUgc3VjY2Vzc2Z1bCBzeW5vbnltIHRhYmF1dGggdGFibGUgdGFibGVzIHRhYmxlc3BhY2UgdGFzayB0ZXJtaW5hdGUgdGhlbiB0byB0cmlnZ2VyIHRydW5jYXRlIHR5cGUgdW5pb24gdW5pcXVlIHVubGltaXRlZCB1bnJlY292ZXJhYmxlIHVudXNhYmxlIHVwZGF0ZSB1c2UgdXNpbmcgdmFsaWRhdGUgdmFsdWUgdmFsdWVzIHZhcmlhYmxlIHZpZXcgdmlld3Mgd2hlbiB3aGVuZXZlciB3aGVyZSB3aGlsZSB3aXRoIHdvcmsiKSwKICAgIGJ1aWx0aW46ICAgIHNldCgiYWJzIGFjb3MgYWRkX21vbnRocyBhc2NpaSBhc2luIGF0YW4gYXRhbjIgYXZlcmFnZSBiZmlsZSBiZmlsZW5hbWUgYmlnc2VyaWFsIGJpdCBibG9iIGNlaWwgY2hhcmFjdGVyIGNoYXJ0b3Jvd2lkIGNociBjbG9iIGNvbmNhdCBjb252ZXJ0IGNvcyBjb3NoIGNvdW50IGRlYyBkZWNvZGUgZGVyZWYgZHVhbCBkdW1wIGR1cF92YWxfb25faW5kZXggZW1wdHkgZXJyb3IgZXhwIGZhbHNlIGZsb2F0IGZsb29yIGZvdW5kIGdsYiBncmVhdGVzdCBoZXh0b3JhdyBpbml0Y2FwIGluc3RyIGluc3RyYiBpbnQgaW50ZWdlciBpc29wZW4gbGFzdF9kYXkgbGVhc3QgbGVuZ2h0IGxlbmdodGIgbG4gbG93ZXIgbHBhZCBsdHJpbSBsdWIgbWFrZV9yZWYgbWF4IG1pbiBtbHNsYWJlbCBtb2QgbW9udGhzX2JldHdlZW4gbmF0dXJhbCBuYXR1cmFsbiBuY2hhciBuY2xvYiBuZXdfdGltZSBuZXh0X2RheSBuZXh0dmFsIG5sc19jaGFyc2V0X2RlY2xfbGVuIG5sc19jaGFyc2V0X2lkIG5sc19jaGFyc2V0X25hbWUgbmxzX2luaXRjYXAgbmxzX2xvd2VyIG5sc19zb3J0IG5sc191cHBlciBubHNzb3J0IG5vX2RhdGFfZm91bmQgbm90Zm91bmQgbnVsbCBudW1iZXIgbnVtZXJpYyBudmFyY2hhcjIgbnZsIG90aGVycyBwb3dlciByYXd0b2hleCByZWFsIHJlZnRvaGV4IHJvdW5kIHJvd2NvdW50IHJvd2lkdG9jaGFyIHJvd3R5cGUgcnBhZCBydHJpbSBzZXJpYWwgc2lnbiBzaWdudHlwZSBzaW4gc2luaCBzbWFsbGludCBzb3VuZGV4IHNxbGNvZGUgc3FsZXJybSBzcXJ0IHN0ZGRldiBzdHJpbmcgc3Vic3RyIHN1YnN0cmIgc3VtIHN5c2RhdGUgdGFuIHRhbmggdG9fY2hhciB0ZXh0IHRvX2RhdGUgdG9fbGFiZWwgdG9fbXVsdGlfYnl0ZSB0b19udW1iZXIgdG9fc2luZ2xlX2J5dGUgdHJhbnNsYXRlIHRydWUgdHJ1bmMgdWlkIHVubG9nZ2VkIHVwcGVyIHVzZXIgdXNlcmVudiB2YXJjaGFyIHZhcmNoYXIyIHZhcmlhbmNlIHZhcnlpbmcgdnNpemUgeG1sIiksCiAgICBvcGVyYXRvckNoYXJzOiAvXlsqK1wtJTw+IT1+XS8sCiAgICBkYXRlU1FMOiAgICBzZXQoImRhdGUgdGltZSB0aW1lc3RhbXAiKSwKICAgIHN1cHBvcnQ6ICAgIHNldCgiZG91YmxlUXVvdGUgbkNoYXJDYXN0IHplcm9sZXNzRmxvYXQgYmluYXJ5TnVtYmVyIGhleE51bWJlciIpCiAgfSk7CgogIC8vIENyZWF0ZWQgdG8gc3VwcG9ydCBzcGVjaWZpYyBoaXZlIGtleXdvcmRzCiAgQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtaGl2ZSIsIHsKICAgIG5hbWU6ICJzcWwiLAogICAga2V5d29yZHM6IHNldCgic2VsZWN0IGFsdGVyICRlbGVtJCAka2V5JCAkdmFsdWUkIGFkZCBhZnRlciBhbGwgYW5hbHl6ZSBhbmQgYXJjaGl2ZSBhcyBhc2MgYmVmb3JlIGJldHdlZW4gYmluYXJ5IGJvdGggYnVja2V0IGJ1Y2tldHMgYnkgY2FzY2FkZSBjYXNlIGNhc3QgY2hhbmdlIGNsdXN0ZXIgY2x1c3RlcmVkIGNsdXN0ZXJzdGF0dXMgY29sbGVjdGlvbiBjb2x1bW4gY29sdW1ucyBjb21tZW50IGNvbXB1dGUgY29uY2F0ZW5hdGUgY29udGludWUgY3JlYXRlIGNyb3NzIGN1cnNvciBkYXRhIGRhdGFiYXNlIGRhdGFiYXNlcyBkYnByb3BlcnRpZXMgZGVmZXJyZWQgZGVsZXRlIGRlbGltaXRlZCBkZXNjIGRlc2NyaWJlIGRpcmVjdG9yeSBkaXNhYmxlIGRpc3RpbmN0IGRpc3RyaWJ1dGUgZHJvcCBlbHNlIGVuYWJsZSBlbmQgZXNjYXBlZCBleGNsdXNpdmUgZXhpc3RzIGV4cGxhaW4gZXhwb3J0IGV4dGVuZGVkIGV4dGVybmFsIGZhbHNlIGZldGNoIGZpZWxkcyBmaWxlZm9ybWF0IGZpcnN0IGZvcm1hdCBmb3JtYXR0ZWQgZnJvbSBmdWxsIGZ1bmN0aW9uIGZ1bmN0aW9ucyBncmFudCBncm91cCBoYXZpbmcgaG9sZF9kZGx0aW1lIGlkeHByb3BlcnRpZXMgaWYgaW1wb3J0IGluIGluZGV4IGluZGV4ZXMgaW5wYXRoIGlucHV0ZHJpdmVyIGlucHV0Zm9ybWF0IGluc2VydCBpbnRlcnNlY3QgaW50byBpcyBpdGVtcyBqb2luIGtleXMgbGF0ZXJhbCBsZWZ0IGxpa2UgbGltaXQgbGluZXMgbG9hZCBsb2NhbCBsb2NhdGlvbiBsb2NrIGxvY2tzIG1hcGpvaW4gbWF0ZXJpYWxpemVkIG1pbnVzIG1zY2sgbm9fZHJvcCBub2NvbXByZXNzIG5vdCBvZiBvZmZsaW5lIG9uIG9wdGlvbiBvciBvcmRlciBvdXQgb3V0ZXIgb3V0cHV0ZHJpdmVyIG91dHB1dGZvcm1hdCBvdmVyd3JpdGUgcGFydGl0aW9uIHBhcnRpdGlvbmVkIHBhcnRpdGlvbnMgcGVyY2VudCBwbHVzIHByZXNlcnZlIHByb2NlZHVyZSBwdXJnZSByYW5nZSByY2ZpbGUgcmVhZCByZWFkb25seSByZWFkcyByZWJ1aWxkIHJlY29yZHJlYWRlciByZWNvcmR3cml0ZXIgcmVjb3ZlciByZWR1Y2UgcmVnZXhwIHJlbmFtZSByZXBhaXIgcmVwbGFjZSByZXN0cmljdCByZXZva2UgcmlnaHQgcmxpa2Ugcm93IHNjaGVtYSBzY2hlbWFzIHNlbWkgc2VxdWVuY2VmaWxlIHNlcmRlIHNlcmRlcHJvcGVydGllcyBzZXQgc2hhcmVkIHNob3cgc2hvd19kYXRhYmFzZSBzb3J0IHNvcnRlZCBzc2wgc3RhdGlzdGljcyBzdG9yZWQgc3RyZWFtdGFibGUgdGFibGUgdGFibGVzIHRhYmxlc2FtcGxlIHRibHByb3BlcnRpZXMgdGVtcG9yYXJ5IHRlcm1pbmF0ZWQgdGV4dGZpbGUgdGhlbiB0bXAgdG8gdG91Y2ggdHJhbnNmb3JtIHRyaWdnZXIgdHJ1ZSB1bmFyY2hpdmUgdW5kbyB1bmlvbiB1bmlxdWVqb2luIHVubG9jayB1cGRhdGUgdXNlIHVzaW5nIHV0YyB1dGNfdG1lc3RhbXAgdmlldyB3aGVuIHdoZXJlIHdoaWxlIHdpdGgiKSwKICAgIGJ1aWx0aW46IHNldCgiYm9vbCBib29sZWFuIGxvbmcgdGltZXN0YW1wIHRpbnlpbnQgc21hbGxpbnQgYmlnaW50IGludCBmbG9hdCBkb3VibGUgZGF0ZSBkYXRldGltZSB1bnNpZ25lZCBzdHJpbmcgYXJyYXkgc3RydWN0IG1hcCB1bmlvbnR5cGUiKSwKICAgIGF0b21zOiBzZXQoImZhbHNlIHRydWUgbnVsbCB1bmtub3duIiksCiAgICBvcGVyYXRvckNoYXJzOiAvXlsqK1wtJTw+IT1dLywKICAgIGRhdGVTUUw6IHNldCgiZGF0ZSB0aW1lc3RhbXAiKSwKICAgIHN1cHBvcnQ6IHNldCgiT0RCQ2RvdFRhYmxlIGRvdWJsZVF1b3RlIGJpbmFyeU51bWJlciBoZXhOdW1iZXIiKQogIH0pOwp9KCkpOwoKfSk7CgovKgogIEhvdyBQcm9wZXJ0aWVzIG9mIE1pbWUgVHlwZXMgYXJlIHVzZWQgYnkgU1FMIE1vZGUKICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgogIGtleXdvcmRzOgogICAgQSBsaXN0IG9mIGtleXdvcmRzIHlvdSB3YW50IHRvIGJlIGhpZ2hsaWdodGVkLgogIGZ1bmN0aW9uczoKICAgIEEgbGlzdCBvZiBmdW5jdGlvbiBuYW1lcyB5b3Ugd2FudCB0byBiZSBoaWdobGlnaHRlZC4KICBidWlsdGluOgogICAgQSBsaXN0IG9mIGJ1aWx0aW4gdHlwZXMgeW91IHdhbnQgdG8gYmUgaGlnaGxpZ2h0ZWQgKGlmIHlvdSB3YW50IHR5cGVzIHRvIGJlIG9mIGNsYXNzICJidWlsdGluIiBpbnN0ZWFkIG9mICJrZXl3b3JkIikuCiAgb3BlcmF0b3JDaGFyczoKICAgIEFsbCBjaGFyYWN0ZXJzIHRoYXQgbXVzdCBiZSBoYW5kbGVkIGFzIG9wZXJhdG9ycy4KICBjbGllbnQ6CiAgICBDb21tYW5kcyBwYXJzZWQgYW5kIGV4ZWN1dGVkIGJ5IHRoZSBjbGllbnQgKG5vdCB0aGUgc2VydmVyKS4KICBzdXBwb3J0OgogICAgQSBsaXN0IG9mIHN1cHBvcnRlZCBzeW50YXhlcyB3aGljaCBhcmUgbm90IGNvbW1vbiwgYnV0IGFyZSBzdXBwb3J0ZWQgYnkgbW9yZSB0aGFuIDEgREJNUy4KICAgICogT0RCQ2RvdFRhYmxlOiAudGFibGVOYW1lCiAgICAqIHplcm9sZXNzRmxvYXQ6IC4xCiAgICAqIGRvdWJsZVF1b3RlCiAgICAqIG5DaGFyQ2FzdDogTidzdHJpbmcnCiAgICAqIGNoYXJzZXRDYXN0OiBfdXRmOCdzdHJpbmcnCiAgICAqIGNvbW1lbnRIYXNoOiB1c2UgIyBjaGFyIGZvciBjb21tZW50cwogICAgKiBjb21tZW50U2xhc2hTbGFzaDogdXNlIC8vIGZvciBjb21tZW50cwogICAgKiBjb21tZW50U3BhY2VSZXF1aXJlZDogcmVxdWlyZSBhIHNwYWNlIGFmdGVyIC0tIGZvciBjb21tZW50cwogIGF0b21zOgogICAgS2V5d29yZHMgdGhhdCBtdXN0IGJlIGhpZ2hsaWdodGVkIGFzIGF0b21zLC4gU29tZSBEQk1TJ3Mgc3VwcG9ydCBtb3JlIGF0b21zIHRoYW4gb3RoZXJzOgogICAgVU5LTk9XTiwgSU5GSU5JVFksIFVOREVSRkxPVywgTmFOLi4uCiAgZGF0ZVNRTDoKICAgIFVzZWQgZm9yIGRhdGUvdGltZSBTUUwgc3RhbmRhcmQgc3ludGF4LCBiZWNhdXNlIG5vdCBhbGwgREJNUydzIHN1cHBvcnQgc2FtZSB0ZW1wb3JhbCB0eXBlcy4KKi8K]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/stex/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/stex/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogc1RlWCBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9InN0ZXguanMiPjwvc2NyaXB0Pgo8c3R5bGU+LkNvZGVNaXJyb3Ige2JhY2tncm91bmQ6ICNmOGY4Zjg7fTwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGltZyBpZD1sb2dvIHNyYz0iLi4vLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+TGFuZ3VhZ2UgbW9kZXM8L2E+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPnNUZVg8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPnNUZVggbW9kZTwvaDI+Cjxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+ClxiZWdpbnttb2R1bGV9W2lkPWJidC1zaXplXQpcaW1wb3J0bW9kdWxlW2JhbGFuY2VkLWJpbmFyeS10cmVlc117YmFsYW5jZWQtYmluYXJ5LXRyZWVzfQpcaW1wb3J0bW9kdWxlW1xLV0FSQ3NsaWRlc3tkbWF0aC9lbi9jYXJkaW5hbGl0eX1de2NhcmRpbmFsaXR5fQoKXGJlZ2lue2ZyYW1lfQogIFxmcmFtZXRpdGxle1NpemUgTGVtbWEgZm9yIEJhbGFuY2VkIFRyZWVzfQogIFxiZWdpbntpdGVtaXplfQogIFxpdGVtCiAgICBcYmVnaW57YXNzZXJ0aW9ufVtpZD1zaXplLWxlbW1hLHR5cGU9bGVtbWFdIAogICAgTGV0ICRHPVx0dXB7VixFfSQgYmUgYSBcdGVybXJlZltjZD1iaW5hcnktdHJlZXNde2JhbGFuY2VkIGJpbmFyeSB0cmVlfSAKICAgIG9mIFx0ZXJtcmVmW2NkPWdyYXBoLWRlcHRoLG5hbWU9dmVydGV4LWRlcHRoXXtkZXB0aH0kbj5pJCwgdGhlbiB0aGUgc2V0CiAgICAgJFxkZWZlcXtcbGl2YXJ7Vn1pfXtcc2V0c3R7XGluc2V0e3Z9e1Z9fXtcZ2RlcHRoe3Z9ID0gaX19JCBvZgogICAgXHRlcm1yZWZbY2Q9Z3JhcGhzLWludHJvLG5hbWU9bm9kZV17bm9kZXN9IGF0IAogICAgXHRlcm1yZWZbY2Q9Z3JhcGgtZGVwdGgsbmFtZT12ZXJ0ZXgtZGVwdGhde2RlcHRofSAkaSQgaGFzCiAgICBcdGVybXJlZltjZD1jYXJkaW5hbGl0eSxuYW1lPWNhcmRpbmFsaXR5XXtjYXJkaW5hbGl0eX0gJFxwb3dlcjJpJC4KICAgXGVuZHthc3NlcnRpb259CiAgXGl0ZW0KICAgIFxiZWdpbntzcHJvb2Z9W2lkPXNpemUtbGVtbWEtcGYscHJvb2ZlbmQ9LGZvcj1zaXplLWxlbW1hXXt2aWEgaW5kdWN0aW9uIG92ZXIgdGhlIGRlcHRoICRpJC59CiAgICAgIFxiZWdpbntzcGZjYXNlc317V2UgaGF2ZSB0byBjb25zaWRlciB0d28gY2FzZXN9CiAgICAgICAgXGJlZ2lue3NwZmNhc2V9eyRpPTAkfQogICAgICAgICAgXGJlZ2lue3NwZnN0ZXB9W2Rpc3BsYXk9Zmxvd10KICAgICAgICAgICAgdGhlbiAkXGxpdmFye1Z9aT1cc2V0e1xsaXZhcnt2fXJ9JCwgd2hlcmUgJFxsaXZhcnt2fXIkIGlzIHRoZSByb290LCBzbwogICAgICAgICAgICAkXGVxe1xjYXJke1xsaXZhcntWfTB9LFxjYXJke1xzZXR7XGxpdmFye3Z9cn19LDEsXHBvd2VyMjB9JC4KICAgICAgICAgIFxlbmR7c3Bmc3RlcH0KICAgICAgICBcZW5ke3NwZmNhc2V9CiAgICAgICAgXGJlZ2lue3NwZmNhc2V9eyRpPjAkfQogICAgICAgICAgXGJlZ2lue3NwZnN0ZXB9W2Rpc3BsYXk9Zmxvd10KICAgICAgICAgICB0aGVuICRcbGl2YXJ7Vn17aS0xfSQgY29udGFpbnMgJFxwb3dlcjJ7aS0xfSQgdmVydGV4ZXMgCiAgICAgICAgICAgXGJlZ2lue2p1c3RpZmljYXRpb259W21ldGhvZD1ieUlIXShJSClcZW5ke2p1c3RpZmljYXRpb259CiAgICAgICAgICBcZW5ke3NwZnN0ZXB9CiAgICAgICAgICBcYmVnaW57c3Bmc3RlcH0KICAgICAgICAgICBCeSB0aGUgXGJlZ2lue2p1c3RpZmljYXRpb259W21ldGhvZD1ieURlZl1kZWZpbml0aW9uIG9mIGEgYmluYXJ5CiAgICAgICAgICAgICAgdHJlZVxlbmR7anVzdGlmaWNhdGlvbn0sIGVhY2ggJFxpbnNldHt2fXtcbGl2YXJ7Vn17aS0xfX0kIGlzIGEgbGVhZiBvciBoYXMKICAgICAgICAgICAgdHdvIGNoaWxkcmVuIHRoYXQgYXJlIGF0IGRlcHRoICRpJC4KICAgICAgICAgIFxlbmR7c3Bmc3RlcH0KICAgICAgICAgIFxiZWdpbntzcGZzdGVwfQogICAgICAgICAgIEFzICRHJCBpcyBcdGVybXJlZltjZD1iYWxhbmNlZC1iaW5hcnktdHJlZXMsbmFtZT1iYWxhbmNlZC1iaW5hcnktdHJlZV17YmFsYW5jZWR9IGFuZCAkXGdkZXB0aHtHfT1uPmkkLCAkXGxpdmFye1Z9e2ktMX0kIGNhbm5vdCBjb250YWluCiAgICAgICAgICAgIGxlYXZlcy4KICAgICAgICAgIFxlbmR7c3Bmc3RlcH0KICAgICAgICAgIFxiZWdpbntzcGZzdGVwfVt0eXBlPWNvbmNsdXNpb25dCiAgICAgICAgICAgVGh1cyAkXGVxe1xjYXJke1xsaXZhcntWfWl9LHtcYXRpbWVzW2Nkb3RdezIsXGNhcmR7XGxpdmFye1Z9e2ktMX19fX0se1xhdGltZXNbY2RvdF17MixccG93ZXIye2ktMX19fSxccG93ZXIyaX0kLgogICAgICAgICAgXGVuZHtzcGZzdGVwfQogICAgICAgIFxlbmR7c3BmY2FzZX0KICAgICAgXGVuZHtzcGZjYXNlc30KICAgIFxlbmR7c3Byb29mfQogIFxpdGVtIAogICAgXGJlZ2lue2Fzc2VydGlvbn1baWQ9ZmJidCx0eXBlPWNvcm9sbGFyeV0JCiAgICAgIEEgZnVsbHkgYmFsYW5jZWQgdHJlZSBvZiBkZXB0aCAkZCQgaGFzICRccG93ZXIye2QrMX0tMSQgbm9kZXMuCiAgICBcZW5ke2Fzc2VydGlvbn0KICBcaXRlbQogICAgICBcYmVnaW57c3Byb29mfVtmb3I9ZmJidCxpZD1mYmJ0LXBmXXt9CiAgICAgICAgXGJlZ2lue3NwZnN0ZXB9CiAgICAgICAgICBMZXQgJFxkZWZlcXtHfXtcdHVwe1YsRX19JCBiZSBhIGZ1bGx5IGJhbGFuY2VkIHRyZWUKICAgICAgICBcZW5ke3NwZnN0ZXB9CiAgICAgICAgXGJlZ2lue3NwZnN0ZXB9CiAgICAgICAgICBUaGVuICRcY2FyZHtWfT1cU3VtZnJvbXRve2l9MWR7XHBvd2VyMml9PSBccG93ZXIye2QrMX0tMSQuCiAgICAgICAgXGVuZHtzcGZzdGVwfQogICAgICBcZW5ke3Nwcm9vZn0KICAgIFxlbmR7aXRlbWl6ZX0KICBcZW5ke2ZyYW1lfQpcYmVnaW57bm90ZX0KICBcYmVnaW57b210ZXh0fVt0eXBlPWNvbmNsdXNpb24sZm9yPWJpbmFyeS10cmVlXQogICAgVGhpcyBzaG93cyB0aGF0IGJhbGFuY2VkIGJpbmFyeSB0cmVlcyBncm93IGluIGJyZWFkdGggdmVyeSBxdWlja2x5LCBhIGNvbnNlcXVlbmNlIG9mCiAgICB0aGlzIGlzIHRoYXQgdGhleSBhcmUgdmVyeSBzaGFsbG93IChhbmQgdGhpcyBjb21wdXRlIHZlcnkgZmFzdCksIHdoaWNoIGlzIHRoZSBlc3NlbmNlIG9mCiAgICB0aGUgbmV4dCByZXN1bHQuCiAgXGVuZHtvbXRleHR9ClxlbmR7bm90ZX0KXGVuZHttb2R1bGV9CgolJSUgTG9jYWwgVmFyaWFibGVzOiAKJSUlIG1vZGU6IExhVGVYCiUlJSBUZVgtbWFzdGVyOiAiYWxsIgolJSUgRW5kOiBcZW5ke2RvY3VtZW50fQo8L3RleHRhcmVhPjwvZm9ybT4KICAgIDxzY3JpcHQ+CiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7fSk7CiAgICA8L3NjcmlwdD4KCiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC94LXN0ZXg8L2NvZGU+LjwvcD4KCiAgICA8cD48c3Ryb25nPlBhcnNpbmcvSGlnaGxpZ2h0aW5nIFRlc3RzOjwvc3Ryb25nPiA8YSBocmVmPSIuLi8uLi90ZXN0L2luZGV4Lmh0bWwjc3RleF8qIj5ub3JtYWw8L2E+LCAgPGEgaHJlZj0iLi4vLi4vdGVzdC9pbmRleC5odG1sI3ZlcmJvc2Usc3RleF8qIj52ZXJib3NlPC9hPi48L3A+CgogIDwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/stex/stex.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovKgogKiBBdXRob3I6IENvbnN0YW50aW4gSnVjb3ZzY2hpIChjLmp1Y292c2NoaUBqYWNvYnMtdW5pdmVyc2l0eS5kZSkKICogTGljZW5jZTogTUlUCiAqLwoKKGZ1bmN0aW9uKG1vZCkgewogIGlmICh0eXBlb2YgZXhwb3J0cyA9PSAib2JqZWN0IiAmJiB0eXBlb2YgbW9kdWxlID09ICJvYmplY3QiKSAvLyBDb21tb25KUwogICAgbW9kKHJlcXVpcmUoIi4uLy4uL2xpYi9jb2RlbWlycm9yIikpOwogIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kKSAvLyBBTUQKICAgIGRlZmluZShbIi4uLy4uL2xpYi9jb2RlbWlycm9yIl0sIG1vZCk7CiAgZWxzZSAvLyBQbGFpbiBicm93c2VyIGVudgogICAgbW9kKENvZGVNaXJyb3IpOwp9KShmdW5jdGlvbihDb2RlTWlycm9yKSB7CiJ1c2Ugc3RyaWN0IjsKCkNvZGVNaXJyb3IuZGVmaW5lTW9kZSgic3RleCIsIGZ1bmN0aW9uKCkgewogICAgInVzZSBzdHJpY3QiOwoKICAgIGZ1bmN0aW9uIHB1c2hDb21tYW5kKHN0YXRlLCBjb21tYW5kKSB7CiAgICAgICAgc3RhdGUuY21kU3RhdGUucHVzaChjb21tYW5kKTsKICAgIH0KCiAgICBmdW5jdGlvbiBwZWVrQ29tbWFuZChzdGF0ZSkgewogICAgICAgIGlmIChzdGF0ZS5jbWRTdGF0ZS5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIHJldHVybiBzdGF0ZS5jbWRTdGF0ZVtzdGF0ZS5jbWRTdGF0ZS5sZW5ndGggLSAxXTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gcG9wQ29tbWFuZChzdGF0ZSkgewogICAgICAgIHZhciBwbHVnID0gc3RhdGUuY21kU3RhdGUucG9wKCk7CiAgICAgICAgaWYgKHBsdWcpIHsKICAgICAgICAgICAgcGx1Zy5jbG9zZUJyYWNrZXQoKTsKICAgICAgICB9CiAgICB9CgogICAgLy8gcmV0dXJucyB0aGUgbm9uLWRlZmF1bHQgcGx1Z2luIGNsb3Nlc3QgdG8gdGhlIGVuZCBvZiB0aGUgbGlzdAogICAgZnVuY3Rpb24gZ2V0TW9zdFBvd2VyZnVsKHN0YXRlKSB7CiAgICAgICAgdmFyIGNvbnRleHQgPSBzdGF0ZS5jbWRTdGF0ZTsKICAgICAgICBmb3IgKHZhciBpID0gY29udGV4dC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewogICAgICAgICAgICB2YXIgcGx1ZyA9IGNvbnRleHRbaV07CiAgICAgICAgICAgIGlmIChwbHVnLm5hbWUgPT0gIkRFRkFVTFQiKSB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcGx1ZzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsgc3R5bGVJZGVudGlmaWVyOiBmdW5jdGlvbigpIHsgcmV0dXJuIG51bGw7IH0gfTsKICAgIH0KCiAgICBmdW5jdGlvbiBhZGRQbHVnaW5QYXR0ZXJuKHBsdWdpbk5hbWUsIGNtZFN0eWxlLCBzdHlsZXMpIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLm5hbWUgPSBwbHVnaW5OYW1lOwogICAgICAgICAgICB0aGlzLmJyYWNrZXRObyA9IDA7CiAgICAgICAgICAgIHRoaXMuc3R5bGUgPSBjbWRTdHlsZTsKICAgICAgICAgICAgdGhpcy5zdHlsZXMgPSBzdHlsZXM7CiAgICAgICAgICAgIHRoaXMuYXJndW1lbnQgPSBudWxsOyAgIC8vIFxiZWdpbiBhbmQgXGVuZCBoYXZlIGFyZ3VtZW50cyB0aGF0IGZvbGxvdy4gVGhlc2UgYXJlIHN0b3JlZCBpbiB0aGUgcGx1Z2luCgogICAgICAgICAgICB0aGlzLnN0eWxlSWRlbnRpZmllciA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGVzW3RoaXMuYnJhY2tldE5vIC0gMV0gfHwgbnVsbDsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdGhpcy5vcGVuQnJhY2tldCA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgdGhpcy5icmFja2V0Tm8rKzsKICAgICAgICAgICAgICAgIHJldHVybiAiYnJhY2tldCI7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHRoaXMuY2xvc2VCcmFja2V0ID0gZnVuY3Rpb24oKSB7fTsKICAgICAgICB9OwogICAgfQoKICAgIHZhciBwbHVnaW5zID0ge307CgogICAgcGx1Z2luc1siaW1wb3J0bW9kdWxlIl0gPSBhZGRQbHVnaW5QYXR0ZXJuKCJpbXBvcnRtb2R1bGUiLCAidGFnIiwgWyJzdHJpbmciLCAiYnVpbHRpbiJdKTsKICAgIHBsdWdpbnNbImRvY3VtZW50Y2xhc3MiXSA9IGFkZFBsdWdpblBhdHRlcm4oImRvY3VtZW50Y2xhc3MiLCAidGFnIiwgWyIiLCAiYXRvbSJdKTsKICAgIHBsdWdpbnNbInVzZXBhY2thZ2UiXSA9IGFkZFBsdWdpblBhdHRlcm4oInVzZXBhY2thZ2UiLCAidGFnIiwgWyJhdG9tIl0pOwogICAgcGx1Z2luc1siYmVnaW4iXSA9IGFkZFBsdWdpblBhdHRlcm4oImJlZ2luIiwgInRhZyIsIFsiYXRvbSJdKTsKICAgIHBsdWdpbnNbImVuZCJdID0gYWRkUGx1Z2luUGF0dGVybigiZW5kIiwgInRhZyIsIFsiYXRvbSJdKTsKCiAgICBwbHVnaW5zWyJERUZBVUxUIl0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgdGhpcy5uYW1lID0gIkRFRkFVTFQiOwogICAgICAgIHRoaXMuc3R5bGUgPSAidGFnIjsKCiAgICAgICAgdGhpcy5zdHlsZUlkZW50aWZpZXIgPSB0aGlzLm9wZW5CcmFja2V0ID0gdGhpcy5jbG9zZUJyYWNrZXQgPSBmdW5jdGlvbigpIHt9OwogICAgfTsKCiAgICBmdW5jdGlvbiBzZXRTdGF0ZShzdGF0ZSwgZikgewogICAgICAgIHN0YXRlLmYgPSBmOwogICAgfQoKICAgIC8vIGNhbGxlZCB3aGVuIGluIGEgbm9ybWFsIChubyBlbnZpcm9ubWVudCkgY29udGV4dAogICAgZnVuY3Rpb24gbm9ybWFsKHNvdXJjZSwgc3RhdGUpIHsKICAgICAgICB2YXIgcGx1ZzsKICAgICAgICAvLyBEbyB3ZSBsb29rIGxpa2UgJ1xjb21tYW5kJyA/ICBJZiBzbywgYXR0ZW1wdCB0byBhcHBseSB0aGUgcGx1Z2luICdjb21tYW5kJwogICAgICAgIGlmIChzb3VyY2UubWF0Y2goL15cXFthLXpBLVpAXSsvKSkgewogICAgICAgICAgICB2YXIgY21kTmFtZSA9IHNvdXJjZS5jdXJyZW50KCkuc2xpY2UoMSk7CiAgICAgICAgICAgIHBsdWcgPSBwbHVnaW5zW2NtZE5hbWVdIHx8IHBsdWdpbnNbIkRFRkFVTFQiXTsKICAgICAgICAgICAgcGx1ZyA9IG5ldyBwbHVnKCk7CiAgICAgICAgICAgIHB1c2hDb21tYW5kKHN0YXRlLCBwbHVnKTsKICAgICAgICAgICAgc2V0U3RhdGUoc3RhdGUsIGJlZ2luUGFyYW1zKTsKICAgICAgICAgICAgcmV0dXJuIHBsdWcuc3R5bGU7CiAgICAgICAgfQoKICAgICAgICAvLyBlc2NhcGUgY2hhcmFjdGVycwogICAgICAgIGlmIChzb3VyY2UubWF0Y2goL15cXFskJiUje31fXS8pKSB7CiAgICAgICAgICByZXR1cm4gInRhZyI7CiAgICAgICAgfQoKICAgICAgICAvLyB3aGl0ZSBzcGFjZSBjb250cm9sIGNoYXJhY3RlcnMKICAgICAgICBpZiAoc291cmNlLm1hdGNoKC9eXFxbLDshXC9cXF0vKSkgewogICAgICAgICAgcmV0dXJuICJ0YWciOwogICAgICAgIH0KCiAgICAgICAgLy8gZmluZCBpZiB3ZSdyZSBzdGFydGluZyB2YXJpb3VzIG1hdGggbW9kZXMKICAgICAgICBpZiAoc291cmNlLm1hdGNoKCJcXFsiKSkgewogICAgICAgICAgICBzZXRTdGF0ZShzdGF0ZSwgZnVuY3Rpb24oc291cmNlLCBzdGF0ZSl7IHJldHVybiBpbk1hdGhNb2RlKHNvdXJjZSwgc3RhdGUsICJcXF0iKTsgfSk7CiAgICAgICAgICAgIHJldHVybiAia2V5d29yZCI7CiAgICAgICAgfQogICAgICAgIGlmIChzb3VyY2UubWF0Y2goIiQkIikpIHsKICAgICAgICAgICAgc2V0U3RhdGUoc3RhdGUsIGZ1bmN0aW9uKHNvdXJjZSwgc3RhdGUpeyByZXR1cm4gaW5NYXRoTW9kZShzb3VyY2UsIHN0YXRlLCAiJCQiKTsgfSk7CiAgICAgICAgICAgIHJldHVybiAia2V5d29yZCI7CiAgICAgICAgfQogICAgICAgIGlmIChzb3VyY2UubWF0Y2goIiQiKSkgewogICAgICAgICAgICBzZXRTdGF0ZShzdGF0ZSwgZnVuY3Rpb24oc291cmNlLCBzdGF0ZSl7IHJldHVybiBpbk1hdGhNb2RlKHNvdXJjZSwgc3RhdGUsICIkIik7IH0pOwogICAgICAgICAgICByZXR1cm4gImtleXdvcmQiOwogICAgICAgIH0KCiAgICAgICAgdmFyIGNoID0gc291cmNlLm5leHQoKTsKICAgICAgICBpZiAoY2ggPT0gIiUiKSB7CiAgICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZTogJSBhdCBlbmQgb2YgaXRzIG93biBsaW5lOyBzdGF5IGluIHNhbWUgc3RhdGUKICAgICAgICAgICAgaWYgKCFzb3VyY2UuZW9sKCkpIHsKICAgICAgICAgICAgICBzZXRTdGF0ZShzdGF0ZSwgaW5DQ29tbWVudCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICJjb21tZW50IjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoY2ggPT0gJ30nIHx8IGNoID09ICddJykgewogICAgICAgICAgICBwbHVnID0gcGVla0NvbW1hbmQoc3RhdGUpOwogICAgICAgICAgICBpZiAocGx1ZykgewogICAgICAgICAgICAgICAgcGx1Zy5jbG9zZUJyYWNrZXQoY2gpOwogICAgICAgICAgICAgICAgc2V0U3RhdGUoc3RhdGUsIGJlZ2luUGFyYW1zKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiAiZXJyb3IiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAiYnJhY2tldCI7CiAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAneycgfHwgY2ggPT0gJ1snKSB7CiAgICAgICAgICAgIHBsdWcgPSBwbHVnaW5zWyJERUZBVUxUIl07CiAgICAgICAgICAgIHBsdWcgPSBuZXcgcGx1ZygpOwogICAgICAgICAgICBwdXNoQ29tbWFuZChzdGF0ZSwgcGx1Zyk7CiAgICAgICAgICAgIHJldHVybiAiYnJhY2tldCI7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKC9cZC8udGVzdChjaCkpIHsKICAgICAgICAgICAgc291cmNlLmVhdFdoaWxlKC9bXHcuJV0vKTsKICAgICAgICAgICAgcmV0dXJuICJhdG9tIjsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHNvdXJjZS5lYXRXaGlsZSgvW1x3XC1fXS8pOwogICAgICAgICAgICBwbHVnID0gZ2V0TW9zdFBvd2VyZnVsKHN0YXRlKTsKICAgICAgICAgICAgaWYgKHBsdWcubmFtZSA9PSAnYmVnaW4nKSB7CiAgICAgICAgICAgICAgICBwbHVnLmFyZ3VtZW50ID0gc291cmNlLmN1cnJlbnQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcGx1Zy5zdHlsZUlkZW50aWZpZXIoKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gaW5DQ29tbWVudChzb3VyY2UsIHN0YXRlKSB7CiAgICAgICAgc291cmNlLnNraXBUb0VuZCgpOwogICAgICAgIHNldFN0YXRlKHN0YXRlLCBub3JtYWwpOwogICAgICAgIHJldHVybiAiY29tbWVudCI7CiAgICB9CgogICAgZnVuY3Rpb24gaW5NYXRoTW9kZShzb3VyY2UsIHN0YXRlLCBlbmRNb2RlU2VxKSB7CiAgICAgICAgaWYgKHNvdXJjZS5lYXRTcGFjZSgpKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBpZiAoc291cmNlLm1hdGNoKGVuZE1vZGVTZXEpKSB7CiAgICAgICAgICAgIHNldFN0YXRlKHN0YXRlLCBub3JtYWwpOwogICAgICAgICAgICByZXR1cm4gImtleXdvcmQiOwogICAgICAgIH0KICAgICAgICBpZiAoc291cmNlLm1hdGNoKC9eXFxbYS16QS1aQF0rLykpIHsKICAgICAgICAgICAgcmV0dXJuICJ0YWciOwogICAgICAgIH0KICAgICAgICBpZiAoc291cmNlLm1hdGNoKC9eW2EtekEtWl0rLykpIHsKICAgICAgICAgICAgcmV0dXJuICJ2YXJpYWJsZS0yIjsKICAgICAgICB9CiAgICAgICAgLy8gZXNjYXBlIGNoYXJhY3RlcnMKICAgICAgICBpZiAoc291cmNlLm1hdGNoKC9eXFxbJCYlI3t9X10vKSkgewogICAgICAgICAgcmV0dXJuICJ0YWciOwogICAgICAgIH0KICAgICAgICAvLyB3aGl0ZSBzcGFjZSBjb250cm9sIGNoYXJhY3RlcnMKICAgICAgICBpZiAoc291cmNlLm1hdGNoKC9eXFxbLDshXC9dLykpIHsKICAgICAgICAgIHJldHVybiAidGFnIjsKICAgICAgICB9CiAgICAgICAgLy8gc3BlY2lhbCBtYXRoLW1vZGUgY2hhcmFjdGVycwogICAgICAgIGlmIChzb3VyY2UubWF0Y2goL15bXF5fJl0vKSkgewogICAgICAgICAgcmV0dXJuICJ0YWciOwogICAgICAgIH0KICAgICAgICAvLyBub24tc3BlY2lhbCBjaGFyYWN0ZXJzCiAgICAgICAgaWYgKHNvdXJjZS5tYXRjaCgvXlsrXC08Pnw9LFwvQCEqOjsnImB+Iz9dLykpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIGlmIChzb3VyY2UubWF0Y2goL14oXGQrXC5cZCp8XGQqXC5cZCt8XGQrKS8pKSB7CiAgICAgICAgICByZXR1cm4gIm51bWJlciI7CiAgICAgICAgfQogICAgICAgIHZhciBjaCA9IHNvdXJjZS5uZXh0KCk7CiAgICAgICAgaWYgKGNoID09ICJ7IiB8fCBjaCA9PSAifSIgfHwgY2ggPT0gIlsiIHx8IGNoID09ICJdIiB8fCBjaCA9PSAiKCIgfHwgY2ggPT0gIikiKSB7CiAgICAgICAgICAgIHJldHVybiAiYnJhY2tldCI7CiAgICAgICAgfQoKICAgICAgICAvLyBlYXQgY29tbWVudHMgaGVyZSwgYmVjYXVzZSBpbkNDb21tZW50IHJldHVybnMgdXMgdG8gbm9ybWFsIHN0YXRlIQogICAgICAgIGlmIChjaCA9PSAiJSIpIHsKICAgICAgICAgICAgaWYgKCFzb3VyY2UuZW9sKCkpIHsKICAgICAgICAgICAgICAgIHNvdXJjZS5za2lwVG9FbmQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gImNvbW1lbnQiOwogICAgICAgIH0KICAgICAgICByZXR1cm4gImVycm9yIjsKICAgIH0KCiAgICBmdW5jdGlvbiBiZWdpblBhcmFtcyhzb3VyY2UsIHN0YXRlKSB7CiAgICAgICAgdmFyIGNoID0gc291cmNlLnBlZWsoKSwgbGFzdFBsdWc7CiAgICAgICAgaWYgKGNoID09ICd7JyB8fCBjaCA9PSAnWycpIHsKICAgICAgICAgICAgbGFzdFBsdWcgPSBwZWVrQ29tbWFuZChzdGF0ZSk7CiAgICAgICAgICAgIGxhc3RQbHVnLm9wZW5CcmFja2V0KGNoKTsKICAgICAgICAgICAgc291cmNlLmVhdChjaCk7CiAgICAgICAgICAgIHNldFN0YXRlKHN0YXRlLCBub3JtYWwpOwogICAgICAgICAgICByZXR1cm4gImJyYWNrZXQiOwogICAgICAgIH0KICAgICAgICBpZiAoL1sgXHRccl0vLnRlc3QoY2gpKSB7CiAgICAgICAgICAgIHNvdXJjZS5lYXQoY2gpOwogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgc2V0U3RhdGUoc3RhdGUsIG5vcm1hbCk7CiAgICAgICAgcG9wQ29tbWFuZChzdGF0ZSk7CgogICAgICAgIHJldHVybiBub3JtYWwoc291cmNlLCBzdGF0ZSk7CiAgICB9CgogICAgcmV0dXJuIHsKICAgICAgICBzdGFydFN0YXRlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGNtZFN0YXRlOiBbXSwKICAgICAgICAgICAgICAgIGY6IG5vcm1hbAogICAgICAgICAgICB9OwogICAgICAgIH0sCiAgICAgICAgY29weVN0YXRlOiBmdW5jdGlvbihzKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBjbWRTdGF0ZTogcy5jbWRTdGF0ZS5zbGljZSgpLAogICAgICAgICAgICAgICAgZjogcy5mCiAgICAgICAgICAgIH07CiAgICAgICAgfSwKICAgICAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICAgICAgICByZXR1cm4gc3RhdGUuZihzdHJlYW0sIHN0YXRlKTsKICAgICAgICB9CiAgICB9Owp9KTsKCkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC94LXN0ZXgiLCAic3RleCIpOwpDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveC1sYXRleCIsICJzdGV4Iik7Cgp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/stex/test.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24oKSB7CiAgdmFyIG1vZGUgPSBDb2RlTWlycm9yLmdldE1vZGUoe3RhYlNpemU6IDR9LCAic3RleCIpOwogIGZ1bmN0aW9uIE1UKG5hbWUpIHsgdGVzdC5tb2RlKG5hbWUsIG1vZGUsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpOyB9CgogIE1UKCJ3b3JkIiwKICAgICAiZm9vIik7CgogIE1UKCJ0d29Xb3JkcyIsCiAgICAgImZvbyBiYXIiKTsKCiAgTVQoImJlZ2luRW5kRG9jdW1lbnQiLAogICAgICJbdGFnIFxcYmVnaW5dW2JyYWNrZXQge11bYXRvbSBkb2N1bWVudF1bYnJhY2tldCB9XSIsCiAgICAgIlt0YWcgXFxlbmRdW2JyYWNrZXQge11bYXRvbSBkb2N1bWVudF1bYnJhY2tldCB9XSIpOwoKICBNVCgiYmVnaW5FbmRFcXVhdGlvbiIsCiAgICAgIlt0YWcgXFxiZWdpbl1bYnJhY2tldCB7XVthdG9tIGVxdWF0aW9uXVticmFja2V0IH1dIiwKICAgICAiICBFPW1jXjIiLAogICAgICJbdGFnIFxcZW5kXVticmFja2V0IHtdW2F0b20gZXF1YXRpb25dW2JyYWNrZXQgfV0iKTsKCiAgTVQoImJlZ2luTW9kdWxlIiwKICAgICAiW3RhZyBcXGJlZ2luXVticmFja2V0IHtdW2F0b20gbW9kdWxlXVticmFja2V0IH1bW11dXSIpOwoKICBNVCgiYmVnaW5Nb2R1bGVJZCIsCiAgICAgIlt0YWcgXFxiZWdpbl1bYnJhY2tldCB7XVthdG9tIG1vZHVsZV1bYnJhY2tldCB9W1tdaWQ9YmJ0LXNpemVbYnJhY2tldCBdXV0iKTsKCiAgTVQoImltcG9ydE1vZHVsZSIsCiAgICAgIlt0YWcgXFxpbXBvcnRtb2R1bGVdW2JyYWNrZXQgW1tdW3N0cmluZyBiLWItdF1bYnJhY2tldCBdXXtdW2J1aWx0aW4gYi1iLXRdW2JyYWNrZXQgfV0iKTsKCiAgTVQoImltcG9ydE1vZHVsZVBhdGgiLAogICAgICJbdGFnIFxcaW1wb3J0bW9kdWxlXVticmFja2V0IFtbXVt0YWcgXFxLV0FSQ3NsaWRlc11bYnJhY2tldCB7XVtzdHJpbmcgZG1hdGgvZW4vY2FyZGluYWxpdHldW2JyYWNrZXQgfV1de11bYnVpbHRpbiBjYXJkXVticmFja2V0IH1dIik7CgogIE1UKCJwc0ZvclBERiIsCiAgICAgIlt0YWcgXFxQU2ZvclBERl1bYnJhY2tldCBbW11bYXRvbSAxXVticmFja2V0IF1de10jMVticmFja2V0IH1dIik7CgogIE1UKCJjb21tZW50IiwKICAgICAiW2NvbW1lbnQgJSBmb29dIik7CgogIE1UKCJ0YWdDb21tZW50IiwKICAgICAiW3RhZyBcXGl0ZW1dW2NvbW1lbnQgJSBiYXJdIik7CgogIE1UKCJjb21tZW50VGFnIiwKICAgICAiIFtjb21tZW50ICUgXFxpdGVtXSIpOwoKICBNVCgiY29tbWVudExpbmVCcmVhayIsCiAgICAgIltjb21tZW50ICVdIiwKICAgICAiZm9vIik7CgogIE1UKCJ0YWdFcnJvckN1cmx5IiwKICAgICAiW3RhZyBcXGJlZ2luXVtlcnJvciB9XVticmFja2V0IHtdIik7CgogIE1UKCJ0YWdFcnJvclNxdWFyZSIsCiAgICAgIlt0YWcgXFxpdGVtXVtlcnJvciBdXV1bYnJhY2tldCB7XSIpOwoKICBNVCgiY29tbWVudEN1cmx5IiwKICAgICAiW2NvbW1lbnQgJSB9XSIpOwoKICBNVCgidGFnSGFzaCIsCiAgICAgInRoZSBbdGFnIFxcI10ga2V5Iik7CgogIE1UKCJ0YWdOdW1iZXIiLAogICAgICJhIFt0YWcgXFwkXVthdG9tIDVdIHN0ZXRzb24iKTsKCiAgTVQoInRhZ1BlcmNlbnQiLAogICAgICJbYXRvbSAxMDBdW3RhZyBcXCVdIGJlZWYiKTsKCiAgTVQoInRhZ0FtcGVyc2FuZCIsCiAgICAgIkwgW3RhZyBcXCZdIE4iKTsKCiAgTVQoInRhZ1VuZGVyc2NvcmUiLAogICAgICJmb29bdGFnIFxcX11iYXIiKTsKCiAgTVQoInRhZ0JyYWNrZXRPcGVuIiwKICAgICAiW3RhZyBcXGVtcGhdW2JyYWNrZXQge11bdGFnIFxce11bYnJhY2tldCB9XSIpOwoKICBNVCgidGFnQnJhY2tldENsb3NlIiwKICAgICAiW3RhZyBcXGVtcGhdW2JyYWNrZXQge11bdGFnIFxcfV1bYnJhY2tldCB9XSIpOwoKICBNVCgidGFnTGV0dGVyTnVtYmVyIiwKICAgICAic2VjdGlvbiBbdGFnIFxcU11bYXRvbSAxXSIpOwoKICBNVCgidGV4dFRhZ051bWJlciIsCiAgICAgInBhcmEgW3RhZyBcXFBdW2F0b20gMl0iKTsKCiAgTVQoInRoaW5zcGFjZSIsCiAgICAgInhbdGFnIFxcLF15Iik7CgogIE1UKCJ0aGlja3NwYWNlIiwKICAgICAieFt0YWcgXFw7XXkiKTsKCiAgTVQoIm5lZ2F0aXZlVGhpbnNwYWNlIiwKICAgICAieFt0YWcgXFwhXXkiKTsKCiAgTVQoInBlcmlvZE5vdFNlbnRlbmNlIiwKICAgICAiSi5cXCBMLlxcIGlzIik7CgogIE1UKCJwZXJpb2RTZW50ZW5jZSIsCiAgICAgIlhbdGFnIFxcQF0uIFRoZSIpOwoKICBNVCgiaXRhbGljQ29ycmVjdGlvbiIsCiAgICAgIlticmFja2V0IHtdW3RhZyBcXGVtXSBJZlt0YWcgXFwvXVticmFja2V0IH1dIEkiKTsKCiAgTVQoInRhZ0JyYWNrZXQiLAogICAgICJbdGFnIFxcbmV3Y29tbWFuZF1bYnJhY2tldCB7XVt0YWcgXFxwb3BdW2JyYWNrZXQgfV0iKTsKCiAgTVQoImlubGluZU1hdGhUYWdGb2xsb3dlZEJ5TnVtYmVyIiwKICAgICAiW2tleXdvcmQgJF1bdGFnIFxccGldW251bWJlciAyXVtrZXl3b3JkICRdIik7CgogIE1UKCJpbmxpbmVNYXRoIiwKICAgICAiW2tleXdvcmQgJF1bbnVtYmVyIDNdW3ZhcmlhYmxlLTIgeF1bdGFnIF5dW251bWJlciAyLjQ1XS1bdGFnIFxcc3FydF1bYnJhY2tldCB7XVt0YWcgXFwkXFxhbHBoYV1bYnJhY2tldCB9XSA9IFtudW1iZXIgMl1ba2V5d29yZCAkXSBvdGhlciB0ZXh0Iik7CgogIE1UKCJkaXNwbGF5TWF0aCIsCiAgICAgIk1vcmUgW2tleXdvcmQgJCRdXHRbdmFyaWFibGUtMiBTXVt0YWcgXl1bdmFyaWFibGUtMiBuXVt0YWcgXFxzdW1dIFt2YXJpYWJsZS0yIGldW2tleXdvcmQgJCRdIG90aGVyIHRleHQiKTsKCiAgTVQoIm1hdGhXaXRoQ29tbWVudCIsCiAgICAgIltrZXl3b3JkICRdW3ZhcmlhYmxlLTIgeF0gW2NvbW1lbnQgJSAkXSIsCiAgICAgIlt2YXJpYWJsZS0yIHldW2tleXdvcmQgJF0gb3RoZXIgdGV4dCIpOwoKICBNVCgibGluZUJyZWFrQXJndW1lbnQiLAogICAgIlt0YWcgXFxcXF1bYnJhY2tldCBbW11bYXRvbSAxY21dW2JyYWNrZXQgXV1dIik7Cn0pKCk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/tcl/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/tcl/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogVGNsIG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL3RoZW1lL25pZ2h0LmNzcyI+CjxzY3JpcHQgc3JjPSIuLi8uLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJ0Y2wuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vLi4vYWRkb24vc2Nyb2xsL3Njcm9sbHBhc3RlbmQuanMiPjwvc2NyaXB0Pgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5UY2w8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPlRjbCBtb2RlPC9oMj4KPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIyAgIyMgICAgIHdob2lzLnRjbCBmb3IgZWdnZHJvcCBieSBGb3JkX0xhd25tb3dlciBpcmMuZ2Vla3NoZWQubmV0ICNTY3JpcHQtSGVscCAgICAgICAgIyMgICMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMgVG8gdXNlIHRoaXMgc2NyaXB0IHlvdSBtdXN0IHNldCBjaGFubmVsIGZsYWcgK3dob2lzIChpZSAuY2hhbnNldCAjY2hhbiArd2hvaXMpICAgICAgICAgICAjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjICAgICAgX19fXyAgICAgICAgICAgICAgICBfXyAgICAgICAgICAgICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgIyMKIyMgICAgIC8gX18vX19fIF8gX19fIF8gX19fLyAvX19fXyBfX18gICBfX18gICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICAjIwojIyAgICAvIF8vIC8gXyBgLy8gXyBgLy8gXyAgLy8gX18vLyBfIFwgLyBfIFwgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgICMjCiMjICAgL19fXy8gXF8sIC8gXF8sIC8gXF8sXy8vXy8gICBcX19fLy8gLl9fLyAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgIyMKIyMgICAgICAgIC9fX18vIC9fX18vICAgICAgICAgICAgICAgICAvXy8gICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICAjIwojIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgICMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMgICMjICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGFydCBTZXR1cC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjICAjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCm5hbWVzcGFjZSBldmFsIHdob2lzIHsKIyMgY2hhbmdlIGNtZGNoYXIgdG8gdGhlIHRyaWdnZXIgeW91IHdhbnQgdG8gdXNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjICAjIwogIHZhcmlhYmxlIGNtZGNoYXIgIiEiCiMjIGNoYW5nZSBjb21tYW5kIHRvIHRoZSB3b3JkIHRyaWdnZXIgeW91IHdvdWxkIGxpa2UgdG8gdXNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyAgIyMKIyMgS2VlcCBpbiBtaW5kLCBUaGlzIHdpbGwgYWxzbyBjaGFuZ2UgdGhlIC5jaGFuc2V0ICsvLWNvbW1hbmQgICAgICAgICAgICAgICAgICAgICAgICAgICMjICAjIwogIHZhcmlhYmxlIGNvbW1hbmQgIndob2lzIgojIyBjaGFuZ2UgdGV4dGYgdG8gdGhlIGNvbG9ycyB5b3Ugd2FudCBmb3IgdGhlIHRleHQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMgICMjCiAgdmFyaWFibGUgdGV4dGYgIlwwMTdcMDAzMDQiCiMjIGNoYW5nZSB0YWdmIHRvIHRoZSBjb2xvcnMgeW91IHdhbnQgZm9yIHRhZ3M6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyAgIyMKICB2YXJpYWJsZSB0YWdmICJcMDE3XDAwMiIKIyMgQ2hhbmdlIGxvZ28gdG8gdGhlIGxvZ28geW91IHdhbnQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBsaW5lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICMjICAjIwogIHZhcmlhYmxlIGxvZ28gIlwwMTdcMDAzMDRcMDAyXFtcMDAzMDZXXDAwM2hvaXNcMDAzMDRcXVwwMTciCiMjIENoYW5nZSBsaW5lb3V0IHRvIHRoZSByZXN1bHRzIHlvdSB3YW50LiBWYWxpZCByZXN1bHRzIGFyZSBjaGFubmVsIHVzZXJzIG1vZGVzIHRvcGljICAjIyAgIyMKICB2YXJpYWJsZSBsaW5lb3V0ICJjaGFubmVsIHVzZXJzIG1vZGVzIHRvcGljIgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjICAjIyAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuZCBTZXR1cC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMgIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIHZhcmlhYmxlIGNoYW5uZWwgIiIKICBzZXR1ZGVmIGZsYWcgJHdob2lzOjpjb21tYW5kCiAgYmluZCBwdWIgLXwtIFtzdHJpbmcgdHJpbWxlZnQgJHdob2lzOjpjbWRjaGFyXSR7d2hvaXM6OmNvbW1hbmR9IHdob2lzOjpsaXN0CiAgYmluZCByYXcgLXwtICIzMTEiIHdob2lzOjozMTEKICBiaW5kIHJhdyAtfC0gIjMxMiIgd2hvaXM6OjMxMgogIGJpbmQgcmF3IC18LSAiMzE5IiB3aG9pczo6MzE5CiAgYmluZCByYXcgLXwtICIzMTciIHdob2lzOjozMTcKICBiaW5kIHJhdyAtfC0gIjMxMyIgd2hvaXM6Om11bHRpCiAgYmluZCByYXcgLXwtICIzMTAiIHdob2lzOjptdWx0aQogIGJpbmQgcmF3IC18LSAiMzM1IiB3aG9pczo6bXVsdGkKICBiaW5kIHJhdyAtfC0gIjMwMSIgd2hvaXM6OjMwMQogIGJpbmQgcmF3IC18LSAiNjcxIiB3aG9pczo6bXVsdGkKICBiaW5kIHJhdyAtfC0gIjMyMCIgd2hvaXM6Om11bHRpCiAgYmluZCByYXcgLXwtICI0MDEiIHdob2lzOjptdWx0aQogIGJpbmQgcmF3IC18LSAiMzE4IiB3aG9pczo6MzE4CiAgYmluZCByYXcgLXwtICIzMDciIHdob2lzOjozMDcKfQpwcm9jIHdob2lzOjozMTEge2Zyb20ga2V5IHRleHR9IHsKICBpZiB7W3JlZ2V4cCAtLSB7XlteXHNdK1xzKC4rPylccyguKz8pXHMoLis/KVxzXCpcc1w6KC4rKSR9ICR0ZXh0IHdob2xlbWF0Y2ggbmljayBpZGVudCBob3N0IHJlYWxuYW1lXX0gewogICAgcHV0c2VydiAiUFJJVk1TRyAkd2hvaXM6OmNoYW5uZWwgOiR7d2hvaXM6OmxvZ299ICR7d2hvaXM6OnRhZ2Z9SG9zdDoke3dob2lzOjp0ZXh0Zn0gXAogICAgICAgICRuaWNrIFwoJHtpZGVudH1AJHtob3N0fVwpICR7d2hvaXM6OnRhZ2Z9UmVhbG5hbWU6JHt3aG9pczo6dGV4dGZ9ICRyZWFsbmFtZSIKICB9Cn0KcHJvYyB3aG9pczo6bXVsdGkge2Zyb20ga2V5IHRleHR9IHsKICBpZiB7W3JlZ2V4cCB7XDooLiopJH0gJHRleHQgbWF0Y2ggJGtleV19IHsKICAgIHB1dHNlcnYgIlBSSVZNU0cgJHdob2lzOjpjaGFubmVsIDoke3dob2lzOjpsb2dvfSAke3dob2lzOjp0YWdmfU5vdGU6JHt3aG9pczo6dGV4dGZ9IFtzdWJzdCAkJGtleV0iCiAgICAgICAgcmV0dXJuIDEKICB9Cn0KcHJvYyB3aG9pczo6MzEyIHtmcm9tIGtleSB0ZXh0fSB7CiAgcmVnZXhwIHsoW15cc10rKVxzXDp9ICR0ZXh0IG1hdGNoIHNlcnZlcgogIHB1dHNlcnYgIlBSSVZNU0cgJHdob2lzOjpjaGFubmVsIDoke3dob2lzOjpsb2dvfSAke3dob2lzOjp0YWdmfVNlcnZlcjoke3dob2lzOjp0ZXh0Zn0gJHNlcnZlciIKfQpwcm9jIHdob2lzOjozMTkge2Zyb20ga2V5IHRleHR9IHsKICBpZiB7W3JlZ2V4cCB7LitcOiguKykkfSAkdGV4dCBtYXRjaCBjaGFubmVsc119IHsKICAgIHB1dHNlcnYgIlBSSVZNU0cgJHdob2lzOjpjaGFubmVsIDoke3dob2lzOjpsb2dvfSAke3dob2lzOjp0YWdmfUNoYW5uZWxzOiR7d2hvaXM6OnRleHRmfSAkY2hhbm5lbHMiCiAgfQp9CnByb2Mgd2hvaXM6OjMxNyB7ZnJvbSBrZXkgdGV4dH0gewogIGlmIHtbcmVnZXhwIC0tIHsuKlxzKFxkKylccyhcZCspXHNcOn0gJHRleHQgd2hvbGVtYXRjaCBpZGxlIHNpZ25vbl19IHsKICAgIHB1dHNlcnYgIlBSSVZNU0cgJHdob2lzOjpjaGFubmVsIDoke3dob2lzOjpsb2dvfSAke3dob2lzOjp0YWdmfUNvbm5lY3RlZDoke3dob2lzOjp0ZXh0Zn0gXAogICAgICAgIFtjdGltZSAkc2lnbm9uXSAke3dob2lzOjp0YWdmfUlkbGU6JHt3aG9pczo6dGV4dGZ9IFtkdXJhdGlvbiAkaWRsZV0iCiAgfQp9CnByb2Mgd2hvaXM6OjMwMSB7ZnJvbSBrZXkgdGV4dH0gewogIGlmIHtbcmVnZXhwIHteLitcc1teXHNdK1xzXDooLiopJH0gJHRleHQgbWF0Y2ggYXdheW1zZ119IHsKICAgIHB1dHNlcnYgIlBSSVZNU0cgJHdob2lzOjpjaGFubmVsIDoke3dob2lzOjpsb2dvfSAke3dob2lzOjp0YWdmfUF3YXk6JHt3aG9pczo6dGV4dGZ9ICRhd2F5bXNnIgogIH0KfQpwcm9jIHdob2lzOjozMTgge2Zyb20ga2V5IHRleHR9IHsKICBuYW1lc3BhY2UgZXZhbCB3aG9pcyB7CiAgICAgICAgdmFyaWFibGUgY2hhbm5lbCAiIgogIH0KICB2YXJpYWJsZSB3aG9pczo6Y2hhbm5lbCAiIgp9CnByb2Mgd2hvaXM6OjMwNyB7ZnJvbSBrZXkgdGV4dH0gewogIHB1dHNlcnYgIlBSSVZNU0cgJHdob2lzOjpjaGFubmVsIDoke3dob2lzOjpsb2dvfSAke3dob2lzOjp0YWdmfVNlcnZpY2VzOiR7d2hvaXM6OnRleHRmfSBSZWdpc3RlcmVkIE5pY2siCn0KcHJvYyB3aG9pczo6bGlzdCB7bmljayBob3N0IGhhbmQgY2hhbiB0ZXh0fSB7CiAgaWYge1tsc2VhcmNoIC1leGFjdCBbY2hhbm5lbCBpbmZvICRjaGFuXSAiKyR7d2hvaXM6OmNvbW1hbmR9Il0gIT0gLTF9IHsKICAgIG5hbWVzcGFjZSBldmFsIHdob2lzIHsKICAgICAgICAgIHZhcmlhYmxlIGNoYW5uZWwgIiIKICAgICAgICB9CiAgICB2YXJpYWJsZSB3aG9pczo6Y2hhbm5lbCAkY2hhbgogICAgcHV0c2VydiAiV0hPSVMgJHRleHQiCiAgfQp9CnB1dGxvZyAiXDAwMipMb2FkZWQqIFwwMTdcMDAzMDRcMDAyXFtcMDAzMDZXXDAwM2hvaXNcMDAzMDRcXVwwMTcgXDAwMmJ5IFwKRm9yZF9MYXdubW93ZXIgaXJjLkdlZWtTaGVkLm5ldCAjU2NyaXB0LUhlbHAiCjwvdGV4dGFyZWE+PC9mb3JtPgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICB0aGVtZTogIm5pZ2h0IiwKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgICAgICBpbmRlbnRVbml0OiAyLAogICAgICAgIHNjcm9sbFBhc3RFbmQ6IHRydWUsCiAgICAgICAgbW9kZTogInRleHQveC10Y2wiCiAgICAgIH0pOwogICAgPC9zY3JpcHQ+CgogICAgPHA+PHN0cm9uZz5NSU1FIHR5cGVzIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPnRleHQveC10Y2w8L2NvZGU+LjwvcD4KCiAgPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/tcl/tcl.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovL3RjbCBtb2RlIGJ5IEZvcmRfTGF3bm1vd2VyIDo6IEJhc2VkIG9uIFZlbG9jaXR5IG1vZGUgYnkgU3RldmUgTydIYXJhCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJ0Y2wiLCBmdW5jdGlvbigpIHsKICBmdW5jdGlvbiBwYXJzZVdvcmRzKHN0cikgewogICAgdmFyIG9iaiA9IHt9LCB3b3JkcyA9IHN0ci5zcGxpdCgiICIpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB3b3Jkcy5sZW5ndGg7ICsraSkgb2JqW3dvcmRzW2ldXSA9IHRydWU7CiAgICByZXR1cm4gb2JqOwogIH0KICB2YXIga2V5d29yZHMgPSBwYXJzZVdvcmRzKCJUY2wgc2FmZSBhZnRlciBhcHBlbmQgYXJyYXkgYXV0b19leGVjb2sgYXV0b19pbXBvcnQgYXV0b19sb2FkICIgKwogICAgICAgICJhdXRvX21raW5kZXggYXV0b19ta2luZGV4X29sZCBhdXRvX3F1YWxpZnkgYXV0b19yZXNldCBiZ2Vycm9yICIgKwogICAgICAgICJiaW5hcnkgYnJlYWsgY2F0Y2ggY2QgY2xvc2UgY29uY2F0IGNvbnRpbnVlIGRkZSBlb2YgZW5jb2RpbmcgZXJyb3IgIiArCiAgICAgICAgImV2YWwgZXhlYyBleGl0IGV4cHIgZmJsb2NrZWQgZmNvbmZpZ3VyZSBmY29weSBmaWxlIGZpbGVldmVudCBmaWxlbmFtZSAiICsKICAgICAgICAiZmlsZW5hbWUgZmx1c2ggZm9yIGZvcmVhY2ggZm9ybWF0IGdldHMgZ2xvYiBnbG9iYWwgaGlzdG9yeSBodHRwIGlmICIgKwogICAgICAgICJpbmNyIGluZm8gaW50ZXJwIGpvaW4gbGFwcGVuZCBsaW5kZXggbGluc2VydCBsaXN0IGxsZW5ndGggbG9hZCBscmFuZ2UgIiArCiAgICAgICAgImxyZXBsYWNlIGxzZWFyY2ggbHNldCBsc29ydCBtZW1vcnkgbXNnY2F0IG5hbWVzcGFjZSBvcGVuIHBhY2thZ2UgcGFycmF5ICIgKwogICAgICAgICJwaWQgcGtnOjpjcmVhdGUgcGtnX21rSW5kZXggcHJvYyBwdXRzIHB3ZCByZV9zeW50YXggcmVhZCByZWdleCByZWdleHAgIiArCiAgICAgICAgInJlZ2lzdHJ5IHJlZ3N1YiByZW5hbWUgcmVzb3VyY2UgcmV0dXJuIHNjYW4gc2VlayBzZXQgc29ja2V0IHNvdXJjZSBzcGxpdCAiICsKICAgICAgICAic3RyaW5nIHN1YnN0IHN3aXRjaCB0Y2xfZW5kT2ZXb3JkIHRjbF9maW5kTGlicmFyeSB0Y2xfc3RhcnRPZk5leHRXb3JkICIgKwogICAgICAgICJ0Y2xfd29yZEJyZWFrQWZ0ZXIgdGNsX3N0YXJ0T2ZQcmV2aW91c1dvcmQgdGNsX3dvcmRCcmVha0JlZm9yZSB0Y2x0ZXN0ICIgKwogICAgICAgICJ0Y2x2YXJzIHRlbGwgdGltZSB0cmFjZSB1bmtub3duIHVuc2V0IHVwZGF0ZSB1cGxldmVsIHVwdmFyIHZhcmlhYmxlICIgKwogICAgInZ3YWl0Iik7CiAgICB2YXIgZnVuY3Rpb25zID0gcGFyc2VXb3JkcygiaWYgZWxzZWlmIGVsc2UgYW5kIG5vdCBvciBlcSBuZSBpbiBuaSBmb3IgZm9yZWFjaCB3aGlsZSBzd2l0Y2giKTsKICAgIHZhciBpc09wZXJhdG9yQ2hhciA9IC9bK1wtKiYlPTw+IT9eXC9cfF0vOwogICAgZnVuY3Rpb24gY2hhaW4oc3RyZWFtLCBzdGF0ZSwgZikgewogICAgICBzdGF0ZS50b2tlbml6ZSA9IGY7CiAgICAgIHJldHVybiBmKHN0cmVhbSwgc3RhdGUpOwogICAgfQogICAgZnVuY3Rpb24gdG9rZW5CYXNlKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgdmFyIGJlZm9yZVBhcmFtcyA9IHN0YXRlLmJlZm9yZVBhcmFtczsKICAgICAgc3RhdGUuYmVmb3JlUGFyYW1zID0gZmFsc2U7CiAgICAgIHZhciBjaCA9IHN0cmVhbS5uZXh0KCk7CiAgICAgIGlmICgoY2ggPT0gJyInIHx8IGNoID09ICInIikgJiYgc3RhdGUuaW5QYXJhbXMpCiAgICAgICAgcmV0dXJuIGNoYWluKHN0cmVhbSwgc3RhdGUsIHRva2VuU3RyaW5nKGNoKSk7CiAgICAgIGVsc2UgaWYgKC9bXFtcXXt9XChcKSw7XC5dLy50ZXN0KGNoKSkgewogICAgICAgIGlmIChjaCA9PSAiKCIgJiYgYmVmb3JlUGFyYW1zKSBzdGF0ZS5pblBhcmFtcyA9IHRydWU7CiAgICAgICAgZWxzZSBpZiAoY2ggPT0gIikiKSBzdGF0ZS5pblBhcmFtcyA9IGZhbHNlOwogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgZWxzZSBpZiAoL1xkLy50ZXN0KGNoKSkgewogICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1x3XC5dLyk7CiAgICAgICAgcmV0dXJuICJudW1iZXIiOwogICAgICB9CiAgICAgIGVsc2UgaWYgKGNoID09ICIjIiAmJiBzdHJlYW0uZWF0KCIqIikpIHsKICAgICAgICByZXR1cm4gY2hhaW4oc3RyZWFtLCBzdGF0ZSwgdG9rZW5Db21tZW50KTsKICAgICAgfQogICAgICBlbHNlIGlmIChjaCA9PSAiIyIgJiYgc3RyZWFtLm1hdGNoKC8gKlxbICpcWy8pKSB7CiAgICAgICAgcmV0dXJuIGNoYWluKHN0cmVhbSwgc3RhdGUsIHRva2VuVW5wYXJzZWQpOwogICAgICB9CiAgICAgIGVsc2UgaWYgKGNoID09ICIjIiAmJiBzdHJlYW0uZWF0KCIjIikpIHsKICAgICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICAgICAgcmV0dXJuICJjb21tZW50IjsKICAgICAgfQogICAgICBlbHNlIGlmIChjaCA9PSAnIicpIHsKICAgICAgICBzdHJlYW0uc2tpcFRvKC8iLyk7CiAgICAgICAgcmV0dXJuICJjb21tZW50IjsKICAgICAgfQogICAgICBlbHNlIGlmIChjaCA9PSAiJCIpIHsKICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1skX2EtejAtOUEtWlwuezpdLyk7CiAgICAgICAgc3RyZWFtLmVhdFdoaWxlKC99Lyk7CiAgICAgICAgc3RhdGUuYmVmb3JlUGFyYW1zID0gdHJ1ZTsKICAgICAgICByZXR1cm4gImJ1aWx0aW4iOwogICAgICB9CiAgICAgIGVsc2UgaWYgKGlzT3BlcmF0b3JDaGFyLnRlc3QoY2gpKSB7CiAgICAgICAgc3RyZWFtLmVhdFdoaWxlKGlzT3BlcmF0b3JDaGFyKTsKICAgICAgICByZXR1cm4gImNvbW1lbnQiOwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1x3XCRfe31dLyk7CiAgICAgICAgdmFyIHdvcmQgPSBzdHJlYW0uY3VycmVudCgpLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgaWYgKGtleXdvcmRzICYmIGtleXdvcmRzLnByb3BlcnR5SXNFbnVtZXJhYmxlKHdvcmQpKQogICAgICAgICAgcmV0dXJuICJrZXl3b3JkIjsKICAgICAgICBpZiAoZnVuY3Rpb25zICYmIGZ1bmN0aW9ucy5wcm9wZXJ0eUlzRW51bWVyYWJsZSh3b3JkKSkgewogICAgICAgICAgc3RhdGUuYmVmb3JlUGFyYW1zID0gdHJ1ZTsKICAgICAgICAgIHJldHVybiAia2V5d29yZCI7CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiB0b2tlblN0cmluZyhxdW90ZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICB2YXIgZXNjYXBlZCA9IGZhbHNlLCBuZXh0LCBlbmQgPSBmYWxzZTsKICAgICAgd2hpbGUgKChuZXh0ID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkgewogICAgICAgIGlmIChuZXh0ID09IHF1b3RlICYmICFlc2NhcGVkKSB7CiAgICAgICAgICBlbmQgPSB0cnVlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGVzY2FwZWQgPSAhZXNjYXBlZCAmJiBuZXh0ID09ICJcXCI7CiAgICAgIH0KICAgICAgaWYgKGVuZCkgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gdG9rZW5Db21tZW50KHN0cmVhbSwgc3RhdGUpIHsKICAgICAgdmFyIG1heWJlRW5kID0gZmFsc2UsIGNoOwogICAgICB3aGlsZSAoY2ggPSBzdHJlYW0ubmV4dCgpKSB7CiAgICAgICAgaWYgKGNoID09ICIjIiAmJiBtYXliZUVuZCkgewogICAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgbWF5YmVFbmQgPSAoY2ggPT0gIioiKTsKICAgICAgfQogICAgICByZXR1cm4gImNvbW1lbnQiOwogICAgfQogICAgZnVuY3Rpb24gdG9rZW5VbnBhcnNlZChzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHZhciBtYXliZUVuZCA9IDAsIGNoOwogICAgICB3aGlsZSAoY2ggPSBzdHJlYW0ubmV4dCgpKSB7CiAgICAgICAgaWYgKGNoID09ICIjIiAmJiBtYXliZUVuZCA9PSAyKSB7CiAgICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBpZiAoY2ggPT0gIl0iKQogICAgICAgICAgbWF5YmVFbmQrKzsKICAgICAgICBlbHNlIGlmIChjaCAhPSAiICIpCiAgICAgICAgICBtYXliZUVuZCA9IDA7CiAgICAgIH0KICAgICAgcmV0dXJuICJtZXRhIjsKICAgIH0KICAgIHJldHVybiB7CiAgICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICB0b2tlbml6ZTogdG9rZW5CYXNlLAogICAgICAgICAgYmVmb3JlUGFyYW1zOiBmYWxzZSwKICAgICAgICAgIGluUGFyYW1zOiBmYWxzZQogICAgICAgIH07CiAgICAgIH0sCiAgICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgICAgaWYgKHN0cmVhbS5lYXRTcGFjZSgpKSByZXR1cm4gbnVsbDsKICAgICAgICByZXR1cm4gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CiAgICAgIH0KICAgIH07Cn0pOwpDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveC10Y2wiLCAidGNsIik7Cgp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/tiddlywiki/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/tiddlywiki/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogVGlkZGx5V2lraSBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJ0aWRkbHl3aWtpLmNzcyI+CjxzY3JpcHQgc3JjPSIuLi8uLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi8uLi9hZGRvbi9lZGl0L21hdGNoYnJhY2tldHMuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0idGlkZGx5d2lraS5qcyI+PC9zY3JpcHQ+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+LkNvZGVNaXJyb3Ige2JvcmRlci10b3A6IDFweCBzb2xpZCBibGFjazsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO308L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5UaWRkbHlXaWtpPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5UaWRkbHlXaWtpIG1vZGU8L2gyPgoKCjxkaXY+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KIVRpZGRseVdpa2kgRm9ybWF0dGluZwoqIFJlbmRlcmVkIHZlcnNpb25zIGNhbiBiZSBmb3VuZCBhdDogaHR0cDovL3d3dy50aWRkbHl3aWtpLmNvbS8jUmVmZXJlbmNlCgp8IU9wdGlvbiAgICAgICAgICAgIHwgIVN5bnRheCAgICAgICAgICAgIHwKfGJvbGQgZm9udCAgICAgICAgICB8ICcnYm9sZCcnICAgICAgICAgICB8CnxpdGFsaWMgdHlwZSAgICAgICAgfCAvL2l0YWxpYy8vICAgICAgICAgfAp8dW5kZXJsaW5lZCB0ZXh0ICAgIHwgX191bmRlcmxpbmVkX18gICAgIHwKfHN0cmlrZXRocm91Z2ggdGV4dCB8IC0tc3RyaWtldGhyb3VnaC0tICB8CnxzdXBlcnNjcmlwdCB0ZXh0ICAgfCBzdXBlcl5ec2NyaXB0Xl4gICAgfAp8c3Vic2NyaXB0IHRleHQgICAgIHwgc3Vifn5zY3JpcHR+fiAgICAgIHwKfGhpZ2hsaWdodGVkIHRleHQgICB8IEBAaGlnaGxpZ2h0ZWRAQCAgICB8CnxwcmVmb3JtYXR0ZWQgdGV4dCAgfCB7e3twcmVmb3JtYXR0ZWR9fX0gfAoKIUJsb2NrIEVsZW1lbnRzCjw8PAohSGVhZGluZyAxCgohIUhlYWRpbmcgMgoKISEhSGVhZGluZyAzCgohISEhSGVhZGluZyA0CgohISEhIUhlYWRpbmcgNQo8PDwKCiEhTGlzdHMKPDw8CiogdW5vcmRlcmVkIGxpc3QsIGxldmVsIDEKKiogdW5vcmRlcmVkIGxpc3QsIGxldmVsIDIKKioqIHVub3JkZXJlZCBsaXN0LCBsZXZlbCAzCgojIG9yZGVyZWQgbGlzdCwgbGV2ZWwgMQojIyBvcmRlcmVkIGxpc3QsIGxldmVsIDIKIyMjIHVub3JkZXJlZCBsaXN0LCBsZXZlbCAzCgo7IGRlZmluaXRpb24gbGlzdCwgdGVybQo6IGRlZmluaXRpb24gbGlzdCwgZGVzY3JpcHRpb24KPDw8CgohIUJsb2NrcXVvdGVzCjw8PAo+IGJsb2NrcXVvdGUsIGxldmVsIDEKPj4gYmxvY2txdW90ZSwgbGV2ZWwgMgo+Pj4gYmxvY2txdW90ZSwgbGV2ZWwgMwoKPiBibG9ja3F1b3RlCjw8PAoKISFQcmVmb3JtYXR0ZWQgVGV4dAo8PDwKe3t7CnByZWZvcm1hdHRlZCAoZS5nLiBjb2RlKQp9fX0KPDw8CgohIUNvZGUgU2VjdGlvbnMKPDw8Cnt7ewpUZXh0IHN0eWxlIGNvZGUKfX19CgovL3t7ewpKUyBzdHlsZWQgY29kZS4gVGlkZGx5V2lraSBtaXhlZCBtb2RlIHNob3VsZCBzdXBwb3J0IGhpZ2hsaWdodGVyIHN3aXRjaGluZyBpbiB0aGUgZnV0dXJlLgovL319fQoKPCEtLXt7ey0tPgpYTUwgc3R5bGVkIGNvZGUuIFRpZGRseVdpa2kgbWl4ZWQgbW9kZSBzaG91bGQgc3VwcG9ydCBoaWdobGlnaHRlciBzd2l0Y2hpbmcgaW4gdGhlIGZ1dHVyZS4KPCEtLX19fS0tPgo8PDwKCiEhVGFibGVzCjw8PAp8Q3NzQ2xhc3N8awp8IWhlYWRpbmcgY29sdW1uIDF8IWhlYWRpbmcgY29sdW1uIDJ8Cnxyb3cgMSwgY29sdW1uIDF8cm93IDEsIGNvbHVtbiAyfAp8cm93IDIsIGNvbHVtbiAxfHJvdyAyLCBjb2x1bW4gMnwKfD58Q09MU1BBTnwKfFJPV1NQQU58IC4uLiB8Cnx+fCAuLi4gfAp8Q3NzUHJvcGVydHk6dmFsdWU7Li4ufCAuLi4gfAp8Y2FwdGlvbnxjCgonJ0Fubm90YXRpb246JycKKiBUaGUge3t7Pn19fSBtYXJrZXIgY3JlYXRlcyBhICJjb2xzcGFuIiwgY2F1c2luZyB0aGUgY3VycmVudCBjZWxsIHRvIG1lcmdlIHdpdGggdGhlIG9uZSB0byB0aGUgcmlnaHQuCiogVGhlIHt7e359fX0gbWFya2VyIGNyZWF0ZXMgYSAicm93c3BhbiIsIGNhdXNpbmcgdGhlIGN1cnJlbnQgY2VsbCB0byBtZXJnZSB3aXRoIHRoZSBvbmUgYWJvdmUuCjw8PAohIUltYWdlcyAvJSBUT0RPICUvCmNmLiBbW1RpZGRseVdpa2kuY29tfGh0dHA6Ly93d3cudGlkZGx5d2lraS5jb20vI0VtYmVkZGVkSW1hZ2VzXV0KCiFIeXBlcmxpbmtzCiogW1tXaWtpV29yZHN8V2lraVdvcmRdXSBhcmUgYXV0b21hdGljYWxseSB0cmFuc2Zvcm1lZCB0byBoeXBlcmxpbmtzIHRvIHRoZSByZXNwZWN0aXZlIHRpZGRsZXIKKiogdGhlIGF1dG9tYXRpYyB0cmFuc2Zvcm1hdGlvbiBjYW4gYmUgc3VwcHJlc3NlZCBieSBwcmVjZWRpbmcgdGhlIHJlc3BlY3RpdmUgV2lraVdvcmQgd2l0aCBhIHRpbGRlICh7e3t+fX19KToge3t7fldpa2lXb3JkfX19CiogW1tQcmV0dHlMaW5rc11dIGFyZSBlbmNsb3NlZCBpbiBzcXVhcmUgYnJhY2tldHMgYW5kIGNvbnRhaW4gdGhlIGRlc2lyZWQgdGlkZGxlciBuYW1lOiB7e3tbW3RpZGRsZXIgbmFtZV1dfX19CioqIG9wdGlvbmFsbHksIGEgY3VzdG9tIHRpdGxlIG9yIGRlc2NyaXB0aW9uIGNhbiBiZSBhZGRlZCwgc2VwYXJhdGVkIGJ5IGEgcGlwZSBjaGFyYWN0ZXIgKHt7e3x9fX0pOiB7e3tbW3RpdGxlfHRhcmdldF1dfX19PGJyPicnJ04uQi46JycnIEluIHRoaXMgY2FzZSwgdGhlIHRhcmdldCBjYW4gYWxzbyBiZSBhbnkgd2Vic2l0ZSAoaS5lLiBVUkwpLgoKIUN1c3RvbSBTdHlsaW5nCioge3t7QEBDc3NQcm9wZXJ0eTp2YWx1ZTtDc3NQcm9wZXJ0eTp2YWx1ZTsuLi5AQH19fTxicj4nJ04uQi46JycgQ1NTIGNvbG9yIGRlZmluaXRpb25zIHNob3VsZCB1c2UgbG93ZXJjYXNlIGxldHRlcnMgdG8gcHJldmVudCB0aGUgaW5hZHZlcnRlbnQgY3JlYXRpb24gb2YgV2lraVdvcmRzLgoqIDxodG1sPjxjb2RlPnt7Y3VzdG9tQ3NzQ2xhc3N7Li4ufX19PC9jb2RlPjwvaHRtbD4KKiByYXcgSFRNTCBjYW4gYmUgaW5zZXJ0ZWQgYnkgZW5jbG9zaW5nIHRoZSByZXNwZWN0aXZlIGNvZGUgaW4gSFRNTCB0YWdzOiB7e3s8aHRtbD4gLi4uIDwvaHRtbD59fX0KCiFTcGVjaWFsIE1hcmtlcnMKKiB7e3s8YnI+fX19IGZvcmNlcyBhIG1hbnVhbCBsaW5lIGJyZWFrCioge3t7LS0tLX19fSBjcmVhdGVzIGEgaG9yaXpvbnRhbCBydWxlcgoqIFtbSFRNTCBlbnRpdGllc3xodHRwOi8vd3d3LnRpZGRseXdpa2kuY29tLyNIdG1sRW50aXRpZXNdXQoqIFtbSFRNTCBlbnRpdGllcyBsb2NhbHxIdG1sRW50aXRpZXNdXQoqIHt7ezw8bWFjcm9OYW1lPj59fX0gY2FsbHMgdGhlIHJlc3BlY3RpdmUgW1ttYWNyb3xNYWNyb3NdXQoqIFRvIGhpZGUgdGV4dCB3aXRoaW4gYSB0aWRkbGVyIHNvIHRoYXQgaXQgaXMgbm90IGRpc3BsYXllZCwgaXQgY2FuIGJlIHdyYXBwZWQgaW4ge3t7LyV9fX0gYW5kIHt7eyUvfX19Ljxici8+VGhpcyBjYW4gYmUgYSB1c2VmdWwgdHJpY2sgZm9yIGhpZGluZyBkcmFmdHMgb3IgYW5ub3RhdGluZyBjb21wbGV4IG1hcmt1cC4KKiBUbyBwcmV2ZW50IHdpa2kgbWFya3VwIGZyb20gdGFraW5nIGVmZmVjdCBmb3IgYSBwYXJ0aWN1bGFyIHNlY3Rpb24sIHRoYXQgc2VjdGlvbiBjYW4gYmUgZW5jbG9zZWQgaW4gdGhyZWUgZG91YmxlIHF1b3RlczogZS5nLiB7e3siIiJXaWtpV29yZCIiIn19fS4KPC90ZXh0YXJlYT48L2Rpdj4KCiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgICAgIG1vZGU6ICd0aWRkbHl3aWtpJywgICAgICAKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgICAgICBtYXRjaEJyYWNrZXRzOiB0cnVlCiAgICAgIH0pOwogICAgPC9zY3JpcHQ+CgogICAgPHA+VGlkZGx5V2lraSBtb2RlIHN1cHBvcnRzIGEgc2luZ2xlIGNvbmZpZ3VyYXRpb24uPC9wPgoKICAgIDxwPjxzdHJvbmc+TUlNRSB0eXBlcyBkZWZpbmVkOjwvc3Ryb25nPiA8Y29kZT50ZXh0L3gtdGlkZGx5d2lraTwvY29kZT4uPC9wPgogIDwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/tiddlywiki/tiddlywiki.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[c3Bhbi5jbS11bmRlcmxpbmVkIHsKICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKfQpzcGFuLmNtLXN0cmlrZXRocm91Z2ggewogIHRleHQtZGVjb3JhdGlvbjogbGluZS10aHJvdWdoOwp9CnNwYW4uY20tYnJhY2UgewogIGNvbG9yOiAjMTcwOwogIGZvbnQtd2VpZ2h0OiBib2xkOwp9CnNwYW4uY20tdGFibGUgewogIGNvbG9yOiBibHVlOwogIGZvbnQtd2VpZ2h0OiBib2xkOwp9Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/tiddlywiki/tiddlywiki.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovKioqCiAgICB8JydOYW1lJyd8dGlkZGx5d2lraS5qc3wKICAgIHwnJ0Rlc2NyaXB0aW9uJyd8RW5hYmxlcyBUaWRkbHlXaWtpeSBzeW50YXggaGlnaGxpZ2h0aW5nIHVzaW5nIENvZGVNaXJyb3J8CiAgICB8JydBdXRob3InJ3xQTWFyaW98CiAgICB8JydWZXJzaW9uJyd8MC4xLjd8CiAgICB8JydTdGF0dXMnJ3wnJ3N0YWJsZScnfAogICAgfCcnU291cmNlJyd8W1tHaXRIdWJ8aHR0cHM6Ly9naXRodWIuY29tL3BtYXJpby9Db2RlTWlycm9yMi9ibG9iL3R3LXN5bnRheC9tb2RlL3RpZGRseXdpa2ldXXwKICAgIHwnJ0RvY3VtZW50YXRpb24nJ3xodHRwOi8vY29kZW1pcnJvci50aWRkbHlzcGFjZS5jb20vfAogICAgfCcnTGljZW5zZScnfFtbTUlUIExpY2Vuc2V8aHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHBdXXwKICAgIHwnJ0NvcmVWZXJzaW9uJyd8Mi41LjB8CiAgICB8JydSZXF1aXJlcycnfGNvZGVtaXJyb3IuanN8CiAgICB8JydLZXl3b3JkcycnfHN5bnRheCBoaWdobGlnaHRpbmcgY29sb3IgY29kZSBtaXJyb3IgY29kZW1pcnJvcnwKICAgICEgSW5mbwogICAgQ29yZVZlcnNpb24gcGFyYW1ldGVyIGlzIG5lZWRlZCBmb3IgVGlkZGx5V2lraSBvbmx5IQoqKiovCi8ve3t7CgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJ0aWRkbHl3aWtpIiwgZnVuY3Rpb24gKCkgewogIC8vIFRva2VuaXplcgogIHZhciB0ZXh0d29yZHMgPSB7fTsKCiAgdmFyIGtleXdvcmRzID0gZnVuY3Rpb24gKCkgewogICAgZnVuY3Rpb24ga3codHlwZSkgewogICAgICByZXR1cm4geyB0eXBlOiB0eXBlLCBzdHlsZTogIm1hY3JvIn07CiAgICB9CiAgICByZXR1cm4gewogICAgICAiYWxsVGFncyI6IGt3KCdhbGxUYWdzJyksICJjbG9zZUFsbCI6IGt3KCdjbG9zZUFsbCcpLCAibGlzdCI6IGt3KCdsaXN0JyksCiAgICAgICJuZXdKb3VybmFsIjoga3coJ25ld0pvdXJuYWwnKSwgIm5ld1RpZGRsZXIiOiBrdygnbmV3VGlkZGxlcicpLAogICAgICAicGVybWF2aWV3Ijoga3coJ3Blcm1hdmlldycpLCAic2F2ZUNoYW5nZXMiOiBrdygnc2F2ZUNoYW5nZXMnKSwKICAgICAgInNlYXJjaCI6IGt3KCdzZWFyY2gnKSwgInNsaWRlciI6IGt3KCdzbGlkZXInKSwgICAidGFicyI6IGt3KCd0YWJzJyksCiAgICAgICJ0YWciOiBrdygndGFnJyksICJ0YWdnaW5nIjoga3coJ3RhZ2dpbmcnKSwgICAgICAgInRhZ3MiOiBrdygndGFncycpLAogICAgICAidGlkZGxlciI6IGt3KCd0aWRkbGVyJyksICJ0aW1lbGluZSI6IGt3KCd0aW1lbGluZScpLAogICAgICAidG9kYXkiOiBrdygndG9kYXknKSwgInZlcnNpb24iOiBrdygndmVyc2lvbicpLCAgICJvcHRpb24iOiBrdygnb3B0aW9uJyksCgogICAgICAid2l0aCI6IGt3KCd3aXRoJyksCiAgICAgICJmaWx0ZXIiOiBrdygnZmlsdGVyJykKICAgIH07CiAgfSgpOwoKICB2YXIgaXNTcGFjZU5hbWUgPSAvW1x3X1wtXS9pLAogIHJlSFIgPSAvXlwtXC1cLVwtKyQvLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDxocj4KICByZVdpa2lDb21tZW50U3RhcnQgPSAvXlwvXCpcKlwqJC8sICAgICAgICAgICAgLy8gLyoqKgogIHJlV2lraUNvbW1lbnRTdG9wID0gL15cKlwqXCpcLyQvLCAgICAgICAgICAgICAvLyAqKiovCiAgcmVCbG9ja1F1b3RlID0gL148PDwkLywKCiAgcmVKc0NvZGVTdGFydCA9IC9eXC9cL1x7XHtceyQvLCAgICAgICAgICAgICAgICAgICAgICAgLy8gLy97e3sganMgYmxvY2sgc3RhcnQKICByZUpzQ29kZVN0b3AgPSAvXlwvXC9cfVx9XH0kLywgICAgICAgICAgICAgICAgICAgICAgICAvLyAvL319fSBqcyBzdG9wCiAgcmVYbWxDb2RlU3RhcnQgPSAvXjwhLS1ce1x7XHstLT4kLywgICAgICAgICAgIC8vIHhtbCBibG9jayBzdGFydAogIHJlWG1sQ29kZVN0b3AgPSAvXjwhLS1cfVx9XH0tLT4kLywgICAgICAgICAgICAvLyB4bWwgc3RvcAoKICByZUNvZGVCbG9ja1N0YXJ0ID0gL15ce1x7XHskLywgICAgICAgICAgICAgICAgICAgICAgICAvLyB7e3sgVFcgdGV4dCBkaXYgYmxvY2sgc3RhcnQKICByZUNvZGVCbG9ja1N0b3AgPSAvXlx9XH1cfSQvLCAgICAgICAgICAgICAgICAgLy8gfX19IFRXIHRleHQgc3RvcAoKICByZVVudGlsQ29kZVN0b3AgPSAvLio/XH1cfVx9LzsKCiAgZnVuY3Rpb24gY2hhaW4oc3RyZWFtLCBzdGF0ZSwgZikgewogICAgc3RhdGUudG9rZW5pemUgPSBmOwogICAgcmV0dXJuIGYoc3RyZWFtLCBzdGF0ZSk7CiAgfQoKICAvLyBVc2VkIGFzIHNjcmF0Y2ggdmFyaWFibGVzIHRvIGNvbW11bmljYXRlIG11bHRpcGxlIHZhbHVlcyB3aXRob3V0CiAgLy8gY29uc2luZyB1cCB0b25zIG9mIG9iamVjdHMuCiAgdmFyIHR5cGUsIGNvbnRlbnQ7CgogIGZ1bmN0aW9uIHJldCh0cCwgc3R5bGUsIGNvbnQpIHsKICAgIHR5cGUgPSB0cDsKICAgIGNvbnRlbnQgPSBjb250OwogICAgcmV0dXJuIHN0eWxlOwogIH0KCiAgZnVuY3Rpb24ganNUb2tlbkJhc2Uoc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIHNvbCA9IHN0cmVhbS5zb2woKSwgY2g7CgogICAgc3RhdGUuYmxvY2sgPSBmYWxzZTsgICAgICAgIC8vIGluZGljYXRlcyB0aGUgc3RhcnQgb2YgYSBjb2RlIGJsb2NrLgoKICAgIGNoID0gc3RyZWFtLnBlZWsoKTsgICAgICAgICAvLyBkb24ndCBlYXQsIHRvIG1ha2UgbWF0Y2hpbmcgc2ltcGxlcgoKICAgIC8vIGNoZWNrIHN0YXJ0IG9mICBibG9ja3MKICAgIGlmIChzb2wgJiYgL1s8XC9cKnt9XC1dLy50ZXN0KGNoKSkgewogICAgICBpZiAoc3RyZWFtLm1hdGNoKHJlQ29kZUJsb2NrU3RhcnQpKSB7CiAgICAgICAgc3RhdGUuYmxvY2sgPSB0cnVlOwogICAgICAgIHJldHVybiBjaGFpbihzdHJlYW0sIHN0YXRlLCB0d1Rva2VuQ29kZSk7CiAgICAgIH0KICAgICAgaWYgKHN0cmVhbS5tYXRjaChyZUJsb2NrUXVvdGUpKSB7CiAgICAgICAgcmV0dXJuIHJldCgncXVvdGUnLCAncXVvdGUnKTsKICAgICAgfQogICAgICBpZiAoc3RyZWFtLm1hdGNoKHJlV2lraUNvbW1lbnRTdGFydCkgfHwgc3RyZWFtLm1hdGNoKHJlV2lraUNvbW1lbnRTdG9wKSkgewogICAgICAgIHJldHVybiByZXQoJ2NvZGUnLCAnY29tbWVudCcpOwogICAgICB9CiAgICAgIGlmIChzdHJlYW0ubWF0Y2gocmVKc0NvZGVTdGFydCkgfHwgc3RyZWFtLm1hdGNoKHJlSnNDb2RlU3RvcCkgfHwgc3RyZWFtLm1hdGNoKHJlWG1sQ29kZVN0YXJ0KSB8fCBzdHJlYW0ubWF0Y2gocmVYbWxDb2RlU3RvcCkpIHsKICAgICAgICByZXR1cm4gcmV0KCdjb2RlJywgJ2NvbW1lbnQnKTsKICAgICAgfQogICAgICBpZiAoc3RyZWFtLm1hdGNoKHJlSFIpKSB7CiAgICAgICAgcmV0dXJuIHJldCgnaHInLCAnaHInKTsKICAgICAgfQogICAgfSAvLyBzb2wKICAgIGNoID0gc3RyZWFtLm5leHQoKTsKCiAgICBpZiAoc29sICYmIC9bXC9cKiEjOzo+fF0vLnRlc3QoY2gpKSB7CiAgICAgIGlmIChjaCA9PSAiISIpIHsgLy8gdHcgaGVhZGVyCiAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICAgIHJldHVybiByZXQoImhlYWRlciIsICJoZWFkZXIiKTsKICAgICAgfQogICAgICBpZiAoY2ggPT0gIioiKSB7IC8vIHR3IGxpc3QKICAgICAgICBzdHJlYW0uZWF0V2hpbGUoJyonKTsKICAgICAgICByZXR1cm4gcmV0KCJsaXN0IiwgImNvbW1lbnQiKTsKICAgICAgfQogICAgICBpZiAoY2ggPT0gIiMiKSB7IC8vIHR3IG51bWJlcmVkIGxpc3QKICAgICAgICBzdHJlYW0uZWF0V2hpbGUoJyMnKTsKICAgICAgICByZXR1cm4gcmV0KCJsaXN0IiwgImNvbW1lbnQiKTsKICAgICAgfQogICAgICBpZiAoY2ggPT0gIjsiKSB7IC8vIGRlZmluaXRpb24gbGlzdCwgdGVybQogICAgICAgIHN0cmVhbS5lYXRXaGlsZSgnOycpOwogICAgICAgIHJldHVybiByZXQoImxpc3QiLCAiY29tbWVudCIpOwogICAgICB9CiAgICAgIGlmIChjaCA9PSAiOiIpIHsgLy8gZGVmaW5pdGlvbiBsaXN0LCBkZXNjcmlwdGlvbgogICAgICAgIHN0cmVhbS5lYXRXaGlsZSgnOicpOwogICAgICAgIHJldHVybiByZXQoImxpc3QiLCAiY29tbWVudCIpOwogICAgICB9CiAgICAgIGlmIChjaCA9PSAiPiIpIHsgLy8gc2luZ2xlIGxpbmUgcXVvdGUKICAgICAgICBzdHJlYW0uZWF0V2hpbGUoIj4iKTsKICAgICAgICByZXR1cm4gcmV0KCJxdW90ZSIsICJxdW90ZSIpOwogICAgICB9CiAgICAgIGlmIChjaCA9PSAnfCcpIHsKICAgICAgICByZXR1cm4gcmV0KCd0YWJsZScsICdoZWFkZXInKTsKICAgICAgfQogICAgfQoKICAgIGlmIChjaCA9PSAneycgJiYgc3RyZWFtLm1hdGNoKC9ce1x7LykpIHsKICAgICAgcmV0dXJuIGNoYWluKHN0cmVhbSwgc3RhdGUsIHR3VG9rZW5Db2RlKTsKICAgIH0KCiAgICAvLyBydWRpbWVudGFyeSBodG1sOi8vIGZpbGU6Ly8gbGluayBtYXRjaGluZy4gVFcga25vd3MgbXVjaCBtb3JlIC4uLgogICAgaWYgKC9baGZdL2kudGVzdChjaCkpIHsKICAgICAgaWYgKC9bdGldL2kudGVzdChzdHJlYW0ucGVlaygpKSAmJiBzdHJlYW0ubWF0Y2goL1xiKHR0cHM/fHRwfGlsZSk6XC9cL1tcLUEtWjAtOSsmQCNcLyU/PX5ffCQhOiwuO10qW0EtWjAtOSsmQCNcLyU9fl98JF0vaSkpIHsKICAgICAgICByZXR1cm4gcmV0KCJsaW5rIiwgImxpbmsiKTsKICAgICAgfQogICAgfQogICAgLy8ganVzdCBhIGxpdHRsZSBzdHJpbmcgaW5kaWNhdG9yLCBkb24ndCB3YW50IHRvIGhhdmUgdGhlIHdob2xlIHN0cmluZyBjb3ZlcmVkCiAgICBpZiAoY2ggPT0gJyInKSB7CiAgICAgIHJldHVybiByZXQoJ3N0cmluZycsICdzdHJpbmcnKTsKICAgIH0KICAgIGlmIChjaCA9PSAnficpIHsgICAgLy8gX25vXyBDYW1lbENhc2UgaW5kaWNhdG9yIHNob3VsZCBiZSBib2xkCiAgICAgIHJldHVybiByZXQoJ3RleHQnLCAnYnJhY2UnKTsKICAgIH0KICAgIGlmICgvW1xbXF1dLy50ZXN0KGNoKSkgeyAvLyBjaGVjayBmb3IgW1suLl1dCiAgICAgIGlmIChzdHJlYW0ucGVlaygpID09IGNoKSB7CiAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgICByZXR1cm4gcmV0KCdicmFjZScsICdicmFjZScpOwogICAgICB9CiAgICB9CiAgICBpZiAoY2ggPT0gIkAiKSB7ICAgIC8vIGNoZWNrIGZvciBzcGFjZSBsaW5rLiBUT0RPIGZpeCBAQC4uLkBAIGhpZ2hsaWdodGluZwogICAgICBzdHJlYW0uZWF0V2hpbGUoaXNTcGFjZU5hbWUpOwogICAgICByZXR1cm4gcmV0KCJsaW5rIiwgImxpbmsiKTsKICAgIH0KICAgIGlmICgvXGQvLnRlc3QoY2gpKSB7ICAgICAgICAvLyBudW1iZXJzCiAgICAgIHN0cmVhbS5lYXRXaGlsZSgvXGQvKTsKICAgICAgcmV0dXJuIHJldCgibnVtYmVyIiwgIm51bWJlciIpOwogICAgfQogICAgaWYgKGNoID09ICIvIikgeyAvLyB0dyBpbnZpc2libGUgY29tbWVudAogICAgICBpZiAoc3RyZWFtLmVhdCgiJSIpKSB7CiAgICAgICAgcmV0dXJuIGNoYWluKHN0cmVhbSwgc3RhdGUsIHR3VG9rZW5Db21tZW50KTsKICAgICAgfQogICAgICBlbHNlIGlmIChzdHJlYW0uZWF0KCIvIikpIHsgLy8KICAgICAgICByZXR1cm4gY2hhaW4oc3RyZWFtLCBzdGF0ZSwgdHdUb2tlbkVtKTsKICAgICAgfQogICAgfQogICAgaWYgKGNoID09ICJfIikgeyAvLyB0dyB1bmRlcmxpbmUKICAgICAgaWYgKHN0cmVhbS5lYXQoIl8iKSkgewogICAgICAgIHJldHVybiBjaGFpbihzdHJlYW0sIHN0YXRlLCB0d1Rva2VuVW5kZXJsaW5lKTsKICAgICAgfQogICAgfQogICAgLy8gc3RyaWtldGhyb3VnaCBhbmQgbWRhc2ggaGFuZGxpbmcKICAgIGlmIChjaCA9PSAiLSIpIHsKICAgICAgaWYgKHN0cmVhbS5lYXQoIi0iKSkgewogICAgICAgIC8vIGlmIHN0cmlrZXRocm91Z2ggbG9va3MgdWdseSwgY2hhbmdlIENTUy4KICAgICAgICBpZiAoc3RyZWFtLnBlZWsoKSAhPSAnICcpCiAgICAgICAgICByZXR1cm4gY2hhaW4oc3RyZWFtLCBzdGF0ZSwgdHdUb2tlblN0cmlrZSk7CiAgICAgICAgLy8gbWRhc2gKICAgICAgICBpZiAoc3RyZWFtLnBlZWsoKSA9PSAnICcpCiAgICAgICAgICByZXR1cm4gcmV0KCd0ZXh0JywgJ2JyYWNlJyk7CiAgICAgIH0KICAgIH0KICAgIGlmIChjaCA9PSAiJyIpIHsgLy8gdHcgYm9sZAogICAgICBpZiAoc3RyZWFtLmVhdCgiJyIpKSB7CiAgICAgICAgcmV0dXJuIGNoYWluKHN0cmVhbSwgc3RhdGUsIHR3VG9rZW5TdHJvbmcpOwogICAgICB9CiAgICB9CiAgICBpZiAoY2ggPT0gIjwiKSB7IC8vIHR3IG1hY3JvCiAgICAgIGlmIChzdHJlYW0uZWF0KCI8IikpIHsKICAgICAgICByZXR1cm4gY2hhaW4oc3RyZWFtLCBzdGF0ZSwgdHdUb2tlbk1hY3JvKTsKICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgIHJldHVybiByZXQoY2gpOwogICAgfQoKICAgIC8vIGNvcmUgbWFjcm8gaGFuZGxpbmcKICAgIHN0cmVhbS5lYXRXaGlsZSgvW1x3XCRfXS8pOwogICAgdmFyIHdvcmQgPSBzdHJlYW0uY3VycmVudCgpLAogICAga25vd24gPSB0ZXh0d29yZHMucHJvcGVydHlJc0VudW1lcmFibGUod29yZCkgJiYgdGV4dHdvcmRzW3dvcmRdOwoKICAgIHJldHVybiBrbm93biA/IHJldChrbm93bi50eXBlLCBrbm93bi5zdHlsZSwgd29yZCkgOiByZXQoInRleHQiLCBudWxsLCB3b3JkKTsKCiAgfSAvLyBqc1Rva2VuQmFzZSgpCgogIC8vIHR3IGludmlzaWJsZSBjb21tZW50CiAgZnVuY3Rpb24gdHdUb2tlbkNvbW1lbnQoc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIG1heWJlRW5kID0gZmFsc2UsCiAgICBjaDsKICAgIHdoaWxlIChjaCA9IHN0cmVhbS5uZXh0KCkpIHsKICAgICAgaWYgKGNoID09ICIvIiAmJiBtYXliZUVuZCkgewogICAgICAgIHN0YXRlLnRva2VuaXplID0ganNUb2tlbkJhc2U7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgbWF5YmVFbmQgPSAoY2ggPT0gIiUiKTsKICAgIH0KICAgIHJldHVybiByZXQoImNvbW1lbnQiLCAiY29tbWVudCIpOwogIH0KCiAgLy8gdHcgc3Ryb25nIC8gYm9sZAogIGZ1bmN0aW9uIHR3VG9rZW5TdHJvbmcoc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIG1heWJlRW5kID0gZmFsc2UsCiAgICBjaDsKICAgIHdoaWxlIChjaCA9IHN0cmVhbS5uZXh0KCkpIHsKICAgICAgaWYgKGNoID09ICInIiAmJiBtYXliZUVuZCkgewogICAgICAgIHN0YXRlLnRva2VuaXplID0ganNUb2tlbkJhc2U7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgbWF5YmVFbmQgPSAoY2ggPT0gIiciKTsKICAgIH0KICAgIHJldHVybiByZXQoInRleHQiLCAic3Ryb25nIik7CiAgfQoKICAvLyB0dyBjb2RlCiAgZnVuY3Rpb24gdHdUb2tlbkNvZGUoc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIGNoLCBzYiA9IHN0YXRlLmJsb2NrOwoKICAgIGlmIChzYiAmJiBzdHJlYW0uY3VycmVudCgpKSB7CiAgICAgIHJldHVybiByZXQoImNvZGUiLCAiY29tbWVudCIpOwogICAgfQoKICAgIGlmICghc2IgJiYgc3RyZWFtLm1hdGNoKHJlVW50aWxDb2RlU3RvcCkpIHsKICAgICAgc3RhdGUudG9rZW5pemUgPSBqc1Rva2VuQmFzZTsKICAgICAgcmV0dXJuIHJldCgiY29kZSIsICJjb21tZW50Iik7CiAgICB9CgogICAgaWYgKHNiICYmIHN0cmVhbS5zb2woKSAmJiBzdHJlYW0ubWF0Y2gocmVDb2RlQmxvY2tTdG9wKSkgewogICAgICBzdGF0ZS50b2tlbml6ZSA9IGpzVG9rZW5CYXNlOwogICAgICByZXR1cm4gcmV0KCJjb2RlIiwgImNvbW1lbnQiKTsKICAgIH0KCiAgICBjaCA9IHN0cmVhbS5uZXh0KCk7CiAgICByZXR1cm4gKHNiKSA/IHJldCgiY29kZSIsICJjb21tZW50IikgOiByZXQoImNvZGUiLCAiY29tbWVudCIpOwogIH0KCiAgLy8gdHcgZW0gLyBpdGFsaWMKICBmdW5jdGlvbiB0d1Rva2VuRW0oc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIG1heWJlRW5kID0gZmFsc2UsCiAgICBjaDsKICAgIHdoaWxlIChjaCA9IHN0cmVhbS5uZXh0KCkpIHsKICAgICAgaWYgKGNoID09ICIvIiAmJiBtYXliZUVuZCkgewogICAgICAgIHN0YXRlLnRva2VuaXplID0ganNUb2tlbkJhc2U7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgbWF5YmVFbmQgPSAoY2ggPT0gIi8iKTsKICAgIH0KICAgIHJldHVybiByZXQoInRleHQiLCAiZW0iKTsKICB9CgogIC8vIHR3IHVuZGVybGluZWQgdGV4dAogIGZ1bmN0aW9uIHR3VG9rZW5VbmRlcmxpbmUoc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIG1heWJlRW5kID0gZmFsc2UsCiAgICBjaDsKICAgIHdoaWxlIChjaCA9IHN0cmVhbS5uZXh0KCkpIHsKICAgICAgaWYgKGNoID09ICJfIiAmJiBtYXliZUVuZCkgewogICAgICAgIHN0YXRlLnRva2VuaXplID0ganNUb2tlbkJhc2U7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgbWF5YmVFbmQgPSAoY2ggPT0gIl8iKTsKICAgIH0KICAgIHJldHVybiByZXQoInRleHQiLCAidW5kZXJsaW5lZCIpOwogIH0KCiAgLy8gdHcgc3RyaWtlIHRocm91Z2ggdGV4dCBsb29rcyB1Z2x5CiAgLy8gY2hhbmdlIENTUyBpZiBuZWVkZWQKICBmdW5jdGlvbiB0d1Rva2VuU3RyaWtlKHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBtYXliZUVuZCA9IGZhbHNlLCBjaDsKCiAgICB3aGlsZSAoY2ggPSBzdHJlYW0ubmV4dCgpKSB7CiAgICAgIGlmIChjaCA9PSAiLSIgJiYgbWF5YmVFbmQpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IGpzVG9rZW5CYXNlOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIG1heWJlRW5kID0gKGNoID09ICItIik7CiAgICB9CiAgICByZXR1cm4gcmV0KCJ0ZXh0IiwgInN0cmlrZXRocm91Z2giKTsKICB9CgogIC8vIG1hY3JvCiAgZnVuY3Rpb24gdHdUb2tlbk1hY3JvKHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBjaCwgd29yZCwga25vd247CgogICAgaWYgKHN0cmVhbS5jdXJyZW50KCkgPT0gJzw8JykgewogICAgICByZXR1cm4gcmV0KCdicmFjZScsICdtYWNybycpOwogICAgfQoKICAgIGNoID0gc3RyZWFtLm5leHQoKTsKICAgIGlmICghY2gpIHsKICAgICAgc3RhdGUudG9rZW5pemUgPSBqc1Rva2VuQmFzZTsKICAgICAgcmV0dXJuIHJldChjaCk7CiAgICB9CiAgICBpZiAoY2ggPT0gIj4iKSB7CiAgICAgIGlmIChzdHJlYW0ucGVlaygpID09ICc+JykgewogICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgc3RhdGUudG9rZW5pemUgPSBqc1Rva2VuQmFzZTsKICAgICAgICByZXR1cm4gcmV0KCJicmFjZSIsICJtYWNybyIpOwogICAgICB9CiAgICB9CgogICAgc3RyZWFtLmVhdFdoaWxlKC9bXHdcJF9dLyk7CiAgICB3b3JkID0gc3RyZWFtLmN1cnJlbnQoKTsKICAgIGtub3duID0ga2V5d29yZHMucHJvcGVydHlJc0VudW1lcmFibGUod29yZCkgJiYga2V5d29yZHNbd29yZF07CgogICAgaWYgKGtub3duKSB7CiAgICAgIHJldHVybiByZXQoa25vd24udHlwZSwga25vd24uc3R5bGUsIHdvcmQpOwogICAgfQogICAgZWxzZSB7CiAgICAgIHJldHVybiByZXQoIm1hY3JvIiwgbnVsbCwgd29yZCk7CiAgICB9CiAgfQoKICAvLyBJbnRlcmZhY2UKICByZXR1cm4gewogICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24gKCkgewogICAgICByZXR1cm4gewogICAgICAgIHRva2VuaXplOiBqc1Rva2VuQmFzZSwKICAgICAgICBpbmRlbnRlZDogMCwKICAgICAgICBsZXZlbDogMAogICAgICB9OwogICAgfSwKCiAgICB0b2tlbjogZnVuY3Rpb24gKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgaWYgKHN0cmVhbS5lYXRTcGFjZSgpKSByZXR1cm4gbnVsbDsKICAgICAgdmFyIHN0eWxlID0gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CiAgICAgIHJldHVybiBzdHlsZTsKICAgIH0sCgogICAgZWxlY3RyaWNDaGFyczogIiIKICB9Owp9KTsKCkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC94LXRpZGRseXdpa2kiLCAidGlkZGx5d2lraSIpOwp9KTsKCi8vfX19Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/tiki/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/tiki/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogVGlraSB3aWtpIG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9InRpa2kuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9InRpa2kuanMiPjwvc2NyaXB0Pgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPi5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazt9PC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aW1nIGlkPWxvZ28gc3JjPSIuLi8uLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5MYW5ndWFnZSBtb2RlczwvYT4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+VGlraSB3aWtpPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5UaWtpIHdpa2kgbW9kZTwvaDI+CgoKPGRpdj48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgpIZWFkaW5ncwohSGVhZGVyIDEKISFIZWFkZXIgMgohISFIZWFkZXIgMwohISEhSGVhZGVyIDQKISEhISFIZWFkZXIgNQohISEhISFIZWFkZXIgNgoKU3R5bGluZwotPXRpdGxlYmFyPS0KXl4gQm94IG9uIG11bHRpCmxpbmVzCm9mIGNvbnRlbnReXgpfX2JvbGRfXwonJ2l0YWxpYycnCj09PXVuZGVybGluZT09PQo6OmNlbnRlcjo6Ci0tTGluZSBUaHJvdWdoLS0KCk9wZXJhdG9ycwp+bnB+Tm8gcGFyc2V+L25wfgoKTGluawpbbGlua3xkZXNjfG5vY2FjaGVdCgpXaWtpCigoV2lraSkpCigoV2lraXxkZXNjKSkKKChXaWtpfGRlc2N8dGltZW91dCkpCgpUYWJsZQp8fHJvdzEgY29sMXxyb3cxIGNvbDJ8cm93MSBjb2wzCnJvdzIgY29sMXxyb3cyIGNvbDJ8cm93MiBjb2wzCnJvdzMgY29sMXxyb3czIGNvbDJ8cm93MyBjb2wzfHwKCkxpc3RzOgoqYmxhCioqYmxhLTEKKytjb250aW51ZS1ibGEtMQoqKipibGEtMgorK2NvbnRpbnVlLWJsYS0xCipibGEKK2NvbnRpbnVlLWJsYQojYmxhCioqIHRyYS1sYS1sYQorY29udGludWUtYmxhCiNibGEKClBsdWdpbiAoc3RhbmRhcmQpOgp7UExVR0lOKGF0dHI9Im15IGF0dHIiKX0KUGx1Z2luIEJvZHkKe1BMVUdJTn0KClBsdWdpbiAoaW5saW5lKToKe3BsdWdpbiBhdHRyPSJteSBhdHRyIn0KPC90ZXh0YXJlYT48L2Rpdj4KCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KCXZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICAgICAgbW9kZTogJ3Rpa2knLCAgICAgIAogICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlCiAgICB9KTsKPC9zY3JpcHQ+Cgo8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/tiki/tiki.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LmNtLXR3LXN5bnRheGVycm9yIHsKCWNvbG9yOiAjRkZGOwoJYmFja2dyb3VuZC1jb2xvcjogIzkwMDsKfQoKLmNtLXR3LWRlbGV0ZWQgewoJdGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7Cn0KCi5jbS10dy1oZWFkZXI1IHsKCWZvbnQtd2VpZ2h0OiBib2xkOwp9Ci5jbS10dy1saXN0aXRlbTpmaXJzdC1jaGlsZCB7IC8qQWRkZWQgZmlyc3QgY2hpbGQgdG8gZml4IGR1cGxpY2F0ZSBwYWRkaW5nIHdoZW4gaGlnaGxpZ2h0aW5nKi8KCXBhZGRpbmctbGVmdDogMTBweDsKfQoKLmNtLXR3LWJveCB7Cglib3JkZXItdG9wLXdpZHRoOiAwcHggISBpbXBvcnRhbnQ7Cglib3JkZXItc3R5bGU6IHNvbGlkOwoJYm9yZGVyLXdpZHRoOiAxcHg7Cglib3JkZXItY29sb3I6IGluaGVyaXQ7Cn0KCi5jbS10dy11bmRlcmxpbmUgewoJdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7Cn0=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/tiki/tiki.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCd0aWtpJywgZnVuY3Rpb24oY29uZmlnKSB7CiAgZnVuY3Rpb24gaW5CbG9jayhzdHlsZSwgdGVybWluYXRvciwgcmV0dXJuVG9rZW5pemVyKSB7CiAgICByZXR1cm4gZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICB3aGlsZSAoIXN0cmVhbS5lb2woKSkgewogICAgICAgIGlmIChzdHJlYW0ubWF0Y2godGVybWluYXRvcikpIHsKICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gaW5UZXh0OwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgIH0KCiAgICAgIGlmIChyZXR1cm5Ub2tlbml6ZXIpIHN0YXRlLnRva2VuaXplID0gcmV0dXJuVG9rZW5pemVyOwoKICAgICAgcmV0dXJuIHN0eWxlOwogICAgfTsKICB9CgogIGZ1bmN0aW9uIGluTGluZShzdHlsZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgd2hpbGUoIXN0cmVhbS5lb2woKSkgewogICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgIH0KICAgICAgc3RhdGUudG9rZW5pemUgPSBpblRleHQ7CiAgICAgIHJldHVybiBzdHlsZTsKICAgIH07CiAgfQoKICBmdW5jdGlvbiBpblRleHQoc3RyZWFtLCBzdGF0ZSkgewogICAgZnVuY3Rpb24gY2hhaW4ocGFyc2VyKSB7CiAgICAgIHN0YXRlLnRva2VuaXplID0gcGFyc2VyOwogICAgICByZXR1cm4gcGFyc2VyKHN0cmVhbSwgc3RhdGUpOwogICAgfQoKICAgIHZhciBzb2wgPSBzdHJlYW0uc29sKCk7CiAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpOwoKICAgIC8vbm9uIHN0YXJ0IG9mIGxpbmUKICAgIHN3aXRjaCAoY2gpIHsgLy9zd2l0Y2ggaXMgZ2VuZXJhbGx5IG11Y2ggZmFzdGVyIHRoYW4gaWYsIHNvIGl0IGlzIHVzZWQgaGVyZQogICAgY2FzZSAieyI6IC8vcGx1Z2luCiAgICAgIHN0cmVhbS5lYXQoIi8iKTsKICAgICAgc3RyZWFtLmVhdFNwYWNlKCk7CiAgICAgIHZhciB0YWdOYW1lID0gIiI7CiAgICAgIHZhciBjOwogICAgICB3aGlsZSAoKGMgPSBzdHJlYW0uZWF0KC9bXlxzXHUwMGEwPVwiXCdcLz8ofV0vKSkpIHRhZ05hbWUgKz0gYzsKICAgICAgc3RhdGUudG9rZW5pemUgPSBpblBsdWdpbjsKICAgICAgcmV0dXJuICJ0YWciOwogICAgICBicmVhazsKICAgIGNhc2UgIl8iOiAvL2JvbGQKICAgICAgaWYgKHN0cmVhbS5lYXQoIl8iKSkgewogICAgICAgIHJldHVybiBjaGFpbihpbkJsb2NrKCJzdHJvbmciLCAiX18iLCBpblRleHQpKTsKICAgICAgfQogICAgICBicmVhazsKICAgIGNhc2UgIiciOiAvL2l0YWxpY3MKICAgICAgaWYgKHN0cmVhbS5lYXQoIiciKSkgewogICAgICAgIC8vIEl0YWxpYyB0ZXh0CiAgICAgICAgcmV0dXJuIGNoYWluKGluQmxvY2soImVtIiwgIicnIiwgaW5UZXh0KSk7CiAgICAgIH0KICAgICAgYnJlYWs7CiAgICBjYXNlICIoIjovLyBXaWtpIExpbmsKICAgICAgaWYgKHN0cmVhbS5lYXQoIigiKSkgewogICAgICAgIHJldHVybiBjaGFpbihpbkJsb2NrKCJ2YXJpYWJsZS0yIiwgIikpIiwgaW5UZXh0KSk7CiAgICAgIH0KICAgICAgYnJlYWs7CiAgICBjYXNlICJbIjovLyBXZWJsaW5rCiAgICAgIHJldHVybiBjaGFpbihpbkJsb2NrKCJ2YXJpYWJsZS0zIiwgIl0iLCBpblRleHQpKTsKICAgICAgYnJlYWs7CiAgICBjYXNlICJ8IjogLy90YWJsZQogICAgICBpZiAoc3RyZWFtLmVhdCgifCIpKSB7CiAgICAgICAgcmV0dXJuIGNoYWluKGluQmxvY2soImNvbW1lbnQiLCAifHwiKSk7CiAgICAgIH0KICAgICAgYnJlYWs7CiAgICBjYXNlICItIjoKICAgICAgaWYgKHN0cmVhbS5lYXQoIj0iKSkgey8vdGl0bGVCYXIKICAgICAgICByZXR1cm4gY2hhaW4oaW5CbG9jaygiaGVhZGVyIHN0cmluZyIsICI9LSIsIGluVGV4dCkpOwogICAgICB9IGVsc2UgaWYgKHN0cmVhbS5lYXQoIi0iKSkgey8vZGVsZXRlZAogICAgICAgIHJldHVybiBjaGFpbihpbkJsb2NrKCJlcnJvciB0dy1kZWxldGVkIiwgIi0tIiwgaW5UZXh0KSk7CiAgICAgIH0KICAgICAgYnJlYWs7CiAgICBjYXNlICI9IjogLy91bmRlcmxpbmUKICAgICAgaWYgKHN0cmVhbS5tYXRjaCgiPT0iKSkgewogICAgICAgIHJldHVybiBjaGFpbihpbkJsb2NrKCJ0dy11bmRlcmxpbmUiLCAiPT09IiwgaW5UZXh0KSk7CiAgICAgIH0KICAgICAgYnJlYWs7CiAgICBjYXNlICI6IjoKICAgICAgaWYgKHN0cmVhbS5lYXQoIjoiKSkgewogICAgICAgIHJldHVybiBjaGFpbihpbkJsb2NrKCJjb21tZW50IiwgIjo6IikpOwogICAgICB9CiAgICAgIGJyZWFrOwogICAgY2FzZSAiXiI6IC8vYm94CiAgICAgIHJldHVybiBjaGFpbihpbkJsb2NrKCJ0dy1ib3giLCAiXiIpKTsKICAgICAgYnJlYWs7CiAgICBjYXNlICJ+IjogLy9ucAogICAgICBpZiAoc3RyZWFtLm1hdGNoKCJucH4iKSkgewogICAgICAgIHJldHVybiBjaGFpbihpbkJsb2NrKCJtZXRhIiwgIn4vbnB+IikpOwogICAgICB9CiAgICAgIGJyZWFrOwogICAgfQoKICAgIC8vc3RhcnQgb2YgbGluZSB0eXBlcwogICAgaWYgKHNvbCkgewogICAgICBzd2l0Y2ggKGNoKSB7CiAgICAgIGNhc2UgIiEiOiAvL2hlYWRlciBhdCBzdGFydCBvZiBsaW5lCiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgnISEhISEnKSkgewogICAgICAgICAgcmV0dXJuIGNoYWluKGluTGluZSgiaGVhZGVyIHN0cmluZyIpKTsKICAgICAgICB9IGVsc2UgaWYgKHN0cmVhbS5tYXRjaCgnISEhIScpKSB7CiAgICAgICAgICByZXR1cm4gY2hhaW4oaW5MaW5lKCJoZWFkZXIgc3RyaW5nIikpOwogICAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLm1hdGNoKCchISEnKSkgewogICAgICAgICAgcmV0dXJuIGNoYWluKGluTGluZSgiaGVhZGVyIHN0cmluZyIpKTsKICAgICAgICB9IGVsc2UgaWYgKHN0cmVhbS5tYXRjaCgnISEnKSkgewogICAgICAgICAgcmV0dXJuIGNoYWluKGluTGluZSgiaGVhZGVyIHN0cmluZyIpKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIGNoYWluKGluTGluZSgiaGVhZGVyIHN0cmluZyIpKTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgIioiOiAvL3Vub3JkZXJlZCBsaXN0IGxpbmUgaXRlbSwgb3IgPGxpIC8+IGF0IHN0YXJ0IG9mIGxpbmUKICAgICAgY2FzZSAiIyI6IC8vb3JkZXJlZCBsaXN0IGxpbmUgaXRlbSwgb3IgPGxpIC8+IGF0IHN0YXJ0IG9mIGxpbmUKICAgICAgY2FzZSAiKyI6IC8vb3JkZXJlZCBsaXN0IGxpbmUgaXRlbSwgb3IgPGxpIC8+IGF0IHN0YXJ0IG9mIGxpbmUKICAgICAgICByZXR1cm4gY2hhaW4oaW5MaW5lKCJ0dy1saXN0aXRlbSBicmFja2V0IikpOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CgogICAgLy9zdHJlYW0uZWF0V2hpbGUoL1sme10vKTsgd2FzIGVhdGluZyB1cCBwbHVnaW5zLCB0dXJuZWQgb2ZmIHRvIGFjdCBsZXNzIGxpa2UgaHRtbCBhbmQgbW9yZSBsaWtlIHRpa2kKICAgIHJldHVybiBudWxsOwogIH0KCiAgdmFyIGluZGVudFVuaXQgPSBjb25maWcuaW5kZW50VW5pdDsKCiAgLy8gUmV0dXJuIHZhcmlhYmxlcyBmb3IgdG9rZW5pemVycwogIHZhciBwbHVnaW5OYW1lLCB0eXBlOwogIGZ1bmN0aW9uIGluUGx1Z2luKHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBjaCA9IHN0cmVhbS5uZXh0KCk7CiAgICB2YXIgcGVlayA9IHN0cmVhbS5wZWVrKCk7CgogICAgaWYgKGNoID09ICJ9IikgewogICAgICBzdGF0ZS50b2tlbml6ZSA9IGluVGV4dDsKICAgICAgLy90eXBlID0gY2ggPT0gIikiID8gImVuZFBsdWdpbiIgOiAic2VsZmNsb3NlUGx1Z2luIjsgaW5QbHVnaW4KICAgICAgcmV0dXJuICJ0YWciOwogICAgfSBlbHNlIGlmIChjaCA9PSAiKCIgfHwgY2ggPT0gIikiKSB7CiAgICAgIHJldHVybiAiYnJhY2tldCI7CiAgICB9IGVsc2UgaWYgKGNoID09ICI9IikgewogICAgICB0eXBlID0gImVxdWFscyI7CgogICAgICBpZiAocGVlayA9PSAiPiIpIHsKICAgICAgICBjaCA9IHN0cmVhbS5uZXh0KCk7CiAgICAgICAgcGVlayA9IHN0cmVhbS5wZWVrKCk7CiAgICAgIH0KCiAgICAgIC8vaGVyZSB3ZSBkZXRlY3QgdmFsdWVzIGRpcmVjdGx5IGFmdGVyIGVxdWFsIGNoYXJhY3RlciB3aXRoIG5vIHF1b3RlcwogICAgICBpZiAoIS9bXCdcIl0vLnRlc3QocGVlaykpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IGluQXR0cmlidXRlTm9RdW90ZSgpOwogICAgICB9CiAgICAgIC8vZW5kIGRldGVjdCB2YWx1ZXMKCiAgICAgIHJldHVybiAib3BlcmF0b3IiOwogICAgfSBlbHNlIGlmICgvW1wnXCJdLy50ZXN0KGNoKSkgewogICAgICBzdGF0ZS50b2tlbml6ZSA9IGluQXR0cmlidXRlKGNoKTsKICAgICAgcmV0dXJuIHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgfSBlbHNlIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXlxzXHUwMGEwPVwiXCdcLz9dLyk7CiAgICAgIHJldHVybiAia2V5d29yZCI7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBpbkF0dHJpYnV0ZShxdW90ZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgd2hpbGUgKCFzdHJlYW0uZW9sKCkpIHsKICAgICAgICBpZiAoc3RyZWFtLm5leHQoKSA9PSBxdW90ZSkgewogICAgICAgICAgc3RhdGUudG9rZW5pemUgPSBpblBsdWdpbjsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gInN0cmluZyI7CiAgICB9OwogIH0KCiAgZnVuY3Rpb24gaW5BdHRyaWJ1dGVOb1F1b3RlKCkgewogICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgd2hpbGUgKCFzdHJlYW0uZW9sKCkpIHsKICAgICAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpOwogICAgICAgIHZhciBwZWVrID0gc3RyZWFtLnBlZWsoKTsKICAgICAgICBpZiAoY2ggPT0gIiAiIHx8IGNoID09ICIsIiB8fCAvWyApfV0vLnRlc3QocGVlaykpIHsKICAgICAgc3RhdGUudG9rZW5pemUgPSBpblBsdWdpbjsKICAgICAgYnJlYWs7CiAgICB9CiAgfQogIHJldHVybiAic3RyaW5nIjsKfTsKICAgICAgICAgICAgICAgICAgICAgfQoKdmFyIGN1clN0YXRlLCBzZXRTdHlsZTsKZnVuY3Rpb24gcGFzcygpIHsKICBmb3IgKHZhciBpID0gYXJndW1lbnRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBjdXJTdGF0ZS5jYy5wdXNoKGFyZ3VtZW50c1tpXSk7Cn0KCmZ1bmN0aW9uIGNvbnQoKSB7CiAgcGFzcy5hcHBseShudWxsLCBhcmd1bWVudHMpOwogIHJldHVybiB0cnVlOwp9CgpmdW5jdGlvbiBwdXNoQ29udGV4dChwbHVnaW5OYW1lLCBzdGFydE9mTGluZSkgewogIHZhciBub0luZGVudCA9IGN1clN0YXRlLmNvbnRleHQgJiYgY3VyU3RhdGUuY29udGV4dC5ub0luZGVudDsKICBjdXJTdGF0ZS5jb250ZXh0ID0gewogICAgcHJldjogY3VyU3RhdGUuY29udGV4dCwKICAgIHBsdWdpbk5hbWU6IHBsdWdpbk5hbWUsCiAgICBpbmRlbnQ6IGN1clN0YXRlLmluZGVudGVkLAogICAgc3RhcnRPZkxpbmU6IHN0YXJ0T2ZMaW5lLAogICAgbm9JbmRlbnQ6IG5vSW5kZW50CiAgfTsKfQoKZnVuY3Rpb24gcG9wQ29udGV4dCgpIHsKICBpZiAoY3VyU3RhdGUuY29udGV4dCkgY3VyU3RhdGUuY29udGV4dCA9IGN1clN0YXRlLmNvbnRleHQucHJldjsKfQoKZnVuY3Rpb24gZWxlbWVudCh0eXBlKSB7CiAgaWYgKHR5cGUgPT0gIm9wZW5QbHVnaW4iKSB7Y3VyU3RhdGUucGx1Z2luTmFtZSA9IHBsdWdpbk5hbWU7IHJldHVybiBjb250KGF0dHJpYnV0ZXMsIGVuZHBsdWdpbihjdXJTdGF0ZS5zdGFydE9mTGluZSkpO30KICBlbHNlIGlmICh0eXBlID09ICJjbG9zZVBsdWdpbiIpIHsKICAgIHZhciBlcnIgPSBmYWxzZTsKICAgIGlmIChjdXJTdGF0ZS5jb250ZXh0KSB7CiAgICAgIGVyciA9IGN1clN0YXRlLmNvbnRleHQucGx1Z2luTmFtZSAhPSBwbHVnaW5OYW1lOwogICAgICBwb3BDb250ZXh0KCk7CiAgICB9IGVsc2UgewogICAgICBlcnIgPSB0cnVlOwogICAgfQogICAgaWYgKGVycikgc2V0U3R5bGUgPSAiZXJyb3IiOwogICAgcmV0dXJuIGNvbnQoZW5kY2xvc2VwbHVnaW4oZXJyKSk7CiAgfQogIGVsc2UgaWYgKHR5cGUgPT0gInN0cmluZyIpIHsKICAgIGlmICghY3VyU3RhdGUuY29udGV4dCB8fCBjdXJTdGF0ZS5jb250ZXh0Lm5hbWUgIT0gIiFjZGF0YSIpIHB1c2hDb250ZXh0KCIhY2RhdGEiKTsKICAgIGlmIChjdXJTdGF0ZS50b2tlbml6ZSA9PSBpblRleHQpIHBvcENvbnRleHQoKTsKICAgIHJldHVybiBjb250KCk7CiAgfQogIGVsc2UgcmV0dXJuIGNvbnQoKTsKfQoKZnVuY3Rpb24gZW5kcGx1Z2luKHN0YXJ0T2ZMaW5lKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKHR5cGUpIHsKICAgIGlmICgKICAgICAgdHlwZSA9PSAic2VsZmNsb3NlUGx1Z2luIiB8fAogICAgICAgIHR5cGUgPT0gImVuZFBsdWdpbiIKICAgICkKICAgICAgcmV0dXJuIGNvbnQoKTsKICAgIGlmICh0eXBlID09ICJlbmRQbHVnaW4iKSB7cHVzaENvbnRleHQoY3VyU3RhdGUucGx1Z2luTmFtZSwgc3RhcnRPZkxpbmUpOyByZXR1cm4gY29udCgpO30KICAgIHJldHVybiBjb250KCk7CiAgfTsKfQoKZnVuY3Rpb24gZW5kY2xvc2VwbHVnaW4oZXJyKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKHR5cGUpIHsKICAgIGlmIChlcnIpIHNldFN0eWxlID0gImVycm9yIjsKICAgIGlmICh0eXBlID09ICJlbmRQbHVnaW4iKSByZXR1cm4gY29udCgpOwogICAgcmV0dXJuIHBhc3MoKTsKICB9Owp9CgpmdW5jdGlvbiBhdHRyaWJ1dGVzKHR5cGUpIHsKICBpZiAodHlwZSA9PSAia2V5d29yZCIpIHtzZXRTdHlsZSA9ICJhdHRyaWJ1dGUiOyByZXR1cm4gY29udChhdHRyaWJ1dGVzKTt9CiAgaWYgKHR5cGUgPT0gImVxdWFscyIpIHJldHVybiBjb250KGF0dHZhbHVlLCBhdHRyaWJ1dGVzKTsKICByZXR1cm4gcGFzcygpOwp9CmZ1bmN0aW9uIGF0dHZhbHVlKHR5cGUpIHsKICBpZiAodHlwZSA9PSAia2V5d29yZCIpIHtzZXRTdHlsZSA9ICJzdHJpbmciOyByZXR1cm4gY29udCgpO30KICBpZiAodHlwZSA9PSAic3RyaW5nIikgcmV0dXJuIGNvbnQoYXR0dmFsdWVtYXliZSk7CiAgcmV0dXJuIHBhc3MoKTsKfQpmdW5jdGlvbiBhdHR2YWx1ZW1heWJlKHR5cGUpIHsKICBpZiAodHlwZSA9PSAic3RyaW5nIikgcmV0dXJuIGNvbnQoYXR0dmFsdWVtYXliZSk7CiAgZWxzZSByZXR1cm4gcGFzcygpOwp9CnJldHVybiB7CiAgc3RhcnRTdGF0ZTogZnVuY3Rpb24oKSB7CiAgICByZXR1cm4ge3Rva2VuaXplOiBpblRleHQsIGNjOiBbXSwgaW5kZW50ZWQ6IDAsIHN0YXJ0T2ZMaW5lOiB0cnVlLCBwbHVnaW5OYW1lOiBudWxsLCBjb250ZXh0OiBudWxsfTsKICB9LAogIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICBpZiAoc3RyZWFtLnNvbCgpKSB7CiAgICAgIHN0YXRlLnN0YXJ0T2ZMaW5lID0gdHJ1ZTsKICAgICAgc3RhdGUuaW5kZW50ZWQgPSBzdHJlYW0uaW5kZW50YXRpb24oKTsKICAgIH0KICAgIGlmIChzdHJlYW0uZWF0U3BhY2UoKSkgcmV0dXJuIG51bGw7CgogICAgc2V0U3R5bGUgPSB0eXBlID0gcGx1Z2luTmFtZSA9IG51bGw7CiAgICB2YXIgc3R5bGUgPSBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgIGlmICgoc3R5bGUgfHwgdHlwZSkgJiYgc3R5bGUgIT0gImNvbW1lbnQiKSB7CiAgICAgIGN1clN0YXRlID0gc3RhdGU7CiAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgdmFyIGNvbWIgPSBzdGF0ZS5jYy5wb3AoKSB8fCBlbGVtZW50OwogICAgICAgIGlmIChjb21iKHR5cGUgfHwgc3R5bGUpKSBicmVhazsKICAgICAgfQogICAgfQogICAgc3RhdGUuc3RhcnRPZkxpbmUgPSBmYWxzZTsKICAgIHJldHVybiBzZXRTdHlsZSB8fCBzdHlsZTsKICB9LAogIGluZGVudDogZnVuY3Rpb24oc3RhdGUsIHRleHRBZnRlcikgewogICAgdmFyIGNvbnRleHQgPSBzdGF0ZS5jb250ZXh0OwogICAgaWYgKGNvbnRleHQgJiYgY29udGV4dC5ub0luZGVudCkgcmV0dXJuIDA7CiAgICBpZiAoY29udGV4dCAmJiAvXntcLy8udGVzdCh0ZXh0QWZ0ZXIpKQogICAgICAgIGNvbnRleHQgPSBjb250ZXh0LnByZXY7CiAgICAgICAgd2hpbGUgKGNvbnRleHQgJiYgIWNvbnRleHQuc3RhcnRPZkxpbmUpCiAgICAgICAgICBjb250ZXh0ID0gY29udGV4dC5wcmV2OwogICAgICAgIGlmIChjb250ZXh0KSByZXR1cm4gY29udGV4dC5pbmRlbnQgKyBpbmRlbnRVbml0OwogICAgICAgIGVsc2UgcmV0dXJuIDA7CiAgICAgICB9LAogICAgZWxlY3RyaWNDaGFyczogIi8iCiAgfTsKfSk7CgpDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQvdGlraSIsICJ0aWtpIik7Cgp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/toml/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/toml/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogVE9NTCBNb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9InRvbWwuanMiPjwvc2NyaXB0Pgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPi5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazt9PC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aW1nIGlkPWxvZ28gc3JjPSIuLi8uLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5MYW5ndWFnZSBtb2RlczwvYT4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+VE9NTCBNb2RlPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5UT01MIE1vZGU8L2gyPgo8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgojIFRoaXMgaXMgYSBUT01MIGRvY3VtZW50LiBCb29tLgoKdGl0bGUgPSAiVE9NTCBFeGFtcGxlIgoKW293bmVyXQpuYW1lID0gIlRvbSBQcmVzdG9uLVdlcm5lciIKb3JnYW5pemF0aW9uID0gIkdpdEh1YiIKYmlvID0gIkdpdEh1YiBDb2ZvdW5kZXIgJmFtcDsgQ0VPXG5MaWtlcyB0YXRlciB0b3RzIGFuZCBiZWVyLiIKZG9iID0gMTk3OS0wNS0yN1QwNzozMjowMFogIyBGaXJzdCBjbGFzcyBkYXRlcz8gV2h5IG5vdD8KCltkYXRhYmFzZV0Kc2VydmVyID0gIjE5Mi4xNjguMS4xIgpwb3J0cyA9IFsgODAwMSwgODAwMSwgODAwMiBdCmNvbm5lY3Rpb25fbWF4ID0gNTAwMAplbmFibGVkID0gdHJ1ZQoKW3NlcnZlcnNdCgogICMgWW91IGNhbiBpbmRlbnQgYXMgeW91IHBsZWFzZS4gVGFicyBvciBzcGFjZXMuIFRPTUwgZG9uJ3QgY2FyZS4KICBbc2VydmVycy5hbHBoYV0KICBpcCA9ICIxMC4wLjAuMSIKICBkYyA9ICJlcWRjMTAiCiAgCiAgW3NlcnZlcnMuYmV0YV0KICBpcCA9ICIxMC4wLjAuMiIKICBkYyA9ICJlcWRjMTAiCiAgCltjbGllbnRzXQpkYXRhID0gWyBbImdhbW1hIiwgImRlbHRhIl0sIFsxLCAyXSBdCgojIExpbmUgYnJlYWtzIGFyZSBPSyB3aGVuIGluc2lkZSBhcnJheXMKaG9zdHMgPSBbCiAgImFscGhhIiwKICAib21lZ2EiCl0KPC90ZXh0YXJlYT48L2Zvcm0+CiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgICAgIG1vZGU6IHtuYW1lOiAidG9tbCJ9LAogICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlCiAgICAgIH0pOwogICAgPC9zY3JpcHQ+CiAgICA8aDM+VGhlIFRPTUwgTW9kZTwvaDM+CiAgICAgIDxwPiBDcmVhdGVkIGJ5IEZvcmJlcyBMaW5kZXNheS48L3A+CiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZSBkZWZpbmVkOjwvc3Ryb25nPiA8Y29kZT50ZXh0L3gtdG9tbDwvY29kZT4uPC9wPgogIDwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/toml/toml.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJ0b21sIiwgZnVuY3Rpb24gKCkgewogIHJldHVybiB7CiAgICBzdGFydFN0YXRlOiBmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgaW5TdHJpbmc6IGZhbHNlLAogICAgICAgIHN0cmluZ1R5cGU6ICIiLAogICAgICAgIGxoczogdHJ1ZSwKICAgICAgICBpbkFycmF5OiAwCiAgICAgIH07CiAgICB9LAogICAgdG9rZW46IGZ1bmN0aW9uIChzdHJlYW0sIHN0YXRlKSB7CiAgICAgIC8vY2hlY2sgZm9yIHN0YXRlIGNoYW5nZXMKICAgICAgaWYgKCFzdGF0ZS5pblN0cmluZyAmJiAoKHN0cmVhbS5wZWVrKCkgPT0gJyInKSB8fCAoc3RyZWFtLnBlZWsoKSA9PSAiJyIpKSkgewogICAgICAgIHN0YXRlLnN0cmluZ1R5cGUgPSBzdHJlYW0ucGVlaygpOwogICAgICAgIHN0cmVhbS5uZXh0KCk7IC8vIFNraXAgcXVvdGUKICAgICAgICBzdGF0ZS5pblN0cmluZyA9IHRydWU7IC8vIFVwZGF0ZSBzdGF0ZQogICAgICB9CiAgICAgIGlmIChzdHJlYW0uc29sKCkgJiYgc3RhdGUuaW5BcnJheSA9PT0gMCkgewogICAgICAgIHN0YXRlLmxocyA9IHRydWU7CiAgICAgIH0KICAgICAgLy9yZXR1cm4gc3RhdGUKICAgICAgaWYgKHN0YXRlLmluU3RyaW5nKSB7CiAgICAgICAgd2hpbGUgKHN0YXRlLmluU3RyaW5nICYmICFzdHJlYW0uZW9sKCkpIHsKICAgICAgICAgIGlmIChzdHJlYW0ucGVlaygpID09PSBzdGF0ZS5zdHJpbmdUeXBlKSB7CiAgICAgICAgICAgIHN0cmVhbS5uZXh0KCk7IC8vIFNraXAgcXVvdGUKICAgICAgICAgICAgc3RhdGUuaW5TdHJpbmcgPSBmYWxzZTsgLy8gQ2xlYXIgZmxhZwogICAgICAgICAgfSBlbHNlIGlmIChzdHJlYW0ucGVlaygpID09PSAnXFwnKSB7CiAgICAgICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdHJlYW0ubWF0Y2goL14uW15cXFwiXCddKi8pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gc3RhdGUubGhzID8gInByb3BlcnR5IHN0cmluZyIgOiAic3RyaW5nIjsgLy8gVG9rZW4gc3R5bGUKICAgICAgfSBlbHNlIGlmIChzdGF0ZS5pbkFycmF5ICYmIHN0cmVhbS5wZWVrKCkgPT09ICddJykgewogICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgc3RhdGUuaW5BcnJheS0tOwogICAgICAgIHJldHVybiAnYnJhY2tldCc7CiAgICAgIH0gZWxzZSBpZiAoc3RhdGUubGhzICYmIHN0cmVhbS5wZWVrKCkgPT09ICdbJyAmJiBzdHJlYW0uc2tpcFRvKCddJykpIHsKICAgICAgICBzdHJlYW0ubmV4dCgpOy8vc2tpcCBjbG9zaW5nIF0KICAgICAgICAvLyBhcnJheSBvZiBvYmplY3RzIGhhcyBhbiBleHRyYSBvcGVuICYgY2xvc2UgW10KICAgICAgICBpZiAoc3RyZWFtLnBlZWsoKSA9PT0gJ10nKSBzdHJlYW0ubmV4dCgpOwogICAgICAgIHJldHVybiAiYXRvbSI7CiAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLnBlZWsoKSA9PT0gIiMiKSB7CiAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICAgIHJldHVybiAiY29tbWVudCI7CiAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLmVhdFNwYWNlKCkpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfSBlbHNlIGlmIChzdGF0ZS5saHMgJiYgc3RyZWFtLmVhdFdoaWxlKGZ1bmN0aW9uIChjKSB7IHJldHVybiBjICE9ICc9JyAmJiBjICE9ICcgJzsgfSkpIHsKICAgICAgICByZXR1cm4gInByb3BlcnR5IjsKICAgICAgfSBlbHNlIGlmIChzdGF0ZS5saHMgJiYgc3RyZWFtLnBlZWsoKSA9PT0gIj0iKSB7CiAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgICBzdGF0ZS5saHMgPSBmYWxzZTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfSBlbHNlIGlmICghc3RhdGUubGhzICYmIHN0cmVhbS5tYXRjaCgvXlxkXGRcZFxkW1xkXC1cOlwuVF0qWi8pKSB7CiAgICAgICAgcmV0dXJuICdhdG9tJzsgLy9kYXRlCiAgICAgIH0gZWxzZSBpZiAoIXN0YXRlLmxocyAmJiAoc3RyZWFtLm1hdGNoKCd0cnVlJykgfHwgc3RyZWFtLm1hdGNoKCdmYWxzZScpKSkgewogICAgICAgIHJldHVybiAnYXRvbSc7CiAgICAgIH0gZWxzZSBpZiAoIXN0YXRlLmxocyAmJiBzdHJlYW0ucGVlaygpID09PSAnWycpIHsKICAgICAgICBzdGF0ZS5pbkFycmF5Kys7CiAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgICByZXR1cm4gJ2JyYWNrZXQnOwogICAgICB9IGVsc2UgaWYgKCFzdGF0ZS5saHMgJiYgc3RyZWFtLm1hdGNoKC9eXC0/XGQrKD86XC5cZCspPy8pKSB7CiAgICAgICAgcmV0dXJuICdudW1iZXInOwogICAgICB9IGVsc2UgaWYgKCFzdHJlYW0uZWF0U3BhY2UoKSkgewogICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgIH0KICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfTsKfSk7CgpDb2RlTWlycm9yLmRlZmluZU1JTUUoJ3RleHQveC10b21sJywgJ3RvbWwnKTsKCn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/turtle/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/turtle/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogVHVydGxlIG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0idHVydGxlLmpzIj48L3NjcmlwdD4KPHN0eWxlPi5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazt9PC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aW1nIGlkPWxvZ28gc3JjPSIuLi8uLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5MYW5ndWFnZSBtb2RlczwvYT4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+VHVydGxlPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5UdXJ0bGUgbW9kZTwvaDI+Cjxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+CkBwcmVmaXggZm9hZjogPGh0dHA6Ly94bWxucy5jb20vZm9hZi8wLjEvPiAuCkBwcmVmaXggZ2VvOiA8aHR0cDovL3d3dy53My5vcmcvMjAwMy8wMS9nZW8vd2dzODRfcG9zIz4gLgpAcHJlZml4IHJkZjogPGh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyM+IC4KCjxodHRwOi8vcHVybC5vcmcvbmV0L2JzbGV0dGVuPiAKICAgIGEgZm9hZjpQZXJzb247CiAgICBmb2FmOmludGVyZXN0IDxodHRwOi8vd3d3LnczLm9yZy8yMDAwLzAxL3N3Lz47CiAgICBmb2FmOmJhc2VkX25lYXIgWwogICAgICAgIGdlbzpsYXQgIjM0LjA3MzYxMTEiIDsKICAgICAgICBnZW86bG9uICItMTE4LjM5OTQ0NDQiCiAgIF0KCjwvdGV4dGFyZWE+PC9mb3JtPgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICBtb2RlOiAidGV4dC90dXJ0bGUiLAogICAgICAgIG1hdGNoQnJhY2tldHM6IHRydWUKICAgICAgfSk7CiAgICA8L3NjcmlwdD4KCiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC90dXJ0bGU8L2NvZGU+LjwvcD4KCiAgPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/turtle/turtle.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJ0dXJ0bGUiLCBmdW5jdGlvbihjb25maWcpIHsKICB2YXIgaW5kZW50VW5pdCA9IGNvbmZpZy5pbmRlbnRVbml0OwogIHZhciBjdXJQdW5jOwoKICBmdW5jdGlvbiB3b3JkUmVnZXhwKHdvcmRzKSB7CiAgICByZXR1cm4gbmV3IFJlZ0V4cCgiXig/OiIgKyB3b3Jkcy5qb2luKCJ8IikgKyAiKSQiLCAiaSIpOwogIH0KICB2YXIgb3BzID0gd29yZFJlZ2V4cChbXSk7CiAgdmFyIGtleXdvcmRzID0gd29yZFJlZ2V4cChbIkBwcmVmaXgiLCAiQGJhc2UiLCAiYSJdKTsKICB2YXIgb3BlcmF0b3JDaGFycyA9IC9bKitcLTw+PSZ8XS87CgogIGZ1bmN0aW9uIHRva2VuQmFzZShzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpOwogICAgY3VyUHVuYyA9IG51bGw7CiAgICBpZiAoY2ggPT0gIjwiICYmICFzdHJlYW0ubWF0Y2goL15bXHNcdTAwYTA9XS8sIGZhbHNlKSkgewogICAgICBzdHJlYW0ubWF0Y2goL15bXlxzXHUwMGEwPl0qPj8vKTsKICAgICAgcmV0dXJuICJhdG9tIjsKICAgIH0KICAgIGVsc2UgaWYgKGNoID09ICJcIiIgfHwgY2ggPT0gIiciKSB7CiAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5MaXRlcmFsKGNoKTsKICAgICAgcmV0dXJuIHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgfQogICAgZWxzZSBpZiAoL1t7fVwoXCksXC47XFtcXV0vLnRlc3QoY2gpKSB7CiAgICAgIGN1clB1bmMgPSBjaDsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBlbHNlIGlmIChjaCA9PSAiIyIpIHsKICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICByZXR1cm4gImNvbW1lbnQiOwogICAgfQogICAgZWxzZSBpZiAob3BlcmF0b3JDaGFycy50ZXN0KGNoKSkgewogICAgICBzdHJlYW0uZWF0V2hpbGUob3BlcmF0b3JDaGFycyk7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgZWxzZSBpZiAoY2ggPT0gIjoiKSB7CiAgICAgICAgICByZXR1cm4gIm9wZXJhdG9yIjsKICAgICAgICB9IGVsc2UgewogICAgICBzdHJlYW0uZWF0V2hpbGUoL1tfXHdcZF0vKTsKICAgICAgaWYoc3RyZWFtLnBlZWsoKSA9PSAiOiIpIHsKICAgICAgICByZXR1cm4gInZhcmlhYmxlLTMiOwogICAgICB9IGVsc2UgewogICAgICAgICAgICAgdmFyIHdvcmQgPSBzdHJlYW0uY3VycmVudCgpOwoKICAgICAgICAgICAgIGlmKGtleXdvcmRzLnRlc3Qod29yZCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJtZXRhIjsKICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICBpZihjaCA+PSAiQSIgJiYgY2ggPD0gIloiKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJjb21tZW50IjsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImtleXdvcmQiOwogICAgICAgICAgICAgICAgIH0KICAgICAgfQogICAgICB2YXIgd29yZCA9IHN0cmVhbS5jdXJyZW50KCk7CiAgICAgIGlmIChvcHMudGVzdCh3b3JkKSkKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgZWxzZSBpZiAoa2V5d29yZHMudGVzdCh3b3JkKSkKICAgICAgICByZXR1cm4gIm1ldGEiOwogICAgICBlbHNlCiAgICAgICAgcmV0dXJuICJ2YXJpYWJsZSI7CiAgICB9CiAgfQoKICBmdW5jdGlvbiB0b2tlbkxpdGVyYWwocXVvdGUpIHsKICAgIHJldHVybiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHZhciBlc2NhcGVkID0gZmFsc2UsIGNoOwogICAgICB3aGlsZSAoKGNoID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkgewogICAgICAgIGlmIChjaCA9PSBxdW90ZSAmJiAhZXNjYXBlZCkgewogICAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgZXNjYXBlZCA9ICFlc2NhcGVkICYmIGNoID09ICJcXCI7CiAgICAgIH0KICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgfTsKICB9CgogIGZ1bmN0aW9uIHB1c2hDb250ZXh0KHN0YXRlLCB0eXBlLCBjb2wpIHsKICAgIHN0YXRlLmNvbnRleHQgPSB7cHJldjogc3RhdGUuY29udGV4dCwgaW5kZW50OiBzdGF0ZS5pbmRlbnQsIGNvbDogY29sLCB0eXBlOiB0eXBlfTsKICB9CiAgZnVuY3Rpb24gcG9wQ29udGV4dChzdGF0ZSkgewogICAgc3RhdGUuaW5kZW50ID0gc3RhdGUuY29udGV4dC5pbmRlbnQ7CiAgICBzdGF0ZS5jb250ZXh0ID0gc3RhdGUuY29udGV4dC5wcmV2OwogIH0KCiAgcmV0dXJuIHsKICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4ge3Rva2VuaXplOiB0b2tlbkJhc2UsCiAgICAgICAgICAgICAgY29udGV4dDogbnVsbCwKICAgICAgICAgICAgICBpbmRlbnQ6IDAsCiAgICAgICAgICAgICAgY29sOiAwfTsKICAgIH0sCgogICAgdG9rZW46IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgaWYgKHN0cmVhbS5zb2woKSkgewogICAgICAgIGlmIChzdGF0ZS5jb250ZXh0ICYmIHN0YXRlLmNvbnRleHQuYWxpZ24gPT0gbnVsbCkgc3RhdGUuY29udGV4dC5hbGlnbiA9IGZhbHNlOwogICAgICAgIHN0YXRlLmluZGVudCA9IHN0cmVhbS5pbmRlbnRhdGlvbigpOwogICAgICB9CiAgICAgIGlmIChzdHJlYW0uZWF0U3BhY2UoKSkgcmV0dXJuIG51bGw7CiAgICAgIHZhciBzdHlsZSA9IHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwoKICAgICAgaWYgKHN0eWxlICE9ICJjb21tZW50IiAmJiBzdGF0ZS5jb250ZXh0ICYmIHN0YXRlLmNvbnRleHQuYWxpZ24gPT0gbnVsbCAmJiBzdGF0ZS5jb250ZXh0LnR5cGUgIT0gInBhdHRlcm4iKSB7CiAgICAgICAgc3RhdGUuY29udGV4dC5hbGlnbiA9IHRydWU7CiAgICAgIH0KCiAgICAgIGlmIChjdXJQdW5jID09ICIoIikgcHVzaENvbnRleHQoc3RhdGUsICIpIiwgc3RyZWFtLmNvbHVtbigpKTsKICAgICAgZWxzZSBpZiAoY3VyUHVuYyA9PSAiWyIpIHB1c2hDb250ZXh0KHN0YXRlLCAiXSIsIHN0cmVhbS5jb2x1bW4oKSk7CiAgICAgIGVsc2UgaWYgKGN1clB1bmMgPT0gInsiKSBwdXNoQ29udGV4dChzdGF0ZSwgIn0iLCBzdHJlYW0uY29sdW1uKCkpOwogICAgICBlbHNlIGlmICgvW1xdXH1cKV0vLnRlc3QoY3VyUHVuYykpIHsKICAgICAgICB3aGlsZSAoc3RhdGUuY29udGV4dCAmJiBzdGF0ZS5jb250ZXh0LnR5cGUgPT0gInBhdHRlcm4iKSBwb3BDb250ZXh0KHN0YXRlKTsKICAgICAgICBpZiAoc3RhdGUuY29udGV4dCAmJiBjdXJQdW5jID09IHN0YXRlLmNvbnRleHQudHlwZSkgcG9wQ29udGV4dChzdGF0ZSk7CiAgICAgIH0KICAgICAgZWxzZSBpZiAoY3VyUHVuYyA9PSAiLiIgJiYgc3RhdGUuY29udGV4dCAmJiBzdGF0ZS5jb250ZXh0LnR5cGUgPT0gInBhdHRlcm4iKSBwb3BDb250ZXh0KHN0YXRlKTsKICAgICAgZWxzZSBpZiAoL2F0b218c3RyaW5nfHZhcmlhYmxlLy50ZXN0KHN0eWxlKSAmJiBzdGF0ZS5jb250ZXh0KSB7CiAgICAgICAgaWYgKC9bXH1cXV0vLnRlc3Qoc3RhdGUuY29udGV4dC50eXBlKSkKICAgICAgICAgIHB1c2hDb250ZXh0KHN0YXRlLCAicGF0dGVybiIsIHN0cmVhbS5jb2x1bW4oKSk7CiAgICAgICAgZWxzZSBpZiAoc3RhdGUuY29udGV4dC50eXBlID09ICJwYXR0ZXJuIiAmJiAhc3RhdGUuY29udGV4dC5hbGlnbikgewogICAgICAgICAgc3RhdGUuY29udGV4dC5hbGlnbiA9IHRydWU7CiAgICAgICAgICBzdGF0ZS5jb250ZXh0LmNvbCA9IHN0cmVhbS5jb2x1bW4oKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiBzdHlsZTsKICAgIH0sCgogICAgaW5kZW50OiBmdW5jdGlvbihzdGF0ZSwgdGV4dEFmdGVyKSB7CiAgICAgIHZhciBmaXJzdENoYXIgPSB0ZXh0QWZ0ZXIgJiYgdGV4dEFmdGVyLmNoYXJBdCgwKTsKICAgICAgdmFyIGNvbnRleHQgPSBzdGF0ZS5jb250ZXh0OwogICAgICBpZiAoL1tcXVx9XS8udGVzdChmaXJzdENoYXIpKQogICAgICAgIHdoaWxlIChjb250ZXh0ICYmIGNvbnRleHQudHlwZSA9PSAicGF0dGVybiIpIGNvbnRleHQgPSBjb250ZXh0LnByZXY7CgogICAgICB2YXIgY2xvc2luZyA9IGNvbnRleHQgJiYgZmlyc3RDaGFyID09IGNvbnRleHQudHlwZTsKICAgICAgaWYgKCFjb250ZXh0KQogICAgICAgIHJldHVybiAwOwogICAgICBlbHNlIGlmIChjb250ZXh0LnR5cGUgPT0gInBhdHRlcm4iKQogICAgICAgIHJldHVybiBjb250ZXh0LmNvbDsKICAgICAgZWxzZSBpZiAoY29udGV4dC5hbGlnbikKICAgICAgICByZXR1cm4gY29udGV4dC5jb2wgKyAoY2xvc2luZyA/IDAgOiAxKTsKICAgICAgZWxzZQogICAgICAgIHJldHVybiBjb250ZXh0LmluZGVudCArIChjbG9zaW5nID8gMCA6IGluZGVudFVuaXQpOwogICAgfQogIH07Cn0pOwoKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3R1cnRsZSIsICJ0dXJ0bGUiKTsKCn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/vb/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/vb/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogVkIuTkVUIG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8bGluayBocmVmPSJodHRwOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzP2ZhbWlseT1JbmNvbnNvbGF0YSIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+CjxzY3JpcHQgc3JjPSIuLi8uLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJ2Yi5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii4uLy4uL2FkZG9uL3J1bm1vZGUvcnVubW9kZS5qcyI+PC9zY3JpcHQ+CjxzdHlsZT4KICAgICAgLkNvZGVNaXJyb3Ige2JvcmRlcjogMXB4IHNvbGlkICNhYWE7IGhlaWdodDoyMTBweDsgaGVpZ2h0OiBhdXRvO30KICAgICAgLkNvZGVNaXJyb3Itc2Nyb2xsIHsgb3ZlcmZsb3cteDogYXV0bzsgb3ZlcmZsb3cteTogaGlkZGVuO30KICAgICAgLkNvZGVNaXJyb3IgcHJlIHsgZm9udC1mYW1pbHk6IEluY29uc29sYXRhOyBmb250LXNpemU6IDE0cHh9CiAgICA8L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5WQi5ORVQ8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPlZCLk5FVCBtb2RlPC9oMj4KCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KZnVuY3Rpb24gdGVzdChnb2xkZW4sIHRleHQpIHsKICB2YXIgb2sgPSB0cnVlOwogIHZhciBpID0gMDsKICBmdW5jdGlvbiBjYWxsYmFjayh0b2tlbiwgc3R5bGUsIGxpbmVObywgcG9zKXsKCQkvL2NvbnNvbGUubG9nKFN0cmluZyh0b2tlbikgKyAiICIgKyBTdHJpbmcoc3R5bGUpICsgIiAiICsgU3RyaW5nKGxpbmVObykgKyAiICIgKyBTdHJpbmcocG9zKSk7CiAgICB2YXIgcmVzdWx0ID0gW1N0cmluZyh0b2tlbiksIFN0cmluZyhzdHlsZSldOwogICAgaWYgKGdvbGRlbltpXVswXSAhPSByZXN1bHRbMF0gfHwgZ29sZGVuW2ldWzFdICE9IHJlc3VsdFsxXSl7CiAgICAgIHJldHVybiAiRXJyb3IsIGV4cGVjdGVkOiAiICsgU3RyaW5nKGdvbGRlbltpXSkgKyAiLCBnb3Q6ICIgKyBTdHJpbmcocmVzdWx0KTsKICAgICAgb2sgPSBmYWxzZTsKICAgIH0KICAgIGkrKzsKICB9CiAgQ29kZU1pcnJvci5ydW5Nb2RlKHRleHQsICJ0ZXh0L3gtdmIiLGNhbGxiYWNrKTsgCgogIGlmIChvaykgcmV0dXJuICJUZXN0cyBPSyI7Cn0KZnVuY3Rpb24gdGVzdFR5cGVzKCkgewogIHZhciBnb2xkZW4gPSBbWydJbnRlZ2VyJywna2V5d29yZCddLFsnICcsJ251bGwnXSxbJ0Zsb2F0Jywna2V5d29yZCddXQogIHZhciB0ZXh0ID0gICJJbnRlZ2VyIEZsb2F0IjsKICByZXR1cm4gdGVzdChnb2xkZW4sdGV4dCk7Cn0KZnVuY3Rpb24gdGVzdElmKCl7CiAgdmFyIGdvbGRlbiA9IFtbJ0lmJywna2V5d29yZCddLFsnICcsJ251bGwnXSxbJ1RydWUnLCdrZXl3b3JkJ10sWycgJywnbnVsbCddLFsnRW5kJywna2V5d29yZCddLFsnICcsJ251bGwnXSxbJ0lmJywna2V5d29yZCddXTsKICB2YXIgdGV4dCA9ICdJZiBUcnVlIEVuZCBJZic7CiAgcmV0dXJuIHRlc3QoZ29sZGVuLCB0ZXh0KTsKfQpmdW5jdGlvbiB0ZXN0RGVjbCgpewogICB2YXIgZ29sZGVuID0gW1snRGltJywna2V5d29yZCddLFsnICcsJ251bGwnXSxbJ3gnLCd2YXJpYWJsZSddLFsnICcsJ251bGwnXSxbJ2FzJywna2V5d29yZCddLFsnICcsJ251bGwnXSxbJ0ludGVnZXInLCdrZXl3b3JkJ11dOwogICB2YXIgdGV4dCA9ICdEaW0geCBhcyBJbnRlZ2VyJzsKICAgcmV0dXJuIHRlc3QoZ29sZGVuLCB0ZXh0KTsKfQpmdW5jdGlvbiB0ZXN0QWxsKCl7CiAgdmFyIHJlc3VsdCA9ICIiOwoKICByZXN1bHQgKz0gdGVzdFR5cGVzKCkgKyAiXG4iOwogIHJlc3VsdCArPSB0ZXN0SWYoKSArICJcbiI7CiAgcmVzdWx0ICs9IHRlc3REZWNsKCkgKyAiXG4iOwogIHJldHVybiByZXN1bHQ7Cgp9CmZ1bmN0aW9uIGluaXRUZXh0KGVkaXRvcikgewogIHZhciBjb250ZW50ID0gJ0NsYXNzIHJvY2tldFxuUHJpdmF0ZSBxdWFsaXR5IGFzIERvdWJsZVxuUHVibGljIFN1YiBsYXVuY2goKSBhcyBTdHJpbmdcbmlmIHF1YWxpdHkgPiAwLjhcbmxhdW5jaCA9ICJTdWNjZXNzZnVsIlxuRWxzZVxubGF1bmNoID0gIkZhaWxlZCJcbkVuZCBJZlxuRW5kIHN1YlxuRW5kIGNsYXNzXG4nOwogIGVkaXRvci5zZXRWYWx1ZShjb250ZW50KTsKICBmb3IgKHZhciBpID0wOyBpPCBlZGl0b3IubGluZUNvdW50KCk7IGkrKykgZWRpdG9yLmluZGVudExpbmUoaSk7Cn0KZnVuY3Rpb24gaW5pdCgpIHsKICAgIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzb2x1dGlvbiIpLCB7CiAgICAgICAgbGluZU51bWJlcnM6IHRydWUsCiAgICAgICAgbW9kZTogInRleHQveC12YiIsCiAgICAgICAgcmVhZE9ubHk6IGZhbHNlCiAgICB9KTsKICAgIHJ1blRlc3QoKTsKfQpmdW5jdGlvbiBydW5UZXN0KCkgewoJZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3Rlc3RyZXN1bHQnKS5pbm5lckhUTUwgPSB0ZXN0QWxsKCk7CiAgaW5pdFRleHQoZWRpdG9yKTsKCQp9CmRvY3VtZW50LmJvZHkub25sb2FkID0gaW5pdDsKPC9zY3JpcHQ+CgogIDxkaXYgaWQ9ImVkaXQiPgogIDx0ZXh0YXJlYSBzdHlsZT0id2lkdGg6OTUlO2hlaWdodDoyMDBweDtwYWRkaW5nOjVweDsiIG5hbWU9InNvbHV0aW9uIiBpZD0ic29sdXRpb24iID48L3RleHRhcmVhPgogIDwvZGl2PgogIDxwcmUgaWQ9InRlc3RyZXN1bHQiPjwvcHJlPgogIDxwPk1JTUUgdHlwZSBkZWZpbmVkOiA8Y29kZT50ZXh0L3gtdmI8L2NvZGU+LjwvcD4KCjwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/vb/vb.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJ2YiIsIGZ1bmN0aW9uKGNvbmYsIHBhcnNlckNvbmYpIHsKICAgIHZhciBFUlJPUkNMQVNTID0gJ2Vycm9yJzsKCiAgICBmdW5jdGlvbiB3b3JkUmVnZXhwKHdvcmRzKSB7CiAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAoIl4oKCIgKyB3b3Jkcy5qb2luKCIpfCgiKSArICIpKVxcYiIsICJpIik7CiAgICB9CgogICAgdmFyIHNpbmdsZU9wZXJhdG9ycyA9IG5ldyBSZWdFeHAoIl5bXFwrXFwtXFwqLyUmXFxcXHxcXF5+PD4hXSIpOwogICAgdmFyIHNpbmdsZURlbGltaXRlcnMgPSBuZXcgUmVnRXhwKCdeW1xcKFxcKVxcW1xcXVxce1xcfUAsOmA9O1xcLl0nKTsKICAgIHZhciBkb3VibGVPcGVyYXRvcnMgPSBuZXcgUmVnRXhwKCJeKCg9PSl8KDw+KXwoPD0pfCg+PSl8KDw+KXwoPDwpfCg+Pil8KC8vKXwoXFwqXFwqKSkiKTsKICAgIHZhciBkb3VibGVEZWxpbWl0ZXJzID0gbmV3IFJlZ0V4cCgiXigoXFwrPSl8KFxcLT0pfChcXCo9KXwoJT0pfCgvPSl8KCY9KXwoXFx8PSl8KFxcXj0pKSIpOwogICAgdmFyIHRyaXBsZURlbGltaXRlcnMgPSBuZXcgUmVnRXhwKCJeKCgvLz0pfCg+Pj0pfCg8PD0pfChcXCpcXCo9KSkiKTsKICAgIHZhciBpZGVudGlmaWVycyA9IG5ldyBSZWdFeHAoIl5bX0EtWmEtel1bX0EtWmEtejAtOV0qIik7CgogICAgdmFyIG9wZW5pbmdLZXl3b3JkcyA9IFsnY2xhc3MnLCdtb2R1bGUnLCAnc3ViJywnZW51bScsJ3NlbGVjdCcsJ3doaWxlJywnaWYnLCdmdW5jdGlvbicsICAnZ2V0Jywnc2V0JywncHJvcGVydHknLCAndHJ5J107CiAgICB2YXIgbWlkZGxlS2V5d29yZHMgPSBbJ2Vsc2UnLCdlbHNlaWYnLCdjYXNlJywgJ2NhdGNoJ107CiAgICB2YXIgZW5kS2V5d29yZHMgPSBbJ25leHQnLCdsb29wJ107CgogICAgdmFyIHdvcmRPcGVyYXRvcnMgPSB3b3JkUmVnZXhwKFsnYW5kJywgJ29yJywgJ25vdCcsICd4b3InLCAnaW4nXSk7CiAgICB2YXIgY29tbW9ua2V5d29yZHMgPSBbJ2FzJywgJ2RpbScsICdicmVhaycsICAnY29udGludWUnLCdvcHRpb25hbCcsICd0aGVuJywgICd1bnRpbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgJ2dvdG8nLCAnYnl2YWwnLCdieXJlZicsJ25ldycsJ2hhbmRsZXMnLCdwcm9wZXJ0eScsICdyZXR1cm4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICdjb25zdCcsJ3ByaXZhdGUnLCAncHJvdGVjdGVkJywgJ2ZyaWVuZCcsICdwdWJsaWMnLCAnc2hhcmVkJywgJ3N0YXRpYycsICd0cnVlJywnZmFsc2UnXTsKICAgIHZhciBjb21tb250eXBlcyA9IFsnaW50ZWdlcicsJ3N0cmluZycsJ2RvdWJsZScsJ2RlY2ltYWwnLCdib29sZWFuJywnc2hvcnQnLCdjaGFyJywgJ2Zsb2F0Jywnc2luZ2xlJ107CgogICAgdmFyIGtleXdvcmRzID0gd29yZFJlZ2V4cChjb21tb25rZXl3b3Jkcyk7CiAgICB2YXIgdHlwZXMgPSB3b3JkUmVnZXhwKGNvbW1vbnR5cGVzKTsKICAgIHZhciBzdHJpbmdQcmVmaXhlcyA9ICciJzsKCiAgICB2YXIgb3BlbmluZyA9IHdvcmRSZWdleHAob3BlbmluZ0tleXdvcmRzKTsKICAgIHZhciBtaWRkbGUgPSB3b3JkUmVnZXhwKG1pZGRsZUtleXdvcmRzKTsKICAgIHZhciBjbG9zaW5nID0gd29yZFJlZ2V4cChlbmRLZXl3b3Jkcyk7CiAgICB2YXIgZG91YmxlQ2xvc2luZyA9IHdvcmRSZWdleHAoWydlbmQnXSk7CiAgICB2YXIgZG9PcGVuaW5nID0gd29yZFJlZ2V4cChbJ2RvJ10pOwoKICAgIHZhciBpbmRlbnRJbmZvID0gbnVsbDsKCgoKCiAgICBmdW5jdGlvbiBpbmRlbnQoX3N0cmVhbSwgc3RhdGUpIHsKICAgICAgc3RhdGUuY3VycmVudEluZGVudCsrOwogICAgfQoKICAgIGZ1bmN0aW9uIGRlZGVudChfc3RyZWFtLCBzdGF0ZSkgewogICAgICBzdGF0ZS5jdXJyZW50SW5kZW50LS07CiAgICB9CiAgICAvLyB0b2tlbml6ZXJzCiAgICBmdW5jdGlvbiB0b2tlbkJhc2Uoc3RyZWFtLCBzdGF0ZSkgewogICAgICAgIGlmIChzdHJlYW0uZWF0U3BhY2UoKSkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgIHZhciBjaCA9IHN0cmVhbS5wZWVrKCk7CgogICAgICAgIC8vIEhhbmRsZSBDb21tZW50cwogICAgICAgIGlmIChjaCA9PT0gIiciKSB7CiAgICAgICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgICAgICAgcmV0dXJuICdjb21tZW50JzsKICAgICAgICB9CgoKICAgICAgICAvLyBIYW5kbGUgTnVtYmVyIExpdGVyYWxzCiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXigoJkgpfCgmTykpP1swLTlcLmEtZl0vaSwgZmFsc2UpKSB7CiAgICAgICAgICAgIHZhciBmbG9hdExpdGVyYWwgPSBmYWxzZTsKICAgICAgICAgICAgLy8gRmxvYXRzCiAgICAgICAgICAgIGlmIChzdHJlYW0ubWF0Y2goL15cZCpcLlxkK0Y/L2kpKSB7IGZsb2F0TGl0ZXJhbCA9IHRydWU7IH0KICAgICAgICAgICAgZWxzZSBpZiAoc3RyZWFtLm1hdGNoKC9eXGQrXC5cZCpGPy8pKSB7IGZsb2F0TGl0ZXJhbCA9IHRydWU7IH0KICAgICAgICAgICAgZWxzZSBpZiAoc3RyZWFtLm1hdGNoKC9eXC5cZCtGPy8pKSB7IGZsb2F0TGl0ZXJhbCA9IHRydWU7IH0KCiAgICAgICAgICAgIGlmIChmbG9hdExpdGVyYWwpIHsKICAgICAgICAgICAgICAgIC8vIEZsb2F0IGxpdGVyYWxzIG1heSBiZSAiaW1hZ2luYXJ5IgogICAgICAgICAgICAgICAgc3RyZWFtLmVhdCgvSi9pKTsKICAgICAgICAgICAgICAgIHJldHVybiAnbnVtYmVyJzsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBJbnRlZ2VycwogICAgICAgICAgICB2YXIgaW50TGl0ZXJhbCA9IGZhbHNlOwogICAgICAgICAgICAvLyBIZXgKICAgICAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXiZIWzAtOWEtZl0rL2kpKSB7IGludExpdGVyYWwgPSB0cnVlOyB9CiAgICAgICAgICAgIC8vIE9jdGFsCiAgICAgICAgICAgIGVsc2UgaWYgKHN0cmVhbS5tYXRjaCgvXiZPWzAtN10rL2kpKSB7IGludExpdGVyYWwgPSB0cnVlOyB9CiAgICAgICAgICAgIC8vIERlY2ltYWwKICAgICAgICAgICAgZWxzZSBpZiAoc3RyZWFtLm1hdGNoKC9eWzEtOV1cZCpGPy8pKSB7CiAgICAgICAgICAgICAgICAvLyBEZWNpbWFsIGxpdGVyYWxzIG1heSBiZSAiaW1hZ2luYXJ5IgogICAgICAgICAgICAgICAgc3RyZWFtLmVhdCgvSi9pKTsKICAgICAgICAgICAgICAgIC8vIFRPRE8gLSBDYW4geW91IGhhdmUgaW1hZ2luYXJ5IGxvbmdzPwogICAgICAgICAgICAgICAgaW50TGl0ZXJhbCA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gWmVybyBieSBpdHNlbGYgd2l0aCBubyBvdGhlciBwaWVjZSBvZiBudW1iZXIuCiAgICAgICAgICAgIGVsc2UgaWYgKHN0cmVhbS5tYXRjaCgvXjAoPyFbXGR4XSkvaSkpIHsgaW50TGl0ZXJhbCA9IHRydWU7IH0KICAgICAgICAgICAgaWYgKGludExpdGVyYWwpIHsKICAgICAgICAgICAgICAgIC8vIEludGVnZXIgbGl0ZXJhbHMgbWF5IGJlICJsb25nIgogICAgICAgICAgICAgICAgc3RyZWFtLmVhdCgvTC9pKTsKICAgICAgICAgICAgICAgIHJldHVybiAnbnVtYmVyJzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gSGFuZGxlIFN0cmluZ3MKICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKHN0cmluZ1ByZWZpeGVzKSkgewogICAgICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuU3RyaW5nRmFjdG9yeShzdHJlYW0uY3VycmVudCgpKTsKICAgICAgICAgICAgcmV0dXJuIHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgICAgIH0KCiAgICAgICAgLy8gSGFuZGxlIG9wZXJhdG9ycyBhbmQgRGVsaW1pdGVycwogICAgICAgIGlmIChzdHJlYW0ubWF0Y2godHJpcGxlRGVsaW1pdGVycykgfHwgc3RyZWFtLm1hdGNoKGRvdWJsZURlbGltaXRlcnMpKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKGRvdWJsZU9wZXJhdG9ycykKICAgICAgICAgICAgfHwgc3RyZWFtLm1hdGNoKHNpbmdsZU9wZXJhdG9ycykKICAgICAgICAgICAgfHwgc3RyZWFtLm1hdGNoKHdvcmRPcGVyYXRvcnMpKSB7CiAgICAgICAgICAgIHJldHVybiAnb3BlcmF0b3InOwogICAgICAgIH0KICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKHNpbmdsZURlbGltaXRlcnMpKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKGRvT3BlbmluZykpIHsKICAgICAgICAgICAgaW5kZW50KHN0cmVhbSxzdGF0ZSk7CiAgICAgICAgICAgIHN0YXRlLmRvSW5DdXJyZW50TGluZSA9IHRydWU7CiAgICAgICAgICAgIHJldHVybiAna2V5d29yZCc7CiAgICAgICAgfQogICAgICAgIGlmIChzdHJlYW0ubWF0Y2gob3BlbmluZykpIHsKICAgICAgICAgICAgaWYgKCEgc3RhdGUuZG9JbkN1cnJlbnRMaW5lKQogICAgICAgICAgICAgIGluZGVudChzdHJlYW0sc3RhdGUpOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgc3RhdGUuZG9JbkN1cnJlbnRMaW5lID0gZmFsc2U7CiAgICAgICAgICAgIHJldHVybiAna2V5d29yZCc7CiAgICAgICAgfQogICAgICAgIGlmIChzdHJlYW0ubWF0Y2gobWlkZGxlKSkgewogICAgICAgICAgICByZXR1cm4gJ2tleXdvcmQnOwogICAgICAgIH0KCiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaChkb3VibGVDbG9zaW5nKSkgewogICAgICAgICAgICBkZWRlbnQoc3RyZWFtLHN0YXRlKTsKICAgICAgICAgICAgZGVkZW50KHN0cmVhbSxzdGF0ZSk7CiAgICAgICAgICAgIHJldHVybiAna2V5d29yZCc7CiAgICAgICAgfQogICAgICAgIGlmIChzdHJlYW0ubWF0Y2goY2xvc2luZykpIHsKICAgICAgICAgICAgZGVkZW50KHN0cmVhbSxzdGF0ZSk7CiAgICAgICAgICAgIHJldHVybiAna2V5d29yZCc7CiAgICAgICAgfQoKICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKHR5cGVzKSkgewogICAgICAgICAgICByZXR1cm4gJ2tleXdvcmQnOwogICAgICAgIH0KCiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaChrZXl3b3JkcykpIHsKICAgICAgICAgICAgcmV0dXJuICdrZXl3b3JkJzsKICAgICAgICB9CgogICAgICAgIGlmIChzdHJlYW0ubWF0Y2goaWRlbnRpZmllcnMpKSB7CiAgICAgICAgICAgIHJldHVybiAndmFyaWFibGUnOwogICAgICAgIH0KCiAgICAgICAgLy8gSGFuZGxlIG5vbi1kZXRlY3RlZCBpdGVtcwogICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgcmV0dXJuIEVSUk9SQ0xBU1M7CiAgICB9CgogICAgZnVuY3Rpb24gdG9rZW5TdHJpbmdGYWN0b3J5KGRlbGltaXRlcikgewogICAgICAgIHZhciBzaW5nbGVsaW5lID0gZGVsaW1pdGVyLmxlbmd0aCA9PSAxOwogICAgICAgIHZhciBPVVRDTEFTUyA9ICdzdHJpbmcnOwoKICAgICAgICByZXR1cm4gZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICAgICAgICB3aGlsZSAoIXN0cmVhbS5lb2woKSkgewogICAgICAgICAgICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXiciXS8pOwogICAgICAgICAgICAgICAgaWYgKHN0cmVhbS5tYXRjaChkZWxpbWl0ZXIpKSB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9VVENMQVNTOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBzdHJlYW0uZWF0KC9bJyJdLyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHNpbmdsZWxpbmUpIHsKICAgICAgICAgICAgICAgIGlmIChwYXJzZXJDb25mLnNpbmdsZUxpbmVTdHJpbmdFcnJvcnMpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JDTEFTUzsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIE9VVENMQVNTOwogICAgICAgIH07CiAgICB9CgoKICAgIGZ1bmN0aW9uIHRva2VuTGV4ZXIoc3RyZWFtLCBzdGF0ZSkgewogICAgICAgIHZhciBzdHlsZSA9IHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgICAgIHZhciBjdXJyZW50ID0gc3RyZWFtLmN1cnJlbnQoKTsKCiAgICAgICAgLy8gSGFuZGxlICcuJyBjb25uZWN0ZWQgaWRlbnRpZmllcnMKICAgICAgICBpZiAoY3VycmVudCA9PT0gJy4nKSB7CiAgICAgICAgICAgIHN0eWxlID0gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CiAgICAgICAgICAgIGN1cnJlbnQgPSBzdHJlYW0uY3VycmVudCgpOwogICAgICAgICAgICBpZiAoc3R5bGUgPT09ICd2YXJpYWJsZScpIHsKICAgICAgICAgICAgICAgIHJldHVybiAndmFyaWFibGUnOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SQ0xBU1M7CiAgICAgICAgICAgIH0KICAgICAgICB9CgoKICAgICAgICB2YXIgZGVsaW1pdGVyX2luZGV4ID0gJ1soeycuaW5kZXhPZihjdXJyZW50KTsKICAgICAgICBpZiAoZGVsaW1pdGVyX2luZGV4ICE9PSAtMSkgewogICAgICAgICAgICBpbmRlbnQoc3RyZWFtLCBzdGF0ZSApOwogICAgICAgIH0KICAgICAgICBpZiAoaW5kZW50SW5mbyA9PT0gJ2RlZGVudCcpIHsKICAgICAgICAgICAgaWYgKGRlZGVudChzdHJlYW0sIHN0YXRlKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SQ0xBU1M7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZGVsaW1pdGVyX2luZGV4ID0gJ10pfScuaW5kZXhPZihjdXJyZW50KTsKICAgICAgICBpZiAoZGVsaW1pdGVyX2luZGV4ICE9PSAtMSkgewogICAgICAgICAgICBpZiAoZGVkZW50KHN0cmVhbSwgc3RhdGUpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JDTEFTUzsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHN0eWxlOwogICAgfQoKICAgIHZhciBleHRlcm5hbCA9IHsKICAgICAgICBlbGVjdHJpY0NoYXJzOiJkRHBQdFRmRmVFICIsCiAgICAgICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgdG9rZW5pemU6IHRva2VuQmFzZSwKICAgICAgICAgICAgICBsYXN0VG9rZW46IG51bGwsCiAgICAgICAgICAgICAgY3VycmVudEluZGVudDogMCwKICAgICAgICAgICAgICBuZXh0TGluZUluZGVudDogMCwKICAgICAgICAgICAgICBkb0luQ3VycmVudExpbmU6IGZhbHNlCgoKICAgICAgICAgIH07CiAgICAgICAgfSwKCiAgICAgICAgdG9rZW46IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgICAgICAgaWYgKHN0cmVhbS5zb2woKSkgewogICAgICAgICAgICAgIHN0YXRlLmN1cnJlbnRJbmRlbnQgKz0gc3RhdGUubmV4dExpbmVJbmRlbnQ7CiAgICAgICAgICAgICAgc3RhdGUubmV4dExpbmVJbmRlbnQgPSAwOwogICAgICAgICAgICAgIHN0YXRlLmRvSW5DdXJyZW50TGluZSA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHN0eWxlID0gdG9rZW5MZXhlcihzdHJlYW0sIHN0YXRlKTsKCiAgICAgICAgICAgIHN0YXRlLmxhc3RUb2tlbiA9IHtzdHlsZTpzdHlsZSwgY29udGVudDogc3RyZWFtLmN1cnJlbnQoKX07CgoKCiAgICAgICAgICAgIHJldHVybiBzdHlsZTsKICAgICAgICB9LAoKICAgICAgICBpbmRlbnQ6IGZ1bmN0aW9uKHN0YXRlLCB0ZXh0QWZ0ZXIpIHsKICAgICAgICAgICAgdmFyIHRydWVUZXh0ID0gdGV4dEFmdGVyLnJlcGxhY2UoL15ccyt8XHMrJC9nLCAnJykgOwogICAgICAgICAgICBpZiAodHJ1ZVRleHQubWF0Y2goY2xvc2luZykgfHwgdHJ1ZVRleHQubWF0Y2goZG91YmxlQ2xvc2luZykgfHwgdHJ1ZVRleHQubWF0Y2gobWlkZGxlKSkgcmV0dXJuIGNvbmYuaW5kZW50VW5pdCooc3RhdGUuY3VycmVudEluZGVudC0xKTsKICAgICAgICAgICAgaWYoc3RhdGUuY3VycmVudEluZGVudCA8IDApIHJldHVybiAwOwogICAgICAgICAgICByZXR1cm4gc3RhdGUuY3VycmVudEluZGVudCAqIGNvbmYuaW5kZW50VW5pdDsKICAgICAgICB9CgogICAgfTsKICAgIHJldHVybiBleHRlcm5hbDsKfSk7CgpDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveC12YiIsICJ2YiIpOwoKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/vbscript/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/vbscript/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogVkJTY3JpcHQgbW9kZTwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uLy4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxzY3JpcHQgc3JjPSIuLi8uLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJ2YnNjcmlwdC5qcyI+PC9zY3JpcHQ+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+LkNvZGVNaXJyb3Ige2JvcmRlci10b3A6IDFweCBzb2xpZCBibGFjazsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO308L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5WQlNjcmlwdDwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+VkJTY3JpcHQgbW9kZTwvaDI+CgoKPGRpdj48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgonIFBldGUgR3VobAonIDAzLTA0LTIwMTIKJwonIEJhc2ljIFZCU2NyaXB0IHN1cHBvcnQgZm9yIGNvZGVtaXJyb3IyCgpDb25zdCBGb3JSZWFkaW5nID0gMSwgRm9yV3JpdGluZyA9IDIsIEZvckFwcGVuZGluZyA9IDgKCkNhbGwgU3ViMDIwX1Bvc3RCcm9hZGNhc3RUb1VyYmFuQWlyc2hpcChzdHJVc2VyTmFtZSwgc3RyUGFzc3dvcmQsIGludFRyYW5zbWl0SUQsIHN0clJlc3BvbnNlKQoKSWYgTm90IElzTnVsbChzdHJSZXNwb25zZSkgQU5EIExlbihzdHJSZXNwb25zZSkgPSAwIFRoZW4KCWJvb2xUcmFuc21pdE9rWU4gPSBGYWxzZQpFbHNlCgknIFdTY3JpcHQuRWNobyAiT2ggSGFwcHkgRGF5ISBPaCBIYXBweSBEQVkhIgoJYm9vbFRyYW5zbWl0T2tZTiA9IFRydWUKRW5kIElmCjwvdGV4dGFyZWE+PC9kaXY+CgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgICAgICBpbmRlbnRVbml0OiA0CiAgICAgIH0pOwogICAgPC9zY3JpcHQ+CgogICAgPHA+PHN0cm9uZz5NSU1FIHR5cGVzIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPnRleHQvdmJzY3JpcHQ8L2NvZGU+LjwvcD4KICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/vbscript/vbscript.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovKgpGb3IgZXh0cmEgQVNQIGNsYXNzaWMgb2JqZWN0cywgaW5pdGlhbGl6ZSBDb2RlTWlycm9yIGluc3RhbmNlIHdpdGggdGhpcyBvcHRpb246CiAgICBpc0FTUDogdHJ1ZQoKRS5HLjoKICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICAgICAgbGluZU51bWJlcnM6IHRydWUsCiAgICAgICAgaXNBU1A6IHRydWUKICAgICAgfSk7CiovCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJ2YnNjcmlwdCIsIGZ1bmN0aW9uKGNvbmYsIHBhcnNlckNvbmYpIHsKICAgIHZhciBFUlJPUkNMQVNTID0gJ2Vycm9yJzsKCiAgICBmdW5jdGlvbiB3b3JkUmVnZXhwKHdvcmRzKSB7CiAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAoIl4oKCIgKyB3b3Jkcy5qb2luKCIpfCgiKSArICIpKVxcYiIsICJpIik7CiAgICB9CgogICAgdmFyIHNpbmdsZU9wZXJhdG9ycyA9IG5ldyBSZWdFeHAoIl5bXFwrXFwtXFwqLyZcXFxcXFxePD49XSIpOwogICAgdmFyIGRvdWJsZU9wZXJhdG9ycyA9IG5ldyBSZWdFeHAoIl4oKDw+KXwoPD0pfCg+PSkpIik7CiAgICB2YXIgc2luZ2xlRGVsaW1pdGVycyA9IG5ldyBSZWdFeHAoJ15bXFwuLF0nKTsKICAgIHZhciBicmFrZXRzID0gbmV3IFJlZ0V4cCgnXltcXChcXCldJyk7CiAgICB2YXIgaWRlbnRpZmllcnMgPSBuZXcgUmVnRXhwKCJeW0EtWmEtel1bX0EtWmEtejAtOV0qIik7CgogICAgdmFyIG9wZW5pbmdLZXl3b3JkcyA9IFsnY2xhc3MnLCdzdWInLCdzZWxlY3QnLCd3aGlsZScsJ2lmJywnZnVuY3Rpb24nLCAncHJvcGVydHknLCAnd2l0aCcsICdmb3InXTsKICAgIHZhciBtaWRkbGVLZXl3b3JkcyA9IFsnZWxzZScsJ2Vsc2VpZicsJ2Nhc2UnXTsKICAgIHZhciBlbmRLZXl3b3JkcyA9IFsnbmV4dCcsJ2xvb3AnLCd3ZW5kJ107CgogICAgdmFyIHdvcmRPcGVyYXRvcnMgPSB3b3JkUmVnZXhwKFsnYW5kJywgJ29yJywgJ25vdCcsICd4b3InLCAnaXMnLCAnbW9kJywgJ2VxdicsICdpbXAnXSk7CiAgICB2YXIgY29tbW9ua2V5d29yZHMgPSBbJ2RpbScsICdyZWRpbScsICd0aGVuJywgICd1bnRpbCcsICdyYW5kb21pemUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICdieXZhbCcsJ2J5cmVmJywnbmV3JywncHJvcGVydHknLCAnZXhpdCcsICdpbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbnN0JywncHJpdmF0ZScsICdwdWJsaWMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICdnZXQnLCdzZXQnLCdsZXQnLCAnc3RvcCcsICdvbiBlcnJvciByZXN1bWUgbmV4dCcsICdvbiBlcnJvciBnb3RvIDAnLCAnb3B0aW9uIGV4cGxpY2l0JywgJ2NhbGwnLCAnbWUnXTsKCiAgICAvL1RoaXMgbGlzdCB3YXMgZnJvbTogaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2Y4dGJjNzl4KHY9dnMuODQpLmFzcHgKICAgIHZhciBhdG9tV29yZHMgPSBbJ3RydWUnLCAnZmFsc2UnLCAnbm90aGluZycsICdlbXB0eScsICdudWxsJ107CiAgICAvL1RoaXMgbGlzdCB3YXMgZnJvbTogaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5LzNjYTh0ZmVrKHY9dnMuODQpLmFzcHgKICAgIHZhciBidWlsdGluRnVuY3NXb3JkcyA9IFsnYWJzJywgJ2FycmF5JywgJ2FzYycsICdhdG4nLCAnY2Jvb2wnLCAnY2J5dGUnLCAnY2N1cicsICdjZGF0ZScsICdjZGJsJywgJ2NocicsICdjaW50JywgJ2NsbmcnLCAnY29zJywgJ2NzbmcnLCAnY3N0cicsICdkYXRlJywgJ2RhdGVhZGQnLCAnZGF0ZWRpZmYnLCAnZGF0ZXBhcnQnLAogICAgICAgICAgICAgICAgICAgICAgICAnZGF0ZXNlcmlhbCcsICdkYXRldmFsdWUnLCAnZGF5JywgJ2VzY2FwZScsICdldmFsJywgJ2V4ZWN1dGUnLCAnZXhwJywgJ2ZpbHRlcicsICdmb3JtYXRjdXJyZW5jeScsICdmb3JtYXRkYXRldGltZScsICdmb3JtYXRudW1iZXInLCAnZm9ybWF0cGVyY2VudCcsICdnZXRsb2NhbGUnLCAnZ2V0b2JqZWN0JywKICAgICAgICAgICAgICAgICAgICAgICAgJ2dldHJlZicsICdoZXgnLCAnaG91cicsICdpbnB1dGJveCcsICdpbnN0cicsICdpbnN0cnJldicsICdpbnQnLCAnZml4JywgJ2lzYXJyYXknLCAnaXNkYXRlJywgJ2lzZW1wdHknLCAnaXNudWxsJywgJ2lzbnVtZXJpYycsICdpc29iamVjdCcsICdqb2luJywgJ2xib3VuZCcsICdsY2FzZScsICdsZWZ0JywKICAgICAgICAgICAgICAgICAgICAgICAgJ2xlbicsICdsb2FkcGljdHVyZScsICdsb2cnLCAnbHRyaW0nLCAncnRyaW0nLCAndHJpbScsICdtYXRocycsICdtaWQnLCAnbWludXRlJywgJ21vbnRoJywgJ21vbnRobmFtZScsICdtc2dib3gnLCAnbm93JywgJ29jdCcsICdyZXBsYWNlJywgJ3JnYicsICdyaWdodCcsICdybmQnLCAncm91bmQnLAogICAgICAgICAgICAgICAgICAgICAgICAnc2NyaXB0ZW5naW5lJywgJ3NjcmlwdGVuZ2luZWJ1aWxkdmVyc2lvbicsICdzY3JpcHRlbmdpbmVtYWpvcnZlcnNpb24nLCAnc2NyaXB0ZW5naW5lbWlub3J2ZXJzaW9uJywgJ3NlY29uZCcsICdzZXRsb2NhbGUnLCAnc2duJywgJ3NpbicsICdzcGFjZScsICdzcGxpdCcsICdzcXInLCAnc3RyY29tcCcsCiAgICAgICAgICAgICAgICAgICAgICAgICdzdHJpbmcnLCAnc3RycmV2ZXJzZScsICd0YW4nLCAndGltZScsICd0aW1lcicsICd0aW1lc2VyaWFsJywgJ3RpbWV2YWx1ZScsICd0eXBlbmFtZScsICd1Ym91bmQnLCAndWNhc2UnLCAndW5lc2NhcGUnLCAndmFydHlwZScsICd3ZWVrZGF5JywgJ3dlZWtkYXluYW1lJywgJ3llYXInXTsKCiAgICAvL1RoaXMgbGlzdCB3YXMgZnJvbTogaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L3lkejRjZmszKHY9dnMuODQpLmFzcHgKICAgIHZhciBidWlsdGluQ29uc3RzID0gWyd2YkJsYWNrJywgJ3ZiUmVkJywgJ3ZiR3JlZW4nLCAndmJZZWxsb3cnLCAndmJCbHVlJywgJ3ZiTWFnZW50YScsICd2YkN5YW4nLCAndmJXaGl0ZScsICd2YkJpbmFyeUNvbXBhcmUnLCAndmJUZXh0Q29tcGFyZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAndmJTdW5kYXknLCAndmJNb25kYXknLCAndmJUdWVzZGF5JywgJ3ZiV2VkbmVzZGF5JywgJ3ZiVGh1cnNkYXknLCAndmJGcmlkYXknLCAndmJTYXR1cmRheScsICd2YlVzZVN5c3RlbURheU9mV2VlaycsICd2YkZpcnN0SmFuMScsICd2YkZpcnN0Rm91ckRheXMnLCAndmJGaXJzdEZ1bGxXZWVrJywKICAgICAgICAgICAgICAgICAgICAgICAgICd2YkdlbmVyYWxEYXRlJywgJ3ZiTG9uZ0RhdGUnLCAndmJTaG9ydERhdGUnLCAndmJMb25nVGltZScsICd2YlNob3J0VGltZScsICd2Yk9iamVjdEVycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgICd2Yk9LT25seScsICd2Yk9LQ2FuY2VsJywgJ3ZiQWJvcnRSZXRyeUlnbm9yZScsICd2Ylllc05vQ2FuY2VsJywgJ3ZiWWVzTm8nLCAndmJSZXRyeUNhbmNlbCcsICd2YkNyaXRpY2FsJywgJ3ZiUXVlc3Rpb24nLCAndmJFeGNsYW1hdGlvbicsICd2YkluZm9ybWF0aW9uJywgJ3ZiRGVmYXVsdEJ1dHRvbjEnLCAndmJEZWZhdWx0QnV0dG9uMicsCiAgICAgICAgICAgICAgICAgICAgICAgICAndmJEZWZhdWx0QnV0dG9uMycsICd2YkRlZmF1bHRCdXR0b240JywgJ3ZiQXBwbGljYXRpb25Nb2RhbCcsICd2YlN5c3RlbU1vZGFsJywgJ3ZiT0snLCAndmJDYW5jZWwnLCAndmJBYm9ydCcsICd2YlJldHJ5JywgJ3ZiSWdub3JlJywgJ3ZiWWVzJywgJ3ZiTm8nLAogICAgICAgICAgICAgICAgICAgICAgICAgJ3ZiQ3InLCAnVmJDckxmJywgJ3ZiRm9ybUZlZWQnLCAndmJMZicsICd2Yk5ld0xpbmUnLCAndmJOdWxsQ2hhcicsICd2Yk51bGxTdHJpbmcnLCAndmJUYWInLCAndmJWZXJ0aWNhbFRhYicsICd2YlVzZURlZmF1bHQnLCAndmJUcnVlJywgJ3ZiRmFsc2UnLAogICAgICAgICAgICAgICAgICAgICAgICAgJ3ZiRW1wdHknLCAndmJOdWxsJywgJ3ZiSW50ZWdlcicsICd2YkxvbmcnLCAndmJTaW5nbGUnLCAndmJEb3VibGUnLCAndmJDdXJyZW5jeScsICd2YkRhdGUnLCAndmJTdHJpbmcnLCAndmJPYmplY3QnLCAndmJFcnJvcicsICd2YkJvb2xlYW4nLCAndmJWYXJpYW50JywgJ3ZiRGF0YU9iamVjdCcsICd2YkRlY2ltYWwnLCAndmJCeXRlJywgJ3ZiQXJyYXknXTsKICAgIC8vVGhpcyBsaXN0IHdhcyBmcm9tOiBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvaGtjMzc1ZWEodj12cy44NCkuYXNweAogICAgdmFyIGJ1aWx0aW5PYmpzV29yZHMgPSBbJ1dTY3JpcHQnLCAnZXJyJywgJ2RlYnVnJywgJ1JlZ0V4cCddOwogICAgdmFyIGtub3duUHJvcGVydGllcyA9IFsnZGVzY3JpcHRpb24nLCAnZmlyc3RpbmRleCcsICdnbG9iYWwnLCAnaGVscGNvbnRleHQnLCAnaGVscGZpbGUnLCAnaWdub3JlY2FzZScsICdsZW5ndGgnLCAnbnVtYmVyJywgJ3BhdHRlcm4nLCAnc291cmNlJywgJ3ZhbHVlJywgJ2NvdW50J107CiAgICB2YXIga25vd25NZXRob2RzID0gWydjbGVhcicsICdleGVjdXRlJywgJ3JhaXNlJywgJ3JlcGxhY2UnLCAndGVzdCcsICd3cml0ZScsICd3cml0ZWxpbmUnLCAnY2xvc2UnLCAnb3BlbicsICdzdGF0ZScsICdlb2YnLCAndXBkYXRlJywgJ2FkZG5ldycsICdlbmQnLCAnY3JlYXRlb2JqZWN0JywgJ3F1aXQnXTsKCiAgICB2YXIgYXNwQnVpbHRpbk9ianNXb3JkcyA9IFsnc2VydmVyJywgJ3Jlc3BvbnNlJywgJ3JlcXVlc3QnLCAnc2Vzc2lvbicsICdhcHBsaWNhdGlvbiddOwogICAgdmFyIGFzcEtub3duUHJvcGVydGllcyA9IFsnYnVmZmVyJywgJ2NhY2hlY29udHJvbCcsICdjaGFyc2V0JywgJ2NvbnRlbnR0eXBlJywgJ2V4cGlyZXMnLCAnZXhwaXJlc2Fic29sdXRlJywgJ2lzY2xpZW50Y29ubmVjdGVkJywgJ3BpY3MnLCAnc3RhdHVzJywgLy9yZXNwb25zZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY2xpZW50Y2VydGlmaWNhdGUnLCAnY29va2llcycsICdmb3JtJywgJ3F1ZXJ5c3RyaW5nJywgJ3NlcnZlcnZhcmlhYmxlcycsICd0b3RhbGJ5dGVzJywgLy9yZXF1ZXN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb250ZW50cycsICdzdGF0aWNvYmplY3RzJywgLy9hcHBsaWNhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29kZXBhZ2UnLCAnbGNpZCcsICdzZXNzaW9uaWQnLCAndGltZW91dCcsIC8vc2Vzc2lvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2NyaXB0dGltZW91dCddOyAvL3NlcnZlcgogICAgdmFyIGFzcEtub3duTWV0aG9kcyA9IFsnYWRkaGVhZGVyJywgJ2FwcGVuZHRvbG9nJywgJ2JpbmFyeXdyaXRlJywgJ2VuZCcsICdmbHVzaCcsICdyZWRpcmVjdCcsIC8vcmVzcG9uc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JpbmFyeXJlYWQnLCAvL3JlcXVlc3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JlbW92ZScsICdyZW1vdmVhbGwnLCAnbG9jaycsICd1bmxvY2snLCAvL2FwcGxpY2F0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICdhYmFuZG9uJywgLy9zZXNzaW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICdnZXRsYXN0ZXJyb3InLCAnaHRtbGVuY29kZScsICdtYXBwYXRoJywgJ3RyYW5zZmVyJywgJ3VybGVuY29kZSddOyAvL3NlcnZlcgoKICAgIHZhciBrbm93bldvcmRzID0ga25vd25NZXRob2RzLmNvbmNhdChrbm93blByb3BlcnRpZXMpOwoKICAgIGJ1aWx0aW5PYmpzV29yZHMgPSBidWlsdGluT2Jqc1dvcmRzLmNvbmNhdChidWlsdGluQ29uc3RzKTsKCiAgICBpZiAoY29uZi5pc0FTUCl7CiAgICAgICAgYnVpbHRpbk9ianNXb3JkcyA9IGJ1aWx0aW5PYmpzV29yZHMuY29uY2F0KGFzcEJ1aWx0aW5PYmpzV29yZHMpOwogICAgICAgIGtub3duV29yZHMgPSBrbm93bldvcmRzLmNvbmNhdChhc3BLbm93bk1ldGhvZHMsIGFzcEtub3duUHJvcGVydGllcyk7CiAgICB9OwoKICAgIHZhciBrZXl3b3JkcyA9IHdvcmRSZWdleHAoY29tbW9ua2V5d29yZHMpOwogICAgdmFyIGF0b21zID0gd29yZFJlZ2V4cChhdG9tV29yZHMpOwogICAgdmFyIGJ1aWx0aW5GdW5jcyA9IHdvcmRSZWdleHAoYnVpbHRpbkZ1bmNzV29yZHMpOwogICAgdmFyIGJ1aWx0aW5PYmpzID0gd29yZFJlZ2V4cChidWlsdGluT2Jqc1dvcmRzKTsKICAgIHZhciBrbm93biA9IHdvcmRSZWdleHAoa25vd25Xb3Jkcyk7CiAgICB2YXIgc3RyaW5nUHJlZml4ZXMgPSAnIic7CgogICAgdmFyIG9wZW5pbmcgPSB3b3JkUmVnZXhwKG9wZW5pbmdLZXl3b3Jkcyk7CiAgICB2YXIgbWlkZGxlID0gd29yZFJlZ2V4cChtaWRkbGVLZXl3b3Jkcyk7CiAgICB2YXIgY2xvc2luZyA9IHdvcmRSZWdleHAoZW5kS2V5d29yZHMpOwogICAgdmFyIGRvdWJsZUNsb3NpbmcgPSB3b3JkUmVnZXhwKFsnZW5kJ10pOwogICAgdmFyIGRvT3BlbmluZyA9IHdvcmRSZWdleHAoWydkbyddKTsKICAgIHZhciBub0luZGVudFdvcmRzID0gd29yZFJlZ2V4cChbJ29uIGVycm9yIHJlc3VtZSBuZXh0JywgJ2V4aXQnXSk7CiAgICB2YXIgY29tbWVudCA9IHdvcmRSZWdleHAoWydyZW0nXSk7CgoKICAgIGZ1bmN0aW9uIGluZGVudChfc3RyZWFtLCBzdGF0ZSkgewogICAgICBzdGF0ZS5jdXJyZW50SW5kZW50Kys7CiAgICB9CgogICAgZnVuY3Rpb24gZGVkZW50KF9zdHJlYW0sIHN0YXRlKSB7CiAgICAgIHN0YXRlLmN1cnJlbnRJbmRlbnQtLTsKICAgIH0KICAgIC8vIHRva2VuaXplcnMKICAgIGZ1bmN0aW9uIHRva2VuQmFzZShzdHJlYW0sIHN0YXRlKSB7CiAgICAgICAgaWYgKHN0cmVhbS5lYXRTcGFjZSgpKSB7CiAgICAgICAgICAgIHJldHVybiAnc3BhY2UnOwogICAgICAgICAgICAvL3JldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgdmFyIGNoID0gc3RyZWFtLnBlZWsoKTsKCiAgICAgICAgLy8gSGFuZGxlIENvbW1lbnRzCiAgICAgICAgaWYgKGNoID09PSAiJyIpIHsKICAgICAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICAgICAgICByZXR1cm4gJ2NvbW1lbnQnOwogICAgICAgIH0KICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKGNvbW1lbnQpKXsKICAgICAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICAgICAgICByZXR1cm4gJ2NvbW1lbnQnOwogICAgICAgIH0KCgogICAgICAgIC8vIEhhbmRsZSBOdW1iZXIgTGl0ZXJhbHMKICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eKCgmSCl8KCZPKSk/WzAtOVwuXS9pLCBmYWxzZSkgJiYgIXN0cmVhbS5tYXRjaCgvXigoJkgpfCgmTykpP1swLTlcLl0rW2Etel9dL2ksIGZhbHNlKSkgewogICAgICAgICAgICB2YXIgZmxvYXRMaXRlcmFsID0gZmFsc2U7CiAgICAgICAgICAgIC8vIEZsb2F0cwogICAgICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eXGQqXC5cZCsvaSkpIHsgZmxvYXRMaXRlcmFsID0gdHJ1ZTsgfQogICAgICAgICAgICBlbHNlIGlmIChzdHJlYW0ubWF0Y2goL15cZCtcLlxkKi8pKSB7IGZsb2F0TGl0ZXJhbCA9IHRydWU7IH0KICAgICAgICAgICAgZWxzZSBpZiAoc3RyZWFtLm1hdGNoKC9eXC5cZCsvKSkgeyBmbG9hdExpdGVyYWwgPSB0cnVlOyB9CgogICAgICAgICAgICBpZiAoZmxvYXRMaXRlcmFsKSB7CiAgICAgICAgICAgICAgICAvLyBGbG9hdCBsaXRlcmFscyBtYXkgYmUgImltYWdpbmFyeSIKICAgICAgICAgICAgICAgIHN0cmVhbS5lYXQoL0ovaSk7CiAgICAgICAgICAgICAgICByZXR1cm4gJ251bWJlcic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gSW50ZWdlcnMKICAgICAgICAgICAgdmFyIGludExpdGVyYWwgPSBmYWxzZTsKICAgICAgICAgICAgLy8gSGV4CiAgICAgICAgICAgIGlmIChzdHJlYW0ubWF0Y2goL14mSFswLTlhLWZdKy9pKSkgeyBpbnRMaXRlcmFsID0gdHJ1ZTsgfQogICAgICAgICAgICAvLyBPY3RhbAogICAgICAgICAgICBlbHNlIGlmIChzdHJlYW0ubWF0Y2goL14mT1swLTddKy9pKSkgeyBpbnRMaXRlcmFsID0gdHJ1ZTsgfQogICAgICAgICAgICAvLyBEZWNpbWFsCiAgICAgICAgICAgIGVsc2UgaWYgKHN0cmVhbS5tYXRjaCgvXlsxLTldXGQqRj8vKSkgewogICAgICAgICAgICAgICAgLy8gRGVjaW1hbCBsaXRlcmFscyBtYXkgYmUgImltYWdpbmFyeSIKICAgICAgICAgICAgICAgIHN0cmVhbS5lYXQoL0ovaSk7CiAgICAgICAgICAgICAgICAvLyBUT0RPIC0gQ2FuIHlvdSBoYXZlIGltYWdpbmFyeSBsb25ncz8KICAgICAgICAgICAgICAgIGludExpdGVyYWwgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFplcm8gYnkgaXRzZWxmIHdpdGggbm8gb3RoZXIgcGllY2Ugb2YgbnVtYmVyLgogICAgICAgICAgICBlbHNlIGlmIChzdHJlYW0ubWF0Y2goL14wKD8hW1xkeF0pL2kpKSB7IGludExpdGVyYWwgPSB0cnVlOyB9CiAgICAgICAgICAgIGlmIChpbnRMaXRlcmFsKSB7CiAgICAgICAgICAgICAgICAvLyBJbnRlZ2VyIGxpdGVyYWxzIG1heSBiZSAibG9uZyIKICAgICAgICAgICAgICAgIHN0cmVhbS5lYXQoL0wvaSk7CiAgICAgICAgICAgICAgICByZXR1cm4gJ251bWJlcic7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIEhhbmRsZSBTdHJpbmdzCiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaChzdHJpbmdQcmVmaXhlcykpIHsKICAgICAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlblN0cmluZ0ZhY3Rvcnkoc3RyZWFtLmN1cnJlbnQoKSk7CiAgICAgICAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgICAgICB9CgogICAgICAgIC8vIEhhbmRsZSBvcGVyYXRvcnMgYW5kIERlbGltaXRlcnMKICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKGRvdWJsZU9wZXJhdG9ycykKICAgICAgICAgICAgfHwgc3RyZWFtLm1hdGNoKHNpbmdsZU9wZXJhdG9ycykKICAgICAgICAgICAgfHwgc3RyZWFtLm1hdGNoKHdvcmRPcGVyYXRvcnMpKSB7CiAgICAgICAgICAgIHJldHVybiAnb3BlcmF0b3InOwogICAgICAgIH0KICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKHNpbmdsZURlbGltaXRlcnMpKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaChicmFrZXRzKSkgewogICAgICAgICAgICByZXR1cm4gImJyYWNrZXQiOwogICAgICAgIH0KCiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaChub0luZGVudFdvcmRzKSkgewogICAgICAgICAgICBzdGF0ZS5kb0luQ3VycmVudExpbmUgPSB0cnVlOwoKICAgICAgICAgICAgcmV0dXJuICdrZXl3b3JkJzsKICAgICAgICB9CgogICAgICAgIGlmIChzdHJlYW0ubWF0Y2goZG9PcGVuaW5nKSkgewogICAgICAgICAgICBpbmRlbnQoc3RyZWFtLHN0YXRlKTsKICAgICAgICAgICAgc3RhdGUuZG9JbkN1cnJlbnRMaW5lID0gdHJ1ZTsKCiAgICAgICAgICAgIHJldHVybiAna2V5d29yZCc7CiAgICAgICAgfQogICAgICAgIGlmIChzdHJlYW0ubWF0Y2gob3BlbmluZykpIHsKICAgICAgICAgICAgaWYgKCEgc3RhdGUuZG9JbkN1cnJlbnRMaW5lKQogICAgICAgICAgICAgIGluZGVudChzdHJlYW0sc3RhdGUpOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgc3RhdGUuZG9JbkN1cnJlbnRMaW5lID0gZmFsc2U7CgogICAgICAgICAgICByZXR1cm4gJ2tleXdvcmQnOwogICAgICAgIH0KICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKG1pZGRsZSkpIHsKICAgICAgICAgICAgcmV0dXJuICdrZXl3b3JkJzsKICAgICAgICB9CgoKICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKGRvdWJsZUNsb3NpbmcpKSB7CiAgICAgICAgICAgIGRlZGVudChzdHJlYW0sc3RhdGUpOwogICAgICAgICAgICBkZWRlbnQoc3RyZWFtLHN0YXRlKTsKCiAgICAgICAgICAgIHJldHVybiAna2V5d29yZCc7CiAgICAgICAgfQogICAgICAgIGlmIChzdHJlYW0ubWF0Y2goY2xvc2luZykpIHsKICAgICAgICAgICAgaWYgKCEgc3RhdGUuZG9JbkN1cnJlbnRMaW5lKQogICAgICAgICAgICAgIGRlZGVudChzdHJlYW0sc3RhdGUpOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgc3RhdGUuZG9JbkN1cnJlbnRMaW5lID0gZmFsc2U7CgogICAgICAgICAgICByZXR1cm4gJ2tleXdvcmQnOwogICAgICAgIH0KCiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaChrZXl3b3JkcykpIHsKICAgICAgICAgICAgcmV0dXJuICdrZXl3b3JkJzsKICAgICAgICB9CgogICAgICAgIGlmIChzdHJlYW0ubWF0Y2goYXRvbXMpKSB7CiAgICAgICAgICAgIHJldHVybiAnYXRvbSc7CiAgICAgICAgfQoKICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKGtub3duKSkgewogICAgICAgICAgICByZXR1cm4gJ3ZhcmlhYmxlLTInOwogICAgICAgIH0KCiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaChidWlsdGluRnVuY3MpKSB7CiAgICAgICAgICAgIHJldHVybiAnYnVpbHRpbic7CiAgICAgICAgfQoKICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKGJ1aWx0aW5PYmpzKSl7CiAgICAgICAgICAgIHJldHVybiAndmFyaWFibGUtMic7CiAgICAgICAgfQoKICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKGlkZW50aWZpZXJzKSkgewogICAgICAgICAgICByZXR1cm4gJ3ZhcmlhYmxlJzsKICAgICAgICB9CgogICAgICAgIC8vIEhhbmRsZSBub24tZGV0ZWN0ZWQgaXRlbXMKICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgIHJldHVybiBFUlJPUkNMQVNTOwogICAgfQoKICAgIGZ1bmN0aW9uIHRva2VuU3RyaW5nRmFjdG9yeShkZWxpbWl0ZXIpIHsKICAgICAgICB2YXIgc2luZ2xlbGluZSA9IGRlbGltaXRlci5sZW5ndGggPT0gMTsKICAgICAgICB2YXIgT1VUQ0xBU1MgPSAnc3RyaW5nJzsKCiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgICAgICAgd2hpbGUgKCFzdHJlYW0uZW9sKCkpIHsKICAgICAgICAgICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW14nIl0vKTsKICAgICAgICAgICAgICAgIGlmIChzdHJlYW0ubWF0Y2goZGVsaW1pdGVyKSkgewogICAgICAgICAgICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBPVVRDTEFTUzsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLmVhdCgvWyciXS8pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChzaW5nbGVsaW5lKSB7CiAgICAgICAgICAgICAgICBpZiAocGFyc2VyQ29uZi5zaW5nbGVMaW5lU3RyaW5nRXJyb3JzKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SQ0xBU1M7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBPVVRDTEFTUzsKICAgICAgICB9OwogICAgfQoKCiAgICBmdW5jdGlvbiB0b2tlbkxleGVyKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgICB2YXIgc3R5bGUgPSBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgICAgICB2YXIgY3VycmVudCA9IHN0cmVhbS5jdXJyZW50KCk7CgogICAgICAgIC8vIEhhbmRsZSAnLicgY29ubmVjdGVkIGlkZW50aWZpZXJzCiAgICAgICAgaWYgKGN1cnJlbnQgPT09ICcuJykgewogICAgICAgICAgICBzdHlsZSA9IHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwoKICAgICAgICAgICAgY3VycmVudCA9IHN0cmVhbS5jdXJyZW50KCk7CiAgICAgICAgICAgIGlmIChzdHlsZSAmJiAoc3R5bGUuc3Vic3RyKDAsIDgpID09PSAndmFyaWFibGUnIHx8IHN0eWxlPT09J2J1aWx0aW4nIHx8IHN0eWxlPT09J2tleXdvcmQnKSl7Ly98fCBrbm93bldvcmRzLmluZGV4T2YoY3VycmVudC5zdWJzdHJpbmcoMSkpID4gLTEpIHsKICAgICAgICAgICAgICAgIGlmIChzdHlsZSA9PT0gJ2J1aWx0aW4nIHx8IHN0eWxlID09PSAna2V5d29yZCcpIHN0eWxlPSd2YXJpYWJsZSc7CiAgICAgICAgICAgICAgICBpZiAoa25vd25Xb3Jkcy5pbmRleE9mKGN1cnJlbnQuc3Vic3RyKDEpKSA+IC0xKSBzdHlsZT0ndmFyaWFibGUtMic7CgogICAgICAgICAgICAgICAgcmV0dXJuIHN0eWxlOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SQ0xBU1M7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBzdHlsZTsKICAgIH0KCiAgICB2YXIgZXh0ZXJuYWwgPSB7CiAgICAgICAgZWxlY3RyaWNDaGFyczoiZERwUHRUZkZlRSAiLAogICAgICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgIHRva2VuaXplOiB0b2tlbkJhc2UsCiAgICAgICAgICAgICAgbGFzdFRva2VuOiBudWxsLAogICAgICAgICAgICAgIGN1cnJlbnRJbmRlbnQ6IDAsCiAgICAgICAgICAgICAgbmV4dExpbmVJbmRlbnQ6IDAsCiAgICAgICAgICAgICAgZG9JbkN1cnJlbnRMaW5lOiBmYWxzZSwKICAgICAgICAgICAgICBpZ25vcmVLZXl3b3JkOiBmYWxzZQoKCiAgICAgICAgICB9OwogICAgICAgIH0sCgogICAgICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgICAgICAgIGlmIChzdHJlYW0uc29sKCkpIHsKICAgICAgICAgICAgICBzdGF0ZS5jdXJyZW50SW5kZW50ICs9IHN0YXRlLm5leHRMaW5lSW5kZW50OwogICAgICAgICAgICAgIHN0YXRlLm5leHRMaW5lSW5kZW50ID0gMDsKICAgICAgICAgICAgICBzdGF0ZS5kb0luQ3VycmVudExpbmUgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBzdHlsZSA9IHRva2VuTGV4ZXIoc3RyZWFtLCBzdGF0ZSk7CgogICAgICAgICAgICBzdGF0ZS5sYXN0VG9rZW4gPSB7c3R5bGU6c3R5bGUsIGNvbnRlbnQ6IHN0cmVhbS5jdXJyZW50KCl9OwoKICAgICAgICAgICAgaWYgKHN0eWxlPT09J3NwYWNlJykgc3R5bGU9bnVsbDsKCiAgICAgICAgICAgIHJldHVybiBzdHlsZTsKICAgICAgICB9LAoKICAgICAgICBpbmRlbnQ6IGZ1bmN0aW9uKHN0YXRlLCB0ZXh0QWZ0ZXIpIHsKICAgICAgICAgICAgdmFyIHRydWVUZXh0ID0gdGV4dEFmdGVyLnJlcGxhY2UoL15ccyt8XHMrJC9nLCAnJykgOwogICAgICAgICAgICBpZiAodHJ1ZVRleHQubWF0Y2goY2xvc2luZykgfHwgdHJ1ZVRleHQubWF0Y2goZG91YmxlQ2xvc2luZykgfHwgdHJ1ZVRleHQubWF0Y2gobWlkZGxlKSkgcmV0dXJuIGNvbmYuaW5kZW50VW5pdCooc3RhdGUuY3VycmVudEluZGVudC0xKTsKICAgICAgICAgICAgaWYoc3RhdGUuY3VycmVudEluZGVudCA8IDApIHJldHVybiAwOwogICAgICAgICAgICByZXR1cm4gc3RhdGUuY3VycmVudEluZGVudCAqIGNvbmYuaW5kZW50VW5pdDsKICAgICAgICB9CgogICAgfTsKICAgIHJldHVybiBleHRlcm5hbDsKfSk7CgpDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQvdmJzY3JpcHQiLCAidmJzY3JpcHQiKTsKCn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/velocity/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/velocity/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogVmVsb2NpdHkgbW9kZTwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uLy4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vdGhlbWUvbmlnaHQuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9InZlbG9jaXR5LmpzIj48L3NjcmlwdD4KPHN0eWxlPi5Db2RlTWlycm9yIHtib3JkZXI6IDFweCBzb2xpZCBibGFjazt9PC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aW1nIGlkPWxvZ28gc3JjPSIuLi8uLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5MYW5ndWFnZSBtb2RlczwvYT4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+VmVsb2NpdHk8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPlZlbG9jaXR5IG1vZGU8L2gyPgo8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgojIyBWZWxvY2l0eSBDb2RlIERlbW8KIyoKICAgYmFzZWQgb24gUEwvU1FMIG1vZGUgYnkgUGV0ZXIgUmFnYW5pdHNjaCwgYWRhcHRlZCB0byBWZWxvY2l0eSBieSBTdGV2ZSBPJ0hhcmEgKCBodHRwOi8vd3d3LnBpdm90YWwtc29sdXRpb25zLmNvLnVrICkKICAgQXVndXN0IDIwMTEKKiMKCiMqCiAgIFRoaXMgaXMgYSBtdWx0aWxpbmUgY29tbWVudC4KICAgVGhpcyBpcyB0aGUgc2Vjb25kIGxpbmUKKiMKCiNbWyBoZWxsbyBzdGV2ZQogICBUaGlzIGhhcyBpbnZhbGlkIHN5bnRheCB0aGF0IHdvdWxkIG5vcm1hbGx5IG5lZWQgInBvb3IgbWFuJ3MgZXNjYXBpbmciIGxpa2U6CgogICAjZGVmaW5lKCkKCiAgICR7YmxhaApdXSMKCiNpbmNsdWRlKCAiZGlzY2xhaW1lci50eHQiICJvcGluaW9uLnR4dCIgKQojaW5jbHVkZSggJGZvbyAkYmFyICkKCiNwYXJzZSggImxlY29yYnVzaWVyLnZtIiApCiNwYXJzZSggJGZvbyApCgojZXZhbHVhdGUoICdzdHJpbmcgd2l0aCBWVEwgI2lmKHRydWUpd2lsbCBiZSBkaXNwbGF5ZWQjZW5kJyApCgojZGVmaW5lKCAkaGVsbG8gKSBIZWxsbyAkd2hvICNlbmQgI3NldCggJHdobyA9ICJXb3JsZCEiKSAkaGVsbG8gIyMgZGlzcGxheXMgSGVsbG8gV29ybGQhCgojZm9yZWFjaCggJGN1c3RvbWVyIGluICRjdXN0b21lckxpc3QgKQoKICAgICRmb3JlYWNoLmNvdW50ICRjdXN0b21lci5OYW1lCgogICAgI2lmKCAkZm9vID09ICR7YmFyfSkKICAgICAgICBpdCdzIHRydWUhCiAgICAgICAgI2JyZWFrCiAgICAje2Vsc2V9CiAgICAgICAgaXQncyBub3QhCiAgICAgICAgI3N0b3AKICAgICNlbmQKCiAgICAjaWYgKCRmb3JlYWNoLnBhcmVudC5oYXNOZXh0KQogICAgICAgICR2ZWxvY2l0eUNvdW50CiAgICAjZW5kCiNlbmQKCiRzb21lT2JqZWN0LmdldFZhbHVlcygidGhpcyBpcyBhIHN0cmluZyBzcGxpdAogICAgICAgIGFjcm9zcyBsaW5lcyIpCgokc29tZU9iamVjdCgiVGhpcyBwbHVzICRzb21ldGhpbmcgaW4gdGhlIG1pZGRsZSIpLm1ldGhvZCg3NTY3KS5wcm9wZXJ0eQoKI21hY3JvKCB0YWJsZXJvd3MgJGNvbG9yICRzb21lbGlzdCApCiAgICAjZm9yZWFjaCggJHNvbWV0aGluZyBpbiAkc29tZWxpc3QgKQogICAgICAgIDx0cj48dGQgYmdjb2xvcj0kY29sb3I+JHNvbWV0aGluZzwvdGQ+PC90cj4KICAgICAgICA8dHI+PHRkIGJnY29sb3I9JGNvbG9yPiRib2R5Q29udGVudDwvdGQ+PC90cj4KICAgICNlbmQKI2VuZAoKI3RhYmxlcm93cygicmVkIiBbImRhZHNkZiIsImRzYSJdKQojQHRhYmxlcm93cygicmVkIiBbImRhZHNkZiIsImRzYSJdKSBzb21lIGJvZHkgY29udGVudCAjZW5kCgogICBWYXJpYWJsZSByZWZlcmVuY2U6ICNzZXQoICRtb25rZXkgPSAkYmlsbCApCiAgIFN0cmluZyBsaXRlcmFsOiAjc2V0KCAkbW9ua2V5LkZyaWVuZCA9ICdtb25pY2EnICkKICAgUHJvcGVydHkgcmVmZXJlbmNlOiAjc2V0KCAkbW9ua2V5LkJsYW1lID0gJHdoaXRlaG91c2UuTGVhayApCiAgIE1ldGhvZCByZWZlcmVuY2U6ICNzZXQoICRtb25rZXkuUGxhbiA9ICRzcGluZG9jdG9yLndlYXZlKCR3ZWIpICkKICAgTnVtYmVyIGxpdGVyYWw6ICNzZXQoICRtb25rZXkuTnVtYmVyID0gMTIzICkKICAgUmFuZ2Ugb3BlcmF0b3I6ICNzZXQoICRtb25rZXkuTnVtYmVycyA9IFsxLi4zXSApCiAgIE9iamVjdCBsaXN0OiAjc2V0KCAkbW9ua2V5LlNheSA9IFsiTm90IiwgJG15LCAiZmF1bHQiXSApCiAgIE9iamVjdCBtYXA6ICNzZXQoICRtb25rZXkuTWFwID0geyJiYW5hbmEiIDogImdvb2QiLCAicm9hc3QgYmVlZiIgOiAiYmFkIn0pCgpUaGUgUkhTIGNhbiBhbHNvIGJlIGEgc2ltcGxlIGFyaXRobWV0aWMgZXhwcmVzc2lvbiwgc3VjaCBhczoKQWRkaXRpb246ICNzZXQoICR2YWx1ZSA9ICRmb28gKyAxICkKICAgU3VidHJhY3Rpb246ICNzZXQoICR2YWx1ZSA9ICRiYXIgLSAxICkKICAgTXVsdGlwbGljYXRpb246ICNzZXQoICR2YWx1ZSA9ICRmb28gKiAkYmFyICkKICAgRGl2aXNpb246ICNzZXQoICR2YWx1ZSA9ICRmb28gLyAkYmFyICkKICAgUmVtYWluZGVyOiAjc2V0KCAkdmFsdWUgPSAkZm9vICUgJGJhciApCgo8L3RleHRhcmVhPjwvZm9ybT4KICAgIDxzY3JpcHQ+CiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICAgICAgdGhlbWU6ICJuaWdodCIsCiAgICAgICAgbGluZU51bWJlcnM6IHRydWUsCiAgICAgICAgaW5kZW50VW5pdDogNCwKICAgICAgICBtb2RlOiAidGV4dC92ZWxvY2l0eSIKICAgICAgfSk7CiAgICA8L3NjcmlwdD4KCiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC92ZWxvY2l0eTwvY29kZT4uPC9wPgoKICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/velocity/velocity.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJ2ZWxvY2l0eSIsIGZ1bmN0aW9uKCkgewogICAgZnVuY3Rpb24gcGFyc2VXb3JkcyhzdHIpIHsKICAgICAgICB2YXIgb2JqID0ge30sIHdvcmRzID0gc3RyLnNwbGl0KCIgIik7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB3b3Jkcy5sZW5ndGg7ICsraSkgb2JqW3dvcmRzW2ldXSA9IHRydWU7CiAgICAgICAgcmV0dXJuIG9iajsKICAgIH0KCiAgICB2YXIga2V5d29yZHMgPSBwYXJzZVdvcmRzKCIjZW5kICNlbHNlICNicmVhayAjc3RvcCAjW1sgI11dICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiI3tlbmR9ICN7ZWxzZX0gI3ticmVha30gI3tzdG9wfSIpOwogICAgdmFyIGZ1bmN0aW9ucyA9IHBhcnNlV29yZHMoIiNpZiAjZWxzZWlmICNmb3JlYWNoICNzZXQgI2luY2x1ZGUgI3BhcnNlICNtYWNybyAjZGVmaW5lICNldmFsdWF0ZSAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIje2lmfSAje2Vsc2VpZn0gI3tmb3JlYWNofSAje3NldH0gI3tpbmNsdWRlfSAje3BhcnNlfSAje21hY3JvfSAje2RlZmluZX0gI3tldmFsdWF0ZX0iKTsKICAgIHZhciBzcGVjaWFscyA9IHBhcnNlV29yZHMoIiRmb3JlYWNoLmNvdW50ICRmb3JlYWNoLmhhc05leHQgJGZvcmVhY2guZmlyc3QgJGZvcmVhY2gubGFzdCAkZm9yZWFjaC50b3Btb3N0ICRmb3JlYWNoLnBhcmVudC5jb3VudCAkZm9yZWFjaC5wYXJlbnQuaGFzTmV4dCAkZm9yZWFjaC5wYXJlbnQuZmlyc3QgJGZvcmVhY2gucGFyZW50Lmxhc3QgJGZvcmVhY2gucGFyZW50ICR2ZWxvY2l0eUNvdW50ICQhYm9keUNvbnRlbnQgJGJvZHlDb250ZW50Iik7CiAgICB2YXIgaXNPcGVyYXRvckNoYXIgPSAvWytcLSomJT08PiE/OlwvfF0vOwoKICAgIGZ1bmN0aW9uIGNoYWluKHN0cmVhbSwgc3RhdGUsIGYpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IGY7CiAgICAgICAgcmV0dXJuIGYoc3RyZWFtLCBzdGF0ZSk7CiAgICB9CiAgICBmdW5jdGlvbiB0b2tlbkJhc2Uoc3RyZWFtLCBzdGF0ZSkgewogICAgICAgIHZhciBiZWZvcmVQYXJhbXMgPSBzdGF0ZS5iZWZvcmVQYXJhbXM7CiAgICAgICAgc3RhdGUuYmVmb3JlUGFyYW1zID0gZmFsc2U7CiAgICAgICAgdmFyIGNoID0gc3RyZWFtLm5leHQoKTsKICAgICAgICAvLyBzdGFydCBvZiB1bnBhcnNlZCBzdHJpbmc/CiAgICAgICAgaWYgKChjaCA9PSAiJyIpICYmIHN0YXRlLmluUGFyYW1zKSB7CiAgICAgICAgICAgIHN0YXRlLmxhc3RUb2tlbldhc0J1aWx0aW4gPSBmYWxzZTsKICAgICAgICAgICAgcmV0dXJuIGNoYWluKHN0cmVhbSwgc3RhdGUsIHRva2VuU3RyaW5nKGNoKSk7CiAgICAgICAgfQogICAgICAgIC8vIHN0YXJ0IG9mIHBhcnNlZCBzdHJpbmc/CiAgICAgICAgZWxzZSBpZiAoKGNoID09ICciJykpIHsKICAgICAgICAgICAgc3RhdGUubGFzdFRva2VuV2FzQnVpbHRpbiA9IGZhbHNlOwogICAgICAgICAgICBpZiAoc3RhdGUuaW5TdHJpbmcpIHsKICAgICAgICAgICAgICAgIHN0YXRlLmluU3RyaW5nID0gZmFsc2U7CiAgICAgICAgICAgICAgICByZXR1cm4gInN0cmluZyI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoc3RhdGUuaW5QYXJhbXMpCiAgICAgICAgICAgICAgICByZXR1cm4gY2hhaW4oc3RyZWFtLCBzdGF0ZSwgdG9rZW5TdHJpbmcoY2gpKTsKICAgICAgICB9CiAgICAgICAgLy8gaXMgaXQgb25lIG9mIHRoZSBzcGVjaWFsIHNpZ25zIFtde30oKS4sOz8gU2VwZXJhdG9yPwogICAgICAgIGVsc2UgaWYgKC9bXFtcXXt9XChcKSw7XC5dLy50ZXN0KGNoKSkgewogICAgICAgICAgICBpZiAoY2ggPT0gIigiICYmIGJlZm9yZVBhcmFtcykKICAgICAgICAgICAgICAgIHN0YXRlLmluUGFyYW1zID0gdHJ1ZTsKICAgICAgICAgICAgZWxzZSBpZiAoY2ggPT0gIikiKSB7CiAgICAgICAgICAgICAgICBzdGF0ZS5pblBhcmFtcyA9IGZhbHNlOwogICAgICAgICAgICAgICAgc3RhdGUubGFzdFRva2VuV2FzQnVpbHRpbiA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIC8vIHN0YXJ0IG9mIGEgbnVtYmVyIHZhbHVlPwogICAgICAgIGVsc2UgaWYgKC9cZC8udGVzdChjaCkpIHsKICAgICAgICAgICAgc3RhdGUubGFzdFRva2VuV2FzQnVpbHRpbiA9IGZhbHNlOwogICAgICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcd1wuXS8pOwogICAgICAgICAgICByZXR1cm4gIm51bWJlciI7CiAgICAgICAgfQogICAgICAgIC8vIG11bHRpIGxpbmUgY29tbWVudD8KICAgICAgICBlbHNlIGlmIChjaCA9PSAiIyIgJiYgc3RyZWFtLmVhdCgiKiIpKSB7CiAgICAgICAgICAgIHN0YXRlLmxhc3RUb2tlbldhc0J1aWx0aW4gPSBmYWxzZTsKICAgICAgICAgICAgcmV0dXJuIGNoYWluKHN0cmVhbSwgc3RhdGUsIHRva2VuQ29tbWVudCk7CiAgICAgICAgfQogICAgICAgIC8vIHVucGFyc2VkIGNvbnRlbnQ/CiAgICAgICAgZWxzZSBpZiAoY2ggPT0gIiMiICYmIHN0cmVhbS5tYXRjaCgvICpcWyAqXFsvKSkgewogICAgICAgICAgICBzdGF0ZS5sYXN0VG9rZW5XYXNCdWlsdGluID0gZmFsc2U7CiAgICAgICAgICAgIHJldHVybiBjaGFpbihzdHJlYW0sIHN0YXRlLCB0b2tlblVucGFyc2VkKTsKICAgICAgICB9CiAgICAgICAgLy8gc2luZ2xlIGxpbmUgY29tbWVudD8KICAgICAgICBlbHNlIGlmIChjaCA9PSAiIyIgJiYgc3RyZWFtLmVhdCgiIyIpKSB7CiAgICAgICAgICAgIHN0YXRlLmxhc3RUb2tlbldhc0J1aWx0aW4gPSBmYWxzZTsKICAgICAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICAgICAgICByZXR1cm4gImNvbW1lbnQiOwogICAgICAgIH0KICAgICAgICAvLyB2YXJpYWJsZT8KICAgICAgICBlbHNlIGlmIChjaCA9PSAiJCIpIHsKICAgICAgICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXHdcZFwkX1wue31dLyk7CiAgICAgICAgICAgIC8vIGlzIGl0IG9uZSBvZiB0aGUgc3BlY2lhbHM/CiAgICAgICAgICAgIGlmIChzcGVjaWFscyAmJiBzcGVjaWFscy5wcm9wZXJ0eUlzRW51bWVyYWJsZShzdHJlYW0uY3VycmVudCgpKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICJrZXl3b3JkIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHN0YXRlLmxhc3RUb2tlbldhc0J1aWx0aW4gPSB0cnVlOwogICAgICAgICAgICAgICAgc3RhdGUuYmVmb3JlUGFyYW1zID0gdHJ1ZTsKICAgICAgICAgICAgICAgIHJldHVybiAiYnVpbHRpbiI7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gaXMgaXQgYSBvcGVyYXRvcj8KICAgICAgICBlbHNlIGlmIChpc09wZXJhdG9yQ2hhci50ZXN0KGNoKSkgewogICAgICAgICAgICBzdGF0ZS5sYXN0VG9rZW5XYXNCdWlsdGluID0gZmFsc2U7CiAgICAgICAgICAgIHN0cmVhbS5lYXRXaGlsZShpc09wZXJhdG9yQ2hhcik7CiAgICAgICAgICAgIHJldHVybiAib3BlcmF0b3IiOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgLy8gZ2V0IHRoZSB3aG9sZSB3b3JkCiAgICAgICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1x3XCRfe31AXS8pOwogICAgICAgICAgICB2YXIgd29yZCA9IHN0cmVhbS5jdXJyZW50KCk7CiAgICAgICAgICAgIC8vIGlzIGl0IG9uZSBvZiB0aGUgbGlzdGVkIGtleXdvcmRzPwogICAgICAgICAgICBpZiAoa2V5d29yZHMgJiYga2V5d29yZHMucHJvcGVydHlJc0VudW1lcmFibGUod29yZCkpCiAgICAgICAgICAgICAgICByZXR1cm4gImtleXdvcmQiOwogICAgICAgICAgICAvLyBpcyBpdCBvbmUgb2YgdGhlIGxpc3RlZCBmdW5jdGlvbnM/CiAgICAgICAgICAgIGlmIChmdW5jdGlvbnMgJiYgZnVuY3Rpb25zLnByb3BlcnR5SXNFbnVtZXJhYmxlKHdvcmQpIHx8CiAgICAgICAgICAgICAgICAgICAgKHN0cmVhbS5jdXJyZW50KCkubWF0Y2goL14jQD9bYS16MC05X10rICokL2kpICYmIHN0cmVhbS5wZWVrKCk9PSIoIikgJiYKICAgICAgICAgICAgICAgICAgICAgIShmdW5jdGlvbnMgJiYgZnVuY3Rpb25zLnByb3BlcnR5SXNFbnVtZXJhYmxlKHdvcmQudG9Mb3dlckNhc2UoKSkpKSB7CiAgICAgICAgICAgICAgICBzdGF0ZS5iZWZvcmVQYXJhbXMgPSB0cnVlOwogICAgICAgICAgICAgICAgc3RhdGUubGFzdFRva2VuV2FzQnVpbHRpbiA9IGZhbHNlOwogICAgICAgICAgICAgICAgcmV0dXJuICJrZXl3b3JkIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoc3RhdGUuaW5TdHJpbmcpIHsKICAgICAgICAgICAgICAgIHN0YXRlLmxhc3RUb2tlbldhc0J1aWx0aW4gPSBmYWxzZTsKICAgICAgICAgICAgICAgIHJldHVybiAic3RyaW5nIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoc3RyZWFtLnBvcyA+IHdvcmQubGVuZ3RoICYmIHN0cmVhbS5zdHJpbmcuY2hhckF0KHN0cmVhbS5wb3Mtd29yZC5sZW5ndGgtMSk9PSIuIiAmJiBzdGF0ZS5sYXN0VG9rZW5XYXNCdWlsdGluKQogICAgICAgICAgICAgICAgcmV0dXJuICJidWlsdGluIjsKICAgICAgICAgICAgLy8gZGVmYXVsdDoganVzdCBhICJ3b3JkIgogICAgICAgICAgICBzdGF0ZS5sYXN0VG9rZW5XYXNCdWlsdGluID0gZmFsc2U7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiB0b2tlblN0cmluZyhxdW90ZSkgewogICAgICAgIHJldHVybiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgICAgICAgIHZhciBlc2NhcGVkID0gZmFsc2UsIG5leHQsIGVuZCA9IGZhbHNlOwogICAgICAgICAgICB3aGlsZSAoKG5leHQgPSBzdHJlYW0ubmV4dCgpKSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICBpZiAoKG5leHQgPT0gcXVvdGUpICYmICFlc2NhcGVkKSB7CiAgICAgICAgICAgICAgICAgICAgZW5kID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChxdW90ZT09JyInICYmIHN0cmVhbS5wZWVrKCkgPT0gJyQnICYmICFlc2NhcGVkKSB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGUuaW5TdHJpbmcgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGVuZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlc2NhcGVkID0gIWVzY2FwZWQgJiYgbmV4dCA9PSAiXFwiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChlbmQpIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlOwogICAgICAgICAgICByZXR1cm4gInN0cmluZyI7CiAgICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiB0b2tlbkNvbW1lbnQoc3RyZWFtLCBzdGF0ZSkgewogICAgICAgIHZhciBtYXliZUVuZCA9IGZhbHNlLCBjaDsKICAgICAgICB3aGlsZSAoY2ggPSBzdHJlYW0ubmV4dCgpKSB7CiAgICAgICAgICAgIGlmIChjaCA9PSAiIyIgJiYgbWF5YmVFbmQpIHsKICAgICAgICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbWF5YmVFbmQgPSAoY2ggPT0gIioiKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICJjb21tZW50IjsKICAgIH0KCiAgICBmdW5jdGlvbiB0b2tlblVucGFyc2VkKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgICB2YXIgbWF5YmVFbmQgPSAwLCBjaDsKICAgICAgICB3aGlsZSAoY2ggPSBzdHJlYW0ubmV4dCgpKSB7CiAgICAgICAgICAgIGlmIChjaCA9PSAiIyIgJiYgbWF5YmVFbmQgPT0gMikgewogICAgICAgICAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY2ggPT0gIl0iKQogICAgICAgICAgICAgICAgbWF5YmVFbmQrKzsKICAgICAgICAgICAgZWxzZSBpZiAoY2ggIT0gIiAiKQogICAgICAgICAgICAgICAgbWF5YmVFbmQgPSAwOwogICAgICAgIH0KICAgICAgICByZXR1cm4gIm1ldGEiOwogICAgfQogICAgLy8gSW50ZXJmYWNlCgogICAgcmV0dXJuIHsKICAgICAgICBzdGFydFN0YXRlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIHRva2VuaXplOiB0b2tlbkJhc2UsCiAgICAgICAgICAgICAgICBiZWZvcmVQYXJhbXM6IGZhbHNlLAogICAgICAgICAgICAgICAgaW5QYXJhbXM6IGZhbHNlLAogICAgICAgICAgICAgICAgaW5TdHJpbmc6IGZhbHNlLAogICAgICAgICAgICAgICAgbGFzdFRva2VuV2FzQnVpbHRpbjogZmFsc2UKICAgICAgICAgICAgfTsKICAgICAgICB9LAoKICAgICAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICAgICAgICBpZiAoc3RyZWFtLmVhdFNwYWNlKCkpIHJldHVybiBudWxsOwogICAgICAgICAgICByZXR1cm4gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CiAgICAgICAgfSwKICAgICAgICBibG9ja0NvbW1lbnRTdGFydDogIiMqIiwKICAgICAgICBibG9ja0NvbW1lbnRFbmQ6ICIqIyIsCiAgICAgICAgbGluZUNvbW1lbnQ6ICIjIyIsCiAgICAgICAgZm9sZDogInZlbG9jaXR5IgogICAgfTsKfSk7CgpDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQvdmVsb2NpdHkiLCAidmVsb2NpdHkiKTsKCn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/verilog/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/verilog/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogVmVyaWxvZy9TeXN0ZW1WZXJpbG9nIG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vLi4vYWRkb24vZWRpdC9tYXRjaGJyYWNrZXRzLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9InZlcmlsb2cuanMiPjwvc2NyaXB0Pgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPi5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazt9PC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aW1nIGlkPWxvZ28gc3JjPSIuLi8uLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5MYW5ndWFnZSBtb2RlczwvYT4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+VmVyaWxvZy9TeXN0ZW1WZXJpbG9nPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5TeXN0ZW1WZXJpbG9nIG1vZGU8L2gyPgoKPGRpdj48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgovLyBMaXRlcmFscwoxJ2IwCjEnYngKMSdiegoxNidoREM3OAonaGRlYWRiZWVmCidiMDAxMXh4enoKMTIzNAozMidkNTY3OAozLjRlNgotMTI4LjcKCi8vIE1hY3JvIGRlZmluaXRpb24KYGRlZmluZSBCVVNfV0lEVEggPSA4OwoKLy8gTW9kdWxlIGRlZmluaXRpb24KbW9kdWxlIGJsb2NrKAogIGlucHV0ICAgICAgICAgICAgICAgICAgIGNsaywKICBpbnB1dCAgICAgICAgICAgICAgICAgICByc3RfbiwKICBpbnB1dCAgW2BCVVNfV0lEVEgtMTowXSBkYXRhX2luLAogIG91dHB1dCBbYEJVU19XSURUSC0xOjBdIGRhdGFfb3V0Cik7CiAgCiAgYWx3YXlzIEAocG9zZWRnZSBjbGsgb3IgbmVnZWRnZSByc3RfbikgYmVnaW4KCiAgICBpZiAofnJzdF9uKSBiZWdpbgogICAgICBkYXRhX291dCA8PSA4J2IwOwogICAgZW5kIGVsc2UgYmVnaW4KICAgICAgZGF0YV9vdXQgPD0gZGF0YV9pbjsKICAgIGVuZAogICAgCiAgICBpZiAofnJzdF9uKQogICAgICBkYXRhX291dCA8PSA4J2IwOwogICAgZWxzZQogICAgICBkYXRhX291dCA8PSBkYXRhX2luOwogICAgCiAgICBpZiAofnJzdF9uKQogICAgICBiZWdpbgogICAgICAgIGRhdGFfb3V0IDw9IDgnYjA7CiAgICAgIGVuZAogICAgZWxzZQogICAgICBiZWdpbgogICAgICAgIGRhdGFfb3V0IDw9IGRhdGFfaW47CiAgICAgIGVuZAoKICBlbmQKICAKZW5kbW9kdWxlCgovLyBDbGFzcyBkZWZpbml0aW9uCmNsYXNzIHRlc3Q7CgogIC8qKgogICAqIFN1bSB0d28gaW50ZWdlcnMKICAgKi8KICBmdW5jdGlvbiBpbnQgc3VtKGludCBhLCBpbnQgYik7CiAgICBpbnQgcmVzdWx0ID0gYSArIGI7CiAgICBzdHJpbmcgbXNnID0gJHNmb3JtYXRmKCIlZCArICVkID0gJWQiLCBhLCBiLCByZXN1bHQpOwogICAgJGRpc3BsYXkobXNnKTsKICAgIHJldHVybiByZXN1bHQ7CiAgZW5kZnVuY3Rpb24KICAKICB0YXNrIGRlbGF5KGludCBudW1fY3ljbGVzKTsKICAgIHJlcGVhdChudW1fY3ljbGVzKSAjMTsKICBlbmR0YXNrCiAgCmVuZGNsYXNzCgo8L3RleHRhcmVhPjwvZGl2PgoKPHNjcmlwdD4KICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgbGluZU51bWJlcnM6IHRydWUsCiAgICBtYXRjaEJyYWNrZXRzOiB0cnVlLAogICAgbW9kZTogewogICAgICBuYW1lOiAidmVyaWxvZyIsCiAgICAgIG5vSW5kZW50S2V5d29yZHM6IFsicGFja2FnZSJdCiAgICB9CiAgfSk7Cjwvc2NyaXB0PgoKPHA+ClN5bnRheCBoaWdobGlnaHRpbmcgYW5kIGluZGVudGF0aW9uIGZvciB0aGUgVmVyaWxvZyBhbmQgU3lzdGVtVmVyaWxvZyBsYW5ndWFnZXMgKElFRUUgMTgwMCkuCjxoMj5Db25maWd1cmF0aW9uIG9wdGlvbnM6PC9oMj4KICA8dWw+CiAgICA8bGk+PHN0cm9uZz5ub0luZGVudEtleXdvcmRzPC9zdHJvbmc+IC0gTGlzdCBvZiBrZXl3b3JkcyB3aGljaCBzaG91bGQgbm90IGNhdXNlIGlkZW50YXRpb24gdG8gaW5jcmVhc2UuIEUuZy4gWyJwYWNrYWdlIiwgIm1vZHVsZSJdLiBEZWZhdWx0OiBOb25lPC9saT4KICA8L3VsPgo8L3A+Cgo8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC94LXZlcmlsb2c8L2NvZGU+IGFuZCA8Y29kZT50ZXh0L3gtc3lzdGVtdmVyaWxvZzwvY29kZT4uPC9wPgo8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/verilog/test.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24oKSB7CiAgdmFyIG1vZGUgPSBDb2RlTWlycm9yLmdldE1vZGUoe2luZGVudFVuaXQ6IDR9LCAidmVyaWxvZyIpOwogIGZ1bmN0aW9uIE1UKG5hbWUpIHsgdGVzdC5tb2RlKG5hbWUsIG1vZGUsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpOyB9CgogIE1UKCJCaW5hcnkgbGl0ZXJhbHMiLAogICAgICJbbnVtYmVyIDEnYjBdIiwKICAgICAiW251bWJlciAxJ2IxXSIsCiAgICAgIltudW1iZXIgMSdieF0iLAogICAgICJbbnVtYmVyIDEnYnpdIiwKICAgICAiW251bWJlciAxJ2JYXSIsCiAgICAgIltudW1iZXIgMSdiWl0iLAogICAgICJbbnVtYmVyIDEnQjBdIiwKICAgICAiW251bWJlciAxJ0IxXSIsCiAgICAgIltudW1iZXIgMSdCeF0iLAogICAgICJbbnVtYmVyIDEnQnpdIiwKICAgICAiW251bWJlciAxJ0JYXSIsCiAgICAgIltudW1iZXIgMSdCWl0iLAogICAgICJbbnVtYmVyIDEnYjBdIiwKICAgICAiW251bWJlciAxJ2IxXSIsCiAgICAgIltudW1iZXIgMidiMDFdIiwKICAgICAiW251bWJlciAyJ2J4el0iLAogICAgICJbbnVtYmVyIDInYjExXSIsCiAgICAgIltudW1iZXIgMidiMTBdIiwKICAgICAiW251bWJlciAyJ2IxWl0iLAogICAgICJbbnVtYmVyIDEyJ2IwMTAxXzAxMDFfMDEwMV0iLAogICAgICJbbnVtYmVyIDEnYiAwXSIsCiAgICAgIltudW1iZXIgJ2IwMTAxXSIKICApOwoKICBNVCgiT2N0YWwgbGl0ZXJhbHMiLAogICAgICJbbnVtYmVyIDMnbzddIiwKICAgICAiW251bWJlciAzJ083XSIsCiAgICAgIltudW1iZXIgMydzbzddIiwKICAgICAiW251bWJlciAzJ1NPN10iCiAgKTsKCiAgTVQoIkRlY2ltYWwgbGl0ZXJhbHMiLAogICAgICJbbnVtYmVyIDBdIiwKICAgICAiW251bWJlciAxXSIsCiAgICAgIltudW1iZXIgN10iLAogICAgICJbbnVtYmVyIDEyM180NTZdIiwKICAgICAiW251bWJlciAnZDMzXSIsCiAgICAgIltudW1iZXIgOCdkMjU1XSIsCiAgICAgIltudW1iZXIgOCdEMjU1XSIsCiAgICAgIltudW1iZXIgOCdzZDI1NV0iLAogICAgICJbbnVtYmVyIDgnU0QyNTVdIiwKICAgICAiW251bWJlciAzMidkMTIzXSIsCiAgICAgIltudW1iZXIgMzIgJ2QxMjNdIiwKICAgICAiW251bWJlciAzMiAnZCAxMjNdIgogICk7CgogIE1UKCJIZXggbGl0ZXJhbHMiLAogICAgICJbbnVtYmVyIDQnaDBdIiwKICAgICAiW251bWJlciA0J2hhXSIsCiAgICAgIltudW1iZXIgNCdoRl0iLAogICAgICJbbnVtYmVyIDQnaHhdIiwKICAgICAiW251bWJlciA0J2h6XSIsCiAgICAgIltudW1iZXIgNCdoWF0iLAogICAgICJbbnVtYmVyIDQnaFpdIiwKICAgICAiW251bWJlciAzMidoZGM3OF0iLAogICAgICJbbnVtYmVyIDMyJ2hEQzc4XSIsCiAgICAgIltudW1iZXIgMzIgJ2hEQzc4XSIsCiAgICAgIltudW1iZXIgMzInaCBEQzc4XSIsCiAgICAgIltudW1iZXIgMzIgJ2ggREM3OF0iLAogICAgICJbbnVtYmVyIDMyJ2g0NHg3XSIsCiAgICAgIltudW1iZXIgMzInaEZGRj9dIgogICk7CgogIE1UKCJSZWFsIG51bWJlciBsaXRlcmFscyIsCiAgICAgIltudW1iZXIgMS4yXSIsCiAgICAgIltudW1iZXIgMC4xXSIsCiAgICAgIltudW1iZXIgMjM5NC4yNjMzMV0iLAogICAgICJbbnVtYmVyIDEuMkUxMl0iLAogICAgICJbbnVtYmVyIDEuMmUxMl0iLAogICAgICJbbnVtYmVyIDEuMzBlLTJdIiwKICAgICAiW251bWJlciAwLjFlLTBdIiwKICAgICAiW251bWJlciAyM0UxMF0iLAogICAgICJbbnVtYmVyIDI5RS0yXSIsCiAgICAgIltudW1iZXIgMjM2LjEyM183NjNfZS0xMl0iCiAgKTsKCiAgTVQoIk9wZXJhdG9ycyIsCiAgICAgIlttZXRhIF5dIgogICk7CgogIE1UKCJLZXl3b3JkcyIsCiAgICAgIltrZXl3b3JkIGxvZ2ljXSIsCiAgICAgIltrZXl3b3JkIGxvZ2ljXSBbdmFyaWFibGUgZm9vXSIsCiAgICAgIltrZXl3b3JkIHJlZ10gW3ZhcmlhYmxlIGFiY10iCiAgKTsKCiAgTVQoIlZhcmlhYmxlcyIsCiAgICAgIlt2YXJpYWJsZSBfbGVhZGluZ191bmRlcnNjb3JlXSIsCiAgICAgIlt2YXJpYWJsZSBfaWZdIiwKICAgICAiW251bWJlciAxMl0gW3ZhcmlhYmxlIGZvb10iLAogICAgICJbdmFyaWFibGUgZm9vXSBbbnVtYmVyIDE0XSIKICApOwoKICBNVCgiVGljayBkZWZpbmVzIiwKICAgICAiW2RlZiBgRk9PXSIsCiAgICAgIltkZWYgYGZvb10iLAogICAgICJbZGVmIGBGT09fYmFyXSIKICApOwoKICBNVCgiU3lzdGVtIGNhbGxzIiwKICAgICAiW21ldGEgJGRpc3BsYXldIiwKICAgICAiW21ldGEgJHZwaV9wcmludGZdIgogICk7CgogIE1UKCJMaW5lIGNvbW1lbnQiLCAiW2NvbW1lbnQgLy8gSGVsbG8gd29ybGRdIik7CgoKCn0pKCk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/verilog/verilog.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJ2ZXJpbG9nIiwgZnVuY3Rpb24oY29uZmlnLCBwYXJzZXJDb25maWcpIHsKCiAgdmFyIGluZGVudFVuaXQgPSBjb25maWcuaW5kZW50VW5pdCwKICAgICAgc3RhdGVtZW50SW5kZW50VW5pdCA9IHBhcnNlckNvbmZpZy5zdGF0ZW1lbnRJbmRlbnRVbml0IHx8IGluZGVudFVuaXQsCiAgICAgIGRvbnRBbGlnbkNhbGxzID0gcGFyc2VyQ29uZmlnLmRvbnRBbGlnbkNhbGxzLAogICAgICBub0luZGVudEtleXdvcmRzID0gcGFyc2VyQ29uZmlnLm5vSW5kZW50S2V5d29yZHMgfHwgW10sCiAgICAgIG11bHRpTGluZVN0cmluZ3MgPSBwYXJzZXJDb25maWcubXVsdGlMaW5lU3RyaW5nczsKCiAgZnVuY3Rpb24gd29yZHMoc3RyKSB7CiAgICB2YXIgb2JqID0ge30sIHdvcmRzID0gc3RyLnNwbGl0KCIgIik7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHdvcmRzLmxlbmd0aDsgKytpKSBvYmpbd29yZHNbaV1dID0gdHJ1ZTsKICAgIHJldHVybiBvYmo7CiAgfQoKICAvKioKICAgKiBLZXl3b3JkcyBmcm9tIElFRUUgMTgwMC0yMDEyCiAgICovCiAgdmFyIGtleXdvcmRzID0gd29yZHMoCiAgICAiYWNjZXB0X29uIGFsaWFzIGFsd2F5cyBhbHdheXNfY29tYiBhbHdheXNfZmYgYWx3YXlzX2xhdGNoIGFuZCBhc3NlcnQgYXNzaWduIGFzc3VtZSBhdXRvbWF0aWMgYmVmb3JlIGJlZ2luIGJpbmQgIiArCiAgICAiYmlucyBiaW5zb2YgYml0IGJyZWFrIGJ1ZiBidWZpZjAgYnVmaWYxIGJ5dGUgY2FzZSBjYXNleCBjYXNleiBjZWxsIGNoYW5kbGUgY2hlY2tlciBjbGFzcyBjbG9ja2luZyBjbW9zIGNvbmZpZyAiICsKICAgICJjb25zdCBjb25zdHJhaW50IGNvbnRleHQgY29udGludWUgY292ZXIgY292ZXJncm91cCBjb3ZlcnBvaW50IGNyb3NzIGRlYXNzaWduIGRlZmF1bHQgZGVmcGFyYW0gZGVzaWduIGRpc2FibGUgIiArCiAgICAiZGlzdCBkbyBlZGdlIGVsc2UgZW5kIGVuZGNhc2UgZW5kY2hlY2tlciBlbmRjbGFzcyBlbmRjbG9ja2luZyBlbmRjb25maWcgZW5kZnVuY3Rpb24gZW5kZ2VuZXJhdGUgZW5kZ3JvdXAgIiArCiAgICAiZW5kaW50ZXJmYWNlIGVuZG1vZHVsZSBlbmRwYWNrYWdlIGVuZHByaW1pdGl2ZSBlbmRwcm9ncmFtIGVuZHByb3BlcnR5IGVuZHNwZWNpZnkgZW5kc2VxdWVuY2UgZW5kdGFibGUgZW5kdGFzayAiICsKICAgICJlbnVtIGV2ZW50IGV2ZW50dWFsbHkgZXhwZWN0IGV4cG9ydCBleHRlbmRzIGV4dGVybiBmaW5hbCBmaXJzdF9tYXRjaCBmb3IgZm9yY2UgZm9yZWFjaCBmb3JldmVyIGZvcmsgZm9ya2pvaW4gIiArCiAgICAiZnVuY3Rpb24gZ2VuZXJhdGUgZ2VudmFyIGdsb2JhbCBoaWdoejAgaGlnaHoxIGlmIGlmZiBpZm5vbmUgaWdub3JlX2JpbnMgaWxsZWdhbF9iaW5zIGltcGxlbWVudHMgaW1wbGllcyBpbXBvcnQgIiArCiAgICAiaW5jZGlyIGluY2x1ZGUgaW5pdGlhbCBpbm91dCBpbnB1dCBpbnNpZGUgaW5zdGFuY2UgaW50IGludGVnZXIgaW50ZXJjb25uZWN0IGludGVyZmFjZSBpbnRlcnNlY3Qgam9pbiBqb2luX2FueSAiICsKICAgICJqb2luX25vbmUgbGFyZ2UgbGV0IGxpYmxpc3QgbGlicmFyeSBsb2NhbCBsb2NhbHBhcmFtIGxvZ2ljIGxvbmdpbnQgbWFjcm9tb2R1bGUgbWF0Y2hlcyBtZWRpdW0gbW9kcG9ydCBtb2R1bGUgIiArCiAgICAibmFuZCBuZWdlZGdlIG5ldHR5cGUgbmV3IG5leHR0aW1lIG5tb3Mgbm9yIG5vc2hvd2NhbmNlbGxlZCBub3Qgbm90aWYwIG5vdGlmMSBudWxsIG9yIG91dHB1dCBwYWNrYWdlIHBhY2tlZCAiICsKICAgICJwYXJhbWV0ZXIgcG1vcyBwb3NlZGdlIHByaW1pdGl2ZSBwcmlvcml0eSBwcm9ncmFtIHByb3BlcnR5IHByb3RlY3RlZCBwdWxsMCBwdWxsMSBwdWxsZG93biBwdWxsdXAgIiArCiAgICAicHVsc2VzdHlsZV9vbmRldGVjdCBwdWxzZXN0eWxlX29uZXZlbnQgcHVyZSByYW5kIHJhbmRjIHJhbmRjYXNlIHJhbmRzZXF1ZW5jZSByY21vcyByZWFsIHJlYWx0aW1lIHJlZiByZWcgIiArCiAgICAicmVqZWN0X29uIHJlbGVhc2UgcmVwZWF0IHJlc3RyaWN0IHJldHVybiBybm1vcyBycG1vcyBydHJhbiBydHJhbmlmMCBydHJhbmlmMSBzX2Fsd2F5cyBzX2V2ZW50dWFsbHkgc19uZXh0dGltZSAiICsKICAgICJzX3VudGlsIHNfdW50aWxfd2l0aCBzY2FsYXJlZCBzZXF1ZW5jZSBzaG9ydGludCBzaG9ydHJlYWwgc2hvd2NhbmNlbGxlZCBzaWduZWQgc21hbGwgc29mdCBzb2x2ZSBzcGVjaWZ5ICIgKwogICAgInNwZWNwYXJhbSBzdGF0aWMgc3RyaW5nIHN0cm9uZyBzdHJvbmcwIHN0cm9uZzEgc3RydWN0IHN1cGVyIHN1cHBseTAgc3VwcGx5MSBzeW5jX2FjY2VwdF9vbiBzeW5jX3JlamVjdF9vbiAiICsKICAgICJ0YWJsZSB0YWdnZWQgdGFzayB0aGlzIHRocm91Z2hvdXQgdGltZSB0aW1lcHJlY2lzaW9uIHRpbWV1bml0IHRyYW4gdHJhbmlmMCB0cmFuaWYxIHRyaSB0cmkwIHRyaTEgdHJpYW5kIHRyaW9yICIgKwogICAgInRyaXJlZyB0eXBlIHR5cGVkZWYgdW5pb24gdW5pcXVlIHVuaXF1ZTAgdW5zaWduZWQgdW50aWwgdW50aWxfd2l0aCB1bnR5cGVkIHVzZSB1d2lyZSB2YXIgdmVjdG9yZWQgdmlydHVhbCB2b2lkICIgKwogICAgIndhaXQgd2FpdF9vcmRlciB3YW5kIHdlYWsgd2VhazAgd2VhazEgd2hpbGUgd2lsZGNhcmQgd2lyZSB3aXRoIHdpdGhpbiB3b3IgeG5vciB4b3IiKTsKCiAgLyoqIE9wZXJhdG9ycyBmcm9tIElFRUUgMTgwMC0yMDEyCiAgICAgdW5hcnlfb3BlcmF0b3IgOjo9CiAgICAgICArIHwgLSB8ICEgfCB+IHwgJiB8IH4mIHwgfCB8IH58IHwgXiB8IH5eIHwgXn4KICAgICBiaW5hcnlfb3BlcmF0b3IgOjo9CiAgICAgICArIHwgLSB8ICogfCAvIHwgJSB8ID09IHwgIT0gfCA9PT0gfCAhPT0gfCA9PT8gfCAhPT8gfCAmJiB8IHx8IHwgKioKICAgICAgIHwgPCB8IDw9IHwgPiB8ID49IHwgJiB8IHwgfCBeIHwgXn4gfCB+XiB8ID4+IHwgPDwgfCA+Pj4gfCA8PDwKICAgICAgIHwgLT4gfCA8LT4KICAgICBpbmNfb3JfZGVjX29wZXJhdG9yIDo6PSArKyB8IC0tCiAgICAgdW5hcnlfbW9kdWxlX3BhdGhfb3BlcmF0b3IgOjo9CiAgICAgICAhIHwgfiB8ICYgfCB+JiB8IHwgfCB+fCB8IF4gfCB+XiB8IF5+CiAgICAgYmluYXJ5X21vZHVsZV9wYXRoX29wZXJhdG9yIDo6PQogICAgICAgPT0gfCAhPSB8ICYmIHwgfHwgfCAmIHwgfCB8IF4gfCBefiB8IH5eCiAgKi8KICB2YXIgaXNPcGVyYXRvckNoYXIgPSAvW1wrXC1cKlwvIX4mfF4lPT86XS87CiAgdmFyIGlzQnJhY2tldENoYXIgPSAvW1xbXF17fSgpXS87CgogIHZhciB1bnNpZ25lZE51bWJlciA9IC9cZFswLTlfXSovOwogIHZhciBkZWNpbWFsTGl0ZXJhbCA9IC9cZCpccyoncz9kXHMqXGRbMC05X10qL2k7CiAgdmFyIGJpbmFyeUxpdGVyYWwgPSAvXGQqXHMqJ3M/YlxzKlt4ejAxXVt4ejAxX10qL2k7CiAgdmFyIG9jdExpdGVyYWwgPSAvXGQqXHMqJ3M/b1xzKlt4ejAtN11beHowLTdfXSovaTsKICB2YXIgaGV4TGl0ZXJhbCA9IC9cZCpccyoncz9oXHMqWzAtOWEtZnh6P11bMC05YS1meHo/X10qL2k7CiAgdmFyIHJlYWxMaXRlcmFsID0gLyhcZFtcZF9dKihcLlxkW1xkX10qKT9FLT9bXGRfXSspfChcZFtcZF9dKlwuXGRbXGRfXSopL2k7CgogIHZhciBjbG9zaW5nQnJhY2tldE9yV29yZCA9IC9eKChcdyspfFspfVxdXSkvOwogIHZhciBjbG9zaW5nQnJhY2tldCA9IC9bKX1cXV0vOwoKICB2YXIgY3VyUHVuYzsKICB2YXIgY3VyS2V5d29yZDsKCiAgLy8gQmxvY2sgb3BlbmluZ3Mgd2hpY2ggYXJlIGNsb3NlZCBieSBhIG1hdGNoaW5nIGtleXdvcmQgaW4gdGhlIGZvcm0gb2YgKCJlbmQiICsga2V5d29yZCkKICAvLyBFLmcuICJ0YXNrIiA9PiAiZW5kdGFzayIKICB2YXIgYmxvY2tLZXl3b3JkcyA9IHdvcmRzKAogICAgImNhc2UgY2hlY2tlciBjbGFzcyBjbG9ja2luZyBjb25maWcgZnVuY3Rpb24gZ2VuZXJhdGUgZ3JvdXAgaW50ZXJmYWNlIG1vZHVsZSBwYWNrYWdlIiArCiAgICAicHJpbWl0aXZlIHByb2dyYW0gcHJvcGVydHkgc3BlY2lmeSBzZXF1ZW5jZSB0YWJsZSB0YXNrIgogICk7CgogIC8vIE9wZW5pbmcvY2xvc2luZyBwYWlycwogIHZhciBvcGVuQ2xvc2UgPSB7fTsKICBmb3IgKHZhciBrZXl3b3JkIGluIGJsb2NrS2V5d29yZHMpIHsKICAgIG9wZW5DbG9zZVtrZXl3b3JkXSA9ICJlbmQiICsga2V5d29yZDsKICB9CiAgb3BlbkNsb3NlWyJiZWdpbiJdID0gImVuZCI7CiAgb3BlbkNsb3NlWyJjYXNleCJdID0gImVuZGNhc2UiOwogIG9wZW5DbG9zZVsiY2FzZXoiXSA9ICJlbmRjYXNlIjsKICBvcGVuQ2xvc2VbImRvIiAgIF0gPSAid2hpbGUiOwogIG9wZW5DbG9zZVsiZm9yayIgXSA9ICJqb2luO2pvaW5fYW55O2pvaW5fbm9uZSI7CgogIGZvciAodmFyIGkgaW4gbm9JbmRlbnRLZXl3b3JkcykgewogICAgdmFyIGtleXdvcmQgPSBub0luZGVudEtleXdvcmRzW2ldOwogICAgaWYgKG9wZW5DbG9zZVtrZXl3b3JkXSkgewogICAgICBvcGVuQ2xvc2Vba2V5d29yZF0gPSB1bmRlZmluZWQ7CiAgICB9CiAgfQoKICB2YXIgc3RhdGVtZW50S2V5d29yZHMgPSB3b3JkcygiYWx3YXlzIGFsd2F5c19jb21iIGFsd2F5c19mZiBhbHdheXNfbGF0Y2ggYXNzZXJ0IGFzc2lnbiBhc3N1bWUgZWxzZSBmb3IgZm9yZWFjaCBmb3JldmVyIGlmIGluaXRpYWwgcmVwZWF0IHdoaWxlIik7CgogIGZ1bmN0aW9uIHRva2VuQmFzZShzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgY2ggPSBzdHJlYW0ucGVlaygpOwogICAgaWYgKC9bLDs6XC5dLy50ZXN0KGNoKSkgewogICAgICBjdXJQdW5jID0gc3RyZWFtLm5leHQoKTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBpZiAoaXNCcmFja2V0Q2hhci50ZXN0KGNoKSkgewogICAgICBjdXJQdW5jID0gc3RyZWFtLm5leHQoKTsKICAgICAgcmV0dXJuICJicmFja2V0IjsKICAgIH0KICAgIC8vIE1hY3JvcyAodGljay1kZWZpbmVzKQogICAgaWYgKGNoID09ICdgJykgewogICAgICBzdHJlYW0ubmV4dCgpOwogICAgICBpZiAoc3RyZWFtLmVhdFdoaWxlKC9bXHdcJF9dLykpIHsKICAgICAgICByZXR1cm4gImRlZiI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgIH0KICAgIC8vIFN5c3RlbSBjYWxscwogICAgaWYgKGNoID09ICckJykgewogICAgICBzdHJlYW0ubmV4dCgpOwogICAgICBpZiAoc3RyZWFtLmVhdFdoaWxlKC9bXHdcJF9dLykpIHsKICAgICAgICByZXR1cm4gIm1ldGEiOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICB9CiAgICAvLyBUaW1lIGxpdGVyYWxzCiAgICBpZiAoY2ggPT0gJyMnKSB7CiAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1xkXy5dLyk7CiAgICAgIHJldHVybiAiZGVmIjsKICAgIH0KICAgIC8vIFN0cmluZ3MKICAgIGlmIChjaCA9PSAnIicpIHsKICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlblN0cmluZyhjaCk7CiAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgIH0KICAgIC8vIENvbW1lbnRzCiAgICBpZiAoY2ggPT0gIi8iKSB7CiAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgIGlmIChzdHJlYW0uZWF0KCIqIikpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQ29tbWVudDsKICAgICAgICByZXR1cm4gdG9rZW5Db21tZW50KHN0cmVhbSwgc3RhdGUpOwogICAgICB9CiAgICAgIGlmIChzdHJlYW0uZWF0KCIvIikpIHsKICAgICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICAgICAgcmV0dXJuICJjb21tZW50IjsKICAgICAgfQogICAgICBzdHJlYW0uYmFja1VwKDEpOwogICAgfQoKICAgIC8vIE51bWVyaWMgbGl0ZXJhbHMKICAgIGlmIChzdHJlYW0ubWF0Y2gocmVhbExpdGVyYWwpIHx8CiAgICAgICAgc3RyZWFtLm1hdGNoKGRlY2ltYWxMaXRlcmFsKSB8fAogICAgICAgIHN0cmVhbS5tYXRjaChiaW5hcnlMaXRlcmFsKSB8fAogICAgICAgIHN0cmVhbS5tYXRjaChvY3RMaXRlcmFsKSB8fAogICAgICAgIHN0cmVhbS5tYXRjaChoZXhMaXRlcmFsKSB8fAogICAgICAgIHN0cmVhbS5tYXRjaCh1bnNpZ25lZE51bWJlcikgfHwKICAgICAgICBzdHJlYW0ubWF0Y2gocmVhbExpdGVyYWwpKSB7CiAgICAgIHJldHVybiAibnVtYmVyIjsKICAgIH0KCiAgICAvLyBPcGVyYXRvcnMKICAgIGlmIChzdHJlYW0uZWF0V2hpbGUoaXNPcGVyYXRvckNoYXIpKSB7CiAgICAgIHJldHVybiAibWV0YSI7CiAgICB9CgogICAgLy8gS2V5d29yZHMgLyBwbGFpbiB2YXJpYWJsZXMKICAgIGlmIChzdHJlYW0uZWF0V2hpbGUoL1tcd1wkX10vKSkgewogICAgICB2YXIgY3VyID0gc3RyZWFtLmN1cnJlbnQoKTsKICAgICAgaWYgKGtleXdvcmRzW2N1cl0pIHsKICAgICAgICBpZiAob3BlbkNsb3NlW2N1cl0pIHsKICAgICAgICAgIGN1clB1bmMgPSAibmV3YmxvY2siOwogICAgICAgIH0KICAgICAgICBpZiAoc3RhdGVtZW50S2V5d29yZHNbY3VyXSkgewogICAgICAgICAgY3VyUHVuYyA9ICJuZXdzdGF0ZW1lbnQiOwogICAgICAgIH0KICAgICAgICBjdXJLZXl3b3JkID0gY3VyOwogICAgICAgIHJldHVybiAia2V5d29yZCI7CiAgICAgIH0KICAgICAgcmV0dXJuICJ2YXJpYWJsZSI7CiAgICB9CgogICAgc3RyZWFtLm5leHQoKTsKICAgIHJldHVybiBudWxsOwogIH0KCiAgZnVuY3Rpb24gdG9rZW5TdHJpbmcocXVvdGUpIHsKICAgIHJldHVybiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHZhciBlc2NhcGVkID0gZmFsc2UsIG5leHQsIGVuZCA9IGZhbHNlOwogICAgICB3aGlsZSAoKG5leHQgPSBzdHJlYW0ubmV4dCgpKSAhPSBudWxsKSB7CiAgICAgICAgaWYgKG5leHQgPT0gcXVvdGUgJiYgIWVzY2FwZWQpIHtlbmQgPSB0cnVlOyBicmVhazt9CiAgICAgICAgZXNjYXBlZCA9ICFlc2NhcGVkICYmIG5leHQgPT0gIlxcIjsKICAgICAgfQogICAgICBpZiAoZW5kIHx8ICEoZXNjYXBlZCB8fCBtdWx0aUxpbmVTdHJpbmdzKSkKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTsKICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgfTsKICB9CgogIGZ1bmN0aW9uIHRva2VuQ29tbWVudChzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgbWF5YmVFbmQgPSBmYWxzZSwgY2g7CiAgICB3aGlsZSAoY2ggPSBzdHJlYW0ubmV4dCgpKSB7CiAgICAgIGlmIChjaCA9PSAiLyIgJiYgbWF5YmVFbmQpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBtYXliZUVuZCA9IChjaCA9PSAiKiIpOwogICAgfQogICAgcmV0dXJuICJjb21tZW50IjsKICB9CgogIGZ1bmN0aW9uIENvbnRleHQoaW5kZW50ZWQsIGNvbHVtbiwgdHlwZSwgYWxpZ24sIHByZXYpIHsKICAgIHRoaXMuaW5kZW50ZWQgPSBpbmRlbnRlZDsKICAgIHRoaXMuY29sdW1uID0gY29sdW1uOwogICAgdGhpcy50eXBlID0gdHlwZTsKICAgIHRoaXMuYWxpZ24gPSBhbGlnbjsKICAgIHRoaXMucHJldiA9IHByZXY7CiAgfQogIGZ1bmN0aW9uIHB1c2hDb250ZXh0KHN0YXRlLCBjb2wsIHR5cGUpIHsKICAgIHZhciBpbmRlbnQgPSBzdGF0ZS5pbmRlbnRlZDsKICAgIHZhciBjID0gbmV3IENvbnRleHQoaW5kZW50LCBjb2wsIHR5cGUsIG51bGwsIHN0YXRlLmNvbnRleHQpOwogICAgcmV0dXJuIHN0YXRlLmNvbnRleHQgPSBjOwogIH0KICBmdW5jdGlvbiBwb3BDb250ZXh0KHN0YXRlKSB7CiAgICB2YXIgdCA9IHN0YXRlLmNvbnRleHQudHlwZTsKICAgIGlmICh0ID09ICIpIiB8fCB0ID09ICJdIiB8fCB0ID09ICJ9IikgewogICAgICBzdGF0ZS5pbmRlbnRlZCA9IHN0YXRlLmNvbnRleHQuaW5kZW50ZWQ7CiAgICB9CiAgICByZXR1cm4gc3RhdGUuY29udGV4dCA9IHN0YXRlLmNvbnRleHQucHJldjsKICB9CgogIGZ1bmN0aW9uIGlzQ2xvc2luZyh0ZXh0LCBjb250ZXh0Q2xvc2luZykgewogICAgaWYgKHRleHQgPT0gY29udGV4dENsb3NpbmcpIHsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9IGVsc2UgewogICAgICAvLyBjb250ZXh0Q2xvc2luZyBtYXkgYmUgbXVsaXRwbGUga2V5d29yZHMgc2VwYXJhdGVkIGJ5IDsKICAgICAgdmFyIGNsb3NpbmdLZXl3b3JkcyA9IGNvbnRleHRDbG9zaW5nLnNwbGl0KCI7Iik7CiAgICAgIGZvciAodmFyIGkgaW4gY2xvc2luZ0tleXdvcmRzKSB7CiAgICAgICAgaWYgKHRleHQgPT0gY2xvc2luZ0tleXdvcmRzW2ldKSB7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KCiAgZnVuY3Rpb24gYnVpbGRFbGVjdHJpY0lucHV0UmVnRXgoKSB7CiAgICAvLyBSZWluZGVudGF0aW9uIHNob3VsZCBvY2N1ciBvbiBhbnkgYnJhY2tldCBjaGFyOiB7fSgpW10KICAgIC8vIG9yIG9uIGEgbWF0Y2ggb2YgYW55IG9mIHRoZSBibG9jayBjbG9zaW5nIGtleXdvcmRzLCBhdAogICAgLy8gdGhlIGVuZCBvZiBhIGxpbmUKICAgIHZhciBhbGxDbG9zaW5ncyA9IFtdOwogICAgZm9yICh2YXIgaSBpbiBvcGVuQ2xvc2UpIHsKICAgICAgaWYgKG9wZW5DbG9zZVtpXSkgewogICAgICAgIHZhciBjbG9zaW5ncyA9IG9wZW5DbG9zZVtpXS5zcGxpdCgiOyIpOwogICAgICAgIGZvciAodmFyIGogaW4gY2xvc2luZ3MpIHsKICAgICAgICAgIGFsbENsb3NpbmdzLnB1c2goY2xvc2luZ3Nbal0pOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgdmFyIHJlID0gbmV3IFJlZ0V4cCgiW3t9KClcXFtcXF1dfCgiICsgYWxsQ2xvc2luZ3Muam9pbigifCIpICsgIikkIik7CiAgICByZXR1cm4gcmU7CiAgfQoKICAvLyBJbnRlcmZhY2UKICByZXR1cm4gewoKICAgIC8vIFJlZ2V4IHRvIGZvcmNlIGN1cnJlbnQgbGluZSB0byByZWluZGVudAogICAgZWxlY3RyaWNJbnB1dDogYnVpbGRFbGVjdHJpY0lucHV0UmVnRXgoKSwKCiAgICBzdGFydFN0YXRlOiBmdW5jdGlvbihiYXNlY29sdW1uKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgdG9rZW5pemU6IG51bGwsCiAgICAgICAgY29udGV4dDogbmV3IENvbnRleHQoKGJhc2Vjb2x1bW4gfHwgMCkgLSBpbmRlbnRVbml0LCAwLCAidG9wIiwgZmFsc2UpLAogICAgICAgIGluZGVudGVkOiAwLAogICAgICAgIHN0YXJ0T2ZMaW5lOiB0cnVlCiAgICAgIH07CiAgICB9LAoKICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHZhciBjdHggPSBzdGF0ZS5jb250ZXh0OwogICAgICBpZiAoc3RyZWFtLnNvbCgpKSB7CiAgICAgICAgaWYgKGN0eC5hbGlnbiA9PSBudWxsKSBjdHguYWxpZ24gPSBmYWxzZTsKICAgICAgICBzdGF0ZS5pbmRlbnRlZCA9IHN0cmVhbS5pbmRlbnRhdGlvbigpOwogICAgICAgIHN0YXRlLnN0YXJ0T2ZMaW5lID0gdHJ1ZTsKICAgICAgfQogICAgICBpZiAoc3RyZWFtLmVhdFNwYWNlKCkpIHJldHVybiBudWxsOwogICAgICBjdXJQdW5jID0gbnVsbDsKICAgICAgY3VyS2V5d29yZCA9IG51bGw7CiAgICAgIHZhciBzdHlsZSA9IChzdGF0ZS50b2tlbml6ZSB8fCB0b2tlbkJhc2UpKHN0cmVhbSwgc3RhdGUpOwogICAgICBpZiAoc3R5bGUgPT0gImNvbW1lbnQiIHx8IHN0eWxlID09ICJtZXRhIiB8fCBzdHlsZSA9PSAidmFyaWFibGUiKSByZXR1cm4gc3R5bGU7CiAgICAgIGlmIChjdHguYWxpZ24gPT0gbnVsbCkgY3R4LmFsaWduID0gdHJ1ZTsKCiAgICAgIGlmIChjdXJQdW5jID09IGN0eC50eXBlKSB7CiAgICAgICAgcG9wQ29udGV4dChzdGF0ZSk7CiAgICAgIH0KICAgICAgZWxzZSBpZiAoKGN1clB1bmMgPT0gIjsiICYmIGN0eC50eXBlID09ICJzdGF0ZW1lbnQiKSB8fAogICAgICAgICAgICAgICAoY3R4LnR5cGUgJiYgaXNDbG9zaW5nKGN1cktleXdvcmQsIGN0eC50eXBlKSkpIHsKICAgICAgICBjdHggPSBwb3BDb250ZXh0KHN0YXRlKTsKICAgICAgICB3aGlsZSAoY3R4ICYmIGN0eC50eXBlID09ICJzdGF0ZW1lbnQiKSBjdHggPSBwb3BDb250ZXh0KHN0YXRlKTsKICAgICAgfQogICAgICBlbHNlIGlmIChjdXJQdW5jID09ICJ7IikgeyBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLmNvbHVtbigpLCAifSIpOyB9CiAgICAgIGVsc2UgaWYgKGN1clB1bmMgPT0gIlsiKSB7IHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0uY29sdW1uKCksICJdIik7IH0KICAgICAgZWxzZSBpZiAoY3VyUHVuYyA9PSAiKCIpIHsgcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbS5jb2x1bW4oKSwgIikiKTsgfQogICAgICBlbHNlIGlmIChjdHggJiYgY3R4LnR5cGUgPT0gImVuZGNhc2UiICYmIGN1clB1bmMgPT0gIjoiKSB7IHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0uY29sdW1uKCksICJzdGF0ZW1lbnQiKTsgfQogICAgICBlbHNlIGlmIChjdXJQdW5jID09ICJuZXdzdGF0ZW1lbnQiKSB7CiAgICAgICAgcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbS5jb2x1bW4oKSwgInN0YXRlbWVudCIpOwogICAgICB9IGVsc2UgaWYgKGN1clB1bmMgPT0gIm5ld2Jsb2NrIikgewogICAgICAgIHZhciBjbG9zZSA9IG9wZW5DbG9zZVtjdXJLZXl3b3JkXTsKICAgICAgICBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLmNvbHVtbigpLCBjbG9zZSk7CiAgICAgIH0KCiAgICAgIHN0YXRlLnN0YXJ0T2ZMaW5lID0gZmFsc2U7CiAgICAgIHJldHVybiBzdHlsZTsKICAgIH0sCgogICAgaW5kZW50OiBmdW5jdGlvbihzdGF0ZSwgdGV4dEFmdGVyKSB7CiAgICAgIGlmIChzdGF0ZS50b2tlbml6ZSAhPSB0b2tlbkJhc2UgJiYgc3RhdGUudG9rZW5pemUgIT0gbnVsbCkgcmV0dXJuIENvZGVNaXJyb3IuUGFzczsKICAgICAgdmFyIGN0eCA9IHN0YXRlLmNvbnRleHQsIGZpcnN0Q2hhciA9IHRleHRBZnRlciAmJiB0ZXh0QWZ0ZXIuY2hhckF0KDApOwogICAgICBpZiAoY3R4LnR5cGUgPT0gInN0YXRlbWVudCIgJiYgZmlyc3RDaGFyID09ICJ9IikgY3R4ID0gY3R4LnByZXY7CiAgICAgIHZhciBjbG9zaW5nID0gZmFsc2U7CiAgICAgIHZhciBwb3NzaWJsZUNsb3NpbmcgPSB0ZXh0QWZ0ZXIubWF0Y2goY2xvc2luZ0JyYWNrZXRPcldvcmQpOwogICAgICBpZiAocG9zc2libGVDbG9zaW5nKSB7CiAgICAgICAgY2xvc2luZyA9IGlzQ2xvc2luZyhwb3NzaWJsZUNsb3NpbmdbMF0sIGN0eC50eXBlKTsKICAgICAgfQogICAgICBpZiAoY3R4LnR5cGUgPT0gInN0YXRlbWVudCIpIHJldHVybiBjdHguaW5kZW50ZWQgKyAoZmlyc3RDaGFyID09ICJ7IiA/IDAgOiBzdGF0ZW1lbnRJbmRlbnRVbml0KTsKICAgICAgZWxzZSBpZiAoY2xvc2luZ0JyYWNrZXQudGVzdChjdHgudHlwZSkgJiYgY3R4LmFsaWduICYmICFkb250QWxpZ25DYWxscykgcmV0dXJuIGN0eC5jb2x1bW4gKyAoY2xvc2luZyA/IDAgOiAxKTsKICAgICAgZWxzZSBpZiAoY3R4LnR5cGUgPT0gIikiICYmICFjbG9zaW5nKSByZXR1cm4gY3R4LmluZGVudGVkICsgc3RhdGVtZW50SW5kZW50VW5pdDsKICAgICAgZWxzZSByZXR1cm4gY3R4LmluZGVudGVkICsgKGNsb3NpbmcgPyAwIDogaW5kZW50VW5pdCk7CiAgICB9LAoKICAgIGJsb2NrQ29tbWVudFN0YXJ0OiAiLyoiLAogICAgYmxvY2tDb21tZW50RW5kOiAiKi8iLAogICAgbGluZUNvbW1lbnQ6ICIvLyIKICB9Owp9KTsKCkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC94LXZlcmlsb2ciLCB7CiAgbmFtZTogInZlcmlsb2ciCn0pOwpDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveC1zeXN0ZW12ZXJpbG9nIiwgewogIG5hbWU6ICJzeXN0ZW12ZXJpbG9nIgp9KTsKCn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/xml/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/xml/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogWE1MIG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0ieG1sLmpzIj48L3NjcmlwdD4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4uQ29kZU1pcnJvciB7Ym9yZGVyLXRvcDogMXB4IHNvbGlkIGJsYWNrOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGltZyBpZD1sb2dvIHNyYz0iLi4vLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+TGFuZ3VhZ2UgbW9kZXM8L2E+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPlhNTDwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+WE1MIG1vZGU8L2gyPgo8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgombHQ7aHRtbCBzdHlsZT0iY29sb3I6IGdyZWVuIiZndDsKICAmbHQ7IS0tIHRoaXMgaXMgYSBjb21tZW50IC0tJmd0OwogICZsdDtoZWFkJmd0OwogICAgJmx0O3RpdGxlJmd0O0hUTUwgRXhhbXBsZSZsdDsvdGl0bGUmZ3Q7CiAgJmx0Oy9oZWFkJmd0OwogICZsdDtib2R5Jmd0OwogICAgVGhlIGluZGVudGF0aW9uIHRyaWVzIHRvIGJlICZsdDtlbSZndDtzb21ld2hhdCAmYW1wO3F1b3Q7ZG8gd2hhdAogICAgSSBtZWFuJmFtcDtxdW90OyZsdDsvZW0mZ3Q7Li4uIGJ1dCBtaWdodCBub3QgbWF0Y2ggeW91ciBzdHlsZS4KICAmbHQ7L2JvZHkmZ3Q7CiZsdDsvaHRtbCZndDsKPC90ZXh0YXJlYT48L2Zvcm0+CiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgICAgIG1vZGU6ICJ0ZXh0L2h0bWwiLAogICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlCiAgICAgIH0pOwogICAgPC9zY3JpcHQ+CiAgICA8cD5UaGUgWE1MIG1vZGUgc3VwcG9ydHMgdHdvIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyczo8L3A+CiAgICA8ZGw+CiAgICAgIDxkdD48Y29kZT5odG1sTW9kZSAoYm9vbGVhbik8L2NvZGU+PC9kdD4KICAgICAgPGRkPlRoaXMgc3dpdGNoZXMgdGhlIG1vZGUgdG8gcGFyc2UgSFRNTCBpbnN0ZWFkIG9mIFhNTC4gVGhpcwogICAgICBtZWFucyBhdHRyaWJ1dGVzIGRvIG5vdCBoYXZlIHRvIGJlIHF1b3RlZCwgYW5kIHNvbWUgZWxlbWVudHMKICAgICAgKHN1Y2ggYXMgPGNvZGU+YnI8L2NvZGU+KSBkbyBub3QgcmVxdWlyZSBhIGNsb3NpbmcgdGFnLjwvZGQ+CiAgICAgIDxkdD48Y29kZT5hbGlnbkNEQVRBIChib29sZWFuKTwvY29kZT48L2R0PgogICAgICA8ZGQ+U2V0dGluZyB0aGlzIHRvIHRydWUgd2lsbCBmb3JjZSB0aGUgb3BlbmluZyB0YWcgb2YgQ0RBVEEKICAgICAgYmxvY2tzIHRvIG5vdCBiZSBpbmRlbnRlZC48L2RkPgogICAgPC9kbD4KCiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+YXBwbGljYXRpb24veG1sPC9jb2RlPiwgPGNvZGU+dGV4dC9odG1sPC9jb2RlPi48L3A+CiAgPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/xml/test.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24oKSB7CiAgdmFyIG1vZGUgPSBDb2RlTWlycm9yLmdldE1vZGUoe2luZGVudFVuaXQ6IDJ9LCAieG1sIiksIG1uYW1lID0gInhtbCI7CiAgZnVuY3Rpb24gTVQobmFtZSkgeyB0ZXN0Lm1vZGUobmFtZSwgbW9kZSwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSwgbW5hbWUpOyB9CgogIE1UKCJtYXRjaGluZyIsCiAgICAgIlt0YWcmYnJhY2tldCA8XVt0YWcgdG9wXVt0YWcmYnJhY2tldCA+XSIsCiAgICAgIiAgdGV4dCIsCiAgICAgIiAgW3RhZyZicmFja2V0IDxdW3RhZyBpbm5lcl1bdGFnJmJyYWNrZXQgLz5dIiwKICAgICAiW3RhZyZicmFja2V0IDwvXVt0YWcgdG9wXVt0YWcmYnJhY2tldCA+XSIpOwoKICBNVCgibm9ubWF0Y2hpbmciLAogICAgICJbdGFnJmJyYWNrZXQgPF1bdGFnIHRvcF1bdGFnJmJyYWNrZXQgPl0iLAogICAgICIgIFt0YWcmYnJhY2tldCA8XVt0YWcgaW5uZXJdW3RhZyZicmFja2V0IC8+XSIsCiAgICAgIiAgW3RhZyZicmFja2V0IDwvXVt0YWcmZXJyb3IgdGlwXVt0YWcmYnJhY2tldCZlcnJvciA+XSIpOwoKICBNVCgiZG9jdHlwZSIsCiAgICAgIlttZXRhIDwhZG9jdHlwZSBmb29iYXI+XSIsCiAgICAgIlt0YWcmYnJhY2tldCA8XVt0YWcgdG9wXVt0YWcmYnJhY2tldCAvPl0iKTsKCiAgTVQoImNkYXRhIiwKICAgICAiW3RhZyZicmFja2V0IDxdW3RhZyB0b3BdW3RhZyZicmFja2V0ID5dIiwKICAgICAiICBbYXRvbSA8IVtDREFUQVtmb29dIiwKICAgICAiW2F0b20gYmFyYmF6Z3VoXV1dXT5dIiwKICAgICAiW3RhZyZicmFja2V0IDwvXVt0YWcgdG9wXVt0YWcmYnJhY2tldCA+XSIpOwoKICAvLyBIVE1MIHRlc3RzCiAgbW9kZSA9IENvZGVNaXJyb3IuZ2V0TW9kZSh7aW5kZW50VW5pdDogMn0sICJ0ZXh0L2h0bWwiKTsKCiAgTVQoInNlbGZjbG9zZSIsCiAgICAgIlt0YWcmYnJhY2tldCA8XVt0YWcgaHRtbF1bdGFnJmJyYWNrZXQgPl0iLAogICAgICIgIFt0YWcmYnJhY2tldCA8XVt0YWcgbGlua10gW2F0dHJpYnV0ZSByZWxdPVtzdHJpbmcgc3R5bGVzaGVldF0gW2F0dHJpYnV0ZSBocmVmXT1bc3RyaW5nIFwiL2Zvb2JhclwiXVt0YWcmYnJhY2tldCA+XSIsCiAgICAgIlt0YWcmYnJhY2tldCA8L11bdGFnIGh0bWxdW3RhZyZicmFja2V0ID5dIik7CgogIE1UKCJsaXN0IiwKICAgICAiW3RhZyZicmFja2V0IDxdW3RhZyBvbF1bdGFnJmJyYWNrZXQgPl0iLAogICAgICIgIFt0YWcmYnJhY2tldCA8XVt0YWcgbGldW3RhZyZicmFja2V0ID5db25lIiwKICAgICAiICBbdGFnJmJyYWNrZXQgPF1bdGFnIGxpXVt0YWcmYnJhY2tldCA+XXR3byIsCiAgICAgIlt0YWcmYnJhY2tldCA8L11bdGFnIG9sXVt0YWcmYnJhY2tldCA+XSIpOwoKICBNVCgidmFsdWVsZXNzIiwKICAgICAiW3RhZyZicmFja2V0IDxdW3RhZyBpbnB1dF0gW2F0dHJpYnV0ZSB0eXBlXT1bc3RyaW5nIGNoZWNrYm94XSBbYXR0cmlidXRlIGNoZWNrZWRdW3RhZyZicmFja2V0IC8+XSIpOwoKICBNVCgicFRoZW5BcnRpY2xlIiwKICAgICAiW3RhZyZicmFja2V0IDxdW3RhZyBwXVt0YWcmYnJhY2tldCA+XSIsCiAgICAgIiAgZm9vIiwKICAgICAiW3RhZyZicmFja2V0IDxdW3RhZyBhcnRpY2xlXVt0YWcmYnJhY2tldCA+XWJhciIpOwoKfSkoKTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/xml/xml.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJ4bWwiLCBmdW5jdGlvbihjb25maWcsIHBhcnNlckNvbmZpZykgewogIHZhciBpbmRlbnRVbml0ID0gY29uZmlnLmluZGVudFVuaXQ7CiAgdmFyIG11bHRpbGluZVRhZ0luZGVudEZhY3RvciA9IHBhcnNlckNvbmZpZy5tdWx0aWxpbmVUYWdJbmRlbnRGYWN0b3IgfHwgMTsKICB2YXIgbXVsdGlsaW5lVGFnSW5kZW50UGFzdFRhZyA9IHBhcnNlckNvbmZpZy5tdWx0aWxpbmVUYWdJbmRlbnRQYXN0VGFnOwogIGlmIChtdWx0aWxpbmVUYWdJbmRlbnRQYXN0VGFnID09IG51bGwpIG11bHRpbGluZVRhZ0luZGVudFBhc3RUYWcgPSB0cnVlOwoKICB2YXIgS2x1ZGdlcyA9IHBhcnNlckNvbmZpZy5odG1sTW9kZSA/IHsKICAgIGF1dG9TZWxmQ2xvc2VyczogeydhcmVhJzogdHJ1ZSwgJ2Jhc2UnOiB0cnVlLCAnYnInOiB0cnVlLCAnY29sJzogdHJ1ZSwgJ2NvbW1hbmQnOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgJ2VtYmVkJzogdHJ1ZSwgJ2ZyYW1lJzogdHJ1ZSwgJ2hyJzogdHJ1ZSwgJ2ltZyc6IHRydWUsICdpbnB1dCc6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAna2V5Z2VuJzogdHJ1ZSwgJ2xpbmsnOiB0cnVlLCAnbWV0YSc6IHRydWUsICdwYXJhbSc6IHRydWUsICdzb3VyY2UnOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgJ3RyYWNrJzogdHJ1ZSwgJ3dicic6IHRydWV9LAogICAgaW1wbGljaXRseUNsb3NlZDogeydkZCc6IHRydWUsICdsaSc6IHRydWUsICdvcHRncm91cCc6IHRydWUsICdvcHRpb24nOiB0cnVlLCAncCc6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgJ3JwJzogdHJ1ZSwgJ3J0JzogdHJ1ZSwgJ3Rib2R5JzogdHJ1ZSwgJ3RkJzogdHJ1ZSwgJ3Rmb290JzogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAndGgnOiB0cnVlLCAndHInOiB0cnVlfSwKICAgIGNvbnRleHRHcmFiYmVyczogewogICAgICAnZGQnOiB7J2RkJzogdHJ1ZSwgJ2R0JzogdHJ1ZX0sCiAgICAgICdkdCc6IHsnZGQnOiB0cnVlLCAnZHQnOiB0cnVlfSwKICAgICAgJ2xpJzogeydsaSc6IHRydWV9LAogICAgICAnb3B0aW9uJzogeydvcHRpb24nOiB0cnVlLCAnb3B0Z3JvdXAnOiB0cnVlfSwKICAgICAgJ29wdGdyb3VwJzogeydvcHRncm91cCc6IHRydWV9LAogICAgICAncCc6IHsnYWRkcmVzcyc6IHRydWUsICdhcnRpY2xlJzogdHJ1ZSwgJ2FzaWRlJzogdHJ1ZSwgJ2Jsb2NrcXVvdGUnOiB0cnVlLCAnZGlyJzogdHJ1ZSwKICAgICAgICAgICAgJ2Rpdic6IHRydWUsICdkbCc6IHRydWUsICdmaWVsZHNldCc6IHRydWUsICdmb290ZXInOiB0cnVlLCAnZm9ybSc6IHRydWUsCiAgICAgICAgICAgICdoMSc6IHRydWUsICdoMic6IHRydWUsICdoMyc6IHRydWUsICdoNCc6IHRydWUsICdoNSc6IHRydWUsICdoNic6IHRydWUsCiAgICAgICAgICAgICdoZWFkZXInOiB0cnVlLCAnaGdyb3VwJzogdHJ1ZSwgJ2hyJzogdHJ1ZSwgJ21lbnUnOiB0cnVlLCAnbmF2JzogdHJ1ZSwgJ29sJzogdHJ1ZSwKICAgICAgICAgICAgJ3AnOiB0cnVlLCAncHJlJzogdHJ1ZSwgJ3NlY3Rpb24nOiB0cnVlLCAndGFibGUnOiB0cnVlLCAndWwnOiB0cnVlfSwKICAgICAgJ3JwJzogeydycCc6IHRydWUsICdydCc6IHRydWV9LAogICAgICAncnQnOiB7J3JwJzogdHJ1ZSwgJ3J0JzogdHJ1ZX0sCiAgICAgICd0Ym9keSc6IHsndGJvZHknOiB0cnVlLCAndGZvb3QnOiB0cnVlfSwKICAgICAgJ3RkJzogeyd0ZCc6IHRydWUsICd0aCc6IHRydWV9LAogICAgICAndGZvb3QnOiB7J3Rib2R5JzogdHJ1ZX0sCiAgICAgICd0aCc6IHsndGQnOiB0cnVlLCAndGgnOiB0cnVlfSwKICAgICAgJ3RoZWFkJzogeyd0Ym9keSc6IHRydWUsICd0Zm9vdCc6IHRydWV9LAogICAgICAndHInOiB7J3RyJzogdHJ1ZX0KICAgIH0sCiAgICBkb05vdEluZGVudDogeyJwcmUiOiB0cnVlfSwKICAgIGFsbG93VW5xdW90ZWQ6IHRydWUsCiAgICBhbGxvd01pc3Npbmc6IHRydWUsCiAgICBjYXNlRm9sZDogdHJ1ZQogIH0gOiB7CiAgICBhdXRvU2VsZkNsb3NlcnM6IHt9LAogICAgaW1wbGljaXRseUNsb3NlZDoge30sCiAgICBjb250ZXh0R3JhYmJlcnM6IHt9LAogICAgZG9Ob3RJbmRlbnQ6IHt9LAogICAgYWxsb3dVbnF1b3RlZDogZmFsc2UsCiAgICBhbGxvd01pc3Npbmc6IGZhbHNlLAogICAgY2FzZUZvbGQ6IGZhbHNlCiAgfTsKICB2YXIgYWxpZ25DREFUQSA9IHBhcnNlckNvbmZpZy5hbGlnbkNEQVRBOwoKICAvLyBSZXR1cm4gdmFyaWFibGVzIGZvciB0b2tlbml6ZXJzCiAgdmFyIHR5cGUsIHNldFN0eWxlOwoKICBmdW5jdGlvbiBpblRleHQoc3RyZWFtLCBzdGF0ZSkgewogICAgZnVuY3Rpb24gY2hhaW4ocGFyc2VyKSB7CiAgICAgIHN0YXRlLnRva2VuaXplID0gcGFyc2VyOwogICAgICByZXR1cm4gcGFyc2VyKHN0cmVhbSwgc3RhdGUpOwogICAgfQoKICAgIHZhciBjaCA9IHN0cmVhbS5uZXh0KCk7CiAgICBpZiAoY2ggPT0gIjwiKSB7CiAgICAgIGlmIChzdHJlYW0uZWF0KCIhIikpIHsKICAgICAgICBpZiAoc3RyZWFtLmVhdCgiWyIpKSB7CiAgICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKCJDREFUQVsiKSkgcmV0dXJuIGNoYWluKGluQmxvY2soImF0b20iLCAiXV0+IikpOwogICAgICAgICAgZWxzZSByZXR1cm4gbnVsbDsKICAgICAgICB9IGVsc2UgaWYgKHN0cmVhbS5tYXRjaCgiLS0iKSkgewogICAgICAgICAgcmV0dXJuIGNoYWluKGluQmxvY2soImNvbW1lbnQiLCAiLS0+IikpOwogICAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLm1hdGNoKCJET0NUWVBFIiwgdHJ1ZSwgdHJ1ZSkpIHsKICAgICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1x3XC5fXC1dLyk7CiAgICAgICAgICByZXR1cm4gY2hhaW4oZG9jdHlwZSgxKSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChzdHJlYW0uZWF0KCI/IikpIHsKICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcd1wuX1wtXS8pOwogICAgICAgIHN0YXRlLnRva2VuaXplID0gaW5CbG9jaygibWV0YSIsICI/PiIpOwogICAgICAgIHJldHVybiAibWV0YSI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdHlwZSA9IHN0cmVhbS5lYXQoIi8iKSA/ICJjbG9zZVRhZyIgOiAib3BlblRhZyI7CiAgICAgICAgc3RhdGUudG9rZW5pemUgPSBpblRhZzsKICAgICAgICByZXR1cm4gInRhZyBicmFja2V0IjsKICAgICAgfQogICAgfSBlbHNlIGlmIChjaCA9PSAiJiIpIHsKICAgICAgdmFyIG9rOwogICAgICBpZiAoc3RyZWFtLmVhdCgiIyIpKSB7CiAgICAgICAgaWYgKHN0cmVhbS5lYXQoIngiKSkgewogICAgICAgICAgb2sgPSBzdHJlYW0uZWF0V2hpbGUoL1thLWZBLUZcZF0vKSAmJiBzdHJlYW0uZWF0KCI7Iik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG9rID0gc3RyZWFtLmVhdFdoaWxlKC9bXGRdLykgJiYgc3RyZWFtLmVhdCgiOyIpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBvayA9IHN0cmVhbS5lYXRXaGlsZSgvW1x3XC5cLTpdLykgJiYgc3RyZWFtLmVhdCgiOyIpOwogICAgICB9CiAgICAgIHJldHVybiBvayA/ICJhdG9tIiA6ICJlcnJvciI7CiAgICB9IGVsc2UgewogICAgICBzdHJlYW0uZWF0V2hpbGUoL1teJjxdLyk7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogIH0KCiAgZnVuY3Rpb24gaW5UYWcoc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIGNoID0gc3RyZWFtLm5leHQoKTsKICAgIGlmIChjaCA9PSAiPiIgfHwgKGNoID09ICIvIiAmJiBzdHJlYW0uZWF0KCI+IikpKSB7CiAgICAgIHN0YXRlLnRva2VuaXplID0gaW5UZXh0OwogICAgICB0eXBlID0gY2ggPT0gIj4iID8gImVuZFRhZyIgOiAic2VsZmNsb3NlVGFnIjsKICAgICAgcmV0dXJuICJ0YWcgYnJhY2tldCI7CiAgICB9IGVsc2UgaWYgKGNoID09ICI9IikgewogICAgICB0eXBlID0gImVxdWFscyI7CiAgICAgIHJldHVybiBudWxsOwogICAgfSBlbHNlIGlmIChjaCA9PSAiPCIpIHsKICAgICAgc3RhdGUudG9rZW5pemUgPSBpblRleHQ7CiAgICAgIHN0YXRlLnN0YXRlID0gYmFzZVN0YXRlOwogICAgICBzdGF0ZS50YWdOYW1lID0gc3RhdGUudGFnU3RhcnQgPSBudWxsOwogICAgICB2YXIgbmV4dCA9IHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgICByZXR1cm4gbmV4dCA/IG5leHQgKyAiIHRhZyBlcnJvciIgOiAidGFnIGVycm9yIjsKICAgIH0gZWxzZSBpZiAoL1tcJ1wiXS8udGVzdChjaCkpIHsKICAgICAgc3RhdGUudG9rZW5pemUgPSBpbkF0dHJpYnV0ZShjaCk7CiAgICAgIHN0YXRlLnN0cmluZ1N0YXJ0Q29sID0gc3RyZWFtLmNvbHVtbigpOwogICAgICByZXR1cm4gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CiAgICB9IGVsc2UgewogICAgICBzdHJlYW0ubWF0Y2goL15bXlxzXHUwMGEwPTw+XCJcJ10qW15cc1x1MDBhMD08PlwiXCdcL10vKTsKICAgICAgcmV0dXJuICJ3b3JkIjsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGluQXR0cmlidXRlKHF1b3RlKSB7CiAgICB2YXIgY2xvc3VyZSA9IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgd2hpbGUgKCFzdHJlYW0uZW9sKCkpIHsKICAgICAgICBpZiAoc3RyZWFtLm5leHQoKSA9PSBxdW90ZSkgewogICAgICAgICAgc3RhdGUudG9rZW5pemUgPSBpblRhZzsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gInN0cmluZyI7CiAgICB9OwogICAgY2xvc3VyZS5pc0luQXR0cmlidXRlID0gdHJ1ZTsKICAgIHJldHVybiBjbG9zdXJlOwogIH0KCiAgZnVuY3Rpb24gaW5CbG9jayhzdHlsZSwgdGVybWluYXRvcikgewogICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgd2hpbGUgKCFzdHJlYW0uZW9sKCkpIHsKICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKHRlcm1pbmF0b3IpKSB7CiAgICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IGluVGV4dDsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICB9CiAgICAgIHJldHVybiBzdHlsZTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIGRvY3R5cGUoZGVwdGgpIHsKICAgIHJldHVybiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHZhciBjaDsKICAgICAgd2hpbGUgKChjaCA9IHN0cmVhbS5uZXh0KCkpICE9IG51bGwpIHsKICAgICAgICBpZiAoY2ggPT0gIjwiKSB7CiAgICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IGRvY3R5cGUoZGVwdGggKyAxKTsKICAgICAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgICAgICB9IGVsc2UgaWYgKGNoID09ICI+IikgewogICAgICAgICAgaWYgKGRlcHRoID09IDEpIHsKICAgICAgICAgICAgc3RhdGUudG9rZW5pemUgPSBpblRleHQ7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3RhdGUudG9rZW5pemUgPSBkb2N0eXBlKGRlcHRoIC0gMSk7CiAgICAgICAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuICJtZXRhIjsKICAgIH07CiAgfQoKICBmdW5jdGlvbiBDb250ZXh0KHN0YXRlLCB0YWdOYW1lLCBzdGFydE9mTGluZSkgewogICAgdGhpcy5wcmV2ID0gc3RhdGUuY29udGV4dDsKICAgIHRoaXMudGFnTmFtZSA9IHRhZ05hbWU7CiAgICB0aGlzLmluZGVudCA9IHN0YXRlLmluZGVudGVkOwogICAgdGhpcy5zdGFydE9mTGluZSA9IHN0YXJ0T2ZMaW5lOwogICAgaWYgKEtsdWRnZXMuZG9Ob3RJbmRlbnQuaGFzT3duUHJvcGVydHkodGFnTmFtZSkgfHwgKHN0YXRlLmNvbnRleHQgJiYgc3RhdGUuY29udGV4dC5ub0luZGVudCkpCiAgICAgIHRoaXMubm9JbmRlbnQgPSB0cnVlOwogIH0KICBmdW5jdGlvbiBwb3BDb250ZXh0KHN0YXRlKSB7CiAgICBpZiAoc3RhdGUuY29udGV4dCkgc3RhdGUuY29udGV4dCA9IHN0YXRlLmNvbnRleHQucHJldjsKICB9CiAgZnVuY3Rpb24gbWF5YmVQb3BDb250ZXh0KHN0YXRlLCBuZXh0VGFnTmFtZSkgewogICAgdmFyIHBhcmVudFRhZ05hbWU7CiAgICB3aGlsZSAodHJ1ZSkgewogICAgICBpZiAoIXN0YXRlLmNvbnRleHQpIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgcGFyZW50VGFnTmFtZSA9IHN0YXRlLmNvbnRleHQudGFnTmFtZTsKICAgICAgaWYgKCFLbHVkZ2VzLmNvbnRleHRHcmFiYmVycy5oYXNPd25Qcm9wZXJ0eShwYXJlbnRUYWdOYW1lKSB8fAogICAgICAgICAgIUtsdWRnZXMuY29udGV4dEdyYWJiZXJzW3BhcmVudFRhZ05hbWVdLmhhc093blByb3BlcnR5KG5leHRUYWdOYW1lKSkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBwb3BDb250ZXh0KHN0YXRlKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGJhc2VTdGF0ZSh0eXBlLCBzdHJlYW0sIHN0YXRlKSB7CiAgICBpZiAodHlwZSA9PSAib3BlblRhZyIpIHsKICAgICAgc3RhdGUudGFnU3RhcnQgPSBzdHJlYW0uY29sdW1uKCk7CiAgICAgIHJldHVybiB0YWdOYW1lU3RhdGU7CiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gImNsb3NlVGFnIikgewogICAgICByZXR1cm4gY2xvc2VUYWdOYW1lU3RhdGU7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gYmFzZVN0YXRlOwogICAgfQogIH0KICBmdW5jdGlvbiB0YWdOYW1lU3RhdGUodHlwZSwgc3RyZWFtLCBzdGF0ZSkgewogICAgaWYgKHR5cGUgPT0gIndvcmQiKSB7CiAgICAgIHN0YXRlLnRhZ05hbWUgPSBzdHJlYW0uY3VycmVudCgpOwogICAgICBzZXRTdHlsZSA9ICJ0YWciOwogICAgICByZXR1cm4gYXR0clN0YXRlOwogICAgfSBlbHNlIHsKICAgICAgc2V0U3R5bGUgPSAiZXJyb3IiOwogICAgICByZXR1cm4gdGFnTmFtZVN0YXRlOwogICAgfQogIH0KICBmdW5jdGlvbiBjbG9zZVRhZ05hbWVTdGF0ZSh0eXBlLCBzdHJlYW0sIHN0YXRlKSB7CiAgICBpZiAodHlwZSA9PSAid29yZCIpIHsKICAgICAgdmFyIHRhZ05hbWUgPSBzdHJlYW0uY3VycmVudCgpOwogICAgICBpZiAoc3RhdGUuY29udGV4dCAmJiBzdGF0ZS5jb250ZXh0LnRhZ05hbWUgIT0gdGFnTmFtZSAmJgogICAgICAgICAgS2x1ZGdlcy5pbXBsaWNpdGx5Q2xvc2VkLmhhc093blByb3BlcnR5KHN0YXRlLmNvbnRleHQudGFnTmFtZSkpCiAgICAgICAgcG9wQ29udGV4dChzdGF0ZSk7CiAgICAgIGlmIChzdGF0ZS5jb250ZXh0ICYmIHN0YXRlLmNvbnRleHQudGFnTmFtZSA9PSB0YWdOYW1lKSB7CiAgICAgICAgc2V0U3R5bGUgPSAidGFnIjsKICAgICAgICByZXR1cm4gY2xvc2VTdGF0ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzZXRTdHlsZSA9ICJ0YWcgZXJyb3IiOwogICAgICAgIHJldHVybiBjbG9zZVN0YXRlRXJyOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBzZXRTdHlsZSA9ICJlcnJvciI7CiAgICAgIHJldHVybiBjbG9zZVN0YXRlRXJyOwogICAgfQogIH0KCiAgZnVuY3Rpb24gY2xvc2VTdGF0ZSh0eXBlLCBfc3RyZWFtLCBzdGF0ZSkgewogICAgaWYgKHR5cGUgIT0gImVuZFRhZyIpIHsKICAgICAgc2V0U3R5bGUgPSAiZXJyb3IiOwogICAgICByZXR1cm4gY2xvc2VTdGF0ZTsKICAgIH0KICAgIHBvcENvbnRleHQoc3RhdGUpOwogICAgcmV0dXJuIGJhc2VTdGF0ZTsKICB9CiAgZnVuY3Rpb24gY2xvc2VTdGF0ZUVycih0eXBlLCBzdHJlYW0sIHN0YXRlKSB7CiAgICBzZXRTdHlsZSA9ICJlcnJvciI7CiAgICByZXR1cm4gY2xvc2VTdGF0ZSh0eXBlLCBzdHJlYW0sIHN0YXRlKTsKICB9CgogIGZ1bmN0aW9uIGF0dHJTdGF0ZSh0eXBlLCBfc3RyZWFtLCBzdGF0ZSkgewogICAgaWYgKHR5cGUgPT0gIndvcmQiKSB7CiAgICAgIHNldFN0eWxlID0gImF0dHJpYnV0ZSI7CiAgICAgIHJldHVybiBhdHRyRXFTdGF0ZTsKICAgIH0gZWxzZSBpZiAodHlwZSA9PSAiZW5kVGFnIiB8fCB0eXBlID09ICJzZWxmY2xvc2VUYWciKSB7CiAgICAgIHZhciB0YWdOYW1lID0gc3RhdGUudGFnTmFtZSwgdGFnU3RhcnQgPSBzdGF0ZS50YWdTdGFydDsKICAgICAgc3RhdGUudGFnTmFtZSA9IHN0YXRlLnRhZ1N0YXJ0ID0gbnVsbDsKICAgICAgaWYgKHR5cGUgPT0gInNlbGZjbG9zZVRhZyIgfHwKICAgICAgICAgIEtsdWRnZXMuYXV0b1NlbGZDbG9zZXJzLmhhc093blByb3BlcnR5KHRhZ05hbWUpKSB7CiAgICAgICAgbWF5YmVQb3BDb250ZXh0KHN0YXRlLCB0YWdOYW1lKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBtYXliZVBvcENvbnRleHQoc3RhdGUsIHRhZ05hbWUpOwogICAgICAgIHN0YXRlLmNvbnRleHQgPSBuZXcgQ29udGV4dChzdGF0ZSwgdGFnTmFtZSwgdGFnU3RhcnQgPT0gc3RhdGUuaW5kZW50ZWQpOwogICAgICB9CiAgICAgIHJldHVybiBiYXNlU3RhdGU7CiAgICB9CiAgICBzZXRTdHlsZSA9ICJlcnJvciI7CiAgICByZXR1cm4gYXR0clN0YXRlOwogIH0KICBmdW5jdGlvbiBhdHRyRXFTdGF0ZSh0eXBlLCBzdHJlYW0sIHN0YXRlKSB7CiAgICBpZiAodHlwZSA9PSAiZXF1YWxzIikgcmV0dXJuIGF0dHJWYWx1ZVN0YXRlOwogICAgaWYgKCFLbHVkZ2VzLmFsbG93TWlzc2luZykgc2V0U3R5bGUgPSAiZXJyb3IiOwogICAgcmV0dXJuIGF0dHJTdGF0ZSh0eXBlLCBzdHJlYW0sIHN0YXRlKTsKICB9CiAgZnVuY3Rpb24gYXR0clZhbHVlU3RhdGUodHlwZSwgc3RyZWFtLCBzdGF0ZSkgewogICAgaWYgKHR5cGUgPT0gInN0cmluZyIpIHJldHVybiBhdHRyQ29udGludWVkU3RhdGU7CiAgICBpZiAodHlwZSA9PSAid29yZCIgJiYgS2x1ZGdlcy5hbGxvd1VucXVvdGVkKSB7c2V0U3R5bGUgPSAic3RyaW5nIjsgcmV0dXJuIGF0dHJTdGF0ZTt9CiAgICBzZXRTdHlsZSA9ICJlcnJvciI7CiAgICByZXR1cm4gYXR0clN0YXRlKHR5cGUsIHN0cmVhbSwgc3RhdGUpOwogIH0KICBmdW5jdGlvbiBhdHRyQ29udGludWVkU3RhdGUodHlwZSwgc3RyZWFtLCBzdGF0ZSkgewogICAgaWYgKHR5cGUgPT0gInN0cmluZyIpIHJldHVybiBhdHRyQ29udGludWVkU3RhdGU7CiAgICByZXR1cm4gYXR0clN0YXRlKHR5cGUsIHN0cmVhbSwgc3RhdGUpOwogIH0KCiAgcmV0dXJuIHsKICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4ge3Rva2VuaXplOiBpblRleHQsCiAgICAgICAgICAgICAgc3RhdGU6IGJhc2VTdGF0ZSwKICAgICAgICAgICAgICBpbmRlbnRlZDogMCwKICAgICAgICAgICAgICB0YWdOYW1lOiBudWxsLCB0YWdTdGFydDogbnVsbCwKICAgICAgICAgICAgICBjb250ZXh0OiBudWxsfTsKICAgIH0sCgogICAgdG9rZW46IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgaWYgKCFzdGF0ZS50YWdOYW1lICYmIHN0cmVhbS5zb2woKSkKICAgICAgICBzdGF0ZS5pbmRlbnRlZCA9IHN0cmVhbS5pbmRlbnRhdGlvbigpOwoKICAgICAgaWYgKHN0cmVhbS5lYXRTcGFjZSgpKSByZXR1cm4gbnVsbDsKICAgICAgdHlwZSA9IG51bGw7CiAgICAgIHZhciBzdHlsZSA9IHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgICBpZiAoKHN0eWxlIHx8IHR5cGUpICYmIHN0eWxlICE9ICJjb21tZW50IikgewogICAgICAgIHNldFN0eWxlID0gbnVsbDsKICAgICAgICBzdGF0ZS5zdGF0ZSA9IHN0YXRlLnN0YXRlKHR5cGUgfHwgc3R5bGUsIHN0cmVhbSwgc3RhdGUpOwogICAgICAgIGlmIChzZXRTdHlsZSkKICAgICAgICAgIHN0eWxlID0gc2V0U3R5bGUgPT0gImVycm9yIiA/IHN0eWxlICsgIiBlcnJvciIgOiBzZXRTdHlsZTsKICAgICAgfQogICAgICByZXR1cm4gc3R5bGU7CiAgICB9LAoKICAgIGluZGVudDogZnVuY3Rpb24oc3RhdGUsIHRleHRBZnRlciwgZnVsbExpbmUpIHsKICAgICAgdmFyIGNvbnRleHQgPSBzdGF0ZS5jb250ZXh0OwogICAgICAvLyBJbmRlbnQgbXVsdGktbGluZSBzdHJpbmdzIChlLmcuIGNzcykuCiAgICAgIGlmIChzdGF0ZS50b2tlbml6ZS5pc0luQXR0cmlidXRlKSB7CiAgICAgICAgaWYgKHN0YXRlLnRhZ1N0YXJ0ID09IHN0YXRlLmluZGVudGVkKQogICAgICAgICAgcmV0dXJuIHN0YXRlLnN0cmluZ1N0YXJ0Q29sICsgMTsKICAgICAgICBlbHNlCiAgICAgICAgICByZXR1cm4gc3RhdGUuaW5kZW50ZWQgKyBpbmRlbnRVbml0OwogICAgICB9CiAgICAgIGlmIChjb250ZXh0ICYmIGNvbnRleHQubm9JbmRlbnQpIHJldHVybiBDb2RlTWlycm9yLlBhc3M7CiAgICAgIGlmIChzdGF0ZS50b2tlbml6ZSAhPSBpblRhZyAmJiBzdGF0ZS50b2tlbml6ZSAhPSBpblRleHQpCiAgICAgICAgcmV0dXJuIGZ1bGxMaW5lID8gZnVsbExpbmUubWF0Y2goL14oXHMqKS8pWzBdLmxlbmd0aCA6IDA7CiAgICAgIC8vIEluZGVudCB0aGUgc3RhcnRzIG9mIGF0dHJpYnV0ZSBuYW1lcy4KICAgICAgaWYgKHN0YXRlLnRhZ05hbWUpIHsKICAgICAgICBpZiAobXVsdGlsaW5lVGFnSW5kZW50UGFzdFRhZykKICAgICAgICAgIHJldHVybiBzdGF0ZS50YWdTdGFydCArIHN0YXRlLnRhZ05hbWUubGVuZ3RoICsgMjsKICAgICAgICBlbHNlCiAgICAgICAgICByZXR1cm4gc3RhdGUudGFnU3RhcnQgKyBpbmRlbnRVbml0ICogbXVsdGlsaW5lVGFnSW5kZW50RmFjdG9yOwogICAgICB9CiAgICAgIGlmIChhbGlnbkNEQVRBICYmIC88IVxbQ0RBVEFcWy8udGVzdCh0ZXh0QWZ0ZXIpKSByZXR1cm4gMDsKICAgICAgdmFyIHRhZ0FmdGVyID0gdGV4dEFmdGVyICYmIC9ePChcLyk/KFtcd186XC4tXSopLy5leGVjKHRleHRBZnRlcik7CiAgICAgIGlmICh0YWdBZnRlciAmJiB0YWdBZnRlclsxXSkgeyAvLyBDbG9zaW5nIHRhZyBzcG90dGVkCiAgICAgICAgd2hpbGUgKGNvbnRleHQpIHsKICAgICAgICAgIGlmIChjb250ZXh0LnRhZ05hbWUgPT0gdGFnQWZ0ZXJbMl0pIHsKICAgICAgICAgICAgY29udGV4dCA9IGNvbnRleHQucHJldjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9IGVsc2UgaWYgKEtsdWRnZXMuaW1wbGljaXRseUNsb3NlZC5oYXNPd25Qcm9wZXJ0eShjb250ZXh0LnRhZ05hbWUpKSB7CiAgICAgICAgICAgIGNvbnRleHQgPSBjb250ZXh0LnByZXY7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAodGFnQWZ0ZXIpIHsgLy8gT3BlbmluZyB0YWcgc3BvdHRlZAogICAgICAgIHdoaWxlIChjb250ZXh0KSB7CiAgICAgICAgICB2YXIgZ3JhYmJlcnMgPSBLbHVkZ2VzLmNvbnRleHRHcmFiYmVyc1tjb250ZXh0LnRhZ05hbWVdOwogICAgICAgICAgaWYgKGdyYWJiZXJzICYmIGdyYWJiZXJzLmhhc093blByb3BlcnR5KHRhZ0FmdGVyWzJdKSkKICAgICAgICAgICAgY29udGV4dCA9IGNvbnRleHQucHJldjsKICAgICAgICAgIGVsc2UKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIHdoaWxlIChjb250ZXh0ICYmICFjb250ZXh0LnN0YXJ0T2ZMaW5lKQogICAgICAgIGNvbnRleHQgPSBjb250ZXh0LnByZXY7CiAgICAgIGlmIChjb250ZXh0KSByZXR1cm4gY29udGV4dC5pbmRlbnQgKyBpbmRlbnRVbml0OwogICAgICBlbHNlIHJldHVybiAwOwogICAgfSwKCiAgICBlbGVjdHJpY0lucHV0OiAvPFwvW1xzXHc6XSs+JC8sCiAgICBibG9ja0NvbW1lbnRTdGFydDogIjwhLS0iLAogICAgYmxvY2tDb21tZW50RW5kOiAiLS0+IiwKCiAgICBjb25maWd1cmF0aW9uOiBwYXJzZXJDb25maWcuaHRtbE1vZGUgPyAiaHRtbCIgOiAieG1sIiwKICAgIGhlbHBlclR5cGU6IHBhcnNlckNvbmZpZy5odG1sTW9kZSA/ICJodG1sIiA6ICJ4bWwiCiAgfTsKfSk7CgpDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveG1sIiwgInhtbCIpOwpDb2RlTWlycm9yLmRlZmluZU1JTUUoImFwcGxpY2F0aW9uL3htbCIsICJ4bWwiKTsKaWYgKCFDb2RlTWlycm9yLm1pbWVNb2Rlcy5oYXNPd25Qcm9wZXJ0eSgidGV4dC9odG1sIikpCiAgQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L2h0bWwiLCB7bmFtZTogInhtbCIsIGh0bWxNb2RlOiB0cnVlfSk7Cgp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/xquery/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/xquery/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogWFF1ZXJ5IG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL3RoZW1lL3hxLWRhcmsuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9InhxdWVyeS5qcyI+PC9zY3JpcHQ+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CgkuQ29kZU1pcnJvciB7CgkgIGJvcmRlci10b3A6IDFweCBzb2xpZCBibGFjazsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrOwoJICBoZWlnaHQ6NDAwcHg7Cgl9CiAgICA8L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5YUXVlcnk8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPlhRdWVyeSBtb2RlPC9oMj4KIAogCjxkaXYgY2xhc3M9ImNtLXMtZGVmYXVsdCI+IAoJPHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4gCnhxdWVyeSB2ZXJzaW9uICZxdW90OzEuMC1tbCZxdW90OzsKKDogdGhpcyBpcwogOiBhIAogICAiY29tbWVudCIgOikKbGV0ICRsZXQgOj0gJmx0O3ggYXR0cj0mcXVvdDt2YWx1ZSZxdW90OyZndDsmcXVvdDt0ZXN0JnF1b3Q7Jmx0O2Z1bmMmZ3Q7ZnVuY3Rpb24oKSAkdmFyIHtmdW5jdGlvbigpfSB7JHZhcn0mbHQ7L2Z1bmMmZ3Q7Jmx0Oy94Jmd0OwpsZXQgJGpvZTo9MQpyZXR1cm4gZWxlbWVudCBlbGVtZW50IHsKCWF0dHJpYnV0ZSBhdHRyaWJ1dGUgeyAxIH0sCgllbGVtZW50IHRlc3QgeyAmIzM5O2EmIzM5OyB9LCAKCWF0dHJpYnV0ZSBmb28geyAmcXVvdDtiYXImcXVvdDsgfSwKCWZuOmRvYygpWyBmb28vQGJhciBlcSAkbGV0IF0sCgkvL3ggfSAgICAKIAooOiBhIG1vcmUgJ2V2aWwnIHRlc3QgOikKKDogTW9kaWZpZWQgQmxha2VsZXkgZXhhbXBsZSAoOiB3aXRoIG5lc3RlZCBjb21tZW50IDopIC4uLiA6KQpkZWNsYXJlIHByaXZhdGUgZnVuY3Rpb24gbG9jYWw6ZGVjbGFyZSgpIHsoKX07CmRlY2xhcmUgcHJpdmF0ZSBmdW5jdGlvbiBsb2NhbDpwcml2YXRlKCkgeygpfTsKZGVjbGFyZSBwcml2YXRlIGZ1bmN0aW9uIGxvY2FsOmZ1bmN0aW9uKCkgeygpfTsKZGVjbGFyZSBwcml2YXRlIGZ1bmN0aW9uIGxvY2FsOmxvY2FsKCkgeygpfTsKbGV0ICRsZXQgOj0gJmx0O2xldCZndDtsZXQgJGxldCA6PSAmcXVvdDtsZXQmcXVvdDsmbHQ7L2xldCZndDsKcmV0dXJuIGVsZW1lbnQgZWxlbWVudCB7CglhdHRyaWJ1dGUgYXR0cmlidXRlIHsgdHJ5IHsgeGRtcDp2ZXJzaW9uKCkgfSBjYXRjaCgkZSkgeyB4ZG1wOmxvZygkZSkgfSB9LAoJYXR0cmlidXRlIGZuOmRvYyB7ICZxdW90O2JhciZxdW90OyBjYXN0YWJsZSBhcyB4czpzdHJpbmcgfSwKCWVsZW1lbnQgdGV4dCB7IHRleHQgeyAmcXVvdDt0ZXh0JnF1b3Q7IH0gfSwKCWZuOmRvYygpWyBjaGlsZDo6ZXEvKEBiYXIgfCBhdHRyaWJ1dGU6OmF0dHJpYnV0ZSkgZXEgJGxldCBdLAoJLy9mbjpkb2MKfQoKCgp4cXVlcnkgdmVyc2lvbiAmcXVvdDsxLjAtbWwmcXVvdDs7CgooOiBDb3B5cmlnaHQgMjAwNi0yMDEwIE1hcmsgTG9naWMgQ29ycG9yYXRpb24uIDopCgooOgogOiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgJnF1b3Q7TGljZW5zZSZxdW90Oyk7CiA6IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KIDogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiA6CiA6ICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKIDoKIDogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogOiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywKIDogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiA6IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIDogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiA6KQoKbW9kdWxlIG5hbWVzcGFjZSBqc29uID0gJnF1b3Q7aHR0cDovL21hcmtsb2dpYy5jb20vanNvbiZxdW90OzsKZGVjbGFyZSBkZWZhdWx0IGZ1bmN0aW9uIG5hbWVzcGFjZSAmcXVvdDtodHRwOi8vd3d3LnczLm9yZy8yMDA1L3hwYXRoLWZ1bmN0aW9ucyZxdW90OzsKCig6IE5lZWQgdG8gYmFja3NsYXNoIGVzY2FwZSBhbnkgZG91YmxlIHF1b3RlcywgYmFja3NsYXNoZXMsIGFuZCBuZXdsaW5lcyA6KQpkZWNsYXJlIGZ1bmN0aW9uIGpzb246ZXNjYXBlKCRzIGFzIHhzOnN0cmluZykgYXMgeHM6c3RyaW5nIHsKICBsZXQgJHMgOj0gcmVwbGFjZSgkcywgJnF1b3Q7XFwmcXVvdDssICZxdW90O1xcXFwmcXVvdDspCiAgbGV0ICRzIDo9IHJlcGxhY2UoJHMsICZxdW90OyZxdW90OyZxdW90OyZxdW90OywgJnF1b3Q7XFwmcXVvdDsmcXVvdDsmcXVvdDspCiAgbGV0ICRzIDo9IHJlcGxhY2UoJHMsIGNvZGVwb2ludHMtdG8tc3RyaW5nKCgxMywgMTApKSwgJnF1b3Q7XFxuJnF1b3Q7KQogIGxldCAkcyA6PSByZXBsYWNlKCRzLCBjb2RlcG9pbnRzLXRvLXN0cmluZygxMyksICZxdW90O1xcbiZxdW90OykKICBsZXQgJHMgOj0gcmVwbGFjZSgkcywgY29kZXBvaW50cy10by1zdHJpbmcoMTApLCAmcXVvdDtcXG4mcXVvdDspCiAgcmV0dXJuICRzCn07CgpkZWNsYXJlIGZ1bmN0aW9uIGpzb246YXRvbWl6ZSgkeCBhcyBlbGVtZW50KCkpIGFzIHhzOnN0cmluZyB7CiAgaWYgKGNvdW50KCR4L25vZGUoKSkgPSAwKSB0aGVuICdudWxsJwogIGVsc2UgaWYgKCR4L0B0eXBlID0gJnF1b3Q7bnVtYmVyJnF1b3Q7KSB0aGVuCiAgICBsZXQgJGNhc3RhYmxlIDo9ICR4IGNhc3RhYmxlIGFzIHhzOmZsb2F0IG9yCiAgICAgICAgICAgICAgICAgICAgICR4IGNhc3RhYmxlIGFzIHhzOmRvdWJsZSBvcgogICAgICAgICAgICAgICAgICAgICAkeCBjYXN0YWJsZSBhcyB4czpkZWNpbWFsCiAgICByZXR1cm4KICAgIGlmICgkY2FzdGFibGUpIHRoZW4geHM6c3RyaW5nKCR4KQogICAgZWxzZSBlcnJvcihjb25jYXQoJnF1b3Q7Tm90IGEgbnVtYmVyOiAmcXVvdDssIHhkbXA6ZGVzY3JpYmUoJHgpKSkKICBlbHNlIGlmICgkeC9AdHlwZSA9ICZxdW90O2Jvb2xlYW4mcXVvdDspIHRoZW4KICAgIGxldCAkY2FzdGFibGUgOj0gJHggY2FzdGFibGUgYXMgeHM6Ym9vbGVhbgogICAgcmV0dXJuCiAgICBpZiAoJGNhc3RhYmxlKSB0aGVuIHhzOnN0cmluZyh4czpib29sZWFuKCR4KSkKICAgIGVsc2UgZXJyb3IoY29uY2F0KCZxdW90O05vdCBhIGJvb2xlYW46ICZxdW90OywgeGRtcDpkZXNjcmliZSgkeCkpKQogIGVsc2UgY29uY2F0KCcmcXVvdDsnLCBqc29uOmVzY2FwZSgkeCksICcmcXVvdDsnKQp9OwoKKDogUHJpbnQgdGhlIHRoaW5nIHRoYXQgY29tZXMgYWZ0ZXIgdGhlIGNvbG9uIDopCmRlY2xhcmUgZnVuY3Rpb24ganNvbjpwcmludC12YWx1ZSgkeCBhcyBlbGVtZW50KCkpIGFzIHhzOnN0cmluZyB7CiAgaWYgKGNvdW50KCR4LyopID0gMCkgdGhlbgogICAganNvbjphdG9taXplKCR4KQogIGVsc2UgaWYgKCR4L0BxdW90ZSA9ICZxdW90O3RydWUmcXVvdDspIHRoZW4KICAgIGNvbmNhdCgnJnF1b3Q7JywganNvbjplc2NhcGUoeGRtcDpxdW90ZSgkeC9ub2RlKCkpKSwgJyZxdW90OycpCiAgZWxzZQogICAgc3RyaW5nLWpvaW4oKCd7JywKICAgICAgc3RyaW5nLWpvaW4oZm9yICRpIGluICR4LyogcmV0dXJuIGpzb246cHJpbnQtbmFtZS12YWx1ZSgkaSksICZxdW90OywmcXVvdDspLAogICAgJ30nKSwgJnF1b3Q7JnF1b3Q7KQp9OwoKKDogUHJpbnQgdGhlIG5hbWUgYW5kIHZhbHVlIGJvdGggOikKZGVjbGFyZSBmdW5jdGlvbiBqc29uOnByaW50LW5hbWUtdmFsdWUoJHggYXMgZWxlbWVudCgpKSBhcyB4czpzdHJpbmc/IHsKICBsZXQgJG5hbWUgOj0gbmFtZSgkeCkKICBsZXQgJGZpcnN0LWluLWFycmF5IDo9CiAgICBjb3VudCgkeC9wcmVjZWRpbmctc2libGluZzo6KltuYW1lKC4pID0gJG5hbWVdKSA9IDAgYW5kCiAgICAoY291bnQoJHgvZm9sbG93aW5nLXNpYmxpbmc6OipbbmFtZSguKSA9ICRuYW1lXSkgJmd0OyAwIG9yICR4L0BhcnJheSA9ICZxdW90O3RydWUmcXVvdDspCiAgbGV0ICRsYXRlci1pbi1hcnJheSA6PSBjb3VudCgkeC9wcmVjZWRpbmctc2libGluZzo6KltuYW1lKC4pID0gJG5hbWVdKSAmZ3Q7IDAKICByZXR1cm4KCiAgaWYgKCRsYXRlci1pbi1hcnJheSkgdGhlbgogICAgKCkgICg6IEkgd2FzIGhhbmRsZWQgcHJldmlvdXNseSA6KQogIGVsc2UgaWYgKCRmaXJzdC1pbi1hcnJheSkgdGhlbgogICAgc3RyaW5nLWpvaW4oKCcmcXVvdDsnLCBqc29uOmVzY2FwZSgkbmFtZSksICcmcXVvdDs6WycsCiAgICAgIHN0cmluZy1qb2luKChmb3IgJGkgaW4gKCR4LCAkeC9mb2xsb3dpbmctc2libGluZzo6KltuYW1lKC4pID0gJG5hbWVdKSByZXR1cm4ganNvbjpwcmludC12YWx1ZSgkaSkpLCAmcXVvdDssJnF1b3Q7KSwKICAgICddJyksICZxdW90OyZxdW90OykKICAgZWxzZQogICAgIHN0cmluZy1qb2luKCgnJnF1b3Q7JywganNvbjplc2NhcGUoJG5hbWUpLCAnJnF1b3Q7OicsIGpzb246cHJpbnQtdmFsdWUoJHgpKSwgJnF1b3Q7JnF1b3Q7KQp9OwoKKDp+CiAgVHJhbnNmb3JtcyBhbiBYTUwgZWxlbWVudCBpbnRvIGEgSlNPTiBzdHJpbmcgcmVwcmVzZW50YXRpb24uICBTZWUgaHR0cDovL2pzb24ub3JnLgogICZsdDtwLyZndDsKICBTYW1wbGUgdXNhZ2U6CiAgJmx0O3ByZSZndDsKICAgIHhxdWVyeSB2ZXJzaW9uICZxdW90OzEuMC1tbCZxdW90OzsKICAgIGltcG9ydCBtb2R1bGUgbmFtZXNwYWNlIGpzb249JnF1b3Q7aHR0cDovL21hcmtsb2dpYy5jb20vanNvbiZxdW90OyBhdCAmcXVvdDtqc29uLnhxeSZxdW90OzsKICAgIGpzb246c2VyaWFsaXplKCZhbXA7bHQ7Zm9vJmFtcDtndDsmYW1wO2x0O2JhciZhbXA7Z3Q7a2lkJmFtcDtsdDsvYmFyJmFtcDtndDsmYW1wO2x0Oy9mb28mYW1wO2d0OykKICAmbHQ7L3ByZSZndDsKICBTYW1wbGUgdHJhbnNmb3JtYXRpb25zOgogICZsdDtwcmUmZ3Q7CiAgJmFtcDtsdDtlLyZhbXA7Z3Q7IGJlY29tZXMgeyZxdW90O2UmcXVvdDs6bnVsbH0KICAmYW1wO2x0O2UmYW1wO2d0O3RleHQmYW1wO2x0Oy9lJmFtcDtndDsgYmVjb21lcyB7JnF1b3Q7ZSZxdW90OzomcXVvdDt0ZXh0JnF1b3Q7fQogICZhbXA7bHQ7ZSZhbXA7Z3Q7cXVvdGUgJnF1b3Q7IGVzY2FwaW5nJmFtcDtsdDsvZSZhbXA7Z3Q7IGJlY29tZXMgeyZxdW90O2UmcXVvdDs6JnF1b3Q7cXVvdGUgXCZxdW90OyBlc2NhcGluZyZxdW90O30KICAmYW1wO2x0O2UmYW1wO2d0O2JhY2tzbGFzaCBcIGVzY2FwaW5nJmFtcDtsdDsvZSZhbXA7Z3Q7IGJlY29tZXMgeyZxdW90O2UmcXVvdDs6JnF1b3Q7YmFja3NsYXNoIFxcIGVzY2FwaW5nJnF1b3Q7fQogICZhbXA7bHQ7ZSZhbXA7Z3Q7JmFtcDtsdDthJmFtcDtndDt0ZXh0MSZhbXA7bHQ7L2EmYW1wO2d0OyZhbXA7bHQ7YiZhbXA7Z3Q7dGV4dDImYW1wO2x0Oy9iJmFtcDtndDsmYW1wO2x0Oy9lJmFtcDtndDsgYmVjb21lcyB7JnF1b3Q7ZSZxdW90Ozp7JnF1b3Q7YSZxdW90OzomcXVvdDt0ZXh0MSZxdW90OywmcXVvdDtiJnF1b3Q7OiZxdW90O3RleHQyJnF1b3Q7fX0KICAmYW1wO2x0O2UmYW1wO2d0OyZhbXA7bHQ7YSZhbXA7Z3Q7dGV4dDEmYW1wO2x0Oy9hJmFtcDtndDsmYW1wO2x0O2EmYW1wO2d0O3RleHQyJmFtcDtsdDsvYSZhbXA7Z3Q7JmFtcDtsdDsvZSZhbXA7Z3Q7IGJlY29tZXMgeyZxdW90O2UmcXVvdDs6eyZxdW90O2EmcXVvdDs6WyZxdW90O3RleHQxJnF1b3Q7LCZxdW90O3RleHQyJnF1b3Q7XX19CiAgJmFtcDtsdDtlJmFtcDtndDsmYW1wO2x0O2EgYXJyYXk9JnF1b3Q7dHJ1ZSZxdW90OyZhbXA7Z3Q7dGV4dDEmYW1wO2x0Oy9hJmFtcDtndDsmYW1wO2x0Oy9lJmFtcDtndDsgYmVjb21lcyB7JnF1b3Q7ZSZxdW90Ozp7JnF1b3Q7YSZxdW90OzpbJnF1b3Q7dGV4dDEmcXVvdDtdfX0KICAmYW1wO2x0O2UmYW1wO2d0OyZhbXA7bHQ7YSB0eXBlPSZxdW90O2Jvb2xlYW4mcXVvdDsmYW1wO2d0O2ZhbHNlJmFtcDtsdDsvYSZhbXA7Z3Q7JmFtcDtsdDsvZSZhbXA7Z3Q7IGJlY29tZXMgeyZxdW90O2UmcXVvdDs6eyZxdW90O2EmcXVvdDs6ZmFsc2V9fQogICZhbXA7bHQ7ZSZhbXA7Z3Q7JmFtcDtsdDthIHR5cGU9JnF1b3Q7bnVtYmVyJnF1b3Q7JmFtcDtndDsxMjMuNSZhbXA7bHQ7L2EmYW1wO2d0OyZhbXA7bHQ7L2UmYW1wO2d0OyBiZWNvbWVzIHsmcXVvdDtlJnF1b3Q7OnsmcXVvdDthJnF1b3Q7OjEyMy41fX0KICAmYW1wO2x0O2UgcXVvdGU9JnF1b3Q7dHJ1ZSZxdW90OyZhbXA7Z3Q7JmFtcDtsdDtkaXYgYXR0cmliPSZxdW90O3ZhbHVlJnF1b3Q7LyZhbXA7Z3Q7JmFtcDtsdDsvZSZhbXA7Z3Q7IGJlY29tZXMgeyZxdW90O2UmcXVvdDs6JnF1b3Q7JmFtcDtsdDtkaXYgYXR0cmliPVwmcXVvdDt2YWx1ZVwmcXVvdDsvJmFtcDtndDsmcXVvdDt9CiAgJmx0Oy9wcmUmZ3Q7CiAgJmx0O3AvJmd0OwogIE5hbWVzcGFjZSBVUklzIGFyZSBpZ25vcmVkLiAgTmFtZXNwYWNlIHByZWZpeGVzIGFyZSBpbmNsdWRlZCBpbiB0aGUgSlNPTiBuYW1lLgogICZsdDtwLyZndDsKICBBdHRyaWJ1dGVzIGFyZSBpZ25vcmVkLCBleGNlcHQgZm9yIHRoZSBzcGVjaWFsIGF0dHJpYnV0ZSBAYXJyYXk9JnF1b3Q7dHJ1ZSZxdW90OyB0aGF0CiAgaW5kaWNhdGVzIHRoZSBKU09OIHNlcmlhbGl6YXRpb24gc2hvdWxkIHdyaXRlIHRoZSBub2RlLCBldmVuIGlmIHNpbmdsZSwgYXMgYW4KICBhcnJheSwgYW5kIHRoZSBhdHRyaWJ1dGUgQHR5cGUgdGhhdCBjYW4gYmUgc2V0IHRvICZxdW90O2Jvb2xlYW4mcXVvdDsgb3IgJnF1b3Q7bnVtYmVyJnF1b3Q7IHRvCiAgZGljdGF0ZSB0aGUgdmFsdWUgc2hvdWxkIGJlIHdyaXR0ZW4gYXMgdGhhdCB0eXBlICh1bnF1b3RlZCkuICBUaGVyZSdzIGFsc28KICBhbiBAcXVvdGUgYXR0cmlidXRlIHRoYXQgd2hlbiBzZXQgdG8gdHJ1ZSB3cml0ZXMgdGhlIGlubmVyIGNvbnRlbnQgYXMgdGV4dAogIHJhdGhlciB0aGFuIGFzIHN0cnVjdHVyZWQgSlNPTiwgdXNlZnVsIGZvciBzZW5kaW5nIHNvbWUgWEhUTUwgb3ZlciB0aGUKICB3aXJlLgogICZsdDtwLyZndDsKICBUZXh0IG5vZGVzIHdpdGhpbiBtaXhlZCBjb250ZW50IGFyZSBpZ25vcmVkLgoKICBAcGFyYW0gJHggRWxlbWVudCBub2RlIHRvIGNvbnZlcnQKICBAcmV0dXJuIFN0cmluZyBob2xkaW5nIEpTT04gc2VyaWFsaXplZCByZXByZXNlbnRhdGlvbiBvZiAkeAoKICBAYXV0aG9yIEphc29uIEh1bnRlcgogIEB2ZXJzaW9uIDEuMC4xCiAgCiAgUG9ydGVkIHRvIHhxdWVyeSAxLjAtbWw7IGRvdWJsZSBlc2NhcGVkIGJhY2tzbGFzaGVzIGluIGpzb246ZXNjYXBlCjopCmRlY2xhcmUgZnVuY3Rpb24ganNvbjpzZXJpYWxpemUoJHggYXMgZWxlbWVudCgpKSAgYXMgeHM6c3RyaW5nIHsKICBzdHJpbmctam9pbigoJ3snLCBqc29uOnByaW50LW5hbWUtdmFsdWUoJHgpLCAnfScpLCAmcXVvdDsmcXVvdDspCn07CiAgPC90ZXh0YXJlYT4gCjwvZGl2PiAKIAogICAgPHNjcmlwdD4gCiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICAgICAgbGluZU51bWJlcnM6IHRydWUsCiAgICAgICAgbWF0Y2hCcmFja2V0czogdHJ1ZSwKICAgICAgICB0aGVtZTogInhxLWRhcmsiCiAgICAgIH0pOwogICAgPC9zY3JpcHQ+IAogCiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+YXBwbGljYXRpb24veHF1ZXJ5PC9jb2RlPi48L3A+IAogCiAgICA8cD5EZXZlbG9wbWVudCBvZiB0aGUgQ29kZU1pcnJvciBYUXVlcnkgbW9kZSB3YXMgc3BvbnNvcmVkIGJ5IAogICAgICA8YSBocmVmPSJodHRwOi8vbWFya2xvZ2ljLmNvbSI+TWFya0xvZ2ljPC9hPiBhbmQgZGV2ZWxvcGVkIGJ5IAogICAgICA8YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL21icmV2b29ydCI+TWlrZSBCcmV2b29ydDwvYT4uCiAgICA8L3A+CiAKICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/xquery/test.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovLyBEb24ndCB0YWtlIHRoZXNlIHRvbyBzZXJpb3VzbHkgLS0gdGhlIGV4cGVjdGVkIHJlc3VsdHMgYXBwZWFyIHRvIGJlCi8vIGJhc2VkIG9uIHRoZSByZXN1bHRzIG9mIGFjdHVhbCBydW5zIHdpdGhvdXQgYW55IHNlcmlvdXMgbWFudWFsCi8vIHZlcmlmaWNhdGlvbi4gSWYgYSBjaGFuZ2UgeW91IG1hZGUgY2F1c2VzIHRoZW0gdG8gZmFpbCwgdGhlIHRlc3QgaXMKLy8gYXMgbGlrZWx5IHRvIHdyb25nIGFzIHRoZSBjb2RlLgoKKGZ1bmN0aW9uKCkgewogIHZhciBtb2RlID0gQ29kZU1pcnJvci5nZXRNb2RlKHt0YWJTaXplOiA0fSwgInhxdWVyeSIpOwogIGZ1bmN0aW9uIE1UKG5hbWUpIHsgdGVzdC5tb2RlKG5hbWUsIG1vZGUsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpOyB9CgogIE1UKCJldmlsdGVzdCIsCiAgICAgIltrZXl3b3JkIHhxdWVyeV0gW2tleXdvcmQgdmVyc2lvbl0gW3ZhcmlhYmxlICZxdW90OzFdW2tleXdvcmQgLl1bYXRvbSAwXVtrZXl3b3JkIC1dW3ZhcmlhYmxlIG1sJnF1b3Q7XVtkZWYmdmFyaWFibGUgO10gICAgICBbY29tbWVudCAoOiB0aGlzIGlzICAgICAgIDogYSAgICAgICAgICBcImNvbW1lbnRcIiA6KV0iLAogICAgICIgICAgICBba2V5d29yZCBsZXRdIFt2YXJpYWJsZSAkbGV0XSBba2V5d29yZCA6PV0gW3ZhcmlhYmxlICZsdDt4XSBbdmFyaWFibGUgYXR0cl1ba2V5d29yZCA9XVt2YXJpYWJsZSAmcXVvdDt2YWx1ZSZxdW90OyZndDsmcXVvdDt0ZXN0JnF1b3Q7Jmx0O2Z1bmMmZ3RdW2RlZiZ2YXJpYWJsZSA7ZnVuY3Rpb25dKCkgW3ZhcmlhYmxlICR2YXJdIHtba2V5d29yZCBmdW5jdGlvbl0oKX0ge1t2YXJpYWJsZSAkdmFyXX1bdmFyaWFibGUgJmx0O11ba2V5d29yZCAvXVt2YXJpYWJsZSBmdW5jJmd0OyZsdDtdW2tleXdvcmQgL11bdmFyaWFibGUgeCZndDtdIiwKICAgICAiICAgICAgW2tleXdvcmQgbGV0XSBbdmFyaWFibGUgJGpvZV1ba2V5d29yZCA6PV1bYXRvbSAxXSIsCiAgICAgIiAgICAgIFtrZXl3b3JkIHJldHVybl0gW2tleXdvcmQgZWxlbWVudF0gW3ZhcmlhYmxlIGVsZW1lbnRdIHsiLAogICAgICIgICAgICAgICAgW2tleXdvcmQgYXR0cmlidXRlXSBbdmFyaWFibGUgYXR0cmlidXRlXSB7IFthdG9tIDFdIH0sIiwKICAgICAiICAgICAgICAgIFtrZXl3b3JkIGVsZW1lbnRdIFt2YXJpYWJsZSB0ZXN0XSB7IFt2YXJpYWJsZSAmIzM5O2EmIzM5O10gfSwgICAgICAgICAgIFtrZXl3b3JkIGF0dHJpYnV0ZV0gW3ZhcmlhYmxlIGZvb10geyBbdmFyaWFibGUgJnF1b3Q7YmFyJnF1b3Q7XSB9LCIsCiAgICAgIiAgICAgICAgICBbZGVmJnZhcmlhYmxlIGZuOmRvY10oKVtbIFt2YXJpYWJsZSBmb29dW2tleXdvcmQgL11bdmFyaWFibGUgQGJhcl0gW2tleXdvcmQgZXFdIFt2YXJpYWJsZSAkbGV0XSBdXSwiLAogICAgICIgICAgICAgICAgW2tleXdvcmQgLy9dW3ZhcmlhYmxlIHhdIH0gICAgICAgICAgICAgICAgIFtjb21tZW50ICg6IGEgbW9yZSAnZXZpbCcgdGVzdCA6KV0iLAogICAgICIgICAgICBbY29tbWVudCAoOiBNb2RpZmllZCBCbGFrZWxleSBleGFtcGxlICg6IHdpdGggbmVzdGVkIGNvbW1lbnQgOikgLi4uIDopXSIsCiAgICAgIiAgICAgIFtrZXl3b3JkIGRlY2xhcmVdIFtrZXl3b3JkIHByaXZhdGVdIFtrZXl3b3JkIGZ1bmN0aW9uXSBbZGVmJnZhcmlhYmxlIGxvY2FsOmRlY2xhcmVdKCkgeygpfVt2YXJpYWJsZSA7XSIsCiAgICAgIiAgICAgIFtrZXl3b3JkIGRlY2xhcmVdIFtrZXl3b3JkIHByaXZhdGVdIFtrZXl3b3JkIGZ1bmN0aW9uXSBbZGVmJnZhcmlhYmxlIGxvY2FsOnByaXZhdGVdKCkgeygpfVt2YXJpYWJsZSA7XSIsCiAgICAgIiAgICAgIFtrZXl3b3JkIGRlY2xhcmVdIFtrZXl3b3JkIHByaXZhdGVdIFtrZXl3b3JkIGZ1bmN0aW9uXSBbZGVmJnZhcmlhYmxlIGxvY2FsOmZ1bmN0aW9uXSgpIHsoKX1bdmFyaWFibGUgO10iLAogICAgICIgICAgICBba2V5d29yZCBkZWNsYXJlXSBba2V5d29yZCBwcml2YXRlXSBba2V5d29yZCBmdW5jdGlvbl0gW2RlZiZ2YXJpYWJsZSBsb2NhbDpsb2NhbF0oKSB7KCl9W3ZhcmlhYmxlIDtdIiwKICAgICAiICAgICAgW2tleXdvcmQgbGV0XSBbdmFyaWFibGUgJGxldF0gW2tleXdvcmQgOj1dIFt2YXJpYWJsZSAmbHQ7bGV0Jmd0O2xldF0gW3ZhcmlhYmxlICRsZXRdIFtrZXl3b3JkIDo9XSBbdmFyaWFibGUgJnF1b3Q7bGV0JnF1b3Q7Jmx0O11ba2V5d29yZCAvbGV0XVt2YXJpYWJsZSAmZ3Q7XSIsCiAgICAgIiAgICAgIFtrZXl3b3JkIHJldHVybl0gW2tleXdvcmQgZWxlbWVudF0gW3ZhcmlhYmxlIGVsZW1lbnRdIHsiLAogICAgICIgICAgICAgICAgW2tleXdvcmQgYXR0cmlidXRlXSBbdmFyaWFibGUgYXR0cmlidXRlXSB7IFtrZXl3b3JkIHRyeV0geyBbZGVmJnZhcmlhYmxlIHhkbXA6dmVyc2lvbl0oKSB9IFtrZXl3b3JkIGNhdGNoXShbdmFyaWFibGUgJGVdKSB7IFtkZWYmdmFyaWFibGUgeGRtcDpsb2ddKFt2YXJpYWJsZSAkZV0pIH0gfSwiLAogICAgICIgICAgICAgICAgW2tleXdvcmQgYXR0cmlidXRlXSBbdmFyaWFibGUgZm46ZG9jXSB7IFt2YXJpYWJsZSAmcXVvdDtiYXImcXVvdDtdIFt2YXJpYWJsZSBjYXN0YWJsZV0gW2tleXdvcmQgYXNdIFthdG9tIHhzOnN0cmluZ10gfSwiLAogICAgICIgICAgICAgICAgW2tleXdvcmQgZWxlbWVudF0gW3ZhcmlhYmxlIHRleHRdIHsgW2tleXdvcmQgdGV4dF0geyBbdmFyaWFibGUgJnF1b3Q7dGV4dCZxdW90O10gfSB9LCIsCiAgICAgIiAgICAgICAgICBbZGVmJnZhcmlhYmxlIGZuOmRvY10oKVtbIFtxdWFsaWZpZXIgY2hpbGQ6Ol1bdmFyaWFibGUgZXFdW2tleXdvcmQgL10oW3ZhcmlhYmxlIEBiYXJdIFtrZXl3b3JkIHxdIFtxdWFsaWZpZXIgYXR0cmlidXRlOjpdW3ZhcmlhYmxlIGF0dHJpYnV0ZV0pIFtrZXl3b3JkIGVxXSBbdmFyaWFibGUgJGxldF0gXV0sIiwKICAgICAiICAgICAgICAgIFtrZXl3b3JkIC8vXVt2YXJpYWJsZSBmbjpkb2NdIiwKICAgICAiICAgICAgfSIpOwoKICBNVCgidGVzdEVtcHR5U2VxdWVuY2VLZXl3b3JkIiwKICAgICAiW3N0cmluZyBcImZvb1wiXSBba2V5d29yZCBpbnN0YW5jZV0gW2tleXdvcmQgb2ZdIFtrZXl3b3JkIGVtcHR5LXNlcXVlbmNlXSgpIik7CgogIE1UKCJ0ZXN0TXVsdGlBdHRyIiwKICAgICAiW3RhZyA8cCBdW2F0dHJpYnV0ZSBhMV09W3N0cmluZyBcImZvb1wiXSBbYXR0cmlidXRlIGEyXT1bc3RyaW5nIFwiYmFyXCJdW3RhZyA+XVt2YXJpYWJsZSBoZWxsb10gW3ZhcmlhYmxlIHdvcmxkXVt0YWcgPC9wPl0iKTsKCiAgTVQoInRlc3QgbmFtZXNwYWNlZCB2YXJpYWJsZSIsCiAgICAgIltrZXl3b3JkIGRlY2xhcmVdIFtrZXl3b3JkIG5hbWVzcGFjZV0gW3ZhcmlhYmxlIGVdIFtrZXl3b3JkID1dIFtzdHJpbmcgXCJodHRwOi8vZXhhbXBsZS5jb20vQU5hbWVzcGFjZVwiXVt2YXJpYWJsZSA7ZGVjbGFyZV0gW2tleXdvcmQgdmFyaWFibGVdIFt2YXJpYWJsZSAkZTpleGFtcGxlQ29tVGhpc1ZhcklzTm90UmVjb2duaXplZF0gW2tleXdvcmQgYXNdIFtrZXl3b3JkIGVsZW1lbnRdKFtrZXl3b3JkICpdKSBbdmFyaWFibGUgZXh0ZXJuYWw7XSIpOwoKICBNVCgidGVzdCBFUU5hbWUgdmFyaWFibGUiLAogICAgICJba2V5d29yZCBkZWNsYXJlXSBba2V5d29yZCB2YXJpYWJsZV0gW3ZhcmlhYmxlICRcImh0dHA6Ly93d3cuZXhhbXBsZS5jb20vbnMvbXlcIjp2YXJdIFtrZXl3b3JkIDo9XSBbYXRvbSAxMl1bdmFyaWFibGUgO10iLAogICAgICJbdGFnIDxvdXQ+XXtbdmFyaWFibGUgJFwiaHR0cDovL3d3dy5leGFtcGxlLmNvbS9ucy9teVwiOnZhcl19W3RhZyA8L291dD5dIik7CgogIE1UKCJ0ZXN0IEVRTmFtZSBmdW5jdGlvbiIsCiAgICAgIltrZXl3b3JkIGRlY2xhcmVdIFtrZXl3b3JkIGZ1bmN0aW9uXSBbZGVmJnZhcmlhYmxlIFwiaHR0cDovL3d3dy5leGFtcGxlLmNvbS9ucy9teVwiOmZuXSAoW3ZhcmlhYmxlICRhXSBba2V5d29yZCBhc10gW2F0b20geHM6aW50ZWdlcl0pIFtrZXl3b3JkIGFzXSBbYXRvbSB4czppbnRlZ2VyXSB7IiwKICAgICAiICAgW3ZhcmlhYmxlICRhXSBba2V5d29yZCArXSBbYXRvbSAyXSIsCiAgICAgIn1bdmFyaWFibGUgO10iLAogICAgICJbdGFnIDxvdXQ+XXtbZGVmJnZhcmlhYmxlIFwiaHR0cDovL3d3dy5leGFtcGxlLmNvbS9ucy9teVwiOmZuXShbYXRvbSAxMl0pfVt0YWcgPC9vdXQ+XSIpOwoKICBNVCgidGVzdCBFUU5hbWUgZnVuY3Rpb24gd2l0aCBzaW5nbGUgcXVvdGVzIiwKICAgICAiW2tleXdvcmQgZGVjbGFyZV0gW2tleXdvcmQgZnVuY3Rpb25dIFtkZWYmdmFyaWFibGUgJ2h0dHA6Ly93d3cuZXhhbXBsZS5jb20vbnMvbXknOmZuXSAoW3ZhcmlhYmxlICRhXSBba2V5d29yZCBhc10gW2F0b20geHM6aW50ZWdlcl0pIFtrZXl3b3JkIGFzXSBbYXRvbSB4czppbnRlZ2VyXSB7IiwKICAgICAiICAgW3ZhcmlhYmxlICRhXSBba2V5d29yZCArXSBbYXRvbSAyXSIsCiAgICAgIn1bdmFyaWFibGUgO10iLAogICAgICJbdGFnIDxvdXQ+XXtbZGVmJnZhcmlhYmxlICdodHRwOi8vd3d3LmV4YW1wbGUuY29tL25zL215Jzpmbl0oW2F0b20gMTJdKX1bdGFnIDwvb3V0Pl0iKTsKCiAgTVQoInRlc3RQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25zIiwKICAgICAiW2RlZiZ2YXJpYWJsZSBkYXRhXShbY29tbWVudCZtZXRhIDw/dGFyZ2V0IGNvbnRlbnQ/Pl0pIFtrZXl3b3JkIGluc3RhbmNlXSBba2V5d29yZCBvZl0gW2F0b20geHM6c3RyaW5nXSIpOwoKICBNVCgidGVzdFF1b3RlRXNjYXBlRG91YmxlIiwKICAgICAiW2tleXdvcmQgbGV0XSBbdmFyaWFibGUgJHJvb3Rmb2xkZXJdIFtrZXl3b3JkIDo9XSBbc3RyaW5nIFwiYzpcXGJ1aWxkc1xcd2lubnRcXEhFQURcXHFhXFxzY3JpcHRzXFxcIl0iLAogICAgICJba2V5d29yZCBsZXRdIFt2YXJpYWJsZSAka2V5c2ZvbGRlcl0gW2tleXdvcmQgOj1dIFtkZWYmdmFyaWFibGUgY29uY2F0XShbdmFyaWFibGUgJHJvb3Rmb2xkZXJdLCBbc3RyaW5nIFwia2V5c1xcXCJdKSIpOwp9KSgpOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/xquery/xquery.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJ4cXVlcnkiLCBmdW5jdGlvbigpIHsKCiAgLy8gVGhlIGtleXdvcmRzIG9iamVjdCBpcyBzZXQgdG8gdGhlIHJlc3VsdCBvZiB0aGlzIHNlbGYgZXhlY3V0aW5nCiAgLy8gZnVuY3Rpb24uIEVhY2gga2V5d29yZCBpcyBhIHByb3BlcnR5IG9mIHRoZSBrZXl3b3JkcyBvYmplY3Qgd2hvc2UKICAvLyB2YWx1ZSBpcyB7dHlwZTogYXR5cGUsIHN0eWxlOiBhc3R5bGV9CiAgdmFyIGtleXdvcmRzID0gZnVuY3Rpb24oKXsKICAgIC8vIGNvbnZlaW5lbmNlIGZ1bmN0aW9ucyB1c2VkIHRvIGJ1aWxkIGtleXdvcmRzIG9iamVjdAogICAgZnVuY3Rpb24ga3codHlwZSkge3JldHVybiB7dHlwZTogdHlwZSwgc3R5bGU6ICJrZXl3b3JkIn07fQogICAgdmFyIEEgPSBrdygia2V5d29yZCBhIikKICAgICAgLCBCID0ga3coImtleXdvcmQgYiIpCiAgICAgICwgQyA9IGt3KCJrZXl3b3JkIGMiKQogICAgICAsIG9wZXJhdG9yID0ga3coIm9wZXJhdG9yIikKICAgICAgLCBhdG9tID0ge3R5cGU6ICJhdG9tIiwgc3R5bGU6ICJhdG9tIn0KICAgICAgLCBwdW5jdHVhdGlvbiA9IHt0eXBlOiAicHVuY3R1YXRpb24iLCBzdHlsZTogbnVsbH0KICAgICAgLCBxdWFsaWZpZXIgPSB7dHlwZTogImF4aXNfc3BlY2lmaWVyIiwgc3R5bGU6ICJxdWFsaWZpZXIifTsKCiAgICAvLyBrd09iaiBpcyB3aGF0IGlzIHJldHVybiBmcm9tIHRoaXMgZnVuY3Rpb24gYXQgdGhlIGVuZAogICAgdmFyIGt3T2JqID0gewogICAgICAnaWYnOiBBLCAnc3dpdGNoJzogQSwgJ3doaWxlJzogQSwgJ2Zvcic6IEEsCiAgICAgICdlbHNlJzogQiwgJ3RoZW4nOiBCLCAndHJ5JzogQiwgJ2ZpbmFsbHknOiBCLCAnY2F0Y2gnOiBCLAogICAgICAnZWxlbWVudCc6IEMsICdhdHRyaWJ1dGUnOiBDLCAnbGV0JzogQywgJ2ltcGxlbWVudHMnOiBDLCAnaW1wb3J0JzogQywgJ21vZHVsZSc6IEMsICduYW1lc3BhY2UnOiBDLAogICAgICAncmV0dXJuJzogQywgJ3N1cGVyJzogQywgJ3RoaXMnOiBDLCAndGhyb3dzJzogQywgJ3doZXJlJzogQywgJ3ByaXZhdGUnOiBDLAogICAgICAnLCc6IHB1bmN0dWF0aW9uLAogICAgICAnbnVsbCc6IGF0b20sICdmbjpmYWxzZSgpJzogYXRvbSwgJ2ZuOnRydWUoKSc6IGF0b20KICAgIH07CgogICAgLy8gYSBsaXN0IG9mICdiYXNpYycga2V5d29yZHMuIEZvciBlYWNoIGFkZCBhIHByb3BlcnR5IHRvIGt3T2JqIHdpdGggdGhlIHZhbHVlIG9mCiAgICAvLyB7dHlwZTogYmFzaWNbaV0sIHN0eWxlOiAia2V5d29yZCJ9IGUuZy4gJ2FmdGVyJyAtLT4ge3R5cGU6ICJhZnRlciIsIHN0eWxlOiAia2V5d29yZCJ9CiAgICB2YXIgYmFzaWMgPSBbJ2FmdGVyJywnYW5jZXN0b3InLCdhbmNlc3Rvci1vci1zZWxmJywnYW5kJywnYXMnLCdhc2NlbmRpbmcnLCdhc3NlcnQnLCdhdHRyaWJ1dGUnLCdiZWZvcmUnLAogICAgJ2J5JywnY2FzZScsJ2Nhc3QnLCdjaGlsZCcsJ2NvbW1lbnQnLCdkZWNsYXJlJywnZGVmYXVsdCcsJ2RlZmluZScsJ2Rlc2NlbmRhbnQnLCdkZXNjZW5kYW50LW9yLXNlbGYnLAogICAgJ2Rlc2NlbmRpbmcnLCdkb2N1bWVudCcsJ2RvY3VtZW50LW5vZGUnLCdlbGVtZW50JywnZWxzZScsJ2VxJywnZXZlcnknLCdleGNlcHQnLCdleHRlcm5hbCcsJ2ZvbGxvd2luZycsCiAgICAnZm9sbG93aW5nLXNpYmxpbmcnLCdmb2xsb3dzJywnZm9yJywnZnVuY3Rpb24nLCdpZicsJ2ltcG9ydCcsJ2luJywnaW5zdGFuY2UnLCdpbnRlcnNlY3QnLCdpdGVtJywKICAgICdsZXQnLCdtb2R1bGUnLCduYW1lc3BhY2UnLCdub2RlJywnbm9kZScsJ29mJywnb25seScsJ29yJywnb3JkZXInLCdwYXJlbnQnLCdwcmVjZWRlcycsJ3ByZWNlZGluZycsCiAgICAncHJlY2VkaW5nLXNpYmxpbmcnLCdwcm9jZXNzaW5nLWluc3RydWN0aW9uJywncmVmJywncmV0dXJuJywncmV0dXJucycsJ3NhdGlzZmllcycsJ3NjaGVtYScsJ3NjaGVtYS1lbGVtZW50JywKICAgICdzZWxmJywnc29tZScsJ3NvcnRieScsJ3N0YWJsZScsJ3RleHQnLCd0aGVuJywndG8nLCd0cmVhdCcsJ3R5cGVzd2l0Y2gnLCd1bmlvbicsJ3ZhcmlhYmxlJywndmVyc2lvbicsJ3doZXJlJywKICAgICd4cXVlcnknLCAnZW1wdHktc2VxdWVuY2UnXTsKICAgIGZvcih2YXIgaT0wLCBsPWJhc2ljLmxlbmd0aDsgaSA8IGw7IGkrKykgeyBrd09ialtiYXNpY1tpXV0gPSBrdyhiYXNpY1tpXSk7fTsKCiAgICAvLyBhIGxpc3Qgb2YgdHlwZXMuIEZvciBlYWNoIGFkZCBhIHByb3BlcnR5IHRvIGt3T2JqIHdpdGggdGhlIHZhbHVlIG9mCiAgICAvLyB7dHlwZTogImF0b20iLCBzdHlsZTogImF0b20ifQogICAgdmFyIHR5cGVzID0gWyd4czpzdHJpbmcnLCAneHM6ZmxvYXQnLCAneHM6ZGVjaW1hbCcsICd4czpkb3VibGUnLCAneHM6aW50ZWdlcicsICd4czpib29sZWFuJywgJ3hzOmRhdGUnLCAneHM6ZGF0ZVRpbWUnLAogICAgJ3hzOnRpbWUnLCAneHM6ZHVyYXRpb24nLCAneHM6ZGF5VGltZUR1cmF0aW9uJywgJ3hzOnRpbWUnLCAneHM6eWVhck1vbnRoRHVyYXRpb24nLCAnbnVtZXJpYycsICd4czpoZXhCaW5hcnknLAogICAgJ3hzOmJhc2U2NEJpbmFyeScsICd4czphbnlVUkknLCAneHM6UU5hbWUnLCAneHM6Ynl0ZScsJ3hzOmJvb2xlYW4nLCd4czphbnlVUkknLCd4Zjp5ZWFyTW9udGhEdXJhdGlvbiddOwogICAgZm9yKHZhciBpPTAsIGw9dHlwZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7IGt3T2JqW3R5cGVzW2ldXSA9IGF0b207fTsKCiAgICAvLyBlYWNoIG9wZXJhdG9yIHdpbGwgYWRkIGEgcHJvcGVydHkgdG8ga3dPYmogd2l0aCB2YWx1ZSBvZiB7dHlwZTogIm9wZXJhdG9yIiwgc3R5bGU6ICJrZXl3b3JkIn0KICAgIHZhciBvcGVyYXRvcnMgPSBbJ2VxJywgJ25lJywgJ2x0JywgJ2xlJywgJ2d0JywgJ2dlJywgJzo9JywgJz0nLCAnPicsICc+PScsICc8JywgJzw9JywgJy4nLCAnfCcsICc/JywgJ2FuZCcsICdvcicsICdkaXYnLCAnaWRpdicsICdtb2QnLCAnKicsICcvJywgJysnLCAnLSddOwogICAgZm9yKHZhciBpPTAsIGw9b3BlcmF0b3JzLmxlbmd0aDsgaSA8IGw7IGkrKykgeyBrd09ialtvcGVyYXRvcnNbaV1dID0gb3BlcmF0b3I7fTsKCiAgICAvLyBlYWNoIGF4aXNfc3BlY2lmaWVycyB3aWxsIGFkZCBhIHByb3BlcnR5IHRvIGt3T2JqIHdpdGggdmFsdWUgb2Yge3R5cGU6ICJheGlzX3NwZWNpZmllciIsIHN0eWxlOiAicXVhbGlmaWVyIn0KICAgIHZhciBheGlzX3NwZWNpZmllcnMgPSBbInNlbGY6OiIsICJhdHRyaWJ1dGU6OiIsICJjaGlsZDo6IiwgImRlc2NlbmRhbnQ6OiIsICJkZXNjZW5kYW50LW9yLXNlbGY6OiIsICJwYXJlbnQ6OiIsCiAgICAiYW5jZXN0b3I6OiIsICJhbmNlc3Rvci1vci1zZWxmOjoiLCAiZm9sbG93aW5nOjoiLCAicHJlY2VkaW5nOjoiLCAiZm9sbG93aW5nLXNpYmxpbmc6OiIsICJwcmVjZWRpbmctc2libGluZzo6Il07CiAgICBmb3IodmFyIGk9MCwgbD1heGlzX3NwZWNpZmllcnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7IGt3T2JqW2F4aXNfc3BlY2lmaWVyc1tpXV0gPSBxdWFsaWZpZXI7IH07CgogICAgcmV0dXJuIGt3T2JqOwogIH0oKTsKCiAgLy8gVXNlZCBhcyBzY3JhdGNoIHZhcmlhYmxlcyB0byBjb21tdW5pY2F0ZSBtdWx0aXBsZSB2YWx1ZXMgd2l0aG91dAogIC8vIGNvbnNpbmcgdXAgdG9ucyBvZiBvYmplY3RzLgogIHZhciB0eXBlLCBjb250ZW50OwoKICBmdW5jdGlvbiByZXQodHAsIHN0eWxlLCBjb250KSB7CiAgICB0eXBlID0gdHA7IGNvbnRlbnQgPSBjb250OwogICAgcmV0dXJuIHN0eWxlOwogIH0KCiAgZnVuY3Rpb24gY2hhaW4oc3RyZWFtLCBzdGF0ZSwgZikgewogICAgc3RhdGUudG9rZW5pemUgPSBmOwogICAgcmV0dXJuIGYoc3RyZWFtLCBzdGF0ZSk7CiAgfQoKICAvLyB0aGUgcHJpbWFyeSBtb2RlIHRva2VuaXplcgogIGZ1bmN0aW9uIHRva2VuQmFzZShzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpLAogICAgICAgIG1pZ2h0QmVGdW5jdGlvbiA9IGZhbHNlLAogICAgICAgIGlzRVFOYW1lID0gaXNFUU5hbWVBaGVhZChzdHJlYW0pOwoKICAgIC8vIGFuIFhNTCB0YWcgKGlmIG5vdCBpbiBzb21lIHN1YiwgY2hhaW5lZCB0b2tlbml6ZXIpCiAgICBpZiAoY2ggPT0gIjwiKSB7CiAgICAgIGlmKHN0cmVhbS5tYXRjaCgiIS0tIiwgdHJ1ZSkpCiAgICAgICAgcmV0dXJuIGNoYWluKHN0cmVhbSwgc3RhdGUsIHRva2VuWE1MQ29tbWVudCk7CgogICAgICBpZihzdHJlYW0ubWF0Y2goIiFbQ0RBVEEiLCBmYWxzZSkpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQ0RBVEE7CiAgICAgICAgcmV0dXJuIHJldCgidGFnIiwgInRhZyIpOwogICAgICB9CgogICAgICBpZihzdHJlYW0ubWF0Y2goIj8iLCBmYWxzZSkpIHsKICAgICAgICByZXR1cm4gY2hhaW4oc3RyZWFtLCBzdGF0ZSwgdG9rZW5QcmVQcm9jZXNzaW5nKTsKICAgICAgfQoKICAgICAgdmFyIGlzY2xvc2UgPSBzdHJlYW0uZWF0KCIvIik7CiAgICAgIHN0cmVhbS5lYXRTcGFjZSgpOwogICAgICB2YXIgdGFnTmFtZSA9ICIiLCBjOwogICAgICB3aGlsZSAoKGMgPSBzdHJlYW0uZWF0KC9bXlxzXHUwMGEwPTw+XCJcJ1wvP10vKSkpIHRhZ05hbWUgKz0gYzsKCiAgICAgIHJldHVybiBjaGFpbihzdHJlYW0sIHN0YXRlLCB0b2tlblRhZyh0YWdOYW1lLCBpc2Nsb3NlKSk7CiAgICB9CiAgICAvLyBzdGFydCBjb2RlIGJsb2NrCiAgICBlbHNlIGlmKGNoID09ICJ7IikgewogICAgICBwdXNoU3RhdGVTdGFjayhzdGF0ZSx7IHR5cGU6ICJjb2RlYmxvY2sifSk7CiAgICAgIHJldHVybiByZXQoIiIsIG51bGwpOwogICAgfQogICAgLy8gZW5kIGNvZGUgYmxvY2sKICAgIGVsc2UgaWYoY2ggPT0gIn0iKSB7CiAgICAgIHBvcFN0YXRlU3RhY2soc3RhdGUpOwogICAgICByZXR1cm4gcmV0KCIiLCBudWxsKTsKICAgIH0KICAgIC8vIGlmIHdlJ3JlIGluIGFuIFhNTCBibG9jawogICAgZWxzZSBpZihpc0luWG1sQmxvY2soc3RhdGUpKSB7CiAgICAgIGlmKGNoID09ICI+IikKICAgICAgICByZXR1cm4gcmV0KCJ0YWciLCAidGFnIik7CiAgICAgIGVsc2UgaWYoY2ggPT0gIi8iICYmIHN0cmVhbS5lYXQoIj4iKSkgewogICAgICAgIHBvcFN0YXRlU3RhY2soc3RhdGUpOwogICAgICAgIHJldHVybiByZXQoInRhZyIsICJ0YWciKTsKICAgICAgfQogICAgICBlbHNlCiAgICAgICAgcmV0dXJuIHJldCgid29yZCIsICJ2YXJpYWJsZSIpOwogICAgfQogICAgLy8gaWYgYSBudW1iZXIKICAgIGVsc2UgaWYgKC9cZC8udGVzdChjaCkpIHsKICAgICAgc3RyZWFtLm1hdGNoKC9eXGQqKD86XC5cZCopPyg/OkVbK1wtXT9cZCspPy8pOwogICAgICByZXR1cm4gcmV0KCJudW1iZXIiLCAiYXRvbSIpOwogICAgfQogICAgLy8gY29tbWVudCBzdGFydAogICAgZWxzZSBpZiAoY2ggPT09ICIoIiAmJiBzdHJlYW0uZWF0KCI6IikpIHsKICAgICAgcHVzaFN0YXRlU3RhY2soc3RhdGUsIHsgdHlwZTogImNvbW1lbnQifSk7CiAgICAgIHJldHVybiBjaGFpbihzdHJlYW0sIHN0YXRlLCB0b2tlbkNvbW1lbnQpOwogICAgfQogICAgLy8gcXVvdGVkIHN0cmluZwogICAgZWxzZSBpZiAoICAhaXNFUU5hbWUgJiYgKGNoID09PSAnIicgfHwgY2ggPT09ICInIikpCiAgICAgIHJldHVybiBjaGFpbihzdHJlYW0sIHN0YXRlLCB0b2tlblN0cmluZyhjaCkpOwogICAgLy8gdmFyaWFibGUKICAgIGVsc2UgaWYoY2ggPT09ICIkIikgewogICAgICByZXR1cm4gY2hhaW4oc3RyZWFtLCBzdGF0ZSwgdG9rZW5WYXJpYWJsZSk7CiAgICB9CiAgICAvLyBhc3NpZ25tZW50CiAgICBlbHNlIGlmKGNoID09PSI6IiAmJiBzdHJlYW0uZWF0KCI9IikpIHsKICAgICAgcmV0dXJuIHJldCgib3BlcmF0b3IiLCAia2V5d29yZCIpOwogICAgfQogICAgLy8gb3BlbiBwYXJlbgogICAgZWxzZSBpZihjaCA9PT0gIigiKSB7CiAgICAgIHB1c2hTdGF0ZVN0YWNrKHN0YXRlLCB7IHR5cGU6ICJwYXJlbiJ9KTsKICAgICAgcmV0dXJuIHJldCgiIiwgbnVsbCk7CiAgICB9CiAgICAvLyBjbG9zZSBwYXJlbgogICAgZWxzZSBpZihjaCA9PT0gIikiKSB7CiAgICAgIHBvcFN0YXRlU3RhY2soc3RhdGUpOwogICAgICByZXR1cm4gcmV0KCIiLCBudWxsKTsKICAgIH0KICAgIC8vIG9wZW4gcGFyZW4KICAgIGVsc2UgaWYoY2ggPT09ICJbIikgewogICAgICBwdXNoU3RhdGVTdGFjayhzdGF0ZSwgeyB0eXBlOiAiYnJhY2tldCJ9KTsKICAgICAgcmV0dXJuIHJldCgiIiwgbnVsbCk7CiAgICB9CiAgICAvLyBjbG9zZSBwYXJlbgogICAgZWxzZSBpZihjaCA9PT0gIl0iKSB7CiAgICAgIHBvcFN0YXRlU3RhY2soc3RhdGUpOwogICAgICByZXR1cm4gcmV0KCIiLCBudWxsKTsKICAgIH0KICAgIGVsc2UgewogICAgICB2YXIga25vd24gPSBrZXl3b3Jkcy5wcm9wZXJ0eUlzRW51bWVyYWJsZShjaCkgJiYga2V5d29yZHNbY2hdOwoKICAgICAgLy8gaWYgdGhlcmUncyBhIEVRTmFtZSBhaGVhZCwgY29uc3VtZSB0aGUgcmVzdCBvZiB0aGUgc3RyaW5nIHBvcnRpb24sIGl0J3MgbGlrZWx5IGEgZnVuY3Rpb24KICAgICAgaWYoaXNFUU5hbWUgJiYgY2ggPT09ICdcIicpIHdoaWxlKHN0cmVhbS5uZXh0KCkgIT09ICciJyl7fQogICAgICBpZihpc0VRTmFtZSAmJiBjaCA9PT0gJ1wnJykgd2hpbGUoc3RyZWFtLm5leHQoKSAhPT0gJ1wnJyl7fQoKICAgICAgLy8gZ29iYmxlIHVwIGEgd29yZCBpZiB0aGUgY2hhcmFjdGVyIGlzIG5vdCBrbm93bgogICAgICBpZigha25vd24pIHN0cmVhbS5lYXRXaGlsZSgvW1x3XCRfLV0vKTsKCiAgICAgIC8vIGdvYmJsZSBhIGNvbG9uIGluIHRoZSBjYXNlIHRoYXQgaXMgYSBsaWIgZnVuYyB0eXBlIGNhbGwgZm46ZG9jCiAgICAgIHZhciBmb3VuZENvbG9uID0gc3RyZWFtLmVhdCgiOiIpOwoKICAgICAgLy8gaWYgdGhlcmUncyBub3QgYSBzZWNvbmQgY29sb24sIGdvYmJsZSBhbm90aGVyIHdvcmQuIE90aGVyd2lzZSwgaXQncyBwcm9iYWJseSBhbiBheGlzIHNwZWNpZmllcgogICAgICAvLyB3aGljaCBzaG91bGQgZ2V0IG1hdGNoZWQgYXMgYSBrZXl3b3JkCiAgICAgIGlmKCFzdHJlYW0uZWF0KCI6IikgJiYgZm91bmRDb2xvbikgewogICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1x3XCRfLV0vKTsKICAgICAgfQogICAgICAvLyBpZiB0aGUgbmV4dCBub24gd2hpdGVzcGFjZSBjaGFyYWN0ZXIgaXMgYW4gb3BlbiBwYXJlbiwgdGhpcyBpcyBwcm9iYWJseSBhIGZ1bmN0aW9uIChpZiBub3QgYSBrZXl3b3JkIG9mIG90aGVyIHNvcnQpCiAgICAgIGlmKHN0cmVhbS5tYXRjaCgvXlsgXHRdKlwoLywgZmFsc2UpKSB7CiAgICAgICAgbWlnaHRCZUZ1bmN0aW9uID0gdHJ1ZTsKICAgICAgfQogICAgICAvLyBpcyB0aGUgd29yZCBhIGtleXdvcmQ/CiAgICAgIHZhciB3b3JkID0gc3RyZWFtLmN1cnJlbnQoKTsKICAgICAga25vd24gPSBrZXl3b3Jkcy5wcm9wZXJ0eUlzRW51bWVyYWJsZSh3b3JkKSAmJiBrZXl3b3Jkc1t3b3JkXTsKCiAgICAgIC8vIGlmIHdlIHRoaW5rIGl0J3MgYSBmdW5jdGlvbiBjYWxsIGJ1dCBub3QgeWV0IGtub3duLAogICAgICAvLyBzZXQgc3R5bGUgdG8gdmFyaWFibGUgZm9yIG5vdyBmb3IgbGFjayBvZiBzb21ldGhpbmcgYmV0dGVyCiAgICAgIGlmKG1pZ2h0QmVGdW5jdGlvbiAmJiAha25vd24pIGtub3duID0ge3R5cGU6ICJmdW5jdGlvbl9jYWxsIiwgc3R5bGU6ICJ2YXJpYWJsZSBkZWYifTsKCiAgICAgIC8vIGlmIHRoZSBwcmV2aW91cyB3b3JkIHdhcyBlbGVtZW50LCBhdHRyaWJ1dGUsIGF4aXMgc3BlY2lmaWVyLCB0aGlzIHdvcmQgc2hvdWxkIGJlIHRoZSBuYW1lIG9mIHRoYXQKICAgICAgaWYoaXNJblhtbENvbnN0cnVjdG9yKHN0YXRlKSkgewogICAgICAgIHBvcFN0YXRlU3RhY2soc3RhdGUpOwogICAgICAgIHJldHVybiByZXQoIndvcmQiLCAidmFyaWFibGUiLCB3b3JkKTsKICAgICAgfQogICAgICAvLyBhcyBwcmV2aW91c2x5IGNoZWNrZWQsIGlmIHRoZSB3b3JkIGlzIGVsZW1lbnQsYXR0cmlidXRlLCBheGlzIHNwZWNpZmllciwgY2FsbCBpdCBhbiAieG1sY29uc3RydWN0b3IiIGFuZAogICAgICAvLyBwdXNoIHRoZSBzdGFjayBzbyB3ZSBrbm93IHRvIGxvb2sgZm9yIGl0IG9uIHRoZSBuZXh0IHdvcmQKICAgICAgaWYod29yZCA9PSAiZWxlbWVudCIgfHwgd29yZCA9PSAiYXR0cmlidXRlIiB8fCBrbm93bi50eXBlID09ICJheGlzX3NwZWNpZmllciIpIHB1c2hTdGF0ZVN0YWNrKHN0YXRlLCB7dHlwZTogInhtbGNvbnN0cnVjdG9yIn0pOwoKICAgICAgLy8gaWYgdGhlIHdvcmQgaXMga25vd24sIHJldHVybiB0aGUgZGV0YWlscyBvZiB0aGF0IGVsc2UganVzdCBjYWxsIHRoaXMgYSBnZW5lcmljICd3b3JkJwogICAgICByZXR1cm4ga25vd24gPyByZXQoa25vd24udHlwZSwga25vd24uc3R5bGUsIHdvcmQpIDoKICAgICAgICAgICAgICAgICAgICAgcmV0KCJ3b3JkIiwgInZhcmlhYmxlIiwgd29yZCk7CiAgICB9CiAgfQoKICAvLyBoYW5kbGUgY29tbWVudHMsIGluY2x1ZGluZyBuZXN0ZWQKICBmdW5jdGlvbiB0b2tlbkNvbW1lbnQoc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIG1heWJlRW5kID0gZmFsc2UsIG1heWJlTmVzdGVkID0gZmFsc2UsIG5lc3RlZENvdW50ID0gMCwgY2g7CiAgICB3aGlsZSAoY2ggPSBzdHJlYW0ubmV4dCgpKSB7CiAgICAgIGlmIChjaCA9PSAiKSIgJiYgbWF5YmVFbmQpIHsKICAgICAgICBpZihuZXN0ZWRDb3VudCA+IDApCiAgICAgICAgICBuZXN0ZWRDb3VudC0tOwogICAgICAgIGVsc2UgewogICAgICAgICAgcG9wU3RhdGVTdGFjayhzdGF0ZSk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgZWxzZSBpZihjaCA9PSAiOiIgJiYgbWF5YmVOZXN0ZWQpIHsKICAgICAgICBuZXN0ZWRDb3VudCsrOwogICAgICB9CiAgICAgIG1heWJlRW5kID0gKGNoID09ICI6Iik7CiAgICAgIG1heWJlTmVzdGVkID0gKGNoID09ICIoIik7CiAgICB9CgogICAgcmV0dXJuIHJldCgiY29tbWVudCIsICJjb21tZW50Iik7CiAgfQoKICAvLyB0b2tlbml6ZXIgZm9yIHN0cmluZyBsaXRlcmFscwogIC8vIG9wdGlvbmFsbHkgcGFzcyBhIHRva2VuaXplciBmdW5jdGlvbiB0byBzZXQgc3RhdGUudG9rZW5pemUgYmFjayB0byB3aGVuIGZpbmlzaGVkCiAgZnVuY3Rpb24gdG9rZW5TdHJpbmcocXVvdGUsIGYpIHsKICAgIHJldHVybiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHZhciBjaDsKCiAgICAgIGlmKGlzSW5TdHJpbmcoc3RhdGUpICYmIHN0cmVhbS5jdXJyZW50KCkgPT0gcXVvdGUpIHsKICAgICAgICBwb3BTdGF0ZVN0YWNrKHN0YXRlKTsKICAgICAgICBpZihmKSBzdGF0ZS50b2tlbml6ZSA9IGY7CiAgICAgICAgcmV0dXJuIHJldCgic3RyaW5nIiwgInN0cmluZyIpOwogICAgICB9CgogICAgICBwdXNoU3RhdGVTdGFjayhzdGF0ZSwgeyB0eXBlOiAic3RyaW5nIiwgbmFtZTogcXVvdGUsIHRva2VuaXplOiB0b2tlblN0cmluZyhxdW90ZSwgZikgfSk7CgogICAgICAvLyBpZiB3ZSdyZSBpbiBhIHN0cmluZyBhbmQgaW4gYW4gWE1MIGJsb2NrLCBhbGxvdyBhbiBlbWJlZGRlZCBjb2RlIGJsb2NrCiAgICAgIGlmKHN0cmVhbS5tYXRjaCgieyIsIGZhbHNlKSAmJiBpc0luWG1sQXR0cmlidXRlQmxvY2soc3RhdGUpKSB7CiAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICAgICAgcmV0dXJuIHJldCgic3RyaW5nIiwgInN0cmluZyIpOwogICAgICB9CgoKICAgICAgd2hpbGUgKGNoID0gc3RyZWFtLm5leHQoKSkgewogICAgICAgIGlmIChjaCA9PSAgcXVvdGUpIHsKICAgICAgICAgIHBvcFN0YXRlU3RhY2soc3RhdGUpOwogICAgICAgICAgaWYoZikgc3RhdGUudG9rZW5pemUgPSBmOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgLy8gaWYgd2UncmUgaW4gYSBzdHJpbmcgYW5kIGluIGFuIFhNTCBibG9jaywgYWxsb3cgYW4gZW1iZWRkZWQgY29kZSBibG9jayBpbiBhbiBhdHRyaWJ1dGUKICAgICAgICAgIGlmKHN0cmVhbS5tYXRjaCgieyIsIGZhbHNlKSAmJiBpc0luWG1sQXR0cmlidXRlQmxvY2soc3RhdGUpKSB7CiAgICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlOwogICAgICAgICAgICByZXR1cm4gcmV0KCJzdHJpbmciLCAic3RyaW5nIik7CiAgICAgICAgICB9CgogICAgICAgIH0KICAgICAgfQoKICAgICAgcmV0dXJuIHJldCgic3RyaW5nIiwgInN0cmluZyIpOwogICAgfTsKICB9CgogIC8vIHRva2VuaXplciBmb3IgdmFyaWFibGVzCiAgZnVuY3Rpb24gdG9rZW5WYXJpYWJsZShzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgaXNWYXJpYWJsZUNoYXIgPSAvW1x3XCRfLV0vOwoKICAgIC8vIGEgdmFyaWFibGUgbWF5IHN0YXJ0IHdpdGggYSBxdW90ZWQgRVFOYW1lIHNvIGlmIHRoZSBuZXh0IGNoYXJhY3RlciBpcyBxdW90ZSwgY29uc3VtZSB0byB0aGUgbmV4dCBxdW90ZQogICAgaWYoc3RyZWFtLmVhdCgiXCIiKSkgewogICAgICB3aGlsZShzdHJlYW0ubmV4dCgpICE9PSAnXCInKXt9OwogICAgICBzdHJlYW0uZWF0KCI6Iik7CiAgICB9IGVsc2UgewogICAgICBzdHJlYW0uZWF0V2hpbGUoaXNWYXJpYWJsZUNoYXIpOwogICAgICBpZighc3RyZWFtLm1hdGNoKCI6PSIsIGZhbHNlKSkgc3RyZWFtLmVhdCgiOiIpOwogICAgfQogICAgc3RyZWFtLmVhdFdoaWxlKGlzVmFyaWFibGVDaGFyKTsKICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlOwogICAgcmV0dXJuIHJldCgidmFyaWFibGUiLCAidmFyaWFibGUiKTsKICB9CgogIC8vIHRva2VuaXplciBmb3IgWE1MIHRhZ3MKICBmdW5jdGlvbiB0b2tlblRhZyhuYW1lLCBpc2Nsb3NlKSB7CiAgICByZXR1cm4gZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICBzdHJlYW0uZWF0U3BhY2UoKTsKICAgICAgaWYoaXNjbG9zZSAmJiBzdHJlYW0uZWF0KCI+IikpIHsKICAgICAgICBwb3BTdGF0ZVN0YWNrKHN0YXRlKTsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTsKICAgICAgICByZXR1cm4gcmV0KCJ0YWciLCAidGFnIik7CiAgICAgIH0KICAgICAgLy8gc2VsZiBjbG9zaW5nIHRhZyB3aXRob3V0IGF0dHJpYnV0ZXM/CiAgICAgIGlmKCFzdHJlYW0uZWF0KCIvIikpCiAgICAgICAgcHVzaFN0YXRlU3RhY2soc3RhdGUsIHsgdHlwZTogInRhZyIsIG5hbWU6IG5hbWUsIHRva2VuaXplOiB0b2tlbkJhc2V9KTsKICAgICAgaWYoIXN0cmVhbS5lYXQoIj4iKSkgewogICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5BdHRyaWJ1dGU7CiAgICAgICAgcmV0dXJuIHJldCgidGFnIiwgInRhZyIpOwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlOwogICAgICB9CiAgICAgIHJldHVybiByZXQoInRhZyIsICJ0YWciKTsKICAgIH07CiAgfQoKICAvLyB0b2tlbml6ZXIgZm9yIFhNTCBhdHRyaWJ1dGVzCiAgZnVuY3Rpb24gdG9rZW5BdHRyaWJ1dGUoc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIGNoID0gc3RyZWFtLm5leHQoKTsKCiAgICBpZihjaCA9PSAiLyIgJiYgc3RyZWFtLmVhdCgiPiIpKSB7CiAgICAgIGlmKGlzSW5YbWxBdHRyaWJ1dGVCbG9jayhzdGF0ZSkpIHBvcFN0YXRlU3RhY2soc3RhdGUpOwogICAgICBpZihpc0luWG1sQmxvY2soc3RhdGUpKSBwb3BTdGF0ZVN0YWNrKHN0YXRlKTsKICAgICAgcmV0dXJuIHJldCgidGFnIiwgInRhZyIpOwogICAgfQogICAgaWYoY2ggPT0gIj4iKSB7CiAgICAgIGlmKGlzSW5YbWxBdHRyaWJ1dGVCbG9jayhzdGF0ZSkpIHBvcFN0YXRlU3RhY2soc3RhdGUpOwogICAgICByZXR1cm4gcmV0KCJ0YWciLCAidGFnIik7CiAgICB9CiAgICBpZihjaCA9PSAiPSIpCiAgICAgIHJldHVybiByZXQoIiIsIG51bGwpOwogICAgLy8gcXVvdGVkIHN0cmluZwogICAgaWYgKGNoID09ICciJyB8fCBjaCA9PSAiJyIpCiAgICAgIHJldHVybiBjaGFpbihzdHJlYW0sIHN0YXRlLCB0b2tlblN0cmluZyhjaCwgdG9rZW5BdHRyaWJ1dGUpKTsKCiAgICBpZighaXNJblhtbEF0dHJpYnV0ZUJsb2NrKHN0YXRlKSkKICAgICAgcHVzaFN0YXRlU3RhY2soc3RhdGUsIHsgdHlwZTogImF0dHJpYnV0ZSIsIHRva2VuaXplOiB0b2tlbkF0dHJpYnV0ZX0pOwoKICAgIHN0cmVhbS5lYXQoL1thLXpBLVpfOl0vKTsKICAgIHN0cmVhbS5lYXRXaGlsZSgvWy1hLXpBLVowLTlfOi5dLyk7CiAgICBzdHJlYW0uZWF0U3BhY2UoKTsKCiAgICAvLyB0aGUgY2FzZSB3aGVyZSB0aGUgYXR0cmlidXRlIGhhcyBub3QgdmFsdWUgYW5kIHRoZSB0YWcgd2FzIGNsb3NlZAogICAgaWYoc3RyZWFtLm1hdGNoKCI+IiwgZmFsc2UpIHx8IHN0cmVhbS5tYXRjaCgiLyIsIGZhbHNlKSkgewogICAgICBwb3BTdGF0ZVN0YWNrKHN0YXRlKTsKICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICB9CgogICAgcmV0dXJuIHJldCgiYXR0cmlidXRlIiwgImF0dHJpYnV0ZSIpOwogIH0KCiAgLy8gaGFuZGxlIGNvbW1lbnRzLCBpbmNsdWRpbmcgbmVzdGVkCiAgZnVuY3Rpb24gdG9rZW5YTUxDb21tZW50KHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBjaDsKICAgIHdoaWxlIChjaCA9IHN0cmVhbS5uZXh0KCkpIHsKICAgICAgaWYgKGNoID09ICItIiAmJiBzdHJlYW0ubWF0Y2goIi0+IiwgdHJ1ZSkpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTsKICAgICAgICByZXR1cm4gcmV0KCJjb21tZW50IiwgImNvbW1lbnQiKTsKICAgICAgfQogICAgfQogIH0KCgogIC8vIGhhbmRsZSBDREFUQQogIGZ1bmN0aW9uIHRva2VuQ0RBVEEoc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIGNoOwogICAgd2hpbGUgKGNoID0gc3RyZWFtLm5leHQoKSkgewogICAgICBpZiAoY2ggPT0gIl0iICYmIHN0cmVhbS5tYXRjaCgiXSIsIHRydWUpKSB7CiAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICAgICAgcmV0dXJuIHJldCgiY29tbWVudCIsICJjb21tZW50Iik7CiAgICAgIH0KICAgIH0KICB9CgogIC8vIGhhbmRsZSBwcmVwcm9jZXNzaW5nIGluc3RydWN0aW9ucwogIGZ1bmN0aW9uIHRva2VuUHJlUHJvY2Vzc2luZyhzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgY2g7CiAgICB3aGlsZSAoY2ggPSBzdHJlYW0ubmV4dCgpKSB7CiAgICAgIGlmIChjaCA9PSAiPyIgJiYgc3RyZWFtLm1hdGNoKCI+IiwgdHJ1ZSkpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTsKICAgICAgICByZXR1cm4gcmV0KCJjb21tZW50IiwgImNvbW1lbnQgbWV0YSIpOwogICAgICB9CiAgICB9CiAgfQoKCiAgLy8gZnVuY3Rpb25zIHRvIHRlc3QgdGhlIGN1cnJlbnQgY29udGV4dCBvZiB0aGUgc3RhdGUKICBmdW5jdGlvbiBpc0luWG1sQmxvY2soc3RhdGUpIHsgcmV0dXJuIGlzSW4oc3RhdGUsICJ0YWciKTsgfQogIGZ1bmN0aW9uIGlzSW5YbWxBdHRyaWJ1dGVCbG9jayhzdGF0ZSkgeyByZXR1cm4gaXNJbihzdGF0ZSwgImF0dHJpYnV0ZSIpOyB9CiAgZnVuY3Rpb24gaXNJblhtbENvbnN0cnVjdG9yKHN0YXRlKSB7IHJldHVybiBpc0luKHN0YXRlLCAieG1sY29uc3RydWN0b3IiKTsgfQogIGZ1bmN0aW9uIGlzSW5TdHJpbmcoc3RhdGUpIHsgcmV0dXJuIGlzSW4oc3RhdGUsICJzdHJpbmciKTsgfQoKICBmdW5jdGlvbiBpc0VRTmFtZUFoZWFkKHN0cmVhbSkgewogICAgLy8gYXNzdW1lIHdlJ3ZlIGFscmVhZHkgZWF0ZW4gYSBxdW90ZSAoIikKICAgIGlmKHN0cmVhbS5jdXJyZW50KCkgPT09ICciJykKICAgICAgcmV0dXJuIHN0cmVhbS5tYXRjaCgvXlteXCJdK1wiXDovLCBmYWxzZSk7CiAgICBlbHNlIGlmKHN0cmVhbS5jdXJyZW50KCkgPT09ICdcJycpCiAgICAgIHJldHVybiBzdHJlYW0ubWF0Y2goL15bXlwiXStcJ1w6LywgZmFsc2UpOwogICAgZWxzZQogICAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBmdW5jdGlvbiBpc0luKHN0YXRlLCB0eXBlKSB7CiAgICByZXR1cm4gKHN0YXRlLnN0YWNrLmxlbmd0aCAmJiBzdGF0ZS5zdGFja1tzdGF0ZS5zdGFjay5sZW5ndGggLSAxXS50eXBlID09IHR5cGUpOwogIH0KCiAgZnVuY3Rpb24gcHVzaFN0YXRlU3RhY2soc3RhdGUsIG5ld1N0YXRlKSB7CiAgICBzdGF0ZS5zdGFjay5wdXNoKG5ld1N0YXRlKTsKICB9CgogIGZ1bmN0aW9uIHBvcFN0YXRlU3RhY2soc3RhdGUpIHsKICAgIHN0YXRlLnN0YWNrLnBvcCgpOwogICAgdmFyIHJlaW5zdGF0ZVRva2VuaXplID0gc3RhdGUuc3RhY2subGVuZ3RoICYmIHN0YXRlLnN0YWNrW3N0YXRlLnN0YWNrLmxlbmd0aC0xXS50b2tlbml6ZTsKICAgIHN0YXRlLnRva2VuaXplID0gcmVpbnN0YXRlVG9rZW5pemUgfHwgdG9rZW5CYXNlOwogIH0KCiAgLy8gdGhlIGludGVyZmFjZSBmb3IgdGhlIG1vZGUgQVBJCiAgcmV0dXJuIHsKICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gewogICAgICAgIHRva2VuaXplOiB0b2tlbkJhc2UsCiAgICAgICAgY2M6IFtdLAogICAgICAgIHN0YWNrOiBbXQogICAgICB9OwogICAgfSwKCiAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICBpZiAoc3RyZWFtLmVhdFNwYWNlKCkpIHJldHVybiBudWxsOwogICAgICB2YXIgc3R5bGUgPSBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgICAgcmV0dXJuIHN0eWxlOwogICAgfSwKCiAgICBibG9ja0NvbW1lbnRTdGFydDogIig6IiwKICAgIGJsb2NrQ29tbWVudEVuZDogIjopIgoKICB9OwoKfSk7CgpDb2RlTWlycm9yLmRlZmluZU1JTUUoImFwcGxpY2F0aW9uL3hxdWVyeSIsICJ4cXVlcnkiKTsKCn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/yaml/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/yaml/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogWUFNTCBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9InlhbWwuanMiPjwvc2NyaXB0Pgo8c3R5bGU+LkNvZGVNaXJyb3IgeyBib3JkZXItdG9wOiAxcHggc29saWQgI2RkZDsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkZGQ7IH08L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5ZQU1MPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5ZQU1MIG1vZGU8L2gyPgo8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgotLS0gIyBGYXZvcml0ZSBtb3ZpZXMKLSBDYXNhYmxhbmNhCi0gTm9ydGggYnkgTm9ydGh3ZXN0Ci0gVGhlIE1hbiBXaG8gV2Fzbid0IFRoZXJlCi0tLSAjIFNob3BwaW5nIGxpc3QKW21pbGssIHB1bXBraW4gcGllLCBlZ2dzLCBqdWljZV0KLS0tICMgSW5kZW50ZWQgQmxvY2tzLCBjb21tb24gaW4gWUFNTCBkYXRhIGZpbGVzLCB1c2UgaW5kZW50YXRpb24gYW5kIG5ldyBsaW5lcyB0byBzZXBhcmF0ZSB0aGUga2V5OiB2YWx1ZSBwYWlycwogIG5hbWU6IEpvaG4gU21pdGgKICBhZ2U6IDMzCi0tLSAjIElubGluZSBCbG9ja3MsIGNvbW1vbiBpbiBZQU1MIGRhdGEgc3RyZWFtcywgdXNlIGNvbW1hcyB0byBzZXBhcmF0ZSB0aGUga2V5OiB2YWx1ZSBwYWlycyBiZXR3ZWVuIGJyYWNlcwp7bmFtZTogSm9obiBTbWl0aCwgYWdlOiAzM30KLS0tCnJlY2VpcHQ6ICAgICBPei1XYXJlIFB1cmNoYXNlIEludm9pY2UKZGF0ZTogICAgICAgIDIwMDctMDgtMDYKY3VzdG9tZXI6CiAgICBnaXZlbjogICBEb3JvdGh5CiAgICBmYW1pbHk6ICBHYWxlCgppdGVtczoKICAgIC0gcGFydF9ubzogICBBNDc4NgogICAgICBkZXNjcmlwOiAgIFdhdGVyIEJ1Y2tldCAoRmlsbGVkKQogICAgICBwcmljZTogICAgIDEuNDcKICAgICAgcXVhbnRpdHk6ICA0CgogICAgLSBwYXJ0X25vOiAgIEUxNjI4CiAgICAgIGRlc2NyaXA6ICAgSGlnaCBIZWVsZWQgIlJ1YnkiIFNsaXBwZXJzCiAgICAgIHNpemU6ICAgICAgIDgKICAgICAgcHJpY2U6ICAgICAxMDAuMjcKICAgICAgcXVhbnRpdHk6ICAxCgpiaWxsLXRvOiAgJmlkMDAxCiAgICBzdHJlZXQ6IHwKICAgICAgICAgICAgMTIzIFRvcm5hZG8gQWxsZXkKICAgICAgICAgICAgU3VpdGUgMTYKICAgIGNpdHk6ICAgRWFzdCBDZW50ZXJ2aWxsZQogICAgc3RhdGU6ICBLUwoKc2hpcC10bzogICppZDAwMQoKc3BlY2lhbERlbGl2ZXJ5OiAgPgogICAgRm9sbG93IHRoZSBZZWxsb3cgQnJpY2sKICAgIFJvYWQgdG8gdGhlIEVtZXJhbGQgQ2l0eS4KICAgIFBheSBubyBhdHRlbnRpb24gdG8gdGhlCiAgICBtYW4gYmVoaW5kIHRoZSBjdXJ0YWluLgouLi4KPC90ZXh0YXJlYT48L2Zvcm0+CiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwge30pOwogICAgPC9zY3JpcHQ+CgogICAgPHA+PHN0cm9uZz5NSU1FIHR5cGVzIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPnRleHQveC15YW1sPC9jb2RlPi48L3A+CgogIDwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/yaml/yaml.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJ5YW1sIiwgZnVuY3Rpb24oKSB7CgogIHZhciBjb25zID0gWyd0cnVlJywgJ2ZhbHNlJywgJ29uJywgJ29mZicsICd5ZXMnLCAnbm8nXTsKICB2YXIga2V5d29yZFJlZ2V4ID0gbmV3IFJlZ0V4cCgiXFxiKCgiK2NvbnMuam9pbigiKXwoIikrIikpJCIsICdpJyk7CgogIHJldHVybiB7CiAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICB2YXIgY2ggPSBzdHJlYW0ucGVlaygpOwogICAgICB2YXIgZXNjID0gc3RhdGUuZXNjYXBlZDsKICAgICAgc3RhdGUuZXNjYXBlZCA9IGZhbHNlOwogICAgICAvKiBjb21tZW50cyAqLwogICAgICBpZiAoY2ggPT0gIiMiICYmIChzdHJlYW0ucG9zID09IDAgfHwgL1xzLy50ZXN0KHN0cmVhbS5zdHJpbmcuY2hhckF0KHN0cmVhbS5wb3MgLSAxKSkpKSB7CiAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOyByZXR1cm4gImNvbW1lbnQiOwogICAgICB9CiAgICAgIGlmIChzdGF0ZS5saXRlcmFsICYmIHN0cmVhbS5pbmRlbnRhdGlvbigpID4gc3RhdGUua2V5Q29sKSB7CiAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOyByZXR1cm4gInN0cmluZyI7CiAgICAgIH0gZWxzZSBpZiAoc3RhdGUubGl0ZXJhbCkgeyBzdGF0ZS5saXRlcmFsID0gZmFsc2U7IH0KICAgICAgaWYgKHN0cmVhbS5zb2woKSkgewogICAgICAgIHN0YXRlLmtleUNvbCA9IDA7CiAgICAgICAgc3RhdGUucGFpciA9IGZhbHNlOwogICAgICAgIHN0YXRlLnBhaXJTdGFydCA9IGZhbHNlOwogICAgICAgIC8qIGRvY3VtZW50IHN0YXJ0ICovCiAgICAgICAgaWYoc3RyZWFtLm1hdGNoKC8tLS0vKSkgeyByZXR1cm4gImRlZiI7IH0KICAgICAgICAvKiBkb2N1bWVudCBlbmQgKi8KICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKC9cLlwuXC4vKSkgeyByZXR1cm4gImRlZiI7IH0KICAgICAgICAvKiBhcnJheSBsaXN0IGl0ZW0gKi8KICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKC9ccyotXHMrLykpIHsgcmV0dXJuICdtZXRhJzsgfQogICAgICB9CiAgICAgIC8qIGlubGluZSBwYWlycy9saXN0cyAqLwogICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eKFx7fFx9fFxbfFxdKS8pKSB7CiAgICAgICAgaWYgKGNoID09ICd7JykKICAgICAgICAgIHN0YXRlLmlubGluZVBhaXJzKys7CiAgICAgICAgZWxzZSBpZiAoY2ggPT0gJ30nKQogICAgICAgICAgc3RhdGUuaW5saW5lUGFpcnMtLTsKICAgICAgICBlbHNlIGlmIChjaCA9PSAnWycpCiAgICAgICAgICBzdGF0ZS5pbmxpbmVMaXN0Kys7CiAgICAgICAgZWxzZQogICAgICAgICAgc3RhdGUuaW5saW5lTGlzdC0tOwogICAgICAgIHJldHVybiAnbWV0YSc7CiAgICAgIH0KCiAgICAgIC8qIGxpc3Qgc2VwZXJhdG9yICovCiAgICAgIGlmIChzdGF0ZS5pbmxpbmVMaXN0ID4gMCAmJiAhZXNjICYmIGNoID09ICcsJykgewogICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgcmV0dXJuICdtZXRhJzsKICAgICAgfQogICAgICAvKiBwYWlycyBzZXBlcmF0b3IgKi8KICAgICAgaWYgKHN0YXRlLmlubGluZVBhaXJzID4gMCAmJiAhZXNjICYmIGNoID09ICcsJykgewogICAgICAgIHN0YXRlLmtleUNvbCA9IDA7CiAgICAgICAgc3RhdGUucGFpciA9IGZhbHNlOwogICAgICAgIHN0YXRlLnBhaXJTdGFydCA9IGZhbHNlOwogICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgcmV0dXJuICdtZXRhJzsKICAgICAgfQoKICAgICAgLyogc3RhcnQgb2YgdmFsdWUgb2YgYSBwYWlyICovCiAgICAgIGlmIChzdGF0ZS5wYWlyU3RhcnQpIHsKICAgICAgICAvKiBibG9jayBsaXRlcmFscyAqLwogICAgICAgIGlmIChzdHJlYW0ubWF0Y2goL15ccyooXHx8XD4pXHMqLykpIHsgc3RhdGUubGl0ZXJhbCA9IHRydWU7IHJldHVybiAnbWV0YSc7IH07CiAgICAgICAgLyogcmVmZXJlbmNlcyAqLwogICAgICAgIGlmIChzdHJlYW0ubWF0Y2goL15ccyooXCZ8XCopW2EtejAtOVwuXy1dK1xiL2kpKSB7IHJldHVybiAndmFyaWFibGUtMic7IH0KICAgICAgICAvKiBudW1iZXJzICovCiAgICAgICAgaWYgKHN0YXRlLmlubGluZVBhaXJzID09IDAgJiYgc3RyZWFtLm1hdGNoKC9eXHMqLT9bMC05XC5cLF0rXHM/JC8pKSB7IHJldHVybiAnbnVtYmVyJzsgfQogICAgICAgIGlmIChzdGF0ZS5pbmxpbmVQYWlycyA+IDAgJiYgc3RyZWFtLm1hdGNoKC9eXHMqLT9bMC05XC5cLF0rXHM/KD89KCx8fSkpLykpIHsgcmV0dXJuICdudW1iZXInOyB9CiAgICAgICAgLyoga2V5d29yZHMgKi8KICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKGtleXdvcmRSZWdleCkpIHsgcmV0dXJuICdrZXl3b3JkJzsgfQogICAgICB9CgogICAgICAvKiBwYWlycyAoYXNzb2NpYXRpdmUgYXJyYXlzKSAtPiBrZXkgKi8KICAgICAgaWYgKCFzdGF0ZS5wYWlyICYmIHN0cmVhbS5tYXRjaCgvXlxzKig/OlssXFtcXXt9JiohfD4nIiVAYF1bXlxzJyI6XXxbXixcW1xde30jJiohfD4nIiVAYF0pW14jXSo/KD89XHMqOigkfFxzKSkvKSkgewogICAgICAgIHN0YXRlLnBhaXIgPSB0cnVlOwogICAgICAgIHN0YXRlLmtleUNvbCA9IHN0cmVhbS5pbmRlbnRhdGlvbigpOwogICAgICAgIHJldHVybiAiYXRvbSI7CiAgICAgIH0KICAgICAgaWYgKHN0YXRlLnBhaXIgJiYgc3RyZWFtLm1hdGNoKC9eOlxzKi8pKSB7IHN0YXRlLnBhaXJTdGFydCA9IHRydWU7IHJldHVybiAnbWV0YSc7IH0KCiAgICAgIC8qIG5vdGhpbmcgZm91bmQsIGNvbnRpbnVlICovCiAgICAgIHN0YXRlLnBhaXJTdGFydCA9IGZhbHNlOwogICAgICBzdGF0ZS5lc2NhcGVkID0gKGNoID09ICdcXCcpOwogICAgICBzdHJlYW0ubmV4dCgpOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0sCiAgICBzdGFydFN0YXRlOiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBwYWlyOiBmYWxzZSwKICAgICAgICBwYWlyU3RhcnQ6IGZhbHNlLAogICAgICAgIGtleUNvbDogMCwKICAgICAgICBpbmxpbmVQYWlyczogMCwKICAgICAgICBpbmxpbmVMaXN0OiAwLAogICAgICAgIGxpdGVyYWw6IGZhbHNlLAogICAgICAgIGVzY2FwZWQ6IGZhbHNlCiAgICAgIH07CiAgICB9CiAgfTsKfSk7CgpDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveC15YW1sIiwgInlhbWwiKTsKCn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/z80/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/z80/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogWjgwIGFzc2VtYmx5IG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iejgwLmpzIj48L3NjcmlwdD4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4uQ29kZU1pcnJvciB7Ym9yZGVyLXRvcDogMXB4IHNvbGlkIGJsYWNrOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGltZyBpZD1sb2dvIHNyYz0iLi4vLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpam5oL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+TGFuZ3VhZ2UgbW9kZXM8L2E+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPlo4MCBhc3NlbWJseTwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+WjgwIGFzc2VtYmx5IG1vZGU8L2gyPgoKCjxkaXY+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KI2luY2x1ZGUgICAgInRpODNwbHVzLmluYyIKI2RlZmluZSAgICAgcHJvZ1N0YXJ0ICAgJDlEOTUKLm9yZyAgICAgICAgcHJvZ1N0YXJ0LTIKLmRiICAgICAgICAgJEJCLCQ2RAogICAgYmNhbGwoX0NsckxDREZ1bGwpCiAgICBsZCAgSEwsIDAKICAgIGxkICAoUGVuQ29sKSwgICBITAogICAgbGQgIEhMLCBNZXNzYWdlCiAgICBiY2FsbChfUHV0UykgOyBEaXNwbGF5cyB0aGUgc3RyaW5nCiAgICBiY2FsbChfTmV3TGluZSkKICAgIHJldApNZXNzYWdlOgouZGIgICAgICAgICAiSGVsbG8gd29ybGQhIiwwCjwvdGV4dGFyZWE+PC9kaXY+CgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZQogICAgICB9KTsKICAgIDwvc2NyaXB0PgoKICAgIDxwPjxzdHJvbmc+TUlNRSB0eXBlIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPnRleHQveC16ODA8L2NvZGU+LjwvcD4KICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/mode/z80/z80.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCd6ODAnLCBmdW5jdGlvbigpIHsKICB2YXIga2V5d29yZHMxID0gL14oZXh4P3wobGR8Y3B8aW4pKFtkaV1yPyk/fHBvcHxwdXNofGFkW2NkXXxjcGx8ZGFhfGRlY3xpbmN8bmVnfHNiY3xzdWJ8YW5kfGJpdHxbY3NdY2Z8eD9vcnxyZXN8c2V0fHJbbHJdYz9hP3xyW2xyXWR8c1tscl1hfHNybHxkam56fG5vcHxyc3R8W2RlXWl8aGFsdHxpbXxvdFtkaV1yfG91dFtkaV0/KVxiL2k7CiAgdmFyIGtleXdvcmRzMiA9IC9eKGNhbGx8altwcl18cmV0W2luXT8pXGIvaTsKICB2YXIga2V5d29yZHMzID0gL15iXz8oY2FsbHxqdW1wKVxiL2k7CiAgdmFyIHZhcmlhYmxlczEgPSAvXihhZj98YmM/fGN8ZGU/fGV8aGw/fGx8aVt4eV0/fHJ8c3ApXGIvaTsKICB2YXIgdmFyaWFibGVzMiA9IC9eKG4/W3pjXXxwW29lXT98bSlcYi9pOwogIHZhciBlcnJvcnMgPSAvXihbaGxdW3h5XXxpW3h5XVtobF18c2xpYXxzbGwpXGIvaTsKICB2YXIgbnVtYmVycyA9IC9eKFtcZGEtZl0raHxbMC03XStvfFswMV0rYnxcZCspXGIvaTsKCiAgcmV0dXJuIHsKICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4ge2NvbnRleHQ6IDB9OwogICAgfSwKICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIGlmICghc3RyZWFtLmNvbHVtbigpKQogICAgICAgIHN0YXRlLmNvbnRleHQgPSAwOwoKICAgICAgaWYgKHN0cmVhbS5lYXRTcGFjZSgpKQogICAgICAgIHJldHVybiBudWxsOwoKICAgICAgdmFyIHc7CgogICAgICBpZiAoc3RyZWFtLmVhdFdoaWxlKC9cdy8pKSB7CiAgICAgICAgdyA9IHN0cmVhbS5jdXJyZW50KCk7CgogICAgICAgIGlmIChzdHJlYW0uaW5kZW50YXRpb24oKSkgewogICAgICAgICAgaWYgKHN0YXRlLmNvbnRleHQgPT0gMSAmJiB2YXJpYWJsZXMxLnRlc3QodykpCiAgICAgICAgICAgIHJldHVybiAndmFyaWFibGUtMic7CgogICAgICAgICAgaWYgKHN0YXRlLmNvbnRleHQgPT0gMiAmJiB2YXJpYWJsZXMyLnRlc3QodykpCiAgICAgICAgICAgIHJldHVybiAndmFyaWFibGUtMyc7CgogICAgICAgICAgaWYgKGtleXdvcmRzMS50ZXN0KHcpKSB7CiAgICAgICAgICAgIHN0YXRlLmNvbnRleHQgPSAxOwogICAgICAgICAgICByZXR1cm4gJ2tleXdvcmQnOwogICAgICAgICAgfSBlbHNlIGlmIChrZXl3b3JkczIudGVzdCh3KSkgewogICAgICAgICAgICBzdGF0ZS5jb250ZXh0ID0gMjsKICAgICAgICAgICAgcmV0dXJuICdrZXl3b3JkJzsKICAgICAgICAgIH0gZWxzZSBpZiAoa2V5d29yZHMzLnRlc3QodykpIHsKICAgICAgICAgICAgc3RhdGUuY29udGV4dCA9IDM7CiAgICAgICAgICAgIHJldHVybiAna2V5d29yZCc7CiAgICAgICAgICB9CgogICAgICAgICAgaWYgKGVycm9ycy50ZXN0KHcpKQogICAgICAgICAgICByZXR1cm4gJ2Vycm9yJzsKICAgICAgICB9IGVsc2UgaWYgKG51bWJlcnMudGVzdCh3KSkgewogICAgICAgICAgcmV0dXJuICdudW1iZXInOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLmVhdCgnOycpKSB7CiAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICAgIHJldHVybiAnY29tbWVudCc7CiAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLmVhdCgnIicpKSB7CiAgICAgICAgd2hpbGUgKHcgPSBzdHJlYW0ubmV4dCgpKSB7CiAgICAgICAgICBpZiAodyA9PSAnIicpCiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgIGlmICh3ID09ICdcXCcpCiAgICAgICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAnc3RyaW5nJzsKICAgICAgfSBlbHNlIGlmIChzdHJlYW0uZWF0KCdcJycpKSB7CiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXFw/LicvKSkKICAgICAgICAgIHJldHVybiAnbnVtYmVyJzsKICAgICAgfSBlbHNlIGlmIChzdHJlYW0uZWF0KCcuJykgfHwgc3RyZWFtLnNvbCgpICYmIHN0cmVhbS5lYXQoJyMnKSkgewogICAgICAgIHN0YXRlLmNvbnRleHQgPSA0OwoKICAgICAgICBpZiAoc3RyZWFtLmVhdFdoaWxlKC9cdy8pKQogICAgICAgICAgcmV0dXJuICdkZWYnOwogICAgICB9IGVsc2UgaWYgKHN0cmVhbS5lYXQoJyQnKSkgewogICAgICAgIGlmIChzdHJlYW0uZWF0V2hpbGUoL1tcZGEtZl0vaSkpCiAgICAgICAgICByZXR1cm4gJ251bWJlcic7CiAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLmVhdCgnJScpKSB7CiAgICAgICAgaWYgKHN0cmVhbS5lYXRXaGlsZSgvWzAxXS8pKQogICAgICAgICAgcmV0dXJuICdudW1iZXInOwogICAgICB9IGVsc2UgewogICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgIH0KICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfTsKfSk7CgpDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveC16ODAiLCAiejgwIik7Cgp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/package.json</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ewogICAgIm5hbWUiOiAiY29kZW1pcnJvciIsCiAgICAidmVyc2lvbiI6IjQuNC4wIiwKICAgICJtYWluIjogImxpYi9jb2RlbWlycm9yLmpzIiwKICAgICJkZXNjcmlwdGlvbiI6ICJJbi1icm93c2VyIGNvZGUgZWRpdGluZyBtYWRlIGJlYXJhYmxlIiwKICAgICJsaWNlbnNlcyI6IFt7InR5cGUiOiAiTUlUIiwKICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwOi8vY29kZW1pcnJvci5uZXQvTElDRU5TRSJ9XSwKICAgICJkaXJlY3RvcmllcyI6IHsibGliIjogIi4vbGliIn0sCiAgICAic2NyaXB0cyI6IHsidGVzdCI6ICJub2RlIC4vdGVzdC9ydW4uanMifSwKICAgICJkZXZEZXBlbmRlbmNpZXMiOiB7Im5vZGUtc3RhdGljIjogIjAuNi4wIiwKICAgICAgICAgICAgICAgICAgICAgICAgInBoYW50b21qcyI6ICIxLjkuMi01In0sCiAgICAiYnVncyI6ICJodHRwOi8vZ2l0aHViLmNvbS9tYXJpam5oL0NvZGVNaXJyb3IvaXNzdWVzIiwKICAgICJrZXl3b3JkcyI6IFsiSmF2YVNjcmlwdCIsICJDb2RlTWlycm9yIiwgIkVkaXRvciJdLAogICAgImhvbWVwYWdlIjogImh0dHA6Ly9jb2RlbWlycm9yLm5ldCIsCiAgICAibWFpbnRhaW5lcnMiOlt7Im5hbWUiOiAiTWFyaWpuIEhhdmVyYmVrZSIsCiAgICAgICAgICAgICAgICAgICAgImVtYWlsIjogIm1hcmlqbmhAZ21haWwuY29tIiwKICAgICAgICAgICAgICAgICAgICAid2ViIjogImh0dHA6Ly9tYXJpam5oYXZlcmJla2UubmwifV0sCiAgICAicmVwb3NpdG9yeSI6IHsidHlwZSI6ICJnaXQiLAogICAgICAgICAgICAgICAgICAgInVybCI6ICJodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9Db2RlTWlycm9yLmdpdCJ9Cn0K]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/README.md</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[IyBDb2RlTWlycm9yClshW0J1aWxkIFN0YXR1c10oaHR0cHM6Ly90cmF2aXMtY2kub3JnL21hcmlqbmgvQ29kZU1pcnJvci5zdmcpXShodHRwczovL3RyYXZpcy1jaS5vcmcvbWFyaWpuaC9Db2RlTWlycm9yKQpbIVtOUE0gdmVyc2lvbl0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9ucG0vdi9jb2RlbWlycm9yLnN2ZyldKGh0dHBzOi8vd3d3Lm5wbWpzLm9yZy9wYWNrYWdlL2NvZGVtaXJyb3IpCgpDb2RlTWlycm9yIGlzIGEgSmF2YVNjcmlwdCBjb21wb25lbnQgdGhhdCBwcm92aWRlcyBhIGNvZGUgZWRpdG9yIGluCnRoZSBicm93c2VyLiBXaGVuIGEgbW9kZSBpcyBhdmFpbGFibGUgZm9yIHRoZSBsYW5ndWFnZSB5b3UgYXJlIGNvZGluZwppbiwgaXQgd2lsbCBjb2xvciB5b3VyIGNvZGUsIGFuZCBvcHRpb25hbGx5IGhlbHAgd2l0aCBpbmRlbnRhdGlvbi4KClRoZSBwcm9qZWN0IHBhZ2UgaXMgaHR0cDovL2NvZGVtaXJyb3IubmV0ICAKVGhlIG1hbnVhbCBpcyBhdCBodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL21hbnVhbC5odG1sICAKVGhlIGNvbnRyaWJ1dGluZyBndWlkZWxpbmVzIGFyZSBpbiBbQ09OVFJJQlVUSU5HLm1kXShodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9Db2RlTWlycm9yL2Jsb2IvbWFzdGVyL0NPTlRSSUJVVElORy5tZCkK]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/test/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/test/comment_test.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[bmFtZXNwYWNlID0gImNvbW1lbnRfIjsKCihmdW5jdGlvbigpIHsKICBmdW5jdGlvbiB0ZXN0KG5hbWUsIG1vZGUsIHJ1biwgYmVmb3JlLCBhZnRlcikgewogICAgcmV0dXJuIHRlc3RDTShuYW1lLCBmdW5jdGlvbihjbSkgewogICAgICBydW4oY20pOwogICAgICBlcShjbS5nZXRWYWx1ZSgpLCBhZnRlcik7CiAgICB9LCB7dmFsdWU6IGJlZm9yZSwgbW9kZTogbW9kZX0pOwogIH0KCiAgdmFyIHNpbXBsZVByb2cgPSAiZnVuY3Rpb24gZm9vKCkge1xuICByZXR1cm4gYmFyO1xufSI7CiAgdmFyIGlubGluZUJsb2NrID0gImZvbygvKiBiYXIgKi8gdHJ1ZSk7IjsKICB2YXIgaW5saW5lQmxvY2tzID0gImZvbygvKiBiYXIgKi8gdHJ1ZSwgLyogYmF6ICovIGZhbHNlKTsiOwogIHZhciBtdWx0aUxpbmVJbmxpbmVCbG9jayA9IFsiYWJvdmUoKTsiLCAiZm9vKC8qIGJhciAqLyB0cnVlKTsiLCAiYmVsb3coKTsiXTsKCiAgdGVzdCgiYmxvY2siLCAiamF2YXNjcmlwdCIsIGZ1bmN0aW9uKGNtKSB7CiAgICBjbS5ibG9ja0NvbW1lbnQoUG9zKDAsIDMpLCBQb3MoMywgMCksIHtibG9ja0NvbW1lbnRMZWFkOiAiICoifSk7CiAgfSwgc2ltcGxlUHJvZyArICJcbiIsICIvKiBmdW5jdGlvbiBmb28oKSB7XG4gKiAgIHJldHVybiBiYXI7XG4gKiB9XG4gKi8iKTsKCiAgdGVzdCgiYmxvY2tUb2dnbGUiLCAiamF2YXNjcmlwdCIsIGZ1bmN0aW9uKGNtKSB7CiAgICBjbS5ibG9ja0NvbW1lbnQoUG9zKDAsIDMpLCBQb3MoMiwgMCksIHtibG9ja0NvbW1lbnRMZWFkOiAiICoifSk7CiAgICBjbS51bmNvbW1lbnQoUG9zKDAsIDMpLCBQb3MoMiwgMCksIHtibG9ja0NvbW1lbnRMZWFkOiAiICoifSk7CiAgfSwgc2ltcGxlUHJvZywgc2ltcGxlUHJvZyk7CgogIHRlc3QoImJsb2NrVG9nZ2xlMiIsICJqYXZhc2NyaXB0IiwgZnVuY3Rpb24oY20pIHsKICAgIGNtLnNldEN1cnNvcih7bGluZTogMCwgY2g6IDcgLyogaW5zaWRlIHRoZSBibG9jayBjb21tZW50ICovfSk7CiAgICBjbS5leGVjQ29tbWFuZCgidG9nZ2xlQ29tbWVudCIpOwogIH0sIGlubGluZUJsb2NrLCAiZm9vKGJhciB0cnVlKTsiKTsKCiAgLy8gVGhpcyB0ZXN0IHNob3VsZCB3b3JrIGJ1dCBjdXJyZW50bHkgZmFpbHMuCiAgLy8gdGVzdCgiYmxvY2tUb2dnbGUzIiwgImphdmFzY3JpcHQiLCBmdW5jdGlvbihjbSkgewogIC8vICAgY20uc2V0Q3Vyc29yKHtsaW5lOiAwLCBjaDogNyAvKiBpbnNpZGUgdGhlIGZpcnN0IGJsb2NrIGNvbW1lbnQgKi99KTsKICAvLyAgIGNtLmV4ZWNDb21tYW5kKCJ0b2dnbGVDb21tZW50Iik7CiAgLy8gfSwgaW5saW5lQmxvY2tzLCAiZm9vKGJhciB0cnVlLCAvKiBiYXogKi8gZmFsc2UpOyIpOwoKICB0ZXN0KCJsaW5lIiwgImphdmFzY3JpcHQiLCBmdW5jdGlvbihjbSkgewogICAgY20ubGluZUNvbW1lbnQoUG9zKDEsIDEpLCBQb3MoMSwgMSkpOwogIH0sIHNpbXBsZVByb2csICJmdW5jdGlvbiBmb28oKSB7XG4vLyAgIHJldHVybiBiYXI7XG59Iik7CgogIHRlc3QoImxpbmVUb2dnbGUiLCAiamF2YXNjcmlwdCIsIGZ1bmN0aW9uKGNtKSB7CiAgICBjbS5saW5lQ29tbWVudChQb3MoMCwgMCksIFBvcygyLCAxKSk7CiAgICBjbS51bmNvbW1lbnQoUG9zKDAsIDApLCBQb3MoMiwgMSkpOwogIH0sIHNpbXBsZVByb2csIHNpbXBsZVByb2cpOwoKICB0ZXN0KCJmYWxsYmFja1RvQmxvY2siLCAiY3NzIiwgZnVuY3Rpb24oY20pIHsKICAgIGNtLmxpbmVDb21tZW50KFBvcygwLCAwKSwgUG9zKDIsIDEpKTsKICB9LCAiaHRtbCB7XG4gIGJvcmRlcjogbm9uZTtcbn0iLCAiLyogaHRtbCB7XG4gIGJvcmRlcjogbm9uZTtcbn0gKi8iKTsKCiAgdGVzdCgiZmFsbGJhY2tUb0xpbmUiLCAicnVieSIsIGZ1bmN0aW9uKGNtKSB7CiAgICBjbS5ibG9ja0NvbW1lbnQoUG9zKDAsIDApLCBQb3MoMSkpOwogIH0sICJkZWYgYmxhaCgpXG4gIHJldHVybiBoYWhcbiIsICIjIGRlZiBibGFoKClcbiMgICByZXR1cm4gaGFoXG4iKTsKCiAgdGVzdCgiaWdub3JlRXh0ZXJuYWxCbG9ja0NvbW1lbnRzIiwgImphdmFzY3JpcHQiLCBmdW5jdGlvbihjbSkgewogICAgY20uZXhlY0NvbW1hbmQoInRvZ2dsZUNvbW1lbnQiKTsKICB9LCBpbmxpbmVCbG9ja3MsICIvLyAiICsgaW5saW5lQmxvY2tzKTsKCiAgdGVzdCgiaWdub3JlRXh0ZXJuYWxCbG9ja0NvbW1lbnRzMiIsICJqYXZhc2NyaXB0IiwgZnVuY3Rpb24oY20pIHsKICAgIGNtLnNldEN1cnNvcih7bGluZTogMCwgY2g6IG51bGwgLyogZW9sICovfSk7CiAgICBjbS5leGVjQ29tbWFuZCgidG9nZ2xlQ29tbWVudCIpOwogIH0sIGlubGluZUJsb2NrcywgIi8vICIgKyBpbmxpbmVCbG9ja3MpOwoKICB0ZXN0KCJpZ25vcmVFeHRlcm5hbEJsb2NrQ29tbWVudHNNdWx0aUxpbmVBYm92ZSIsICJqYXZhc2NyaXB0IiwgZnVuY3Rpb24oY20pIHsKICAgIGNtLnNldFNlbGVjdGlvbih7bGluZTogMCwgY2g6IDB9LCB7bGluZTogMSwgY2g6IDF9KTsKICAgIGNtLmV4ZWNDb21tYW5kKCJ0b2dnbGVDb21tZW50Iik7CiAgfSwgbXVsdGlMaW5lSW5saW5lQmxvY2suam9pbigiXG4iKSwgWyIvLyAiICsgbXVsdGlMaW5lSW5saW5lQmxvY2tbMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvLyAiICsgbXVsdGlMaW5lSW5saW5lQmxvY2tbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpTGluZUlubGluZUJsb2NrWzJdXS5qb2luKCJcbiIpKTsKCiAgdGVzdCgiaWdub3JlRXh0ZXJuYWxCbG9ja0NvbW1lbnRzTXVsdGlMaW5lQmVsb3ciLCAiamF2YXNjcmlwdCIsIGZ1bmN0aW9uKGNtKSB7CiAgICBjbS5zZXRTZWxlY3Rpb24oe2xpbmU6IDEsIGNoOiAxMyAvKiBhZnRlciBlbmQgb2YgYmxvY2sgY29tbWVudCAqL30sIHtsaW5lOiAyLCBjaDogMX0pOwogICAgY20uZXhlY0NvbW1hbmQoInRvZ2dsZUNvbW1lbnQiKTsKICB9LCBtdWx0aUxpbmVJbmxpbmVCbG9jay5qb2luKCJcbiIpLCBbbXVsdGlMaW5lSW5saW5lQmxvY2tbMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvLyAiICsgbXVsdGlMaW5lSW5saW5lQmxvY2tbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvLyAiICsgbXVsdGlMaW5lSW5saW5lQmxvY2tbMl1dLmpvaW4oIlxuIikpOwoKICB0ZXN0KCJjb21tZW50UmFuZ2UiLCAiamF2YXNjcmlwdCIsIGZ1bmN0aW9uKGNtKSB7CiAgICBjbS5ibG9ja0NvbW1lbnQoUG9zKDEsIDIpLCBQb3MoMSwgMTMpLCB7ZnVsbExpbmVzOiBmYWxzZX0pOwogIH0sIHNpbXBsZVByb2csICJmdW5jdGlvbiBmb28oKSB7XG4gIC8qcmV0dXJuIGJhcjsqL1xufSIpOwoKICB0ZXN0KCJpbmRlbnRlZCIsICJqYXZhc2NyaXB0IiwgZnVuY3Rpb24oY20pIHsKICAgIGNtLmxpbmVDb21tZW50KFBvcygxLCAwKSwgUG9zKDIpLCB7aW5kZW50OiB0cnVlfSk7CiAgfSwgc2ltcGxlUHJvZywgImZ1bmN0aW9uIGZvbygpIHtcbiAgLy8gcmV0dXJuIGJhcjtcbiAgLy8gfSIpOwoKICB0ZXN0KCJzaW5nbGVFbXB0eUxpbmUiLCAiamF2YXNjcmlwdCIsIGZ1bmN0aW9uKGNtKSB7CiAgICBjbS5zZXRDdXJzb3IoMSk7CiAgICBjbS5leGVjQ29tbWFuZCgidG9nZ2xlQ29tbWVudCIpOwogIH0sICJhO1xuXG5iOyIsICJhO1xuLy8gXG5iOyIpOwoKICB0ZXN0KCJkb250TWVzc1dpdGhTdHJpbmdzIiwgImphdmFzY3JpcHQiLCBmdW5jdGlvbihjbSkgewogICAgY20uZXhlY0NvbW1hbmQoInRvZ2dsZUNvbW1lbnQiKTsKICB9LCAiY29uc29sZS5sb2coXCIvKnN0cmluZyovXCIpOyIsICIvLyBjb25zb2xlLmxvZyhcIi8qc3RyaW5nKi9cIik7Iik7CgogIHRlc3QoImRvbnRNZXNzV2l0aFN0cmluZ3MyIiwgImphdmFzY3JpcHQiLCBmdW5jdGlvbihjbSkgewogICAgY20uZXhlY0NvbW1hbmQoInRvZ2dsZUNvbW1lbnQiKTsKICB9LCAiY29uc29sZS5sb2coXCIvLyBzdHJpbmdcIik7IiwgIi8vIGNvbnNvbGUubG9nKFwiLy8gc3RyaW5nXCIpOyIpOwoKICB0ZXN0KCJkb250TWVzc1dpdGhTdHJpbmdzMyIsICJqYXZhc2NyaXB0IiwgZnVuY3Rpb24oY20pIHsKICAgIGNtLmV4ZWNDb21tYW5kKCJ0b2dnbGVDb21tZW50Iik7CiAgfSwgIi8vIGNvbnNvbGUubG9nKFwiLy8gc3RyaW5nXCIpOyIsICJjb25zb2xlLmxvZyhcIi8vIHN0cmluZ1wiKTsiKTsKfSkoKTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/test/doc_test.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKCkgewogIC8vIEEgbWluaWxhbmd1YWdlIGZvciBpbnN0YW50aWF0aW5nIGxpbmtlZCBDb2RlTWlycm9yIGluc3RhbmNlcyBhbmQgRG9jcwogIGZ1bmN0aW9uIGluc3RhbnRpYXRlU3BlYyhzcGVjLCBwbGFjZSwgb3B0cykgewogICAgdmFyIG5hbWVzID0ge30sIHBvcyA9IDAsIGwgPSBzcGVjLmxlbmd0aCwgZWRpdG9ycyA9IFtdOwogICAgd2hpbGUgKHNwZWMpIHsKICAgICAgdmFyIG0gPSBzcGVjLm1hdGNoKC9eKFx3KykoXCo/KSg/Oj0nKFteXCddKiknfDwofj8pKFx3KykoPzpcLyhcZCspLShcZCspKT8pXHMqLyk7CiAgICAgIHZhciBuYW1lID0gbVsxXSwgaXNEb2MgPSBtWzJdLCBjdXI7CiAgICAgIGlmIChtWzNdKSB7CiAgICAgICAgY3VyID0gaXNEb2MgPyBDb2RlTWlycm9yLkRvYyhtWzNdKSA6IENvZGVNaXJyb3IocGxhY2UsIGNsb25lKG9wdHMsIHt2YWx1ZTogbVszXX0pKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB2YXIgb3RoZXIgPSBtWzVdOwogICAgICAgIGlmICghbmFtZXMuaGFzT3duUHJvcGVydHkob3RoZXIpKSB7CiAgICAgICAgICBuYW1lc1tvdGhlcl0gPSBlZGl0b3JzLmxlbmd0aDsKICAgICAgICAgIGVkaXRvcnMucHVzaChDb2RlTWlycm9yKHBsYWNlLCBvcHRzKSk7CiAgICAgICAgfQogICAgICAgIHZhciBkb2MgPSBlZGl0b3JzW25hbWVzW290aGVyXV0ubGlua2VkRG9jKHsKICAgICAgICAgIHNoYXJlZEhpc3Q6ICFtWzRdLAogICAgICAgICAgZnJvbTogbVs2XSA/IE51bWJlcihtWzZdKSA6IG51bGwsCiAgICAgICAgICB0bzogbVs3XSA/IE51bWJlcihtWzddKSA6IG51bGwKICAgICAgICB9KTsKICAgICAgICBjdXIgPSBpc0RvYyA/IGRvYyA6IENvZGVNaXJyb3IocGxhY2UsIGNsb25lKG9wdHMsIHt2YWx1ZTogZG9jfSkpOwogICAgICB9CiAgICAgIG5hbWVzW25hbWVdID0gZWRpdG9ycy5sZW5ndGg7CiAgICAgIGVkaXRvcnMucHVzaChjdXIpOwogICAgICBzcGVjID0gc3BlYy5zbGljZShtWzBdLmxlbmd0aCk7CiAgICB9CiAgICByZXR1cm4gZWRpdG9yczsKICB9CgogIGZ1bmN0aW9uIGNsb25lKG9iaiwgcHJvcHMpIHsKICAgIGlmICghb2JqKSByZXR1cm47CiAgICBjbG9uZS5wcm90b3R5cGUgPSBvYmo7CiAgICB2YXIgaW5zdCA9IG5ldyBjbG9uZSgpOwogICAgaWYgKHByb3BzKSBmb3IgKHZhciBuIGluIHByb3BzKSBpZiAocHJvcHMuaGFzT3duUHJvcGVydHkobikpCiAgICAgIGluc3Rbbl0gPSBwcm9wc1tuXTsKICAgIHJldHVybiBpbnN0OwogIH0KCiAgZnVuY3Rpb24gZXFBbGwodmFsKSB7CiAgICB2YXIgZW5kID0gYXJndW1lbnRzLmxlbmd0aCwgbXNnID0gbnVsbDsKICAgIGlmICh0eXBlb2YgYXJndW1lbnRzW2VuZC0xXSA9PSAic3RyaW5nIikKICAgICAgbXNnID0gYXJndW1lbnRzWy0tZW5kXTsKICAgIGlmIChpID09IGVuZCkgdGhyb3cgbmV3IEVycm9yKCJObyBlZGl0b3JzIHByb3ZpZGVkIHRvIGVxQWxsIik7CiAgICBmb3IgKHZhciBpID0gMTsgaSA8IGVuZDsgKytpKQogICAgICBlcShhcmd1bWVudHNbaV0uZ2V0VmFsdWUoKSwgdmFsLCBtc2cpCiAgfQoKICBmdW5jdGlvbiB0ZXN0RG9jKG5hbWUsIHNwZWMsIHJ1biwgb3B0cywgZXhwZWN0RmFpbCkgewogICAgaWYgKCFvcHRzKSBvcHRzID0ge307CgogICAgcmV0dXJuIHRlc3QoImRvY18iICsgbmFtZSwgZnVuY3Rpb24oKSB7CiAgICAgIHZhciBwbGFjZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0ZXN0Z3JvdW5kIik7CiAgICAgIHZhciBlZGl0b3JzID0gaW5zdGFudGlhdGVTcGVjKHNwZWMsIHBsYWNlLCBvcHRzKTsKICAgICAgdmFyIHN1Y2Nlc3NmdWwgPSBmYWxzZTsKCiAgICAgIHRyeSB7CiAgICAgICAgcnVuLmFwcGx5KG51bGwsIGVkaXRvcnMpOwogICAgICAgIHN1Y2Nlc3NmdWwgPSB0cnVlOwogICAgICB9IGZpbmFsbHkgewogICAgICAgIGlmICghc3VjY2Vzc2Z1bCB8fCB2ZXJib3NlKSB7CiAgICAgICAgICBwbGFjZS5zdHlsZS52aXNpYmlsaXR5ID0gInZpc2libGUiOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVkaXRvcnMubGVuZ3RoOyArK2kpCiAgICAgICAgICAgIGlmIChlZGl0b3JzW2ldIGluc3RhbmNlb2YgQ29kZU1pcnJvcikKICAgICAgICAgICAgICBwbGFjZS5yZW1vdmVDaGlsZChlZGl0b3JzW2ldLmdldFdyYXBwZXJFbGVtZW50KCkpOwogICAgICAgIH0KICAgICAgfQogICAgfSwgZXhwZWN0RmFpbCk7CiAgfQoKICB2YXIgaWVfbHQ4ID0gL01TSUUgWzEtN11cYi8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTsKCiAgZnVuY3Rpb24gdGVzdEJhc2ljKGEsIGIpIHsKICAgIGVxQWxsKCJ4IiwgYSwgYik7CiAgICBhLnNldFZhbHVlKCJoZXkiKTsKICAgIGVxQWxsKCJoZXkiLCBhLCBiKTsKICAgIGIuc2V0VmFsdWUoIndvdyIpOwogICAgZXFBbGwoIndvdyIsIGEsIGIpOwogICAgYS5yZXBsYWNlUmFuZ2UoInVcbnZcbnciLCBQb3MoMCwgMykpOwogICAgYi5yZXBsYWNlUmFuZ2UoImkiLCBQb3MoMCwgNCkpOwogICAgYi5yZXBsYWNlUmFuZ2UoImoiLCBQb3MoMiwgMSkpOwogICAgZXFBbGwoIndvd3VpXG52XG53aiIsIGEsIGIpOwogIH0KCiAgdGVzdERvYygiYmFzaWMiLCAiQT0neCcgQjxBIiwgdGVzdEJhc2ljKTsKICB0ZXN0RG9jKCJiYXNpY1NlcGFyYXRlIiwgIkE9J3gnIEI8fkEiLCB0ZXN0QmFzaWMpOwoKICB0ZXN0RG9jKCJzaGFyZWRIaXN0IiwgIkE9J2FiXG5jZFxuZWYnIEI8QSIsIGZ1bmN0aW9uKGEsIGIpIHsKICAgIGEucmVwbGFjZVJhbmdlKCJ4IiwgUG9zKDApKTsKICAgIGIucmVwbGFjZVJhbmdlKCJ5IiwgUG9zKDEpKTsKICAgIGEucmVwbGFjZVJhbmdlKCJ6IiwgUG9zKDIpKTsKICAgIGVxQWxsKCJhYnhcbmNkeVxuZWZ6IiwgYSwgYik7CiAgICBhLnVuZG8oKTsKICAgIGEudW5kbygpOwogICAgZXFBbGwoImFieFxuY2RcbmVmIiwgYSwgYik7CiAgICBhLnJlZG8oKTsKICAgIGVxQWxsKCJhYnhcbmNkeVxuZWYiLCBhLCBiKTsKICAgIGIucmVkbygpOwogICAgZXFBbGwoImFieFxuY2R5XG5lZnoiLCBhLCBiKTsKICAgIGEudW5kbygpOyBiLnVuZG8oKTsgYS51bmRvKCk7IGEudW5kbygpOwogICAgZXFBbGwoImFiXG5jZFxuZWYiLCBhLCBiKTsKICB9LCBudWxsLCBpZV9sdDgpOwoKICB0ZXN0RG9jKCJ1bmRvSW50YWN0IiwgIkE9J2FiXG5jZFxuZWYnIEI8fkEiLCBmdW5jdGlvbihhLCBiKSB7CiAgICBhLnJlcGxhY2VSYW5nZSgieCIsIFBvcygwKSk7CiAgICBiLnJlcGxhY2VSYW5nZSgieSIsIFBvcygxKSk7CiAgICBhLnJlcGxhY2VSYW5nZSgieiIsIFBvcygyKSk7CiAgICBhLnJlcGxhY2VSYW5nZSgicSIsIFBvcygwKSk7CiAgICBlcUFsbCgiYWJ4cVxuY2R5XG5lZnoiLCBhLCBiKTsKICAgIGEudW5kbygpOwogICAgYS51bmRvKCk7CiAgICBlcUFsbCgiYWJ4XG5jZHlcbmVmIiwgYSwgYik7CiAgICBiLnVuZG8oKTsKICAgIGVxQWxsKCJhYnhcbmNkXG5lZiIsIGEsIGIpOwogICAgYS5yZWRvKCk7CiAgICBlcUFsbCgiYWJ4XG5jZFxuZWZ6IiwgYSwgYik7CiAgICBhLnJlZG8oKTsKICAgIGVxQWxsKCJhYnhxXG5jZFxuZWZ6IiwgYSwgYik7CiAgICBhLnVuZG8oKTsgYS51bmRvKCk7IGEudW5kbygpOyBhLnVuZG8oKTsKICAgIGVxQWxsKCJhYlxuY2RcbmVmIiwgYSwgYik7CiAgICBiLnJlZG8oKTsKICAgIGVxQWxsKCJhYlxuY2R5XG5lZiIsIGEsIGIpOwogIH0pOwoKICB0ZXN0RG9jKCJ1bmRvQ29uZmxpY3QiLCAiQT0nYWJcbmNkXG5lZicgQjx+QSIsIGZ1bmN0aW9uKGEsIGIpIHsKICAgIGEucmVwbGFjZVJhbmdlKCJ4IiwgUG9zKDApKTsKICAgIGEucmVwbGFjZVJhbmdlKCJ6IiwgUG9zKDIpKTsKICAgIC8vIFRoaXMgc2hvdWxkIGNsZWFyIHRoZSBmaXJzdCB1bmRvIGV2ZW50IGluIGEsIGJ1dCBub3QgdGhlIHNlY29uZAogICAgYi5yZXBsYWNlUmFuZ2UoInkiLCBQb3MoMCkpOwogICAgYS51bmRvKCk7IGEudW5kbygpOwogICAgZXFBbGwoImFieHlcbmNkXG5lZiIsIGEsIGIpOwogICAgYS5yZXBsYWNlUmFuZ2UoInUiLCBQb3MoMikpOwogICAgYS5yZXBsYWNlUmFuZ2UoInYiLCBQb3MoMCkpOwogICAgLy8gVGhpcyBzaG91bGQgY2xlYXIgYm90aCBldmVudHMgaW4gYQogICAgYi5yZXBsYWNlUmFuZ2UoInciLCBQb3MoMCkpOwogICAgYS51bmRvKCk7IGEudW5kbygpOwogICAgZXFBbGwoImFieHl2d1xuY2RcbmVmdSIsIGEsIGIpOwogIH0pOwoKICB0ZXN0RG9jKCJkb3VibGVSZWJhc2UiLCAiQT0nYWJcbmNkXG5lZlxuZycgQjx+QSBDPEIiLCBmdW5jdGlvbihhLCBiLCBjKSB7CiAgICBjLnJlcGxhY2VSYW5nZSgidSIsIFBvcygzKSk7CiAgICBhLnJlcGxhY2VSYW5nZSgiIiwgUG9zKDAsIDApLCBQb3MoMSwgMCkpOwogICAgYy51bmRvKCk7CiAgICBlcUFsbCgiY2RcbmVmXG5nIiwgYSwgYiwgYyk7CiAgfSk7CgogIHRlc3REb2MoInVuZG9VcGRhdGUiLCAiQT0nYWJcbmNkXG5lZicgQjx+QSIsIGZ1bmN0aW9uKGEsIGIpIHsKICAgIGEucmVwbGFjZVJhbmdlKCJ4IiwgUG9zKDIpKTsKICAgIGIucmVwbGFjZVJhbmdlKCJ1XG52XG53XG4iLCBQb3MoMCwgMCkpOwogICAgYS51bmRvKCk7CiAgICBlcUFsbCgidVxudlxud1xuYWJcbmNkXG5lZiIsIGEsIGIpOwogICAgYS5yZWRvKCk7CiAgICBlcUFsbCgidVxudlxud1xuYWJcbmNkXG5lZngiLCBhLCBiKTsKICAgIGEudW5kbygpOwogICAgZXFBbGwoInVcbnZcbndcbmFiXG5jZFxuZWYiLCBhLCBiKTsKICAgIGIudW5kbygpOwogICAgYS5yZWRvKCk7CiAgICBlcUFsbCgiYWJcbmNkXG5lZngiLCBhLCBiKTsKICAgIGEudW5kbygpOwogICAgZXFBbGwoImFiXG5jZFxuZWYiLCBhLCBiKTsKICB9KTsKCiAgdGVzdERvYygidW5kb0tlZXBSYW5nZXMiLCAiQT0nYWJjZGVmZycgQjxBIiwgZnVuY3Rpb24oYSwgYikgewogICAgdmFyIG0gPSBhLm1hcmtUZXh0KFBvcygwLCAxKSwgUG9zKDAsIDMpLCB7Y2xhc3NOYW1lOiAiZm9vIn0pOwogICAgYi5yZXBsYWNlUmFuZ2UoIngiLCBQb3MoMCwgMCkpOwogICAgZXFQb3MobS5maW5kKCkuZnJvbSwgUG9zKDAsIDIpKTsKICAgIGIucmVwbGFjZVJhbmdlKCJ5enp5IiwgUG9zKDAsIDEpLCBQb3MoMCkpOwogICAgZXEobS5maW5kKCksIG51bGwpOwogICAgYi51bmRvKCk7CiAgICBlcVBvcyhtLmZpbmQoKS5mcm9tLCBQb3MoMCwgMikpOwogICAgYi51bmRvKCk7CiAgICBlcVBvcyhtLmZpbmQoKS5mcm9tLCBQb3MoMCwgMSkpOwogIH0pOwoKICB0ZXN0RG9jKCJsb25nQ2hhaW4iLCAiQT0ndXYnIEI8QSBDPEIgRDxDIiwgZnVuY3Rpb24oYSwgYiwgYywgZCkgewogICAgYS5yZXBsYWNlU2VsZWN0aW9uKCJYIik7CiAgICBlcUFsbCgiWHV2IiwgYSwgYiwgYywgZCk7CiAgICBkLnJlcGxhY2VSYW5nZSgiWSIsIFBvcygwKSk7CiAgICBlcUFsbCgiWHV2WSIsIGEsIGIsIGMsIGQpOwogIH0pOwoKICB0ZXN0RG9jKCJicm9hZENhc3QiLCAiQjxBIEM8QSBEPEEgRTxBIiwgZnVuY3Rpb24oYSwgYiwgYywgZCwgZSkgewogICAgYi5zZXRWYWx1ZSgidXUiKTsKICAgIGVxQWxsKCJ1dSIsIGEsIGIsIGMsIGQsIGUpOwogICAgYS5yZXBsYWNlUmFuZ2UoInYiLCBQb3MoMCwgMSkpOwogICAgZXFBbGwoInV2dSIsIGEsIGIsIGMsIGQsIGUpOwogIH0pOwoKICAvLyBBIGFuZCBCIHNoYXJlIGEgaGlzdG9yeSwgQyBhbmQgRCBzaGFyZSBhIHNlcGFyYXRlIG9uZQogIHRlc3REb2MoImlzbGFuZHMiLCAiQT0neFxueVxueicgQjxBIEM8fkEgRDxDIiwgZnVuY3Rpb24oYSwgYiwgYywgZCkgewogICAgYS5yZXBsYWNlUmFuZ2UoInUiLCBQb3MoMCkpOwogICAgZC5yZXBsYWNlUmFuZ2UoInYiLCBQb3MoMikpOwogICAgYi51bmRvKCk7CiAgICBlcUFsbCgieFxueVxuenYiLCBhLCBiLCBjLCBkKTsKICAgIGMudW5kbygpOwogICAgZXFBbGwoInhcbnlcbnoiLCBhLCBiLCBjLCBkKTsKICAgIGEucmVkbygpOwogICAgZXFBbGwoInh1XG55XG56IiwgYSwgYiwgYywgZCk7CiAgICBkLnJlZG8oKTsKICAgIGVxQWxsKCJ4dVxueVxuenYiLCBhLCBiLCBjLCBkKTsKICB9KTsKCiAgdGVzdERvYygidW5saW5rIiwgIkI8QSBDPEEgRDxCIiwgZnVuY3Rpb24oYSwgYiwgYywgZCkgewogICAgYS5zZXRWYWx1ZSgiaGkiKTsKICAgIGIudW5saW5rRG9jKGEpOwogICAgZC5zZXRWYWx1ZSgiYXllIik7CiAgICBlcUFsbCgiaGkiLCBhLCBjKTsKICAgIGVxQWxsKCJheWUiLCBiLCBkKTsKICAgIGEuc2V0VmFsdWUoIm9vIik7CiAgICBlcUFsbCgib28iLCBhLCBjKTsKICAgIGVxQWxsKCJheWUiLCBiLCBkKTsKICB9KTsKCiAgdGVzdERvYygiYmFyZURvYyIsICJBKj0nZm9vJyBCKjxBIEM8QiIsIGZ1bmN0aW9uKGEsIGIsIGMpIHsKICAgIGlzKGEgaW5zdGFuY2VvZiBDb2RlTWlycm9yLkRvYyk7CiAgICBpcyhiIGluc3RhbmNlb2YgQ29kZU1pcnJvci5Eb2MpOwogICAgaXMoYyBpbnN0YW5jZW9mIENvZGVNaXJyb3IpOwogICAgZXFBbGwoImZvbyIsIGEsIGIsIGMpOwogICAgYS5yZXBsYWNlUmFuZ2UoImhleSIsIFBvcygwLCAwKSwgUG9zKDApKTsKICAgIGMucmVwbGFjZVJhbmdlKCIhIiwgUG9zKDApKTsKICAgIGVxQWxsKCJoZXkhIiwgYSwgYiwgYyk7CiAgICBiLnVubGlua0RvYyhhKTsKICAgIGIuc2V0VmFsdWUoIngiKTsKICAgIGVxQWxsKCJ4IiwgYiwgYyk7CiAgICBlcUFsbCgiaGV5ISIsIGEpOwogIH0pOwoKICB0ZXN0RG9jKCJzd2FwRG9jIiwgIkE9J2EnIEIqPSdiJyBDPEEiLCBmdW5jdGlvbihhLCBiLCBjKSB7CiAgICB2YXIgZCA9IGEuc3dhcERvYyhiKTsKICAgIGQuc2V0VmFsdWUoIngiKTsKICAgIGVxQWxsKCJ4IiwgYywgZCk7CiAgICBlcUFsbCgiYiIsIGEsIGIpOwogIH0pOwoKICB0ZXN0RG9jKCJkb2NLZWVwc1Njcm9sbCIsICJBPSd4JyBCKj0neSciLCBmdW5jdGlvbihhLCBiKSB7CiAgICBhZGREb2MoYSwgMjAwLCAyMDApOwogICAgYS5zY3JvbGxJbnRvVmlldyhQb3MoMTk5LCAyMDApKTsKICAgIHZhciBjID0gYS5zd2FwRG9jKGIpOwogICAgYS5zd2FwRG9jKGMpOwogICAgdmFyIHBvcyA9IGEuZ2V0U2Nyb2xsSW5mbygpOwogICAgaXMocG9zLmxlZnQgPiAwLCAibm90IGF0IGxlZnQiKTsKICAgIGlzKHBvcy50b3AgPiAwLCAibm90IGF0IHRvcCIpOwogIH0pOwoKICB0ZXN0RG9jKCJjb3B5RG9jIiwgIkE9J3UnIiwgZnVuY3Rpb24oYSkgewogICAgdmFyIGNvcHkgPSBhLmdldERvYygpLmNvcHkodHJ1ZSk7CiAgICBhLnNldFZhbHVlKCJmb28iKTsKICAgIGNvcHkuc2V0VmFsdWUoImJhciIpOwogICAgdmFyIG9sZCA9IGEuc3dhcERvYyhjb3B5KTsKICAgIGVxKGEuZ2V0VmFsdWUoKSwgImJhciIpOwogICAgYS51bmRvKCk7CiAgICBlcShhLmdldFZhbHVlKCksICJ1Iik7CiAgICBhLnN3YXBEb2Mob2xkKTsKICAgIGVxKGEuZ2V0VmFsdWUoKSwgImZvbyIpOwogICAgZXEob2xkLmhpc3RvcnlTaXplKCkudW5kbywgMSk7CiAgICBlcShvbGQuY29weShmYWxzZSkuaGlzdG9yeVNpemUoKS51bmRvLCAwKTsKICB9KTsKCiAgdGVzdERvYygiZG9jS2VlcHNNb2RlIiwgIkE9JzErMSciLCBmdW5jdGlvbihhKSB7CiAgICB2YXIgb3RoZXIgPSBDb2RlTWlycm9yLkRvYygiaGkiLCAidGV4dC94LW1hcmtkb3duIik7CiAgICBhLnNldE9wdGlvbigibW9kZSIsICJ0ZXh0L2phdmFzY3JpcHQiKTsKICAgIHZhciBvbGQgPSBhLnN3YXBEb2Mob3RoZXIpOwogICAgZXEoYS5nZXRPcHRpb24oIm1vZGUiKSwgInRleHQveC1tYXJrZG93biIpOwogICAgZXEoYS5nZXRNb2RlKCkubmFtZSwgIm1hcmtkb3duIik7CiAgICBhLnN3YXBEb2Mob2xkKTsKICAgIGVxKGEuZ2V0T3B0aW9uKCJtb2RlIiksICJ0ZXh0L2phdmFzY3JpcHQiKTsKICAgIGVxKGEuZ2V0TW9kZSgpLm5hbWUsICJqYXZhc2NyaXB0Iik7CiAgfSk7CgogIHRlc3REb2MoInN1YnZpZXciLCAiQT0nMVxuMlxuM1xuNFxuNScgQjx+QS8xLTMiLCBmdW5jdGlvbihhLCBiKSB7CiAgICBlcShiLmdldFZhbHVlKCksICIyXG4zIik7CiAgICBlcShiLmZpcnN0TGluZSgpLCAxKTsKICAgIGIuc2V0Q3Vyc29yKFBvcyg0KSk7CiAgICBlcVBvcyhiLmdldEN1cnNvcigpLCBQb3MoMiwgMSkpOwogICAgYS5yZXBsYWNlUmFuZ2UoIi0xXG4wXG4iLCBQb3MoMCwgMCkpOwogICAgZXEoYi5maXJzdExpbmUoKSwgMyk7CiAgICBlcVBvcyhiLmdldEN1cnNvcigpLCBQb3MoNCwgMSkpOwogICAgYS51bmRvKCk7CiAgICBlcVBvcyhiLmdldEN1cnNvcigpLCBQb3MoMiwgMSkpOwogICAgYi5yZXBsYWNlUmFuZ2UoIm95b3lcbiIsIFBvcygyLCAwKSk7CiAgICBlcShhLmdldFZhbHVlKCksICIxXG4yXG5veW95XG4zXG40XG41Iik7CiAgICBiLnVuZG8oKTsKICAgIGVxKGEuZ2V0VmFsdWUoKSwgIjFcbjJcbjNcbjRcbjUiKTsKICB9KTsKCiAgdGVzdERvYygic3Vidmlld0VkaXRPbkJvdW5kYXJ5IiwgIkE9JzExXG4yMlxuMzNcbjQ0XG41NScgQjx+QS8xLTQiLCBmdW5jdGlvbihhLCBiKSB7CiAgICBhLnJlcGxhY2VSYW5nZSgieFxueXlcbnoiLCBQb3MoMCwgMSksIFBvcygyLCAxKSk7CiAgICBlcShiLmZpcnN0TGluZSgpLCAyKTsKICAgIGVxKGIubGluZUNvdW50KCksIDIpOwogICAgZXEoYi5nZXRWYWx1ZSgpLCAiejNcbjQ0Iik7CiAgICBhLnJlcGxhY2VSYW5nZSgicVxucnJcbnMiLCBQb3MoMywgMSksIFBvcyg0LCAxKSk7CiAgICBlcShiLmZpcnN0TGluZSgpLCAyKTsKICAgIGVxKGIuZ2V0VmFsdWUoKSwgInozXG40cSIpOwogICAgZXEoYS5nZXRWYWx1ZSgpLCAiMXhcbnl5XG56M1xuNHFcbnJyXG5zNSIpOwogICAgYS5leGVjQ29tbWFuZCgic2VsZWN0QWxsIik7CiAgICBhLnJlcGxhY2VTZWxlY3Rpb24oIiEiKTsKICAgIGVxQWxsKCIhIiwgYSwgYik7CiAgfSk7CgoKICB0ZXN0RG9jKCJzaGFyZWRNYXJrZXIiLCAiQT0nYWJcbmNkXG5lZlxuZ2gnIEI8QSBDPH5BLzEtMiIsIGZ1bmN0aW9uKGEsIGIsIGMpIHsKICAgIHZhciBtYXJrID0gYi5tYXJrVGV4dChQb3MoMCwgMSksIFBvcygzLCAxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiAiY20tc2VhcmNoaW5nIiwgc2hhcmVkOiB0cnVlfSk7CiAgICB2YXIgZm91bmQgPSBhLmZpbmRNYXJrc0F0KFBvcygwLCAyKSk7CiAgICBlcShmb3VuZC5sZW5ndGgsIDEpOwogICAgZXEoZm91bmRbMF0sIG1hcmspOwogICAgZXEoYy5maW5kTWFya3NBdChQb3MoMSwgMSkpLmxlbmd0aCwgMSk7CiAgICBlcVBvcyhtYXJrLmZpbmQoKS5mcm9tLCBQb3MoMCwgMSkpOwogICAgZXFQb3MobWFyay5maW5kKCkudG8sIFBvcygzLCAxKSk7CiAgICBiLnJlcGxhY2VSYW5nZSgieFxueVxuIiwgUG9zKDAsIDApKTsKICAgIGVxUG9zKG1hcmsuZmluZCgpLmZyb20sIFBvcygyLCAxKSk7CiAgICBlcVBvcyhtYXJrLmZpbmQoKS50bywgUG9zKDUsIDEpKTsKICAgIHZhciBjbGVhcmVkID0gMDsKICAgIENvZGVNaXJyb3Iub24obWFyaywgImNsZWFyIiwgZnVuY3Rpb24oKSB7KytjbGVhcmVkO30pOwogICAgYi5vcGVyYXRpb24oZnVuY3Rpb24oKXttYXJrLmNsZWFyKCk7fSk7CiAgICBlcShhLmZpbmRNYXJrc0F0KFBvcygzLCAxKSkubGVuZ3RoLCAwKTsKICAgIGVxKGIuZmluZE1hcmtzQXQoUG9zKDMsIDEpKS5sZW5ndGgsIDApOwogICAgZXEoYy5maW5kTWFya3NBdChQb3MoMywgMSkpLmxlbmd0aCwgMCk7CiAgICBlcShtYXJrLmZpbmQoKSwgbnVsbCk7CiAgICBlcShjbGVhcmVkLCAxKTsKICB9KTsKCiAgdGVzdERvYygic2hhcmVkTWFya2VyQ29weSIsICJBPSdhYmNkZSciLCBmdW5jdGlvbihhKSB7CiAgICB2YXIgc2hhcmVkID0gYS5tYXJrVGV4dChQb3MoMCwgMSksIFBvcygwLCAzKSwge3NoYXJlZDogdHJ1ZX0pOwogICAgdmFyIGIgPSBhLmxpbmtlZERvYygpOwogICAgdmFyIGZvdW5kID0gYi5maW5kTWFya3NBdChQb3MoMCwgMikpOwogICAgZXEoZm91bmQubGVuZ3RoLCAxKTsKICAgIGVxKGZvdW5kWzBdLCBzaGFyZWQpOwogICAgc2hhcmVkLmNsZWFyKCk7CiAgICBlcShiLmZpbmRNYXJrc0F0KFBvcygwLCAyKSksIDApOwogIH0pOwoKICB0ZXN0RG9jKCJzaGFyZWRNYXJrZXJEZXRhY2giLCAiQT0nYWJjZGUnIEI8QSBDPEIiLCBmdW5jdGlvbihhLCBiLCBjKSB7CiAgICB2YXIgc2hhcmVkID0gYS5tYXJrVGV4dChQb3MoMCwgMSksIFBvcygwLCAzKSwge3NoYXJlZDogdHJ1ZX0pOwogICAgYS51bmxpbmtEb2MoYik7CiAgICB2YXIgaW5CID0gYi5maW5kTWFya3NBdChQb3MoMCwgMikpOwogICAgZXEoaW5CLmxlbmd0aCwgMSk7CiAgICBpcyhpbkJbMF0gIT0gc2hhcmVkKTsKICAgIHZhciBpbkMgPSBjLmZpbmRNYXJrc0F0KFBvcygwLCAyKSk7CiAgICBlcShpbkMubGVuZ3RoLCAxKTsKICAgIGlzKGluQ1swXSAhPSBzaGFyZWQpOwogICAgaW5DWzBdLmNsZWFyKCk7CiAgICBpcyhzaGFyZWQuZmluZCgpKTsKICB9KTsKCiAgdGVzdERvYygic2hhcmVkQm9va21hcmsiLCAiQT0nYWJcbmNkXG5lZlxuZ2gnIEI8QSBDPH5BLzEtMiIsIGZ1bmN0aW9uKGEsIGIsIGMpIHsKICAgIHZhciBtYXJrID0gYi5zZXRCb29rbWFyayhQb3MoMSwgMSksIHtzaGFyZWQ6IHRydWV9KTsKICAgIHZhciBmb3VuZCA9IGEuZmluZE1hcmtzQXQoUG9zKDEsIDEpKTsKICAgIGVxKGZvdW5kLmxlbmd0aCwgMSk7CiAgICBlcShmb3VuZFswXSwgbWFyayk7CiAgICBlcShjLmZpbmRNYXJrc0F0KFBvcygxLCAxKSkubGVuZ3RoLCAxKTsKICAgIGVxUG9zKG1hcmsuZmluZCgpLCBQb3MoMSwgMSkpOwogICAgYi5yZXBsYWNlUmFuZ2UoInhcbnlcbiIsIFBvcygwLCAwKSk7CiAgICBlcVBvcyhtYXJrLmZpbmQoKSwgUG9zKDMsIDEpKTsKICAgIHZhciBjbGVhcmVkID0gMDsKICAgIENvZGVNaXJyb3Iub24obWFyaywgImNsZWFyIiwgZnVuY3Rpb24oKSB7KytjbGVhcmVkO30pOwogICAgYi5vcGVyYXRpb24oZnVuY3Rpb24oKSB7bWFyay5jbGVhcigpO30pOwogICAgZXEoYS5maW5kTWFya3MoUG9zKDAsIDApLCBQb3MoNSkpLmxlbmd0aCwgMCk7CiAgICBlcShiLmZpbmRNYXJrcyhQb3MoMCwgMCksIFBvcyg1KSkubGVuZ3RoLCAwKTsKICAgIGVxKGMuZmluZE1hcmtzKFBvcygwLCAwKSwgUG9zKDUpKS5sZW5ndGgsIDApOwogICAgZXEobWFyay5maW5kKCksIG51bGwpOwogICAgZXEoY2xlYXJlZCwgMSk7CiAgfSk7CgogIHRlc3REb2MoInVuZG9JblN1YnZpZXciLCAiQT0nbGluZSAwXG5saW5lIDFcbmxpbmUgMlxubGluZSAzXG5saW5lIDQnIEI8QS8xLTQiLCBmdW5jdGlvbihhLCBiKSB7CiAgICBiLnJlcGxhY2VSYW5nZSgieCIsIFBvcygyLCAwKSk7CiAgICBhLnVuZG8oKTsKICAgIGVxKGEuZ2V0VmFsdWUoKSwgImxpbmUgMFxubGluZSAxXG5saW5lIDJcbmxpbmUgM1xubGluZSA0Iik7CiAgICBlcShiLmdldFZhbHVlKCksICJsaW5lIDFcbmxpbmUgMlxubGluZSAzIik7CiAgfSk7Cn0pKCk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/test/driver.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dmFyIHRlc3RzID0gW10sIGZpbHRlcnMgPSBbXSwgYWxsTmFtZXMgPSBbXTsKCmZ1bmN0aW9uIEZhaWx1cmUod2h5KSB7dGhpcy5tZXNzYWdlID0gd2h5O30KRmFpbHVyZS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMubWVzc2FnZTsgfTsKCmZ1bmN0aW9uIGluZGV4T2YoY29sbGVjdGlvbiwgZWx0KSB7CiAgaWYgKGNvbGxlY3Rpb24uaW5kZXhPZikgcmV0dXJuIGNvbGxlY3Rpb24uaW5kZXhPZihlbHQpOwogIGZvciAodmFyIGkgPSAwLCBlID0gY29sbGVjdGlvbi5sZW5ndGg7IGkgPCBlOyArK2kpCiAgICBpZiAoY29sbGVjdGlvbltpXSA9PSBlbHQpIHJldHVybiBpOwogIHJldHVybiAtMTsKfQoKZnVuY3Rpb24gdGVzdChuYW1lLCBydW4sIGV4cGVjdGVkRmFpbCkgewogIC8vIEZvcmNlIHVuaXF1ZSBuYW1lcwogIHZhciBvcmlnaW5hbE5hbWUgPSBuYW1lOwogIHZhciBpID0gMjsgLy8gU2Vjb25kIGZ1bmN0aW9uIHdvdWxkIGJlIE5BTUVfMgogIHdoaWxlIChpbmRleE9mKGFsbE5hbWVzLCBuYW1lKSAhPT0gLTEpewogICAgbmFtZSA9IG9yaWdpbmFsTmFtZSArICJfIiArIGk7CiAgICBpKys7CiAgfQogIGFsbE5hbWVzLnB1c2gobmFtZSk7CiAgLy8gQWRkIHRlc3QKICB0ZXN0cy5wdXNoKHtuYW1lOiBuYW1lLCBmdW5jOiBydW4sIGV4cGVjdGVkRmFpbDogZXhwZWN0ZWRGYWlsfSk7CiAgcmV0dXJuIG5hbWU7Cn0KdmFyIG5hbWVzcGFjZSA9ICIiOwpmdW5jdGlvbiB0ZXN0Q00obmFtZSwgcnVuLCBvcHRzLCBleHBlY3RlZEZhaWwpIHsKICByZXR1cm4gdGVzdChuYW1lc3BhY2UgKyBuYW1lLCBmdW5jdGlvbigpIHsKICAgIHZhciBwbGFjZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0ZXN0Z3JvdW5kIiksIGNtID0gd2luZG93LmNtID0gQ29kZU1pcnJvcihwbGFjZSwgb3B0cyk7CiAgICB2YXIgc3VjY2Vzc2Z1bCA9IGZhbHNlOwogICAgdHJ5IHsKICAgICAgcnVuKGNtKTsKICAgICAgc3VjY2Vzc2Z1bCA9IHRydWU7CiAgICB9IGZpbmFsbHkgewogICAgICBpZiAoIXN1Y2Nlc3NmdWwgfHwgdmVyYm9zZSkgewogICAgICAgIHBsYWNlLnN0eWxlLnZpc2liaWxpdHkgPSAidmlzaWJsZSI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcGxhY2UucmVtb3ZlQ2hpbGQoY20uZ2V0V3JhcHBlckVsZW1lbnQoKSk7CiAgICAgIH0KICAgIH0KICB9LCBleHBlY3RlZEZhaWwpOwp9CgpmdW5jdGlvbiBydW5UZXN0cyhjYWxsYmFjaykgewogIHZhciB0b3RhbFRpbWUgPSAwOwogIGZ1bmN0aW9uIHN0ZXAoaSkgewogICAgZm9yICg7OykgewogICAgICBpZiAoaSA9PT0gdGVzdHMubGVuZ3RoKSB7CiAgICAgICAgcnVubmluZyA9IGZhbHNlOwogICAgICAgIHJldHVybiBjYWxsYmFjaygiZG9uZSIpOwogICAgICB9CiAgICAgIHZhciB0ZXN0ID0gdGVzdHNbaV0sIHNraXAgPSBmYWxzZTsKICAgICAgaWYgKGZpbHRlcnMubGVuZ3RoKSB7CiAgICAgICAgc2tpcCA9IHRydWU7CiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBmaWx0ZXJzLmxlbmd0aDsgaisrKQogICAgICAgICAgaWYgKHRlc3QubmFtZS5tYXRjaChmaWx0ZXJzW2pdKSkgc2tpcCA9IGZhbHNlOwogICAgICB9CiAgICAgIGlmIChza2lwKSB7CiAgICAgICAgY2FsbGJhY2soInNraXBwZWQiLCB0ZXN0Lm5hbWUsIG1lc3NhZ2UpOwogICAgICAgIGkrKzsKICAgICAgfSBlbHNlIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgdmFyIGV4cEZhaWwgPSB0ZXN0LmV4cGVjdGVkRmFpbCwgc3RhcnRUaW1lID0gK25ldyBEYXRlLCB0aHJldyA9IGZhbHNlOwogICAgdHJ5IHsKICAgICAgdmFyIG1lc3NhZ2UgPSB0ZXN0LmZ1bmMoKTsKICAgIH0gY2F0Y2goZSkgewogICAgICB0aHJldyA9IHRydWU7CiAgICAgIGlmIChleHBGYWlsKSBjYWxsYmFjaygiZXhwZWN0ZWQiLCB0ZXN0Lm5hbWUpOwogICAgICBlbHNlIGlmIChlIGluc3RhbmNlb2YgRmFpbHVyZSkgY2FsbGJhY2soImZhaWwiLCB0ZXN0Lm5hbWUsIGUubWVzc2FnZSk7CiAgICAgIGVsc2UgewogICAgICAgIHZhciBwb3MgPSAvKD86XGJhdCB8QCkuKj8oW15cLzpdKyk6KFxkKykvLmV4ZWMoZS5zdGFjayk7CiAgICAgICAgaWYgKHBvcykgY29uc29sZVsibG9nIl0oZS5zdGFjayk7CiAgICAgICAgY2FsbGJhY2soImVycm9yIiwgdGVzdC5uYW1lLCBlLnRvU3RyaW5nKCkgKyAocG9zID8gIiAoIiArIHBvc1sxXSArICI6IiArIHBvc1syXSArICIpIiA6ICIiKSk7CiAgICAgIH0KICAgIH0KICAgIGlmICghdGhyZXcpIHsKICAgICAgaWYgKGV4cEZhaWwpIGNhbGxiYWNrKCJmYWlsIiwgdGVzdC5uYW1lLCBtZXNzYWdlIHx8ICJleHBlY3RlZCBmYWlsdXJlLCBidXQgc3VjY2VlZGVkIik7CiAgICAgIGVsc2UgY2FsbGJhY2soIm9rIiwgdGVzdC5uYW1lLCBtZXNzYWdlKTsKICAgIH0KICAgIGlmICghcXVpdCkgeyAvLyBSdW4gbmV4dCB0ZXN0CiAgICAgIHZhciBkZWxheSA9IDA7CiAgICAgIHRvdGFsVGltZSArPSAoK25ldyBEYXRlKSAtIHN0YXJ0VGltZTsKICAgICAgaWYgKHRvdGFsVGltZSA+IDUwMCl7CiAgICAgICAgdG90YWxUaW1lID0gMDsKICAgICAgICBkZWxheSA9IDUwOwogICAgICB9CiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXtzdGVwKGkgKyAxKTt9LCBkZWxheSk7CiAgICB9IGVsc2UgeyAvLyBRdWl0IHRlc3RzCiAgICAgIHJ1bm5pbmcgPSBmYWxzZTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfQogIHN0ZXAoMCk7Cn0KCmZ1bmN0aW9uIGxhYmVsKHN0ciwgbXNnKSB7CiAgaWYgKG1zZykgcmV0dXJuIHN0ciArICIgKCIgKyBtc2cgKyAiKSI7CiAgcmV0dXJuIHN0cjsKfQpmdW5jdGlvbiBlcShhLCBiLCBtc2cpIHsKICBpZiAoYSAhPSBiKSB0aHJvdyBuZXcgRmFpbHVyZShsYWJlbChhICsgIiAhPSAiICsgYiwgbXNnKSk7Cn0KZnVuY3Rpb24gbmVhcihhLCBiLCBtYXJnaW4sIG1zZykgewogIGlmIChNYXRoLmFicyhhIC0gYikgPiBtYXJnaW4pCiAgICB0aHJvdyBuZXcgRmFpbHVyZShsYWJlbChhICsgIiBpcyBub3QgY2xvc2UgdG8gIiArIGIgKyAiICgiICsgbWFyZ2luICsgIikiLCBtc2cpKTsKfQpmdW5jdGlvbiBlcVBvcyhhLCBiLCBtc2cpIHsKICBmdW5jdGlvbiBzdHIocCkgeyByZXR1cm4gIntsaW5lOiIgKyBwLmxpbmUgKyAiLGNoOiIgKyBwLmNoICsgIn0iOyB9CiAgaWYgKGEgPT0gYikgcmV0dXJuOwogIGlmIChhID09IG51bGwpIHRocm93IG5ldyBGYWlsdXJlKGxhYmVsKCJjb21wYXJpbmcgbnVsbCB0byAiICsgc3RyKGIpLCBtc2cpKTsKICBpZiAoYiA9PSBudWxsKSB0aHJvdyBuZXcgRmFpbHVyZShsYWJlbCgiY29tcGFyaW5nICIgKyBzdHIoYSkgKyAiIHRvIG51bGwiLCBtc2cpKTsKICBpZiAoYS5saW5lICE9IGIubGluZSB8fCBhLmNoICE9IGIuY2gpIHRocm93IG5ldyBGYWlsdXJlKGxhYmVsKHN0cihhKSArICIgIT0gIiArIHN0cihiKSwgbXNnKSk7Cn0KZnVuY3Rpb24gaXMoYSwgbXNnKSB7CiAgaWYgKCFhKSB0aHJvdyBuZXcgRmFpbHVyZShsYWJlbCgiYXNzZXJ0aW9uIGZhaWxlZCIsIG1zZykpOwp9CgpmdW5jdGlvbiBjb3VudFRlc3RzKCkgewogIGlmICghZmlsdGVycy5sZW5ndGgpIHJldHVybiB0ZXN0cy5sZW5ndGg7CiAgdmFyIHN1bSA9IDA7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0ZXN0cy5sZW5ndGg7ICsraSkgewogICAgdmFyIG5hbWUgPSB0ZXN0c1tpXS5uYW1lOwogICAgZm9yICh2YXIgaiA9IDA7IGogPCBmaWx0ZXJzLmxlbmd0aDsgaisrKSB7CiAgICAgIGlmIChuYW1lLm1hdGNoKGZpbHRlcnNbal0pKSB7CiAgICAgICAgKytzdW07CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuIHN1bTsKfQoKZnVuY3Rpb24gcGFyc2VUZXN0RmlsdGVyKHMpIHsKICBpZiAoL19cKiQvLnRlc3QocykpIHJldHVybiBuZXcgUmVnRXhwKCJeIiArIHMuc2xpY2UoMCwgcy5sZW5ndGggLSAyKSwgImkiKTsKICBlbHNlIHJldHVybiBuZXcgUmVnRXhwKHMsICJpIik7Cn0K]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/test/emacs_test.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKCkgewogICJ1c2Ugc3RyaWN0IjsKCiAgdmFyIFBvcyA9IENvZGVNaXJyb3IuUG9zOwogIG5hbWVzcGFjZSA9ICJlbWFjc18iOwoKICB2YXIgZXZlbnRDYWNoZSA9IHt9OwogIGZ1bmN0aW9uIGZha2VFdmVudChrZXlOYW1lKSB7CiAgICB2YXIgZXZlbnQgPSBldmVudENhY2hlW2tleV07CiAgICBpZiAoZXZlbnQpIHJldHVybiBldmVudDsKCiAgICB2YXIgY3RybCwgc2hpZnQsIGFsdDsKICAgIHZhciBrZXkgPSBrZXlOYW1lLnJlcGxhY2UoL1x3Ky0vZywgZnVuY3Rpb24odHlwZSkgewogICAgICBpZiAodHlwZSA9PSAiQ3RybC0iKSBjdHJsID0gdHJ1ZTsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAiQWx0LSIpIGFsdCA9IHRydWU7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gIlNoaWZ0LSIpIHNoaWZ0ID0gdHJ1ZTsKICAgICAgcmV0dXJuICIiOwogICAgfSk7CiAgICB2YXIgY29kZTsKICAgIGZvciAodmFyIGMgaW4gQ29kZU1pcnJvci5rZXlOYW1lcykKICAgICAgaWYgKENvZGVNaXJyb3Iua2V5TmFtZXNbY10gPT0ga2V5KSB7IGNvZGUgPSBjOyBicmVhazsgfQogICAgaWYgKGMgPT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIGtleTogIiArIGtleSk7CgogICAgcmV0dXJuIGV2ZW50Q2FjaGVba2V5TmFtZV0gPSB7CiAgICAgIHR5cGU6ICJrZXlkb3duIiwga2V5Q29kZTogY29kZSwgY3RybEtleTogY3RybCwgc2hpZnRLZXk6IHNoaWZ0LCBhbHRLZXk6IGFsdCwKICAgICAgcHJldmVudERlZmF1bHQ6IGZ1bmN0aW9uKCl7fSwgc3RvcFByb3BhZ2F0aW9uOiBmdW5jdGlvbigpe30KICAgIH07CiAgfQoKICBmdW5jdGlvbiBzaW0obmFtZSwgc3RhcnQgLyosIGFjdGlvbnMuLi4gKi8pIHsKICAgIHZhciBrZXlzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAyKTsKICAgIHRlc3RDTShuYW1lLCBmdW5jdGlvbihjbSkgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyArK2kpIHsKICAgICAgICB2YXIgY3VyID0ga2V5c1tpXTsKICAgICAgICBpZiAoY3VyIGluc3RhbmNlb2YgUG9zKSBjbS5zZXRDdXJzb3IoY3VyKTsKICAgICAgICBlbHNlIGlmIChjdXIuY2FsbCkgY3VyKGNtKTsKICAgICAgICBlbHNlIGNtLnRyaWdnZXJPbktleURvd24oZmFrZUV2ZW50KGN1cikpOwogICAgICB9CiAgICB9LCB7a2V5TWFwOiAiZW1hY3MiLCB2YWx1ZTogc3RhcnQsIG1vZGU6ICJqYXZhc2NyaXB0In0pOwogIH0KCiAgZnVuY3Rpb24gYXQobGluZSwgY2gpIHsgcmV0dXJuIGZ1bmN0aW9uKGNtKSB7IGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MobGluZSwgY2gpKTsgfTsgfQogIGZ1bmN0aW9uIHR4dChzdHIpIHsgcmV0dXJuIGZ1bmN0aW9uKGNtKSB7IGVxKGNtLmdldFZhbHVlKCksIHN0cik7IH07IH0KCiAgc2ltKCJtb3Rpb25IU2ltcGxlIiwgImFiYyIsICJDdHJsLUYiLCAiQ3RybC1GIiwgIkN0cmwtQiIsIGF0KDAsIDEpKTsKICBzaW0oIm1vdGlvbkhNdWx0aSIsICJhYmNkZSIsCiAgICAgICJDdHJsLTQiLCAiQ3RybC1GIiwgYXQoMCwgNCksICJDdHJsLS0iLCAiQ3RybC0yIiwgIkN0cmwtRiIsIGF0KDAsIDIpLAogICAgICAiQ3RybC01IiwgIkN0cmwtQiIsIGF0KDAsIDApKTsKCiAgc2ltKCJtb3Rpb25IV29yZCIsICJhYmMuIGRlZiBnaGkiLAogICAgICAiQWx0LUYiLCBhdCgwLCAzKSwgIkFsdC1GIiwgYXQoMCwgOCksCiAgICAgICJDdHJsLUIiLCAiQWx0LUIiLCBhdCgwLCA1KSwgIkFsdC1CIiwgYXQoMCwgMCkpOwogIHNpbSgibW90aW9uSFdvcmRNdWx0aSIsICJhYmMuIGRlZiBnaGkgIiwKICAgICAgIkN0cmwtMyIsICJBbHQtRiIsIGF0KDAsIDEyKSwgIkN0cmwtMiIsICJBbHQtQiIsIGF0KDAsIDUpLAogICAgICAiQ3RybC0tIiwgIkFsdC1CIiwgYXQoMCwgOCkpOwoKICBzaW0oIm1vdGlvblZTaW1wbGUiLCAiYVxuYlxuY1xuIiwgIkN0cmwtTiIsICJDdHJsLU4iLCAiQ3RybC1QIiwgYXQoMSwgMCkpOwogIHNpbSgibW90aW9uVk11bHRpIiwgImFcbmJcbmNcbmRcbmVcbiIsCiAgICAgICJDdHJsLTIiLCAiQ3RybC1OIiwgYXQoMiwgMCksICJDdHJsLUYiLCAiQ3RybC0tIiwgIkN0cmwtTiIsIGF0KDEsIDEpLAogICAgICAiQ3RybC0tIiwgIkN0cmwtMyIsICJDdHJsLVAiLCBhdCg0LCAxKSk7CgogIHNpbSgia2lsbFlhbmsiLCAiYWJjXG5kZWZcbmdoaSIsCiAgICAgICJDdHJsLUYiLCAiQ3RybC1TcGFjZSIsICJDdHJsLU4iLCAiQ3RybC1OIiwgIkN0cmwtVyIsICJDdHJsLUUiLCAiQ3RybC1ZIiwKICAgICAgdHh0KCJhaGliY1xuZGVmXG5nIikpOwogIHNpbSgia2lsbFJpbmciLCAiYWJjZGVmIiwKICAgICAgIkN0cmwtU3BhY2UiLCAiQ3RybC1GIiwgIkN0cmwtVyIsICJDdHJsLVNwYWNlIiwgIkN0cmwtRiIsICJDdHJsLVciLAogICAgICAiQ3RybC1ZIiwgIkFsdC1ZIiwKICAgICAgdHh0KCJhY2RlZiIpKTsKICBzaW0oImNvcHlZYW5rIiwgImFiY2QiLAogICAgICAiQ3RybC1TcGFjZSIsICJDdHJsLUUiLCAiQWx0LVciLCAiQ3RybC1ZIiwKICAgICAgdHh0KCJhYmNkYWJjZCIpKTsKCiAgc2ltKCJraWxsTGluZVNpbXBsZSIsICJmb29cbmJhciIsICJDdHJsLUYiLCAiQ3RybC1LIiwgdHh0KCJmXG5iYXIiKSk7CiAgc2ltKCJraWxsTGluZUVtcHR5TGluZSIsICJmb29cbiAgXG5iYXIiLCAiQ3RybC1OIiwgIkN0cmwtSyIsIHR4dCgiZm9vXG5iYXIiKSk7CiAgc2ltKCJraWxsTGluZU11bHRpIiwgImZvb1xuYmFyXG5iYXoiLAogICAgICAiQ3RybC1GIiwgIkN0cmwtRiIsICJDdHJsLUsiLCAiQ3RybC1LIiwgIkN0cmwtSyIsICJDdHJsLUEiLCAiQ3RybC1ZIiwKICAgICAgdHh0KCJvXG5iYXJmb1xuYmF6IikpOwoKICBzaW0oIm1vdmVCeVBhcmFncmFwaCIsICJhYmNcbmRlZlxuXG5cbmhpalxua2xtXG5cbiIsCiAgICAgICJDdHJsLUYiLCAiQ3RybC1Eb3duIiwgYXQoMiwgMCksICJDdHJsLURvd24iLCBhdCg2LCAwKSwKICAgICAgIkN0cmwtTiIsICJDdHJsLVVwIiwgYXQoMywgMCksICJDdHJsLVVwIiwgYXQoMCwgMCksCiAgICAgIFBvcygxLCAyKSwgIkN0cmwtRG93biIsIGF0KDIsIDApLCBQb3MoNCwgMiksICJDdHJsLVVwIiwgYXQoMywgMCkpOwogIHNpbSgibW92ZUJ5UGFyYWdyYXBoTXVsdGkiLCAiYWJjXG5cbmRlZlxuXG5oaWpcblxua2xtIiwKICAgICAgIkN0cmwtVSIsICIyIiwgIkN0cmwtRG93biIsIGF0KDMsIDApLAogICAgICAiU2hpZnQtQWx0LS4iLCAiQ3RybC0zIiwgIkN0cmwtVXAiLCBhdCgxLCAwKSk7CgogIHNpbSgibW92ZUJ5U2VudGVuY2UiLCAic2VudGVuY2Ugb25lISBzZW50ZW5jZVxudHdvXG5cbnBhcmFncmFwaCB0d28iLAogICAgICAiQWx0LUUiLCBhdCgwLCAxMyksICJBbHQtRSIsIGF0KDEsIDMpLCAiQ3RybC1GIiwgIkFsdC1BIiwgYXQoMCwgMTMpKTsKCiAgc2ltKCJtb3ZlQnlFeHByIiwgImZ1bmN0aW9uIGZvbyhhLCBiKSB7fSIsCiAgICAgICJDdHJsLUFsdC1GIiwgYXQoMCwgOCksICJDdHJsLUFsdC1GIiwgYXQoMCwgMTIpLCAiQ3RybC1BbHQtRiIsIGF0KDAsIDE4KSwKICAgICAgIkN0cmwtQWx0LUIiLCBhdCgwLCAxMiksICJDdHJsLUFsdC1CIiwgYXQoMCwgOSkpOwogIHNpbSgibW92ZUJ5RXhwck11bHRpIiwgImZvbyBiYXIgYmF6IGJ1ZyIsCiAgICAgICJDdHJsLTIiLCAiQ3RybC1BbHQtRiIsIGF0KDAsIDcpLAogICAgICAiQ3RybC0tIiwgIkN0cmwtQWx0LUYiLCBhdCgwLCA0KSwKICAgICAgIkN0cmwtLSIsICJDdHJsLTIiLCAiQ3RybC1BbHQtQiIsIGF0KDAsIDExKSk7CiAgc2ltKCJkZWxFeHByIiwgInZhciB4ID0gW1xuICBhLFxuICBiXG4gIGNcbl07IiwKICAgICAgUG9zKDAsIDgpLCAiQ3RybC1BbHQtSyIsIHR4dCgidmFyIHggPSA7IiksICJDdHJsLS8iLAogICAgICBQb3MoNCwgMSksICJDdHJsLUFsdC1CYWNrc3BhY2UiLCB0eHQoInZhciB4ID0gOyIpKTsKICBzaW0oImRlbEV4cHJNdWx0aSIsICJmb28gYmFyIGJheiIsCiAgICAgICJDdHJsLTIiLCAiQ3RybC1BbHQtSyIsIHR4dCgiIGJheiIpLAogICAgICAiQ3RybC0vIiwgIkN0cmwtRSIsICJDdHJsLTIiLCAiQ3RybC1BbHQtQmFja3NwYWNlIiwgdHh0KCJmb28gIikpOwoKICBzaW0oImp1c3RPbmVTcGFjZSIsICJoaSAgICAgIGJ5ZSAgIiwKICAgICAgUG9zKDAsIDQpLCAiQWx0LVNwYWNlIiwgdHh0KCJoaSBieWUgICIpLAogICAgICBQb3MoMCwgNCksICJBbHQtU3BhY2UiLCB0eHQoImhpIGIgeWUgICIpLAogICAgICAiQ3RybC1BIiwgIkFsdC1TcGFjZSIsICJDdHJsLUUiLCAiQWx0LVNwYWNlIiwgdHh0KCIgaGkgYiB5ZSAiKSk7CgogIHNpbSgib3BlbkxpbmUiLCAiZm9vIGJhciIsICJBbHQtRiIsICJDdHJsLU8iLCB0eHQoImZvb1xuIGJhciIpKQoKICBzaW0oInRyYW5zcG9zZUNoYXIiLCAiYWJjZFxuZSIsCiAgICAgICJDdHJsLUYiLCAiQ3RybC1UIiwgIkN0cmwtVCIsIHR4dCgiYmNhZFxuZSIpLCBhdCgwLCAzKSwKICAgICAgIkN0cmwtRiIsICJDdHJsLVQiLCAiQ3RybC1UIiwgIkN0cmwtVCIsIHR4dCgiYmNkYVxuZSIpLCBhdCgwLCA0KSwKICAgICAgIkN0cmwtRiIsICJDdHJsLVQiLCB0eHQoImJjZGVcbmEiKSwgYXQoMSwgMCkpOwoKICBzaW0oIm1hbmlwV29yZENhc2UiLCAiZm9vIEJBUiBiQVoiLAogICAgICAiQWx0LUMiLCAiQWx0LUwiLCAiQWx0LVUiLCB0eHQoIkZvbyBiYXIgQkFaIiksCiAgICAgICJDdHJsLUEiLCAiQWx0LVUiLCAiQWx0LUwiLCAiQWx0LUMiLCB0eHQoIkZPTyBiYXIgQmF6IikpOwogIHNpbSgibWFuaXBXb3JkQ2FzZU11bHRpIiwgImZvbyBCYXIgYkF6IiwKICAgICAgIkN0cmwtMiIsICJBbHQtVSIsIHR4dCgiRk9PIEJBUiBiQXoiKSwKICAgICAgIkN0cmwtQSIsICJDdHJsLTMiLCAiQWx0LUMiLCB0eHQoIkZvbyBCYXIgQmF6IikpOwoKICBzaW0oInVwRXhwciIsICJmb28ge1xuICBiYXJbXTtcbiAgYmF6KGJsYWgpO1xufSIsCiAgICAgIFBvcygyLCA3KSwgIkN0cmwtQWx0LVUiLCBhdCgyLCA1KSwgIkN0cmwtQWx0LVUiLCBhdCgwLCA0KSk7CiAgc2ltKCJ0cmFuc3Bvc2VFeHByIiwgImRvIGZvb1tiYXJdIGRhaCIsCiAgICAgIFBvcygwLCA2KSwgIkN0cmwtQWx0LVQiLCB0eHQoImRvIFtiYXJdZm9vIGRhaCIpKTsKCiAgc2ltKCJjbGVhck1hcmsiLCAiYWJjZGUiLCBQb3MoMCwgMiksICJDdHJsLVNwYWNlIiwgIkN0cmwtRiIsICJDdHJsLUYiLAogICAgICAiQ3RybC1HIiwgIkN0cmwtVyIsIHR4dCgiYWJjZGUiKSk7CgogIHRlc3RDTSgic2F2ZSIsIGZ1bmN0aW9uKGNtKSB7CiAgICB2YXIgc2F2ZWQgPSBmYWxzZTsKICAgIENvZGVNaXJyb3IuY29tbWFuZHMuc2F2ZSA9IGZ1bmN0aW9uKGNtKSB7IHNhdmVkID0gY20uZ2V0VmFsdWUoKTsgfTsKICAgIGNtLnRyaWdnZXJPbktleURvd24oZmFrZUV2ZW50KCJDdHJsLVgiKSk7CiAgICBjbS50cmlnZ2VyT25LZXlEb3duKGZha2VFdmVudCgiQ3RybC1TIikpOwogICAgaXMoc2F2ZWQsICJoaSIpOwogIH0sIHt2YWx1ZTogImhpIiwga2V5TWFwOiAiZW1hY3MifSk7Cn0pKCk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/test/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogVGVzdCBTdWl0ZTwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0ibW9kZV90ZXN0LmNzcyI+CjxzY3JpcHQgc3JjPSIuLi9kb2MvYWN0aXZlYm9va21hcmsuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vYWRkb24vbW9kZS9vdmVybGF5LmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL2FkZG9uL21vZGUvbXVsdGlwbGV4LmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL2FkZG9uL3NlYXJjaC9zZWFyY2hjdXJzb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vYWRkb24vZGlhbG9nL2RpYWxvZy5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9hZGRvbi9lZGl0L21hdGNoYnJhY2tldHMuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vYWRkb24vY29tbWVudC9jb21tZW50LmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL21vZGUvamF2YXNjcmlwdC9qYXZhc2NyaXB0LmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL21vZGUvY2xpa2UvY2xpa2UuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vbW9kZS9waHAvcGhwLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL21vZGUveG1sL3htbC5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9rZXltYXAvdmltLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL2tleW1hcC9lbWFjcy5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9rZXltYXAvc3VibGltZS5qcyI+PC9zY3JpcHQ+Cgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgogIC5vayB7Y29sb3I6ICMwOTA7fQogIC5mYWlsIHtjb2xvcjogI2UwMDt9CiAgLmVycm9yIHtjb2xvcjogI2M5MDt9CiAgLmRvbmUge2ZvbnQtd2VpZ2h0OiBib2xkO30KICAjcHJvZ3Jlc3MgewogIGJhY2tncm91bmQ6ICM0NWQ7CiAgY29sb3I6IHdoaXRlOwogIHRleHQtc2hhZG93OiAwIDAgMXB4ICM0NWQsIDAgMCAycHggIzQ1ZCwgMCAwIDNweCAjNDVkOwogIGZvbnQtd2VpZ2h0OiBib2xkOwogIHdoaXRlLXNwYWNlOiBwcmU7CiAgfQogICN0ZXN0Z3JvdW5kIHsKICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgfQogICN0ZXN0Z3JvdW5kLm9mZnNjcmVlbiB7CiAgdmlzaWJpbGl0eTogdmlzaWJsZTsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgbGVmdDogLTEwMDAwcHg7CiAgdG9wOiAtMTAwMDBweDsKICB9CiAgLkNvZGVNaXJyb3IgeyBib3JkZXI6IDFweCBzb2xpZCBibGFjazsgfQo8L3N0eWxlPgoKPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aW1nIGlkPWxvZ28gc3JjPSIuLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+VGVzdCBzdWl0ZTwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgogIDxoMj5UZXN0IFN1aXRlPC9oMj4KCiAgICA8cD5BIGxpbWl0ZWQgc2V0IG9mIHByb2dyYW1tYXRpYyBzYW5pdHkgdGVzdHMgZm9yIENvZGVNaXJyb3IuPC9wPgoKICAgIDxkaXYgc3R5bGU9ImJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOyBwYWRkaW5nOiAxcHg7IG1heC13aWR0aDogNzAwcHg7Ij4KICAgICAgPGRpdiBzdHlsZT0id2lkdGg6IDBweDsiIGlkPXByb2dyZXNzPjxkaXYgc3R5bGU9InBhZGRpbmc6IDNweDsiPlJhbiA8c3BhbiBpZD0icHJvZ3Jlc3NfcmFuIj4wPC9zcGFuPjxzcGFuIGlkPSJwcm9ncmVzc190b3RhbCI+IG9mIDA8L3NwYW4+IHRlc3RzPC9kaXY+PC9kaXY+CiAgICA8L2Rpdj4KICAgIDxwIGlkPXN0YXR1cz5QbGVhc2UgZW5hYmxlIEphdmFTY3JpcHQuLi48L3A+CiAgICA8ZGl2IGlkPW91dHB1dD48L2Rpdj4KCiAgICA8ZGl2IGlkPXRlc3Rncm91bmQ+PC9kaXY+CgogICAgPHNjcmlwdCBzcmM9ImRyaXZlci5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0idGVzdC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iZG9jX3Rlc3QuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Im11bHRpX3Rlc3QuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImNvbW1lbnRfdGVzdC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0ic2VhcmNoX3Rlc3QuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Im1vZGVfdGVzdC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iLi4vbW9kZS9qYXZhc2NyaXB0L3Rlc3QuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Ii4uL21vZGUvcGhwL3Rlc3QuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Ii4uL21vZGUvY3NzL2Nzcy5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iLi4vbW9kZS9jc3MvdGVzdC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iLi4vbW9kZS9jc3Mvc2Nzc190ZXN0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSIuLi9tb2RlL2Nzcy9sZXNzX3Rlc3QuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Ii4uL21vZGUveG1sL3htbC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iLi4vbW9kZS94bWwvdGVzdC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iLi4vbW9kZS9odG1sbWl4ZWQvaHRtbG1peGVkLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSIuLi9tb2RlL3J1YnkvcnVieS5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iLi4vbW9kZS9ydWJ5L3Rlc3QuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Ii4uL21vZGUvaGFtbC9oYW1sLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSIuLi9tb2RlL2hhbWwvdGVzdC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iLi4vbW9kZS9tYXJrZG93bi9tYXJrZG93bi5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iLi4vbW9kZS9tYXJrZG93bi90ZXN0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSIuLi9tb2RlL2dmbS9nZm0uanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Ii4uL21vZGUvZ2ZtL3Rlc3QuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Ii4uL21vZGUvc2hlbGwvc2hlbGwuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Ii4uL21vZGUvc2hlbGwvdGVzdC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iLi4vbW9kZS9zdGV4L3N0ZXguanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Ii4uL21vZGUvc3RleC90ZXN0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSIuLi9tb2RlL3Zlcmlsb2cvdmVyaWxvZy5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iLi4vbW9kZS92ZXJpbG9nL3Rlc3QuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Ii4uL21vZGUveHF1ZXJ5L3hxdWVyeS5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iLi4vbW9kZS94cXVlcnkvdGVzdC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iLi4vYWRkb24vbW9kZS9tdWx0aXBsZXhfdGVzdC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0idmltX3Rlc3QuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9ImVtYWNzX3Rlc3QuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9InN1YmxpbWVfdGVzdC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0PgogICAgICB3aW5kb3cub25sb2FkID0gcnVuSGFybmVzczsKICAgICAgQ29kZU1pcnJvci5vbih3aW5kb3csICdoYXNoY2hhbmdlJywgcnVuSGFybmVzcyk7CgogICAgICBmdW5jdGlvbiBlc2Moc3RyKSB7CiAgICAgICAgcmV0dXJuIHN0ci5yZXBsYWNlKC9bPCZdLywgZnVuY3Rpb24oY2gpIHsgcmV0dXJuIGNoID09ICI8IiA/ICImbHQ7IiA6ICImYW1wOyI7IH0pOwogICAgICB9CgogICAgICB2YXIgb3V0cHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm91dHB1dCIpLAogICAgICAgICAgcHJvZ3Jlc3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicHJvZ3Jlc3MiKSwKICAgICAgICAgIHByb2dyZXNzUmFuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInByb2dyZXNzX3JhbiIpLmNoaWxkTm9kZXNbMF0sCiAgICAgICAgICBwcm9ncmVzc1RvdGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInByb2dyZXNzX3RvdGFsIikuY2hpbGROb2Rlc1swXTsKICAgICAgdmFyIGNvdW50ID0gMCwKICAgICAgICAgIGZhaWxlZCA9IDAsCiAgICAgICAgICBza2lwcGVkID0gMCwKICAgICAgICAgIGJhZCA9ICIiLAogICAgICAgICAgcnVubmluZyA9IGZhbHNlLCAvLyBGbGFnIHRoYXQgc3RhdGVzIHRlc3RzIGFyZSBydW5uaW5nCiAgICAgICAgICBxdWl0ID0gZmFsc2UsIC8vIEZsYWcgdG8gcXVpdCB0ZXN0cyBBU0FQCiAgICAgICAgICB2ZXJib3NlID0gZmFsc2U7IC8vIEFkZHMgbWVzc2FnZSBmb3IgKmV2ZXJ5KiB0ZXN0IHRvIG91dHB1dAoKICAgICAgZnVuY3Rpb24gcnVuSGFybmVzcygpewogICAgICAgIGlmIChydW5uaW5nKSB7CiAgICAgICAgICBxdWl0ID0gdHJ1ZTsKICAgICAgICAgIHNldFN0YXR1cygiUmVzdGFydGluZyB0ZXN0cy4uLiIsICcnLCB0cnVlKTsKICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXtydW5IYXJuZXNzKCk7fSwgNTAwKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgZmlsdGVycyA9IFtdOwogICAgICAgIHZlcmJvc2UgPSBmYWxzZTsKICAgICAgICBpZiAod2luZG93LmxvY2F0aW9uLmhhc2guc3Vic3RyKDEpKXsKICAgICAgICAgIHZhciBzdHJpbmdzID0gd2luZG93LmxvY2F0aW9uLmhhc2guc3Vic3RyKDEpLnNwbGl0KCIsIik7CiAgICAgICAgICB3aGlsZSAoc3RyaW5ncy5sZW5ndGgpIHsKICAgICAgICAgICAgdmFyIHMgPSBzdHJpbmdzLnNoaWZ0KCk7CiAgICAgICAgICAgIGlmIChzID09PSAidmVyYm9zZSIpCiAgICAgICAgICAgICAgdmVyYm9zZSA9IHRydWU7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICBmaWx0ZXJzLnB1c2gocGFyc2VUZXN0RmlsdGVyKGRlY29kZVVSSUNvbXBvbmVudChzKSkpOzsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcXVpdCA9IGZhbHNlOwogICAgICAgIHJ1bm5pbmcgPSB0cnVlOwogICAgICAgIHNldFN0YXR1cygiTG9hZGluZyB0ZXN0cy4uLiIpOwogICAgICAgIGNvdW50ID0gMDsKICAgICAgICBmYWlsZWQgPSAwOwogICAgICAgIHNraXBwZWQgPSAwOwogICAgICAgIGJhZCA9ICIiOwogICAgICAgIHRvdGFsVGVzdHMgPSBjb3VudFRlc3RzKCk7CiAgICAgICAgcHJvZ3Jlc3NUb3RhbC5ub2RlVmFsdWUgPSAiIG9mICIgKyB0b3RhbFRlc3RzOwogICAgICAgIHByb2dyZXNzUmFuLm5vZGVWYWx1ZSA9IGNvdW50OwogICAgICAgIG91dHB1dC5pbm5lckhUTUwgPSAnJzsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidGVzdGdyb3VuZCIpLmlubmVySFRNTCA9ICI8Zm9ybT4iICsKICAgICAgICAgICI8dGV4dGFyZWEgaWQ9XCJjb2RlXCIgbmFtZT1cImNvZGVcIj48L3RleHRhcmVhPiIgKwogICAgICAgICAgIjxpbnB1dCB0eXBlPXN1Ym1pdCB2YWx1ZT1vayBuYW1lPXN1Ym1pdD4iICsKICAgICAgICAgICI8L2Zvcm0+IjsKICAgICAgICBydW5UZXN0cyhkaXNwbGF5VGVzdCk7CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHNldFN0YXR1cyhtZXNzYWdlLCBjbGFzc05hbWUsIGZvcmNlKXsKICAgICAgICBpZiAocXVpdCAmJiAhZm9yY2UpIHJldHVybjsKICAgICAgICBpZiAoIW1lc3NhZ2UpIHRocm93KCJtdXN0IHByb3ZpZGUgbWVzc2FnZSIpOwogICAgICAgIHZhciBzdGF0dXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic3RhdHVzIikuY2hpbGROb2Rlc1swXTsKICAgICAgICBzdGF0dXMubm9kZVZhbHVlID0gbWVzc2FnZTsKICAgICAgICBzdGF0dXMucGFyZW50Tm9kZS5jbGFzc05hbWUgPSBjbGFzc05hbWU7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gYWRkT3V0cHV0KG5hbWUsIGNsYXNzTmFtZSwgY29kZSl7CiAgICAgICAgdmFyIG5ld091dHB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRsIik7CiAgICAgICAgdmFyIG5ld1RpdGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZHQiKTsKICAgICAgICBuZXdUaXRsZS5jbGFzc05hbWUgPSBjbGFzc05hbWU7CiAgICAgICAgbmV3VGl0bGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobmFtZSkpOwogICAgICAgIG5ld091dHB1dC5hcHBlbmRDaGlsZChuZXdUaXRsZSk7CiAgICAgICAgdmFyIG5ld01lc3NhZ2UgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkZCIpOwogICAgICAgIG5ld01lc3NhZ2UuaW5uZXJIVE1MID0gY29kZTsKICAgICAgICBuZXdPdXRwdXQuYXBwZW5kQ2hpbGQobmV3VGl0bGUpOwogICAgICAgIG5ld091dHB1dC5hcHBlbmRDaGlsZChuZXdNZXNzYWdlKTsKICAgICAgICBvdXRwdXQuYXBwZW5kQ2hpbGQobmV3T3V0cHV0KTsKICAgICAgfQogICAgICBmdW5jdGlvbiBkaXNwbGF5VGVzdCh0eXBlLCBuYW1lLCBjdXN0b21NZXNzYWdlKSB7CiAgICAgICAgdmFyIG1lc3NhZ2UgPSAiPz8/IjsKICAgICAgICBpZiAodHlwZSAhPSAiZG9uZSIgJiYgdHlwZSAhPSAic2tpcHBlZCIpICsrY291bnQ7CiAgICAgICAgcHJvZ3Jlc3Muc3R5bGUud2lkdGggPSAoY291bnQgKiAocHJvZ3Jlc3MucGFyZW50Tm9kZS5jbGllbnRXaWR0aCAtIDIpIC8gdG90YWxUZXN0cykgKyAicHgiOwogICAgICAgIHByb2dyZXNzUmFuLm5vZGVWYWx1ZSA9IGNvdW50OwogICAgICAgIGlmICh0eXBlID09ICJvayIpIHsKICAgICAgICAgIG1lc3NhZ2UgPSAiVGVzdCAnIiArIG5hbWUgKyAiJyBzdWNjZWVkZWQiOwogICAgICAgICAgaWYgKCF2ZXJib3NlKSBjdXN0b21NZXNzYWdlID0gZmFsc2U7CiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09ICJza2lwcGVkIikgewogICAgICAgICAgbWVzc2FnZSA9ICJUZXN0ICciICsgbmFtZSArICInIHNraXBwZWQiOwogICAgICAgICAgKytza2lwcGVkOwogICAgICAgICAgaWYgKCF2ZXJib3NlKSBjdXN0b21NZXNzYWdlID0gZmFsc2U7CiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09ICJleHBlY3RlZCIpIHsKICAgICAgICAgIG1lc3NhZ2UgPSAiVGVzdCAnIiArIG5hbWUgKyAiJyBmYWlsZWQgYXMgZXhwZWN0ZWQiOwogICAgICAgICAgaWYgKCF2ZXJib3NlKSBjdXN0b21NZXNzYWdlID0gZmFsc2U7CiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09ICJlcnJvciIgfHwgdHlwZSA9PSAiZmFpbCIpIHsKICAgICAgICAgICsrZmFpbGVkOwogICAgICAgICAgbWVzc2FnZSA9ICJUZXN0ICciICsgbmFtZSArICInIGZhaWxlZCI7CiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09ICJkb25lIikgewogICAgICAgICAgaWYgKGZhaWxlZCkgewogICAgICAgICAgICB0eXBlICs9ICIgZmFpbCI7CiAgICAgICAgICAgIG1lc3NhZ2UgPSBmYWlsZWQgKyAiIGZhaWx1cmUiICsgKGZhaWxlZCA+IDEgPyAicyIgOiAiIik7CiAgICAgICAgICB9IGVsc2UgaWYgKGNvdW50IDwgdG90YWxUZXN0cykgewogICAgICAgICAgICBmYWlsZWQgPSB0b3RhbFRlc3RzIC0gY291bnQ7CiAgICAgICAgICAgIHR5cGUgKz0gIiBmYWlsIjsKICAgICAgICAgICAgbWVzc2FnZSA9IGZhaWxlZCArICIgZmFpbHVyZSIgKyAoZmFpbGVkID4gMSA/ICJzIiA6ICIiKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHR5cGUgKz0gIiBvayI7CiAgICAgICAgICAgIG1lc3NhZ2UgPSAiQWxsIHBhc3NlZCI7CiAgICAgICAgICAgIGlmIChza2lwcGVkKSB7CiAgICAgICAgICAgICAgbWVzc2FnZSArPSAiICgiICsgc2tpcHBlZCArICIgc2tpcHBlZCkiOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBwcm9ncmVzc1RvdGFsLm5vZGVWYWx1ZSA9ICcnOwogICAgICAgICAgY3VzdG9tTWVzc2FnZSA9IHRydWU7IC8vIEhhY2sgdG8gYXZvaWQgYWRkaW5nIHRvIG91dHB1dAogICAgICAgIH0KICAgICAgICBpZiAodmVyYm9zZSAmJiAhY3VzdG9tTWVzc2FnZSkgIGN1c3RvbU1lc3NhZ2UgPSBtZXNzYWdlOwogICAgICAgIHNldFN0YXR1cyhtZXNzYWdlLCB0eXBlKTsKICAgICAgICBpZiAoY3VzdG9tTWVzc2FnZSAmJiBjdXN0b21NZXNzYWdlLmxlbmd0aCA+IDApIHsKICAgICAgICAgIGFkZE91dHB1dChuYW1lLCB0eXBlLCBjdXN0b21NZXNzYWdlKTsKICAgICAgICB9CiAgICAgIH0KICAgIDwvc2NyaXB0PgoKPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/test/lint/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/test/lint/acorn.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQWNvcm4gaXMgYSB0aW55LCBmYXN0IEphdmFTY3JpcHQgcGFyc2VyIHdyaXR0ZW4gaW4gSmF2YVNjcmlwdC4KLy8KLy8gQWNvcm4gd2FzIHdyaXR0ZW4gYnkgTWFyaWpuIEhhdmVyYmVrZSBhbmQgcmVsZWFzZWQgdW5kZXIgYW4gTUlUCi8vIGxpY2Vuc2UuIFRoZSBVbmljb2RlIHJlZ2V4cHMgKGZvciBpZGVudGlmaWVycyBhbmQgd2hpdGVzcGFjZSkgd2VyZQovLyB0YWtlbiBmcm9tIFtFc3ByaW1hXShodHRwOi8vZXNwcmltYS5vcmcpIGJ5IEFyaXlhIEhpZGF5YXQuCi8vCi8vIEdpdCByZXBvc2l0b3JpZXMgZm9yIEFjb3JuIGFyZSBhdmFpbGFibGUgYXQKLy8KLy8gICAgIGh0dHA6Ly9tYXJpam5oYXZlcmJla2UubmwvZ2l0L2Fjb3JuCi8vICAgICBodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9hY29ybi5naXQKLy8KLy8gUGxlYXNlIHVzZSB0aGUgW2dpdGh1YiBidWcgdHJhY2tlcl1bZ2hidF0gdG8gcmVwb3J0IGlzc3Vlcy4KLy8KLy8gW2doYnRdOiBodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9hY29ybi9pc3N1ZXMKLy8KLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIG1haW4gcGFyc2VyIGludGVyZmFjZS4gVGhlIGxpYnJhcnkgYWxzbyBjb21lcwovLyB3aXRoIGEgW2Vycm9yLXRvbGVyYW50IHBhcnNlcl1bZGFtbWl0XSBhbmQgYW4KLy8gW2Fic3RyYWN0IHN5bnRheCB0cmVlIHdhbGtlcl1bd2Fsa10sIGRlZmluZWQgaW4gb3RoZXIgZmlsZXMuCi8vCi8vIFtkYW1taXRdOiBhY29ybl9sb29zZS5qcwovLyBbd2Fsa106IHV0aWwvd2Fsay5qcwoKKGZ1bmN0aW9uKHJvb3QsIG1vZCkgewogIGlmICh0eXBlb2YgZXhwb3J0cyA9PSAib2JqZWN0IiAmJiB0eXBlb2YgbW9kdWxlID09ICJvYmplY3QiKSByZXR1cm4gbW9kKGV4cG9ydHMpOyAvLyBDb21tb25KUwogIGlmICh0eXBlb2YgZGVmaW5lID09ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCkgcmV0dXJuIGRlZmluZShbImV4cG9ydHMiXSwgbW9kKTsgLy8gQU1ECiAgbW9kKHJvb3QuYWNvcm4gfHwgKHJvb3QuYWNvcm4gPSB7fSkpOyAvLyBQbGFpbiBicm93c2VyIGVudgp9KSh0aGlzLCBmdW5jdGlvbihleHBvcnRzKSB7CiAgInVzZSBzdHJpY3QiOwoKICBleHBvcnRzLnZlcnNpb24gPSAiMC40LjEiOwoKICAvLyBUaGUgbWFpbiBleHBvcnRlZCBpbnRlcmZhY2UgKHVuZGVyIGBzZWxmLmFjb3JuYCB3aGVuIGluIHRoZQogIC8vIGJyb3dzZXIpIGlzIGEgYHBhcnNlYCBmdW5jdGlvbiB0aGF0IHRha2VzIGEgY29kZSBzdHJpbmcgYW5kCiAgLy8gcmV0dXJucyBhbiBhYnN0cmFjdCBzeW50YXggdHJlZSBhcyBzcGVjaWZpZWQgYnkgW01vemlsbGEgcGFyc2VyCiAgLy8gQVBJXVthcGldLCB3aXRoIHRoZSBjYXZlYXQgdGhhdCB0aGUgU3BpZGVyTW9ua2V5LXNwZWNpZmljIHN5bnRheAogIC8vIChgbGV0YCwgYHlpZWxkYCwgaW5saW5lIFhNTCwgZXRjKSBpcyBub3QgcmVjb2duaXplZC4KICAvLwogIC8vIFthcGldOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1NwaWRlck1vbmtleS9QYXJzZXJfQVBJCgogIHZhciBvcHRpb25zLCBpbnB1dCwgaW5wdXRMZW4sIHNvdXJjZUZpbGU7CgogIGV4cG9ydHMucGFyc2UgPSBmdW5jdGlvbihpbnB0LCBvcHRzKSB7CiAgICBpbnB1dCA9IFN0cmluZyhpbnB0KTsgaW5wdXRMZW4gPSBpbnB1dC5sZW5ndGg7CiAgICBzZXRPcHRpb25zKG9wdHMpOwogICAgaW5pdFRva2VuU3RhdGUoKTsKICAgIHJldHVybiBwYXJzZVRvcExldmVsKG9wdGlvbnMucHJvZ3JhbSk7CiAgfTsKCiAgLy8gQSBzZWNvbmQgb3B0aW9uYWwgYXJndW1lbnQgY2FuIGJlIGdpdmVuIHRvIGZ1cnRoZXIgY29uZmlndXJlCiAgLy8gdGhlIHBhcnNlciBwcm9jZXNzLiBUaGVzZSBvcHRpb25zIGFyZSByZWNvZ25pemVkOgoKICB2YXIgZGVmYXVsdE9wdGlvbnMgPSBleHBvcnRzLmRlZmF1bHRPcHRpb25zID0gewogICAgLy8gYGVjbWFWZXJzaW9uYCBpbmRpY2F0ZXMgdGhlIEVDTUFTY3JpcHQgdmVyc2lvbiB0byBwYXJzZS4gTXVzdAogICAgLy8gYmUgZWl0aGVyIDMgb3IgNS4gVGhpcwogICAgLy8gaW5mbHVlbmNlcyBzdXBwb3J0IGZvciBzdHJpY3QgbW9kZSwgdGhlIHNldCBvZiByZXNlcnZlZCB3b3JkcywgYW5kCiAgICAvLyBzdXBwb3J0IGZvciBnZXR0ZXJzIGFuZCBzZXR0ZXIuCiAgICBlY21hVmVyc2lvbjogNSwKICAgIC8vIFR1cm4gb24gYHN0cmljdFNlbWljb2xvbnNgIHRvIHByZXZlbnQgdGhlIHBhcnNlciBmcm9tIGRvaW5nCiAgICAvLyBhdXRvbWF0aWMgc2VtaWNvbG9uIGluc2VydGlvbi4KICAgIHN0cmljdFNlbWljb2xvbnM6IGZhbHNlLAogICAgLy8gV2hlbiBgYWxsb3dUcmFpbGluZ0NvbW1hc2AgaXMgZmFsc2UsIHRoZSBwYXJzZXIgd2lsbCBub3QgYWxsb3cKICAgIC8vIHRyYWlsaW5nIGNvbW1hcyBpbiBhcnJheSBhbmQgb2JqZWN0IGxpdGVyYWxzLgogICAgYWxsb3dUcmFpbGluZ0NvbW1hczogdHJ1ZSwKICAgIC8vIEJ5IGRlZmF1bHQsIHJlc2VydmVkIHdvcmRzIGFyZSBub3QgZW5mb3JjZWQuIEVuYWJsZQogICAgLy8gYGZvcmJpZFJlc2VydmVkYCB0byBlbmZvcmNlIHRoZW0uIFdoZW4gdGhpcyBvcHRpb24gaGFzIHRoZQogICAgLy8gdmFsdWUgImV2ZXJ5d2hlcmUiLCByZXNlcnZlZCB3b3JkcyBhbmQga2V5d29yZHMgY2FuIGFsc28gbm90IGJlCiAgICAvLyB1c2VkIGFzIHByb3BlcnR5IG5hbWVzLgogICAgZm9yYmlkUmVzZXJ2ZWQ6IGZhbHNlLAogICAgLy8gV2hlbiBlbmFibGVkLCBhIHJldHVybiBhdCB0aGUgdG9wIGxldmVsIGlzIG5vdCBjb25zaWRlcmVkIGFuCiAgICAvLyBlcnJvci4KICAgIGFsbG93UmV0dXJuT3V0c2lkZUZ1bmN0aW9uOiBmYWxzZSwKICAgIC8vIFdoZW4gYGxvY2F0aW9uc2AgaXMgb24sIGBsb2NgIHByb3BlcnRpZXMgaG9sZGluZyBvYmplY3RzIHdpdGgKICAgIC8vIGBzdGFydGAgYW5kIGBlbmRgIHByb3BlcnRpZXMgaW4gYHtsaW5lLCBjb2x1bW59YCBmb3JtICh3aXRoCiAgICAvLyBsaW5lIGJlaW5nIDEtYmFzZWQgYW5kIGNvbHVtbiAwLWJhc2VkKSB3aWxsIGJlIGF0dGFjaGVkIHRvIHRoZQogICAgLy8gbm9kZXMuCiAgICBsb2NhdGlvbnM6IGZhbHNlLAogICAgLy8gQSBmdW5jdGlvbiBjYW4gYmUgcGFzc2VkIGFzIGBvbkNvbW1lbnRgIG9wdGlvbiwgd2hpY2ggd2lsbAogICAgLy8gY2F1c2UgQWNvcm4gdG8gY2FsbCB0aGF0IGZ1bmN0aW9uIHdpdGggYChibG9jaywgdGV4dCwgc3RhcnQsCiAgICAvLyBlbmQpYCBwYXJhbWV0ZXJzIHdoZW5ldmVyIGEgY29tbWVudCBpcyBza2lwcGVkLiBgYmxvY2tgIGlzIGEKICAgIC8vIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoaXMgaXMgYSBibG9jayAoYC8qICovYCkgY29tbWVudCwKICAgIC8vIGB0ZXh0YCBpcyB0aGUgY29udGVudCBvZiB0aGUgY29tbWVudCwgYW5kIGBzdGFydGAgYW5kIGBlbmRgIGFyZQogICAgLy8gY2hhcmFjdGVyIG9mZnNldHMgdGhhdCBkZW5vdGUgdGhlIHN0YXJ0IGFuZCBlbmQgb2YgdGhlIGNvbW1lbnQuCiAgICAvLyBXaGVuIHRoZSBgbG9jYXRpb25zYCBvcHRpb24gaXMgb24sIHR3byBtb3JlIHBhcmFtZXRlcnMgYXJlCiAgICAvLyBwYXNzZWQsIHRoZSBmdWxsIGB7bGluZSwgY29sdW1ufWAgbG9jYXRpb25zIG9mIHRoZSBzdGFydCBhbmQKICAgIC8vIGVuZCBvZiB0aGUgY29tbWVudHMuIE5vdGUgdGhhdCB5b3UgYXJlIG5vdCBhbGxvd2VkIHRvIGNhbGwgdGhlCiAgICAvLyBwYXJzZXIgZnJvbSB0aGUgY2FsbGJhY2vigJR0aGF0IHdpbGwgY29ycnVwdCBpdHMgaW50ZXJuYWwgc3RhdGUuCiAgICBvbkNvbW1lbnQ6IG51bGwsCiAgICAvLyBOb2RlcyBoYXZlIHRoZWlyIHN0YXJ0IGFuZCBlbmQgY2hhcmFjdGVycyBvZmZzZXRzIHJlY29yZGVkIGluCiAgICAvLyBgc3RhcnRgIGFuZCBgZW5kYCBwcm9wZXJ0aWVzIChkaXJlY3RseSBvbiB0aGUgbm9kZSwgcmF0aGVyIHRoYW4KICAgIC8vIHRoZSBgbG9jYCBvYmplY3QsIHdoaWNoIGhvbGRzIGxpbmUvY29sdW1uIGRhdGEuIFRvIGFsc28gYWRkIGEKICAgIC8vIFtzZW1pLXN0YW5kYXJkaXplZF1bcmFuZ2VdIGByYW5nZWAgcHJvcGVydHkgaG9sZGluZyBhIGBbc3RhcnQsCiAgICAvLyBlbmRdYCBhcnJheSB3aXRoIHRoZSBzYW1lIG51bWJlcnMsIHNldCB0aGUgYHJhbmdlc2Agb3B0aW9uIHRvCiAgICAvLyBgdHJ1ZWAuCiAgICAvLwogICAgLy8gW3JhbmdlXTogaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NzQ1Njc4CiAgICByYW5nZXM6IGZhbHNlLAogICAgLy8gSXQgaXMgcG9zc2libGUgdG8gcGFyc2UgbXVsdGlwbGUgZmlsZXMgaW50byBhIHNpbmdsZSBBU1QgYnkKICAgIC8vIHBhc3NpbmcgdGhlIHRyZWUgcHJvZHVjZWQgYnkgcGFyc2luZyB0aGUgZmlyc3QgZmlsZSBhcwogICAgLy8gYHByb2dyYW1gIG9wdGlvbiBpbiBzdWJzZXF1ZW50IHBhcnNlcy4gVGhpcyB3aWxsIGFkZCB0aGUKICAgIC8vIHRvcGxldmVsIGZvcm1zIG9mIHRoZSBwYXJzZWQgZmlsZSB0byB0aGUgYFByb2dyYW1gICh0b3ApIG5vZGUKICAgIC8vIG9mIGFuIGV4aXN0aW5nIHBhcnNlIHRyZWUuCiAgICBwcm9ncmFtOiBudWxsLAogICAgLy8gV2hlbiBgbG9jYXRpb25zYCBpcyBvbiwgeW91IGNhbiBwYXNzIHRoaXMgdG8gcmVjb3JkIHRoZSBzb3VyY2UKICAgIC8vIGZpbGUgaW4gZXZlcnkgbm9kZSdzIGBsb2NgIG9iamVjdC4KICAgIHNvdXJjZUZpbGU6IG51bGwsCiAgICAvLyBUaGlzIHZhbHVlLCBpZiBnaXZlbiwgaXMgc3RvcmVkIGluIGV2ZXJ5IG5vZGUsIHdoZXRoZXIKICAgIC8vIGBsb2NhdGlvbnNgIGlzIG9uIG9yIG9mZi4KICAgIGRpcmVjdFNvdXJjZUZpbGU6IG51bGwKICB9OwoKICBmdW5jdGlvbiBzZXRPcHRpb25zKG9wdHMpIHsKICAgIG9wdGlvbnMgPSBvcHRzIHx8IHt9OwogICAgZm9yICh2YXIgb3B0IGluIGRlZmF1bHRPcHRpb25zKSBpZiAoIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvcHRpb25zLCBvcHQpKQogICAgICBvcHRpb25zW29wdF0gPSBkZWZhdWx0T3B0aW9uc1tvcHRdOwogICAgc291cmNlRmlsZSA9IG9wdGlvbnMuc291cmNlRmlsZSB8fCBudWxsOwogIH0KCiAgLy8gVGhlIGBnZXRMaW5lSW5mb2AgZnVuY3Rpb24gaXMgbW9zdGx5IHVzZWZ1bCB3aGVuIHRoZQogIC8vIGBsb2NhdGlvbnNgIG9wdGlvbiBpcyBvZmYgKGZvciBwZXJmb3JtYW5jZSByZWFzb25zKSBhbmQgeW91CiAgLy8gd2FudCB0byBmaW5kIHRoZSBsaW5lL2NvbHVtbiBwb3NpdGlvbiBmb3IgYSBnaXZlbiBjaGFyYWN0ZXIKICAvLyBvZmZzZXQuIGBpbnB1dGAgc2hvdWxkIGJlIHRoZSBjb2RlIHN0cmluZyB0aGF0IHRoZSBvZmZzZXQgcmVmZXJzCiAgLy8gaW50by4KCiAgdmFyIGdldExpbmVJbmZvID0gZXhwb3J0cy5nZXRMaW5lSW5mbyA9IGZ1bmN0aW9uKGlucHV0LCBvZmZzZXQpIHsKICAgIGZvciAodmFyIGxpbmUgPSAxLCBjdXIgPSAwOzspIHsKICAgICAgbGluZUJyZWFrLmxhc3RJbmRleCA9IGN1cjsKICAgICAgdmFyIG1hdGNoID0gbGluZUJyZWFrLmV4ZWMoaW5wdXQpOwogICAgICBpZiAobWF0Y2ggJiYgbWF0Y2guaW5kZXggPCBvZmZzZXQpIHsKICAgICAgICArK2xpbmU7CiAgICAgICAgY3VyID0gbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGg7CiAgICAgIH0gZWxzZSBicmVhazsKICAgIH0KICAgIHJldHVybiB7bGluZTogbGluZSwgY29sdW1uOiBvZmZzZXQgLSBjdXJ9OwogIH07CgogIC8vIEFjb3JuIGlzIG9yZ2FuaXplZCBhcyBhIHRva2VuaXplciBhbmQgYSByZWN1cnNpdmUtZGVzY2VudCBwYXJzZXIuCiAgLy8gVGhlIGB0b2tlbml6ZWAgZXhwb3J0IHByb3ZpZGVzIGFuIGludGVyZmFjZSB0byB0aGUgdG9rZW5pemVyLgogIC8vIEJlY2F1c2UgdGhlIHRva2VuaXplciBpcyBvcHRpbWl6ZWQgZm9yIGJlaW5nIGVmZmljaWVudGx5IHVzZWQgYnkKICAvLyB0aGUgQWNvcm4gcGFyc2VyIGl0c2VsZiwgdGhpcyBpbnRlcmZhY2UgaXMgc29tZXdoYXQgY3J1ZGUgYW5kIG5vdAogIC8vIHZlcnkgbW9kdWxhci4gUGVyZm9ybWluZyBhbm90aGVyIHBhcnNlIG9yIGNhbGwgdG8gYHRva2VuaXplYCB3aWxsCiAgLy8gcmVzZXQgdGhlIGludGVybmFsIHN0YXRlLCBhbmQgaW52YWxpZGF0ZSBleGlzdGluZyB0b2tlbml6ZXJzLgoKICBleHBvcnRzLnRva2VuaXplID0gZnVuY3Rpb24oaW5wdCwgb3B0cykgewogICAgaW5wdXQgPSBTdHJpbmcoaW5wdCk7IGlucHV0TGVuID0gaW5wdXQubGVuZ3RoOwogICAgc2V0T3B0aW9ucyhvcHRzKTsKICAgIGluaXRUb2tlblN0YXRlKCk7CgogICAgdmFyIHQgPSB7fTsKICAgIGZ1bmN0aW9uIGdldFRva2VuKGZvcmNlUmVnZXhwKSB7CiAgICAgIGxhc3RFbmQgPSB0b2tFbmQ7CiAgICAgIHJlYWRUb2tlbihmb3JjZVJlZ2V4cCk7CiAgICAgIHQuc3RhcnQgPSB0b2tTdGFydDsgdC5lbmQgPSB0b2tFbmQ7CiAgICAgIHQuc3RhcnRMb2MgPSB0b2tTdGFydExvYzsgdC5lbmRMb2MgPSB0b2tFbmRMb2M7CiAgICAgIHQudHlwZSA9IHRva1R5cGU7IHQudmFsdWUgPSB0b2tWYWw7CiAgICAgIHJldHVybiB0OwogICAgfQogICAgZ2V0VG9rZW4uanVtcFRvID0gZnVuY3Rpb24ocG9zLCByZUFsbG93ZWQpIHsKICAgICAgdG9rUG9zID0gcG9zOwogICAgICBpZiAob3B0aW9ucy5sb2NhdGlvbnMpIHsKICAgICAgICB0b2tDdXJMaW5lID0gMTsKICAgICAgICB0b2tMaW5lU3RhcnQgPSBsaW5lQnJlYWsubGFzdEluZGV4ID0gMDsKICAgICAgICB2YXIgbWF0Y2g7CiAgICAgICAgd2hpbGUgKChtYXRjaCA9IGxpbmVCcmVhay5leGVjKGlucHV0KSkgJiYgbWF0Y2guaW5kZXggPCBwb3MpIHsKICAgICAgICAgICsrdG9rQ3VyTGluZTsKICAgICAgICAgIHRva0xpbmVTdGFydCA9IG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoOwogICAgICAgIH0KICAgICAgfQogICAgICB0b2tSZWdleHBBbGxvd2VkID0gcmVBbGxvd2VkOwogICAgICBza2lwU3BhY2UoKTsKICAgIH07CiAgICByZXR1cm4gZ2V0VG9rZW47CiAgfTsKCiAgLy8gU3RhdGUgaXMga2VwdCBpbiAoY2xvc3VyZS0pZ2xvYmFsIHZhcmlhYmxlcy4gV2UgYWxyZWFkeSBzYXcgdGhlCiAgLy8gYG9wdGlvbnNgLCBgaW5wdXRgLCBhbmQgYGlucHV0TGVuYCB2YXJpYWJsZXMgYWJvdmUuCgogIC8vIFRoZSBjdXJyZW50IHBvc2l0aW9uIG9mIHRoZSB0b2tlbml6ZXIgaW4gdGhlIGlucHV0LgoKICB2YXIgdG9rUG9zOwoKICAvLyBUaGUgc3RhcnQgYW5kIGVuZCBvZmZzZXRzIG9mIHRoZSBjdXJyZW50IHRva2VuLgoKICB2YXIgdG9rU3RhcnQsIHRva0VuZDsKCiAgLy8gV2hlbiBgb3B0aW9ucy5sb2NhdGlvbnNgIGlzIHRydWUsIHRoZXNlIGhvbGQgb2JqZWN0cwogIC8vIGNvbnRhaW5pbmcgdGhlIHRva2VucyBzdGFydCBhbmQgZW5kIGxpbmUvY29sdW1uIHBhaXJzLgoKICB2YXIgdG9rU3RhcnRMb2MsIHRva0VuZExvYzsKCiAgLy8gVGhlIHR5cGUgYW5kIHZhbHVlIG9mIHRoZSBjdXJyZW50IHRva2VuLiBUb2tlbiB0eXBlcyBhcmUgb2JqZWN0cywKICAvLyBuYW1lZCBieSB2YXJpYWJsZXMgYWdhaW5zdCB3aGljaCB0aGV5IGNhbiBiZSBjb21wYXJlZCwgYW5kCiAgLy8gaG9sZGluZyBwcm9wZXJ0aWVzIHRoYXQgZGVzY3JpYmUgdGhlbSAoaW5kaWNhdGluZywgZm9yIGV4YW1wbGUsCiAgLy8gdGhlIHByZWNlZGVuY2Ugb2YgYW4gaW5maXggb3BlcmF0b3IsIGFuZCB0aGUgb3JpZ2luYWwgbmFtZSBvZiBhCiAgLy8ga2V5d29yZCB0b2tlbikuIFRoZSBraW5kIG9mIHZhbHVlIHRoYXQncyBoZWxkIGluIGB0b2tWYWxgIGRlcGVuZHMKICAvLyBvbiB0aGUgdHlwZSBvZiB0aGUgdG9rZW4uIEZvciBsaXRlcmFscywgaXQgaXMgdGhlIGxpdGVyYWwgdmFsdWUsCiAgLy8gZm9yIG9wZXJhdG9ycywgdGhlIG9wZXJhdG9yIG5hbWUsIGFuZCBzbyBvbi4KCiAgdmFyIHRva1R5cGUsIHRva1ZhbDsKCiAgLy8gSW50ZXJhbCBzdGF0ZSBmb3IgdGhlIHRva2VuaXplci4gVG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBkaXZpc2lvbgogIC8vIG9wZXJhdG9ycyBhbmQgcmVndWxhciBleHByZXNzaW9ucywgaXQgcmVtZW1iZXJzIHdoZXRoZXIgdGhlIGxhc3QKICAvLyB0b2tlbiB3YXMgb25lIHRoYXQgaXMgYWxsb3dlZCB0byBiZSBmb2xsb3dlZCBieSBhbiBleHByZXNzaW9uLgogIC8vIChJZiBpdCBpcywgYSBzbGFzaCBpcyBwcm9iYWJseSBhIHJlZ2V4cCwgaWYgaXQgaXNuJ3QgaXQncyBhCiAgLy8gZGl2aXNpb24gb3BlcmF0b3IuIFNlZSB0aGUgYHBhcnNlU3RhdGVtZW50YCBmdW5jdGlvbiBmb3IgYQogIC8vIGNhdmVhdC4pCgogIHZhciB0b2tSZWdleHBBbGxvd2VkOwoKICAvLyBXaGVuIGBvcHRpb25zLmxvY2F0aW9uc2AgaXMgdHJ1ZSwgdGhlc2UgYXJlIHVzZWQgdG8ga2VlcAogIC8vIHRyYWNrIG9mIHRoZSBjdXJyZW50IGxpbmUsIGFuZCBrbm93IHdoZW4gYSBuZXcgbGluZSBoYXMgYmVlbgogIC8vIGVudGVyZWQuCgogIHZhciB0b2tDdXJMaW5lLCB0b2tMaW5lU3RhcnQ7CgogIC8vIFRoZXNlIHN0b3JlIHRoZSBwb3NpdGlvbiBvZiB0aGUgcHJldmlvdXMgdG9rZW4sIHdoaWNoIGlzIHVzZWZ1bAogIC8vIHdoZW4gZmluaXNoaW5nIGEgbm9kZSBhbmQgYXNzaWduaW5nIGl0cyBgZW5kYCBwb3NpdGlvbi4KCiAgdmFyIGxhc3RTdGFydCwgbGFzdEVuZCwgbGFzdEVuZExvYzsKCiAgLy8gVGhpcyBpcyB0aGUgcGFyc2VyJ3Mgc3RhdGUuIGBpbkZ1bmN0aW9uYCBpcyB1c2VkIHRvIHJlamVjdAogIC8vIGByZXR1cm5gIHN0YXRlbWVudHMgb3V0c2lkZSBvZiBmdW5jdGlvbnMsIGBsYWJlbHNgIHRvIHZlcmlmeSB0aGF0CiAgLy8gYGJyZWFrYCBhbmQgYGNvbnRpbnVlYCBoYXZlIHNvbWV3aGVyZSB0byBqdW1wIHRvLCBhbmQgYHN0cmljdGAKICAvLyBpbmRpY2F0ZXMgd2hldGhlciBzdHJpY3QgbW9kZSBpcyBvbi4KCiAgdmFyIGluRnVuY3Rpb24sIGxhYmVscywgc3RyaWN0OwoKICAvLyBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcmFpc2UgZXhjZXB0aW9ucyBvbiBwYXJzZSBlcnJvcnMuIEl0CiAgLy8gdGFrZXMgYW4gb2Zmc2V0IGludGVnZXIgKGludG8gdGhlIGN1cnJlbnQgYGlucHV0YCkgdG8gaW5kaWNhdGUKICAvLyB0aGUgbG9jYXRpb24gb2YgdGhlIGVycm9yLCBhdHRhY2hlcyB0aGUgcG9zaXRpb24gdG8gdGhlIGVuZAogIC8vIG9mIHRoZSBlcnJvciBtZXNzYWdlLCBhbmQgdGhlbiByYWlzZXMgYSBgU3ludGF4RXJyb3JgIHdpdGggdGhhdAogIC8vIG1lc3NhZ2UuCgogIGZ1bmN0aW9uIHJhaXNlKHBvcywgbWVzc2FnZSkgewogICAgdmFyIGxvYyA9IGdldExpbmVJbmZvKGlucHV0LCBwb3MpOwogICAgbWVzc2FnZSArPSAiICgiICsgbG9jLmxpbmUgKyAiOiIgKyBsb2MuY29sdW1uICsgIikiOwogICAgdmFyIGVyciA9IG5ldyBTeW50YXhFcnJvcihtZXNzYWdlKTsKICAgIGVyci5wb3MgPSBwb3M7IGVyci5sb2MgPSBsb2M7IGVyci5yYWlzZWRBdCA9IHRva1BvczsKICAgIHRocm93IGVycjsKICB9CgogIC8vIFJldXNlZCBlbXB0eSBhcnJheSBhZGRlZCBmb3Igbm9kZSBmaWVsZHMgdGhhdCBhcmUgYWx3YXlzIGVtcHR5LgoKICB2YXIgZW1wdHkgPSBbXTsKCiAgLy8gIyMgVG9rZW4gdHlwZXMKCiAgLy8gVGhlIGFzc2lnbm1lbnQgb2YgZmluZS1ncmFpbmVkLCBpbmZvcm1hdGlvbi1jYXJyeWluZyB0eXBlIG9iamVjdHMKICAvLyBhbGxvd3MgdGhlIHRva2VuaXplciB0byBzdG9yZSB0aGUgaW5mb3JtYXRpb24gaXQgaGFzIGFib3V0IGEKICAvLyB0b2tlbiBpbiBhIHdheSB0aGF0IGlzIHZlcnkgY2hlYXAgZm9yIHRoZSBwYXJzZXIgdG8gbG9vayB1cC4KCiAgLy8gQWxsIHRva2VuIHR5cGUgdmFyaWFibGVzIHN0YXJ0IHdpdGggYW4gdW5kZXJzY29yZSwgdG8gbWFrZSB0aGVtCiAgLy8gZWFzeSB0byByZWNvZ25pemUuCgogIC8vIFRoZXNlIGFyZSB0aGUgZ2VuZXJhbCB0eXBlcy4gVGhlIGB0eXBlYCBwcm9wZXJ0eSBpcyBvbmx5IHVzZWQgdG8KICAvLyBtYWtlIHRoZW0gcmVjb2duaXplYWJsZSB3aGVuIGRlYnVnZ2luZy4KCiAgdmFyIF9udW0gPSB7dHlwZTogIm51bSJ9LCBfcmVnZXhwID0ge3R5cGU6ICJyZWdleHAifSwgX3N0cmluZyA9IHt0eXBlOiAic3RyaW5nIn07CiAgdmFyIF9uYW1lID0ge3R5cGU6ICJuYW1lIn0sIF9lb2YgPSB7dHlwZTogImVvZiJ9OwoKICAvLyBLZXl3b3JkIHRva2Vucy4gVGhlIGBrZXl3b3JkYCBwcm9wZXJ0eSAoYWxzbyB1c2VkIGluIGtleXdvcmQtbGlrZQogIC8vIG9wZXJhdG9ycykgaW5kaWNhdGVzIHRoYXQgdGhlIHRva2VuIG9yaWdpbmF0ZWQgZnJvbSBhbgogIC8vIGlkZW50aWZpZXItbGlrZSB3b3JkLCB3aGljaCBpcyB1c2VkIHdoZW4gcGFyc2luZyBwcm9wZXJ0eSBuYW1lcy4KICAvLwogIC8vIFRoZSBgYmVmb3JlRXhwcmAgcHJvcGVydHkgaXMgdXNlZCB0byBkaXNhbWJpZ3VhdGUgYmV0d2VlbiByZWd1bGFyCiAgLy8gZXhwcmVzc2lvbnMgYW5kIGRpdmlzaW9ucy4gSXQgaXMgc2V0IG9uIGFsbCB0b2tlbiB0eXBlcyB0aGF0IGNhbgogIC8vIGJlIGZvbGxvd2VkIGJ5IGFuIGV4cHJlc3Npb24gKHRodXMsIGEgc2xhc2ggYWZ0ZXIgdGhlbSB3b3VsZCBiZSBhCiAgLy8gcmVndWxhciBleHByZXNzaW9uKS4KICAvLwogIC8vIGBpc0xvb3BgIG1hcmtzIGEga2V5d29yZCBhcyBzdGFydGluZyBhIGxvb3AsIHdoaWNoIGlzIGltcG9ydGFudAogIC8vIHRvIGtub3cgd2hlbiBwYXJzaW5nIGEgbGFiZWwsIGluIG9yZGVyIHRvIGFsbG93IG9yIGRpc2FsbG93CiAgLy8gY29udGludWUganVtcHMgdG8gdGhhdCBsYWJlbC4KCiAgdmFyIF9icmVhayA9IHtrZXl3b3JkOiAiYnJlYWsifSwgX2Nhc2UgPSB7a2V5d29yZDogImNhc2UiLCBiZWZvcmVFeHByOiB0cnVlfSwgX2NhdGNoID0ge2tleXdvcmQ6ICJjYXRjaCJ9OwogIHZhciBfY29udGludWUgPSB7a2V5d29yZDogImNvbnRpbnVlIn0sIF9kZWJ1Z2dlciA9IHtrZXl3b3JkOiAiZGVidWdnZXIifSwgX2RlZmF1bHQgPSB7a2V5d29yZDogImRlZmF1bHQifTsKICB2YXIgX2RvID0ge2tleXdvcmQ6ICJkbyIsIGlzTG9vcDogdHJ1ZX0sIF9lbHNlID0ge2tleXdvcmQ6ICJlbHNlIiwgYmVmb3JlRXhwcjogdHJ1ZX07CiAgdmFyIF9maW5hbGx5ID0ge2tleXdvcmQ6ICJmaW5hbGx5In0sIF9mb3IgPSB7a2V5d29yZDogImZvciIsIGlzTG9vcDogdHJ1ZX0sIF9mdW5jdGlvbiA9IHtrZXl3b3JkOiAiZnVuY3Rpb24ifTsKICB2YXIgX2lmID0ge2tleXdvcmQ6ICJpZiJ9LCBfcmV0dXJuID0ge2tleXdvcmQ6ICJyZXR1cm4iLCBiZWZvcmVFeHByOiB0cnVlfSwgX3N3aXRjaCA9IHtrZXl3b3JkOiAic3dpdGNoIn07CiAgdmFyIF90aHJvdyA9IHtrZXl3b3JkOiAidGhyb3ciLCBiZWZvcmVFeHByOiB0cnVlfSwgX3RyeSA9IHtrZXl3b3JkOiAidHJ5In0sIF92YXIgPSB7a2V5d29yZDogInZhciJ9OwogIHZhciBfd2hpbGUgPSB7a2V5d29yZDogIndoaWxlIiwgaXNMb29wOiB0cnVlfSwgX3dpdGggPSB7a2V5d29yZDogIndpdGgifSwgX25ldyA9IHtrZXl3b3JkOiAibmV3IiwgYmVmb3JlRXhwcjogdHJ1ZX07CiAgdmFyIF90aGlzID0ge2tleXdvcmQ6ICJ0aGlzIn07CgogIC8vIFRoZSBrZXl3b3JkcyB0aGF0IGRlbm90ZSB2YWx1ZXMuCgogIHZhciBfbnVsbCA9IHtrZXl3b3JkOiAibnVsbCIsIGF0b21WYWx1ZTogbnVsbH0sIF90cnVlID0ge2tleXdvcmQ6ICJ0cnVlIiwgYXRvbVZhbHVlOiB0cnVlfTsKICB2YXIgX2ZhbHNlID0ge2tleXdvcmQ6ICJmYWxzZSIsIGF0b21WYWx1ZTogZmFsc2V9OwoKICAvLyBTb21lIGtleXdvcmRzIGFyZSB0cmVhdGVkIGFzIHJlZ3VsYXIgb3BlcmF0b3JzLiBgaW5gIHNvbWV0aW1lcwogIC8vICh3aGVuIHBhcnNpbmcgYGZvcmApIG5lZWRzIHRvIGJlIHRlc3RlZCBhZ2FpbnN0IHNwZWNpZmljYWxseSwgc28KICAvLyB3ZSBhc3NpZ24gYSB2YXJpYWJsZSBuYW1lIHRvIGl0IGZvciBxdWljayBjb21wYXJpbmcuCgogIHZhciBfaW4gPSB7a2V5d29yZDogImluIiwgYmlub3A6IDcsIGJlZm9yZUV4cHI6IHRydWV9OwoKICAvLyBNYXAga2V5d29yZCBuYW1lcyB0byB0b2tlbiB0eXBlcy4KCiAgdmFyIGtleXdvcmRUeXBlcyA9IHsiYnJlYWsiOiBfYnJlYWssICJjYXNlIjogX2Nhc2UsICJjYXRjaCI6IF9jYXRjaCwKICAgICAgICAgICAgICAgICAgICAgICJjb250aW51ZSI6IF9jb250aW51ZSwgImRlYnVnZ2VyIjogX2RlYnVnZ2VyLCAiZGVmYXVsdCI6IF9kZWZhdWx0LAogICAgICAgICAgICAgICAgICAgICAgImRvIjogX2RvLCAiZWxzZSI6IF9lbHNlLCAiZmluYWxseSI6IF9maW5hbGx5LCAiZm9yIjogX2ZvciwKICAgICAgICAgICAgICAgICAgICAgICJmdW5jdGlvbiI6IF9mdW5jdGlvbiwgImlmIjogX2lmLCAicmV0dXJuIjogX3JldHVybiwgInN3aXRjaCI6IF9zd2l0Y2gsCiAgICAgICAgICAgICAgICAgICAgICAidGhyb3ciOiBfdGhyb3csICJ0cnkiOiBfdHJ5LCAidmFyIjogX3ZhciwgIndoaWxlIjogX3doaWxlLCAid2l0aCI6IF93aXRoLAogICAgICAgICAgICAgICAgICAgICAgIm51bGwiOiBfbnVsbCwgInRydWUiOiBfdHJ1ZSwgImZhbHNlIjogX2ZhbHNlLCAibmV3IjogX25ldywgImluIjogX2luLAogICAgICAgICAgICAgICAgICAgICAgImluc3RhbmNlb2YiOiB7a2V5d29yZDogImluc3RhbmNlb2YiLCBiaW5vcDogNywgYmVmb3JlRXhwcjogdHJ1ZX0sICJ0aGlzIjogX3RoaXMsCiAgICAgICAgICAgICAgICAgICAgICAidHlwZW9mIjoge2tleXdvcmQ6ICJ0eXBlb2YiLCBwcmVmaXg6IHRydWUsIGJlZm9yZUV4cHI6IHRydWV9LAogICAgICAgICAgICAgICAgICAgICAgInZvaWQiOiB7a2V5d29yZDogInZvaWQiLCBwcmVmaXg6IHRydWUsIGJlZm9yZUV4cHI6IHRydWV9LAogICAgICAgICAgICAgICAgICAgICAgImRlbGV0ZSI6IHtrZXl3b3JkOiAiZGVsZXRlIiwgcHJlZml4OiB0cnVlLCBiZWZvcmVFeHByOiB0cnVlfX07CgogIC8vIFB1bmN0dWF0aW9uIHRva2VuIHR5cGVzLiBBZ2FpbiwgdGhlIGB0eXBlYCBwcm9wZXJ0eSBpcyBwdXJlbHkgZm9yIGRlYnVnZ2luZy4KCiAgdmFyIF9icmFja2V0TCA9IHt0eXBlOiAiWyIsIGJlZm9yZUV4cHI6IHRydWV9LCBfYnJhY2tldFIgPSB7dHlwZTogIl0ifSwgX2JyYWNlTCA9IHt0eXBlOiAieyIsIGJlZm9yZUV4cHI6IHRydWV9OwogIHZhciBfYnJhY2VSID0ge3R5cGU6ICJ9In0sIF9wYXJlbkwgPSB7dHlwZTogIigiLCBiZWZvcmVFeHByOiB0cnVlfSwgX3BhcmVuUiA9IHt0eXBlOiAiKSJ9OwogIHZhciBfY29tbWEgPSB7dHlwZTogIiwiLCBiZWZvcmVFeHByOiB0cnVlfSwgX3NlbWkgPSB7dHlwZTogIjsiLCBiZWZvcmVFeHByOiB0cnVlfTsKICB2YXIgX2NvbG9uID0ge3R5cGU6ICI6IiwgYmVmb3JlRXhwcjogdHJ1ZX0sIF9kb3QgPSB7dHlwZTogIi4ifSwgX3F1ZXN0aW9uID0ge3R5cGU6ICI/IiwgYmVmb3JlRXhwcjogdHJ1ZX07CgogIC8vIE9wZXJhdG9ycy4gVGhlc2UgY2Fycnkgc2V2ZXJhbCBraW5kcyBvZiBwcm9wZXJ0aWVzIHRvIGhlbHAgdGhlCiAgLy8gcGFyc2VyIHVzZSB0aGVtIHByb3Blcmx5ICh0aGUgcHJlc2VuY2Ugb2YgdGhlc2UgcHJvcGVydGllcyBpcwogIC8vIHdoYXQgY2F0ZWdvcml6ZXMgdGhlbSBhcyBvcGVyYXRvcnMpLgogIC8vCiAgLy8gYGJpbm9wYCwgd2hlbiBwcmVzZW50LCBzcGVjaWZpZXMgdGhhdCB0aGlzIG9wZXJhdG9yIGlzIGEgYmluYXJ5CiAgLy8gb3BlcmF0b3IsIGFuZCB3aWxsIHJlZmVyIHRvIGl0cyBwcmVjZWRlbmNlLgogIC8vCiAgLy8gYHByZWZpeGAgYW5kIGBwb3N0Zml4YCBtYXJrIHRoZSBvcGVyYXRvciBhcyBhIHByZWZpeCBvciBwb3N0Zml4CiAgLy8gdW5hcnkgb3BlcmF0b3IuIGBpc1VwZGF0ZWAgc3BlY2lmaWVzIHRoYXQgdGhlIG5vZGUgcHJvZHVjZWQgYnkKICAvLyB0aGUgb3BlcmF0b3Igc2hvdWxkIGJlIG9mIHR5cGUgVXBkYXRlRXhwcmVzc2lvbiByYXRoZXIgdGhhbgogIC8vIHNpbXBseSBVbmFyeUV4cHJlc3Npb24gKGArK2AgYW5kIGAtLWApLgogIC8vCiAgLy8gYGlzQXNzaWduYCBtYXJrcyBhbGwgb2YgYD1gLCBgKz1gLCBgLT1gIGV0Y2V0ZXJhLCB3aGljaCBhY3QgYXMKICAvLyBiaW5hcnkgb3BlcmF0b3JzIHdpdGggYSB2ZXJ5IGxvdyBwcmVjZWRlbmNlLCB0aGF0IHNob3VsZCByZXN1bHQKICAvLyBpbiBBc3NpZ25tZW50RXhwcmVzc2lvbiBub2Rlcy4KCiAgdmFyIF9zbGFzaCA9IHtiaW5vcDogMTAsIGJlZm9yZUV4cHI6IHRydWV9LCBfZXEgPSB7aXNBc3NpZ246IHRydWUsIGJlZm9yZUV4cHI6IHRydWV9OwogIHZhciBfYXNzaWduID0ge2lzQXNzaWduOiB0cnVlLCBiZWZvcmVFeHByOiB0cnVlfTsKICB2YXIgX2luY0RlYyA9IHtwb3N0Zml4OiB0cnVlLCBwcmVmaXg6IHRydWUsIGlzVXBkYXRlOiB0cnVlfSwgX3ByZWZpeCA9IHtwcmVmaXg6IHRydWUsIGJlZm9yZUV4cHI6IHRydWV9OwogIHZhciBfbG9naWNhbE9SID0ge2Jpbm9wOiAxLCBiZWZvcmVFeHByOiB0cnVlfTsKICB2YXIgX2xvZ2ljYWxBTkQgPSB7Ymlub3A6IDIsIGJlZm9yZUV4cHI6IHRydWV9OwogIHZhciBfYml0d2lzZU9SID0ge2Jpbm9wOiAzLCBiZWZvcmVFeHByOiB0cnVlfTsKICB2YXIgX2JpdHdpc2VYT1IgPSB7Ymlub3A6IDQsIGJlZm9yZUV4cHI6IHRydWV9OwogIHZhciBfYml0d2lzZUFORCA9IHtiaW5vcDogNSwgYmVmb3JlRXhwcjogdHJ1ZX07CiAgdmFyIF9lcXVhbGl0eSA9IHtiaW5vcDogNiwgYmVmb3JlRXhwcjogdHJ1ZX07CiAgdmFyIF9yZWxhdGlvbmFsID0ge2Jpbm9wOiA3LCBiZWZvcmVFeHByOiB0cnVlfTsKICB2YXIgX2JpdFNoaWZ0ID0ge2Jpbm9wOiA4LCBiZWZvcmVFeHByOiB0cnVlfTsKICB2YXIgX3BsdXNNaW4gPSB7Ymlub3A6IDksIHByZWZpeDogdHJ1ZSwgYmVmb3JlRXhwcjogdHJ1ZX07CiAgdmFyIF9tdWx0aXBseU1vZHVsbyA9IHtiaW5vcDogMTAsIGJlZm9yZUV4cHI6IHRydWV9OwoKICAvLyBQcm92aWRlIGFjY2VzcyB0byB0aGUgdG9rZW4gdHlwZXMgZm9yIGV4dGVybmFsIHVzZXJzIG9mIHRoZQogIC8vIHRva2VuaXplci4KCiAgZXhwb3J0cy50b2tUeXBlcyA9IHticmFja2V0TDogX2JyYWNrZXRMLCBicmFja2V0UjogX2JyYWNrZXRSLCBicmFjZUw6IF9icmFjZUwsIGJyYWNlUjogX2JyYWNlUiwKICAgICAgICAgICAgICAgICAgICAgIHBhcmVuTDogX3BhcmVuTCwgcGFyZW5SOiBfcGFyZW5SLCBjb21tYTogX2NvbW1hLCBzZW1pOiBfc2VtaSwgY29sb246IF9jb2xvbiwKICAgICAgICAgICAgICAgICAgICAgIGRvdDogX2RvdCwgcXVlc3Rpb246IF9xdWVzdGlvbiwgc2xhc2g6IF9zbGFzaCwgZXE6IF9lcSwgbmFtZTogX25hbWUsIGVvZjogX2VvZiwKICAgICAgICAgICAgICAgICAgICAgIG51bTogX251bSwgcmVnZXhwOiBfcmVnZXhwLCBzdHJpbmc6IF9zdHJpbmd9OwogIGZvciAodmFyIGt3IGluIGtleXdvcmRUeXBlcykgZXhwb3J0cy50b2tUeXBlc1siXyIgKyBrd10gPSBrZXl3b3JkVHlwZXNba3ddOwoKICAvLyBUaGlzIGlzIGEgdHJpY2sgdGFrZW4gZnJvbSBFc3ByaW1hLiBJdCB0dXJucyBvdXQgdGhhdCwgb24KICAvLyBub24tQ2hyb21lIGJyb3dzZXJzLCB0byBjaGVjayB3aGV0aGVyIGEgc3RyaW5nIGlzIGluIGEgc2V0LCBhCiAgLy8gcHJlZGljYXRlIGNvbnRhaW5pbmcgYSBiaWcgdWdseSBgc3dpdGNoYCBzdGF0ZW1lbnQgaXMgZmFzdGVyIHRoYW4KICAvLyBhIHJlZ3VsYXIgZXhwcmVzc2lvbiwgYW5kIG9uIENocm9tZSB0aGUgdHdvIGFyZSBhYm91dCBvbiBwYXIuCiAgLy8gVGhpcyBmdW5jdGlvbiB1c2VzIGBldmFsYCAobm9uLWxleGljYWwpIHRvIHByb2R1Y2Ugc3VjaCBhCiAgLy8gcHJlZGljYXRlIGZyb20gYSBzcGFjZS1zZXBhcmF0ZWQgc3RyaW5nIG9mIHdvcmRzLgogIC8vCiAgLy8gSXQgc3RhcnRzIGJ5IHNvcnRpbmcgdGhlIHdvcmRzIGJ5IGxlbmd0aC4KCiAgZnVuY3Rpb24gbWFrZVByZWRpY2F0ZSh3b3JkcykgewogICAgd29yZHMgPSB3b3Jkcy5zcGxpdCgiICIpOwogICAgdmFyIGYgPSAiIiwgY2F0cyA9IFtdOwogICAgb3V0OiBmb3IgKHZhciBpID0gMDsgaSA8IHdvcmRzLmxlbmd0aDsgKytpKSB7CiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgY2F0cy5sZW5ndGg7ICsraikKICAgICAgICBpZiAoY2F0c1tqXVswXS5sZW5ndGggPT0gd29yZHNbaV0ubGVuZ3RoKSB7CiAgICAgICAgICBjYXRzW2pdLnB1c2god29yZHNbaV0pOwogICAgICAgICAgY29udGludWUgb3V0OwogICAgICAgIH0KICAgICAgY2F0cy5wdXNoKFt3b3Jkc1tpXV0pOwogICAgfQogICAgZnVuY3Rpb24gY29tcGFyZVRvKGFycikgewogICAgICBpZiAoYXJyLmxlbmd0aCA9PSAxKSByZXR1cm4gZiArPSAicmV0dXJuIHN0ciA9PT0gIiArIEpTT04uc3RyaW5naWZ5KGFyclswXSkgKyAiOyI7CiAgICAgIGYgKz0gInN3aXRjaChzdHIpeyI7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgKytpKSBmICs9ICJjYXNlICIgKyBKU09OLnN0cmluZ2lmeShhcnJbaV0pICsgIjoiOwogICAgICBmICs9ICJyZXR1cm4gdHJ1ZX1yZXR1cm4gZmFsc2U7IjsKICAgIH0KCiAgICAvLyBXaGVuIHRoZXJlIGFyZSBtb3JlIHRoYW4gdGhyZWUgbGVuZ3RoIGNhdGVnb3JpZXMsIGFuIG91dGVyCiAgICAvLyBzd2l0Y2ggZmlyc3QgZGlzcGF0Y2hlcyBvbiB0aGUgbGVuZ3RocywgdG8gc2F2ZSBvbiBjb21wYXJpc29ucy4KCiAgICBpZiAoY2F0cy5sZW5ndGggPiAzKSB7CiAgICAgIGNhdHMuc29ydChmdW5jdGlvbihhLCBiKSB7cmV0dXJuIGIubGVuZ3RoIC0gYS5sZW5ndGg7fSk7CiAgICAgIGYgKz0gInN3aXRjaChzdHIubGVuZ3RoKXsiOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNhdHMubGVuZ3RoOyArK2kpIHsKICAgICAgICB2YXIgY2F0ID0gY2F0c1tpXTsKICAgICAgICBmICs9ICJjYXNlICIgKyBjYXRbMF0ubGVuZ3RoICsgIjoiOwogICAgICAgIGNvbXBhcmVUbyhjYXQpOwogICAgICB9CiAgICAgIGYgKz0gIn0iOwoKICAgIC8vIE90aGVyd2lzZSwgc2ltcGx5IGdlbmVyYXRlIGEgZmxhdCBgc3dpdGNoYCBzdGF0ZW1lbnQuCgogICAgfSBlbHNlIHsKICAgICAgY29tcGFyZVRvKHdvcmRzKTsKICAgIH0KICAgIHJldHVybiBuZXcgRnVuY3Rpb24oInN0ciIsIGYpOwogIH0KCiAgLy8gVGhlIEVDTUFTY3JpcHQgMyByZXNlcnZlZCB3b3JkIGxpc3QuCgogIHZhciBpc1Jlc2VydmVkV29yZDMgPSBtYWtlUHJlZGljYXRlKCJhYnN0cmFjdCBib29sZWFuIGJ5dGUgY2hhciBjbGFzcyBkb3VibGUgZW51bSBleHBvcnQgZXh0ZW5kcyBmaW5hbCBmbG9hdCBnb3RvIGltcGxlbWVudHMgaW1wb3J0IGludCBpbnRlcmZhY2UgbG9uZyBuYXRpdmUgcGFja2FnZSBwcml2YXRlIHByb3RlY3RlZCBwdWJsaWMgc2hvcnQgc3RhdGljIHN1cGVyIHN5bmNocm9uaXplZCB0aHJvd3MgdHJhbnNpZW50IHZvbGF0aWxlIik7CgogIC8vIEVDTUFTY3JpcHQgNSByZXNlcnZlZCB3b3Jkcy4KCiAgdmFyIGlzUmVzZXJ2ZWRXb3JkNSA9IG1ha2VQcmVkaWNhdGUoImNsYXNzIGVudW0gZXh0ZW5kcyBzdXBlciBjb25zdCBleHBvcnQgaW1wb3J0Iik7CgogIC8vIFRoZSBhZGRpdGlvbmFsIHJlc2VydmVkIHdvcmRzIGluIHN0cmljdCBtb2RlLgoKICB2YXIgaXNTdHJpY3RSZXNlcnZlZFdvcmQgPSBtYWtlUHJlZGljYXRlKCJpbXBsZW1lbnRzIGludGVyZmFjZSBsZXQgcGFja2FnZSBwcml2YXRlIHByb3RlY3RlZCBwdWJsaWMgc3RhdGljIHlpZWxkIik7CgogIC8vIFRoZSBmb3JiaWRkZW4gdmFyaWFibGUgbmFtZXMgaW4gc3RyaWN0IG1vZGUuCgogIHZhciBpc1N0cmljdEJhZElkV29yZCA9IG1ha2VQcmVkaWNhdGUoImV2YWwgYXJndW1lbnRzIik7CgogIC8vIEFuZCB0aGUga2V5d29yZHMuCgogIHZhciBpc0tleXdvcmQgPSBtYWtlUHJlZGljYXRlKCJicmVhayBjYXNlIGNhdGNoIGNvbnRpbnVlIGRlYnVnZ2VyIGRlZmF1bHQgZG8gZWxzZSBmaW5hbGx5IGZvciBmdW5jdGlvbiBpZiByZXR1cm4gc3dpdGNoIHRocm93IHRyeSB2YXIgd2hpbGUgd2l0aCBudWxsIHRydWUgZmFsc2UgaW5zdGFuY2VvZiB0eXBlb2Ygdm9pZCBkZWxldGUgbmV3IGluIHRoaXMiKTsKCiAgLy8gIyMgQ2hhcmFjdGVyIGNhdGVnb3JpZXMKCiAgLy8gQmlnIHVnbHkgcmVndWxhciBleHByZXNzaW9ucyB0aGF0IG1hdGNoIGNoYXJhY3RlcnMgaW4gdGhlCiAgLy8gd2hpdGVzcGFjZSwgaWRlbnRpZmllciwgYW5kIGlkZW50aWZpZXItc3RhcnQgY2F0ZWdvcmllcy4gVGhlc2UKICAvLyBhcmUgb25seSBhcHBsaWVkIHdoZW4gYSBjaGFyYWN0ZXIgaXMgZm91bmQgdG8gYWN0dWFsbHkgaGF2ZSBhCiAgLy8gY29kZSBwb2ludCBhYm92ZSAxMjguCgogIHZhciBub25BU0NJSXdoaXRlc3BhY2UgPSAvW1x1MTY4MFx1MTgwZVx1MjAwMC1cdTIwMGFcdTIwMmZcdTIwNWZcdTMwMDBcdWZlZmZdLzsKICB2YXIgbm9uQVNDSUlpZGVudGlmaWVyU3RhcnRDaGFycyA9ICJceGFhXHhiNVx4YmFceGMwLVx4ZDZceGQ4LVx4ZjZceGY4LVx1MDJjMVx1MDJjNi1cdTAyZDFcdTAyZTAtXHUwMmU0XHUwMmVjXHUwMmVlXHUwMzcwLVx1MDM3NFx1MDM3Nlx1MDM3N1x1MDM3YS1cdTAzN2RcdTAzODZcdTAzODgtXHUwMzhhXHUwMzhjXHUwMzhlLVx1MDNhMVx1MDNhMy1cdTAzZjVcdTAzZjctXHUwNDgxXHUwNDhhLVx1MDUyN1x1MDUzMS1cdTA1NTZcdTA1NTlcdTA1NjEtXHUwNTg3XHUwNWQwLVx1MDVlYVx1MDVmMC1cdTA1ZjJcdTA2MjAtXHUwNjRhXHUwNjZlXHUwNjZmXHUwNjcxLVx1MDZkM1x1MDZkNVx1MDZlNVx1MDZlNlx1MDZlZVx1MDZlZlx1MDZmYS1cdTA2ZmNcdTA2ZmZcdTA3MTBcdTA3MTItXHUwNzJmXHUwNzRkLVx1MDdhNVx1MDdiMVx1MDdjYS1cdTA3ZWFcdTA3ZjRcdTA3ZjVcdTA3ZmFcdTA4MDAtXHUwODE1XHUwODFhXHUwODI0XHUwODI4XHUwODQwLVx1MDg1OFx1MDhhMFx1MDhhMi1cdTA4YWNcdTA5MDQtXHUwOTM5XHUwOTNkXHUwOTUwXHUwOTU4LVx1MDk2MVx1MDk3MS1cdTA5NzdcdTA5NzktXHUwOTdmXHUwOTg1LVx1MDk4Y1x1MDk4Zlx1MDk5MFx1MDk5My1cdTA5YThcdTA5YWEtXHUwOWIwXHUwOWIyXHUwOWI2LVx1MDliOVx1MDliZFx1MDljZVx1MDlkY1x1MDlkZFx1MDlkZi1cdTA5ZTFcdTA5ZjBcdTA5ZjFcdTBhMDUtXHUwYTBhXHUwYTBmXHUwYTEwXHUwYTEzLVx1MGEyOFx1MGEyYS1cdTBhMzBcdTBhMzJcdTBhMzNcdTBhMzVcdTBhMzZcdTBhMzhcdTBhMzlcdTBhNTktXHUwYTVjXHUwYTVlXHUwYTcyLVx1MGE3NFx1MGE4NS1cdTBhOGRcdTBhOGYtXHUwYTkxXHUwYTkzLVx1MGFhOFx1MGFhYS1cdTBhYjBcdTBhYjJcdTBhYjNcdTBhYjUtXHUwYWI5XHUwYWJkXHUwYWQwXHUwYWUwXHUwYWUxXHUwYjA1LVx1MGIwY1x1MGIwZlx1MGIxMFx1MGIxMy1cdTBiMjhcdTBiMmEtXHUwYjMwXHUwYjMyXHUwYjMzXHUwYjM1LVx1MGIzOVx1MGIzZFx1MGI1Y1x1MGI1ZFx1MGI1Zi1cdTBiNjFcdTBiNzFcdTBiODNcdTBiODUtXHUwYjhhXHUwYjhlLVx1MGI5MFx1MGI5Mi1cdTBiOTVcdTBiOTlcdTBiOWFcdTBiOWNcdTBiOWVcdTBiOWZcdTBiYTNcdTBiYTRcdTBiYTgtXHUwYmFhXHUwYmFlLVx1MGJiOVx1MGJkMFx1MGMwNS1cdTBjMGNcdTBjMGUtXHUwYzEwXHUwYzEyLVx1MGMyOFx1MGMyYS1cdTBjMzNcdTBjMzUtXHUwYzM5XHUwYzNkXHUwYzU4XHUwYzU5XHUwYzYwXHUwYzYxXHUwYzg1LVx1MGM4Y1x1MGM4ZS1cdTBjOTBcdTBjOTItXHUwY2E4XHUwY2FhLVx1MGNiM1x1MGNiNS1cdTBjYjlcdTBjYmRcdTBjZGVcdTBjZTBcdTBjZTFcdTBjZjFcdTBjZjJcdTBkMDUtXHUwZDBjXHUwZDBlLVx1MGQxMFx1MGQxMi1cdTBkM2FcdTBkM2RcdTBkNGVcdTBkNjBcdTBkNjFcdTBkN2EtXHUwZDdmXHUwZDg1LVx1MGQ5Nlx1MGQ5YS1cdTBkYjFcdTBkYjMtXHUwZGJiXHUwZGJkXHUwZGMwLVx1MGRjNlx1MGUwMS1cdTBlMzBcdTBlMzJcdTBlMzNcdTBlNDAtXHUwZTQ2XHUwZTgxXHUwZTgyXHUwZTg0XHUwZTg3XHUwZTg4XHUwZThhXHUwZThkXHUwZTk0LVx1MGU5N1x1MGU5OS1cdTBlOWZcdTBlYTEtXHUwZWEzXHUwZWE1XHUwZWE3XHUwZWFhXHUwZWFiXHUwZWFkLVx1MGViMFx1MGViMlx1MGViM1x1MGViZFx1MGVjMC1cdTBlYzRcdTBlYzZcdTBlZGMtXHUwZWRmXHUwZjAwXHUwZjQwLVx1MGY0N1x1MGY0OS1cdTBmNmNcdTBmODgtXHUwZjhjXHUxMDAwLVx1MTAyYVx1MTAzZlx1MTA1MC1cdTEwNTVcdTEwNWEtXHUxMDVkXHUxMDYxXHUxMDY1XHUxMDY2XHUxMDZlLVx1MTA3MFx1MTA3NS1cdTEwODFcdTEwOGVcdTEwYTAtXHUxMGM1XHUxMGM3XHUxMGNkXHUxMGQwLVx1MTBmYVx1MTBmYy1cdTEyNDhcdTEyNGEtXHUxMjRkXHUxMjUwLVx1MTI1Nlx1MTI1OFx1MTI1YS1cdTEyNWRcdTEyNjAtXHUxMjg4XHUxMjhhLVx1MTI4ZFx1MTI5MC1cdTEyYjBcdTEyYjItXHUxMmI1XHUxMmI4LVx1MTJiZVx1MTJjMFx1MTJjMi1cdTEyYzVcdTEyYzgtXHUxMmQ2XHUxMmQ4LVx1MTMxMFx1MTMxMi1cdTEzMTVcdTEzMTgtXHUxMzVhXHUxMzgwLVx1MTM4Zlx1MTNhMC1cdTEzZjRcdTE0MDEtXHUxNjZjXHUxNjZmLVx1MTY3Zlx1MTY4MS1cdTE2OWFcdTE2YTAtXHUxNmVhXHUxNmVlLVx1MTZmMFx1MTcwMC1cdTE3MGNcdTE3MGUtXHUxNzExXHUxNzIwLVx1MTczMVx1MTc0MC1cdTE3NTFcdTE3NjAtXHUxNzZjXHUxNzZlLVx1MTc3MFx1MTc4MC1cdTE3YjNcdTE3ZDdcdTE3ZGNcdTE4MjAtXHUxODc3XHUxODgwLVx1MThhOFx1MThhYVx1MThiMC1cdTE4ZjVcdTE5MDAtXHUxOTFjXHUxOTUwLVx1MTk2ZFx1MTk3MC1cdTE5NzRcdTE5ODAtXHUxOWFiXHUxOWMxLVx1MTljN1x1MWEwMC1cdTFhMTZcdTFhMjAtXHUxYTU0XHUxYWE3XHUxYjA1LVx1MWIzM1x1MWI0NS1cdTFiNGJcdTFiODMtXHUxYmEwXHUxYmFlXHUxYmFmXHUxYmJhLVx1MWJlNVx1MWMwMC1cdTFjMjNcdTFjNGQtXHUxYzRmXHUxYzVhLVx1MWM3ZFx1MWNlOS1cdTFjZWNcdTFjZWUtXHUxY2YxXHUxY2Y1XHUxY2Y2XHUxZDAwLVx1MWRiZlx1MWUwMC1cdTFmMTVcdTFmMTgtXHUxZjFkXHUxZjIwLVx1MWY0NVx1MWY0OC1cdTFmNGRcdTFmNTAtXHUxZjU3XHUxZjU5XHUxZjViXHUxZjVkXHUxZjVmLVx1MWY3ZFx1MWY4MC1cdTFmYjRcdTFmYjYtXHUxZmJjXHUxZmJlXHUxZmMyLVx1MWZjNFx1MWZjNi1cdTFmY2NcdTFmZDAtXHUxZmQzXHUxZmQ2LVx1MWZkYlx1MWZlMC1cdTFmZWNcdTFmZjItXHUxZmY0XHUxZmY2LVx1MWZmY1x1MjA3MVx1MjA3Zlx1MjA5MC1cdTIwOWNcdTIxMDJcdTIxMDdcdTIxMGEtXHUyMTEzXHUyMTE1XHUyMTE5LVx1MjExZFx1MjEyNFx1MjEyNlx1MjEyOFx1MjEyYS1cdTIxMmRcdTIxMmYtXHUyMTM5XHUyMTNjLVx1MjEzZlx1MjE0NS1cdTIxNDlcdTIxNGVcdTIxNjAtXHUyMTg4XHUyYzAwLVx1MmMyZVx1MmMzMC1cdTJjNWVcdTJjNjAtXHUyY2U0XHUyY2ViLVx1MmNlZVx1MmNmMlx1MmNmM1x1MmQwMC1cdTJkMjVcdTJkMjdcdTJkMmRcdTJkMzAtXHUyZDY3XHUyZDZmXHUyZDgwLVx1MmQ5Nlx1MmRhMC1cdTJkYTZcdTJkYTgtXHUyZGFlXHUyZGIwLVx1MmRiNlx1MmRiOC1cdTJkYmVcdTJkYzAtXHUyZGM2XHUyZGM4LVx1MmRjZVx1MmRkMC1cdTJkZDZcdTJkZDgtXHUyZGRlXHUyZTJmXHUzMDA1LVx1MzAwN1x1MzAyMS1cdTMwMjlcdTMwMzEtXHUzMDM1XHUzMDM4LVx1MzAzY1x1MzA0MS1cdTMwOTZcdTMwOWQtXHUzMDlmXHUzMGExLVx1MzBmYVx1MzBmYy1cdTMwZmZcdTMxMDUtXHUzMTJkXHUzMTMxLVx1MzE4ZVx1MzFhMC1cdTMxYmFcdTMxZjAtXHUzMWZmXHUzNDAwLVx1NGRiNVx1NGUwMC1cdTlmY2NcdWEwMDAtXHVhNDhjXHVhNGQwLVx1YTRmZFx1YTUwMC1cdWE2MGNcdWE2MTAtXHVhNjFmXHVhNjJhXHVhNjJiXHVhNjQwLVx1YTY2ZVx1YTY3Zi1cdWE2OTdcdWE2YTAtXHVhNmVmXHVhNzE3LVx1YTcxZlx1YTcyMi1cdWE3ODhcdWE3OGItXHVhNzhlXHVhNzkwLVx1YTc5M1x1YTdhMC1cdWE3YWFcdWE3ZjgtXHVhODAxXHVhODAzLVx1YTgwNVx1YTgwNy1cdWE4MGFcdWE4MGMtXHVhODIyXHVhODQwLVx1YTg3M1x1YTg4Mi1cdWE4YjNcdWE4ZjItXHVhOGY3XHVhOGZiXHVhOTBhLVx1YTkyNVx1YTkzMC1cdWE5NDZcdWE5NjAtXHVhOTdjXHVhOTg0LVx1YTliMlx1YTljZlx1YWEwMC1cdWFhMjhcdWFhNDAtXHVhYTQyXHVhYTQ0LVx1YWE0Ylx1YWE2MC1cdWFhNzZcdWFhN2FcdWFhODAtXHVhYWFmXHVhYWIxXHVhYWI1XHVhYWI2XHVhYWI5LVx1YWFiZFx1YWFjMFx1YWFjMlx1YWFkYi1cdWFhZGRcdWFhZTAtXHVhYWVhXHVhYWYyLVx1YWFmNFx1YWIwMS1cdWFiMDZcdWFiMDktXHVhYjBlXHVhYjExLVx1YWIxNlx1YWIyMC1cdWFiMjZcdWFiMjgtXHVhYjJlXHVhYmMwLVx1YWJlMlx1YWMwMC1cdWQ3YTNcdWQ3YjAtXHVkN2M2XHVkN2NiLVx1ZDdmYlx1ZjkwMC1cdWZhNmRcdWZhNzAtXHVmYWQ5XHVmYjAwLVx1ZmIwNlx1ZmIxMy1cdWZiMTdcdWZiMWRcdWZiMWYtXHVmYjI4XHVmYjJhLVx1ZmIzNlx1ZmIzOC1cdWZiM2NcdWZiM2VcdWZiNDBcdWZiNDFcdWZiNDNcdWZiNDRcdWZiNDYtXHVmYmIxXHVmYmQzLVx1ZmQzZFx1ZmQ1MC1cdWZkOGZcdWZkOTItXHVmZGM3XHVmZGYwLVx1ZmRmYlx1ZmU3MC1cdWZlNzRcdWZlNzYtXHVmZWZjXHVmZjIxLVx1ZmYzYVx1ZmY0MS1cdWZmNWFcdWZmNjYtXHVmZmJlXHVmZmMyLVx1ZmZjN1x1ZmZjYS1cdWZmY2ZcdWZmZDItXHVmZmQ3XHVmZmRhLVx1ZmZkYyI7CiAgdmFyIG5vbkFTQ0lJaWRlbnRpZmllckNoYXJzID0gIlx1MDMwMC1cdTAzNmZcdTA0ODMtXHUwNDg3XHUwNTkxLVx1MDViZFx1MDViZlx1MDVjMVx1MDVjMlx1MDVjNFx1MDVjNVx1MDVjN1x1MDYxMC1cdTA2MWFcdTA2MjAtXHUwNjQ5XHUwNjcyLVx1MDZkM1x1MDZlNy1cdTA2ZThcdTA2ZmItXHUwNmZjXHUwNzMwLVx1MDc0YVx1MDgwMC1cdTA4MTRcdTA4MWItXHUwODIzXHUwODI1LVx1MDgyN1x1MDgyOS1cdTA4MmRcdTA4NDAtXHUwODU3XHUwOGU0LVx1MDhmZVx1MDkwMC1cdTA5MDNcdTA5M2EtXHUwOTNjXHUwOTNlLVx1MDk0Zlx1MDk1MS1cdTA5NTdcdTA5NjItXHUwOTYzXHUwOTY2LVx1MDk2Zlx1MDk4MS1cdTA5ODNcdTA5YmNcdTA5YmUtXHUwOWM0XHUwOWM3XHUwOWM4XHUwOWQ3XHUwOWRmLVx1MDllMFx1MGEwMS1cdTBhMDNcdTBhM2NcdTBhM2UtXHUwYTQyXHUwYTQ3XHUwYTQ4XHUwYTRiLVx1MGE0ZFx1MGE1MVx1MGE2Ni1cdTBhNzFcdTBhNzVcdTBhODEtXHUwYTgzXHUwYWJjXHUwYWJlLVx1MGFjNVx1MGFjNy1cdTBhYzlcdTBhY2ItXHUwYWNkXHUwYWUyLVx1MGFlM1x1MGFlNi1cdTBhZWZcdTBiMDEtXHUwYjAzXHUwYjNjXHUwYjNlLVx1MGI0NFx1MGI0N1x1MGI0OFx1MGI0Yi1cdTBiNGRcdTBiNTZcdTBiNTdcdTBiNWYtXHUwYjYwXHUwYjY2LVx1MGI2Zlx1MGI4Mlx1MGJiZS1cdTBiYzJcdTBiYzYtXHUwYmM4XHUwYmNhLVx1MGJjZFx1MGJkN1x1MGJlNi1cdTBiZWZcdTBjMDEtXHUwYzAzXHUwYzQ2LVx1MGM0OFx1MGM0YS1cdTBjNGRcdTBjNTVcdTBjNTZcdTBjNjItXHUwYzYzXHUwYzY2LVx1MGM2Zlx1MGM4Mlx1MGM4M1x1MGNiY1x1MGNiZS1cdTBjYzRcdTBjYzYtXHUwY2M4XHUwY2NhLVx1MGNjZFx1MGNkNVx1MGNkNlx1MGNlMi1cdTBjZTNcdTBjZTYtXHUwY2VmXHUwZDAyXHUwZDAzXHUwZDQ2LVx1MGQ0OFx1MGQ1N1x1MGQ2Mi1cdTBkNjNcdTBkNjYtXHUwZDZmXHUwZDgyXHUwZDgzXHUwZGNhXHUwZGNmLVx1MGRkNFx1MGRkNlx1MGRkOC1cdTBkZGZcdTBkZjJcdTBkZjNcdTBlMzQtXHUwZTNhXHUwZTQwLVx1MGU0NVx1MGU1MC1cdTBlNTlcdTBlYjQtXHUwZWI5XHUwZWM4LVx1MGVjZFx1MGVkMC1cdTBlZDlcdTBmMThcdTBmMTlcdTBmMjAtXHUwZjI5XHUwZjM1XHUwZjM3XHUwZjM5XHUwZjQxLVx1MGY0N1x1MGY3MS1cdTBmODRcdTBmODYtXHUwZjg3XHUwZjhkLVx1MGY5N1x1MGY5OS1cdTBmYmNcdTBmYzZcdTEwMDAtXHUxMDI5XHUxMDQwLVx1MTA0OVx1MTA2Ny1cdTEwNmRcdTEwNzEtXHUxMDc0XHUxMDgyLVx1MTA4ZFx1MTA4Zi1cdTEwOWRcdTEzNWQtXHUxMzVmXHUxNzBlLVx1MTcxMFx1MTcyMC1cdTE3MzBcdTE3NDAtXHUxNzUwXHUxNzcyXHUxNzczXHUxNzgwLVx1MTdiMlx1MTdkZFx1MTdlMC1cdTE3ZTlcdTE4MGItXHUxODBkXHUxODEwLVx1MTgxOVx1MTkyMC1cdTE5MmJcdTE5MzAtXHUxOTNiXHUxOTUxLVx1MTk2ZFx1MTliMC1cdTE5YzBcdTE5YzgtXHUxOWM5XHUxOWQwLVx1MTlkOVx1MWEwMC1cdTFhMTVcdTFhMjAtXHUxYTUzXHUxYTYwLVx1MWE3Y1x1MWE3Zi1cdTFhODlcdTFhOTAtXHUxYTk5XHUxYjQ2LVx1MWI0Ylx1MWI1MC1cdTFiNTlcdTFiNmItXHUxYjczXHUxYmIwLVx1MWJiOVx1MWJlNi1cdTFiZjNcdTFjMDAtXHUxYzIyXHUxYzQwLVx1MWM0OVx1MWM1Yi1cdTFjN2RcdTFjZDAtXHUxY2QyXHUxZDAwLVx1MWRiZVx1MWUwMS1cdTFmMTVcdTIwMGNcdTIwMGRcdTIwM2ZcdTIwNDBcdTIwNTRcdTIwZDAtXHUyMGRjXHUyMGUxXHUyMGU1LVx1MjBmMFx1MmQ4MS1cdTJkOTZcdTJkZTAtXHUyZGZmXHUzMDIxLVx1MzAyOFx1MzA5OVx1MzA5YVx1YTY0MC1cdWE2NmRcdWE2NzQtXHVhNjdkXHVhNjlmXHVhNmYwLVx1YTZmMVx1YTdmOC1cdWE4MDBcdWE4MDZcdWE4MGJcdWE4MjMtXHVhODI3XHVhODgwLVx1YTg4MVx1YThiNC1cdWE4YzRcdWE4ZDAtXHVhOGQ5XHVhOGYzLVx1YThmN1x1YTkwMC1cdWE5MDlcdWE5MjYtXHVhOTJkXHVhOTMwLVx1YTk0NVx1YTk4MC1cdWE5ODNcdWE5YjMtXHVhOWMwXHVhYTAwLVx1YWEyN1x1YWE0MC1cdWFhNDFcdWFhNGMtXHVhYTRkXHVhYTUwLVx1YWE1OVx1YWE3Ylx1YWFlMC1cdWFhZTlcdWFhZjItXHVhYWYzXHVhYmMwLVx1YWJlMVx1YWJlY1x1YWJlZFx1YWJmMC1cdWFiZjlcdWZiMjAtXHVmYjI4XHVmZTAwLVx1ZmUwZlx1ZmUyMC1cdWZlMjZcdWZlMzNcdWZlMzRcdWZlNGQtXHVmZTRmXHVmZjEwLVx1ZmYxOVx1ZmYzZiI7CiAgdmFyIG5vbkFTQ0lJaWRlbnRpZmllclN0YXJ0ID0gbmV3IFJlZ0V4cCgiWyIgKyBub25BU0NJSWlkZW50aWZpZXJTdGFydENoYXJzICsgIl0iKTsKICB2YXIgbm9uQVNDSUlpZGVudGlmaWVyID0gbmV3IFJlZ0V4cCgiWyIgKyBub25BU0NJSWlkZW50aWZpZXJTdGFydENoYXJzICsgbm9uQVNDSUlpZGVudGlmaWVyQ2hhcnMgKyAiXSIpOwoKICAvLyBXaGV0aGVyIGEgc2luZ2xlIGNoYXJhY3RlciBkZW5vdGVzIGEgbmV3bGluZS4KCiAgdmFyIG5ld2xpbmUgPSAvW1xuXHJcdTIwMjhcdTIwMjldLzsKCiAgLy8gTWF0Y2hlcyBhIHdob2xlIGxpbmUgYnJlYWsgKHdoZXJlIENSTEYgaXMgY29uc2lkZXJlZCBhIHNpbmdsZQogIC8vIGxpbmUgYnJlYWspLiBVc2VkIHRvIGNvdW50IGxpbmVzLgoKICB2YXIgbGluZUJyZWFrID0gL1xyXG58W1xuXHJcdTIwMjhcdTIwMjldL2c7CgogIC8vIFRlc3Qgd2hldGhlciBhIGdpdmVuIGNoYXJhY3RlciBjb2RlIHN0YXJ0cyBhbiBpZGVudGlmaWVyLgoKICB2YXIgaXNJZGVudGlmaWVyU3RhcnQgPSBleHBvcnRzLmlzSWRlbnRpZmllclN0YXJ0ID0gZnVuY3Rpb24oY29kZSkgewogICAgaWYgKGNvZGUgPCA2NSkgcmV0dXJuIGNvZGUgPT09IDM2OwogICAgaWYgKGNvZGUgPCA5MSkgcmV0dXJuIHRydWU7CiAgICBpZiAoY29kZSA8IDk3KSByZXR1cm4gY29kZSA9PT0gOTU7CiAgICBpZiAoY29kZSA8IDEyMylyZXR1cm4gdHJ1ZTsKICAgIHJldHVybiBjb2RlID49IDB4YWEgJiYgbm9uQVNDSUlpZGVudGlmaWVyU3RhcnQudGVzdChTdHJpbmcuZnJvbUNoYXJDb2RlKGNvZGUpKTsKICB9OwoKICAvLyBUZXN0IHdoZXRoZXIgYSBnaXZlbiBjaGFyYWN0ZXIgaXMgcGFydCBvZiBhbiBpZGVudGlmaWVyLgoKICB2YXIgaXNJZGVudGlmaWVyQ2hhciA9IGV4cG9ydHMuaXNJZGVudGlmaWVyQ2hhciA9IGZ1bmN0aW9uKGNvZGUpIHsKICAgIGlmIChjb2RlIDwgNDgpIHJldHVybiBjb2RlID09PSAzNjsKICAgIGlmIChjb2RlIDwgNTgpIHJldHVybiB0cnVlOwogICAgaWYgKGNvZGUgPCA2NSkgcmV0dXJuIGZhbHNlOwogICAgaWYgKGNvZGUgPCA5MSkgcmV0dXJuIHRydWU7CiAgICBpZiAoY29kZSA8IDk3KSByZXR1cm4gY29kZSA9PT0gOTU7CiAgICBpZiAoY29kZSA8IDEyMylyZXR1cm4gdHJ1ZTsKICAgIHJldHVybiBjb2RlID49IDB4YWEgJiYgbm9uQVNDSUlpZGVudGlmaWVyLnRlc3QoU3RyaW5nLmZyb21DaGFyQ29kZShjb2RlKSk7CiAgfTsKCiAgLy8gIyMgVG9rZW5pemVyCgogIC8vIFRoZXNlIGFyZSB1c2VkIHdoZW4gYG9wdGlvbnMubG9jYXRpb25zYCBpcyBvbiwgZm9yIHRoZQogIC8vIGB0b2tTdGFydExvY2AgYW5kIGB0b2tFbmRMb2NgIHByb3BlcnRpZXMuCgogIGZ1bmN0aW9uIGxpbmVfbG9jX3QoKSB7CiAgICB0aGlzLmxpbmUgPSB0b2tDdXJMaW5lOwogICAgdGhpcy5jb2x1bW4gPSB0b2tQb3MgLSB0b2tMaW5lU3RhcnQ7CiAgfQoKICAvLyBSZXNldCB0aGUgdG9rZW4gc3RhdGUuIFVzZWQgYXQgdGhlIHN0YXJ0IG9mIGEgcGFyc2UuCgogIGZ1bmN0aW9uIGluaXRUb2tlblN0YXRlKCkgewogICAgdG9rQ3VyTGluZSA9IDE7CiAgICB0b2tQb3MgPSB0b2tMaW5lU3RhcnQgPSAwOwogICAgdG9rUmVnZXhwQWxsb3dlZCA9IHRydWU7CiAgICBza2lwU3BhY2UoKTsKICB9CgogIC8vIENhbGxlZCBhdCB0aGUgZW5kIG9mIGV2ZXJ5IHRva2VuLiBTZXRzIGB0b2tFbmRgLCBgdG9rVmFsYCwgYW5kCiAgLy8gYHRva1JlZ2V4cEFsbG93ZWRgLCBhbmQgc2tpcHMgdGhlIHNwYWNlIGFmdGVyIHRoZSB0b2tlbiwgc28gdGhhdAogIC8vIHRoZSBuZXh0IG9uZSdzIGB0b2tTdGFydGAgd2lsbCBwb2ludCBhdCB0aGUgcmlnaHQgcG9zaXRpb24uCgogIGZ1bmN0aW9uIGZpbmlzaFRva2VuKHR5cGUsIHZhbCkgewogICAgdG9rRW5kID0gdG9rUG9zOwogICAgaWYgKG9wdGlvbnMubG9jYXRpb25zKSB0b2tFbmRMb2MgPSBuZXcgbGluZV9sb2NfdDsKICAgIHRva1R5cGUgPSB0eXBlOwogICAgc2tpcFNwYWNlKCk7CiAgICB0b2tWYWwgPSB2YWw7CiAgICB0b2tSZWdleHBBbGxvd2VkID0gdHlwZS5iZWZvcmVFeHByOwogIH0KCiAgZnVuY3Rpb24gc2tpcEJsb2NrQ29tbWVudCgpIHsKICAgIHZhciBzdGFydExvYyA9IG9wdGlvbnMub25Db21tZW50ICYmIG9wdGlvbnMubG9jYXRpb25zICYmIG5ldyBsaW5lX2xvY190OwogICAgdmFyIHN0YXJ0ID0gdG9rUG9zLCBlbmQgPSBpbnB1dC5pbmRleE9mKCIqLyIsIHRva1BvcyArPSAyKTsKICAgIGlmIChlbmQgPT09IC0xKSByYWlzZSh0b2tQb3MgLSAyLCAiVW50ZXJtaW5hdGVkIGNvbW1lbnQiKTsKICAgIHRva1BvcyA9IGVuZCArIDI7CiAgICBpZiAob3B0aW9ucy5sb2NhdGlvbnMpIHsKICAgICAgbGluZUJyZWFrLmxhc3RJbmRleCA9IHN0YXJ0OwogICAgICB2YXIgbWF0Y2g7CiAgICAgIHdoaWxlICgobWF0Y2ggPSBsaW5lQnJlYWsuZXhlYyhpbnB1dCkpICYmIG1hdGNoLmluZGV4IDwgdG9rUG9zKSB7CiAgICAgICAgKyt0b2tDdXJMaW5lOwogICAgICAgIHRva0xpbmVTdGFydCA9IG1hdGNoLmluZGV4ICsgbWF0Y2hbMF0ubGVuZ3RoOwogICAgICB9CiAgICB9CiAgICBpZiAob3B0aW9ucy5vbkNvbW1lbnQpCiAgICAgIG9wdGlvbnMub25Db21tZW50KHRydWUsIGlucHV0LnNsaWNlKHN0YXJ0ICsgMiwgZW5kKSwgc3RhcnQsIHRva1BvcywKICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRMb2MsIG9wdGlvbnMubG9jYXRpb25zICYmIG5ldyBsaW5lX2xvY190KTsKICB9CgogIGZ1bmN0aW9uIHNraXBMaW5lQ29tbWVudCgpIHsKICAgIHZhciBzdGFydCA9IHRva1BvczsKICAgIHZhciBzdGFydExvYyA9IG9wdGlvbnMub25Db21tZW50ICYmIG9wdGlvbnMubG9jYXRpb25zICYmIG5ldyBsaW5lX2xvY190OwogICAgdmFyIGNoID0gaW5wdXQuY2hhckNvZGVBdCh0b2tQb3MrPTIpOwogICAgd2hpbGUgKHRva1BvcyA8IGlucHV0TGVuICYmIGNoICE9PSAxMCAmJiBjaCAhPT0gMTMgJiYgY2ggIT09IDgyMzIgJiYgY2ggIT09IDgyMzMpIHsKICAgICAgKyt0b2tQb3M7CiAgICAgIGNoID0gaW5wdXQuY2hhckNvZGVBdCh0b2tQb3MpOwogICAgfQogICAgaWYgKG9wdGlvbnMub25Db21tZW50KQogICAgICBvcHRpb25zLm9uQ29tbWVudChmYWxzZSwgaW5wdXQuc2xpY2Uoc3RhcnQgKyAyLCB0b2tQb3MpLCBzdGFydCwgdG9rUG9zLAogICAgICAgICAgICAgICAgICAgICAgICBzdGFydExvYywgb3B0aW9ucy5sb2NhdGlvbnMgJiYgbmV3IGxpbmVfbG9jX3QpOwogIH0KCiAgLy8gQ2FsbGVkIGF0IHRoZSBzdGFydCBvZiB0aGUgcGFyc2UgYW5kIGFmdGVyIGV2ZXJ5IHRva2VuLiBTa2lwcwogIC8vIHdoaXRlc3BhY2UgYW5kIGNvbW1lbnRzLCBhbmQuCgogIGZ1bmN0aW9uIHNraXBTcGFjZSgpIHsKICAgIHdoaWxlICh0b2tQb3MgPCBpbnB1dExlbikgewogICAgICB2YXIgY2ggPSBpbnB1dC5jaGFyQ29kZUF0KHRva1Bvcyk7CiAgICAgIGlmIChjaCA9PT0gMzIpIHsgLy8gJyAnCiAgICAgICAgKyt0b2tQb3M7CiAgICAgIH0gZWxzZSBpZiAoY2ggPT09IDEzKSB7CiAgICAgICAgKyt0b2tQb3M7CiAgICAgICAgdmFyIG5leHQgPSBpbnB1dC5jaGFyQ29kZUF0KHRva1Bvcyk7CiAgICAgICAgaWYgKG5leHQgPT09IDEwKSB7CiAgICAgICAgICArK3Rva1BvczsKICAgICAgICB9CiAgICAgICAgaWYgKG9wdGlvbnMubG9jYXRpb25zKSB7CiAgICAgICAgICArK3Rva0N1ckxpbmU7CiAgICAgICAgICB0b2tMaW5lU3RhcnQgPSB0b2tQb3M7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGNoID09PSAxMCB8fCBjaCA9PT0gODIzMiB8fCBjaCA9PT0gODIzMykgewogICAgICAgICsrdG9rUG9zOwogICAgICAgIGlmIChvcHRpb25zLmxvY2F0aW9ucykgewogICAgICAgICAgKyt0b2tDdXJMaW5lOwogICAgICAgICAgdG9rTGluZVN0YXJ0ID0gdG9rUG9zOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChjaCA+IDggJiYgY2ggPCAxNCkgewogICAgICAgICsrdG9rUG9zOwogICAgICB9IGVsc2UgaWYgKGNoID09PSA0NykgeyAvLyAnLycKICAgICAgICB2YXIgbmV4dCA9IGlucHV0LmNoYXJDb2RlQXQodG9rUG9zICsgMSk7CiAgICAgICAgaWYgKG5leHQgPT09IDQyKSB7IC8vICcqJwogICAgICAgICAgc2tpcEJsb2NrQ29tbWVudCgpOwogICAgICAgIH0gZWxzZSBpZiAobmV4dCA9PT0gNDcpIHsgLy8gJy8nCiAgICAgICAgICBza2lwTGluZUNvbW1lbnQoKTsKICAgICAgICB9IGVsc2UgYnJlYWs7CiAgICAgIH0gZWxzZSBpZiAoY2ggPT09IDE2MCkgeyAvLyAnXHhhMCcKICAgICAgICArK3Rva1BvczsKICAgICAgfSBlbHNlIGlmIChjaCA+PSA1NzYwICYmIG5vbkFTQ0lJd2hpdGVzcGFjZS50ZXN0KFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpKSkgewogICAgICAgICsrdG9rUG9zOwogICAgICB9IGVsc2UgewogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgfQoKICAvLyAjIyMgVG9rZW4gcmVhZGluZwoKICAvLyBUaGlzIGlzIHRoZSBmdW5jdGlvbiB0aGF0IGlzIGNhbGxlZCB0byBmZXRjaCB0aGUgbmV4dCB0b2tlbi4gSXQKICAvLyBpcyBzb21ld2hhdCBvYnNjdXJlLCBiZWNhdXNlIGl0IHdvcmtzIGluIGNoYXJhY3RlciBjb2RlcyByYXRoZXIKICAvLyB0aGFuIGNoYXJhY3RlcnMsIGFuZCBiZWNhdXNlIG9wZXJhdG9yIHBhcnNpbmcgaGFzIGJlZW4gaW5saW5lZAogIC8vIGludG8gaXQuCiAgLy8KICAvLyBBbGwgaW4gdGhlIG5hbWUgb2Ygc3BlZWQuCiAgLy8KICAvLyBUaGUgYGZvcmNlUmVnZXhwYCBwYXJhbWV0ZXIgaXMgdXNlZCBpbiB0aGUgb25lIGNhc2Ugd2hlcmUgdGhlCiAgLy8gYHRva1JlZ2V4cEFsbG93ZWRgIHRyaWNrIGRvZXMgbm90IHdvcmsuIFNlZSBgcGFyc2VTdGF0ZW1lbnRgLgoKICBmdW5jdGlvbiByZWFkVG9rZW5fZG90KCkgewogICAgdmFyIG5leHQgPSBpbnB1dC5jaGFyQ29kZUF0KHRva1BvcyArIDEpOwogICAgaWYgKG5leHQgPj0gNDggJiYgbmV4dCA8PSA1NykgcmV0dXJuIHJlYWROdW1iZXIodHJ1ZSk7CiAgICArK3Rva1BvczsKICAgIHJldHVybiBmaW5pc2hUb2tlbihfZG90KTsKICB9CgogIGZ1bmN0aW9uIHJlYWRUb2tlbl9zbGFzaCgpIHsgLy8gJy8nCiAgICB2YXIgbmV4dCA9IGlucHV0LmNoYXJDb2RlQXQodG9rUG9zICsgMSk7CiAgICBpZiAodG9rUmVnZXhwQWxsb3dlZCkgeysrdG9rUG9zOyByZXR1cm4gcmVhZFJlZ2V4cCgpO30KICAgIGlmIChuZXh0ID09PSA2MSkgcmV0dXJuIGZpbmlzaE9wKF9hc3NpZ24sIDIpOwogICAgcmV0dXJuIGZpbmlzaE9wKF9zbGFzaCwgMSk7CiAgfQoKICBmdW5jdGlvbiByZWFkVG9rZW5fbXVsdF9tb2R1bG8oKSB7IC8vICclKicKICAgIHZhciBuZXh0ID0gaW5wdXQuY2hhckNvZGVBdCh0b2tQb3MgKyAxKTsKICAgIGlmIChuZXh0ID09PSA2MSkgcmV0dXJuIGZpbmlzaE9wKF9hc3NpZ24sIDIpOwogICAgcmV0dXJuIGZpbmlzaE9wKF9tdWx0aXBseU1vZHVsbywgMSk7CiAgfQoKICBmdW5jdGlvbiByZWFkVG9rZW5fcGlwZV9hbXAoY29kZSkgeyAvLyAnfCYnCiAgICB2YXIgbmV4dCA9IGlucHV0LmNoYXJDb2RlQXQodG9rUG9zICsgMSk7CiAgICBpZiAobmV4dCA9PT0gY29kZSkgcmV0dXJuIGZpbmlzaE9wKGNvZGUgPT09IDEyNCA/IF9sb2dpY2FsT1IgOiBfbG9naWNhbEFORCwgMik7CiAgICBpZiAobmV4dCA9PT0gNjEpIHJldHVybiBmaW5pc2hPcChfYXNzaWduLCAyKTsKICAgIHJldHVybiBmaW5pc2hPcChjb2RlID09PSAxMjQgPyBfYml0d2lzZU9SIDogX2JpdHdpc2VBTkQsIDEpOwogIH0KCiAgZnVuY3Rpb24gcmVhZFRva2VuX2NhcmV0KCkgeyAvLyAnXicKICAgIHZhciBuZXh0ID0gaW5wdXQuY2hhckNvZGVBdCh0b2tQb3MgKyAxKTsKICAgIGlmIChuZXh0ID09PSA2MSkgcmV0dXJuIGZpbmlzaE9wKF9hc3NpZ24sIDIpOwogICAgcmV0dXJuIGZpbmlzaE9wKF9iaXR3aXNlWE9SLCAxKTsKICB9CgogIGZ1bmN0aW9uIHJlYWRUb2tlbl9wbHVzX21pbihjb2RlKSB7IC8vICcrLScKICAgIHZhciBuZXh0ID0gaW5wdXQuY2hhckNvZGVBdCh0b2tQb3MgKyAxKTsKICAgIGlmIChuZXh0ID09PSBjb2RlKSB7CiAgICAgIGlmIChuZXh0ID09IDQ1ICYmIGlucHV0LmNoYXJDb2RlQXQodG9rUG9zICsgMikgPT0gNjIgJiYKICAgICAgICAgIG5ld2xpbmUudGVzdChpbnB1dC5zbGljZShsYXN0RW5kLCB0b2tQb3MpKSkgewogICAgICAgIC8vIEEgYC0tPmAgbGluZSBjb21tZW50CiAgICAgICAgdG9rUG9zICs9IDM7CiAgICAgICAgc2tpcExpbmVDb21tZW50KCk7CiAgICAgICAgc2tpcFNwYWNlKCk7CiAgICAgICAgcmV0dXJuIHJlYWRUb2tlbigpOwogICAgICB9CiAgICAgIHJldHVybiBmaW5pc2hPcChfaW5jRGVjLCAyKTsKICAgIH0KICAgIGlmIChuZXh0ID09PSA2MSkgcmV0dXJuIGZpbmlzaE9wKF9hc3NpZ24sIDIpOwogICAgcmV0dXJuIGZpbmlzaE9wKF9wbHVzTWluLCAxKTsKICB9CgogIGZ1bmN0aW9uIHJlYWRUb2tlbl9sdF9ndChjb2RlKSB7IC8vICc8PicKICAgIHZhciBuZXh0ID0gaW5wdXQuY2hhckNvZGVBdCh0b2tQb3MgKyAxKTsKICAgIHZhciBzaXplID0gMTsKICAgIGlmIChuZXh0ID09PSBjb2RlKSB7CiAgICAgIHNpemUgPSBjb2RlID09PSA2MiAmJiBpbnB1dC5jaGFyQ29kZUF0KHRva1BvcyArIDIpID09PSA2MiA/IDMgOiAyOwogICAgICBpZiAoaW5wdXQuY2hhckNvZGVBdCh0b2tQb3MgKyBzaXplKSA9PT0gNjEpIHJldHVybiBmaW5pc2hPcChfYXNzaWduLCBzaXplICsgMSk7CiAgICAgIHJldHVybiBmaW5pc2hPcChfYml0U2hpZnQsIHNpemUpOwogICAgfQogICAgaWYgKG5leHQgPT0gMzMgJiYgY29kZSA9PSA2MCAmJiBpbnB1dC5jaGFyQ29kZUF0KHRva1BvcyArIDIpID09IDQ1ICYmCiAgICAgICAgaW5wdXQuY2hhckNvZGVBdCh0b2tQb3MgKyAzKSA9PSA0NSkgewogICAgICAvLyBgPCEtLWAsIGFuIFhNTC1zdHlsZSBjb21tZW50IHRoYXQgc2hvdWxkIGJlIGludGVycHJldGVkIGFzIGEgbGluZSBjb21tZW50CiAgICAgIHRva1BvcyArPSA0OwogICAgICBza2lwTGluZUNvbW1lbnQoKTsKICAgICAgc2tpcFNwYWNlKCk7CiAgICAgIHJldHVybiByZWFkVG9rZW4oKTsKICAgIH0KICAgIGlmIChuZXh0ID09PSA2MSkKICAgICAgc2l6ZSA9IGlucHV0LmNoYXJDb2RlQXQodG9rUG9zICsgMikgPT09IDYxID8gMyA6IDI7CiAgICByZXR1cm4gZmluaXNoT3AoX3JlbGF0aW9uYWwsIHNpemUpOwogIH0KCiAgZnVuY3Rpb24gcmVhZFRva2VuX2VxX2V4Y2woY29kZSkgeyAvLyAnPSEnCiAgICB2YXIgbmV4dCA9IGlucHV0LmNoYXJDb2RlQXQodG9rUG9zICsgMSk7CiAgICBpZiAobmV4dCA9PT0gNjEpIHJldHVybiBmaW5pc2hPcChfZXF1YWxpdHksIGlucHV0LmNoYXJDb2RlQXQodG9rUG9zICsgMikgPT09IDYxID8gMyA6IDIpOwogICAgcmV0dXJuIGZpbmlzaE9wKGNvZGUgPT09IDYxID8gX2VxIDogX3ByZWZpeCwgMSk7CiAgfQoKICBmdW5jdGlvbiBnZXRUb2tlbkZyb21Db2RlKGNvZGUpIHsKICAgIHN3aXRjaChjb2RlKSB7CiAgICAgIC8vIFRoZSBpbnRlcnByZXRhdGlvbiBvZiBhIGRvdCBkZXBlbmRzIG9uIHdoZXRoZXIgaXQgaXMgZm9sbG93ZWQKICAgICAgLy8gYnkgYSBkaWdpdC4KICAgIGNhc2UgNDY6IC8vICcuJwogICAgICByZXR1cm4gcmVhZFRva2VuX2RvdCgpOwoKICAgICAgLy8gUHVuY3R1YXRpb24gdG9rZW5zLgogICAgY2FzZSA0MDogKyt0b2tQb3M7IHJldHVybiBmaW5pc2hUb2tlbihfcGFyZW5MKTsKICAgIGNhc2UgNDE6ICsrdG9rUG9zOyByZXR1cm4gZmluaXNoVG9rZW4oX3BhcmVuUik7CiAgICBjYXNlIDU5OiArK3Rva1BvczsgcmV0dXJuIGZpbmlzaFRva2VuKF9zZW1pKTsKICAgIGNhc2UgNDQ6ICsrdG9rUG9zOyByZXR1cm4gZmluaXNoVG9rZW4oX2NvbW1hKTsKICAgIGNhc2UgOTE6ICsrdG9rUG9zOyByZXR1cm4gZmluaXNoVG9rZW4oX2JyYWNrZXRMKTsKICAgIGNhc2UgOTM6ICsrdG9rUG9zOyByZXR1cm4gZmluaXNoVG9rZW4oX2JyYWNrZXRSKTsKICAgIGNhc2UgMTIzOiArK3Rva1BvczsgcmV0dXJuIGZpbmlzaFRva2VuKF9icmFjZUwpOwogICAgY2FzZSAxMjU6ICsrdG9rUG9zOyByZXR1cm4gZmluaXNoVG9rZW4oX2JyYWNlUik7CiAgICBjYXNlIDU4OiArK3Rva1BvczsgcmV0dXJuIGZpbmlzaFRva2VuKF9jb2xvbik7CiAgICBjYXNlIDYzOiArK3Rva1BvczsgcmV0dXJuIGZpbmlzaFRva2VuKF9xdWVzdGlvbik7CgogICAgICAvLyAnMHgnIGlzIGEgaGV4YWRlY2ltYWwgbnVtYmVyLgogICAgY2FzZSA0ODogLy8gJzAnCiAgICAgIHZhciBuZXh0ID0gaW5wdXQuY2hhckNvZGVBdCh0b2tQb3MgKyAxKTsKICAgICAgaWYgKG5leHQgPT09IDEyMCB8fCBuZXh0ID09PSA4OCkgcmV0dXJuIHJlYWRIZXhOdW1iZXIoKTsKICAgICAgLy8gQW55dGhpbmcgZWxzZSBiZWdpbm5pbmcgd2l0aCBhIGRpZ2l0IGlzIGFuIGludGVnZXIsIG9jdGFsCiAgICAgIC8vIG51bWJlciwgb3IgZmxvYXQuCiAgICBjYXNlIDQ5OiBjYXNlIDUwOiBjYXNlIDUxOiBjYXNlIDUyOiBjYXNlIDUzOiBjYXNlIDU0OiBjYXNlIDU1OiBjYXNlIDU2OiBjYXNlIDU3OiAvLyAxLTkKICAgICAgcmV0dXJuIHJlYWROdW1iZXIoZmFsc2UpOwoKICAgICAgLy8gUXVvdGVzIHByb2R1Y2Ugc3RyaW5ncy4KICAgIGNhc2UgMzQ6IGNhc2UgMzk6IC8vICciJywgIiciCiAgICAgIHJldHVybiByZWFkU3RyaW5nKGNvZGUpOwoKICAgIC8vIE9wZXJhdG9ycyBhcmUgcGFyc2VkIGlubGluZSBpbiB0aW55IHN0YXRlIG1hY2hpbmVzLiAnPScgKDYxKSBpcwogICAgLy8gb2Z0ZW4gcmVmZXJyZWQgdG8uIGBmaW5pc2hPcGAgc2ltcGx5IHNraXBzIHRoZSBhbW91bnQgb2YKICAgIC8vIGNoYXJhY3RlcnMgaXQgaXMgZ2l2ZW4gYXMgc2Vjb25kIGFyZ3VtZW50LCBhbmQgcmV0dXJucyBhIHRva2VuCiAgICAvLyBvZiB0aGUgdHlwZSBnaXZlbiBieSBpdHMgZmlyc3QgYXJndW1lbnQuCgogICAgY2FzZSA0NzogLy8gJy8nCiAgICAgIHJldHVybiByZWFkVG9rZW5fc2xhc2goY29kZSk7CgogICAgY2FzZSAzNzogY2FzZSA0MjogLy8gJyUqJwogICAgICByZXR1cm4gcmVhZFRva2VuX211bHRfbW9kdWxvKCk7CgogICAgY2FzZSAxMjQ6IGNhc2UgMzg6IC8vICd8JicKICAgICAgcmV0dXJuIHJlYWRUb2tlbl9waXBlX2FtcChjb2RlKTsKCiAgICBjYXNlIDk0OiAvLyAnXicKICAgICAgcmV0dXJuIHJlYWRUb2tlbl9jYXJldCgpOwoKICAgIGNhc2UgNDM6IGNhc2UgNDU6IC8vICcrLScKICAgICAgcmV0dXJuIHJlYWRUb2tlbl9wbHVzX21pbihjb2RlKTsKCiAgICBjYXNlIDYwOiBjYXNlIDYyOiAvLyAnPD4nCiAgICAgIHJldHVybiByZWFkVG9rZW5fbHRfZ3QoY29kZSk7CgogICAgY2FzZSA2MTogY2FzZSAzMzogLy8gJz0hJwogICAgICByZXR1cm4gcmVhZFRva2VuX2VxX2V4Y2woY29kZSk7CgogICAgY2FzZSAxMjY6IC8vICd+JwogICAgICByZXR1cm4gZmluaXNoT3AoX3ByZWZpeCwgMSk7CiAgICB9CgogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgZnVuY3Rpb24gcmVhZFRva2VuKGZvcmNlUmVnZXhwKSB7CiAgICBpZiAoIWZvcmNlUmVnZXhwKSB0b2tTdGFydCA9IHRva1BvczsKICAgIGVsc2UgdG9rUG9zID0gdG9rU3RhcnQgKyAxOwogICAgaWYgKG9wdGlvbnMubG9jYXRpb25zKSB0b2tTdGFydExvYyA9IG5ldyBsaW5lX2xvY190OwogICAgaWYgKGZvcmNlUmVnZXhwKSByZXR1cm4gcmVhZFJlZ2V4cCgpOwogICAgaWYgKHRva1BvcyA+PSBpbnB1dExlbikgcmV0dXJuIGZpbmlzaFRva2VuKF9lb2YpOwoKICAgIHZhciBjb2RlID0gaW5wdXQuY2hhckNvZGVBdCh0b2tQb3MpOwogICAgLy8gSWRlbnRpZmllciBvciBrZXl3b3JkLiAnXHVYWFhYJyBzZXF1ZW5jZXMgYXJlIGFsbG93ZWQgaW4KICAgIC8vIGlkZW50aWZpZXJzLCBzbyAnXCcgYWxzbyBkaXNwYXRjaGVzIHRvIHRoYXQuCiAgICBpZiAoaXNJZGVudGlmaWVyU3RhcnQoY29kZSkgfHwgY29kZSA9PT0gOTIgLyogJ1wnICovKSByZXR1cm4gcmVhZFdvcmQoKTsKCiAgICB2YXIgdG9rID0gZ2V0VG9rZW5Gcm9tQ29kZShjb2RlKTsKCiAgICBpZiAodG9rID09PSBmYWxzZSkgewogICAgICAvLyBJZiB3ZSBhcmUgaGVyZSwgd2UgZWl0aGVyIGZvdW5kIGEgbm9uLUFTQ0lJIGlkZW50aWZpZXIKICAgICAgLy8gY2hhcmFjdGVyLCBvciBzb21ldGhpbmcgdGhhdCdzIGVudGlyZWx5IGRpc2FsbG93ZWQuCiAgICAgIHZhciBjaCA9IFN0cmluZy5mcm9tQ2hhckNvZGUoY29kZSk7CiAgICAgIGlmIChjaCA9PT0gIlxcIiB8fCBub25BU0NJSWlkZW50aWZpZXJTdGFydC50ZXN0KGNoKSkgcmV0dXJuIHJlYWRXb3JkKCk7CiAgICAgIHJhaXNlKHRva1BvcywgIlVuZXhwZWN0ZWQgY2hhcmFjdGVyICciICsgY2ggKyAiJyIpOwogICAgfQogICAgcmV0dXJuIHRvazsKICB9CgogIGZ1bmN0aW9uIGZpbmlzaE9wKHR5cGUsIHNpemUpIHsKICAgIHZhciBzdHIgPSBpbnB1dC5zbGljZSh0b2tQb3MsIHRva1BvcyArIHNpemUpOwogICAgdG9rUG9zICs9IHNpemU7CiAgICBmaW5pc2hUb2tlbih0eXBlLCBzdHIpOwogIH0KCiAgLy8gUGFyc2UgYSByZWd1bGFyIGV4cHJlc3Npb24uIFNvbWUgY29udGV4dC1hd2FyZW5lc3MgaXMgbmVjZXNzYXJ5LAogIC8vIHNpbmNlIGEgJy8nIGluc2lkZSBhICdbXScgc2V0IGRvZXMgbm90IGVuZCB0aGUgZXhwcmVzc2lvbi4KCiAgZnVuY3Rpb24gcmVhZFJlZ2V4cCgpIHsKICAgIHZhciBjb250ZW50ID0gIiIsIGVzY2FwZWQsIGluQ2xhc3MsIHN0YXJ0ID0gdG9rUG9zOwogICAgZm9yICg7OykgewogICAgICBpZiAodG9rUG9zID49IGlucHV0TGVuKSByYWlzZShzdGFydCwgIlVudGVybWluYXRlZCByZWd1bGFyIGV4cHJlc3Npb24iKTsKICAgICAgdmFyIGNoID0gaW5wdXQuY2hhckF0KHRva1Bvcyk7CiAgICAgIGlmIChuZXdsaW5lLnRlc3QoY2gpKSByYWlzZShzdGFydCwgIlVudGVybWluYXRlZCByZWd1bGFyIGV4cHJlc3Npb24iKTsKICAgICAgaWYgKCFlc2NhcGVkKSB7CiAgICAgICAgaWYgKGNoID09PSAiWyIpIGluQ2xhc3MgPSB0cnVlOwogICAgICAgIGVsc2UgaWYgKGNoID09PSAiXSIgJiYgaW5DbGFzcykgaW5DbGFzcyA9IGZhbHNlOwogICAgICAgIGVsc2UgaWYgKGNoID09PSAiLyIgJiYgIWluQ2xhc3MpIGJyZWFrOwogICAgICAgIGVzY2FwZWQgPSBjaCA9PT0gIlxcIjsKICAgICAgfSBlbHNlIGVzY2FwZWQgPSBmYWxzZTsKICAgICAgKyt0b2tQb3M7CiAgICB9CiAgICB2YXIgY29udGVudCA9IGlucHV0LnNsaWNlKHN0YXJ0LCB0b2tQb3MpOwogICAgKyt0b2tQb3M7CiAgICAvLyBOZWVkIHRvIHVzZSBgcmVhZFdvcmQxYCBiZWNhdXNlICdcdVhYWFgnIHNlcXVlbmNlcyBhcmUgYWxsb3dlZAogICAgLy8gaGVyZSAoZG9uJ3QgYXNrKS4KICAgIHZhciBtb2RzID0gcmVhZFdvcmQxKCk7CiAgICBpZiAobW9kcyAmJiAhL15bZ21zaXldKiQvLnRlc3QobW9kcykpIHJhaXNlKHN0YXJ0LCAiSW52YWxpZCByZWdleHAgZmxhZyIpOwogICAgdHJ5IHsKICAgICAgdmFyIHZhbHVlID0gbmV3IFJlZ0V4cChjb250ZW50LCBtb2RzKTsKICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTeW50YXhFcnJvcikgcmFpc2Uoc3RhcnQsIGUubWVzc2FnZSk7CiAgICAgIHJhaXNlKGUpOwogICAgfQogICAgcmV0dXJuIGZpbmlzaFRva2VuKF9yZWdleHAsIHZhbHVlKTsKICB9CgogIC8vIFJlYWQgYW4gaW50ZWdlciBpbiB0aGUgZ2l2ZW4gcmFkaXguIFJldHVybiBudWxsIGlmIHplcm8gZGlnaXRzCiAgLy8gd2VyZSByZWFkLCB0aGUgaW50ZWdlciB2YWx1ZSBvdGhlcndpc2UuIFdoZW4gYGxlbmAgaXMgZ2l2ZW4sIHRoaXMKICAvLyB3aWxsIHJldHVybiBgbnVsbGAgdW5sZXNzIHRoZSBpbnRlZ2VyIGhhcyBleGFjdGx5IGBsZW5gIGRpZ2l0cy4KCiAgZnVuY3Rpb24gcmVhZEludChyYWRpeCwgbGVuKSB7CiAgICB2YXIgc3RhcnQgPSB0b2tQb3MsIHRvdGFsID0gMDsKICAgIGZvciAodmFyIGkgPSAwLCBlID0gbGVuID09IG51bGwgPyBJbmZpbml0eSA6IGxlbjsgaSA8IGU7ICsraSkgewogICAgICB2YXIgY29kZSA9IGlucHV0LmNoYXJDb2RlQXQodG9rUG9zKSwgdmFsOwogICAgICBpZiAoY29kZSA+PSA5NykgdmFsID0gY29kZSAtIDk3ICsgMTA7IC8vIGEKICAgICAgZWxzZSBpZiAoY29kZSA+PSA2NSkgdmFsID0gY29kZSAtIDY1ICsgMTA7IC8vIEEKICAgICAgZWxzZSBpZiAoY29kZSA+PSA0OCAmJiBjb2RlIDw9IDU3KSB2YWwgPSBjb2RlIC0gNDg7IC8vIDAtOQogICAgICBlbHNlIHZhbCA9IEluZmluaXR5OwogICAgICBpZiAodmFsID49IHJhZGl4KSBicmVhazsKICAgICAgKyt0b2tQb3M7CiAgICAgIHRvdGFsID0gdG90YWwgKiByYWRpeCArIHZhbDsKICAgIH0KICAgIGlmICh0b2tQb3MgPT09IHN0YXJ0IHx8IGxlbiAhPSBudWxsICYmIHRva1BvcyAtIHN0YXJ0ICE9PSBsZW4pIHJldHVybiBudWxsOwoKICAgIHJldHVybiB0b3RhbDsKICB9CgogIGZ1bmN0aW9uIHJlYWRIZXhOdW1iZXIoKSB7CiAgICB0b2tQb3MgKz0gMjsgLy8gMHgKICAgIHZhciB2YWwgPSByZWFkSW50KDE2KTsKICAgIGlmICh2YWwgPT0gbnVsbCkgcmFpc2UodG9rU3RhcnQgKyAyLCAiRXhwZWN0ZWQgaGV4YWRlY2ltYWwgbnVtYmVyIik7CiAgICBpZiAoaXNJZGVudGlmaWVyU3RhcnQoaW5wdXQuY2hhckNvZGVBdCh0b2tQb3MpKSkgcmFpc2UodG9rUG9zLCAiSWRlbnRpZmllciBkaXJlY3RseSBhZnRlciBudW1iZXIiKTsKICAgIHJldHVybiBmaW5pc2hUb2tlbihfbnVtLCB2YWwpOwogIH0KCiAgLy8gUmVhZCBhbiBpbnRlZ2VyLCBvY3RhbCBpbnRlZ2VyLCBvciBmbG9hdGluZy1wb2ludCBudW1iZXIuCgogIGZ1bmN0aW9uIHJlYWROdW1iZXIoc3RhcnRzV2l0aERvdCkgewogICAgdmFyIHN0YXJ0ID0gdG9rUG9zLCBpc0Zsb2F0ID0gZmFsc2UsIG9jdGFsID0gaW5wdXQuY2hhckNvZGVBdCh0b2tQb3MpID09PSA0ODsKICAgIGlmICghc3RhcnRzV2l0aERvdCAmJiByZWFkSW50KDEwKSA9PT0gbnVsbCkgcmFpc2Uoc3RhcnQsICJJbnZhbGlkIG51bWJlciIpOwogICAgaWYgKGlucHV0LmNoYXJDb2RlQXQodG9rUG9zKSA9PT0gNDYpIHsKICAgICAgKyt0b2tQb3M7CiAgICAgIHJlYWRJbnQoMTApOwogICAgICBpc0Zsb2F0ID0gdHJ1ZTsKICAgIH0KICAgIHZhciBuZXh0ID0gaW5wdXQuY2hhckNvZGVBdCh0b2tQb3MpOwogICAgaWYgKG5leHQgPT09IDY5IHx8IG5leHQgPT09IDEwMSkgeyAvLyAnZUUnCiAgICAgIG5leHQgPSBpbnB1dC5jaGFyQ29kZUF0KCsrdG9rUG9zKTsKICAgICAgaWYgKG5leHQgPT09IDQzIHx8IG5leHQgPT09IDQ1KSArK3Rva1BvczsgLy8gJystJwogICAgICBpZiAocmVhZEludCgxMCkgPT09IG51bGwpIHJhaXNlKHN0YXJ0LCAiSW52YWxpZCBudW1iZXIiKTsKICAgICAgaXNGbG9hdCA9IHRydWU7CiAgICB9CiAgICBpZiAoaXNJZGVudGlmaWVyU3RhcnQoaW5wdXQuY2hhckNvZGVBdCh0b2tQb3MpKSkgcmFpc2UodG9rUG9zLCAiSWRlbnRpZmllciBkaXJlY3RseSBhZnRlciBudW1iZXIiKTsKCiAgICB2YXIgc3RyID0gaW5wdXQuc2xpY2Uoc3RhcnQsIHRva1BvcyksIHZhbDsKICAgIGlmIChpc0Zsb2F0KSB2YWwgPSBwYXJzZUZsb2F0KHN0cik7CiAgICBlbHNlIGlmICghb2N0YWwgfHwgc3RyLmxlbmd0aCA9PT0gMSkgdmFsID0gcGFyc2VJbnQoc3RyLCAxMCk7CiAgICBlbHNlIGlmICgvWzg5XS8udGVzdChzdHIpIHx8IHN0cmljdCkgcmFpc2Uoc3RhcnQsICJJbnZhbGlkIG51bWJlciIpOwogICAgZWxzZSB2YWwgPSBwYXJzZUludChzdHIsIDgpOwogICAgcmV0dXJuIGZpbmlzaFRva2VuKF9udW0sIHZhbCk7CiAgfQoKICAvLyBSZWFkIGEgc3RyaW5nIHZhbHVlLCBpbnRlcnByZXRpbmcgYmFja3NsYXNoLWVzY2FwZXMuCgogIGZ1bmN0aW9uIHJlYWRTdHJpbmcocXVvdGUpIHsKICAgIHRva1BvcysrOwogICAgdmFyIG91dCA9ICIiOwogICAgZm9yICg7OykgewogICAgICBpZiAodG9rUG9zID49IGlucHV0TGVuKSByYWlzZSh0b2tTdGFydCwgIlVudGVybWluYXRlZCBzdHJpbmcgY29uc3RhbnQiKTsKICAgICAgdmFyIGNoID0gaW5wdXQuY2hhckNvZGVBdCh0b2tQb3MpOwogICAgICBpZiAoY2ggPT09IHF1b3RlKSB7CiAgICAgICAgKyt0b2tQb3M7CiAgICAgICAgcmV0dXJuIGZpbmlzaFRva2VuKF9zdHJpbmcsIG91dCk7CiAgICAgIH0KICAgICAgaWYgKGNoID09PSA5MikgeyAvLyAnXCcKICAgICAgICBjaCA9IGlucHV0LmNoYXJDb2RlQXQoKyt0b2tQb3MpOwogICAgICAgIHZhciBvY3RhbCA9IC9eWzAtN10rLy5leGVjKGlucHV0LnNsaWNlKHRva1BvcywgdG9rUG9zICsgMykpOwogICAgICAgIGlmIChvY3RhbCkgb2N0YWwgPSBvY3RhbFswXTsKICAgICAgICB3aGlsZSAob2N0YWwgJiYgcGFyc2VJbnQob2N0YWwsIDgpID4gMjU1KSBvY3RhbCA9IG9jdGFsLnNsaWNlKDAsIC0xKTsKICAgICAgICBpZiAob2N0YWwgPT09ICIwIikgb2N0YWwgPSBudWxsOwogICAgICAgICsrdG9rUG9zOwogICAgICAgIGlmIChvY3RhbCkgewogICAgICAgICAgaWYgKHN0cmljdCkgcmFpc2UodG9rUG9zIC0gMiwgIk9jdGFsIGxpdGVyYWwgaW4gc3RyaWN0IG1vZGUiKTsKICAgICAgICAgIG91dCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KG9jdGFsLCA4KSk7CiAgICAgICAgICB0b2tQb3MgKz0gb2N0YWwubGVuZ3RoIC0gMTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc3dpdGNoIChjaCkgewogICAgICAgICAgY2FzZSAxMTA6IG91dCArPSAiXG4iOyBicmVhazsgLy8gJ24nIC0+ICdcbicKICAgICAgICAgIGNhc2UgMTE0OiBvdXQgKz0gIlxyIjsgYnJlYWs7IC8vICdyJyAtPiAnXHInCiAgICAgICAgICBjYXNlIDEyMDogb3V0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUocmVhZEhleENoYXIoMikpOyBicmVhazsgLy8gJ3gnCiAgICAgICAgICBjYXNlIDExNzogb3V0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUocmVhZEhleENoYXIoNCkpOyBicmVhazsgLy8gJ3UnCiAgICAgICAgICBjYXNlIDg1OiBvdXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShyZWFkSGV4Q2hhcig4KSk7IGJyZWFrOyAvLyAnVScKICAgICAgICAgIGNhc2UgMTE2OiBvdXQgKz0gIlx0IjsgYnJlYWs7IC8vICd0JyAtPiAnXHQnCiAgICAgICAgICBjYXNlIDk4OiBvdXQgKz0gIlxiIjsgYnJlYWs7IC8vICdiJyAtPiAnXGInCiAgICAgICAgICBjYXNlIDExODogb3V0ICs9ICJcdTAwMGIiOyBicmVhazsgLy8gJ3YnIC0+ICdcdTAwMGInCiAgICAgICAgICBjYXNlIDEwMjogb3V0ICs9ICJcZiI7IGJyZWFrOyAvLyAnZicgLT4gJ1xmJwogICAgICAgICAgY2FzZSA0ODogb3V0ICs9ICJcMCI7IGJyZWFrOyAvLyAwIC0+ICdcMCcKICAgICAgICAgIGNhc2UgMTM6IGlmIChpbnB1dC5jaGFyQ29kZUF0KHRva1BvcykgPT09IDEwKSArK3Rva1BvczsgLy8gJ1xyXG4nCiAgICAgICAgICBjYXNlIDEwOiAvLyAnIFxuJwogICAgICAgICAgICBpZiAob3B0aW9ucy5sb2NhdGlvbnMpIHsgdG9rTGluZVN0YXJ0ID0gdG9rUG9zOyArK3Rva0N1ckxpbmU7IH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBkZWZhdWx0OiBvdXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShjaCk7IGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoY2ggPT09IDEzIHx8IGNoID09PSAxMCB8fCBjaCA9PT0gODIzMiB8fCBjaCA9PT0gODIzMykgcmFpc2UodG9rU3RhcnQsICJVbnRlcm1pbmF0ZWQgc3RyaW5nIGNvbnN0YW50Iik7CiAgICAgICAgb3V0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoY2gpOyAvLyAnXCcKICAgICAgICArK3Rva1BvczsKICAgICAgfQogICAgfQogIH0KCiAgLy8gVXNlZCB0byByZWFkIGNoYXJhY3RlciBlc2NhcGUgc2VxdWVuY2VzICgnXHgnLCAnXHUnLCAnXFUnKS4KCiAgZnVuY3Rpb24gcmVhZEhleENoYXIobGVuKSB7CiAgICB2YXIgbiA9IHJlYWRJbnQoMTYsIGxlbik7CiAgICBpZiAobiA9PT0gbnVsbCkgcmFpc2UodG9rU3RhcnQsICJCYWQgY2hhcmFjdGVyIGVzY2FwZSBzZXF1ZW5jZSIpOwogICAgcmV0dXJuIG47CiAgfQoKICAvLyBVc2VkIHRvIHNpZ25hbCB0byBjYWxsZXJzIG9mIGByZWFkV29yZDFgIHdoZXRoZXIgdGhlIHdvcmQKICAvLyBjb250YWluZWQgYW55IGVzY2FwZSBzZXF1ZW5jZXMuIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2Ugd29yZHMgd2l0aAogIC8vIGVzY2FwZSBzZXF1ZW5jZXMgbXVzdCBub3QgYmUgaW50ZXJwcmV0ZWQgYXMga2V5d29yZHMuCgogIHZhciBjb250YWluc0VzYzsKCiAgLy8gUmVhZCBhbiBpZGVudGlmaWVyLCBhbmQgcmV0dXJuIGl0IGFzIGEgc3RyaW5nLiBTZXRzIGBjb250YWluc0VzY2AKICAvLyB0byB3aGV0aGVyIHRoZSB3b3JkIGNvbnRhaW5lZCBhICdcdScgZXNjYXBlLgogIC8vCiAgLy8gT25seSBidWlsZHMgdXAgdGhlIHdvcmQgY2hhcmFjdGVyLWJ5LWNoYXJhY3RlciB3aGVuIGl0IGFjdHVhbGx5CiAgLy8gY29udGFpbmVkcyBhbiBlc2NhcGUsIGFzIGEgbWljcm8tb3B0aW1pemF0aW9uLgoKICBmdW5jdGlvbiByZWFkV29yZDEoKSB7CiAgICBjb250YWluc0VzYyA9IGZhbHNlOwogICAgdmFyIHdvcmQsIGZpcnN0ID0gdHJ1ZSwgc3RhcnQgPSB0b2tQb3M7CiAgICBmb3IgKDs7KSB7CiAgICAgIHZhciBjaCA9IGlucHV0LmNoYXJDb2RlQXQodG9rUG9zKTsKICAgICAgaWYgKGlzSWRlbnRpZmllckNoYXIoY2gpKSB7CiAgICAgICAgaWYgKGNvbnRhaW5zRXNjKSB3b3JkICs9IGlucHV0LmNoYXJBdCh0b2tQb3MpOwogICAgICAgICsrdG9rUG9zOwogICAgICB9IGVsc2UgaWYgKGNoID09PSA5MikgeyAvLyAiXCIKICAgICAgICBpZiAoIWNvbnRhaW5zRXNjKSB3b3JkID0gaW5wdXQuc2xpY2Uoc3RhcnQsIHRva1Bvcyk7CiAgICAgICAgY29udGFpbnNFc2MgPSB0cnVlOwogICAgICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KCsrdG9rUG9zKSAhPSAxMTcpIC8vICJ1IgogICAgICAgICAgcmFpc2UodG9rUG9zLCAiRXhwZWN0aW5nIFVuaWNvZGUgZXNjYXBlIHNlcXVlbmNlIFxcdVhYWFgiKTsKICAgICAgICArK3Rva1BvczsKICAgICAgICB2YXIgZXNjID0gcmVhZEhleENoYXIoNCk7CiAgICAgICAgdmFyIGVzY1N0ciA9IFN0cmluZy5mcm9tQ2hhckNvZGUoZXNjKTsKICAgICAgICBpZiAoIWVzY1N0cikgcmFpc2UodG9rUG9zIC0gMSwgIkludmFsaWQgVW5pY29kZSBlc2NhcGUiKTsKICAgICAgICBpZiAoIShmaXJzdCA/IGlzSWRlbnRpZmllclN0YXJ0KGVzYykgOiBpc0lkZW50aWZpZXJDaGFyKGVzYykpKQogICAgICAgICAgcmFpc2UodG9rUG9zIC0gNCwgIkludmFsaWQgVW5pY29kZSBlc2NhcGUiKTsKICAgICAgICB3b3JkICs9IGVzY1N0cjsKICAgICAgfSBlbHNlIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBmaXJzdCA9IGZhbHNlOwogICAgfQogICAgcmV0dXJuIGNvbnRhaW5zRXNjID8gd29yZCA6IGlucHV0LnNsaWNlKHN0YXJ0LCB0b2tQb3MpOwogIH0KCiAgLy8gUmVhZCBhbiBpZGVudGlmaWVyIG9yIGtleXdvcmQgdG9rZW4uIFdpbGwgY2hlY2sgZm9yIHJlc2VydmVkCiAgLy8gd29yZHMgd2hlbiBuZWNlc3NhcnkuCgogIGZ1bmN0aW9uIHJlYWRXb3JkKCkgewogICAgdmFyIHdvcmQgPSByZWFkV29yZDEoKTsKICAgIHZhciB0eXBlID0gX25hbWU7CiAgICBpZiAoIWNvbnRhaW5zRXNjICYmIGlzS2V5d29yZCh3b3JkKSkKICAgICAgdHlwZSA9IGtleXdvcmRUeXBlc1t3b3JkXTsKICAgIHJldHVybiBmaW5pc2hUb2tlbih0eXBlLCB3b3JkKTsKICB9CgogIC8vICMjIFBhcnNlcgoKICAvLyBBIHJlY3Vyc2l2ZSBkZXNjZW50IHBhcnNlciBvcGVyYXRlcyBieSBkZWZpbmluZyBmdW5jdGlvbnMgZm9yIGFsbAogIC8vIHN5bnRhY3RpYyBlbGVtZW50cywgYW5kIHJlY3Vyc2l2ZWx5IGNhbGxpbmcgdGhvc2UsIGVhY2ggZnVuY3Rpb24KICAvLyBhZHZhbmNpbmcgdGhlIGlucHV0IHN0cmVhbSBhbmQgcmV0dXJuaW5nIGFuIEFTVCBub2RlLiBQcmVjZWRlbmNlCiAgLy8gb2YgY29uc3RydWN0cyAoZm9yIGV4YW1wbGUsIHRoZSBmYWN0IHRoYXQgYCF4WzFdYCBtZWFucyBgISh4WzFdKWAKICAvLyBpbnN0ZWFkIG9mIGAoIXgpWzFdYCBpcyBoYW5kbGVkIGJ5IHRoZSBmYWN0IHRoYXQgdGhlIHBhcnNlcgogIC8vIGZ1bmN0aW9uIHRoYXQgcGFyc2VzIHVuYXJ5IHByZWZpeCBvcGVyYXRvcnMgaXMgY2FsbGVkIGZpcnN0LCBhbmQKICAvLyBpbiB0dXJuIGNhbGxzIHRoZSBmdW5jdGlvbiB0aGF0IHBhcnNlcyBgW11gIHN1YnNjcmlwdHMg4oCUIHRoYXQKICAvLyB3YXksIGl0J2xsIHJlY2VpdmUgdGhlIG5vZGUgZm9yIGB4WzFdYCBhbHJlYWR5IHBhcnNlZCwgYW5kIHdyYXBzCiAgLy8gKnRoYXQqIGluIHRoZSB1bmFyeSBvcGVyYXRvciBub2RlLgogIC8vCiAgLy8gQWNvcm4gdXNlcyBhbiBbb3BlcmF0b3IgcHJlY2VkZW5jZSBwYXJzZXJdW29wcF0gdG8gaGFuZGxlIGJpbmFyeQogIC8vIG9wZXJhdG9yIHByZWNlZGVuY2UsIGJlY2F1c2UgaXQgaXMgbXVjaCBtb3JlIGNvbXBhY3QgdGhhbiB1c2luZwogIC8vIHRoZSB0ZWNobmlxdWUgb3V0bGluZWQgYWJvdmUsIHdoaWNoIHVzZXMgZGlmZmVyZW50LCBuZXN0aW5nCiAgLy8gZnVuY3Rpb25zIHRvIHNwZWNpZnkgcHJlY2VkZW5jZSwgZm9yIGFsbCBvZiB0aGUgdGVuIGJpbmFyeQogIC8vIHByZWNlZGVuY2UgbGV2ZWxzIHRoYXQgSmF2YVNjcmlwdCBkZWZpbmVzLgogIC8vCiAgLy8gW29wcF06IGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvT3BlcmF0b3ItcHJlY2VkZW5jZV9wYXJzZXIKCiAgLy8gIyMjIFBhcnNlciB1dGlsaXRpZXMKCiAgLy8gQ29udGludWUgdG8gdGhlIG5leHQgdG9rZW4uCgogIGZ1bmN0aW9uIG5leHQoKSB7CiAgICBsYXN0U3RhcnQgPSB0b2tTdGFydDsKICAgIGxhc3RFbmQgPSB0b2tFbmQ7CiAgICBsYXN0RW5kTG9jID0gdG9rRW5kTG9jOwogICAgcmVhZFRva2VuKCk7CiAgfQoKICAvLyBFbnRlciBzdHJpY3QgbW9kZS4gUmUtcmVhZHMgdGhlIG5leHQgdG9rZW4gdG8gcGxlYXNlIHBlZGFudGljCiAgLy8gdGVzdHMgKCJ1c2Ugc3RyaWN0IjsgMDEwOyAtLSBzaG91bGQgZmFpbCkuCgogIGZ1bmN0aW9uIHNldFN0cmljdChzdHJjdCkgewogICAgc3RyaWN0ID0gc3RyY3Q7CiAgICB0b2tQb3MgPSB0b2tTdGFydDsKICAgIGlmIChvcHRpb25zLmxvY2F0aW9ucykgewogICAgICB3aGlsZSAodG9rUG9zIDwgdG9rTGluZVN0YXJ0KSB7CiAgICAgICAgdG9rTGluZVN0YXJ0ID0gaW5wdXQubGFzdEluZGV4T2YoIlxuIiwgdG9rTGluZVN0YXJ0IC0gMikgKyAxOwogICAgICAgIC0tdG9rQ3VyTGluZTsKICAgICAgfQogICAgfQogICAgc2tpcFNwYWNlKCk7CiAgICByZWFkVG9rZW4oKTsKICB9CgogIC8vIFN0YXJ0IGFuIEFTVCBub2RlLCBhdHRhY2hpbmcgYSBzdGFydCBvZmZzZXQuCgogIGZ1bmN0aW9uIG5vZGVfdCgpIHsKICAgIHRoaXMudHlwZSA9IG51bGw7CiAgICB0aGlzLnN0YXJ0ID0gdG9rU3RhcnQ7CiAgICB0aGlzLmVuZCA9IG51bGw7CiAgfQoKICBmdW5jdGlvbiBub2RlX2xvY190KCkgewogICAgdGhpcy5zdGFydCA9IHRva1N0YXJ0TG9jOwogICAgdGhpcy5lbmQgPSBudWxsOwogICAgaWYgKHNvdXJjZUZpbGUgIT09IG51bGwpIHRoaXMuc291cmNlID0gc291cmNlRmlsZTsKICB9CgogIGZ1bmN0aW9uIHN0YXJ0Tm9kZSgpIHsKICAgIHZhciBub2RlID0gbmV3IG5vZGVfdCgpOwogICAgaWYgKG9wdGlvbnMubG9jYXRpb25zKQogICAgICBub2RlLmxvYyA9IG5ldyBub2RlX2xvY190KCk7CiAgICBpZiAob3B0aW9ucy5kaXJlY3RTb3VyY2VGaWxlKQogICAgICBub2RlLnNvdXJjZUZpbGUgPSBvcHRpb25zLmRpcmVjdFNvdXJjZUZpbGU7CiAgICBpZiAob3B0aW9ucy5yYW5nZXMpCiAgICAgIG5vZGUucmFuZ2UgPSBbdG9rU3RhcnQsIDBdOwogICAgcmV0dXJuIG5vZGU7CiAgfQoKICAvLyBTdGFydCBhIG5vZGUgd2hvc2Ugc3RhcnQgb2Zmc2V0IGluZm9ybWF0aW9uIHNob3VsZCBiZSBiYXNlZCBvbgogIC8vIHRoZSBzdGFydCBvZiBhbm90aGVyIG5vZGUuIEZvciBleGFtcGxlLCBhIGJpbmFyeSBvcGVyYXRvciBub2RlIGlzCiAgLy8gb25seSBzdGFydGVkIGFmdGVyIGl0cyBsZWZ0LWhhbmQgc2lkZSBoYXMgYWxyZWFkeSBiZWVuIHBhcnNlZC4KCiAgZnVuY3Rpb24gc3RhcnROb2RlRnJvbShvdGhlcikgewogICAgdmFyIG5vZGUgPSBuZXcgbm9kZV90KCk7CiAgICBub2RlLnN0YXJ0ID0gb3RoZXIuc3RhcnQ7CiAgICBpZiAob3B0aW9ucy5sb2NhdGlvbnMpIHsKICAgICAgbm9kZS5sb2MgPSBuZXcgbm9kZV9sb2NfdCgpOwogICAgICBub2RlLmxvYy5zdGFydCA9IG90aGVyLmxvYy5zdGFydDsKICAgIH0KICAgIGlmIChvcHRpb25zLnJhbmdlcykKICAgICAgbm9kZS5yYW5nZSA9IFtvdGhlci5yYW5nZVswXSwgMF07CgogICAgcmV0dXJuIG5vZGU7CiAgfQoKICAvLyBGaW5pc2ggYW4gQVNUIG5vZGUsIGFkZGluZyBgdHlwZWAgYW5kIGBlbmRgIHByb3BlcnRpZXMuCgogIGZ1bmN0aW9uIGZpbmlzaE5vZGUobm9kZSwgdHlwZSkgewogICAgbm9kZS50eXBlID0gdHlwZTsKICAgIG5vZGUuZW5kID0gbGFzdEVuZDsKICAgIGlmIChvcHRpb25zLmxvY2F0aW9ucykKICAgICAgbm9kZS5sb2MuZW5kID0gbGFzdEVuZExvYzsKICAgIGlmIChvcHRpb25zLnJhbmdlcykKICAgICAgbm9kZS5yYW5nZVsxXSA9IGxhc3RFbmQ7CiAgICByZXR1cm4gbm9kZTsKICB9CgogIC8vIFRlc3Qgd2hldGhlciBhIHN0YXRlbWVudCBub2RlIGlzIHRoZSBzdHJpbmcgbGl0ZXJhbCBgInVzZSBzdHJpY3QiYC4KCiAgZnVuY3Rpb24gaXNVc2VTdHJpY3Qoc3RtdCkgewogICAgcmV0dXJuIG9wdGlvbnMuZWNtYVZlcnNpb24gPj0gNSAmJiBzdG10LnR5cGUgPT09ICJFeHByZXNzaW9uU3RhdGVtZW50IiAmJgogICAgICBzdG10LmV4cHJlc3Npb24udHlwZSA9PT0gIkxpdGVyYWwiICYmIHN0bXQuZXhwcmVzc2lvbi52YWx1ZSA9PT0gInVzZSBzdHJpY3QiOwogIH0KCiAgLy8gUHJlZGljYXRlIHRoYXQgdGVzdHMgd2hldGhlciB0aGUgbmV4dCB0b2tlbiBpcyBvZiB0aGUgZ2l2ZW4KICAvLyB0eXBlLCBhbmQgaWYgeWVzLCBjb25zdW1lcyBpdCBhcyBhIHNpZGUgZWZmZWN0LgoKICBmdW5jdGlvbiBlYXQodHlwZSkgewogICAgaWYgKHRva1R5cGUgPT09IHR5cGUpIHsKICAgICAgbmV4dCgpOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICB9CgogIC8vIFRlc3Qgd2hldGhlciBhIHNlbWljb2xvbiBjYW4gYmUgaW5zZXJ0ZWQgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24uCgogIGZ1bmN0aW9uIGNhbkluc2VydFNlbWljb2xvbigpIHsKICAgIHJldHVybiAhb3B0aW9ucy5zdHJpY3RTZW1pY29sb25zICYmCiAgICAgICh0b2tUeXBlID09PSBfZW9mIHx8IHRva1R5cGUgPT09IF9icmFjZVIgfHwgbmV3bGluZS50ZXN0KGlucHV0LnNsaWNlKGxhc3RFbmQsIHRva1N0YXJ0KSkpOwogIH0KCiAgLy8gQ29uc3VtZSBhIHNlbWljb2xvbiwgb3IsIGZhaWxpbmcgdGhhdCwgc2VlIGlmIHdlIGFyZSBhbGxvd2VkIHRvCiAgLy8gcHJldGVuZCB0aGF0IHRoZXJlIGlzIGEgc2VtaWNvbG9uIGF0IHRoaXMgcG9zaXRpb24uCgogIGZ1bmN0aW9uIHNlbWljb2xvbigpIHsKICAgIGlmICghZWF0KF9zZW1pKSAmJiAhY2FuSW5zZXJ0U2VtaWNvbG9uKCkpIHVuZXhwZWN0ZWQoKTsKICB9CgogIC8vIEV4cGVjdCBhIHRva2VuIG9mIGEgZ2l2ZW4gdHlwZS4gSWYgZm91bmQsIGNvbnN1bWUgaXQsIG90aGVyd2lzZSwKICAvLyByYWlzZSBhbiB1bmV4cGVjdGVkIHRva2VuIGVycm9yLgoKICBmdW5jdGlvbiBleHBlY3QodHlwZSkgewogICAgaWYgKHRva1R5cGUgPT09IHR5cGUpIG5leHQoKTsKICAgIGVsc2UgdW5leHBlY3RlZCgpOwogIH0KCiAgLy8gUmFpc2UgYW4gdW5leHBlY3RlZCB0b2tlbiBlcnJvci4KCiAgZnVuY3Rpb24gdW5leHBlY3RlZCgpIHsKICAgIHJhaXNlKHRva1N0YXJ0LCAiVW5leHBlY3RlZCB0b2tlbiIpOwogIH0KCiAgLy8gVmVyaWZ5IHRoYXQgYSBub2RlIGlzIGFuIGx2YWwg4oCUIHNvbWV0aGluZyB0aGF0IGNhbiBiZSBhc3NpZ25lZAogIC8vIHRvLgoKICBmdW5jdGlvbiBjaGVja0xWYWwoZXhwcikgewogICAgaWYgKGV4cHIudHlwZSAhPT0gIklkZW50aWZpZXIiICYmIGV4cHIudHlwZSAhPT0gIk1lbWJlckV4cHJlc3Npb24iKQogICAgICByYWlzZShleHByLnN0YXJ0LCAiQXNzaWduaW5nIHRvIHJ2YWx1ZSIpOwogICAgaWYgKHN0cmljdCAmJiBleHByLnR5cGUgPT09ICJJZGVudGlmaWVyIiAmJiBpc1N0cmljdEJhZElkV29yZChleHByLm5hbWUpKQogICAgICByYWlzZShleHByLnN0YXJ0LCAiQXNzaWduaW5nIHRvICIgKyBleHByLm5hbWUgKyAiIGluIHN0cmljdCBtb2RlIik7CiAgfQoKICAvLyAjIyMgU3RhdGVtZW50IHBhcnNpbmcKCiAgLy8gUGFyc2UgYSBwcm9ncmFtLiBJbml0aWFsaXplcyB0aGUgcGFyc2VyLCByZWFkcyBhbnkgbnVtYmVyIG9mCiAgLy8gc3RhdGVtZW50cywgYW5kIHdyYXBzIHRoZW0gaW4gYSBQcm9ncmFtIG5vZGUuICBPcHRpb25hbGx5IHRha2VzIGEKICAvLyBgcHJvZ3JhbWAgYXJndW1lbnQuICBJZiBwcmVzZW50LCB0aGUgc3RhdGVtZW50cyB3aWxsIGJlIGFwcGVuZGVkCiAgLy8gdG8gaXRzIGJvZHkgaW5zdGVhZCBvZiBjcmVhdGluZyBhIG5ldyBub2RlLgoKICBmdW5jdGlvbiBwYXJzZVRvcExldmVsKHByb2dyYW0pIHsKICAgIGxhc3RTdGFydCA9IGxhc3RFbmQgPSB0b2tQb3M7CiAgICBpZiAob3B0aW9ucy5sb2NhdGlvbnMpIGxhc3RFbmRMb2MgPSBuZXcgbGluZV9sb2NfdDsKICAgIGluRnVuY3Rpb24gPSBzdHJpY3QgPSBudWxsOwogICAgbGFiZWxzID0gW107CiAgICByZWFkVG9rZW4oKTsKCiAgICB2YXIgbm9kZSA9IHByb2dyYW0gfHwgc3RhcnROb2RlKCksIGZpcnN0ID0gdHJ1ZTsKICAgIGlmICghcHJvZ3JhbSkgbm9kZS5ib2R5ID0gW107CiAgICB3aGlsZSAodG9rVHlwZSAhPT0gX2VvZikgewogICAgICB2YXIgc3RtdCA9IHBhcnNlU3RhdGVtZW50KCk7CiAgICAgIG5vZGUuYm9keS5wdXNoKHN0bXQpOwogICAgICBpZiAoZmlyc3QgJiYgaXNVc2VTdHJpY3Qoc3RtdCkpIHNldFN0cmljdCh0cnVlKTsKICAgICAgZmlyc3QgPSBmYWxzZTsKICAgIH0KICAgIHJldHVybiBmaW5pc2hOb2RlKG5vZGUsICJQcm9ncmFtIik7CiAgfQoKICB2YXIgbG9vcExhYmVsID0ge2tpbmQ6ICJsb29wIn0sIHN3aXRjaExhYmVsID0ge2tpbmQ6ICJzd2l0Y2gifTsKCiAgLy8gUGFyc2UgYSBzaW5nbGUgc3RhdGVtZW50LgogIC8vCiAgLy8gSWYgZXhwZWN0aW5nIGEgc3RhdGVtZW50IGFuZCBmaW5kaW5nIGEgc2xhc2ggb3BlcmF0b3IsIHBhcnNlIGEKICAvLyByZWd1bGFyIGV4cHJlc3Npb24gbGl0ZXJhbC4gVGhpcyBpcyB0byBoYW5kbGUgY2FzZXMgbGlrZQogIC8vIGBpZiAoZm9vKSAvYmxhaC8uZXhlYyhmb28pO2AsIHdoZXJlIGxvb2tpbmcgYXQgdGhlIHByZXZpb3VzIHRva2VuCiAgLy8gZG9lcyBub3QgaGVscC4KCiAgZnVuY3Rpb24gcGFyc2VTdGF0ZW1lbnQoKSB7CiAgICBpZiAodG9rVHlwZSA9PT0gX3NsYXNoIHx8IHRva1R5cGUgPT09IF9hc3NpZ24gJiYgdG9rVmFsID09ICIvPSIpCiAgICAgIHJlYWRUb2tlbih0cnVlKTsKCiAgICB2YXIgc3RhcnR0eXBlID0gdG9rVHlwZSwgbm9kZSA9IHN0YXJ0Tm9kZSgpOwoKICAgIC8vIE1vc3QgdHlwZXMgb2Ygc3RhdGVtZW50cyBhcmUgcmVjb2duaXplZCBieSB0aGUga2V5d29yZCB0aGV5CiAgICAvLyBzdGFydCB3aXRoLiBNYW55IGFyZSB0cml2aWFsIHRvIHBhcnNlLCBzb21lIHJlcXVpcmUgYSBiaXQgb2YKICAgIC8vIGNvbXBsZXhpdHkuCgogICAgc3dpdGNoIChzdGFydHR5cGUpIHsKICAgIGNhc2UgX2JyZWFrOiBjYXNlIF9jb250aW51ZToKICAgICAgbmV4dCgpOwogICAgICB2YXIgaXNCcmVhayA9IHN0YXJ0dHlwZSA9PT0gX2JyZWFrOwogICAgICBpZiAoZWF0KF9zZW1pKSB8fCBjYW5JbnNlcnRTZW1pY29sb24oKSkgbm9kZS5sYWJlbCA9IG51bGw7CiAgICAgIGVsc2UgaWYgKHRva1R5cGUgIT09IF9uYW1lKSB1bmV4cGVjdGVkKCk7CiAgICAgIGVsc2UgewogICAgICAgIG5vZGUubGFiZWwgPSBwYXJzZUlkZW50KCk7CiAgICAgICAgc2VtaWNvbG9uKCk7CiAgICAgIH0KCiAgICAgIC8vIFZlcmlmeSB0aGF0IHRoZXJlIGlzIGFuIGFjdHVhbCBkZXN0aW5hdGlvbiB0byBicmVhayBvcgogICAgICAvLyBjb250aW51ZSB0by4KICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsYWJlbHMubGVuZ3RoOyArK2kpIHsKICAgICAgICB2YXIgbGFiID0gbGFiZWxzW2ldOwogICAgICAgIGlmIChub2RlLmxhYmVsID09IG51bGwgfHwgbGFiLm5hbWUgPT09IG5vZGUubGFiZWwubmFtZSkgewogICAgICAgICAgaWYgKGxhYi5raW5kICE9IG51bGwgJiYgKGlzQnJlYWsgfHwgbGFiLmtpbmQgPT09ICJsb29wIikpIGJyZWFrOwogICAgICAgICAgaWYgKG5vZGUubGFiZWwgJiYgaXNCcmVhaykgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChpID09PSBsYWJlbHMubGVuZ3RoKSByYWlzZShub2RlLnN0YXJ0LCAiVW5zeW50YWN0aWMgIiArIHN0YXJ0dHlwZS5rZXl3b3JkKTsKICAgICAgcmV0dXJuIGZpbmlzaE5vZGUobm9kZSwgaXNCcmVhayA/ICJCcmVha1N0YXRlbWVudCIgOiAiQ29udGludWVTdGF0ZW1lbnQiKTsKCiAgICBjYXNlIF9kZWJ1Z2dlcjoKICAgICAgbmV4dCgpOwogICAgICBzZW1pY29sb24oKTsKICAgICAgcmV0dXJuIGZpbmlzaE5vZGUobm9kZSwgIkRlYnVnZ2VyU3RhdGVtZW50Iik7CgogICAgY2FzZSBfZG86CiAgICAgIG5leHQoKTsKICAgICAgbGFiZWxzLnB1c2gobG9vcExhYmVsKTsKICAgICAgbm9kZS5ib2R5ID0gcGFyc2VTdGF0ZW1lbnQoKTsKICAgICAgbGFiZWxzLnBvcCgpOwogICAgICBleHBlY3QoX3doaWxlKTsKICAgICAgbm9kZS50ZXN0ID0gcGFyc2VQYXJlbkV4cHJlc3Npb24oKTsKICAgICAgc2VtaWNvbG9uKCk7CiAgICAgIHJldHVybiBmaW5pc2hOb2RlKG5vZGUsICJEb1doaWxlU3RhdGVtZW50Iik7CgogICAgICAvLyBEaXNhbWJpZ3VhdGluZyBiZXR3ZWVuIGEgYGZvcmAgYW5kIGEgYGZvcmAvYGluYCBsb29wIGlzCiAgICAgIC8vIG5vbi10cml2aWFsLiBCYXNpY2FsbHksIHdlIGhhdmUgdG8gcGFyc2UgdGhlIGluaXQgYHZhcmAKICAgICAgLy8gc3RhdGVtZW50IG9yIGV4cHJlc3Npb24sIGRpc2FsbG93aW5nIHRoZSBgaW5gIG9wZXJhdG9yIChzZWUKICAgICAgLy8gdGhlIHNlY29uZCBwYXJhbWV0ZXIgdG8gYHBhcnNlRXhwcmVzc2lvbmApLCBhbmQgdGhlbiBjaGVjawogICAgICAvLyB3aGV0aGVyIHRoZSBuZXh0IHRva2VuIGlzIGBpbmAuIFdoZW4gdGhlcmUgaXMgbm8gaW5pdCBwYXJ0CiAgICAgIC8vIChzZW1pY29sb24gaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIG9wZW5pbmcgcGFyZW50aGVzaXMpLCBpdCBpcwogICAgICAvLyBhIHJlZ3VsYXIgYGZvcmAgbG9vcC4KCiAgICBjYXNlIF9mb3I6CiAgICAgIG5leHQoKTsKICAgICAgbGFiZWxzLnB1c2gobG9vcExhYmVsKTsKICAgICAgZXhwZWN0KF9wYXJlbkwpOwogICAgICBpZiAodG9rVHlwZSA9PT0gX3NlbWkpIHJldHVybiBwYXJzZUZvcihub2RlLCBudWxsKTsKICAgICAgaWYgKHRva1R5cGUgPT09IF92YXIpIHsKICAgICAgICB2YXIgaW5pdCA9IHN0YXJ0Tm9kZSgpOwogICAgICAgIG5leHQoKTsKICAgICAgICBwYXJzZVZhcihpbml0LCB0cnVlKTsKICAgICAgICBmaW5pc2hOb2RlKGluaXQsICJWYXJpYWJsZURlY2xhcmF0aW9uIik7CiAgICAgICAgaWYgKGluaXQuZGVjbGFyYXRpb25zLmxlbmd0aCA9PT0gMSAmJiBlYXQoX2luKSkKICAgICAgICAgIHJldHVybiBwYXJzZUZvckluKG5vZGUsIGluaXQpOwogICAgICAgIHJldHVybiBwYXJzZUZvcihub2RlLCBpbml0KTsKICAgICAgfQogICAgICB2YXIgaW5pdCA9IHBhcnNlRXhwcmVzc2lvbihmYWxzZSwgdHJ1ZSk7CiAgICAgIGlmIChlYXQoX2luKSkge2NoZWNrTFZhbChpbml0KTsgcmV0dXJuIHBhcnNlRm9ySW4obm9kZSwgaW5pdCk7fQogICAgICByZXR1cm4gcGFyc2VGb3Iobm9kZSwgaW5pdCk7CgogICAgY2FzZSBfZnVuY3Rpb246CiAgICAgIG5leHQoKTsKICAgICAgcmV0dXJuIHBhcnNlRnVuY3Rpb24obm9kZSwgdHJ1ZSk7CgogICAgY2FzZSBfaWY6CiAgICAgIG5leHQoKTsKICAgICAgbm9kZS50ZXN0ID0gcGFyc2VQYXJlbkV4cHJlc3Npb24oKTsKICAgICAgbm9kZS5jb25zZXF1ZW50ID0gcGFyc2VTdGF0ZW1lbnQoKTsKICAgICAgbm9kZS5hbHRlcm5hdGUgPSBlYXQoX2Vsc2UpID8gcGFyc2VTdGF0ZW1lbnQoKSA6IG51bGw7CiAgICAgIHJldHVybiBmaW5pc2hOb2RlKG5vZGUsICJJZlN0YXRlbWVudCIpOwoKICAgIGNhc2UgX3JldHVybjoKICAgICAgaWYgKCFpbkZ1bmN0aW9uICYmICFvcHRpb25zLmFsbG93UmV0dXJuT3V0c2lkZUZ1bmN0aW9uKQogICAgICAgIHJhaXNlKHRva1N0YXJ0LCAiJ3JldHVybicgb3V0c2lkZSBvZiBmdW5jdGlvbiIpOwogICAgICBuZXh0KCk7CgogICAgICAvLyBJbiBgcmV0dXJuYCAoYW5kIGBicmVha2AvYGNvbnRpbnVlYCksIHRoZSBrZXl3b3JkcyB3aXRoCiAgICAgIC8vIG9wdGlvbmFsIGFyZ3VtZW50cywgd2UgZWFnZXJseSBsb29rIGZvciBhIHNlbWljb2xvbiBvciB0aGUKICAgICAgLy8gcG9zc2liaWxpdHkgdG8gaW5zZXJ0IG9uZS4KCiAgICAgIGlmIChlYXQoX3NlbWkpIHx8IGNhbkluc2VydFNlbWljb2xvbigpKSBub2RlLmFyZ3VtZW50ID0gbnVsbDsKICAgICAgZWxzZSB7IG5vZGUuYXJndW1lbnQgPSBwYXJzZUV4cHJlc3Npb24oKTsgc2VtaWNvbG9uKCk7IH0KICAgICAgcmV0dXJuIGZpbmlzaE5vZGUobm9kZSwgIlJldHVyblN0YXRlbWVudCIpOwoKICAgIGNhc2UgX3N3aXRjaDoKICAgICAgbmV4dCgpOwogICAgICBub2RlLmRpc2NyaW1pbmFudCA9IHBhcnNlUGFyZW5FeHByZXNzaW9uKCk7CiAgICAgIG5vZGUuY2FzZXMgPSBbXTsKICAgICAgZXhwZWN0KF9icmFjZUwpOwogICAgICBsYWJlbHMucHVzaChzd2l0Y2hMYWJlbCk7CgogICAgICAvLyBTdGF0ZW1lbnRzIHVuZGVyIG11c3QgYmUgZ3JvdXBlZCAoYnkgbGFiZWwpIGluIFN3aXRjaENhc2UKICAgICAgLy8gbm9kZXMuIGBjdXJgIGlzIHVzZWQgdG8ga2VlcCB0aGUgbm9kZSB0aGF0IHdlIGFyZSBjdXJyZW50bHkKICAgICAgLy8gYWRkaW5nIHN0YXRlbWVudHMgdG8uCgogICAgICBmb3IgKHZhciBjdXIsIHNhd0RlZmF1bHQ7IHRva1R5cGUgIT0gX2JyYWNlUjspIHsKICAgICAgICBpZiAodG9rVHlwZSA9PT0gX2Nhc2UgfHwgdG9rVHlwZSA9PT0gX2RlZmF1bHQpIHsKICAgICAgICAgIHZhciBpc0Nhc2UgPSB0b2tUeXBlID09PSBfY2FzZTsKICAgICAgICAgIGlmIChjdXIpIGZpbmlzaE5vZGUoY3VyLCAiU3dpdGNoQ2FzZSIpOwogICAgICAgICAgbm9kZS5jYXNlcy5wdXNoKGN1ciA9IHN0YXJ0Tm9kZSgpKTsKICAgICAgICAgIGN1ci5jb25zZXF1ZW50ID0gW107CiAgICAgICAgICBuZXh0KCk7CiAgICAgICAgICBpZiAoaXNDYXNlKSBjdXIudGVzdCA9IHBhcnNlRXhwcmVzc2lvbigpOwogICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGlmIChzYXdEZWZhdWx0KSByYWlzZShsYXN0U3RhcnQsICJNdWx0aXBsZSBkZWZhdWx0IGNsYXVzZXMiKTsgc2F3RGVmYXVsdCA9IHRydWU7CiAgICAgICAgICAgIGN1ci50ZXN0ID0gbnVsbDsKICAgICAgICAgIH0KICAgICAgICAgIGV4cGVjdChfY29sb24pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoIWN1cikgdW5leHBlY3RlZCgpOwogICAgICAgICAgY3VyLmNvbnNlcXVlbnQucHVzaChwYXJzZVN0YXRlbWVudCgpKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGN1cikgZmluaXNoTm9kZShjdXIsICJTd2l0Y2hDYXNlIik7CiAgICAgIG5leHQoKTsgLy8gQ2xvc2luZyBicmFjZQogICAgICBsYWJlbHMucG9wKCk7CiAgICAgIHJldHVybiBmaW5pc2hOb2RlKG5vZGUsICJTd2l0Y2hTdGF0ZW1lbnQiKTsKCiAgICBjYXNlIF90aHJvdzoKICAgICAgbmV4dCgpOwogICAgICBpZiAobmV3bGluZS50ZXN0KGlucHV0LnNsaWNlKGxhc3RFbmQsIHRva1N0YXJ0KSkpCiAgICAgICAgcmFpc2UobGFzdEVuZCwgIklsbGVnYWwgbmV3bGluZSBhZnRlciB0aHJvdyIpOwogICAgICBub2RlLmFyZ3VtZW50ID0gcGFyc2VFeHByZXNzaW9uKCk7CiAgICAgIHNlbWljb2xvbigpOwogICAgICByZXR1cm4gZmluaXNoTm9kZShub2RlLCAiVGhyb3dTdGF0ZW1lbnQiKTsKCiAgICBjYXNlIF90cnk6CiAgICAgIG5leHQoKTsKICAgICAgbm9kZS5ibG9jayA9IHBhcnNlQmxvY2soKTsKICAgICAgbm9kZS5oYW5kbGVyID0gbnVsbDsKICAgICAgaWYgKHRva1R5cGUgPT09IF9jYXRjaCkgewogICAgICAgIHZhciBjbGF1c2UgPSBzdGFydE5vZGUoKTsKICAgICAgICBuZXh0KCk7CiAgICAgICAgZXhwZWN0KF9wYXJlbkwpOwogICAgICAgIGNsYXVzZS5wYXJhbSA9IHBhcnNlSWRlbnQoKTsKICAgICAgICBpZiAoc3RyaWN0ICYmIGlzU3RyaWN0QmFkSWRXb3JkKGNsYXVzZS5wYXJhbS5uYW1lKSkKICAgICAgICAgIHJhaXNlKGNsYXVzZS5wYXJhbS5zdGFydCwgIkJpbmRpbmcgIiArIGNsYXVzZS5wYXJhbS5uYW1lICsgIiBpbiBzdHJpY3QgbW9kZSIpOwogICAgICAgIGV4cGVjdChfcGFyZW5SKTsKICAgICAgICBjbGF1c2UuZ3VhcmQgPSBudWxsOwogICAgICAgIGNsYXVzZS5ib2R5ID0gcGFyc2VCbG9jaygpOwogICAgICAgIG5vZGUuaGFuZGxlciA9IGZpbmlzaE5vZGUoY2xhdXNlLCAiQ2F0Y2hDbGF1c2UiKTsKICAgICAgfQogICAgICBub2RlLmd1YXJkZWRIYW5kbGVycyA9IGVtcHR5OwogICAgICBub2RlLmZpbmFsaXplciA9IGVhdChfZmluYWxseSkgPyBwYXJzZUJsb2NrKCkgOiBudWxsOwogICAgICBpZiAoIW5vZGUuaGFuZGxlciAmJiAhbm9kZS5maW5hbGl6ZXIpCiAgICAgICAgcmFpc2Uobm9kZS5zdGFydCwgIk1pc3NpbmcgY2F0Y2ggb3IgZmluYWxseSBjbGF1c2UiKTsKICAgICAgcmV0dXJuIGZpbmlzaE5vZGUobm9kZSwgIlRyeVN0YXRlbWVudCIpOwoKICAgIGNhc2UgX3ZhcjoKICAgICAgbmV4dCgpOwogICAgICBwYXJzZVZhcihub2RlKTsKICAgICAgc2VtaWNvbG9uKCk7CiAgICAgIHJldHVybiBmaW5pc2hOb2RlKG5vZGUsICJWYXJpYWJsZURlY2xhcmF0aW9uIik7CgogICAgY2FzZSBfd2hpbGU6CiAgICAgIG5leHQoKTsKICAgICAgbm9kZS50ZXN0ID0gcGFyc2VQYXJlbkV4cHJlc3Npb24oKTsKICAgICAgbGFiZWxzLnB1c2gobG9vcExhYmVsKTsKICAgICAgbm9kZS5ib2R5ID0gcGFyc2VTdGF0ZW1lbnQoKTsKICAgICAgbGFiZWxzLnBvcCgpOwogICAgICByZXR1cm4gZmluaXNoTm9kZShub2RlLCAiV2hpbGVTdGF0ZW1lbnQiKTsKCiAgICBjYXNlIF93aXRoOgogICAgICBpZiAoc3RyaWN0KSByYWlzZSh0b2tTdGFydCwgIid3aXRoJyBpbiBzdHJpY3QgbW9kZSIpOwogICAgICBuZXh0KCk7CiAgICAgIG5vZGUub2JqZWN0ID0gcGFyc2VQYXJlbkV4cHJlc3Npb24oKTsKICAgICAgbm9kZS5ib2R5ID0gcGFyc2VTdGF0ZW1lbnQoKTsKICAgICAgcmV0dXJuIGZpbmlzaE5vZGUobm9kZSwgIldpdGhTdGF0ZW1lbnQiKTsKCiAgICBjYXNlIF9icmFjZUw6CiAgICAgIHJldHVybiBwYXJzZUJsb2NrKCk7CgogICAgY2FzZSBfc2VtaToKICAgICAgbmV4dCgpOwogICAgICByZXR1cm4gZmluaXNoTm9kZShub2RlLCAiRW1wdHlTdGF0ZW1lbnQiKTsKCiAgICAgIC8vIElmIHRoZSBzdGF0ZW1lbnQgZG9lcyBub3Qgc3RhcnQgd2l0aCBhIHN0YXRlbWVudCBrZXl3b3JkIG9yIGEKICAgICAgLy8gYnJhY2UsIGl0J3MgYW4gRXhwcmVzc2lvblN0YXRlbWVudCBvciBMYWJlbGVkU3RhdGVtZW50LiBXZQogICAgICAvLyBzaW1wbHkgc3RhcnQgcGFyc2luZyBhbiBleHByZXNzaW9uLCBhbmQgYWZ0ZXJ3YXJkcywgaWYgdGhlCiAgICAgIC8vIG5leHQgdG9rZW4gaXMgYSBjb2xvbiBhbmQgdGhlIGV4cHJlc3Npb24gd2FzIGEgc2ltcGxlCiAgICAgIC8vIElkZW50aWZpZXIgbm9kZSwgd2Ugc3dpdGNoIHRvIGludGVycHJldGluZyBpdCBhcyBhIGxhYmVsLgoKICAgIGRlZmF1bHQ6CiAgICAgIHZhciBtYXliZU5hbWUgPSB0b2tWYWwsIGV4cHIgPSBwYXJzZUV4cHJlc3Npb24oKTsKICAgICAgaWYgKHN0YXJ0dHlwZSA9PT0gX25hbWUgJiYgZXhwci50eXBlID09PSAiSWRlbnRpZmllciIgJiYgZWF0KF9jb2xvbikpIHsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxhYmVscy5sZW5ndGg7ICsraSkKICAgICAgICAgIGlmIChsYWJlbHNbaV0ubmFtZSA9PT0gbWF5YmVOYW1lKSByYWlzZShleHByLnN0YXJ0LCAiTGFiZWwgJyIgKyBtYXliZU5hbWUgKyAiJyBpcyBhbHJlYWR5IGRlY2xhcmVkIik7CiAgICAgICAgdmFyIGtpbmQgPSB0b2tUeXBlLmlzTG9vcCA/ICJsb29wIiA6IHRva1R5cGUgPT09IF9zd2l0Y2ggPyAic3dpdGNoIiA6IG51bGw7CiAgICAgICAgbGFiZWxzLnB1c2goe25hbWU6IG1heWJlTmFtZSwga2luZDoga2luZH0pOwogICAgICAgIG5vZGUuYm9keSA9IHBhcnNlU3RhdGVtZW50KCk7CiAgICAgICAgbGFiZWxzLnBvcCgpOwogICAgICAgIG5vZGUubGFiZWwgPSBleHByOwogICAgICAgIHJldHVybiBmaW5pc2hOb2RlKG5vZGUsICJMYWJlbGVkU3RhdGVtZW50Iik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbm9kZS5leHByZXNzaW9uID0gZXhwcjsKICAgICAgICBzZW1pY29sb24oKTsKICAgICAgICByZXR1cm4gZmluaXNoTm9kZShub2RlLCAiRXhwcmVzc2lvblN0YXRlbWVudCIpOwogICAgICB9CiAgICB9CiAgfQoKICAvLyBVc2VkIGZvciBjb25zdHJ1Y3RzIGxpa2UgYHN3aXRjaGAgYW5kIGBpZmAgdGhhdCBpbnNpc3Qgb24KICAvLyBwYXJlbnRoZXNlcyBhcm91bmQgdGhlaXIgZXhwcmVzc2lvbi4KCiAgZnVuY3Rpb24gcGFyc2VQYXJlbkV4cHJlc3Npb24oKSB7CiAgICBleHBlY3QoX3BhcmVuTCk7CiAgICB2YXIgdmFsID0gcGFyc2VFeHByZXNzaW9uKCk7CiAgICBleHBlY3QoX3BhcmVuUik7CiAgICByZXR1cm4gdmFsOwogIH0KCiAgLy8gUGFyc2UgYSBzZW1pY29sb24tZW5jbG9zZWQgYmxvY2sgb2Ygc3RhdGVtZW50cywgaGFuZGxpbmcgYCJ1c2UKICAvLyBzdHJpY3QiYCBkZWNsYXJhdGlvbnMgd2hlbiBgYWxsb3dTdHJpY3RgIGlzIHRydWUgKHVzZWQgZm9yCiAgLy8gZnVuY3Rpb24gYm9kaWVzKS4KCiAgZnVuY3Rpb24gcGFyc2VCbG9jayhhbGxvd1N0cmljdCkgewogICAgdmFyIG5vZGUgPSBzdGFydE5vZGUoKSwgZmlyc3QgPSB0cnVlLCBzdHJpY3QgPSBmYWxzZSwgb2xkU3RyaWN0OwogICAgbm9kZS5ib2R5ID0gW107CiAgICBleHBlY3QoX2JyYWNlTCk7CiAgICB3aGlsZSAoIWVhdChfYnJhY2VSKSkgewogICAgICB2YXIgc3RtdCA9IHBhcnNlU3RhdGVtZW50KCk7CiAgICAgIG5vZGUuYm9keS5wdXNoKHN0bXQpOwogICAgICBpZiAoZmlyc3QgJiYgYWxsb3dTdHJpY3QgJiYgaXNVc2VTdHJpY3Qoc3RtdCkpIHsKICAgICAgICBvbGRTdHJpY3QgPSBzdHJpY3Q7CiAgICAgICAgc2V0U3RyaWN0KHN0cmljdCA9IHRydWUpOwogICAgICB9CiAgICAgIGZpcnN0ID0gZmFsc2U7CiAgICB9CiAgICBpZiAoc3RyaWN0ICYmICFvbGRTdHJpY3QpIHNldFN0cmljdChmYWxzZSk7CiAgICByZXR1cm4gZmluaXNoTm9kZShub2RlLCAiQmxvY2tTdGF0ZW1lbnQiKTsKICB9CgogIC8vIFBhcnNlIGEgcmVndWxhciBgZm9yYCBsb29wLiBUaGUgZGlzYW1iaWd1YXRpb24gY29kZSBpbgogIC8vIGBwYXJzZVN0YXRlbWVudGAgd2lsbCBhbHJlYWR5IGhhdmUgcGFyc2VkIHRoZSBpbml0IHN0YXRlbWVudCBvcgogIC8vIGV4cHJlc3Npb24uCgogIGZ1bmN0aW9uIHBhcnNlRm9yKG5vZGUsIGluaXQpIHsKICAgIG5vZGUuaW5pdCA9IGluaXQ7CiAgICBleHBlY3QoX3NlbWkpOwogICAgbm9kZS50ZXN0ID0gdG9rVHlwZSA9PT0gX3NlbWkgPyBudWxsIDogcGFyc2VFeHByZXNzaW9uKCk7CiAgICBleHBlY3QoX3NlbWkpOwogICAgbm9kZS51cGRhdGUgPSB0b2tUeXBlID09PSBfcGFyZW5SID8gbnVsbCA6IHBhcnNlRXhwcmVzc2lvbigpOwogICAgZXhwZWN0KF9wYXJlblIpOwogICAgbm9kZS5ib2R5ID0gcGFyc2VTdGF0ZW1lbnQoKTsKICAgIGxhYmVscy5wb3AoKTsKICAgIHJldHVybiBmaW5pc2hOb2RlKG5vZGUsICJGb3JTdGF0ZW1lbnQiKTsKICB9CgogIC8vIFBhcnNlIGEgYGZvcmAvYGluYCBsb29wLgoKICBmdW5jdGlvbiBwYXJzZUZvckluKG5vZGUsIGluaXQpIHsKICAgIG5vZGUubGVmdCA9IGluaXQ7CiAgICBub2RlLnJpZ2h0ID0gcGFyc2VFeHByZXNzaW9uKCk7CiAgICBleHBlY3QoX3BhcmVuUik7CiAgICBub2RlLmJvZHkgPSBwYXJzZVN0YXRlbWVudCgpOwogICAgbGFiZWxzLnBvcCgpOwogICAgcmV0dXJuIGZpbmlzaE5vZGUobm9kZSwgIkZvckluU3RhdGVtZW50Iik7CiAgfQoKICAvLyBQYXJzZSBhIGxpc3Qgb2YgdmFyaWFibGUgZGVjbGFyYXRpb25zLgoKICBmdW5jdGlvbiBwYXJzZVZhcihub2RlLCBub0luKSB7CiAgICBub2RlLmRlY2xhcmF0aW9ucyA9IFtdOwogICAgbm9kZS5raW5kID0gInZhciI7CiAgICBmb3IgKDs7KSB7CiAgICAgIHZhciBkZWNsID0gc3RhcnROb2RlKCk7CiAgICAgIGRlY2wuaWQgPSBwYXJzZUlkZW50KCk7CiAgICAgIGlmIChzdHJpY3QgJiYgaXNTdHJpY3RCYWRJZFdvcmQoZGVjbC5pZC5uYW1lKSkKICAgICAgICByYWlzZShkZWNsLmlkLnN0YXJ0LCAiQmluZGluZyAiICsgZGVjbC5pZC5uYW1lICsgIiBpbiBzdHJpY3QgbW9kZSIpOwogICAgICBkZWNsLmluaXQgPSBlYXQoX2VxKSA/IHBhcnNlRXhwcmVzc2lvbih0cnVlLCBub0luKSA6IG51bGw7CiAgICAgIG5vZGUuZGVjbGFyYXRpb25zLnB1c2goZmluaXNoTm9kZShkZWNsLCAiVmFyaWFibGVEZWNsYXJhdG9yIikpOwogICAgICBpZiAoIWVhdChfY29tbWEpKSBicmVhazsKICAgIH0KICAgIHJldHVybiBub2RlOwogIH0KCiAgLy8gIyMjIEV4cHJlc3Npb24gcGFyc2luZwoKICAvLyBUaGVzZSBuZXN0LCBmcm9tIHRoZSBtb3N0IGdlbmVyYWwgZXhwcmVzc2lvbiB0eXBlIGF0IHRoZSB0b3AgdG8KICAvLyAnYXRvbWljJywgbm9uZGl2aXNpYmxlIGV4cHJlc3Npb24gdHlwZXMgYXQgdGhlIGJvdHRvbS4gTW9zdCBvZgogIC8vIHRoZSBmdW5jdGlvbnMgd2lsbCBzaW1wbHkgbGV0IHRoZSBmdW5jdGlvbihzKSBiZWxvdyB0aGVtIHBhcnNlLAogIC8vIGFuZCwgKmlmKiB0aGUgc3ludGFjdGljIGNvbnN0cnVjdCB0aGV5IGhhbmRsZSBpcyBwcmVzZW50LCB3cmFwCiAgLy8gdGhlIEFTVCBub2RlIHRoYXQgdGhlIGlubmVyIHBhcnNlciBnYXZlIHRoZW0gaW4gYW5vdGhlciBub2RlLgoKICAvLyBQYXJzZSBhIGZ1bGwgZXhwcmVzc2lvbi4gVGhlIGFyZ3VtZW50cyBhcmUgdXNlZCB0byBmb3JiaWQgY29tbWEKICAvLyBzZXF1ZW5jZXMgKGluIGFyZ3VtZW50IGxpc3RzLCBhcnJheSBsaXRlcmFscywgb3Igb2JqZWN0IGxpdGVyYWxzKQogIC8vIG9yIHRoZSBgaW5gIG9wZXJhdG9yIChpbiBmb3IgbG9vcHMgaW5pdGFsaXphdGlvbiBleHByZXNzaW9ucykuCgogIGZ1bmN0aW9uIHBhcnNlRXhwcmVzc2lvbihub0NvbW1hLCBub0luKSB7CiAgICB2YXIgZXhwciA9IHBhcnNlTWF5YmVBc3NpZ24obm9Jbik7CiAgICBpZiAoIW5vQ29tbWEgJiYgdG9rVHlwZSA9PT0gX2NvbW1hKSB7CiAgICAgIHZhciBub2RlID0gc3RhcnROb2RlRnJvbShleHByKTsKICAgICAgbm9kZS5leHByZXNzaW9ucyA9IFtleHByXTsKICAgICAgd2hpbGUgKGVhdChfY29tbWEpKSBub2RlLmV4cHJlc3Npb25zLnB1c2gocGFyc2VNYXliZUFzc2lnbihub0luKSk7CiAgICAgIHJldHVybiBmaW5pc2hOb2RlKG5vZGUsICJTZXF1ZW5jZUV4cHJlc3Npb24iKTsKICAgIH0KICAgIHJldHVybiBleHByOwogIH0KCiAgLy8gUGFyc2UgYW4gYXNzaWdubWVudCBleHByZXNzaW9uLiBUaGlzIGluY2x1ZGVzIGFwcGxpY2F0aW9ucyBvZgogIC8vIG9wZXJhdG9ycyBsaWtlIGArPWAuCgogIGZ1bmN0aW9uIHBhcnNlTWF5YmVBc3NpZ24obm9JbikgewogICAgdmFyIGxlZnQgPSBwYXJzZU1heWJlQ29uZGl0aW9uYWwobm9Jbik7CiAgICBpZiAodG9rVHlwZS5pc0Fzc2lnbikgewogICAgICB2YXIgbm9kZSA9IHN0YXJ0Tm9kZUZyb20obGVmdCk7CiAgICAgIG5vZGUub3BlcmF0b3IgPSB0b2tWYWw7CiAgICAgIG5vZGUubGVmdCA9IGxlZnQ7CiAgICAgIG5leHQoKTsKICAgICAgbm9kZS5yaWdodCA9IHBhcnNlTWF5YmVBc3NpZ24obm9Jbik7CiAgICAgIGNoZWNrTFZhbChsZWZ0KTsKICAgICAgcmV0dXJuIGZpbmlzaE5vZGUobm9kZSwgIkFzc2lnbm1lbnRFeHByZXNzaW9uIik7CiAgICB9CiAgICByZXR1cm4gbGVmdDsKICB9CgogIC8vIFBhcnNlIGEgdGVybmFyeSBjb25kaXRpb25hbCAoYD86YCkgb3BlcmF0b3IuCgogIGZ1bmN0aW9uIHBhcnNlTWF5YmVDb25kaXRpb25hbChub0luKSB7CiAgICB2YXIgZXhwciA9IHBhcnNlRXhwck9wcyhub0luKTsKICAgIGlmIChlYXQoX3F1ZXN0aW9uKSkgewogICAgICB2YXIgbm9kZSA9IHN0YXJ0Tm9kZUZyb20oZXhwcik7CiAgICAgIG5vZGUudGVzdCA9IGV4cHI7CiAgICAgIG5vZGUuY29uc2VxdWVudCA9IHBhcnNlRXhwcmVzc2lvbih0cnVlKTsKICAgICAgZXhwZWN0KF9jb2xvbik7CiAgICAgIG5vZGUuYWx0ZXJuYXRlID0gcGFyc2VFeHByZXNzaW9uKHRydWUsIG5vSW4pOwogICAgICByZXR1cm4gZmluaXNoTm9kZShub2RlLCAiQ29uZGl0aW9uYWxFeHByZXNzaW9uIik7CiAgICB9CiAgICByZXR1cm4gZXhwcjsKICB9CgogIC8vIFN0YXJ0IHRoZSBwcmVjZWRlbmNlIHBhcnNlci4KCiAgZnVuY3Rpb24gcGFyc2VFeHByT3BzKG5vSW4pIHsKICAgIHJldHVybiBwYXJzZUV4cHJPcChwYXJzZU1heWJlVW5hcnkoKSwgLTEsIG5vSW4pOwogIH0KCiAgLy8gUGFyc2UgYmluYXJ5IG9wZXJhdG9ycyB3aXRoIHRoZSBvcGVyYXRvciBwcmVjZWRlbmNlIHBhcnNpbmcKICAvLyBhbGdvcml0aG0uIGBsZWZ0YCBpcyB0aGUgbGVmdC1oYW5kIHNpZGUgb2YgdGhlIG9wZXJhdG9yLgogIC8vIGBtaW5QcmVjYCBwcm92aWRlcyBjb250ZXh0IHRoYXQgYWxsb3dzIHRoZSBmdW5jdGlvbiB0byBzdG9wIGFuZAogIC8vIGRlZmVyIGZ1cnRoZXIgcGFyc2VyIHRvIG9uZSBvZiBpdHMgY2FsbGVycyB3aGVuIGl0IGVuY291bnRlcnMgYW4KICAvLyBvcGVyYXRvciB0aGF0IGhhcyBhIGxvd2VyIHByZWNlZGVuY2UgdGhhbiB0aGUgc2V0IGl0IGlzIHBhcnNpbmcuCgogIGZ1bmN0aW9uIHBhcnNlRXhwck9wKGxlZnQsIG1pblByZWMsIG5vSW4pIHsKICAgIHZhciBwcmVjID0gdG9rVHlwZS5iaW5vcDsKICAgIGlmIChwcmVjICE9IG51bGwgJiYgKCFub0luIHx8IHRva1R5cGUgIT09IF9pbikpIHsKICAgICAgaWYgKHByZWMgPiBtaW5QcmVjKSB7CiAgICAgICAgdmFyIG5vZGUgPSBzdGFydE5vZGVGcm9tKGxlZnQpOwogICAgICAgIG5vZGUubGVmdCA9IGxlZnQ7CiAgICAgICAgbm9kZS5vcGVyYXRvciA9IHRva1ZhbDsKICAgICAgICB2YXIgb3AgPSB0b2tUeXBlOwogICAgICAgIG5leHQoKTsKICAgICAgICBub2RlLnJpZ2h0ID0gcGFyc2VFeHByT3AocGFyc2VNYXliZVVuYXJ5KCksIHByZWMsIG5vSW4pOwogICAgICAgIHZhciBleHByTm9kZSA9IGZpbmlzaE5vZGUobm9kZSwgKG9wID09PSBfbG9naWNhbE9SIHx8IG9wID09PSBfbG9naWNhbEFORCkgPyAiTG9naWNhbEV4cHJlc3Npb24iIDogIkJpbmFyeUV4cHJlc3Npb24iKTsKICAgICAgICByZXR1cm4gcGFyc2VFeHByT3AoZXhwck5vZGUsIG1pblByZWMsIG5vSW4pOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gbGVmdDsKICB9CgogIC8vIFBhcnNlIHVuYXJ5IG9wZXJhdG9ycywgYm90aCBwcmVmaXggYW5kIHBvc3RmaXguCgogIGZ1bmN0aW9uIHBhcnNlTWF5YmVVbmFyeSgpIHsKICAgIGlmICh0b2tUeXBlLnByZWZpeCkgewogICAgICB2YXIgbm9kZSA9IHN0YXJ0Tm9kZSgpLCB1cGRhdGUgPSB0b2tUeXBlLmlzVXBkYXRlOwogICAgICBub2RlLm9wZXJhdG9yID0gdG9rVmFsOwogICAgICBub2RlLnByZWZpeCA9IHRydWU7CiAgICAgIHRva1JlZ2V4cEFsbG93ZWQgPSB0cnVlOwogICAgICBuZXh0KCk7CiAgICAgIG5vZGUuYXJndW1lbnQgPSBwYXJzZU1heWJlVW5hcnkoKTsKICAgICAgaWYgKHVwZGF0ZSkgY2hlY2tMVmFsKG5vZGUuYXJndW1lbnQpOwogICAgICBlbHNlIGlmIChzdHJpY3QgJiYgbm9kZS5vcGVyYXRvciA9PT0gImRlbGV0ZSIgJiYKICAgICAgICAgICAgICAgbm9kZS5hcmd1bWVudC50eXBlID09PSAiSWRlbnRpZmllciIpCiAgICAgICAgcmFpc2Uobm9kZS5zdGFydCwgIkRlbGV0aW5nIGxvY2FsIHZhcmlhYmxlIGluIHN0cmljdCBtb2RlIik7CiAgICAgIHJldHVybiBmaW5pc2hOb2RlKG5vZGUsIHVwZGF0ZSA/ICJVcGRhdGVFeHByZXNzaW9uIiA6ICJVbmFyeUV4cHJlc3Npb24iKTsKICAgIH0KICAgIHZhciBleHByID0gcGFyc2VFeHByU3Vic2NyaXB0cygpOwogICAgd2hpbGUgKHRva1R5cGUucG9zdGZpeCAmJiAhY2FuSW5zZXJ0U2VtaWNvbG9uKCkpIHsKICAgICAgdmFyIG5vZGUgPSBzdGFydE5vZGVGcm9tKGV4cHIpOwogICAgICBub2RlLm9wZXJhdG9yID0gdG9rVmFsOwogICAgICBub2RlLnByZWZpeCA9IGZhbHNlOwogICAgICBub2RlLmFyZ3VtZW50ID0gZXhwcjsKICAgICAgY2hlY2tMVmFsKGV4cHIpOwogICAgICBuZXh0KCk7CiAgICAgIGV4cHIgPSBmaW5pc2hOb2RlKG5vZGUsICJVcGRhdGVFeHByZXNzaW9uIik7CiAgICB9CiAgICByZXR1cm4gZXhwcjsKICB9CgogIC8vIFBhcnNlIGNhbGwsIGRvdCwgYW5kIGBbXWAtc3Vic2NyaXB0IGV4cHJlc3Npb25zLgoKICBmdW5jdGlvbiBwYXJzZUV4cHJTdWJzY3JpcHRzKCkgewogICAgcmV0dXJuIHBhcnNlU3Vic2NyaXB0cyhwYXJzZUV4cHJBdG9tKCkpOwogIH0KCiAgZnVuY3Rpb24gcGFyc2VTdWJzY3JpcHRzKGJhc2UsIG5vQ2FsbHMpIHsKICAgIGlmIChlYXQoX2RvdCkpIHsKICAgICAgdmFyIG5vZGUgPSBzdGFydE5vZGVGcm9tKGJhc2UpOwogICAgICBub2RlLm9iamVjdCA9IGJhc2U7CiAgICAgIG5vZGUucHJvcGVydHkgPSBwYXJzZUlkZW50KHRydWUpOwogICAgICBub2RlLmNvbXB1dGVkID0gZmFsc2U7CiAgICAgIHJldHVybiBwYXJzZVN1YnNjcmlwdHMoZmluaXNoTm9kZShub2RlLCAiTWVtYmVyRXhwcmVzc2lvbiIpLCBub0NhbGxzKTsKICAgIH0gZWxzZSBpZiAoZWF0KF9icmFja2V0TCkpIHsKICAgICAgdmFyIG5vZGUgPSBzdGFydE5vZGVGcm9tKGJhc2UpOwogICAgICBub2RlLm9iamVjdCA9IGJhc2U7CiAgICAgIG5vZGUucHJvcGVydHkgPSBwYXJzZUV4cHJlc3Npb24oKTsKICAgICAgbm9kZS5jb21wdXRlZCA9IHRydWU7CiAgICAgIGV4cGVjdChfYnJhY2tldFIpOwogICAgICByZXR1cm4gcGFyc2VTdWJzY3JpcHRzKGZpbmlzaE5vZGUobm9kZSwgIk1lbWJlckV4cHJlc3Npb24iKSwgbm9DYWxscyk7CiAgICB9IGVsc2UgaWYgKCFub0NhbGxzICYmIGVhdChfcGFyZW5MKSkgewogICAgICB2YXIgbm9kZSA9IHN0YXJ0Tm9kZUZyb20oYmFzZSk7CiAgICAgIG5vZGUuY2FsbGVlID0gYmFzZTsKICAgICAgbm9kZS5hcmd1bWVudHMgPSBwYXJzZUV4cHJMaXN0KF9wYXJlblIsIGZhbHNlKTsKICAgICAgcmV0dXJuIHBhcnNlU3Vic2NyaXB0cyhmaW5pc2hOb2RlKG5vZGUsICJDYWxsRXhwcmVzc2lvbiIpLCBub0NhbGxzKTsKICAgIH0gZWxzZSByZXR1cm4gYmFzZTsKICB9CgogIC8vIFBhcnNlIGFuIGF0b21pYyBleHByZXNzaW9uIOKAlCBlaXRoZXIgYSBzaW5nbGUgdG9rZW4gdGhhdCBpcyBhbgogIC8vIGV4cHJlc3Npb24sIGFuIGV4cHJlc3Npb24gc3RhcnRlZCBieSBhIGtleXdvcmQgbGlrZSBgZnVuY3Rpb25gIG9yCiAgLy8gYG5ld2AsIG9yIGFuIGV4cHJlc3Npb24gd3JhcHBlZCBpbiBwdW5jdHVhdGlvbiBsaWtlIGAoKWAsIGBbXWAsCiAgLy8gb3IgYHt9YC4KCiAgZnVuY3Rpb24gcGFyc2VFeHByQXRvbSgpIHsKICAgIHN3aXRjaCAodG9rVHlwZSkgewogICAgY2FzZSBfdGhpczoKICAgICAgdmFyIG5vZGUgPSBzdGFydE5vZGUoKTsKICAgICAgbmV4dCgpOwogICAgICByZXR1cm4gZmluaXNoTm9kZShub2RlLCAiVGhpc0V4cHJlc3Npb24iKTsKICAgIGNhc2UgX25hbWU6CiAgICAgIHJldHVybiBwYXJzZUlkZW50KCk7CiAgICBjYXNlIF9udW06IGNhc2UgX3N0cmluZzogY2FzZSBfcmVnZXhwOgogICAgICB2YXIgbm9kZSA9IHN0YXJ0Tm9kZSgpOwogICAgICBub2RlLnZhbHVlID0gdG9rVmFsOwogICAgICBub2RlLnJhdyA9IGlucHV0LnNsaWNlKHRva1N0YXJ0LCB0b2tFbmQpOwogICAgICBuZXh0KCk7CiAgICAgIHJldHVybiBmaW5pc2hOb2RlKG5vZGUsICJMaXRlcmFsIik7CgogICAgY2FzZSBfbnVsbDogY2FzZSBfdHJ1ZTogY2FzZSBfZmFsc2U6CiAgICAgIHZhciBub2RlID0gc3RhcnROb2RlKCk7CiAgICAgIG5vZGUudmFsdWUgPSB0b2tUeXBlLmF0b21WYWx1ZTsKICAgICAgbm9kZS5yYXcgPSB0b2tUeXBlLmtleXdvcmQ7CiAgICAgIG5leHQoKTsKICAgICAgcmV0dXJuIGZpbmlzaE5vZGUobm9kZSwgIkxpdGVyYWwiKTsKCiAgICBjYXNlIF9wYXJlbkw6CiAgICAgIHZhciB0b2tTdGFydExvYzEgPSB0b2tTdGFydExvYywgdG9rU3RhcnQxID0gdG9rU3RhcnQ7CiAgICAgIG5leHQoKTsKICAgICAgdmFyIHZhbCA9IHBhcnNlRXhwcmVzc2lvbigpOwogICAgICB2YWwuc3RhcnQgPSB0b2tTdGFydDE7CiAgICAgIHZhbC5lbmQgPSB0b2tFbmQ7CiAgICAgIGlmIChvcHRpb25zLmxvY2F0aW9ucykgewogICAgICAgIHZhbC5sb2Muc3RhcnQgPSB0b2tTdGFydExvYzE7CiAgICAgICAgdmFsLmxvYy5lbmQgPSB0b2tFbmRMb2M7CiAgICAgIH0KICAgICAgaWYgKG9wdGlvbnMucmFuZ2VzKQogICAgICAgIHZhbC5yYW5nZSA9IFt0b2tTdGFydDEsIHRva0VuZF07CiAgICAgIGV4cGVjdChfcGFyZW5SKTsKICAgICAgcmV0dXJuIHZhbDsKCiAgICBjYXNlIF9icmFja2V0TDoKICAgICAgdmFyIG5vZGUgPSBzdGFydE5vZGUoKTsKICAgICAgbmV4dCgpOwogICAgICBub2RlLmVsZW1lbnRzID0gcGFyc2VFeHByTGlzdChfYnJhY2tldFIsIHRydWUsIHRydWUpOwogICAgICByZXR1cm4gZmluaXNoTm9kZShub2RlLCAiQXJyYXlFeHByZXNzaW9uIik7CgogICAgY2FzZSBfYnJhY2VMOgogICAgICByZXR1cm4gcGFyc2VPYmooKTsKCiAgICBjYXNlIF9mdW5jdGlvbjoKICAgICAgdmFyIG5vZGUgPSBzdGFydE5vZGUoKTsKICAgICAgbmV4dCgpOwogICAgICByZXR1cm4gcGFyc2VGdW5jdGlvbihub2RlLCBmYWxzZSk7CgogICAgY2FzZSBfbmV3OgogICAgICByZXR1cm4gcGFyc2VOZXcoKTsKCiAgICBkZWZhdWx0OgogICAgICB1bmV4cGVjdGVkKCk7CiAgICB9CiAgfQoKICAvLyBOZXcncyBwcmVjZWRlbmNlIGlzIHNsaWdodGx5IHRyaWNreS4gSXQgbXVzdCBhbGxvdyBpdHMgYXJndW1lbnQKICAvLyB0byBiZSBhIGBbXWAgb3IgZG90IHN1YnNjcmlwdCBleHByZXNzaW9uLCBidXQgbm90IGEgY2FsbCDigJQgYXQKICAvLyBsZWFzdCwgbm90IHdpdGhvdXQgd3JhcHBpbmcgaXQgaW4gcGFyZW50aGVzZXMuIFRodXMsIGl0IHVzZXMgdGhlCgogIGZ1bmN0aW9uIHBhcnNlTmV3KCkgewogICAgdmFyIG5vZGUgPSBzdGFydE5vZGUoKTsKICAgIG5leHQoKTsKICAgIG5vZGUuY2FsbGVlID0gcGFyc2VTdWJzY3JpcHRzKHBhcnNlRXhwckF0b20oKSwgdHJ1ZSk7CiAgICBpZiAoZWF0KF9wYXJlbkwpKSBub2RlLmFyZ3VtZW50cyA9IHBhcnNlRXhwckxpc3QoX3BhcmVuUiwgZmFsc2UpOwogICAgZWxzZSBub2RlLmFyZ3VtZW50cyA9IGVtcHR5OwogICAgcmV0dXJuIGZpbmlzaE5vZGUobm9kZSwgIk5ld0V4cHJlc3Npb24iKTsKICB9CgogIC8vIFBhcnNlIGFuIG9iamVjdCBsaXRlcmFsLgoKICBmdW5jdGlvbiBwYXJzZU9iaigpIHsKICAgIHZhciBub2RlID0gc3RhcnROb2RlKCksIGZpcnN0ID0gdHJ1ZSwgc2F3R2V0U2V0ID0gZmFsc2U7CiAgICBub2RlLnByb3BlcnRpZXMgPSBbXTsKICAgIG5leHQoKTsKICAgIHdoaWxlICghZWF0KF9icmFjZVIpKSB7CiAgICAgIGlmICghZmlyc3QpIHsKICAgICAgICBleHBlY3QoX2NvbW1hKTsKICAgICAgICBpZiAob3B0aW9ucy5hbGxvd1RyYWlsaW5nQ29tbWFzICYmIGVhdChfYnJhY2VSKSkgYnJlYWs7CiAgICAgIH0gZWxzZSBmaXJzdCA9IGZhbHNlOwoKICAgICAgdmFyIHByb3AgPSB7a2V5OiBwYXJzZVByb3BlcnR5TmFtZSgpfSwgaXNHZXRTZXQgPSBmYWxzZSwga2luZDsKICAgICAgaWYgKGVhdChfY29sb24pKSB7CiAgICAgICAgcHJvcC52YWx1ZSA9IHBhcnNlRXhwcmVzc2lvbih0cnVlKTsKICAgICAgICBraW5kID0gcHJvcC5raW5kID0gImluaXQiOwogICAgICB9IGVsc2UgaWYgKG9wdGlvbnMuZWNtYVZlcnNpb24gPj0gNSAmJiBwcm9wLmtleS50eXBlID09PSAiSWRlbnRpZmllciIgJiYKICAgICAgICAgICAgICAgICAocHJvcC5rZXkubmFtZSA9PT0gImdldCIgfHwgcHJvcC5rZXkubmFtZSA9PT0gInNldCIpKSB7CiAgICAgICAgaXNHZXRTZXQgPSBzYXdHZXRTZXQgPSB0cnVlOwogICAgICAgIGtpbmQgPSBwcm9wLmtpbmQgPSBwcm9wLmtleS5uYW1lOwogICAgICAgIHByb3Aua2V5ID0gcGFyc2VQcm9wZXJ0eU5hbWUoKTsKICAgICAgICBpZiAodG9rVHlwZSAhPT0gX3BhcmVuTCkgdW5leHBlY3RlZCgpOwogICAgICAgIHByb3AudmFsdWUgPSBwYXJzZUZ1bmN0aW9uKHN0YXJ0Tm9kZSgpLCBmYWxzZSk7CiAgICAgIH0gZWxzZSB1bmV4cGVjdGVkKCk7CgogICAgICAvLyBnZXR0ZXJzIGFuZCBzZXR0ZXJzIGFyZSBub3QgYWxsb3dlZCB0byBjbGFzaCDigJQgZWl0aGVyIHdpdGgKICAgICAgLy8gZWFjaCBvdGhlciBvciB3aXRoIGFuIGluaXQgcHJvcGVydHkg4oCUIGFuZCBpbiBzdHJpY3QgbW9kZSwKICAgICAgLy8gaW5pdCBwcm9wZXJ0aWVzIGFyZSBhbHNvIG5vdCBhbGxvd2VkIHRvIGJlIHJlcGVhdGVkLgoKICAgICAgaWYgKHByb3Aua2V5LnR5cGUgPT09ICJJZGVudGlmaWVyIiAmJiAoc3RyaWN0IHx8IHNhd0dldFNldCkpIHsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGUucHJvcGVydGllcy5sZW5ndGg7ICsraSkgewogICAgICAgICAgdmFyIG90aGVyID0gbm9kZS5wcm9wZXJ0aWVzW2ldOwogICAgICAgICAgaWYgKG90aGVyLmtleS5uYW1lID09PSBwcm9wLmtleS5uYW1lKSB7CiAgICAgICAgICAgIHZhciBjb25mbGljdCA9IGtpbmQgPT0gb3RoZXIua2luZCB8fCBpc0dldFNldCAmJiBvdGhlci5raW5kID09PSAiaW5pdCIgfHwKICAgICAgICAgICAgICBraW5kID09PSAiaW5pdCIgJiYgKG90aGVyLmtpbmQgPT09ICJnZXQiIHx8IG90aGVyLmtpbmQgPT09ICJzZXQiKTsKICAgICAgICAgICAgaWYgKGNvbmZsaWN0ICYmICFzdHJpY3QgJiYga2luZCA9PT0gImluaXQiICYmIG90aGVyLmtpbmQgPT09ICJpbml0IikgY29uZmxpY3QgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKGNvbmZsaWN0KSByYWlzZShwcm9wLmtleS5zdGFydCwgIlJlZGVmaW5pdGlvbiBvZiBwcm9wZXJ0eSIpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBub2RlLnByb3BlcnRpZXMucHVzaChwcm9wKTsKICAgIH0KICAgIHJldHVybiBmaW5pc2hOb2RlKG5vZGUsICJPYmplY3RFeHByZXNzaW9uIik7CiAgfQoKICBmdW5jdGlvbiBwYXJzZVByb3BlcnR5TmFtZSgpIHsKICAgIGlmICh0b2tUeXBlID09PSBfbnVtIHx8IHRva1R5cGUgPT09IF9zdHJpbmcpIHJldHVybiBwYXJzZUV4cHJBdG9tKCk7CiAgICByZXR1cm4gcGFyc2VJZGVudCh0cnVlKTsKICB9CgogIC8vIFBhcnNlIGEgZnVuY3Rpb24gZGVjbGFyYXRpb24gb3IgbGl0ZXJhbCAoZGVwZW5kaW5nIG9uIHRoZQogIC8vIGBpc1N0YXRlbWVudGAgcGFyYW1ldGVyKS4KCiAgZnVuY3Rpb24gcGFyc2VGdW5jdGlvbihub2RlLCBpc1N0YXRlbWVudCkgewogICAgaWYgKHRva1R5cGUgPT09IF9uYW1lKSBub2RlLmlkID0gcGFyc2VJZGVudCgpOwogICAgZWxzZSBpZiAoaXNTdGF0ZW1lbnQpIHVuZXhwZWN0ZWQoKTsKICAgIGVsc2Ugbm9kZS5pZCA9IG51bGw7CiAgICBub2RlLnBhcmFtcyA9IFtdOwogICAgdmFyIGZpcnN0ID0gdHJ1ZTsKICAgIGV4cGVjdChfcGFyZW5MKTsKICAgIHdoaWxlICghZWF0KF9wYXJlblIpKSB7CiAgICAgIGlmICghZmlyc3QpIGV4cGVjdChfY29tbWEpOyBlbHNlIGZpcnN0ID0gZmFsc2U7CiAgICAgIG5vZGUucGFyYW1zLnB1c2gocGFyc2VJZGVudCgpKTsKICAgIH0KCiAgICAvLyBTdGFydCBhIG5ldyBzY29wZSB3aXRoIHJlZ2FyZCB0byBsYWJlbHMgYW5kIHRoZSBgaW5GdW5jdGlvbmAKICAgIC8vIGZsYWcgKHJlc3RvcmUgdGhlbSB0byB0aGVpciBvbGQgdmFsdWUgYWZ0ZXJ3YXJkcykuCiAgICB2YXIgb2xkSW5GdW5jID0gaW5GdW5jdGlvbiwgb2xkTGFiZWxzID0gbGFiZWxzOwogICAgaW5GdW5jdGlvbiA9IHRydWU7IGxhYmVscyA9IFtdOwogICAgbm9kZS5ib2R5ID0gcGFyc2VCbG9jayh0cnVlKTsKICAgIGluRnVuY3Rpb24gPSBvbGRJbkZ1bmM7IGxhYmVscyA9IG9sZExhYmVsczsKCiAgICAvLyBJZiB0aGlzIGlzIGEgc3RyaWN0IG1vZGUgZnVuY3Rpb24sIHZlcmlmeSB0aGF0IGFyZ3VtZW50IG5hbWVzCiAgICAvLyBhcmUgbm90IHJlcGVhdGVkLCBhbmQgaXQgZG9lcyBub3QgdHJ5IHRvIGJpbmQgdGhlIHdvcmRzIGBldmFsYAogICAgLy8gb3IgYGFyZ3VtZW50c2AuCiAgICBpZiAoc3RyaWN0IHx8IG5vZGUuYm9keS5ib2R5Lmxlbmd0aCAmJiBpc1VzZVN0cmljdChub2RlLmJvZHkuYm9keVswXSkpIHsKICAgICAgZm9yICh2YXIgaSA9IG5vZGUuaWQgPyAtMSA6IDA7IGkgPCBub2RlLnBhcmFtcy5sZW5ndGg7ICsraSkgewogICAgICAgIHZhciBpZCA9IGkgPCAwID8gbm9kZS5pZCA6IG5vZGUucGFyYW1zW2ldOwogICAgICAgIGlmIChpc1N0cmljdFJlc2VydmVkV29yZChpZC5uYW1lKSB8fCBpc1N0cmljdEJhZElkV29yZChpZC5uYW1lKSkKICAgICAgICAgIHJhaXNlKGlkLnN0YXJ0LCAiRGVmaW5pbmcgJyIgKyBpZC5uYW1lICsgIicgaW4gc3RyaWN0IG1vZGUiKTsKICAgICAgICBpZiAoaSA+PSAwKSBmb3IgKHZhciBqID0gMDsgaiA8IGk7ICsraikgaWYgKGlkLm5hbWUgPT09IG5vZGUucGFyYW1zW2pdLm5hbWUpCiAgICAgICAgICByYWlzZShpZC5zdGFydCwgIkFyZ3VtZW50IG5hbWUgY2xhc2ggaW4gc3RyaWN0IG1vZGUiKTsKICAgICAgfQogICAgfQoKICAgIHJldHVybiBmaW5pc2hOb2RlKG5vZGUsIGlzU3RhdGVtZW50ID8gIkZ1bmN0aW9uRGVjbGFyYXRpb24iIDogIkZ1bmN0aW9uRXhwcmVzc2lvbiIpOwogIH0KCiAgLy8gUGFyc2VzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgZXhwcmVzc2lvbnMsIGFuZCByZXR1cm5zIHRoZW0gYXMKICAvLyBhbiBhcnJheS4gYGNsb3NlYCBpcyB0aGUgdG9rZW4gdHlwZSB0aGF0IGVuZHMgdGhlIGxpc3QsIGFuZAogIC8vIGBhbGxvd0VtcHR5YCBjYW4gYmUgdHVybmVkIG9uIHRvIGFsbG93IHN1YnNlcXVlbnQgY29tbWFzIHdpdGgKICAvLyBub3RoaW5nIGluIGJldHdlZW4gdGhlbSB0byBiZSBwYXJzZWQgYXMgYG51bGxgICh3aGljaCBpcyBuZWVkZWQKICAvLyBmb3IgYXJyYXkgbGl0ZXJhbHMpLgoKICBmdW5jdGlvbiBwYXJzZUV4cHJMaXN0KGNsb3NlLCBhbGxvd1RyYWlsaW5nQ29tbWEsIGFsbG93RW1wdHkpIHsKICAgIHZhciBlbHRzID0gW10sIGZpcnN0ID0gdHJ1ZTsKICAgIHdoaWxlICghZWF0KGNsb3NlKSkgewogICAgICBpZiAoIWZpcnN0KSB7CiAgICAgICAgZXhwZWN0KF9jb21tYSk7CiAgICAgICAgaWYgKGFsbG93VHJhaWxpbmdDb21tYSAmJiBvcHRpb25zLmFsbG93VHJhaWxpbmdDb21tYXMgJiYgZWF0KGNsb3NlKSkgYnJlYWs7CiAgICAgIH0gZWxzZSBmaXJzdCA9IGZhbHNlOwoKICAgICAgaWYgKGFsbG93RW1wdHkgJiYgdG9rVHlwZSA9PT0gX2NvbW1hKSBlbHRzLnB1c2gobnVsbCk7CiAgICAgIGVsc2UgZWx0cy5wdXNoKHBhcnNlRXhwcmVzc2lvbih0cnVlKSk7CiAgICB9CiAgICByZXR1cm4gZWx0czsKICB9CgogIC8vIFBhcnNlIHRoZSBuZXh0IHRva2VuIGFzIGFuIGlkZW50aWZpZXIuIElmIGBsaWJlcmFsYCBpcyB0cnVlICh1c2VkCiAgLy8gd2hlbiBwYXJzaW5nIHByb3BlcnRpZXMpLCBpdCB3aWxsIGFsc28gY29udmVydCBrZXl3b3JkcyBpbnRvCiAgLy8gaWRlbnRpZmllcnMuCgogIGZ1bmN0aW9uIHBhcnNlSWRlbnQobGliZXJhbCkgewogICAgdmFyIG5vZGUgPSBzdGFydE5vZGUoKTsKICAgIGlmIChsaWJlcmFsICYmIG9wdGlvbnMuZm9yYmlkUmVzZXJ2ZWQgPT0gImV2ZXJ5d2hlcmUiKSBsaWJlcmFsID0gZmFsc2U7CiAgICBpZiAodG9rVHlwZSA9PT0gX25hbWUpIHsKICAgICAgaWYgKCFsaWJlcmFsICYmCiAgICAgICAgICAob3B0aW9ucy5mb3JiaWRSZXNlcnZlZCAmJgogICAgICAgICAgIChvcHRpb25zLmVjbWFWZXJzaW9uID09PSAzID8gaXNSZXNlcnZlZFdvcmQzIDogaXNSZXNlcnZlZFdvcmQ1KSh0b2tWYWwpIHx8CiAgICAgICAgICAgc3RyaWN0ICYmIGlzU3RyaWN0UmVzZXJ2ZWRXb3JkKHRva1ZhbCkpICYmCiAgICAgICAgICBpbnB1dC5zbGljZSh0b2tTdGFydCwgdG9rRW5kKS5pbmRleE9mKCJcXCIpID09IC0xKQogICAgICAgIHJhaXNlKHRva1N0YXJ0LCAiVGhlIGtleXdvcmQgJyIgKyB0b2tWYWwgKyAiJyBpcyByZXNlcnZlZCIpOwogICAgICBub2RlLm5hbWUgPSB0b2tWYWw7CiAgICB9IGVsc2UgaWYgKGxpYmVyYWwgJiYgdG9rVHlwZS5rZXl3b3JkKSB7CiAgICAgIG5vZGUubmFtZSA9IHRva1R5cGUua2V5d29yZDsKICAgIH0gZWxzZSB7CiAgICAgIHVuZXhwZWN0ZWQoKTsKICAgIH0KICAgIHRva1JlZ2V4cEFsbG93ZWQgPSBmYWxzZTsKICAgIG5leHQoKTsKICAgIHJldHVybiBmaW5pc2hOb2RlKG5vZGUsICJJZGVudGlmaWVyIik7CiAgfQoKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/test/lint/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCEtLSBEVU1NWSBIVE1MIEZJTEUgLS0+]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/test/lint/lint.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKIFNpbXBsZSBsaW50ZXIsIGJhc2VkIG9uIHRoZSBBY29ybiBbMV0gcGFyc2VyIG1vZHVsZQoKIEFsbCBvZiB0aGUgZXhpc3RpbmcgbGludGVycyBlaXRoZXIgY3JhbXAgbXkgc3R5bGUgb3IgaGF2ZSBodWdlCiBkZXBlbmRlbmNpZXMgKENsb3N1cmUpLiBTbyBoZXJlJ3MgYSB2ZXJ5IHNpbXBsZSwgbm9uLWludmFzaXZlIG9uZQogdGhhdCBvbmx5IHNwb3RzCgogIC0gbWlzc2luZyBzZW1pY29sb25zIGFuZCB0cmFpbGluZyBjb21tYXMKICAtIHZhcmlhYmxlcyBvciBwcm9wZXJ0aWVzIHRoYXQgYXJlIHJlc2VydmVkIHdvcmRzCiAgLSBhc3NpZ25pbmcgdG8gYSB2YXJpYWJsZSB5b3UgZGlkbid0IGRlY2xhcmUKICAtIGFjY2VzcyB0byBub24td2hpdGVsaXN0ZWQgZ2xvYmFscwogICAgKHVzZSBhICcvLyBkZWNsYXJlIGdsb2JhbDogZm9vLCBiYXInIGNvbW1lbnQgdG8gZGVjbGFyZSBleHRyYQogICAgZ2xvYmFscyBpbiBhIGZpbGUpCgogWzFdOiBodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9hY29ybi8KKi8KCnZhciB0b3BBbGxvd2VkR2xvYmFscyA9IE9iamVjdC5jcmVhdGUobnVsbCk7CigiRXJyb3IgUmVnRXhwIE51bWJlciBTdHJpbmcgQXJyYXkgRnVuY3Rpb24gT2JqZWN0IE1hdGggRGF0ZSB1bmRlZmluZWQgIiArCiAicGFyc2VJbnQgcGFyc2VGbG9hdCBJbmZpbml0eSBOYU4gaXNOYU4gIiArCiAid2luZG93IGRvY3VtZW50IG5hdmlnYXRvciBwcm9tcHQgYWxlcnQgY29uZmlybSBjb25zb2xlICIgKwogInNjcmVlbiBGaWxlUmVhZGVyIFdvcmtlciBwb3N0TWVzc2FnZSBpbXBvcnRTY3JpcHRzICIgKwogInNldEludGVydmFsIGNsZWFySW50ZXJ2YWwgc2V0VGltZW91dCBjbGVhclRpbWVvdXQgIiArCiAiQ29kZU1pcnJvciAiICsKICJ0ZXN0IGV4cG9ydHMgcmVxdWlyZSBtb2R1bGUgZGVmaW5lIikKICAuc3BsaXQoIiAiKS5mb3JFYWNoKGZ1bmN0aW9uKG4pIHsgdG9wQWxsb3dlZEdsb2JhbHNbbl0gPSB0cnVlOyB9KTsKCnZhciBmcyA9IHJlcXVpcmUoImZzIiksIGFjb3JuID0gcmVxdWlyZSgiLi9hY29ybi5qcyIpLCB3YWxrID0gcmVxdWlyZSgiLi93YWxrLmpzIik7Cgp2YXIgc2NvcGVQYXNzZXIgPSB3YWxrLm1ha2UoewogIFNjb3BlQm9keTogZnVuY3Rpb24obm9kZSwgcHJldiwgYykgeyBjKG5vZGUsIG5vZGUuc2NvcGUpOyB9Cn0pOwoKdmFyIGNCbG9iID0gL15cL1wvIENvZGVNaXJyb3IsIGNvcHlyaWdodCBcKGNcKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnNcblwvXC8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6XC9cL2NvZGVtaXJyb3IubmV0XC9MSUNFTlNFXG5cbi87CgpmdW5jdGlvbiBjaGVja0ZpbGUoZmlsZU5hbWUpIHsKICB2YXIgZmlsZSA9IGZzLnJlYWRGaWxlU3luYyhmaWxlTmFtZSwgInV0ZjgiKSwgbm90QWxsb3dlZDsKICBpZiAobm90QWxsb3dlZCA9IGZpbGUubWF0Y2goL1tceDAwLVx4MDhceDBiXHgwY1x4MGUtXHgxOVx1RkVGRlx0XXxbIFx0XVxuLykpIHsKICAgIHZhciBtc2c7CiAgICBpZiAobm90QWxsb3dlZFswXSA9PSAiXHQiKSBtc2cgPSAiRm91bmQgdGFiIGNoYXJhY3RlciI7CiAgICBlbHNlIGlmIChub3RBbGxvd2VkWzBdLmluZGV4T2YoIlxuIikgPiAtMSkgbXNnID0gIlRyYWlsaW5nIHdoaXRlc3BhY2UiOwogICAgZWxzZSBtc2cgPSAiVW5kZXNpcmFibGUgY2hhcmFjdGVyICIgKyBub3RBbGxvd2VkWzBdLmNoYXJDb2RlQXQoMCk7CiAgICB2YXIgaW5mbyA9IGFjb3JuLmdldExpbmVJbmZvKGZpbGUsIG5vdEFsbG93ZWQuaW5kZXgpOwogICAgZmFpbChtc2cgKyAiIGF0IGxpbmUgIiArIGluZm8ubGluZSArICIsIGNvbHVtbiAiICsgaW5mby5jb2x1bW4sIHtzb3VyY2U6IGZpbGVOYW1lfSk7CiAgfQoKICBpZiAoIWNCbG9iLnRlc3QoZmlsZSkpCiAgICBmYWlsKCJNaXNzaW5nIGxpY2Vuc2UgYmxvYiIsIHtzb3VyY2U6IGZpbGVOYW1lfSk7CiAgCiAgdmFyIGdsb2JhbHNTZWVuID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKCiAgdHJ5IHsKICAgIHZhciBwYXJzZWQgPSBhY29ybi5wYXJzZShmaWxlLCB7CiAgICAgIGxvY2F0aW9uczogdHJ1ZSwKICAgICAgZWNtYVZlcnNpb246IDMsCiAgICAgIHN0cmljdFNlbWljb2xvbnM6IHRydWUsCiAgICAgIGFsbG93VHJhaWxpbmdDb21tYXM6IGZhbHNlLAogICAgICBmb3JiaWRSZXNlcnZlZDogImV2ZXJ5d2hlcmUiLAogICAgICBzb3VyY2VGaWxlOiBmaWxlTmFtZQogICAgfSk7CiAgfSBjYXRjaCAoZSkgewogICAgZmFpbChlLm1lc3NhZ2UsIHtzb3VyY2U6IGZpbGVOYW1lfSk7CiAgICByZXR1cm47CiAgfQoKICB2YXIgc2NvcGVzID0gW107CgogIHdhbGsuc2ltcGxlKHBhcnNlZCwgewogICAgU2NvcGVCb2R5OiBmdW5jdGlvbihub2RlLCBzY29wZSkgewogICAgICBub2RlLnNjb3BlID0gc2NvcGU7CiAgICAgIHNjb3Blcy5wdXNoKHNjb3BlKTsKICAgIH0KICB9LCB3YWxrLnNjb3BlVmlzaXRvciwge3ZhcnM6IE9iamVjdC5jcmVhdGUobnVsbCl9KTsKCiAgdmFyIGlnbm9yZWRHbG9iYWxzID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKCiAgZnVuY3Rpb24gaW5TY29wZShuYW1lLCBzY29wZSkgewogICAgZm9yICh2YXIgY3VyID0gc2NvcGU7IGN1cjsgY3VyID0gY3VyLnByZXYpCiAgICAgIGlmIChuYW1lIGluIGN1ci52YXJzKSByZXR1cm4gdHJ1ZTsKICB9CiAgZnVuY3Rpb24gY2hlY2tMSFMobm9kZSwgc2NvcGUpIHsKICAgIGlmIChub2RlLnR5cGUgPT0gIklkZW50aWZpZXIiICYmICEobm9kZS5uYW1lIGluIGlnbm9yZWRHbG9iYWxzKSAmJgogICAgICAgICFpblNjb3BlKG5vZGUubmFtZSwgc2NvcGUpKSB7CiAgICAgIGlnbm9yZWRHbG9iYWxzW25vZGUubmFtZV0gPSB0cnVlOwogICAgICBmYWlsKCJBc3NpZ25tZW50IHRvIGdsb2JhbCB2YXJpYWJsZSIsIG5vZGUubG9jKTsKICAgIH0KICB9CgogIHdhbGsuc2ltcGxlKHBhcnNlZCwgewogICAgVXBkYXRlRXhwcmVzc2lvbjogZnVuY3Rpb24obm9kZSwgc2NvcGUpIHtjaGVja0xIUyhub2RlLmFyZ3VtZW50LCBzY29wZSk7fSwKICAgIEFzc2lnbm1lbnRFeHByZXNzaW9uOiBmdW5jdGlvbihub2RlLCBzY29wZSkge2NoZWNrTEhTKG5vZGUubGVmdCwgc2NvcGUpO30sCiAgICBJZGVudGlmaWVyOiBmdW5jdGlvbihub2RlLCBzY29wZSkgewogICAgICBpZiAobm9kZS5uYW1lID09ICJhcmd1bWVudHMiKSByZXR1cm47CiAgICAgIC8vIE1hcmsgdXNlZCBpZGVudGlmaWVycwogICAgICBmb3IgKHZhciBjdXIgPSBzY29wZTsgY3VyOyBjdXIgPSBjdXIucHJldikKICAgICAgICBpZiAobm9kZS5uYW1lIGluIGN1ci52YXJzKSB7CiAgICAgICAgICBjdXIudmFyc1tub2RlLm5hbWVdLnVzZWQgPSB0cnVlOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgZ2xvYmFsc1NlZW5bbm9kZS5uYW1lXSA9IG5vZGUubG9jOwogICAgfSwKICAgIEZ1bmN0aW9uRXhwcmVzc2lvbjogZnVuY3Rpb24obm9kZSkgewogICAgICBpZiAobm9kZS5pZCkgZmFpbCgiTmFtZWQgZnVuY3Rpb24gZXhwcmVzc2lvbiIsIG5vZGUubG9jKTsKICAgIH0sCiAgICBGb3JTdGF0ZW1lbnQ6IGZ1bmN0aW9uKG5vZGUpIHsKICAgICAgY2hlY2tSZXVzZWRJbmRleChub2RlKTsKICAgIH0sCiAgICBNZW1iZXJFeHByZXNzaW9uOiBmdW5jdGlvbihub2RlKSB7CiAgICAgIGlmIChub2RlLm9iamVjdC50eXBlID09ICJJZGVudGlmaWVyIiAmJiBub2RlLm9iamVjdC5uYW1lID09ICJjb25zb2xlIiAmJiAhbm9kZS5jb21wdXRlZCkKICAgICAgICBmYWlsKCJGb3VuZCBjb25zb2xlLiIgKyBub2RlLnByb3BlcnR5Lm5hbWUsIG5vZGUubG9jKTsKICAgIH0sCiAgICBEZWJ1Z2dlclN0YXRlbWVudDogZnVuY3Rpb24obm9kZSkgewogICAgICBmYWlsKCJGb3VuZCBkZWJ1Z2dlciBzdGF0ZW1lbnQiLCBub2RlLmxvYyk7CiAgICB9CiAgfSwgc2NvcGVQYXNzZXIpOwoKICBmdW5jdGlvbiBjaGVja1JldXNlZEluZGV4KG5vZGUpIHsKICAgIGlmICghbm9kZS5pbml0IHx8IG5vZGUuaW5pdC50eXBlICE9ICJWYXJpYWJsZURlY2xhcmF0aW9uIikgcmV0dXJuOwogICAgdmFyIG5hbWUgPSBub2RlLmluaXQuZGVjbGFyYXRpb25zWzBdLmlkLm5hbWU7CiAgICB3YWxrLnJlY3Vyc2l2ZShub2RlLmJvZHksIG51bGwsIHsKICAgICAgRnVuY3Rpb246IGZ1bmN0aW9uKCkge30sCiAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb246IGZ1bmN0aW9uKG5vZGUsIHN0LCBjKSB7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLmRlY2xhcmF0aW9ucy5sZW5ndGg7IGkrKykKICAgICAgICAgIGlmIChub2RlLmRlY2xhcmF0aW9uc1tpXS5pZC5uYW1lID09IG5hbWUpCiAgICAgICAgICAgIGZhaWwoInJlZGVmaW5lZCBsb29wIHZhcmlhYmxlIiwgbm9kZS5kZWNsYXJhdGlvbnNbaV0uaWQubG9jKTsKICAgICAgICB3YWxrLmJhc2UuVmFyaWFibGVEZWNsYXJhdGlvbihub2RlLCBzdCwgYyk7CiAgICAgIH0KICAgIH0pOwogIH0KCiAgdmFyIGFsbG93ZWRHbG9iYWxzID0gT2JqZWN0LmNyZWF0ZSh0b3BBbGxvd2VkR2xvYmFscyksIG07CiAgaWYgKG0gPSBmaWxlLm1hdGNoKC9cL1wvIGRlY2xhcmUgZ2xvYmFsOlxzKyguKikvKSkKICAgIG1bMV0uc3BsaXQoLyxccyovZykuZm9yRWFjaChmdW5jdGlvbihuKSB7IGFsbG93ZWRHbG9iYWxzW25dID0gdHJ1ZTsgfSk7CiAgZm9yICh2YXIgZ2xvYiBpbiBnbG9iYWxzU2VlbikKICAgIGlmICghKGdsb2IgaW4gYWxsb3dlZEdsb2JhbHMpKQogICAgICBmYWlsKCJBY2Nlc3MgdG8gZ2xvYmFsIHZhcmlhYmxlICIgKyBnbG9iICsgIi4gQWRkIGEgJy8vIGRlY2xhcmUgZ2xvYmFsOiAiICsgZ2xvYiArCiAgICAgICAgICAgIicgY29tbWVudCBvciBhZGQgdGhpcyB2YXJpYWJsZSBpbiB0ZXN0L2xpbnQvbGludC5qcy4iLCBnbG9iYWxzU2VlbltnbG9iXSk7CgogIGZvciAodmFyIGkgPSAwOyBpIDwgc2NvcGVzLmxlbmd0aDsgKytpKSB7CiAgICB2YXIgc2NvcGUgPSBzY29wZXNbaV07CiAgICBmb3IgKHZhciBuYW1lIGluIHNjb3BlLnZhcnMpIHsKICAgICAgdmFyIGluZm8gPSBzY29wZS52YXJzW25hbWVdOwogICAgICBpZiAoIWluZm8udXNlZCAmJiBpbmZvLnR5cGUgIT0gImNhdGNoIGNsYXVzZSIgJiYgaW5mby50eXBlICE9ICJmdW5jdGlvbiBuYW1lIiAmJiBuYW1lLmNoYXJBdCgwKSAhPSAiXyIpCiAgICAgICAgZmFpbCgiVW51c2VkICIgKyBpbmZvLnR5cGUgKyAiICIgKyBuYW1lLCBpbmZvLm5vZGUubG9jKTsKICAgIH0KICB9Cn0KCnZhciBmYWlsZWQgPSBmYWxzZTsKZnVuY3Rpb24gZmFpbChtc2csIHBvcykgewogIGlmIChwb3Muc3RhcnQpIG1zZyArPSAiICgiICsgcG9zLnN0YXJ0LmxpbmUgKyAiOiIgKyBwb3Muc3RhcnQuY29sdW1uICsgIikiOwogIGNvbnNvbGUubG9nKHBvcy5zb3VyY2UgKyAiOiAiICsgbXNnKTsKICBmYWlsZWQgPSB0cnVlOwp9CgpmdW5jdGlvbiBjaGVja0RpcihkaXIpIHsKICBmcy5yZWFkZGlyU3luYyhkaXIpLmZvckVhY2goZnVuY3Rpb24oZmlsZSkgewogICAgdmFyIGZuYW1lID0gZGlyICsgIi8iICsgZmlsZTsKICAgIGlmICgvXC5qcyQvLnRlc3QoZmlsZSkpIGNoZWNrRmlsZShmbmFtZSk7CiAgICBlbHNlIGlmIChmcy5sc3RhdFN5bmMoZm5hbWUpLmlzRGlyZWN0b3J5KCkpIGNoZWNrRGlyKGZuYW1lKTsKICB9KTsKfQoKZXhwb3J0cy5jaGVja0RpciA9IGNoZWNrRGlyOwpleHBvcnRzLmNoZWNrRmlsZSA9IGNoZWNrRmlsZTsKZXhwb3J0cy5zdWNjZXNzID0gZnVuY3Rpb24oKSB7IHJldHVybiAhZmFpbGVkOyB9Owo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/test/lint/walk.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQVNUIHdhbGtlciBtb2R1bGUgZm9yIE1vemlsbGEgUGFyc2VyIEFQSSBjb21wYXRpYmxlIHRyZWVzCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIHJldHVybiBtb2QoZXhwb3J0cyk7IC8vIENvbW1vbkpTCiAgaWYgKHR5cGVvZiBkZWZpbmUgPT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kKSByZXR1cm4gZGVmaW5lKFsiZXhwb3J0cyJdLCBtb2QpOyAvLyBBTUQKICBtb2QoKHRoaXMuYWNvcm4gfHwgKHRoaXMuYWNvcm4gPSB7fSkpLndhbGsgPSB7fSk7IC8vIFBsYWluIGJyb3dzZXIgZW52Cn0pKGZ1bmN0aW9uKGV4cG9ydHMpIHsKICAidXNlIHN0cmljdCI7CgogIC8vIEEgc2ltcGxlIHdhbGsgaXMgb25lIHdoZXJlIHlvdSBzaW1wbHkgc3BlY2lmeSBjYWxsYmFja3MgdG8gYmUKICAvLyBjYWxsZWQgb24gc3BlY2lmaWMgbm9kZXMuIFRoZSBsYXN0IHR3byBhcmd1bWVudHMgYXJlIG9wdGlvbmFsLiBBCiAgLy8gc2ltcGxlIHVzZSB3b3VsZCBiZQogIC8vCiAgLy8gICAgIHdhbGsuc2ltcGxlKG15VHJlZSwgewogIC8vICAgICAgICAgRXhwcmVzc2lvbjogZnVuY3Rpb24obm9kZSkgeyAuLi4gfQogIC8vICAgICB9KTsKICAvLwogIC8vIHRvIGRvIHNvbWV0aGluZyB3aXRoIGFsbCBleHByZXNzaW9ucy4gQWxsIFBhcnNlciBBUEkgbm9kZSB0eXBlcwogIC8vIGNhbiBiZSB1c2VkIHRvIGlkZW50aWZ5IG5vZGUgdHlwZXMsIGFzIHdlbGwgYXMgRXhwcmVzc2lvbiwKICAvLyBTdGF0ZW1lbnQsIGFuZCBTY29wZUJvZHksIHdoaWNoIGRlbm90ZSBjYXRlZ29yaWVzIG9mIG5vZGVzLgogIC8vCiAgLy8gVGhlIGJhc2UgYXJndW1lbnQgY2FuIGJlIHVzZWQgdG8gcGFzcyBhIGN1c3RvbSAocmVjdXJzaXZlKQogIC8vIHdhbGtlciwgYW5kIHN0YXRlIGNhbiBiZSB1c2VkIHRvIGdpdmUgdGhpcyB3YWxrZWQgYW4gaW5pdGlhbAogIC8vIHN0YXRlLgogIGV4cG9ydHMuc2ltcGxlID0gZnVuY3Rpb24obm9kZSwgdmlzaXRvcnMsIGJhc2UsIHN0YXRlKSB7CiAgICBpZiAoIWJhc2UpIGJhc2UgPSBleHBvcnRzLmJhc2U7CiAgICBmdW5jdGlvbiBjKG5vZGUsIHN0LCBvdmVycmlkZSkgewogICAgICB2YXIgdHlwZSA9IG92ZXJyaWRlIHx8IG5vZGUudHlwZSwgZm91bmQgPSB2aXNpdG9yc1t0eXBlXTsKICAgICAgYmFzZVt0eXBlXShub2RlLCBzdCwgYyk7CiAgICAgIGlmIChmb3VuZCkgZm91bmQobm9kZSwgc3QpOwogICAgfQogICAgYyhub2RlLCBzdGF0ZSk7CiAgfTsKCiAgLy8gQSByZWN1cnNpdmUgd2FsayBpcyBvbmUgd2hlcmUgeW91ciBmdW5jdGlvbnMgb3ZlcnJpZGUgdGhlIGRlZmF1bHQKICAvLyB3YWxrZXJzLiBUaGV5IGNhbiBtb2RpZnkgYW5kIHJlcGxhY2UgdGhlIHN0YXRlIHBhcmFtZXRlciB0aGF0J3MKICAvLyB0aHJlYWRlZCB0aHJvdWdoIHRoZSB3YWxrLCBhbmQgY2FuIG9wdCBob3cgYW5kIHdoZXRoZXIgdG8gd2FsawogIC8vIHRoZWlyIGNoaWxkIG5vZGVzIChieSBjYWxsaW5nIHRoZWlyIHRoaXJkIGFyZ3VtZW50IG9uIHRoZXNlCiAgLy8gbm9kZXMpLgogIGV4cG9ydHMucmVjdXJzaXZlID0gZnVuY3Rpb24obm9kZSwgc3RhdGUsIGZ1bmNzLCBiYXNlKSB7CiAgICB2YXIgdmlzaXRvciA9IGZ1bmNzID8gZXhwb3J0cy5tYWtlKGZ1bmNzLCBiYXNlKSA6IGJhc2U7CiAgICBmdW5jdGlvbiBjKG5vZGUsIHN0LCBvdmVycmlkZSkgewogICAgICB2aXNpdG9yW292ZXJyaWRlIHx8IG5vZGUudHlwZV0obm9kZSwgc3QsIGMpOwogICAgfQogICAgYyhub2RlLCBzdGF0ZSk7CiAgfTsKCiAgZnVuY3Rpb24gbWFrZVRlc3QodGVzdCkgewogICAgaWYgKHR5cGVvZiB0ZXN0ID09ICJzdHJpbmciKQogICAgICByZXR1cm4gZnVuY3Rpb24odHlwZSkgeyByZXR1cm4gdHlwZSA9PSB0ZXN0OyB9OwogICAgZWxzZSBpZiAoIXRlc3QpCiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsgcmV0dXJuIHRydWU7IH07CiAgICBlbHNlCiAgICAgIHJldHVybiB0ZXN0OwogIH0KCiAgZnVuY3Rpb24gRm91bmQobm9kZSwgc3RhdGUpIHsgdGhpcy5ub2RlID0gbm9kZTsgdGhpcy5zdGF0ZSA9IHN0YXRlOyB9CgogIC8vIEZpbmQgYSBub2RlIHdpdGggYSBnaXZlbiBzdGFydCwgZW5kLCBhbmQgdHlwZSAoYWxsIGFyZSBvcHRpb25hbCwKICAvLyBudWxsIGNhbiBiZSB1c2VkIGFzIHdpbGRjYXJkKS4gUmV0dXJucyBhIHtub2RlLCBzdGF0ZX0gb2JqZWN0LCBvcgogIC8vIHVuZGVmaW5lZCB3aGVuIGl0IGRvZXNuJ3QgZmluZCBhIG1hdGNoaW5nIG5vZGUuCiAgZXhwb3J0cy5maW5kTm9kZUF0ID0gZnVuY3Rpb24obm9kZSwgc3RhcnQsIGVuZCwgdGVzdCwgYmFzZSwgc3RhdGUpIHsKICAgIHRlc3QgPSBtYWtlVGVzdCh0ZXN0KTsKICAgIHRyeSB7CiAgICAgIGlmICghYmFzZSkgYmFzZSA9IGV4cG9ydHMuYmFzZTsKICAgICAgdmFyIGMgPSBmdW5jdGlvbihub2RlLCBzdCwgb3ZlcnJpZGUpIHsKICAgICAgICB2YXIgdHlwZSA9IG92ZXJyaWRlIHx8IG5vZGUudHlwZTsKICAgICAgICBpZiAoKHN0YXJ0ID09IG51bGwgfHwgbm9kZS5zdGFydCA8PSBzdGFydCkgJiYKICAgICAgICAgICAgKGVuZCA9PSBudWxsIHx8IG5vZGUuZW5kID49IGVuZCkpCiAgICAgICAgICBiYXNlW3R5cGVdKG5vZGUsIHN0LCBjKTsKICAgICAgICBpZiAodGVzdCh0eXBlLCBub2RlKSAmJgogICAgICAgICAgICAoc3RhcnQgPT0gbnVsbCB8fCBub2RlLnN0YXJ0ID09IHN0YXJ0KSAmJgogICAgICAgICAgICAoZW5kID09IG51bGwgfHwgbm9kZS5lbmQgPT0gZW5kKSkKICAgICAgICAgIHRocm93IG5ldyBGb3VuZChub2RlLCBzdCk7CiAgICAgIH07CiAgICAgIGMobm9kZSwgc3RhdGUpOwogICAgfSBjYXRjaCAoZSkgewogICAgICBpZiAoZSBpbnN0YW5jZW9mIEZvdW5kKSByZXR1cm4gZTsKICAgICAgdGhyb3cgZTsKICAgIH0KICB9OwoKICAvLyBGaW5kIHRoZSBpbm5lcm1vc3Qgbm9kZSBvZiBhIGdpdmVuIHR5cGUgdGhhdCBjb250YWlucyB0aGUgZ2l2ZW4KICAvLyBwb3NpdGlvbi4gSW50ZXJmYWNlIHNpbWlsYXIgdG8gZmluZE5vZGVBdC4KICBleHBvcnRzLmZpbmROb2RlQXJvdW5kID0gZnVuY3Rpb24obm9kZSwgcG9zLCB0ZXN0LCBiYXNlLCBzdGF0ZSkgewogICAgdGVzdCA9IG1ha2VUZXN0KHRlc3QpOwogICAgdHJ5IHsKICAgICAgaWYgKCFiYXNlKSBiYXNlID0gZXhwb3J0cy5iYXNlOwogICAgICB2YXIgYyA9IGZ1bmN0aW9uKG5vZGUsIHN0LCBvdmVycmlkZSkgewogICAgICAgIHZhciB0eXBlID0gb3ZlcnJpZGUgfHwgbm9kZS50eXBlOwogICAgICAgIGlmIChub2RlLnN0YXJ0ID4gcG9zIHx8IG5vZGUuZW5kIDwgcG9zKSByZXR1cm47CiAgICAgICAgYmFzZVt0eXBlXShub2RlLCBzdCwgYyk7CiAgICAgICAgaWYgKHRlc3QodHlwZSwgbm9kZSkpIHRocm93IG5ldyBGb3VuZChub2RlLCBzdCk7CiAgICAgIH07CiAgICAgIGMobm9kZSwgc3RhdGUpOwogICAgfSBjYXRjaCAoZSkgewogICAgICBpZiAoZSBpbnN0YW5jZW9mIEZvdW5kKSByZXR1cm4gZTsKICAgICAgdGhyb3cgZTsKICAgIH0KICB9OwoKICAvLyBGaW5kIHRoZSBvdXRlcm1vc3QgbWF0Y2hpbmcgbm9kZSBhZnRlciBhIGdpdmVuIHBvc2l0aW9uLgogIGV4cG9ydHMuZmluZE5vZGVBZnRlciA9IGZ1bmN0aW9uKG5vZGUsIHBvcywgdGVzdCwgYmFzZSwgc3RhdGUpIHsKICAgIHRlc3QgPSBtYWtlVGVzdCh0ZXN0KTsKICAgIHRyeSB7CiAgICAgIGlmICghYmFzZSkgYmFzZSA9IGV4cG9ydHMuYmFzZTsKICAgICAgdmFyIGMgPSBmdW5jdGlvbihub2RlLCBzdCwgb3ZlcnJpZGUpIHsKICAgICAgICBpZiAobm9kZS5lbmQgPCBwb3MpIHJldHVybjsKICAgICAgICB2YXIgdHlwZSA9IG92ZXJyaWRlIHx8IG5vZGUudHlwZTsKICAgICAgICBpZiAobm9kZS5zdGFydCA+PSBwb3MgJiYgdGVzdCh0eXBlLCBub2RlKSkgdGhyb3cgbmV3IEZvdW5kKG5vZGUsIHN0KTsKICAgICAgICBiYXNlW3R5cGVdKG5vZGUsIHN0LCBjKTsKICAgICAgfTsKICAgICAgYyhub2RlLCBzdGF0ZSk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIGlmIChlIGluc3RhbmNlb2YgRm91bmQpIHJldHVybiBlOwogICAgICB0aHJvdyBlOwogICAgfQogIH07CgogIC8vIEZpbmQgdGhlIG91dGVybW9zdCBtYXRjaGluZyBub2RlIGJlZm9yZSBhIGdpdmVuIHBvc2l0aW9uLgogIGV4cG9ydHMuZmluZE5vZGVCZWZvcmUgPSBmdW5jdGlvbihub2RlLCBwb3MsIHRlc3QsIGJhc2UsIHN0YXRlKSB7CiAgICB0ZXN0ID0gbWFrZVRlc3QodGVzdCk7CiAgICBpZiAoIWJhc2UpIGJhc2UgPSBleHBvcnRzLmJhc2U7CiAgICB2YXIgbWF4OwogICAgdmFyIGMgPSBmdW5jdGlvbihub2RlLCBzdCwgb3ZlcnJpZGUpIHsKICAgICAgaWYgKG5vZGUuc3RhcnQgPiBwb3MpIHJldHVybjsKICAgICAgdmFyIHR5cGUgPSBvdmVycmlkZSB8fCBub2RlLnR5cGU7CiAgICAgIGlmIChub2RlLmVuZCA8PSBwb3MgJiYgKCFtYXggfHwgbWF4Lm5vZGUuZW5kIDwgbm9kZS5lbmQpICYmIHRlc3QodHlwZSwgbm9kZSkpCiAgICAgICAgbWF4ID0gbmV3IEZvdW5kKG5vZGUsIHN0KTsKICAgICAgYmFzZVt0eXBlXShub2RlLCBzdCwgYyk7CiAgICB9OwogICAgYyhub2RlLCBzdGF0ZSk7CiAgICByZXR1cm4gbWF4OwogIH07CgogIC8vIFVzZWQgdG8gY3JlYXRlIGEgY3VzdG9tIHdhbGtlci4gV2lsbCBmaWxsIGluIGFsbCBtaXNzaW5nIG5vZGUKICAvLyB0eXBlIHByb3BlcnRpZXMgd2l0aCB0aGUgZGVmYXVsdHMuCiAgZXhwb3J0cy5tYWtlID0gZnVuY3Rpb24oZnVuY3MsIGJhc2UpIHsKICAgIGlmICghYmFzZSkgYmFzZSA9IGV4cG9ydHMuYmFzZTsKICAgIHZhciB2aXNpdG9yID0ge307CiAgICBmb3IgKHZhciB0eXBlIGluIGJhc2UpIHZpc2l0b3JbdHlwZV0gPSBiYXNlW3R5cGVdOwogICAgZm9yICh2YXIgdHlwZSBpbiBmdW5jcykgdmlzaXRvclt0eXBlXSA9IGZ1bmNzW3R5cGVdOwogICAgcmV0dXJuIHZpc2l0b3I7CiAgfTsKCiAgZnVuY3Rpb24gc2tpcFRocm91Z2gobm9kZSwgc3QsIGMpIHsgYyhub2RlLCBzdCk7IH0KICBmdW5jdGlvbiBpZ25vcmUoX25vZGUsIF9zdCwgX2MpIHt9CgogIC8vIE5vZGUgd2Fsa2Vycy4KCiAgdmFyIGJhc2UgPSBleHBvcnRzLmJhc2UgPSB7fTsKICBiYXNlLlByb2dyYW0gPSBiYXNlLkJsb2NrU3RhdGVtZW50ID0gZnVuY3Rpb24obm9kZSwgc3QsIGMpIHsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZS5ib2R5Lmxlbmd0aDsgKytpKQogICAgICBjKG5vZGUuYm9keVtpXSwgc3QsICJTdGF0ZW1lbnQiKTsKICB9OwogIGJhc2UuU3RhdGVtZW50ID0gc2tpcFRocm91Z2g7CiAgYmFzZS5FbXB0eVN0YXRlbWVudCA9IGlnbm9yZTsKICBiYXNlLkV4cHJlc3Npb25TdGF0ZW1lbnQgPSBmdW5jdGlvbihub2RlLCBzdCwgYykgewogICAgYyhub2RlLmV4cHJlc3Npb24sIHN0LCAiRXhwcmVzc2lvbiIpOwogIH07CiAgYmFzZS5JZlN0YXRlbWVudCA9IGZ1bmN0aW9uKG5vZGUsIHN0LCBjKSB7CiAgICBjKG5vZGUudGVzdCwgc3QsICJFeHByZXNzaW9uIik7CiAgICBjKG5vZGUuY29uc2VxdWVudCwgc3QsICJTdGF0ZW1lbnQiKTsKICAgIGlmIChub2RlLmFsdGVybmF0ZSkgYyhub2RlLmFsdGVybmF0ZSwgc3QsICJTdGF0ZW1lbnQiKTsKICB9OwogIGJhc2UuTGFiZWxlZFN0YXRlbWVudCA9IGZ1bmN0aW9uKG5vZGUsIHN0LCBjKSB7CiAgICBjKG5vZGUuYm9keSwgc3QsICJTdGF0ZW1lbnQiKTsKICB9OwogIGJhc2UuQnJlYWtTdGF0ZW1lbnQgPSBiYXNlLkNvbnRpbnVlU3RhdGVtZW50ID0gaWdub3JlOwogIGJhc2UuV2l0aFN0YXRlbWVudCA9IGZ1bmN0aW9uKG5vZGUsIHN0LCBjKSB7CiAgICBjKG5vZGUub2JqZWN0LCBzdCwgIkV4cHJlc3Npb24iKTsKICAgIGMobm9kZS5ib2R5LCBzdCwgIlN0YXRlbWVudCIpOwogIH07CiAgYmFzZS5Td2l0Y2hTdGF0ZW1lbnQgPSBmdW5jdGlvbihub2RlLCBzdCwgYykgewogICAgYyhub2RlLmRpc2NyaW1pbmFudCwgc3QsICJFeHByZXNzaW9uIik7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGUuY2FzZXMubGVuZ3RoOyArK2kpIHsKICAgICAgdmFyIGNzID0gbm9kZS5jYXNlc1tpXTsKICAgICAgaWYgKGNzLnRlc3QpIGMoY3MudGVzdCwgc3QsICJFeHByZXNzaW9uIik7CiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgY3MuY29uc2VxdWVudC5sZW5ndGg7ICsraikKICAgICAgICBjKGNzLmNvbnNlcXVlbnRbal0sIHN0LCAiU3RhdGVtZW50Iik7CiAgICB9CiAgfTsKICBiYXNlLlJldHVyblN0YXRlbWVudCA9IGZ1bmN0aW9uKG5vZGUsIHN0LCBjKSB7CiAgICBpZiAobm9kZS5hcmd1bWVudCkgYyhub2RlLmFyZ3VtZW50LCBzdCwgIkV4cHJlc3Npb24iKTsKICB9OwogIGJhc2UuVGhyb3dTdGF0ZW1lbnQgPSBmdW5jdGlvbihub2RlLCBzdCwgYykgewogICAgYyhub2RlLmFyZ3VtZW50LCBzdCwgIkV4cHJlc3Npb24iKTsKICB9OwogIGJhc2UuVHJ5U3RhdGVtZW50ID0gZnVuY3Rpb24obm9kZSwgc3QsIGMpIHsKICAgIGMobm9kZS5ibG9jaywgc3QsICJTdGF0ZW1lbnQiKTsKICAgIGlmIChub2RlLmhhbmRsZXIpIGMobm9kZS5oYW5kbGVyLmJvZHksIHN0LCAiU2NvcGVCb2R5Iik7CiAgICBpZiAobm9kZS5maW5hbGl6ZXIpIGMobm9kZS5maW5hbGl6ZXIsIHN0LCAiU3RhdGVtZW50Iik7CiAgfTsKICBiYXNlLldoaWxlU3RhdGVtZW50ID0gZnVuY3Rpb24obm9kZSwgc3QsIGMpIHsKICAgIGMobm9kZS50ZXN0LCBzdCwgIkV4cHJlc3Npb24iKTsKICAgIGMobm9kZS5ib2R5LCBzdCwgIlN0YXRlbWVudCIpOwogIH07CiAgYmFzZS5Eb1doaWxlU3RhdGVtZW50ID0gYmFzZS5XaGlsZVN0YXRlbWVudDsKICBiYXNlLkZvclN0YXRlbWVudCA9IGZ1bmN0aW9uKG5vZGUsIHN0LCBjKSB7CiAgICBpZiAobm9kZS5pbml0KSBjKG5vZGUuaW5pdCwgc3QsICJGb3JJbml0Iik7CiAgICBpZiAobm9kZS50ZXN0KSBjKG5vZGUudGVzdCwgc3QsICJFeHByZXNzaW9uIik7CiAgICBpZiAobm9kZS51cGRhdGUpIGMobm9kZS51cGRhdGUsIHN0LCAiRXhwcmVzc2lvbiIpOwogICAgYyhub2RlLmJvZHksIHN0LCAiU3RhdGVtZW50Iik7CiAgfTsKICBiYXNlLkZvckluU3RhdGVtZW50ID0gZnVuY3Rpb24obm9kZSwgc3QsIGMpIHsKICAgIGMobm9kZS5sZWZ0LCBzdCwgIkZvckluaXQiKTsKICAgIGMobm9kZS5yaWdodCwgc3QsICJFeHByZXNzaW9uIik7CiAgICBjKG5vZGUuYm9keSwgc3QsICJTdGF0ZW1lbnQiKTsKICB9OwogIGJhc2UuRm9ySW5pdCA9IGZ1bmN0aW9uKG5vZGUsIHN0LCBjKSB7CiAgICBpZiAobm9kZS50eXBlID09ICJWYXJpYWJsZURlY2xhcmF0aW9uIikgYyhub2RlLCBzdCk7CiAgICBlbHNlIGMobm9kZSwgc3QsICJFeHByZXNzaW9uIik7CiAgfTsKICBiYXNlLkRlYnVnZ2VyU3RhdGVtZW50ID0gaWdub3JlOwoKICBiYXNlLkZ1bmN0aW9uRGVjbGFyYXRpb24gPSBmdW5jdGlvbihub2RlLCBzdCwgYykgewogICAgYyhub2RlLCBzdCwgIkZ1bmN0aW9uIik7CiAgfTsKICBiYXNlLlZhcmlhYmxlRGVjbGFyYXRpb24gPSBmdW5jdGlvbihub2RlLCBzdCwgYykgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLmRlY2xhcmF0aW9ucy5sZW5ndGg7ICsraSkgewogICAgICB2YXIgZGVjbCA9IG5vZGUuZGVjbGFyYXRpb25zW2ldOwogICAgICBpZiAoZGVjbC5pbml0KSBjKGRlY2wuaW5pdCwgc3QsICJFeHByZXNzaW9uIik7CiAgICB9CiAgfTsKCiAgYmFzZS5GdW5jdGlvbiA9IGZ1bmN0aW9uKG5vZGUsIHN0LCBjKSB7CiAgICBjKG5vZGUuYm9keSwgc3QsICJTY29wZUJvZHkiKTsKICB9OwogIGJhc2UuU2NvcGVCb2R5ID0gZnVuY3Rpb24obm9kZSwgc3QsIGMpIHsKICAgIGMobm9kZSwgc3QsICJTdGF0ZW1lbnQiKTsKICB9OwoKICBiYXNlLkV4cHJlc3Npb24gPSBza2lwVGhyb3VnaDsKICBiYXNlLlRoaXNFeHByZXNzaW9uID0gaWdub3JlOwogIGJhc2UuQXJyYXlFeHByZXNzaW9uID0gZnVuY3Rpb24obm9kZSwgc3QsIGMpIHsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZS5lbGVtZW50cy5sZW5ndGg7ICsraSkgewogICAgICB2YXIgZWx0ID0gbm9kZS5lbGVtZW50c1tpXTsKICAgICAgaWYgKGVsdCkgYyhlbHQsIHN0LCAiRXhwcmVzc2lvbiIpOwogICAgfQogIH07CiAgYmFzZS5PYmplY3RFeHByZXNzaW9uID0gZnVuY3Rpb24obm9kZSwgc3QsIGMpIHsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZS5wcm9wZXJ0aWVzLmxlbmd0aDsgKytpKQogICAgICBjKG5vZGUucHJvcGVydGllc1tpXS52YWx1ZSwgc3QsICJFeHByZXNzaW9uIik7CiAgfTsKICBiYXNlLkZ1bmN0aW9uRXhwcmVzc2lvbiA9IGJhc2UuRnVuY3Rpb25EZWNsYXJhdGlvbjsKICBiYXNlLlNlcXVlbmNlRXhwcmVzc2lvbiA9IGZ1bmN0aW9uKG5vZGUsIHN0LCBjKSB7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGUuZXhwcmVzc2lvbnMubGVuZ3RoOyArK2kpCiAgICAgIGMobm9kZS5leHByZXNzaW9uc1tpXSwgc3QsICJFeHByZXNzaW9uIik7CiAgfTsKICBiYXNlLlVuYXJ5RXhwcmVzc2lvbiA9IGJhc2UuVXBkYXRlRXhwcmVzc2lvbiA9IGZ1bmN0aW9uKG5vZGUsIHN0LCBjKSB7CiAgICBjKG5vZGUuYXJndW1lbnQsIHN0LCAiRXhwcmVzc2lvbiIpOwogIH07CiAgYmFzZS5CaW5hcnlFeHByZXNzaW9uID0gYmFzZS5Bc3NpZ25tZW50RXhwcmVzc2lvbiA9IGJhc2UuTG9naWNhbEV4cHJlc3Npb24gPSBmdW5jdGlvbihub2RlLCBzdCwgYykgewogICAgYyhub2RlLmxlZnQsIHN0LCAiRXhwcmVzc2lvbiIpOwogICAgYyhub2RlLnJpZ2h0LCBzdCwgIkV4cHJlc3Npb24iKTsKICB9OwogIGJhc2UuQ29uZGl0aW9uYWxFeHByZXNzaW9uID0gZnVuY3Rpb24obm9kZSwgc3QsIGMpIHsKICAgIGMobm9kZS50ZXN0LCBzdCwgIkV4cHJlc3Npb24iKTsKICAgIGMobm9kZS5jb25zZXF1ZW50LCBzdCwgIkV4cHJlc3Npb24iKTsKICAgIGMobm9kZS5hbHRlcm5hdGUsIHN0LCAiRXhwcmVzc2lvbiIpOwogIH07CiAgYmFzZS5OZXdFeHByZXNzaW9uID0gYmFzZS5DYWxsRXhwcmVzc2lvbiA9IGZ1bmN0aW9uKG5vZGUsIHN0LCBjKSB7CiAgICBjKG5vZGUuY2FsbGVlLCBzdCwgIkV4cHJlc3Npb24iKTsKICAgIGlmIChub2RlLmFyZ3VtZW50cykgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLmFyZ3VtZW50cy5sZW5ndGg7ICsraSkKICAgICAgYyhub2RlLmFyZ3VtZW50c1tpXSwgc3QsICJFeHByZXNzaW9uIik7CiAgfTsKICBiYXNlLk1lbWJlckV4cHJlc3Npb24gPSBmdW5jdGlvbihub2RlLCBzdCwgYykgewogICAgYyhub2RlLm9iamVjdCwgc3QsICJFeHByZXNzaW9uIik7CiAgICBpZiAobm9kZS5jb21wdXRlZCkgYyhub2RlLnByb3BlcnR5LCBzdCwgIkV4cHJlc3Npb24iKTsKICB9OwogIGJhc2UuSWRlbnRpZmllciA9IGJhc2UuTGl0ZXJhbCA9IGlnbm9yZTsKCiAgLy8gQSBjdXN0b20gd2Fsa2VyIHRoYXQga2VlcHMgdHJhY2sgb2YgdGhlIHNjb3BlIGNoYWluIGFuZCB0aGUKICAvLyB2YXJpYWJsZXMgZGVmaW5lZCBpbiBpdC4KICBmdW5jdGlvbiBtYWtlU2NvcGUocHJldiwgaXNDYXRjaCkgewogICAgcmV0dXJuIHt2YXJzOiBPYmplY3QuY3JlYXRlKG51bGwpLCBwcmV2OiBwcmV2LCBpc0NhdGNoOiBpc0NhdGNofTsKICB9CiAgZnVuY3Rpb24gbm9ybWFsU2NvcGUoc2NvcGUpIHsKICAgIHdoaWxlIChzY29wZS5pc0NhdGNoKSBzY29wZSA9IHNjb3BlLnByZXY7CiAgICByZXR1cm4gc2NvcGU7CiAgfQogIGV4cG9ydHMuc2NvcGVWaXNpdG9yID0gZXhwb3J0cy5tYWtlKHsKICAgIEZ1bmN0aW9uOiBmdW5jdGlvbihub2RlLCBzY29wZSwgYykgewogICAgICB2YXIgaW5uZXIgPSBtYWtlU2NvcGUoc2NvcGUpOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGUucGFyYW1zLmxlbmd0aDsgKytpKQogICAgICAgIGlubmVyLnZhcnNbbm9kZS5wYXJhbXNbaV0ubmFtZV0gPSB7dHlwZTogImFyZ3VtZW50Iiwgbm9kZTogbm9kZS5wYXJhbXNbaV19OwogICAgICBpZiAobm9kZS5pZCkgewogICAgICAgIHZhciBkZWNsID0gbm9kZS50eXBlID09ICJGdW5jdGlvbkRlY2xhcmF0aW9uIjsKICAgICAgICAoZGVjbCA/IG5vcm1hbFNjb3BlKHNjb3BlKSA6IGlubmVyKS52YXJzW25vZGUuaWQubmFtZV0gPQogICAgICAgICAge3R5cGU6IGRlY2wgPyAiZnVuY3Rpb24iIDogImZ1bmN0aW9uIG5hbWUiLCBub2RlOiBub2RlLmlkfTsKICAgICAgfQogICAgICBjKG5vZGUuYm9keSwgaW5uZXIsICJTY29wZUJvZHkiKTsKICAgIH0sCiAgICBUcnlTdGF0ZW1lbnQ6IGZ1bmN0aW9uKG5vZGUsIHNjb3BlLCBjKSB7CiAgICAgIGMobm9kZS5ibG9jaywgc2NvcGUsICJTdGF0ZW1lbnQiKTsKICAgICAgaWYgKG5vZGUuaGFuZGxlcikgewogICAgICAgIHZhciBpbm5lciA9IG1ha2VTY29wZShzY29wZSwgdHJ1ZSk7CiAgICAgICAgaW5uZXIudmFyc1tub2RlLmhhbmRsZXIucGFyYW0ubmFtZV0gPSB7dHlwZTogImNhdGNoIGNsYXVzZSIsIG5vZGU6IG5vZGUuaGFuZGxlci5wYXJhbX07CiAgICAgICAgYyhub2RlLmhhbmRsZXIuYm9keSwgaW5uZXIsICJTY29wZUJvZHkiKTsKICAgICAgfQogICAgICBpZiAobm9kZS5maW5hbGl6ZXIpIGMobm9kZS5maW5hbGl6ZXIsIHNjb3BlLCAiU3RhdGVtZW50Iik7CiAgICB9LAogICAgVmFyaWFibGVEZWNsYXJhdGlvbjogZnVuY3Rpb24obm9kZSwgc2NvcGUsIGMpIHsKICAgICAgdmFyIHRhcmdldCA9IG5vcm1hbFNjb3BlKHNjb3BlKTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLmRlY2xhcmF0aW9ucy5sZW5ndGg7ICsraSkgewogICAgICAgIHZhciBkZWNsID0gbm9kZS5kZWNsYXJhdGlvbnNbaV07CiAgICAgICAgdGFyZ2V0LnZhcnNbZGVjbC5pZC5uYW1lXSA9IHt0eXBlOiAidmFyIiwgbm9kZTogZGVjbC5pZH07CiAgICAgICAgaWYgKGRlY2wuaW5pdCkgYyhkZWNsLmluaXQsIHNjb3BlLCAiRXhwcmVzc2lvbiIpOwogICAgICB9CiAgICB9CiAgfSk7Cgp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/test/mode_test.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Lm10LW91dHB1dCAubXQtdG9rZW4gewogIGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7CiAgd2hpdGUtc3BhY2U6IHByZTsKICBmb250LWZhbWlseTogIkNvbnNvbGFzIiwgbW9ub3NwYWNlOwogIHRleHQtYWxpZ246IGNlbnRlcjsKfQoKLm10LW91dHB1dCAubXQtc3R5bGUgewogIGZvbnQtc2l6ZTogeC1zbWFsbDsKfQoKLm10LW91dHB1dCAubXQtc3RhdGUgewogIGZvbnQtc2l6ZTogeC1zbWFsbDsKICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwp9CgoubXQtb3V0cHV0IC5tdC1zdGF0ZS1yb3cgewogIGRpc3BsYXk6IG5vbmU7Cn0KCi5tdC1zdGF0ZS11bmhpZGUgLm10LW91dHB1dCAubXQtc3RhdGUtcm93IHsKICBkaXNwbGF5OiB0YWJsZS1yb3c7Cn0K]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/test/mode_test.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIEhlbHBlciB0byB0ZXN0IENvZGVNaXJyb3IgaGlnaGxpZ2h0aW5nIG1vZGVzLiBJdCBwcmV0dHkgcHJpbnRzIG91dHB1dCBvZiB0aGUKICogaGlnaGxpZ2h0ZXIgYW5kIGNhbiBjaGVjayBhZ2FpbnN0IGV4cGVjdGVkIHN0eWxlcy4KICoKICogTW9kZSB0ZXN0cyBhcmUgcmVnaXN0ZXJlZCBieSBjYWxsaW5nIHRlc3QubW9kZSh0ZXN0TmFtZSwgbW9kZSwKICogdG9rZW5zKSwgd2hlcmUgbW9kZSBpcyBhIG1vZGUgb2JqZWN0IGFzIHJldHVybmVkIGJ5CiAqIENvZGVNaXJyb3IuZ2V0TW9kZSwgYW5kIHRva2VucyBpcyBhbiBhcnJheSBvZiBsaW5lcyB0aGF0IG1ha2UgdXAKICogdGhlIHRlc3QuCiAqCiAqIFRoZXNlIGxpbmVzIGFyZSBzdHJpbmdzLCBpbiB3aGljaCBzdHlsZWQgc3RyZXRjaGVzIG9mIGNvZGUgYXJlCiAqIGVuY2xvc2VkIGluIGJyYWNrZXRzIGBbXWAsIGFuZCBwcmVmaXhlZCBieSB0aGVpciBzdHlsZS4gRm9yCiAqIGV4YW1wbGUsIGBba2V5d29yZCBpZl1gLiBCcmFja2V0cyBpbiB0aGUgY29kZSBpdHNlbGYgbXVzdCBiZQogKiBkdXBsaWNhdGVkIHRvIHByZXZlbnQgdGhlbSBmcm9tIGJlaW5nIGludGVycHJldGVkIGFzIHRva2VuCiAqIGJvdW5kYXJpZXMuIEZvciBleGFtcGxlIGBhW1tpXV1gIGZvciBgYVtpXWAuIElmIGEgdG9rZW4gaGFzCiAqIG11bHRpcGxlIHN0eWxlcywgdGhlIHN0eWxlcyBtdXN0IGJlIHNlcGFyYXRlZCBieSBhbXBlcnNhbmRzLCBmb3IKICogZXhhbXBsZSBgW3RhZyZlcnJvciA8L2htdGw+XWAuCiAqCiAqIFNlZSB0aGUgdGVzdC5qcyBmaWxlcyBpbiB0aGUgY3NzLCBtYXJrZG93biwgZ2ZtLCBhbmQgc3RleCBtb2RlCiAqIGRpcmVjdG9yaWVzIGZvciBleGFtcGxlcy4KICovCihmdW5jdGlvbigpIHsKICBmdW5jdGlvbiBmaW5kU2luZ2xlKHN0ciwgcG9zLCBjaCkgewogICAgZm9yICg7OykgewogICAgICB2YXIgZm91bmQgPSBzdHIuaW5kZXhPZihjaCwgcG9zKTsKICAgICAgaWYgKGZvdW5kID09IC0xKSByZXR1cm4gbnVsbDsKICAgICAgaWYgKHN0ci5jaGFyQXQoZm91bmQgKyAxKSAhPSBjaCkgcmV0dXJuIGZvdW5kOwogICAgICBwb3MgPSBmb3VuZCArIDI7CiAgICB9CiAgfQoKICB2YXIgc3R5bGVOYW1lID0gL1tcdyYtX10rL2c7CiAgZnVuY3Rpb24gcGFyc2VUb2tlbnMoc3RycykgewogICAgdmFyIHRva2VucyA9IFtdLCBwbGFpbiA9ICIiOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHJzLmxlbmd0aDsgKytpKSB7CiAgICAgIGlmIChpKSBwbGFpbiArPSAiXG4iOwogICAgICB2YXIgc3RyID0gc3Ryc1tpXSwgcG9zID0gMDsKICAgICAgd2hpbGUgKHBvcyA8IHN0ci5sZW5ndGgpIHsKICAgICAgICB2YXIgc3R5bGUgPSBudWxsLCB0ZXh0OwogICAgICAgIGlmIChzdHIuY2hhckF0KHBvcykgPT0gIlsiICYmIHN0ci5jaGFyQXQocG9zKzEpICE9ICJbIikgewogICAgICAgICAgc3R5bGVOYW1lLmxhc3RJbmRleCA9IHBvcyArIDE7CiAgICAgICAgICB2YXIgbSA9IHN0eWxlTmFtZS5leGVjKHN0cik7CiAgICAgICAgICBzdHlsZSA9IG1bMF0ucmVwbGFjZSgvJi9nLCAiICIpOwogICAgICAgICAgdmFyIHRleHRTdGFydCA9IHBvcyArIHN0eWxlLmxlbmd0aCArIDI7CiAgICAgICAgICB2YXIgZW5kID0gZmluZFNpbmdsZShzdHIsIHRleHRTdGFydCwgIl0iKTsKICAgICAgICAgIGlmIChlbmQgPT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKCJVbnRlcm1pbmF0ZWQgdG9rZW4gYXQgIiArIHBvcyArICIgaW4gJyIgKyBzdHIgKyAiJyIgKyBzdHlsZSk7CiAgICAgICAgICB0ZXh0ID0gc3RyLnNsaWNlKHRleHRTdGFydCwgZW5kKTsKICAgICAgICAgIHBvcyA9IGVuZCArIDE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHZhciBlbmQgPSBmaW5kU2luZ2xlKHN0ciwgcG9zLCAiWyIpOwogICAgICAgICAgaWYgKGVuZCA9PSBudWxsKSBlbmQgPSBzdHIubGVuZ3RoOwogICAgICAgICAgdGV4dCA9IHN0ci5zbGljZShwb3MsIGVuZCk7CiAgICAgICAgICBwb3MgPSBlbmQ7CiAgICAgICAgfQogICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoL1xbXFt8XF1cXS9nLCBmdW5jdGlvbihzKSB7cmV0dXJuIHMuY2hhckF0KDApO30pOwogICAgICAgIHRva2Vucy5wdXNoKHtzdHlsZTogc3R5bGUsIHRleHQ6IHRleHR9KTsKICAgICAgICBwbGFpbiArPSB0ZXh0OwogICAgICB9CiAgICB9CiAgICByZXR1cm4ge3Rva2VuczogdG9rZW5zLCBwbGFpbjogcGxhaW59OwogIH0KCiAgdGVzdC5tb2RlID0gZnVuY3Rpb24obmFtZSwgbW9kZSwgdG9rZW5zLCBtb2RlTmFtZSkgewogICAgdmFyIGRhdGEgPSBwYXJzZVRva2Vucyh0b2tlbnMpOwogICAgcmV0dXJuIHRlc3QoKG1vZGVOYW1lIHx8IG1vZGUubmFtZSkgKyAiXyIgKyBuYW1lLCBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGNvbXBhcmUoZGF0YS5wbGFpbiwgZGF0YS50b2tlbnMsIG1vZGUpOwogICAgfSk7CiAgfTsKCiAgZnVuY3Rpb24gZXNjKHN0cikgewogICAgcmV0dXJuIHN0ci5yZXBsYWNlKCcmJywgJyZhbXA7JykucmVwbGFjZSgnPCcsICcmbHQ7JykucmVwbGFjZSgvPi9nLCAiJmd0OyIpLnJlcGxhY2UoLyIvZywgIiZxdW90OyIpLnJlcGxhY2UoLycvZywgIiYjMDM5OyIpOwo7CiAgfQoKICBmdW5jdGlvbiBjb21wYXJlKHRleHQsIGV4cGVjdGVkLCBtb2RlKSB7CgogICAgdmFyIGV4cGVjdGVkT3V0cHV0ID0gW107CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGV4cGVjdGVkLmxlbmd0aDsgKytpKSB7CiAgICAgIHZhciBzdHkgPSBleHBlY3RlZFtpXS5zdHlsZTsKICAgICAgaWYgKHN0eSAmJiBzdHkuaW5kZXhPZigiICIpKSBzdHkgPSBzdHkuc3BsaXQoJyAnKS5zb3J0KCkuam9pbignICcpOwogICAgICBleHBlY3RlZE91dHB1dC5wdXNoKHtzdHlsZTogc3R5LCB0ZXh0OiBleHBlY3RlZFtpXS50ZXh0fSk7CiAgICB9CgogICAgdmFyIG9ic2VydmVkT3V0cHV0ID0gaGlnaGxpZ2h0KHRleHQsIG1vZGUpOwoKICAgIHZhciBzID0gIiI7CiAgICB2YXIgZGlmZiA9IGhpZ2hsaWdodE91dHB1dHNEaWZmZXJlbnQoZXhwZWN0ZWRPdXRwdXQsIG9ic2VydmVkT3V0cHV0KTsKICAgIGlmIChkaWZmICE9IG51bGwpIHsKICAgICAgcyArPSAnPGRpdiBjbGFzcz0ibXQtdGVzdCBtdC1mYWlsIj4nOwogICAgICBzICs9ICAgJzxwcmU+JyArIGVzYyh0ZXh0KSArICc8L3ByZT4nOwogICAgICBzICs9ICAgJzxkaXYgY2xhc3M9ImNtLXMtZGVmYXVsdCI+JzsKICAgICAgcyArPSAnZXhwZWN0ZWQ6JzsKICAgICAgcyArPSAgIHByZXR0eVByaW50T3V0cHV0VGFibGUoZXhwZWN0ZWRPdXRwdXQsIGRpZmYpOwogICAgICBzICs9ICdvYnNlcnZlZDogWzxhIG9uY2xpY2s9InRoaXMucGFyZW50RWxlbWVudC5jbGFzc05hbWUrPVwnIG10LXN0YXRlLXVuaGlkZVwnIj5kaXNwbGF5IHN0YXRlczwvYT5dJzsKICAgICAgcyArPSAgIHByZXR0eVByaW50T3V0cHV0VGFibGUob2JzZXJ2ZWRPdXRwdXQsIGRpZmYpOwogICAgICBzICs9ICAgJzwvZGl2Pic7CiAgICAgIHMgKz0gJzwvZGl2Pic7CiAgICB9CiAgICBpZiAob2JzZXJ2ZWRPdXRwdXQuaW5kZW50RmFpbHVyZXMpIHsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvYnNlcnZlZE91dHB1dC5pbmRlbnRGYWlsdXJlcy5sZW5ndGg7IGkrKykKICAgICAgICBzICs9ICI8ZGl2IGNsYXNzPSdtdC10ZXN0IG10LWZhaWwnPiIgKyBlc2Mob2JzZXJ2ZWRPdXRwdXQuaW5kZW50RmFpbHVyZXNbaV0pICsgIjwvZGl2PiI7CiAgICB9CiAgICBpZiAocykgdGhyb3cgbmV3IEZhaWx1cmUocyk7CiAgfQoKICBmdW5jdGlvbiBzdHJpbmdpZnkob2JqKSB7CiAgICBmdW5jdGlvbiByZXBsYWNlcihrZXksIG9iaikgewogICAgICBpZiAodHlwZW9mIG9iaiA9PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgdmFyIG0gPSBvYmoudG9TdHJpbmcoKS5tYXRjaCgvZnVuY3Rpb25ccypbXlxzKF0qLyk7CiAgICAgICAgcmV0dXJuIG0gPyBtWzBdIDogImZ1bmN0aW9uIjsKICAgICAgfQogICAgICByZXR1cm4gb2JqOwogICAgfQogICAgaWYgKHdpbmRvdy5KU09OICYmIEpTT04uc3RyaW5naWZ5KQogICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkob2JqLCByZXBsYWNlciwgMik7CiAgICByZXR1cm4gIlt1bnN1cHBvcnRlZF0iOyAgLy8gRmFpbCBzYWZlbHkgaWYgbm8gbmF0aXZlIEpTT04uCiAgfQoKICBmdW5jdGlvbiBoaWdobGlnaHQoc3RyaW5nLCBtb2RlKSB7CiAgICB2YXIgc3RhdGUgPSBtb2RlLnN0YXJ0U3RhdGUoKTsKCiAgICB2YXIgbGluZXMgPSBzdHJpbmcucmVwbGFjZSgvXHJcbi9nLCdcbicpLnNwbGl0KCdcbicpOwogICAgdmFyIHN0ID0gW10sIHBvcyA9IDA7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgKytpKSB7CiAgICAgIHZhciBsaW5lID0gbGluZXNbaV0sIG5ld0xpbmUgPSB0cnVlOwogICAgICBpZiAobW9kZS5pbmRlbnQpIHsKICAgICAgICB2YXIgd3MgPSBsaW5lLm1hdGNoKC9eXHMqLylbMF07CiAgICAgICAgdmFyIGluZGVudCA9IG1vZGUuaW5kZW50KHN0YXRlLCBsaW5lLnNsaWNlKHdzLmxlbmd0aCkpOwogICAgICAgIGlmIChpbmRlbnQgIT0gQ29kZU1pcnJvci5QYXNzICYmIGluZGVudCAhPSB3cy5sZW5ndGgpCiAgICAgICAgICAoc3QuaW5kZW50RmFpbHVyZXMgfHwgKHN0LmluZGVudEZhaWx1cmVzID0gW10pKS5wdXNoKAogICAgICAgICAgICAiSW5kZW50YXRpb24gb2YgbGluZSAiICsgKGkgKyAxKSArICIgaXMgIiArIGluZGVudCArICIgKGV4cGVjdGVkICIgKyB3cy5sZW5ndGggKyAiKSIpOwogICAgICB9CiAgICAgIHZhciBzdHJlYW0gPSBuZXcgQ29kZU1pcnJvci5TdHJpbmdTdHJlYW0obGluZSk7CiAgICAgIGlmIChsaW5lID09ICIiICYmIG1vZGUuYmxhbmtMaW5lKSBtb2RlLmJsYW5rTGluZShzdGF0ZSk7CiAgICAgIC8qIFN0YXJ0IGNvcGllZCBjb2RlIGZyb20gQ29kZU1pcnJvci5oaWdobGlnaHQgKi8KICAgICAgd2hpbGUgKCFzdHJlYW0uZW9sKCkpIHsKICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IDEwICYmIHN0cmVhbS5zdGFydCA+PSBzdHJlYW0ucG9zOyBqKyspCiAgICAgICAgICB2YXIgY29tcGFyZSA9IG1vZGUudG9rZW4oc3RyZWFtLCBzdGF0ZSk7CiAgICAgICAgaWYgKGogPT0gMTApCiAgICAgICAgICB0aHJvdyBuZXcgRmFpbHVyZSgiRmFpbGVkIHRvIGFkdmFuY2UgdGhlIHN0cmVhbS4iICsgc3RyZWFtLnN0cmluZyArICIgIiArIHN0cmVhbS5wb3MpOwogICAgICAgIHZhciBzdWJzdHIgPSBzdHJlYW0uY3VycmVudCgpOwogICAgICAgIGlmIChjb21wYXJlICYmIGNvbXBhcmUuaW5kZXhPZigiICIpID4gLTEpIGNvbXBhcmUgPSBjb21wYXJlLnNwbGl0KCcgJykuc29ydCgpLmpvaW4oJyAnKTsKICAgICAgICBzdHJlYW0uc3RhcnQgPSBzdHJlYW0ucG9zOwogICAgICAgIGlmIChwb3MgJiYgc3RbcG9zLTFdLnN0eWxlID09IGNvbXBhcmUgJiYgIW5ld0xpbmUpIHsKICAgICAgICAgIHN0W3Bvcy0xXS50ZXh0ICs9IHN1YnN0cjsKICAgICAgICB9IGVsc2UgaWYgKHN1YnN0cikgewogICAgICAgICAgc3RbcG9zKytdID0ge3N0eWxlOiBjb21wYXJlLCB0ZXh0OiBzdWJzdHIsIHN0YXRlOiBzdHJpbmdpZnkoc3RhdGUpfTsKICAgICAgICB9CiAgICAgICAgLy8gR2l2ZSB1cCB3aGVuIGxpbmUgaXMgcmlkaWN1bG91c2x5IGxvbmcKICAgICAgICBpZiAoc3RyZWFtLnBvcyA+IDUwMDApIHsKICAgICAgICAgIHN0W3BvcysrXSA9IHtzdHlsZTogbnVsbCwgdGV4dDogdGhpcy50ZXh0LnNsaWNlKHN0cmVhbS5wb3MpfTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBuZXdMaW5lID0gZmFsc2U7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gc3Q7CiAgfQoKICBmdW5jdGlvbiBoaWdobGlnaHRPdXRwdXRzRGlmZmVyZW50KG8xLCBvMikgewogICAgdmFyIG1pbkxlbiA9IE1hdGgubWluKG8xLmxlbmd0aCwgbzIubGVuZ3RoKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWluTGVuOyArK2kpCiAgICAgIGlmIChvMVtpXS5zdHlsZSAhPSBvMltpXS5zdHlsZSB8fCBvMVtpXS50ZXh0ICE9IG8yW2ldLnRleHQpIHJldHVybiBpOwogICAgaWYgKG8xLmxlbmd0aCA+IG1pbkxlbiB8fCBvMi5sZW5ndGggPiBtaW5MZW4pIHJldHVybiBtaW5MZW47CiAgfQoKICBmdW5jdGlvbiBwcmV0dHlQcmludE91dHB1dFRhYmxlKG91dHB1dCwgZGlmZkF0KSB7CiAgICB2YXIgcyA9ICc8dGFibGUgY2xhc3M9Im10LW91dHB1dCI+JzsKICAgIHMgKz0gJzx0cj4nOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvdXRwdXQubGVuZ3RoOyArK2kpIHsKICAgICAgdmFyIHN0eWxlID0gb3V0cHV0W2ldLnN0eWxlLCB2YWwgPSBvdXRwdXRbaV0udGV4dDsKICAgICAgcyArPQogICAgICAnPHRkIGNsYXNzPSJtdC10b2tlbiInICsgKGkgPT0gZGlmZkF0ICogMiA/ICIgc3R5bGU9J2JhY2tncm91bmQ6IHBpbmsnIiA6ICIiKSArICc+JyArCiAgICAgICAgJzxzcGFuIGNsYXNzPSJjbS0nICsgZXNjKFN0cmluZyhzdHlsZSkpICsgJyI+JyArCiAgICAgICAgZXNjKHZhbC5yZXBsYWNlKC8gL2csJ1x4YjcnKSkgKyAgLy8gwrcgTUlERExFIERPVAogICAgICAgICc8L3NwYW4+JyArCiAgICAgICAgJzwvdGQ+JzsKICAgIH0KICAgIHMgKz0gJzwvdHI+PHRyPic7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG91dHB1dC5sZW5ndGg7ICsraSkgewogICAgICBzICs9ICc8dGQgY2xhc3M9Im10LXN0eWxlIj48c3Bhbj4nICsgKG91dHB1dFtpXS5zdHlsZSB8fCBudWxsKSArICc8L3NwYW4+PC90ZD4nOwogICAgfQogICAgaWYob3V0cHV0WzBdLnN0YXRlKSB7CiAgICAgIHMgKz0gJzwvdHI+PHRyIGNsYXNzPSJtdC1zdGF0ZS1yb3ciIHRpdGxlPSJTdGF0ZSBBRlRFUiBlYWNoIHRva2VuIj4nOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG91dHB1dC5sZW5ndGg7ICsraSkgewogICAgICAgIHMgKz0gJzx0ZCBjbGFzcz0ibXQtc3RhdGUiPjxwcmU+JyArIGVzYyhvdXRwdXRbaV0uc3RhdGUpICsgJzwvcHJlPjwvdGQ+JzsKICAgICAgfQogICAgfQogICAgcyArPSAnPC90cj48L3RhYmxlPic7CiAgICByZXR1cm4gczsKICB9Cn0pKCk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/test/multi_test.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKCkgewogIG5hbWVzcGFjZSA9ICJtdWx0aV8iOwoKICBmdW5jdGlvbiBoYXNTZWxlY3Rpb25zKGNtKSB7CiAgICB2YXIgc2VscyA9IGNtLmxpc3RTZWxlY3Rpb25zKCk7CiAgICB2YXIgZ2l2ZW4gPSAoYXJndW1lbnRzLmxlbmd0aCAtIDEpIC8gNDsKICAgIGlmIChzZWxzLmxlbmd0aCAhPSBnaXZlbikKICAgICAgdGhyb3cgbmV3IEZhaWx1cmUoImV4cGVjdGVkICIgKyBnaXZlbiArICIgc2VsZWN0aW9ucywgZm91bmQgIiArIHNlbHMubGVuZ3RoKTsKICAgIGZvciAodmFyIGkgPSAwLCBwID0gMTsgaSA8IGdpdmVuOyBpKyssIHAgKz0gNCkgewogICAgICB2YXIgYW5jaG9yID0gUG9zKGFyZ3VtZW50c1twXSwgYXJndW1lbnRzW3AgKyAxXSk7CiAgICAgIHZhciBoZWFkID0gUG9zKGFyZ3VtZW50c1twICsgMl0sIGFyZ3VtZW50c1twICsgM10pOwogICAgICBlcVBvcyhzZWxzW2ldLmFuY2hvciwgYW5jaG9yLCAiYW5jaG9yIG9mIHNlbGVjdGlvbiAiICsgaSk7CiAgICAgIGVxUG9zKHNlbHNbaV0uaGVhZCwgaGVhZCwgImhlYWQgb2Ygc2VsZWN0aW9uICIgKyBpKTsKICAgIH0KICB9CiAgZnVuY3Rpb24gaGFzQ3Vyc29ycyhjbSkgewogICAgdmFyIHNlbHMgPSBjbS5saXN0U2VsZWN0aW9ucygpOwogICAgdmFyIGdpdmVuID0gKGFyZ3VtZW50cy5sZW5ndGggLSAxKSAvIDI7CiAgICBpZiAoc2Vscy5sZW5ndGggIT0gZ2l2ZW4pCiAgICAgIHRocm93IG5ldyBGYWlsdXJlKCJleHBlY3RlZCAiICsgZ2l2ZW4gKyAiIHNlbGVjdGlvbnMsIGZvdW5kICIgKyBzZWxzLmxlbmd0aCk7CiAgICBmb3IgKHZhciBpID0gMCwgcCA9IDE7IGkgPCBnaXZlbjsgaSsrLCBwICs9IDIpIHsKICAgICAgZXFQb3Moc2Vsc1tpXS5hbmNob3IsIHNlbHNbaV0uaGVhZCwgInNvbWV0aGluZyBzZWxlY3RlZCBmb3IgIiArIGkpOwogICAgICB2YXIgaGVhZCA9IFBvcyhhcmd1bWVudHNbcF0sIGFyZ3VtZW50c1twICsgMV0pOwogICAgICBlcVBvcyhzZWxzW2ldLmhlYWQsIGhlYWQsICJzZWxlY3Rpb24gIiArIGkpOwogICAgfQogIH0KCiAgdGVzdENNKCJnZXRTZWxlY3Rpb24iLCBmdW5jdGlvbihjbSkgewogICAgc2VsZWN0KGNtLCB7YW5jaG9yOiBQb3MoMCwgMCksIGhlYWQ6IFBvcygxLCAyKX0sIHthbmNob3I6IFBvcygyLCAyKSwgaGVhZDogUG9zKDIsIDApfSk7CiAgICBlcShjbS5nZXRTZWxlY3Rpb24oKSwgIjEyMzRcbjU2XG45MCIpOwogICAgZXEoY20uZ2V0U2VsZWN0aW9uKGZhbHNlKS5qb2luKCJ8IiksICIxMjM0fDU2fDkwIik7CiAgICBlcShjbS5nZXRTZWxlY3Rpb25zKCkuam9pbigifCIpLCAiMTIzNFxuNTZ8OTAiKTsKICB9LCB7dmFsdWU6ICIxMjM0XG41Njc4XG45MCJ9KTsKCiAgdGVzdENNKCJzZXRTZWxlY3Rpb24iLCBmdW5jdGlvbihjbSkgewogICAgc2VsZWN0KGNtLCBQb3MoMywgMCksIFBvcygwLCAwKSwge2FuY2hvcjogUG9zKDIsIDUpLCBoZWFkOiBQb3MoMSwgMCl9KTsKICAgIGhhc1NlbGVjdGlvbnMoY20sIDAsIDAsIDAsIDAsCiAgICAgICAgICAgICAgICAgIDIsIDUsIDEsIDAsCiAgICAgICAgICAgICAgICAgIDMsIDAsIDMsIDApOwogICAgY20uc2V0U2VsZWN0aW9uKFBvcygxLCAyKSwgUG9zKDEsIDEpKTsKICAgIGhhc1NlbGVjdGlvbnMoY20sIDEsIDIsIDEsIDEpOwogICAgc2VsZWN0KGNtLCB7YW5jaG9yOiBQb3MoMSwgMSksIGhlYWQ6IFBvcygyLCA0KX0sCiAgICAgICAgICAge2FuY2hvcjogUG9zKDAsIDApLCBoZWFkOiBQb3MoMSwgMyl9LAogICAgICAgICAgIFBvcygzLCAwKSwgUG9zKDIsIDIpKTsKICAgIGhhc1NlbGVjdGlvbnMoY20sIDAsIDAsIDIsIDQsCiAgICAgICAgICAgICAgICAgIDMsIDAsIDMsIDApOwogICAgY20uc2V0U2VsZWN0aW9ucyhbe2FuY2hvcjogUG9zKDAsIDEpLCBoZWFkOiBQb3MoMCwgMil9LAogICAgICAgICAgICAgICAgICAgICAge2FuY2hvcjogUG9zKDEsIDEpLCBoZWFkOiBQb3MoMSwgMil9LAogICAgICAgICAgICAgICAgICAgICAge2FuY2hvcjogUG9zKDIsIDEpLCBoZWFkOiBQb3MoMiwgMil9XSwgMSk7CiAgICBlcVBvcyhjbS5nZXRDdXJzb3IoImhlYWQiKSwgUG9zKDEsIDIpKTsKICAgIGVxUG9zKGNtLmdldEN1cnNvcigiYW5jaG9yIiksIFBvcygxLCAxKSk7CiAgICBlcVBvcyhjbS5nZXRDdXJzb3IoImZyb20iKSwgUG9zKDEsIDEpKTsKICAgIGVxUG9zKGNtLmdldEN1cnNvcigidG8iKSwgUG9zKDEsIDIpKTsKICAgIGNtLnNldEN1cnNvcihQb3MoMSwgMSkpOwogICAgaGFzQ3Vyc29ycyhjbSwgMSwgMSk7CiAgfSwge3ZhbHVlOiAiYWJjZGVcbmFiY2RlXG5hYmNkZVxuIn0pOwoKICB0ZXN0Q00oInNvbWV0aGluZ1NlbGVjdGVkIiwgZnVuY3Rpb24oY20pIHsKICAgIHNlbGVjdChjbSwgUG9zKDAsIDEpLCB7YW5jaG9yOiBQb3MoMCwgMyksIGhlYWQ6IFBvcygwLCA1KX0pOwogICAgZXEoY20uc29tZXRoaW5nU2VsZWN0ZWQoKSwgdHJ1ZSk7CiAgICBzZWxlY3QoY20sIFBvcygwLCAxKSwgUG9zKDAsIDMpLCBQb3MoMCwgNSkpOwogICAgZXEoY20uc29tZXRoaW5nU2VsZWN0ZWQoKSwgZmFsc2UpOwogIH0sIHt2YWx1ZTogIjEyMzQ1Njc4OSJ9KTsKCiAgdGVzdENNKCJleHRlbmRTZWxlY3Rpb24iLCBmdW5jdGlvbihjbSkgewogICAgc2VsZWN0KGNtLCBQb3MoMCwgMSksIFBvcygxLCAxKSwgUG9zKDIsIDEpKTsKICAgIGNtLnNldEV4dGVuZGluZyh0cnVlKTsKICAgIGNtLmV4dGVuZFNlbGVjdGlvbnMoW1BvcygwLCAyKSwgUG9zKDEsIDApLCBQb3MoMiwgMyldKTsKICAgIGhhc1NlbGVjdGlvbnMoY20sIDAsIDEsIDAsIDIsCiAgICAgICAgICAgICAgICAgIDEsIDEsIDEsIDAsCiAgICAgICAgICAgICAgICAgIDIsIDEsIDIsIDMpOwogICAgY20uZXh0ZW5kU2VsZWN0aW9uKFBvcygyLCA0KSwgUG9zKDIsIDApKTsKICAgIGhhc1NlbGVjdGlvbnMoY20sIDIsIDQsIDIsIDApOwogIH0sIHt2YWx1ZTogIjEyMzRcbjEyMzRcbjEyMzQifSk7CgogIHRlc3RDTSgiYWRkU2VsZWN0aW9uIiwgZnVuY3Rpb24oY20pIHsKICAgIHNlbGVjdChjbSwgUG9zKDAsIDEpLCBQb3MoMSwgMSkpOwogICAgY20uYWRkU2VsZWN0aW9uKFBvcygwLCAwKSwgUG9zKDAsIDQpKTsKICAgIGhhc1NlbGVjdGlvbnMoY20sIDAsIDAsIDAsIDQsCiAgICAgICAgICAgICAgICAgIDEsIDEsIDEsIDEpOwogICAgY20uYWRkU2VsZWN0aW9uKFBvcygyLCAyKSk7CiAgICBoYXNTZWxlY3Rpb25zKGNtLCAwLCAwLCAwLCA0LAogICAgICAgICAgICAgICAgICAxLCAxLCAxLCAxLAogICAgICAgICAgICAgICAgICAyLCAyLCAyLCAyKTsKICB9LCB7dmFsdWU6ICIxMjM0XG4xMjM0XG4xMjM0In0pOwoKICB0ZXN0Q00oInJlcGxhY2VTZWxlY3Rpb24iLCBmdW5jdGlvbihjbSkgewogICAgdmFyIHNlbGVjdGlvbnMgPSBbe2FuY2hvcjogUG9zKDAsIDApLCBoZWFkOiBQb3MoMCwgMSl9LAogICAgICAgICAgICAgICAgICAgICAge2FuY2hvcjogUG9zKDAsIDIpLCBoZWFkOiBQb3MoMCwgMyl9LAogICAgICAgICAgICAgICAgICAgICAge2FuY2hvcjogUG9zKDAsIDQpLCBoZWFkOiBQb3MoMCwgNSl9LAogICAgICAgICAgICAgICAgICAgICAge2FuY2hvcjogUG9zKDIsIDEpLCBoZWFkOiBQb3MoMiwgNCl9LAogICAgICAgICAgICAgICAgICAgICAge2FuY2hvcjogUG9zKDIsIDUpLCBoZWFkOiBQb3MoMiwgNil9XTsKICAgIHZhciB2YWwgPSAiMTIzNDU2XG4xMjM0NTZcbjEyMzQ1NiI7CiAgICBjbS5zZXRWYWx1ZSh2YWwpOwogICAgY20uc2V0U2VsZWN0aW9ucyhzZWxlY3Rpb25zKTsKICAgIGNtLnJlcGxhY2VTZWxlY3Rpb24oImFiIiwgImFyb3VuZCIpOwogICAgZXEoY20uZ2V0VmFsdWUoKSwgImFiMmFiNGFiNlxuMTIzNDU2XG4xYWI1YWIiKTsKICAgIGhhc1NlbGVjdGlvbnMoY20sIDAsIDAsIDAsIDIsCiAgICAgICAgICAgICAgICAgIDAsIDMsIDAsIDUsCiAgICAgICAgICAgICAgICAgIDAsIDYsIDAsIDgsCiAgICAgICAgICAgICAgICAgIDIsIDEsIDIsIDMsCiAgICAgICAgICAgICAgICAgIDIsIDQsIDIsIDYpOwogICAgY20uc2V0VmFsdWUodmFsKTsKICAgIGNtLnNldFNlbGVjdGlvbnMoc2VsZWN0aW9ucyk7CiAgICBjbS5yZXBsYWNlU2VsZWN0aW9uKCIiLCAiYXJvdW5kIik7CiAgICBlcShjbS5nZXRWYWx1ZSgpLCAiMjQ2XG4xMjM0NTZcbjE1Iik7CiAgICBoYXNTZWxlY3Rpb25zKGNtLCAwLCAwLCAwLCAwLAogICAgICAgICAgICAgICAgICAwLCAxLCAwLCAxLAogICAgICAgICAgICAgICAgICAwLCAyLCAwLCAyLAogICAgICAgICAgICAgICAgICAyLCAxLCAyLCAxLAogICAgICAgICAgICAgICAgICAyLCAyLCAyLCAyKTsKICAgIGNtLnNldFZhbHVlKHZhbCk7CiAgICBjbS5zZXRTZWxlY3Rpb25zKHNlbGVjdGlvbnMpOwogICAgY20ucmVwbGFjZVNlbGVjdGlvbigiWFxuWVxuWiIsICJhcm91bmQiKTsKICAgIGhhc1NlbGVjdGlvbnMoY20sIDAsIDAsIDIsIDEsCiAgICAgICAgICAgICAgICAgIDIsIDIsIDQsIDEsCiAgICAgICAgICAgICAgICAgIDQsIDIsIDYsIDEsCiAgICAgICAgICAgICAgICAgIDgsIDEsIDEwLCAxLAogICAgICAgICAgICAgICAgICAxMCwgMiwgMTIsIDEpOwogICAgY20ucmVwbGFjZVNlbGVjdGlvbigiYSIsICJhcm91bmQiKTsKICAgIGhhc1NlbGVjdGlvbnMoY20sIDAsIDAsIDAsIDEsCiAgICAgICAgICAgICAgICAgIDAsIDIsIDAsIDMsCiAgICAgICAgICAgICAgICAgIDAsIDQsIDAsIDUsCiAgICAgICAgICAgICAgICAgIDIsIDEsIDIsIDIsCiAgICAgICAgICAgICAgICAgIDIsIDMsIDIsIDQpOwogICAgY20ucmVwbGFjZVNlbGVjdGlvbigieHkiLCAic3RhcnQiKTsKICAgIGhhc1NlbGVjdGlvbnMoY20sIDAsIDAsIDAsIDAsCiAgICAgICAgICAgICAgICAgIDAsIDMsIDAsIDMsCiAgICAgICAgICAgICAgICAgIDAsIDYsIDAsIDYsCiAgICAgICAgICAgICAgICAgIDIsIDEsIDIsIDEsCiAgICAgICAgICAgICAgICAgIDIsIDQsIDIsIDQpOwogICAgY20ucmVwbGFjZVNlbGVjdGlvbigielxuZiIpOwogICAgaGFzU2VsZWN0aW9ucyhjbSwgMSwgMSwgMSwgMSwKICAgICAgICAgICAgICAgICAgMiwgMSwgMiwgMSwKICAgICAgICAgICAgICAgICAgMywgMSwgMywgMSwKICAgICAgICAgICAgICAgICAgNiwgMSwgNiwgMSwKICAgICAgICAgICAgICAgICAgNywgMSwgNywgMSk7CiAgICBlcShjbS5nZXRWYWx1ZSgpLCAielxuZnh5MnpcbmZ4eTR6XG5meHk2XG4xMjM0NTZcbjF6XG5meHk1elxuZnh5Iik7CiAgfSk7CgogIGZ1bmN0aW9uIHNlbGVjdChjbSkgewogICAgdmFyIHNlbHMgPSBbXTsKICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBhcmcgPSBhcmd1bWVudHNbaV07CiAgICAgIGlmIChhcmcuaGVhZCkgc2Vscy5wdXNoKGFyZyk7CiAgICAgIGVsc2Ugc2Vscy5wdXNoKHtoZWFkOiBhcmcsIGFuY2hvcjogYXJnfSk7CiAgICB9CiAgICBjbS5zZXRTZWxlY3Rpb25zKHNlbHMsIHNlbHMubGVuZ3RoIC0gMSk7CiAgfQoKICB0ZXN0Q00oImluZGVudFNlbGVjdGlvbiIsIGZ1bmN0aW9uKGNtKSB7CiAgICBzZWxlY3QoY20sIFBvcygwLCAxKSwgUG9zKDEsIDEpKTsKICAgIGNtLmluZGVudFNlbGVjdGlvbig0KTsKICAgIGVxKGNtLmdldFZhbHVlKCksICIgICAgZm9vXG4gICAgYmFyXG5iYXoiKTsKCiAgICBzZWxlY3QoY20sIFBvcygwLCAyKSwgUG9zKDAsIDMpLCBQb3MoMCwgNCkpOwogICAgY20uaW5kZW50U2VsZWN0aW9uKC0yKTsKICAgIGVxKGNtLmdldFZhbHVlKCksICIgIGZvb1xuICAgIGJhclxuYmF6Iik7CgogICAgc2VsZWN0KGNtLCB7YW5jaG9yOiBQb3MoMCwgMCksIGhlYWQ6IFBvcygxLCAyKX0sCiAgICAgICAgICAge2FuY2hvcjogUG9zKDEsIDMpLCBoZWFkOiBQb3MoMiwgMCl9KTsKICAgIGNtLmluZGVudFNlbGVjdGlvbigtMik7CiAgICBlcShjbS5nZXRWYWx1ZSgpLCAiZm9vXG4gIGJhclxuYmF6Iik7CiAgfSwge3ZhbHVlOiAiZm9vXG5iYXJcbmJheiJ9KTsKCiAgdGVzdENNKCJraWxsTGluZSIsIGZ1bmN0aW9uKGNtKSB7CiAgICBzZWxlY3QoY20sIFBvcygwLCAxKSwgUG9zKDAsIDIpLCBQb3MoMSwgMSkpOwogICAgY20uZXhlY0NvbW1hbmQoImtpbGxMaW5lIik7CiAgICBlcShjbS5nZXRWYWx1ZSgpLCAiZlxuYlxuYmF6Iik7CiAgICBjbS5leGVjQ29tbWFuZCgia2lsbExpbmUiKTsKICAgIGVxKGNtLmdldFZhbHVlKCksICJmYmJheiIpOwogICAgY20uc2V0VmFsdWUoImZvb1xuYmFyXG5iYXoiKTsKICAgIHNlbGVjdChjbSwgUG9zKDAsIDEpLCB7YW5jaG9yOiBQb3MoMCwgMiksIGhlYWQ6IFBvcygyLCAxKX0pOwogICAgY20uZXhlY0NvbW1hbmQoImtpbGxMaW5lIik7CiAgICBlcShjbS5nZXRWYWx1ZSgpLCAiZmF6Iik7CiAgfSwge3ZhbHVlOiAiZm9vXG5iYXJcbmJheiJ9KTsKCiAgdGVzdENNKCJkZWxldGVMaW5lIiwgZnVuY3Rpb24oY20pIHsKICAgIHNlbGVjdChjbSwgUG9zKDAsIDApLAogICAgICAgICAgIHtoZWFkOiBQb3MoMCwgMSksIGFuY2hvcjogUG9zKDIsIDApfSwKICAgICAgICAgICBQb3MoNCwgMCkpOwogICAgY20uZXhlY0NvbW1hbmQoImRlbGV0ZUxpbmUiKTsKICAgIGVxKGNtLmdldFZhbHVlKCksICI0XG42XG43Iik7CiAgICBzZWxlY3QoY20sIFBvcygyLCAxKSk7CiAgICBjbS5leGVjQ29tbWFuZCgiZGVsZXRlTGluZSIpOwogICAgZXEoY20uZ2V0VmFsdWUoKSwgIjRcbjZcbiIpOwogIH0sIHt2YWx1ZTogIjFcbjJcbjNcbjRcbjVcbjZcbjcifSk7CgogIHRlc3RDTSgiZGVsZXRlSCIsIGZ1bmN0aW9uKGNtKSB7CiAgICBzZWxlY3QoY20sIFBvcygwLCA0KSwge2FuY2hvcjogUG9zKDEsIDQpLCBoZWFkOiBQb3MoMSwgNSl9KTsKICAgIGNtLmV4ZWNDb21tYW5kKCJkZWxXb3JkQWZ0ZXIiKTsKICAgIGVxKGNtLmdldFZhbHVlKCksICJmb28gYmFyIGJhelxuYWJjIGVmIGdoaVxuIik7CiAgICBjbS5leGVjQ29tbWFuZCgiZGVsV29yZEFmdGVyIik7CiAgICBlcShjbS5nZXRWYWx1ZSgpLCAiZm9vICBiYXpcbmFiYyAgZ2hpXG4iKTsKICAgIGNtLmV4ZWNDb21tYW5kKCJkZWxDaGFyQmVmb3JlIik7CiAgICBjbS5leGVjQ29tbWFuZCgiZGVsQ2hhckJlZm9yZSIpOwogICAgZXEoY20uZ2V0VmFsdWUoKSwgImZvIGJhelxuYWIgZ2hpXG4iKTsKICAgIHNlbGVjdChjbSwgUG9zKDAsIDMpLCBQb3MoMCwgNCksIFBvcygwLCA1KSk7CiAgICBjbS5leGVjQ29tbWFuZCgiZGVsV29yZEFmdGVyIik7CiAgICBlcShjbS5nZXRWYWx1ZSgpLCAiZm8gXG5hYiBnaGlcbiIpOwogIH0sIHt2YWx1ZTogImZvbyBiYXIgYmF6XG5hYmMgZGVmIGdoaVxuIn0pOwoKICB0ZXN0Q00oImdvTGluZVN0YXJ0IiwgZnVuY3Rpb24oY20pIHsKICAgIHNlbGVjdChjbSwgUG9zKDAsIDIpLCBQb3MoMCwgMyksIFBvcygxLCAxKSk7CiAgICBjbS5leGVjQ29tbWFuZCgiZ29MaW5lU3RhcnQiKTsKICAgIGhhc0N1cnNvcnMoY20sIDAsIDAsIDEsIDApOwogICAgc2VsZWN0KGNtLCBQb3MoMSwgMSksIFBvcygwLCAxKSk7CiAgICBjbS5zZXRFeHRlbmRpbmcodHJ1ZSk7CiAgICBjbS5leGVjQ29tbWFuZCgiZ29MaW5lU3RhcnQiKTsKICAgIGhhc1NlbGVjdGlvbnMoY20sIDAsIDEsIDAsIDAsCiAgICAgICAgICAgICAgICAgIDEsIDEsIDEsIDApOwogIH0sIHt2YWx1ZTogImZvb1xuYmFyXG5iYXoifSk7CgogIHRlc3RDTSgibW92ZVYiLCBmdW5jdGlvbihjbSkgewogICAgc2VsZWN0KGNtLCBQb3MoMCwgMiksIFBvcygxLCAyKSk7CiAgICBjbS5leGVjQ29tbWFuZCgiZ29MaW5lRG93biIpOwogICAgaGFzQ3Vyc29ycyhjbSwgMSwgMiwgMiwgMik7CiAgICBjbS5leGVjQ29tbWFuZCgiZ29MaW5lVXAiKTsKICAgIGhhc0N1cnNvcnMoY20sIDAsIDIsIDEsIDIpOwogICAgY20uZXhlY0NvbW1hbmQoImdvTGluZVVwIik7CiAgICBoYXNDdXJzb3JzKGNtLCAwLCAwLCAwLCAyKTsKICAgIGNtLmV4ZWNDb21tYW5kKCJnb0xpbmVVcCIpOwogICAgaGFzQ3Vyc29ycyhjbSwgMCwgMCk7CiAgICBzZWxlY3QoY20sIFBvcygwLCAyKSwgUG9zKDEsIDIpKTsKICAgIGNtLnNldEV4dGVuZGluZyh0cnVlKTsKICAgIGNtLmV4ZWNDb21tYW5kKCJnb0xpbmVEb3duIik7CiAgICBoYXNTZWxlY3Rpb25zKGNtLCAwLCAyLCAyLCAyKTsKICB9LCB7dmFsdWU6ICIxMjM0NVxuMTIzNDVcbjEyMzQ1In0pOwoKICB0ZXN0Q00oIm1vdmVIIiwgZnVuY3Rpb24oY20pIHsKICAgIHNlbGVjdChjbSwgUG9zKDAsIDEpLCBQb3MoMCwgMyksIFBvcygwLCA1KSwgUG9zKDIsIDMpKTsKICAgIGNtLmV4ZWNDb21tYW5kKCJnb0NoYXJSaWdodCIpOwogICAgaGFzQ3Vyc29ycyhjbSwgMCwgMiwgMCwgNCwgMSwgMCwgMiwgNCk7CiAgICBjbS5leGVjQ29tbWFuZCgiZ29DaGFyTGVmdCIpOwogICAgaGFzQ3Vyc29ycyhjbSwgMCwgMSwgMCwgMywgMCwgNSwgMiwgMyk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDE1OyBpKyspCiAgICAgIGNtLmV4ZWNDb21tYW5kKCJnb0NoYXJSaWdodCIpOwogICAgaGFzQ3Vyc29ycyhjbSwgMiwgNCwgMiwgNSk7CiAgfSwge3ZhbHVlOiAiMTIzNDVcbjEyMzQ1XG4xMjM0NSJ9KTsKCiAgdGVzdENNKCJuZXdsaW5lQW5kSW5kZW50IiwgZnVuY3Rpb24oY20pIHsKICAgIHNlbGVjdChjbSwgUG9zKDAsIDUpLCBQb3MoMSwgNSkpOwogICAgY20uZXhlY0NvbW1hbmQoIm5ld2xpbmVBbmRJbmRlbnQiKTsKICAgIGhhc0N1cnNvcnMoY20sIDEsIDIsIDMsIDIpOwogICAgZXEoY20uZ2V0VmFsdWUoKSwgInggPSBbXG4gIDFdO1xueSA9IFtcbiAgMl07Iik7CiAgICBjbS51bmRvKCk7CiAgICBlcShjbS5nZXRWYWx1ZSgpLCAieCA9IFsxXTtcbnkgPSBbMl07Iik7CiAgICBoYXNDdXJzb3JzKGNtLCAwLCA1LCAxLCA1KTsKICAgIHNlbGVjdChjbSwgUG9zKDAsIDUpLCBQb3MoMCwgNikpOwogICAgY20uZXhlY0NvbW1hbmQoIm5ld2xpbmVBbmRJbmRlbnQiKTsKICAgIGhhc0N1cnNvcnMoY20sIDEsIDIsIDIsIDApOwogICAgZXEoY20uZ2V0VmFsdWUoKSwgInggPSBbXG4gIDFcbl07XG55ID0gWzJdOyIpOwogIH0sIHt2YWx1ZTogInggPSBbMV07XG55ID0gWzJdOyIsIG1vZGU6ICJqYXZhc2NyaXB0In0pOwoKICB0ZXN0Q00oImdvRG9jU3RhcnRFbmQiLCBmdW5jdGlvbihjbSkgewogICAgc2VsZWN0KGNtLCBQb3MoMCwgMSksIFBvcygxLCAxKSk7CiAgICBjbS5leGVjQ29tbWFuZCgiZ29Eb2NTdGFydCIpOwogICAgaGFzQ3Vyc29ycyhjbSwgMCwgMCk7CiAgICBzZWxlY3QoY20sIFBvcygwLCAxKSwgUG9zKDEsIDEpKTsKICAgIGNtLmV4ZWNDb21tYW5kKCJnb0RvY0VuZCIpOwogICAgaGFzQ3Vyc29ycyhjbSwgMSwgMyk7CiAgICBzZWxlY3QoY20sIFBvcygwLCAxKSwgUG9zKDEsIDEpKTsKICAgIGNtLnNldEV4dGVuZGluZyh0cnVlKTsKICAgIGNtLmV4ZWNDb21tYW5kKCJnb0RvY0VuZCIpOwogICAgaGFzU2VsZWN0aW9ucyhjbSwgMSwgMSwgMSwgMyk7CiAgfSwge3ZhbHVlOiAiYWJjXG5kZWYifSk7CgogIHRlc3RDTSgic2VsZWN0aW9uSGlzdG9yeSIsIGZ1bmN0aW9uKGNtKSB7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDM7ICsraSkKICAgICAgY20uYWRkU2VsZWN0aW9uKFBvcygwLCBpICogMiksIFBvcygwLCBpICogMiArIDEpKTsKICAgIGNtLmV4ZWNDb21tYW5kKCJ1bmRvU2VsZWN0aW9uIik7CiAgICBlcShjbS5nZXRTZWxlY3Rpb24oKSwgIjFcbjIiKTsKICAgIGNtLmV4ZWNDb21tYW5kKCJ1bmRvU2VsZWN0aW9uIik7CiAgICBlcShjbS5nZXRTZWxlY3Rpb24oKSwgIjEiKTsKICAgIGNtLmV4ZWNDb21tYW5kKCJ1bmRvU2VsZWN0aW9uIik7CiAgICBlcShjbS5nZXRTZWxlY3Rpb24oKSwgIiIpOwogICAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygwLCAwKSk7CiAgICBjbS5leGVjQ29tbWFuZCgicmVkb1NlbGVjdGlvbiIpOwogICAgZXEoY20uZ2V0U2VsZWN0aW9uKCksICIxIik7CiAgICBjbS5leGVjQ29tbWFuZCgicmVkb1NlbGVjdGlvbiIpOwogICAgZXEoY20uZ2V0U2VsZWN0aW9uKCksICIxXG4yIik7CiAgICBjbS5leGVjQ29tbWFuZCgicmVkb1NlbGVjdGlvbiIpOwogICAgZXEoY20uZ2V0U2VsZWN0aW9uKCksICIxXG4yXG4zIik7CiAgfSwge3ZhbHVlOiAiMSAyIDMifSk7Cn0pKCk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/test/phantom_driver.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dmFyIHBhZ2UgPSByZXF1aXJlKCd3ZWJwYWdlJykuY3JlYXRlKCk7CgpwYWdlLm9wZW4oImh0dHA6Ly9sb2NhbGhvc3Q6MzAwMC90ZXN0L2luZGV4Lmh0bWwiLCBmdW5jdGlvbiAoc3RhdHVzKSB7CiAgaWYgKHN0YXR1cyAhPSAic3VjY2VzcyIpIHsKICAgIGNvbnNvbGUubG9nKCJwYWdlIGNvdWxkbid0IGJlIGxvYWRlZCBzdWNjZXNzZnVsbHkiKTsKICAgIHBoYW50b20uZXhpdCgxKTsKICB9CiAgd2FpdEZvcihmdW5jdGlvbiAoKSB7CiAgICByZXR1cm4gcGFnZS5ldmFsdWF0ZShmdW5jdGlvbiAoKSB7CiAgICAgIHZhciBvdXRwdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RhdHVzJyk7CiAgICAgIGlmICghb3V0cHV0KSB7IHJldHVybiBmYWxzZTsgfQogICAgICByZXR1cm4gKC9eKFxkKyBmYWlsdXJlcz98YWxsIHBhc3NlZCkvaSkudGVzdChvdXRwdXQuaW5uZXJUZXh0KTsKICAgIH0pOwogIH0sIGZ1bmN0aW9uICgpIHsKICAgIHZhciBmYWlsZWQgPSBwYWdlLmV2YWx1YXRlKGZ1bmN0aW9uICgpIHsgcmV0dXJuIHdpbmRvdy5mYWlsZWQ7IH0pOwogICAgdmFyIG91dHB1dCA9IHBhZ2UuZXZhbHVhdGUoZnVuY3Rpb24gKCkgewogICAgICByZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ291dHB1dCcpLmlubmVyVGV4dCArICJcbiIgKwogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGF0dXMnKS5pbm5lclRleHQ7CiAgICB9KTsKICAgIGNvbnNvbGUubG9nKG91dHB1dCk7CiAgICBwaGFudG9tLmV4aXQoZmFpbGVkID4gMCA/IDEgOiAwKTsKICB9KTsKfSk7CgpmdW5jdGlvbiB3YWl0Rm9yICh0ZXN0LCBjYikgewogIGlmICh0ZXN0KCkpIHsKICAgIGNiKCk7CiAgfSBlbHNlIHsKICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyB3YWl0Rm9yKHRlc3QsIGNiKTsgfSwgMjUwKTsKICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/test/run.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[IyEvdXNyL2Jpbi9lbnYgbm9kZQoKdmFyIGxpbnQgPSByZXF1aXJlKCIuL2xpbnQvbGludCIpOwoKbGludC5jaGVja0RpcigibW9kZSIpOwpsaW50LmNoZWNrRGlyKCJsaWIiKTsKbGludC5jaGVja0RpcigiYWRkb24iKTsKbGludC5jaGVja0Rpcigia2V5bWFwIik7Cgp2YXIgb2sgPSBsaW50LnN1Y2Nlc3MoKTsKCnZhciBmaWxlcyA9IG5ldyAocmVxdWlyZSgnbm9kZS1zdGF0aWMnKS5TZXJ2ZXIpKCk7Cgp2YXIgc2VydmVyID0gcmVxdWlyZSgnaHR0cCcpLmNyZWF0ZVNlcnZlcihmdW5jdGlvbiAocmVxLCByZXMpIHsKICByZXEuYWRkTGlzdGVuZXIoJ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgIGZpbGVzLnNlcnZlKHJlcSwgcmVzLCBmdW5jdGlvbiAoZXJyLyosIHJlc3VsdCAqLykgewogICAgICBpZiAoZXJyKSB7CiAgICAgICAgY29uc29sZS5lcnJvcihlcnIpOwogICAgICAgIHByb2Nlc3MuZXhpdCgxKTsKICAgICAgfQogICAgfSk7CiAgfSkucmVzdW1lKCk7Cn0pLmFkZExpc3RlbmVyKCdlcnJvcicsIGZ1bmN0aW9uIChlcnIpIHsKICB0aHJvdyBlcnI7Cn0pLmxpc3RlbigzMDAwLCBmdW5jdGlvbiAoKSB7CiAgdmFyIGNoaWxkUHJvY2VzcyA9IHJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKTsKICB2YXIgcGhhbnRvbWpzID0gcmVxdWlyZSgicGhhbnRvbWpzIik7CiAgdmFyIGNoaWxkQXJncyA9IFsKICAgIHJlcXVpcmUoInBhdGgiKS5qb2luKF9fZGlybmFtZSwgJ3BoYW50b21fZHJpdmVyLmpzJykKICBdOwogIGNoaWxkUHJvY2Vzcy5leGVjRmlsZShwaGFudG9tanMucGF0aCwgY2hpbGRBcmdzLCBmdW5jdGlvbiAoZXJyLCBzdGRvdXQsIHN0ZGVycikgewogICAgc2VydmVyLmNsb3NlKCk7CiAgICBjb25zb2xlLmxvZyhzdGRvdXQpOwogICAgaWYgKGVycikgY29uc29sZS5lcnJvcihlcnIpOwogICAgaWYgKHN0ZGVycikgY29uc29sZS5lcnJvcihzdGRlcnIpOwogICAgcHJvY2Vzcy5leGl0KGVyciB8fCBzdGRlcnIgfHwgIW9rID8gMSA6IDApOwogIH0pOwp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/test/search_test.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKCkgewogICJ1c2Ugc3RyaWN0IjsKCiAgZnVuY3Rpb24gdGVzdChuYW1lKSB7CiAgICB2YXIgdGV4dCA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSwgYXJndW1lbnRzLmxlbmd0aCAtIDEpLmpvaW4oIlxuIik7CiAgICB2YXIgYm9keSA9IGFyZ3VtZW50c1thcmd1bWVudHMubGVuZ3RoIC0gMV07CiAgICByZXR1cm4gd2luZG93LnRlc3QoInNlYXJjaF8iICsgbmFtZSwgZnVuY3Rpb24oKSB7CiAgICAgIGJvZHkobmV3IENvZGVNaXJyb3IuRG9jKHRleHQpKTsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gcnVuKGRvYywgcXVlcnksIGluc2Vuc2l0aXZlKSB7CiAgICB2YXIgY3Vyc29yID0gZG9jLmdldFNlYXJjaEN1cnNvcihxdWVyeSwgbnVsbCwgaW5zZW5zaXRpdmUpOwogICAgZm9yICh2YXIgaSA9IDM7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpICs9IDQpIHsKICAgICAgdmFyIGZvdW5kID0gY3Vyc29yLmZpbmROZXh0KCk7CiAgICAgIGlzKGZvdW5kLCAibm90IGVub3VnaCByZXN1bHRzIChmb3J3YXJkKSIpOwogICAgICBlcVBvcyhQb3MoYXJndW1lbnRzW2ldLCBhcmd1bWVudHNbaSArIDFdKSwgY3Vyc29yLmZyb20oKSwgImZyb20sIGZvcndhcmQsICIgKyAoaSAtIDMpIC8gNCk7CiAgICAgIGVxUG9zKFBvcyhhcmd1bWVudHNbaSArIDJdLCBhcmd1bWVudHNbaSArIDNdKSwgY3Vyc29yLnRvKCksICJ0bywgZm9yd2FyZCwgIiArIChpIC0gMykgLyA0KTsKICAgIH0KICAgIGlzKCFjdXJzb3IuZmluZE5leHQoKSwgInRvbyBtYW55IG1hdGNoZXMgKGZvcndhcmQpIik7CiAgICBmb3IgKHZhciBpID0gYXJndW1lbnRzLmxlbmd0aCAtIDQ7IGkgPj0gMzsgaSAtPSA0KSB7CiAgICAgIHZhciBmb3VuZCA9IGN1cnNvci5maW5kUHJldmlvdXMoKTsKICAgICAgaXMoZm91bmQsICJub3QgZW5vdWdoIHJlc3VsdHMgKGJhY2t3YXJkcykiKTsKICAgICAgZXFQb3MoUG9zKGFyZ3VtZW50c1tpXSwgYXJndW1lbnRzW2kgKyAxXSksIGN1cnNvci5mcm9tKCksICJmcm9tLCBiYWNrd2FyZHMsICIgKyAoaSAtIDMpIC8gNCk7CiAgICAgIGVxUG9zKFBvcyhhcmd1bWVudHNbaSArIDJdLCBhcmd1bWVudHNbaSArIDNdKSwgY3Vyc29yLnRvKCksICJ0bywgYmFja3dhcmRzLCAiICsgKGkgLSAzKSAvIDQpOwogICAgfQogICAgaXMoIWN1cnNvci5maW5kUHJldmlvdXMoKSwgInRvbyBtYW55IG1hdGNoZXMgKGJhY2t3YXJkcykiKTsKICB9CgogIHRlc3QoInNpbXBsZSIsICJhYmNkZWZnIiwgImFiY2RlZmciLCBmdW5jdGlvbihkb2MpIHsKICAgIHJ1bihkb2MsICJjZGUiLCBmYWxzZSwgMCwgMiwgMCwgNSwgMSwgMiwgMSwgNSk7CiAgfSk7CgogIHRlc3QoIm11bHRpbGluZSIsICJoYWxsbyIsICJnb29kYnllIiwgZnVuY3Rpb24oZG9jKSB7CiAgICBydW4oZG9jLCAibGxvXG5nb28iLCBmYWxzZSwgMCwgMiwgMSwgMyk7CiAgICBydW4oZG9jLCAiYmxhaFxuaGFsbCIsIGZhbHNlKTsKICAgIHJ1bihkb2MsICJieWVcbmV5ZSIsIGZhbHNlKTsKICB9KTsKCiAgdGVzdCgicmVnZXhwIiwgImFiY2RlIiwgImFiY2RlIiwgZnVuY3Rpb24oZG9jKSB7CiAgICBydW4oZG9jLCAvYmNkLywgZmFsc2UsIDAsIDEsIDAsIDQsIDEsIDEsIDEsIDQpOwogICAgcnVuKGRvYywgL0JDRC8sIGZhbHNlKTsKICAgIHJ1bihkb2MsIC9CQ0QvaSwgZmFsc2UsIDAsIDEsIDAsIDQsIDEsIDEsIDEsIDQpOwogIH0pOwoKICB0ZXN0KCJpbnNlbnNpdGl2ZSIsICJoYWxsbyIsICJIQUxMTyIsICJvaW5rIiwgImhBbGxPIiwgZnVuY3Rpb24oZG9jKSB7CiAgICBydW4oZG9jLCAiQWxsIiwgZmFsc2UsIDMsIDEsIDMsIDQpOwogICAgcnVuKGRvYywgIkFsbCIsIHRydWUsIDAsIDEsIDAsIDQsIDEsIDEsIDEsIDQsIDMsIDEsIDMsIDQpOwogIH0pOwoKICB0ZXN0KCJtdWx0aWxpbmVJbnNlbnNpdGl2ZSIsICJ6aWUgZ2luZHMga29tVCIsICJEZSBTdG9vbWJvb3QiLCAidWl0IFNwYW5qZSB3ZWVyIGFhbiIsIGZ1bmN0aW9uKGRvYykgewogICAgcnVuKGRvYywgImtvbXRcbmRlIHN0b29tYm9vdFxudWl0IiwgZmFsc2UpOwogICAgcnVuKGRvYywgImtvbXRcbmRlIHN0b29tYm9vdFxudWl0IiwgdHJ1ZSwgMCwgMTAsIDIsIDMpOwogICAgcnVuKGRvYywgImtPTXRcbmRFIHN0T09tYm9vdFxudWlUIiwgdHJ1ZSwgMCwgMTAsIDIsIDMpOwogIH0pOwoKICB0ZXN0KCJleHBhbmRpbmdDYXNlRm9sZCIsICI8Yj7EsMSwIMSwxLA8L2I+IiwgIjxiPnV1IHV1PC9iPiIsIGZ1bmN0aW9uKGRvYykgewogICAgaWYgKHBoYW50b20pIHJldHVybjsgLy8gQSBQaGFudG9tIGJ1ZyBtYWtlcyB0aGlzIGhhbmcKICAgIHJ1bihkb2MsICI8L2I+IiwgdHJ1ZSwgMCwgOCwgMCwgMTIsIDEsIDgsIDEsIDEyKTsKICAgIHJ1bihkb2MsICLEsMSwIiwgdHJ1ZSwgMCwgMywgMCwgNSwgMCwgNiwgMCwgOCk7CiAgfSk7Cn0pKCk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/test/sublime_test.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKCkgewogICJ1c2Ugc3RyaWN0IjsKICAKICB2YXIgUG9zID0gQ29kZU1pcnJvci5Qb3M7CiAgbmFtZXNwYWNlID0gInN1YmxpbWVfIjsKCiAgZnVuY3Rpb24gc3RUZXN0KG5hbWUpIHsKICAgIHZhciBhY3Rpb25zID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgIHRlc3RDTShuYW1lLCBmdW5jdGlvbihjbSkgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFjdGlvbnMubGVuZ3RoOyBpKyspIHsKICAgICAgICB2YXIgYWN0aW9uID0gYWN0aW9uc1tpXTsKICAgICAgICBpZiAodHlwZW9mIGFjdGlvbiA9PSAic3RyaW5nIiAmJiBpID09IDApCiAgICAgICAgICBjbS5zZXRWYWx1ZShhY3Rpb24pOwogICAgICAgIGVsc2UgaWYgKHR5cGVvZiBhY3Rpb24gPT0gInN0cmluZyIpCiAgICAgICAgICBjbS5leGVjQ29tbWFuZChhY3Rpb24pOwogICAgICAgIGVsc2UgaWYgKGFjdGlvbiBpbnN0YW5jZW9mIFBvcykKICAgICAgICAgIGNtLnNldEN1cnNvcihhY3Rpb24pOwogICAgICAgIGVsc2UKICAgICAgICAgIGFjdGlvbihjbSk7CiAgICAgIH0KICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gYXQobGluZSwgY2gsIG1zZykgewogICAgcmV0dXJuIGZ1bmN0aW9uKGNtKSB7CiAgICAgIGVxKGNtLmxpc3RTZWxlY3Rpb25zKCkubGVuZ3RoLCAxKTsKICAgICAgZXFQb3MoY20uZ2V0Q3Vyc29yKCJoZWFkIiksIFBvcyhsaW5lLCBjaCksIG1zZyk7CiAgICAgIGVxUG9zKGNtLmdldEN1cnNvcigiYW5jaG9yIiksIFBvcyhsaW5lLCBjaCksIG1zZyk7CiAgICB9OwogIH0KCiAgZnVuY3Rpb24gdmFsKGNvbnRlbnQsIG1zZykgewogICAgcmV0dXJuIGZ1bmN0aW9uKGNtKSB7IGVxKGNtLmdldFZhbHVlKCksIGNvbnRlbnQsIG1zZyk7IH07CiAgfQoKICBmdW5jdGlvbiBhcmdzVG9SYW5nZXMoYXJncykgewogICAgaWYgKGFyZ3MubGVuZ3RoICUgNCkgdGhyb3cgbmV3IEVycm9yKCJXcm9uZyBudW1iZXIgb2YgYXJndW1lbnRzIGZvciByYW5nZXMuIik7CiAgICB2YXIgcmFuZ2VzID0gW107CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpICs9IDQpCiAgICAgIHJhbmdlcy5wdXNoKHthbmNob3I6IFBvcyhhcmdzW2ldLCBhcmdzW2kgKyAxXSksCiAgICAgICAgICAgICAgICAgICBoZWFkOiBQb3MoYXJnc1tpICsgMl0sIGFyZ3NbaSArIDNdKX0pOwogICAgcmV0dXJuIHJhbmdlczsKICB9CgogIGZ1bmN0aW9uIHNldFNlbCgpIHsKICAgIHZhciByYW5nZXMgPSBhcmdzVG9SYW5nZXMoYXJndW1lbnRzKTsKICAgIHJldHVybiBmdW5jdGlvbihjbSkgeyBjbS5zZXRTZWxlY3Rpb25zKHJhbmdlcywgMCk7IH07CiAgfQoKICBmdW5jdGlvbiBoYXNTZWwoKSB7CiAgICB2YXIgcmFuZ2VzID0gYXJnc1RvUmFuZ2VzKGFyZ3VtZW50cyk7CiAgICByZXR1cm4gZnVuY3Rpb24oY20pIHsKICAgICAgdmFyIHNlbHMgPSBjbS5saXN0U2VsZWN0aW9ucygpOwogICAgICBpZiAoc2Vscy5sZW5ndGggIT0gcmFuZ2VzLmxlbmd0aCkKICAgICAgICB0aHJvdyBuZXcgRmFpbHVyZSgiRXhwZWN0ZWQgIiArIHJhbmdlcy5sZW5ndGggKyAiIHNlbGVjdGlvbnMsIGJ1dCBmb3VuZCAiICsgc2Vscy5sZW5ndGgpOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbHMubGVuZ3RoOyBpKyspIHsKICAgICAgICBlcVBvcyhzZWxzW2ldLmFuY2hvciwgcmFuZ2VzW2ldLmFuY2hvciwgImFuY2hvciAiICsgaSk7CiAgICAgICAgZXFQb3Moc2Vsc1tpXS5oZWFkLCByYW5nZXNbaV0uaGVhZCwgImhlYWQgIiArIGkpOwogICAgICB9CiAgICB9OwogIH0KCiAgc3RUZXN0KCJieVN1YndvcmQiLCAidGhlIGZvb19iYXIgRG9vRGFoQmFoIFxuIGEiLAogICAgICAgICAiZ29TdWJ3b3JkTGVmdCIsIGF0KDAsIDApLAogICAgICAgICAiZ29TdWJ3b3JkUmlnaHQiLCBhdCgwLCAzKSwKICAgICAgICAgImdvU3Vid29yZFJpZ2h0IiwgYXQoMCwgNyksCiAgICAgICAgICJnb1N1YndvcmRSaWdodCIsIGF0KDAsIDExKSwKICAgICAgICAgImdvU3Vid29yZFJpZ2h0IiwgYXQoMCwgMTUpLAogICAgICAgICAiZ29TdWJ3b3JkUmlnaHQiLCBhdCgwLCAxOCksCiAgICAgICAgICJnb1N1YndvcmRSaWdodCIsIGF0KDAsIDIxKSwKICAgICAgICAgImdvU3Vid29yZFJpZ2h0IiwgYXQoMCwgMjIpLAogICAgICAgICAiZ29TdWJ3b3JkUmlnaHQiLCBhdCgxLCAwKSwKICAgICAgICAgImdvU3Vid29yZFJpZ2h0IiwgYXQoMSwgMiksCiAgICAgICAgICJnb1N1YndvcmRSaWdodCIsIGF0KDEsIDIpLAogICAgICAgICAiZ29TdWJ3b3JkTGVmdCIsIGF0KDEsIDEpLAogICAgICAgICAiZ29TdWJ3b3JkTGVmdCIsIGF0KDEsIDApLAogICAgICAgICAiZ29TdWJ3b3JkTGVmdCIsIGF0KDAsIDIyKSwKICAgICAgICAgImdvU3Vid29yZExlZnQiLCBhdCgwLCAxOCksCiAgICAgICAgICJnb1N1YndvcmRMZWZ0IiwgYXQoMCwgMTUpLAogICAgICAgICAiZ29TdWJ3b3JkTGVmdCIsIGF0KDAsIDEyKSwKICAgICAgICAgImdvU3Vid29yZExlZnQiLCBhdCgwLCA4KSwKICAgICAgICAgImdvU3Vid29yZExlZnQiLCBhdCgwLCA0KSwKICAgICAgICAgImdvU3Vid29yZExlZnQiLCBhdCgwLCAwKSk7CgogIHN0VGVzdCgic3BsaXRTZWxlY3Rpb25CeUxpbmUiLCAiYWJjXG5kZWZcbmdoaSIsCiAgICAgICAgIHNldFNlbCgwLCAxLCAyLCAyKSwKICAgICAgICAgInNwbGl0U2VsZWN0aW9uQnlMaW5lIiwKICAgICAgICAgaGFzU2VsKDAsIDEsIDAsIDMsCiAgICAgICAgICAgICAgICAxLCAwLCAxLCAzLAogICAgICAgICAgICAgICAgMiwgMCwgMiwgMikpOwoKICBzdFRlc3QoInNwbGl0U2VsZWN0aW9uQnlMaW5lTXVsdGkiLCAiYWJjXG5kZWZcbmdoaVxuamtsIiwKICAgICAgICAgc2V0U2VsKDAsIDEsIDEsIDEsCiAgICAgICAgICAgICAgICAxLCAyLCAzLCAyLAogICAgICAgICAgICAgICAgMywgMywgMywgMyksCiAgICAgICAgICJzcGxpdFNlbGVjdGlvbkJ5TGluZSIsCiAgICAgICAgIGhhc1NlbCgwLCAxLCAwLCAzLAogICAgICAgICAgICAgICAgMSwgMCwgMSwgMSwKICAgICAgICAgICAgICAgIDEsIDIsIDEsIDMsCiAgICAgICAgICAgICAgICAyLCAwLCAyLCAzLAogICAgICAgICAgICAgICAgMywgMCwgMywgMiwKICAgICAgICAgICAgICAgIDMsIDMsIDMsIDMpKTsKCiAgc3RUZXN0KCJzZWxlY3RMaW5lIiwgImFiY1xuZGVmXG5naGkiLAogICAgICAgICBzZXRTZWwoMCwgMSwgMCwgMSwKICAgICAgICAgICAgICAgIDIsIDAsIDIsIDEpLAogICAgICAgICAic2VsZWN0TGluZSIsCiAgICAgICAgIGhhc1NlbCgwLCAwLCAxLCAwLAogICAgICAgICAgICAgICAgMiwgMCwgMiwgMyksCiAgICAgICAgIHNldFNlbCgwLCAxLCAxLCAwKSwKICAgICAgICAgInNlbGVjdExpbmUiLAogICAgICAgICBoYXNTZWwoMCwgMCwgMiwgMCkpOwoKICBzdFRlc3QoImluc2VydExpbmVBZnRlciIsICJhYmNkZVxuZmdoaWprbFxubW4iLAogICAgICAgICBzZXRTZWwoMCwgMSwgMCwgMSwKICAgICAgICAgICAgICAgIDAsIDMsIDAsIDMsCiAgICAgICAgICAgICAgICAxLCAyLCAxLCAyLAogICAgICAgICAgICAgICAgMSwgMywgMSwgNSksICJpbnNlcnRMaW5lQWZ0ZXIiLAogICAgICAgICBoYXNTZWwoMSwgMCwgMSwgMCwKICAgICAgICAgICAgICAgIDMsIDAsIDMsIDApLCB2YWwoImFiY2RlXG5cbmZnaGlqa2xcblxubW4iKSk7CgogIHN0VGVzdCgiaW5zZXJ0TGluZUJlZm9yZSIsICJhYmNkZVxuZmdoaWprbFxubW4iLAogICAgICAgICBzZXRTZWwoMCwgMSwgMCwgMSwKICAgICAgICAgICAgICAgIDAsIDMsIDAsIDMsCiAgICAgICAgICAgICAgICAxLCAyLCAxLCAyLAogICAgICAgICAgICAgICAgMSwgMywgMSwgNSksICJpbnNlcnRMaW5lQmVmb3JlIiwKICAgICAgICAgaGFzU2VsKDAsIDAsIDAsIDAsCiAgICAgICAgICAgICAgICAyLCAwLCAyLCAwKSwgdmFsKCJcbmFiY2RlXG5cbmZnaGlqa2xcbm1uIikpOwoKICBzdFRlc3QoInNlbGVjdE5leHRPY2N1cnJlbmNlIiwgImEgZm9vIGJhclxuZm9vYmFyIGZvbyIsCiAgICAgICAgIHNldFNlbCgwLCAyLCAwLCA1KSwKICAgICAgICAgInNlbGVjdE5leHRPY2N1cnJlbmNlIiwgaGFzU2VsKDAsIDIsIDAsIDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAwLCAxLCAzKSwKICAgICAgICAgInNlbGVjdE5leHRPY2N1cnJlbmNlIiwgaGFzU2VsKDAsIDIsIDAsIDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAwLCAxLCAzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgNywgMSwgMTApLAogICAgICAgICAic2VsZWN0TmV4dE9jY3VycmVuY2UiLCBoYXNTZWwoMCwgMiwgMCwgNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIDAsIDEsIDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCA3LCAxLCAxMCksCiAgICAgICAgIFBvcygwLCAzKSwgInNlbGVjdE5leHRPY2N1cnJlbmNlIiwgaGFzU2VsKDAsIDIsIDAsIDUpLAogICAgICAgICJzZWxlY3ROZXh0T2NjdXJyZW5jZSIsIGhhc1NlbCgwLCAyLCAwLCA1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCA3LCAxLCAxMCksCiAgICAgICAgIHNldFNlbCgwLCA2LCAwLCA5KSwKICAgICAgICAgInNlbGVjdE5leHRPY2N1cnJlbmNlIiwgaGFzU2VsKDAsIDYsIDAsIDksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAzLCAxLCA2KSk7CgogIHN0VGVzdCgic2VsZWN0U2NvcGUiLCAiZm9vKGEpIHtcbiAgYmFyWzEsIDJdO1xufSIsCiAgICAgICAgICJzZWxlY3RTY29wZSIsIGhhc1NlbCgwLCAwLCAyLCAxKSwKICAgICAgICAgUG9zKDAsIDQpLCAic2VsZWN0U2NvcGUiLCBoYXNTZWwoMCwgNCwgMCwgNSksCiAgICAgICAgIFBvcygwLCA1KSwgInNlbGVjdFNjb3BlIiwgaGFzU2VsKDAsIDQsIDAsIDUpLAogICAgICAgICBQb3MoMCwgNiksICJzZWxlY3RTY29wZSIsIGhhc1NlbCgwLCAwLCAyLCAxKSwKICAgICAgICAgUG9zKDAsIDgpLCAic2VsZWN0U2NvcGUiLCBoYXNTZWwoMCwgOCwgMiwgMCksCiAgICAgICAgIFBvcygxLCAyKSwgInNlbGVjdFNjb3BlIiwgaGFzU2VsKDAsIDgsIDIsIDApLAogICAgICAgICBQb3MoMSwgNiksICJzZWxlY3RTY29wZSIsIGhhc1NlbCgxLCA2LCAxLCAxMCksCiAgICAgICAgIFBvcygxLCA5KSwgInNlbGVjdFNjb3BlIiwgaGFzU2VsKDEsIDYsIDEsIDEwKSk7CgogIHN0VGVzdCgiZ29Ub0JyYWNrZXQiLCAiZm9vKGEpIHtcbiAgYmFyWzEsIDJdO1xufSIsCiAgICAgICAgIFBvcygwLCAwKSwgImdvVG9CcmFja2V0IiwgYXQoMCwgMCksCiAgICAgICAgIFBvcygwLCA0KSwgImdvVG9CcmFja2V0IiwgYXQoMCwgNSksICJnb1RvQnJhY2tldCIsIGF0KDAsIDQpLAogICAgICAgICBQb3MoMCwgOCksICJnb1RvQnJhY2tldCIsIGF0KDIsIDApLCAiZ29Ub0JyYWNrZXQiLCBhdCgwLCA4KSwKICAgICAgICAgUG9zKDEsIDIpLCAiZ29Ub0JyYWNrZXQiLCBhdCgyLCAwKSwKICAgICAgICAgUG9zKDEsIDcpLCAiZ29Ub0JyYWNrZXQiLCBhdCgxLCAxMCksICJnb1RvQnJhY2tldCIsIGF0KDEsIDYpKTsKCiAgc3RUZXN0KCJzd2FwTGluZSIsICIxXG4yXG4zLS0tXG40XG41IiwKICAgICAgICAgInN3YXBMaW5lRG93biIsIHZhbCgiMlxuMVxuMy0tLVxuNFxuNSIpLAogICAgICAgICAic3dhcExpbmVVcCIsIHZhbCgiMVxuMlxuMy0tLVxuNFxuNSIpLAogICAgICAgICAic3dhcExpbmVVcCIsIHZhbCgiMVxuMlxuMy0tLVxuNFxuNSIpLAogICAgICAgICBQb3MoNCwgMSksICJzd2FwTGluZURvd24iLCB2YWwoIjFcbjJcbjMtLS1cbjRcbjUiKSwKICAgICAgICAgc2V0U2VsKDAsIDEsIDAsIDEsCiAgICAgICAgICAgICAgICAxLCAwLCAyLCAwLAogICAgICAgICAgICAgICAgMiwgMiwgMiwgMiksCiAgICAgICAgICJzd2FwTGluZURvd24iLCB2YWwoIjRcbjFcbjJcbjMtLS1cbjUiKSwKICAgICAgICAgaGFzU2VsKDEsIDEsIDEsIDEsCiAgICAgICAgICAgICAgICAyLCAwLCAzLCAwLAogICAgICAgICAgICAgICAgMywgMiwgMywgMiksCiAgICAgICAgICJzd2FwTGluZVVwIiwgdmFsKCIxXG4yXG4zLS0tXG40XG41IiksCiAgICAgICAgIGhhc1NlbCgwLCAxLCAwLCAxLAogICAgICAgICAgICAgICAgMSwgMCwgMiwgMCwKICAgICAgICAgICAgICAgIDIsIDIsIDIsIDIpKTsKCiAgc3RUZXN0KCJzd2FwTGluZUVtcHR5Qm90dG9tU2VsIiwgIjFcbjJcbjMiLAogICAgICAgICBzZXRTZWwoMCwgMSwgMSwgMCksCiAgICAgICAgICJzd2FwTGluZURvd24iLCB2YWwoIjJcbjFcbjMiKSwgaGFzU2VsKDEsIDEsIDIsIDApLAogICAgICAgICAic3dhcExpbmVVcCIsIHZhbCgiMVxuMlxuMyIpLCBoYXNTZWwoMCwgMSwgMSwgMCksCiAgICAgICAgICJzd2FwTGluZVVwIiwgdmFsKCIxXG4yXG4zIiksIGhhc1NlbCgwLCAwLCAwLCAwKSk7CgogIHN0VGVzdCgic3dhcExpbmVVcEZyb21FbmQiLCAiYVxuYlxuYyIsCiAgICAgICAgIFBvcygyLCAxKSwgInN3YXBMaW5lVXAiLAogICAgICAgICBoYXNTZWwoMSwgMSwgMSwgMSksIHZhbCgiYVxuY1xuYiIpKTsKCiAgc3RUZXN0KCJqb2luTGluZXMiLCAiYWJjXG5kZWZcbmdoaVxuamtsIiwKICAgICAgICAgImpvaW5MaW5lcyIsIHZhbCgiYWJjIGRlZlxuZ2hpXG5qa2wiKSwgYXQoMCwgNCksCiAgICAgICAgICJ1bmRvIiwKICAgICAgICAgc2V0U2VsKDAsIDIsIDEsIDEpLCAiam9pbkxpbmVzIiwKICAgICAgICAgdmFsKCJhYmMgZGVmIGdoaVxuamtsIiksIGhhc1NlbCgwLCAyLCAwLCA4KSwKICAgICAgICAgInVuZG8iLAogICAgICAgICBzZXRTZWwoMCwgMSwgMCwgMSwKICAgICAgICAgICAgICAgIDEsIDEsIDEsIDEsCiAgICAgICAgICAgICAgICAzLCAxLCAzLCAxKSwgImpvaW5MaW5lcyIsCiAgICAgICAgIHZhbCgiYWJjIGRlZiBnaGlcbmprbCIpLCBoYXNTZWwoMCwgNCwgMCwgNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCA4LCAwLCA4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIDMsIDEsIDMpKTsKCiAgc3RUZXN0KCJkdXBsaWNhdGVMaW5lIiwgImFiY1xuZGVmXG5naGkiLAogICAgICAgICBQb3MoMSwgMCksICJkdXBsaWNhdGVMaW5lIiwgdmFsKCJhYmNcbmRlZlxuZGVmXG5naGkiKSwgYXQoMiwgMCksCiAgICAgICAgICJ1bmRvIiwKICAgICAgICAgc2V0U2VsKDAsIDEsIDAsIDEsCiAgICAgICAgICAgICAgICAxLCAxLCAxLCAxLAogICAgICAgICAgICAgICAgMiwgMSwgMiwgMSksICJkdXBsaWNhdGVMaW5lIiwKICAgICAgICAgdmFsKCJhYmNcbmFiY1xuZGVmXG5kZWZcbmdoaVxuZ2hpIiksIGhhc1NlbCgxLCAxLCAxLCAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMsIDEsIDMsIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNSwgMSwgNSwgMSkpOwogIHN0VGVzdCgiZHVwbGljYXRlTGluZVNlbGVjdGlvbiIsICJhYmNkZWYiLAogICAgICAgICBzZXRTZWwoMCwgMSwgMCwgMSwKICAgICAgICAgICAgICAgIDAsIDIsIDAsIDQsCiAgICAgICAgICAgICAgICAwLCA1LCAwLCA1KSwKICAgICAgICAgImR1cGxpY2F0ZUxpbmUiLAogICAgICAgICB2YWwoImFiY2RlZlxuYWJjZGNkZWZcbmFiY2RjZGVmIiksIGhhc1NlbCgyLCAxLCAyLCAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLCA0LCAyLCA2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLCA3LCAyLCA3KSk7CgogIHN0VGVzdCgic2VsZWN0TGluZXNVcHdhcmQiLCAiMTIzXG4zNDVcbjc4OVxuMDEyIiwKICAgICAgICAgc2V0U2VsKDAsIDEsIDAsIDEsCiAgICAgICAgICAgICAgICAxLCAxLCAxLCAzLAogICAgICAgICAgICAgICAgMiwgMCwgMiwgMCwKICAgICAgICAgICAgICAgIDMsIDAsIDMsIDApLAogICAgICAgICAic2VsZWN0TGluZXNVcHdhcmQiLAogICAgICAgICBoYXNTZWwoMCwgMSwgMCwgMSwKICAgICAgICAgICAgICAgIDAsIDMsIDAsIDMsCiAgICAgICAgICAgICAgICAxLCAwLCAxLCAwLAogICAgICAgICAgICAgICAgMSwgMSwgMSwgMywKICAgICAgICAgICAgICAgIDIsIDAsIDIsIDAsCiAgICAgICAgICAgICAgICAzLCAwLCAzLCAwKSk7CgogIHN0VGVzdCgic2VsZWN0TGluZXNEb3dud2FyZCIsICIxMjNcbjM0NVxuNzg5XG4wMTIiLAogICAgICAgICBzZXRTZWwoMCwgMSwgMCwgMSwKICAgICAgICAgICAgICAgIDEsIDEsIDEsIDMsCiAgICAgICAgICAgICAgICAyLCAwLCAyLCAwLAogICAgICAgICAgICAgICAgMywgMCwgMywgMCksCiAgICAgICAgICJzZWxlY3RMaW5lc0Rvd253YXJkIiwKICAgICAgICAgaGFzU2VsKDAsIDEsIDAsIDEsCiAgICAgICAgICAgICAgICAxLCAxLCAxLCAzLAogICAgICAgICAgICAgICAgMiwgMCwgMiwgMCwKICAgICAgICAgICAgICAgIDIsIDMsIDIsIDMsCiAgICAgICAgICAgICAgICAzLCAwLCAzLCAwKSk7CgogIHN0VGVzdCgic29ydExpbmVzIiwgImNcbmJcbmFcbkNcbkJcbkEiLAogICAgICAgICAic29ydExpbmVzIiwgdmFsKCJBXG5CXG5DXG5hXG5iXG5jIiksCiAgICAgICAgICJ1bmRvIiwKICAgICAgICAgc2V0U2VsKDAsIDAsIDIsIDAsCiAgICAgICAgICAgICAgICAzLCAwLCA1LCAwKSwKICAgICAgICAgInNvcnRMaW5lcyIsIHZhbCgiYVxuYlxuY1xuQVxuQlxuQyIpLAogICAgICAgICBoYXNTZWwoMCwgMCwgMiwgMSwKICAgICAgICAgICAgICAgIDMsIDAsIDUsIDEpLAogICAgICAgICAidW5kbyIsCiAgICAgICAgIHNldFNlbCgxLCAwLCA0LCAwKSwgInNvcnRMaW5lc0luc2Vuc2l0aXZlIiwgdmFsKCJjXG5hXG5CXG5iXG5DXG5BIikpOwoKICBzdFRlc3QoImJvb2ttYXJrcyIsICJhYmNcbmRlZlxuZ2hpXG5qa2wiLAogICAgICAgICBQb3MoMCwgMSksICJ0b2dnbGVCb29rbWFyayIsCiAgICAgICAgIHNldFNlbCgxLCAxLCAxLCAyKSwgInRvZ2dsZUJvb2ttYXJrIiwKICAgICAgICAgc2V0U2VsKDIsIDEsIDIsIDIpLCAidG9nZ2xlQm9va21hcmsiLAogICAgICAgICAibmV4dEJvb2ttYXJrIiwgaGFzU2VsKDAsIDEsIDAsIDEpLAogICAgICAgICAibmV4dEJvb2ttYXJrIiwgaGFzU2VsKDEsIDEsIDEsIDIpLAogICAgICAgICAibmV4dEJvb2ttYXJrIiwgaGFzU2VsKDIsIDEsIDIsIDIpLAogICAgICAgICAicHJldkJvb2ttYXJrIiwgaGFzU2VsKDEsIDEsIDEsIDIpLAogICAgICAgICAicHJldkJvb2ttYXJrIiwgaGFzU2VsKDAsIDEsIDAsIDEpLAogICAgICAgICAicHJldkJvb2ttYXJrIiwgaGFzU2VsKDIsIDEsIDIsIDIpLAogICAgICAgICAicHJldkJvb2ttYXJrIiwgaGFzU2VsKDEsIDEsIDEsIDIpLAogICAgICAgICAidG9nZ2xlQm9va21hcmsiLAogICAgICAgICAicHJldkJvb2ttYXJrIiwgaGFzU2VsKDIsIDEsIDIsIDIpLAogICAgICAgICAicHJldkJvb2ttYXJrIiwgaGFzU2VsKDAsIDEsIDAsIDEpLAogICAgICAgICAic2VsZWN0Qm9va21hcmtzIiwgaGFzU2VsKDAsIDEsIDAsIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwgMSwgMiwgMiksCiAgICAgICAgICJjbGVhckJvb2ttYXJrcyIsCiAgICAgICAgIFBvcygwLCAwKSwgInNlbGVjdEJvb2ttYXJrcyIsIGF0KDAsIDApKTsKCiAgc3RUZXN0KCJ1cEFuZERvd25jYXNlQXRDdXJzb3IiLCAiYWJjXG5kZWYgIHhcbmdoSSIsCiAgICAgICAgIHNldFNlbCgwLCAxLCAwLCAzLAogICAgICAgICAgICAgICAgMSwgMSwgMSwgMSwKICAgICAgICAgICAgICAgIDEsIDQsIDEsIDQpLCAidXBjYXNlQXRDdXJzb3IiLAogICAgICAgICB2YWwoImFCQ1xuREVGICB4XG5naEkiKSwgaGFzU2VsKDAsIDEsIDAsIDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgMywgMSwgMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCA0LCAxLCA0KSwKICAgICAgICAgImRvd25jYXNlQXRDdXJzb3IiLAogICAgICAgICB2YWwoImFiY1xuZGVmICB4XG5naEkiKSwgaGFzU2VsKDAsIDEsIDAsIDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgMywgMSwgMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCA0LCAxLCA0KSk7CgogIHN0VGVzdCgibWFyayIsICJhYmNcbmRlZlxuZ2hpIiwKICAgICAgICAgUG9zKDEsIDEpLCAic2V0U3VibGltZU1hcmsiLAogICAgICAgICBQb3MoMiwgMSksICJzZWxlY3RUb1N1YmxpbWVNYXJrIiwgaGFzU2VsKDIsIDEsIDEsIDEpLAogICAgICAgICBQb3MoMCwgMSksICJzd2FwV2l0aFN1YmxpbWVNYXJrIiwgYXQoMSwgMSksICJzd2FwV2l0aFN1YmxpbWVNYXJrIiwgYXQoMCwgMSksCiAgICAgICAgICJkZWxldGVUb1N1YmxpbWVNYXJrIiwgdmFsKCJhZWZcbmdoaSIpLAogICAgICAgICAic3VibGltZVlhbmsiLCB2YWwoImFiY1xuZGVmXG5naGkiKSwgYXQoMSwgMSkpOwoKICBzdFRlc3QoImZpbmRVbmRlciIsICJmb28gZm9vYmFyICBhIiwKICAgICAgICAgImZpbmRVbmRlciIsIGhhc1NlbCgwLCA0LCAwLCA3KSwKICAgICAgICAgImZpbmRVbmRlciIsIGhhc1NlbCgwLCAwLCAwLCAzKSwKICAgICAgICAgImZpbmRVbmRlclByZXZpb3VzIiwgaGFzU2VsKDAsIDQsIDAsIDcpLAogICAgICAgICAiZmluZFVuZGVyUHJldmlvdXMiLCBoYXNTZWwoMCwgMCwgMCwgMyksCiAgICAgICAgIFBvcygwLCA0KSwgImZpbmRVbmRlciIsIGhhc1NlbCgwLCA0LCAwLCAxMCksCiAgICAgICAgIFBvcygwLCAxMSksICJmaW5kVW5kZXIiLCBoYXNTZWwoMCwgMTEsIDAsIDExKSk7Cn0pKCk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/test/test.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dmFyIFBvcyA9IENvZGVNaXJyb3IuUG9zOwoKQ29kZU1pcnJvci5kZWZhdWx0cy5ydGxNb3ZlVmlzdWFsbHkgPSB0cnVlOwoKZnVuY3Rpb24gZm9yRWFjaChhcnIsIGYpIHsKICBmb3IgKHZhciBpID0gMCwgZSA9IGFyci5sZW5ndGg7IGkgPCBlOyArK2kpIGYoYXJyW2ldKTsKfQoKZnVuY3Rpb24gYWRkRG9jKGNtLCB3aWR0aCwgaGVpZ2h0KSB7CiAgdmFyIGNvbnRlbnQgPSBbXSwgbGluZSA9ICIiOwogIGZvciAodmFyIGkgPSAwOyBpIDwgd2lkdGg7ICsraSkgbGluZSArPSAieCI7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBoZWlnaHQ7ICsraSkgY29udGVudC5wdXNoKGxpbmUpOwogIGNtLnNldFZhbHVlKGNvbnRlbnQuam9pbigiXG4iKSk7Cn0KCmZ1bmN0aW9uIGJ5Q2xhc3NOYW1lKGVsdCwgY2xzKSB7CiAgaWYgKGVsdC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKSByZXR1cm4gZWx0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoY2xzKTsKICB2YXIgZm91bmQgPSBbXSwgcmUgPSBuZXcgUmVnRXhwKCJcXGIiICsgY2xzICsgIlxcYiIpOwogIGZ1bmN0aW9uIHNlYXJjaChlbHQpIHsKICAgIGlmIChlbHQubm9kZVR5cGUgPT0gMykgcmV0dXJuOwogICAgaWYgKHJlLnRlc3QoZWx0LmNsYXNzTmFtZSkpIGZvdW5kLnB1c2goZWx0KTsKICAgIGZvciAodmFyIGkgPSAwLCBlID0gZWx0LmNoaWxkTm9kZXMubGVuZ3RoOyBpIDwgZTsgKytpKQogICAgICBzZWFyY2goZWx0LmNoaWxkTm9kZXNbaV0pOwogIH0KICBzZWFyY2goZWx0KTsKICByZXR1cm4gZm91bmQ7Cn0KCnZhciBpZV9sdDggPSAvTVNJRSBbMS03XVxiLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpOwp2YXIgaWVfbHQ5ID0gL01TSUUgWzEtOF1cYi8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTsKdmFyIG1hYyA9IC9NYWMvLnRlc3QobmF2aWdhdG9yLnBsYXRmb3JtKTsKdmFyIHBoYW50b20gPSAvUGhhbnRvbUpTLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpOwp2YXIgb3BlcmEgPSAvT3BlcmFcL1wuLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpOwp2YXIgb3BlcmFfdmVyc2lvbiA9IG9wZXJhICYmIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1ZlcnNpb25cLyhcZCtcLlxkKykvKTsKaWYgKG9wZXJhX3ZlcnNpb24pIG9wZXJhX3ZlcnNpb24gPSBOdW1iZXIob3BlcmFfdmVyc2lvbik7CnZhciBvcGVyYV9sdDEwID0gb3BlcmEgJiYgKCFvcGVyYV92ZXJzaW9uIHx8IG9wZXJhX3ZlcnNpb24gPCAxMCk7CgpuYW1lc3BhY2UgPSAiY29yZV8iOwoKdGVzdCgiY29yZV9mcm9tVGV4dEFyZWEiLCBmdW5jdGlvbigpIHsKICB2YXIgdGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpOwogIHRlLnZhbHVlID0gIkNPTlRFTlQiOwogIHZhciBjbSA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKHRlKTsKICBpcyghdGUub2Zmc2V0SGVpZ2h0KTsKICBlcShjbS5nZXRWYWx1ZSgpLCAiQ09OVEVOVCIpOwogIGNtLnNldFZhbHVlKCJmb29cbmJhciIpOwogIGVxKGNtLmdldFZhbHVlKCksICJmb29cbmJhciIpOwogIGNtLnNhdmUoKTsKICBpcygvXmZvb1xyP1xuYmFyJC8udGVzdCh0ZS52YWx1ZSkpOwogIGNtLnNldFZhbHVlKCJ4eHgiKTsKICBjbS50b1RleHRBcmVhKCk7CiAgaXModGUub2Zmc2V0SGVpZ2h0KTsKICBlcSh0ZS52YWx1ZSwgInh4eCIpOwp9KTsKCnRlc3RDTSgiZ2V0UmFuZ2UiLCBmdW5jdGlvbihjbSkgewogIGVxKGNtLmdldExpbmUoMCksICIxMjM0Iik7CiAgZXEoY20uZ2V0TGluZSgxKSwgIjU2NzgiKTsKICBlcShjbS5nZXRMaW5lKDIpLCBudWxsKTsKICBlcShjbS5nZXRMaW5lKC0xKSwgbnVsbCk7CiAgZXEoY20uZ2V0UmFuZ2UoUG9zKDAsIDApLCBQb3MoMCwgMykpLCAiMTIzIik7CiAgZXEoY20uZ2V0UmFuZ2UoUG9zKDAsIC0xKSwgUG9zKDAsIDIwMCkpLCAiMTIzNCIpOwogIGVxKGNtLmdldFJhbmdlKFBvcygwLCAyKSwgUG9zKDEsIDIpKSwgIjM0XG41NiIpOwogIGVxKGNtLmdldFJhbmdlKFBvcygxLCAyKSwgUG9zKDEwMCwgMCkpLCAiNzgiKTsKfSwge3ZhbHVlOiAiMTIzNFxuNTY3OCJ9KTsKCnRlc3RDTSgicmVwbGFjZVJhbmdlIiwgZnVuY3Rpb24oY20pIHsKICBlcShjbS5nZXRWYWx1ZSgpLCAiIik7CiAgY20ucmVwbGFjZVJhbmdlKCJmb29cbiIsIFBvcygwLCAwKSk7CiAgZXEoY20uZ2V0VmFsdWUoKSwgImZvb1xuIik7CiAgY20ucmVwbGFjZVJhbmdlKCJhXG5iIiwgUG9zKDAsIDEpKTsKICBlcShjbS5nZXRWYWx1ZSgpLCAiZmFcbmJvb1xuIik7CiAgZXEoY20ubGluZUNvdW50KCksIDMpOwogIGNtLnJlcGxhY2VSYW5nZSgieHl6enkiLCBQb3MoMCwgMCksIFBvcygxLCAxKSk7CiAgZXEoY20uZ2V0VmFsdWUoKSwgInh5enp5b29cbiIpOwogIGNtLnJlcGxhY2VSYW5nZSgiYWJjIiwgUG9zKDAsIDApLCBQb3MoMTAsIDApKTsKICBlcShjbS5nZXRWYWx1ZSgpLCAiYWJjIik7CiAgZXEoY20ubGluZUNvdW50KCksIDEpOwp9KTsKCnRlc3RDTSgic2VsZWN0aW9uIiwgZnVuY3Rpb24oY20pIHsKICBjbS5zZXRTZWxlY3Rpb24oUG9zKDAsIDQpLCBQb3MoMiwgMikpOwogIGlzKGNtLnNvbWV0aGluZ1NlbGVjdGVkKCkpOwogIGVxKGNtLmdldFNlbGVjdGlvbigpLCAiMTFcbjIyMjIyMlxuMzMiKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoZmFsc2UpLCBQb3MoMiwgMikpOwogIGVxUG9zKGNtLmdldEN1cnNvcih0cnVlKSwgUG9zKDAsIDQpKTsKICBjbS5zZXRTZWxlY3Rpb24oUG9zKDEsIDApKTsKICBpcyghY20uc29tZXRoaW5nU2VsZWN0ZWQoKSk7CiAgZXEoY20uZ2V0U2VsZWN0aW9uKCksICIiKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IodHJ1ZSksIFBvcygxLCAwKSk7CiAgY20ucmVwbGFjZVNlbGVjdGlvbigiYWJjIiwgImFyb3VuZCIpOwogIGVxKGNtLmdldFNlbGVjdGlvbigpLCAiYWJjIik7CiAgZXEoY20uZ2V0VmFsdWUoKSwgIjExMTExMVxuYWJjMjIyMjIyXG4zMzMzMzMiKTsKICBjbS5yZXBsYWNlU2VsZWN0aW9uKCJkZWYiLCAiZW5kIik7CiAgZXEoY20uZ2V0U2VsZWN0aW9uKCksICIiKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IodHJ1ZSksIFBvcygxLCAzKSk7CiAgY20uc2V0Q3Vyc29yKFBvcygyLCAxKSk7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKHRydWUpLCBQb3MoMiwgMSkpOwogIGNtLnNldEN1cnNvcigxLCAyKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IodHJ1ZSksIFBvcygxLCAyKSk7Cn0sIHt2YWx1ZTogIjExMTExMVxuMjIyMjIyXG4zMzMzMzMifSk7Cgp0ZXN0Q00oImV4dGVuZFNlbGVjdGlvbiIsIGZ1bmN0aW9uKGNtKSB7CiAgY20uc2V0RXh0ZW5kaW5nKHRydWUpOwogIGFkZERvYyhjbSwgMTAsIDEwKTsKICBjbS5zZXRTZWxlY3Rpb24oUG9zKDMsIDUpKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoImhlYWQiKSwgUG9zKDMsIDUpKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoImFuY2hvciIpLCBQb3MoMywgNSkpOwogIGNtLnNldFNlbGVjdGlvbihQb3MoMiwgNSksIFBvcyg1LCA1KSk7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCJoZWFkIiksIFBvcyg1LCA1KSk7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCJhbmNob3IiKSwgUG9zKDIsIDUpKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoInN0YXJ0IiksIFBvcygyLCA1KSk7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCJlbmQiKSwgUG9zKDUsIDUpKTsKICBjbS5zZXRTZWxlY3Rpb24oUG9zKDUsIDUpLCBQb3MoMiwgNSkpOwogIGVxUG9zKGNtLmdldEN1cnNvcigiaGVhZCIpLCBQb3MoMiwgNSkpOwogIGVxUG9zKGNtLmdldEN1cnNvcigiYW5jaG9yIiksIFBvcyg1LCA1KSk7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCJzdGFydCIpLCBQb3MoMiwgNSkpOwogIGVxUG9zKGNtLmdldEN1cnNvcigiZW5kIiksIFBvcyg1LCA1KSk7CiAgY20uZXh0ZW5kU2VsZWN0aW9uKFBvcygzLCAyKSk7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCJoZWFkIiksIFBvcygzLCAyKSk7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCJhbmNob3IiKSwgUG9zKDUsIDUpKTsKICBjbS5leHRlbmRTZWxlY3Rpb24oUG9zKDYsIDIpKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoImhlYWQiKSwgUG9zKDYsIDIpKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoImFuY2hvciIpLCBQb3MoNSwgNSkpOwogIGNtLmV4dGVuZFNlbGVjdGlvbihQb3MoNiwgMyksIFBvcyg2LCA0KSk7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCJoZWFkIiksIFBvcyg2LCA0KSk7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCJhbmNob3IiKSwgUG9zKDUsIDUpKTsKICBjbS5leHRlbmRTZWxlY3Rpb24oUG9zKDAsIDMpLCBQb3MoMCwgNCkpOwogIGVxUG9zKGNtLmdldEN1cnNvcigiaGVhZCIpLCBQb3MoMCwgMykpOwogIGVxUG9zKGNtLmdldEN1cnNvcigiYW5jaG9yIiksIFBvcyg1LCA1KSk7CiAgY20uZXh0ZW5kU2VsZWN0aW9uKFBvcyg0LCA1KSwgUG9zKDYsIDUpKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoImhlYWQiKSwgUG9zKDYsIDUpKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoImFuY2hvciIpLCBQb3MoNCwgNSkpOwogIGNtLnNldEV4dGVuZGluZyhmYWxzZSk7CiAgY20uZXh0ZW5kU2VsZWN0aW9uKFBvcygwLCAzKSwgUG9zKDAsIDQpKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoImhlYWQiKSwgUG9zKDAsIDMpKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoImFuY2hvciIpLCBQb3MoMCwgNCkpOwp9KTsKCnRlc3RDTSgibGluZXMiLCBmdW5jdGlvbihjbSkgewogIGVxKGNtLmdldExpbmUoMCksICIxMTExMTEiKTsKICBlcShjbS5nZXRMaW5lKDEpLCAiMjIyMjIyIik7CiAgZXEoY20uZ2V0TGluZSgtMSksIG51bGwpOwogIGNtLnJlcGxhY2VSYW5nZSgiIiwgUG9zKDEsIDApLCBQb3MoMiwgMCkpCiAgY20ucmVwbGFjZVJhbmdlKCJhYmMiLCBQb3MoMSwgMCksIFBvcygxKSk7CiAgZXEoY20uZ2V0VmFsdWUoKSwgIjExMTExMVxuYWJjIik7Cn0sIHt2YWx1ZTogIjExMTExMVxuMjIyMjIyXG4zMzMzMzMifSk7Cgp0ZXN0Q00oImluZGVudCIsIGZ1bmN0aW9uKGNtKSB7CiAgY20uaW5kZW50TGluZSgxKTsKICBlcShjbS5nZXRMaW5lKDEpLCAiICAgYmxhaCgpOyIpOwogIGNtLnNldE9wdGlvbigiaW5kZW50VW5pdCIsIDgpOwogIGNtLmluZGVudExpbmUoMSk7CiAgZXEoY20uZ2V0TGluZSgxKSwgIlx0YmxhaCgpOyIpOwogIGNtLnNldE9wdGlvbigiaW5kZW50VW5pdCIsIDEwKTsKICBjbS5zZXRPcHRpb24oInRhYlNpemUiLCA0KTsKICBjbS5pbmRlbnRMaW5lKDEpOwogIGVxKGNtLmdldExpbmUoMSksICJcdFx0ICBibGFoKCk7Iik7Cn0sIHt2YWx1ZTogImlmICh4KSB7XG5ibGFoKCk7XG59IiwgaW5kZW50VW5pdDogMywgaW5kZW50V2l0aFRhYnM6IHRydWUsIHRhYlNpemU6IDh9KTsKCnRlc3RDTSgiaW5kZW50QnlOdW1iZXIiLCBmdW5jdGlvbihjbSkgewogIGNtLmluZGVudExpbmUoMCwgMik7CiAgZXEoY20uZ2V0TGluZSgwKSwgIiAgZm9vIik7CiAgY20uaW5kZW50TGluZSgwLCAtMjAwKTsKICBlcShjbS5nZXRMaW5lKDApLCAiZm9vIik7CiAgY20uc2V0U2VsZWN0aW9uKFBvcygwLCAwKSwgUG9zKDEsIDIpKTsKICBjbS5pbmRlbnRTZWxlY3Rpb24oMyk7CiAgZXEoY20uZ2V0VmFsdWUoKSwgIiAgIGZvb1xuICAgYmFyXG5iYXoiKTsKfSwge3ZhbHVlOiAiZm9vXG5iYXJcbmJheiJ9KTsKCnRlc3QoImNvcmVfZGVmYXVsdHMiLCBmdW5jdGlvbigpIHsKICB2YXIgZGVmc0NvcHkgPSB7fSwgZGVmcyA9IENvZGVNaXJyb3IuZGVmYXVsdHM7CiAgZm9yICh2YXIgb3B0IGluIGRlZnMpIGRlZnNDb3B5W29wdF0gPSBkZWZzW29wdF07CiAgZGVmcy5pbmRlbnRVbml0ID0gNTsKICBkZWZzLnZhbHVlID0gInV1IjsKICBkZWZzLmluZGVudFdpdGhUYWJzID0gdHJ1ZTsKICBkZWZzLnRhYmluZGV4ID0gNTU7CiAgdmFyIHBsYWNlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRlc3Rncm91bmQiKSwgY20gPSBDb2RlTWlycm9yKHBsYWNlKTsKICB0cnkgewogICAgZXEoY20uZ2V0T3B0aW9uKCJpbmRlbnRVbml0IiksIDUpOwogICAgY20uc2V0T3B0aW9uKCJpbmRlbnRVbml0IiwgMTApOwogICAgZXEoZGVmcy5pbmRlbnRVbml0LCA1KTsKICAgIGVxKGNtLmdldFZhbHVlKCksICJ1dSIpOwogICAgZXEoY20uZ2V0T3B0aW9uKCJpbmRlbnRXaXRoVGFicyIpLCB0cnVlKTsKICAgIGVxKGNtLmdldElucHV0RmllbGQoKS50YWJJbmRleCwgNTUpOwogIH0KICBmaW5hbGx5IHsKICAgIGZvciAodmFyIG9wdCBpbiBkZWZzQ29weSkgZGVmc1tvcHRdID0gZGVmc0NvcHlbb3B0XTsKICAgIHBsYWNlLnJlbW92ZUNoaWxkKGNtLmdldFdyYXBwZXJFbGVtZW50KCkpOwogIH0KfSk7Cgp0ZXN0Q00oImxpbmVJbmZvIiwgZnVuY3Rpb24oY20pIHsKICBlcShjbS5saW5lSW5mbygtMSksIG51bGwpOwogIHZhciBtYXJrID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpOwogIHZhciBsaCA9IGNtLnNldEd1dHRlck1hcmtlcigxLCAiRk9PIiwgbWFyayk7CiAgdmFyIGluZm8gPSBjbS5saW5lSW5mbygxKTsKICBlcShpbmZvLnRleHQsICIyMjIyMjIiKTsKICBlcShpbmZvLmd1dHRlck1hcmtlcnMuRk9PLCBtYXJrKTsKICBlcShpbmZvLmxpbmUsIDEpOwogIGVxKGNtLmxpbmVJbmZvKDIpLmd1dHRlck1hcmtlcnMsIG51bGwpOwogIGNtLnNldEd1dHRlck1hcmtlcihsaCwgIkZPTyIsIG51bGwpOwogIGVxKGNtLmxpbmVJbmZvKDEpLmd1dHRlck1hcmtlcnMsIG51bGwpOwogIGNtLnNldEd1dHRlck1hcmtlcigxLCAiRk9PIiwgbWFyayk7CiAgY20uc2V0R3V0dGVyTWFya2VyKDAsICJGT08iLCBtYXJrKTsKICBjbS5jbGVhckd1dHRlcigiRk9PIik7CiAgZXEoY20ubGluZUluZm8oMCkuZ3V0dGVyTWFya2VycywgbnVsbCk7CiAgZXEoY20ubGluZUluZm8oMSkuZ3V0dGVyTWFya2VycywgbnVsbCk7Cn0sIHt2YWx1ZTogIjExMTExMVxuMjIyMjIyXG4zMzMzMzMifSk7Cgp0ZXN0Q00oImNvb3JkcyIsIGZ1bmN0aW9uKGNtKSB7CiAgY20uc2V0U2l6ZShudWxsLCAxMDApOwogIGFkZERvYyhjbSwgMzIsIDIwMCk7CiAgdmFyIHRvcCA9IGNtLmNoYXJDb29yZHMoUG9zKDAsIDApKTsKICB2YXIgYm90ID0gY20uY2hhckNvb3JkcyhQb3MoMjAwLCAzMCkpOwogIGlzKHRvcC5sZWZ0IDwgYm90LmxlZnQpOwogIGlzKHRvcC50b3AgPCBib3QudG9wKTsKICBpcyh0b3AudG9wIDwgdG9wLmJvdHRvbSk7CiAgY20uc2Nyb2xsVG8obnVsbCwgMTAwKTsKICB2YXIgdG9wMiA9IGNtLmNoYXJDb29yZHMoUG9zKDAsIDApKTsKICBpcyh0b3AudG9wID4gdG9wMi50b3ApOwogIGVxKHRvcC5sZWZ0LCB0b3AyLmxlZnQpOwp9KTsKCnRlc3RDTSgiY29vcmRzQ2hhciIsIGZ1bmN0aW9uKGNtKSB7CiAgYWRkRG9jKGNtLCAzNSwgNzApOwogIGZvciAodmFyIGkgPSAwOyBpIDwgMjsgKytpKSB7CiAgICB2YXIgc3lzID0gaSA/ICJsb2NhbCIgOiAicGFnZSI7CiAgICBmb3IgKHZhciBjaCA9IDA7IGNoIDw9IDM1OyBjaCArPSA1KSB7CiAgICAgIGZvciAodmFyIGxpbmUgPSAwOyBsaW5lIDwgNzA7IGxpbmUgKz0gNSkgewogICAgICAgIGNtLnNldEN1cnNvcihsaW5lLCBjaCk7CiAgICAgICAgdmFyIGNvb3JkcyA9IGNtLmNoYXJDb29yZHMoUG9zKGxpbmUsIGNoKSwgc3lzKTsKICAgICAgICB2YXIgcG9zID0gY20uY29vcmRzQ2hhcih7bGVmdDogY29vcmRzLmxlZnQgKyAxLCB0b3A6IGNvb3Jkcy50b3AgKyAxfSwgc3lzKTsKICAgICAgICBlcVBvcyhwb3MsIFBvcyhsaW5lLCBjaCkpOwogICAgICB9CiAgICB9CiAgfQp9LCB7bGluZU51bWJlcnM6IHRydWV9KTsKCnRlc3RDTSgicG9zRnJvbUluZGV4IiwgZnVuY3Rpb24oY20pIHsKICBjbS5zZXRWYWx1ZSgKICAgICJUaGlzIGZ1bmN0aW9uIHNob3VsZFxuIiArCiAgICAiY29udmVydCBhIHplcm8gYmFzZWQgaW5kZXhcbiIgKwogICAgInRvIGxpbmUgYW5kIGNoLiIKICApOwoKICB2YXIgZXhhbXBsZXMgPSBbCiAgICB7IGluZGV4OiAtMSwgbGluZTogMCwgY2g6IDAgIH0sIC8vIDwtIFRlc3RzIGNsaXBwaW5nCiAgICB7IGluZGV4OiAwLCAgbGluZTogMCwgY2g6IDAgIH0sCiAgICB7IGluZGV4OiAxMCwgbGluZTogMCwgY2g6IDEwIH0sCiAgICB7IGluZGV4OiAzOSwgbGluZTogMSwgY2g6IDE4IH0sCiAgICB7IGluZGV4OiA1NSwgbGluZTogMiwgY2g6IDcgIH0sCiAgICB7IGluZGV4OiA2MywgbGluZTogMiwgY2g6IDE1IH0sCiAgICB7IGluZGV4OiA2NCwgbGluZTogMiwgY2g6IDE1IH0gIC8vIDwtIFRlc3RzIGNsaXBwaW5nCiAgXTsKCiAgZm9yICh2YXIgaSA9IDA7IGkgPCBleGFtcGxlcy5sZW5ndGg7IGkrKykgewogICAgdmFyIGV4YW1wbGUgPSBleGFtcGxlc1tpXTsKICAgIHZhciBwb3MgPSBjbS5wb3NGcm9tSW5kZXgoZXhhbXBsZS5pbmRleCk7CiAgICBlcShwb3MubGluZSwgZXhhbXBsZS5saW5lKTsKICAgIGVxKHBvcy5jaCwgZXhhbXBsZS5jaCk7CiAgICBpZiAoZXhhbXBsZS5pbmRleCA+PSAwICYmIGV4YW1wbGUuaW5kZXggPCA2NCkKICAgICAgZXEoY20uaW5kZXhGcm9tUG9zKHBvcyksIGV4YW1wbGUuaW5kZXgpOwogIH0KfSk7Cgp0ZXN0Q00oInVuZG8iLCBmdW5jdGlvbihjbSkgewogIGNtLnJlcGxhY2VSYW5nZSgiZGVmIiwgUG9zKDAsIDApLCBQb3MoMCkpOwogIGVxKGNtLmhpc3RvcnlTaXplKCkudW5kbywgMSk7CiAgY20udW5kbygpOwogIGVxKGNtLmdldFZhbHVlKCksICJhYmMiKTsKICBlcShjbS5oaXN0b3J5U2l6ZSgpLnVuZG8sIDApOwogIGVxKGNtLmhpc3RvcnlTaXplKCkucmVkbywgMSk7CiAgY20ucmVkbygpOwogIGVxKGNtLmdldFZhbHVlKCksICJkZWYiKTsKICBlcShjbS5oaXN0b3J5U2l6ZSgpLnVuZG8sIDEpOwogIGVxKGNtLmhpc3RvcnlTaXplKCkucmVkbywgMCk7CiAgY20uc2V0VmFsdWUoIjFcblxuXG4yIik7CiAgY20uY2xlYXJIaXN0b3J5KCk7CiAgZXEoY20uaGlzdG9yeVNpemUoKS51bmRvLCAwKTsKICBmb3IgKHZhciBpID0gMDsgaSA8IDIwOyArK2kpIHsKICAgIGNtLnJlcGxhY2VSYW5nZSgiYSIsIFBvcygwLCAwKSk7CiAgICBjbS5yZXBsYWNlUmFuZ2UoImIiLCBQb3MoMywgMCkpOwogIH0KICBlcShjbS5oaXN0b3J5U2l6ZSgpLnVuZG8sIDQwKTsKICBmb3IgKHZhciBpID0gMDsgaSA8IDQwOyArK2kpCiAgICBjbS51bmRvKCk7CiAgZXEoY20uaGlzdG9yeVNpemUoKS5yZWRvLCA0MCk7CiAgZXEoY20uZ2V0VmFsdWUoKSwgIjFcblxuXG4yIik7Cn0sIHt2YWx1ZTogImFiYyJ9KTsKCnRlc3RDTSgidW5kb0RlcHRoIiwgZnVuY3Rpb24oY20pIHsKICBjbS5yZXBsYWNlUmFuZ2UoImQiLCBQb3MoMCkpOwogIGNtLnJlcGxhY2VSYW5nZSgiZSIsIFBvcygwKSk7CiAgY20ucmVwbGFjZVJhbmdlKCJmIiwgUG9zKDApKTsKICBjbS51bmRvKCk7IGNtLnVuZG8oKTsgY20udW5kbygpOwogIGVxKGNtLmdldFZhbHVlKCksICJhYmNkIik7Cn0sIHt2YWx1ZTogImFiYyIsIHVuZG9EZXB0aDogNH0pOwoKdGVzdENNKCJ1bmRvRG9lc250Q2xlYXJWYWx1ZSIsIGZ1bmN0aW9uKGNtKSB7CiAgY20udW5kbygpOwogIGVxKGNtLmdldFZhbHVlKCksICJ4Iik7Cn0sIHt2YWx1ZTogIngifSk7Cgp0ZXN0Q00oInVuZG9NdWx0aUxpbmUiLCBmdW5jdGlvbihjbSkgewogIGNtLm9wZXJhdGlvbihmdW5jdGlvbigpIHsKICAgIGNtLnJlcGxhY2VSYW5nZSgieCIsIFBvcygwLCAwKSk7CiAgICBjbS5yZXBsYWNlUmFuZ2UoInkiLCBQb3MoMSwgMCkpOwogIH0pOwogIGNtLnVuZG8oKTsKICBlcShjbS5nZXRWYWx1ZSgpLCAiYWJjXG5kZWZcbmdoaSIpOwogIGNtLm9wZXJhdGlvbihmdW5jdGlvbigpIHsKICAgIGNtLnJlcGxhY2VSYW5nZSgieSIsIFBvcygxLCAwKSk7CiAgICBjbS5yZXBsYWNlUmFuZ2UoIngiLCBQb3MoMCwgMCkpOwogIH0pOwogIGNtLnVuZG8oKTsKICBlcShjbS5nZXRWYWx1ZSgpLCAiYWJjXG5kZWZcbmdoaSIpOwogIGNtLm9wZXJhdGlvbihmdW5jdGlvbigpIHsKICAgIGNtLnJlcGxhY2VSYW5nZSgieSIsIFBvcygyLCAwKSk7CiAgICBjbS5yZXBsYWNlUmFuZ2UoIngiLCBQb3MoMSwgMCkpOwogICAgY20ucmVwbGFjZVJhbmdlKCJ6IiwgUG9zKDIsIDApKTsKICB9KTsKICBjbS51bmRvKCk7CiAgZXEoY20uZ2V0VmFsdWUoKSwgImFiY1xuZGVmXG5naGkiLCAzKTsKfSwge3ZhbHVlOiAiYWJjXG5kZWZcbmdoaSJ9KTsKCnRlc3RDTSgidW5kb0NvbXBvc2l0ZSIsIGZ1bmN0aW9uKGNtKSB7CiAgY20ucmVwbGFjZVJhbmdlKCJ5IiwgUG9zKDEpKTsKICBjbS5vcGVyYXRpb24oZnVuY3Rpb24oKSB7CiAgICBjbS5yZXBsYWNlUmFuZ2UoIngiLCBQb3MoMCkpOwogICAgY20ucmVwbGFjZVJhbmdlKCJ6IiwgUG9zKDIpKTsKICB9KTsKICBlcShjbS5nZXRWYWx1ZSgpLCAiYXhcbmJ5XG5jelxuIik7CiAgY20udW5kbygpOwogIGVxKGNtLmdldFZhbHVlKCksICJhXG5ieVxuY1xuIik7CiAgY20udW5kbygpOwogIGVxKGNtLmdldFZhbHVlKCksICJhXG5iXG5jXG4iKTsKICBjbS5yZWRvKCk7IGNtLnJlZG8oKTsKICBlcShjbS5nZXRWYWx1ZSgpLCAiYXhcbmJ5XG5jelxuIik7Cn0sIHt2YWx1ZTogImFcbmJcbmNcbiJ9KTsKCnRlc3RDTSgidW5kb1NlbGVjdGlvbiIsIGZ1bmN0aW9uKGNtKSB7CiAgY20uc2V0U2VsZWN0aW9uKFBvcygwLCAyKSwgUG9zKDAsIDQpKTsKICBjbS5yZXBsYWNlU2VsZWN0aW9uKCIiKTsKICBjbS5zZXRDdXJzb3IoUG9zKDEsIDApKTsKICBjbS51bmRvKCk7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKHRydWUpLCBQb3MoMCwgMikpOwogIGVxUG9zKGNtLmdldEN1cnNvcihmYWxzZSksIFBvcygwLCA0KSk7CiAgY20uc2V0Q3Vyc29yKFBvcygxLCAwKSk7CiAgY20ucmVkbygpOwogIGVxUG9zKGNtLmdldEN1cnNvcih0cnVlKSwgUG9zKDAsIDIpKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoZmFsc2UpLCBQb3MoMCwgMikpOwp9LCB7dmFsdWU6ICJhYmNkZWZnaFxuIn0pOwoKdGVzdENNKCJ1bmRvU2VsZWN0aW9uQXNCZWZvcmUiLCBmdW5jdGlvbihjbSkgewogIGNtLnJlcGxhY2VTZWxlY3Rpb24oImFiYyIsICJhcm91bmQiKTsKICBjbS51bmRvKCk7CiAgY20ucmVkbygpOwogIGVxKGNtLmdldFNlbGVjdGlvbigpLCAiYWJjIik7Cn0pOwoKdGVzdENNKCJtYXJrVGV4dFNpbmdsZUxpbmUiLCBmdW5jdGlvbihjbSkgewogIGZvckVhY2goW3thOiAwLCBiOiAxLCBjOiAiIiwgZjogMiwgdDogNX0sCiAgICAgICAgICAge2E6IDAsIGI6IDQsIGM6ICIiLCBmOiAwLCB0OiAyfSwKICAgICAgICAgICB7YTogMSwgYjogMiwgYzogIngiLCBmOiAzLCB0OiA2fSwKICAgICAgICAgICB7YTogNCwgYjogNSwgYzogIiIsIGY6IDMsIHQ6IDV9LAogICAgICAgICAgIHthOiA0LCBiOiA1LCBjOiAieHgiLCBmOiAzLCB0OiA3fSwKICAgICAgICAgICB7YTogMiwgYjogNSwgYzogIiIsIGY6IDIsIHQ6IDN9LAogICAgICAgICAgIHthOiAyLCBiOiA1LCBjOiAiYWJjZCIsIGY6IDYsIHQ6IDd9LAogICAgICAgICAgIHthOiAyLCBiOiA2LCBjOiAieCIsIGY6IG51bGwsIHQ6IG51bGx9LAogICAgICAgICAgIHthOiAzLCBiOiA2LCBjOiAiIiwgZjogbnVsbCwgdDogbnVsbH0sCiAgICAgICAgICAge2E6IDAsIGI6IDksIGM6ICJoYWxsbyIsIGY6IG51bGwsIHQ6IG51bGx9LAogICAgICAgICAgIHthOiA0LCBiOiA2LCBjOiAieCIsIGY6IDMsIHQ6IDR9LAogICAgICAgICAgIHthOiA0LCBiOiA4LCBjOiAiIiwgZjogMywgdDogNH0sCiAgICAgICAgICAge2E6IDYsIGI6IDYsIGM6ICJhIiwgZjogMywgdDogNn0sCiAgICAgICAgICAge2E6IDgsIGI6IDksIGM6ICIiLCBmOiAzLCB0OiA2fV0sIGZ1bmN0aW9uKHRlc3QpIHsKICAgIGNtLnNldFZhbHVlKCIxMjM0NTY3ODkwIik7CiAgICB2YXIgciA9IGNtLm1hcmtUZXh0KFBvcygwLCAzKSwgUG9zKDAsIDYpLCB7Y2xhc3NOYW1lOiAiZm9vIn0pOwogICAgY20ucmVwbGFjZVJhbmdlKHRlc3QuYywgUG9zKDAsIHRlc3QuYSksIFBvcygwLCB0ZXN0LmIpKTsKICAgIHZhciBmID0gci5maW5kKCk7CiAgICBlcShmICYmIGYuZnJvbS5jaCwgdGVzdC5mKTsgZXEoZiAmJiBmLnRvLmNoLCB0ZXN0LnQpOwogIH0pOwp9KTsKCnRlc3RDTSgibWFya1RleHRNdWx0aUxpbmUiLCBmdW5jdGlvbihjbSkgewogIGZ1bmN0aW9uIHAodikgeyByZXR1cm4gdiAmJiBQb3ModlswXSwgdlsxXSk7IH0KICBmb3JFYWNoKFt7YTogWzAsIDBdLCBiOiBbMCwgNV0sIGM6ICIiLCBmOiBbMCwgMF0sIHQ6IFsyLCA1XX0sCiAgICAgICAgICAge2E6IFswLCAwXSwgYjogWzAsIDVdLCBjOiAiZm9vXG4iLCBmOiBbMSwgMF0sIHQ6IFszLCA1XX0sCiAgICAgICAgICAge2E6IFswLCAxXSwgYjogWzAsIDEwXSwgYzogIiIsIGY6IFswLCAxXSwgdDogWzIsIDVdfSwKICAgICAgICAgICB7YTogWzAsIDVdLCBiOiBbMCwgNl0sIGM6ICJ4IiwgZjogWzAsIDZdLCB0OiBbMiwgNV19LAogICAgICAgICAgIHthOiBbMCwgMF0sIGI6IFsxLCAwXSwgYzogIiIsIGY6IFswLCAwXSwgdDogWzEsIDVdfSwKICAgICAgICAgICB7YTogWzAsIDZdLCBiOiBbMiwgNF0sIGM6ICIiLCBmOiBbMCwgNV0sIHQ6IFswLCA3XX0sCiAgICAgICAgICAge2E6IFswLCA2XSwgYjogWzIsIDRdLCBjOiAiYWEiLCBmOiBbMCwgNV0sIHQ6IFswLCA5XX0sCiAgICAgICAgICAge2E6IFsxLCAyXSwgYjogWzEsIDhdLCBjOiAiIiwgZjogWzAsIDVdLCB0OiBbMiwgNV19LAogICAgICAgICAgIHthOiBbMCwgNV0sIGI6IFsyLCA1XSwgYzogInh4IiwgZjogbnVsbCwgdDogbnVsbH0sCiAgICAgICAgICAge2E6IFswLCAwXSwgYjogWzIsIDEwXSwgYzogIngiLCBmOiBudWxsLCB0OiBudWxsfSwKICAgICAgICAgICB7YTogWzEsIDVdLCBiOiBbMiwgNV0sIGM6ICIiLCBmOiBbMCwgNV0sIHQ6IFsxLCA1XX0sCiAgICAgICAgICAge2E6IFsyLCAwXSwgYjogWzIsIDNdLCBjOiAiIiwgZjogWzAsIDVdLCB0OiBbMiwgMl19LAogICAgICAgICAgIHthOiBbMiwgNV0sIGI6IFszLCAwXSwgYzogImFcbmIiLCBmOiBbMCwgNV0sIHQ6IFsyLCA1XX0sCiAgICAgICAgICAge2E6IFsyLCAzXSwgYjogWzMsIDBdLCBjOiAieCIsIGY6IFswLCA1XSwgdDogWzIsIDNdfSwKICAgICAgICAgICB7YTogWzEsIDFdLCBiOiBbMSwgOV0sIGM6ICIxXG4yXG4zIiwgZjogWzAsIDVdLCB0OiBbNCwgNV19XSwgZnVuY3Rpb24odGVzdCkgewogICAgY20uc2V0VmFsdWUoImFhYWFhYWFhYWFcbmJiYmJiYmJiYmJcbmNjY2NjY2NjY2NcbmRkZGRkZGRkXG4iKTsKICAgIHZhciByID0gY20ubWFya1RleHQoUG9zKDAsIDUpLCBQb3MoMiwgNSksCiAgICAgICAgICAgICAgICAgICAgICAgIHtjbGFzc05hbWU6ICJDb2RlTWlycm9yLW1hdGNoaW5nYnJhY2tldCJ9KTsKICAgIGNtLnJlcGxhY2VSYW5nZSh0ZXN0LmMsIHAodGVzdC5hKSwgcCh0ZXN0LmIpKTsKICAgIHZhciBmID0gci5maW5kKCk7CiAgICBlcVBvcyhmICYmIGYuZnJvbSwgcCh0ZXN0LmYpKTsgZXFQb3MoZiAmJiBmLnRvLCBwKHRlc3QudCkpOwogIH0pOwp9KTsKCnRlc3RDTSgibWFya1RleHRVbmRvIiwgZnVuY3Rpb24oY20pIHsKICB2YXIgbWFya2VyMSwgbWFya2VyMiwgYm9va21hcms7CiAgbWFya2VyMSA9IGNtLm1hcmtUZXh0KFBvcygwLCAxKSwgUG9zKDAsIDMpLAogICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiAiQ29kZU1pcnJvci1tYXRjaGluZ2JyYWNrZXQifSk7CiAgbWFya2VyMiA9IGNtLm1hcmtUZXh0KFBvcygwLCAwKSwgUG9zKDIsIDEpLAogICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiAiQ29kZU1pcnJvci1tYXRjaGluZ2JyYWNrZXQifSk7CiAgYm9va21hcmsgPSBjbS5zZXRCb29rbWFyayhQb3MoMSwgNSkpOwogIGNtLm9wZXJhdGlvbihmdW5jdGlvbigpewogICAgY20ucmVwbGFjZVJhbmdlKCJmb28iLCBQb3MoMCwgMikpOwogICAgY20ucmVwbGFjZVJhbmdlKCJiYXJcbmJhelxuYnVnXG4iLCBQb3MoMiwgMCksIFBvcygzLCAwKSk7CiAgfSk7CiAgdmFyIHYxID0gY20uZ2V0VmFsdWUoKTsKICBjbS5zZXRWYWx1ZSgiIik7CiAgZXEobWFya2VyMS5maW5kKCksIG51bGwpOyBlcShtYXJrZXIyLmZpbmQoKSwgbnVsbCk7IGVxKGJvb2ttYXJrLmZpbmQoKSwgbnVsbCk7CiAgY20udW5kbygpOwogIGVxUG9zKGJvb2ttYXJrLmZpbmQoKSwgUG9zKDEsIDUpLCAic3RpbGwgdGhlcmUiKTsKICBjbS51bmRvKCk7CiAgdmFyIG0xUG9zID0gbWFya2VyMS5maW5kKCksIG0yUG9zID0gbWFya2VyMi5maW5kKCk7CiAgZXFQb3MobTFQb3MuZnJvbSwgUG9zKDAsIDEpKTsgZXFQb3MobTFQb3MudG8sIFBvcygwLCAzKSk7CiAgZXFQb3MobTJQb3MuZnJvbSwgUG9zKDAsIDApKTsgZXFQb3MobTJQb3MudG8sIFBvcygyLCAxKSk7CiAgZXFQb3MoYm9va21hcmsuZmluZCgpLCBQb3MoMSwgNSkpOwogIGNtLnJlZG8oKTsgY20ucmVkbygpOwogIGVxKGJvb2ttYXJrLmZpbmQoKSwgbnVsbCk7CiAgY20udW5kbygpOwogIGVxUG9zKGJvb2ttYXJrLmZpbmQoKSwgUG9zKDEsIDUpKTsKICBlcShjbS5nZXRWYWx1ZSgpLCB2MSk7Cn0sIHt2YWx1ZTogIjEyMzRcbjU2Nzg5XG4wMFxuIn0pOwoKdGVzdENNKCJtYXJrVGV4dFN0YXlHb25lIiwgZnVuY3Rpb24oY20pIHsKICB2YXIgbTEgPSBjbS5tYXJrVGV4dChQb3MoMCwgMCksIFBvcygwLCAxKSk7CiAgY20ucmVwbGFjZVJhbmdlKCJoaSIsIFBvcygwLCAyKSk7CiAgbTEuY2xlYXIoKTsKICBjbS51bmRvKCk7CiAgZXEobTEuZmluZCgpLCBudWxsKTsKfSwge3ZhbHVlOiAiaGVsbG8ifSk7Cgp0ZXN0Q00oIm1hcmtUZXh0QWxsb3dFbXB0eSIsIGZ1bmN0aW9uKGNtKSB7CiAgdmFyIG0xID0gY20ubWFya1RleHQoUG9zKDAsIDEpLCBQb3MoMCwgMiksIHtjbGVhcldoZW5FbXB0eTogZmFsc2V9KTsKICBpcyhtMS5maW5kKCkpOwogIGNtLnJlcGxhY2VSYW5nZSgieCIsIFBvcygwLCAwKSk7CiAgaXMobTEuZmluZCgpKTsKICBjbS5yZXBsYWNlUmFuZ2UoInkiLCBQb3MoMCwgMikpOwogIGlzKG0xLmZpbmQoKSk7CiAgY20ucmVwbGFjZVJhbmdlKCJ6IiwgUG9zKDAsIDMpLCBQb3MoMCwgNCkpOwogIGlzKCFtMS5maW5kKCkpOwogIHZhciBtMiA9IGNtLm1hcmtUZXh0KFBvcygwLCAxKSwgUG9zKDAsIDIpLCB7Y2xlYXJXaGVuRW1wdHk6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVzaXZlTGVmdDogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZVJpZ2h0OiB0cnVlfSk7CiAgY20ucmVwbGFjZVJhbmdlKCJxIiwgUG9zKDAsIDEpLCBQb3MoMCwgMikpOwogIGlzKG0yLmZpbmQoKSk7CiAgY20ucmVwbGFjZVJhbmdlKCIiLCBQb3MoMCwgMCksIFBvcygwLCAzKSk7CiAgaXMoIW0yLmZpbmQoKSk7CiAgdmFyIG0zID0gY20ubWFya1RleHQoUG9zKDAsIDEpLCBQb3MoMCwgMSksIHtjbGVhcldoZW5FbXB0eTogZmFsc2V9KTsKICBjbS5yZXBsYWNlUmFuZ2UoImEiLCBQb3MoMCwgMykpOwogIGlzKG0zLmZpbmQoKSk7CiAgY20ucmVwbGFjZVJhbmdlKCJiIiwgUG9zKDAsIDEpKTsKICBpcyghbTMuZmluZCgpKTsKfSwge3ZhbHVlOiAiYWJjZGUifSk7Cgp0ZXN0Q00oIm1hcmtUZXh0U3RhY2tlZCIsIGZ1bmN0aW9uKGNtKSB7CiAgdmFyIG0xID0gY20ubWFya1RleHQoUG9zKDAsIDApLCBQb3MoMCwgMCksIHtjbGVhcldoZW5FbXB0eTogZmFsc2V9KTsKICB2YXIgbTIgPSBjbS5tYXJrVGV4dChQb3MoMCwgMCksIFBvcygwLCAwKSwge2NsZWFyV2hlbkVtcHR5OiBmYWxzZX0pOwogIGNtLnJlcGxhY2VSYW5nZSgiQiIsIFBvcygwLCAxKSk7CiAgaXMobTEuZmluZCgpICYmIG0yLmZpbmQoKSk7Cn0sIHt2YWx1ZTogIkEifSk7Cgp0ZXN0Q00oInVuZG9QcmVzZXJ2ZXNOZXdNYXJrcyIsIGZ1bmN0aW9uKGNtKSB7CiAgY20ubWFya1RleHQoUG9zKDAsIDMpLCBQb3MoMCwgNCkpOwogIGNtLm1hcmtUZXh0KFBvcygxLCAxKSwgUG9zKDEsIDMpKTsKICBjbS5yZXBsYWNlUmFuZ2UoIiIsIFBvcygwLCAzKSwgUG9zKDMsIDEpKTsKICB2YXIgbUJlZm9yZSA9IGNtLm1hcmtUZXh0KFBvcygwLCAwKSwgUG9zKDAsIDEpKTsKICB2YXIgbUFmdGVyID0gY20ubWFya1RleHQoUG9zKDAsIDUpLCBQb3MoMCwgNikpOwogIHZhciBtQXJvdW5kID0gY20ubWFya1RleHQoUG9zKDAsIDIpLCBQb3MoMCwgNCkpOwogIGNtLnVuZG8oKTsKICBlcVBvcyhtQmVmb3JlLmZpbmQoKS5mcm9tLCBQb3MoMCwgMCkpOwogIGVxUG9zKG1CZWZvcmUuZmluZCgpLnRvLCBQb3MoMCwgMSkpOwogIGVxUG9zKG1BZnRlci5maW5kKCkuZnJvbSwgUG9zKDMsIDMpKTsKICBlcVBvcyhtQWZ0ZXIuZmluZCgpLnRvLCBQb3MoMywgNCkpOwogIGVxUG9zKG1Bcm91bmQuZmluZCgpLmZyb20sIFBvcygwLCAyKSk7CiAgZXFQb3MobUFyb3VuZC5maW5kKCkudG8sIFBvcygzLCAyKSk7CiAgdmFyIGZvdW5kID0gY20uZmluZE1hcmtzQXQoUG9zKDIsIDIpKTsKICBlcShmb3VuZC5sZW5ndGgsIDEpOwogIGVxKGZvdW5kWzBdLCBtQXJvdW5kKTsKfSwge3ZhbHVlOiAiYWFhYVxuYmJiYlxuY2NjY1xuZGRkZCJ9KTsKCnRlc3RDTSgibWFya0NsZWFyQmV0d2VlbiIsIGZ1bmN0aW9uKGNtKSB7CiAgY20uc2V0VmFsdWUoImFhYVxuYmJiXG5jY2NcbmRkZFxuIik7CiAgY20ubWFya1RleHQoUG9zKDAsIDApLCBQb3MoMikpOwogIGNtLnJlcGxhY2VSYW5nZSgiYWFhXG5iYmJcbmNjYyIsIFBvcygwLCAwKSwgUG9zKDIpKTsKICBlcShjbS5maW5kTWFya3NBdChQb3MoMSwgMSkpLmxlbmd0aCwgMCk7Cn0pOwoKdGVzdENNKCJkZWxldGVTcGFuQ29sbGFwc2VkSW5jbHVzaXZlTGVmdCIsIGZ1bmN0aW9uKGNtKSB7CiAgdmFyIGZyb20gPSBQb3MoMSwgMCksIHRvID0gUG9zKDEsIDEpOwogIHZhciBtID0gY20ubWFya1RleHQoZnJvbSwgdG8sIHtjb2xsYXBzZWQ6IHRydWUsIGluY2x1c2l2ZUxlZnQ6IHRydWV9KTsKICAvLyBEZWxldGUgY29sbGFwc2VkIHNwYW4uCiAgY20ucmVwbGFjZVJhbmdlKCIiLCBmcm9tLCB0byk7Cn0sIHt2YWx1ZTogImFiY1xuWFxuZGVmIn0pOwoKdGVzdENNKCJib29rbWFyayIsIGZ1bmN0aW9uKGNtKSB7CiAgZnVuY3Rpb24gcCh2KSB7IHJldHVybiB2ICYmIFBvcyh2WzBdLCB2WzFdKTsgfQogIGZvckVhY2goW3thOiBbMSwgMF0sIGI6IFsxLCAxXSwgYzogIiIsIGQ6IFsxLCA0XX0sCiAgICAgICAgICAge2E6IFsxLCAxXSwgYjogWzEsIDFdLCBjOiAieHgiLCBkOiBbMSwgN119LAogICAgICAgICAgIHthOiBbMSwgNF0sIGI6IFsxLCA1XSwgYzogImFiIiwgZDogWzEsIDZdfSwKICAgICAgICAgICB7YTogWzEsIDRdLCBiOiBbMSwgNl0sIGM6ICIiLCBkOiBudWxsfSwKICAgICAgICAgICB7YTogWzEsIDVdLCBiOiBbMSwgNl0sIGM6ICJhYmMiLCBkOiBbMSwgNV19LAogICAgICAgICAgIHthOiBbMSwgNl0sIGI6IFsxLCA4XSwgYzogIiIsIGQ6IFsxLCA1XX0sCiAgICAgICAgICAge2E6IFsxLCA0XSwgYjogWzEsIDRdLCBjOiAiXG5cbiIsIGQ6IFszLCAxXX0sCiAgICAgICAgICAge2JtOiBbMSwgOV0sIGE6IFsxLCAxXSwgYjogWzEsIDFdLCBjOiAiXG4iLCBkOiBbMiwgOF19XSwgZnVuY3Rpb24odGVzdCkgewogICAgY20uc2V0VmFsdWUoIjEyMzQ1Njc4OTBcbjEyMzQ1Njc4OTBcbjEyMzQ1Njc4OTAiKTsKICAgIHZhciBiID0gY20uc2V0Qm9va21hcmsocCh0ZXN0LmJtKSB8fCBQb3MoMSwgNSkpOwogICAgY20ucmVwbGFjZVJhbmdlKHRlc3QuYywgcCh0ZXN0LmEpLCBwKHRlc3QuYikpOwogICAgZXFQb3MoYi5maW5kKCksIHAodGVzdC5kKSk7CiAgfSk7Cn0pOwoKdGVzdENNKCJib29rbWFya0luc2VydExlZnQiLCBmdW5jdGlvbihjbSkgewogIHZhciBiciA9IGNtLnNldEJvb2ttYXJrKFBvcygwLCAyKSwge2luc2VydExlZnQ6IGZhbHNlfSk7CiAgdmFyIGJsID0gY20uc2V0Qm9va21hcmsoUG9zKDAsIDIpLCB7aW5zZXJ0TGVmdDogdHJ1ZX0pOwogIGNtLnNldEN1cnNvcihQb3MoMCwgMikpOwogIGNtLnJlcGxhY2VTZWxlY3Rpb24oImhpIik7CiAgZXFQb3MoYnIuZmluZCgpLCBQb3MoMCwgMikpOwogIGVxUG9zKGJsLmZpbmQoKSwgUG9zKDAsIDQpKTsKICBjbS5yZXBsYWNlUmFuZ2UoIiIsIFBvcygwLCA0KSwgUG9zKDAsIDUpKTsKICBjbS5yZXBsYWNlUmFuZ2UoIiIsIFBvcygwLCAyKSwgUG9zKDAsIDQpKTsKICBjbS5yZXBsYWNlUmFuZ2UoIiIsIFBvcygwLCAxKSwgUG9zKDAsIDIpKTsKICAvLyBWZXJpZnkgdGhhdCBkZWxldGluZyBuZXh0IHRvIGJvb2ttYXJrcyBkb2Vzbid0IGtpbGwgdGhlbQogIGVxUG9zKGJyLmZpbmQoKSwgUG9zKDAsIDEpKTsKICBlcVBvcyhibC5maW5kKCksIFBvcygwLCAxKSk7Cn0sIHt2YWx1ZTogImFiY2RlZiJ9KTsKCnRlc3RDTSgiYm9va21hcmtDdXJzb3IiLCBmdW5jdGlvbihjbSkgewogIHZhciBwb3MwMSA9IGNtLmN1cnNvckNvb3JkcyhQb3MoMCwgMSkpLCBwb3MxMSA9IGNtLmN1cnNvckNvb3JkcyhQb3MoMSwgMSkpLAogICAgICBwb3MyMCA9IGNtLmN1cnNvckNvb3JkcyhQb3MoMiwgMCkpLCBwb3MzMCA9IGNtLmN1cnNvckNvb3JkcyhQb3MoMywgMCkpLAogICAgICBwb3M0MSA9IGNtLmN1cnNvckNvb3JkcyhQb3MoNCwgMSkpOwogIGNtLnNldEJvb2ttYXJrKFBvcygwLCAxKSwge3dpZGdldDogZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIuKGkCIpLCBpbnNlcnRMZWZ0OiB0cnVlfSk7CiAgY20uc2V0Qm9va21hcmsoUG9zKDIsIDApLCB7d2lkZ2V0OiBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgi4oaQIiksIGluc2VydExlZnQ6IHRydWV9KTsKICBjbS5zZXRCb29rbWFyayhQb3MoMSwgMSksIHt3aWRnZXQ6IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCLihpIiKX0pOwogIGNtLnNldEJvb2ttYXJrKFBvcygzLCAwKSwge3dpZGdldDogZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIuKGkiIpfSk7CiAgdmFyIG5ldzAxID0gY20uY3Vyc29yQ29vcmRzKFBvcygwLCAxKSksIG5ldzExID0gY20uY3Vyc29yQ29vcmRzKFBvcygxLCAxKSksCiAgICAgIG5ldzIwID0gY20uY3Vyc29yQ29vcmRzKFBvcygyLCAwKSksIG5ldzMwID0gY20uY3Vyc29yQ29vcmRzKFBvcygzLCAwKSk7CiAgbmVhcihuZXcwMS5sZWZ0LCBwb3MwMS5sZWZ0LCAxKTsKICBuZWFyKG5ldzAxLnRvcCwgcG9zMDEudG9wLCAxKTsKICBpcyhuZXcxMS5sZWZ0ID4gcG9zMTEubGVmdCwgImF0IHJpZ2h0LCBtaWRkbGUgb2YgbGluZSIpOwogIG5lYXIobmV3MTEudG9wID09IHBvczExLnRvcCwgMSk7CiAgbmVhcihuZXcyMC5sZWZ0LCBwb3MyMC5sZWZ0LCAxKTsKICBuZWFyKG5ldzIwLnRvcCwgcG9zMjAudG9wLCAxKTsKICBpcyhuZXczMC5sZWZ0ID4gcG9zMzAubGVmdCwgImF0IHJpZ2h0LCBlbXB0eSBsaW5lIik7CiAgbmVhcihuZXczMC50b3AsIHBvczMwLCAxKTsKICBjbS5zZXRCb29rbWFyayhQb3MoNCwgMCksIHt3aWRnZXQ6IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCLihpIiKX0pOwogIGlzKGNtLmN1cnNvckNvb3JkcyhQb3MoNCwgMSkpLmxlZnQgPiBwb3M0MS5sZWZ0LCAic2luZ2xlLWNoYXIgYnVnIik7Cn0sIHt2YWx1ZTogImZvb1xuYmFyXG5cblxueFxueSJ9KTsKCnRlc3RDTSgibXVsdGlCb29rbWFya0N1cnNvciIsIGZ1bmN0aW9uKGNtKSB7CiAgaWYgKHBoYW50b20pIHJldHVybjsKICB2YXIgbXMgPSBbXSwgbTsKICBmdW5jdGlvbiBhZGQoaW5zZXJ0TGVmdCkgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCAzOyArK2kpIHsKICAgICAgdmFyIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7CiAgICAgIG5vZGUuaW5uZXJIVE1MID0gIlgiOwogICAgICBtcy5wdXNoKGNtLnNldEJvb2ttYXJrKFBvcygwLCAxKSwge3dpZGdldDogbm9kZSwgaW5zZXJ0TGVmdDogaW5zZXJ0TGVmdH0pKTsKICAgIH0KICB9CiAgdmFyIGJhc2UxID0gY20uY3Vyc29yQ29vcmRzKFBvcygwLCAxKSkubGVmdCwgYmFzZTQgPSBjbS5jdXJzb3JDb29yZHMoUG9zKDAsIDQpKS5sZWZ0OwogIGFkZCh0cnVlKTsKICBuZWFyKGJhc2UxLCBjbS5jdXJzb3JDb29yZHMoUG9zKDAsIDEpKS5sZWZ0LCAxKTsKICB3aGlsZSAobSA9IG1zLnBvcCgpKSBtLmNsZWFyKCk7CiAgYWRkKGZhbHNlKTsKICBuZWFyKGJhc2U0LCBjbS5jdXJzb3JDb29yZHMoUG9zKDAsIDEpKS5sZWZ0LCAxKTsKfSwge3ZhbHVlOiAiYWJjZGVmZyJ9KTsKCnRlc3RDTSgiZ2V0QWxsTWFya3MiLCBmdW5jdGlvbihjbSkgewogIGFkZERvYyhjbSwgMTAsIDEwKTsKICB2YXIgbTEgPSBjbS5zZXRCb29rbWFyayhQb3MoMCwgMikpOwogIHZhciBtMiA9IGNtLm1hcmtUZXh0KFBvcygwLCAyKSwgUG9zKDMsIDIpKTsKICB2YXIgbTMgPSBjbS5tYXJrVGV4dChQb3MoMSwgMiksIFBvcygxLCA4KSk7CiAgdmFyIG00ID0gY20ubWFya1RleHQoUG9zKDgsIDApLCBQb3MoOSwgMCkpOwogIGVxKGNtLmdldEFsbE1hcmtzKCkubGVuZ3RoLCA0KTsKICBtMS5jbGVhcigpOwogIG0zLmNsZWFyKCk7CiAgZXEoY20uZ2V0QWxsTWFya3MoKS5sZW5ndGgsIDIpOwp9KTsKCnRlc3RDTSgiYnVnNTc3IiwgZnVuY3Rpb24oY20pIHsKICBjbS5zZXRWYWx1ZSgiYVxuYiIpOwogIGNtLmNsZWFySGlzdG9yeSgpOwogIGNtLnNldFZhbHVlKCJmb29vb28iKTsKICBjbS51bmRvKCk7Cn0pOwoKdGVzdENNKCJzY3JvbGxTbmFwIiwgZnVuY3Rpb24oY20pIHsKICBjbS5zZXRTaXplKDEwMCwgMTAwKTsKICBhZGREb2MoY20sIDIwMCwgMjAwKTsKICBjbS5zZXRDdXJzb3IoUG9zKDEwMCwgMTgwKSk7CiAgdmFyIGluZm8gPSBjbS5nZXRTY3JvbGxJbmZvKCk7CiAgaXMoaW5mby5sZWZ0ID4gMCAmJiBpbmZvLnRvcCA+IDApOwogIGNtLnNldEN1cnNvcihQb3MoMCwgMCkpOwogIGluZm8gPSBjbS5nZXRTY3JvbGxJbmZvKCk7CiAgaXMoaW5mby5sZWZ0ID09IDAgJiYgaW5mby50b3AgPT0gMCwgInNjcm9sbGVkIGNsZWFuIHRvIHRvcCIpOwogIGNtLnNldEN1cnNvcihQb3MoMTAwLCAxODApKTsKICBjbS5zZXRDdXJzb3IoUG9zKDE5OSwgMCkpOwogIGluZm8gPSBjbS5nZXRTY3JvbGxJbmZvKCk7CiAgaXMoaW5mby5sZWZ0ID09IDAgJiYgaW5mby50b3AgKyAyID4gaW5mby5oZWlnaHQgLSBjbS5nZXRTY3JvbGxlckVsZW1lbnQoKS5jbGllbnRIZWlnaHQsICJzY3JvbGxlZCBjbGVhbiB0byBib3R0b20iKTsKfSk7Cgp0ZXN0Q00oInNjcm9sbEludG9WaWV3IiwgZnVuY3Rpb24oY20pIHsKICBpZiAocGhhbnRvbSkgcmV0dXJuOwogIHZhciBvdXRlciA9IGNtLmdldFdyYXBwZXJFbGVtZW50KCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgZnVuY3Rpb24gdGVzdChsaW5lLCBjaCwgbXNnKSB7CiAgICB2YXIgcG9zID0gUG9zKGxpbmUsIGNoKTsKICAgIGNtLnNjcm9sbEludG9WaWV3KHBvcyk7CiAgICB2YXIgYm94ID0gY20uY2hhckNvb3Jkcyhwb3MsICJ3aW5kb3ciKTsKICAgIGlzKGJveC5sZWZ0ID49IG91dGVyLmxlZnQsIG1zZyArICIgKGxlZnQpIik7CiAgICBpcyhib3gucmlnaHQgPD0gb3V0ZXIucmlnaHQsIG1zZyArICIgKHJpZ2h0KSIpOwogICAgaXMoYm94LnRvcCA+PSBvdXRlci50b3AsIG1zZyArICIgKHRvcCkiKTsKICAgIGlzKGJveC5ib3R0b20gPD0gb3V0ZXIuYm90dG9tLCBtc2cgKyAiIChib3R0b20pIik7CiAgfQogIGFkZERvYyhjbSwgMjAwLCAyMDApOwogIHRlc3QoMTk5LCAxOTksICJib3R0b20gcmlnaHQiKTsKICB0ZXN0KDAsIDAsICJ0b3AgbGVmdCIpOwogIHRlc3QoMTAwLCAxMDAsICJjZW50ZXIiKTsKICB0ZXN0KDE5OSwgMCwgImJvdHRvbSBsZWZ0Iik7CiAgdGVzdCgwLCAxOTksICJ0b3AgcmlnaHQiKTsKICB0ZXN0KDEwMCwgMTAwLCAiY2VudGVyIGFnYWluIik7Cn0pOwoKdGVzdENNKCJzY3JvbGxCYWNrQW5kRm9ydGgiLCBmdW5jdGlvbihjbSkgewogIGFkZERvYyhjbSwgMSwgMjAwKTsKICBjbS5vcGVyYXRpb24oZnVuY3Rpb24oKSB7CiAgICBjbS5zY3JvbGxJbnRvVmlldyhQb3MoMTk5LCAwKSk7CiAgICBjbS5zY3JvbGxJbnRvVmlldyhQb3MoNCwgMCkpOwogIH0pOwogIGlzKGNtLmdldFNjcm9sbEluZm8oKS50b3AgPiAwKTsKfSk7Cgp0ZXN0Q00oInNlbGVjdEFsbE5vU2Nyb2xsIiwgZnVuY3Rpb24oY20pIHsKICBhZGREb2MoY20sIDEsIDIwMCk7CiAgY20uZXhlY0NvbW1hbmQoInNlbGVjdEFsbCIpOwogIGVxKGNtLmdldFNjcm9sbEluZm8oKS50b3AsIDApOwogIGNtLnNldEN1cnNvcigxOTkpOwogIGNtLmV4ZWNDb21tYW5kKCJzZWxlY3RBbGwiKTsKICBpcyhjbS5nZXRTY3JvbGxJbmZvKCkudG9wID4gMCk7Cn0pOwoKdGVzdENNKCJzZWxlY3Rpb25Qb3MiLCBmdW5jdGlvbihjbSkgewogIGlmIChwaGFudG9tKSByZXR1cm47CiAgY20uc2V0U2l6ZSgxMDAsIDEwMCk7CiAgYWRkRG9jKGNtLCAyMDAsIDEwMCk7CiAgY20uc2V0U2VsZWN0aW9uKFBvcygxLCAxMDApLCBQb3MoOTgsIDEwMCkpOwogIHZhciBsaW5lV2lkdGggPSBjbS5jaGFyQ29vcmRzKFBvcygwLCAyMDApLCAibG9jYWwiKS5sZWZ0OwogIHZhciBsaW5lSGVpZ2h0ID0gKGNtLmNoYXJDb29yZHMoUG9zKDk5KSkudG9wIC0gY20uY2hhckNvb3JkcyhQb3MoMCkpLnRvcCkgLyAxMDA7CiAgY20uc2Nyb2xsVG8oMCwgMCk7CiAgdmFyIHNlbEVsdCA9IGJ5Q2xhc3NOYW1lKGNtLmdldFdyYXBwZXJFbGVtZW50KCksICJDb2RlTWlycm9yLXNlbGVjdGVkIik7CiAgdmFyIG91dGVyID0gY20uZ2V0V3JhcHBlckVsZW1lbnQoKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICB2YXIgc2F3TWlkZGxlLCBzYXdUb3AsIHNhd0JvdHRvbTsKICBmb3IgKHZhciBpID0gMCwgZSA9IHNlbEVsdC5sZW5ndGg7IGkgPCBlOyArK2kpIHsKICAgIHZhciBib3ggPSBzZWxFbHRbaV0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICB2YXIgYXRMZWZ0ID0gYm94LmxlZnQgLSBvdXRlci5sZWZ0IDwgMzA7CiAgICB2YXIgd2lkdGggPSBib3gucmlnaHQgLSBib3gubGVmdDsKICAgIHZhciBhdFJpZ2h0ID0gYm94LnJpZ2h0IC0gb3V0ZXIubGVmdCA+IC44ICogbGluZVdpZHRoOwogICAgaWYgKGF0TGVmdCAmJiBhdFJpZ2h0KSB7CiAgICAgIHNhd01pZGRsZSA9IHRydWU7CiAgICAgIGlzKGJveC5ib3R0b20gLSBib3gudG9wID4gOTAgKiBsaW5lSGVpZ2h0LCAibWlkZGxlIGhpZ2giKTsKICAgICAgaXMod2lkdGggPiAuOSAqIGxpbmVXaWR0aCwgIm1pZGRsZSB3aWRlIik7CiAgICB9IGVsc2UgewogICAgICBpcyh3aWR0aCA+IC40ICogbGluZVdpZHRoLCAidG9wL2JvdCB3aWRlIGVub3VnaCIpOwogICAgICBpcyh3aWR0aCA8IC42ICogbGluZVdpZHRoLCAidG9wL2JvdCBzbGltIGVub3VnaCIpOwogICAgICBpZiAoYXRMZWZ0KSB7CiAgICAgICAgc2F3Qm90dG9tID0gdHJ1ZTsKICAgICAgICBpcyhib3gudG9wIC0gb3V0ZXIudG9wID4gOTYgKiBsaW5lSGVpZ2h0LCAiYm90IGJlbG93Iik7CiAgICAgIH0gZWxzZSBpZiAoYXRSaWdodCkgewogICAgICAgIHNhd1RvcCA9IHRydWU7CiAgICAgICAgaXMoYm94LnRvcCAtIG91dGVyLnRvcCA8IDIuMSAqIGxpbmVIZWlnaHQsICJ0b3AgYWJvdmUiKTsKICAgICAgfQogICAgfQogIH0KICBpcyhzYXdUb3AgJiYgc2F3Qm90dG9tICYmIHNhd01pZGRsZSwgImFsbCBwYXJ0cyIpOwp9LCBudWxsKTsKCnRlc3RDTSgicmVzdG9yZUhpc3RvcnkiLCBmdW5jdGlvbihjbSkgewogIGNtLnNldFZhbHVlKCJhYmNcbmRlZiIpOwogIGNtLnJlcGxhY2VSYW5nZSgiaGVsbG8iLCBQb3MoMSwgMCksIFBvcygxKSk7CiAgY20ucmVwbGFjZVJhbmdlKCJnb29wIiwgUG9zKDAsIDApLCBQb3MoMCkpOwogIGNtLnVuZG8oKTsKICB2YXIgc3RvcmVkVmFsID0gY20uZ2V0VmFsdWUoKSwgc3RvcmVkSGlzdCA9IGNtLmdldEhpc3RvcnkoKTsKICBpZiAod2luZG93LkpTT04pIHN0b3JlZEhpc3QgPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KHN0b3JlZEhpc3QpKTsKICBlcShzdG9yZWRWYWwsICJhYmNcbmhlbGxvIik7CiAgY20uc2V0VmFsdWUoIiIpOwogIGNtLmNsZWFySGlzdG9yeSgpOwogIGVxKGNtLmhpc3RvcnlTaXplKCkudW5kbywgMCk7CiAgY20uc2V0VmFsdWUoc3RvcmVkVmFsKTsKICBjbS5zZXRIaXN0b3J5KHN0b3JlZEhpc3QpOwogIGNtLnJlZG8oKTsKICBlcShjbS5nZXRWYWx1ZSgpLCAiZ29vcFxuaGVsbG8iKTsKICBjbS51bmRvKCk7IGNtLnVuZG8oKTsKICBlcShjbS5nZXRWYWx1ZSgpLCAiYWJjXG5kZWYiKTsKfSk7Cgp0ZXN0Q00oImRvdWJsZVNjcm9sbGJhciIsIGZ1bmN0aW9uKGNtKSB7CiAgdmFyIGR1bW15ID0gZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJwIikpOwogIGR1bW15LnN0eWxlLmNzc1RleHQgPSAiaGVpZ2h0OiA1MHB4OyBvdmVyZmxvdzogc2Nyb2xsOyB3aWR0aDogNTBweCI7CiAgdmFyIHNjcm9sbGJhcldpZHRoID0gZHVtbXkub2Zmc2V0V2lkdGggKyAxIC0gZHVtbXkuY2xpZW50V2lkdGg7CiAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZChkdW1teSk7CiAgaWYgKHNjcm9sbGJhcldpZHRoIDwgMikgcmV0dXJuOwogIGNtLnNldFNpemUobnVsbCwgMTAwKTsKICBhZGREb2MoY20sIDEsIDMwMCk7CiAgdmFyIHdyYXAgPSBjbS5nZXRXcmFwcGVyRWxlbWVudCgpOwogIGlzKHdyYXAub2Zmc2V0V2lkdGggLSBieUNsYXNzTmFtZSh3cmFwLCAiQ29kZU1pcnJvci1saW5lcyIpWzBdLm9mZnNldFdpZHRoIDw9IHNjcm9sbGJhcldpZHRoICogMS41KTsKfSk7Cgp0ZXN0Q00oIndlaXJkTGluZWJyZWFrcyIsIGZ1bmN0aW9uKGNtKSB7CiAgY20uc2V0VmFsdWUoImZvb1xuYmFyXHJiYXpcclxucXV1eFxuXHJwbG9wIik7CiAgaXMoY20uZ2V0VmFsdWUoKSwgImZvb1xuYmFyXG5iYXpcbnF1dXhcblxucGxvcCIpOwogIGlzKGNtLmxpbmVDb3VudCgpLCA2KTsKICBjbS5zZXRWYWx1ZSgiXG5cbiIpOwogIGlzKGNtLmxpbmVDb3VudCgpLCAzKTsKfSk7Cgp0ZXN0Q00oInNldFNpemUiLCBmdW5jdGlvbihjbSkgewogIGNtLnNldFNpemUoMTAwLCAxMDApOwogIHZhciB3cmFwID0gY20uZ2V0V3JhcHBlckVsZW1lbnQoKTsKICBpcyh3cmFwLm9mZnNldFdpZHRoLCAxMDApOwogIGlzKHdyYXAub2Zmc2V0SGVpZ2h0LCAxMDApOwogIGNtLnNldFNpemUoIjEwMCUiLCAiM2VtIik7CiAgaXMod3JhcC5zdHlsZS53aWR0aCwgIjEwMCUiKTsKICBpcyh3cmFwLnN0eWxlLmhlaWdodCwgIjNlbSIpOwogIGNtLnNldFNpemUobnVsbCwgNDApOwogIGlzKHdyYXAuc3R5bGUud2lkdGgsICIxMDAlIik7CiAgaXMod3JhcC5zdHlsZS5oZWlnaHQsICI0MHB4Iik7Cn0pOwoKZnVuY3Rpb24gZm9sZExpbmVzKGNtLCBzdGFydCwgZW5kLCBhdXRvQ2xlYXIpIHsKICByZXR1cm4gY20ubWFya1RleHQoUG9zKHN0YXJ0LCAwKSwgUG9zKGVuZCAtIDEpLCB7CiAgICBpbmNsdXNpdmVMZWZ0OiB0cnVlLAogICAgaW5jbHVzaXZlUmlnaHQ6IHRydWUsCiAgICBjb2xsYXBzZWQ6IHRydWUsCiAgICBjbGVhck9uRW50ZXI6IGF1dG9DbGVhcgogIH0pOwp9Cgp0ZXN0Q00oImNvbGxhcHNlZExpbmVzIiwgZnVuY3Rpb24oY20pIHsKICBhZGREb2MoY20sIDQsIDEwKTsKICB2YXIgcmFuZ2UgPSBmb2xkTGluZXMoY20sIDQsIDUpLCBjbGVhcmVkID0gMDsKICBDb2RlTWlycm9yLm9uKHJhbmdlLCAiY2xlYXIiLCBmdW5jdGlvbigpIHtjbGVhcmVkKys7fSk7CiAgY20uc2V0Q3Vyc29yKFBvcygzLCAwKSk7CiAgQ29kZU1pcnJvci5jb21tYW5kcy5nb0xpbmVEb3duKGNtKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDUsIDApKTsKICBjbS5yZXBsYWNlUmFuZ2UoImFiY2RlZmciLCBQb3MoMywgMCksIFBvcygzKSk7CiAgY20uc2V0Q3Vyc29yKFBvcygzLCA2KSk7CiAgQ29kZU1pcnJvci5jb21tYW5kcy5nb0xpbmVEb3duKGNtKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDUsIDQpKTsKICBjbS5yZXBsYWNlUmFuZ2UoImFiIiwgUG9zKDMsIDApLCBQb3MoMykpOwogIGNtLnNldEN1cnNvcihQb3MoMywgMikpOwogIENvZGVNaXJyb3IuY29tbWFuZHMuZ29MaW5lRG93bihjbSk7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcyg1LCAyKSk7CiAgY20ub3BlcmF0aW9uKGZ1bmN0aW9uKCkge3JhbmdlLmNsZWFyKCk7IHJhbmdlLmNsZWFyKCk7fSk7CiAgZXEoY2xlYXJlZCwgMSk7Cn0pOwoKdGVzdENNKCJjb2xsYXBzZWRSYW5nZUNvb3Jkc0NoYXIiLCBmdW5jdGlvbihjbSkgewogIHZhciBwb3NfMV8zID0gY20uY2hhckNvb3JkcyhQb3MoMSwgMykpOwogIHBvc18xXzMubGVmdCArPSAyOyBwb3NfMV8zLnRvcCArPSAyOwogIHZhciBvcHRzID0ge2NvbGxhcHNlZDogdHJ1ZSwgaW5jbHVzaXZlTGVmdDogdHJ1ZSwgaW5jbHVzaXZlUmlnaHQ6IHRydWV9OwogIHZhciBtMSA9IGNtLm1hcmtUZXh0KFBvcygwLCAwKSwgUG9zKDIsIDApLCBvcHRzKTsKICBlcVBvcyhjbS5jb29yZHNDaGFyKHBvc18xXzMpLCBQb3MoMywgMykpOwogIG0xLmNsZWFyKCk7CiAgdmFyIG0xID0gY20ubWFya1RleHQoUG9zKDAsIDApLCBQb3MoMSwgMSksIHtjb2xsYXBzZWQ6IHRydWUsIGluY2x1c2l2ZUxlZnQ6IHRydWV9KTsKICB2YXIgbTIgPSBjbS5tYXJrVGV4dChQb3MoMSwgMSksIFBvcygyLCAwKSwge2NvbGxhcHNlZDogdHJ1ZSwgaW5jbHVzaXZlUmlnaHQ6IHRydWV9KTsKICBlcVBvcyhjbS5jb29yZHNDaGFyKHBvc18xXzMpLCBQb3MoMywgMykpOwogIG0xLmNsZWFyKCk7IG0yLmNsZWFyKCk7CiAgdmFyIG0xID0gY20ubWFya1RleHQoUG9zKDAsIDApLCBQb3MoMSwgNiksIG9wdHMpOwogIGVxUG9zKGNtLmNvb3Jkc0NoYXIocG9zXzFfMyksIFBvcygzLCAzKSk7Cn0sIHt2YWx1ZTogIjEyMzQ1NlxuYWJjZGVmXG5naGlqa2xcbm1ub3BxclxuIn0pOwoKdGVzdENNKCJjb2xsYXBzZWRSYW5nZUJldHdlZW5MaW5lc1NlbGVjdGVkIiwgZnVuY3Rpb24oY20pIHsKICB2YXIgd2lkZ2V0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpOwogIHdpZGdldC50ZXh0Q29udGVudCA9ICJcdTIxOTQiOwogIGNtLm1hcmtUZXh0KFBvcygwLCAzKSwgUG9zKDEsIDApLCB7cmVwbGFjZWRXaXRoOiB3aWRnZXR9KTsKICBjbS5zZXRTZWxlY3Rpb24oUG9zKDAsIDMpLCBQb3MoMSwgMCkpOwogIHZhciBzZWxFbHRzID0gYnlDbGFzc05hbWUoY20uZ2V0V3JhcHBlckVsZW1lbnQoKSwgIkNvZGVNaXJyb3Itc2VsZWN0ZWQiKTsKICBmb3IgKHZhciBpID0gMCwgdyA9IDA7IGkgPCBzZWxFbHRzLmxlbmd0aDsgaSsrKQogICAgdyArPSBzZWxFbHRzW2ldLm9mZnNldFdpZHRoOwogIGlzKHcgPiAwKTsKfSwge3ZhbHVlOiAib25lXG50d28ifSk7Cgp0ZXN0Q00oInJhbmRvbUNvbGxhcHNlZFJhbmdlcyIsIGZ1bmN0aW9uKGNtKSB7CiAgYWRkRG9jKGNtLCAyMCwgNTAwKTsKICBjbS5vcGVyYXRpb24oZnVuY3Rpb24oKSB7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDIwMDsgaSsrKSB7CiAgICAgIHZhciBzdGFydCA9IFBvcyhNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiA1MDApLCBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAyMCkpOwogICAgICBpZiAoaSAlIDQpCiAgICAgICAgdHJ5IHsgY20ubWFya1RleHQoc3RhcnQsIFBvcyhzdGFydC5saW5lICsgMiwgMSksIHtjb2xsYXBzZWQ6IHRydWV9KTsgfQogICAgICAgIGNhdGNoKGUpIHsgaWYgKCEvb3ZlcmxhcHBpbmcvLnRlc3QoU3RyaW5nKGUpKSkgdGhyb3cgZTsgfQogICAgICBlbHNlCiAgICAgICAgY20ubWFya1RleHQoc3RhcnQsIFBvcyhzdGFydC5saW5lLCBzdGFydC5jaCArIDQpLCB7ImNsYXNzTmFtZSI6ICJmb28ifSk7CiAgICB9CiAgfSk7Cn0pOwoKdGVzdENNKCJoaWRkZW5MaW5lc0F1dG9VbmZvbGQiLCBmdW5jdGlvbihjbSkgewogIHZhciByYW5nZSA9IGZvbGRMaW5lcyhjbSwgMSwgMywgdHJ1ZSksIGNsZWFyZWQgPSAwOwogIENvZGVNaXJyb3Iub24ocmFuZ2UsICJjbGVhciIsIGZ1bmN0aW9uKCkge2NsZWFyZWQrKzt9KTsKICBjbS5zZXRDdXJzb3IoUG9zKDMsIDApKTsKICBlcShjbGVhcmVkLCAwKTsKICBjbS5leGVjQ29tbWFuZCgiZ29DaGFyTGVmdCIpOwogIGVxKGNsZWFyZWQsIDEpOwogIHJhbmdlID0gZm9sZExpbmVzKGNtLCAxLCAzLCB0cnVlKTsKICBDb2RlTWlycm9yLm9uKHJhbmdlLCAiY2xlYXIiLCBmdW5jdGlvbigpIHtjbGVhcmVkKys7fSk7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygzLCAwKSk7CiAgY20uc2V0Q3Vyc29yKFBvcygwLCAzKSk7CiAgY20uZXhlY0NvbW1hbmQoImdvQ2hhclJpZ2h0Iik7CiAgZXEoY2xlYXJlZCwgMik7Cn0sIHt2YWx1ZTogImFiY1xuZGVmXG5naGlcbmprbCJ9KTsKCnRlc3RDTSgiaGlkZGVuTGluZXNTZWxlY3RBbGwiLCBmdW5jdGlvbihjbSkgeyAgLy8gSXNzdWUgIzQ4NAogIGFkZERvYyhjbSwgNCwgMjApOwogIGZvbGRMaW5lcyhjbSwgMCwgMTApOwogIGZvbGRMaW5lcyhjbSwgMTEsIDIwKTsKICBDb2RlTWlycm9yLmNvbW1hbmRzLnNlbGVjdEFsbChjbSk7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKHRydWUpLCBQb3MoMTAsIDApKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoZmFsc2UpLCBQb3MoMTAsIDQpKTsKfSk7CgoKdGVzdENNKCJldmVyeXRoaW5nRm9sZGVkIiwgZnVuY3Rpb24oY20pIHsKICBhZGREb2MoY20sIDIsIDIpOwogIGZ1bmN0aW9uIGVudGVyUHJlc3MoKSB7CiAgICBjbS50cmlnZ2VyT25LZXlEb3duKHt0eXBlOiAia2V5ZG93biIsIGtleUNvZGU6IDEzLCBwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24oKXt9LCBzdG9wUHJvcGFnYXRpb246IGZ1bmN0aW9uKCl7fX0pOwogIH0KICB2YXIgZm9sZCA9IGZvbGRMaW5lcyhjbSwgMCwgMik7CiAgZW50ZXJQcmVzcygpOwogIGVxKGNtLmdldFZhbHVlKCksICJ4eFxueHgiKTsKICBmb2xkLmNsZWFyKCk7CiAgZm9sZCA9IGZvbGRMaW5lcyhjbSwgMCwgMiwgdHJ1ZSk7CiAgZXEoZm9sZC5maW5kKCksIG51bGwpOwogIGVudGVyUHJlc3MoKTsKICBlcShjbS5nZXRWYWx1ZSgpLCAiXG54eFxueHgiKTsKfSk7Cgp0ZXN0Q00oInN0cnVjdHVyZWRGb2xkIiwgZnVuY3Rpb24oY20pIHsKICBpZiAocGhhbnRvbSkgcmV0dXJuOwogIGFkZERvYyhjbSwgNCwgOCk7CiAgdmFyIHJhbmdlID0gY20ubWFya1RleHQoUG9zKDEsIDIpLCBQb3MoNiwgMiksIHsKICAgIHJlcGxhY2VkV2l0aDogZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIlEiKQogIH0pOwogIGNtLnNldEN1cnNvcigwLCAzKTsKICBDb2RlTWlycm9yLmNvbW1hbmRzLmdvTGluZURvd24oY20pOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoNiwgMikpOwogIENvZGVNaXJyb3IuY29tbWFuZHMuZ29DaGFyTGVmdChjbSk7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygxLCAyKSk7CiAgQ29kZU1pcnJvci5jb21tYW5kcy5kZWxDaGFyQWZ0ZXIoY20pOwogIGVxKGNtLmdldFZhbHVlKCksICJ4eHh4XG54eHh4XG54eHh4Iik7CiAgYWRkRG9jKGNtLCA0LCA4KTsKICByYW5nZSA9IGNtLm1hcmtUZXh0KFBvcygxLCAyKSwgUG9zKDYsIDIpLCB7CiAgICByZXBsYWNlZFdpdGg6IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCJNIiksCiAgICBjbGVhck9uRW50ZXI6IHRydWUKICB9KTsKICB2YXIgY2xlYXJlZCA9IDA7CiAgQ29kZU1pcnJvci5vbihyYW5nZSwgImNsZWFyIiwgZnVuY3Rpb24oKXsrK2NsZWFyZWQ7fSk7CiAgY20uc2V0Q3Vyc29yKDAsIDMpOwogIENvZGVNaXJyb3IuY29tbWFuZHMuZ29MaW5lRG93bihjbSk7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcyg2LCAyKSk7CiAgQ29kZU1pcnJvci5jb21tYW5kcy5nb0NoYXJMZWZ0KGNtKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDYsIDEpKTsKICBlcShjbGVhcmVkLCAxKTsKICByYW5nZS5jbGVhcigpOwogIGVxKGNsZWFyZWQsIDEpOwogIHJhbmdlID0gY20ubWFya1RleHQoUG9zKDEsIDIpLCBQb3MoNiwgMiksIHsKICAgIHJlcGxhY2VkV2l0aDogZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIlEiKSwKICAgIGNsZWFyT25FbnRlcjogdHJ1ZQogIH0pOwogIHJhbmdlLmNsZWFyKCk7CiAgY20uc2V0Q3Vyc29yKDEsIDIpOwogIENvZGVNaXJyb3IuY29tbWFuZHMuZ29DaGFyUmlnaHQoY20pOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoMSwgMykpOwogIHJhbmdlID0gY20ubWFya1RleHQoUG9zKDIsIDApLCBQb3MoNCwgNCksIHsKICAgIHJlcGxhY2VkV2l0aDogZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIk0iKQogIH0pOwogIGNtLnNldEN1cnNvcigxLCAwKTsKICBDb2RlTWlycm9yLmNvbW1hbmRzLmdvTGluZURvd24oY20pOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoMiwgMCkpOwp9LCBudWxsKTsKCnRlc3RDTSgibmVzdGVkRm9sZCIsIGZ1bmN0aW9uKGNtKSB7CiAgYWRkRG9jKGNtLCAxMCwgMyk7CiAgZnVuY3Rpb24gZm9sZChsbCwgY2wsIGxyLCBjcikgewogICAgcmV0dXJuIGNtLm1hcmtUZXh0KFBvcyhsbCwgY2wpLCBQb3MobHIsIGNyKSwge2NvbGxhcHNlZDogdHJ1ZX0pOwogIH0KICB2YXIgaW5uZXIxID0gZm9sZCgwLCA2LCAxLCAzKSwgaW5uZXIyID0gZm9sZCgwLCAyLCAxLCA4KSwgb3V0ZXIgPSBmb2xkKDAsIDEsIDIsIDMpLCBpbm5lcjAgPSBmb2xkKDAsIDUsIDAsIDYpOwogIGNtLnNldEN1cnNvcigwLCAxKTsKICBDb2RlTWlycm9yLmNvbW1hbmRzLmdvQ2hhclJpZ2h0KGNtKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDIsIDMpKTsKICBpbm5lcjAuY2xlYXIoKTsKICBDb2RlTWlycm9yLmNvbW1hbmRzLmdvQ2hhckxlZnQoY20pOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoMCwgMSkpOwogIG91dGVyLmNsZWFyKCk7CiAgQ29kZU1pcnJvci5jb21tYW5kcy5nb0NoYXJSaWdodChjbSk7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygwLCAyKSk7CiAgQ29kZU1pcnJvci5jb21tYW5kcy5nb0NoYXJSaWdodChjbSk7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygxLCA4KSk7CiAgaW5uZXIyLmNsZWFyKCk7CiAgQ29kZU1pcnJvci5jb21tYW5kcy5nb0NoYXJMZWZ0KGNtKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDEsIDcpKTsKICBjbS5zZXRDdXJzb3IoMCwgNSk7CiAgQ29kZU1pcnJvci5jb21tYW5kcy5nb0NoYXJSaWdodChjbSk7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygwLCA2KSk7CiAgQ29kZU1pcnJvci5jb21tYW5kcy5nb0NoYXJSaWdodChjbSk7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygxLCAzKSk7Cn0pOwoKdGVzdENNKCJiYWROZXN0ZWRGb2xkIiwgZnVuY3Rpb24oY20pIHsKICBhZGREb2MoY20sIDQsIDQpOwogIGNtLm1hcmtUZXh0KFBvcygwLCAyKSwgUG9zKDMsIDIpLCB7Y29sbGFwc2VkOiB0cnVlfSk7CiAgdmFyIGNhdWdodDsKICB0cnkge2NtLm1hcmtUZXh0KFBvcygwLCAxKSwgUG9zKDAsIDMpLCB7Y29sbGFwc2VkOiB0cnVlfSk7fQogIGNhdGNoKGUpIHtjYXVnaHQgPSBlO30KICBpcyhjYXVnaHQgaW5zdGFuY2VvZiBFcnJvciwgIm5vIGVycm9yIik7CiAgaXMoL292ZXJsYXAvaS50ZXN0KGNhdWdodC5tZXNzYWdlKSwgIndyb25nIGVycm9yIik7Cn0pOwoKdGVzdENNKCJuZXN0ZWRGb2xkT25TaWRlIiwgZnVuY3Rpb24oY20pIHsKICB2YXIgbTEgPSBjbS5tYXJrVGV4dChQb3MoMCwgMSksIFBvcygyLCAxKSwge2NvbGxhcHNlZDogdHJ1ZSwgaW5jbHVzaXZlUmlnaHQ6IHRydWV9KTsKICB2YXIgbTIgPSBjbS5tYXJrVGV4dChQb3MoMCwgMSksIFBvcygwLCAyKSwge2NvbGxhcHNlZDogdHJ1ZX0pOwogIGNtLm1hcmtUZXh0KFBvcygwLCAxKSwgUG9zKDAsIDIpLCB7Y29sbGFwc2VkOiB0cnVlfSkuY2xlYXIoKTsKICB0cnkgeyBjbS5tYXJrVGV4dChQb3MoMCwgMSksIFBvcygwLCAyKSwge2NvbGxhcHNlZDogdHJ1ZSwgaW5jbHVzaXZlTGVmdDogdHJ1ZX0pOyB9CiAgY2F0Y2goZSkgeyB2YXIgY2F1Z2h0ID0gZTsgfQogIGlzKGNhdWdodCAmJiAvb3ZlcmxhcC9pLnRlc3QoY2F1Z2h0Lm1lc3NhZ2UpKTsKICB2YXIgbTMgPSBjbS5tYXJrVGV4dChQb3MoMiwgMCksIFBvcygyLCAxKSwge2NvbGxhcHNlZDogdHJ1ZX0pOwogIHZhciBtNCA9IGNtLm1hcmtUZXh0KFBvcygyLCAwKSwgUG9zKDIsIDEpLCB7Y29sbGFwc2U6IHRydWUsIGluY2x1c2l2ZVJpZ2h0OiB0cnVlfSk7CiAgbTEuY2xlYXIoKTsgbTQuY2xlYXIoKTsKICBtMSA9IGNtLm1hcmtUZXh0KFBvcygwLCAxKSwgUG9zKDIsIDEpLCB7Y29sbGFwc2VkOiB0cnVlfSk7CiAgY20ubWFya1RleHQoUG9zKDIsIDApLCBQb3MoMiwgMSksIHtjb2xsYXBzZWQ6IHRydWV9KS5jbGVhcigpOwogIHRyeSB7IGNtLm1hcmtUZXh0KFBvcygyLCAwKSwgUG9zKDIsIDEpLCB7Y29sbGFwc2VkOiB0cnVlLCBpbmNsdXNpdmVSaWdodDogdHJ1ZX0pOyB9CiAgY2F0Y2goZSkgeyB2YXIgY2F1Z2h0ID0gZTsgfQogIGlzKGNhdWdodCAmJiAvb3ZlcmxhcC9pLnRlc3QoY2F1Z2h0Lm1lc3NhZ2UpKTsKfSwge3ZhbHVlOiAiYWJcbmNkXGVmIn0pOwoKdGVzdENNKCJlZGl0SW5Gb2xkIiwgZnVuY3Rpb24oY20pIHsKICBhZGREb2MoY20sIDQsIDYpOwogIHZhciBtID0gY20ubWFya1RleHQoUG9zKDEsIDIpLCBQb3MoMywgMiksIHtjb2xsYXBzZWQ6IHRydWV9KTsKICBjbS5yZXBsYWNlUmFuZ2UoIiIsIFBvcygwLCAwKSwgUG9zKDEsIDMpKTsKICBjbS5yZXBsYWNlUmFuZ2UoIiIsIFBvcygyLCAxKSwgUG9zKDMsIDMpKTsKICBjbS5yZXBsYWNlUmFuZ2UoImFcbmJcbmNcbmQiLCBQb3MoMCwgMSksIFBvcygxLCAwKSk7CiAgY20uY3Vyc29yQ29vcmRzKFBvcygwLCAwKSk7Cn0pOwoKdGVzdENNKCJ3cmFwcGluZ0lubGluZVdpZGdldCIsIGZ1bmN0aW9uKGNtKSB7CiAgY20uc2V0U2l6ZSgiMTFlbSIpOwogIHZhciB3ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpOwogIHcuc3R5bGUuY29sb3IgPSAicmVkIjsKICB3LmlubmVySFRNTCA9ICJvbmUgdHdvIHRocmVlIGZvdXIiOwogIGNtLm1hcmtUZXh0KFBvcygwLCA2KSwgUG9zKDAsIDkpLCB7cmVwbGFjZWRXaXRoOiB3fSk7CiAgdmFyIGN1cjAgPSBjbS5jdXJzb3JDb29yZHMoUG9zKDAsIDApKSwgY3VyMSA9IGNtLmN1cnNvckNvb3JkcyhQb3MoMCwgMTApKTsKICBpcyhjdXIwLnRvcCA8IGN1cjEudG9wKTsKICBpcyhjdXIwLmJvdHRvbSA8IGN1cjEuYm90dG9tKTsKICB2YXIgY3VyTCA9IGNtLmN1cnNvckNvb3JkcyhQb3MoMCwgNikpLCBjdXJSID0gY20uY3Vyc29yQ29vcmRzKFBvcygwLCA5KSk7CiAgZXEoY3VyTC50b3AsIGN1cjAudG9wKTsKICBlcShjdXJMLmJvdHRvbSwgY3VyMC5ib3R0b20pOwogIGVxKGN1clIudG9wLCBjdXIxLnRvcCk7CiAgZXEoY3VyUi5ib3R0b20sIGN1cjEuYm90dG9tKTsKICBjbS5yZXBsYWNlUmFuZ2UoIiIsIFBvcygwLCA5KSwgUG9zKDApKTsKICBjdXJSID0gY20uY3Vyc29yQ29vcmRzKFBvcygwLCA5KSk7CiAgaWYgKHBoYW50b20pIHJldHVybjsKICBlcShjdXJSLnRvcCwgY3VyMS50b3ApOwogIGVxKGN1clIuYm90dG9tLCBjdXIxLmJvdHRvbSk7Cn0sIHt2YWx1ZTogIjEgMiAzIHh4eCA0IiwgbGluZVdyYXBwaW5nOiB0cnVlfSk7Cgp0ZXN0Q00oImNoYW5nZWRJbmxpbmVXaWRnZXQiLCBmdW5jdGlvbihjbSkgewogIGNtLnNldFNpemUoIjEwZW0iKTsKICB2YXIgdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTsKICB3LmlubmVySFRNTCA9ICJ4IjsKICB2YXIgbSA9IGNtLm1hcmtUZXh0KFBvcygwLCA0KSwgUG9zKDAsIDUpLCB7cmVwbGFjZWRXaXRoOiB3fSk7CiAgdy5pbm5lckhUTUwgPSAiYW5kIG5vdyB0aGUgd2lkZ2V0IGlzIHJlYWxseSByZWFsbHkgbG9uZyBhbGwgb2YgYSBzdWRkZW4gYW5kIGEgc2Nyb2xsYmFyIGlzIG5lZWRlZCI7CiAgbS5jaGFuZ2VkKCk7CiAgdmFyIGhTY3JvbGwgPSBieUNsYXNzTmFtZShjbS5nZXRXcmFwcGVyRWxlbWVudCgpLCAiQ29kZU1pcnJvci1oc2Nyb2xsYmFyIilbMF07CiAgaXMoaFNjcm9sbC5zY3JvbGxXaWR0aCA+IGhTY3JvbGwuY2xpZW50V2lkdGgpOwp9LCB7dmFsdWU6ICJoZWxsbyB0aGVyZSJ9KTsKCnRlc3RDTSgiY2hhbmdlZEJvb2ttYXJrIiwgZnVuY3Rpb24oY20pIHsKICBjbS5zZXRTaXplKCIxMGVtIik7CiAgdmFyIHcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7CiAgdy5pbm5lckhUTUwgPSAieCI7CiAgdmFyIG0gPSBjbS5zZXRCb29rbWFyayhQb3MoMCwgNCksIHt3aWRnZXQ6IHd9KTsKICB3LmlubmVySFRNTCA9ICJhbmQgbm93IHRoZSB3aWRnZXQgaXMgcmVhbGx5IHJlYWxseSBsb25nIGFsbCBvZiBhIHN1ZGRlbiBhbmQgYSBzY3JvbGxiYXIgaXMgbmVlZGVkIjsKICBtLmNoYW5nZWQoKTsKICB2YXIgaFNjcm9sbCA9IGJ5Q2xhc3NOYW1lKGNtLmdldFdyYXBwZXJFbGVtZW50KCksICJDb2RlTWlycm9yLWhzY3JvbGxiYXIiKVswXTsKICBpcyhoU2Nyb2xsLnNjcm9sbFdpZHRoID4gaFNjcm9sbC5jbGllbnRXaWR0aCk7Cn0sIHt2YWx1ZTogImFiY2RlZmcifSk7Cgp0ZXN0Q00oImlubGluZVdpZGdldCIsIGZ1bmN0aW9uKGNtKSB7CiAgdmFyIHcgPSBjbS5zZXRCb29rbWFyayhQb3MoMCwgMiksIHt3aWRnZXQ6IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCJ1dSIpfSk7CiAgY20uc2V0Q3Vyc29yKDAsIDIpOwogIENvZGVNaXJyb3IuY29tbWFuZHMuZ29MaW5lRG93bihjbSk7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygxLCA0KSk7CiAgY20uc2V0Q3Vyc29yKDAsIDIpOwogIGNtLnJlcGxhY2VTZWxlY3Rpb24oImhpIik7CiAgZXFQb3Mody5maW5kKCksIFBvcygwLCAyKSk7CiAgY20uc2V0Q3Vyc29yKDAsIDEpOwogIGNtLnJlcGxhY2VTZWxlY3Rpb24oImF5Iik7CiAgZXFQb3Mody5maW5kKCksIFBvcygwLCA0KSk7CiAgZXEoY20uZ2V0TGluZSgwKSwgInVheXVoaXV1Iik7Cn0sIHt2YWx1ZTogInV1dXVcbnV1dXV1dSJ9KTsKCnRlc3RDTSgid3JhcHBpbmdBbmRSZXNpemluZyIsIGZ1bmN0aW9uKGNtKSB7CiAgY20uc2V0U2l6ZShudWxsLCAiYXV0byIpOwogIGNtLnNldE9wdGlvbigibGluZVdyYXBwaW5nIiwgdHJ1ZSk7CiAgdmFyIHdyYXAgPSBjbS5nZXRXcmFwcGVyRWxlbWVudCgpLCBoMCA9IHdyYXAub2Zmc2V0SGVpZ2h0OwogIHZhciBkb2MgPSAieHh4IHh4eCB4eHggeHh4IHh4eCI7CiAgY20uc2V0VmFsdWUoZG9jKTsKICBmb3IgKHZhciBzdGVwID0gMTAsIHcgPSBjbS5jaGFyQ29vcmRzKFBvcygwLCAxOCksICJkaXYiKS5yaWdodDs7IHcgKz0gc3RlcCkgewogICAgY20uc2V0U2l6ZSh3KTsKICAgIGlmICh3cmFwLm9mZnNldEhlaWdodCA8PSBoMCAqIChvcGVyYV9sdDEwID8gMS4yIDogMS41KSkgewogICAgICBpZiAoc3RlcCA9PSAxMCkgeyB3IC09IDEwOyBzdGVwID0gMTsgfQogICAgICBlbHNlIGJyZWFrOwogICAgfQogIH0KICAvLyBFbnN1cmUgdGhhdCBwdXR0aW5nIHRoZSBjdXJzb3IgYXQgdGhlIGVuZCBvZiB0aGUgbWF4aW1hbGx5IGxvbmcKICAvLyBsaW5lIGRvZXNuJ3QgY2F1c2Ugd3JhcHBpbmcgdG8gaGFwcGVuLgogIGNtLnNldEN1cnNvcihQb3MoMCwgZG9jLmxlbmd0aCkpOwogIGVxKHdyYXAub2Zmc2V0SGVpZ2h0LCBoMCk7CiAgY20ucmVwbGFjZVNlbGVjdGlvbigieCIpOwogIGlzKHdyYXAub2Zmc2V0SGVpZ2h0ID4gaDAsICJ3cmFwcGluZyBoYXBwZW5zIik7CiAgLy8gTm93IGFkZCBhIG1heC1oZWlnaHQgYW5kLCBpbiBhIGRvY3VtZW50IGNvbnNpc3Rpbmcgb2YKICAvLyBhbG1vc3Qtd3JhcHBlZCBsaW5lcywgZ28gb3ZlciBpdCBzbyB0aGF0IGEgc2Nyb2xsYmFyIGFwcGVhcnMuCiAgY20uc2V0VmFsdWUoZG9jICsgIlxuIiArIGRvYyArICJcbiIpOwogIGNtLmdldFNjcm9sbGVyRWxlbWVudCgpLnN0eWxlLm1heEhlaWdodCA9ICIxMDBweCI7CiAgY20ucmVwbGFjZVJhbmdlKCJcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiFcbiIsIFBvcygyLCAwKSk7CiAgZm9yRWFjaChbUG9zKDAsIGRvYy5sZW5ndGgpLCBQb3MoMCwgZG9jLmxlbmd0aCAtIDEpLAogICAgICAgICAgIFBvcygwLCAwKSwgUG9zKDEsIGRvYy5sZW5ndGgpLCBQb3MoMSwgZG9jLmxlbmd0aCAtIDEpXSwKICAgICAgICAgIGZ1bmN0aW9uKHBvcykgewogICAgdmFyIGNvb3JkcyA9IGNtLmNoYXJDb29yZHMocG9zKTsKICAgIGVxUG9zKHBvcywgY20uY29vcmRzQ2hhcih7bGVmdDogY29vcmRzLmxlZnQgKyAyLCB0b3A6IGNvb3Jkcy50b3AgKyA1fSkpOwogIH0pOwp9LCBudWxsLCBpZV9sdDgpOwoKdGVzdENNKCJtZWFzdXJlRW5kT2ZMaW5lIiwgZnVuY3Rpb24oY20pIHsKICBjbS5zZXRTaXplKG51bGwsICJhdXRvIik7CiAgdmFyIGlubmVyID0gYnlDbGFzc05hbWUoY20uZ2V0V3JhcHBlckVsZW1lbnQoKSwgIkNvZGVNaXJyb3ItbGluZXMiKVswXS5maXJzdENoaWxkOwogIHZhciBsaCA9IGlubmVyLm9mZnNldEhlaWdodDsKICBmb3IgKHZhciBzdGVwID0gMTAsIHcgPSBjbS5jaGFyQ29vcmRzKFBvcygwLCA3KSwgImRpdiIpLnJpZ2h0OzsgdyArPSBzdGVwKSB7CiAgICBjbS5zZXRTaXplKHcpOwogICAgaWYgKGlubmVyLm9mZnNldEhlaWdodCA8IDIuNSAqIGxoKSB7CiAgICAgIGlmIChzdGVwID09IDEwKSB7IHcgLT0gMTA7IHN0ZXAgPSAxOyB9CiAgICAgIGVsc2UgYnJlYWs7CiAgICB9CiAgfQogIGNtLnNldFZhbHVlKGNtLmdldFZhbHVlKCkgKyAiXG5cbiIpOwogIHZhciBlbmRQb3MgPSBjbS5jaGFyQ29vcmRzKFBvcygwLCAxOCksICJsb2NhbCIpOwogIGlzKGVuZFBvcy50b3AgPiBsaCAqIC44LCAibm90IGF0IHRvcCIpOwogIGlzKGVuZFBvcy5sZWZ0ID4gdyAtIDIwLCAibm90IGF0IHJpZ2h0Iik7CiAgZW5kUG9zID0gY20uY2hhckNvb3JkcyhQb3MoMCwgMTgpKTsKICBlcVBvcyhjbS5jb29yZHNDaGFyKHtsZWZ0OiBlbmRQb3MubGVmdCwgdG9wOiBlbmRQb3MudG9wICsgNX0pLCBQb3MoMCwgMTgpKTsKfSwge21vZGU6ICJ0ZXh0L2h0bWwiLCB2YWx1ZTogIjwhLS0gZm9vIGJhcnJyIC0tPiIsIGxpbmVXcmFwcGluZzogdHJ1ZX0sIGllX2x0OCB8fCBvcGVyYV9sdDEwKTsKCnRlc3RDTSgic2Nyb2xsVmVydGljYWxseUFuZEhvcml6b250YWxseSIsIGZ1bmN0aW9uKGNtKSB7CiAgY20uc2V0U2l6ZSgxMDAsIDEwMCk7CiAgYWRkRG9jKGNtLCA0MCwgNDApOwogIGNtLnNldEN1cnNvcigzOSk7CiAgdmFyIHdyYXAgPSBjbS5nZXRXcmFwcGVyRWxlbWVudCgpLCBiYXIgPSBieUNsYXNzTmFtZSh3cmFwLCAiQ29kZU1pcnJvci12c2Nyb2xsYmFyIilbMF07CiAgaXMoYmFyLm9mZnNldEhlaWdodCA8IHdyYXAub2Zmc2V0SGVpZ2h0LCAidmVydGljYWwgc2Nyb2xsYmFyIGxpbWl0ZWQgYnkgaG9yaXpvbnRhbCBvbmUiKTsKICB2YXIgY3Vyc29yQm94ID0gYnlDbGFzc05hbWUod3JhcCwgIkNvZGVNaXJyb3ItY3Vyc29yIilbMF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgdmFyIGVkaXRvckJveCA9IHdyYXAuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgaXMoY3Vyc29yQm94LmJvdHRvbSA8IGVkaXRvckJveC50b3AgKyBjbS5nZXRTY3JvbGxlckVsZW1lbnQoKS5jbGllbnRIZWlnaHQsCiAgICAgImJvdHRvbSBsaW5lIHZpc2libGUiKTsKfSwge2xpbmVOdW1iZXJzOiB0cnVlfSk7Cgp0ZXN0Q00oIm1vdmVWc3R1Y2siLCBmdW5jdGlvbihjbSkgewogIHZhciBsaW5lcyA9IGJ5Q2xhc3NOYW1lKGNtLmdldFdyYXBwZXJFbGVtZW50KCksICJDb2RlTWlycm9yLWxpbmVzIilbMF0uZmlyc3RDaGlsZCwgaDAgPSBsaW5lcy5vZmZzZXRIZWlnaHQ7CiAgdmFyIHZhbCA9ICJmb29vb29vb29vb29vb29vb29vb29vb29vbyBiYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhclxuIjsKICBjbS5zZXRWYWx1ZSh2YWwpOwogIGZvciAodmFyIHcgPSBjbS5jaGFyQ29vcmRzKFBvcygwLCAyNiksICJkaXYiKS5yaWdodCAqIDIuODs7IHcgKz0gNSkgewogICAgY20uc2V0U2l6ZSh3KTsKICAgIGlmIChsaW5lcy5vZmZzZXRIZWlnaHQgPD0gMy41ICogaDApIGJyZWFrOwogIH0KICBjbS5zZXRDdXJzb3IoUG9zKDAsIHZhbC5sZW5ndGggLSAxKSk7CiAgY20ubW92ZVYoLTEsICJsaW5lIik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygwLCAyNikpOwp9LCB7bGluZVdyYXBwaW5nOiB0cnVlfSwgaWVfbHQ4IHx8IG9wZXJhX2x0MTApOwoKdGVzdENNKCJjb2xsYXBzZU9uTW92ZSIsIGZ1bmN0aW9uKGNtKSB7CiAgY20uc2V0U2VsZWN0aW9uKFBvcygwLCAxKSwgUG9zKDIsIDQpKTsKICBjbS5leGVjQ29tbWFuZCgiZ29MaW5lVXAiKTsKICBpcyghY20uc29tZXRoaW5nU2VsZWN0ZWQoKSk7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygwLCAxKSk7CiAgY20uc2V0U2VsZWN0aW9uKFBvcygwLCAxKSwgUG9zKDIsIDQpKTsKICBjbS5leGVjQ29tbWFuZCgiZ29QYWdlRG93biIpOwogIGlzKCFjbS5zb21ldGhpbmdTZWxlY3RlZCgpKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDIsIDQpKTsKICBjbS5leGVjQ29tbWFuZCgiZ29MaW5lVXAiKTsKICBjbS5leGVjQ29tbWFuZCgiZ29MaW5lVXAiKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDAsIDQpKTsKICBjbS5zZXRTZWxlY3Rpb24oUG9zKDAsIDEpLCBQb3MoMiwgNCkpOwogIGNtLmV4ZWNDb21tYW5kKCJnb0NoYXJMZWZ0Iik7CiAgaXMoIWNtLnNvbWV0aGluZ1NlbGVjdGVkKCkpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoMCwgMSkpOwp9LCB7dmFsdWU6ICJhYWFhYVxuYlxuY2NjY2MifSk7Cgp0ZXN0Q00oImNsaWNrVGFiIiwgZnVuY3Rpb24oY20pIHsKICB2YXIgcDAgPSBjbS5jaGFyQ29vcmRzKFBvcygwLCAwKSk7CiAgZXFQb3MoY20uY29vcmRzQ2hhcih7bGVmdDogcDAubGVmdCArIDUsIHRvcDogcDAudG9wICsgNX0pLCBQb3MoMCwgMCkpOwogIGVxUG9zKGNtLmNvb3Jkc0NoYXIoe2xlZnQ6IHAwLnJpZ2h0IC0gNSwgdG9wOiBwMC50b3AgKyA1fSksIFBvcygwLCAxKSk7Cn0sIHt2YWx1ZTogIlx0XG5cbiIsIGxpbmVXcmFwcGluZzogdHJ1ZSwgdGFiU2l6ZTogOH0pOwoKdGVzdENNKCJ2ZXJ0aWNhbFNjcm9sbCIsIGZ1bmN0aW9uKGNtKSB7CiAgY20uc2V0U2l6ZSgxMDAsIDIwMCk7CiAgY20uc2V0VmFsdWUoImZvb1xuYmFyXG5iYXpcbiIpOwogIHZhciBzYyA9IGNtLmdldFNjcm9sbGVyRWxlbWVudCgpLCBiYXNlV2lkdGggPSBzYy5zY3JvbGxXaWR0aDsKICBjbS5yZXBsYWNlUmFuZ2UoImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWgiLCBQb3MoMCwgMCksIFBvcygwKSk7CiAgaXMoc2Muc2Nyb2xsV2lkdGggPiBiYXNlV2lkdGgsICJzY3JvbGxiYXIgcHJlc2VudCIpOwogIGNtLnJlcGxhY2VSYW5nZSgiZm9vIiwgUG9zKDAsIDApLCBQb3MoMCkpOwogIGlmICghcGhhbnRvbSkgZXEoc2Muc2Nyb2xsV2lkdGgsIGJhc2VXaWR0aCwgInNjcm9sbGJhciBnb25lIik7CiAgY20ucmVwbGFjZVJhbmdlKCJhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFoIiwgUG9zKDAsIDApLCBQb3MoMCkpOwogIGNtLnJlcGxhY2VSYW5nZSgiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJoIiwgUG9zKDEsIDApLCBQb3MoMSkpOwogIGlzKHNjLnNjcm9sbFdpZHRoID4gYmFzZVdpZHRoLCAicHJlc2VudCBhZ2FpbiIpOwogIHZhciBjdXJXaWR0aCA9IHNjLnNjcm9sbFdpZHRoOwogIGNtLnJlcGxhY2VSYW5nZSgiZm9vIiwgUG9zKDAsIDApLCBQb3MoMCkpOwogIGlzKHNjLnNjcm9sbFdpZHRoIDwgY3VyV2lkdGgsICJzY3JvbGxiYXIgc21hbGxlciIpOwogIGlzKHNjLnNjcm9sbFdpZHRoID4gYmFzZVdpZHRoLCAiYnV0IHN0aWxsIHByZXNlbnQiKTsKfSk7Cgp0ZXN0Q00oImV4dHJhS2V5cyIsIGZ1bmN0aW9uKGNtKSB7CiAgdmFyIG91dGNvbWU7CiAgZnVuY3Rpb24gZmFrZUtleShleHBlY3RlZCwgY29kZSwgcHJvcHMpIHsKICAgIGlmICh0eXBlb2YgY29kZSA9PSAic3RyaW5nIikgY29kZSA9IGNvZGUuY2hhckNvZGVBdCgwKTsKICAgIHZhciBlID0ge3R5cGU6ICJrZXlkb3duIiwga2V5Q29kZTogY29kZSwgcHJldmVudERlZmF1bHQ6IGZ1bmN0aW9uKCl7fSwgc3RvcFByb3BhZ2F0aW9uOiBmdW5jdGlvbigpe319OwogICAgaWYgKHByb3BzKSBmb3IgKHZhciBuIGluIHByb3BzKSBlW25dID0gcHJvcHNbbl07CiAgICBvdXRjb21lID0gbnVsbDsKICAgIGNtLnRyaWdnZXJPbktleURvd24oZSk7CiAgICBlcShvdXRjb21lLCBleHBlY3RlZCk7CiAgfQogIENvZGVNaXJyb3IuY29tbWFuZHMudGVzdENvbW1hbmQgPSBmdW5jdGlvbigpIHtvdXRjb21lID0gInRjIjt9OwogIENvZGVNaXJyb3IuY29tbWFuZHMuZ29UZXN0Q29tbWFuZCA9IGZ1bmN0aW9uKCkge291dGNvbWUgPSAiZ3RjIjt9OwogIGNtLnNldE9wdGlvbigiZXh0cmFLZXlzIiwgeyJTaGlmdC1YIjogZnVuY3Rpb24oKSB7b3V0Y29tZSA9ICJzeCI7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiWCI6IGZ1bmN0aW9uKCkge291dGNvbWUgPSAieCI7fSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ3RybC1BbHQtVSI6IGZ1bmN0aW9uKCkge291dGNvbWUgPSAiY2F1Ijt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFbmQiOiAidGVzdENvbW1hbmQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJIb21lIjogImdvVGVzdENvbW1hbmQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUYWIiOiBmYWxzZX0pOwogIGZha2VLZXkobnVsbCwgIlUiKTsKICBmYWtlS2V5KCJjYXUiLCAiVSIsIHtjdHJsS2V5OiB0cnVlLCBhbHRLZXk6IHRydWV9KTsKICBmYWtlS2V5KG51bGwsICJVIiwge3NoaWZ0S2V5OiB0cnVlLCBjdHJsS2V5OiB0cnVlLCBhbHRLZXk6IHRydWV9KTsKICBmYWtlS2V5KCJ4IiwgIlgiKTsKICBmYWtlS2V5KCJzeCIsICJYIiwge3NoaWZ0S2V5OiB0cnVlfSk7CiAgZmFrZUtleSgidGMiLCAzNSk7CiAgZmFrZUtleShudWxsLCAzNSwge3NoaWZ0S2V5OiB0cnVlfSk7CiAgZmFrZUtleSgiZ3RjIiwgMzYpOwogIGZha2VLZXkoImd0YyIsIDM2LCB7c2hpZnRLZXk6IHRydWV9KTsKICBmYWtlS2V5KG51bGwsIDkpOwp9LCBudWxsLCB3aW5kb3cub3BlcmEgJiYgbWFjKTsKCnRlc3RDTSgid29yZE1vdmVtZW50Q29tbWFuZHMiLCBmdW5jdGlvbihjbSkgewogIGNtLmV4ZWNDb21tYW5kKCJnb1dvcmRMZWZ0Iik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygwLCAwKSk7CiAgY20uZXhlY0NvbW1hbmQoImdvV29yZFJpZ2h0Iik7IGNtLmV4ZWNDb21tYW5kKCJnb1dvcmRSaWdodCIpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoMCwgNykpOwogIGNtLmV4ZWNDb21tYW5kKCJnb1dvcmRMZWZ0Iik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygwLCA1KSk7CiAgY20uZXhlY0NvbW1hbmQoImdvV29yZFJpZ2h0Iik7IGNtLmV4ZWNDb21tYW5kKCJnb1dvcmRSaWdodCIpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoMCwgMTIpKTsKICBjbS5leGVjQ29tbWFuZCgiZ29Xb3JkTGVmdCIpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoMCwgOSkpOwogIGNtLmV4ZWNDb21tYW5kKCJnb1dvcmRSaWdodCIpOyBjbS5leGVjQ29tbWFuZCgiZ29Xb3JkUmlnaHQiKTsgY20uZXhlY0NvbW1hbmQoImdvV29yZFJpZ2h0Iik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygwLCAyNCkpOwogIGNtLmV4ZWNDb21tYW5kKCJnb1dvcmRSaWdodCIpOyBjbS5leGVjQ29tbWFuZCgiZ29Xb3JkUmlnaHQiKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDEsIDkpKTsKICBjbS5leGVjQ29tbWFuZCgiZ29Xb3JkUmlnaHQiKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDEsIDEzKSk7CiAgY20uZXhlY0NvbW1hbmQoImdvV29yZFJpZ2h0Iik7IGNtLmV4ZWNDb21tYW5kKCJnb1dvcmRSaWdodCIpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoMiwgMCkpOwp9LCB7dmFsdWU6ICJ0aGlzIGlzICh0aGUpIGZpcnN0bGluZS5cbmEgZm9vMTJcdTAwZTlcdTAwZjhcdTAwZDdiYXJcbiJ9KTsKCnRlc3RDTSgiZ3JvdXBNb3ZlbWVudENvbW1hbmRzIiwgZnVuY3Rpb24oY20pIHsKICBjbS5leGVjQ29tbWFuZCgiZ29Hcm91cExlZnQiKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDAsIDApKTsKICBjbS5leGVjQ29tbWFuZCgiZ29Hcm91cFJpZ2h0Iik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygwLCA0KSk7CiAgY20uZXhlY0NvbW1hbmQoImdvR3JvdXBSaWdodCIpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoMCwgNykpOwogIGNtLmV4ZWNDb21tYW5kKCJnb0dyb3VwUmlnaHQiKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDAsIDEwKSk7CiAgY20uZXhlY0NvbW1hbmQoImdvR3JvdXBMZWZ0Iik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygwLCA3KSk7CiAgY20uZXhlY0NvbW1hbmQoImdvR3JvdXBSaWdodCIpOyBjbS5leGVjQ29tbWFuZCgiZ29Hcm91cFJpZ2h0Iik7IGNtLmV4ZWNDb21tYW5kKCJnb0dyb3VwUmlnaHQiKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDAsIDE1KSk7CiAgY20uc2V0Q3Vyc29yKFBvcygwLCAxNykpOwogIGNtLmV4ZWNDb21tYW5kKCJnb0dyb3VwTGVmdCIpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoMCwgMTYpKTsKICBjbS5leGVjQ29tbWFuZCgiZ29Hcm91cExlZnQiKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDAsIDE0KSk7CiAgY20uZXhlY0NvbW1hbmQoImdvR3JvdXBSaWdodCIpOyBjbS5leGVjQ29tbWFuZCgiZ29Hcm91cFJpZ2h0Iik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygwLCAyMCkpOwogIGNtLmV4ZWNDb21tYW5kKCJnb0dyb3VwUmlnaHQiKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDEsIDApKTsKICBjbS5leGVjQ29tbWFuZCgiZ29Hcm91cFJpZ2h0Iik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygxLCAyKSk7CiAgY20uZXhlY0NvbW1hbmQoImdvR3JvdXBSaWdodCIpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoMSwgNSkpOwogIGNtLmV4ZWNDb21tYW5kKCJnb0dyb3VwTGVmdCIpOyBjbS5leGVjQ29tbWFuZCgiZ29Hcm91cExlZnQiKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDEsIDApKTsKICBjbS5leGVjQ29tbWFuZCgiZ29Hcm91cExlZnQiKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDAsIDIwKSk7CiAgY20uZXhlY0NvbW1hbmQoImdvR3JvdXBMZWZ0Iik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygwLCAxNikpOwp9LCB7dmFsdWU6ICJib29vIGJhLS0tcXV1eC4gZmZmZlxuICBhYmMgZCJ9KTsKCnRlc3RDTSgiZ3JvdXBzQW5kV2hpdGVzcGFjZSIsIGZ1bmN0aW9uKGNtKSB7CiAgdmFyIHBvc2l0aW9ucyA9IFtQb3MoMCwgMCksIFBvcygwLCAyKSwgUG9zKDAsIDUpLCBQb3MoMCwgOSksIFBvcygwLCAxMSksCiAgICAgICAgICAgICAgICAgICBQb3MoMSwgMCksIFBvcygxLCAyKSwgUG9zKDEsIDUpXTsKICBmb3IgKHZhciBpID0gMTsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkrKykgewogICAgY20uZXhlY0NvbW1hbmQoImdvR3JvdXBSaWdodCIpOwogICAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIHBvc2l0aW9uc1tpXSk7CiAgfQogIGZvciAodmFyIGkgPSBwb3NpdGlvbnMubGVuZ3RoIC0gMjsgaSA+PSAwOyBpLS0pIHsKICAgIGNtLmV4ZWNDb21tYW5kKCJnb0dyb3VwTGVmdCIpOwogICAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIGkgPT0gMiA/IFBvcygwLCA2KSA6IHBvc2l0aW9uc1tpXSk7CiAgfQp9LCB7dmFsdWU6ICIgIGZvbyArKysgIFxuICBiYXIifSk7Cgp0ZXN0Q00oImNoYXJNb3ZlbWVudENvbW1hbmRzIiwgZnVuY3Rpb24oY20pIHsKICBjbS5leGVjQ29tbWFuZCgiZ29DaGFyTGVmdCIpOyBjbS5leGVjQ29tbWFuZCgiZ29Db2x1bW5MZWZ0Iik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygwLCAwKSk7CiAgY20uZXhlY0NvbW1hbmQoImdvQ2hhclJpZ2h0Iik7IGNtLmV4ZWNDb21tYW5kKCJnb0NoYXJSaWdodCIpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoMCwgMikpOwogIGNtLnNldEN1cnNvcihQb3MoMSwgMCkpOwogIGNtLmV4ZWNDb21tYW5kKCJnb0NvbHVtbkxlZnQiKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDEsIDApKTsKICBjbS5leGVjQ29tbWFuZCgiZ29DaGFyTGVmdCIpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoMCwgNSkpOwogIGNtLmV4ZWNDb21tYW5kKCJnb0NvbHVtblJpZ2h0Iik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygwLCA1KSk7CiAgY20uZXhlY0NvbW1hbmQoImdvQ2hhclJpZ2h0Iik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygxLCAwKSk7CiAgY20uZXhlY0NvbW1hbmQoImdvTGluZUVuZCIpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoMSwgNSkpOwogIGNtLmV4ZWNDb21tYW5kKCJnb0xpbmVTdGFydFNtYXJ0Iik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygxLCAxKSk7CiAgY20uZXhlY0NvbW1hbmQoImdvTGluZVN0YXJ0U21hcnQiKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDEsIDApKTsKICBjbS5zZXRDdXJzb3IoUG9zKDIsIDApKTsKICBjbS5leGVjQ29tbWFuZCgiZ29DaGFyUmlnaHQiKTsgY20uZXhlY0NvbW1hbmQoImdvQ29sdW1uUmlnaHQiKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDIsIDApKTsKfSwge3ZhbHVlOiAibGluZTFcbiBpbmUyXG4ifSk7Cgp0ZXN0Q00oInZlcnRpY2FsTW92ZW1lbnRDb21tYW5kcyIsIGZ1bmN0aW9uKGNtKSB7CiAgY20uZXhlY0NvbW1hbmQoImdvTGluZVVwIik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygwLCAwKSk7CiAgY20uZXhlY0NvbW1hbmQoImdvTGluZURvd24iKTsKICBpZiAoIXBoYW50b20pIC8vIFRoaXMgZmFpbHMgaW4gUGhhbnRvbUpTLCB0aG91Z2ggbm90IGluIGEgcmVhbCBXZWJraXQKICAgIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoMSwgMCkpOwogIGNtLnNldEN1cnNvcihQb3MoMSwgMTIpKTsKICBjbS5leGVjQ29tbWFuZCgiZ29MaW5lRG93biIpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoMiwgNSkpOwogIGNtLmV4ZWNDb21tYW5kKCJnb0xpbmVEb3duIik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygzLCAwKSk7CiAgY20uZXhlY0NvbW1hbmQoImdvTGluZVVwIik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygyLCA1KSk7CiAgY20uZXhlY0NvbW1hbmQoImdvTGluZVVwIik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygxLCAxMikpOwogIGNtLmV4ZWNDb21tYW5kKCJnb1BhZ2VEb3duIik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcyg1LCAwKSk7CiAgY20uZXhlY0NvbW1hbmQoImdvUGFnZURvd24iKTsgY20uZXhlY0NvbW1hbmQoImdvTGluZURvd24iKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDUsIDApKTsKICBjbS5leGVjQ29tbWFuZCgiZ29QYWdlVXAiKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDAsIDApKTsKfSwge3ZhbHVlOiAibGluZTFcbmxvbmcgbG9uZyBsaW5lMlxubGluZTNcblxubGluZTVcbiJ9KTsKCnRlc3RDTSgidmVydGljYWxNb3ZlbWVudENvbW1hbmRzV3JhcHBpbmciLCBmdW5jdGlvbihjbSkgewogIGNtLnNldFNpemUoMTIwKTsKICBjbS5zZXRDdXJzb3IoUG9zKDAsIDUpKTsKICBjbS5leGVjQ29tbWFuZCgiZ29MaW5lRG93biIpOwogIGVxKGNtLmdldEN1cnNvcigpLmxpbmUsIDApOwogIGlzKGNtLmdldEN1cnNvcigpLmNoID4gNSwgIm1vdmVkIGJleW9uZCB3cmFwIik7CiAgZm9yICh2YXIgaSA9IDA7IDsgKytpKSB7CiAgICBpcyhpIDwgMjAsICJubyBlbmRsZXNzIGxvb3AiKTsKICAgIGNtLmV4ZWNDb21tYW5kKCJnb0xpbmVEb3duIik7CiAgICB2YXIgY3VyID0gY20uZ2V0Q3Vyc29yKCk7CiAgICBpZiAoY3VyLmxpbmUgPT0gMSkgZXEoY3VyLmNoLCA1KTsKICAgIGlmIChjdXIubGluZSA9PSAyKSB7IGVxKGN1ci5jaCwgMSk7IGJyZWFrOyB9CiAgfQp9LCB7dmFsdWU6ICJhIHZlcnkgbG9uZyBsaW5lIHRoYXQgd3JhcHMgYXJvdW5kIHNvbWVob3cgc28gdGhhdCB3ZSBjYW4gdGVzdCBjdXJzb3IgbW92ZW1lbnRcbnNob3J0b25lXG5rIiwKICAgIGxpbmVXcmFwcGluZzogdHJ1ZX0pOwoKdGVzdENNKCJydGxNb3ZlbWVudCIsIGZ1bmN0aW9uKGNtKSB7CiAgZm9yRWFjaChbItiu2K3YrCIsICLYrtitYWJj2K7YrdisIiwgImFi2K7Yrdiu2K3YrGNkIiwgImFi2K5kZSIsICJhYtiu2K0yMzQy2K4x2K3YrCIsICLYrjHYrTLYrtitM9iteNisIiwKICAgICAgICAgICAi2K7YrWNkIiwgIjHYrtitY2QiLCAiYWJjZGXYrTHYrCIsICLYrtmF2LHYrdio2YfYpyDZhdmH2KchIiwgImZvb2JhctixIiwgItiuINipINmCIiwKICAgICAgICAgICAiPGltZyBzcmM9XCIv15HXk9eZ16fXlDMuanBnXCI+Il0sIGZ1bmN0aW9uKGxpbmUpIHsKICAgIHZhciBpbnYgPSBsaW5lLmNoYXJBdCgwKSA9PSAi2K4iOwogICAgY20uc2V0VmFsdWUobGluZSArICJcbiIpOyBjbS5leGVjQ29tbWFuZChpbnYgPyAiZ29MaW5lRW5kIiA6ICJnb0xpbmVTdGFydCIpOwogICAgdmFyIGN1cnNvcnMgPSBieUNsYXNzTmFtZShjbS5nZXRXcmFwcGVyRWxlbWVudCgpLCAiQ29kZU1pcnJvci1jdXJzb3JzIilbMF07CiAgICB2YXIgY3Vyc29yID0gY3Vyc29ycy5maXJzdENoaWxkOwogICAgdmFyIHByZXZYID0gY3Vyc29yLm9mZnNldExlZnQsIHByZXZZID0gY3Vyc29yLm9mZnNldFRvcDsKICAgIGZvciAodmFyIGkgPSAwOyBpIDw9IGxpbmUubGVuZ3RoOyArK2kpIHsKICAgICAgY20uZXhlY0NvbW1hbmQoImdvQ2hhclJpZ2h0Iik7CiAgICAgIGN1cnNvciA9IGN1cnNvcnMuZmlyc3RDaGlsZDsKICAgICAgaWYgKGkgPT0gbGluZS5sZW5ndGgpIGlzKGN1cnNvci5vZmZzZXRUb3AgPiBwcmV2WSwgIm5leHQgbGluZSIpOwogICAgICBlbHNlIGlzKGN1cnNvci5vZmZzZXRMZWZ0ID4gcHJldlgsICJtb3ZlZCByaWdodCIpOwogICAgICBwcmV2WCA9IGN1cnNvci5vZmZzZXRMZWZ0OyBwcmV2WSA9IGN1cnNvci5vZmZzZXRUb3A7CiAgICB9CiAgICBjbS5zZXRDdXJzb3IoMCwgMCk7IGNtLmV4ZWNDb21tYW5kKGludiA/ICJnb0xpbmVTdGFydCIgOiAiZ29MaW5lRW5kIik7CiAgICBwcmV2WCA9IGN1cnNvcnMuZmlyc3RDaGlsZC5vZmZzZXRMZWZ0OwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW5lLmxlbmd0aDsgKytpKSB7CiAgICAgIGNtLmV4ZWNDb21tYW5kKCJnb0NoYXJMZWZ0Iik7CiAgICAgIGN1cnNvciA9IGN1cnNvcnMuZmlyc3RDaGlsZDsKICAgICAgaXMoY3Vyc29yLm9mZnNldExlZnQgPCBwcmV2WCwgIm1vdmVkIGxlZnQiKTsKICAgICAgcHJldlggPSBjdXJzb3Iub2Zmc2V0TGVmdDsKICAgIH0KICB9KTsKfSwgbnVsbCwgaWVfbHQ5KTsKCi8vIFZlcmlmeSB0aGF0IHVwZGF0aW5nIGEgbGluZSBjbGVhcnMgaXRzIGJpZGkgb3JkZXJpbmcKdGVzdENNKCJiaWRpVXBkYXRlIiwgZnVuY3Rpb24oY20pIHsKICBjbS5zZXRDdXJzb3IoUG9zKDAsIDIpKTsKICBjbS5yZXBsYWNlU2VsZWN0aW9uKCLYrtit2KwiLCAic3RhcnQiKTsKICBjbS5leGVjQ29tbWFuZCgiZ29DaGFyUmlnaHQiKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDAsIDQpKTsKfSwge3ZhbHVlOiAiYWJjZFxuIn0pOwoKdGVzdENNKCJtb3ZlYnlUZXh0VW5pdCIsIGZ1bmN0aW9uKGNtKSB7CiAgY20uc2V0VmFsdWUoIteR1rDWvNeo1rXXkNep1rRcbmXMgWXMgWXMgcyBXG4iKTsKICBjbS5leGVjQ29tbWFuZCgiZ29MaW5lRW5kIik7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCA0OyArK2kpIGNtLmV4ZWNDb21tYW5kKCJnb0NoYXJSaWdodCIpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoMCwgMCkpOwogIGNtLmV4ZWNDb21tYW5kKCJnb0NoYXJSaWdodCIpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoMSwgMCkpOwogIGNtLmV4ZWNDb21tYW5kKCJnb0NoYXJSaWdodCIpOwogIGNtLmV4ZWNDb21tYW5kKCJnb0NoYXJSaWdodCIpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoMSwgNCkpOwogIGNtLmV4ZWNDb21tYW5kKCJnb0NoYXJSaWdodCIpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoMSwgNykpOwp9KTsKCnRlc3RDTSgibGluZUNoYW5nZUV2ZW50cyIsIGZ1bmN0aW9uKGNtKSB7CiAgYWRkRG9jKGNtLCAzLCA1KTsKICB2YXIgbG9nID0gW10sIHdhbnQgPSBbImNoIDAiLCAiY2ggMSIsICJkZWwgMiIsICJjaCAwIiwgImNoIDAiLCAiZGVsIDEiLCAiZGVsIDMiLCAiZGVsIDQiXTsKICBmb3IgKHZhciBpID0gMDsgaSA8IDU7ICsraSkgewogICAgQ29kZU1pcnJvci5vbihjbS5nZXRMaW5lSGFuZGxlKGkpLCAiZGVsZXRlIiwgZnVuY3Rpb24oaSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7bG9nLnB1c2goImRlbCAiICsgaSk7fTsKICAgIH0oaSkpOwogICAgQ29kZU1pcnJvci5vbihjbS5nZXRMaW5lSGFuZGxlKGkpLCAiY2hhbmdlIiwgZnVuY3Rpb24oaSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7bG9nLnB1c2goImNoICIgKyBpKTt9OwogICAgfShpKSk7CiAgfQogIGNtLnJlcGxhY2VSYW5nZSgieCIsIFBvcygwLCAxKSk7CiAgY20ucmVwbGFjZVJhbmdlKCJ4eSIsIFBvcygxLCAxKSwgUG9zKDIpKTsKICBjbS5yZXBsYWNlUmFuZ2UoImZvb1xuYmFyIiwgUG9zKDAsIDEpKTsKICBjbS5yZXBsYWNlUmFuZ2UoIiIsIFBvcygwLCAwKSwgUG9zKGNtLmxpbmVDb3VudCgpKSk7CiAgZXEobG9nLmxlbmd0aCwgd2FudC5sZW5ndGgsICJzYW1lIGxlbmd0aCIpOwogIGZvciAodmFyIGkgPSAwOyBpIDwgbG9nLmxlbmd0aDsgKytpKQogICAgZXEobG9nW2ldLCB3YW50W2ldKTsKfSk7Cgp0ZXN0Q00oInNjcm9sbEVudGlyZWx5VG9SaWdodCIsIGZ1bmN0aW9uKGNtKSB7CiAgaWYgKHBoYW50b20pIHJldHVybjsKICBhZGREb2MoY20sIDUwMCwgMik7CiAgY20uc2V0Q3Vyc29yKFBvcygwLCA1MDApKTsKICB2YXIgd3JhcCA9IGNtLmdldFdyYXBwZXJFbGVtZW50KCksIGN1ciA9IGJ5Q2xhc3NOYW1lKHdyYXAsICJDb2RlTWlycm9yLWN1cnNvciIpWzBdOwogIGlzKHdyYXAuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkucmlnaHQgPiBjdXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCk7Cn0pOwoKdGVzdENNKCJsaW5lV2lkZ2V0cyIsIGZ1bmN0aW9uKGNtKSB7CiAgYWRkRG9jKGNtLCA1MDAsIDMpOwogIHZhciBsYXN0ID0gY20uY2hhckNvb3JkcyhQb3MoMiwgMCkpOwogIHZhciBub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgbm9kZS5pbm5lckhUTUwgPSAiaGkiOwogIHZhciB3aWRnZXQgPSBjbS5hZGRMaW5lV2lkZ2V0KDEsIG5vZGUpOwogIGlzKGxhc3QudG9wIDwgY20uY2hhckNvb3JkcyhQb3MoMiwgMCkpLnRvcCwgInRvb2sgdXAgc3BhY2UiKTsKICBjbS5zZXRDdXJzb3IoUG9zKDEsIDEpKTsKICBjbS5leGVjQ29tbWFuZCgiZ29MaW5lRG93biIpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoMiwgMSkpOwogIGNtLmV4ZWNDb21tYW5kKCJnb0xpbmVVcCIpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoMSwgMSkpOwp9KTsKCnRlc3RDTSgibGluZVdpZGdldEZvY3VzIiwgZnVuY3Rpb24oY20pIHsKICB2YXIgcGxhY2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidGVzdGdyb3VuZCIpOwogIHBsYWNlLmNsYXNzTmFtZSA9ICJvZmZzY3JlZW4iOwogIHRyeSB7CiAgICBhZGREb2MoY20sIDUwMCwgMTApOwogICAgdmFyIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJpbnB1dCIpOwogICAgdmFyIHdpZGdldCA9IGNtLmFkZExpbmVXaWRnZXQoMSwgbm9kZSk7CiAgICBub2RlLmZvY3VzKCk7CiAgICBlcShkb2N1bWVudC5hY3RpdmVFbGVtZW50LCBub2RlKTsKICAgIGNtLnJlcGxhY2VSYW5nZSgibmV3IHN0dWZmIiwgUG9zKDEsIDApKTsKICAgIGVxKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQsIG5vZGUpOwogIH0gZmluYWxseSB7CiAgICBwbGFjZS5jbGFzc05hbWUgPSAiIjsKICB9Cn0pOwoKdGVzdENNKCJsaW5lV2lkZ2V0Q2F1dGlvdXNSZWRyYXciLCBmdW5jdGlvbihjbSkgewogIHZhciBub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgbm9kZS5pbm5lckhUTUwgPSAiaGFoYWgiOwogIHZhciB3ID0gY20uYWRkTGluZVdpZGdldCgwLCBub2RlKTsKICB2YXIgcmVkcmF3biA9IGZhbHNlOwogIHcub24oInJlZHJhdyIsIGZ1bmN0aW9uKCkgeyByZWRyYXduID0gdHJ1ZTsgfSk7CiAgY20ucmVwbGFjZVNlbGVjdGlvbigiMCIpOwogIGlzKCFyZWRyYXduKTsKfSwge3ZhbHVlOiAiMTIzXG40NTYifSk7CgoKdmFyIGtub3duU2Nyb2xsYmFyV2lkdGg7CmZ1bmN0aW9uIHNjcm9sbGJhcldpZHRoKG1lYXN1cmUpIHsKICBpZiAoa25vd25TY3JvbGxiYXJXaWR0aCAhPSBudWxsKSByZXR1cm4ga25vd25TY3JvbGxiYXJXaWR0aDsKICB2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgZGl2LnN0eWxlLmNzc1RleHQgPSAid2lkdGg6IDUwcHg7IGhlaWdodDogNTBweDsgb3ZlcmZsb3cteDogc2Nyb2xsIjsKICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGRpdik7CiAga25vd25TY3JvbGxiYXJXaWR0aCA9IGRpdi5vZmZzZXRIZWlnaHQgLSBkaXYuY2xpZW50SGVpZ2h0OwogIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZGl2KTsKICByZXR1cm4ga25vd25TY3JvbGxiYXJXaWR0aCB8fCAwOwp9Cgp0ZXN0Q00oImxpbmVXaWRnZXRDaGFuZ2VkIiwgZnVuY3Rpb24oY20pIHsKICBhZGREb2MoY20sIDIsIDMwMCk7CiAgdmFyIGhhbGZTY3JvbGxiYXJXaWR0aCA9IHNjcm9sbGJhcldpZHRoKGNtLmRpc3BsYXkubWVhc3VyZSkvMjsKICBjbS5zZXRPcHRpb24oJ2xpbmVOdW1iZXJzJywgdHJ1ZSk7CiAgY20uc2V0U2l6ZSg2MDAsIGNtLmRlZmF1bHRUZXh0SGVpZ2h0KCkgKiA1MCk7CiAgY20uc2Nyb2xsVG8obnVsbCwgY20uaGVpZ2h0QXRMaW5lKDEyNSwgImxvY2FsIikpOwoKICB2YXIgZXhwZWN0ZWRXaWRnZXRIZWlnaHQgPSA2MDsKICB2YXIgZXhwZWN0ZWRMaW5lc0luV2lkZ2V0ID0gMzsKICBmdW5jdGlvbiB3KCkgewogICAgdmFyIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgIC8vIHdlIHVzZSB0aGVzZSBjaGlsZHJlbiB3aXRoIGp1c3QgdW5kZXIgaGFsZiB3aWR0aCBvZiB0aGUgbGluZSB0byBjaGVjayBtZWFzdXJlbWVudHMgYXJlIG1hZGUgd2l0aCBjb3JyZWN0IHdpZHRoCiAgICAvLyB3aGVuIHBsYWNlZCBpbiB0aGUgbWVhc3VyZSBkaXYuCiAgICAvLyBJZiB0aGUgd2lkZ2V0IGlzIG1lYXN1cmVkIGF0IGEgd2lkdGggbXVjaCBuYXJyb3dlciB0aGFuIGl0IGlzIGRpc3BsYXllZCBhdCwgdGhlIHVuZGVySGFsZiBjaGlsZHJlbiB3aWxsIHNwYW4gdHdvIGxpbmVzIGFuZCBicmVhayB0aGUgdGVzdC4KICAgIC8vIElmIHRoZSB3aWRnZXQgaXMgbWVhc3VyZWQgYXQgYSB3aWR0aCBtdWNoIHdpZGVyIHRoYW4gaXQgaXMgZGlzcGxheWVkIGF0LCB0aGUgb3ZlckhhbGYgY2hpbGRyZW4gd2lsbCBjb21iaW5lIGFuZCBicmVhayB0aGUgdGVzdC4KICAgIC8vIE5vdGUgdGhhdCB0aGlzIHRlc3Qgb25seSBjaGVja3Mgd2lkZ2V0cyB3aGVyZSBjb3Zlckd1dHRlciBpcyB0cnVlLCBiZWNhdXNlIHRoZXNlIHJlcXVpcmUgZXh0cmEgc3R5bGluZyB0byBnZXQgdGhlIHdpZHRoIHJpZ2h0LgogICAgLy8gSXQgbWF5IGFsc28gYmUgd29ydGh3aGlsZSB0byBjaGVjayB0aGlzIGZvciBub24tY292ZXJHdXR0ZXIgd2lkZ2V0cy4KICAgIC8vIFZpc3VhbGx5OgogICAgLy8gR29vZDoKICAgIC8vIHwgLS0tLS0tLS0tLS0tLSBkaXNwbGF5IHdpZHRoIC0tLS0tLS0tLS0tLS0gfAogICAgLy8gfCAtLS0tLS0tIHdpZGdldC13aWR0aCB3aGVuIG1lYXN1cmVkIC0tLS0tLSB8CiAgICAvLyB8IHwgLS0gdW5kZXItaGFsZiAtLSB8IHwgLS0gdW5kZXItaGFsZiAtLSB8IHwgCiAgICAvLyB8IHwgLS0tIG92ZXItaGFsZiAtLS0gfCAgICAgICAgICAgICAgICAgICAgIHwKICAgIC8vIHwgfCAtLS0gb3Zlci1oYWxmIC0tLSB8ICAgICAgICAgICAgICAgICAgICAgfAogICAgLy8gSGVpZ2h0OiBtZWFzdXJlZCBhcyAzIGxpbmVzLCBzYW1lIGFzIGl0IHdpbGwgYmUgd2hlbiBhY3R1YWxseSBkaXNwbGF5ZWQKCiAgICAvLyBCYWQgKHRvbyBuYXJyb3cpOgogICAgLy8gfCAtLS0tLS0tLS0tLS0tIGRpc3BsYXkgd2lkdGggLS0tLS0tLS0tLS0tLSB8CiAgICAvLyB8IC0tLS0tLSB3aWRnZXQtd2lkdGggd2hlbiBtZWFzdXJlZCAtLS0tLSB8ICA8IC0tIHVoIG9oCiAgICAvLyB8IHwgLS0gdW5kZXItaGFsZiAtLSB8ICAgICAgICAgICAgICAgICAgICB8CiAgICAvLyB8IHwgLS0gdW5kZXItaGFsZiAtLSB8ICAgICAgICAgICAgICAgICAgICB8ICA8IC0tIHdoZW4gbWVhc3VyZWQsIHNob3ZlZCB0byBuZXh0IGxpbmUKICAgIC8vIHwgfCAtLS0gb3Zlci1oYWxmIC0tLSB8ICAgICAgICAgICAgICAgICAgIHwKICAgIC8vIHwgfCAtLS0gb3Zlci1oYWxmIC0tLSB8ICAgICAgICAgICAgICAgICAgIHwKICAgIC8vIEhlaWdodDogbWVhc3VyZWQgYXMgNCBsaW5lcywgbW9yZSB0aGFuIGV4cGVjdGVkIC4gV2lsbCBiZSBkaXNwbGF5ZWQgYXMgMyBsaW5lcyEKCiAgICAvLyBCYWQgKHRvbyB3aWRlKToKICAgIC8vIHwgLS0tLS0tLS0tLS0tLSBkaXNwbGF5IHdpZHRoIC0tLS0tLS0tLS0tLS0gfAogICAgLy8gfCAtLS0tLS0tLSB3aWRnZXQtd2lkdGggd2hlbiBtZWFzdXJlZCAtLS0tLS0tIHwgPCAtLSB1aCBvaAogICAgLy8gfCB8IC0tIHVuZGVyLWhhbGYgLS0gfCB8IC0tIHVuZGVyLWhhbGYgLS0gfCAgIHwgCiAgICAvLyB8IHwgLS0tIG92ZXItaGFsZiAtLS0gfCB8IC0tLSBvdmVyLWhhbGYgLS0tIHwgfCA8IC0tIHdoZW4gbWVhc3VyZWQsIGNvbWJpbmVkIG9uIG9uZSBsaW5lCiAgICAvLyBIZWlnaHQ6IG1lYXN1cmVkIGFzIDIgbGluZXMsIGxlc3MgdGhhbiBleHBlY3RlZC4gV2lsbCBiZSBkaXNwbGF5ZWQgYXMgMyBsaW5lcyEKCiAgICB2YXIgYmFyZWx5VW5kZXJIYWxmV2lkdGhIdG1sID0gJzxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgaGVpZ2h0OiAxcHg7IHdpZHRoOiAnKygyODUgLSBoYWxmU2Nyb2xsYmFyV2lkdGgpKydweDsiPjwvZGl2Pic7CiAgICB2YXIgYmFyZWx5T3ZlckhhbGZXaWR0aEh0bWwgPSAnPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyBoZWlnaHQ6IDFweDsgd2lkdGg6ICcrKDMwNSAtIGhhbGZTY3JvbGxiYXJXaWR0aCkrJ3B4OyI+PC9kaXY+JzsKICAgIG5vZGUuaW5uZXJIVE1MID0gbmV3IEFycmF5KDMpLmpvaW4oYmFyZWx5VW5kZXJIYWxmV2lkdGhIdG1sKSArIG5ldyBBcnJheSgzKS5qb2luKGJhcmVseU92ZXJIYWxmV2lkdGhIdG1sKTsKICAgIG5vZGUuc3R5bGUuY3NzVGV4dCA9ICJiYWNrZ3JvdW5kOiB5ZWxsb3c7Zm9udC1zaXplOjA7bGluZS1oZWlnaHQ6ICIgKyAoZXhwZWN0ZWRXaWRnZXRIZWlnaHQvZXhwZWN0ZWRMaW5lc0luV2lkZ2V0KSArICJweDsiOwogICAgcmV0dXJuIG5vZGU7CiAgfQogIHZhciBpbmZvMCA9IGNtLmdldFNjcm9sbEluZm8oKTsKICB2YXIgdzAgPSBjbS5hZGRMaW5lV2lkZ2V0KDAsIHcoKSwgeyBjb3Zlckd1dHRlcjogdHJ1ZSB9KTsKICB2YXIgdzE1MCA9IGNtLmFkZExpbmVXaWRnZXQoMTUwLCB3KCksIHsgY292ZXJHdXR0ZXI6IHRydWUgfSk7CiAgdmFyIHczMDAgPSBjbS5hZGRMaW5lV2lkZ2V0KDMwMCwgdygpLCB7IGNvdmVyR3V0dGVyOiB0cnVlIH0pOwogIHZhciBpbmZvMSA9IGNtLmdldFNjcm9sbEluZm8oKTsKICBlcShpbmZvMC5oZWlnaHQgKyAoMyAqIGV4cGVjdGVkV2lkZ2V0SGVpZ2h0KSwgaW5mbzEuaGVpZ2h0KTsKICBlcShpbmZvMC50b3AgKyBleHBlY3RlZFdpZGdldEhlaWdodCwgaW5mbzEudG9wKTsKICBleHBlY3RlZFdpZGdldEhlaWdodCA9IDEyOwogIHcwLm5vZGUuc3R5bGUubGluZUhlaWdodCA9IHcxNTAubm9kZS5zdHlsZS5saW5lSGVpZ2h0ID0gdzMwMC5ub2RlLnN0eWxlLmxpbmVIZWlnaHQgPSAoZXhwZWN0ZWRXaWRnZXRIZWlnaHQvZXhwZWN0ZWRMaW5lc0luV2lkZ2V0KSArICJweCI7CiAgdzAuY2hhbmdlZCgpOyB3MTUwLmNoYW5nZWQoKTsgdzMwMC5jaGFuZ2VkKCk7CiAgdmFyIGluZm8yID0gY20uZ2V0U2Nyb2xsSW5mbygpOwogIGVxKGluZm8wLmhlaWdodCArICgzICogZXhwZWN0ZWRXaWRnZXRIZWlnaHQpLCBpbmZvMi5oZWlnaHQpOwogIGVxKGluZm8wLnRvcCArIGV4cGVjdGVkV2lkZ2V0SGVpZ2h0LCBpbmZvMi50b3ApOwp9KTsKCnRlc3RDTSgiZ2V0TGluZU51bWJlciIsIGZ1bmN0aW9uKGNtKSB7CiAgYWRkRG9jKGNtLCAyLCAyMCk7CiAgdmFyIGgxID0gY20uZ2V0TGluZUhhbmRsZSgxKTsKICBlcShjbS5nZXRMaW5lTnVtYmVyKGgxKSwgMSk7CiAgY20ucmVwbGFjZVJhbmdlKCJoaVxuYnllXG4iLCBQb3MoMCwgMCkpOwogIGVxKGNtLmdldExpbmVOdW1iZXIoaDEpLCAzKTsKICBjbS5zZXRWYWx1ZSgiIik7CiAgZXEoY20uZ2V0TGluZU51bWJlcihoMSksIG51bGwpOwp9KTsKCnRlc3RDTSgianVtcFRoZUdhcCIsIGZ1bmN0aW9uKGNtKSB7CiAgaWYgKHBoYW50b20pIHJldHVybjsKICB2YXIgbG9uZ0xpbmUgPSAiYWJjZGVmIGdoaWtsbW5vcCBxcnN0dXZ3IHh5eiAiOwogIGxvbmdMaW5lICs9IGxvbmdMaW5lOyBsb25nTGluZSArPSBsb25nTGluZTsgbG9uZ0xpbmUgKz0gbG9uZ0xpbmU7CiAgY20ucmVwbGFjZVJhbmdlKGxvbmdMaW5lLCBQb3MoMiwgMCksIFBvcygyKSk7CiAgY20uc2V0U2l6ZSgiMjAwcHgiLCBudWxsKTsKICBjbS5nZXRXcmFwcGVyRWxlbWVudCgpLnN0eWxlLmxpbmVIZWlnaHQgPSAyOwogIGNtLnJlZnJlc2goKTsKICBjbS5zZXRDdXJzb3IoUG9zKDAsIDEpKTsKICBjbS5leGVjQ29tbWFuZCgiZ29MaW5lRG93biIpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoMSwgMSkpOwogIGNtLmV4ZWNDb21tYW5kKCJnb0xpbmVEb3duIik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygyLCAxKSk7CiAgY20uZXhlY0NvbW1hbmQoImdvTGluZURvd24iKTsKICBlcShjbS5nZXRDdXJzb3IoKS5saW5lLCAyKTsKICBpcyhjbS5nZXRDdXJzb3IoKS5jaCA+IDEpOwogIGNtLmV4ZWNDb21tYW5kKCJnb0xpbmVVcCIpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoMiwgMSkpOwogIGNtLmV4ZWNDb21tYW5kKCJnb0xpbmVVcCIpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoMSwgMSkpOwogIHZhciBub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgbm9kZS5pbm5lckhUTUwgPSAiaGkiOyBub2RlLnN0eWxlLmhlaWdodCA9ICIzMHB4IjsKICBjbS5hZGRMaW5lV2lkZ2V0KDAsIG5vZGUpOwogIGNtLmFkZExpbmVXaWRnZXQoMSwgbm9kZS5jbG9uZU5vZGUodHJ1ZSksIHthYm92ZTogdHJ1ZX0pOwogIGNtLnNldEN1cnNvcihQb3MoMCwgMikpOwogIGNtLmV4ZWNDb21tYW5kKCJnb0xpbmVEb3duIik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygxLCAyKSk7CiAgY20uZXhlY0NvbW1hbmQoImdvTGluZVVwIik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygwLCAyKSk7Cn0sIHtsaW5lV3JhcHBpbmc6IHRydWUsIHZhbHVlOiAiYWJjXG5kZWZcbmdoaVxuamtsXG4ifSk7Cgp0ZXN0Q00oImFkZExpbmVDbGFzcyIsIGZ1bmN0aW9uKGNtKSB7CiAgZnVuY3Rpb24gY2xzKGxpbmUsIHRleHQsIGJnLCB3cmFwKSB7CiAgICB2YXIgaSA9IGNtLmxpbmVJbmZvKGxpbmUpOwogICAgZXEoaS50ZXh0Q2xhc3MsIHRleHQpOwogICAgZXEoaS5iZ0NsYXNzLCBiZyk7CiAgICBlcShpLndyYXBDbGFzcywgd3JhcCk7CiAgfQogIGNtLmFkZExpbmVDbGFzcygwLCAidGV4dCIsICJmb28iKTsKICBjbS5hZGRMaW5lQ2xhc3MoMCwgInRleHQiLCAiYmFyIik7CiAgY20uYWRkTGluZUNsYXNzKDEsICJiYWNrZ3JvdW5kIiwgImJheiIpOwogIGNtLmFkZExpbmVDbGFzcygxLCAid3JhcCIsICJmb28iKTsKICBjbHMoMCwgImZvbyBiYXIiLCBudWxsLCBudWxsKTsKICBjbHMoMSwgbnVsbCwgImJheiIsICJmb28iKTsKICB2YXIgbGluZXMgPSBjbS5kaXNwbGF5LmxpbmVEaXY7CiAgZXEoYnlDbGFzc05hbWUobGluZXMsICJmb28iKS5sZW5ndGgsIDIpOwogIGVxKGJ5Q2xhc3NOYW1lKGxpbmVzLCAiYmFyIikubGVuZ3RoLCAxKTsKICBlcShieUNsYXNzTmFtZShsaW5lcywgImJheiIpLmxlbmd0aCwgMSk7CiAgY20ucmVtb3ZlTGluZUNsYXNzKDAsICJ0ZXh0IiwgImZvbyIpOwogIGNscygwLCAiYmFyIiwgbnVsbCwgbnVsbCk7CiAgY20ucmVtb3ZlTGluZUNsYXNzKDAsICJ0ZXh0IiwgImZvbyIpOwogIGNscygwLCAiYmFyIiwgbnVsbCwgbnVsbCk7CiAgY20ucmVtb3ZlTGluZUNsYXNzKDAsICJ0ZXh0IiwgImJhciIpOwogIGNscygwLCBudWxsLCBudWxsLCBudWxsKTsKICBjbS5hZGRMaW5lQ2xhc3MoMSwgIndyYXAiLCAicXV1eCIpOwogIGNscygxLCBudWxsLCAiYmF6IiwgImZvbyBxdXV4Iik7CiAgY20ucmVtb3ZlTGluZUNsYXNzKDEsICJ3cmFwIik7CiAgY2xzKDEsIG51bGwsICJiYXoiLCBudWxsKTsKfSwge3ZhbHVlOiAiaG9ob2hvXG4ifSk7Cgp0ZXN0Q00oImF0b21pY01hcmtlciIsIGZ1bmN0aW9uKGNtKSB7CiAgYWRkRG9jKGNtLCAxMCwgMTApOwogIGZ1bmN0aW9uIGF0b20obGwsIGNsLCBsciwgY3IsIGxpLCByaSkgewogICAgcmV0dXJuIGNtLm1hcmtUZXh0KFBvcyhsbCwgY2wpLCBQb3MobHIsIGNyKSwKICAgICAgICAgICAgICAgICAgICAgICB7YXRvbWljOiB0cnVlLCBpbmNsdXNpdmVMZWZ0OiBsaSwgaW5jbHVzaXZlUmlnaHQ6IHJpfSk7CiAgfQogIHZhciBtID0gYXRvbSgwLCAxLCAwLCA1KTsKICBjbS5zZXRDdXJzb3IoUG9zKDAsIDEpKTsKICBjbS5leGVjQ29tbWFuZCgiZ29DaGFyUmlnaHQiKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDAsIDUpKTsKICBjbS5leGVjQ29tbWFuZCgiZ29DaGFyTGVmdCIpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoMCwgMSkpOwogIG0uY2xlYXIoKTsKICBtID0gYXRvbSgwLCAwLCAwLCA1LCB0cnVlKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDAsIDUpLCAicHVzaGVkIG91dCIpOwogIGNtLmV4ZWNDb21tYW5kKCJnb0NoYXJMZWZ0Iik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygwLCA1KSk7CiAgbS5jbGVhcigpOwogIG0gPSBhdG9tKDgsIDQsIDksIDEwLCBmYWxzZSwgdHJ1ZSk7CiAgY20uc2V0Q3Vyc29yKFBvcyg5LCA4KSk7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcyg4LCA0KSwgInNldCIpOwogIGNtLmV4ZWNDb21tYW5kKCJnb0NoYXJSaWdodCIpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoOCwgNCksICJjaGFyIHJpZ2h0Iik7CiAgY20uZXhlY0NvbW1hbmQoImdvTGluZURvd24iKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDgsIDQpLCAibGluZSBkb3duIik7CiAgY20uZXhlY0NvbW1hbmQoImdvQ2hhckxlZnQiKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDgsIDMpKTsKICBtLmNsZWFyKCk7CiAgbSA9IGF0b20oMSwgMSwgMywgOCk7CiAgY20uc2V0Q3Vyc29yKFBvcygwLCAwKSk7CiAgY20uc2V0Q3Vyc29yKFBvcygyLCAwKSk7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygzLCA4KSk7CiAgY20uZXhlY0NvbW1hbmQoImdvQ2hhckxlZnQiKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDEsIDEpKTsKICBjbS5leGVjQ29tbWFuZCgiZ29DaGFyUmlnaHQiKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDMsIDgpKTsKICBjbS5leGVjQ29tbWFuZCgiZ29MaW5lVXAiKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDEsIDEpKTsKICBjbS5leGVjQ29tbWFuZCgiZ29MaW5lRG93biIpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoMywgOCkpOwogIGNtLmV4ZWNDb21tYW5kKCJkZWxDaGFyQmVmb3JlIik7CiAgZXEoY20uZ2V0VmFsdWUoKS5sZW5ndGgsIDgwLCAiZGVsIGNodW5rIik7CiAgbSA9IGF0b20oMywgMCwgNSwgNSk7CiAgY20uc2V0Q3Vyc29yKFBvcygzLCAwKSk7CiAgY20uZXhlY0NvbW1hbmQoImRlbFdvcmRBZnRlciIpOwogIGVxKGNtLmdldFZhbHVlKCkubGVuZ3RoLCA1MywgImRlbCBjaHVuayIpOwp9KTsKCnRlc3RDTSgic2VsZWN0aW9uQmlhcyIsIGZ1bmN0aW9uKGNtKSB7CiAgY20ubWFya1RleHQoUG9zKDAsIDEpLCBQb3MoMCwgMyksIHthdG9taWM6IHRydWV9KTsKICBjbS5zZXRDdXJzb3IoUG9zKDAsIDIpKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDAsIDMpKTsKICBjbS5zZXRDdXJzb3IoUG9zKDAsIDIpKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDAsIDEpKTsKICBjbS5zZXRDdXJzb3IoUG9zKDAsIDIpLCBudWxsLCB7YmlhczogLTF9KTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDAsIDEpKTsKICBjbS5zZXRDdXJzb3IoUG9zKDAsIDQpKTsKICBjbS5zZXRDdXJzb3IoUG9zKDAsIDIpLCBudWxsLCB7YmlhczogMX0pOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoMCwgMykpOwp9LCB7dmFsdWU6ICIxMjM0NSJ9KTsKCnRlc3RDTSgic2VsZWN0aW9uSG9tZUVuZCIsIGZ1bmN0aW9uKGNtKSB7CiAgY20ubWFya1RleHQoUG9zKDEsIDApLCBQb3MoMSwgMSksIHthdG9taWM6IHRydWUsIGluY2x1c2l2ZUxlZnQ6IHRydWV9KTsKICBjbS5tYXJrVGV4dChQb3MoMSwgMyksIFBvcygxLCA0KSwge2F0b21pYzogdHJ1ZSwgaW5jbHVzaXZlUmlnaHQ6IHRydWV9KTsKICBjbS5zZXRDdXJzb3IoUG9zKDEsIDIpKTsKICBjbS5leGVjQ29tbWFuZCgiZ29MaW5lU3RhcnQiKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDEsIDEpKTsKICBjbS5leGVjQ29tbWFuZCgiZ29MaW5lRW5kIik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygxLCAzKSk7Cn0sIHt2YWx1ZTogImFiXG5jZGVmXG5naCJ9KTsKCnRlc3RDTSgicmVhZE9ubHlNYXJrZXIiLCBmdW5jdGlvbihjbSkgewogIGZ1bmN0aW9uIG1hcmsobGwsIGNsLCBsciwgY3IsIGF0KSB7CiAgICByZXR1cm4gY20ubWFya1RleHQoUG9zKGxsLCBjbCksIFBvcyhsciwgY3IpLAogICAgICAgICAgICAgICAgICAgICAgIHtyZWFkT25seTogdHJ1ZSwgYXRvbWljOiBhdH0pOwogIH0KICB2YXIgbSA9IG1hcmsoMCwgMSwgMCwgNCk7CiAgY20uc2V0Q3Vyc29yKFBvcygwLCAyKSk7CiAgY20ucmVwbGFjZVNlbGVjdGlvbigiaGkiLCAiZW5kIik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygwLCAyKSk7CiAgZXEoY20uZ2V0TGluZSgwKSwgImFiY2RlIik7CiAgY20uZXhlY0NvbW1hbmQoInNlbGVjdEFsbCIpOwogIGNtLnJlcGxhY2VTZWxlY3Rpb24oIm9vcHMiLCAiYXJvdW5kIik7CiAgZXEoY20uZ2V0VmFsdWUoKSwgIm9vcHNiY2QiKTsKICBjbS51bmRvKCk7CiAgZXFQb3MobS5maW5kKCkuZnJvbSwgUG9zKDAsIDEpKTsKICBlcVBvcyhtLmZpbmQoKS50bywgUG9zKDAsIDQpKTsKICBtLmNsZWFyKCk7CiAgY20uc2V0Q3Vyc29yKFBvcygwLCAyKSk7CiAgY20ucmVwbGFjZVNlbGVjdGlvbigiaGkiLCAiYXJvdW5kIik7CiAgZXEoY20uZ2V0TGluZSgwKSwgImFiaGljZGUiKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDAsIDQpKTsKICBtID0gbWFyaygwLCAyLCAyLCAyLCB0cnVlKTsKICBjbS5zZXRTZWxlY3Rpb24oUG9zKDEsIDEpLCBQb3MoMiwgNCkpOwogIGNtLnJlcGxhY2VTZWxlY3Rpb24oInQiLCAiZW5kIik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygyLCAzKSk7CiAgZXEoY20uZ2V0TGluZSgyKSwgImtsdG8iKTsKICBjbS5leGVjQ29tbWFuZCgiZ29DaGFyTGVmdCIpOwogIGNtLmV4ZWNDb21tYW5kKCJnb0NoYXJMZWZ0Iik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygwLCAyKSk7CiAgY20uc2V0U2VsZWN0aW9uKFBvcygwLCAxKSwgUG9zKDAsIDMpKTsKICBjbS5yZXBsYWNlU2VsZWN0aW9uKCJ4eCIsICJhcm91bmQiKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDAsIDMpKTsKICBlcShjbS5nZXRMaW5lKDApLCAiYXh4aGljZGUiKTsKfSwge3ZhbHVlOiAiYWJjZGVcbmZnaGlqXG5rbG1ub1xuIn0pOwoKdGVzdENNKCJkaXJ0eUJpdCIsIGZ1bmN0aW9uKGNtKSB7CiAgZXEoY20uaXNDbGVhbigpLCB0cnVlKTsKICBjbS5yZXBsYWNlU2VsZWN0aW9uKCJib28iLCBudWxsLCAidGVzdCIpOwogIGVxKGNtLmlzQ2xlYW4oKSwgZmFsc2UpOwogIGNtLnVuZG8oKTsKICBlcShjbS5pc0NsZWFuKCksIHRydWUpOwogIGNtLnJlcGxhY2VTZWxlY3Rpb24oImJvbyIsIG51bGwsICJ0ZXN0Iik7CiAgY20ucmVwbGFjZVNlbGVjdGlvbigiYmF6IiwgbnVsbCwgInRlc3QiKTsKICBjbS51bmRvKCk7CiAgZXEoY20uaXNDbGVhbigpLCBmYWxzZSk7CiAgY20ubWFya0NsZWFuKCk7CiAgZXEoY20uaXNDbGVhbigpLCB0cnVlKTsKICBjbS51bmRvKCk7CiAgZXEoY20uaXNDbGVhbigpLCBmYWxzZSk7CiAgY20ucmVkbygpOwogIGVxKGNtLmlzQ2xlYW4oKSwgdHJ1ZSk7Cn0pOwoKdGVzdENNKCJjaGFuZ2VHZW5lcmF0aW9uIiwgZnVuY3Rpb24oY20pIHsKICBjbS5yZXBsYWNlU2VsZWN0aW9uKCJ4Iik7CiAgdmFyIHNvZnRHZW4gPSBjbS5jaGFuZ2VHZW5lcmF0aW9uKCk7CiAgY20ucmVwbGFjZVNlbGVjdGlvbigieCIpOwogIGNtLnVuZG8oKTsKICBlcShjbS5nZXRWYWx1ZSgpLCAiIik7CiAgaXMoIWNtLmlzQ2xlYW4oc29mdEdlbikpOwogIGNtLnJlcGxhY2VTZWxlY3Rpb24oIngiKTsKICB2YXIgaGFyZEdlbiA9IGNtLmNoYW5nZUdlbmVyYXRpb24odHJ1ZSk7CiAgY20ucmVwbGFjZVNlbGVjdGlvbigieCIpOwogIGNtLnVuZG8oKTsKICBlcShjbS5nZXRWYWx1ZSgpLCAieCIpOwogIGlzKGNtLmlzQ2xlYW4oaGFyZEdlbikpOwp9KTsKCnRlc3RDTSgiYWRkS2V5TWFwIiwgZnVuY3Rpb24oY20pIHsKICBmdW5jdGlvbiBzZW5kS2V5KGNvZGUpIHsKICAgIGNtLnRyaWdnZXJPbktleURvd24oe3R5cGU6ICJrZXlkb3duIiwga2V5Q29kZTogY29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZlbnREZWZhdWx0OiBmdW5jdGlvbigpe30sIHN0b3BQcm9wYWdhdGlvbjogZnVuY3Rpb24oKXt9fSk7CiAgfQoKICBzZW5kS2V5KDM5KTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDAsIDEpKTsKICB2YXIgdGVzdCA9IDA7CiAgdmFyIG1hcDEgPSB7UmlnaHQ6IGZ1bmN0aW9uKCkgeyArK3Rlc3Q7IH19LCBtYXAyID0ge1JpZ2h0OiBmdW5jdGlvbigpIHsgdGVzdCArPSAxMDsgfX0KICBjbS5hZGRLZXlNYXAobWFwMSk7CiAgc2VuZEtleSgzOSk7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygwLCAxKSk7CiAgZXEodGVzdCwgMSk7CiAgY20uYWRkS2V5TWFwKG1hcDIsIHRydWUpOwogIHNlbmRLZXkoMzkpOwogIGVxKHRlc3QsIDIpOwogIGNtLnJlbW92ZUtleU1hcChtYXAxKTsKICBzZW5kS2V5KDM5KTsKICBlcSh0ZXN0LCAxMik7CiAgY20ucmVtb3ZlS2V5TWFwKG1hcDIpOwogIHNlbmRLZXkoMzkpOwogIGVxKHRlc3QsIDEyKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDAsIDIpKTsKICBjbS5hZGRLZXlNYXAoe1JpZ2h0OiBmdW5jdGlvbigpIHsgdGVzdCA9IDU1OyB9LCBuYW1lOiAibXltYXAifSk7CiAgc2VuZEtleSgzOSk7CiAgZXEodGVzdCwgNTUpOwogIGNtLnJlbW92ZUtleU1hcCgibXltYXAiKTsKICBzZW5kS2V5KDM5KTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDAsIDMpKTsKfSwge3ZhbHVlOiAiYWJjIn0pOwoKdGVzdENNKCJmaW5kUG9zSCIsIGZ1bmN0aW9uKGNtKSB7CiAgZm9yRWFjaChbe2Zyb206IFBvcygwLCAwKSwgdG86IFBvcygwLCAxKSwgYnk6IDF9LAogICAgICAgICAgIHtmcm9tOiBQb3MoMCwgMCksIHRvOiBQb3MoMCwgMCksIGJ5OiAtMSwgaGl0U2lkZTogdHJ1ZX0sCiAgICAgICAgICAge2Zyb206IFBvcygwLCAwKSwgdG86IFBvcygwLCA0KSwgYnk6IDEsIHVuaXQ6ICJ3b3JkIn0sCiAgICAgICAgICAge2Zyb206IFBvcygwLCAwKSwgdG86IFBvcygwLCA4KSwgYnk6IDIsIHVuaXQ6ICJ3b3JkIn0sCiAgICAgICAgICAge2Zyb206IFBvcygwLCAwKSwgdG86IFBvcygyLCAwKSwgYnk6IDIwLCB1bml0OiAid29yZCIsIGhpdFNpZGU6IHRydWV9LAogICAgICAgICAgIHtmcm9tOiBQb3MoMCwgNyksIHRvOiBQb3MoMCwgNSksIGJ5OiAtMSwgdW5pdDogIndvcmQifSwKICAgICAgICAgICB7ZnJvbTogUG9zKDAsIDQpLCB0bzogUG9zKDAsIDgpLCBieTogMSwgdW5pdDogIndvcmQifSwKICAgICAgICAgICB7ZnJvbTogUG9zKDEsIDApLCB0bzogUG9zKDEsIDE4KSwgYnk6IDMsIHVuaXQ6ICJ3b3JkIn0sCiAgICAgICAgICAge2Zyb206IFBvcygxLCAyMiksIHRvOiBQb3MoMSwgNSksIGJ5OiAtMywgdW5pdDogIndvcmQifSwKICAgICAgICAgICB7ZnJvbTogUG9zKDEsIDE1KSwgdG86IFBvcygxLCAxMCksIGJ5OiAtNX0sCiAgICAgICAgICAge2Zyb206IFBvcygxLCAxNSksIHRvOiBQb3MoMSwgMTApLCBieTogLTUsIHVuaXQ6ICJjb2x1bW4ifSwKICAgICAgICAgICB7ZnJvbTogUG9zKDEsIDE1KSwgdG86IFBvcygxLCAwKSwgYnk6IC01MCwgdW5pdDogImNvbHVtbiIsIGhpdFNpZGU6IHRydWV9LAogICAgICAgICAgIHtmcm9tOiBQb3MoMSwgMTUpLCB0bzogUG9zKDEsIDI0KSwgYnk6IDUwLCB1bml0OiAiY29sdW1uIiwgaGl0U2lkZTogdHJ1ZX0sCiAgICAgICAgICAge2Zyb206IFBvcygxLCAxNSksIHRvOiBQb3MoMiwgMCksIGJ5OiA1MCwgaGl0U2lkZTogdHJ1ZX1dLCBmdW5jdGlvbih0KSB7CiAgICB2YXIgciA9IGNtLmZpbmRQb3NIKHQuZnJvbSwgdC5ieSwgdC51bml0IHx8ICJjaGFyIik7CiAgICBlcVBvcyhyLCB0LnRvKTsKICAgIGVxKCEhci5oaXRTaWRlLCAhIXQuaGl0U2lkZSk7CiAgfSk7Cn0sIHt2YWx1ZTogImxpbmUgb25lXG5saW5lIHR3by5zb21ldGhpbmcub3RoZXJcbiJ9KTsKCnRlc3RDTSgiYmVmb3JlQ2hhbmdlIiwgZnVuY3Rpb24oY20pIHsKICBjbS5vbigiYmVmb3JlQ2hhbmdlIiwgZnVuY3Rpb24oY20sIGNoYW5nZSkgewogICAgdmFyIHRleHQgPSBbXTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hhbmdlLnRleHQubGVuZ3RoOyArK2kpCiAgICAgIHRleHQucHVzaChjaGFuZ2UudGV4dFtpXS5yZXBsYWNlKC9ccy9nLCAiXyIpKTsKICAgIGNoYW5nZS51cGRhdGUobnVsbCwgbnVsbCwgdGV4dCk7CiAgfSk7CiAgY20uc2V0VmFsdWUoImhlbGxvLCBpIGFtIGFcbm5ldyBkb2N1bWVudFxuIik7CiAgZXEoY20uZ2V0VmFsdWUoKSwgImhlbGxvLF9pX2FtX2Fcbm5ld19kb2N1bWVudFxuIik7CiAgQ29kZU1pcnJvci5vbihjbS5nZXREb2MoKSwgImJlZm9yZUNoYW5nZSIsIGZ1bmN0aW9uKGRvYywgY2hhbmdlKSB7CiAgICBpZiAoY2hhbmdlLmZyb20ubGluZSA9PSAwKSBjaGFuZ2UuY2FuY2VsKCk7CiAgfSk7CiAgY20uc2V0VmFsdWUoIm9vcHMiKTsgLy8gQ2FuY2VsZWQKICBlcShjbS5nZXRWYWx1ZSgpLCAiaGVsbG8sX2lfYW1fYVxubmV3X2RvY3VtZW50XG4iKTsKICBjbS5yZXBsYWNlUmFuZ2UoImhleSBoZXkgaGV5IiwgUG9zKDEsIDApLCBQb3MoMiwgMCkpOwogIGVxKGNtLmdldFZhbHVlKCksICJoZWxsbyxfaV9hbV9hXG5oZXlfaGV5X2hleSIpOwp9LCB7dmFsdWU6ICJhYmNkZWZnaGlqayJ9KTsKCnRlc3RDTSgiYmVmb3JlQ2hhbmdlVW5kbyIsIGZ1bmN0aW9uKGNtKSB7CiAgY20ucmVwbGFjZVJhbmdlKCJoaSIsIFBvcygwLCAwKSwgUG9zKDApKTsKICBjbS5yZXBsYWNlUmFuZ2UoImJ5ZSIsIFBvcygwLCAwKSwgUG9zKDApKTsKICBlcShjbS5oaXN0b3J5U2l6ZSgpLnVuZG8sIDIpOwogIGNtLm9uKCJiZWZvcmVDaGFuZ2UiLCBmdW5jdGlvbihjbSwgY2hhbmdlKSB7CiAgICBpcyghY2hhbmdlLnVwZGF0ZSk7CiAgICBjaGFuZ2UuY2FuY2VsKCk7CiAgfSk7CiAgY20udW5kbygpOwogIGVxKGNtLmhpc3RvcnlTaXplKCkudW5kbywgMCk7CiAgZXEoY20uZ2V0VmFsdWUoKSwgImJ5ZVxudHdvIik7Cn0sIHt2YWx1ZTogIm9uZVxudHdvIn0pOwoKdGVzdENNKCJiZWZvcmVTZWxlY3Rpb25DaGFuZ2UiLCBmdW5jdGlvbihjbSkgewogIGZ1bmN0aW9uIG5vdEF0RW5kKGNtLCBwb3MpIHsKICAgIHZhciBsZW4gPSBjbS5nZXRMaW5lKHBvcy5saW5lKS5sZW5ndGg7CiAgICBpZiAoIWxlbiB8fCBwb3MuY2ggPT0gbGVuKSByZXR1cm4gUG9zKHBvcy5saW5lLCBwb3MuY2ggLSAxKTsKICAgIHJldHVybiBwb3M7CiAgfQogIGNtLm9uKCJiZWZvcmVTZWxlY3Rpb25DaGFuZ2UiLCBmdW5jdGlvbihjbSwgb2JqKSB7CiAgICBvYmoudXBkYXRlKFt7YW5jaG9yOiBub3RBdEVuZChjbSwgb2JqLnJhbmdlc1swXS5hbmNob3IpLAogICAgICAgICAgICAgICAgIGhlYWQ6IG5vdEF0RW5kKGNtLCBvYmoucmFuZ2VzWzBdLmhlYWQpfV0pOwogIH0pOwoKICBhZGREb2MoY20sIDEwLCAxMCk7CiAgY20uZXhlY0NvbW1hbmQoImdvTGluZUVuZCIpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoMCwgOSkpOwogIGNtLmV4ZWNDb21tYW5kKCJzZWxlY3RBbGwiKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoInN0YXJ0IiksIFBvcygwLCAwKSk7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCJlbmQiKSwgUG9zKDksIDkpKTsKfSk7Cgp0ZXN0Q00oImNoYW5nZV9yZW1vdmVkVGV4dCIsIGZ1bmN0aW9uKGNtKSB7CiAgY20uc2V0VmFsdWUoImFiY1xuZGVmIik7CgogIHZhciByZW1vdmVkVGV4dCA9IFtdOwogIGNtLm9uKCJjaGFuZ2UiLCBmdW5jdGlvbihjbSwgY2hhbmdlKSB7CiAgICByZW1vdmVkVGV4dC5wdXNoKGNoYW5nZS5yZW1vdmVkKTsKICB9KTsKCiAgY20ub3BlcmF0aW9uKGZ1bmN0aW9uKCkgewogICAgY20ucmVwbGFjZVJhbmdlKCJ4eXoiLCBQb3MoMCwgMCksIFBvcygxLDEpKTsKICAgIGNtLnJlcGxhY2VSYW5nZSgiMTIzIiwgUG9zKDAsMCkpOwogIH0pOwoKICBlcShyZW1vdmVkVGV4dC5sZW5ndGgsIDIpOwogIGVxKHJlbW92ZWRUZXh0WzBdLmpvaW4oIlxuIiksICJhYmNcbmQiKTsKICBlcShyZW1vdmVkVGV4dFsxXS5qb2luKCJcbiIpLCAiIik7CgogIHZhciByZW1vdmVkVGV4dCA9IFtdOwogIGNtLnVuZG8oKTsKICBlcShyZW1vdmVkVGV4dC5sZW5ndGgsIDIpOwogIGVxKHJlbW92ZWRUZXh0WzBdLmpvaW4oIlxuIiksICIxMjMiKTsKICBlcShyZW1vdmVkVGV4dFsxXS5qb2luKCJcbiIpLCAieHl6Iik7CgogIHZhciByZW1vdmVkVGV4dCA9IFtdOwogIGNtLnJlZG8oKTsKICBlcShyZW1vdmVkVGV4dC5sZW5ndGgsIDIpOwogIGVxKHJlbW92ZWRUZXh0WzBdLmpvaW4oIlxuIiksICJhYmNcbmQiKTsKICBlcShyZW1vdmVkVGV4dFsxXS5qb2luKCJcbiIpLCAiIik7Cn0pOwoKdGVzdENNKCJsaW5lU3R5bGVGcm9tTW9kZSIsIGZ1bmN0aW9uKGNtKSB7CiAgQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJ0ZXN0X21vZGUiLCBmdW5jdGlvbigpIHsKICAgIHJldHVybiB7dG9rZW46IGZ1bmN0aW9uKHN0cmVhbSkgewogICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eXFtbXlxdXSpcXS8pKSByZXR1cm4gIiAgbGluZS1icmFja2V0cyAgIjsKICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXlwoW15cKV0qXCkvKSkgcmV0dXJuICIgIGxpbmUtYmFja2dyb3VuZC1wYXJlbnMgICI7CiAgICAgIGlmIChzdHJlYW0ubWF0Y2goL148W14+XSo+LykpIHJldHVybiAiICBzcGFuICBsaW5lLWxpbmUgIGxpbmUtYmFja2dyb3VuZC1iZyAgIjsKICAgICAgc3RyZWFtLm1hdGNoKC9eXHMrfF5cUysvKTsKICAgIH19OwogIH0pOwogIGNtLnNldE9wdGlvbigibW9kZSIsICJ0ZXN0X21vZGUiKTsKICB2YXIgYnJhY2tldEVsdHMgPSBieUNsYXNzTmFtZShjbS5nZXRXcmFwcGVyRWxlbWVudCgpLCAiYnJhY2tldHMiKTsKICBlcShicmFja2V0RWx0cy5sZW5ndGgsIDEsICJicmFja2V0cyBjb3VudCIpOwogIGVxKGJyYWNrZXRFbHRzWzBdLm5vZGVOYW1lLCAiUFJFIik7CiAgaXMoIS9icmFja2V0cy4qYnJhY2tldHMvLnRlc3QoYnJhY2tldEVsdHNbMF0uY2xhc3NOYW1lKSk7CiAgdmFyIHBhcmVuRWx0cyA9IGJ5Q2xhc3NOYW1lKGNtLmdldFdyYXBwZXJFbGVtZW50KCksICJwYXJlbnMiKTsKICBlcShwYXJlbkVsdHMubGVuZ3RoLCAxLCAicGFyZW5zIGNvdW50Iik7CiAgZXEocGFyZW5FbHRzWzBdLm5vZGVOYW1lLCAiRElWIik7CiAgaXMoIS9wYXJlbnMuKnBhcmVucy8udGVzdChwYXJlbkVsdHNbMF0uY2xhc3NOYW1lKSk7CiAgZXEocGFyZW5FbHRzWzBdLnBhcmVudEVsZW1lbnQubm9kZU5hbWUsICJESVYiKTsKCiAgZXEoYnlDbGFzc05hbWUoY20uZ2V0V3JhcHBlckVsZW1lbnQoKSwgImJnIikubGVuZ3RoLCAxKTsKICBlcShieUNsYXNzTmFtZShjbS5nZXRXcmFwcGVyRWxlbWVudCgpLCAibGluZSIpLmxlbmd0aCwgMSk7CiAgdmFyIHNwYW5FbHRzID0gYnlDbGFzc05hbWUoY20uZ2V0V3JhcHBlckVsZW1lbnQoKSwgImNtLXNwYW4iKTsKICBlcShzcGFuRWx0cy5sZW5ndGgsIDIpOwogIGlzKC9eXHMqY20tc3BhblxzKiQvLnRlc3Qoc3BhbkVsdHNbMF0uY2xhc3NOYW1lKSk7Cn0sIHt2YWx1ZTogImxpbmUxOiBbYnJdIFticl1cbmxpbmUyOiAocGFyKSAocGFyKVxubGluZTM6IDx0YWc+IDx0YWc+In0pOwoKdGVzdENNKCJsaW5lU3R5bGVGcm9tQmxhbmtMaW5lIiwgZnVuY3Rpb24oY20pIHsKICBDb2RlTWlycm9yLmRlZmluZU1vZGUoImxpbmVTdHlsZUZyb21CbGFua0xpbmVfbW9kZSIsIGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHt0b2tlbjogZnVuY3Rpb24oc3RyZWFtKSB7IHN0cmVhbS5za2lwVG9FbmQoKTsgcmV0dXJuICJjb21tZW50IjsgfSwKICAgICAgICAgICAgYmxhbmtMaW5lOiBmdW5jdGlvbigpIHsgcmV0dXJuICJsaW5lLWJsYW5rIjsgfX07CiAgfSk7CiAgY20uc2V0T3B0aW9uKCJtb2RlIiwgImxpbmVTdHlsZUZyb21CbGFua0xpbmVfbW9kZSIpOwogIHZhciBibGFua0VsdHMgPSBieUNsYXNzTmFtZShjbS5nZXRXcmFwcGVyRWxlbWVudCgpLCAiYmxhbmsiKTsKICBlcShibGFua0VsdHMubGVuZ3RoLCAxKTsKICBlcShibGFua0VsdHNbMF0ubm9kZU5hbWUsICJQUkUiKTsKICBjbS5yZXBsYWNlUmFuZ2UoIngiLCBQb3MoMSwgMCkpOwogIGJsYW5rRWx0cyA9IGJ5Q2xhc3NOYW1lKGNtLmdldFdyYXBwZXJFbGVtZW50KCksICJibGFuayIpOwogIGVxKGJsYW5rRWx0cy5sZW5ndGgsIDApOwp9LCB7dmFsdWU6ICJmb29cblxuYmFyIn0pOwoKQ29kZU1pcnJvci5yZWdpc3RlckhlbHBlcigieHh4IiwgImEiLCAiQSIpOwpDb2RlTWlycm9yLnJlZ2lzdGVySGVscGVyKCJ4eHgiLCAiYiIsICJCIik7CkNvZGVNaXJyb3IuZGVmaW5lTW9kZSgieXl5IiwgZnVuY3Rpb24oKSB7CiAgcmV0dXJuIHsKICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0pIHsgc3RyZWFtLnNraXBUb0VuZCgpOyB9LAogICAgeHh4OiBbImEiLCAiYiIsICJxIl0KICB9Owp9KTsKQ29kZU1pcnJvci5yZWdpc3Rlckdsb2JhbEhlbHBlcigieHh4IiwgImMiLCBmdW5jdGlvbihtKSB7IHJldHVybiBtLmVuYWJsZUM7IH0sICJDIik7Cgp0ZXN0Q00oImhlbHBlcnMiLCBmdW5jdGlvbihjbSkgewogIGNtLnNldE9wdGlvbigibW9kZSIsICJ5eXkiKTsKICBlcShjbS5nZXRIZWxwZXJzKFBvcygwLCAwKSwgInh4eCIpLmpvaW4oIi8iKSwgIkEvQiIpOwogIGNtLnNldE9wdGlvbigibW9kZSIsIHtuYW1lOiAieXl5IiwgbW9kZVByb3BzOiB7eHh4OiAiYiIsIGVuYWJsZUM6IHRydWV9fSk7CiAgZXEoY20uZ2V0SGVscGVycyhQb3MoMCwgMCksICJ4eHgiKS5qb2luKCIvIiksICJCL0MiKTsKICBjbS5zZXRPcHRpb24oIm1vZGUiLCAiamF2YXNjcmlwdCIpOwogIGVxKGNtLmdldEhlbHBlcnMoUG9zKDAsIDApLCAieHh4Iikuam9pbigiLyIpLCAiIik7Cn0pOwoKdGVzdENNKCJzZWxlY3Rpb25IaXN0b3J5IiwgZnVuY3Rpb24oY20pIHsKICBmb3IgKHZhciBpID0gMDsgaSA8IDM7IGkrKykgewogICAgY20uc2V0RXh0ZW5kaW5nKHRydWUpOwogICAgY20uZXhlY0NvbW1hbmQoImdvQ2hhclJpZ2h0Iik7CiAgICBjbS5zZXRFeHRlbmRpbmcoZmFsc2UpOwogICAgY20uZXhlY0NvbW1hbmQoImdvQ2hhclJpZ2h0Iik7CiAgICBjbS5leGVjQ29tbWFuZCgiZ29DaGFyUmlnaHQiKTsKICB9CiAgY20uZXhlY0NvbW1hbmQoInVuZG9TZWxlY3Rpb24iKTsKICBlcShjbS5nZXRTZWxlY3Rpb24oKSwgImMiKTsKICBjbS5leGVjQ29tbWFuZCgidW5kb1NlbGVjdGlvbiIpOwogIGVxKGNtLmdldFNlbGVjdGlvbigpLCAiIik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygwLCA0KSk7CiAgY20uZXhlY0NvbW1hbmQoInVuZG9TZWxlY3Rpb24iKTsKICBlcShjbS5nZXRTZWxlY3Rpb24oKSwgImIiKTsKICBjbS5leGVjQ29tbWFuZCgicmVkb1NlbGVjdGlvbiIpOwogIGVxKGNtLmdldFNlbGVjdGlvbigpLCAiIik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygwLCA0KSk7CiAgY20uZXhlY0NvbW1hbmQoInJlZG9TZWxlY3Rpb24iKTsKICBlcShjbS5nZXRTZWxlY3Rpb24oKSwgImMiKTsKICBjbS5leGVjQ29tbWFuZCgicmVkb1NlbGVjdGlvbiIpOwogIGVxKGNtLmdldFNlbGVjdGlvbigpLCAiIik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygwLCA2KSk7Cn0sIHt2YWx1ZTogImEgYiBjIGQifSk7Cgp0ZXN0Q00oInNlbGVjdGlvbkNoYW5nZVJlZHVjZXNSZWRvIiwgZnVuY3Rpb24oY20pIHsKICBjbS5yZXBsYWNlU2VsZWN0aW9uKCJYIik7CiAgY20uZXhlY0NvbW1hbmQoImdvQ2hhclJpZ2h0Iik7CiAgY20udW5kb1NlbGVjdGlvbigpOwogIGNtLmV4ZWNDb21tYW5kKCJzZWxlY3RBbGwiKTsKICBjbS51bmRvU2VsZWN0aW9uKCk7CiAgZXEoY20uZ2V0VmFsdWUoKSwgIlhhYmMiKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDAsIDEpKTsKICBjbS51bmRvU2VsZWN0aW9uKCk7CiAgZXEoY20uZ2V0VmFsdWUoKSwgImFiYyIpOwp9LCB7dmFsdWU6ICJhYmMifSk7Cgp0ZXN0Q00oInNlbGVjdGlvbkhpc3RvcnlOb25PdmVybGFwcGluZyIsIGZ1bmN0aW9uKGNtKSB7CiAgY20uc2V0U2VsZWN0aW9uKFBvcygwLCAwKSwgUG9zKDAsIDEpKTsKICBjbS5zZXRTZWxlY3Rpb24oUG9zKDAsIDIpLCBQb3MoMCwgMykpOwogIGNtLmV4ZWNDb21tYW5kKCJ1bmRvU2VsZWN0aW9uIik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCJhbmNob3IiKSwgUG9zKDAsIDApKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoImhlYWQiKSwgUG9zKDAsIDEpKTsKfSwge3ZhbHVlOiAiMTIzNCJ9KTsKCnRlc3RDTSgiY3Vyc29yTW90aW9uU3BsaXRzSGlzdG9yeSIsIGZ1bmN0aW9uKGNtKSB7CiAgY20ucmVwbGFjZVNlbGVjdGlvbigiYSIpOwogIGNtLmV4ZWNDb21tYW5kKCJnb0NoYXJSaWdodCIpOwogIGNtLnJlcGxhY2VTZWxlY3Rpb24oImIiKTsKICBjbS5yZXBsYWNlU2VsZWN0aW9uKCJjIik7CiAgY20udW5kbygpOwogIGVxKGNtLmdldFZhbHVlKCksICJhMTIzNCIpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoMCwgMikpOwogIGNtLnVuZG8oKTsKICBlcShjbS5nZXRWYWx1ZSgpLCAiMTIzNCIpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoMCwgMCkpOwp9LCB7dmFsdWU6ICIxMjM0In0pOwoKdGVzdENNKCJzZWxDaGFuZ2VJbk9wZXJhdGlvbkRvZXNOb3RTcGxpdCIsIGZ1bmN0aW9uKGNtKSB7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCA0OyBpKyspIHsKICAgIGNtLm9wZXJhdGlvbihmdW5jdGlvbigpIHsKICAgICAgY20ucmVwbGFjZVNlbGVjdGlvbigieCIpOwogICAgICBjbS5zZXRDdXJzb3IoUG9zKDAsIGNtLmdldEN1cnNvcigpLmNoIC0gMSkpOwogICAgfSk7CiAgfQogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoMCwgMCkpOwogIGVxKGNtLmdldFZhbHVlKCksICJ4eHh4YSIpOwogIGNtLnVuZG8oKTsKICBlcShjbS5nZXRWYWx1ZSgpLCAiYSIpOwp9LCB7dmFsdWU6ICJhIn0pOwoKdGVzdENNKCJhbHdheXNNZXJnZVNlbEV2ZW50V2l0aENoYW5nZU9yaWdpbiIsIGZ1bmN0aW9uKGNtKSB7CiAgY20ucmVwbGFjZVNlbGVjdGlvbigiVSIsIG51bGwsICJmb28iKTsKICBjbS5zZXRTZWxlY3Rpb24oUG9zKDAsIDApLCBQb3MoMCwgMSksIHtvcmlnaW46ICJmb28ifSk7CiAgY20udW5kb1NlbGVjdGlvbigpOwogIGVxKGNtLmdldFZhbHVlKCksICJhIik7CiAgY20ucmVwbGFjZVNlbGVjdGlvbigiViIsIG51bGwsICJmb28iKTsKICBjbS5zZXRTZWxlY3Rpb24oUG9zKDAsIDApLCBQb3MoMCwgMSksIHtvcmlnaW46ICJiYXIifSk7CiAgY20udW5kb1NlbGVjdGlvbigpOwogIGVxKGNtLmdldFZhbHVlKCksICJWYSIpOwp9LCB7dmFsdWU6ICJhIn0pOwoKdGVzdENNKCJnZXRUb2tlblR5cGVBdCIsIGZ1bmN0aW9uKGNtKSB7CiAgZXEoY20uZ2V0VG9rZW5UeXBlQXQoUG9zKDAsIDApKSwgIm51bWJlciIpOwogIGVxKGNtLmdldFRva2VuVHlwZUF0KFBvcygwLCA2KSksICJzdHJpbmciKTsKICBjbS5hZGRPdmVybGF5KHsKICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0pIHsKICAgICAgaWYgKHN0cmVhbS5tYXRjaCgiZm9vIikpIHJldHVybiAiZm9vIjsKICAgICAgZWxzZSBzdHJlYW0ubmV4dCgpOwogICAgfQogIH0pOwogIGVxKGJ5Q2xhc3NOYW1lKGNtLmdldFdyYXBwZXJFbGVtZW50KCksICJjbS1mb28iKS5sZW5ndGgsIDEpOwogIGVxKGNtLmdldFRva2VuVHlwZUF0KFBvcygwLCA2KSksICJzdHJpbmciKTsKfSwge3ZhbHVlOiAiMSArICdmb28nIiwgbW9kZTogImphdmFzY3JpcHQifSk7Cgp0ZXN0Q00oInJlc2l6ZUxpbmVXaWRnZXQiLCBmdW5jdGlvbihjbSkgewogIGFkZERvYyhjbSwgMjAwLCAzKTsKICB2YXIgd2lkZ2V0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgicHJlIik7CiAgd2lkZ2V0LmlubmVySFRNTCA9ICJpbXdpZGdldCI7CiAgd2lkZ2V0LnN0eWxlLmJhY2tncm91bmQgPSAieWVsbG93IjsKICBjbS5hZGRMaW5lV2lkZ2V0KDEsIHdpZGdldCwge25vSFNjcm9sbDogdHJ1ZX0pOwogIGNtLnNldFNpemUoNDApOwogIGlzKHdpZGdldC5wYXJlbnROb2RlLm9mZnNldFdpZHRoIDwgNDIpOwp9KTsKCnRlc3RDTSgiY29tYmluZWRPcGVyYXRpb25zIiwgZnVuY3Rpb24oY20pIHsKICB2YXIgcGxhY2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidGVzdGdyb3VuZCIpOwogIHZhciBvdGhlciA9IENvZGVNaXJyb3IocGxhY2UsIHt2YWx1ZTogIjEyMyJ9KTsKICB0cnkgewogICAgY20ub3BlcmF0aW9uKGZ1bmN0aW9uKCkgewogICAgICBjbS5hZGRMaW5lQ2xhc3MoMCwgIndyYXAiLCAiZm9vIik7CiAgICAgIG90aGVyLmFkZExpbmVDbGFzcygwLCAid3JhcCIsICJmb28iKTsKICAgIH0pOwogICAgZXEoYnlDbGFzc05hbWUoY20uZ2V0V3JhcHBlckVsZW1lbnQoKSwgImZvbyIpLmxlbmd0aCwgMSk7CiAgICBlcShieUNsYXNzTmFtZShvdGhlci5nZXRXcmFwcGVyRWxlbWVudCgpLCAiZm9vIikubGVuZ3RoLCAxKTsKICAgIGNtLm9wZXJhdGlvbihmdW5jdGlvbigpIHsKICAgICAgY20ucmVtb3ZlTGluZUNsYXNzKDAsICJ3cmFwIiwgImZvbyIpOwogICAgICBvdGhlci5yZW1vdmVMaW5lQ2xhc3MoMCwgIndyYXAiLCAiZm9vIik7CiAgICB9KTsKICAgIGVxKGJ5Q2xhc3NOYW1lKGNtLmdldFdyYXBwZXJFbGVtZW50KCksICJmb28iKS5sZW5ndGgsIDApOwogICAgZXEoYnlDbGFzc05hbWUob3RoZXIuZ2V0V3JhcHBlckVsZW1lbnQoKSwgImZvbyIpLmxlbmd0aCwgMCk7CiAgfSBmaW5hbGx5IHsKICAgIHBsYWNlLnJlbW92ZUNoaWxkKG90aGVyLmdldFdyYXBwZXJFbGVtZW50KCkpOwogIH0KfSwge3ZhbHVlOiAiYWJjIn0pOwoKdGVzdENNKCJldmVudE9yZGVyIiwgZnVuY3Rpb24oY20pIHsKICB2YXIgc2VlbiA9IFtdOwogIGNtLm9uKCJjaGFuZ2UiLCBmdW5jdGlvbigpIHsKICAgIGlmICghc2Vlbi5sZW5ndGgpIGNtLnJlcGxhY2VTZWxlY3Rpb24oIi4iKTsKICAgIHNlZW4ucHVzaCgiY2hhbmdlIik7CiAgfSk7CiAgY20ub24oImN1cnNvckFjdGl2aXR5IiwgZnVuY3Rpb24oKSB7CiAgICBjbS5yZXBsYWNlU2VsZWN0aW9uKCIhIik7CiAgICBzZWVuLnB1c2goImFjdGl2aXR5Iik7CiAgfSk7CiAgY20ucmVwbGFjZVNlbGVjdGlvbigiLyIpOwogIGVxKHNlZW4uam9pbigiLCIpLCAiY2hhbmdlLGNoYW5nZSxhY3Rpdml0eSxjaGFuZ2UiKTsKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/test/vim_test.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dmFyIGNvZGUgPSAnJyArCicgd09yZDEgKCMlXG4nICsKJyB3b3JkM10gXG4nICsKJ2FvcG9wIHBvcCAwIDEgMiAzIDRcbicgKwonIChhKSBbYl0ge2N9IFxuJyArCidpbnQgZ2V0Y2hhcih2b2lkKSB7XG4nICsKJyAgc3RhdGljIGNoYXIgYnVmW0JVRlNJWl07XG4nICsKJyAgc3RhdGljIGNoYXIgKmJ1ZnAgPSBidWY7XG4nICsKJyAgaWYgKG4gPT0gMCkgeyAgLyogYnVmZmVyIGlzIGVtcHR5ICovXG4nICsKJyAgICBuID0gcmVhZCgwLCBidWYsIHNpemVvZiBidWYpO1xuJyArCicgICAgYnVmcCA9IGJ1ZjtcbicgKwonICB9XG4nICsKJ1xuJyArCicgIHJldHVybiAoLS1uID49IDApID8gKHVuc2lnbmVkIGNoYXIpICpidWZwKysgOiBFT0Y7XG4nICsKJyBcbicgKwonfVxuJzsKCnZhciBsaW5lcyA9IChmdW5jdGlvbigpIHsKICBsaW5lVGV4dCA9IGNvZGUuc3BsaXQoJ1xuJyk7CiAgdmFyIHJldCA9IFtdOwogIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZVRleHQubGVuZ3RoOyBpKyspIHsKICAgIHJldFtpXSA9IHsKICAgICAgbGluZTogaSwKICAgICAgbGVuZ3RoOiBsaW5lVGV4dFtpXS5sZW5ndGgsCiAgICAgIGxpbmVUZXh0OiBsaW5lVGV4dFtpXSwKICAgICAgdGV4dFN0YXJ0OiAvXlxzKi8uZXhlYyhsaW5lVGV4dFtpXSlbMF0ubGVuZ3RoCiAgICB9OwogIH0KICByZXR1cm4gcmV0Owp9KSgpOwp2YXIgZW5kT2ZEb2N1bWVudCA9IG1ha2VDdXJzb3IobGluZXMubGVuZ3RoIC0gMSwKICAgIGxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdLmxlbmd0aCk7CnZhciB3b3JkTGluZSA9IGxpbmVzWzBdOwp2YXIgYmlnV29yZExpbmUgPSBsaW5lc1sxXTsKdmFyIGNoYXJMaW5lID0gbGluZXNbMl07CnZhciBicmFjZXNMaW5lID0gbGluZXNbM107CnZhciBzZWVrQnJhY2VMaW5lID0gbGluZXNbNF07Cgp2YXIgd29yZDEgPSB7CiAgc3RhcnQ6IHsgbGluZTogd29yZExpbmUubGluZSwgY2g6IDEgfSwKICBlbmQ6IHsgbGluZTogd29yZExpbmUubGluZSwgY2g6IDUgfQp9Owp2YXIgd29yZDIgPSB7CiAgc3RhcnQ6IHsgbGluZTogd29yZExpbmUubGluZSwgY2g6IHdvcmQxLmVuZC5jaCArIDIgfSwKICBlbmQ6IHsgbGluZTogd29yZExpbmUubGluZSwgY2g6IHdvcmQxLmVuZC5jaCArIDQgfQp9Owp2YXIgd29yZDMgPSB7CiAgc3RhcnQ6IHsgbGluZTogYmlnV29yZExpbmUubGluZSwgY2g6IDEgfSwKICBlbmQ6IHsgbGluZTogYmlnV29yZExpbmUubGluZSwgY2g6IDUgfQp9Owp2YXIgYmlnV29yZDEgPSB3b3JkMTsKdmFyIGJpZ1dvcmQyID0gd29yZDI7CnZhciBiaWdXb3JkMyA9IHsKICBzdGFydDogeyBsaW5lOiBiaWdXb3JkTGluZS5saW5lLCBjaDogMSB9LAogIGVuZDogeyBsaW5lOiBiaWdXb3JkTGluZS5saW5lLCBjaDogNyB9Cn07CnZhciBiaWdXb3JkNCA9IHsKICBzdGFydDogeyBsaW5lOiBiaWdXb3JkTGluZS5saW5lLCBjaDogYmlnV29yZDEuZW5kLmNoICsgMyB9LAogIGVuZDogeyBsaW5lOiBiaWdXb3JkTGluZS5saW5lLCBjaDogYmlnV29yZDEuZW5kLmNoICsgNyB9Cn07Cgp2YXIgb0NoYXJzID0gWyB7IGxpbmU6IGNoYXJMaW5lLmxpbmUsIGNoOiAxIH0sCiAgICB7IGxpbmU6IGNoYXJMaW5lLmxpbmUsIGNoOiAzIH0sCiAgICB7IGxpbmU6IGNoYXJMaW5lLmxpbmUsIGNoOiA3IH0gXTsKdmFyIHBDaGFycyA9IFsgeyBsaW5lOiBjaGFyTGluZS5saW5lLCBjaDogMiB9LAogICAgeyBsaW5lOiBjaGFyTGluZS5saW5lLCBjaDogNCB9LAogICAgeyBsaW5lOiBjaGFyTGluZS5saW5lLCBjaDogNiB9LAogICAgeyBsaW5lOiBjaGFyTGluZS5saW5lLCBjaDogOCB9IF07CnZhciBudW1DaGFycyA9IFsgeyBsaW5lOiBjaGFyTGluZS5saW5lLCBjaDogMTAgfSwKICAgIHsgbGluZTogY2hhckxpbmUubGluZSwgY2g6IDEyIH0sCiAgICB7IGxpbmU6IGNoYXJMaW5lLmxpbmUsIGNoOiAxNCB9LAogICAgeyBsaW5lOiBjaGFyTGluZS5saW5lLCBjaDogMTYgfSwKICAgIHsgbGluZTogY2hhckxpbmUubGluZSwgY2g6IDE4IH1dOwp2YXIgcGFyZW5zMSA9IHsKICBzdGFydDogeyBsaW5lOiBicmFjZXNMaW5lLmxpbmUsIGNoOiAxIH0sCiAgZW5kOiB7IGxpbmU6IGJyYWNlc0xpbmUubGluZSwgY2g6IDMgfQp9Owp2YXIgc3F1YXJlczEgPSB7CiAgc3RhcnQ6IHsgbGluZTogYnJhY2VzTGluZS5saW5lLCBjaDogNSB9LAogIGVuZDogeyBsaW5lOiBicmFjZXNMaW5lLmxpbmUsIGNoOiA3IH0KfTsKdmFyIGN1cmx5czEgPSB7CiAgc3RhcnQ6IHsgbGluZTogYnJhY2VzTGluZS5saW5lLCBjaDogOSB9LAogIGVuZDogeyBsaW5lOiBicmFjZXNMaW5lLmxpbmUsIGNoOiAxMSB9Cn07CnZhciBzZWVrT3V0c2lkZSA9IHsKICBzdGFydDogeyBsaW5lOiBzZWVrQnJhY2VMaW5lLmxpbmUsIGNoOiAxIH0sCiAgZW5kOiB7IGxpbmU6IHNlZWtCcmFjZUxpbmUubGluZSwgY2g6IDE2IH0KfTsKdmFyIHNlZWtJbnNpZGUgPSB7CiAgc3RhcnQ6IHsgbGluZTogc2Vla0JyYWNlTGluZS5saW5lLCBjaDogMTQgfSwKICBlbmQ6IHsgbGluZTogc2Vla0JyYWNlTGluZS5saW5lLCBjaDogMTEgfQp9OwoKZnVuY3Rpb24gY29weUN1cnNvcihjdXIpIHsKICByZXR1cm4geyBjaDogY3VyLmNoLCBsaW5lOiBjdXIubGluZSB9Owp9CgpmdW5jdGlvbiBmb3JFYWNoKGFyciwgZnVuYykgewogIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7CiAgICBmdW5jKGFycltpXSwgaSwgYXJyKTsKICB9Cn0KCmZ1bmN0aW9uIHRlc3RWaW0obmFtZSwgcnVuLCBvcHRzLCBleHBlY3RlZEZhaWwpIHsKICB2YXIgdmltT3B0cyA9IHsKICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgdmltTW9kZTogdHJ1ZSwKICAgIHNob3dDdXJzb3JXaGVuU2VsZWN0aW5nOiB0cnVlLAogICAgdmFsdWU6IGNvZGUKICB9OwogIGZvciAodmFyIHByb3AgaW4gb3B0cykgewogICAgaWYgKG9wdHMuaGFzT3duUHJvcGVydHkocHJvcCkpIHsKICAgICAgdmltT3B0c1twcm9wXSA9IG9wdHNbcHJvcF07CiAgICB9CiAgfQogIHJldHVybiB0ZXN0KCd2aW1fJyArIG5hbWUsIGZ1bmN0aW9uKCkgewogICAgdmFyIHBsYWNlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRlc3Rncm91bmQiKTsKICAgIHZhciBjbSA9IENvZGVNaXJyb3IocGxhY2UsIHZpbU9wdHMpOwogICAgdmFyIHZpbSA9IENvZGVNaXJyb3IuVmltLm1heWJlSW5pdFZpbVN0YXRlXyhjbSk7CgogICAgZnVuY3Rpb24gZG9LZXlzRm4oY20pIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKGFyZ3MpIHsKICAgICAgICBpZiAoYXJncyBpbnN0YW5jZW9mIEFycmF5KSB7CiAgICAgICAgICBhcmd1bWVudHMgPSBhcmdzOwogICAgICAgIH0KICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgQ29kZU1pcnJvci5WaW0uaGFuZGxlS2V5KGNtLCBhcmd1bWVudHNbaV0pOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gZG9JbnNlcnRNb2RlS2V5c0ZuKGNtKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihhcmdzKSB7CiAgICAgICAgaWYgKGFyZ3MgaW5zdGFuY2VvZiBBcnJheSkgeyBhcmd1bWVudHMgPSBhcmdzOyB9CiAgICAgICAgZnVuY3Rpb24gZXhlY3V0ZUhhbmRsZXIoaGFuZGxlcikgewogICAgICAgICAgaWYgKHR5cGVvZiBoYW5kbGVyID09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgIENvZGVNaXJyb3IuY29tbWFuZHNbaGFuZGxlcl0oY20pOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaGFuZGxlcihjbSk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHZhciBrZXkgPSBhcmd1bWVudHNbaV07CiAgICAgICAgICAvLyBGaW5kIGtleSBpbiBrZXltYXAgYW5kIGhhbmRsZS4KICAgICAgICAgIHZhciBoYW5kbGVkID0gQ29kZU1pcnJvci5sb29rdXBLZXkoa2V5LCBbJ3ZpbS1pbnNlcnQnXSwgZXhlY3V0ZUhhbmRsZXIpOwogICAgICAgICAgLy8gUmVjb3JkIGZvciBpbnNlcnQgbW9kZS4KICAgICAgICAgIGlmIChoYW5kbGVkID09PSB0cnVlICYmIGNtLnN0YXRlLnZpbS5pbnNlcnRNb2RlICYmIGFyZ3VtZW50c1tpXSAhPSAnRXNjJykgewogICAgICAgICAgICB2YXIgbGFzdENoYW5nZSA9IENvZGVNaXJyb3IuVmltLmdldFZpbUdsb2JhbFN0YXRlXygpLm1hY3JvTW9kZVN0YXRlLmxhc3RJbnNlcnRNb2RlQ2hhbmdlczsKICAgICAgICAgICAgaWYgKGxhc3RDaGFuZ2UpIHsKICAgICAgICAgICAgICBsYXN0Q2hhbmdlLmNoYW5nZXMucHVzaChuZXcgQ29kZU1pcnJvci5WaW0uSW5zZXJ0TW9kZUtleShrZXkpKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gZG9FeEZuKGNtKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihjb21tYW5kKSB7CiAgICAgICAgY20ub3BlbkRpYWxvZyA9IGhlbHBlcnMuZmFrZU9wZW5EaWFsb2coY29tbWFuZCk7CiAgICAgICAgaGVscGVycy5kb0tleXMoJzonKTsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gYXNzZXJ0Q3Vyc29yQXRGbihjbSkgewogICAgICByZXR1cm4gZnVuY3Rpb24obGluZSwgY2gpIHsKICAgICAgICB2YXIgcG9zOwogICAgICAgIGlmIChjaCA9PSBudWxsICYmIHR5cGVvZiBsaW5lLmxpbmUgPT0gJ251bWJlcicpIHsKICAgICAgICAgIHBvcyA9IGxpbmU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHBvcyA9IG1ha2VDdXJzb3IobGluZSwgY2gpOwogICAgICAgIH0KICAgICAgICBlcVBvcyhwb3MsIGNtLmdldEN1cnNvcigpKTsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gZmFrZU9wZW5EaWFsb2cocmVzdWx0KSB7CiAgICAgIHJldHVybiBmdW5jdGlvbih0ZXh0LCBjYWxsYmFjaykgewogICAgICAgIHJldHVybiBjYWxsYmFjayhyZXN1bHQpOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBmYWtlT3Blbk5vdGlmaWNhdGlvbihtYXRjaGVyKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbih0ZXh0KSB7CiAgICAgICAgbWF0Y2hlcih0ZXh0KTsKICAgICAgfQogICAgfQogICAgdmFyIGhlbHBlcnMgPSB7CiAgICAgIGRvS2V5czogZG9LZXlzRm4oY20pLAogICAgICAvLyBXYXJuaW5nOiBPbmx5IGVtdWxhdGVzIGtleW1hcCBldmVudHMsIG5vdCBjaGFyYWN0ZXIgaW5zZXJ0aW9ucy4gVXNlCiAgICAgIC8vIHJlcGxhY2VSYW5nZSB0byBzaW11bGF0ZSBjaGFyYWN0ZXIgaW5zZXJ0aW9ucy4KICAgICAgLy8gS2V5cyBhcmUgaW4gQ29kZU1pcnJvciBmb3JtYXQsIE5PVCB2aW0gZm9ybWF0LgogICAgICBkb0luc2VydE1vZGVLZXlzOiBkb0luc2VydE1vZGVLZXlzRm4oY20pLAogICAgICBkb0V4OiBkb0V4Rm4oY20pLAogICAgICBhc3NlcnRDdXJzb3JBdDogYXNzZXJ0Q3Vyc29yQXRGbihjbSksCiAgICAgIGZha2VPcGVuRGlhbG9nOiBmYWtlT3BlbkRpYWxvZywKICAgICAgZmFrZU9wZW5Ob3RpZmljYXRpb246IGZha2VPcGVuTm90aWZpY2F0aW9uLAogICAgICBnZXRSZWdpc3RlckNvbnRyb2xsZXI6IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBDb2RlTWlycm9yLlZpbS5nZXRSZWdpc3RlckNvbnRyb2xsZXIoKTsKICAgICAgfQogICAgfQogICAgQ29kZU1pcnJvci5WaW0ucmVzZXRWaW1HbG9iYWxTdGF0ZV8oKTsKICAgIHZhciBzdWNjZXNzZnVsID0gZmFsc2U7CiAgICB2YXIgc2F2ZWRPcGVuTm90aWZpY2F0aW9uID0gY20ub3Blbk5vdGlmaWNhdGlvbjsKICAgIHRyeSB7CiAgICAgIHJ1bihjbSwgdmltLCBoZWxwZXJzKTsKICAgICAgc3VjY2Vzc2Z1bCA9IHRydWU7CiAgICB9IGZpbmFsbHkgewogICAgICBjbS5vcGVuTm90aWZpY2F0aW9uID0gc2F2ZWRPcGVuTm90aWZpY2F0aW9uOwogICAgICBpZiAoIXN1Y2Nlc3NmdWwgfHwgdmVyYm9zZSkgewogICAgICAgIHBsYWNlLnN0eWxlLnZpc2liaWxpdHkgPSAidmlzaWJsZSI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcGxhY2UucmVtb3ZlQ2hpbGQoY20uZ2V0V3JhcHBlckVsZW1lbnQoKSk7CiAgICAgIH0KICAgIH0KICB9LCBleHBlY3RlZEZhaWwpOwp9Owp0ZXN0VmltKCdxcUBxJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygncScsICdxJywgJ2wnLCAnbCcsICdxJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLDIpOwogIGhlbHBlcnMuZG9LZXlzKCdAJywgJ3EnKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsNCk7Cn0sIHsgdmFsdWU6ICcgICAgICAgICAgICAnfSk7CnRlc3RWaW0oJ0BAJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygncScsICdxJywgJ2wnLCAnbCcsICdxJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLDIpOwogIGhlbHBlcnMuZG9LZXlzKCdAJywgJ3EnKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsNCk7CiAgaGVscGVycy5kb0tleXMoJ0AnLCAnQCcpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCw2KTsKfSwgeyB2YWx1ZTogJyAgICAgICAgICAgICd9KTsKdmFyIGp1bXBsaXN0U2NlbmUgPSAnJysKICAnd29yZFxuJysKICAnKHdvcmQpXG4nKwogICd7d29yZFxuJysKICAnd29yZC5cbicrCiAgJ1xuJysKICAnd29yZCBzZWFyY2hcbicrCiAgJ313b3JkXG4nKwogICd3b3JkXG4nKwogICd3b3JkXG4nOwpmdW5jdGlvbiB0ZXN0SnVtcGxpc3QobmFtZSwga2V5cywgZW5kUG9zLCBzdGFydFBvcywgZGlhbG9nKSB7CiAgZW5kUG9zID0gbWFrZUN1cnNvcihlbmRQb3NbMF0sIGVuZFBvc1sxXSk7CiAgc3RhcnRQb3MgPSBtYWtlQ3Vyc29yKHN0YXJ0UG9zWzBdLCBzdGFydFBvc1sxXSk7CiAgdGVzdFZpbShuYW1lLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgICBDb2RlTWlycm9yLlZpbS5yZXNldFZpbUdsb2JhbFN0YXRlXygpOwogICAgaWYoZGlhbG9nKWNtLm9wZW5EaWFsb2cgPSBoZWxwZXJzLmZha2VPcGVuRGlhbG9nKCd3b3JkJyk7CiAgICBjbS5zZXRDdXJzb3Ioc3RhcnRQb3MpOwogICAgaGVscGVycy5kb0tleXMuYXBwbHkobnVsbCwga2V5cyk7CiAgICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KGVuZFBvcyk7CiAgfSwge3ZhbHVlOiBqdW1wbGlzdFNjZW5lfSk7Cn07CnRlc3RKdW1wbGlzdCgnanVtcGxpc3RfSCcsIFsnSCcsICc8Qy1vPiddLCBbNSwyXSwgWzUsMl0pOwp0ZXN0SnVtcGxpc3QoJ2p1bXBsaXN0X00nLCBbJ00nLCAnPEMtbz4nXSwgWzIsMl0sIFsyLDJdKTsKdGVzdEp1bXBsaXN0KCdqdW1wbGlzdF9MJywgWydMJywgJzxDLW8+J10sIFsyLDJdLCBbMiwyXSk7CnRlc3RKdW1wbGlzdCgnanVtcGxpc3RfW1snLCBbJ1snLCAnWycsICc8Qy1vPiddLCBbNSwyXSwgWzUsMl0pOwp0ZXN0SnVtcGxpc3QoJ2p1bXBsaXN0X11dJywgWyddJywgJ10nLCAnPEMtbz4nXSwgWzIsMl0sIFsyLDJdKTsKdGVzdEp1bXBsaXN0KCdqdW1wbGlzdF9HJywgWydHJywgJzxDLW8+J10sIFs1LDJdLCBbNSwyXSk7CnRlc3RKdW1wbGlzdCgnanVtcGxpc3RfZ2cnLCBbJ2cnLCAnZycsICc8Qy1vPiddLCBbNSwyXSwgWzUsMl0pOwp0ZXN0SnVtcGxpc3QoJ2p1bXBsaXN0XyUnLCBbJyUnLCAnPEMtbz4nXSwgWzEsNV0sIFsxLDVdKTsKdGVzdEp1bXBsaXN0KCdqdW1wbGlzdF97JywgWyd7JywgJzxDLW8+J10sIFsxLDVdLCBbMSw1XSk7CnRlc3RKdW1wbGlzdCgnanVtcGxpc3RffScsIFsnfScsICc8Qy1vPiddLCBbMSw1XSwgWzEsNV0pOwp0ZXN0SnVtcGxpc3QoJ2p1bXBsaXN0X1wnJywgWydtJywgJ2EnLCAnaCcsICdcJycsICdhJywgJ2gnLCAnPEMtaT4nXSwgWzEsMF0sIFsxLDVdKTsKdGVzdEp1bXBsaXN0KCdqdW1wbGlzdF9gJywgWydtJywgJ2EnLCAnaCcsICdgJywgJ2EnLCAnaCcsICc8Qy1pPiddLCBbMSw1XSwgWzEsNV0pOwp0ZXN0SnVtcGxpc3QoJ2p1bXBsaXN0XypfY2FjaGVkQ3Vyc29yJywgWycqJywgJzxDLW8+J10sIFsxLDNdLCBbMSwzXSk7CnRlc3RKdW1wbGlzdCgnanVtcGxpc3RfI19jYWNoZWRDdXJzb3InLCBbJyMnLCAnPEMtbz4nXSwgWzEsM10sIFsxLDNdKTsKdGVzdEp1bXBsaXN0KCdqdW1wbGlzdF9uJywgWycjJywgJ24nLCAnPEMtbz4nXSwgWzEsMV0sIFsyLDNdKTsKdGVzdEp1bXBsaXN0KCdqdW1wbGlzdF9OJywgWycjJywgJ04nLCAnPEMtbz4nXSwgWzEsMV0sIFsyLDNdKTsKdGVzdEp1bXBsaXN0KCdqdW1wbGlzdF9yZXBlYXRfPGMtbz4nLCBbJyonLCAnKicsICcqJywgJzMnLCAnPEMtbz4nXSwgWzIsM10sIFsyLDNdKTsKdGVzdEp1bXBsaXN0KCdqdW1wbGlzdF9yZXBlYXRfPGMtaT4nLCBbJyonLCAnKicsICcqJywgJzMnLCAnPEMtbz4nLCAnMicsICc8Qy1pPiddLCBbNSwwXSwgWzIsM10pOwp0ZXN0SnVtcGxpc3QoJ2p1bXBsaXN0X3JlcGVhdGVkX21vdGlvbicsIFsnMycsICcqJywgJzxDLW8+J10sIFsyLDNdLCBbMiwzXSk7CnRlc3RKdW1wbGlzdCgnanVtcGxpc3RfLycsIFsnLycsICc8Qy1vPiddLCBbMiwzXSwgWzIsM10sICdkaWFsb2cnKTsKdGVzdEp1bXBsaXN0KCdqdW1wbGlzdF8/JywgWyc/JywgJzxDLW8+J10sIFsyLDNdLCBbMiwzXSwgJ2RpYWxvZycpOwp0ZXN0SnVtcGxpc3QoJ2p1bXBsaXN0X3NraXBfZGVsdGVkX21hcms8Yy1vPicsCiAgICAgICAgICAgICBbJyonLCAnbicsICduJywgJ2snLCAnZCcsICdrJywgJzxDLW8+JywgJzxDLW8+JywgJzxDLW8+J10sCiAgICAgICAgICAgICBbMCwyXSwgWzAsMl0pOwp0ZXN0SnVtcGxpc3QoJ2p1bXBsaXN0X3NraXBfZGVsdGVkX21hcms8Yy1pPicsCiAgICAgICAgICAgICBbJyonLCAnbicsICduJywgJ2snLCAnZCcsICdrJywgJzxDLW8+JywgJzxDLWk+JywgJzxDLWk+J10sCiAgICAgICAgICAgICBbMSwwXSwgWzAsMl0pOwoKLyoqCiAqIEBwYXJhbSBuYW1lIE5hbWUgb2YgdGhlIHRlc3QKICogQHBhcmFtIGtleXMgQW4gYXJyYXkgb2Yga2V5cyBvciBhIHN0cmluZyB3aXRoIGEgc2luZ2xlIGtleSB0byBzaW11bGF0ZS4KICogQHBhcmFtIGVuZFBvcyBUaGUgZXhwZWN0ZWQgZW5kIHBvc2l0aW9uIG9mIHRoZSBjdXJzb3IuCiAqIEBwYXJhbSBzdGFydFBvcyBUaGUgcG9zaXRpb24gdGhlIGN1cnNvciBzaG91bGQgc3RhcnQgYXQsIGRlZmF1bHRzIHRvIDAsIDAuCiAqLwpmdW5jdGlvbiB0ZXN0TW90aW9uKG5hbWUsIGtleXMsIGVuZFBvcywgc3RhcnRQb3MpIHsKICB0ZXN0VmltKG5hbWUsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICAgIGlmICghc3RhcnRQb3MpIHsKICAgICAgc3RhcnRQb3MgPSB7IGxpbmU6IDAsIGNoOiAwIH07CiAgICB9CiAgICBjbS5zZXRDdXJzb3Ioc3RhcnRQb3MpOwogICAgaGVscGVycy5kb0tleXMoa2V5cyk7CiAgICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KGVuZFBvcyk7CiAgfSk7Cn07CgpmdW5jdGlvbiBtYWtlQ3Vyc29yKGxpbmUsIGNoKSB7CiAgcmV0dXJuIHsgbGluZTogbGluZSwgY2g6IGNoIH07Cn07CgpmdW5jdGlvbiBvZmZzZXRDdXJzb3IoY3VyLCBvZmZzZXRMaW5lLCBvZmZzZXRDaCkgewogIHJldHVybiB7IGxpbmU6IGN1ci5saW5lICsgb2Zmc2V0TGluZSwgY2g6IGN1ci5jaCArIG9mZnNldENoIH07Cn07CgovLyBNb3Rpb24gdGVzdHMKdGVzdE1vdGlvbignfCcsICd8JywgbWFrZUN1cnNvcigwLCAwKSwgbWFrZUN1cnNvcigwLDQpKTsKdGVzdE1vdGlvbignfF9yZXBlYXQnLCBbJzMnLCAnfCddLCBtYWtlQ3Vyc29yKDAsIDIpLCBtYWtlQ3Vyc29yKDAsNCkpOwp0ZXN0TW90aW9uKCdoJywgJ2gnLCBtYWtlQ3Vyc29yKDAsIDApLCB3b3JkMS5zdGFydCk7CnRlc3RNb3Rpb24oJ2hfcmVwZWF0JywgWyczJywgJ2gnXSwgb2Zmc2V0Q3Vyc29yKHdvcmQxLmVuZCwgMCwgLTMpLCB3b3JkMS5lbmQpOwp0ZXN0TW90aW9uKCdsJywgJ2wnLCBtYWtlQ3Vyc29yKDAsIDEpKTsKdGVzdE1vdGlvbignbF9yZXBlYXQnLCBbJzInLCAnbCddLCBtYWtlQ3Vyc29yKDAsIDIpKTsKdGVzdE1vdGlvbignaicsICdqJywgb2Zmc2V0Q3Vyc29yKHdvcmQxLmVuZCwgMSwgMCksIHdvcmQxLmVuZCk7CnRlc3RNb3Rpb24oJ2pfcmVwZWF0JywgWycyJywgJ2onXSwgb2Zmc2V0Q3Vyc29yKHdvcmQxLmVuZCwgMiwgMCksIHdvcmQxLmVuZCk7CnRlc3RNb3Rpb24oJ2pfcmVwZWF0X2NsaXAnLCBbJzEwMDAnLCAnaiddLCBlbmRPZkRvY3VtZW50KTsKdGVzdE1vdGlvbignaycsICdrJywgb2Zmc2V0Q3Vyc29yKHdvcmQzLmVuZCwgLTEsIDApLCB3b3JkMy5lbmQpOwp0ZXN0TW90aW9uKCdrX3JlcGVhdCcsIFsnMicsICdrJ10sIG1ha2VDdXJzb3IoMCwgNCksIG1ha2VDdXJzb3IoMiwgNCkpOwp0ZXN0TW90aW9uKCdrX3JlcGVhdF9jbGlwJywgWycxMDAwJywgJ2snXSwgbWFrZUN1cnNvcigwLCA0KSwgbWFrZUN1cnNvcigyLCA0KSk7CnRlc3RNb3Rpb24oJ3cnLCAndycsIHdvcmQxLnN0YXJ0KTsKdGVzdE1vdGlvbignd19tdWx0aXBsZV9uZXdsaW5lc19ub19zcGFjZScsICd3JywgbWFrZUN1cnNvcigxMiwgMiksIG1ha2VDdXJzb3IoMTEsIDIpKTsKdGVzdE1vdGlvbignd19tdWx0aXBsZV9uZXdsaW5lc193aXRoX3NwYWNlJywgJ3cnLCBtYWtlQ3Vyc29yKDE0LCAwKSwgbWFrZUN1cnNvcigxMiwgNTEpKTsKdGVzdE1vdGlvbignd19yZXBlYXQnLCBbJzInLCAndyddLCB3b3JkMi5zdGFydCk7CnRlc3RNb3Rpb24oJ3dfd3JhcCcsIFsndyddLCB3b3JkMy5zdGFydCwgd29yZDIuc3RhcnQpOwp0ZXN0TW90aW9uKCd3X2VuZE9mRG9jdW1lbnQnLCAndycsIGVuZE9mRG9jdW1lbnQsIGVuZE9mRG9jdW1lbnQpOwp0ZXN0TW90aW9uKCd3X3N0YXJ0X3RvX2VuZCcsIFsnMTAwMCcsICd3J10sIGVuZE9mRG9jdW1lbnQsIG1ha2VDdXJzb3IoMCwgMCkpOwp0ZXN0TW90aW9uKCdXJywgJ1cnLCBiaWdXb3JkMS5zdGFydCk7CnRlc3RNb3Rpb24oJ1dfcmVwZWF0JywgWycyJywgJ1cnXSwgYmlnV29yZDMuc3RhcnQsIGJpZ1dvcmQxLnN0YXJ0KTsKdGVzdE1vdGlvbignZScsICdlJywgd29yZDEuZW5kKTsKdGVzdE1vdGlvbignZV9yZXBlYXQnLCBbJzInLCAnZSddLCB3b3JkMi5lbmQpOwp0ZXN0TW90aW9uKCdlX3dyYXAnLCAnZScsIHdvcmQzLmVuZCwgd29yZDIuZW5kKTsKdGVzdE1vdGlvbignZV9lbmRPZkRvY3VtZW50JywgJ2UnLCBlbmRPZkRvY3VtZW50LCBlbmRPZkRvY3VtZW50KTsKdGVzdE1vdGlvbignZV9zdGFydF90b19lbmQnLCBbJzEwMDAnLCAnZSddLCBlbmRPZkRvY3VtZW50LCBtYWtlQ3Vyc29yKDAsIDApKTsKdGVzdE1vdGlvbignYicsICdiJywgd29yZDMuc3RhcnQsIHdvcmQzLmVuZCk7CnRlc3RNb3Rpb24oJ2JfcmVwZWF0JywgWycyJywgJ2InXSwgd29yZDIuc3RhcnQsIHdvcmQzLmVuZCk7CnRlc3RNb3Rpb24oJ2Jfd3JhcCcsICdiJywgd29yZDIuc3RhcnQsIHdvcmQzLnN0YXJ0KTsKdGVzdE1vdGlvbignYl9zdGFydE9mRG9jdW1lbnQnLCAnYicsIG1ha2VDdXJzb3IoMCwgMCksIG1ha2VDdXJzb3IoMCwgMCkpOwp0ZXN0TW90aW9uKCdiX2VuZF90b19zdGFydCcsIFsnMTAwMCcsICdiJ10sIG1ha2VDdXJzb3IoMCwgMCksIGVuZE9mRG9jdW1lbnQpOwp0ZXN0TW90aW9uKCdnZScsIFsnZycsICdlJ10sIHdvcmQyLmVuZCwgd29yZDMuZW5kKTsKdGVzdE1vdGlvbignZ2VfcmVwZWF0JywgWycyJywgJ2cnLCAnZSddLCB3b3JkMS5lbmQsIHdvcmQzLnN0YXJ0KTsKdGVzdE1vdGlvbignZ2Vfd3JhcCcsIFsnZycsICdlJ10sIHdvcmQyLmVuZCwgd29yZDMuc3RhcnQpOwp0ZXN0TW90aW9uKCdnZV9zdGFydE9mRG9jdW1lbnQnLCBbJ2cnLCAnZSddLCBtYWtlQ3Vyc29yKDAsIDApLAogICAgbWFrZUN1cnNvcigwLCAwKSk7CnRlc3RNb3Rpb24oJ2dlX2VuZF90b19zdGFydCcsIFsnMTAwMCcsICdnJywgJ2UnXSwgbWFrZUN1cnNvcigwLCAwKSwgZW5kT2ZEb2N1bWVudCk7CnRlc3RNb3Rpb24oJ2dnJywgWydnJywgJ2cnXSwgbWFrZUN1cnNvcihsaW5lc1swXS5saW5lLCBsaW5lc1swXS50ZXh0U3RhcnQpLAogICAgbWFrZUN1cnNvcigzLCAxKSk7CnRlc3RNb3Rpb24oJ2dnX3JlcGVhdCcsIFsnMycsICdnJywgJ2cnXSwKICAgIG1ha2VDdXJzb3IobGluZXNbMl0ubGluZSwgbGluZXNbMl0udGV4dFN0YXJ0KSk7CnRlc3RNb3Rpb24oJ0cnLCAnRycsCiAgICBtYWtlQ3Vyc29yKGxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdLmxpbmUsIGxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdLnRleHRTdGFydCksCiAgICBtYWtlQ3Vyc29yKDMsIDEpKTsKdGVzdE1vdGlvbignR19yZXBlYXQnLCBbJzMnLCAnRyddLCBtYWtlQ3Vyc29yKGxpbmVzWzJdLmxpbmUsCiAgICBsaW5lc1syXS50ZXh0U3RhcnQpKTsKLy8gVE9ETzogTWFrZSB0aGUgdGVzdCBjb2RlIGxvbmcgZW5vdWdoIHRvIHRlc3QgQ3RybC1GIGFuZCBDdHJsLUIuCnRlc3RNb3Rpb24oJzAnLCAnMCcsIG1ha2VDdXJzb3IoMCwgMCksIG1ha2VDdXJzb3IoMCwgOCkpOwp0ZXN0TW90aW9uKCdeJywgJ14nLCBtYWtlQ3Vyc29yKDAsIGxpbmVzWzBdLnRleHRTdGFydCksIG1ha2VDdXJzb3IoMCwgOCkpOwp0ZXN0TW90aW9uKCcrJywgJysnLCBtYWtlQ3Vyc29yKDEsIGxpbmVzWzFdLnRleHRTdGFydCksIG1ha2VDdXJzb3IoMCwgOCkpOwp0ZXN0TW90aW9uKCctJywgJy0nLCBtYWtlQ3Vyc29yKDAsIGxpbmVzWzBdLnRleHRTdGFydCksIG1ha2VDdXJzb3IoMSwgNCkpOwp0ZXN0TW90aW9uKCdfJywgWyc2JywnXyddLCBtYWtlQ3Vyc29yKDUsIGxpbmVzWzVdLnRleHRTdGFydCksIG1ha2VDdXJzb3IoMCwgOCkpOwp0ZXN0TW90aW9uKCckJywgJyQnLCBtYWtlQ3Vyc29yKDAsIGxpbmVzWzBdLmxlbmd0aCAtIDEpLCBtYWtlQ3Vyc29yKDAsIDEpKTsKdGVzdE1vdGlvbignJF9yZXBlYXQnLCBbJzInLCAnJCddLCBtYWtlQ3Vyc29yKDEsIGxpbmVzWzFdLmxlbmd0aCAtIDEpLAogICAgbWFrZUN1cnNvcigwLCAzKSk7CnRlc3RNb3Rpb24oJ2YnLCBbJ2YnLCAncCddLCBwQ2hhcnNbMF0sIG1ha2VDdXJzb3IoY2hhckxpbmUubGluZSwgMCkpOwp0ZXN0TW90aW9uKCdmX3JlcGVhdCcsIFsnMicsICdmJywgJ3AnXSwgcENoYXJzWzJdLCBwQ2hhcnNbMF0pOwp0ZXN0TW90aW9uKCdmX251bScsIFsnZicsICcyJ10sIG51bUNoYXJzWzJdLCBtYWtlQ3Vyc29yKGNoYXJMaW5lLmxpbmUsIDApKTsKdGVzdE1vdGlvbigndCcsIFsndCcsJ3AnXSwgb2Zmc2V0Q3Vyc29yKHBDaGFyc1swXSwgMCwgLTEpLAogICAgbWFrZUN1cnNvcihjaGFyTGluZS5saW5lLCAwKSk7CnRlc3RNb3Rpb24oJ3RfcmVwZWF0JywgWycyJywgJ3QnLCAncCddLCBvZmZzZXRDdXJzb3IocENoYXJzWzJdLCAwLCAtMSksCiAgICBwQ2hhcnNbMF0pOwp0ZXN0TW90aW9uKCdGJywgWydGJywgJ3AnXSwgcENoYXJzWzBdLCBwQ2hhcnNbMV0pOwp0ZXN0TW90aW9uKCdGX3JlcGVhdCcsIFsnMicsICdGJywgJ3AnXSwgcENoYXJzWzBdLCBwQ2hhcnNbMl0pOwp0ZXN0TW90aW9uKCdUJywgWydUJywgJ3AnXSwgb2Zmc2V0Q3Vyc29yKHBDaGFyc1swXSwgMCwgMSksIHBDaGFyc1sxXSk7CnRlc3RNb3Rpb24oJ1RfcmVwZWF0JywgWycyJywgJ1QnLCAncCddLCBvZmZzZXRDdXJzb3IocENoYXJzWzBdLCAwLCAxKSwgcENoYXJzWzJdKTsKdGVzdE1vdGlvbignJV9wYXJlbnMnLCBbJyUnXSwgcGFyZW5zMS5lbmQsIHBhcmVuczEuc3RhcnQpOwp0ZXN0TW90aW9uKCclX3NxdWFyZXMnLCBbJyUnXSwgc3F1YXJlczEuZW5kLCBzcXVhcmVzMS5zdGFydCk7CnRlc3RNb3Rpb24oJyVfYnJhY2VzJywgWyclJ10sIGN1cmx5czEuZW5kLCBjdXJseXMxLnN0YXJ0KTsKdGVzdE1vdGlvbignJV9zZWVrX291dHNpZGUnLCBbJyUnXSwgc2Vla091dHNpZGUuZW5kLCBzZWVrT3V0c2lkZS5zdGFydCk7CnRlc3RNb3Rpb24oJyVfc2Vla19pbnNpZGUnLCBbJyUnXSwgc2Vla0luc2lkZS5lbmQsIHNlZWtJbnNpZGUuc3RhcnQpOwp0ZXN0VmltKCclX3NlZWtfc2tpcCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwwKTsKICBoZWxwZXJzLmRvS2V5cyhbJyUnXSk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLDkpOwp9LCB7dmFsdWU6JzAxMjM0IigiKCknfSk7CnRlc3RWaW0oJyVfc2tpcF9zdHJpbmcnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsMCk7CiAgaGVscGVycy5kb0tleXMoWyclJ10pOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCw0KTsKICBjbS5zZXRDdXJzb3IoMCwyKTsKICBoZWxwZXJzLmRvS2V5cyhbJyUnXSk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLDApOwp9LCB7dmFsdWU6JygiKSIpJ30pOwooJyknKQp0ZXN0VmltKCclX3NraXBfY29tbWVudCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwwKTsKICBoZWxwZXJzLmRvS2V5cyhbJyUnXSk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLDYpOwogIGNtLnNldEN1cnNvcigwLDMpOwogIGhlbHBlcnMuZG9LZXlzKFsnJSddKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsMCk7Cn0sIHt2YWx1ZTonKC8qKSovKSd9KTsKLy8gTWFrZSBzdXJlIHRoYXQgbW92aW5nIGRvd24gYWZ0ZXIgZ29pbmcgdG8gdGhlIGVuZCBvZiBhIGxpbmUgYWx3YXlzIGxlYXZlcyB5b3UKLy8gYXQgdGhlIGVuZCBvZiBhIGxpbmUsIGJ1dCBwcmVzZXJ2ZXMgdGhlIG9mZnNldCBpbiBvdGhlciBjYXNlcwp0ZXN0VmltKCdDaGFuZ2luZyBsaW5lcyBhZnRlciBFb2wgb3BlcmF0aW9uJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLDApOwogIGhlbHBlcnMuZG9LZXlzKFsnJCddKTsKICBoZWxwZXJzLmRvS2V5cyhbJ2onXSk7CiAgLy8gQWZ0ZXIgbW92aW5nIHRvIEVvbCBhbmQgdGhlbiBkb3duLCB3ZSBzaG91bGQgYmUgYXQgRW9sIG9mIGxpbmUgMgogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoeyBsaW5lOiAxLCBjaDogbGluZXNbMV0ubGVuZ3RoIC0gMSB9KTsKICBoZWxwZXJzLmRvS2V5cyhbJ2onXSk7CiAgLy8gQWZ0ZXIgbW92aW5nIGRvd24sIHdlIHNob3VsZCBiZSBhdCBFb2wgb2YgbGluZSAzCiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCh7IGxpbmU6IDIsIGNoOiBsaW5lc1syXS5sZW5ndGggLSAxIH0pOwogIGhlbHBlcnMuZG9LZXlzKFsnaCddKTsKICBoZWxwZXJzLmRvS2V5cyhbJ2onXSk7CiAgLy8gQWZ0ZXIgbW92aW5nIGJhY2sgb25lIHNwYWNlIGFuZCB0aGVuIGRvd24sIHNpbmNlIGxpbmUgNCBpcyBzaG9ydGVyIHRoYW4gbGluZSAyLCB3ZSBzaG91bGQKICAvLyBiZSBhdCBFb2wgb2YgbGluZSAyIC0gMQogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoeyBsaW5lOiAzLCBjaDogbGluZXNbM10ubGVuZ3RoIC0gMSB9KTsKICBoZWxwZXJzLmRvS2V5cyhbJ2onXSk7CiAgaGVscGVycy5kb0tleXMoWydqJ10pOwogIC8vIEFmdGVyIG1vdmluZyBkb3duIGFnYWluLCBzaW5jZSBsaW5lIDMgaGFzIGVub3VnaCBjaGFyYWN0ZXJzLCB3ZSBzaG91bGQgYmUgYmFjayB0byB0aGUKICAvLyBzYW1lIHBsYWNlIHdlIHdlcmUgYXQgb24gbGluZSAxCiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCh7IGxpbmU6IDUsIGNoOiBsaW5lc1syXS5sZW5ndGggLSAyIH0pOwp9KTsKLy9tYWtpbmcgc3VyZSBnaiBhbmQgZ2sgcmVjb3ZlciBmcm9tIGNsaXBwaW5nCnRlc3RWaW0oJ2dqX2drX2NsaXBwaW5nJywgZnVuY3Rpb24oY20sdmltLGhlbHBlcnMpewogIGNtLnNldEN1cnNvcigwLCAxKTsKICBoZWxwZXJzLmRvS2V5cygnZycsJ2onLCdnJywnaicpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMiwgMSk7CiAgaGVscGVycy5kb0tleXMoJ2cnLCdrJywnZycsJ2snKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDEpOwp9LHt2YWx1ZTogJ2xpbmUgMVxuXG5saW5lIDInfSk7Ci8vdGVzdGluZyBhIG1peCBvZiBqL2sgYW5kIGdqL2drCnRlc3RWaW0oJ2pfa19hbmRfZ2pfZ2snLCBmdW5jdGlvbihjbSx2aW0saGVscGVycyl7CiAgY20uc2V0U2l6ZSgxMjApOwogIGNtLnNldEN1cnNvcigwLCAwKTsKICAvL2dvIHRvIHRoZSBsYXN0IGNoYXJhY3RlciBvbiB0aGUgZmlyc3QgbGluZQogIGhlbHBlcnMuZG9LZXlzKCckJyk7CiAgLy9tb3ZlIHVwL2Rvd24gb24gdGhlIGNvbHVtbiB3aXRoaW4gdGhlIHdyYXBwZWQgbGluZQogIC8vc2lkZS1lZmZlY3Q6IGN1cnNvciBpcyBub3QgbG9ja2VkIHRvIGVvbCBhbnltb3JlCiAgaGVscGVycy5kb0tleXMoJ2cnLCdrJyk7CiAgdmFyIGN1cj1jbS5nZXRDdXJzb3IoKTsKICBlcShjdXIubGluZSwwKTsKICBpcygoY3VyLmNoPDE3NiksJ2drIGRpZG5cJ3QgbW92ZSBjdXJzb3IgYmFjayAoMSknKTsKICBoZWxwZXJzLmRvS2V5cygnZycsJ2onKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDE3Nik7CiAgLy9zaG91bGQgbW92ZSB0byBjaGFyYWN0ZXIgMTc3IG9uIGxpbmUgMiAoai9rIHByZXNlcnZlIGNoYXJhY3RlciBpbmRleCB3aXRoaW4gbGluZSkKICBoZWxwZXJzLmRvS2V5cygnaicpOwogIC8vZHVlIHRvIGRpZmZlcmVudCBsaW5lIHdyYXBwaW5nLCB0aGUgY3Vyc29yIGNhbiBiZSBvbiBhIGRpZmZlcmVudCBzY3JlZW4teCBub3cKICAvL2dqIGFuZCBnayBwcmVzZXJ2ZSBzY3JlZW4teCBvbiBtb3ZlbWVudCwgbXVjaCBsaWtlIG1vdmVWCiAgaGVscGVycy5kb0tleXMoJzMnLCdnJywnaycpOwogIGN1cj1jbS5nZXRDdXJzb3IoKTsKICBlcShjdXIubGluZSwxKTsKICBpcygoY3VyLmNoPDE3NiksJ2drIGRpZG5cJ3QgbW92ZSBjdXJzb3IgYmFjayAoMiknKTsKICBoZWxwZXJzLmRvS2V5cygnZycsJ2onLCcyJywnZycsJ2onKTsKICAvL3Nob3VsZCByZXR1cm4gdG8gdGhlIHNhbWUgY2hhcmFjdGVyLWluZGV4CiAgaGVscGVycy5kb0tleXMoJ2snKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDE3Nik7Cn0seyBsaW5lV3JhcHBpbmc6dHJ1ZSwgdmFsdWU6ICdUaGlzIGxpbmUgaXMgaW50ZW50aWFsbHkgbG9uZyB0byB0ZXN0IG1vdmVtZW50IG9mIGdqIGFuZCBnayBvdmVyIHdyYXBwZWQgbGluZXMuIEkgd2lsbCBzdGFydCBvbiB0aGUgZW5kIG9mIHRoaXMgbGluZSwgdGhlbiBtYWtlIGEgc3RlcCB1cCBhbmQgYmFjayB0byBzZXQgdGhlIG9yaWdpbiBmb3IgaiBhbmQgay5cblRoaXMgbGluZSBpcyBzdXBwb3NlZCB0byBiZSBldmVuIGxvbmdlciB0aGFuIHRoZSBwcmV2aW91cy4gSSB3aWxsIGp1bXAgaGVyZSBhbmQgbWFrZSBhbm90aGVyIHdpZ2dsZSB3aXRoIGdqIGFuZCBnaywgYmVmb3JlIEkganVtcCBiYWNrIHRvIHRoZSBsaW5lIGFib3ZlLiBCb3RoIHdpZ2dsZXMgc2hvdWxkIG5vdCBjaGFuZ2UgbXkgY3Vyc29yXCdzIHRhcmdldCBjaGFyYWN0ZXIgYnV0IGJvdGggai9rIGFuZCBnai9nayBjaGFuZ2UgZWFjaCBvdGhlclwncyByZWZlcmVuY2UgcG9zaXRpb24uJ30pOwp0ZXN0VmltKCdnal9naycsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBpZiAocGhhbnRvbSkgcmV0dXJuOwogIGNtLnNldFNpemUoMTIwKTsKICAvLyBUZXN0IHRvcCBvZiBkb2N1bWVudCBlZGdlIGNhc2UuCiAgY20uc2V0Q3Vyc29yKDAsIDQpOwogIGhlbHBlcnMuZG9LZXlzKCdnJywgJ2onKTsKICBoZWxwZXJzLmRvS2V5cygnMTAnLCAnZycsICdrJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCA0KTsKCiAgLy8gVGVzdCBtb3ZpbmcgZG93biBwcmVzZXJ2ZXMgY29sdW1uIHBvc2l0aW9uLgogIGhlbHBlcnMuZG9LZXlzKCdnJywgJ2onKTsKICB2YXIgcG9zMSA9IGNtLmdldEN1cnNvcigpOwogIHZhciBleHBlY3RlZFBvczIgPSB7IGxpbmU6IDAsIGNoOiAocG9zMS5jaCAtIDQpICogMiArIDR9OwogIGhlbHBlcnMuZG9LZXlzKCdnJywgJ2onKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KGV4cGVjdGVkUG9zMik7CgogIC8vIE1vdmUgdG8gdGhlIGxhc3QgY2hhcmFjdGVyCiAgY20uc2V0Q3Vyc29yKDAsIDApOwogIC8vIE1vdmUgbGVmdCB0byByZXNldCBIU1BvcwogIGhlbHBlcnMuZG9LZXlzKCdoJyk7CiAgLy8gVGVzdCBib3R0b20gb2YgZG9jdW1lbnQgZWRnZSBjYXNlLgogIGhlbHBlcnMuZG9LZXlzKCcxMDAnLCAnZycsICdqJyk7CiAgdmFyIGVuZGluZ1BvcyA9IGNtLmdldEN1cnNvcigpOwogIGlzKGVuZGluZ1BvcyAhPSAwLCAnZ2ogc2hvdWxkIG5vdCBiZSBvbiB3cmFwcGVkIGxpbmUgMCcpOwogIHZhciB0b3BMZWZ0Q2hhckNvb3JkcyA9IGNtLmNoYXJDb29yZHMobWFrZUN1cnNvcigwLCAwKSk7CiAgdmFyIGVuZGluZ0NoYXJDb29yZHMgPSBjbS5jaGFyQ29vcmRzKGVuZGluZ1Bvcyk7CiAgaXModG9wTGVmdENoYXJDb29yZHMubGVmdCA9PSBlbmRpbmdDaGFyQ29vcmRzLmxlZnQsICdnaiBzaG91bGQgZW5kIHVwIG9uIGNvbHVtbiAwJyk7Cn0seyBsaW5lTnVtYmVyczogZmFsc2UsIGxpbmVXcmFwcGluZzp0cnVlLCB2YWx1ZTogJ1RoaXNsaW5laXNpbnRlbnRpYWxseWxvbmd0b3Rlc3Rtb3ZlbWVudG9mZ2phbmRna292ZXJ3cmFwcGVkbGluZXMuJyB9KTsKdGVzdFZpbSgnfScsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJ30nKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDEsIDApOwogIGNtLnNldEN1cnNvcigwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnMicsICd9Jyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCg0LCAwKTsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJzYnLCAnfScpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoNSwgMCk7Cn0sIHsgdmFsdWU6ICdhXG5cbmJcbmNcblxuZCcgfSk7CnRlc3RWaW0oJ3snLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDUsIDApOwogIGhlbHBlcnMuZG9LZXlzKCd7Jyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCg0LCAwKTsKICBjbS5zZXRDdXJzb3IoNSwgMCk7CiAgaGVscGVycy5kb0tleXMoJzInLCAneycpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMSwgMCk7CiAgY20uc2V0Q3Vyc29yKDUsIDApOwogIGhlbHBlcnMuZG9LZXlzKCc2JywgJ3snKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDApOwp9LCB7IHZhbHVlOiAnYVxuXG5iXG5jXG5cbmQnIH0pOwoKLy8gT3BlcmF0b3IgdGVzdHMKdGVzdFZpbSgnZGwnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgdmFyIGN1clN0YXJ0ID0gbWFrZUN1cnNvcigwLCAwKTsKICBjbS5zZXRDdXJzb3IoY3VyU3RhcnQpOwogIGhlbHBlcnMuZG9LZXlzKCdkJywgJ2wnKTsKICBlcSgnd29yZDEgJywgY20uZ2V0VmFsdWUoKSk7CiAgdmFyIHJlZ2lzdGVyID0gaGVscGVycy5nZXRSZWdpc3RlckNvbnRyb2xsZXIoKS5nZXRSZWdpc3RlcigpOwogIGVxKCcgJywgcmVnaXN0ZXIudG9TdHJpbmcoKSk7CiAgaXMoIXJlZ2lzdGVyLmxpbmV3aXNlKTsKICBlcVBvcyhjdXJTdGFydCwgY20uZ2V0Q3Vyc29yKCkpOwp9LCB7IHZhbHVlOiAnIHdvcmQxICcgfSk7CnRlc3RWaW0oJ2RsX2VvbCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgNik7CiAgaGVscGVycy5kb0tleXMoJ2QnLCAnbCcpOwogIGVxKCcgd29yZDEnLCBjbS5nZXRWYWx1ZSgpKTsKICB2YXIgcmVnaXN0ZXIgPSBoZWxwZXJzLmdldFJlZ2lzdGVyQ29udHJvbGxlcigpLmdldFJlZ2lzdGVyKCk7CiAgZXEoJyAnLCByZWdpc3Rlci50b1N0cmluZygpKTsKICBpcyghcmVnaXN0ZXIubGluZXdpc2UpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgNik7Cn0sIHsgdmFsdWU6ICcgd29yZDEgJyB9KTsKdGVzdFZpbSgnZGxfcmVwZWF0JywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIHZhciBjdXJTdGFydCA9IG1ha2VDdXJzb3IoMCwgMCk7CiAgY20uc2V0Q3Vyc29yKGN1clN0YXJ0KTsKICBoZWxwZXJzLmRvS2V5cygnMicsICdkJywgJ2wnKTsKICBlcSgnb3JkMSAnLCBjbS5nZXRWYWx1ZSgpKTsKICB2YXIgcmVnaXN0ZXIgPSBoZWxwZXJzLmdldFJlZ2lzdGVyQ29udHJvbGxlcigpLmdldFJlZ2lzdGVyKCk7CiAgZXEoJyB3JywgcmVnaXN0ZXIudG9TdHJpbmcoKSk7CiAgaXMoIXJlZ2lzdGVyLmxpbmV3aXNlKTsKICBlcVBvcyhjdXJTdGFydCwgY20uZ2V0Q3Vyc29yKCkpOwp9LCB7IHZhbHVlOiAnIHdvcmQxICcgfSk7CnRlc3RWaW0oJ2RoJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIHZhciBjdXJTdGFydCA9IG1ha2VDdXJzb3IoMCwgMyk7CiAgY20uc2V0Q3Vyc29yKGN1clN0YXJ0KTsKICBoZWxwZXJzLmRvS2V5cygnZCcsICdoJyk7CiAgZXEoJyB3cmQxICcsIGNtLmdldFZhbHVlKCkpOwogIHZhciByZWdpc3RlciA9IGhlbHBlcnMuZ2V0UmVnaXN0ZXJDb250cm9sbGVyKCkuZ2V0UmVnaXN0ZXIoKTsKICBlcSgnbycsIHJlZ2lzdGVyLnRvU3RyaW5nKCkpOwogIGlzKCFyZWdpc3Rlci5saW5ld2lzZSk7CiAgZXFQb3Mob2Zmc2V0Q3Vyc29yKGN1clN0YXJ0LCAwICwgLTEpLCBjbS5nZXRDdXJzb3IoKSk7Cn0sIHsgdmFsdWU6ICcgd29yZDEgJyB9KTsKdGVzdFZpbSgnZGonLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgdmFyIGN1clN0YXJ0ID0gbWFrZUN1cnNvcigwLCAzKTsKICBjbS5zZXRDdXJzb3IoY3VyU3RhcnQpOwogIGhlbHBlcnMuZG9LZXlzKCdkJywgJ2onKTsKICBlcSgnIHdvcmQzJywgY20uZ2V0VmFsdWUoKSk7CiAgdmFyIHJlZ2lzdGVyID0gaGVscGVycy5nZXRSZWdpc3RlckNvbnRyb2xsZXIoKS5nZXRSZWdpc3RlcigpOwogIGVxKCcgd29yZDFcbndvcmQyXG4nLCByZWdpc3Rlci50b1N0cmluZygpKTsKICBpcyhyZWdpc3Rlci5saW5ld2lzZSk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCAxKTsKfSwgeyB2YWx1ZTogJyB3b3JkMVxud29yZDJcbiB3b3JkMycgfSk7CnRlc3RWaW0oJ2RqX2VuZF9vZl9kb2N1bWVudCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICB2YXIgY3VyU3RhcnQgPSBtYWtlQ3Vyc29yKDAsIDMpOwogIGNtLnNldEN1cnNvcihjdXJTdGFydCk7CiAgaGVscGVycy5kb0tleXMoJ2QnLCAnaicpOwogIGVxKCcgd29yZDEgJywgY20uZ2V0VmFsdWUoKSk7CiAgdmFyIHJlZ2lzdGVyID0gaGVscGVycy5nZXRSZWdpc3RlckNvbnRyb2xsZXIoKS5nZXRSZWdpc3RlcigpOwogIGVxKCcnLCByZWdpc3Rlci50b1N0cmluZygpKTsKICBpcyghcmVnaXN0ZXIubGluZXdpc2UpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgMyk7Cn0sIHsgdmFsdWU6ICcgd29yZDEgJyB9KTsKdGVzdFZpbSgnZGsnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgdmFyIGN1clN0YXJ0ID0gbWFrZUN1cnNvcigxLCAzKTsKICBjbS5zZXRDdXJzb3IoY3VyU3RhcnQpOwogIGhlbHBlcnMuZG9LZXlzKCdkJywgJ2snKTsKICBlcSgnIHdvcmQzJywgY20uZ2V0VmFsdWUoKSk7CiAgdmFyIHJlZ2lzdGVyID0gaGVscGVycy5nZXRSZWdpc3RlckNvbnRyb2xsZXIoKS5nZXRSZWdpc3RlcigpOwogIGVxKCcgd29yZDFcbndvcmQyXG4nLCByZWdpc3Rlci50b1N0cmluZygpKTsKICBpcyhyZWdpc3Rlci5saW5ld2lzZSk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCAxKTsKfSwgeyB2YWx1ZTogJyB3b3JkMVxud29yZDJcbiB3b3JkMycgfSk7CnRlc3RWaW0oJ2RrX3N0YXJ0X29mX2RvY3VtZW50JywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIHZhciBjdXJTdGFydCA9IG1ha2VDdXJzb3IoMCwgMyk7CiAgY20uc2V0Q3Vyc29yKGN1clN0YXJ0KTsKICBoZWxwZXJzLmRvS2V5cygnZCcsICdrJyk7CiAgZXEoJyB3b3JkMSAnLCBjbS5nZXRWYWx1ZSgpKTsKICB2YXIgcmVnaXN0ZXIgPSBoZWxwZXJzLmdldFJlZ2lzdGVyQ29udHJvbGxlcigpLmdldFJlZ2lzdGVyKCk7CiAgZXEoJycsIHJlZ2lzdGVyLnRvU3RyaW5nKCkpOwogIGlzKCFyZWdpc3Rlci5saW5ld2lzZSk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCAzKTsKfSwgeyB2YWx1ZTogJyB3b3JkMSAnIH0pOwp0ZXN0VmltKCdkd19zcGFjZScsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICB2YXIgY3VyU3RhcnQgPSBtYWtlQ3Vyc29yKDAsIDApOwogIGNtLnNldEN1cnNvcihjdXJTdGFydCk7CiAgaGVscGVycy5kb0tleXMoJ2QnLCAndycpOwogIGVxKCd3b3JkMSAnLCBjbS5nZXRWYWx1ZSgpKTsKICB2YXIgcmVnaXN0ZXIgPSBoZWxwZXJzLmdldFJlZ2lzdGVyQ29udHJvbGxlcigpLmdldFJlZ2lzdGVyKCk7CiAgZXEoJyAnLCByZWdpc3Rlci50b1N0cmluZygpKTsKICBpcyghcmVnaXN0ZXIubGluZXdpc2UpOwogIGVxUG9zKGN1clN0YXJ0LCBjbS5nZXRDdXJzb3IoKSk7Cn0sIHsgdmFsdWU6ICcgd29yZDEgJyB9KTsKdGVzdFZpbSgnZHdfd29yZCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICB2YXIgY3VyU3RhcnQgPSBtYWtlQ3Vyc29yKDAsIDEpOwogIGNtLnNldEN1cnNvcihjdXJTdGFydCk7CiAgaGVscGVycy5kb0tleXMoJ2QnLCAndycpOwogIGVxKCcgd29yZDInLCBjbS5nZXRWYWx1ZSgpKTsKICB2YXIgcmVnaXN0ZXIgPSBoZWxwZXJzLmdldFJlZ2lzdGVyQ29udHJvbGxlcigpLmdldFJlZ2lzdGVyKCk7CiAgZXEoJ3dvcmQxICcsIHJlZ2lzdGVyLnRvU3RyaW5nKCkpOwogIGlzKCFyZWdpc3Rlci5saW5ld2lzZSk7CiAgZXFQb3MoY3VyU3RhcnQsIGNtLmdldEN1cnNvcigpKTsKfSwgeyB2YWx1ZTogJyB3b3JkMSB3b3JkMicgfSk7CnRlc3RWaW0oJ2R3X29ubHlfd29yZCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICAvLyBUZXN0IHRoYXQgaWYgdGhlcmUgaXMgb25seSAxIHdvcmQgbGVmdCwgZHcgZGVsZXRlcyB0aWxsIHRoZSBlbmQgb2YgdGhlCiAgLy8gbGluZS4KICBjbS5zZXRDdXJzb3IoMCwgMSk7CiAgaGVscGVycy5kb0tleXMoJ2QnLCAndycpOwogIGVxKCcgJywgY20uZ2V0VmFsdWUoKSk7CiAgdmFyIHJlZ2lzdGVyID0gaGVscGVycy5nZXRSZWdpc3RlckNvbnRyb2xsZXIoKS5nZXRSZWdpc3RlcigpOwogIGVxKCd3b3JkMSAnLCByZWdpc3Rlci50b1N0cmluZygpKTsKICBpcyghcmVnaXN0ZXIubGluZXdpc2UpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgMSk7Cn0sIHsgdmFsdWU6ICcgd29yZDEgJyB9KTsKdGVzdFZpbSgnZHdfZW9sJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIC8vIEFzc2VydCB0aGF0IGR3IGRvZXMgbm90IGRlbGV0ZSB0aGUgbmV3bGluZSBpZiBsYXN0IHdvcmQgdG8gZGVsZXRlIGlzIGF0IGVuZAogIC8vIG9mIGxpbmUuCiAgY20uc2V0Q3Vyc29yKDAsIDEpOwogIGhlbHBlcnMuZG9LZXlzKCdkJywgJ3cnKTsKICBlcSgnIFxud29yZDInLCBjbS5nZXRWYWx1ZSgpKTsKICB2YXIgcmVnaXN0ZXIgPSBoZWxwZXJzLmdldFJlZ2lzdGVyQ29udHJvbGxlcigpLmdldFJlZ2lzdGVyKCk7CiAgZXEoJ3dvcmQxJywgcmVnaXN0ZXIudG9TdHJpbmcoKSk7CiAgaXMoIXJlZ2lzdGVyLmxpbmV3aXNlKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDEpOwp9LCB7IHZhbHVlOiAnIHdvcmQxXG53b3JkMicgfSk7CnRlc3RWaW0oJ2R3X2VvbF93aXRoX211bHRpcGxlX25ld2xpbmVzJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIC8vIEFzc2VydCB0aGF0IGR3IGRvZXMgbm90IGRlbGV0ZSB0aGUgbmV3bGluZSBpZiBsYXN0IHdvcmQgdG8gZGVsZXRlIGlzIGF0IGVuZAogIC8vIG9mIGxpbmUgYW5kIGl0IGlzIGZvbGxvd2VkIGJ5IG11bHRpcGxlIG5ld2xpbmVzLgogIGNtLnNldEN1cnNvcigwLCAxKTsKICBoZWxwZXJzLmRvS2V5cygnZCcsICd3Jyk7CiAgZXEoJyBcblxud29yZDInLCBjbS5nZXRWYWx1ZSgpKTsKICB2YXIgcmVnaXN0ZXIgPSBoZWxwZXJzLmdldFJlZ2lzdGVyQ29udHJvbGxlcigpLmdldFJlZ2lzdGVyKCk7CiAgZXEoJ3dvcmQxJywgcmVnaXN0ZXIudG9TdHJpbmcoKSk7CiAgaXMoIXJlZ2lzdGVyLmxpbmV3aXNlKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDEpOwp9LCB7IHZhbHVlOiAnIHdvcmQxXG5cbndvcmQyJyB9KTsKdGVzdFZpbSgnZHdfZW1wdHlfbGluZV9mb2xsb3dlZF9ieV93aGl0ZXNwYWNlJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnZCcsICd3Jyk7CiAgZXEoJyAgXG53b3JkJywgY20uZ2V0VmFsdWUoKSk7Cn0sIHsgdmFsdWU6ICdcbiAgXG53b3JkJyB9KTsKdGVzdFZpbSgnZHdfZW1wdHlfbGluZV9mb2xsb3dlZF9ieV93b3JkJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnZCcsICd3Jyk7CiAgZXEoJ3dvcmQnLCBjbS5nZXRWYWx1ZSgpKTsKfSwgeyB2YWx1ZTogJ1xud29yZCcgfSk7CnRlc3RWaW0oJ2R3X2VtcHR5X2xpbmVfZm9sbG93ZWRfYnlfZW1wdHlfbGluZScsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJ2QnLCAndycpOwogIGVxKCdcbicsIGNtLmdldFZhbHVlKCkpOwp9LCB7IHZhbHVlOiAnXG5cbicgfSk7CnRlc3RWaW0oJ2R3X3doaXRlc3BhY2VfZm9sbG93ZWRfYnlfd2hpdGVzcGFjZScsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJ2QnLCAndycpOwogIGVxKCdcbiAgIFxuJywgY20uZ2V0VmFsdWUoKSk7Cn0sIHsgdmFsdWU6ICcgIFxuICAgXG4nIH0pOwp0ZXN0VmltKCdkd193aGl0ZXNwYWNlX2ZvbGxvd2VkX2J5X2VtcHR5X2xpbmUnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDApOwogIGhlbHBlcnMuZG9LZXlzKCdkJywgJ3cnKTsKICBlcSgnXG5cbicsIGNtLmdldFZhbHVlKCkpOwp9LCB7IHZhbHVlOiAnICBcblxuJyB9KTsKdGVzdFZpbSgnZHdfd29yZF93aGl0ZXNwYWNlX3dvcmQnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDApOwogIGhlbHBlcnMuZG9LZXlzKCdkJywgJ3cnKTsKICBlcSgnXG4gICBcbndvcmQyJywgY20uZ2V0VmFsdWUoKSk7Cn0sIHsgdmFsdWU6ICd3b3JkMVxuICAgXG53b3JkMid9KQp0ZXN0VmltKCdkd19lbmRfb2ZfZG9jdW1lbnQnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDEsIDIpOwogIGhlbHBlcnMuZG9LZXlzKCdkJywgJ3cnKTsKICBlcSgnXG5hYicsIGNtLmdldFZhbHVlKCkpOwp9LCB7IHZhbHVlOiAnXG5hYmMnIH0pOwp0ZXN0VmltKCdkd19yZXBlYXQnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgLy8gQXNzZXJ0IHRoYXQgZHcgZG9lcyBkZWxldGUgbmV3bGluZSBpZiBpdCBzaG91bGQgZ28gdG8gdGhlIG5leHQgbGluZSwgYW5kCiAgLy8gdGhhdCByZXBlYXQgd29ya3MgcHJvcGVybHkuCiAgY20uc2V0Q3Vyc29yKDAsIDEpOwogIGhlbHBlcnMuZG9LZXlzKCdkJywgJzInLCAndycpOwogIGVxKCcgJywgY20uZ2V0VmFsdWUoKSk7CiAgdmFyIHJlZ2lzdGVyID0gaGVscGVycy5nZXRSZWdpc3RlckNvbnRyb2xsZXIoKS5nZXRSZWdpc3RlcigpOwogIGVxKCd3b3JkMVxud29yZDInLCByZWdpc3Rlci50b1N0cmluZygpKTsKICBpcyghcmVnaXN0ZXIubGluZXdpc2UpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgMSk7Cn0sIHsgdmFsdWU6ICcgd29yZDFcbndvcmQyJyB9KTsKdGVzdFZpbSgnZGVfd29yZF9zdGFydF9hbmRfZW1wdHlfbGluZXMnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDApOwogIGhlbHBlcnMuZG9LZXlzKCdkJywgJ2UnKTsKICBlcSgnXG5cbicsIGNtLmdldFZhbHVlKCkpOwp9LCB7IHZhbHVlOiAnd29yZFxuXG4nIH0pOwp0ZXN0VmltKCdkZV93b3JkX2VuZF9hbmRfZW1wdHlfbGluZXMnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDMpOwogIGhlbHBlcnMuZG9LZXlzKCdkJywgJ2UnKTsKICBlcSgnd29yJywgY20uZ2V0VmFsdWUoKSk7Cn0sIHsgdmFsdWU6ICd3b3JkXG5cblxuJyB9KTsKdGVzdFZpbSgnZGVfd2hpdGVzcGFjZV9hbmRfZW1wdHlfbGluZXMnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDApOwogIGhlbHBlcnMuZG9LZXlzKCdkJywgJ2UnKTsKICBlcSgnJywgY20uZ2V0VmFsdWUoKSk7Cn0sIHsgdmFsdWU6ICcgICBcblxuXG4nIH0pOwp0ZXN0VmltKCdkZV9lbmRfb2ZfZG9jdW1lbnQnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDEsIDIpOwogIGhlbHBlcnMuZG9LZXlzKCdkJywgJ2UnKTsKICBlcSgnXG5hYicsIGNtLmdldFZhbHVlKCkpOwp9LCB7IHZhbHVlOiAnXG5hYmMnIH0pOwp0ZXN0VmltKCdkYl9lbXB0eV9saW5lcycsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMiwgMCk7CiAgaGVscGVycy5kb0tleXMoJ2QnLCAnYicpOwogIGVxKCdcblxuJywgY20uZ2V0VmFsdWUoKSk7Cn0sIHsgdmFsdWU6ICdcblxuXG4nIH0pOwp0ZXN0VmltKCdkYl93b3JkX3N0YXJ0X2FuZF9lbXB0eV9saW5lcycsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMiwgMCk7CiAgaGVscGVycy5kb0tleXMoJ2QnLCAnYicpOwogIGVxKCdcbndvcmQnLCBjbS5nZXRWYWx1ZSgpKTsKfSwgeyB2YWx1ZTogJ1xuXG53b3JkJyB9KTsKdGVzdFZpbSgnZGJfd29yZF9lbmRfYW5kX2VtcHR5X2xpbmVzJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigyLCAzKTsKICBoZWxwZXJzLmRvS2V5cygnZCcsICdiJyk7CiAgZXEoJ1xuXG5kJywgY20uZ2V0VmFsdWUoKSk7Cn0sIHsgdmFsdWU6ICdcblxud29yZCcgfSk7CnRlc3RWaW0oJ2RiX3doaXRlc3BhY2VfYW5kX2VtcHR5X2xpbmVzJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigyLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnZCcsICdiJyk7CiAgZXEoJycsIGNtLmdldFZhbHVlKCkpOwp9LCB7IHZhbHVlOiAnXG4gICBcbicgfSk7CnRlc3RWaW0oJ2RiX3N0YXJ0X29mX2RvY3VtZW50JywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnZCcsICdiJyk7CiAgZXEoJ2FiY1xuJywgY20uZ2V0VmFsdWUoKSk7Cn0sIHsgdmFsdWU6ICdhYmNcbicgfSk7CnRlc3RWaW0oJ2RnZV9lbXB0eV9saW5lcycsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMSwgMCk7CiAgaGVscGVycy5kb0tleXMoJ2QnLCAnZycsICdlJyk7CiAgLy8gTm90ZTogSW4gcmVhbCBWSU0gdGhlIHJlc3VsdCBzaG91bGQgYmUgJycsIGJ1dCBpdCdzIG5vdCBxdWl0ZSBjb25zaXN0ZW50LAogIC8vIHNpbmNlIDIgbmV3bGluZXMgYXJlIGRlbGV0ZWQuIEJ1dCBpbiB0aGUgc2ltaWxhciBjYXNlIG9mIHdvcmRcblxuLCBvbmx5CiAgLy8gMSBuZXdsaW5lIGlzIGRlbGV0ZWQuIFdlJ2xsIGRpdmVyZ2UgZnJvbSBWSU0ncyBiZWhhdmlvciBzaW5jZSBpdCdzIG11Y2gKICAvLyBlYXNpZXIgdGhpcyB3YXkuCiAgZXEoJ1xuJywgY20uZ2V0VmFsdWUoKSk7Cn0sIHsgdmFsdWU6ICdcblxuJyB9KTsKdGVzdFZpbSgnZGdlX3dvcmRfYW5kX2VtcHR5X2xpbmVzJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigxLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnZCcsICdnJywgJ2UnKTsKICBlcSgnd29yXG4nLCBjbS5nZXRWYWx1ZSgpKTsKfSwgeyB2YWx1ZTogJ3dvcmRcblxuJ30pOwp0ZXN0VmltKCdkZ2Vfd2hpdGVzcGFjZV9hbmRfZW1wdHlfbGluZXMnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDIsIDApOwogIGhlbHBlcnMuZG9LZXlzKCdkJywgJ2cnLCAnZScpOwogIGVxKCcnLCBjbS5nZXRWYWx1ZSgpKTsKfSwgeyB2YWx1ZTogJ1xuICBcbicgfSk7CnRlc3RWaW0oJ2RnZV9zdGFydF9vZl9kb2N1bWVudCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJ2QnLCAnZycsICdlJyk7CiAgZXEoJ2JjXG4nLCBjbS5nZXRWYWx1ZSgpKTsKfSwgeyB2YWx1ZTogJ2FiY1xuJyB9KTsKdGVzdFZpbSgnZF9pbmNsdXNpdmUnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgLy8gQXNzZXJ0IHRoYXQgd2hlbiBpbmNsdXNpdmUgaXMgc2V0LCB0aGUgY2hhcmFjdGVyIHRoZSBjdXJzb3IgaXMgb24gZ2V0cwogIC8vIGRlbGV0ZWQgdG9vLgogIHZhciBjdXJTdGFydCA9IG1ha2VDdXJzb3IoMCwgMSk7CiAgY20uc2V0Q3Vyc29yKGN1clN0YXJ0KTsKICBoZWxwZXJzLmRvS2V5cygnZCcsICdlJyk7CiAgZXEoJyAgJywgY20uZ2V0VmFsdWUoKSk7CiAgdmFyIHJlZ2lzdGVyID0gaGVscGVycy5nZXRSZWdpc3RlckNvbnRyb2xsZXIoKS5nZXRSZWdpc3RlcigpOwogIGVxKCd3b3JkMScsIHJlZ2lzdGVyLnRvU3RyaW5nKCkpOwogIGlzKCFyZWdpc3Rlci5saW5ld2lzZSk7CiAgZXFQb3MoY3VyU3RhcnQsIGNtLmdldEN1cnNvcigpKTsKfSwgeyB2YWx1ZTogJyB3b3JkMSAnIH0pOwp0ZXN0VmltKCdkX3JldmVyc2UnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgLy8gVGVzdCB0aGF0IGRlbGV0aW5nIGluIHJldmVyc2Ugd29ya3MuCiAgY20uc2V0Q3Vyc29yKDEsIDApOwogIGhlbHBlcnMuZG9LZXlzKCdkJywgJ2InKTsKICBlcSgnIHdvcmQyICcsIGNtLmdldFZhbHVlKCkpOwogIHZhciByZWdpc3RlciA9IGhlbHBlcnMuZ2V0UmVnaXN0ZXJDb250cm9sbGVyKCkuZ2V0UmVnaXN0ZXIoKTsKICBlcSgnd29yZDFcbicsIHJlZ2lzdGVyLnRvU3RyaW5nKCkpOwogIGlzKCFyZWdpc3Rlci5saW5ld2lzZSk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCAxKTsKfSwgeyB2YWx1ZTogJyB3b3JkMVxud29yZDIgJyB9KTsKdGVzdFZpbSgnZGQnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDMpOwogIHZhciBleHBlY3RlZEJ1ZmZlciA9IGNtLmdldFJhbmdlKHsgbGluZTogMCwgY2g6IDAgfSwKICAgIHsgbGluZTogMSwgY2g6IDAgfSk7CiAgdmFyIGV4cGVjdGVkTGluZUNvdW50ID0gY20ubGluZUNvdW50KCkgLSAxOwogIGhlbHBlcnMuZG9LZXlzKCdkJywgJ2QnKTsKICBlcShleHBlY3RlZExpbmVDb3VudCwgY20ubGluZUNvdW50KCkpOwogIHZhciByZWdpc3RlciA9IGhlbHBlcnMuZ2V0UmVnaXN0ZXJDb250cm9sbGVyKCkuZ2V0UmVnaXN0ZXIoKTsKICBlcShleHBlY3RlZEJ1ZmZlciwgcmVnaXN0ZXIudG9TdHJpbmcoKSk7CiAgaXMocmVnaXN0ZXIubGluZXdpc2UpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgbGluZXNbMV0udGV4dFN0YXJ0KTsKfSk7CnRlc3RWaW0oJ2RkX3ByZWZpeF9yZXBlYXQnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDMpOwogIHZhciBleHBlY3RlZEJ1ZmZlciA9IGNtLmdldFJhbmdlKHsgbGluZTogMCwgY2g6IDAgfSwKICAgIHsgbGluZTogMiwgY2g6IDAgfSk7CiAgdmFyIGV4cGVjdGVkTGluZUNvdW50ID0gY20ubGluZUNvdW50KCkgLSAyOwogIGhlbHBlcnMuZG9LZXlzKCcyJywgJ2QnLCAnZCcpOwogIGVxKGV4cGVjdGVkTGluZUNvdW50LCBjbS5saW5lQ291bnQoKSk7CiAgdmFyIHJlZ2lzdGVyID0gaGVscGVycy5nZXRSZWdpc3RlckNvbnRyb2xsZXIoKS5nZXRSZWdpc3RlcigpOwogIGVxKGV4cGVjdGVkQnVmZmVyLCByZWdpc3Rlci50b1N0cmluZygpKTsKICBpcyhyZWdpc3Rlci5saW5ld2lzZSk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCBsaW5lc1syXS50ZXh0U3RhcnQpOwp9KTsKdGVzdFZpbSgnZGRfbW90aW9uX3JlcGVhdCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgMyk7CiAgdmFyIGV4cGVjdGVkQnVmZmVyID0gY20uZ2V0UmFuZ2UoeyBsaW5lOiAwLCBjaDogMCB9LAogICAgeyBsaW5lOiAyLCBjaDogMCB9KTsKICB2YXIgZXhwZWN0ZWRMaW5lQ291bnQgPSBjbS5saW5lQ291bnQoKSAtIDI7CiAgaGVscGVycy5kb0tleXMoJ2QnLCAnMicsICdkJyk7CiAgZXEoZXhwZWN0ZWRMaW5lQ291bnQsIGNtLmxpbmVDb3VudCgpKTsKICB2YXIgcmVnaXN0ZXIgPSBoZWxwZXJzLmdldFJlZ2lzdGVyQ29udHJvbGxlcigpLmdldFJlZ2lzdGVyKCk7CiAgZXEoZXhwZWN0ZWRCdWZmZXIsIHJlZ2lzdGVyLnRvU3RyaW5nKCkpOwogIGlzKHJlZ2lzdGVyLmxpbmV3aXNlKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIGxpbmVzWzJdLnRleHRTdGFydCk7Cn0pOwp0ZXN0VmltKCdkZF9tdWx0aXBseV9yZXBlYXQnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDMpOwogIHZhciBleHBlY3RlZEJ1ZmZlciA9IGNtLmdldFJhbmdlKHsgbGluZTogMCwgY2g6IDAgfSwKICAgIHsgbGluZTogNiwgY2g6IDAgfSk7CiAgdmFyIGV4cGVjdGVkTGluZUNvdW50ID0gY20ubGluZUNvdW50KCkgLSA2OwogIGhlbHBlcnMuZG9LZXlzKCcyJywgJ2QnLCAnMycsICdkJyk7CiAgZXEoZXhwZWN0ZWRMaW5lQ291bnQsIGNtLmxpbmVDb3VudCgpKTsKICB2YXIgcmVnaXN0ZXIgPSBoZWxwZXJzLmdldFJlZ2lzdGVyQ29udHJvbGxlcigpLmdldFJlZ2lzdGVyKCk7CiAgZXEoZXhwZWN0ZWRCdWZmZXIsIHJlZ2lzdGVyLnRvU3RyaW5nKCkpOwogIGlzKHJlZ2lzdGVyLmxpbmV3aXNlKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIGxpbmVzWzZdLnRleHRTdGFydCk7Cn0pOwp0ZXN0VmltKCdkZF9sYXN0bGluZScsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoY20ubGluZUNvdW50KCksIDApOwogIHZhciBleHBlY3RlZExpbmVDb3VudCA9IGNtLmxpbmVDb3VudCgpIC0gMTsKICBoZWxwZXJzLmRvS2V5cygnZCcsICdkJyk7CiAgZXEoZXhwZWN0ZWRMaW5lQ291bnQsIGNtLmxpbmVDb3VudCgpKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KGNtLmxpbmVDb3VudCgpIC0gMSwgMCk7Cn0pOwovLyBZYW5rIGNvbW1hbmRzIHNob3VsZCBiZWhhdmUgdGhlIGV4YWN0IHNhbWUgYXMgZCBjb21tYW5kcywgZXhwZWN0IHRoYXQgbm90aGluZwovLyBnZXRzIGRlbGV0ZWQuCnRlc3RWaW0oJ3l3X3JlcGVhdCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICAvLyBBc3NlcnQgdGhhdCB5dyBkb2VzIHlhbmsgbmV3bGluZSBpZiBpdCBzaG91bGQgZ28gdG8gdGhlIG5leHQgbGluZSwgYW5kCiAgLy8gdGhhdCByZXBlYXQgd29ya3MgcHJvcGVybHkuCiAgdmFyIGN1clN0YXJ0ID0gbWFrZUN1cnNvcigwLCAxKTsKICBjbS5zZXRDdXJzb3IoY3VyU3RhcnQpOwogIGhlbHBlcnMuZG9LZXlzKCd5JywgJzInLCAndycpOwogIGVxKCcgd29yZDFcbndvcmQyJywgY20uZ2V0VmFsdWUoKSk7CiAgdmFyIHJlZ2lzdGVyID0gaGVscGVycy5nZXRSZWdpc3RlckNvbnRyb2xsZXIoKS5nZXRSZWdpc3RlcigpOwogIGVxKCd3b3JkMVxud29yZDInLCByZWdpc3Rlci50b1N0cmluZygpKTsKICBpcyghcmVnaXN0ZXIubGluZXdpc2UpOwogIGVxUG9zKGN1clN0YXJ0LCBjbS5nZXRDdXJzb3IoKSk7Cn0sIHsgdmFsdWU6ICcgd29yZDFcbndvcmQyJyB9KTsKdGVzdFZpbSgneXlfbXVsdGlwbHlfcmVwZWF0JywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIHZhciBjdXJTdGFydCA9IG1ha2VDdXJzb3IoMCwgMyk7CiAgY20uc2V0Q3Vyc29yKGN1clN0YXJ0KTsKICB2YXIgZXhwZWN0ZWRCdWZmZXIgPSBjbS5nZXRSYW5nZSh7IGxpbmU6IDAsIGNoOiAwIH0sCiAgICB7IGxpbmU6IDYsIGNoOiAwIH0pOwogIHZhciBleHBlY3RlZExpbmVDb3VudCA9IGNtLmxpbmVDb3VudCgpOwogIGhlbHBlcnMuZG9LZXlzKCcyJywgJ3knLCAnMycsICd5Jyk7CiAgZXEoZXhwZWN0ZWRMaW5lQ291bnQsIGNtLmxpbmVDb3VudCgpKTsKICB2YXIgcmVnaXN0ZXIgPSBoZWxwZXJzLmdldFJlZ2lzdGVyQ29udHJvbGxlcigpLmdldFJlZ2lzdGVyKCk7CiAgZXEoZXhwZWN0ZWRCdWZmZXIsIHJlZ2lzdGVyLnRvU3RyaW5nKCkpOwogIGlzKHJlZ2lzdGVyLmxpbmV3aXNlKTsKICBlcVBvcyhjdXJTdGFydCwgY20uZ2V0Q3Vyc29yKCkpOwp9KTsKLy8gQ2hhbmdlIGNvbW1hbmRzIGJlaGF2ZSBsaWtlIGQgY29tbWFuZHMgZXhjZXB0IHRoYXQgaXQgYWxzbyBlbnRlcnMgaW5zZXJ0Ci8vIG1vZGUuIEluIGFkZGl0aW9uLCB3aGVuIHRoZSBjaGFuZ2UgaXMgbGluZXdpc2UsIGFuIGFkZGl0aW9uYWwgbmV3bGluZSBpcwovLyBpbnNlcnRlZCBzbyB0aGF0IGluc2VydCBtb2RlIHN0YXJ0cyBvbiB0aGF0IGxpbmUuCnRlc3RWaW0oJ2N3JywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnYycsICcyJywgJ3cnKTsKICBlcSgnIHdvcmQzJywgY20uZ2V0VmFsdWUoKSk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCAwKTsKfSwgeyB2YWx1ZTogJ3dvcmQxIHdvcmQyIHdvcmQzJ30pOwp0ZXN0VmltKCdjd19yZXBlYXQnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgLy8gQXNzZXJ0IHRoYXQgY3cgZG9lcyBkZWxldGUgbmV3bGluZSBpZiBpdCBzaG91bGQgZ28gdG8gdGhlIG5leHQgbGluZSwgYW5kCiAgLy8gdGhhdCByZXBlYXQgd29ya3MgcHJvcGVybHkuCiAgdmFyIGN1clN0YXJ0ID0gbWFrZUN1cnNvcigwLCAxKTsKICBjbS5zZXRDdXJzb3IoY3VyU3RhcnQpOwogIGhlbHBlcnMuZG9LZXlzKCdjJywgJzInLCAndycpOwogIGVxKCcgJywgY20uZ2V0VmFsdWUoKSk7CiAgdmFyIHJlZ2lzdGVyID0gaGVscGVycy5nZXRSZWdpc3RlckNvbnRyb2xsZXIoKS5nZXRSZWdpc3RlcigpOwogIGVxKCd3b3JkMVxud29yZDInLCByZWdpc3Rlci50b1N0cmluZygpKTsKICBpcyghcmVnaXN0ZXIubGluZXdpc2UpOwogIGVxUG9zKGN1clN0YXJ0LCBjbS5nZXRDdXJzb3IoKSk7CiAgZXEoJ3ZpbS1pbnNlcnQnLCBjbS5nZXRPcHRpb24oJ2tleU1hcCcpKTsKfSwgeyB2YWx1ZTogJyB3b3JkMVxud29yZDInIH0pOwp0ZXN0VmltKCdjY19tdWx0aXBseV9yZXBlYXQnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDMpOwogIHZhciBleHBlY3RlZEJ1ZmZlciA9IGNtLmdldFJhbmdlKHsgbGluZTogMCwgY2g6IDAgfSwKICAgIHsgbGluZTogNiwgY2g6IDAgfSk7CiAgdmFyIGV4cGVjdGVkTGluZUNvdW50ID0gY20ubGluZUNvdW50KCkgLSA1OwogIGhlbHBlcnMuZG9LZXlzKCcyJywgJ2MnLCAnMycsICdjJyk7CiAgZXEoZXhwZWN0ZWRMaW5lQ291bnQsIGNtLmxpbmVDb3VudCgpKTsKICB2YXIgcmVnaXN0ZXIgPSBoZWxwZXJzLmdldFJlZ2lzdGVyQ29udHJvbGxlcigpLmdldFJlZ2lzdGVyKCk7CiAgZXEoZXhwZWN0ZWRCdWZmZXIsIHJlZ2lzdGVyLnRvU3RyaW5nKCkpOwogIGlzKHJlZ2lzdGVyLmxpbmV3aXNlKTsKICBlcSgndmltLWluc2VydCcsIGNtLmdldE9wdGlvbigna2V5TWFwJykpOwp9KTsKdGVzdFZpbSgnY2NfYXBwZW5kJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIHZhciBleHBlY3RlZExpbmVDb3VudCA9IGNtLmxpbmVDb3VudCgpOwogIGNtLnNldEN1cnNvcihjbS5sYXN0TGluZSgpLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnYycsICdjJyk7CiAgZXEoZXhwZWN0ZWRMaW5lQ291bnQsIGNtLmxpbmVDb3VudCgpKTsKfSk7CnRlc3RWaW0oJ2NfdmlzdWFsX2Jsb2NrJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAxKTsKICBoZWxwZXJzLmRvS2V5cygnPEMtdj4nLCAnMicsICdqJywgJ2wnLCAnbCcsICdsJywgJ2MnKTsKICB2YXIgcmVwbGFjZW1lbnQgPSBuZXcgQXJyYXkoY20ubGlzdFNlbGVjdGlvbnMoKS5sZW5ndGgrMSkuam9pbignaGVsbG8gJykuc3BsaXQoJyAnKTsKICByZXBsYWNlbWVudC5wb3AoKTsKICBjbS5yZXBsYWNlU2VsZWN0aW9ucyhyZXBsYWNlbWVudCk7CiAgZXEoJzFoZWxsb1xuNWhlbGxvXG5haGVsbG9mZycsIGNtLmdldFZhbHVlKCkpOwogIGNtLnNldEN1cnNvcigyLCAzKTsKICBoZWxwZXJzLmRvS2V5cygnPEMtdj4nLCAnMicsICdrJywgJ2gnLCAnQycpOwogIHJlcGxhY2VtZW50ID0gbmV3IEFycmF5KGNtLmxpc3RTZWxlY3Rpb25zKCkubGVuZ3RoKzEpLmpvaW4oJ3dvcmxkICcpLnNwbGl0KCcgJyk7CiAgcmVwbGFjZW1lbnQucG9wKCk7CiAgY20ucmVwbGFjZVNlbGVjdGlvbnMocmVwbGFjZW1lbnQpOwogIGVxKCcxaHdvcmxkXG41aHdvcmxkXG5haHdvcmxkJywgY20uZ2V0VmFsdWUoKSk7Cn0sIHt2YWx1ZTogJzEyMzRcbjU2NzhcbmFiY2RlZmcnfSk7Ci8vIFN3YXBjYXNlIGNvbW1hbmRzIGVkaXQgaW4gcGxhY2UgYW5kIGRvIG5vdCBtb2RpZnkgcmVnaXN0ZXJzLgp0ZXN0VmltKCdnfndfcmVwZWF0JywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIC8vIEFzc2VydCB0aGF0IGR3IGRvZXMgZGVsZXRlIG5ld2xpbmUgaWYgaXQgc2hvdWxkIGdvIHRvIHRoZSBuZXh0IGxpbmUsIGFuZAogIC8vIHRoYXQgcmVwZWF0IHdvcmtzIHByb3Blcmx5LgogIHZhciBjdXJTdGFydCA9IG1ha2VDdXJzb3IoMCwgMSk7CiAgY20uc2V0Q3Vyc29yKGN1clN0YXJ0KTsKICBoZWxwZXJzLmRvS2V5cygnZycsICd+JywgJzInLCAndycpOwogIGVxKCcgV09SRDFcbldPUkQyJywgY20uZ2V0VmFsdWUoKSk7CiAgdmFyIHJlZ2lzdGVyID0gaGVscGVycy5nZXRSZWdpc3RlckNvbnRyb2xsZXIoKS5nZXRSZWdpc3RlcigpOwogIGVxKCcnLCByZWdpc3Rlci50b1N0cmluZygpKTsKICBpcyghcmVnaXN0ZXIubGluZXdpc2UpOwogIGVxUG9zKGN1clN0YXJ0LCBjbS5nZXRDdXJzb3IoKSk7Cn0sIHsgdmFsdWU6ICcgd29yZDFcbndvcmQyJyB9KTsKdGVzdFZpbSgnZ35nficsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICB2YXIgY3VyU3RhcnQgPSBtYWtlQ3Vyc29yKDAsIDMpOwogIGNtLnNldEN1cnNvcihjdXJTdGFydCk7CiAgdmFyIGV4cGVjdGVkTGluZUNvdW50ID0gY20ubGluZUNvdW50KCk7CiAgdmFyIGV4cGVjdGVkVmFsdWUgPSBjbS5nZXRWYWx1ZSgpLnRvVXBwZXJDYXNlKCk7CiAgaGVscGVycy5kb0tleXMoJzInLCAnZycsICd+JywgJzMnLCAnZycsICd+Jyk7CiAgZXEoZXhwZWN0ZWRWYWx1ZSwgY20uZ2V0VmFsdWUoKSk7CiAgdmFyIHJlZ2lzdGVyID0gaGVscGVycy5nZXRSZWdpc3RlckNvbnRyb2xsZXIoKS5nZXRSZWdpc3RlcigpOwogIGVxKCcnLCByZWdpc3Rlci50b1N0cmluZygpKTsKICBpcyghcmVnaXN0ZXIubGluZXdpc2UpOwogIGVxUG9zKHtsaW5lOiBjdXJTdGFydC5saW5lLCBjaDowfSwgY20uZ2V0Q3Vyc29yKCkpOwp9LCB7IHZhbHVlOiAnIHdvcmQxXG53b3JkMlxud29yZDNcbndvcmQ0XG53b3JkNVxud29yZDYnIH0pOwp0ZXN0VmltKCd2aXN1YWxfYmxvY2tfficsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMSwgMSk7CiAgaGVscGVycy5kb0tleXMoJzxDLXY+JywgJ2wnLCAnbCcsICdqJywgJ34nKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDEsIDEpOwogIGVxKCdoZWxsb1xud29STGRcbmFCQ0RlJywgY20uZ2V0VmFsdWUoKSk7CiAgY20uc2V0Q3Vyc29yKDIsIDApOwogIGhlbHBlcnMuZG9LZXlzKCd2JywgJ2wnLCAnbCcsICd+Jyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgyLCAwKTsKICBlcSgnaGVsbG9cbndvUkxkXG5BYmNEZScsIGNtLmdldFZhbHVlKCkpOwp9LHt2YWx1ZTogJ2hlbGxvXG53T3JsZFxuYWJjZGUnIH0pOwp0ZXN0VmltKCcuX3N3YXBDYXNlX3Zpc3VhbEJsb2NrJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGhlbHBlcnMuZG9LZXlzKCc8Qy12PicsICdqJywgJ2onLCAnbCcsICd+Jyk7CiAgY20uc2V0Q3Vyc29yKDAsIDMpOwogIGhlbHBlcnMuZG9LZXlzKCcuJyk7CiAgZXEoJ0hlbExPXG5Xb3JMZFxuQWJjZEUnLCBjbS5nZXRWYWx1ZSgpKTsKfSx7dmFsdWU6ICdoRWxsb1xud09ybERcbmFCY0RlJyB9KTsKdGVzdFZpbSgnLl9kZWxldGVfdmlzdWFsQmxvY2snLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgaGVscGVycy5kb0tleXMoJzxDLXY+JywgJ2onLCAneCcpOwogIGVxKCdpdmVcbmVcbnNvbWVcbnN1Z2FyJywgY20uZ2V0VmFsdWUoKSk7CiAgaGVscGVycy5kb0tleXMoJy4nKTsKICBlcSgndmVcblxuc29tZVxuc3VnYXInLCBjbS5nZXRWYWx1ZSgpKTsKICBoZWxwZXJzLmRvS2V5cygnaicsICdqJywgJy4nKTsKICBlcSgndmVcblxub21lXG51Z2FyJywgY20uZ2V0VmFsdWUoKSk7CiAgaGVscGVycy5kb0tleXMoJ3UnLCAnPEMtcj4nLCAnLicpOwogIGVxKCd2ZVxuXG5tZVxuZ2FyJywgY20uZ2V0VmFsdWUoKSk7Cn0se3ZhbHVlOiAnZ2l2ZVxubWVcbnNvbWVcbnN1Z2FyJyB9KTsKdGVzdFZpbSgnPnttb3Rpb259JywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigxLCAzKTsKICB2YXIgZXhwZWN0ZWRMaW5lQ291bnQgPSBjbS5saW5lQ291bnQoKTsKICB2YXIgZXhwZWN0ZWRWYWx1ZSA9ICcgICB3b3JkMVxuICB3b3JkMlxud29yZDMgJzsKICBoZWxwZXJzLmRvS2V5cygnPicsICdrJyk7CiAgZXEoZXhwZWN0ZWRWYWx1ZSwgY20uZ2V0VmFsdWUoKSk7CiAgdmFyIHJlZ2lzdGVyID0gaGVscGVycy5nZXRSZWdpc3RlckNvbnRyb2xsZXIoKS5nZXRSZWdpc3RlcigpOwogIGVxKCcnLCByZWdpc3Rlci50b1N0cmluZygpKTsKICBpcyghcmVnaXN0ZXIubGluZXdpc2UpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgMyk7Cn0sIHsgdmFsdWU6ICcgd29yZDFcbndvcmQyXG53b3JkMyAnLCBpbmRlbnRVbml0OiAyIH0pOwp0ZXN0VmltKCc+PicsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgMyk7CiAgdmFyIGV4cGVjdGVkTGluZUNvdW50ID0gY20ubGluZUNvdW50KCk7CiAgdmFyIGV4cGVjdGVkVmFsdWUgPSAnICAgd29yZDFcbiAgd29yZDJcbndvcmQzICc7CiAgaGVscGVycy5kb0tleXMoJzInLCAnPicsICc+Jyk7CiAgZXEoZXhwZWN0ZWRWYWx1ZSwgY20uZ2V0VmFsdWUoKSk7CiAgdmFyIHJlZ2lzdGVyID0gaGVscGVycy5nZXRSZWdpc3RlckNvbnRyb2xsZXIoKS5nZXRSZWdpc3RlcigpOwogIGVxKCcnLCByZWdpc3Rlci50b1N0cmluZygpKTsKICBpcyghcmVnaXN0ZXIubGluZXdpc2UpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgMyk7Cn0sIHsgdmFsdWU6ICcgd29yZDFcbndvcmQyXG53b3JkMyAnLCBpbmRlbnRVbml0OiAyIH0pOwp0ZXN0VmltKCc8e21vdGlvbn0nLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDEsIDMpOwogIHZhciBleHBlY3RlZExpbmVDb3VudCA9IGNtLmxpbmVDb3VudCgpOwogIHZhciBleHBlY3RlZFZhbHVlID0gJyB3b3JkMVxud29yZDJcbndvcmQzICc7CiAgaGVscGVycy5kb0tleXMoJzwnLCAnaycpOwogIGVxKGV4cGVjdGVkVmFsdWUsIGNtLmdldFZhbHVlKCkpOwogIHZhciByZWdpc3RlciA9IGhlbHBlcnMuZ2V0UmVnaXN0ZXJDb250cm9sbGVyKCkuZ2V0UmVnaXN0ZXIoKTsKICBlcSgnJywgcmVnaXN0ZXIudG9TdHJpbmcoKSk7CiAgaXMoIXJlZ2lzdGVyLmxpbmV3aXNlKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDEpOwp9LCB7IHZhbHVlOiAnICAgd29yZDFcbiAgd29yZDJcbndvcmQzICcsIGluZGVudFVuaXQ6IDIgfSk7CnRlc3RWaW0oJzw8JywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAzKTsKICB2YXIgZXhwZWN0ZWRMaW5lQ291bnQgPSBjbS5saW5lQ291bnQoKTsKICB2YXIgZXhwZWN0ZWRWYWx1ZSA9ICcgd29yZDFcbndvcmQyXG53b3JkMyAnOwogIGhlbHBlcnMuZG9LZXlzKCcyJywgJzwnLCAnPCcpOwogIGVxKGV4cGVjdGVkVmFsdWUsIGNtLmdldFZhbHVlKCkpOwogIHZhciByZWdpc3RlciA9IGhlbHBlcnMuZ2V0UmVnaXN0ZXJDb250cm9sbGVyKCkuZ2V0UmVnaXN0ZXIoKTsKICBlcSgnJywgcmVnaXN0ZXIudG9TdHJpbmcoKSk7CiAgaXMoIXJlZ2lzdGVyLmxpbmV3aXNlKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDEpOwp9LCB7IHZhbHVlOiAnICAgd29yZDFcbiAgd29yZDJcbndvcmQzICcsIGluZGVudFVuaXQ6IDIgfSk7CgovLyBFZGl0IHRlc3RzCmZ1bmN0aW9uIHRlc3RFZGl0KG5hbWUsIGJlZm9yZSwgcG9zLCBlZGl0LCBhZnRlcikgewogIHJldHVybiB0ZXN0VmltKG5hbWUsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICAgICAgICAgICAgIHZhciBjaCA9IGJlZm9yZS5zZWFyY2gocG9zKQogICAgICAgICAgICAgdmFyIGxpbmUgPSBiZWZvcmUuc3Vic3RyaW5nKDAsIGNoKS5zcGxpdCgnXG4nKS5sZW5ndGggLSAxOwogICAgICAgICAgICAgaWYgKGxpbmUpIHsKICAgICAgICAgICAgICAgY2ggPSBiZWZvcmUuc3Vic3RyaW5nKDAsIGNoKS5zcGxpdCgnXG4nKS5wb3AoKS5sZW5ndGg7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjbS5zZXRDdXJzb3IobGluZSwgY2gpOwogICAgICAgICAgICAgaGVscGVycy5kb0tleXMuYXBwbHkodGhpcywgZWRpdC5zcGxpdCgnJykpOwogICAgICAgICAgICAgZXEoYWZ0ZXIsIGNtLmdldFZhbHVlKCkpOwogICAgICAgICAgIH0sIHt2YWx1ZTogYmVmb3JlfSk7Cn0KCi8vIFRoZXNlIERlbGV0ZSB0ZXN0cyBlZmZlY3RpdmVseSBjb3ZlciB3b3JkLXdpc2UgQ2hhbmdlLCBWaXN1YWwgJiBZYW5rLgovLyBUYWJzIGFyZSB1c2VkIGFzIGRpZmZlcmVudGlhdGVkIHdoaXRlc3BhY2UgdG8gY2F0Y2ggZWRnZSBjYXNlcy4KLy8gTm9ybWFsIHdvcmQ6CnRlc3RFZGl0KCdkaXdfbWlkX3NwYycsICdmb28gXHRiQXJcdCBiYXonLCAvQS8sICdkaXcnLCAnZm9vIFx0XHQgYmF6Jyk7CnRlc3RFZGl0KCdkYXdfbWlkX3NwYycsICdmb28gXHRiQXJcdCBiYXonLCAvQS8sICdkYXcnLCAnZm9vIFx0YmF6Jyk7CnRlc3RFZGl0KCdkaXdfbWlkX3B1bmN0JywgJ2ZvbyBcdGJBci5cdCBiYXonLCAvQS8sICdkaXcnLCAnZm9vIFx0Llx0IGJheicpOwp0ZXN0RWRpdCgnZGF3X21pZF9wdW5jdCcsICdmb28gXHRiQXIuXHQgYmF6JywgL0EvLCAnZGF3JywgJ2Zvby5cdCBiYXonKTsKdGVzdEVkaXQoJ2Rpd19taWRfcHVuY3QyJywgJ2ZvbyBcdCxiQXIuXHQgYmF6JywgL0EvLCAnZGl3JywgJ2ZvbyBcdCwuXHQgYmF6Jyk7CnRlc3RFZGl0KCdkYXdfbWlkX3B1bmN0MicsICdmb28gXHQsYkFyLlx0IGJheicsIC9BLywgJ2RhdycsICdmb28gXHQsLlx0IGJheicpOwp0ZXN0RWRpdCgnZGl3X3N0YXJ0X3NwYycsICdiQXIgXHRiYXonLCAvQS8sICdkaXcnLCAnIFx0YmF6Jyk7CnRlc3RFZGl0KCdkYXdfc3RhcnRfc3BjJywgJ2JBciBcdGJheicsIC9BLywgJ2RhdycsICdiYXonKTsKdGVzdEVkaXQoJ2Rpd19zdGFydF9wdW5jdCcsICdiQXIuIFx0YmF6JywgL0EvLCAnZGl3JywgJy4gXHRiYXonKTsKdGVzdEVkaXQoJ2Rhd19zdGFydF9wdW5jdCcsICdiQXIuIFx0YmF6JywgL0EvLCAnZGF3JywgJy4gXHRiYXonKTsKdGVzdEVkaXQoJ2Rpd19lbmRfc3BjJywgJ2ZvbyBcdGJBcicsIC9BLywgJ2RpdycsICdmb28gXHQnKTsKdGVzdEVkaXQoJ2Rhd19lbmRfc3BjJywgJ2ZvbyBcdGJBcicsIC9BLywgJ2RhdycsICdmb28nKTsKdGVzdEVkaXQoJ2Rpd19lbmRfcHVuY3QnLCAnZm9vIFx0YkFyLicsIC9BLywgJ2RpdycsICdmb28gXHQuJyk7CnRlc3RFZGl0KCdkYXdfZW5kX3B1bmN0JywgJ2ZvbyBcdGJBci4nLCAvQS8sICdkYXcnLCAnZm9vLicpOwovLyBCaWcgd29yZDoKdGVzdEVkaXQoJ2RpV19taWRfc3BjJywgJ2ZvbyBcdGJBclx0IGJheicsIC9BLywgJ2RpVycsICdmb28gXHRcdCBiYXonKTsKdGVzdEVkaXQoJ2RhV19taWRfc3BjJywgJ2ZvbyBcdGJBclx0IGJheicsIC9BLywgJ2RhVycsICdmb28gXHRiYXonKTsKdGVzdEVkaXQoJ2RpV19taWRfcHVuY3QnLCAnZm9vIFx0YkFyLlx0IGJheicsIC9BLywgJ2RpVycsICdmb28gXHRcdCBiYXonKTsKdGVzdEVkaXQoJ2RhV19taWRfcHVuY3QnLCAnZm9vIFx0YkFyLlx0IGJheicsIC9BLywgJ2RhVycsICdmb28gXHRiYXonKTsKdGVzdEVkaXQoJ2RpV19taWRfcHVuY3QyJywgJ2ZvbyBcdCxiQXIuXHQgYmF6JywgL0EvLCAnZGlXJywgJ2ZvbyBcdFx0IGJheicpOwp0ZXN0RWRpdCgnZGFXX21pZF9wdW5jdDInLCAnZm9vIFx0LGJBci5cdCBiYXonLCAvQS8sICdkYVcnLCAnZm9vIFx0YmF6Jyk7CnRlc3RFZGl0KCdkaVdfc3RhcnRfc3BjJywgJ2JBclx0IGJheicsIC9BLywgJ2RpVycsICdcdCBiYXonKTsKdGVzdEVkaXQoJ2RhV19zdGFydF9zcGMnLCAnYkFyXHQgYmF6JywgL0EvLCAnZGFXJywgJ2JheicpOwp0ZXN0RWRpdCgnZGlXX3N0YXJ0X3B1bmN0JywgJ2JBci5cdCBiYXonLCAvQS8sICdkaVcnLCAnXHQgYmF6Jyk7CnRlc3RFZGl0KCdkYVdfc3RhcnRfcHVuY3QnLCAnYkFyLlx0IGJheicsIC9BLywgJ2RhVycsICdiYXonKTsKdGVzdEVkaXQoJ2RpV19lbmRfc3BjJywgJ2ZvbyBcdGJBcicsIC9BLywgJ2RpVycsICdmb28gXHQnKTsKdGVzdEVkaXQoJ2RhV19lbmRfc3BjJywgJ2ZvbyBcdGJBcicsIC9BLywgJ2RhVycsICdmb28nKTsKdGVzdEVkaXQoJ2RpV19lbmRfcHVuY3QnLCAnZm9vIFx0YkFyLicsIC9BLywgJ2RpVycsICdmb28gXHQnKTsKdGVzdEVkaXQoJ2RhV19lbmRfcHVuY3QnLCAnZm9vIFx0YkFyLicsIC9BLywgJ2RhVycsICdmb28nKTsKLy8gRGVsZXRpbmcgdGV4dCBvYmplY3RzCi8vICAgIE9wZW4gYW5kIGNsb3NlIG9uIHNhbWUgbGluZQp0ZXN0RWRpdCgnZGkoX29wZW5fc3BjJywgJ2ZvbyAoYkFyKSBiYXonLCAvXCgvLCAnZGkoJywgJ2ZvbyAoKSBiYXonKTsKdGVzdEVkaXQoJ2RpKV9vcGVuX3NwYycsICdmb28gKGJBcikgYmF6JywgL1woLywgJ2RpKScsICdmb28gKCkgYmF6Jyk7CnRlc3RFZGl0KCdkaWJfb3Blbl9zcGMnLCAnZm9vIChiQXIpIGJheicsIC9cKC8sICdkaWInLCAnZm9vICgpIGJheicpOwp0ZXN0RWRpdCgnZGEoX29wZW5fc3BjJywgJ2ZvbyAoYkFyKSBiYXonLCAvXCgvLCAnZGEoJywgJ2ZvbyAgYmF6Jyk7CnRlc3RFZGl0KCdkYSlfb3Blbl9zcGMnLCAnZm9vIChiQXIpIGJheicsIC9cKC8sICdkYSknLCAnZm9vICBiYXonKTsKCnRlc3RFZGl0KCdkaShfbWlkZGxlX3NwYycsICdmb28gKGJBcikgYmF6JywgL0EvLCAnZGkoJywgJ2ZvbyAoKSBiYXonKTsKdGVzdEVkaXQoJ2RpKV9taWRkbGVfc3BjJywgJ2ZvbyAoYkFyKSBiYXonLCAvQS8sICdkaSknLCAnZm9vICgpIGJheicpOwp0ZXN0RWRpdCgnZGEoX21pZGRsZV9zcGMnLCAnZm9vIChiQXIpIGJheicsIC9BLywgJ2RhKCcsICdmb28gIGJheicpOwp0ZXN0RWRpdCgnZGEpX21pZGRsZV9zcGMnLCAnZm9vIChiQXIpIGJheicsIC9BLywgJ2RhKScsICdmb28gIGJheicpOwoKdGVzdEVkaXQoJ2RpKF9jbG9zZV9zcGMnLCAnZm9vIChiQXIpIGJheicsIC9cKS8sICdkaSgnLCAnZm9vICgpIGJheicpOwp0ZXN0RWRpdCgnZGkpX2Nsb3NlX3NwYycsICdmb28gKGJBcikgYmF6JywgL1wpLywgJ2RpKScsICdmb28gKCkgYmF6Jyk7CnRlc3RFZGl0KCdkYShfY2xvc2Vfc3BjJywgJ2ZvbyAoYkFyKSBiYXonLCAvXCkvLCAnZGEoJywgJ2ZvbyAgYmF6Jyk7CnRlc3RFZGl0KCdkYSlfY2xvc2Vfc3BjJywgJ2ZvbyAoYkFyKSBiYXonLCAvXCkvLCAnZGEpJywgJ2ZvbyAgYmF6Jyk7CgovLyAgZGVsZXRlIGFyb3VuZCBhbmQgaW5uZXIgYi4KdGVzdEVkaXQoJ2RhYl9vbl8oX3Nob3VsZF9kZWxldGVfYXJvdW5kXygpYmxvY2snLCAnbyggaW4oYWJjKSApJywgL1woYS8sICdkYWInLCAnbyggaW4gKScpOwoKLy8gIGRlbGV0ZSBhcm91bmQgYW5kIGlubmVyIEIuCnRlc3RFZGl0KCdkYUJfb25fe19zaG91bGRfZGVsZXRlX2Fyb3VuZF97fWJsb2NrJywgJ297IGlue2FiY30gfScsIC97YS8sICdkYUInLCAnb3sgaW4gfScpOwp0ZXN0RWRpdCgnZGlCX29uX3tfc2hvdWxkX2RlbGV0ZV9pbm5lcl97fWJsb2NrJywgJ297IGlue2FiY30gfScsIC97YS8sICdkaUInLCAnb3sgaW57fSB9Jyk7Cgp0ZXN0RWRpdCgnZGF7X29uX3tfc2hvdWxkX2RlbGV0ZV9pbm5lcl9ibG9jaycsICdveyBpbnthYmN9IH0nLCAve2EvLCAnZGF7JywgJ297IGluIH0nKTsKdGVzdEVkaXQoJ2RpW19vbl8oX3Nob3VsZF9ub3RfZGVsZXRlJywgJ2ZvbyAoYkFyKSBiYXonLCAvXCgvLCAnZGlbJywgJ2ZvbyAoYkFyKSBiYXonKTsKdGVzdEVkaXQoJ2RpW19vbl8pX3Nob3VsZF9ub3RfZGVsZXRlJywgJ2ZvbyAoYkFyKSBiYXonLCAvXCkvLCAnZGlbJywgJ2ZvbyAoYkFyKSBiYXonKTsKdGVzdEVkaXQoJ2RhW19vbl8oX3Nob3VsZF9ub3RfZGVsZXRlJywgJ2ZvbyAoYkFyKSBiYXonLCAvXCgvLCAnZGFbJywgJ2ZvbyAoYkFyKSBiYXonKTsKdGVzdEVkaXQoJ2RhW19vbl8pX3Nob3VsZF9ub3RfZGVsZXRlJywgJ2ZvbyAoYkFyKSBiYXonLCAvXCkvLCAnZGFbJywgJ2ZvbyAoYkFyKSBiYXonKTsKdGVzdE1vdGlvbignZGkoX291dHNpZGVfc2hvdWxkX3N0YXknLCBbJ2QnLCAnaScsICcoJ10sIHsgbGluZTogMCwgY2g6IDB9LCB7IGxpbmU6IDAsIGNoOiAwfSk7CgovLyAgT3BlbiBhbmQgY2xvc2Ugb24gZGlmZmVyZW50IGxpbmVzLCBlcXVhbGx5IGluZGVudGVkCnRlc3RFZGl0KCdkaXtfbWlkZGxlX3NwYycsICdhe1xuXHRiYXJcbn1iJywgL3IvLCAnZGl7JywgJ2F7fWInKTsKdGVzdEVkaXQoJ2RpfV9taWRkbGVfc3BjJywgJ2F7XG5cdGJhclxufWInLCAvci8sICdkaX0nLCAnYXt9YicpOwp0ZXN0RWRpdCgnZGF7X21pZGRsZV9zcGMnLCAnYXtcblx0YmFyXG59YicsIC9yLywgJ2RheycsICdhYicpOwp0ZXN0RWRpdCgnZGF9X21pZGRsZV9zcGMnLCAnYXtcblx0YmFyXG59YicsIC9yLywgJ2RhfScsICdhYicpOwp0ZXN0RWRpdCgnZGFCX21pZGRsZV9zcGMnLCAnYXtcblx0YmFyXG59YicsIC9yLywgJ2RhQicsICdhYicpOwoKLy8gb3BlbiBhbmQgY2xvc2Ugb24gZGlmZiBsaW5lcywgb3BlbiBpbmRlbnRlZCBsZXNzIHRoYW4gY2xvc2UKdGVzdEVkaXQoJ2Rpe19taWRkbGVfc3BjJywgJ2F7XG5cdGJhclxuXHR9YicsIC9yLywgJ2RpeycsICdhe31iJyk7CnRlc3RFZGl0KCdkaX1fbWlkZGxlX3NwYycsICdhe1xuXHRiYXJcblx0fWInLCAvci8sICdkaX0nLCAnYXt9YicpOwp0ZXN0RWRpdCgnZGF7X21pZGRsZV9zcGMnLCAnYXtcblx0YmFyXG5cdH1iJywgL3IvLCAnZGF7JywgJ2FiJyk7CnRlc3RFZGl0KCdkYX1fbWlkZGxlX3NwYycsICdhe1xuXHRiYXJcblx0fWInLCAvci8sICdkYX0nLCAnYWInKTsKCi8vIG9wZW4gYW5kIGNsb3NlIG9uIGRpZmYgbGluZXMsIG9wZW4gaW5kZW50ZWQgbW9yZSB0aGFuIGNsb3NlCnRlc3RFZGl0KCdkaVtfbWlkZGxlX3NwYycsICdhXHRbXG5cdGJhclxuXWInLCAvci8sICdkaVsnLCAnYVx0W11iJyk7CnRlc3RFZGl0KCdkaV1fbWlkZGxlX3NwYycsICdhXHRbXG5cdGJhclxuXWInLCAvci8sICdkaV0nLCAnYVx0W11iJyk7CnRlc3RFZGl0KCdkYVtfbWlkZGxlX3NwYycsICdhXHRbXG5cdGJhclxuXWInLCAvci8sICdkYVsnLCAnYVx0YicpOwp0ZXN0RWRpdCgnZGFdX21pZGRsZV9zcGMnLCAnYVx0W1xuXHRiYXJcbl1iJywgL3IvLCAnZGFdJywgJ2FcdGInKTsKCi8vIE9wZXJhdG9yLW1vdGlvbiB0ZXN0cwp0ZXN0VmltKCdEJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAzKTsKICBoZWxwZXJzLmRvS2V5cygnRCcpOwogIGVxKCcgd29cbndvcmQyXG4gd29yZDMnLCBjbS5nZXRWYWx1ZSgpKTsKICB2YXIgcmVnaXN0ZXIgPSBoZWxwZXJzLmdldFJlZ2lzdGVyQ29udHJvbGxlcigpLmdldFJlZ2lzdGVyKCk7CiAgZXEoJ3JkMScsIHJlZ2lzdGVyLnRvU3RyaW5nKCkpOwogIGlzKCFyZWdpc3Rlci5saW5ld2lzZSk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCAzKTsKfSwgeyB2YWx1ZTogJyB3b3JkMVxud29yZDJcbiB3b3JkMycgfSk7CnRlc3RWaW0oJ0MnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgdmFyIGN1clN0YXJ0ID0gbWFrZUN1cnNvcigwLCAzKTsKICBjbS5zZXRDdXJzb3IoY3VyU3RhcnQpOwogIGhlbHBlcnMuZG9LZXlzKCdDJyk7CiAgZXEoJyB3b1xud29yZDJcbiB3b3JkMycsIGNtLmdldFZhbHVlKCkpOwogIHZhciByZWdpc3RlciA9IGhlbHBlcnMuZ2V0UmVnaXN0ZXJDb250cm9sbGVyKCkuZ2V0UmVnaXN0ZXIoKTsKICBlcSgncmQxJywgcmVnaXN0ZXIudG9TdHJpbmcoKSk7CiAgaXMoIXJlZ2lzdGVyLmxpbmV3aXNlKTsKICBlcVBvcyhjdXJTdGFydCwgY20uZ2V0Q3Vyc29yKCkpOwogIGVxKCd2aW0taW5zZXJ0JywgY20uZ2V0T3B0aW9uKCdrZXlNYXAnKSk7Cn0sIHsgdmFsdWU6ICcgd29yZDFcbndvcmQyXG4gd29yZDMnIH0pOwp0ZXN0VmltKCdZJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIHZhciBjdXJTdGFydCA9IG1ha2VDdXJzb3IoMCwgMyk7CiAgY20uc2V0Q3Vyc29yKGN1clN0YXJ0KTsKICBoZWxwZXJzLmRvS2V5cygnWScpOwogIGVxKCcgd29yZDFcbndvcmQyXG4gd29yZDMnLCBjbS5nZXRWYWx1ZSgpKTsKICB2YXIgcmVnaXN0ZXIgPSBoZWxwZXJzLmdldFJlZ2lzdGVyQ29udHJvbGxlcigpLmdldFJlZ2lzdGVyKCk7CiAgZXEoJ3JkMScsIHJlZ2lzdGVyLnRvU3RyaW5nKCkpOwogIGlzKCFyZWdpc3Rlci5saW5ld2lzZSk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCAzKTsKfSwgeyB2YWx1ZTogJyB3b3JkMVxud29yZDJcbiB3b3JkMycgfSk7CnRlc3RWaW0oJ34nLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgaGVscGVycy5kb0tleXMoJzMnLCAnficpOwogIGVxKCdBQkNkZWZnJywgY20uZ2V0VmFsdWUoKSk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCAzKTsKfSwgeyB2YWx1ZTogJ2FiY2RlZmcnIH0pOwoKLy8gQWN0aW9uIHRlc3RzCnRlc3RWaW0oJ2N0cmwtYScsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJzxDLWE+Jyk7CiAgZXEoJy05JywgY20uZ2V0VmFsdWUoKSk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCAxKTsKICBoZWxwZXJzLmRvS2V5cygnMicsJzxDLWE+Jyk7CiAgZXEoJy03JywgY20uZ2V0VmFsdWUoKSk7Cn0sIHt2YWx1ZTogJy0xMCd9KTsKdGVzdFZpbSgnY3RybC14JywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnPEMteD4nKTsKICBlcSgnLTEnLCBjbS5nZXRWYWx1ZSgpKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDEpOwogIGhlbHBlcnMuZG9LZXlzKCcyJywnPEMteD4nKTsKICBlcSgnLTMnLCBjbS5nZXRWYWx1ZSgpKTsKfSwge3ZhbHVlOiAnMCd9KTsKdGVzdFZpbSgnPEMteD4vPEMtYT4gc2VhcmNoIGZvcndhcmQnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgZm9yRWFjaChbJzxDLXg+JywgJzxDLWE+J10sIGZ1bmN0aW9uKGtleSkgewogICAgY20uc2V0Q3Vyc29yKDAsIDApOwogICAgaGVscGVycy5kb0tleXMoa2V5KTsKICAgIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgNSk7CiAgICBoZWxwZXJzLmRvS2V5cygnbCcpOwogICAgaGVscGVycy5kb0tleXMoa2V5KTsKICAgIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgMTApOwogICAgY20uc2V0Q3Vyc29yKDAsIDExKTsKICAgIGhlbHBlcnMuZG9LZXlzKGtleSk7CiAgICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDExKTsKICB9KTsKfSwge3ZhbHVlOiAnX19qbXAxIGptcDIgam1wJ30pOwp0ZXN0VmltKCdhJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAxKTsKICBoZWxwZXJzLmRvS2V5cygnYScpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgMik7CiAgZXEoJ3ZpbS1pbnNlcnQnLCBjbS5nZXRPcHRpb24oJ2tleU1hcCcpKTsKfSk7CnRlc3RWaW0oJ2FfZW9sJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCBsaW5lc1swXS5sZW5ndGggLSAxKTsKICBoZWxwZXJzLmRvS2V5cygnYScpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgbGluZXNbMF0ubGVuZ3RoKTsKICBlcSgndmltLWluc2VydCcsIGNtLmdldE9wdGlvbigna2V5TWFwJykpOwp9KTsKdGVzdFZpbSgnYV9lbmRPZlNlbGVjdGVkQXJlYScsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJ3YnLCAnaicsICdsJyk7CiAgaGVscGVycy5kb0tleXMoJ0EnKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDEsIDIpOwogIGVxKCd2aW0taW5zZXJ0JywgY20uZ2V0T3B0aW9uKCdrZXlNYXAnKSk7Cn0sIHt2YWx1ZTogJ2Zvb1xuYmFyJ30pOwp0ZXN0VmltKCdpJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAxKTsKICBoZWxwZXJzLmRvS2V5cygnaScpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgMSk7CiAgZXEoJ3ZpbS1pbnNlcnQnLCBjbS5nZXRPcHRpb24oJ2tleU1hcCcpKTsKfSk7CnRlc3RWaW0oJ2lfcmVwZWF0JywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGhlbHBlcnMuZG9LZXlzKCczJywgJ2knKTsKICBjbS5yZXBsYWNlUmFuZ2UoJ3Rlc3QnLCBjbS5nZXRDdXJzb3IoKSk7CiAgaGVscGVycy5kb0luc2VydE1vZGVLZXlzKCdFc2MnKTsKICBlcSgndGVzdHRlc3R0ZXN0JywgY20uZ2V0VmFsdWUoKSk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCAxMSk7Cn0sIHsgdmFsdWU6ICcnIH0pOwp0ZXN0VmltKCdpX3JlcGVhdF9kZWxldGUnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDQpOwogIGhlbHBlcnMuZG9LZXlzKCcyJywgJ2knKTsKICBjbS5yZXBsYWNlUmFuZ2UoJ3onLCBjbS5nZXRDdXJzb3IoKSk7CiAgaGVscGVycy5kb0luc2VydE1vZGVLZXlzKCdCYWNrc3BhY2UnLCAnQmFja3NwYWNlJywgJ0VzYycpOwogIGVxKCdhYmUnLCBjbS5nZXRWYWx1ZSgpKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDEpOwp9LCB7IHZhbHVlOiAnYWJjZGUnIH0pOwp0ZXN0VmltKCdBJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGhlbHBlcnMuZG9LZXlzKCdBJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCBsaW5lc1swXS5sZW5ndGgpOwogIGVxKCd2aW0taW5zZXJ0JywgY20uZ2V0T3B0aW9uKCdrZXlNYXAnKSk7Cn0pOwp0ZXN0VmltKCdJJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCA0KTsKICBoZWxwZXJzLmRvS2V5cygnSScpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgbGluZXNbMF0udGV4dFN0YXJ0KTsKICBlcSgndmltLWluc2VydCcsIGNtLmdldE9wdGlvbigna2V5TWFwJykpOwp9KTsKdGVzdFZpbSgnSV9yZXBlYXQnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDEpOwogIGhlbHBlcnMuZG9LZXlzKCczJywgJ0knKTsKICBjbS5yZXBsYWNlUmFuZ2UoJ3Rlc3QnLCBjbS5nZXRDdXJzb3IoKSk7CiAgaGVscGVycy5kb0luc2VydE1vZGVLZXlzKCdFc2MnKTsKICBlcSgndGVzdHRlc3R0ZXN0YmxhaCcsIGNtLmdldFZhbHVlKCkpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgMTEpOwp9LCB7IHZhbHVlOiAnYmxhaCcgfSk7CnRlc3RWaW0oJ28nLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDQpOwogIGhlbHBlcnMuZG9LZXlzKCdvJyk7CiAgZXEoJ3dvcmQxXG5cbndvcmQyJywgY20uZ2V0VmFsdWUoKSk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgxLCAwKTsKICBlcSgndmltLWluc2VydCcsIGNtLmdldE9wdGlvbigna2V5TWFwJykpOwp9LCB7IHZhbHVlOiAnd29yZDFcbndvcmQyJyB9KTsKdGVzdFZpbSgnb19yZXBlYXQnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDApOwogIGhlbHBlcnMuZG9LZXlzKCczJywgJ28nKTsKICBjbS5yZXBsYWNlUmFuZ2UoJ3Rlc3QnLCBjbS5nZXRDdXJzb3IoKSk7CiAgaGVscGVycy5kb0luc2VydE1vZGVLZXlzKCdFc2MnKTsKICBlcSgnXG50ZXN0XG50ZXN0XG50ZXN0JywgY20uZ2V0VmFsdWUoKSk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgzLCAzKTsKfSwgeyB2YWx1ZTogJycgfSk7CnRlc3RWaW0oJ08nLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDQpOwogIGhlbHBlcnMuZG9LZXlzKCdPJyk7CiAgZXEoJ1xud29yZDFcbndvcmQyJywgY20uZ2V0VmFsdWUoKSk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCAwKTsKICBlcSgndmltLWluc2VydCcsIGNtLmdldE9wdGlvbigna2V5TWFwJykpOwp9LCB7IHZhbHVlOiAnd29yZDFcbndvcmQyJyB9KTsKdGVzdFZpbSgnSicsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgNCk7CiAgaGVscGVycy5kb0tleXMoJ0onKTsKICB2YXIgZXhwZWN0ZWRWYWx1ZSA9ICd3b3JkMSAgd29yZDJcbndvcmQzXG4gd29yZDQnOwogIGVxKGV4cGVjdGVkVmFsdWUsIGNtLmdldFZhbHVlKCkpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgZXhwZWN0ZWRWYWx1ZS5pbmRleE9mKCd3b3JkMicpIC0gMSk7Cn0sIHsgdmFsdWU6ICd3b3JkMSBcbiAgICB3b3JkMlxud29yZDNcbiB3b3JkNCcgfSk7CnRlc3RWaW0oJ0pfcmVwZWF0JywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCA0KTsKICBoZWxwZXJzLmRvS2V5cygnMycsICdKJyk7CiAgdmFyIGV4cGVjdGVkVmFsdWUgPSAnd29yZDEgIHdvcmQyIHdvcmQzXG4gd29yZDQnOwogIGVxKGV4cGVjdGVkVmFsdWUsIGNtLmdldFZhbHVlKCkpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgZXhwZWN0ZWRWYWx1ZS5pbmRleE9mKCd3b3JkMycpIC0gMSk7Cn0sIHsgdmFsdWU6ICd3b3JkMSBcbiAgICB3b3JkMlxud29yZDNcbiB3b3JkNCcgfSk7CnRlc3RWaW0oJ3AnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDEpOwogIGhlbHBlcnMuZ2V0UmVnaXN0ZXJDb250cm9sbGVyKCkucHVzaFRleHQoJyInLCAneWFuaycsICdhYmNcbmRlZicsIGZhbHNlKTsKICBoZWxwZXJzLmRvS2V5cygncCcpOwogIGVxKCdfX2FiY1xuZGVmXycsIGNtLmdldFZhbHVlKCkpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMSwgMik7Cn0sIHsgdmFsdWU6ICdfX18nIH0pOwp0ZXN0VmltKCdwX3JlZ2lzdGVyJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAxKTsKICBoZWxwZXJzLmdldFJlZ2lzdGVyQ29udHJvbGxlcigpLmdldFJlZ2lzdGVyKCdhJykuc2V0VGV4dCgnYWJjXG5kZWYnLCBmYWxzZSk7CiAgaGVscGVycy5kb0tleXMoJyInLCAnYScsICdwJyk7CiAgZXEoJ19fYWJjXG5kZWZfJywgY20uZ2V0VmFsdWUoKSk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgxLCAyKTsKfSwgeyB2YWx1ZTogJ19fXycgfSk7CnRlc3RWaW0oJ3Bfd3JvbmdfcmVnaXN0ZXInLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDEpOwogIGhlbHBlcnMuZ2V0UmVnaXN0ZXJDb250cm9sbGVyKCkuZ2V0UmVnaXN0ZXIoJ2EnKS5zZXRUZXh0KCdhYmNcbmRlZicsIGZhbHNlKTsKICBoZWxwZXJzLmRvS2V5cygncCcpOwogIGVxKCdfX18nLCBjbS5nZXRWYWx1ZSgpKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDEpOwp9LCB7IHZhbHVlOiAnX19fJyB9KTsKdGVzdFZpbSgncF9saW5lJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAxKTsKICBoZWxwZXJzLmdldFJlZ2lzdGVyQ29udHJvbGxlcigpLnB1c2hUZXh0KCciJywgJ3lhbmsnLCAnICBhXG5kXG4nLCB0cnVlKTsKICBoZWxwZXJzLmRvS2V5cygnMicsICdwJyk7CiAgZXEoJ19fX1xuICBhXG5kXG4gIGFcbmQnLCBjbS5nZXRWYWx1ZSgpKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDEsIDIpOwp9LCB7IHZhbHVlOiAnX19fJyB9KTsKdGVzdFZpbSgncF9sYXN0bGluZScsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgMSk7CiAgaGVscGVycy5nZXRSZWdpc3RlckNvbnRyb2xsZXIoKS5wdXNoVGV4dCgnIicsICd5YW5rJywgJyAgYVxuZCcsIHRydWUpOwogIGhlbHBlcnMuZG9LZXlzKCcyJywgJ3AnKTsKICBlcSgnX19fXG4gIGFcbmRcbiAgYVxuZCcsIGNtLmdldFZhbHVlKCkpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMSwgMik7Cn0sIHsgdmFsdWU6ICdfX18nIH0pOwp0ZXN0VmltKCddcF9maXJzdF9pbmRlbnRfaXNfc21hbGxlcicsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBoZWxwZXJzLmdldFJlZ2lzdGVyQ29udHJvbGxlcigpLnB1c2hUZXh0KCciJywgJ3lhbmsnLCAnICBhYmNcbiAgICBkZWZcbicsIHRydWUpOwogIGhlbHBlcnMuZG9LZXlzKCddJywgJ3AnKTsKICBlcSgnICBfX19cbiAgYWJjXG4gICAgZGVmJywgY20uZ2V0VmFsdWUoKSk7Cn0sIHsgdmFsdWU6ICcgIF9fXycgfSk7CnRlc3RWaW0oJ11wX2ZpcnN0X2luZGVudF9pc19sYXJnZXInLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgaGVscGVycy5nZXRSZWdpc3RlckNvbnRyb2xsZXIoKS5wdXNoVGV4dCgnIicsICd5YW5rJywgJyAgICBhYmNcbiAgZGVmXG4nLCB0cnVlKTsKICBoZWxwZXJzLmRvS2V5cygnXScsICdwJyk7CiAgZXEoJyAgX19fXG4gIGFiY1xuZGVmJywgY20uZ2V0VmFsdWUoKSk7Cn0sIHsgdmFsdWU6ICcgIF9fXycgfSk7CnRlc3RWaW0oJ11wX3dpdGhfdGFiX2luZGVudHMnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgaGVscGVycy5nZXRSZWdpc3RlckNvbnRyb2xsZXIoKS5wdXNoVGV4dCgnIicsICd5YW5rJywgJ1x0XHRhYmNcblx0XHRcdGRlZlxuJywgdHJ1ZSk7CiAgaGVscGVycy5kb0tleXMoJ10nLCAncCcpOwogIGVxKCdcdF9fX1xuXHRhYmNcblx0XHRkZWYnLCBjbS5nZXRWYWx1ZSgpKTsKfSwgeyB2YWx1ZTogJ1x0X19fJywgaW5kZW50V2l0aFRhYnM6IHRydWV9KTsKdGVzdFZpbSgnXXBfd2l0aF9zcGFjZXNfdHJhbnNsYXRlZF90b190YWJzJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGhlbHBlcnMuZ2V0UmVnaXN0ZXJDb250cm9sbGVyKCkucHVzaFRleHQoJyInLCAneWFuaycsICcgIGFiY1xuICAgIGRlZlxuJywgdHJ1ZSk7CiAgaGVscGVycy5kb0tleXMoJ10nLCAncCcpOwogIGVxKCdcdF9fX1xuXHRhYmNcblx0XHRkZWYnLCBjbS5nZXRWYWx1ZSgpKTsKfSwgeyB2YWx1ZTogJ1x0X19fJywgaW5kZW50V2l0aFRhYnM6IHRydWUsIHRhYlNpemU6IDIgfSk7CnRlc3RWaW0oJ1twJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGhlbHBlcnMuZ2V0UmVnaXN0ZXJDb250cm9sbGVyKCkucHVzaFRleHQoJyInLCAneWFuaycsICcgIGFiY1xuICAgIGRlZlxuJywgdHJ1ZSk7CiAgaGVscGVycy5kb0tleXMoJ1snLCAncCcpOwogIGVxKCcgIGFiY1xuICAgIGRlZlxuICBfX18nLCBjbS5nZXRWYWx1ZSgpKTsKfSwgeyB2YWx1ZTogJyAgX19fJyB9KTsKdGVzdFZpbSgnUCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgMSk7CiAgaGVscGVycy5nZXRSZWdpc3RlckNvbnRyb2xsZXIoKS5wdXNoVGV4dCgnIicsICd5YW5rJywgJ2FiY1xuZGVmJywgZmFsc2UpOwogIGhlbHBlcnMuZG9LZXlzKCdQJyk7CiAgZXEoJ19hYmNcbmRlZl9fJywgY20uZ2V0VmFsdWUoKSk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgxLCAzKTsKfSwgeyB2YWx1ZTogJ19fXycgfSk7CnRlc3RWaW0oJ1BfbGluZScsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgMSk7CiAgaGVscGVycy5nZXRSZWdpc3RlckNvbnRyb2xsZXIoKS5wdXNoVGV4dCgnIicsICd5YW5rJywgJyAgYVxuZFxuJywgdHJ1ZSk7CiAgaGVscGVycy5kb0tleXMoJzInLCAnUCcpOwogIGVxKCcgIGFcbmRcbiAgYVxuZFxuX19fJywgY20uZ2V0VmFsdWUoKSk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCAyKTsKfSwgeyB2YWx1ZTogJ19fXycgfSk7CnRlc3RWaW0oJ3InLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDEpOwogIGhlbHBlcnMuZG9LZXlzKCczJywgJ3InLCAndScpOwogIGVxKCd3dXV1ZXRcbmFub3RoZXInLCBjbS5nZXRWYWx1ZSgpLCczciBmYWlsZWQnKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDMpOwogIGNtLnNldEN1cnNvcigwLCA0KTsKICBoZWxwZXJzLmRvS2V5cygndicsICdqJywgJ2gnLCAncicsICc8U3BhY2U+Jyk7CiAgZXEoJ3d1dXUgIFxuICAgIGhlcicsIGNtLmdldFZhbHVlKCksJ1JlcGxhY2luZyBzZWxlY3Rpb24gYnkgc3BhY2UtY2hhcmFjdGVycyBmYWlsZWQnKTsKfSwgeyB2YWx1ZTogJ3dvcmRldFxuYW5vdGhlcicgfSk7CnRlc3RWaW0oJ3JfdmlzdWFsX2Jsb2NrJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigyLCAzKTsKICBoZWxwZXJzLmRvS2V5cygnPEMtdj4nLCAnaycsICdrJywgJ2gnLCAnaCcsICdyJywgJ2wnKTsKICBlcSgnMWxsbFxuNWxsbFxuYWxsbGVmZycsIGNtLmdldFZhbHVlKCkpOwogIGhlbHBlcnMuZG9LZXlzKCc8Qy12PicsICdsJywgJ2onLCAncicsICc8U3BhY2U+Jyk7CiAgZXEoJzEgIGxcbjUgIGxcbmFsbGxlZmcnLCBjbS5nZXRWYWx1ZSgpKTsKICBjbS5zZXRDdXJzb3IoMiwgMCk7CiAgaGVscGVycy5kb0tleXMoJ28nKTsKICBoZWxwZXJzLmRvSW5zZXJ0TW9kZUtleXMoJ0VzYycpOwogIGNtLnJlcGxhY2VSYW5nZSgnXHRcdCcsIGNtLmdldEN1cnNvcigpKTsKICBoZWxwZXJzLmRvS2V5cygnPEMtdj4nLCAnaCcsICdoJywgJ3InLCAncicpOwogIGVxKCcxICBsXG41ICBsXG5hbGxsZWZnXG5ycnJycnJycicsIGNtLmdldFZhbHVlKCkpOwp9LCB7dmFsdWU6ICcxMjM0XG41Njc4XG5hYmNkZWZnJ30pOwp0ZXN0VmltKCdSJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAxKTsKICBoZWxwZXJzLmRvS2V5cygnUicpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgMSk7CiAgZXEoJ3ZpbS1yZXBsYWNlJywgY20uZ2V0T3B0aW9uKCdrZXlNYXAnKSk7CiAgaXMoY20uc3RhdGUub3ZlcndyaXRlLCAnU2V0dGluZyBvdmVyd3JpdGUgc3RhdGUgZmFpbGVkJyk7Cn0pOwp0ZXN0VmltKCdtYXJrJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigyLCAyKTsKICBoZWxwZXJzLmRvS2V5cygnbScsICd0Jyk7CiAgY20uc2V0Q3Vyc29yKDAsIDApOwogIGhlbHBlcnMuZG9LZXlzKCdgJywgJ3QnKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDIsIDIpOwogIGNtLnNldEN1cnNvcigyLCAwKTsKICBjbS5yZXBsYWNlUmFuZ2UoJyAgIGgnLCBjbS5nZXRDdXJzb3IoKSk7CiAgY20uc2V0Q3Vyc29yKDAsIDApOwogIGhlbHBlcnMuZG9LZXlzKCdcJycsICd0Jyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgyLCAzKTsKfSk7CnRlc3RWaW0oJ2p1bXBUb01hcmtfbmV4dCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMiwgMik7CiAgaGVscGVycy5kb0tleXMoJ20nLCAndCcpOwogIGNtLnNldEN1cnNvcigwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnXScsICdgJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgyLCAyKTsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJ10nLCAnXCcnKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDIsIDApOwp9KTsKdGVzdFZpbSgnanVtcFRvTWFya19uZXh0X3JlcGVhdCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMiwgMik7CiAgaGVscGVycy5kb0tleXMoJ20nLCAnYScpOwogIGNtLnNldEN1cnNvcigzLCAyKTsKICBoZWxwZXJzLmRvS2V5cygnbScsICdiJyk7CiAgY20uc2V0Q3Vyc29yKDQsIDIpOwogIGhlbHBlcnMuZG9LZXlzKCdtJywgJ2MnKTsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJzInLCAnXScsICdgJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgzLCAyKTsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJzInLCAnXScsICdcJycpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMywgMSk7Cn0pOwp0ZXN0VmltKCdqdW1wVG9NYXJrX25leHRfc2FtZWxpbmUnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDIsIDApOwogIGhlbHBlcnMuZG9LZXlzKCdtJywgJ2EnKTsKICBjbS5zZXRDdXJzb3IoMiwgNCk7CiAgaGVscGVycy5kb0tleXMoJ20nLCAnYicpOwogIGNtLnNldEN1cnNvcigyLCAyKTsKICBoZWxwZXJzLmRvS2V5cygnXScsICdgJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgyLCA0KTsKfSk7CnRlc3RWaW0oJ2p1bXBUb01hcmtfbmV4dF9vbmx5cHJldicsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMiwgMCk7CiAgaGVscGVycy5kb0tleXMoJ20nLCAnYScpOwogIGNtLnNldEN1cnNvcig0LCAwKTsKICBoZWxwZXJzLmRvS2V5cygnXScsICdgJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCg0LCAwKTsKfSk7CnRlc3RWaW0oJ2p1bXBUb01hcmtfbmV4dF9ub21hcmsnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDIsIDIpOwogIGhlbHBlcnMuZG9LZXlzKCddJywgJ2AnKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDIsIDIpOwogIGhlbHBlcnMuZG9LZXlzKCddJywgJ1wnJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgyLCAwKTsKfSk7CnRlc3RWaW0oJ2p1bXBUb01hcmtfbmV4dF9saW5ld2lzZV9vdmVyJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigyLCAyKTsKICBoZWxwZXJzLmRvS2V5cygnbScsICdhJyk7CiAgY20uc2V0Q3Vyc29yKDMsIDQpOwogIGhlbHBlcnMuZG9LZXlzKCdtJywgJ2InKTsKICBjbS5zZXRDdXJzb3IoMiwgMSk7CiAgaGVscGVycy5kb0tleXMoJ10nLCAnXCcnKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDMsIDEpOwp9KTsKdGVzdFZpbSgnanVtcFRvTWFya19uZXh0X2FjdGlvbicsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMiwgMik7CiAgaGVscGVycy5kb0tleXMoJ20nLCAndCcpOwogIGNtLnNldEN1cnNvcigwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnZCcsICddJywgJ2AnKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDApOwogIHZhciBhY3R1YWwgPSBjbS5nZXRMaW5lKDApOwogIHZhciBleHBlY3RlZCA9ICdwb3AgcG9wIDAgMSAyIDMgNCc7CiAgZXEoYWN0dWFsLCBleHBlY3RlZCwgIkRlbGV0aW5nIHdoaWxlIGp1bXBpbmcgdG8gdGhlIG5leHQgbWFyayBmYWlsZWQuIik7Cn0pOwp0ZXN0VmltKCdqdW1wVG9NYXJrX25leHRfbGluZV9hY3Rpb24nLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDIsIDIpOwogIGhlbHBlcnMuZG9LZXlzKCdtJywgJ3QnKTsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJ2QnLCAnXScsICdcJycpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgMSk7CiAgdmFyIGFjdHVhbCA9IGNtLmdldExpbmUoMCk7CiAgdmFyIGV4cGVjdGVkID0gJyAoYSkgW2JdIHtjfSAnCiAgZXEoYWN0dWFsLCBleHBlY3RlZCwgIkRlbGV0aW5nIHdoaWxlIGp1bXBpbmcgdG8gdGhlIG5leHQgbWFyayBsaW5lIGZhaWxlZC4iKTsKfSk7CnRlc3RWaW0oJ2p1bXBUb01hcmtfcHJldicsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMiwgMik7CiAgaGVscGVycy5kb0tleXMoJ20nLCAndCcpOwogIGNtLnNldEN1cnNvcig0LCAwKTsKICBoZWxwZXJzLmRvS2V5cygnWycsICdgJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgyLCAyKTsKICBjbS5zZXRDdXJzb3IoNCwgMCk7CiAgaGVscGVycy5kb0tleXMoJ1snLCAnXCcnKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDIsIDApOwp9KTsKdGVzdFZpbSgnanVtcFRvTWFya19wcmV2X3JlcGVhdCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMiwgMik7CiAgaGVscGVycy5kb0tleXMoJ20nLCAnYScpOwogIGNtLnNldEN1cnNvcigzLCAyKTsKICBoZWxwZXJzLmRvS2V5cygnbScsICdiJyk7CiAgY20uc2V0Q3Vyc29yKDQsIDIpOwogIGhlbHBlcnMuZG9LZXlzKCdtJywgJ2MnKTsKICBjbS5zZXRDdXJzb3IoNSwgMCk7CiAgaGVscGVycy5kb0tleXMoJzInLCAnWycsICdgJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgzLCAyKTsKICBjbS5zZXRDdXJzb3IoNSwgMCk7CiAgaGVscGVycy5kb0tleXMoJzInLCAnWycsICdcJycpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMywgMSk7Cn0pOwp0ZXN0VmltKCdqdW1wVG9NYXJrX3ByZXZfc2FtZWxpbmUnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDIsIDApOwogIGhlbHBlcnMuZG9LZXlzKCdtJywgJ2EnKTsKICBjbS5zZXRDdXJzb3IoMiwgNCk7CiAgaGVscGVycy5kb0tleXMoJ20nLCAnYicpOwogIGNtLnNldEN1cnNvcigyLCAyKTsKICBoZWxwZXJzLmRvS2V5cygnWycsICdgJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgyLCAwKTsKfSk7CnRlc3RWaW0oJ2p1bXBUb01hcmtfcHJldl9vbmx5bmV4dCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoNCwgNCk7CiAgaGVscGVycy5kb0tleXMoJ20nLCAnYScpOwogIGNtLnNldEN1cnNvcigyLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnWycsICdgJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgyLCAwKTsKfSk7CnRlc3RWaW0oJ2p1bXBUb01hcmtfcHJldl9ub21hcmsnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDIsIDIpOwogIGhlbHBlcnMuZG9LZXlzKCdbJywgJ2AnKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDIsIDIpOwogIGhlbHBlcnMuZG9LZXlzKCdbJywgJ1wnJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgyLCAwKTsKfSk7CnRlc3RWaW0oJ2p1bXBUb01hcmtfcHJldl9saW5ld2lzZV9vdmVyJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigyLCAyKTsKICBoZWxwZXJzLmRvS2V5cygnbScsICdhJyk7CiAgY20uc2V0Q3Vyc29yKDMsIDQpOwogIGhlbHBlcnMuZG9LZXlzKCdtJywgJ2InKTsKICBjbS5zZXRDdXJzb3IoMywgNik7CiAgaGVscGVycy5kb0tleXMoJ1snLCAnXCcnKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDIsIDApOwp9KTsKdGVzdFZpbSgnZGVsbWFya19zaW5nbGUnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDEsIDIpOwogIGhlbHBlcnMuZG9LZXlzKCdtJywgJ3QnKTsKICBoZWxwZXJzLmRvRXgoJ2RlbG1hcmtzIHQnKTsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJ2AnLCAndCcpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgMCk7Cn0pOwp0ZXN0VmltKCdkZWxtYXJrX3JhbmdlJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigxLCAyKTsKICBoZWxwZXJzLmRvS2V5cygnbScsICdhJyk7CiAgY20uc2V0Q3Vyc29yKDIsIDIpOwogIGhlbHBlcnMuZG9LZXlzKCdtJywgJ2InKTsKICBjbS5zZXRDdXJzb3IoMywgMik7CiAgaGVscGVycy5kb0tleXMoJ20nLCAnYycpOwogIGNtLnNldEN1cnNvcig0LCAyKTsKICBoZWxwZXJzLmRvS2V5cygnbScsICdkJyk7CiAgY20uc2V0Q3Vyc29yKDUsIDIpOwogIGhlbHBlcnMuZG9LZXlzKCdtJywgJ2UnKTsKICBoZWxwZXJzLmRvRXgoJ2RlbG1hcmtzIGItZCcpOwogIGNtLnNldEN1cnNvcigwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnYCcsICdhJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgxLCAyKTsKICBoZWxwZXJzLmRvS2V5cygnYCcsICdiJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgxLCAyKTsKICBoZWxwZXJzLmRvS2V5cygnYCcsICdjJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgxLCAyKTsKICBoZWxwZXJzLmRvS2V5cygnYCcsICdkJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgxLCAyKTsKICBoZWxwZXJzLmRvS2V5cygnYCcsICdlJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCg1LCAyKTsKfSk7CnRlc3RWaW0oJ2RlbG1hcmtfbXVsdGknLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDEsIDIpOwogIGhlbHBlcnMuZG9LZXlzKCdtJywgJ2EnKTsKICBjbS5zZXRDdXJzb3IoMiwgMik7CiAgaGVscGVycy5kb0tleXMoJ20nLCAnYicpOwogIGNtLnNldEN1cnNvcigzLCAyKTsKICBoZWxwZXJzLmRvS2V5cygnbScsICdjJyk7CiAgY20uc2V0Q3Vyc29yKDQsIDIpOwogIGhlbHBlcnMuZG9LZXlzKCdtJywgJ2QnKTsKICBjbS5zZXRDdXJzb3IoNSwgMik7CiAgaGVscGVycy5kb0tleXMoJ20nLCAnZScpOwogIGhlbHBlcnMuZG9FeCgnZGVsbWFya3MgYmNkJyk7CiAgY20uc2V0Q3Vyc29yKDAsIDApOwogIGhlbHBlcnMuZG9LZXlzKCdgJywgJ2EnKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDEsIDIpOwogIGhlbHBlcnMuZG9LZXlzKCdgJywgJ2InKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDEsIDIpOwogIGhlbHBlcnMuZG9LZXlzKCdgJywgJ2MnKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDEsIDIpOwogIGhlbHBlcnMuZG9LZXlzKCdgJywgJ2QnKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDEsIDIpOwogIGhlbHBlcnMuZG9LZXlzKCdgJywgJ2UnKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDUsIDIpOwp9KTsKdGVzdFZpbSgnZGVsbWFya19tdWx0aV9zcGFjZScsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMSwgMik7CiAgaGVscGVycy5kb0tleXMoJ20nLCAnYScpOwogIGNtLnNldEN1cnNvcigyLCAyKTsKICBoZWxwZXJzLmRvS2V5cygnbScsICdiJyk7CiAgY20uc2V0Q3Vyc29yKDMsIDIpOwogIGhlbHBlcnMuZG9LZXlzKCdtJywgJ2MnKTsKICBjbS5zZXRDdXJzb3IoNCwgMik7CiAgaGVscGVycy5kb0tleXMoJ20nLCAnZCcpOwogIGNtLnNldEN1cnNvcig1LCAyKTsKICBoZWxwZXJzLmRvS2V5cygnbScsICdlJyk7CiAgaGVscGVycy5kb0V4KCdkZWxtYXJrcyBiIGMgZCcpOwogIGNtLnNldEN1cnNvcigwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnYCcsICdhJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgxLCAyKTsKICBoZWxwZXJzLmRvS2V5cygnYCcsICdiJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgxLCAyKTsKICBoZWxwZXJzLmRvS2V5cygnYCcsICdjJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgxLCAyKTsKICBoZWxwZXJzLmRvS2V5cygnYCcsICdkJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgxLCAyKTsKICBoZWxwZXJzLmRvS2V5cygnYCcsICdlJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCg1LCAyKTsKfSk7CnRlc3RWaW0oJ2RlbG1hcmtfYWxsJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigxLCAyKTsKICBoZWxwZXJzLmRvS2V5cygnbScsICdhJyk7CiAgY20uc2V0Q3Vyc29yKDIsIDIpOwogIGhlbHBlcnMuZG9LZXlzKCdtJywgJ2InKTsKICBjbS5zZXRDdXJzb3IoMywgMik7CiAgaGVscGVycy5kb0tleXMoJ20nLCAnYycpOwogIGNtLnNldEN1cnNvcig0LCAyKTsKICBoZWxwZXJzLmRvS2V5cygnbScsICdkJyk7CiAgY20uc2V0Q3Vyc29yKDUsIDIpOwogIGhlbHBlcnMuZG9LZXlzKCdtJywgJ2UnKTsKICBoZWxwZXJzLmRvRXgoJ2RlbG1hcmtzIGEgYi1kZScpOwogIGNtLnNldEN1cnNvcigwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnYCcsICdhJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnYCcsICdiJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnYCcsICdjJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnYCcsICdkJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnYCcsICdlJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCAwKTsKfSk7CnRlc3RWaW0oJ3Zpc3VhbCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBoZWxwZXJzLmRvS2V5cygnbCcsICd2JywgJ2wnLCAnbCcpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgNCk7CiAgZXFQb3MobWFrZUN1cnNvcigwLCAxKSwgY20uZ2V0Q3Vyc29yKCdhbmNob3InKSk7CiAgaGVscGVycy5kb0tleXMoJ2QnKTsKICBlcSgnMTUnLCBjbS5nZXRWYWx1ZSgpKTsKfSwgeyB2YWx1ZTogJzEyMzQ1JyB9KTsKdGVzdFZpbSgndmlzdWFsX2xpbmUnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgaGVscGVycy5kb0tleXMoJ2wnLCAnVicsICdsJywgJ2onLCAnaicsICdkJyk7CiAgZXEoJyA0XG4gNScsIGNtLmdldFZhbHVlKCkpOwp9LCB7IHZhbHVlOiAnIDFcbiAyXG4gM1xuIDRcbiA1JyB9KTsKdGVzdFZpbSgndmlzdWFsX2Jsb2NrJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIC8vIHRlc3QgdGhlIGJsb2NrIHNlbGVjdGlvbiB3aXRoIGxpbmVzIG9mIGRpZmZlcmVudCBsZW5ndGgKICAvLyBpLmUuIGV4dGVuZGluZyB0aGUgc2VsZWN0aW9uCiAgLy8gdGlsbCB0aGUgZW5kIG9mIHRoZSBsb25nZXN0IGxpbmUuCiAgaGVscGVycy5kb0tleXMoJzxDLXY+JywgJ2wnLCAnaicsICdqJywgJzYnLCAnbCcsICdkJyk7CiAgaGVscGVycy5kb0tleXMoJ2QnLCAnZCcsICdkJywgJ2QnKTsKICBlcSgnJywgY20uZ2V0VmFsdWUoKSk7CiAgLy8gY2hlY2sgZm9yIGxlZnQgc2lkZSBzZWxlY3Rpb24gaW4gY2FzZQogIC8vIG9mIG1vdmluZyB1cCB0byBhIHNob3J0ZXIgbGluZS4KICBjbS5yZXBsYWNlUmFuZ2UoJ2hlbGxvIHdvcmxkXG57XG50aGlzIGlzXG5zcGFydGEhJywgY20uZ2V0Q3Vyc29yKCkpOwogIGNtLnNldEN1cnNvcigzLCA0KTsKICBoZWxwZXJzLmRvS2V5cygnPEMtdj4nLCAnbCcsICdrJywgJ2snLCAnZCcpOwogIGVxKCdoZWxsbyB3b3JsZFxue1xudCBpc1xuc3RhIScsIGNtLmdldFZhbHVlKCkpOwogIGNtLnJlcGxhY2VSYW5nZSgnMTIzNDVcbjY3ODkxXG5hYmNkZScsIHtsaW5lOiAwLCBjaDogMH0sIHtsaW5lOiBjbS5sYXN0TGluZSgpLCBjaDogNn0pOwogIGNtLnNldEN1cnNvcigxLCAyKTsKICBoZWxwZXJzLmRvS2V5cygnPEMtdj4nLCAnMicsICdsJywgJ2snKTsKICAvLyBjaXJjbGUgYXJvdW5kIHRoZSBhbmNob3IKICAvLyBhbmQgY2hlY2sgdGhlIHNlbGVjdGlvbnMKICB2YXIgc2VsZWN0aW9ucyA9IGNtLmdldFNlbGVjdGlvbnMoKTsKICBlcSgnMzQ1ODkxJywgc2VsZWN0aW9ucy5qb2luKCcnKSk7CiAgaGVscGVycy5kb0tleXMoJzQnLCAnaCcpOwogIHNlbGVjdGlvbnMgPSBjbS5nZXRTZWxlY3Rpb25zKCk7CiAgZXEoJzEyMzY3OCcsIHNlbGVjdGlvbnMuam9pbignJykpOwogIGhlbHBlcnMuZG9LZXlzKCdqJywgJ2onKTsKICBzZWxlY3Rpb25zID0gY20uZ2V0U2VsZWN0aW9ucygpOwogIGVxKCc2NzhhYmMnLCBzZWxlY3Rpb25zLmpvaW4oJycpKTsKICBoZWxwZXJzLmRvS2V5cygnNCcsICdsJyk7CiAgc2VsZWN0aW9ucyA9IGNtLmdldFNlbGVjdGlvbnMoKTsKICBlcSgnODkxY2RlJywgc2VsZWN0aW9ucy5qb2luKCcnKSk7CiAgLy8gc3dpdGNoIGJldHdlZW4gdmlzdWFsIG1vZGVzCiAgY20uc2V0Q3Vyc29yKDEsIDEpOwogIC8vIGJsb2Nrd2lzZSB0byBjaGFyYWN0ZXJ3aXNlIHZpc3VhbAogIGhlbHBlcnMuZG9LZXlzKCc8Qy12PicsICc8Qy12PicsICdqJywgJ2wnLCAndicpOwogIHNlbGVjdGlvbnMgPSBjbS5nZXRTZWxlY3Rpb25zKCk7CiAgZXEoJzc4OTFcbmFiYycsIHNlbGVjdGlvbnMuam9pbignJykpOwogIC8vIGNoYXJhY3Rlcndpc2UgdG8gYmxvY2t3aXNlCiAgaGVscGVycy5kb0tleXMoJzxDLXY+Jyk7CiAgc2VsZWN0aW9ucyA9IGNtLmdldFNlbGVjdGlvbnMoKTsKICBlcSgnNzhiYycsIHNlbGVjdGlvbnMuam9pbignJykpOwogIC8vIGJsb2Nrd2lzZSB0byBsaW5ld2lzZSB2aXN1YWwKICBoZWxwZXJzLmRvS2V5cygnVicpOwogIHNlbGVjdGlvbnMgPSBjbS5nZXRTZWxlY3Rpb25zKCk7CiAgZXEoJzY3ODkxXG5hYmNkZScsIHNlbGVjdGlvbnMuam9pbignJykpOwp9LCB7dmFsdWU6ICcxMjM0XG41Njc4XG5hYmNkZWZnJ30pOwp0ZXN0VmltKCd2aXN1YWxfbWFya3MnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgaGVscGVycy5kb0tleXMoJ2wnLCAndicsICdsJywgJ2wnLCAnaicsICdqJywgJ3YnKTsKICAvLyBUZXN0IHZpc3VhbCBtb2RlIG1hcmtzCiAgY20uc2V0Q3Vyc29yKDIsIDEpOwogIGhlbHBlcnMuZG9LZXlzKCdcJycsICc8Jyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCAxKTsKICBoZWxwZXJzLmRvS2V5cygnXCcnLCAnPicpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMiwgMCk7Cn0pOwp0ZXN0VmltKCd2aXN1YWxfam9pbicsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBoZWxwZXJzLmRvS2V5cygnbCcsICdWJywgJ2wnLCAnaicsICdqJywgJ0onKTsKICBlcSgnIDEgMiAzXG4gNFxuIDUnLCBjbS5nZXRWYWx1ZSgpKTsKfSwgeyB2YWx1ZTogJyAxXG4gMlxuIDNcbiA0XG4gNScgfSk7CnRlc3RWaW0oJ3Zpc3VhbF9ibGFuaycsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBoZWxwZXJzLmRvS2V5cygndicsICdrJyk7CiAgZXEodmltLnZpc3VhbE1vZGUsIHRydWUpOwp9LCB7IHZhbHVlOiAnXG4nIH0pOwp0ZXN0VmltKCdyZXNlbGVjdF92aXN1YWwnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgaGVscGVycy5kb0tleXMoJ2wnLCAndicsICdsJywgJ2wnLCAnbCcsICd5JywgJ2cnLCAndicpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgNSk7CiAgZXFQb3MobWFrZUN1cnNvcigwLCAxKSwgY20uZ2V0Q3Vyc29yKCdhbmNob3InKSk7CiAgaGVscGVycy5kb0tleXMoJ3YnKTsKICBjbS5zZXRDdXJzb3IoMSwgMCk7CiAgaGVscGVycy5kb0tleXMoJ3YnLCAnbCcsICdsJywgJ3AnKTsKICBlcSgnMTIzNDU2XG4yMzQ1XG5iYXInLCBjbS5nZXRWYWx1ZSgpKTsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJ2cnLCAndicpOwogIC8vIGhlcmUgdGhlIGZha2UgY3Vyc29yIGlzIGF0ICgxLCAzKQogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMSwgNCk7CiAgZXFQb3MobWFrZUN1cnNvcigxLCAwKSwgY20uZ2V0Q3Vyc29yKCdhbmNob3InKSk7CiAgaGVscGVycy5kb0tleXMoJ3YnKTsKICBjbS5zZXRDdXJzb3IoMiwgMCk7CiAgaGVscGVycy5kb0tleXMoJ3YnLCAnbCcsICdsJywgJ2cnLCAndicpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMSwgNCk7CiAgZXFQb3MobWFrZUN1cnNvcigxLCAwKSwgY20uZ2V0Q3Vyc29yKCdhbmNob3InKSk7CiAgaGVscGVycy5kb0tleXMoJ2cnLCAndicpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMiwgMyk7CiAgZXFQb3MobWFrZUN1cnNvcigyLCAwKSwgY20uZ2V0Q3Vyc29yKCdhbmNob3InKSk7CiAgZXEoJzEyMzQ1NlxuMjM0NVxuYmFyJywgY20uZ2V0VmFsdWUoKSk7Cn0sIHsgdmFsdWU6ICcxMjM0NTZcbmZvb1xuYmFyJyB9KTsKdGVzdFZpbSgncmVzZWxlY3RfdmlzdWFsX2xpbmUnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgaGVscGVycy5kb0tleXMoJ2wnLCAnVicsICdqJywgJ2onLCAnVicsICdnJywgJ3YnLCAnZCcpOwogIGVxKCdmb29cbmFuZFxuYmFyJywgY20uZ2V0VmFsdWUoKSk7CiAgY20uc2V0Q3Vyc29yKDEsIDApOwogIGhlbHBlcnMuZG9LZXlzKCdWJywgJ3knLCAnaicpOwogIGhlbHBlcnMuZG9LZXlzKCdWJywgJ3AnICwgJ2cnLCAndicsICdkJyk7CiAgZXEoJ2Zvb1xuYW5kJywgY20uZ2V0VmFsdWUoKSk7Cn0sIHsgdmFsdWU6ICdoZWxsb1xudGhpc1xuaXNcbmZvb1xuYW5kXG5iYXInIH0pOwp0ZXN0VmltKCdyZXNlbGVjdF92aXN1YWxfYmxvY2snLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDEsIDIpOwogIGhlbHBlcnMuZG9LZXlzKCc8Qy12PicsICdrJywgJ2gnLCAnPEMtdj4nKTsKICBjbS5zZXRDdXJzb3IoMiwgMSk7CiAgaGVscGVycy5kb0tleXMoJ3YnLCAnbCcsICdnJywgJ3YnKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDEpOwogIC8vIEVuc3VyZSBzZWxlY3Rpb24gaXMgZG9uZSB3aXRoIHZpc3VhbCBibG9jayBtb2RlIHJhdGhlciB0aGFuIG9uZQogIC8vIGNvbnRpbnVvdXMgcmFuZ2UuCiAgZXEoY20uZ2V0U2VsZWN0aW9ucygpLmpvaW4oJycpLCAnMjNvbycpCiAgaGVscGVycy5kb0tleXMoJ2cnLCAndicpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMiwgMyk7CiAgLy8gRW5zdXJlIHNlbGVjdGlvbiBvZiBkZWxldGVkIHJhbmdlCiAgY20uc2V0Q3Vyc29yKDEsIDEpOwogIGhlbHBlcnMuZG9LZXlzKCd2JywgJzxDLXY+JywgJ2onLCAnZCcsICdnJywgJ3YnKTsKICBlcShjbS5nZXRTZWxlY3Rpb25zKCkuam9pbignJyksICdvcicpOwp9LCB7IHZhbHVlOiAnMTIzNDU2XG5mb29cbmJhcicgfSk7CnRlc3RWaW0oJ3Nfbm9ybWFsJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAxKTsKICBoZWxwZXJzLmRvS2V5cygncycpOwogIGhlbHBlcnMuZG9JbnNlcnRNb2RlS2V5cygnRXNjJyk7CiAgZXEoJ2FjJywgY20uZ2V0VmFsdWUoKSk7Cn0sIHsgdmFsdWU6ICdhYmMnfSk7CnRlc3RWaW0oJ3NfdmlzdWFsJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAxKTsKICBoZWxwZXJzLmRvS2V5cygndicsICdzJyk7CiAgaGVscGVycy5kb0luc2VydE1vZGVLZXlzKCdFc2MnKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDApOwogIGVxKCdhYycsIGNtLmdldFZhbHVlKCkpOwp9LCB7IHZhbHVlOiAnYWJjJ30pOwp0ZXN0VmltKCdvX3Zpc3VhbCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwwKTsKICBoZWxwZXJzLmRvS2V5cygndicsJ2wnLCdsJywnbCcsJ28nKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsMCk7CiAgaGVscGVycy5kb0tleXMoJ3YnLCd2JywnaicsJ2onLCdqJywnbycpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwwKTsKICBoZWxwZXJzLmRvS2V5cygnTycpOwogIGhlbHBlcnMuZG9LZXlzKCdsJywnbCcpCiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgzLCAzKTsKICBoZWxwZXJzLmRvS2V5cygnZCcpOwogIGVxKCdwJyxjbS5nZXRWYWx1ZSgpKTsKfSwgeyB2YWx1ZTogJ2FiY2RcbmVmZ2hcbmlqa2xcbm1ub3AnfSk7CnRlc3RWaW0oJ29fdmlzdWFsX2Jsb2NrJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAxKTsKICBoZWxwZXJzLmRvS2V5cygnPEMtdj4nLCczJywnaicsJ2wnLCdsJywgJ28nKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDEpOwogIGhlbHBlcnMuZG9LZXlzKCdPJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCA0KTsKICBoZWxwZXJzLmRvS2V5cygnbycpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMywgMSk7Cn0sIHsgdmFsdWU6ICdhYmNkXG5lZmdoXG5pamtsXG5tbm9wJ30pOwp0ZXN0VmltKCdjaGFuZ2VDYXNlX3Zpc3VhbCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJ3YnLCAnbCcsICdsJyk7CiAgaGVscGVycy5kb0tleXMoJ1UnKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDApOwogIGhlbHBlcnMuZG9LZXlzKCd2JywgJ2wnLCAnbCcpOwogIGhlbHBlcnMuZG9LZXlzKCd1Jyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnbCcsICdsJywgJ2wnLCAnLicpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgMyk7CiAgY20uc2V0Q3Vyc29yKDAsIDApOwogIGhlbHBlcnMuZG9LZXlzKCdxJywgJ2EnLCAndicsICdqJywgJ1UnLCAncScpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJ2onLCAnQCcsICdhJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgxLCAwKTsKICBjbS5zZXRDdXJzb3IoMywgMCk7CiAgaGVscGVycy5kb0tleXMoJ1YnLCAnVScsICdqJywgJy4nKTsKICBlcSgnQUJDREVGXG5HSElKS0xcbk1ub3BxXG5TSE9SVCBMSU5FXG5MT05HIExJTkUgT0YgVEVYVCcsIGNtLmdldFZhbHVlKCkpOwp9LCB7IHZhbHVlOiAnYWJjZGVmXG5naGlqa2xcbm1ub3BxXG5zaG9ydCBsaW5lXG5sb25nIGxpbmUgb2YgdGV4dCd9KTsKdGVzdFZpbSgnY2hhbmdlQ2FzZV92aXN1YWxfYmxvY2snLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDIsIDEpOwogIGhlbHBlcnMuZG9LZXlzKCc8Qy12PicsICdrJywgJ2snLCAnaCcsICdVJyk7CiAgZXEoJ0FCY2RlZlxuR0hpamtsXG5NTm9wcVxuZm9vJywgY20uZ2V0VmFsdWUoKSk7CiAgY20uc2V0Q3Vyc29yKDAsIDIpOwogIGhlbHBlcnMuZG9LZXlzKCcuJyk7CiAgZXEoJ0FCQ0RlZlxuR0hJSmtsXG5NTk9QcVxuZm9vJywgY20uZ2V0VmFsdWUoKSk7CiAgLy8gY2hlY2sgd2hlbiBsYXN0IGxpbmUgaXMgc2hvcnRlci4KICBjbS5zZXRDdXJzb3IoMiwgMik7CiAgaGVscGVycy5kb0tleXMoJy4nKTsKICBlcSgnQUJDRGVmXG5HSElKa2xcbk1OT1BxXG5mb08nLCBjbS5nZXRWYWx1ZSgpKTsKfSwgeyB2YWx1ZTogJ2FiY2RlZlxuZ2hpamtsXG5tbm9wcVxuZm9vJ30pOwp0ZXN0VmltKCd2aXN1YWxfcGFzdGUnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDApOwogIGhlbHBlcnMuZG9LZXlzKCd2JywgJ2wnLCAnbCcsICd5JywgJ2onLCAndicsICdsJywgJ3AnKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDEsIDUpOwogIGVxKCd0aGlzIGlzIGFcbnVuaXRoaXRlc3QgZm9yIHZpc3VhbCBwYXN0ZScsIGNtLmdldFZhbHVlKCkpOwogIGNtLnNldEN1cnNvcigwLCAwKTsKICAvLyBpbiBjYXNlIG9mIHBhc3Rpbmcgd2hvbGUgbGluZQogIGhlbHBlcnMuZG9LZXlzKCd5JywgJ3knKTsKICBjbS5zZXRDdXJzb3IoMSwgNik7CiAgaGVscGVycy5kb0tleXMoJ3YnLCAnbCcsICdsJywgJ2wnLCAncCcpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMiwgMCk7CiAgZXEoJ3RoaXMgaXMgYVxudW5pdGhpXG50aGlzIGlzIGFcbiBmb3IgdmlzdWFsIHBhc3RlJywgY20uZ2V0VmFsdWUoKSk7Cn0sIHsgdmFsdWU6ICd0aGlzIGlzIGFcbnVuaXQgdGVzdCBmb3IgdmlzdWFsIHBhc3RlJ30pOwoKLy8gVGhpcyBjaGVja3MgdGhlIGNvbnRlbnRzIG9mIHRoZSByZWdpc3RlciB1c2VkIHRvIHBhc3RlIHRoZSB0ZXh0CnRlc3RWaW0oJ3ZfcGFzdGVfZnJvbV9yZWdpc3RlcicsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJyInLCAnYScsICd5JywgJ3cnKTsKICBjbS5zZXRDdXJzb3IoMSwgMCk7CiAgaGVscGVycy5kb0tleXMoJ3YnLCAncCcpOwogIGNtLm9wZW5EaWFsb2cgPSBoZWxwZXJzLmZha2VPcGVuRGlhbG9nKCdyZWdpc3RlcnMnKTsKICBjbS5vcGVuTm90aWZpY2F0aW9uID0gaGVscGVycy5mYWtlT3Blbk5vdGlmaWNhdGlvbihmdW5jdGlvbih0ZXh0KSB7CiAgICBpcygvYVxzK3JlZ2lzdGVyLy50ZXN0KHRleHQpKTsKICB9KTsKfSwgeyB2YWx1ZTogJ3JlZ2lzdGVyIGNvbnRlbnRzXG5hcmUgbm90IGVyYXNlZCd9KTsKdGVzdFZpbSgnU19ub3JtYWwnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDEpOwogIGhlbHBlcnMuZG9LZXlzKCdqJywgJ1MnKTsKICBoZWxwZXJzLmRvSW5zZXJ0TW9kZUtleXMoJ0VzYycpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMSwgMCk7CiAgZXEoJ2FhXG5cbmNjJywgY20uZ2V0VmFsdWUoKSk7Cn0sIHsgdmFsdWU6ICdhYVxuYmJcbmNjJ30pOwp0ZXN0VmltKCdTX3Zpc3VhbCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgMSk7CiAgaGVscGVycy5kb0tleXMoJ3YnLCAnaicsICdTJyk7CiAgaGVscGVycy5kb0luc2VydE1vZGVLZXlzKCdFc2MnKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDApOwogIGVxKCdcbmNjJywgY20uZ2V0VmFsdWUoKSk7Cn0sIHsgdmFsdWU6ICdhYVxuYmJcbmNjJ30pOwoKdGVzdFZpbSgnLyBhbmQgbi9OJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLm9wZW5EaWFsb2cgPSBoZWxwZXJzLmZha2VPcGVuRGlhbG9nKCdtYXRjaCcpOwogIGhlbHBlcnMuZG9LZXlzKCcvJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCAxMSk7CiAgaGVscGVycy5kb0tleXMoJ24nKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDEsIDYpOwogIGhlbHBlcnMuZG9LZXlzKCdOJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCAxMSk7CgogIGNtLnNldEN1cnNvcigwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnMicsICcvJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgxLCA2KTsKfSwgeyB2YWx1ZTogJ21hdGNoIG5vcGUgbWF0Y2ggXG4gbm9wZSBNYXRjaCcgfSk7CnRlc3RWaW0oJy9fY2FzZScsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5vcGVuRGlhbG9nID0gaGVscGVycy5mYWtlT3BlbkRpYWxvZygnTWF0Y2gnKTsKICBoZWxwZXJzLmRvS2V5cygnLycpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMSwgNik7Cn0sIHsgdmFsdWU6ICdtYXRjaCBub3BlIG1hdGNoIFxuIG5vcGUgTWF0Y2gnIH0pOwp0ZXN0VmltKCcvXzJfcGNyZScsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBDb2RlTWlycm9yLlZpbS5zZXRPcHRpb24oJ3BjcmUnLCB0cnVlKTsKICBjbS5vcGVuRGlhbG9nID0gaGVscGVycy5mYWtlT3BlbkRpYWxvZygnKHdvcmQpezJ9Jyk7CiAgaGVscGVycy5kb0tleXMoJy8nKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDEsIDkpOwogIGhlbHBlcnMuZG9LZXlzKCduJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgyLCAxKTsKfSwgeyB2YWx1ZTogJ3dvcmRcbiBhbm90aGVyIHdvcmR3b3JkXG4gd29yZHdvcmR3b3JkXG4nIH0pOwp0ZXN0VmltKCcvXzJfbm9wY3JlJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIENvZGVNaXJyb3IuVmltLnNldE9wdGlvbigncGNyZScsIGZhbHNlKTsKICBjbS5vcGVuRGlhbG9nID0gaGVscGVycy5mYWtlT3BlbkRpYWxvZygnXFwod29yZFxcKVxcezJ9Jyk7CiAgaGVscGVycy5kb0tleXMoJy8nKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDEsIDkpOwogIGhlbHBlcnMuZG9LZXlzKCduJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgyLCAxKTsKfSwgeyB2YWx1ZTogJ3dvcmRcbiBhbm90aGVyIHdvcmR3b3JkXG4gd29yZHdvcmR3b3JkXG4nIH0pOwp0ZXN0VmltKCcvX25vbmdyZWVkeScsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5vcGVuRGlhbG9nID0gaGVscGVycy5mYWtlT3BlbkRpYWxvZygnYWEnKTsKICBoZWxwZXJzLmRvS2V5cygnLycpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgNCk7CiAgaGVscGVycy5kb0tleXMoJ24nKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDEsIDMpOwogIGhlbHBlcnMuZG9LZXlzKCduJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCAwKTsKfSwgeyB2YWx1ZTogJ2FhYSBhYSBcbiBhIGFhJ30pOwp0ZXN0VmltKCc/X25vbmdyZWVkeScsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5vcGVuRGlhbG9nID0gaGVscGVycy5mYWtlT3BlbkRpYWxvZygnYWEnKTsKICBoZWxwZXJzLmRvS2V5cygnPycpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMSwgMyk7CiAgaGVscGVycy5kb0tleXMoJ24nKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDQpOwogIGhlbHBlcnMuZG9LZXlzKCduJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCAwKTsKfSwgeyB2YWx1ZTogJ2FhYSBhYSBcbiBhIGFhJ30pOwp0ZXN0VmltKCcvX2dyZWVkeScsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5vcGVuRGlhbG9nID0gaGVscGVycy5mYWtlT3BlbkRpYWxvZygnYSsnKTsKICBoZWxwZXJzLmRvS2V5cygnLycpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgNCk7CiAgaGVscGVycy5kb0tleXMoJ24nKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDEsIDEpOwogIGhlbHBlcnMuZG9LZXlzKCduJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgxLCAzKTsKICBoZWxwZXJzLmRvS2V5cygnbicpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgMCk7Cn0sIHsgdmFsdWU6ICdhYWEgYWEgXG4gYSBhYSd9KTsKdGVzdFZpbSgnP19ncmVlZHknLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20ub3BlbkRpYWxvZyA9IGhlbHBlcnMuZmFrZU9wZW5EaWFsb2coJ2ErJyk7CiAgaGVscGVycy5kb0tleXMoJz8nKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDEsIDMpOwogIGhlbHBlcnMuZG9LZXlzKCduJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgxLCAxKTsKICBoZWxwZXJzLmRvS2V5cygnbicpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgNCk7CiAgaGVscGVycy5kb0tleXMoJ24nKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDApOwp9LCB7IHZhbHVlOiAnYWFhIGFhIFxuIGEgYWEnfSk7CnRlc3RWaW0oJy9fZ3JlZWR5XzBfb3JfbW9yZScsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5vcGVuRGlhbG9nID0gaGVscGVycy5mYWtlT3BlbkRpYWxvZygnYSonKTsKICBoZWxwZXJzLmRvS2V5cygnLycpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgMyk7CiAgaGVscGVycy5kb0tleXMoJ24nKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDQpOwogIGhlbHBlcnMuZG9LZXlzKCduJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCA1KTsKICBoZWxwZXJzLmRvS2V5cygnbicpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMSwgMCk7CiAgaGVscGVycy5kb0tleXMoJ24nKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDEsIDEpOwogIGhlbHBlcnMuZG9LZXlzKCduJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCAwKTsKfSwgeyB2YWx1ZTogJ2FhYSAgYWFcbiBhYSd9KTsKdGVzdFZpbSgnP19ncmVlZHlfMF9vcl9tb3JlJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLm9wZW5EaWFsb2cgPSBoZWxwZXJzLmZha2VPcGVuRGlhbG9nKCdhKicpOwogIGhlbHBlcnMuZG9LZXlzKCc/Jyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgxLCAxKTsKICBoZWxwZXJzLmRvS2V5cygnbicpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMSwgMCk7CiAgaGVscGVycy5kb0tleXMoJ24nKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDUpOwogIGhlbHBlcnMuZG9LZXlzKCduJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCA0KTsKICBoZWxwZXJzLmRvS2V5cygnbicpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgMyk7CiAgaGVscGVycy5kb0tleXMoJ24nKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDApOwp9LCB7IHZhbHVlOiAnYWFhICBhYVxuIGFhJ30pOwp0ZXN0VmltKCc/IGFuZCBuL04nLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20ub3BlbkRpYWxvZyA9IGhlbHBlcnMuZmFrZU9wZW5EaWFsb2coJ21hdGNoJyk7CiAgaGVscGVycy5kb0tleXMoJz8nKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDEsIDYpOwogIGhlbHBlcnMuZG9LZXlzKCduJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCAxMSk7CiAgaGVscGVycy5kb0tleXMoJ04nKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDEsIDYpOwoKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJzInLCAnPycpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgMTEpOwp9LCB7IHZhbHVlOiAnbWF0Y2ggbm9wZSBtYXRjaCBcbiBub3BlIE1hdGNoJyB9KTsKdGVzdFZpbSgnKicsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgOSk7CiAgaGVscGVycy5kb0tleXMoJyonKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDIyKTsKCiAgY20uc2V0Q3Vyc29yKDAsIDkpOwogIGhlbHBlcnMuZG9LZXlzKCcyJywgJyonKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDEsIDgpOwp9LCB7IHZhbHVlOiAnbm9tYXRjaCBtYXRjaCBub21hdGNoIG1hdGNoIFxubm9tYXRjaCBNYXRjaCcgfSk7CnRlc3RWaW0oJypfbm9fd29yZCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJyonKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDApOwp9LCB7IHZhbHVlOiAnIFxuIG1hdGNoIFxuJyB9KTsKdGVzdFZpbSgnKl9zeW1ib2wnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDApOwogIGhlbHBlcnMuZG9LZXlzKCcqJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgxLCAwKTsKfSwgeyB2YWx1ZTogJyAvfVxuL30gbWF0Y2ggXG4nIH0pOwp0ZXN0VmltKCcjJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCA5KTsKICBoZWxwZXJzLmRvS2V5cygnIycpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMSwgOCk7CgogIGNtLnNldEN1cnNvcigwLCA5KTsKICBoZWxwZXJzLmRvS2V5cygnMicsICcjJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCAyMik7Cn0sIHsgdmFsdWU6ICdub21hdGNoIG1hdGNoIG5vbWF0Y2ggbWF0Y2ggXG5ub21hdGNoIE1hdGNoJyB9KTsKdGVzdFZpbSgnKl9zZWVrJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIC8vIFNob3VsZCBza2lwIG92ZXIgc3BhY2UgYW5kIHN5bWJvbHMuCiAgY20uc2V0Q3Vyc29yKDAsIDMpOwogIGhlbHBlcnMuZG9LZXlzKCcqJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCAyMik7Cn0sIHsgdmFsdWU6ICcgICAgOj0gIG1hdGNoIG5vbWF0Y2ggbWF0Y2ggXG5ub21hdGNoIE1hdGNoJyB9KTsKdGVzdFZpbSgnIycsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICAvLyBTaG91bGQgc2tpcCBvdmVyIHNwYWNlIGFuZCBzeW1ib2xzLgogIGNtLnNldEN1cnNvcigwLCAzKTsKICBoZWxwZXJzLmRvS2V5cygnIycpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMSwgOCk7Cn0sIHsgdmFsdWU6ICcgICAgOj0gIG1hdGNoIG5vbWF0Y2ggbWF0Y2ggXG5ub21hdGNoIE1hdGNoJyB9KTsKdGVzdFZpbSgnZyonLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDgpOwogIGhlbHBlcnMuZG9LZXlzKCdnJywgJyonKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDE4KTsKICBjbS5zZXRDdXJzb3IoMCwgOCk7CiAgaGVscGVycy5kb0tleXMoJzMnLCAnZycsICcqJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgxLCA4KTsKfSwgeyB2YWx1ZTogJ21hdGNoZXMgbWF0Y2ggYWxzb01hdGNoXG5tYXRjaG1lIG1hdGNoaW5nJyB9KTsKdGVzdFZpbSgnZyMnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDgpOwogIGhlbHBlcnMuZG9LZXlzKCdnJywgJyMnKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDApOwogIGNtLnNldEN1cnNvcigwLCA4KTsKICBoZWxwZXJzLmRvS2V5cygnMycsICdnJywgJyMnKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDEsIDApOwp9LCB7IHZhbHVlOiAnbWF0Y2hlcyBtYXRjaCBhbHNvTWF0Y2hcbm1hdGNobWUgbWF0Y2hpbmcnIH0pOwp0ZXN0VmltKCdtYWNyb19pbnNlcnQnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDApOwogIGhlbHBlcnMuZG9LZXlzKCdxJywgJ2EnLCAnMCcsICdpJyk7CiAgY20ucmVwbGFjZVJhbmdlKCdmb28nLCBjbS5nZXRDdXJzb3IoKSk7CiAgaGVscGVycy5kb0luc2VydE1vZGVLZXlzKCdFc2MnKTsKICBoZWxwZXJzLmRvS2V5cygncScsICdAJywgJ2EnKTsKICBlcSgnZm9vZm9vJywgY20uZ2V0VmFsdWUoKSk7Cn0sIHsgdmFsdWU6ICcnfSk7CnRlc3RWaW0oJ21hY3JvX2luc2VydF9yZXBlYXQnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDApOwogIGhlbHBlcnMuZG9LZXlzKCdxJywgJ2EnLCAnJCcsICdhJyk7CiAgY20ucmVwbGFjZVJhbmdlKCdsYXJyeS4nLCBjbS5nZXRDdXJzb3IoKSk7CiAgaGVscGVycy5kb0luc2VydE1vZGVLZXlzKCdFc2MnKTsKICBoZWxwZXJzLmRvS2V5cygnYScpOwogIGNtLnJlcGxhY2VSYW5nZSgnY3VybHkuJywgY20uZ2V0Q3Vyc29yKCkpOwogIGhlbHBlcnMuZG9JbnNlcnRNb2RlS2V5cygnRXNjJyk7CiAgaGVscGVycy5kb0tleXMoJ3EnKTsKICBoZWxwZXJzLmRvS2V5cygnYScpOwogIGNtLnJlcGxhY2VSYW5nZSgnbW9lLicsIGNtLmdldEN1cnNvcigpKTsKICBoZWxwZXJzLmRvSW5zZXJ0TW9kZUtleXMoJ0VzYycpOwogIGhlbHBlcnMuZG9LZXlzKCdAJywgJ2EnKTsKICAvLyBBdCB0aGlzIHBvaW50LCB0aGUgbW9zdCByZWNlbnQgZWRpdCBzaG91bGQgYmUgdGhlIDJuZCBpbnNlcnQgY2hhbmdlCiAgLy8gaW5zaWRlIHRoZSBtYWNybywgaS5lLiAiY3VybHkuIi4KICBoZWxwZXJzLmRvS2V5cygnLicpOwogIGVxKCdsYXJyeS5jdXJseS5tb2UubGFycnkuY3VybHkuY3VybHkuJywgY20uZ2V0VmFsdWUoKSk7Cn0sIHsgdmFsdWU6ICcnfSk7CnRlc3RWaW0oJ21hY3JvX3NwYWNlJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnPFNwYWNlPicsICc8U3BhY2U+Jyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCAyKTsKICBoZWxwZXJzLmRvS2V5cygncScsICdhJywgJzxTcGFjZT4nLCAnPFNwYWNlPicsICdxJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCA0KTsKICBoZWxwZXJzLmRvS2V5cygnQCcsICdhJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCA2KTsKICBoZWxwZXJzLmRvS2V5cygnQCcsICdhJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCA4KTsKfSwgeyB2YWx1ZTogJ29uZSBsaW5lIG9mIHRleHQuJ30pOwp0ZXN0VmltKCdtYWNyb190X3NlYXJjaCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJ3EnLCAnYScsICd0JywgJ2UnLCAncScpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgMSk7CiAgaGVscGVycy5kb0tleXMoJ2wnLCAnQCcsICdhJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCA2KTsKICBoZWxwZXJzLmRvS2V5cygnbCcsICc7Jyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCAxMik7Cn0sIHsgdmFsdWU6ICdvbmUgbGluZSBvZiB0ZXh0Lid9KTsKdGVzdFZpbSgnbWFjcm9fZl9zZWFyY2gnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDApOwogIGhlbHBlcnMuZG9LZXlzKCdxJywgJ2InLCAnZicsICdlJywgJ3EnKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDIpOwogIGhlbHBlcnMuZG9LZXlzKCdAJywgJ2InKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDcpOwogIGhlbHBlcnMuZG9LZXlzKCc7Jyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCAxMyk7Cn0sIHsgdmFsdWU6ICdvbmUgbGluZSBvZiB0ZXh0Lid9KTsKdGVzdFZpbSgnbWFjcm9fc2xhc2hfc2VhcmNoJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygncScsICdjJyk7CiAgY20ub3BlbkRpYWxvZyA9IGhlbHBlcnMuZmFrZU9wZW5EaWFsb2coJ2UnKTsKICBoZWxwZXJzLmRvS2V5cygnLycsICdxJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCAyKTsKICBoZWxwZXJzLmRvS2V5cygnQCcsICdjJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCA3KTsKICBoZWxwZXJzLmRvS2V5cygnbicpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgMTMpOwp9LCB7IHZhbHVlOiAnb25lIGxpbmUgb2YgdGV4dC4nfSk7CnRlc3RWaW0oJ21hY3JvX211bHRpc2xhc2hfc2VhcmNoJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygncScsICdkJyk7CiAgY20ub3BlbkRpYWxvZyA9IGhlbHBlcnMuZmFrZU9wZW5EaWFsb2coJ2UnKTsKICBoZWxwZXJzLmRvS2V5cygnLycpOwogIGNtLm9wZW5EaWFsb2cgPSBoZWxwZXJzLmZha2VPcGVuRGlhbG9nKCd0Jyk7CiAgaGVscGVycy5kb0tleXMoJy8nLCAncScpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgMTIpOwogIGhlbHBlcnMuZG9LZXlzKCdAJywgJ2QnKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDE1KTsKfSwgeyB2YWx1ZTogJ29uZSBsaW5lIG9mIHRleHQgdG8gcnVsZSB0aGVtIGFsbC4nfSk7CnRlc3RWaW0oJ21hY3JvX3BhcmVucycsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJ3EnLCAneicsICdpJyk7CiAgY20ucmVwbGFjZVJhbmdlKCcoJywgY20uZ2V0Q3Vyc29yKCkpOwogIGhlbHBlcnMuZG9JbnNlcnRNb2RlS2V5cygnRXNjJyk7CiAgaGVscGVycy5kb0tleXMoJ2UnLCAnYScpOwogIGNtLnJlcGxhY2VSYW5nZSgnKScsIGNtLmdldEN1cnNvcigpKTsKICBoZWxwZXJzLmRvSW5zZXJ0TW9kZUtleXMoJ0VzYycpOwogIGhlbHBlcnMuZG9LZXlzKCdxJyk7CiAgaGVscGVycy5kb0tleXMoJ3cnLCAnQCcsICd6Jyk7CiAgaGVscGVycy5kb0tleXMoJ3cnLCAnQCcsICd6Jyk7CiAgZXEoJyhzZWUpIChzcG90KSAocnVuKScsIGNtLmdldFZhbHVlKCkpOwp9LCB7IHZhbHVlOiAnc2VlIHNwb3QgcnVuJ30pOwp0ZXN0VmltKCdtYWNyb19vdmVyd3JpdGUnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDApOwogIGhlbHBlcnMuZG9LZXlzKCdxJywgJ3onLCAnMCcsICdpJyk7CiAgY20ucmVwbGFjZVJhbmdlKCdJICcsIGNtLmdldEN1cnNvcigpKTsKICBoZWxwZXJzLmRvSW5zZXJ0TW9kZUtleXMoJ0VzYycpOwogIGhlbHBlcnMuZG9LZXlzKCdxJyk7CiAgaGVscGVycy5kb0tleXMoJ2UnKTsKICAvLyBOb3cgcmVwbGFjZSB0aGUgbWFjcm8gd2l0aCBzb21ldGhpbmcgZWxzZS4KICBoZWxwZXJzLmRvS2V5cygncScsICd6JywgJ2EnKTsKICBjbS5yZXBsYWNlUmFuZ2UoJy4nLCBjbS5nZXRDdXJzb3IoKSk7CiAgaGVscGVycy5kb0luc2VydE1vZGVLZXlzKCdFc2MnKTsKICBoZWxwZXJzLmRvS2V5cygncScpOwogIGhlbHBlcnMuZG9LZXlzKCdlJywgJ0AnLCAneicpOwogIGhlbHBlcnMuZG9LZXlzKCdlJywgJ0AnLCAneicpOwogIGVxKCdJIHNlZS4gc3BvdC4gcnVuLicsIGNtLmdldFZhbHVlKCkpOwp9LCB7IHZhbHVlOiAnc2VlIHNwb3QgcnVuJ30pOwp0ZXN0VmltKCdtYWNyb19zZWFyY2hfZicsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJ3EnLCAnYScsICdmJywgJyAnKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsMyk7CiAgaGVscGVycy5kb0tleXMoJ3EnLCAnMCcpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwwKTsKICBoZWxwZXJzLmRvS2V5cygnQCcsICdhJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLDMpOwp9LCB7IHZhbHVlOiAnVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wZWQgb3ZlciB0aGUgbGF6eSBkb2cuJ30pOwp0ZXN0VmltKCdtYWNyb19zZWFyY2hfMmYnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDApOwogIGhlbHBlcnMuZG9LZXlzKCdxJywgJ2EnLCAnMicsICdmJywgJyAnKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsOSk7CiAgaGVscGVycy5kb0tleXMoJ3EnLCAnMCcpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwwKTsKICBoZWxwZXJzLmRvS2V5cygnQCcsICdhJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLDkpOwp9LCB7IHZhbHVlOiAnVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wZWQgb3ZlciB0aGUgbGF6eSBkb2cuJ30pOwp0ZXN0VmltKCd5YW5rX3JlZ2lzdGVyJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnIicsICdhJywgJ3knLCAneScpOwogIGhlbHBlcnMuZG9LZXlzKCdqJywgJyInLCAnYicsICd5JywgJ3knKTsKICBjbS5vcGVuRGlhbG9nID0gaGVscGVycy5mYWtlT3BlbkRpYWxvZygncmVnaXN0ZXJzJyk7CiAgY20ub3Blbk5vdGlmaWNhdGlvbiA9IGhlbHBlcnMuZmFrZU9wZW5Ob3RpZmljYXRpb24oZnVuY3Rpb24odGV4dCkgewogICAgaXMoL2Fccytmb28vLnRlc3QodGV4dCkpOwogICAgaXMoL2JccytiYXIvLnRlc3QodGV4dCkpOwogIH0pOwogIGhlbHBlcnMuZG9LZXlzKCc6Jyk7Cn0sIHsgdmFsdWU6ICdmb29cbmJhcid9KTsKdGVzdFZpbSgneWFua192aXN1YWxfYmxvY2snLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDEpOwogIGhlbHBlcnMuZG9LZXlzKCc8Qy12PicsICdsJywgJ2onLCAnIicsICdhJywgJ3knKTsKICBjbS5vcGVuTm90aWZpY2F0aW9uID0gaGVscGVycy5mYWtlT3Blbk5vdGlmaWNhdGlvbihmdW5jdGlvbih0ZXh0KSB7CiAgICBpcygvYVxzK29vXG5hci8udGVzdCh0ZXh0KSk7CiAgfSk7CiAgaGVscGVycy5kb0tleXMoJzonKTsKfSwgeyB2YWx1ZTogJ2Zvb1xuYmFyJ30pOwp0ZXN0VmltKCd5YW5rX2FwcGVuZF9saW5lX3RvX2xpbmVfcmVnaXN0ZXInLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDApOwogIGhlbHBlcnMuZG9LZXlzKCciJywgJ2EnLCAneScsICd5Jyk7CiAgaGVscGVycy5kb0tleXMoJ2onLCAnIicsICdBJywgJ3knLCAneScpOwogIGNtLm9wZW5EaWFsb2cgPSBoZWxwZXJzLmZha2VPcGVuRGlhbG9nKCdyZWdpc3RlcnMnKTsKICBjbS5vcGVuTm90aWZpY2F0aW9uID0gaGVscGVycy5mYWtlT3Blbk5vdGlmaWNhdGlvbihmdW5jdGlvbih0ZXh0KSB7CiAgICBpcygvYVxzK2Zvb1xuYmFyLy50ZXN0KHRleHQpKTsKICAgIGlzKC8iXHMrZm9vXG5iYXIvLnRlc3QodGV4dCkpOwogIH0pOwogIGhlbHBlcnMuZG9LZXlzKCc6Jyk7Cn0sIHsgdmFsdWU6ICdmb29cbmJhcid9KTsKdGVzdFZpbSgneWFua19hcHBlbmRfd29yZF90b193b3JkX3JlZ2lzdGVyJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnIicsICdhJywgJ3knLCAndycpOwogIGhlbHBlcnMuZG9LZXlzKCdqJywgJyInLCAnQScsICd5JywgJ3cnKTsKICBjbS5vcGVuRGlhbG9nID0gaGVscGVycy5mYWtlT3BlbkRpYWxvZygncmVnaXN0ZXJzJyk7CiAgY20ub3Blbk5vdGlmaWNhdGlvbiA9IGhlbHBlcnMuZmFrZU9wZW5Ob3RpZmljYXRpb24oZnVuY3Rpb24odGV4dCkgewogICAgaXMoL2Fccytmb29iYXIvLnRlc3QodGV4dCkpOwogICAgaXMoLyJccytmb29iYXIvLnRlc3QodGV4dCkpOwogIH0pOwogIGhlbHBlcnMuZG9LZXlzKCc6Jyk7Cn0sIHsgdmFsdWU6ICdmb29cbmJhcid9KTsKdGVzdFZpbSgneWFua19hcHBlbmRfbGluZV90b193b3JkX3JlZ2lzdGVyJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnIicsICdhJywgJ3knLCAndycpOwogIGhlbHBlcnMuZG9LZXlzKCdqJywgJyInLCAnQScsICd5JywgJ3knKTsKICBjbS5vcGVuRGlhbG9nID0gaGVscGVycy5mYWtlT3BlbkRpYWxvZygncmVnaXN0ZXJzJyk7CiAgY20ub3Blbk5vdGlmaWNhdGlvbiA9IGhlbHBlcnMuZmFrZU9wZW5Ob3RpZmljYXRpb24oZnVuY3Rpb24odGV4dCkgewogICAgaXMoL2Fccytmb29cbmJhci8udGVzdCh0ZXh0KSk7CiAgICBpcygvIlxzK2Zvb1xuYmFyLy50ZXN0KHRleHQpKTsKICB9KTsKICBoZWxwZXJzLmRvS2V5cygnOicpOwp9LCB7IHZhbHVlOiAnZm9vXG5iYXInfSk7CnRlc3RWaW0oJ3lhbmtfYXBwZW5kX3dvcmRfdG9fbGluZV9yZWdpc3RlcicsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJyInLCAnYScsICd5JywgJ3knKTsKICBoZWxwZXJzLmRvS2V5cygnaicsICciJywgJ0EnLCAneScsICd3Jyk7CiAgY20ub3BlbkRpYWxvZyA9IGhlbHBlcnMuZmFrZU9wZW5EaWFsb2coJ3JlZ2lzdGVycycpOwogIGNtLm9wZW5Ob3RpZmljYXRpb24gPSBoZWxwZXJzLmZha2VPcGVuTm90aWZpY2F0aW9uKGZ1bmN0aW9uKHRleHQpIHsKICAgIGlzKC9hXHMrZm9vXG5iYXIvLnRlc3QodGV4dCkpOwogICAgaXMoLyJccytmb29cbmJhci8udGVzdCh0ZXh0KSk7CiAgfSk7CiAgaGVscGVycy5kb0tleXMoJzonKTsKfSwgeyB2YWx1ZTogJ2Zvb1xuYmFyJ30pOwp0ZXN0VmltKCdtYWNyb19yZWdpc3RlcicsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJ3EnLCAnYScsICdpJyk7CiAgY20ucmVwbGFjZVJhbmdlKCdnYW5nbmFtJywgY20uZ2V0Q3Vyc29yKCkpOwogIGhlbHBlcnMuZG9JbnNlcnRNb2RlS2V5cygnRXNjJyk7CiAgaGVscGVycy5kb0tleXMoJ3EnKTsKICBoZWxwZXJzLmRvS2V5cygncScsICdiJywgJ28nKTsKICBjbS5yZXBsYWNlUmFuZ2UoJ3N0eWxlJywgY20uZ2V0Q3Vyc29yKCkpOwogIGhlbHBlcnMuZG9JbnNlcnRNb2RlS2V5cygnRXNjJyk7CiAgaGVscGVycy5kb0tleXMoJ3EnKTsKICBjbS5vcGVuRGlhbG9nID0gaGVscGVycy5mYWtlT3BlbkRpYWxvZygncmVnaXN0ZXJzJyk7CiAgY20ub3Blbk5vdGlmaWNhdGlvbiA9IGhlbHBlcnMuZmFrZU9wZW5Ob3RpZmljYXRpb24oZnVuY3Rpb24odGV4dCkgewogICAgaXMoL2FccytpLy50ZXN0KHRleHQpKTsKICAgIGlzKC9iXHMrby8udGVzdCh0ZXh0KSk7CiAgfSk7CiAgaGVscGVycy5kb0tleXMoJzonKTsKfSwgeyB2YWx1ZTogJyd9KTsKdGVzdFZpbSgnLl9yZWdpc3RlcicsIGZ1bmN0aW9uKGNtLHZpbSxoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsMCk7CiAgaGVscGVycy5kb0tleXMoJ2knKTsKICBjbS5yZXBsYWNlUmFuZ2UoJ2ZvbycsY20uZ2V0Q3Vyc29yKCkpOwogIGhlbHBlcnMuZG9JbnNlcnRNb2RlS2V5cygnRXNjJyk7CiAgY20ub3BlbkRpYWxvZyA9IGhlbHBlcnMuZmFrZU9wZW5EaWFsb2coJ3JlZ2lzdGVycycpOwogIGNtLm9wZW5Ob3RpZmljYXRpb24gPSBoZWxwZXJzLmZha2VPcGVuTm90aWZpY2F0aW9uKGZ1bmN0aW9uKHRleHQpIHsKICAgIGlzKC9cLlxzK2Zvby8udGVzdCh0ZXh0KSk7CiAgfSk7CiAgaGVscGVycy5kb0tleXMoJzonKTsKfSwge3ZhbHVlOiAnJ30pOwp0ZXN0VmltKCc6X3JlZ2lzdGVyJywgZnVuY3Rpb24oY20sdmltLGhlbHBlcnMpIHsKICBoZWxwZXJzLmRvRXgoJ2JhcicpOwogIGNtLm9wZW5EaWFsb2cgPSBoZWxwZXJzLmZha2VPcGVuRGlhbG9nKCdyZWdpc3RlcnMnKTsKICBjbS5vcGVuTm90aWZpY2F0aW9uID0gaGVscGVycy5mYWtlT3Blbk5vdGlmaWNhdGlvbihmdW5jdGlvbih0ZXh0KSB7CiAgICBpcygvOlxzK2Jhci8udGVzdCh0ZXh0KSk7CiAgfSk7CiAgaGVscGVycy5kb0tleXMoJzonKTsKfSwge3ZhbHVlOiAnJ30pOwp0ZXN0VmltKCdzZWFyY2hfcmVnaXN0ZXJfZXNjYXBlJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIC8vIENoZWNrIHRoYXQgdGhlIHJlZ2lzdGVyIGlzIHJlc3RvcmVkIGlmIHRoZSB1c2VyIGVzY2FwZXMgcmF0aGVyIHRoYW4gY29uZmlybXMuCiAgY20ub3BlbkRpYWxvZyA9IGhlbHBlcnMuZmFrZU9wZW5EaWFsb2coJ3dhbGRvJyk7CiAgaGVscGVycy5kb0tleXMoJy8nKTsKICB2YXIgb25LZXlEb3duOwogIHZhciBvbktleVVwOwogIHZhciBLRVlDT0RFUyA9IHsKICAgIGY6IDcwLAogICAgbzogNzksCiAgICBFc2M6IDI3CiAgfTsKICBjbS5vcGVuRGlhbG9nID0gZnVuY3Rpb24odGVtcGxhdGUsIGNhbGxiYWNrLCBvcHRpb25zKSB7CiAgICBvbktleURvd24gPSBvcHRpb25zLm9uS2V5RG93bjsKICAgIG9uS2V5VXAgPSBvcHRpb25zLm9uS2V5VXA7CiAgfTsKICB2YXIgY2xvc2UgPSBmdW5jdGlvbigpIHt9OwogIGhlbHBlcnMuZG9LZXlzKCcvJyk7CiAgLy8gRmFrZSBzb21lIGtleWJvYXJkIGV2ZW50cyBjb21pbmcgaW4uCiAgb25LZXlEb3duKHtrZXlDb2RlOiBLRVlDT0RFUy5mfSwgJycsIGNsb3NlKTsKICBvbktleVVwKHtrZXlDb2RlOiBLRVlDT0RFUy5mfSwgJycsIGNsb3NlKTsKICBvbktleURvd24oe2tleUNvZGU6IEtFWUNPREVTLm99LCAnZicsIGNsb3NlKTsKICBvbktleVVwKHtrZXlDb2RlOiBLRVlDT0RFUy5vfSwgJ2YnLCBjbG9zZSk7CiAgb25LZXlEb3duKHtrZXlDb2RlOiBLRVlDT0RFUy5vfSwgJ2ZvJywgY2xvc2UpOwogIG9uS2V5VXAoe2tleUNvZGU6IEtFWUNPREVTLm99LCAnZm8nLCBjbG9zZSk7CiAgb25LZXlEb3duKHtrZXlDb2RlOiBLRVlDT0RFUy5Fc2N9LCAnZm9vJywgY2xvc2UpOwogIGNtLm9wZW5EaWFsb2cgPSBoZWxwZXJzLmZha2VPcGVuRGlhbG9nKCdyZWdpc3RlcnMnKTsKICBjbS5vcGVuTm90aWZpY2F0aW9uID0gaGVscGVycy5mYWtlT3Blbk5vdGlmaWNhdGlvbihmdW5jdGlvbih0ZXh0KSB7CiAgICBpcygvd2FsZG8vLnRlc3QodGV4dCkpOwogICAgaXMoIS9mb28vLnRlc3QodGV4dCkpOwogIH0pOwogIGhlbHBlcnMuZG9LZXlzKCc6Jyk7Cn0sIHt2YWx1ZTogJyd9KTsKdGVzdFZpbSgnc2VhcmNoX3JlZ2lzdGVyJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLm9wZW5EaWFsb2cgPSBoZWxwZXJzLmZha2VPcGVuRGlhbG9nKCdmb28nKTsKICBoZWxwZXJzLmRvS2V5cygnLycpOwogIGNtLm9wZW5EaWFsb2cgPSBoZWxwZXJzLmZha2VPcGVuRGlhbG9nKCdyZWdpc3RlcnMnKTsKICBjbS5vcGVuTm90aWZpY2F0aW9uID0gaGVscGVycy5mYWtlT3Blbk5vdGlmaWNhdGlvbihmdW5jdGlvbih0ZXh0KSB7CiAgICBpcygvXC9ccytmb28vLnRlc3QodGV4dCkpOwogIH0pOwogIGhlbHBlcnMuZG9LZXlzKCc6Jyk7Cn0sIHt2YWx1ZTogJyd9KTsKdGVzdFZpbSgnc2VhcmNoX2hpc3RvcnknLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20ub3BlbkRpYWxvZyA9IGhlbHBlcnMuZmFrZU9wZW5EaWFsb2coJ3RoaXMnKTsKICBoZWxwZXJzLmRvS2V5cygnLycpOwogIGNtLm9wZW5EaWFsb2cgPSBoZWxwZXJzLmZha2VPcGVuRGlhbG9nKCdjaGVja3MnKTsKICBoZWxwZXJzLmRvS2V5cygnLycpOwogIGNtLm9wZW5EaWFsb2cgPSBoZWxwZXJzLmZha2VPcGVuRGlhbG9nKCdzZWFyY2gnKTsKICBoZWxwZXJzLmRvS2V5cygnLycpOwogIGNtLm9wZW5EaWFsb2cgPSBoZWxwZXJzLmZha2VPcGVuRGlhbG9nKCdoaXN0b3J5Jyk7CiAgaGVscGVycy5kb0tleXMoJy8nKTsKICBjbS5vcGVuRGlhbG9nID0gaGVscGVycy5mYWtlT3BlbkRpYWxvZygnY2hlY2tzJyk7CiAgaGVscGVycy5kb0tleXMoJy8nKTsKICB2YXIgb25LZXlEb3duOwogIHZhciBvbktleVVwOwogIHZhciBxdWVyeSA9ICcnOwogIHZhciBrZXlDb2RlcyA9IHsKICAgIFVwOiAzOCwKICAgIERvd246IDQwCiAgfTsKICBjbS5vcGVuRGlhbG9nID0gZnVuY3Rpb24odGVtcGxhdGUsIGNhbGxiYWNrLCBvcHRpb25zKSB7CiAgICBvbktleVVwID0gb3B0aW9ucy5vbktleVVwOwogICAgb25LZXlEb3duID0gb3B0aW9ucy5vbktleURvd247CiAgfTsKICB2YXIgY2xvc2UgPSBmdW5jdGlvbihuZXdWYWwpIHsKICAgIGlmICh0eXBlb2YgbmV3VmFsID09ICdzdHJpbmcnKSBxdWVyeSA9IG5ld1ZhbDsKICB9CiAgaGVscGVycy5kb0tleXMoJy8nKTsKICBvbktleURvd24oe2tleUNvZGU6IGtleUNvZGVzLlVwfSwgcXVlcnksIGNsb3NlKTsKICBvbktleVVwKHtrZXlDb2RlOiBrZXlDb2Rlcy5VcH0sIHF1ZXJ5LCBjbG9zZSk7CiAgZXEocXVlcnksICdjaGVja3MnKTsKICBvbktleURvd24oe2tleUNvZGU6IGtleUNvZGVzLlVwfSwgcXVlcnksIGNsb3NlKTsKICBvbktleVVwKHtrZXlDb2RlOiBrZXlDb2Rlcy5VcH0sIHF1ZXJ5LCBjbG9zZSk7CiAgZXEocXVlcnksICdoaXN0b3J5Jyk7CiAgb25LZXlEb3duKHtrZXlDb2RlOiBrZXlDb2Rlcy5VcH0sIHF1ZXJ5LCBjbG9zZSk7CiAgb25LZXlVcCh7a2V5Q29kZToga2V5Q29kZXMuVXB9LCBxdWVyeSwgY2xvc2UpOwogIGVxKHF1ZXJ5LCAnc2VhcmNoJyk7CiAgb25LZXlEb3duKHtrZXlDb2RlOiBrZXlDb2Rlcy5VcH0sIHF1ZXJ5LCBjbG9zZSk7CiAgb25LZXlVcCh7a2V5Q29kZToga2V5Q29kZXMuVXB9LCBxdWVyeSwgY2xvc2UpOwogIGVxKHF1ZXJ5LCAndGhpcycpOwogIG9uS2V5RG93bih7a2V5Q29kZToga2V5Q29kZXMuRG93bn0sIHF1ZXJ5LCBjbG9zZSk7CiAgb25LZXlVcCh7a2V5Q29kZToga2V5Q29kZXMuRG93bn0sIHF1ZXJ5LCBjbG9zZSk7CiAgZXEocXVlcnksICdzZWFyY2gnKTsKfSwge3ZhbHVlOiAnJ30pOwp0ZXN0VmltKCdleENvbW1hbmRfaGlzdG9yeScsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5vcGVuRGlhbG9nID0gaGVscGVycy5mYWtlT3BlbkRpYWxvZygncmVnaXN0ZXJzJyk7CiAgaGVscGVycy5kb0tleXMoJzonKTsKICBjbS5vcGVuRGlhbG9nID0gaGVscGVycy5mYWtlT3BlbkRpYWxvZygnc29ydCcpOwogIGhlbHBlcnMuZG9LZXlzKCc6Jyk7CiAgY20ub3BlbkRpYWxvZyA9IGhlbHBlcnMuZmFrZU9wZW5EaWFsb2coJ21hcCcpOwogIGhlbHBlcnMuZG9LZXlzKCc6Jyk7CiAgY20ub3BlbkRpYWxvZyA9IGhlbHBlcnMuZmFrZU9wZW5EaWFsb2coJ2ludmFsaWQnKTsKICBoZWxwZXJzLmRvS2V5cygnOicpOwogIHZhciBvbktleURvd247CiAgdmFyIG9uS2V5VXA7CiAgdmFyIGlucHV0ID0gJyc7CiAgdmFyIGtleUNvZGVzID0gewogICAgVXA6IDM4LAogICAgRG93bjogNDAsCiAgICBzOiAxMTUKICB9OwogIGNtLm9wZW5EaWFsb2cgPSBmdW5jdGlvbih0ZW1wbGF0ZSwgY2FsbGJhY2ssIG9wdGlvbnMpIHsKICAgIG9uS2V5VXAgPSBvcHRpb25zLm9uS2V5VXA7CiAgICBvbktleURvd24gPSBvcHRpb25zLm9uS2V5RG93bjsKICB9OwogIHZhciBjbG9zZSA9IGZ1bmN0aW9uKG5ld1ZhbCkgewogICAgaWYgKHR5cGVvZiBuZXdWYWwgPT0gJ3N0cmluZycpIGlucHV0ID0gbmV3VmFsOwogIH0KICBoZWxwZXJzLmRvS2V5cygnOicpOwogIG9uS2V5RG93bih7a2V5Q29kZToga2V5Q29kZXMuVXB9LCBpbnB1dCwgY2xvc2UpOwogIGVxKGlucHV0LCAnaW52YWxpZCcpOwogIG9uS2V5RG93bih7a2V5Q29kZToga2V5Q29kZXMuVXB9LCBpbnB1dCwgY2xvc2UpOwogIGVxKGlucHV0LCAnbWFwJyk7CiAgb25LZXlEb3duKHtrZXlDb2RlOiBrZXlDb2Rlcy5VcH0sIGlucHV0LCBjbG9zZSk7CiAgZXEoaW5wdXQsICdzb3J0Jyk7CiAgb25LZXlEb3duKHtrZXlDb2RlOiBrZXlDb2Rlcy5VcH0sIGlucHV0LCBjbG9zZSk7CiAgZXEoaW5wdXQsICdyZWdpc3RlcnMnKTsKICBvbktleURvd24oe2tleUNvZGU6IGtleUNvZGVzLnN9LCAnJywgY2xvc2UpOwogIGlucHV0ID0gJ3MnOwogIG9uS2V5RG93bih7a2V5Q29kZToga2V5Q29kZXMuVXB9LCBpbnB1dCwgY2xvc2UpOwogIGVxKGlucHV0LCAnc29ydCcpOwp9LCB7dmFsdWU6ICcnfSk7CnRlc3RWaW0oJy4nLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDApOwogIGhlbHBlcnMuZG9LZXlzKCcyJywgJ2QnLCAndycpOwogIGhlbHBlcnMuZG9LZXlzKCcuJyk7CiAgZXEoJzUgNicsIGNtLmdldFZhbHVlKCkpOwp9LCB7IHZhbHVlOiAnMSAyIDMgNCA1IDYnfSk7CnRlc3RWaW0oJy5fcmVwZWF0JywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnMicsICdkJywgJ3cnKTsKICBoZWxwZXJzLmRvS2V5cygnMycsICcuJyk7CiAgZXEoJzYnLCBjbS5nZXRWYWx1ZSgpKTsKfSwgeyB2YWx1ZTogJzEgMiAzIDQgNSA2J30pOwp0ZXN0VmltKCcuX2luc2VydCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBoZWxwZXJzLmRvS2V5cygnaScpOwogIGNtLnJlcGxhY2VSYW5nZSgndGVzdCcsIGNtLmdldEN1cnNvcigpKTsKICBoZWxwZXJzLmRvSW5zZXJ0TW9kZUtleXMoJ0VzYycpOwogIGhlbHBlcnMuZG9LZXlzKCcuJyk7CiAgZXEoJ3Rlc3Rlc3R0JywgY20uZ2V0VmFsdWUoKSk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCA2KTsKfSwgeyB2YWx1ZTogJyd9KTsKdGVzdFZpbSgnLl9pbnNlcnRfcmVwZWF0JywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGhlbHBlcnMuZG9LZXlzKCdpJyk7CiAgY20ucmVwbGFjZVJhbmdlKCd0ZXN0JywgY20uZ2V0Q3Vyc29yKCkpOwogIGNtLnNldEN1cnNvcigwLCA0KTsKICBoZWxwZXJzLmRvSW5zZXJ0TW9kZUtleXMoJ0VzYycpOwogIGhlbHBlcnMuZG9LZXlzKCcyJywgJy4nKTsKICBlcSgndGVzdGVzdHRlc3R0JywgY20uZ2V0VmFsdWUoKSk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCAxMCk7Cn0sIHsgdmFsdWU6ICcnfSk7CnRlc3RWaW0oJy5fcmVwZWF0X2luc2VydCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBoZWxwZXJzLmRvS2V5cygnMycsICdpJyk7CiAgY20ucmVwbGFjZVJhbmdlKCd0ZScsIGNtLmdldEN1cnNvcigpKTsKICBjbS5zZXRDdXJzb3IoMCwgMik7CiAgaGVscGVycy5kb0luc2VydE1vZGVLZXlzKCdFc2MnKTsKICBoZWxwZXJzLmRvS2V5cygnLicpOwogIGVxKCd0ZXRldHRldGV0ZWUnLCBjbS5nZXRWYWx1ZSgpKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDEwKTsKfSwgeyB2YWx1ZTogJyd9KTsKdGVzdFZpbSgnLl9pbnNlcnRfbycsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBoZWxwZXJzLmRvS2V5cygnbycpOwogIGNtLnJlcGxhY2VSYW5nZSgneicsIGNtLmdldEN1cnNvcigpKTsKICBjbS5zZXRDdXJzb3IoMSwgMSk7CiAgaGVscGVycy5kb0luc2VydE1vZGVLZXlzKCdFc2MnKTsKICBoZWxwZXJzLmRvS2V5cygnLicpOwogIGVxKCdcbnpcbnonLCBjbS5nZXRWYWx1ZSgpKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDIsIDApOwp9LCB7IHZhbHVlOiAnJ30pOwp0ZXN0VmltKCcuX2luc2VydF9vX3JlcGVhdCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBoZWxwZXJzLmRvS2V5cygnbycpOwogIGNtLnJlcGxhY2VSYW5nZSgneicsIGNtLmdldEN1cnNvcigpKTsKICBoZWxwZXJzLmRvSW5zZXJ0TW9kZUtleXMoJ0VzYycpOwogIGNtLnNldEN1cnNvcigxLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnMicsICcuJyk7CiAgZXEoJ1xuelxuelxueicsIGNtLmdldFZhbHVlKCkpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMywgMCk7Cn0sIHsgdmFsdWU6ICcnfSk7CnRlc3RWaW0oJy5faW5zZXJ0X29faW5kZW50JywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGhlbHBlcnMuZG9LZXlzKCdvJyk7CiAgY20ucmVwbGFjZVJhbmdlKCd6JywgY20uZ2V0Q3Vyc29yKCkpOwogIGhlbHBlcnMuZG9JbnNlcnRNb2RlS2V5cygnRXNjJyk7CiAgY20uc2V0Q3Vyc29yKDEsIDIpOwogIGhlbHBlcnMuZG9LZXlzKCcuJyk7CiAgZXEoJ3tcbiAgelxuICB6JywgY20uZ2V0VmFsdWUoKSk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgyLCAyKTsKfSwgeyB2YWx1ZTogJ3snfSk7CnRlc3RWaW0oJy5faW5zZXJ0X2N3JywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGhlbHBlcnMuZG9LZXlzKCdjJywgJ3cnKTsKICBjbS5yZXBsYWNlUmFuZ2UoJ3Rlc3QnLCBjbS5nZXRDdXJzb3IoKSk7CiAgaGVscGVycy5kb0luc2VydE1vZGVLZXlzKCdFc2MnKTsKICBjbS5zZXRDdXJzb3IoMCwgMyk7CiAgaGVscGVycy5kb0tleXMoJzInLCAnbCcpOwogIGhlbHBlcnMuZG9LZXlzKCcuJyk7CiAgZXEoJ3Rlc3QgdGVzdCB3b3JkMycsIGNtLmdldFZhbHVlKCkpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgOCk7Cn0sIHsgdmFsdWU6ICd3b3JkMSB3b3JkMiB3b3JkMycgfSk7CnRlc3RWaW0oJy5faW5zZXJ0X2N3X3JlcGVhdCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICAvLyBGb3Igc29tZSByZWFzb24sIHJlcGVhdCBjdyBpbiBkZXNrdG9wIFZJTSB3aWxsIGRvZXMgbm90IHJlcGVhdCBpbnNlcnQgbW9kZQogIC8vIGNoYW5nZXMuIFdpbGwgY29uZm9ybSB0byB0aGF0IGJlaGF2aW9yLgogIGhlbHBlcnMuZG9LZXlzKCdjJywgJ3cnKTsKICBjbS5yZXBsYWNlUmFuZ2UoJ3Rlc3QnLCBjbS5nZXRDdXJzb3IoKSk7CiAgaGVscGVycy5kb0luc2VydE1vZGVLZXlzKCdFc2MnKTsKICBjbS5zZXRDdXJzb3IoMCwgNCk7CiAgaGVscGVycy5kb0tleXMoJ2wnKTsKICBoZWxwZXJzLmRvS2V5cygnMicsICcuJyk7CiAgZXEoJ3Rlc3QgdGVzdCcsIGNtLmdldFZhbHVlKCkpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgOCk7Cn0sIHsgdmFsdWU6ICd3b3JkMSB3b3JkMiB3b3JkMycgfSk7CnRlc3RWaW0oJy5fZGVsZXRlJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCA1KTsKICBoZWxwZXJzLmRvS2V5cygnaScpOwogIGhlbHBlcnMuZG9JbnNlcnRNb2RlS2V5cygnQmFja3NwYWNlJywgJ0VzYycpOwogIGhlbHBlcnMuZG9LZXlzKCcuJyk7CiAgZXEoJ3phY2UnLCBjbS5nZXRWYWx1ZSgpKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDEpOwp9LCB7IHZhbHVlOiAnemFiY2RlJ30pOwp0ZXN0VmltKCcuX2RlbGV0ZV9yZXBlYXQnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDYpOwogIGhlbHBlcnMuZG9LZXlzKCdpJyk7CiAgaGVscGVycy5kb0luc2VydE1vZGVLZXlzKCdCYWNrc3BhY2UnLCAnRXNjJyk7CiAgaGVscGVycy5kb0tleXMoJzInLCAnLicpOwogIGVxKCd6emNlJywgY20uZ2V0VmFsdWUoKSk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCAxKTsKfSwgeyB2YWx1ZTogJ3p6YWJjZGUnfSk7CnRlc3RWaW0oJy5fdmlzdWFsXz4nLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDApOwogIGhlbHBlcnMuZG9LZXlzKCdWJywgJ2onLCAnPicpOwogIGNtLnNldEN1cnNvcigyLCAwKQogIGhlbHBlcnMuZG9LZXlzKCcuJyk7CiAgZXEoJyAgMVxuICAyXG4gIDNcbiAgNCcsIGNtLmdldFZhbHVlKCkpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMiwgMik7Cn0sIHsgdmFsdWU6ICcxXG4yXG4zXG40J30pOwp0ZXN0VmltKCdmOycsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJ2YnLCAneCcpOwogIGhlbHBlcnMuZG9LZXlzKCc7Jyk7CiAgaGVscGVycy5kb0tleXMoJzInLCAnOycpOwogIGVxKDksIGNtLmdldEN1cnNvcigpLmNoKTsKfSwgeyB2YWx1ZTogJzAxeDN4eDY3OHgnfSk7CnRlc3RWaW0oJ0Y7JywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCA4KTsKICBoZWxwZXJzLmRvS2V5cygnRicsICd4Jyk7CiAgaGVscGVycy5kb0tleXMoJzsnKTsKICBoZWxwZXJzLmRvS2V5cygnMicsICc7Jyk7CiAgZXEoMiwgY20uZ2V0Q3Vyc29yKCkuY2gpOwp9LCB7IHZhbHVlOiAnMDF4M3h4Nng4eCd9KTsKdGVzdFZpbSgndDsnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDApOwogIGhlbHBlcnMuZG9LZXlzKCd0JywgJ3gnKTsKICBoZWxwZXJzLmRvS2V5cygnOycpOwogIGhlbHBlcnMuZG9LZXlzKCcyJywgJzsnKTsKICBlcSg4LCBjbS5nZXRDdXJzb3IoKS5jaCk7Cn0sIHsgdmFsdWU6ICcwMXgzeHg2Nzh4J30pOwp0ZXN0VmltKCdUOycsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgOSk7CiAgaGVscGVycy5kb0tleXMoJ1QnLCAneCcpOwogIGhlbHBlcnMuZG9LZXlzKCc7Jyk7CiAgaGVscGVycy5kb0tleXMoJzInLCAnOycpOwogIGVxKDIsIGNtLmdldEN1cnNvcigpLmNoKTsKfSwgeyB2YWx1ZTogJzB4eDN4eDY3OHgnfSk7CnRlc3RWaW0oJ2YsJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCA2KTsKICBoZWxwZXJzLmRvS2V5cygnZicsICd4Jyk7CiAgaGVscGVycy5kb0tleXMoJywnKTsKICBoZWxwZXJzLmRvS2V5cygnMicsICcsJyk7CiAgZXEoMiwgY20uZ2V0Q3Vyc29yKCkuY2gpOwp9LCB7IHZhbHVlOiAnMDF4M3h4Njc4eCd9KTsKdGVzdFZpbSgnRiwnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDMpOwogIGhlbHBlcnMuZG9LZXlzKCdGJywgJ3gnKTsKICBoZWxwZXJzLmRvS2V5cygnLCcpOwogIGhlbHBlcnMuZG9LZXlzKCcyJywgJywnKTsKICBlcSg5LCBjbS5nZXRDdXJzb3IoKS5jaCk7Cn0sIHsgdmFsdWU6ICcwMXgzeHg2Nzh4J30pOwp0ZXN0VmltKCd0LCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgNik7CiAgaGVscGVycy5kb0tleXMoJ3QnLCAneCcpOwogIGhlbHBlcnMuZG9LZXlzKCcsJyk7CiAgaGVscGVycy5kb0tleXMoJzInLCAnLCcpOwogIGVxKDMsIGNtLmdldEN1cnNvcigpLmNoKTsKfSwgeyB2YWx1ZTogJzAxeDN4eDY3OHgnfSk7CnRlc3RWaW0oJ1QsJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCA0KTsKICBoZWxwZXJzLmRvS2V5cygnVCcsICd4Jyk7CiAgaGVscGVycy5kb0tleXMoJywnKTsKICBoZWxwZXJzLmRvS2V5cygnMicsICcsJyk7CiAgZXEoOCwgY20uZ2V0Q3Vyc29yKCkuY2gpOwp9LCB7IHZhbHVlOiAnMDF4M3h4Njd4eCd9KTsKdGVzdFZpbSgnZmQsOycsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJ2YnLCAnNCcpOwogIGNtLnNldEN1cnNvcigwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnZCcsICc7Jyk7CiAgZXEoJzU2Nzg5JywgY20uZ2V0VmFsdWUoKSk7CiAgaGVscGVycy5kb0tleXMoJ3UnKTsKICBjbS5zZXRDdXJzb3IoMCwgOSk7CiAgaGVscGVycy5kb0tleXMoJ2QnLCAnLCcpOwogIGVxKCcwMTIzOScsIGNtLmdldFZhbHVlKCkpOwp9LCB7IHZhbHVlOiAnMDEyMzQ1Njc4OSd9KTsKdGVzdFZpbSgnRmQsOycsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgOSk7CiAgaGVscGVycy5kb0tleXMoJ0YnLCAnNCcpOwogIGNtLnNldEN1cnNvcigwLCA5KTsKICBoZWxwZXJzLmRvS2V5cygnZCcsICc7Jyk7CiAgZXEoJzAxMjM5JywgY20uZ2V0VmFsdWUoKSk7CiAgaGVscGVycy5kb0tleXMoJ3UnKTsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJ2QnLCAnLCcpOwogIGVxKCc1Njc4OScsIGNtLmdldFZhbHVlKCkpOwp9LCB7IHZhbHVlOiAnMDEyMzQ1Njc4OSd9KTsKdGVzdFZpbSgndGQsOycsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJ3QnLCAnNCcpOwogIGNtLnNldEN1cnNvcigwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnZCcsICc7Jyk7CiAgZXEoJzQ1Njc4OScsIGNtLmdldFZhbHVlKCkpOwogIGhlbHBlcnMuZG9LZXlzKCd1Jyk7CiAgY20uc2V0Q3Vyc29yKDAsIDkpOwogIGhlbHBlcnMuZG9LZXlzKCdkJywgJywnKTsKICBlcSgnMDEyMzQ5JywgY20uZ2V0VmFsdWUoKSk7Cn0sIHsgdmFsdWU6ICcwMTIzNDU2Nzg5J30pOwp0ZXN0VmltKCdUZCw7JywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCA5KTsKICBoZWxwZXJzLmRvS2V5cygnVCcsICc0Jyk7CiAgY20uc2V0Q3Vyc29yKDAsIDkpOwogIGhlbHBlcnMuZG9LZXlzKCdkJywgJzsnKTsKICBlcSgnMDEyMzQ5JywgY20uZ2V0VmFsdWUoKSk7CiAgaGVscGVycy5kb0tleXMoJ3UnKTsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJ2QnLCAnLCcpOwogIGVxKCc0NTY3ODknLCBjbS5nZXRWYWx1ZSgpKTsKfSwgeyB2YWx1ZTogJzAxMjM0NTY3ODknfSk7CnRlc3RWaW0oJ2ZjLDsnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDApOwogIGhlbHBlcnMuZG9LZXlzKCdmJywgJzQnKTsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJ2MnLCAnOycsICdFc2MnKTsKICBlcSgnNTY3ODknLCBjbS5nZXRWYWx1ZSgpKTsKICBoZWxwZXJzLmRvS2V5cygndScpOwogIGNtLnNldEN1cnNvcigwLCA5KTsKICBoZWxwZXJzLmRvS2V5cygnYycsICcsJyk7CiAgZXEoJzAxMjM5JywgY20uZ2V0VmFsdWUoKSk7Cn0sIHsgdmFsdWU6ICcwMTIzNDU2Nzg5J30pOwp0ZXN0VmltKCdGYyw7JywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCA5KTsKICBoZWxwZXJzLmRvS2V5cygnRicsICc0Jyk7CiAgY20uc2V0Q3Vyc29yKDAsIDkpOwogIGhlbHBlcnMuZG9LZXlzKCdjJywgJzsnLCAnRXNjJyk7CiAgZXEoJzAxMjM5JywgY20uZ2V0VmFsdWUoKSk7CiAgaGVscGVycy5kb0tleXMoJ3UnKTsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJ2MnLCAnLCcpOwogIGVxKCc1Njc4OScsIGNtLmdldFZhbHVlKCkpOwp9LCB7IHZhbHVlOiAnMDEyMzQ1Njc4OSd9KTsKdGVzdFZpbSgndGMsOycsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJ3QnLCAnNCcpOwogIGNtLnNldEN1cnNvcigwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnYycsICc7JywgJ0VzYycpOwogIGVxKCc0NTY3ODknLCBjbS5nZXRWYWx1ZSgpKTsKICBoZWxwZXJzLmRvS2V5cygndScpOwogIGNtLnNldEN1cnNvcigwLCA5KTsKICBoZWxwZXJzLmRvS2V5cygnYycsICcsJyk7CiAgZXEoJzAxMjM0OScsIGNtLmdldFZhbHVlKCkpOwp9LCB7IHZhbHVlOiAnMDEyMzQ1Njc4OSd9KTsKdGVzdFZpbSgnVGMsOycsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgOSk7CiAgaGVscGVycy5kb0tleXMoJ1QnLCAnNCcpOwogIGNtLnNldEN1cnNvcigwLCA5KTsKICBoZWxwZXJzLmRvS2V5cygnYycsICc7JywgJ0VzYycpOwogIGVxKCcwMTIzNDknLCBjbS5nZXRWYWx1ZSgpKTsKICBoZWxwZXJzLmRvS2V5cygndScpOwogIGNtLnNldEN1cnNvcigwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnYycsICcsJyk7CiAgZXEoJzQ1Njc4OScsIGNtLmdldFZhbHVlKCkpOwp9LCB7IHZhbHVlOiAnMDEyMzQ1Njc4OSd9KTsKdGVzdFZpbSgnZnksOycsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJ2YnLCAnNCcpOwogIGNtLnNldEN1cnNvcigwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygneScsICc7JywgJ1AnKTsKICBlcSgnMDEyMzQwMTIzNDU2Nzg5JywgY20uZ2V0VmFsdWUoKSk7CiAgaGVscGVycy5kb0tleXMoJ3UnKTsKICBjbS5zZXRDdXJzb3IoMCwgOSk7CiAgaGVscGVycy5kb0tleXMoJ3knLCAnLCcsICdQJyk7CiAgZXEoJzAxMjM0NTY3ODQ1Njc4OScsIGNtLmdldFZhbHVlKCkpOwp9LCB7IHZhbHVlOiAnMDEyMzQ1Njc4OSd9KTsKdGVzdFZpbSgnRnksOycsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgOSk7CiAgaGVscGVycy5kb0tleXMoJ0YnLCAnNCcpOwogIGNtLnNldEN1cnNvcigwLCA5KTsKICBoZWxwZXJzLmRvS2V5cygneScsICc7JywgJ3AnKTsKICBlcSgnMDEyMzQ1Njc4OTQ1Njc4JywgY20uZ2V0VmFsdWUoKSk7CiAgaGVscGVycy5kb0tleXMoJ3UnKTsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJ3knLCAnLCcsICdQJyk7CiAgZXEoJzAxMjM0MDEyMzQ1Njc4OScsIGNtLmdldFZhbHVlKCkpOwp9LCB7IHZhbHVlOiAnMDEyMzQ1Njc4OSd9KTsKdGVzdFZpbSgndHksOycsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJ3QnLCAnNCcpOwogIGNtLnNldEN1cnNvcigwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygneScsICc7JywgJ1AnKTsKICBlcSgnMDEyMzAxMjM0NTY3ODknLCBjbS5nZXRWYWx1ZSgpKTsKICBoZWxwZXJzLmRvS2V5cygndScpOwogIGNtLnNldEN1cnNvcigwLCA5KTsKICBoZWxwZXJzLmRvS2V5cygneScsICcsJywgJ3AnKTsKICBlcSgnMDEyMzQ1Njc4OTU2NzgnLCBjbS5nZXRWYWx1ZSgpKTsKfSwgeyB2YWx1ZTogJzAxMjM0NTY3ODknfSk7CnRlc3RWaW0oJ1R5LDsnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDkpOwogIGhlbHBlcnMuZG9LZXlzKCdUJywgJzQnKTsKICBjbS5zZXRDdXJzb3IoMCwgOSk7CiAgaGVscGVycy5kb0tleXMoJ3knLCAnOycsICdwJyk7CiAgZXEoJzAxMjM0NTY3ODk1Njc4JywgY20uZ2V0VmFsdWUoKSk7CiAgaGVscGVycy5kb0tleXMoJ3UnKTsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJ3knLCAnLCcsICdQJyk7CiAgZXEoJzAxMjMwMTIzNDU2Nzg5JywgY20uZ2V0VmFsdWUoKSk7Cn0sIHsgdmFsdWU6ICcwMTIzNDU2Nzg5J30pOwp0ZXN0VmltKCdITUwnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgdmFyIGxpbmVzID0gMzU7CiAgdmFyIHRleHRIZWlnaHQgPSBjbS5kZWZhdWx0VGV4dEhlaWdodCgpOwogIGNtLnNldFNpemUoNjAwLCBsaW5lcyp0ZXh0SGVpZ2h0KTsKICBjbS5zZXRDdXJzb3IoMTIwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnSCcpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoODYsIDIpOwogIGhlbHBlcnMuZG9LZXlzKCdMJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgxMjAsIDQpOwogIGhlbHBlcnMuZG9LZXlzKCdNJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgxMDMsNCk7Cn0sIHsgdmFsdWU6IChmdW5jdGlvbigpewogIHZhciBsaW5lcyA9IG5ldyBBcnJheSgxMDApOwogIHZhciB1cHBlciA9ICcgIHh4XG4nOwogIHZhciBsb3dlciA9ICcgICAgeHhcbic7CiAgdXBwZXIgPSBsaW5lcy5qb2luKHVwcGVyKTsKICBsb3dlciA9IGxpbmVzLmpvaW4obG93ZXIpOwogIHJldHVybiB1cHBlciArIGxvd2VyOwp9KSgpfSk7Cgp2YXIgelZhbHMgPSBbXTsKZm9yRWFjaChbJ3piJywnenonLCd6dCcsJ3otJywnei4nLCd6PENSPiddLCBmdW5jdGlvbihlLCBpZHgpewogIHZhciBsaW5lTnVtID0gMjUwOwogIHZhciBsaW5lcyA9IDM1OwogIHRlc3RWaW0oZSwgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogICAgdmFyIGsxID0gZVswXTsKICAgIHZhciBrMiA9IGUuc3Vic3RyaW5nKDEpOwogICAgdmFyIHRleHRIZWlnaHQgPSBjbS5kZWZhdWx0VGV4dEhlaWdodCgpOwogICAgY20uc2V0U2l6ZSg2MDAsIGxpbmVzKnRleHRIZWlnaHQpOwogICAgY20uc2V0Q3Vyc29yKGxpbmVOdW0sIDApOwogICAgaGVscGVycy5kb0tleXMoazEsIGsyKTsKICAgIHpWYWxzW2lkeF0gPSBjbS5nZXRTY3JvbGxJbmZvKCkudG9wOwogIH0sIHsgdmFsdWU6IChmdW5jdGlvbigpewogICAgcmV0dXJuIG5ldyBBcnJheSg1MDApLmpvaW4oJ1xuJyk7CiAgfSkoKX0pOwp9KTsKdGVzdFZpbSgnemI8enonLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKXsKICBlcSh6VmFsc1swXTx6VmFsc1sxXSwgdHJ1ZSk7Cn0pOwp0ZXN0VmltKCd6ejx6dCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpewogIGVxKHpWYWxzWzFdPHpWYWxzWzJdLCB0cnVlKTsKfSk7CnRlc3RWaW0oJ3piPT16LScsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpewogIGVxKHpWYWxzWzBdLCB6VmFsc1szXSk7Cn0pOwp0ZXN0VmltKCd6ej09ei4nLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKXsKICBlcSh6VmFsc1sxXSwgelZhbHNbNF0pOwp9KTsKdGVzdFZpbSgnenQ9PXo8Q1I+JywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycyl7CiAgZXEoelZhbHNbMl0sIHpWYWxzWzVdKTsKfSk7Cgp2YXIgbW92ZVRpbGxDaGFyYWN0ZXJTYW5kYm94ID0KICAnVGhlIHF1aWNrIGJyb3duIGZveCBcbicKICAnanVtcGVkIG92ZXIgdGhlIGxhenkgZG9nLicKdGVzdFZpbSgnbW92ZVRpbGxDaGFyYWN0ZXInLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKXsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgLy8gU2VhcmNoIGZvciB0aGUgJ3EnLgogIGNtLm9wZW5EaWFsb2cgPSBoZWxwZXJzLmZha2VPcGVuRGlhbG9nKCdxJyk7CiAgaGVscGVycy5kb0tleXMoJy8nKTsKICBlcSg0LCBjbS5nZXRDdXJzb3IoKS5jaCk7CiAgLy8gSnVtcCB0byBqdXN0IGJlZm9yZSB0aGUgZmlyc3QgbyBpbiB0aGUgbGlzdC4KICBoZWxwZXJzLmRvS2V5cygndCcpOwogIGhlbHBlcnMuZG9LZXlzKCdvJyk7CiAgZXEoJ1RoZSBxdWljayBicm93biBmb3ggXG4nLCBjbS5nZXRWYWx1ZSgpKTsKICAvLyBEZWxldGUgdGhhdCBvbmUgY2hhcmFjdGVyLgogIGhlbHBlcnMuZG9LZXlzKCdkJyk7CiAgaGVscGVycy5kb0tleXMoJ3QnKTsKICBoZWxwZXJzLmRvS2V5cygnbycpOwogIGVxKCdUaGUgcXVpY2sgYm93biBmb3ggXG4nLCBjbS5nZXRWYWx1ZSgpKTsKICAvLyBEZWxldGUgZXZlcnl0aGluZyB1bnRpbCB0aGUgbmV4dCAnbycuCiAgaGVscGVycy5kb0tleXMoJy4nKTsKICBlcSgnVGhlIHF1aWNrIGJveCBcbicsIGNtLmdldFZhbHVlKCkpOwogIC8vIEFuIHVubWF0Y2hlZCBjaGFyYWN0ZXIgc2hvdWxkIGhhdmUgbm8gZWZmZWN0LgogIGhlbHBlcnMuZG9LZXlzKCdkJyk7CiAgaGVscGVycy5kb0tleXMoJ3QnKTsKICBoZWxwZXJzLmRvS2V5cygncScpOwogIGVxKCdUaGUgcXVpY2sgYm94IFxuJywgY20uZ2V0VmFsdWUoKSk7CiAgLy8gTWF0Y2hlcyBzaG91bGQgb25seSBiZSBwb3NzaWJsZSBvbiBzaW5nbGUgbGluZXMuCiAgaGVscGVycy5kb0tleXMoJ2QnKTsKICBoZWxwZXJzLmRvS2V5cygndCcpOwogIGhlbHBlcnMuZG9LZXlzKCd6Jyk7CiAgZXEoJ1RoZSBxdWljayBib3ggXG4nLCBjbS5nZXRWYWx1ZSgpKTsKICAvLyBBZnRlciBhbGwgdGhhdCwgdGhlIHNlYXJjaCBmb3IgJ3EnIHNob3VsZCBzdGlsbCBiZSBhY3RpdmUsIHNvIHRoZSAnTicgY29tbWFuZAogIC8vIGNhbiBydW4gaXQgYWdhaW4gaW4gcmV2ZXJzZS4gVXNlIHRoYXQgdG8gZGVsZXRlIGV2ZXJ5dGhpbmcgYmFjayB0byB0aGUgJ3EnLgogIGhlbHBlcnMuZG9LZXlzKCdkJyk7CiAgaGVscGVycy5kb0tleXMoJ04nKTsKICBlcSgnVGhlIG94IFxuJywgY20uZ2V0VmFsdWUoKSk7CiAgZXEoNCwgY20uZ2V0Q3Vyc29yKCkuY2gpOwp9LCB7IHZhbHVlOiBtb3ZlVGlsbENoYXJhY3RlclNhbmRib3h9KTsKdGVzdFZpbSgnc2VhcmNoRm9yUGlwZScsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpewogIENvZGVNaXJyb3IuVmltLnNldE9wdGlvbigncGNyZScsIGZhbHNlKTsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgLy8gU2VhcmNoIGZvciB0aGUgJ3wnLgogIGNtLm9wZW5EaWFsb2cgPSBoZWxwZXJzLmZha2VPcGVuRGlhbG9nKCd8Jyk7CiAgaGVscGVycy5kb0tleXMoJy8nKTsKICBlcSg0LCBjbS5nZXRDdXJzb3IoKS5jaCk7Cn0sIHsgdmFsdWU6ICd0aGlzfHRoYXQnfSk7CgoKdmFyIHNjcm9sbE1vdGlvblNhbmRib3ggPQogICdcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4nCiAgJ1xuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbicKICAnXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuJwogICdcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG4nOwp0ZXN0VmltKCdzY3JvbGxNb3Rpb24nLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKXsKICB2YXIgcHJldkN1cnNvciwgcHJldlNjcm9sbEluZm87CiAgY20uc2V0Q3Vyc29yKDAsIDApOwogIC8vIGN0cmwteSBhdCB0aGUgdG9wIG9mIHRoZSBmaWxlIHNob3VsZCBoYXZlIG5vIGVmZmVjdC4KICBoZWxwZXJzLmRvS2V5cygnPEMteT4nKTsKICBlcSgwLCBjbS5nZXRDdXJzb3IoKS5saW5lKTsKICBwcmV2U2Nyb2xsSW5mbyA9IGNtLmdldFNjcm9sbEluZm8oKTsKICBoZWxwZXJzLmRvS2V5cygnPEMtZT4nKTsKICBlcSgxLCBjbS5nZXRDdXJzb3IoKS5saW5lKTsKICBpcyhwcmV2U2Nyb2xsSW5mby50b3AgPCBjbS5nZXRTY3JvbGxJbmZvKCkudG9wKTsKICAvLyBKdW1wIHRvIHRoZSBlbmQgb2YgdGhlIHNhbmRib3guCiAgY20uc2V0Q3Vyc29yKDEwMDAsIDApOwogIHByZXZDdXJzb3IgPSBjbS5nZXRDdXJzb3IoKTsKICAvLyBjdHJsLWUgYXQgdGhlIGJvdHRvbSBvZiB0aGUgZmlsZSBzaG91bGQgaGF2ZSBubyBlZmZlY3QuCiAgaGVscGVycy5kb0tleXMoJzxDLWU+Jyk7CiAgZXEocHJldkN1cnNvci5saW5lLCBjbS5nZXRDdXJzb3IoKS5saW5lKTsKICBwcmV2U2Nyb2xsSW5mbyA9IGNtLmdldFNjcm9sbEluZm8oKTsKICBoZWxwZXJzLmRvS2V5cygnPEMteT4nKTsKICBlcShwcmV2Q3Vyc29yLmxpbmUgLSAxLCBjbS5nZXRDdXJzb3IoKS5saW5lKTsKICBpcyhwcmV2U2Nyb2xsSW5mby50b3AgPiBjbS5nZXRTY3JvbGxJbmZvKCkudG9wKTsKfSwgeyB2YWx1ZTogc2Nyb2xsTW90aW9uU2FuZGJveH0pOwoKdmFyIHNxdWFyZUJyYWNrZXRNb3Rpb25TYW5kYm94ID0gJycrCiAgJyh7XG4nKy8vMAogICcgICh7XG4nKy8vMTEKICAnICAvKmNvbW1lbnQge1xuJysvLzIKICAnICAgICAgICAgICAgKi8oXG4nKy8vMwogICcjZWxzZSAgICAgICAgICAgICAgICBcbicrLy80CiAgJyAgLyogICAgICAgKVxuJysvLzUKICAnI2lmICAgICAgICB9XG4nKy8vNgogICcgICl9Ki9cbicrLy83CiAgJyl9XG4nKy8vOAogICd7fVxuJysvLzkKICAnI2Vsc2Uge3tcbicrLy8xMAogICd7fVxuJysvLzExCiAgJ31cbicrLy8xMgogICd7XG4nKy8vMTMKICAnI2VuZGlmXG4nKy8vMTQKICAnfVxuJysvLzE1CiAgJ31cbicrLy8xNgogICcjZWxzZSc7Ly8xNwp0ZXN0VmltKCdbWywgXV0nLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDApOwogIGhlbHBlcnMuZG9LZXlzKCddJywgJ10nKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDksMCk7CiAgaGVscGVycy5kb0tleXMoJzInLCAnXScsICddJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgxMywwKTsKICBoZWxwZXJzLmRvS2V5cygnXScsICddJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgxNywwKTsKICBoZWxwZXJzLmRvS2V5cygnWycsICdbJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgxMywwKTsKICBoZWxwZXJzLmRvS2V5cygnMicsICdbJywgJ1snKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDksMCk7CiAgaGVscGVycy5kb0tleXMoJ1snLCAnWycpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwwKTsKfSwgeyB2YWx1ZTogc3F1YXJlQnJhY2tldE1vdGlvblNhbmRib3h9KTsKdGVzdFZpbSgnW10sIF1bJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnXScsICdbJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgxMiwwKTsKICBoZWxwZXJzLmRvS2V5cygnMicsICddJywgJ1snKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDE2LDApOwogIGhlbHBlcnMuZG9LZXlzKCddJywgJ1snKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDE3LDApOwogIGhlbHBlcnMuZG9LZXlzKCdbJywgJ10nKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDE2LDApOwogIGhlbHBlcnMuZG9LZXlzKCcyJywgJ1snLCAnXScpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMTIsMCk7CiAgaGVscGVycy5kb0tleXMoJ1snLCAnXScpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwwKTsKfSwgeyB2YWx1ZTogc3F1YXJlQnJhY2tldE1vdGlvblNhbmRib3h9KTsKdGVzdFZpbSgnW3ssIF19JywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcig0LCAxMCk7CiAgaGVscGVycy5kb0tleXMoJ1snLCAneycpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMiwxMik7CiAgaGVscGVycy5kb0tleXMoJzInLCAnWycsICd7Jyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLDEpOwogIGNtLnNldEN1cnNvcig0LCAxMCk7CiAgaGVscGVycy5kb0tleXMoJ10nLCAnfScpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoNiwxMSk7CiAgaGVscGVycy5kb0tleXMoJzInLCAnXScsICd9Jyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCg4LDEpOwogIGNtLnNldEN1cnNvcigwLDEpOwogIGhlbHBlcnMuZG9LZXlzKCddJywgJ30nKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDgsMSk7CiAgaGVscGVycy5kb0tleXMoJ1snLCAneycpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwxKTsKfSwgeyB2YWx1ZTogc3F1YXJlQnJhY2tldE1vdGlvblNhbmRib3h9KTsKdGVzdFZpbSgnWygsIF0pJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcig0LCAxMCk7CiAgaGVscGVycy5kb0tleXMoJ1snLCAnKCcpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMywxNCk7CiAgaGVscGVycy5kb0tleXMoJzInLCAnWycsICcoJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLDApOwogIGNtLnNldEN1cnNvcig0LCAxMCk7CiAgaGVscGVycy5kb0tleXMoJ10nLCAnKScpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoNSwxMSk7CiAgaGVscGVycy5kb0tleXMoJzInLCAnXScsICcpJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCg4LDApOwogIGhlbHBlcnMuZG9LZXlzKCdbJywgJygnKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsMCk7CiAgaGVscGVycy5kb0tleXMoJ10nLCAnKScpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoOCwwKTsKfSwgeyB2YWx1ZTogc3F1YXJlQnJhY2tldE1vdGlvblNhbmRib3h9KTsKdGVzdFZpbSgnWyosIF0qLCBbLywgXS8nLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgZm9yRWFjaChbJyonLCAnLyddLCBmdW5jdGlvbihrZXkpewogICAgY20uc2V0Q3Vyc29yKDcsIDApOwogICAgaGVscGVycy5kb0tleXMoJzInLCAnWycsIGtleSk7CiAgICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDIsMik7CiAgICBoZWxwZXJzLmRvS2V5cygnMicsICddJywga2V5KTsKICAgIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoNyw1KTsKICB9KTsKfSwgeyB2YWx1ZTogc3F1YXJlQnJhY2tldE1vdGlvblNhbmRib3h9KTsKdGVzdFZpbSgnWyMsIF0jJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigxMCwgMyk7CiAgaGVscGVycy5kb0tleXMoJzInLCAnWycsICcjJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCg0LDApOwogIGhlbHBlcnMuZG9LZXlzKCc1JywgJ10nLCAnIycpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMTcsMCk7CiAgY20uc2V0Q3Vyc29yKDEwLCAzKTsKICBoZWxwZXJzLmRvS2V5cygnXScsICcjJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgxNCwwKTsKfSwgeyB2YWx1ZTogc3F1YXJlQnJhY2tldE1vdGlvblNhbmRib3h9KTsKdGVzdFZpbSgnW20sIF1tLCBbTSwgXU0nLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDExLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnWycsICdtJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgxMCw3KTsKICBoZWxwZXJzLmRvS2V5cygnNCcsICdbJywgJ20nKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDEsMyk7CiAgaGVscGVycy5kb0tleXMoJzUnLCAnXScsICdtJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgxMSwwKTsKICBoZWxwZXJzLmRvS2V5cygnWycsICdNJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCg5LDEpOwogIGhlbHBlcnMuZG9LZXlzKCczJywgJ10nLCAnTScpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMTUsMCk7CiAgaGVscGVycy5kb0tleXMoJzUnLCAnWycsICdNJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCg3LDMpOwp9LCB7IHZhbHVlOiBzcXVhcmVCcmFja2V0TW90aW9uU2FuZGJveH0pOwoKLy8gRXggbW9kZSB0ZXN0cwp0ZXN0VmltKCdleF9nb190b19saW5lJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAwKTsKICBoZWxwZXJzLmRvRXgoJzQnKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDMsIDApOwp9LCB7IHZhbHVlOiAnYVxuYlxuY1xuZFxuZVxuJ30pOwp0ZXN0VmltKCdleF93cml0ZScsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICB2YXIgdG1wID0gQ29kZU1pcnJvci5jb21tYW5kcy5zYXZlOwogIHZhciB3cml0dGVuOwogIHZhciBhY3R1YWxDbTsKICBDb2RlTWlycm9yLmNvbW1hbmRzLnNhdmUgPSBmdW5jdGlvbihjbSkgewogICAgd3JpdHRlbiA9IHRydWU7CiAgICBhY3R1YWxDbSA9IGNtOwogIH07CiAgLy8gVGVzdCB0aGF0IHcsIHdyLCB3cmkgLi4uIHdyaXRlIGFsbCB0cmlnZ2VyIDp3cml0ZS4KICB2YXIgY29tbWFuZCA9ICd3cml0ZSc7CiAgZm9yICh2YXIgaSA9IDE7IGkgPCBjb21tYW5kLmxlbmd0aDsgaSsrKSB7CiAgICB3cml0dGVuID0gZmFsc2U7CiAgICBhY3R1YWxDbSA9IG51bGw7CiAgICBoZWxwZXJzLmRvRXgoY29tbWFuZC5zdWJzdHJpbmcoMCwgaSkpOwogICAgZXEod3JpdHRlbiwgdHJ1ZSk7CiAgICBlcShhY3R1YWxDbSwgY20pOwogIH0KICBDb2RlTWlycm9yLmNvbW1hbmRzLnNhdmUgPSB0bXA7Cn0pOwp0ZXN0VmltKCdleF9zb3J0JywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGhlbHBlcnMuZG9FeCgnc29ydCcpOwogIGVxKCdaXG5hXG5iXG5jXG5kJywgY20uZ2V0VmFsdWUoKSk7Cn0sIHsgdmFsdWU6ICdiXG5aXG5kXG5jXG5hJ30pOwp0ZXN0VmltKCdleF9zb3J0X3JldmVyc2UnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgaGVscGVycy5kb0V4KCdzb3J0IScpOwogIGVxKCdkXG5jXG5iXG5hJywgY20uZ2V0VmFsdWUoKSk7Cn0sIHsgdmFsdWU6ICdiXG5kXG5jXG5hJ30pOwp0ZXN0VmltKCdleF9zb3J0X3JhbmdlJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGhlbHBlcnMuZG9FeCgnMiwzc29ydCcpOwogIGVxKCdiXG5jXG5kXG5hJywgY20uZ2V0VmFsdWUoKSk7Cn0sIHsgdmFsdWU6ICdiXG5kXG5jXG5hJ30pOwp0ZXN0VmltKCdleF9zb3J0X29uZWxpbmUnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgaGVscGVycy5kb0V4KCcyc29ydCcpOwogIC8vIEV4cGVjdCBubyBjaGFuZ2UuCiAgZXEoJ2JcbmRcbmNcbmEnLCBjbS5nZXRWYWx1ZSgpKTsKfSwgeyB2YWx1ZTogJ2JcbmRcbmNcbmEnfSk7CnRlc3RWaW0oJ2V4X3NvcnRfaWdub3JlQ2FzZScsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBoZWxwZXJzLmRvRXgoJ3NvcnQgaScpOwogIGVxKCdhXG5iXG5jXG5kXG5aJywgY20uZ2V0VmFsdWUoKSk7Cn0sIHsgdmFsdWU6ICdiXG5aXG5kXG5jXG5hJ30pOwp0ZXN0VmltKCdleF9zb3J0X3VuaXF1ZScsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBoZWxwZXJzLmRvRXgoJ3NvcnQgdScpOwogIGVxKCdaXG5hXG5iXG5jXG5kJywgY20uZ2V0VmFsdWUoKSk7Cn0sIHsgdmFsdWU6ICdiXG5aXG5hXG5hXG5kXG5hXG5jXG5hJ30pOwp0ZXN0VmltKCdleF9zb3J0X2RlY2ltYWwnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgaGVscGVycy5kb0V4KCdzb3J0IGQnKTsKICBlcSgnZDNcbiBzNVxuNlxuLjknLCBjbS5nZXRWYWx1ZSgpKTsKfSwgeyB2YWx1ZTogJzZcbmQzXG4gczVcbi45J30pOwp0ZXN0VmltKCdleF9zb3J0X2RlY2ltYWxfbmVnYXRpdmUnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgaGVscGVycy5kb0V4KCdzb3J0IGQnKTsKICBlcSgnei05XG5kM1xuIHM1XG42XG4uOScsIGNtLmdldFZhbHVlKCkpOwp9LCB7IHZhbHVlOiAnNlxuZDNcbiBzNVxuLjlcbnotOSd9KTsKdGVzdFZpbSgnZXhfc29ydF9kZWNpbWFsX3JldmVyc2UnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgaGVscGVycy5kb0V4KCdzb3J0ISBkJyk7CiAgZXEoJy45XG42XG4gczVcbmQzJywgY20uZ2V0VmFsdWUoKSk7Cn0sIHsgdmFsdWU6ICc2XG5kM1xuIHM1XG4uOSd9KTsKdGVzdFZpbSgnZXhfc29ydF9oZXgnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgaGVscGVycy5kb0V4KCdzb3J0IHgnKTsKICBlcSgnIHM1XG42XG4uOVxuJjB4QlxuZDMnLCBjbS5nZXRWYWx1ZSgpKTsKfSwgeyB2YWx1ZTogJzZcbmQzXG4gczVcbiYweEJcbi45J30pOwp0ZXN0VmltKCdleF9zb3J0X29jdGFsJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGhlbHBlcnMuZG9FeCgnc29ydCBvJyk7CiAgZXEoJy44XG4uOVxuZDNcbiBzNVxuNicsIGNtLmdldFZhbHVlKCkpOwp9LCB7IHZhbHVlOiAnNlxuZDNcbiBzNVxuLjlcbi44J30pOwp0ZXN0VmltKCdleF9zb3J0X2RlY2ltYWxfbWl4ZWQnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgaGVscGVycy5kb0V4KCdzb3J0IGQnKTsKICBlcSgneVxuelxuYzFcbmIyXG5hMycsIGNtLmdldFZhbHVlKCkpOwp9LCB7IHZhbHVlOiAnYTNcbnpcbmMxXG55XG5iMid9KTsKdGVzdFZpbSgnZXhfc29ydF9kZWNpbWFsX21peGVkX3JldmVyc2UnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgaGVscGVycy5kb0V4KCdzb3J0ISBkJyk7CiAgZXEoJ2EzXG5iMlxuYzFcbnpcbnknLCBjbS5nZXRWYWx1ZSgpKTsKfSwgeyB2YWx1ZTogJ2EzXG56XG5jMVxueVxuYjInfSk7Ci8vIHRlc3QgZm9yIDpnbG9iYWwgY29tbWFuZAp0ZXN0VmltKCdleF9nbG9iYWwnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDApOwogIGhlbHBlcnMuZG9FeCgnZy9vbmUvcy8vdHdvJyk7CiAgZXEoJ3R3byB0d29cbiB0d28gdHdvXG4gdHdvIHR3bycsIGNtLmdldFZhbHVlKCkpOwogIGhlbHBlcnMuZG9FeCgnMSwyZy90d28vcy8vb25lJyk7CiAgZXEoJ29uZSBvbmVcbiBvbmUgb25lXG4gdHdvIHR3bycsIGNtLmdldFZhbHVlKCkpOwp9LCB7dmFsdWU6ICdvbmUgb25lXG4gb25lIG9uZVxuIG9uZSBvbmUnfSk7CnRlc3RWaW0oJ2V4X2dsb2JhbF9jb25maXJtJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAwKTsKICB2YXIgb25LZXlEb3duOwogIHZhciBvcGVuRGlhbG9nU2F2ZSA9IGNtLm9wZW5EaWFsb2c7CiAgdmFyIEtFWUNPREVTID0gewogICAgYTogNjUsCiAgICBuOiA3OCwKICAgIHE6IDgxLAogICAgeTogODkKICB9OwogIC8vIEludGVyY2VwdCB0aGUgZXggY29tbWFuZCwgJ2dsb2JhbCcKICBjbS5vcGVuRGlhbG9nID0gZnVuY3Rpb24odGVtcGxhdGUsIGNhbGxiYWNrLCBvcHRpb25zKSB7CiAgICAvLyBJbnRlcmNlcHQgdGhlIHByb21wdCBmb3IgdGhlIGVtYmVkZGVkIGV4IGNvbW1hbmQsICdzdWJzdGl0dXRlJwogICAgY20ub3BlbkRpYWxvZyA9IGZ1bmN0aW9uKHRlbXBsYXRlLCBjYWxsYmFjaywgb3B0aW9ucykgewogICAgICBvbktleURvd24gPSBvcHRpb25zLm9uS2V5RG93bjsKICAgIH07CiAgICBjYWxsYmFjaygnZy9vbmUvcy8vdHdvL2djJyk7CiAgfTsKICBoZWxwZXJzLmRvS2V5cygnOicpOwogIHZhciBjbG9zZSA9IGZ1bmN0aW9uKCkge307CiAgb25LZXlEb3duKHtrZXlDb2RlOiBLRVlDT0RFUy5ufSwgJycsIGNsb3NlKTsKICBvbktleURvd24oe2tleUNvZGU6IEtFWUNPREVTLnl9LCAnJywgY2xvc2UpOwogIG9uS2V5RG93bih7a2V5Q29kZTogS0VZQ09ERVMuYX0sICcnLCBjbG9zZSk7CiAgb25LZXlEb3duKHtrZXlDb2RlOiBLRVlDT0RFUy5xfSwgJycsIGNsb3NlKTsKICBvbktleURvd24oe2tleUNvZGU6IEtFWUNPREVTLnl9LCAnJywgY2xvc2UpOwogIGVxKCdvbmUgdHdvXG4gdHdvIHR3b1xuIG9uZSBvbmVcbiB0d28gb25lXG4gb25lIG9uZScsIGNtLmdldFZhbHVlKCkpOwp9LCB7dmFsdWU6ICdvbmUgb25lXG4gb25lIG9uZVxuIG9uZSBvbmVcbiBvbmUgb25lXG4gb25lIG9uZSd9KTsKLy8gQmFzaWMgc3Vic3RpdHV0ZSB0ZXN0cy4KdGVzdFZpbSgnZXhfc3Vic3RpdHV0ZV9zYW1lX2xpbmUnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDEsIDApOwogIGhlbHBlcnMuZG9FeCgncy9vbmUvdHdvL2cnKTsKICBlcSgnb25lIG9uZVxuIHR3byB0d28nLCBjbS5nZXRWYWx1ZSgpKTsKfSwgeyB2YWx1ZTogJ29uZSBvbmVcbiBvbmUgb25lJ30pOwp0ZXN0VmltKCdleF9zdWJzdGl0dXRlX2Z1bGxfZmlsZScsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMSwgMCk7CiAgaGVscGVycy5kb0V4KCclcy9vbmUvdHdvL2cnKTsKICBlcSgndHdvIHR3b1xuIHR3byB0d28nLCBjbS5nZXRWYWx1ZSgpKTsKfSwgeyB2YWx1ZTogJ29uZSBvbmVcbiBvbmUgb25lJ30pOwp0ZXN0VmltKCdleF9zdWJzdGl0dXRlX2lucHV0X3JhbmdlJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigxLCAwKTsKICBoZWxwZXJzLmRvRXgoJzEsM3MvXFxkLzAvZycpOwogIGVxKCcwXG4wXG4wXG40JywgY20uZ2V0VmFsdWUoKSk7Cn0sIHsgdmFsdWU6ICcxXG4yXG4zXG40JyB9KTsKdGVzdFZpbSgnZXhfc3Vic3RpdHV0ZV92aXN1YWxfcmFuZ2UnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDEsIDApOwogIC8vIFNldCBsYXN0IHZpc3VhbCBtb2RlIHNlbGVjdGlvbiBtYXJrcyAnPCBhbmQgJz4gYXQgbGluZXMgMiBhbmQgNAogIGhlbHBlcnMuZG9LZXlzKCdWJywgJzInLCAnaicsICd2Jyk7CiAgaGVscGVycy5kb0V4KCdcJzwsXCc+cy9cXGQvMC9nJyk7CiAgZXEoJzFcbjBcbjBcbjBcbjUnLCBjbS5nZXRWYWx1ZSgpKTsKfSwgeyB2YWx1ZTogJzFcbjJcbjNcbjRcbjUnIH0pOwp0ZXN0VmltKCdleF9zdWJzdGl0dXRlX2VtcHR5X3F1ZXJ5JywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIC8vIElmIHRoZSBxdWVyeSBpcyBlbXB0eSwgdXNlIGxhc3QgcXVlcnkuCiAgY20uc2V0Q3Vyc29yKDEsIDApOwogIGNtLm9wZW5EaWFsb2cgPSBoZWxwZXJzLmZha2VPcGVuRGlhbG9nKCcxJyk7CiAgaGVscGVycy5kb0tleXMoJy8nKTsKICBoZWxwZXJzLmRvRXgoJ3MvL2IvZycpOwogIGVxKCdhYmIgYWIyIGFiMycsIGNtLmdldFZhbHVlKCkpOwp9LCB7IHZhbHVlOiAnYTExIGExMiBhMTMnIH0pOwp0ZXN0VmltKCdleF9zdWJzdGl0dXRlX2phdmFzY3JpcHQnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgQ29kZU1pcnJvci5WaW0uc2V0T3B0aW9uKCdwY3JlJywgZmFsc2UpOwogIGNtLnNldEN1cnNvcigxLCAwKTsKICAvLyBUaHJvdyBhbGwgdGhlIHRoaW5ncyB0aGF0IGphdmFzY3JpcHQgbGlrZXMgdG8gdHJlYXQgYXMgc3BlY2lhbCB2YWx1ZXMKICAvLyBpbnRvIHRoZSByZXBsYWNlIHBhcnQuIEFsbCBzaG91bGQgYmUgbGl0ZXJhbCAodGhpcyBpcyBWSU0pLgogIGhlbHBlcnMuZG9FeCgncy9cXChcXGQrXFwpLyQkICRcJyAkYCAkJiBcXDEvZycpCiAgZXEoJ2EgJCQgJFwnICRgICQmIDAgYicsIGNtLmdldFZhbHVlKCkpOwp9LCB7IHZhbHVlOiAnYSAwIGInIH0pOwp0ZXN0VmltKCdleF9zdWJzdGl0dXRlX2VtcHR5X2FyZ3VtZW50cycsIGZ1bmN0aW9uKGNtLHZpbSxoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDApOwogIGhlbHBlcnMuZG9FeCgncy9hL2IvZycpOwogIGNtLnNldEN1cnNvcigxLCAwKTsKICBoZWxwZXJzLmRvRXgoJ3MnKTsKICBlcSgnYiBiXG5iIGEnLCBjbS5nZXRWYWx1ZSgpKTsKfSwge3ZhbHVlOiAnYSBhXG5hIGEnfSk7CgovLyBNb3JlIGNvbXBsZXggc3Vic3RpdHV0ZSB0ZXN0cyB0aGF0IHRlc3QgYm90aCBwY3JlIGFuZCBub3BjcmUgb3B0aW9ucy4KZnVuY3Rpb24gdGVzdFN1YnN0aXR1dGUobmFtZSwgb3B0aW9ucykgewogIHRlc3RWaW0obmFtZSArICdfcGNyZScsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICAgIGNtLnNldEN1cnNvcigxLCAwKTsKICAgIENvZGVNaXJyb3IuVmltLnNldE9wdGlvbigncGNyZScsIHRydWUpOwogICAgaGVscGVycy5kb0V4KG9wdGlvbnMuZXhwcik7CiAgICBlcShvcHRpb25zLmV4cGVjdGVkVmFsdWUsIGNtLmdldFZhbHVlKCkpOwogIH0sIG9wdGlvbnMpOwogIC8vIElmIG5vIG5vUGNyZUV4cHIgaXMgZGVmaW5lZCwgYXNzdW1lIHRoYXQgaXQncyB0aGUgc2FtZSBhcyB0aGUgZXhwci4KICB2YXIgbm9QY3JlRXhwciA9IG9wdGlvbnMubm9QY3JlRXhwciA/IG9wdGlvbnMubm9QY3JlRXhwciA6IG9wdGlvbnMuZXhwcjsKICB0ZXN0VmltKG5hbWUgKyAnX25vcGNyZScsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICAgIGNtLnNldEN1cnNvcigxLCAwKTsKICAgIENvZGVNaXJyb3IuVmltLnNldE9wdGlvbigncGNyZScsIGZhbHNlKTsKICAgIGhlbHBlcnMuZG9FeChub1BjcmVFeHByKTsKICAgIGVxKG9wdGlvbnMuZXhwZWN0ZWRWYWx1ZSwgY20uZ2V0VmFsdWUoKSk7CiAgfSwgb3B0aW9ucyk7Cn0KdGVzdFN1YnN0aXR1dGUoJ2V4X3N1YnN0aXR1dGVfY2FwdHVyZScsIHsKICB2YWx1ZTogJ2ExMSBhMTIgYTEzJywKICBleHBlY3RlZFZhbHVlOiAnYTExMTEgYTEyMTIgYTEzMTMnLAogIC8vICRuIGlzIGEgYmFja3JlZmVyZW5jZQogIGV4cHI6ICdzLyhcXGQrKS8kMSQxL2cnLAogIC8vIFxuIGlzIGEgYmFja3JlZmVyZW5jZS4KICBub1BjcmVFeHByOiAncy9cXChcXGQrXFwpL1xcMVxcMS9nJ30pOwp0ZXN0U3Vic3RpdHV0ZSgnZXhfc3Vic3RpdHV0ZV9jYXB0dXJlMicsIHsKICB2YWx1ZTogJ2EgMCBiJywKICBleHBlY3RlZFZhbHVlOiAnYSAkMDAgYicsCiAgZXhwcjogJ3MvKFxcZCspLyQkJDEkMS9nJywKICBub1BjcmVFeHByOiAncy9cXChcXGQrXFwpLyRcXDFcXDEvZyd9KTsKdGVzdFN1YnN0aXR1dGUoJ2V4X3N1YnN0aXR1dGVfbm9jYXB0dXJlJywgewogIHZhbHVlOiAnYTExIGExMiBhMTMnLAogIGV4cGVjdGVkVmFsdWU6ICdhJDEkMSBhJDEkMSBhJDEkMScsCiAgZXhwcjogJ3MvKFxcZCspLyQkMSQkMS9nJywKICBub1BjcmVFeHByOiAncy9cXChcXGQrXFwpLyQxJDEvZyd9KTsKdGVzdFN1YnN0aXR1dGUoJ2V4X3N1YnN0aXR1dGVfbm9jYXB0dXJlMicsIHsKICB2YWx1ZTogJ2EgMCBiJywKICBleHBlY3RlZFZhbHVlOiAnYSAkMTAgYicsCiAgZXhwcjogJ3MvKFxcZCspLyQkMSQxL2cnLAogIG5vUGNyZUV4cHI6ICdzL1xcKFxcZCtcXCkvXFwkMVxcMS9nJ30pOwp0ZXN0U3Vic3RpdHV0ZSgnZXhfc3Vic3RpdHV0ZV9ub2NhcHR1cmUnLCB7CiAgdmFsdWU6ICdhIGIgYycsCiAgZXhwZWN0ZWRWYWx1ZTogJ2EgJCBjJywKICBleHByOiAncy9iLyQkLycsCiAgbm9QY3JlRXhwcjogJ3MvYi8kLyd9KTsKdGVzdFN1YnN0aXR1dGUoJ2V4X3N1YnN0aXR1dGVfc2xhc2hfcmVnZXgnLCB7CiAgdmFsdWU6ICdvbmUvdHdvIFxuIHRocmVlL2ZvdXInLAogIGV4cGVjdGVkVmFsdWU6ICdvbmV8dHdvIFxuIHRocmVlfGZvdXInLAogIGV4cHI6ICclcy9cXC8vfCd9KTsKdGVzdFN1YnN0aXR1dGUoJ2V4X3N1YnN0aXR1dGVfcGlwZV9yZWdleCcsIHsKICB2YWx1ZTogJ29uZXx0d28gXG4gdGhyZWV8Zm91cicsCiAgZXhwZWN0ZWRWYWx1ZTogJ29uZSx0d28gXG4gdGhyZWUsZm91cicsCiAgZXhwcjogJyVzL1xcfC8sLycsCiAgbm9QY3JlRXhwcjogJyVzL3wvLC8nfSk7CnRlc3RTdWJzdGl0dXRlKCdleF9zdWJzdGl0dXRlX29yX3JlZ2V4JywgewogIHZhbHVlOiAnb25lfHR3byBcbiB0aHJlZXxmb3VyJywKICBleHBlY3RlZFZhbHVlOiAnYW5hfHR3YSBcbiB0aHJhYXxmYWFyJywKICBleHByOiAnJXMvb3xlfHUvYS9nJywKICBub1BjcmVFeHByOiAnJXMvb1xcfGVcXHx1L2EvZyd9KTsKdGVzdFN1YnN0aXR1dGUoJ2V4X3N1YnN0aXR1dGVfb3Jfd29yZF9yZWdleCcsIHsKICB2YWx1ZTogJ29uZXx0d28gXG4gdGhyZWV8Zm91cicsCiAgZXhwZWN0ZWRWYWx1ZTogJ2ZpdmV8Zml2ZSBcbiB0aHJlZXxmb3VyJywKICBleHByOiAnJXMvKG9uZXx0d28pL2ZpdmUvZycsCiAgbm9QY3JlRXhwcjogJyVzL1xcKG9uZVxcfHR3b1xcKS9maXZlL2cnfSk7CnRlc3RTdWJzdGl0dXRlKCdleF9zdWJzdGl0dXRlX2JhY2tzbGFzaHNsYXNoX3JlZ2V4JywgewogIHZhbHVlOiAnb25lXFx0d28gXG4gdGhyZWVcXGZvdXInLAogIGV4cGVjdGVkVmFsdWU6ICdvbmUsdHdvIFxuIHRocmVlLGZvdXInLAogIGV4cHI6ICclcy9cXFxcLywnfSk7CnRlc3RTdWJzdGl0dXRlKCdleF9zdWJzdGl0dXRlX3NsYXNoX3JlcGxhY2VtZW50JywgewogIHZhbHVlOiAnb25lLHR3byBcbiB0aHJlZSxmb3VyJywKICBleHBlY3RlZFZhbHVlOiAnb25lL3R3byBcbiB0aHJlZS9mb3VyJywKICBleHByOiAnJXMvLC9cXC8nfSk7CnRlc3RTdWJzdGl0dXRlKCdleF9zdWJzdGl0dXRlX2JhY2tzbGFzaF9yZXBsYWNlbWVudCcsIHsKICB2YWx1ZTogJ29uZSx0d28gXG4gdGhyZWUsZm91cicsCiAgZXhwZWN0ZWRWYWx1ZTogJ29uZVxcdHdvIFxuIHRocmVlXFxmb3VyJywKICBleHByOiAnJXMvLC9cXFxcL2cnfSk7CnRlc3RTdWJzdGl0dXRlKCdleF9zdWJzdGl0dXRlX211bHRpYmFja3NsYXNoX3JlcGxhY2VtZW50JywgewogIHZhbHVlOiAnb25lLHR3byBcbiB0aHJlZSxmb3VyJywKICBleHBlY3RlZFZhbHVlOiAnb25lXFxcXFxcXFx0d28gXG4gdGhyZWVcXFxcXFxcXGZvdXInLCAvLyAyKjggYmFja3NsYXNoZXMuCiAgZXhwcjogJyVzLywvXFxcXFxcXFxcXFxcXFxcXC9nJ30pOyAvLyAxNiBiYWNrc2xhc2hlcy4KdGVzdFN1YnN0aXR1dGUoJ2V4X3N1YnN0aXR1dGVfYnJhY2VzX3dvcmQnLCB7CiAgdmFsdWU6ICdhYmFiYWIgYWJiIGFiezJ9JywKICBleHBlY3RlZFZhbHVlOiAnYWIgYWJiIGFiezJ9JywKICBleHByOiAnJXMvKGFiKXsyfS8vZycsCiAgbm9QY3JlRXhwcjogJyVzL1xcKGFiXFwpXFx7MlxcfS8vZyd9KTsKdGVzdFN1YnN0aXR1dGUoJ2V4X3N1YnN0aXR1dGVfYnJhY2VzX3JhbmdlJywgewogIHZhbHVlOiAnYSBhYSBhYWEgYWFhYScsCiAgZXhwZWN0ZWRWYWx1ZTogJ2EgICBhJywKICBleHByOiAnJXMvYXsyLDN9Ly9nJywKICBub1BjcmVFeHByOiAnJXMvYVxcezIsM1xcfS8vZyd9KTsKdGVzdFN1YnN0aXR1dGUoJ2V4X3N1YnN0aXR1dGVfYnJhY2VzX2xpdGVyYWwnLCB7CiAgdmFsdWU6ICdhYmFiYWIgYWJiIGFiezJ9JywKICBleHBlY3RlZFZhbHVlOiAnYWJhYmFiIGFiYiAnLAogIGV4cHI6ICclcy9hYlxcezJcXH0vL2cnLAogIG5vUGNyZUV4cHI6ICclcy9hYnsyfS8vZyd9KTsKdGVzdFN1YnN0aXR1dGUoJ2V4X3N1YnN0aXR1dGVfYnJhY2VzX2NoYXInLCB7CiAgdmFsdWU6ICdhYmFiYWIgYWJiIGFiezJ9JywKICBleHBlY3RlZFZhbHVlOiAnYWJhYmFiICBhYnsyfScsCiAgZXhwcjogJyVzL2FiezJ9Ly9nJywKICBub1BjcmVFeHByOiAnJXMvYWJcXHsyXFx9Ly9nJ30pOwp0ZXN0U3Vic3RpdHV0ZSgnZXhfc3Vic3RpdHV0ZV9icmFjZXNfbm9fZXNjYXBlJywgewogIHZhbHVlOiAnYWJhYmFiIGFiYiBhYnsyfScsCiAgZXhwZWN0ZWRWYWx1ZTogJ2FiYWJhYiAgYWJ7Mn0nLAogIGV4cHI6ICclcy9hYnsyfS8vZycsCiAgbm9QY3JlRXhwcjogJyVzL2FiXFx7Mn0vL2cnfSk7CnRlc3RTdWJzdGl0dXRlKCdleF9zdWJzdGl0dXRlX2NvdW50JywgewogIHZhbHVlOiAnMVxuMlxuM1xuNCcsCiAgZXhwZWN0ZWRWYWx1ZTogJzFcbjBcbjBcbjQnLAogIGV4cHI6ICdzL1xcZC8wL2kgMid9KTsKdGVzdFN1YnN0aXR1dGUoJ2V4X3N1YnN0aXR1dGVfY291bnRfd2l0aF9yYW5nZScsIHsKICB2YWx1ZTogJzFcbjJcbjNcbjQnLAogIGV4cGVjdGVkVmFsdWU6ICcxXG4yXG4wXG4wJywKICBleHByOiAnMSwzcy9cXGQvMC8gMyd9KTsKdGVzdFN1YnN0aXR1dGUoJ2V4X3N1YnN0aXR1dGVfbm90X2dsb2JhbCcsIHsKICB2YWx1ZTogJ2FhYVxuYmFhXG5jYWEnLAogIGV4cGVjdGVkVmFsdWU6ICd4YWFcbmJ4YVxuY3hhJywKICBleHByOiAnJXMvYS94Lyd9KTsKZnVuY3Rpb24gdGVzdFN1YnN0aXR1dGVDb25maXJtKG5hbWUsIGNvbW1hbmQsIGluaXRpYWxWYWx1ZSwgZXhwZWN0ZWRWYWx1ZSwga2V5cywgZmluYWxQb3MpIHsKICB0ZXN0VmltKG5hbWUsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICAgIHZhciBzYXZlZE9wZW5EaWFsb2cgPSBjbS5vcGVuRGlhbG9nOwogICAgdmFyIHNhdmVkS2V5TmFtZSA9IENvZGVNaXJyb3Iua2V5TmFtZTsKICAgIHZhciBvbktleURvd247CiAgICB2YXIgcmVjb3JkZWRDYWxsYmFjazsKICAgIHZhciBjbG9zZWQgPSB0cnVlOyAvLyBTdGFydCBvdXQgY2xvc2VkLCBzZXQgZmFsc2Ugb24gc2Vjb25kIG9wZW5EaWFsb2cuCiAgICBmdW5jdGlvbiBjbG9zZSgpIHsKICAgICAgY2xvc2VkID0gdHJ1ZTsKICAgIH0KICAgIC8vIEZpcnN0IG9wZW5EaWFsb2cgc2hvdWxkIHNhdmUgY2FsbGJhY2suCiAgICBjbS5vcGVuRGlhbG9nID0gZnVuY3Rpb24odGVtcGxhdGUsIGNhbGxiYWNrLCBvcHRpb25zKSB7CiAgICAgIHJlY29yZGVkQ2FsbGJhY2sgPSBjYWxsYmFjazsKICAgIH0KICAgIC8vIERvIGZpcnN0IG9wZW5EaWFsb2cuCiAgICBoZWxwZXJzLmRvS2V5cygnOicpOwogICAgLy8gU2Vjb25kIG9wZW5EaWFsb2cgc2hvdWxkIHNhdmUga2V5RG93biBoYW5kbGVyLgogICAgY20ub3BlbkRpYWxvZyA9IGZ1bmN0aW9uKHRlbXBsYXRlLCBjYWxsYmFjaywgb3B0aW9ucykgewogICAgICBvbktleURvd24gPSBvcHRpb25zLm9uS2V5RG93bjsKICAgICAgY2xvc2VkID0gZmFsc2U7CiAgICB9OwogICAgLy8gUmV0dXJuIHRoZSBjb21tYW5kIHRvIFZpbSBhbmQgdHJpZ2dlciBzZWNvbmQgb3BlbkRpYWxvZy4KICAgIHJlY29yZGVkQ2FsbGJhY2soY29tbWFuZCk7CiAgICAvLyBUaGUgZXZlbnQgc2hvdWxkIHJlYWxseSB1c2Uga2V5Q29kZSwgYnV0IGhlcmUganVzdCBtb2NrIGl0IG91dCBhbmQgdXNlCiAgICAvLyBrZXkgYW5kIHJlcGxhY2Uga2V5TmFtZSB0byBqdXN0IHJldHVybiBrZXkuCiAgICBDb2RlTWlycm9yLmtleU5hbWUgPSBmdW5jdGlvbiAoZSkgeyByZXR1cm4gZS5rZXk7IH0KICAgIGtleXMgPSBrZXlzLnRvVXBwZXJDYXNlKCk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsKICAgICAgaXMoIWNsb3NlZCk7CiAgICAgIG9uS2V5RG93bih7IGtleToga2V5cy5jaGFyQXQoaSkgfSwgJycsIGNsb3NlKTsKICAgIH0KICAgIHRyeSB7CiAgICAgIGVxKGV4cGVjdGVkVmFsdWUsIGNtLmdldFZhbHVlKCkpOwogICAgICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KGZpbmFsUG9zKTsKICAgICAgaXMoY2xvc2VkKTsKICAgIH0gY2F0Y2goZSkgewogICAgICB0aHJvdyBlCiAgICB9IGZpbmFsbHkgewogICAgICAvLyBSZXN0b3JlIG92ZXJyaWRlbiBmdW5jdGlvbnMuCiAgICAgIENvZGVNaXJyb3Iua2V5TmFtZSA9IHNhdmVkS2V5TmFtZTsKICAgICAgY20ub3BlbkRpYWxvZyA9IHNhdmVkT3BlbkRpYWxvZzsKICAgIH0KICB9LCB7IHZhbHVlOiBpbml0aWFsVmFsdWUgfSk7Cn07CnRlc3RTdWJzdGl0dXRlQ29uZmlybSgnZXhfc3Vic3RpdHV0ZV9jb25maXJtX2VtcHR5ZG9jJywKICAgICclcy94L2IvYycsICcnLCAnJywgJycsIG1ha2VDdXJzb3IoMCwgMCkpOwp0ZXN0U3Vic3RpdHV0ZUNvbmZpcm0oJ2V4X3N1YnN0aXR1dGVfY29uZmlybV9ub21hdGNoJywKICAgICclcy94L2IvYycsICdiYSBhXG5iYWInLCAnYmEgYVxuYmFiJywgJycsIG1ha2VDdXJzb3IoMCwgMCkpOwp0ZXN0U3Vic3RpdHV0ZUNvbmZpcm0oJ2V4X3N1YnN0aXR1dGVfY29uZmlybV9hY2NlcHQnLAogICAgJyVzL2EvYi9jZycsICdiYSBhXG5iYWInLCAnYmIgYlxuYmJiJywgJ3l5eScsIG1ha2VDdXJzb3IoMSwgMSkpOwp0ZXN0U3Vic3RpdHV0ZUNvbmZpcm0oJ2V4X3N1YnN0aXR1dGVfY29uZmlybV9yYW5kb21fa2V5cycsCiAgICAnJXMvYS9iL2NnJywgJ2JhIGFcbmJhYicsICdiYiBiXG5iYmInLCAneXNka3l3ZXJ0eScsIG1ha2VDdXJzb3IoMSwgMSkpOwp0ZXN0U3Vic3RpdHV0ZUNvbmZpcm0oJ2V4X3N1YnN0aXR1dGVfY29uZmlybV9zb21lJywKICAgICclcy9hL2IvY2cnLCAnYmEgYVxuYmFiJywgJ2JiIGFcbmJiYicsICd5bnknLCBtYWtlQ3Vyc29yKDEsIDEpKTsKdGVzdFN1YnN0aXR1dGVDb25maXJtKCdleF9zdWJzdGl0dXRlX2NvbmZpcm1fYWxsJywKICAgICclcy9hL2IvY2cnLCAnYmEgYVxuYmFiJywgJ2JiIGJcbmJiYicsICdhJywgbWFrZUN1cnNvcigxLCAxKSk7CnRlc3RTdWJzdGl0dXRlQ29uZmlybSgnZXhfc3Vic3RpdHV0ZV9jb25maXJtX2FjY2VwdF90aGVuX2FsbCcsCiAgICAnJXMvYS9iL2NnJywgJ2JhIGFcbmJhYicsICdiYiBiXG5iYmInLCAneWEnLCBtYWtlQ3Vyc29yKDEsIDEpKTsKdGVzdFN1YnN0aXR1dGVDb25maXJtKCdleF9zdWJzdGl0dXRlX2NvbmZpcm1fcXVpdCcsCiAgICAnJXMvYS9iL2NnJywgJ2JhIGFcbmJhYicsICdiYiBhXG5iYWInLCAneXEnLCBtYWtlQ3Vyc29yKDAsIDMpKTsKdGVzdFN1YnN0aXR1dGVDb25maXJtKCdleF9zdWJzdGl0dXRlX2NvbmZpcm1fbGFzdCcsCiAgICAnJXMvYS9iL2NnJywgJ2JhIGFcbmJhYicsICdiYiBiXG5iYWInLCAneWwnLCBtYWtlQ3Vyc29yKDAsIDMpKTsKdGVzdFN1YnN0aXR1dGVDb25maXJtKCdleF9zdWJzdGl0dXRlX2NvbmZpcm1fb25lbGluZScsCiAgICAnMXMvYS9iL2NnJywgJ2JhIGFcbmJhYicsICdiYiBiXG5iYWInLCAneWwnLCBtYWtlQ3Vyc29yKDAsIDMpKTsKdGVzdFN1YnN0aXR1dGVDb25maXJtKCdleF9zdWJzdGl0dXRlX2NvbmZpcm1fcmFuZ2VfYWNjZXB0JywKICAgICcxLDJzL2EvYi9jZycsICdhYVxuYSBcbmFcbmEnLCAnYmJcbmIgXG5hXG5hJywgJ3l5eScsIG1ha2VDdXJzb3IoMSwgMCkpOwp0ZXN0U3Vic3RpdHV0ZUNvbmZpcm0oJ2V4X3N1YnN0aXR1dGVfY29uZmlybV9yYW5nZV9zb21lJywKICAgICcxLDNzL2EvYi9jZycsICdhYVxuYSBcbmFcbmEnLCAnYmFcbmIgXG5iXG5hJywgJ3lueXknLCBtYWtlQ3Vyc29yKDIsIDApKTsKdGVzdFN1YnN0aXR1dGVDb25maXJtKCdleF9zdWJzdGl0dXRlX2NvbmZpcm1fcmFuZ2VfYWxsJywKICAgICcxLDNzL2EvYi9jZycsICdhYVxuYSBcbmFcbmEnLCAnYmJcbmIgXG5iXG5hJywgJ2EnLCBtYWtlQ3Vyc29yKDIsIDApKTsKdGVzdFN1YnN0aXR1dGVDb25maXJtKCdleF9zdWJzdGl0dXRlX2NvbmZpcm1fcmFuZ2VfbGFzdCcsCiAgICAnMSwzcy9hL2IvY2cnLCAnYWFcbmEgXG5hXG5hJywgJ2JiXG5iIFxuYVxuYScsICd5eWwnLCBtYWtlQ3Vyc29yKDEsIDApKTsKLy86bm9oIHNob3VsZCBjbGVhciBoaWdobGlnaHRpbmcgb2Ygc2VhcmNoLXJlc3VsdHMgYnV0IGFsbG93IHRvIHJlc3VtZSBzZWFyY2ggdGhyb3VnaCBuCnRlc3RWaW0oJ2V4X25vaF9jbGVhclNlYXJjaEhpZ2hsaWdodCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5vcGVuRGlhbG9nID0gaGVscGVycy5mYWtlT3BlbkRpYWxvZygnbWF0Y2gnKTsKICBoZWxwZXJzLmRvS2V5cygnPycpOwogIGhlbHBlcnMuZG9FeCgnbm9oJyk7CiAgZXEodmltLnNlYXJjaFN0YXRlXy5nZXRPdmVybGF5KCksbnVsbCwnbWF0Y2gtaGlnaGxpZ2h0aW5nIHdhc25cJ3QgY2xlYXJlZCcpOwogIGhlbHBlcnMuZG9LZXlzKCduJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCAxMSwnY2FuXCd0IHJlc3VtZSBzZWFyY2ggYWZ0ZXIgY2xlYXJpbmcgaGlnaGxpZ2h0aW5nJyk7Cn0sIHsgdmFsdWU6ICdtYXRjaCBub3BlIG1hdGNoIFxuIG5vcGUgTWF0Y2gnIH0pOwp0ZXN0VmltKCdzZXRfYm9vbGVhbicsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBDb2RlTWlycm9yLlZpbS5kZWZpbmVPcHRpb24oJ3Rlc3RvcHRpb24nLCB0cnVlLCAnYm9vbGVhbicpOwogIC8vIFRlc3QgZGVmYXVsdCB2YWx1ZSBpcyBzZXQuCiAgaXMoQ29kZU1pcnJvci5WaW0uZ2V0T3B0aW9uKCd0ZXN0b3B0aW9uJykpOwogIHRyeSB7CiAgICAvLyBUZXN0IGZhaWwgdG8gc2V0IHRvIG5vbi1ib29sZWFuCiAgICBDb2RlTWlycm9yLlZpbS5zZXRPcHRpb24oJ3Rlc3RvcHRpb24nLCAnNScpOwogICAgZmFpbCgpOwogIH0gY2F0Y2ggKGV4cGVjdGVkKSB7fTsKICAvLyBUZXN0IHNldE9wdGlvbgogIENvZGVNaXJyb3IuVmltLnNldE9wdGlvbigndGVzdG9wdGlvbicsIGZhbHNlKTsKICBpcyghQ29kZU1pcnJvci5WaW0uZ2V0T3B0aW9uKCd0ZXN0b3B0aW9uJykpOwp9KTsKdGVzdFZpbSgnZXhfc2V0X2Jvb2xlYW4nLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgQ29kZU1pcnJvci5WaW0uZGVmaW5lT3B0aW9uKCd0ZXN0b3B0aW9uJywgdHJ1ZSwgJ2Jvb2xlYW4nKTsKICAvLyBUZXN0IGRlZmF1bHQgdmFsdWUgaXMgc2V0LgogIGlzKENvZGVNaXJyb3IuVmltLmdldE9wdGlvbigndGVzdG9wdGlvbicpKTsKICB0cnkgewogICAgLy8gVGVzdCBmYWlsIHRvIHNldCB0byBub24tYm9vbGVhbgogICAgaGVscGVycy5kb0V4KCdzZXQgdGVzdG9wdGlvbj0yMicpOwogICAgZmFpbCgpOwogIH0gY2F0Y2ggKGV4cGVjdGVkKSB7fTsKICAvLyBUZXN0IHNldE9wdGlvbgogIGhlbHBlcnMuZG9FeCgnc2V0IG5vdGVzdG9wdGlvbicpOwogIGlzKCFDb2RlTWlycm9yLlZpbS5nZXRPcHRpb24oJ3Rlc3RvcHRpb24nKSk7Cn0pOwp0ZXN0VmltKCdzZXRfc3RyaW5nJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIENvZGVNaXJyb3IuVmltLmRlZmluZU9wdGlvbigndGVzdG9wdGlvbicsICdhJywgJ3N0cmluZycpOwogIC8vIFRlc3QgZGVmYXVsdCB2YWx1ZSBpcyBzZXQuCiAgZXEoJ2EnLCBDb2RlTWlycm9yLlZpbS5nZXRPcHRpb24oJ3Rlc3RvcHRpb24nKSk7CiAgdHJ5IHsKICAgIC8vIFRlc3QgZmFpbCB0byBzZXQgbm9uLXN0cmluZy4KICAgIENvZGVNaXJyb3IuVmltLnNldE9wdGlvbigndGVzdG9wdGlvbicsIHRydWUpOwogICAgZmFpbCgpOwogIH0gY2F0Y2ggKGV4cGVjdGVkKSB7fTsKICB0cnkgewogICAgLy8gVGVzdCBmYWlsIHRvIHNldCAnbm90ZXN0b3B0aW9uJwogICAgQ29kZU1pcnJvci5WaW0uc2V0T3B0aW9uKCdub3Rlc3RvcHRpb24nLCAnYicpOwogICAgZmFpbCgpOwogIH0gY2F0Y2ggKGV4cGVjdGVkKSB7fTsKICAvLyBUZXN0IHNldE9wdGlvbgogIENvZGVNaXJyb3IuVmltLnNldE9wdGlvbigndGVzdG9wdGlvbicsICdjJyk7CiAgZXEoJ2MnLCBDb2RlTWlycm9yLlZpbS5nZXRPcHRpb24oJ3Rlc3RvcHRpb24nKSk7Cn0pOwp0ZXN0VmltKCdleF9zZXRfc3RyaW5nJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIENvZGVNaXJyb3IuVmltLmRlZmluZU9wdGlvbigndGVzdG9wdGlvbicsICdhJywgJ3N0cmluZycpOwogIC8vIFRlc3QgZGVmYXVsdCB2YWx1ZSBpcyBzZXQuCiAgZXEoJ2EnLCBDb2RlTWlycm9yLlZpbS5nZXRPcHRpb24oJ3Rlc3RvcHRpb24nKSk7CiAgdHJ5IHsKICAgIC8vIFRlc3QgZmFpbCB0byBzZXQgJ25vdGVzdG9wdGlvbicKICAgIGhlbHBlcnMuZG9FeCgnc2V0IG5vdGVzdG9wdGlvbj1iJyk7CiAgICBmYWlsKCk7CiAgfSBjYXRjaCAoZXhwZWN0ZWQpIHt9OwogIC8vIFRlc3Qgc2V0T3B0aW9uCiAgaGVscGVycy5kb0V4KCdzZXQgdGVzdG9wdGlvbj1jJykKICBlcSgnYycsIENvZGVNaXJyb3IuVmltLmdldE9wdGlvbigndGVzdG9wdGlvbicpKTsKfSk7Ci8vIFRPRE86IFJlc2V0IGtleSBtYXBzIGFmdGVyIGVhY2ggdGVzdC4KdGVzdFZpbSgnZXhfbWFwX2tleTJrZXknLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgaGVscGVycy5kb0V4KCdtYXAgYSB4Jyk7CiAgaGVscGVycy5kb0tleXMoJ2EnKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDApOwogIGVxKCdiYycsIGNtLmdldFZhbHVlKCkpOwp9LCB7IHZhbHVlOiAnYWJjJyB9KTsKdGVzdFZpbSgnZXhfdW5tYXBfa2V5MmtleScsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBoZWxwZXJzLmRvRXgoJ3VubWFwIGEnKTsKICBoZWxwZXJzLmRvS2V5cygnYScpOwogIGVxKCd2aW0taW5zZXJ0JywgY20uZ2V0T3B0aW9uKCdrZXlNYXAnKSk7Cn0sIHsgdmFsdWU6ICdhYmMnIH0pOwp0ZXN0VmltKCdleF91bm1hcF9rZXkya2V5X2RvZXNfbm90X3JlbW92ZV9kZWZhdWx0JywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIHRyeSB7CiAgICBoZWxwZXJzLmRvRXgoJ3VubWFwIGEnKTsKICAgIGZhaWwoKTsKICB9IGNhdGNoIChleHBlY3RlZCkge30KICBoZWxwZXJzLmRvS2V5cygnYScpOwogIGVxKCd2aW0taW5zZXJ0JywgY20uZ2V0T3B0aW9uKCdrZXlNYXAnKSk7Cn0sIHsgdmFsdWU6ICdhYmMnIH0pOwp0ZXN0VmltKCdleF9tYXBfa2V5MmtleV90b19jb2xvbicsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBoZWxwZXJzLmRvRXgoJ21hcCA7IDonKTsKICB2YXIgZGlhbG9nT3BlbmVkID0gZmFsc2U7CiAgY20ub3BlbkRpYWxvZyA9IGZ1bmN0aW9uKCkgewogICAgZGlhbG9nT3BlbmVkID0gdHJ1ZTsKICB9CiAgaGVscGVycy5kb0tleXMoJzsnKTsKICBlcShkaWFsb2dPcGVuZWQsIHRydWUpOwp9KTsKdGVzdFZpbSgnZXhfbWFwX2V4MmtleTonLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgaGVscGVycy5kb0V4KCdtYXAgOmRlbCB4Jyk7CiAgaGVscGVycy5kb0V4KCdkZWwnKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDApOwogIGVxKCdiYycsIGNtLmdldFZhbHVlKCkpOwp9LCB7IHZhbHVlOiAnYWJjJyB9KTsKdGVzdFZpbSgnZXhfbWFwX2V4MmV4JywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGhlbHBlcnMuZG9FeCgnbWFwIDpkZWwgOncnKTsKICB2YXIgdG1wID0gQ29kZU1pcnJvci5jb21tYW5kcy5zYXZlOwogIHZhciB3cml0dGVuID0gZmFsc2U7CiAgdmFyIGFjdHVhbENtOwogIENvZGVNaXJyb3IuY29tbWFuZHMuc2F2ZSA9IGZ1bmN0aW9uKGNtKSB7CiAgICB3cml0dGVuID0gdHJ1ZTsKICAgIGFjdHVhbENtID0gY207CiAgfTsKICBoZWxwZXJzLmRvRXgoJ2RlbCcpOwogIENvZGVNaXJyb3IuY29tbWFuZHMuc2F2ZSA9IHRtcDsKICBlcSh3cml0dGVuLCB0cnVlKTsKICBlcShhY3R1YWxDbSwgY20pOwp9KTsKdGVzdFZpbSgnZXhfbWFwX2tleTJleCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBoZWxwZXJzLmRvRXgoJ21hcCBhIDp3Jyk7CiAgdmFyIHRtcCA9IENvZGVNaXJyb3IuY29tbWFuZHMuc2F2ZTsKICB2YXIgd3JpdHRlbiA9IGZhbHNlOwogIHZhciBhY3R1YWxDbTsKICBDb2RlTWlycm9yLmNvbW1hbmRzLnNhdmUgPSBmdW5jdGlvbihjbSkgewogICAgd3JpdHRlbiA9IHRydWU7CiAgICBhY3R1YWxDbSA9IGNtOwogIH07CiAgaGVscGVycy5kb0tleXMoJ2EnKTsKICBDb2RlTWlycm9yLmNvbW1hbmRzLnNhdmUgPSB0bXA7CiAgZXEod3JpdHRlbiwgdHJ1ZSk7CiAgZXEoYWN0dWFsQ20sIGNtKTsKfSk7CnRlc3RWaW0oJ2V4X21hcF9rZXkya2V5X3Zpc3VhbF9hcGknLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgQ29kZU1pcnJvci5WaW0ubWFwKCdiJywgJzp3JywgJ3Zpc3VhbCcpOwogIHZhciB0bXAgPSBDb2RlTWlycm9yLmNvbW1hbmRzLnNhdmU7CiAgdmFyIHdyaXR0ZW4gPSBmYWxzZTsKICB2YXIgYWN0dWFsQ207CiAgQ29kZU1pcnJvci5jb21tYW5kcy5zYXZlID0gZnVuY3Rpb24oY20pIHsKICAgIHdyaXR0ZW4gPSB0cnVlOwogICAgYWN0dWFsQ20gPSBjbTsKICB9OwogIC8vIE1hcHBpbmcgc2hvdWxkIG5vdCB3b3JrIGluIG5vcm1hbCBtb2RlLgogIGhlbHBlcnMuZG9LZXlzKCdiJyk7CiAgZXEod3JpdHRlbiwgZmFsc2UpOwogIC8vIE1hcHBpbmcgc2hvdWxkIHdvcmsgaW4gdmlzdWFsIG1vZGUuCiAgaGVscGVycy5kb0tleXMoJ3YnLCAnYicpOwogIGVxKHdyaXR0ZW4sIHRydWUpOwogIGVxKGFjdHVhbENtLCBjbSk7CgogIENvZGVNaXJyb3IuY29tbWFuZHMuc2F2ZSA9IHRtcDsKfSk7CgovLyBUZXN0aW5nIHJlZ2lzdHJhdGlvbiBvZiBmdW5jdGlvbnMgYXMgZXgtY29tbWFuZHMgYW5kIG1hcHBpbmcgdG8gPEtleT4ta2V5cwp0ZXN0VmltKCdleF9hcGlfdGVzdCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICB2YXIgcmVzPWZhbHNlOwogIHZhciB2YWw9J2Zyb20nOwogIENvZGVNaXJyb3IuVmltLmRlZmluZUV4KCdleHRlc3QnLCdleHQnLGZ1bmN0aW9uKGNtLHBhcmFtcyl7CiAgICBpZihwYXJhbXMuYXJncyl2YWw9cGFyYW1zLmFyZ3NbMF07CiAgICBlbHNlIHJlcz10cnVlOwogIH0pOwogIGhlbHBlcnMuZG9FeCgnOmV4dCB0bycpOwogIGVxKHZhbCwndG8nLCdEZWZpbmluZyBleC1jb21tYW5kIGZhaWxlZCcpOwogIENvZGVNaXJyb3IuVmltLm1hcCgnPEMtQ1I+PFNwYWNlPicsJzpleHQnKTsKICBoZWxwZXJzLmRvS2V5cygnPEMtQ1I+JywnPFNwYWNlPicpOwogIGlzKHJlcywnTWFwcGluZyB0byBrZXkgZmFpbGVkJyk7Cn0pOwovLyBGb3Igbm93LCB0aGlzIHRlc3QgbmVlZHMgdG8gYmUgbGFzdCBiZWNhdXNlIGl0IG1lc3NlcyB1cCA6IGZvciBmdXR1cmUgdGVzdHMuCnRlc3RWaW0oJ2V4X21hcF9rZXkya2V5X2Zyb21fY29sb24nLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgaGVscGVycy5kb0V4KCdtYXAgOiB4Jyk7CiAgaGVscGVycy5kb0tleXMoJzonKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDApOwogIGVxKCdiYycsIGNtLmdldFZhbHVlKCkpOwp9LCB7IHZhbHVlOiAnYWJjJyB9KTsKCi8vIFRlc3QgZXZlbnQgaGFuZGxlcnMKdGVzdFZpbSgnYmVmb3JlU2VsZWN0aW9uQ2hhbmdlJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAxMDApOwogIGVxUG9zKGNtLmdldEN1cnNvcignaGVhZCcpLCBjbS5nZXRDdXJzb3IoJ2FuY2hvcicpKTsKfSwgeyB2YWx1ZTogJ2FiYycgfSk7CgoK]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/theme/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-4.4/theme/3024-day.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKCiAgICBOYW1lOiAgICAgICAzMDI0IGRheQogICAgQXV0aG9yOiAgICAgSmFuIFQuIFNvdHQgKGh0dHA6Ly9naXRodWIuY29tL2lkbGViZXJnKQoKICAgIENvZGVNaXJyb3IgdGVtcGxhdGUgYnkgSmFuIFQuIFNvdHQgKGh0dHBzOi8vZ2l0aHViLmNvbS9pZGxlYmVyZy9iYXNlMTYtY29kZW1pcnJvcikKICAgIE9yaWdpbmFsIEJhc2UxNiBjb2xvciBzY2hlbWUgYnkgQ2hyaXMgS2VtcHNvbiAoaHR0cHM6Ly9naXRodWIuY29tL2Nocmlza2VtcHNvbi9iYXNlMTYpCgoqLwoKLmNtLXMtMzAyNC1kYXkuQ29kZU1pcnJvciB7YmFja2dyb3VuZDogI2Y3ZjdmNzsgY29sb3I6ICMzYTM0MzI7fQouY20tcy0zMDI0LWRheSBkaXYuQ29kZU1pcnJvci1zZWxlY3RlZCB7YmFja2dyb3VuZDogI2Q2ZDVkNCAhaW1wb3J0YW50O30KCi5jbS1zLTMwMjQtZGF5IC5Db2RlTWlycm9yLWd1dHRlcnMge2JhY2tncm91bmQ6ICNmN2Y3Zjc7IGJvcmRlci1yaWdodDogMHB4O30KLmNtLXMtMzAyNC1kYXkgLkNvZGVNaXJyb3ItZ3V0dGVybWFya2VyIHsgY29sb3I6ICNkYjJkMjA7IH0KLmNtLXMtMzAyNC1kYXkgLkNvZGVNaXJyb3ItZ3V0dGVybWFya2VyLXN1YnRsZSB7IGNvbG9yOiAjODA3ZDdjOyB9Ci5jbS1zLTMwMjQtZGF5IC5Db2RlTWlycm9yLWxpbmVudW1iZXIge2NvbG9yOiAjODA3ZDdjO30KCi5jbS1zLTMwMjQtZGF5IC5Db2RlTWlycm9yLWN1cnNvciB7Ym9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjNWM1ODU1ICFpbXBvcnRhbnQ7fQoKLmNtLXMtMzAyNC1kYXkgc3Bhbi5jbS1jb21tZW50IHtjb2xvcjogI2NkYWI1Mzt9Ci5jbS1zLTMwMjQtZGF5IHNwYW4uY20tYXRvbSB7Y29sb3I6ICNhMTZhOTQ7fQouY20tcy0zMDI0LWRheSBzcGFuLmNtLW51bWJlciB7Y29sb3I6ICNhMTZhOTQ7fQoKLmNtLXMtMzAyNC1kYXkgc3Bhbi5jbS1wcm9wZXJ0eSwgLmNtLXMtMzAyNC1kYXkgc3Bhbi5jbS1hdHRyaWJ1dGUge2NvbG9yOiAjMDFhMjUyO30KLmNtLXMtMzAyNC1kYXkgc3Bhbi5jbS1rZXl3b3JkIHtjb2xvcjogI2RiMmQyMDt9Ci5jbS1zLTMwMjQtZGF5IHNwYW4uY20tc3RyaW5nIHtjb2xvcjogI2ZkZWQwMjt9CgouY20tcy0zMDI0LWRheSBzcGFuLmNtLXZhcmlhYmxlIHtjb2xvcjogIzAxYTI1Mjt9Ci5jbS1zLTMwMjQtZGF5IHNwYW4uY20tdmFyaWFibGUtMiB7Y29sb3I6ICMwMWEwZTQ7fQouY20tcy0zMDI0LWRheSBzcGFuLmNtLWRlZiB7Y29sb3I6ICNlOGJiZDA7fQouY20tcy0zMDI0LWRheSBzcGFuLmNtLWJyYWNrZXQge2NvbG9yOiAjM2EzNDMyO30KLmNtLXMtMzAyNC1kYXkgc3Bhbi5jbS10YWcge2NvbG9yOiAjZGIyZDIwO30KLmNtLXMtMzAyNC1kYXkgc3Bhbi5jbS1saW5rIHtjb2xvcjogI2ExNmE5NDt9Ci5jbS1zLTMwMjQtZGF5IHNwYW4uY20tZXJyb3Ige2JhY2tncm91bmQ6ICNkYjJkMjA7IGNvbG9yOiAjNWM1ODU1O30KCi5jbS1zLTMwMjQtZGF5IC5Db2RlTWlycm9yLWFjdGl2ZWxpbmUtYmFja2dyb3VuZCB7YmFja2dyb3VuZDogI2U4ZjJmZiAhaW1wb3J0YW50O30KLmNtLXMtMzAyNC1kYXkgLkNvZGVNaXJyb3ItbWF0Y2hpbmdicmFja2V0IHsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IGNvbG9yOiB3aGl0ZSAhaW1wb3J0YW50O30K]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/theme/3024-night.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKCiAgICBOYW1lOiAgICAgICAzMDI0IG5pZ2h0CiAgICBBdXRob3I6ICAgICBKYW4gVC4gU290dCAoaHR0cDovL2dpdGh1Yi5jb20vaWRsZWJlcmcpCgogICAgQ29kZU1pcnJvciB0ZW1wbGF0ZSBieSBKYW4gVC4gU290dCAoaHR0cHM6Ly9naXRodWIuY29tL2lkbGViZXJnL2Jhc2UxNi1jb2RlbWlycm9yKQogICAgT3JpZ2luYWwgQmFzZTE2IGNvbG9yIHNjaGVtZSBieSBDaHJpcyBLZW1wc29uIChodHRwczovL2dpdGh1Yi5jb20vY2hyaXNrZW1wc29uL2Jhc2UxNikKCiovCgouY20tcy0zMDI0LW5pZ2h0LkNvZGVNaXJyb3Ige2JhY2tncm91bmQ6ICMwOTAzMDA7IGNvbG9yOiAjZDZkNWQ0O30KLmNtLXMtMzAyNC1uaWdodCBkaXYuQ29kZU1pcnJvci1zZWxlY3RlZCB7YmFja2dyb3VuZDogIzNhMzQzMiAhaW1wb3J0YW50O30KLmNtLXMtMzAyNC1uaWdodCAuQ29kZU1pcnJvci1ndXR0ZXJzIHtiYWNrZ3JvdW5kOiAjMDkwMzAwOyBib3JkZXItcmlnaHQ6IDBweDt9Ci5jbS1zLTMwMjQtbmlnaHQgLkNvZGVNaXJyb3ItZ3V0dGVybWFya2VyIHsgY29sb3I6ICNkYjJkMjA7IH0KLmNtLXMtMzAyNC1uaWdodCAuQ29kZU1pcnJvci1ndXR0ZXJtYXJrZXItc3VidGxlIHsgY29sb3I6ICM1YzU4NTU7IH0KLmNtLXMtMzAyNC1uaWdodCAuQ29kZU1pcnJvci1saW5lbnVtYmVyIHtjb2xvcjogIzVjNTg1NTt9CgouY20tcy0zMDI0LW5pZ2h0IC5Db2RlTWlycm9yLWN1cnNvciB7Ym9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjODA3ZDdjICFpbXBvcnRhbnQ7fQoKLmNtLXMtMzAyNC1uaWdodCBzcGFuLmNtLWNvbW1lbnQge2NvbG9yOiAjY2RhYjUzO30KLmNtLXMtMzAyNC1uaWdodCBzcGFuLmNtLWF0b20ge2NvbG9yOiAjYTE2YTk0O30KLmNtLXMtMzAyNC1uaWdodCBzcGFuLmNtLW51bWJlciB7Y29sb3I6ICNhMTZhOTQ7fQoKLmNtLXMtMzAyNC1uaWdodCBzcGFuLmNtLXByb3BlcnR5LCAuY20tcy0zMDI0LW5pZ2h0IHNwYW4uY20tYXR0cmlidXRlIHtjb2xvcjogIzAxYTI1Mjt9Ci5jbS1zLTMwMjQtbmlnaHQgc3Bhbi5jbS1rZXl3b3JkIHtjb2xvcjogI2RiMmQyMDt9Ci5jbS1zLTMwMjQtbmlnaHQgc3Bhbi5jbS1zdHJpbmcge2NvbG9yOiAjZmRlZDAyO30KCi5jbS1zLTMwMjQtbmlnaHQgc3Bhbi5jbS12YXJpYWJsZSB7Y29sb3I6ICMwMWEyNTI7fQouY20tcy0zMDI0LW5pZ2h0IHNwYW4uY20tdmFyaWFibGUtMiB7Y29sb3I6ICMwMWEwZTQ7fQouY20tcy0zMDI0LW5pZ2h0IHNwYW4uY20tZGVmIHtjb2xvcjogI2U4YmJkMDt9Ci5jbS1zLTMwMjQtbmlnaHQgc3Bhbi5jbS1icmFja2V0IHtjb2xvcjogI2Q2ZDVkNDt9Ci5jbS1zLTMwMjQtbmlnaHQgc3Bhbi5jbS10YWcge2NvbG9yOiAjZGIyZDIwO30KLmNtLXMtMzAyNC1uaWdodCBzcGFuLmNtLWxpbmsge2NvbG9yOiAjYTE2YTk0O30KLmNtLXMtMzAyNC1uaWdodCBzcGFuLmNtLWVycm9yIHtiYWNrZ3JvdW5kOiAjZGIyZDIwOyBjb2xvcjogIzgwN2Q3Yzt9CgouY20tcy0zMDI0LW5pZ2h0IC5Db2RlTWlycm9yLWFjdGl2ZWxpbmUtYmFja2dyb3VuZCB7YmFja2dyb3VuZDogIzJGMkYyRiAhaW1wb3J0YW50O30KLmNtLXMtMzAyNC1uaWdodCAuQ29kZU1pcnJvci1tYXRjaGluZ2JyYWNrZXQgeyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgY29sb3I6IHdoaXRlICFpbXBvcnRhbnQ7fQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/theme/ambiance-mobile.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LmNtLXMtYW1iaWFuY2UuQ29kZU1pcnJvciB7CiAgLXdlYmtpdC1ib3gtc2hhZG93OiBub25lOwogIC1tb3otYm94LXNoYWRvdzogbm9uZTsKICBib3gtc2hhZG93OiBub25lOwp9Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/theme/ambiance.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogYW1iaWFuY2UgdGhlbWUgZm9yIGNvZGVtaXJyb3IgKi8KCi8qIENvbG9yIHNjaGVtZSAqLwoKLmNtLXMtYW1iaWFuY2UgLmNtLWtleXdvcmQgeyBjb2xvcjogI2NkYTg2OTsgfQouY20tcy1hbWJpYW5jZSAuY20tYXRvbSB7IGNvbG9yOiAjQ0Y3RUE5OyB9Ci5jbS1zLWFtYmlhbmNlIC5jbS1udW1iZXIgeyBjb2xvcjogIzc4Q0Y4QTsgfQouY20tcy1hbWJpYW5jZSAuY20tZGVmIHsgY29sb3I6ICNhYWM2ZTM7IH0KLmNtLXMtYW1iaWFuY2UgLmNtLXZhcmlhYmxlIHsgY29sb3I6ICNmZmI3OTU7IH0KLmNtLXMtYW1iaWFuY2UgLmNtLXZhcmlhYmxlLTIgeyBjb2xvcjogI2VlZDFiMzsgfQouY20tcy1hbWJpYW5jZSAuY20tdmFyaWFibGUtMyB7IGNvbG9yOiAjZmFkZWQzOyB9Ci5jbS1zLWFtYmlhbmNlIC5jbS1wcm9wZXJ0eSB7IGNvbG9yOiAjZWVkMWIzOyB9Ci5jbS1zLWFtYmlhbmNlIC5jbS1vcGVyYXRvciB7Y29sb3I6ICNmYThkNmE7fQouY20tcy1hbWJpYW5jZSAuY20tY29tbWVudCB7IGNvbG9yOiAjNTU1OyBmb250LXN0eWxlOml0YWxpYzsgfQouY20tcy1hbWJpYW5jZSAuY20tc3RyaW5nIHsgY29sb3I6ICM4ZjlkNmE7IH0KLmNtLXMtYW1iaWFuY2UgLmNtLXN0cmluZy0yIHsgY29sb3I6ICM5ZDkzN2M7IH0KLmNtLXMtYW1iaWFuY2UgLmNtLW1ldGEgeyBjb2xvcjogI0QyQThBMTsgfQouY20tcy1hbWJpYW5jZSAuY20tcXVhbGlmaWVyIHsgY29sb3I6IHllbGxvdzsgfQouY20tcy1hbWJpYW5jZSAuY20tYnVpbHRpbiB7IGNvbG9yOiAjOTk5OWNjOyB9Ci5jbS1zLWFtYmlhbmNlIC5jbS1icmFja2V0IHsgY29sb3I6ICMyNEMyQzc7IH0KLmNtLXMtYW1iaWFuY2UgLmNtLXRhZyB7IGNvbG9yOiAjZmVlNGZmIH0KLmNtLXMtYW1iaWFuY2UgLmNtLWF0dHJpYnV0ZSB7ICBjb2xvcjogIzlCODU5RDsgfQouY20tcy1hbWJpYW5jZSAuY20taGVhZGVyIHtjb2xvcjogYmx1ZTt9Ci5jbS1zLWFtYmlhbmNlIC5jbS1xdW90ZSB7IGNvbG9yOiAjMjRDMkM3OyB9Ci5jbS1zLWFtYmlhbmNlIC5jbS1ociB7IGNvbG9yOiBwaW5rOyB9Ci5jbS1zLWFtYmlhbmNlIC5jbS1saW5rIHsgY29sb3I6ICNGNEMyMEI7IH0KLmNtLXMtYW1iaWFuY2UgLmNtLXNwZWNpYWwgeyBjb2xvcjogI0ZGOUQwMDsgfQouY20tcy1hbWJpYW5jZSAuY20tZXJyb3IgeyBjb2xvcjogI0FGMjAxODsgfQoKLmNtLXMtYW1iaWFuY2UgLkNvZGVNaXJyb3ItbWF0Y2hpbmdicmFja2V0IHsgY29sb3I6ICMwZjA7IH0KLmNtLXMtYW1iaWFuY2UgLkNvZGVNaXJyb3Itbm9ubWF0Y2hpbmdicmFja2V0IHsgY29sb3I6ICNmMjI7IH0KCi5jbS1zLWFtYmlhbmNlIC5Db2RlTWlycm9yLXNlbGVjdGVkIHsKICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpOwp9Ci5jbS1zLWFtYmlhbmNlLkNvZGVNaXJyb3ItZm9jdXNlZCAuQ29kZU1pcnJvci1zZWxlY3RlZCB7CiAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEwKTsKfQoKLyogRWRpdG9yIHN0eWxpbmcgKi8KCi5jbS1zLWFtYmlhbmNlLkNvZGVNaXJyb3IgewogIGxpbmUtaGVpZ2h0OiAxLjQwZW07CiAgY29sb3I6ICNFNkUxREM7CiAgYmFja2dyb3VuZC1jb2xvcjogIzIwMjAyMDsKICAtd2Via2l0LWJveC1zaGFkb3c6IGluc2V0IDAgMCAxMHB4IGJsYWNrOwogIC1tb3otYm94LXNoYWRvdzogaW5zZXQgMCAwIDEwcHggYmxhY2s7CiAgYm94LXNoYWRvdzogaW5zZXQgMCAwIDEwcHggYmxhY2s7Cn0KCi5jbS1zLWFtYmlhbmNlIC5Db2RlTWlycm9yLWd1dHRlcnMgewogIGJhY2tncm91bmQ6ICMzRDNEM0Q7CiAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgIzRENEQ0RDsKICBib3gtc2hhZG93OiAwIDEwcHggMjBweCBibGFjazsKfQoKLmNtLXMtYW1iaWFuY2UgLkNvZGVNaXJyb3ItbGluZW51bWJlciB7CiAgdGV4dC1zaGFkb3c6IDBweCAxcHggMXB4ICM0ZDRkNGQ7CiAgY29sb3I6ICMxMTE7CiAgcGFkZGluZzogMCA1cHg7Cn0KCi5jbS1zLWFtYmlhbmNlIC5Db2RlTWlycm9yLWd1dHRlcm1hcmtlciB7IGNvbG9yOiAjYWFhOyB9Ci5jbS1zLWFtYmlhbmNlIC5Db2RlTWlycm9yLWd1dHRlcm1hcmtlci1zdWJ0bGUgeyBjb2xvcjogIzExMTsgfQoKLmNtLXMtYW1iaWFuY2UgLkNvZGVNaXJyb3ItbGluZXMgLkNvZGVNaXJyb3ItY3Vyc29yIHsKICBib3JkZXItbGVmdDogMXB4IHNvbGlkICM3OTkxRTg7Cn0KCi5jbS1zLWFtYmlhbmNlIC5Db2RlTWlycm9yLWFjdGl2ZWxpbmUtYmFja2dyb3VuZCB7CiAgYmFja2dyb3VuZDogbm9uZSByZXBlYXQgc2Nyb2xsIDAlIDAlIHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMzEpOwp9CgouY20tcy1hbWJpYW5jZS5Db2RlTWlycm9yLAouY20tcy1hbWJpYW5jZSAuQ29kZU1pcnJvci1ndXR0ZXJzIHsKICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBTWdBQUFESUNBUUFBQUFIVVdZVkFBQkZGVWxFUVZRWUdiekJDZURWVS83NC82Zmo5SEljeC9GUkh4OUpDRm16TXlHUlVSaExaSWtVc29lUmZValMyRk5EdHI2V2tNaE85c20rUzhtYUpmdStKY3NnKy9vL2MrWjR6L3Q5Ny92ZXp5M3orejhla0dsbllJQ0cvbzdnZGsrd21TSFoxejRwSkl0cWFwam9LWFdhaG04Tm1WNmVPVGJXVU9wNi82YS9YSWc2R1FxbWVuSjJsREh5dkNGWjJjQkRibXRIQTA0M1ZGaEh3WHhDbFdtZVlBZExoVjAwQmQ4NWdvOFZtYUZDa2JWa3psUUVOemZCRFo1Z3RON0h3RjBLRHJUd0owZHlwU096cGFLQ013UUhLVElyZVlJeGxtaFhUelRXa1ZtK0xUeW5aaGlTQlQzUlpRN2FHZmpHRWQzcXlYUTFGRHltcWJLeHBzcEVSUU4yTWlSak5abEZGUVhmQ05GbTluTTF6cEFzb1lqbXRSVGM1YWp3dWFYYzV4cldza1Q5N1JhS3pBR2U1QVJIaFZVc0RiaktrbHppaVg1V1JPY0p3U05DTkkrOXcxSnd2NFpiMnI3bENNWjRvcTVDMEVkVHgrMkd6TnVLcEoraUZmMzhKRVdrSEpuOURORjdtbUJESVRyV0VnMFZXTDNwSFUyMHRTWm51cVd1K1IzQnRZYThYeFYxSE83R3lEMzJVa09wTC95RGxvSU5GVG12dElkK25tQWp4Unc0MFZNd1ZLaXdyS0xFNGJLNVVPVm50WXdoT2NTU1hLckpIS1BKZWRvY3BHalZ6L1pNSWJuWVVQQjEwL2VLQ3JzNWFwcXBnVm1XekJZV3BtdEtIZWNKUGphVXVFZ1JERGFVMG9aZ2hDSjZ6Tk1RNVpoRFl4MDVyNXYybXVRZE0wRUlMdFhVc2FLaVFYOVdNRVVvdGFnUXpGYlVOTjZOVVBDMm5tNXB4RVdHQ2pNYzNHZEpIalNVMmtPUkxLL0pHU3JrZkdFSWpuY1UvQ1lVbk9pcG9ZZW13ajh0U1Q5TnNKbUI3VFVWWHRiVXRYQVRKVlpYQk12WWVUWEpmb2JnSlVQbUdNUC95RmFXb25hYTZCY0ZPM25xY0lxQ296U1pvWm9TcjFnNHpKT3p1eUdueFRFWDNsVUVKN1djWmdtZThkZGFXdldKbzJBSlI5RFpVM0NVSWJoQ1NHNnliU3dONnF0SlZuQ1Uyc3ZEVFAyWkluT3cyY0JUcnF0UWFodE5abjlOY0o0bDJOYVNtU2trUDFub1pXblZ3a0xtZFVQT3dMWkV3eTJaM1MzUis0cklHOWhjYnBQWEhGVldjUWRaa24yRk90YTNjS1dRbk5SQzVnMUxzSmFoNEdDelNWc0tuQ09ZNU9BRlJUQmVreXlyeWV5aWxoRkt2YTc1cjRNYzBhV2FuR0VhVGhjeTMxczQzOUtLeFR6SllZNVdUSFBVMUZ0SUhqUVUzT2lwNHhsTnpqL2xCdzIzZFlaVmxpUWE3V0FYZjRzaGV0Y1FmYXRJK2pXUkRCUG15TmVXNkExUDVrZERneVlKbGJhMEJJTThCWnUxSmZyRndJdHlqY0FNUjNLMEJXT0lydE1FWHloeXJsVkV4M3VpNWRVQmptQi9RM0NYVzg1UjRtQkQwczdCKzRxNXRLVWpPbGI5cXFtaGk1QVo2R0ZJQzVIWHRPb2JkWUdsVmRNVmJOSjh0b05URmNIeG5vTCttdUJhZ2NjdGpXbmJOTXVSMDB1STduUUVTd2c1cTJxcXJLV0lmck5VbWVRb2NZNkh1eXhKVjAyd2ozNncwMHlocG1VRmVudjRwNmZVa1pZcUx5dWlueDJSR09qaENYWXlKRjg0b2lVMDBZTU9PaGhxdU5kZmJPQjdnVTg4cFk0eEpPOExWZHA2L3Eydm9lQjRSMDR2SWRoU0U0MHhaT2J4MUhHR0ovamEwTEJ0aEZJbkthTFBQRnp1Q2FZYW9qOEpqUE1FOHlveXhvNnpsQnFraVVaWWdxMDBPWU1zd2JXTzVOR21xK3hoaXB4SExSVzI5QVJqTktYTzB3Um5lYXI4WFNnNFhGUExLRVBVUzFHcXZ5THdpdUJVb2E3enBaMGw1eHhGd1dtV1pDMUg1aDVGd1U4ZVE3SytnOFVjVlk2VE1RcmVWUVQvOHVROForQUxJWG5TRWEycFlaUW5lRTlSWmJTQk5ZWGZXWUp6Vy9oLzRqNERwMXRZVmNGSUM1MDE5VnlpNFRoUHFTRkN6akdXYUhRVEJVOHE2dnJWd2d4UDlMa204NDBpbVdLcGNMQ2pZVHRyS3V3dnNLU25ydkhDWEdrU01rOXA2bGhja2ZScEllaXMrTjJQaXN6VCttRkxzcHlHbGVVaER3Y0xyWnFteWV5bHh3akJjS0hFYXBxa215YW5neUxaUlZPaWp3T3RDWTVTc0c1ekwwT3dsQ0o0eTVLem5GM0VVTkREcmlud2l5TFpSek9YdGxCYks1SVRIRkdMcDhRMFI2YWI2bVM3ZW5JMmNGcnhPeUh2T0NGYVQxSFRoUzFrcmpDd3FXZXVyQ2trK3dpbGxoQ0MrUlNablJYQmlaYUM1UlhSSVpZS3AybHlmckh3aUtQS1IwSkR6cmRVMkVGZ3BpZGF3bEZEUjZGZ1hVTU5hK2cxRlkzYlVRaDJjTEN3b3NSZG51UVRTL1MrSlZyR0xlV0l2dFFVdk9OSnhscVNRWVlLcHdvTjJrYW9jTGpkVnNpczRNazgwRVNGMllwU2t6d2xkakhrakZDVXV0SS9yK0VIRFU4b0NzNnl6TDNQaFdpRW9vWmRGTWt5bWxhczRBY0kzS21vTU1OU1EzdEh6akdXQ3JjSkpkWXlaQzdRRkd3alJMOXArTXJSa0FHV3pJYVdDbjlXMEYzVHNLMDFjMlp2UXcwYnl2eHVRVTByMWxNMHFKTzd3VzBrUklNZERUdFhFZHppNFZJaCtFb0lIbTBtV3RBdHBDaXhsYWJnbjgzZktUSTdhbkplOVNUN1dJSzFETUdwUW1ZZUE1OEltVjZlek9HT3pLMktncTAxcGQ2MGNLV2lVaTlMaWV2Yi8wdklEUEhRMDVLenQ0ZGRQY2tRQlF0b2F1cmp5SG5lay9uS3pwUUxyVmdLUGpJa2gydjR1eWV6cHYrWG9vN2ZQRlhhR0ZwMXZhTEt4UTR1VXBRUVM1VnVRczdCQ3E0eFJKdjdmd3BWdnZGRUIzais2MjBoYU91b2NxTWhXZDZUVFBBRXgrbWRGTkdIZHJhbkZlOTVXcldtSXZsWTRGMURsZTJFQ2djNmN0bzdTcnl1cUdHR2hhMHRGUTVWNTNtaWdVS21nNlhLQW80cVMzbWlrKzBPWnBBaE9MZVpLaWNhY2dhWWN5eDVoeXBZUUUwMlpBNHhpL3BOaE9ReFI0a2xOS3lxYWNqK21weG5MVG5uR1NvODUrKzNaQ1pxNmxyWmtYbEdFWDNvK0M5RmllY2NKYlpXVkZqQzBZbzFGWm5KaG9ZTUZvSTFoRVo5cjZod2c3NUh3ekJOaGJaQ2RKRWZKd1RQR3pKdmFLSW13MXlZWDFIREFtcFhSK1pKUS9TbWdxTU5WUWI1dmdhbUd3THR0N1Z3dlA3UWsxeHBpTTV4NUN5djkzRTA2TVptZ3MwTnlhMmF6SUtPWUtDR0JRUVc5N1JtaEtOS0YwMkpacUhFSjRvNThxcDdYNUVjWm1jNTZ0clhFcXpqQ0JaMU1GR1I4N1FsMnRTVHM2Q0d4UzA1UFR6UlFvcmtidzdhS29LWEZEWHNZVzQyVkppaC9xK0ZQMkJkVHpEVHdWcU9ZQjEzbGlNNTB2Rzd3eTI4cWFneXVJWE1lUUkvT3FxOGJjbjV3Skk1MHhIMDBDUm50eWZwTDFUNGh5ZFlwb1hnTmlGem9JVVREWm5MTlJ6aDRUQkh3YllHRHZaa3htbHlKbG95cjZ0UmlocGVVRzk0R25LdEl6blJFRjB0ekpHL09PcjczSkJjclNoMWs2V3VUcHJnTFUrbW5TR252NlpnZTBOTnora1REZEg4bnVBdVRkSkRDTmIyMUxDaUl1cWxZYnFHelQzUkFvWm9mUWZqRmF6a3FlTldkWWFHdllUTTAwMUVXMm9LUHZWazFsZFVHU2dVdEhGd2pLTTFoOWpuRmNteTVsQ2hvTE5hUU1HR0RzWWJLaXhsYU1CbW1zeDFRakNmZmx3VGZPL2dja1cwcnVaM2p1Z0tSM1I1VzloR1VXcUNneHVGZ3N1YUNIb3JvdEdLekdhZVpCOURNc2FUbktDcE10d1R2T3poWWswcmRyQXJLQ3FjYVdtVmsxK0YzNzJ1cjFZa0t4Z2F0SThRZmUxZ0lYOXdFOUZnUzhFU211QUJJWG5SVWJDYXBjS2Urbk83c2xDbFNaRnpwVi9Ma0xuY0ViMXFpTzQyZlMzUjg1NVN1Mm1DTGg2MnQxU1laWllWbUt3SUhqUkVGMnVpaFR6QjIwSk9rejdka3h6WVFuSzBVT1U0OTR3aCtWV1JjNlVuMmtwVGFWZ0xERkVrSi91aHpSY0kwWUtHZ3BHV09sb2NCVS9hNGZLb0ovcEVhTlY2amlwMytFczlWWFkwNzhyR25tQWRmN3Q5eWxQWFMzNFJCU3VZUHMxVWVjWlRVNzhXYW5oQkNIcFo1c0FvVHowTEdaS2pQZjlUUnlwcVdFaVR2T0ZnbEwxZkNFWTN3WS8rK3JiazdDOGJXZWJBNnA2b202UGdPTDJrcDQ0VEZKbFZOQlhhZTJycXFkWnp0T0pwVDg3R1FzRTlqcUNQSWU5VlJlWnVRL0NJZ2Fjc3laZENwSVNjU1lxY1prOHIrbnN5Q3poeWZoT3FIR09JdnJMa25DOHdUcEZjYVlpR0MvUlUxTlJiVWVVcG9jUU9ua1JwR09ySU9jTlJ4KzF1QTBVcnpoU1N0K1Z5UzNTSnBuRldrek5EcU9GR0lXY2ZSODZEbm1BUlRRMUhLSUwzM0V4UGllbWVPaFlTU2p6bFNVWlp1RTRUdmVvSkxuQlVPRm9mNktpeXNDYm5BRWNaZ2NVTlRET3drcVd1M1JXdG1HcFp3bEhoSkVOZFozbWlHejBsSmxzS25qYndxU0hRanB4bkZEbFRMTHdxSlBNWk1qZDdLcnprU0c3VnN4WEJaRStGOFlaa2IwMU9lMDB5eVJLOXBzaDVTWWgyOXlTUEtCbzJ5bE5odDdaa1puc0tlbmpLTkp1OVBORXlacGFDSHY0S3Q2UlFzTHZBVnA3TTlrSWltbUNVd0dlV3FMTW1HdUlvdFlNbVdOcFNhaGtoWnc5RnFac1ZuS0poc2pBSHZ0SE1zVE05ZkNJMDZEeC91M3ZmVVhDcWZzS1JjNG9GWTJqTXNvby83REpEd1oxQ3NJS25KdStKOWxka3BtaUN4UXgxcldqSStUOUZ3Y1dXek91YVlIMEhqN2tsTlJWV0VRcG1hcW9zYWtpR05URkhkalMvcW5VZG1mME5KVzV4c0wwSGhpbUNDWlpTUnptU1BUWEpRNGFhenRBd3Rabm9hYmViSitodENhWjdDbTUzNUJ5b3FYS2JYMVdSYzRFaDJNa1JYV3pJbVZjOTZDajRWZE9LVnhSODRWZFFzSVVNOFBzb291MmJ5Vkh5WkZ1cTdPOG90YlNRMlVBb2VFV1R1ZEFUTEdTcFp6VkxsWFZrUFUySmMrMjdsc3cyam1nNVQ1VmhiZUUzQlQwODNLOVdzVFRrRlUvT3NpMHJDNWxSbHB3UkhVaWVzTlMwc092bXFHTUwxYVJiUEF4VEpEOVpLdHh1b2IraGhsOGN3WUdXcEo4bnViN3Q1cDZjb1liTW92WjFCVGRhS24xallENmg0R0ZETkZ5VC9LcWUxWENYcGhYSE9LTFptdVJTUmRCUEVmVlVYUXpKbTVZR1BHR0pkdkFFcjdoSE5kR1pudUJ2cnBjaUdtb3BPTGY1TjB1Vk15MEZmWVRvSms5MHVVQ2JKdXBhVnBPNTNVSlhSMmJWcG9VMDBWMktPbzR6TUZyQmQwSnR6MnBhMGNsVDVRNUw4SXBRMTc3bVdRZWpQTUVKaHVRalMxMHJlZjZISGpkRWh5MVAxRVlSN0d0TzB1U3NLSlFZTGlUbkcxclZTY2o1bHlhenBxV0dsNXVCYlJXbDdtNml4R09PbkVzTUpSN3o4SjBuNktNbkNkeGhpTllRQ29aNkNtWUxuTzhvbUMzTWtXM2JrdGxQbUV0L1ZRUUhlakwzK2RPRTVGbFBkSy9NcThoWnh4SnRMeVJyZXBMVGhZS2JMWnhrU2I1VzUydll4Tk9hT3hVRjB5eE1VUHdCVFlxQ3p5MDFYYXlZSzBzSnlXQkxxWDBNd1U1Q3pveW1SelYwRWpqZVVlTGdEcFRvNmlqNDJaQXp2RDAxZEhVVVRQTFU5Nk1kTGJCTUU4bkZCbjd6SkNNdEpjWm9rbjhZb3FVMEZTNVdGS3luaUhvYmd1TWNtVzhOMFhrV1pqa3lOM2hxT010UzA4cisveFRCd3BaU1ozcWlWUlg4U3pNSEhqZlVORmpnSEVQbVk5UEwzeWtFenhrU3JlLzFaRDZ6L051em51QjBSY0UxVFdUbTl6UmdmVVdWSmlHNnlyemdtV1BYQzhFQVI0V3hobGFkMFpiZ1F5RXozcEc1UlZFd3dESkgybWdLcGpjVGlDT3puMWxmVVdBTkZiWjJCQThiYWxuRXdlSkM5SjBpdWFlWm9JK2lwcEZDenRFS1Z2Y2tSMmlpY2UxSnZoVnl0clF3VUFacGdzdWJDUGFVN3hVZTl2V25hT3BhU0JFc3BhbHlraEM5YlVsT01wVDQyWkhjYTZoeXJxS213L3dNUjhINVptZEZvQlZKYjAzTzRVTDB0U05udkllUm1rckxXcXJzNzhnY3JFbjJ0cGNib2gwVVBPVzNVVVI5UE1rNFQ0bm5OS1dtQ2pscmVmaEN3eFJOenRmbUlRVmRERWx2UzRtMS9XdU91am9aQ3M1WFZPanRLUEdva0p6c1lDdEZZb1dvblNQVDIxRGhlVS93V2hNMTlGY0Vsd3FOR09zcDlROE4vY3dYYWlORDFNbWVMMVE1WFJPdFlZZ0dlRnExYVRNc29NbWNyS2pRck9GUVRRMWZtQllobVc2bzhKa2pjN2lESlJUQklvNWtnSkQ1eU1FWUEzc3JDZzdWRkt3aVZKa21SQ2M1b2hHT0toc1lNbi9YQkxkbzV0YVpqbGI5WUFsR1dSaW1xYkNzb1k3SEZBWExhNUkxSFBSeE1Nc1FESEZrV3RSTm5pcVQ5VUVlTmpjRTdSVWxyQ0o0UjJDU0p1cWxLSFd2SlhqQVVOY0lUWWtlbnVCUkI4NFRiZWVwY3FUajN6WnlGSnpnWVFkSG5xZmdJMGRkVXdTNkdxV3BzS1doanE5Y1YwdkJBRU1OMnpucStFQmZJV1QrcENsWXc1eHNUbEpVNkdlSUJzakdtbUFOVHpKWmlJWXBnck0wT2E4Wk1qZDdOUDg3anhocUdPaEpsblF0anVRcEIrOGFFRTAwd1pGem5TSlB5SHhnSDNIa1BPc0pGdllrOHpxQ0h6VHMxQllPYTRKM1BGVStVVlJaeGxIRE00WWF2bE5VdU1vUnZlaVpBMmQ3Z3JNTmMyZytSYlNDRUt6bWdZc1VtV21hekZKeW9pT1o0S255aEtPR1J6V0phMCttb3lWNFRWSER6bjUxQXd0cWFwaGZrL2xSUTA4RlgxaWlxeFRCL2tMd2QwVnluS2ZFdkk2Y2Q0WE1WNWJNaFo3Z1pVV1Z6WVE2Tm0yQll6eEpidzNiR3RoRVVVTWZnYkdlb3JhZTZEeEh0Sm9aNmFsaFowK3l0aVZvSzFSNHo1UFRyT0VDVC9TdWdzZUVPbGIxTU1OUjRWUk5jSnkrVjFIZzlPTkNsU1pGWmpkSGxjNlc2RkJMZEpqYTJNQzVoaHB1MERCWUVZMVRGR3dpRkF4UlJDc1lraU05SlJiMEpOTVZrVzZDWllULzJFaVRHV21vOGsraDRGaERORTdCdnBwb1RTRm5tQ1Y1eFpLenZjQ2REbzdWVlBuSVUrSStSYzY4anVBcEM5ME13Y0ZDc0o1aERxeGdTY1lLcmVydXlRd1RxcnpvcURDbWhXaTRJYmhCMFlydDNSR2E2R2ZEdjUycktYV2hoMjhkeVphV1V2Y1plTVRCYVpvU0d5aUN0UlU1Sjhpdmlpb0hhRXJzN0prajYxc3lWelRUZ09jVU9ROGJ1RkJUWVdkTDVnM1Q0cWxwZTArd3ZENjNoZUFYUmZDQ0llZDlSYkNzcDJDaUk3cmFVT1lPVFUxM044UE5IdnBhR3ZheW80YTNMTFQxbERyVkVQVDJ6TFVsaGVCMVIrWlRSZktXSitkY29jTEpmaTExdnlKNTFsTHFKMFdEN3RSd3J5ZXpqaVY1VzI4dUpPOXF5a3pYOEpEZTJsSGwvOW95QndhMlVNZk9uZ3BYQ2l4dktkWFRrM3dyc0ttaVZZZFpJcXNvV0VFUmpiY1VORHVpYVFvbUdvSWJGZEVIbXN5V251UitJZXJpS0RWTG5sYXdseU5IS3dLbFNVNjMxUEtlcDhKNFErYXlqa1NMS1lMaGFsTkhsWXZ0dGI2ZkhtMHA2T0Fwc1o0bDJWZmRxWmtqdXlzeTZ5c0tMbGNrZjFLVXV0Q1RzMzlibUNnRXl5b2FzSVdsVmFNRjdtZ21XdEJUOEtvbDV4cEg5SUdsbG84Y0pkb3Bjdloyc0ltbERtTUlidERrM0tJcGVOaVMwOGxRdzExTkZQVHdWRmxQUDZwSjJndlJmSTdnUVVmbU5BdGY2R3Mwd1F4RHNLR2xWQmRGOHJDYTNqemR3TWFHSE9zSXRyWms3aEF5T3pwSzlWUzA2ajVGNDliMFZOR09PZktzM2xEVG9Nc01CZTlaV3RIRkVneFRKTHM3cXJ5Z0taalVubUNZb2VBcWVVNmpxV3VMSnVwNFdnaE9kdkNZSm5yU2tTem95UmttNU0yU3RRd1ZsdFBrZkNBazU4dEVUL0NTZys4TVVlY21vdE1FbmhCS2ZXQklac2cyaWhydU1KUWFvSW0rdGtUTEtFcXNwTWgwMHc5NWd2RkNRUnREd1RUMWdWRERTRVZkbHdxWmZ4b1FSYkswZyt0YmlCWnh6S2xwbnB5cGVqZER3VGFlT3Zvck1rL0lKRTEwaDlDcVJlMjhoaExiZTBwTXNkU3d2NFpiaEtpdm8yQmpEV2ZMOFVLSmdlYXZ3bHdiNUtsd2h5RTR1NFhrR0UyeXRaQ3puS0xDRFpacTQyVnpUOEhMQ3JwcnVGYklmT0lJTm1oL3FDZFoxWkJjNjVrTEhSMUJreWY1em42cE4zU3ZHS0lsRk5HcGxock85UVNYYW5MT01RVExDYTBZSkNSckNabS9DWm1yTFRtN1d6Q0s0R0pEaVdVZEZlWXgxTENGZzNOTWQwWG1DdUYzWTVySVRMRFVzWVM5em9IVnp3bkpvWXBTVFFvT2J5RXpyNGNGQk5xWVRvcG9hVS93a3lMWjJsUGhYLzVZOTV1bHhHVFY3S2poV3JPWmdsOE15VVVhZmpZcmFOak5VMU4zSVdjalQ1V3pXcWp3dG9hckhTVU9iR1lPM0dDSlpwc0JsbkpHUGQ2WllMeWwxR2RDQTI2MjVJd3dKRFA4R1VLeW1ienV5UGxabHZUVXNhVWg1ekZEaFJXRnpQS0taTEFsV2RjUWJPYmdGOXRPcU9zbUIxZHFjcVlKbVdzdEZiWlJSSTlwb29sbXFpTG5VMFBPdnhTY3BhaDJpU0w1VUpOemdTY1k1K0F1SWJwTzBZRDNOQ1crZExNc3pGU2RGQ1dHcUc2ZVZxMnVZVk5EZElDR0Q2VzdFUFJXWkVZNWdwc0U5clVrUzNtaWp6ekpubTZVcFVGWEcxaENVZVZvUzVXZk5jRnBibEVMTDJxcXJDdk12UmZkNDVvYWx2S1UydGlRNmVQSk9WTVJYYXNlOWlUdExKenRQeEpLTFdwbzJDUkRjSnduMnNXU0xLSU8xV1FXTlRDdnBWVXZPWmhnU0M0MEpEMGRPY3RhU3F6a0NSYlhzS2xiMTFPaXA2UENKMEl3U0pNMzFqM2FrUnhsUDdSd242YUdhVUwwcWlMbkprdkIzeFdaMitRMVRmQ3dwUUgzRzBvOTJVem1YNG8vb0pOUU1NU1FjNTQ3d1ZIaGRrK1ZDdzAxREZZRW5UeHpaS0FtNzRRbWVOTlIxdzZXekVoTksxNVZKenVDZHhRNTNkUlVEd3M1S3Z3Z0JNT0VncGNWTmUwaFpJNlJYVDFKZDBjeWo1bnNhRUFIZ1ZtR2FKSWxXZHNjNVVpMkVsclJSNmpyUkF0dE5NRUFJV3JUREZ1YmtaYW9rNy9Ba3pmSXdmdVdWcTBqSHp1Q0s0UWFidExVTVZQQjNrSjBveUhUU1ZGbHFNQUxpbEpmMlJmOGs1YWFIdE1mYXlvY0xCUzhMODlvS294cEp2bkFrRFBhMHFwNURBVVRIS1dtQ2NudGhsb3U4aUNLYUZGTEhXY0lOZDFueUl3WHFyU3hNTm1TczZLbW9MMlFyS3VXdGxRNVYwMTIweFE1dlJ5WlMxcmdGa1d3aGlPd2l1UWJSME9PVmhRTTlpUzN0aVhwNFJhd1JQTXA1dERsZXRPT0JMOTVNcE0wMWRaVEJNOXBrbjVxRjAxMHJJZUhGY0ZaaG1TR3BZcFRzSTZud2hxZTVDOXluaGxwcDVvcGh1UmI2V2NKRmxka1ZuVkV3d3hWZnJWa3ZuV1V1TkxDZzViZ2JvRkhQRGxEUERtbks3aFVyV2lJYmphZERjbHVqbFpjYW9rT0Z1cDRSaTFrYWNWNmptcnJLMWhOOWJHd3BLRUJRNFE2RHZJVVhPbW82VTVMcVFNNkVQeWlLTmpWa1BuSmtEUE5FYXhoaUZheTVFeFcxTlhWVUdxY3BZWWRQY0dpQ3E3ei9UU2xiaEw0cHBsV1hLZDdOWk81UVFGcmVmaFJRVy9OSE9zcWNJZ2xjNFVoV2tsUjhLMFF6YkF3MDhDQkRucGJncVhkZUQvUVVzTTRSWlhERkJXNldKS2UvbUZQZEgwTHRCZ2lxNTd3Rkx6bHlReno4MnFZeDVENVdKUDV5VkpEVzAxQmZ5SG5TNkhLTy9yZVpxSWQxV0dhNEhraDJrV29kSjhpNktvSVBsQWoyaFB0NzZDelhzVlI2a29QUnpXVGZLcUllbnRhdFlwUXcybWU0QUEzeTFLaW5kM1N3b09LWkRjRlhUd2w5dFdVNm1mZ1JrOWQ3MXNLdGxOd3Jqbll3NXRDNW41TGRLaUdyeTNKS05sSEVkM29hTUNGSHJhekJQTXAvdU5KK1Y3SXVkY1NiZU9JZGpVRWR3bDBWSENPWm81dDZZbHVFdWFDOW1RZU1nU2ZPeUtuWUdGSGNJZVE4NHlRV2J1SllKcFp3NUN6Z2xESDdnS25XcXFNOVpUYVhjTjBUZVloUjg0ZVF0SlQ3NkpKMWxSRWU3V25udnNNbVJjOUZRN1NCQk05bVYzbENVZG1Iay9TMlJBTXQwUWpGTkZxUXBXakRQUTAxRFhXVWREQmtYemlLUGpHRVAzVlAreklXVTJ0N2ltNDFGT2xveVd6bi9MNmRrVXkzVkxEYVo2YXBwZ0RMSFBqSkVzeXZKbmdXRVBVeVZCaUFhSENURVh3ckx2U0ViVjFlMWdLSm5paWNXb3JDMU1VclZqQjN1RGhKRS93Z1NPemsxRFhwazBrNzNxQ004eHcyVXZENWtKbURVZk9vbXFNcFdDa0pSbHZLWEdtb2VCbTE4VVNqVklrMDRTQ2x4VEI2WXJnTEFQTFdZSzlITFV0NWNtYzB2WUVTOEduVGVSYzZza1piUWtXZHhSc0ljeUJSengxRGJUazlGYlUwY2FUUE9nSkhoSktuT0dJVmhRcXZLbW8wbGxSdzlzYWJyWmtEdGRnM1BxYUtpOW9hdGpZOEIrRzM3MXBhTWc2K21aRk5OdFEwNG1XQnEzcllMT210V1dRcDhLSm5weTlEZEZlbnN5amRxWit5WTQwVkpsSDh3Y2RMekM4UFpudkhNRlVUWlVyRFRrTHlRYUd1czVYNUx6cFlBZjNpK2UvWmxocUdxV2hoNk91NnhUUjlaNm9pNUFaWnRwN01qMkVFbThvU3B4aVlaQ0hVLzFmYkdkTk5OUlJvWk1obWlsRWIyZ3FIT0VKRHRYa0hLL0puRzZJcnZiUEN3VjNOaE9OVmRTMXRoQk1zMVQ0UU9CY1RXYTJJemhNazJuVzVLeW45dFhVdHB2OVJzRzJtc3hrK1pzUXpSUWFjSm5jcGdrZTArVDh5NUZ6ajhCaUdvN1hsSmphVElscFFzN0tGanBxR25LdW95RVBlSUtuRk1rWkh2b3BnaDgxeVN4TkZXdkpXY0tSczcwajJGT1QwMTJJbGxFRU8xbjRwRDE1MTNZZzJzc1FQT1RoT2t2eXJxSFVkRVhPU0VzaWhtQmJUYktYMWtMQlBXcVdrTE9xSmJqQjNHQklabW9hOHFXbDRDRy9pWjdvaUE3MlpMN1RKTmVaVVk3a0ZRZnREY0hIbHVCelJiQ2Vnek10clJqVlFwWDJsZ29QS0tMSkFrY2JNbDAxWEsycDd5aEw4cENCYlEzQk4yYXZKZ0t2dHRjcldESzNDaVVPVnhROFpQK3BxWEt5SXhubUJ5bUNnNXZKak5ma1BLNCtjOGNJZks4b2NWdDdrbWZkL0k1U1IxaEt2Q3pVdGIrbGhnYzAwWmFPNkN5aElRUDFVdjR5SVpqbG9hZDcyUFhYME9JSnZuRlUrMFpmNk1oc0p3VGZXMHIwVXdRZlc0TE5MWmw1SEsyNjFKQ1o0cW5CYUFyZVZBUzNXcmpWMExCbk5EVU5ORFRvQ0VlRmZ3Z2NiNGdPRXFMUmhpcldrZXhyQ0VZS1ZWNzExRExZRUUxWEJFc3A1dHBUR2pvcmtvbUtZRjlGRFh2N2ZSM0JHd2JldHRTeG55TDUzTUJQanN4RFpqTWgrVlVXOU5SeHExRGhWaytGU3hRY2FHalY5UGF3djZlR0J5dzVxem95N3hrNFJzT1NocWpKd1dLZS8xcEVFZnprb2JlRC9kUUptcHFlZGN5QlR5MnNyNG5HTlJIMGMwU1BXVExycUFjME9RY2IvZ2VtS2dxdWNRVDd5U1dLQ24yRVVvdG9DdnBaY3Q3Uk8yc3kvUVcwSVdjWGQ3cFFSUXlaVndUMlVTUk84N3VoamlvVExLVjJicnBNVWNNUVJiS0gvTjJUK1VsVHBhTWxzNmNtYzZDQ055M0pkWVlTVXp6SlE0b1NEM29LTG5jVUxPaUp2akJFQzJvcW5DSmtKbHVDWXkyWlE1c285WVlsWjFWTGxRVTFtWEVXMWpaRVJ3ai9NVVNSYzI0VGRleGxxTEtmUUJ0RFRTY0pVVjhGc3pYQkVZNWt0cEQ1VXI5aFlCNE5iMWlpa3czSm9ZcGtLWCtSb2RSS0Z0NTNNTXVSbktTcFkzMVB3WWFHYUlMaDN3eEpHejlUa1RQRUVUeG9DV1pyZ3ZPbG15TXp4RkV3VkpFNXhaS3p2eUo0V3hFYzE2R2Q0WGUzV2VxNFhIMmpLUmlrcU9rR1E4N2hRbkM3d0JtR1lMQW5lc1gzTStTODdlRkFUYXV1TitRY3JoN3hJeFhKYlVJZE13M0pHRTN5bENXenJpZWFxQ240emhHTTE5VFEzejFvSDFBWCtwV0VxSWM3d05HQWtVTEJvL1p4UmFWOU5OeWg0QnIzckNIWnpiem1TZmF3QkwwZE5Sd3BXMWtLOW14UFhSOXBvdmNkckdTWks5YzJrMHh3Rkd6anVuaUN0UlNaQ1o2Y2NaN2dha3RtZ0FPdEtiRy9Kbk9rSnJqY1FUZEZNc3hSUTJjTFkzV1RJcmxDdzFlV0tuOFI2cHZ0NEdGRHNvM1FvTDRhM25MazNHNkpydE1FM2RTZW5weDdQTkZUbWdhMEVhSlRMUTA2MXNFZVFvV1hoU285TFRYc2FTam9KUVJYZVpMdERjbGJDcll6ZnpISGVhS2pIQ1ZPVWtRSE8zSmVFZXByNTZtaGl5YVlZS2pqTlUrRmVkMXdTNVZsaFdTcUkvaFlVZERPa2F4aUtlaG95T25yQ1Y1eUJIdGJXRnFUSENDd3RwRGNZb2xlc1ZSNXlVelRaQmIzUk5NZDBkNldQK1N2aHVCbVJjR3hudVF6VDk1SUMyODVjcjQxY0xHUTZhSkpobWk0VE1HZW1weGVpbUJSUXcxdEZLVis4amQ2S3V6b1NUcXFEeHpSdHBaa3VydktFSHhscVhLUklqamZVTk5YUXNOT3NSU2NvV0ZMVCtZZVJaVkQzR1JOME1kUWNLcVFqSERNcmRHR1Z1M2lZSnBReDNXR1V2ZmJteHdGZlIyMFdCcTBvWVk3TE1GaGhnWXRyOGpwYUVuYU96amF3V1dhVFA4bU1yMHQvRVBEUG9xY254VEJJNW81OEw3dW9Xbk1ycG9xUHdnVnJsQVVXRStWK1RRbDlyYXdveVA2UUdBbFF3MlRQUlgrWVNreHlCQzhaNmpoSGtYQmdRTDdXSUkzRFZGblJmQ3JCZnhld3Y5RDZ4c3lqeXM0VmtoV2I5cFVVNjI3SmxsVjBZRE5ITWt1L2xkTk1NWERFbzRhRm5Ba2s0VTZmck5FVTRYZ1pVUG1FS0hVbDQ0S3J6bVlhbWpBYmgwSkZ2R25hVExQdTFzOWpQQ3dqRnBZaU43ejFEVE9rL25jMDdDZkRGem1DZjdpK2JmTkhYaER0TGVCWHpUQlQ1cmtNdldPSXhwbDRFTWgyTEdKQnUyc3lEbkFFeDJuYUVoSERXTU16UFpFaHlneVMxbVM1UlRKcjVaa29LYkVVb1lxcjJrcWREVUU4enRLN09hSW50SmtGcklFQ3d2OExKVGFWeDVYSkU4NmdvOGRGZVozRk4zcmphYkNBWXBvWUVlQzl6ekpWVUxCYm1aaER5ZDdrbzA5eWRwTlozbm0yS2VlNEZQUFhIbllFRjFucU9GRUMwOExVVmNEdllYa0pIVzhnVGFLQ2s5WUdPZUlKaHFpRTRUb1BFZXBkcDdJV0ZqZHduV2F1ZkdNd0pKQ010VVRUQkJLOUJHQ095MnRHR3JKVEhJd3lFT3pwNmFQek5NT3RsWmtEdmNFV3BQNVNWTmhma3ZEeGhtU2F6VEpYWXJNOVUxRTB4d0ZWd3FaUXd6Snh3NitrR0dHVWoyRmdsR0dtbmIxL0c1MXVkUlNNTmxUdzZHR25DY1V3VmNPcG1zcVRIYTA2bzcyc3cxUkwwMnA5ejBWYm5NTE9hSVgzUUthWUtTQ0ZRekJLRVVOSFRTYzQ4azUzUkg5d3hHTXRwUWE1S2pqVzBXMG42WENDQ0c0eXhOTmRoUTRSNGwxRmYrMnNTZDZVRkhpSUVPeXFxRmdUMDFtRVVNRCtqb3k3NWpQaE9BK29WVkxtMzA5RlI0eVZPbHA0UmhMaVNjTm1TbWFZRjVQdzBTVHJPSW9XTVNSMlVrUlhPTXArTTRTSFc4bzhab2k2T1pnaktPYUZhcjh6WkR6a1d6dktPamtLQmptQ1hieThKYWhoalhVTFk0S2x6Z0tMdkF3eFZHaHZ5ZDR6eEIxZDlUMHBpYXptS0xDVlpZNXNLaUQweTJaU1lya1VFUFViSWsrZGxRNFNKSFRSNTBrMURQYVVXSWRUWlc5Tkp3bkpNT0VDZ2Q3b3UvTW5wcE1KMDJPMVZUNFdzaDg1TW5aemNGVG5ncFhHS284NHFtd2dLYkNML29yUi9TekoyY3JBK3Q2TXA5NEt2eEpVZUliVDNDUXUxdUlkbFFFT3psS2ZTM1VNY3JUaUZtT3Vyb29jclpyVDJBY21hbU9LZzhZb21lRUttL3JsVDJzb2NpTWF5YmFVbEZodXFIQ00ycUlKK3JnNEVjREZ5bWlEU3h6YUhkUGNwRTYycEQ1a3lNNVNCTW9BMVBhVXRmSXRoUzg1aWcxVlBpUFBZWGdZRU1OazRRcTdUWEJnbzdvVDU3Z1BVZHdnQ0h6aElWRlBGVTZPWUp6SEFYOW01b05yVmplRTYxbWlEcnFRNFZTYTFvaVVSVHNLSEMwSWZqTndVMld6SzZlcUs4aldsbjRnMTVUVkJucW1EdGVDSjUwMVBHQW9jSmhocWpaZHRCRUI2bG5oTHJlRkpLeG1sS2JlR3JxTGlTVGhWSWJDZEd6bG9hc2E2bHBNUVhIQ01FMmJvTHBKZ1Q3eVdhZW11NndCT05icUdOVlJTMFBLSUw3TGNrYmptUXRSN0s4STVxdHFlbCtUL0NoSlROSUtMamRVTU5JUnl2T0VrbzlZWWwyY3dRdmVCaWtDTmF3SktjTEJiYzcrSk05Mm15c052ZC9GcXA4YTBrNkNORWU3Y25acnhsVzB3UVhhWGpha3RuUndOT0daS1lpT053UzdhMUpWaGVxM1dnSkhsUVVHS0hLbXA0S0F4WFIvVUxVUmNOZ29hNHpoS1NMcFpSM2t4UlJiME5tRDBPRm4rVUNTN0N6STFuYlA2K280eDQ3UVpFNXhSQ3QzWmFnblljdm1wWVFrdFhkazVZS1hUekJDNTdrS0VlMFZWdWlTWXFhcHNzTVMzQzlwMkNLa0hPZzhCOFBhOHA1YXRySXczcWV6SVdhbk1HYTVIUkRORjZSTTl3Y2FjbDBOK1E4Wjhoc0lrU25hSUlkSFJVT0VlYkFQeTF6YkNraE0wNjJGQ0p0aWY3UFUrVXRvVlh6V0txTTFQeFhPOGNmZHJ1aEZRL2E2eDNKS1lhZ3ZWRGhRRXROaXlpaVNRN09zdVJzWlVrdTBDUk5EczRTb2c2S0tqc1pnazJiWUpxaWpnc0Vlbm9LZW5paW5SWEJuL1UzbGdwUGR5RFp5blF4OElpaW9NbkNlcDVLeThtakdzNld0eTBsMWhVUVRjTldzd1MzV1JwMmtDTlp3Skc4b21HOEpwaFBVYUZiQzhsRWZhYndQN1Z0TTl5b2FOQ0FqcFI0MVZOaHJEOUxrYk43MjJ2MENvWk1CeUZ6aGFXK015elJZRVdGRFF3TjJNNC9KaVQ3NlB1bGpUM1ZVL0EzNmVhSVRoYitSOW9aR09BSjl0ZXdrZ0d2cU9NTlJXWWpUL0N3dTk5UThMcURFNFRnYkxXeEoxamFEREFFUnNGT0Zyb2JnalVzQlNjYWd1WFU4a0ttMlJMMTl0UnlwU0huSE5sSGlJWnFndWZzNG9wZ1FkVmR3eEJOTkZCUjZrVkZxYjhvZ2ltT3pCNmE2SFR6cmxESEVwWWF4amlpQTRUTVFvYmtEZzJ2ZWpqZndKR1dtbmJWRkF3M0gzaHEyTnlRZkc3aHo0YUMrdzNCYndiZXNHMHN3WWF5dnBBczYrK1JpMVZmeng5M21GQ2h2eU41eFZIVFMrMHA5YXFDQXh5WjZaYWNaeXc1Kzd1dVFrRlBSOUREazlOT2lFN1gxUENZSlZqVlVxcTdKbHJId1dBTEY1bmZITkdqQXBkcHFneng1T3dpbERoQ2lEWVRnbmM5d2FHVzRCZExOTlVRdk90cHpET1dIREg4RDdUUi9BLzg1S2xqRVF1M05SRWM0UGwvNkIxSGhjOFVtYjVDc0tNbUdDOUVQY3hvVDJhbXdITkNtZU9Fbk9QYmtsbk1rYk9nSXZPNVVNT3BRclM5VUdWZHQ2aUgvZlVSamhJL1dPcGFXOU9LTFlSb2Q2SENVRWRPWDAwMHdwRFpRNmh3ZzZMZ1pmT3FvMVJmVC9Dckp6amVrWE9HaHBjMVZXNzFaTGJYeXlwKzkzSUxiQzFrUHRJRVl4MEZJeDFWRHJMb1Z6WFJLUllXazgwOXlZbEM5SW1jcmlueHRhYktuelJKazNsQVUxT0xFTjFqMnpyWXpyMm15SFJYSkZmNGg0UUtUMXFTVHpUQjUrWk5UelRSa0F4WDhGY0xWMnVTOGVvUVEyYUFrRnp2Q003MnNKSWNKRVQzV1BqUms1d2kzMnVTUzlyZlphanBXRXZqOWhXNDJGNG81Tnl0U1hZeThJS0hheTEwVllkcmNsNFNrcXNjclhwTXd5R09ndGthamhlU3hkUXFtcHhQMUwzdDRSNVBxYXNGbnJRRWp5dHE2cWdwOVkwOVF4OW80UzFGemhVQ24xa3lIU3pCV0xlbW9TR3ZPcUxOaFp5QmptQ2FBVVlwTWd0NENrN3dCQk1Nd1dLV2dqc1V3VGFHVnN4V0MxbVlvS2l5cXFlR0tZcW9uU0lSUTNLSWtITzBwbUF4VGRCSGtiT3ZmbGxmcitBQSs3Z25jNTBodVZLWUszOTNGT3lnN3JiUE8vaXpJN2hFNENuSEhIbkowb2dOUFJVR2VVcHNyWlpUQkpjcm92VWNKZTUxQlBzcjZHa0pkaENDc1o2YVR0TUViMnBxV2txZVZ0RFhFL1FWZ2dzVS9ObDg2ZDlSTUYzRHh2WlRBNThhZ3U4MTBSV2F3Q2lTenpYQmVVM01NVzlveUpVZWR2TkV2UXlOdTFmMTBCU01kZFIxdmFMQ1lwWWEvbUdvY0xTaVlEY0xiUXo4YU1uNWl5RjR4Qk5NczFQMFFFT1Y3bzVnYVdHdXpTZUx1ZTR0dDNybzd5NFRnbTRHL21vcGRaZ2w2cTBvNkt6SldFM21Na3NOcjNyK2E2Q2JUOGc1d1pOelQ5TzdmaS96cGFPbW56M0JSb3Fvcyt0djl6TWJkcHhzcURCT0Vld3RKTHQ3Y2c1d3RLS2J2bGRwU3pSUkNENDNWRmhlQ0k3eVpMcHBnZ01WQlMvS01BZEhPREp2T3dxMk5RU2JLS0tQTGRGV1FzN0ZxbyttcGwwMUpYWVJncThkbkdMaFRpRnpxbVdzVU1kcGxsWmRiS2x5dlNkWXhoSTlZZ2hPdHhSOExnU0xXSEs2Mm1HR1ZveHpCRThMTld6cUg5Q1Vlc1F6Rnk1UlF6VGM1Nm1oaTZmZ1hFV3dwS2ZFNVo3TTA1WmdaVVBtbzZhdWl2OFlLekRZd1dCTE1FckliS0hKdk93SXJ2RWRoT0JjUTlKZFUxTkhRN0NYbjJYSURGQktVMldBZ2NYOVVBVXpEWFdkNWFsd3V5SjQxWjlyaktMQ0w0YUNwNFdhcmhQbTJySCtTYUhVWUUwMDFKRFoyWkF6WFBqZE1wWld2Qzl3bXFJQjJsTGhRMDFENWpPMDZoZ2hXTW5kYk03eVJKTXNvQ2oxdllibkZRVnJXOWphazNPbEVKM3MvOTYrcDMzZEVQUlY1R3hpcWFHakl0aFVVNkZGRVp5cUNhNXFKcnBCZHpTdzk1SVVuT1BJckNVVWpSWlFGcmJ3NVBSMFIxcWlZeDNjYjZucldVTXJCbW1pQlF4Vkh0VGV3NUlDUC9pcDZnNGhlZC9Ba29iLzMyd3ZCSHNJT1g4M2NJOGhHZU5lTlBDSWtQbVhlOGZQS3g4NE9NU1JNMU1UZFhTd2pDWjRTMzBqVkdodnFUUmFrL09WaGdHYXpIdU9DdWQ1b25FTzFsSnI2ZWNWeWFPSzZIN3pxbEJsSWFIRTBvcm9DZ2Z2R0pJZFBjbWZMTkdManB6N2had1pRcFViRk1FMEExY0lKYTdWTk9Sa2dmc01CYXRiS2d3d0pNOWJTdlFYZU5PdmJJamVsZzZXV3ZvNWt2YkthSkpOSGV4a0tOSEw5eFJ5RmxIOFRpMnJpQjV3VlBoVWs3bkdrSm5vQ2U0MjhMUi93UkdkWUlsbVdlYkN5eG91MXJDazRnL1NodWdCRFgwVjBaUVdraDBkT1ZzYWdrTTB5VjZPb0xkNXllK3BSbHNDcjBuK0tpUXJHdXE1eUpEenJUQVhIdExVTWR1VERCVktyU20zZUhMKzZpanhoRkRYOVo1Z1ZVL3dsaUhZVE1pTUZwS0xOTUV5d3U4MHdkM21lb0ZtdDZWYlJNUGVuaHJPYzZEVmU0cGdYVThEbm5IYWtMT0lJcmxGNEZaUEl3NlIrenhCUDBkeXE2T09aNFE1c0xLQ2N6MDg0b2srVnNNTXlRaE5abW1CZ1g1eElYT0VKVG1pN1ZzR1R2TVROZEhIaHB6ZGJFOER1Mm9LeGd2QnFRS2RERG5URk95bENGYXhSMXN5ejJpcXJPSS9GRXBOYzNDNmYxMS83K0FTUzZsMmlucTJjaVRyQ0N6Z3llbXJDTDVTVlBqUWtkUFpVbUd5MmM5U3c5RnRSMXNTMzBSbXNLUENTNHJrSUMvMlUwTWR1d3VjWW9sR2FQaktFeWh6bWlQWVhhZ3lXYll6OExXQkRkelJpbUFYenh4NHo4SzlocHpsaExxK05pUTk3SHVLb3JNVWZLL09WdkMySmZpSFVQQ1FJL3E3SjJnaksrdFRETnhrQ2M0VE1zc3FDczRUR3RMVndRaWh5b0FXZ2o5Ym9zVTgwWEdXNkFjOVRKR3ppYVVoNStobkZjSE9ubGFNMWlSbjI5TmFxR0VOVFRUU1VIQ0gydFdUZVYwb3NVaEg2cHN1VkxqUlVtR1dobTZPWkVzaEdlTm93QUJIY0oyQnB5MlpzelJjS2tSWGQyUXVLVkVlWG5iZmFFcTgyNUZndXFmZ2ZFMndobENoU1JNZHJvbitMQVRUUFEyWjM2OXQ0QjlDNWdzL3lsenYrQ01tZXBJRFBjbEZRbDEzVzByc3BQZDFKT2NiZ2hHT0V1dHFDdjVxYWNVUlFsM2RES3l2eUpscUtYR1BnY005RmZhd0pBTVZtZGNzcGNZS09aYzRHakRZa0ZsSzA1b2xOTUh5SG40ekZOeWt5T3h0OTlSa0hsZndtaUhvNjBsMkVLSSttaHJlRUtwMDgwVGJ1ZzA4QlZQY2dvcUM1eld0K05MRFRaN29OU0Y1MU4xcWllN1ZhM3VDQ3d5WmJrSU5mL05FRDZqek9zQmRaakZOOG9xRzN3eFZ1bnFDU1lZS2YzRWRoSnlmOVlXR2Y3dFJVMm9IM1ZIZ1ByMWZlNUo5aE9nSGQ3eFEweTdxQndYcjIzYUdFclAwY202NEpWalp3c09HcUwrbWhOZ1ptaEpMVzJvWTRVaGVkc3lCZ3pyQ0tycTdCbWNwTlZoUjZqQlBxNjRWZ2kra242WEU2OHBwOEo1Lyswd1JIR09wc0tlblFuOURabnRQempSTFpwREFkRDJmblNna0c5dG1JWG5Vd1E2V1ZpZ2hzN1lpMk14UTBOM0NxWWFDWGtKMG95T3p0TURKam1TU3BjcHZscmswUk1NT2ptQXJRMDRQUlYxRE8xRndoQ1ZhVVZQcEtVTTAzSks1U3hQc0lXUnU4L0NHSGk4VUhDaGlxR0ZEVGJTUkpXZVlVRERjSDZ2SldVeFI0azFGWGJNVXdWNmU0QUpGWFM4b01xc1pLcXp2WVE5RERRZFpja1k0YUdzSWh0bHViYmQycjNqNFFCTW9UYW1kUFprN08vQmY2MmxhY1p3bmVOalFvR2NkVlU3ekpPZDdnaHNVSE9rb3NhZ2ljNmNuV2M4KzRnZzI4NVI2elpQNXMxL0xVYkNLSXpuVHdLMzZQa2R3bE9ybDRVMUx3ZmRDQ2ErSXJ2RmttZ3cxUENBVVhLV28wc1VSWFdjSTJtdUtKbGd5RnpoeW5DWTRSQk9zcUNqb0kxUjV6UkVjbzBuMlZ0MDlCUXRZU2l6Z0tOSGZVbVVyUTVVT0NoNTFCRmNMbVk3dW1oWXFYS1FvbU9vcDhiVW5XTk5RY0lpQmNZYUM2eHpNTk9TOEpRUWZlcUtCbW1nbEIrOTdvay9sZmszeWdhSFN5WmFDUlR6UnhRbzZHekxmYTJqV0JQZXB3K1VtVDdTUUVKeWl5UmtoQkxNVk9mY29NamNLMGVaQ2hmVU56RkFVekNzRU41dlAvWDF1UC9uL2FvTVgrSytudy9IanIvOXhPbzdqN1BqdTYxdExjZ3ZKcFRXWE5iZk41akxwaTZWZkNPdmlUa3RLbEZ1c1FpeGRFS1dtRUJVS05hSXBqWlJTU09YU2d6YWFLTGRhYnJtMS85blorL2YrdmQvdnovdjkrWHkrelo3UFJvcllvWnF5THJDd1FkRUFpeHhWT0VYTk5ualgyblVTUmxrcUdtV293azhseFI1MEpQeTlCbzZxSlhhWHdOdlJFQnZuVGhQRVByZXdyeUxoY0FuajVXRTE1RnFpOFc3UjFzQXVFdTg2UzRFTmlrSXRGTjR4a3Y5QWY0blhTblVWY0xpQTl4emVzRnBpdlJSVmVGS3RzTVJhS0JodVNiak9FTG5BVXRsU1FVcFhnZGZCNFoxb1NibkZFZXRiUTBJckFlK1krcHFuRGNFSkZqNlM4TERaelpId1k0ZTNYT05ObEFScmFvbU5FdDJia3ZHc29zQTNpb3lIbSs2akNNYkk1OXdxdDRlZWFyYTI4SXpFbXlQZ29SYVVPRURoVFZkRUpobUNvVFdmQzBwOGFOa0NwMG9ZcWloMmlxR2k0eVhlTWtPc240TGRMTG5tS2ZoL1lvZ2pOc1BlYmVGR1I0bTlCSkhMekI2MVhRM0J0cElTZlMyRnVnc0s5RkF0TFdYMWRDUmNyQ25VcDQ0Q056dUNvd1VabXhTUmdZYUU2WmEwVzJ1L0U3Q1ZYQ2lJL1VPUjhhQW0xK09TeUUzbU9VY3d5YzF6QkJlb1gxa2lLeTBaZnhjazFHc3l1bHRpMTFpODNRVEJGNUtnM3BEUVRoRk1WSGlQU2xLKzBjU2VkbmcvVmFTOGJPWmJ0c0JjVGNaQVI4SlA1S2VxUTFPWUtBaTIwbmpkTk5ScGduc1UvL0srSm5hWEphR1RvbXI3YVlJcGhvUm45YWVTaEpXS0VxOUxjb3pTRjdRbGVFZkRJNUxZbTViZ1ZrRmtSd1ZEQkNWdTBERElrR3VwbzhUWkJxKy9wTVFVUllFckpRbVBLR0tqTkRrV09MeDdKZDVRaXpkVXdlSWFLcmxQN1N3SkRoWnZPTmpMa09zQkJYOVVwR3hueWRoWGtmQkxROEl4Z29qUWJMRm5KZjgxSnl0U2xqY2xZWXlFRnl4MGtWQnZLV09GSm1PTnBzaEdBY3NkdVFZNWdpVk5DVjUxZU9kSllvL3BMaGJ2TTB1REhTZXZOS1JjcktaSXFuQ3RKZUVzTzk1Um9xY2dHSzRvY1pjaG8xdFRZdGNadkg0MXBOUTd2QTBXcmhJZk9TcmFJSW50SUFpK05YV0NFcmRia3ZyV3dqUkxydDBOS1VkTDZLU09zY1RPZE1TT1V0Qkh3TDZPTEEwdk5TZHluYVdRRW5DcEl2S2FJckpKRWJ2SGttdU5objZPak04VmtTR1NxbjF1WUpDR0hucTlJM2FMaE5NRTN0NkdqSWtPN3hyTkZ1bXB5VE5YL05yd1g3Q3JJUmlxcVdpakk5Sk80ZDFpaWV5a3lmaXBvc1FJUThZampzamxCaDZvSFdid1JqZ1lKUW4yTmdTbk55Y21KQWszTmlYaHg0NFN4eWtpaHhtOHliVXdUMU9WS3lTYzd2aTNPWFZrZEJKNEF5WEJla3NEWEcwSWhndFlZMGxZNWFoQ0QwZWhib3JJazVhVVdSSnZpTUE3WHQ1a3lSam9uclhFTmttOHlZcWdzOFZ6Z3JKbUNsSzIwdU1NM2pSSjBGaVFJQ1FGOWhkRVRsTFFXUkliNWtpNldEZldSUG9idk82YTRHUDVtY09yTnpERkVMdFRrT05MaDlkWEU4eHlwRWc3ejhBOWpraHJRNkZoamxnL1FWa3RKWHh0NFdYelQvMDNROElhUVdTcUl1RXZsb1EybXFDOUpmaTd3UnVsNFJYM3BTUGx6cG9WbG1DdEkyanZLSENGaGpjTTNzTjZscUY2SHhuS2VsTGpYV2J3cnBSNHh6dUNyVFVaeDJxcTlvQWg4cDZpeENVR3I3OGc4b3lqUkF0QjVDWkZ3aTgwVmVyVnBJMGgrSWVCeGE2Wmc2a1d2cERIYWlvWVl1RXNSYkRDM2VPbUMySnZHWUxlaW94R2tuTDJVQVROSk42aG10ajFEbHBMdkRWbW9jWWJyR0NWSktPcmc0WDZEZ2RkTEEyMDNCS01GbmdkSkpGdEZkN3ZKTG02S0VwYzV5alFya2s3TTgwU0dlMzRYMjRuU2V4MVJhNU9tZ2I3MUpLeWc4U3JVM2kva0FSS3dXcEgwa09HaEtrT2J5ZmQwWkdqdnlYbEFrVlo0eFJiWUoyaXJGTWtGWTFTd3lXeHIyb280emxOaVYrN3ptYXdlRnBUNGtSM2thREFGVzZ4cFNxekpheTA1RnRZUjRIbVpoYzlVeEtiYmZGMlY4UkcxTUJtU2FFK2ttQzZKbmFSWEs5Z3NpWGhKSGwvVTBxTTBXVGNieWh3a1lJdkZHd2pTYmpmd2hpSnQ4WlNRVStCZDUrbWFyUE1Pa1ZrRDBtdXhZTElmRXVoaDYweC9KOTJpdGd1aWhKU0VNeVNWUFFuVGV3bkVtKzYyMHJUUUVNc09mbzQva1AvMEFSdldqaXRscFNYN0d4QmdjTUVzZDNFRWVZV3ZkeXRkK1NhYXdpNmFDSWoxQ2tHYjZBajlyd2h4MTZDZjN2QXdGeTVweUxoVm9uWHp5NTFGRHBkRWJsYmtkSmJVY0VQREVGelE4cU5taHp6TFRtbUtXS2JGQ1hlRXVSYWJwNnJ4YnZBdExGNDQyUWpRK3dFQTllTDF4U1I3UTBKWHpsU0hqSjRleHE4OXlSMGxhU2NKL0ZXNno0YTczcEZNRWZEaVJadnV2aWpJdDg2UmFTRk9sMDFyaVYybUQxVUV2eEdrL0dlZzVhV3dHa2kxemdLUEc5SjJVOFBFZzhxWXZNc1pleXRpVFJYQk1zbENVOEpTbHhpOEVhYmp3VWxkbEROTGZ6VFVtQ2d4V3NqcVdDT0hhdllBcXNrbktGSU8weVE2MVZMNUFWRnhrNldoRWFDQWtkSmd0OWFTa3pYbEtOWDJqRWE3OXdhWXVjN2dxME4zR0RKR0NCaG9pVFhVRVBzZGtuQ1VFMUNLMGZ3c2lheWxTRjJ1aUR5TzRYWDNwRmhOZDdSNGl0RkdjMGsvRWxCWndXdnErR0M2c3pWZUVvUy9NWitxeWx3cEtOS3Y5WjQ2OVVPanFDandsdXNpY3lUeEc2VnBOeGNROEluY29SNFJoTGJSK05kcEdHbUpXT2NJekpHVXVLUEdwUWc4cnJHMjFkT01xUXNzSlE0UnhINWphVXFuWnVRMEY0UStjanhMd1B0cFpiSUFrM1FUSkhRV0JFNVMxQm9rb1Z0RGQ2bGhxcjlVcEhTVXhNY0lZbDlwb2pzYjhoNFNCT3NNUWNxdk9XQzJFOEVWZWhxaUoxaHJyQUViUXhlSzBOR1owR2txK2d1U1JnbmlNMjNiSUhWa3F3eDRoaUhkN3NtYU95Z2x5SXlRdU05NzhqNFZTMDhKL0EyRzFLZU1CUm80ZkJhU05oS1VFWmZRZXdWUS9DMUkrTWdmYkVsZUV6Q1V3N21LWEkwTTNoZDFFRVNWamk4eDV1UTQxbnhzMXE0Uk1KQ0NYczdJcTlhY3B4bjIyb1NEblEvc0pUeHNDYkhJWVppTHloWTA1VFkwWkxJT1FyR2FTSkRETjR0OHBWYUlyc3FxRmRFZWd0aXpjMWlUZXc1UTRheUJETVVzUU1rWG9jYVlrYzBoWnVhNDEyc2laMXJTWGxSNDYwelJKNVNsSEdlNWo4MDFSTE1sSlR4dGFPTTNRMXB2eEo0NXpVbFdGRDdyc0FicGZFbTFKSHhHMGVoOHcyUjdRUVZ6QlV3MjhGaEZwNVFaenE4dDJyeDJqb3F1bFlUV1N1SmRUWWZXd3FNRk1jb3ZGbVN5SlBOeUxoRTRFMTBwSHpZak9DM2h1QXJSYTU3MVpzR2FqUXBReDM4U0JQNXB5WkI2bE1VM2toRG5wME1CVjUxQkU5bzJFK1RZNU1sMkU4UzdDMG82dzF4dkNaamYwSGtWRUhDekZveU5tcUMrOXdkY3FOK1RwN2pTRGhlRTl3czhZNVYwTkpDbjJiazJ0cVNZNG9rZHJFaHgxaUROOGNTdWR3ZXBXbUFHWEtjSlhLNjVIOXRvOGpZUVJIN1NCRjAxRVNVSmRkMFRheVZJbmFXaExrT2psWEU1aXJLR09uSTZHU1dHQ0phNDgyekJJOXJDcjBqeVRWY0V1enJpQzF2Y3I2bXdGR1NpcXk1ek13eEJIL1RKSHdqU1BoTDgrMDFrYWFTVXVNRktUY0xFdmFVZVBjclNtd244RFpyZ2lrV2I3Q0dQeGtTamhRd3JSazU3dGN0bXhMc2I5c1p2TDlMU2x5dVNMbFdrcU9qd2R1bzhiNlV2MURrbXVkSWVGRjJkSENneFZ0azhkcEl2SHBCeGhFT2RoS2s3T0xJVVNkSitjU1JZNTdCKzBEZ0dVVWxOZnB0aFRmR2thdXp4cnZUc1VVYUNWaGxLZXRlVFhDb0pEQ2EyTk9LaE9tQzRHMUg4SkJkNE9CWlJlU1JHa3FjYi9DTzFQeUxKVExCNGoxcThKWWFJdXRFalNMWDhZS00rYTZwaGRNc2RMRlVvVjVSVG05SlNrdUROOFdjSW9uME5aTU5aV2gxcThDN1NKRXdWNUh4cm1ublRyZjNLb0pCbG1DWUkyaWxTTGxmRXZsRTQwMTFOTmdqZ3RoekV1YTBvS0s3SkxFN0haSGxFbDYwQkxNVkZld2c0RVdOdDBUaHJWTkVWa2tpVHdwS1hTV0p6ZFJFTmd2S0dxNEloanNpZXpnU0Z0c2ZDVXE4cWtpNVMxTFJRZVlRUTRuZW1tQ2tJbVdNdzN0RlVvVUJaazROT2VaWUVwNFhSS1RHYTZ3SmpyV05IQlZKUjRtM0ZDbmJ1RDZhYWsyV3NNVGgzU1pJbUdDSVBLTmdzRHBWd25zYTcwSzMxbENGSlpZY3d3U01GY1F1bEdUc1p1RWFTZEJYa1BHWmh1MEZzZFVPNzNSSGpxOE1QR0dJZmFHSWJWVGs2aXVJM0dGZ3VjSHJJUWttV1NKZEJkN0JCdSt1T3J5V0FoWTcrTGtpOXJLNXd0RVF6V3d2dGJxR2hJTUZ3V1JKc0Vsc1k0bTlJSWc5TDZsQ1gwVmtsYVBBWWtma1pFR0RuT1dvd2xCSmp0TVVrY0dLNExnNkV0b1pJbk1VQlZZTGduMFVzZG1DeUN6N2dJR0hGZmsrazFRd1RoNVdlN0E5eCtJZEo2Q3ZJa0VhZ21zMGhSNTBlSDlVblRRSisyb2lLeVZsTEZVRSs4Z0JHdThNUTNDcHBVSGVzbmpUSE40UUIvVUdQaENUSExGUEhNRnJDcWE3M2dxT2JVSkdhMDN3Z2JoSGtyQ2ZwRXB6TkxFN0pEUzI1Rk1LaGxoS0tXS2ZDZ3FzdExDUHUxekJYeTBKMnp0d2p0aXhCdThVVFJuOUxWdGttQ04yaXlGaHRNRTcwSkhSUTFLVlpYcUtJL0tOSUtZTUNZczFHVU1FS2JNMWJLT0k5TERYQzd6YkhTK2J0KzFNVFdTOW9kQTlEdHJZdHBiSW1RSjJWSGgvbGlzRXdhSHFVazFraktUQUtrbmtCRVhrYmtkTUd3cTBkbmh6TEpGM05KSDNKVndycU9CNFNjYTJodGk3NW5tSk4wV3p4UzZVeERZb0VweHBhNGh0VmxSamtZRTdEWkd6SlZVNzJ1QzlJeWhRTDRpOFlmR1dTWUxMTmNIWGxveXo3UWhOaWZtS1NFOUpnZkdtdXlMaGM0MDNYbTl2cWNwNmdYZTN4dXV2OEY2VkpOeGt5VEhFa0hHMmcwYUtYTDBNc1hjMWJHZmdhczIvL2RDT05YaU5MQ1grNW1CN2VaSWwxa0hoN2Fqd3Bpa3l6bFVVV09WT3NqU1Fsc1MrTTBSK3BQamUvZHpCWFJaR08wck10Z1FyTExHOVZTdTluNkNNWFMzQmh3WW1Tb0lCaHNqTkJtWmJndXNFOUJDUENQNXRyaVU0VmhOYkpmRStzd1NQMjdhYXlFOHR1VHBZWWp0cllqTVZHWmRwMk5wUzFzNmFCbktTSERzYkt1cGxLYkhNNGEwd01GZC81L0RtR3lLckpTVWFXNElCcnFVaHgwdnlmelRCQkxQSVVjblpkckFrTnNLUjBzV1JzcHVtU25zNkNoMHYvcXFJYkJZVVdLdlBVL0NGb3lyREpHd1NORmhiQS9NbHpLcWpyTzgwaFJicEt4MEpld3NpL1NUZnR3R1NsS2MxSlp5QXp4MDVkaExFZG5mUXZoWk9xaUhXV0VBSEM3KzMwRnVSY1pVZ2FPNWdwYUlLK3hzaUhSVXNxYVBFbFRWNDB4UVpRMTA3UTlCWkUxbnJ5RFZHVTlaU1E0N2JtaEJwTGNZcFV0N1MreHVLL0ZpVDhxS2p3WFl3NXlwUzJpdUN2N3ExZ3Rnamh1QnVCOExDRlk1Y1V1Q050c1FPRmNUKzRJaDlKWCtrOEVhNnYwaUNJUlpPdENUMEV0MDBKVzVVZUM4NUNnMFNjSzBrNDExSGNHMXpLdHJlM1NlSVRCUms3V2Z3RGhFdmFZTFRIUDlsZTBtOEJ5MEpEd240VGxMVy9hSk92R0h4ZGpZVWVzK1NjWmlnQ2tZUWROZEVPaGtpZXpnU2hxa3g4dWVLakk4bERmSzJvTmlPRnZyWkgxaFMrdGs3TlY3bk9tTEhpY0dXRWd1YmtYS2R3ZHRaa25DTEpYYUNwa3JqWkJ0TFpGc0RQOUNkeFdzU3IwNVN4bDZDTW1vRmJDT2dyeVg0MHVEdGFtQjdTVm1YVzRJaGxncG1xKzAwdEJLVVVhODNXYmpMVU5rekRtWTdjb3cxSkR5Z3lQR2xoZ0dLWUt6NHZjVjdRQk5iSklnTTExVFVxWmFNZHdUZVNndUg2ck9hdzFKUkt6YWFHeXhWbTJFSi91Q0lyVldVY1pVa2NwMmdyTXNFaksrRE13UzU5alFrM0tkNlNFcTFkMFM2dVZtTzRCYzFsRFhUVWNIamx1Q1hFcSsxT2xCRGoxcGk5emdpWHhuS3VFMFNxVFh3aHFiRVRXNlJnZ01FbkdsL3E0OVVUMmlDemdKdlJ3VlhTMksvZDYrWmt5VWw3amF3U1ZMaXQ0NkV3eFZsakRad29TUTIwc0RCaWh6dEhmazJ5QThOVlpnaGlYd3JZSFFkZktBT3R6c2F5amhZOWJZMHlFMkNXRWVKOXhmek80MjN4aEw1c3lTMlRGSm9mTzJwYm9Ib2Iwblk0R2lBZ1JydkdRRURhL0ZXU3NvYWFZbDBzeVJzRXQza1dvSDNCMDFzaENYaFRVV2U5dzNCdDQ0U0M5UUNoM2VTaFFjdHdiYUsyQXBMcm9HQ01sWnJZcXZsWTNxWWhNMGFYcEZrUE91b3FKM0RtNmZ4WHJHd1ZGOWdDV1phZ2pQcXpuZmt1TUtROERQVFFSTzhacUcxaFBHS0VtOUlncEdXNERaRGdUTnJpVHh2RmlxK0x6KzBjS2ZwNHdqNk9DSzlKU256TlNuOUxGVTdVaEtaWk1uWXdjSjhzOHlSc0VDU2NLNGo1VU9COTVIRk8wQ3poWTR4Snh1Q2l4MGxEbEVVZU1kUzZFWkJrVHNVa1o0Szc0ZHVneVRYUzdhTmdMOGFxakRma0NFMFpid2tDWHBhV0NLaGw4UDdWRDVqeHlraXZTeXh5WnJZRVJiZTE2OExZdTlaWWg4Nklrc2NnVkxFN3RXUEttSnYxMUNnb3lKbHRNRWJyb2h0VkFRZk80SW1sdGlIRXJvWUVzN1J4QWFyVnBZOEF3WE1jTVJlRk9UWVdlNWlpTFJReEo1UThEdEo4TFFoV09oSWVGRVNQR3NJTGhiTkRSbGpOYkh6TlJsVEZiazJTM0wwTk9TNlYxS0ZKWUtVYlNUY0lJaE0wd1EvczJUTTBTUk1OY1FtU2FwM2pDSDR5aEpaS1Nrd3lSSHBZWWdzRmVRNFU3eG9DQjdWVk9FeGhYZXBvOUFCQnNZYnZHV0tYUE1FM2x5SDk1WWlvWjBnc3NRUldXYkkrRmFTTWtYaWpaWHdnaVRsWWRQZGtOTGFFVHhseURWSXdxZWFFdXMwYVRjWWNnMFJWT2twUjNDU0pxSWRkSys5MEpDeHpzRFZsb3lyRmQ1WkFyNFRCS2ZhV2E2Ym9FQTdDN3M2RXBZYWVGUGp2ZW9vWTcybWpJY2NMSEo5SFV3VmxEaEtrbXV0SkRKQnducDFydnVsSlpnZ0tEUmZiWEFrdkMvNGwzb3pRT0c5YThseGp4MGk3blY0alNYYzd2aGUzT3dJeGpnU0hqZEVoaHNpZjlZa1BHbHVzM2lMRkRuV09GaHRDWmJKZzBVYlFjSWFSNjdKanRob0N5TUVaUndoaVhXeXhPNVF4STZ3NU5oVDRVMVdzSnZETzYwSjM0Zlc5aHd6d2xLaWo2WkFXOW5lNEwwczhDNlhlQk1Fa2QvTFF5MVZ1Y0JSb3Q2UU1sYml2YUJob0JnanFHaUNKTmhzcVZwL1MyU3NHNkRJT05DUjBkWGh2V2JKK01SUlpKa2t1RWpnRFhKakZRVzZTU0w3R1hLOFoyQ1pnN2NWc2JXR29LbUVwelE1ZWxwaXk4UnlnN2RNa0xMVUVhdXplTzg2Q3V3bFNPbGdZTG9qWldlSjl4TTNTMVBXZkVmS2w1SVNMUTBNRUtSOFlPQjJRZkN4SkJqcktQQ040ZjlNa2FTc3FvVlhKQm1QN0VwRlo5VVFmT29PRndTekJONE1ROExzR3J5bWxpcGNKUWhteTBHYVFqUHFDSGFYUnd1Q1p3UmJxSzJGZzl3bENsWnFZaWNySWdNZFpmeFRRMGM3VEJJYnJDaHhtdXpvS0c4WFJhU3JJaGhpeU5GSmtyQzdvSUFXTUVPUWE1YUJla1BDUmtuQ280SUtQcllrdkNESThhWW1ZN1dGdHByZ2VrY0paM29MSXFzc0NTTXRGYlFUSkt3WFl5M0JZNW9DaDJpS1BDcEpPRSt6UmRwWWdpNk8yS21PQWd2VkNZYVU0eVNSZWsxc2d5RmhKNDAzUUZIaVZFbUpId3R5Yk8xZ3M4SHI1K0JFVFFYM1dhcjBxWm5nWUdndFZadG9xZDZ2RlNrL1V3ZFpFbFlxeWpyRjRIWFVlRnNwSWk5SUdLZjRqOTJwS0dBZENZTVZzYmNWM2tSRjBOK1I4TFVkNVBDc0lHV294RHRCa0NJMG5Lb2ZkSlF4VCtMdFpmbHZ1YzhRM0Nqd1drcThLd1VwSHprSy9ObVNzY2xDTDBuc2VRZGo1RlJINUNOSFNndExpVzgwT2Y1SFU5SGhsc2dhOWJuQnEzZkVWbHRLZk81SWFTVG1HampjNEowb3RjUDdRc0pVU1FNOHBFajUvd0N1VXVDMkRXejhBQUFBQUVsRlRrU3VRbUNDIik7Cn0K]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/theme/base16-dark.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKCiAgICBOYW1lOiAgICAgICBCYXNlMTYgRGVmYXVsdCBEYXJrCiAgICBBdXRob3I6ICAgICBDaHJpcyBLZW1wc29uIChodHRwOi8vY2hyaXNrZW1wc29uLmNvbSkKCiAgICBDb2RlTWlycm9yIHRlbXBsYXRlIGJ5IEphbiBULiBTb3R0IChodHRwczovL2dpdGh1Yi5jb20vaWRsZWJlcmcvYmFzZTE2LWNocm9tZS1kZXZ0b29scykKICAgIE9yaWdpbmFsIEJhc2UxNiBjb2xvciBzY2hlbWUgYnkgQ2hyaXMgS2VtcHNvbiAoaHR0cHM6Ly9naXRodWIuY29tL2Nocmlza2VtcHNvbi9iYXNlMTYpCgoqLwoKLmNtLXMtYmFzZTE2LWRhcmsuQ29kZU1pcnJvciB7YmFja2dyb3VuZDogIzE1MTUxNTsgY29sb3I6ICNlMGUwZTA7fQouY20tcy1iYXNlMTYtZGFyayBkaXYuQ29kZU1pcnJvci1zZWxlY3RlZCB7YmFja2dyb3VuZDogIzIwMjAyMCAhaW1wb3J0YW50O30KLmNtLXMtYmFzZTE2LWRhcmsgLkNvZGVNaXJyb3ItZ3V0dGVycyB7YmFja2dyb3VuZDogIzE1MTUxNTsgYm9yZGVyLXJpZ2h0OiAwcHg7fQouY20tcy1iYXNlMTYtZGFyayAuQ29kZU1pcnJvci1ndXR0ZXJtYXJrZXIgeyBjb2xvcjogI2FjNDE0MjsgfQouY20tcy1iYXNlMTYtZGFyayAuQ29kZU1pcnJvci1ndXR0ZXJtYXJrZXItc3VidGxlIHsgY29sb3I6ICM1MDUwNTA7IH0KLmNtLXMtYmFzZTE2LWRhcmsgLkNvZGVNaXJyb3ItbGluZW51bWJlciB7Y29sb3I6ICM1MDUwNTA7fQouY20tcy1iYXNlMTYtZGFyayAuQ29kZU1pcnJvci1jdXJzb3Ige2JvcmRlci1sZWZ0OiAxcHggc29saWQgI2IwYjBiMCAhaW1wb3J0YW50O30KCi5jbS1zLWJhc2UxNi1kYXJrIHNwYW4uY20tY29tbWVudCB7Y29sb3I6ICM4ZjU1MzY7fQouY20tcy1iYXNlMTYtZGFyayBzcGFuLmNtLWF0b20ge2NvbG9yOiAjYWE3NTlmO30KLmNtLXMtYmFzZTE2LWRhcmsgc3Bhbi5jbS1udW1iZXIge2NvbG9yOiAjYWE3NTlmO30KCi5jbS1zLWJhc2UxNi1kYXJrIHNwYW4uY20tcHJvcGVydHksIC5jbS1zLWJhc2UxNi1kYXJrIHNwYW4uY20tYXR0cmlidXRlIHtjb2xvcjogIzkwYTk1OTt9Ci5jbS1zLWJhc2UxNi1kYXJrIHNwYW4uY20ta2V5d29yZCB7Y29sb3I6ICNhYzQxNDI7fQouY20tcy1iYXNlMTYtZGFyayBzcGFuLmNtLXN0cmluZyB7Y29sb3I6ICNmNGJmNzU7fQoKLmNtLXMtYmFzZTE2LWRhcmsgc3Bhbi5jbS12YXJpYWJsZSB7Y29sb3I6ICM5MGE5NTk7fQouY20tcy1iYXNlMTYtZGFyayBzcGFuLmNtLXZhcmlhYmxlLTIge2NvbG9yOiAjNmE5ZmI1O30KLmNtLXMtYmFzZTE2LWRhcmsgc3Bhbi5jbS1kZWYge2NvbG9yOiAjZDI4NDQ1O30KLmNtLXMtYmFzZTE2LWRhcmsgc3Bhbi5jbS1icmFja2V0IHtjb2xvcjogI2UwZTBlMDt9Ci5jbS1zLWJhc2UxNi1kYXJrIHNwYW4uY20tdGFnIHtjb2xvcjogI2FjNDE0Mjt9Ci5jbS1zLWJhc2UxNi1kYXJrIHNwYW4uY20tbGluayB7Y29sb3I6ICNhYTc1OWY7fQouY20tcy1iYXNlMTYtZGFyayBzcGFuLmNtLWVycm9yIHtiYWNrZ3JvdW5kOiAjYWM0MTQyOyBjb2xvcjogI2IwYjBiMDt9CgouY20tcy1iYXNlMTYtZGFyayAuQ29kZU1pcnJvci1hY3RpdmVsaW5lLWJhY2tncm91bmQge2JhY2tncm91bmQ6ICMyRjJGMkYgIWltcG9ydGFudDt9Ci5jbS1zLWJhc2UxNi1kYXJrIC5Db2RlTWlycm9yLW1hdGNoaW5nYnJhY2tldCB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyBjb2xvcjogd2hpdGUgIWltcG9ydGFudDt9Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/theme/base16-light.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKCiAgICBOYW1lOiAgICAgICBCYXNlMTYgRGVmYXVsdCBMaWdodAogICAgQXV0aG9yOiAgICAgQ2hyaXMgS2VtcHNvbiAoaHR0cDovL2Nocmlza2VtcHNvbi5jb20pCgogICAgQ29kZU1pcnJvciB0ZW1wbGF0ZSBieSBKYW4gVC4gU290dCAoaHR0cHM6Ly9naXRodWIuY29tL2lkbGViZXJnL2Jhc2UxNi1jaHJvbWUtZGV2dG9vbHMpCiAgICBPcmlnaW5hbCBCYXNlMTYgY29sb3Igc2NoZW1lIGJ5IENocmlzIEtlbXBzb24gKGh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc2tlbXBzb24vYmFzZTE2KQoKKi8KCi5jbS1zLWJhc2UxNi1saWdodC5Db2RlTWlycm9yIHtiYWNrZ3JvdW5kOiAjZjVmNWY1OyBjb2xvcjogIzIwMjAyMDt9Ci5jbS1zLWJhc2UxNi1saWdodCBkaXYuQ29kZU1pcnJvci1zZWxlY3RlZCB7YmFja2dyb3VuZDogI2UwZTBlMCAhaW1wb3J0YW50O30KLmNtLXMtYmFzZTE2LWxpZ2h0IC5Db2RlTWlycm9yLWd1dHRlcnMge2JhY2tncm91bmQ6ICNmNWY1ZjU7IGJvcmRlci1yaWdodDogMHB4O30KLmNtLXMtYmFzZTE2LWxpZ2h0IC5Db2RlTWlycm9yLWd1dHRlcm1hcmtlciB7IGNvbG9yOiAjYWM0MTQyOyB9Ci5jbS1zLWJhc2UxNi1saWdodCAuQ29kZU1pcnJvci1ndXR0ZXJtYXJrZXItc3VidGxlIHsgY29sb3I6ICNiMGIwYjA7IH0KLmNtLXMtYmFzZTE2LWxpZ2h0IC5Db2RlTWlycm9yLWxpbmVudW1iZXIge2NvbG9yOiAjYjBiMGIwO30KLmNtLXMtYmFzZTE2LWxpZ2h0IC5Db2RlTWlycm9yLWN1cnNvciB7Ym9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjNTA1MDUwICFpbXBvcnRhbnQ7fQoKLmNtLXMtYmFzZTE2LWxpZ2h0IHNwYW4uY20tY29tbWVudCB7Y29sb3I6ICM4ZjU1MzY7fQouY20tcy1iYXNlMTYtbGlnaHQgc3Bhbi5jbS1hdG9tIHtjb2xvcjogI2FhNzU5Zjt9Ci5jbS1zLWJhc2UxNi1saWdodCBzcGFuLmNtLW51bWJlciB7Y29sb3I6ICNhYTc1OWY7fQoKLmNtLXMtYmFzZTE2LWxpZ2h0IHNwYW4uY20tcHJvcGVydHksIC5jbS1zLWJhc2UxNi1saWdodCBzcGFuLmNtLWF0dHJpYnV0ZSB7Y29sb3I6ICM5MGE5NTk7fQouY20tcy1iYXNlMTYtbGlnaHQgc3Bhbi5jbS1rZXl3b3JkIHtjb2xvcjogI2FjNDE0Mjt9Ci5jbS1zLWJhc2UxNi1saWdodCBzcGFuLmNtLXN0cmluZyB7Y29sb3I6ICNmNGJmNzU7fQoKLmNtLXMtYmFzZTE2LWxpZ2h0IHNwYW4uY20tdmFyaWFibGUge2NvbG9yOiAjOTBhOTU5O30KLmNtLXMtYmFzZTE2LWxpZ2h0IHNwYW4uY20tdmFyaWFibGUtMiB7Y29sb3I6ICM2YTlmYjU7fQouY20tcy1iYXNlMTYtbGlnaHQgc3Bhbi5jbS1kZWYge2NvbG9yOiAjZDI4NDQ1O30KLmNtLXMtYmFzZTE2LWxpZ2h0IHNwYW4uY20tYnJhY2tldCB7Y29sb3I6ICMyMDIwMjA7fQouY20tcy1iYXNlMTYtbGlnaHQgc3Bhbi5jbS10YWcge2NvbG9yOiAjYWM0MTQyO30KLmNtLXMtYmFzZTE2LWxpZ2h0IHNwYW4uY20tbGluayB7Y29sb3I6ICNhYTc1OWY7fQouY20tcy1iYXNlMTYtbGlnaHQgc3Bhbi5jbS1lcnJvciB7YmFja2dyb3VuZDogI2FjNDE0MjsgY29sb3I6ICM1MDUwNTA7fQoKLmNtLXMtYmFzZTE2LWxpZ2h0IC5Db2RlTWlycm9yLWFjdGl2ZWxpbmUtYmFja2dyb3VuZCB7YmFja2dyb3VuZDogI0RERENEQyAhaW1wb3J0YW50O30KLmNtLXMtYmFzZTE2LWxpZ2h0IC5Db2RlTWlycm9yLW1hdGNoaW5nYnJhY2tldCB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyBjb2xvcjogd2hpdGUgIWltcG9ydGFudDt9Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/theme/blackboard.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogUG9ydCBvZiBUZXh0TWF0ZSdzIEJsYWNrYm9hcmQgdGhlbWUgKi8KCi5jbS1zLWJsYWNrYm9hcmQuQ29kZU1pcnJvciB7IGJhY2tncm91bmQ6ICMwQzEwMjE7IGNvbG9yOiAjRjhGOEY4OyB9Ci5jbS1zLWJsYWNrYm9hcmQgLkNvZGVNaXJyb3Itc2VsZWN0ZWQgeyBiYWNrZ3JvdW5kOiAjMjUzQjc2ICFpbXBvcnRhbnQ7IH0KLmNtLXMtYmxhY2tib2FyZCAuQ29kZU1pcnJvci1ndXR0ZXJzIHsgYmFja2dyb3VuZDogIzBDMTAyMTsgYm9yZGVyLXJpZ2h0OiAwOyB9Ci5jbS1zLWJsYWNrYm9hcmQgLkNvZGVNaXJyb3ItZ3V0dGVybWFya2VyIHsgY29sb3I6ICNGQkRFMkQ7IH0KLmNtLXMtYmxhY2tib2FyZCAuQ29kZU1pcnJvci1ndXR0ZXJtYXJrZXItc3VidGxlIHsgY29sb3I6ICM4ODg7IH0KLmNtLXMtYmxhY2tib2FyZCAuQ29kZU1pcnJvci1saW5lbnVtYmVyIHsgY29sb3I6ICM4ODg7IH0KLmNtLXMtYmxhY2tib2FyZCAuQ29kZU1pcnJvci1jdXJzb3IgeyBib3JkZXItbGVmdDogMXB4IHNvbGlkICNBN0E3QTcgIWltcG9ydGFudDsgfQoKLmNtLXMtYmxhY2tib2FyZCAuY20ta2V5d29yZCB7IGNvbG9yOiAjRkJERTJEOyB9Ci5jbS1zLWJsYWNrYm9hcmQgLmNtLWF0b20geyBjb2xvcjogI0Q4RkEzQzsgfQouY20tcy1ibGFja2JvYXJkIC5jbS1udW1iZXIgeyBjb2xvcjogI0Q4RkEzQzsgfQouY20tcy1ibGFja2JvYXJkIC5jbS1kZWYgeyBjb2xvcjogIzhEQTZDRTsgfQouY20tcy1ibGFja2JvYXJkIC5jbS12YXJpYWJsZSB7IGNvbG9yOiAjRkY2NDAwOyB9Ci5jbS1zLWJsYWNrYm9hcmQgLmNtLW9wZXJhdG9yIHsgY29sb3I6ICNGQkRFMkQ7fQouY20tcy1ibGFja2JvYXJkIC5jbS1jb21tZW50IHsgY29sb3I6ICNBRUFFQUU7IH0KLmNtLXMtYmxhY2tib2FyZCAuY20tc3RyaW5nIHsgY29sb3I6ICM2MUNFM0M7IH0KLmNtLXMtYmxhY2tib2FyZCAuY20tc3RyaW5nLTIgeyBjb2xvcjogIzYxQ0UzQzsgfQouY20tcy1ibGFja2JvYXJkIC5jbS1tZXRhIHsgY29sb3I6ICNEOEZBM0M7IH0KLmNtLXMtYmxhY2tib2FyZCAuY20tYnVpbHRpbiB7IGNvbG9yOiAjOERBNkNFOyB9Ci5jbS1zLWJsYWNrYm9hcmQgLmNtLXRhZyB7IGNvbG9yOiAjOERBNkNFOyB9Ci5jbS1zLWJsYWNrYm9hcmQgLmNtLWF0dHJpYnV0ZSB7IGNvbG9yOiAjOERBNkNFOyB9Ci5jbS1zLWJsYWNrYm9hcmQgLmNtLWhlYWRlciB7IGNvbG9yOiAjRkY2NDAwOyB9Ci5jbS1zLWJsYWNrYm9hcmQgLmNtLWhyIHsgY29sb3I6ICNBRUFFQUU7IH0KLmNtLXMtYmxhY2tib2FyZCAuY20tbGluayB7IGNvbG9yOiAjOERBNkNFOyB9Ci5jbS1zLWJsYWNrYm9hcmQgLmNtLWVycm9yIHsgYmFja2dyb3VuZDogIzlEMUUxNTsgY29sb3I6ICNGOEY4Rjg7IH0KCi5jbS1zLWJsYWNrYm9hcmQgLkNvZGVNaXJyb3ItYWN0aXZlbGluZS1iYWNrZ3JvdW5kIHtiYWNrZ3JvdW5kOiAjM0MzNjM2ICFpbXBvcnRhbnQ7fQouY20tcy1ibGFja2JvYXJkIC5Db2RlTWlycm9yLW1hdGNoaW5nYnJhY2tldCB7b3V0bGluZToxcHggc29saWQgZ3JleTtjb2xvcjp3aGl0ZSAhaW1wb3J0YW50fQ==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/theme/cobalt.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LmNtLXMtY29iYWx0LkNvZGVNaXJyb3IgeyBiYWNrZ3JvdW5kOiAjMDAyMjQwOyBjb2xvcjogd2hpdGU7IH0KLmNtLXMtY29iYWx0IGRpdi5Db2RlTWlycm9yLXNlbGVjdGVkIHsgYmFja2dyb3VuZDogI2IzNjUzOSAhaW1wb3J0YW50OyB9Ci5jbS1zLWNvYmFsdCAuQ29kZU1pcnJvci1ndXR0ZXJzIHsgYmFja2dyb3VuZDogIzAwMjI0MDsgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgI2FhYTsgfQouY20tcy1jb2JhbHQgLkNvZGVNaXJyb3ItZ3V0dGVybWFya2VyIHsgY29sb3I6ICNmZmVlODA7IH0KLmNtLXMtY29iYWx0IC5Db2RlTWlycm9yLWd1dHRlcm1hcmtlci1zdWJ0bGUgeyBjb2xvcjogI2QwZDBkMDsgfQouY20tcy1jb2JhbHQgLkNvZGVNaXJyb3ItbGluZW51bWJlciB7IGNvbG9yOiAjZDBkMGQwOyB9Ci5jbS1zLWNvYmFsdCAuQ29kZU1pcnJvci1jdXJzb3IgeyBib3JkZXItbGVmdDogMXB4IHNvbGlkIHdoaXRlICFpbXBvcnRhbnQ7IH0KCi5jbS1zLWNvYmFsdCBzcGFuLmNtLWNvbW1lbnQgeyBjb2xvcjogIzA4ZjsgfQouY20tcy1jb2JhbHQgc3Bhbi5jbS1hdG9tIHsgY29sb3I6ICM4NDVkYzQ7IH0KLmNtLXMtY29iYWx0IHNwYW4uY20tbnVtYmVyLCAuY20tcy1jb2JhbHQgc3Bhbi5jbS1hdHRyaWJ1dGUgeyBjb2xvcjogI2ZmODBlMTsgfQouY20tcy1jb2JhbHQgc3Bhbi5jbS1rZXl3b3JkIHsgY29sb3I6ICNmZmVlODA7IH0KLmNtLXMtY29iYWx0IHNwYW4uY20tc3RyaW5nIHsgY29sb3I6ICMzYWQ5MDA7IH0KLmNtLXMtY29iYWx0IHNwYW4uY20tbWV0YSB7IGNvbG9yOiAjZmY5ZDAwOyB9Ci5jbS1zLWNvYmFsdCBzcGFuLmNtLXZhcmlhYmxlLTIsIC5jbS1zLWNvYmFsdCBzcGFuLmNtLXRhZyB7IGNvbG9yOiAjOWVmZmZmOyB9Ci5jbS1zLWNvYmFsdCBzcGFuLmNtLXZhcmlhYmxlLTMsIC5jbS1zLWNvYmFsdCBzcGFuLmNtLWRlZiB7IGNvbG9yOiB3aGl0ZTsgfQouY20tcy1jb2JhbHQgc3Bhbi5jbS1icmFja2V0IHsgY29sb3I6ICNkOGQ4ZDg7IH0KLmNtLXMtY29iYWx0IHNwYW4uY20tYnVpbHRpbiwgLmNtLXMtY29iYWx0IHNwYW4uY20tc3BlY2lhbCB7IGNvbG9yOiAjZmY5ZTU5OyB9Ci5jbS1zLWNvYmFsdCBzcGFuLmNtLWxpbmsgeyBjb2xvcjogIzg0NWRjNDsgfQouY20tcy1jb2JhbHQgc3Bhbi5jbS1lcnJvciB7IGNvbG9yOiAjOWQxZTE1OyB9CgouY20tcy1jb2JhbHQgLkNvZGVNaXJyb3ItYWN0aXZlbGluZS1iYWNrZ3JvdW5kIHtiYWNrZ3JvdW5kOiAjMDAyRDU3ICFpbXBvcnRhbnQ7fQouY20tcy1jb2JhbHQgLkNvZGVNaXJyb3ItbWF0Y2hpbmdicmFja2V0IHtvdXRsaW5lOjFweCBzb2xpZCBncmV5O2NvbG9yOndoaXRlICFpbXBvcnRhbnR9Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/theme/eclipse.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LmNtLXMtZWNsaXBzZSBzcGFuLmNtLW1ldGEge2NvbG9yOiAjRkYxNzE3O30KLmNtLXMtZWNsaXBzZSBzcGFuLmNtLWtleXdvcmQgeyBsaW5lLWhlaWdodDogMWVtOyBmb250LXdlaWdodDogYm9sZDsgY29sb3I6ICM3RjAwNTU7IH0KLmNtLXMtZWNsaXBzZSBzcGFuLmNtLWF0b20ge2NvbG9yOiAjMjE5O30KLmNtLXMtZWNsaXBzZSBzcGFuLmNtLW51bWJlciB7Y29sb3I6ICMxNjQ7fQouY20tcy1lY2xpcHNlIHNwYW4uY20tZGVmIHtjb2xvcjogIzAwZjt9Ci5jbS1zLWVjbGlwc2Ugc3Bhbi5jbS12YXJpYWJsZSB7Y29sb3I6IGJsYWNrO30KLmNtLXMtZWNsaXBzZSBzcGFuLmNtLXZhcmlhYmxlLTIge2NvbG9yOiAjMDAwMEMwO30KLmNtLXMtZWNsaXBzZSBzcGFuLmNtLXZhcmlhYmxlLTMge2NvbG9yOiAjMDAwMEMwO30KLmNtLXMtZWNsaXBzZSBzcGFuLmNtLXByb3BlcnR5IHtjb2xvcjogYmxhY2s7fQouY20tcy1lY2xpcHNlIHNwYW4uY20tb3BlcmF0b3Ige2NvbG9yOiBibGFjazt9Ci5jbS1zLWVjbGlwc2Ugc3Bhbi5jbS1jb21tZW50IHtjb2xvcjogIzNGN0Y1Rjt9Ci5jbS1zLWVjbGlwc2Ugc3Bhbi5jbS1zdHJpbmcge2NvbG9yOiAjMkEwMEZGO30KLmNtLXMtZWNsaXBzZSBzcGFuLmNtLXN0cmluZy0yIHtjb2xvcjogI2Y1MDt9Ci5jbS1zLWVjbGlwc2Ugc3Bhbi5jbS1xdWFsaWZpZXIge2NvbG9yOiAjNTU1O30KLmNtLXMtZWNsaXBzZSBzcGFuLmNtLWJ1aWx0aW4ge2NvbG9yOiAjMzBhO30KLmNtLXMtZWNsaXBzZSBzcGFuLmNtLWJyYWNrZXQge2NvbG9yOiAjY2M3O30KLmNtLXMtZWNsaXBzZSBzcGFuLmNtLXRhZyB7Y29sb3I6ICMxNzA7fQouY20tcy1lY2xpcHNlIHNwYW4uY20tYXR0cmlidXRlIHtjb2xvcjogIzAwYzt9Ci5jbS1zLWVjbGlwc2Ugc3Bhbi5jbS1saW5rIHtjb2xvcjogIzIxOTt9Ci5jbS1zLWVjbGlwc2Ugc3Bhbi5jbS1lcnJvciB7Y29sb3I6ICNmMDA7fQoKLmNtLXMtZWNsaXBzZSAuQ29kZU1pcnJvci1hY3RpdmVsaW5lLWJhY2tncm91bmQge2JhY2tncm91bmQ6ICNlOGYyZmYgIWltcG9ydGFudDt9Ci5jbS1zLWVjbGlwc2UgLkNvZGVNaXJyb3ItbWF0Y2hpbmdicmFja2V0IHtvdXRsaW5lOjFweCBzb2xpZCBncmV5OyBjb2xvcjpibGFjayAhaW1wb3J0YW50O30K]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/theme/elegant.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LmNtLXMtZWxlZ2FudCBzcGFuLmNtLW51bWJlciwgLmNtLXMtZWxlZ2FudCBzcGFuLmNtLXN0cmluZywgLmNtLXMtZWxlZ2FudCBzcGFuLmNtLWF0b20ge2NvbG9yOiAjNzYyO30KLmNtLXMtZWxlZ2FudCBzcGFuLmNtLWNvbW1lbnQge2NvbG9yOiAjMjYyOyBmb250LXN0eWxlOiBpdGFsaWM7IGxpbmUtaGVpZ2h0OiAxZW07fQouY20tcy1lbGVnYW50IHNwYW4uY20tbWV0YSB7Y29sb3I6ICM1NTU7IGZvbnQtc3R5bGU6IGl0YWxpYzsgbGluZS1oZWlnaHQ6IDFlbTt9Ci5jbS1zLWVsZWdhbnQgc3Bhbi5jbS12YXJpYWJsZSB7Y29sb3I6IGJsYWNrO30KLmNtLXMtZWxlZ2FudCBzcGFuLmNtLXZhcmlhYmxlLTIge2NvbG9yOiAjYjExO30KLmNtLXMtZWxlZ2FudCBzcGFuLmNtLXF1YWxpZmllciB7Y29sb3I6ICM1NTU7fQouY20tcy1lbGVnYW50IHNwYW4uY20ta2V5d29yZCB7Y29sb3I6ICM3MzA7fQouY20tcy1lbGVnYW50IHNwYW4uY20tYnVpbHRpbiB7Y29sb3I6ICMzMGE7fQouY20tcy1lbGVnYW50IHNwYW4uY20tbGluayB7Y29sb3I6ICM3NjI7fQouY20tcy1lbGVnYW50IHNwYW4uY20tZXJyb3Ige2JhY2tncm91bmQtY29sb3I6ICNmZGQ7fQoKLmNtLXMtZWxlZ2FudCAuQ29kZU1pcnJvci1hY3RpdmVsaW5lLWJhY2tncm91bmQge2JhY2tncm91bmQ6ICNlOGYyZmYgIWltcG9ydGFudDt9Ci5jbS1zLWVsZWdhbnQgLkNvZGVNaXJyb3ItbWF0Y2hpbmdicmFja2V0IHtvdXRsaW5lOjFweCBzb2xpZCBncmV5OyBjb2xvcjpibGFjayAhaW1wb3J0YW50O30K]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/theme/erlang-dark.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LmNtLXMtZXJsYW5nLWRhcmsuQ29kZU1pcnJvciB7IGJhY2tncm91bmQ6ICMwMDIyNDA7IGNvbG9yOiB3aGl0ZTsgfQouY20tcy1lcmxhbmctZGFyayBkaXYuQ29kZU1pcnJvci1zZWxlY3RlZCB7IGJhY2tncm91bmQ6ICNiMzY1MzkgIWltcG9ydGFudDsgfQouY20tcy1lcmxhbmctZGFyayAuQ29kZU1pcnJvci1ndXR0ZXJzIHsgYmFja2dyb3VuZDogIzAwMjI0MDsgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgI2FhYTsgfQouY20tcy1lcmxhbmctZGFyayAuQ29kZU1pcnJvci1ndXR0ZXJtYXJrZXIgeyBjb2xvcjogd2hpdGU7IH0KLmNtLXMtZXJsYW5nLWRhcmsgLkNvZGVNaXJyb3ItZ3V0dGVybWFya2VyLXN1YnRsZSB7IGNvbG9yOiAjZDBkMGQwOyB9Ci5jbS1zLWVybGFuZy1kYXJrIC5Db2RlTWlycm9yLWxpbmVudW1iZXIgeyBjb2xvcjogI2QwZDBkMDsgfQouY20tcy1lcmxhbmctZGFyayAuQ29kZU1pcnJvci1jdXJzb3IgeyBib3JkZXItbGVmdDogMXB4IHNvbGlkIHdoaXRlICFpbXBvcnRhbnQ7IH0KCi5jbS1zLWVybGFuZy1kYXJrIHNwYW4uY20tYXRvbSAgICAgICB7IGNvbG9yOiAjZjEzM2YxOyB9Ci5jbS1zLWVybGFuZy1kYXJrIHNwYW4uY20tYXR0cmlidXRlICB7IGNvbG9yOiAjZmY4MGUxOyB9Ci5jbS1zLWVybGFuZy1kYXJrIHNwYW4uY20tYnJhY2tldCAgICB7IGNvbG9yOiAjZmY5ZDAwOyB9Ci5jbS1zLWVybGFuZy1kYXJrIHNwYW4uY20tYnVpbHRpbiAgICB7IGNvbG9yOiAjZWFhOyB9Ci5jbS1zLWVybGFuZy1kYXJrIHNwYW4uY20tY29tbWVudCAgICB7IGNvbG9yOiAjNzdmOyB9Ci5jbS1zLWVybGFuZy1kYXJrIHNwYW4uY20tZGVmICAgICAgICB7IGNvbG9yOiAjZTdhOyB9Ci5jbS1zLWVybGFuZy1kYXJrIHNwYW4uY20ta2V5d29yZCAgICB7IGNvbG9yOiAjZmZlZTgwOyB9Ci5jbS1zLWVybGFuZy1kYXJrIHNwYW4uY20tbWV0YSAgICAgICB7IGNvbG9yOiAjNTBmZWZlOyB9Ci5jbS1zLWVybGFuZy1kYXJrIHNwYW4uY20tbnVtYmVyICAgICB7IGNvbG9yOiAjZmZkMGQwOyB9Ci5jbS1zLWVybGFuZy1kYXJrIHNwYW4uY20tb3BlcmF0b3IgICB7IGNvbG9yOiAjZDU1OyB9Ci5jbS1zLWVybGFuZy1kYXJrIHNwYW4uY20tcHJvcGVydHkgICB7IGNvbG9yOiAjY2NjOyB9Ci5jbS1zLWVybGFuZy1kYXJrIHNwYW4uY20tcXVhbGlmaWVyICB7IGNvbG9yOiAjY2NjOyB9Ci5jbS1zLWVybGFuZy1kYXJrIHNwYW4uY20tcXVvdGUgICAgICB7IGNvbG9yOiAjY2NjOyB9Ci5jbS1zLWVybGFuZy1kYXJrIHNwYW4uY20tc3BlY2lhbCAgICB7IGNvbG9yOiAjZmZiYmJiOyB9Ci5jbS1zLWVybGFuZy1kYXJrIHNwYW4uY20tc3RyaW5nICAgICB7IGNvbG9yOiAjM2FkOTAwOyB9Ci5jbS1zLWVybGFuZy1kYXJrIHNwYW4uY20tc3RyaW5nLTIgICB7IGNvbG9yOiAjY2NjOyB9Ci5jbS1zLWVybGFuZy1kYXJrIHNwYW4uY20tdGFnICAgICAgICB7IGNvbG9yOiAjOWVmZmZmOyB9Ci5jbS1zLWVybGFuZy1kYXJrIHNwYW4uY20tdmFyaWFibGUgICB7IGNvbG9yOiAjNTBmZTUwOyB9Ci5jbS1zLWVybGFuZy1kYXJrIHNwYW4uY20tdmFyaWFibGUtMiB7IGNvbG9yOiAjZTBlOyB9Ci5jbS1zLWVybGFuZy1kYXJrIHNwYW4uY20tdmFyaWFibGUtMyB7IGNvbG9yOiAjY2NjOyB9Ci5jbS1zLWVybGFuZy1kYXJrIHNwYW4uY20tZXJyb3IgICAgICB7IGNvbG9yOiAjOWQxZTE1OyB9CgouY20tcy1lcmxhbmctZGFyayAuQ29kZU1pcnJvci1hY3RpdmVsaW5lLWJhY2tncm91bmQge2JhY2tncm91bmQ6ICMwMTM0NjEgIWltcG9ydGFudDt9Ci5jbS1zLWVybGFuZy1kYXJrIC5Db2RlTWlycm9yLW1hdGNoaW5nYnJhY2tldCB7b3V0bGluZToxcHggc29saWQgZ3JleTsgY29sb3I6d2hpdGUgIWltcG9ydGFudDt9Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/theme/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCEtLSBEVU1NWSBIVE1MIEZJTEUgLS0+]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/theme/lesser-dark.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKaHR0cDovL2xlc3Njc3Mub3JnLyBkYXJrIHRoZW1lClBvcnRlZCB0byBDb2RlTWlycm9yIGJ5IFBldGVyIEtyb29uCiovCi5jbS1zLWxlc3Nlci1kYXJrIHsKICBsaW5lLWhlaWdodDogMS4zZW07Cn0KLmNtLXMtbGVzc2VyLWRhcmsuQ29kZU1pcnJvciB7IGJhY2tncm91bmQ6ICMyNjI2MjY7IGNvbG9yOiAjRUJFRkU3OyB0ZXh0LXNoYWRvdzogMCAtMXB4IDFweCAjMjYyNjI2OyB9Ci5jbS1zLWxlc3Nlci1kYXJrIGRpdi5Db2RlTWlycm9yLXNlbGVjdGVkIHtiYWNrZ3JvdW5kOiAjNDU0NDNCICFpbXBvcnRhbnQ7fSAvKiAzMzMyMkIqLwouY20tcy1sZXNzZXItZGFyayAuQ29kZU1pcnJvci1jdXJzb3IgeyBib3JkZXItbGVmdDogMXB4IHNvbGlkIHdoaXRlICFpbXBvcnRhbnQ7IH0KLmNtLXMtbGVzc2VyLWRhcmsgcHJlIHsgcGFkZGluZzogMCA4cHg7IH0vKmVkaXRhYmxlIGNvZGUgaG9sZGVyKi8KCi5jbS1zLWxlc3Nlci1kYXJrLkNvZGVNaXJyb3Igc3Bhbi5Db2RlTWlycm9yLW1hdGNoaW5nYnJhY2tldCB7IGNvbG9yOiAjN0VGQzdFOyB9Lyo2NUZDNjUqLwoKLmNtLXMtbGVzc2VyLWRhcmsgLkNvZGVNaXJyb3ItZ3V0dGVycyB7IGJhY2tncm91bmQ6ICMyNjI2MjY7IGJvcmRlci1yaWdodDoxcHggc29saWQgI2FhYTsgfQouY20tcy1sZXNzZXItZGFyayAuQ29kZU1pcnJvci1ndXR0ZXJtYXJrZXIgeyBjb2xvcjogIzU5OWVmZjsgfQouY20tcy1sZXNzZXItZGFyayAuQ29kZU1pcnJvci1ndXR0ZXJtYXJrZXItc3VidGxlIHsgY29sb3I6ICM3Nzc7IH0KLmNtLXMtbGVzc2VyLWRhcmsgLkNvZGVNaXJyb3ItbGluZW51bWJlciB7IGNvbG9yOiAjNzc3OyB9CgouY20tcy1sZXNzZXItZGFyayBzcGFuLmNtLWtleXdvcmQgeyBjb2xvcjogIzU5OWVmZjsgfQouY20tcy1sZXNzZXItZGFyayBzcGFuLmNtLWF0b20geyBjb2xvcjogI0MyQjQ3MDsgfQouY20tcy1sZXNzZXItZGFyayBzcGFuLmNtLW51bWJlciB7IGNvbG9yOiAjQjM1RTREOyB9Ci5jbS1zLWxlc3Nlci1kYXJrIHNwYW4uY20tZGVmIHtjb2xvcjogd2hpdGU7fQouY20tcy1sZXNzZXItZGFyayBzcGFuLmNtLXZhcmlhYmxlIHsgY29sb3I6I0Q5QkY4QzsgfQouY20tcy1sZXNzZXItZGFyayBzcGFuLmNtLXZhcmlhYmxlLTIgeyBjb2xvcjogIzY2OTE5OTsgfQouY20tcy1sZXNzZXItZGFyayBzcGFuLmNtLXZhcmlhYmxlLTMgeyBjb2xvcjogd2hpdGU7IH0KLmNtLXMtbGVzc2VyLWRhcmsgc3Bhbi5jbS1wcm9wZXJ0eSB7Y29sb3I6ICM5MkE3NUM7fQouY20tcy1sZXNzZXItZGFyayBzcGFuLmNtLW9wZXJhdG9yIHtjb2xvcjogIzkyQTc1Qzt9Ci5jbS1zLWxlc3Nlci1kYXJrIHNwYW4uY20tY29tbWVudCB7IGNvbG9yOiAjNjY2OyB9Ci5jbS1zLWxlc3Nlci1kYXJrIHNwYW4uY20tc3RyaW5nIHsgY29sb3I6ICNCQ0QyNzk7IH0KLmNtLXMtbGVzc2VyLWRhcmsgc3Bhbi5jbS1zdHJpbmctMiB7Y29sb3I6ICNmNTA7fQouY20tcy1sZXNzZXItZGFyayBzcGFuLmNtLW1ldGEgeyBjb2xvcjogIzczOEM3MzsgfQouY20tcy1sZXNzZXItZGFyayBzcGFuLmNtLXF1YWxpZmllciB7Y29sb3I6ICM1NTU7fQouY20tcy1sZXNzZXItZGFyayBzcGFuLmNtLWJ1aWx0aW4geyBjb2xvcjogI2ZmOWU1OTsgfQouY20tcy1sZXNzZXItZGFyayBzcGFuLmNtLWJyYWNrZXQgeyBjb2xvcjogI0VCRUZFNzsgfQouY20tcy1sZXNzZXItZGFyayBzcGFuLmNtLXRhZyB7IGNvbG9yOiAjNjY5MTk5OyB9Ci5jbS1zLWxlc3Nlci1kYXJrIHNwYW4uY20tYXR0cmlidXRlIHtjb2xvcjogIzAwYzt9Ci5jbS1zLWxlc3Nlci1kYXJrIHNwYW4uY20taGVhZGVyIHtjb2xvcjogI2EwYTt9Ci5jbS1zLWxlc3Nlci1kYXJrIHNwYW4uY20tcXVvdGUge2NvbG9yOiAjMDkwO30KLmNtLXMtbGVzc2VyLWRhcmsgc3Bhbi5jbS1ociB7Y29sb3I6ICM5OTk7fQouY20tcy1sZXNzZXItZGFyayBzcGFuLmNtLWxpbmsge2NvbG9yOiAjMDBjO30KLmNtLXMtbGVzc2VyLWRhcmsgc3Bhbi5jbS1lcnJvciB7IGNvbG9yOiAjOWQxZTE1OyB9CgouY20tcy1sZXNzZXItZGFyayAuQ29kZU1pcnJvci1hY3RpdmVsaW5lLWJhY2tncm91bmQge2JhY2tncm91bmQ6ICMzQzNBM0EgIWltcG9ydGFudDt9Ci5jbS1zLWxlc3Nlci1kYXJrIC5Db2RlTWlycm9yLW1hdGNoaW5nYnJhY2tldCB7b3V0bGluZToxcHggc29saWQgZ3JleTsgY29sb3I6d2hpdGUgIWltcG9ydGFudDt9Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/theme/mbo.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogQmFzZWQgb24gbWJvbmFjaSdzIEJyYWNrZXRzIG1ibyB0aGVtZSAqLwoKLmNtLXMtbWJvLkNvZGVNaXJyb3Ige2JhY2tncm91bmQ6ICMyYzJjMmM7IGNvbG9yOiAjZmZmZmU5O30KLmNtLXMtbWJvIGRpdi5Db2RlTWlycm9yLXNlbGVjdGVkIHtiYWNrZ3JvdW5kOiAjNzE2QzYyICFpbXBvcnRhbnQ7fQouY20tcy1tYm8gLkNvZGVNaXJyb3ItZ3V0dGVycyB7YmFja2dyb3VuZDogIzRlNGU0ZTsgYm9yZGVyLXJpZ2h0OiAwcHg7fQouY20tcy1tYm8gLkNvZGVNaXJyb3ItZ3V0dGVybWFya2VyIHsgY29sb3I6IHdoaXRlOyB9Ci5jbS1zLW1ibyAuQ29kZU1pcnJvci1ndXR0ZXJtYXJrZXItc3VidGxlIHsgY29sb3I6IGdyZXk7IH0KLmNtLXMtbWJvIC5Db2RlTWlycm9yLWxpbmVudW1iZXIge2NvbG9yOiAjZGFkYWRhO30KLmNtLXMtbWJvIC5Db2RlTWlycm9yLWN1cnNvciB7Ym9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjZmZmZmVjICFpbXBvcnRhbnQ7fQoKLmNtLXMtbWJvIHNwYW4uY20tY29tbWVudCB7Y29sb3I6ICM5NTk1OGE7fQouY20tcy1tYm8gc3Bhbi5jbS1hdG9tIHtjb2xvcjogIzAwYThjNjt9Ci5jbS1zLW1ibyBzcGFuLmNtLW51bWJlciB7Y29sb3I6ICMwMGE4YzY7fQoKLmNtLXMtbWJvIHNwYW4uY20tcHJvcGVydHksIC5jbS1zLW1ibyBzcGFuLmNtLWF0dHJpYnV0ZSB7Y29sb3I6ICM5ZGRmZTk7fQouY20tcy1tYm8gc3Bhbi5jbS1rZXl3b3JkIHtjb2xvcjogI2ZmYjkyODt9Ci5jbS1zLW1ibyBzcGFuLmNtLXN0cmluZyB7Y29sb3I6ICNmZmNmNmM7fQoKLmNtLXMtbWJvIHNwYW4uY20tdmFyaWFibGUge2NvbG9yOiAjZmZmZmVjO30KLmNtLXMtbWJvIHNwYW4uY20tdmFyaWFibGUtMiB7Y29sb3I6ICMwMGE4YzY7fQouY20tcy1tYm8gc3Bhbi5jbS1kZWYge2NvbG9yOiAjZmZmZmVjO30KLmNtLXMtbWJvIHNwYW4uY20tYnJhY2tldCB7Y29sb3I6ICNmZmZmZmM7IGZvbnQtd2VpZ2h0OiBib2xkO30KLmNtLXMtbWJvIHNwYW4uY20tdGFnIHtjb2xvcjogIzlkZGZlOTt9Ci5jbS1zLW1ibyBzcGFuLmNtLWxpbmsge2NvbG9yOiAjZjU0YjA3O30KLmNtLXMtbWJvIHNwYW4uY20tZXJyb3Ige2JvcmRlci1ib3R0b206ICM2MzYzNjM7IGNvbG9yOiAjZmZmZmVjO30KCi5jbS1zLW1ibyAuQ29kZU1pcnJvci1hY3RpdmVsaW5lLWJhY2tncm91bmQge2JhY2tncm91bmQ6ICM0OTRiNDEgIWltcG9ydGFudDt9Ci5jbS1zLW1ibyAuQ29kZU1pcnJvci1tYXRjaGluZ2JyYWNrZXQgewogIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogIGNvbG9yOiAjZjVlMTA3ICFpbXBvcnRhbnQ7CiB9CiAKLmNtLXMtbWJvIC5Db2RlTWlycm9yLW1hdGNoaW5ndGFnIHsgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAuMzcpOyB9CgouY20tcy1tYm8gc3Bhbi5jbS1zZWFyY2hpbmcgewogIGJhY2tncm91bmQtY29sb3I6IG5vbmU7CiAgYmFja2dyb3VuZDogbm9uZTsKICBib3gtc2hhZG93OiAwIDAgMCAxcHggI2ZmZmZlYzsKfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/theme/mdn-like.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKICBNRE4tTElLRSBUaGVtZSAtIE1vemlsbGEKICBQb3J0ZWQgdG8gQ29kZU1pcnJvciBieSBQZXRlciBLcm9vbiA8cGxha3Jvb25AZ21haWwuY29tPgogIFJlcG9ydCBidWdzL2lzc3VlcyBoZXJlOiBodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9Db2RlTWlycm9yL2lzc3VlcwogIEdpdEh1YjogQHBldGVya3Jvb24KCiAgVGhlIG1kbi1saWtlIHRoZW1lIGlzIGluc3BpcmVkIG9uIHRoZSBkaXNwbGF5ZWQgY29kZSBleGFtcGxlcyBhdDogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL2FuaW1hdGlvbgoKKi8KLmNtLXMtbWRuLWxpa2UuQ29kZU1pcnJvciB7IGNvbG9yOiAjOTk5OyBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOyB9Ci5jbS1zLW1kbi1saWtlIC5Db2RlTWlycm9yLXNlbGVjdGVkIHsgYmFja2dyb3VuZDogI2NmYyAhaW1wb3J0YW50OyB9CgouY20tcy1tZG4tbGlrZSAuQ29kZU1pcnJvci1ndXR0ZXJzIHsgYmFja2dyb3VuZDogI2Y4ZjhmODsgYm9yZGVyLWxlZnQ6IDZweCBzb2xpZCByZ2JhKDAsODMsMTU5LDAuNjUpOyBjb2xvcjogIzMzMzsgfQouY20tcy1tZG4tbGlrZSAuQ29kZU1pcnJvci1saW5lbnVtYmVyIHsgY29sb3I6ICNhYWE7IG1hcmdpbi1sZWZ0OiAzcHg7IH0KZGl2LmNtLXMtbWRuLWxpa2UgLkNvZGVNaXJyb3ItY3Vyc29yIHsgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjMjIyOyB9CgouY20tcy1tZG4tbGlrZSAuY20ta2V5d29yZCB7ICBjb2xvcjogIzYyNjJGRjsgfQouY20tcy1tZG4tbGlrZSAuY20tYXRvbSB7IGNvbG9yOiAjRjkwOyB9Ci5jbS1zLW1kbi1saWtlIC5jbS1udW1iZXIgeyBjb2xvcjogICNjYTc4NDE7IH0KLmNtLXMtbWRuLWxpa2UgLmNtLWRlZiB7IGNvbG9yOiAjOERBNkNFOyB9Ci5jbS1zLW1kbi1saWtlIHNwYW4uY20tdmFyaWFibGUtMiwgLmNtLXMtbWRuLWxpa2Ugc3Bhbi5jbS10YWcgeyBjb2xvcjogIzY5MDsgfQouY20tcy1tZG4tbGlrZSBzcGFuLmNtLXZhcmlhYmxlLTMsIC5jbS1zLW1kbi1saWtlIHNwYW4uY20tZGVmIHsgY29sb3I6ICMwN2E7IH0KCi5jbS1zLW1kbi1saWtlIC5jbS12YXJpYWJsZSB7IGNvbG9yOiAjMDdhOyB9Ci5jbS1zLW1kbi1saWtlIC5jbS1wcm9wZXJ0eSB7IGNvbG9yOiAjOTA1OyB9Ci5jbS1zLW1kbi1saWtlIC5jbS1xdWFsaWZpZXIgeyBjb2xvcjogIzY5MDsgfQoKLmNtLXMtbWRuLWxpa2UgLmNtLW9wZXJhdG9yIHsgY29sb3I6ICNjZGE4Njk7IH0KLmNtLXMtbWRuLWxpa2UgLmNtLWNvbW1lbnQgeyBjb2xvcjojNzc3OyBmb250LXdlaWdodDpub3JtYWw7IH0KLmNtLXMtbWRuLWxpa2UgLmNtLXN0cmluZyB7IGNvbG9yOiMwN2E7IGZvbnQtc3R5bGU6aXRhbGljOyB9Ci5jbS1zLW1kbi1saWtlIC5jbS1zdHJpbmctMiB7IGNvbG9yOiNiZDZiMTg7IH0gLyo/Ki8KLmNtLXMtbWRuLWxpa2UgLmNtLW1ldGEgeyBjb2xvcjogIzAwMDsgfSAvKj8qLwouY20tcy1tZG4tbGlrZSAuY20tYnVpbHRpbiB7IGNvbG9yOiAjOUI3NTM2OyB9IC8qPyovCi5jbS1zLW1kbi1saWtlIC5jbS10YWcgeyBjb2xvcjogIzk5NzY0MzsgfQouY20tcy1tZG4tbGlrZSAuY20tYXR0cmlidXRlIHsgY29sb3I6ICNkNmJiNmQ7IH0gLyo/Ki8KLmNtLXMtbWRuLWxpa2UgLmNtLWhlYWRlciB7IGNvbG9yOiAjRkY2NDAwOyB9Ci5jbS1zLW1kbi1saWtlIC5jbS1ociB7IGNvbG9yOiAjQUVBRUFFOyB9Ci5jbS1zLW1kbi1saWtlIC5jbS1saW5rIHsgICBjb2xvcjojYWQ5MzYxOyBmb250LXN0eWxlOml0YWxpYzsgdGV4dC1kZWNvcmF0aW9uOm5vbmU7IH0KLmNtLXMtbWRuLWxpa2UgLmNtLWVycm9yIHsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHJlZDsgfQoKZGl2LmNtLXMtbWRuLWxpa2UgLkNvZGVNaXJyb3ItYWN0aXZlbGluZS1iYWNrZ3JvdW5kIHtiYWNrZ3JvdW5kOiAjZWZlZmZmO30KZGl2LmNtLXMtbWRuLWxpa2Ugc3Bhbi5Db2RlTWlycm9yLW1hdGNoaW5nYnJhY2tldCB7b3V0bGluZToxcHggc29saWQgZ3JleTsgY29sb3I6IGluaGVyaXQ7fQoKLmNtLXMtbWRuLWxpa2UuQ29kZU1pcnJvciB7IGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUZjQUFBQXlDQVlBQUFBcDhVZUZBQUFIdmtsRVFWUjQyczJiNjNiY05neUVRWkNTSENkdDJ2ZC8wdFdGN0krUTZYZ01YaVR0dXZVNVBsNTdaUUtrS0h6RUFPdEY1S2VJSkJHSjh1dkw1OTlGUkZSRVpoRng4RGVYdjh0cm42OFJ1R2FDOFRSZm8zU05wOWRsRERIZWR5THlUVVRlUldTdFhLUFpyanRwWnhhUnc1aFBxb3pSczFOOC9lbnpJaVFSV2NDZ3k0TVVBMGYrWFdsaURoeUw4TGZ5dng3ZWkvQWUzaVFGSHl3N1UvNTlwUVZJTUVFUEV6MEc3WGl3ZFJqelNmQzNVVHR6OXZjaEludHh2cnk1aU1nZkloSm9FZmxPejJDUXIzRjVoL0hmZUZlK0dUZExhS2N1OUw4TFRlUWIvUi83R2dic2ZLZWR5TmRvSHNOMzF1UlBXcmZaNXdzai9OenpSUUh1VG9JZFUzYWh3bnNLUHhYQ2pKSVR1T3NpN1hMYzdTRy92NUdkQUxzN3dmOEpqVEZpQjUrUXZURWZSeUdPZlgzTHJ4OHd4eVFpM3NOcTQ2TzdRYWhRaUNzUkZncWRkakJvdVZFSE9LRGdYQVFIRDlnSkNyNXNNS2tFZGp3c2FyRy93dzNCTUhCVTdPQmpYbnpkeVk3U2ZDeGY1L3o2QVRjY3J3bEt1d0Mvamh6bm5QRjRDZ1Z6aGhWZjR4cDJFaXhjQkFjdE83NWlaOC9mTTl6QXMyT016S2RzbGdYV0o5WEc4UFFvT0FNQTVmR2Nzdk9SZ3YwZG9CWHlIckN3ZkxKQU93bzcxUUxOa2I4bjJQbDZFV2lSN09DaWJ0a1BhejRLYy8wTk5BemUyZ2p1M3pPd2VrQUxEYUNGUEk1dmpQRm1nR1k1QVpxeUdFdkgxeDdRZkliOFl0eE1uQS9iK1FRMGFRREF3YzZKTUZnOENiUVo0cW9ZRUVIYlJ3Tm9qdUszRUh3ZDdWQUxTZ3ErTU5ES3pmVDU4VDhxZHBBRHJnVzBHbWdjQVMxbGh6enRKbWtBemNQTk9RYnNXRUFMQkRTbE1LVUcwRXE0Q0xBUVd2RVZROVdVNTdnWkp3WnRnUE8zcjlvQlRROVdPOFRqcVhJTng4UjBFWXBpWkVVV09GM0Z4a2JKa2dVOUIyZjQxWUJySWo1WmZzUWEwTTVrVGdpQUFxTTNTaFhMZ3U4WE1xY3JRQnZKMENMNXBuVHNmTUIxM29COGF0aHBBcTJYT1FtY0dtb0FDQ0x5ZHg3blRvYTIzQVRhU0lZMmljaGZPZFBUR3hsYXNYTUxhTDBNTFpBT3dBS0lNK3k4Q21pY29iR2RDY2JiSzlEek4reVlHVm9OTkk1aVVLVE15WU9qUHNlNEE4U00xTW1jWGdVMHRvT3ExeU8vdjhGT3hsQVN5YzdUZ2VZYUFNQkpIY1kxQ2NDd0dJL1RLNEFtRGJEeUtZQkJ0RlVrUnd0bzhneWdpUUVhQnlGZ0owMEJIMk04Sld3UVMxbmFmRFhRQ2lkV3lPSThBY2pEQ1NqQ0xrOG5nT2J1QW0zSkFIQWR1YkFtT2FLMDZWOE1ORXNLUEpPaG9iU3Byd1FhNmdEN0RjbFJRZHFjd0w0enhxZ0JyUWNhYlVpQkxjbFJES0FsV3ArZXRQa0JhTk1BMEFLbHJId1RkRUJ5WkFBNEdNK1NObHVTWTZ3QXpjTU5ld3htZ2lnNUtzMG5rclNwQnZTYVFITWRLVEJBbkxvak9kWXlHcFEyNTQ2MDJaSUxQZFREMWhkbGdnZEltNzRqYlRwOHZEd0Y1WllVZUxXR0pwV3NoNlhOeVhnY1l3Vm9KUVRFaGhUWWt4elpqaVU1bnBVMlRhQjk3OVRRZWhsYUFWcTRrYUdwaVB3d3dMa1lVdUJiUXdvY3lRVHYxdEEwKzFVRldvSkYzaXYxb3ErcW9TazhFUWRKbXdIa3ppSUY3b09aazE0RUdpdGliQWRqTFlZSzc4SDV2Wk9odFdwb0kwQVRHSHMwUThPTWI0RXkrMmJVMlVZenRDdEEwd0ZBczdUcGxHTFJWUUNjcWFGZEdTUENlVEkxUU5JQzUyaVdOem9mNlVpYjd4akVwMDdtTk5vVVltVm9zVkl0SHJIelJsTGdCbjlMRnlSSGFRQ3RWVU1idFROaG9YV2lUT085ay9WOEJkQWMxT3EwQXJTUXM2LzVTVTBoY2tOeTlOblhxUVkwUEdZbzVkV0o3bklOYU42bzk1OEZXaW4yN2FCYVdSa2ExcjVteXZMT0FtMGozMGVCSnFDeEhMUmVWY2x4aHhPRU4ySmZEV2p4QnRBQzdNSUgxZlZhR2RvT3A0cUpZRGdLdEtQU0ZOSUQyZ1NuR2xkckNxa0ZaKzVVZVFYUUJJUnJTd29jYmRaWVFULzJMd1JhaEJQQlhvSHJCOG54YUdST1NUNjJES1ViUU9NTXpaSUM5YWJrdUVMZlF6UUFMV1RuRE5BbThLSFdGT0pnSjUrU0hJdlRQY214MXhReVpSaE5MNVFjaTY4OWFYTUVhTi91TklXa0V3REF2RnBPWm1nc0JhYUduYnMxTlBhMUptMzJnQlpBSWgxcEN0RzdUU0g0YUUweTF1Vlk0dXFvRlBpc0dscFAyclNBNXFUZWNXbjVhZ0s2QnpTcGdBeUQrd0ZhcWhuWW9TWjFWd3I4Q21sVFFicmNPM1phWDBOQUV5TWJZYUFseXF1Rm9MS0szU1BieTlDZVZVUFRoclNKbWtDQUUwQ3JLVVFhZGk0RHJkU2xXaG1haDBZTDl6OXZDbEg1OVlHYkh4MUo4VlpUeUFqUWVwSmptWHdBS1REUUkzb21jM3AxVTRnRFVmNlJmY2RZZnJVcDVDbEFpMkozQmE2VU9YR28rSytiUXJqanNzaXRHMlNKenNoYUx3TXRYZ1JhZ1VOcFlZb1ZrTVNCTE0rOUdHaUpaTXZkdUc2RFJaNHFjMDRETVB0UVF4T2pFdEFDbWhPN0sxQWJOYlFERWdnWnlKd3NjRnBBR3dFTmhvQmVVd2gzYldvbGhlOEJUWVZLeFFFV3JTVW4vdWhjTTVLaHZVdS8rZVF1MEx6aGkrVnJLMFByWlpORFFLczljcFlVdUZZZ01WcEQ0L054ZW5KVGlNQ05xZFVFVWYxcVpXanBwTFQ1cVNra1VaYkN3a2JaTVN1Vm51ODBoZlNrelJiUWVxQ1pTQWg2aHVSNFZ0b00yZ0hBbExmNzJzbXVXZ0UrVlY3WHBFMjVBYjJXRkRneWhuU3VLYnM0R3VHekNqUit0SW9VdU1GZzNrZ2NXS0xUd1JxYW5KUTJXMDBoQXNlbmZhQXBSQzQyaGJDdksxU2xFMEh0RTlCR2duZUpPK0VMYW1pdEQxWWpqT1luTllWY3JhR2h0S2tXMEVxVlZlRHg3MzNJMk5INTgxazFOTnhOTEcwaTBJSjgvTmpWYU9aMHRZWjJWdHIwWHY3dFBWM2hrV3A5RUZrZ1MvSjB2b3NuZ1RhU29hRzA2V0hpK3hPYlFrYUFkbGJhblA4QjIrMmwwZjkwTG1VQUFBQUFTVVZPUks1Q1lJST0pOyB9Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/theme/midnight.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogQmFzZWQgb24gdGhlIHRoZW1lIGF0IGh0dHA6Ly9ib25zYWlkZW4uZ2l0aHViLmNvbS9KYXZhU2NyaXB0LUdhcmRlbiAqLwoKLyo8IS0tbWF0Y2gtLT4qLwouY20tcy1taWRuaWdodCBzcGFuLkNvZGVNaXJyb3ItbWF0Y2hoaWdobGlnaHQgeyBiYWNrZ3JvdW5kOiAjNDk0OTQ5OyB9Ci5jbS1zLW1pZG5pZ2h0LkNvZGVNaXJyb3ItZm9jdXNlZCBzcGFuLkNvZGVNaXJyb3ItbWF0Y2hoaWdobGlnaHQgeyBiYWNrZ3JvdW5kOiAjMzE0RDY3ICFpbXBvcnRhbnQ7IH0KCi8qPCEtLWFjdGl2ZWxpbmUtLT4qLwouY20tcy1taWRuaWdodCAuQ29kZU1pcnJvci1hY3RpdmVsaW5lLWJhY2tncm91bmQge2JhY2tncm91bmQ6ICMyNTM1NDAgIWltcG9ydGFudDt9CgouY20tcy1taWRuaWdodC5Db2RlTWlycm9yIHsKICAgIGJhY2tncm91bmQ6ICMwRjE5MkE7CiAgICBjb2xvcjogI0QxRURGRjsKfQoKLmNtLXMtbWlkbmlnaHQuQ29kZU1pcnJvciB7Ym9yZGVyLXRvcDogMXB4IHNvbGlkIGJsYWNrOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7fQoKLmNtLXMtbWlkbmlnaHQgZGl2LkNvZGVNaXJyb3Itc2VsZWN0ZWQge2JhY2tncm91bmQ6ICMzMTRENjcgIWltcG9ydGFudDt9Ci5jbS1zLW1pZG5pZ2h0IC5Db2RlTWlycm9yLWd1dHRlcnMge2JhY2tncm91bmQ6ICMwRjE5MkE7IGJvcmRlci1yaWdodDogMXB4IHNvbGlkO30KLmNtLXMtbWlkbmlnaHQgLkNvZGVNaXJyb3ItZ3V0dGVybWFya2VyIHsgY29sb3I6IHdoaXRlOyB9Ci5jbS1zLW1pZG5pZ2h0IC5Db2RlTWlycm9yLWd1dHRlcm1hcmtlci1zdWJ0bGUgeyBjb2xvcjogI2QwZDBkMDsgfQouY20tcy1taWRuaWdodCAuQ29kZU1pcnJvci1saW5lbnVtYmVyIHtjb2xvcjogI0QwRDBEMDt9Ci5jbS1zLW1pZG5pZ2h0IC5Db2RlTWlycm9yLWN1cnNvciB7CiAgICBib3JkZXItbGVmdDogMXB4IHNvbGlkICNGOEY4RjAgIWltcG9ydGFudDsKfQoKLmNtLXMtbWlkbmlnaHQgc3Bhbi5jbS1jb21tZW50IHtjb2xvcjogIzQyOEJERDt9Ci5jbS1zLW1pZG5pZ2h0IHNwYW4uY20tYXRvbSB7Y29sb3I6ICNBRTgxRkY7fQouY20tcy1taWRuaWdodCBzcGFuLmNtLW51bWJlciB7Y29sb3I6ICNEMUVERkY7fQoKLmNtLXMtbWlkbmlnaHQgc3Bhbi5jbS1wcm9wZXJ0eSwgLmNtLXMtbWlkbmlnaHQgc3Bhbi5jbS1hdHRyaWJ1dGUge2NvbG9yOiAjQTZFMjJFO30KLmNtLXMtbWlkbmlnaHQgc3Bhbi5jbS1rZXl3b3JkIHtjb2xvcjogI0U4MzczNzt9Ci5jbS1zLW1pZG5pZ2h0IHNwYW4uY20tc3RyaW5nIHtjb2xvcjogIzFEQzExNjt9CgouY20tcy1taWRuaWdodCBzcGFuLmNtLXZhcmlhYmxlIHtjb2xvcjogI0ZGQUEzRTt9Ci5jbS1zLW1pZG5pZ2h0IHNwYW4uY20tdmFyaWFibGUtMiB7Y29sb3I6ICNGRkFBM0U7fQouY20tcy1taWRuaWdodCBzcGFuLmNtLWRlZiB7Y29sb3I6ICM0REQ7fQouY20tcy1taWRuaWdodCBzcGFuLmNtLWJyYWNrZXQge2NvbG9yOiAjRDFFREZGO30KLmNtLXMtbWlkbmlnaHQgc3Bhbi5jbS10YWcge2NvbG9yOiAjNDQ5O30KLmNtLXMtbWlkbmlnaHQgc3Bhbi5jbS1saW5rIHtjb2xvcjogI0FFODFGRjt9Ci5jbS1zLW1pZG5pZ2h0IHNwYW4uY20tZXJyb3Ige2JhY2tncm91bmQ6ICNGOTI2NzI7IGNvbG9yOiAjRjhGOEYwO30KCi5jbS1zLW1pZG5pZ2h0IC5Db2RlTWlycm9yLW1hdGNoaW5nYnJhY2tldCB7CiAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgY29sb3I6IHdoaXRlICFpbXBvcnRhbnQ7Cn0K]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/theme/monokai.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogQmFzZWQgb24gU3VibGltZSBUZXh0J3MgTW9ub2thaSB0aGVtZSAqLwoKLmNtLXMtbW9ub2thaS5Db2RlTWlycm9yIHtiYWNrZ3JvdW5kOiAjMjcyODIyOyBjb2xvcjogI2Y4ZjhmMjt9Ci5jbS1zLW1vbm9rYWkgZGl2LkNvZGVNaXJyb3Itc2VsZWN0ZWQge2JhY2tncm91bmQ6ICM0OTQ4M0UgIWltcG9ydGFudDt9Ci5jbS1zLW1vbm9rYWkgLkNvZGVNaXJyb3ItZ3V0dGVycyB7YmFja2dyb3VuZDogIzI3MjgyMjsgYm9yZGVyLXJpZ2h0OiAwcHg7fQouY20tcy1tb25va2FpIC5Db2RlTWlycm9yLWd1dHRlcm1hcmtlciB7IGNvbG9yOiB3aGl0ZTsgfQouY20tcy1tb25va2FpIC5Db2RlTWlycm9yLWd1dHRlcm1hcmtlci1zdWJ0bGUgeyBjb2xvcjogI2QwZDBkMDsgfQouY20tcy1tb25va2FpIC5Db2RlTWlycm9yLWxpbmVudW1iZXIge2NvbG9yOiAjZDBkMGQwO30KLmNtLXMtbW9ub2thaSAuQ29kZU1pcnJvci1jdXJzb3Ige2JvcmRlci1sZWZ0OiAxcHggc29saWQgI2Y4ZjhmMCAhaW1wb3J0YW50O30KCi5jbS1zLW1vbm9rYWkgc3Bhbi5jbS1jb21tZW50IHtjb2xvcjogIzc1NzE1ZTt9Ci5jbS1zLW1vbm9rYWkgc3Bhbi5jbS1hdG9tIHtjb2xvcjogI2FlODFmZjt9Ci5jbS1zLW1vbm9rYWkgc3Bhbi5jbS1udW1iZXIge2NvbG9yOiAjYWU4MWZmO30KCi5jbS1zLW1vbm9rYWkgc3Bhbi5jbS1wcm9wZXJ0eSwgLmNtLXMtbW9ub2thaSBzcGFuLmNtLWF0dHJpYnV0ZSB7Y29sb3I6ICNhNmUyMmU7fQouY20tcy1tb25va2FpIHNwYW4uY20ta2V5d29yZCB7Y29sb3I6ICNmOTI2NzI7fQouY20tcy1tb25va2FpIHNwYW4uY20tc3RyaW5nIHtjb2xvcjogI2U2ZGI3NDt9CgouY20tcy1tb25va2FpIHNwYW4uY20tdmFyaWFibGUge2NvbG9yOiAjYTZlMjJlO30KLmNtLXMtbW9ub2thaSBzcGFuLmNtLXZhcmlhYmxlLTIge2NvbG9yOiAjOWVmZmZmO30KLmNtLXMtbW9ub2thaSBzcGFuLmNtLWRlZiB7Y29sb3I6ICNmZDk3MWY7fQouY20tcy1tb25va2FpIHNwYW4uY20tYnJhY2tldCB7Y29sb3I6ICNmOGY4ZjI7fQouY20tcy1tb25va2FpIHNwYW4uY20tdGFnIHtjb2xvcjogI2Y5MjY3Mjt9Ci5jbS1zLW1vbm9rYWkgc3Bhbi5jbS1saW5rIHtjb2xvcjogI2FlODFmZjt9Ci5jbS1zLW1vbm9rYWkgc3Bhbi5jbS1lcnJvciB7YmFja2dyb3VuZDogI2Y5MjY3MjsgY29sb3I6ICNmOGY4ZjA7fQoKLmNtLXMtbW9ub2thaSAuQ29kZU1pcnJvci1hY3RpdmVsaW5lLWJhY2tncm91bmQge2JhY2tncm91bmQ6ICMzNzM4MzEgIWltcG9ydGFudDt9Ci5jbS1zLW1vbm9rYWkgLkNvZGVNaXJyb3ItbWF0Y2hpbmdicmFja2V0IHsKICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICBjb2xvcjogd2hpdGUgIWltcG9ydGFudDsKfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/theme/neat.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LmNtLXMtbmVhdCBzcGFuLmNtLWNvbW1lbnQgeyBjb2xvcjogI2E4NjsgfQouY20tcy1uZWF0IHNwYW4uY20ta2V5d29yZCB7IGxpbmUtaGVpZ2h0OiAxZW07IGZvbnQtd2VpZ2h0OiBib2xkOyBjb2xvcjogYmx1ZTsgfQouY20tcy1uZWF0IHNwYW4uY20tc3RyaW5nIHsgY29sb3I6ICNhMjI7IH0KLmNtLXMtbmVhdCBzcGFuLmNtLWJ1aWx0aW4geyBsaW5lLWhlaWdodDogMWVtOyBmb250LXdlaWdodDogYm9sZDsgY29sb3I6ICMwNzc7IH0KLmNtLXMtbmVhdCBzcGFuLmNtLXNwZWNpYWwgeyBsaW5lLWhlaWdodDogMWVtOyBmb250LXdlaWdodDogYm9sZDsgY29sb3I6ICMwYWE7IH0KLmNtLXMtbmVhdCBzcGFuLmNtLXZhcmlhYmxlIHsgY29sb3I6IGJsYWNrOyB9Ci5jbS1zLW5lYXQgc3Bhbi5jbS1udW1iZXIsIC5jbS1zLW5lYXQgc3Bhbi5jbS1hdG9tIHsgY29sb3I6ICMzYTM7IH0KLmNtLXMtbmVhdCBzcGFuLmNtLW1ldGEge2NvbG9yOiAjNTU1O30KLmNtLXMtbmVhdCBzcGFuLmNtLWxpbmsgeyBjb2xvcjogIzNhMzsgfQoKLmNtLXMtbmVhdCAuQ29kZU1pcnJvci1hY3RpdmVsaW5lLWJhY2tncm91bmQge2JhY2tncm91bmQ6ICNlOGYyZmYgIWltcG9ydGFudDt9Ci5jbS1zLW5lYXQgLkNvZGVNaXJyb3ItbWF0Y2hpbmdicmFja2V0IHtvdXRsaW5lOjFweCBzb2xpZCBncmV5OyBjb2xvcjpibGFjayAhaW1wb3J0YW50O30K]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/theme/neo.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogbmVvIHRoZW1lIGZvciBjb2RlbWlycm9yICovCgovKiBDb2xvciBzY2hlbWUgKi8KCi5jbS1zLW5lby5Db2RlTWlycm9yIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiNmZmZmZmY7CiAgY29sb3I6IzJlMzgzYzsKICBsaW5lLWhlaWdodDoxLjQzNzU7Cn0KLmNtLXMtbmVvIC5jbS1jb21tZW50IHtjb2xvcjojNzU3ODdifQouY20tcy1uZW8gLmNtLWtleXdvcmQsIC5jbS1zLW5lbyAuY20tcHJvcGVydHkge2NvbG9yOiMxZDc1YjN9Ci5jbS1zLW5lbyAuY20tYXRvbSwuY20tcy1uZW8gLmNtLW51bWJlciB7Y29sb3I6Izc1NDM4YX0KLmNtLXMtbmVvIC5jbS1ub2RlLC5jbS1zLW5lbyAuY20tdGFnIHtjb2xvcjojOWMzMzI4fQouY20tcy1uZW8gLmNtLXN0cmluZyB7Y29sb3I6I2IzNWUxNH0KLmNtLXMtbmVvIC5jbS12YXJpYWJsZSwuY20tcy1uZW8gLmNtLXF1YWxpZmllciB7Y29sb3I6IzA0N2Q2NX0KCgovKiBFZGl0b3Igc3R5bGluZyAqLwoKLmNtLXMtbmVvIHByZSB7CiAgcGFkZGluZzowOwp9CgouY20tcy1uZW8gLkNvZGVNaXJyb3ItZ3V0dGVycyB7CiAgYm9yZGVyOm5vbmU7CiAgYm9yZGVyLXJpZ2h0OjEwcHggc29saWQgdHJhbnNwYXJlbnQ7CiAgYmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDsKfQoKLmNtLXMtbmVvIC5Db2RlTWlycm9yLWxpbmVudW1iZXIgewogIHBhZGRpbmc6MDsKICBjb2xvcjojZTBlMmU1Owp9CgouY20tcy1uZW8gLkNvZGVNaXJyb3ItZ3V0dGVybWFya2VyIHsgY29sb3I6ICMxZDc1YjM7IH0KLmNtLXMtbmVvIC5Db2RlTWlycm9yLWd1dHRlcm1hcmtlci1zdWJ0bGUgeyBjb2xvcjogI2UwZTJlNTsgfQoKLmNtLXMtbmVvIGRpdi5Db2RlTWlycm9yLWN1cnNvciB7CiAgd2lkdGg6IGF1dG87CiAgYm9yZGVyOiAwOwogIGJhY2tncm91bmQ6IHJnYmEoMTU1LDE1NywxNjIsMC4zNyk7CiAgei1pbmRleDogMTsKfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/theme/night.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogTG9vc2VseSBiYXNlZCBvbiB0aGUgTWlkbmlnaHQgVGV4dG1hdGUgdGhlbWUgKi8KCi5jbS1zLW5pZ2h0LkNvZGVNaXJyb3IgeyBiYWNrZ3JvdW5kOiAjMGEwMDFmOyBjb2xvcjogI2Y4ZjhmODsgfQouY20tcy1uaWdodCBkaXYuQ29kZU1pcnJvci1zZWxlY3RlZCB7IGJhY2tncm91bmQ6ICM0NDcgIWltcG9ydGFudDsgfQouY20tcy1uaWdodCAuQ29kZU1pcnJvci1ndXR0ZXJzIHsgYmFja2dyb3VuZDogIzBhMDAxZjsgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgI2FhYTsgfQouY20tcy1uaWdodCAuQ29kZU1pcnJvci1ndXR0ZXJtYXJrZXIgeyBjb2xvcjogd2hpdGU7IH0KLmNtLXMtbmlnaHQgLkNvZGVNaXJyb3ItZ3V0dGVybWFya2VyLXN1YnRsZSB7IGNvbG9yOiAjYmJiOyB9Ci5jbS1zLW5pZ2h0IC5Db2RlTWlycm9yLWxpbmVudW1iZXIgeyBjb2xvcjogI2Y4ZjhmODsgfQouY20tcy1uaWdodCAuQ29kZU1pcnJvci1jdXJzb3IgeyBib3JkZXItbGVmdDogMXB4IHNvbGlkIHdoaXRlICFpbXBvcnRhbnQ7IH0KCi5jbS1zLW5pZ2h0IHNwYW4uY20tY29tbWVudCB7IGNvbG9yOiAjNjkwMGExOyB9Ci5jbS1zLW5pZ2h0IHNwYW4uY20tYXRvbSB7IGNvbG9yOiAjODQ1ZGM0OyB9Ci5jbS1zLW5pZ2h0IHNwYW4uY20tbnVtYmVyLCAuY20tcy1uaWdodCBzcGFuLmNtLWF0dHJpYnV0ZSB7IGNvbG9yOiAjZmZkNTAwOyB9Ci5jbS1zLW5pZ2h0IHNwYW4uY20ta2V5d29yZCB7IGNvbG9yOiAjNTk5ZWZmOyB9Ci5jbS1zLW5pZ2h0IHNwYW4uY20tc3RyaW5nIHsgY29sb3I6ICMzN2YxNGE7IH0KLmNtLXMtbmlnaHQgc3Bhbi5jbS1tZXRhIHsgY29sb3I6ICM3Njc4ZTI7IH0KLmNtLXMtbmlnaHQgc3Bhbi5jbS12YXJpYWJsZS0yLCAuY20tcy1uaWdodCBzcGFuLmNtLXRhZyB7IGNvbG9yOiAjOTliMmZmOyB9Ci5jbS1zLW5pZ2h0IHNwYW4uY20tdmFyaWFibGUtMywgLmNtLXMtbmlnaHQgc3Bhbi5jbS1kZWYgeyBjb2xvcjogd2hpdGU7IH0KLmNtLXMtbmlnaHQgc3Bhbi5jbS1icmFja2V0IHsgY29sb3I6ICM4ZGE2Y2U7IH0KLmNtLXMtbmlnaHQgc3Bhbi5jbS1jb21tZW50IHsgY29sb3I6ICM2OTAwYTE7IH0KLmNtLXMtbmlnaHQgc3Bhbi5jbS1idWlsdGluLCAuY20tcy1uaWdodCBzcGFuLmNtLXNwZWNpYWwgeyBjb2xvcjogI2ZmOWU1OTsgfQouY20tcy1uaWdodCBzcGFuLmNtLWxpbmsgeyBjb2xvcjogIzg0NWRjNDsgfQouY20tcy1uaWdodCBzcGFuLmNtLWVycm9yIHsgY29sb3I6ICM5ZDFlMTU7IH0KCi5jbS1zLW5pZ2h0IC5Db2RlTWlycm9yLWFjdGl2ZWxpbmUtYmFja2dyb3VuZCB7YmFja2dyb3VuZDogIzFDMDA1QSAhaW1wb3J0YW50O30KLmNtLXMtbmlnaHQgLkNvZGVNaXJyb3ItbWF0Y2hpbmdicmFja2V0IHtvdXRsaW5lOjFweCBzb2xpZCBncmV5OyBjb2xvcjp3aGl0ZSAhaW1wb3J0YW50O30K]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/theme/paraiso-dark.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKCiAgICBOYW1lOiAgICAgICBQYXJhw61zbyAoRGFyaykKICAgIEF1dGhvcjogICAgIEphbiBULiBTb3R0CgogICAgQ29sb3Igc2NoZW1lIGJ5IEphbiBULiBTb3R0IChodHRwczovL2dpdGh1Yi5jb20vaWRsZWJlcmcvUGFyYWlzby1Db2RlTWlycm9yKQogICAgSW5zcGlyZWQgYnkgdGhlIGFydCBvZiBSdWJlbnMgTFAgKGh0dHA6Ly93d3cucnViZW5zbHAuY29tLmJyKQoKKi8KCi5jbS1zLXBhcmFpc28tZGFyay5Db2RlTWlycm9yIHtiYWNrZ3JvdW5kOiAjMmYxZTJlOyBjb2xvcjogI2I5YjZiMDt9Ci5jbS1zLXBhcmFpc28tZGFyayBkaXYuQ29kZU1pcnJvci1zZWxlY3RlZCB7YmFja2dyb3VuZDogIzQxMzIzZiAhaW1wb3J0YW50O30KLmNtLXMtcGFyYWlzby1kYXJrIC5Db2RlTWlycm9yLWd1dHRlcnMge2JhY2tncm91bmQ6ICMyZjFlMmU7IGJvcmRlci1yaWdodDogMHB4O30KLmNtLXMtcGFyYWlzby1kYXJrIC5Db2RlTWlycm9yLWd1dHRlcm1hcmtlciB7IGNvbG9yOiAjZWY2MTU1OyB9Ci5jbS1zLXBhcmFpc28tZGFyayAuQ29kZU1pcnJvci1ndXR0ZXJtYXJrZXItc3VidGxlIHsgY29sb3I6ICM3NzZlNzE7IH0KLmNtLXMtcGFyYWlzby1kYXJrIC5Db2RlTWlycm9yLWxpbmVudW1iZXIge2NvbG9yOiAjNzc2ZTcxO30KLmNtLXMtcGFyYWlzby1kYXJrIC5Db2RlTWlycm9yLWN1cnNvciB7Ym9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjOGQ4Njg3ICFpbXBvcnRhbnQ7fQoKLmNtLXMtcGFyYWlzby1kYXJrIHNwYW4uY20tY29tbWVudCB7Y29sb3I6ICNlOTZiYTg7fQouY20tcy1wYXJhaXNvLWRhcmsgc3Bhbi5jbS1hdG9tIHtjb2xvcjogIzgxNWJhNDt9Ci5jbS1zLXBhcmFpc28tZGFyayBzcGFuLmNtLW51bWJlciB7Y29sb3I6ICM4MTViYTQ7fQoKLmNtLXMtcGFyYWlzby1kYXJrIHNwYW4uY20tcHJvcGVydHksIC5jbS1zLXBhcmFpc28tZGFyayBzcGFuLmNtLWF0dHJpYnV0ZSB7Y29sb3I6ICM0OGI2ODU7fQouY20tcy1wYXJhaXNvLWRhcmsgc3Bhbi5jbS1rZXl3b3JkIHtjb2xvcjogI2VmNjE1NTt9Ci5jbS1zLXBhcmFpc28tZGFyayBzcGFuLmNtLXN0cmluZyB7Y29sb3I6ICNmZWM0MTg7fQoKLmNtLXMtcGFyYWlzby1kYXJrIHNwYW4uY20tdmFyaWFibGUge2NvbG9yOiAjNDhiNjg1O30KLmNtLXMtcGFyYWlzby1kYXJrIHNwYW4uY20tdmFyaWFibGUtMiB7Y29sb3I6ICMwNmI2ZWY7fQouY20tcy1wYXJhaXNvLWRhcmsgc3Bhbi5jbS1kZWYge2NvbG9yOiAjZjk5YjE1O30KLmNtLXMtcGFyYWlzby1kYXJrIHNwYW4uY20tYnJhY2tldCB7Y29sb3I6ICNiOWI2YjA7fQouY20tcy1wYXJhaXNvLWRhcmsgc3Bhbi5jbS10YWcge2NvbG9yOiAjZWY2MTU1O30KLmNtLXMtcGFyYWlzby1kYXJrIHNwYW4uY20tbGluayB7Y29sb3I6ICM4MTViYTQ7fQouY20tcy1wYXJhaXNvLWRhcmsgc3Bhbi5jbS1lcnJvciB7YmFja2dyb3VuZDogI2VmNjE1NTsgY29sb3I6ICM4ZDg2ODc7fQoKLmNtLXMtcGFyYWlzby1kYXJrIC5Db2RlTWlycm9yLWFjdGl2ZWxpbmUtYmFja2dyb3VuZCB7YmFja2dyb3VuZDogIzREMzQ0QSAhaW1wb3J0YW50O30KLmNtLXMtcGFyYWlzby1kYXJrIC5Db2RlTWlycm9yLW1hdGNoaW5nYnJhY2tldCB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyBjb2xvcjogd2hpdGUgIWltcG9ydGFudDt9Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/theme/paraiso-light.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKCiAgICBOYW1lOiAgICAgICBQYXJhw61zbyAoTGlnaHQpCiAgICBBdXRob3I6ICAgICBKYW4gVC4gU290dAoKICAgIENvbG9yIHNjaGVtZSBieSBKYW4gVC4gU290dCAoaHR0cHM6Ly9naXRodWIuY29tL2lkbGViZXJnL1BhcmFpc28tQ29kZU1pcnJvcikKICAgIEluc3BpcmVkIGJ5IHRoZSBhcnQgb2YgUnViZW5zIExQIChodHRwOi8vd3d3LnJ1YmVuc2xwLmNvbS5icikKCiovCgouY20tcy1wYXJhaXNvLWxpZ2h0LkNvZGVNaXJyb3Ige2JhY2tncm91bmQ6ICNlN2U5ZGI7IGNvbG9yOiAjNDEzMjNmO30KLmNtLXMtcGFyYWlzby1saWdodCBkaXYuQ29kZU1pcnJvci1zZWxlY3RlZCB7YmFja2dyb3VuZDogI2I5YjZiMCAhaW1wb3J0YW50O30KLmNtLXMtcGFyYWlzby1saWdodCAuQ29kZU1pcnJvci1ndXR0ZXJzIHtiYWNrZ3JvdW5kOiAjZTdlOWRiOyBib3JkZXItcmlnaHQ6IDBweDt9Ci5jbS1zLXBhcmFpc28tbGlnaHQgLkNvZGVNaXJyb3ItZ3V0dGVybWFya2VyIHsgY29sb3I6IGJsYWNrOyB9Ci5jbS1zLXBhcmFpc28tbGlnaHQgLkNvZGVNaXJyb3ItZ3V0dGVybWFya2VyLXN1YnRsZSB7IGNvbG9yOiAjOGQ4Njg3OyB9Ci5jbS1zLXBhcmFpc28tbGlnaHQgLkNvZGVNaXJyb3ItbGluZW51bWJlciB7Y29sb3I6ICM4ZDg2ODc7fQouY20tcy1wYXJhaXNvLWxpZ2h0IC5Db2RlTWlycm9yLWN1cnNvciB7Ym9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjNzc2ZTcxICFpbXBvcnRhbnQ7fQoKLmNtLXMtcGFyYWlzby1saWdodCBzcGFuLmNtLWNvbW1lbnQge2NvbG9yOiAjZTk2YmE4O30KLmNtLXMtcGFyYWlzby1saWdodCBzcGFuLmNtLWF0b20ge2NvbG9yOiAjODE1YmE0O30KLmNtLXMtcGFyYWlzby1saWdodCBzcGFuLmNtLW51bWJlciB7Y29sb3I6ICM4MTViYTQ7fQoKLmNtLXMtcGFyYWlzby1saWdodCBzcGFuLmNtLXByb3BlcnR5LCAuY20tcy1wYXJhaXNvLWxpZ2h0IHNwYW4uY20tYXR0cmlidXRlIHtjb2xvcjogIzQ4YjY4NTt9Ci5jbS1zLXBhcmFpc28tbGlnaHQgc3Bhbi5jbS1rZXl3b3JkIHtjb2xvcjogI2VmNjE1NTt9Ci5jbS1zLXBhcmFpc28tbGlnaHQgc3Bhbi5jbS1zdHJpbmcge2NvbG9yOiAjZmVjNDE4O30KCi5jbS1zLXBhcmFpc28tbGlnaHQgc3Bhbi5jbS12YXJpYWJsZSB7Y29sb3I6ICM0OGI2ODU7fQouY20tcy1wYXJhaXNvLWxpZ2h0IHNwYW4uY20tdmFyaWFibGUtMiB7Y29sb3I6ICMwNmI2ZWY7fQouY20tcy1wYXJhaXNvLWxpZ2h0IHNwYW4uY20tZGVmIHtjb2xvcjogI2Y5OWIxNTt9Ci5jbS1zLXBhcmFpc28tbGlnaHQgc3Bhbi5jbS1icmFja2V0IHtjb2xvcjogIzQxMzIzZjt9Ci5jbS1zLXBhcmFpc28tbGlnaHQgc3Bhbi5jbS10YWcge2NvbG9yOiAjZWY2MTU1O30KLmNtLXMtcGFyYWlzby1saWdodCBzcGFuLmNtLWxpbmsge2NvbG9yOiAjODE1YmE0O30KLmNtLXMtcGFyYWlzby1saWdodCBzcGFuLmNtLWVycm9yIHtiYWNrZ3JvdW5kOiAjZWY2MTU1OyBjb2xvcjogIzc3NmU3MTt9CgouY20tcy1wYXJhaXNvLWxpZ2h0IC5Db2RlTWlycm9yLWFjdGl2ZWxpbmUtYmFja2dyb3VuZCB7YmFja2dyb3VuZDogI0NGRDFDNCAhaW1wb3J0YW50O30KLmNtLXMtcGFyYWlzby1saWdodCAuQ29kZU1pcnJvci1tYXRjaGluZ2JyYWNrZXQgeyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgY29sb3I6IHdoaXRlICFpbXBvcnRhbnQ7fQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/theme/pastel-on-dark.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIFBhc3RlbCBPbiBEYXJrIHRoZW1lIHBvcnRlZCBmcm9tIEFDRSBlZGl0b3IKICogQGxpY2Vuc2UgTUlUCiAqIEBjb3B5cmlnaHQgQXRvbWljUGFnZXMgTExDIDIwMTQKICogQGF1dGhvciBEZW5uaXMgVGhvbXBzb24sIEF0b21pY1BhZ2VzIExMQwogKiBAdmVyc2lvbiAxLjEKICogQHNvdXJjZSBodHRwczovL2dpdGh1Yi5jb20vYXRvbWljcGFnZXMvY29kZW1pcnJvci1wYXN0ZWwtb24tZGFyay10aGVtZQogKi8KCi5jbS1zLXBhc3RlbC1vbi1kYXJrLkNvZGVNaXJyb3IgewoJYmFja2dyb3VuZDogIzJjMjgyNzsKCWNvbG9yOiAjOEY5MzhGOwoJbGluZS1oZWlnaHQ6IDEuNTsKCWZvbnQtc2l6ZTogMTRweDsKfQouY20tcy1wYXN0ZWwtb24tZGFyayBkaXYuQ29kZU1pcnJvci1zZWxlY3RlZCB7IGJhY2tncm91bmQ6IHJnYmEoMjIxLDI0MCwyNTUsMC4yKSAhaW1wb3J0YW50OyB9Ci5jbS1zLXBhc3RlbC1vbi1kYXJrIC5Db2RlTWlycm9yLWd1dHRlcnMgewoJYmFja2dyb3VuZDogIzM0MzAyZjsKCWJvcmRlci1yaWdodDogMHB4OwoJcGFkZGluZzogMCAzcHg7Cn0KLmNtLXMtcGFzdGVsLW9uLWRhcmsgLkNvZGVNaXJyb3ItZ3V0dGVybWFya2VyIHsgY29sb3I6IHdoaXRlOyB9Ci5jbS1zLXBhc3RlbC1vbi1kYXJrIC5Db2RlTWlycm9yLWd1dHRlcm1hcmtlci1zdWJ0bGUgeyBjb2xvcjogIzhGOTM4RjsgfQouY20tcy1wYXN0ZWwtb24tZGFyayAuQ29kZU1pcnJvci1saW5lbnVtYmVyIHsgY29sb3I6ICM4RjkzOEY7IH0KLmNtLXMtcGFzdGVsLW9uLWRhcmsgLkNvZGVNaXJyb3ItY3Vyc29yIHsgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjQTdBN0E3ICFpbXBvcnRhbnQ7IH0KLmNtLXMtcGFzdGVsLW9uLWRhcmsgc3Bhbi5jbS1jb21tZW50IHsgY29sb3I6ICNBNkM2RkY7IH0KLmNtLXMtcGFzdGVsLW9uLWRhcmsgc3Bhbi5jbS1hdG9tIHsgY29sb3I6ICNERThFMzA7IH0KLmNtLXMtcGFzdGVsLW9uLWRhcmsgc3Bhbi5jbS1udW1iZXIgeyBjb2xvcjogI0NDQ0NDQzsgfQouY20tcy1wYXN0ZWwtb24tZGFyayBzcGFuLmNtLXByb3BlcnR5IHsgY29sb3I6ICM4RjkzOEY7IH0KLmNtLXMtcGFzdGVsLW9uLWRhcmsgc3Bhbi5jbS1hdHRyaWJ1dGUgeyBjb2xvcjogI2E2ZTIyZTsgfQouY20tcy1wYXN0ZWwtb24tZGFyayBzcGFuLmNtLWtleXdvcmQgeyBjb2xvcjogI0FFQjJGODsgfQouY20tcy1wYXN0ZWwtb24tZGFyayBzcGFuLmNtLXN0cmluZyB7IGNvbG9yOiAjNjZBOTY4OyB9Ci5jbS1zLXBhc3RlbC1vbi1kYXJrIHNwYW4uY20tdmFyaWFibGUgeyBjb2xvcjogI0FFQjJGODsgfQouY20tcy1wYXN0ZWwtb24tZGFyayBzcGFuLmNtLXZhcmlhYmxlLTIgeyBjb2xvcjogI0JFQkY1NTsgfQouY20tcy1wYXN0ZWwtb24tZGFyayBzcGFuLmNtLXZhcmlhYmxlLTMgeyBjb2xvcjogI0RFOEUzMDsgfQouY20tcy1wYXN0ZWwtb24tZGFyayBzcGFuLmNtLWRlZiB7IGNvbG9yOiAjNzU3YUQ4OyB9Ci5jbS1zLXBhc3RlbC1vbi1kYXJrIHNwYW4uY20tYnJhY2tldCB7IGNvbG9yOiAjZjhmOGYyOyB9Ci5jbS1zLXBhc3RlbC1vbi1kYXJrIHNwYW4uY20tdGFnIHsgY29sb3I6ICNDMUMxNDQ7IH0KLmNtLXMtcGFzdGVsLW9uLWRhcmsgc3Bhbi5jbS1saW5rIHsgY29sb3I6ICNhZTgxZmY7IH0KLmNtLXMtcGFzdGVsLW9uLWRhcmsgc3Bhbi5jbS1xdWFsaWZpZXIsLmNtLXMtcGFzdGVsLW9uLWRhcmsgc3Bhbi5jbS1idWlsdGluIHsgY29sb3I6ICNDMUMxNDQ7IH0KLmNtLXMtcGFzdGVsLW9uLWRhcmsgc3Bhbi5jbS1lcnJvciB7CgliYWNrZ3JvdW5kOiAjNzU3YUQ4OwoJY29sb3I6ICNmOGY4ZjA7Cn0KLmNtLXMtcGFzdGVsLW9uLWRhcmsgLkNvZGVNaXJyb3ItYWN0aXZlbGluZS1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjAzMSkgIWltcG9ydGFudDsgfQouY20tcy1wYXN0ZWwtb24tZGFyayAuQ29kZU1pcnJvci1tYXRjaGluZ2JyYWNrZXQgewoJYm9yZGVyOiAxcHggc29saWQgcmdiYSgyNTUsMjU1LDI1NSwwLjI1KTsKCWNvbG9yOiAjOEY5MzhGICFpbXBvcnRhbnQ7CgltYXJnaW46IC0xcHggLTFweCAwIC0xcHg7Cn0K]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/theme/rubyblue.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LmNtLXMtcnVieWJsdWUuQ29kZU1pcnJvciB7IGJhY2tncm91bmQ6ICMxMTI0MzU7IGNvbG9yOiB3aGl0ZTsgfQouY20tcy1ydWJ5Ymx1ZSBkaXYuQ29kZU1pcnJvci1zZWxlY3RlZCB7IGJhY2tncm91bmQ6ICMzODU2NkYgIWltcG9ydGFudDsgfQouY20tcy1ydWJ5Ymx1ZSAuQ29kZU1pcnJvci1ndXR0ZXJzIHsgYmFja2dyb3VuZDogIzFGNDY2MTsgYm9yZGVyLXJpZ2h0OiA3cHggc29saWQgIzNFNzA4NzsgfQouY20tcy1ydWJ5Ymx1ZSAuQ29kZU1pcnJvci1ndXR0ZXJtYXJrZXIgeyBjb2xvcjogd2hpdGU7IH0KLmNtLXMtcnVieWJsdWUgLkNvZGVNaXJyb3ItZ3V0dGVybWFya2VyLXN1YnRsZSB7IGNvbG9yOiAjM0U3MDg3OyB9Ci5jbS1zLXJ1YnlibHVlIC5Db2RlTWlycm9yLWxpbmVudW1iZXIgeyBjb2xvcjogd2hpdGU7IH0KLmNtLXMtcnVieWJsdWUgLkNvZGVNaXJyb3ItY3Vyc29yIHsgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCB3aGl0ZSAhaW1wb3J0YW50OyB9CgouY20tcy1ydWJ5Ymx1ZSBzcGFuLmNtLWNvbW1lbnQgeyBjb2xvcjogIzk5OTsgZm9udC1zdHlsZTppdGFsaWM7IGxpbmUtaGVpZ2h0OiAxZW07IH0KLmNtLXMtcnVieWJsdWUgc3Bhbi5jbS1hdG9tIHsgY29sb3I6ICNGNEMyMEI7IH0KLmNtLXMtcnVieWJsdWUgc3Bhbi5jbS1udW1iZXIsIC5jbS1zLXJ1YnlibHVlIHNwYW4uY20tYXR0cmlidXRlIHsgY29sb3I6ICM4MkM2RTA7IH0KLmNtLXMtcnVieWJsdWUgc3Bhbi5jbS1rZXl3b3JkIHsgY29sb3I6ICNGMEY7IH0KLmNtLXMtcnVieWJsdWUgc3Bhbi5jbS1zdHJpbmcgeyBjb2xvcjogI0YwODA0NzsgfQouY20tcy1ydWJ5Ymx1ZSBzcGFuLmNtLW1ldGEgeyBjb2xvcjogI0YwRjsgfQouY20tcy1ydWJ5Ymx1ZSBzcGFuLmNtLXZhcmlhYmxlLTIsIC5jbS1zLXJ1YnlibHVlIHNwYW4uY20tdGFnIHsgY29sb3I6ICM3QkQ4Mjc7IH0KLmNtLXMtcnVieWJsdWUgc3Bhbi5jbS12YXJpYWJsZS0zLCAuY20tcy1ydWJ5Ymx1ZSBzcGFuLmNtLWRlZiB7IGNvbG9yOiB3aGl0ZTsgfQouY20tcy1ydWJ5Ymx1ZSBzcGFuLmNtLWJyYWNrZXQgeyBjb2xvcjogI0YwRjsgfQouY20tcy1ydWJ5Ymx1ZSBzcGFuLmNtLWxpbmsgeyBjb2xvcjogI0Y0QzIwQjsgfQouY20tcy1ydWJ5Ymx1ZSBzcGFuLkNvZGVNaXJyb3ItbWF0Y2hpbmdicmFja2V0IHsgY29sb3I6I0YwRiAhaW1wb3J0YW50OyB9Ci5jbS1zLXJ1YnlibHVlIHNwYW4uY20tYnVpbHRpbiwgLmNtLXMtcnVieWJsdWUgc3Bhbi5jbS1zcGVjaWFsIHsgY29sb3I6ICNGRjlEMDA7IH0KLmNtLXMtcnVieWJsdWUgc3Bhbi5jbS1lcnJvciB7IGNvbG9yOiAjQUYyMDE4OyB9CgouY20tcy1ydWJ5Ymx1ZSAuQ29kZU1pcnJvci1hY3RpdmVsaW5lLWJhY2tncm91bmQge2JhY2tncm91bmQ6ICMxNzMwNDcgIWltcG9ydGFudDt9Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/theme/solarized.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKU29sYXJpemVkIHRoZW1lIGZvciBjb2RlLW1pcnJvcgpodHRwOi8vZXRoYW5zY2hvb25vdmVyLmNvbS9zb2xhcml6ZWQKKi8KCi8qClNvbGFyaXplZCBjb2xvciBwYWxsZXQKaHR0cDovL2V0aGFuc2Nob29ub3Zlci5jb20vc29sYXJpemVkL2ltZy9zb2xhcml6ZWQtcGFsZXR0ZS5wbmcKKi8KCi5zb2xhcml6ZWQuYmFzZTAzIHsgY29sb3I6ICMwMDJiMzY7IH0KLnNvbGFyaXplZC5iYXNlMDIgeyBjb2xvcjogIzA3MzY0MjsgfQouc29sYXJpemVkLmJhc2UwMSB7IGNvbG9yOiAjNTg2ZTc1OyB9Ci5zb2xhcml6ZWQuYmFzZTAwIHsgY29sb3I6ICM2NTdiODM7IH0KLnNvbGFyaXplZC5iYXNlMCB7IGNvbG9yOiAjODM5NDk2OyB9Ci5zb2xhcml6ZWQuYmFzZTEgeyBjb2xvcjogIzkzYTFhMTsgfQouc29sYXJpemVkLmJhc2UyIHsgY29sb3I6ICNlZWU4ZDU7IH0KLnNvbGFyaXplZC5iYXNlMyAgeyBjb2xvcjogI2ZkZjZlMzsgfQouc29sYXJpemVkLnNvbGFyLXllbGxvdyAgeyBjb2xvcjogI2I1ODkwMDsgfQouc29sYXJpemVkLnNvbGFyLW9yYW5nZSAgeyBjb2xvcjogI2NiNGIxNjsgfQouc29sYXJpemVkLnNvbGFyLXJlZCB7IGNvbG9yOiAjZGMzMjJmOyB9Ci5zb2xhcml6ZWQuc29sYXItbWFnZW50YSB7IGNvbG9yOiAjZDMzNjgyOyB9Ci5zb2xhcml6ZWQuc29sYXItdmlvbGV0ICB7IGNvbG9yOiAjNmM3MWM0OyB9Ci5zb2xhcml6ZWQuc29sYXItYmx1ZSB7IGNvbG9yOiAjMjY4YmQyOyB9Ci5zb2xhcml6ZWQuc29sYXItY3lhbiB7IGNvbG9yOiAjMmFhMTk4OyB9Ci5zb2xhcml6ZWQuc29sYXItZ3JlZW4geyBjb2xvcjogIzg1OTkwMDsgfQoKLyogQ29sb3Igc2NoZW1lIGZvciBjb2RlLW1pcnJvciAqLwoKLmNtLXMtc29sYXJpemVkIHsKICBsaW5lLWhlaWdodDogMS40NWVtOwogIGNvbG9yLXByb2ZpbGU6IHNSR0I7CiAgcmVuZGVyaW5nLWludGVudDogYXV0bzsKfQouY20tcy1zb2xhcml6ZWQuY20tcy1kYXJrIHsKICBjb2xvcjogIzgzOTQ5NjsKICBiYWNrZ3JvdW5kLWNvbG9yOiAgIzAwMmIzNjsKICB0ZXh0LXNoYWRvdzogIzAwMmIzNiAwIDFweDsKfQouY20tcy1zb2xhcml6ZWQuY20tcy1saWdodCB7CiAgYmFja2dyb3VuZC1jb2xvcjogI2ZkZjZlMzsKICBjb2xvcjogIzY1N2I4MzsKICB0ZXh0LXNoYWRvdzogI2VlZThkNSAwIDFweDsKfQoKLmNtLXMtc29sYXJpemVkIC5Db2RlTWlycm9yLXdpZGdldCB7CiAgdGV4dC1zaGFkb3c6IG5vbmU7Cn0KCgouY20tcy1zb2xhcml6ZWQgLmNtLWtleXdvcmQgeyBjb2xvcjogI2NiNGIxNiB9Ci5jbS1zLXNvbGFyaXplZCAuY20tYXRvbSB7IGNvbG9yOiAjZDMzNjgyOyB9Ci5jbS1zLXNvbGFyaXplZCAuY20tbnVtYmVyIHsgY29sb3I6ICNkMzM2ODI7IH0KLmNtLXMtc29sYXJpemVkIC5jbS1kZWYgeyBjb2xvcjogIzJhYTE5ODsgfQoKLmNtLXMtc29sYXJpemVkIC5jbS12YXJpYWJsZSB7IGNvbG9yOiAjMjY4YmQyOyB9Ci5jbS1zLXNvbGFyaXplZCAuY20tdmFyaWFibGUtMiB7IGNvbG9yOiAjYjU4OTAwOyB9Ci5jbS1zLXNvbGFyaXplZCAuY20tdmFyaWFibGUtMyB7IGNvbG9yOiAjNmM3MWM0OyB9CgouY20tcy1zb2xhcml6ZWQgLmNtLXByb3BlcnR5IHsgY29sb3I6ICMyYWExOTg7IH0KLmNtLXMtc29sYXJpemVkIC5jbS1vcGVyYXRvciB7Y29sb3I6ICM2YzcxYzQ7fQoKLmNtLXMtc29sYXJpemVkIC5jbS1jb21tZW50IHsgY29sb3I6ICM1ODZlNzU7IGZvbnQtc3R5bGU6aXRhbGljOyB9CgouY20tcy1zb2xhcml6ZWQgLmNtLXN0cmluZyB7IGNvbG9yOiAjODU5OTAwOyB9Ci5jbS1zLXNvbGFyaXplZCAuY20tc3RyaW5nLTIgeyBjb2xvcjogI2I1ODkwMDsgfQoKLmNtLXMtc29sYXJpemVkIC5jbS1tZXRhIHsgY29sb3I6ICM4NTk5MDA7IH0KLmNtLXMtc29sYXJpemVkIC5jbS1xdWFsaWZpZXIgeyBjb2xvcjogI2I1ODkwMDsgfQouY20tcy1zb2xhcml6ZWQgLmNtLWJ1aWx0aW4geyBjb2xvcjogI2QzMzY4MjsgfQouY20tcy1zb2xhcml6ZWQgLmNtLWJyYWNrZXQgeyBjb2xvcjogI2NiNGIxNjsgfQouY20tcy1zb2xhcml6ZWQgLkNvZGVNaXJyb3ItbWF0Y2hpbmdicmFja2V0IHsgY29sb3I6ICM4NTk5MDA7IH0KLmNtLXMtc29sYXJpemVkIC5Db2RlTWlycm9yLW5vbm1hdGNoaW5nYnJhY2tldCB7IGNvbG9yOiAjZGMzMjJmOyB9Ci5jbS1zLXNvbGFyaXplZCAuY20tdGFnIHsgY29sb3I6ICM5M2ExYTEgfQouY20tcy1zb2xhcml6ZWQgLmNtLWF0dHJpYnV0ZSB7ICBjb2xvcjogIzJhYTE5ODsgfQouY20tcy1zb2xhcml6ZWQgLmNtLWhlYWRlciB7IGNvbG9yOiAjNTg2ZTc1OyB9Ci5jbS1zLXNvbGFyaXplZCAuY20tcXVvdGUgeyBjb2xvcjogIzkzYTFhMTsgfQouY20tcy1zb2xhcml6ZWQgLmNtLWhyIHsKICBjb2xvcjogdHJhbnNwYXJlbnQ7CiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICM1ODZlNzU7CiAgZGlzcGxheTogYmxvY2s7Cn0KLmNtLXMtc29sYXJpemVkIC5jbS1saW5rIHsgY29sb3I6ICM5M2ExYTE7IGN1cnNvcjogcG9pbnRlcjsgfQouY20tcy1zb2xhcml6ZWQgLmNtLXNwZWNpYWwgeyBjb2xvcjogIzZjNzFjNDsgfQouY20tcy1zb2xhcml6ZWQgLmNtLWVtIHsKICBjb2xvcjogIzk5OTsKICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICB0ZXh0LWRlY29yYXRpb24tc3R5bGU6IGRvdHRlZDsKfQouY20tcy1zb2xhcml6ZWQgLmNtLXN0cm9uZyB7IGNvbG9yOiAjZWVlOyB9Ci5jbS1zLXNvbGFyaXplZCAuY20tdGFiOmJlZm9yZSB7CiAgY29udGVudDogIuKepCI7ICAgLyp2aXN1YWxpemUgdGFiIGNoYXJhY3RlciovCiAgY29sb3I6ICM1ODZlNzU7CiAgcG9zaXRpb246YWJzb2x1dGU7Cn0KLmNtLXMtc29sYXJpemVkIC5jbS1lcnJvciwKLmNtLXMtc29sYXJpemVkIC5jbS1pbnZhbGlkY2hhciB7CiAgY29sb3I6ICM1ODZlNzU7CiAgYm9yZGVyLWJvdHRvbTogMXB4IGRvdHRlZCAjZGMzMjJmOwp9CgouY20tcy1zb2xhcml6ZWQuY20tcy1kYXJrIC5Db2RlTWlycm9yLXNlbGVjdGVkIHsKICBiYWNrZ3JvdW5kOiAjMDczNjQyOwp9CgouY20tcy1zb2xhcml6ZWQuY20tcy1saWdodCAuQ29kZU1pcnJvci1zZWxlY3RlZCB7CiAgYmFja2dyb3VuZDogI2VlZThkNTsKfQoKLyogRWRpdG9yIHN0eWxpbmcgKi8KCgoKLyogTGl0dGxlIHNoYWRvdyBvbiB0aGUgdmlldy1wb3J0IG9mIHRoZSBidWZmZXIgdmlldyAqLwouY20tcy1zb2xhcml6ZWQuQ29kZU1pcnJvciB7CiAgLW1vei1ib3gtc2hhZG93OiBpbnNldCA3cHggMCAxMnB4IC02cHggIzAwMDsKICAtd2Via2l0LWJveC1zaGFkb3c6IGluc2V0IDdweCAwIDEycHggLTZweCAjMDAwOwogIGJveC1zaGFkb3c6IGluc2V0IDdweCAwIDEycHggLTZweCAjMDAwOwp9CgovKiBHdXR0ZXIgYm9yZGVyIGFuZCBzb21lIHNoYWRvdyBmcm9tIGl0ICAqLwouY20tcy1zb2xhcml6ZWQgLkNvZGVNaXJyb3ItZ3V0dGVycyB7CiAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQ7Cn0KCi8qIEd1dHRlciBjb2xvcnMgYW5kIGxpbmUgbnVtYmVyIHN0eWxpbmcgYmFzZWQgb2YgY29sb3Igc2NoZW1lIChkYXJrIC8gbGlnaHQpICovCgovKiBEYXJrICovCi5jbS1zLXNvbGFyaXplZC5jbS1zLWRhcmsgLkNvZGVNaXJyb3ItZ3V0dGVycyB7CiAgYmFja2dyb3VuZC1jb2xvcjogICMwMDJiMzY7CiAgYm9yZGVyLWNvbG9yOiAjMDAyMzJjOwp9CgouY20tcy1zb2xhcml6ZWQuY20tcy1kYXJrIC5Db2RlTWlycm9yLWxpbmVudW1iZXIgewogIHRleHQtc2hhZG93OiAjMDIxMDE0IDAgLTFweDsKfQoKLyogTGlnaHQgKi8KLmNtLXMtc29sYXJpemVkLmNtLXMtbGlnaHQgLkNvZGVNaXJyb3ItZ3V0dGVycyB7CiAgYmFja2dyb3VuZC1jb2xvcjogI2ZkZjZlMzsKICBib3JkZXItY29sb3I6ICNlZWU4ZDU7Cn0KCi8qIENvbW1vbiAqLwouY20tcy1zb2xhcml6ZWQgLkNvZGVNaXJyb3ItbGluZW51bWJlciB7CiAgY29sb3I6ICM1ODZlNzU7CiAgcGFkZGluZzogMCA1cHg7Cn0KLmNtLXMtc29sYXJpemVkIC5Db2RlTWlycm9yLWd1dHRlcm1hcmtlci1zdWJ0bGUgeyBjb2xvcjogIzU4NmU3NTsgfQouY20tcy1zb2xhcml6ZWQuY20tcy1kYXJrIC5Db2RlTWlycm9yLWd1dHRlcm1hcmtlciB7IGNvbG9yOiAjZGRkOyB9Ci5jbS1zLXNvbGFyaXplZC5jbS1zLWxpZ2h0IC5Db2RlTWlycm9yLWd1dHRlcm1hcmtlciB7IGNvbG9yOiAjY2I0YjE2OyB9CgouY20tcy1zb2xhcml6ZWQgLkNvZGVNaXJyb3ItZ3V0dGVyIC5Db2RlTWlycm9yLWd1dHRlci10ZXh0IHsKICBjb2xvcjogIzU4NmU3NTsKfQoKLmNtLXMtc29sYXJpemVkIC5Db2RlTWlycm9yLWxpbmVzIC5Db2RlTWlycm9yLWN1cnNvciB7CiAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjODE5MDkwOwp9CgovKgpBY3RpdmUgbGluZS4gTmVnYXRpdmUgbWFyZ2luIGNvbXBlbnNhdGVzIGxlZnQgcGFkZGluZyBvZiB0aGUgdGV4dCBpbiB0aGUKdmlldy1wb3J0CiovCi5jbS1zLXNvbGFyaXplZC5jbS1zLWRhcmsgLkNvZGVNaXJyb3ItYWN0aXZlbGluZS1iYWNrZ3JvdW5kIHsKICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTApOwp9Ci5jbS1zLXNvbGFyaXplZC5jbS1zLWxpZ2h0IC5Db2RlTWlycm9yLWFjdGl2ZWxpbmUtYmFja2dyb3VuZCB7CiAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjEwKTsKfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/theme/the-matrix.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LmNtLXMtdGhlLW1hdHJpeC5Db2RlTWlycm9yIHsgYmFja2dyb3VuZDogIzAwMDAwMDsgY29sb3I6ICMwMEZGMDA7IH0KLmNtLXMtdGhlLW1hdHJpeCBkaXYuQ29kZU1pcnJvci1zZWxlY3RlZCB7IGJhY2tncm91bmQ6ICMyRDJEMkQgIWltcG9ydGFudDsgfQouY20tcy10aGUtbWF0cml4IC5Db2RlTWlycm9yLWd1dHRlcnMgeyBiYWNrZ3JvdW5kOiAjMDYwOyBib3JkZXItcmlnaHQ6IDJweCBzb2xpZCAjMDBGRjAwOyB9Ci5jbS1zLXRoZS1tYXRyaXggLkNvZGVNaXJyb3ItZ3V0dGVybWFya2VyIHsgY29sb3I6ICMwZjA7IH0KLmNtLXMtdGhlLW1hdHJpeCAuQ29kZU1pcnJvci1ndXR0ZXJtYXJrZXItc3VidGxlIHsgY29sb3I6IHdoaXRlOyB9Ci5jbS1zLXRoZS1tYXRyaXggLkNvZGVNaXJyb3ItbGluZW51bWJlciB7IGNvbG9yOiAjRkZGRkZGOyB9Ci5jbS1zLXRoZS1tYXRyaXggLkNvZGVNaXJyb3ItY3Vyc29yIHsgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjMDBGRjAwICFpbXBvcnRhbnQ7IH0KCi5jbS1zLXRoZS1tYXRyaXggc3Bhbi5jbS1rZXl3b3JkIHtjb2xvcjogIzAwODgwMzsgZm9udC13ZWlnaHQ6IGJvbGQ7fQouY20tcy10aGUtbWF0cml4IHNwYW4uY20tYXRvbSB7Y29sb3I6ICMzRkY7fQouY20tcy10aGUtbWF0cml4IHNwYW4uY20tbnVtYmVyIHtjb2xvcjogI0ZGQjk0Rjt9Ci5jbS1zLXRoZS1tYXRyaXggc3Bhbi5jbS1kZWYge2NvbG9yOiAjOTlDO30KLmNtLXMtdGhlLW1hdHJpeCBzcGFuLmNtLXZhcmlhYmxlIHtjb2xvcjogI0Y2Qzt9Ci5jbS1zLXRoZS1tYXRyaXggc3Bhbi5jbS12YXJpYWJsZS0yIHtjb2xvcjogI0M2Rjt9Ci5jbS1zLXRoZS1tYXRyaXggc3Bhbi5jbS12YXJpYWJsZS0zIHtjb2xvcjogIzk2Rjt9Ci5jbS1zLXRoZS1tYXRyaXggc3Bhbi5jbS1wcm9wZXJ0eSB7Y29sb3I6ICM2MkZGQTA7fQouY20tcy10aGUtbWF0cml4IHNwYW4uY20tb3BlcmF0b3Ige2NvbG9yOiAjOTk5fQouY20tcy10aGUtbWF0cml4IHNwYW4uY20tY29tbWVudCB7Y29sb3I6ICNDQ0NDQ0M7fQouY20tcy10aGUtbWF0cml4IHNwYW4uY20tc3RyaW5nIHtjb2xvcjogIzM5Qzt9Ci5jbS1zLXRoZS1tYXRyaXggc3Bhbi5jbS1tZXRhIHtjb2xvcjogI0M5Rjt9Ci5jbS1zLXRoZS1tYXRyaXggc3Bhbi5jbS1xdWFsaWZpZXIge2NvbG9yOiAjRkZGNzAwO30KLmNtLXMtdGhlLW1hdHJpeCBzcGFuLmNtLWJ1aWx0aW4ge2NvbG9yOiAjMzBhO30KLmNtLXMtdGhlLW1hdHJpeCBzcGFuLmNtLWJyYWNrZXQge2NvbG9yOiAjY2M3O30KLmNtLXMtdGhlLW1hdHJpeCBzcGFuLmNtLXRhZyB7Y29sb3I6ICNGRkJENDA7fQouY20tcy10aGUtbWF0cml4IHNwYW4uY20tYXR0cmlidXRlIHtjb2xvcjogI0ZGRjcwMDt9Ci5jbS1zLXRoZS1tYXRyaXggc3Bhbi5jbS1lcnJvciB7Y29sb3I6ICNGRjAwMDA7fQoKLmNtLXMtdGhlLW1hdHJpeCAuQ29kZU1pcnJvci1hY3RpdmVsaW5lLWJhY2tncm91bmQge2JhY2tncm91bmQ6ICMwNDA7fQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/theme/tomorrow-night-eighties.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKCiAgICBOYW1lOiAgICAgICBUb21vcnJvdyBOaWdodCAtIEVpZ2h0aWVzCiAgICBBdXRob3I6ICAgICBDaHJpcyBLZW1wc29uCgogICAgQ29kZU1pcnJvciB0ZW1wbGF0ZSBieSBKYW4gVC4gU290dCAoaHR0cHM6Ly9naXRodWIuY29tL2lkbGViZXJnL2Jhc2UxNi1jb2RlbWlycm9yKQogICAgT3JpZ2luYWwgQmFzZTE2IGNvbG9yIHNjaGVtZSBieSBDaHJpcyBLZW1wc29uIChodHRwczovL2dpdGh1Yi5jb20vY2hyaXNrZW1wc29uL2Jhc2UxNikKCiovCgouY20tcy10b21vcnJvdy1uaWdodC1laWdodGllcy5Db2RlTWlycm9yIHtiYWNrZ3JvdW5kOiAjMDAwMDAwOyBjb2xvcjogI0NDQ0NDQzt9Ci5jbS1zLXRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzIGRpdi5Db2RlTWlycm9yLXNlbGVjdGVkIHtiYWNrZ3JvdW5kOiAjMkQyRDJEICFpbXBvcnRhbnQ7fQouY20tcy10b21vcnJvdy1uaWdodC1laWdodGllcyAuQ29kZU1pcnJvci1ndXR0ZXJzIHtiYWNrZ3JvdW5kOiAjMDAwMDAwOyBib3JkZXItcmlnaHQ6IDBweDt9Ci5jbS1zLXRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzIC5Db2RlTWlycm9yLWd1dHRlcm1hcmtlciB7IGNvbG9yOiAjZjI3NzdhOyB9Ci5jbS1zLXRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzIC5Db2RlTWlycm9yLWd1dHRlcm1hcmtlci1zdWJ0bGUgeyBjb2xvcjogIzc3NzsgfQouY20tcy10b21vcnJvdy1uaWdodC1laWdodGllcyAuQ29kZU1pcnJvci1saW5lbnVtYmVyIHtjb2xvcjogIzUxNTE1MTt9Ci5jbS1zLXRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzIC5Db2RlTWlycm9yLWN1cnNvciB7Ym9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjNkE2QTZBICFpbXBvcnRhbnQ7fQoKLmNtLXMtdG9tb3Jyb3ctbmlnaHQtZWlnaHRpZXMgc3Bhbi5jbS1jb21tZW50IHtjb2xvcjogI2QyN2I1Mzt9Ci5jbS1zLXRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzIHNwYW4uY20tYXRvbSB7Y29sb3I6ICNhMTZhOTQ7fQouY20tcy10b21vcnJvdy1uaWdodC1laWdodGllcyBzcGFuLmNtLW51bWJlciB7Y29sb3I6ICNhMTZhOTQ7fQoKLmNtLXMtdG9tb3Jyb3ctbmlnaHQtZWlnaHRpZXMgc3Bhbi5jbS1wcm9wZXJ0eSwgLmNtLXMtdG9tb3Jyb3ctbmlnaHQtZWlnaHRpZXMgc3Bhbi5jbS1hdHRyaWJ1dGUge2NvbG9yOiAjOTljYzk5O30KLmNtLXMtdG9tb3Jyb3ctbmlnaHQtZWlnaHRpZXMgc3Bhbi5jbS1rZXl3b3JkIHtjb2xvcjogI2YyNzc3YTt9Ci5jbS1zLXRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzIHNwYW4uY20tc3RyaW5nIHtjb2xvcjogI2ZmY2M2Njt9CgouY20tcy10b21vcnJvdy1uaWdodC1laWdodGllcyBzcGFuLmNtLXZhcmlhYmxlIHtjb2xvcjogIzk5Y2M5OTt9Ci5jbS1zLXRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzIHNwYW4uY20tdmFyaWFibGUtMiB7Y29sb3I6ICM2Njk5Y2M7fQouY20tcy10b21vcnJvdy1uaWdodC1laWdodGllcyBzcGFuLmNtLWRlZiB7Y29sb3I6ICNmOTkxNTc7fQouY20tcy10b21vcnJvdy1uaWdodC1laWdodGllcyBzcGFuLmNtLWJyYWNrZXQge2NvbG9yOiAjQ0NDQ0NDO30KLmNtLXMtdG9tb3Jyb3ctbmlnaHQtZWlnaHRpZXMgc3Bhbi5jbS10YWcge2NvbG9yOiAjZjI3NzdhO30KLmNtLXMtdG9tb3Jyb3ctbmlnaHQtZWlnaHRpZXMgc3Bhbi5jbS1saW5rIHtjb2xvcjogI2ExNmE5NDt9Ci5jbS1zLXRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzIHNwYW4uY20tZXJyb3Ige2JhY2tncm91bmQ6ICNmMjc3N2E7IGNvbG9yOiAjNkE2QTZBO30KCi5jbS1zLXRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzIC5Db2RlTWlycm9yLWFjdGl2ZWxpbmUtYmFja2dyb3VuZCB7YmFja2dyb3VuZDogIzM0MzYwMCAhaW1wb3J0YW50O30KLmNtLXMtdG9tb3Jyb3ctbmlnaHQtZWlnaHRpZXMgLkNvZGVNaXJyb3ItbWF0Y2hpbmdicmFja2V0IHsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IGNvbG9yOiB3aGl0ZSAhaW1wb3J0YW50O30K]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/theme/twilight.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LmNtLXMtdHdpbGlnaHQuQ29kZU1pcnJvciB7IGJhY2tncm91bmQ6ICMxNDE0MTQ7IGNvbG9yOiAjZjdmN2Y3OyB9IC8qKi8KLmNtLXMtdHdpbGlnaHQgLkNvZGVNaXJyb3Itc2VsZWN0ZWQgeyBiYWNrZ3JvdW5kOiAjMzIzMjMyICFpbXBvcnRhbnQ7IH0gLyoqLwoKLmNtLXMtdHdpbGlnaHQgLkNvZGVNaXJyb3ItZ3V0dGVycyB7IGJhY2tncm91bmQ6ICMyMjI7IGJvcmRlci1yaWdodDogMXB4IHNvbGlkICNhYWE7IH0KLmNtLXMtdHdpbGlnaHQgLkNvZGVNaXJyb3ItZ3V0dGVybWFya2VyIHsgY29sb3I6IHdoaXRlOyB9Ci5jbS1zLXR3aWxpZ2h0IC5Db2RlTWlycm9yLWd1dHRlcm1hcmtlci1zdWJ0bGUgeyBjb2xvcjogI2FhYTsgfQouY20tcy10d2lsaWdodCAuQ29kZU1pcnJvci1saW5lbnVtYmVyIHsgY29sb3I6ICNhYWE7IH0KLmNtLXMtdHdpbGlnaHQgLkNvZGVNaXJyb3ItY3Vyc29yIHsgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCB3aGl0ZSAhaW1wb3J0YW50OyB9CgouY20tcy10d2lsaWdodCAuY20ta2V5d29yZCB7ICBjb2xvcjogI2Y5ZWU5ODsgfSAvKiovCi5jbS1zLXR3aWxpZ2h0IC5jbS1hdG9tIHsgY29sb3I6ICNGQzA7IH0KLmNtLXMtdHdpbGlnaHQgLmNtLW51bWJlciB7IGNvbG9yOiAgI2NhNzg0MTsgfSAvKiovCi5jbS1zLXR3aWxpZ2h0IC5jbS1kZWYgeyBjb2xvcjogIzhEQTZDRTsgfQouY20tcy10d2lsaWdodCBzcGFuLmNtLXZhcmlhYmxlLTIsIC5jbS1zLXR3aWxpZ2h0IHNwYW4uY20tdGFnIHsgY29sb3I6ICM2MDczOTI7IH0gLyoqLwouY20tcy10d2lsaWdodCBzcGFuLmNtLXZhcmlhYmxlLTMsIC5jbS1zLXR3aWxpZ2h0IHNwYW4uY20tZGVmIHsgY29sb3I6ICM2MDczOTI7IH0gLyoqLwouY20tcy10d2lsaWdodCAuY20tb3BlcmF0b3IgeyBjb2xvcjogI2NkYTg2OTsgfSAvKiovCi5jbS1zLXR3aWxpZ2h0IC5jbS1jb21tZW50IHsgY29sb3I6Izc3NzsgZm9udC1zdHlsZTppdGFsaWM7IGZvbnQtd2VpZ2h0Om5vcm1hbDsgfSAvKiovCi5jbS1zLXR3aWxpZ2h0IC5jbS1zdHJpbmcgeyBjb2xvcjojOGY5ZDZhOyBmb250LXN0eWxlOml0YWxpYzsgfSAvKiovCi5jbS1zLXR3aWxpZ2h0IC5jbS1zdHJpbmctMiB7IGNvbG9yOiNiZDZiMTggfSAvKj8qLwouY20tcy10d2lsaWdodCAuY20tbWV0YSB7IGJhY2tncm91bmQtY29sb3I6IzE0MTQxNDsgY29sb3I6I2Y3ZjdmNzsgfSAvKj8qLwouY20tcy10d2lsaWdodCAuY20tYnVpbHRpbiB7IGNvbG9yOiAjY2RhODY5OyB9IC8qPyovCi5jbS1zLXR3aWxpZ2h0IC5jbS10YWcgeyBjb2xvcjogIzk5NzY0MzsgfSAvKiovCi5jbS1zLXR3aWxpZ2h0IC5jbS1hdHRyaWJ1dGUgeyBjb2xvcjogI2Q2YmI2ZDsgfSAvKj8qLwouY20tcy10d2lsaWdodCAuY20taGVhZGVyIHsgY29sb3I6ICNGRjY0MDA7IH0KLmNtLXMtdHdpbGlnaHQgLmNtLWhyIHsgY29sb3I6ICNBRUFFQUU7IH0KLmNtLXMtdHdpbGlnaHQgLmNtLWxpbmsgeyAgIGNvbG9yOiNhZDkzNjE7IGZvbnQtc3R5bGU6aXRhbGljOyB0ZXh0LWRlY29yYXRpb246bm9uZTsgfSAvKiovCi5jbS1zLXR3aWxpZ2h0IC5jbS1lcnJvciB7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZWQ7IH0KCi5jbS1zLXR3aWxpZ2h0IC5Db2RlTWlycm9yLWFjdGl2ZWxpbmUtYmFja2dyb3VuZCB7YmFja2dyb3VuZDogIzI3MjgyRSAhaW1wb3J0YW50O30KLmNtLXMtdHdpbGlnaHQgLkNvZGVNaXJyb3ItbWF0Y2hpbmdicmFja2V0IHtvdXRsaW5lOjFweCBzb2xpZCBncmV5OyBjb2xvcjp3aGl0ZSAhaW1wb3J0YW50O30K]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/theme/vibrant-ink.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogVGFrZW4gZnJvbSB0aGUgcG9wdWxhciBWaXN1YWwgU3R1ZGlvIFZpYnJhbnQgSW5rIFNjaGVtYSAqLwoKLmNtLXMtdmlicmFudC1pbmsuQ29kZU1pcnJvciB7IGJhY2tncm91bmQ6IGJsYWNrOyBjb2xvcjogd2hpdGU7IH0KLmNtLXMtdmlicmFudC1pbmsgLkNvZGVNaXJyb3Itc2VsZWN0ZWQgeyBiYWNrZ3JvdW5kOiAjMzU0OTNjICFpbXBvcnRhbnQ7IH0KCi5jbS1zLXZpYnJhbnQtaW5rIC5Db2RlTWlycm9yLWd1dHRlcnMgeyBiYWNrZ3JvdW5kOiAjMDAyMjQwOyBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjYWFhOyB9Ci5jbS1zLXZpYnJhbnQtaW5rIC5Db2RlTWlycm9yLWd1dHRlcm1hcmtlciB7IGNvbG9yOiB3aGl0ZTsgfQouY20tcy12aWJyYW50LWluayAuQ29kZU1pcnJvci1ndXR0ZXJtYXJrZXItc3VidGxlIHsgY29sb3I6ICNkMGQwZDA7IH0KLmNtLXMtdmlicmFudC1pbmsgLkNvZGVNaXJyb3ItbGluZW51bWJlciB7IGNvbG9yOiAjZDBkMGQwOyB9Ci5jbS1zLXZpYnJhbnQtaW5rIC5Db2RlTWlycm9yLWN1cnNvciB7IGJvcmRlci1sZWZ0OiAxcHggc29saWQgd2hpdGUgIWltcG9ydGFudDsgfQoKLmNtLXMtdmlicmFudC1pbmsgLmNtLWtleXdvcmQgeyAgY29sb3I6ICNDQzc4MzI7IH0KLmNtLXMtdmlicmFudC1pbmsgLmNtLWF0b20geyBjb2xvcjogI0ZDMDsgfQouY20tcy12aWJyYW50LWluayAuY20tbnVtYmVyIHsgY29sb3I6ICAjRkZFRTk4OyB9Ci5jbS1zLXZpYnJhbnQtaW5rIC5jbS1kZWYgeyBjb2xvcjogIzhEQTZDRTsgfQouY20tcy12aWJyYW50LWluayBzcGFuLmNtLXZhcmlhYmxlLTIsIC5jbS1zLXZpYnJhbnQgc3Bhbi5jbS10YWcgeyBjb2xvcjogI0ZGQzY2RCB9Ci5jbS1zLXZpYnJhbnQtaW5rIHNwYW4uY20tdmFyaWFibGUtMywgLmNtLXMtdmlicmFudCBzcGFuLmNtLWRlZiB7IGNvbG9yOiAjRkZDNjZEIH0KLmNtLXMtdmlicmFudC1pbmsgLmNtLW9wZXJhdG9yIHsgY29sb3I6ICM4ODg7IH0KLmNtLXMtdmlicmFudC1pbmsgLmNtLWNvbW1lbnQgeyBjb2xvcjogZ3JheTsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLmNtLXMtdmlicmFudC1pbmsgLmNtLXN0cmluZyB7IGNvbG9yOiAgI0E1QzI1QyB9Ci5jbS1zLXZpYnJhbnQtaW5rIC5jbS1zdHJpbmctMiB7IGNvbG9yOiByZWQgfQouY20tcy12aWJyYW50LWluayAuY20tbWV0YSB7IGNvbG9yOiAjRDhGQTNDOyB9Ci5jbS1zLXZpYnJhbnQtaW5rIC5jbS1idWlsdGluIHsgY29sb3I6ICM4REE2Q0U7IH0KLmNtLXMtdmlicmFudC1pbmsgLmNtLXRhZyB7IGNvbG9yOiAjOERBNkNFOyB9Ci5jbS1zLXZpYnJhbnQtaW5rIC5jbS1hdHRyaWJ1dGUgeyBjb2xvcjogIzhEQTZDRTsgfQouY20tcy12aWJyYW50LWluayAuY20taGVhZGVyIHsgY29sb3I6ICNGRjY0MDA7IH0KLmNtLXMtdmlicmFudC1pbmsgLmNtLWhyIHsgY29sb3I6ICNBRUFFQUU7IH0KLmNtLXMtdmlicmFudC1pbmsgLmNtLWxpbmsgeyBjb2xvcjogYmx1ZTsgfQouY20tcy12aWJyYW50LWluayAuY20tZXJyb3IgeyBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmVkOyB9CgouY20tcy12aWJyYW50LWluayAuQ29kZU1pcnJvci1hY3RpdmVsaW5lLWJhY2tncm91bmQge2JhY2tncm91bmQ6ICMyNzI4MkUgIWltcG9ydGFudDt9Ci5jbS1zLXZpYnJhbnQtaW5rIC5Db2RlTWlycm9yLW1hdGNoaW5nYnJhY2tldCB7b3V0bGluZToxcHggc29saWQgZ3JleTsgY29sb3I6d2hpdGUgIWltcG9ydGFudDt9Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/theme/xq-dark.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKQ29weXJpZ2h0IChDKSAyMDExIGJ5IE1hcmtMb2dpYyBDb3Jwb3JhdGlvbgpBdXRob3I6IE1pa2UgQnJldm9vcnQgPG1pa2VAYnJldm9vcnQuY29tPgoKUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQpvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAppbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCmZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgphbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLApGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgpMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLApPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOClRIRSBTT0ZUV0FSRS4KKi8KLmNtLXMteHEtZGFyay5Db2RlTWlycm9yIHsgYmFja2dyb3VuZDogIzBhMDAxZjsgY29sb3I6ICNmOGY4Zjg7IH0KLmNtLXMteHEtZGFyayAuQ29kZU1pcnJvci1zZWxlY3RlZCB7IGJhY2tncm91bmQ6ICMyNzAwN0EgIWltcG9ydGFudDsgfQouY20tcy14cS1kYXJrIC5Db2RlTWlycm9yLWd1dHRlcnMgeyBiYWNrZ3JvdW5kOiAjMGEwMDFmOyBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjYWFhOyB9Ci5jbS1zLXhxLWRhcmsgLkNvZGVNaXJyb3ItZ3V0dGVybWFya2VyIHsgY29sb3I6ICNGRkJENDA7IH0KLmNtLXMteHEtZGFyayAuQ29kZU1pcnJvci1ndXR0ZXJtYXJrZXItc3VidGxlIHsgY29sb3I6ICNmOGY4Zjg7IH0KLmNtLXMteHEtZGFyayAuQ29kZU1pcnJvci1saW5lbnVtYmVyIHsgY29sb3I6ICNmOGY4Zjg7IH0KLmNtLXMteHEtZGFyayAuQ29kZU1pcnJvci1jdXJzb3IgeyBib3JkZXItbGVmdDogMXB4IHNvbGlkIHdoaXRlICFpbXBvcnRhbnQ7IH0KCi5jbS1zLXhxLWRhcmsgc3Bhbi5jbS1rZXl3b3JkIHtjb2xvcjogI0ZGQkQ0MDt9Ci5jbS1zLXhxLWRhcmsgc3Bhbi5jbS1hdG9tIHtjb2xvcjogIzZDOENENTt9Ci5jbS1zLXhxLWRhcmsgc3Bhbi5jbS1udW1iZXIge2NvbG9yOiAjMTY0O30KLmNtLXMteHEtZGFyayBzcGFuLmNtLWRlZiB7Y29sb3I6ICNGRkY7IHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7fQouY20tcy14cS1kYXJrIHNwYW4uY20tdmFyaWFibGUge2NvbG9yOiAjRkZGO30KLmNtLXMteHEtZGFyayBzcGFuLmNtLXZhcmlhYmxlLTIge2NvbG9yOiAjRUVFO30KLmNtLXMteHEtZGFyayBzcGFuLmNtLXZhcmlhYmxlLTMge2NvbG9yOiAjREREO30KLmNtLXMteHEtZGFyayBzcGFuLmNtLXByb3BlcnR5IHt9Ci5jbS1zLXhxLWRhcmsgc3Bhbi5jbS1vcGVyYXRvciB7fQouY20tcy14cS1kYXJrIHNwYW4uY20tY29tbWVudCB7Y29sb3I6IGdyYXk7fQouY20tcy14cS1kYXJrIHNwYW4uY20tc3RyaW5nIHtjb2xvcjogIzlGRUUwMDt9Ci5jbS1zLXhxLWRhcmsgc3Bhbi5jbS1tZXRhIHtjb2xvcjogeWVsbG93O30KLmNtLXMteHEtZGFyayBzcGFuLmNtLXF1YWxpZmllciB7Y29sb3I6ICNGRkY3MDA7fQouY20tcy14cS1kYXJrIHNwYW4uY20tYnVpbHRpbiB7Y29sb3I6ICMzMGE7fQouY20tcy14cS1kYXJrIHNwYW4uY20tYnJhY2tldCB7Y29sb3I6ICNjYzc7fQouY20tcy14cS1kYXJrIHNwYW4uY20tdGFnIHtjb2xvcjogI0ZGQkQ0MDt9Ci5jbS1zLXhxLWRhcmsgc3Bhbi5jbS1hdHRyaWJ1dGUge2NvbG9yOiAjRkZGNzAwO30KLmNtLXMteHEtZGFyayBzcGFuLmNtLWVycm9yIHtjb2xvcjogI2YwMDt9CgouY20tcy14cS1kYXJrIC5Db2RlTWlycm9yLWFjdGl2ZWxpbmUtYmFja2dyb3VuZCB7YmFja2dyb3VuZDogIzI3MjgyRSAhaW1wb3J0YW50O30KLmNtLXMteHEtZGFyayAuQ29kZU1pcnJvci1tYXRjaGluZ2JyYWNrZXQge291dGxpbmU6MXB4IHNvbGlkIGdyZXk7IGNvbG9yOndoaXRlICFpbXBvcnRhbnQ7fQ==]]></data>
	</file>
	<file>
	  <filename>/codemirror-4.4/theme/xq-light.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKQ29weXJpZ2h0IChDKSAyMDExIGJ5IE1hcmtMb2dpYyBDb3Jwb3JhdGlvbgpBdXRob3I6IE1pa2UgQnJldm9vcnQgPG1pa2VAYnJldm9vcnQuY29tPgoKUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQpvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAppbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCmZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgphbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLApGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgpMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLApPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOClRIRSBTT0ZUV0FSRS4KKi8KLmNtLXMteHEtbGlnaHQgc3Bhbi5jbS1rZXl3b3JkIHtsaW5lLWhlaWdodDogMWVtOyBmb250LXdlaWdodDogYm9sZDsgY29sb3I6ICM1QTVDQUQ7IH0KLmNtLXMteHEtbGlnaHQgc3Bhbi5jbS1hdG9tIHtjb2xvcjogIzZDOENENTt9Ci5jbS1zLXhxLWxpZ2h0IHNwYW4uY20tbnVtYmVyIHtjb2xvcjogIzE2NDt9Ci5jbS1zLXhxLWxpZ2h0IHNwYW4uY20tZGVmIHt0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lO30KLmNtLXMteHEtbGlnaHQgc3Bhbi5jbS12YXJpYWJsZSB7Y29sb3I6IGJsYWNrOyB9Ci5jbS1zLXhxLWxpZ2h0IHNwYW4uY20tdmFyaWFibGUtMiB7Y29sb3I6YmxhY2s7fQouY20tcy14cS1saWdodCBzcGFuLmNtLXZhcmlhYmxlLTMge2NvbG9yOiBibGFjazsgfQouY20tcy14cS1saWdodCBzcGFuLmNtLXByb3BlcnR5IHt9Ci5jbS1zLXhxLWxpZ2h0IHNwYW4uY20tb3BlcmF0b3Ige30KLmNtLXMteHEtbGlnaHQgc3Bhbi5jbS1jb21tZW50IHtjb2xvcjogIzAwODBGRjsgZm9udC1zdHlsZTogaXRhbGljO30KLmNtLXMteHEtbGlnaHQgc3Bhbi5jbS1zdHJpbmcge2NvbG9yOiByZWQ7fQouY20tcy14cS1saWdodCBzcGFuLmNtLW1ldGEge2NvbG9yOiB5ZWxsb3c7fQouY20tcy14cS1saWdodCBzcGFuLmNtLXF1YWxpZmllciB7Y29sb3I6IGdyZXl9Ci5jbS1zLXhxLWxpZ2h0IHNwYW4uY20tYnVpbHRpbiB7Y29sb3I6ICM3RUE2NTY7fQouY20tcy14cS1saWdodCBzcGFuLmNtLWJyYWNrZXQge2NvbG9yOiAjY2M3O30KLmNtLXMteHEtbGlnaHQgc3Bhbi5jbS10YWcge2NvbG9yOiAjM0Y3RjdGO30KLmNtLXMteHEtbGlnaHQgc3Bhbi5jbS1hdHRyaWJ1dGUge2NvbG9yOiAjN0YwMDdGO30KLmNtLXMteHEtbGlnaHQgc3Bhbi5jbS1lcnJvciB7Y29sb3I6ICNmMDA7fQoKLmNtLXMteHEtbGlnaHQgLkNvZGVNaXJyb3ItYWN0aXZlbGluZS1iYWNrZ3JvdW5kIHtiYWNrZ3JvdW5kOiAjZThmMmZmICFpbXBvcnRhbnQ7fQouY20tcy14cS1saWdodCAuQ29kZU1pcnJvci1tYXRjaGluZ2JyYWNrZXQge291dGxpbmU6MXB4IHNvbGlkIGdyZXk7Y29sb3I6YmxhY2sgIWltcG9ydGFudDtiYWNrZ3JvdW5kOnllbGxvdzt9]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/.npmignore</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[L25vZGVfbW9kdWxlcwovZGVtbwovZG9jCi90ZXN0Ci90ZXN0Ki5odG1sCi9pbmRleC5odG1sCi9tb2RlLyovKnRlc3QuanMKL21vZGUvKi8qLmh0bWwKL21vZGUvaW5kZXguaHRtbAouKgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/.travis.yml</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[bGFuZ3VhZ2U6IG5vZGVfanMKbm9kZV9qczoKICAtIHN0YWJsZQpzdWRvOiBmYWxzZQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/comment/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/comment/comment.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CgogIHZhciBub09wdGlvbnMgPSB7fTsKICB2YXIgbm9uV1MgPSAvW15cc1x1MDBhMF0vOwogIHZhciBQb3MgPSBDb2RlTWlycm9yLlBvczsKCiAgZnVuY3Rpb24gZmlyc3ROb25XUyhzdHIpIHsKICAgIHZhciBmb3VuZCA9IHN0ci5zZWFyY2gobm9uV1MpOwogICAgcmV0dXJuIGZvdW5kID09IC0xID8gMCA6IGZvdW5kOwogIH0KCiAgQ29kZU1pcnJvci5jb21tYW5kcy50b2dnbGVDb21tZW50ID0gZnVuY3Rpb24oY20pIHsKICAgIGNtLnRvZ2dsZUNvbW1lbnQoKTsKICB9OwoKICBDb2RlTWlycm9yLmRlZmluZUV4dGVuc2lvbigidG9nZ2xlQ29tbWVudCIsIGZ1bmN0aW9uKG9wdGlvbnMpIHsKICAgIGlmICghb3B0aW9ucykgb3B0aW9ucyA9IG5vT3B0aW9uczsKICAgIHZhciBjbSA9IHRoaXM7CiAgICB2YXIgbWluTGluZSA9IEluZmluaXR5LCByYW5nZXMgPSB0aGlzLmxpc3RTZWxlY3Rpb25zKCksIG1vZGUgPSBudWxsOwogICAgZm9yICh2YXIgaSA9IHJhbmdlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewogICAgICB2YXIgZnJvbSA9IHJhbmdlc1tpXS5mcm9tKCksIHRvID0gcmFuZ2VzW2ldLnRvKCk7CiAgICAgIGlmIChmcm9tLmxpbmUgPj0gbWluTGluZSkgY29udGludWU7CiAgICAgIGlmICh0by5saW5lID49IG1pbkxpbmUpIHRvID0gUG9zKG1pbkxpbmUsIDApOwogICAgICBtaW5MaW5lID0gZnJvbS5saW5lOwogICAgICBpZiAobW9kZSA9PSBudWxsKSB7CiAgICAgICAgaWYgKGNtLnVuY29tbWVudChmcm9tLCB0bywgb3B0aW9ucykpIG1vZGUgPSAidW4iOwogICAgICAgIGVsc2UgeyBjbS5saW5lQ29tbWVudChmcm9tLCB0bywgb3B0aW9ucyk7IG1vZGUgPSAibGluZSI7IH0KICAgICAgfSBlbHNlIGlmIChtb2RlID09ICJ1biIpIHsKICAgICAgICBjbS51bmNvbW1lbnQoZnJvbSwgdG8sIG9wdGlvbnMpOwogICAgICB9IGVsc2UgewogICAgICAgIGNtLmxpbmVDb21tZW50KGZyb20sIHRvLCBvcHRpb25zKTsKICAgICAgfQogICAgfQogIH0pOwoKICAvLyBSb3VnaCBoZXVyaXN0aWMgdG8gdHJ5IGFuZCBkZXRlY3QgbGluZXMgdGhhdCBhcmUgcGFydCBvZiBtdWx0aS1saW5lIHN0cmluZwogIGZ1bmN0aW9uIHByb2JhYmx5SW5zaWRlU3RyaW5nKGNtLCBwb3MsIGxpbmUpIHsKICAgIHJldHVybiAvXGJzdHJpbmdcYi8udGVzdChjbS5nZXRUb2tlblR5cGVBdChQb3MocG9zLmxpbmUsIDApKSkgJiYgIS9eW1wnXCJgXS8udGVzdChsaW5lKQogIH0KCiAgQ29kZU1pcnJvci5kZWZpbmVFeHRlbnNpb24oImxpbmVDb21tZW50IiwgZnVuY3Rpb24oZnJvbSwgdG8sIG9wdGlvbnMpIHsKICAgIGlmICghb3B0aW9ucykgb3B0aW9ucyA9IG5vT3B0aW9uczsKICAgIHZhciBzZWxmID0gdGhpcywgbW9kZSA9IHNlbGYuZ2V0TW9kZUF0KGZyb20pOwogICAgdmFyIGZpcnN0TGluZSA9IHNlbGYuZ2V0TGluZShmcm9tLmxpbmUpOwogICAgaWYgKGZpcnN0TGluZSA9PSBudWxsIHx8IHByb2JhYmx5SW5zaWRlU3RyaW5nKHNlbGYsIGZyb20sIGZpcnN0TGluZSkpIHJldHVybjsKCiAgICB2YXIgY29tbWVudFN0cmluZyA9IG9wdGlvbnMubGluZUNvbW1lbnQgfHwgbW9kZS5saW5lQ29tbWVudDsKICAgIGlmICghY29tbWVudFN0cmluZykgewogICAgICBpZiAob3B0aW9ucy5ibG9ja0NvbW1lbnRTdGFydCB8fCBtb2RlLmJsb2NrQ29tbWVudFN0YXJ0KSB7CiAgICAgICAgb3B0aW9ucy5mdWxsTGluZXMgPSB0cnVlOwogICAgICAgIHNlbGYuYmxvY2tDb21tZW50KGZyb20sIHRvLCBvcHRpb25zKTsKICAgICAgfQogICAgICByZXR1cm47CiAgICB9CgogICAgdmFyIGVuZCA9IE1hdGgubWluKHRvLmNoICE9IDAgfHwgdG8ubGluZSA9PSBmcm9tLmxpbmUgPyB0by5saW5lICsgMSA6IHRvLmxpbmUsIHNlbGYubGFzdExpbmUoKSArIDEpOwogICAgdmFyIHBhZCA9IG9wdGlvbnMucGFkZGluZyA9PSBudWxsID8gIiAiIDogb3B0aW9ucy5wYWRkaW5nOwogICAgdmFyIGJsYW5rTGluZXMgPSBvcHRpb25zLmNvbW1lbnRCbGFua0xpbmVzIHx8IGZyb20ubGluZSA9PSB0by5saW5lOwoKICAgIHNlbGYub3BlcmF0aW9uKGZ1bmN0aW9uKCkgewogICAgICBpZiAob3B0aW9ucy5pbmRlbnQpIHsKICAgICAgICB2YXIgYmFzZVN0cmluZyA9IG51bGw7CiAgICAgICAgZm9yICh2YXIgaSA9IGZyb20ubGluZTsgaSA8IGVuZDsgKytpKSB7CiAgICAgICAgICB2YXIgbGluZSA9IHNlbGYuZ2V0TGluZShpKTsKICAgICAgICAgIHZhciB3aGl0ZXNwYWNlID0gbGluZS5zbGljZSgwLCBmaXJzdE5vbldTKGxpbmUpKTsKICAgICAgICAgIGlmIChiYXNlU3RyaW5nID09IG51bGwgfHwgYmFzZVN0cmluZy5sZW5ndGggPiB3aGl0ZXNwYWNlLmxlbmd0aCkgewogICAgICAgICAgICBiYXNlU3RyaW5nID0gd2hpdGVzcGFjZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZm9yICh2YXIgaSA9IGZyb20ubGluZTsgaSA8IGVuZDsgKytpKSB7CiAgICAgICAgICB2YXIgbGluZSA9IHNlbGYuZ2V0TGluZShpKSwgY3V0ID0gYmFzZVN0cmluZy5sZW5ndGg7CiAgICAgICAgICBpZiAoIWJsYW5rTGluZXMgJiYgIW5vbldTLnRlc3QobGluZSkpIGNvbnRpbnVlOwogICAgICAgICAgaWYgKGxpbmUuc2xpY2UoMCwgY3V0KSAhPSBiYXNlU3RyaW5nKSBjdXQgPSBmaXJzdE5vbldTKGxpbmUpOwogICAgICAgICAgc2VsZi5yZXBsYWNlUmFuZ2UoYmFzZVN0cmluZyArIGNvbW1lbnRTdHJpbmcgKyBwYWQsIFBvcyhpLCAwKSwgUG9zKGksIGN1dCkpOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBmb3IgKHZhciBpID0gZnJvbS5saW5lOyBpIDwgZW5kOyArK2kpIHsKICAgICAgICAgIGlmIChibGFua0xpbmVzIHx8IG5vbldTLnRlc3Qoc2VsZi5nZXRMaW5lKGkpKSkKICAgICAgICAgICAgc2VsZi5yZXBsYWNlUmFuZ2UoY29tbWVudFN0cmluZyArIHBhZCwgUG9zKGksIDApKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0pOwogIH0pOwoKICBDb2RlTWlycm9yLmRlZmluZUV4dGVuc2lvbigiYmxvY2tDb21tZW50IiwgZnVuY3Rpb24oZnJvbSwgdG8sIG9wdGlvbnMpIHsKICAgIGlmICghb3B0aW9ucykgb3B0aW9ucyA9IG5vT3B0aW9uczsKICAgIHZhciBzZWxmID0gdGhpcywgbW9kZSA9IHNlbGYuZ2V0TW9kZUF0KGZyb20pOwogICAgdmFyIHN0YXJ0U3RyaW5nID0gb3B0aW9ucy5ibG9ja0NvbW1lbnRTdGFydCB8fCBtb2RlLmJsb2NrQ29tbWVudFN0YXJ0OwogICAgdmFyIGVuZFN0cmluZyA9IG9wdGlvbnMuYmxvY2tDb21tZW50RW5kIHx8IG1vZGUuYmxvY2tDb21tZW50RW5kOwogICAgaWYgKCFzdGFydFN0cmluZyB8fCAhZW5kU3RyaW5nKSB7CiAgICAgIGlmICgob3B0aW9ucy5saW5lQ29tbWVudCB8fCBtb2RlLmxpbmVDb21tZW50KSAmJiBvcHRpb25zLmZ1bGxMaW5lcyAhPSBmYWxzZSkKICAgICAgICBzZWxmLmxpbmVDb21tZW50KGZyb20sIHRvLCBvcHRpb25zKTsKICAgICAgcmV0dXJuOwogICAgfQogICAgaWYgKC9cYmNvbW1lbnRcYi8udGVzdChzZWxmLmdldFRva2VuVHlwZUF0KFBvcyhmcm9tLmxpbmUsIDApKSkpIHJldHVybgoKICAgIHZhciBlbmQgPSBNYXRoLm1pbih0by5saW5lLCBzZWxmLmxhc3RMaW5lKCkpOwogICAgaWYgKGVuZCAhPSBmcm9tLmxpbmUgJiYgdG8uY2ggPT0gMCAmJiBub25XUy50ZXN0KHNlbGYuZ2V0TGluZShlbmQpKSkgLS1lbmQ7CgogICAgdmFyIHBhZCA9IG9wdGlvbnMucGFkZGluZyA9PSBudWxsID8gIiAiIDogb3B0aW9ucy5wYWRkaW5nOwogICAgaWYgKGZyb20ubGluZSA+IGVuZCkgcmV0dXJuOwoKICAgIHNlbGYub3BlcmF0aW9uKGZ1bmN0aW9uKCkgewogICAgICBpZiAob3B0aW9ucy5mdWxsTGluZXMgIT0gZmFsc2UpIHsKICAgICAgICB2YXIgbGFzdExpbmVIYXNUZXh0ID0gbm9uV1MudGVzdChzZWxmLmdldExpbmUoZW5kKSk7CiAgICAgICAgc2VsZi5yZXBsYWNlUmFuZ2UocGFkICsgZW5kU3RyaW5nLCBQb3MoZW5kKSk7CiAgICAgICAgc2VsZi5yZXBsYWNlUmFuZ2Uoc3RhcnRTdHJpbmcgKyBwYWQsIFBvcyhmcm9tLmxpbmUsIDApKTsKICAgICAgICB2YXIgbGVhZCA9IG9wdGlvbnMuYmxvY2tDb21tZW50TGVhZCB8fCBtb2RlLmJsb2NrQ29tbWVudExlYWQ7CiAgICAgICAgaWYgKGxlYWQgIT0gbnVsbCkgZm9yICh2YXIgaSA9IGZyb20ubGluZSArIDE7IGkgPD0gZW5kOyArK2kpCiAgICAgICAgICBpZiAoaSAhPSBlbmQgfHwgbGFzdExpbmVIYXNUZXh0KQogICAgICAgICAgICBzZWxmLnJlcGxhY2VSYW5nZShsZWFkICsgcGFkLCBQb3MoaSwgMCkpOwogICAgICB9IGVsc2UgewogICAgICAgIHNlbGYucmVwbGFjZVJhbmdlKGVuZFN0cmluZywgdG8pOwogICAgICAgIHNlbGYucmVwbGFjZVJhbmdlKHN0YXJ0U3RyaW5nLCBmcm9tKTsKICAgICAgfQogICAgfSk7CiAgfSk7CgogIENvZGVNaXJyb3IuZGVmaW5lRXh0ZW5zaW9uKCJ1bmNvbW1lbnQiLCBmdW5jdGlvbihmcm9tLCB0bywgb3B0aW9ucykgewogICAgaWYgKCFvcHRpb25zKSBvcHRpb25zID0gbm9PcHRpb25zOwogICAgdmFyIHNlbGYgPSB0aGlzLCBtb2RlID0gc2VsZi5nZXRNb2RlQXQoZnJvbSk7CiAgICB2YXIgZW5kID0gTWF0aC5taW4odG8uY2ggIT0gMCB8fCB0by5saW5lID09IGZyb20ubGluZSA/IHRvLmxpbmUgOiB0by5saW5lIC0gMSwgc2VsZi5sYXN0TGluZSgpKSwgc3RhcnQgPSBNYXRoLm1pbihmcm9tLmxpbmUsIGVuZCk7CgogICAgLy8gVHJ5IGZpbmRpbmcgbGluZSBjb21tZW50cwogICAgdmFyIGxpbmVTdHJpbmcgPSBvcHRpb25zLmxpbmVDb21tZW50IHx8IG1vZGUubGluZUNvbW1lbnQsIGxpbmVzID0gW107CiAgICB2YXIgcGFkID0gb3B0aW9ucy5wYWRkaW5nID09IG51bGwgPyAiICIgOiBvcHRpb25zLnBhZGRpbmcsIGRpZFNvbWV0aGluZzsKICAgIGxpbmVDb21tZW50OiB7CiAgICAgIGlmICghbGluZVN0cmluZykgYnJlYWsgbGluZUNvbW1lbnQ7CiAgICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8PSBlbmQ7ICsraSkgewogICAgICAgIHZhciBsaW5lID0gc2VsZi5nZXRMaW5lKGkpOwogICAgICAgIHZhciBmb3VuZCA9IGxpbmUuaW5kZXhPZihsaW5lU3RyaW5nKTsKICAgICAgICBpZiAoZm91bmQgPiAtMSAmJiAhL2NvbW1lbnQvLnRlc3Qoc2VsZi5nZXRUb2tlblR5cGVBdChQb3MoaSwgZm91bmQgKyAxKSkpKSBmb3VuZCA9IC0xOwogICAgICAgIGlmIChmb3VuZCA9PSAtMSAmJiBub25XUy50ZXN0KGxpbmUpKSBicmVhayBsaW5lQ29tbWVudDsKICAgICAgICBpZiAoZm91bmQgPiAtMSAmJiBub25XUy50ZXN0KGxpbmUuc2xpY2UoMCwgZm91bmQpKSkgYnJlYWsgbGluZUNvbW1lbnQ7CiAgICAgICAgbGluZXMucHVzaChsaW5lKTsKICAgICAgfQogICAgICBzZWxmLm9wZXJhdGlvbihmdW5jdGlvbigpIHsKICAgICAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPD0gZW5kOyArK2kpIHsKICAgICAgICAgIHZhciBsaW5lID0gbGluZXNbaSAtIHN0YXJ0XTsKICAgICAgICAgIHZhciBwb3MgPSBsaW5lLmluZGV4T2YobGluZVN0cmluZyksIGVuZFBvcyA9IHBvcyArIGxpbmVTdHJpbmcubGVuZ3RoOwogICAgICAgICAgaWYgKHBvcyA8IDApIGNvbnRpbnVlOwogICAgICAgICAgaWYgKGxpbmUuc2xpY2UoZW5kUG9zLCBlbmRQb3MgKyBwYWQubGVuZ3RoKSA9PSBwYWQpIGVuZFBvcyArPSBwYWQubGVuZ3RoOwogICAgICAgICAgZGlkU29tZXRoaW5nID0gdHJ1ZTsKICAgICAgICAgIHNlbGYucmVwbGFjZVJhbmdlKCIiLCBQb3MoaSwgcG9zKSwgUG9zKGksIGVuZFBvcykpOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIGlmIChkaWRTb21ldGhpbmcpIHJldHVybiB0cnVlOwogICAgfQoKICAgIC8vIFRyeSBibG9jayBjb21tZW50cwogICAgdmFyIHN0YXJ0U3RyaW5nID0gb3B0aW9ucy5ibG9ja0NvbW1lbnRTdGFydCB8fCBtb2RlLmJsb2NrQ29tbWVudFN0YXJ0OwogICAgdmFyIGVuZFN0cmluZyA9IG9wdGlvbnMuYmxvY2tDb21tZW50RW5kIHx8IG1vZGUuYmxvY2tDb21tZW50RW5kOwogICAgaWYgKCFzdGFydFN0cmluZyB8fCAhZW5kU3RyaW5nKSByZXR1cm4gZmFsc2U7CiAgICB2YXIgbGVhZCA9IG9wdGlvbnMuYmxvY2tDb21tZW50TGVhZCB8fCBtb2RlLmJsb2NrQ29tbWVudExlYWQ7CiAgICB2YXIgc3RhcnRMaW5lID0gc2VsZi5nZXRMaW5lKHN0YXJ0KSwgb3BlbiA9IHN0YXJ0TGluZS5pbmRleE9mKHN0YXJ0U3RyaW5nKQogICAgaWYgKG9wZW4gPT0gLTEpIHJldHVybiBmYWxzZQogICAgdmFyIGVuZExpbmUgPSBlbmQgPT0gc3RhcnQgPyBzdGFydExpbmUgOiBzZWxmLmdldExpbmUoZW5kKQogICAgdmFyIGNsb3NlID0gZW5kTGluZS5pbmRleE9mKGVuZFN0cmluZywgZW5kID09IHN0YXJ0ID8gb3BlbiArIHN0YXJ0U3RyaW5nLmxlbmd0aCA6IDApOwogICAgaWYgKGNsb3NlID09IC0xICYmIHN0YXJ0ICE9IGVuZCkgewogICAgICBlbmRMaW5lID0gc2VsZi5nZXRMaW5lKC0tZW5kKTsKICAgICAgY2xvc2UgPSBlbmRMaW5lLmluZGV4T2YoZW5kU3RyaW5nKTsKICAgIH0KICAgIGlmIChjbG9zZSA9PSAtMSB8fAogICAgICAgICEvY29tbWVudC8udGVzdChzZWxmLmdldFRva2VuVHlwZUF0KFBvcyhzdGFydCwgb3BlbiArIDEpKSkgfHwKICAgICAgICAhL2NvbW1lbnQvLnRlc3Qoc2VsZi5nZXRUb2tlblR5cGVBdChQb3MoZW5kLCBjbG9zZSArIDEpKSkpCiAgICAgIHJldHVybiBmYWxzZTsKCiAgICAvLyBBdm9pZCBraWxsaW5nIGJsb2NrIGNvbW1lbnRzIGNvbXBsZXRlbHkgb3V0c2lkZSB0aGUgc2VsZWN0aW9uLgogICAgLy8gUG9zaXRpb25zIG9mIHRoZSBsYXN0IHN0YXJ0U3RyaW5nIGJlZm9yZSB0aGUgc3RhcnQgb2YgdGhlIHNlbGVjdGlvbiwgYW5kIHRoZSBmaXJzdCBlbmRTdHJpbmcgYWZ0ZXIgaXQuCiAgICB2YXIgbGFzdFN0YXJ0ID0gc3RhcnRMaW5lLmxhc3RJbmRleE9mKHN0YXJ0U3RyaW5nLCBmcm9tLmNoKTsKICAgIHZhciBmaXJzdEVuZCA9IGxhc3RTdGFydCA9PSAtMSA/IC0xIDogc3RhcnRMaW5lLnNsaWNlKDAsIGZyb20uY2gpLmluZGV4T2YoZW5kU3RyaW5nLCBsYXN0U3RhcnQgKyBzdGFydFN0cmluZy5sZW5ndGgpOwogICAgaWYgKGxhc3RTdGFydCAhPSAtMSAmJiBmaXJzdEVuZCAhPSAtMSAmJiBmaXJzdEVuZCArIGVuZFN0cmluZy5sZW5ndGggIT0gZnJvbS5jaCkgcmV0dXJuIGZhbHNlOwogICAgLy8gUG9zaXRpb25zIG9mIHRoZSBmaXJzdCBlbmRTdHJpbmcgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgc2VsZWN0aW9uLCBhbmQgdGhlIGxhc3Qgc3RhcnRTdHJpbmcgYmVmb3JlIGl0LgogICAgZmlyc3RFbmQgPSBlbmRMaW5lLmluZGV4T2YoZW5kU3RyaW5nLCB0by5jaCk7CiAgICB2YXIgYWxtb3N0TGFzdFN0YXJ0ID0gZW5kTGluZS5zbGljZSh0by5jaCkubGFzdEluZGV4T2Yoc3RhcnRTdHJpbmcsIGZpcnN0RW5kIC0gdG8uY2gpOwogICAgbGFzdFN0YXJ0ID0gKGZpcnN0RW5kID09IC0xIHx8IGFsbW9zdExhc3RTdGFydCA9PSAtMSkgPyAtMSA6IHRvLmNoICsgYWxtb3N0TGFzdFN0YXJ0OwogICAgaWYgKGZpcnN0RW5kICE9IC0xICYmIGxhc3RTdGFydCAhPSAtMSAmJiBsYXN0U3RhcnQgIT0gdG8uY2gpIHJldHVybiBmYWxzZTsKCiAgICBzZWxmLm9wZXJhdGlvbihmdW5jdGlvbigpIHsKICAgICAgc2VsZi5yZXBsYWNlUmFuZ2UoIiIsIFBvcyhlbmQsIGNsb3NlIC0gKHBhZCAmJiBlbmRMaW5lLnNsaWNlKGNsb3NlIC0gcGFkLmxlbmd0aCwgY2xvc2UpID09IHBhZCA/IHBhZC5sZW5ndGggOiAwKSksCiAgICAgICAgICAgICAgICAgICAgICAgIFBvcyhlbmQsIGNsb3NlICsgZW5kU3RyaW5nLmxlbmd0aCkpOwogICAgICB2YXIgb3BlbkVuZCA9IG9wZW4gKyBzdGFydFN0cmluZy5sZW5ndGg7CiAgICAgIGlmIChwYWQgJiYgc3RhcnRMaW5lLnNsaWNlKG9wZW5FbmQsIG9wZW5FbmQgKyBwYWQubGVuZ3RoKSA9PSBwYWQpIG9wZW5FbmQgKz0gcGFkLmxlbmd0aDsKICAgICAgc2VsZi5yZXBsYWNlUmFuZ2UoIiIsIFBvcyhzdGFydCwgb3BlbiksIFBvcyhzdGFydCwgb3BlbkVuZCkpOwogICAgICBpZiAobGVhZCkgZm9yICh2YXIgaSA9IHN0YXJ0ICsgMTsgaSA8PSBlbmQ7ICsraSkgewogICAgICAgIHZhciBsaW5lID0gc2VsZi5nZXRMaW5lKGkpLCBmb3VuZCA9IGxpbmUuaW5kZXhPZihsZWFkKTsKICAgICAgICBpZiAoZm91bmQgPT0gLTEgfHwgbm9uV1MudGVzdChsaW5lLnNsaWNlKDAsIGZvdW5kKSkpIGNvbnRpbnVlOwogICAgICAgIHZhciBmb3VuZEVuZCA9IGZvdW5kICsgbGVhZC5sZW5ndGg7CiAgICAgICAgaWYgKHBhZCAmJiBsaW5lLnNsaWNlKGZvdW5kRW5kLCBmb3VuZEVuZCArIHBhZC5sZW5ndGgpID09IHBhZCkgZm91bmRFbmQgKz0gcGFkLmxlbmd0aDsKICAgICAgICBzZWxmLnJlcGxhY2VSYW5nZSgiIiwgUG9zKGksIGZvdW5kKSwgUG9zKGksIGZvdW5kRW5kKSk7CiAgICAgIH0KICAgIH0pOwogICAgcmV0dXJuIHRydWU7CiAgfSk7Cn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/comment/continuecomment.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICB2YXIgbW9kZXMgPSBbImNsaWtlIiwgImNzcyIsICJqYXZhc2NyaXB0Il07CgogIGZvciAodmFyIGkgPSAwOyBpIDwgbW9kZXMubGVuZ3RoOyArK2kpCiAgICBDb2RlTWlycm9yLmV4dGVuZE1vZGUobW9kZXNbaV0sIHtibG9ja0NvbW1lbnRDb250aW51ZTogIiAqICJ9KTsKCiAgZnVuY3Rpb24gY29udGludWVDb21tZW50KGNtKSB7CiAgICBpZiAoY20uZ2V0T3B0aW9uKCJkaXNhYmxlSW5wdXQiKSkgcmV0dXJuIENvZGVNaXJyb3IuUGFzczsKICAgIHZhciByYW5nZXMgPSBjbS5saXN0U2VsZWN0aW9ucygpLCBtb2RlLCBpbnNlcnRzID0gW107CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJhbmdlcy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgcG9zID0gcmFuZ2VzW2ldLmhlYWQsIHRva2VuID0gY20uZ2V0VG9rZW5BdChwb3MpOwogICAgICBpZiAodG9rZW4udHlwZSAhPSAiY29tbWVudCIpIHJldHVybiBDb2RlTWlycm9yLlBhc3M7CiAgICAgIHZhciBtb2RlSGVyZSA9IENvZGVNaXJyb3IuaW5uZXJNb2RlKGNtLmdldE1vZGUoKSwgdG9rZW4uc3RhdGUpLm1vZGU7CiAgICAgIGlmICghbW9kZSkgbW9kZSA9IG1vZGVIZXJlOwogICAgICBlbHNlIGlmIChtb2RlICE9IG1vZGVIZXJlKSByZXR1cm4gQ29kZU1pcnJvci5QYXNzOwoKICAgICAgdmFyIGluc2VydCA9IG51bGw7CiAgICAgIGlmIChtb2RlLmJsb2NrQ29tbWVudFN0YXJ0ICYmIG1vZGUuYmxvY2tDb21tZW50Q29udGludWUpIHsKICAgICAgICB2YXIgZW5kID0gdG9rZW4uc3RyaW5nLmluZGV4T2YobW9kZS5ibG9ja0NvbW1lbnRFbmQpOwogICAgICAgIHZhciBmdWxsID0gY20uZ2V0UmFuZ2UoQ29kZU1pcnJvci5Qb3MocG9zLmxpbmUsIDApLCBDb2RlTWlycm9yLlBvcyhwb3MubGluZSwgdG9rZW4uZW5kKSksIGZvdW5kOwogICAgICAgIGlmIChlbmQgIT0gLTEgJiYgZW5kID09IHRva2VuLnN0cmluZy5sZW5ndGggLSBtb2RlLmJsb2NrQ29tbWVudEVuZC5sZW5ndGggJiYgcG9zLmNoID49IGVuZCkgewogICAgICAgICAgLy8gQ29tbWVudCBlbmRlZCwgZG9uJ3QgY29udGludWUgaXQKICAgICAgICB9IGVsc2UgaWYgKHRva2VuLnN0cmluZy5pbmRleE9mKG1vZGUuYmxvY2tDb21tZW50U3RhcnQpID09IDApIHsKICAgICAgICAgIGluc2VydCA9IGZ1bGwuc2xpY2UoMCwgdG9rZW4uc3RhcnQpOwogICAgICAgICAgaWYgKCEvXlxzKiQvLnRlc3QoaW5zZXJ0KSkgewogICAgICAgICAgICBpbnNlcnQgPSAiIjsKICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB0b2tlbi5zdGFydDsgKytqKSBpbnNlcnQgKz0gIiAiOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAoKGZvdW5kID0gZnVsbC5pbmRleE9mKG1vZGUuYmxvY2tDb21tZW50Q29udGludWUpKSAhPSAtMSAmJgogICAgICAgICAgICAgICAgICAgZm91bmQgKyBtb2RlLmJsb2NrQ29tbWVudENvbnRpbnVlLmxlbmd0aCA+IHRva2VuLnN0YXJ0ICYmCiAgICAgICAgICAgICAgICAgICAvXlxzKiQvLnRlc3QoZnVsbC5zbGljZSgwLCBmb3VuZCkpKSB7CiAgICAgICAgICBpbnNlcnQgPSBmdWxsLnNsaWNlKDAsIGZvdW5kKTsKICAgICAgICB9CiAgICAgICAgaWYgKGluc2VydCAhPSBudWxsKSBpbnNlcnQgKz0gbW9kZS5ibG9ja0NvbW1lbnRDb250aW51ZTsKICAgICAgfQogICAgICBpZiAoaW5zZXJ0ID09IG51bGwgJiYgbW9kZS5saW5lQ29tbWVudCAmJiBjb250aW51ZUxpbmVDb21tZW50RW5hYmxlZChjbSkpIHsKICAgICAgICB2YXIgbGluZSA9IGNtLmdldExpbmUocG9zLmxpbmUpLCBmb3VuZCA9IGxpbmUuaW5kZXhPZihtb2RlLmxpbmVDb21tZW50KTsKICAgICAgICBpZiAoZm91bmQgPiAtMSkgewogICAgICAgICAgaW5zZXJ0ID0gbGluZS5zbGljZSgwLCBmb3VuZCk7CiAgICAgICAgICBpZiAoL1xTLy50ZXN0KGluc2VydCkpIGluc2VydCA9IG51bGw7CiAgICAgICAgICBlbHNlIGluc2VydCArPSBtb2RlLmxpbmVDb21tZW50ICsgbGluZS5zbGljZShmb3VuZCArIG1vZGUubGluZUNvbW1lbnQubGVuZ3RoKS5tYXRjaCgvXlxzKi8pWzBdOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoaW5zZXJ0ID09IG51bGwpIHJldHVybiBDb2RlTWlycm9yLlBhc3M7CiAgICAgIGluc2VydHNbaV0gPSAiXG4iICsgaW5zZXJ0OwogICAgfQoKICAgIGNtLm9wZXJhdGlvbihmdW5jdGlvbigpIHsKICAgICAgZm9yICh2YXIgaSA9IHJhbmdlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkKICAgICAgICBjbS5yZXBsYWNlUmFuZ2UoaW5zZXJ0c1tpXSwgcmFuZ2VzW2ldLmZyb20oKSwgcmFuZ2VzW2ldLnRvKCksICIraW5zZXJ0Iik7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIGNvbnRpbnVlTGluZUNvbW1lbnRFbmFibGVkKGNtKSB7CiAgICB2YXIgb3B0ID0gY20uZ2V0T3B0aW9uKCJjb250aW51ZUNvbW1lbnRzIik7CiAgICBpZiAob3B0ICYmIHR5cGVvZiBvcHQgPT0gIm9iamVjdCIpCiAgICAgIHJldHVybiBvcHQuY29udGludWVMaW5lQ29tbWVudCAhPT0gZmFsc2U7CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIENvZGVNaXJyb3IuZGVmaW5lT3B0aW9uKCJjb250aW51ZUNvbW1lbnRzIiwgbnVsbCwgZnVuY3Rpb24oY20sIHZhbCwgcHJldikgewogICAgaWYgKHByZXYgJiYgcHJldiAhPSBDb2RlTWlycm9yLkluaXQpCiAgICAgIGNtLnJlbW92ZUtleU1hcCgiY29udGludWVDb21tZW50Iik7CiAgICBpZiAodmFsKSB7CiAgICAgIHZhciBrZXkgPSAiRW50ZXIiOwogICAgICBpZiAodHlwZW9mIHZhbCA9PSAic3RyaW5nIikKICAgICAgICBrZXkgPSB2YWw7CiAgICAgIGVsc2UgaWYgKHR5cGVvZiB2YWwgPT0gIm9iamVjdCIgJiYgdmFsLmtleSkKICAgICAgICBrZXkgPSB2YWwua2V5OwogICAgICB2YXIgbWFwID0ge25hbWU6ICJjb250aW51ZUNvbW1lbnQifTsKICAgICAgbWFwW2tleV0gPSBjb250aW51ZUNvbW1lbnQ7CiAgICAgIGNtLmFkZEtleU1hcChtYXApOwogICAgfQogIH0pOwp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/dialog/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/dialog/dialog.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LkNvZGVNaXJyb3ItZGlhbG9nIHsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgbGVmdDogMDsgcmlnaHQ6IDA7CiAgYmFja2dyb3VuZDogaW5oZXJpdDsKICB6LWluZGV4OiAxNTsKICBwYWRkaW5nOiAuMWVtIC44ZW07CiAgb3ZlcmZsb3c6IGhpZGRlbjsKICBjb2xvcjogaW5oZXJpdDsKfQoKLkNvZGVNaXJyb3ItZGlhbG9nLXRvcCB7CiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlZWU7CiAgdG9wOiAwOwp9CgouQ29kZU1pcnJvci1kaWFsb2ctYm90dG9tIHsKICBib3JkZXItdG9wOiAxcHggc29saWQgI2VlZTsKICBib3R0b206IDA7Cn0KCi5Db2RlTWlycm9yLWRpYWxvZyBpbnB1dCB7CiAgYm9yZGVyOiBub25lOwogIG91dGxpbmU6IG5vbmU7CiAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgd2lkdGg6IDIwZW07CiAgY29sb3I6IGluaGVyaXQ7CiAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKfQoKLkNvZGVNaXJyb3ItZGlhbG9nIGJ1dHRvbiB7CiAgZm9udC1zaXplOiA3MCU7Cn0K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/dialog/dialog.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovLyBPcGVuIHNpbXBsZSBkaWFsb2dzIG9uIHRvcCBvZiBhbiBlZGl0b3IuIFJlbGllcyBvbiBkaWFsb2cuY3NzLgoKKGZ1bmN0aW9uKG1vZCkgewogIGlmICh0eXBlb2YgZXhwb3J0cyA9PSAib2JqZWN0IiAmJiB0eXBlb2YgbW9kdWxlID09ICJvYmplY3QiKSAvLyBDb21tb25KUwogICAgbW9kKHJlcXVpcmUoIi4uLy4uL2xpYi9jb2RlbWlycm9yIikpOwogIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kKSAvLyBBTUQKICAgIGRlZmluZShbIi4uLy4uL2xpYi9jb2RlbWlycm9yIl0sIG1vZCk7CiAgZWxzZSAvLyBQbGFpbiBicm93c2VyIGVudgogICAgbW9kKENvZGVNaXJyb3IpOwp9KShmdW5jdGlvbihDb2RlTWlycm9yKSB7CiAgZnVuY3Rpb24gZGlhbG9nRGl2KGNtLCB0ZW1wbGF0ZSwgYm90dG9tKSB7CiAgICB2YXIgd3JhcCA9IGNtLmdldFdyYXBwZXJFbGVtZW50KCk7CiAgICB2YXIgZGlhbG9nOwogICAgZGlhbG9nID0gd3JhcC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSk7CiAgICBpZiAoYm90dG9tKQogICAgICBkaWFsb2cuY2xhc3NOYW1lID0gIkNvZGVNaXJyb3ItZGlhbG9nIENvZGVNaXJyb3ItZGlhbG9nLWJvdHRvbSI7CiAgICBlbHNlCiAgICAgIGRpYWxvZy5jbGFzc05hbWUgPSAiQ29kZU1pcnJvci1kaWFsb2cgQ29kZU1pcnJvci1kaWFsb2ctdG9wIjsKCiAgICBpZiAodHlwZW9mIHRlbXBsYXRlID09ICJzdHJpbmciKSB7CiAgICAgIGRpYWxvZy5pbm5lckhUTUwgPSB0ZW1wbGF0ZTsKICAgIH0gZWxzZSB7IC8vIEFzc3VtaW5nIGl0J3MgYSBkZXRhY2hlZCBET00gZWxlbWVudC4KICAgICAgZGlhbG9nLmFwcGVuZENoaWxkKHRlbXBsYXRlKTsKICAgIH0KICAgIHJldHVybiBkaWFsb2c7CiAgfQoKICBmdW5jdGlvbiBjbG9zZU5vdGlmaWNhdGlvbihjbSwgbmV3VmFsKSB7CiAgICBpZiAoY20uc3RhdGUuY3VycmVudE5vdGlmaWNhdGlvbkNsb3NlKQogICAgICBjbS5zdGF0ZS5jdXJyZW50Tm90aWZpY2F0aW9uQ2xvc2UoKTsKICAgIGNtLnN0YXRlLmN1cnJlbnROb3RpZmljYXRpb25DbG9zZSA9IG5ld1ZhbDsKICB9CgogIENvZGVNaXJyb3IuZGVmaW5lRXh0ZW5zaW9uKCJvcGVuRGlhbG9nIiwgZnVuY3Rpb24odGVtcGxhdGUsIGNhbGxiYWNrLCBvcHRpb25zKSB7CiAgICBpZiAoIW9wdGlvbnMpIG9wdGlvbnMgPSB7fTsKCiAgICBjbG9zZU5vdGlmaWNhdGlvbih0aGlzLCBudWxsKTsKCiAgICB2YXIgZGlhbG9nID0gZGlhbG9nRGl2KHRoaXMsIHRlbXBsYXRlLCBvcHRpb25zLmJvdHRvbSk7CiAgICB2YXIgY2xvc2VkID0gZmFsc2UsIG1lID0gdGhpczsKICAgIGZ1bmN0aW9uIGNsb3NlKG5ld1ZhbCkgewogICAgICBpZiAodHlwZW9mIG5ld1ZhbCA9PSAnc3RyaW5nJykgewogICAgICAgIGlucC52YWx1ZSA9IG5ld1ZhbDsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoY2xvc2VkKSByZXR1cm47CiAgICAgICAgY2xvc2VkID0gdHJ1ZTsKICAgICAgICBkaWFsb2cucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChkaWFsb2cpOwogICAgICAgIG1lLmZvY3VzKCk7CgogICAgICAgIGlmIChvcHRpb25zLm9uQ2xvc2UpIG9wdGlvbnMub25DbG9zZShkaWFsb2cpOwogICAgICB9CiAgICB9CgogICAgdmFyIGlucCA9IGRpYWxvZy5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaW5wdXQiKVswXSwgYnV0dG9uOwogICAgaWYgKGlucCkgewogICAgICBpbnAuZm9jdXMoKTsKCiAgICAgIGlmIChvcHRpb25zLnZhbHVlKSB7CiAgICAgICAgaW5wLnZhbHVlID0gb3B0aW9ucy52YWx1ZTsKICAgICAgICBpZiAob3B0aW9ucy5zZWxlY3RWYWx1ZU9uT3BlbiAhPT0gZmFsc2UpIHsKICAgICAgICAgIGlucC5zZWxlY3QoKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGlmIChvcHRpb25zLm9uSW5wdXQpCiAgICAgICAgQ29kZU1pcnJvci5vbihpbnAsICJpbnB1dCIsIGZ1bmN0aW9uKGUpIHsgb3B0aW9ucy5vbklucHV0KGUsIGlucC52YWx1ZSwgY2xvc2UpO30pOwogICAgICBpZiAob3B0aW9ucy5vbktleVVwKQogICAgICAgIENvZGVNaXJyb3Iub24oaW5wLCAia2V5dXAiLCBmdW5jdGlvbihlKSB7b3B0aW9ucy5vbktleVVwKGUsIGlucC52YWx1ZSwgY2xvc2UpO30pOwoKICAgICAgQ29kZU1pcnJvci5vbihpbnAsICJrZXlkb3duIiwgZnVuY3Rpb24oZSkgewogICAgICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMub25LZXlEb3duICYmIG9wdGlvbnMub25LZXlEb3duKGUsIGlucC52YWx1ZSwgY2xvc2UpKSB7IHJldHVybjsgfQogICAgICAgIGlmIChlLmtleUNvZGUgPT0gMjcgfHwgKG9wdGlvbnMuY2xvc2VPbkVudGVyICE9PSBmYWxzZSAmJiBlLmtleUNvZGUgPT0gMTMpKSB7CiAgICAgICAgICBpbnAuYmx1cigpOwogICAgICAgICAgQ29kZU1pcnJvci5lX3N0b3AoZSk7CiAgICAgICAgICBjbG9zZSgpOwogICAgICAgIH0KICAgICAgICBpZiAoZS5rZXlDb2RlID09IDEzKSBjYWxsYmFjayhpbnAudmFsdWUsIGUpOwogICAgICB9KTsKCiAgICAgIGlmIChvcHRpb25zLmNsb3NlT25CbHVyICE9PSBmYWxzZSkgQ29kZU1pcnJvci5vbihpbnAsICJibHVyIiwgY2xvc2UpOwogICAgfSBlbHNlIGlmIChidXR0b24gPSBkaWFsb2cuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImJ1dHRvbiIpWzBdKSB7CiAgICAgIENvZGVNaXJyb3Iub24oYnV0dG9uLCAiY2xpY2siLCBmdW5jdGlvbigpIHsKICAgICAgICBjbG9zZSgpOwogICAgICAgIG1lLmZvY3VzKCk7CiAgICAgIH0pOwoKICAgICAgaWYgKG9wdGlvbnMuY2xvc2VPbkJsdXIgIT09IGZhbHNlKSBDb2RlTWlycm9yLm9uKGJ1dHRvbiwgImJsdXIiLCBjbG9zZSk7CgogICAgICBidXR0b24uZm9jdXMoKTsKICAgIH0KICAgIHJldHVybiBjbG9zZTsKICB9KTsKCiAgQ29kZU1pcnJvci5kZWZpbmVFeHRlbnNpb24oIm9wZW5Db25maXJtIiwgZnVuY3Rpb24odGVtcGxhdGUsIGNhbGxiYWNrcywgb3B0aW9ucykgewogICAgY2xvc2VOb3RpZmljYXRpb24odGhpcywgbnVsbCk7CiAgICB2YXIgZGlhbG9nID0gZGlhbG9nRGl2KHRoaXMsIHRlbXBsYXRlLCBvcHRpb25zICYmIG9wdGlvbnMuYm90dG9tKTsKICAgIHZhciBidXR0b25zID0gZGlhbG9nLmdldEVsZW1lbnRzQnlUYWdOYW1lKCJidXR0b24iKTsKICAgIHZhciBjbG9zZWQgPSBmYWxzZSwgbWUgPSB0aGlzLCBibHVycmluZyA9IDE7CiAgICBmdW5jdGlvbiBjbG9zZSgpIHsKICAgICAgaWYgKGNsb3NlZCkgcmV0dXJuOwogICAgICBjbG9zZWQgPSB0cnVlOwogICAgICBkaWFsb2cucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChkaWFsb2cpOwogICAgICBtZS5mb2N1cygpOwogICAgfQogICAgYnV0dG9uc1swXS5mb2N1cygpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBidXR0b25zLmxlbmd0aDsgKytpKSB7CiAgICAgIHZhciBiID0gYnV0dG9uc1tpXTsKICAgICAgKGZ1bmN0aW9uKGNhbGxiYWNrKSB7CiAgICAgICAgQ29kZU1pcnJvci5vbihiLCAiY2xpY2siLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICBDb2RlTWlycm9yLmVfcHJldmVudERlZmF1bHQoZSk7CiAgICAgICAgICBjbG9zZSgpOwogICAgICAgICAgaWYgKGNhbGxiYWNrKSBjYWxsYmFjayhtZSk7CiAgICAgICAgfSk7CiAgICAgIH0pKGNhbGxiYWNrc1tpXSk7CiAgICAgIENvZGVNaXJyb3Iub24oYiwgImJsdXIiLCBmdW5jdGlvbigpIHsKICAgICAgICAtLWJsdXJyaW5nOwogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IGlmIChibHVycmluZyA8PSAwKSBjbG9zZSgpOyB9LCAyMDApOwogICAgICB9KTsKICAgICAgQ29kZU1pcnJvci5vbihiLCAiZm9jdXMiLCBmdW5jdGlvbigpIHsgKytibHVycmluZzsgfSk7CiAgICB9CiAgfSk7CgogIC8qCiAgICogb3Blbk5vdGlmaWNhdGlvbgogICAqIE9wZW5zIGEgbm90aWZpY2F0aW9uLCB0aGF0IGNhbiBiZSBjbG9zZWQgd2l0aCBhbiBvcHRpb25hbCB0aW1lcgogICAqIChkZWZhdWx0IDUwMDBtcyB0aW1lcikgYW5kIGFsd2F5cyBjbG9zZXMgb24gY2xpY2suCiAgICoKICAgKiBJZiBhIG5vdGlmaWNhdGlvbiBpcyBvcGVuZWQgd2hpbGUgYW5vdGhlciBpcyBvcGVuZWQsIGl0IHdpbGwgY2xvc2UgdGhlCiAgICogY3VycmVudGx5IG9wZW5lZCBvbmUgYW5kIG9wZW4gdGhlIG5ldyBvbmUgaW1tZWRpYXRlbHkuCiAgICovCiAgQ29kZU1pcnJvci5kZWZpbmVFeHRlbnNpb24oIm9wZW5Ob3RpZmljYXRpb24iLCBmdW5jdGlvbih0ZW1wbGF0ZSwgb3B0aW9ucykgewogICAgY2xvc2VOb3RpZmljYXRpb24odGhpcywgY2xvc2UpOwogICAgdmFyIGRpYWxvZyA9IGRpYWxvZ0Rpdih0aGlzLCB0ZW1wbGF0ZSwgb3B0aW9ucyAmJiBvcHRpb25zLmJvdHRvbSk7CiAgICB2YXIgY2xvc2VkID0gZmFsc2UsIGRvbmVUaW1lcjsKICAgIHZhciBkdXJhdGlvbiA9IG9wdGlvbnMgJiYgdHlwZW9mIG9wdGlvbnMuZHVyYXRpb24gIT09ICJ1bmRlZmluZWQiID8gb3B0aW9ucy5kdXJhdGlvbiA6IDUwMDA7CgogICAgZnVuY3Rpb24gY2xvc2UoKSB7CiAgICAgIGlmIChjbG9zZWQpIHJldHVybjsKICAgICAgY2xvc2VkID0gdHJ1ZTsKICAgICAgY2xlYXJUaW1lb3V0KGRvbmVUaW1lcik7CiAgICAgIGRpYWxvZy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGRpYWxvZyk7CiAgICB9CgogICAgQ29kZU1pcnJvci5vbihkaWFsb2csICdjbGljaycsIGZ1bmN0aW9uKGUpIHsKICAgICAgQ29kZU1pcnJvci5lX3ByZXZlbnREZWZhdWx0KGUpOwogICAgICBjbG9zZSgpOwogICAgfSk7CgogICAgaWYgKGR1cmF0aW9uKQogICAgICBkb25lVGltZXIgPSBzZXRUaW1lb3V0KGNsb3NlLCBkdXJhdGlvbik7CgogICAgcmV0dXJuIGNsb3NlOwogIH0pOwp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/display/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/display/autorefresh.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSkKICBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCkgLy8gQU1ECiAgICBkZWZpbmUoWyIuLi8uLi9saWIvY29kZW1pcnJvciJdLCBtb2QpCiAgZWxzZSAvLyBQbGFpbiBicm93c2VyIGVudgogICAgbW9kKENvZGVNaXJyb3IpCn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCIKCiAgQ29kZU1pcnJvci5kZWZpbmVPcHRpb24oImF1dG9SZWZyZXNoIiwgZmFsc2UsIGZ1bmN0aW9uKGNtLCB2YWwpIHsKICAgIGlmIChjbS5zdGF0ZS5hdXRvUmVmcmVzaCkgewogICAgICBzdG9wTGlzdGVuaW5nKGNtLCBjbS5zdGF0ZS5hdXRvUmVmcmVzaCkKICAgICAgY20uc3RhdGUuYXV0b1JlZnJlc2ggPSBudWxsCiAgICB9CiAgICBpZiAodmFsICYmIGNtLmRpc3BsYXkud3JhcHBlci5vZmZzZXRIZWlnaHQgPT0gMCkKICAgICAgc3RhcnRMaXN0ZW5pbmcoY20sIGNtLnN0YXRlLmF1dG9SZWZyZXNoID0ge2RlbGF5OiB2YWwuZGVsYXkgfHwgMjUwfSkKICB9KQoKICBmdW5jdGlvbiBzdGFydExpc3RlbmluZyhjbSwgc3RhdGUpIHsKICAgIGZ1bmN0aW9uIGNoZWNrKCkgewogICAgICBpZiAoY20uZGlzcGxheS53cmFwcGVyLm9mZnNldEhlaWdodCkgewogICAgICAgIHN0b3BMaXN0ZW5pbmcoY20sIHN0YXRlKQogICAgICAgIGlmIChjbS5kaXNwbGF5Lmxhc3RXcmFwSGVpZ2h0ICE9IGNtLmRpc3BsYXkud3JhcHBlci5jbGllbnRIZWlnaHQpCiAgICAgICAgICBjbS5yZWZyZXNoKCkKICAgICAgfSBlbHNlIHsKICAgICAgICBzdGF0ZS50aW1lb3V0ID0gc2V0VGltZW91dChjaGVjaywgc3RhdGUuZGVsYXkpCiAgICAgIH0KICAgIH0KICAgIHN0YXRlLnRpbWVvdXQgPSBzZXRUaW1lb3V0KGNoZWNrLCBzdGF0ZS5kZWxheSkKICAgIHN0YXRlLmh1cnJ5ID0gZnVuY3Rpb24oKSB7CiAgICAgIGNsZWFyVGltZW91dChzdGF0ZS50aW1lb3V0KQogICAgICBzdGF0ZS50aW1lb3V0ID0gc2V0VGltZW91dChjaGVjaywgNTApCiAgICB9CiAgICBDb2RlTWlycm9yLm9uKHdpbmRvdywgIm1vdXNldXAiLCBzdGF0ZS5odXJyeSkKICAgIENvZGVNaXJyb3Iub24od2luZG93LCAia2V5dXAiLCBzdGF0ZS5odXJyeSkKICB9CgogIGZ1bmN0aW9uIHN0b3BMaXN0ZW5pbmcoX2NtLCBzdGF0ZSkgewogICAgY2xlYXJUaW1lb3V0KHN0YXRlLnRpbWVvdXQpCiAgICBDb2RlTWlycm9yLm9mZih3aW5kb3csICJtb3VzZXVwIiwgc3RhdGUuaHVycnkpCiAgICBDb2RlTWlycm9yLm9mZih3aW5kb3csICJrZXl1cCIsIHN0YXRlLmh1cnJ5KQogIH0KfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/display/fullscreen.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LkNvZGVNaXJyb3ItZnVsbHNjcmVlbiB7CiAgcG9zaXRpb246IGZpeGVkOwogIHRvcDogMDsgbGVmdDogMDsgcmlnaHQ6IDA7IGJvdHRvbTogMDsKICBoZWlnaHQ6IGF1dG87CiAgei1pbmRleDogOTsKfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/display/fullscreen.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CgogIENvZGVNaXJyb3IuZGVmaW5lT3B0aW9uKCJmdWxsU2NyZWVuIiwgZmFsc2UsIGZ1bmN0aW9uKGNtLCB2YWwsIG9sZCkgewogICAgaWYgKG9sZCA9PSBDb2RlTWlycm9yLkluaXQpIG9sZCA9IGZhbHNlOwogICAgaWYgKCFvbGQgPT0gIXZhbCkgcmV0dXJuOwogICAgaWYgKHZhbCkgc2V0RnVsbHNjcmVlbihjbSk7CiAgICBlbHNlIHNldE5vcm1hbChjbSk7CiAgfSk7CgogIGZ1bmN0aW9uIHNldEZ1bGxzY3JlZW4oY20pIHsKICAgIHZhciB3cmFwID0gY20uZ2V0V3JhcHBlckVsZW1lbnQoKTsKICAgIGNtLnN0YXRlLmZ1bGxTY3JlZW5SZXN0b3JlID0ge3Njcm9sbFRvcDogd2luZG93LnBhZ2VZT2Zmc2V0LCBzY3JvbGxMZWZ0OiB3aW5kb3cucGFnZVhPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aDogd3JhcC5zdHlsZS53aWR0aCwgaGVpZ2h0OiB3cmFwLnN0eWxlLmhlaWdodH07CiAgICB3cmFwLnN0eWxlLndpZHRoID0gIiI7CiAgICB3cmFwLnN0eWxlLmhlaWdodCA9ICJhdXRvIjsKICAgIHdyYXAuY2xhc3NOYW1lICs9ICIgQ29kZU1pcnJvci1mdWxsc2NyZWVuIjsKICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZS5vdmVyZmxvdyA9ICJoaWRkZW4iOwogICAgY20ucmVmcmVzaCgpOwogIH0KCiAgZnVuY3Rpb24gc2V0Tm9ybWFsKGNtKSB7CiAgICB2YXIgd3JhcCA9IGNtLmdldFdyYXBwZXJFbGVtZW50KCk7CiAgICB3cmFwLmNsYXNzTmFtZSA9IHdyYXAuY2xhc3NOYW1lLnJlcGxhY2UoL1xzKkNvZGVNaXJyb3ItZnVsbHNjcmVlblxiLywgIiIpOwogICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlLm92ZXJmbG93ID0gIiI7CiAgICB2YXIgaW5mbyA9IGNtLnN0YXRlLmZ1bGxTY3JlZW5SZXN0b3JlOwogICAgd3JhcC5zdHlsZS53aWR0aCA9IGluZm8ud2lkdGg7IHdyYXAuc3R5bGUuaGVpZ2h0ID0gaW5mby5oZWlnaHQ7CiAgICB3aW5kb3cuc2Nyb2xsVG8oaW5mby5zY3JvbGxMZWZ0LCBpbmZvLnNjcm9sbFRvcCk7CiAgICBjbS5yZWZyZXNoKCk7CiAgfQp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/display/panel.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICBDb2RlTWlycm9yLmRlZmluZUV4dGVuc2lvbigiYWRkUGFuZWwiLCBmdW5jdGlvbihub2RlLCBvcHRpb25zKSB7CiAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKCiAgICBpZiAoIXRoaXMuc3RhdGUucGFuZWxzKSBpbml0UGFuZWxzKHRoaXMpOwoKICAgIHZhciBpbmZvID0gdGhpcy5zdGF0ZS5wYW5lbHM7CiAgICB2YXIgd3JhcHBlciA9IGluZm8ud3JhcHBlcjsKICAgIHZhciBjbVdyYXBwZXIgPSB0aGlzLmdldFdyYXBwZXJFbGVtZW50KCk7CgogICAgaWYgKG9wdGlvbnMuYWZ0ZXIgaW5zdGFuY2VvZiBQYW5lbCAmJiAhb3B0aW9ucy5hZnRlci5jbGVhcmVkKSB7CiAgICAgIHdyYXBwZXIuaW5zZXJ0QmVmb3JlKG5vZGUsIG9wdGlvbnMuYmVmb3JlLm5vZGUubmV4dFNpYmxpbmcpOwogICAgfSBlbHNlIGlmIChvcHRpb25zLmJlZm9yZSBpbnN0YW5jZW9mIFBhbmVsICYmICFvcHRpb25zLmJlZm9yZS5jbGVhcmVkKSB7CiAgICAgIHdyYXBwZXIuaW5zZXJ0QmVmb3JlKG5vZGUsIG9wdGlvbnMuYmVmb3JlLm5vZGUpOwogICAgfSBlbHNlIGlmIChvcHRpb25zLnJlcGxhY2UgaW5zdGFuY2VvZiBQYW5lbCAmJiAhb3B0aW9ucy5yZXBsYWNlLmNsZWFyZWQpIHsKICAgICAgd3JhcHBlci5pbnNlcnRCZWZvcmUobm9kZSwgb3B0aW9ucy5yZXBsYWNlLm5vZGUpOwogICAgICBvcHRpb25zLnJlcGxhY2UuY2xlYXIoKTsKICAgIH0gZWxzZSBpZiAob3B0aW9ucy5wb3NpdGlvbiA9PSAiYm90dG9tIikgewogICAgICB3cmFwcGVyLmFwcGVuZENoaWxkKG5vZGUpOwogICAgfSBlbHNlIGlmIChvcHRpb25zLnBvc2l0aW9uID09ICJiZWZvcmUtYm90dG9tIikgewogICAgICB3cmFwcGVyLmluc2VydEJlZm9yZShub2RlLCBjbVdyYXBwZXIubmV4dFNpYmxpbmcpOwogICAgfSBlbHNlIGlmIChvcHRpb25zLnBvc2l0aW9uID09ICJhZnRlci10b3AiKSB7CiAgICAgIHdyYXBwZXIuaW5zZXJ0QmVmb3JlKG5vZGUsIGNtV3JhcHBlcik7CiAgICB9IGVsc2UgewogICAgICB3cmFwcGVyLmluc2VydEJlZm9yZShub2RlLCB3cmFwcGVyLmZpcnN0Q2hpbGQpOwogICAgfQoKICAgIHZhciBoZWlnaHQgPSAob3B0aW9ucyAmJiBvcHRpb25zLmhlaWdodCkgfHwgbm9kZS5vZmZzZXRIZWlnaHQ7CiAgICB0aGlzLl9zZXRTaXplKG51bGwsIGluZm8uaGVpZ2h0TGVmdCAtPSBoZWlnaHQpOwogICAgaW5mby5wYW5lbHMrKzsKICAgIHJldHVybiBuZXcgUGFuZWwodGhpcywgbm9kZSwgb3B0aW9ucywgaGVpZ2h0KTsKICB9KTsKCiAgZnVuY3Rpb24gUGFuZWwoY20sIG5vZGUsIG9wdGlvbnMsIGhlaWdodCkgewogICAgdGhpcy5jbSA9IGNtOwogICAgdGhpcy5ub2RlID0gbm9kZTsKICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CiAgICB0aGlzLmhlaWdodCA9IGhlaWdodDsKICAgIHRoaXMuY2xlYXJlZCA9IGZhbHNlOwogIH0KCiAgUGFuZWwucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24oKSB7CiAgICBpZiAodGhpcy5jbGVhcmVkKSByZXR1cm47CiAgICB0aGlzLmNsZWFyZWQgPSB0cnVlOwogICAgdmFyIGluZm8gPSB0aGlzLmNtLnN0YXRlLnBhbmVsczsKICAgIHRoaXMuY20uX3NldFNpemUobnVsbCwgaW5mby5oZWlnaHRMZWZ0ICs9IHRoaXMuaGVpZ2h0KTsKICAgIGluZm8ud3JhcHBlci5yZW1vdmVDaGlsZCh0aGlzLm5vZGUpOwogICAgaWYgKC0taW5mby5wYW5lbHMgPT0gMCkgcmVtb3ZlUGFuZWxzKHRoaXMuY20pOwogIH07CgogIFBhbmVsLnByb3RvdHlwZS5jaGFuZ2VkID0gZnVuY3Rpb24oaGVpZ2h0KSB7CiAgICB2YXIgbmV3SGVpZ2h0ID0gaGVpZ2h0ID09IG51bGwgPyB0aGlzLm5vZGUub2Zmc2V0SGVpZ2h0IDogaGVpZ2h0OwogICAgdmFyIGluZm8gPSB0aGlzLmNtLnN0YXRlLnBhbmVsczsKICAgIHRoaXMuY20uX3NldFNpemUobnVsbCwgaW5mby5oZWlnaHQgKz0gKG5ld0hlaWdodCAtIHRoaXMuaGVpZ2h0KSk7CiAgICB0aGlzLmhlaWdodCA9IG5ld0hlaWdodDsKICB9OwoKICBmdW5jdGlvbiBpbml0UGFuZWxzKGNtKSB7CiAgICB2YXIgd3JhcCA9IGNtLmdldFdyYXBwZXJFbGVtZW50KCk7CiAgICB2YXIgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSA/IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHdyYXApIDogd3JhcC5jdXJyZW50U3R5bGU7CiAgICB2YXIgaGVpZ2h0ID0gcGFyc2VJbnQoc3R5bGUuaGVpZ2h0KTsKICAgIHZhciBpbmZvID0gY20uc3RhdGUucGFuZWxzID0gewogICAgICBzZXRIZWlnaHQ6IHdyYXAuc3R5bGUuaGVpZ2h0LAogICAgICBoZWlnaHRMZWZ0OiBoZWlnaHQsCiAgICAgIHBhbmVsczogMCwKICAgICAgd3JhcHBlcjogZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikKICAgIH07CiAgICB3cmFwLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGluZm8ud3JhcHBlciwgd3JhcCk7CiAgICB2YXIgaGFzRm9jdXMgPSBjbS5oYXNGb2N1cygpOwogICAgaW5mby53cmFwcGVyLmFwcGVuZENoaWxkKHdyYXApOwogICAgaWYgKGhhc0ZvY3VzKSBjbS5mb2N1cygpOwoKICAgIGNtLl9zZXRTaXplID0gY20uc2V0U2l6ZTsKICAgIGlmIChoZWlnaHQgIT0gbnVsbCkgY20uc2V0U2l6ZSA9IGZ1bmN0aW9uKHdpZHRoLCBuZXdIZWlnaHQpIHsKICAgICAgaWYgKG5ld0hlaWdodCA9PSBudWxsKSByZXR1cm4gdGhpcy5fc2V0U2l6ZSh3aWR0aCwgbmV3SGVpZ2h0KTsKICAgICAgaW5mby5zZXRIZWlnaHQgPSBuZXdIZWlnaHQ7CiAgICAgIGlmICh0eXBlb2YgbmV3SGVpZ2h0ICE9ICJudW1iZXIiKSB7CiAgICAgICAgdmFyIHB4ID0gL14oXGQrXC4/XGQqKXB4JC8uZXhlYyhuZXdIZWlnaHQpOwogICAgICAgIGlmIChweCkgewogICAgICAgICAgbmV3SGVpZ2h0ID0gTnVtYmVyKHB4WzFdKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaW5mby53cmFwcGVyLnN0eWxlLmhlaWdodCA9IG5ld0hlaWdodDsKICAgICAgICAgIG5ld0hlaWdodCA9IGluZm8ud3JhcHBlci5vZmZzZXRIZWlnaHQ7CiAgICAgICAgICBpbmZvLndyYXBwZXIuc3R5bGUuaGVpZ2h0ID0gIiI7CiAgICAgICAgfQogICAgICB9CiAgICAgIGNtLl9zZXRTaXplKHdpZHRoLCBpbmZvLmhlaWdodExlZnQgKz0gKG5ld0hlaWdodCAtIGhlaWdodCkpOwogICAgICBoZWlnaHQgPSBuZXdIZWlnaHQ7CiAgICB9OwogIH0KCiAgZnVuY3Rpb24gcmVtb3ZlUGFuZWxzKGNtKSB7CiAgICB2YXIgaW5mbyA9IGNtLnN0YXRlLnBhbmVsczsKICAgIGNtLnN0YXRlLnBhbmVscyA9IG51bGw7CgogICAgdmFyIHdyYXAgPSBjbS5nZXRXcmFwcGVyRWxlbWVudCgpOwogICAgaW5mby53cmFwcGVyLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKHdyYXAsIGluZm8ud3JhcHBlcik7CiAgICB3cmFwLnN0eWxlLmhlaWdodCA9IGluZm8uc2V0SGVpZ2h0OwogICAgY20uc2V0U2l6ZSA9IGNtLl9zZXRTaXplOwogICAgY20uc2V0U2l6ZSgpOwogIH0KfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/display/placeholder.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICBDb2RlTWlycm9yLmRlZmluZU9wdGlvbigicGxhY2Vob2xkZXIiLCAiIiwgZnVuY3Rpb24oY20sIHZhbCwgb2xkKSB7CiAgICB2YXIgcHJldiA9IG9sZCAmJiBvbGQgIT0gQ29kZU1pcnJvci5Jbml0OwogICAgaWYgKHZhbCAmJiAhcHJldikgewogICAgICBjbS5vbigiYmx1ciIsIG9uQmx1cik7CiAgICAgIGNtLm9uKCJjaGFuZ2UiLCBvbkNoYW5nZSk7CiAgICAgIGNtLm9uKCJzd2FwRG9jIiwgb25DaGFuZ2UpOwogICAgICBvbkNoYW5nZShjbSk7CiAgICB9IGVsc2UgaWYgKCF2YWwgJiYgcHJldikgewogICAgICBjbS5vZmYoImJsdXIiLCBvbkJsdXIpOwogICAgICBjbS5vZmYoImNoYW5nZSIsIG9uQ2hhbmdlKTsKICAgICAgY20ub2ZmKCJzd2FwRG9jIiwgb25DaGFuZ2UpOwogICAgICBjbGVhclBsYWNlaG9sZGVyKGNtKTsKICAgICAgdmFyIHdyYXBwZXIgPSBjbS5nZXRXcmFwcGVyRWxlbWVudCgpOwogICAgICB3cmFwcGVyLmNsYXNzTmFtZSA9IHdyYXBwZXIuY2xhc3NOYW1lLnJlcGxhY2UoIiBDb2RlTWlycm9yLWVtcHR5IiwgIiIpOwogICAgfQoKICAgIGlmICh2YWwgJiYgIWNtLmhhc0ZvY3VzKCkpIG9uQmx1cihjbSk7CiAgfSk7CgogIGZ1bmN0aW9uIGNsZWFyUGxhY2Vob2xkZXIoY20pIHsKICAgIGlmIChjbS5zdGF0ZS5wbGFjZWhvbGRlcikgewogICAgICBjbS5zdGF0ZS5wbGFjZWhvbGRlci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGNtLnN0YXRlLnBsYWNlaG9sZGVyKTsKICAgICAgY20uc3RhdGUucGxhY2Vob2xkZXIgPSBudWxsOwogICAgfQogIH0KICBmdW5jdGlvbiBzZXRQbGFjZWhvbGRlcihjbSkgewogICAgY2xlYXJQbGFjZWhvbGRlcihjbSk7CiAgICB2YXIgZWx0ID0gY20uc3RhdGUucGxhY2Vob2xkZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJwcmUiKTsKICAgIGVsdC5zdHlsZS5jc3NUZXh0ID0gImhlaWdodDogMDsgb3ZlcmZsb3c6IHZpc2libGUiOwogICAgZWx0LmNsYXNzTmFtZSA9ICJDb2RlTWlycm9yLXBsYWNlaG9sZGVyIjsKICAgIHZhciBwbGFjZUhvbGRlciA9IGNtLmdldE9wdGlvbigicGxhY2Vob2xkZXIiKQogICAgaWYgKHR5cGVvZiBwbGFjZUhvbGRlciA9PSAic3RyaW5nIikgcGxhY2VIb2xkZXIgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShwbGFjZUhvbGRlcikKICAgIGVsdC5hcHBlbmRDaGlsZChwbGFjZUhvbGRlcikKICAgIGNtLmRpc3BsYXkubGluZVNwYWNlLmluc2VydEJlZm9yZShlbHQsIGNtLmRpc3BsYXkubGluZVNwYWNlLmZpcnN0Q2hpbGQpOwogIH0KCiAgZnVuY3Rpb24gb25CbHVyKGNtKSB7CiAgICBpZiAoaXNFbXB0eShjbSkpIHNldFBsYWNlaG9sZGVyKGNtKTsKICB9CiAgZnVuY3Rpb24gb25DaGFuZ2UoY20pIHsKICAgIHZhciB3cmFwcGVyID0gY20uZ2V0V3JhcHBlckVsZW1lbnQoKSwgZW1wdHkgPSBpc0VtcHR5KGNtKTsKICAgIHdyYXBwZXIuY2xhc3NOYW1lID0gd3JhcHBlci5jbGFzc05hbWUucmVwbGFjZSgiIENvZGVNaXJyb3ItZW1wdHkiLCAiIikgKyAoZW1wdHkgPyAiIENvZGVNaXJyb3ItZW1wdHkiIDogIiIpOwoKICAgIGlmIChlbXB0eSkgc2V0UGxhY2Vob2xkZXIoY20pOwogICAgZWxzZSBjbGVhclBsYWNlaG9sZGVyKGNtKTsKICB9CgogIGZ1bmN0aW9uIGlzRW1wdHkoY20pIHsKICAgIHJldHVybiAoY20ubGluZUNvdW50KCkgPT09IDEpICYmIChjbS5nZXRMaW5lKDApID09PSAiIik7CiAgfQp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/display/rulers.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CgogIENvZGVNaXJyb3IuZGVmaW5lT3B0aW9uKCJydWxlcnMiLCBmYWxzZSwgZnVuY3Rpb24oY20sIHZhbCkgewogICAgaWYgKGNtLnN0YXRlLnJ1bGVyRGl2KSB7CiAgICAgIGNtLmRpc3BsYXkubGluZVNwYWNlLnJlbW92ZUNoaWxkKGNtLnN0YXRlLnJ1bGVyRGl2KQogICAgICBjbS5zdGF0ZS5ydWxlckRpdiA9IG51bGwKICAgICAgY20ub2ZmKCJyZWZyZXNoIiwgZHJhd1J1bGVycykKICAgIH0KICAgIGlmICh2YWwgJiYgdmFsLmxlbmd0aCkgewogICAgICBjbS5zdGF0ZS5ydWxlckRpdiA9IGNtLmRpc3BsYXkubGluZVNwYWNlLmluc2VydEJlZm9yZShkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSwgY20uZGlzcGxheS5jdXJzb3JEaXYpCiAgICAgIGNtLnN0YXRlLnJ1bGVyRGl2LmNsYXNzTmFtZSA9ICJDb2RlTWlycm9yLXJ1bGVycyIKICAgICAgZHJhd1J1bGVycyhjbSkKICAgICAgY20ub24oInJlZnJlc2giLCBkcmF3UnVsZXJzKQogICAgfQogIH0pOwoKICBmdW5jdGlvbiBkcmF3UnVsZXJzKGNtKSB7CiAgICBjbS5zdGF0ZS5ydWxlckRpdi50ZXh0Q29udGVudCA9ICIiCiAgICB2YXIgdmFsID0gY20uZ2V0T3B0aW9uKCJydWxlcnMiKTsKICAgIHZhciBjdyA9IGNtLmRlZmF1bHRDaGFyV2lkdGgoKTsKICAgIHZhciBsZWZ0ID0gY20uY2hhckNvb3JkcyhDb2RlTWlycm9yLlBvcyhjbS5maXJzdExpbmUoKSwgMCksICJkaXYiKS5sZWZ0OwogICAgY20uc3RhdGUucnVsZXJEaXYuc3R5bGUubWluSGVpZ2h0ID0gKGNtLmRpc3BsYXkuc2Nyb2xsZXIub2Zmc2V0SGVpZ2h0ICsgMzApICsgInB4IjsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBlbHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgICAgZWx0LmNsYXNzTmFtZSA9ICJDb2RlTWlycm9yLXJ1bGVyIjsKICAgICAgdmFyIGNvbCwgY29uZiA9IHZhbFtpXTsKICAgICAgaWYgKHR5cGVvZiBjb25mID09ICJudW1iZXIiKSB7CiAgICAgICAgY29sID0gY29uZjsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb2wgPSBjb25mLmNvbHVtbjsKICAgICAgICBpZiAoY29uZi5jbGFzc05hbWUpIGVsdC5jbGFzc05hbWUgKz0gIiAiICsgY29uZi5jbGFzc05hbWU7CiAgICAgICAgaWYgKGNvbmYuY29sb3IpIGVsdC5zdHlsZS5ib3JkZXJDb2xvciA9IGNvbmYuY29sb3I7CiAgICAgICAgaWYgKGNvbmYubGluZVN0eWxlKSBlbHQuc3R5bGUuYm9yZGVyTGVmdFN0eWxlID0gY29uZi5saW5lU3R5bGU7CiAgICAgICAgaWYgKGNvbmYud2lkdGgpIGVsdC5zdHlsZS5ib3JkZXJMZWZ0V2lkdGggPSBjb25mLndpZHRoOwogICAgICB9CiAgICAgIGVsdC5zdHlsZS5sZWZ0ID0gKGxlZnQgKyBjb2wgKiBjdykgKyAicHgiOwogICAgICBjbS5zdGF0ZS5ydWxlckRpdi5hcHBlbmRDaGlsZChlbHQpCiAgICB9CiAgfQp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/edit/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/edit/closebrackets.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICB2YXIgZGVmYXVsdHMgPSB7CiAgICBwYWlyczogIigpW117fScnXCJcIiIsCiAgICB0cmlwbGVzOiAiIiwKICAgIGV4cGxvZGU6ICJbXXt9IgogIH07CgogIHZhciBQb3MgPSBDb2RlTWlycm9yLlBvczsKCiAgQ29kZU1pcnJvci5kZWZpbmVPcHRpb24oImF1dG9DbG9zZUJyYWNrZXRzIiwgZmFsc2UsIGZ1bmN0aW9uKGNtLCB2YWwsIG9sZCkgewogICAgaWYgKG9sZCAmJiBvbGQgIT0gQ29kZU1pcnJvci5Jbml0KSB7CiAgICAgIGNtLnJlbW92ZUtleU1hcChrZXlNYXApOwogICAgICBjbS5zdGF0ZS5jbG9zZUJyYWNrZXRzID0gbnVsbDsKICAgIH0KICAgIGlmICh2YWwpIHsKICAgICAgY20uc3RhdGUuY2xvc2VCcmFja2V0cyA9IHZhbDsKICAgICAgY20uYWRkS2V5TWFwKGtleU1hcCk7CiAgICB9CiAgfSk7CgogIGZ1bmN0aW9uIGdldE9wdGlvbihjb25mLCBuYW1lKSB7CiAgICBpZiAobmFtZSA9PSAicGFpcnMiICYmIHR5cGVvZiBjb25mID09ICJzdHJpbmciKSByZXR1cm4gY29uZjsKICAgIGlmICh0eXBlb2YgY29uZiA9PSAib2JqZWN0IiAmJiBjb25mW25hbWVdICE9IG51bGwpIHJldHVybiBjb25mW25hbWVdOwogICAgcmV0dXJuIGRlZmF1bHRzW25hbWVdOwogIH0KCiAgdmFyIGJpbmQgPSBkZWZhdWx0cy5wYWlycyArICJgIjsKICB2YXIga2V5TWFwID0ge0JhY2tzcGFjZTogaGFuZGxlQmFja3NwYWNlLCBFbnRlcjogaGFuZGxlRW50ZXJ9OwogIGZvciAodmFyIGkgPSAwOyBpIDwgYmluZC5sZW5ndGg7IGkrKykKICAgIGtleU1hcFsiJyIgKyBiaW5kLmNoYXJBdChpKSArICInIl0gPSBoYW5kbGVyKGJpbmQuY2hhckF0KGkpKTsKCiAgZnVuY3Rpb24gaGFuZGxlcihjaCkgewogICAgcmV0dXJuIGZ1bmN0aW9uKGNtKSB7IHJldHVybiBoYW5kbGVDaGFyKGNtLCBjaCk7IH07CiAgfQoKICBmdW5jdGlvbiBnZXRDb25maWcoY20pIHsKICAgIHZhciBkZWZsdCA9IGNtLnN0YXRlLmNsb3NlQnJhY2tldHM7CiAgICBpZiAoIWRlZmx0KSByZXR1cm4gbnVsbDsKICAgIHZhciBtb2RlID0gY20uZ2V0TW9kZUF0KGNtLmdldEN1cnNvcigpKTsKICAgIHJldHVybiBtb2RlLmNsb3NlQnJhY2tldHMgfHwgZGVmbHQ7CiAgfQoKICBmdW5jdGlvbiBoYW5kbGVCYWNrc3BhY2UoY20pIHsKICAgIHZhciBjb25mID0gZ2V0Q29uZmlnKGNtKTsKICAgIGlmICghY29uZiB8fCBjbS5nZXRPcHRpb24oImRpc2FibGVJbnB1dCIpKSByZXR1cm4gQ29kZU1pcnJvci5QYXNzOwoKICAgIHZhciBwYWlycyA9IGdldE9wdGlvbihjb25mLCAicGFpcnMiKTsKICAgIHZhciByYW5nZXMgPSBjbS5saXN0U2VsZWN0aW9ucygpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKCFyYW5nZXNbaV0uZW1wdHkoKSkgcmV0dXJuIENvZGVNaXJyb3IuUGFzczsKICAgICAgdmFyIGFyb3VuZCA9IGNoYXJzQXJvdW5kKGNtLCByYW5nZXNbaV0uaGVhZCk7CiAgICAgIGlmICghYXJvdW5kIHx8IHBhaXJzLmluZGV4T2YoYXJvdW5kKSAlIDIgIT0gMCkgcmV0dXJuIENvZGVNaXJyb3IuUGFzczsKICAgIH0KICAgIGZvciAodmFyIGkgPSByYW5nZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgdmFyIGN1ciA9IHJhbmdlc1tpXS5oZWFkOwogICAgICBjbS5yZXBsYWNlUmFuZ2UoIiIsIFBvcyhjdXIubGluZSwgY3VyLmNoIC0gMSksIFBvcyhjdXIubGluZSwgY3VyLmNoICsgMSksICIrZGVsZXRlIik7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBoYW5kbGVFbnRlcihjbSkgewogICAgdmFyIGNvbmYgPSBnZXRDb25maWcoY20pOwogICAgdmFyIGV4cGxvZGUgPSBjb25mICYmIGdldE9wdGlvbihjb25mLCAiZXhwbG9kZSIpOwogICAgaWYgKCFleHBsb2RlIHx8IGNtLmdldE9wdGlvbigiZGlzYWJsZUlucHV0IikpIHJldHVybiBDb2RlTWlycm9yLlBhc3M7CgogICAgdmFyIHJhbmdlcyA9IGNtLmxpc3RTZWxlY3Rpb25zKCk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJhbmdlcy5sZW5ndGg7IGkrKykgewogICAgICBpZiAoIXJhbmdlc1tpXS5lbXB0eSgpKSByZXR1cm4gQ29kZU1pcnJvci5QYXNzOwogICAgICB2YXIgYXJvdW5kID0gY2hhcnNBcm91bmQoY20sIHJhbmdlc1tpXS5oZWFkKTsKICAgICAgaWYgKCFhcm91bmQgfHwgZXhwbG9kZS5pbmRleE9mKGFyb3VuZCkgJSAyICE9IDApIHJldHVybiBDb2RlTWlycm9yLlBhc3M7CiAgICB9CiAgICBjbS5vcGVyYXRpb24oZnVuY3Rpb24oKSB7CiAgICAgIGNtLnJlcGxhY2VTZWxlY3Rpb24oIlxuXG4iLCBudWxsKTsKICAgICAgY20uZXhlY0NvbW1hbmQoImdvQ2hhckxlZnQiKTsKICAgICAgcmFuZ2VzID0gY20ubGlzdFNlbGVjdGlvbnMoKTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICB2YXIgbGluZSA9IHJhbmdlc1tpXS5oZWFkLmxpbmU7CiAgICAgICAgY20uaW5kZW50TGluZShsaW5lLCBudWxsLCB0cnVlKTsKICAgICAgICBjbS5pbmRlbnRMaW5lKGxpbmUgKyAxLCBudWxsLCB0cnVlKTsKICAgICAgfQogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBjb250cmFjdFNlbGVjdGlvbihzZWwpIHsKICAgIHZhciBpbnZlcnRlZCA9IENvZGVNaXJyb3IuY21wUG9zKHNlbC5hbmNob3IsIHNlbC5oZWFkKSA+IDA7CiAgICByZXR1cm4ge2FuY2hvcjogbmV3IFBvcyhzZWwuYW5jaG9yLmxpbmUsIHNlbC5hbmNob3IuY2ggKyAoaW52ZXJ0ZWQgPyAtMSA6IDEpKSwKICAgICAgICAgICAgaGVhZDogbmV3IFBvcyhzZWwuaGVhZC5saW5lLCBzZWwuaGVhZC5jaCArIChpbnZlcnRlZCA/IDEgOiAtMSkpfTsKICB9CgogIGZ1bmN0aW9uIGhhbmRsZUNoYXIoY20sIGNoKSB7CiAgICB2YXIgY29uZiA9IGdldENvbmZpZyhjbSk7CiAgICBpZiAoIWNvbmYgfHwgY20uZ2V0T3B0aW9uKCJkaXNhYmxlSW5wdXQiKSkgcmV0dXJuIENvZGVNaXJyb3IuUGFzczsKCiAgICB2YXIgcGFpcnMgPSBnZXRPcHRpb24oY29uZiwgInBhaXJzIik7CiAgICB2YXIgcG9zID0gcGFpcnMuaW5kZXhPZihjaCk7CiAgICBpZiAocG9zID09IC0xKSByZXR1cm4gQ29kZU1pcnJvci5QYXNzOwogICAgdmFyIHRyaXBsZXMgPSBnZXRPcHRpb24oY29uZiwgInRyaXBsZXMiKTsKCiAgICB2YXIgaWRlbnRpY2FsID0gcGFpcnMuY2hhckF0KHBvcyArIDEpID09IGNoOwogICAgdmFyIHJhbmdlcyA9IGNtLmxpc3RTZWxlY3Rpb25zKCk7CiAgICB2YXIgb3BlbmluZyA9IHBvcyAlIDIgPT0gMDsKCiAgICB2YXIgdHlwZTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciByYW5nZSA9IHJhbmdlc1tpXSwgY3VyID0gcmFuZ2UuaGVhZCwgY3VyVHlwZTsKICAgICAgdmFyIG5leHQgPSBjbS5nZXRSYW5nZShjdXIsIFBvcyhjdXIubGluZSwgY3VyLmNoICsgMSkpOwogICAgICBpZiAob3BlbmluZyAmJiAhcmFuZ2UuZW1wdHkoKSkgewogICAgICAgIGN1clR5cGUgPSAic3Vycm91bmQiOwogICAgICB9IGVsc2UgaWYgKChpZGVudGljYWwgfHwgIW9wZW5pbmcpICYmIG5leHQgPT0gY2gpIHsKICAgICAgICBpZiAoaWRlbnRpY2FsICYmIHN0cmluZ1N0YXJ0c0FmdGVyKGNtLCBjdXIpKQogICAgICAgICAgY3VyVHlwZSA9ICJib3RoIjsKICAgICAgICBlbHNlIGlmICh0cmlwbGVzLmluZGV4T2YoY2gpID49IDAgJiYgY20uZ2V0UmFuZ2UoY3VyLCBQb3MoY3VyLmxpbmUsIGN1ci5jaCArIDMpKSA9PSBjaCArIGNoICsgY2gpCiAgICAgICAgICBjdXJUeXBlID0gInNraXBUaHJlZSI7CiAgICAgICAgZWxzZQogICAgICAgICAgY3VyVHlwZSA9ICJza2lwIjsKICAgICAgfSBlbHNlIGlmIChpZGVudGljYWwgJiYgY3VyLmNoID4gMSAmJiB0cmlwbGVzLmluZGV4T2YoY2gpID49IDAgJiYKICAgICAgICAgICAgICAgICBjbS5nZXRSYW5nZShQb3MoY3VyLmxpbmUsIGN1ci5jaCAtIDIpLCBjdXIpID09IGNoICsgY2ggJiYKICAgICAgICAgICAgICAgICAoY3VyLmNoIDw9IDIgfHwgY20uZ2V0UmFuZ2UoUG9zKGN1ci5saW5lLCBjdXIuY2ggLSAzKSwgUG9zKGN1ci5saW5lLCBjdXIuY2ggLSAyKSkgIT0gY2gpKSB7CiAgICAgICAgY3VyVHlwZSA9ICJhZGRGb3VyIjsKICAgICAgfSBlbHNlIGlmIChpZGVudGljYWwpIHsKICAgICAgICBpZiAoIUNvZGVNaXJyb3IuaXNXb3JkQ2hhcihuZXh0KSAmJiBlbnRlcmluZ1N0cmluZyhjbSwgY3VyLCBjaCkpIGN1clR5cGUgPSAiYm90aCI7CiAgICAgICAgZWxzZSByZXR1cm4gQ29kZU1pcnJvci5QYXNzOwogICAgICB9IGVsc2UgaWYgKG9wZW5pbmcgJiYgKGNtLmdldExpbmUoY3VyLmxpbmUpLmxlbmd0aCA9PSBjdXIuY2ggfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0Nsb3NpbmdCcmFja2V0KG5leHQsIHBhaXJzKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC9ccy8udGVzdChuZXh0KSkpIHsKICAgICAgICBjdXJUeXBlID0gImJvdGgiOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBDb2RlTWlycm9yLlBhc3M7CiAgICAgIH0KICAgICAgaWYgKCF0eXBlKSB0eXBlID0gY3VyVHlwZTsKICAgICAgZWxzZSBpZiAodHlwZSAhPSBjdXJUeXBlKSByZXR1cm4gQ29kZU1pcnJvci5QYXNzOwogICAgfQoKICAgIHZhciBsZWZ0ID0gcG9zICUgMiA/IHBhaXJzLmNoYXJBdChwb3MgLSAxKSA6IGNoOwogICAgdmFyIHJpZ2h0ID0gcG9zICUgMiA/IGNoIDogcGFpcnMuY2hhckF0KHBvcyArIDEpOwogICAgY20ub3BlcmF0aW9uKGZ1bmN0aW9uKCkgewogICAgICBpZiAodHlwZSA9PSAic2tpcCIpIHsKICAgICAgICBjbS5leGVjQ29tbWFuZCgiZ29DaGFyUmlnaHQiKTsKICAgICAgfSBlbHNlIGlmICh0eXBlID09ICJza2lwVGhyZWUiKSB7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCAzOyBpKyspCiAgICAgICAgICBjbS5leGVjQ29tbWFuZCgiZ29DaGFyUmlnaHQiKTsKICAgICAgfSBlbHNlIGlmICh0eXBlID09ICJzdXJyb3VuZCIpIHsKICAgICAgICB2YXIgc2VscyA9IGNtLmdldFNlbGVjdGlvbnMoKTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbHMubGVuZ3RoOyBpKyspCiAgICAgICAgICBzZWxzW2ldID0gbGVmdCArIHNlbHNbaV0gKyByaWdodDsKICAgICAgICBjbS5yZXBsYWNlU2VsZWN0aW9ucyhzZWxzLCAiYXJvdW5kIik7CiAgICAgICAgc2VscyA9IGNtLmxpc3RTZWxlY3Rpb25zKCkuc2xpY2UoKTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbHMubGVuZ3RoOyBpKyspCiAgICAgICAgICBzZWxzW2ldID0gY29udHJhY3RTZWxlY3Rpb24oc2Vsc1tpXSk7CiAgICAgICAgY20uc2V0U2VsZWN0aW9ucyhzZWxzKTsKICAgICAgfSBlbHNlIGlmICh0eXBlID09ICJib3RoIikgewogICAgICAgIGNtLnJlcGxhY2VTZWxlY3Rpb24obGVmdCArIHJpZ2h0LCBudWxsKTsKICAgICAgICBjbS50cmlnZ2VyRWxlY3RyaWMobGVmdCArIHJpZ2h0KTsKICAgICAgICBjbS5leGVjQ29tbWFuZCgiZ29DaGFyTGVmdCIpOwogICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gImFkZEZvdXIiKSB7CiAgICAgICAgY20ucmVwbGFjZVNlbGVjdGlvbihsZWZ0ICsgbGVmdCArIGxlZnQgKyBsZWZ0LCAiYmVmb3JlIik7CiAgICAgICAgY20uZXhlY0NvbW1hbmQoImdvQ2hhclJpZ2h0Iik7CiAgICAgIH0KICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gaXNDbG9zaW5nQnJhY2tldChjaCwgcGFpcnMpIHsKICAgIHZhciBwb3MgPSBwYWlycy5sYXN0SW5kZXhPZihjaCk7CiAgICByZXR1cm4gcG9zID4gLTEgJiYgcG9zICUgMiA9PSAxOwogIH0KCiAgZnVuY3Rpb24gY2hhcnNBcm91bmQoY20sIHBvcykgewogICAgdmFyIHN0ciA9IGNtLmdldFJhbmdlKFBvcyhwb3MubGluZSwgcG9zLmNoIC0gMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zKHBvcy5saW5lLCBwb3MuY2ggKyAxKSk7CiAgICByZXR1cm4gc3RyLmxlbmd0aCA9PSAyID8gc3RyIDogbnVsbDsKICB9CgogIC8vIFByb2plY3QgdGhlIHRva2VuIHR5cGUgdGhhdCB3aWxsIGV4aXN0cyBhZnRlciB0aGUgZ2l2ZW4gY2hhciBpcwogIC8vIHR5cGVkLCBhbmQgdXNlIGl0IHRvIGRldGVybWluZSB3aGV0aGVyIGl0IHdvdWxkIGNhdXNlIHRoZSBzdGFydAogIC8vIG9mIGEgc3RyaW5nIHRva2VuLgogIGZ1bmN0aW9uIGVudGVyaW5nU3RyaW5nKGNtLCBwb3MsIGNoKSB7CiAgICB2YXIgbGluZSA9IGNtLmdldExpbmUocG9zLmxpbmUpOwogICAgdmFyIHRva2VuID0gY20uZ2V0VG9rZW5BdChwb3MpOwogICAgaWYgKC9cYnN0cmluZzI/XGIvLnRlc3QodG9rZW4udHlwZSkpIHJldHVybiBmYWxzZTsKICAgIHZhciBzdHJlYW0gPSBuZXcgQ29kZU1pcnJvci5TdHJpbmdTdHJlYW0obGluZS5zbGljZSgwLCBwb3MuY2gpICsgY2ggKyBsaW5lLnNsaWNlKHBvcy5jaCksIDQpOwogICAgc3RyZWFtLnBvcyA9IHN0cmVhbS5zdGFydCA9IHRva2VuLnN0YXJ0OwogICAgZm9yICg7OykgewogICAgICB2YXIgdHlwZTEgPSBjbS5nZXRNb2RlKCkudG9rZW4oc3RyZWFtLCB0b2tlbi5zdGF0ZSk7CiAgICAgIGlmIChzdHJlYW0ucG9zID49IHBvcy5jaCArIDEpIHJldHVybiAvXGJzdHJpbmcyP1xiLy50ZXN0KHR5cGUxKTsKICAgICAgc3RyZWFtLnN0YXJ0ID0gc3RyZWFtLnBvczsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHN0cmluZ1N0YXJ0c0FmdGVyKGNtLCBwb3MpIHsKICAgIHZhciB0b2tlbiA9IGNtLmdldFRva2VuQXQoUG9zKHBvcy5saW5lLCBwb3MuY2ggKyAxKSkKICAgIHJldHVybiAvXGJzdHJpbmcvLnRlc3QodG9rZW4udHlwZSkgJiYgdG9rZW4uc3RhcnQgPT0gcG9zLmNoCiAgfQp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/edit/closetag.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovKioKICogVGFnLWNsb3NlciBleHRlbnNpb24gZm9yIENvZGVNaXJyb3IuCiAqCiAqIFRoaXMgZXh0ZW5zaW9uIGFkZHMgYW4gImF1dG9DbG9zZVRhZ3MiIG9wdGlvbiB0aGF0IGNhbiBiZSBzZXQgdG8KICogZWl0aGVyIHRydWUgdG8gZ2V0IHRoZSBkZWZhdWx0IGJlaGF2aW9yLCBvciBhbiBvYmplY3QgdG8gZnVydGhlcgogKiBjb25maWd1cmUgaXRzIGJlaGF2aW9yLgogKgogKiBUaGVzZSBhcmUgc3VwcG9ydGVkIG9wdGlvbnM6CiAqCiAqIGB3aGVuQ2xvc2luZ2AgKGRlZmF1bHQgdHJ1ZSkKICogICBXaGV0aGVyIHRvIGF1dG9jbG9zZSB3aGVuIHRoZSAnLycgb2YgYSBjbG9zaW5nIHRhZyBpcyB0eXBlZC4KICogYHdoZW5PcGVuaW5nYCAoZGVmYXVsdCB0cnVlKQogKiAgIFdoZXRoZXIgdG8gYXV0b2Nsb3NlIHRoZSB0YWcgd2hlbiB0aGUgZmluYWwgJz4nIG9mIGFuIG9wZW5pbmcKICogICB0YWcgaXMgdHlwZWQuCiAqIGBkb250Q2xvc2VUYWdzYCAoZGVmYXVsdCBpcyBlbXB0eSB0YWdzIGZvciBIVE1MLCBub25lIGZvciBYTUwpCiAqICAgQW4gYXJyYXkgb2YgdGFnIG5hbWVzIHRoYXQgc2hvdWxkIG5vdCBiZSBhdXRvY2xvc2VkLgogKiBgaW5kZW50VGFnc2AgKGRlZmF1bHQgaXMgYmxvY2sgdGFncyBmb3IgSFRNTCwgbm9uZSBmb3IgWE1MKQogKiAgIEFuIGFycmF5IG9mIHRhZyBuYW1lcyB0aGF0IHNob3VsZCwgd2hlbiBvcGVuZWQsIGNhdXNlIGEKICogICBibGFuayBsaW5lIHRvIGJlIGFkZGVkIGluc2lkZSB0aGUgdGFnLCBhbmQgdGhlIGJsYW5rIGxpbmUgYW5kCiAqICAgY2xvc2luZyBsaW5lIHRvIGJlIGluZGVudGVkLgogKgogKiBTZWUgZGVtb3MvY2xvc2V0YWcuaHRtbCBmb3IgYSB1c2FnZSBleGFtcGxlLgogKi8KCihmdW5jdGlvbihtb2QpIHsKICBpZiAodHlwZW9mIGV4cG9ydHMgPT0gIm9iamVjdCIgJiYgdHlwZW9mIG1vZHVsZSA9PSAib2JqZWN0IikgLy8gQ29tbW9uSlMKICAgIG1vZChyZXF1aXJlKCIuLi8uLi9saWIvY29kZW1pcnJvciIpLCByZXF1aXJlKCIuLi9mb2xkL3htbC1mb2xkIikpOwogIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kKSAvLyBBTUQKICAgIGRlZmluZShbIi4uLy4uL2xpYi9jb2RlbWlycm9yIiwgIi4uL2ZvbGQveG1sLWZvbGQiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICBDb2RlTWlycm9yLmRlZmluZU9wdGlvbigiYXV0b0Nsb3NlVGFncyIsIGZhbHNlLCBmdW5jdGlvbihjbSwgdmFsLCBvbGQpIHsKICAgIGlmIChvbGQgIT0gQ29kZU1pcnJvci5Jbml0ICYmIG9sZCkKICAgICAgY20ucmVtb3ZlS2V5TWFwKCJhdXRvQ2xvc2VUYWdzIik7CiAgICBpZiAoIXZhbCkgcmV0dXJuOwogICAgdmFyIG1hcCA9IHtuYW1lOiAiYXV0b0Nsb3NlVGFncyJ9OwogICAgaWYgKHR5cGVvZiB2YWwgIT0gIm9iamVjdCIgfHwgdmFsLndoZW5DbG9zaW5nKQogICAgICBtYXBbIicvJyJdID0gZnVuY3Rpb24oY20pIHsgcmV0dXJuIGF1dG9DbG9zZVNsYXNoKGNtKTsgfTsKICAgIGlmICh0eXBlb2YgdmFsICE9ICJvYmplY3QiIHx8IHZhbC53aGVuT3BlbmluZykKICAgICAgbWFwWyInPiciXSA9IGZ1bmN0aW9uKGNtKSB7IHJldHVybiBhdXRvQ2xvc2VHVChjbSk7IH07CiAgICBjbS5hZGRLZXlNYXAobWFwKTsKICB9KTsKCiAgdmFyIGh0bWxEb250Q2xvc2UgPSBbImFyZWEiLCAiYmFzZSIsICJiciIsICJjb2wiLCAiY29tbWFuZCIsICJlbWJlZCIsICJociIsICJpbWciLCAiaW5wdXQiLCAia2V5Z2VuIiwgImxpbmsiLCAibWV0YSIsICJwYXJhbSIsCiAgICAgICAgICAgICAgICAgICAgICAgInNvdXJjZSIsICJ0cmFjayIsICJ3YnIiXTsKICB2YXIgaHRtbEluZGVudCA9IFsiYXBwbGV0IiwgImJsb2NrcXVvdGUiLCAiYm9keSIsICJidXR0b24iLCAiZGl2IiwgImRsIiwgImZpZWxkc2V0IiwgImZvcm0iLCAiZnJhbWVzZXQiLCAiaDEiLCAiaDIiLCAiaDMiLCAiaDQiLAogICAgICAgICAgICAgICAgICAgICJoNSIsICJoNiIsICJoZWFkIiwgImh0bWwiLCAiaWZyYW1lIiwgImxheWVyIiwgImxlZ2VuZCIsICJvYmplY3QiLCAib2wiLCAicCIsICJzZWxlY3QiLCAidGFibGUiLCAidWwiXTsKCiAgZnVuY3Rpb24gYXV0b0Nsb3NlR1QoY20pIHsKICAgIGlmIChjbS5nZXRPcHRpb24oImRpc2FibGVJbnB1dCIpKSByZXR1cm4gQ29kZU1pcnJvci5QYXNzOwogICAgdmFyIHJhbmdlcyA9IGNtLmxpc3RTZWxlY3Rpb25zKCksIHJlcGxhY2VtZW50cyA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKCFyYW5nZXNbaV0uZW1wdHkoKSkgcmV0dXJuIENvZGVNaXJyb3IuUGFzczsKICAgICAgdmFyIHBvcyA9IHJhbmdlc1tpXS5oZWFkLCB0b2sgPSBjbS5nZXRUb2tlbkF0KHBvcyk7CiAgICAgIHZhciBpbm5lciA9IENvZGVNaXJyb3IuaW5uZXJNb2RlKGNtLmdldE1vZGUoKSwgdG9rLnN0YXRlKSwgc3RhdGUgPSBpbm5lci5zdGF0ZTsKICAgICAgaWYgKGlubmVyLm1vZGUubmFtZSAhPSAieG1sIiB8fCAhc3RhdGUudGFnTmFtZSkgcmV0dXJuIENvZGVNaXJyb3IuUGFzczsKCiAgICAgIHZhciBvcHQgPSBjbS5nZXRPcHRpb24oImF1dG9DbG9zZVRhZ3MiKSwgaHRtbCA9IGlubmVyLm1vZGUuY29uZmlndXJhdGlvbiA9PSAiaHRtbCI7CiAgICAgIHZhciBkb250Q2xvc2VUYWdzID0gKHR5cGVvZiBvcHQgPT0gIm9iamVjdCIgJiYgb3B0LmRvbnRDbG9zZVRhZ3MpIHx8IChodG1sICYmIGh0bWxEb250Q2xvc2UpOwogICAgICB2YXIgaW5kZW50VGFncyA9ICh0eXBlb2Ygb3B0ID09ICJvYmplY3QiICYmIG9wdC5pbmRlbnRUYWdzKSB8fCAoaHRtbCAmJiBodG1sSW5kZW50KTsKCiAgICAgIHZhciB0YWdOYW1lID0gc3RhdGUudGFnTmFtZTsKICAgICAgaWYgKHRvay5lbmQgPiBwb3MuY2gpIHRhZ05hbWUgPSB0YWdOYW1lLnNsaWNlKDAsIHRhZ05hbWUubGVuZ3RoIC0gdG9rLmVuZCArIHBvcy5jaCk7CiAgICAgIHZhciBsb3dlclRhZ05hbWUgPSB0YWdOYW1lLnRvTG93ZXJDYXNlKCk7CiAgICAgIC8vIERvbid0IHByb2Nlc3MgdGhlICc+JyBhdCB0aGUgZW5kIG9mIGFuIGVuZC10YWcgb3Igc2VsZi1jbG9zaW5nIHRhZwogICAgICBpZiAoIXRhZ05hbWUgfHwKICAgICAgICAgIHRvay50eXBlID09ICJzdHJpbmciICYmICh0b2suZW5kICE9IHBvcy5jaCB8fCAhL1tcIlwnXS8udGVzdCh0b2suc3RyaW5nLmNoYXJBdCh0b2suc3RyaW5nLmxlbmd0aCAtIDEpKSB8fCB0b2suc3RyaW5nLmxlbmd0aCA9PSAxKSB8fAogICAgICAgICAgdG9rLnR5cGUgPT0gInRhZyIgJiYgc3RhdGUudHlwZSA9PSAiY2xvc2VUYWciIHx8CiAgICAgICAgICB0b2suc3RyaW5nLmluZGV4T2YoIi8iKSA9PSAodG9rLnN0cmluZy5sZW5ndGggLSAxKSB8fCAvLyBtYXRjaCBzb21ldGhpbmcgbGlrZSA8c29tZVRhZ05hbWUgLz4KICAgICAgICAgIGRvbnRDbG9zZVRhZ3MgJiYgaW5kZXhPZihkb250Q2xvc2VUYWdzLCBsb3dlclRhZ05hbWUpID4gLTEgfHwKICAgICAgICAgIGNsb3NpbmdUYWdFeGlzdHMoY20sIHRhZ05hbWUsIHBvcywgc3RhdGUsIHRydWUpKQogICAgICAgIHJldHVybiBDb2RlTWlycm9yLlBhc3M7CgogICAgICB2YXIgaW5kZW50ID0gaW5kZW50VGFncyAmJiBpbmRleE9mKGluZGVudFRhZ3MsIGxvd2VyVGFnTmFtZSkgPiAtMTsKICAgICAgcmVwbGFjZW1lbnRzW2ldID0ge2luZGVudDogaW5kZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogIj4iICsgKGluZGVudCA/ICJcblxuIiA6ICIiKSArICI8LyIgKyB0YWdOYW1lICsgIj4iLAogICAgICAgICAgICAgICAgICAgICAgICAgbmV3UG9zOiBpbmRlbnQgPyBDb2RlTWlycm9yLlBvcyhwb3MubGluZSArIDEsIDApIDogQ29kZU1pcnJvci5Qb3MocG9zLmxpbmUsIHBvcy5jaCArIDEpfTsKICAgIH0KCiAgICBmb3IgKHZhciBpID0gcmFuZ2VzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgIHZhciBpbmZvID0gcmVwbGFjZW1lbnRzW2ldOwogICAgICBjbS5yZXBsYWNlUmFuZ2UoaW5mby50ZXh0LCByYW5nZXNbaV0uaGVhZCwgcmFuZ2VzW2ldLmFuY2hvciwgIitpbnNlcnQiKTsKICAgICAgdmFyIHNlbCA9IGNtLmxpc3RTZWxlY3Rpb25zKCkuc2xpY2UoMCk7CiAgICAgIHNlbFtpXSA9IHtoZWFkOiBpbmZvLm5ld1BvcywgYW5jaG9yOiBpbmZvLm5ld1Bvc307CiAgICAgIGNtLnNldFNlbGVjdGlvbnMoc2VsKTsKICAgICAgaWYgKGluZm8uaW5kZW50KSB7CiAgICAgICAgY20uaW5kZW50TGluZShpbmZvLm5ld1Bvcy5saW5lLCBudWxsLCB0cnVlKTsKICAgICAgICBjbS5pbmRlbnRMaW5lKGluZm8ubmV3UG9zLmxpbmUgKyAxLCBudWxsLCB0cnVlKTsKICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gYXV0b0Nsb3NlQ3VycmVudChjbSwgdHlwaW5nU2xhc2gpIHsKICAgIHZhciByYW5nZXMgPSBjbS5saXN0U2VsZWN0aW9ucygpLCByZXBsYWNlbWVudHMgPSBbXTsKICAgIHZhciBoZWFkID0gdHlwaW5nU2xhc2ggPyAiLyIgOiAiPC8iOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKCFyYW5nZXNbaV0uZW1wdHkoKSkgcmV0dXJuIENvZGVNaXJyb3IuUGFzczsKICAgICAgdmFyIHBvcyA9IHJhbmdlc1tpXS5oZWFkLCB0b2sgPSBjbS5nZXRUb2tlbkF0KHBvcyk7CiAgICAgIHZhciBpbm5lciA9IENvZGVNaXJyb3IuaW5uZXJNb2RlKGNtLmdldE1vZGUoKSwgdG9rLnN0YXRlKSwgc3RhdGUgPSBpbm5lci5zdGF0ZTsKICAgICAgaWYgKHR5cGluZ1NsYXNoICYmICh0b2sudHlwZSA9PSAic3RyaW5nIiB8fCB0b2suc3RyaW5nLmNoYXJBdCgwKSAhPSAiPCIgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICB0b2suc3RhcnQgIT0gcG9zLmNoIC0gMSkpCiAgICAgICAgcmV0dXJuIENvZGVNaXJyb3IuUGFzczsKICAgICAgLy8gS2x1ZGdlIHRvIGdldCBhcm91bmQgdGhlIGZhY3QgdGhhdCB3ZSBhcmUgbm90IGluIFhNTCBtb2RlCiAgICAgIC8vIHdoZW4gY29tcGxldGluZyBpbiBKUy9DU1Mgc25pcHBldCBpbiBodG1sbWl4ZWQgbW9kZS4gRG9lcyBub3QKICAgICAgLy8gd29yayBmb3Igb3RoZXIgWE1MIGVtYmVkZGVkIGxhbmd1YWdlcyAodGhlcmUgaXMgbm8gZ2VuZXJhbAogICAgICAvLyB3YXkgdG8gZ28gZnJvbSBhIG1peGVkIG1vZGUgdG8gaXRzIGN1cnJlbnQgWE1MIHN0YXRlKS4KICAgICAgdmFyIHJlcGxhY2VtZW50OwogICAgICBpZiAoaW5uZXIubW9kZS5uYW1lICE9ICJ4bWwiKSB7CiAgICAgICAgaWYgKGNtLmdldE1vZGUoKS5uYW1lID09ICJodG1sbWl4ZWQiICYmIGlubmVyLm1vZGUubmFtZSA9PSAiamF2YXNjcmlwdCIpCiAgICAgICAgICByZXBsYWNlbWVudCA9IGhlYWQgKyAic2NyaXB0IjsKICAgICAgICBlbHNlIGlmIChjbS5nZXRNb2RlKCkubmFtZSA9PSAiaHRtbG1peGVkIiAmJiBpbm5lci5tb2RlLm5hbWUgPT0gImNzcyIpCiAgICAgICAgICByZXBsYWNlbWVudCA9IGhlYWQgKyAic3R5bGUiOwogICAgICAgIGVsc2UKICAgICAgICAgIHJldHVybiBDb2RlTWlycm9yLlBhc3M7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKCFzdGF0ZS5jb250ZXh0IHx8ICFzdGF0ZS5jb250ZXh0LnRhZ05hbWUgfHwKICAgICAgICAgICAgY2xvc2luZ1RhZ0V4aXN0cyhjbSwgc3RhdGUuY29udGV4dC50YWdOYW1lLCBwb3MsIHN0YXRlKSkKICAgICAgICAgIHJldHVybiBDb2RlTWlycm9yLlBhc3M7CiAgICAgICAgcmVwbGFjZW1lbnQgPSBoZWFkICsgc3RhdGUuY29udGV4dC50YWdOYW1lOwogICAgICB9CiAgICAgIGlmIChjbS5nZXRMaW5lKHBvcy5saW5lKS5jaGFyQXQodG9rLmVuZCkgIT0gIj4iKSByZXBsYWNlbWVudCArPSAiPiI7CiAgICAgIHJlcGxhY2VtZW50c1tpXSA9IHJlcGxhY2VtZW50OwogICAgfQogICAgY20ucmVwbGFjZVNlbGVjdGlvbnMocmVwbGFjZW1lbnRzKTsKICAgIHJhbmdlcyA9IGNtLmxpc3RTZWxlY3Rpb25zKCk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJhbmdlcy5sZW5ndGg7IGkrKykKICAgICAgaWYgKGkgPT0gcmFuZ2VzLmxlbmd0aCAtIDEgfHwgcmFuZ2VzW2ldLmhlYWQubGluZSA8IHJhbmdlc1tpICsgMV0uaGVhZC5saW5lKQogICAgICAgIGNtLmluZGVudExpbmUocmFuZ2VzW2ldLmhlYWQubGluZSk7CiAgfQoKICBmdW5jdGlvbiBhdXRvQ2xvc2VTbGFzaChjbSkgewogICAgaWYgKGNtLmdldE9wdGlvbigiZGlzYWJsZUlucHV0IikpIHJldHVybiBDb2RlTWlycm9yLlBhc3M7CiAgICByZXR1cm4gYXV0b0Nsb3NlQ3VycmVudChjbSwgdHJ1ZSk7CiAgfQoKICBDb2RlTWlycm9yLmNvbW1hbmRzLmNsb3NlVGFnID0gZnVuY3Rpb24oY20pIHsgcmV0dXJuIGF1dG9DbG9zZUN1cnJlbnQoY20pOyB9OwoKICBmdW5jdGlvbiBpbmRleE9mKGNvbGxlY3Rpb24sIGVsdCkgewogICAgaWYgKGNvbGxlY3Rpb24uaW5kZXhPZikgcmV0dXJuIGNvbGxlY3Rpb24uaW5kZXhPZihlbHQpOwogICAgZm9yICh2YXIgaSA9IDAsIGUgPSBjb2xsZWN0aW9uLmxlbmd0aDsgaSA8IGU7ICsraSkKICAgICAgaWYgKGNvbGxlY3Rpb25baV0gPT0gZWx0KSByZXR1cm4gaTsKICAgIHJldHVybiAtMTsKICB9CgogIC8vIElmIHhtbC1mb2xkIGlzIGxvYWRlZCwgd2UgdXNlIGl0cyBmdW5jdGlvbmFsaXR5IHRvIHRyeSBhbmQgdmVyaWZ5CiAgLy8gd2hldGhlciBhIGdpdmVuIHRhZyBpcyBhY3R1YWxseSB1bmNsb3NlZC4KICBmdW5jdGlvbiBjbG9zaW5nVGFnRXhpc3RzKGNtLCB0YWdOYW1lLCBwb3MsIHN0YXRlLCBuZXdUYWcpIHsKICAgIGlmICghQ29kZU1pcnJvci5zY2FuRm9yQ2xvc2luZ1RhZykgcmV0dXJuIGZhbHNlOwogICAgdmFyIGVuZCA9IE1hdGgubWluKGNtLmxhc3RMaW5lKCkgKyAxLCBwb3MubGluZSArIDUwMCk7CiAgICB2YXIgbmV4dENsb3NlID0gQ29kZU1pcnJvci5zY2FuRm9yQ2xvc2luZ1RhZyhjbSwgcG9zLCBudWxsLCBlbmQpOwogICAgaWYgKCFuZXh0Q2xvc2UgfHwgbmV4dENsb3NlLnRhZyAhPSB0YWdOYW1lKSByZXR1cm4gZmFsc2U7CiAgICB2YXIgY3ggPSBzdGF0ZS5jb250ZXh0OwogICAgLy8gSWYgdGhlIGltbWVkaWF0ZSB3cmFwcGluZyBjb250ZXh0IGNvbnRhaW5zIG9uQ3ggaW5zdGFuY2VzIG9mCiAgICAvLyB0aGUgc2FtZSB0YWcsIGEgY2xvc2luZyB0YWcgb25seSBleGlzdHMgaWYgdGhlcmUgYXJlIGF0IGxlYXN0CiAgICAvLyB0aGF0IG1hbnkgY2xvc2luZyB0YWdzIG9mIHRoYXQgdHlwZSBmb2xsb3dpbmcuCiAgICBmb3IgKHZhciBvbkN4ID0gbmV3VGFnID8gMSA6IDA7IGN4ICYmIGN4LnRhZ05hbWUgPT0gdGFnTmFtZTsgY3ggPSBjeC5wcmV2KSArK29uQ3g7CiAgICBwb3MgPSBuZXh0Q2xvc2UudG87CiAgICBmb3IgKHZhciBpID0gMTsgaSA8IG9uQ3g7IGkrKykgewogICAgICB2YXIgbmV4dCA9IENvZGVNaXJyb3Iuc2NhbkZvckNsb3NpbmdUYWcoY20sIHBvcywgbnVsbCwgZW5kKTsKICAgICAgaWYgKCFuZXh0IHx8IG5leHQudGFnICE9IHRhZ05hbWUpIHJldHVybiBmYWxzZTsKICAgICAgcG9zID0gbmV4dC50bzsKICAgIH0KICAgIHJldHVybiB0cnVlOwogIH0KfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/edit/continuelist.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CgogIHZhciBsaXN0UkUgPSAvXihccyopKD5bPiBdKnwtIFxbW3ggXVxdXHN8WyorLV1cc3woXGQrKShbLildKSkoXHMqKS8sCiAgICAgIGVtcHR5TGlzdFJFID0gL14oXHMqKSg+Wz4gXSp8LSBcW1t4IF1cXXxbKistXXwoXGQrKVsuKV0pKFxzKikkLywKICAgICAgdW5vcmRlcmVkTGlzdFJFID0gL1sqKy1dXHMvOwoKICBDb2RlTWlycm9yLmNvbW1hbmRzLm5ld2xpbmVBbmRJbmRlbnRDb250aW51ZU1hcmtkb3duTGlzdCA9IGZ1bmN0aW9uKGNtKSB7CiAgICBpZiAoY20uZ2V0T3B0aW9uKCJkaXNhYmxlSW5wdXQiKSkgcmV0dXJuIENvZGVNaXJyb3IuUGFzczsKICAgIHZhciByYW5nZXMgPSBjbS5saXN0U2VsZWN0aW9ucygpLCByZXBsYWNlbWVudHMgPSBbXTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBwb3MgPSByYW5nZXNbaV0uaGVhZDsKICAgICAgdmFyIGVvbFN0YXRlID0gY20uZ2V0U3RhdGVBZnRlcihwb3MubGluZSk7CiAgICAgIHZhciBpbkxpc3QgPSBlb2xTdGF0ZS5saXN0ICE9PSBmYWxzZTsKICAgICAgdmFyIGluUXVvdGUgPSBlb2xTdGF0ZS5xdW90ZSAhPT0gMDsKCiAgICAgIHZhciBsaW5lID0gY20uZ2V0TGluZShwb3MubGluZSksIG1hdGNoID0gbGlzdFJFLmV4ZWMobGluZSk7CiAgICAgIGlmICghcmFuZ2VzW2ldLmVtcHR5KCkgfHwgKCFpbkxpc3QgJiYgIWluUXVvdGUpIHx8ICFtYXRjaCkgewogICAgICAgIGNtLmV4ZWNDb21tYW5kKCJuZXdsaW5lQW5kSW5kZW50Iik7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmIChlbXB0eUxpc3RSRS50ZXN0KGxpbmUpKSB7CiAgICAgICAgY20ucmVwbGFjZVJhbmdlKCIiLCB7CiAgICAgICAgICBsaW5lOiBwb3MubGluZSwgY2g6IDAKICAgICAgICB9LCB7CiAgICAgICAgICBsaW5lOiBwb3MubGluZSwgY2g6IHBvcy5jaCArIDEKICAgICAgICB9KTsKICAgICAgICByZXBsYWNlbWVudHNbaV0gPSAiXG4iOwogICAgICB9IGVsc2UgewogICAgICAgIHZhciBpbmRlbnQgPSBtYXRjaFsxXSwgYWZ0ZXIgPSBtYXRjaFs1XTsKICAgICAgICB2YXIgYnVsbGV0ID0gdW5vcmRlcmVkTGlzdFJFLnRlc3QobWF0Y2hbMl0pIHx8IG1hdGNoWzJdLmluZGV4T2YoIj4iKSA+PSAwCiAgICAgICAgICA/IG1hdGNoWzJdLnJlcGxhY2UoIngiLCAiICIpCiAgICAgICAgICA6IChwYXJzZUludChtYXRjaFszXSwgMTApICsgMSkgKyBtYXRjaFs0XTsKCiAgICAgICAgcmVwbGFjZW1lbnRzW2ldID0gIlxuIiArIGluZGVudCArIGJ1bGxldCArIGFmdGVyOwogICAgICB9CiAgICB9CgogICAgY20ucmVwbGFjZVNlbGVjdGlvbnMocmVwbGFjZW1lbnRzKTsKICB9Owp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/edit/matchbrackets.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICB2YXIgaWVfbHQ4ID0gL01TSUUgXGQvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkgJiYKICAgIChkb2N1bWVudC5kb2N1bWVudE1vZGUgPT0gbnVsbCB8fCBkb2N1bWVudC5kb2N1bWVudE1vZGUgPCA4KTsKCiAgdmFyIFBvcyA9IENvZGVNaXJyb3IuUG9zOwoKICB2YXIgbWF0Y2hpbmcgPSB7IigiOiAiKT4iLCAiKSI6ICIoPCIsICJbIjogIl0+IiwgIl0iOiAiWzwiLCAieyI6ICJ9PiIsICJ9IjogIns8In07CgogIGZ1bmN0aW9uIGZpbmRNYXRjaGluZ0JyYWNrZXQoY20sIHdoZXJlLCBzdHJpY3QsIGNvbmZpZykgewogICAgdmFyIGxpbmUgPSBjbS5nZXRMaW5lSGFuZGxlKHdoZXJlLmxpbmUpLCBwb3MgPSB3aGVyZS5jaCAtIDE7CiAgICB2YXIgbWF0Y2ggPSAocG9zID49IDAgJiYgbWF0Y2hpbmdbbGluZS50ZXh0LmNoYXJBdChwb3MpXSkgfHwgbWF0Y2hpbmdbbGluZS50ZXh0LmNoYXJBdCgrK3BvcyldOwogICAgaWYgKCFtYXRjaCkgcmV0dXJuIG51bGw7CiAgICB2YXIgZGlyID0gbWF0Y2guY2hhckF0KDEpID09ICI+IiA/IDEgOiAtMTsKICAgIGlmIChzdHJpY3QgJiYgKGRpciA+IDApICE9IChwb3MgPT0gd2hlcmUuY2gpKSByZXR1cm4gbnVsbDsKICAgIHZhciBzdHlsZSA9IGNtLmdldFRva2VuVHlwZUF0KFBvcyh3aGVyZS5saW5lLCBwb3MgKyAxKSk7CgogICAgdmFyIGZvdW5kID0gc2NhbkZvckJyYWNrZXQoY20sIFBvcyh3aGVyZS5saW5lLCBwb3MgKyAoZGlyID4gMCA/IDEgOiAwKSksIGRpciwgc3R5bGUgfHwgbnVsbCwgY29uZmlnKTsKICAgIGlmIChmb3VuZCA9PSBudWxsKSByZXR1cm4gbnVsbDsKICAgIHJldHVybiB7ZnJvbTogUG9zKHdoZXJlLmxpbmUsIHBvcyksIHRvOiBmb3VuZCAmJiBmb3VuZC5wb3MsCiAgICAgICAgICAgIG1hdGNoOiBmb3VuZCAmJiBmb3VuZC5jaCA9PSBtYXRjaC5jaGFyQXQoMCksIGZvcndhcmQ6IGRpciA+IDB9OwogIH0KCiAgLy8gYnJhY2tldFJlZ2V4IGlzIHVzZWQgdG8gc3BlY2lmeSB3aGljaCB0eXBlIG9mIGJyYWNrZXQgdG8gc2NhbgogIC8vIHNob3VsZCBiZSBhIHJlZ2V4cCwgZS5nLiAvW1tcXV0vCiAgLy8KICAvLyBOb3RlOiBJZiAid2hlcmUiIGlzIG9uIGFuIG9wZW4gYnJhY2tldCwgdGhlbiB0aGlzIGJyYWNrZXQgaXMgaWdub3JlZC4KICAvLwogIC8vIFJldHVybnMgZmFsc2Ugd2hlbiBubyBicmFja2V0IHdhcyBmb3VuZCwgbnVsbCB3aGVuIGl0IHJlYWNoZWQKICAvLyBtYXhTY2FuTGluZXMgYW5kIGdhdmUgdXAKICBmdW5jdGlvbiBzY2FuRm9yQnJhY2tldChjbSwgd2hlcmUsIGRpciwgc3R5bGUsIGNvbmZpZykgewogICAgdmFyIG1heFNjYW5MZW4gPSAoY29uZmlnICYmIGNvbmZpZy5tYXhTY2FuTGluZUxlbmd0aCkgfHwgMTAwMDA7CiAgICB2YXIgbWF4U2NhbkxpbmVzID0gKGNvbmZpZyAmJiBjb25maWcubWF4U2NhbkxpbmVzKSB8fCAxMDAwOwoKICAgIHZhciBzdGFjayA9IFtdOwogICAgdmFyIHJlID0gY29uZmlnICYmIGNvbmZpZy5icmFja2V0UmVnZXggPyBjb25maWcuYnJhY2tldFJlZ2V4IDogL1soKXt9W1xdXS87CiAgICB2YXIgbGluZUVuZCA9IGRpciA+IDAgPyBNYXRoLm1pbih3aGVyZS5saW5lICsgbWF4U2NhbkxpbmVzLCBjbS5sYXN0TGluZSgpICsgMSkKICAgICAgICAgICAgICAgICAgICAgICAgICA6IE1hdGgubWF4KGNtLmZpcnN0TGluZSgpIC0gMSwgd2hlcmUubGluZSAtIG1heFNjYW5MaW5lcyk7CiAgICBmb3IgKHZhciBsaW5lTm8gPSB3aGVyZS5saW5lOyBsaW5lTm8gIT0gbGluZUVuZDsgbGluZU5vICs9IGRpcikgewogICAgICB2YXIgbGluZSA9IGNtLmdldExpbmUobGluZU5vKTsKICAgICAgaWYgKCFsaW5lKSBjb250aW51ZTsKICAgICAgdmFyIHBvcyA9IGRpciA+IDAgPyAwIDogbGluZS5sZW5ndGggLSAxLCBlbmQgPSBkaXIgPiAwID8gbGluZS5sZW5ndGggOiAtMTsKICAgICAgaWYgKGxpbmUubGVuZ3RoID4gbWF4U2NhbkxlbikgY29udGludWU7CiAgICAgIGlmIChsaW5lTm8gPT0gd2hlcmUubGluZSkgcG9zID0gd2hlcmUuY2ggLSAoZGlyIDwgMCA/IDEgOiAwKTsKICAgICAgZm9yICg7IHBvcyAhPSBlbmQ7IHBvcyArPSBkaXIpIHsKICAgICAgICB2YXIgY2ggPSBsaW5lLmNoYXJBdChwb3MpOwogICAgICAgIGlmIChyZS50ZXN0KGNoKSAmJiAoc3R5bGUgPT09IHVuZGVmaW5lZCB8fCBjbS5nZXRUb2tlblR5cGVBdChQb3MobGluZU5vLCBwb3MgKyAxKSkgPT0gc3R5bGUpKSB7CiAgICAgICAgICB2YXIgbWF0Y2ggPSBtYXRjaGluZ1tjaF07CiAgICAgICAgICBpZiAoKG1hdGNoLmNoYXJBdCgxKSA9PSAiPiIpID09IChkaXIgPiAwKSkgc3RhY2sucHVzaChjaCk7CiAgICAgICAgICBlbHNlIGlmICghc3RhY2subGVuZ3RoKSByZXR1cm4ge3BvczogUG9zKGxpbmVObywgcG9zKSwgY2g6IGNofTsKICAgICAgICAgIGVsc2Ugc3RhY2sucG9wKCk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gbGluZU5vIC0gZGlyID09IChkaXIgPiAwID8gY20ubGFzdExpbmUoKSA6IGNtLmZpcnN0TGluZSgpKSA/IGZhbHNlIDogbnVsbDsKICB9CgogIGZ1bmN0aW9uIG1hdGNoQnJhY2tldHMoY20sIGF1dG9jbGVhciwgY29uZmlnKSB7CiAgICAvLyBEaXNhYmxlIGJyYWNlIG1hdGNoaW5nIGluIGxvbmcgbGluZXMsIHNpbmNlIGl0J2xsIGNhdXNlIGh1Z2VseSBzbG93IHVwZGF0ZXMKICAgIHZhciBtYXhIaWdobGlnaHRMZW4gPSBjbS5zdGF0ZS5tYXRjaEJyYWNrZXRzLm1heEhpZ2hsaWdodExpbmVMZW5ndGggfHwgMTAwMDsKICAgIHZhciBtYXJrcyA9IFtdLCByYW5nZXMgPSBjbS5saXN0U2VsZWN0aW9ucygpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIG1hdGNoID0gcmFuZ2VzW2ldLmVtcHR5KCkgJiYgZmluZE1hdGNoaW5nQnJhY2tldChjbSwgcmFuZ2VzW2ldLmhlYWQsIGZhbHNlLCBjb25maWcpOwogICAgICBpZiAobWF0Y2ggJiYgY20uZ2V0TGluZShtYXRjaC5mcm9tLmxpbmUpLmxlbmd0aCA8PSBtYXhIaWdobGlnaHRMZW4pIHsKICAgICAgICB2YXIgc3R5bGUgPSBtYXRjaC5tYXRjaCA/ICJDb2RlTWlycm9yLW1hdGNoaW5nYnJhY2tldCIgOiAiQ29kZU1pcnJvci1ub25tYXRjaGluZ2JyYWNrZXQiOwogICAgICAgIG1hcmtzLnB1c2goY20ubWFya1RleHQobWF0Y2guZnJvbSwgUG9zKG1hdGNoLmZyb20ubGluZSwgbWF0Y2guZnJvbS5jaCArIDEpLCB7Y2xhc3NOYW1lOiBzdHlsZX0pKTsKICAgICAgICBpZiAobWF0Y2gudG8gJiYgY20uZ2V0TGluZShtYXRjaC50by5saW5lKS5sZW5ndGggPD0gbWF4SGlnaGxpZ2h0TGVuKQogICAgICAgICAgbWFya3MucHVzaChjbS5tYXJrVGV4dChtYXRjaC50bywgUG9zKG1hdGNoLnRvLmxpbmUsIG1hdGNoLnRvLmNoICsgMSksIHtjbGFzc05hbWU6IHN0eWxlfSkpOwogICAgICB9CiAgICB9CgogICAgaWYgKG1hcmtzLmxlbmd0aCkgewogICAgICAvLyBLbHVkZ2UgdG8gd29yayBhcm91bmQgdGhlIElFIGJ1ZyBmcm9tIGlzc3VlICMxMTkzLCB3aGVyZSB0ZXh0CiAgICAgIC8vIGlucHV0IHN0b3BzIGdvaW5nIHRvIHRoZSB0ZXh0YXJlIHdoZXZlciB0aGlzIGZpcmVzLgogICAgICBpZiAoaWVfbHQ4ICYmIGNtLnN0YXRlLmZvY3VzZWQpIGNtLmZvY3VzKCk7CgogICAgICB2YXIgY2xlYXIgPSBmdW5jdGlvbigpIHsKICAgICAgICBjbS5vcGVyYXRpb24oZnVuY3Rpb24oKSB7CiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1hcmtzLmxlbmd0aDsgaSsrKSBtYXJrc1tpXS5jbGVhcigpOwogICAgICAgIH0pOwogICAgICB9OwogICAgICBpZiAoYXV0b2NsZWFyKSBzZXRUaW1lb3V0KGNsZWFyLCA4MDApOwogICAgICBlbHNlIHJldHVybiBjbGVhcjsKICAgIH0KICB9CgogIHZhciBjdXJyZW50bHlIaWdobGlnaHRlZCA9IG51bGw7CiAgZnVuY3Rpb24gZG9NYXRjaEJyYWNrZXRzKGNtKSB7CiAgICBjbS5vcGVyYXRpb24oZnVuY3Rpb24oKSB7CiAgICAgIGlmIChjdXJyZW50bHlIaWdobGlnaHRlZCkge2N1cnJlbnRseUhpZ2hsaWdodGVkKCk7IGN1cnJlbnRseUhpZ2hsaWdodGVkID0gbnVsbDt9CiAgICAgIGN1cnJlbnRseUhpZ2hsaWdodGVkID0gbWF0Y2hCcmFja2V0cyhjbSwgZmFsc2UsIGNtLnN0YXRlLm1hdGNoQnJhY2tldHMpOwogICAgfSk7CiAgfQoKICBDb2RlTWlycm9yLmRlZmluZU9wdGlvbigibWF0Y2hCcmFja2V0cyIsIGZhbHNlLCBmdW5jdGlvbihjbSwgdmFsLCBvbGQpIHsKICAgIGlmIChvbGQgJiYgb2xkICE9IENvZGVNaXJyb3IuSW5pdCkgewogICAgICBjbS5vZmYoImN1cnNvckFjdGl2aXR5IiwgZG9NYXRjaEJyYWNrZXRzKTsKICAgICAgaWYgKGN1cnJlbnRseUhpZ2hsaWdodGVkKSB7Y3VycmVudGx5SGlnaGxpZ2h0ZWQoKTsgY3VycmVudGx5SGlnaGxpZ2h0ZWQgPSBudWxsO30KICAgIH0KICAgIGlmICh2YWwpIHsKICAgICAgY20uc3RhdGUubWF0Y2hCcmFja2V0cyA9IHR5cGVvZiB2YWwgPT0gIm9iamVjdCIgPyB2YWwgOiB7fTsKICAgICAgY20ub24oImN1cnNvckFjdGl2aXR5IiwgZG9NYXRjaEJyYWNrZXRzKTsKICAgIH0KICB9KTsKCiAgQ29kZU1pcnJvci5kZWZpbmVFeHRlbnNpb24oIm1hdGNoQnJhY2tldHMiLCBmdW5jdGlvbigpIHttYXRjaEJyYWNrZXRzKHRoaXMsIHRydWUpO30pOwogIENvZGVNaXJyb3IuZGVmaW5lRXh0ZW5zaW9uKCJmaW5kTWF0Y2hpbmdCcmFja2V0IiwgZnVuY3Rpb24ocG9zLCBzdHJpY3QsIGNvbmZpZyl7CiAgICByZXR1cm4gZmluZE1hdGNoaW5nQnJhY2tldCh0aGlzLCBwb3MsIHN0cmljdCwgY29uZmlnKTsKICB9KTsKICBDb2RlTWlycm9yLmRlZmluZUV4dGVuc2lvbigic2NhbkZvckJyYWNrZXQiLCBmdW5jdGlvbihwb3MsIGRpciwgc3R5bGUsIGNvbmZpZyl7CiAgICByZXR1cm4gc2NhbkZvckJyYWNrZXQodGhpcywgcG9zLCBkaXIsIHN0eWxlLCBjb25maWcpOwogIH0pOwp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/edit/matchtags.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSwgcmVxdWlyZSgiLi4vZm9sZC94bWwtZm9sZCIpKTsKICBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCkgLy8gQU1ECiAgICBkZWZpbmUoWyIuLi8uLi9saWIvY29kZW1pcnJvciIsICIuLi9mb2xkL3htbC1mb2xkIl0sIG1vZCk7CiAgZWxzZSAvLyBQbGFpbiBicm93c2VyIGVudgogICAgbW9kKENvZGVNaXJyb3IpOwp9KShmdW5jdGlvbihDb2RlTWlycm9yKSB7CiAgInVzZSBzdHJpY3QiOwoKICBDb2RlTWlycm9yLmRlZmluZU9wdGlvbigibWF0Y2hUYWdzIiwgZmFsc2UsIGZ1bmN0aW9uKGNtLCB2YWwsIG9sZCkgewogICAgaWYgKG9sZCAmJiBvbGQgIT0gQ29kZU1pcnJvci5Jbml0KSB7CiAgICAgIGNtLm9mZigiY3Vyc29yQWN0aXZpdHkiLCBkb01hdGNoVGFncyk7CiAgICAgIGNtLm9mZigidmlld3BvcnRDaGFuZ2UiLCBtYXliZVVwZGF0ZU1hdGNoKTsKICAgICAgY2xlYXIoY20pOwogICAgfQogICAgaWYgKHZhbCkgewogICAgICBjbS5zdGF0ZS5tYXRjaEJvdGhUYWdzID0gdHlwZW9mIHZhbCA9PSAib2JqZWN0IiAmJiB2YWwuYm90aFRhZ3M7CiAgICAgIGNtLm9uKCJjdXJzb3JBY3Rpdml0eSIsIGRvTWF0Y2hUYWdzKTsKICAgICAgY20ub24oInZpZXdwb3J0Q2hhbmdlIiwgbWF5YmVVcGRhdGVNYXRjaCk7CiAgICAgIGRvTWF0Y2hUYWdzKGNtKTsKICAgIH0KICB9KTsKCiAgZnVuY3Rpb24gY2xlYXIoY20pIHsKICAgIGlmIChjbS5zdGF0ZS50YWdIaXQpIGNtLnN0YXRlLnRhZ0hpdC5jbGVhcigpOwogICAgaWYgKGNtLnN0YXRlLnRhZ090aGVyKSBjbS5zdGF0ZS50YWdPdGhlci5jbGVhcigpOwogICAgY20uc3RhdGUudGFnSGl0ID0gY20uc3RhdGUudGFnT3RoZXIgPSBudWxsOwogIH0KCiAgZnVuY3Rpb24gZG9NYXRjaFRhZ3MoY20pIHsKICAgIGNtLnN0YXRlLmZhaWxlZFRhZ01hdGNoID0gZmFsc2U7CiAgICBjbS5vcGVyYXRpb24oZnVuY3Rpb24oKSB7CiAgICAgIGNsZWFyKGNtKTsKICAgICAgaWYgKGNtLnNvbWV0aGluZ1NlbGVjdGVkKCkpIHJldHVybjsKICAgICAgdmFyIGN1ciA9IGNtLmdldEN1cnNvcigpLCByYW5nZSA9IGNtLmdldFZpZXdwb3J0KCk7CiAgICAgIHJhbmdlLmZyb20gPSBNYXRoLm1pbihyYW5nZS5mcm9tLCBjdXIubGluZSk7IHJhbmdlLnRvID0gTWF0aC5tYXgoY3VyLmxpbmUgKyAxLCByYW5nZS50byk7CiAgICAgIHZhciBtYXRjaCA9IENvZGVNaXJyb3IuZmluZE1hdGNoaW5nVGFnKGNtLCBjdXIsIHJhbmdlKTsKICAgICAgaWYgKCFtYXRjaCkgcmV0dXJuOwogICAgICBpZiAoY20uc3RhdGUubWF0Y2hCb3RoVGFncykgewogICAgICAgIHZhciBoaXQgPSBtYXRjaC5hdCA9PSAib3BlbiIgPyBtYXRjaC5vcGVuIDogbWF0Y2guY2xvc2U7CiAgICAgICAgaWYgKGhpdCkgY20uc3RhdGUudGFnSGl0ID0gY20ubWFya1RleHQoaGl0LmZyb20sIGhpdC50bywge2NsYXNzTmFtZTogIkNvZGVNaXJyb3ItbWF0Y2hpbmd0YWcifSk7CiAgICAgIH0KICAgICAgdmFyIG90aGVyID0gbWF0Y2guYXQgPT0gImNsb3NlIiA/IG1hdGNoLm9wZW4gOiBtYXRjaC5jbG9zZTsKICAgICAgaWYgKG90aGVyKQogICAgICAgIGNtLnN0YXRlLnRhZ090aGVyID0gY20ubWFya1RleHQob3RoZXIuZnJvbSwgb3RoZXIudG8sIHtjbGFzc05hbWU6ICJDb2RlTWlycm9yLW1hdGNoaW5ndGFnIn0pOwogICAgICBlbHNlCiAgICAgICAgY20uc3RhdGUuZmFpbGVkVGFnTWF0Y2ggPSB0cnVlOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBtYXliZVVwZGF0ZU1hdGNoKGNtKSB7CiAgICBpZiAoY20uc3RhdGUuZmFpbGVkVGFnTWF0Y2gpIGRvTWF0Y2hUYWdzKGNtKTsKICB9CgogIENvZGVNaXJyb3IuY29tbWFuZHMudG9NYXRjaGluZ1RhZyA9IGZ1bmN0aW9uKGNtKSB7CiAgICB2YXIgZm91bmQgPSBDb2RlTWlycm9yLmZpbmRNYXRjaGluZ1RhZyhjbSwgY20uZ2V0Q3Vyc29yKCkpOwogICAgaWYgKGZvdW5kKSB7CiAgICAgIHZhciBvdGhlciA9IGZvdW5kLmF0ID09ICJjbG9zZSIgPyBmb3VuZC5vcGVuIDogZm91bmQuY2xvc2U7CiAgICAgIGlmIChvdGhlcikgY20uZXh0ZW5kU2VsZWN0aW9uKG90aGVyLnRvLCBvdGhlci5mcm9tKTsKICAgIH0KICB9Owp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/edit/trailingspace.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICBDb2RlTWlycm9yLmRlZmluZU9wdGlvbigic2hvd1RyYWlsaW5nU3BhY2UiLCBmYWxzZSwgZnVuY3Rpb24oY20sIHZhbCwgcHJldikgewogICAgaWYgKHByZXYgPT0gQ29kZU1pcnJvci5Jbml0KSBwcmV2ID0gZmFsc2U7CiAgICBpZiAocHJldiAmJiAhdmFsKQogICAgICBjbS5yZW1vdmVPdmVybGF5KCJ0cmFpbGluZ3NwYWNlIik7CiAgICBlbHNlIGlmICghcHJldiAmJiB2YWwpCiAgICAgIGNtLmFkZE92ZXJsYXkoewogICAgICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0pIHsKICAgICAgICAgIGZvciAodmFyIGwgPSBzdHJlYW0uc3RyaW5nLmxlbmd0aCwgaSA9IGw7IGkgJiYgL1xzLy50ZXN0KHN0cmVhbS5zdHJpbmcuY2hhckF0KGkgLSAxKSk7IC0taSkge30KICAgICAgICAgIGlmIChpID4gc3RyZWFtLnBvcykgeyBzdHJlYW0ucG9zID0gaTsgcmV0dXJuIG51bGw7IH0KICAgICAgICAgIHN0cmVhbS5wb3MgPSBsOwogICAgICAgICAgcmV0dXJuICJ0cmFpbGluZ3NwYWNlIjsKICAgICAgICB9LAogICAgICAgIG5hbWU6ICJ0cmFpbGluZ3NwYWNlIgogICAgICB9KTsKICB9KTsKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/fold/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/fold/brace-fold.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5yZWdpc3RlckhlbHBlcigiZm9sZCIsICJicmFjZSIsIGZ1bmN0aW9uKGNtLCBzdGFydCkgewogIHZhciBsaW5lID0gc3RhcnQubGluZSwgbGluZVRleHQgPSBjbS5nZXRMaW5lKGxpbmUpOwogIHZhciB0b2tlblR5cGU7CgogIGZ1bmN0aW9uIGZpbmRPcGVuaW5nKG9wZW5DaCkgewogICAgZm9yICh2YXIgYXQgPSBzdGFydC5jaCwgcGFzcyA9IDA7OykgewogICAgICB2YXIgZm91bmQgPSBhdCA8PSAwID8gLTEgOiBsaW5lVGV4dC5sYXN0SW5kZXhPZihvcGVuQ2gsIGF0IC0gMSk7CiAgICAgIGlmIChmb3VuZCA9PSAtMSkgewogICAgICAgIGlmIChwYXNzID09IDEpIGJyZWFrOwogICAgICAgIHBhc3MgPSAxOwogICAgICAgIGF0ID0gbGluZVRleHQubGVuZ3RoOwogICAgICAgIGNvbnRpbnVlOwogICAgICB9CiAgICAgIGlmIChwYXNzID09IDEgJiYgZm91bmQgPCBzdGFydC5jaCkgYnJlYWs7CiAgICAgIHRva2VuVHlwZSA9IGNtLmdldFRva2VuVHlwZUF0KENvZGVNaXJyb3IuUG9zKGxpbmUsIGZvdW5kICsgMSkpOwogICAgICBpZiAoIS9eKGNvbW1lbnR8c3RyaW5nKS8udGVzdCh0b2tlblR5cGUpKSByZXR1cm4gZm91bmQgKyAxOwogICAgICBhdCA9IGZvdW5kIC0gMTsKICAgIH0KICB9CgogIHZhciBzdGFydFRva2VuID0gInsiLCBlbmRUb2tlbiA9ICJ9Iiwgc3RhcnRDaCA9IGZpbmRPcGVuaW5nKCJ7Iik7CiAgaWYgKHN0YXJ0Q2ggPT0gbnVsbCkgewogICAgc3RhcnRUb2tlbiA9ICJbIiwgZW5kVG9rZW4gPSAiXSI7CiAgICBzdGFydENoID0gZmluZE9wZW5pbmcoIlsiKTsKICB9CgogIGlmIChzdGFydENoID09IG51bGwpIHJldHVybjsKICB2YXIgY291bnQgPSAxLCBsYXN0TGluZSA9IGNtLmxhc3RMaW5lKCksIGVuZCwgZW5kQ2g7CiAgb3V0ZXI6IGZvciAodmFyIGkgPSBsaW5lOyBpIDw9IGxhc3RMaW5lOyArK2kpIHsKICAgIHZhciB0ZXh0ID0gY20uZ2V0TGluZShpKSwgcG9zID0gaSA9PSBsaW5lID8gc3RhcnRDaCA6IDA7CiAgICBmb3IgKDs7KSB7CiAgICAgIHZhciBuZXh0T3BlbiA9IHRleHQuaW5kZXhPZihzdGFydFRva2VuLCBwb3MpLCBuZXh0Q2xvc2UgPSB0ZXh0LmluZGV4T2YoZW5kVG9rZW4sIHBvcyk7CiAgICAgIGlmIChuZXh0T3BlbiA8IDApIG5leHRPcGVuID0gdGV4dC5sZW5ndGg7CiAgICAgIGlmIChuZXh0Q2xvc2UgPCAwKSBuZXh0Q2xvc2UgPSB0ZXh0Lmxlbmd0aDsKICAgICAgcG9zID0gTWF0aC5taW4obmV4dE9wZW4sIG5leHRDbG9zZSk7CiAgICAgIGlmIChwb3MgPT0gdGV4dC5sZW5ndGgpIGJyZWFrOwogICAgICBpZiAoY20uZ2V0VG9rZW5UeXBlQXQoQ29kZU1pcnJvci5Qb3MoaSwgcG9zICsgMSkpID09IHRva2VuVHlwZSkgewogICAgICAgIGlmIChwb3MgPT0gbmV4dE9wZW4pICsrY291bnQ7CiAgICAgICAgZWxzZSBpZiAoIS0tY291bnQpIHsgZW5kID0gaTsgZW5kQ2ggPSBwb3M7IGJyZWFrIG91dGVyOyB9CiAgICAgIH0KICAgICAgKytwb3M7CiAgICB9CiAgfQogIGlmIChlbmQgPT0gbnVsbCB8fCBsaW5lID09IGVuZCAmJiBlbmRDaCA9PSBzdGFydENoKSByZXR1cm47CiAgcmV0dXJuIHtmcm9tOiBDb2RlTWlycm9yLlBvcyhsaW5lLCBzdGFydENoKSwKICAgICAgICAgIHRvOiBDb2RlTWlycm9yLlBvcyhlbmQsIGVuZENoKX07Cn0pOwoKQ29kZU1pcnJvci5yZWdpc3RlckhlbHBlcigiZm9sZCIsICJpbXBvcnQiLCBmdW5jdGlvbihjbSwgc3RhcnQpIHsKICBmdW5jdGlvbiBoYXNJbXBvcnQobGluZSkgewogICAgaWYgKGxpbmUgPCBjbS5maXJzdExpbmUoKSB8fCBsaW5lID4gY20ubGFzdExpbmUoKSkgcmV0dXJuIG51bGw7CiAgICB2YXIgc3RhcnQgPSBjbS5nZXRUb2tlbkF0KENvZGVNaXJyb3IuUG9zKGxpbmUsIDEpKTsKICAgIGlmICghL1xTLy50ZXN0KHN0YXJ0LnN0cmluZykpIHN0YXJ0ID0gY20uZ2V0VG9rZW5BdChDb2RlTWlycm9yLlBvcyhsaW5lLCBzdGFydC5lbmQgKyAxKSk7CiAgICBpZiAoc3RhcnQudHlwZSAhPSAia2V5d29yZCIgfHwgc3RhcnQuc3RyaW5nICE9ICJpbXBvcnQiKSByZXR1cm4gbnVsbDsKICAgIC8vIE5vdyBmaW5kIGNsb3Npbmcgc2VtaWNvbG9uLCByZXR1cm4gaXRzIHBvc2l0aW9uCiAgICBmb3IgKHZhciBpID0gbGluZSwgZSA9IE1hdGgubWluKGNtLmxhc3RMaW5lKCksIGxpbmUgKyAxMCk7IGkgPD0gZTsgKytpKSB7CiAgICAgIHZhciB0ZXh0ID0gY20uZ2V0TGluZShpKSwgc2VtaSA9IHRleHQuaW5kZXhPZigiOyIpOwogICAgICBpZiAoc2VtaSAhPSAtMSkgcmV0dXJuIHtzdGFydENoOiBzdGFydC5lbmQsIGVuZDogQ29kZU1pcnJvci5Qb3MoaSwgc2VtaSl9OwogICAgfQogIH0KCiAgdmFyIHN0YXJ0TGluZSA9IHN0YXJ0LmxpbmUsIGhhcyA9IGhhc0ltcG9ydChzdGFydExpbmUpLCBwcmV2OwogIGlmICghaGFzIHx8IGhhc0ltcG9ydChzdGFydExpbmUgLSAxKSB8fCAoKHByZXYgPSBoYXNJbXBvcnQoc3RhcnRMaW5lIC0gMikpICYmIHByZXYuZW5kLmxpbmUgPT0gc3RhcnRMaW5lIC0gMSkpCiAgICByZXR1cm4gbnVsbDsKICBmb3IgKHZhciBlbmQgPSBoYXMuZW5kOzspIHsKICAgIHZhciBuZXh0ID0gaGFzSW1wb3J0KGVuZC5saW5lICsgMSk7CiAgICBpZiAobmV4dCA9PSBudWxsKSBicmVhazsKICAgIGVuZCA9IG5leHQuZW5kOwogIH0KICByZXR1cm4ge2Zyb206IGNtLmNsaXBQb3MoQ29kZU1pcnJvci5Qb3Moc3RhcnRMaW5lLCBoYXMuc3RhcnRDaCArIDEpKSwgdG86IGVuZH07Cn0pOwoKQ29kZU1pcnJvci5yZWdpc3RlckhlbHBlcigiZm9sZCIsICJpbmNsdWRlIiwgZnVuY3Rpb24oY20sIHN0YXJ0KSB7CiAgZnVuY3Rpb24gaGFzSW5jbHVkZShsaW5lKSB7CiAgICBpZiAobGluZSA8IGNtLmZpcnN0TGluZSgpIHx8IGxpbmUgPiBjbS5sYXN0TGluZSgpKSByZXR1cm4gbnVsbDsKICAgIHZhciBzdGFydCA9IGNtLmdldFRva2VuQXQoQ29kZU1pcnJvci5Qb3MobGluZSwgMSkpOwogICAgaWYgKCEvXFMvLnRlc3Qoc3RhcnQuc3RyaW5nKSkgc3RhcnQgPSBjbS5nZXRUb2tlbkF0KENvZGVNaXJyb3IuUG9zKGxpbmUsIHN0YXJ0LmVuZCArIDEpKTsKICAgIGlmIChzdGFydC50eXBlID09ICJtZXRhIiAmJiBzdGFydC5zdHJpbmcuc2xpY2UoMCwgOCkgPT0gIiNpbmNsdWRlIikgcmV0dXJuIHN0YXJ0LnN0YXJ0ICsgODsKICB9CgogIHZhciBzdGFydExpbmUgPSBzdGFydC5saW5lLCBoYXMgPSBoYXNJbmNsdWRlKHN0YXJ0TGluZSk7CiAgaWYgKGhhcyA9PSBudWxsIHx8IGhhc0luY2x1ZGUoc3RhcnRMaW5lIC0gMSkgIT0gbnVsbCkgcmV0dXJuIG51bGw7CiAgZm9yICh2YXIgZW5kID0gc3RhcnRMaW5lOzspIHsKICAgIHZhciBuZXh0ID0gaGFzSW5jbHVkZShlbmQgKyAxKTsKICAgIGlmIChuZXh0ID09IG51bGwpIGJyZWFrOwogICAgKytlbmQ7CiAgfQogIHJldHVybiB7ZnJvbTogQ29kZU1pcnJvci5Qb3Moc3RhcnRMaW5lLCBoYXMgKyAxKSwKICAgICAgICAgIHRvOiBjbS5jbGlwUG9zKENvZGVNaXJyb3IuUG9zKGVuZCkpfTsKfSk7Cgp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/fold/comment-fold.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5yZWdpc3Rlckdsb2JhbEhlbHBlcigiZm9sZCIsICJjb21tZW50IiwgZnVuY3Rpb24obW9kZSkgewogIHJldHVybiBtb2RlLmJsb2NrQ29tbWVudFN0YXJ0ICYmIG1vZGUuYmxvY2tDb21tZW50RW5kOwp9LCBmdW5jdGlvbihjbSwgc3RhcnQpIHsKICB2YXIgbW9kZSA9IGNtLmdldE1vZGVBdChzdGFydCksIHN0YXJ0VG9rZW4gPSBtb2RlLmJsb2NrQ29tbWVudFN0YXJ0LCBlbmRUb2tlbiA9IG1vZGUuYmxvY2tDb21tZW50RW5kOwogIGlmICghc3RhcnRUb2tlbiB8fCAhZW5kVG9rZW4pIHJldHVybjsKICB2YXIgbGluZSA9IHN0YXJ0LmxpbmUsIGxpbmVUZXh0ID0gY20uZ2V0TGluZShsaW5lKTsKCiAgdmFyIHN0YXJ0Q2g7CiAgZm9yICh2YXIgYXQgPSBzdGFydC5jaCwgcGFzcyA9IDA7OykgewogICAgdmFyIGZvdW5kID0gYXQgPD0gMCA/IC0xIDogbGluZVRleHQubGFzdEluZGV4T2Yoc3RhcnRUb2tlbiwgYXQgLSAxKTsKICAgIGlmIChmb3VuZCA9PSAtMSkgewogICAgICBpZiAocGFzcyA9PSAxKSByZXR1cm47CiAgICAgIHBhc3MgPSAxOwogICAgICBhdCA9IGxpbmVUZXh0Lmxlbmd0aDsKICAgICAgY29udGludWU7CiAgICB9CiAgICBpZiAocGFzcyA9PSAxICYmIGZvdW5kIDwgc3RhcnQuY2gpIHJldHVybjsKICAgIGlmICgvY29tbWVudC8udGVzdChjbS5nZXRUb2tlblR5cGVBdChDb2RlTWlycm9yLlBvcyhsaW5lLCBmb3VuZCArIDEpKSkgJiYKICAgICAgICAoZm91bmQgPT0gMCB8fCBsaW5lVGV4dC5zbGljZShmb3VuZCAtIGVuZFRva2VuLmxlbmd0aCwgZm91bmQpID09IGVuZFRva2VuIHx8CiAgICAgICAgICEvY29tbWVudC8udGVzdChjbS5nZXRUb2tlblR5cGVBdChDb2RlTWlycm9yLlBvcyhsaW5lLCBmb3VuZCkpKSkpIHsKICAgICAgc3RhcnRDaCA9IGZvdW5kICsgc3RhcnRUb2tlbi5sZW5ndGg7CiAgICAgIGJyZWFrOwogICAgfQogICAgYXQgPSBmb3VuZCAtIDE7CiAgfQoKICB2YXIgZGVwdGggPSAxLCBsYXN0TGluZSA9IGNtLmxhc3RMaW5lKCksIGVuZCwgZW5kQ2g7CiAgb3V0ZXI6IGZvciAodmFyIGkgPSBsaW5lOyBpIDw9IGxhc3RMaW5lOyArK2kpIHsKICAgIHZhciB0ZXh0ID0gY20uZ2V0TGluZShpKSwgcG9zID0gaSA9PSBsaW5lID8gc3RhcnRDaCA6IDA7CiAgICBmb3IgKDs7KSB7CiAgICAgIHZhciBuZXh0T3BlbiA9IHRleHQuaW5kZXhPZihzdGFydFRva2VuLCBwb3MpLCBuZXh0Q2xvc2UgPSB0ZXh0LmluZGV4T2YoZW5kVG9rZW4sIHBvcyk7CiAgICAgIGlmIChuZXh0T3BlbiA8IDApIG5leHRPcGVuID0gdGV4dC5sZW5ndGg7CiAgICAgIGlmIChuZXh0Q2xvc2UgPCAwKSBuZXh0Q2xvc2UgPSB0ZXh0Lmxlbmd0aDsKICAgICAgcG9zID0gTWF0aC5taW4obmV4dE9wZW4sIG5leHRDbG9zZSk7CiAgICAgIGlmIChwb3MgPT0gdGV4dC5sZW5ndGgpIGJyZWFrOwogICAgICBpZiAocG9zID09IG5leHRPcGVuKSArK2RlcHRoOwogICAgICBlbHNlIGlmICghLS1kZXB0aCkgeyBlbmQgPSBpOyBlbmRDaCA9IHBvczsgYnJlYWsgb3V0ZXI7IH0KICAgICAgKytwb3M7CiAgICB9CiAgfQogIGlmIChlbmQgPT0gbnVsbCB8fCBsaW5lID09IGVuZCAmJiBlbmRDaCA9PSBzdGFydENoKSByZXR1cm47CiAgcmV0dXJuIHtmcm9tOiBDb2RlTWlycm9yLlBvcyhsaW5lLCBzdGFydENoKSwKICAgICAgICAgIHRvOiBDb2RlTWlycm9yLlBvcyhlbmQsIGVuZENoKX07Cn0pOwoKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/fold/foldcode.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CgogIGZ1bmN0aW9uIGRvRm9sZChjbSwgcG9zLCBvcHRpb25zLCBmb3JjZSkgewogICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5jYWxsKSB7CiAgICAgIHZhciBmaW5kZXIgPSBvcHRpb25zOwogICAgICBvcHRpb25zID0gbnVsbDsKICAgIH0gZWxzZSB7CiAgICAgIHZhciBmaW5kZXIgPSBnZXRPcHRpb24oY20sIG9wdGlvbnMsICJyYW5nZUZpbmRlciIpOwogICAgfQogICAgaWYgKHR5cGVvZiBwb3MgPT0gIm51bWJlciIpIHBvcyA9IENvZGVNaXJyb3IuUG9zKHBvcywgMCk7CiAgICB2YXIgbWluU2l6ZSA9IGdldE9wdGlvbihjbSwgb3B0aW9ucywgIm1pbkZvbGRTaXplIik7CgogICAgZnVuY3Rpb24gZ2V0UmFuZ2UoYWxsb3dGb2xkZWQpIHsKICAgICAgdmFyIHJhbmdlID0gZmluZGVyKGNtLCBwb3MpOwogICAgICBpZiAoIXJhbmdlIHx8IHJhbmdlLnRvLmxpbmUgLSByYW5nZS5mcm9tLmxpbmUgPCBtaW5TaXplKSByZXR1cm4gbnVsbDsKICAgICAgdmFyIG1hcmtzID0gY20uZmluZE1hcmtzQXQocmFuZ2UuZnJvbSk7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWFya3MubGVuZ3RoOyArK2kpIHsKICAgICAgICBpZiAobWFya3NbaV0uX19pc0ZvbGQgJiYgZm9yY2UgIT09ICJmb2xkIikgewogICAgICAgICAgaWYgKCFhbGxvd0ZvbGRlZCkgcmV0dXJuIG51bGw7CiAgICAgICAgICByYW5nZS5jbGVhcmVkID0gdHJ1ZTsKICAgICAgICAgIG1hcmtzW2ldLmNsZWFyKCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiByYW5nZTsKICAgIH0KCiAgICB2YXIgcmFuZ2UgPSBnZXRSYW5nZSh0cnVlKTsKICAgIGlmIChnZXRPcHRpb24oY20sIG9wdGlvbnMsICJzY2FuVXAiKSkgd2hpbGUgKCFyYW5nZSAmJiBwb3MubGluZSA+IGNtLmZpcnN0TGluZSgpKSB7CiAgICAgIHBvcyA9IENvZGVNaXJyb3IuUG9zKHBvcy5saW5lIC0gMSwgMCk7CiAgICAgIHJhbmdlID0gZ2V0UmFuZ2UoZmFsc2UpOwogICAgfQogICAgaWYgKCFyYW5nZSB8fCByYW5nZS5jbGVhcmVkIHx8IGZvcmNlID09PSAidW5mb2xkIikgcmV0dXJuOwoKICAgIHZhciBteVdpZGdldCA9IG1ha2VXaWRnZXQoY20sIG9wdGlvbnMpOwogICAgQ29kZU1pcnJvci5vbihteVdpZGdldCwgIm1vdXNlZG93biIsIGZ1bmN0aW9uKGUpIHsKICAgICAgbXlSYW5nZS5jbGVhcigpOwogICAgICBDb2RlTWlycm9yLmVfcHJldmVudERlZmF1bHQoZSk7CiAgICB9KTsKICAgIHZhciBteVJhbmdlID0gY20ubWFya1RleHQocmFuZ2UuZnJvbSwgcmFuZ2UudG8sIHsKICAgICAgcmVwbGFjZWRXaXRoOiBteVdpZGdldCwKICAgICAgY2xlYXJPbkVudGVyOiBnZXRPcHRpb24oY20sIG9wdGlvbnMsICJjbGVhck9uRW50ZXIiKSwKICAgICAgX19pc0ZvbGQ6IHRydWUKICAgIH0pOwogICAgbXlSYW5nZS5vbigiY2xlYXIiLCBmdW5jdGlvbihmcm9tLCB0bykgewogICAgICBDb2RlTWlycm9yLnNpZ25hbChjbSwgInVuZm9sZCIsIGNtLCBmcm9tLCB0byk7CiAgICB9KTsKICAgIENvZGVNaXJyb3Iuc2lnbmFsKGNtLCAiZm9sZCIsIGNtLCByYW5nZS5mcm9tLCByYW5nZS50byk7CiAgfQoKICBmdW5jdGlvbiBtYWtlV2lkZ2V0KGNtLCBvcHRpb25zKSB7CiAgICB2YXIgd2lkZ2V0ID0gZ2V0T3B0aW9uKGNtLCBvcHRpb25zLCAid2lkZ2V0Iik7CiAgICBpZiAodHlwZW9mIHdpZGdldCA9PSAic3RyaW5nIikgewogICAgICB2YXIgdGV4dCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHdpZGdldCk7CiAgICAgIHdpZGdldCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTsKICAgICAgd2lkZ2V0LmFwcGVuZENoaWxkKHRleHQpOwogICAgICB3aWRnZXQuY2xhc3NOYW1lID0gIkNvZGVNaXJyb3ItZm9sZG1hcmtlciI7CiAgICB9CiAgICByZXR1cm4gd2lkZ2V0OwogIH0KCiAgLy8gQ2x1bXN5IGJhY2t3YXJkcy1jb21wYXRpYmxlIGludGVyZmFjZQogIENvZGVNaXJyb3IubmV3Rm9sZEZ1bmN0aW9uID0gZnVuY3Rpb24ocmFuZ2VGaW5kZXIsIHdpZGdldCkgewogICAgcmV0dXJuIGZ1bmN0aW9uKGNtLCBwb3MpIHsgZG9Gb2xkKGNtLCBwb3MsIHtyYW5nZUZpbmRlcjogcmFuZ2VGaW5kZXIsIHdpZGdldDogd2lkZ2V0fSk7IH07CiAgfTsKCiAgLy8gTmV3LXN0eWxlIGludGVyZmFjZQogIENvZGVNaXJyb3IuZGVmaW5lRXh0ZW5zaW9uKCJmb2xkQ29kZSIsIGZ1bmN0aW9uKHBvcywgb3B0aW9ucywgZm9yY2UpIHsKICAgIGRvRm9sZCh0aGlzLCBwb3MsIG9wdGlvbnMsIGZvcmNlKTsKICB9KTsKCiAgQ29kZU1pcnJvci5kZWZpbmVFeHRlbnNpb24oImlzRm9sZGVkIiwgZnVuY3Rpb24ocG9zKSB7CiAgICB2YXIgbWFya3MgPSB0aGlzLmZpbmRNYXJrc0F0KHBvcyk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1hcmtzLmxlbmd0aDsgKytpKQogICAgICBpZiAobWFya3NbaV0uX19pc0ZvbGQpIHJldHVybiB0cnVlOwogIH0pOwoKICBDb2RlTWlycm9yLmNvbW1hbmRzLnRvZ2dsZUZvbGQgPSBmdW5jdGlvbihjbSkgewogICAgY20uZm9sZENvZGUoY20uZ2V0Q3Vyc29yKCkpOwogIH07CiAgQ29kZU1pcnJvci5jb21tYW5kcy5mb2xkID0gZnVuY3Rpb24oY20pIHsKICAgIGNtLmZvbGRDb2RlKGNtLmdldEN1cnNvcigpLCBudWxsLCAiZm9sZCIpOwogIH07CiAgQ29kZU1pcnJvci5jb21tYW5kcy51bmZvbGQgPSBmdW5jdGlvbihjbSkgewogICAgY20uZm9sZENvZGUoY20uZ2V0Q3Vyc29yKCksIG51bGwsICJ1bmZvbGQiKTsKICB9OwogIENvZGVNaXJyb3IuY29tbWFuZHMuZm9sZEFsbCA9IGZ1bmN0aW9uKGNtKSB7CiAgICBjbS5vcGVyYXRpb24oZnVuY3Rpb24oKSB7CiAgICAgIGZvciAodmFyIGkgPSBjbS5maXJzdExpbmUoKSwgZSA9IGNtLmxhc3RMaW5lKCk7IGkgPD0gZTsgaSsrKQogICAgICAgIGNtLmZvbGRDb2RlKENvZGVNaXJyb3IuUG9zKGksIDApLCBudWxsLCAiZm9sZCIpOwogICAgfSk7CiAgfTsKICBDb2RlTWlycm9yLmNvbW1hbmRzLnVuZm9sZEFsbCA9IGZ1bmN0aW9uKGNtKSB7CiAgICBjbS5vcGVyYXRpb24oZnVuY3Rpb24oKSB7CiAgICAgIGZvciAodmFyIGkgPSBjbS5maXJzdExpbmUoKSwgZSA9IGNtLmxhc3RMaW5lKCk7IGkgPD0gZTsgaSsrKQogICAgICAgIGNtLmZvbGRDb2RlKENvZGVNaXJyb3IuUG9zKGksIDApLCBudWxsLCAidW5mb2xkIik7CiAgICB9KTsKICB9OwoKICBDb2RlTWlycm9yLnJlZ2lzdGVySGVscGVyKCJmb2xkIiwgImNvbWJpbmUiLCBmdW5jdGlvbigpIHsKICAgIHZhciBmdW5jcyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMCk7CiAgICByZXR1cm4gZnVuY3Rpb24oY20sIHN0YXJ0KSB7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZnVuY3MubGVuZ3RoOyArK2kpIHsKICAgICAgICB2YXIgZm91bmQgPSBmdW5jc1tpXShjbSwgc3RhcnQpOwogICAgICAgIGlmIChmb3VuZCkgcmV0dXJuIGZvdW5kOwogICAgICB9CiAgICB9OwogIH0pOwoKICBDb2RlTWlycm9yLnJlZ2lzdGVySGVscGVyKCJmb2xkIiwgImF1dG8iLCBmdW5jdGlvbihjbSwgc3RhcnQpIHsKICAgIHZhciBoZWxwZXJzID0gY20uZ2V0SGVscGVycyhzdGFydCwgImZvbGQiKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaGVscGVycy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgY3VyID0gaGVscGVyc1tpXShjbSwgc3RhcnQpOwogICAgICBpZiAoY3VyKSByZXR1cm4gY3VyOwogICAgfQogIH0pOwoKICB2YXIgZGVmYXVsdE9wdGlvbnMgPSB7CiAgICByYW5nZUZpbmRlcjogQ29kZU1pcnJvci5mb2xkLmF1dG8sCiAgICB3aWRnZXQ6ICJcdTIxOTQiLAogICAgbWluRm9sZFNpemU6IDAsCiAgICBzY2FuVXA6IGZhbHNlLAogICAgY2xlYXJPbkVudGVyOiB0cnVlCiAgfTsKCiAgQ29kZU1pcnJvci5kZWZpbmVPcHRpb24oImZvbGRPcHRpb25zIiwgbnVsbCk7CgogIGZ1bmN0aW9uIGdldE9wdGlvbihjbSwgb3B0aW9ucywgbmFtZSkgewogICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9uc1tuYW1lXSAhPT0gdW5kZWZpbmVkKQogICAgICByZXR1cm4gb3B0aW9uc1tuYW1lXTsKICAgIHZhciBlZGl0b3JPcHRpb25zID0gY20ub3B0aW9ucy5mb2xkT3B0aW9uczsKICAgIGlmIChlZGl0b3JPcHRpb25zICYmIGVkaXRvck9wdGlvbnNbbmFtZV0gIT09IHVuZGVmaW5lZCkKICAgICAgcmV0dXJuIGVkaXRvck9wdGlvbnNbbmFtZV07CiAgICByZXR1cm4gZGVmYXVsdE9wdGlvbnNbbmFtZV07CiAgfQoKICBDb2RlTWlycm9yLmRlZmluZUV4dGVuc2lvbigiZm9sZE9wdGlvbiIsIGZ1bmN0aW9uKG9wdGlvbnMsIG5hbWUpIHsKICAgIHJldHVybiBnZXRPcHRpb24odGhpcywgb3B0aW9ucywgbmFtZSk7CiAgfSk7Cn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/fold/foldgutter.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LkNvZGVNaXJyb3ItZm9sZG1hcmtlciB7CiAgY29sb3I6IGJsdWU7CiAgdGV4dC1zaGFkb3c6ICNiOWYgMXB4IDFweCAycHgsICNiOWYgLTFweCAtMXB4IDJweCwgI2I5ZiAxcHggLTFweCAycHgsICNiOWYgLTFweCAxcHggMnB4OwogIGZvbnQtZmFtaWx5OiBhcmlhbDsKICBsaW5lLWhlaWdodDogLjM7CiAgY3Vyc29yOiBwb2ludGVyOwp9Ci5Db2RlTWlycm9yLWZvbGRndXR0ZXIgewogIHdpZHRoOiAuN2VtOwp9Ci5Db2RlTWlycm9yLWZvbGRndXR0ZXItb3BlbiwKLkNvZGVNaXJyb3ItZm9sZGd1dHRlci1mb2xkZWQgewogIGN1cnNvcjogcG9pbnRlcjsKfQouQ29kZU1pcnJvci1mb2xkZ3V0dGVyLW9wZW46YWZ0ZXIgewogIGNvbnRlbnQ6ICJcMjVCRSI7Cn0KLkNvZGVNaXJyb3ItZm9sZGd1dHRlci1mb2xkZWQ6YWZ0ZXIgewogIGNvbnRlbnQ6ICJcMjVCOCI7Cn0K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/fold/foldgutter.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSwgcmVxdWlyZSgiLi9mb2xkY29kZSIpKTsKICBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCkgLy8gQU1ECiAgICBkZWZpbmUoWyIuLi8uLi9saWIvY29kZW1pcnJvciIsICIuL2ZvbGRjb2RlIl0sIG1vZCk7CiAgZWxzZSAvLyBQbGFpbiBicm93c2VyIGVudgogICAgbW9kKENvZGVNaXJyb3IpOwp9KShmdW5jdGlvbihDb2RlTWlycm9yKSB7CiAgInVzZSBzdHJpY3QiOwoKICBDb2RlTWlycm9yLmRlZmluZU9wdGlvbigiZm9sZEd1dHRlciIsIGZhbHNlLCBmdW5jdGlvbihjbSwgdmFsLCBvbGQpIHsKICAgIGlmIChvbGQgJiYgb2xkICE9IENvZGVNaXJyb3IuSW5pdCkgewogICAgICBjbS5jbGVhckd1dHRlcihjbS5zdGF0ZS5mb2xkR3V0dGVyLm9wdGlvbnMuZ3V0dGVyKTsKICAgICAgY20uc3RhdGUuZm9sZEd1dHRlciA9IG51bGw7CiAgICAgIGNtLm9mZigiZ3V0dGVyQ2xpY2siLCBvbkd1dHRlckNsaWNrKTsKICAgICAgY20ub2ZmKCJjaGFuZ2UiLCBvbkNoYW5nZSk7CiAgICAgIGNtLm9mZigidmlld3BvcnRDaGFuZ2UiLCBvblZpZXdwb3J0Q2hhbmdlKTsKICAgICAgY20ub2ZmKCJmb2xkIiwgb25Gb2xkKTsKICAgICAgY20ub2ZmKCJ1bmZvbGQiLCBvbkZvbGQpOwogICAgICBjbS5vZmYoInN3YXBEb2MiLCBvbkNoYW5nZSk7CiAgICB9CiAgICBpZiAodmFsKSB7CiAgICAgIGNtLnN0YXRlLmZvbGRHdXR0ZXIgPSBuZXcgU3RhdGUocGFyc2VPcHRpb25zKHZhbCkpOwogICAgICB1cGRhdGVJblZpZXdwb3J0KGNtKTsKICAgICAgY20ub24oImd1dHRlckNsaWNrIiwgb25HdXR0ZXJDbGljayk7CiAgICAgIGNtLm9uKCJjaGFuZ2UiLCBvbkNoYW5nZSk7CiAgICAgIGNtLm9uKCJ2aWV3cG9ydENoYW5nZSIsIG9uVmlld3BvcnRDaGFuZ2UpOwogICAgICBjbS5vbigiZm9sZCIsIG9uRm9sZCk7CiAgICAgIGNtLm9uKCJ1bmZvbGQiLCBvbkZvbGQpOwogICAgICBjbS5vbigic3dhcERvYyIsIG9uQ2hhbmdlKTsKICAgIH0KICB9KTsKCiAgdmFyIFBvcyA9IENvZGVNaXJyb3IuUG9zOwoKICBmdW5jdGlvbiBTdGF0ZShvcHRpb25zKSB7CiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwogICAgdGhpcy5mcm9tID0gdGhpcy50byA9IDA7CiAgfQoKICBmdW5jdGlvbiBwYXJzZU9wdGlvbnMob3B0cykgewogICAgaWYgKG9wdHMgPT09IHRydWUpIG9wdHMgPSB7fTsKICAgIGlmIChvcHRzLmd1dHRlciA9PSBudWxsKSBvcHRzLmd1dHRlciA9ICJDb2RlTWlycm9yLWZvbGRndXR0ZXIiOwogICAgaWYgKG9wdHMuaW5kaWNhdG9yT3BlbiA9PSBudWxsKSBvcHRzLmluZGljYXRvck9wZW4gPSAiQ29kZU1pcnJvci1mb2xkZ3V0dGVyLW9wZW4iOwogICAgaWYgKG9wdHMuaW5kaWNhdG9yRm9sZGVkID09IG51bGwpIG9wdHMuaW5kaWNhdG9yRm9sZGVkID0gIkNvZGVNaXJyb3ItZm9sZGd1dHRlci1mb2xkZWQiOwogICAgcmV0dXJuIG9wdHM7CiAgfQoKICBmdW5jdGlvbiBpc0ZvbGRlZChjbSwgbGluZSkgewogICAgdmFyIG1hcmtzID0gY20uZmluZE1hcmtzKFBvcyhsaW5lLCAwKSwgUG9zKGxpbmUgKyAxLCAwKSk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1hcmtzLmxlbmd0aDsgKytpKQogICAgICBpZiAobWFya3NbaV0uX19pc0ZvbGQgJiYgbWFya3NbaV0uZmluZCgpLmZyb20ubGluZSA9PSBsaW5lKSByZXR1cm4gbWFya3NbaV07CiAgfQoKICBmdW5jdGlvbiBtYXJrZXIoc3BlYykgewogICAgaWYgKHR5cGVvZiBzcGVjID09ICJzdHJpbmciKSB7CiAgICAgIHZhciBlbHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgICAgZWx0LmNsYXNzTmFtZSA9IHNwZWMgKyAiIENvZGVNaXJyb3ItZ3V0dGVybWFya2VyLXN1YnRsZSI7CiAgICAgIHJldHVybiBlbHQ7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gc3BlYy5jbG9uZU5vZGUodHJ1ZSk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiB1cGRhdGVGb2xkSW5mbyhjbSwgZnJvbSwgdG8pIHsKICAgIHZhciBvcHRzID0gY20uc3RhdGUuZm9sZEd1dHRlci5vcHRpb25zLCBjdXIgPSBmcm9tOwogICAgdmFyIG1pblNpemUgPSBjbS5mb2xkT3B0aW9uKG9wdHMsICJtaW5Gb2xkU2l6ZSIpOwogICAgdmFyIGZ1bmMgPSBjbS5mb2xkT3B0aW9uKG9wdHMsICJyYW5nZUZpbmRlciIpOwogICAgY20uZWFjaExpbmUoZnJvbSwgdG8sIGZ1bmN0aW9uKGxpbmUpIHsKICAgICAgdmFyIG1hcmsgPSBudWxsOwogICAgICBpZiAoaXNGb2xkZWQoY20sIGN1cikpIHsKICAgICAgICBtYXJrID0gbWFya2VyKG9wdHMuaW5kaWNhdG9yRm9sZGVkKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB2YXIgcG9zID0gUG9zKGN1ciwgMCk7CiAgICAgICAgdmFyIHJhbmdlID0gZnVuYyAmJiBmdW5jKGNtLCBwb3MpOwogICAgICAgIGlmIChyYW5nZSAmJiByYW5nZS50by5saW5lIC0gcmFuZ2UuZnJvbS5saW5lID49IG1pblNpemUpCiAgICAgICAgICBtYXJrID0gbWFya2VyKG9wdHMuaW5kaWNhdG9yT3Blbik7CiAgICAgIH0KICAgICAgY20uc2V0R3V0dGVyTWFya2VyKGxpbmUsIG9wdHMuZ3V0dGVyLCBtYXJrKTsKICAgICAgKytjdXI7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIHVwZGF0ZUluVmlld3BvcnQoY20pIHsKICAgIHZhciB2cCA9IGNtLmdldFZpZXdwb3J0KCksIHN0YXRlID0gY20uc3RhdGUuZm9sZEd1dHRlcjsKICAgIGlmICghc3RhdGUpIHJldHVybjsKICAgIGNtLm9wZXJhdGlvbihmdW5jdGlvbigpIHsKICAgICAgdXBkYXRlRm9sZEluZm8oY20sIHZwLmZyb20sIHZwLnRvKTsKICAgIH0pOwogICAgc3RhdGUuZnJvbSA9IHZwLmZyb207IHN0YXRlLnRvID0gdnAudG87CiAgfQoKICBmdW5jdGlvbiBvbkd1dHRlckNsaWNrKGNtLCBsaW5lLCBndXR0ZXIpIHsKICAgIHZhciBzdGF0ZSA9IGNtLnN0YXRlLmZvbGRHdXR0ZXI7CiAgICBpZiAoIXN0YXRlKSByZXR1cm47CiAgICB2YXIgb3B0cyA9IHN0YXRlLm9wdGlvbnM7CiAgICBpZiAoZ3V0dGVyICE9IG9wdHMuZ3V0dGVyKSByZXR1cm47CiAgICB2YXIgZm9sZGVkID0gaXNGb2xkZWQoY20sIGxpbmUpOwogICAgaWYgKGZvbGRlZCkgZm9sZGVkLmNsZWFyKCk7CiAgICBlbHNlIGNtLmZvbGRDb2RlKFBvcyhsaW5lLCAwKSwgb3B0cy5yYW5nZUZpbmRlcik7CiAgfQoKICBmdW5jdGlvbiBvbkNoYW5nZShjbSkgewogICAgdmFyIHN0YXRlID0gY20uc3RhdGUuZm9sZEd1dHRlcjsKICAgIGlmICghc3RhdGUpIHJldHVybjsKICAgIHZhciBvcHRzID0gc3RhdGUub3B0aW9uczsKICAgIHN0YXRlLmZyb20gPSBzdGF0ZS50byA9IDA7CiAgICBjbGVhclRpbWVvdXQoc3RhdGUuY2hhbmdlVXBkYXRlKTsKICAgIHN0YXRlLmNoYW5nZVVwZGF0ZSA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IHVwZGF0ZUluVmlld3BvcnQoY20pOyB9LCBvcHRzLmZvbGRPbkNoYW5nZVRpbWVTcGFuIHx8IDYwMCk7CiAgfQoKICBmdW5jdGlvbiBvblZpZXdwb3J0Q2hhbmdlKGNtKSB7CiAgICB2YXIgc3RhdGUgPSBjbS5zdGF0ZS5mb2xkR3V0dGVyOwogICAgaWYgKCFzdGF0ZSkgcmV0dXJuOwogICAgdmFyIG9wdHMgPSBzdGF0ZS5vcHRpb25zOwogICAgY2xlYXJUaW1lb3V0KHN0YXRlLmNoYW5nZVVwZGF0ZSk7CiAgICBzdGF0ZS5jaGFuZ2VVcGRhdGUgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICB2YXIgdnAgPSBjbS5nZXRWaWV3cG9ydCgpOwogICAgICBpZiAoc3RhdGUuZnJvbSA9PSBzdGF0ZS50byB8fCB2cC5mcm9tIC0gc3RhdGUudG8gPiAyMCB8fCBzdGF0ZS5mcm9tIC0gdnAudG8gPiAyMCkgewogICAgICAgIHVwZGF0ZUluVmlld3BvcnQoY20pOwogICAgICB9IGVsc2UgewogICAgICAgIGNtLm9wZXJhdGlvbihmdW5jdGlvbigpIHsKICAgICAgICAgIGlmICh2cC5mcm9tIDwgc3RhdGUuZnJvbSkgewogICAgICAgICAgICB1cGRhdGVGb2xkSW5mbyhjbSwgdnAuZnJvbSwgc3RhdGUuZnJvbSk7CiAgICAgICAgICAgIHN0YXRlLmZyb20gPSB2cC5mcm9tOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHZwLnRvID4gc3RhdGUudG8pIHsKICAgICAgICAgICAgdXBkYXRlRm9sZEluZm8oY20sIHN0YXRlLnRvLCB2cC50byk7CiAgICAgICAgICAgIHN0YXRlLnRvID0gdnAudG87CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0sIG9wdHMudXBkYXRlVmlld3BvcnRUaW1lU3BhbiB8fCA0MDApOwogIH0KCiAgZnVuY3Rpb24gb25Gb2xkKGNtLCBmcm9tKSB7CiAgICB2YXIgc3RhdGUgPSBjbS5zdGF0ZS5mb2xkR3V0dGVyOwogICAgaWYgKCFzdGF0ZSkgcmV0dXJuOwogICAgdmFyIGxpbmUgPSBmcm9tLmxpbmU7CiAgICBpZiAobGluZSA+PSBzdGF0ZS5mcm9tICYmIGxpbmUgPCBzdGF0ZS50bykKICAgICAgdXBkYXRlRm9sZEluZm8oY20sIGxpbmUsIGxpbmUgKyAxKTsKICB9Cn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/fold/indent-fold.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5yZWdpc3RlckhlbHBlcigiZm9sZCIsICJpbmRlbnQiLCBmdW5jdGlvbihjbSwgc3RhcnQpIHsKICB2YXIgdGFiU2l6ZSA9IGNtLmdldE9wdGlvbigidGFiU2l6ZSIpLCBmaXJzdExpbmUgPSBjbS5nZXRMaW5lKHN0YXJ0LmxpbmUpOwogIGlmICghL1xTLy50ZXN0KGZpcnN0TGluZSkpIHJldHVybjsKICB2YXIgZ2V0SW5kZW50ID0gZnVuY3Rpb24obGluZSkgewogICAgcmV0dXJuIENvZGVNaXJyb3IuY291bnRDb2x1bW4obGluZSwgbnVsbCwgdGFiU2l6ZSk7CiAgfTsKICB2YXIgbXlJbmRlbnQgPSBnZXRJbmRlbnQoZmlyc3RMaW5lKTsKICB2YXIgbGFzdExpbmVJbkZvbGQgPSBudWxsOwogIC8vIEdvIHRocm91Z2ggbGluZXMgdW50aWwgd2UgZmluZCBhIGxpbmUgdGhhdCBkZWZpbml0ZWx5IGRvZXNuJ3QgYmVsb25nIGluCiAgLy8gdGhlIGJsb2NrIHdlJ3JlIGZvbGRpbmcsIG9yIHRvIHRoZSBlbmQuCiAgZm9yICh2YXIgaSA9IHN0YXJ0LmxpbmUgKyAxLCBlbmQgPSBjbS5sYXN0TGluZSgpOyBpIDw9IGVuZDsgKytpKSB7CiAgICB2YXIgY3VyTGluZSA9IGNtLmdldExpbmUoaSk7CiAgICB2YXIgY3VySW5kZW50ID0gZ2V0SW5kZW50KGN1ckxpbmUpOwogICAgaWYgKGN1ckluZGVudCA+IG15SW5kZW50KSB7CiAgICAgIC8vIExpbmVzIHdpdGggYSBncmVhdGVyIGluZGVudCBhcmUgY29uc2lkZXJlZCBwYXJ0IG9mIHRoZSBibG9jay4KICAgICAgbGFzdExpbmVJbkZvbGQgPSBpOwogICAgfSBlbHNlIGlmICghL1xTLy50ZXN0KGN1ckxpbmUpKSB7CiAgICAgIC8vIEVtcHR5IGxpbmVzIG1pZ2h0IGJlIGJyZWFrcyB3aXRoaW4gdGhlIGJsb2NrIHdlJ3JlIHRyeWluZyB0byBmb2xkLgogICAgfSBlbHNlIHsKICAgICAgLy8gQSBub24tZW1wdHkgbGluZSBhdCBhbiBpbmRlbnQgZXF1YWwgdG8gb3IgbGVzcyB0aGFuIG91cnMgbWFya3MgdGhlCiAgICAgIC8vIHN0YXJ0IG9mIGFub3RoZXIgYmxvY2suCiAgICAgIGJyZWFrOwogICAgfQogIH0KICBpZiAobGFzdExpbmVJbkZvbGQpIHJldHVybiB7CiAgICBmcm9tOiBDb2RlTWlycm9yLlBvcyhzdGFydC5saW5lLCBmaXJzdExpbmUubGVuZ3RoKSwKICAgIHRvOiBDb2RlTWlycm9yLlBvcyhsYXN0TGluZUluRm9sZCwgY20uZ2V0TGluZShsYXN0TGluZUluRm9sZCkubGVuZ3RoKQogIH07Cn0pOwoKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/fold/markdown-fold.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5yZWdpc3RlckhlbHBlcigiZm9sZCIsICJtYXJrZG93biIsIGZ1bmN0aW9uKGNtLCBzdGFydCkgewogIHZhciBtYXhEZXB0aCA9IDEwMDsKCiAgZnVuY3Rpb24gaXNIZWFkZXIobGluZU5vKSB7CiAgICB2YXIgdG9rZW50eXBlID0gY20uZ2V0VG9rZW5UeXBlQXQoQ29kZU1pcnJvci5Qb3MobGluZU5vLCAwKSk7CiAgICByZXR1cm4gdG9rZW50eXBlICYmIC9cYmhlYWRlclxiLy50ZXN0KHRva2VudHlwZSk7CiAgfQoKICBmdW5jdGlvbiBoZWFkZXJMZXZlbChsaW5lTm8sIGxpbmUsIG5leHRMaW5lKSB7CiAgICB2YXIgbWF0Y2ggPSBsaW5lICYmIGxpbmUubWF0Y2goL14jKy8pOwogICAgaWYgKG1hdGNoICYmIGlzSGVhZGVyKGxpbmVObykpIHJldHVybiBtYXRjaFswXS5sZW5ndGg7CiAgICBtYXRjaCA9IG5leHRMaW5lICYmIG5leHRMaW5lLm1hdGNoKC9eWz1cLV0rXHMqJC8pOwogICAgaWYgKG1hdGNoICYmIGlzSGVhZGVyKGxpbmVObyArIDEpKSByZXR1cm4gbmV4dExpbmVbMF0gPT0gIj0iID8gMSA6IDI7CiAgICByZXR1cm4gbWF4RGVwdGg7CiAgfQoKICB2YXIgZmlyc3RMaW5lID0gY20uZ2V0TGluZShzdGFydC5saW5lKSwgbmV4dExpbmUgPSBjbS5nZXRMaW5lKHN0YXJ0LmxpbmUgKyAxKTsKICB2YXIgbGV2ZWwgPSBoZWFkZXJMZXZlbChzdGFydC5saW5lLCBmaXJzdExpbmUsIG5leHRMaW5lKTsKICBpZiAobGV2ZWwgPT09IG1heERlcHRoKSByZXR1cm4gdW5kZWZpbmVkOwoKICB2YXIgbGFzdExpbmVObyA9IGNtLmxhc3RMaW5lKCk7CiAgdmFyIGVuZCA9IHN0YXJ0LmxpbmUsIG5leHROZXh0TGluZSA9IGNtLmdldExpbmUoZW5kICsgMik7CiAgd2hpbGUgKGVuZCA8IGxhc3RMaW5lTm8pIHsKICAgIGlmIChoZWFkZXJMZXZlbChlbmQgKyAxLCBuZXh0TGluZSwgbmV4dE5leHRMaW5lKSA8PSBsZXZlbCkgYnJlYWs7CiAgICArK2VuZDsKICAgIG5leHRMaW5lID0gbmV4dE5leHRMaW5lOwogICAgbmV4dE5leHRMaW5lID0gY20uZ2V0TGluZShlbmQgKyAyKTsKICB9CgogIHJldHVybiB7CiAgICBmcm9tOiBDb2RlTWlycm9yLlBvcyhzdGFydC5saW5lLCBmaXJzdExpbmUubGVuZ3RoKSwKICAgIHRvOiBDb2RlTWlycm9yLlBvcyhlbmQsIGNtLmdldExpbmUoZW5kKS5sZW5ndGgpCiAgfTsKfSk7Cgp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/fold/xml-fold.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CgogIHZhciBQb3MgPSBDb2RlTWlycm9yLlBvczsKICBmdW5jdGlvbiBjbXAoYSwgYikgeyByZXR1cm4gYS5saW5lIC0gYi5saW5lIHx8IGEuY2ggLSBiLmNoOyB9CgogIHZhciBuYW1lU3RhcnRDaGFyID0gIkEtWl9hLXpcXHUwMEMwLVxcdTAwRDZcXHUwMEQ4LVxcdTAwRjZcXHUwMEY4LVxcdTAyRkZcXHUwMzcwLVxcdTAzN0RcXHUwMzdGLVxcdTFGRkZcXHUyMDBDLVxcdTIwMERcXHUyMDcwLVxcdTIxOEZcXHUyQzAwLVxcdTJGRUZcXHUzMDAxLVxcdUQ3RkZcXHVGOTAwLVxcdUZEQ0ZcXHVGREYwLVxcdUZGRkQiOwogIHZhciBuYW1lQ2hhciA9IG5hbWVTdGFydENoYXIgKyAiXC1cOlwuMC05XFx1MDBCN1xcdTAzMDAtXFx1MDM2RlxcdTIwM0YtXFx1MjA0MCI7CiAgdmFyIHhtbFRhZ1N0YXJ0ID0gbmV3IFJlZ0V4cCgiPCgvPykoWyIgKyBuYW1lU3RhcnRDaGFyICsgIl1bIiArIG5hbWVDaGFyICsgIl0qKSIsICJnIik7CgogIGZ1bmN0aW9uIEl0ZXIoY20sIGxpbmUsIGNoLCByYW5nZSkgewogICAgdGhpcy5saW5lID0gbGluZTsgdGhpcy5jaCA9IGNoOwogICAgdGhpcy5jbSA9IGNtOyB0aGlzLnRleHQgPSBjbS5nZXRMaW5lKGxpbmUpOwogICAgdGhpcy5taW4gPSByYW5nZSA/IE1hdGgubWF4KHJhbmdlLmZyb20sIGNtLmZpcnN0TGluZSgpKSA6IGNtLmZpcnN0TGluZSgpOwogICAgdGhpcy5tYXggPSByYW5nZSA/IE1hdGgubWluKHJhbmdlLnRvIC0gMSwgY20ubGFzdExpbmUoKSkgOiBjbS5sYXN0TGluZSgpOwogIH0KCiAgZnVuY3Rpb24gdGFnQXQoaXRlciwgY2gpIHsKICAgIHZhciB0eXBlID0gaXRlci5jbS5nZXRUb2tlblR5cGVBdChQb3MoaXRlci5saW5lLCBjaCkpOwogICAgcmV0dXJuIHR5cGUgJiYgL1xidGFnXGIvLnRlc3QodHlwZSk7CiAgfQoKICBmdW5jdGlvbiBuZXh0TGluZShpdGVyKSB7CiAgICBpZiAoaXRlci5saW5lID49IGl0ZXIubWF4KSByZXR1cm47CiAgICBpdGVyLmNoID0gMDsKICAgIGl0ZXIudGV4dCA9IGl0ZXIuY20uZ2V0TGluZSgrK2l0ZXIubGluZSk7CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgZnVuY3Rpb24gcHJldkxpbmUoaXRlcikgewogICAgaWYgKGl0ZXIubGluZSA8PSBpdGVyLm1pbikgcmV0dXJuOwogICAgaXRlci50ZXh0ID0gaXRlci5jbS5nZXRMaW5lKC0taXRlci5saW5lKTsKICAgIGl0ZXIuY2ggPSBpdGVyLnRleHQubGVuZ3RoOwogICAgcmV0dXJuIHRydWU7CiAgfQoKICBmdW5jdGlvbiB0b1RhZ0VuZChpdGVyKSB7CiAgICBmb3IgKDs7KSB7CiAgICAgIHZhciBndCA9IGl0ZXIudGV4dC5pbmRleE9mKCI+IiwgaXRlci5jaCk7CiAgICAgIGlmIChndCA9PSAtMSkgeyBpZiAobmV4dExpbmUoaXRlcikpIGNvbnRpbnVlOyBlbHNlIHJldHVybjsgfQogICAgICBpZiAoIXRhZ0F0KGl0ZXIsIGd0ICsgMSkpIHsgaXRlci5jaCA9IGd0ICsgMTsgY29udGludWU7IH0KICAgICAgdmFyIGxhc3RTbGFzaCA9IGl0ZXIudGV4dC5sYXN0SW5kZXhPZigiLyIsIGd0KTsKICAgICAgdmFyIHNlbGZDbG9zZSA9IGxhc3RTbGFzaCA+IC0xICYmICEvXFMvLnRlc3QoaXRlci50ZXh0LnNsaWNlKGxhc3RTbGFzaCArIDEsIGd0KSk7CiAgICAgIGl0ZXIuY2ggPSBndCArIDE7CiAgICAgIHJldHVybiBzZWxmQ2xvc2UgPyAic2VsZkNsb3NlIiA6ICJyZWd1bGFyIjsKICAgIH0KICB9CiAgZnVuY3Rpb24gdG9UYWdTdGFydChpdGVyKSB7CiAgICBmb3IgKDs7KSB7CiAgICAgIHZhciBsdCA9IGl0ZXIuY2ggPyBpdGVyLnRleHQubGFzdEluZGV4T2YoIjwiLCBpdGVyLmNoIC0gMSkgOiAtMTsKICAgICAgaWYgKGx0ID09IC0xKSB7IGlmIChwcmV2TGluZShpdGVyKSkgY29udGludWU7IGVsc2UgcmV0dXJuOyB9CiAgICAgIGlmICghdGFnQXQoaXRlciwgbHQgKyAxKSkgeyBpdGVyLmNoID0gbHQ7IGNvbnRpbnVlOyB9CiAgICAgIHhtbFRhZ1N0YXJ0Lmxhc3RJbmRleCA9IGx0OwogICAgICBpdGVyLmNoID0gbHQ7CiAgICAgIHZhciBtYXRjaCA9IHhtbFRhZ1N0YXJ0LmV4ZWMoaXRlci50ZXh0KTsKICAgICAgaWYgKG1hdGNoICYmIG1hdGNoLmluZGV4ID09IGx0KSByZXR1cm4gbWF0Y2g7CiAgICB9CiAgfQoKICBmdW5jdGlvbiB0b05leHRUYWcoaXRlcikgewogICAgZm9yICg7OykgewogICAgICB4bWxUYWdTdGFydC5sYXN0SW5kZXggPSBpdGVyLmNoOwogICAgICB2YXIgZm91bmQgPSB4bWxUYWdTdGFydC5leGVjKGl0ZXIudGV4dCk7CiAgICAgIGlmICghZm91bmQpIHsgaWYgKG5leHRMaW5lKGl0ZXIpKSBjb250aW51ZTsgZWxzZSByZXR1cm47IH0KICAgICAgaWYgKCF0YWdBdChpdGVyLCBmb3VuZC5pbmRleCArIDEpKSB7IGl0ZXIuY2ggPSBmb3VuZC5pbmRleCArIDE7IGNvbnRpbnVlOyB9CiAgICAgIGl0ZXIuY2ggPSBmb3VuZC5pbmRleCArIGZvdW5kWzBdLmxlbmd0aDsKICAgICAgcmV0dXJuIGZvdW5kOwogICAgfQogIH0KICBmdW5jdGlvbiB0b1ByZXZUYWcoaXRlcikgewogICAgZm9yICg7OykgewogICAgICB2YXIgZ3QgPSBpdGVyLmNoID8gaXRlci50ZXh0Lmxhc3RJbmRleE9mKCI+IiwgaXRlci5jaCAtIDEpIDogLTE7CiAgICAgIGlmIChndCA9PSAtMSkgeyBpZiAocHJldkxpbmUoaXRlcikpIGNvbnRpbnVlOyBlbHNlIHJldHVybjsgfQogICAgICBpZiAoIXRhZ0F0KGl0ZXIsIGd0ICsgMSkpIHsgaXRlci5jaCA9IGd0OyBjb250aW51ZTsgfQogICAgICB2YXIgbGFzdFNsYXNoID0gaXRlci50ZXh0Lmxhc3RJbmRleE9mKCIvIiwgZ3QpOwogICAgICB2YXIgc2VsZkNsb3NlID0gbGFzdFNsYXNoID4gLTEgJiYgIS9cUy8udGVzdChpdGVyLnRleHQuc2xpY2UobGFzdFNsYXNoICsgMSwgZ3QpKTsKICAgICAgaXRlci5jaCA9IGd0ICsgMTsKICAgICAgcmV0dXJuIHNlbGZDbG9zZSA/ICJzZWxmQ2xvc2UiIDogInJlZ3VsYXIiOwogICAgfQogIH0KCiAgZnVuY3Rpb24gZmluZE1hdGNoaW5nQ2xvc2UoaXRlciwgdGFnKSB7CiAgICB2YXIgc3RhY2sgPSBbXTsKICAgIGZvciAoOzspIHsKICAgICAgdmFyIG5leHQgPSB0b05leHRUYWcoaXRlciksIGVuZCwgc3RhcnRMaW5lID0gaXRlci5saW5lLCBzdGFydENoID0gaXRlci5jaCAtIChuZXh0ID8gbmV4dFswXS5sZW5ndGggOiAwKTsKICAgICAgaWYgKCFuZXh0IHx8ICEoZW5kID0gdG9UYWdFbmQoaXRlcikpKSByZXR1cm47CiAgICAgIGlmIChlbmQgPT0gInNlbGZDbG9zZSIpIGNvbnRpbnVlOwogICAgICBpZiAobmV4dFsxXSkgeyAvLyBjbG9zaW5nIHRhZwogICAgICAgIGZvciAodmFyIGkgPSBzdGFjay5sZW5ndGggLSAxOyBpID49IDA7IC0taSkgaWYgKHN0YWNrW2ldID09IG5leHRbMl0pIHsKICAgICAgICAgIHN0YWNrLmxlbmd0aCA9IGk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgaWYgKGkgPCAwICYmICghdGFnIHx8IHRhZyA9PSBuZXh0WzJdKSkgcmV0dXJuIHsKICAgICAgICAgIHRhZzogbmV4dFsyXSwKICAgICAgICAgIGZyb206IFBvcyhzdGFydExpbmUsIHN0YXJ0Q2gpLAogICAgICAgICAgdG86IFBvcyhpdGVyLmxpbmUsIGl0ZXIuY2gpCiAgICAgICAgfTsKICAgICAgfSBlbHNlIHsgLy8gb3BlbmluZyB0YWcKICAgICAgICBzdGFjay5wdXNoKG5leHRbMl0pOwogICAgICB9CiAgICB9CiAgfQogIGZ1bmN0aW9uIGZpbmRNYXRjaGluZ09wZW4oaXRlciwgdGFnKSB7CiAgICB2YXIgc3RhY2sgPSBbXTsKICAgIGZvciAoOzspIHsKICAgICAgdmFyIHByZXYgPSB0b1ByZXZUYWcoaXRlcik7CiAgICAgIGlmICghcHJldikgcmV0dXJuOwogICAgICBpZiAocHJldiA9PSAic2VsZkNsb3NlIikgeyB0b1RhZ1N0YXJ0KGl0ZXIpOyBjb250aW51ZTsgfQogICAgICB2YXIgZW5kTGluZSA9IGl0ZXIubGluZSwgZW5kQ2ggPSBpdGVyLmNoOwogICAgICB2YXIgc3RhcnQgPSB0b1RhZ1N0YXJ0KGl0ZXIpOwogICAgICBpZiAoIXN0YXJ0KSByZXR1cm47CiAgICAgIGlmIChzdGFydFsxXSkgeyAvLyBjbG9zaW5nIHRhZwogICAgICAgIHN0YWNrLnB1c2goc3RhcnRbMl0pOwogICAgICB9IGVsc2UgeyAvLyBvcGVuaW5nIHRhZwogICAgICAgIGZvciAodmFyIGkgPSBzdGFjay5sZW5ndGggLSAxOyBpID49IDA7IC0taSkgaWYgKHN0YWNrW2ldID09IHN0YXJ0WzJdKSB7CiAgICAgICAgICBzdGFjay5sZW5ndGggPSBpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmIChpIDwgMCAmJiAoIXRhZyB8fCB0YWcgPT0gc3RhcnRbMl0pKSByZXR1cm4gewogICAgICAgICAgdGFnOiBzdGFydFsyXSwKICAgICAgICAgIGZyb206IFBvcyhpdGVyLmxpbmUsIGl0ZXIuY2gpLAogICAgICAgICAgdG86IFBvcyhlbmRMaW5lLCBlbmRDaCkKICAgICAgICB9OwogICAgICB9CiAgICB9CiAgfQoKICBDb2RlTWlycm9yLnJlZ2lzdGVySGVscGVyKCJmb2xkIiwgInhtbCIsIGZ1bmN0aW9uKGNtLCBzdGFydCkgewogICAgdmFyIGl0ZXIgPSBuZXcgSXRlcihjbSwgc3RhcnQubGluZSwgMCk7CiAgICBmb3IgKDs7KSB7CiAgICAgIHZhciBvcGVuVGFnID0gdG9OZXh0VGFnKGl0ZXIpLCBlbmQ7CiAgICAgIGlmICghb3BlblRhZyB8fCBpdGVyLmxpbmUgIT0gc3RhcnQubGluZSB8fCAhKGVuZCA9IHRvVGFnRW5kKGl0ZXIpKSkgcmV0dXJuOwogICAgICBpZiAoIW9wZW5UYWdbMV0gJiYgZW5kICE9ICJzZWxmQ2xvc2UiKSB7CiAgICAgICAgdmFyIHN0YXJ0UG9zID0gUG9zKGl0ZXIubGluZSwgaXRlci5jaCk7CiAgICAgICAgdmFyIGVuZFBvcyA9IGZpbmRNYXRjaGluZ0Nsb3NlKGl0ZXIsIG9wZW5UYWdbMl0pOwogICAgICAgIHJldHVybiBlbmRQb3MgJiYge2Zyb206IHN0YXJ0UG9zLCB0bzogZW5kUG9zLmZyb219OwogICAgICB9CiAgICB9CiAgfSk7CiAgQ29kZU1pcnJvci5maW5kTWF0Y2hpbmdUYWcgPSBmdW5jdGlvbihjbSwgcG9zLCByYW5nZSkgewogICAgdmFyIGl0ZXIgPSBuZXcgSXRlcihjbSwgcG9zLmxpbmUsIHBvcy5jaCwgcmFuZ2UpOwogICAgaWYgKGl0ZXIudGV4dC5pbmRleE9mKCI+IikgPT0gLTEgJiYgaXRlci50ZXh0LmluZGV4T2YoIjwiKSA9PSAtMSkgcmV0dXJuOwogICAgdmFyIGVuZCA9IHRvVGFnRW5kKGl0ZXIpLCB0byA9IGVuZCAmJiBQb3MoaXRlci5saW5lLCBpdGVyLmNoKTsKICAgIHZhciBzdGFydCA9IGVuZCAmJiB0b1RhZ1N0YXJ0KGl0ZXIpOwogICAgaWYgKCFlbmQgfHwgIXN0YXJ0IHx8IGNtcChpdGVyLCBwb3MpID4gMCkgcmV0dXJuOwogICAgdmFyIGhlcmUgPSB7ZnJvbTogUG9zKGl0ZXIubGluZSwgaXRlci5jaCksIHRvOiB0bywgdGFnOiBzdGFydFsyXX07CiAgICBpZiAoZW5kID09ICJzZWxmQ2xvc2UiKSByZXR1cm4ge29wZW46IGhlcmUsIGNsb3NlOiBudWxsLCBhdDogIm9wZW4ifTsKCiAgICBpZiAoc3RhcnRbMV0pIHsgLy8gY2xvc2luZyB0YWcKICAgICAgcmV0dXJuIHtvcGVuOiBmaW5kTWF0Y2hpbmdPcGVuKGl0ZXIsIHN0YXJ0WzJdKSwgY2xvc2U6IGhlcmUsIGF0OiAiY2xvc2UifTsKICAgIH0gZWxzZSB7IC8vIG9wZW5pbmcgdGFnCiAgICAgIGl0ZXIgPSBuZXcgSXRlcihjbSwgdG8ubGluZSwgdG8uY2gsIHJhbmdlKTsKICAgICAgcmV0dXJuIHtvcGVuOiBoZXJlLCBjbG9zZTogZmluZE1hdGNoaW5nQ2xvc2UoaXRlciwgc3RhcnRbMl0pLCBhdDogIm9wZW4ifTsKICAgIH0KICB9OwoKICBDb2RlTWlycm9yLmZpbmRFbmNsb3NpbmdUYWcgPSBmdW5jdGlvbihjbSwgcG9zLCByYW5nZSkgewogICAgdmFyIGl0ZXIgPSBuZXcgSXRlcihjbSwgcG9zLmxpbmUsIHBvcy5jaCwgcmFuZ2UpOwogICAgZm9yICg7OykgewogICAgICB2YXIgb3BlbiA9IGZpbmRNYXRjaGluZ09wZW4oaXRlcik7CiAgICAgIGlmICghb3BlbikgYnJlYWs7CiAgICAgIHZhciBmb3J3YXJkID0gbmV3IEl0ZXIoY20sIHBvcy5saW5lLCBwb3MuY2gsIHJhbmdlKTsKICAgICAgdmFyIGNsb3NlID0gZmluZE1hdGNoaW5nQ2xvc2UoZm9yd2FyZCwgb3Blbi50YWcpOwogICAgICBpZiAoY2xvc2UpIHJldHVybiB7b3Blbjogb3BlbiwgY2xvc2U6IGNsb3NlfTsKICAgIH0KICB9OwoKICAvLyBVc2VkIGJ5IGFkZG9uL2VkaXQvY2xvc2V0YWcuanMKICBDb2RlTWlycm9yLnNjYW5Gb3JDbG9zaW5nVGFnID0gZnVuY3Rpb24oY20sIHBvcywgbmFtZSwgZW5kKSB7CiAgICB2YXIgaXRlciA9IG5ldyBJdGVyKGNtLCBwb3MubGluZSwgcG9zLmNoLCBlbmQgPyB7ZnJvbTogMCwgdG86IGVuZH0gOiBudWxsKTsKICAgIHJldHVybiBmaW5kTWF0Y2hpbmdDbG9zZShpdGVyLCBuYW1lKTsKICB9Owp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/hint/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/hint/anyword-hint.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CgogIHZhciBXT1JEID0gL1tcdyRdKy8sIFJBTkdFID0gNTAwOwoKICBDb2RlTWlycm9yLnJlZ2lzdGVySGVscGVyKCJoaW50IiwgImFueXdvcmQiLCBmdW5jdGlvbihlZGl0b3IsIG9wdGlvbnMpIHsKICAgIHZhciB3b3JkID0gb3B0aW9ucyAmJiBvcHRpb25zLndvcmQgfHwgV09SRDsKICAgIHZhciByYW5nZSA9IG9wdGlvbnMgJiYgb3B0aW9ucy5yYW5nZSB8fCBSQU5HRTsKICAgIHZhciBjdXIgPSBlZGl0b3IuZ2V0Q3Vyc29yKCksIGN1ckxpbmUgPSBlZGl0b3IuZ2V0TGluZShjdXIubGluZSk7CiAgICB2YXIgZW5kID0gY3VyLmNoLCBzdGFydCA9IGVuZDsKICAgIHdoaWxlIChzdGFydCAmJiB3b3JkLnRlc3QoY3VyTGluZS5jaGFyQXQoc3RhcnQgLSAxKSkpIC0tc3RhcnQ7CiAgICB2YXIgY3VyV29yZCA9IHN0YXJ0ICE9IGVuZCAmJiBjdXJMaW5lLnNsaWNlKHN0YXJ0LCBlbmQpOwoKICAgIHZhciBsaXN0ID0gb3B0aW9ucyAmJiBvcHRpb25zLmxpc3QgfHwgW10sIHNlZW4gPSB7fTsKICAgIHZhciByZSA9IG5ldyBSZWdFeHAod29yZC5zb3VyY2UsICJnIik7CiAgICBmb3IgKHZhciBkaXIgPSAtMTsgZGlyIDw9IDE7IGRpciArPSAyKSB7CiAgICAgIHZhciBsaW5lID0gY3VyLmxpbmUsIGVuZExpbmUgPSBNYXRoLm1pbihNYXRoLm1heChsaW5lICsgZGlyICogcmFuZ2UsIGVkaXRvci5maXJzdExpbmUoKSksIGVkaXRvci5sYXN0TGluZSgpKSArIGRpcjsKICAgICAgZm9yICg7IGxpbmUgIT0gZW5kTGluZTsgbGluZSArPSBkaXIpIHsKICAgICAgICB2YXIgdGV4dCA9IGVkaXRvci5nZXRMaW5lKGxpbmUpLCBtOwogICAgICAgIHdoaWxlIChtID0gcmUuZXhlYyh0ZXh0KSkgewogICAgICAgICAgaWYgKGxpbmUgPT0gY3VyLmxpbmUgJiYgbVswXSA9PT0gY3VyV29yZCkgY29udGludWU7CiAgICAgICAgICBpZiAoKCFjdXJXb3JkIHx8IG1bMF0ubGFzdEluZGV4T2YoY3VyV29yZCwgMCkgPT0gMCkgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzZWVuLCBtWzBdKSkgewogICAgICAgICAgICBzZWVuW21bMF1dID0gdHJ1ZTsKICAgICAgICAgICAgbGlzdC5wdXNoKG1bMF0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgcmV0dXJuIHtsaXN0OiBsaXN0LCBmcm9tOiBDb2RlTWlycm9yLlBvcyhjdXIubGluZSwgc3RhcnQpLCB0bzogQ29kZU1pcnJvci5Qb3MoY3VyLmxpbmUsIGVuZCl9OwogIH0pOwp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/hint/css-hint.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSwgcmVxdWlyZSgiLi4vLi4vbW9kZS9jc3MvY3NzIikpOwogIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kKSAvLyBBTUQKICAgIGRlZmluZShbIi4uLy4uL2xpYi9jb2RlbWlycm9yIiwgIi4uLy4uL21vZGUvY3NzL2NzcyJdLCBtb2QpOwogIGVsc2UgLy8gUGxhaW4gYnJvd3NlciBlbnYKICAgIG1vZChDb2RlTWlycm9yKTsKfSkoZnVuY3Rpb24oQ29kZU1pcnJvcikgewogICJ1c2Ugc3RyaWN0IjsKCiAgdmFyIHBzZXVkb0NsYXNzZXMgPSB7bGluazogMSwgdmlzaXRlZDogMSwgYWN0aXZlOiAxLCBob3ZlcjogMSwgZm9jdXM6IDEsCiAgICAgICAgICAgICAgICAgICAgICAgImZpcnN0LWxldHRlciI6IDEsICJmaXJzdC1saW5lIjogMSwgImZpcnN0LWNoaWxkIjogMSwKICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmU6IDEsIGFmdGVyOiAxLCBsYW5nOiAxfTsKCiAgQ29kZU1pcnJvci5yZWdpc3RlckhlbHBlcigiaGludCIsICJjc3MiLCBmdW5jdGlvbihjbSkgewogICAgdmFyIGN1ciA9IGNtLmdldEN1cnNvcigpLCB0b2tlbiA9IGNtLmdldFRva2VuQXQoY3VyKTsKICAgIHZhciBpbm5lciA9IENvZGVNaXJyb3IuaW5uZXJNb2RlKGNtLmdldE1vZGUoKSwgdG9rZW4uc3RhdGUpOwogICAgaWYgKGlubmVyLm1vZGUubmFtZSAhPSAiY3NzIikgcmV0dXJuOwoKICAgIGlmICh0b2tlbi50eXBlID09ICJrZXl3b3JkIiAmJiAiIWltcG9ydGFudCIuaW5kZXhPZih0b2tlbi5zdHJpbmcpID09IDApCiAgICAgIHJldHVybiB7bGlzdDogWyIhaW1wb3J0YW50Il0sIGZyb206IENvZGVNaXJyb3IuUG9zKGN1ci5saW5lLCB0b2tlbi5zdGFydCksCiAgICAgICAgICAgICAgdG86IENvZGVNaXJyb3IuUG9zKGN1ci5saW5lLCB0b2tlbi5lbmQpfTsKCiAgICB2YXIgc3RhcnQgPSB0b2tlbi5zdGFydCwgZW5kID0gY3VyLmNoLCB3b3JkID0gdG9rZW4uc3RyaW5nLnNsaWNlKDAsIGVuZCAtIHN0YXJ0KTsKICAgIGlmICgvW15cdyRfLV0vLnRlc3Qod29yZCkpIHsKICAgICAgd29yZCA9ICIiOyBzdGFydCA9IGVuZCA9IGN1ci5jaDsKICAgIH0KCiAgICB2YXIgc3BlYyA9IENvZGVNaXJyb3IucmVzb2x2ZU1vZGUoInRleHQvY3NzIik7CgogICAgdmFyIHJlc3VsdCA9IFtdOwogICAgZnVuY3Rpb24gYWRkKGtleXdvcmRzKSB7CiAgICAgIGZvciAodmFyIG5hbWUgaW4ga2V5d29yZHMpCiAgICAgICAgaWYgKCF3b3JkIHx8IG5hbWUubGFzdEluZGV4T2Yod29yZCwgMCkgPT0gMCkKICAgICAgICAgIHJlc3VsdC5wdXNoKG5hbWUpOwogICAgfQoKICAgIHZhciBzdCA9IGlubmVyLnN0YXRlLnN0YXRlOwogICAgaWYgKHN0ID09ICJwc2V1ZG8iIHx8IHRva2VuLnR5cGUgPT0gInZhcmlhYmxlLTMiKSB7CiAgICAgIGFkZChwc2V1ZG9DbGFzc2VzKTsKICAgIH0gZWxzZSBpZiAoc3QgPT0gImJsb2NrIiB8fCBzdCA9PSAibWF5YmVwcm9wIikgewogICAgICBhZGQoc3BlYy5wcm9wZXJ0eUtleXdvcmRzKTsKICAgIH0gZWxzZSBpZiAoc3QgPT0gInByb3AiIHx8IHN0ID09ICJwYXJlbnMiIHx8IHN0ID09ICJhdCIgfHwgc3QgPT0gInBhcmFtcyIpIHsKICAgICAgYWRkKHNwZWMudmFsdWVLZXl3b3Jkcyk7CiAgICAgIGFkZChzcGVjLmNvbG9yS2V5d29yZHMpOwogICAgfSBlbHNlIGlmIChzdCA9PSAibWVkaWEiIHx8IHN0ID09ICJtZWRpYV9wYXJlbnMiKSB7CiAgICAgIGFkZChzcGVjLm1lZGlhVHlwZXMpOwogICAgICBhZGQoc3BlYy5tZWRpYUZlYXR1cmVzKTsKICAgIH0KCiAgICBpZiAocmVzdWx0Lmxlbmd0aCkgcmV0dXJuIHsKICAgICAgbGlzdDogcmVzdWx0LAogICAgICBmcm9tOiBDb2RlTWlycm9yLlBvcyhjdXIubGluZSwgc3RhcnQpLAogICAgICB0bzogQ29kZU1pcnJvci5Qb3MoY3VyLmxpbmUsIGVuZCkKICAgIH07CiAgfSk7Cn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/hint/html-hint.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSwgcmVxdWlyZSgiLi94bWwtaGludCIpKTsKICBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCkgLy8gQU1ECiAgICBkZWZpbmUoWyIuLi8uLi9saWIvY29kZW1pcnJvciIsICIuL3htbC1oaW50Il0sIG1vZCk7CiAgZWxzZSAvLyBQbGFpbiBicm93c2VyIGVudgogICAgbW9kKENvZGVNaXJyb3IpOwp9KShmdW5jdGlvbihDb2RlTWlycm9yKSB7CiAgInVzZSBzdHJpY3QiOwoKICB2YXIgbGFuZ3MgPSAiYWIgYWEgYWYgYWsgc3EgYW0gYXIgYW4gaHkgYXMgYXYgYWUgYXkgYXogYm0gYmEgZXUgYmUgYm4gYmggYmkgYnMgYnIgYmcgbXkgY2EgY2ggY2UgbnkgemggY3Yga3cgY28gY3IgaHIgY3MgZGEgZHYgbmwgZHogZW4gZW8gZXQgZWUgZm8gZmogZmkgZnIgZmYgZ2wga2EgZGUgZWwgZ24gZ3UgaHQgaGEgaGUgaHogaGkgaG8gaHUgaWEgaWQgaWUgZ2EgaWcgaWsgaW8gaXMgaXQgaXUgamEganYga2wga24ga3Iga3Mga2sga20ga2kgcncga3kga3Yga2cga28ga3Uga2ogbGEgbGIgbGcgbGkgbG4gbG8gbHQgbHUgbHYgZ3YgbWsgbWcgbXMgbWwgbXQgbWkgbXIgbWggbW4gbmEgbnYgbmIgbmQgbmUgbmcgbm4gbm8gaWkgbnIgb2Mgb2ogY3Ugb20gb3Igb3MgcGEgcGkgZmEgcGwgcHMgcHQgcXUgcm0gcm4gcm8gcnUgc2Egc2Mgc2Qgc2Ugc20gc2cgc3IgZ2Qgc24gc2kgc2sgc2wgc28gc3QgZXMgc3Ugc3cgc3Mgc3YgdGEgdGUgdGcgdGggdGkgYm8gdGsgdGwgdG4gdG8gdHIgdHMgdHQgdHcgdHkgdWcgdWsgdXIgdXogdmUgdmkgdm8gd2EgY3kgd28gZnkgeGggeWkgeW8gemEgenUiLnNwbGl0KCIgIik7CiAgdmFyIHRhcmdldHMgPSBbIl9ibGFuayIsICJfc2VsZiIsICJfdG9wIiwgIl9wYXJlbnQiXTsKICB2YXIgY2hhcnNldHMgPSBbImFzY2lpIiwgInV0Zi04IiwgInV0Zi0xNiIsICJsYXRpbjEiLCAibGF0aW4xIl07CiAgdmFyIG1ldGhvZHMgPSBbImdldCIsICJwb3N0IiwgInB1dCIsICJkZWxldGUiXTsKICB2YXIgZW5jcyA9IFsiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwgIm11bHRpcGFydC9mb3JtLWRhdGEiLCAidGV4dC9wbGFpbiJdOwogIHZhciBtZWRpYSA9IFsiYWxsIiwgInNjcmVlbiIsICJwcmludCIsICJlbWJvc3NlZCIsICJicmFpbGxlIiwgImhhbmRoZWxkIiwgInByaW50IiwgInByb2plY3Rpb24iLCAic2NyZWVuIiwgInR0eSIsICJ0diIsICJzcGVlY2giLAogICAgICAgICAgICAgICAiM2QtZ2xhc3NlcyIsICJyZXNvbHV0aW9uIFs+XVs8XVs9XSBbWF0iLCAiZGV2aWNlLWFzcGVjdC1yYXRpbzogWC9ZIiwgIm9yaWVudGF0aW9uOnBvcnRyYWl0IiwKICAgICAgICAgICAgICAgIm9yaWVudGF0aW9uOmxhbmRzY2FwZSIsICJkZXZpY2UtaGVpZ2h0OiBbWF0iLCAiZGV2aWNlLXdpZHRoOiBbWF0iXTsKICB2YXIgcyA9IHsgYXR0cnM6IHt9IH07IC8vIFNpbXBsZSB0YWcsIHJldXNlZCBmb3IgYSB3aG9sZSBsb3Qgb2YgdGFncwoKICB2YXIgZGF0YSA9IHsKICAgIGE6IHsKICAgICAgYXR0cnM6IHsKICAgICAgICBocmVmOiBudWxsLCBwaW5nOiBudWxsLCB0eXBlOiBudWxsLAogICAgICAgIG1lZGlhOiBtZWRpYSwKICAgICAgICB0YXJnZXQ6IHRhcmdldHMsCiAgICAgICAgaHJlZmxhbmc6IGxhbmdzCiAgICAgIH0KICAgIH0sCiAgICBhYmJyOiBzLAogICAgYWNyb255bTogcywKICAgIGFkZHJlc3M6IHMsCiAgICBhcHBsZXQ6IHMsCiAgICBhcmVhOiB7CiAgICAgIGF0dHJzOiB7CiAgICAgICAgYWx0OiBudWxsLCBjb29yZHM6IG51bGwsIGhyZWY6IG51bGwsIHRhcmdldDogbnVsbCwgcGluZzogbnVsbCwKICAgICAgICBtZWRpYTogbWVkaWEsIGhyZWZsYW5nOiBsYW5ncywgdHlwZTogbnVsbCwKICAgICAgICBzaGFwZTogWyJkZWZhdWx0IiwgInJlY3QiLCAiY2lyY2xlIiwgInBvbHkiXQogICAgICB9CiAgICB9LAogICAgYXJ0aWNsZTogcywKICAgIGFzaWRlOiBzLAogICAgYXVkaW86IHsKICAgICAgYXR0cnM6IHsKICAgICAgICBzcmM6IG51bGwsIG1lZGlhZ3JvdXA6IG51bGwsCiAgICAgICAgY3Jvc3NvcmlnaW46IFsiYW5vbnltb3VzIiwgInVzZS1jcmVkZW50aWFscyJdLAogICAgICAgIHByZWxvYWQ6IFsibm9uZSIsICJtZXRhZGF0YSIsICJhdXRvIl0sCiAgICAgICAgYXV0b3BsYXk6IFsiIiwgImF1dG9wbGF5Il0sCiAgICAgICAgbG9vcDogWyIiLCAibG9vcCJdLAogICAgICAgIGNvbnRyb2xzOiBbIiIsICJjb250cm9scyJdCiAgICAgIH0KICAgIH0sCiAgICBiOiBzLAogICAgYmFzZTogeyBhdHRyczogeyBocmVmOiBudWxsLCB0YXJnZXQ6IHRhcmdldHMgfSB9LAogICAgYmFzZWZvbnQ6IHMsCiAgICBiZGk6IHMsCiAgICBiZG86IHMsCiAgICBiaWc6IHMsCiAgICBibG9ja3F1b3RlOiB7IGF0dHJzOiB7IGNpdGU6IG51bGwgfSB9LAogICAgYm9keTogcywKICAgIGJyOiBzLAogICAgYnV0dG9uOiB7CiAgICAgIGF0dHJzOiB7CiAgICAgICAgZm9ybTogbnVsbCwgZm9ybWFjdGlvbjogbnVsbCwgbmFtZTogbnVsbCwgdmFsdWU6IG51bGwsCiAgICAgICAgYXV0b2ZvY3VzOiBbIiIsICJhdXRvZm9jdXMiXSwKICAgICAgICBkaXNhYmxlZDogWyIiLCAiYXV0b2ZvY3VzIl0sCiAgICAgICAgZm9ybWVuY3R5cGU6IGVuY3MsCiAgICAgICAgZm9ybW1ldGhvZDogbWV0aG9kcywKICAgICAgICBmb3Jtbm92YWxpZGF0ZTogWyIiLCAibm92YWxpZGF0ZSJdLAogICAgICAgIGZvcm10YXJnZXQ6IHRhcmdldHMsCiAgICAgICAgdHlwZTogWyJzdWJtaXQiLCAicmVzZXQiLCAiYnV0dG9uIl0KICAgICAgfQogICAgfSwKICAgIGNhbnZhczogeyBhdHRyczogeyB3aWR0aDogbnVsbCwgaGVpZ2h0OiBudWxsIH0gfSwKICAgIGNhcHRpb246IHMsCiAgICBjZW50ZXI6IHMsCiAgICBjaXRlOiBzLAogICAgY29kZTogcywKICAgIGNvbDogeyBhdHRyczogeyBzcGFuOiBudWxsIH0gfSwKICAgIGNvbGdyb3VwOiB7IGF0dHJzOiB7IHNwYW46IG51bGwgfSB9LAogICAgY29tbWFuZDogewogICAgICBhdHRyczogewogICAgICAgIHR5cGU6IFsiY29tbWFuZCIsICJjaGVja2JveCIsICJyYWRpbyJdLAogICAgICAgIGxhYmVsOiBudWxsLCBpY29uOiBudWxsLCByYWRpb2dyb3VwOiBudWxsLCBjb21tYW5kOiBudWxsLCB0aXRsZTogbnVsbCwKICAgICAgICBkaXNhYmxlZDogWyIiLCAiZGlzYWJsZWQiXSwKICAgICAgICBjaGVja2VkOiBbIiIsICJjaGVja2VkIl0KICAgICAgfQogICAgfSwKICAgIGRhdGE6IHsgYXR0cnM6IHsgdmFsdWU6IG51bGwgfSB9LAogICAgZGF0YWdyaWQ6IHsgYXR0cnM6IHsgZGlzYWJsZWQ6IFsiIiwgImRpc2FibGVkIl0sIG11bHRpcGxlOiBbIiIsICJtdWx0aXBsZSJdIH0gfSwKICAgIGRhdGFsaXN0OiB7IGF0dHJzOiB7IGRhdGE6IG51bGwgfSB9LAogICAgZGQ6IHMsCiAgICBkZWw6IHsgYXR0cnM6IHsgY2l0ZTogbnVsbCwgZGF0ZXRpbWU6IG51bGwgfSB9LAogICAgZGV0YWlsczogeyBhdHRyczogeyBvcGVuOiBbIiIsICJvcGVuIl0gfSB9LAogICAgZGZuOiBzLAogICAgZGlyOiBzLAogICAgZGl2OiBzLAogICAgZGw6IHMsCiAgICBkdDogcywKICAgIGVtOiBzLAogICAgZW1iZWQ6IHsgYXR0cnM6IHsgc3JjOiBudWxsLCB0eXBlOiBudWxsLCB3aWR0aDogbnVsbCwgaGVpZ2h0OiBudWxsIH0gfSwKICAgIGV2ZW50c291cmNlOiB7IGF0dHJzOiB7IHNyYzogbnVsbCB9IH0sCiAgICBmaWVsZHNldDogeyBhdHRyczogeyBkaXNhYmxlZDogWyIiLCAiZGlzYWJsZWQiXSwgZm9ybTogbnVsbCwgbmFtZTogbnVsbCB9IH0sCiAgICBmaWdjYXB0aW9uOiBzLAogICAgZmlndXJlOiBzLAogICAgZm9udDogcywKICAgIGZvb3RlcjogcywKICAgIGZvcm06IHsKICAgICAgYXR0cnM6IHsKICAgICAgICBhY3Rpb246IG51bGwsIG5hbWU6IG51bGwsCiAgICAgICAgImFjY2VwdC1jaGFyc2V0IjogY2hhcnNldHMsCiAgICAgICAgYXV0b2NvbXBsZXRlOiBbIm9uIiwgIm9mZiJdLAogICAgICAgIGVuY3R5cGU6IGVuY3MsCiAgICAgICAgbWV0aG9kOiBtZXRob2RzLAogICAgICAgIG5vdmFsaWRhdGU6IFsiIiwgIm5vdmFsaWRhdGUiXSwKICAgICAgICB0YXJnZXQ6IHRhcmdldHMKICAgICAgfQogICAgfSwKICAgIGZyYW1lOiBzLAogICAgZnJhbWVzZXQ6IHMsCiAgICBoMTogcywgaDI6IHMsIGgzOiBzLCBoNDogcywgaDU6IHMsIGg2OiBzLAogICAgaGVhZDogewogICAgICBhdHRyczoge30sCiAgICAgIGNoaWxkcmVuOiBbInRpdGxlIiwgImJhc2UiLCAibGluayIsICJzdHlsZSIsICJtZXRhIiwgInNjcmlwdCIsICJub3NjcmlwdCIsICJjb21tYW5kIl0KICAgIH0sCiAgICBoZWFkZXI6IHMsCiAgICBoZ3JvdXA6IHMsCiAgICBocjogcywKICAgIGh0bWw6IHsKICAgICAgYXR0cnM6IHsgbWFuaWZlc3Q6IG51bGwgfSwKICAgICAgY2hpbGRyZW46IFsiaGVhZCIsICJib2R5Il0KICAgIH0sCiAgICBpOiBzLAogICAgaWZyYW1lOiB7CiAgICAgIGF0dHJzOiB7CiAgICAgICAgc3JjOiBudWxsLCBzcmNkb2M6IG51bGwsIG5hbWU6IG51bGwsIHdpZHRoOiBudWxsLCBoZWlnaHQ6IG51bGwsCiAgICAgICAgc2FuZGJveDogWyJhbGxvdy10b3AtbmF2aWdhdGlvbiIsICJhbGxvdy1zYW1lLW9yaWdpbiIsICJhbGxvdy1mb3JtcyIsICJhbGxvdy1zY3JpcHRzIl0sCiAgICAgICAgc2VhbWxlc3M6IFsiIiwgInNlYW1sZXNzIl0KICAgICAgfQogICAgfSwKICAgIGltZzogewogICAgICBhdHRyczogewogICAgICAgIGFsdDogbnVsbCwgc3JjOiBudWxsLCBpc21hcDogbnVsbCwgdXNlbWFwOiBudWxsLCB3aWR0aDogbnVsbCwgaGVpZ2h0OiBudWxsLAogICAgICAgIGNyb3Nzb3JpZ2luOiBbImFub255bW91cyIsICJ1c2UtY3JlZGVudGlhbHMiXQogICAgICB9CiAgICB9LAogICAgaW5wdXQ6IHsKICAgICAgYXR0cnM6IHsKICAgICAgICBhbHQ6IG51bGwsIGRpcm5hbWU6IG51bGwsIGZvcm06IG51bGwsIGZvcm1hY3Rpb246IG51bGwsCiAgICAgICAgaGVpZ2h0OiBudWxsLCBsaXN0OiBudWxsLCBtYXg6IG51bGwsIG1heGxlbmd0aDogbnVsbCwgbWluOiBudWxsLAogICAgICAgIG5hbWU6IG51bGwsIHBhdHRlcm46IG51bGwsIHBsYWNlaG9sZGVyOiBudWxsLCBzaXplOiBudWxsLCBzcmM6IG51bGwsCiAgICAgICAgc3RlcDogbnVsbCwgdmFsdWU6IG51bGwsIHdpZHRoOiBudWxsLAogICAgICAgIGFjY2VwdDogWyJhdWRpby8qIiwgInZpZGVvLyoiLCAiaW1hZ2UvKiJdLAogICAgICAgIGF1dG9jb21wbGV0ZTogWyJvbiIsICJvZmYiXSwKICAgICAgICBhdXRvZm9jdXM6IFsiIiwgImF1dG9mb2N1cyJdLAogICAgICAgIGNoZWNrZWQ6IFsiIiwgImNoZWNrZWQiXSwKICAgICAgICBkaXNhYmxlZDogWyIiLCAiZGlzYWJsZWQiXSwKICAgICAgICBmb3JtZW5jdHlwZTogZW5jcywKICAgICAgICBmb3JtbWV0aG9kOiBtZXRob2RzLAogICAgICAgIGZvcm1ub3ZhbGlkYXRlOiBbIiIsICJub3ZhbGlkYXRlIl0sCiAgICAgICAgZm9ybXRhcmdldDogdGFyZ2V0cywKICAgICAgICBtdWx0aXBsZTogWyIiLCAibXVsdGlwbGUiXSwKICAgICAgICByZWFkb25seTogWyIiLCAicmVhZG9ubHkiXSwKICAgICAgICByZXF1aXJlZDogWyIiLCAicmVxdWlyZWQiXSwKICAgICAgICB0eXBlOiBbImhpZGRlbiIsICJ0ZXh0IiwgInNlYXJjaCIsICJ0ZWwiLCAidXJsIiwgImVtYWlsIiwgInBhc3N3b3JkIiwgImRhdGV0aW1lIiwgImRhdGUiLCAibW9udGgiLAogICAgICAgICAgICAgICAid2VlayIsICJ0aW1lIiwgImRhdGV0aW1lLWxvY2FsIiwgIm51bWJlciIsICJyYW5nZSIsICJjb2xvciIsICJjaGVja2JveCIsICJyYWRpbyIsCiAgICAgICAgICAgICAgICJmaWxlIiwgInN1Ym1pdCIsICJpbWFnZSIsICJyZXNldCIsICJidXR0b24iXQogICAgICB9CiAgICB9LAogICAgaW5zOiB7IGF0dHJzOiB7IGNpdGU6IG51bGwsIGRhdGV0aW1lOiBudWxsIH0gfSwKICAgIGtiZDogcywKICAgIGtleWdlbjogewogICAgICBhdHRyczogewogICAgICAgIGNoYWxsZW5nZTogbnVsbCwgZm9ybTogbnVsbCwgbmFtZTogbnVsbCwKICAgICAgICBhdXRvZm9jdXM6IFsiIiwgImF1dG9mb2N1cyJdLAogICAgICAgIGRpc2FibGVkOiBbIiIsICJkaXNhYmxlZCJdLAogICAgICAgIGtleXR5cGU6IFsiUlNBIl0KICAgICAgfQogICAgfSwKICAgIGxhYmVsOiB7IGF0dHJzOiB7ICJmb3IiOiBudWxsLCBmb3JtOiBudWxsIH0gfSwKICAgIGxlZ2VuZDogcywKICAgIGxpOiB7IGF0dHJzOiB7IHZhbHVlOiBudWxsIH0gfSwKICAgIGxpbms6IHsKICAgICAgYXR0cnM6IHsKICAgICAgICBocmVmOiBudWxsLCB0eXBlOiBudWxsLAogICAgICAgIGhyZWZsYW5nOiBsYW5ncywKICAgICAgICBtZWRpYTogbWVkaWEsCiAgICAgICAgc2l6ZXM6IFsiYWxsIiwgIjE2eDE2IiwgIjE2eDE2IDMyeDMyIiwgIjE2eDE2IDMyeDMyIDY0eDY0Il0KICAgICAgfQogICAgfSwKICAgIG1hcDogeyBhdHRyczogeyBuYW1lOiBudWxsIH0gfSwKICAgIG1hcms6IHMsCiAgICBtZW51OiB7IGF0dHJzOiB7IGxhYmVsOiBudWxsLCB0eXBlOiBbImxpc3QiLCAiY29udGV4dCIsICJ0b29sYmFyIl0gfSB9LAogICAgbWV0YTogewogICAgICBhdHRyczogewogICAgICAgIGNvbnRlbnQ6IG51bGwsCiAgICAgICAgY2hhcnNldDogY2hhcnNldHMsCiAgICAgICAgbmFtZTogWyJ2aWV3cG9ydCIsICJhcHBsaWNhdGlvbi1uYW1lIiwgImF1dGhvciIsICJkZXNjcmlwdGlvbiIsICJnZW5lcmF0b3IiLCAia2V5d29yZHMiXSwKICAgICAgICAiaHR0cC1lcXVpdiI6IFsiY29udGVudC1sYW5ndWFnZSIsICJjb250ZW50LXR5cGUiLCAiZGVmYXVsdC1zdHlsZSIsICJyZWZyZXNoIl0KICAgICAgfQogICAgfSwKICAgIG1ldGVyOiB7IGF0dHJzOiB7IHZhbHVlOiBudWxsLCBtaW46IG51bGwsIGxvdzogbnVsbCwgaGlnaDogbnVsbCwgbWF4OiBudWxsLCBvcHRpbXVtOiBudWxsIH0gfSwKICAgIG5hdjogcywKICAgIG5vZnJhbWVzOiBzLAogICAgbm9zY3JpcHQ6IHMsCiAgICBvYmplY3Q6IHsKICAgICAgYXR0cnM6IHsKICAgICAgICBkYXRhOiBudWxsLCB0eXBlOiBudWxsLCBuYW1lOiBudWxsLCB1c2VtYXA6IG51bGwsIGZvcm06IG51bGwsIHdpZHRoOiBudWxsLCBoZWlnaHQ6IG51bGwsCiAgICAgICAgdHlwZW11c3RtYXRjaDogWyIiLCAidHlwZW11c3RtYXRjaCJdCiAgICAgIH0KICAgIH0sCiAgICBvbDogeyBhdHRyczogeyByZXZlcnNlZDogWyIiLCAicmV2ZXJzZWQiXSwgc3RhcnQ6IG51bGwsIHR5cGU6IFsiMSIsICJhIiwgIkEiLCAiaSIsICJJIl0gfSB9LAogICAgb3B0Z3JvdXA6IHsgYXR0cnM6IHsgZGlzYWJsZWQ6IFsiIiwgImRpc2FibGVkIl0sIGxhYmVsOiBudWxsIH0gfSwKICAgIG9wdGlvbjogeyBhdHRyczogeyBkaXNhYmxlZDogWyIiLCAiZGlzYWJsZWQiXSwgbGFiZWw6IG51bGwsIHNlbGVjdGVkOiBbIiIsICJzZWxlY3RlZCJdLCB2YWx1ZTogbnVsbCB9IH0sCiAgICBvdXRwdXQ6IHsgYXR0cnM6IHsgImZvciI6IG51bGwsIGZvcm06IG51bGwsIG5hbWU6IG51bGwgfSB9LAogICAgcDogcywKICAgIHBhcmFtOiB7IGF0dHJzOiB7IG5hbWU6IG51bGwsIHZhbHVlOiBudWxsIH0gfSwKICAgIHByZTogcywKICAgIHByb2dyZXNzOiB7IGF0dHJzOiB7IHZhbHVlOiBudWxsLCBtYXg6IG51bGwgfSB9LAogICAgcTogeyBhdHRyczogeyBjaXRlOiBudWxsIH0gfSwKICAgIHJwOiBzLAogICAgcnQ6IHMsCiAgICBydWJ5OiBzLAogICAgczogcywKICAgIHNhbXA6IHMsCiAgICBzY3JpcHQ6IHsKICAgICAgYXR0cnM6IHsKICAgICAgICB0eXBlOiBbInRleHQvamF2YXNjcmlwdCJdLAogICAgICAgIHNyYzogbnVsbCwKICAgICAgICBhc3luYzogWyIiLCAiYXN5bmMiXSwKICAgICAgICBkZWZlcjogWyIiLCAiZGVmZXIiXSwKICAgICAgICBjaGFyc2V0OiBjaGFyc2V0cwogICAgICB9CiAgICB9LAogICAgc2VjdGlvbjogcywKICAgIHNlbGVjdDogewogICAgICBhdHRyczogewogICAgICAgIGZvcm06IG51bGwsIG5hbWU6IG51bGwsIHNpemU6IG51bGwsCiAgICAgICAgYXV0b2ZvY3VzOiBbIiIsICJhdXRvZm9jdXMiXSwKICAgICAgICBkaXNhYmxlZDogWyIiLCAiZGlzYWJsZWQiXSwKICAgICAgICBtdWx0aXBsZTogWyIiLCAibXVsdGlwbGUiXQogICAgICB9CiAgICB9LAogICAgc21hbGw6IHMsCiAgICBzb3VyY2U6IHsgYXR0cnM6IHsgc3JjOiBudWxsLCB0eXBlOiBudWxsLCBtZWRpYTogbnVsbCB9IH0sCiAgICBzcGFuOiBzLAogICAgc3RyaWtlOiBzLAogICAgc3Ryb25nOiBzLAogICAgc3R5bGU6IHsKICAgICAgYXR0cnM6IHsKICAgICAgICB0eXBlOiBbInRleHQvY3NzIl0sCiAgICAgICAgbWVkaWE6IG1lZGlhLAogICAgICAgIHNjb3BlZDogbnVsbAogICAgICB9CiAgICB9LAogICAgc3ViOiBzLAogICAgc3VtbWFyeTogcywKICAgIHN1cDogcywKICAgIHRhYmxlOiBzLAogICAgdGJvZHk6IHMsCiAgICB0ZDogeyBhdHRyczogeyBjb2xzcGFuOiBudWxsLCByb3dzcGFuOiBudWxsLCBoZWFkZXJzOiBudWxsIH0gfSwKICAgIHRleHRhcmVhOiB7CiAgICAgIGF0dHJzOiB7CiAgICAgICAgZGlybmFtZTogbnVsbCwgZm9ybTogbnVsbCwgbWF4bGVuZ3RoOiBudWxsLCBuYW1lOiBudWxsLCBwbGFjZWhvbGRlcjogbnVsbCwKICAgICAgICByb3dzOiBudWxsLCBjb2xzOiBudWxsLAogICAgICAgIGF1dG9mb2N1czogWyIiLCAiYXV0b2ZvY3VzIl0sCiAgICAgICAgZGlzYWJsZWQ6IFsiIiwgImRpc2FibGVkIl0sCiAgICAgICAgcmVhZG9ubHk6IFsiIiwgInJlYWRvbmx5Il0sCiAgICAgICAgcmVxdWlyZWQ6IFsiIiwgInJlcXVpcmVkIl0sCiAgICAgICAgd3JhcDogWyJzb2Z0IiwgImhhcmQiXQogICAgICB9CiAgICB9LAogICAgdGZvb3Q6IHMsCiAgICB0aDogeyBhdHRyczogeyBjb2xzcGFuOiBudWxsLCByb3dzcGFuOiBudWxsLCBoZWFkZXJzOiBudWxsLCBzY29wZTogWyJyb3ciLCAiY29sIiwgInJvd2dyb3VwIiwgImNvbGdyb3VwIl0gfSB9LAogICAgdGhlYWQ6IHMsCiAgICB0aW1lOiB7IGF0dHJzOiB7IGRhdGV0aW1lOiBudWxsIH0gfSwKICAgIHRpdGxlOiBzLAogICAgdHI6IHMsCiAgICB0cmFjazogewogICAgICBhdHRyczogewogICAgICAgIHNyYzogbnVsbCwgbGFiZWw6IG51bGwsICJkZWZhdWx0IjogbnVsbCwKICAgICAgICBraW5kOiBbInN1YnRpdGxlcyIsICJjYXB0aW9ucyIsICJkZXNjcmlwdGlvbnMiLCAiY2hhcHRlcnMiLCAibWV0YWRhdGEiXSwKICAgICAgICBzcmNsYW5nOiBsYW5ncwogICAgICB9CiAgICB9LAogICAgdHQ6IHMsCiAgICB1OiBzLAogICAgdWw6IHMsCiAgICAidmFyIjogcywKICAgIHZpZGVvOiB7CiAgICAgIGF0dHJzOiB7CiAgICAgICAgc3JjOiBudWxsLCBwb3N0ZXI6IG51bGwsIHdpZHRoOiBudWxsLCBoZWlnaHQ6IG51bGwsCiAgICAgICAgY3Jvc3NvcmlnaW46IFsiYW5vbnltb3VzIiwgInVzZS1jcmVkZW50aWFscyJdLAogICAgICAgIHByZWxvYWQ6IFsiYXV0byIsICJtZXRhZGF0YSIsICJub25lIl0sCiAgICAgICAgYXV0b3BsYXk6IFsiIiwgImF1dG9wbGF5Il0sCiAgICAgICAgbWVkaWFncm91cDogWyJtb3ZpZSJdLAogICAgICAgIG11dGVkOiBbIiIsICJtdXRlZCJdLAogICAgICAgIGNvbnRyb2xzOiBbIiIsICJjb250cm9scyJdCiAgICAgIH0KICAgIH0sCiAgICB3YnI6IHMKICB9OwoKICB2YXIgZ2xvYmFsQXR0cnMgPSB7CiAgICBhY2Nlc3NrZXk6IFsiYSIsICJiIiwgImMiLCAiZCIsICJlIiwgImYiLCAiZyIsICJoIiwgImkiLCAiaiIsICJrIiwgImwiLCAibSIsICJuIiwgIm8iLCAicCIsICJxIiwgInIiLCAicyIsICJ0IiwgInUiLCAidiIsICJ3IiwgIngiLCAieSIsICJ6IiwgIjAiLCAiMSIsICIyIiwgIjMiLCAiNCIsICI1IiwgIjYiLCAiNyIsICI4IiwgIjkiXSwKICAgICJjbGFzcyI6IG51bGwsCiAgICBjb250ZW50ZWRpdGFibGU6IFsidHJ1ZSIsICJmYWxzZSJdLAogICAgY29udGV4dG1lbnU6IG51bGwsCiAgICBkaXI6IFsibHRyIiwgInJ0bCIsICJhdXRvIl0sCiAgICBkcmFnZ2FibGU6IFsidHJ1ZSIsICJmYWxzZSIsICJhdXRvIl0sCiAgICBkcm9wem9uZTogWyJjb3B5IiwgIm1vdmUiLCAibGluayIsICJzdHJpbmc6IiwgImZpbGU6Il0sCiAgICBoaWRkZW46IFsiaGlkZGVuIl0sCiAgICBpZDogbnVsbCwKICAgIGluZXJ0OiBbImluZXJ0Il0sCiAgICBpdGVtaWQ6IG51bGwsCiAgICBpdGVtcHJvcDogbnVsbCwKICAgIGl0ZW1yZWY6IG51bGwsCiAgICBpdGVtc2NvcGU6IFsiaXRlbXNjb3BlIl0sCiAgICBpdGVtdHlwZTogbnVsbCwKICAgIGxhbmc6IFsiZW4iLCAiZXMiXSwKICAgIHNwZWxsY2hlY2s6IFsidHJ1ZSIsICJmYWxzZSJdLAogICAgc3R5bGU6IG51bGwsCiAgICB0YWJpbmRleDogWyIxIiwgIjIiLCAiMyIsICI0IiwgIjUiLCAiNiIsICI3IiwgIjgiLCAiOSJdLAogICAgdGl0bGU6IG51bGwsCiAgICB0cmFuc2xhdGU6IFsieWVzIiwgIm5vIl0sCiAgICBvbmNsaWNrOiBudWxsLAogICAgcmVsOiBbInN0eWxlc2hlZXQiLCAiYWx0ZXJuYXRlIiwgImF1dGhvciIsICJib29rbWFyayIsICJoZWxwIiwgImxpY2Vuc2UiLCAibmV4dCIsICJub2ZvbGxvdyIsICJub3JlZmVycmVyIiwgInByZWZldGNoIiwgInByZXYiLCAic2VhcmNoIiwgInRhZyJdCiAgfTsKICBmdW5jdGlvbiBwb3B1bGF0ZShvYmopIHsKICAgIGZvciAodmFyIGF0dHIgaW4gZ2xvYmFsQXR0cnMpIGlmIChnbG9iYWxBdHRycy5oYXNPd25Qcm9wZXJ0eShhdHRyKSkKICAgICAgb2JqLmF0dHJzW2F0dHJdID0gZ2xvYmFsQXR0cnNbYXR0cl07CiAgfQoKICBwb3B1bGF0ZShzKTsKICBmb3IgKHZhciB0YWcgaW4gZGF0YSkgaWYgKGRhdGEuaGFzT3duUHJvcGVydHkodGFnKSAmJiBkYXRhW3RhZ10gIT0gcykKICAgIHBvcHVsYXRlKGRhdGFbdGFnXSk7CgogIENvZGVNaXJyb3IuaHRtbFNjaGVtYSA9IGRhdGE7CiAgZnVuY3Rpb24gaHRtbEhpbnQoY20sIG9wdGlvbnMpIHsKICAgIHZhciBsb2NhbCA9IHtzY2hlbWFJbmZvOiBkYXRhfTsKICAgIGlmIChvcHRpb25zKSBmb3IgKHZhciBvcHQgaW4gb3B0aW9ucykgbG9jYWxbb3B0XSA9IG9wdGlvbnNbb3B0XTsKICAgIHJldHVybiBDb2RlTWlycm9yLmhpbnQueG1sKGNtLCBsb2NhbCk7CiAgfQogIENvZGVNaXJyb3IucmVnaXN0ZXJIZWxwZXIoImhpbnQiLCAiaHRtbCIsIGh0bWxIaW50KTsKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/hint/javascript-hint.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICB2YXIgUG9zID0gQ29kZU1pcnJvci5Qb3M7CgogIGZ1bmN0aW9uIGZvckVhY2goYXJyLCBmKSB7CiAgICBmb3IgKHZhciBpID0gMCwgZSA9IGFyci5sZW5ndGg7IGkgPCBlOyArK2kpIGYoYXJyW2ldKTsKICB9CgogIGZ1bmN0aW9uIGFycmF5Q29udGFpbnMoYXJyLCBpdGVtKSB7CiAgICBpZiAoIUFycmF5LnByb3RvdHlwZS5pbmRleE9mKSB7CiAgICAgIHZhciBpID0gYXJyLmxlbmd0aDsKICAgICAgd2hpbGUgKGktLSkgewogICAgICAgIGlmIChhcnJbaV0gPT09IGl0ZW0pIHsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICByZXR1cm4gYXJyLmluZGV4T2YoaXRlbSkgIT0gLTE7CiAgfQoKICBmdW5jdGlvbiBzY3JpcHRIaW50KGVkaXRvciwga2V5d29yZHMsIGdldFRva2VuLCBvcHRpb25zKSB7CiAgICAvLyBGaW5kIHRoZSB0b2tlbiBhdCB0aGUgY3Vyc29yCiAgICB2YXIgY3VyID0gZWRpdG9yLmdldEN1cnNvcigpLCB0b2tlbiA9IGdldFRva2VuKGVkaXRvciwgY3VyKTsKICAgIGlmICgvXGIoPzpzdHJpbmd8Y29tbWVudClcYi8udGVzdCh0b2tlbi50eXBlKSkgcmV0dXJuOwogICAgdG9rZW4uc3RhdGUgPSBDb2RlTWlycm9yLmlubmVyTW9kZShlZGl0b3IuZ2V0TW9kZSgpLCB0b2tlbi5zdGF0ZSkuc3RhdGU7CgogICAgLy8gSWYgaXQncyBub3QgYSAnd29yZC1zdHlsZScgdG9rZW4sIGlnbm9yZSB0aGUgdG9rZW4uCiAgICBpZiAoIS9eW1x3JF9dKiQvLnRlc3QodG9rZW4uc3RyaW5nKSkgewogICAgICB0b2tlbiA9IHtzdGFydDogY3VyLmNoLCBlbmQ6IGN1ci5jaCwgc3RyaW5nOiAiIiwgc3RhdGU6IHRva2VuLnN0YXRlLAogICAgICAgICAgICAgICB0eXBlOiB0b2tlbi5zdHJpbmcgPT0gIi4iID8gInByb3BlcnR5IiA6IG51bGx9OwogICAgfSBlbHNlIGlmICh0b2tlbi5lbmQgPiBjdXIuY2gpIHsKICAgICAgdG9rZW4uZW5kID0gY3VyLmNoOwogICAgICB0b2tlbi5zdHJpbmcgPSB0b2tlbi5zdHJpbmcuc2xpY2UoMCwgY3VyLmNoIC0gdG9rZW4uc3RhcnQpOwogICAgfQoKICAgIHZhciB0cHJvcCA9IHRva2VuOwogICAgLy8gSWYgaXQgaXMgYSBwcm9wZXJ0eSwgZmluZCBvdXQgd2hhdCBpdCBpcyBhIHByb3BlcnR5IG9mLgogICAgd2hpbGUgKHRwcm9wLnR5cGUgPT0gInByb3BlcnR5IikgewogICAgICB0cHJvcCA9IGdldFRva2VuKGVkaXRvciwgUG9zKGN1ci5saW5lLCB0cHJvcC5zdGFydCkpOwogICAgICBpZiAodHByb3Auc3RyaW5nICE9ICIuIikgcmV0dXJuOwogICAgICB0cHJvcCA9IGdldFRva2VuKGVkaXRvciwgUG9zKGN1ci5saW5lLCB0cHJvcC5zdGFydCkpOwogICAgICBpZiAoIWNvbnRleHQpIHZhciBjb250ZXh0ID0gW107CiAgICAgIGNvbnRleHQucHVzaCh0cHJvcCk7CiAgICB9CiAgICByZXR1cm4ge2xpc3Q6IGdldENvbXBsZXRpb25zKHRva2VuLCBjb250ZXh0LCBrZXl3b3Jkcywgb3B0aW9ucyksCiAgICAgICAgICAgIGZyb206IFBvcyhjdXIubGluZSwgdG9rZW4uc3RhcnQpLAogICAgICAgICAgICB0bzogUG9zKGN1ci5saW5lLCB0b2tlbi5lbmQpfTsKICB9CgogIGZ1bmN0aW9uIGphdmFzY3JpcHRIaW50KGVkaXRvciwgb3B0aW9ucykgewogICAgcmV0dXJuIHNjcmlwdEhpbnQoZWRpdG9yLCBqYXZhc2NyaXB0S2V5d29yZHMsCiAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZSwgY3VyKSB7cmV0dXJuIGUuZ2V0VG9rZW5BdChjdXIpO30sCiAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zKTsKICB9OwogIENvZGVNaXJyb3IucmVnaXN0ZXJIZWxwZXIoImhpbnQiLCAiamF2YXNjcmlwdCIsIGphdmFzY3JpcHRIaW50KTsKCiAgZnVuY3Rpb24gZ2V0Q29mZmVlU2NyaXB0VG9rZW4oZWRpdG9yLCBjdXIpIHsKICAvLyBUaGlzIGdldFRva2VuLCBpdCBpcyBmb3IgY29mZmVlc2NyaXB0LCBpbWl0YXRlcyB0aGUgYmVoYXZpb3Igb2YKICAvLyBnZXRUb2tlbkF0IG1ldGhvZCBpbiBqYXZhc2NyaXB0LmpzLCB0aGF0IGlzLCByZXR1cm5pbmcgInByb3BlcnR5IgogIC8vIHR5cGUgYW5kIHRyZWF0ICIuIiBhcyBpbmRlcGVuZW50IHRva2VuLgogICAgdmFyIHRva2VuID0gZWRpdG9yLmdldFRva2VuQXQoY3VyKTsKICAgIGlmIChjdXIuY2ggPT0gdG9rZW4uc3RhcnQgKyAxICYmIHRva2VuLnN0cmluZy5jaGFyQXQoMCkgPT0gJy4nKSB7CiAgICAgIHRva2VuLmVuZCA9IHRva2VuLnN0YXJ0OwogICAgICB0b2tlbi5zdHJpbmcgPSAnLic7CiAgICAgIHRva2VuLnR5cGUgPSAicHJvcGVydHkiOwogICAgfQogICAgZWxzZSBpZiAoL15cLltcdyRfXSokLy50ZXN0KHRva2VuLnN0cmluZykpIHsKICAgICAgdG9rZW4udHlwZSA9ICJwcm9wZXJ0eSI7CiAgICAgIHRva2VuLnN0YXJ0Kys7CiAgICAgIHRva2VuLnN0cmluZyA9IHRva2VuLnN0cmluZy5yZXBsYWNlKC9cLi8sICcnKTsKICAgIH0KICAgIHJldHVybiB0b2tlbjsKICB9CgogIGZ1bmN0aW9uIGNvZmZlZXNjcmlwdEhpbnQoZWRpdG9yLCBvcHRpb25zKSB7CiAgICByZXR1cm4gc2NyaXB0SGludChlZGl0b3IsIGNvZmZlZXNjcmlwdEtleXdvcmRzLCBnZXRDb2ZmZWVTY3JpcHRUb2tlbiwgb3B0aW9ucyk7CiAgfQogIENvZGVNaXJyb3IucmVnaXN0ZXJIZWxwZXIoImhpbnQiLCAiY29mZmVlc2NyaXB0IiwgY29mZmVlc2NyaXB0SGludCk7CgogIHZhciBzdHJpbmdQcm9wcyA9ICgiY2hhckF0IGNoYXJDb2RlQXQgaW5kZXhPZiBsYXN0SW5kZXhPZiBzdWJzdHJpbmcgc3Vic3RyIHNsaWNlIHRyaW0gdHJpbUxlZnQgdHJpbVJpZ2h0ICIgKwogICAgICAgICAgICAgICAgICAgICAidG9VcHBlckNhc2UgdG9Mb3dlckNhc2Ugc3BsaXQgY29uY2F0IG1hdGNoIHJlcGxhY2Ugc2VhcmNoIikuc3BsaXQoIiAiKTsKICB2YXIgYXJyYXlQcm9wcyA9ICgibGVuZ3RoIGNvbmNhdCBqb2luIHNwbGljZSBwdXNoIHBvcCBzaGlmdCB1bnNoaWZ0IHNsaWNlIHJldmVyc2Ugc29ydCBpbmRleE9mICIgKwogICAgICAgICAgICAgICAgICAgICJsYXN0SW5kZXhPZiBldmVyeSBzb21lIGZpbHRlciBmb3JFYWNoIG1hcCByZWR1Y2UgcmVkdWNlUmlnaHQgIikuc3BsaXQoIiAiKTsKICB2YXIgZnVuY1Byb3BzID0gInByb3RvdHlwZSBhcHBseSBjYWxsIGJpbmQiLnNwbGl0KCIgIik7CiAgdmFyIGphdmFzY3JpcHRLZXl3b3JkcyA9ICgiYnJlYWsgY2FzZSBjYXRjaCBjb250aW51ZSBkZWJ1Z2dlciBkZWZhdWx0IGRlbGV0ZSBkbyBlbHNlIGZhbHNlIGZpbmFsbHkgZm9yIGZ1bmN0aW9uICIgKwogICAgICAgICAgICAgICAgICAiaWYgaW4gaW5zdGFuY2VvZiBuZXcgbnVsbCByZXR1cm4gc3dpdGNoIHRocm93IHRydWUgdHJ5IHR5cGVvZiB2YXIgdm9pZCB3aGlsZSB3aXRoIikuc3BsaXQoIiAiKTsKICB2YXIgY29mZmVlc2NyaXB0S2V5d29yZHMgPSAoImFuZCBicmVhayBjYXRjaCBjbGFzcyBjb250aW51ZSBkZWxldGUgZG8gZWxzZSBleHRlbmRzIGZhbHNlIGZpbmFsbHkgZm9yICIgKwogICAgICAgICAgICAgICAgICAiaWYgaW4gaW5zdGFuY2VvZiBpc250IG5ldyBubyBub3QgbnVsbCBvZiBvZmYgb24gb3IgcmV0dXJuIHN3aXRjaCB0aGVuIHRocm93IHRydWUgdHJ5IHR5cGVvZiB1bnRpbCB2b2lkIHdoaWxlIHdpdGggeWVzIikuc3BsaXQoIiAiKTsKCiAgZnVuY3Rpb24gZm9yQWxsUHJvcHMob2JqLCBjYWxsYmFjaykgewogICAgaWYgKCFPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyB8fCAhT2JqZWN0LmdldFByb3RvdHlwZU9mKSB7CiAgICAgIGZvciAodmFyIG5hbWUgaW4gb2JqKSBjYWxsYmFjayhuYW1lKQogICAgfSBlbHNlIHsKICAgICAgZm9yICh2YXIgbyA9IG9iajsgbzsgbyA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihvKSkKICAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhvKS5mb3JFYWNoKGNhbGxiYWNrKQogICAgfQogIH0KCiAgZnVuY3Rpb24gZ2V0Q29tcGxldGlvbnModG9rZW4sIGNvbnRleHQsIGtleXdvcmRzLCBvcHRpb25zKSB7CiAgICB2YXIgZm91bmQgPSBbXSwgc3RhcnQgPSB0b2tlbi5zdHJpbmcsIGdsb2JhbCA9IG9wdGlvbnMgJiYgb3B0aW9ucy5nbG9iYWxTY29wZSB8fCB3aW5kb3c7CiAgICBmdW5jdGlvbiBtYXliZUFkZChzdHIpIHsKICAgICAgaWYgKHN0ci5sYXN0SW5kZXhPZihzdGFydCwgMCkgPT0gMCAmJiAhYXJyYXlDb250YWlucyhmb3VuZCwgc3RyKSkgZm91bmQucHVzaChzdHIpOwogICAgfQogICAgZnVuY3Rpb24gZ2F0aGVyQ29tcGxldGlvbnMob2JqKSB7CiAgICAgIGlmICh0eXBlb2Ygb2JqID09ICJzdHJpbmciKSBmb3JFYWNoKHN0cmluZ1Byb3BzLCBtYXliZUFkZCk7CiAgICAgIGVsc2UgaWYgKG9iaiBpbnN0YW5jZW9mIEFycmF5KSBmb3JFYWNoKGFycmF5UHJvcHMsIG1heWJlQWRkKTsKICAgICAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRnVuY3Rpb24pIGZvckVhY2goZnVuY1Byb3BzLCBtYXliZUFkZCk7CiAgICAgIGZvckFsbFByb3BzKG9iaiwgbWF5YmVBZGQpCiAgICB9CgogICAgaWYgKGNvbnRleHQgJiYgY29udGV4dC5sZW5ndGgpIHsKICAgICAgLy8gSWYgdGhpcyBpcyBhIHByb3BlcnR5LCBzZWUgaWYgaXQgYmVsb25ncyB0byBzb21lIG9iamVjdCB3ZSBjYW4KICAgICAgLy8gZmluZCBpbiB0aGUgY3VycmVudCBlbnZpcm9ubWVudC4KICAgICAgdmFyIG9iaiA9IGNvbnRleHQucG9wKCksIGJhc2U7CiAgICAgIGlmIChvYmoudHlwZSAmJiBvYmoudHlwZS5pbmRleE9mKCJ2YXJpYWJsZSIpID09PSAwKSB7CiAgICAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5hZGRpdGlvbmFsQ29udGV4dCkKICAgICAgICAgIGJhc2UgPSBvcHRpb25zLmFkZGl0aW9uYWxDb250ZXh0W29iai5zdHJpbmddOwogICAgICAgIGlmICghb3B0aW9ucyB8fCBvcHRpb25zLnVzZUdsb2JhbFNjb3BlICE9PSBmYWxzZSkKICAgICAgICAgIGJhc2UgPSBiYXNlIHx8IGdsb2JhbFtvYmouc3RyaW5nXTsKICAgICAgfSBlbHNlIGlmIChvYmoudHlwZSA9PSAic3RyaW5nIikgewogICAgICAgIGJhc2UgPSAiIjsKICAgICAgfSBlbHNlIGlmIChvYmoudHlwZSA9PSAiYXRvbSIpIHsKICAgICAgICBiYXNlID0gMTsKICAgICAgfSBlbHNlIGlmIChvYmoudHlwZSA9PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgaWYgKGdsb2JhbC5qUXVlcnkgIT0gbnVsbCAmJiAob2JqLnN0cmluZyA9PSAnJCcgfHwgb2JqLnN0cmluZyA9PSAnalF1ZXJ5JykgJiYKICAgICAgICAgICAgKHR5cGVvZiBnbG9iYWwualF1ZXJ5ID09ICdmdW5jdGlvbicpKQogICAgICAgICAgYmFzZSA9IGdsb2JhbC5qUXVlcnkoKTsKICAgICAgICBlbHNlIGlmIChnbG9iYWwuXyAhPSBudWxsICYmIChvYmouc3RyaW5nID09ICdfJykgJiYgKHR5cGVvZiBnbG9iYWwuXyA9PSAnZnVuY3Rpb24nKSkKICAgICAgICAgIGJhc2UgPSBnbG9iYWwuXygpOwogICAgICB9CiAgICAgIHdoaWxlIChiYXNlICE9IG51bGwgJiYgY29udGV4dC5sZW5ndGgpCiAgICAgICAgYmFzZSA9IGJhc2VbY29udGV4dC5wb3AoKS5zdHJpbmddOwogICAgICBpZiAoYmFzZSAhPSBudWxsKSBnYXRoZXJDb21wbGV0aW9ucyhiYXNlKTsKICAgIH0gZWxzZSB7CiAgICAgIC8vIElmIG5vdCwganVzdCBsb29rIGluIHRoZSBnbG9iYWwgb2JqZWN0IGFuZCBhbnkgbG9jYWwgc2NvcGUKICAgICAgLy8gKHJlYWRpbmcgaW50byBKUyBtb2RlIGludGVybmFscyB0byBnZXQgYXQgdGhlIGxvY2FsIGFuZCBnbG9iYWwgdmFyaWFibGVzKQogICAgICBmb3IgKHZhciB2ID0gdG9rZW4uc3RhdGUubG9jYWxWYXJzOyB2OyB2ID0gdi5uZXh0KSBtYXliZUFkZCh2Lm5hbWUpOwogICAgICBmb3IgKHZhciB2ID0gdG9rZW4uc3RhdGUuZ2xvYmFsVmFyczsgdjsgdiA9IHYubmV4dCkgbWF5YmVBZGQodi5uYW1lKTsKICAgICAgaWYgKCFvcHRpb25zIHx8IG9wdGlvbnMudXNlR2xvYmFsU2NvcGUgIT09IGZhbHNlKQogICAgICAgIGdhdGhlckNvbXBsZXRpb25zKGdsb2JhbCk7CiAgICAgIGZvckVhY2goa2V5d29yZHMsIG1heWJlQWRkKTsKICAgIH0KICAgIHJldHVybiBmb3VuZDsKICB9Cn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/hint/show-hint.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LkNvZGVNaXJyb3ItaGludHMgewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB6LWluZGV4OiAxMDsKICBvdmVyZmxvdzogaGlkZGVuOwogIGxpc3Qtc3R5bGU6IG5vbmU7CgogIG1hcmdpbjogMDsKICBwYWRkaW5nOiAycHg7CgogIC13ZWJraXQtYm94LXNoYWRvdzogMnB4IDNweCA1cHggcmdiYSgwLDAsMCwuMik7CiAgLW1vei1ib3gtc2hhZG93OiAycHggM3B4IDVweCByZ2JhKDAsMCwwLC4yKTsKICBib3gtc2hhZG93OiAycHggM3B4IDVweCByZ2JhKDAsMCwwLC4yKTsKICBib3JkZXItcmFkaXVzOiAzcHg7CiAgYm9yZGVyOiAxcHggc29saWQgc2lsdmVyOwoKICBiYWNrZ3JvdW5kOiB3aGl0ZTsKICBmb250LXNpemU6IDkwJTsKICBmb250LWZhbWlseTogbW9ub3NwYWNlOwoKICBtYXgtaGVpZ2h0OiAyMGVtOwogIG92ZXJmbG93LXk6IGF1dG87Cn0KCi5Db2RlTWlycm9yLWhpbnQgewogIG1hcmdpbjogMDsKICBwYWRkaW5nOiAwIDRweDsKICBib3JkZXItcmFkaXVzOiAycHg7CiAgd2hpdGUtc3BhY2U6IHByZTsKICBjb2xvcjogYmxhY2s7CiAgY3Vyc29yOiBwb2ludGVyOwp9CgpsaS5Db2RlTWlycm9yLWhpbnQtYWN0aXZlIHsKICBiYWNrZ3JvdW5kOiAjMDhmOwogIGNvbG9yOiB3aGl0ZTsKfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/hint/show-hint.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CgogIHZhciBISU5UX0VMRU1FTlRfQ0xBU1MgICAgICAgID0gIkNvZGVNaXJyb3ItaGludCI7CiAgdmFyIEFDVElWRV9ISU5UX0VMRU1FTlRfQ0xBU1MgPSAiQ29kZU1pcnJvci1oaW50LWFjdGl2ZSI7CgogIC8vIFRoaXMgaXMgdGhlIG9sZCBpbnRlcmZhY2UsIGtlcHQgYXJvdW5kIGZvciBub3cgdG8gc3RheQogIC8vIGJhY2t3YXJkcy1jb21wYXRpYmxlLgogIENvZGVNaXJyb3Iuc2hvd0hpbnQgPSBmdW5jdGlvbihjbSwgZ2V0SGludHMsIG9wdGlvbnMpIHsKICAgIGlmICghZ2V0SGludHMpIHJldHVybiBjbS5zaG93SGludChvcHRpb25zKTsKICAgIGlmIChvcHRpb25zICYmIG9wdGlvbnMuYXN5bmMpIGdldEhpbnRzLmFzeW5jID0gdHJ1ZTsKICAgIHZhciBuZXdPcHRzID0ge2hpbnQ6IGdldEhpbnRzfTsKICAgIGlmIChvcHRpb25zKSBmb3IgKHZhciBwcm9wIGluIG9wdGlvbnMpIG5ld09wdHNbcHJvcF0gPSBvcHRpb25zW3Byb3BdOwogICAgcmV0dXJuIGNtLnNob3dIaW50KG5ld09wdHMpOwogIH07CgogIENvZGVNaXJyb3IuZGVmaW5lRXh0ZW5zaW9uKCJzaG93SGludCIsIGZ1bmN0aW9uKG9wdGlvbnMpIHsKICAgIG9wdGlvbnMgPSBwYXJzZU9wdGlvbnModGhpcywgdGhpcy5nZXRDdXJzb3IoInN0YXJ0IiksIG9wdGlvbnMpOwogICAgdmFyIHNlbGVjdGlvbnMgPSB0aGlzLmxpc3RTZWxlY3Rpb25zKCkKICAgIGlmIChzZWxlY3Rpb25zLmxlbmd0aCA+IDEpIHJldHVybjsKICAgIC8vIEJ5IGRlZmF1bHQsIGRvbid0IGFsbG93IGNvbXBsZXRpb24gd2hlbiBzb21ldGhpbmcgaXMgc2VsZWN0ZWQuCiAgICAvLyBBIGhpbnQgZnVuY3Rpb24gY2FuIGhhdmUgYSBgc3VwcG9ydHNTZWxlY3Rpb25gIHByb3BlcnR5IHRvCiAgICAvLyBpbmRpY2F0ZSB0aGF0IGl0IGNhbiBoYW5kbGUgc2VsZWN0aW9ucy4KICAgIGlmICh0aGlzLnNvbWV0aGluZ1NlbGVjdGVkKCkpIHsKICAgICAgaWYgKCFvcHRpb25zLmhpbnQuc3VwcG9ydHNTZWxlY3Rpb24pIHJldHVybjsKICAgICAgLy8gRG9uJ3QgdHJ5IHdpdGggY3Jvc3MtbGluZSBzZWxlY3Rpb25zCiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZWN0aW9ucy5sZW5ndGg7IGkrKykKICAgICAgICBpZiAoc2VsZWN0aW9uc1tpXS5oZWFkLmxpbmUgIT0gc2VsZWN0aW9uc1tpXS5hbmNob3IubGluZSkgcmV0dXJuOwogICAgfQoKICAgIGlmICh0aGlzLnN0YXRlLmNvbXBsZXRpb25BY3RpdmUpIHRoaXMuc3RhdGUuY29tcGxldGlvbkFjdGl2ZS5jbG9zZSgpOwogICAgdmFyIGNvbXBsZXRpb24gPSB0aGlzLnN0YXRlLmNvbXBsZXRpb25BY3RpdmUgPSBuZXcgQ29tcGxldGlvbih0aGlzLCBvcHRpb25zKTsKICAgIGlmICghY29tcGxldGlvbi5vcHRpb25zLmhpbnQpIHJldHVybjsKCiAgICBDb2RlTWlycm9yLnNpZ25hbCh0aGlzLCAic3RhcnRDb21wbGV0aW9uIiwgdGhpcyk7CiAgICBjb21wbGV0aW9uLnVwZGF0ZSh0cnVlKTsKICB9KTsKCiAgZnVuY3Rpb24gQ29tcGxldGlvbihjbSwgb3B0aW9ucykgewogICAgdGhpcy5jbSA9IGNtOwogICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKICAgIHRoaXMud2lkZ2V0ID0gbnVsbDsKICAgIHRoaXMuZGVib3VuY2UgPSAwOwogICAgdGhpcy50aWNrID0gMDsKICAgIHRoaXMuc3RhcnRQb3MgPSB0aGlzLmNtLmdldEN1cnNvcigic3RhcnQiKTsKICAgIHRoaXMuc3RhcnRMZW4gPSB0aGlzLmNtLmdldExpbmUodGhpcy5zdGFydFBvcy5saW5lKS5sZW5ndGggLSB0aGlzLmNtLmdldFNlbGVjdGlvbigpLmxlbmd0aDsKCiAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICBjbS5vbigiY3Vyc29yQWN0aXZpdHkiLCB0aGlzLmFjdGl2aXR5RnVuYyA9IGZ1bmN0aW9uKCkgeyBzZWxmLmN1cnNvckFjdGl2aXR5KCk7IH0pOwogIH0KCiAgdmFyIHJlcXVlc3RBbmltYXRpb25GcmFtZSA9IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHwgZnVuY3Rpb24oZm4pIHsKICAgIHJldHVybiBzZXRUaW1lb3V0KGZuLCAxMDAwLzYwKTsKICB9OwogIHZhciBjYW5jZWxBbmltYXRpb25GcmFtZSA9IHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSB8fCBjbGVhclRpbWVvdXQ7CgogIENvbXBsZXRpb24ucHJvdG90eXBlID0gewogICAgY2xvc2U6IGZ1bmN0aW9uKCkgewogICAgICBpZiAoIXRoaXMuYWN0aXZlKCkpIHJldHVybjsKICAgICAgdGhpcy5jbS5zdGF0ZS5jb21wbGV0aW9uQWN0aXZlID0gbnVsbDsKICAgICAgdGhpcy50aWNrID0gbnVsbDsKICAgICAgdGhpcy5jbS5vZmYoImN1cnNvckFjdGl2aXR5IiwgdGhpcy5hY3Rpdml0eUZ1bmMpOwoKICAgICAgaWYgKHRoaXMud2lkZ2V0ICYmIHRoaXMuZGF0YSkgQ29kZU1pcnJvci5zaWduYWwodGhpcy5kYXRhLCAiY2xvc2UiKTsKICAgICAgaWYgKHRoaXMud2lkZ2V0KSB0aGlzLndpZGdldC5jbG9zZSgpOwogICAgICBDb2RlTWlycm9yLnNpZ25hbCh0aGlzLmNtLCAiZW5kQ29tcGxldGlvbiIsIHRoaXMuY20pOwogICAgfSwKCiAgICBhY3RpdmU6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gdGhpcy5jbS5zdGF0ZS5jb21wbGV0aW9uQWN0aXZlID09IHRoaXM7CiAgICB9LAoKICAgIHBpY2s6IGZ1bmN0aW9uKGRhdGEsIGkpIHsKICAgICAgdmFyIGNvbXBsZXRpb24gPSBkYXRhLmxpc3RbaV07CiAgICAgIGlmIChjb21wbGV0aW9uLmhpbnQpIGNvbXBsZXRpb24uaGludCh0aGlzLmNtLCBkYXRhLCBjb21wbGV0aW9uKTsKICAgICAgZWxzZSB0aGlzLmNtLnJlcGxhY2VSYW5nZShnZXRUZXh0KGNvbXBsZXRpb24pLCBjb21wbGV0aW9uLmZyb20gfHwgZGF0YS5mcm9tLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb24udG8gfHwgZGF0YS50bywgImNvbXBsZXRlIik7CiAgICAgIENvZGVNaXJyb3Iuc2lnbmFsKGRhdGEsICJwaWNrIiwgY29tcGxldGlvbik7CiAgICAgIHRoaXMuY2xvc2UoKTsKICAgIH0sCgogICAgY3Vyc29yQWN0aXZpdHk6IGZ1bmN0aW9uKCkgewogICAgICBpZiAodGhpcy5kZWJvdW5jZSkgewogICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuZGVib3VuY2UpOwogICAgICAgIHRoaXMuZGVib3VuY2UgPSAwOwogICAgICB9CgogICAgICB2YXIgcG9zID0gdGhpcy5jbS5nZXRDdXJzb3IoKSwgbGluZSA9IHRoaXMuY20uZ2V0TGluZShwb3MubGluZSk7CiAgICAgIGlmIChwb3MubGluZSAhPSB0aGlzLnN0YXJ0UG9zLmxpbmUgfHwgbGluZS5sZW5ndGggLSBwb3MuY2ggIT0gdGhpcy5zdGFydExlbiAtIHRoaXMuc3RhcnRQb3MuY2ggfHwKICAgICAgICAgIHBvcy5jaCA8IHRoaXMuc3RhcnRQb3MuY2ggfHwgdGhpcy5jbS5zb21ldGhpbmdTZWxlY3RlZCgpIHx8CiAgICAgICAgICAocG9zLmNoICYmIHRoaXMub3B0aW9ucy5jbG9zZUNoYXJhY3RlcnMudGVzdChsaW5lLmNoYXJBdChwb3MuY2ggLSAxKSkpKSB7CiAgICAgICAgdGhpcy5jbG9zZSgpOwogICAgICB9IGVsc2UgewogICAgICAgIHZhciBzZWxmID0gdGhpczsKICAgICAgICB0aGlzLmRlYm91bmNlID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCkge3NlbGYudXBkYXRlKCk7fSk7CiAgICAgICAgaWYgKHRoaXMud2lkZ2V0KSB0aGlzLndpZGdldC5kaXNhYmxlKCk7CiAgICAgIH0KICAgIH0sCgogICAgdXBkYXRlOiBmdW5jdGlvbihmaXJzdCkgewogICAgICBpZiAodGhpcy50aWNrID09IG51bGwpIHJldHVybgogICAgICB2YXIgc2VsZiA9IHRoaXMsIG15VGljayA9ICsrdGhpcy50aWNrCiAgICAgIGZldGNoSGludHModGhpcy5vcHRpb25zLmhpbnQsIHRoaXMuY20sIHRoaXMub3B0aW9ucywgZnVuY3Rpb24oZGF0YSkgewogICAgICAgIGlmIChzZWxmLnRpY2sgPT0gbXlUaWNrKSBzZWxmLmZpbmlzaFVwZGF0ZShkYXRhLCBmaXJzdCkKICAgICAgfSkKICAgIH0sCgogICAgZmluaXNoVXBkYXRlOiBmdW5jdGlvbihkYXRhLCBmaXJzdCkgewogICAgICBpZiAodGhpcy5kYXRhKSBDb2RlTWlycm9yLnNpZ25hbCh0aGlzLmRhdGEsICJ1cGRhdGUiKTsKCiAgICAgIHZhciBwaWNrZWQgPSAodGhpcy53aWRnZXQgJiYgdGhpcy53aWRnZXQucGlja2VkKSB8fCAoZmlyc3QgJiYgdGhpcy5vcHRpb25zLmNvbXBsZXRlU2luZ2xlKTsKICAgICAgaWYgKHRoaXMud2lkZ2V0KSB0aGlzLndpZGdldC5jbG9zZSgpOwoKICAgICAgaWYgKGRhdGEgJiYgdGhpcy5kYXRhICYmIGlzTmV3Q29tcGxldGlvbih0aGlzLmRhdGEsIGRhdGEpKSByZXR1cm47CiAgICAgIHRoaXMuZGF0YSA9IGRhdGE7CgogICAgICBpZiAoZGF0YSAmJiBkYXRhLmxpc3QubGVuZ3RoKSB7CiAgICAgICAgaWYgKHBpY2tlZCAmJiBkYXRhLmxpc3QubGVuZ3RoID09IDEpIHsKICAgICAgICAgIHRoaXMucGljayhkYXRhLCAwKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy53aWRnZXQgPSBuZXcgV2lkZ2V0KHRoaXMsIGRhdGEpOwogICAgICAgICAgQ29kZU1pcnJvci5zaWduYWwoZGF0YSwgInNob3duIik7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfTsKCiAgZnVuY3Rpb24gaXNOZXdDb21wbGV0aW9uKG9sZCwgbncpIHsKICAgIHZhciBtb3ZlZCA9IENvZGVNaXJyb3IuY21wUG9zKG53LmZyb20sIG9sZC5mcm9tKQogICAgcmV0dXJuIG1vdmVkID4gMCAmJiBvbGQudG8uY2ggLSBvbGQuZnJvbS5jaCAhPSBudy50by5jaCAtIG53LmZyb20uY2gKICB9CgogIGZ1bmN0aW9uIHBhcnNlT3B0aW9ucyhjbSwgcG9zLCBvcHRpb25zKSB7CiAgICB2YXIgZWRpdG9yID0gY20ub3B0aW9ucy5oaW50T3B0aW9uczsKICAgIHZhciBvdXQgPSB7fTsKICAgIGZvciAodmFyIHByb3AgaW4gZGVmYXVsdE9wdGlvbnMpIG91dFtwcm9wXSA9IGRlZmF1bHRPcHRpb25zW3Byb3BdOwogICAgaWYgKGVkaXRvcikgZm9yICh2YXIgcHJvcCBpbiBlZGl0b3IpCiAgICAgIGlmIChlZGl0b3JbcHJvcF0gIT09IHVuZGVmaW5lZCkgb3V0W3Byb3BdID0gZWRpdG9yW3Byb3BdOwogICAgaWYgKG9wdGlvbnMpIGZvciAodmFyIHByb3AgaW4gb3B0aW9ucykKICAgICAgaWYgKG9wdGlvbnNbcHJvcF0gIT09IHVuZGVmaW5lZCkgb3V0W3Byb3BdID0gb3B0aW9uc1twcm9wXTsKICAgIGlmIChvdXQuaGludC5yZXNvbHZlKSBvdXQuaGludCA9IG91dC5oaW50LnJlc29sdmUoY20sIHBvcykKICAgIHJldHVybiBvdXQ7CiAgfQoKICBmdW5jdGlvbiBnZXRUZXh0KGNvbXBsZXRpb24pIHsKICAgIGlmICh0eXBlb2YgY29tcGxldGlvbiA9PSAic3RyaW5nIikgcmV0dXJuIGNvbXBsZXRpb247CiAgICBlbHNlIHJldHVybiBjb21wbGV0aW9uLnRleHQ7CiAgfQoKICBmdW5jdGlvbiBidWlsZEtleU1hcChjb21wbGV0aW9uLCBoYW5kbGUpIHsKICAgIHZhciBiYXNlTWFwID0gewogICAgICBVcDogZnVuY3Rpb24oKSB7aGFuZGxlLm1vdmVGb2N1cygtMSk7fSwKICAgICAgRG93bjogZnVuY3Rpb24oKSB7aGFuZGxlLm1vdmVGb2N1cygxKTt9LAogICAgICBQYWdlVXA6IGZ1bmN0aW9uKCkge2hhbmRsZS5tb3ZlRm9jdXMoLWhhbmRsZS5tZW51U2l6ZSgpICsgMSwgdHJ1ZSk7fSwKICAgICAgUGFnZURvd246IGZ1bmN0aW9uKCkge2hhbmRsZS5tb3ZlRm9jdXMoaGFuZGxlLm1lbnVTaXplKCkgLSAxLCB0cnVlKTt9LAogICAgICBIb21lOiBmdW5jdGlvbigpIHtoYW5kbGUuc2V0Rm9jdXMoMCk7fSwKICAgICAgRW5kOiBmdW5jdGlvbigpIHtoYW5kbGUuc2V0Rm9jdXMoaGFuZGxlLmxlbmd0aCAtIDEpO30sCiAgICAgIEVudGVyOiBoYW5kbGUucGljaywKICAgICAgVGFiOiBoYW5kbGUucGljaywKICAgICAgRXNjOiBoYW5kbGUuY2xvc2UKICAgIH07CiAgICB2YXIgY3VzdG9tID0gY29tcGxldGlvbi5vcHRpb25zLmN1c3RvbUtleXM7CiAgICB2YXIgb3VyTWFwID0gY3VzdG9tID8ge30gOiBiYXNlTWFwOwogICAgZnVuY3Rpb24gYWRkQmluZGluZyhrZXksIHZhbCkgewogICAgICB2YXIgYm91bmQ7CiAgICAgIGlmICh0eXBlb2YgdmFsICE9ICJzdHJpbmciKQogICAgICAgIGJvdW5kID0gZnVuY3Rpb24oY20pIHsgcmV0dXJuIHZhbChjbSwgaGFuZGxlKTsgfTsKICAgICAgLy8gVGhpcyBtZWNoYW5pc20gaXMgZGVwcmVjYXRlZAogICAgICBlbHNlIGlmIChiYXNlTWFwLmhhc093blByb3BlcnR5KHZhbCkpCiAgICAgICAgYm91bmQgPSBiYXNlTWFwW3ZhbF07CiAgICAgIGVsc2UKICAgICAgICBib3VuZCA9IHZhbDsKICAgICAgb3VyTWFwW2tleV0gPSBib3VuZDsKICAgIH0KICAgIGlmIChjdXN0b20pCiAgICAgIGZvciAodmFyIGtleSBpbiBjdXN0b20pIGlmIChjdXN0b20uaGFzT3duUHJvcGVydHkoa2V5KSkKICAgICAgICBhZGRCaW5kaW5nKGtleSwgY3VzdG9tW2tleV0pOwogICAgdmFyIGV4dHJhID0gY29tcGxldGlvbi5vcHRpb25zLmV4dHJhS2V5czsKICAgIGlmIChleHRyYSkKICAgICAgZm9yICh2YXIga2V5IGluIGV4dHJhKSBpZiAoZXh0cmEuaGFzT3duUHJvcGVydHkoa2V5KSkKICAgICAgICBhZGRCaW5kaW5nKGtleSwgZXh0cmFba2V5XSk7CiAgICByZXR1cm4gb3VyTWFwOwogIH0KCiAgZnVuY3Rpb24gZ2V0SGludEVsZW1lbnQoaGludHNFbGVtZW50LCBlbCkgewogICAgd2hpbGUgKGVsICYmIGVsICE9IGhpbnRzRWxlbWVudCkgewogICAgICBpZiAoZWwubm9kZU5hbWUudG9VcHBlckNhc2UoKSA9PT0gIkxJIiAmJiBlbC5wYXJlbnROb2RlID09IGhpbnRzRWxlbWVudCkgcmV0dXJuIGVsOwogICAgICBlbCA9IGVsLnBhcmVudE5vZGU7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBXaWRnZXQoY29tcGxldGlvbiwgZGF0YSkgewogICAgdGhpcy5jb21wbGV0aW9uID0gY29tcGxldGlvbjsKICAgIHRoaXMuZGF0YSA9IGRhdGE7CiAgICB0aGlzLnBpY2tlZCA9IGZhbHNlOwogICAgdmFyIHdpZGdldCA9IHRoaXMsIGNtID0gY29tcGxldGlvbi5jbTsKCiAgICB2YXIgaGludHMgPSB0aGlzLmhpbnRzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgidWwiKTsKICAgIGhpbnRzLmNsYXNzTmFtZSA9ICJDb2RlTWlycm9yLWhpbnRzIjsKICAgIHRoaXMuc2VsZWN0ZWRIaW50ID0gZGF0YS5zZWxlY3RlZEhpbnQgfHwgMDsKCiAgICB2YXIgY29tcGxldGlvbnMgPSBkYXRhLmxpc3Q7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbXBsZXRpb25zLmxlbmd0aDsgKytpKSB7CiAgICAgIHZhciBlbHQgPSBoaW50cy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJsaSIpKSwgY3VyID0gY29tcGxldGlvbnNbaV07CiAgICAgIHZhciBjbGFzc05hbWUgPSBISU5UX0VMRU1FTlRfQ0xBU1MgKyAoaSAhPSB0aGlzLnNlbGVjdGVkSGludCA/ICIiIDogIiAiICsgQUNUSVZFX0hJTlRfRUxFTUVOVF9DTEFTUyk7CiAgICAgIGlmIChjdXIuY2xhc3NOYW1lICE9IG51bGwpIGNsYXNzTmFtZSA9IGN1ci5jbGFzc05hbWUgKyAiICIgKyBjbGFzc05hbWU7CiAgICAgIGVsdC5jbGFzc05hbWUgPSBjbGFzc05hbWU7CiAgICAgIGlmIChjdXIucmVuZGVyKSBjdXIucmVuZGVyKGVsdCwgZGF0YSwgY3VyKTsKICAgICAgZWxzZSBlbHQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY3VyLmRpc3BsYXlUZXh0IHx8IGdldFRleHQoY3VyKSkpOwogICAgICBlbHQuaGludElkID0gaTsKICAgIH0KCiAgICB2YXIgcG9zID0gY20uY3Vyc29yQ29vcmRzKGNvbXBsZXRpb24ub3B0aW9ucy5hbGlnbldpdGhXb3JkID8gZGF0YS5mcm9tIDogbnVsbCk7CiAgICB2YXIgbGVmdCA9IHBvcy5sZWZ0LCB0b3AgPSBwb3MuYm90dG9tLCBiZWxvdyA9IHRydWU7CiAgICBoaW50cy5zdHlsZS5sZWZ0ID0gbGVmdCArICJweCI7CiAgICBoaW50cy5zdHlsZS50b3AgPSB0b3AgKyAicHgiOwogICAgLy8gSWYgd2UncmUgYXQgdGhlIGVkZ2Ugb2YgdGhlIHNjcmVlbiwgdGhlbiB3ZSB3YW50IHRoZSBtZW51IHRvIGFwcGVhciBvbiB0aGUgbGVmdCBvZiB0aGUgY3Vyc29yLgogICAgdmFyIHdpblcgPSB3aW5kb3cuaW5uZXJXaWR0aCB8fCBNYXRoLm1heChkb2N1bWVudC5ib2R5Lm9mZnNldFdpZHRoLCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQub2Zmc2V0V2lkdGgpOwogICAgdmFyIHdpbkggPSB3aW5kb3cuaW5uZXJIZWlnaHQgfHwgTWF0aC5tYXgoZG9jdW1lbnQuYm9keS5vZmZzZXRIZWlnaHQsIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5vZmZzZXRIZWlnaHQpOwogICAgKGNvbXBsZXRpb24ub3B0aW9ucy5jb250YWluZXIgfHwgZG9jdW1lbnQuYm9keSkuYXBwZW5kQ2hpbGQoaGludHMpOwogICAgdmFyIGJveCA9IGhpbnRzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCBvdmVybGFwWSA9IGJveC5ib3R0b20gLSB3aW5IOwogICAgdmFyIHNjcm9sbHMgPSBoaW50cy5zY3JvbGxIZWlnaHQgPiBoaW50cy5jbGllbnRIZWlnaHQgKyAxCiAgICB2YXIgc3RhcnRTY3JvbGwgPSBjbS5nZXRTY3JvbGxJbmZvKCk7CgogICAgaWYgKG92ZXJsYXBZID4gMCkgewogICAgICB2YXIgaGVpZ2h0ID0gYm94LmJvdHRvbSAtIGJveC50b3AsIGN1clRvcCA9IHBvcy50b3AgLSAocG9zLmJvdHRvbSAtIGJveC50b3ApOwogICAgICBpZiAoY3VyVG9wIC0gaGVpZ2h0ID4gMCkgeyAvLyBGaXRzIGFib3ZlIGN1cnNvcgogICAgICAgIGhpbnRzLnN0eWxlLnRvcCA9ICh0b3AgPSBwb3MudG9wIC0gaGVpZ2h0KSArICJweCI7CiAgICAgICAgYmVsb3cgPSBmYWxzZTsKICAgICAgfSBlbHNlIGlmIChoZWlnaHQgPiB3aW5IKSB7CiAgICAgICAgaGludHMuc3R5bGUuaGVpZ2h0ID0gKHdpbkggLSA1KSArICJweCI7CiAgICAgICAgaGludHMuc3R5bGUudG9wID0gKHRvcCA9IHBvcy5ib3R0b20gLSBib3gudG9wKSArICJweCI7CiAgICAgICAgdmFyIGN1cnNvciA9IGNtLmdldEN1cnNvcigpOwogICAgICAgIGlmIChkYXRhLmZyb20uY2ggIT0gY3Vyc29yLmNoKSB7CiAgICAgICAgICBwb3MgPSBjbS5jdXJzb3JDb29yZHMoY3Vyc29yKTsKICAgICAgICAgIGhpbnRzLnN0eWxlLmxlZnQgPSAobGVmdCA9IHBvcy5sZWZ0KSArICJweCI7CiAgICAgICAgICBib3ggPSBoaW50cy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHZhciBvdmVybGFwWCA9IGJveC5yaWdodCAtIHdpblc7CiAgICBpZiAob3ZlcmxhcFggPiAwKSB7CiAgICAgIGlmIChib3gucmlnaHQgLSBib3gubGVmdCA+IHdpblcpIHsKICAgICAgICBoaW50cy5zdHlsZS53aWR0aCA9ICh3aW5XIC0gNSkgKyAicHgiOwogICAgICAgIG92ZXJsYXBYIC09IChib3gucmlnaHQgLSBib3gubGVmdCkgLSB3aW5XOwogICAgICB9CiAgICAgIGhpbnRzLnN0eWxlLmxlZnQgPSAobGVmdCA9IHBvcy5sZWZ0IC0gb3ZlcmxhcFgpICsgInB4IjsKICAgIH0KICAgIGlmIChzY3JvbGxzKSBmb3IgKHZhciBub2RlID0gaGludHMuZmlyc3RDaGlsZDsgbm9kZTsgbm9kZSA9IG5vZGUubmV4dFNpYmxpbmcpCiAgICAgIG5vZGUuc3R5bGUucGFkZGluZ1JpZ2h0ID0gY20uZGlzcGxheS5uYXRpdmVCYXJXaWR0aCArICJweCIKCiAgICBjbS5hZGRLZXlNYXAodGhpcy5rZXlNYXAgPSBidWlsZEtleU1hcChjb21wbGV0aW9uLCB7CiAgICAgIG1vdmVGb2N1czogZnVuY3Rpb24obiwgYXZvaWRXcmFwKSB7IHdpZGdldC5jaGFuZ2VBY3RpdmUod2lkZ2V0LnNlbGVjdGVkSGludCArIG4sIGF2b2lkV3JhcCk7IH0sCiAgICAgIHNldEZvY3VzOiBmdW5jdGlvbihuKSB7IHdpZGdldC5jaGFuZ2VBY3RpdmUobik7IH0sCiAgICAgIG1lbnVTaXplOiBmdW5jdGlvbigpIHsgcmV0dXJuIHdpZGdldC5zY3JlZW5BbW91bnQoKTsgfSwKICAgICAgbGVuZ3RoOiBjb21wbGV0aW9ucy5sZW5ndGgsCiAgICAgIGNsb3NlOiBmdW5jdGlvbigpIHsgY29tcGxldGlvbi5jbG9zZSgpOyB9LAogICAgICBwaWNrOiBmdW5jdGlvbigpIHsgd2lkZ2V0LnBpY2soKTsgfSwKICAgICAgZGF0YTogZGF0YQogICAgfSkpOwoKICAgIGlmIChjb21wbGV0aW9uLm9wdGlvbnMuY2xvc2VPblVuZm9jdXMpIHsKICAgICAgdmFyIGNsb3NpbmdPbkJsdXI7CiAgICAgIGNtLm9uKCJibHVyIiwgdGhpcy5vbkJsdXIgPSBmdW5jdGlvbigpIHsgY2xvc2luZ09uQmx1ciA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IGNvbXBsZXRpb24uY2xvc2UoKTsgfSwgMTAwKTsgfSk7CiAgICAgIGNtLm9uKCJmb2N1cyIsIHRoaXMub25Gb2N1cyA9IGZ1bmN0aW9uKCkgeyBjbGVhclRpbWVvdXQoY2xvc2luZ09uQmx1cik7IH0pOwogICAgfQoKICAgIGNtLm9uKCJzY3JvbGwiLCB0aGlzLm9uU2Nyb2xsID0gZnVuY3Rpb24oKSB7CiAgICAgIHZhciBjdXJTY3JvbGwgPSBjbS5nZXRTY3JvbGxJbmZvKCksIGVkaXRvciA9IGNtLmdldFdyYXBwZXJFbGVtZW50KCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgIHZhciBuZXdUb3AgPSB0b3AgKyBzdGFydFNjcm9sbC50b3AgLSBjdXJTY3JvbGwudG9wOwogICAgICB2YXIgcG9pbnQgPSBuZXdUb3AgLSAod2luZG93LnBhZ2VZT2Zmc2V0IHx8IChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgfHwgZG9jdW1lbnQuYm9keSkuc2Nyb2xsVG9wKTsKICAgICAgaWYgKCFiZWxvdykgcG9pbnQgKz0gaGludHMub2Zmc2V0SGVpZ2h0OwogICAgICBpZiAocG9pbnQgPD0gZWRpdG9yLnRvcCB8fCBwb2ludCA+PSBlZGl0b3IuYm90dG9tKSByZXR1cm4gY29tcGxldGlvbi5jbG9zZSgpOwogICAgICBoaW50cy5zdHlsZS50b3AgPSBuZXdUb3AgKyAicHgiOwogICAgICBoaW50cy5zdHlsZS5sZWZ0ID0gKGxlZnQgKyBzdGFydFNjcm9sbC5sZWZ0IC0gY3VyU2Nyb2xsLmxlZnQpICsgInB4IjsKICAgIH0pOwoKICAgIENvZGVNaXJyb3Iub24oaGludHMsICJkYmxjbGljayIsIGZ1bmN0aW9uKGUpIHsKICAgICAgdmFyIHQgPSBnZXRIaW50RWxlbWVudChoaW50cywgZS50YXJnZXQgfHwgZS5zcmNFbGVtZW50KTsKICAgICAgaWYgKHQgJiYgdC5oaW50SWQgIT0gbnVsbCkge3dpZGdldC5jaGFuZ2VBY3RpdmUodC5oaW50SWQpOyB3aWRnZXQucGljaygpO30KICAgIH0pOwoKICAgIENvZGVNaXJyb3Iub24oaGludHMsICJjbGljayIsIGZ1bmN0aW9uKGUpIHsKICAgICAgdmFyIHQgPSBnZXRIaW50RWxlbWVudChoaW50cywgZS50YXJnZXQgfHwgZS5zcmNFbGVtZW50KTsKICAgICAgaWYgKHQgJiYgdC5oaW50SWQgIT0gbnVsbCkgewogICAgICAgIHdpZGdldC5jaGFuZ2VBY3RpdmUodC5oaW50SWQpOwogICAgICAgIGlmIChjb21wbGV0aW9uLm9wdGlvbnMuY29tcGxldGVPblNpbmdsZUNsaWNrKSB3aWRnZXQucGljaygpOwogICAgICB9CiAgICB9KTsKCiAgICBDb2RlTWlycm9yLm9uKGhpbnRzLCAibW91c2Vkb3duIiwgZnVuY3Rpb24oKSB7CiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXtjbS5mb2N1cygpO30sIDIwKTsKICAgIH0pOwoKICAgIENvZGVNaXJyb3Iuc2lnbmFsKGRhdGEsICJzZWxlY3QiLCBjb21wbGV0aW9uc1swXSwgaGludHMuZmlyc3RDaGlsZCk7CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIFdpZGdldC5wcm90b3R5cGUgPSB7CiAgICBjbG9zZTogZnVuY3Rpb24oKSB7CiAgICAgIGlmICh0aGlzLmNvbXBsZXRpb24ud2lkZ2V0ICE9IHRoaXMpIHJldHVybjsKICAgICAgdGhpcy5jb21wbGV0aW9uLndpZGdldCA9IG51bGw7CiAgICAgIHRoaXMuaGludHMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmhpbnRzKTsKICAgICAgdGhpcy5jb21wbGV0aW9uLmNtLnJlbW92ZUtleU1hcCh0aGlzLmtleU1hcCk7CgogICAgICB2YXIgY20gPSB0aGlzLmNvbXBsZXRpb24uY207CiAgICAgIGlmICh0aGlzLmNvbXBsZXRpb24ub3B0aW9ucy5jbG9zZU9uVW5mb2N1cykgewogICAgICAgIGNtLm9mZigiYmx1ciIsIHRoaXMub25CbHVyKTsKICAgICAgICBjbS5vZmYoImZvY3VzIiwgdGhpcy5vbkZvY3VzKTsKICAgICAgfQogICAgICBjbS5vZmYoInNjcm9sbCIsIHRoaXMub25TY3JvbGwpOwogICAgfSwKCiAgICBkaXNhYmxlOiBmdW5jdGlvbigpIHsKICAgICAgdGhpcy5jb21wbGV0aW9uLmNtLnJlbW92ZUtleU1hcCh0aGlzLmtleU1hcCk7CiAgICAgIHZhciB3aWRnZXQgPSB0aGlzOwogICAgICB0aGlzLmtleU1hcCA9IHtFbnRlcjogZnVuY3Rpb24oKSB7IHdpZGdldC5waWNrZWQgPSB0cnVlOyB9fTsKICAgICAgdGhpcy5jb21wbGV0aW9uLmNtLmFkZEtleU1hcCh0aGlzLmtleU1hcCk7CiAgICB9LAoKICAgIHBpY2s6IGZ1bmN0aW9uKCkgewogICAgICB0aGlzLmNvbXBsZXRpb24ucGljayh0aGlzLmRhdGEsIHRoaXMuc2VsZWN0ZWRIaW50KTsKICAgIH0sCgogICAgY2hhbmdlQWN0aXZlOiBmdW5jdGlvbihpLCBhdm9pZFdyYXApIHsKICAgICAgaWYgKGkgPj0gdGhpcy5kYXRhLmxpc3QubGVuZ3RoKQogICAgICAgIGkgPSBhdm9pZFdyYXAgPyB0aGlzLmRhdGEubGlzdC5sZW5ndGggLSAxIDogMDsKICAgICAgZWxzZSBpZiAoaSA8IDApCiAgICAgICAgaSA9IGF2b2lkV3JhcCA/IDAgIDogdGhpcy5kYXRhLmxpc3QubGVuZ3RoIC0gMTsKICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRIaW50ID09IGkpIHJldHVybjsKICAgICAgdmFyIG5vZGUgPSB0aGlzLmhpbnRzLmNoaWxkTm9kZXNbdGhpcy5zZWxlY3RlZEhpbnRdOwogICAgICBub2RlLmNsYXNzTmFtZSA9IG5vZGUuY2xhc3NOYW1lLnJlcGxhY2UoIiAiICsgQUNUSVZFX0hJTlRfRUxFTUVOVF9DTEFTUywgIiIpOwogICAgICBub2RlID0gdGhpcy5oaW50cy5jaGlsZE5vZGVzW3RoaXMuc2VsZWN0ZWRIaW50ID0gaV07CiAgICAgIG5vZGUuY2xhc3NOYW1lICs9ICIgIiArIEFDVElWRV9ISU5UX0VMRU1FTlRfQ0xBU1M7CiAgICAgIGlmIChub2RlLm9mZnNldFRvcCA8IHRoaXMuaGludHMuc2Nyb2xsVG9wKQogICAgICAgIHRoaXMuaGludHMuc2Nyb2xsVG9wID0gbm9kZS5vZmZzZXRUb3AgLSAzOwogICAgICBlbHNlIGlmIChub2RlLm9mZnNldFRvcCArIG5vZGUub2Zmc2V0SGVpZ2h0ID4gdGhpcy5oaW50cy5zY3JvbGxUb3AgKyB0aGlzLmhpbnRzLmNsaWVudEhlaWdodCkKICAgICAgICB0aGlzLmhpbnRzLnNjcm9sbFRvcCA9IG5vZGUub2Zmc2V0VG9wICsgbm9kZS5vZmZzZXRIZWlnaHQgLSB0aGlzLmhpbnRzLmNsaWVudEhlaWdodCArIDM7CiAgICAgIENvZGVNaXJyb3Iuc2lnbmFsKHRoaXMuZGF0YSwgInNlbGVjdCIsIHRoaXMuZGF0YS5saXN0W3RoaXMuc2VsZWN0ZWRIaW50XSwgbm9kZSk7CiAgICB9LAoKICAgIHNjcmVlbkFtb3VudDogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBNYXRoLmZsb29yKHRoaXMuaGludHMuY2xpZW50SGVpZ2h0IC8gdGhpcy5oaW50cy5maXJzdENoaWxkLm9mZnNldEhlaWdodCkgfHwgMTsKICAgIH0KICB9OwoKICBmdW5jdGlvbiBhcHBsaWNhYmxlSGVscGVycyhjbSwgaGVscGVycykgewogICAgaWYgKCFjbS5zb21ldGhpbmdTZWxlY3RlZCgpKSByZXR1cm4gaGVscGVycwogICAgdmFyIHJlc3VsdCA9IFtdCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhlbHBlcnMubGVuZ3RoOyBpKyspCiAgICAgIGlmIChoZWxwZXJzW2ldLnN1cHBvcnRzU2VsZWN0aW9uKSByZXN1bHQucHVzaChoZWxwZXJzW2ldKQogICAgcmV0dXJuIHJlc3VsdAogIH0KCiAgZnVuY3Rpb24gZmV0Y2hIaW50cyhoaW50LCBjbSwgb3B0aW9ucywgY2FsbGJhY2spIHsKICAgIGlmIChoaW50LmFzeW5jKSB7CiAgICAgIGhpbnQoY20sIGNhbGxiYWNrLCBvcHRpb25zKQogICAgfSBlbHNlIHsKICAgICAgdmFyIHJlc3VsdCA9IGhpbnQoY20sIG9wdGlvbnMpCiAgICAgIGlmIChyZXN1bHQgJiYgcmVzdWx0LnRoZW4pIHJlc3VsdC50aGVuKGNhbGxiYWNrKQogICAgICBlbHNlIGNhbGxiYWNrKHJlc3VsdCkKICAgIH0KICB9CgogIGZ1bmN0aW9uIHJlc29sdmVBdXRvSGludHMoY20sIHBvcykgewogICAgdmFyIGhlbHBlcnMgPSBjbS5nZXRIZWxwZXJzKHBvcywgImhpbnQiKSwgd29yZHMKICAgIGlmIChoZWxwZXJzLmxlbmd0aCkgewogICAgICB2YXIgcmVzb2x2ZWQgPSBmdW5jdGlvbihjbSwgY2FsbGJhY2ssIG9wdGlvbnMpIHsKICAgICAgICB2YXIgYXBwID0gYXBwbGljYWJsZUhlbHBlcnMoY20sIGhlbHBlcnMpOwogICAgICAgIGZ1bmN0aW9uIHJ1bihpKSB7CiAgICAgICAgICBpZiAoaSA9PSBhcHAubGVuZ3RoKSByZXR1cm4gY2FsbGJhY2sobnVsbCkKICAgICAgICAgIGZldGNoSGludHMoYXBwW2ldLCBjbSwgb3B0aW9ucywgZnVuY3Rpb24ocmVzdWx0KSB7CiAgICAgICAgICAgIGlmIChyZXN1bHQgJiYgcmVzdWx0Lmxpc3QubGVuZ3RoID4gMCkgY2FsbGJhY2socmVzdWx0KQogICAgICAgICAgICBlbHNlIHJ1bihpICsgMSkKICAgICAgICAgIH0pCiAgICAgICAgfQogICAgICAgIHJ1bigwKQogICAgICB9CiAgICAgIHJlc29sdmVkLmFzeW5jID0gdHJ1ZQogICAgICByZXNvbHZlZC5zdXBwb3J0c1NlbGVjdGlvbiA9IHRydWUKICAgICAgcmV0dXJuIHJlc29sdmVkCiAgICB9IGVsc2UgaWYgKHdvcmRzID0gY20uZ2V0SGVscGVyKGNtLmdldEN1cnNvcigpLCAiaGludFdvcmRzIikpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKGNtKSB7IHJldHVybiBDb2RlTWlycm9yLmhpbnQuZnJvbUxpc3QoY20sIHt3b3Jkczogd29yZHN9KSB9CiAgICB9IGVsc2UgaWYgKENvZGVNaXJyb3IuaGludC5hbnl3b3JkKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihjbSwgb3B0aW9ucykgeyByZXR1cm4gQ29kZU1pcnJvci5oaW50LmFueXdvcmQoY20sIG9wdGlvbnMpIH0KICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHt9CiAgICB9CiAgfQoKICBDb2RlTWlycm9yLnJlZ2lzdGVySGVscGVyKCJoaW50IiwgImF1dG8iLCB7CiAgICByZXNvbHZlOiByZXNvbHZlQXV0b0hpbnRzCiAgfSk7CgogIENvZGVNaXJyb3IucmVnaXN0ZXJIZWxwZXIoImhpbnQiLCAiZnJvbUxpc3QiLCBmdW5jdGlvbihjbSwgb3B0aW9ucykgewogICAgdmFyIGN1ciA9IGNtLmdldEN1cnNvcigpLCB0b2tlbiA9IGNtLmdldFRva2VuQXQoY3VyKTsKICAgIHZhciB0byA9IENvZGVNaXJyb3IuUG9zKGN1ci5saW5lLCB0b2tlbi5lbmQpOwogICAgaWYgKHRva2VuLnN0cmluZyAmJiAvXHcvLnRlc3QodG9rZW4uc3RyaW5nW3Rva2VuLnN0cmluZy5sZW5ndGggLSAxXSkpIHsKICAgICAgdmFyIHRlcm0gPSB0b2tlbi5zdHJpbmcsIGZyb20gPSBDb2RlTWlycm9yLlBvcyhjdXIubGluZSwgdG9rZW4uc3RhcnQpOwogICAgfSBlbHNlIHsKICAgICAgdmFyIHRlcm0gPSAiIiwgZnJvbSA9IHRvOwogICAgfQogICAgdmFyIGZvdW5kID0gW107CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9wdGlvbnMud29yZHMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIHdvcmQgPSBvcHRpb25zLndvcmRzW2ldOwogICAgICBpZiAod29yZC5zbGljZSgwLCB0ZXJtLmxlbmd0aCkgPT0gdGVybSkKICAgICAgICBmb3VuZC5wdXNoKHdvcmQpOwogICAgfQoKICAgIGlmIChmb3VuZC5sZW5ndGgpIHJldHVybiB7bGlzdDogZm91bmQsIGZyb206IGZyb20sIHRvOiB0b307CiAgfSk7CgogIENvZGVNaXJyb3IuY29tbWFuZHMuYXV0b2NvbXBsZXRlID0gQ29kZU1pcnJvci5zaG93SGludDsKCiAgdmFyIGRlZmF1bHRPcHRpb25zID0gewogICAgaGludDogQ29kZU1pcnJvci5oaW50LmF1dG8sCiAgICBjb21wbGV0ZVNpbmdsZTogdHJ1ZSwKICAgIGFsaWduV2l0aFdvcmQ6IHRydWUsCiAgICBjbG9zZUNoYXJhY3RlcnM6IC9bXHMoKVxbXF17fTs6PixdLywKICAgIGNsb3NlT25VbmZvY3VzOiB0cnVlLAogICAgY29tcGxldGVPblNpbmdsZUNsaWNrOiB0cnVlLAogICAgY29udGFpbmVyOiBudWxsLAogICAgY3VzdG9tS2V5czogbnVsbCwKICAgIGV4dHJhS2V5czogbnVsbAogIH07CgogIENvZGVNaXJyb3IuZGVmaW5lT3B0aW9uKCJoaW50T3B0aW9ucyIsIG51bGwpOwp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/hint/sql-hint.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSwgcmVxdWlyZSgiLi4vLi4vbW9kZS9zcWwvc3FsIikpOwogIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kKSAvLyBBTUQKICAgIGRlZmluZShbIi4uLy4uL2xpYi9jb2RlbWlycm9yIiwgIi4uLy4uL21vZGUvc3FsL3NxbCJdLCBtb2QpOwogIGVsc2UgLy8gUGxhaW4gYnJvd3NlciBlbnYKICAgIG1vZChDb2RlTWlycm9yKTsKfSkoZnVuY3Rpb24oQ29kZU1pcnJvcikgewogICJ1c2Ugc3RyaWN0IjsKCiAgdmFyIHRhYmxlczsKICB2YXIgZGVmYXVsdFRhYmxlOwogIHZhciBrZXl3b3JkczsKICB2YXIgQ09OUyA9IHsKICAgIFFVRVJZX0RJVjogIjsiLAogICAgQUxJQVNfS0VZV09SRDogIkFTIgogIH07CiAgdmFyIFBvcyA9IENvZGVNaXJyb3IuUG9zLCBjbXBQb3MgPSBDb2RlTWlycm9yLmNtcFBvczsKCiAgZnVuY3Rpb24gaXNBcnJheSh2YWwpIHsgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWwpID09ICJbb2JqZWN0IEFycmF5XSIgfQoKICBmdW5jdGlvbiBnZXRLZXl3b3JkcyhlZGl0b3IpIHsKICAgIHZhciBtb2RlID0gZWRpdG9yLmRvYy5tb2RlT3B0aW9uOwogICAgaWYgKG1vZGUgPT09ICJzcWwiKSBtb2RlID0gInRleHQveC1zcWwiOwogICAgcmV0dXJuIENvZGVNaXJyb3IucmVzb2x2ZU1vZGUobW9kZSkua2V5d29yZHM7CiAgfQoKICBmdW5jdGlvbiBnZXRUZXh0KGl0ZW0pIHsKICAgIHJldHVybiB0eXBlb2YgaXRlbSA9PSAic3RyaW5nIiA/IGl0ZW0gOiBpdGVtLnRleHQ7CiAgfQoKICBmdW5jdGlvbiB3cmFwVGFibGUobmFtZSwgdmFsdWUpIHsKICAgIGlmIChpc0FycmF5KHZhbHVlKSkgdmFsdWUgPSB7Y29sdW1uczogdmFsdWV9CiAgICBpZiAoIXZhbHVlLnRleHQpIHZhbHVlLnRleHQgPSBuYW1lCiAgICByZXR1cm4gdmFsdWUKICB9CgogIGZ1bmN0aW9uIHBhcnNlVGFibGVzKGlucHV0KSB7CiAgICB2YXIgcmVzdWx0ID0ge30KICAgIGlmIChpc0FycmF5KGlucHV0KSkgewogICAgICBmb3IgKHZhciBpID0gaW5wdXQubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICB2YXIgaXRlbSA9IGlucHV0W2ldCiAgICAgICAgcmVzdWx0W2dldFRleHQoaXRlbSkudG9VcHBlckNhc2UoKV0gPSB3cmFwVGFibGUoZ2V0VGV4dChpdGVtKSwgaXRlbSkKICAgICAgfQogICAgfSBlbHNlIGlmIChpbnB1dCkgewogICAgICBmb3IgKHZhciBuYW1lIGluIGlucHV0KQogICAgICAgIHJlc3VsdFtuYW1lLnRvVXBwZXJDYXNlKCldID0gd3JhcFRhYmxlKG5hbWUsIGlucHV0W25hbWVdKQogICAgfQogICAgcmV0dXJuIHJlc3VsdAogIH0KCiAgZnVuY3Rpb24gZ2V0VGFibGUobmFtZSkgewogICAgcmV0dXJuIHRhYmxlc1tuYW1lLnRvVXBwZXJDYXNlKCldCiAgfQoKICBmdW5jdGlvbiBzaGFsbG93Q2xvbmUob2JqZWN0KSB7CiAgICB2YXIgcmVzdWx0ID0ge307CiAgICBmb3IgKHZhciBrZXkgaW4gb2JqZWN0KSBpZiAob2JqZWN0Lmhhc093blByb3BlcnR5KGtleSkpCiAgICAgIHJlc3VsdFtrZXldID0gb2JqZWN0W2tleV07CiAgICByZXR1cm4gcmVzdWx0OwogIH0KCiAgZnVuY3Rpb24gbWF0Y2goc3RyaW5nLCB3b3JkKSB7CiAgICB2YXIgbGVuID0gc3RyaW5nLmxlbmd0aDsKICAgIHZhciBzdWIgPSBnZXRUZXh0KHdvcmQpLnN1YnN0cigwLCBsZW4pOwogICAgcmV0dXJuIHN0cmluZy50b1VwcGVyQ2FzZSgpID09PSBzdWIudG9VcHBlckNhc2UoKTsKICB9CgogIGZ1bmN0aW9uIGFkZE1hdGNoZXMocmVzdWx0LCBzZWFyY2gsIHdvcmRsaXN0LCBmb3JtYXR0ZXIpIHsKICAgIGlmIChpc0FycmF5KHdvcmRsaXN0KSkgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHdvcmRsaXN0Lmxlbmd0aDsgaSsrKQogICAgICAgIGlmIChtYXRjaChzZWFyY2gsIHdvcmRsaXN0W2ldKSkgcmVzdWx0LnB1c2goZm9ybWF0dGVyKHdvcmRsaXN0W2ldKSkKICAgIH0gZWxzZSB7CiAgICAgIGZvciAodmFyIHdvcmQgaW4gd29yZGxpc3QpIGlmICh3b3JkbGlzdC5oYXNPd25Qcm9wZXJ0eSh3b3JkKSkgewogICAgICAgIHZhciB2YWwgPSB3b3JkbGlzdFt3b3JkXQogICAgICAgIGlmICghdmFsIHx8IHZhbCA9PT0gdHJ1ZSkKICAgICAgICAgIHZhbCA9IHdvcmQKICAgICAgICBlbHNlCiAgICAgICAgICB2YWwgPSB2YWwuZGlzcGxheVRleHQgPyB7dGV4dDogdmFsLnRleHQsIGRpc3BsYXlUZXh0OiB2YWwuZGlzcGxheVRleHR9IDogdmFsLnRleHQKICAgICAgICBpZiAobWF0Y2goc2VhcmNoLCB2YWwpKSByZXN1bHQucHVzaChmb3JtYXR0ZXIodmFsKSkKICAgICAgfQogICAgfQogIH0KCiAgZnVuY3Rpb24gY2xlYW5OYW1lKG5hbWUpIHsKICAgIC8vIEdldCByaWQgbmFtZSBmcm9tIGJhY2t0aWNrcyhgKSBhbmQgcHJlY2VkaW5nIGRvdCguKQogICAgaWYgKG5hbWUuY2hhckF0KDApID09ICIuIikgewogICAgICBuYW1lID0gbmFtZS5zdWJzdHIoMSk7CiAgICB9CiAgICByZXR1cm4gbmFtZS5yZXBsYWNlKC9gL2csICIiKTsKICB9CgogIGZ1bmN0aW9uIGluc2VydEJhY2t0aWNrcyhuYW1lKSB7CiAgICB2YXIgbmFtZVBhcnRzID0gZ2V0VGV4dChuYW1lKS5zcGxpdCgiLiIpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuYW1lUGFydHMubGVuZ3RoOyBpKyspCiAgICAgIG5hbWVQYXJ0c1tpXSA9ICJgIiArIG5hbWVQYXJ0c1tpXSArICJgIjsKICAgIHZhciBlc2NhcGVkID0gbmFtZVBhcnRzLmpvaW4oIi4iKTsKICAgIGlmICh0eXBlb2YgbmFtZSA9PSAic3RyaW5nIikgcmV0dXJuIGVzY2FwZWQ7CiAgICBuYW1lID0gc2hhbGxvd0Nsb25lKG5hbWUpOwogICAgbmFtZS50ZXh0ID0gZXNjYXBlZDsKICAgIHJldHVybiBuYW1lOwogIH0KCiAgZnVuY3Rpb24gbmFtZUNvbXBsZXRpb24oY3VyLCB0b2tlbiwgcmVzdWx0LCBlZGl0b3IpIHsKICAgIC8vIFRyeSB0byBjb21wbGV0ZSB0YWJsZSwgY29sdW1uIG5hbWVzIGFuZCByZXR1cm4gc3RhcnQgcG9zaXRpb24gb2YgY29tcGxldGlvbgogICAgdmFyIHVzZUJhY2t0aWNrID0gZmFsc2U7CiAgICB2YXIgbmFtZVBhcnRzID0gW107CiAgICB2YXIgc3RhcnQgPSB0b2tlbi5zdGFydDsKICAgIHZhciBjb250ID0gdHJ1ZTsKICAgIHdoaWxlIChjb250KSB7CiAgICAgIGNvbnQgPSAodG9rZW4uc3RyaW5nLmNoYXJBdCgwKSA9PSAiLiIpOwogICAgICB1c2VCYWNrdGljayA9IHVzZUJhY2t0aWNrIHx8ICh0b2tlbi5zdHJpbmcuY2hhckF0KDApID09ICJgIik7CgogICAgICBzdGFydCA9IHRva2VuLnN0YXJ0OwogICAgICBuYW1lUGFydHMudW5zaGlmdChjbGVhbk5hbWUodG9rZW4uc3RyaW5nKSk7CgogICAgICB0b2tlbiA9IGVkaXRvci5nZXRUb2tlbkF0KFBvcyhjdXIubGluZSwgdG9rZW4uc3RhcnQpKTsKICAgICAgaWYgKHRva2VuLnN0cmluZyA9PSAiLiIpIHsKICAgICAgICBjb250ID0gdHJ1ZTsKICAgICAgICB0b2tlbiA9IGVkaXRvci5nZXRUb2tlbkF0KFBvcyhjdXIubGluZSwgdG9rZW4uc3RhcnQpKTsKICAgICAgfQogICAgfQoKICAgIC8vIFRyeSB0byBjb21wbGV0ZSB0YWJsZSBuYW1lcwogICAgdmFyIHN0cmluZyA9IG5hbWVQYXJ0cy5qb2luKCIuIik7CiAgICBhZGRNYXRjaGVzKHJlc3VsdCwgc3RyaW5nLCB0YWJsZXMsIGZ1bmN0aW9uKHcpIHsKICAgICAgcmV0dXJuIHVzZUJhY2t0aWNrID8gaW5zZXJ0QmFja3RpY2tzKHcpIDogdzsKICAgIH0pOwoKICAgIC8vIFRyeSB0byBjb21wbGV0ZSBjb2x1bW5zIGZyb20gZGVmYXVsdFRhYmxlCiAgICBhZGRNYXRjaGVzKHJlc3VsdCwgc3RyaW5nLCBkZWZhdWx0VGFibGUsIGZ1bmN0aW9uKHcpIHsKICAgICAgcmV0dXJuIHVzZUJhY2t0aWNrID8gaW5zZXJ0QmFja3RpY2tzKHcpIDogdzsKICAgIH0pOwoKICAgIC8vIFRyeSB0byBjb21wbGV0ZSBjb2x1bW5zCiAgICBzdHJpbmcgPSBuYW1lUGFydHMucG9wKCk7CiAgICB2YXIgdGFibGUgPSBuYW1lUGFydHMuam9pbigiLiIpOwoKICAgIHZhciBhbGlhcyA9IGZhbHNlOwogICAgdmFyIGFsaWFzVGFibGUgPSB0YWJsZTsKICAgIC8vIENoZWNrIGlmIHRhYmxlIGlzIGF2YWlsYWJsZS4gSWYgbm90LCBmaW5kIHRhYmxlIGJ5IEFsaWFzCiAgICBpZiAoIWdldFRhYmxlKHRhYmxlKSkgewogICAgICB2YXIgb2xkVGFibGUgPSB0YWJsZTsKICAgICAgdGFibGUgPSBmaW5kVGFibGVCeUFsaWFzKHRhYmxlLCBlZGl0b3IpOwogICAgICBpZiAodGFibGUgIT09IG9sZFRhYmxlKSBhbGlhcyA9IHRydWU7CiAgICB9CgogICAgdmFyIGNvbHVtbnMgPSBnZXRUYWJsZSh0YWJsZSk7CiAgICBpZiAoY29sdW1ucyAmJiBjb2x1bW5zLmNvbHVtbnMpCiAgICAgIGNvbHVtbnMgPSBjb2x1bW5zLmNvbHVtbnM7CgogICAgaWYgKGNvbHVtbnMpIHsKICAgICAgYWRkTWF0Y2hlcyhyZXN1bHQsIHN0cmluZywgY29sdW1ucywgZnVuY3Rpb24odykgewogICAgICAgIHZhciB0YWJsZUluc2VydCA9IHRhYmxlOwogICAgICAgIGlmIChhbGlhcyA9PSB0cnVlKSB0YWJsZUluc2VydCA9IGFsaWFzVGFibGU7CiAgICAgICAgaWYgKHR5cGVvZiB3ID09ICJzdHJpbmciKSB7CiAgICAgICAgICB3ID0gdGFibGVJbnNlcnQgKyAiLiIgKyB3OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB3ID0gc2hhbGxvd0Nsb25lKHcpOwogICAgICAgICAgdy50ZXh0ID0gdGFibGVJbnNlcnQgKyAiLiIgKyB3LnRleHQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiB1c2VCYWNrdGljayA/IGluc2VydEJhY2t0aWNrcyh3KSA6IHc7CiAgICAgIH0pOwogICAgfQoKICAgIHJldHVybiBzdGFydDsKICB9CgogIGZ1bmN0aW9uIGVhY2hXb3JkKGxpbmVUZXh0LCBmKSB7CiAgICBpZiAoIWxpbmVUZXh0KSByZXR1cm47CiAgICB2YXIgZXhjZXB0ZWQgPSAvWyw7XS9nOwogICAgdmFyIHdvcmRzID0gbGluZVRleHQuc3BsaXQoIiAiKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgd29yZHMubGVuZ3RoOyBpKyspIHsKICAgICAgZih3b3Jkc1tpXT93b3Jkc1tpXS5yZXBsYWNlKGV4Y2VwdGVkLCAnJykgOiAnJyk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBmaW5kVGFibGVCeUFsaWFzKGFsaWFzLCBlZGl0b3IpIHsKICAgIHZhciBkb2MgPSBlZGl0b3IuZG9jOwogICAgdmFyIGZ1bGxRdWVyeSA9IGRvYy5nZXRWYWx1ZSgpOwogICAgdmFyIGFsaWFzVXBwZXJDYXNlID0gYWxpYXMudG9VcHBlckNhc2UoKTsKICAgIHZhciBwcmV2aW91c1dvcmQgPSAiIjsKICAgIHZhciB0YWJsZSA9ICIiOwogICAgdmFyIHNlcGFyYXRvciA9IFtdOwogICAgdmFyIHZhbGlkUmFuZ2UgPSB7CiAgICAgIHN0YXJ0OiBQb3MoMCwgMCksCiAgICAgIGVuZDogUG9zKGVkaXRvci5sYXN0TGluZSgpLCBlZGl0b3IuZ2V0TGluZUhhbmRsZShlZGl0b3IubGFzdExpbmUoKSkubGVuZ3RoKQogICAgfTsKCiAgICAvL2FkZCBzZXBhcmF0b3IKICAgIHZhciBpbmRleE9mU2VwYXJhdG9yID0gZnVsbFF1ZXJ5LmluZGV4T2YoQ09OUy5RVUVSWV9ESVYpOwogICAgd2hpbGUoaW5kZXhPZlNlcGFyYXRvciAhPSAtMSkgewogICAgICBzZXBhcmF0b3IucHVzaChkb2MucG9zRnJvbUluZGV4KGluZGV4T2ZTZXBhcmF0b3IpKTsKICAgICAgaW5kZXhPZlNlcGFyYXRvciA9IGZ1bGxRdWVyeS5pbmRleE9mKENPTlMuUVVFUllfRElWLCBpbmRleE9mU2VwYXJhdG9yKzEpOwogICAgfQogICAgc2VwYXJhdG9yLnVuc2hpZnQoUG9zKDAsIDApKTsKICAgIHNlcGFyYXRvci5wdXNoKFBvcyhlZGl0b3IubGFzdExpbmUoKSwgZWRpdG9yLmdldExpbmVIYW5kbGUoZWRpdG9yLmxhc3RMaW5lKCkpLnRleHQubGVuZ3RoKSk7CgogICAgLy9maW5kIHZhbGlkIHJhbmdlCiAgICB2YXIgcHJldkl0ZW0gPSBudWxsOwogICAgdmFyIGN1cnJlbnQgPSBlZGl0b3IuZ2V0Q3Vyc29yKCkKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VwYXJhdG9yLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmICgocHJldkl0ZW0gPT0gbnVsbCB8fCBjbXBQb3MoY3VycmVudCwgcHJldkl0ZW0pID4gMCkgJiYgY21wUG9zKGN1cnJlbnQsIHNlcGFyYXRvcltpXSkgPD0gMCkgewogICAgICAgIHZhbGlkUmFuZ2UgPSB7c3RhcnQ6IHByZXZJdGVtLCBlbmQ6IHNlcGFyYXRvcltpXX07CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgcHJldkl0ZW0gPSBzZXBhcmF0b3JbaV07CiAgICB9CgogICAgdmFyIHF1ZXJ5ID0gZG9jLmdldFJhbmdlKHZhbGlkUmFuZ2Uuc3RhcnQsIHZhbGlkUmFuZ2UuZW5kLCBmYWxzZSk7CgogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWVyeS5sZW5ndGg7IGkrKykgewogICAgICB2YXIgbGluZVRleHQgPSBxdWVyeVtpXTsKICAgICAgZWFjaFdvcmQobGluZVRleHQsIGZ1bmN0aW9uKHdvcmQpIHsKICAgICAgICB2YXIgd29yZFVwcGVyQ2FzZSA9IHdvcmQudG9VcHBlckNhc2UoKTsKICAgICAgICBpZiAod29yZFVwcGVyQ2FzZSA9PT0gYWxpYXNVcHBlckNhc2UgJiYgZ2V0VGFibGUocHJldmlvdXNXb3JkKSkKICAgICAgICAgIHRhYmxlID0gcHJldmlvdXNXb3JkOwogICAgICAgIGlmICh3b3JkVXBwZXJDYXNlICE9PSBDT05TLkFMSUFTX0tFWVdPUkQpCiAgICAgICAgICBwcmV2aW91c1dvcmQgPSB3b3JkOwogICAgICB9KTsKICAgICAgaWYgKHRhYmxlKSBicmVhazsKICAgIH0KICAgIHJldHVybiB0YWJsZTsKICB9CgogIENvZGVNaXJyb3IucmVnaXN0ZXJIZWxwZXIoImhpbnQiLCAic3FsIiwgZnVuY3Rpb24oZWRpdG9yLCBvcHRpb25zKSB7CiAgICB0YWJsZXMgPSBwYXJzZVRhYmxlcyhvcHRpb25zICYmIG9wdGlvbnMudGFibGVzKQogICAgdmFyIGRlZmF1bHRUYWJsZU5hbWUgPSBvcHRpb25zICYmIG9wdGlvbnMuZGVmYXVsdFRhYmxlOwogICAgdmFyIGRpc2FibGVLZXl3b3JkcyA9IG9wdGlvbnMgJiYgb3B0aW9ucy5kaXNhYmxlS2V5d29yZHM7CiAgICBkZWZhdWx0VGFibGUgPSBkZWZhdWx0VGFibGVOYW1lICYmIGdldFRhYmxlKGRlZmF1bHRUYWJsZU5hbWUpOwogICAga2V5d29yZHMgPSBnZXRLZXl3b3JkcyhlZGl0b3IpOwoKICAgIGlmIChkZWZhdWx0VGFibGVOYW1lICYmICFkZWZhdWx0VGFibGUpCiAgICAgIGRlZmF1bHRUYWJsZSA9IGZpbmRUYWJsZUJ5QWxpYXMoZGVmYXVsdFRhYmxlTmFtZSwgZWRpdG9yKTsKCiAgICBkZWZhdWx0VGFibGUgPSBkZWZhdWx0VGFibGUgfHwgW107CgogICAgaWYgKGRlZmF1bHRUYWJsZS5jb2x1bW5zKQogICAgICBkZWZhdWx0VGFibGUgPSBkZWZhdWx0VGFibGUuY29sdW1uczsKCiAgICB2YXIgY3VyID0gZWRpdG9yLmdldEN1cnNvcigpOwogICAgdmFyIHJlc3VsdCA9IFtdOwogICAgdmFyIHRva2VuID0gZWRpdG9yLmdldFRva2VuQXQoY3VyKSwgc3RhcnQsIGVuZCwgc2VhcmNoOwogICAgaWYgKHRva2VuLmVuZCA+IGN1ci5jaCkgewogICAgICB0b2tlbi5lbmQgPSBjdXIuY2g7CiAgICAgIHRva2VuLnN0cmluZyA9IHRva2VuLnN0cmluZy5zbGljZSgwLCBjdXIuY2ggLSB0b2tlbi5zdGFydCk7CiAgICB9CgogICAgaWYgKHRva2VuLnN0cmluZy5tYXRjaCgvXlsuYFx3QF1cdyokLykpIHsKICAgICAgc2VhcmNoID0gdG9rZW4uc3RyaW5nOwogICAgICBzdGFydCA9IHRva2VuLnN0YXJ0OwogICAgICBlbmQgPSB0b2tlbi5lbmQ7CiAgICB9IGVsc2UgewogICAgICBzdGFydCA9IGVuZCA9IGN1ci5jaDsKICAgICAgc2VhcmNoID0gIiI7CiAgICB9CiAgICBpZiAoc2VhcmNoLmNoYXJBdCgwKSA9PSAiLiIgfHwgc2VhcmNoLmNoYXJBdCgwKSA9PSAiYCIpIHsKICAgICAgc3RhcnQgPSBuYW1lQ29tcGxldGlvbihjdXIsIHRva2VuLCByZXN1bHQsIGVkaXRvcik7CiAgICB9IGVsc2UgewogICAgICBhZGRNYXRjaGVzKHJlc3VsdCwgc2VhcmNoLCB0YWJsZXMsIGZ1bmN0aW9uKHcpIHtyZXR1cm4gdzt9KTsKICAgICAgYWRkTWF0Y2hlcyhyZXN1bHQsIHNlYXJjaCwgZGVmYXVsdFRhYmxlLCBmdW5jdGlvbih3KSB7cmV0dXJuIHc7fSk7CiAgICAgIGlmICghZGlzYWJsZUtleXdvcmRzKQogICAgICAgIGFkZE1hdGNoZXMocmVzdWx0LCBzZWFyY2gsIGtleXdvcmRzLCBmdW5jdGlvbih3KSB7cmV0dXJuIHcudG9VcHBlckNhc2UoKTt9KTsKICAgIH0KCiAgICByZXR1cm4ge2xpc3Q6IHJlc3VsdCwgZnJvbTogUG9zKGN1ci5saW5lLCBzdGFydCksIHRvOiBQb3MoY3VyLmxpbmUsIGVuZCl9OwogIH0pOwp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/hint/xml-hint.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CgogIHZhciBQb3MgPSBDb2RlTWlycm9yLlBvczsKCiAgZnVuY3Rpb24gZ2V0SGludHMoY20sIG9wdGlvbnMpIHsKICAgIHZhciB0YWdzID0gb3B0aW9ucyAmJiBvcHRpb25zLnNjaGVtYUluZm87CiAgICB2YXIgcXVvdGUgPSAob3B0aW9ucyAmJiBvcHRpb25zLnF1b3RlQ2hhcikgfHwgJyInOwogICAgaWYgKCF0YWdzKSByZXR1cm47CiAgICB2YXIgY3VyID0gY20uZ2V0Q3Vyc29yKCksIHRva2VuID0gY20uZ2V0VG9rZW5BdChjdXIpOwogICAgaWYgKHRva2VuLmVuZCA+IGN1ci5jaCkgewogICAgICB0b2tlbi5lbmQgPSBjdXIuY2g7CiAgICAgIHRva2VuLnN0cmluZyA9IHRva2VuLnN0cmluZy5zbGljZSgwLCBjdXIuY2ggLSB0b2tlbi5zdGFydCk7CiAgICB9CiAgICB2YXIgaW5uZXIgPSBDb2RlTWlycm9yLmlubmVyTW9kZShjbS5nZXRNb2RlKCksIHRva2VuLnN0YXRlKTsKICAgIGlmIChpbm5lci5tb2RlLm5hbWUgIT0gInhtbCIpIHJldHVybjsKICAgIHZhciByZXN1bHQgPSBbXSwgcmVwbGFjZVRva2VuID0gZmFsc2UsIHByZWZpeDsKICAgIHZhciB0YWcgPSAvXGJ0YWdcYi8udGVzdCh0b2tlbi50eXBlKSAmJiAhLz4kLy50ZXN0KHRva2VuLnN0cmluZyk7CiAgICB2YXIgdGFnTmFtZSA9IHRhZyAmJiAvXlx3Ly50ZXN0KHRva2VuLnN0cmluZyksIHRhZ1N0YXJ0OwoKICAgIGlmICh0YWdOYW1lKSB7CiAgICAgIHZhciBiZWZvcmUgPSBjbS5nZXRMaW5lKGN1ci5saW5lKS5zbGljZShNYXRoLm1heCgwLCB0b2tlbi5zdGFydCAtIDIpLCB0b2tlbi5zdGFydCk7CiAgICAgIHZhciB0YWdUeXBlID0gLzxcLyQvLnRlc3QoYmVmb3JlKSA/ICJjbG9zZSIgOiAvPCQvLnRlc3QoYmVmb3JlKSA/ICJvcGVuIiA6IG51bGw7CiAgICAgIGlmICh0YWdUeXBlKSB0YWdTdGFydCA9IHRva2VuLnN0YXJ0IC0gKHRhZ1R5cGUgPT0gImNsb3NlIiA/IDIgOiAxKTsKICAgIH0gZWxzZSBpZiAodGFnICYmIHRva2VuLnN0cmluZyA9PSAiPCIpIHsKICAgICAgdGFnVHlwZSA9ICJvcGVuIjsKICAgIH0gZWxzZSBpZiAodGFnICYmIHRva2VuLnN0cmluZyA9PSAiPC8iKSB7CiAgICAgIHRhZ1R5cGUgPSAiY2xvc2UiOwogICAgfQoKICAgIGlmICghdGFnICYmICFpbm5lci5zdGF0ZS50YWdOYW1lIHx8IHRhZ1R5cGUpIHsKICAgICAgaWYgKHRhZ05hbWUpCiAgICAgICAgcHJlZml4ID0gdG9rZW4uc3RyaW5nOwogICAgICByZXBsYWNlVG9rZW4gPSB0YWdUeXBlOwogICAgICB2YXIgY3ggPSBpbm5lci5zdGF0ZS5jb250ZXh0LCBjdXJUYWcgPSBjeCAmJiB0YWdzW2N4LnRhZ05hbWVdOwogICAgICB2YXIgY2hpbGRMaXN0ID0gY3ggPyBjdXJUYWcgJiYgY3VyVGFnLmNoaWxkcmVuIDogdGFnc1siIXRvcCJdOwogICAgICBpZiAoY2hpbGRMaXN0ICYmIHRhZ1R5cGUgIT0gImNsb3NlIikgewogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hpbGRMaXN0Lmxlbmd0aDsgKytpKSBpZiAoIXByZWZpeCB8fCBjaGlsZExpc3RbaV0ubGFzdEluZGV4T2YocHJlZml4LCAwKSA9PSAwKQogICAgICAgICAgcmVzdWx0LnB1c2goIjwiICsgY2hpbGRMaXN0W2ldKTsKICAgICAgfSBlbHNlIGlmICh0YWdUeXBlICE9ICJjbG9zZSIpIHsKICAgICAgICBmb3IgKHZhciBuYW1lIGluIHRhZ3MpCiAgICAgICAgICBpZiAodGFncy5oYXNPd25Qcm9wZXJ0eShuYW1lKSAmJiBuYW1lICE9ICIhdG9wIiAmJiBuYW1lICE9ICIhYXR0cnMiICYmICghcHJlZml4IHx8IG5hbWUubGFzdEluZGV4T2YocHJlZml4LCAwKSA9PSAwKSkKICAgICAgICAgICAgcmVzdWx0LnB1c2goIjwiICsgbmFtZSk7CiAgICAgIH0KICAgICAgaWYgKGN4ICYmICghcHJlZml4IHx8IHRhZ1R5cGUgPT0gImNsb3NlIiAmJiBjeC50YWdOYW1lLmxhc3RJbmRleE9mKHByZWZpeCwgMCkgPT0gMCkpCiAgICAgICAgcmVzdWx0LnB1c2goIjwvIiArIGN4LnRhZ05hbWUgKyAiPiIpOwogICAgfSBlbHNlIHsKICAgICAgLy8gQXR0cmlidXRlIGNvbXBsZXRpb24KICAgICAgdmFyIGN1clRhZyA9IHRhZ3NbaW5uZXIuc3RhdGUudGFnTmFtZV0sIGF0dHJzID0gY3VyVGFnICYmIGN1clRhZy5hdHRyczsKICAgICAgdmFyIGdsb2JhbEF0dHJzID0gdGFnc1siIWF0dHJzIl07CiAgICAgIGlmICghYXR0cnMgJiYgIWdsb2JhbEF0dHJzKSByZXR1cm47CiAgICAgIGlmICghYXR0cnMpIHsKICAgICAgICBhdHRycyA9IGdsb2JhbEF0dHJzOwogICAgICB9IGVsc2UgaWYgKGdsb2JhbEF0dHJzKSB7IC8vIENvbWJpbmUgdGFnLWxvY2FsIGFuZCBnbG9iYWwgYXR0cmlidXRlcwogICAgICAgIHZhciBzZXQgPSB7fTsKICAgICAgICBmb3IgKHZhciBubSBpbiBnbG9iYWxBdHRycykgaWYgKGdsb2JhbEF0dHJzLmhhc093blByb3BlcnR5KG5tKSkgc2V0W25tXSA9IGdsb2JhbEF0dHJzW25tXTsKICAgICAgICBmb3IgKHZhciBubSBpbiBhdHRycykgaWYgKGF0dHJzLmhhc093blByb3BlcnR5KG5tKSkgc2V0W25tXSA9IGF0dHJzW25tXTsKICAgICAgICBhdHRycyA9IHNldDsKICAgICAgfQogICAgICBpZiAodG9rZW4udHlwZSA9PSAic3RyaW5nIiB8fCB0b2tlbi5zdHJpbmcgPT0gIj0iKSB7IC8vIEEgdmFsdWUKICAgICAgICB2YXIgYmVmb3JlID0gY20uZ2V0UmFuZ2UoUG9zKGN1ci5saW5lLCBNYXRoLm1heCgwLCBjdXIuY2ggLSA2MCkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3MoY3VyLmxpbmUsIHRva2VuLnR5cGUgPT0gInN0cmluZyIgPyB0b2tlbi5zdGFydCA6IHRva2VuLmVuZCkpOwogICAgICAgIHZhciBhdE5hbWUgPSBiZWZvcmUubWF0Y2goLyhbXlxzXHUwMGEwPTw+XCJcJ10rKT0kLyksIGF0VmFsdWVzOwogICAgICAgIGlmICghYXROYW1lIHx8ICFhdHRycy5oYXNPd25Qcm9wZXJ0eShhdE5hbWVbMV0pIHx8ICEoYXRWYWx1ZXMgPSBhdHRyc1thdE5hbWVbMV1dKSkgcmV0dXJuOwogICAgICAgIGlmICh0eXBlb2YgYXRWYWx1ZXMgPT0gJ2Z1bmN0aW9uJykgYXRWYWx1ZXMgPSBhdFZhbHVlcy5jYWxsKHRoaXMsIGNtKTsgLy8gRnVuY3Rpb25zIGNhbiBiZSB1c2VkIHRvIHN1cHBseSB2YWx1ZXMgZm9yIGF1dG9jb21wbGV0ZSB3aWRnZXQKICAgICAgICBpZiAodG9rZW4udHlwZSA9PSAic3RyaW5nIikgewogICAgICAgICAgcHJlZml4ID0gdG9rZW4uc3RyaW5nOwogICAgICAgICAgdmFyIG4gPSAwOwogICAgICAgICAgaWYgKC9bJyJdLy50ZXN0KHRva2VuLnN0cmluZy5jaGFyQXQoMCkpKSB7CiAgICAgICAgICAgIHF1b3RlID0gdG9rZW4uc3RyaW5nLmNoYXJBdCgwKTsKICAgICAgICAgICAgcHJlZml4ID0gdG9rZW4uc3RyaW5nLnNsaWNlKDEpOwogICAgICAgICAgICBuKys7CiAgICAgICAgICB9CiAgICAgICAgICB2YXIgbGVuID0gdG9rZW4uc3RyaW5nLmxlbmd0aDsKICAgICAgICAgIGlmICgvWyciXS8udGVzdCh0b2tlbi5zdHJpbmcuY2hhckF0KGxlbiAtIDEpKSkgewogICAgICAgICAgICBxdW90ZSA9IHRva2VuLnN0cmluZy5jaGFyQXQobGVuIC0gMSk7CiAgICAgICAgICAgIHByZWZpeCA9IHRva2VuLnN0cmluZy5zdWJzdHIobiwgbGVuIC0gMik7CiAgICAgICAgICB9CiAgICAgICAgICByZXBsYWNlVG9rZW4gPSB0cnVlOwogICAgICAgIH0KICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGF0VmFsdWVzLmxlbmd0aDsgKytpKSBpZiAoIXByZWZpeCB8fCBhdFZhbHVlc1tpXS5sYXN0SW5kZXhPZihwcmVmaXgsIDApID09IDApCiAgICAgICAgICByZXN1bHQucHVzaChxdW90ZSArIGF0VmFsdWVzW2ldICsgcXVvdGUpOwogICAgICB9IGVsc2UgeyAvLyBBbiBhdHRyaWJ1dGUgbmFtZQogICAgICAgIGlmICh0b2tlbi50eXBlID09ICJhdHRyaWJ1dGUiKSB7CiAgICAgICAgICBwcmVmaXggPSB0b2tlbi5zdHJpbmc7CiAgICAgICAgICByZXBsYWNlVG9rZW4gPSB0cnVlOwogICAgICAgIH0KICAgICAgICBmb3IgKHZhciBhdHRyIGluIGF0dHJzKSBpZiAoYXR0cnMuaGFzT3duUHJvcGVydHkoYXR0cikgJiYgKCFwcmVmaXggfHwgYXR0ci5sYXN0SW5kZXhPZihwcmVmaXgsIDApID09IDApKQogICAgICAgICAgcmVzdWx0LnB1c2goYXR0cik7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiB7CiAgICAgIGxpc3Q6IHJlc3VsdCwKICAgICAgZnJvbTogcmVwbGFjZVRva2VuID8gUG9zKGN1ci5saW5lLCB0YWdTdGFydCA9PSBudWxsID8gdG9rZW4uc3RhcnQgOiB0YWdTdGFydCkgOiBjdXIsCiAgICAgIHRvOiByZXBsYWNlVG9rZW4gPyBQb3MoY3VyLmxpbmUsIHRva2VuLmVuZCkgOiBjdXIKICAgIH07CiAgfQoKICBDb2RlTWlycm9yLnJlZ2lzdGVySGVscGVyKCJoaW50IiwgInhtbCIsIGdldEhpbnRzKTsKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/lint/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/lint/coffeescript-lint.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovLyBEZXBlbmRzIG9uIGNvZmZlZWxpbnQuanMgZnJvbSBodHRwOi8vd3d3LmNvZmZlZWxpbnQub3JnL2pzL2NvZmZlZWxpbnQuanMKCi8vIGRlY2xhcmUgZ2xvYmFsOiBjb2ZmZWVsaW50CgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5yZWdpc3RlckhlbHBlcigibGludCIsICJjb2ZmZWVzY3JpcHQiLCBmdW5jdGlvbih0ZXh0KSB7CiAgdmFyIGZvdW5kID0gW107CiAgdmFyIHBhcnNlRXJyb3IgPSBmdW5jdGlvbihlcnIpIHsKICAgIHZhciBsb2MgPSBlcnIubGluZU51bWJlcjsKICAgIGZvdW5kLnB1c2goe2Zyb206IENvZGVNaXJyb3IuUG9zKGxvYy0xLCAwKSwKICAgICAgICAgICAgICAgIHRvOiBDb2RlTWlycm9yLlBvcyhsb2MsIDApLAogICAgICAgICAgICAgICAgc2V2ZXJpdHk6IGVyci5sZXZlbCwKICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGVyci5tZXNzYWdlfSk7CiAgfTsKICB0cnkgewogICAgdmFyIHJlcyA9IGNvZmZlZWxpbnQubGludCh0ZXh0KTsKICAgIGZvcih2YXIgaSA9IDA7IGkgPCByZXMubGVuZ3RoOyBpKyspIHsKICAgICAgcGFyc2VFcnJvcihyZXNbaV0pOwogICAgfQogIH0gY2F0Y2goZSkgewogICAgZm91bmQucHVzaCh7ZnJvbTogQ29kZU1pcnJvci5Qb3MoZS5sb2NhdGlvbi5maXJzdF9saW5lLCAwKSwKICAgICAgICAgICAgICAgIHRvOiBDb2RlTWlycm9yLlBvcyhlLmxvY2F0aW9uLmxhc3RfbGluZSwgZS5sb2NhdGlvbi5sYXN0X2NvbHVtbiksCiAgICAgICAgICAgICAgICBzZXZlcml0eTogJ2Vycm9yJywKICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGUubWVzc2FnZX0pOwogIH0KICByZXR1cm4gZm91bmQ7Cn0pOwoKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/lint/css-lint.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovLyBEZXBlbmRzIG9uIGNzc2xpbnQuanMgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vc3R1YmJvcm5lbGxhL2Nzc2xpbnQKCi8vIGRlY2xhcmUgZ2xvYmFsOiBDU1NMaW50CgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5yZWdpc3RlckhlbHBlcigibGludCIsICJjc3MiLCBmdW5jdGlvbih0ZXh0KSB7CiAgdmFyIGZvdW5kID0gW107CiAgaWYgKCF3aW5kb3cuQ1NTTGludCkgcmV0dXJuIGZvdW5kOwogIHZhciByZXN1bHRzID0gQ1NTTGludC52ZXJpZnkodGV4dCksIG1lc3NhZ2VzID0gcmVzdWx0cy5tZXNzYWdlcywgbWVzc2FnZSA9IG51bGw7CiAgZm9yICggdmFyIGkgPSAwOyBpIDwgbWVzc2FnZXMubGVuZ3RoOyBpKyspIHsKICAgIG1lc3NhZ2UgPSBtZXNzYWdlc1tpXTsKICAgIHZhciBzdGFydExpbmUgPSBtZXNzYWdlLmxpbmUgLTEsIGVuZExpbmUgPSBtZXNzYWdlLmxpbmUgLTEsIHN0YXJ0Q29sID0gbWVzc2FnZS5jb2wgLTEsIGVuZENvbCA9IG1lc3NhZ2UuY29sOwogICAgZm91bmQucHVzaCh7CiAgICAgIGZyb206IENvZGVNaXJyb3IuUG9zKHN0YXJ0TGluZSwgc3RhcnRDb2wpLAogICAgICB0bzogQ29kZU1pcnJvci5Qb3MoZW5kTGluZSwgZW5kQ29sKSwKICAgICAgbWVzc2FnZTogbWVzc2FnZS5tZXNzYWdlLAogICAgICBzZXZlcml0eSA6IG1lc3NhZ2UudHlwZQogICAgfSk7CiAgfQogIHJldHVybiBmb3VuZDsKfSk7Cgp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/lint/html-lint.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovLyBEZXBlbmRzIG9uIGh0bWxoaW50LmpzIGZyb20gaHR0cDovL2h0bWxoaW50LmNvbS9qcy9odG1saGludC5qcwoKLy8gZGVjbGFyZSBnbG9iYWw6IEhUTUxIaW50CgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSwgcmVxdWlyZSgiaHRtbGhpbnQiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiLCAiaHRtbGhpbnQiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CgogIHZhciBkZWZhdWx0UnVsZXMgPSB7CiAgICAidGFnbmFtZS1sb3dlcmNhc2UiOiB0cnVlLAogICAgImF0dHItbG93ZXJjYXNlIjogdHJ1ZSwKICAgICJhdHRyLXZhbHVlLWRvdWJsZS1xdW90ZXMiOiB0cnVlLAogICAgImRvY3R5cGUtZmlyc3QiOiBmYWxzZSwKICAgICJ0YWctcGFpciI6IHRydWUsCiAgICAic3BlYy1jaGFyLWVzY2FwZSI6IHRydWUsCiAgICAiaWQtdW5pcXVlIjogdHJ1ZSwKICAgICJzcmMtbm90LWVtcHR5IjogdHJ1ZSwKICAgICJhdHRyLW5vLWR1cGxpY2F0aW9uIjogdHJ1ZQogIH07CgogIENvZGVNaXJyb3IucmVnaXN0ZXJIZWxwZXIoImxpbnQiLCAiaHRtbCIsIGZ1bmN0aW9uKHRleHQsIG9wdGlvbnMpIHsKICAgIHZhciBmb3VuZCA9IFtdOwogICAgaWYgKCF3aW5kb3cuSFRNTEhpbnQpIHJldHVybiBmb3VuZDsKICAgIHZhciBtZXNzYWdlcyA9IEhUTUxIaW50LnZlcmlmeSh0ZXh0LCBvcHRpb25zICYmIG9wdGlvbnMucnVsZXMgfHwgZGVmYXVsdFJ1bGVzKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWVzc2FnZXMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIG1lc3NhZ2UgPSBtZXNzYWdlc1tpXTsKICAgICAgdmFyIHN0YXJ0TGluZSA9IG1lc3NhZ2UubGluZSAtIDEsIGVuZExpbmUgPSBtZXNzYWdlLmxpbmUgLSAxLCBzdGFydENvbCA9IG1lc3NhZ2UuY29sIC0gMSwgZW5kQ29sID0gbWVzc2FnZS5jb2w7CiAgICAgIGZvdW5kLnB1c2goewogICAgICAgIGZyb206IENvZGVNaXJyb3IuUG9zKHN0YXJ0TGluZSwgc3RhcnRDb2wpLAogICAgICAgIHRvOiBDb2RlTWlycm9yLlBvcyhlbmRMaW5lLCBlbmRDb2wpLAogICAgICAgIG1lc3NhZ2U6IG1lc3NhZ2UubWVzc2FnZSwKICAgICAgICBzZXZlcml0eSA6IG1lc3NhZ2UudHlwZQogICAgICB9KTsKICAgIH0KICAgIHJldHVybiBmb3VuZDsKICB9KTsKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/lint/javascript-lint.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CiAgLy8gZGVjbGFyZSBnbG9iYWw6IEpTSElOVAoKICB2YXIgYm9ndXMgPSBbICJEYW5nZXJvdXMgY29tbWVudCIgXTsKCiAgdmFyIHdhcm5pbmdzID0gWyBbICJFeHBlY3RlZCAneyciLAogICAgICAgICAgICAgICAgICAgICAiU3RhdGVtZW50IGJvZHkgc2hvdWxkIGJlIGluc2lkZSAneyB9JyBicmFjZXMuIiBdIF07CgogIHZhciBlcnJvcnMgPSBbICJNaXNzaW5nIHNlbWljb2xvbiIsICJFeHRyYSBjb21tYSIsICJNaXNzaW5nIHByb3BlcnR5IG5hbWUiLAogICAgICAgICAgICAgICAgICJVbm1hdGNoZWQgIiwgIiBhbmQgaW5zdGVhZCBzYXciLCAiIGlzIG5vdCBkZWZpbmVkIiwKICAgICAgICAgICAgICAgICAiVW5jbG9zZWQgc3RyaW5nIiwgIlN0b3BwaW5nLCB1bmFibGUgdG8gY29udGludWUiIF07CgogIGZ1bmN0aW9uIHZhbGlkYXRvcih0ZXh0LCBvcHRpb25zKSB7CiAgICBpZiAoIXdpbmRvdy5KU0hJTlQpIHJldHVybiBbXTsKICAgIEpTSElOVCh0ZXh0LCBvcHRpb25zLCBvcHRpb25zLmdsb2JhbHMpOwogICAgdmFyIGVycm9ycyA9IEpTSElOVC5kYXRhKCkuZXJyb3JzLCByZXN1bHQgPSBbXTsKICAgIGlmIChlcnJvcnMpIHBhcnNlRXJyb3JzKGVycm9ycywgcmVzdWx0KTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQoKICBDb2RlTWlycm9yLnJlZ2lzdGVySGVscGVyKCJsaW50IiwgImphdmFzY3JpcHQiLCB2YWxpZGF0b3IpOwoKICBmdW5jdGlvbiBjbGVhbnVwKGVycm9yKSB7CiAgICAvLyBBbGwgcHJvYmxlbXMgYXJlIHdhcm5pbmdzIGJ5IGRlZmF1bHQKICAgIGZpeFdpdGgoZXJyb3IsIHdhcm5pbmdzLCAid2FybmluZyIsIHRydWUpOwogICAgZml4V2l0aChlcnJvciwgZXJyb3JzLCAiZXJyb3IiKTsKCiAgICByZXR1cm4gaXNCb2d1cyhlcnJvcikgPyBudWxsIDogZXJyb3I7CiAgfQoKICBmdW5jdGlvbiBmaXhXaXRoKGVycm9yLCBmaXhlcywgc2V2ZXJpdHksIGZvcmNlKSB7CiAgICB2YXIgZGVzY3JpcHRpb24sIGZpeCwgZmluZCwgcmVwbGFjZSwgZm91bmQ7CgogICAgZGVzY3JpcHRpb24gPSBlcnJvci5kZXNjcmlwdGlvbjsKCiAgICBmb3IgKCB2YXIgaSA9IDA7IGkgPCBmaXhlcy5sZW5ndGg7IGkrKykgewogICAgICBmaXggPSBmaXhlc1tpXTsKICAgICAgZmluZCA9ICh0eXBlb2YgZml4ID09PSAic3RyaW5nIiA/IGZpeCA6IGZpeFswXSk7CiAgICAgIHJlcGxhY2UgPSAodHlwZW9mIGZpeCA9PT0gInN0cmluZyIgPyBudWxsIDogZml4WzFdKTsKICAgICAgZm91bmQgPSBkZXNjcmlwdGlvbi5pbmRleE9mKGZpbmQpICE9PSAtMTsKCiAgICAgIGlmIChmb3JjZSB8fCBmb3VuZCkgewogICAgICAgIGVycm9yLnNldmVyaXR5ID0gc2V2ZXJpdHk7CiAgICAgIH0KICAgICAgaWYgKGZvdW5kICYmIHJlcGxhY2UpIHsKICAgICAgICBlcnJvci5kZXNjcmlwdGlvbiA9IHJlcGxhY2U7CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIGlzQm9ndXMoZXJyb3IpIHsKICAgIHZhciBkZXNjcmlwdGlvbiA9IGVycm9yLmRlc2NyaXB0aW9uOwogICAgZm9yICggdmFyIGkgPSAwOyBpIDwgYm9ndXMubGVuZ3RoOyBpKyspIHsKICAgICAgaWYgKGRlc2NyaXB0aW9uLmluZGV4T2YoYm9ndXNbaV0pICE9PSAtMSkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBmdW5jdGlvbiBwYXJzZUVycm9ycyhlcnJvcnMsIG91dHB1dCkgewogICAgZm9yICggdmFyIGkgPSAwOyBpIDwgZXJyb3JzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBlcnJvciA9IGVycm9yc1tpXTsKICAgICAgaWYgKGVycm9yKSB7CiAgICAgICAgdmFyIGxpbmV0YWJwb3NpdGlvbnMsIGluZGV4OwoKICAgICAgICBsaW5ldGFicG9zaXRpb25zID0gW107CgogICAgICAgIC8vIFRoaXMgbmV4dCBibG9jayBpcyB0byBmaXggYSBwcm9ibGVtIGluIGpzaGludC4gSnNoaW50CiAgICAgICAgLy8gcmVwbGFjZXMKICAgICAgICAvLyBhbGwgdGFicyB3aXRoIHNwYWNlcyB0aGVuIHBlcmZvcm1zIHNvbWUgY2hlY2tzLiBUaGUgZXJyb3IKICAgICAgICAvLyBwb3NpdGlvbnMgKGNoYXJhY3Rlci9zcGFjZSkgYXJlIHRoZW4gcmVwb3J0ZWQgaW5jb3JyZWN0bHksCiAgICAgICAgLy8gbm90IHRha2luZyB0aGUgcmVwbGFjZW1lbnQgc3RlcCBpbnRvIGFjY291bnQuIEhlcmUgd2UgbG9vawogICAgICAgIC8vIGF0IHRoZSBldmlkZW5jZSBsaW5lIGFuZCB0cnkgdG8gYWRqdXN0IHRoZSBjaGFyYWN0ZXIgcG9zaXRpb24KICAgICAgICAvLyB0byB0aGUgY29ycmVjdCB2YWx1ZS4KICAgICAgICBpZiAoZXJyb3IuZXZpZGVuY2UpIHsKICAgICAgICAgIC8vIFRhYiBwb3NpdGlvbnMgYXJlIGNvbXB1dGVkIG9uY2UgcGVyIGxpbmUgYW5kIGNhY2hlZAogICAgICAgICAgdmFyIHRhYnBvc2l0aW9ucyA9IGxpbmV0YWJwb3NpdGlvbnNbZXJyb3IubGluZV07CiAgICAgICAgICBpZiAoIXRhYnBvc2l0aW9ucykgewogICAgICAgICAgICB2YXIgZXZpZGVuY2UgPSBlcnJvci5ldmlkZW5jZTsKICAgICAgICAgICAgdGFicG9zaXRpb25zID0gW107CiAgICAgICAgICAgIC8vIHVnZ2doIHBoYW50b21qcyBkb2VzIG5vdCBsaWtlIHRoaXMKICAgICAgICAgICAgLy8gZm9yRWFjaENoYXIoZXZpZGVuY2UsIGZ1bmN0aW9uKGl0ZW0sIGluZGV4KSB7CiAgICAgICAgICAgIEFycmF5LnByb3RvdHlwZS5mb3JFYWNoLmNhbGwoZXZpZGVuY2UsIGZ1bmN0aW9uKGl0ZW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4KSB7CiAgICAgICAgICAgICAgaWYgKGl0ZW0gPT09ICdcdCcpIHsKICAgICAgICAgICAgICAgIC8vIEZpcnN0IGNvbCBpcyAxIChub3QgMCkgdG8gbWF0Y2ggZXJyb3IKICAgICAgICAgICAgICAgIC8vIHBvc2l0aW9ucwogICAgICAgICAgICAgICAgdGFicG9zaXRpb25zLnB1c2goaW5kZXggKyAxKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBsaW5ldGFicG9zaXRpb25zW2Vycm9yLmxpbmVdID0gdGFicG9zaXRpb25zOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHRhYnBvc2l0aW9ucy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIHZhciBwb3MgPSBlcnJvci5jaGFyYWN0ZXI7CiAgICAgICAgICAgIHRhYnBvc2l0aW9ucy5mb3JFYWNoKGZ1bmN0aW9uKHRhYnBvc2l0aW9uKSB7CiAgICAgICAgICAgICAgaWYgKHBvcyA+IHRhYnBvc2l0aW9uKSBwb3MgLT0gMTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGVycm9yLmNoYXJhY3RlciA9IHBvczsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHZhciBzdGFydCA9IGVycm9yLmNoYXJhY3RlciAtIDEsIGVuZCA9IHN0YXJ0ICsgMTsKICAgICAgICBpZiAoZXJyb3IuZXZpZGVuY2UpIHsKICAgICAgICAgIGluZGV4ID0gZXJyb3IuZXZpZGVuY2Uuc3Vic3RyaW5nKHN0YXJ0KS5zZWFyY2goLy5cYi8pOwogICAgICAgICAgaWYgKGluZGV4ID4gLTEpIHsKICAgICAgICAgICAgZW5kICs9IGluZGV4OwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gQ29udmVydCB0byBmb3JtYXQgZXhwZWN0ZWQgYnkgdmFsaWRhdGlvbiBzZXJ2aWNlCiAgICAgICAgZXJyb3IuZGVzY3JpcHRpb24gPSBlcnJvci5yZWFzb247Ly8gKyAiKGpzaGludCkiOwogICAgICAgIGVycm9yLnN0YXJ0ID0gZXJyb3IuY2hhcmFjdGVyOwogICAgICAgIGVycm9yLmVuZCA9IGVuZDsKICAgICAgICBlcnJvciA9IGNsZWFudXAoZXJyb3IpOwoKICAgICAgICBpZiAoZXJyb3IpCiAgICAgICAgICBvdXRwdXQucHVzaCh7bWVzc2FnZTogZXJyb3IuZGVzY3JpcHRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgc2V2ZXJpdHk6IGVycm9yLnNldmVyaXR5LAogICAgICAgICAgICAgICAgICAgICAgIGZyb206IENvZGVNaXJyb3IuUG9zKGVycm9yLmxpbmUgLSAxLCBzdGFydCksCiAgICAgICAgICAgICAgICAgICAgICAgdG86IENvZGVNaXJyb3IuUG9zKGVycm9yLmxpbmUgLSAxLCBlbmQpfSk7CiAgICAgIH0KICAgIH0KICB9Cn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/lint/json-lint.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovLyBEZXBlbmRzIG9uIGpzb25saW50LmpzIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL3phYWNoL2pzb25saW50CgovLyBkZWNsYXJlIGdsb2JhbDoganNvbmxpbnQKCihmdW5jdGlvbihtb2QpIHsKICBpZiAodHlwZW9mIGV4cG9ydHMgPT0gIm9iamVjdCIgJiYgdHlwZW9mIG1vZHVsZSA9PSAib2JqZWN0IikgLy8gQ29tbW9uSlMKICAgIG1vZChyZXF1aXJlKCIuLi8uLi9saWIvY29kZW1pcnJvciIpKTsKICBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCkgLy8gQU1ECiAgICBkZWZpbmUoWyIuLi8uLi9saWIvY29kZW1pcnJvciJdLCBtb2QpOwogIGVsc2UgLy8gUGxhaW4gYnJvd3NlciBlbnYKICAgIG1vZChDb2RlTWlycm9yKTsKfSkoZnVuY3Rpb24oQ29kZU1pcnJvcikgewoidXNlIHN0cmljdCI7CgpDb2RlTWlycm9yLnJlZ2lzdGVySGVscGVyKCJsaW50IiwgImpzb24iLCBmdW5jdGlvbih0ZXh0KSB7CiAgdmFyIGZvdW5kID0gW107CiAganNvbmxpbnQucGFyc2VFcnJvciA9IGZ1bmN0aW9uKHN0ciwgaGFzaCkgewogICAgdmFyIGxvYyA9IGhhc2gubG9jOwogICAgZm91bmQucHVzaCh7ZnJvbTogQ29kZU1pcnJvci5Qb3MobG9jLmZpcnN0X2xpbmUgLSAxLCBsb2MuZmlyc3RfY29sdW1uKSwKICAgICAgICAgICAgICAgIHRvOiBDb2RlTWlycm9yLlBvcyhsb2MubGFzdF9saW5lIC0gMSwgbG9jLmxhc3RfY29sdW1uKSwKICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHN0cn0pOwogIH07CiAgdHJ5IHsganNvbmxpbnQucGFyc2UodGV4dCk7IH0KICBjYXRjaChlKSB7fQogIHJldHVybiBmb3VuZDsKfSk7Cgp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/lint/lint.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogVGhlIGxpbnQgbWFya2VyIGd1dHRlciAqLwouQ29kZU1pcnJvci1saW50LW1hcmtlcnMgewogIHdpZHRoOiAxNnB4Owp9CgouQ29kZU1pcnJvci1saW50LXRvb2x0aXAgewogIGJhY2tncm91bmQtY29sb3I6ICNmZmQ7CiAgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7CiAgYm9yZGVyLXJhZGl1czogNHB4IDRweCA0cHggNHB4OwogIGNvbG9yOiBibGFjazsKICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogIGZvbnQtc2l6ZTogMTBwdDsKICBvdmVyZmxvdzogaGlkZGVuOwogIHBhZGRpbmc6IDJweCA1cHg7CiAgcG9zaXRpb246IGZpeGVkOwogIHdoaXRlLXNwYWNlOiBwcmU7CiAgd2hpdGUtc3BhY2U6IHByZS13cmFwOwogIHotaW5kZXg6IDEwMDsKICBtYXgtd2lkdGg6IDYwMHB4OwogIG9wYWNpdHk6IDA7CiAgdHJhbnNpdGlvbjogb3BhY2l0eSAuNHM7CiAgLW1vei10cmFuc2l0aW9uOiBvcGFjaXR5IC40czsKICAtd2Via2l0LXRyYW5zaXRpb246IG9wYWNpdHkgLjRzOwogIC1vLXRyYW5zaXRpb246IG9wYWNpdHkgLjRzOwogIC1tcy10cmFuc2l0aW9uOiBvcGFjaXR5IC40czsKfQoKLkNvZGVNaXJyb3ItbGludC1tYXJrLWVycm9yLCAuQ29kZU1pcnJvci1saW50LW1hcmstd2FybmluZyB7CiAgYmFja2dyb3VuZC1wb3NpdGlvbjogbGVmdCBib3R0b207CiAgYmFja2dyb3VuZC1yZXBlYXQ6IHJlcGVhdC14Owp9CgouQ29kZU1pcnJvci1saW50LW1hcmstZXJyb3IgewogIGJhY2tncm91bmQtaW1hZ2U6CiAgdXJsKCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUFRQUFBQURDQVlBQUFDMDlLN0dBQUFBQVhOU1IwSUFyczRjNlFBQUFBWmlTMGRFQVA4QS93RC9vTDJua3dBQUFBbHdTRmx6QUFBTEV3QUFDeE1CQUpxY0dBQUFBQWQwU1UxRkI5c0pEdzRjT0NXMS9LSUFBQUFaZEVWWWRFTnZiVzFsYm5RQVEzSmxZWFJsWkNCM2FYUm9JRWRKVFZCWGdRNFhBQUFBSEVsRVFWUUkxMk5nZ0lML0RBei9HZEE1L3hrWS9xUEtNREF3QUFETFp3ZjVydm0rTFFBQUFBQkpSVTVFcmtKZ2dnPT0iKQogIDsKfQoKLkNvZGVNaXJyb3ItbGludC1tYXJrLXdhcm5pbmcgewogIGJhY2tncm91bmQtaW1hZ2U6IHVybCgiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBUUFBQUFEQ0FZQUFBQzA5SzdHQUFBQUFYTlNSMElBcnM0YzZRQUFBQVppUzBkRUFQOEEvd0Qvb0wybmt3QUFBQWx3U0ZsekFBQUxFd0FBQ3hNQkFKcWNHQUFBQUFkMFNVMUZCOXNKRmhRWEViaFRnN1lBQUFBWmRFVllkRU52YlcxbGJuUUFRM0psWVhSbFpDQjNhWFJvSUVkSlRWQlhnUTRYQUFBQU1rbEVRVlFJMTJOa2dJSXZKM1FYTWpBd2RETitPYUVieXNEQTRNUEF3TkROd01Dd2lPSExDZDF6WDA3bzZrQlZHUUVBS0JBTnRvYnNrTk1BQUFBQVNVVk9SSzVDWUlJPSIpOwp9CgouQ29kZU1pcnJvci1saW50LW1hcmtlci1lcnJvciwgLkNvZGVNaXJyb3ItbGludC1tYXJrZXItd2FybmluZyB7CiAgYmFja2dyb3VuZC1wb3NpdGlvbjogY2VudGVyIGNlbnRlcjsKICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OwogIGN1cnNvcjogcG9pbnRlcjsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgaGVpZ2h0OiAxNnB4OwogIHdpZHRoOiAxNnB4OwogIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgcG9zaXRpb246IHJlbGF0aXZlOwp9CgouQ29kZU1pcnJvci1saW50LW1lc3NhZ2UtZXJyb3IsIC5Db2RlTWlycm9yLWxpbnQtbWVzc2FnZS13YXJuaW5nIHsKICBwYWRkaW5nLWxlZnQ6IDE4cHg7CiAgYmFja2dyb3VuZC1wb3NpdGlvbjogdG9wIGxlZnQ7CiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsKfQoKLkNvZGVNaXJyb3ItbGludC1tYXJrZXItZXJyb3IsIC5Db2RlTWlycm9yLWxpbnQtbWVzc2FnZS1lcnJvciB7CiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUJBQUFBQVFDQU1BQUFBb0xROVRBQUFBSGxCTVZFVzdBQUM3QUFDeEFBQzdBQUM3QUFBQUFBQzRBQUM1QUFELy8vKzdBQUFVZGNscEFBQUFCblJTVGxNWG5PUlNpd0NLMFpLU0FBQUFUVWxFUVZSNDJtV1BPUTdBUUFnRHVRTHgvejhjc1lSbVBSSUZJd1JHbm9zUnJwYW12a0tpMEZUSWlNQVNSM2hoS1craEFONi90SVdodTlQRFdpVEdORWtUdElPdWNBNU95cjlja1BnQVdtMEdQQm9nNnY0QUFBQUFTVVZPUks1Q1lJST0iKTsKfQoKLkNvZGVNaXJyb3ItbGludC1tYXJrZXItd2FybmluZywgLkNvZGVNaXJyb3ItbGludC1tZXNzYWdlLXdhcm5pbmcgewogIGJhY2tncm91bmQtaW1hZ2U6IHVybCgiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFCQUFBQUFRQ0FNQUFBQW9MUTlUQUFBQU5sQk1WRVgvdXdEdnJ3RC91d0QvdXdEL3V3RC91d0QvdXdEL3V3RC91d0Q2dHdEL3V3QUFBQUR1cndEMnRRRDd1QUQrdWdBQUFBRC91d0RobWVUUkFBQUFESFJTVGxNSjhtTjFFWWNibWlpeGdBQ203V2J1QUFBQVZrbEVRVlI0Mm4zUFVRcUFJQkJGVVUxTExjM3UvamRiT0pvVzFQMDhEQTlHYmE4K1lXSjZnTkpvTllJQnpBQTJjaEJ0aDVrTG1HOVlVb0cwTkhBVXdGWHdPOUx1QlFMMWdpQ1FiOGdDOU9ybzJ2cDVybmNDSVk4TDh1RXg1WmtBQUFBQVNVVk9SSzVDWUlJPSIpOwp9CgouQ29kZU1pcnJvci1saW50LW1hcmtlci1tdWx0aXBsZSB7CiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKCJkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUFjQUFBQUhDQU1BQUFEempLZmhBQUFBQ1ZCTVZFVUFBQUFBQUFDL3Y3OTE0a3lIQUFBQUFYUlNUbE1BUU9iWVpnQUFBQ05KUkVGVWVObzFpb0VKQUFBSXdtei9IOTBpRkZTR0pnRk1lM2dhTFowb2QrOS9BUVowQURvc2JZcmFBQUFBQUVsRlRrU3VRbUNDIik7CiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDsKICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiByaWdodCBib3R0b207CiAgd2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJTsKfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/lint/lint.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CiAgdmFyIEdVVFRFUl9JRCA9ICJDb2RlTWlycm9yLWxpbnQtbWFya2VycyI7CgogIGZ1bmN0aW9uIHNob3dUb29sdGlwKGUsIGNvbnRlbnQpIHsKICAgIHZhciB0dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgdHQuY2xhc3NOYW1lID0gIkNvZGVNaXJyb3ItbGludC10b29sdGlwIjsKICAgIHR0LmFwcGVuZENoaWxkKGNvbnRlbnQuY2xvbmVOb2RlKHRydWUpKTsKICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodHQpOwoKICAgIGZ1bmN0aW9uIHBvc2l0aW9uKGUpIHsKICAgICAgaWYgKCF0dC5wYXJlbnROb2RlKSByZXR1cm4gQ29kZU1pcnJvci5vZmYoZG9jdW1lbnQsICJtb3VzZW1vdmUiLCBwb3NpdGlvbik7CiAgICAgIHR0LnN0eWxlLnRvcCA9IE1hdGgubWF4KDAsIGUuY2xpZW50WSAtIHR0Lm9mZnNldEhlaWdodCAtIDUpICsgInB4IjsKICAgICAgdHQuc3R5bGUubGVmdCA9IChlLmNsaWVudFggKyA1KSArICJweCI7CiAgICB9CiAgICBDb2RlTWlycm9yLm9uKGRvY3VtZW50LCAibW91c2Vtb3ZlIiwgcG9zaXRpb24pOwogICAgcG9zaXRpb24oZSk7CiAgICBpZiAodHQuc3R5bGUub3BhY2l0eSAhPSBudWxsKSB0dC5zdHlsZS5vcGFjaXR5ID0gMTsKICAgIHJldHVybiB0dDsKICB9CiAgZnVuY3Rpb24gcm0oZWx0KSB7CiAgICBpZiAoZWx0LnBhcmVudE5vZGUpIGVsdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGVsdCk7CiAgfQogIGZ1bmN0aW9uIGhpZGVUb29sdGlwKHR0KSB7CiAgICBpZiAoIXR0LnBhcmVudE5vZGUpIHJldHVybjsKICAgIGlmICh0dC5zdHlsZS5vcGFjaXR5ID09IG51bGwpIHJtKHR0KTsKICAgIHR0LnN0eWxlLm9wYWNpdHkgPSAwOwogICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsgcm0odHQpOyB9LCA2MDApOwogIH0KCiAgZnVuY3Rpb24gc2hvd1Rvb2x0aXBGb3IoZSwgY29udGVudCwgbm9kZSkgewogICAgdmFyIHRvb2x0aXAgPSBzaG93VG9vbHRpcChlLCBjb250ZW50KTsKICAgIGZ1bmN0aW9uIGhpZGUoKSB7CiAgICAgIENvZGVNaXJyb3Iub2ZmKG5vZGUsICJtb3VzZW91dCIsIGhpZGUpOwogICAgICBpZiAodG9vbHRpcCkgeyBoaWRlVG9vbHRpcCh0b29sdGlwKTsgdG9vbHRpcCA9IG51bGw7IH0KICAgIH0KICAgIHZhciBwb2xsID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24oKSB7CiAgICAgIGlmICh0b29sdGlwKSBmb3IgKHZhciBuID0gbm9kZTs7IG4gPSBuLnBhcmVudE5vZGUpIHsKICAgICAgICBpZiAobiAmJiBuLm5vZGVUeXBlID09IDExKSBuID0gbi5ob3N0OwogICAgICAgIGlmIChuID09IGRvY3VtZW50LmJvZHkpIHJldHVybjsKICAgICAgICBpZiAoIW4pIHsgaGlkZSgpOyBicmVhazsgfQogICAgICB9CiAgICAgIGlmICghdG9vbHRpcCkgcmV0dXJuIGNsZWFySW50ZXJ2YWwocG9sbCk7CiAgICB9LCA0MDApOwogICAgQ29kZU1pcnJvci5vbihub2RlLCAibW91c2VvdXQiLCBoaWRlKTsKICB9CgogIGZ1bmN0aW9uIExpbnRTdGF0ZShjbSwgb3B0aW9ucywgaGFzR3V0dGVyKSB7CiAgICB0aGlzLm1hcmtlZCA9IFtdOwogICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKICAgIHRoaXMudGltZW91dCA9IG51bGw7CiAgICB0aGlzLmhhc0d1dHRlciA9IGhhc0d1dHRlcjsKICAgIHRoaXMub25Nb3VzZU92ZXIgPSBmdW5jdGlvbihlKSB7IG9uTW91c2VPdmVyKGNtLCBlKTsgfTsKICAgIHRoaXMud2FpdGluZ0ZvciA9IDAKICB9CgogIGZ1bmN0aW9uIHBhcnNlT3B0aW9ucyhfY20sIG9wdGlvbnMpIHsKICAgIGlmIChvcHRpb25zIGluc3RhbmNlb2YgRnVuY3Rpb24pIHJldHVybiB7Z2V0QW5ub3RhdGlvbnM6IG9wdGlvbnN9OwogICAgaWYgKCFvcHRpb25zIHx8IG9wdGlvbnMgPT09IHRydWUpIG9wdGlvbnMgPSB7fTsKICAgIHJldHVybiBvcHRpb25zOwogIH0KCiAgZnVuY3Rpb24gY2xlYXJNYXJrcyhjbSkgewogICAgdmFyIHN0YXRlID0gY20uc3RhdGUubGludDsKICAgIGlmIChzdGF0ZS5oYXNHdXR0ZXIpIGNtLmNsZWFyR3V0dGVyKEdVVFRFUl9JRCk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0YXRlLm1hcmtlZC5sZW5ndGg7ICsraSkKICAgICAgc3RhdGUubWFya2VkW2ldLmNsZWFyKCk7CiAgICBzdGF0ZS5tYXJrZWQubGVuZ3RoID0gMDsKICB9CgogIGZ1bmN0aW9uIG1ha2VNYXJrZXIobGFiZWxzLCBzZXZlcml0eSwgbXVsdGlwbGUsIHRvb2x0aXBzKSB7CiAgICB2YXIgbWFya2VyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksIGlubmVyID0gbWFya2VyOwogICAgbWFya2VyLmNsYXNzTmFtZSA9ICJDb2RlTWlycm9yLWxpbnQtbWFya2VyLSIgKyBzZXZlcml0eTsKICAgIGlmIChtdWx0aXBsZSkgewogICAgICBpbm5lciA9IG1hcmtlci5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSk7CiAgICAgIGlubmVyLmNsYXNzTmFtZSA9ICJDb2RlTWlycm9yLWxpbnQtbWFya2VyLW11bHRpcGxlIjsKICAgIH0KCiAgICBpZiAodG9vbHRpcHMgIT0gZmFsc2UpIENvZGVNaXJyb3Iub24oaW5uZXIsICJtb3VzZW92ZXIiLCBmdW5jdGlvbihlKSB7CiAgICAgIHNob3dUb29sdGlwRm9yKGUsIGxhYmVscywgaW5uZXIpOwogICAgfSk7CgogICAgcmV0dXJuIG1hcmtlcjsKICB9CgogIGZ1bmN0aW9uIGdldE1heFNldmVyaXR5KGEsIGIpIHsKICAgIGlmIChhID09ICJlcnJvciIpIHJldHVybiBhOwogICAgZWxzZSByZXR1cm4gYjsKICB9CgogIGZ1bmN0aW9uIGdyb3VwQnlMaW5lKGFubm90YXRpb25zKSB7CiAgICB2YXIgbGluZXMgPSBbXTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYW5ub3RhdGlvbnMubGVuZ3RoOyArK2kpIHsKICAgICAgdmFyIGFubiA9IGFubm90YXRpb25zW2ldLCBsaW5lID0gYW5uLmZyb20ubGluZTsKICAgICAgKGxpbmVzW2xpbmVdIHx8IChsaW5lc1tsaW5lXSA9IFtdKSkucHVzaChhbm4pOwogICAgfQogICAgcmV0dXJuIGxpbmVzOwogIH0KCiAgZnVuY3Rpb24gYW5ub3RhdGlvblRvb2x0aXAoYW5uKSB7CiAgICB2YXIgc2V2ZXJpdHkgPSBhbm4uc2V2ZXJpdHk7CiAgICBpZiAoIXNldmVyaXR5KSBzZXZlcml0eSA9ICJlcnJvciI7CiAgICB2YXIgdGlwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICB0aXAuY2xhc3NOYW1lID0gIkNvZGVNaXJyb3ItbGludC1tZXNzYWdlLSIgKyBzZXZlcml0eTsKICAgIHRpcC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShhbm4ubWVzc2FnZSkpOwogICAgcmV0dXJuIHRpcDsKICB9CgogIGZ1bmN0aW9uIGxpbnRBc3luYyhjbSwgZ2V0QW5ub3RhdGlvbnMsIHBhc3NPcHRpb25zKSB7CiAgICB2YXIgc3RhdGUgPSBjbS5zdGF0ZS5saW50CiAgICB2YXIgaWQgPSArK3N0YXRlLndhaXRpbmdGb3IKICAgIGZ1bmN0aW9uIGFib3J0KCkgewogICAgICBpZCA9IC0xCiAgICAgIGNtLm9mZigiY2hhbmdlIiwgYWJvcnQpCiAgICB9CiAgICBjbS5vbigiY2hhbmdlIiwgYWJvcnQpCiAgICBnZXRBbm5vdGF0aW9ucyhjbS5nZXRWYWx1ZSgpLCBmdW5jdGlvbihhbm5vdGF0aW9ucywgYXJnMikgewogICAgICBjbS5vZmYoImNoYW5nZSIsIGFib3J0KQogICAgICBpZiAoc3RhdGUud2FpdGluZ0ZvciAhPSBpZCkgcmV0dXJuCiAgICAgIGlmIChhcmcyICYmIGFubm90YXRpb25zIGluc3RhbmNlb2YgQ29kZU1pcnJvcikgYW5ub3RhdGlvbnMgPSBhcmcyCiAgICAgIHVwZGF0ZUxpbnRpbmcoY20sIGFubm90YXRpb25zKQogICAgfSwgcGFzc09wdGlvbnMsIGNtKTsKICB9CgogIGZ1bmN0aW9uIHN0YXJ0TGludGluZyhjbSkgewogICAgdmFyIHN0YXRlID0gY20uc3RhdGUubGludCwgb3B0aW9ucyA9IHN0YXRlLm9wdGlvbnM7CiAgICB2YXIgcGFzc09wdGlvbnMgPSBvcHRpb25zLm9wdGlvbnMgfHwgb3B0aW9uczsgLy8gU3VwcG9ydCBkZXByZWNhdGVkIHBhc3Npbmcgb2YgYG9wdGlvbnNgIHByb3BlcnR5IGluIG9wdGlvbnMKICAgIHZhciBnZXRBbm5vdGF0aW9ucyA9IG9wdGlvbnMuZ2V0QW5ub3RhdGlvbnMgfHwgY20uZ2V0SGVscGVyKENvZGVNaXJyb3IuUG9zKDAsIDApLCAibGludCIpOwogICAgaWYgKCFnZXRBbm5vdGF0aW9ucykgcmV0dXJuOwogICAgaWYgKG9wdGlvbnMuYXN5bmMgfHwgZ2V0QW5ub3RhdGlvbnMuYXN5bmMpIHsKICAgICAgbGludEFzeW5jKGNtLCBnZXRBbm5vdGF0aW9ucywgcGFzc09wdGlvbnMpCiAgICB9IGVsc2UgewogICAgICB1cGRhdGVMaW50aW5nKGNtLCBnZXRBbm5vdGF0aW9ucyhjbS5nZXRWYWx1ZSgpLCBwYXNzT3B0aW9ucywgY20pKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHVwZGF0ZUxpbnRpbmcoY20sIGFubm90YXRpb25zTm90U29ydGVkKSB7CiAgICBjbGVhck1hcmtzKGNtKTsKICAgIHZhciBzdGF0ZSA9IGNtLnN0YXRlLmxpbnQsIG9wdGlvbnMgPSBzdGF0ZS5vcHRpb25zOwoKICAgIHZhciBhbm5vdGF0aW9ucyA9IGdyb3VwQnlMaW5lKGFubm90YXRpb25zTm90U29ydGVkKTsKCiAgICBmb3IgKHZhciBsaW5lID0gMDsgbGluZSA8IGFubm90YXRpb25zLmxlbmd0aDsgKytsaW5lKSB7CiAgICAgIHZhciBhbm5zID0gYW5ub3RhdGlvbnNbbGluZV07CiAgICAgIGlmICghYW5ucykgY29udGludWU7CgogICAgICB2YXIgbWF4U2V2ZXJpdHkgPSBudWxsOwogICAgICB2YXIgdGlwTGFiZWwgPSBzdGF0ZS5oYXNHdXR0ZXIgJiYgZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpOwoKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbm5zLmxlbmd0aDsgKytpKSB7CiAgICAgICAgdmFyIGFubiA9IGFubnNbaV07CiAgICAgICAgdmFyIHNldmVyaXR5ID0gYW5uLnNldmVyaXR5OwogICAgICAgIGlmICghc2V2ZXJpdHkpIHNldmVyaXR5ID0gImVycm9yIjsKICAgICAgICBtYXhTZXZlcml0eSA9IGdldE1heFNldmVyaXR5KG1heFNldmVyaXR5LCBzZXZlcml0eSk7CgogICAgICAgIGlmIChvcHRpb25zLmZvcm1hdEFubm90YXRpb24pIGFubiA9IG9wdGlvbnMuZm9ybWF0QW5ub3RhdGlvbihhbm4pOwogICAgICAgIGlmIChzdGF0ZS5oYXNHdXR0ZXIpIHRpcExhYmVsLmFwcGVuZENoaWxkKGFubm90YXRpb25Ub29sdGlwKGFubikpOwoKICAgICAgICBpZiAoYW5uLnRvKSBzdGF0ZS5tYXJrZWQucHVzaChjbS5tYXJrVGV4dChhbm4uZnJvbSwgYW5uLnRvLCB7CiAgICAgICAgICBjbGFzc05hbWU6ICJDb2RlTWlycm9yLWxpbnQtbWFyay0iICsgc2V2ZXJpdHksCiAgICAgICAgICBfX2Fubm90YXRpb246IGFubgogICAgICAgIH0pKTsKICAgICAgfQoKICAgICAgaWYgKHN0YXRlLmhhc0d1dHRlcikKICAgICAgICBjbS5zZXRHdXR0ZXJNYXJrZXIobGluZSwgR1VUVEVSX0lELCBtYWtlTWFya2VyKHRpcExhYmVsLCBtYXhTZXZlcml0eSwgYW5ucy5sZW5ndGggPiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUub3B0aW9ucy50b29sdGlwcykpOwogICAgfQogICAgaWYgKG9wdGlvbnMub25VcGRhdGVMaW50aW5nKSBvcHRpb25zLm9uVXBkYXRlTGludGluZyhhbm5vdGF0aW9uc05vdFNvcnRlZCwgYW5ub3RhdGlvbnMsIGNtKTsKICB9CgogIGZ1bmN0aW9uIG9uQ2hhbmdlKGNtKSB7CiAgICB2YXIgc3RhdGUgPSBjbS5zdGF0ZS5saW50OwogICAgaWYgKCFzdGF0ZSkgcmV0dXJuOwogICAgY2xlYXJUaW1lb3V0KHN0YXRlLnRpbWVvdXQpOwogICAgc3RhdGUudGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKXtzdGFydExpbnRpbmcoY20pO30sIHN0YXRlLm9wdGlvbnMuZGVsYXkgfHwgNTAwKTsKICB9CgogIGZ1bmN0aW9uIHBvcHVwVG9vbHRpcHMoYW5ub3RhdGlvbnMsIGUpIHsKICAgIHZhciB0YXJnZXQgPSBlLnRhcmdldCB8fCBlLnNyY0VsZW1lbnQ7CiAgICB2YXIgdG9vbHRpcCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYW5ub3RhdGlvbnMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGFubiA9IGFubm90YXRpb25zW2ldOwogICAgICB0b29sdGlwLmFwcGVuZENoaWxkKGFubm90YXRpb25Ub29sdGlwKGFubikpOwogICAgfQogICAgc2hvd1Rvb2x0aXBGb3IoZSwgdG9vbHRpcCwgdGFyZ2V0KTsKICB9CgogIGZ1bmN0aW9uIG9uTW91c2VPdmVyKGNtLCBlKSB7CiAgICB2YXIgdGFyZ2V0ID0gZS50YXJnZXQgfHwgZS5zcmNFbGVtZW50OwogICAgaWYgKCEvXGJDb2RlTWlycm9yLWxpbnQtbWFyay0vLnRlc3QodGFyZ2V0LmNsYXNzTmFtZSkpIHJldHVybjsKICAgIHZhciBib3ggPSB0YXJnZXQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIHggPSAoYm94LmxlZnQgKyBib3gucmlnaHQpIC8gMiwgeSA9IChib3gudG9wICsgYm94LmJvdHRvbSkgLyAyOwogICAgdmFyIHNwYW5zID0gY20uZmluZE1hcmtzQXQoY20uY29vcmRzQ2hhcih7bGVmdDogeCwgdG9wOiB5fSwgImNsaWVudCIpKTsKCiAgICB2YXIgYW5ub3RhdGlvbnMgPSBbXTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3BhbnMubGVuZ3RoOyArK2kpIHsKICAgICAgdmFyIGFubiA9IHNwYW5zW2ldLl9fYW5ub3RhdGlvbjsKICAgICAgaWYgKGFubikgYW5ub3RhdGlvbnMucHVzaChhbm4pOwogICAgfQogICAgaWYgKGFubm90YXRpb25zLmxlbmd0aCkgcG9wdXBUb29sdGlwcyhhbm5vdGF0aW9ucywgZSk7CiAgfQoKICBDb2RlTWlycm9yLmRlZmluZU9wdGlvbigibGludCIsIGZhbHNlLCBmdW5jdGlvbihjbSwgdmFsLCBvbGQpIHsKICAgIGlmIChvbGQgJiYgb2xkICE9IENvZGVNaXJyb3IuSW5pdCkgewogICAgICBjbGVhck1hcmtzKGNtKTsKICAgICAgaWYgKGNtLnN0YXRlLmxpbnQub3B0aW9ucy5saW50T25DaGFuZ2UgIT09IGZhbHNlKQogICAgICAgIGNtLm9mZigiY2hhbmdlIiwgb25DaGFuZ2UpOwogICAgICBDb2RlTWlycm9yLm9mZihjbS5nZXRXcmFwcGVyRWxlbWVudCgpLCAibW91c2VvdmVyIiwgY20uc3RhdGUubGludC5vbk1vdXNlT3Zlcik7CiAgICAgIGNsZWFyVGltZW91dChjbS5zdGF0ZS5saW50LnRpbWVvdXQpOwogICAgICBkZWxldGUgY20uc3RhdGUubGludDsKICAgIH0KCiAgICBpZiAodmFsKSB7CiAgICAgIHZhciBndXR0ZXJzID0gY20uZ2V0T3B0aW9uKCJndXR0ZXJzIiksIGhhc0xpbnRHdXR0ZXIgPSBmYWxzZTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBndXR0ZXJzLmxlbmd0aDsgKytpKSBpZiAoZ3V0dGVyc1tpXSA9PSBHVVRURVJfSUQpIGhhc0xpbnRHdXR0ZXIgPSB0cnVlOwogICAgICB2YXIgc3RhdGUgPSBjbS5zdGF0ZS5saW50ID0gbmV3IExpbnRTdGF0ZShjbSwgcGFyc2VPcHRpb25zKGNtLCB2YWwpLCBoYXNMaW50R3V0dGVyKTsKICAgICAgaWYgKHN0YXRlLm9wdGlvbnMubGludE9uQ2hhbmdlICE9PSBmYWxzZSkKICAgICAgICBjbS5vbigiY2hhbmdlIiwgb25DaGFuZ2UpOwogICAgICBpZiAoc3RhdGUub3B0aW9ucy50b29sdGlwcyAhPSBmYWxzZSAmJiBzdGF0ZS5vcHRpb25zLnRvb2x0aXBzICE9ICJndXR0ZXIiKQogICAgICAgIENvZGVNaXJyb3Iub24oY20uZ2V0V3JhcHBlckVsZW1lbnQoKSwgIm1vdXNlb3ZlciIsIHN0YXRlLm9uTW91c2VPdmVyKTsKCiAgICAgIHN0YXJ0TGludGluZyhjbSk7CiAgICB9CiAgfSk7CgogIENvZGVNaXJyb3IuZGVmaW5lRXh0ZW5zaW9uKCJwZXJmb3JtTGludCIsIGZ1bmN0aW9uKCkgewogICAgaWYgKHRoaXMuc3RhdGUubGludCkgc3RhcnRMaW50aW5nKHRoaXMpOwogIH0pOwp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/lint/yaml-lint.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKLy8gRGVwZW5kcyBvbiBqcy15YW1sLmpzIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL25vZGVjYS9qcy15YW1sCgovLyBkZWNsYXJlIGdsb2JhbDoganN5YW1sCgpDb2RlTWlycm9yLnJlZ2lzdGVySGVscGVyKCJsaW50IiwgInlhbWwiLCBmdW5jdGlvbih0ZXh0KSB7CiAgdmFyIGZvdW5kID0gW107CiAgdHJ5IHsganN5YW1sLmxvYWQodGV4dCk7IH0KICBjYXRjaChlKSB7CiAgICAgIHZhciBsb2MgPSBlLm1hcms7CiAgICAgIGZvdW5kLnB1c2goeyBmcm9tOiBDb2RlTWlycm9yLlBvcyhsb2MubGluZSwgbG9jLmNvbHVtbiksIHRvOiBDb2RlTWlycm9yLlBvcyhsb2MubGluZSwgbG9jLmNvbHVtbiksIG1lc3NhZ2U6IGUubWVzc2FnZSB9KTsKICB9CiAgcmV0dXJuIGZvdW5kOwp9KTsKCn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/merge/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/merge/merge.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LkNvZGVNaXJyb3ItbWVyZ2UgewogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICBib3JkZXI6IDFweCBzb2xpZCAjZGRkOwogIHdoaXRlLXNwYWNlOiBwcmU7Cn0KCi5Db2RlTWlycm9yLW1lcmdlLCAuQ29kZU1pcnJvci1tZXJnZSAuQ29kZU1pcnJvciB7CiAgaGVpZ2h0OiAzNTBweDsKfQoKLkNvZGVNaXJyb3ItbWVyZ2UtMnBhbmUgLkNvZGVNaXJyb3ItbWVyZ2UtcGFuZSB7IHdpZHRoOiA0NyU7IH0KLkNvZGVNaXJyb3ItbWVyZ2UtMnBhbmUgLkNvZGVNaXJyb3ItbWVyZ2UtZ2FwIHsgd2lkdGg6IDYlOyB9Ci5Db2RlTWlycm9yLW1lcmdlLTNwYW5lIC5Db2RlTWlycm9yLW1lcmdlLXBhbmUgeyB3aWR0aDogMzElOyB9Ci5Db2RlTWlycm9yLW1lcmdlLTNwYW5lIC5Db2RlTWlycm9yLW1lcmdlLWdhcCB7IHdpZHRoOiAzLjUlOyB9CgouQ29kZU1pcnJvci1tZXJnZS1wYW5lIHsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgd2hpdGUtc3BhY2U6IG5vcm1hbDsKICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwp9Ci5Db2RlTWlycm9yLW1lcmdlLXBhbmUtcmlnaHRtb3N0IHsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgcmlnaHQ6IDBweDsKICB6LWluZGV4OiAxOwp9CgouQ29kZU1pcnJvci1tZXJnZS1nYXAgewogIHotaW5kZXg6IDI7CiAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogIGhlaWdodDogMTAwJTsKICAtbW96LWJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICBvdmVyZmxvdzogaGlkZGVuOwogIGJvcmRlci1sZWZ0OiAxcHggc29saWQgI2RkZDsKICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjZGRkOwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICBiYWNrZ3JvdW5kOiAjZjhmOGY4Owp9CgouQ29kZU1pcnJvci1tZXJnZS1zY3JvbGxsb2NrLXdyYXAgewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICBib3R0b206IDA7IGxlZnQ6IDUwJTsKfQouQ29kZU1pcnJvci1tZXJnZS1zY3JvbGxsb2NrIHsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgbGVmdDogLTUwJTsKICBjdXJzb3I6IHBvaW50ZXI7CiAgY29sb3I6ICM1NTU7CiAgbGluZS1oZWlnaHQ6IDE7Cn0KCi5Db2RlTWlycm9yLW1lcmdlLWNvcHlidXR0b25zLWxlZnQsIC5Db2RlTWlycm9yLW1lcmdlLWNvcHlidXR0b25zLXJpZ2h0IHsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgbGVmdDogMDsgdG9wOiAwOwogIHJpZ2h0OiAwOyBib3R0b206IDA7CiAgbGluZS1oZWlnaHQ6IDE7Cn0KCi5Db2RlTWlycm9yLW1lcmdlLWNvcHkgewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICBjdXJzb3I6IHBvaW50ZXI7CiAgY29sb3I6ICM0NGM7CiAgei1pbmRleDogMzsKfQoKLkNvZGVNaXJyb3ItbWVyZ2UtY29weS1yZXZlcnNlIHsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgY3Vyc29yOiBwb2ludGVyOwogIGNvbG9yOiAjNDRjOwp9CgouQ29kZU1pcnJvci1tZXJnZS1jb3B5YnV0dG9ucy1sZWZ0IC5Db2RlTWlycm9yLW1lcmdlLWNvcHkgeyBsZWZ0OiAycHg7IH0KLkNvZGVNaXJyb3ItbWVyZ2UtY29weWJ1dHRvbnMtcmlnaHQgLkNvZGVNaXJyb3ItbWVyZ2UtY29weSB7IHJpZ2h0OiAycHg7IH0KCi5Db2RlTWlycm9yLW1lcmdlLXItaW5zZXJ0ZWQsIC5Db2RlTWlycm9yLW1lcmdlLWwtaW5zZXJ0ZWQgewogIGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUFNQUFBQUNDQVlBQUFDZGRHWWFBQUFBR1VsRVFWUUkxMk13dUNYeTMrQ1d5SDhHQmdZR0pnWWtBQUJaYkFROUVMWHVyd0FBQUFCSlJVNUVya0pnZ2c9PSk7CiAgYmFja2dyb3VuZC1wb3NpdGlvbjogYm90dG9tIGxlZnQ7CiAgYmFja2dyb3VuZC1yZXBlYXQ6IHJlcGVhdC14Owp9CgouQ29kZU1pcnJvci1tZXJnZS1yLWRlbGV0ZWQsIC5Db2RlTWlycm9yLW1lcmdlLWwtZGVsZXRlZCB7CiAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQU1BQUFBQ0NBWUFBQUNkZEdZYUFBQUFHVWxFUVZRSTEyTTRLeWIyLzZ5WTJIOEdCZ1lHSmdZa0FBQlVSZ1B6NktzN3dRQUFBQUJKUlU1RXJrSmdnZz09KTsKICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBib3R0b20gbGVmdDsKICBiYWNrZ3JvdW5kLXJlcGVhdDogcmVwZWF0LXg7Cn0KCi5Db2RlTWlycm9yLW1lcmdlLXItY2h1bmsgeyBiYWNrZ3JvdW5kOiAjZmZmZmUwOyB9Ci5Db2RlTWlycm9yLW1lcmdlLXItY2h1bmstc3RhcnQgeyBib3JkZXItdG9wOiAxcHggc29saWQgI2VlODsgfQouQ29kZU1pcnJvci1tZXJnZS1yLWNodW5rLWVuZCB7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZWU4OyB9Ci5Db2RlTWlycm9yLW1lcmdlLXItY29ubmVjdCB7IGZpbGw6ICNmZmZmZTA7IHN0cm9rZTogI2VlODsgc3Ryb2tlLXdpZHRoOiAxcHg7IH0KCi5Db2RlTWlycm9yLW1lcmdlLWwtY2h1bmsgeyBiYWNrZ3JvdW5kOiAjZWVmOyB9Ci5Db2RlTWlycm9yLW1lcmdlLWwtY2h1bmstc3RhcnQgeyBib3JkZXItdG9wOiAxcHggc29saWQgIzg4ZTsgfQouQ29kZU1pcnJvci1tZXJnZS1sLWNodW5rLWVuZCB7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjODhlOyB9Ci5Db2RlTWlycm9yLW1lcmdlLWwtY29ubmVjdCB7IGZpbGw6ICNlZWY7IHN0cm9rZTogIzg4ZTsgc3Ryb2tlLXdpZHRoOiAxcHg7IH0KCi5Db2RlTWlycm9yLW1lcmdlLWwtY2h1bmsuQ29kZU1pcnJvci1tZXJnZS1yLWNodW5rIHsgYmFja2dyb3VuZDogI2RmZDsgfQouQ29kZU1pcnJvci1tZXJnZS1sLWNodW5rLXN0YXJ0LkNvZGVNaXJyb3ItbWVyZ2Utci1jaHVuay1zdGFydCB7IGJvcmRlci10b3A6IDFweCBzb2xpZCAjNGU0OyB9Ci5Db2RlTWlycm9yLW1lcmdlLWwtY2h1bmstZW5kLkNvZGVNaXJyb3ItbWVyZ2Utci1jaHVuay1lbmQgeyBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzRlNDsgfQoKLkNvZGVNaXJyb3ItbWVyZ2UtY29sbGFwc2VkLXdpZGdldDpiZWZvcmUgewogIGNvbnRlbnQ6ICIoLi4uKSI7Cn0KLkNvZGVNaXJyb3ItbWVyZ2UtY29sbGFwc2VkLXdpZGdldCB7CiAgY3Vyc29yOiBwb2ludGVyOwogIGNvbG9yOiAjODhiOwogIGJhY2tncm91bmQ6ICNlZWY7CiAgYm9yZGVyOiAxcHggc29saWQgI2RkZjsKICBmb250LXNpemU6IDkwJTsKICBwYWRkaW5nOiAwIDNweDsKICBib3JkZXItcmFkaXVzOiA0cHg7Cn0KLkNvZGVNaXJyb3ItbWVyZ2UtY29sbGFwc2VkLWxpbmUgLkNvZGVNaXJyb3ItZ3V0dGVyLWVsdCB7IGRpc3BsYXk6IG5vbmU7IH0K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/merge/merge.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovLyBkZWNsYXJlIGdsb2JhbDogZGlmZl9tYXRjaF9wYXRjaCwgRElGRl9JTlNFUlQsIERJRkZfREVMRVRFLCBESUZGX0VRVUFMCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7IC8vIE5vdGUgbm9uLXBhY2thZ2VkIGRlcGVuZGVuY3kgZGlmZl9tYXRjaF9wYXRjaAogIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kKSAvLyBBTUQKICAgIGRlZmluZShbIi4uLy4uL2xpYi9jb2RlbWlycm9yIiwgImRpZmZfbWF0Y2hfcGF0Y2giXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CiAgdmFyIFBvcyA9IENvZGVNaXJyb3IuUG9zOwogIHZhciBzdmdOUyA9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI7CgogIGZ1bmN0aW9uIERpZmZWaWV3KG12LCB0eXBlKSB7CiAgICB0aGlzLm12ID0gbXY7CiAgICB0aGlzLnR5cGUgPSB0eXBlOwogICAgdGhpcy5jbGFzc2VzID0gdHlwZSA9PSAibGVmdCIKICAgICAgPyB7Y2h1bms6ICJDb2RlTWlycm9yLW1lcmdlLWwtY2h1bmsiLAogICAgICAgICBzdGFydDogIkNvZGVNaXJyb3ItbWVyZ2UtbC1jaHVuay1zdGFydCIsCiAgICAgICAgIGVuZDogIkNvZGVNaXJyb3ItbWVyZ2UtbC1jaHVuay1lbmQiLAogICAgICAgICBpbnNlcnQ6ICJDb2RlTWlycm9yLW1lcmdlLWwtaW5zZXJ0ZWQiLAogICAgICAgICBkZWw6ICJDb2RlTWlycm9yLW1lcmdlLWwtZGVsZXRlZCIsCiAgICAgICAgIGNvbm5lY3Q6ICJDb2RlTWlycm9yLW1lcmdlLWwtY29ubmVjdCJ9CiAgICAgIDoge2NodW5rOiAiQ29kZU1pcnJvci1tZXJnZS1yLWNodW5rIiwKICAgICAgICAgc3RhcnQ6ICJDb2RlTWlycm9yLW1lcmdlLXItY2h1bmstc3RhcnQiLAogICAgICAgICBlbmQ6ICJDb2RlTWlycm9yLW1lcmdlLXItY2h1bmstZW5kIiwKICAgICAgICAgaW5zZXJ0OiAiQ29kZU1pcnJvci1tZXJnZS1yLWluc2VydGVkIiwKICAgICAgICAgZGVsOiAiQ29kZU1pcnJvci1tZXJnZS1yLWRlbGV0ZWQiLAogICAgICAgICBjb25uZWN0OiAiQ29kZU1pcnJvci1tZXJnZS1yLWNvbm5lY3QifTsKICB9CgogIERpZmZWaWV3LnByb3RvdHlwZSA9IHsKICAgIGNvbnN0cnVjdG9yOiBEaWZmVmlldywKICAgIGluaXQ6IGZ1bmN0aW9uKHBhbmUsIG9yaWcsIG9wdGlvbnMpIHsKICAgICAgdGhpcy5lZGl0ID0gdGhpcy5tdi5lZGl0OwogICAgICAodGhpcy5lZGl0LnN0YXRlLmRpZmZWaWV3cyB8fCAodGhpcy5lZGl0LnN0YXRlLmRpZmZWaWV3cyA9IFtdKSkucHVzaCh0aGlzKTsKICAgICAgdGhpcy5vcmlnID0gQ29kZU1pcnJvcihwYW5lLCBjb3B5T2JqKHt2YWx1ZTogb3JpZywgcmVhZE9ubHk6ICF0aGlzLm12Lm9wdGlvbnMuYWxsb3dFZGl0aW5nT3JpZ2luYWxzfSwgY29weU9iaihvcHRpb25zKSkpOwogICAgICB0aGlzLm9yaWcuc3RhdGUuZGlmZlZpZXdzID0gW3RoaXNdOwogICAgICB2YXIgY2xhc3NMb2NhdGlvbiA9IG9wdGlvbnMuY2h1bmtDbGFzc0xvY2F0aW9uIHx8ICJiYWNrZ3JvdW5kIjsKICAgICAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChjbGFzc0xvY2F0aW9uKSAhPSAiW29iamVjdCBBcnJheV0iKSBjbGFzc0xvY2F0aW9uID0gW2NsYXNzTG9jYXRpb25dCiAgICAgIHRoaXMuY2xhc3Nlcy5jbGFzc0xvY2F0aW9uID0gY2xhc3NMb2NhdGlvbgoKICAgICAgdGhpcy5kaWZmID0gZ2V0RGlmZihhc1N0cmluZyhvcmlnKSwgYXNTdHJpbmcob3B0aW9ucy52YWx1ZSkpOwogICAgICB0aGlzLmNodW5rcyA9IGdldENodW5rcyh0aGlzLmRpZmYpOwogICAgICB0aGlzLmRpZmZPdXRPZkRhdGUgPSB0aGlzLmRlYWxpZ25lZCA9IGZhbHNlOwoKICAgICAgdGhpcy5zaG93RGlmZmVyZW5jZXMgPSBvcHRpb25zLnNob3dEaWZmZXJlbmNlcyAhPT0gZmFsc2U7CiAgICAgIHRoaXMuZm9yY2VVcGRhdGUgPSByZWdpc3RlclVwZGF0ZSh0aGlzKTsKICAgICAgc2V0U2Nyb2xsTG9jayh0aGlzLCB0cnVlLCBmYWxzZSk7CiAgICAgIHJlZ2lzdGVyU2Nyb2xsKHRoaXMpOwogICAgfSwKICAgIHNldFNob3dEaWZmZXJlbmNlczogZnVuY3Rpb24odmFsKSB7CiAgICAgIHZhbCA9IHZhbCAhPT0gZmFsc2U7CiAgICAgIGlmICh2YWwgIT0gdGhpcy5zaG93RGlmZmVyZW5jZXMpIHsKICAgICAgICB0aGlzLnNob3dEaWZmZXJlbmNlcyA9IHZhbDsKICAgICAgICB0aGlzLmZvcmNlVXBkYXRlKCJmdWxsIik7CiAgICAgIH0KICAgIH0KICB9OwoKICBmdW5jdGlvbiBlbnN1cmVEaWZmKGR2KSB7CiAgICBpZiAoZHYuZGlmZk91dE9mRGF0ZSkgewogICAgICBkdi5kaWZmID0gZ2V0RGlmZihkdi5vcmlnLmdldFZhbHVlKCksIGR2LmVkaXQuZ2V0VmFsdWUoKSk7CiAgICAgIGR2LmNodW5rcyA9IGdldENodW5rcyhkdi5kaWZmKTsKICAgICAgZHYuZGlmZk91dE9mRGF0ZSA9IGZhbHNlOwogICAgICBDb2RlTWlycm9yLnNpZ25hbChkdi5lZGl0LCAidXBkYXRlRGlmZiIsIGR2LmRpZmYpOwogICAgfQogIH0KCiAgdmFyIHVwZGF0aW5nID0gZmFsc2U7CiAgZnVuY3Rpb24gcmVnaXN0ZXJVcGRhdGUoZHYpIHsKICAgIHZhciBlZGl0ID0ge2Zyb206IDAsIHRvOiAwLCBtYXJrZWQ6IFtdfTsKICAgIHZhciBvcmlnID0ge2Zyb206IDAsIHRvOiAwLCBtYXJrZWQ6IFtdfTsKICAgIHZhciBkZWJvdW5jZUNoYW5nZSwgdXBkYXRpbmdGYXN0ID0gZmFsc2U7CiAgICBmdW5jdGlvbiB1cGRhdGUobW9kZSkgewogICAgICB1cGRhdGluZyA9IHRydWU7CiAgICAgIHVwZGF0aW5nRmFzdCA9IGZhbHNlOwogICAgICBpZiAobW9kZSA9PSAiZnVsbCIpIHsKICAgICAgICBpZiAoZHYuc3ZnKSBjbGVhcihkdi5zdmcpOwogICAgICAgIGlmIChkdi5jb3B5QnV0dG9ucykgY2xlYXIoZHYuY29weUJ1dHRvbnMpOwogICAgICAgIGNsZWFyTWFya3MoZHYuZWRpdCwgZWRpdC5tYXJrZWQsIGR2LmNsYXNzZXMpOwogICAgICAgIGNsZWFyTWFya3MoZHYub3JpZywgb3JpZy5tYXJrZWQsIGR2LmNsYXNzZXMpOwogICAgICAgIGVkaXQuZnJvbSA9IGVkaXQudG8gPSBvcmlnLmZyb20gPSBvcmlnLnRvID0gMDsKICAgICAgfQogICAgICBlbnN1cmVEaWZmKGR2KTsKICAgICAgaWYgKGR2LnNob3dEaWZmZXJlbmNlcykgewogICAgICAgIHVwZGF0ZU1hcmtzKGR2LmVkaXQsIGR2LmRpZmYsIGVkaXQsIERJRkZfSU5TRVJULCBkdi5jbGFzc2VzKTsKICAgICAgICB1cGRhdGVNYXJrcyhkdi5vcmlnLCBkdi5kaWZmLCBvcmlnLCBESUZGX0RFTEVURSwgZHYuY2xhc3Nlcyk7CiAgICAgIH0KICAgICAgbWFrZUNvbm5lY3Rpb25zKGR2KTsKCiAgICAgIGlmIChkdi5tdi5vcHRpb25zLmNvbm5lY3QgPT0gImFsaWduIikKICAgICAgICBhbGlnbkNodW5rcyhkdik7CiAgICAgIHVwZGF0aW5nID0gZmFsc2U7CiAgICB9CiAgICBmdW5jdGlvbiBzZXREZWFsaWduKGZhc3QpIHsKICAgICAgaWYgKHVwZGF0aW5nKSByZXR1cm47CiAgICAgIGR2LmRlYWxpZ25lZCA9IHRydWU7CiAgICAgIHNldChmYXN0KTsKICAgIH0KICAgIGZ1bmN0aW9uIHNldChmYXN0KSB7CiAgICAgIGlmICh1cGRhdGluZyB8fCB1cGRhdGluZ0Zhc3QpIHJldHVybjsKICAgICAgY2xlYXJUaW1lb3V0KGRlYm91bmNlQ2hhbmdlKTsKICAgICAgaWYgKGZhc3QgPT09IHRydWUpIHVwZGF0aW5nRmFzdCA9IHRydWU7CiAgICAgIGRlYm91bmNlQ2hhbmdlID0gc2V0VGltZW91dCh1cGRhdGUsIGZhc3QgPT09IHRydWUgPyAyMCA6IDI1MCk7CiAgICB9CiAgICBmdW5jdGlvbiBjaGFuZ2UoX2NtLCBjaGFuZ2UpIHsKICAgICAgaWYgKCFkdi5kaWZmT3V0T2ZEYXRlKSB7CiAgICAgICAgZHYuZGlmZk91dE9mRGF0ZSA9IHRydWU7CiAgICAgICAgZWRpdC5mcm9tID0gZWRpdC50byA9IG9yaWcuZnJvbSA9IG9yaWcudG8gPSAwOwogICAgICB9CiAgICAgIC8vIFVwZGF0ZSBmYXN0ZXIgd2hlbiBhIGxpbmUgd2FzIGFkZGVkL3JlbW92ZWQKICAgICAgc2V0RGVhbGlnbihjaGFuZ2UudGV4dC5sZW5ndGggLSAxICE9IGNoYW5nZS50by5saW5lIC0gY2hhbmdlLmZyb20ubGluZSk7CiAgICB9CiAgICBkdi5lZGl0Lm9uKCJjaGFuZ2UiLCBjaGFuZ2UpOwogICAgZHYub3JpZy5vbigiY2hhbmdlIiwgY2hhbmdlKTsKICAgIGR2LmVkaXQub24oIm1hcmtlckFkZGVkIiwgc2V0RGVhbGlnbik7CiAgICBkdi5lZGl0Lm9uKCJtYXJrZXJDbGVhcmVkIiwgc2V0RGVhbGlnbik7CiAgICBkdi5vcmlnLm9uKCJtYXJrZXJBZGRlZCIsIHNldERlYWxpZ24pOwogICAgZHYub3JpZy5vbigibWFya2VyQ2xlYXJlZCIsIHNldERlYWxpZ24pOwogICAgZHYuZWRpdC5vbigidmlld3BvcnRDaGFuZ2UiLCBmdW5jdGlvbigpIHsgc2V0KGZhbHNlKTsgfSk7CiAgICBkdi5vcmlnLm9uKCJ2aWV3cG9ydENoYW5nZSIsIGZ1bmN0aW9uKCkgeyBzZXQoZmFsc2UpOyB9KTsKICAgIHVwZGF0ZSgpOwogICAgcmV0dXJuIHVwZGF0ZTsKICB9CgogIGZ1bmN0aW9uIHJlZ2lzdGVyU2Nyb2xsKGR2KSB7CiAgICBkdi5lZGl0Lm9uKCJzY3JvbGwiLCBmdW5jdGlvbigpIHsKICAgICAgc3luY1Njcm9sbChkdiwgRElGRl9JTlNFUlQpICYmIG1ha2VDb25uZWN0aW9ucyhkdik7CiAgICB9KTsKICAgIGR2Lm9yaWcub24oInNjcm9sbCIsIGZ1bmN0aW9uKCkgewogICAgICBzeW5jU2Nyb2xsKGR2LCBESUZGX0RFTEVURSkgJiYgbWFrZUNvbm5lY3Rpb25zKGR2KTsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gc3luY1Njcm9sbChkdiwgdHlwZSkgewogICAgLy8gQ2hhbmdlIGhhbmRsZXIgd2lsbCBkbyBhIHJlZnJlc2ggYWZ0ZXIgYSB0aW1lb3V0IHdoZW4gZGlmZiBpcyBvdXQgb2YgZGF0ZQogICAgaWYgKGR2LmRpZmZPdXRPZkRhdGUpIHJldHVybiBmYWxzZTsKICAgIGlmICghZHYubG9ja1Njcm9sbCkgcmV0dXJuIHRydWU7CiAgICB2YXIgZWRpdG9yLCBvdGhlciwgbm93ID0gK25ldyBEYXRlOwogICAgaWYgKHR5cGUgPT0gRElGRl9JTlNFUlQpIHsgZWRpdG9yID0gZHYuZWRpdDsgb3RoZXIgPSBkdi5vcmlnOyB9CiAgICBlbHNlIHsgZWRpdG9yID0gZHYub3JpZzsgb3RoZXIgPSBkdi5lZGl0OyB9CiAgICAvLyBEb24ndCB0YWtlIGFjdGlvbiBpZiB0aGUgcG9zaXRpb24gb2YgdGhpcyBlZGl0b3Igd2FzIHJlY2VudGx5IHNldAogICAgLy8gKHRvIHByZXZlbnQgZmVlZGJhY2sgbG9vcHMpCiAgICBpZiAoZWRpdG9yLnN0YXRlLnNjcm9sbFNldEJ5ID09IGR2ICYmIChlZGl0b3Iuc3RhdGUuc2Nyb2xsU2V0QXQgfHwgMCkgKyA1MCA+IG5vdykgcmV0dXJuIGZhbHNlOwoKICAgIHZhciBzSW5mbyA9IGVkaXRvci5nZXRTY3JvbGxJbmZvKCk7CiAgICBpZiAoZHYubXYub3B0aW9ucy5jb25uZWN0ID09ICJhbGlnbiIpIHsKICAgICAgdGFyZ2V0UG9zID0gc0luZm8udG9wOwogICAgfSBlbHNlIHsKICAgICAgdmFyIGhhbGZTY3JlZW4gPSAuNSAqIHNJbmZvLmNsaWVudEhlaWdodCwgbWlkWSA9IHNJbmZvLnRvcCArIGhhbGZTY3JlZW47CiAgICAgIHZhciBtaWQgPSBlZGl0b3IubGluZUF0SGVpZ2h0KG1pZFksICJsb2NhbCIpOwogICAgICB2YXIgYXJvdW5kID0gY2h1bmtCb3VuZGFyaWVzQXJvdW5kKGR2LmNodW5rcywgbWlkLCB0eXBlID09IERJRkZfSU5TRVJUKTsKICAgICAgdmFyIG9mZiA9IGdldE9mZnNldHMoZWRpdG9yLCB0eXBlID09IERJRkZfSU5TRVJUID8gYXJvdW5kLmVkaXQgOiBhcm91bmQub3JpZyk7CiAgICAgIHZhciBvZmZPdGhlciA9IGdldE9mZnNldHMob3RoZXIsIHR5cGUgPT0gRElGRl9JTlNFUlQgPyBhcm91bmQub3JpZyA6IGFyb3VuZC5lZGl0KTsKICAgICAgdmFyIHJhdGlvID0gKG1pZFkgLSBvZmYudG9wKSAvIChvZmYuYm90IC0gb2ZmLnRvcCk7CiAgICAgIHZhciB0YXJnZXRQb3MgPSAob2ZmT3RoZXIudG9wIC0gaGFsZlNjcmVlbikgKyByYXRpbyAqIChvZmZPdGhlci5ib3QgLSBvZmZPdGhlci50b3ApOwoKICAgICAgdmFyIGJvdERpc3QsIG1peDsKICAgICAgLy8gU29tZSBjYXJlZnVsIHR3ZWFraW5nIHRvIG1ha2Ugc3VyZSBubyBzcGFjZSBpcyBsZWZ0IG91dCBvZiB2aWV3CiAgICAgIC8vIHdoZW4gc2Nyb2xsaW5nIHRvIHRvcCBvciBib3R0b20uCiAgICAgIGlmICh0YXJnZXRQb3MgPiBzSW5mby50b3AgJiYgKG1peCA9IHNJbmZvLnRvcCAvIGhhbGZTY3JlZW4pIDwgMSkgewogICAgICAgIHRhcmdldFBvcyA9IHRhcmdldFBvcyAqIG1peCArIHNJbmZvLnRvcCAqICgxIC0gbWl4KTsKICAgICAgfSBlbHNlIGlmICgoYm90RGlzdCA9IHNJbmZvLmhlaWdodCAtIHNJbmZvLmNsaWVudEhlaWdodCAtIHNJbmZvLnRvcCkgPCBoYWxmU2NyZWVuKSB7CiAgICAgICAgdmFyIG90aGVySW5mbyA9IG90aGVyLmdldFNjcm9sbEluZm8oKTsKICAgICAgICB2YXIgYm90RGlzdE90aGVyID0gb3RoZXJJbmZvLmhlaWdodCAtIG90aGVySW5mby5jbGllbnRIZWlnaHQgLSB0YXJnZXRQb3M7CiAgICAgICAgaWYgKGJvdERpc3RPdGhlciA+IGJvdERpc3QgJiYgKG1peCA9IGJvdERpc3QgLyBoYWxmU2NyZWVuKSA8IDEpCiAgICAgICAgICB0YXJnZXRQb3MgPSB0YXJnZXRQb3MgKiBtaXggKyAob3RoZXJJbmZvLmhlaWdodCAtIG90aGVySW5mby5jbGllbnRIZWlnaHQgLSBib3REaXN0KSAqICgxIC0gbWl4KTsKICAgICAgfQogICAgfQoKICAgIG90aGVyLnNjcm9sbFRvKHNJbmZvLmxlZnQsIHRhcmdldFBvcyk7CiAgICBvdGhlci5zdGF0ZS5zY3JvbGxTZXRBdCA9IG5vdzsKICAgIG90aGVyLnN0YXRlLnNjcm9sbFNldEJ5ID0gZHY7CiAgICByZXR1cm4gdHJ1ZTsKICB9CgogIGZ1bmN0aW9uIGdldE9mZnNldHMoZWRpdG9yLCBhcm91bmQpIHsKICAgIHZhciBib3QgPSBhcm91bmQuYWZ0ZXI7CiAgICBpZiAoYm90ID09IG51bGwpIGJvdCA9IGVkaXRvci5sYXN0TGluZSgpICsgMTsKICAgIHJldHVybiB7dG9wOiBlZGl0b3IuaGVpZ2h0QXRMaW5lKGFyb3VuZC5iZWZvcmUgfHwgMCwgImxvY2FsIiksCiAgICAgICAgICAgIGJvdDogZWRpdG9yLmhlaWdodEF0TGluZShib3QsICJsb2NhbCIpfTsKICB9CgogIGZ1bmN0aW9uIHNldFNjcm9sbExvY2soZHYsIHZhbCwgYWN0aW9uKSB7CiAgICBkdi5sb2NrU2Nyb2xsID0gdmFsOwogICAgaWYgKHZhbCAmJiBhY3Rpb24gIT0gZmFsc2UpIHN5bmNTY3JvbGwoZHYsIERJRkZfSU5TRVJUKSAmJiBtYWtlQ29ubmVjdGlvbnMoZHYpOwogICAgZHYubG9ja0J1dHRvbi5pbm5lckhUTUwgPSB2YWwgPyAiXHUyMWRiXHUyMWRhIiA6ICJcdTIxZGImbmJzcDsmbmJzcDtcdTIxZGEiOwogIH0KCiAgLy8gVXBkYXRpbmcgdGhlIG1hcmtzIGZvciBlZGl0b3IgY29udGVudAoKICBmdW5jdGlvbiByZW1vdmVDbGFzcyhlZGl0b3IsIGxpbmUsIGNsYXNzZXMpIHsKICAgIHZhciBsb2NzID0gY2xhc3Nlcy5jbGFzc0xvY2F0aW9uCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxvY3MubGVuZ3RoOyBpKyspIHsKICAgICAgZWRpdG9yLnJlbW92ZUxpbmVDbGFzcyhsaW5lLCBsb2NzW2ldLCBjbGFzc2VzLmNodW5rKTsKICAgICAgZWRpdG9yLnJlbW92ZUxpbmVDbGFzcyhsaW5lLCBsb2NzW2ldLCBjbGFzc2VzLnN0YXJ0KTsKICAgICAgZWRpdG9yLnJlbW92ZUxpbmVDbGFzcyhsaW5lLCBsb2NzW2ldLCBjbGFzc2VzLmNodW5rKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGNsZWFyTWFya3MoZWRpdG9yLCBhcnIsIGNsYXNzZXMpIHsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgKytpKSB7CiAgICAgIHZhciBtYXJrID0gYXJyW2ldOwogICAgICBpZiAobWFyayBpbnN0YW5jZW9mIENvZGVNaXJyb3IuVGV4dE1hcmtlcikKICAgICAgICBtYXJrLmNsZWFyKCk7CiAgICAgIGVsc2UgaWYgKG1hcmsucGFyZW50KQogICAgICAgIHJlbW92ZUNsYXNzKGVkaXRvciwgbWFyaywgY2xhc3Nlcyk7CiAgICB9CiAgICBhcnIubGVuZ3RoID0gMDsKICB9CgogIC8vIEZJWE1FIG1heWJlIGFkZCBhIG1hcmdpbiBhcm91bmQgdmlld3BvcnQgdG8gcHJldmVudCB0b28gbWFueSB1cGRhdGVzCiAgZnVuY3Rpb24gdXBkYXRlTWFya3MoZWRpdG9yLCBkaWZmLCBzdGF0ZSwgdHlwZSwgY2xhc3NlcykgewogICAgdmFyIHZwID0gZWRpdG9yLmdldFZpZXdwb3J0KCk7CiAgICBlZGl0b3Iub3BlcmF0aW9uKGZ1bmN0aW9uKCkgewogICAgICBpZiAoc3RhdGUuZnJvbSA9PSBzdGF0ZS50byB8fCB2cC5mcm9tIC0gc3RhdGUudG8gPiAyMCB8fCBzdGF0ZS5mcm9tIC0gdnAudG8gPiAyMCkgewogICAgICAgIGNsZWFyTWFya3MoZWRpdG9yLCBzdGF0ZS5tYXJrZWQsIGNsYXNzZXMpOwogICAgICAgIG1hcmtDaGFuZ2VzKGVkaXRvciwgZGlmZiwgdHlwZSwgc3RhdGUubWFya2VkLCB2cC5mcm9tLCB2cC50bywgY2xhc3Nlcyk7CiAgICAgICAgc3RhdGUuZnJvbSA9IHZwLmZyb207IHN0YXRlLnRvID0gdnAudG87CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKHZwLmZyb20gPCBzdGF0ZS5mcm9tKSB7CiAgICAgICAgICBtYXJrQ2hhbmdlcyhlZGl0b3IsIGRpZmYsIHR5cGUsIHN0YXRlLm1hcmtlZCwgdnAuZnJvbSwgc3RhdGUuZnJvbSwgY2xhc3Nlcyk7CiAgICAgICAgICBzdGF0ZS5mcm9tID0gdnAuZnJvbTsKICAgICAgICB9CiAgICAgICAgaWYgKHZwLnRvID4gc3RhdGUudG8pIHsKICAgICAgICAgIG1hcmtDaGFuZ2VzKGVkaXRvciwgZGlmZiwgdHlwZSwgc3RhdGUubWFya2VkLCBzdGF0ZS50bywgdnAudG8sIGNsYXNzZXMpOwogICAgICAgICAgc3RhdGUudG8gPSB2cC50bzsKICAgICAgICB9CiAgICAgIH0KICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gYWRkQ2xhc3MoZWRpdG9yLCBsaW5lTnIsIGNsYXNzZXMsIG1haW4sIHN0YXJ0LCBlbmQpIHsKICAgIHZhciBsb2NzID0gY2xhc3Nlcy5jbGFzc0xvY2F0aW9uLCBsaW5lID0gZWRpdG9yLmdldExpbmVIYW5kbGUobGluZU5yKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbG9jcy5sZW5ndGg7IGkrKykgewogICAgICBpZiAobWFpbikgZWRpdG9yLmFkZExpbmVDbGFzcyhsaW5lLCBsb2NzW2ldLCBjbGFzc2VzLmNodW5rKTsKICAgICAgaWYgKHN0YXJ0KSBlZGl0b3IuYWRkTGluZUNsYXNzKGxpbmUsIGxvY3NbaV0sIGNsYXNzZXMuc3RhcnQpOwogICAgICBpZiAoZW5kKSBlZGl0b3IuYWRkTGluZUNsYXNzKGxpbmUsIGxvY3NbaV0sIGNsYXNzZXMuZW5kKTsKICAgIH0KICAgIHJldHVybiBsaW5lOwogIH0KCiAgZnVuY3Rpb24gbWFya0NoYW5nZXMoZWRpdG9yLCBkaWZmLCB0eXBlLCBtYXJrcywgZnJvbSwgdG8sIGNsYXNzZXMpIHsKICAgIHZhciBwb3MgPSBQb3MoMCwgMCk7CiAgICB2YXIgdG9wID0gUG9zKGZyb20sIDApLCBib3QgPSBlZGl0b3IuY2xpcFBvcyhQb3ModG8gLSAxKSk7CiAgICB2YXIgY2xzID0gdHlwZSA9PSBESUZGX0RFTEVURSA/IGNsYXNzZXMuZGVsIDogY2xhc3Nlcy5pbnNlcnQ7CiAgICBmdW5jdGlvbiBtYXJrQ2h1bmsoc3RhcnQsIGVuZCkgewogICAgICB2YXIgYmZyb20gPSBNYXRoLm1heChmcm9tLCBzdGFydCksIGJ0byA9IE1hdGgubWluKHRvLCBlbmQpOwogICAgICBmb3IgKHZhciBpID0gYmZyb207IGkgPCBidG87ICsraSkKICAgICAgICBtYXJrcy5wdXNoKGFkZENsYXNzKGVkaXRvciwgaSwgY2xhc3NlcywgdHJ1ZSwgaSA9PSBzdGFydCwgaSA9PSBlbmQgLSAxKSk7CiAgICAgIC8vIFdoZW4gdGhlIGNodW5rIGlzIGVtcHR5LCBtYWtlIHN1cmUgYSBob3Jpem9udGFsIGxpbmUgc2hvd3MgdXAKICAgICAgaWYgKHN0YXJ0ID09IGVuZCAmJiBiZnJvbSA9PSBlbmQgJiYgYnRvID09IGVuZCkgewogICAgICAgIGlmIChiZnJvbSkKICAgICAgICAgIG1hcmtzLnB1c2goYWRkQ2xhc3MoZWRpdG9yLCBiZnJvbSAtIDEsIGNsYXNzZXMsIGZhbHNlLCBmYWxzZSwgdHJ1ZSkpOwogICAgICAgIGVsc2UKICAgICAgICAgIG1hcmtzLnB1c2goYWRkQ2xhc3MoZWRpdG9yLCBiZnJvbSwgY2xhc3NlcywgZmFsc2UsIHRydWUsIGZhbHNlKSk7CiAgICAgIH0KICAgIH0KCiAgICB2YXIgY2h1bmtTdGFydCA9IDA7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpZmYubGVuZ3RoOyArK2kpIHsKICAgICAgdmFyIHBhcnQgPSBkaWZmW2ldLCB0cCA9IHBhcnRbMF0sIHN0ciA9IHBhcnRbMV07CiAgICAgIGlmICh0cCA9PSBESUZGX0VRVUFMKSB7CiAgICAgICAgdmFyIGNsZWFuRnJvbSA9IHBvcy5saW5lICsgKHN0YXJ0T2ZMaW5lQ2xlYW4oZGlmZiwgaSkgPyAwIDogMSk7CiAgICAgICAgbW92ZU92ZXIocG9zLCBzdHIpOwogICAgICAgIHZhciBjbGVhblRvID0gcG9zLmxpbmUgKyAoZW5kT2ZMaW5lQ2xlYW4oZGlmZiwgaSkgPyAxIDogMCk7CiAgICAgICAgaWYgKGNsZWFuVG8gPiBjbGVhbkZyb20pIHsKICAgICAgICAgIGlmIChpKSBtYXJrQ2h1bmsoY2h1bmtTdGFydCwgY2xlYW5Gcm9tKTsKICAgICAgICAgIGNodW5rU3RhcnQgPSBjbGVhblRvOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAodHAgPT0gdHlwZSkgewogICAgICAgICAgdmFyIGVuZCA9IG1vdmVPdmVyKHBvcywgc3RyLCB0cnVlKTsKICAgICAgICAgIHZhciBhID0gcG9zTWF4KHRvcCwgcG9zKSwgYiA9IHBvc01pbihib3QsIGVuZCk7CiAgICAgICAgICBpZiAoIXBvc0VxKGEsIGIpKQogICAgICAgICAgICBtYXJrcy5wdXNoKGVkaXRvci5tYXJrVGV4dChhLCBiLCB7Y2xhc3NOYW1lOiBjbHN9KSk7CiAgICAgICAgICBwb3MgPSBlbmQ7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAoY2h1bmtTdGFydCA8PSBwb3MubGluZSkgbWFya0NodW5rKGNodW5rU3RhcnQsIHBvcy5saW5lICsgMSk7CiAgfQoKICAvLyBVcGRhdGluZyB0aGUgZ2FwIGJldHdlZW4gZWRpdG9yIGFuZCBvcmlnaW5hbAoKICBmdW5jdGlvbiBtYWtlQ29ubmVjdGlvbnMoZHYpIHsKICAgIGlmICghZHYuc2hvd0RpZmZlcmVuY2VzKSByZXR1cm47CgogICAgaWYgKGR2LnN2ZykgewogICAgICBjbGVhcihkdi5zdmcpOwogICAgICB2YXIgdyA9IGR2LmdhcC5vZmZzZXRXaWR0aDsKICAgICAgYXR0cnMoZHYuc3ZnLCAid2lkdGgiLCB3LCAiaGVpZ2h0IiwgZHYuZ2FwLm9mZnNldEhlaWdodCk7CiAgICB9CiAgICBpZiAoZHYuY29weUJ1dHRvbnMpIGNsZWFyKGR2LmNvcHlCdXR0b25zKTsKCiAgICB2YXIgdnBFZGl0ID0gZHYuZWRpdC5nZXRWaWV3cG9ydCgpLCB2cE9yaWcgPSBkdi5vcmlnLmdldFZpZXdwb3J0KCk7CiAgICB2YXIgb3V0ZXJUb3AgPSBkdi5tdi53cmFwLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcAogICAgdmFyIHNUb3BFZGl0ID0gb3V0ZXJUb3AgLSBkdi5lZGl0LmdldFNjcm9sbGVyRWxlbWVudCgpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCArIGR2LmVkaXQuZ2V0U2Nyb2xsSW5mbygpLnRvcAogICAgdmFyIHNUb3BPcmlnID0gb3V0ZXJUb3AgLSBkdi5vcmlnLmdldFNjcm9sbGVyRWxlbWVudCgpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcCArIGR2Lm9yaWcuZ2V0U2Nyb2xsSW5mbygpLnRvcDsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZHYuY2h1bmtzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBjaCA9IGR2LmNodW5rc1tpXTsKICAgICAgaWYgKGNoLmVkaXRGcm9tIDw9IHZwRWRpdC50byAmJiBjaC5lZGl0VG8gPj0gdnBFZGl0LmZyb20gJiYKICAgICAgICAgIGNoLm9yaWdGcm9tIDw9IHZwT3JpZy50byAmJiBjaC5vcmlnVG8gPj0gdnBPcmlnLmZyb20pCiAgICAgICAgZHJhd0Nvbm5lY3RvcnNGb3JDaHVuayhkdiwgY2gsIHNUb3BPcmlnLCBzVG9wRWRpdCwgdyk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBnZXRNYXRjaGluZ09yaWdMaW5lKGVkaXRMaW5lLCBjaHVua3MpIHsKICAgIHZhciBlZGl0U3RhcnQgPSAwLCBvcmlnU3RhcnQgPSAwOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaHVua3MubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGNodW5rID0gY2h1bmtzW2ldOwogICAgICBpZiAoY2h1bmsuZWRpdFRvID4gZWRpdExpbmUgJiYgY2h1bmsuZWRpdEZyb20gPD0gZWRpdExpbmUpIHJldHVybiBudWxsOwogICAgICBpZiAoY2h1bmsuZWRpdEZyb20gPiBlZGl0TGluZSkgYnJlYWs7CiAgICAgIGVkaXRTdGFydCA9IGNodW5rLmVkaXRUbzsKICAgICAgb3JpZ1N0YXJ0ID0gY2h1bmsub3JpZ1RvOwogICAgfQogICAgcmV0dXJuIG9yaWdTdGFydCArIChlZGl0TGluZSAtIGVkaXRTdGFydCk7CiAgfQoKICBmdW5jdGlvbiBmaW5kQWxpZ25lZExpbmVzKGR2LCBvdGhlcikgewogICAgdmFyIGxpbmVzVG9BbGlnbiA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkdi5jaHVua3MubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGNodW5rID0gZHYuY2h1bmtzW2ldOwogICAgICBsaW5lc1RvQWxpZ24ucHVzaChbY2h1bmsub3JpZ1RvLCBjaHVuay5lZGl0VG8sIG90aGVyID8gZ2V0TWF0Y2hpbmdPcmlnTGluZShjaHVuay5lZGl0VG8sIG90aGVyLmNodW5rcykgOiBudWxsXSk7CiAgICB9CiAgICBpZiAob3RoZXIpIHsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvdGhlci5jaHVua3MubGVuZ3RoOyBpKyspIHsKICAgICAgICB2YXIgY2h1bmsgPSBvdGhlci5jaHVua3NbaV07CiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBsaW5lc1RvQWxpZ24ubGVuZ3RoOyBqKyspIHsKICAgICAgICAgIHZhciBhbGlnbiA9IGxpbmVzVG9BbGlnbltqXTsKICAgICAgICAgIGlmIChhbGlnblsxXSA9PSBjaHVuay5lZGl0VG8pIHsKICAgICAgICAgICAgaiA9IC0xOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0gZWxzZSBpZiAoYWxpZ25bMV0gPiBjaHVuay5lZGl0VG8pIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChqID4gLTEpCiAgICAgICAgICBsaW5lc1RvQWxpZ24uc3BsaWNlKGogLSAxLCAwLCBbZ2V0TWF0Y2hpbmdPcmlnTGluZShjaHVuay5lZGl0VG8sIGR2LmNodW5rcyksIGNodW5rLmVkaXRUbywgY2h1bmsub3JpZ1RvXSk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBsaW5lc1RvQWxpZ247CiAgfQoKICBmdW5jdGlvbiBhbGlnbkNodW5rcyhkdiwgZm9yY2UpIHsKICAgIGlmICghZHYuZGVhbGlnbmVkICYmICFmb3JjZSkgcmV0dXJuOwogICAgaWYgKCFkdi5vcmlnLmN1ck9wKSByZXR1cm4gZHYub3JpZy5vcGVyYXRpb24oZnVuY3Rpb24oKSB7CiAgICAgIGFsaWduQ2h1bmtzKGR2LCBmb3JjZSk7CiAgICB9KTsKCiAgICBkdi5kZWFsaWduZWQgPSBmYWxzZTsKICAgIHZhciBvdGhlciA9IGR2Lm12LmxlZnQgPT0gZHYgPyBkdi5tdi5yaWdodCA6IGR2Lm12LmxlZnQ7CiAgICBpZiAob3RoZXIpIHsKICAgICAgZW5zdXJlRGlmZihvdGhlcik7CiAgICAgIG90aGVyLmRlYWxpZ25lZCA9IGZhbHNlOwogICAgfQogICAgdmFyIGxpbmVzVG9BbGlnbiA9IGZpbmRBbGlnbmVkTGluZXMoZHYsIG90aGVyKTsKCiAgICAvLyBDbGVhciBvbGQgYWxpZ25lcnMKICAgIHZhciBhbGlnbmVycyA9IGR2Lm12LmFsaWduZXJzOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhbGlnbmVycy5sZW5ndGg7IGkrKykKICAgICAgYWxpZ25lcnNbaV0uY2xlYXIoKTsKICAgIGFsaWduZXJzLmxlbmd0aCA9IDA7CgogICAgdmFyIGNtID0gW2R2Lm9yaWcsIGR2LmVkaXRdLCBzY3JvbGwgPSBbXTsKICAgIGlmIChvdGhlcikgY20ucHVzaChvdGhlci5vcmlnKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY20ubGVuZ3RoOyBpKyspCiAgICAgIHNjcm9sbC5wdXNoKGNtW2ldLmdldFNjcm9sbEluZm8oKS50b3ApOwoKICAgIGZvciAodmFyIGxuID0gMDsgbG4gPCBsaW5lc1RvQWxpZ24ubGVuZ3RoOyBsbisrKQogICAgICBhbGlnbkxpbmVzKGNtLCBsaW5lc1RvQWxpZ25bbG5dLCBhbGlnbmVycyk7CgogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbS5sZW5ndGg7IGkrKykKICAgICAgY21baV0uc2Nyb2xsVG8obnVsbCwgc2Nyb2xsW2ldKTsKICB9CgogIGZ1bmN0aW9uIGFsaWduTGluZXMoY20sIGxpbmVzLCBhbGlnbmVycykgewogICAgdmFyIG1heE9mZnNldCA9IDAsIG9mZnNldCA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbS5sZW5ndGg7IGkrKykgaWYgKGxpbmVzW2ldICE9IG51bGwpIHsKICAgICAgdmFyIG9mZiA9IGNtW2ldLmhlaWdodEF0TGluZShsaW5lc1tpXSwgImxvY2FsIik7CiAgICAgIG9mZnNldFtpXSA9IG9mZjsKICAgICAgbWF4T2Zmc2V0ID0gTWF0aC5tYXgobWF4T2Zmc2V0LCBvZmYpOwogICAgfQogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbS5sZW5ndGg7IGkrKykgaWYgKGxpbmVzW2ldICE9IG51bGwpIHsKICAgICAgdmFyIGRpZmYgPSBtYXhPZmZzZXQgLSBvZmZzZXRbaV07CiAgICAgIGlmIChkaWZmID4gMSkKICAgICAgICBhbGlnbmVycy5wdXNoKHBhZEFib3ZlKGNtW2ldLCBsaW5lc1tpXSwgZGlmZikpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gcGFkQWJvdmUoY20sIGxpbmUsIHNpemUpIHsKICAgIHZhciBhYm92ZSA9IHRydWU7CiAgICBpZiAobGluZSA+IGNtLmxhc3RMaW5lKCkpIHsKICAgICAgbGluZS0tOwogICAgICBhYm92ZSA9IGZhbHNlOwogICAgfQogICAgdmFyIGVsdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgZWx0LmNsYXNzTmFtZSA9ICJDb2RlTWlycm9yLW1lcmdlLXNwYWNlciI7CiAgICBlbHQuc3R5bGUuaGVpZ2h0ID0gc2l6ZSArICJweCI7IGVsdC5zdHlsZS5taW5XaWR0aCA9ICIxcHgiOwogICAgcmV0dXJuIGNtLmFkZExpbmVXaWRnZXQobGluZSwgZWx0LCB7aGVpZ2h0OiBzaXplLCBhYm92ZTogYWJvdmV9KTsKICB9CgogIGZ1bmN0aW9uIGRyYXdDb25uZWN0b3JzRm9yQ2h1bmsoZHYsIGNodW5rLCBzVG9wT3JpZywgc1RvcEVkaXQsIHcpIHsKICAgIHZhciBmbGlwID0gZHYudHlwZSA9PSAibGVmdCI7CiAgICB2YXIgdG9wID0gZHYub3JpZy5oZWlnaHRBdExpbmUoY2h1bmsub3JpZ0Zyb20sICJsb2NhbCIpIC0gc1RvcE9yaWc7CiAgICBpZiAoZHYuc3ZnKSB7CiAgICAgIHZhciB0b3BMcHggPSB0b3A7CiAgICAgIHZhciB0b3BScHggPSBkdi5lZGl0LmhlaWdodEF0TGluZShjaHVuay5lZGl0RnJvbSwgImxvY2FsIikgLSBzVG9wRWRpdDsKICAgICAgaWYgKGZsaXApIHsgdmFyIHRtcCA9IHRvcExweDsgdG9wTHB4ID0gdG9wUnB4OyB0b3BScHggPSB0bXA7IH0KICAgICAgdmFyIGJvdExweCA9IGR2Lm9yaWcuaGVpZ2h0QXRMaW5lKGNodW5rLm9yaWdUbywgImxvY2FsIikgLSBzVG9wT3JpZzsKICAgICAgdmFyIGJvdFJweCA9IGR2LmVkaXQuaGVpZ2h0QXRMaW5lKGNodW5rLmVkaXRUbywgImxvY2FsIikgLSBzVG9wRWRpdDsKICAgICAgaWYgKGZsaXApIHsgdmFyIHRtcCA9IGJvdExweDsgYm90THB4ID0gYm90UnB4OyBib3RScHggPSB0bXA7IH0KICAgICAgdmFyIGN1cnZlVG9wID0gIiBDICIgKyB3LzIgKyAiICIgKyB0b3BScHggKyAiICIgKyB3LzIgKyAiICIgKyB0b3BMcHggKyAiICIgKyAodyArIDIpICsgIiAiICsgdG9wTHB4OwogICAgICB2YXIgY3VydmVCb3QgPSAiIEMgIiArIHcvMiArICIgIiArIGJvdExweCArICIgIiArIHcvMiArICIgIiArIGJvdFJweCArICIgLTEgIiArIGJvdFJweDsKICAgICAgYXR0cnMoZHYuc3ZnLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhzdmdOUywgInBhdGgiKSksCiAgICAgICAgICAgICJkIiwgIk0gLTEgIiArIHRvcFJweCArIGN1cnZlVG9wICsgIiBMICIgKyAodyArIDIpICsgIiAiICsgYm90THB4ICsgY3VydmVCb3QgKyAiIHoiLAogICAgICAgICAgICAiY2xhc3MiLCBkdi5jbGFzc2VzLmNvbm5lY3QpOwogICAgfQogICAgaWYgKGR2LmNvcHlCdXR0b25zKSB7CiAgICAgIHZhciBjb3B5ID0gZHYuY29weUJ1dHRvbnMuYXBwZW5kQ2hpbGQoZWx0KCJkaXYiLCBkdi50eXBlID09ICJsZWZ0IiA/ICJcdTIxZGQiIDogIlx1MjFkYyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb2RlTWlycm9yLW1lcmdlLWNvcHkiKSk7CiAgICAgIHZhciBlZGl0T3JpZ2luYWxzID0gZHYubXYub3B0aW9ucy5hbGxvd0VkaXRpbmdPcmlnaW5hbHM7CiAgICAgIGNvcHkudGl0bGUgPSBlZGl0T3JpZ2luYWxzID8gIlB1c2ggdG8gbGVmdCIgOiAiUmV2ZXJ0IGNodW5rIjsKICAgICAgY29weS5jaHVuayA9IGNodW5rOwogICAgICBjb3B5LnN0eWxlLnRvcCA9IHRvcCArICJweCI7CgogICAgICBpZiAoZWRpdE9yaWdpbmFscykgewogICAgICAgIHZhciB0b3BSZXZlcnNlID0gZHYub3JpZy5oZWlnaHRBdExpbmUoY2h1bmsuZWRpdEZyb20sICJsb2NhbCIpIC0gc1RvcEVkaXQ7CiAgICAgICAgdmFyIGNvcHlSZXZlcnNlID0gZHYuY29weUJ1dHRvbnMuYXBwZW5kQ2hpbGQoZWx0KCJkaXYiLCBkdi50eXBlID09ICJyaWdodCIgPyAiXHUyMWRkIiA6ICJcdTIxZGMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29kZU1pcnJvci1tZXJnZS1jb3B5LXJldmVyc2UiKSk7CiAgICAgICAgY29weVJldmVyc2UudGl0bGUgPSAiUHVzaCB0byByaWdodCI7CiAgICAgICAgY29weVJldmVyc2UuY2h1bmsgPSB7ZWRpdEZyb206IGNodW5rLm9yaWdGcm9tLCBlZGl0VG86IGNodW5rLm9yaWdUbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlnRnJvbTogY2h1bmsuZWRpdEZyb20sIG9yaWdUbzogY2h1bmsuZWRpdFRvfTsKICAgICAgICBjb3B5UmV2ZXJzZS5zdHlsZS50b3AgPSB0b3BSZXZlcnNlICsgInB4IjsKICAgICAgICBkdi50eXBlID09ICJyaWdodCIgPyBjb3B5UmV2ZXJzZS5zdHlsZS5sZWZ0ID0gIjJweCIgOiBjb3B5UmV2ZXJzZS5zdHlsZS5yaWdodCA9ICIycHgiOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBjb3B5Q2h1bmsoZHYsIHRvLCBmcm9tLCBjaHVuaykgewogICAgaWYgKGR2LmRpZmZPdXRPZkRhdGUpIHJldHVybjsKICAgIHZhciBlZGl0U3RhcnQgPSBjaHVuay5lZGl0VG8gPiB0by5sYXN0TGluZSgpID8gUG9zKGNodW5rLmVkaXRGcm9tIC0gMSkgOiBQb3MoY2h1bmsuZWRpdEZyb20sIDApCiAgICB2YXIgb3JpZ1N0YXJ0ID0gY2h1bmsub3JpZ1RvID4gZnJvbS5sYXN0TGluZSgpID8gUG9zKGNodW5rLm9yaWdGcm9tIC0gMSkgOiBQb3MoY2h1bmsub3JpZ0Zyb20sIDApCiAgICB0by5yZXBsYWNlUmFuZ2UoZnJvbS5nZXRSYW5nZShvcmlnU3RhcnQsIFBvcyhjaHVuay5vcmlnVG8sIDApKSwgZWRpdFN0YXJ0LCBQb3MoY2h1bmsuZWRpdFRvLCAwKSkKICB9CgogIC8vIE1lcmdlIHZpZXcsIGNvbnRhaW5pbmcgMCwgMSwgb3IgMiBkaWZmIHZpZXdzLgoKICB2YXIgTWVyZ2VWaWV3ID0gQ29kZU1pcnJvci5NZXJnZVZpZXcgPSBmdW5jdGlvbihub2RlLCBvcHRpb25zKSB7CiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgTWVyZ2VWaWV3KSkgcmV0dXJuIG5ldyBNZXJnZVZpZXcobm9kZSwgb3B0aW9ucyk7CgogICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKICAgIHZhciBvcmlnTGVmdCA9IG9wdGlvbnMub3JpZ0xlZnQsIG9yaWdSaWdodCA9IG9wdGlvbnMub3JpZ1JpZ2h0ID09IG51bGwgPyBvcHRpb25zLm9yaWcgOiBvcHRpb25zLm9yaWdSaWdodDsKCiAgICB2YXIgaGFzTGVmdCA9IG9yaWdMZWZ0ICE9IG51bGwsIGhhc1JpZ2h0ID0gb3JpZ1JpZ2h0ICE9IG51bGw7CiAgICB2YXIgcGFuZXMgPSAxICsgKGhhc0xlZnQgPyAxIDogMCkgKyAoaGFzUmlnaHQgPyAxIDogMCk7CiAgICB2YXIgd3JhcCA9IFtdLCBsZWZ0ID0gdGhpcy5sZWZ0ID0gbnVsbCwgcmlnaHQgPSB0aGlzLnJpZ2h0ID0gbnVsbDsKICAgIHZhciBzZWxmID0gdGhpczsKCiAgICBpZiAoaGFzTGVmdCkgewogICAgICBsZWZ0ID0gdGhpcy5sZWZ0ID0gbmV3IERpZmZWaWV3KHRoaXMsICJsZWZ0Iik7CiAgICAgIHZhciBsZWZ0UGFuZSA9IGVsdCgiZGl2IiwgbnVsbCwgIkNvZGVNaXJyb3ItbWVyZ2UtcGFuZSIpOwogICAgICB3cmFwLnB1c2gobGVmdFBhbmUpOwogICAgICB3cmFwLnB1c2goYnVpbGRHYXAobGVmdCkpOwogICAgfQoKICAgIHZhciBlZGl0UGFuZSA9IGVsdCgiZGl2IiwgbnVsbCwgIkNvZGVNaXJyb3ItbWVyZ2UtcGFuZSIpOwogICAgd3JhcC5wdXNoKGVkaXRQYW5lKTsKCiAgICBpZiAoaGFzUmlnaHQpIHsKICAgICAgcmlnaHQgPSB0aGlzLnJpZ2h0ID0gbmV3IERpZmZWaWV3KHRoaXMsICJyaWdodCIpOwogICAgICB3cmFwLnB1c2goYnVpbGRHYXAocmlnaHQpKTsKICAgICAgdmFyIHJpZ2h0UGFuZSA9IGVsdCgiZGl2IiwgbnVsbCwgIkNvZGVNaXJyb3ItbWVyZ2UtcGFuZSIpOwogICAgICB3cmFwLnB1c2gocmlnaHRQYW5lKTsKICAgIH0KCiAgICAoaGFzUmlnaHQgPyByaWdodFBhbmUgOiBlZGl0UGFuZSkuY2xhc3NOYW1lICs9ICIgQ29kZU1pcnJvci1tZXJnZS1wYW5lLXJpZ2h0bW9zdCI7CgogICAgd3JhcC5wdXNoKGVsdCgiZGl2IiwgbnVsbCwgbnVsbCwgImhlaWdodDogMDsgY2xlYXI6IGJvdGg7IikpOwoKICAgIHZhciB3cmFwRWx0ID0gdGhpcy53cmFwID0gbm9kZS5hcHBlbmRDaGlsZChlbHQoImRpdiIsIHdyYXAsICJDb2RlTWlycm9yLW1lcmdlIENvZGVNaXJyb3ItbWVyZ2UtIiArIHBhbmVzICsgInBhbmUiKSk7CiAgICB0aGlzLmVkaXQgPSBDb2RlTWlycm9yKGVkaXRQYW5lLCBjb3B5T2JqKG9wdGlvbnMpKTsKCiAgICBpZiAobGVmdCkgbGVmdC5pbml0KGxlZnRQYW5lLCBvcmlnTGVmdCwgb3B0aW9ucyk7CiAgICBpZiAocmlnaHQpIHJpZ2h0LmluaXQocmlnaHRQYW5lLCBvcmlnUmlnaHQsIG9wdGlvbnMpOwoKICAgIGlmIChvcHRpb25zLmNvbGxhcHNlSWRlbnRpY2FsKQogICAgICB0aGlzLmVkaXRvcigpLm9wZXJhdGlvbihmdW5jdGlvbigpIHsKICAgICAgICBjb2xsYXBzZUlkZW50aWNhbFN0cmV0Y2hlcyhzZWxmLCBvcHRpb25zLmNvbGxhcHNlSWRlbnRpY2FsKTsKICAgICAgfSk7CiAgICBpZiAob3B0aW9ucy5jb25uZWN0ID09ICJhbGlnbiIpIHsKICAgICAgdGhpcy5hbGlnbmVycyA9IFtdOwogICAgICBhbGlnbkNodW5rcyh0aGlzLmxlZnQgfHwgdGhpcy5yaWdodCwgdHJ1ZSk7CiAgICB9CgogICAgdmFyIG9uUmVzaXplID0gZnVuY3Rpb24oKSB7CiAgICAgIGlmIChsZWZ0KSBtYWtlQ29ubmVjdGlvbnMobGVmdCk7CiAgICAgIGlmIChyaWdodCkgbWFrZUNvbm5lY3Rpb25zKHJpZ2h0KTsKICAgIH07CiAgICBDb2RlTWlycm9yLm9uKHdpbmRvdywgInJlc2l6ZSIsIG9uUmVzaXplKTsKICAgIHZhciByZXNpemVJbnRlcnZhbCA9IHNldEludGVydmFsKGZ1bmN0aW9uKCkgewogICAgICBmb3IgKHZhciBwID0gd3JhcEVsdC5wYXJlbnROb2RlOyBwICYmIHAgIT0gZG9jdW1lbnQuYm9keTsgcCA9IHAucGFyZW50Tm9kZSkge30KICAgICAgaWYgKCFwKSB7IGNsZWFySW50ZXJ2YWwocmVzaXplSW50ZXJ2YWwpOyBDb2RlTWlycm9yLm9mZih3aW5kb3csICJyZXNpemUiLCBvblJlc2l6ZSk7IH0KICAgIH0sIDUwMDApOwogIH07CgogIGZ1bmN0aW9uIGJ1aWxkR2FwKGR2KSB7CiAgICB2YXIgbG9jayA9IGR2LmxvY2tCdXR0b24gPSBlbHQoImRpdiIsIG51bGwsICJDb2RlTWlycm9yLW1lcmdlLXNjcm9sbGxvY2siKTsKICAgIGxvY2sudGl0bGUgPSAiVG9nZ2xlIGxvY2tlZCBzY3JvbGxpbmciOwogICAgdmFyIGxvY2tXcmFwID0gZWx0KCJkaXYiLCBbbG9ja10sICJDb2RlTWlycm9yLW1lcmdlLXNjcm9sbGxvY2std3JhcCIpOwogICAgQ29kZU1pcnJvci5vbihsb2NrLCAiY2xpY2siLCBmdW5jdGlvbigpIHsgc2V0U2Nyb2xsTG9jayhkdiwgIWR2LmxvY2tTY3JvbGwpOyB9KTsKICAgIHZhciBnYXBFbHRzID0gW2xvY2tXcmFwXTsKICAgIGlmIChkdi5tdi5vcHRpb25zLnJldmVydEJ1dHRvbnMgIT09IGZhbHNlKSB7CiAgICAgIGR2LmNvcHlCdXR0b25zID0gZWx0KCJkaXYiLCBudWxsLCAiQ29kZU1pcnJvci1tZXJnZS1jb3B5YnV0dG9ucy0iICsgZHYudHlwZSk7CiAgICAgIENvZGVNaXJyb3Iub24oZHYuY29weUJ1dHRvbnMsICJjbGljayIsIGZ1bmN0aW9uKGUpIHsKICAgICAgICB2YXIgbm9kZSA9IGUudGFyZ2V0IHx8IGUuc3JjRWxlbWVudDsKICAgICAgICBpZiAoIW5vZGUuY2h1bmspIHJldHVybjsKICAgICAgICBpZiAobm9kZS5jbGFzc05hbWUgPT0gIkNvZGVNaXJyb3ItbWVyZ2UtY29weS1yZXZlcnNlIikgewogICAgICAgICAgY29weUNodW5rKGR2LCBkdi5vcmlnLCBkdi5lZGl0LCBub2RlLmNodW5rKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgY29weUNodW5rKGR2LCBkdi5lZGl0LCBkdi5vcmlnLCBub2RlLmNodW5rKTsKICAgICAgfSk7CiAgICAgIGdhcEVsdHMudW5zaGlmdChkdi5jb3B5QnV0dG9ucyk7CiAgICB9CiAgICBpZiAoZHYubXYub3B0aW9ucy5jb25uZWN0ICE9ICJhbGlnbiIpIHsKICAgICAgdmFyIHN2ZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyAmJiBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoc3ZnTlMsICJzdmciKTsKICAgICAgaWYgKHN2ZyAmJiAhc3ZnLmNyZWF0ZVNWR1JlY3QpIHN2ZyA9IG51bGw7CiAgICAgIGR2LnN2ZyA9IHN2ZzsKICAgICAgaWYgKHN2ZykgZ2FwRWx0cy5wdXNoKHN2Zyk7CiAgICB9CgogICAgcmV0dXJuIGR2LmdhcCA9IGVsdCgiZGl2IiwgZ2FwRWx0cywgIkNvZGVNaXJyb3ItbWVyZ2UtZ2FwIik7CiAgfQoKICBNZXJnZVZpZXcucHJvdG90eXBlID0gewogICAgY29uc3R1Y3RvcjogTWVyZ2VWaWV3LAogICAgZWRpdG9yOiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuZWRpdDsgfSwKICAgIHJpZ2h0T3JpZ2luYWw6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5yaWdodCAmJiB0aGlzLnJpZ2h0Lm9yaWc7IH0sCiAgICBsZWZ0T3JpZ2luYWw6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5sZWZ0ICYmIHRoaXMubGVmdC5vcmlnOyB9LAogICAgc2V0U2hvd0RpZmZlcmVuY2VzOiBmdW5jdGlvbih2YWwpIHsKICAgICAgaWYgKHRoaXMucmlnaHQpIHRoaXMucmlnaHQuc2V0U2hvd0RpZmZlcmVuY2VzKHZhbCk7CiAgICAgIGlmICh0aGlzLmxlZnQpIHRoaXMubGVmdC5zZXRTaG93RGlmZmVyZW5jZXModmFsKTsKICAgIH0sCiAgICByaWdodENodW5rczogZnVuY3Rpb24oKSB7CiAgICAgIGlmICh0aGlzLnJpZ2h0KSB7IGVuc3VyZURpZmYodGhpcy5yaWdodCk7IHJldHVybiB0aGlzLnJpZ2h0LmNodW5rczsgfQogICAgfSwKICAgIGxlZnRDaHVua3M6IGZ1bmN0aW9uKCkgewogICAgICBpZiAodGhpcy5sZWZ0KSB7IGVuc3VyZURpZmYodGhpcy5sZWZ0KTsgcmV0dXJuIHRoaXMubGVmdC5jaHVua3M7IH0KICAgIH0KICB9OwoKICBmdW5jdGlvbiBhc1N0cmluZyhvYmopIHsKICAgIGlmICh0eXBlb2Ygb2JqID09ICJzdHJpbmciKSByZXR1cm4gb2JqOwogICAgZWxzZSByZXR1cm4gb2JqLmdldFZhbHVlKCk7CiAgfQoKICAvLyBPcGVyYXRpb25zIG9uIGRpZmZzCgogIHZhciBkbXAgPSBuZXcgZGlmZl9tYXRjaF9wYXRjaCgpOwogIGZ1bmN0aW9uIGdldERpZmYoYSwgYikgewogICAgdmFyIGRpZmYgPSBkbXAuZGlmZl9tYWluKGEsIGIpOwogICAgZG1wLmRpZmZfY2xlYW51cFNlbWFudGljKGRpZmYpOwogICAgLy8gVGhlIGxpYnJhcnkgc29tZXRpbWVzIGxlYXZlcyBpbiBlbXB0eSBwYXJ0cywgd2hpY2ggY29uZnVzZSB0aGUgYWxnb3JpdGhtCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRpZmYubGVuZ3RoOyArK2kpIHsKICAgICAgdmFyIHBhcnQgPSBkaWZmW2ldOwogICAgICBpZiAoIXBhcnRbMV0pIHsKICAgICAgICBkaWZmLnNwbGljZShpLS0sIDEpOwogICAgICB9IGVsc2UgaWYgKGkgJiYgZGlmZltpIC0gMV1bMF0gPT0gcGFydFswXSkgewogICAgICAgIGRpZmYuc3BsaWNlKGktLSwgMSk7CiAgICAgICAgZGlmZltpXVsxXSArPSBwYXJ0WzFdOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gZGlmZjsKICB9CgogIGZ1bmN0aW9uIGdldENodW5rcyhkaWZmKSB7CiAgICB2YXIgY2h1bmtzID0gW107CiAgICB2YXIgc3RhcnRFZGl0ID0gMCwgc3RhcnRPcmlnID0gMDsKICAgIHZhciBlZGl0ID0gUG9zKDAsIDApLCBvcmlnID0gUG9zKDAsIDApOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkaWZmLmxlbmd0aDsgKytpKSB7CiAgICAgIHZhciBwYXJ0ID0gZGlmZltpXSwgdHAgPSBwYXJ0WzBdOwogICAgICBpZiAodHAgPT0gRElGRl9FUVVBTCkgewogICAgICAgIHZhciBzdGFydE9mZiA9IHN0YXJ0T2ZMaW5lQ2xlYW4oZGlmZiwgaSkgPyAwIDogMTsKICAgICAgICB2YXIgY2xlYW5Gcm9tRWRpdCA9IGVkaXQubGluZSArIHN0YXJ0T2ZmLCBjbGVhbkZyb21PcmlnID0gb3JpZy5saW5lICsgc3RhcnRPZmY7CiAgICAgICAgbW92ZU92ZXIoZWRpdCwgcGFydFsxXSwgbnVsbCwgb3JpZyk7CiAgICAgICAgdmFyIGVuZE9mZiA9IGVuZE9mTGluZUNsZWFuKGRpZmYsIGkpID8gMSA6IDA7CiAgICAgICAgdmFyIGNsZWFuVG9FZGl0ID0gZWRpdC5saW5lICsgZW5kT2ZmLCBjbGVhblRvT3JpZyA9IG9yaWcubGluZSArIGVuZE9mZjsKICAgICAgICBpZiAoY2xlYW5Ub0VkaXQgPiBjbGVhbkZyb21FZGl0KSB7CiAgICAgICAgICBpZiAoaSkgY2h1bmtzLnB1c2goe29yaWdGcm9tOiBzdGFydE9yaWcsIG9yaWdUbzogY2xlYW5Gcm9tT3JpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRpdEZyb206IHN0YXJ0RWRpdCwgZWRpdFRvOiBjbGVhbkZyb21FZGl0fSk7CiAgICAgICAgICBzdGFydEVkaXQgPSBjbGVhblRvRWRpdDsgc3RhcnRPcmlnID0gY2xlYW5Ub09yaWc7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIG1vdmVPdmVyKHRwID09IERJRkZfSU5TRVJUID8gZWRpdCA6IG9yaWcsIHBhcnRbMV0pOwogICAgICB9CiAgICB9CiAgICBpZiAoc3RhcnRFZGl0IDw9IGVkaXQubGluZSB8fCBzdGFydE9yaWcgPD0gb3JpZy5saW5lKQogICAgICBjaHVua3MucHVzaCh7b3JpZ0Zyb206IHN0YXJ0T3JpZywgb3JpZ1RvOiBvcmlnLmxpbmUgKyAxLAogICAgICAgICAgICAgICAgICAgZWRpdEZyb206IHN0YXJ0RWRpdCwgZWRpdFRvOiBlZGl0LmxpbmUgKyAxfSk7CiAgICByZXR1cm4gY2h1bmtzOwogIH0KCiAgZnVuY3Rpb24gZW5kT2ZMaW5lQ2xlYW4oZGlmZiwgaSkgewogICAgaWYgKGkgPT0gZGlmZi5sZW5ndGggLSAxKSByZXR1cm4gdHJ1ZTsKICAgIHZhciBuZXh0ID0gZGlmZltpICsgMV1bMV07CiAgICBpZiAobmV4dC5sZW5ndGggPT0gMSB8fCBuZXh0LmNoYXJDb2RlQXQoMCkgIT0gMTApIHJldHVybiBmYWxzZTsKICAgIGlmIChpID09IGRpZmYubGVuZ3RoIC0gMikgcmV0dXJuIHRydWU7CiAgICBuZXh0ID0gZGlmZltpICsgMl1bMV07CiAgICByZXR1cm4gbmV4dC5sZW5ndGggPiAxICYmIG5leHQuY2hhckNvZGVBdCgwKSA9PSAxMDsKICB9CgogIGZ1bmN0aW9uIHN0YXJ0T2ZMaW5lQ2xlYW4oZGlmZiwgaSkgewogICAgaWYgKGkgPT0gMCkgcmV0dXJuIHRydWU7CiAgICB2YXIgbGFzdCA9IGRpZmZbaSAtIDFdWzFdOwogICAgaWYgKGxhc3QuY2hhckNvZGVBdChsYXN0Lmxlbmd0aCAtIDEpICE9IDEwKSByZXR1cm4gZmFsc2U7CiAgICBpZiAoaSA9PSAxKSByZXR1cm4gdHJ1ZTsKICAgIGxhc3QgPSBkaWZmW2kgLSAyXVsxXTsKICAgIHJldHVybiBsYXN0LmNoYXJDb2RlQXQobGFzdC5sZW5ndGggLSAxKSA9PSAxMDsKICB9CgogIGZ1bmN0aW9uIGNodW5rQm91bmRhcmllc0Fyb3VuZChjaHVua3MsIG4sIG5JbkVkaXQpIHsKICAgIHZhciBiZWZvcmVFLCBhZnRlckUsIGJlZm9yZU8sIGFmdGVyTzsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2h1bmtzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBjaHVuayA9IGNodW5rc1tpXTsKICAgICAgdmFyIGZyb21Mb2NhbCA9IG5JbkVkaXQgPyBjaHVuay5lZGl0RnJvbSA6IGNodW5rLm9yaWdGcm9tOwogICAgICB2YXIgdG9Mb2NhbCA9IG5JbkVkaXQgPyBjaHVuay5lZGl0VG8gOiBjaHVuay5vcmlnVG87CiAgICAgIGlmIChhZnRlckUgPT0gbnVsbCkgewogICAgICAgIGlmIChmcm9tTG9jYWwgPiBuKSB7IGFmdGVyRSA9IGNodW5rLmVkaXRGcm9tOyBhZnRlck8gPSBjaHVuay5vcmlnRnJvbTsgfQogICAgICAgIGVsc2UgaWYgKHRvTG9jYWwgPiBuKSB7IGFmdGVyRSA9IGNodW5rLmVkaXRUbzsgYWZ0ZXJPID0gY2h1bmsub3JpZ1RvOyB9CiAgICAgIH0KICAgICAgaWYgKHRvTG9jYWwgPD0gbikgeyBiZWZvcmVFID0gY2h1bmsuZWRpdFRvOyBiZWZvcmVPID0gY2h1bmsub3JpZ1RvOyB9CiAgICAgIGVsc2UgaWYgKGZyb21Mb2NhbCA8PSBuKSB7IGJlZm9yZUUgPSBjaHVuay5lZGl0RnJvbTsgYmVmb3JlTyA9IGNodW5rLm9yaWdGcm9tOyB9CiAgICB9CiAgICByZXR1cm4ge2VkaXQ6IHtiZWZvcmU6IGJlZm9yZUUsIGFmdGVyOiBhZnRlckV9LCBvcmlnOiB7YmVmb3JlOiBiZWZvcmVPLCBhZnRlcjogYWZ0ZXJPfX07CiAgfQoKICBmdW5jdGlvbiBjb2xsYXBzZVNpbmdsZShjbSwgZnJvbSwgdG8pIHsKICAgIGNtLmFkZExpbmVDbGFzcyhmcm9tLCAid3JhcCIsICJDb2RlTWlycm9yLW1lcmdlLWNvbGxhcHNlZC1saW5lIik7CiAgICB2YXIgd2lkZ2V0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpOwogICAgd2lkZ2V0LmNsYXNzTmFtZSA9ICJDb2RlTWlycm9yLW1lcmdlLWNvbGxhcHNlZC13aWRnZXQiOwogICAgd2lkZ2V0LnRpdGxlID0gIklkZW50aWNhbCB0ZXh0IGNvbGxhcHNlZC4gQ2xpY2sgdG8gZXhwYW5kLiI7CiAgICB2YXIgbWFyayA9IGNtLm1hcmtUZXh0KFBvcyhmcm9tLCAwKSwgUG9zKHRvIC0gMSksIHsKICAgICAgaW5jbHVzaXZlTGVmdDogdHJ1ZSwKICAgICAgaW5jbHVzaXZlUmlnaHQ6IHRydWUsCiAgICAgIHJlcGxhY2VkV2l0aDogd2lkZ2V0LAogICAgICBjbGVhck9uRW50ZXI6IHRydWUKICAgIH0pOwogICAgZnVuY3Rpb24gY2xlYXIoKSB7CiAgICAgIG1hcmsuY2xlYXIoKTsKICAgICAgY20ucmVtb3ZlTGluZUNsYXNzKGZyb20sICJ3cmFwIiwgIkNvZGVNaXJyb3ItbWVyZ2UtY29sbGFwc2VkLWxpbmUiKTsKICAgIH0KICAgIENvZGVNaXJyb3Iub24od2lkZ2V0LCAiY2xpY2siLCBjbGVhcik7CiAgICByZXR1cm4ge21hcms6IG1hcmssIGNsZWFyOiBjbGVhcn07CiAgfQoKICBmdW5jdGlvbiBjb2xsYXBzZVN0cmV0Y2goc2l6ZSwgZWRpdG9ycykgewogICAgdmFyIG1hcmtzID0gW107CiAgICBmdW5jdGlvbiBjbGVhcigpIHsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtYXJrcy5sZW5ndGg7IGkrKykgbWFya3NbaV0uY2xlYXIoKTsKICAgIH0KICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZWRpdG9ycy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgZWRpdG9yID0gZWRpdG9yc1tpXTsKICAgICAgdmFyIG1hcmsgPSBjb2xsYXBzZVNpbmdsZShlZGl0b3IuY20sIGVkaXRvci5saW5lLCBlZGl0b3IubGluZSArIHNpemUpOwogICAgICBtYXJrcy5wdXNoKG1hcmspOwogICAgICBtYXJrLm1hcmsub24oImNsZWFyIiwgY2xlYXIpOwogICAgfQogICAgcmV0dXJuIG1hcmtzWzBdLm1hcms7CiAgfQoKICBmdW5jdGlvbiB1bmNsZWFyTmVhckNodW5rcyhkdiwgbWFyZ2luLCBvZmYsIGNsZWFyKSB7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGR2LmNodW5rcy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgY2h1bmsgPSBkdi5jaHVua3NbaV07CiAgICAgIGZvciAodmFyIGwgPSBjaHVuay5lZGl0RnJvbSAtIG1hcmdpbjsgbCA8IGNodW5rLmVkaXRUbyArIG1hcmdpbjsgbCsrKSB7CiAgICAgICAgdmFyIHBvcyA9IGwgKyBvZmY7CiAgICAgICAgaWYgKHBvcyA+PSAwICYmIHBvcyA8IGNsZWFyLmxlbmd0aCkgY2xlYXJbcG9zXSA9IGZhbHNlOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBjb2xsYXBzZUlkZW50aWNhbFN0cmV0Y2hlcyhtdiwgbWFyZ2luKSB7CiAgICBpZiAodHlwZW9mIG1hcmdpbiAhPSAibnVtYmVyIikgbWFyZ2luID0gMjsKICAgIHZhciBjbGVhciA9IFtdLCBlZGl0ID0gbXYuZWRpdG9yKCksIG9mZiA9IGVkaXQuZmlyc3RMaW5lKCk7CiAgICBmb3IgKHZhciBsID0gb2ZmLCBlID0gZWRpdC5sYXN0TGluZSgpOyBsIDw9IGU7IGwrKykgY2xlYXIucHVzaCh0cnVlKTsKICAgIGlmIChtdi5sZWZ0KSB1bmNsZWFyTmVhckNodW5rcyhtdi5sZWZ0LCBtYXJnaW4sIG9mZiwgY2xlYXIpOwogICAgaWYgKG12LnJpZ2h0KSB1bmNsZWFyTmVhckNodW5rcyhtdi5yaWdodCwgbWFyZ2luLCBvZmYsIGNsZWFyKTsKCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNsZWFyLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmIChjbGVhcltpXSkgewogICAgICAgIHZhciBsaW5lID0gaSArIG9mZjsKICAgICAgICBmb3IgKHZhciBzaXplID0gMTsgaSA8IGNsZWFyLmxlbmd0aCAtIDEgJiYgY2xlYXJbaSArIDFdOyBpKyssIHNpemUrKykge30KICAgICAgICBpZiAoc2l6ZSA+IG1hcmdpbikgewogICAgICAgICAgdmFyIGVkaXRvcnMgPSBbe2xpbmU6IGxpbmUsIGNtOiBlZGl0fV07CiAgICAgICAgICBpZiAobXYubGVmdCkgZWRpdG9ycy5wdXNoKHtsaW5lOiBnZXRNYXRjaGluZ09yaWdMaW5lKGxpbmUsIG12LmxlZnQuY2h1bmtzKSwgY206IG12LmxlZnQub3JpZ30pOwogICAgICAgICAgaWYgKG12LnJpZ2h0KSBlZGl0b3JzLnB1c2goe2xpbmU6IGdldE1hdGNoaW5nT3JpZ0xpbmUobGluZSwgbXYucmlnaHQuY2h1bmtzKSwgY206IG12LnJpZ2h0Lm9yaWd9KTsKICAgICAgICAgIHZhciBtYXJrID0gY29sbGFwc2VTdHJldGNoKHNpemUsIGVkaXRvcnMpOwogICAgICAgICAgaWYgKG12Lm9wdGlvbnMub25Db2xsYXBzZSkgbXYub3B0aW9ucy5vbkNvbGxhcHNlKG12LCBsaW5lLCBzaXplLCBtYXJrKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIC8vIEdlbmVyYWwgdXRpbGl0aWVzCgogIGZ1bmN0aW9uIGVsdCh0YWcsIGNvbnRlbnQsIGNsYXNzTmFtZSwgc3R5bGUpIHsKICAgIHZhciBlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWcpOwogICAgaWYgKGNsYXNzTmFtZSkgZS5jbGFzc05hbWUgPSBjbGFzc05hbWU7CiAgICBpZiAoc3R5bGUpIGUuc3R5bGUuY3NzVGV4dCA9IHN0eWxlOwogICAgaWYgKHR5cGVvZiBjb250ZW50ID09ICJzdHJpbmciKSBlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNvbnRlbnQpKTsKICAgIGVsc2UgaWYgKGNvbnRlbnQpIGZvciAodmFyIGkgPSAwOyBpIDwgY29udGVudC5sZW5ndGg7ICsraSkgZS5hcHBlbmRDaGlsZChjb250ZW50W2ldKTsKICAgIHJldHVybiBlOwogIH0KCiAgZnVuY3Rpb24gY2xlYXIobm9kZSkgewogICAgZm9yICh2YXIgY291bnQgPSBub2RlLmNoaWxkTm9kZXMubGVuZ3RoOyBjb3VudCA+IDA7IC0tY291bnQpCiAgICAgIG5vZGUucmVtb3ZlQ2hpbGQobm9kZS5maXJzdENoaWxkKTsKICB9CgogIGZ1bmN0aW9uIGF0dHJzKGVsdCkgewogICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpICs9IDIpCiAgICAgIGVsdC5zZXRBdHRyaWJ1dGUoYXJndW1lbnRzW2ldLCBhcmd1bWVudHNbaSsxXSk7CiAgfQoKICBmdW5jdGlvbiBjb3B5T2JqKG9iaiwgdGFyZ2V0KSB7CiAgICBpZiAoIXRhcmdldCkgdGFyZ2V0ID0ge307CiAgICBmb3IgKHZhciBwcm9wIGluIG9iaikgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgdGFyZ2V0W3Byb3BdID0gb2JqW3Byb3BdOwogICAgcmV0dXJuIHRhcmdldDsKICB9CgogIGZ1bmN0aW9uIG1vdmVPdmVyKHBvcywgc3RyLCBjb3B5LCBvdGhlcikgewogICAgdmFyIG91dCA9IGNvcHkgPyBQb3MocG9zLmxpbmUsIHBvcy5jaCkgOiBwb3MsIGF0ID0gMDsKICAgIGZvciAoOzspIHsKICAgICAgdmFyIG5sID0gc3RyLmluZGV4T2YoIlxuIiwgYXQpOwogICAgICBpZiAobmwgPT0gLTEpIGJyZWFrOwogICAgICArK291dC5saW5lOwogICAgICBpZiAob3RoZXIpICsrb3RoZXIubGluZTsKICAgICAgYXQgPSBubCArIDE7CiAgICB9CiAgICBvdXQuY2ggPSAoYXQgPyAwIDogb3V0LmNoKSArIChzdHIubGVuZ3RoIC0gYXQpOwogICAgaWYgKG90aGVyKSBvdGhlci5jaCA9IChhdCA/IDAgOiBvdGhlci5jaCkgKyAoc3RyLmxlbmd0aCAtIGF0KTsKICAgIHJldHVybiBvdXQ7CiAgfQoKICBmdW5jdGlvbiBwb3NNaW4oYSwgYikgeyByZXR1cm4gKGEubGluZSAtIGIubGluZSB8fCBhLmNoIC0gYi5jaCkgPCAwID8gYSA6IGI7IH0KICBmdW5jdGlvbiBwb3NNYXgoYSwgYikgeyByZXR1cm4gKGEubGluZSAtIGIubGluZSB8fCBhLmNoIC0gYi5jaCkgPiAwID8gYSA6IGI7IH0KICBmdW5jdGlvbiBwb3NFcShhLCBiKSB7IHJldHVybiBhLmxpbmUgPT0gYi5saW5lICYmIGEuY2ggPT0gYi5jaDsgfQoKICBmdW5jdGlvbiBmaW5kUHJldkRpZmYoY2h1bmtzLCBzdGFydCwgaXNPcmlnKSB7CiAgICBmb3IgKHZhciBpID0gY2h1bmtzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgIHZhciBjaHVuayA9IGNodW5rc1tpXTsKICAgICAgdmFyIHRvID0gKGlzT3JpZyA/IGNodW5rLm9yaWdUbyA6IGNodW5rLmVkaXRUbykgLSAxOwogICAgICBpZiAodG8gPCBzdGFydCkgcmV0dXJuIHRvOwogICAgfQogIH0KCiAgZnVuY3Rpb24gZmluZE5leHREaWZmKGNodW5rcywgc3RhcnQsIGlzT3JpZykgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaHVua3MubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGNodW5rID0gY2h1bmtzW2ldOwogICAgICB2YXIgZnJvbSA9IChpc09yaWcgPyBjaHVuay5vcmlnRnJvbSA6IGNodW5rLmVkaXRGcm9tKTsKICAgICAgaWYgKGZyb20gPiBzdGFydCkgcmV0dXJuIGZyb207CiAgICB9CiAgfQoKICBmdW5jdGlvbiBnb05lYXJieURpZmYoY20sIGRpcikgewogICAgdmFyIGZvdW5kID0gbnVsbCwgdmlld3MgPSBjbS5zdGF0ZS5kaWZmVmlld3MsIGxpbmUgPSBjbS5nZXRDdXJzb3IoKS5saW5lOwogICAgaWYgKHZpZXdzKSBmb3IgKHZhciBpID0gMDsgaSA8IHZpZXdzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBkdiA9IHZpZXdzW2ldLCBpc09yaWcgPSBjbSA9PSBkdi5vcmlnOwogICAgICBlbnN1cmVEaWZmKGR2KTsKICAgICAgdmFyIHBvcyA9IGRpciA8IDAgPyBmaW5kUHJldkRpZmYoZHYuY2h1bmtzLCBsaW5lLCBpc09yaWcpIDogZmluZE5leHREaWZmKGR2LmNodW5rcywgbGluZSwgaXNPcmlnKTsKICAgICAgaWYgKHBvcyAhPSBudWxsICYmIChmb3VuZCA9PSBudWxsIHx8IChkaXIgPCAwID8gcG9zID4gZm91bmQgOiBwb3MgPCBmb3VuZCkpKQogICAgICAgIGZvdW5kID0gcG9zOwogICAgfQogICAgaWYgKGZvdW5kICE9IG51bGwpCiAgICAgIGNtLnNldEN1cnNvcihmb3VuZCwgMCk7CiAgICBlbHNlCiAgICAgIHJldHVybiBDb2RlTWlycm9yLlBhc3M7CiAgfQoKICBDb2RlTWlycm9yLmNvbW1hbmRzLmdvTmV4dERpZmYgPSBmdW5jdGlvbihjbSkgewogICAgcmV0dXJuIGdvTmVhcmJ5RGlmZihjbSwgMSk7CiAgfTsKICBDb2RlTWlycm9yLmNvbW1hbmRzLmdvUHJldkRpZmYgPSBmdW5jdGlvbihjbSkgewogICAgcmV0dXJuIGdvTmVhcmJ5RGlmZihjbSwgLTEpOwogIH07Cn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/mode/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/mode/loadmode.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSwgImNqcyIpOwogIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kKSAvLyBBTUQKICAgIGRlZmluZShbIi4uLy4uL2xpYi9jb2RlbWlycm9yIl0sIGZ1bmN0aW9uKENNKSB7IG1vZChDTSwgImFtZCIpOyB9KTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvciwgInBsYWluIik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IsIGVudikgewogIGlmICghQ29kZU1pcnJvci5tb2RlVVJMKSBDb2RlTWlycm9yLm1vZGVVUkwgPSAiLi4vbW9kZS8lTi8lTi5qcyI7CgogIHZhciBsb2FkaW5nID0ge307CiAgZnVuY3Rpb24gc3BsaXRDYWxsYmFjayhjb250LCBuKSB7CiAgICB2YXIgY291bnREb3duID0gbjsKICAgIHJldHVybiBmdW5jdGlvbigpIHsgaWYgKC0tY291bnREb3duID09IDApIGNvbnQoKTsgfTsKICB9CiAgZnVuY3Rpb24gZW5zdXJlRGVwcyhtb2RlLCBjb250KSB7CiAgICB2YXIgZGVwcyA9IENvZGVNaXJyb3IubW9kZXNbbW9kZV0uZGVwZW5kZW5jaWVzOwogICAgaWYgKCFkZXBzKSByZXR1cm4gY29udCgpOwogICAgdmFyIG1pc3NpbmcgPSBbXTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGVwcy5sZW5ndGg7ICsraSkgewogICAgICBpZiAoIUNvZGVNaXJyb3IubW9kZXMuaGFzT3duUHJvcGVydHkoZGVwc1tpXSkpCiAgICAgICAgbWlzc2luZy5wdXNoKGRlcHNbaV0pOwogICAgfQogICAgaWYgKCFtaXNzaW5nLmxlbmd0aCkgcmV0dXJuIGNvbnQoKTsKICAgIHZhciBzcGxpdCA9IHNwbGl0Q2FsbGJhY2soY29udCwgbWlzc2luZy5sZW5ndGgpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtaXNzaW5nLmxlbmd0aDsgKytpKQogICAgICBDb2RlTWlycm9yLnJlcXVpcmVNb2RlKG1pc3NpbmdbaV0sIHNwbGl0KTsKICB9CgogIENvZGVNaXJyb3IucmVxdWlyZU1vZGUgPSBmdW5jdGlvbihtb2RlLCBjb250KSB7CiAgICBpZiAodHlwZW9mIG1vZGUgIT0gInN0cmluZyIpIG1vZGUgPSBtb2RlLm5hbWU7CiAgICBpZiAoQ29kZU1pcnJvci5tb2Rlcy5oYXNPd25Qcm9wZXJ0eShtb2RlKSkgcmV0dXJuIGVuc3VyZURlcHMobW9kZSwgY29udCk7CiAgICBpZiAobG9hZGluZy5oYXNPd25Qcm9wZXJ0eShtb2RlKSkgcmV0dXJuIGxvYWRpbmdbbW9kZV0ucHVzaChjb250KTsKCiAgICB2YXIgZmlsZSA9IENvZGVNaXJyb3IubW9kZVVSTC5yZXBsYWNlKC8lTi9nLCBtb2RlKTsKICAgIGlmIChlbnYgPT0gInBsYWluIikgewogICAgICB2YXIgc2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7CiAgICAgIHNjcmlwdC5zcmMgPSBmaWxlOwogICAgICB2YXIgb3RoZXJzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInNjcmlwdCIpWzBdOwogICAgICB2YXIgbGlzdCA9IGxvYWRpbmdbbW9kZV0gPSBbY29udF07CiAgICAgIENvZGVNaXJyb3Iub24oc2NyaXB0LCAibG9hZCIsIGZ1bmN0aW9uKCkgewogICAgICAgIGVuc3VyZURlcHMobW9kZSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyArK2kpIGxpc3RbaV0oKTsKICAgICAgICB9KTsKICAgICAgfSk7CiAgICAgIG90aGVycy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShzY3JpcHQsIG90aGVycyk7CiAgICB9IGVsc2UgaWYgKGVudiA9PSAiY2pzIikgewogICAgICByZXF1aXJlKGZpbGUpOwogICAgICBjb250KCk7CiAgICB9IGVsc2UgaWYgKGVudiA9PSAiYW1kIikgewogICAgICByZXF1aXJlanMoW2ZpbGVdLCBjb250KTsKICAgIH0KICB9OwoKICBDb2RlTWlycm9yLmF1dG9Mb2FkTW9kZSA9IGZ1bmN0aW9uKGluc3RhbmNlLCBtb2RlKSB7CiAgICBpZiAoIUNvZGVNaXJyb3IubW9kZXMuaGFzT3duUHJvcGVydHkobW9kZSkpCiAgICAgIENvZGVNaXJyb3IucmVxdWlyZU1vZGUobW9kZSwgZnVuY3Rpb24oKSB7CiAgICAgICAgaW5zdGFuY2Uuc2V0T3B0aW9uKCJtb2RlIiwgaW5zdGFuY2UuZ2V0T3B0aW9uKCJtb2RlIikpOwogICAgICB9KTsKICB9Owp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/mode/multiplex.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5tdWx0aXBsZXhpbmdNb2RlID0gZnVuY3Rpb24ob3V0ZXIgLyosIG90aGVycyAqLykgewogIC8vIE90aGVycyBzaG91bGQgYmUge29wZW4sIGNsb3NlLCBtb2RlIFssIGRlbGltU3R5bGVdIFssIGlubmVyU3R5bGVdfSBvYmplY3RzCiAgdmFyIG90aGVycyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7CgogIGZ1bmN0aW9uIGluZGV4T2Yoc3RyaW5nLCBwYXR0ZXJuLCBmcm9tLCByZXR1cm5FbmQpIHsKICAgIGlmICh0eXBlb2YgcGF0dGVybiA9PSAic3RyaW5nIikgewogICAgICB2YXIgZm91bmQgPSBzdHJpbmcuaW5kZXhPZihwYXR0ZXJuLCBmcm9tKTsKICAgICAgcmV0dXJuIHJldHVybkVuZCAmJiBmb3VuZCA+IC0xID8gZm91bmQgKyBwYXR0ZXJuLmxlbmd0aCA6IGZvdW5kOwogICAgfQogICAgdmFyIG0gPSBwYXR0ZXJuLmV4ZWMoZnJvbSA/IHN0cmluZy5zbGljZShmcm9tKSA6IHN0cmluZyk7CiAgICByZXR1cm4gbSA/IG0uaW5kZXggKyBmcm9tICsgKHJldHVybkVuZCA/IG1bMF0ubGVuZ3RoIDogMCkgOiAtMTsKICB9CgogIHJldHVybiB7CiAgICBzdGFydFN0YXRlOiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBvdXRlcjogQ29kZU1pcnJvci5zdGFydFN0YXRlKG91dGVyKSwKICAgICAgICBpbm5lckFjdGl2ZTogbnVsbCwKICAgICAgICBpbm5lcjogbnVsbAogICAgICB9OwogICAgfSwKCiAgICBjb3B5U3RhdGU6IGZ1bmN0aW9uKHN0YXRlKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgb3V0ZXI6IENvZGVNaXJyb3IuY29weVN0YXRlKG91dGVyLCBzdGF0ZS5vdXRlciksCiAgICAgICAgaW5uZXJBY3RpdmU6IHN0YXRlLmlubmVyQWN0aXZlLAogICAgICAgIGlubmVyOiBzdGF0ZS5pbm5lckFjdGl2ZSAmJiBDb2RlTWlycm9yLmNvcHlTdGF0ZShzdGF0ZS5pbm5lckFjdGl2ZS5tb2RlLCBzdGF0ZS5pbm5lcikKICAgICAgfTsKICAgIH0sCgogICAgdG9rZW46IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgaWYgKCFzdGF0ZS5pbm5lckFjdGl2ZSkgewogICAgICAgIHZhciBjdXRPZmYgPSBJbmZpbml0eSwgb2xkQ29udGVudCA9IHN0cmVhbS5zdHJpbmc7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvdGhlcnMubGVuZ3RoOyArK2kpIHsKICAgICAgICAgIHZhciBvdGhlciA9IG90aGVyc1tpXTsKICAgICAgICAgIHZhciBmb3VuZCA9IGluZGV4T2Yob2xkQ29udGVudCwgb3RoZXIub3Blbiwgc3RyZWFtLnBvcyk7CiAgICAgICAgICBpZiAoZm91bmQgPT0gc3RyZWFtLnBvcykgewogICAgICAgICAgICBpZiAoIW90aGVyLnBhcnNlRGVsaW1pdGVycykgc3RyZWFtLm1hdGNoKG90aGVyLm9wZW4pOwogICAgICAgICAgICBzdGF0ZS5pbm5lckFjdGl2ZSA9IG90aGVyOwogICAgICAgICAgICBzdGF0ZS5pbm5lciA9IENvZGVNaXJyb3Iuc3RhcnRTdGF0ZShvdGhlci5tb2RlLCBvdXRlci5pbmRlbnQgPyBvdXRlci5pbmRlbnQoc3RhdGUub3V0ZXIsICIiKSA6IDApOwogICAgICAgICAgICByZXR1cm4gb3RoZXIuZGVsaW1TdHlsZSAmJiAob3RoZXIuZGVsaW1TdHlsZSArICIgIiArIG90aGVyLmRlbGltU3R5bGUgKyAiLW9wZW4iKTsKICAgICAgICAgIH0gZWxzZSBpZiAoZm91bmQgIT0gLTEgJiYgZm91bmQgPCBjdXRPZmYpIHsKICAgICAgICAgICAgY3V0T2ZmID0gZm91bmQ7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChjdXRPZmYgIT0gSW5maW5pdHkpIHN0cmVhbS5zdHJpbmcgPSBvbGRDb250ZW50LnNsaWNlKDAsIGN1dE9mZik7CiAgICAgICAgdmFyIG91dGVyVG9rZW4gPSBvdXRlci50b2tlbihzdHJlYW0sIHN0YXRlLm91dGVyKTsKICAgICAgICBpZiAoY3V0T2ZmICE9IEluZmluaXR5KSBzdHJlYW0uc3RyaW5nID0gb2xkQ29udGVudDsKICAgICAgICByZXR1cm4gb3V0ZXJUb2tlbjsKICAgICAgfSBlbHNlIHsKICAgICAgICB2YXIgY3VySW5uZXIgPSBzdGF0ZS5pbm5lckFjdGl2ZSwgb2xkQ29udGVudCA9IHN0cmVhbS5zdHJpbmc7CiAgICAgICAgaWYgKCFjdXJJbm5lci5jbG9zZSAmJiBzdHJlYW0uc29sKCkpIHsKICAgICAgICAgIHN0YXRlLmlubmVyQWN0aXZlID0gc3RhdGUuaW5uZXIgPSBudWxsOwogICAgICAgICAgcmV0dXJuIHRoaXMudG9rZW4oc3RyZWFtLCBzdGF0ZSk7CiAgICAgICAgfQogICAgICAgIHZhciBmb3VuZCA9IGN1cklubmVyLmNsb3NlID8gaW5kZXhPZihvbGRDb250ZW50LCBjdXJJbm5lci5jbG9zZSwgc3RyZWFtLnBvcywgY3VySW5uZXIucGFyc2VEZWxpbWl0ZXJzKSA6IC0xOwogICAgICAgIGlmIChmb3VuZCA9PSBzdHJlYW0ucG9zICYmICFjdXJJbm5lci5wYXJzZURlbGltaXRlcnMpIHsKICAgICAgICAgIHN0cmVhbS5tYXRjaChjdXJJbm5lci5jbG9zZSk7CiAgICAgICAgICBzdGF0ZS5pbm5lckFjdGl2ZSA9IHN0YXRlLmlubmVyID0gbnVsbDsKICAgICAgICAgIHJldHVybiBjdXJJbm5lci5kZWxpbVN0eWxlICYmIChjdXJJbm5lci5kZWxpbVN0eWxlICsgIiAiICsgY3VySW5uZXIuZGVsaW1TdHlsZSArICItY2xvc2UiKTsKICAgICAgICB9CiAgICAgICAgaWYgKGZvdW5kID4gLTEpIHN0cmVhbS5zdHJpbmcgPSBvbGRDb250ZW50LnNsaWNlKDAsIGZvdW5kKTsKICAgICAgICB2YXIgaW5uZXJUb2tlbiA9IGN1cklubmVyLm1vZGUudG9rZW4oc3RyZWFtLCBzdGF0ZS5pbm5lcik7CiAgICAgICAgaWYgKGZvdW5kID4gLTEpIHN0cmVhbS5zdHJpbmcgPSBvbGRDb250ZW50OwoKICAgICAgICBpZiAoZm91bmQgPT0gc3RyZWFtLnBvcyAmJiBjdXJJbm5lci5wYXJzZURlbGltaXRlcnMpCiAgICAgICAgICBzdGF0ZS5pbm5lckFjdGl2ZSA9IHN0YXRlLmlubmVyID0gbnVsbDsKCiAgICAgICAgaWYgKGN1cklubmVyLmlubmVyU3R5bGUpIHsKICAgICAgICAgIGlmIChpbm5lclRva2VuKSBpbm5lclRva2VuID0gaW5uZXJUb2tlbiArICIgIiArIGN1cklubmVyLmlubmVyU3R5bGU7CiAgICAgICAgICBlbHNlIGlubmVyVG9rZW4gPSBjdXJJbm5lci5pbm5lclN0eWxlOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGlubmVyVG9rZW47CiAgICAgIH0KICAgIH0sCgogICAgaW5kZW50OiBmdW5jdGlvbihzdGF0ZSwgdGV4dEFmdGVyKSB7CiAgICAgIHZhciBtb2RlID0gc3RhdGUuaW5uZXJBY3RpdmUgPyBzdGF0ZS5pbm5lckFjdGl2ZS5tb2RlIDogb3V0ZXI7CiAgICAgIGlmICghbW9kZS5pbmRlbnQpIHJldHVybiBDb2RlTWlycm9yLlBhc3M7CiAgICAgIHJldHVybiBtb2RlLmluZGVudChzdGF0ZS5pbm5lckFjdGl2ZSA/IHN0YXRlLmlubmVyIDogc3RhdGUub3V0ZXIsIHRleHRBZnRlcik7CiAgICB9LAoKICAgIGJsYW5rTGluZTogZnVuY3Rpb24oc3RhdGUpIHsKICAgICAgdmFyIG1vZGUgPSBzdGF0ZS5pbm5lckFjdGl2ZSA/IHN0YXRlLmlubmVyQWN0aXZlLm1vZGUgOiBvdXRlcjsKICAgICAgaWYgKG1vZGUuYmxhbmtMaW5lKSB7CiAgICAgICAgbW9kZS5ibGFua0xpbmUoc3RhdGUuaW5uZXJBY3RpdmUgPyBzdGF0ZS5pbm5lciA6IHN0YXRlLm91dGVyKTsKICAgICAgfQogICAgICBpZiAoIXN0YXRlLmlubmVyQWN0aXZlKSB7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvdGhlcnMubGVuZ3RoOyArK2kpIHsKICAgICAgICAgIHZhciBvdGhlciA9IG90aGVyc1tpXTsKICAgICAgICAgIGlmIChvdGhlci5vcGVuID09PSAiXG4iKSB7CiAgICAgICAgICAgIHN0YXRlLmlubmVyQWN0aXZlID0gb3RoZXI7CiAgICAgICAgICAgIHN0YXRlLmlubmVyID0gQ29kZU1pcnJvci5zdGFydFN0YXRlKG90aGVyLm1vZGUsIG1vZGUuaW5kZW50ID8gbW9kZS5pbmRlbnQoc3RhdGUub3V0ZXIsICIiKSA6IDApOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChzdGF0ZS5pbm5lckFjdGl2ZS5jbG9zZSA9PT0gIlxuIikgewogICAgICAgIHN0YXRlLmlubmVyQWN0aXZlID0gc3RhdGUuaW5uZXIgPSBudWxsOwogICAgICB9CiAgICB9LAoKICAgIGVsZWN0cmljQ2hhcnM6IG91dGVyLmVsZWN0cmljQ2hhcnMsCgogICAgaW5uZXJNb2RlOiBmdW5jdGlvbihzdGF0ZSkgewogICAgICByZXR1cm4gc3RhdGUuaW5uZXIgPyB7c3RhdGU6IHN0YXRlLmlubmVyLCBtb2RlOiBzdGF0ZS5pbm5lckFjdGl2ZS5tb2RlfSA6IHtzdGF0ZTogc3RhdGUub3V0ZXIsIG1vZGU6IG91dGVyfTsKICAgIH0KICB9Owp9OwoKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/mode/multiplex_test.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24oKSB7CiAgQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJtYXJrZG93bl93aXRoX3N0ZXgiLCBmdW5jdGlvbigpewogICAgdmFyIGlubmVyID0gQ29kZU1pcnJvci5nZXRNb2RlKHt9LCAic3RleCIpOwogICAgdmFyIG91dGVyID0gQ29kZU1pcnJvci5nZXRNb2RlKHt9LCAibWFya2Rvd24iKTsKCiAgICB2YXIgaW5uZXJPcHRpb25zID0gewogICAgICBvcGVuOiAnJCcsCiAgICAgIGNsb3NlOiAnJCcsCiAgICAgIG1vZGU6IGlubmVyLAogICAgICBkZWxpbVN0eWxlOiAnZGVsaW0nLAogICAgICBpbm5lclN0eWxlOiAnaW5uZXInCiAgICB9OwoKICAgIHJldHVybiBDb2RlTWlycm9yLm11bHRpcGxleGluZ01vZGUob3V0ZXIsIGlubmVyT3B0aW9ucyk7CiAgfSk7CgogIHZhciBtb2RlID0gQ29kZU1pcnJvci5nZXRNb2RlKHt9LCAibWFya2Rvd25fd2l0aF9zdGV4Iik7CgogIGZ1bmN0aW9uIE1UKG5hbWUpIHsKICAgIHRlc3QubW9kZSgKICAgICAgbmFtZSwKICAgICAgbW9kZSwKICAgICAgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSwKICAgICAgJ211bHRpcGxleGluZycpOwogIH0KCiAgTVQoCiAgICAic3RleEluc2lkZU1hcmtkb3duIiwKICAgICJbc3Ryb25nICoqRXF1YXRpb246KipdIFtkZWxpbSZkZWxpbS1vcGVuICRdW2lubmVyJnRhZyBcXHBpXVtkZWxpbSZkZWxpbS1jbG9zZSAkXSIpOwp9KSgpOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/mode/overlay.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovLyBVdGlsaXR5IGZ1bmN0aW9uIHRoYXQgYWxsb3dzIG1vZGVzIHRvIGJlIGNvbWJpbmVkLiBUaGUgbW9kZSBnaXZlbgovLyBhcyB0aGUgYmFzZSBhcmd1bWVudCB0YWtlcyBjYXJlIG9mIG1vc3Qgb2YgdGhlIG5vcm1hbCBtb2RlCi8vIGZ1bmN0aW9uYWxpdHksIGJ1dCBhIHNlY29uZCAodHlwaWNhbGx5IHNpbXBsZSkgbW9kZSBpcyB1c2VkLCB3aGljaAovLyBjYW4gb3ZlcnJpZGUgdGhlIHN0eWxlIG9mIHRleHQuIEJvdGggbW9kZXMgZ2V0IHRvIHBhcnNlIGFsbCBvZiB0aGUKLy8gdGV4dCwgYnV0IHdoZW4gYm90aCBhc3NpZ24gYSBub24tbnVsbCBzdHlsZSB0byBhIHBpZWNlIG9mIGNvZGUsIHRoZQovLyBvdmVybGF5IHdpbnMsIHVubGVzcyB0aGUgY29tYmluZSBhcmd1bWVudCB3YXMgdHJ1ZSBhbmQgbm90IG92ZXJyaWRkZW4sCi8vIG9yIHN0YXRlLm92ZXJsYXkuY29tYmluZVRva2VucyB3YXMgdHJ1ZSwgaW4gd2hpY2ggY2FzZSB0aGUgc3R5bGVzIGFyZQovLyBjb21iaW5lZC4KCihmdW5jdGlvbihtb2QpIHsKICBpZiAodHlwZW9mIGV4cG9ydHMgPT0gIm9iamVjdCIgJiYgdHlwZW9mIG1vZHVsZSA9PSAib2JqZWN0IikgLy8gQ29tbW9uSlMKICAgIG1vZChyZXF1aXJlKCIuLi8uLi9saWIvY29kZW1pcnJvciIpKTsKICBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCkgLy8gQU1ECiAgICBkZWZpbmUoWyIuLi8uLi9saWIvY29kZW1pcnJvciJdLCBtb2QpOwogIGVsc2UgLy8gUGxhaW4gYnJvd3NlciBlbnYKICAgIG1vZChDb2RlTWlycm9yKTsKfSkoZnVuY3Rpb24oQ29kZU1pcnJvcikgewoidXNlIHN0cmljdCI7CgpDb2RlTWlycm9yLm92ZXJsYXlNb2RlID0gZnVuY3Rpb24oYmFzZSwgb3ZlcmxheSwgY29tYmluZSkgewogIHJldHVybiB7CiAgICBzdGFydFN0YXRlOiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBiYXNlOiBDb2RlTWlycm9yLnN0YXJ0U3RhdGUoYmFzZSksCiAgICAgICAgb3ZlcmxheTogQ29kZU1pcnJvci5zdGFydFN0YXRlKG92ZXJsYXkpLAogICAgICAgIGJhc2VQb3M6IDAsIGJhc2VDdXI6IG51bGwsCiAgICAgICAgb3ZlcmxheVBvczogMCwgb3ZlcmxheUN1cjogbnVsbCwKICAgICAgICBzdHJlYW1TZWVuOiBudWxsCiAgICAgIH07CiAgICB9LAogICAgY29weVN0YXRlOiBmdW5jdGlvbihzdGF0ZSkgewogICAgICByZXR1cm4gewogICAgICAgIGJhc2U6IENvZGVNaXJyb3IuY29weVN0YXRlKGJhc2UsIHN0YXRlLmJhc2UpLAogICAgICAgIG92ZXJsYXk6IENvZGVNaXJyb3IuY29weVN0YXRlKG92ZXJsYXksIHN0YXRlLm92ZXJsYXkpLAogICAgICAgIGJhc2VQb3M6IHN0YXRlLmJhc2VQb3MsIGJhc2VDdXI6IG51bGwsCiAgICAgICAgb3ZlcmxheVBvczogc3RhdGUub3ZlcmxheVBvcywgb3ZlcmxheUN1cjogbnVsbAogICAgICB9OwogICAgfSwKCiAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICBpZiAoc3RyZWFtICE9IHN0YXRlLnN0cmVhbVNlZW4gfHwKICAgICAgICAgIE1hdGgubWluKHN0YXRlLmJhc2VQb3MsIHN0YXRlLm92ZXJsYXlQb3MpIDwgc3RyZWFtLnN0YXJ0KSB7CiAgICAgICAgc3RhdGUuc3RyZWFtU2VlbiA9IHN0cmVhbTsKICAgICAgICBzdGF0ZS5iYXNlUG9zID0gc3RhdGUub3ZlcmxheVBvcyA9IHN0cmVhbS5zdGFydDsKICAgICAgfQoKICAgICAgaWYgKHN0cmVhbS5zdGFydCA9PSBzdGF0ZS5iYXNlUG9zKSB7CiAgICAgICAgc3RhdGUuYmFzZUN1ciA9IGJhc2UudG9rZW4oc3RyZWFtLCBzdGF0ZS5iYXNlKTsKICAgICAgICBzdGF0ZS5iYXNlUG9zID0gc3RyZWFtLnBvczsKICAgICAgfQogICAgICBpZiAoc3RyZWFtLnN0YXJ0ID09IHN0YXRlLm92ZXJsYXlQb3MpIHsKICAgICAgICBzdHJlYW0ucG9zID0gc3RyZWFtLnN0YXJ0OwogICAgICAgIHN0YXRlLm92ZXJsYXlDdXIgPSBvdmVybGF5LnRva2VuKHN0cmVhbSwgc3RhdGUub3ZlcmxheSk7CiAgICAgICAgc3RhdGUub3ZlcmxheVBvcyA9IHN0cmVhbS5wb3M7CiAgICAgIH0KICAgICAgc3RyZWFtLnBvcyA9IE1hdGgubWluKHN0YXRlLmJhc2VQb3MsIHN0YXRlLm92ZXJsYXlQb3MpOwoKICAgICAgLy8gc3RhdGUub3ZlcmxheS5jb21iaW5lVG9rZW5zIGFsd2F5cyB0YWtlcyBwcmVjZWRlbmNlIG92ZXIgY29tYmluZSwKICAgICAgLy8gdW5sZXNzIHNldCB0byBudWxsCiAgICAgIGlmIChzdGF0ZS5vdmVybGF5Q3VyID09IG51bGwpIHJldHVybiBzdGF0ZS5iYXNlQ3VyOwogICAgICBlbHNlIGlmIChzdGF0ZS5iYXNlQ3VyICE9IG51bGwgJiYKICAgICAgICAgICAgICAgc3RhdGUub3ZlcmxheS5jb21iaW5lVG9rZW5zIHx8CiAgICAgICAgICAgICAgIGNvbWJpbmUgJiYgc3RhdGUub3ZlcmxheS5jb21iaW5lVG9rZW5zID09IG51bGwpCiAgICAgICAgcmV0dXJuIHN0YXRlLmJhc2VDdXIgKyAiICIgKyBzdGF0ZS5vdmVybGF5Q3VyOwogICAgICBlbHNlIHJldHVybiBzdGF0ZS5vdmVybGF5Q3VyOwogICAgfSwKCiAgICBpbmRlbnQ6IGJhc2UuaW5kZW50ICYmIGZ1bmN0aW9uKHN0YXRlLCB0ZXh0QWZ0ZXIpIHsKICAgICAgcmV0dXJuIGJhc2UuaW5kZW50KHN0YXRlLmJhc2UsIHRleHRBZnRlcik7CiAgICB9LAogICAgZWxlY3RyaWNDaGFyczogYmFzZS5lbGVjdHJpY0NoYXJzLAoKICAgIGlubmVyTW9kZTogZnVuY3Rpb24oc3RhdGUpIHsgcmV0dXJuIHtzdGF0ZTogc3RhdGUuYmFzZSwgbW9kZTogYmFzZX07IH0sCgogICAgYmxhbmtMaW5lOiBmdW5jdGlvbihzdGF0ZSkgewogICAgICBpZiAoYmFzZS5ibGFua0xpbmUpIGJhc2UuYmxhbmtMaW5lKHN0YXRlLmJhc2UpOwogICAgICBpZiAob3ZlcmxheS5ibGFua0xpbmUpIG92ZXJsYXkuYmxhbmtMaW5lKHN0YXRlLm92ZXJsYXkpOwogICAgfQogIH07Cn07Cgp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/mode/simple.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CgogIENvZGVNaXJyb3IuZGVmaW5lU2ltcGxlTW9kZSA9IGZ1bmN0aW9uKG5hbWUsIHN0YXRlcykgewogICAgQ29kZU1pcnJvci5kZWZpbmVNb2RlKG5hbWUsIGZ1bmN0aW9uKGNvbmZpZykgewogICAgICByZXR1cm4gQ29kZU1pcnJvci5zaW1wbGVNb2RlKGNvbmZpZywgc3RhdGVzKTsKICAgIH0pOwogIH07CgogIENvZGVNaXJyb3Iuc2ltcGxlTW9kZSA9IGZ1bmN0aW9uKGNvbmZpZywgc3RhdGVzKSB7CiAgICBlbnN1cmVTdGF0ZShzdGF0ZXMsICJzdGFydCIpOwogICAgdmFyIHN0YXRlc18gPSB7fSwgbWV0YSA9IHN0YXRlcy5tZXRhIHx8IHt9LCBoYXNJbmRlbnRhdGlvbiA9IGZhbHNlOwogICAgZm9yICh2YXIgc3RhdGUgaW4gc3RhdGVzKSBpZiAoc3RhdGUgIT0gbWV0YSAmJiBzdGF0ZXMuaGFzT3duUHJvcGVydHkoc3RhdGUpKSB7CiAgICAgIHZhciBsaXN0ID0gc3RhdGVzX1tzdGF0ZV0gPSBbXSwgb3JpZyA9IHN0YXRlc1tzdGF0ZV07CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb3JpZy5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciBkYXRhID0gb3JpZ1tpXTsKICAgICAgICBsaXN0LnB1c2gobmV3IFJ1bGUoZGF0YSwgc3RhdGVzKSk7CiAgICAgICAgaWYgKGRhdGEuaW5kZW50IHx8IGRhdGEuZGVkZW50KSBoYXNJbmRlbnRhdGlvbiA9IHRydWU7CiAgICAgIH0KICAgIH0KICAgIHZhciBtb2RlID0gewogICAgICBzdGFydFN0YXRlOiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4ge3N0YXRlOiAic3RhcnQiLCBwZW5kaW5nOiBudWxsLAogICAgICAgICAgICAgICAgbG9jYWw6IG51bGwsIGxvY2FsU3RhdGU6IG51bGwsCiAgICAgICAgICAgICAgICBpbmRlbnQ6IGhhc0luZGVudGF0aW9uID8gW10gOiBudWxsfTsKICAgICAgfSwKICAgICAgY29weVN0YXRlOiBmdW5jdGlvbihzdGF0ZSkgewogICAgICAgIHZhciBzID0ge3N0YXRlOiBzdGF0ZS5zdGF0ZSwgcGVuZGluZzogc3RhdGUucGVuZGluZywKICAgICAgICAgICAgICAgICBsb2NhbDogc3RhdGUubG9jYWwsIGxvY2FsU3RhdGU6IG51bGwsCiAgICAgICAgICAgICAgICAgaW5kZW50OiBzdGF0ZS5pbmRlbnQgJiYgc3RhdGUuaW5kZW50LnNsaWNlKDApfTsKICAgICAgICBpZiAoc3RhdGUubG9jYWxTdGF0ZSkKICAgICAgICAgIHMubG9jYWxTdGF0ZSA9IENvZGVNaXJyb3IuY29weVN0YXRlKHN0YXRlLmxvY2FsLm1vZGUsIHN0YXRlLmxvY2FsU3RhdGUpOwogICAgICAgIGlmIChzdGF0ZS5zdGFjaykKICAgICAgICAgIHMuc3RhY2sgPSBzdGF0ZS5zdGFjay5zbGljZSgwKTsKICAgICAgICBmb3IgKHZhciBwZXJzID0gc3RhdGUucGVyc2lzdGVudFN0YXRlczsgcGVyczsgcGVycyA9IHBlcnMubmV4dCkKICAgICAgICAgIHMucGVyc2lzdGVudFN0YXRlcyA9IHttb2RlOiBwZXJzLm1vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlYzogcGVycy5zcGVjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlOiBwZXJzLnN0YXRlID09IHN0YXRlLmxvY2FsU3RhdGUgPyBzLmxvY2FsU3RhdGUgOiBDb2RlTWlycm9yLmNvcHlTdGF0ZShwZXJzLm1vZGUsIHBlcnMuc3RhdGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQ6IHMucGVyc2lzdGVudFN0YXRlc307CiAgICAgICAgcmV0dXJuIHM7CiAgICAgIH0sCiAgICAgIHRva2VuOiB0b2tlbkZ1bmN0aW9uKHN0YXRlc18sIGNvbmZpZyksCiAgICAgIGlubmVyTW9kZTogZnVuY3Rpb24oc3RhdGUpIHsgcmV0dXJuIHN0YXRlLmxvY2FsICYmIHttb2RlOiBzdGF0ZS5sb2NhbC5tb2RlLCBzdGF0ZTogc3RhdGUubG9jYWxTdGF0ZX07IH0sCiAgICAgIGluZGVudDogaW5kZW50RnVuY3Rpb24oc3RhdGVzXywgbWV0YSkKICAgIH07CiAgICBpZiAobWV0YSkgZm9yICh2YXIgcHJvcCBpbiBtZXRhKSBpZiAobWV0YS5oYXNPd25Qcm9wZXJ0eShwcm9wKSkKICAgICAgbW9kZVtwcm9wXSA9IG1ldGFbcHJvcF07CiAgICByZXR1cm4gbW9kZTsKICB9OwoKICBmdW5jdGlvbiBlbnN1cmVTdGF0ZShzdGF0ZXMsIG5hbWUpIHsKICAgIGlmICghc3RhdGVzLmhhc093blByb3BlcnR5KG5hbWUpKQogICAgICB0aHJvdyBuZXcgRXJyb3IoIlVuZGVmaW5lZCBzdGF0ZSAiICsgbmFtZSArICIgaW4gc2ltcGxlIG1vZGUiKTsKICB9CgogIGZ1bmN0aW9uIHRvUmVnZXgodmFsLCBjYXJldCkgewogICAgaWYgKCF2YWwpIHJldHVybiAvKD86KS87CiAgICB2YXIgZmxhZ3MgPSAiIjsKICAgIGlmICh2YWwgaW5zdGFuY2VvZiBSZWdFeHApIHsKICAgICAgaWYgKHZhbC5pZ25vcmVDYXNlKSBmbGFncyA9ICJpIjsKICAgICAgdmFsID0gdmFsLnNvdXJjZTsKICAgIH0gZWxzZSB7CiAgICAgIHZhbCA9IFN0cmluZyh2YWwpOwogICAgfQogICAgcmV0dXJuIG5ldyBSZWdFeHAoKGNhcmV0ID09PSBmYWxzZSA/ICIiIDogIl4iKSArICIoPzoiICsgdmFsICsgIikiLCBmbGFncyk7CiAgfQoKICBmdW5jdGlvbiBhc1Rva2VuKHZhbCkgewogICAgaWYgKCF2YWwpIHJldHVybiBudWxsOwogICAgaWYgKHR5cGVvZiB2YWwgPT0gInN0cmluZyIpIHJldHVybiB2YWwucmVwbGFjZSgvXC4vZywgIiAiKTsKICAgIHZhciByZXN1bHQgPSBbXTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsLmxlbmd0aDsgaSsrKQogICAgICByZXN1bHQucHVzaCh2YWxbaV0gJiYgdmFsW2ldLnJlcGxhY2UoL1wuL2csICIgIikpOwogICAgcmV0dXJuIHJlc3VsdDsKICB9CgogIGZ1bmN0aW9uIFJ1bGUoZGF0YSwgc3RhdGVzKSB7CiAgICBpZiAoZGF0YS5uZXh0IHx8IGRhdGEucHVzaCkgZW5zdXJlU3RhdGUoc3RhdGVzLCBkYXRhLm5leHQgfHwgZGF0YS5wdXNoKTsKICAgIHRoaXMucmVnZXggPSB0b1JlZ2V4KGRhdGEucmVnZXgpOwogICAgdGhpcy50b2tlbiA9IGFzVG9rZW4oZGF0YS50b2tlbik7CiAgICB0aGlzLmRhdGEgPSBkYXRhOwogIH0KCiAgZnVuY3Rpb24gdG9rZW5GdW5jdGlvbihzdGF0ZXMsIGNvbmZpZykgewogICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgaWYgKHN0YXRlLnBlbmRpbmcpIHsKICAgICAgICB2YXIgcGVuZCA9IHN0YXRlLnBlbmRpbmcuc2hpZnQoKTsKICAgICAgICBpZiAoc3RhdGUucGVuZGluZy5sZW5ndGggPT0gMCkgc3RhdGUucGVuZGluZyA9IG51bGw7CiAgICAgICAgc3RyZWFtLnBvcyArPSBwZW5kLnRleHQubGVuZ3RoOwogICAgICAgIHJldHVybiBwZW5kLnRva2VuOwogICAgICB9CgogICAgICBpZiAoc3RhdGUubG9jYWwpIHsKICAgICAgICBpZiAoc3RhdGUubG9jYWwuZW5kICYmIHN0cmVhbS5tYXRjaChzdGF0ZS5sb2NhbC5lbmQpKSB7CiAgICAgICAgICB2YXIgdG9rID0gc3RhdGUubG9jYWwuZW5kVG9rZW4gfHwgbnVsbDsKICAgICAgICAgIHN0YXRlLmxvY2FsID0gc3RhdGUubG9jYWxTdGF0ZSA9IG51bGw7CiAgICAgICAgICByZXR1cm4gdG9rOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB2YXIgdG9rID0gc3RhdGUubG9jYWwubW9kZS50b2tlbihzdHJlYW0sIHN0YXRlLmxvY2FsU3RhdGUpLCBtOwogICAgICAgICAgaWYgKHN0YXRlLmxvY2FsLmVuZFNjYW4gJiYgKG0gPSBzdGF0ZS5sb2NhbC5lbmRTY2FuLmV4ZWMoc3RyZWFtLmN1cnJlbnQoKSkpKQogICAgICAgICAgICBzdHJlYW0ucG9zID0gc3RyZWFtLnN0YXJ0ICsgbS5pbmRleDsKICAgICAgICAgIHJldHVybiB0b2s7CiAgICAgICAgfQogICAgICB9CgogICAgICB2YXIgY3VyU3RhdGUgPSBzdGF0ZXNbc3RhdGUuc3RhdGVdOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGN1clN0YXRlLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIHJ1bGUgPSBjdXJTdGF0ZVtpXTsKICAgICAgICB2YXIgbWF0Y2hlcyA9ICghcnVsZS5kYXRhLnNvbCB8fCBzdHJlYW0uc29sKCkpICYmIHN0cmVhbS5tYXRjaChydWxlLnJlZ2V4KTsKICAgICAgICBpZiAobWF0Y2hlcykgewogICAgICAgICAgaWYgKHJ1bGUuZGF0YS5uZXh0KSB7CiAgICAgICAgICAgIHN0YXRlLnN0YXRlID0gcnVsZS5kYXRhLm5leHQ7CiAgICAgICAgICB9IGVsc2UgaWYgKHJ1bGUuZGF0YS5wdXNoKSB7CiAgICAgICAgICAgIChzdGF0ZS5zdGFjayB8fCAoc3RhdGUuc3RhY2sgPSBbXSkpLnB1c2goc3RhdGUuc3RhdGUpOwogICAgICAgICAgICBzdGF0ZS5zdGF0ZSA9IHJ1bGUuZGF0YS5wdXNoOwogICAgICAgICAgfSBlbHNlIGlmIChydWxlLmRhdGEucG9wICYmIHN0YXRlLnN0YWNrICYmIHN0YXRlLnN0YWNrLmxlbmd0aCkgewogICAgICAgICAgICBzdGF0ZS5zdGF0ZSA9IHN0YXRlLnN0YWNrLnBvcCgpOwogICAgICAgICAgfQoKICAgICAgICAgIGlmIChydWxlLmRhdGEubW9kZSkKICAgICAgICAgICAgZW50ZXJMb2NhbE1vZGUoY29uZmlnLCBzdGF0ZSwgcnVsZS5kYXRhLm1vZGUsIHJ1bGUudG9rZW4pOwogICAgICAgICAgaWYgKHJ1bGUuZGF0YS5pbmRlbnQpCiAgICAgICAgICAgIHN0YXRlLmluZGVudC5wdXNoKHN0cmVhbS5pbmRlbnRhdGlvbigpICsgY29uZmlnLmluZGVudFVuaXQpOwogICAgICAgICAgaWYgKHJ1bGUuZGF0YS5kZWRlbnQpCiAgICAgICAgICAgIHN0YXRlLmluZGVudC5wb3AoKTsKICAgICAgICAgIGlmIChtYXRjaGVzLmxlbmd0aCA+IDIpIHsKICAgICAgICAgICAgc3RhdGUucGVuZGluZyA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciBqID0gMjsgaiA8IG1hdGNoZXMubGVuZ3RoOyBqKyspCiAgICAgICAgICAgICAgaWYgKG1hdGNoZXNbal0pCiAgICAgICAgICAgICAgICBzdGF0ZS5wZW5kaW5nLnB1c2goe3RleHQ6IG1hdGNoZXNbal0sIHRva2VuOiBydWxlLnRva2VuW2ogLSAxXX0pOwogICAgICAgICAgICBzdHJlYW0uYmFja1VwKG1hdGNoZXNbMF0ubGVuZ3RoIC0gKG1hdGNoZXNbMV0gPyBtYXRjaGVzWzFdLmxlbmd0aCA6IDApKTsKICAgICAgICAgICAgcmV0dXJuIHJ1bGUudG9rZW5bMF07CiAgICAgICAgICB9IGVsc2UgaWYgKHJ1bGUudG9rZW4gJiYgcnVsZS50b2tlbi5qb2luKSB7CiAgICAgICAgICAgIHJldHVybiBydWxlLnRva2VuWzBdOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIHJ1bGUudG9rZW47CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgIHJldHVybiBudWxsOwogICAgfTsKICB9CgogIGZ1bmN0aW9uIGNtcChhLCBiKSB7CiAgICBpZiAoYSA9PT0gYikgcmV0dXJuIHRydWU7CiAgICBpZiAoIWEgfHwgdHlwZW9mIGEgIT0gIm9iamVjdCIgfHwgIWIgfHwgdHlwZW9mIGIgIT0gIm9iamVjdCIpIHJldHVybiBmYWxzZTsKICAgIHZhciBwcm9wcyA9IDA7CiAgICBmb3IgKHZhciBwcm9wIGluIGEpIGlmIChhLmhhc093blByb3BlcnR5KHByb3ApKSB7CiAgICAgIGlmICghYi5oYXNPd25Qcm9wZXJ0eShwcm9wKSB8fCAhY21wKGFbcHJvcF0sIGJbcHJvcF0pKSByZXR1cm4gZmFsc2U7CiAgICAgIHByb3BzKys7CiAgICB9CiAgICBmb3IgKHZhciBwcm9wIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHByb3ApKSBwcm9wcy0tOwogICAgcmV0dXJuIHByb3BzID09IDA7CiAgfQoKICBmdW5jdGlvbiBlbnRlckxvY2FsTW9kZShjb25maWcsIHN0YXRlLCBzcGVjLCB0b2tlbikgewogICAgdmFyIHBlcnM7CiAgICBpZiAoc3BlYy5wZXJzaXN0ZW50KSBmb3IgKHZhciBwID0gc3RhdGUucGVyc2lzdGVudFN0YXRlczsgcCAmJiAhcGVyczsgcCA9IHAubmV4dCkKICAgICAgaWYgKHNwZWMuc3BlYyA/IGNtcChzcGVjLnNwZWMsIHAuc3BlYykgOiBzcGVjLm1vZGUgPT0gcC5tb2RlKSBwZXJzID0gcDsKICAgIHZhciBtb2RlID0gcGVycyA/IHBlcnMubW9kZSA6IHNwZWMubW9kZSB8fCBDb2RlTWlycm9yLmdldE1vZGUoY29uZmlnLCBzcGVjLnNwZWMpOwogICAgdmFyIGxTdGF0ZSA9IHBlcnMgPyBwZXJzLnN0YXRlIDogQ29kZU1pcnJvci5zdGFydFN0YXRlKG1vZGUpOwogICAgaWYgKHNwZWMucGVyc2lzdGVudCAmJiAhcGVycykKICAgICAgc3RhdGUucGVyc2lzdGVudFN0YXRlcyA9IHttb2RlOiBtb2RlLCBzcGVjOiBzcGVjLnNwZWMsIHN0YXRlOiBsU3RhdGUsIG5leHQ6IHN0YXRlLnBlcnNpc3RlbnRTdGF0ZXN9OwoKICAgIHN0YXRlLmxvY2FsU3RhdGUgPSBsU3RhdGU7CiAgICBzdGF0ZS5sb2NhbCA9IHttb2RlOiBtb2RlLAogICAgICAgICAgICAgICAgICAgZW5kOiBzcGVjLmVuZCAmJiB0b1JlZ2V4KHNwZWMuZW5kKSwKICAgICAgICAgICAgICAgICAgIGVuZFNjYW46IHNwZWMuZW5kICYmIHNwZWMuZm9yY2VFbmQgIT09IGZhbHNlICYmIHRvUmVnZXgoc3BlYy5lbmQsIGZhbHNlKSwKICAgICAgICAgICAgICAgICAgIGVuZFRva2VuOiB0b2tlbiAmJiB0b2tlbi5qb2luID8gdG9rZW5bdG9rZW4ubGVuZ3RoIC0gMV0gOiB0b2tlbn07CiAgfQoKICBmdW5jdGlvbiBpbmRleE9mKHZhbCwgYXJyKSB7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykgaWYgKGFycltpXSA9PT0gdmFsKSByZXR1cm4gdHJ1ZTsKICB9CgogIGZ1bmN0aW9uIGluZGVudEZ1bmN0aW9uKHN0YXRlcywgbWV0YSkgewogICAgcmV0dXJuIGZ1bmN0aW9uKHN0YXRlLCB0ZXh0QWZ0ZXIsIGxpbmUpIHsKICAgICAgaWYgKHN0YXRlLmxvY2FsICYmIHN0YXRlLmxvY2FsLm1vZGUuaW5kZW50KQogICAgICAgIHJldHVybiBzdGF0ZS5sb2NhbC5tb2RlLmluZGVudChzdGF0ZS5sb2NhbFN0YXRlLCB0ZXh0QWZ0ZXIsIGxpbmUpOwogICAgICBpZiAoc3RhdGUuaW5kZW50ID09IG51bGwgfHwgc3RhdGUubG9jYWwgfHwgbWV0YS5kb250SW5kZW50U3RhdGVzICYmIGluZGV4T2Yoc3RhdGUuc3RhdGUsIG1ldGEuZG9udEluZGVudFN0YXRlcykgPiAtMSkKICAgICAgICByZXR1cm4gQ29kZU1pcnJvci5QYXNzOwoKICAgICAgdmFyIHBvcyA9IHN0YXRlLmluZGVudC5sZW5ndGggLSAxLCBydWxlcyA9IHN0YXRlc1tzdGF0ZS5zdGF0ZV07CiAgICAgIHNjYW46IGZvciAoOzspIHsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJ1bGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB2YXIgcnVsZSA9IHJ1bGVzW2ldOwogICAgICAgICAgaWYgKHJ1bGUuZGF0YS5kZWRlbnQgJiYgcnVsZS5kYXRhLmRlZGVudElmTGluZVN0YXJ0ICE9PSBmYWxzZSkgewogICAgICAgICAgICB2YXIgbSA9IHJ1bGUucmVnZXguZXhlYyh0ZXh0QWZ0ZXIpOwogICAgICAgICAgICBpZiAobSAmJiBtWzBdKSB7CiAgICAgICAgICAgICAgcG9zLS07CiAgICAgICAgICAgICAgaWYgKHJ1bGUubmV4dCB8fCBydWxlLnB1c2gpIHJ1bGVzID0gc3RhdGVzW3J1bGUubmV4dCB8fCBydWxlLnB1c2hdOwogICAgICAgICAgICAgIHRleHRBZnRlciA9IHRleHRBZnRlci5zbGljZShtWzBdLmxlbmd0aCk7CiAgICAgICAgICAgICAgY29udGludWUgc2NhbjsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgfQogICAgICByZXR1cm4gcG9zIDwgMCA/IDAgOiBzdGF0ZS5pbmRlbnRbcG9zXTsKICAgIH07CiAgfQp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/runmode/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/runmode/colorize.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSwgcmVxdWlyZSgiLi9ydW5tb2RlIikpOwogIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kKSAvLyBBTUQKICAgIGRlZmluZShbIi4uLy4uL2xpYi9jb2RlbWlycm9yIiwgIi4vcnVubW9kZSJdLCBtb2QpOwogIGVsc2UgLy8gUGxhaW4gYnJvd3NlciBlbnYKICAgIG1vZChDb2RlTWlycm9yKTsKfSkoZnVuY3Rpb24oQ29kZU1pcnJvcikgewogICJ1c2Ugc3RyaWN0IjsKCiAgdmFyIGlzQmxvY2sgPSAvXihwfGxpfGRpdnxoXFxkfHByZXxibG9ja3F1b3RlfHRkKSQvOwoKICBmdW5jdGlvbiB0ZXh0Q29udGVudChub2RlLCBvdXQpIHsKICAgIGlmIChub2RlLm5vZGVUeXBlID09IDMpIHJldHVybiBvdXQucHVzaChub2RlLm5vZGVWYWx1ZSk7CiAgICBmb3IgKHZhciBjaCA9IG5vZGUuZmlyc3RDaGlsZDsgY2g7IGNoID0gY2gubmV4dFNpYmxpbmcpIHsKICAgICAgdGV4dENvbnRlbnQoY2gsIG91dCk7CiAgICAgIGlmIChpc0Jsb2NrLnRlc3Qobm9kZS5ub2RlVHlwZSkpIG91dC5wdXNoKCJcbiIpOwogICAgfQogIH0KCiAgQ29kZU1pcnJvci5jb2xvcml6ZSA9IGZ1bmN0aW9uKGNvbGxlY3Rpb24sIGRlZmF1bHRNb2RlKSB7CiAgICBpZiAoIWNvbGxlY3Rpb24pIGNvbGxlY3Rpb24gPSBkb2N1bWVudC5ib2R5LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJwcmUiKTsKCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvbGxlY3Rpb24ubGVuZ3RoOyArK2kpIHsKICAgICAgdmFyIG5vZGUgPSBjb2xsZWN0aW9uW2ldOwogICAgICB2YXIgbW9kZSA9IG5vZGUuZ2V0QXR0cmlidXRlKCJkYXRhLWxhbmciKSB8fCBkZWZhdWx0TW9kZTsKICAgICAgaWYgKCFtb2RlKSBjb250aW51ZTsKCiAgICAgIHZhciB0ZXh0ID0gW107CiAgICAgIHRleHRDb250ZW50KG5vZGUsIHRleHQpOwogICAgICBub2RlLmlubmVySFRNTCA9ICIiOwogICAgICBDb2RlTWlycm9yLnJ1bk1vZGUodGV4dC5qb2luKCIiKSwgbW9kZSwgbm9kZSk7CgogICAgICBub2RlLmNsYXNzTmFtZSArPSAiIGNtLXMtZGVmYXVsdCI7CiAgICB9CiAgfTsKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/runmode/runmode-standalone.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgp3aW5kb3cuQ29kZU1pcnJvciA9IHt9OwoKKGZ1bmN0aW9uKCkgewoidXNlIHN0cmljdCI7CgpmdW5jdGlvbiBzcGxpdExpbmVzKHN0cmluZyl7IHJldHVybiBzdHJpbmcuc3BsaXQoL1xyP1xufFxyLyk7IH07CgpmdW5jdGlvbiBTdHJpbmdTdHJlYW0oc3RyaW5nKSB7CiAgdGhpcy5wb3MgPSB0aGlzLnN0YXJ0ID0gMDsKICB0aGlzLnN0cmluZyA9IHN0cmluZzsKICB0aGlzLmxpbmVTdGFydCA9IDA7Cn0KU3RyaW5nU3RyZWFtLnByb3RvdHlwZSA9IHsKICBlb2w6IGZ1bmN0aW9uKCkge3JldHVybiB0aGlzLnBvcyA+PSB0aGlzLnN0cmluZy5sZW5ndGg7fSwKICBzb2w6IGZ1bmN0aW9uKCkge3JldHVybiB0aGlzLnBvcyA9PSAwO30sCiAgcGVlazogZnVuY3Rpb24oKSB7cmV0dXJuIHRoaXMuc3RyaW5nLmNoYXJBdCh0aGlzLnBvcykgfHwgbnVsbDt9LAogIG5leHQ6IGZ1bmN0aW9uKCkgewogICAgaWYgKHRoaXMucG9zIDwgdGhpcy5zdHJpbmcubGVuZ3RoKQogICAgICByZXR1cm4gdGhpcy5zdHJpbmcuY2hhckF0KHRoaXMucG9zKyspOwogIH0sCiAgZWF0OiBmdW5jdGlvbihtYXRjaCkgewogICAgdmFyIGNoID0gdGhpcy5zdHJpbmcuY2hhckF0KHRoaXMucG9zKTsKICAgIGlmICh0eXBlb2YgbWF0Y2ggPT0gInN0cmluZyIpIHZhciBvayA9IGNoID09IG1hdGNoOwogICAgZWxzZSB2YXIgb2sgPSBjaCAmJiAobWF0Y2gudGVzdCA/IG1hdGNoLnRlc3QoY2gpIDogbWF0Y2goY2gpKTsKICAgIGlmIChvaykgeysrdGhpcy5wb3M7IHJldHVybiBjaDt9CiAgfSwKICBlYXRXaGlsZTogZnVuY3Rpb24obWF0Y2gpIHsKICAgIHZhciBzdGFydCA9IHRoaXMucG9zOwogICAgd2hpbGUgKHRoaXMuZWF0KG1hdGNoKSl7fQogICAgcmV0dXJuIHRoaXMucG9zID4gc3RhcnQ7CiAgfSwKICBlYXRTcGFjZTogZnVuY3Rpb24oKSB7CiAgICB2YXIgc3RhcnQgPSB0aGlzLnBvczsKICAgIHdoaWxlICgvW1xzXHUwMGEwXS8udGVzdCh0aGlzLnN0cmluZy5jaGFyQXQodGhpcy5wb3MpKSkgKyt0aGlzLnBvczsKICAgIHJldHVybiB0aGlzLnBvcyA+IHN0YXJ0OwogIH0sCiAgc2tpcFRvRW5kOiBmdW5jdGlvbigpIHt0aGlzLnBvcyA9IHRoaXMuc3RyaW5nLmxlbmd0aDt9LAogIHNraXBUbzogZnVuY3Rpb24oY2gpIHsKICAgIHZhciBmb3VuZCA9IHRoaXMuc3RyaW5nLmluZGV4T2YoY2gsIHRoaXMucG9zKTsKICAgIGlmIChmb3VuZCA+IC0xKSB7dGhpcy5wb3MgPSBmb3VuZDsgcmV0dXJuIHRydWU7fQogIH0sCiAgYmFja1VwOiBmdW5jdGlvbihuKSB7dGhpcy5wb3MgLT0gbjt9LAogIGNvbHVtbjogZnVuY3Rpb24oKSB7cmV0dXJuIHRoaXMuc3RhcnQgLSB0aGlzLmxpbmVTdGFydDt9LAogIGluZGVudGF0aW9uOiBmdW5jdGlvbigpIHtyZXR1cm4gMDt9LAogIG1hdGNoOiBmdW5jdGlvbihwYXR0ZXJuLCBjb25zdW1lLCBjYXNlSW5zZW5zaXRpdmUpIHsKICAgIGlmICh0eXBlb2YgcGF0dGVybiA9PSAic3RyaW5nIikgewogICAgICB2YXIgY2FzZWQgPSBmdW5jdGlvbihzdHIpIHtyZXR1cm4gY2FzZUluc2Vuc2l0aXZlID8gc3RyLnRvTG93ZXJDYXNlKCkgOiBzdHI7fTsKICAgICAgdmFyIHN1YnN0ciA9IHRoaXMuc3RyaW5nLnN1YnN0cih0aGlzLnBvcywgcGF0dGVybi5sZW5ndGgpOwogICAgICBpZiAoY2FzZWQoc3Vic3RyKSA9PSBjYXNlZChwYXR0ZXJuKSkgewogICAgICAgIGlmIChjb25zdW1lICE9PSBmYWxzZSkgdGhpcy5wb3MgKz0gcGF0dGVybi5sZW5ndGg7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHZhciBtYXRjaCA9IHRoaXMuc3RyaW5nLnNsaWNlKHRoaXMucG9zKS5tYXRjaChwYXR0ZXJuKTsKICAgICAgaWYgKG1hdGNoICYmIG1hdGNoLmluZGV4ID4gMCkgcmV0dXJuIG51bGw7CiAgICAgIGlmIChtYXRjaCAmJiBjb25zdW1lICE9PSBmYWxzZSkgdGhpcy5wb3MgKz0gbWF0Y2hbMF0ubGVuZ3RoOwogICAgICByZXR1cm4gbWF0Y2g7CiAgICB9CiAgfSwKICBjdXJyZW50OiBmdW5jdGlvbigpe3JldHVybiB0aGlzLnN0cmluZy5zbGljZSh0aGlzLnN0YXJ0LCB0aGlzLnBvcyk7fSwKICBoaWRlRmlyc3RDaGFyczogZnVuY3Rpb24obiwgaW5uZXIpIHsKICAgIHRoaXMubGluZVN0YXJ0ICs9IG47CiAgICB0cnkgeyByZXR1cm4gaW5uZXIoKTsgfQogICAgZmluYWxseSB7IHRoaXMubGluZVN0YXJ0IC09IG47IH0KICB9Cn07CkNvZGVNaXJyb3IuU3RyaW5nU3RyZWFtID0gU3RyaW5nU3RyZWFtOwoKQ29kZU1pcnJvci5zdGFydFN0YXRlID0gZnVuY3Rpb24gKG1vZGUsIGExLCBhMikgewogIHJldHVybiBtb2RlLnN0YXJ0U3RhdGUgPyBtb2RlLnN0YXJ0U3RhdGUoYTEsIGEyKSA6IHRydWU7Cn07Cgp2YXIgbW9kZXMgPSBDb2RlTWlycm9yLm1vZGVzID0ge30sIG1pbWVNb2RlcyA9IENvZGVNaXJyb3IubWltZU1vZGVzID0ge307CkNvZGVNaXJyb3IuZGVmaW5lTW9kZSA9IGZ1bmN0aW9uIChuYW1lLCBtb2RlKSB7CiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAyKQogICAgbW9kZS5kZXBlbmRlbmNpZXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpOwogIG1vZGVzW25hbWVdID0gbW9kZTsKfTsKQ29kZU1pcnJvci5kZWZpbmVNSU1FID0gZnVuY3Rpb24gKG1pbWUsIHNwZWMpIHsgbWltZU1vZGVzW21pbWVdID0gc3BlYzsgfTsKQ29kZU1pcnJvci5yZXNvbHZlTW9kZSA9IGZ1bmN0aW9uKHNwZWMpIHsKICBpZiAodHlwZW9mIHNwZWMgPT0gInN0cmluZyIgJiYgbWltZU1vZGVzLmhhc093blByb3BlcnR5KHNwZWMpKSB7CiAgICBzcGVjID0gbWltZU1vZGVzW3NwZWNdOwogIH0gZWxzZSBpZiAoc3BlYyAmJiB0eXBlb2Ygc3BlYy5uYW1lID09ICJzdHJpbmciICYmIG1pbWVNb2Rlcy5oYXNPd25Qcm9wZXJ0eShzcGVjLm5hbWUpKSB7CiAgICBzcGVjID0gbWltZU1vZGVzW3NwZWMubmFtZV07CiAgfQogIGlmICh0eXBlb2Ygc3BlYyA9PSAic3RyaW5nIikgcmV0dXJuIHtuYW1lOiBzcGVjfTsKICBlbHNlIHJldHVybiBzcGVjIHx8IHtuYW1lOiAibnVsbCJ9Owp9OwpDb2RlTWlycm9yLmdldE1vZGUgPSBmdW5jdGlvbiAob3B0aW9ucywgc3BlYykgewogIHNwZWMgPSBDb2RlTWlycm9yLnJlc29sdmVNb2RlKHNwZWMpOwogIHZhciBtZmFjdG9yeSA9IG1vZGVzW3NwZWMubmFtZV07CiAgaWYgKCFtZmFjdG9yeSkgdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIG1vZGU6ICIgKyBzcGVjKTsKICByZXR1cm4gbWZhY3Rvcnkob3B0aW9ucywgc3BlYyk7Cn07CkNvZGVNaXJyb3IucmVnaXN0ZXJIZWxwZXIgPSBDb2RlTWlycm9yLnJlZ2lzdGVyR2xvYmFsSGVscGVyID0gTWF0aC5taW47CkNvZGVNaXJyb3IuZGVmaW5lTW9kZSgibnVsbCIsIGZ1bmN0aW9uKCkgewogIHJldHVybiB7dG9rZW46IGZ1bmN0aW9uKHN0cmVhbSkge3N0cmVhbS5za2lwVG9FbmQoKTt9fTsKfSk7CkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC9wbGFpbiIsICJudWxsIik7CgpDb2RlTWlycm9yLnJ1bk1vZGUgPSBmdW5jdGlvbiAoc3RyaW5nLCBtb2Rlc3BlYywgY2FsbGJhY2ssIG9wdGlvbnMpIHsKICB2YXIgbW9kZSA9IENvZGVNaXJyb3IuZ2V0TW9kZSh7IGluZGVudFVuaXQ6IDIgfSwgbW9kZXNwZWMpOwoKICBpZiAoY2FsbGJhY2subm9kZVR5cGUgPT0gMSkgewogICAgdmFyIHRhYlNpemUgPSAob3B0aW9ucyAmJiBvcHRpb25zLnRhYlNpemUpIHx8IDQ7CiAgICB2YXIgbm9kZSA9IGNhbGxiYWNrLCBjb2wgPSAwOwogICAgbm9kZS5pbm5lckhUTUwgPSAiIjsKICAgIGNhbGxiYWNrID0gZnVuY3Rpb24gKHRleHQsIHN0eWxlKSB7CiAgICAgIGlmICh0ZXh0ID09ICJcbiIpIHsKICAgICAgICBub2RlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImJyIikpOwogICAgICAgIGNvbCA9IDA7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHZhciBjb250ZW50ID0gIiI7CiAgICAgIC8vIHJlcGxhY2UgdGFicwogICAgICBmb3IgKHZhciBwb3MgPSAwOyA7KSB7CiAgICAgICAgdmFyIGlkeCA9IHRleHQuaW5kZXhPZigiXHQiLCBwb3MpOwogICAgICAgIGlmIChpZHggPT0gLTEpIHsKICAgICAgICAgIGNvbnRlbnQgKz0gdGV4dC5zbGljZShwb3MpOwogICAgICAgICAgY29sICs9IHRleHQubGVuZ3RoIC0gcG9zOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbCArPSBpZHggLSBwb3M7CiAgICAgICAgICBjb250ZW50ICs9IHRleHQuc2xpY2UocG9zLCBpZHgpOwogICAgICAgICAgdmFyIHNpemUgPSB0YWJTaXplIC0gY29sICUgdGFiU2l6ZTsKICAgICAgICAgIGNvbCArPSBzaXplOwogICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplOyArK2kpIGNvbnRlbnQgKz0gIiAiOwogICAgICAgICAgcG9zID0gaWR4ICsgMTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGlmIChzdHlsZSkgewogICAgICAgIHZhciBzcCA9IG5vZGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpKTsKICAgICAgICBzcC5jbGFzc05hbWUgPSAiY20tIiArIHN0eWxlLnJlcGxhY2UoLyArL2csICIgY20tIik7CiAgICAgICAgc3AuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY29udGVudCkpOwogICAgICB9IGVsc2UgewogICAgICAgIG5vZGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoY29udGVudCkpOwogICAgICB9CiAgICB9OwogIH0KCiAgdmFyIGxpbmVzID0gc3BsaXRMaW5lcyhzdHJpbmcpLCBzdGF0ZSA9IChvcHRpb25zICYmIG9wdGlvbnMuc3RhdGUpIHx8IENvZGVNaXJyb3Iuc3RhcnRTdGF0ZShtb2RlKTsKICBmb3IgKHZhciBpID0gMCwgZSA9IGxpbmVzLmxlbmd0aDsgaSA8IGU7ICsraSkgewogICAgaWYgKGkpIGNhbGxiYWNrKCJcbiIpOwogICAgdmFyIHN0cmVhbSA9IG5ldyBDb2RlTWlycm9yLlN0cmluZ1N0cmVhbShsaW5lc1tpXSk7CiAgICBpZiAoIXN0cmVhbS5zdHJpbmcgJiYgbW9kZS5ibGFua0xpbmUpIG1vZGUuYmxhbmtMaW5lKHN0YXRlKTsKICAgIHdoaWxlICghc3RyZWFtLmVvbCgpKSB7CiAgICAgIHZhciBzdHlsZSA9IG1vZGUudG9rZW4oc3RyZWFtLCBzdGF0ZSk7CiAgICAgIGNhbGxiYWNrKHN0cmVhbS5jdXJyZW50KCksIHN0eWxlLCBpLCBzdHJlYW0uc3RhcnQsIHN0YXRlKTsKICAgICAgc3RyZWFtLnN0YXJ0ID0gc3RyZWFtLnBvczsKICAgIH0KICB9Cn07Cn0pKCk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/runmode/runmode.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5ydW5Nb2RlID0gZnVuY3Rpb24oc3RyaW5nLCBtb2Rlc3BlYywgY2FsbGJhY2ssIG9wdGlvbnMpIHsKICB2YXIgbW9kZSA9IENvZGVNaXJyb3IuZ2V0TW9kZShDb2RlTWlycm9yLmRlZmF1bHRzLCBtb2Rlc3BlYyk7CiAgdmFyIGllID0gL01TSUUgXGQvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7CiAgdmFyIGllX2x0OSA9IGllICYmIChkb2N1bWVudC5kb2N1bWVudE1vZGUgPT0gbnVsbCB8fCBkb2N1bWVudC5kb2N1bWVudE1vZGUgPCA5KTsKCiAgaWYgKGNhbGxiYWNrLmFwcGVuZENoaWxkKSB7CiAgICB2YXIgdGFiU2l6ZSA9IChvcHRpb25zICYmIG9wdGlvbnMudGFiU2l6ZSkgfHwgQ29kZU1pcnJvci5kZWZhdWx0cy50YWJTaXplOwogICAgdmFyIG5vZGUgPSBjYWxsYmFjaywgY29sID0gMDsKICAgIG5vZGUuaW5uZXJIVE1MID0gIiI7CiAgICBjYWxsYmFjayA9IGZ1bmN0aW9uKHRleHQsIHN0eWxlKSB7CiAgICAgIGlmICh0ZXh0ID09ICJcbiIpIHsKICAgICAgICAvLyBFbWl0dGluZyBMRiBvciBDUkxGIG9uIElFOCBvciBlYXJsaWVyIHJlc3VsdHMgaW4gYW4gaW5jb3JyZWN0IGRpc3BsYXkuCiAgICAgICAgLy8gRW1pdHRpbmcgYSBjYXJyaWFnZSByZXR1cm4gbWFrZXMgZXZlcnl0aGluZyBvay4KICAgICAgICBub2RlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGllX2x0OSA/ICdccicgOiB0ZXh0KSk7CiAgICAgICAgY29sID0gMDsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdmFyIGNvbnRlbnQgPSAiIjsKICAgICAgLy8gcmVwbGFjZSB0YWJzCiAgICAgIGZvciAodmFyIHBvcyA9IDA7OykgewogICAgICAgIHZhciBpZHggPSB0ZXh0LmluZGV4T2YoIlx0IiwgcG9zKTsKICAgICAgICBpZiAoaWR4ID09IC0xKSB7CiAgICAgICAgICBjb250ZW50ICs9IHRleHQuc2xpY2UocG9zKTsKICAgICAgICAgIGNvbCArPSB0ZXh0Lmxlbmd0aCAtIHBvczsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb2wgKz0gaWR4IC0gcG9zOwogICAgICAgICAgY29udGVudCArPSB0ZXh0LnNsaWNlKHBvcywgaWR4KTsKICAgICAgICAgIHZhciBzaXplID0gdGFiU2l6ZSAtIGNvbCAlIHRhYlNpemU7CiAgICAgICAgICBjb2wgKz0gc2l6ZTsKICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2l6ZTsgKytpKSBjb250ZW50ICs9ICIgIjsKICAgICAgICAgIHBvcyA9IGlkeCArIDE7CiAgICAgICAgfQogICAgICB9CgogICAgICBpZiAoc3R5bGUpIHsKICAgICAgICB2YXIgc3AgPSBub2RlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKSk7CiAgICAgICAgc3AuY2xhc3NOYW1lID0gImNtLSIgKyBzdHlsZS5yZXBsYWNlKC8gKy9nLCAiIGNtLSIpOwogICAgICAgIHNwLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNvbnRlbnQpKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBub2RlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNvbnRlbnQpKTsKICAgICAgfQogICAgfTsKICB9CgogIHZhciBsaW5lcyA9IENvZGVNaXJyb3Iuc3BsaXRMaW5lcyhzdHJpbmcpLCBzdGF0ZSA9IChvcHRpb25zICYmIG9wdGlvbnMuc3RhdGUpIHx8IENvZGVNaXJyb3Iuc3RhcnRTdGF0ZShtb2RlKTsKICBmb3IgKHZhciBpID0gMCwgZSA9IGxpbmVzLmxlbmd0aDsgaSA8IGU7ICsraSkgewogICAgaWYgKGkpIGNhbGxiYWNrKCJcbiIpOwogICAgdmFyIHN0cmVhbSA9IG5ldyBDb2RlTWlycm9yLlN0cmluZ1N0cmVhbShsaW5lc1tpXSk7CiAgICBpZiAoIXN0cmVhbS5zdHJpbmcgJiYgbW9kZS5ibGFua0xpbmUpIG1vZGUuYmxhbmtMaW5lKHN0YXRlKTsKICAgIHdoaWxlICghc3RyZWFtLmVvbCgpKSB7CiAgICAgIHZhciBzdHlsZSA9IG1vZGUudG9rZW4oc3RyZWFtLCBzdGF0ZSk7CiAgICAgIGNhbGxiYWNrKHN0cmVhbS5jdXJyZW50KCksIHN0eWxlLCBpLCBzdHJlYW0uc3RhcnQsIHN0YXRlKTsKICAgICAgc3RyZWFtLnN0YXJ0ID0gc3RyZWFtLnBvczsKICAgIH0KICB9Cn07Cgp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/runmode/runmode.node.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovKiBKdXN0IGVub3VnaCBvZiBDb2RlTWlycm9yIHRvIHJ1biBydW5Nb2RlIHVuZGVyIG5vZGUuanMgKi8KCmZ1bmN0aW9uIHNwbGl0TGluZXMoc3RyaW5nKXtyZXR1cm4gc3RyaW5nLnNwbGl0KC9cclxuP3xcbi8pO307CgovLyBDb3VudHMgdGhlIGNvbHVtbiBvZmZzZXQgaW4gYSBzdHJpbmcsIHRha2luZyB0YWJzIGludG8gYWNjb3VudC4KLy8gVXNlZCBtb3N0bHkgdG8gZmluZCBpbmRlbnRhdGlvbi4KdmFyIGNvdW50Q29sdW1uID0gZnVuY3Rpb24oc3RyaW5nLCBlbmQsIHRhYlNpemUsIHN0YXJ0SW5kZXgsIHN0YXJ0VmFsdWUpIHsKICBpZiAoZW5kID09IG51bGwpIHsKICAgIGVuZCA9IHN0cmluZy5zZWFyY2goL1teXHNcdTAwYTBdLyk7CiAgICBpZiAoZW5kID09IC0xKSBlbmQgPSBzdHJpbmcubGVuZ3RoOwogIH0KICBmb3IgKHZhciBpID0gc3RhcnRJbmRleCB8fCAwLCBuID0gc3RhcnRWYWx1ZSB8fCAwOzspIHsKICAgIHZhciBuZXh0VGFiID0gc3RyaW5nLmluZGV4T2YoIlx0IiwgaSk7CiAgICBpZiAobmV4dFRhYiA8IDAgfHwgbmV4dFRhYiA+PSBlbmQpCiAgICAgIHJldHVybiBuICsgKGVuZCAtIGkpOwogICAgbiArPSBuZXh0VGFiIC0gaTsKICAgIG4gKz0gdGFiU2l6ZSAtIChuICUgdGFiU2l6ZSk7CiAgICBpID0gbmV4dFRhYiArIDE7CiAgfQp9OwoKZnVuY3Rpb24gU3RyaW5nU3RyZWFtKHN0cmluZywgdGFiU2l6ZSkgewogIHRoaXMucG9zID0gdGhpcy5zdGFydCA9IDA7CiAgdGhpcy5zdHJpbmcgPSBzdHJpbmc7CiAgdGhpcy50YWJTaXplID0gdGFiU2l6ZSB8fCA4OwogIHRoaXMubGFzdENvbHVtblBvcyA9IHRoaXMubGFzdENvbHVtblZhbHVlID0gMDsKICB0aGlzLmxpbmVTdGFydCA9IDA7Cn07CgpTdHJpbmdTdHJlYW0ucHJvdG90eXBlID0gewogIGVvbDogZnVuY3Rpb24oKSB7cmV0dXJuIHRoaXMucG9zID49IHRoaXMuc3RyaW5nLmxlbmd0aDt9LAogIHNvbDogZnVuY3Rpb24oKSB7cmV0dXJuIHRoaXMucG9zID09IHRoaXMubGluZVN0YXJ0O30sCiAgcGVlazogZnVuY3Rpb24oKSB7cmV0dXJuIHRoaXMuc3RyaW5nLmNoYXJBdCh0aGlzLnBvcykgfHwgdW5kZWZpbmVkO30sCiAgbmV4dDogZnVuY3Rpb24oKSB7CiAgICBpZiAodGhpcy5wb3MgPCB0aGlzLnN0cmluZy5sZW5ndGgpCiAgICAgIHJldHVybiB0aGlzLnN0cmluZy5jaGFyQXQodGhpcy5wb3MrKyk7CiAgfSwKICBlYXQ6IGZ1bmN0aW9uKG1hdGNoKSB7CiAgICB2YXIgY2ggPSB0aGlzLnN0cmluZy5jaGFyQXQodGhpcy5wb3MpOwogICAgaWYgKHR5cGVvZiBtYXRjaCA9PSAic3RyaW5nIikgdmFyIG9rID0gY2ggPT0gbWF0Y2g7CiAgICBlbHNlIHZhciBvayA9IGNoICYmIChtYXRjaC50ZXN0ID8gbWF0Y2gudGVzdChjaCkgOiBtYXRjaChjaCkpOwogICAgaWYgKG9rKSB7Kyt0aGlzLnBvczsgcmV0dXJuIGNoO30KICB9LAogIGVhdFdoaWxlOiBmdW5jdGlvbihtYXRjaCkgewogICAgdmFyIHN0YXJ0ID0gdGhpcy5wb3M7CiAgICB3aGlsZSAodGhpcy5lYXQobWF0Y2gpKXt9CiAgICByZXR1cm4gdGhpcy5wb3MgPiBzdGFydDsKICB9LAogIGVhdFNwYWNlOiBmdW5jdGlvbigpIHsKICAgIHZhciBzdGFydCA9IHRoaXMucG9zOwogICAgd2hpbGUgKC9bXHNcdTAwYTBdLy50ZXN0KHRoaXMuc3RyaW5nLmNoYXJBdCh0aGlzLnBvcykpKSArK3RoaXMucG9zOwogICAgcmV0dXJuIHRoaXMucG9zID4gc3RhcnQ7CiAgfSwKICBza2lwVG9FbmQ6IGZ1bmN0aW9uKCkge3RoaXMucG9zID0gdGhpcy5zdHJpbmcubGVuZ3RoO30sCiAgc2tpcFRvOiBmdW5jdGlvbihjaCkgewogICAgdmFyIGZvdW5kID0gdGhpcy5zdHJpbmcuaW5kZXhPZihjaCwgdGhpcy5wb3MpOwogICAgaWYgKGZvdW5kID4gLTEpIHt0aGlzLnBvcyA9IGZvdW5kOyByZXR1cm4gdHJ1ZTt9CiAgfSwKICBiYWNrVXA6IGZ1bmN0aW9uKG4pIHt0aGlzLnBvcyAtPSBuO30sCiAgY29sdW1uOiBmdW5jdGlvbigpIHsKICAgIGlmICh0aGlzLmxhc3RDb2x1bW5Qb3MgPCB0aGlzLnN0YXJ0KSB7CiAgICAgIHRoaXMubGFzdENvbHVtblZhbHVlID0gY291bnRDb2x1bW4odGhpcy5zdHJpbmcsIHRoaXMuc3RhcnQsIHRoaXMudGFiU2l6ZSwgdGhpcy5sYXN0Q29sdW1uUG9zLCB0aGlzLmxhc3RDb2x1bW5WYWx1ZSk7CiAgICAgIHRoaXMubGFzdENvbHVtblBvcyA9IHRoaXMuc3RhcnQ7CiAgICB9CiAgICByZXR1cm4gdGhpcy5sYXN0Q29sdW1uVmFsdWUgLSAodGhpcy5saW5lU3RhcnQgPyBjb3VudENvbHVtbih0aGlzLnN0cmluZywgdGhpcy5saW5lU3RhcnQsIHRoaXMudGFiU2l6ZSkgOiAwKTsKICB9LAogIGluZGVudGF0aW9uOiBmdW5jdGlvbigpIHsKICAgIHJldHVybiBjb3VudENvbHVtbih0aGlzLnN0cmluZywgbnVsbCwgdGhpcy50YWJTaXplKSAtCiAgICAgICh0aGlzLmxpbmVTdGFydCA/IGNvdW50Q29sdW1uKHRoaXMuc3RyaW5nLCB0aGlzLmxpbmVTdGFydCwgdGhpcy50YWJTaXplKSA6IDApOwogIH0sCiAgbWF0Y2g6IGZ1bmN0aW9uKHBhdHRlcm4sIGNvbnN1bWUsIGNhc2VJbnNlbnNpdGl2ZSkgewogICAgaWYgKHR5cGVvZiBwYXR0ZXJuID09ICJzdHJpbmciKSB7CiAgICAgIHZhciBjYXNlZCA9IGZ1bmN0aW9uKHN0cikge3JldHVybiBjYXNlSW5zZW5zaXRpdmUgPyBzdHIudG9Mb3dlckNhc2UoKSA6IHN0cjt9OwogICAgICB2YXIgc3Vic3RyID0gdGhpcy5zdHJpbmcuc3Vic3RyKHRoaXMucG9zLCBwYXR0ZXJuLmxlbmd0aCk7CiAgICAgIGlmIChjYXNlZChzdWJzdHIpID09IGNhc2VkKHBhdHRlcm4pKSB7CiAgICAgICAgaWYgKGNvbnN1bWUgIT09IGZhbHNlKSB0aGlzLnBvcyArPSBwYXR0ZXJuLmxlbmd0aDsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgdmFyIG1hdGNoID0gdGhpcy5zdHJpbmcuc2xpY2UodGhpcy5wb3MpLm1hdGNoKHBhdHRlcm4pOwogICAgICBpZiAobWF0Y2ggJiYgbWF0Y2guaW5kZXggPiAwKSByZXR1cm4gbnVsbDsKICAgICAgaWYgKG1hdGNoICYmIGNvbnN1bWUgIT09IGZhbHNlKSB0aGlzLnBvcyArPSBtYXRjaFswXS5sZW5ndGg7CiAgICAgIHJldHVybiBtYXRjaDsKICAgIH0KICB9LAogIGN1cnJlbnQ6IGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RyaW5nLnNsaWNlKHRoaXMuc3RhcnQsIHRoaXMucG9zKTt9LAogIGhpZGVGaXJzdENoYXJzOiBmdW5jdGlvbihuLCBpbm5lcikgewogICAgdGhpcy5saW5lU3RhcnQgKz0gbjsKICAgIHRyeSB7IHJldHVybiBpbm5lcigpOyB9CiAgICBmaW5hbGx5IHsgdGhpcy5saW5lU3RhcnQgLT0gbjsgfQogIH0KfTsKZXhwb3J0cy5TdHJpbmdTdHJlYW0gPSBTdHJpbmdTdHJlYW07CgpleHBvcnRzLnN0YXJ0U3RhdGUgPSBmdW5jdGlvbihtb2RlLCBhMSwgYTIpIHsKICByZXR1cm4gbW9kZS5zdGFydFN0YXRlID8gbW9kZS5zdGFydFN0YXRlKGExLCBhMikgOiB0cnVlOwp9OwoKdmFyIG1vZGVzID0gZXhwb3J0cy5tb2RlcyA9IHt9LCBtaW1lTW9kZXMgPSBleHBvcnRzLm1pbWVNb2RlcyA9IHt9OwpleHBvcnRzLmRlZmluZU1vZGUgPSBmdW5jdGlvbihuYW1lLCBtb2RlKSB7CiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAyKQogICAgbW9kZS5kZXBlbmRlbmNpZXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpOwogIG1vZGVzW25hbWVdID0gbW9kZTsKfTsKZXhwb3J0cy5kZWZpbmVNSU1FID0gZnVuY3Rpb24obWltZSwgc3BlYykgeyBtaW1lTW9kZXNbbWltZV0gPSBzcGVjOyB9OwoKZXhwb3J0cy5kZWZpbmVNb2RlKCJudWxsIiwgZnVuY3Rpb24oKSB7CiAgcmV0dXJuIHt0b2tlbjogZnVuY3Rpb24oc3RyZWFtKSB7c3RyZWFtLnNraXBUb0VuZCgpO319Owp9KTsKZXhwb3J0cy5kZWZpbmVNSU1FKCJ0ZXh0L3BsYWluIiwgIm51bGwiKTsKCmV4cG9ydHMucmVzb2x2ZU1vZGUgPSBmdW5jdGlvbihzcGVjKSB7CiAgaWYgKHR5cGVvZiBzcGVjID09ICJzdHJpbmciICYmIG1pbWVNb2Rlcy5oYXNPd25Qcm9wZXJ0eShzcGVjKSkgewogICAgc3BlYyA9IG1pbWVNb2Rlc1tzcGVjXTsKICB9IGVsc2UgaWYgKHNwZWMgJiYgdHlwZW9mIHNwZWMubmFtZSA9PSAic3RyaW5nIiAmJiBtaW1lTW9kZXMuaGFzT3duUHJvcGVydHkoc3BlYy5uYW1lKSkgewogICAgc3BlYyA9IG1pbWVNb2Rlc1tzcGVjLm5hbWVdOwogIH0KICBpZiAodHlwZW9mIHNwZWMgPT0gInN0cmluZyIpIHJldHVybiB7bmFtZTogc3BlY307CiAgZWxzZSByZXR1cm4gc3BlYyB8fCB7bmFtZTogIm51bGwifTsKfTsKCmZ1bmN0aW9uIGNvcHlPYmoob2JqLCB0YXJnZXQsIG92ZXJ3cml0ZSkgewogIGlmICghdGFyZ2V0KSB0YXJnZXQgPSB7fTsKICBmb3IgKHZhciBwcm9wIGluIG9iaikKICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkocHJvcCkgJiYgKG92ZXJ3cml0ZSAhPT0gZmFsc2UgfHwgIXRhcmdldC5oYXNPd25Qcm9wZXJ0eShwcm9wKSkpCiAgICAgIHRhcmdldFtwcm9wXSA9IG9ialtwcm9wXTsKICByZXR1cm4gdGFyZ2V0Owp9CgovLyBUaGlzIGNhbiBiZSB1c2VkIHRvIGF0dGFjaCBwcm9wZXJ0aWVzIHRvIG1vZGUgb2JqZWN0cyBmcm9tCi8vIG91dHNpZGUgdGhlIGFjdHVhbCBtb2RlIGRlZmluaXRpb24uCnZhciBtb2RlRXh0ZW5zaW9ucyA9IGV4cG9ydHMubW9kZUV4dGVuc2lvbnMgPSB7fTsKZXhwb3J0cy5leHRlbmRNb2RlID0gZnVuY3Rpb24obW9kZSwgcHJvcGVydGllcykgewogIHZhciBleHRzID0gbW9kZUV4dGVuc2lvbnMuaGFzT3duUHJvcGVydHkobW9kZSkgPyBtb2RlRXh0ZW5zaW9uc1ttb2RlXSA6IChtb2RlRXh0ZW5zaW9uc1ttb2RlXSA9IHt9KTsKICBjb3B5T2JqKHByb3BlcnRpZXMsIGV4dHMpOwp9OwoKZXhwb3J0cy5nZXRNb2RlID0gZnVuY3Rpb24ob3B0aW9ucywgc3BlYykgewogIHZhciBzcGVjID0gZXhwb3J0cy5yZXNvbHZlTW9kZShzcGVjKTsKICB2YXIgbWZhY3RvcnkgPSBtb2Rlc1tzcGVjLm5hbWVdOwogIGlmICghbWZhY3RvcnkpIHJldHVybiBleHBvcnRzLmdldE1vZGUob3B0aW9ucywgInRleHQvcGxhaW4iKTsKICB2YXIgbW9kZU9iaiA9IG1mYWN0b3J5KG9wdGlvbnMsIHNwZWMpOwogIGlmIChtb2RlRXh0ZW5zaW9ucy5oYXNPd25Qcm9wZXJ0eShzcGVjLm5hbWUpKSB7CiAgICB2YXIgZXh0cyA9IG1vZGVFeHRlbnNpb25zW3NwZWMubmFtZV07CiAgICBmb3IgKHZhciBwcm9wIGluIGV4dHMpIHsKICAgICAgaWYgKCFleHRzLmhhc093blByb3BlcnR5KHByb3ApKSBjb250aW51ZTsKICAgICAgaWYgKG1vZGVPYmouaGFzT3duUHJvcGVydHkocHJvcCkpIG1vZGVPYmpbIl8iICsgcHJvcF0gPSBtb2RlT2JqW3Byb3BdOwogICAgICBtb2RlT2JqW3Byb3BdID0gZXh0c1twcm9wXTsKICAgIH0KICB9CiAgbW9kZU9iai5uYW1lID0gc3BlYy5uYW1lOwogIGlmIChzcGVjLmhlbHBlclR5cGUpIG1vZGVPYmouaGVscGVyVHlwZSA9IHNwZWMuaGVscGVyVHlwZTsKICBpZiAoc3BlYy5tb2RlUHJvcHMpIGZvciAodmFyIHByb3AgaW4gc3BlYy5tb2RlUHJvcHMpCiAgICBtb2RlT2JqW3Byb3BdID0gc3BlYy5tb2RlUHJvcHNbcHJvcF07CgogIHJldHVybiBtb2RlT2JqOwp9OwpleHBvcnRzLnJlZ2lzdGVySGVscGVyID0gZXhwb3J0cy5yZWdpc3Rlckdsb2JhbEhlbHBlciA9IE1hdGgubWluOwoKZXhwb3J0cy5ydW5Nb2RlID0gZnVuY3Rpb24oc3RyaW5nLCBtb2Rlc3BlYywgY2FsbGJhY2ssIG9wdGlvbnMpIHsKICB2YXIgbW9kZSA9IGV4cG9ydHMuZ2V0TW9kZSh7aW5kZW50VW5pdDogMn0sIG1vZGVzcGVjKTsKICB2YXIgbGluZXMgPSBzcGxpdExpbmVzKHN0cmluZyksIHN0YXRlID0gKG9wdGlvbnMgJiYgb3B0aW9ucy5zdGF0ZSkgfHwgZXhwb3J0cy5zdGFydFN0YXRlKG1vZGUpOwogIGZvciAodmFyIGkgPSAwLCBlID0gbGluZXMubGVuZ3RoOyBpIDwgZTsgKytpKSB7CiAgICBpZiAoaSkgY2FsbGJhY2soIlxuIik7CiAgICB2YXIgc3RyZWFtID0gbmV3IGV4cG9ydHMuU3RyaW5nU3RyZWFtKGxpbmVzW2ldKTsKICAgIGlmICghc3RyZWFtLnN0cmluZyAmJiBtb2RlLmJsYW5rTGluZSkgbW9kZS5ibGFua0xpbmUoc3RhdGUpOwogICAgd2hpbGUgKCFzdHJlYW0uZW9sKCkpIHsKICAgICAgdmFyIHN0eWxlID0gbW9kZS50b2tlbihzdHJlYW0sIHN0YXRlKTsKICAgICAgY2FsbGJhY2soc3RyZWFtLmN1cnJlbnQoKSwgc3R5bGUsIGksIHN0cmVhbS5zdGFydCwgc3RhdGUpOwogICAgICBzdHJlYW0uc3RhcnQgPSBzdHJlYW0ucG9zOwogICAgfQogIH0KfTsKCnJlcXVpcmUuY2FjaGVbcmVxdWlyZS5yZXNvbHZlKCIuLi8uLi9saWIvY29kZW1pcnJvciIpXSA9IHJlcXVpcmUuY2FjaGVbcmVxdWlyZS5yZXNvbHZlKCIuL3J1bm1vZGUubm9kZSIpXTsKcmVxdWlyZS5jYWNoZVtyZXF1aXJlLnJlc29sdmUoIi4uLy4uL2FkZG9uL3J1bm1vZGUvcnVubW9kZSIpXSA9IHJlcXVpcmUuY2FjaGVbcmVxdWlyZS5yZXNvbHZlKCIuL3J1bm1vZGUubm9kZSIpXTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/scroll/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/scroll/annotatescrollbar.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CgogIENvZGVNaXJyb3IuZGVmaW5lRXh0ZW5zaW9uKCJhbm5vdGF0ZVNjcm9sbGJhciIsIGZ1bmN0aW9uKG9wdGlvbnMpIHsKICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PSAic3RyaW5nIikgb3B0aW9ucyA9IHtjbGFzc05hbWU6IG9wdGlvbnN9OwogICAgcmV0dXJuIG5ldyBBbm5vdGF0aW9uKHRoaXMsIG9wdGlvbnMpOwogIH0pOwoKICBDb2RlTWlycm9yLmRlZmluZU9wdGlvbigic2Nyb2xsQnV0dG9uSGVpZ2h0IiwgMCk7CgogIGZ1bmN0aW9uIEFubm90YXRpb24oY20sIG9wdGlvbnMpIHsKICAgIHRoaXMuY20gPSBjbTsKICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CiAgICB0aGlzLmJ1dHRvbkhlaWdodCA9IG9wdGlvbnMuc2Nyb2xsQnV0dG9uSGVpZ2h0IHx8IGNtLmdldE9wdGlvbigic2Nyb2xsQnV0dG9uSGVpZ2h0Iik7CiAgICB0aGlzLmFubm90YXRpb25zID0gW107CiAgICB0aGlzLmRvUmVkcmF3ID0gdGhpcy5kb1VwZGF0ZSA9IG51bGw7CiAgICB0aGlzLmRpdiA9IGNtLmdldFdyYXBwZXJFbGVtZW50KCkuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikpOwogICAgdGhpcy5kaXYuc3R5bGUuY3NzVGV4dCA9ICJwb3NpdGlvbjogYWJzb2x1dGU7IHJpZ2h0OiAwOyB0b3A6IDA7IHotaW5kZXg6IDc7IHBvaW50ZXItZXZlbnRzOiBub25lIjsKICAgIHRoaXMuY29tcHV0ZVNjYWxlKCk7CgogICAgZnVuY3Rpb24gc2NoZWR1bGVSZWRyYXcoZGVsYXkpIHsKICAgICAgY2xlYXJUaW1lb3V0KHNlbGYuZG9SZWRyYXcpOwogICAgICBzZWxmLmRvUmVkcmF3ID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsgc2VsZi5yZWRyYXcoKTsgfSwgZGVsYXkpOwogICAgfQoKICAgIHZhciBzZWxmID0gdGhpczsKICAgIGNtLm9uKCJyZWZyZXNoIiwgdGhpcy5yZXNpemVIYW5kbGVyID0gZnVuY3Rpb24oKSB7CiAgICAgIGNsZWFyVGltZW91dChzZWxmLmRvVXBkYXRlKTsKICAgICAgc2VsZi5kb1VwZGF0ZSA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKHNlbGYuY29tcHV0ZVNjYWxlKCkpIHNjaGVkdWxlUmVkcmF3KDIwKTsKICAgICAgfSwgMTAwKTsKICAgIH0pOwogICAgY20ub24oIm1hcmtlckFkZGVkIiwgdGhpcy5yZXNpemVIYW5kbGVyKTsKICAgIGNtLm9uKCJtYXJrZXJDbGVhcmVkIiwgdGhpcy5yZXNpemVIYW5kbGVyKTsKICAgIGlmIChvcHRpb25zLmxpc3RlbkZvckNoYW5nZXMgIT09IGZhbHNlKQogICAgICBjbS5vbigiY2hhbmdlIiwgdGhpcy5jaGFuZ2VIYW5kbGVyID0gZnVuY3Rpb24oKSB7CiAgICAgICAgc2NoZWR1bGVSZWRyYXcoMjUwKTsKICAgICAgfSk7CiAgfQoKICBBbm5vdGF0aW9uLnByb3RvdHlwZS5jb21wdXRlU2NhbGUgPSBmdW5jdGlvbigpIHsKICAgIHZhciBjbSA9IHRoaXMuY207CiAgICB2YXIgaFNjYWxlID0gKGNtLmdldFdyYXBwZXJFbGVtZW50KCkuY2xpZW50SGVpZ2h0IC0gY20uZGlzcGxheS5iYXJIZWlnaHQgLSB0aGlzLmJ1dHRvbkhlaWdodCAqIDIpIC8KICAgICAgY20uZ2V0U2Nyb2xsZXJFbGVtZW50KCkuc2Nyb2xsSGVpZ2h0CiAgICBpZiAoaFNjYWxlICE9IHRoaXMuaFNjYWxlKSB7CiAgICAgIHRoaXMuaFNjYWxlID0gaFNjYWxlOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICB9OwoKICBBbm5vdGF0aW9uLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbihhbm5vdGF0aW9ucykgewogICAgdGhpcy5hbm5vdGF0aW9ucyA9IGFubm90YXRpb25zOwogICAgdGhpcy5yZWRyYXcoKTsKICB9OwoKICBBbm5vdGF0aW9uLnByb3RvdHlwZS5yZWRyYXcgPSBmdW5jdGlvbihjb21wdXRlKSB7CiAgICBpZiAoY29tcHV0ZSAhPT0gZmFsc2UpIHRoaXMuY29tcHV0ZVNjYWxlKCk7CiAgICB2YXIgY20gPSB0aGlzLmNtLCBoU2NhbGUgPSB0aGlzLmhTY2FsZTsKCiAgICB2YXIgZnJhZyA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSwgYW5ucyA9IHRoaXMuYW5ub3RhdGlvbnM7CgogICAgdmFyIHdyYXBwaW5nID0gY20uZ2V0T3B0aW9uKCJsaW5lV3JhcHBpbmciKTsKICAgIHZhciBzaW5nbGVMaW5lSCA9IHdyYXBwaW5nICYmIGNtLmRlZmF1bHRUZXh0SGVpZ2h0KCkgKiAxLjU7CiAgICB2YXIgY3VyTGluZSA9IG51bGwsIGN1ckxpbmVPYmogPSBudWxsOwogICAgZnVuY3Rpb24gZ2V0WShwb3MsIHRvcCkgewogICAgICBpZiAoY3VyTGluZSAhPSBwb3MubGluZSkgewogICAgICAgIGN1ckxpbmUgPSBwb3MubGluZTsKICAgICAgICBjdXJMaW5lT2JqID0gY20uZ2V0TGluZUhhbmRsZShjdXJMaW5lKTsKICAgICAgfQogICAgICBpZiAod3JhcHBpbmcgJiYgY3VyTGluZU9iai5oZWlnaHQgPiBzaW5nbGVMaW5lSCkKICAgICAgICByZXR1cm4gY20uY2hhckNvb3Jkcyhwb3MsICJsb2NhbCIpW3RvcCA/ICJ0b3AiIDogImJvdHRvbSJdOwogICAgICB2YXIgdG9wWSA9IGNtLmhlaWdodEF0TGluZShjdXJMaW5lT2JqLCAibG9jYWwiKTsKICAgICAgcmV0dXJuIHRvcFkgKyAodG9wID8gMCA6IGN1ckxpbmVPYmouaGVpZ2h0KTsKICAgIH0KCiAgICBpZiAoY20uZGlzcGxheS5iYXJXaWR0aCkgZm9yICh2YXIgaSA9IDAsIG5leHRUb3A7IGkgPCBhbm5zLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBhbm4gPSBhbm5zW2ldOwogICAgICB2YXIgdG9wID0gbmV4dFRvcCB8fCBnZXRZKGFubi5mcm9tLCB0cnVlKSAqIGhTY2FsZTsKICAgICAgdmFyIGJvdHRvbSA9IGdldFkoYW5uLnRvLCBmYWxzZSkgKiBoU2NhbGU7CiAgICAgIHdoaWxlIChpIDwgYW5ucy5sZW5ndGggLSAxKSB7CiAgICAgICAgbmV4dFRvcCA9IGdldFkoYW5uc1tpICsgMV0uZnJvbSwgdHJ1ZSkgKiBoU2NhbGU7CiAgICAgICAgaWYgKG5leHRUb3AgPiBib3R0b20gKyAuOSkgYnJlYWs7CiAgICAgICAgYW5uID0gYW5uc1srK2ldOwogICAgICAgIGJvdHRvbSA9IGdldFkoYW5uLnRvLCBmYWxzZSkgKiBoU2NhbGU7CiAgICAgIH0KICAgICAgaWYgKGJvdHRvbSA9PSB0b3ApIGNvbnRpbnVlOwogICAgICB2YXIgaGVpZ2h0ID0gTWF0aC5tYXgoYm90dG9tIC0gdG9wLCAzKTsKCiAgICAgIHZhciBlbHQgPSBmcmFnLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpKTsKICAgICAgZWx0LnN0eWxlLmNzc1RleHQgPSAicG9zaXRpb246IGFic29sdXRlOyByaWdodDogMHB4OyB3aWR0aDogIiArIE1hdGgubWF4KGNtLmRpc3BsYXkuYmFyV2lkdGggLSAxLCAyKSArICJweDsgdG9wOiAiCiAgICAgICAgKyAodG9wICsgdGhpcy5idXR0b25IZWlnaHQpICsgInB4OyBoZWlnaHQ6ICIgKyBoZWlnaHQgKyAicHgiOwogICAgICBlbHQuY2xhc3NOYW1lID0gdGhpcy5vcHRpb25zLmNsYXNzTmFtZTsKICAgICAgaWYgKGFubi5pZCkgewogICAgICAgIGVsdC5zZXRBdHRyaWJ1dGUoImFubm90YXRpb24taWQiLCBhbm4uaWQpOwogICAgICB9CiAgICB9CiAgICB0aGlzLmRpdi50ZXh0Q29udGVudCA9ICIiOwogICAgdGhpcy5kaXYuYXBwZW5kQ2hpbGQoZnJhZyk7CiAgfTsKCiAgQW5ub3RhdGlvbi5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbigpIHsKICAgIHRoaXMuY20ub2ZmKCJyZWZyZXNoIiwgdGhpcy5yZXNpemVIYW5kbGVyKTsKICAgIHRoaXMuY20ub2ZmKCJtYXJrZXJBZGRlZCIsIHRoaXMucmVzaXplSGFuZGxlcik7CiAgICB0aGlzLmNtLm9mZigibWFya2VyQ2xlYXJlZCIsIHRoaXMucmVzaXplSGFuZGxlcik7CiAgICBpZiAodGhpcy5jaGFuZ2VIYW5kbGVyKSB0aGlzLmNtLm9mZigiY2hhbmdlIiwgdGhpcy5jaGFuZ2VIYW5kbGVyKTsKICAgIHRoaXMuZGl2LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5kaXYpOwogIH07Cn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/scroll/scrollpastend.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CgogIENvZGVNaXJyb3IuZGVmaW5lT3B0aW9uKCJzY3JvbGxQYXN0RW5kIiwgZmFsc2UsIGZ1bmN0aW9uKGNtLCB2YWwsIG9sZCkgewogICAgaWYgKG9sZCAmJiBvbGQgIT0gQ29kZU1pcnJvci5Jbml0KSB7CiAgICAgIGNtLm9mZigiY2hhbmdlIiwgb25DaGFuZ2UpOwogICAgICBjbS5vZmYoInJlZnJlc2giLCB1cGRhdGVCb3R0b21NYXJnaW4pOwogICAgICBjbS5kaXNwbGF5LmxpbmVTcGFjZS5wYXJlbnROb2RlLnN0eWxlLnBhZGRpbmdCb3R0b20gPSAiIjsKICAgICAgY20uc3RhdGUuc2Nyb2xsUGFzdEVuZFBhZGRpbmcgPSBudWxsOwogICAgfQogICAgaWYgKHZhbCkgewogICAgICBjbS5vbigiY2hhbmdlIiwgb25DaGFuZ2UpOwogICAgICBjbS5vbigicmVmcmVzaCIsIHVwZGF0ZUJvdHRvbU1hcmdpbik7CiAgICAgIHVwZGF0ZUJvdHRvbU1hcmdpbihjbSk7CiAgICB9CiAgfSk7CgogIGZ1bmN0aW9uIG9uQ2hhbmdlKGNtLCBjaGFuZ2UpIHsKICAgIGlmIChDb2RlTWlycm9yLmNoYW5nZUVuZChjaGFuZ2UpLmxpbmUgPT0gY20ubGFzdExpbmUoKSkKICAgICAgdXBkYXRlQm90dG9tTWFyZ2luKGNtKTsKICB9CgogIGZ1bmN0aW9uIHVwZGF0ZUJvdHRvbU1hcmdpbihjbSkgewogICAgdmFyIHBhZGRpbmcgPSAiIjsKICAgIGlmIChjbS5saW5lQ291bnQoKSA+IDEpIHsKICAgICAgdmFyIHRvdGFsSCA9IGNtLmRpc3BsYXkuc2Nyb2xsZXIuY2xpZW50SGVpZ2h0IC0gMzAsCiAgICAgICAgICBsYXN0TGluZUggPSBjbS5nZXRMaW5lSGFuZGxlKGNtLmxhc3RMaW5lKCkpLmhlaWdodDsKICAgICAgcGFkZGluZyA9ICh0b3RhbEggLSBsYXN0TGluZUgpICsgInB4IjsKICAgIH0KICAgIGlmIChjbS5zdGF0ZS5zY3JvbGxQYXN0RW5kUGFkZGluZyAhPSBwYWRkaW5nKSB7CiAgICAgIGNtLnN0YXRlLnNjcm9sbFBhc3RFbmRQYWRkaW5nID0gcGFkZGluZzsKICAgICAgY20uZGlzcGxheS5saW5lU3BhY2UucGFyZW50Tm9kZS5zdHlsZS5wYWRkaW5nQm90dG9tID0gcGFkZGluZzsKICAgICAgY20ub2ZmKCJyZWZyZXNoIiwgdXBkYXRlQm90dG9tTWFyZ2luKTsKICAgICAgY20uc2V0U2l6ZSgpOwogICAgICBjbS5vbigicmVmcmVzaCIsIHVwZGF0ZUJvdHRvbU1hcmdpbik7CiAgICB9CiAgfQp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/scroll/simplescrollbars.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LkNvZGVNaXJyb3Itc2ltcGxlc2Nyb2xsLWhvcml6b250YWwgZGl2LCAuQ29kZU1pcnJvci1zaW1wbGVzY3JvbGwtdmVydGljYWwgZGl2IHsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgYmFja2dyb3VuZDogI2NjYzsKICAtbW96LWJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICBib3JkZXI6IDFweCBzb2xpZCAjYmJiOwogIGJvcmRlci1yYWRpdXM6IDJweDsKfQoKLkNvZGVNaXJyb3Itc2ltcGxlc2Nyb2xsLWhvcml6b250YWwsIC5Db2RlTWlycm9yLXNpbXBsZXNjcm9sbC12ZXJ0aWNhbCB7CiAgcG9zaXRpb246IGFic29sdXRlOwogIHotaW5kZXg6IDY7CiAgYmFja2dyb3VuZDogI2VlZTsKfQoKLkNvZGVNaXJyb3Itc2ltcGxlc2Nyb2xsLWhvcml6b250YWwgewogIGJvdHRvbTogMDsgbGVmdDogMDsKICBoZWlnaHQ6IDhweDsKfQouQ29kZU1pcnJvci1zaW1wbGVzY3JvbGwtaG9yaXpvbnRhbCBkaXYgewogIGJvdHRvbTogMDsKICBoZWlnaHQ6IDEwMCU7Cn0KCi5Db2RlTWlycm9yLXNpbXBsZXNjcm9sbC12ZXJ0aWNhbCB7CiAgcmlnaHQ6IDA7IHRvcDogMDsKICB3aWR0aDogOHB4Owp9Ci5Db2RlTWlycm9yLXNpbXBsZXNjcm9sbC12ZXJ0aWNhbCBkaXYgewogIHJpZ2h0OiAwOwogIHdpZHRoOiAxMDAlOwp9CgoKLkNvZGVNaXJyb3Itb3ZlcmxheXNjcm9sbCAuQ29kZU1pcnJvci1zY3JvbGxiYXItZmlsbGVyLCAuQ29kZU1pcnJvci1vdmVybGF5c2Nyb2xsIC5Db2RlTWlycm9yLWd1dHRlci1maWxsZXIgewogIGRpc3BsYXk6IG5vbmU7Cn0KCi5Db2RlTWlycm9yLW92ZXJsYXlzY3JvbGwtaG9yaXpvbnRhbCBkaXYsIC5Db2RlTWlycm9yLW92ZXJsYXlzY3JvbGwtdmVydGljYWwgZGl2IHsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgYmFja2dyb3VuZDogI2JjZDsKICBib3JkZXItcmFkaXVzOiAzcHg7Cn0KCi5Db2RlTWlycm9yLW92ZXJsYXlzY3JvbGwtaG9yaXpvbnRhbCwgLkNvZGVNaXJyb3Itb3ZlcmxheXNjcm9sbC12ZXJ0aWNhbCB7CiAgcG9zaXRpb246IGFic29sdXRlOwogIHotaW5kZXg6IDY7Cn0KCi5Db2RlTWlycm9yLW92ZXJsYXlzY3JvbGwtaG9yaXpvbnRhbCB7CiAgYm90dG9tOiAwOyBsZWZ0OiAwOwogIGhlaWdodDogNnB4Owp9Ci5Db2RlTWlycm9yLW92ZXJsYXlzY3JvbGwtaG9yaXpvbnRhbCBkaXYgewogIGJvdHRvbTogMDsKICBoZWlnaHQ6IDEwMCU7Cn0KCi5Db2RlTWlycm9yLW92ZXJsYXlzY3JvbGwtdmVydGljYWwgewogIHJpZ2h0OiAwOyB0b3A6IDA7CiAgd2lkdGg6IDZweDsKfQouQ29kZU1pcnJvci1vdmVybGF5c2Nyb2xsLXZlcnRpY2FsIGRpdiB7CiAgcmlnaHQ6IDA7CiAgd2lkdGg6IDEwMCU7Cn0K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/scroll/simplescrollbars.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CgogIGZ1bmN0aW9uIEJhcihjbHMsIG9yaWVudGF0aW9uLCBzY3JvbGwpIHsKICAgIHRoaXMub3JpZW50YXRpb24gPSBvcmllbnRhdGlvbjsKICAgIHRoaXMuc2Nyb2xsID0gc2Nyb2xsOwogICAgdGhpcy5zY3JlZW4gPSB0aGlzLnRvdGFsID0gdGhpcy5zaXplID0gMTsKICAgIHRoaXMucG9zID0gMDsKCiAgICB0aGlzLm5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICAgIHRoaXMubm9kZS5jbGFzc05hbWUgPSBjbHMgKyAiLSIgKyBvcmllbnRhdGlvbjsKICAgIHRoaXMuaW5uZXIgPSB0aGlzLm5vZGUuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikpOwoKICAgIHZhciBzZWxmID0gdGhpczsKICAgIENvZGVNaXJyb3Iub24odGhpcy5pbm5lciwgIm1vdXNlZG93biIsIGZ1bmN0aW9uKGUpIHsKICAgICAgaWYgKGUud2hpY2ggIT0gMSkgcmV0dXJuOwogICAgICBDb2RlTWlycm9yLmVfcHJldmVudERlZmF1bHQoZSk7CiAgICAgIHZhciBheGlzID0gc2VsZi5vcmllbnRhdGlvbiA9PSAiaG9yaXpvbnRhbCIgPyAicGFnZVgiIDogInBhZ2VZIjsKICAgICAgdmFyIHN0YXJ0ID0gZVtheGlzXSwgc3RhcnRwb3MgPSBzZWxmLnBvczsKICAgICAgZnVuY3Rpb24gZG9uZSgpIHsKICAgICAgICBDb2RlTWlycm9yLm9mZihkb2N1bWVudCwgIm1vdXNlbW92ZSIsIG1vdmUpOwogICAgICAgIENvZGVNaXJyb3Iub2ZmKGRvY3VtZW50LCAibW91c2V1cCIsIGRvbmUpOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIG1vdmUoZSkgewogICAgICAgIGlmIChlLndoaWNoICE9IDEpIHJldHVybiBkb25lKCk7CiAgICAgICAgc2VsZi5tb3ZlVG8oc3RhcnRwb3MgKyAoZVtheGlzXSAtIHN0YXJ0KSAqIChzZWxmLnRvdGFsIC8gc2VsZi5zaXplKSk7CiAgICAgIH0KICAgICAgQ29kZU1pcnJvci5vbihkb2N1bWVudCwgIm1vdXNlbW92ZSIsIG1vdmUpOwogICAgICBDb2RlTWlycm9yLm9uKGRvY3VtZW50LCAibW91c2V1cCIsIGRvbmUpOwogICAgfSk7CgogICAgQ29kZU1pcnJvci5vbih0aGlzLm5vZGUsICJjbGljayIsIGZ1bmN0aW9uKGUpIHsKICAgICAgQ29kZU1pcnJvci5lX3ByZXZlbnREZWZhdWx0KGUpOwogICAgICB2YXIgaW5uZXJCb3ggPSBzZWxmLmlubmVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCB3aGVyZTsKICAgICAgaWYgKHNlbGYub3JpZW50YXRpb24gPT0gImhvcml6b250YWwiKQogICAgICAgIHdoZXJlID0gZS5jbGllbnRYIDwgaW5uZXJCb3gubGVmdCA/IC0xIDogZS5jbGllbnRYID4gaW5uZXJCb3gucmlnaHQgPyAxIDogMDsKICAgICAgZWxzZQogICAgICAgIHdoZXJlID0gZS5jbGllbnRZIDwgaW5uZXJCb3gudG9wID8gLTEgOiBlLmNsaWVudFkgPiBpbm5lckJveC5ib3R0b20gPyAxIDogMDsKICAgICAgc2VsZi5tb3ZlVG8oc2VsZi5wb3MgKyB3aGVyZSAqIHNlbGYuc2NyZWVuKTsKICAgIH0pOwoKICAgIGZ1bmN0aW9uIG9uV2hlZWwoZSkgewogICAgICB2YXIgbW92ZWQgPSBDb2RlTWlycm9yLndoZWVsRXZlbnRQaXhlbHMoZSlbc2VsZi5vcmllbnRhdGlvbiA9PSAiaG9yaXpvbnRhbCIgPyAieCIgOiAieSJdOwogICAgICB2YXIgb2xkUG9zID0gc2VsZi5wb3M7CiAgICAgIHNlbGYubW92ZVRvKHNlbGYucG9zICsgbW92ZWQpOwogICAgICBpZiAoc2VsZi5wb3MgIT0gb2xkUG9zKSBDb2RlTWlycm9yLmVfcHJldmVudERlZmF1bHQoZSk7CiAgICB9CiAgICBDb2RlTWlycm9yLm9uKHRoaXMubm9kZSwgIm1vdXNld2hlZWwiLCBvbldoZWVsKTsKICAgIENvZGVNaXJyb3Iub24odGhpcy5ub2RlLCAiRE9NTW91c2VTY3JvbGwiLCBvbldoZWVsKTsKICB9CgogIEJhci5wcm90b3R5cGUuc2V0UG9zID0gZnVuY3Rpb24ocG9zLCBmb3JjZSkgewogICAgaWYgKHBvcyA8IDApIHBvcyA9IDA7CiAgICBpZiAocG9zID4gdGhpcy50b3RhbCAtIHRoaXMuc2NyZWVuKSBwb3MgPSB0aGlzLnRvdGFsIC0gdGhpcy5zY3JlZW47CiAgICBpZiAoIWZvcmNlICYmIHBvcyA9PSB0aGlzLnBvcykgcmV0dXJuIGZhbHNlOwogICAgdGhpcy5wb3MgPSBwb3M7CiAgICB0aGlzLmlubmVyLnN0eWxlW3RoaXMub3JpZW50YXRpb24gPT0gImhvcml6b250YWwiID8gImxlZnQiIDogInRvcCJdID0KICAgICAgKHBvcyAqICh0aGlzLnNpemUgLyB0aGlzLnRvdGFsKSkgKyAicHgiOwogICAgcmV0dXJuIHRydWUKICB9OwoKICBCYXIucHJvdG90eXBlLm1vdmVUbyA9IGZ1bmN0aW9uKHBvcykgewogICAgaWYgKHRoaXMuc2V0UG9zKHBvcykpIHRoaXMuc2Nyb2xsKHBvcywgdGhpcy5vcmllbnRhdGlvbik7CiAgfQoKICB2YXIgbWluQnV0dG9uU2l6ZSA9IDEwOwoKICBCYXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uKHNjcm9sbFNpemUsIGNsaWVudFNpemUsIGJhclNpemUpIHsKICAgIHZhciBzaXplQ2hhbmdlZCA9IHRoaXMuc2NyZWVuICE9IGNsaWVudFNpemUgfHwgdGhpcy50b3RhbCAhPSBzY3JvbGxTaXplIHx8IHRoaXMuc2l6ZSAhPSBiYXJTaXplCiAgICBpZiAoc2l6ZUNoYW5nZWQpIHsKICAgICAgdGhpcy5zY3JlZW4gPSBjbGllbnRTaXplOwogICAgICB0aGlzLnRvdGFsID0gc2Nyb2xsU2l6ZTsKICAgICAgdGhpcy5zaXplID0gYmFyU2l6ZTsKICAgIH0KCiAgICB2YXIgYnV0dG9uU2l6ZSA9IHRoaXMuc2NyZWVuICogKHRoaXMuc2l6ZSAvIHRoaXMudG90YWwpOwogICAgaWYgKGJ1dHRvblNpemUgPCBtaW5CdXR0b25TaXplKSB7CiAgICAgIHRoaXMuc2l6ZSAtPSBtaW5CdXR0b25TaXplIC0gYnV0dG9uU2l6ZTsKICAgICAgYnV0dG9uU2l6ZSA9IG1pbkJ1dHRvblNpemU7CiAgICB9CiAgICB0aGlzLmlubmVyLnN0eWxlW3RoaXMub3JpZW50YXRpb24gPT0gImhvcml6b250YWwiID8gIndpZHRoIiA6ICJoZWlnaHQiXSA9CiAgICAgIGJ1dHRvblNpemUgKyAicHgiOwogICAgdGhpcy5zZXRQb3ModGhpcy5wb3MsIHNpemVDaGFuZ2VkKTsKICB9OwoKICBmdW5jdGlvbiBTaW1wbGVTY3JvbGxiYXJzKGNscywgcGxhY2UsIHNjcm9sbCkgewogICAgdGhpcy5hZGRDbGFzcyA9IGNsczsKICAgIHRoaXMuaG9yaXogPSBuZXcgQmFyKGNscywgImhvcml6b250YWwiLCBzY3JvbGwpOwogICAgcGxhY2UodGhpcy5ob3Jpei5ub2RlKTsKICAgIHRoaXMudmVydCA9IG5ldyBCYXIoY2xzLCAidmVydGljYWwiLCBzY3JvbGwpOwogICAgcGxhY2UodGhpcy52ZXJ0Lm5vZGUpOwogICAgdGhpcy53aWR0aCA9IG51bGw7CiAgfQoKICBTaW1wbGVTY3JvbGxiYXJzLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbihtZWFzdXJlKSB7CiAgICBpZiAodGhpcy53aWR0aCA9PSBudWxsKSB7CiAgICAgIHZhciBzdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlID8gd2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy5ob3Jpei5ub2RlKSA6IHRoaXMuaG9yaXoubm9kZS5jdXJyZW50U3R5bGU7CiAgICAgIGlmIChzdHlsZSkgdGhpcy53aWR0aCA9IHBhcnNlSW50KHN0eWxlLmhlaWdodCk7CiAgICB9CiAgICB2YXIgd2lkdGggPSB0aGlzLndpZHRoIHx8IDA7CgogICAgdmFyIG5lZWRzSCA9IG1lYXN1cmUuc2Nyb2xsV2lkdGggPiBtZWFzdXJlLmNsaWVudFdpZHRoICsgMTsKICAgIHZhciBuZWVkc1YgPSBtZWFzdXJlLnNjcm9sbEhlaWdodCA+IG1lYXN1cmUuY2xpZW50SGVpZ2h0ICsgMTsKICAgIHRoaXMudmVydC5ub2RlLnN0eWxlLmRpc3BsYXkgPSBuZWVkc1YgPyAiYmxvY2siIDogIm5vbmUiOwogICAgdGhpcy5ob3Jpei5ub2RlLnN0eWxlLmRpc3BsYXkgPSBuZWVkc0ggPyAiYmxvY2siIDogIm5vbmUiOwoKICAgIGlmIChuZWVkc1YpIHsKICAgICAgdGhpcy52ZXJ0LnVwZGF0ZShtZWFzdXJlLnNjcm9sbEhlaWdodCwgbWVhc3VyZS5jbGllbnRIZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgbWVhc3VyZS52aWV3SGVpZ2h0IC0gKG5lZWRzSCA/IHdpZHRoIDogMCkpOwogICAgICB0aGlzLnZlcnQubm9kZS5zdHlsZS5ib3R0b20gPSBuZWVkc0ggPyB3aWR0aCArICJweCIgOiAiMCI7CiAgICB9CiAgICBpZiAobmVlZHNIKSB7CiAgICAgIHRoaXMuaG9yaXoudXBkYXRlKG1lYXN1cmUuc2Nyb2xsV2lkdGgsIG1lYXN1cmUuY2xpZW50V2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgIG1lYXN1cmUudmlld1dpZHRoIC0gKG5lZWRzViA/IHdpZHRoIDogMCkgLSBtZWFzdXJlLmJhckxlZnQpOwogICAgICB0aGlzLmhvcml6Lm5vZGUuc3R5bGUucmlnaHQgPSBuZWVkc1YgPyB3aWR0aCArICJweCIgOiAiMCI7CiAgICAgIHRoaXMuaG9yaXoubm9kZS5zdHlsZS5sZWZ0ID0gbWVhc3VyZS5iYXJMZWZ0ICsgInB4IjsKICAgIH0KCiAgICByZXR1cm4ge3JpZ2h0OiBuZWVkc1YgPyB3aWR0aCA6IDAsIGJvdHRvbTogbmVlZHNIID8gd2lkdGggOiAwfTsKICB9OwoKICBTaW1wbGVTY3JvbGxiYXJzLnByb3RvdHlwZS5zZXRTY3JvbGxUb3AgPSBmdW5jdGlvbihwb3MpIHsKICAgIHRoaXMudmVydC5zZXRQb3MocG9zKTsKICB9OwoKICBTaW1wbGVTY3JvbGxiYXJzLnByb3RvdHlwZS5zZXRTY3JvbGxMZWZ0ID0gZnVuY3Rpb24ocG9zKSB7CiAgICB0aGlzLmhvcml6LnNldFBvcyhwb3MpOwogIH07CgogIFNpbXBsZVNjcm9sbGJhcnMucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24oKSB7CiAgICB2YXIgcGFyZW50ID0gdGhpcy5ob3Jpei5ub2RlLnBhcmVudE5vZGU7CiAgICBwYXJlbnQucmVtb3ZlQ2hpbGQodGhpcy5ob3Jpei5ub2RlKTsKICAgIHBhcmVudC5yZW1vdmVDaGlsZCh0aGlzLnZlcnQubm9kZSk7CiAgfTsKCiAgQ29kZU1pcnJvci5zY3JvbGxiYXJNb2RlbC5zaW1wbGUgPSBmdW5jdGlvbihwbGFjZSwgc2Nyb2xsKSB7CiAgICByZXR1cm4gbmV3IFNpbXBsZVNjcm9sbGJhcnMoIkNvZGVNaXJyb3Itc2ltcGxlc2Nyb2xsIiwgcGxhY2UsIHNjcm9sbCk7CiAgfTsKICBDb2RlTWlycm9yLnNjcm9sbGJhck1vZGVsLm92ZXJsYXkgPSBmdW5jdGlvbihwbGFjZSwgc2Nyb2xsKSB7CiAgICByZXR1cm4gbmV3IFNpbXBsZVNjcm9sbGJhcnMoIkNvZGVNaXJyb3Itb3ZlcmxheXNjcm9sbCIsIHBsYWNlLCBzY3JvbGwpOwogIH07Cn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/search/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/search/jump-to-line.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovLyBEZWZpbmVzIGp1bXBUb0xpbmUgY29tbWFuZC4gVXNlcyBkaWFsb2cuanMgaWYgcHJlc2VudC4KCihmdW5jdGlvbihtb2QpIHsKICBpZiAodHlwZW9mIGV4cG9ydHMgPT0gIm9iamVjdCIgJiYgdHlwZW9mIG1vZHVsZSA9PSAib2JqZWN0IikgLy8gQ29tbW9uSlMKICAgIG1vZChyZXF1aXJlKCIuLi8uLi9saWIvY29kZW1pcnJvciIpLCByZXF1aXJlKCIuLi9kaWFsb2cvZGlhbG9nIikpOwogIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kKSAvLyBBTUQKICAgIGRlZmluZShbIi4uLy4uL2xpYi9jb2RlbWlycm9yIiwgIi4uL2RpYWxvZy9kaWFsb2ciXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CgogIGZ1bmN0aW9uIGRpYWxvZyhjbSwgdGV4dCwgc2hvcnRUZXh0LCBkZWZsdCwgZikgewogICAgaWYgKGNtLm9wZW5EaWFsb2cpIGNtLm9wZW5EaWFsb2codGV4dCwgZiwge3ZhbHVlOiBkZWZsdCwgc2VsZWN0VmFsdWVPbk9wZW46IHRydWV9KTsKICAgIGVsc2UgZihwcm9tcHQoc2hvcnRUZXh0LCBkZWZsdCkpOwogIH0KCiAgdmFyIGp1bXBEaWFsb2cgPQogICAgICAnSnVtcCB0byBsaW5lOiA8aW5wdXQgdHlwZT0idGV4dCIgc3R5bGU9IndpZHRoOiAxMGVtIiBjbGFzcz0iQ29kZU1pcnJvci1zZWFyY2gtZmllbGQiLz4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjODg4IiBjbGFzcz0iQ29kZU1pcnJvci1zZWFyY2gtaGludCI+KFVzZSBsaW5lOmNvbHVtbiBvciBzY3JvbGwlIHN5bnRheCk8L3NwYW4+JzsKCiAgZnVuY3Rpb24gaW50ZXJwcmV0TGluZShjbSwgc3RyaW5nKSB7CiAgICB2YXIgbnVtID0gTnVtYmVyKHN0cmluZykKICAgIGlmICgvXlstK10vLnRlc3Qoc3RyaW5nKSkgcmV0dXJuIGNtLmdldEN1cnNvcigpLmxpbmUgKyBudW0KICAgIGVsc2UgcmV0dXJuIG51bSAtIDEKICB9CgogIENvZGVNaXJyb3IuY29tbWFuZHMuanVtcFRvTGluZSA9IGZ1bmN0aW9uKGNtKSB7CiAgICB2YXIgY3VyID0gY20uZ2V0Q3Vyc29yKCk7CiAgICBkaWFsb2coY20sIGp1bXBEaWFsb2csICJKdW1wIHRvIGxpbmU6IiwgKGN1ci5saW5lICsgMSkgKyAiOiIgKyBjdXIuY2gsIGZ1bmN0aW9uKHBvc1N0cikgewogICAgICBpZiAoIXBvc1N0cikgcmV0dXJuOwoKICAgICAgdmFyIG1hdGNoOwogICAgICBpZiAobWF0Y2ggPSAvXlxzKihbXCtcLV0/XGQrKVxzKlw6XHMqKFxkKylccyokLy5leGVjKHBvc1N0cikpIHsKICAgICAgICBjbS5zZXRDdXJzb3IoaW50ZXJwcmV0TGluZShjbSwgbWF0Y2hbMV0pLCBOdW1iZXIobWF0Y2hbMl0pKQogICAgICB9IGVsc2UgaWYgKG1hdGNoID0gL15ccyooW1wrXC1dP1xkKyhcLlxkKyk/KVwlXHMqLy5leGVjKHBvc1N0cikpIHsKICAgICAgICB2YXIgbGluZSA9IE1hdGgucm91bmQoY20ubGluZUNvdW50KCkgKiBOdW1iZXIobWF0Y2hbMV0pIC8gMTAwKTsKICAgICAgICBpZiAoL15bLStdLy50ZXN0KG1hdGNoWzFdKSkgbGluZSA9IGN1ci5saW5lICsgbGluZSArIDE7CiAgICAgICAgY20uc2V0Q3Vyc29yKGxpbmUgLSAxLCBjdXIuY2gpOwogICAgICB9IGVsc2UgaWYgKG1hdGNoID0gL15ccypcOj9ccyooW1wrXC1dP1xkKylccyovLmV4ZWMocG9zU3RyKSkgewogICAgICAgIGNtLnNldEN1cnNvcihpbnRlcnByZXRMaW5lKGNtLCBtYXRjaFsxXSksIGN1ci5jaCk7CiAgICAgIH0KICAgIH0pOwogIH07CgogIENvZGVNaXJyb3Iua2V5TWFwWyJkZWZhdWx0Il1bIkFsdC1HIl0gPSAianVtcFRvTGluZSI7Cn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/search/match-highlighter.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovLyBIaWdobGlnaHRpbmcgdGV4dCB0aGF0IG1hdGNoZXMgdGhlIHNlbGVjdGlvbgovLwovLyBEZWZpbmVzIGFuIG9wdGlvbiBoaWdobGlnaHRTZWxlY3Rpb25NYXRjaGVzLCB3aGljaCwgd2hlbiBlbmFibGVkLAovLyB3aWxsIHN0eWxlIHN0cmluZ3MgdGhhdCBtYXRjaCB0aGUgc2VsZWN0aW9uIHRocm91Z2hvdXQgdGhlCi8vIGRvY3VtZW50LgovLwovLyBUaGUgb3B0aW9uIGNhbiBiZSBzZXQgdG8gdHJ1ZSB0byBzaW1wbHkgZW5hYmxlIGl0LCBvciB0byBhCi8vIHttaW5DaGFycywgc3R5bGUsIHdvcmRzT25seSwgc2hvd1Rva2VuLCBkZWxheX0gb2JqZWN0IHRvIGV4cGxpY2l0bHkKLy8gY29uZmlndXJlIGl0LiBtaW5DaGFycyBpcyB0aGUgbWluaW11bSBhbW91bnQgb2YgY2hhcmFjdGVycyB0aGF0IHNob3VsZCBiZQovLyBzZWxlY3RlZCBmb3IgdGhlIGJlaGF2aW9yIHRvIG9jY3VyLCBhbmQgc3R5bGUgaXMgdGhlIHRva2VuIHN0eWxlIHRvCi8vIGFwcGx5IHRvIHRoZSBtYXRjaGVzLiBUaGlzIHdpbGwgYmUgcHJlZml4ZWQgYnkgImNtLSIgdG8gY3JlYXRlIGFuCi8vIGFjdHVhbCBDU1MgY2xhc3MgbmFtZS4gSWYgd29yZHNPbmx5IGlzIGVuYWJsZWQsIHRoZSBtYXRjaGVzIHdpbGwgYmUKLy8gaGlnaGxpZ2h0ZWQgb25seSBpZiB0aGUgc2VsZWN0ZWQgdGV4dCBpcyBhIHdvcmQuIHNob3dUb2tlbiwgd2hlbiBlbmFibGVkLAovLyB3aWxsIGNhdXNlIHRoZSBjdXJyZW50IHRva2VuIHRvIGJlIGhpZ2hsaWdodGVkIHdoZW4gbm90aGluZyBpcyBzZWxlY3RlZC4KLy8gZGVsYXkgaXMgdXNlZCB0byBzcGVjaWZ5IGhvdyBtdWNoIHRpbWUgdG8gd2FpdCwgaW4gbWlsbGlzZWNvbmRzLCBiZWZvcmUKLy8gaGlnaGxpZ2h0aW5nIHRoZSBtYXRjaGVzLiBJZiBhbm5vdGF0ZVNjcm9sbGJhciBpcyBlbmFibGVkLCB0aGUgb2NjdXJlbmNlcwovLyB3aWxsIGJlIGhpZ2hsaWdodGVkIG9uIHRoZSBzY3JvbGxiYXIgdmlhIHRoZSBtYXRjaGVzb25zY3JvbGxiYXIgYWRkb24uCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSwgcmVxdWlyZSgiLi9tYXRjaGVzb25zY3JvbGxiYXIiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiLCAiLi9tYXRjaGVzb25zY3JvbGxiYXIiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CgogIHZhciBkZWZhdWx0cyA9IHsKICAgIHN0eWxlOiAibWF0Y2hoaWdobGlnaHQiLAogICAgbWluQ2hhcnM6IDIsCiAgICBkZWxheTogMTAwLAogICAgd29yZHNPbmx5OiBmYWxzZSwKICAgIGFubm90YXRlU2Nyb2xsYmFyOiBmYWxzZSwKICAgIHNob3dUb2tlbjogZmFsc2UsCiAgICB0cmltOiB0cnVlCiAgfQoKICBmdW5jdGlvbiBTdGF0ZShvcHRpb25zKSB7CiAgICB0aGlzLm9wdGlvbnMgPSB7fQogICAgZm9yICh2YXIgbmFtZSBpbiBkZWZhdWx0cykKICAgICAgdGhpcy5vcHRpb25zW25hbWVdID0gKG9wdGlvbnMgJiYgb3B0aW9ucy5oYXNPd25Qcm9wZXJ0eShuYW1lKSA/IG9wdGlvbnMgOiBkZWZhdWx0cylbbmFtZV0KICAgIHRoaXMub3ZlcmxheSA9IHRoaXMudGltZW91dCA9IG51bGw7CiAgICB0aGlzLm1hdGNoZXNvbnNjcm9sbCA9IG51bGw7CiAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlOwogIH0KCiAgQ29kZU1pcnJvci5kZWZpbmVPcHRpb24oImhpZ2hsaWdodFNlbGVjdGlvbk1hdGNoZXMiLCBmYWxzZSwgZnVuY3Rpb24oY20sIHZhbCwgb2xkKSB7CiAgICBpZiAob2xkICYmIG9sZCAhPSBDb2RlTWlycm9yLkluaXQpIHsKICAgICAgcmVtb3ZlT3ZlcmxheShjbSk7CiAgICAgIGNsZWFyVGltZW91dChjbS5zdGF0ZS5tYXRjaEhpZ2hsaWdodGVyLnRpbWVvdXQpOwogICAgICBjbS5zdGF0ZS5tYXRjaEhpZ2hsaWdodGVyID0gbnVsbDsKICAgICAgY20ub2ZmKCJjdXJzb3JBY3Rpdml0eSIsIGN1cnNvckFjdGl2aXR5KTsKICAgICAgY20ub2ZmKCJmb2N1cyIsIG9uRm9jdXMpCiAgICB9CiAgICBpZiAodmFsKSB7CiAgICAgIHZhciBzdGF0ZSA9IGNtLnN0YXRlLm1hdGNoSGlnaGxpZ2h0ZXIgPSBuZXcgU3RhdGUodmFsKTsKICAgICAgaWYgKGNtLmhhc0ZvY3VzKCkpIHsKICAgICAgICBzdGF0ZS5hY3RpdmUgPSB0cnVlCiAgICAgICAgaGlnaGxpZ2h0TWF0Y2hlcyhjbSkKICAgICAgfSBlbHNlIHsKICAgICAgICBjbS5vbigiZm9jdXMiLCBvbkZvY3VzKQogICAgICB9CiAgICAgIGNtLm9uKCJjdXJzb3JBY3Rpdml0eSIsIGN1cnNvckFjdGl2aXR5KTsKICAgIH0KICB9KTsKCiAgZnVuY3Rpb24gY3Vyc29yQWN0aXZpdHkoY20pIHsKICAgIHZhciBzdGF0ZSA9IGNtLnN0YXRlLm1hdGNoSGlnaGxpZ2h0ZXI7CiAgICBpZiAoc3RhdGUuYWN0aXZlIHx8IGNtLmhhc0ZvY3VzKCkpIHNjaGVkdWxlSGlnaGxpZ2h0KGNtLCBzdGF0ZSkKICB9CgogIGZ1bmN0aW9uIG9uRm9jdXMoY20pIHsKICAgIHZhciBzdGF0ZSA9IGNtLnN0YXRlLm1hdGNoSGlnaGxpZ2h0ZXIKICAgIGlmICghc3RhdGUuYWN0aXZlKSB7CiAgICAgIHN0YXRlLmFjdGl2ZSA9IHRydWUKICAgICAgc2NoZWR1bGVIaWdobGlnaHQoY20sIHN0YXRlKQogICAgfQogIH0KCiAgZnVuY3Rpb24gc2NoZWR1bGVIaWdobGlnaHQoY20sIHN0YXRlKSB7CiAgICBjbGVhclRpbWVvdXQoc3RhdGUudGltZW91dCk7CiAgICBzdGF0ZS50aW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbigpIHtoaWdobGlnaHRNYXRjaGVzKGNtKTt9LCBzdGF0ZS5vcHRpb25zLmRlbGF5KTsKICB9CgogIGZ1bmN0aW9uIGFkZE92ZXJsYXkoY20sIHF1ZXJ5LCBoYXNCb3VuZGFyeSwgc3R5bGUpIHsKICAgIHZhciBzdGF0ZSA9IGNtLnN0YXRlLm1hdGNoSGlnaGxpZ2h0ZXI7CiAgICBjbS5hZGRPdmVybGF5KHN0YXRlLm92ZXJsYXkgPSBtYWtlT3ZlcmxheShxdWVyeSwgaGFzQm91bmRhcnksIHN0eWxlKSk7CiAgICBpZiAoc3RhdGUub3B0aW9ucy5hbm5vdGF0ZVNjcm9sbGJhciAmJiBjbS5zaG93TWF0Y2hlc09uU2Nyb2xsYmFyKSB7CiAgICAgIHZhciBzZWFyY2hGb3IgPSBoYXNCb3VuZGFyeSA/IG5ldyBSZWdFeHAoIlxcYiIgKyBxdWVyeSArICJcXGIiKSA6IHF1ZXJ5OwogICAgICBzdGF0ZS5tYXRjaGVzb25zY3JvbGwgPSBjbS5zaG93TWF0Y2hlc09uU2Nyb2xsYmFyKHNlYXJjaEZvciwgZmFsc2UsCiAgICAgICAge2NsYXNzTmFtZTogIkNvZGVNaXJyb3Itc2VsZWN0aW9uLWhpZ2hsaWdodC1zY3JvbGxiYXIifSk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiByZW1vdmVPdmVybGF5KGNtKSB7CiAgICB2YXIgc3RhdGUgPSBjbS5zdGF0ZS5tYXRjaEhpZ2hsaWdodGVyOwogICAgaWYgKHN0YXRlLm92ZXJsYXkpIHsKICAgICAgY20ucmVtb3ZlT3ZlcmxheShzdGF0ZS5vdmVybGF5KTsKICAgICAgc3RhdGUub3ZlcmxheSA9IG51bGw7CiAgICAgIGlmIChzdGF0ZS5tYXRjaGVzb25zY3JvbGwpIHsKICAgICAgICBzdGF0ZS5tYXRjaGVzb25zY3JvbGwuY2xlYXIoKTsKICAgICAgICBzdGF0ZS5tYXRjaGVzb25zY3JvbGwgPSBudWxsOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBoaWdobGlnaHRNYXRjaGVzKGNtKSB7CiAgICBjbS5vcGVyYXRpb24oZnVuY3Rpb24oKSB7CiAgICAgIHZhciBzdGF0ZSA9IGNtLnN0YXRlLm1hdGNoSGlnaGxpZ2h0ZXI7CiAgICAgIHJlbW92ZU92ZXJsYXkoY20pOwogICAgICBpZiAoIWNtLnNvbWV0aGluZ1NlbGVjdGVkKCkgJiYgc3RhdGUub3B0aW9ucy5zaG93VG9rZW4pIHsKICAgICAgICB2YXIgcmUgPSBzdGF0ZS5vcHRpb25zLnNob3dUb2tlbiA9PT0gdHJ1ZSA/IC9bXHckXS8gOiBzdGF0ZS5vcHRpb25zLnNob3dUb2tlbjsKICAgICAgICB2YXIgY3VyID0gY20uZ2V0Q3Vyc29yKCksIGxpbmUgPSBjbS5nZXRMaW5lKGN1ci5saW5lKSwgc3RhcnQgPSBjdXIuY2gsIGVuZCA9IHN0YXJ0OwogICAgICAgIHdoaWxlIChzdGFydCAmJiByZS50ZXN0KGxpbmUuY2hhckF0KHN0YXJ0IC0gMSkpKSAtLXN0YXJ0OwogICAgICAgIHdoaWxlIChlbmQgPCBsaW5lLmxlbmd0aCAmJiByZS50ZXN0KGxpbmUuY2hhckF0KGVuZCkpKSArK2VuZDsKICAgICAgICBpZiAoc3RhcnQgPCBlbmQpCiAgICAgICAgICBhZGRPdmVybGF5KGNtLCBsaW5lLnNsaWNlKHN0YXJ0LCBlbmQpLCByZSwgc3RhdGUub3B0aW9ucy5zdHlsZSk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHZhciBmcm9tID0gY20uZ2V0Q3Vyc29yKCJmcm9tIiksIHRvID0gY20uZ2V0Q3Vyc29yKCJ0byIpOwogICAgICBpZiAoZnJvbS5saW5lICE9IHRvLmxpbmUpIHJldHVybjsKICAgICAgaWYgKHN0YXRlLm9wdGlvbnMud29yZHNPbmx5ICYmICFpc1dvcmQoY20sIGZyb20sIHRvKSkgcmV0dXJuOwogICAgICB2YXIgc2VsZWN0aW9uID0gY20uZ2V0UmFuZ2UoZnJvbSwgdG8pCiAgICAgIGlmIChzdGF0ZS5vcHRpb25zLnRyaW0pIHNlbGVjdGlvbiA9IHNlbGVjdGlvbi5yZXBsYWNlKC9eXHMrfFxzKyQvZywgIiIpCiAgICAgIGlmIChzZWxlY3Rpb24ubGVuZ3RoID49IHN0YXRlLm9wdGlvbnMubWluQ2hhcnMpCiAgICAgICAgYWRkT3ZlcmxheShjbSwgc2VsZWN0aW9uLCBmYWxzZSwgc3RhdGUub3B0aW9ucy5zdHlsZSk7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIGlzV29yZChjbSwgZnJvbSwgdG8pIHsKICAgIHZhciBzdHIgPSBjbS5nZXRSYW5nZShmcm9tLCB0byk7CiAgICBpZiAoc3RyLm1hdGNoKC9eXHcrJC8pICE9PSBudWxsKSB7CiAgICAgICAgaWYgKGZyb20uY2ggPiAwKSB7CiAgICAgICAgICAgIHZhciBwb3MgPSB7bGluZTogZnJvbS5saW5lLCBjaDogZnJvbS5jaCAtIDF9OwogICAgICAgICAgICB2YXIgY2hyID0gY20uZ2V0UmFuZ2UocG9zLCBmcm9tKTsKICAgICAgICAgICAgaWYgKGNoci5tYXRjaCgvXFcvKSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICBpZiAodG8uY2ggPCBjbS5nZXRMaW5lKGZyb20ubGluZSkubGVuZ3RoKSB7CiAgICAgICAgICAgIHZhciBwb3MgPSB7bGluZTogdG8ubGluZSwgY2g6IHRvLmNoICsgMX07CiAgICAgICAgICAgIHZhciBjaHIgPSBjbS5nZXRSYW5nZSh0bywgcG9zKTsKICAgICAgICAgICAgaWYgKGNoci5tYXRjaCgvXFcvKSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0gZWxzZSByZXR1cm4gZmFsc2U7CiAgfQoKICBmdW5jdGlvbiBib3VuZGFyaWVzQXJvdW5kKHN0cmVhbSwgcmUpIHsKICAgIHJldHVybiAoIXN0cmVhbS5zdGFydCB8fCAhcmUudGVzdChzdHJlYW0uc3RyaW5nLmNoYXJBdChzdHJlYW0uc3RhcnQgLSAxKSkpICYmCiAgICAgIChzdHJlYW0ucG9zID09IHN0cmVhbS5zdHJpbmcubGVuZ3RoIHx8ICFyZS50ZXN0KHN0cmVhbS5zdHJpbmcuY2hhckF0KHN0cmVhbS5wb3MpKSk7CiAgfQoKICBmdW5jdGlvbiBtYWtlT3ZlcmxheShxdWVyeSwgaGFzQm91bmRhcnksIHN0eWxlKSB7CiAgICByZXR1cm4ge3Rva2VuOiBmdW5jdGlvbihzdHJlYW0pIHsKICAgICAgaWYgKHN0cmVhbS5tYXRjaChxdWVyeSkgJiYKICAgICAgICAgICghaGFzQm91bmRhcnkgfHwgYm91bmRhcmllc0Fyb3VuZChzdHJlYW0sIGhhc0JvdW5kYXJ5KSkpCiAgICAgICAgcmV0dXJuIHN0eWxlOwogICAgICBzdHJlYW0ubmV4dCgpOwogICAgICBzdHJlYW0uc2tpcFRvKHF1ZXJ5LmNoYXJBdCgwKSkgfHwgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgfX07CiAgfQp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/search/matchesonscrollbar.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LkNvZGVNaXJyb3Itc2VhcmNoLW1hdGNoIHsKICBiYWNrZ3JvdW5kOiBnb2xkOwogIGJvcmRlci10b3A6IDFweCBzb2xpZCBvcmFuZ2U7CiAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIG9yYW5nZTsKICAtbW96LWJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICBvcGFjaXR5OiAuNTsKfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/search/matchesonscrollbar.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSwgcmVxdWlyZSgiLi9zZWFyY2hjdXJzb3IiKSwgcmVxdWlyZSgiLi4vc2Nyb2xsL2Fubm90YXRlc2Nyb2xsYmFyIikpOwogIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kKSAvLyBBTUQKICAgIGRlZmluZShbIi4uLy4uL2xpYi9jb2RlbWlycm9yIiwgIi4vc2VhcmNoY3Vyc29yIiwgIi4uL3Njcm9sbC9hbm5vdGF0ZXNjcm9sbGJhciJdLCBtb2QpOwogIGVsc2UgLy8gUGxhaW4gYnJvd3NlciBlbnYKICAgIG1vZChDb2RlTWlycm9yKTsKfSkoZnVuY3Rpb24oQ29kZU1pcnJvcikgewogICJ1c2Ugc3RyaWN0IjsKCiAgQ29kZU1pcnJvci5kZWZpbmVFeHRlbnNpb24oInNob3dNYXRjaGVzT25TY3JvbGxiYXIiLCBmdW5jdGlvbihxdWVyeSwgY2FzZUZvbGQsIG9wdGlvbnMpIHsKICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PSAic3RyaW5nIikgb3B0aW9ucyA9IHtjbGFzc05hbWU6IG9wdGlvbnN9OwogICAgaWYgKCFvcHRpb25zKSBvcHRpb25zID0ge307CiAgICByZXR1cm4gbmV3IFNlYXJjaEFubm90YXRpb24odGhpcywgcXVlcnksIGNhc2VGb2xkLCBvcHRpb25zKTsKICB9KTsKCiAgZnVuY3Rpb24gU2VhcmNoQW5ub3RhdGlvbihjbSwgcXVlcnksIGNhc2VGb2xkLCBvcHRpb25zKSB7CiAgICB0aGlzLmNtID0gY207CiAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zOwogICAgdmFyIGFubm90YXRlT3B0aW9ucyA9IHtsaXN0ZW5Gb3JDaGFuZ2VzOiBmYWxzZX07CiAgICBmb3IgKHZhciBwcm9wIGluIG9wdGlvbnMpIGFubm90YXRlT3B0aW9uc1twcm9wXSA9IG9wdGlvbnNbcHJvcF07CiAgICBpZiAoIWFubm90YXRlT3B0aW9ucy5jbGFzc05hbWUpIGFubm90YXRlT3B0aW9ucy5jbGFzc05hbWUgPSAiQ29kZU1pcnJvci1zZWFyY2gtbWF0Y2giOwogICAgdGhpcy5hbm5vdGF0aW9uID0gY20uYW5ub3RhdGVTY3JvbGxiYXIoYW5ub3RhdGVPcHRpb25zKTsKICAgIHRoaXMucXVlcnkgPSBxdWVyeTsKICAgIHRoaXMuY2FzZUZvbGQgPSBjYXNlRm9sZDsKICAgIHRoaXMuZ2FwID0ge2Zyb206IGNtLmZpcnN0TGluZSgpLCB0bzogY20ubGFzdExpbmUoKSArIDF9OwogICAgdGhpcy5tYXRjaGVzID0gW107CiAgICB0aGlzLnVwZGF0ZSA9IG51bGw7CgogICAgdGhpcy5maW5kTWF0Y2hlcygpOwogICAgdGhpcy5hbm5vdGF0aW9uLnVwZGF0ZSh0aGlzLm1hdGNoZXMpOwoKICAgIHZhciBzZWxmID0gdGhpczsKICAgIGNtLm9uKCJjaGFuZ2UiLCB0aGlzLmNoYW5nZUhhbmRsZXIgPSBmdW5jdGlvbihfY20sIGNoYW5nZSkgeyBzZWxmLm9uQ2hhbmdlKGNoYW5nZSk7IH0pOwogIH0KCiAgdmFyIE1BWF9NQVRDSEVTID0gMTAwMDsKCiAgU2VhcmNoQW5ub3RhdGlvbi5wcm90b3R5cGUuZmluZE1hdGNoZXMgPSBmdW5jdGlvbigpIHsKICAgIGlmICghdGhpcy5nYXApIHJldHVybjsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5tYXRjaGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBtYXRjaCA9IHRoaXMubWF0Y2hlc1tpXTsKICAgICAgaWYgKG1hdGNoLmZyb20ubGluZSA+PSB0aGlzLmdhcC50bykgYnJlYWs7CiAgICAgIGlmIChtYXRjaC50by5saW5lID49IHRoaXMuZ2FwLmZyb20pIHRoaXMubWF0Y2hlcy5zcGxpY2UoaS0tLCAxKTsKICAgIH0KICAgIHZhciBjdXJzb3IgPSB0aGlzLmNtLmdldFNlYXJjaEN1cnNvcih0aGlzLnF1ZXJ5LCBDb2RlTWlycm9yLlBvcyh0aGlzLmdhcC5mcm9tLCAwKSwgdGhpcy5jYXNlRm9sZCk7CiAgICB2YXIgbWF4TWF0Y2hlcyA9IHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMubWF4TWF0Y2hlcyB8fCBNQVhfTUFUQ0hFUzsKICAgIHdoaWxlIChjdXJzb3IuZmluZE5leHQoKSkgewogICAgICB2YXIgbWF0Y2ggPSB7ZnJvbTogY3Vyc29yLmZyb20oKSwgdG86IGN1cnNvci50bygpfTsKICAgICAgaWYgKG1hdGNoLmZyb20ubGluZSA+PSB0aGlzLmdhcC50bykgYnJlYWs7CiAgICAgIHRoaXMubWF0Y2hlcy5zcGxpY2UoaSsrLCAwLCBtYXRjaCk7CiAgICAgIGlmICh0aGlzLm1hdGNoZXMubGVuZ3RoID4gbWF4TWF0Y2hlcykgYnJlYWs7CiAgICB9CiAgICB0aGlzLmdhcCA9IG51bGw7CiAgfTsKCiAgZnVuY3Rpb24gb2Zmc2V0TGluZShsaW5lLCBjaGFuZ2VTdGFydCwgc2l6ZUNoYW5nZSkgewogICAgaWYgKGxpbmUgPD0gY2hhbmdlU3RhcnQpIHJldHVybiBsaW5lOwogICAgcmV0dXJuIE1hdGgubWF4KGNoYW5nZVN0YXJ0LCBsaW5lICsgc2l6ZUNoYW5nZSk7CiAgfQoKICBTZWFyY2hBbm5vdGF0aW9uLnByb3RvdHlwZS5vbkNoYW5nZSA9IGZ1bmN0aW9uKGNoYW5nZSkgewogICAgdmFyIHN0YXJ0TGluZSA9IGNoYW5nZS5mcm9tLmxpbmU7CiAgICB2YXIgZW5kTGluZSA9IENvZGVNaXJyb3IuY2hhbmdlRW5kKGNoYW5nZSkubGluZTsKICAgIHZhciBzaXplQ2hhbmdlID0gZW5kTGluZSAtIGNoYW5nZS50by5saW5lOwogICAgaWYgKHRoaXMuZ2FwKSB7CiAgICAgIHRoaXMuZ2FwLmZyb20gPSBNYXRoLm1pbihvZmZzZXRMaW5lKHRoaXMuZ2FwLmZyb20sIHN0YXJ0TGluZSwgc2l6ZUNoYW5nZSksIGNoYW5nZS5mcm9tLmxpbmUpOwogICAgICB0aGlzLmdhcC50byA9IE1hdGgubWF4KG9mZnNldExpbmUodGhpcy5nYXAudG8sIHN0YXJ0TGluZSwgc2l6ZUNoYW5nZSksIGNoYW5nZS5mcm9tLmxpbmUpOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5nYXAgPSB7ZnJvbTogY2hhbmdlLmZyb20ubGluZSwgdG86IGVuZExpbmUgKyAxfTsKICAgIH0KCiAgICBpZiAoc2l6ZUNoYW5nZSkgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm1hdGNoZXMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIG1hdGNoID0gdGhpcy5tYXRjaGVzW2ldOwogICAgICB2YXIgbmV3RnJvbSA9IG9mZnNldExpbmUobWF0Y2guZnJvbS5saW5lLCBzdGFydExpbmUsIHNpemVDaGFuZ2UpOwogICAgICBpZiAobmV3RnJvbSAhPSBtYXRjaC5mcm9tLmxpbmUpIG1hdGNoLmZyb20gPSBDb2RlTWlycm9yLlBvcyhuZXdGcm9tLCBtYXRjaC5mcm9tLmNoKTsKICAgICAgdmFyIG5ld1RvID0gb2Zmc2V0TGluZShtYXRjaC50by5saW5lLCBzdGFydExpbmUsIHNpemVDaGFuZ2UpOwogICAgICBpZiAobmV3VG8gIT0gbWF0Y2gudG8ubGluZSkgbWF0Y2gudG8gPSBDb2RlTWlycm9yLlBvcyhuZXdUbywgbWF0Y2gudG8uY2gpOwogICAgfQogICAgY2xlYXJUaW1lb3V0KHRoaXMudXBkYXRlKTsKICAgIHZhciBzZWxmID0gdGhpczsKICAgIHRoaXMudXBkYXRlID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsgc2VsZi51cGRhdGVBZnRlckNoYW5nZSgpOyB9LCAyNTApOwogIH07CgogIFNlYXJjaEFubm90YXRpb24ucHJvdG90eXBlLnVwZGF0ZUFmdGVyQ2hhbmdlID0gZnVuY3Rpb24oKSB7CiAgICB0aGlzLmZpbmRNYXRjaGVzKCk7CiAgICB0aGlzLmFubm90YXRpb24udXBkYXRlKHRoaXMubWF0Y2hlcyk7CiAgfTsKCiAgU2VhcmNoQW5ub3RhdGlvbi5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbigpIHsKICAgIHRoaXMuY20ub2ZmKCJjaGFuZ2UiLCB0aGlzLmNoYW5nZUhhbmRsZXIpOwogICAgdGhpcy5hbm5vdGF0aW9uLmNsZWFyKCk7CiAgfTsKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/search/search.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovLyBEZWZpbmUgc2VhcmNoIGNvbW1hbmRzLiBEZXBlbmRzIG9uIGRpYWxvZy5qcyBvciBhbm90aGVyCi8vIGltcGxlbWVudGF0aW9uIG9mIHRoZSBvcGVuRGlhbG9nIG1ldGhvZC4KCi8vIFJlcGxhY2Ugd29ya3MgYSBsaXR0bGUgb2RkbHkgLS0gaXQgd2lsbCBkbyB0aGUgcmVwbGFjZSBvbiB0aGUgbmV4dAovLyBDdHJsLUcgKG9yIHdoYXRldmVyIGlzIGJvdW5kIHRvIGZpbmROZXh0KSBwcmVzcy4gWW91IHByZXZlbnQgYQovLyByZXBsYWNlIGJ5IG1ha2luZyBzdXJlIHRoZSBtYXRjaCBpcyBubyBsb25nZXIgc2VsZWN0ZWQgd2hlbiBoaXR0aW5nCi8vIEN0cmwtRy4KCihmdW5jdGlvbihtb2QpIHsKICBpZiAodHlwZW9mIGV4cG9ydHMgPT0gIm9iamVjdCIgJiYgdHlwZW9mIG1vZHVsZSA9PSAib2JqZWN0IikgLy8gQ29tbW9uSlMKICAgIG1vZChyZXF1aXJlKCIuLi8uLi9saWIvY29kZW1pcnJvciIpLCByZXF1aXJlKCIuL3NlYXJjaGN1cnNvciIpLCByZXF1aXJlKCIuLi9kaWFsb2cvZGlhbG9nIikpOwogIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kKSAvLyBBTUQKICAgIGRlZmluZShbIi4uLy4uL2xpYi9jb2RlbWlycm9yIiwgIi4vc2VhcmNoY3Vyc29yIiwgIi4uL2RpYWxvZy9kaWFsb2ciXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CgogIGZ1bmN0aW9uIHNlYXJjaE92ZXJsYXkocXVlcnksIGNhc2VJbnNlbnNpdGl2ZSkgewogICAgaWYgKHR5cGVvZiBxdWVyeSA9PSAic3RyaW5nIikKICAgICAgcXVlcnkgPSBuZXcgUmVnRXhwKHF1ZXJ5LnJlcGxhY2UoL1tcLVxbXF1cL1x7XH1cKFwpXCpcK1w/XC5cXFxeXCRcfF0vZywgIlxcJCYiKSwgY2FzZUluc2Vuc2l0aXZlID8gImdpIiA6ICJnIik7CiAgICBlbHNlIGlmICghcXVlcnkuZ2xvYmFsKQogICAgICBxdWVyeSA9IG5ldyBSZWdFeHAocXVlcnkuc291cmNlLCBxdWVyeS5pZ25vcmVDYXNlID8gImdpIiA6ICJnIik7CgogICAgcmV0dXJuIHt0b2tlbjogZnVuY3Rpb24oc3RyZWFtKSB7CiAgICAgIHF1ZXJ5Lmxhc3RJbmRleCA9IHN0cmVhbS5wb3M7CiAgICAgIHZhciBtYXRjaCA9IHF1ZXJ5LmV4ZWMoc3RyZWFtLnN0cmluZyk7CiAgICAgIGlmIChtYXRjaCAmJiBtYXRjaC5pbmRleCA9PSBzdHJlYW0ucG9zKSB7CiAgICAgICAgc3RyZWFtLnBvcyArPSBtYXRjaFswXS5sZW5ndGggfHwgMTsKICAgICAgICByZXR1cm4gInNlYXJjaGluZyI7CiAgICAgIH0gZWxzZSBpZiAobWF0Y2gpIHsKICAgICAgICBzdHJlYW0ucG9zID0gbWF0Y2guaW5kZXg7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICB9CiAgICB9fTsKICB9CgogIGZ1bmN0aW9uIFNlYXJjaFN0YXRlKCkgewogICAgdGhpcy5wb3NGcm9tID0gdGhpcy5wb3NUbyA9IHRoaXMubGFzdFF1ZXJ5ID0gdGhpcy5xdWVyeSA9IG51bGw7CiAgICB0aGlzLm92ZXJsYXkgPSBudWxsOwogIH0KCiAgZnVuY3Rpb24gZ2V0U2VhcmNoU3RhdGUoY20pIHsKICAgIHJldHVybiBjbS5zdGF0ZS5zZWFyY2ggfHwgKGNtLnN0YXRlLnNlYXJjaCA9IG5ldyBTZWFyY2hTdGF0ZSgpKTsKICB9CgogIGZ1bmN0aW9uIHF1ZXJ5Q2FzZUluc2Vuc2l0aXZlKHF1ZXJ5KSB7CiAgICByZXR1cm4gdHlwZW9mIHF1ZXJ5ID09ICJzdHJpbmciICYmIHF1ZXJ5ID09IHF1ZXJ5LnRvTG93ZXJDYXNlKCk7CiAgfQoKICBmdW5jdGlvbiBnZXRTZWFyY2hDdXJzb3IoY20sIHF1ZXJ5LCBwb3MpIHsKICAgIC8vIEhldXJpc3RpYzogaWYgdGhlIHF1ZXJ5IHN0cmluZyBpcyBhbGwgbG93ZXJjYXNlLCBkbyBhIGNhc2UgaW5zZW5zaXRpdmUgc2VhcmNoLgogICAgcmV0dXJuIGNtLmdldFNlYXJjaEN1cnNvcihxdWVyeSwgcG9zLCBxdWVyeUNhc2VJbnNlbnNpdGl2ZShxdWVyeSkpOwogIH0KCiAgZnVuY3Rpb24gcGVyc2lzdGVudERpYWxvZyhjbSwgdGV4dCwgZGVmbHQsIG9uRW50ZXIsIG9uS2V5RG93bikgewogICAgY20ub3BlbkRpYWxvZyh0ZXh0LCBvbkVudGVyLCB7CiAgICAgIHZhbHVlOiBkZWZsdCwKICAgICAgc2VsZWN0VmFsdWVPbk9wZW46IHRydWUsCiAgICAgIGNsb3NlT25FbnRlcjogZmFsc2UsCiAgICAgIG9uQ2xvc2U6IGZ1bmN0aW9uKCkgeyBjbGVhclNlYXJjaChjbSk7IH0sCiAgICAgIG9uS2V5RG93bjogb25LZXlEb3duCiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIGRpYWxvZyhjbSwgdGV4dCwgc2hvcnRUZXh0LCBkZWZsdCwgZikgewogICAgaWYgKGNtLm9wZW5EaWFsb2cpIGNtLm9wZW5EaWFsb2codGV4dCwgZiwge3ZhbHVlOiBkZWZsdCwgc2VsZWN0VmFsdWVPbk9wZW46IHRydWV9KTsKICAgIGVsc2UgZihwcm9tcHQoc2hvcnRUZXh0LCBkZWZsdCkpOwogIH0KCiAgZnVuY3Rpb24gY29uZmlybURpYWxvZyhjbSwgdGV4dCwgc2hvcnRUZXh0LCBmcykgewogICAgaWYgKGNtLm9wZW5Db25maXJtKSBjbS5vcGVuQ29uZmlybSh0ZXh0LCBmcyk7CiAgICBlbHNlIGlmIChjb25maXJtKHNob3J0VGV4dCkpIGZzWzBdKCk7CiAgfQoKICBmdW5jdGlvbiBwYXJzZVN0cmluZyhzdHJpbmcpIHsKICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgvXFwoLikvZywgZnVuY3Rpb24oXywgY2gpIHsKICAgICAgaWYgKGNoID09ICJuIikgcmV0dXJuICJcbiIKICAgICAgaWYgKGNoID09ICJyIikgcmV0dXJuICJcciIKICAgICAgcmV0dXJuIGNoCiAgICB9KQogIH0KCiAgZnVuY3Rpb24gcGFyc2VRdWVyeShxdWVyeSkgewogICAgdmFyIGlzUkUgPSBxdWVyeS5tYXRjaCgvXlwvKC4qKVwvKFthLXpdKikkLyk7CiAgICBpZiAoaXNSRSkgewogICAgICB0cnkgeyBxdWVyeSA9IG5ldyBSZWdFeHAoaXNSRVsxXSwgaXNSRVsyXS5pbmRleE9mKCJpIikgPT0gLTEgPyAiIiA6ICJpIik7IH0KICAgICAgY2F0Y2goZSkge30gLy8gTm90IGEgcmVndWxhciBleHByZXNzaW9uIGFmdGVyIGFsbCwgZG8gYSBzdHJpbmcgc2VhcmNoCiAgICB9IGVsc2UgewogICAgICBxdWVyeSA9IHBhcnNlU3RyaW5nKHF1ZXJ5KQogICAgfQogICAgaWYgKHR5cGVvZiBxdWVyeSA9PSAic3RyaW5nIiA/IHF1ZXJ5ID09ICIiIDogcXVlcnkudGVzdCgiIikpCiAgICAgIHF1ZXJ5ID0gL3heLzsKICAgIHJldHVybiBxdWVyeTsKICB9CgogIHZhciBxdWVyeURpYWxvZyA9CiAgICAnU2VhcmNoOiA8aW5wdXQgdHlwZT0idGV4dCIgc3R5bGU9IndpZHRoOiAxMGVtIiBjbGFzcz0iQ29kZU1pcnJvci1zZWFyY2gtZmllbGQiLz4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjODg4IiBjbGFzcz0iQ29kZU1pcnJvci1zZWFyY2gtaGludCI+KFVzZSAvcmUvIHN5bnRheCBmb3IgcmVnZXhwIHNlYXJjaCk8L3NwYW4+JzsKCiAgZnVuY3Rpb24gc3RhcnRTZWFyY2goY20sIHN0YXRlLCBxdWVyeSkgewogICAgc3RhdGUucXVlcnlUZXh0ID0gcXVlcnk7CiAgICBzdGF0ZS5xdWVyeSA9IHBhcnNlUXVlcnkocXVlcnkpOwogICAgY20ucmVtb3ZlT3ZlcmxheShzdGF0ZS5vdmVybGF5LCBxdWVyeUNhc2VJbnNlbnNpdGl2ZShzdGF0ZS5xdWVyeSkpOwogICAgc3RhdGUub3ZlcmxheSA9IHNlYXJjaE92ZXJsYXkoc3RhdGUucXVlcnksIHF1ZXJ5Q2FzZUluc2Vuc2l0aXZlKHN0YXRlLnF1ZXJ5KSk7CiAgICBjbS5hZGRPdmVybGF5KHN0YXRlLm92ZXJsYXkpOwogICAgaWYgKGNtLnNob3dNYXRjaGVzT25TY3JvbGxiYXIpIHsKICAgICAgaWYgKHN0YXRlLmFubm90YXRlKSB7IHN0YXRlLmFubm90YXRlLmNsZWFyKCk7IHN0YXRlLmFubm90YXRlID0gbnVsbDsgfQogICAgICBzdGF0ZS5hbm5vdGF0ZSA9IGNtLnNob3dNYXRjaGVzT25TY3JvbGxiYXIoc3RhdGUucXVlcnksIHF1ZXJ5Q2FzZUluc2Vuc2l0aXZlKHN0YXRlLnF1ZXJ5KSk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBkb1NlYXJjaChjbSwgcmV2LCBwZXJzaXN0ZW50LCBpbW1lZGlhdGUpIHsKICAgIHZhciBzdGF0ZSA9IGdldFNlYXJjaFN0YXRlKGNtKTsKICAgIGlmIChzdGF0ZS5xdWVyeSkgcmV0dXJuIGZpbmROZXh0KGNtLCByZXYpOwogICAgdmFyIHEgPSBjbS5nZXRTZWxlY3Rpb24oKSB8fCBzdGF0ZS5sYXN0UXVlcnk7CiAgICBpZiAocGVyc2lzdGVudCAmJiBjbS5vcGVuRGlhbG9nKSB7CiAgICAgIHZhciBoaWRpbmcgPSBudWxsCiAgICAgIHZhciBzZWFyY2hOZXh0ID0gZnVuY3Rpb24ocXVlcnksIGV2ZW50KSB7CiAgICAgICAgQ29kZU1pcnJvci5lX3N0b3AoZXZlbnQpOwogICAgICAgIGlmICghcXVlcnkpIHJldHVybjsKICAgICAgICBpZiAocXVlcnkgIT0gc3RhdGUucXVlcnlUZXh0KSB7CiAgICAgICAgICBzdGFydFNlYXJjaChjbSwgc3RhdGUsIHF1ZXJ5KTsKICAgICAgICAgIHN0YXRlLnBvc0Zyb20gPSBzdGF0ZS5wb3NUbyA9IGNtLmdldEN1cnNvcigpOwogICAgICAgIH0KICAgICAgICBpZiAoaGlkaW5nKSBoaWRpbmcuc3R5bGUub3BhY2l0eSA9IDEKICAgICAgICBmaW5kTmV4dChjbSwgZXZlbnQuc2hpZnRLZXksIGZ1bmN0aW9uKF8sIHRvKSB7CiAgICAgICAgICB2YXIgZGlhbG9nCiAgICAgICAgICBpZiAodG8ubGluZSA8IDMgJiYgZG9jdW1lbnQucXVlcnlTZWxlY3RvciAmJgogICAgICAgICAgICAgIChkaWFsb2cgPSBjbS5kaXNwbGF5LndyYXBwZXIucXVlcnlTZWxlY3RvcigiLkNvZGVNaXJyb3ItZGlhbG9nIikpICYmCiAgICAgICAgICAgICAgZGlhbG9nLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmJvdHRvbSAtIDQgPiBjbS5jdXJzb3JDb29yZHModG8sICJ3aW5kb3ciKS50b3ApCiAgICAgICAgICAgIChoaWRpbmcgPSBkaWFsb2cpLnN0eWxlLm9wYWNpdHkgPSAuNAogICAgICAgIH0pCiAgICAgIH07CiAgICAgIHBlcnNpc3RlbnREaWFsb2coY20sIHF1ZXJ5RGlhbG9nLCBxLCBzZWFyY2hOZXh0LCBmdW5jdGlvbihldmVudCwgcXVlcnkpIHsKICAgICAgICB2YXIga2V5TmFtZSA9IENvZGVNaXJyb3Iua2V5TmFtZShldmVudCkKICAgICAgICB2YXIgY21kID0gQ29kZU1pcnJvci5rZXlNYXBbY20uZ2V0T3B0aW9uKCJrZXlNYXAiKV1ba2V5TmFtZV0KICAgICAgICBpZiAoIWNtZCkgY21kID0gY20uZ2V0T3B0aW9uKCdleHRyYUtleXMnKVtrZXlOYW1lXQogICAgICAgIGlmIChjbWQgPT0gImZpbmROZXh0IiB8fCBjbWQgPT0gImZpbmRQcmV2IiB8fAogICAgICAgICAgY21kID09ICJmaW5kUGVyc2lzdGVudE5leHQiIHx8IGNtZCA9PSAiZmluZFBlcnNpc3RlbnRQcmV2IikgewogICAgICAgICAgQ29kZU1pcnJvci5lX3N0b3AoZXZlbnQpOwogICAgICAgICAgc3RhcnRTZWFyY2goY20sIGdldFNlYXJjaFN0YXRlKGNtKSwgcXVlcnkpOwogICAgICAgICAgY20uZXhlY0NvbW1hbmQoY21kKTsKICAgICAgICB9IGVsc2UgaWYgKGNtZCA9PSAiZmluZCIgfHwgY21kID09ICJmaW5kUGVyc2lzdGVudCIpIHsKICAgICAgICAgIENvZGVNaXJyb3IuZV9zdG9wKGV2ZW50KTsKICAgICAgICAgIHNlYXJjaE5leHQocXVlcnksIGV2ZW50KTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICBpZiAoaW1tZWRpYXRlICYmIHEpIHsKICAgICAgICBzdGFydFNlYXJjaChjbSwgc3RhdGUsIHEpOwogICAgICAgIGZpbmROZXh0KGNtLCByZXYpOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBkaWFsb2coY20sIHF1ZXJ5RGlhbG9nLCAiU2VhcmNoIGZvcjoiLCBxLCBmdW5jdGlvbihxdWVyeSkgewogICAgICAgIGlmIChxdWVyeSAmJiAhc3RhdGUucXVlcnkpIGNtLm9wZXJhdGlvbihmdW5jdGlvbigpIHsKICAgICAgICAgIHN0YXJ0U2VhcmNoKGNtLCBzdGF0ZSwgcXVlcnkpOwogICAgICAgICAgc3RhdGUucG9zRnJvbSA9IHN0YXRlLnBvc1RvID0gY20uZ2V0Q3Vyc29yKCk7CiAgICAgICAgICBmaW5kTmV4dChjbSwgcmV2KTsKICAgICAgICB9KTsKICAgICAgfSk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBmaW5kTmV4dChjbSwgcmV2LCBjYWxsYmFjaykge2NtLm9wZXJhdGlvbihmdW5jdGlvbigpIHsKICAgIHZhciBzdGF0ZSA9IGdldFNlYXJjaFN0YXRlKGNtKTsKICAgIHZhciBjdXJzb3IgPSBnZXRTZWFyY2hDdXJzb3IoY20sIHN0YXRlLnF1ZXJ5LCByZXYgPyBzdGF0ZS5wb3NGcm9tIDogc3RhdGUucG9zVG8pOwogICAgaWYgKCFjdXJzb3IuZmluZChyZXYpKSB7CiAgICAgIGN1cnNvciA9IGdldFNlYXJjaEN1cnNvcihjbSwgc3RhdGUucXVlcnksIHJldiA/IENvZGVNaXJyb3IuUG9zKGNtLmxhc3RMaW5lKCkpIDogQ29kZU1pcnJvci5Qb3MoY20uZmlyc3RMaW5lKCksIDApKTsKICAgICAgaWYgKCFjdXJzb3IuZmluZChyZXYpKSByZXR1cm47CiAgICB9CiAgICBjbS5zZXRTZWxlY3Rpb24oY3Vyc29yLmZyb20oKSwgY3Vyc29yLnRvKCkpOwogICAgY20uc2Nyb2xsSW50b1ZpZXcoe2Zyb206IGN1cnNvci5mcm9tKCksIHRvOiBjdXJzb3IudG8oKX0sIDIwKTsKICAgIHN0YXRlLnBvc0Zyb20gPSBjdXJzb3IuZnJvbSgpOyBzdGF0ZS5wb3NUbyA9IGN1cnNvci50bygpOwogICAgaWYgKGNhbGxiYWNrKSBjYWxsYmFjayhjdXJzb3IuZnJvbSgpLCBjdXJzb3IudG8oKSkKICB9KTt9CgogIGZ1bmN0aW9uIGNsZWFyU2VhcmNoKGNtKSB7Y20ub3BlcmF0aW9uKGZ1bmN0aW9uKCkgewogICAgdmFyIHN0YXRlID0gZ2V0U2VhcmNoU3RhdGUoY20pOwogICAgc3RhdGUubGFzdFF1ZXJ5ID0gc3RhdGUucXVlcnk7CiAgICBpZiAoIXN0YXRlLnF1ZXJ5KSByZXR1cm47CiAgICBzdGF0ZS5xdWVyeSA9IHN0YXRlLnF1ZXJ5VGV4dCA9IG51bGw7CiAgICBjbS5yZW1vdmVPdmVybGF5KHN0YXRlLm92ZXJsYXkpOwogICAgaWYgKHN0YXRlLmFubm90YXRlKSB7IHN0YXRlLmFubm90YXRlLmNsZWFyKCk7IHN0YXRlLmFubm90YXRlID0gbnVsbDsgfQogIH0pO30KCiAgdmFyIHJlcGxhY2VRdWVyeURpYWxvZyA9CiAgICAnIDxpbnB1dCB0eXBlPSJ0ZXh0IiBzdHlsZT0id2lkdGg6IDEwZW0iIGNsYXNzPSJDb2RlTWlycm9yLXNlYXJjaC1maWVsZCIvPiA8c3BhbiBzdHlsZT0iY29sb3I6ICM4ODgiIGNsYXNzPSJDb2RlTWlycm9yLXNlYXJjaC1oaW50Ij4oVXNlIC9yZS8gc3ludGF4IGZvciByZWdleHAgc2VhcmNoKTwvc3Bhbj4nOwogIHZhciByZXBsYWNlbWVudFF1ZXJ5RGlhbG9nID0gJ1dpdGg6IDxpbnB1dCB0eXBlPSJ0ZXh0IiBzdHlsZT0id2lkdGg6IDEwZW0iIGNsYXNzPSJDb2RlTWlycm9yLXNlYXJjaC1maWVsZCIvPic7CiAgdmFyIGRvUmVwbGFjZUNvbmZpcm0gPSAiUmVwbGFjZT8gPGJ1dHRvbj5ZZXM8L2J1dHRvbj4gPGJ1dHRvbj5ObzwvYnV0dG9uPiA8YnV0dG9uPkFsbDwvYnV0dG9uPiA8YnV0dG9uPlN0b3A8L2J1dHRvbj4iOwoKICBmdW5jdGlvbiByZXBsYWNlQWxsKGNtLCBxdWVyeSwgdGV4dCkgewogICAgY20ub3BlcmF0aW9uKGZ1bmN0aW9uKCkgewogICAgICBmb3IgKHZhciBjdXJzb3IgPSBnZXRTZWFyY2hDdXJzb3IoY20sIHF1ZXJ5KTsgY3Vyc29yLmZpbmROZXh0KCk7KSB7CiAgICAgICAgaWYgKHR5cGVvZiBxdWVyeSAhPSAic3RyaW5nIikgewogICAgICAgICAgdmFyIG1hdGNoID0gY20uZ2V0UmFuZ2UoY3Vyc29yLmZyb20oKSwgY3Vyc29yLnRvKCkpLm1hdGNoKHF1ZXJ5KTsKICAgICAgICAgIGN1cnNvci5yZXBsYWNlKHRleHQucmVwbGFjZSgvXCQoXGQpL2csIGZ1bmN0aW9uKF8sIGkpIHtyZXR1cm4gbWF0Y2hbaV07fSkpOwogICAgICAgIH0gZWxzZSBjdXJzb3IucmVwbGFjZSh0ZXh0KTsKICAgICAgfQogICAgfSk7CiAgfQoKICBmdW5jdGlvbiByZXBsYWNlKGNtLCBhbGwpIHsKICAgIGlmIChjbS5nZXRPcHRpb24oInJlYWRPbmx5IikpIHJldHVybjsKICAgIHZhciBxdWVyeSA9IGNtLmdldFNlbGVjdGlvbigpIHx8IGdldFNlYXJjaFN0YXRlKGNtKS5sYXN0UXVlcnk7CiAgICB2YXIgZGlhbG9nVGV4dCA9IGFsbCA/ICJSZXBsYWNlIGFsbDoiIDogIlJlcGxhY2U6IgogICAgZGlhbG9nKGNtLCBkaWFsb2dUZXh0ICsgcmVwbGFjZVF1ZXJ5RGlhbG9nLCBkaWFsb2dUZXh0LCBxdWVyeSwgZnVuY3Rpb24ocXVlcnkpIHsKICAgICAgaWYgKCFxdWVyeSkgcmV0dXJuOwogICAgICBxdWVyeSA9IHBhcnNlUXVlcnkocXVlcnkpOwogICAgICBkaWFsb2coY20sIHJlcGxhY2VtZW50UXVlcnlEaWFsb2csICJSZXBsYWNlIHdpdGg6IiwgIiIsIGZ1bmN0aW9uKHRleHQpIHsKICAgICAgICB0ZXh0ID0gcGFyc2VTdHJpbmcodGV4dCkKICAgICAgICBpZiAoYWxsKSB7CiAgICAgICAgICByZXBsYWNlQWxsKGNtLCBxdWVyeSwgdGV4dCkKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY2xlYXJTZWFyY2goY20pOwogICAgICAgICAgdmFyIGN1cnNvciA9IGdldFNlYXJjaEN1cnNvcihjbSwgcXVlcnksIGNtLmdldEN1cnNvcigiZnJvbSIpKTsKICAgICAgICAgIHZhciBhZHZhbmNlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBzdGFydCA9IGN1cnNvci5mcm9tKCksIG1hdGNoOwogICAgICAgICAgICBpZiAoIShtYXRjaCA9IGN1cnNvci5maW5kTmV4dCgpKSkgewogICAgICAgICAgICAgIGN1cnNvciA9IGdldFNlYXJjaEN1cnNvcihjbSwgcXVlcnkpOwogICAgICAgICAgICAgIGlmICghKG1hdGNoID0gY3Vyc29yLmZpbmROZXh0KCkpIHx8CiAgICAgICAgICAgICAgICAgIChzdGFydCAmJiBjdXJzb3IuZnJvbSgpLmxpbmUgPT0gc3RhcnQubGluZSAmJiBjdXJzb3IuZnJvbSgpLmNoID09IHN0YXJ0LmNoKSkgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNtLnNldFNlbGVjdGlvbihjdXJzb3IuZnJvbSgpLCBjdXJzb3IudG8oKSk7CiAgICAgICAgICAgIGNtLnNjcm9sbEludG9WaWV3KHtmcm9tOiBjdXJzb3IuZnJvbSgpLCB0bzogY3Vyc29yLnRvKCl9KTsKICAgICAgICAgICAgY29uZmlybURpYWxvZyhjbSwgZG9SZXBsYWNlQ29uZmlybSwgIlJlcGxhY2U/IiwKICAgICAgICAgICAgICAgICAgICAgICAgICBbZnVuY3Rpb24oKSB7ZG9SZXBsYWNlKG1hdGNoKTt9LCBhZHZhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigpIHtyZXBsYWNlQWxsKGNtLCBxdWVyeSwgdGV4dCl9XSk7CiAgICAgICAgICB9OwogICAgICAgICAgdmFyIGRvUmVwbGFjZSA9IGZ1bmN0aW9uKG1hdGNoKSB7CiAgICAgICAgICAgIGN1cnNvci5yZXBsYWNlKHR5cGVvZiBxdWVyeSA9PSAic3RyaW5nIiA/IHRleHQgOgogICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0LnJlcGxhY2UoL1wkKFxkKS9nLCBmdW5jdGlvbihfLCBpKSB7cmV0dXJuIG1hdGNoW2ldO30pKTsKICAgICAgICAgICAgYWR2YW5jZSgpOwogICAgICAgICAgfTsKICAgICAgICAgIGFkdmFuY2UoKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfSk7CiAgfQoKICBDb2RlTWlycm9yLmNvbW1hbmRzLmZpbmQgPSBmdW5jdGlvbihjbSkge2NsZWFyU2VhcmNoKGNtKTsgZG9TZWFyY2goY20pO307CiAgQ29kZU1pcnJvci5jb21tYW5kcy5maW5kUGVyc2lzdGVudCA9IGZ1bmN0aW9uKGNtKSB7Y2xlYXJTZWFyY2goY20pOyBkb1NlYXJjaChjbSwgZmFsc2UsIHRydWUpO307CiAgQ29kZU1pcnJvci5jb21tYW5kcy5maW5kUGVyc2lzdGVudE5leHQgPSBmdW5jdGlvbihjbSkge2RvU2VhcmNoKGNtLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSk7fTsKICBDb2RlTWlycm9yLmNvbW1hbmRzLmZpbmRQZXJzaXN0ZW50UHJldiA9IGZ1bmN0aW9uKGNtKSB7ZG9TZWFyY2goY20sIHRydWUsIHRydWUsIHRydWUpO307CiAgQ29kZU1pcnJvci5jb21tYW5kcy5maW5kTmV4dCA9IGRvU2VhcmNoOwogIENvZGVNaXJyb3IuY29tbWFuZHMuZmluZFByZXYgPSBmdW5jdGlvbihjbSkge2RvU2VhcmNoKGNtLCB0cnVlKTt9OwogIENvZGVNaXJyb3IuY29tbWFuZHMuY2xlYXJTZWFyY2ggPSBjbGVhclNlYXJjaDsKICBDb2RlTWlycm9yLmNvbW1hbmRzLnJlcGxhY2UgPSByZXBsYWNlOwogIENvZGVNaXJyb3IuY29tbWFuZHMucmVwbGFjZUFsbCA9IGZ1bmN0aW9uKGNtKSB7cmVwbGFjZShjbSwgdHJ1ZSk7fTsKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/search/searchcursor.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CiAgdmFyIFBvcyA9IENvZGVNaXJyb3IuUG9zOwoKICBmdW5jdGlvbiBTZWFyY2hDdXJzb3IoZG9jLCBxdWVyeSwgcG9zLCBjYXNlRm9sZCkgewogICAgdGhpcy5hdE9jY3VycmVuY2UgPSBmYWxzZTsgdGhpcy5kb2MgPSBkb2M7CiAgICBpZiAoY2FzZUZvbGQgPT0gbnVsbCAmJiB0eXBlb2YgcXVlcnkgPT0gInN0cmluZyIpIGNhc2VGb2xkID0gZmFsc2U7CgogICAgcG9zID0gcG9zID8gZG9jLmNsaXBQb3MocG9zKSA6IFBvcygwLCAwKTsKICAgIHRoaXMucG9zID0ge2Zyb206IHBvcywgdG86IHBvc307CgogICAgLy8gVGhlIG1hdGNoZXMgbWV0aG9kIGlzIGZpbGxlZCBpbiBiYXNlZCBvbiB0aGUgdHlwZSBvZiBxdWVyeS4KICAgIC8vIEl0IHRha2VzIGEgcG9zaXRpb24gYW5kIGEgZGlyZWN0aW9uLCBhbmQgcmV0dXJucyBhbiBvYmplY3QKICAgIC8vIGRlc2NyaWJpbmcgdGhlIG5leHQgb2NjdXJyZW5jZSBvZiB0aGUgcXVlcnksIG9yIG51bGwgaWYgbm8KICAgIC8vIG1vcmUgbWF0Y2hlcyB3ZXJlIGZvdW5kLgogICAgaWYgKHR5cGVvZiBxdWVyeSAhPSAic3RyaW5nIikgeyAvLyBSZWdleHAgbWF0Y2gKICAgICAgaWYgKCFxdWVyeS5nbG9iYWwpIHF1ZXJ5ID0gbmV3IFJlZ0V4cChxdWVyeS5zb3VyY2UsIHF1ZXJ5Lmlnbm9yZUNhc2UgPyAiaWciIDogImciKTsKICAgICAgdGhpcy5tYXRjaGVzID0gZnVuY3Rpb24ocmV2ZXJzZSwgcG9zKSB7CiAgICAgICAgaWYgKHJldmVyc2UpIHsKICAgICAgICAgIHF1ZXJ5Lmxhc3RJbmRleCA9IDA7CiAgICAgICAgICB2YXIgbGluZSA9IGRvYy5nZXRMaW5lKHBvcy5saW5lKS5zbGljZSgwLCBwb3MuY2gpLCBjdXRPZmYgPSAwLCBtYXRjaCwgc3RhcnQ7CiAgICAgICAgICBmb3IgKDs7KSB7CiAgICAgICAgICAgIHF1ZXJ5Lmxhc3RJbmRleCA9IGN1dE9mZjsKICAgICAgICAgICAgdmFyIG5ld01hdGNoID0gcXVlcnkuZXhlYyhsaW5lKTsKICAgICAgICAgICAgaWYgKCFuZXdNYXRjaCkgYnJlYWs7CiAgICAgICAgICAgIG1hdGNoID0gbmV3TWF0Y2g7CiAgICAgICAgICAgIHN0YXJ0ID0gbWF0Y2guaW5kZXg7CiAgICAgICAgICAgIGN1dE9mZiA9IG1hdGNoLmluZGV4ICsgKG1hdGNoWzBdLmxlbmd0aCB8fCAxKTsKICAgICAgICAgICAgaWYgKGN1dE9mZiA9PSBsaW5lLmxlbmd0aCkgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICB2YXIgbWF0Y2hMZW4gPSAobWF0Y2ggJiYgbWF0Y2hbMF0ubGVuZ3RoKSB8fCAwOwogICAgICAgICAgaWYgKCFtYXRjaExlbikgewogICAgICAgICAgICBpZiAoc3RhcnQgPT0gMCAmJiBsaW5lLmxlbmd0aCA9PSAwKSB7bWF0Y2ggPSB1bmRlZmluZWQ7fQogICAgICAgICAgICBlbHNlIGlmIChzdGFydCAhPSBkb2MuZ2V0TGluZShwb3MubGluZSkubGVuZ3RoKSB7CiAgICAgICAgICAgICAgbWF0Y2hMZW4rKzsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBxdWVyeS5sYXN0SW5kZXggPSBwb3MuY2g7CiAgICAgICAgICB2YXIgbGluZSA9IGRvYy5nZXRMaW5lKHBvcy5saW5lKSwgbWF0Y2ggPSBxdWVyeS5leGVjKGxpbmUpOwogICAgICAgICAgdmFyIG1hdGNoTGVuID0gKG1hdGNoICYmIG1hdGNoWzBdLmxlbmd0aCkgfHwgMDsKICAgICAgICAgIHZhciBzdGFydCA9IG1hdGNoICYmIG1hdGNoLmluZGV4OwogICAgICAgICAgaWYgKHN0YXJ0ICsgbWF0Y2hMZW4gIT0gbGluZS5sZW5ndGggJiYgIW1hdGNoTGVuKSBtYXRjaExlbiA9IDE7CiAgICAgICAgfQogICAgICAgIGlmIChtYXRjaCAmJiBtYXRjaExlbikKICAgICAgICAgIHJldHVybiB7ZnJvbTogUG9zKHBvcy5saW5lLCBzdGFydCksCiAgICAgICAgICAgICAgICAgIHRvOiBQb3MocG9zLmxpbmUsIHN0YXJ0ICsgbWF0Y2hMZW4pLAogICAgICAgICAgICAgICAgICBtYXRjaDogbWF0Y2h9OwogICAgICB9OwogICAgfSBlbHNlIHsgLy8gU3RyaW5nIHF1ZXJ5CiAgICAgIHZhciBvcmlnUXVlcnkgPSBxdWVyeTsKICAgICAgaWYgKGNhc2VGb2xkKSBxdWVyeSA9IHF1ZXJ5LnRvTG93ZXJDYXNlKCk7CiAgICAgIHZhciBmb2xkID0gY2FzZUZvbGQgPyBmdW5jdGlvbihzdHIpe3JldHVybiBzdHIudG9Mb3dlckNhc2UoKTt9IDogZnVuY3Rpb24oc3RyKXtyZXR1cm4gc3RyO307CiAgICAgIHZhciB0YXJnZXQgPSBxdWVyeS5zcGxpdCgiXG4iKTsKICAgICAgLy8gRGlmZmVyZW50IG1ldGhvZHMgZm9yIHNpbmdsZS1saW5lIGFuZCBtdWx0aS1saW5lIHF1ZXJpZXMKICAgICAgaWYgKHRhcmdldC5sZW5ndGggPT0gMSkgewogICAgICAgIGlmICghcXVlcnkubGVuZ3RoKSB7CiAgICAgICAgICAvLyBFbXB0eSBzdHJpbmcgd291bGQgbWF0Y2ggYW55dGhpbmcgYW5kIG5ldmVyIHByb2dyZXNzLCBzbwogICAgICAgICAgLy8gd2UgZGVmaW5lIGl0IHRvIG1hdGNoIG5vdGhpbmcgaW5zdGVhZC4KICAgICAgICAgIHRoaXMubWF0Y2hlcyA9IGZ1bmN0aW9uKCkge307CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMubWF0Y2hlcyA9IGZ1bmN0aW9uKHJldmVyc2UsIHBvcykgewogICAgICAgICAgICBpZiAocmV2ZXJzZSkgewogICAgICAgICAgICAgIHZhciBvcmlnID0gZG9jLmdldExpbmUocG9zLmxpbmUpLnNsaWNlKDAsIHBvcy5jaCksIGxpbmUgPSBmb2xkKG9yaWcpOwogICAgICAgICAgICAgIHZhciBtYXRjaCA9IGxpbmUubGFzdEluZGV4T2YocXVlcnkpOwogICAgICAgICAgICAgIGlmIChtYXRjaCA+IC0xKSB7CiAgICAgICAgICAgICAgICBtYXRjaCA9IGFkanVzdFBvcyhvcmlnLCBsaW5lLCBtYXRjaCk7CiAgICAgICAgICAgICAgICByZXR1cm4ge2Zyb206IFBvcyhwb3MubGluZSwgbWF0Y2gpLCB0bzogUG9zKHBvcy5saW5lLCBtYXRjaCArIG9yaWdRdWVyeS5sZW5ndGgpfTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICB2YXIgb3JpZyA9IGRvYy5nZXRMaW5lKHBvcy5saW5lKS5zbGljZShwb3MuY2gpLCBsaW5lID0gZm9sZChvcmlnKTsKICAgICAgICAgICAgICAgdmFyIG1hdGNoID0gbGluZS5pbmRleE9mKHF1ZXJ5KTsKICAgICAgICAgICAgICAgaWYgKG1hdGNoID4gLTEpIHsKICAgICAgICAgICAgICAgICBtYXRjaCA9IGFkanVzdFBvcyhvcmlnLCBsaW5lLCBtYXRjaCkgKyBwb3MuY2g7CiAgICAgICAgICAgICAgICAgcmV0dXJuIHtmcm9tOiBQb3MocG9zLmxpbmUsIG1hdGNoKSwgdG86IFBvcyhwb3MubGluZSwgbWF0Y2ggKyBvcmlnUXVlcnkubGVuZ3RoKX07CiAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIG9yaWdUYXJnZXQgPSBvcmlnUXVlcnkuc3BsaXQoIlxuIik7CiAgICAgICAgdGhpcy5tYXRjaGVzID0gZnVuY3Rpb24ocmV2ZXJzZSwgcG9zKSB7CiAgICAgICAgICB2YXIgbGFzdCA9IHRhcmdldC5sZW5ndGggLSAxOwogICAgICAgICAgaWYgKHJldmVyc2UpIHsKICAgICAgICAgICAgaWYgKHBvcy5saW5lIC0gKHRhcmdldC5sZW5ndGggLSAxKSA8IGRvYy5maXJzdExpbmUoKSkgcmV0dXJuOwogICAgICAgICAgICBpZiAoZm9sZChkb2MuZ2V0TGluZShwb3MubGluZSkuc2xpY2UoMCwgb3JpZ1RhcmdldFtsYXN0XS5sZW5ndGgpKSAhPSB0YXJnZXRbdGFyZ2V0Lmxlbmd0aCAtIDFdKSByZXR1cm47CiAgICAgICAgICAgIHZhciB0byA9IFBvcyhwb3MubGluZSwgb3JpZ1RhcmdldFtsYXN0XS5sZW5ndGgpOwogICAgICAgICAgICBmb3IgKHZhciBsbiA9IHBvcy5saW5lIC0gMSwgaSA9IGxhc3QgLSAxOyBpID49IDE7IC0taSwgLS1sbikKICAgICAgICAgICAgICBpZiAodGFyZ2V0W2ldICE9IGZvbGQoZG9jLmdldExpbmUobG4pKSkgcmV0dXJuOwogICAgICAgICAgICB2YXIgbGluZSA9IGRvYy5nZXRMaW5lKGxuKSwgY3V0ID0gbGluZS5sZW5ndGggLSBvcmlnVGFyZ2V0WzBdLmxlbmd0aDsKICAgICAgICAgICAgaWYgKGZvbGQobGluZS5zbGljZShjdXQpKSAhPSB0YXJnZXRbMF0pIHJldHVybjsKICAgICAgICAgICAgcmV0dXJuIHtmcm9tOiBQb3MobG4sIGN1dCksIHRvOiB0b307CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAocG9zLmxpbmUgKyAodGFyZ2V0Lmxlbmd0aCAtIDEpID4gZG9jLmxhc3RMaW5lKCkpIHJldHVybjsKICAgICAgICAgICAgdmFyIGxpbmUgPSBkb2MuZ2V0TGluZShwb3MubGluZSksIGN1dCA9IGxpbmUubGVuZ3RoIC0gb3JpZ1RhcmdldFswXS5sZW5ndGg7CiAgICAgICAgICAgIGlmIChmb2xkKGxpbmUuc2xpY2UoY3V0KSkgIT0gdGFyZ2V0WzBdKSByZXR1cm47CiAgICAgICAgICAgIHZhciBmcm9tID0gUG9zKHBvcy5saW5lLCBjdXQpOwogICAgICAgICAgICBmb3IgKHZhciBsbiA9IHBvcy5saW5lICsgMSwgaSA9IDE7IGkgPCBsYXN0OyArK2ksICsrbG4pCiAgICAgICAgICAgICAgaWYgKHRhcmdldFtpXSAhPSBmb2xkKGRvYy5nZXRMaW5lKGxuKSkpIHJldHVybjsKICAgICAgICAgICAgaWYgKGZvbGQoZG9jLmdldExpbmUobG4pLnNsaWNlKDAsIG9yaWdUYXJnZXRbbGFzdF0ubGVuZ3RoKSkgIT0gdGFyZ2V0W2xhc3RdKSByZXR1cm47CiAgICAgICAgICAgIHJldHVybiB7ZnJvbTogZnJvbSwgdG86IFBvcyhsbiwgb3JpZ1RhcmdldFtsYXN0XS5sZW5ndGgpfTsKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICB9CiAgICB9CiAgfQoKICBTZWFyY2hDdXJzb3IucHJvdG90eXBlID0gewogICAgZmluZE5leHQ6IGZ1bmN0aW9uKCkge3JldHVybiB0aGlzLmZpbmQoZmFsc2UpO30sCiAgICBmaW5kUHJldmlvdXM6IGZ1bmN0aW9uKCkge3JldHVybiB0aGlzLmZpbmQodHJ1ZSk7fSwKCiAgICBmaW5kOiBmdW5jdGlvbihyZXZlcnNlKSB7CiAgICAgIHZhciBzZWxmID0gdGhpcywgcG9zID0gdGhpcy5kb2MuY2xpcFBvcyhyZXZlcnNlID8gdGhpcy5wb3MuZnJvbSA6IHRoaXMucG9zLnRvKTsKICAgICAgZnVuY3Rpb24gc2F2ZVBvc0FuZEZhaWwobGluZSkgewogICAgICAgIHZhciBwb3MgPSBQb3MobGluZSwgMCk7CiAgICAgICAgc2VsZi5wb3MgPSB7ZnJvbTogcG9zLCB0bzogcG9zfTsKICAgICAgICBzZWxmLmF0T2NjdXJyZW5jZSA9IGZhbHNlOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQoKICAgICAgZm9yICg7OykgewogICAgICAgIGlmICh0aGlzLnBvcyA9IHRoaXMubWF0Y2hlcyhyZXZlcnNlLCBwb3MpKSB7CiAgICAgICAgICB0aGlzLmF0T2NjdXJyZW5jZSA9IHRydWU7CiAgICAgICAgICByZXR1cm4gdGhpcy5wb3MubWF0Y2ggfHwgdHJ1ZTsKICAgICAgICB9CiAgICAgICAgaWYgKHJldmVyc2UpIHsKICAgICAgICAgIGlmICghcG9zLmxpbmUpIHJldHVybiBzYXZlUG9zQW5kRmFpbCgwKTsKICAgICAgICAgIHBvcyA9IFBvcyhwb3MubGluZS0xLCB0aGlzLmRvYy5nZXRMaW5lKHBvcy5saW5lLTEpLmxlbmd0aCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgdmFyIG1heExpbmUgPSB0aGlzLmRvYy5saW5lQ291bnQoKTsKICAgICAgICAgIGlmIChwb3MubGluZSA9PSBtYXhMaW5lIC0gMSkgcmV0dXJuIHNhdmVQb3NBbmRGYWlsKG1heExpbmUpOwogICAgICAgICAgcG9zID0gUG9zKHBvcy5saW5lICsgMSwgMCk7CiAgICAgICAgfQogICAgICB9CiAgICB9LAoKICAgIGZyb206IGZ1bmN0aW9uKCkge2lmICh0aGlzLmF0T2NjdXJyZW5jZSkgcmV0dXJuIHRoaXMucG9zLmZyb207fSwKICAgIHRvOiBmdW5jdGlvbigpIHtpZiAodGhpcy5hdE9jY3VycmVuY2UpIHJldHVybiB0aGlzLnBvcy50bzt9LAoKICAgIHJlcGxhY2U6IGZ1bmN0aW9uKG5ld1RleHQsIG9yaWdpbikgewogICAgICBpZiAoIXRoaXMuYXRPY2N1cnJlbmNlKSByZXR1cm47CiAgICAgIHZhciBsaW5lcyA9IENvZGVNaXJyb3Iuc3BsaXRMaW5lcyhuZXdUZXh0KTsKICAgICAgdGhpcy5kb2MucmVwbGFjZVJhbmdlKGxpbmVzLCB0aGlzLnBvcy5mcm9tLCB0aGlzLnBvcy50bywgb3JpZ2luKTsKICAgICAgdGhpcy5wb3MudG8gPSBQb3ModGhpcy5wb3MuZnJvbS5saW5lICsgbGluZXMubGVuZ3RoIC0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgbGluZXNbbGluZXMubGVuZ3RoIC0gMV0ubGVuZ3RoICsgKGxpbmVzLmxlbmd0aCA9PSAxID8gdGhpcy5wb3MuZnJvbS5jaCA6IDApKTsKICAgIH0KICB9OwoKICAvLyBNYXBzIGEgcG9zaXRpb24gaW4gYSBjYXNlLWZvbGRlZCBsaW5lIGJhY2sgdG8gYSBwb3NpdGlvbiBpbiB0aGUgb3JpZ2luYWwgbGluZQogIC8vIChjb21wZW5zYXRpbmcgZm9yIGNvZGVwb2ludHMgaW5jcmVhc2luZyBpbiBudW1iZXIgZHVyaW5nIGZvbGRpbmcpCiAgZnVuY3Rpb24gYWRqdXN0UG9zKG9yaWcsIGZvbGRlZCwgcG9zKSB7CiAgICBpZiAob3JpZy5sZW5ndGggPT0gZm9sZGVkLmxlbmd0aCkgcmV0dXJuIHBvczsKICAgIGZvciAodmFyIHBvczEgPSBNYXRoLm1pbihwb3MsIG9yaWcubGVuZ3RoKTs7KSB7CiAgICAgIHZhciBsZW4xID0gb3JpZy5zbGljZSgwLCBwb3MxKS50b0xvd2VyQ2FzZSgpLmxlbmd0aDsKICAgICAgaWYgKGxlbjEgPCBwb3MpICsrcG9zMTsKICAgICAgZWxzZSBpZiAobGVuMSA+IHBvcykgLS1wb3MxOwogICAgICBlbHNlIHJldHVybiBwb3MxOwogICAgfQogIH0KCiAgQ29kZU1pcnJvci5kZWZpbmVFeHRlbnNpb24oImdldFNlYXJjaEN1cnNvciIsIGZ1bmN0aW9uKHF1ZXJ5LCBwb3MsIGNhc2VGb2xkKSB7CiAgICByZXR1cm4gbmV3IFNlYXJjaEN1cnNvcih0aGlzLmRvYywgcXVlcnksIHBvcywgY2FzZUZvbGQpOwogIH0pOwogIENvZGVNaXJyb3IuZGVmaW5lRG9jRXh0ZW5zaW9uKCJnZXRTZWFyY2hDdXJzb3IiLCBmdW5jdGlvbihxdWVyeSwgcG9zLCBjYXNlRm9sZCkgewogICAgcmV0dXJuIG5ldyBTZWFyY2hDdXJzb3IodGhpcywgcXVlcnksIHBvcywgY2FzZUZvbGQpOwogIH0pOwoKICBDb2RlTWlycm9yLmRlZmluZUV4dGVuc2lvbigic2VsZWN0TWF0Y2hlcyIsIGZ1bmN0aW9uKHF1ZXJ5LCBjYXNlRm9sZCkgewogICAgdmFyIHJhbmdlcyA9IFtdOwogICAgdmFyIGN1ciA9IHRoaXMuZ2V0U2VhcmNoQ3Vyc29yKHF1ZXJ5LCB0aGlzLmdldEN1cnNvcigiZnJvbSIpLCBjYXNlRm9sZCk7CiAgICB3aGlsZSAoY3VyLmZpbmROZXh0KCkpIHsKICAgICAgaWYgKENvZGVNaXJyb3IuY21wUG9zKGN1ci50bygpLCB0aGlzLmdldEN1cnNvcigidG8iKSkgPiAwKSBicmVhazsKICAgICAgcmFuZ2VzLnB1c2goe2FuY2hvcjogY3VyLmZyb20oKSwgaGVhZDogY3VyLnRvKCl9KTsKICAgIH0KICAgIGlmIChyYW5nZXMubGVuZ3RoKQogICAgICB0aGlzLnNldFNlbGVjdGlvbnMocmFuZ2VzLCAwKTsKICB9KTsKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/selection/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/selection/active-line.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovLyBCZWNhdXNlIHNvbWV0aW1lcyB5b3UgbmVlZCB0byBzdHlsZSB0aGUgY3Vyc29yJ3MgbGluZS4KLy8KLy8gQWRkcyBhbiBvcHRpb24gJ3N0eWxlQWN0aXZlTGluZScgd2hpY2gsIHdoZW4gZW5hYmxlZCwgZ2l2ZXMgdGhlCi8vIGFjdGl2ZSBsaW5lJ3Mgd3JhcHBpbmcgPGRpdj4gdGhlIENTUyBjbGFzcyAiQ29kZU1pcnJvci1hY3RpdmVsaW5lIiwKLy8gYW5kIGdpdmVzIGl0cyBiYWNrZ3JvdW5kIDxkaXY+IHRoZSBjbGFzcyAiQ29kZU1pcnJvci1hY3RpdmVsaW5lLWJhY2tncm91bmQiLgoKKGZ1bmN0aW9uKG1vZCkgewogIGlmICh0eXBlb2YgZXhwb3J0cyA9PSAib2JqZWN0IiAmJiB0eXBlb2YgbW9kdWxlID09ICJvYmplY3QiKSAvLyBDb21tb25KUwogICAgbW9kKHJlcXVpcmUoIi4uLy4uL2xpYi9jb2RlbWlycm9yIikpOwogIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kKSAvLyBBTUQKICAgIGRlZmluZShbIi4uLy4uL2xpYi9jb2RlbWlycm9yIl0sIG1vZCk7CiAgZWxzZSAvLyBQbGFpbiBicm93c2VyIGVudgogICAgbW9kKENvZGVNaXJyb3IpOwp9KShmdW5jdGlvbihDb2RlTWlycm9yKSB7CiAgInVzZSBzdHJpY3QiOwogIHZhciBXUkFQX0NMQVNTID0gIkNvZGVNaXJyb3ItYWN0aXZlbGluZSI7CiAgdmFyIEJBQ0tfQ0xBU1MgPSAiQ29kZU1pcnJvci1hY3RpdmVsaW5lLWJhY2tncm91bmQiOwogIHZhciBHVVRUX0NMQVNTID0gIkNvZGVNaXJyb3ItYWN0aXZlbGluZS1ndXR0ZXIiOwoKICBDb2RlTWlycm9yLmRlZmluZU9wdGlvbigic3R5bGVBY3RpdmVMaW5lIiwgZmFsc2UsIGZ1bmN0aW9uKGNtLCB2YWwsIG9sZCkgewogICAgdmFyIHByZXYgPSBvbGQgJiYgb2xkICE9IENvZGVNaXJyb3IuSW5pdDsKICAgIGlmICh2YWwgJiYgIXByZXYpIHsKICAgICAgY20uc3RhdGUuYWN0aXZlTGluZXMgPSBbXTsKICAgICAgdXBkYXRlQWN0aXZlTGluZXMoY20sIGNtLmxpc3RTZWxlY3Rpb25zKCkpOwogICAgICBjbS5vbigiYmVmb3JlU2VsZWN0aW9uQ2hhbmdlIiwgc2VsZWN0aW9uQ2hhbmdlKTsKICAgIH0gZWxzZSBpZiAoIXZhbCAmJiBwcmV2KSB7CiAgICAgIGNtLm9mZigiYmVmb3JlU2VsZWN0aW9uQ2hhbmdlIiwgc2VsZWN0aW9uQ2hhbmdlKTsKICAgICAgY2xlYXJBY3RpdmVMaW5lcyhjbSk7CiAgICAgIGRlbGV0ZSBjbS5zdGF0ZS5hY3RpdmVMaW5lczsKICAgIH0KICB9KTsKCiAgZnVuY3Rpb24gY2xlYXJBY3RpdmVMaW5lcyhjbSkgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjbS5zdGF0ZS5hY3RpdmVMaW5lcy5sZW5ndGg7IGkrKykgewogICAgICBjbS5yZW1vdmVMaW5lQ2xhc3MoY20uc3RhdGUuYWN0aXZlTGluZXNbaV0sICJ3cmFwIiwgV1JBUF9DTEFTUyk7CiAgICAgIGNtLnJlbW92ZUxpbmVDbGFzcyhjbS5zdGF0ZS5hY3RpdmVMaW5lc1tpXSwgImJhY2tncm91bmQiLCBCQUNLX0NMQVNTKTsKICAgICAgY20ucmVtb3ZlTGluZUNsYXNzKGNtLnN0YXRlLmFjdGl2ZUxpbmVzW2ldLCAiZ3V0dGVyIiwgR1VUVF9DTEFTUyk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBzYW1lQXJyYXkoYSwgYikgewogICAgaWYgKGEubGVuZ3RoICE9IGIubGVuZ3RoKSByZXR1cm4gZmFsc2U7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspCiAgICAgIGlmIChhW2ldICE9IGJbaV0pIHJldHVybiBmYWxzZTsKICAgIHJldHVybiB0cnVlOwogIH0KCiAgZnVuY3Rpb24gdXBkYXRlQWN0aXZlTGluZXMoY20sIHJhbmdlcykgewogICAgdmFyIGFjdGl2ZSA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIHJhbmdlID0gcmFuZ2VzW2ldOwogICAgICBpZiAoIXJhbmdlLmVtcHR5KCkpIGNvbnRpbnVlOwogICAgICB2YXIgbGluZSA9IGNtLmdldExpbmVIYW5kbGVWaXN1YWxTdGFydChyYW5nZS5oZWFkLmxpbmUpOwogICAgICBpZiAoYWN0aXZlW2FjdGl2ZS5sZW5ndGggLSAxXSAhPSBsaW5lKSBhY3RpdmUucHVzaChsaW5lKTsKICAgIH0KICAgIGlmIChzYW1lQXJyYXkoY20uc3RhdGUuYWN0aXZlTGluZXMsIGFjdGl2ZSkpIHJldHVybjsKICAgIGNtLm9wZXJhdGlvbihmdW5jdGlvbigpIHsKICAgICAgY2xlYXJBY3RpdmVMaW5lcyhjbSk7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYWN0aXZlLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgY20uYWRkTGluZUNsYXNzKGFjdGl2ZVtpXSwgIndyYXAiLCBXUkFQX0NMQVNTKTsKICAgICAgICBjbS5hZGRMaW5lQ2xhc3MoYWN0aXZlW2ldLCAiYmFja2dyb3VuZCIsIEJBQ0tfQ0xBU1MpOwogICAgICAgIGNtLmFkZExpbmVDbGFzcyhhY3RpdmVbaV0sICJndXR0ZXIiLCBHVVRUX0NMQVNTKTsKICAgICAgfQogICAgICBjbS5zdGF0ZS5hY3RpdmVMaW5lcyA9IGFjdGl2ZTsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gc2VsZWN0aW9uQ2hhbmdlKGNtLCBzZWwpIHsKICAgIHVwZGF0ZUFjdGl2ZUxpbmVzKGNtLCBzZWwucmFuZ2VzKTsKICB9Cn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/selection/mark-selection.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovLyBCZWNhdXNlIHNvbWV0aW1lcyB5b3UgbmVlZCB0byBtYXJrIHRoZSBzZWxlY3RlZCAqdGV4dCouCi8vCi8vIEFkZHMgYW4gb3B0aW9uICdzdHlsZVNlbGVjdGVkVGV4dCcgd2hpY2gsIHdoZW4gZW5hYmxlZCwgZ2l2ZXMKLy8gc2VsZWN0ZWQgdGV4dCB0aGUgQ1NTIGNsYXNzIGdpdmVuIGFzIG9wdGlvbiB2YWx1ZSwgb3IKLy8gIkNvZGVNaXJyb3Itc2VsZWN0ZWR0ZXh0IiB3aGVuIHRoZSB2YWx1ZSBpcyBub3QgYSBzdHJpbmcuCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CgogIENvZGVNaXJyb3IuZGVmaW5lT3B0aW9uKCJzdHlsZVNlbGVjdGVkVGV4dCIsIGZhbHNlLCBmdW5jdGlvbihjbSwgdmFsLCBvbGQpIHsKICAgIHZhciBwcmV2ID0gb2xkICYmIG9sZCAhPSBDb2RlTWlycm9yLkluaXQ7CiAgICBpZiAodmFsICYmICFwcmV2KSB7CiAgICAgIGNtLnN0YXRlLm1hcmtlZFNlbGVjdGlvbiA9IFtdOwogICAgICBjbS5zdGF0ZS5tYXJrZWRTZWxlY3Rpb25TdHlsZSA9IHR5cGVvZiB2YWwgPT0gInN0cmluZyIgPyB2YWwgOiAiQ29kZU1pcnJvci1zZWxlY3RlZHRleHQiOwogICAgICByZXNldChjbSk7CiAgICAgIGNtLm9uKCJjdXJzb3JBY3Rpdml0eSIsIG9uQ3Vyc29yQWN0aXZpdHkpOwogICAgICBjbS5vbigiY2hhbmdlIiwgb25DaGFuZ2UpOwogICAgfSBlbHNlIGlmICghdmFsICYmIHByZXYpIHsKICAgICAgY20ub2ZmKCJjdXJzb3JBY3Rpdml0eSIsIG9uQ3Vyc29yQWN0aXZpdHkpOwogICAgICBjbS5vZmYoImNoYW5nZSIsIG9uQ2hhbmdlKTsKICAgICAgY2xlYXIoY20pOwogICAgICBjbS5zdGF0ZS5tYXJrZWRTZWxlY3Rpb24gPSBjbS5zdGF0ZS5tYXJrZWRTZWxlY3Rpb25TdHlsZSA9IG51bGw7CiAgICB9CiAgfSk7CgogIGZ1bmN0aW9uIG9uQ3Vyc29yQWN0aXZpdHkoY20pIHsKICAgIGNtLm9wZXJhdGlvbihmdW5jdGlvbigpIHsgdXBkYXRlKGNtKTsgfSk7CiAgfQoKICBmdW5jdGlvbiBvbkNoYW5nZShjbSkgewogICAgaWYgKGNtLnN0YXRlLm1hcmtlZFNlbGVjdGlvbi5sZW5ndGgpCiAgICAgIGNtLm9wZXJhdGlvbihmdW5jdGlvbigpIHsgY2xlYXIoY20pOyB9KTsKICB9CgogIHZhciBDSFVOS19TSVpFID0gODsKICB2YXIgUG9zID0gQ29kZU1pcnJvci5Qb3M7CiAgdmFyIGNtcCA9IENvZGVNaXJyb3IuY21wUG9zOwoKICBmdW5jdGlvbiBjb3ZlclJhbmdlKGNtLCBmcm9tLCB0bywgYWRkQXQpIHsKICAgIGlmIChjbXAoZnJvbSwgdG8pID09IDApIHJldHVybjsKICAgIHZhciBhcnJheSA9IGNtLnN0YXRlLm1hcmtlZFNlbGVjdGlvbjsKICAgIHZhciBjbHMgPSBjbS5zdGF0ZS5tYXJrZWRTZWxlY3Rpb25TdHlsZTsKICAgIGZvciAodmFyIGxpbmUgPSBmcm9tLmxpbmU7OykgewogICAgICB2YXIgc3RhcnQgPSBsaW5lID09IGZyb20ubGluZSA/IGZyb20gOiBQb3MobGluZSwgMCk7CiAgICAgIHZhciBlbmRMaW5lID0gbGluZSArIENIVU5LX1NJWkUsIGF0RW5kID0gZW5kTGluZSA+PSB0by5saW5lOwogICAgICB2YXIgZW5kID0gYXRFbmQgPyB0byA6IFBvcyhlbmRMaW5lLCAwKTsKICAgICAgdmFyIG1hcmsgPSBjbS5tYXJrVGV4dChzdGFydCwgZW5kLCB7Y2xhc3NOYW1lOiBjbHN9KTsKICAgICAgaWYgKGFkZEF0ID09IG51bGwpIGFycmF5LnB1c2gobWFyayk7CiAgICAgIGVsc2UgYXJyYXkuc3BsaWNlKGFkZEF0KyssIDAsIG1hcmspOwogICAgICBpZiAoYXRFbmQpIGJyZWFrOwogICAgICBsaW5lID0gZW5kTGluZTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGNsZWFyKGNtKSB7CiAgICB2YXIgYXJyYXkgPSBjbS5zdGF0ZS5tYXJrZWRTZWxlY3Rpb247CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgKytpKSBhcnJheVtpXS5jbGVhcigpOwogICAgYXJyYXkubGVuZ3RoID0gMDsKICB9CgogIGZ1bmN0aW9uIHJlc2V0KGNtKSB7CiAgICBjbGVhcihjbSk7CiAgICB2YXIgcmFuZ2VzID0gY20ubGlzdFNlbGVjdGlvbnMoKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSsrKQogICAgICBjb3ZlclJhbmdlKGNtLCByYW5nZXNbaV0uZnJvbSgpLCByYW5nZXNbaV0udG8oKSk7CiAgfQoKICBmdW5jdGlvbiB1cGRhdGUoY20pIHsKICAgIGlmICghY20uc29tZXRoaW5nU2VsZWN0ZWQoKSkgcmV0dXJuIGNsZWFyKGNtKTsKICAgIGlmIChjbS5saXN0U2VsZWN0aW9ucygpLmxlbmd0aCA+IDEpIHJldHVybiByZXNldChjbSk7CgogICAgdmFyIGZyb20gPSBjbS5nZXRDdXJzb3IoInN0YXJ0IiksIHRvID0gY20uZ2V0Q3Vyc29yKCJlbmQiKTsKCiAgICB2YXIgYXJyYXkgPSBjbS5zdGF0ZS5tYXJrZWRTZWxlY3Rpb247CiAgICBpZiAoIWFycmF5Lmxlbmd0aCkgcmV0dXJuIGNvdmVyUmFuZ2UoY20sIGZyb20sIHRvKTsKCiAgICB2YXIgY292ZXJTdGFydCA9IGFycmF5WzBdLmZpbmQoKSwgY292ZXJFbmQgPSBhcnJheVthcnJheS5sZW5ndGggLSAxXS5maW5kKCk7CiAgICBpZiAoIWNvdmVyU3RhcnQgfHwgIWNvdmVyRW5kIHx8IHRvLmxpbmUgLSBmcm9tLmxpbmUgPCBDSFVOS19TSVpFIHx8CiAgICAgICAgY21wKGZyb20sIGNvdmVyRW5kLnRvKSA+PSAwIHx8IGNtcCh0bywgY292ZXJTdGFydC5mcm9tKSA8PSAwKQogICAgICByZXR1cm4gcmVzZXQoY20pOwoKICAgIHdoaWxlIChjbXAoZnJvbSwgY292ZXJTdGFydC5mcm9tKSA+IDApIHsKICAgICAgYXJyYXkuc2hpZnQoKS5jbGVhcigpOwogICAgICBjb3ZlclN0YXJ0ID0gYXJyYXlbMF0uZmluZCgpOwogICAgfQogICAgaWYgKGNtcChmcm9tLCBjb3ZlclN0YXJ0LmZyb20pIDwgMCkgewogICAgICBpZiAoY292ZXJTdGFydC50by5saW5lIC0gZnJvbS5saW5lIDwgQ0hVTktfU0laRSkgewogICAgICAgIGFycmF5LnNoaWZ0KCkuY2xlYXIoKTsKICAgICAgICBjb3ZlclJhbmdlKGNtLCBmcm9tLCBjb3ZlclN0YXJ0LnRvLCAwKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBjb3ZlclJhbmdlKGNtLCBmcm9tLCBjb3ZlclN0YXJ0LmZyb20sIDApOwogICAgICB9CiAgICB9CgogICAgd2hpbGUgKGNtcCh0bywgY292ZXJFbmQudG8pIDwgMCkgewogICAgICBhcnJheS5wb3AoKS5jbGVhcigpOwogICAgICBjb3ZlckVuZCA9IGFycmF5W2FycmF5Lmxlbmd0aCAtIDFdLmZpbmQoKTsKICAgIH0KICAgIGlmIChjbXAodG8sIGNvdmVyRW5kLnRvKSA+IDApIHsKICAgICAgaWYgKHRvLmxpbmUgLSBjb3ZlckVuZC5mcm9tLmxpbmUgPCBDSFVOS19TSVpFKSB7CiAgICAgICAgYXJyYXkucG9wKCkuY2xlYXIoKTsKICAgICAgICBjb3ZlclJhbmdlKGNtLCBjb3ZlckVuZC5mcm9tLCB0byk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY292ZXJSYW5nZShjbSwgY292ZXJFbmQudG8sIHRvKTsKICAgICAgfQogICAgfQogIH0KfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/selection/selection-pointer.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CgogIENvZGVNaXJyb3IuZGVmaW5lT3B0aW9uKCJzZWxlY3Rpb25Qb2ludGVyIiwgZmFsc2UsIGZ1bmN0aW9uKGNtLCB2YWwpIHsKICAgIHZhciBkYXRhID0gY20uc3RhdGUuc2VsZWN0aW9uUG9pbnRlcjsKICAgIGlmIChkYXRhKSB7CiAgICAgIENvZGVNaXJyb3Iub2ZmKGNtLmdldFdyYXBwZXJFbGVtZW50KCksICJtb3VzZW1vdmUiLCBkYXRhLm1vdXNlbW92ZSk7CiAgICAgIENvZGVNaXJyb3Iub2ZmKGNtLmdldFdyYXBwZXJFbGVtZW50KCksICJtb3VzZW91dCIsIGRhdGEubW91c2VvdXQpOwogICAgICBDb2RlTWlycm9yLm9mZih3aW5kb3csICJzY3JvbGwiLCBkYXRhLndpbmRvd1Njcm9sbCk7CiAgICAgIGNtLm9mZigiY3Vyc29yQWN0aXZpdHkiLCByZXNldCk7CiAgICAgIGNtLm9mZigic2Nyb2xsIiwgcmVzZXQpOwogICAgICBjbS5zdGF0ZS5zZWxlY3Rpb25Qb2ludGVyID0gbnVsbDsKICAgICAgY20uZGlzcGxheS5saW5lRGl2LnN0eWxlLmN1cnNvciA9ICIiOwogICAgfQogICAgaWYgKHZhbCkgewogICAgICBkYXRhID0gY20uc3RhdGUuc2VsZWN0aW9uUG9pbnRlciA9IHsKICAgICAgICB2YWx1ZTogdHlwZW9mIHZhbCA9PSAic3RyaW5nIiA/IHZhbCA6ICJkZWZhdWx0IiwKICAgICAgICBtb3VzZW1vdmU6IGZ1bmN0aW9uKGV2ZW50KSB7IG1vdXNlbW92ZShjbSwgZXZlbnQpOyB9LAogICAgICAgIG1vdXNlb3V0OiBmdW5jdGlvbihldmVudCkgeyBtb3VzZW91dChjbSwgZXZlbnQpOyB9LAogICAgICAgIHdpbmRvd1Njcm9sbDogZnVuY3Rpb24oKSB7IHJlc2V0KGNtKTsgfSwKICAgICAgICByZWN0czogbnVsbCwKICAgICAgICBtb3VzZVg6IG51bGwsIG1vdXNlWTogbnVsbCwKICAgICAgICB3aWxsVXBkYXRlOiBmYWxzZQogICAgICB9OwogICAgICBDb2RlTWlycm9yLm9uKGNtLmdldFdyYXBwZXJFbGVtZW50KCksICJtb3VzZW1vdmUiLCBkYXRhLm1vdXNlbW92ZSk7CiAgICAgIENvZGVNaXJyb3Iub24oY20uZ2V0V3JhcHBlckVsZW1lbnQoKSwgIm1vdXNlb3V0IiwgZGF0YS5tb3VzZW91dCk7CiAgICAgIENvZGVNaXJyb3Iub24od2luZG93LCAic2Nyb2xsIiwgZGF0YS53aW5kb3dTY3JvbGwpOwogICAgICBjbS5vbigiY3Vyc29yQWN0aXZpdHkiLCByZXNldCk7CiAgICAgIGNtLm9uKCJzY3JvbGwiLCByZXNldCk7CiAgICB9CiAgfSk7CgogIGZ1bmN0aW9uIG1vdXNlbW92ZShjbSwgZXZlbnQpIHsKICAgIHZhciBkYXRhID0gY20uc3RhdGUuc2VsZWN0aW9uUG9pbnRlcjsKICAgIGlmIChldmVudC5idXR0b25zID09IG51bGwgPyBldmVudC53aGljaCA6IGV2ZW50LmJ1dHRvbnMpIHsKICAgICAgZGF0YS5tb3VzZVggPSBkYXRhLm1vdXNlWSA9IG51bGw7CiAgICB9IGVsc2UgewogICAgICBkYXRhLm1vdXNlWCA9IGV2ZW50LmNsaWVudFg7CiAgICAgIGRhdGEubW91c2VZID0gZXZlbnQuY2xpZW50WTsKICAgIH0KICAgIHNjaGVkdWxlVXBkYXRlKGNtKTsKICB9CgogIGZ1bmN0aW9uIG1vdXNlb3V0KGNtLCBldmVudCkgewogICAgaWYgKCFjbS5nZXRXcmFwcGVyRWxlbWVudCgpLmNvbnRhaW5zKGV2ZW50LnJlbGF0ZWRUYXJnZXQpKSB7CiAgICAgIHZhciBkYXRhID0gY20uc3RhdGUuc2VsZWN0aW9uUG9pbnRlcjsKICAgICAgZGF0YS5tb3VzZVggPSBkYXRhLm1vdXNlWSA9IG51bGw7CiAgICAgIHNjaGVkdWxlVXBkYXRlKGNtKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHJlc2V0KGNtKSB7CiAgICBjbS5zdGF0ZS5zZWxlY3Rpb25Qb2ludGVyLnJlY3RzID0gbnVsbDsKICAgIHNjaGVkdWxlVXBkYXRlKGNtKTsKICB9CgogIGZ1bmN0aW9uIHNjaGVkdWxlVXBkYXRlKGNtKSB7CiAgICBpZiAoIWNtLnN0YXRlLnNlbGVjdGlvblBvaW50ZXIud2lsbFVwZGF0ZSkgewogICAgICBjbS5zdGF0ZS5zZWxlY3Rpb25Qb2ludGVyLndpbGxVcGRhdGUgPSB0cnVlOwogICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgIHVwZGF0ZShjbSk7CiAgICAgICAgY20uc3RhdGUuc2VsZWN0aW9uUG9pbnRlci53aWxsVXBkYXRlID0gZmFsc2U7CiAgICAgIH0sIDUwKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHVwZGF0ZShjbSkgewogICAgdmFyIGRhdGEgPSBjbS5zdGF0ZS5zZWxlY3Rpb25Qb2ludGVyOwogICAgaWYgKCFkYXRhKSByZXR1cm47CiAgICBpZiAoZGF0YS5yZWN0cyA9PSBudWxsICYmIGRhdGEubW91c2VYICE9IG51bGwpIHsKICAgICAgZGF0YS5yZWN0cyA9IFtdOwogICAgICBpZiAoY20uc29tZXRoaW5nU2VsZWN0ZWQoKSkgewogICAgICAgIGZvciAodmFyIHNlbCA9IGNtLmRpc3BsYXkuc2VsZWN0aW9uRGl2LmZpcnN0Q2hpbGQ7IHNlbDsgc2VsID0gc2VsLm5leHRTaWJsaW5nKQogICAgICAgICAgZGF0YS5yZWN0cy5wdXNoKHNlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSk7CiAgICAgIH0KICAgIH0KICAgIHZhciBpbnNpZGUgPSBmYWxzZTsKICAgIGlmIChkYXRhLm1vdXNlWCAhPSBudWxsKSBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGEucmVjdHMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIHJlY3QgPSBkYXRhLnJlY3RzW2ldOwogICAgICBpZiAocmVjdC5sZWZ0IDw9IGRhdGEubW91c2VYICYmIHJlY3QucmlnaHQgPj0gZGF0YS5tb3VzZVggJiYKICAgICAgICAgIHJlY3QudG9wIDw9IGRhdGEubW91c2VZICYmIHJlY3QuYm90dG9tID49IGRhdGEubW91c2VZKQogICAgICAgIGluc2lkZSA9IHRydWU7CiAgICB9CiAgICB2YXIgY3Vyc29yID0gaW5zaWRlID8gZGF0YS52YWx1ZSA6ICIiOwogICAgaWYgKGNtLmRpc3BsYXkubGluZURpdi5zdHlsZS5jdXJzb3IgIT0gY3Vyc29yKQogICAgICBjbS5kaXNwbGF5LmxpbmVEaXYuc3R5bGUuY3Vyc29yID0gY3Vyc29yOwogIH0KfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/tern/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/tern/tern.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LkNvZGVNaXJyb3ItVGVybi1jb21wbGV0aW9uIHsKICBwYWRkaW5nLWxlZnQ6IDIycHg7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIGxpbmUtaGVpZ2h0OiAxLjU7Cn0KLkNvZGVNaXJyb3ItVGVybi1jb21wbGV0aW9uOmJlZm9yZSB7CiAgcG9zaXRpb246IGFic29sdXRlOwogIGxlZnQ6IDJweDsKICBib3R0b206IDJweDsKICBib3JkZXItcmFkaXVzOiA1MCU7CiAgZm9udC1zaXplOiAxMnB4OwogIGZvbnQtd2VpZ2h0OiBib2xkOwogIGhlaWdodDogMTVweDsKICB3aWR0aDogMTVweDsKICBsaW5lLWhlaWdodDogMTZweDsKICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgY29sb3I6IHdoaXRlOwogIC1tb3otYm94LXNpemluZzogYm9yZGVyLWJveDsKICBib3gtc2l6aW5nOiBib3JkZXItYm94Owp9Ci5Db2RlTWlycm9yLVRlcm4tY29tcGxldGlvbi11bmtub3duOmJlZm9yZSB7CiAgY29udGVudDogIj8iOwogIGJhY2tncm91bmQ6ICM0YmI7Cn0KLkNvZGVNaXJyb3ItVGVybi1jb21wbGV0aW9uLW9iamVjdDpiZWZvcmUgewogIGNvbnRlbnQ6ICJPIjsKICBiYWNrZ3JvdW5kOiAjNzdjOwp9Ci5Db2RlTWlycm9yLVRlcm4tY29tcGxldGlvbi1mbjpiZWZvcmUgewogIGNvbnRlbnQ6ICJGIjsKICBiYWNrZ3JvdW5kOiAjN2M3Owp9Ci5Db2RlTWlycm9yLVRlcm4tY29tcGxldGlvbi1hcnJheTpiZWZvcmUgewogIGNvbnRlbnQ6ICJBIjsKICBiYWNrZ3JvdW5kOiAjYzY2Owp9Ci5Db2RlTWlycm9yLVRlcm4tY29tcGxldGlvbi1udW1iZXI6YmVmb3JlIHsKICBjb250ZW50OiAiMSI7CiAgYmFja2dyb3VuZDogIzk5OTsKfQouQ29kZU1pcnJvci1UZXJuLWNvbXBsZXRpb24tc3RyaW5nOmJlZm9yZSB7CiAgY29udGVudDogIlMiOwogIGJhY2tncm91bmQ6ICM5OTk7Cn0KLkNvZGVNaXJyb3ItVGVybi1jb21wbGV0aW9uLWJvb2w6YmVmb3JlIHsKICBjb250ZW50OiAiQiI7CiAgYmFja2dyb3VuZDogIzk5OTsKfQoKLkNvZGVNaXJyb3ItVGVybi1jb21wbGV0aW9uLWd1ZXNzIHsKICBjb2xvcjogIzk5OTsKfQoKLkNvZGVNaXJyb3ItVGVybi10b29sdGlwIHsKICBib3JkZXI6IDFweCBzb2xpZCBzaWx2ZXI7CiAgYm9yZGVyLXJhZGl1czogM3B4OwogIGNvbG9yOiAjNDQ0OwogIHBhZGRpbmc6IDJweCA1cHg7CiAgZm9udC1zaXplOiA5MCU7CiAgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsKICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsKICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7CgogIG1heC13aWR0aDogNDBlbTsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgei1pbmRleDogMTA7CiAgLXdlYmtpdC1ib3gtc2hhZG93OiAycHggM3B4IDVweCByZ2JhKDAsMCwwLC4yKTsKICAtbW96LWJveC1zaGFkb3c6IDJweCAzcHggNXB4IHJnYmEoMCwwLDAsLjIpOwogIGJveC1zaGFkb3c6IDJweCAzcHggNXB4IHJnYmEoMCwwLDAsLjIpOwoKICB0cmFuc2l0aW9uOiBvcGFjaXR5IDFzOwogIC1tb3otdHJhbnNpdGlvbjogb3BhY2l0eSAxczsKICAtd2Via2l0LXRyYW5zaXRpb246IG9wYWNpdHkgMXM7CiAgLW8tdHJhbnNpdGlvbjogb3BhY2l0eSAxczsKICAtbXMtdHJhbnNpdGlvbjogb3BhY2l0eSAxczsKfQoKLkNvZGVNaXJyb3ItVGVybi1oaW50LWRvYyB7CiAgbWF4LXdpZHRoOiAyNWVtOwogIG1hcmdpbi10b3A6IC0zcHg7Cn0KCi5Db2RlTWlycm9yLVRlcm4tZm5hbWUgeyBjb2xvcjogYmxhY2s7IH0KLkNvZGVNaXJyb3ItVGVybi1mYXJnIHsgY29sb3I6ICM3MGE7IH0KLkNvZGVNaXJyb3ItVGVybi1mYXJnLWN1cnJlbnQgeyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgfQouQ29kZU1pcnJvci1UZXJuLXR5cGUgeyBjb2xvcjogIzA3YzsgfQouQ29kZU1pcnJvci1UZXJuLWZoaW50LWd1ZXNzIHsgb3BhY2l0eTogLjc7IH0K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/tern/tern.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovLyBHbHVlIGNvZGUgYmV0d2VlbiBDb2RlTWlycm9yIGFuZCBUZXJuLgovLwovLyBDcmVhdGUgYSBDb2RlTWlycm9yLlRlcm5TZXJ2ZXIgdG8gd3JhcCBhbiBhY3R1YWwgVGVybiBzZXJ2ZXIsCi8vIHJlZ2lzdGVyIG9wZW4gZG9jdW1lbnRzIChDb2RlTWlycm9yLkRvYyBpbnN0YW5jZXMpIHdpdGggaXQsIGFuZAovLyBjYWxsIGl0cyBtZXRob2RzIHRvIGFjdGl2YXRlIHRoZSBhc3Npc3RpbmcgZnVuY3Rpb25zIHRoYXQgVGVybgovLyBwcm92aWRlcy4KLy8KLy8gT3B0aW9ucyBzdXBwb3J0ZWQgKGFsbCBvcHRpb25hbCk6Ci8vICogZGVmczogQW4gYXJyYXkgb2YgSlNPTiBkZWZpbml0aW9uIGRhdGEgc3RydWN0dXJlcy4KLy8gKiBwbHVnaW5zOiBBbiBvYmplY3QgbWFwcGluZyBwbHVnaW4gbmFtZXMgdG8gY29uZmlndXJhdGlvbgovLyAgIG9wdGlvbnMuCi8vICogZ2V0RmlsZTogQSBmdW5jdGlvbihuYW1lLCBjKSB0aGF0IGNhbiBiZSB1c2VkIHRvIGFjY2VzcyBmaWxlcyBpbgovLyAgIHRoZSBwcm9qZWN0IHRoYXQgaGF2ZW4ndCBiZWVuIGxvYWRlZCB5ZXQuIFNpbXBseSBkbyBjKG51bGwpIHRvCi8vICAgaW5kaWNhdGUgdGhhdCBhIGZpbGUgaXMgbm90IGF2YWlsYWJsZS4KLy8gKiBmaWxlRmlsdGVyOiBBIGZ1bmN0aW9uKHZhbHVlLCBkb2NOYW1lLCBkb2MpIHRoYXQgd2lsbCBiZSBhcHBsaWVkCi8vICAgdG8gZG9jdW1lbnRzIGJlZm9yZSBwYXNzaW5nIHRoZW0gb24gdG8gVGVybi4KLy8gKiBzd2l0Y2hUb0RvYzogQSBmdW5jdGlvbihuYW1lLCBkb2MpIHRoYXQgc2hvdWxkLCB3aGVuIHByb3ZpZGluZyBhCi8vICAgbXVsdGktZmlsZSB2aWV3LCBzd2l0Y2ggdGhlIHZpZXcgb3IgZm9jdXMgdG8gdGhlIG5hbWVkIGZpbGUuCi8vICogc2hvd0Vycm9yOiBBIGZ1bmN0aW9uKGVkaXRvciwgbWVzc2FnZSkgdGhhdCBjYW4gYmUgdXNlZCB0bwovLyAgIG92ZXJyaWRlIHRoZSB3YXkgZXJyb3JzIGFyZSBkaXNwbGF5ZWQuCi8vICogY29tcGxldGlvblRpcDogQ3VzdG9taXplIHRoZSBjb250ZW50IGluIHRvb2x0aXBzIGZvciBjb21wbGV0aW9ucy4KLy8gICBJcyBwYXNzZWQgYSBzaW5nbGUgYXJndW1lbnTigJR0aGUgY29tcGxldGlvbidzIGRhdGEgYXMgcmV0dXJuZWQgYnkKLy8gICBUZXJu4oCUYW5kIG1heSByZXR1cm4gYSBzdHJpbmcsIERPTSBub2RlLCBvciBudWxsIHRvIGluZGljYXRlIHRoYXQKLy8gICBubyB0aXAgc2hvdWxkIGJlIHNob3duLiBCeSBkZWZhdWx0IHRoZSBkb2NzdHJpbmcgaXMgc2hvd24uCi8vICogdHlwZVRpcDogTGlrZSBjb21wbGV0aW9uVGlwLCBidXQgZm9yIHRoZSB0b29sdGlwcyBzaG93biBmb3IgdHlwZQovLyAgIHF1ZXJpZXMuCi8vICogcmVzcG9uc2VGaWx0ZXI6IEEgZnVuY3Rpb24oZG9jLCBxdWVyeSwgcmVxdWVzdCwgZXJyb3IsIGRhdGEpIHRoYXQKLy8gICB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIFRlcm4gcmVzcG9uc2VzIGJlZm9yZSB0cmVhdGluZyB0aGVtCi8vCi8vCi8vIEl0IGlzIHBvc3NpYmxlIHRvIHJ1biB0aGUgVGVybiBzZXJ2ZXIgaW4gYSB3ZWIgd29ya2VyIGJ5IHNwZWNpZnlpbmcKLy8gdGhlc2UgYWRkaXRpb25hbCBvcHRpb25zOgovLyAqIHVzZVdvcmtlcjogU2V0IHRvIHRydWUgdG8gZW5hYmxlIHdlYiB3b3JrZXIgbW9kZS4gWW91J2xsIHByb2JhYmx5Ci8vICAgd2FudCB0byBmZWF0dXJlIGRldGVjdCB0aGUgYWN0dWFsIHZhbHVlIHlvdSB1c2UgaGVyZSwgZm9yIGV4YW1wbGUKLy8gICAhIXdpbmRvdy5Xb3JrZXIuCi8vICogd29ya2VyU2NyaXB0OiBUaGUgbWFpbiBzY3JpcHQgb2YgdGhlIHdvcmtlci4gUG9pbnQgdGhpcyB0bwovLyAgIHdoZXJldmVyIHlvdSBhcmUgaG9zdGluZyB3b3JrZXIuanMgZnJvbSB0aGlzIGRpcmVjdG9yeS4KLy8gKiB3b3JrZXJEZXBzOiBBbiBhcnJheSBvZiBwYXRocyBwb2ludGluZyAocmVsYXRpdmUgdG8gd29ya2VyU2NyaXB0KQovLyAgIHRvIHRoZSBBY29ybiBhbmQgVGVybiBsaWJyYXJpZXMgYW5kIGFueSBUZXJuIHBsdWdpbnMgeW91IHdhbnQgdG8KLy8gICBsb2FkLiBPciwgaWYgeW91IG1pbmlmaWVkIHRob3NlIGludG8gYSBzaW5nbGUgc2NyaXB0IGFuZCBpbmNsdWRlZAovLyAgIHRoZW0gaW4gdGhlIHdvcmtlclNjcmlwdCwgc2ltcGx5IGxlYXZlIHRoaXMgdW5kZWZpbmVkLgoKKGZ1bmN0aW9uKG1vZCkgewogIGlmICh0eXBlb2YgZXhwb3J0cyA9PSAib2JqZWN0IiAmJiB0eXBlb2YgbW9kdWxlID09ICJvYmplY3QiKSAvLyBDb21tb25KUwogICAgbW9kKHJlcXVpcmUoIi4uLy4uL2xpYi9jb2RlbWlycm9yIikpOwogIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kKSAvLyBBTUQKICAgIGRlZmluZShbIi4uLy4uL2xpYi9jb2RlbWlycm9yIl0sIG1vZCk7CiAgZWxzZSAvLyBQbGFpbiBicm93c2VyIGVudgogICAgbW9kKENvZGVNaXJyb3IpOwp9KShmdW5jdGlvbihDb2RlTWlycm9yKSB7CiAgInVzZSBzdHJpY3QiOwogIC8vIGRlY2xhcmUgZ2xvYmFsOiB0ZXJuCgogIENvZGVNaXJyb3IuVGVyblNlcnZlciA9IGZ1bmN0aW9uKG9wdGlvbnMpIHsKICAgIHZhciBzZWxmID0gdGhpczsKICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnMgfHwge307CiAgICB2YXIgcGx1Z2lucyA9IHRoaXMub3B0aW9ucy5wbHVnaW5zIHx8ICh0aGlzLm9wdGlvbnMucGx1Z2lucyA9IHt9KTsKICAgIGlmICghcGx1Z2lucy5kb2NfY29tbWVudCkgcGx1Z2lucy5kb2NfY29tbWVudCA9IHRydWU7CiAgICB0aGlzLmRvY3MgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgaWYgKHRoaXMub3B0aW9ucy51c2VXb3JrZXIpIHsKICAgICAgdGhpcy5zZXJ2ZXIgPSBuZXcgV29ya2VyU2VydmVyKHRoaXMpOwogICAgfSBlbHNlIHsKICAgICAgdGhpcy5zZXJ2ZXIgPSBuZXcgdGVybi5TZXJ2ZXIoewogICAgICAgIGdldEZpbGU6IGZ1bmN0aW9uKG5hbWUsIGMpIHsgcmV0dXJuIGdldEZpbGUoc2VsZiwgbmFtZSwgYyk7IH0sCiAgICAgICAgYXN5bmM6IHRydWUsCiAgICAgICAgZGVmczogdGhpcy5vcHRpb25zLmRlZnMgfHwgW10sCiAgICAgICAgcGx1Z2luczogcGx1Z2lucwogICAgICB9KTsKICAgIH0KICAgIHRoaXMudHJhY2tDaGFuZ2UgPSBmdW5jdGlvbihkb2MsIGNoYW5nZSkgeyB0cmFja0NoYW5nZShzZWxmLCBkb2MsIGNoYW5nZSk7IH07CgogICAgdGhpcy5jYWNoZWRBcmdIaW50cyA9IG51bGw7CiAgICB0aGlzLmFjdGl2ZUFyZ0hpbnRzID0gbnVsbDsKICAgIHRoaXMuanVtcFN0YWNrID0gW107CgogICAgdGhpcy5nZXRIaW50ID0gZnVuY3Rpb24oY20sIGMpIHsgcmV0dXJuIGhpbnQoc2VsZiwgY20sIGMpOyB9OwogICAgdGhpcy5nZXRIaW50LmFzeW5jID0gdHJ1ZTsKICB9OwoKICBDb2RlTWlycm9yLlRlcm5TZXJ2ZXIucHJvdG90eXBlID0gewogICAgYWRkRG9jOiBmdW5jdGlvbihuYW1lLCBkb2MpIHsKICAgICAgdmFyIGRhdGEgPSB7ZG9jOiBkb2MsIG5hbWU6IG5hbWUsIGNoYW5nZWQ6IG51bGx9OwogICAgICB0aGlzLnNlcnZlci5hZGRGaWxlKG5hbWUsIGRvY1ZhbHVlKHRoaXMsIGRhdGEpKTsKICAgICAgQ29kZU1pcnJvci5vbihkb2MsICJjaGFuZ2UiLCB0aGlzLnRyYWNrQ2hhbmdlKTsKICAgICAgcmV0dXJuIHRoaXMuZG9jc1tuYW1lXSA9IGRhdGE7CiAgICB9LAoKICAgIGRlbERvYzogZnVuY3Rpb24oaWQpIHsKICAgICAgdmFyIGZvdW5kID0gcmVzb2x2ZURvYyh0aGlzLCBpZCk7CiAgICAgIGlmICghZm91bmQpIHJldHVybjsKICAgICAgQ29kZU1pcnJvci5vZmYoZm91bmQuZG9jLCAiY2hhbmdlIiwgdGhpcy50cmFja0NoYW5nZSk7CiAgICAgIGRlbGV0ZSB0aGlzLmRvY3NbZm91bmQubmFtZV07CiAgICAgIHRoaXMuc2VydmVyLmRlbEZpbGUoZm91bmQubmFtZSk7CiAgICB9LAoKICAgIGhpZGVEb2M6IGZ1bmN0aW9uKGlkKSB7CiAgICAgIGNsb3NlQXJnSGludHModGhpcyk7CiAgICAgIHZhciBmb3VuZCA9IHJlc29sdmVEb2ModGhpcywgaWQpOwogICAgICBpZiAoZm91bmQgJiYgZm91bmQuY2hhbmdlZCkgc2VuZERvYyh0aGlzLCBmb3VuZCk7CiAgICB9LAoKICAgIGNvbXBsZXRlOiBmdW5jdGlvbihjbSkgewogICAgICBjbS5zaG93SGludCh7aGludDogdGhpcy5nZXRIaW50fSk7CiAgICB9LAoKICAgIHNob3dUeXBlOiBmdW5jdGlvbihjbSwgcG9zLCBjKSB7IHNob3dDb250ZXh0SW5mbyh0aGlzLCBjbSwgcG9zLCAidHlwZSIsIGMpOyB9LAoKICAgIHNob3dEb2NzOiBmdW5jdGlvbihjbSwgcG9zLCBjKSB7IHNob3dDb250ZXh0SW5mbyh0aGlzLCBjbSwgcG9zLCAiZG9jdW1lbnRhdGlvbiIsIGMpOyB9LAoKICAgIHVwZGF0ZUFyZ0hpbnRzOiBmdW5jdGlvbihjbSkgeyB1cGRhdGVBcmdIaW50cyh0aGlzLCBjbSk7IH0sCgogICAganVtcFRvRGVmOiBmdW5jdGlvbihjbSkgeyBqdW1wVG9EZWYodGhpcywgY20pOyB9LAoKICAgIGp1bXBCYWNrOiBmdW5jdGlvbihjbSkgeyBqdW1wQmFjayh0aGlzLCBjbSk7IH0sCgogICAgcmVuYW1lOiBmdW5jdGlvbihjbSkgeyByZW5hbWUodGhpcywgY20pOyB9LAoKICAgIHNlbGVjdE5hbWU6IGZ1bmN0aW9uKGNtKSB7IHNlbGVjdE5hbWUodGhpcywgY20pOyB9LAoKICAgIHJlcXVlc3Q6IGZ1bmN0aW9uIChjbSwgcXVlcnksIGMsIHBvcykgewogICAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICAgIHZhciBkb2MgPSBmaW5kRG9jKHRoaXMsIGNtLmdldERvYygpKTsKICAgICAgdmFyIHJlcXVlc3QgPSBidWlsZFJlcXVlc3QodGhpcywgZG9jLCBxdWVyeSwgcG9zKTsKICAgICAgdmFyIGV4dHJhT3B0aW9ucyA9IHJlcXVlc3QucXVlcnkgJiYgdGhpcy5vcHRpb25zLnF1ZXJ5T3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMucXVlcnlPcHRpb25zW3JlcXVlc3QucXVlcnkudHlwZV0KICAgICAgaWYgKGV4dHJhT3B0aW9ucykgZm9yICh2YXIgcHJvcCBpbiBleHRyYU9wdGlvbnMpIHJlcXVlc3QucXVlcnlbcHJvcF0gPSBleHRyYU9wdGlvbnNbcHJvcF07CgogICAgICB0aGlzLnNlcnZlci5yZXF1ZXN0KHJlcXVlc3QsIGZ1bmN0aW9uIChlcnJvciwgZGF0YSkgewogICAgICAgIGlmICghZXJyb3IgJiYgc2VsZi5vcHRpb25zLnJlc3BvbnNlRmlsdGVyKQogICAgICAgICAgZGF0YSA9IHNlbGYub3B0aW9ucy5yZXNwb25zZUZpbHRlcihkb2MsIHF1ZXJ5LCByZXF1ZXN0LCBlcnJvciwgZGF0YSk7CiAgICAgICAgYyhlcnJvciwgZGF0YSk7CiAgICAgIH0pOwogICAgfSwKCiAgICBkZXN0cm95OiBmdW5jdGlvbiAoKSB7CiAgICAgIGNsb3NlQXJnSGludHModGhpcykKICAgICAgaWYgKHRoaXMud29ya2VyKSB7CiAgICAgICAgdGhpcy53b3JrZXIudGVybWluYXRlKCk7CiAgICAgICAgdGhpcy53b3JrZXIgPSBudWxsOwogICAgICB9CiAgICB9CiAgfTsKCiAgdmFyIFBvcyA9IENvZGVNaXJyb3IuUG9zOwogIHZhciBjbHMgPSAiQ29kZU1pcnJvci1UZXJuLSI7CiAgdmFyIGJpZ0RvYyA9IDI1MDsKCiAgZnVuY3Rpb24gZ2V0RmlsZSh0cywgbmFtZSwgYykgewogICAgdmFyIGJ1ZiA9IHRzLmRvY3NbbmFtZV07CiAgICBpZiAoYnVmKQogICAgICBjKGRvY1ZhbHVlKHRzLCBidWYpKTsKICAgIGVsc2UgaWYgKHRzLm9wdGlvbnMuZ2V0RmlsZSkKICAgICAgdHMub3B0aW9ucy5nZXRGaWxlKG5hbWUsIGMpOwogICAgZWxzZQogICAgICBjKG51bGwpOwogIH0KCiAgZnVuY3Rpb24gZmluZERvYyh0cywgZG9jLCBuYW1lKSB7CiAgICBmb3IgKHZhciBuIGluIHRzLmRvY3MpIHsKICAgICAgdmFyIGN1ciA9IHRzLmRvY3Nbbl07CiAgICAgIGlmIChjdXIuZG9jID09IGRvYykgcmV0dXJuIGN1cjsKICAgIH0KICAgIGlmICghbmFtZSkgZm9yICh2YXIgaSA9IDA7OyArK2kpIHsKICAgICAgbiA9ICJbZG9jIiArIChpIHx8ICIiKSArICJdIjsKICAgICAgaWYgKCF0cy5kb2NzW25dKSB7IG5hbWUgPSBuOyBicmVhazsgfQogICAgfQogICAgcmV0dXJuIHRzLmFkZERvYyhuYW1lLCBkb2MpOwogIH0KCiAgZnVuY3Rpb24gcmVzb2x2ZURvYyh0cywgaWQpIHsKICAgIGlmICh0eXBlb2YgaWQgPT0gInN0cmluZyIpIHJldHVybiB0cy5kb2NzW2lkXTsKICAgIGlmIChpZCBpbnN0YW5jZW9mIENvZGVNaXJyb3IpIGlkID0gaWQuZ2V0RG9jKCk7CiAgICBpZiAoaWQgaW5zdGFuY2VvZiBDb2RlTWlycm9yLkRvYykgcmV0dXJuIGZpbmREb2ModHMsIGlkKTsKICB9CgogIGZ1bmN0aW9uIHRyYWNrQ2hhbmdlKHRzLCBkb2MsIGNoYW5nZSkgewogICAgdmFyIGRhdGEgPSBmaW5kRG9jKHRzLCBkb2MpOwoKICAgIHZhciBhcmdIaW50cyA9IHRzLmNhY2hlZEFyZ0hpbnRzOwogICAgaWYgKGFyZ0hpbnRzICYmIGFyZ0hpbnRzLmRvYyA9PSBkb2MgJiYgY21wUG9zKGFyZ0hpbnRzLnN0YXJ0LCBjaGFuZ2UudG8pID49IDApCiAgICAgIHRzLmNhY2hlZEFyZ0hpbnRzID0gbnVsbDsKCiAgICB2YXIgY2hhbmdlZCA9IGRhdGEuY2hhbmdlZDsKICAgIGlmIChjaGFuZ2VkID09IG51bGwpCiAgICAgIGRhdGEuY2hhbmdlZCA9IGNoYW5nZWQgPSB7ZnJvbTogY2hhbmdlLmZyb20ubGluZSwgdG86IGNoYW5nZS5mcm9tLmxpbmV9OwogICAgdmFyIGVuZCA9IGNoYW5nZS5mcm9tLmxpbmUgKyAoY2hhbmdlLnRleHQubGVuZ3RoIC0gMSk7CiAgICBpZiAoY2hhbmdlLmZyb20ubGluZSA8IGNoYW5nZWQudG8pIGNoYW5nZWQudG8gPSBjaGFuZ2VkLnRvIC0gKGNoYW5nZS50by5saW5lIC0gZW5kKTsKICAgIGlmIChlbmQgPj0gY2hhbmdlZC50bykgY2hhbmdlZC50byA9IGVuZCArIDE7CiAgICBpZiAoY2hhbmdlZC5mcm9tID4gY2hhbmdlLmZyb20ubGluZSkgY2hhbmdlZC5mcm9tID0gY2hhbmdlLmZyb20ubGluZTsKCiAgICBpZiAoZG9jLmxpbmVDb3VudCgpID4gYmlnRG9jICYmIGNoYW5nZS50byAtIGNoYW5nZWQuZnJvbSA+IDEwMCkgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgaWYgKGRhdGEuY2hhbmdlZCAmJiBkYXRhLmNoYW5nZWQudG8gLSBkYXRhLmNoYW5nZWQuZnJvbSA+IDEwMCkgc2VuZERvYyh0cywgZGF0YSk7CiAgICB9LCAyMDApOwogIH0KCiAgZnVuY3Rpb24gc2VuZERvYyh0cywgZG9jKSB7CiAgICB0cy5zZXJ2ZXIucmVxdWVzdCh7ZmlsZXM6IFt7dHlwZTogImZ1bGwiLCBuYW1lOiBkb2MubmFtZSwgdGV4dDogZG9jVmFsdWUodHMsIGRvYyl9XX0sIGZ1bmN0aW9uKGVycm9yKSB7CiAgICAgIGlmIChlcnJvcikgd2luZG93LmNvbnNvbGUuZXJyb3IoZXJyb3IpOwogICAgICBlbHNlIGRvYy5jaGFuZ2VkID0gbnVsbDsKICAgIH0pOwogIH0KCiAgLy8gQ29tcGxldGlvbgoKICBmdW5jdGlvbiBoaW50KHRzLCBjbSwgYykgewogICAgdHMucmVxdWVzdChjbSwge3R5cGU6ICJjb21wbGV0aW9ucyIsIHR5cGVzOiB0cnVlLCBkb2NzOiB0cnVlLCB1cmxzOiB0cnVlfSwgZnVuY3Rpb24oZXJyb3IsIGRhdGEpIHsKICAgICAgaWYgKGVycm9yKSByZXR1cm4gc2hvd0Vycm9yKHRzLCBjbSwgZXJyb3IpOwogICAgICB2YXIgY29tcGxldGlvbnMgPSBbXSwgYWZ0ZXIgPSAiIjsKICAgICAgdmFyIGZyb20gPSBkYXRhLnN0YXJ0LCB0byA9IGRhdGEuZW5kOwogICAgICBpZiAoY20uZ2V0UmFuZ2UoUG9zKGZyb20ubGluZSwgZnJvbS5jaCAtIDIpLCBmcm9tKSA9PSAiW1wiIiAmJgogICAgICAgICAgY20uZ2V0UmFuZ2UodG8sIFBvcyh0by5saW5lLCB0by5jaCArIDIpKSAhPSAiXCJdIikKICAgICAgICBhZnRlciA9ICJcIl0iOwoKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhLmNvbXBsZXRpb25zLmxlbmd0aDsgKytpKSB7CiAgICAgICAgdmFyIGNvbXBsZXRpb24gPSBkYXRhLmNvbXBsZXRpb25zW2ldLCBjbGFzc05hbWUgPSB0eXBlVG9JY29uKGNvbXBsZXRpb24udHlwZSk7CiAgICAgICAgaWYgKGRhdGEuZ3Vlc3MpIGNsYXNzTmFtZSArPSAiICIgKyBjbHMgKyAiZ3Vlc3MiOwogICAgICAgIGNvbXBsZXRpb25zLnB1c2goe3RleHQ6IGNvbXBsZXRpb24ubmFtZSArIGFmdGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlUZXh0OiBjb21wbGV0aW9uLmRpc3BsYXlOYW1lIHx8IGNvbXBsZXRpb24ubmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6IGNsYXNzTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOiBjb21wbGV0aW9ufSk7CiAgICAgIH0KCiAgICAgIHZhciBvYmogPSB7ZnJvbTogZnJvbSwgdG86IHRvLCBsaXN0OiBjb21wbGV0aW9uc307CiAgICAgIHZhciB0b29sdGlwID0gbnVsbDsKICAgICAgQ29kZU1pcnJvci5vbihvYmosICJjbG9zZSIsIGZ1bmN0aW9uKCkgeyByZW1vdmUodG9vbHRpcCk7IH0pOwogICAgICBDb2RlTWlycm9yLm9uKG9iaiwgInVwZGF0ZSIsIGZ1bmN0aW9uKCkgeyByZW1vdmUodG9vbHRpcCk7IH0pOwogICAgICBDb2RlTWlycm9yLm9uKG9iaiwgInNlbGVjdCIsIGZ1bmN0aW9uKGN1ciwgbm9kZSkgewogICAgICAgIHJlbW92ZSh0b29sdGlwKTsKICAgICAgICB2YXIgY29udGVudCA9IHRzLm9wdGlvbnMuY29tcGxldGlvblRpcCA/IHRzLm9wdGlvbnMuY29tcGxldGlvblRpcChjdXIuZGF0YSkgOiBjdXIuZGF0YS5kb2M7CiAgICAgICAgaWYgKGNvbnRlbnQpIHsKICAgICAgICAgIHRvb2x0aXAgPSBtYWtlVG9vbHRpcChub2RlLnBhcmVudE5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkucmlnaHQgKyB3aW5kb3cucGFnZVhPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgKyB3aW5kb3cucGFnZVlPZmZzZXQsIGNvbnRlbnQpOwogICAgICAgICAgdG9vbHRpcC5jbGFzc05hbWUgKz0gIiAiICsgY2xzICsgImhpbnQtZG9jIjsKICAgICAgICB9CiAgICAgIH0pOwogICAgICBjKG9iaik7CiAgICB9KTsKICB9CgogIGZ1bmN0aW9uIHR5cGVUb0ljb24odHlwZSkgewogICAgdmFyIHN1ZmZpeDsKICAgIGlmICh0eXBlID09ICI/Iikgc3VmZml4ID0gInVua25vd24iOwogICAgZWxzZSBpZiAodHlwZSA9PSAibnVtYmVyIiB8fCB0eXBlID09ICJzdHJpbmciIHx8IHR5cGUgPT0gImJvb2wiKSBzdWZmaXggPSB0eXBlOwogICAgZWxzZSBpZiAoL15mblwoLy50ZXN0KHR5cGUpKSBzdWZmaXggPSAiZm4iOwogICAgZWxzZSBpZiAoL15cWy8udGVzdCh0eXBlKSkgc3VmZml4ID0gImFycmF5IjsKICAgIGVsc2Ugc3VmZml4ID0gIm9iamVjdCI7CiAgICByZXR1cm4gY2xzICsgImNvbXBsZXRpb24gIiArIGNscyArICJjb21wbGV0aW9uLSIgKyBzdWZmaXg7CiAgfQoKICAvLyBUeXBlIHF1ZXJpZXMKCiAgZnVuY3Rpb24gc2hvd0NvbnRleHRJbmZvKHRzLCBjbSwgcG9zLCBxdWVyeU5hbWUsIGMpIHsKICAgIHRzLnJlcXVlc3QoY20sIHF1ZXJ5TmFtZSwgZnVuY3Rpb24oZXJyb3IsIGRhdGEpIHsKICAgICAgaWYgKGVycm9yKSByZXR1cm4gc2hvd0Vycm9yKHRzLCBjbSwgZXJyb3IpOwogICAgICBpZiAodHMub3B0aW9ucy50eXBlVGlwKSB7CiAgICAgICAgdmFyIHRpcCA9IHRzLm9wdGlvbnMudHlwZVRpcChkYXRhKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB2YXIgdGlwID0gZWx0KCJzcGFuIiwgbnVsbCwgZWx0KCJzdHJvbmciLCBudWxsLCBkYXRhLnR5cGUgfHwgIm5vdCBmb3VuZCIpKTsKICAgICAgICBpZiAoZGF0YS5kb2MpCiAgICAgICAgICB0aXAuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIiDigJQgIiArIGRhdGEuZG9jKSk7CiAgICAgICAgaWYgKGRhdGEudXJsKSB7CiAgICAgICAgICB0aXAuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIiAiKSk7CiAgICAgICAgICB2YXIgY2hpbGQgPSB0aXAuYXBwZW5kQ2hpbGQoZWx0KCJhIiwgbnVsbCwgIltkb2NzXSIpKTsKICAgICAgICAgIGNoaWxkLmhyZWYgPSBkYXRhLnVybDsKICAgICAgICAgIGNoaWxkLnRhcmdldCA9ICJfYmxhbmsiOwogICAgICAgIH0KICAgICAgfQogICAgICB0ZW1wVG9vbHRpcChjbSwgdGlwLCB0cyk7CiAgICAgIGlmIChjKSBjKCk7CiAgICB9LCBwb3MpOwogIH0KCiAgLy8gTWFpbnRhaW5pbmcgYXJndW1lbnQgaGludHMKCiAgZnVuY3Rpb24gdXBkYXRlQXJnSGludHModHMsIGNtKSB7CiAgICBjbG9zZUFyZ0hpbnRzKHRzKTsKCiAgICBpZiAoY20uc29tZXRoaW5nU2VsZWN0ZWQoKSkgcmV0dXJuOwogICAgdmFyIHN0YXRlID0gY20uZ2V0VG9rZW5BdChjbS5nZXRDdXJzb3IoKSkuc3RhdGU7CiAgICB2YXIgaW5uZXIgPSBDb2RlTWlycm9yLmlubmVyTW9kZShjbS5nZXRNb2RlKCksIHN0YXRlKTsKICAgIGlmIChpbm5lci5tb2RlLm5hbWUgIT0gImphdmFzY3JpcHQiKSByZXR1cm47CiAgICB2YXIgbGV4ID0gaW5uZXIuc3RhdGUubGV4aWNhbDsKICAgIGlmIChsZXguaW5mbyAhPSAiY2FsbCIpIHJldHVybjsKCiAgICB2YXIgY2gsIGFyZ1BvcyA9IGxleC5wb3MgfHwgMCwgdGFiU2l6ZSA9IGNtLmdldE9wdGlvbigidGFiU2l6ZSIpOwogICAgZm9yICh2YXIgbGluZSA9IGNtLmdldEN1cnNvcigpLmxpbmUsIGUgPSBNYXRoLm1heCgwLCBsaW5lIC0gOSksIGZvdW5kID0gZmFsc2U7IGxpbmUgPj0gZTsgLS1saW5lKSB7CiAgICAgIHZhciBzdHIgPSBjbS5nZXRMaW5lKGxpbmUpLCBleHRyYSA9IDA7CiAgICAgIGZvciAodmFyIHBvcyA9IDA7OykgewogICAgICAgIHZhciB0YWIgPSBzdHIuaW5kZXhPZigiXHQiLCBwb3MpOwogICAgICAgIGlmICh0YWIgPT0gLTEpIGJyZWFrOwogICAgICAgIGV4dHJhICs9IHRhYlNpemUgLSAodGFiICsgZXh0cmEpICUgdGFiU2l6ZSAtIDE7CiAgICAgICAgcG9zID0gdGFiICsgMTsKICAgICAgfQogICAgICBjaCA9IGxleC5jb2x1bW4gLSBleHRyYTsKICAgICAgaWYgKHN0ci5jaGFyQXQoY2gpID09ICIoIikge2ZvdW5kID0gdHJ1ZTsgYnJlYWs7fQogICAgfQogICAgaWYgKCFmb3VuZCkgcmV0dXJuOwoKICAgIHZhciBzdGFydCA9IFBvcyhsaW5lLCBjaCk7CiAgICB2YXIgY2FjaGUgPSB0cy5jYWNoZWRBcmdIaW50czsKICAgIGlmIChjYWNoZSAmJiBjYWNoZS5kb2MgPT0gY20uZ2V0RG9jKCkgJiYgY21wUG9zKHN0YXJ0LCBjYWNoZS5zdGFydCkgPT0gMCkKICAgICAgcmV0dXJuIHNob3dBcmdIaW50cyh0cywgY20sIGFyZ1Bvcyk7CgogICAgdHMucmVxdWVzdChjbSwge3R5cGU6ICJ0eXBlIiwgcHJlZmVyRnVuY3Rpb246IHRydWUsIGVuZDogc3RhcnR9LCBmdW5jdGlvbihlcnJvciwgZGF0YSkgewogICAgICBpZiAoZXJyb3IgfHwgIWRhdGEudHlwZSB8fCAhKC9eZm5cKC8pLnRlc3QoZGF0YS50eXBlKSkgcmV0dXJuOwogICAgICB0cy5jYWNoZWRBcmdIaW50cyA9IHsKICAgICAgICBzdGFydDogc3RhcnQsCiAgICAgICAgdHlwZTogcGFyc2VGblR5cGUoZGF0YS50eXBlKSwKICAgICAgICBuYW1lOiBkYXRhLmV4cHJOYW1lIHx8IGRhdGEubmFtZSB8fCAiZm4iLAogICAgICAgIGd1ZXNzOiBkYXRhLmd1ZXNzLAogICAgICAgIGRvYzogY20uZ2V0RG9jKCkKICAgICAgfTsKICAgICAgc2hvd0FyZ0hpbnRzKHRzLCBjbSwgYXJnUG9zKTsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gc2hvd0FyZ0hpbnRzKHRzLCBjbSwgcG9zKSB7CiAgICBjbG9zZUFyZ0hpbnRzKHRzKTsKCiAgICB2YXIgY2FjaGUgPSB0cy5jYWNoZWRBcmdIaW50cywgdHAgPSBjYWNoZS50eXBlOwogICAgdmFyIHRpcCA9IGVsdCgic3BhbiIsIGNhY2hlLmd1ZXNzID8gY2xzICsgImZoaW50LWd1ZXNzIiA6IG51bGwsCiAgICAgICAgICAgICAgICAgIGVsdCgic3BhbiIsIGNscyArICJmbmFtZSIsIGNhY2hlLm5hbWUpLCAiKCIpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0cC5hcmdzLmxlbmd0aDsgKytpKSB7CiAgICAgIGlmIChpKSB0aXAuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIiwgIikpOwogICAgICB2YXIgYXJnID0gdHAuYXJnc1tpXTsKICAgICAgdGlwLmFwcGVuZENoaWxkKGVsdCgic3BhbiIsIGNscyArICJmYXJnIiArIChpID09IHBvcyA/ICIgIiArIGNscyArICJmYXJnLWN1cnJlbnQiIDogIiIpLCBhcmcubmFtZSB8fCAiPyIpKTsKICAgICAgaWYgKGFyZy50eXBlICE9ICI/IikgewogICAgICAgIHRpcC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiOlx1MDBhMCIpKTsKICAgICAgICB0aXAuYXBwZW5kQ2hpbGQoZWx0KCJzcGFuIiwgY2xzICsgInR5cGUiLCBhcmcudHlwZSkpOwogICAgICB9CiAgICB9CiAgICB0aXAuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUodHAucmV0dHlwZSA/ICIpIC0+XHUwMGEwIiA6ICIpIikpOwogICAgaWYgKHRwLnJldHR5cGUpIHRpcC5hcHBlbmRDaGlsZChlbHQoInNwYW4iLCBjbHMgKyAidHlwZSIsIHRwLnJldHR5cGUpKTsKICAgIHZhciBwbGFjZSA9IGNtLmN1cnNvckNvb3JkcyhudWxsLCAicGFnZSIpOwogICAgdHMuYWN0aXZlQXJnSGludHMgPSBtYWtlVG9vbHRpcChwbGFjZS5yaWdodCArIDEsIHBsYWNlLmJvdHRvbSwgdGlwKTsKICB9CgogIGZ1bmN0aW9uIHBhcnNlRm5UeXBlKHRleHQpIHsKICAgIHZhciBhcmdzID0gW10sIHBvcyA9IDM7CgogICAgZnVuY3Rpb24gc2tpcE1hdGNoaW5nKHVwdG8pIHsKICAgICAgdmFyIGRlcHRoID0gMCwgc3RhcnQgPSBwb3M7CiAgICAgIGZvciAoOzspIHsKICAgICAgICB2YXIgbmV4dCA9IHRleHQuY2hhckF0KHBvcyk7CiAgICAgICAgaWYgKHVwdG8udGVzdChuZXh0KSAmJiAhZGVwdGgpIHJldHVybiB0ZXh0LnNsaWNlKHN0YXJ0LCBwb3MpOwogICAgICAgIGlmICgvW3tcW1woXS8udGVzdChuZXh0KSkgKytkZXB0aDsKICAgICAgICBlbHNlIGlmICgvW31cXVwpXS8udGVzdChuZXh0KSkgLS1kZXB0aDsKICAgICAgICArK3BvczsKICAgICAgfQogICAgfQoKICAgIC8vIFBhcnNlIGFyZ3VtZW50cwogICAgaWYgKHRleHQuY2hhckF0KHBvcykgIT0gIikiKSBmb3IgKDs7KSB7CiAgICAgIHZhciBuYW1lID0gdGV4dC5zbGljZShwb3MpLm1hdGNoKC9eKFteLCBcKFxbXHtdKyk6IC8pOwogICAgICBpZiAobmFtZSkgewogICAgICAgIHBvcyArPSBuYW1lWzBdLmxlbmd0aDsKICAgICAgICBuYW1lID0gbmFtZVsxXTsKICAgICAgfQogICAgICBhcmdzLnB1c2goe25hbWU6IG5hbWUsIHR5cGU6IHNraXBNYXRjaGluZygvW1wpLF0vKX0pOwogICAgICBpZiAodGV4dC5jaGFyQXQocG9zKSA9PSAiKSIpIGJyZWFrOwogICAgICBwb3MgKz0gMjsKICAgIH0KCiAgICB2YXIgcmV0dHlwZSA9IHRleHQuc2xpY2UocG9zKS5tYXRjaCgvXlwpIC0+ICguKikkLyk7CgogICAgcmV0dXJuIHthcmdzOiBhcmdzLCByZXR0eXBlOiByZXR0eXBlICYmIHJldHR5cGVbMV19OwogIH0KCiAgLy8gTW92aW5nIHRvIHRoZSBkZWZpbml0aW9uIG9mIHNvbWV0aGluZwoKICBmdW5jdGlvbiBqdW1wVG9EZWYodHMsIGNtKSB7CiAgICBmdW5jdGlvbiBpbm5lcih2YXJOYW1lKSB7CiAgICAgIHZhciByZXEgPSB7dHlwZTogImRlZmluaXRpb24iLCB2YXJpYWJsZTogdmFyTmFtZSB8fCBudWxsfTsKICAgICAgdmFyIGRvYyA9IGZpbmREb2ModHMsIGNtLmdldERvYygpKTsKICAgICAgdHMuc2VydmVyLnJlcXVlc3QoYnVpbGRSZXF1ZXN0KHRzLCBkb2MsIHJlcSksIGZ1bmN0aW9uKGVycm9yLCBkYXRhKSB7CiAgICAgICAgaWYgKGVycm9yKSByZXR1cm4gc2hvd0Vycm9yKHRzLCBjbSwgZXJyb3IpOwogICAgICAgIGlmICghZGF0YS5maWxlICYmIGRhdGEudXJsKSB7IHdpbmRvdy5vcGVuKGRhdGEudXJsKTsgcmV0dXJuOyB9CgogICAgICAgIGlmIChkYXRhLmZpbGUpIHsKICAgICAgICAgIHZhciBsb2NhbERvYyA9IHRzLmRvY3NbZGF0YS5maWxlXSwgZm91bmQ7CiAgICAgICAgICBpZiAobG9jYWxEb2MgJiYgKGZvdW5kID0gZmluZENvbnRleHQobG9jYWxEb2MuZG9jLCBkYXRhKSkpIHsKICAgICAgICAgICAgdHMuanVtcFN0YWNrLnB1c2goe2ZpbGU6IGRvYy5uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQ6IGNtLmdldEN1cnNvcigiZnJvbSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kOiBjbS5nZXRDdXJzb3IoInRvIil9KTsKICAgICAgICAgICAgbW92ZVRvKHRzLCBkb2MsIGxvY2FsRG9jLCBmb3VuZC5zdGFydCwgZm91bmQuZW5kKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBzaG93RXJyb3IodHMsIGNtLCAiQ291bGQgbm90IGZpbmQgYSBkZWZpbml0aW9uLiIpOwogICAgICB9KTsKICAgIH0KCiAgICBpZiAoIWF0SW50ZXJlc3RpbmdFeHByZXNzaW9uKGNtKSkKICAgICAgZGlhbG9nKGNtLCAiSnVtcCB0byB2YXJpYWJsZSIsIGZ1bmN0aW9uKG5hbWUpIHsgaWYgKG5hbWUpIGlubmVyKG5hbWUpOyB9KTsKICAgIGVsc2UKICAgICAgaW5uZXIoKTsKICB9CgogIGZ1bmN0aW9uIGp1bXBCYWNrKHRzLCBjbSkgewogICAgdmFyIHBvcyA9IHRzLmp1bXBTdGFjay5wb3AoKSwgZG9jID0gcG9zICYmIHRzLmRvY3NbcG9zLmZpbGVdOwogICAgaWYgKCFkb2MpIHJldHVybjsKICAgIG1vdmVUbyh0cywgZmluZERvYyh0cywgY20uZ2V0RG9jKCkpLCBkb2MsIHBvcy5zdGFydCwgcG9zLmVuZCk7CiAgfQoKICBmdW5jdGlvbiBtb3ZlVG8odHMsIGN1ckRvYywgZG9jLCBzdGFydCwgZW5kKSB7CiAgICBkb2MuZG9jLnNldFNlbGVjdGlvbihzdGFydCwgZW5kKTsKICAgIGlmIChjdXJEb2MgIT0gZG9jICYmIHRzLm9wdGlvbnMuc3dpdGNoVG9Eb2MpIHsKICAgICAgY2xvc2VBcmdIaW50cyh0cyk7CiAgICAgIHRzLm9wdGlvbnMuc3dpdGNoVG9Eb2MoZG9jLm5hbWUsIGRvYy5kb2MpOwogICAgfQogIH0KCiAgLy8gVGhlIHtsaW5lLGNofSByZXByZXNlbnRhdGlvbiBvZiBwb3NpdGlvbnMgbWFrZXMgdGhpcyByYXRoZXIgYXdrd2FyZC4KICBmdW5jdGlvbiBmaW5kQ29udGV4dChkb2MsIGRhdGEpIHsKICAgIHZhciBiZWZvcmUgPSBkYXRhLmNvbnRleHQuc2xpY2UoMCwgZGF0YS5jb250ZXh0T2Zmc2V0KS5zcGxpdCgiXG4iKTsKICAgIHZhciBzdGFydExpbmUgPSBkYXRhLnN0YXJ0LmxpbmUgLSAoYmVmb3JlLmxlbmd0aCAtIDEpOwogICAgdmFyIHN0YXJ0ID0gUG9zKHN0YXJ0TGluZSwgKGJlZm9yZS5sZW5ndGggPT0gMSA/IGRhdGEuc3RhcnQuY2ggOiBkb2MuZ2V0TGluZShzdGFydExpbmUpLmxlbmd0aCkgLSBiZWZvcmVbMF0ubGVuZ3RoKTsKCiAgICB2YXIgdGV4dCA9IGRvYy5nZXRMaW5lKHN0YXJ0TGluZSkuc2xpY2Uoc3RhcnQuY2gpOwogICAgZm9yICh2YXIgY3VyID0gc3RhcnRMaW5lICsgMTsgY3VyIDwgZG9jLmxpbmVDb3VudCgpICYmIHRleHQubGVuZ3RoIDwgZGF0YS5jb250ZXh0Lmxlbmd0aDsgKytjdXIpCiAgICAgIHRleHQgKz0gIlxuIiArIGRvYy5nZXRMaW5lKGN1cik7CiAgICBpZiAodGV4dC5zbGljZSgwLCBkYXRhLmNvbnRleHQubGVuZ3RoKSA9PSBkYXRhLmNvbnRleHQpIHJldHVybiBkYXRhOwoKICAgIHZhciBjdXJzb3IgPSBkb2MuZ2V0U2VhcmNoQ3Vyc29yKGRhdGEuY29udGV4dCwgMCwgZmFsc2UpOwogICAgdmFyIG5lYXJlc3QsIG5lYXJlc3REaXN0ID0gSW5maW5pdHk7CiAgICB3aGlsZSAoY3Vyc29yLmZpbmROZXh0KCkpIHsKICAgICAgdmFyIGZyb20gPSBjdXJzb3IuZnJvbSgpLCBkaXN0ID0gTWF0aC5hYnMoZnJvbS5saW5lIC0gc3RhcnQubGluZSkgKiAxMDAwMDsKICAgICAgaWYgKCFkaXN0KSBkaXN0ID0gTWF0aC5hYnMoZnJvbS5jaCAtIHN0YXJ0LmNoKTsKICAgICAgaWYgKGRpc3QgPCBuZWFyZXN0RGlzdCkgeyBuZWFyZXN0ID0gZnJvbTsgbmVhcmVzdERpc3QgPSBkaXN0OyB9CiAgICB9CiAgICBpZiAoIW5lYXJlc3QpIHJldHVybiBudWxsOwoKICAgIGlmIChiZWZvcmUubGVuZ3RoID09IDEpCiAgICAgIG5lYXJlc3QuY2ggKz0gYmVmb3JlWzBdLmxlbmd0aDsKICAgIGVsc2UKICAgICAgbmVhcmVzdCA9IFBvcyhuZWFyZXN0LmxpbmUgKyAoYmVmb3JlLmxlbmd0aCAtIDEpLCBiZWZvcmVbYmVmb3JlLmxlbmd0aCAtIDFdLmxlbmd0aCk7CiAgICBpZiAoZGF0YS5zdGFydC5saW5lID09IGRhdGEuZW5kLmxpbmUpCiAgICAgIHZhciBlbmQgPSBQb3MobmVhcmVzdC5saW5lLCBuZWFyZXN0LmNoICsgKGRhdGEuZW5kLmNoIC0gZGF0YS5zdGFydC5jaCkpOwogICAgZWxzZQogICAgICB2YXIgZW5kID0gUG9zKG5lYXJlc3QubGluZSArIChkYXRhLmVuZC5saW5lIC0gZGF0YS5zdGFydC5saW5lKSwgZGF0YS5lbmQuY2gpOwogICAgcmV0dXJuIHtzdGFydDogbmVhcmVzdCwgZW5kOiBlbmR9OwogIH0KCiAgZnVuY3Rpb24gYXRJbnRlcmVzdGluZ0V4cHJlc3Npb24oY20pIHsKICAgIHZhciBwb3MgPSBjbS5nZXRDdXJzb3IoImVuZCIpLCB0b2sgPSBjbS5nZXRUb2tlbkF0KHBvcyk7CiAgICBpZiAodG9rLnN0YXJ0IDwgcG9zLmNoICYmIHRvay50eXBlID09ICJjb21tZW50IikgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIC9bXHcpXF1dLy50ZXN0KGNtLmdldExpbmUocG9zLmxpbmUpLnNsaWNlKE1hdGgubWF4KHBvcy5jaCAtIDEsIDApLCBwb3MuY2ggKyAxKSk7CiAgfQoKICAvLyBWYXJpYWJsZSByZW5hbWluZwoKICBmdW5jdGlvbiByZW5hbWUodHMsIGNtKSB7CiAgICB2YXIgdG9rZW4gPSBjbS5nZXRUb2tlbkF0KGNtLmdldEN1cnNvcigpKTsKICAgIGlmICghL1x3Ly50ZXN0KHRva2VuLnN0cmluZykpIHJldHVybiBzaG93RXJyb3IodHMsIGNtLCAiTm90IGF0IGEgdmFyaWFibGUiKTsKICAgIGRpYWxvZyhjbSwgIk5ldyBuYW1lIGZvciAiICsgdG9rZW4uc3RyaW5nLCBmdW5jdGlvbihuZXdOYW1lKSB7CiAgICAgIHRzLnJlcXVlc3QoY20sIHt0eXBlOiAicmVuYW1lIiwgbmV3TmFtZTogbmV3TmFtZSwgZnVsbERvY3M6IHRydWV9LCBmdW5jdGlvbihlcnJvciwgZGF0YSkgewogICAgICAgIGlmIChlcnJvcikgcmV0dXJuIHNob3dFcnJvcih0cywgY20sIGVycm9yKTsKICAgICAgICBhcHBseUNoYW5nZXModHMsIGRhdGEuY2hhbmdlcyk7CiAgICAgIH0pOwogICAgfSk7CiAgfQoKICBmdW5jdGlvbiBzZWxlY3ROYW1lKHRzLCBjbSkgewogICAgdmFyIG5hbWUgPSBmaW5kRG9jKHRzLCBjbS5kb2MpLm5hbWU7CiAgICB0cy5yZXF1ZXN0KGNtLCB7dHlwZTogInJlZnMifSwgZnVuY3Rpb24oZXJyb3IsIGRhdGEpIHsKICAgICAgaWYgKGVycm9yKSByZXR1cm4gc2hvd0Vycm9yKHRzLCBjbSwgZXJyb3IpOwogICAgICB2YXIgcmFuZ2VzID0gW10sIGN1ciA9IDA7CiAgICAgIHZhciBjdXJQb3MgPSBjbS5nZXRDdXJzb3IoKTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhLnJlZnMubGVuZ3RoOyBpKyspIHsKICAgICAgICB2YXIgcmVmID0gZGF0YS5yZWZzW2ldOwogICAgICAgIGlmIChyZWYuZmlsZSA9PSBuYW1lKSB7CiAgICAgICAgICByYW5nZXMucHVzaCh7YW5jaG9yOiByZWYuc3RhcnQsIGhlYWQ6IHJlZi5lbmR9KTsKICAgICAgICAgIGlmIChjbXBQb3MoY3VyUG9zLCByZWYuc3RhcnQpID49IDAgJiYgY21wUG9zKGN1clBvcywgcmVmLmVuZCkgPD0gMCkKICAgICAgICAgICAgY3VyID0gcmFuZ2VzLmxlbmd0aCAtIDE7CiAgICAgICAgfQogICAgICB9CiAgICAgIGNtLnNldFNlbGVjdGlvbnMocmFuZ2VzLCBjdXIpOwogICAgfSk7CiAgfQoKICB2YXIgbmV4dENoYW5nZU9yaWcgPSAwOwogIGZ1bmN0aW9uIGFwcGx5Q2hhbmdlcyh0cywgY2hhbmdlcykgewogICAgdmFyIHBlckZpbGUgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGFuZ2VzLmxlbmd0aDsgKytpKSB7CiAgICAgIHZhciBjaCA9IGNoYW5nZXNbaV07CiAgICAgIChwZXJGaWxlW2NoLmZpbGVdIHx8IChwZXJGaWxlW2NoLmZpbGVdID0gW10pKS5wdXNoKGNoKTsKICAgIH0KICAgIGZvciAodmFyIGZpbGUgaW4gcGVyRmlsZSkgewogICAgICB2YXIga25vd24gPSB0cy5kb2NzW2ZpbGVdLCBjaHMgPSBwZXJGaWxlW2ZpbGVdOzsKICAgICAgaWYgKCFrbm93bikgY29udGludWU7CiAgICAgIGNocy5zb3J0KGZ1bmN0aW9uKGEsIGIpIHsgcmV0dXJuIGNtcFBvcyhiLnN0YXJ0LCBhLnN0YXJ0KTsgfSk7CiAgICAgIHZhciBvcmlnaW4gPSAiKnJlbmFtZSIgKyAoKytuZXh0Q2hhbmdlT3JpZyk7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgdmFyIGNoID0gY2hzW2ldOwogICAgICAgIGtub3duLmRvYy5yZXBsYWNlUmFuZ2UoY2gudGV4dCwgY2guc3RhcnQsIGNoLmVuZCwgb3JpZ2luKTsKICAgICAgfQogICAgfQogIH0KCiAgLy8gR2VuZXJpYyByZXF1ZXN0LWJ1aWxkaW5nIGhlbHBlcgoKICBmdW5jdGlvbiBidWlsZFJlcXVlc3QodHMsIGRvYywgcXVlcnksIHBvcykgewogICAgdmFyIGZpbGVzID0gW10sIG9mZnNldExpbmVzID0gMCwgYWxsb3dGcmFnbWVudHMgPSAhcXVlcnkuZnVsbERvY3M7CiAgICBpZiAoIWFsbG93RnJhZ21lbnRzKSBkZWxldGUgcXVlcnkuZnVsbERvY3M7CiAgICBpZiAodHlwZW9mIHF1ZXJ5ID09ICJzdHJpbmciKSBxdWVyeSA9IHt0eXBlOiBxdWVyeX07CiAgICBxdWVyeS5saW5lQ2hhclBvc2l0aW9ucyA9IHRydWU7CiAgICBpZiAocXVlcnkuZW5kID09IG51bGwpIHsKICAgICAgcXVlcnkuZW5kID0gcG9zIHx8IGRvYy5kb2MuZ2V0Q3Vyc29yKCJlbmQiKTsKICAgICAgaWYgKGRvYy5kb2Muc29tZXRoaW5nU2VsZWN0ZWQoKSkKICAgICAgICBxdWVyeS5zdGFydCA9IGRvYy5kb2MuZ2V0Q3Vyc29yKCJzdGFydCIpOwogICAgfQogICAgdmFyIHN0YXJ0UG9zID0gcXVlcnkuc3RhcnQgfHwgcXVlcnkuZW5kOwoKICAgIGlmIChkb2MuY2hhbmdlZCkgewogICAgICBpZiAoZG9jLmRvYy5saW5lQ291bnQoKSA+IGJpZ0RvYyAmJiBhbGxvd0ZyYWdtZW50cyAhPT0gZmFsc2UgJiYKICAgICAgICAgIGRvYy5jaGFuZ2VkLnRvIC0gZG9jLmNoYW5nZWQuZnJvbSA8IDEwMCAmJgogICAgICAgICAgZG9jLmNoYW5nZWQuZnJvbSA8PSBzdGFydFBvcy5saW5lICYmIGRvYy5jaGFuZ2VkLnRvID4gcXVlcnkuZW5kLmxpbmUpIHsKICAgICAgICBmaWxlcy5wdXNoKGdldEZyYWdtZW50QXJvdW5kKGRvYywgc3RhcnRQb3MsIHF1ZXJ5LmVuZCkpOwogICAgICAgIHF1ZXJ5LmZpbGUgPSAiIzAiOwogICAgICAgIHZhciBvZmZzZXRMaW5lcyA9IGZpbGVzWzBdLm9mZnNldExpbmVzOwogICAgICAgIGlmIChxdWVyeS5zdGFydCAhPSBudWxsKSBxdWVyeS5zdGFydCA9IFBvcyhxdWVyeS5zdGFydC5saW5lIC0gLW9mZnNldExpbmVzLCBxdWVyeS5zdGFydC5jaCk7CiAgICAgICAgcXVlcnkuZW5kID0gUG9zKHF1ZXJ5LmVuZC5saW5lIC0gb2Zmc2V0TGluZXMsIHF1ZXJ5LmVuZC5jaCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZmlsZXMucHVzaCh7dHlwZTogImZ1bGwiLAogICAgICAgICAgICAgICAgICAgIG5hbWU6IGRvYy5uYW1lLAogICAgICAgICAgICAgICAgICAgIHRleHQ6IGRvY1ZhbHVlKHRzLCBkb2MpfSk7CiAgICAgICAgcXVlcnkuZmlsZSA9IGRvYy5uYW1lOwogICAgICAgIGRvYy5jaGFuZ2VkID0gbnVsbDsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgcXVlcnkuZmlsZSA9IGRvYy5uYW1lOwogICAgfQogICAgZm9yICh2YXIgbmFtZSBpbiB0cy5kb2NzKSB7CiAgICAgIHZhciBjdXIgPSB0cy5kb2NzW25hbWVdOwogICAgICBpZiAoY3VyLmNoYW5nZWQgJiYgY3VyICE9IGRvYykgewogICAgICAgIGZpbGVzLnB1c2goe3R5cGU6ICJmdWxsIiwgbmFtZTogY3VyLm5hbWUsIHRleHQ6IGRvY1ZhbHVlKHRzLCBjdXIpfSk7CiAgICAgICAgY3VyLmNoYW5nZWQgPSBudWxsOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIHtxdWVyeTogcXVlcnksIGZpbGVzOiBmaWxlc307CiAgfQoKICBmdW5jdGlvbiBnZXRGcmFnbWVudEFyb3VuZChkYXRhLCBzdGFydCwgZW5kKSB7CiAgICB2YXIgZG9jID0gZGF0YS5kb2M7CiAgICB2YXIgbWluSW5kZW50ID0gbnVsbCwgbWluTGluZSA9IG51bGwsIGVuZExpbmUsIHRhYlNpemUgPSA0OwogICAgZm9yICh2YXIgcCA9IHN0YXJ0LmxpbmUgLSAxLCBtaW4gPSBNYXRoLm1heCgwLCBwIC0gNTApOyBwID49IG1pbjsgLS1wKSB7CiAgICAgIHZhciBsaW5lID0gZG9jLmdldExpbmUocCksIGZuID0gbGluZS5zZWFyY2goL1xiZnVuY3Rpb25cYi8pOwogICAgICBpZiAoZm4gPCAwKSBjb250aW51ZTsKICAgICAgdmFyIGluZGVudCA9IENvZGVNaXJyb3IuY291bnRDb2x1bW4obGluZSwgbnVsbCwgdGFiU2l6ZSk7CiAgICAgIGlmIChtaW5JbmRlbnQgIT0gbnVsbCAmJiBtaW5JbmRlbnQgPD0gaW5kZW50KSBjb250aW51ZTsKICAgICAgbWluSW5kZW50ID0gaW5kZW50OwogICAgICBtaW5MaW5lID0gcDsKICAgIH0KICAgIGlmIChtaW5MaW5lID09IG51bGwpIG1pbkxpbmUgPSBtaW47CiAgICB2YXIgbWF4ID0gTWF0aC5taW4oZG9jLmxhc3RMaW5lKCksIGVuZC5saW5lICsgMjApOwogICAgaWYgKG1pbkluZGVudCA9PSBudWxsIHx8IG1pbkluZGVudCA9PSBDb2RlTWlycm9yLmNvdW50Q29sdW1uKGRvYy5nZXRMaW5lKHN0YXJ0LmxpbmUpLCBudWxsLCB0YWJTaXplKSkKICAgICAgZW5kTGluZSA9IG1heDsKICAgIGVsc2UgZm9yIChlbmRMaW5lID0gZW5kLmxpbmUgKyAxOyBlbmRMaW5lIDwgbWF4OyArK2VuZExpbmUpIHsKICAgICAgdmFyIGluZGVudCA9IENvZGVNaXJyb3IuY291bnRDb2x1bW4oZG9jLmdldExpbmUoZW5kTGluZSksIG51bGwsIHRhYlNpemUpOwogICAgICBpZiAoaW5kZW50IDw9IG1pbkluZGVudCkgYnJlYWs7CiAgICB9CiAgICB2YXIgZnJvbSA9IFBvcyhtaW5MaW5lLCAwKTsKCiAgICByZXR1cm4ge3R5cGU6ICJwYXJ0IiwKICAgICAgICAgICAgbmFtZTogZGF0YS5uYW1lLAogICAgICAgICAgICBvZmZzZXRMaW5lczogZnJvbS5saW5lLAogICAgICAgICAgICB0ZXh0OiBkb2MuZ2V0UmFuZ2UoZnJvbSwgUG9zKGVuZExpbmUsIDApKX07CiAgfQoKICAvLyBHZW5lcmljIHV0aWxpdGllcwoKICB2YXIgY21wUG9zID0gQ29kZU1pcnJvci5jbXBQb3M7CgogIGZ1bmN0aW9uIGVsdCh0YWduYW1lLCBjbHMgLyosIC4uLiBlbHRzKi8pIHsKICAgIHZhciBlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWduYW1lKTsKICAgIGlmIChjbHMpIGUuY2xhc3NOYW1lID0gY2xzOwogICAgZm9yICh2YXIgaSA9IDI7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyArK2kpIHsKICAgICAgdmFyIGVsdCA9IGFyZ3VtZW50c1tpXTsKICAgICAgaWYgKHR5cGVvZiBlbHQgPT0gInN0cmluZyIpIGVsdCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGVsdCk7CiAgICAgIGUuYXBwZW5kQ2hpbGQoZWx0KTsKICAgIH0KICAgIHJldHVybiBlOwogIH0KCiAgZnVuY3Rpb24gZGlhbG9nKGNtLCB0ZXh0LCBmKSB7CiAgICBpZiAoY20ub3BlbkRpYWxvZykKICAgICAgY20ub3BlbkRpYWxvZyh0ZXh0ICsgIjogPGlucHV0IHR5cGU9dGV4dD4iLCBmKTsKICAgIGVsc2UKICAgICAgZihwcm9tcHQodGV4dCwgIiIpKTsKICB9CgogIC8vIFRvb2x0aXBzCgogIGZ1bmN0aW9uIHRlbXBUb29sdGlwKGNtLCBjb250ZW50LCB0cykgewogICAgaWYgKGNtLnN0YXRlLnRlcm5Ub29sdGlwKSByZW1vdmUoY20uc3RhdGUudGVyblRvb2x0aXApOwogICAgdmFyIHdoZXJlID0gY20uY3Vyc29yQ29vcmRzKCk7CiAgICB2YXIgdGlwID0gY20uc3RhdGUudGVyblRvb2x0aXAgPSBtYWtlVG9vbHRpcCh3aGVyZS5yaWdodCArIDEsIHdoZXJlLmJvdHRvbSwgY29udGVudCk7CiAgICBmdW5jdGlvbiBtYXliZUNsZWFyKCkgewogICAgICBvbGQgPSB0cnVlOwogICAgICBpZiAoIW1vdXNlT25UaXApIGNsZWFyKCk7CiAgICB9CiAgICBmdW5jdGlvbiBjbGVhcigpIHsKICAgICAgY20uc3RhdGUudGVyblRvb2x0aXAgPSBudWxsOwogICAgICBpZiAoIXRpcC5wYXJlbnROb2RlKSByZXR1cm47CiAgICAgIGNtLm9mZigiY3Vyc29yQWN0aXZpdHkiLCBjbGVhcik7CiAgICAgIGNtLm9mZignYmx1cicsIGNsZWFyKTsKICAgICAgY20ub2ZmKCdzY3JvbGwnLCBjbGVhcik7CiAgICAgIGZhZGVPdXQodGlwKTsKICAgIH0KICAgIHZhciBtb3VzZU9uVGlwID0gZmFsc2UsIG9sZCA9IGZhbHNlOwogICAgQ29kZU1pcnJvci5vbih0aXAsICJtb3VzZW1vdmUiLCBmdW5jdGlvbigpIHsgbW91c2VPblRpcCA9IHRydWU7IH0pOwogICAgQ29kZU1pcnJvci5vbih0aXAsICJtb3VzZW91dCIsIGZ1bmN0aW9uKGUpIHsKICAgICAgaWYgKCFDb2RlTWlycm9yLmNvbnRhaW5zKHRpcCwgZS5yZWxhdGVkVGFyZ2V0IHx8IGUudG9FbGVtZW50KSkgewogICAgICAgIGlmIChvbGQpIGNsZWFyKCk7CiAgICAgICAgZWxzZSBtb3VzZU9uVGlwID0gZmFsc2U7CiAgICAgIH0KICAgIH0pOwogICAgc2V0VGltZW91dChtYXliZUNsZWFyLCB0cy5vcHRpb25zLmhpbnREZWxheSA/IHRzLm9wdGlvbnMuaGludERlbGF5IDogMTcwMCk7CiAgICBjbS5vbigiY3Vyc29yQWN0aXZpdHkiLCBjbGVhcik7CiAgICBjbS5vbignYmx1cicsIGNsZWFyKTsKICAgIGNtLm9uKCdzY3JvbGwnLCBjbGVhcik7CiAgfQoKICBmdW5jdGlvbiBtYWtlVG9vbHRpcCh4LCB5LCBjb250ZW50KSB7CiAgICB2YXIgbm9kZSA9IGVsdCgiZGl2IiwgY2xzICsgInRvb2x0aXAiLCBjb250ZW50KTsKICAgIG5vZGUuc3R5bGUubGVmdCA9IHggKyAicHgiOwogICAgbm9kZS5zdHlsZS50b3AgPSB5ICsgInB4IjsKICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQobm9kZSk7CiAgICByZXR1cm4gbm9kZTsKICB9CgogIGZ1bmN0aW9uIHJlbW92ZShub2RlKSB7CiAgICB2YXIgcCA9IG5vZGUgJiYgbm9kZS5wYXJlbnROb2RlOwogICAgaWYgKHApIHAucmVtb3ZlQ2hpbGQobm9kZSk7CiAgfQoKICBmdW5jdGlvbiBmYWRlT3V0KHRvb2x0aXApIHsKICAgIHRvb2x0aXAuc3R5bGUub3BhY2l0eSA9ICIwIjsKICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IHJlbW92ZSh0b29sdGlwKTsgfSwgMTEwMCk7CiAgfQoKICBmdW5jdGlvbiBzaG93RXJyb3IodHMsIGNtLCBtc2cpIHsKICAgIGlmICh0cy5vcHRpb25zLnNob3dFcnJvcikKICAgICAgdHMub3B0aW9ucy5zaG93RXJyb3IoY20sIG1zZyk7CiAgICBlbHNlCiAgICAgIHRlbXBUb29sdGlwKGNtLCBTdHJpbmcobXNnKSwgdHMpOwogIH0KCiAgZnVuY3Rpb24gY2xvc2VBcmdIaW50cyh0cykgewogICAgaWYgKHRzLmFjdGl2ZUFyZ0hpbnRzKSB7IHJlbW92ZSh0cy5hY3RpdmVBcmdIaW50cyk7IHRzLmFjdGl2ZUFyZ0hpbnRzID0gbnVsbDsgfQogIH0KCiAgZnVuY3Rpb24gZG9jVmFsdWUodHMsIGRvYykgewogICAgdmFyIHZhbCA9IGRvYy5kb2MuZ2V0VmFsdWUoKTsKICAgIGlmICh0cy5vcHRpb25zLmZpbGVGaWx0ZXIpIHZhbCA9IHRzLm9wdGlvbnMuZmlsZUZpbHRlcih2YWwsIGRvYy5uYW1lLCBkb2MuZG9jKTsKICAgIHJldHVybiB2YWw7CiAgfQoKICAvLyBXb3JrZXIgd3JhcHBlcgoKICBmdW5jdGlvbiBXb3JrZXJTZXJ2ZXIodHMpIHsKICAgIHZhciB3b3JrZXIgPSB0cy53b3JrZXIgPSBuZXcgV29ya2VyKHRzLm9wdGlvbnMud29ya2VyU2NyaXB0KTsKICAgIHdvcmtlci5wb3N0TWVzc2FnZSh7dHlwZTogImluaXQiLAogICAgICAgICAgICAgICAgICAgICAgICBkZWZzOiB0cy5vcHRpb25zLmRlZnMsCiAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbnM6IHRzLm9wdGlvbnMucGx1Z2lucywKICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0czogdHMub3B0aW9ucy53b3JrZXJEZXBzfSk7CiAgICB2YXIgbXNnSWQgPSAwLCBwZW5kaW5nID0ge307CgogICAgZnVuY3Rpb24gc2VuZChkYXRhLCBjKSB7CiAgICAgIGlmIChjKSB7CiAgICAgICAgZGF0YS5pZCA9ICsrbXNnSWQ7CiAgICAgICAgcGVuZGluZ1ttc2dJZF0gPSBjOwogICAgICB9CiAgICAgIHdvcmtlci5wb3N0TWVzc2FnZShkYXRhKTsKICAgIH0KICAgIHdvcmtlci5vbm1lc3NhZ2UgPSBmdW5jdGlvbihlKSB7CiAgICAgIHZhciBkYXRhID0gZS5kYXRhOwogICAgICBpZiAoZGF0YS50eXBlID09ICJnZXRGaWxlIikgewogICAgICAgIGdldEZpbGUodHMsIGRhdGEubmFtZSwgZnVuY3Rpb24oZXJyLCB0ZXh0KSB7CiAgICAgICAgICBzZW5kKHt0eXBlOiAiZ2V0RmlsZSIsIGVycjogU3RyaW5nKGVyciksIHRleHQ6IHRleHQsIGlkOiBkYXRhLmlkfSk7CiAgICAgICAgfSk7CiAgICAgIH0gZWxzZSBpZiAoZGF0YS50eXBlID09ICJkZWJ1ZyIpIHsKICAgICAgICB3aW5kb3cuY29uc29sZS5sb2coZGF0YS5tZXNzYWdlKTsKICAgICAgfSBlbHNlIGlmIChkYXRhLmlkICYmIHBlbmRpbmdbZGF0YS5pZF0pIHsKICAgICAgICBwZW5kaW5nW2RhdGEuaWRdKGRhdGEuZXJyLCBkYXRhLmJvZHkpOwogICAgICAgIGRlbGV0ZSBwZW5kaW5nW2RhdGEuaWRdOwogICAgICB9CiAgICB9OwogICAgd29ya2VyLm9uZXJyb3IgPSBmdW5jdGlvbihlKSB7CiAgICAgIGZvciAodmFyIGlkIGluIHBlbmRpbmcpIHBlbmRpbmdbaWRdKGUpOwogICAgICBwZW5kaW5nID0ge307CiAgICB9OwoKICAgIHRoaXMuYWRkRmlsZSA9IGZ1bmN0aW9uKG5hbWUsIHRleHQpIHsgc2VuZCh7dHlwZTogImFkZCIsIG5hbWU6IG5hbWUsIHRleHQ6IHRleHR9KTsgfTsKICAgIHRoaXMuZGVsRmlsZSA9IGZ1bmN0aW9uKG5hbWUpIHsgc2VuZCh7dHlwZTogImRlbCIsIG5hbWU6IG5hbWV9KTsgfTsKICAgIHRoaXMucmVxdWVzdCA9IGZ1bmN0aW9uKGJvZHksIGMpIHsgc2VuZCh7dHlwZTogInJlcSIsIGJvZHk6IGJvZHl9LCBjKTsgfTsKICB9Cn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/tern/worker.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovLyBkZWNsYXJlIGdsb2JhbDogdGVybiwgc2VydmVyCgp2YXIgc2VydmVyOwoKdGhpcy5vbm1lc3NhZ2UgPSBmdW5jdGlvbihlKSB7CiAgdmFyIGRhdGEgPSBlLmRhdGE7CiAgc3dpdGNoIChkYXRhLnR5cGUpIHsKICBjYXNlICJpbml0IjogcmV0dXJuIHN0YXJ0U2VydmVyKGRhdGEuZGVmcywgZGF0YS5wbHVnaW5zLCBkYXRhLnNjcmlwdHMpOwogIGNhc2UgImFkZCI6IHJldHVybiBzZXJ2ZXIuYWRkRmlsZShkYXRhLm5hbWUsIGRhdGEudGV4dCk7CiAgY2FzZSAiZGVsIjogcmV0dXJuIHNlcnZlci5kZWxGaWxlKGRhdGEubmFtZSk7CiAgY2FzZSAicmVxIjogcmV0dXJuIHNlcnZlci5yZXF1ZXN0KGRhdGEuYm9keSwgZnVuY3Rpb24oZXJyLCByZXFEYXRhKSB7CiAgICBwb3N0TWVzc2FnZSh7aWQ6IGRhdGEuaWQsIGJvZHk6IHJlcURhdGEsIGVycjogZXJyICYmIFN0cmluZyhlcnIpfSk7CiAgfSk7CiAgY2FzZSAiZ2V0RmlsZSI6CiAgICB2YXIgYyA9IHBlbmRpbmdbZGF0YS5pZF07CiAgICBkZWxldGUgcGVuZGluZ1tkYXRhLmlkXTsKICAgIHJldHVybiBjKGRhdGEuZXJyLCBkYXRhLnRleHQpOwogIGRlZmF1bHQ6IHRocm93IG5ldyBFcnJvcigiVW5rbm93biBtZXNzYWdlIHR5cGU6ICIgKyBkYXRhLnR5cGUpOwogIH0KfTsKCnZhciBuZXh0SWQgPSAwLCBwZW5kaW5nID0ge307CmZ1bmN0aW9uIGdldEZpbGUoZmlsZSwgYykgewogIHBvc3RNZXNzYWdlKHt0eXBlOiAiZ2V0RmlsZSIsIG5hbWU6IGZpbGUsIGlkOiArK25leHRJZH0pOwogIHBlbmRpbmdbbmV4dElkXSA9IGM7Cn0KCmZ1bmN0aW9uIHN0YXJ0U2VydmVyKGRlZnMsIHBsdWdpbnMsIHNjcmlwdHMpIHsKICBpZiAoc2NyaXB0cykgaW1wb3J0U2NyaXB0cy5hcHBseShudWxsLCBzY3JpcHRzKTsKCiAgc2VydmVyID0gbmV3IHRlcm4uU2VydmVyKHsKICAgIGdldEZpbGU6IGdldEZpbGUsCiAgICBhc3luYzogdHJ1ZSwKICAgIGRlZnM6IGRlZnMsCiAgICBwbHVnaW5zOiBwbHVnaW5zCiAgfSk7Cn0KCnRoaXMuY29uc29sZSA9IHsKICBsb2c6IGZ1bmN0aW9uKHYpIHsgcG9zdE1lc3NhZ2Uoe3R5cGU6ICJkZWJ1ZyIsIG1lc3NhZ2U6IHZ9KTsgfQp9Owo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/wrap/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/addon/wrap/hardwrap.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CgogIHZhciBQb3MgPSBDb2RlTWlycm9yLlBvczsKCiAgZnVuY3Rpb24gZmluZFBhcmFncmFwaChjbSwgcG9zLCBvcHRpb25zKSB7CiAgICB2YXIgc3RhcnRSRSA9IG9wdGlvbnMucGFyYWdyYXBoU3RhcnQgfHwgY20uZ2V0SGVscGVyKHBvcywgInBhcmFncmFwaFN0YXJ0Iik7CiAgICBmb3IgKHZhciBzdGFydCA9IHBvcy5saW5lLCBmaXJzdCA9IGNtLmZpcnN0TGluZSgpOyBzdGFydCA+IGZpcnN0OyAtLXN0YXJ0KSB7CiAgICAgIHZhciBsaW5lID0gY20uZ2V0TGluZShzdGFydCk7CiAgICAgIGlmIChzdGFydFJFICYmIHN0YXJ0UkUudGVzdChsaW5lKSkgYnJlYWs7CiAgICAgIGlmICghL1xTLy50ZXN0KGxpbmUpKSB7ICsrc3RhcnQ7IGJyZWFrOyB9CiAgICB9CiAgICB2YXIgZW5kUkUgPSBvcHRpb25zLnBhcmFncmFwaEVuZCB8fCBjbS5nZXRIZWxwZXIocG9zLCAicGFyYWdyYXBoRW5kIik7CiAgICBmb3IgKHZhciBlbmQgPSBwb3MubGluZSArIDEsIGxhc3QgPSBjbS5sYXN0TGluZSgpOyBlbmQgPD0gbGFzdDsgKytlbmQpIHsKICAgICAgdmFyIGxpbmUgPSBjbS5nZXRMaW5lKGVuZCk7CiAgICAgIGlmIChlbmRSRSAmJiBlbmRSRS50ZXN0KGxpbmUpKSB7ICsrZW5kOyBicmVhazsgfQogICAgICBpZiAoIS9cUy8udGVzdChsaW5lKSkgYnJlYWs7CiAgICB9CiAgICByZXR1cm4ge2Zyb206IHN0YXJ0LCB0bzogZW5kfTsKICB9CgogIGZ1bmN0aW9uIGZpbmRCcmVha1BvaW50KHRleHQsIGNvbHVtbiwgd3JhcE9uLCBraWxsVHJhaWxpbmdTcGFjZSkgewogICAgdmFyIGF0ID0gY29sdW1uCiAgICB3aGlsZSAoYXQgPCB0ZXh0Lmxlbmd0aCAmJiB0ZXh0LmNoYXJBdChhdCkgPT0gIiAiKSBhdCsrCiAgICBmb3IgKDsgYXQgPiAwOyAtLWF0KQogICAgICBpZiAod3JhcE9uLnRlc3QodGV4dC5zbGljZShhdCAtIDEsIGF0ICsgMSkpKSBicmVhazsKICAgIGZvciAodmFyIGZpcnN0ID0gdHJ1ZTs7IGZpcnN0ID0gZmFsc2UpIHsKICAgICAgdmFyIGVuZE9mVGV4dCA9IGF0OwogICAgICBpZiAoa2lsbFRyYWlsaW5nU3BhY2UpCiAgICAgICAgd2hpbGUgKHRleHQuY2hhckF0KGVuZE9mVGV4dCAtIDEpID09ICIgIikgLS1lbmRPZlRleHQ7CiAgICAgIGlmIChlbmRPZlRleHQgPT0gMCAmJiBmaXJzdCkgYXQgPSBjb2x1bW47CiAgICAgIGVsc2UgcmV0dXJuIHtmcm9tOiBlbmRPZlRleHQsIHRvOiBhdH07CiAgICB9CiAgfQoKICBmdW5jdGlvbiB3cmFwUmFuZ2UoY20sIGZyb20sIHRvLCBvcHRpb25zKSB7CiAgICBmcm9tID0gY20uY2xpcFBvcyhmcm9tKTsgdG8gPSBjbS5jbGlwUG9zKHRvKTsKICAgIHZhciBjb2x1bW4gPSBvcHRpb25zLmNvbHVtbiB8fCA4MDsKICAgIHZhciB3cmFwT24gPSBvcHRpb25zLndyYXBPbiB8fCAvXHNcU3wtW15cLlxkXS87CiAgICB2YXIga2lsbFRyYWlsaW5nID0gb3B0aW9ucy5raWxsVHJhaWxpbmdTcGFjZSAhPT0gZmFsc2U7CiAgICB2YXIgY2hhbmdlcyA9IFtdLCBjdXJMaW5lID0gIiIsIGN1ck5vID0gZnJvbS5saW5lOwogICAgdmFyIGxpbmVzID0gY20uZ2V0UmFuZ2UoZnJvbSwgdG8sIGZhbHNlKTsKICAgIGlmICghbGluZXMubGVuZ3RoKSByZXR1cm4gbnVsbDsKICAgIHZhciBsZWFkaW5nU3BhY2UgPSBsaW5lc1swXS5tYXRjaCgvXlsgXHRdKi8pWzBdOwoKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyArK2kpIHsKICAgICAgdmFyIHRleHQgPSBsaW5lc1tpXSwgb2xkTGVuID0gY3VyTGluZS5sZW5ndGgsIHNwYWNlSW5zZXJ0ZWQgPSAwOwogICAgICBpZiAoY3VyTGluZSAmJiB0ZXh0ICYmICF3cmFwT24udGVzdChjdXJMaW5lLmNoYXJBdChjdXJMaW5lLmxlbmd0aCAtIDEpICsgdGV4dC5jaGFyQXQoMCkpKSB7CiAgICAgICAgY3VyTGluZSArPSAiICI7CiAgICAgICAgc3BhY2VJbnNlcnRlZCA9IDE7CiAgICAgIH0KICAgICAgdmFyIHNwYWNlVHJpbW1lZCA9ICIiOwogICAgICBpZiAoaSkgewogICAgICAgIHNwYWNlVHJpbW1lZCA9IHRleHQubWF0Y2goL15ccyovKVswXTsKICAgICAgICB0ZXh0ID0gdGV4dC5zbGljZShzcGFjZVRyaW1tZWQubGVuZ3RoKTsKICAgICAgfQogICAgICBjdXJMaW5lICs9IHRleHQ7CiAgICAgIGlmIChpKSB7CiAgICAgICAgdmFyIGZpcnN0QnJlYWsgPSBjdXJMaW5lLmxlbmd0aCA+IGNvbHVtbiAmJiBsZWFkaW5nU3BhY2UgPT0gc3BhY2VUcmltbWVkICYmCiAgICAgICAgICBmaW5kQnJlYWtQb2ludChjdXJMaW5lLCBjb2x1bW4sIHdyYXBPbiwga2lsbFRyYWlsaW5nKTsKICAgICAgICAvLyBJZiB0aGlzIGlzbid0IGJyb2tlbiwgb3IgaXMgYnJva2VuIGF0IGEgZGlmZmVyZW50IHBvaW50LCByZW1vdmUgb2xkIGJyZWFrCiAgICAgICAgaWYgKCFmaXJzdEJyZWFrIHx8IGZpcnN0QnJlYWsuZnJvbSAhPSBvbGRMZW4gfHwgZmlyc3RCcmVhay50byAhPSBvbGRMZW4gKyBzcGFjZUluc2VydGVkKSB7CiAgICAgICAgICBjaGFuZ2VzLnB1c2goe3RleHQ6IFtzcGFjZUluc2VydGVkID8gIiAiIDogIiJdLAogICAgICAgICAgICAgICAgICAgICAgICBmcm9tOiBQb3MoY3VyTm8sIG9sZExlbiksCiAgICAgICAgICAgICAgICAgICAgICAgIHRvOiBQb3MoY3VyTm8gKyAxLCBzcGFjZVRyaW1tZWQubGVuZ3RoKX0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjdXJMaW5lID0gbGVhZGluZ1NwYWNlICsgdGV4dDsKICAgICAgICAgICsrY3VyTm87CiAgICAgICAgfQogICAgICB9CiAgICAgIHdoaWxlIChjdXJMaW5lLmxlbmd0aCA+IGNvbHVtbikgewogICAgICAgIHZhciBicCA9IGZpbmRCcmVha1BvaW50KGN1ckxpbmUsIGNvbHVtbiwgd3JhcE9uLCBraWxsVHJhaWxpbmcpOwogICAgICAgIGNoYW5nZXMucHVzaCh7dGV4dDogWyIiLCBsZWFkaW5nU3BhY2VdLAogICAgICAgICAgICAgICAgICAgICAgZnJvbTogUG9zKGN1ck5vLCBicC5mcm9tKSwKICAgICAgICAgICAgICAgICAgICAgIHRvOiBQb3MoY3VyTm8sIGJwLnRvKX0pOwogICAgICAgIGN1ckxpbmUgPSBsZWFkaW5nU3BhY2UgKyBjdXJMaW5lLnNsaWNlKGJwLnRvKTsKICAgICAgICArK2N1ck5vOwogICAgICB9CiAgICB9CiAgICBpZiAoY2hhbmdlcy5sZW5ndGgpIGNtLm9wZXJhdGlvbihmdW5jdGlvbigpIHsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGFuZ2VzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgdmFyIGNoYW5nZSA9IGNoYW5nZXNbaV07CiAgICAgICAgaWYgKGNoYW5nZS50ZXh0IHx8IENvZGVNaXJyb3IuY21wUG9zKGNoYW5nZS5mcm9tLCBjaGFuZ2UudG8pKQogICAgICAgICAgY20ucmVwbGFjZVJhbmdlKGNoYW5nZS50ZXh0LCBjaGFuZ2UuZnJvbSwgY2hhbmdlLnRvKTsKICAgICAgfQogICAgfSk7CiAgICByZXR1cm4gY2hhbmdlcy5sZW5ndGggPyB7ZnJvbTogY2hhbmdlc1swXS5mcm9tLCB0bzogQ29kZU1pcnJvci5jaGFuZ2VFbmQoY2hhbmdlc1tjaGFuZ2VzLmxlbmd0aCAtIDFdKX0gOiBudWxsOwogIH0KCiAgQ29kZU1pcnJvci5kZWZpbmVFeHRlbnNpb24oIndyYXBQYXJhZ3JhcGgiLCBmdW5jdGlvbihwb3MsIG9wdGlvbnMpIHsKICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwogICAgaWYgKCFwb3MpIHBvcyA9IHRoaXMuZ2V0Q3Vyc29yKCk7CiAgICB2YXIgcGFyYSA9IGZpbmRQYXJhZ3JhcGgodGhpcywgcG9zLCBvcHRpb25zKTsKICAgIHJldHVybiB3cmFwUmFuZ2UodGhpcywgUG9zKHBhcmEuZnJvbSwgMCksIFBvcyhwYXJhLnRvIC0gMSksIG9wdGlvbnMpOwogIH0pOwoKICBDb2RlTWlycm9yLmNvbW1hbmRzLndyYXBMaW5lcyA9IGZ1bmN0aW9uKGNtKSB7CiAgICBjbS5vcGVyYXRpb24oZnVuY3Rpb24oKSB7CiAgICAgIHZhciByYW5nZXMgPSBjbS5saXN0U2VsZWN0aW9ucygpLCBhdCA9IGNtLmxhc3RMaW5lKCkgKyAxOwogICAgICBmb3IgKHZhciBpID0gcmFuZ2VzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgdmFyIHJhbmdlID0gcmFuZ2VzW2ldLCBzcGFuOwogICAgICAgIGlmIChyYW5nZS5lbXB0eSgpKSB7CiAgICAgICAgICB2YXIgcGFyYSA9IGZpbmRQYXJhZ3JhcGgoY20sIHJhbmdlLmhlYWQsIHt9KTsKICAgICAgICAgIHNwYW4gPSB7ZnJvbTogUG9zKHBhcmEuZnJvbSwgMCksIHRvOiBQb3MocGFyYS50byAtIDEpfTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc3BhbiA9IHtmcm9tOiByYW5nZS5mcm9tKCksIHRvOiByYW5nZS50bygpfTsKICAgICAgICB9CiAgICAgICAgaWYgKHNwYW4udG8ubGluZSA+PSBhdCkgY29udGludWU7CiAgICAgICAgYXQgPSBzcGFuLmZyb20ubGluZTsKICAgICAgICB3cmFwUmFuZ2UoY20sIHNwYW4uZnJvbSwgc3Bhbi50bywge30pOwogICAgICB9CiAgICB9KTsKICB9OwoKICBDb2RlTWlycm9yLmRlZmluZUV4dGVuc2lvbigid3JhcFJhbmdlIiwgZnVuY3Rpb24oZnJvbSwgdG8sIG9wdGlvbnMpIHsKICAgIHJldHVybiB3cmFwUmFuZ2UodGhpcywgZnJvbSwgdG8sIG9wdGlvbnMgfHwge30pOwogIH0pOwoKICBDb2RlTWlycm9yLmRlZmluZUV4dGVuc2lvbigid3JhcFBhcmFncmFwaHNJblJhbmdlIiwgZnVuY3Rpb24oZnJvbSwgdG8sIG9wdGlvbnMpIHsKICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwogICAgdmFyIGNtID0gdGhpcywgcGFyYXMgPSBbXTsKICAgIGZvciAodmFyIGxpbmUgPSBmcm9tLmxpbmU7IGxpbmUgPD0gdG8ubGluZTspIHsKICAgICAgdmFyIHBhcmEgPSBmaW5kUGFyYWdyYXBoKGNtLCBQb3MobGluZSwgMCksIG9wdGlvbnMpOwogICAgICBwYXJhcy5wdXNoKHBhcmEpOwogICAgICBsaW5lID0gcGFyYS50bzsKICAgIH0KICAgIHZhciBtYWRlQ2hhbmdlID0gZmFsc2U7CiAgICBpZiAocGFyYXMubGVuZ3RoKSBjbS5vcGVyYXRpb24oZnVuY3Rpb24oKSB7CiAgICAgIGZvciAodmFyIGkgPSBwYXJhcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkKICAgICAgICBtYWRlQ2hhbmdlID0gbWFkZUNoYW5nZSB8fCB3cmFwUmFuZ2UoY20sIFBvcyhwYXJhc1tpXS5mcm9tLCAwKSwgUG9zKHBhcmFzW2ldLnRvIC0gMSksIG9wdGlvbnMpOwogICAgfSk7CiAgICByZXR1cm4gbWFkZUNoYW5nZTsKICB9KTsKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/AUTHORS</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[TGlzdCBvZiBDb2RlTWlycm9yIGNvbnRyaWJ1dG9ycy4gVXBkYXRlZCBiZWZvcmUgZXZlcnkgcmVsZWFzZS4KCjRyMnIKQWFyb24gQnJvb2tzCkFiZGVsb3VhaGFiCkFiZSBGZXR0aWcKQWRhbSBBaG1lZApBZGFtIEtpbmcKYWRhbmxvYmF0bwpBZMOhbiBMb2JhdG8KQWRyaWFuIEFpY2huZXIKQWRyaWFuIEhlaW5lCmFlcm9zb24KQWhtYWQgQW1pcmVoCkFobWFkIE0uIFphd2F3aQphaG93YXJkCkFrZWtzYW5kciBNb3Rzam9ub3YKQWxhc2RhaXIgU21pdGgKQWxiZXJ0byBHb256w6FsZXogUGFsb21vCkFsYmVydG8gUG9zZQpBbGJlcnQgWGluZwpBbGV4YW5kZXIgUGF2bG92CkFsZXhhbmRlciBTY2hlcGFub3Zza2kKQWxleGFuZGVyIFNodmV0cwpBbGV4YW5kZXIgU29sb3Z5b3YKQWxleGFuZHJlIEJpcXVlCmFsZXhleS1rCkFsZXggUGlnZ290dApBbGlha3NlaSBDaGFweXpoZW5rYQpBbGxlbiBTYXJraXN5YW4KQW1pbiBTaGFsaQpBbWluIFVsbGFoIEtoYW4KYW1zaGFsaUBnb29nbGUuY29tCkFtc3VsCmFtdW50ZWFuCkFteQpBbmFueWEgU2VuCmFuYXJhbgpBbmRlcnNNYWQKQW5kZXJzIE5hd3JvdGgKQW5kZXJzb24gTWVzcXVpdGEKQW5kZXJzIFfDpWdsdW5kCkFuZHJlYSBHCkFuZHJlYXMgUmVpc2NodWNrCkFuZHJlcyBUYXlsb3IKQW5kcmUgdm9uIEhvdWNrCkFuZHJleSBGZWRvcm92CkFuZHJleSBLbHl1Y2huaWtvdgpBbmRyZXkgTHVzaG5pa292CkFuZHJleSBTaGNoZWtpbgpBbmR5IEpvc2xpbgpBbmR5IEtpbWJhbGwKQW5keSBMaQpBbmdlbG8KYW5nZWxvemVycgphbmdlbG8uemVyckBnbWFpbC5jb20KQW5raXQKQW5raXQgQWh1amEKQW5zZWwgU2FudG9zYQpBbnRob255IER1Z29pcwphbnRob255Z2VnbwpBbnRob255IEfDqWdvCkFudGhvbnkgR3JpbWVzCkFudG9uIEtvdmFseW92CkFwb2xsbyBaaHUKQVFOT1VDSCBNb2hhbW1lZAphcmVvcwpBcm5hYiBCb3NlCmFzM2JveWFuCmF0ZWxpZXJicmFtCkF0b21pY1BhZ2VzIExMQwpBdHVsIEJob3VyYXNrYXIKQXVyZWxpYW4gT2FuY2VhCkJhcnJldCBSZW5uaWUKQmFzYXJhdCBBbGkgU3llZApCYXN0aWFuIE11zIhsbGVyCmJlbGhhagpCZW0gSm9uZXMtQmV5CmJlbmJybwpCZW5pIENoZXJuaWF2c2t5LVBhc2tpbgpCZW5qYW1pbiBEZUNvc3RlCkJlbiBLZWVuCkJlbiBNaWxsZXIKQmVuIE1vc2hlcgpCZXJuaGFyZCBTaXJsaW5nZXIKQmVydCBDaGFuZwpCaGFyYWQKQmlsbHkgTW9vbgpiaW5ueQpCIEtyaXNobmEgQ2hhaXRhbnlhCkJsYWluZSBHCmJsdWthdDI5CmJvb215amVlCmJvcmF3am0KQnJhZCBNZXRjYWxmCkJyYW5kb24gRnJvaHMKQnJhbmRvbiBXYW1ib2xkdApCcmV0dCBaYW1pcgpCcmlhbiBHcmluc3RlYWQKQnJpYW4gU2xldHRlbgpCcnVjZSBNaXRjaGVuZXIKQ2FpdGxpbiBQb3R0ZXIKQ2FsaW4gQmFyYmF0CmNhbGxvZGFjaXR5CkNhbWlsbyBSb2NhCkNoYWQgSm9sbHkKQ2hhbmRyYSBTZWtoYXIgUHlkaQpDaGFybGVzIFNrZWx0b24KQ2hlYWggQ2h1IFllb3cKQ2hyaXMgQ295aWVyCkNocmlzIEZvcmQKQ2hyaXMgR3JhbmdlcgpDaHJpcyBIb3VzZWtuZWNodApDaHJpcyBMb2hmaW5rCkNocmlzIE1vcmdhbgpDaHJpcyBTbWl0aApDaHJpc3RpYW4gT3lhcnp1bgpDaHJpc3RpYW4gUGV0cm92CkNocmlzdG9waGVyIEJyb3duCkNocmlzdG9waGVyIE1pdGNoZWxsCkNocmlzdG9waGVyIFBmb2hsCkNodW5saWFuZyBMeXUKY2lhcmFuagpDb2RlQW5pbWFsCmNvZGVyYWlzZXIKQ29sZSBSIExhd3JlbmNlCkNvbUZyZWVrCkN1cnRpcyBHYWdsaWFyZGkKZGFnc3RhCmRhaW5lcwpEYWxlIEp1bmcKRGFuIEJlbnRsZXkKRGFuIEhlYmVyZGVuCkRhbmllbCwgRGFvIFF1YW5nIE1pbmgKRGFuaWVsZSBEaSBTYXJsaQpEYW5pZWwgRmF1c3QKRGFuaWVsIEh1aWdlbnMKRGFuaWVsIEtlc2xlcgpEYW5pZWwgS0oKRGFuaWVsIE5lZWwKRGFuaWVsIFBhcm5lbGwKRGFubnkgWW9vCmRhcmVhbHNoaW5qaQpEYXJpdXMgUm9iZXJ0cwpEYXZlIEJyb25kc2VtYQpEYXZlIE15ZXJzCkRhdmlkIEJhcm5ldHQKRGF2aWQgSC4gQnJvbmtlCkRhdmlkIE1pZ25vdApEYXZpZCBQYXRoYWtqZWUKRGF2aWQgVsOhenF1ZXoKRGF2aWQgV2hpdHRpbmd0b24KZGVlYnVnZ2VyCkRlZXAgVGhvdWdodApEZXZpbiBBYmJvdHQKRGV2b24gQ2FyZXcKRGljayBDaG9pCmRpZ25pZmllZHF1aXJlCkRpbWFnZSBTYXBlbGtpbgpEbWl0cnkgS2lzZWx5b3YKZG9tYWdvajQxMgpEb21pbmF0b3IwMDgKRG9taXppbyBEZW1pY2hlbGlzCkRvdWcgV2lrbGUKRHJldyBCcmF0Y2hlcgpEcmV3IEhpbnR6CkRyZXcgS2hvdXJ5CkRyaW5pIENhbWkKRHJvciBCRwpkdXJhbG9nCmVib3JkZW4KZWRzaGFycApla2hhbGVkCkVsaXPDqWUKRW5hbSBNaWpiYWggTm9vcgpFcmljIEFsbGFtCkVyaWsgV2VsYW5kZXIKZXVzdGFzCkZhYmllbiBPJ0NhcnJvbGwKRmFiaW8gWmVuZGhpIE5hZ2FvCkZhaXphIEFsc2FpZWQKRmF1bnRsZXJveQpmYnVjaGluZ2VyCmZlaXpoYW5nMzY1CkZlbGlwZSBMYWxhbm5lCkZlbGl4IFJhYWIKRmlsaXAgTm9ldHplbApGaWxpcCBTdG9sbMOhcgpmbGFjawpGb3JiZXNMaW5kZXNheQpGb3JiZXMgTGluZGVzYXkKRm9yZF9MYXdubW93ZXIKRm9ycmVzdCBPbGlwaGFudApGcmFuayBXaWVnYW5kCkdhYnJpZWwgR2hlb3JnaGlhbgpHYWJyaWVsIEhvcm5lcgpHYWJyaWVsIE5haG1pYXMKZ2FsYW1iYWxhenMKR2FyeSBTaGVuZwpHYXV0YW0gTWVodGEKR2F2aW4gRG91Z2xhcwpnZWtrb2UKZ2Vvd2FyaW4KR2VyYXJkIEJyYWFkCkdlcmdlbHkgSGVneWtvemkKR2lvdmFubmkgQ2Fsw7IKR2xlYm92IEJvcmlzCkdsZW5uIEpvcmRlCkdsZW5uIFJ1ZWhsZQpHb2xldmthCkdvb2dsZSBJbmMuCkdvcmRvbiBTbWl0aApHcmFudCBTa2lubmVyCmdyZWVuZ2lhbnQKR3JlZ29yeSBLb2JlcmdlcgpHcnplZ29yeiBNYXp1cgpHdWlsbGF1bWUgTWFzc2XMgQpHdWlsbGF1bWUgTWFzc8OpCmd1cmFnYQpHdXN0YXZvIFJvZHJpZ3VlcwpIYWthbiBUdW5jCkhhbnMgRW5nZWwKSGFyZGVzdApIYXJzaHZhcmRoYW4gR3VwdGEKSGFzYW4gS2FyYWhhbgpIZWN0b3IgT3N3YWxkbyBDYWJhbGxlcm8KSGVuZHJpayBXYWxsYmF1bQpIZXJjdWxhbm8gQ2FtcG9zCkhpcm95dWtpIE1ha2lubwpoaXRzdGhpbmdzCkhvY2RvYwpIdWd1ZXMgTWFscGhldHRlcwpJYW4gQmVjawpJYW4gRGlja2luc29uCklhbiBXZWhybWFuCklhbiBXZXRoZXJiZWUKSWNlIFdoaXRlCklDSElLQVdBLCBZdWppCmlkbGViZXJnCmlsdmFsbGUKSW5nbyBSaWNodGVyCklyYWtsaSBHb3phbGlzaHZpbGkKSXZhbiBLdXJub3NvdgpJdm9haApKYWNvYiBMZWUKSmFrb2IgTWlsYW5kCkpha3ViIFZyYW5hCkpha3ViIFZyw6FuYQpKYW1lcyBDYW1wb3MKSmFtZXMgSG93YXJkCkphbWVzIFRob3JuZQpKYW1pZSBIaWxsCkphbiBKb25nYm9vbQpqYW5rZXJvbW5lcwpKYW4gS2Vyb21uZXMKSmFuIE9kdmFya28KSmFuIFNjaMOkcgpKYW4gVC4gU290dApKYXJlZCBEZWFuCkphcmVkIEZvcnN5dGgKSmFyZWQgSmFjb2JzCkphc29uCkphc29uIEJhcm5hYmUKSmFzb24gR3JvdXQKSmFzb24gSm9obnN0b24KSmFzb24gU2FuIEpvc2UKSmFzb24gU2llZmtlbgpKYXlkZWVwIFNvbGFua2kKSmVhbiBCb3Vzc2llcgpKZWZmIEJsYWlzZGVsbApKZWZmIEplbmtpbnMKamVmZmtlbnRvbgpKZWZmIFBpY2toYXJkdApqZW0gKGdyYXBoaXRlKQpKZXJlbXkgUGFybWVudGVyCkppbQpKb2JKb2IKam9jaGVuYmVyZ2VyCkpvY2hlbiBCZXJnZXIKSm9lbCBFaW5iaW5kZXIKam9lbHBpbmhlaXJvCkpvaGFuIEFzawpKb2huIENvbm5vcgpKb2huIEVuZ2xlcgpKb2huIExlZXMtTWlsbGVyCkpvaG4gU25lbHNvbgpKb2huIFZhbiBEZXIgTG9vCkpvbiBBbmRlciBQZcOxYWxiYQpKb25hcyBEw7ZiZXJ0aW4KSm9uYXRoYW4gTWFsbWF1ZApKb24gR2FjbmlrCmpvbmdhbGxvd2F5CkpvbiBNYWxtYXVkCkpvbiBTYW5nc3RlcgpKb29zdC1XaW0gQm9la2VzdGVpam4KSm9zZXBoIFBlY29yYXJvCkpvc2ggQ29oZW4KSm9zaCBTb3JlZgpKb3NodWEgTmV3bWFuCkpvc2ggV2F0em1hbgpqb3RzCmpzb29qZW9uCmp1MWl1cwpKdWFuIEJlbmF2aWRlcyBSb21lcm8KSnVjb3ZzY2hpIENvbnN0YW50aW4KSnVobyBWdW9yaQpKdWxpZW4gUmViZXRlegpKdXN0aW4gQW5kcmVzZW4KSnVzdGluIEhpbGVtYW4KandhbGxlcnNAZ21haWwuY29tCmthbmlnYQprYXJldm4KS2F5dXIgUGF0ZWwKS2VuIE5ld21hbgprZW4gcmVzdGl2bwpLZW4gUm9ja290CktldmluIEVhcmxzCktldmluIFNhd2lja2kKS2V2aW4gVXNoZXkKS2xhdXMgU2lsdmVpcmEKS29oIFppIEhhbiwgQ2xpZmYKa29tYWtpbm8KS29uc3RhbnRpbiBMb3B1aGluCmtvb3BzCktyaXMgQ2ljY2FyZWxsbwprcy1pZndhcmUKa3ViZWxzbWllY2kKS3dhbkVzcQpLeWxlIEtlbGxleQpMYW5mZWkKTGFubnkKTGFzemxvIFZpZGFjcwpsZWFmIGNvcmNvcmFuCkxlb25pZCBLaGFjaGF0dXJvdgpMZW9uIFNvcm9raW4KTGVvbnlhIEtoYWNoYXR1cm92CkxpYW0gTmV3bWFuCkxpYm8gQ2FubmljaQpMbG95ZE1pbGxpZ2FuCkxNCmxvY2hlbApMb3JlbnpvIFN0b2FrZXMKTHVjaWFubyBMb25nbwpMdSBGYW5namlhbgpMdWtlIEJyb3duaW5nCkx1a2UgR3Jhbmdlci1Ccm93bgpMdWtlIFN0YWduZXIKbHluc2NoaW56ZXIKTTFjaGEKTWFkaHVyYSBKYXlhcmF0bmUKTWFrc2ltIExpbgpNYWtzeW0gVGFyYW4KTWFsYXkgTWFqaXRoaWEKTWFuaWRlZXAKTWFudWVsIFJlZ28gQ2FzYXNub3ZhcwpNYXJhdCBEcmVpemluCk1hcmNlbCBHZXJiZXIKTWFyY28gQXVyw6lsaW8KTWFyY28gTXVuaXphZ2EKTWFyY3VzIEJvaW50b24KTWFyZWsgUnVkbmlja2kKTWFyaWpuIEhhdmVyYmVrZQpNw6FyaW8gR29uw6dhbHZlcwpNYXJpbyBQaWV0c2NoCk1hcmsgQW5kZXJzb24KTWFyayBMZW50Y3puZXIKTWFya28gQm9uYWNpCk1hcmsgUGVhY2UKTWFya3VzIEJvcmRpaG4KTWFydGluIEJhbGVrCk1hcnTDrW4gR2FpdMOhbgpNYXJ0aW4gSGFzb8WICk1hcnRpbiBIdW50Ck1hcnRpbiBMYWluZQpNYXJ0aW4gWmFnb3JhCk1hc29uIE1hbG9uZQpNYXRldXN6IFBhcHJvY2tpCk1hdGhpYXMgQnluZW5zCm1hdHMgY3JvbnF2aXN0Ck1hdHQgR2FpZGUKTWF0dGhldyBCYXVlcgpNYXR0aGV3IEJlYWxlCm1hdHRoZXdoYXllcwpNYXR0aGV3IFJhdGhib25lCk1hdHRoaWFzIEJ1c3Nvbm5pZXIKTWF0dGhpYXMgQlVTU09OTklFUgpNYXR0IE1jRG9uYWxkCk1hdHQgUGFzcwpNYXR0IFNhY2tzCm1hdXJpY2lvCk1heGltaWxpYW4gSGlscwpNYXhpbSBLcmFldgpNYXggS2lyc2NoCk1heCBTY2hhZWZlcgpNYXggWGlhbnR1Cm1iYXJraGF1Ck1jQnJhaW55Cm1lbHBvbgpNZXRhdGhlb3MKTWljYWggRHViaW5rbwpNaWNoYWVsCk1pY2hhZWwgR29kZXJiYXVlcgpNaWNoYWVsIEdyZXkKTWljaGFlbCBLYW1pbnNreQpNaWNoYWVsIExlaGVuYmF1ZXIKTWljaGFlbCBaaG91Ck1pY2hhbCBEb3JuZXIKTWlnaHR5IEd1YXZhCk1pZ3VlbCBDYXN0aWxsbwptaWhhaWxpawpNaWtlCk1pa2UgQnJldm9vcnQKTWlrZSBEaWF6Ck1pa2UgSXZhbm92Ck1pa2UgS2FkaW4KTWlrZSBLb2JpdApNaW5SSwpNaXJhY3VsaXg4NwptaXNmbwpta2FtaW5za3kxMQptbG9naW5vdgpNb3JpdHogU2Nod8O2cmVyCm1wcwptcwptdGFyYW4tZ29vZ2xlCk11LUFuIENoaW91Ck5hcmNpc28gSmFyYW1pbGxvCk5hdGhhbiBXaWxsaWFtcwpuZHIKbmVyYmVydApuZXh0cmV2aXNpb24KbmduCm5ndWlsbGF1bWluCk5nIFpoaSBBbgpOaWNob2xhcyBCb2xsd2VnCk5pY2hvbGFzIEJvbGx3ZWcgKE5pY2spCk5pY2sgS3JlZWdlcgpOaWNrIFNtYWxsCk5pY29sw7IgUmliYXVkbwpOaWVscyB2YW4gR3JvbmluZ2VuCm5pZ2h0d2luZwpOaWtpdGEgQmVsb2dsYXpvdgpOaWtpdGEgVmFzaWx5ZXYKTmlrb2xheSBLb3N0b3YKbmlscDBpbnRlcgpOaXNhcmcgSmhhdmVyaQpubHdpbGxpYQpub3JhZ3Jvc3NtYW4KTm9ybWFuIFJ6ZXBrYQpPcmVvbHV3YSBPbmF0ZW1vd28KT3NrYXIgU2VnZXJzdsOkcmQKcGFibG8KcGFibG9mZXJ6ClBhZ2UKUGFudXBvbmcgUGFzdXBhdApwYXJpcwpQYXJpcwpQYXRpbCBBcnBpdGgKUGF0cmljayBTdG9pY2EKUGF0cmljayBTdHJhd2Rlcm1hbgpQYXVsIEdhcnZpbgpQYXVsIEl2YW5vdgpQYXVsIE1hc3NvbgpQYXZlbApQYXZlbCBGZWxkbWFuClBhdmVsIFBldHLFvmVsYQpQYXZlbCBTdHJhc2hraW4KUGF3ZcWCIEJhcnRraWV3aWN6CnBldGVndWhsCnBldGVyClBldGVyIEZseW5uCnBldGVya3Jvb24KUGV0ZXIgS3Jvb24KUGhpbGlwcCBBClBoaWxpcCBTdGFkZXJtYW5uClBpZXJyZSBHZXJvbGQKUGnDq3QgRGVscG9ydApQb250dXMgTWVsa2UKcHJhc2FudGhqClByYXNhbnRoIEoKUHJheWFnIFZlcm1hClJhZGVrIFBpw7Nya293c2tpClJhaHVsClJhaHVsIEFuYW5kCnJhbXdpbjEKUmFuZGFsbCBNYXNvbgpSYW5keSBCdXJkZW4KUmFuZHkgRWRtdW5kcwpSYXNtdXMgRXJpayBWb2VsIEplbnNlbgpyYXkgcmF0Y2h1cApSYXkgUmF0Y2h1cApSZW1pIE55Ym9yZwpSaWNoYXJkIERlbnRvbgpSaWNoYXJkIHZhbiBkZXIgTWVlcgpSaWNoYXJkIFouSC4gV2FuZwpSb2JlcnQgQ3Jvc3NmaWVsZApSb2JlcnRvIEFiZGVsa2FkZXIgTWFydMOtbmV6IFDDqXJlegpyb2JlcnRvcDIzClJvYmVydCBQbHVtbWVyClJyYW5kb20KUnVzbGFuIE9zbWFub3YKUnlhbiBQcmlvcgpzYWJhY2EKU2FtIExlZQpTYW11ZWwgQWluc3dvcnRoClNhbSBXaWxzb24Kc2FuZGVlcHNoZXR0eQpTYW5kZXIgQUtBIFJlZHNhbmRybwpzYW50ZWMKU2FzY2hhIFBlaWxpY2tlCnNhdGFtYXMKc2F0Y2htb3J1bgpzYXRoeWFtb29ydGhpClMuIENocmlzIENvbGJlcnQKU0NMSU5JQ1xqZGVja2VyClNjb3R0IEFpa2luClNjb3R0IEdvb2RoZXcKU2ViYXN0aWFuIFphaGEKU2VyZ2V5IEdvZGVyClNlcmdleSBUc2Vsb3ZhbG5pa292ClNlLVdvbiBLaW0Kc2hhdW5kCnNoYXVuIGdpbGNocmlzdApTaGF3biBBClNoZWEgQnVuZ2UKc2hlb3BvcnkKU2hpdiBEZWVwYWsKU2htdWVsIEVuZ2xhcmQKU2h1YmhhbSBKYWluClNpYW1hayBNb2todGFyaQpzaWx2ZXJ3aW5kCnNpbmt1dQpzbmFzYQpzb2xpdG9uNApzb25zb24Kc3Bhc3RvcmVsbGkKc3JhamFucGFsaXdhbApTdGFuaXNsYXYgT2FzZXJlbGUKU3RhcyBLb2J6YXIKU3RlZmFuIEJvcnNqZQpTdGVmZmVuIEJleWVyClN0ZWZmZW4gQnJ1Y2htYW5uClN0ZXBoZW4gTGF2ZWxsZQpTdGV2ZSBDaGFtcGFnbmUKU3RldmUgTydIYXJhCnN0b3Nrb3YKU3R1IEtlbm5lZHkKU3VuZ2hvIEtpbQpzdmVyd2VpagpUYWhhIEphaGFuZ2lyClRha28gU2Nob3RhbnVzClRha3VqaSBTaGltb2thd2EKVGFybWlsClREYWdsaXMKdGVsCnRmamdlb3JnZQpUaGFkZGVlIFR5bAp0aGFuYXNpcwpUaGVIb3dsCnRoZW1ybWF4CnRoaW5rClRob21hcyBEdm9ybmlrClRob21hcyBLbHV5dmVyClRob21hcyBTY2htaWQKVGltIEFsYnkKVGltIEJhdW1hbm4KVGltb3RoeSBGYXJyZWxsClRpbW90aHkgR3UKVGltb3RoeSBIYXRjaGVyClRvYmlhc0JnClRvZGQgQmVybWFuClRvbWFzLUEKVG9tYXMgVmFyYW5lY2thcwpUb20gRXJpayBTdMO4d2VyClRvbSBNYWNXcmlnaHQKVG9ueSBKaWFuClRyYXZpcyBIZXBwZQpUcmlhbmdsZTcxNwpUcmlzdGFuIFRhcnJhbnQKVFNVWVVTQVRPIEtpdHN1bmUKdHdpZmthawpWYXBpZFdvcngKVmVzdGltaXIgTWFya292CnZmClZpY3RvciBCb2NoYXJza3kKVmluY2VudCBXb28KVm9sa2VyIE1pc2NoZQpXZWl5YW4gU2hhbwp3ZW5saQpXZXMgQ29zc2ljawpXZXNsZXkgV2lzZXIKV2lsbCBCaW5ucy1TbWl0aApXaWxsIERlYW4KV2lsbGlhbSBKYW1pZXNvbgpXaWxsaWFtIFN0ZWluCldpbGx5CldvanRlayBQdGFrCld1IENoZW5nLUhhbgpYYXZpZXIgTWVuZGV6Cllhc3NpbiBOLiBIYXNzYW4KWU5IIFdlYmRldgpZdW5jaGkgTHVvCll1dmkgUGFuZGEKWmFjIEFuZ2VyClphY2hhcnkgRHJlbWFubgpaaGFuZyBIYW8KenppdW5pCumtj+m5j+WImgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/bin/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/bin/authors.sh</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[IyBDb21iaW5lIGV4aXN0aW5nIGxpc3Qgb2YgYXV0aG9ycyB3aXRoIGV2ZXJ5b25lIGtub3duIGluIGdpdCwgc29ydCwgYWRkIGhlYWRlci4KdGFpbCAtLWxpbmVzPSszIEFVVEhPUlMgPiBBVVRIT1JTLnRtcApnaXQgbG9nIC0tZm9ybWF0PSclYU4nID4+IEFVVEhPUlMudG1wCmVjaG8gLWUgIkxpc3Qgb2YgQ29kZU1pcnJvciBjb250cmlidXRvcnMuIFVwZGF0ZWQgYmVmb3JlIGV2ZXJ5IHJlbGVhc2UuXG4iID4gQVVUSE9SUwpzb3J0IC11IEFVVEhPUlMudG1wID4+IEFVVEhPUlMKcm0gLWYgQVVUSE9SUy50bXAK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/bin/compress</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[IyEvdXNyL2Jpbi9lbnYgbm9kZQoKLy8gQ29tcHJlc3Npb24gaGVscGVyIGZvciBDb2RlTWlycm9yCi8vCi8vIEV4YW1wbGU6Ci8vCi8vICAgYmluL2NvbXByZXNzIGNvZGVtaXJyb3IgcnVubW9kZSBqYXZhc2NyaXB0IHhtbAovLwovLyBXaWxsIHRha2UgbGliL2NvZGVtaXJyb3IuanMsIGFkZG9uL3J1bm1vZGUvcnVubW9kZS5qcywKLy8gbW9kZS9qYXZhc2NyaXB0L2phdmFzY3JpcHQuanMsIGFuZCBtb2RlL3htbC94bWwuanMsIHJ1biB0aGVtIHRob3VnaAovLyB0aGUgb25saW5lIG1pbmlmaWVyIGF0IGh0dHA6Ly9tYXJpam5oYXZlcmJla2UubmwvdWdsaWZ5anMsIGFuZCBzcGl0Ci8vIG91dCB0aGUgcmVzdWx0LgovLwovLyAgIGJpbi9jb21wcmVzcyBjb2RlbWlycm9yIC0tbG9jYWwgL3BhdGgvdG8vYmluL1VnbGlmeUpTCi8vCi8vIFdpbGwgdXNlIGEgbG9jYWwgbWluaWZpZXIgaW5zdGVhZCBvZiB0aGUgb25saW5lIGRlZmF1bHQgb25lLgovLwovLyBTY3JpcHQgZmlsZXMgYXJlIHNwZWNpZmllZCB3aXRob3V0IC5qcyBlbmRpbmcuIFByZWZpeGluZyB0aGVtIHdpdGgKLy8gdGhlaXIgZnVsbCAobG9jYWwpIHBhdGggaXMgb3B0aW9uYWwuIFNvIHlvdSBtYXkgc2F5IGxpYi9jb2RlbWlycm9yCi8vIG9yIG1vZGUveG1sL3htbCB0byBiZSBtb3JlIHByZWNpc2UuIEluIGZhY3QsIGV2ZW4gdGhlIC5qcyBzdWZmaXgKLy8gbWF5IGJlIHNwZWNpZmllZCwgaWYgd2FudGVkLgoKInVzZSBzdHJpY3QiOwoKdmFyIGZzID0gcmVxdWlyZSgiZnMiKTsKCmZ1bmN0aW9uIGhlbHAob2spIHsKICBjb25zb2xlLmxvZygidXNhZ2U6ICIgKyBwcm9jZXNzLmFyZ3ZbMV0gKyAiIFstLWxvY2FsIC9wYXRoL3RvL3VnbGlmeWpzXSBmaWxlcy4uLiIpOwogIHByb2Nlc3MuZXhpdChvayA/IDAgOiAxKTsKfQoKdmFyIGxvY2FsID0gbnVsbCwgYXJncyA9IFtdLCBleHRyYUFyZ3MgPSBudWxsLCBmaWxlcyA9IFtdLCBibG9iID0gIiI7Cgpmb3IgKHZhciBpID0gMjsgaSA8IHByb2Nlc3MuYXJndi5sZW5ndGg7ICsraSkgewogIHZhciBhcmcgPSBwcm9jZXNzLmFyZ3ZbaV07CiAgaWYgKGFyZyA9PSAiLS1sb2NhbCIgJiYgaSArIDEgPCBwcm9jZXNzLmFyZ3YubGVuZ3RoKSB7CiAgICB2YXIgcGFydHMgPSBwcm9jZXNzLmFyZ3ZbKytpXS5zcGxpdCgvXHMrLyk7CiAgICBsb2NhbCA9IHBhcnRzWzBdOwogICAgZXh0cmFBcmdzID0gcGFydHMuc2xpY2UoMSk7CiAgICBpZiAoIWV4dHJhQXJncy5sZW5ndGgpIGV4dHJhQXJncyA9IFsiLWMiLCAiLW0iXTsKICB9IGVsc2UgaWYgKGFyZyA9PSAiLS1oZWxwIikgewogICAgaGVscCh0cnVlKTsKICB9IGVsc2UgaWYgKGFyZ1swXSAhPSAiLSIpIHsKICAgIGZpbGVzLnB1c2goe25hbWU6IGFyZywgcmU6IG5ldyBSZWdFeHAoIig/OlxcL3xeKSIgKyBhcmcgKyAoL1wuanMkLy50ZXN0KGFyZykgPyAiJCIgOiAiXFwuanMkIikpfSk7CiAgfSBlbHNlIGhlbHAoZmFsc2UpOwp9CgpmdW5jdGlvbiB3YWxrKGRpcikgewogIGZzLnJlYWRkaXJTeW5jKGRpcikuZm9yRWFjaChmdW5jdGlvbihmbmFtZSkgewogICAgaWYgKC9eW19cLl0vLnRlc3QoZm5hbWUpKSByZXR1cm47CiAgICB2YXIgZmlsZSA9IGRpciArIGZuYW1lOwogICAgaWYgKGZzLnN0YXRTeW5jKGZpbGUpLmlzRGlyZWN0b3J5KCkpIHJldHVybiB3YWxrKGZpbGUgKyAiLyIpOwogICAgaWYgKGZpbGVzLnNvbWUoZnVuY3Rpb24oc3BlYywgaSkgewogICAgICB2YXIgbWF0Y2ggPSBzcGVjLnJlLnRlc3QoZmlsZSk7CiAgICAgIGlmIChtYXRjaCkgZmlsZXMuc3BsaWNlKGksIDEpOwogICAgICByZXR1cm4gbWF0Y2g7CiAgICB9KSkgewogICAgICBpZiAobG9jYWwpIGFyZ3MucHVzaChmaWxlKTsKICAgICAgZWxzZSBibG9iICs9IGZzLnJlYWRGaWxlU3luYyhmaWxlLCAidXRmOCIpOwogICAgfQogIH0pOwp9Cgp3YWxrKCJsaWIvIik7CndhbGsoImFkZG9uLyIpOwp3YWxrKCJtb2RlLyIpOwoKaWYgKCFsb2NhbCAmJiAhYmxvYikgaGVscChmYWxzZSk7CgppZiAoZmlsZXMubGVuZ3RoKSB7CiAgY29uc29sZS5sb2coIlNvbWUgc3BlY2lmaWVkIGZpbGVzIHdlcmUgbm90IGZvdW5kOiAiICsKICAgICAgICAgICAgICBmaWxlcy5tYXAoZnVuY3Rpb24oYSl7cmV0dXJuIGEubmFtZTt9KS5qb2luKCIsICIpKTsKICBwcm9jZXNzLmV4aXQoMSk7Cn0KICAKaWYgKGxvY2FsKSB7CiAgcmVxdWlyZSgiY2hpbGRfcHJvY2VzcyIpLnNwYXduKGxvY2FsLCBhcmdzLmNvbmNhdChleHRyYUFyZ3MpLCB7c3RkaW86IFsiaWdub3JlIiwgcHJvY2Vzcy5zdGRvdXQsIHByb2Nlc3Muc3RkZXJyXX0pOwp9IGVsc2UgewogIHZhciBkYXRhID0gbmV3IEJ1ZmZlcigianNfY29kZT0iICsgcmVxdWlyZSgicXVlcnlzdHJpbmciKS5lc2NhcGUoYmxvYiksICJ1dGY4Iik7CiAgdmFyIHJlcSA9IHJlcXVpcmUoImh0dHAiKS5yZXF1ZXN0KHsKICAgIGhvc3Q6ICJtYXJpam5oYXZlcmJla2UubmwiLAogICAgcG9ydDogODAsCiAgICBtZXRob2Q6ICJQT1NUIiwKICAgIHBhdGg6ICIvdWdsaWZ5anMiLAogICAgaGVhZGVyczogeyJjb250ZW50LXR5cGUiOiAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwKICAgICAgICAgICAgICAiY29udGVudC1sZW5ndGgiOiBkYXRhLmxlbmd0aH0KICB9KTsKICByZXEub24oInJlc3BvbnNlIiwgZnVuY3Rpb24ocmVzcCkgewogICAgcmVzcC5vbigiZGF0YSIsIGZ1bmN0aW9uIChjaHVuaykgeyBwcm9jZXNzLnN0ZG91dC53cml0ZShjaHVuayk7IH0pOwogIH0pOwogIHJlcS5lbmQoZGF0YSk7Cn0K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/bin/lint</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[IyEvdXNyL2Jpbi9lbnYgbm9kZQoKcHJvY2Vzcy5leGl0KHJlcXVpcmUoIi4uL3Rlc3QvbGludCIpLm9rID8gMCA6IDEpOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/bin/release</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[IyEvdXNyL2Jpbi9lbnYgbm9kZQoKdmFyIGZzID0gcmVxdWlyZSgiZnMiKSwgY2hpbGQgPSByZXF1aXJlKCJjaGlsZF9wcm9jZXNzIik7Cgp2YXIgbnVtYmVyLCBidW1wT25seTsKCmZvciAodmFyIGkgPSAyOyBpIDwgcHJvY2Vzcy5hcmd2Lmxlbmd0aDsgaSsrKSB7CiAgaWYgKHByb2Nlc3MuYXJndltpXSA9PSAiLWJ1bXAiKSBidW1wT25seSA9IHRydWU7CiAgZWxzZSBpZiAoL15cZCtcLlxkK1wuXGQrJC8udGVzdChwcm9jZXNzLmFyZ3ZbaV0pKSBudW1iZXIgPSBwcm9jZXNzLmFyZ3ZbaV07CiAgZWxzZSB7IGNvbnNvbGUubG9nKCJCb2d1cyBjb21tYW5kIGxpbmUgYXJnOiAiICsgcHJvY2Vzcy5hcmd2W2ldKTsgcHJvY2Vzcy5leGl0KDEpOyB9Cn0KCmlmICghbnVtYmVyKSB7IGNvbnNvbGUubG9nKCJNdXN0IGdpdmUgYSB2ZXJzaW9uIik7IHByb2Nlc3MuZXhpdCgxKTsgfQoKZnVuY3Rpb24gcmV3cml0ZShmaWxlLCBmKSB7CiAgZnMud3JpdGVGaWxlU3luYyhmaWxlLCBmKGZzLnJlYWRGaWxlU3luYyhmaWxlLCAidXRmOCIpKSwgInV0ZjgiKTsKfQoKcmV3cml0ZSgic3JjL2VkaXQvbWFpbi5qcyIsIGZ1bmN0aW9uKGxpYikgewogIHJldHVybiBsaWIucmVwbGFjZSgvQ29kZU1pcnJvclwudmVyc2lvbiA9ICJcZCtcLlxkK1wuXGQrIi8sCiAgICAgICAgICAgICAgICAgICAgICJDb2RlTWlycm9yLnZlcnNpb24gPSBcIiIgKyBudW1iZXIgKyAiXCIiKTsKfSk7CmZ1bmN0aW9uIHJld3JpdGVKU09OKHBhY2spIHsKICByZXR1cm4gcGFjay5yZXBsYWNlKC8idmVyc2lvbiI6XHMqIlxkK1wuXGQrXC5cZCsiLywgIlwidmVyc2lvblwiOiBcIiIgKyBudW1iZXIgKyAiXCIiKTsKfQpyZXdyaXRlKCJwYWNrYWdlLmpzb24iLCByZXdyaXRlSlNPTik7CnJld3JpdGUoImRvYy9tYW51YWwuaHRtbCIsIGZ1bmN0aW9uKG1hbnVhbCkgewogIHJldHVybiBtYW51YWwucmVwbGFjZSgvPnZlcnNpb24gXGQrXC5cZCtcLlxkKzxcL3NwYW4+LywgIj52ZXJzaW9uICIgKyBudW1iZXIgKyAiPC9zcGFuPiIpOwp9KTsKCmlmIChidW1wT25seSkgcHJvY2Vzcy5leGl0KDApOwoKY2hpbGQuZXhlYygiYmFzaCBiaW4vYXV0aG9ycy5zaCIsIGZ1bmN0aW9uKCl7fSk7CgpyZXdyaXRlKCJpbmRleC5odG1sIiwgZnVuY3Rpb24oaW5kZXgpIHsKICByZXR1cm4gaW5kZXgucmVwbGFjZSgvXC56aXAiPlxkK1wuXGQrXC5cZCs8XC9hPi8sCiAgICAgICAgICAgICAgICAgICAgICAgIi56aXBcIj4iICsgbnVtYmVyICsgIjwvYT4iKTsKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/bin/source-highlight</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[IyEvdXNyL2Jpbi9lbnYgbm9kZQoKLy8gU2ltcGxlIGNvbW1hbmQtbGluZSBjb2RlIGhpZ2hsaWdodGluZyB0b29sLiBSZWFkcyBjb2RlIGZyb20gc3RkaW4sCi8vIHNwaXRzIGh0bWwgdG8gc3Rkb3V0LiBGb3IgZXhhbXBsZToKLy8KLy8gICBlY2hvICdmdW5jdGlvbiBmb28oYSkgeyByZXR1cm4gYTsgfScgfCBiaW4vc291cmNlLWhpZ2hsaWdodCAtcyBqYXZhc2NyaXB0Ci8vICAgYmluL3NvdXJjZS1oaWdobGlnaHQgLXMgCgp2YXIgZnMgPSByZXF1aXJlKCJmcyIpOwoKdmFyIENvZGVNaXJyb3IgPSByZXF1aXJlKCIuLi9hZGRvbi9ydW5tb2RlL3J1bm1vZGUubm9kZS5qcyIpOwpyZXF1aXJlKCIuLi9tb2RlL21ldGEuanMiKTsKCnZhciBzUG9zID0gcHJvY2Vzcy5hcmd2LmluZGV4T2YoIi1zIik7CmlmIChzUG9zID09IC0xIHx8IHNQb3MgPT0gcHJvY2Vzcy5hcmd2Lmxlbmd0aCAtIDEpIHsKICAgY29uc29sZS5lcnJvcigiVXNhZ2U6IHNvdXJjZS1oaWdobGlnaHQgLXMgbGFuZ3VhZ2UiKTsKICAgcHJvY2Vzcy5leGl0KDEpOwp9CnZhciBsYW5nID0gcHJvY2Vzcy5hcmd2W3NQb3MgKyAxXS50b0xvd2VyQ2FzZSgpLCBtb2RlTmFtZSA9IGxhbmc7CkNvZGVNaXJyb3IubW9kZUluZm8uZm9yRWFjaChmdW5jdGlvbihpbmZvKSB7CiAgaWYgKGluZm8ubWltZSA9PSBsYW5nKSB7CiAgICBtb2RlTmFtZSA9IGluZm8ubW9kZTsKICB9IGVsc2UgaWYgKGluZm8ubmFtZS50b0xvd2VyQ2FzZSgpID09IGxhbmcpIHsKICAgIG1vZGVOYW1lID0gaW5mby5tb2RlOwogICAgbGFuZyA9IGluZm8ubWltZTsKICB9Cn0pOwoKaWYgKCFDb2RlTWlycm9yLm1vZGVzW21vZGVOYW1lXSkKICByZXF1aXJlKCIuLi9tb2RlLyIgKyBtb2RlTmFtZSArICIvIiArIG1vZGVOYW1lICsgIi5qcyIpOwoKZnVuY3Rpb24gZXNjKHN0cikgewogIHJldHVybiBzdHIucmVwbGFjZSgvWzwmXS9nLCBmdW5jdGlvbihjaCkgeyByZXR1cm4gY2ggPT0gIiYiID8gIiZhbXA7IiA6ICImbHQ7IjsgfSk7Cn0KCnZhciBjb2RlID0gZnMucmVhZEZpbGVTeW5jKCIvZGV2L3N0ZGluIiwgInV0ZjgiKTsKdmFyIGN1clN0eWxlID0gbnVsbCwgYWNjdW0gPSAiIjsKZnVuY3Rpb24gZmx1c2goKSB7CiAgaWYgKGN1clN0eWxlKSBwcm9jZXNzLnN0ZG91dC53cml0ZSgiPHNwYW4gY2xhc3M9XCIiICsgY3VyU3R5bGUucmVwbGFjZSgvKF58XHMrKS9nLCAiJDFjbS0iKSArICJcIj4iICsgZXNjKGFjY3VtKSArICI8L3NwYW4+Iik7CiAgZWxzZSBwcm9jZXNzLnN0ZG91dC53cml0ZShlc2MoYWNjdW0pKTsKfQoKQ29kZU1pcnJvci5ydW5Nb2RlKGNvZGUsIGxhbmcsIGZ1bmN0aW9uKHRleHQsIHN0eWxlKSB7CiAgaWYgKHN0eWxlICE9IGN1clN0eWxlKSB7CiAgICBmbHVzaCgpOwogICAgY3VyU3R5bGUgPSBzdHlsZTsgYWNjdW0gPSB0ZXh0OwogIH0gZWxzZSB7CiAgICBhY2N1bSArPSB0ZXh0OwogIH0KfSk7CmZsdXNoKCk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/bin/upload-release.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[InVzZSBzdHJpY3QiCgpsZXQgdmVyc2lvbiA9IHByb2Nlc3MuYXJndlsyXQpsZXQgYXV0aCA9IHByb2Nlc3MuYXJndlszXQoKaWYgKCFhdXRoKSB7CiAgY29uc29sZS5sb2coIlVzYWdlOiB1cGxvYWQtcmVsZWFzZS5qcyBbVEFHXSBbZ2l0aHViLXVzZXI6cGFzc3dvcmRdIikKICBwcm9jZXNzLmV4aXQoMSkKfQoKcmVxdWlyZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWMoImdpdCAtLW5vLXBhZ2VyIHNob3cgLXMgLS1mb3JtYXQ9JyVzJyAiICsgdmVyc2lvbiwgKGVycm9yLCBzdGRvdXQpID0+IHsKICBpZiAoZXJyb3IpIHRocm93IGVycm9yCiAgbGV0IG1lc3NhZ2UgPSBzdGRvdXQuc3BsaXQoIlxuIikuc2xpY2UoMikKICBtZXNzYWdlID0gbWVzc2FnZS5zbGljZSgwLCBtZXNzYWdlLmluZGV4T2YoIi0tLS0tQkVHSU4gUEdQIFNJR05BVFVSRS0tLS0tIikpLmpvaW4oIlxuIikKCiAgbGV0IHJlcSA9IHJlcXVpcmUoImh0dHBzIikucmVxdWVzdCh7CiAgICBob3N0OiAiYXBpLmdpdGh1Yi5jb20iLAogICAgYXV0aDogYXV0aCwKICAgIGhlYWRlcnM6IHsidXNlci1hZ2VudCI6ICJSZWxlYXNlIHVwbG9hZGVyIn0sCiAgICBwYXRoOiAiL3JlcG9zL2NvZGVtaXJyb3IvY29kZW1pcnJvci9yZWxlYXNlcyIsCiAgICBtZXRob2Q6ICJQT1NUIgogIH0sIHJlcyA9PiB7CiAgICBpZiAocmVzLnN0YXR1c0NvZGUgPj0gMzAwKSB7CiAgICAgIGNvbnNvbGUuZXJyb3IocmVzLnN0YXR1c01lc3NhZ2UpCiAgICAgIHJlcy5vbigiZGF0YSIsIGQgPT4gY29uc29sZS5sb2coZC50b1N0cmluZygpKSkKICAgICAgcmVzLm9uKCJlbmQiLCBwcm9jZXNzLmV4aXQoMSkpCiAgICB9CiAgfSkKICByZXEud3JpdGUoSlNPTi5zdHJpbmdpZnkoewogICAgdGFnX25hbWU6IHZlcnNpb24sCiAgICBuYW1lOiB2ZXJzaW9uLAogICAgYm9keTogbWVzc2FnZQogIH0pKQogIHJlcS5lbmQoKQp9KQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/CHANGELOG.md</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[IyMgNS4yMC4yICgyMDE2LTEwLTIxKQoKIyMjIEJ1ZyBmaXhlcwoKRml4IGBDb2RlTWlycm9yLnZlcnNpb25gIHJldHVybmluZyB0aGUgd3JvbmcgdmVyc2lvbiBudW1iZXIuCgojIyA1LjIwLjAgKDIwMTYtMTAtMjApCgojIyMgQnVnIGZpeGVzCgpNYWtlIGBuZXdsaW5lQW5kSW5kZW50YCBjb21tYW5kIHdvcmsgd2l0aCBtdWx0aXBsZSBjdXJzb3JzIG9uIHRoZSBzYW1lIGxpbmUuCgpNYWtlIHN1cmUga2V5cHJlc3MgZXZlbnRzIGZvciBiYWNrc3BhY2UgYXJlIGlnbm9yZWQuCgpUb2tlbnMgc3R5bGVkIHdpdGggb3ZlcmxheXMgbm8gbG9uZ2VyIGdldCBhIG5vbnNlbnNlIGBjbS1jbS1vdmVybGF5YCBjbGFzcy4KCkxpbmUgZW5kaW5ncyBmb3IgcGFzdGVkIGNvbnRlbnQgYXJlIG5vdyBub3JtYWxpemVkIHRvIHRoZSBlZGl0b3IncyBbcHJlZmVycmVkIGVuZGluZ10oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNvcHRpb25fbGluZVNlcGFyYXRvcikuCgpbamF2YXNjcmlwdCBtb2RlXShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9qYXZhc2NyaXB0KTogSW1wcm92ZSBzdXBwb3J0IGZvciBjbGFzcyBleHByZXNzaW9ucy4gU3VwcG9ydCBUeXBlU2NyaXB0IG9wdGlvbmFsIGNsYXNzIHByb3BlcnRpZXMsIHRoZSBgYWJzdHJhY3RgIGtleXdvcmQsIGFuZCByZXR1cm4gdHlwZSBkZWNsYXJhdGlvbnMgZm9yIGFycm93IGZ1bmN0aW9ucy4KCltjc3MgbW9kZV0oaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvY3NzKTogRml4IGhpZ2hsaWdodGluZyBvZiBtaXhlZC1jYXNlIGtleXdvcmRzLgoKW2Nsb3NlYnJhY2tldHMgYWRkb25dKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjYWRkb25fY2xvc2VicmFja2V0cyk6IEltcHJvdmUgYmVoYXZpb3Igd2hlbiB0eXBpbmcgYSBxdW90ZSBiZWZvcmUgYSBzdHJpbmcuCgojIyMgTmV3IGZlYXR1cmVzCgpUaGUgY29yZSBpcyBub3cgbWFpbnRhaW5lZCBhcyBhIG51bWJlciBvZiBzbWFsbCBmaWxlcywgdXNpbmcgRVM2IHN5bnRheCBhbmQgbW9kdWxlcywgdW5kZXIgdGhlIGBzcmMvYCBkaXJlY3RvcnkuIEEgZ2l0IGNoZWNrb3V0IG5vIGxvbmdlciBjb250YWlucyBhIHdvcmtpbmcgYGNvZGVtaXJyb3IuanNgIHVudGlsIHlvdSBgbnBtIGJ1aWxkYCAoYnV0IHdoZW4gaW5zdGFsbGluZyBmcm9tIE5QTSwgaXQgaXMgaW5jbHVkZWQpLgoKVGhlIFtgcmVmcmVzaGBdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjZXZlbnRfcmVmcmVzaCkgZXZlbnQgaXMgbm93IGRvY3VtZW50ZWQgYW5kIHN0YWJsZS4KCiMjIDUuMTkuMCAoMjAxNi0wOS0yMCkKCiMjIyBCdWdmaXhlcwoKW2VybGFuZyBtb2RlXShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9lcmxhbmcpOiBGaXggbW9kZSBjcmFzaCB3aGVuIHRyeWluZyB0byByZWFkIGFuIGVtcHR5IGNvbnRleHQuCgpbY29tbWVudCBhZGRvbl0oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNhZGRvbl9jb21tZW50KTogRml4IGJyb2tlbiBiZWhhdmlvciB3aGVuIHRvZ2dsaW5nIGNvbW1lbnRzIGluc2lkZSBhIGNvbW1lbnQuCgp4bWwtZm9sZCBhZGRvbjogRml4IGEgbnVsbC1kZXJlZmVyZW5jZSBidWcuCgpQYWdlIHVwIGFuZCBwYWdlIGRvd24gbm93IGRvIHNvbWV0aGluZyBldmVuIGluIHNpbmdsZS1saW5lIGRvY3VtZW50cy4KCkZpeCBhbiBpc3N1ZSB3aGVyZSB0aGUgY3Vyc29yIHBvc2l0aW9uIGNvdWxkIGJlIG9mZiBpbiByZWFsbHkgbG9uZyAofjgwMDAgY2hhcmFjdGVyKSB0b2tlbnMuCgojIyMgTmV3IGZlYXR1cmVzCgpbamF2YXNjcmlwdCBtb2RlXShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9qYXZhc2NyaXB0KTogQmV0dGVyIGluZGVudGF0aW9uIHdoZW4gc2VtaWNvbG9ucyBhcmUgbWlzc2luZy4gQmV0dGVyIHN1cHBvcnQgZm9yIFR5cGVTY3JpcHQgY2xhc3Nlcywgb3B0aW9uYWwgcGFyYW1ldGVycywgYW5kIHRoZSBgdHlwZWAga2V5d29yZC4KClRoZSBbYGJsdXJgXShodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL21hbnVhbC5odG1sI2V2ZW50X2JsdXIpIGFuZCBbYGZvY3VzYF0oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNldmVudF9mb2N1cykgZXZlbnRzIG5vdyBwYXNzIHRoZSBET00gZXZlbnQgdG8gdGhlaXIgaGFuZGxlcnMuCgojIyA1LjE4LjIgKDIwMTYtMDgtMjMpCgojIyMgQnVnZml4ZXMKClt2dWUgbW9kZV0oaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvdnVlKTogRml4IG91dGRhdGVkIHJlZmVyZW5jZXMgdG8gcmVuYW1lZCBQdWcgbW9kZSBkZXBlbmRlbmN5LgoKIyMgNS4xOC4wICgyMDE2LTA4LTIyKQoKIyMjIEJ1Z2ZpeGVzCgpNYWtlIHN1cmUgW2d1dHRlciBiYWNrZ3JvdW5kc10oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNhZGRMaW5lQ2xhc3MpIHN0aWNrIHRvIHRoZSByZXN0IG9mIHRoZSBndXR0ZXIgZHVyaW5nIGhvcml6b250YWwgc2Nyb2xsaW5nLgoKVGhlIGNvbnRlbnRlZGl0YWJsZSBbYGlucHV0U3R5bGVgXShodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL21hbnVhbC5odG1sI29wdGlvbl9pbnB1dFN0eWxlKSBub3cgcHJvcGVybHkgc3VwcG9ydHMgcGFzdGluZyBvbiBwcmUtRWRnZSBJRSB2ZXJzaW9ucy4KCltqYXZhc2NyaXB0IG1vZGVdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL2phdmFzY3JpcHQpOiBGaXggc29tZSBzbWFsbCBwYXJzaW5nIGJ1Z3MgYW5kIGltcHJvdmUgVHlwZVNjcmlwdCBzdXBwb3J0LgoKW21hdGNoYnJhY2tldHMgYWRkb25dKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjYWRkb25fbWF0Y2hicmFja2V0cyk6IEZpeCBidWcgd2hlcmUgYWN0aXZlIGhpZ2hsaWdodGluZyB3YXMgbGVmdCBpbiBlZGl0b3Igd2hlbiB0aGUgYWRkb24gd2FzIGRpc2FibGVkLgoKW21hdGNoLWhpZ2hsaWdodGVyIGFkZG9uXShodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL21hbnVhbC5odG1sI2FkZG9uX21hdGNoLWhpZ2hsaWdodGVyKTogT25seSBzdGFydCBoaWdobGlnaHRpbmcgdGhpbmdzIHdoZW4gdGhlIGVkaXRvciBnYWlucyBmb2N1cy4KCltqYXZhc2NyaXB0LWhpbnQgYWRkb25dKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjYWRkb25famF2YXNjcmlwdC1oaW50KTogQWxzbyBjb21wbGV0ZSBub24tZW51bWVyYWJsZSBwcm9wZXJ0aWVzLgoKIyMjIE5ldyBmZWF0dXJlcwoKVGhlIFtgYWRkT3ZlcmxheWBdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjYWRkT3ZlcmxheSkgbWV0aG9kIG5vdyBzdXBwb3J0cyBhIGBwcmlvcml0eWAgb3B0aW9uIHRvIGNvbnRyb2wgdGhlIG9yZGVyIGluIHdoaWNoIG92ZXJsYXlzIGFyZSBhcHBsaWVkLgoKTUlNRSB0eXBlcyB0aGF0IGVuZCBpbiBgK2pzb25gIG5vdyBkZWZhdWx0IHRvIHRoZSBKU09OIG1vZGUgd2hlbiB0aGUgTUlNRSBpdHNlbGYgaXMgbm90IGRlZmluZWQuCgojIyMgQnJlYWtpbmcgY2hhbmdlcwoKVGhlIG1vZGUgZm9ybWVybHkga25vd24gYXMgSmFkZSB3YXMgcmVuYW1lZCB0byBbUHVnXShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9wdWcpLgoKVGhlIFtQeXRob24gbW9kZV0oaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvcHl0aG9uKSBub3cgZGVmYXVsdHMgdG8gUHl0aG9uIDMgKHJhdGhlciB0aGFuIDIpIHN5bnRheC4KCiMjIDUuMTcuMCAoMjAxNi0wNy0xOSkKCiMjIyBCdWdmaXhlcwoKRml4IHByb2JsZW0gd2l0aCB3cmFwcGVkIHRyYWlsaW5nIHdoaXRlc3BhY2UgZGlzcGxheWluZyBpbmNvcnJlY3RseS4KClByZXZlbnQgSU1FIGRpYWxvZyBmcm9tIG92ZXJsYXBwaW5nIHR5cGVkIGNvbnRlbnQgaW4gQ2hyb21lLgoKSW1wcm92ZSBtZWFzdXJpbmcgb2YgY2hhcmFjdGVycyBuZWFyIGEgbGluZSB3cmFwLgoKW2phdmFzY3JpcHQgbW9kZV0oaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvamF2YXNjcmlwdCk6IEltcHJvdmUgc3VwcG9ydCBmb3IgYGFzeW5jYCwgYWxsb3cgdHJhaWxpbmcgY29tbWFzIGluIGBpbXBvcnRgIGxpc3RzLgoKW3ZpbSBiaW5kaW5nc10oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RlbW8vdmltLmh0bWwpOiBGaXggYmFja3NwYWNlIGluIHJlcGxhY2UgbW9kZS4KCltzdWJsaW1lIGJpbmRpbmdzXShodHRwOi8vY29kZW1pcnJvci5uZXQvZGVtby9zdWJsaW1lLmh0bWwpOiBGaXggc29tZSBrZXkgYmluZGluZ3Mgb24gT1MgWCB0byBtYXRjaCBTdWJsaW1lIFRleHQuCgojIyMgTmV3IGZlYXR1cmVzCgpbbWFya2Rvd24gbW9kZV0oaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvbWFya2Rvd24pOiBBZGQgbW9yZSBjbGFzc2VzIHRvIGltYWdlIGxpbmtzIGluIGhpZ2hsaWdodC1mb3JtYXR0aW5nIG1vZGUuCgojIyA1LjE2LjAgKDIwMTYtMDYtMjApCgojIyMgQnVnZml4ZXMKCkZpeCBnbGl0Y2hlcyB3aGVuIGRyYWdnaW5nIGNvbnRlbnQgY2F1c2VkIGJ5IHRoZSBkcm9wIGluZGljYXRvciByZWNlaXZpbmcgbW91c2UgZXZlbnRzLgoKTWFrZSBDb250cm9sLWRyYWcgd29yayBvbiBGaXJlZm94LgoKTWFrZSBjbGlja2luZyBvciBzZWxlY3Rpb24tZHJhZ2dpbmcgYXQgdGhlIGVuZCBvZiBhIHdyYXBwZWQgbGluZSBzZWxlY3QgdGhlIHJpZ2h0IHBvc2l0aW9uLgoKW3Nob3ctaGludCBhZGRvbl0oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNhZGRvbl9zaG93LWhpbnQpOiBQcmV2ZW50IHdpZGdldCBzY3JvbGxiYXIgZnJvbSBoaWRpbmcgcGFydCBvZiB0aGUgaGludCB0ZXh0LgoKW3J1bGVycyBhZGRvbl0oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNhZGRvbl9ydWxlcnMpOiBQcmV2ZW50IHJ1bGVycyBmcm9tIGZvcmNpbmcgYSBob3Jpem9udGFsIGVkaXRvciBzY3JvbGxiYXIuCgojIyMgTmV3IGZlYXR1cmVzCgpbc2VhcmNoIGFkZG9uXShodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL21hbnVhbC5odG1sI2FkZG9uX3NlYXJjaCk6IEF1dG9tYXRpY2FsbHkgYmluZCBzZWFyY2gtcmVsYXRlZCBrZXlzIGluIHBlcnNpc3RlbnQgZGlhbG9nLgoKW3N1YmxpbWUga2V5bWFwXShodHRwOi8vY29kZW1pcnJvci5uZXQvZGVtby9zdWJsaW1lLmh0bWwpOiBBZGQgYSBtdWx0aS1jdXJzb3IgYXdhcmUgc21hcnQgYmFja3NwYWNlIGJpbmRpbmcuCgojIyA1LjE1LjIgKDIwMTYtMDUtMjApCgojIyMgQnVnZml4ZXMKCkZpeCBhIGNyaXRpY2FsIGRvY3VtZW50IGNvcnJ1cHRpb24gYnVnIHRoYXQgb2NjdXJzIHdoZW4gYSBkb2N1bWVudCBpcyBncmFkdWFsbHkgZ3Jvd24uCgojIyA1LjE1LjAgKDIwMTYtMDUtMjApCgojIyMgQnVnZml4ZXMKCkZpeCBidWcgdGhhdCBjYXVzZWQgdGhlIHNlbGVjdGlvbiB0byByZXNldCB3aGVuIGZvY3VzaW5nIHRoZSBlZGl0b3IgaW4gY29udGVudEVkaXRhYmxlIGlucHV0IG1vZGUuCgpGaXggaXNzdWUgd2hlcmUgbm90IGFsbCBBU0NJSSBjb250cm9sIGNoYXJhY3RlcnMgd2VyZSBiZWluZyByZXBsYWNlZCBieSBwbGFjZWhvbGRlcnMuCgpSZW1vdmUgdGhlIGFzc3VtcHRpb24gdGhhdCBhbGwgbW9kZXMgaGF2ZSBhIGBzdGFydFN0YXRlYCBtZXRob2QgZnJvbSBzZXZlcmFsIHdyYXBwaW5nIG1vZGVzLgoKRml4IGlzc3VlIHdoZXJlIHRoZSBlZGl0b3Igd291bGQgY29tcGxhaW4gYWJvdXQgb3ZlcmxhcHBpbmcgY29sbGFwc2VkIHJhbmdlcyB3aGVuIHRoZXJlIHdlcmVuJ3QgYW55LgoKT3B0aW1pemUgZG9jdW1lbnQgdHJlZSBidWlsZGluZyB3aGVuIGxvYWRpbmcgb3IgcGFzdGluZyBodWdlIGNodW5rcyBvZiBjb250ZW50LgoKW21hcmtkb3duIG1vZGVdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL21hcmtkb3duLyk6IEZpeCBzZXZlcmFsIGlzc3VlcyBpbiBtYXRjaGluZyBsaW5rIHRhcmdldHMuCgpbY2xpa2UgbW9kZV0oaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvY2xpa2UvKTogSW1wcm92ZSBpbmRlbnRhdGlvbiBvZiBDKysgdGVtcGxhdGUgZGVjbGFyYXRpb25zLgoKIyMjIE5ldyBmZWF0dXJlcwoKRXhwbGljaXRseSBiaW5kIEN0cmwtTyBvbiBPUyBYIHRvIG1ha2UgdGhhdCBiaW5kaW5nICjigJxvcGVuIGxpbmXigJ0pIGFjdCBhcyBleHBlY3RlZC4KClBhc3RpbmcgW2xpbmV3aXNlLWNvcGllZF0oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNvcHRpb25fbGluZVdpc2VDb3B5Q3V0KSBjb250ZW50IHdoZW4gdGhlcmUgaXMgbm8gc2VsZWN0aW9uIG5vdyBpbnNlcnRzIHRoZSBsaW5lcyBhYm92ZSB0aGUgY3VycmVudCBsaW5lLgoKW2phdmFzY3JpcHQgbW9kZV0oaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvamF2YXNjcmlwdC8pOiBTdXBwb3J0IGBhc3luY2AvYGF3YWl0YCBhbmQgaW1wcm92ZSBzdXBwb3J0IGZvciBUeXBlU2NyaXB0IHR5cGUgc3ludGF4LgoKIyMgNS4xNC4yICgyMDE2LTA0LTIwKQoKIyMjIEJ1Z2ZpeGVzCgpQdXNoIGEgbmV3IHBhY2thZ2UgdG8gTlBNIGR1ZSB0byBhbiBbTlBNIGJ1Z10oaHR0cHM6Ly9naXRodWIuY29tL25wbS9ucG0vaXNzdWVzLzUwODIpIG9taXR0aW5nIHRoZSBMSUNFTlNFIGZpbGUgaW4gNS4xNC4wLgoKU2V0IGBkYXRhVHJhbnNmZXIuZWZmZWN0QWxsb3dlZGAgaW4gYGRyYWdzdGFydGAgaGFuZGxlciB0byBoZWxwIGJyb3dzZXJzIHVzZSB0aGUgcmlnaHQgZHJhZyBpY29uLgoKQWRkIHRoZSBbbWJveCBtb2RlXShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9tYm94L2luZGV4Lmh0bWwpIHRvIGBtb2RlL21ldGEuanNgLgoKIyMgNS4xNC4wICgyMDE2LTA0LTIwKQoKIyMjIEJ1Z2ZpeGVzCgpbYHBvc0Zyb21JbmRleGBdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjcG9zRnJvbUluZGV4KSBhbmQgW2BpbmRleEZyb21Qb3NgXShodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL21hbnVhbC5odG1sI2luZGV4RnJvbVBvcykgbm93IHRha2UgW2BsaW5lU2VwYXJhdG9yYF0oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNvcHRpb25fbGluZVNlcGFyYXRvcikgaW50byBhY2NvdW50LgoKW3ZpbSBiaW5kaW5nc10oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RlbW8vdmltLmh0bWwpOiBPbmx5IGNhbGwgYC5zYXZlKClgIHdoZW4gaXQgaXMgYWN0dWFsbHkgYXZhaWxhYmxlLgoKW2NvbW1lbnQgYWRkb25dKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjYWRkb25fY29tbWVudCk6IEJlIGNhcmVmdWwgbm90IHRvIG1hbmdsZSBtdWx0aS1saW5lIHN0cmluZ3MuCgpbUHl0aG9uIG1vZGVdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL3B5dGhvbi9pbmRleC5odG1sKTogSW1wcm92ZSBkaXN0aW5ndWlzaGluZyBvZiBkZWNvcmF0b3JzIGZyb20gYEBgIG9wZXJhdG9ycy4KCltgZmluZE1hcmtzYF0oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNmaW5kTWFya3MpOiBObyBsb25nZXIgcmV0dXJuIG1hcmtzIHRoYXQgdG91Y2ggYnV0IGRvbid0IG92ZXJsYXAgZ2l2ZW4gcmFuZ2UuCgojIyMgTmV3IGZlYXR1cmVzCgpbdmltIGJpbmRpbmdzXShodHRwOi8vY29kZW1pcnJvci5uZXQvZGVtby92aW0uaHRtbCk6IEFkZCB5YW5rIGNvbW1hbmQuCgpbbWF0Y2gtaGlnaGxpZ2h0ZXIgYWRkb25dKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjYWRkb25fbWF0Y2gtaGlnaGxpZ2h0ZXIpOiBBZGQgYHRyaW1gIG9wdGlvbiB0byBkaXNhYmxlIGlnbm9yaW5nIG9mIHdoaXRlc3BhY2UuCgpbUG93ZXJTaGVsbCBtb2RlXShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9wb3dlcnNoZWxsL2luZGV4Lmh0bWwpOiBBZGRlZC4KCltZYWNhcyBtb2RlXShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS95YWNhcy9pbmRleC5odG1sKTogQWRkZWQuCgpbV2ViIElETCBtb2RlXShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS93ZWJpZGwvaW5kZXguaHRtbCk6IEFkZGVkLgoKW1NBUyBtb2RlXShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9zYXMvaW5kZXguaHRtbCk6IEFkZGVkLgoKW21ib3ggbW9kZV0oaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvbWJveC9pbmRleC5odG1sKTogQWRkZWQuCgojIyA1LjEzLjIgKDIwMTYtMDMtMjMpCgojIyMgQnVnZml4ZXMKClNvbHZlcyBhIHByb2JsZW0gd2hlcmUgdGhlIGd1dHRlciB3b3VsZCBzb21ldGltZXMgbm90IGV4dGVuZCBhbGwgdGhlIHdheSB0byB0aGUgZW5kIG9mIHRoZSBkb2N1bWVudC4KCiMjIDUuMTMuMCAoMjAxNi0wMy0yMSkKCiMjIyBOZXcgZmVhdHVyZXMKCk5ldyBET00gZXZlbnQgZm9yd2FyZGVkOiBbYCJkcmFnbGVhdmUiYF0oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNldmVudF9kb20pLgoKW3Byb3RvYnVmIG1vZGVdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL3Byb3RvYnVmL2luZGV4Lmh0bWwpOiBOZXdseSBhZGRlZC4KCiMjIyBCdWdmaXhlcwoKRml4IHByb2JsZW0gd2hlcmUgW2BmaW5kTWFya3NgXShodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL21hbnVhbC5odG1sI2ZpbmRNYXJrcykgc29tZXRpbWVzIGZhaWxlZCB0byBmaW5kIG11bHRpLWxpbmUgbWFya3MuCgpGaXggY3Jhc2ggdGhhdCBzaG93ZWQgdXAgd2hlbiBhdG9taWMgcmFuZ2VzIGFuZCBiaWRpIHRleHQgd2VyZSBjb21iaW5lZC4KCltzaG93LWhpbnQgYWRkb25dKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kZW1vL2NvbXBsZXRlLmh0bWwpOiBDb21wbGV0aW9uIHdpZGdldHMgbm8gbG9uZ2VyIGNsb3NlIHdoZW4gdGhlIGxpbmUgaW5kZW50ZWQgb3IgZGVkZW50ZWQuCgpbbWVyZ2UgYWRkb25dKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kZW1vL21lcmdlLmh0bWwpOiBGaXggYnVnIHdoZW4gbWVyZ2luZyBjaHVua3MgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS4KCltwbGFjZWhvbGRlciBhZGRvbl0oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNhZGRvbl9wbGFjZWhvbGRlcik6IE5vIGxvbmdlciBnZXRzIGNvbmZ1c2VkIGJ5IFtgc3dhcERvY2BdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjc3dhcERvYykuCgpbc2ltcGxlc2Nyb2xsYmFycyBhZGRvbl0oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNhZGRvbl9zaW1wbGVzY3JvbGxiYXJzKTogRml4IGludmFsaWQgc3RhdGUgd2hlbiBkZWxldGluZyBhdCBlbmQgb2YgZG9jdW1lbnQuCgpbY2xpa2UgbW9kZV0oaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvY2xpa2UvaW5kZXguaHRtbCk6IE5vIGxvbmdlciBnZXRzIGNvbmZ1c2VkIHdoZW4gYSBjb21tZW50IHN0YXJ0cyBhZnRlciBhbiBvcGVyYXRvci4KClttYXJrZG93biBtb2RlXShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9tYXJrZG93bi9pbmRleC5odG1sKTogTm93IHN1cHBvcnRzIENvbW1vbk1hcmstc3R5bGUgZmxleGlibGUgbGlzdCBpbmRlbnRhdGlvbi4KCltkeWxhbiBtb2RlXShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9keWxhbi9pbmRleC5odG1sKTogU2V2ZXJhbCBpbXByb3ZlbWVudHMgYW5kIGZpeGVzLgoKIyMgNS4xMi4wICgyMDE2LTAyLTE5KQoKIyMjIE5ldyBmZWF0dXJlcwoKW1ZpbSBiaW5kaW5nc10oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RlbW8vdmltLmh0bWwpOiBDdHJsLVEgaXMgbm93IGFuIGFsaWFzIGZvciBDdHJsLVYuCgpbVmltIGJpbmRpbmdzXShodHRwOi8vY29kZW1pcnJvci5uZXQvZGVtby92aW0uaHRtbCk6IFRoZSBWaW0gQVBJIG5vdyBleHBvc2VzIGFuIGB1bm1hcGAgbWV0aG9kIHRvIHVubWFwIGJpbmRpbmdzLgoKW2FjdGl2ZS1saW5lIGFkZG9uXShodHRwOi8vY29kZW1pcnJvci5uZXQvZGVtby9hY3RpdmVsaW5lLmh0bWwpOiBUaGlzIGFkZG9uIGNhbiBub3cgc3R5bGUgdGhlIGFjdGl2ZSBsaW5lJ3MgZ3V0dGVyLgoKW0ZDTCBtb2RlXShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9mY2wvKTogTmV3bHkgYWRkZWQuCgpbU1FMIG1vZGVdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL3NxbC8pOiBOb3cgaGFzIGEgUG9zdGdyZXNxbCBkaWFsZWN0LgoKIyMjIEJ1Z2ZpeGVzCgpGaXggW2lzc3VlXShodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9Db2RlTWlycm9yL2lzc3Vlcy8zNzgxKSB3aGVyZSB0cnlpbmcgdG8gc2Nyb2xsIHRvIGEgaG9yaXpvbnRhbCBwb3NpdGlvbiBvdXRzaWRlIG9mIHRoZSBkb2N1bWVudCdzIHdpZHRoIGNvdWxkIGNhdXNlIHRoZSBndXR0ZXIgdG8gYmUgcG9zaXRpb25lZCBpbmNvcnJlY3RseS4KClVzZSBhYnNvbHV0ZSwgcmF0aGVyIHRoYW4gZml4ZWQgcG9zaXRpb25pbmcgaW4gdGhlIGNvbnRleHQtbWVudSBpbnRlcmNlcHQgaGFjaywgdG8gd29yayBhcm91bmQgYSBbcHJvYmxlbV0oaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvQ29kZU1pcnJvci9pc3N1ZXMvMzIzOCkgd2hlbiB0aGUgZWRpdG9yIGlzIGluc2lkZSBhIHRyYW5zZm9ybWVkIHBhcmVudCBjb250YWluZXIuCgpTb2x2ZSBhIFtwcm9ibGVtXShodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9Db2RlTWlycm9yL2lzc3Vlcy8zODIxKSB3aGVyZSB0aGUgaG9yaXpvbnRhbCBzY3JvbGxiYXIgY291bGQgaGlkZSB0ZXh0IGluIEZpcmVmb3guCgpGaXggYSBbYnVnXShodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9Db2RlTWlycm9yL2lzc3Vlcy8zODM0KSB0aGF0IGNhdXNlZCBwaGFudG9tIHNjcm9sbCBzcGFjZSB1bmRlciB0aGUgdGV4dCBpbiBzb21lIHNpdHVhdGlvbnMuCgpbU3VibGltZSBUZXh0IGJpbmRpbmdzXShodHRwOi8vY29kZW1pcnJvci5uZXQvZGVtby9zdWJsaW1lLmh0bWwpOiBCaW5kIGRlbGV0ZS1saW5lIHRvIFNoaWZ0LUN0cmwtSyBvbiBPUyBYLgoKW01hcmtkb3duIG1vZGVdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL21hcmtkb3duLyk6IEZpeCBbaXNzdWVdKGh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL0NvZGVNaXJyb3IvaXNzdWVzLzM3ODcpIHdoZXJlIHRoZSBtb2RlIHdvdWxkIGtlZXAgc3RhdGUgcmVsYXRlZCB0byBmZW5jZWQgY29kZSBibG9ja3MgaW4gYW4gdW5zYWZlIHdheSwgbGVhZGluZyB0byBvY2Nhc2lvbmFsIGNvcnJ1cHRlZCBwYXJzZXMuCgpbTWFya2Rvd24gbW9kZV0oaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvbWFya2Rvd24vKTogSWdub3JlIGJhY2tzbGFzaGVzIGluIGNvZGUgZnJhZ21lbnRzLgoKW01hcmtkb3duIG1vZGVdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL21hcmtkb3duLyk6IFVzZSB3aGljaGV2ZXIgbW9kZSBpcyByZWdpc3RlcmVkIGFzIGB0ZXh0L2h0bWxgIHRvIHBhcnNlIEhUTUwuCgpbQ2xpa2UgbW9kZV0oaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvY2xpa2UvKTogSW1wcm92ZSBpbmRlbnRhdGlvbiBvZiBTY2FsYSBgPT5gIGZ1bmN0aW9ucy4KCltQeXRob24gbW9kZV0oaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvcHl0aG9uLyk6IEltcHJvdmUgaW5kZW50YXRpb24gb2YgYnJhY2tldGVkIGNvZGUuCgpbSFRNTE1peGVkIG1vZGVdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL2h0bWxtaXhlZC8pOiBTdXBwb3J0IG11bHRpLWxpbmUgb3BlbmluZyB0YWdzIGZvciBzdWItbGFuZ3VhZ2VzIChgPHNjcmlwdD5gLCBgPHN0eWxlPmAsIGV0YykuCgpbU3ByZWFkc2hlZXQgbW9kZV0oaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvc3ByZWFkc2hlZXQvKTogRml4IGJ1ZyB3aGVyZSB0aGUgbW9kZSBkaWQgbm90IGFkdmFuY2UgdGhlIHN0cmVhbSB3aGVuIGZpbmRpbmcgYSBiYWNrc2xhc2guCgpbWE1MIG1vZGVdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL3htbC8pOiBUaGUgbW9kZSBub3cgdGFrZXMgYSBgbWF0Y2hDbG9zaW5nYCBvcHRpb24gdG8gY29uZmlndXJlIHdoZXRoZXIgbWlzbWF0Y2hlZCBjbG9zaW5nIHRhZ3Mgc2hvdWxkIGJlIGhpZ2hsaWdodGVkIGFzIGVycm9ycy4KCiMjIDUuMTEuMCAoMjAxNi0wMS0yMCkKCiogTmV3IG1vZGVzOiBbSlNYXShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9qc3gvaW5kZXguaHRtbCksIFtsaXRlcmF0ZSBIYXNrZWxsXShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9oYXNrZWxsLWxpdGVyYXRlL2luZGV4Lmh0bWwpCiogVGhlIGVkaXRvciBub3cgZm9yd2FyZHMgbW9yZSBbRE9NIGV2ZW50c10oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNldmVudF9kb20pOiBgY3V0YCwgYGNvcHlgLCBgcGFzdGVgLCBhbmQgYHRvdWNoc3RhcnRgLiBJdCB3aWxsIGFsc28gZm9yd2FyZCBgbW91c2Vkb3duYCBmb3IgZHJhZyBldmVudHMKKiBGaXhlcyBhIGJ1ZyB3aGVyZSBib29rbWFya3MgbmV4dCB0byBjb2xsYXBzZWQgc3BhbnMgd2VyZSBub3QgcmVuZGVyZWQKKiBUaGUgW1N3aWZ0XShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9zd2lmdC9pbmRleC5odG1sKSBtb2RlIG5vdyBzdXBwb3J0cyBhdXRvLWluZGVudGF0aW9uCiogRnJvbnRtYXR0ZXJzIGluIHRoZSBbWUFNTCBmcm9udG1hdHRlcl0oaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUveWFtbC1mcm9udG1hdHRlci9pbmRleC5odG1sKSBtb2RlIGFyZSBub3cgb3B0aW9uYWwgYXMgaW50ZW5kZWQKCiMjIDUuMTAuMCAoMjAxNS0xMi0yMSkKCiogTW9kaWZ5IHRoZSB3YXkgW2F0b21pYyByYW5nZXNdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjbWFya19hdG9taWMpIGFyZSBza2lwcGVkIGJ5IHNlbGVjdGlvbiB0byB0cnkgYW5kIG1ha2UgaXQgbGVzcyBzdXJwcmlzaW5nLgoqIFRoZSBbU3dpZnQgbW9kZV0oaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvc3dpZnQvaW5kZXguaHRtbCkgd2FzIHJld3JpdHRlbi4KKiBOZXcgYWRkb246IFtqdW1wLXRvLWxpbmVdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjYWRkb25fanVtcC10by1saW5lKS4KKiBOZXcgbWV0aG9kOiBbYGlzUmVhZE9ubHlgXShodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL21hbnVhbC5odG1sI2lzUmVhZE9ubHkpLgoqIFRoZSBbc2hvdy1oaW50IGFkZG9uXShodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL21hbnVhbC5odG1sI2FkZG9uX3Nob3ctaGludCkgbm93IGRlZmF1bHRzIHRvIHBpY2tpbmcgY29tcGxldGlvbnMgb24gc2luZ2xlIGNsaWNrLgoqIFRoZSBvYmplY3QgcGFzc2VkIHRvIFtgImJlZm9yZVNlbGVjdGlvbkNoYW5nZSJgXShodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL21hbnVhbC5odG1sI2V2ZW50X2JlZm9yZVNlbGVjdGlvbkNoYW5nZSkgZXZlbnRzIG5vdyBoYXMgYW4gYG9yaWdpbmAgcHJvcGVydHkuCiogTmV3IG1vZGU6IFtDcnlzdGFsXShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9jcnlzdGFsL2luZGV4Lmh0bWwpLgoKIyMgNS45LjAgKDIwMTUtMTEtMjMpCgoqIEltcHJvdmUgdGhlIHdheSBvdmVybGF5IChPUyBYLXN0eWxlKSBzY3JvbGxiYXJzIGFyZSBoYW5kbGVkCiogTWFrZSBbYW5ub3RhdGVzY3JvbGxiYXJdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjYWRkb25fYW5ub3RhdGVzY3JvbGxiYXIpIGFuZCBzY3JvbGxwYXN0ZW5kIGFkZG9ucyB3b3JrIHByb3Blcmx5IHRvZ2V0aGVyCiogTWFrZSBbc2hvdy1oaW50XShodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL21hbnVhbC5odG1sI2FkZG9uX3Nob3ctaGludCkgYWRkb24gc2VsZWN0IG9wdGlvbnMgb24gc2luZ2xlIGNsaWNrIGJ5IGRlZmF1bHQsIG1vdmUgc2VsZWN0aW9uIHRvIGhvdmVyZWQgaXRlbQoqIFByb3Blcmx5IGZvbGQgY29tbWVudHMgdGhhdCBpbmNsdWRlIGJsb2NrLWNvbW1lbnQtc3RhcnQgbWFya2VycwoqIE1hbnkgc21hbGwgbGFuZ3VhZ2UgbW9kZSBmaXhlcwoKIyMgNS44LjAgKDIwMTUtMTAtMjApCgoqIEZpeGVzIGFuIGluZmluaXRlIGxvb3AgaW4gdGhlIFtoYXJkd3JhcCBhZGRvbl0oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNhZGRvbl9oYXJkd3JhcCkKKiBOZXcgbW9kZXM6IFtOU0lTXShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9uc2lzL2luZGV4Lmh0bWwpLCBbQ2V5bG9uXShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9jbGlrZS9pbmRleC5odG1sKQoqIFRoZSBLb3RsaW4gbW9kZSBpcyBub3cgYSBbY2xpa2VdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL2NsaWtlL2luZGV4Lmh0bWwpIGRpYWxlY3QsIHJhdGhlciB0aGFuIGEgc3RhbmQtYWxvbmUgbW9kZQoqIE5ldyBvcHRpb246IFtgYWxsb3dEcm9wRmlsZVR5cGVzYF0oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNvcHRpb25fYWxsb3dEcm9wRmlsZVR5cGVzKS4gQmluYXJ5IGZpbGVzIGNhbiBubyBsb25nZXIgYmUgZHJvcHBlZCBpbnRvIENvZGVNaXJyb3IKKiBOZXcgdGhlbWVzOiBbYmVzcGluXShodHRwOi8vY29kZW1pcnJvci5uZXQvZGVtby90aGVtZS5odG1sI2Jlc3BpbiksIFtob3BzY290Y2hdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kZW1vL3RoZW1lLmh0bWwjaG9wc2NvdGNoKSwgW2lzb3RvcGVdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kZW1vL3RoZW1lLmh0bWwjaXNvdG9wZSksIFtyYWlsc2Nhc3RzXShodHRwOi8vY29kZW1pcnJvci5uZXQvZGVtby90aGVtZS5odG1sI3JhaWxzY2FzdHMpCgojIyA1LjcuMCAoMjAxNS0wOS0yMSkKCiogTmV3IG1vZGVzOiBbVnVlXShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS92dWUvaW5kZXguaHRtbCksIFtPel0oaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvb3ovaW5kZXguaHRtbCksIFtNc2NHZW5dKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL21zY2dlbi9pbmRleC5odG1sKSAoYW5kIGRpYWxlY3RzKSwgW0Nsb3N1cmUgU3R5bGVzaGVldHNdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL2Nzcy9nc3MuaHRtbCkKKiBJbXBsZW1lbnQgW0NvbW1vbk1hcmtdKGh0dHA6Ly9jb21tb25tYXJrLm9yZyktc3R5bGUgZmxleGlibGUgbGlzdCBpbmRlbnQgYW5kIGNyb3NzLWxpbmUgY29kZSBzcGFucyBpbiBbTWFya2Rvd25dKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL21hcmtkb3duL2luZGV4Lmh0bWwpIG1vZGUKKiBBZGQgYSByZXBsYWNlLWFsbCBidXR0b24gdG8gdGhlIFtzZWFyY2ggYWRkb25dKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjYWRkb25fc2VhcmNoKSwgYW5kIG1ha2UgdGhlIHBlcnNpc3RlbnQgc2VhcmNoIGRpYWxvZyB0cmFuc3BhcmVudCB3aGVuIGl0IG9ic2N1cmVzIHRoZSBtYXRjaAoqIEhhbmRsZSBgYWN5bmNgL2Bhd2FpdGAgYW5kIG9jYWwgYW5kIGJpbmFyeSBudW1iZXJzIGluIFtKYXZhU2NyaXB0IG1vZGVdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL2phdmFzY3JpcHQvaW5kZXguaHRtbCkKKiBGaXggdmFyaW91cyBpc3N1ZXMgd2l0aCB0aGUgW0hheGUgbW9kZV0oaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvaGF4ZS9pbmRleC5odG1sKQoqIE1ha2UgdGhlIFtjbG9zZWJyYWNrZXRzIGFkZG9uXShodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL21hbnVhbC5odG1sI2FkZG9uX2Nsb3NlYnJhY2tldHMpIHNlbGVjdCBvbmx5IHRoZSB3cmFwcGVkIHRleHQgd2hlbiB3cmFwcGluZyBzZWxlY3Rpb24gaW4gYnJhY2tldHMKKiBUb2tlbml6ZSBwcm9wZXJ0aWVzIGFzIHByb3BlcnRpZXMgaW4gdGhlIFtDb2ZmZWVTY3JpcHQgbW9kZV0oaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvY29mZmVlc2NyaXB0L2luZGV4Lmh0bWwpCiogVGhlIFtwbGFjZWhvbGRlciBhZGRvbl0oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNhZGRvbl9wbGFjZWhvbGRlcikgbm93IGFjY2VwdHMgYSBET00gbm9kZSBhcyB3ZWxsIGFzIGEgc3RyaW5nIHBsYWNlaG9sZGVyCgojIyA1LjYuMCAoMjAxNS0wOC0yMCkKCiogRml4IGJ1ZyB3aGVyZSB5b3UgY291bGQgcGFzdGUgaW50byBhIGByZWFkT25seWAgZWRpdG9yCiogU2hvdyBhIGN1cnNvciBhdCB0aGUgZHJvcCBsb2NhdGlvbiB3aGVuIGRyYWdnaW5nIG92ZXIgdGhlIGVkaXRvcgoqIFRoZSBbUnVzdCBtb2RlXShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9ydXN0L2luZGV4Lmh0bWwpIHdhcyByZXdyaXR0ZW4gdG8gaGFuZGxlIG1vZGVybiBSdXN0CiogVGhlIGVkaXRvciBhbmQgdGhlbWUgQ1NTIHdhcyBjbGVhbmVkIHVwLiBTb21lIHNlbGVjdG9ycyBhcmUgbm93IGxlc3Mgc3BlY2lmaWMgdGhhbiBiZWZvcmUKKiBOZXcgdGhlbWU6IFthYmNkZWZdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kZW1vL3RoZW1lLmh0bWwjYWJjZGVmKQoqIExpbmVzIGxvbmdlciB0aGFuIFtgbWF4SGlnaGxpZ2h0TGVuZ3RoYF0oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNvcHRpb25fbWF4SGlnaGxpZ2h0TGVuZ3RoKSBhcmUgbm93IGxlc3MgbGlrZWx5IHRvIG1lc3MgdXAgaW5kZW50YXRpb24KKiBOZXcgYWRkb25zOiBbYGF1dG9yZWZyZXNoYF0oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNhZGRvbl9hdXRvcmVmcmVzaCkgZm9yIHJlZnJlc2hpbmcgYW4gZWRpdG9yIHRoZSBmaXJzdCB0aW1lIGl0IGJlY29tZXMgdmlzaWJsZSwgYW5kIGBodG1sLWxpbnRgIGZvciB1c2luZyBbSFRNTEhpbnRdKGh0dHA6Ly9odG1saGludC5jb20vKQoqIFRoZSBbYHNlYXJjaGBdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjYWRkb25fc2VhcmNoKSBhZGRvbiBub3cgcmVjb2duaXplcyBgXHJgIGFuZCBgXG5gIGluIHBhdHRlcm4gYW5kIHJlcGxhY2VtZW50IGlucHV0CgojIyA1LjUuMCAoMjAxNS0wNy0yMCkKCiogICBOZXcgb3B0aW9uOiBbYGxpbmVTZXBhcmF0b3JgXShodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL21hbnVhbC5odG1sI29wdGlvbl9saW5lU2VwYXJhdG9yKSAod2l0aCBjb3JyZXNwb25kaW5nIFttZXRob2RdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjbGluZVNlcGFyYXRvcikpCiogICBOZXcgdGhlbWVzOiBbZHJhY3VsYV0oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RlbW8vdGhlbWUuaHRtbCNkcmFjdWxhKSwgW3NldGldKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kZW1vL3RoZW1lLmh0bWwjc2V0aSksIFt5ZXRpXShodHRwOi8vY29kZW1pcnJvci5uZXQvZGVtby90aGVtZS5odG1sI3lldGkpLCBbbWF0ZXJpYWxdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kZW1vL3RoZW1lLmh0bWwjbWF0ZXJpYWwpLCBhbmQgW2ljZWNvZGVyXShodHRwOi8vY29kZW1pcnJvci5uZXQvZGVtby90aGVtZS5odG1sI2ljZWNvZGVyKQoqICAgTmV3IG1vZGVzOiBbQnJhaW5mdWNrXShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9icmFpbmZ1Y2svaW5kZXguaHRtbCksIFtWSERMXShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS92aGRsL2luZGV4Lmh0bWwpLCBTcXVpcnJlbCAoW2NsaWtlXShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9jbGlrZS9pbmRleC5odG1sKSBkaWFsZWN0KQoqICAgRGVmaW5lIGEgYGZpbmRQZXJzaXN0ZW50YCBjb21tYW5kIGluIHRoZSBbc2VhcmNoXShodHRwOi8vY29kZW1pcnJvci5uZXQvZGVtby9zZWFyY2guaHRtbCkgYWRkb24sIGZvciBhIGRpYWxvZyB0aGF0IHN0YXlzIG9wZW4gYXMgeW91IGN5Y2xlIHRocm91Z2ggbWF0Y2hlcwoqICAgRnJvbSB0aGlzIHJlbGVhc2Ugb24sIHRoZSBOUE0gbW9kdWxlIGRvZXNuJ3QgaW5jbHVkZSBkb2N1bWVudGF0aW9uIGFuZCBkZW1vcwoqICAgRnVsbCBbbGlzdCBvZiBwYXRjaGVzXShodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9Db2RlTWlycm9yL2NvbXBhcmUvNS40LjAuLi41LjUuMCkKCiMjIDUuNC4wICgyMDE1LTA2LTI1KQoKKiAgIE5ldyBtb2RlczogW1R3aWddKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL3R3aWcvaW5kZXguaHRtbCksIFtFbG1dKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL2VsbS9pbmRleC5odG1sKSwgW0ZhY3Rvcl0oaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvZmFjdG9yL2luZGV4Lmh0bWwpLCBbU3dpZnRdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL3N3aWZ0L2luZGV4Lmh0bWwpCiogICBQcmVmZXIgY2xpcGJvYXJkIEFQSSAoaWYgYXZhaWxhYmxlKSB3aGVuIHBhc3RpbmcKKiAgIFJlZmluZWQgZGVmaW5pdGlvbiBoaWdobGlnaHRpbmcgaW4gW2NsaWtlXShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9jbGlrZS9pbmRleC5odG1sKSBtb2RlCiogICBGdWxsIFtsaXN0IG9mIHBhdGNoZXNdKGh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL0NvZGVNaXJyb3IvY29tcGFyZS81LjMuMC4uLjUuNC4wKQoKIyMgNS4zLjAgKDIwMTUtMDUtMjApCgoqICAgRml4IHNldmVyYWwgcmVncmVzc2lvbnMgaW4gdGhlIFtgc2hvdy1oaW50YF0oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNhZGRvbl9zaG93LWhpbnQpIGFkZG9uIChgY29tcGxldGVTaW5nbGVgIG9wdGlvbiwgYCJzaG93biJgIGFuZCBgImNsb3NlImAgZXZlbnRzKQoqICAgVGhlIFt2aW0gbW9kZV0oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RlbW8vdmltLmh0bWwpIEFQSSB3YXMgW2RvY3VtZW50ZWRdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjdmltYXBpKQoqICAgTmV3IG1vZGVzOiBbQVNOLjFdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL2Fzbi4xL2luZGV4Lmh0bWwpLCBbVFRDTl0oaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvdHRjbi9pbmRleC5odG1sKSwgYW5kIFtUVENOLUNGR10oaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvdHRjbi1jZmcvaW5kZXguaHRtbCkKKiAgIFRoZSBbY2xpa2VdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL2NsaWtlL2luZGV4Lmh0bWwpIG1vZGUgY2FuIG5vdyBkZWVwLWluZGVudCBgc3dpdGNoYCBzdGF0ZW1lbnRzLCBhbmQgcm91Z2hseSByZWNvZ25pemVzIHR5cGVzIGFuZCBkZWZpbmVkIGlkZW50aWZpZXJzCiogICBGdWxsIFtsaXN0IG9mIHBhdGNoZXNdKGh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL0NvZGVNaXJyb3IvY29tcGFyZS81LjIuMC4uLjUuMy4wKQoKIyMgNS4yLjAgKDIwMTUtMDQtMjApCgoqICAgRml4IHNldmVyYWwgcmFjZSBjb25kaXRpb25zIGluIFtgc2hvdy1oaW50YF0oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNhZGRvbl9zaG93LWhpbnQpJ3MgYXN5bmNocm9ub3VzIG1vZGUKKiAgIEZpeCBiYWNrc3BhY2UgYmluZGluZyBpbiBbU3VibGltZSBiaW5kaW5nc10oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RlbW8vc3VibGltZS5odG1sKQoqICAgQ2hhbmdlIHRoZSB3YXkgSU1FIGlzIGhhbmRsZWQgaW4gdGhlIGAidGV4dGFyZWEiYCBbaW5wdXQgc3R5bGVdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjb3B0aW9uX2lucHV0U3R5bGUpCiogICBOZXcgbW9kZXM6IFtNVU1QU10oaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvbXVtcHMvaW5kZXguaHRtbCksIFtIYW5kbGViYXJzXShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9oYW5kbGViYXJzL2luZGV4Lmh0bWwpCiogICBSZXdyaXR0ZW4gbW9kZXM6IFtEamFuZ29dKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL2RqYW5nby9pbmRleC5odG1sKSwgW1o4MF0oaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvejgwL2luZGV4Lmh0bWwpCiogICBOZXcgdGhlbWU6IFtMaXF1aWJ5dGVdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kZW1vL3RoZW1lLmh0bWwjbGlxdWlieXRlKQoqICAgTmV3IG9wdGlvbjogW2BsaW5lV2lzZUNvcHlDdXRgXShodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL21hbnVhbC5odG1sI29wdGlvbl9saW5lV2lzZUNvcHlDdXQpCiogICBUaGUgW1ZpbSBtb2RlXShodHRwOi8vY29kZW1pcnJvci5uZXQvZGVtby92aW0uaHRtbCkgbm93IHN1cHBvcnRzIGJ1ZmZlci1sb2NhbCBvcHRpb25zIGFuZCB0aGUgYGZpbGV0eXBlYCBzZXR0aW5nCiogICBGdWxsIFtsaXN0IG9mIHBhdGNoZXNdKGh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL0NvZGVNaXJyb3IvY29tcGFyZS81LjEuMC4uLjUuMi4wKQoKIyMgNS4xLjAgKDIwMTUtMDMtMjMpCgoqICAgTmV3IG1vZGVzOiBbQVNDSUkgYXJtb3JdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL2FzY2lpYXJtb3IvaW5kZXguaHRtbCkgKFBHUCBkYXRhKSwgW1Ryb2ZmXShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS90cm9mZi9pbmRleC5odG1sKSwgYW5kIFtDTWFrZV0oaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvY21ha2UvaW5kZXguaHRtbCkuCiogICBSZW1vdmUgU21hcnR5TWl4ZWQgbW9kZSwgcmV3cml0ZSBbU21hcnR5XShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9zbWFydHkvaW5kZXguaHRtbCkgbW9kZSB0byBzdXBlcnNlZGUgaXQuCiogICBOZXcgY29tbWFuZHMgaW4gdGhlIFttZXJnZSBhZGRvbl0oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNhZGRvbl9tZXJnZSk6IGBnb05leHREaWZmYCBhbmQgYGdvUHJldkRpZmZgLgoqICAgVGhlIFtjbG9zZWJyYWNrZXRzIGFkZG9uXShodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL21hbnVhbC5odG1sI2FkZG9uX2Nsb3NlYnJhY2tldHMpIGNhbiBub3cgYmUgY29uZmlndXJlZCBwZXIgbW9kZS4KKiAgIEZ1bGwgW2xpc3Qgb2YgcGF0Y2hlc10oaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvQ29kZU1pcnJvci9jb21wYXJlLzUuMC4wLi4uNS4xLjApLgoKIyMgNS4wLjAgKDIwMTUtMDItMjApCgoqICAgRXhwZXJpbWVudGFsIG1vYmlsZSBzdXBwb3J0ICh0ZXN0ZWQgb24gaU9TLCBBbmRyb2lkIENocm9tZSwgc3RvY2sgQW5kcm9pZCBicm93c2VyKQoqICAgTmV3IG9wdGlvbiBbYGlucHV0U3R5bGVgXShodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL21hbnVhbC5odG1sI29wdGlvbl9pbnB1dFN0eWxlKSB0byBzd2l0Y2ggYmV0d2VlbiBoaWRkZW4gdGV4dGFyZWEgYW5kIGNvbnRlbnRlZGl0YWJsZSBpbnB1dC4KKiAgIFRoZSBbYGdldElucHV0RmllbGRgXShodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL21hbnVhbC5odG1sI2dldElucHV0RmllbGQpIG1ldGhvZCBpcyBubyBsb25nZXIgZ3VhcmFudGVlZCB0byByZXR1cm4gYSB0ZXh0YXJlYS4KKiAgIEZ1bGwgW2xpc3Qgb2YgcGF0Y2hlc10oaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvQ29kZU1pcnJvci9jb21wYXJlLzQuMTMuMC4uLjUuMC4wKS4KCiMjIDQuMTMuMCAoMjAxNS0wMi0yMCkKCiogICBGaXggdGhlIHdheSB0aGUgW2BjbG9zZXRhZ2BdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kZW1vL2Nsb3NldGFnLmh0bWwpIGRlbW8gaGFuZGxlcyB0aGUgc2xhc2ggY2hhcmFjdGVyLgoqICAgTmV3IG1vZGVzOiBbRm9ydGhdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL2ZvcnRoL2luZGV4Lmh0bWwpLCBbU3R5bHVzXShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9zdHlsdXMvaW5kZXguaHRtbCkuCiogICBNYWtlIHRoZSBbQ1NTIG1vZGVdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL2Nzcy9pbmRleC5odG1sKSB1bmRlcnN0YW5kIHNvbWUgbW9kZXJuIENTUyBleHRlbnNpb25zLgoqICAgSGF2ZSB0aGUgW1NjYWxhIG1vZGVdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL2NsaWtlL2luZGV4Lmh0bWwpIGhhbmRsZSBzeW1ib2xzIGFuZCB0cmlwbGUtcXVvdGVkIHN0cmluZ3MuCiogICBGdWxsIFtsaXN0IG9mIHBhdGNoZXNdKGh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL0NvZGVNaXJyb3IvY29tcGFyZS80LjEyLjAuLi40LjEzLjApLgoKIyMgNC4xMi4wICgyMDE1LTAxLTIyKQoKKiAgIFRoZSBbYGNsb3NldGFnYF0oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNhZGRvbl9jbG9zZXRhZykgYWRkb24gbm93IGRlZmluZXMgYSBgImNsb3NlVGFnImAgY29tbWFuZC4KKiAgIEFkZHMgYSBgZmluZE1vZGVCeUZpbGVOYW1lYCB0byB0aGUgW21vZGUgbWV0YWRhdGFdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjYWRkb25fbWV0YSkgYWRkb24uCiogICBbU2ltcGxlIG1vZGVdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kZW1vL3NpbXBsZW1vZGUuaHRtbCkgcnVsZXMgY2FuIG5vdyBjb250YWluIGEgYHNvbGAgcHJvcGVydHkgdG8gb25seSBtYXRjaCBhdCB0aGUgc3RhcnQgb2YgYSBsaW5lLgoqICAgTmV3IGFkZG9uOiBbYHNlbGVjdGlvbi1wb2ludGVyYF0oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNhZGRvbl9zZWxlY3Rpb24tcG9pbnRlcikgdG8gc3R5bGUgdGhlIG1vdXNlIGN1cnNvciBvdmVyIHRoZSBzZWxlY3Rpb24uCiogICBJbXByb3ZlbWVudHMgdG8gdGhlIFtTYXNzIG1vZGVdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL3Nhc3MvaW5kZXguaHRtbCkncyBpbmRlbnRhdGlvbi4KKiAgIFRoZSBbVmltIGtleW1hcF0oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RlbW8vdmltLmh0bWwpJ3Mgc2VhcmNoIGZ1bmN0aW9uYWxpdHkgbm93IHN1cHBvcnRzIFtzY3JvbGxiYXIgYW5ub3RhdGlvbl0oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNhZGRvbl9tYXRjaGVzb25zY3JvbGxiYXIpLgoqICAgRnVsbCBbbGlzdCBvZiBwYXRjaGVzXShodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9Db2RlTWlycm9yL2NvbXBhcmUvNC4xMS4wLi4uNC4xMi4wKS4KCiMjIDQuMTEuMCAoMjAxNS0wMS0wOSkKClVuZm9ydHVuYXRlbHksIDQuMTAgZGlkIG5vdCB0YWtlIGNhcmUgb2YgdGhlIEZpcmVmb3ggc2Nyb2xsaW5nIGlzc3VlIGVudGlyZWx5LiBUaGlzIHJlbGVhc2UgYWRkcyB0d28gbW9yZSBwYXRjaGVzIHRvIGFkZHJlc3MgdGhhdC4KCiMjIDQuMTAuMCAoMjAxNC0xMi0yOSkKCkVtZXJnZW5jeSBzaW5nbGUtcGF0Y2ggdXBkYXRlIHRvIDQuOVwuIEZpeGVzIEZpcmVmb3gtc3BlY2lmaWMgcHJvYmxlbSB3aGVyZSB0aGUgY3Vyc29yIGNvdWxkIGVuZCB1cCBiZWhpbmQgdGhlIGhvcml6b250YWwgc2Nyb2xsYmFyLgoKIyMgNC45LjAgKDIwMTQtMTItMjMpCgoqICAgT3ZlcmhhdWxlZCBzY3JvbGwgYmFyIGhhbmRsaW5nLiBBZGQgcGx1Z2dhYmxlIFtzY3JvbGxiYXIgaW1wbGVtZW50YXRpb25zXShodHRwOi8vY29kZW1pcnJvci5uZXQvZGVtby9zaW1wbGVzY3JvbGxiYXJzLmh0bWwpLgoqICAgVHdlYWtlZCBiZWhhdmlvciBmb3IgdGhlIFtjb21wbGV0aW9uIGFkZG9uc10oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNhZGRvbl9zaG93LWhpbnQpIHRvIG5vdCB0YWtlIHRleHQgYWZ0ZXIgY3Vyc29yIGludG8gYWNjb3VudC4KKiAgIFR3byBuZXcgb3B0aW9uYWwgZmVhdHVyZXMgaW4gdGhlIFttZXJnZSBhZGRvbl0oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNhZGRvbl9tZXJnZSk6IGFsaWduaW5nIGVkaXRvcnMsIGFuZCBmb2xkaW5nIHVuY2hhbmdlZCB0ZXh0LgoqICAgTmV3IG1vZGVzOiBbRGFydF0oaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvZGFydC9pbmRleC5odG1sKSwgW0VCTkZdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL2VibmYvaW5kZXguaHRtbCksIFtzcHJlYWRzaGVldF0oaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvc3ByZWFkc2hlZXQvaW5kZXguaHRtbCksIGFuZCBbU295XShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9zb3kvaW5kZXguaHRtbCkuCiogICBOZXcgW2FkZG9uXShodHRwOi8vY29kZW1pcnJvci5uZXQvZGVtby9wYW5lbC5odG1sKSB0byBzaG93IHBlcnNpc3RlbnQgcGFuZWxzIGJlbG93L2Fib3ZlIGFuIGVkaXRvci4KKiAgIE5ldyB0aGVtZXM6IFt6ZW5idXJuXShodHRwOi8vY29kZW1pcnJvci5uZXQvZGVtby90aGVtZS5odG1sI3plbmJ1cm4pIGFuZCBbdG9tb3Jyb3cgbmlnaHQgYnJpZ2h0XShodHRwOi8vY29kZW1pcnJvci5uZXQvZGVtby90aGVtZS5odG1sI3RvbW9ycm93LW5pZ2h0LWJyaWdodCkuCiogICBBbGxvdyBjdHJsLWNsaWNrIHRvIGNsZWFyIGV4aXN0aW5nIGN1cnNvcnMuCiogICBGdWxsIFtsaXN0IG9mIHBhdGNoZXNdKGh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL0NvZGVNaXJyb3IvY29tcGFyZS80LjguMC4uLjQuOS4wKS4KCiMjIDQuOC4wICgyMDE0LTExLTIyKQoKKiAgIEJ1aWx0LWluIHN1cHBvcnQgZm9yIFttdWx0aS1zdHJva2Uga2V5IGJpbmRpbmdzXShodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL21hbnVhbC5odG1sI25vcm1hbGl6ZUtleU1hcCkuCiogICBOZXcgbWV0aG9kOiBbYGdldExpbmVUb2tlbnNgXShodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL21hbnVhbC5odG1sI2dldExpbmVUb2tlbnMpLgoqICAgTmV3IG1vZGVzOiBbZG9ja2VyZmlsZV0oaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvZG9ja2VyZmlsZS9pbmRleC5odG1sKSwgW0lETF0oaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvaWRsL2luZGV4Lmh0bWwpLCBbT2JqZWN0aXZlIENdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL2NsaWtlL2luZGV4Lmh0bWwpIChjcnVkZSkuCiogICBTdXBwb3J0IHN0eWxpbmcgb2YgZ3V0dGVyIGJhY2tncm91bmRzLCBhbGxvdyBgImd1dHRlciJgIHN0eWxlcyBpbiBbYGFkZExpbmVDbGFzc2BdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjYWRkTGluZUNsYXNzKS4KKiAgIE1hbnkgaW1wcm92ZW1lbnRzIHRvIHRoZSBbVmltIG1vZGVdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kZW1vL3ZpbS5odG1sKSwgcmV3cml0dGVuIHZpc3VhbCBtb2RlLgoqICAgSW1wcm92ZW1lbnRzIHRvIG1vZGVzOiBbZ2ZtXShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9nZm0vaW5kZXguaHRtbCkgKHN0cmlrZXRocm91Z2gpLCBbU1BBUlFMXShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9zcGFycWwvaW5kZXguaHRtbCkgKHZlcnNpb24gMS4xIHN1cHBvcnQpLCBhbmQgW3NUZVhdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL3N0ZXgvaW5kZXguaHRtbCkgKG5vIG1vcmUgcnVuYXdheSBtYXRoIG1vZGUpLgoqICAgRnVsbCBbbGlzdCBvZiBwYXRjaGVzXShodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9Db2RlTWlycm9yL2NvbXBhcmUvNC43LjAuLi40LjguMCkuCgojIyA0LjcuMCAoMjAxNC0xMC0yMCkKCiogICAqKkluY29tcGF0aWJsZSoqOiBUaGUgW2xpbnQgYWRkb25dKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kZW1vL2xpbnQuaHRtbCkgbm93IHBhc3NlcyB0aGUgZWRpdG9yJ3MgdmFsdWUgYXMgZmlyc3QgYXJndW1lbnQgdG8gYXN5bmNocm9ub3VzIGxpbnQgZnVuY3Rpb25zLCBmb3IgY29uc2lzdGVuY3kuIFRoZSBlZGl0b3IgaXMgc3RpbGwgcGFzc2VkLCBhcyBmb3VydGggYXJndW1lbnQuCiogICBJbXByb3ZlZCBoYW5kbGluZyBvZiB1bmljb2RlIGlkZW50aWZpZXJzIGluIG1vZGVzIGZvciBsYW5ndWFnZXMgdGhhdCBzdXBwb3J0IHRoZW0uCiogICBNb3JlIG1vZGUgaW1wcm92ZW1lbnRzOiBbQ29mZmVlU2NyaXB0XShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9jb2ZmZWVzY3JpcHQvaW5kZXguaHRtbCkgKGluZGVudGF0aW9uKSwgW1Zlcmlsb2ddKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL3Zlcmlsb2cvaW5kZXguaHRtbCkgKGluZGVudGF0aW9uKSwgW1NjYWxhXShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9jbGlrZS9pbmRleC5odG1sKSAoaW5kZW50YXRpb24sIHRyaXBsZS1xdW90ZWQgc3RyaW5ncyksIGFuZCBbUEhQXShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9waHAvaW5kZXguaHRtbCkgKGludGVycG9sYXRlZCB2YXJpYWJsZXMgaW4gaGVyZWRvYyBzdHJpbmdzKS4KKiAgIE5ldyBtb2RlczogW1RleHRpbGVdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL3RleHRpbGUvaW5kZXguaHRtbCkgYW5kIFtUb3JuYWRvIHRlbXBsYXRlc10oaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvdG9ybmFkby9pbmRleC5odG1sKS4KKiAgIEV4cGVyaW1lbnRhbCBuZXcgW3dheSB0byBkZWZpbmUgbW9kZXNdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kZW1vL3NpbXBsZW1vZGUuaHRtbCkuCiogICBJbXByb3ZlbWVudHMgdG8gdGhlIFtWaW0gYmluZGluZ3NdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kZW1vL3ZpbS5odG1sKTogQXJiaXRyYXJ5IGluc2VydCBtb2RlIGtleSBtYXBwaW5ncyBhcmUgbm93IHBvc3NpYmxlLCBhbmQgdGV4dCBvYmplY3RzIGFyZSBzdXBwb3J0ZWQgaW4gdmlzdWFsIG1vZGUuCiogICBUaGUgbW9kZSBbbWV0YS1pbmZvcm1hdGlvbiBmaWxlXShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9tZXRhLmpzKSBub3cgaW5jbHVkZXMgaW5mb3JtYXRpb24gYWJvdXQgZmlsZSBleHRlbnNpb25zLCBhbmQgW2hlbHBlciBmdW5jdGlvbnNdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjYWRkb25fbWV0YSkgYGZpbmRNb2RlQnlNSU1FYCBhbmQgYGZpbmRNb2RlQnlFeHRlbnNpb25gLgoqICAgTmV3IGxvZ28hCiogICBGdWxsIFtsaXN0IG9mIHBhdGNoZXNdKGh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL0NvZGVNaXJyb3IvY29tcGFyZS80LjYuMC4uLjQuNy4wKS4KCiMjIDQuNi4wICgyMDE0LTA5LTE5KQoKKiAgIE5ldyBtb2RlOiBbTW9kZWxpY2FdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL21vZGVsaWNhL2luZGV4Lmh0bWwpCiogICBOZXcgbWV0aG9kOiBbYGZpbmRXb3JkQXRgXShodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL21hbnVhbC5odG1sI2ZpbmRXb3JkQXQpCiogICBNYWtlIGl0IGVhc2llciB0byBbdXNlIHRleHQgYmFja2dyb3VuZCBzdHlsaW5nXShodHRwOi8vY29kZW1pcnJvci5uZXQvZGVtby9tYXJrc2VsZWN0aW9uLmh0bWwpCiogICBGdWxsIFtsaXN0IG9mIHBhdGNoZXNdKGh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL0NvZGVNaXJyb3IvY29tcGFyZS80LjUuMC4uLjQuNi4wKS4KCiMjIDQuNS4wICgyMDE0LTA4LTIxKQoKKiAgIEZpeCBzZXZlcmFsIHNlcmlvdXMgYnVncyB3aXRoIGhvcml6b250YWwgc2Nyb2xsaW5nCiogICBOZXcgbW9kZTogW1NsaW1dKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL3NsaW0vaW5kZXguaHRtbCkKKiAgIE5ldyBjb21tYW5kOiBbYGdvTGluZUxlZnRTbWFydGBdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjY29tbWFuZF9nb0xpbmVMZWZ0U21hcnQpCiogICBNb3JlIGZpeGVzIGFuZCBleHRlbnNpb25zIGZvciB0aGUgW1ZpbV0oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RlbW8vdmltLmh0bWwpIHZpc3VhbCBibG9jayBtb2RlCiogICBGdWxsIFtsaXN0IG9mIHBhdGNoZXNdKGh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL0NvZGVNaXJyb3IvY29tcGFyZS80LjQuMC4uLjQuNS4wKS4KCiMjIDQuNC4wICgyMDE0LTA3LTIxKQoKKiAgICoqTm90ZToqKiBTb21lIGV2ZW50cyBtaWdodCBub3cgZmlyZSBpbiBzbGlnaHRseSBkaWZmZXJlbnQgb3JkZXIgKGAiY2hhbmdlImAgaXMgc3RpbGwgZ3VhcmFudGVlZCB0byBmaXJlIGJlZm9yZSBgImN1cnNvckFjdGl2aXR5ImApCiogICBOZXN0ZWQgb3BlcmF0aW9ucyBpbiBtdWx0aXBsZSBlZGl0b3JzIGFyZSBub3cgc3luY2VkIChjb21wbGV0ZSBhdCBzYW1lIHRpbWUsIHJlZHVjaW5nIERPTSByZWZsb3dzKQoqICAgVmlzdWFsIGJsb2NrIG1vZGUgZm9yIFt2aW1dKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kZW1vL3ZpbS5odG1sKSAoPEMtdj4pIGlzIG5lYXJseSBjb21wbGV0ZQoqICAgTmV3IG1vZGU6IFtLb3RsaW5dKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL2tvdGxpbi9pbmRleC5odG1sKQoqICAgQmV0dGVyIG11bHRpLXNlbGVjdGlvbiBwYXN0ZSBmb3IgdGV4dCBjb3BpZWQgZnJvbSBtdWx0aXBsZSBDb2RlTWlycm9yIHNlbGVjdGlvbnMKKiAgIEZ1bGwgW2xpc3Qgb2YgcGF0Y2hlc10oaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvQ29kZU1pcnJvci9jb21wYXJlLzQuMy4wLi4uNC40LjApLgoKIyMgNC4zLjAgKDIwMTQtMDYtMjMpCgoqICAgU2V2ZXJhbCBbdmltIGJpbmRpbmdzXShodHRwOi8vY29kZW1pcnJvci5uZXQvZGVtby92aW0uaHRtbCkgaW1wcm92ZW1lbnRzOiBzZWFyY2ggYW5kIGV4Q29tbWFuZCBoaXN0b3J5LCBnbG9iYWwgZmxhZyBmb3IgYDpzdWJzdGl0dXRlYCwgYDpnbG9iYWxgIGNvbW1hbmQuCiogICBBbGxvdyBoaWRpbmcgdGhlIGN1cnNvciBieSBzZXR0aW5nIFtgY3Vyc29yQmxpbmtSYXRlYF0oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNvcHRpb25fY3Vyc29yQmxpbmtSYXRlKSB0byBhIG5lZ2F0aXZlIHZhbHVlLgoqICAgTWFrZSBndXR0ZXIgbWFya2VycyB0aGVtZWFibGUsIHVzZSB0aGlzIGluIGZvbGRndXR0ZXIuCiogICBGdWxsIFtsaXN0IG9mIHBhdGNoZXNdKGh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL0NvZGVNaXJyb3IvY29tcGFyZS80LjIuMC4uLjQuMy4wKS4KCiMjIDQuMi4wICgyMDE0LTA1LTE5KQoKKiAgIEZpeCBwcm9ibGVtIHdoZXJlIHNvbWUgbW9kZXMgd2VyZSBicm9rZW4gYnkgdGhlIGZhY3QgdGhhdCBlbXB0eSB0b2tlbnMgd2VyZSBmb3JiaWRkZW4uCiogICBTZXZlcmFsIGZpeGVzIHRvIGNvbnRleHQgbWVudSBoYW5kbGluZy4KKiAgIE9uIHVuZG8sIHNjcm9sbCBfY2hhbmdlXywgbm90IGN1cnNvciwgaW50byB2aWV3LgoqICAgUmV3cml0dGVuIFtKYWRlXShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9qYWRlL2luZGV4Lmh0bWwpIG1vZGUuCiogICBWYXJpb3VzIGltcHJvdmVtZW50cyB0byBbU2hlbGxdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL3NoZWxsL2luZGV4Lmh0bWwpIChzdXBwb3J0IGZvciBtb3JlIHN5bnRheCkgYW5kIFtQeXRob25dKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL3B5dGhvbi9pbmRleC5odG1sKSAoYmV0dGVyIGluZGVudGF0aW9uKSBtb2Rlcy4KKiAgIE5ldyBtb2RlOiBbQ3lwaGVyXShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9jeXBoZXIvaW5kZXguaHRtbCkuCiogICBOZXcgdGhlbWU6IFtOZW9dKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kZW1vL3RoZW1lLmh0bWwjbmVvKS4KKiAgIFN1cHBvcnQgZGlyZWN0IHN0eWxpbmcgb3B0aW9ucyAoY29sb3IsIGxpbmUgc3R5bGUsIHdpZHRoKSBpbiB0aGUgW3J1bGVyc10oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNhZGRvbl9ydWxlcnMpIGFkZG9uLgoqICAgUmVjb2duaXplIHBlci1lZGl0b3IgY29uZmlndXJhdGlvbiBmb3IgdGhlIFtzaG93LWhpbnRdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjYWRkb25fc2hvdy1oaW50KSBhbmQgW2ZvbGRjb2RlXShodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL21hbnVhbC5odG1sI2FkZG9uX2ZvbGRjb2RlKSBhZGRvbnMuCiogICBNb3JlIGludGVsbGlnZW50IHNjYW5uaW5nIGZvciBleGlzdGluZyBjbG9zZSB0YWdzIGluIFtjbG9zZXRhZ10oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNhZGRvbl9jbG9zZXRhZykgYWRkb24uCiogICBJbiB0aGUgW1ZpbSBiaW5kaW5nc10oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RlbW8vdmltLmh0bWwpOiBGaXggYnJhY2tldCBtYXRjaGluZywgc3VwcG9ydCBjYXNlIGNvbnZlcnNpb24gaW4gdmlzdWFsIG1vZGUsIHZpc3VhbCBwYXN0ZSwgYXBwZW5kIGFjdGlvbi4KKiAgIEZ1bGwgW2xpc3Qgb2YgcGF0Y2hlc10oaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvQ29kZU1pcnJvci9jb21wYXJlLzQuMS4wLi4uNC4yLjApLgoKIyMgNC4xLjAgKDIwMTQtMDQtMjIpCgoqICAgX1NsaWdodGx5IGluY29tcGF0aWJsZV86IFRoZSBbYCJjdXJzb3JBY3Rpdml0eSJgXShodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL21hbnVhbC5odG1sI2V2ZW50X2N1cnNvckFjdGl2aXR5KSBldmVudCBub3cgZmlyZXMgYWZ0ZXIgYWxsIG90aGVyIGV2ZW50cyBmb3IgdGhlIG9wZXJhdGlvbiAoYW5kIG9ubHkgZm9yIGhhbmRsZXJzIHRoYXQgd2VyZSBhY3R1YWxseSByZWdpc3RlcmVkIGF0IHRoZSB0aW1lIHRoZSBhY3Rpdml0eSBoYXBwZW5lZCkuCiogICBOZXcgY29tbWFuZDogW2BpbnNlcnRTb2Z0VGFiYF0oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNjb21tYW5kX2luc2VydFNvZnRUYWIpLgoqICAgTmV3IG1vZGU6IFtEamFuZ29dKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL2RqYW5nby9pbmRleC5odG1sKS4KKiAgIEltcHJvdmVkIG1vZGVzOiBbVmVyaWxvZ10oaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvdmVyaWxvZy9pbmRleC5odG1sKSAocmV3cml0dGVuKSwgW0ppbmphMl0oaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvamluamEyL2luZGV4Lmh0bWwpLCBbSGF4ZV0oaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvaGF4ZS9pbmRleC5odG1sKSwgW1BIUF0oaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvcGhwL2luZGV4Lmh0bWwpIChzdHJpbmcgaW50ZXJwb2xhdGlvbiBoaWdobGlnaHRlZCksIFtKYXZhU2NyaXB0XShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9qYXZhc2NyaXB0L2luZGV4Lmh0bWwpIChpbmRlbnRhdGlvbiBvZiB0cmFpbGluZyBlbHNlLCB0ZW1wbGF0ZSBzdHJpbmdzKSwgW0xpdmVTY3JpcHRdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL2xpdmVzY3JpcHQvaW5kZXguaHRtbCkgKG11bHRpLWxpbmUgc3RyaW5ncykuCiogICBNYW55IHNtYWxsIGlzc3VlcyBmcm9tIHRoZSAzLnjihpI0LnggdHJhbnNpdGlvbiB3ZXJlIGZvdW5kIGFuZCBmaXhlZC4KKiAgIEZ1bGwgW2xpc3Qgb2YgcGF0Y2hlc10oaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvQ29kZU1pcnJvci9jb21wYXJlLzQuMC4zLi4uNC4xLjApLgoKIyMgMy4yNC4wICgyMDE0LTA0LTIyKQoKTWVyZ2VzIHRoZSBpbXByb3ZlbWVudHMgZnJvbSA0LjEgdGhhdCBjb3VsZCBlYXNpbHkgYmUgYXBwbGllZCB0byB0aGUgMy54IGNvZGUuIEFsc28gaW1wcm92ZXMgdGhlIHdheSB0aGUgZWRpdG9yIHNpemUgaXMgdXBkYXRlZCB3aGVuIGxpbmUgd2lkZ2V0cyBjaGFuZ2UuCgojIyAzLjIzLjAgKDIwMTQtMDMtMjApCgoqICAgSW4gdGhlIFtYTUwgbW9kZV0oaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUveG1sL2luZGV4Lmh0bWwpLCBhZGQgYGJyYWNrZXRzYCBzdHlsZSB0byBhbmdsZSBicmFja2V0cywgZml4IGNhc2Utc2Vuc2l0aXZpdHkgb2YgdGFncyBmb3IgSFRNTC4KKiAgIE5ldyBtb2RlOiBbRHlsYW5dKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL2R5bGFuL2luZGV4Lmh0bWwpLgoqICAgTWFueSBpbXByb3ZlbWVudHMgdG8gdGhlIFtWaW0gYmluZGluZ3NdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kZW1vL3ZpbS5odG1sKS4KCiMjIDMuMjIuMCAoMjAxNC0wMi0yMSkKCiogICBBZGRzIHRoZSBbYGZpbmRNYXJrc2BdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjZmluZE1hcmtzKSBtZXRob2QuCiogICBOZXcgYWRkb25zOiBbcnVsZXJzXShodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL21hbnVhbC5odG1sI2FkZG9uX3J1bGVycyksIG1hcmtkb3duLWZvbGQsIHlhbWwtbGludC4KKiAgIE5ldyB0aGVtZTogW21kbi1saWtlXShodHRwOi8vY29kZW1pcnJvci5uZXQvZGVtby90aGVtZS5odG1sI21kbi1saWtlKS4KKiAgIE5ldyBtb2RlOiBbU29scl0oaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvc29sci9pbmRleC5odG1sKS4KKiAgIEZ1bGwgW2xpc3Qgb2YgcGF0Y2hlc10oaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvQ29kZU1pcnJvci9jb21wYXJlLzMuMjEuMC4uLjMuMjIuMCkuCgojIyAzLjIxLjAgKDIwMTQtMDEtMTYpCgoqICAgQXV0by1pbmRlbnRpbmcgYSBibG9jayB3aWxsIG5vIGxvbmdlciBhZGQgdHJhaWxpbmcgd2hpdGVzcGFjZSB0byBibGFuayBsaW5lcy4KKiAgIE1hcmtpbmcgdGV4dCBoYXMgYSBuZXcgb3B0aW9uIFtgY2xlYXJXaGVuRW1wdHlgXShodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL21hbnVhbC5odG1sI21hcmtUZXh0KSB0byBjb250cm9sIGF1dG8tcmVtb3ZhbC4KKiAgIFNldmVyYWwgYnVnZml4ZXMgaW4gdGhlIGhhbmRsaW5nIG9mIGJpZGlyZWN0aW9uYWwgdGV4dC4KKiAgIFRoZSBbWE1MXShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS94bWwvaW5kZXguaHRtbCkgYW5kIFtDU1NdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL2Nzcy9pbmRleC5odG1sKSBtb2RlcyB3ZXJlIGxhcmdlbHkgcmV3cml0dGVuLiBbTEVTU10oaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvY3NzL2xlc3MuaHRtbCkgc3VwcG9ydCB3YXMgYWRkZWQgdG8gdGhlIENTUyBtb2RlLgoqICAgVGhlIE9DYW1sIG1vZGUgd2FzIG1vdmVkIHRvIGFuIFttbGxpa2VdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL21sbGlrZS9pbmRleC5odG1sKSBtb2RlLCBGIyBzdXBwb3J0IGFkZGVkLgoqICAgTWFrZSBpdCBwb3NzaWJsZSB0byBmZXRjaCBtdWx0aXBsZSBhcHBsaWNhYmxlIGhlbHBlciB2YWx1ZXMgd2l0aCBbYGdldEhlbHBlcnNgXShodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL21hbnVhbC5odG1sI2dldEhlbHBlcnMpLCBhbmQgdG8gcmVnaXN0ZXIgaGVscGVycyBtYXRjaGVkIG9uIHByZWRpY2F0ZXMgd2l0aCBbYHJlZ2lzdGVyR2xvYmFsSGVscGVyYF0oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNyZWdpc3Rlckdsb2JhbEhlbHBlcikuCiogICBOZXcgdGhlbWUgW3Bhc3RlbC1vbi1kYXJrXShodHRwOi8vY29kZW1pcnJvci5uZXQvZGVtby90aGVtZS5odG1sI3Bhc3RlbC1vbi1kYXJrKS4KKiAgIEJldHRlciBFQ01BU2NyaXB0IDYgc3VwcG9ydCBpbiBbSmF2YVNjcmlwdF0oaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvamF2YXNjcmlwdC9pbmRleC5odG1sKSBtb2RlLgoqICAgRnVsbCBbbGlzdCBvZiBwYXRjaGVzXShodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9Db2RlTWlycm9yL2NvbXBhcmUvMy4yMC4wLi4uMy4yMS4wKS4KCiMjIDMuMjAuMCAoMjAxMy0xMS0yMSkKCiogICBOZXcgbW9kZXM6IFtKdWxpYV0oaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvanVsaWEvaW5kZXguaHRtbCkgYW5kIFtQRUcuanNdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL3BlZ2pzL2luZGV4Lmh0bWwpLgoqICAgU3VwcG9ydCBFQ01BU2NyaXB0IDYgaW4gdGhlIFtKYXZhU2NyaXB0IG1vZGVdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL2phdmFzY3JpcHQvaW5kZXguaHRtbCkuCiogICBJbXByb3ZlZCBpbmRlbnRhdGlvbiBmb3IgdGhlIFtDb2ZmZWVTY3JpcHQgbW9kZV0oaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvY29mZmVlc2NyaXB0L2luZGV4Lmh0bWwpLgoqICAgTWFrZSBub24tcHJpbnRhYmxlLWNoYXJhY3RlciByZXByZXNlbnRhdGlvbiBbY29uZmlndXJhYmxlXShodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL21hbnVhbC5odG1sI29wdGlvbl9zcGVjaWFsQ2hhcnMpLgoqICAgQWRkIOKAmG5vdGlmaWNhdGlvbuKAmSBmdW5jdGlvbmFsaXR5IHRvIFtkaWFsb2ddKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjYWRkb25fZGlhbG9nKSBhZGRvbi4KKiAgIEZ1bGwgW2xpc3Qgb2YgcGF0Y2hlc10oaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvQ29kZU1pcnJvci9jb21wYXJlLzMuMTkuMC4uLjMuMjAuMCkuCgojIyAzLjE5LjAgKDIwMTMtMTAtMjEpCgoqICAgTmV3IG1vZGVzOiBbRWlmZmVsXShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9laWZmZWwvaW5kZXguaHRtbCksIFtHaGVya2luXShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9naGVya2luL2luZGV4Lmh0bWwpLCBbTVNTUUwgZGlhbGVjdF0oaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvc3FsLz9taW1lPXRleHQveC1tc3NxbCkuCiogICBOZXcgYWRkb25zOiBbaGFyZHdyYXBdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjYWRkb25faGFyZHdyYXApLCBbc3FsLWhpbnRdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjYWRkb25fc3FsLWhpbnQpLgoqICAgTmV3IHRoZW1lOiBbTUJPXShodHRwOi8vY29kZW1pcnJvci5uZXQvZGVtby90aGVtZS5odG1sI21ibykuCiogICBBZGQgW3N1cHBvcnRdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjdG9rZW5fc3R5bGVfbGluZSkgZm9yIGxpbmUtbGV2ZWwgc3R5bGluZyBmcm9tIG1vZGUgdG9rZW5pemVycy4KKiAgIEZ1bGwgW2xpc3Qgb2YgcGF0Y2hlc10oaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvQ29kZU1pcnJvci9jb21wYXJlLzMuMTguMC4uLjMuMTkuMCkuCgojIyAzLjE4LjAgKDIwMTMtMDktMjMpCgpFbWVyZ2VuY3kgcmVsZWFzZSB0byBmaXggYSBwcm9ibGVtIGluIDMuMTcgd2hlcmUgYC5zZXRPcHRpb24oImxpbmVOdW1iZXJzIiwgZmFsc2UpYCB3b3VsZCByYWlzZSBhbiBlcnJvci4KCiMjIDMuMTcuMCAoMjAxMy0wOS0yMykKCiogICBOZXcgbW9kZXM6IFtGb3J0cmFuXShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9mb3J0cmFuL2luZGV4Lmh0bWwpLCBbT2N0YXZlXShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9vY3RhdmUvaW5kZXguaHRtbCkgKE1hdGxhYiksIFtUT01MXShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS90b21sL2luZGV4Lmh0bWwpLCBhbmQgW0RURF0oaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvZHRkL2luZGV4Lmh0bWwpLgoqICAgTmV3IGFkZG9uczogW2Bjc3MtbGludGBdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9hZGRvbi9saW50L2Nzcy1saW50LmpzKSwgW2Bjc3MtaGludGBdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjYWRkb25fY3NzLWhpbnQpLgoqICAgSW1wcm92ZSByZXNpbGllbmNlIHRvIENTUyAnZnJhbWV3b3JrcycgdGhhdCBnbG9iYWxseSBtZXNzIHVwIGBib3gtc2l6aW5nYC4KKiAgIEZ1bGwgW2xpc3Qgb2YgcGF0Y2hlc10oaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvQ29kZU1pcnJvci9jb21wYXJlLzMuMTYuMC4uLjMuMTcuMCkuCgojIyAzLjE2LjAgKDIwMTMtMDgtMjEpCgoqICAgVGhlIHdob2xlIGNvZGViYXNlIGlzIG5vdyB1bmRlciBhIHNpbmdsZSBbbGljZW5zZV0oaHR0cDovL2NvZGVtaXJyb3IubmV0L0xJQ0VOU0UpIGZpbGUuCiogICBUaGUgcHJvamVjdCBwYWdlIHdhcyBvdmVyaGF1bGVkIGFuZCByZWRlc2lnbmVkLgoqICAgTmV3IHRoZW1lczogW1BhcmFpc29dKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kZW1vL3RoZW1lLmh0bWwjcGFyYWlzby1kYXJrKSAoW2xpZ2h0XShodHRwOi8vY29kZW1pcnJvci5uZXQvZGVtby90aGVtZS5odG1sI3BhcmFpc28tbGlnaHQpKSwgW1RoZSBNYXRyaXhdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kZW1vL3RoZW1lLmh0bWwjdGhlLW1hdHJpeCkuCiogICBJbXByb3ZlZCBpbnRlcmFjdGlvbiBiZXR3ZWVuIHRoZW1lcyBhbmQgW2FjdGl2ZS1saW5lXShodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL21hbnVhbC5odG1sI2FkZG9uX2FjdGl2ZS1saW5lKS9bbWF0Y2hicmFja2V0c10oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNhZGRvbl9tYXRjaGJyYWNrZXRzKSBhZGRvbnMuCiogICBOZXcgW2ZvbGRpbmddKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjYWRkb25fZm9sZGNvZGUpIGZ1bmN0aW9uIGBDb2RlTWlycm9yLmZvbGQuY29tbWVudGAuCiogICBBZGRlZCBbZnVsbHNjcmVlbl0oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNhZGRvbl9mdWxsc2NyZWVuKSBhZGRvbi4KKiAgIEZ1bGwgW2xpc3Qgb2YgcGF0Y2hlc10oaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvQ29kZU1pcnJvci9jb21wYXJlLzMuMTUuMC4uLjMuMTYuMCkuCgojIyAzLjE1LjAgKDIwMTMtMDctMjkpCgoqICAgTmV3IG1vZGVzOiBbSmFkZV0oaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvamFkZS9pbmRleC5odG1sKSwgW05naW54XShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9uZ2lueC9pbmRleC5odG1sKS4KKiAgIE5ldyBhZGRvbnM6IFtUZXJuXShodHRwOi8vY29kZW1pcnJvci5uZXQvZGVtby90ZXJuLmh0bWwpLCBbbWF0Y2h0YWdzXShodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL21hbnVhbC5odG1sI2FkZG9uX21hdGNodGFncyksIGFuZCBbZm9sZGd1dHRlcl0oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNhZGRvbl9mb2xkZ3V0dGVyKS4KKiAgIEludHJvZHVjZWQgW19oZWxwZXJfXShodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL21hbnVhbC5odG1sI2dldEhlbHBlcikgY29uY2VwdCAoW2NvbnRleHRdKGh0dHBzOi8vZ3JvdXBzLmdvb2dsZS5jb20vZm9ydW0vIyFtc2cvY29kZW1pcnJvci9jT2MweHZVVUVVVS9uTHJYMS1xbmlkZ0opKS4KKiAgIE5ldyBtZXRob2Q6IFtgZ2V0TW9kZUF0YF0oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNnZXRNb2RlQXQpLgoqICAgTmV3IHRoZW1lczogYmFzZTE2IFtkYXJrXShodHRwOi8vY29kZW1pcnJvci5uZXQvZGVtby90aGVtZS5odG1sI2Jhc2UxNi1kYXJrKS9bbGlnaHRdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kZW1vL3RoZW1lLmh0bWwjYmFzZTE2LWxpZ2h0KSwgMzAyNCBbZGFya10oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RlbW8vdGhlbWUuaHRtbCMzMDI0LW5pZ2h0KS9bbGlnaHRdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kZW1vL3RoZW1lLmh0bWwjMzAyNC1kYXkpLCBbdG9tb3Jyb3ctbmlnaHRdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kZW1vL3RoZW1lLmh0bWwjdG9tb3Jyb3ctbmlnaHQtZWlnaHRpZXMpLgoqICAgRnVsbCBbbGlzdCBvZiBwYXRjaGVzXShodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9Db2RlTWlycm9yL2NvbXBhcmUvMy4xNC4wLi4uMy4xNS4wKS4KCiMjIDMuMTQuMCAoMjAxMy0wNi0yMCkKCiogICBOZXcgYWRkb25zOiBbdHJhaWxpbmcgc3BhY2UgaGlnaGxpZ2h0XShodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL21hbnVhbC5odG1sI2FkZG9uX3RyYWlsaW5nc3BhY2UpLCBbWE1MIGNvbXBsZXRpb25dKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjYWRkb25feG1sLWhpbnQpIChyZXdyaXR0ZW4pLCBhbmQgW2RpZmYgbWVyZ2luZ10oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNhZGRvbl9tZXJnZSkuCiogICBbYG1hcmtUZXh0YF0oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNtYXJrVGV4dCkgYW5kIFtgYWRkTGluZVdpZGdldGBdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjYWRkTGluZVdpZGdldCkgbm93IHRha2UgYSBgaGFuZGxlTW91c2VFdmVudHNgIG9wdGlvbi4KKiAgIE5ldyBtZXRob2RzOiBbYGxpbmVBdEhlaWdodGBdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjbGluZUF0SGVpZ2h0KSwgW2BnZXRUb2tlblR5cGVBdGBdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjZ2V0VG9rZW5UeXBlQXQpLgoqICAgTW9yZSBwcmVjaXNlIGNsZWFubmVzcy10cmFja2luZyB1c2luZyBbYGNoYW5nZUdlbmVyYXRpb25gXShodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL21hbnVhbC5odG1sI2NoYW5nZUdlbmVyYXRpb24pIGFuZCBbYGlzQ2xlYW5gXShodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL21hbnVhbC5odG1sI2lzQ2xlYW4pLgoqICAgTWFueSBleHRlbnNpb25zIHRvIFtFbWFjc10oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RlbW8vZW1hY3MuaHRtbCkgbW9kZSAocHJlZml4ZXMsIG1vcmUgbmF2aWdhdGlvbiB1bml0cywgYW5kIG1vcmUpLgoqICAgTmV3IGV2ZW50cyBbYCJrZXlIYW5kbGVkImBdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjZXZlbnRfa2V5SGFuZGxlZCkgYW5kIFtgImlucHV0UmVhZCJgXShodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL21hbnVhbC5odG1sI2V2ZW50X2lucHV0UmVhZCkuCiogICBWYXJpb3VzIGltcHJvdmVtZW50cyB0byBbUnVieV0oaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvcnVieS9pbmRleC5odG1sKSwgW1NtYXJ0eV0oaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvc21hcnR5L2luZGV4Lmh0bWwpLCBbU1FMXShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9zcWwvaW5kZXguaHRtbCksIGFuZCBbVmltXShodHRwOi8vY29kZW1pcnJvci5uZXQvZGVtby92aW0uaHRtbCkgbW9kZXMuCiogICBGdWxsIFtsaXN0IG9mIHBhdGNoZXNdKGh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL0NvZGVNaXJyb3IvY29tcGFyZS8zLjEzLjAuLi4zLjE0LjApLgoKIyMgMy4xMy4wICgyMDEzLTA1LTIwKQoKKiAgIE5ldyBtb2RlczogW0NPQk9MXShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9jb2JvbC9pbmRleC5odG1sKSBhbmQgW0hBTUxdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL2hhbWwvaW5kZXguaHRtbCkuCiogICBOZXcgb3B0aW9uczogW2BjdXJzb3JTY3JvbGxNYXJnaW5gXShodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL21hbnVhbC5odG1sI29wdGlvbl9jdXJzb3JTY3JvbGxNYXJnaW4pIGFuZCBbYGNvdmVyR3V0dGVyTmV4dFRvU2Nyb2xsYmFyYF0oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNvcHRpb25fY292ZXJHdXR0ZXJOZXh0VG9TY3JvbGxiYXIpLgoqICAgTmV3IGFkZG9uOiBbY29tbWVudGluZ10oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNhZGRvbl9jb21tZW50KS4KKiAgIE1vcmUgZmVhdHVyZXMgYWRkZWQgdG8gdGhlIFtWaW0ga2V5bWFwXShodHRwOi8vY29kZW1pcnJvci5uZXQvZGVtby92aW0uaHRtbCkuCiogICBGdWxsIFtsaXN0IG9mIHBhdGNoZXNdKGh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL0NvZGVNaXJyb3IvY29tcGFyZS92My4xMi4uLjMuMTMuMCkuCgojIyAzLjEyLjAgKDIwMTMtMDQtMTkpCgoqICAgTmV3IG1vZGU6IFtHTlUgYXNzZW1ibGVyXShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9nYXMvaW5kZXguaHRtbCkuCiogICBOZXcgb3B0aW9uczogW2BtYXhIaWdobGlnaHRMZW5ndGhgXShodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL21hbnVhbC5odG1sI29wdGlvbl9tYXhIaWdobGlnaHRMZW5ndGgpIGFuZCBbYGhpc3RvcnlFdmVudERlbGF5YF0oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNvcHRpb25faGlzdG9yeUV2ZW50RGVsYXkpLgoqICAgQWRkZWQgW2BhZGRUb0hpc3RvcnlgXShodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL21hbnVhbC5odG1sI21hcmtfYWRkVG9IaXN0b3J5KSBvcHRpb24gZm9yIGBtYXJrVGV4dGAuCiogICBWYXJpb3VzIGZpeGVzIHRvIEphdmFTY3JpcHQgdG9rZW5pemF0aW9uIGFuZCBpbmRlbnRhdGlvbiBjb3JuZXIgY2FzZXMuCiogICBGdXJ0aGVyIGltcHJvdmVtZW50cyB0byB0aGUgdmltIG1vZGUuCiogICBGdWxsIFtsaXN0IG9mIHBhdGNoZXNdKGh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL0NvZGVNaXJyb3IvY29tcGFyZS92My4xMS4uLnYzLjEyKS4KCiMjIDMuMTEuMCAoMjAxMy0wMy0yMCkKCiogICAqKlJlbW92ZWQgY29kZToqKiBgY29sbGFwc2VyYW5nZWAsIGBmb3JtYXR0aW5nYCwgYW5kIGBzaW1wbGUtaGludGAgYWRkb25zLiBgcGxzcWxgIGFuZCBgbXlzcWxgIG1vZGVzICh1c2UgW2BzcWxgXShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9zcWwvaW5kZXguaHRtbCkgbW9kZSkuCiogICAqKk1vdmVkIGNvZGU6KiogdGhlIHJhbmdlLWZpbmRpbmcgZnVuY3Rpb25zIGZvciBmb2xkaW5nIG5vdyBoYXZlIFt0aGVpciBvd24gZmlsZXNdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9hZGRvbi9mb2xkLykuCiogICAqKkNoYW5nZWQgaW50ZXJmYWNlOioqIHRoZSBbYGNvbnRpbnVlY29tbWVudGBdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjYWRkb25fY29udGludWVjb21tZW50KSBhZGRvbiBub3cgZXhwb3NlcyBhbiBvcHRpb24sIHJhdGhlciB0aGFuIGEgY29tbWFuZC4KKiAgIE5ldyBtb2RlczogW1NDU1NdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL2Nzcy9zY3NzLmh0bWwpLCBbVGNsXShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS90Y2wvaW5kZXguaHRtbCksIFtMaXZlU2NyaXB0XShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9saXZlc2NyaXB0L2luZGV4Lmh0bWwpLCBhbmQgW21JUkNdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL21pcmMvaW5kZXguaHRtbCkuCiogICBOZXcgYWRkb25zOiBbYHBsYWNlaG9sZGVyYF0oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RlbW8vcGxhY2Vob2xkZXIuaHRtbCksIFtIVE1MIGNvbXBsZXRpb25dKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kZW1vL2h0bWw1Y29tcGxldGUuaHRtbCkuCiogICBOZXcgbWV0aG9kczogW2BoYXNGb2N1c2BdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjaGFzRm9jdXMpLCBbYGRlZmF1bHRDaGFyV2lkdGhgXShodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL21hbnVhbC5odG1sI2RlZmF1bHRDaGFyV2lkdGgpLgoqICAgTmV3IGV2ZW50czogW2BiZWZvcmVDdXJzb3JFbnRlcmBdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjZXZlbnRfYmVmb3JlQ3Vyc29yRW50ZXIpLCBbYHJlbmRlckxpbmVgXShodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL21hbnVhbC5odG1sI2V2ZW50X3JlbmRlckxpbmUpLgoqICAgTWFueSBpbXByb3ZlbWVudHMgdG8gdGhlIFtgc2hvdy1oaW50YF0oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNhZGRvbl9zaG93LWhpbnQpIGNvbXBsZXRpb24gZGlhbG9nIGFkZG9uLgoqICAgVHdlYWsgYmVoYXZpb3Igb2YgYnktd29yZCBjdXJzb3IgbW90aW9uLgoqICAgRnVydGhlciBpbXByb3ZlbWVudHMgdG8gdGhlIFt2aW0gbW9kZV0oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RlbW8vdmltLmh0bWwpLgoqICAgRnVsbCBbbGlzdCBvZiBwYXRjaGVzXShodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9Db2RlTWlycm9yL2NvbXBhcmUvdjMuMS4uLnYzLjExKS4KCiMjIDMuMDIuMCAoMjAxMy0wMS0yNSkKClNpbmdsZS1idWdmaXggcmVsZWFzZS4gRml4ZXMgYSBwcm9ibGVtIHRoYXQgcHJldmVudHMgQ29kZU1pcnJvciBpbnN0YW5jZXMgZnJvbSBiZWluZyBnYXJiYWdlLWNvbGxlY3RlZCBhZnRlciB0aGV5IGJlY29tZSB1bnVzZWQuCgojIyAzLjAxLjAgKDIwMTMtMDEtMjEpCgoqICAgTW92ZSBhbGwgYWRkLW9ucyBpbnRvIGFuIG9yZ2FuaXplZCBkaXJlY3Rvcnkgc3RydWN0dXJlIHVuZGVyIFtgL2FkZG9uYF0oaHR0cDovL2NvZGVtaXJyb3IubmV0L2FkZG9uLykuICoqWW91IG1pZ2h0IGhhdmUgdG8gYWRqdXN0IHlvdXIgcGF0aHMuKioKKiAgIE5ldyBtb2RlczogW0RdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL2QvaW5kZXguaHRtbCksIFtTYXNzXShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9zYXNzL2luZGV4Lmh0bWwpLCBbQVBMXShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9hcGwvaW5kZXguaHRtbCksIFtTUUxdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL3NxbC9pbmRleC5odG1sKSAoY29uZmlndXJhYmxlKSwgYW5kIFtBc3Rlcmlza10oaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvYXN0ZXJpc2svaW5kZXguaHRtbCkuCiogICBTZXZlcmFsIGJ1Z2ZpeGVzIGluIHJpZ2h0LXRvLWxlZnQgdGV4dCBzdXBwb3J0LgoqICAgQWRkIFtgcnRsTW92ZVZpc3VhbGx5YF0oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNvcHRpb25fcnRsTW92ZVZpc3VhbGx5KSBvcHRpb24uCiogICBJbXByb3ZlbWVudHMgdG8gdmltIGtleW1hcC4KKiAgIEFkZCBidWlsdC1pbiAobGlnaHR3ZWlnaHQpIFtvdmVybGF5IG1vZGVdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjYWRkT3ZlcmxheSkgc3VwcG9ydC4KKiAgIFN1cHBvcnQgYHNob3dJZkhpZGRlbmAgb3B0aW9uIGZvciBbbGluZSB3aWRnZXRzXShodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL21hbnVhbC5odG1sI2FkZExpbmVXaWRnZXQpLgoqICAgQWRkIHNpbXBsZSBbUHl0aG9uIGhpbnRlcl0oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNhZGRvbl9weXRob24taGludCkuCiogICBCcmluZyBiYWNrIHRoZSBbYGZpeGVkR3V0dGVyYF0oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNvcHRpb25fZml4ZWRHdXR0ZXIpIG9wdGlvbi4KKiAgIEZ1bGwgW2xpc3Qgb2YgcGF0Y2hlc10oaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvQ29kZU1pcnJvci9jb21wYXJlL3YzLjAuLi52My4wMSkuCgojIyAzLjEuMCAoMjAxMy0wMi0yMSkKCiogICAqKkluY29tcGF0aWJsZToqKiBrZXkgaGFuZGxlcnMgbWF5IG5vdyBfcmV0dXJuXywgcmF0aGVyIHRoYW4gX3Rocm93XyBgQ29kZU1pcnJvci5QYXNzYCB0byBzaWduYWwgdGhleSBkaWRuJ3QgaGFuZGxlIHRoZSBrZXkuCiogICBNYWtlIGRvY3VtZW50cyBhIFtmaXJzdC1jbGFzcyBjb25zdHJ1Y3RdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjYXBpX2RvYyksIHN1cHBvcnQgc3BsaXQgdmlld3MgYW5kIHN1YnZpZXdzLgoqICAgQWRkIGEgW25ldyBtb2R1bGVdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjYWRkb25fc2hvdy1oaW50KSBmb3Igc2hvd2luZyBjb21wbGV0aW9uIGhpbnRzLiBEZXByZWNhdGUgYHNpbXBsZS1oaW50LmpzYC4KKiAgIEV4dGVuZCBbaHRtbG1peGVkIG1vZGVdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL2h0bWxtaXhlZC9pbmRleC5odG1sKSB0byBhbGxvdyBjdXN0b20gaGFuZGxpbmcgb2Ygc2NyaXB0IHR5cGVzLgoqICAgU3VwcG9ydCBhbiBgaW5zZXJ0TGVmdGAgb3B0aW9uIHRvIFtgc2V0Qm9va21hcmtgXShodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL21hbnVhbC5odG1sI3NldEJvb2ttYXJrKS4KKiAgIEFkZCBhbiBbYGVhY2hMaW5lYF0oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNlYWNoTGluZSkgbWV0aG9kIHRvIGl0ZXJhdGUgb3ZlciBhIGRvY3VtZW50LgoqICAgTmV3IGFkZG9uIG1vZHVsZXM6IFtzZWxlY3Rpb24gbWFya2luZ10oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RlbW8vbWFya3NlbGVjdGlvbi5odG1sKSwgW2xpbnRpbmddKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kZW1vL2xpbnQuaHRtbCksIGFuZCBbYXV0b21hdGljIGJyYWNrZXQgY2xvc2luZ10oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RlbW8vY2xvc2VicmFja2V0cy5odG1sKS4KKiAgIEFkZCBbYCJiZWZvcmVDaGFuZ2UiYF0oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNldmVudF9iZWZvcmVDaGFuZ2UpIGFuZCBbYCJiZWZvcmVTZWxlY3Rpb25DaGFuZ2UiYF0oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNldmVudF9iZWZvcmVTZWxlY3Rpb25DaGFuZ2UpIGV2ZW50cy4KKiAgIEFkZCBbYCJoaWRlImBdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjZXZlbnRfaGlkZSkgYW5kIFtgInVuaGlkZSJgXShodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL21hbnVhbC5odG1sI2V2ZW50X3VuaGlkZSkgZXZlbnRzIHRvIG1hcmtlZCByYW5nZXMuCiogICBGaXggW2Bjb29yZHNDaGFyYF0oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNjb29yZHNDaGFyKSdzIGludGVycHJldGF0aW9uIG9mIGl0cyBhcmd1bWVudCB0byBtYXRjaCB0aGUgZG9jdW1lbnRhdGlvbi4KKiAgIE5ldyBtb2RlczogW1R1cnRsZV0oaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvdHVydGxlL2luZGV4Lmh0bWwpIGFuZCBbUV0oaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvcS9pbmRleC5odG1sKS4KKiAgIEZ1cnRoZXIgaW1wcm92ZW1lbnRzIHRvIHRoZSBbdmltIG1vZGVdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kZW1vL3ZpbS5odG1sKS4KKiAgIEZ1bGwgW2xpc3Qgb2YgcGF0Y2hlc10oaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvQ29kZU1pcnJvci9jb21wYXJlL3YzLjAxLi4udjMuMSkuCgojIyAzLjAuMCAoMjAxMi0xMi0xMCkKCioqTmV3IG1ham9yIHZlcnNpb24qKi4gT25seSBwYXJ0aWFsbHkgYmFja3dhcmRzLWNvbXBhdGlibGUuIFNlZSB0aGUgW3VwZ3JhZGluZyBndWlkZV0oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy91cGdyYWRlX3YzLmh0bWwpIGZvciBtb3JlIGluZm9ybWF0aW9uLiBDaGFuZ2VzIHNpbmNlIHJlbGVhc2UgY2FuZGlkYXRlIDI6CgoqICAgUmV3cml0dGVuIFZJTSBtb2RlLgoqICAgRml4IGEgZmV3IG1pbm9yIHNjcm9sbGluZyBhbmQgc2l6aW5nIGlzc3Vlcy4KKiAgIFdvcmsgYXJvdW5kIFNhZmFyaSBzZWdmYXVsdCB3aGVuIGRyYWdnaW5nLgoqICAgRnVsbCBbbGlzdCBvZiBwYXRjaGVzXShodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9Db2RlTWlycm9yL2NvbXBhcmUvdjMuMHJjMi4uLnYzLjApLgoKIyMgMi4zOC4wICgyMDEzLTAxLTIxKQoKSW50ZWdyYXRlIHNvbWUgYnVnZml4ZXMsIGVuaGFuY2VtZW50cyB0byB0aGUgdmltIGtleW1hcCwgYW5kIG5ldyBtb2RlcyAoW0RdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL2QvaW5kZXguaHRtbCksIFtTYXNzXShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9zYXNzL2luZGV4Lmh0bWwpLCBbQVBMXShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9hcGwvaW5kZXguaHRtbCkpIGZyb20gdGhlIHYzIGJyYW5jaC4KCiMjIDIuMzcuMCAoMjAxMi0xMi0yMCkKCiogICBOZXcgbW9kZTogW1NRTF0oaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvc3FsL2luZGV4Lmh0bWwpICh3aWxsIHJlcGxhY2UgW3Bsc3FsXShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9wbHNxbC9pbmRleC5odG1sKSBhbmQgW215c3FsXShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9teXNxbC9pbmRleC5odG1sKSBtb2RlcykuCiogICBGdXJ0aGVyIHdvcmsgb24gdGhlIG5ldyBWSU0gbW9kZS4KKiAgIEZpeCBDbWQvQ3RybCBrZXlzIG9uIHJlY2VudCBPcGVyYXMgb24gT1MgWC4KKiAgIEZ1bGwgW2xpc3Qgb2YgcGF0Y2hlc10oaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvQ29kZU1pcnJvci9jb21wYXJlL3YyLjM2Li4udjIuMzcpLgoKIyMgMi4zNi4wICgyMDEyLTExLTIwKQoKKiAgIE5ldyBtb2RlOiBbWjgwIGFzc2VtYmx5XShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS96ODAvaW5kZXguaHRtbCkuCiogICBOZXcgdGhlbWU6IFtUd2lsaWdodF0oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RlbW8vdGhlbWUuaHRtbCN0d2lsaWdodCkuCiogICBBZGQgY29tbWFuZC1saW5lIGNvbXByZXNzaW9uIGhlbHBlci4KKiAgIE1ha2UgW2BzY3JvbGxJbnRvVmlld2BdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjc2Nyb2xsSW50b1ZpZXcpIHB1YmxpYy4KKiAgIEFkZCBbYGRlZmF1bHRUZXh0SGVpZ2h0YF0oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNkZWZhdWx0VGV4dEhlaWdodCkgbWV0aG9kLgoqICAgVmFyaW91cyBleHRlbnNpb25zIHRvIHRoZSB2aW0ga2V5bWFwLgoqICAgTWFrZSBbUEhQIG1vZGVdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL3BocC9pbmRleC5odG1sKSBidWlsZCBvbiBbbWl4ZWQgSFRNTCBtb2RlXShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9odG1sbWl4ZWQvaW5kZXguaHRtbCkuCiogICBBZGQgW2NvbW1lbnQtY29udGludWluZ10oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNhZGRvbl9jb250aW51ZWNvbW1lbnQpIGFkZC1vbi4KKiAgIEZ1bGwgW2xpc3Qgb2YgcGF0Y2hlc10oaHR0cDovL2NvZGVtaXJyb3IubmV0L2h0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL0NvZGVNaXJyb3IvY29tcGFyZS92Mi4zNS4uLnYyLjM2KS4KCiMjIDIuMzUuMCAoMjAxMi0xMC0yMikKCiogICBOZXcgKHN1YikgbW9kZTogW1R5cGVTY3JpcHRdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL2phdmFzY3JpcHQvdHlwZXNjcmlwdC5odG1sKS4KKiAgIERvbid0IG92ZXJ3cml0ZSAoaW5zZXJ0IGtleSkgd2hlbiBwYXN0aW5nLgoqICAgRml4IHNldmVyYWwgYnVncyBpbiBbYG1hcmtUZXh0YF0oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNtYXJrVGV4dCkvdW5kbyBpbnRlcmFjdGlvbi4KKiAgIEJldHRlciBpbmRlbnRhdGlvbiBvZiBKYXZhU2NyaXB0IGNvZGUgd2l0aG91dCBzZW1pY29sb25zLgoqICAgQWRkIFtgZGVmaW5lSW5pdEhvb2tgXShodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL21hbnVhbC5odG1sI2RlZmluZUluaXRIb29rKSBmdW5jdGlvbi4KKiAgIEZ1bGwgW2xpc3Qgb2YgcGF0Y2hlc10oaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvQ29kZU1pcnJvci9jb21wYXJlL3YyLjM0Li4udjIuMzUpLgoKIyMgMi4zNC4wICgyMDEyLTA5LTE5KQoKKiAgIE5ldyBtb2RlOiBbQ29tbW9uIExpc3BdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL2NvbW1vbmxpc3AvaW5kZXguaHRtbCkuCiogICBGaXggcmlnaHQtY2xpY2sgc2VsZWN0LWFsbCBvbiBtb3N0IGJyb3dzZXJzLgoqICAgQ2hhbmdlIHRoZSB3YXkgaGlnaGxpZ2h0aW5nIGhhcHBlbnM6CiAgICAgIFNhdmVzIG1lbW9yeSBhbmQgQ1BVIGN5Y2xlcy4KICAgICAgYGNvbXBhcmVTdGF0ZXNgIGlzIG5vIGxvbmdlciBuZWVkZWQuCiAgICAgIGBvbkhpZ2hsaWdodENvbXBsZXRlYCBubyBsb25nZXIgd29ya3MuCiogICBJbnRlZ3JhdGUgbW9kZSAoTWFya2Rvd24sIFhRdWVyeSwgQ1NTLCBzVGV4KSB0ZXN0cyBpbiBjZW50cmFsIHRlc3RzdWl0ZS4KKiAgIEFkZCBhIFtgQ29kZU1pcnJvci52ZXJzaW9uYF0oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCN2ZXJzaW9uKSBwcm9wZXJ0eS4KKiAgIE1vcmUgcm9idXN0IGhhbmRsaW5nIG9mIG5lc3RlZCBtb2RlcyBpbiBbZm9ybWF0dGluZ10oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RlbW8vZm9ybWF0dGluZy5odG1sKSBhbmQgW2Nsb3NldGFnXShodHRwOi8vY29kZW1pcnJvci5uZXQvZGVtby9jbG9zZXRhZy5odG1sKSBwbHVnLWlucy4KKiAgIFVuL3JlZG8gbm93IHByZXNlcnZlcyBbbWFya2VkIHRleHRdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjbWFya1RleHQpIGFuZCBib29rbWFya3MuCiogICBbRnVsbCBsaXN0XShodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9Db2RlTWlycm9yL2NvbXBhcmUvdjIuMzMuLi52Mi4zNCkgb2YgcGF0Y2hlcy4KCiMjIDIuMzMuMCAoMjAxMi0wOC0yMykKCiogICBOZXcgbW9kZTogW1NpZXZlXShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9zaWV2ZS9pbmRleC5odG1sKS4KKiAgIE5ldyBbYGdldFZpZXdQb3J0YF0oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNnZXRWaWV3cG9ydCkgYW5kIFtgb25WaWV3cG9ydENoYW5nZWBdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjb3B0aW9uX29uVmlld3BvcnRDaGFuZ2UpIEFQSS4KKiAgIFtDb25maWd1cmFibGVdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjb3B0aW9uX2N1cnNvckJsaW5rUmF0ZSkgY3Vyc29yIGJsaW5rIHJhdGUuCiogICBNYWtlIGJpbmRpbmcgYSBrZXkgdG8gYGZhbHNlYCBkaXNhYmxpbmcgaGFuZGxpbmcgKGFnYWluKS4KKiAgIFNob3cgbm9uLXByaW50aW5nIGNoYXJhY3RlcnMgYXMgcmVkIGRvdHMuCiogICBNb3JlIHR3ZWFrcyB0byB0aGUgc2Nyb2xsaW5nIG1vZGVsLgoqICAgRXhwYW5kZWQgdGVzdHN1aXRlLiBCYXNpYyBsaW50ZXIgYWRkZWQuCiogICBSZW1vdmUgbW9zdCB1c2VzIG9mIGBpbm5lckhUTUxgLiBSZW1vdmUgYENvZGVNaXJyb3IuaHRtbEVzY2FwZWAuCiogICBbRnVsbCBsaXN0XShodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9Db2RlTWlycm9yL2NvbXBhcmUvdjIuMzIuLi52Mi4zMykgb2YgcGF0Y2hlcy4KCiMjIDIuMzIuMCAoMjAxMi0wNy0yMykKCkVtZXJnZW5jeSBmaXggZm9yIGEgYnVnIHdoZXJlIGFuIGVkaXRvciB3aXRoIGxpbmUgd3JhcHBpbmcgb24gSUUgd2lsbCBicmVhayB3aGVuIHRoZXJlIGlzIF9ub18gc2Nyb2xsYmFyLgoKIyMgMi4zMS4wICgyMDEyLTA3LTIwKQoKKiAgIE5ldyBtb2RlczogW09DYW1sXShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9vY2FtbC9pbmRleC5odG1sKSwgW0hheGVdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL2hheGUvaW5kZXguaHRtbCksIGFuZCBbVkIuTkVUXShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS92Yi9pbmRleC5odG1sKS4KKiAgIFNldmVyYWwgZml4ZXMgdG8gdGhlIG5ldyBzY3JvbGxpbmcgbW9kZWwuCiogICBBZGQgYSBbYHNldFNpemVgXShodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL21hbnVhbC5odG1sI3NldFNpemUpIG1ldGhvZCBmb3IgcHJvZ3JhbW1hdGljIHJlc2l6aW5nLgoqICAgQWRkIFtgZ2V0SGlzdG9yeWBdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjZ2V0SGlzdG9yeSkgYW5kIFtgc2V0SGlzdG9yeWBdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjc2V0SGlzdG9yeSkgbWV0aG9kcy4KKiAgIEFsbG93IGN1c3RvbSBsaW5lIHNlcGFyYXRvciBzdHJpbmcgaW4gW2BnZXRWYWx1ZWBdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjZ2V0VmFsdWUpIGFuZCBbYGdldFJhbmdlYF0oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNnZXRSYW5nZSkuCiogICBTdXBwb3J0IGRvdWJsZS0gYW5kIHRyaXBsZS1jbGljayBkcmFnLCBkb3VibGUtY2xpY2tpbmcgd2hpdGVzcGFjZS4KKiAgIEFuZCBtb3JlLi4uIFsoYWxsIHBhdGNoZXMpXShodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9Db2RlTWlycm9yL2NvbXBhcmUvdjIuMy4uLnYyLjMxKQoKIyMgMi4zMC4wICgyMDEyLTA2LTIyKQoKKiAgICoqTmV3IHNjcm9sbGJhciBpbXBsZW1lbnRhdGlvbioqLiBTaG91bGQgZmxpY2tlciBsZXNzLiBDaGFuZ2VzIERPTSBzdHJ1Y3R1cmUgb2YgdGhlIGVkaXRvci4KKiAgIE5ldyB0aGVtZTogW3ZpYnJhbnQtaW5rXShodHRwOi8vY29kZW1pcnJvci5uZXQvZGVtby90aGVtZS5odG1sI3ZpYnJhbnQtaW5rKS4KKiAgIE1hbnkgZXh0ZW5zaW9ucyB0byB0aGUgVklNIGtleW1hcCAoaW5jbHVkaW5nIHRleHQgb2JqZWN0cykuCiogICBBZGQgW21vZGUtbXVsdGlwbGV4aW5nXShodHRwOi8vY29kZW1pcnJvci5uZXQvZGVtby9tdWx0aXBsZXguaHRtbCkgdXRpbGl0eSBzY3JpcHQuCiogICBGaXggYnVnIHdoZXJlIHJpZ2h0LWNsaWNrIHBhc3RlIHdvcmtzIGluIHJlYWQtb25seSBtb2RlLgoqICAgQWRkIGEgW2BnZXRTY3JvbGxJbmZvYF0oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNnZXRTY3JvbGxJbmZvKSBtZXRob2QuCiogICBMb3RzIG9mIG90aGVyIFtmaXhlc10oaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvQ29kZU1pcnJvci9jb21wYXJlL3YyLjI1Li4udjIuMykuCgojIyAyLjI1LjAgKDIwMTItMDUtMjMpCgoqICAgTmV3IG1vZGU6IFtFcmxhbmddKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL2VybGFuZy9pbmRleC5odG1sKS4KKiAgICoqUmVtb3ZlIHhtbHB1cmUgbW9kZSoqICh1c2UgW3htbC5qc10oaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUveG1sL2luZGV4Lmh0bWwpKS4KKiAgIEZpeCBsaW5lLXdyYXBwaW5nIGluIE9wZXJhLgoqICAgRml4IFggV2luZG93cyBtaWRkbGUtY2xpY2sgcGFzdGUgaW4gQ2hyb21lLgoqICAgRml4IGJ1ZyB0aGF0IGJyb2tlIHBhc3Rpbmcgb2YgaHVnZSBkb2N1bWVudHMuCiogICBGaXggYmFja3NwYWNlIGFuZCB0YWIga2V5IHJlcGVhdCBpbiBPcGVyYS4KCiMjIDIuMjQuMCAoMjAxMi0wNC0yMykKCiogICAqKkRyb3Agc3VwcG9ydCBmb3IgSW50ZXJuZXQgRXhwbG9yZXIgNioqLgoqICAgTmV3IG1vZGVzOiBbU2hlbGxdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL3NoZWxsL2luZGV4Lmh0bWwpLCBbVGlraSB3aWtpXShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS90aWtpL2luZGV4Lmh0bWwpLCBbUGlnIExhdGluXShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9waWcvaW5kZXguaHRtbCkuCiogICBOZXcgdGhlbWVzOiBbQW1iaWFuY2VdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kZW1vL3RoZW1lLmh0bWwjYW1iaWFuY2UpLCBbQmxhY2tib2FyZF0oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RlbW8vdGhlbWUuaHRtbCNibGFja2JvYXJkKS4KKiAgIE1vcmUgY29udHJvbCBvdmVyIGRyYWcvZHJvcCB3aXRoIFtgZHJhZ0Ryb3BgXShodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL21hbnVhbC5odG1sI29wdGlvbl9kcmFnRHJvcCkgYW5kIFtgb25EcmFnRXZlbnRgXShodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL21hbnVhbC5odG1sI29wdGlvbl9vbkRyYWdFdmVudCkgb3B0aW9ucy4KKiAgIE1ha2UgSFRNTCBtb2RlIGEgYml0IGxlc3MgcGVkYW50aWMuCiogICBBZGQgW2Bjb21wb3VuZENoYW5nZWBdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjY29tcG91bmRDaGFuZ2UpIEFQSSBtZXRob2QuCiogICBTZXZlcmFsIGZpeGVzIGluIHVuZG8gaGlzdG9yeSBhbmQgbGluZSBoaWRpbmcuCiogICBSZW1vdmUgKGJyb2tlbikgc3VwcG9ydCBmb3IgYGNhdGNoYWxsYCBpbiBrZXkgbWFwcywgYWRkIGBub2ZhbGx0aHJvdWdoYCBib29sZWFuIGZpZWxkIGluc3RlYWQuCgojIyAyLjIzLjAgKDIwMTItMDMtMjYpCgoqICAgQ2hhbmdlICoqZGVmYXVsdCBiaW5kaW5nIGZvciB0YWIqKi4gU3RhcnRpbmcgaW4gMi4yMywgdGhlc2UgYmluZGluZ3MgYXJlIGRlZmF1bHQ6CiAgICAqICAgVGFiOiBJbnNlcnQgdGFiIGNoYXJhY3RlcgogICAgKiAgIFNoaWZ0LXRhYjogUmVzZXQgbGluZSBpbmRlbnRhdGlvbiB0byBkZWZhdWx0CiAgICAqICAgQ3RybC9DbWQtWzogUmVkdWNlIGxpbmUgaW5kZW50YXRpb24gKG9sZCB0YWIgYmVoYXZpb3VyKQogICAgKiAgIEN0cmwvQ21kLV06IEluY3JlYXNlIGxpbmUgaW5kZW50YXRpb24gKG9sZCBzaGlmdC10YWIgYmVoYXZpb3VyKQoqICAgTmV3IG1vZGVzOiBbWFF1ZXJ5XShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS94cXVlcnkvaW5kZXguaHRtbCkgYW5kIFtWQlNjcmlwdF0oaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvdmJzY3JpcHQvaW5kZXguaHRtbCkuCiogICBUd28gbmV3IHRoZW1lczogW2xlc3Nlci1kYXJrXShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9sZXNzL2luZGV4Lmh0bWwpIGFuZCBbeHEtZGFya10oaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUveHF1ZXJ5L2luZGV4Lmh0bWwpLgoqICAgRGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGJhY2tncm91bmQgYW5kIHRleHQgc3R5bGVzIGluIFtgc2V0TGluZUNsYXNzYF0oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNzZXRMaW5lQ2xhc3MpLgoqICAgRml4IGRyYWctYW5kLWRyb3AgaW4gSUU5Ky4KKiAgIEV4dGVuZCBbYGNoYXJDb29yZHNgXShodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL21hbnVhbC5odG1sI2NoYXJDb29yZHMpIGFuZCBbYGN1cnNvckNvb3Jkc2BdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjY3Vyc29yQ29vcmRzKSB3aXRoIGEgYG1vZGVgIGFyZ3VtZW50LgoqICAgQWRkIFtgYXV0b2ZvY3VzYF0oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNvcHRpb25fYXV0b2ZvY3VzKSBvcHRpb24uCiogICBBZGQgW2BmaW5kTWFya3NBdGBdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjZmluZE1hcmtzQXQpIG1ldGhvZC4KCiMjIDIuMjIuMCAoMjAxMi0wMi0yNykKCiogICBBbGxvdyBba2V5IGhhbmRsZXJzXShodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL21hbnVhbC5odG1sI2tleW1hcHMpIHRvIHBhc3MgdXAgZXZlbnRzLCBhbGxvdyBiaW5kaW5nIGNoYXJhY3RlcnMuCiogICBBZGQgW2BhdXRvQ2xlYXJFbXB0eUxpbmVzYF0oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNvcHRpb25fYXV0b0NsZWFyRW1wdHlMaW5lcykgb3B0aW9uLgoqICAgUHJvcGVybHkgdXNlIHRhYiBzdG9wcyB3aGVuIHJlbmRlcmluZyB0YWJzLgoqICAgTWFrZSBQSFAgbW9kZSBtb3JlIHJvYnVzdC4KKiAgIFN1cHBvcnQgaW5kZW50YXRpb24gYmxvY2tzIGluIFtjb2RlIGZvbGRlcl0oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNhZGRvbl9mb2xkY29kZSkuCiogICBBZGQgYSBzY3JpcHQgZm9yIFtoaWdobGlnaHRpbmcgaW5zdGFuY2VzIG9mIHRoZSBzZWxlY3Rpb25dKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjYWRkb25fbWF0Y2gtaGlnaGxpZ2h0ZXIpLgoqICAgTmV3IFsucHJvcGVydGllc10oaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvcHJvcGVydGllcy9pbmRleC5odG1sKSBtb2RlLgoqICAgRml4IG1hbnkgYnVncy4KCiMjIDIuMjEuMCAoMjAxMi0wMS0yNykKCiogICBBZGRlZCBbTEVTU10oaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvbGVzcy9pbmRleC5odG1sKSwgW015U1FMXShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9teXNxbC9pbmRleC5odG1sKSwgW0dvXShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9nby9pbmRleC5odG1sKSwgYW5kIFtWZXJpbG9nXShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS92ZXJpbG9nL2luZGV4Lmh0bWwpIG1vZGVzLgoqICAgQWRkIFtgc21hcnRJbmRlbnRgXShodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL21hbnVhbC5odG1sI29wdGlvbl9zbWFydEluZGVudCkgb3B0aW9uLgoqICAgU3VwcG9ydCBhIGN1cnNvciBpbiBbYHJlYWRPbmx5YF0oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNvcHRpb25fcmVhZE9ubHkpLW1vZGUuCiogICBTdXBwb3J0IGFzc2lnbmluZyBtdWx0aXBsZSBzdHlsZXMgdG8gYSB0b2tlbi4KKiAgIFVzZSBhIG5ldyBhcHByb2FjaCB0byBkcmF3aW5nIHRoZSBzZWxlY3Rpb24uCiogICBBZGQgW2BzY3JvbGxUb2BdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjc2Nyb2xsVG8pIG1ldGhvZC4KKiAgIEFsbG93IHVuZG8vcmVkbyBldmVudHMgdG8gc3BhbiBub24tYWRqYWNlbnQgbGluZXMuCiogICBMb3RzIGFuZCBsb3RzIG9mIGJ1Z2ZpeGVzLgoKIyMgMi4yMC4wICgyMDExLTEyLTIwKQoKKiAgIFNsaWdodGx5IGluY29tcGF0aWJsZSBBUEkgY2hhbmdlcy4gUmVhZCBbdGhpc10oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy91cGdyYWRlX3YyLjIuaHRtbCkuCiogICBOZXcgYXBwcm9hY2ggdG8gW2JpbmRpbmddKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjb3B0aW9uX2V4dHJhS2V5cykga2V5cywgc3VwcG9ydCBmb3IgW2N1c3RvbSBiaW5kaW5nc10oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNvcHRpb25fa2V5TWFwKS4KKiAgIFN1cHBvcnQgZm9yIG92ZXJ3cml0ZSAoaW5zZXJ0KS4KKiAgIFtDdXN0b20td2lkdGhdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjb3B0aW9uX3RhYlNpemUpIGFuZCBbc3R5bGFibGVdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kZW1vL3Zpc2libGV0YWJzLmh0bWwpIHRhYnMuCiogICBNb3ZlZCBtb3JlIGNvZGUgaW50byBbYWRkLW9uIHNjcmlwdHNdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjYWRkb25zKS4KKiAgIFN1cHBvcnQgZm9yIHNhbmUgdmVydGljYWwgY3Vyc29yIG1vdmVtZW50IGluIHdyYXBwZWQgbGluZXMuCiogICBNb3JlIHJlbGlhYmxlIGhhbmRsaW5nIG9mIGVkaXRpbmcgW21hcmtlZCB0ZXh0XShodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL21hbnVhbC5odG1sI21hcmtUZXh0KS4KKiAgIEFkZCBtaW5pbWFsIFtlbWFjc10oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RlbW8vZW1hY3MuaHRtbCkgYW5kIFt2aW1dKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kZW1vL3ZpbS5odG1sKSBiaW5kaW5ncy4KKiAgIFJlbmFtZSBgY29vcmRzRnJvbUluZGV4YCB0byBbYHBvc0Zyb21JbmRleGBdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjcG9zRnJvbUluZGV4KSwgYWRkIFtgaW5kZXhGcm9tUG9zYF0oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNpbmRleEZyb21Qb3MpIG1ldGhvZC4KCiMjIDIuMTguMCAoMjAxMS0xMS0yMSkKCkZpeGVzIGBUZXh0TWFya2VyLmNsZWFyYCwgd2hpY2ggaXMgYnJva2VuIGluIDIuMTcuCgojIyAyLjE3LjAgKDIwMTEtMTEtMjEpCgoqICAgQWRkIHN1cHBvcnQgZm9yIFtsaW5lIHdyYXBwaW5nXShodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL21hbnVhbC5odG1sI29wdGlvbl9saW5lV3JhcHBpbmcpIGFuZCBbY29kZSBmb2xkaW5nXShodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL21hbnVhbC5odG1sI2hpZGVMaW5lKS4KKiAgIEFkZCBbR2l0aHViLXN0eWxlIE1hcmtkb3duXShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9nZm0vaW5kZXguaHRtbCkgbW9kZS4KKiAgIEFkZCBbTW9ub2thaV0oaHR0cDovL2NvZGVtaXJyb3IubmV0L3RoZW1lL21vbm9rYWkuY3NzKSBhbmQgW1J1YnlibHVlXShodHRwOi8vY29kZW1pcnJvci5uZXQvdGhlbWUvcnVieWJsdWUuY3NzKSB0aGVtZXMuCiogICBBZGQgW2BzZXRCb29rbWFya2BdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjc2V0Qm9va21hcmspIG1ldGhvZC4KKiAgIE1vdmUgc29tZSBvZiB0aGUgZGVtbyBjb2RlIGludG8gcmV1c2FibGUgY29tcG9uZW50cyB1bmRlciBbYGxpYi91dGlsYF0oaHR0cDovL2NvZGVtaXJyb3IubmV0L2FkZG9uLykuCiogICBNYWtlIHNjcmVlbi1jb29yZC1maW5kaW5nIGNvZGUgZmFzdGVyIGFuZCBtb3JlIHJlbGlhYmxlLgoqICAgRml4IGRyYWctYW5kLWRyb3AgaW4gRmlyZWZveC4KKiAgIEltcHJvdmUgc3VwcG9ydCBmb3IgSU1FLgoqICAgU3BlZWQgdXAgY29udGVudCByZW5kZXJpbmcuCiogICBGaXggYnJvd3NlcidzIGJ1aWx0LWluIHNlYXJjaCBpbiBXZWJraXQuCiogICBNYWtlIGRvdWJsZS0gYW5kIHRyaXBsZS1jbGljayB3b3JrIGluIElFLgoqICAgVmFyaW91cyBmaXhlcyB0byBtb2Rlcy4KCiMjIDIuMTYuMCAoMjAxMS0xMC0yNykKCiogICBBZGQgW1BlcmxdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL3BlcmwvaW5kZXguaHRtbCksIFtSdXN0XShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9ydXN0L2luZGV4Lmh0bWwpLCBbVGlkZGx5V2lraV0oaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvdGlkZGx5d2lraS9pbmRleC5odG1sKSwgYW5kIFtHcm9vdnldKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL2dyb292eS9pbmRleC5odG1sKSBtb2Rlcy4KKiAgIERyYWdnaW5nIHRleHQgaW5zaWRlIHRoZSBlZGl0b3Igbm93IG1vdmVzLCByYXRoZXIgdGhhbiBjb3BpZXMuCiogICBBZGQgYSBbYGNvb3Jkc0Zyb21JbmRleGBdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjY29vcmRzRnJvbUluZGV4KSBtZXRob2QuCiogICAqKkFQSSBjaGFuZ2UqKjogYHNldFZhbHVlYCBub3cgbm8gbG9uZ2VyIGNsZWFycyBoaXN0b3J5LiBVc2UgW2BjbGVhckhpc3RvcnlgXShodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL21hbnVhbC5odG1sI2NsZWFySGlzdG9yeSkgZm9yIHRoYXQuCiogICAqKkFQSSBjaGFuZ2UqKjogW2BtYXJrVGV4dGBdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjbWFya1RleHQpIG5vdyByZXR1cm5zIGFuIG9iamVjdCB3aXRoIGBjbGVhcmAgYW5kIGBmaW5kYCBtZXRob2RzLiBNYXJrZWQgdGV4dCBpcyBub3cgbW9yZSByb2J1c3Qgd2hlbiBlZGl0ZWQuCiogICBGaXggZWRpdGluZyBjb2RlIHdpdGggdGFicyBpbiBJbnRlcm5ldCBFeHBsb3Jlci4KCiMjIDIuMTUuMCAoMjAxMS0wOS0yNikKCkZpeCBidWcgdGhhdCBzbnVjayBpbnRvIDIuMTQ6IENsaWNraW5nIHRoZSBjaGFyYWN0ZXIgdGhhdCBjdXJyZW50bHkgaGFzIHRoZSBjdXJzb3IgZGlkbid0IHJlLWZvY3VzIHRoZSBlZGl0b3IuCgojIyAyLjE0LjAgKDIwMTEtMDktMjYpCgoqICAgQWRkIFtDbG9qdXJlXShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9jbG9qdXJlL2luZGV4Lmh0bWwpLCBbUGFzY2FsXShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9wYXNjYWwvaW5kZXguaHRtbCksIFtOVHJpcGxlc10oaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvbnRyaXBsZXMvaW5kZXguaHRtbCksIFtKaW5qYTJdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL2ppbmphMi9pbmRleC5odG1sKSwgYW5kIFtNYXJrZG93bl0oaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvbWFya2Rvd24vaW5kZXguaHRtbCkgbW9kZXMuCiogICBBZGQgW0NvYmFsdF0oaHR0cDovL2NvZGVtaXJyb3IubmV0L3RoZW1lL2NvYmFsdC5jc3MpIGFuZCBbRWNsaXBzZV0oaHR0cDovL2NvZGVtaXJyb3IubmV0L3RoZW1lL2VjbGlwc2UuY3NzKSB0aGVtZXMuCiogICBBZGQgYSBbYGZpeGVkR3V0dGVyYF0oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNvcHRpb25fZml4ZWRHdXR0ZXIpIG9wdGlvbi4KKiAgIEZpeCBidWcgd2l0aCBgc2V0VmFsdWVgIGJyZWFraW5nIGN1cnNvciBtb3ZlbWVudC4KKiAgIE1ha2UgZ3V0dGVyIHVwZGF0ZXMgbXVjaCBtb3JlIGVmZmljaWVudC4KKiAgIEFsbG93IGRyYWdnaW5nIG9mIHRleHQgb3V0IG9mIHRoZSBlZGl0b3IgKG9uIG1vZGVybiBicm93c2VycykuCgojIyAyLjEzLjAgKDIwMTEtMDgtMjMpCgoqICAgQWRkIFtSdWJ5XShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9ydWJ5L2luZGV4Lmh0bWwpLCBbUl0oaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvci9pbmRleC5odG1sKSwgW0NvZmZlZVNjcmlwdF0oaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvY29mZmVlc2NyaXB0L2luZGV4Lmh0bWwpLCBhbmQgW1ZlbG9jaXR5XShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS92ZWxvY2l0eS9pbmRleC5odG1sKSBtb2Rlcy4KKiAgIEFkZCBbYGdldEd1dHRlckVsZW1lbnRgXShodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL21hbnVhbC5odG1sI2dldEd1dHRlckVsZW1lbnQpIHRvIEFQSS4KKiAgIFNldmVyYWwgZml4ZXMgdG8gc2Nyb2xsaW5nIGFuZCBwb3NpdGlvbmluZy4KKiAgIEFkZCBbYHNtYXJ0SG9tZWBdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjb3B0aW9uX3NtYXJ0SG9tZSkgb3B0aW9uLgoqICAgQWRkIGFuIGV4cGVyaW1lbnRhbCBbcHVyZSBYTUxdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL3htbHB1cmUvaW5kZXguaHRtbCkgbW9kZS4KCiMjIDIuMTIuMCAoMjAxMS0wNy0yNSkKCiogICBBZGQgYSBbU1BBUlFMXShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9zcGFycWwvaW5kZXguaHRtbCkgbW9kZS4KKiAgIEZpeCBidWcgd2l0aCBjdXJzb3IganVtcGluZyBhcm91bmQgaW4gYW4gdW5mb2N1c2VkIGVkaXRvciBpbiBJRS4KKiAgIEFsbG93IGtleSBhbmQgbW91c2UgZXZlbnRzIHRvIGJ1YmJsZSBvdXQgb2YgdGhlIGVkaXRvci4gSWdub3JlIHdpZGdldCBjbGlja3MuCiogICBTb2x2ZSBjdXJzb3IgZmxha2luZXNzIGFmdGVyIHVuZG8vcmVkby4KKiAgIEZpeCBibG9jay1yZWluZGVudCBpZ25vcmluZyB0aGUgbGFzdCBmZXcgbGluZXMuCiogICBGaXggcGFyc2luZyBvZiBtdWx0aS1saW5lIGF0dHJzIGluIFhNTCBtb2RlLgoqICAgVXNlIGBpbm5lckhUTUxgIGZvciBIVE1MLWVzY2FwaW5nLgoqICAgU29tZSBmaXhlcyB0byBpbmRlbnRhdGlvbiBpbiBDLWxpa2UgbW9kZS4KKiAgIFNocmluayBob3JpeiBzY3JvbGxiYXJzIHdoZW4gbG9uZyBsaW5lcyByZW1vdmVkLgoqICAgRml4IHdpZHRoIGZlZWRiYWNrIGxvb3AgYnVnIHRoYXQgY2F1c2VkIHRoZSB3aWR0aCBvZiBhbiBpbm5lciBESVYgdG8gc2hyaW5rLgoKIyMgMi4xMS4wICgyMDExLTA3LTA0KQoKKiAgIEFkZCBhIFtTY2hlbWUgbW9kZV0oaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvc2NoZW1lL2luZGV4Lmh0bWwpLgoqICAgQWRkIGEgYHJlcGxhY2VgIG1ldGhvZCB0byBzZWFyY2ggY3Vyc29ycywgZm9yIGN1cnNvci1wcmVzZXJ2aW5nIHJlcGxhY2VtZW50cy4KKiAgIE1ha2UgdGhlIFtDLWxpa2UgbW9kZV0oaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvY2xpa2UvaW5kZXguaHRtbCkgbW9kZSBtb3JlIGN1c3RvbWl6YWJsZS4KKiAgIFVwZGF0ZSBYTUwgbW9kZSB0byBzcG90IG1pc21hdGNoZWQgdGFncy4KKiAgIEFkZCBgZ2V0U3RhdGVBZnRlcmAgQVBJIGFuZCBgY29tcGFyZVN0YXRlYCBtb2RlIEFQSSBtZXRob2RzIGZvciBmaW5lci1ncmFpbmVkIG1vZGUgbWFnaWMuCiogICBBZGQgYSBgZ2V0U2Nyb2xsZXJFbGVtZW50YCBBUEkgbWV0aG9kIHRvIG1hbmlwdWxhdGUgdGhlIHNjcm9sbGluZyBESVYuCiogICBGaXggZHJhZy1hbmQtZHJvcCBmb3IgRmlyZWZveC4KKiAgIEFkZCBhIEMjIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBbQy1saWtlIG1vZGVdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL2NsaWtlL2luZGV4Lmh0bWwpLgoqICAgQWRkIFtmdWxsLXNjcmVlbiBlZGl0aW5nXShodHRwOi8vY29kZW1pcnJvci5uZXQvZGVtby9mdWxsc2NyZWVuLmh0bWwpIGFuZCBbbW9kZS1jaGFuZ2luZ10oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RlbW8vY2hhbmdlbW9kZS5odG1sKSBkZW1vcy4KCiMjIDIuMTAuMCAoMjAxMS0wNi0wNykKCkFkZCBhIFt0aGVtZV0oaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNvcHRpb25fdGhlbWUpIHN5c3RlbSAoW2RlbW9dKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kZW1vL3RoZW1lLmh0bWwpKS4gTm90ZSB0aGF0IHRoaXMgaXMgbm90IGJhY2t3YXJkcy1jb21wYXRpYmxl4oCUeW91J2xsIGhhdmUgdG8gdXBkYXRlIHlvdXIgc3R5bGVzIGFuZCBtb2RlcyEKCiMjIDIuMi4wICgyMDExLTA2LTA3KQoKKiAgIEFkZCBhIFtMdWEgbW9kZV0oaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvbHVhL2luZGV4Lmh0bWwpLgoqICAgRml4IHJldmVyc2Utc2VhcmNoaW5nIGZvciBhIHJlZ2V4cC4KKiAgIEVtcHR5IGxpbmVzIGNhbiBubyBsb25nZXIgYnJlYWsgaGlnaGxpZ2h0aW5nLgoqICAgUmV3b3JrIHNjcm9sbGluZyBtb2RlbCAodGhlIG91dGVyIHdyYXBwZXIgbm8gbG9uZ2VyIGRvZXMgdGhlIHNjcm9sbGluZykuCiogICBTb2x2ZSBob3Jpem9udGFsIGppdHRlcmluZyBvbiBsb25nIGxpbmVzLgoqICAgQWRkIFtydW5tb2RlLmpzXShodHRwOi8vY29kZW1pcnJvci5uZXQvZGVtby9ydW5tb2RlLmh0bWwpLgoqICAgSW1tZWRpYXRlbHkgcmUtaGlnaGxpZ2h0IHRleHQgd2hlbiB0eXBpbmcuCiogICBGaXggcHJvYmxlbSB3aXRoICdzdGlja2luZycgaG9yaXpvbnRhbCBzY3JvbGxiYXIuCgojIyAyLjEuMCAoMjAxMS0wNS0yNikKCiogICBBZGQgYSBbU21hbGx0YWxrIG1vZGVdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL3NtYWxsdGFsay9pbmRleC5odG1sKS4KKiAgIEFkZCBhIFtyZVN0cnVjdHVyZWRUZXh0IG1vZGVdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL3JzdC9pbmRleC5odG1sKS4KKiAgIEFkZCBhIFtQeXRob24gbW9kZV0oaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvcHl0aG9uL2luZGV4Lmh0bWwpLgoqICAgQWRkIGEgW1BML1NRTCBtb2RlXShodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9wbHNxbC9pbmRleC5odG1sKS4KKiAgIGBjb29yZHNDaGFyYCBub3cgd29ya3MKKiAgIEZpeCBhIHByb2JsZW0gd2hlcmUgYG9uQ3Vyc29yQWN0aXZpdHlgIGludGVyZmVyZWQgd2l0aCBgb25DaGFuZ2VgLgoqICAgRml4IGEgbnVtYmVyIG9mIHNjcm9sbGluZyBhbmQgbW91c2UtY2xpY2stcG9zaXRpb24gZ2xpdGNoZXMuCiogICBQYXNzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjaGFuZ2VkIGxpbmVzIHRvIGBvbkNoYW5nZWAuCiogICBTdXBwb3J0IGNtZC11cC9kb3duIG9uIE9TIFguCiogICBBZGQgdHJpcGxlLWNsaWNrIGxpbmUgc2VsZWN0aW9uLgoqICAgRG9uJ3QgaGFuZGxlIHNoaWZ0IHdoZW4gY2hhbmdpbmcgdGhlIHNlbGVjdGlvbiB0aHJvdWdoIHRoZSBBUEkuCiogICBTdXBwb3J0IGAibm9jdXJzb3IiYCBtb2RlIGZvciBgcmVhZE9ubHlgIG9wdGlvbi4KKiAgIEFkZCBhbiBgb25IaWdobGlnaHRDb21wbGV0ZWAgb3B0aW9uLgoqICAgRml4IHRoZSBjb250ZXh0IG1lbnUgZm9yIEZpcmVmb3guCgojIyAyLjAuMCAoMjAxMS0wMy0yOCkKCkNvZGVNaXJyb3IgMiBpcyBhIGNvbXBsZXRlIHJld3JpdGUgdGhhdCdzIGZhc3Rlciwgc21hbGxlciwgc2ltcGxlciB0byB1c2UsIGFuZCBsZXNzIGRlcGVuZGVudCBvbiBicm93c2VyIHF1aXJrcy4gU2VlIFt0aGlzXShodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL2ludGVybmFscy5odG1sKSBhbmQgW3RoaXNdKGh0dHA6Ly9ncm91cHMuZ29vZ2xlLmNvbS9ncm91cC9jb2RlbWlycm9yL2Jyb3dzZV90aHJlYWQvdGhyZWFkLzVhOGU4OTQwMjRhOWY1ODApIGZvciBtb3JlIGluZm9ybWF0aW9uLgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/CONTRIBUTING.md</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[IyBIb3cgdG8gY29udHJpYnV0ZQoKLSBbR2V0dGluZyBoZWxwXSgjZ2V0dGluZy1oZWxwKQotIFtTdWJtaXR0aW5nIGJ1ZyByZXBvcnRzXSgjc3VibWl0dGluZy1idWctcmVwb3J0cykKLSBbQ29udHJpYnV0aW5nIGNvZGVdKCNjb250cmlidXRpbmctY29kZSkKCiMjIEdldHRpbmcgaGVscAoKQ29tbXVuaXR5IGRpc2N1c3Npb24sIHF1ZXN0aW9ucywgYW5kIGluZm9ybWFsIGJ1ZyByZXBvcnRpbmcgaXMgZG9uZSBvbiB0aGUKW2Rpc2N1c3MuQ29kZU1pcnJvciBmb3J1bV0oaHR0cDovL2Rpc2N1c3MuY29kZW1pcnJvci5uZXQpLgoKIyMgU3VibWl0dGluZyBidWcgcmVwb3J0cwoKVGhlIHByZWZlcnJlZCB3YXkgdG8gcmVwb3J0IGJ1Z3MgaXMgdG8gdXNlIHRoZQpbR2l0SHViIGlzc3VlIHRyYWNrZXJdKGh0dHA6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvQ29kZU1pcnJvci9pc3N1ZXMpLiBCZWZvcmUKcmVwb3J0aW5nIGEgYnVnLCByZWFkIHRoZXNlIHBvaW50ZXJzLgoKKipOb3RlOioqIFRoZSBpc3N1ZSB0cmFja2VyIGlzIGZvciAqYnVncyosIG5vdCByZXF1ZXN0cyBmb3IgaGVscC4gUXVlc3Rpb25zCnNob3VsZCBiZSBhc2tlZCBvbiB0aGUKW2Rpc2N1c3MuQ29kZU1pcnJvciBmb3J1bV0oaHR0cDovL2Rpc2N1c3MuY29kZW1pcnJvci5uZXQpIGluc3RlYWQuCgojIyMgUmVwb3J0aW5nIGJ1Z3MgZWZmZWN0aXZlbHkKCi0gQ29kZU1pcnJvciBpcyBtYWludGFpbmVkIGJ5IHZvbHVudGVlcnMuIFRoZXkgZG9uJ3Qgb3dlIHlvdSBhbnl0aGluZywgc28gYmUKICBwb2xpdGUuIFJlcG9ydHMgd2l0aCBhbiBpbmRpZ25hbnQgb3IgYmVsbGlnZXJlbnQgdG9uZSB0ZW5kIHRvIGJlIG1vdmVkIHRvIHRoZQogIGJvdHRvbSBvZiB0aGUgcGlsZS4KCi0gSW5jbHVkZSBpbmZvcm1hdGlvbiBhYm91dCAqKnRoZSBicm93c2VyIGluIHdoaWNoIHRoZSBwcm9ibGVtIG9jY3VycmVkKiouIEV2ZW4KICBpZiB5b3UgdGVzdGVkIHNldmVyYWwgYnJvd3NlcnMsIGFuZCB0aGUgcHJvYmxlbSBvY2N1cnJlZCBpbiBhbGwgb2YgdGhlbSwKICBtZW50aW9uIHRoaXMgZmFjdCBpbiB0aGUgYnVnIHJlcG9ydC4gQWxzbyBpbmNsdWRlIGJyb3dzZXIgdmVyc2lvbiBudW1iZXJzIGFuZAogIHRoZSBvcGVyYXRpbmcgc3lzdGVtIHRoYXQgeW91J3JlIG9uLgoKLSBNZW50aW9uIHdoaWNoIHJlbGVhc2Ugb2YgQ29kZU1pcnJvciB5b3UncmUgdXNpbmcuIFByZWZlcmFibHksIHRyeSBhbHNvIHdpdGgKICB0aGUgY3VycmVudCBkZXZlbG9wbWVudCBzbmFwc2hvdCwgdG8gZW5zdXJlIHRoZSBwcm9ibGVtIGhhcyBub3QgYWxyZWFkeSBiZWVuCiAgZml4ZWQuCgotIE1lbnRpb24gdmVyeSBwcmVjaXNlbHkgd2hhdCB3ZW50IHdyb25nLiAiWCBpcyBicm9rZW4iIGlzIG5vdCBhIGdvb2QgYnVnCiAgcmVwb3J0LiBXaGF0IGRpZCB5b3UgZXhwZWN0IHRvIGhhcHBlbj8gV2hhdCBoYXBwZW5lZCBpbnN0ZWFkPyBEZXNjcmliZSB0aGUKICBleGFjdCBzdGVwcyBhIG1haW50YWluZXIgaGFzIHRvIHRha2UgdG8gbWFrZSB0aGUgcHJvYmxlbSBvY2N1ci4gV2UgY2FuIG5vdAogIGZpeCBzb21ldGhpbmcgdGhhdCB3ZSBjYW4gbm90IG9ic2VydmUuCgotIElmIHRoZSBwcm9ibGVtIGNhbiBub3QgYmUgcmVwcm9kdWNlZCBpbiBhbnkgb2YgdGhlIGRlbW9zIGluY2x1ZGVkIGluIHRoZQogIENvZGVNaXJyb3IgZGlzdHJpYnV0aW9uLCBwbGVhc2UgcHJvdmlkZSBhbiBIVE1MIGRvY3VtZW50IHRoYXQgZGVtb25zdHJhdGVzCiAgdGhlIHByb2JsZW0uIFRoZSBiZXN0IHdheSB0byBkbyB0aGlzIGlzIHRvIGdvIHRvCiAgW2pzYmluLmNvbV0oaHR0cDovL2pzYmluLmNvbS9paHVuaW4vZWRpdCksIGVudGVyIGl0IHRoZXJlLCBwcmVzcyBzYXZlLCBhbmQKICBpbmNsdWRlIHRoZSByZXN1bHRpbmcgbGluayBpbiB5b3VyIGJ1ZyByZXBvcnQuCgojIyBDb250cmlidXRpbmcgY29kZQoKLSBNYWtlIHN1cmUgeW91IGhhdmUgYSBbR2l0SHViIEFjY291bnRdKGh0dHBzOi8vZ2l0aHViLmNvbS9zaWdudXAvZnJlZSkKLSBGb3JrIFtDb2RlTWlycm9yXShodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9Db2RlTWlycm9yLykKICAoW2hvdyB0byBmb3JrIGEgcmVwb10oaHR0cHM6Ly9oZWxwLmdpdGh1Yi5jb20vYXJ0aWNsZXMvZm9yay1hLXJlcG8pKQotIE1ha2UgeW91ciBjaGFuZ2VzCi0gSWYgeW91ciBjaGFuZ2VzIGFyZSBlYXN5IHRvIHRlc3Qgb3IgbGlrZWx5IHRvIHJlZ3Jlc3MsIGFkZCB0ZXN0cy4KICBUZXN0cyBmb3IgdGhlIGNvcmUgZ28gaW50byBgdGVzdC90ZXN0LmpzYCwgc29tZSBtb2RlcyBoYXZlIHRoZWlyIG93bgogIHRlc3Qgc3VpdGUgdW5kZXIgYG1vZGUvWFhYL3Rlc3QuanNgLiBGZWVsIGZyZWUgdG8gYWRkIG5ldyB0ZXN0CiAgc3VpdGVzIHRvIG1vZGVzIHRoYXQgZG9uJ3QgaGF2ZSBvbmUgeWV0IChiZSBzdXJlIHRvIGxpbmsgdGhlIG5ldwogIHRlc3RzIGludG8gYHRlc3QvaW5kZXguaHRtbGApLgotIEZvbGxvdyB0aGUgZ2VuZXJhbCBjb2RlIHN0eWxlIG9mIHRoZSByZXN0IG9mIHRoZSBwcm9qZWN0IChzZWUKICBiZWxvdykuIFJ1biBgYmluL2xpbnRgIHRvIHZlcmlmeSB0aGF0IHRoZSBsaW50ZXIgaXMgaGFwcHkuCi0gTWFrZSBzdXJlIGFsbCB0ZXN0cyBwYXNzLiBWaXNpdCBgdGVzdC9pbmRleC5odG1sYCBpbiB5b3VyIGJyb3dzZXIgdG8KICBydW4gdGhlbS4KLSBTdWJtaXQgYSBwdWxsIHJlcXVlc3QKKFtob3cgdG8gY3JlYXRlIGEgcHVsbCByZXF1ZXN0XShodHRwczovL2hlbHAuZ2l0aHViLmNvbS9hcnRpY2xlcy9mb3JrLWEtcmVwbykpLgogIERvbid0IHB1dCBtb3JlIHRoYW4gb25lIGZlYXR1cmUvZml4IGluIGEgc2luZ2xlIHB1bGwgcmVxdWVzdC4KCkJ5IGNvbnRyaWJ1dGluZyBjb2RlIHRvIENvZGVNaXJyb3IgeW91CgogLSBhZ3JlZSB0byBsaWNlbnNlIHRoZSBjb250cmlidXRlZCBjb2RlIHVuZGVyIENvZGVNaXJyb3IncyBbTUlUCiAgIGxpY2Vuc2VdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFKS4KCiAtIGNvbmZpcm0gdGhhdCB5b3UgaGF2ZSB0aGUgcmlnaHQgdG8gY29udHJpYnV0ZSBhbmQgbGljZW5zZSB0aGUgY29kZQogICBpbiBxdWVzdGlvbi4gKEVpdGhlciB5b3UgaG9sZCBhbGwgcmlnaHRzIG9uIHRoZSBjb2RlLCBvciB0aGUgcmlnaHRzCiAgIGhvbGRlciBoYXMgZXhwbGljaXRseSBncmFudGVkIHRoZSByaWdodCB0byB1c2UgaXQgbGlrZSB0aGlzLAogICB0aHJvdWdoIGEgY29tcGF0aWJsZSBvcGVuIHNvdXJjZSBsaWNlbnNlIG9yIHRocm91Z2ggYSBkaXJlY3QKICAgYWdyZWVtZW50IHdpdGggeW91LikKCiMjIyBDb2Rpbmcgc3RhbmRhcmRzCgotIDIgc3BhY2VzIHBlciBpbmRlbnRhdGlvbiBsZXZlbCwgbm8gdGFicy4KCi0gTm90ZSB0aGF0IHRoZSBsaW50ZXIgKGBiaW4vbGludGApIHdoaWNoIGlzIHJ1biBhZnRlciBlYWNoIGNvbW1pdAogIGNvbXBsYWlucyBhYm91dCB1bnVzZWQgdmFyaWFibGVzIGFuZCBmdW5jdGlvbnMuIFByZWZpeCB0aGVpciBuYW1lcwogIHdpdGggYW4gdW5kZXJzY29yZSB0byBtdWZmbGUgaXQuCgotIENvZGVNaXJyb3IgZG9lcyAqbm90KiBmb2xsb3cgSlNIaW50IG9yIEpTTGludCBwcmVzY3JpYmVkIHN0eWxlLgogIFBhdGNoZXMgdGhhdCB0cnkgdG8gJ2ZpeCcgY29kZSB0byBwYXNzIG9uZSBvZiB0aGVzZSBsaW50ZXJzIHdpbGwgYmUKICB1bmNlcmVtb25pb3VzbHkgZGlzY2FyZGVkLgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/demo/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/demo/activeline.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogQWN0aXZlIExpbmUgRGVtbzwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxzY3JpcHQgc3JjPSIuLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9tb2RlL3htbC94bWwuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vYWRkb24vc2VsZWN0aW9uL2FjdGl2ZS1saW5lLmpzIj48L3NjcmlwdD4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KICAgICAgLkNvZGVNaXJyb3Ige2JvcmRlci10b3A6IDFweCBzb2xpZCBibGFjazsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO30KICAgIDwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGgxPkNvZGVNaXJyb3I8L2gxPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5BY3RpdmUgTGluZTwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+QWN0aXZlIExpbmUgRGVtbzwvaDI+Cjxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+Cjw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cjxyc3MgeG1sbnM6YXRvbT0iaHR0cDovL3d3dy53My5vcmcvMjAwNS9BdG9tIiB2ZXJzaW9uPSIyLjAiCiAgICAgeG1sbnM6Z2VvcnNzPSJodHRwOi8vd3d3Lmdlb3Jzcy5vcmcvZ2VvcnNzIgogICAgIHhtbG5zOnR3aXR0ZXI9Imh0dHA6Ly9hcGkudHdpdHRlci5jb20iPgogIDxjaGFubmVsPgogICAgPHRpdGxlPlR3aXR0ZXIgLyBjb2RlbWlycm9yPC90aXRsZT4KICAgIDxsaW5rPmh0dHA6Ly90d2l0dGVyLmNvbS9jb2RlbWlycm9yPC9saW5rPgogICAgPGF0b206bGluayB0eXBlPSJhcHBsaWNhdGlvbi9yc3MreG1sIgogICAgICAgICAgICAgICBocmVmPSJodHRwOi8vdHdpdHRlci5jb20vc3RhdHVzZXMvdXNlcl90aW1lbGluZS8yNDIyODMyODgucnNzIiByZWw9InNlbGYiLz4KICAgIDxkZXNjcmlwdGlvbj5Ud2l0dGVyIHVwZGF0ZXMgZnJvbSBDb2RlTWlycm9yIC8gY29kZW1pcnJvci48L2Rlc2NyaXB0aW9uPgogICAgPGxhbmd1YWdlPmVuLXVzPC9sYW5ndWFnZT4KICAgIDx0dGw+NDA8L3R0bD4KICA8aXRlbT4KICAgIDx0aXRsZT5jb2RlbWlycm9yOiBodHRwOi8vY2xvdWQtaWRlLmNvbSAmIzgyMTI7IHRoZXkncmUgc3ByaW5naW5nIHVwIGxpa2UgbXVzaHJvb21zLiBUaGlzIG9uZQogICAgICB1c2VzIENvZGVNaXJyb3IgYXMgaXRzIGVkaXRvci48L3RpdGxlPgogICAgPGRlc2NyaXB0aW9uPmNvZGVtaXJyb3I6IGh0dHA6Ly9jbG91ZC1pZGUuY29tICYjODIxMjsgdGhleSdyZSBzcHJpbmdpbmcgdXAgbGlrZSBtdXNocm9vbXMuIFRoaXMKICAgICAgb25lIHVzZXMgQ29kZU1pcnJvciBhcyBpdHMgZWRpdG9yLjwvZGVzY3JpcHRpb24+CiAgICA8cHViRGF0ZT5UaHUsIDE3IE1hciAyMDExIDIzOjM0OjQ3ICswMDAwPC9wdWJEYXRlPgogICAgPGd1aWQ+aHR0cDovL3R3aXR0ZXIuY29tL2NvZGVtaXJyb3Ivc3RhdHVzZXMvNDg1Mjc3MzM3MjIwNTg3NTI8L2d1aWQ+CiAgICA8bGluaz5odHRwOi8vdHdpdHRlci5jb20vY29kZW1pcnJvci9zdGF0dXNlcy80ODUyNzczMzcyMjA1ODc1MjwvbGluaz4KICAgIDx0d2l0dGVyOnNvdXJjZT53ZWI8L3R3aXR0ZXI6c291cmNlPgogICAgPHR3aXR0ZXI6cGxhY2UvPgogIDwvaXRlbT4KICA8aXRlbT4KICAgIDx0aXRsZT5jb2RlbWlycm9yOiBQb3N0ZWQgYSBkZXNjcmlwdGlvbiBvZiB0aGUgQ29kZU1pcnJvciAyIGludGVybmFscyBhdAogICAgICBodHRwOi8vY29kZW1pcnJvci5uZXQvMi9pbnRlcm5hbHMuaHRtbDwvdGl0bGU+CiAgICA8ZGVzY3JpcHRpb24+Y29kZW1pcnJvcjogUG9zdGVkIGEgZGVzY3JpcHRpb24gb2YgdGhlIENvZGVNaXJyb3IgMiBpbnRlcm5hbHMgYXQKICAgICAgaHR0cDovL2NvZGVtaXJyb3IubmV0LzIvaW50ZXJuYWxzLmh0bWw8L2Rlc2NyaXB0aW9uPgogICAgPHB1YkRhdGU+V2VkLCAwMiBNYXIgMjAxMSAxMjoxNTowOSArMDAwMDwvcHViRGF0ZT4KICAgIDxndWlkPmh0dHA6Ly90d2l0dGVyLmNvbS9jb2RlbWlycm9yL3N0YXR1c2VzLzQyOTIwODc5Nzg4Nzg5NzYwPC9ndWlkPgogICAgPGxpbms+aHR0cDovL3R3aXR0ZXIuY29tL2NvZGVtaXJyb3Ivc3RhdHVzZXMvNDI5MjA4Nzk3ODg3ODk3NjA8L2xpbms+CiAgICA8dHdpdHRlcjpzb3VyY2U+d2ViPC90d2l0dGVyOnNvdXJjZT4KICAgIDx0d2l0dGVyOnBsYWNlLz4KICA8L2l0ZW0+CiAgPC9jaGFubmVsPgo8L3Jzcz48L3RleHRhcmVhPjwvZm9ybT4KCiAgICA8c2NyaXB0Pgp2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogIG1vZGU6ICJhcHBsaWNhdGlvbi94bWwiLAogIHN0eWxlQWN0aXZlTGluZTogdHJ1ZSwKICBsaW5lTnVtYmVyczogdHJ1ZSwKICBsaW5lV3JhcHBpbmc6IHRydWUKfSk7Cjwvc2NyaXB0PgoKICAgIDxwPlN0eWxpbmcgdGhlIGN1cnJlbnQgY3Vyc29yIGxpbmUuPC9wPgoKICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/demo/anywordhint.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogQW55IFdvcmQgQ29tcGxldGlvbiBEZW1vPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9hZGRvbi9oaW50L3Nob3ctaGludC5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vYWRkb24vaGludC9zaG93LWhpbnQuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vYWRkb24vaGludC9hbnl3b3JkLWhpbnQuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vbW9kZS9qYXZhc2NyaXB0L2phdmFzY3JpcHQuanMiPjwvc2NyaXB0Pgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxoMT5Db2RlTWlycm9yPC9oMT48aW1nIGlkPWxvZ28gc3JjPSIuLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+QW55IFdvcmQgQ29tcGxldGlvbjwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+QW55IFdvcmQgQ29tcGxldGlvbiBEZW1vPC9oMj4KPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KKGZ1bmN0aW9uKCkgewogICJ1c2Ugc3RyaWN0IjsKCiAgdmFyIFdPUkQgPSAvW1x3JF0rL2csIFJBTkdFID0gNTAwOwoKICBDb2RlTWlycm9yLnJlZ2lzdGVySGVscGVyKCJoaW50IiwgImFueXdvcmQiLCBmdW5jdGlvbihlZGl0b3IsIG9wdGlvbnMpIHsKICAgIHZhciB3b3JkID0gb3B0aW9ucyAmJiBvcHRpb25zLndvcmQgfHwgV09SRDsKICAgIHZhciByYW5nZSA9IG9wdGlvbnMgJiYgb3B0aW9ucy5yYW5nZSB8fCBSQU5HRTsKICAgIHZhciBjdXIgPSBlZGl0b3IuZ2V0Q3Vyc29yKCksIGN1ckxpbmUgPSBlZGl0b3IuZ2V0TGluZShjdXIubGluZSk7CiAgICB2YXIgc3RhcnQgPSBjdXIuY2gsIGVuZCA9IHN0YXJ0OwogICAgd2hpbGUgKGVuZCA8IGN1ckxpbmUubGVuZ3RoICYmIHdvcmQudGVzdChjdXJMaW5lLmNoYXJBdChlbmQpKSkgKytlbmQ7CiAgICB3aGlsZSAoc3RhcnQgJiYgd29yZC50ZXN0KGN1ckxpbmUuY2hhckF0KHN0YXJ0IC0gMSkpKSAtLXN0YXJ0OwogICAgdmFyIGN1cldvcmQgPSBzdGFydCAhPSBlbmQgJiYgY3VyTGluZS5zbGljZShzdGFydCwgZW5kKTsKCiAgICB2YXIgbGlzdCA9IFtdLCBzZWVuID0ge307CiAgICBmdW5jdGlvbiBzY2FuKGRpcikgewogICAgICB2YXIgbGluZSA9IGN1ci5saW5lLCBlbmQgPSBNYXRoLm1pbihNYXRoLm1heChsaW5lICsgZGlyICogcmFuZ2UsIGVkaXRvci5maXJzdExpbmUoKSksIGVkaXRvci5sYXN0TGluZSgpKSArIGRpcjsKICAgICAgZm9yICg7IGxpbmUgIT0gZW5kOyBsaW5lICs9IGRpcikgewogICAgICAgIHZhciB0ZXh0ID0gZWRpdG9yLmdldExpbmUobGluZSksIG07CiAgICAgICAgd29yZC5sYXN0SW5kZXggPSAwOwogICAgICAgIHdoaWxlIChtID0gd29yZC5leGVjKHRleHQpKSB7CiAgICAgICAgICBpZiAoKCFjdXJXb3JkIHx8IG1bMF0uaW5kZXhPZihjdXJXb3JkKSA9PSAwKSAmJiAhc2Vlbi5oYXNPd25Qcm9wZXJ0eShtWzBdKSkgewogICAgICAgICAgICBzZWVuW21bMF1dID0gdHJ1ZTsKICAgICAgICAgICAgbGlzdC5wdXNoKG1bMF0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgc2NhbigtMSk7CiAgICBzY2FuKDEpOwogICAgcmV0dXJuIHtsaXN0OiBsaXN0LCBmcm9tOiBDb2RlTWlycm9yLlBvcyhjdXIubGluZSwgc3RhcnQpLCB0bzogQ29kZU1pcnJvci5Qb3MoY3VyLmxpbmUsIGVuZCl9OwogIH0pOwp9KSgpOwo8L3RleHRhcmVhPjwvZm9ybT4KCjxwPlByZXNzIDxzdHJvbmc+Y3RybC1zcGFjZTwvc3Ryb25nPiB0byBhY3RpdmF0ZSBhdXRvY29tcGxldGlvbi4gVGhlCmNvbXBsZXRpb24gdXNlcwp0aGUgPGEgaHJlZj0iLi4vZG9jL21hbnVhbC5odG1sI2FkZG9uX2FueXdvcmQtaGludCI+YW55d29yZC1oaW50LmpzPC9hPgptb2R1bGUsIHdoaWNoIHNpbXBseSBsb29rcyBhdCBuZWFyYnkgd29yZHMgaW4gdGhlIGJ1ZmZlciBhbmQgY29tcGxldGVzCnRvIHRob3NlLjwvcD4KCiAgICA8c2NyaXB0PgogICAgICBDb2RlTWlycm9yLmNvbW1hbmRzLmF1dG9jb21wbGV0ZSA9IGZ1bmN0aW9uKGNtKSB7CiAgICAgICAgY20uc2hvd0hpbnQoe2hpbnQ6IENvZGVNaXJyb3IuaGludC5hbnl3b3JkfSk7CiAgICAgIH0KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgICAgICBleHRyYUtleXM6IHsiQ3RybC1TcGFjZSI6ICJhdXRvY29tcGxldGUifQogICAgICB9KTsKICAgIDwvc2NyaXB0PgogIDwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/demo/bidi.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogQmktZGlyZWN0aW9uYWwgVGV4dCBEZW1vPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL21vZGUveG1sL3htbC5qcyI+PC9zY3JpcHQ+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICAgIC5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazt9CiAgICA8L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxoMT5Db2RlTWlycm9yPC9oMT48aW1nIGlkPWxvZ28gc3JjPSIuLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+QmktZGlyZWN0aW9uYWwgVGV4dDwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+QmktZGlyZWN0aW9uYWwgVGV4dCBEZW1vPC9oMj4KPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj48IS0tIFBpZWNlIG9mIHRoZSBDb2RlTWlycm9yIG1hbnVhbCwgJ3RyYW5zbGF0ZWQnIGludG8gQXJhYmljIGJ5CiAgICAgR29vZ2xlIFRyYW5zbGF0ZSAtLT4KCjxkbD4KICA8ZHQgaWQ9b3B0aW9uX3ZhbHVlPjxjb2RlPnZhbHVlIChzdHJpbmcgb3IgRG9jKTwvY29kZT48L2R0PgogIDxkZD7ZgtmK2YXYqSDYp9mE2KjYr9in2YrYqSDYp9mE2YXYrdix2LEuINmK2YXZg9mGINij2YYg2KrZg9mI2YYg2LPZhNiz2YTYqdiMINij2YguINmD2KfYptmGINmF2LPYqtmG2K8uPC9kZD4KICA8ZHQgaWQ9b3B0aW9uX21vZGU+PGNvZGU+bW9kZSAoc3RyaW5nIG9yIG9iamVjdCk8L2NvZGU+PC9kdD4KICA8ZGQ+2YjYtti5INin2YTYp9iz2KrYrtiv2KfZhS4g2LnZhtiv2YXYpyDZhNinINiq2LnYt9mJ2Iwg2YjZh9iw2Kcg2KfZhNin2YHYqtix2KfYttmKINil2YTZiSDYp9mE2LfYsdmK2YLYqSDYp9mE2KfZiNmE2YkKICDYp9mE2KrZiiDYqtmFINiq2K3ZhdmK2YTZh9inLiDZgtivINmK2YPZiNmGINmF2YYg2LPZhNiz2YTYqdiMINmI2KfZhNiq2Yog2KXZhdinINij2LPZhdin2KEg2KPZiCDYqNio2LPYp9i32Kkg2YfZiCDZiNi22LkKICBNSU1FINmG2YjYuSDYp9mE2YXYsdiq2KjYt9ipINin2LPYt9ipLiDYqNiv2YTYpyDZhdmGINiw2YTZg9iMINmC2K8g2YrZg9mI2YYg2YXZhiDZg9in2KbZhiDZitit2KrZiNmKINi52YTZiQogINiu2YrYp9ix2KfYqiDYp9mE2KrZg9mI2YrZhiDZhNmI2KfYs9i32KnYjCDZhdi5IDxjb2RlPm5hbWU8L2NvZGU+INin2YTYrtin2LXZitipINin2YTYqtmKINmI2LbYuSDYo9iz2YXYp9ihCiAgKNi52YTZiSDYs9io2YrZhCDYp9mE2YXYq9in2YQgPGNvZGU+e25hbWU6ICJqYXZhc2NyaXB0IiwganNvbjogdHJ1ZX08L2NvZGU+KS4KICDYtdmB2K3Yp9iqINin2YTYqtis2LHZitio2Yog2YTZg9mEINmI2LbYuSDYqtit2KrZiNmKINi52YTZiSDZhdi52YTZiNmF2KfYqiDYrdmI2YQg2YXYpyDZhdi52YTZhdin2Kog2KrZg9mI2YrZhiDZiNi22LkKICDZitiv2LnZhdmH2KcuINmK2YXZg9mG2YMg2KPZhiDYqti32YTYqCBDb2RlTWlycm9yINin2YTYqtmKINiq2YUg2KrYudix2YrZgdmH2Kcg2LfYsdmCINmI2KPZhtmI2KfYuSBNSU1FCiAg2KfZhNmD2LTZgSDYudmE2YkgPGNvZGU+Q29kZU1pcnJvci5tb2RlczwvY29kZT4KICDZiCA8Y29kZT5Db2RlTWlycm9yLm1pbWVNb2RlczwvY29kZT4g2KfZhNmD2KfYptmG2KfYqi4g2YjYtti5INiu2LHYp9im2Lcg2KfZhNij2LPZhdin2KEKICDYp9mE2KPZiNmE2Ykg2YTZhdmG2LTYptin2Kog2KfZhNiu2KfYtdipINio2YfZhdiMINmI2K7Ysdin2KbYtyDZhNij2YbZiNin2LkgTUlNRSAyINin2YTZhdmI2KfYtdmB2KfYqgogINmI2KfYs9i32KkuPC9kZD4KICA8ZHQgaWQ9b3B0aW9uX3RoZW1lPjxjb2RlPnRoZW1lIChzdHJpbmcpPC9jb2RlPjwvZHQ+CiAgPGRkPtmF2YjYttmI2Lkg2YTZhtmF2Lcg2KfZhNmF2K3YsdixINmF2LkuINmK2KzYqCDYudmE2YrZgyDYp9mE2KrYo9mD2K8g2YXZhiDYp9mE2YXZhNmBIENTUyDYqtit2K/ZitivCiAg2KfZhNmF2YLYp9io2YTYqSA8Y29kZT4uY20tcy1bbmFtZV08L2NvZGU+INmK2KrZhSDYqtit2YXZitmEINij2YbZhdin2LcgKNin2YbYuNixCiAgPGEgaHJlZj0iLi4vdGhlbWUvIj48Y29kZT50aGVtZTwvY29kZT48L2E+INin2YTYr9mE2YrZhCDZgdmKINin2YTYqtmI2LLZiti5KS4KICDYp9mE2KfZgdiq2LHYp9i22Yog2YfZiCA8Y29kZT4iZGVmYXVsdCI8L2NvZGU+INiMINmI2KfZhNiq2Yog2KrZhSDYqti22YXZitmG2YfYpyDZgdmKCiAg2KfZhNij2YTZiNin2YYgPGNvZGU+Y29kZW1pcnJvci5jc3M8L2NvZGU+LiDZgdmF2YYg2KfZhNmF2YXZg9mGINin2LPYqtiu2K/Yp9mFINmB2KbYp9iqINmF2KrYudiv2K/YqQogINmB2Yog2KrYt9io2YrZgiDYp9mE2LPZhdin2Kog2YXYsdipINmI2KfYrdiv2Kkg2LnZhNmJINiz2KjZitmEINin2YTZhdir2KfZhCA8Y29kZT4iZm9vIGJhciI8L2NvZGU+CiAg2LPZitiq2YUg2KrYudmK2YrZhiDZg9mEINmF2YYgPGNvZGU+Y20tcy1mb288L2NvZGU+INmIIDxjb2RlPmNtLXMtYmFyPC9jb2RlPgogINin2YTYt9io2YLYp9iqINil2YTZiSDYp9mE2YXYrdix2LEuPC9kZD4KPC9kbD4KPC90ZXh0YXJlYT48L2Zvcm0+CgogICAgPHNjcmlwdD4KdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICBtb2RlOiAidGV4dC9odG1sIiwKICBsaW5lTnVtYmVyczogdHJ1ZQp9KTsKPC9zY3JpcHQ+CgogIDxwPkRlbW9uc3RyYXRpb24gb2YgYmktZGlyZWN0aW9uYWwgdGV4dCBzdXBwb3J0LiBTZWUKICB0aGUgPGEgaHJlZj0iaHR0cDovL21hcmlqbmhhdmVyYmVrZS5ubC9ibG9nL2N1cnNvci1pbi1iaWRpLXRleHQuaHRtbCI+cmVsYXRlZAogIGJsb2cgcG9zdDwvYT4gZm9yIG1vcmUgYmFja2dyb3VuZC48L3A+CgogIDxwPjxzdHJvbmc+Tm90ZTo8L3N0cm9uZz4gVGhlcmUgaXMKICBhIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL0NvZGVNaXJyb3IvaXNzdWVzLzE3NTciPmtub3duCiAgYnVnPC9hPiB3aXRoIGN1cnNvciBtb3Rpb24gYW5kIG1vdXNlIGNsaWNrcyBpbiBiaS1kaXJlY3Rpb25hbCBsaW5lcwogIHRoYXQgYXJlIGxpbmUgd3JhcHBlZC48L3A+Cgo8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/demo/btree.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[77u/PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogQi1UcmVlIHZpc3VhbGl6YXRpb248L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgogICAgICAubGluZWJsb2NrIHsgZGlzcGxheTogaW5saW5lLWJsb2NrOyBtYXJnaW46IDFweDsgaGVpZ2h0OiA1cHg7IH0KICAgICAgLkNvZGVNaXJyb3Ige2JvcmRlcjogMXB4IHNvbGlkICNhYWE7IGhlaWdodDogNDAwcHh9CiAgICA8L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxoMT5Db2RlTWlycm9yPC9oMT48aW1nIGlkPWxvZ28gc3JjPSIuLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+Qi1UcmVlIHZpc3VhbGl6YXRpb248L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPkItVHJlZSB2aXN1YWxpemF0aW9uPC9oMj4KPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj50eXBlIGhlcmUsIHNlZSBhIHN1bW1hcnkgb2YgdGhlIGRvY3VtZW50IGItdHJlZSBiZWxvdzwvdGV4dGFyZWE+PC9mb3JtPgogICAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IGhlaWdodDogNDAycHg7IG92ZXJmbG93LXk6IGF1dG8iIGlkPSJvdXRwdXQiPjwvZGl2PgoKICAgIDxzY3JpcHQgaWQ9Im1lIj4KdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICBsaW5lTnVtYmVyczogdHJ1ZSwKICBsaW5lV3JhcHBpbmc6IHRydWUKfSk7CnZhciB1cGRhdGVUaW1lb3V0OwplZGl0b3Iub24oImNoYW5nZSIsIGZ1bmN0aW9uKGNtKSB7CiAgY2xlYXJUaW1lb3V0KHVwZGF0ZVRpbWVvdXQpOwogIHVwZGF0ZVRpbWVvdXQgPSBzZXRUaW1lb3V0KHVwZGF0ZVZpc3VhbCwgMjAwKTsKfSk7CnVwZGF0ZVZpc3VhbCgpOwoKZnVuY3Rpb24gdXBkYXRlVmlzdWFsKCkgewogIHZhciBvdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgib3V0cHV0Iik7CiAgb3V0LmlubmVySFRNTCA9ICIiOwoKICBmdW5jdGlvbiBkcmF3VHJlZShvdXQsIG5vZGUpIHsKICAgIGlmIChub2RlLmxpbmVzKSB7CiAgICAgIG91dC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSkuaW5uZXJIVE1MID0KICAgICAgICAiPGI+bGVhZjwvYj46ICIgKyBub2RlLmxpbmVzLmxlbmd0aCArICIgbGluZXMsICIgKyBNYXRoLnJvdW5kKG5vZGUuaGVpZ2h0KSArICIgcHgiOwogICAgICB2YXIgbGluZXMgPSBvdXQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikpOwogICAgICBsaW5lcy5zdHlsZS5saW5lSGVpZ2h0ID0gIjZweCI7IGxpbmVzLnN0eWxlLm1hcmdpbkxlZnQgPSAiMTBweCI7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZS5saW5lcy5sZW5ndGg7ICsraSkgewogICAgICAgIHZhciBsaW5lID0gbm9kZS5saW5lc1tpXSwgbGluZUVsdCA9IGxpbmVzLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpKTsKICAgICAgICBsaW5lRWx0LmNsYXNzTmFtZSA9ICJsaW5lYmxvY2siOwogICAgICAgIHZhciBncmF5ID0gTWF0aC5taW4obGluZS50ZXh0Lmxlbmd0aCAqIDMsIDIzMCksIGNvbCA9IGdyYXkudG9TdHJpbmcoMTYpOwogICAgICAgIGlmIChjb2wubGVuZ3RoID09IDEpIGNvbCA9ICIwIiArIGNvbDsKICAgICAgICBsaW5lRWx0LnN0eWxlLmJhY2tncm91bmQgPSAiIyIgKyBjb2wgKyBjb2wgKyBjb2w7CiAgICAgICAgbGluZUVsdC5zdHlsZS53aWR0aCA9IE1hdGgubWF4KE1hdGgucm91bmQobGluZS5oZWlnaHQgLyAzKSwgMSkgKyAicHgiOwogICAgICB9CiAgICB9IGVsc2UgewogICAgICBvdXQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikpLmlubmVySFRNTCA9CiAgICAgICAgIjxiPm5vZGU8L2I+OiAiICsgbm9kZS5zaXplICsgIiBsaW5lcywgIiArIE1hdGgucm91bmQobm9kZS5oZWlnaHQpICsgIiBweCI7CiAgICAgIHZhciBzdWIgPSBvdXQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikpOwogICAgICBzdWIuc3R5bGUucGFkZGluZ0xlZnQgPSAiMjBweCI7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZS5jaGlsZHJlbi5sZW5ndGg7ICsraSkKICAgICAgICBkcmF3VHJlZShzdWIsIG5vZGUuY2hpbGRyZW5baV0pOwogICAgfQogIH0KICBkcmF3VHJlZShvdXQsIGVkaXRvci5nZXREb2MoKSk7Cn0KCmZ1bmN0aW9uIGZpbGxFZGl0b3IoKSB7CiAgdmFyIHNjID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm1lIik7CiAgdmFyIGRvYyA9IChzYy50ZXh0Q29udGVudCB8fCBzYy5pbm5lclRleHQgfHwgc2MuaW5uZXJIVE1MKS5yZXBsYWNlKC9eXHMqLywgIiIpICsgIlxuIjsKICBkb2MgKz0gZG9jOyBkb2MgKz0gZG9jOyBkb2MgKz0gZG9jOyBkb2MgKz0gZG9jOyBkb2MgKz0gZG9jOyBkb2MgKz0gZG9jOwogIGVkaXRvci5zZXRWYWx1ZShkb2MpOwp9CiAgICA8L3NjcmlwdD4KCjxwPjxidXR0b24gb25jbGljaz0iZmlsbEVkaXRvcigpIj5BZGQgYSBsb3Qgb2YgY29udGVudDwvYnV0dG9uPjwvcD4KCiAgPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/demo/buffers.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogTXVsdGlwbGUgQnVmZmVyICYgU3BsaXQgVmlldyBEZW1vPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL21vZGUvamF2YXNjcmlwdC9qYXZhc2NyaXB0LmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL21vZGUvY3NzL2Nzcy5qcyI+PC9zY3JpcHQ+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyIgaWQ9c3R5bGU+CiAgICAgIC5Db2RlTWlycm9yIHtib3JkZXI6IDFweCBzb2xpZCBibGFjazsgaGVpZ2h0OiAyNTBweDt9CiAgICA8L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxoMT5Db2RlTWlycm9yPC9oMT48aW1nIGlkPWxvZ28gc3JjPSIuLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+TXVsdGlwbGUgQnVmZmVyICYgU3BsaXQgVmlldzwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+TXVsdGlwbGUgQnVmZmVyICYgU3BsaXQgVmlldyBEZW1vPC9oMj4KCgogICAgPGRpdiBpZD1jb2RlX3RvcD48L2Rpdj4KICAgIDxkaXY+CiAgICAgIFNlbGVjdCBidWZmZXI6IDxzZWxlY3QgaWQ9YnVmZmVyc190b3A+PC9zZWxlY3Q+CiAgICAgICZuYnNwOyAmbmJzcDsgPGJ1dHRvbiBvbmNsaWNrPSJuZXdCdWYoJ3RvcCcpIj5OZXcgYnVmZmVyPC9idXR0b24+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9Y29kZV9ib3Q+PC9kaXY+CiAgICA8ZGl2PgogICAgICBTZWxlY3QgYnVmZmVyOiA8c2VsZWN0IGlkPWJ1ZmZlcnNfYm90Pjwvc2VsZWN0PgogICAgICAmbmJzcDsgJm5ic3A7IDxidXR0b24gb25jbGljaz0ibmV3QnVmKCdib3QnKSI+TmV3IGJ1ZmZlcjwvYnV0dG9uPgogICAgPC9kaXY+CgogICAgPHNjcmlwdCBpZD1zY3JpcHQ+CnZhciBzZWxfdG9wID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImJ1ZmZlcnNfdG9wIik7CkNvZGVNaXJyb3Iub24oc2VsX3RvcCwgImNoYW5nZSIsIGZ1bmN0aW9uKCkgewogIHNlbGVjdEJ1ZmZlcihlZF90b3AsIHNlbF90b3Aub3B0aW9uc1tzZWxfdG9wLnNlbGVjdGVkSW5kZXhdLnZhbHVlKTsKfSk7Cgp2YXIgc2VsX2JvdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJidWZmZXJzX2JvdCIpOwpDb2RlTWlycm9yLm9uKHNlbF9ib3QsICJjaGFuZ2UiLCBmdW5jdGlvbigpIHsKICBzZWxlY3RCdWZmZXIoZWRfYm90LCBzZWxfYm90Lm9wdGlvbnNbc2VsX2JvdC5zZWxlY3RlZEluZGV4XS52YWx1ZSk7Cn0pOwoKdmFyIGJ1ZmZlcnMgPSB7fTsKCmZ1bmN0aW9uIG9wZW5CdWZmZXIobmFtZSwgdGV4dCwgbW9kZSkgewogIGJ1ZmZlcnNbbmFtZV0gPSBDb2RlTWlycm9yLkRvYyh0ZXh0LCBtb2RlKTsKICB2YXIgb3B0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgib3B0aW9uIik7CiAgb3B0LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKG5hbWUpKTsKICBzZWxfdG9wLmFwcGVuZENoaWxkKG9wdCk7CiAgc2VsX2JvdC5hcHBlbmRDaGlsZChvcHQuY2xvbmVOb2RlKHRydWUpKTsKfQoKZnVuY3Rpb24gbmV3QnVmKHdoZXJlKSB7CiAgdmFyIG5hbWUgPSBwcm9tcHQoIk5hbWUgZm9yIHRoZSBidWZmZXIiLCAiKnNjcmF0Y2gqIik7CiAgaWYgKG5hbWUgPT0gbnVsbCkgcmV0dXJuOwogIGlmIChidWZmZXJzLmhhc093blByb3BlcnR5KG5hbWUpKSB7CiAgICBhbGVydCgiVGhlcmUncyBhbHJlYWR5IGEgYnVmZmVyIGJ5IHRoYXQgbmFtZS4iKTsKICAgIHJldHVybjsKICB9CiAgb3BlbkJ1ZmZlcihuYW1lLCAiIiwgImphdmFzY3JpcHQiKTsKICBzZWxlY3RCdWZmZXIod2hlcmUgPT0gInRvcCIgPyBlZF90b3AgOiBlZF9ib3QsIG5hbWUpOwogIHZhciBzZWwgPSB3aGVyZSA9PSAidG9wIiA/IHNlbF90b3AgOiBzZWxfYm90OwogIHNlbC52YWx1ZSA9IG5hbWU7Cn0KCmZ1bmN0aW9uIHNlbGVjdEJ1ZmZlcihlZGl0b3IsIG5hbWUpIHsKICB2YXIgYnVmID0gYnVmZmVyc1tuYW1lXTsKICBpZiAoYnVmLmdldEVkaXRvcigpKSBidWYgPSBidWYubGlua2VkRG9jKHtzaGFyZWRIaXN0OiB0cnVlfSk7CiAgdmFyIG9sZCA9IGVkaXRvci5zd2FwRG9jKGJ1Zik7CiAgdmFyIGxpbmtlZCA9IG9sZC5pdGVyTGlua2VkRG9jcyhmdW5jdGlvbihkb2MpIHtsaW5rZWQgPSBkb2M7fSk7CiAgaWYgKGxpbmtlZCkgewogICAgLy8gTWFrZSBzdXJlIHRoZSBkb2N1bWVudCBpbiBidWZmZXJzIGlzIHRoZSBvbmUgdGhlIG90aGVyIHZpZXcgaXMgbG9va2luZyBhdAogICAgZm9yICh2YXIgbmFtZSBpbiBidWZmZXJzKSBpZiAoYnVmZmVyc1tuYW1lXSA9PSBvbGQpIGJ1ZmZlcnNbbmFtZV0gPSBsaW5rZWQ7CiAgICBvbGQudW5saW5rRG9jKGxpbmtlZCk7CiAgfQogIGVkaXRvci5mb2N1cygpOwp9CgpmdW5jdGlvbiBub2RlQ29udGVudChpZCkgewogIHZhciBub2RlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoaWQpLCB2YWwgPSBub2RlLnRleHRDb250ZW50IHx8IG5vZGUuaW5uZXJUZXh0OwogIHZhbCA9IHZhbC5zbGljZSh2YWwubWF0Y2goL15ccyovKVswXS5sZW5ndGgsIHZhbC5sZW5ndGggLSB2YWwubWF0Y2goL1xzKiQvKVswXS5sZW5ndGgpICsgIlxuIjsKICByZXR1cm4gdmFsOwp9Cm9wZW5CdWZmZXIoImpzIiwgbm9kZUNvbnRlbnQoInNjcmlwdCIpLCAiamF2YXNjcmlwdCIpOwpvcGVuQnVmZmVyKCJjc3MiLCBub2RlQ29udGVudCgic3R5bGUiKSwgImNzcyIpOwoKdmFyIGVkX3RvcCA9IENvZGVNaXJyb3IoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGVfdG9wIiksIHtsaW5lTnVtYmVyczogdHJ1ZX0pOwpzZWxlY3RCdWZmZXIoZWRfdG9wLCAianMiKTsKdmFyIGVkX2JvdCA9IENvZGVNaXJyb3IoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGVfYm90IiksIHtsaW5lTnVtYmVyczogdHJ1ZX0pOwpzZWxlY3RCdWZmZXIoZWRfYm90LCAianMiKTsKPC9zY3JpcHQ+CgogICAgPHA+RGVtb25zdHJhdGlvbiBvZgogICAgdXNpbmcgPGEgaHJlZj0iLi4vZG9jL21hbnVhbC5odG1sI2xpbmtlZERvYyI+bGlua2VkIGRvY3VtZW50czwvYT4KICAgIHRvIHByb3ZpZGUgYSBzcGxpdCB2aWV3IG9uIGEgZG9jdW1lbnQsIGFuZAogICAgdXNpbmcgPGEgaHJlZj0iLi4vZG9jL21hbnVhbC5odG1sI3N3YXBEb2MiPjxjb2RlPnN3YXBEb2M8L2NvZGU+PC9hPgogICAgdG8gdXNlIGEgc2luZ2xlIGVkaXRvciB0byBkaXNwbGF5IG11bHRpcGxlIGRvY3VtZW50cy48L3A+CgogIDwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/demo/changemode.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogTW9kZS1DaGFuZ2luZyBEZW1vPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL21vZGUvamF2YXNjcmlwdC9qYXZhc2NyaXB0LmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL21vZGUvc2NoZW1lL3NjaGVtZS5qcyI+PC9zY3JpcHQ+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICAgIC5Db2RlTWlycm9yIHtib3JkZXI6IDFweCBzb2xpZCBibGFjazt9CiAgICA8L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxoMT5Db2RlTWlycm9yPC9oMT48aW1nIGlkPWxvZ28gc3JjPSIuLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+TW9kZS1DaGFuZ2luZzwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+TW9kZS1DaGFuZ2luZyBEZW1vPC9oMj4KPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KOzsgSWYgdGhlcmUgaXMgU2NoZW1lIGNvZGUgaW4gaGVyZSwgdGhlIGVkaXRvciB3aWxsIGJlIGluIFNjaGVtZSBtb2RlLgo7OyBJZiB5b3UgcHV0IGluIEpTIGluc3RlYWQsIGl0J2xsIHN3aXRjaCB0byBKUyBtb2RlLgoKKGRlZmluZSAoZG91YmxlIHgpCiAgKCogeCB4KSkKPC90ZXh0YXJlYT48L2Zvcm0+Cgo8cD5PbiBjaGFuZ2VzIHRvIHRoZSBjb250ZW50IG9mIHRoZSBhYm92ZSBlZGl0b3IsIGEgKGNydWRlKSBzY3JpcHQKdHJpZXMgdG8gYXV0by1kZXRlY3QgdGhlIGxhbmd1YWdlIHVzZWQsIGFuZCBzd2l0Y2hlcyB0aGUgZWRpdG9yIHRvCmVpdGhlciBKYXZhU2NyaXB0IG9yIFNjaGVtZSBtb2RlIGJhc2VkIG9uIHRoYXQuPC9wPgoKPHNjcmlwdD4KICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgbW9kZTogInNjaGVtZSIsCiAgICBsaW5lTnVtYmVyczogdHJ1ZQogIH0pOwogIHZhciBwZW5kaW5nOwogIGVkaXRvci5vbigiY2hhbmdlIiwgZnVuY3Rpb24oKSB7CiAgICBjbGVhclRpbWVvdXQocGVuZGluZyk7CiAgICBwZW5kaW5nID0gc2V0VGltZW91dCh1cGRhdGUsIDQwMCk7CiAgfSk7CiAgZnVuY3Rpb24gbG9va3NMaWtlU2NoZW1lKGNvZGUpIHsKICAgIHJldHVybiAhL15ccypcKFxzKmZ1bmN0aW9uXGIvLnRlc3QoY29kZSkgJiYgL15ccypbO1woXS8udGVzdChjb2RlKTsKICB9CiAgZnVuY3Rpb24gdXBkYXRlKCkgewogICAgZWRpdG9yLnNldE9wdGlvbigibW9kZSIsIGxvb2tzTGlrZVNjaGVtZShlZGl0b3IuZ2V0VmFsdWUoKSkgPyAic2NoZW1lIiA6ICJqYXZhc2NyaXB0Iik7CiAgfQo8L3NjcmlwdD4KICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/demo/closebrackets.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogQ2xvc2VicmFja2V0cyBEZW1vPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL2FkZG9uL2VkaXQvY2xvc2VicmFja2V0cy5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9tb2RlL2phdmFzY3JpcHQvamF2YXNjcmlwdC5qcyI+PC9zY3JpcHQ+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICAgIC5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgIzg4ODsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICM4ODg7fQogICAgPC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aDE+Q29kZU1pcnJvcjwvaDE+PGltZyBpZD1sb2dvIHNyYz0iLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPkNsb3NlYnJhY2tldHM8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPkNsb3NlYnJhY2tldHMgRGVtbzwvaDI+Cjxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+ZnVuY3Rpb24gR3JpZCh3aWR0aCwgaGVpZ2h0KSB7CiAgdGhpcy53aWR0aCA9IHdpZHRoOwogIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0OwogIHRoaXMuY2VsbHMgPSBuZXcgQXJyYXkod2lkdGggKiBoZWlnaHQpOwp9CkdyaWQucHJvdG90eXBlLnZhbHVlQXQgPSBmdW5jdGlvbihwb2ludCkgewogIHJldHVybiB0aGlzLmNlbGxzW3BvaW50LnkgKiB0aGlzLndpZHRoICsgcG9pbnQueF07Cn07CkdyaWQucHJvdG90eXBlLnNldFZhbHVlQXQgPSBmdW5jdGlvbihwb2ludCwgdmFsdWUpIHsKICB0aGlzLmNlbGxzW3BvaW50LnkgKiB0aGlzLndpZHRoICsgcG9pbnQueF0gPSB2YWx1ZTsKfTsKR3JpZC5wcm90b3R5cGUuaXNJbnNpZGUgPSBmdW5jdGlvbihwb2ludCkgewogIHJldHVybiBwb2ludC54ID49IDAgJiYgcG9pbnQueSA+PSAwICYmCiAgICAgICAgIHBvaW50LnggPCB0aGlzLndpZHRoICYmIHBvaW50LnkgPCB0aGlzLmhlaWdodDsKfTsKR3JpZC5wcm90b3R5cGUubW92ZVZhbHVlID0gZnVuY3Rpb24oZnJvbSwgdG8pIHsKICB0aGlzLnNldFZhbHVlQXQodG8sIHRoaXMudmFsdWVBdChmcm9tKSk7CiAgdGhpcy5zZXRWYWx1ZUF0KGZyb20sIHVuZGVmaW5lZCk7Cn07PC90ZXh0YXJlYT48L2Zvcm0+CgogICAgPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwge2F1dG9DbG9zZUJyYWNrZXRzOiB0cnVlfSk7CiAgICA8L3NjcmlwdD4KICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/demo/closetag.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogQ2xvc2UtVGFnIERlbW88L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vYWRkb24vZWRpdC9jbG9zZXRhZy5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9hZGRvbi9mb2xkL3htbC1mb2xkLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL21vZGUveG1sL3htbC5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9tb2RlL2phdmFzY3JpcHQvamF2YXNjcmlwdC5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9tb2RlL2Nzcy9jc3MuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vbW9kZS9odG1sbWl4ZWQvaHRtbG1peGVkLmpzIj48L3NjcmlwdD4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KICAgICAgLkNvZGVNaXJyb3Ige2JvcmRlci10b3A6IDFweCBzb2xpZCAjODg4OyBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzg4ODt9CiAgICA8L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxoMT5Db2RlTWlycm9yPC9oMT48aW1nIGlkPWxvZ28gc3JjPSIuLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+Q2xvc2UtVGFnPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5DbG9zZS1UYWcgRGVtbzwvaDI+Cjxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+PGh0bWw8L3RleHRhcmVhPjwvZm9ybT4KCiAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICAgICAgbW9kZTogJ3RleHQvaHRtbCcsCiAgICAgICAgYXV0b0Nsb3NlVGFnczogdHJ1ZQogICAgICB9KTsKICAgIDwvc2NyaXB0PgogIDwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/demo/complete.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogQXV0b2NvbXBsZXRlIERlbW88L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9saWIvY29kZW1pcnJvci5jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL2FkZG9uL2hpbnQvc2hvdy1oaW50LmNzcyI+CjxzY3JpcHQgc3JjPSIuLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9hZGRvbi9oaW50L3Nob3ctaGludC5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9hZGRvbi9oaW50L2phdmFzY3JpcHQtaGludC5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9tb2RlL2phdmFzY3JpcHQvamF2YXNjcmlwdC5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9tb2RlL21hcmtkb3duL21hcmtkb3duLmpzIj48L3NjcmlwdD4KCjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGgxPkNvZGVNaXJyb3I8L2gxPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5BdXRvY29tcGxldGU8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPkF1dG9jb21wbGV0ZSBEZW1vPC9oMj4KPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KZnVuY3Rpb24gZ2V0Q29tcGxldGlvbnModG9rZW4sIGNvbnRleHQpIHsKICB2YXIgZm91bmQgPSBbXSwgc3RhcnQgPSB0b2tlbi5zdHJpbmc7CiAgZnVuY3Rpb24gbWF5YmVBZGQoc3RyKSB7CiAgICBpZiAoc3RyLmluZGV4T2Yoc3RhcnQpID09IDApIGZvdW5kLnB1c2goc3RyKTsKICB9CiAgZnVuY3Rpb24gZ2F0aGVyQ29tcGxldGlvbnMob2JqKSB7CiAgICBpZiAodHlwZW9mIG9iaiA9PSAic3RyaW5nIikgZm9yRWFjaChzdHJpbmdQcm9wcywgbWF5YmVBZGQpOwogICAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgQXJyYXkpIGZvckVhY2goYXJyYXlQcm9wcywgbWF5YmVBZGQpOwogICAgZWxzZSBpZiAob2JqIGluc3RhbmNlb2YgRnVuY3Rpb24pIGZvckVhY2goZnVuY1Byb3BzLCBtYXliZUFkZCk7CiAgICBmb3IgKHZhciBuYW1lIGluIG9iaikgbWF5YmVBZGQobmFtZSk7CiAgfQoKICBpZiAoY29udGV4dCkgewogICAgLy8gSWYgdGhpcyBpcyBhIHByb3BlcnR5LCBzZWUgaWYgaXQgYmVsb25ncyB0byBzb21lIG9iamVjdCB3ZSBjYW4KICAgIC8vIGZpbmQgaW4gdGhlIGN1cnJlbnQgZW52aXJvbm1lbnQuCiAgICB2YXIgb2JqID0gY29udGV4dC5wb3AoKSwgYmFzZTsKICAgIGlmIChvYmouY2xhc3NOYW1lID09ICJqcy12YXJpYWJsZSIpCiAgICAgIGJhc2UgPSB3aW5kb3dbb2JqLnN0cmluZ107CiAgICBlbHNlIGlmIChvYmouY2xhc3NOYW1lID09ICJqcy1zdHJpbmciKQogICAgICBiYXNlID0gIiI7CiAgICBlbHNlIGlmIChvYmouY2xhc3NOYW1lID09ICJqcy1hdG9tIikKICAgICAgYmFzZSA9IDE7CiAgICB3aGlsZSAoYmFzZSAhPSBudWxsICYmIGNvbnRleHQubGVuZ3RoKQogICAgICBiYXNlID0gYmFzZVtjb250ZXh0LnBvcCgpLnN0cmluZ107CiAgICBpZiAoYmFzZSAhPSBudWxsKSBnYXRoZXJDb21wbGV0aW9ucyhiYXNlKTsKICB9CiAgZWxzZSB7CiAgICAvLyBJZiBub3QsIGp1c3QgbG9vayBpbiB0aGUgd2luZG93IG9iamVjdCBhbmQgYW55IGxvY2FsIHNjb3BlCiAgICAvLyAocmVhZGluZyBpbnRvIEpTIG1vZGUgaW50ZXJuYWxzIHRvIGdldCBhdCB0aGUgbG9jYWwgdmFyaWFibGVzKQogICAgZm9yICh2YXIgdiA9IHRva2VuLnN0YXRlLmxvY2FsVmFyczsgdjsgdiA9IHYubmV4dCkgbWF5YmVBZGQodi5uYW1lKTsKICAgIGdhdGhlckNvbXBsZXRpb25zKHdpbmRvdyk7CiAgICBmb3JFYWNoKGtleXdvcmRzLCBtYXliZUFkZCk7CiAgfQogIHJldHVybiBmb3VuZDsKfQo8L3RleHRhcmVhPjwvZm9ybT4KCjxwPlByZXNzIDxzdHJvbmc+Y3RybC1zcGFjZTwvc3Ryb25nPiB0byBhY3RpdmF0ZSBhdXRvY29tcGxldGlvbi4gQnVpbHQKb24gdG9wIG9mIHRoZSA8YSBocmVmPSIuLi9kb2MvbWFudWFsLmh0bWwjYWRkb25fc2hvdy1oaW50Ij48Y29kZT5zaG93LWhpbnQ8L2NvZGU+PC9hPgphbmQgPGEgaHJlZj0iLi4vZG9jL21hbnVhbC5odG1sI2FkZG9uX2phdmFzY3JpcHQtaGludCI+PGNvZGU+amF2YXNjcmlwdC1oaW50PC9jb2RlPjwvYT4KYWRkb25zLjwvcD4KCjxmb3JtPjx0ZXh0YXJlYSBzdHlsZT0iZGlzcGxheTogbm9uZSIgaWQ9InN5bm9ueW1zIiBuYW1lPSJzeW5vbnltcyI+CkhlcmUsIHRoZSBjb21wbGV0aW9uIHVzZSBhbiBhc3luY2hyb25vdXMgaGludGluZyBmdW5jdGlvbnMgdG8gcHJvdmlkZQpzeW5vbnltcyBmb3IgZWFjaCB3b3Jkcy4gSWYgeW91ciBicm93c2VyIHN1cHBvcnQgYFByb21pc2VzYCwgdGhlCmhpbnRpbmcgZnVuY3Rpb24gY2FuIGFsc28gcmV0dXJuIG9uZS4KPC90ZXh0YXJlYT48L2Zvcm0+Cgo8c2NyaXB0Pgp2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogIGxpbmVOdW1iZXJzOiB0cnVlLAogIGV4dHJhS2V5czogeyJDdHJsLVNwYWNlIjogImF1dG9jb21wbGV0ZSJ9LAogIG1vZGU6IHtuYW1lOiAiamF2YXNjcmlwdCIsIGdsb2JhbFZhcnM6IHRydWV9Cn0pOwoKaWYgKHR5cGVvZiBQcm9taXNlICE9PSB1bmRlZmluZWQpIHsKICB2YXIgY29tcCA9IFsKICAgIFsiaGVyZSIsICJoaXRoZXIiXSwKICAgIFsiYXN5bmNocm9ub3VzIiwgIm5vbnN5bmNocm9ub3VzIl0sCiAgICBbImNvbXBsZXRpb24iLCAiYWNoaWV2ZW1lbnQiLCAiY29uY2x1c2lvbiIsICJjdWxtaW5hdGlvbiIsICJleHBpcmF0aW9ucyJdLAogICAgWyJoaW50aW5nIiwgImFkdml2ZSIsICJicm9hY2giLCAiaW1wbHkiXSwKICAgIFsiZnVuY3Rpb24iLCJhY3Rpb24iXSwKICAgIFsicHJvdmlkZSIsICJhZGQiLCAiYnJpbmciLCAiZ2l2ZSJdLAogICAgWyJzeW5vbnltcyIsICJlcXVpdmFsZW50cyJdLAogICAgWyJ3b3JkcyIsICJ0b2tlbiJdLAogICAgWyJlYWNoIiwgImV2ZXJ5Il0sCiAgXQoKICBmdW5jdGlvbiBzeW5vbnltcyhjbSwgb3B0aW9uKSB7CiAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oYWNjZXB0KSB7CiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGN1cnNvciA9IGNtLmdldEN1cnNvcigpLCBsaW5lID0gY20uZ2V0TGluZShjdXJzb3IubGluZSkKICAgICAgICB2YXIgc3RhcnQgPSBjdXJzb3IuY2gsIGVuZCA9IGN1cnNvci5jaAogICAgICAgIHdoaWxlIChzdGFydCAmJiAvXHcvLnRlc3QobGluZS5jaGFyQXQoc3RhcnQgLSAxKSkpIC0tc3RhcnQKICAgICAgICB3aGlsZSAoZW5kIDwgbGluZS5sZW5ndGggJiYgL1x3Ly50ZXN0KGxpbmUuY2hhckF0KGVuZCkpKSArK2VuZAogICAgICAgIHZhciB3b3JkID0gbGluZS5zbGljZShzdGFydCwgZW5kKS50b0xvd2VyQ2FzZSgpCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb21wLmxlbmd0aDsgaSsrKSBpZiAoY29tcFtpXS5pbmRleE9mKHdvcmQpICE9IC0xKQogICAgICAgICAgcmV0dXJuIGFjY2VwdCh7bGlzdDogY29tcFtpXSwKICAgICAgICAgICAgICAgICAgICAgICAgIGZyb206IENvZGVNaXJyb3IuUG9zKGN1cnNvci5saW5lLCBzdGFydCksCiAgICAgICAgICAgICAgICAgICAgICAgICB0bzogQ29kZU1pcnJvci5Qb3MoY3Vyc29yLmxpbmUsIGVuZCl9KQogICAgICAgIHJldHVybiBhY2NlcHQobnVsbCkKICAgICAgfSwgMTAwKQogICAgfSkKICB9CgogIHZhciBlZGl0b3IyID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInN5bm9ueW1zIiksIHsKICAgIGV4dHJhS2V5czogeyJDdHJsLVNwYWNlIjogImF1dG9jb21wbGV0ZSJ9LAogICAgbGluZU51bWJlcnM6IHRydWUsCiAgICBsaW5lV3JhcHBpbmc6IHRydWUsCiAgICBtb2RlOiAidGV4dC94LW1hcmtkb3duIiwKICAgIGhpbnRPcHRpb25zOiB7aGludDogc3lub255bXN9CiAgfSkKfQo8L3NjcmlwdD4KCjwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/demo/emacs.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogRW1hY3MgYmluZGluZ3MgZGVtbzwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vYWRkb24vZGlhbG9nL2RpYWxvZy5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vbW9kZS9jbGlrZS9jbGlrZS5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9rZXltYXAvZW1hY3MuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vYWRkb24vZWRpdC9tYXRjaGJyYWNrZXRzLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL2FkZG9uL2NvbW1lbnQvY29tbWVudC5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9hZGRvbi9kaWFsb2cvZGlhbG9nLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL2FkZG9uL3NlYXJjaC9zZWFyY2hjdXJzb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vYWRkb24vc2VhcmNoL3NlYXJjaC5qcyI+PC9zY3JpcHQ+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICAgIC5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgI2VlZTsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlZWU7fQogICAgPC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aDE+Q29kZU1pcnJvcjwvaDE+PGltZyBpZD1sb2dvIHNyYz0iLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPkVtYWNzIGJpbmRpbmdzPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5FbWFjcyBiaW5kaW5ncyBkZW1vPC9oMj4KPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KI2luY2x1ZGUgInN5c2NhbGxzLmgiCi8qIGdldGNoYXI6ICBzaW1wbGUgYnVmZmVyZWQgdmVyc2lvbiAqLwppbnQgZ2V0Y2hhcih2b2lkKQp7CiAgc3RhdGljIGNoYXIgYnVmW0JVRlNJWl07CiAgc3RhdGljIGNoYXIgKmJ1ZnAgPSBidWY7CiAgc3RhdGljIGludCBuID0gMDsKICBpZiAobiA9PSAwKSB7ICAvKiBidWZmZXIgaXMgZW1wdHkgKi8KICAgIG4gPSByZWFkKDAsIGJ1Ziwgc2l6ZW9mIGJ1Zik7CiAgICBidWZwID0gYnVmOwogIH0KICByZXR1cm4gKC0tbiA+PSAwKSA/ICh1bnNpZ25lZCBjaGFyKSAqYnVmcCsrIDogRU9GOwp9CjwvdGV4dGFyZWE+PC9mb3JtPgoKPHA+VGhlIGVtYWNzIGtleWJpbmRpbmdzIGFyZSBlbmFibGVkIGJ5CmluY2x1ZGluZyA8YSBocmVmPSIuLi9rZXltYXAvZW1hY3MuanMiPmtleW1hcC9lbWFjcy5qczwvYT4gYW5kIHNldHRpbmcKdGhlIDxjb2RlPmtleU1hcDwvY29kZT4gb3B0aW9uIHRvIDxjb2RlPiJlbWFjcyI8L2NvZGU+LiBCZWNhdXNlCkNvZGVNaXJyb3IncyBpbnRlcm5hbCBBUEkgaXMgcXVpdGUgZGlmZmVyZW50IGZyb20gRW1hY3MsIHRoZXkgYXJlIG9ubHkKYSBsb29zZSBhcHByb3hpbWF0aW9uIG9mIGFjdHVhbCBlbWFjcyBiaW5kaW5ncywgdGhvdWdoLjwvcD4KCjxwPkFsc28gbm90ZSB0aGF0IGEgbG90IG9mIGJyb3dzZXJzIGRpc2FsbG93IGNlcnRhaW4ga2V5cyBmcm9tIGJlaW5nCmNhcHR1cmVkLiBGb3IgZXhhbXBsZSwgQ2hyb21lIGJsb2NrcyBib3RoIEN0cmwtVyBhbmQgQ3RybC1OLCB3aXRoIHRoZQpyZXN1bHQgdGhhdCBpZGlvbWF0aWMgdXNlIG9mIEVtYWNzIGtleXMgd2lsbCBjb25zdGFudGx5IGNsb3NlIHlvdXIgdGFiCm9yIG9wZW4gYSBuZXcgd2luZG93LjwvcD4KCiAgICA8c2NyaXB0PgogICAgICBDb2RlTWlycm9yLmNvbW1hbmRzLnNhdmUgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgZWx0ID0gZWRpdG9yLmdldFdyYXBwZXJFbGVtZW50KCk7CiAgICAgICAgZWx0LnN0eWxlLmJhY2tncm91bmQgPSAiI2RlZiI7CiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsgZWx0LnN0eWxlLmJhY2tncm91bmQgPSAiIjsgfSwgMzAwKTsKICAgICAgfTsKICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgICAgICBtb2RlOiAidGV4dC94LWNzcmMiLAogICAgICAgIGtleU1hcDogImVtYWNzIgogICAgICB9KTsKICAgIDwvc2NyaXB0PgoKICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/demo/folding.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8aGVhZD4KICA8dGl0bGU+Q29kZU1pcnJvcjogQ29kZSBGb2xkaW5nIERlbW88L3RpdGxlPgogIDxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CiAgPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vZG9jL2RvY3MuY3NzIj4KCiAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9saWIvY29kZW1pcnJvci5jc3MiPgogIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vYWRkb24vZm9sZC9mb2xkZ3V0dGVyLmNzcyIgLz4KICA8c2NyaXB0IHNyYz0iLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0PgogIDxzY3JpcHQgc3JjPSIuLi9hZGRvbi9mb2xkL2ZvbGRjb2RlLmpzIj48L3NjcmlwdD4KICA8c2NyaXB0IHNyYz0iLi4vYWRkb24vZm9sZC9mb2xkZ3V0dGVyLmpzIj48L3NjcmlwdD4KICA8c2NyaXB0IHNyYz0iLi4vYWRkb24vZm9sZC9icmFjZS1mb2xkLmpzIj48L3NjcmlwdD4KICA8c2NyaXB0IHNyYz0iLi4vYWRkb24vZm9sZC94bWwtZm9sZC5qcyI+PC9zY3JpcHQ+CiAgPHNjcmlwdCBzcmM9Ii4uL2FkZG9uL2ZvbGQvbWFya2Rvd24tZm9sZC5qcyI+PC9zY3JpcHQ+CiAgPHNjcmlwdCBzcmM9Ii4uL2FkZG9uL2ZvbGQvY29tbWVudC1mb2xkLmpzIj48L3NjcmlwdD4KICA8c2NyaXB0IHNyYz0iLi4vbW9kZS9qYXZhc2NyaXB0L2phdmFzY3JpcHQuanMiPjwvc2NyaXB0PgogIDxzY3JpcHQgc3JjPSIuLi9tb2RlL3htbC94bWwuanMiPjwvc2NyaXB0PgogIDxzY3JpcHQgc3JjPSIuLi9tb2RlL21hcmtkb3duL21hcmtkb3duLmpzIj48L3NjcmlwdD4KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgogICAgLkNvZGVNaXJyb3Ige2JvcmRlci10b3A6IDFweCBzb2xpZCBibGFjazsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO30KICA8L3N0eWxlPgo8L2hlYWQ+Cgo8Ym9keT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aDE+Q29kZU1pcnJvcjwvaDE+PGltZyBpZD1sb2dvIHNyYz0iLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPkNvZGUgRm9sZGluZzwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgogIDxoMj5Db2RlIEZvbGRpbmcgRGVtbzwvaDI+CiAgPGZvcm0+CiAgICA8ZGl2IHN0eWxlPSJtYXgtd2lkdGg6IDUwZW07IG1hcmdpbi1ib3R0b206IDFlbSI+SmF2YVNjcmlwdDo8YnI+CiAgICA8dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPjwvdGV4dGFyZWE+PC9kaXY+CiAgICA8ZGl2IHN0eWxlPSJtYXgtd2lkdGg6IDUwZW07IG1hcmdpbi1ib3R0b206IDFlbSI+SFRNTDo8YnI+CiAgICA8dGV4dGFyZWEgaWQ9ImNvZGUtaHRtbCIgbmFtZT0iY29kZS1odG1sIj48L3RleHRhcmVhPjwvZGl2PgogICAgPGRpdiBzdHlsZT0ibWF4LXdpZHRoOiA1MGVtIj5NYXJrZG93bjo8YnI+CiAgICA8dGV4dGFyZWEgaWQ9ImNvZGUtbWFya2Rvd24iIG5hbWU9ImNvZGUiPjwvdGV4dGFyZWE+PC9kaXY+CiAgPC9mb3JtPgogIDxzY3JpcHQgaWQ9InNjcmlwdCI+Ci8qCiAqIERlbW9uc3RyYXRpb24gb2YgY29kZSBmb2xkaW5nCiAqLwp3aW5kb3cub25sb2FkID0gZnVuY3Rpb24oKSB7CiAgdmFyIHRlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKTsKICB2YXIgc2MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic2NyaXB0Iik7CiAgdGUudmFsdWUgPSAoc2MudGV4dENvbnRlbnQgfHwgc2MuaW5uZXJUZXh0IHx8IHNjLmlubmVySFRNTCkucmVwbGFjZSgvXlxzKi8sICIiKTsKICBzYy5pbm5lckhUTUwgPSAiIjsKICB2YXIgdGVfaHRtbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlLWh0bWwiKTsKICB0ZV9odG1sLnZhbHVlID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmlubmVySFRNTDsKICB2YXIgdGVfbWFya2Rvd24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZS1tYXJrZG93biIpOwogIHRlX21hcmtkb3duLnZhbHVlID0gIiMgRm9vXG4jIyBCYXJcblxuYmxhaCBibGFoXG5cbiMjIEJhelxuXG5ibGFoIGJsYWhcblxuIyBRdXV4XG5cbmJsYWggYmxhaFxuIgoKICB3aW5kb3cuZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEodGUsIHsKICAgIG1vZGU6ICJqYXZhc2NyaXB0IiwKICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgbGluZVdyYXBwaW5nOiB0cnVlLAogICAgZXh0cmFLZXlzOiB7IkN0cmwtUSI6IGZ1bmN0aW9uKGNtKXsgY20uZm9sZENvZGUoY20uZ2V0Q3Vyc29yKCkpOyB9fSwKICAgIGZvbGRHdXR0ZXI6IHRydWUsCiAgICBndXR0ZXJzOiBbIkNvZGVNaXJyb3ItbGluZW51bWJlcnMiLCAiQ29kZU1pcnJvci1mb2xkZ3V0dGVyIl0KICB9KTsKICBlZGl0b3IuZm9sZENvZGUoQ29kZU1pcnJvci5Qb3MoMTMsIDApKTsKCiAgd2luZG93LmVkaXRvcl9odG1sID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEodGVfaHRtbCwgewogICAgbW9kZTogInRleHQvaHRtbCIsCiAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgIGxpbmVXcmFwcGluZzogdHJ1ZSwKICAgIGV4dHJhS2V5czogeyJDdHJsLVEiOiBmdW5jdGlvbihjbSl7IGNtLmZvbGRDb2RlKGNtLmdldEN1cnNvcigpKTsgfX0sCiAgICBmb2xkR3V0dGVyOiB0cnVlLAogICAgZ3V0dGVyczogWyJDb2RlTWlycm9yLWxpbmVudW1iZXJzIiwgIkNvZGVNaXJyb3ItZm9sZGd1dHRlciJdCiAgfSk7CiAgZWRpdG9yX2h0bWwuZm9sZENvZGUoQ29kZU1pcnJvci5Qb3MoMCwgMCkpOwogIGVkaXRvcl9odG1sLmZvbGRDb2RlKENvZGVNaXJyb3IuUG9zKDIxLCAwKSk7CgogIHdpbmRvdy5lZGl0b3JfbWFya2Rvd24gPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYSh0ZV9tYXJrZG93biwgewogICAgbW9kZTogIm1hcmtkb3duIiwKICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgbGluZVdyYXBwaW5nOiB0cnVlLAogICAgZXh0cmFLZXlzOiB7IkN0cmwtUSI6IGZ1bmN0aW9uKGNtKXsgY20uZm9sZENvZGUoY20uZ2V0Q3Vyc29yKCkpOyB9fSwKICAgIGZvbGRHdXR0ZXI6IHRydWUsCiAgICBndXR0ZXJzOiBbIkNvZGVNaXJyb3ItbGluZW51bWJlcnMiLCAiQ29kZU1pcnJvci1mb2xkZ3V0dGVyIl0KICB9KTsKfTsKICA8L3NjcmlwdD4KPC9hcnRpY2xlPgo8L2JvZHk+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/demo/fullscreen.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogRnVsbCBTY3JlZW4gRWRpdGluZzwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vYWRkb24vZGlzcGxheS9mdWxsc2NyZWVuLmNzcyI+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vdGhlbWUvbmlnaHQuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL21vZGUveG1sL3htbC5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9hZGRvbi9kaXNwbGF5L2Z1bGxzY3JlZW4uanMiPjwvc2NyaXB0PgoKPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aDE+Q29kZU1pcnJvcjwvaDE+PGltZyBpZD1sb2dvIHNyYz0iLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPkZ1bGwgU2NyZWVuIEVkaXRpbmc8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPkZ1bGwgU2NyZWVuIEVkaXRpbmc8L2gyPgo8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiIHJvd3M9IjUiPgo8ZGw+CiAgPGR0IGlkPSJvcHRpb25faW5kZW50V2l0aFRhYnMiPjxjb2RlPjxzdHJvbmc+aW5kZW50V2l0aFRhYnM8L3N0cm9uZz46IGJvb2xlYW48L2NvZGU+PC9kdD4KICA8ZGQ+V2hldGhlciwgd2hlbiBpbmRlbnRpbmcsIHRoZSBmaXJzdCBOKjxjb2RlPnRhYlNpemU8L2NvZGU+CiAgc3BhY2VzIHNob3VsZCBiZSByZXBsYWNlZCBieSBOIHRhYnMuIERlZmF1bHQgaXMgZmFsc2UuPC9kZD4KCiAgPGR0IGlkPSJvcHRpb25fZWxlY3RyaWNDaGFycyI+PGNvZGU+PHN0cm9uZz5lbGVjdHJpY0NoYXJzPC9zdHJvbmc+OiBib29sZWFuPC9jb2RlPjwvZHQ+CiAgPGRkPkNvbmZpZ3VyZXMgd2hldGhlciB0aGUgZWRpdG9yIHNob3VsZCByZS1pbmRlbnQgdGhlIGN1cnJlbnQKICBsaW5lIHdoZW4gYSBjaGFyYWN0ZXIgaXMgdHlwZWQgdGhhdCBtaWdodCBjaGFuZ2UgaXRzIHByb3BlcgogIGluZGVudGF0aW9uIChvbmx5IHdvcmtzIGlmIHRoZSBtb2RlIHN1cHBvcnRzIGluZGVudGF0aW9uKS4KICBEZWZhdWx0IGlzIHRydWUuPC9kZD4KCiAgPGR0IGlkPSJvcHRpb25fc3BlY2lhbENoYXJzIj48Y29kZT48c3Ryb25nPnNwZWNpYWxDaGFyczwvc3Ryb25nPjogUmVnRXhwPC9jb2RlPjwvZHQ+CiAgPGRkPkEgcmVndWxhciBleHByZXNzaW9uIHVzZWQgdG8gZGV0ZXJtaW5lIHdoaWNoIGNoYXJhY3RlcnMKICBzaG91bGQgYmUgcmVwbGFjZWQgYnkgYQogIHNwZWNpYWwgPGEgaHJlZj0iI29wdGlvbl9zcGVjaWFsQ2hhclBsYWNlaG9sZGVyIj5wbGFjZWhvbGRlcjwvYT4uCiAgTW9zdGx5IHVzZWZ1bCBmb3Igbm9uLXByaW50aW5nIHNwZWNpYWwgY2hhcmFjdGVycy4gVGhlIGRlZmF1bHQKICBpcyA8Y29kZT4vW1x1MDAwMC1cdTAwMTlcdTAwYWRcdTIwMGJcdTIwMjhcdTIwMjlcdWZlZmZdLzwvY29kZT4uPC9kZD4KICA8ZHQgaWQ9Im9wdGlvbl9zcGVjaWFsQ2hhclBsYWNlaG9sZGVyIj48Y29kZT48c3Ryb25nPnNwZWNpYWxDaGFyUGxhY2Vob2xkZXI8L3N0cm9uZz46IGZ1bmN0aW9uKGNoYXIpwqDihpLCoEVsZW1lbnQ8L2NvZGU+PC9kdD4KICA8ZGQ+QSBmdW5jdGlvbiB0aGF0LCBnaXZlbiBhIHNwZWNpYWwgY2hhcmFjdGVyIGlkZW50aWZpZWQgYnkKICB0aGUgPGEgaHJlZj0iI29wdGlvbl9zcGVjaWFsQ2hhcnMiPjxjb2RlPnNwZWNpYWxDaGFyczwvY29kZT48L2E+CiAgb3B0aW9uLCBwcm9kdWNlcyBhIERPTSBub2RlIHRoYXQgaXMgdXNlZCB0byByZXByZXNlbnQgdGhlCiAgY2hhcmFjdGVyLiBCeSBkZWZhdWx0LCBhIHJlZCBkb3QgKDxzcGFuIHN0eWxlPSJjb2xvcjogcmVkIj7igKI8L3NwYW4+KQogIGlzIHNob3duLCB3aXRoIGEgdGl0bGUgdG9vbHRpcCB0byBpbmRpY2F0ZSB0aGUgY2hhcmFjdGVyIGNvZGUuPC9kZD4KCiAgPGR0IGlkPSJvcHRpb25fcnRsTW92ZVZpc3VhbGx5Ij48Y29kZT48c3Ryb25nPnJ0bE1vdmVWaXN1YWxseTwvc3Ryb25nPjogYm9vbGVhbjwvY29kZT48L2R0PgogIDxkZD5EZXRlcm1pbmVzIHdoZXRoZXIgaG9yaXpvbnRhbCBjdXJzb3IgbW92ZW1lbnQgdGhyb3VnaAogIHJpZ2h0LXRvLWxlZnQgKEFyYWJpYywgSGVicmV3KSB0ZXh0IGlzIHZpc3VhbCAocHJlc3NpbmcgdGhlIGxlZnQKICBhcnJvdyBtb3ZlcyB0aGUgY3Vyc29yIGxlZnQpIG9yIGxvZ2ljYWwgKHByZXNzaW5nIHRoZSBsZWZ0IGFycm93CiAgbW92ZXMgdG8gdGhlIG5leHQgbG93ZXIgaW5kZXggaW4gdGhlIHN0cmluZywgd2hpY2ggaXMgdmlzdWFsbHkKICByaWdodCBpbiByaWdodC10by1sZWZ0IHRleHQpLiBUaGUgZGVmYXVsdCBpcyA8Y29kZT5mYWxzZTwvY29kZT4KICBvbiBXaW5kb3dzLCBhbmQgPGNvZGU+dHJ1ZTwvY29kZT4gb24gb3RoZXIgcGxhdGZvcm1zLjwvZGQ+CjwvZGw+CjwvdGV4dGFyZWE+PC9mb3JtPgogIDxzY3JpcHQ+CiAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgICAgdGhlbWU6ICJuaWdodCIsCiAgICAgIGV4dHJhS2V5czogewogICAgICAgICJGMTEiOiBmdW5jdGlvbihjbSkgewogICAgICAgICAgY20uc2V0T3B0aW9uKCJmdWxsU2NyZWVuIiwgIWNtLmdldE9wdGlvbigiZnVsbFNjcmVlbiIpKTsKICAgICAgICB9LAogICAgICAgICJFc2MiOiBmdW5jdGlvbihjbSkgewogICAgICAgICAgaWYgKGNtLmdldE9wdGlvbigiZnVsbFNjcmVlbiIpKSBjbS5zZXRPcHRpb24oImZ1bGxTY3JlZW4iLCBmYWxzZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKICA8L3NjcmlwdD4KCiAgICA8cD5EZW1vbnN0cmF0aW9uIG9mCiAgICB0aGUgPGEgaHJlZj0iLi4vZG9jL21hbnVhbC5odG1sI2FkZG9uX2Z1bGxzY3JlZW4iPmZ1bGxzY3JlZW48L2E+CiAgICBhZGRvbi4gUHJlc3MgPHN0cm9uZz5GMTE8L3N0cm9uZz4gd2hlbiBjdXJzb3IgaXMgaW4gdGhlIGVkaXRvciB0bwogICAgdG9nZ2xlIGZ1bGwgc2NyZWVuIGVkaXRpbmcuIDxzdHJvbmc+RXNjPC9zdHJvbmc+IGNhbiBhbHNvIGJlIHVzZWQKICAgIHRvIDxpPmV4aXQ8L2k+IGZ1bGwgc2NyZWVuIGVkaXRpbmcuPC9wPgogIDwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/demo/hardwrap.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogSGFyZC13cmFwcGluZyBEZW1vPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL21vZGUvbWFya2Rvd24vbWFya2Rvd24uanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vYWRkb24vd3JhcC9oYXJkd3JhcC5qcyI+PC9zY3JpcHQ+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgLkNvZGVNaXJyb3Ige2JvcmRlci10b3A6IDFweCBzb2xpZCBibGFjazsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO30KPC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aDE+Q29kZU1pcnJvcjwvaDE+PGltZyBpZD1sb2dvIHNyYz0iLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPkhhcmQtd3JhcHBpbmc8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPkhhcmQtd3JhcHBpbmcgRGVtbzwvaDI+Cjxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIHZpbSBhdWd1ZSBkaWN0YXMgY29uc3RpdHV0byBleCwKc2l0IGZhbGxpIHNpbXVsIHZpZGVyZXIgdGUuIEdyYWVjbyBzY2Fldm9sYSBtYWx1aXNzZXQgc2l0CnV0LCBpbiBpZHF1ZSB2aXJpcyBwcmFlc2VudCBzZWEuIEVhIHNlYSBlaXJtb2QgaW5kb2N0dW0KcmVwdWRpYXJlLiBWZWwgbm9sdWlzc2Ugc3VzY2lwaXQgcGVyaWN1bGEgdXQuIEluIGl1cyBudWxsYQphbGllbnVtIG1vbGVzdGllLiBNZWkgZXNzZW50IGRpc2NlcmUgZGVtb2NyaXR1bSBpZC4KCkVxdWlkZW0gcG9uZGVydW0gZXhwZXRlbmRpcyBpdXMgaW4sIG1lYSBhbiBlcnJvcmlidXMKY29uc3RpdHV0bywgY29uZ3VlIHRpbWVhbSBwZXJmZWN0byBhZCBlc3QuIEl1cyB1dCBwcmltaXMKdGltZWFtLCBwZXIgaW4gdWxsdW0gbWVkaW9jcmVtLiBBbiBjYXNlIHZlcm8gbGFiaXR1ciBwcmksCnZlbCBkaWNpdCBsYW9yZWV0IGV0LiBBbiBxdWkgcHJvbXB0YSBjb25jbHVzaW9uZW1xdWUsIGVhbQp0aW1lYW0gc2FwaWVudGVtIGluLCBjdW0gZGljdGFzIGVwaWN1cmVpIGV1LgoKVXN1IGN1IHZpZGUgZGljdGFzIGRlc2VydWlzc2UsIGV1bSBjaG9ybyBncmFlY2UgYWRpcGlzY2luZwp1dC4gQ2libyBxdWFsaXNxdWUgaXVzIGFkLCBldCBkaWNhdCBzY3JpcHRhIG1lYSwgZWFtIG5paGlsCm1lbnRpdHVtIGFsaXF1YW5kbyBjdS4gRGViZXQgYXBlcmlhbSBzcGxlbmRpZGUgYXQgcXVvLCBhZApwYXVsbyBub3N0cm8gY29tbW9kbyBkdW8uIFNlYSBhZGh1YyB1dGluYW0gY29uY2x1c2lvbmVtcXVlCmlkLCBxdWFzIGRvbWluZyBtYWxvcnVtIG5lYyBhZC4gVG9sbGl0IGVydWRpdGkgdml2ZW5kdW0gYWQKaXVzLCBlb3Mgc29sZWF0IGlnbm90YSBhZC4KPC90ZXh0YXJlYT48L2Zvcm0+Cgo8cD5EZW1vbnN0cmF0aW9uIG9mCnRoZSA8YSBocmVmPSIuLi9kb2MvbWFudWFsLmh0bWwjYWRkb25faGFyZHdyYXAiPmhhcmR3cmFwPC9hPiBhZGRvbi4KVGhlIGFib3ZlIGVkaXRvciBoYXMgaXRzIGNoYW5nZSBldmVudCBob29rZWQgdXAgdG8KdGhlIDxjb2RlPndyYXBQYXJhZ3JhcGhzSW5SYW5nZTwvY29kZT4gbWV0aG9kLCBzbyB0aGF0IHRoZSBwYXJhZ3JhcGhzCmFyZSByZWZsb3duIGFzIHlvdSBhcmUgdHlwaW5nLjwvcD4KCjxzY3JpcHQ+CnZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgbW9kZTogIm1hcmtkb3duIiwKICBsaW5lTnVtYmVyczogdHJ1ZSwKICBleHRyYUtleXM6IHsKICAgICJDdHJsLVEiOiBmdW5jdGlvbihjbSkgeyBjbS53cmFwUGFyYWdyYXBoKGNtLmdldEN1cnNvcigpLCBvcHRpb25zKTsgfQogIH0KfSk7CnZhciB3YWl0LCBvcHRpb25zID0ge2NvbHVtbjogNjB9LCBjaGFuZ2luZyA9IGZhbHNlOwplZGl0b3Iub24oImNoYW5nZSIsIGZ1bmN0aW9uKGNtLCBjaGFuZ2UpIHsKICBpZiAoY2hhbmdpbmcpIHJldHVybjsKICBjbGVhclRpbWVvdXQod2FpdCk7CiAgd2FpdCA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICBjaGFuZ2luZyA9IHRydWU7CiAgICBjbS53cmFwUGFyYWdyYXBoc0luUmFuZ2UoY2hhbmdlLmZyb20sIENvZGVNaXJyb3IuY2hhbmdlRW5kKGNoYW5nZSksIG9wdGlvbnMpOwogICAgY2hhbmdpbmcgPSBmYWxzZTsKICB9LCAyMDApOwp9KTsKPC9zY3JpcHQ+Cgo8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/demo/html5complete.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8aGVhZD4KICA8dGl0bGU+Q29kZU1pcnJvcjogSFRNTCBjb21wbGV0aW9uIGRlbW88L3RpdGxlPgogIDxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CiAgPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vZG9jL2RvY3MuY3NzIj4KCiAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9saWIvY29kZW1pcnJvci5jc3MiPgogIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vYWRkb24vaGludC9zaG93LWhpbnQuY3NzIj4KICA8c2NyaXB0IHNyYz0iLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0PgogIDxzY3JpcHQgc3JjPSIuLi9hZGRvbi9oaW50L3Nob3ctaGludC5qcyI+PC9zY3JpcHQ+CiAgPHNjcmlwdCBzcmM9Ii4uL2FkZG9uL2hpbnQveG1sLWhpbnQuanMiPjwvc2NyaXB0PgogIDxzY3JpcHQgc3JjPSIuLi9hZGRvbi9oaW50L2h0bWwtaGludC5qcyI+PC9zY3JpcHQ+CiAgPHNjcmlwdCBzcmM9Ii4uL21vZGUveG1sL3htbC5qcyI+PC9zY3JpcHQ+CiAgPHNjcmlwdCBzcmM9Ii4uL21vZGUvamF2YXNjcmlwdC9qYXZhc2NyaXB0LmpzIj48L3NjcmlwdD4KICA8c2NyaXB0IHNyYz0iLi4vbW9kZS9jc3MvY3NzLmpzIj48L3NjcmlwdD4KICA8c2NyaXB0IHNyYz0iLi4vbW9kZS9odG1sbWl4ZWQvaHRtbG1peGVkLmpzIj48L3NjcmlwdD4KICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgogICAgLkNvZGVNaXJyb3Ige2JvcmRlci10b3A6IDFweCBzb2xpZCAjODg4OyBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzg4ODt9CiAgPC9zdHlsZT4KPC9oZWFkPgoKPGJvZHk+CiAgPGRpdiBpZD1uYXY+CiAgICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxoMT5Db2RlTWlycm9yPC9oMT48aW1nIGlkPWxvZ28gc3JjPSIuLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgICA8dWw+CiAgICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgICA8bGk+PGEgaHJlZj0iLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9jb2RlbWlycm9yIj5Db2RlPC9hPgogICAgPC91bD4KICAgIDx1bD4KICAgICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5IVE1MIGNvbXBsZXRpb248L2E+CiAgICA8L3VsPgogIDwvZGl2PgoKICA8YXJ0aWNsZT4KICAgIDxoMj5IVE1MIGNvbXBsZXRpb24gZGVtbzwvaDI+CgogICAgPHA+U2hvd3MgdGhlIDxhIGhyZWY9InhtbGNvbXBsZXRlLmh0bWwiPlhNTCBjb21wbGV0ZXI8L2E+CiAgICBwYXJhbWV0ZXJpemVkIHdpdGggaW5mb3JtYXRpb24gYWJvdXQgdGhlIHRhZ3MgaW4gSFRNTC4KICAgIFByZXNzIDxzdHJvbmc+Y3RybC1zcGFjZTwvc3Ryb25nPiB0byBhY3RpdmF0ZSBjb21wbGV0aW9uLjwvcD4KCiAgICA8ZGl2IGlkPSJjb2RlIj48L2Rpdj4KCiAgICA8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CiAgICAgIHdpbmRvdy5vbmxvYWQgPSBmdW5jdGlvbigpIHsKICAgICAgICBlZGl0b3IgPSBDb2RlTWlycm9yKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICAgIG1vZGU6ICJ0ZXh0L2h0bWwiLAogICAgICAgICAgZXh0cmFLZXlzOiB7IkN0cmwtU3BhY2UiOiAiYXV0b2NvbXBsZXRlIn0sCiAgICAgICAgICB2YWx1ZTogZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmlubmVySFRNTAogICAgICAgIH0pOwogICAgICB9OwogICAgPC9zY3JpcHQ+CiAgPC9hcnRpY2xlPgo8L2JvZHk+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/demo/indentwrap.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogSW5kZW50ZWQgd3JhcHBlZCBsaW5lIGRlbW88L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vbW9kZS94bWwveG1sLmpzIj48L3NjcmlwdD4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KICAgICAgLkNvZGVNaXJyb3Ige2JvcmRlci10b3A6IDFweCBzb2xpZCBibGFjazsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO30KICAgICAgLkNvZGVNaXJyb3IgcHJlID4gKiB7IHRleHQtaW5kZW50OiAwcHg7IH0KICAgIDwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGgxPkNvZGVNaXJyb3I8L2gxPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5JbmRlbnRlZCB3cmFwcGVkIGxpbmU8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPkluZGVudGVkIHdyYXBwZWQgbGluZSBkZW1vPC9oMj4KPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KPCFkb2N0eXBlIGh0bWw+Cjxib2R5PgogIDxoMiBpZD0ib3ZlcnZpZXciPk92ZXJ2aWV3PC9oMj4KCiAgPHA+Q29kZU1pcnJvciBpcyBhIGNvZGUtZWRpdG9yIGNvbXBvbmVudCB0aGF0IGNhbiBiZSBlbWJlZGRlZCBpbiBXZWIgcGFnZXMuIFRoZSBjb3JlIGxpYnJhcnkgcHJvdmlkZXMgPGVtPm9ubHk8L2VtPiB0aGUgZWRpdG9yIGNvbXBvbmVudCwgbm8gYWNjb21wYW55aW5nIGJ1dHRvbnMsIGF1dG8tY29tcGxldGlvbiwgb3Igb3RoZXIgSURFIGZ1bmN0aW9uYWxpdHkuIEl0IGRvZXMgcHJvdmlkZSBhIHJpY2ggQVBJIG9uIHRvcCBvZiB3aGljaCBzdWNoIGZ1bmN0aW9uYWxpdHkgY2FuIGJlIHN0cmFpZ2h0Zm9yd2FyZGx5IGltcGxlbWVudGVkLiBTZWUgdGhlIDxhIGhyZWY9IiNhZGRvbnMiPmFkZC1vbnM8L2E+IGluY2x1ZGVkIGluIHRoZSBkaXN0cmlidXRpb24sIGFuZCB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2phZ3RoZWRydW1tZXIvY29kZW1pcnJvci11aSI+Q29kZU1pcnJvciBVSTwvYT4gcHJvamVjdCwgZm9yIHJldXNhYmxlIGltcGxlbWVudGF0aW9ucyBvZiBleHRyYSBmZWF0dXJlcy48L3A+CgogIDxwPkNvZGVNaXJyb3Igd29ya3Mgd2l0aCBsYW5ndWFnZS1zcGVjaWZpYyBtb2Rlcy4gTW9kZXMgYXJlIEphdmFTY3JpcHQgcHJvZ3JhbXMgdGhhdCBoZWxwIGNvbG9yIChhbmQgb3B0aW9uYWxseSBpbmRlbnQpIHRleHQgd3JpdHRlbiBpbiBhIGdpdmVuIGxhbmd1YWdlLiBUaGUgZGlzdHJpYnV0aW9uIGNvbWVzIHdpdGggYSBudW1iZXIgb2YgbW9kZXMgKHNlZSB0aGUgPGEgaHJlZj0iLi4vbW9kZS8iPjxjb2RlPm1vZGUvPC9jb2RlPjwvYT4gZGlyZWN0b3J5KSwgYW5kIGl0IGlzbid0IGhhcmQgdG8gPGEgaHJlZj0iI21vZGVhcGkiPndyaXRlIG5ldyBvbmVzPC9hPiBmb3Igb3RoZXIgbGFuZ3VhZ2VzLjwvcD4KPC9ib2R5Pgo8L3RleHRhcmVhPjwvZm9ybT4KCiAgICA8cD5UaGlzIHBhZ2UgdXNlcyBhIGhhY2sgb24gdG9wIG9mIHRoZSA8Y29kZT4icmVuZGVyTGluZSI8L2NvZGU+CiAgICBldmVudCB0byBtYWtlIHdyYXBwZWQgdGV4dCBsaW5lIHVwIHdpdGggdGhlIGJhc2UgaW5kZW50YXRpb24gb2YKICAgIHRoZSBsaW5lLjwvcD4KCiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgICAgIGxpbmVXcmFwcGluZzogdHJ1ZSwKICAgICAgICBtb2RlOiAidGV4dC9odG1sIgogICAgICB9KTsKICAgICAgdmFyIGNoYXJXaWR0aCA9IGVkaXRvci5kZWZhdWx0Q2hhcldpZHRoKCksIGJhc2VQYWRkaW5nID0gNDsKICAgICAgZWRpdG9yLm9uKCJyZW5kZXJMaW5lIiwgZnVuY3Rpb24oY20sIGxpbmUsIGVsdCkgewogICAgICAgIHZhciBvZmYgPSBDb2RlTWlycm9yLmNvdW50Q29sdW1uKGxpbmUudGV4dCwgbnVsbCwgY20uZ2V0T3B0aW9uKCJ0YWJTaXplIikpICogY2hhcldpZHRoOwogICAgICAgIGVsdC5zdHlsZS50ZXh0SW5kZW50ID0gIi0iICsgb2ZmICsgInB4IjsKICAgICAgICBlbHQuc3R5bGUucGFkZGluZ0xlZnQgPSAoYmFzZVBhZGRpbmcgKyBvZmYpICsgInB4IjsKICAgICAgfSk7CiAgICAgIGVkaXRvci5yZWZyZXNoKCk7CiAgICA8L3NjcmlwdD4KCiAgPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/demo/lint.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogTGludGVyIERlbW88L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9saWIvY29kZW1pcnJvci5jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL2FkZG9uL2xpbnQvbGludC5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vbW9kZS9qYXZhc2NyaXB0L2phdmFzY3JpcHQuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vbW9kZS9jc3MvY3NzLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii8vYWpheC5hc3BuZXRjZG4uY29tL2FqYXgvanNoaW50L3IwNy9qc2hpbnQuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iaHR0cHM6Ly9yYXdnaXRodWIuY29tL3phYWNoL2pzb25saW50Lzc5YjU1M2ZiNjVjMTkyYWRkOTA2NmRhNjQwNDM0NTg5ODFiMzk3MmIvbGliL2pzb25saW50LmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Imh0dHA6Ly9jc3NsaW50Lm5ldC9qcy9jc3NsaW50LmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL2FkZG9uL2xpbnQvbGludC5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9hZGRvbi9saW50L2phdmFzY3JpcHQtbGludC5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9hZGRvbi9saW50L2pzb24tbGludC5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9hZGRvbi9saW50L2Nzcy1saW50LmpzIj48L3NjcmlwdD4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KICAgICAgLkNvZGVNaXJyb3Ige2JvcmRlcjogMXB4IHNvbGlkIGJsYWNrO30KICAgIDwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGgxPkNvZGVNaXJyb3I8L2gxPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5MaW50ZXI8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPkxpbnRlciBEZW1vPC9oMj4KCgogICAgPHA+PHRleHRhcmVhIGlkPSJjb2RlLWpzIj52YXIgd2lkZ2V0cyA9IFtdCmZ1bmN0aW9uIHVwZGF0ZUhpbnRzKCkgewogIGVkaXRvci5vcGVyYXRpb24oZnVuY3Rpb24oKXsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgd2lkZ2V0cy5sZW5ndGg7ICsraSkKICAgICAgZWRpdG9yLnJlbW92ZUxpbmVXaWRnZXQod2lkZ2V0c1tpXSk7CiAgICB3aWRnZXRzLmxlbmd0aCA9IDA7CgogICAgSlNISU5UKGVkaXRvci5nZXRWYWx1ZSgpKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgSlNISU5ULmVycm9ycy5sZW5ndGg7ICsraSkgewogICAgICB2YXIgZXJyID0gSlNISU5ULmVycm9yc1tpXTsKICAgICAgaWYgKCFlcnIpIGNvbnRpbnVlOwogICAgICB2YXIgbXNnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICAgIHZhciBpY29uID0gbXNnLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKSk7CiAgICAgIGljb24uaW5uZXJIVE1MID0gIiEhIjsKICAgICAgaWNvbi5jbGFzc05hbWUgPSAibGludC1lcnJvci1pY29uIjsKICAgICAgbXNnLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGVyci5yZWFzb24pKTsKICAgICAgbXNnLmNsYXNzTmFtZSA9ICJsaW50LWVycm9yIjsKICAgICAgd2lkZ2V0cy5wdXNoKGVkaXRvci5hZGRMaW5lV2lkZ2V0KGVyci5saW5lIC0gMSwgbXNnLCB7Y292ZXJHdXR0ZXI6IGZhbHNlLCBub0hTY3JvbGw6IHRydWV9KSk7CiAgICB9CiAgfSk7CiAgdmFyIGluZm8gPSBlZGl0b3IuZ2V0U2Nyb2xsSW5mbygpOwogIHZhciBhZnRlciA9IGVkaXRvci5jaGFyQ29vcmRzKHtsaW5lOiBlZGl0b3IuZ2V0Q3Vyc29yKCkubGluZSArIDEsIGNoOiAwfSwgImxvY2FsIikudG9wOwogIGlmIChpbmZvLnRvcCArIGluZm8uY2xpZW50SGVpZ2h0IDwgYWZ0ZXIpCiAgICBlZGl0b3Iuc2Nyb2xsVG8obnVsbCwgYWZ0ZXIgLSBpbmZvLmNsaWVudEhlaWdodCArIDMpOwp9CjwvdGV4dGFyZWE+PC9wPgoKICAgIDxwPjx0ZXh0YXJlYSBpZD0iY29kZS1qc29uIj5bCiB7CiAgX2lkOiAicG9zdCAxIiwKICAiYXV0aG9yIjogIkJvYiIsCiAgImNvbnRlbnQiOiAiLi4uIiwKICAicGFnZV92aWV3cyI6IDUKIH0sCiB7CiAgIl9pZCI6ICJwb3N0IDIiLAogICJhdXRob3IiOiAiQm9iIiwKICAiY29udGVudCI6ICIuLi4iLAogICJwYWdlX3ZpZXdzIjogOQogfSwKIHsKICAiX2lkIjogInBvc3QgMyIsCiAgImF1dGhvciI6ICJCb2IiLAogICJjb250ZW50IjogIi4uLiIsCiAgInBhZ2Vfdmlld3MiOiA4CiB9Cl0KPC90ZXh0YXJlYT48L3A+CgogICAgPHA+PHRleHRhcmVhIGlkPSJjb2RlLWNzcyI+QGNoYXJzZXQgIlVURi04IjsKCkBpbXBvcnQgdXJsKCJib295YS5jc3MiKSBwcmludCwgc2NyZWVuOwpAaW1wb3J0ICJ3aGF0dXAuY3NzIiBzY3JlZW47CkBpbXBvcnQgIndpY2tlZC5jc3MiOwoKLypFcnJvciovCkBjaGFyc2V0ICJVVEYtOCI7CgoKQG5hbWVzcGFjZSAiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI7CkBuYW1lc3BhY2Ugc3ZnICJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI7CgovKldhcm5pbmc6IGVtcHR5IHJ1bGVzZXQgKi8KLmZvbyB7Cn0KCmgxIHsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwp9CgovKldhcm5pbmc6IHF1YWxpZmllZCBoZWFkaW5nICovCi5mb28gaDEgewogICAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KCi8qV2FybmluZzogYWRqb2luaW5nIGNsYXNzZXMgKi8KLmZvby5iYXIgewogICAgem9vbTogMTsKfQoKbGkuaW5saW5lIHsKICAgIHdpZHRoOiAxMDAlOyAgLypXYXJuaW5nOiAxMDAlIGNhbiBiZSBwcm9ibGVtYXRpYyovCn0KCmxpLmxhc3QgewogIGRpc3BsYXk6IGlubGluZTsKICBwYWRkaW5nLWxlZnQ6IDNweCAhaW1wb3J0YW50OwogIHBhZGRpbmctcmlnaHQ6IDNweDsKICBib3JkZXItcmlnaHQ6IDBweDsKfQoKQG1lZGlhIHByaW50IHsKICAgIGxpLmlubGluZSB7CiAgICAgIGNvbG9yOiBibGFjazsKICAgIH0KfQoKQHBhZ2UgewogIG1hcmdpbjogMTAlOwogIGNvdW50ZXItaW5jcmVtZW50OiBwYWdlOwoKICBAdG9wLWNlbnRlciB7CiAgICBmb250LWZhbWlseTogc2Fucy1zZXJpZjsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgZm9udC1zaXplOiAyZW07CiAgICBjb250ZW50OiBjb3VudGVyKHBhZ2UpOwogIH0KfQo8L3RleHRhcmVhPjwvcD4KPHNjcmlwdD4KICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUtanMiKSwgewogICAgbGluZU51bWJlcnM6IHRydWUsCiAgICBtb2RlOiAiamF2YXNjcmlwdCIsCiAgICBndXR0ZXJzOiBbIkNvZGVNaXJyb3ItbGludC1tYXJrZXJzIl0sCiAgICBsaW50OiB0cnVlCiAgfSk7CgogIHZhciBlZGl0b3JfanNvbiA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlLWpzb24iKSwgewogICAgbGluZU51bWJlcnM6IHRydWUsCiAgICBtb2RlOiAiYXBwbGljYXRpb24vanNvbiIsCiAgICBndXR0ZXJzOiBbIkNvZGVNaXJyb3ItbGludC1tYXJrZXJzIl0sCiAgICBsaW50OiB0cnVlCiAgfSk7CiAgCiAgdmFyIGVkaXRvcl9jc3MgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZS1jc3MiKSwgewogICAgbGluZU51bWJlcnM6IHRydWUsCiAgICBtb2RlOiAiY3NzIiwKICAgIGd1dHRlcnM6IFsiQ29kZU1pcnJvci1saW50LW1hcmtlcnMiXSwKICAgIGxpbnQ6IHRydWUKICB9KTsKPC9zY3JpcHQ+CgogIDwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/demo/loadmode.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogTGF6eSBNb2RlIExvYWRpbmcgRGVtbzwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxzY3JpcHQgc3JjPSIuLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9hZGRvbi9tb2RlL2xvYWRtb2RlLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL21vZGUvbWV0YS5qcyI+PC9zY3JpcHQ+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICAgIC5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazt9CiAgICA8L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxoMT5Db2RlTWlycm9yPC9oMT48aW1nIGlkPWxvZ28gc3JjPSIuLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+TGF6eSBNb2RlIExvYWRpbmc8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPkxhenkgTW9kZSBMb2FkaW5nIERlbW88L2gyPgo8cCBzdHlsZT0iY29sb3I6IGdyYXkiPkN1cnJlbnQgbW9kZTogPHNwYW4gaWQ9Im1vZGVpbmZvIj50ZXh0L3BsYWluPC9zcGFuPjwvcD4KPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj5UaGlzIGlzIHRoZSBlZGl0b3IuCi8vIEl0IHN0YXJ0cyBvdXQgaW4gcGxhaW4gdGV4dCBtb2RlLAojICB1c2UgdGhlIGNvbnRyb2wgYmVsb3cgdG8gbG9hZCBhbmQgYXBwbHkgYSBtb2RlCiAgInlvdSdsbCBzZWUgdGhlIGhpZ2hsaWdodGluZyBvZiIgdGhpcyB0ZXh0IC8qY2hhbmdlKi8uCjwvdGV4dGFyZWE+PC9mb3JtPgo8cD5GaWxlbmFtZSwgbWltZSwgb3IgbW9kZSBuYW1lOiA8aW5wdXQgdHlwZT10ZXh0IHZhbHVlPWZvby5qcyBpZD1tb2RlPiA8YnV0dG9uIHR5cGU9YnV0dG9uIG9uY2xpY2s9ImNoYW5nZSgpIj5jaGFuZ2UgbW9kZTwvYnV0dG9uPjwvcD4KCiAgICA8c2NyaXB0PgpDb2RlTWlycm9yLm1vZGVVUkwgPSAiLi4vbW9kZS8lTi8lTi5qcyI7CnZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgbGluZU51bWJlcnM6IHRydWUKfSk7CnZhciBtb2RlSW5wdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibW9kZSIpOwpDb2RlTWlycm9yLm9uKG1vZGVJbnB1dCwgImtleXByZXNzIiwgZnVuY3Rpb24oZSkgewogIGlmIChlLmtleUNvZGUgPT0gMTMpIGNoYW5nZSgpOwp9KTsKZnVuY3Rpb24gY2hhbmdlKCkgewogIHZhciB2YWwgPSBtb2RlSW5wdXQudmFsdWUsIG0sIG1vZGUsIHNwZWM7CiAgaWYgKG0gPSAvLitcLihbXi5dKykkLy5leGVjKHZhbCkpIHsKICAgIHZhciBpbmZvID0gQ29kZU1pcnJvci5maW5kTW9kZUJ5RXh0ZW5zaW9uKG1bMV0pOwogICAgaWYgKGluZm8pIHsKICAgICAgbW9kZSA9IGluZm8ubW9kZTsKICAgICAgc3BlYyA9IGluZm8ubWltZTsKICAgIH0KICB9IGVsc2UgaWYgKC9cLy8udGVzdCh2YWwpKSB7CiAgICB2YXIgaW5mbyA9IENvZGVNaXJyb3IuZmluZE1vZGVCeU1JTUUodmFsKTsKICAgIGlmIChpbmZvKSB7CiAgICAgIG1vZGUgPSBpbmZvLm1vZGU7CiAgICAgIHNwZWMgPSB2YWw7CiAgICB9CiAgfSBlbHNlIHsKICAgIG1vZGUgPSBzcGVjID0gdmFsOwogIH0KICBpZiAobW9kZSkgewogICAgZWRpdG9yLnNldE9wdGlvbigibW9kZSIsIHNwZWMpOwogICAgQ29kZU1pcnJvci5hdXRvTG9hZE1vZGUoZWRpdG9yLCBtb2RlKTsKICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJtb2RlaW5mbyIpLnRleHRDb250ZW50ID0gc3BlYzsKICB9IGVsc2UgewogICAgYWxlcnQoIkNvdWxkIG5vdCBmaW5kIGEgbW9kZSBjb3JyZXNwb25kaW5nIHRvICIgKyB2YWwpOwogIH0KfQo8L3NjcmlwdD4KICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/demo/marker.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogQnJlYWtwb2ludCBEZW1vPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL21vZGUvamF2YXNjcmlwdC9qYXZhc2NyaXB0LmpzIj48L3NjcmlwdD4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KICAgICAgLmJyZWFrcG9pbnRzIHt3aWR0aDogLjhlbTt9CiAgICAgIC5icmVha3BvaW50IHsgY29sb3I6ICM4MjI7IH0KICAgICAgLkNvZGVNaXJyb3Ige2JvcmRlcjogMXB4IHNvbGlkICNhYWE7fQogICAgPC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aDE+Q29kZU1pcnJvcjwvaDE+PGltZyBpZD1sb2dvIHNyYz0iLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPkJyZWFrcG9pbnQ8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPkJyZWFrcG9pbnQgRGVtbzwvaDI+Cjxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+CnZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgbGluZU51bWJlcnM6IHRydWUsCiAgZ3V0dGVyczogWyJDb2RlTWlycm9yLWxpbmVudW1iZXJzIiwgImJyZWFrcG9pbnRzIl0KfSk7CmVkaXRvci5vbigiZ3V0dGVyQ2xpY2siLCBmdW5jdGlvbihjbSwgbikgewogIHZhciBpbmZvID0gY20ubGluZUluZm8obik7CiAgY20uc2V0R3V0dGVyTWFya2VyKG4sICJicmVha3BvaW50cyIsIGluZm8uZ3V0dGVyTWFya2VycyA/IG51bGwgOiBtYWtlTWFya2VyKCkpOwp9KTsKCmZ1bmN0aW9uIG1ha2VNYXJrZXIoKSB7CiAgdmFyIG1hcmtlciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogIG1hcmtlci5zdHlsZS5jb2xvciA9ICIjODIyIjsKICBtYXJrZXIuaW5uZXJIVE1MID0gIuKXjyI7CiAgcmV0dXJuIG1hcmtlcjsKfQo8L3RleHRhcmVhPjwvZm9ybT4KCjxwPkNsaWNrIHRoZSBsaW5lLW51bWJlciBndXR0ZXIgdG8gYWRkIG9yIHJlbW92ZSAnYnJlYWtwb2ludHMnLjwvcD4KCiAgICA8c2NyaXB0PmV2YWwoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKS52YWx1ZSk7PC9zY3JpcHQ+CgogIDwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/demo/markselection.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogU2VsZWN0aW9uIE1hcmtpbmcgRGVtbzwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxzY3JpcHQgc3JjPSIuLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9hZGRvbi9zZWFyY2gvc2VhcmNoY3Vyc29yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL2FkZG9uL3NlbGVjdGlvbi9tYXJrLXNlbGVjdGlvbi5qcyI+PC9zY3JpcHQ+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICAgIC5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazt9CiAgICAgIC5Db2RlTWlycm9yLXNlbGVjdGVkICB7IGJhY2tncm91bmQtY29sb3I6IGJsdWUgIWltcG9ydGFudDsgfQogICAgICAuQ29kZU1pcnJvci1zZWxlY3RlZHRleHQgeyBjb2xvcjogd2hpdGU7IH0KICAgICAgLnN0eWxlZC1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZC1jb2xvcjogI2ZmNzsgfQogICAgPC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aDE+Q29kZU1pcnJvcjwvaDE+PGltZyBpZD1sb2dvIHNyYz0iLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPlNlbGVjdGlvbiBNYXJraW5nPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5TZWxlY3Rpb24gTWFya2luZyBEZW1vPC9oMj4KPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KU2VsZWN0IHNvbWV0aGluZyBmcm9tIGhlcmUuIFlvdSdsbCBzZWUgdGhhdCB0aGUgc2VsZWN0aW9uJ3MgZm9yZWdyb3VuZApjb2xvciBjaGFuZ2VzIHRvIHdoaXRlISBTaW5jZSwgYnkgZGVmYXVsdCwgQ29kZU1pcnJvciBvbmx5IHB1dHMgYW4KaW5kZXBlbmRlbnQgIm1hcmtlciIgbGF5ZXIgYmVoaW5kIHRoZSB0ZXh0LCB5b3UnbGwgbmVlZCBzb21ldGhpbmcgbGlrZQp0aGlzIHRvIGNoYW5nZSBpdHMgY29sb3VyLgoKQWxzbyBub3RpY2UgdGhhdCB0dXJuaW5nIHRoaXMgYWRkb24gb24gKHdpdGggdGhlIGRlZmF1bHQgc3R5bGUpIGFsbG93cwp5b3UgdG8gc2FmZWx5IGdpdmUgdGV4dCBhIGJhY2tncm91bmQgY29sb3Igd2l0aG91dCBzY3Jld2luZyB1cCB0aGUKdmlzaWJpbGl0eSBvZiB0aGUgc2VsZWN0aW9uLjwvdGV4dGFyZWE+PC9mb3JtPgoKICAgIDxzY3JpcHQ+CnZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgbGluZU51bWJlcnM6IHRydWUsCiAgc3R5bGVTZWxlY3RlZFRleHQ6IHRydWUKfSk7CmVkaXRvci5tYXJrVGV4dCh7bGluZTogNiwgY2g6IDI2fSwge2xpbmU6IDYsIGNoOiA0Mn0sIHtjbGFzc05hbWU6ICJzdHlsZWQtYmFja2dyb3VuZCJ9KTsKPC9zY3JpcHQ+CgogICAgPHA+U2ltcGxlIGFkZG9uIHRvIGVhc2lseSBtYXJrIChhbmQgc3R5bGUpIHNlbGVjdGVkIHRleHQuIDxhIGhyZWY9Ii4uL2RvYy9tYW51YWwuaHRtbCNhZGRvbl9tYXJrLXNlbGVjdGlvbiI+RG9jczwvYT4uPC9wPgoKICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/demo/matchhighlighter.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogTWF0Y2ggSGlnaGxpZ2h0ZXIgRGVtbzwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxzY3JpcHQgc3JjPSIuLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9hZGRvbi9zY3JvbGwvYW5ub3RhdGVzY3JvbGxiYXIuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vYWRkb24vc2VhcmNoL21hdGNoZXNvbnNjcm9sbGJhci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9hZGRvbi9zZWFyY2gvc2VhcmNoY3Vyc29yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL2FkZG9uL3NlYXJjaC9tYXRjaC1oaWdobGlnaHRlci5qcyI+PC9zY3JpcHQ+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICAgIC5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazt9CiAgICAgIC5Db2RlTWlycm9yLWZvY3VzZWQgLmNtLW1hdGNoaGlnaGxpZ2h0IHsKICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBSUFBQUFDQ0FZQUFBQnl0ZzBrQUFBQUZrbEVRVlFJMTJOZ1lHQmdrS3pjOHg5Q01EQXdBQUFtaHdTYmlkRW9TUUFBQUFCSlJVNUVya0pnZ2c9PSk7CiAgICAgICAgYmFja2dyb3VuZC1wb3NpdGlvbjogYm90dG9tOwogICAgICAgIGJhY2tncm91bmQtcmVwZWF0OiByZXBlYXQteDsKICAgICAgfQogICAgICAuY20tbWF0Y2hoaWdobGlnaHQge2JhY2tncm91bmQtY29sb3I6IGxpZ2h0Z3JlZW59CiAgICAgIC5Db2RlTWlycm9yLXNlbGVjdGlvbi1oaWdobGlnaHQtc2Nyb2xsYmFyIHtiYWNrZ3JvdW5kLWNvbG9yOiBncmVlbn0KICAgIDwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGgxPkNvZGVNaXJyb3I8L2gxPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5NYXRjaCBIaWdobGlnaHRlcjwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+TWF0Y2ggSGlnaGxpZ2h0ZXIgRGVtbzwvaDI+Cjxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+U2VsZWN0IHRoaXMgdGV4dDogaGFyZHRvc3BvdAogIEFuZCBldmVyeXdoZXJlIGVsc2UgaW4geW91ciBjb2RlIHdoZXJlIGhhcmR0b3Nwb3QgYXBwZWFycyB3aWxsCmF1dG9tYXRpY2FsbHkgaWxsdW1pbmF0ZS4gIEdpdmUgaXQgYSB0cnkhICBObyBtb3JlIGhhcmQgdG8gc3BvdAp2YXJpYWJsZXMgLSBzdGF5IGluIGNvbnRleHQgb2YgeW91ciBjb2RlIGFsbCB0aGUgdGltZS4KCkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCBjb25zZWN0ZXR1ciBhZGlwaXNjaW5nIGVsaXQuIFV0IHBoYXJldHJhCmludGVyZHVtIGR1aSBldSBwdWx2aW5hci4gTWF1cmlzIG1heGltdXMgbGlndWxhIHZlbmVuYXRpcyB0ZW1wdXMKaW50ZXJkdW0uIENyYXMgaGVuZHJlcml0LCBpcHN1bSBzZWQgdWx0cmljZXMgcGhhcmV0cmEsIGxpZ3VsYSBkaWFtCnBvcnR0aXRvciBsYWN1cywgYWMgdGVtcG9yIGVyb3MgZXN0IGEgbWFzc2EuIE5hbSBvcmNpIGVsaXQsIHZ1bHB1dGF0ZQppbiB0cmlzdGlxdWUgcXVpcywgY29uc2VjdGV0dXIgdml0YWUgbWV0dXMuIFBlbGxlbnRlc3F1ZSBldCBlbmltCmVsZW1lbnR1bSwgbG9ib3J0aXMgYXVndWUgaW4sIGxhY2luaWEgc2FwaWVuLiBNb3JiaSBldSBudW5jIHNlbXBlciwKc2FnaXR0aXMgZmVsaXMgYSwgcGVsbGVudGVzcXVlIG1hdXJpcy4gTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsCmNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdC4gQWVuZWFuIHF1aXMgZGlhbSB0dXJwaXMuCgpGdXNjZSBsb2JvcnRpcyBuaXNsIHF1aXMgYWxpcXVldCBldWlzbW9kLiBBZW5lYW4gdml0YWUgbnVsbGEgbm9uIGlwc3VtCmVmZmljaXR1ciBzY2VsZXJpc3F1ZS4gQ3VyYWJpdHVyIGF1Y3RvciwgbG9yZW0gbm9uIHJob25jdXMgcG9ydHRpdG9yLAphdWd1ZSBsaWd1bGEgbGFjaW5pYSBkb2xvciwgZXQgdmVoaWN1bGEgbWFnbmEgbG9yZW0gaW1wZXJkaWV0IHZlbGl0LgpGdXNjZSByaXN1cyBzZW0sIGhhcmR0b3Nwb3QgY29tbW9kbyBlbGVpZmVuZCBoZW5kcmVyaXQgdml0YWUsIG1vbGxpcwpxdWlzIHJpc3VzLiBDcmFzIHRpbmNpZHVudCwganVzdG8gdml0YWUgaGVuZHJlcml0IHZlbmVuYXRpcywgdXJuYQpkb2xvciBwbGFjZXJhdCB0b3J0b3IsIGV1IGxvYm9ydGlzIGxlY3R1cyBkb2xvciBpbiBsaWd1bGEuIE51bGxhbSBub24KZXJhdCBub24gbmlzbCB2dWxwdXRhdGUgdWx0cmljZXMgc2l0IGFtZXQgdmVzdGlidWx1bSBkb2xvci4gUXVpc3F1ZSBpbgp0b3J0b3IgcG9ydGEsIHBlbGxlbnRlc3F1ZSBvZGlvIG5lYywgbWFsZXN1YWRhIG5pYmguCgpJbiBhIGR1aSBmZXVnaWF0LCB1bGxhbWNvcnBlciB1cm5hIGluLCBhY2N1bXNhbiBtYWduYS4gRG9uZWMgZWdlc3RhcwpzZW0gbmVjIGVyb3MgcmhvbmN1cywgdmVsIGdyYXZpZGEgcHVydXMgb3JuYXJlLiBOdWxsYSBvcmNpIG1hdXJpcywKcG9ydGEgbmVjIHBoYXJldHJhIHNlZCwgb3JuYXJlIGV0IGxvcmVtLiBEb25lYyBsdWN0dXMgdHVycGlzIG51bmMsCmVnZXQgZGljdHVtIGZlbGlzIG1vbGxpcyBldC4gIFNlZCBzb2RhbGVzIGhhcmR0b3Nwb3QgbnVuYyB2aXRhZSBsZW8KcmhvbmN1cyBpbXBlcmRpZXQuIERvbmVjIGVsZW1lbnR1bSBtYWxlc3VhZGEgdmVsaXQgcXVpcyBwbGFjZXJhdC4KUHJvaW4gYWNjdW1zYW4gbG9yZW0gaWQgbmlzaSB2b2x1dHBhdCB1bGxhbWNvcnBlci4gVml2YW11cyBsYW9yZWV0CmRvbG9yIGFjIHNlbSBtYWxlc3VhZGEsIGFjIHNjZWxlcmlzcXVlIGV4IGVmZmljaXR1ci4gQWxpcXVhbSB0ZW1wdXMKbGliZXJvIHZlbGl0LCB2ZWwgdHJpc3RpcXVlIGF1Z3VlIHZ1bHB1dGF0ZSBuZWMuCgpNYXVyaXMgdWx0cmljZXMgbGVvIGZlbGlzLCBzaXQgYW1ldCBjb25ndWUgYXVndWUgYWxpcXVhbSBjb25kaW1lbnR1bS4KVml2YW11cyBwdXJ1cyBsZW8sIG1hdHRpcyB2aXRhZSBkaWduaXNzaW0gdmVsLCB1bHRyaWNpZXMgYWMgZXguIE1hdXJpcwpldSBkb2xvciBldSBwdXJ1cyB1bHRyaWNpZXMgdWx0cmljZXMuIFNlZCBldWlzbW9kIGZldWdpYXQgZXggZXQKbWF0dGlzLiBNb3JiaSBjdXJzdXMgbGFvcmVldCBwaGFyZXRyYS4gRG9uZWMgZXUgZG9sb3Igc29kYWxlcywKdWx0cmljaWVzIG5pc2kgZXQsIG1hbGVzdWFkYSB1cm5hLiAgUHJhZXNlbnQgc2l0IGFtZXQgZnJpbmdpbGxhIGZlbGlzLgpOYW0gcmhvbmN1cywgZXN0IGJsYW5kaXQgYXVjdG9yIGF1Y3RvciwgbG9yZW0gaXBzdW0gbGFvcmVldCBpcHN1bSwKcXVpcyBzb2RhbGVzIGxpYmVybyBvZGlvIGluIGxvcmVtLiBQaGFzZWxsdXMgb2RpbyBkb2xvciwgZWxlbWVudHVtCnNhZ2l0dGlzIG5pYmggbm9uLCBmZXJtZW50dW0gc2VtcGVyIGxpYmVyby4gTWF1cmlzIGhlbmRyZXJpdApoYXJkdG9zcG90IGxlY3R1cyBzaXQgYW1ldCBjb21tb2RvIGVsZWlmZW5kLiBNb3JiaSBwdWx2aW5hciBlZ2V0IG5pc2wKYXQgZWxlaWZlbmQuIEZ1c2NlIGVnZXQgcG9ydGEgZXJhdCwgdml0YWUgbG9ib3J0aXMgbGliZXJvLgoKUGhhc2VsbHVzIHNpdCBhbWV0IG1hc3NhIGluIG1hc3NhIHBoYXJldHJhIG1hbGVzdWFkYS4gVmVzdGlidWx1bSBhdApxdWFtIHZlbCBsaWJlcm8gYWxpcXVhbSB2b2x1dHBhdCBhdCB1dCBkdWkuIFByYWVzZW50IHNjZWxlcmlzcXVlIHZlbAptYXVyaXMgc2l0IGFtZXQgdmVoaWN1bGEuIFBoYXNlbGx1cyBhdCBtaSBuZWMgbGlndWxhIGN1cnN1cyBpbnRlcmR1bQpzaXQgYW1ldCBub24gcXVhbS4gQWxpcXVhbSB0ZW1wdXMgc29sbGljaXR1ZGluIGV1aXNtb2QuIE51bGxhIGV1aXNtb2QKbW9sbGlzIGVuaW0gdGluY2lkdW50IHBsYWNlcmF0LiAgUHJvaW4gYWMgc2NlbGVyaXNxdWUgZW5pbSwgcXVpcwpzb2xsaWNpdHVkaW4gbWV0dXMuIFBlbGxlbnRlc3F1ZSBjb25ndWUgbmVjIHNhcGllbiB1dCByaG9uY3VzLiBTZWQKZWdldCBvcm5hcmUgZGlhbSwgdXQgY29uc2VjdGV0dXIgYW50ZS4gQWVuZWFuIGVsZWlmZW5kIG1hdXJpcyBxdWlzCm9ybmFyZSBhY2N1bXNhbi4gSW4gaGFjIGhhYml0YXNzZSBoYXJkdG9zcG90IHBsYXRlYSBkaWN0dW1zdC4KCjwvdGV4dGFyZWE+PC9mb3JtPgoKICAgIDxzY3JpcHQ+CnZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgbGluZU51bWJlcnM6IHRydWUsCiAgLy8gVG8gaGlnaGxpZ2h0IG9uIHNjcm9sbGJhcnMgYXMgd2VsbCwgcGFzcyBhbm5vdGF0ZVNjcm9sbGJhciBpbiBvcHRpb25zCiAgLy8gYXMgYmVsb3cuCiAgaGlnaGxpZ2h0U2VsZWN0aW9uTWF0Y2hlczoge3Nob3dUb2tlbjogL1x3LywgYW5ub3RhdGVTY3JvbGxiYXI6IHRydWV9Cn0pOwo8L3NjcmlwdD4KCiAgICA8cD5TZWFyY2ggYW5kIGhpZ2hsaWdodCBvY2N1cmVuY2VzIG9mIHRoZSBzZWxlY3RlZCB0ZXh0LjwvcD4KCiAgPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/demo/matchtags.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogVGFnIE1hdGNoZXIgRGVtbzwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxzY3JpcHQgc3JjPSIuLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9hZGRvbi9mb2xkL3htbC1mb2xkLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL2FkZG9uL2VkaXQvbWF0Y2h0YWdzLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL21vZGUveG1sL3htbC5qcyI+PC9zY3JpcHQ+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICAgIC5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazt9CiAgICA8L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxoMT5Db2RlTWlycm9yPC9oMT48aW1nIGlkPWxvZ28gc3JjPSIuLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+VGFnIE1hdGNoZXI8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPlRhZyBNYXRjaGVyIERlbW88L2gyPgoKCiAgICA8ZGl2IGlkPSJlZGl0b3IiPjwvZGl2PgoKICAgIDxzY3JpcHQ+CndpbmRvdy5vbmxvYWQgPSBmdW5jdGlvbigpIHsKICBlZGl0b3IgPSBDb2RlTWlycm9yKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJlZGl0b3IiKSwgewogICAgdmFsdWU6ICI8aHRtbD5cbiAgIiArIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5pbm5lckhUTUwgKyAiXG48L2h0bWw+IiwKICAgIG1vZGU6ICJ0ZXh0L2h0bWwiLAogICAgbWF0Y2hUYWdzOiB7Ym90aFRhZ3M6IHRydWV9LAogICAgZXh0cmFLZXlzOiB7IkN0cmwtSiI6ICJ0b01hdGNoaW5nVGFnIn0KICB9KTsKfTsKICAgIDwvc2NyaXB0PgoKICAgIDxwPlB1dCB0aGUgY3Vyc29yIG9uIG9yIGluc2lkZSBhIHBhaXIgb2YgdGFncyB0byBoaWdobGlnaHQgdGhlbS4KICAgIFByZXNzIEN0cmwtSiB0byBqdW1wIHRvIHRoZSB0YWcgdGhhdCBtYXRjaGVzIHRoZSBvbmUgdW5kZXIgdGhlCiAgICBjdXJzb3IuPC9wPgogIDwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/demo/merge.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogbWVyZ2UgdmlldyBkZW1vPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uL2FkZG9uL21lcmdlL21lcmdlLmNzcyI+CjxzY3JpcHQgc3JjPSIuLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9tb2RlL3htbC94bWwuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vbW9kZS9jc3MvY3NzLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL21vZGUvamF2YXNjcmlwdC9qYXZhc2NyaXB0LmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL21vZGUvaHRtbG1peGVkL2h0bWxtaXhlZC5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9kaWZmX21hdGNoX3BhdGNoLzIwMTIxMTE5L2RpZmZfbWF0Y2hfcGF0Y2guanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vYWRkb24vbWVyZ2UvbWVyZ2UuanMiPjwvc2NyaXB0Pgo8c3R5bGU+CiAgICAuQ29kZU1pcnJvciB7IGxpbmUtaGVpZ2h0OiAxLjI7IH0KICAgIEBtZWRpYSBzY3JlZW4gYW5kIChtaW4td2lkdGg6IDEzMDBweCkgewogICAgICBhcnRpY2xlIHsgbWF4LXdpZHRoOiAxMDAwcHg7IH0KICAgICAgI25hdiB7IGJvcmRlci1yaWdodDogNDk5cHggc29saWQgdHJhbnNwYXJlbnQ7IH0KICAgIH0KICAgIHNwYW4uY2xpY2t5IHsKICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICBiYWNrZ3JvdW5kOiAjZDcwOwogICAgICBjb2xvcjogd2hpdGU7CiAgICAgIHBhZGRpbmc6IDAgM3B4OwogICAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICB9CiAgPC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aDE+Q29kZU1pcnJvcjwvaDE+PGltZyBpZD1sb2dvIHNyYz0iLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPm1lcmdlIHZpZXc8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPm1lcmdlIHZpZXcgZGVtbzwvaDI+CgoKPGRpdiBpZD12aWV3PjwvZGl2PgoKPHA+VGhlIDxhIGhyZWY9Ii4uL2RvYy9tYW51YWwuaHRtbCNhZGRvbl9tZXJnZSI+PGNvZGU+bWVyZ2U8L2NvZGU+PC9hPgphZGRvbiBwcm92aWRlcyBhbiBpbnRlcmZhY2UgZm9yIGRpc3BsYXlpbmcgYW5kIG1lcmdpbmcgZGlmZnMsCmVpdGhlciA8c3BhbiBjbGFzcz1jbGlja3kgb25jbGljaz0icGFuZXMgPSAyOyBpbml0VUkoKSI+dHdvLXdheTwvc3Bhbj4Kb3IgPHNwYW4gY2xhc3M9Y2xpY2t5IG9uY2xpY2s9InBhbmVzID0gMzsgaW5pdFVJKCkiPnRocmVlLXdheTwvc3Bhbj4uClRoZSBsZWZ0IChvciBjZW50ZXIpIHBhbmUgaXMgZWRpdGFibGUsIGFuZCB0aGUgZGlmZmVyZW5jZXMgd2l0aCB0aGUKb3RoZXIgcGFuZShzKSBhcmUgPHNwYW4gY2xhc3M9Y2xpY2t5Cm9uY2xpY2s9InRvZ2dsZURpZmZlcmVuY2VzKCkiPm9wdGlvbmFsbHk8L3NwYW4+IHNob3duIGxpdmUgYXMgeW91IGVkaXQKaXQuIEluIHRoZSB0d28td2F5IGNvbmZpZ3VyYXRpb24sIHRoZXJlIGFyZSBhbHNvIG9wdGlvbnMgdG8gcGFkIGNoYW5nZWQKc2VjdGlvbnMgdG8gPHNwYW4gY2xhc3M9Y2xpY2t5IG9uY2xpY2s9ImNvbm5lY3QgPSBjb25uZWN0ID8gbnVsbCA6CidhbGlnbic7IGluaXRVSSgpIj5hbGlnbjwvc3Bhbj4gdGhlbSwgYW5kIHRvIDxzcGFuIGNsYXNzPWNsaWNreQpvbmNsaWNrPSJjb2xsYXBzZSA9ICFjb2xsYXBzZTsgaW5pdFVJKCkiPmNvbGxhcHNlPC9zcGFuPiB1bmNoYW5nZWQKc3RyZXRjaGVzIG9mIHRleHQuPC9wPgoKPHA+VGhpcyBhZGRvbiBkZXBlbmRzIG9uCnRoZSA8YSBocmVmPSJodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2dvb2dsZS1kaWZmLW1hdGNoLXBhdGNoLyI+Z29vZ2xlLWRpZmYtbWF0Y2gtcGF0Y2g8L2E+CmxpYnJhcnkgdG8gY29tcHV0ZSB0aGUgZGlmZnMuPC9wPgoKPHNjcmlwdD4KdmFyIHZhbHVlLCBvcmlnMSwgb3JpZzIsIGR2LCBwYW5lcyA9IDIsIGhpZ2hsaWdodCA9IHRydWUsIGNvbm5lY3QgPSBudWxsLCBjb2xsYXBzZSA9IGZhbHNlOwpmdW5jdGlvbiBpbml0VUkoKSB7CiAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybjsKICB2YXIgdGFyZ2V0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInZpZXciKTsKICB0YXJnZXQuaW5uZXJIVE1MID0gIiI7CiAgZHYgPSBDb2RlTWlycm9yLk1lcmdlVmlldyh0YXJnZXQsIHsKICAgIHZhbHVlOiB2YWx1ZSwKICAgIG9yaWdMZWZ0OiBwYW5lcyA9PSAzID8gb3JpZzEgOiBudWxsLAogICAgb3JpZzogb3JpZzIsCiAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgIG1vZGU6ICJ0ZXh0L2h0bWwiLAogICAgaGlnaGxpZ2h0RGlmZmVyZW5jZXM6IGhpZ2hsaWdodCwKICAgIGNvbm5lY3Q6IGNvbm5lY3QsCiAgICBjb2xsYXBzZUlkZW50aWNhbDogY29sbGFwc2UKICB9KTsKfQoKZnVuY3Rpb24gdG9nZ2xlRGlmZmVyZW5jZXMoKSB7CiAgZHYuc2V0U2hvd0RpZmZlcmVuY2VzKGhpZ2hsaWdodCA9ICFoaWdobGlnaHQpOwp9Cgp3aW5kb3cub25sb2FkID0gZnVuY3Rpb24oKSB7CiAgdmFsdWUgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuaW5uZXJIVE1MOwogIG9yaWcxID0gIjwhZG9jdHlwZSBodG1sPlxuXG4iICsgdmFsdWUucmVwbGFjZSgvXC5cLlwvL2csICJjb2RlbWlycm9yLyIpLnJlcGxhY2UoInllbGxvdyIsICJvcmFuZ2UiKTsKICBvcmlnMiA9IHZhbHVlLnJlcGxhY2UoL1x1MDAzY3NjcmlwdC9nLCAiXHUwMDNjc2NyaXB0IHR5cGU9dGV4dC9qYXZhc2NyaXB0ICIpCiAgICAucmVwbGFjZSgid2hpdGUiLCAicHVycGxlO1xuICAgICAgZm9udDogY29taWMgc2FucztcbiAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xuICAgICAgaGVpZ2h0OiAxNWVtIik7CiAgaW5pdFVJKCk7Cn07CgpmdW5jdGlvbiBtZXJnZVZpZXdIZWlnaHQobWVyZ2VWaWV3KSB7CiAgZnVuY3Rpb24gZWRpdG9ySGVpZ2h0KGVkaXRvcikgewogICAgaWYgKCFlZGl0b3IpIHJldHVybiAwOwogICAgcmV0dXJuIGVkaXRvci5nZXRTY3JvbGxJbmZvKCkuaGVpZ2h0OwogIH0KICByZXR1cm4gTWF0aC5tYXgoZWRpdG9ySGVpZ2h0KG1lcmdlVmlldy5sZWZ0T3JpZ2luYWwoKSksCiAgICAgICAgICAgICAgICAgIGVkaXRvckhlaWdodChtZXJnZVZpZXcuZWRpdG9yKCkpLAogICAgICAgICAgICAgICAgICBlZGl0b3JIZWlnaHQobWVyZ2VWaWV3LnJpZ2h0T3JpZ2luYWwoKSkpOwp9CgpmdW5jdGlvbiByZXNpemUobWVyZ2VWaWV3KSB7CiAgdmFyIGhlaWdodCA9IG1lcmdlVmlld0hlaWdodChtZXJnZVZpZXcpOwogIGZvcig7OykgewogICAgaWYgKG1lcmdlVmlldy5sZWZ0T3JpZ2luYWwoKSkKICAgICAgbWVyZ2VWaWV3LmxlZnRPcmlnaW5hbCgpLnNldFNpemUobnVsbCwgaGVpZ2h0KTsKICAgIG1lcmdlVmlldy5lZGl0b3IoKS5zZXRTaXplKG51bGwsIGhlaWdodCk7CiAgICBpZiAobWVyZ2VWaWV3LnJpZ2h0T3JpZ2luYWwoKSkKICAgICAgbWVyZ2VWaWV3LnJpZ2h0T3JpZ2luYWwoKS5zZXRTaXplKG51bGwsIGhlaWdodCk7CgogICAgdmFyIG5ld0hlaWdodCA9IG1lcmdlVmlld0hlaWdodChtZXJnZVZpZXcpOwogICAgaWYgKG5ld0hlaWdodCA+PSBoZWlnaHQpIGJyZWFrOwogICAgZWxzZSBoZWlnaHQgPSBuZXdIZWlnaHQ7CiAgfQogIG1lcmdlVmlldy53cmFwLnN0eWxlLmhlaWdodCA9IGhlaWdodCArICJweCI7Cn0KPC9zY3JpcHQ+CjwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/demo/multiplex.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogTXVsdGlwbGV4aW5nIFBhcnNlciBEZW1vPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL2FkZG9uL21vZGUvbXVsdGlwbGV4LmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL21vZGUveG1sL3htbC5qcyI+PC9zY3JpcHQ+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICAgIC5Db2RlTWlycm9yIHtib3JkZXI6IDFweCBzb2xpZCBibGFjazt9CiAgICAgIC5jbS1kZWxpbWl0IHtjb2xvcjogI2ZhNDt9CiAgICA8L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxoMT5Db2RlTWlycm9yPC9oMT48aW1nIGlkPWxvZ28gc3JjPSIuLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+TXVsdGlwbGV4aW5nIFBhcnNlcjwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+TXVsdGlwbGV4aW5nIFBhcnNlciBEZW1vPC9oMj4KPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KPGh0bWw+CiAgPGJvZHkgc3R5bGU9Ijw8bWFnaWM+PiI+CiAgICA8aDE+PDwgdGhpcyBpcyBub3QgPGh0bWwgPj48L2gxPgogICAgPDwKICAgICAgICBtdWx0aWxpbmUKICAgICAgICBub3QgaHRtbAogICAgICAgIGF0IGFsbCA6ICZhbXA7YW1wOyA8bGluay8+CiAgICA+PgogICAgPHA+dGhpcyBpcyBodG1sIGFnYWluPC9wPgogIDwvYm9keT4KPC9odG1sPgo8L3RleHRhcmVhPjwvZm9ybT4KCiAgICA8c2NyaXB0PgpDb2RlTWlycm9yLmRlZmluZU1vZGUoImRlbW8iLCBmdW5jdGlvbihjb25maWcpIHsKICByZXR1cm4gQ29kZU1pcnJvci5tdWx0aXBsZXhpbmdNb2RlKAogICAgQ29kZU1pcnJvci5nZXRNb2RlKGNvbmZpZywgInRleHQvaHRtbCIpLAogICAge29wZW46ICI8PCIsIGNsb3NlOiAiPj4iLAogICAgIG1vZGU6IENvZGVNaXJyb3IuZ2V0TW9kZShjb25maWcsICJ0ZXh0L3BsYWluIiksCiAgICAgZGVsaW1TdHlsZTogImRlbGltaXQifQogICAgLy8gLi4gbW9yZSBtdWx0aXBsZXhlZCBzdHlsZXMgY2FuIGZvbGxvdyBoZXJlCiAgKTsKfSk7CnZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgbW9kZTogImRlbW8iLAogIGxpbmVOdW1iZXJzOiB0cnVlLAogIGxpbmVXcmFwcGluZzogdHJ1ZQp9KTsKPC9zY3JpcHQ+CgogICAgPHA+RGVtb25zdHJhdGlvbiBvZiBhIG11bHRpcGxleGluZyBtb2RlLCB3aGljaCwgYXQgY2VydGFpbgogICAgYm91bmRhcnkgc3RyaW5ncywgc3dpdGNoZXMgdG8gb25lIG9yIG1vcmUgaW5uZXIgbW9kZXMuIFRoZSBvdXQKICAgIChIVE1MKSBtb2RlIGRvZXMgbm90IGdldCBmZWQgdGhlIGNvbnRlbnQgb2YgdGhlIDxjb2RlPiZsdDsmbHQ7CiAgICA+PjwvY29kZT4gYmxvY2tzLiBTZWUKICAgIHRoZSA8YSBocmVmPSIuLi9kb2MvbWFudWFsLmh0bWwjYWRkb25fbXVsdGlwbGV4Ij5tYW51YWw8L2E+IGFuZAogICAgdGhlIDxhIGhyZWY9Ii4uL2FkZG9uL21vZGUvbXVsdGlwbGV4LmpzIj5zb3VyY2U8L2E+IGZvciBtb3JlCiAgICBpbmZvcm1hdGlvbi48L3A+CgogICAgPHA+CiAgICAgIDxzdHJvbmc+UGFyc2luZy9IaWdobGlnaHRpbmcgVGVzdHM6PC9zdHJvbmc+CiAgICAgIDxhIGhyZWY9Ii4uL3Rlc3QvaW5kZXguaHRtbCNtdWx0aXBsZXhpbmdfKiI+bm9ybWFsPC9hPiwKICAgICAgPGEgaHJlZj0iLi4vdGVzdC9pbmRleC5odG1sI3ZlcmJvc2UsbXVsdGlwbGV4aW5nXyoiPnZlcmJvc2U8L2E+LgogICAgPC9wPgoKICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/demo/mustache.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogT3ZlcmxheSBQYXJzZXIgRGVtbzwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxzY3JpcHQgc3JjPSIuLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9hZGRvbi9tb2RlL292ZXJsYXkuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vbW9kZS94bWwveG1sLmpzIj48L3NjcmlwdD4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KICAgICAgLkNvZGVNaXJyb3Ige2JvcmRlcjogMXB4IHNvbGlkIGJsYWNrO30KICAgICAgLmNtLW11c3RhY2hlIHtjb2xvcjogIzBjYTt9Cjwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGgxPkNvZGVNaXJyb3I8L2gxPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5PdmVybGF5IFBhcnNlcjwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+T3ZlcmxheSBQYXJzZXIgRGVtbzwvaDI+Cjxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+CjxodG1sPgogIDxib2R5PgogICAgPGgxPnt7dGl0bGV9fTwvaDE+CiAgICA8cD5UaGVzZSBhcmUgbGlua3MgdG8ge3t0aGluZ3N9fTo8L3A+CiAgICA8dWw+e3sjbGlua3N9fQogICAgICA8bGk+PGEgaHJlZj0ie3t1cmx9fSI+e3t0ZXh0fX08L2E+PC9saT4KICAgIHt7L2xpbmtzfX08L3VsPgogIDwvYm9keT4KPC9odG1sPgo8L3RleHRhcmVhPjwvZm9ybT4KCiAgICA8c2NyaXB0PgpDb2RlTWlycm9yLmRlZmluZU1vZGUoIm11c3RhY2hlIiwgZnVuY3Rpb24oY29uZmlnLCBwYXJzZXJDb25maWcpIHsKICB2YXIgbXVzdGFjaGVPdmVybGF5ID0gewogICAgdG9rZW46IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgdmFyIGNoOwogICAgICBpZiAoc3RyZWFtLm1hdGNoKCJ7eyIpKSB7CiAgICAgICAgd2hpbGUgKChjaCA9IHN0cmVhbS5uZXh0KCkpICE9IG51bGwpCiAgICAgICAgICBpZiAoY2ggPT0gIn0iICYmIHN0cmVhbS5uZXh0KCkgPT0gIn0iKSB7CiAgICAgICAgICAgIHN0cmVhbS5lYXQoIn0iKTsKICAgICAgICAgICAgcmV0dXJuICJtdXN0YWNoZSI7CiAgICAgICAgICB9CiAgICAgIH0KICAgICAgd2hpbGUgKHN0cmVhbS5uZXh0KCkgIT0gbnVsbCAmJiAhc3RyZWFtLm1hdGNoKCJ7eyIsIGZhbHNlKSkge30KICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfTsKICByZXR1cm4gQ29kZU1pcnJvci5vdmVybGF5TW9kZShDb2RlTWlycm9yLmdldE1vZGUoY29uZmlnLCBwYXJzZXJDb25maWcuYmFja2Ryb3AgfHwgInRleHQvaHRtbCIpLCBtdXN0YWNoZU92ZXJsYXkpOwp9KTsKdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHttb2RlOiAibXVzdGFjaGUifSk7Cjwvc2NyaXB0PgoKICAgIDxwPkRlbW9uc3RyYXRpb24gb2YgYSBtb2RlIHRoYXQgcGFyc2VzIEhUTUwsIGhpZ2hsaWdodGluZwogICAgdGhlIDxhIGhyZWY9Imh0dHA6Ly9tdXN0YWNoZS5naXRodWIuY29tLyI+TXVzdGFjaGU8L2E+IHRlbXBsYXRpbmcKICAgIGRpcmVjdGl2ZXMgaW5zaWRlIG9mIGl0IGJ5IHVzaW5nIHRoZSBjb2RlCiAgICBpbiA8YSBocmVmPSIuLi9hZGRvbi9tb2RlL292ZXJsYXkuanMiPjxjb2RlPm92ZXJsYXkuanM8L2NvZGU+PC9hPi4gVmlldwogICAgc291cmNlIHRvIHNlZSB0aGUgMTUgbGluZXMgb2YgY29kZSBuZWVkZWQgdG8gYWNjb21wbGlzaCB0aGlzLjwvcD4KCiAgPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/demo/panel.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogUGFuZWwgRGVtbzwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxzY3JpcHQgc3JjPSIuLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9tb2RlL2phdmFzY3JpcHQvamF2YXNjcmlwdC5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9tb2RlL3htbC94bWwuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vbW9kZS9odG1sbWl4ZWQvaHRtbG1peGVkLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL2FkZG9uL2Rpc3BsYXkvcGFuZWwuanMiPjwvc2NyaXB0Pgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgogIC5ib3JkZXIgewogICAgYm9yZGVyOiAxcHggc29saWQgI2Y3ZjdmNzsKICB9CiAgLmFkZC1wYW5lbCB7CiAgICBiYWNrZ3JvdW5kOiBvcmFuZ2U7CiAgICBwYWRkaW5nOiAzcHggNnB4OwogICAgY29sb3I6IHdoaXRlICFpbXBvcnRhbnQ7IAogICAgYm9yZGVyLXJhZGl1czogM3B4OwogIH0KICAuYWRkLXBhbmVsLCAucmVtb3ZlLXBhbmVsIHsKICAgIGN1cnNvcjogcG9pbnRlcjsKICB9CiAgLnJlbW92ZS1wYW5lbCB7CiAgICBmbG9hdDogcmlnaHQ7CiAgfQogIC5wYW5lbCB7CiAgICBiYWNrZ3JvdW5kOiAjZjdmN2Y3OwogICAgcGFkZGluZzogM3B4IDdweDsKICAgIGZvbnQtc2l6ZTogMC44NWVtOwogIH0KICAucGFuZWwudG9wLCAucGFuZWwuYWZ0ZXItdG9wIHsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZGRkOwogIH0KICAucGFuZWwuYm90dG9tLCAucGFuZWwuYmVmb3JlLWJvdHRvbSB7CiAgICBib3JkZXItdG9wOiAxcHggc29saWQgI2RkZDsKICB9Cjwvc3R5bGU+Cgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxoMT5Db2RlTWlycm9yPC9oMT48aW1nIGlkPWxvZ28gc3JjPSIuLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+UGFuZWw8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KCjxoMj5QYW5lbCBEZW1vPC9oMj4KCjxkaXYgY2xhc3M9ImJvcmRlciI+CiAgICA8dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPjwvdGV4dGFyZWE+CjwvZGl2PgoKPHA+CiAgVGhlIDxhIGhyZWY9Ii4uL2RvYy9tYW51YWwuaHRtbCNhZGRvbl9wYW5lbCI+PGNvZGU+cGFuZWw8L2NvZGU+PC9hPgogIGFkZG9uIGFsbG93cyB5b3UgdG8gZGlzcGxheSBwYW5lbHMgYWJvdmUgb3IgYmVsb3cgYW4gZWRpdG9yLgogIDxicj4KICBDbGljayB0aGUgbGlua3MgYmVsb3cgdG8gYWRkIHBhbmVscyBhdCB0aGUgZ2l2ZW4gcG9zaXRpb246CjwvcD4KCjxkaXYgaWQ9ImRlbW8iPgo8cD4KICA8YSBjbGFzcz0iYWRkLXBhbmVsIiBvbmNsaWNrPSJhZGRQYW5lbCgndG9wJykiPnRvcDwvYT4KICA8YSBjbGFzcz0iYWRkLXBhbmVsIiBvbmNsaWNrPSJhZGRQYW5lbCgnYWZ0ZXItdG9wJykiPmFmdGVyLXRvcDwvYT4KICA8YSBjbGFzcz0iYWRkLXBhbmVsIiBvbmNsaWNrPSJhZGRQYW5lbCgnYmVmb3JlLWJvdHRvbScpIj5iZWZvcmUtYm90dG9tPC9hPgogIDxhIGNsYXNzPSJhZGQtcGFuZWwiIG9uY2xpY2s9ImFkZFBhbmVsKCdib3R0b20nKSI+Ym90dG9tPC9hPgo8L3A+CjxwPgogIFlvdSBjYW4gYWxzbyByZXBsYWNlIGFuIGV4aXN0aW5nIHBhbmVsOgo8L3A+Cjxmb3JtIG9uc3VibWl0PSJyZXR1cm4gcmVwbGFjZVBhbmVsKHRoaXMpOyIgbmFtZT0icmVwbGFjZV9wYW5lbCI+CiAgPGlucHV0IHR5cGU9InN1Ym1pdCIgdmFsdWU9IlJlcGxhY2UgcGFuZWwgbsKwIiAvPgogIDxpbnB1dCB0eXBlPSJudW1iZXIiIG5hbWU9InBhbmVsX2lkIiBtaW49IjEiIHZhbHVlPSIxIiAvPgo8L2Zvcm0+Cgo8c2NyaXB0Pgp2YXIgdGV4dGFyZWEgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpOwp2YXIgZGVtbyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJkZW1vIik7CnZhciBudW1QYW5lbHMgPSAwOwp2YXIgcGFuZWxzID0ge307CnZhciBlZGl0b3I7Cgp0ZXh0YXJlYS52YWx1ZSA9IGRlbW8uaW5uZXJIVE1MLnRyaW0oKTsKZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEodGV4dGFyZWEsIHsKICBsaW5lTnVtYmVyczogdHJ1ZSwKICBtb2RlOiAiaHRtbG1peGVkIgp9KTsKCmZ1bmN0aW9uIG1ha2VQYW5lbCh3aGVyZSkgewogIHZhciBub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgdmFyIGlkID0gKytudW1QYW5lbHM7CiAgdmFyIHdpZGdldCwgY2xvc2UsIGxhYmVsOwoKICBub2RlLmlkID0gInBhbmVsLSIgKyBpZDsKICBub2RlLmNsYXNzTmFtZSA9ICJwYW5lbCAiICsgd2hlcmU7CiAgY2xvc2UgPSBub2RlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImEiKSk7CiAgY2xvc2Uuc2V0QXR0cmlidXRlKCJ0aXRsZSIsICJSZW1vdmUgbWUhIik7CiAgY2xvc2Uuc2V0QXR0cmlidXRlKCJjbGFzcyIsICJyZW1vdmUtcGFuZWwiKTsKICBjbG9zZS50ZXh0Q29udGVudCA9ICLinJYiOwogIENvZGVNaXJyb3Iub24oY2xvc2UsICJjbGljayIsIGZ1bmN0aW9uKCkgewogICAgcGFuZWxzW25vZGUuaWRdLmNsZWFyKCk7CiAgfSk7CiAgbGFiZWwgPSBub2RlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKSk7CiAgbGFiZWwudGV4dENvbnRlbnQgPSAiSSdtIHBhbmVsIG7CsCIgKyBpZDsKICByZXR1cm4gbm9kZTsKfQpmdW5jdGlvbiBhZGRQYW5lbCh3aGVyZSkgewogIHZhciBub2RlID0gbWFrZVBhbmVsKHdoZXJlKTsKICBwYW5lbHNbbm9kZS5pZF0gPSBlZGl0b3IuYWRkUGFuZWwobm9kZSwge3Bvc2l0aW9uOiB3aGVyZX0pOwp9CgphZGRQYW5lbCgidG9wIik7CmFkZFBhbmVsKCJib3R0b20iKTsKCmZ1bmN0aW9uIHJlcGxhY2VQYW5lbChmb3JtKSB7CiAgdmFyIGlkID0gZm9ybS5lbGVtZW50cy5wYW5lbF9pZC52YWx1ZTsKICB2YXIgcGFuZWwgPSBwYW5lbHNbInBhbmVsLSIgKyBpZF07CiAgdmFyIG5vZGUgPSBtYWtlUGFuZWwoIiIpOwoKICBwYW5lbHNbbm9kZS5pZF0gPSBlZGl0b3IuYWRkUGFuZWwobm9kZSwge3JlcGxhY2U6IHBhbmVsLCBwb3NpdGlvbjogImFmdGVyLXRvcCJ9KTsKICByZXR1cm4gZmFsc2U7Cn0KPC9zY3JpcHQ+Cgo8L2Rpdj4KCjwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/demo/placeholder.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogUGxhY2Vob2xkZXIgZGVtbzwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxzY3JpcHQgc3JjPSIuLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9hZGRvbi9kaXNwbGF5L3BsYWNlaG9sZGVyLmpzIj48L3NjcmlwdD4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KICAgICAgLkNvZGVNaXJyb3IgeyBib3JkZXI6IDFweCBzb2xpZCBzaWx2ZXI7IH0KICAgICAgLkNvZGVNaXJyb3ItZW1wdHkgeyBvdXRsaW5lOiAxcHggc29saWQgI2MyMjsgfQogICAgICAuQ29kZU1pcnJvci1lbXB0eS5Db2RlTWlycm9yLWZvY3VzZWQgeyBvdXRsaW5lOiBub25lOyB9CiAgICAgIC5Db2RlTWlycm9yIHByZS5Db2RlTWlycm9yLXBsYWNlaG9sZGVyIHsgY29sb3I6ICM5OTk7IH0KICAgIDwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGgxPkNvZGVNaXJyb3I8L2gxPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5QbGFjZWhvbGRlcjwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+UGxhY2Vob2xkZXIgZGVtbzwvaDI+Cjxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSIgcGxhY2Vob2xkZXI9IkNvZGUgZ29lcyBoZXJlLi4uIj48L3RleHRhcmVhPjwvZm9ybT4KCiAgICA8cD5UaGUgPGEgaHJlZj0iLi4vZG9jL21hbnVhbC5odG1sI2FkZG9uX3BsYWNlaG9sZGVyIj5wbGFjZWhvbGRlcjwvYT4KICAgIHBsdWctaW4gYWRkcyBhbiBvcHRpb24gPGNvZGU+cGxhY2Vob2xkZXI8L2NvZGU+IHRoYXQgY2FuIGJlIHNldCB0bwogICAgbWFrZSB0ZXh0IGFwcGVhciBpbiB0aGUgZWRpdG9yIHdoZW4gaXQgaXMgZW1wdHkgYW5kIG5vdCBmb2N1c2VkLgogICAgSWYgdGhlIHNvdXJjZSB0ZXh0YXJlYSBoYXMgYSA8Y29kZT5wbGFjZWhvbGRlcjwvY29kZT4gYXR0cmlidXRlLAogICAgaXQgd2lsbCBhdXRvbWF0aWNhbGx5IGJlIGluaGVyaXRlZC48L3A+CgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZQogICAgICB9KTsKICAgIDwvc2NyaXB0PgoKICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/demo/preview.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogSFRNTDUgcHJldmlldzwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPS4uL2xpYi9jb2RlbWlycm9yLmNzcz4KPHNjcmlwdCBzcmM9Li4vbGliL2NvZGVtaXJyb3IuanM+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPS4uL21vZGUveG1sL3htbC5qcz48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Li4vbW9kZS9qYXZhc2NyaXB0L2phdmFzY3JpcHQuanM+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPS4uL21vZGUvY3NzL2Nzcy5qcz48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Li4vbW9kZS9odG1sbWl4ZWQvaHRtbG1peGVkLmpzPjwvc2NyaXB0Pgo8c3R5bGUgdHlwZT10ZXh0L2Nzcz4KICAgICAgLkNvZGVNaXJyb3IgewogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICAgIHdpZHRoOiA1MCU7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7CiAgICAgIH0KICAgICAgaWZyYW1lIHsKICAgICAgICB3aWR0aDogNDklOwogICAgICAgIGZsb2F0OiBsZWZ0OwogICAgICAgIGhlaWdodDogMzAwcHg7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgYmxhY2s7CiAgICAgICAgYm9yZGVyLWxlZnQ6IDBweDsKICAgICAgfQogICAgPC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aDE+Q29kZU1pcnJvcjwvaDE+PGltZyBpZD1sb2dvIHNyYz0iLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPkhUTUw1IHByZXZpZXc8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPkhUTUw1IHByZXZpZXc8L2gyPgoKICAgIDx0ZXh0YXJlYSBpZD1jb2RlIG5hbWU9Y29kZT4KPCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD11dGYtOD4KICAgIDx0aXRsZT5IVE1MNSBjYW52YXMgZGVtbzwvdGl0bGU+CiAgICA8c3R5bGU+cCB7Zm9udC1mYW1pbHk6IG1vbm9zcGFjZTt9PC9zdHlsZT4KICA8L2hlYWQ+CiAgPGJvZHk+CiAgICA8cD5DYW52YXMgcGFuZSBnb2VzIGhlcmU6PC9wPgogICAgPGNhbnZhcyBpZD1wYW5lIHdpZHRoPTMwMCBoZWlnaHQ9MjAwPjwvY2FudmFzPgogICAgPHNjcmlwdD4KICAgICAgdmFyIGNhbnZhcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdwYW5lJyk7CiAgICAgIHZhciBjb250ZXh0ID0gY2FudmFzLmdldENvbnRleHQoJzJkJyk7CgogICAgICBjb250ZXh0LmZpbGxTdHlsZSA9ICdyZ2IoMjUwLDAsMCknOwogICAgICBjb250ZXh0LmZpbGxSZWN0KDEwLCAxMCwgNTUsIDUwKTsKCiAgICAgIGNvbnRleHQuZmlsbFN0eWxlID0gJ3JnYmEoMCwgMCwgMjUwLCAwLjUpJzsKICAgICAgY29udGV4dC5maWxsUmVjdCgzMCwgMzAsIDU1LCA1MCk7CiAgICA8L3NjcmlwdD4KICA8L2JvZHk+CjwvaHRtbD48L3RleHRhcmVhPgogICAgPGlmcmFtZSBpZD1wcmV2aWV3PjwvaWZyYW1lPgogICAgPHNjcmlwdD4KICAgICAgdmFyIGRlbGF5OwogICAgICAvLyBJbml0aWFsaXplIENvZGVNaXJyb3IgZWRpdG9yIHdpdGggYSBuaWNlIGh0bWw1IGNhbnZhcyBkZW1vLgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvZGUnKSwgewogICAgICAgIG1vZGU6ICd0ZXh0L2h0bWwnCiAgICAgIH0pOwogICAgICBlZGl0b3Iub24oImNoYW5nZSIsIGZ1bmN0aW9uKCkgewogICAgICAgIGNsZWFyVGltZW91dChkZWxheSk7CiAgICAgICAgZGVsYXkgPSBzZXRUaW1lb3V0KHVwZGF0ZVByZXZpZXcsIDMwMCk7CiAgICAgIH0pOwogICAgICAKICAgICAgZnVuY3Rpb24gdXBkYXRlUHJldmlldygpIHsKICAgICAgICB2YXIgcHJldmlld0ZyYW1lID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3ByZXZpZXcnKTsKICAgICAgICB2YXIgcHJldmlldyA9ICBwcmV2aWV3RnJhbWUuY29udGVudERvY3VtZW50IHx8ICBwcmV2aWV3RnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudDsKICAgICAgICBwcmV2aWV3Lm9wZW4oKTsKICAgICAgICBwcmV2aWV3LndyaXRlKGVkaXRvci5nZXRWYWx1ZSgpKTsKICAgICAgICBwcmV2aWV3LmNsb3NlKCk7CiAgICAgIH0KICAgICAgc2V0VGltZW91dCh1cGRhdGVQcmV2aWV3LCAzMDApOwogICAgPC9zY3JpcHQ+CiAgPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/demo/requirejs.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8aGVhZD4KICA8dGl0bGU+Q29kZU1pcnJvcjogSFRNTCBjb21wbGV0aW9uIGRlbW88L3RpdGxlPgogIDxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CiAgPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vZG9jL2RvY3MuY3NzIj4KCiAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9saWIvY29kZW1pcnJvci5jc3MiPgogIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vYWRkb24vaGludC9zaG93LWhpbnQuY3NzIj4KICA8c2NyaXB0IHNyYz0iLy9jZG5qcy5jbG91ZGZsYXJlLmNvbS9hamF4L2xpYnMvcmVxdWlyZS5qcy8yLjEuMTQvcmVxdWlyZS5taW4uanMiPjwvc2NyaXB0PgogIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICAuQ29kZU1pcnJvciB7Ym9yZGVyLXRvcDogMXB4IHNvbGlkICM4ODg7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjODg4O30KICA8L3N0eWxlPgo8L2hlYWQ+Cgo8Ym9keT4KICA8ZGl2IGlkPW5hdj4KICAgIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGgxPkNvZGVNaXJyb3I8L2gxPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uL2RvYy9sb2dvLnBuZyI+PC9hPgogICAgPHVsPgogICAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgICAgPGxpPjxhIGhyZWY9Ii4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvY29kZW1pcnJvciI+Q29kZTwvYT4KICAgIDwvdWw+CiAgICA8dWw+CiAgICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+SFRNTCBjb21wbGV0aW9uPC9hPgogICAgPC91bD4KICA8L2Rpdj4KCiAgPGFydGljbGU+CiAgICA8aDI+UmVxdWlyZUpTIG1vZHVsZSBsb2FkaW5nIGRlbW88L2gyPgoKICAgIDxwPlRoaXMgZGVtbyBkb2VzIHRoZSBzYW1lIHRoaW5nIGFzCiAgICB0aGUgPGEgaHJlZj0iaHRtbDVjb21wbGV0ZS5odG1sIj5IVE1MNSBjb21wbGV0aW9uIGRlbW88L2E+LCBidXQKICAgIGxvYWRzIGl0cyBkZXBlbmRlbmNpZXMKICAgIHdpdGggPGEgaHJlZj0iaHR0cDovL3JlcXVpcmVqcy5vcmcvIj5SZXF1aXJlLmpzPC9hPiwgcmF0aGVyIHRoYW4KICAgIGV4cGxpY2l0bHkuIFByZXNzIDxzdHJvbmc+Y3RybC1zcGFjZTwvc3Ryb25nPiB0byBhY3RpdmF0ZQogICAgY29tcGxldGlvbi48L3A+CgogICAgPGRpdiBpZD0iY29kZSI+PC9kaXY+CgogICAgPGJ1dHRvbiBpZD0ibWFya2Rvd24iPkR5bmFtaWNhbGx5IGxvYWQgTWFya2Rvd24gbW9kZTwvYnV0dG9uPgoKICAgIDxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KICAgICAgcmVxdWlyZS5jb25maWcoewogICAgICAgIHBhY2thZ2VzOiBbewogICAgICAgICAgbmFtZTogImNvZGVtaXJyb3IiLAogICAgICAgICAgbG9jYXRpb246ICIuLi8iLAogICAgICAgICAgbWFpbjogImxpYi9jb2RlbWlycm9yIgogICAgICAgIH1dCiAgICAgIH0pOwogICAgICByZXF1aXJlKFsiY29kZW1pcnJvciIsICJjb2RlbWlycm9yL21vZGUvaHRtbG1peGVkL2h0bWxtaXhlZCIsCiAgICAgICAgICAgICAgICJjb2RlbWlycm9yL2FkZG9uL2hpbnQvc2hvdy1oaW50IiwgImNvZGVtaXJyb3IvYWRkb24vaGludC9odG1sLWhpbnQiLAogICAgICAgICAgICAgICAiY29kZW1pcnJvci9hZGRvbi9tb2RlL2xvYWRtb2RlIl0sIGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAgICAgICBlZGl0b3IgPSBDb2RlTWlycm9yKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICAgIG1vZGU6ICJ0ZXh0L2h0bWwiLAogICAgICAgICAgZXh0cmFLZXlzOiB7IkN0cmwtU3BhY2UiOiAiYXV0b2NvbXBsZXRlIn0sCiAgICAgICAgICB2YWx1ZTogZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmlubmVySFRNTAogICAgICAgIH0pOwoKICAgICAgICBDb2RlTWlycm9yLm1vZGVVUkwgPSAiY29kZW1pcnJvci9tb2RlLyVOLyVOIjsKICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibWFya2Rvd24iKS5hZGRFdmVudExpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uKCkgewogICAgICAgICAgQ29kZU1pcnJvci5yZXF1aXJlTW9kZSgibWFya2Rvd24iLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgZWRpdG9yLnJlcGxhY2VSYW5nZSgiVGhpcyBpcyAqKk1hcmtkb3duKiouXG5cbiIsIHtsaW5lOiAwLCBjaDogMH0pOwogICAgICAgICAgICBlZGl0b3Iuc2V0T3B0aW9uKCJtb2RlIiwgIm1hcmtkb3duIik7CiAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgICAgfSk7CiAgICA8L3NjcmlwdD4KICA8L2FydGljbGU+CjwvYm9keT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/demo/resize.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogQXV0b3Jlc2l6ZSBEZW1vPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL21vZGUvY3NzL2Nzcy5qcyI+PC9zY3JpcHQ+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICAgIC5Db2RlTWlycm9yIHsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZWVlOwogICAgICAgIGhlaWdodDogYXV0bzsKICAgICAgfQogICAgPC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aDE+Q29kZU1pcnJvcjwvaDE+PGltZyBpZD1sb2dvIHNyYz0iLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPkF1dG9yZXNpemU8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPkF1dG9yZXNpemUgRGVtbzwvaDI+Cjxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+Ci5Db2RlTWlycm9yIHsKICBib3JkZXI6IDFweCBzb2xpZCAjZWVlOwogIGhlaWdodDogYXV0bzsKfQo8L3RleHRhcmVhPjwvZm9ybT4KCjxwPkJ5IHNldHRpbmcgYW4gZWRpdG9yJ3MgPGNvZGU+aGVpZ2h0PC9jb2RlPiBzdHlsZQp0byA8Y29kZT5hdXRvPC9jb2RlPiBhbmQgZ2l2aW5nCnRoZSA8YSBocmVmPSIuLi9kb2MvbWFudWFsLmh0bWwjb3B0aW9uX3ZpZXdwb3J0TWFyZ2luIj48Y29kZT52aWV3cG9ydE1hcmdpbjwvY29kZT48L2E+CmEgdmFsdWUgb2YgPGNvZGU+SW5maW5pdHk8L2NvZGU+LCBDb2RlTWlycm9yIGNhbiBiZSBtYWRlIHRvCmF1dG9tYXRpY2FsbHkgcmVzaXplIHRvIGZpdCBpdHMgY29udGVudC48L3A+CgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgICAgICB2aWV3cG9ydE1hcmdpbjogSW5maW5pdHkKICAgICAgfSk7CiAgICA8L3NjcmlwdD4KCiAgPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/demo/rulers.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogUnVsZXIgRGVtbzwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxzY3JpcHQgc3JjPSIuLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9hZGRvbi9kaXNwbGF5L3J1bGVycy5qcyI+PC9zY3JpcHQ+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgLkNvZGVNaXJyb3Ige2JvcmRlci10b3A6IDFweCBzb2xpZCAjODg4OyBib3JkZXItYm90dG9tOiAxcHggc29saWQgIzg4ODt9Cjwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGgxPkNvZGVNaXJyb3I8L2gxPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5SdWxlciBkZW1vPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5SdWxlciBEZW1vPC9oMj4KCjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij4KICB2YXIgbnVtcyA9ICIwMTIzNDU2Nzg5Iiwgc3BhY2UgPSAiICAgICAgICAgICI7CiAgdmFyIGNvbG9ycyA9IFsiI2ZjYyIsICIjZjVmNTc3IiwgIiNjZmMiLCAiI2FmZiIsICIjY2NmIiwgIiNmY2YiXTsKICB2YXIgcnVsZXJzID0gW10sIHZhbHVlID0gIiI7CiAgZm9yICh2YXIgaSA9IDE7IGkgPD0gNjsgaSsrKSB7CiAgICBydWxlcnMucHVzaCh7Y29sb3I6IGNvbG9yc1tpXSwgY29sdW1uOiBpICogMTAsIGxpbmVTdHlsZTogImRhc2hlZCJ9KTsKICAgIGZvciAodmFyIGogPSAxOyBqIDwgaTsgaisrKSB2YWx1ZSArPSBzcGFjZTsKICAgIHZhbHVlICs9IG51bXMgKyAiXG4iOwogIH0KICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvcihkb2N1bWVudC5ib2R5Lmxhc3RDaGlsZCwgewogICAgcnVsZXJzOiBydWxlcnMsCiAgICB2YWx1ZTogdmFsdWUgKyB2YWx1ZSArIHZhbHVlLAogICAgbGluZU51bWJlcnM6IHRydWUKfSk7Cjwvc2NyaXB0PgoKPHA+RGVtb25zdHJhdGlvbiBvZgp0aGUgPGEgaHJlZj0iLi4vZG9jL21hbnVhbC5odG1sI2FkZG9uX3J1bGVycyI+cnVsZXJzPC9hPiBhZGRvbiwgd2hpY2gKZGlzcGxheXMgdmVydGljYWwgbGluZXMgYXQgZ2l2ZW4gY29sdW1uIG9mZnNldHMuPC9wPgoKPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/demo/runmode.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogTW9kZSBSdW5uZXIgRGVtbzwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxzY3JpcHQgc3JjPSIuLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9hZGRvbi9ydW5tb2RlL3J1bm1vZGUuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vbW9kZS94bWwveG1sLmpzIj48L3NjcmlwdD4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aDE+Q29kZU1pcnJvcjwvaDE+PGltZyBpZD1sb2dvIHNyYz0iLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPk1vZGUgUnVubmVyPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5Nb2RlIFJ1bm5lciBEZW1vPC9oMj4KCgogICAgPHRleHRhcmVhIGlkPSJjb2RlIiBzdHlsZT0id2lkdGg6IDkwJTsgaGVpZ2h0OiA3ZW07IGJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOyBwYWRkaW5nOiAuMmVtIC40ZW07Ij4KPGZvb2Jhcj4KICA8YmxhaD5FbnRlciB5b3VyIHhtbCBoZXJlIGFuZCBwcmVzcyB0aGUgYnV0dG9uIGJlbG93IHRvIGRpc3BsYXkKICAgIGl0IGFzIGhpZ2hsaWdodGVkIGJ5IHRoZSBDb2RlTWlycm9yIFhNTCBtb2RlPC9ibGFoPgogIDx0YWcyIGZvbz0iMiIgYmFyPSImYW1wO3F1b3Q7YmFyJmFtcDtxdW90OyIvPgo8L2Zvb2Jhcj48L3RleHRhcmVhPjxicj4KICAgIDxidXR0b24gb25jbGljaz0iZG9IaWdobGlnaHQoKTsiPkhpZ2hsaWdodCE8L2J1dHRvbj4KICAgIDxwcmUgaWQ9Im91dHB1dCIgY2xhc3M9ImNtLXMtZGVmYXVsdCI+PC9wcmU+CgogICAgPHNjcmlwdD4KZnVuY3Rpb24gZG9IaWdobGlnaHQoKSB7CiAgQ29kZU1pcnJvci5ydW5Nb2RlKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIikudmFsdWUsICJhcHBsaWNhdGlvbi94bWwiLAogICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgib3V0cHV0IikpOwp9Cjwvc2NyaXB0PgoKICAgIDxwPlJ1bm5pbmcgYSBDb2RlTWlycm9yIG1vZGUgb3V0c2lkZSBvZiB0aGUgZWRpdG9yLgogICAgVGhlIDxjb2RlPkNvZGVNaXJyb3IucnVuTW9kZTwvY29kZT4gZnVuY3Rpb24sIGRlZmluZWQKICAgIGluIDxjb2RlPjxhIGhyZWY9Ii4uL2FkZG9uL3J1bm1vZGUvcnVubW9kZS5qcyI+YWRkb24vcnVubW9kZS9ydW5tb2RlLmpzPC9hPjwvY29kZT4gdGFrZXMgdGhlIGZvbGxvd2luZyBhcmd1bWVudHM6PC9wPgoKICAgIDxkbD4KICAgICAgPGR0Pjxjb2RlPnRleHQgKHN0cmluZyk8L2NvZGU+PC9kdD4KICAgICAgPGRkPlRoZSBkb2N1bWVudCB0byBydW4gdGhyb3VnaCB0aGUgaGlnaGxpZ2h0ZXIuPC9kZD4KICAgICAgPGR0Pjxjb2RlPm1vZGUgKDxhIGhyZWY9Ii4uL2RvYy9tYW51YWwuaHRtbCNvcHRpb25fbW9kZSI+bW9kZSBzcGVjPC9hPik8L2NvZGU+PC9kdD4KICAgICAgPGRkPlRoZSBtb2RlIHRvIHVzZSAobXVzdCBiZSBsb2FkZWQgYXMgbm9ybWFsKS48L2RkPgogICAgICA8ZHQ+PGNvZGU+b3V0cHV0IChmdW5jdGlvbiBvciBET00gbm9kZSk8L2NvZGU+PC9kdD4KICAgICAgPGRkPklmIHRoaXMgaXMgYSBmdW5jdGlvbiwgaXQgd2lsbCBiZSBjYWxsZWQgZm9yIGVhY2ggdG9rZW4gd2l0aAogICAgICB0d28gYXJndW1lbnRzLCB0aGUgdG9rZW4ncyB0ZXh0IGFuZCB0aGUgdG9rZW4ncyBzdHlsZSBjbGFzcyAobWF5CiAgICAgIGJlIDxjb2RlPm51bGw8L2NvZGU+IGZvciB1bnN0eWxlZCB0b2tlbnMpLiBJZiBpdCBpcyBhIERPTSBub2RlLAogICAgICB0aGUgdG9rZW5zIHdpbGwgYmUgY29udmVydGVkIHRvIDxjb2RlPnNwYW48L2NvZGU+IGVsZW1lbnRzIGFzIGluCiAgICAgIGFuIGVkaXRvciwgYW5kIGluc2VydGVkIGludG8gdGhlIG5vZGUKICAgICAgKHRocm91Z2ggPGNvZGU+aW5uZXJIVE1MPC9jb2RlPikuPC9kZD4KICAgIDwvZGw+CgogIDwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/demo/search.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogU2VhcmNoL1JlcGxhY2UgRGVtbzwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vYWRkb24vZGlhbG9nL2RpYWxvZy5jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL2FkZG9uL3NlYXJjaC9tYXRjaGVzb25zY3JvbGxiYXIuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL21vZGUveG1sL3htbC5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9hZGRvbi9kaWFsb2cvZGlhbG9nLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL2FkZG9uL3NlYXJjaC9zZWFyY2hjdXJzb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vYWRkb24vc2VhcmNoL3NlYXJjaC5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9hZGRvbi9zY3JvbGwvYW5ub3RhdGVzY3JvbGxiYXIuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vYWRkb24vc2VhcmNoL21hdGNoZXNvbnNjcm9sbGJhci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9hZGRvbi9zZWFyY2gvanVtcC10by1saW5lLmpzIj48L3NjcmlwdD4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KICAgICAgLkNvZGVNaXJyb3Ige2JvcmRlci10b3A6IDFweCBzb2xpZCBibGFjazsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO30KICAgICAgZHQge2ZvbnQtZmFtaWx5OiBtb25vc3BhY2U7IGNvbG9yOiAjNjY2O30KICAgIDwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGgxPkNvZGVNaXJyb3I8L2gxPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5TZWFyY2gvUmVwbGFjZTwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+U2VhcmNoL1JlcGxhY2UgRGVtbzwvaDI+Cjxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+CjxkbD4KICA8ZHQgaWQ9Im9wdGlvbl9pbmRlbnRXaXRoVGFicyI+PGNvZGU+PHN0cm9uZz5pbmRlbnRXaXRoVGFiczwvc3Ryb25nPjogYm9vbGVhbjwvY29kZT48L2R0PgogIDxkZD5XaGV0aGVyLCB3aGVuIGluZGVudGluZywgdGhlIGZpcnN0IE4qPGNvZGU+dGFiU2l6ZTwvY29kZT4KICBzcGFjZXMgc2hvdWxkIGJlIHJlcGxhY2VkIGJ5IE4gdGFicy4gRGVmYXVsdCBpcyBmYWxzZS48L2RkPgoKICA8ZHQgaWQ9Im9wdGlvbl9lbGVjdHJpY0NoYXJzIj48Y29kZT48c3Ryb25nPmVsZWN0cmljQ2hhcnM8L3N0cm9uZz46IGJvb2xlYW48L2NvZGU+PC9kdD4KICA8ZGQ+Q29uZmlndXJlcyB3aGV0aGVyIHRoZSBlZGl0b3Igc2hvdWxkIHJlLWluZGVudCB0aGUgY3VycmVudAogIGxpbmUgd2hlbiBhIGNoYXJhY3RlciBpcyB0eXBlZCB0aGF0IG1pZ2h0IGNoYW5nZSBpdHMgcHJvcGVyCiAgaW5kZW50YXRpb24gKG9ubHkgd29ya3MgaWYgdGhlIG1vZGUgc3VwcG9ydHMgaW5kZW50YXRpb24pLgogIERlZmF1bHQgaXMgdHJ1ZS48L2RkPgoKICA8ZHQgaWQ9Im9wdGlvbl9zcGVjaWFsQ2hhcnMiPjxjb2RlPjxzdHJvbmc+c3BlY2lhbENoYXJzPC9zdHJvbmc+OiBSZWdFeHA8L2NvZGU+PC9kdD4KICA8ZGQ+QSByZWd1bGFyIGV4cHJlc3Npb24gdXNlZCB0byBkZXRlcm1pbmUgd2hpY2ggY2hhcmFjdGVycwogIHNob3VsZCBiZSByZXBsYWNlZCBieSBhCiAgc3BlY2lhbCA8YSBocmVmPSIjb3B0aW9uX3NwZWNpYWxDaGFyUGxhY2Vob2xkZXIiPnBsYWNlaG9sZGVyPC9hPi4KICBNb3N0bHkgdXNlZnVsIGZvciBub24tcHJpbnRpbmcgc3BlY2lhbCBjaGFyYWN0ZXJzLiBUaGUgZGVmYXVsdAogIGlzIDxjb2RlPi9bXHUwMDAwLVx1MDAxOVx1MDBhZFx1MjAwYlx1MjAyOFx1MjAyOVx1ZmVmZl0vPC9jb2RlPi48L2RkPgogIDxkdCBpZD0ib3B0aW9uX3NwZWNpYWxDaGFyUGxhY2Vob2xkZXIiPjxjb2RlPjxzdHJvbmc+c3BlY2lhbENoYXJQbGFjZWhvbGRlcjwvc3Ryb25nPjogZnVuY3Rpb24oY2hhcinCoOKGksKgRWxlbWVudDwvY29kZT48L2R0PgogIDxkZD5BIGZ1bmN0aW9uIHRoYXQsIGdpdmVuIGEgc3BlY2lhbCBjaGFyYWN0ZXIgaWRlbnRpZmllZCBieQogIHRoZSA8YSBocmVmPSIjb3B0aW9uX3NwZWNpYWxDaGFycyI+PGNvZGU+c3BlY2lhbENoYXJzPC9jb2RlPjwvYT4KICBvcHRpb24sIHByb2R1Y2VzIGEgRE9NIG5vZGUgdGhhdCBpcyB1c2VkIHRvIHJlcHJlc2VudCB0aGUKICBjaGFyYWN0ZXIuIEJ5IGRlZmF1bHQsIGEgcmVkIGRvdCAoPHNwYW4gc3R5bGU9ImNvbG9yOiByZWQiPuKAojwvc3Bhbj4pCiAgaXMgc2hvd24sIHdpdGggYSB0aXRsZSB0b29sdGlwIHRvIGluZGljYXRlIHRoZSBjaGFyYWN0ZXIgY29kZS48L2RkPgoKICA8ZHQgaWQ9Im9wdGlvbl9ydGxNb3ZlVmlzdWFsbHkiPjxjb2RlPjxzdHJvbmc+cnRsTW92ZVZpc3VhbGx5PC9zdHJvbmc+OiBib29sZWFuPC9jb2RlPjwvZHQ+CiAgPGRkPkRldGVybWluZXMgd2hldGhlciBob3Jpem9udGFsIGN1cnNvciBtb3ZlbWVudCB0aHJvdWdoCiAgcmlnaHQtdG8tbGVmdCAoQXJhYmljLCBIZWJyZXcpIHRleHQgaXMgdmlzdWFsIChwcmVzc2luZyB0aGUgbGVmdAogIGFycm93IG1vdmVzIHRoZSBjdXJzb3IgbGVmdCkgb3IgbG9naWNhbCAocHJlc3NpbmcgdGhlIGxlZnQgYXJyb3cKICBtb3ZlcyB0byB0aGUgbmV4dCBsb3dlciBpbmRleCBpbiB0aGUgc3RyaW5nLCB3aGljaCBpcyB2aXN1YWxseQogIHJpZ2h0IGluIHJpZ2h0LXRvLWxlZnQgdGV4dCkuIFRoZSBkZWZhdWx0IGlzIDxjb2RlPmZhbHNlPC9jb2RlPgogIG9uIFdpbmRvd3MsIGFuZCA8Y29kZT50cnVlPC9jb2RlPiBvbiBvdGhlciBwbGF0Zm9ybXMuPC9kZD4KPC9kbD4KPC90ZXh0YXJlYT48L2Zvcm0+CgogICAgPHNjcmlwdD4KdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICBtb2RlOiAidGV4dC9odG1sIiwKICBsaW5lTnVtYmVyczogdHJ1ZSwKICBleHRyYUtleXM6IHsiQWx0LUYiOiAiZmluZFBlcnNpc3RlbnQifQp9KTsKPC9zY3JpcHQ+CgogICAgPHA+RGVtb25zdHJhdGlvbiBvZiBwcmltaXRpdmUgc2VhcmNoL3JlcGxhY2UgZnVuY3Rpb25hbGl0eS4gVGhlCiAgICBrZXliaW5kaW5ncyAod2hpY2ggY2FuIGJlIGNvbmZpZ3VyZWQgd2l0aCBjdXN0b20ga2V5bWFwcykgYXJlOjwvcD4KICAgIDxkbD4KICAgICAgPGR0PkN0cmwtRiAvIENtZC1GPC9kdD48ZGQ+U3RhcnQgc2VhcmNoaW5nPC9kZD4KICAgICAgPGR0PkN0cmwtRyAvIENtZC1HPC9kdD48ZGQ+RmluZCBuZXh0PC9kZD4KICAgICAgPGR0PlNoaWZ0LUN0cmwtRyAvIFNoaWZ0LUNtZC1HPC9kdD48ZGQ+RmluZCBwcmV2aW91czwvZGQ+CiAgICAgIDxkdD5TaGlmdC1DdHJsLUYgLyBDbWQtT3B0aW9uLUY8L2R0PjxkZD5SZXBsYWNlPC9kZD4KICAgICAgPGR0PlNoaWZ0LUN0cmwtUiAvIFNoaWZ0LUNtZC1PcHRpb24tRjwvZHQ+PGRkPlJlcGxhY2UgYWxsPC9kZD4KICAgICAgPGR0PkFsdC1GPC9kdD48ZGQ+UGVyc2lzdGVudCBzZWFyY2ggKGRpYWxvZyBkb2Vzbid0IGF1dG9jbG9zZSwKICAgICAgZW50ZXIgdG8gZmluZCBuZXh0LCBTaGlmdC1FbnRlciB0byBmaW5kIHByZXZpb3VzKTwvZGQ+CiAgICAgIDxkdD5BbHQtRzwvZHQ+PGRkPkp1bXAgdG8gbGluZTwvZGQ+CiAgICA8L2RsPgogICAgPHA+U2VhcmNoaW5nIGlzIGVuYWJsZWQgYnkKICAgIGluY2x1ZGluZyA8YSBocmVmPSIuLi9hZGRvbi9zZWFyY2gvc2VhcmNoLmpzIj5hZGRvbi9zZWFyY2gvc2VhcmNoLmpzPC9hPgogICAgYW5kIDxhIGhyZWY9Ii4uL2FkZG9uL3NlYXJjaC9zZWFyY2hjdXJzb3IuanMiPmFkZG9uL3NlYXJjaC9zZWFyY2hjdXJzb3IuanM8L2E+LgogICAgSnVtcCB0byBsaW5lIC0gaW5jbHVkaW5nIDxhIGhyZWY9Ii4uL2FkZG9uL3NlYXJjaC9qdW1wVG9MaW5lLmpzIj5hZGRvbi9zZWFyY2gvanVtcFRvTGluZS5qczwvYT4uPC9wPgogICAgPHA+Rm9yIGdvb2QtbG9va2luZyBpbnB1dCBkaWFsb2dzLCB5b3UgYWxzbyB3YW50IHRvIGluY2x1ZGUKICAgIDxhIGhyZWY9Ii4uL2FkZG9uL2RpYWxvZy9kaWFsb2cuanMiPmFkZG9uL2RpYWxvZy9kaWFsb2cuanM8L2E+CiAgICBhbmQgPGEgaHJlZj0iLi4vYWRkb24vZGlhbG9nL2RpYWxvZy5jc3MiPmFkZG9uL2RpYWxvZy9kaWFsb2cuY3NzPC9hPi48L3A+CiAgPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/demo/simplemode.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogU2ltcGxlIE1vZGUgRGVtbzwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxzY3JpcHQgc3JjPSIuLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9hZGRvbi9tb2RlL3NpbXBsZS5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9tb2RlL3htbC94bWwuanMiPjwvc2NyaXB0Pgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgogIC5Db2RlTWlycm9yIHtib3JkZXI6IDFweCBzb2xpZCBzaWx2ZXI7IG1hcmdpbi1ib3R0b206IDFlbTsgfQogIGR0IHsgdGV4dC1pbmRlbnQ6IC0yZW07IHBhZGRpbmctbGVmdDogMmVtOyBtYXJnaW4tdG9wOiAxZW07IH0KICBkZCB7IG1hcmdpbi1sZWZ0OiAxLjVlbTsgbWFyZ2luLWJvdHRvbTogMWVtOyB9CiAgZHQge21hcmdpbi10b3A6IDFlbTt9Cjwvc3R5bGU+Cgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxoMT5Db2RlTWlycm9yPC9oMT48aW1nIGlkPWxvZ28gc3JjPSIuLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+U2ltcGxlIE1vZGU8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPlNpbXBsZSBNb2RlIERlbW88L2gyPgoKPHA+VGhlIDxhIGhyZWY9Ii4uL2FkZG9uL21vZGUvc2ltcGxlLmpzIj48Y29kZT5tb2RlL3NpbXBsZTwvY29kZT48L2E+CmFkZG9uIGFsbG93cyBDb2RlTWlycm9yIG1vZGVzIHRvIGJlIHNwZWNpZmllZCB1c2luZyBhIHJlbGF0aXZlbHkgc2ltcGxlCmRlY2xhcmF0aXZlIGZvcm1hdC4gVGhpcyBmb3JtYXQgaXMgbm90IGFzIHBvd2VyZnVsIGFzIHdyaXRpbmcgY29kZQpkaXJlY3RseSBhZ2FpbnN0IHRoZSA8YSBocmVmPSIuLi9kb2MvbWFudWFsLmh0bWwjbW9kZWFwaSI+bW9kZQppbnRlcmZhY2U8L2E+LCBidXQgaXMgYSBsb3QgZWFzaWVyIHRvIGdldCBzdGFydGVkIHdpdGgsIGFuZApzdWZmaWNpZW50bHkgZXhwcmVzc2l2ZSBmb3IgbWFueSBzaW1wbGUgbGFuZ3VhZ2UgbW9kZXMuPC9wPgoKPHA+VGhpcyBpbnRlcmZhY2UgaXMgc3RpbGwgaW4gZmx1eC4gSXQgaXMgdW5saWtlbHkgdG8gYmUgc2NyYXBwZWQgb3IKb3ZlcmhhdWxlZCBjb21wbGV0ZWx5LCBzbyBkbyBzdGFydCB3cml0aW5nIGNvZGUgYWdhaW5zdCBpdCwgYnV0CmRldGFpbHMgbWlnaHQgY2hhbmdlIGFzIGl0IHN0YWJpbGl6ZXMsIGFuZCB5b3UgbWlnaHQgaGF2ZSB0byB0d2Vhawp5b3VyIGNvZGUgd2hlbiB1cGdyYWRpbmcuPC9wPgoKPHA+U2ltcGxlIG1vZGVzIChsb29zZWx5IGJhc2VkIG9uCnRoZSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbW96aWxsYS9za3l3cml0ZXIvd2lraS9Db21tb24tSmF2YVNjcmlwdC1TeW50YXgtSGlnaGxpZ2h0aW5nLVNwZWNpZmljYXRpb24iPkNvbW1vbgpKYXZhU2NyaXB0IFN5bnRheCBIaWdobGlnaHRpbmcgU3BlY2lmaWNhdGlvbjwvYT4sIHdoaWNoIG5ldmVyIHRvb2sKb2ZmKSwgYXJlIHN0YXRlIG1hY2hpbmVzLCB3aGVyZSBlYWNoIHN0YXRlIGhhcyBhIG51bWJlciBvZiBydWxlcyB0aGF0Cm1hdGNoIHRva2Vucy4gQSBydWxlIGRlc2NyaWJlcyBhIHR5cGUgb2YgdG9rZW4gdGhhdCBtYXkgb2NjdXIgaW4gdGhlCmN1cnJlbnQgc3RhdGUsIGFuZCBwb3NzaWJseSBhIHRyYW5zaXRpb24gdG8gYW5vdGhlciBzdGF0ZSBjYXVzZWQgYnkKdGhhdCB0b2tlbi48L3A+Cgo8cD5UaGUgPGNvZGU+Q29kZU1pcnJvci5kZWZpbmVTaW1wbGVNb2RlKG5hbWUsIHN0YXRlcyk8L2NvZGU+IG1ldGhvZAp0YWtlcyBhIG1vZGUgbmFtZSBhbmQgYW4gb2JqZWN0IHRoYXQgZGVzY3JpYmVzIHRoZSBtb2RlJ3Mgc3RhdGVzLiBUaGUKZWRpdG9yIGJlbG93IHNob3dzIGFuIGV4YW1wbGUgb2Ygc3VjaCBhIG1vZGUgKGFuZCBpcyBpdHNlbGYKaGlnaGxpZ2h0ZWQgYnkgdGhlIG1vZGUgc2hvd24gaW4gaXQpLjwvcD4KCjxkaXYgaWQ9ImNvZGUiPjwvZGl2PgoKPHA+RWFjaCBzdGF0ZSBpcyBhbiBhcnJheSBvZiBydWxlcy4gQSBydWxlIG1heSBoYXZlIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczo8L3A+Cgo8ZGw+CiAgPGR0Pjxjb2RlPjxzdHJvbmc+cmVnZXg8L3N0cm9uZz46IHN0cmluZyB8IFJlZ0V4cDwvY29kZT48L2R0PgogIDxkZD5UaGUgcmVndWxhciBleHByZXNzaW9uIHRoYXQgbWF0Y2hlcyB0aGUgdG9rZW4uIE1heSBiZSBhIHN0cmluZwogIG9yIGEgcmVnZXggb2JqZWN0LiBXaGVuIGEgcmVnZXgsIHRoZSA8Y29kZT5pZ25vcmVDYXNlPC9jb2RlPiBmbGFnCiAgd2lsbCBiZSB0YWtlbiBpbnRvIGFjY291bnQgd2hlbiBtYXRjaGluZyB0aGUgdG9rZW4uIFRoaXMgcmVnZXgKICBzaG91bGQgb25seSBjYXB0dXJlIGdyb3VwcyB3aGVuIHRoZSA8Y29kZT50b2tlbjwvY29kZT4gcHJvcGVydHkgaXMKICBhbiBhcnJheS48L2RkPgogIDxkdD48Y29kZT48c3Ryb25nPnRva2VuPC9zdHJvbmc+PC9jb2RlPjogc3RyaW5nIHwgbnVsbDwvZHQ+CiAgPGRkPkFuIG9wdGlvbmFsIHRva2VuIHN0eWxlLiBNdWx0aXBsZSBzdHlsZXMgY2FuIGJlIHNwZWNpZmllZCBieQogIHNlcGFyYXRpbmcgdGhlbSB3aXRoIGRvdHMgb3Igc3BhY2VzLiBXaGVuIHRoZSA8Y29kZT5yZWdleDwvY29kZT4gZm9yCiAgdGhpcyBydWxlIGNhcHR1cmVzIGdyb3VwcywgaXQgbXVzdCBjYXB0dXJlIDxlbT5hbGw8L2VtPiBvZiB0aGUKICBzdHJpbmcgKHNpbmNlIEpTIHByb3ZpZGVzIG5vIHdheSB0byBmaW5kIG91dCB3aGVyZSBhIGdyb3VwIG1hdGNoZWQpLAogIGFuZCB0aGlzIHByb3BlcnR5IG11c3QgaG9sZCBhbiBhcnJheSBvZiB0b2tlbiBzdHlsZXMgdGhhdCBoYXMgb25lCiAgc3R5bGUgZm9yIGVhY2ggbWF0Y2hlZCBncm91cC48L2RkPgogIDxkdD48Y29kZT48c3Ryb25nPnNvbDwvc3Ryb25nPjwvY29kZT46IGJvb2xlYW48L2R0PgogIDxkZD5XaGVuIHRydWUsIHRoaXMgdG9rZW4gd2lsbCBvbmx5IG1hdGNoIGF0IHRoZSBzdGFydCBvZiB0aGUgbGluZS4KICAoVGhlIDxjb2RlPl48L2NvZGU+IHJlZ2V4cCBtYXJrZXIgZG9lc24ndCB3b3JrIGFzIHlvdSdkIGV4cGVjdCBpbgogIHRoaXMgY29udGV4dCBiZWNhdXNlIG9mIGxpbWl0YXRpb25zIGluIEphdmFTY3JpcHQncyBSZWdFeHAKICBBUEkuKTwvZGQ+CiAgPGR0Pjxjb2RlPjxzdHJvbmc+bmV4dDwvc3Ryb25nPjogc3RyaW5nPC9jb2RlPjwvZHQ+CiAgPGRkPldoZW4gYSA8Y29kZT5uZXh0PC9jb2RlPiBwcm9wZXJ0eSBpcyBwcmVzZW50LCB0aGUgbW9kZSB3aWxsCiAgdHJhbnNmZXIgdG8gdGhlIHN0YXRlIG5hbWVkIGJ5IHRoZSBwcm9wZXJ0eSB3aGVuIHRoZSB0b2tlbiBpcwogIGVuY291bnRlcmVkLjwvZGQ+CiAgPGR0Pjxjb2RlPjxzdHJvbmc+cHVzaDwvc3Ryb25nPjogc3RyaW5nPC9jb2RlPjwvZHQ+CiAgPGRkPkxpa2UgPGNvZGU+bmV4dDwvY29kZT4sIGJ1dCBpbnN0ZWFkIHJlcGxhY2luZyB0aGUgY3VycmVudCBzdGF0ZQogIGJ5IHRoZSBuZXcgc3RhdGUsIHRoZSBjdXJyZW50IHN0YXRlIGlzIGtlcHQgb24gYSBzdGFjaywgYW5kIGNhbiBiZQogIHJldHVybmVkIHRvIHdpdGggdGhlIDxjb2RlPnBvcDwvY29kZT4gZGlyZWN0aXZlLjwvZGQ+CiAgPGR0Pjxjb2RlPjxzdHJvbmc+cG9wPC9zdHJvbmc+OiBib29sPC9jb2RlPjwvZHQ+CiAgPGRkPldoZW4gdHJ1ZSwgYW5kIHRoZXJlIGlzIGFub3RoZXIgc3RhdGUgb24gdGhlIHN0YXRlIHN0YWNrLCB3aWxsCiAgY2F1c2UgdGhlIG1vZGUgdG8gcG9wIHRoYXQgc3RhdGUgb2ZmIHRoZSBzdGFjayBhbmQgdHJhbnNpdGlvbiB0bwogIGl0LjwvZGQ+CiAgPGR0Pjxjb2RlPjxzdHJvbmc+bW9kZTwvc3Ryb25nPjoge3NwZWMsIGVuZCwgcGVyc2lzdGVudH08L2NvZGU+PC9kdD4KICA8ZGQ+Q2FuIGJlIHVzZWQgdG8gZW1iZWQgYW5vdGhlciBtb2RlIGluc2lkZSBhIG1vZGUuIFdoZW4gcHJlc2VudCwKICBtdXN0IGhvbGQgYW4gb2JqZWN0IHdpdGggYSA8Y29kZT5zcGVjPC9jb2RlPiBwcm9wZXJ0eSB0aGF0IGRlc2NyaWJlcwogIHRoZSBlbWJlZGRlZCBtb2RlLCBhbmQgYW4gb3B0aW9uYWwgPGNvZGU+ZW5kPC9jb2RlPiBlbmQgcHJvcGVydHkKICB0aGF0IHNwZWNpZmllcyB0aGUgcmVnZXhwIHRoYXQgd2lsbCBlbmQgdGhlIGV4dGVudCBvZiB0aGUgbW9kZS4gV2hlbgogIGEgPGNvZGU+cGVyc2lzdGVudDwvY29kZT4gcHJvcGVydHkgaXMgc2V0IChhbmQgdHJ1ZSksIHRoZSBuZXN0ZWQKICBtb2RlJ3Mgc3RhdGUgd2lsbCBiZSBwcmVzZXJ2ZWQgYmV0d2VlbiBvY2N1cnJlbmNlcyBvZiB0aGUgbW9kZS48L2RkPgogIDxkdD48Y29kZT48c3Ryb25nPmluZGVudDwvc3Ryb25nPjogYm9vbDwvY29kZT48L2R0PgogIDxkZD5XaGVuIHRydWUsIHRoaXMgdG9rZW4gY2hhbmdlcyB0aGUgaW5kZW50YXRpb24gdG8gYmUgb25lIHVuaXQKICBtb3JlIHRoYW4gdGhlIGN1cnJlbnQgbGluZSdzIGluZGVudGF0aW9uLjwvZGQ+CiAgPGR0Pjxjb2RlPjxzdHJvbmc+ZGVkZW50PC9zdHJvbmc+OiBib29sPC9jb2RlPjwvZHQ+CiAgPGRkPldoZW4gdHJ1ZSwgdGhpcyB0b2tlbiB3aWxsIHBvcCBvbmUgc2NvcGUgb2ZmIHRoZSBpbmRlbnRhdGlvbgogIHN0YWNrLjwvZGQ+CiAgPGR0Pjxjb2RlPjxzdHJvbmc+ZGVkZW50SWZMaW5lU3RhcnQ8L3N0cm9uZz46IGJvb2w8L2NvZGU+PC9kdD4KICA8ZGQ+SWYgYSB0b2tlbiBoYXMgaXRzIDxjb2RlPmRlZGVudDwvY29kZT4gcHJvcGVydHkgc2V0LCBpdCB3aWxsLCBieQogIGRlZmF1bHQsIGNhdXNlIGxpbmVzIHdoZXJlIGl0IGFwcGVhcnMgYXQgdGhlIHN0YXJ0IHRvIGJlIGRlZGVudGVkLgogIFNldCB0aGlzIHByb3BlcnR5IHRvIGZhbHNlIHRvIHByZXZlbnQgdGhhdCBiZWhhdmlvci48L2RkPgo8L2RsPgoKPHA+VGhlIDxjb2RlPm1ldGE8L2NvZGU+IHByb3BlcnR5IG9mIHRoZSBzdGF0ZXMgb2JqZWN0IGlzIHNwZWNpYWwsIGFuZAp3aWxsIG5vdCBiZSBpbnRlcnByZXRlZCBhcyBhIHN0YXRlLiBJbnN0ZWFkLCBwcm9wZXJ0aWVzIHNldCBvbiBpdCB3aWxsCmJlIHNldCBvbiB0aGUgbW9kZSwgd2hpY2ggaXMgdXNlZnVsIGZvciBwcm9wZXJ0aWVzCmxpa2UgPGEgaHJlZj0iLi4vZG9jL21hbnVhbC5odG1sI2FkZG9uX2NvbW1lbnQiPjxjb2RlPmxpbmVDb21tZW50PC9jb2RlPjwvYT4sCndoaWNoIHNldHMgdGhlIGNvbW1lbnQgc3R5bGUgZm9yIGEgbW9kZS4gVGhlIHNpbXBsZSBtb2RlIGFkZG9uIGFsc28KcmVjb2duaXplcyBhIGZldyBzdWNoIHByb3BlcnRpZXM6PC9wPgoKPGRsPgogIDxkdD48Y29kZT48c3Ryb25nPmRvbnRJbmRlbnRTdGF0ZXM8L3N0cm9uZz46IGFycmF5Jmx0O3N0cmluZyZndDs8L2NvZGU+PC9kdD4KICA8ZGQ+QW4gYXJyYXkgb2Ygc3RhdGVzIGluIHdoaWNoIHRoZSBtb2RlJ3MgYXV0by1pbmRlbnRhdGlvbiBzaG91bGQKICBub3QgdGFrZSBlZmZlY3QuIFVzdWFsbHkgdXNlZCBmb3IgbXVsdGktbGluZSBjb21tZW50IGFuZCBzdHJpbmcKICBzdGF0ZXMuPC9kZD4KPC9kbD4KCjxzY3JpcHQgaWQ9Im1vZGVjb2RlIj4vKiBFeGFtcGxlIGRlZmluaXRpb24gb2YgYSBzaW1wbGUgbW9kZSB0aGF0IHVuZGVyc3RhbmRzIGEgc3Vic2V0IG9mCiAqIEphdmFTY3JpcHQ6CiAqLwoKQ29kZU1pcnJvci5kZWZpbmVTaW1wbGVNb2RlKCJzaW1wbGVtb2RlIiwgewogIC8vIFRoZSBzdGFydCBzdGF0ZSBjb250YWlucyB0aGUgcnVsZXMgdGhhdCBhcmUgaW50aWFsbHkgdXNlZAogIHN0YXJ0OiBbCiAgICAvLyBUaGUgcmVnZXggbWF0Y2hlcyB0aGUgdG9rZW4sIHRoZSB0b2tlbiBwcm9wZXJ0eSBjb250YWlucyB0aGUgdHlwZQogICAge3JlZ2V4OiAvIig/OlteXFxdfFxcLikqPyg/OiJ8JCkvLCB0b2tlbjogInN0cmluZyJ9LAogICAgLy8gWW91IGNhbiBtYXRjaCBtdWx0aXBsZSB0b2tlbnMgYXQgb25jZS4gTm90ZSB0aGF0IHRoZSBjYXB0dXJlZAogICAgLy8gZ3JvdXBzIG11c3Qgc3BhbiB0aGUgd2hvbGUgc3RyaW5nIGluIHRoaXMgY2FzZQogICAge3JlZ2V4OiAvKGZ1bmN0aW9uKShccyspKFthLXokXVtcdyRdKikvLAogICAgIHRva2VuOiBbImtleXdvcmQiLCBudWxsLCAidmFyaWFibGUtMiJdfSwKICAgIC8vIFJ1bGVzIGFyZSBtYXRjaGVkIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IGFwcGVhciwgc28gdGhlcmUgaXMKICAgIC8vIG5vIGFtYmlndWl0eSBiZXR3ZWVuIHRoaXMgb25lIGFuZCB0aGUgb25lIGFib3ZlCiAgICB7cmVnZXg6IC8oPzpmdW5jdGlvbnx2YXJ8cmV0dXJufGlmfGZvcnx3aGlsZXxlbHNlfGRvfHRoaXMpXGIvLAogICAgIHRva2VuOiAia2V5d29yZCJ9LAogICAge3JlZ2V4OiAvdHJ1ZXxmYWxzZXxudWxsfHVuZGVmaW5lZC8sIHRva2VuOiAiYXRvbSJ9LAogICAge3JlZ2V4OiAvMHhbYS1mXGRdK3xbLStdPyg/OlwuXGQrfFxkK1wuP1xkKikoPzplWy0rXT9cZCspPy9pLAogICAgIHRva2VuOiAibnVtYmVyIn0sCiAgICB7cmVnZXg6IC9cL1wvLiovLCB0b2tlbjogImNvbW1lbnQifSwKICAgIHtyZWdleDogL1wvKD86W15cXF18XFwuKSo/XC8vLCB0b2tlbjogInZhcmlhYmxlLTMifSwKICAgIC8vIEEgbmV4dCBwcm9wZXJ0eSB3aWxsIGNhdXNlIHRoZSBtb2RlIHRvIG1vdmUgdG8gYSBkaWZmZXJlbnQgc3RhdGUKICAgIHtyZWdleDogL1wvXCovLCB0b2tlbjogImNvbW1lbnQiLCBuZXh0OiAiY29tbWVudCJ9LAogICAge3JlZ2V4OiAvWy0rXC8qPTw+IV0rLywgdG9rZW46ICJvcGVyYXRvciJ9LAogICAgLy8gaW5kZW50IGFuZCBkZWRlbnQgcHJvcGVydGllcyBndWlkZSBhdXRvaW5kZW50YXRpb24KICAgIHtyZWdleDogL1tce1xbXChdLywgaW5kZW50OiB0cnVlfSwKICAgIHtyZWdleDogL1tcfVxdXCldLywgZGVkZW50OiB0cnVlfSwKICAgIHtyZWdleDogL1thLXokXVtcdyRdKi8sIHRva2VuOiAidmFyaWFibGUifSwKICAgIC8vIFlvdSBjYW4gZW1iZWQgb3RoZXIgbW9kZXMgd2l0aCB0aGUgbW9kZSBwcm9wZXJ0eS4gVGhpcyBydWxlCiAgICAvLyBjYXVzZXMgYWxsIGNvZGUgYmV0d2VlbiA8PCBhbmQgPj4gdG8gYmUgaGlnaGxpZ2h0ZWQgd2l0aCB0aGUgWE1MCiAgICAvLyBtb2RlLgogICAge3JlZ2V4OiAvPDwvLCB0b2tlbjogIm1ldGEiLCBtb2RlOiB7c3BlYzogInhtbCIsIGVuZDogLz4+L319CiAgXSwKICAvLyBUaGUgbXVsdGktbGluZSBjb21tZW50IHN0YXRlLgogIGNvbW1lbnQ6IFsKICAgIHtyZWdleDogLy4qP1wqXC8vLCB0b2tlbjogImNvbW1lbnQiLCBuZXh0OiAic3RhcnQifSwKICAgIHtyZWdleDogLy4qLywgdG9rZW46ICJjb21tZW50In0KICBdLAogIC8vIFRoZSBtZXRhIHByb3BlcnR5IGNvbnRhaW5zIGdsb2JhbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbW9kZS4gSXQKICAvLyBjYW4gY29udGFpbiBwcm9wZXJ0aWVzIGxpa2UgbGluZUNvbW1lbnQsIHdoaWNoIGFyZSBzdXBwb3J0ZWQgYnkKICAvLyBhbGwgbW9kZXMsIGFuZCBhbHNvIGRpcmVjdGl2ZXMgbGlrZSBkb250SW5kZW50U3RhdGVzLCB3aGljaCBhcmUKICAvLyBzcGVjaWZpYyB0byBzaW1wbGUgbW9kZXMuCiAgbWV0YTogewogICAgZG9udEluZGVudFN0YXRlczogWyJjb21tZW50Il0sCiAgICBsaW5lQ29tbWVudDogIi8vIgogIH0KfSk7Cjwvc2NyaXB0PgoKPHNjcmlwdD4KdmFyIHNjID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm1vZGVjb2RlIik7CnZhciBjb2RlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKTsKdmFyIGVkaXRvciA9IENvZGVNaXJyb3IoY29kZSwgewogIHZhbHVlOiAoc2MudGV4dENvbnRlbnQgfHwgc2MuaW5uZXJUZXh0IHx8IHNjLmlubmVySFRNTCksCiAgbW9kZTogInNpbXBsZW1vZGUiCn0pOwo8L3NjcmlwdD4KCjwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/demo/simplescrollbars.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogU2ltcGxlIFNjcm9sbGJhciBEZW1vPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9hZGRvbi9zY3JvbGwvc2ltcGxlc2Nyb2xsYmFycy5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vbW9kZS9tYXJrZG93bi9tYXJrZG93bi5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9tb2RlL3htbC94bWwuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vYWRkb24vc2Nyb2xsL3NpbXBsZXNjcm9sbGJhcnMuanMiPjwvc2NyaXB0PgoKPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aDE+Q29kZU1pcnJvcjwvaDE+PGltZyBpZD1sb2dvIHNyYz0iLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPlNpbXBsZSBTY3JvbGxiYXI8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPlNpbXBsZSBTY3JvbGxiYXIgRGVtbzwvaDI+Cjxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+IyBDdXN0b20gU2Nyb2xsYmFycwoKVGhpcyBpcyBhIHBpZWNlIG9mIHRleHQgdGhhdCBjcmVhdGVzIHNjcm9sbGJhcnMKCkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0LCB0dXJwaXMgbmVjIGZhY2lsaXNpcyBuZXF1ZSB2ZXN0aWJ1bHVtIGFkaXBpc2NpbmcsIG1hZ25hIG51bmMgZXN0IGx1Y3R1cyBvcmNpIGEsCmFsaXF1YW0gZHVpcyBhZCB2b2x1dHBhdCBub3N0cmEuIFZlc3RpYnVsdW0gdWx0cmljaWVzIHN1c3BlbmRpc3NlIGNvbW1vZG8gdm9sdXRwYXQgcGVkZSBzZWQuIEJpYmVuZHVtIG9kaW8KZGlnbmlzc2ltLCBhZCB2aXRhZSBtb2xsaXMgYWMgc2VkIG5pYmggcXVpcywgc3VzcGVuZGlzc2UgZGlhbSwgcmlzdXMgcXVhcyBibGFuZGl0IHBoYXNlbGx1cyBsdWN0dXMgbmVjLAppbnRlZ2VyIG51bmMgdml0YWUgcG9zdWVyZSBzY2VsZXJpc3F1ZS4gTG9ib3J0aXMgcXVhbSBwb3J0YSBjb251YmlhIG51bGxhLiBFdCBuaXNsIGFjLCBpbXBlcmRpZXQgdml0YWUgYWMuClBhcnR1cmllbnQgc2l0LiBFdCB2ZXN0aWJ1bHVtIGV1aXNtb2QsIHJ1dHJ1bSBudW5jIGxpYmVybyBtYXVyaXMgcHVydXMgY29udmFsbGlzLiBDdW0gaWQgYWRpcGlzY2luZyBldCBlZ2V0CnByZXRpdW0gcnV0cnVtLCB1bHRyaWNlcyBzYXBpZW4gbWFnbmlzIGZyaW5naWxsYSBzaXQgbG9yZW0sIGV1IHZpdGFlIHNjZWxlcmlzcXVlIGlwc3VtIGFsaXF1ZXQsIG1hZ25hIHNlZApmdXNjZSB2ZWwuCgpMZWN0dXMgdWx0cmljaWVzIGxpYmVybyBkb2xvciBjb252YWxsaXMsIHNlZCBldGlhbSB2ZWwgaGVuZHJlcml0IGVnZXN0YXMgdml2ZXJyYSwgYXQgdXJuYSBtYXVyaXMsIGVnZXQKdnVscHV0YXRlIGRvbG9yIHZvbHVwdGF0ZW0sIG51bGxhIGVnZXQgc29sbGljaXR1ZGluLiBTZWQgdGluY2lkdW50LCBlbGl0IHNvY2lpcy4gTWF0dGlzIG1pIHRvcnRvciBkdWkgaWQKc29kYWxlcyBtaSwgbWFlY2VuYXMgbmFtIGZyaW5naWxsYSByaXN1cyB0dXJwaXMgbWF1cmlzIHByYWVzZW50LCBpbXBlcmRpZXQgbWFlY2VuYXMgdWx0cmljZXMgbm9udW1teSB0ZWxsdXMKcXVpcyBlc3QuIFNjZWxlcmlzcXVlIG5lYyBwaGFyZXRyYSBxdWlzIHZhcml1cyBmcmluZ2lsbGEuIFZhcml1cyB2ZXN0aWJ1bHVtIG5vbiBkaWN0dW0gcGhhcmV0cmEsIHRpbmNpZHVudCBpbgp2ZXN0aWJ1bHVtIGlhY3VsaXMgbW9sZXN0aWUsIGlkIGNvbmRpbWVudHVtIGJsYW5kaXQgZWxpdCB1cm5hIG1hZ25hIHB1bHZpbmFyLCBxdWFtIHN1c3BlbmRpc3NlIHBlbGxlbnRlc3F1ZQpkb25lYy4gVmVsIGFtZXQgYWQgYWMuIE5lYyBhdXQgdml2ZXJyYSwgbW9yYmkgbWkgbmVxdWUgbWFzc2EsIHR1cnBpcyBlbmltIHByb2luLiBUZWxsdXMgZXUsIGZlcm1lbnR1bSB2ZWxpdAplc3QgY29udmFsbGlzIGFsaXF1YW0gdmVsaXQsIHJ1dHJ1bSBpbiBkaWFtIGxhY3VzLCBwcmFlc2VudCB0ZW1wb3IgcGVsbGVudGVzcXVlIGRpY3R1bSBzZW1wZXIgYXVndWUuIEZlbGlzCmV4cGxpY2FibyBtYXNzYSBhbWV0IGxlY3R1cyBwaGFzZWxsdXMgZG9sb3IuIFV0IGxvcmVtIHF1aXMgYXJjdSBuZXF1ZSBmZWxpcyB1bHRyaWNpZXMsIHNlbmVjdHVzIHZpdGFlCmN1cmFiaXR1ciBzZWQgcGVsbGVudGVzcXVlIGV0LCBpZCBzZWQgcmlzdXMgaW4gc2VkIGFjIGFjY3Vtc2FuLCBibGFuZGl0IGFyY3UgcXVhbSBkdWlzIG51bmMuCgpTZWQgbGVvIHNvbGxpY2l0dWRpbiBvZGlvIHZpdGFlLCBwdXJ1cyBzaXQgZWdlc3RhcywganVzdG8gZXJvcyBpbmNlcHRvcyBhdWN0b3IgZmVybWVudHVtIGxlY3R1cy4gTGlndWxhIGx1Y3R1cwp0dXJwaXMsIHF1b2QgbWFzc2Egdml0YWUgZWxlbWVudHVtIG9yY2ksIG51bGxhbSBmcmluZ2lsbGEgZWxpdCB0b3J0b3IuIEp1c3RvIGFudGUgdGVtcG9yIGFtZXQgcXVhbSBwb3N1ZXJlCnZvbHV0cGF0LiBGYWNpbGlzaXMgcGVkZSBlcmF0IHV0IGhhYyB1bHRyaWNlcyBpcHN1bSwgd2lzaSBkdWlzIHNpdCBtZXR1cy4gRG9sb3Igdml0YWUgZXN0IHNlZCBzZWQgdml0YWUuIFNlZApldSBsaWd1bGEsIG1vcmJpIHZlc3RpYnVsdW0gbnVuYyBuaWJoIHZlbGl0IHV0IHRhY2l0aSwgbGlndWxhIGVsaXQgc2VtcGVyIHNhZ2l0dGlzIGluLCBhdWN0b3IgYXJjdSB2ZWwgZWdldC4KTWF1cmlzIGF0IHZpdGFlIG5lYyBzdXNwZW5kaXNzZSBldCwgYWVuZWFuIHByb2luIGJsYW5kaXQgc3VzY2lwaXQuIE1vcmJpIHF1YW0sIGRvbG9yIHVsdHJpY2llcy4gVml2ZXJyYQp0ZW1wdXMuIFN1c3BlbmRpc3NlIHNpdCBkYXBpYnVzLCBhYyBmdWdhIGFlbmVhbiwgbWFnbmEgbmlzbCBub251bW15IGF1Z3VlIHBvc3VlcmUsIGRpY3R1bSB1dCBmdWdhIHZlbGl0CnBhcnR1cmllbnQgYXVndWUgaW50ZXJkdW0sIG1hdHRpcyBzaXQgdGVsbHVzLgoKVmVoaWN1bGEgY29tbW9kbyB0ZW1wdXMgY3VyYWJpdHVyIGVyb3MsIGxhY2luaWEgZXJhdCB2dWxwdXRhdGUgbG9yZW0gdmVsIGZlcm1lbnR1bSBkb25lYywgbGVjdHVzIHNlZCBjb251YmlhCmlkIHBlbGxlbnRlc3F1ZS4gVmVsIHNlbmVjdHVzIGRvbmVjIHBlZGUgYWxpcXVldCBkb2xvciBzaXQsIG5lYyB2aXZhbXVzIGp1c3RvIHBsYWNlcmF0IGludGVyZHVtIG1hZWNlbmFzLApzb2RhbGVzIGV1aXNtb2QuIFF1aXMgbmV0dXMgc2FwaWVuIGFtZXQsIHZlc3RpYnVsdW0gcXVhbSBuZWMgYW1ldCBsYWNpbmlhLCBxdWlzIGFsaXF1ZXQsIHRlbXBvciB2aXZhbXVzIHRlbGx1cwplbmltLCBzdXNjaXBpdCBxdWlzIGVsZWlmZW5kLiBBbWV0IGNsYXNzIHBoYXNlbGx1cyBvcmNpIHByZXRpdW0sIHJpc3VzIGluIG51bGxhLiBOZXF1ZSBzaXQgdWxsYW1jb3JwZXIsCnVsdHJpY2llcyBwbGF0ZWEgaWQgbmVjIHN1c3BlbmRpc3NlIGFjLiBFdCBlbGVtZW50dW0uIERpY3R1bSBuYW0sIHV0IGR1aSBmZXJtZW50dW0gZWdlc3RhcyBmYWNpbGlzaXMgZWxpdAphdWd1ZSwgYWRpcGlzY2luZyBkb25lYyBpcHN1bSBlcmF0IG5hbSBwZWxsZW50ZXNxdWUgY29udmFsbGlzLCB2ZXN0aWJ1bHVtIHZlc3RpYnVsdW0gcmlzdXMgaWQgbnVsbGEgdXQgbWF1cmlzLApjdXJhYml0dXIgYXV0ZSBhcHRlbnQuIFVsdHJpY2VzIG9yY2kgd2lzaSBkdWkgaXBzdW0gcHJhZXNlbnQsIHBoYXJldHJhIGZlbGlzIGV1IHF1aXMuIEVzdCBmcmluZ2lsbGEgZXRpYW0sCm1heGltZSBzZW0gZGFwaWJ1cyBldCBlZ2V0LCBtaSBlbmltIGRpZ25pc3NpbSBuZWMgcHJldGl1bSwgYXVndWUgdmVoaWN1bGEsIHZvbHV0cGF0IHByb2luLiBFdCBvY2NhZWNhdGkKbG9ib3J0aXMgdml2ZXJyYSwgY3VtIGluIHNlZCwgdml2YW11cyB0ZWxsdXMuIExpYmVybyBhdCBtYWxlc3VhZGEgZXN0IHZpdmFtdXMgbGVvIHRvcnRvci4KPC90ZXh0YXJlYT48L2Zvcm0+Cgo8cD5UaGUgPGEgaHJlZj0iLi4vZG9jL21hbnVhbC5odG1sI2FkZG9uX3NpbXBsZXNjcm9sbGJhcnMiPjxjb2RlPnNpbXBsZXNjcm9sbGJhcnM8L2NvZGU+PC9hPiBhZGRvbiBkZWZpbmVzIHR3bwpzdHlsZXMgb2Ygbm9uLW5hdGl2ZSBzY3JvbGxiYXJzOiA8YSBocmVmPSJqYXZhc2NyaXB0OmVkaXRvci5zZXRPcHRpb24oJ3Njcm9sbGJhclN0eWxlJywgJ3NpbXBsZScpIj48Y29kZT4ic2ltcGxlIjwvY29kZT48L2E+IGFuZCA8YSBocmVmPSJqYXZhc2NyaXB0OmVkaXRvci5zZXRPcHRpb24oJ3Njcm9sbGJhclN0eWxlJywgJ292ZXJsYXknKSI+PGNvZGU+Im92ZXJsYXkiPC9jb2RlPjwvYT4gKGNsaWNrIHRvIHRyeSksIHdoaWNoIGNhbiBiZSBwYXNzZWQgdG8KdGhlIDxhIGhyZWY9Ii4uL2RvYy9tYW51YWwuaHRtbCNvcHRpb25fc2Nyb2xsYmFyU3R5bGUiPjxjb2RlPnNjcm9sbGJhclN0eWxlPC9jb2RlPjwvYT4gb3B0aW9uLiBUaGVzZSBpbXBsZW1lbnQKdGhlIHNjcm9sbGJhciB1c2luZyBET00gZWxlbWVudHMsIGFsbG93aW5nIG1vcmUgY29udHJvbCBvdmVyCml0cyA8YSBocmVmPSIuLi9hZGRvbi9zY3JvbGwvc2ltcGxlc2Nyb2xsYmFycy5jc3MiPmFwcGVhcmFuY2U8L2E+LjwvcD4KCiAgPHNjcmlwdD4KICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgICBzY3JvbGxiYXJTdHlsZTogInNpbXBsZSIKICAgIH0pOwogIDwvc2NyaXB0Pgo8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/demo/spanaffectswrapping_shim.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogQXV0b21hdGljYWxseSBkZXJpdmUgb2RkIHdyYXBwaW5nIGJlaGF2aW9yIGZvciB5b3VyIGJyb3dzZXI8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi9kb2MvZG9jcy5jc3MiPgoKPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aDE+Q29kZU1pcnJvcjwvaDE+PGltZyBpZD1sb2dvIHNyYz0iLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPkF1dG9tYXRpY2FsbHkgZGVyaXZlIG9kZCB3cmFwcGluZyBiZWhhdmlvciBmb3IgeW91ciBicm93c2VyPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5BdXRvbWF0aWNhbGx5IGRlcml2ZSBvZGQgd3JhcHBpbmcgYmVoYXZpb3IgZm9yIHlvdXIgYnJvd3NlcjwvaDI+CgoKICAgIDxwPlRoaXMgaXMgYSBoYWNrIHRvIGF1dG9tYXRpY2FsbHkgZGVyaXZlCiAgICBhIDxjb2RlPnNwYW5BZmZlY3RzV3JhcHBpbmc8L2NvZGU+IHJlZ2V4cCBmb3IgYSBicm93c2VyLiBTZWUgdGhlCiAgICBjb21tZW50cyBhYm92ZSB0aGF0IHZhcmlhYmxlCiAgICBpbiA8YSBocmVmPSIuLi9saWIvY29kZW1pcnJvci5qcyI+PGNvZGU+bGliL2NvZGVtaXJyb3IuanM8L2NvZGU+PC9hPgogICAgZm9yIHNvbWUgbW9yZSBkZXRhaWxzLjwvcD4KCiAgICA8ZGl2IHN0eWxlPSJ3aGl0ZS1zcGFjZTogcHJlLXdyYXA7IHdpZHRoOiA1MHB4OyIgaWQ9ImFyZWEiPjwvZGl2PgogICAgPHByZSBpZD0ib3V0cHV0Ij48L3ByZT4KCiAgICA8c2NyaXB0IGlkPSJzY3JpcHQiPgogICAgICB2YXIgYSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhcmVhIiksIGJhZCA9IE9iamVjdC5jcmVhdGUobnVsbCk7CiAgICAgIHZhciBjaGFycyA9ICJhfmAhQCMkJV4mKigpLV89K317W11cXHwnXCIvPy4+LDw6OyIsIGwgPSBjaGFycy5sZW5ndGg7CiAgICAgIGZvciAodmFyIHggPSAwOyB4IDwgbDsgKyt4KSBmb3IgKHZhciB5ID0gMDsgeSA8IGw7ICsreSkgewogICAgICAgIHZhciBzMSA9ICJmb29vbyIgKyBjaGFycy5jaGFyQXQoeCksIHMyID0gY2hhcnMuY2hhckF0KHkpICsgImJyIjsKICAgICAgICBhLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHMxICsgczIpKTsKICAgICAgICB2YXIgaDEgPSBhLm9mZnNldEhlaWdodDsKICAgICAgICBhLmlubmVySFRNTCA9ICIiOwogICAgICAgIGEuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpKS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShzMSkpOwogICAgICAgIGEuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpKS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShzMikpOwogICAgICAgIGlmIChhLm9mZnNldEhlaWdodCAhPSBoMSkKICAgICAgICAgIGJhZFtjaGFycy5jaGFyQXQoeCldID0gKGJhZFtjaGFycy5jaGFyQXQoeCldIHx8ICIiKSArIGNoYXJzLmNoYXJBdCh5KTsKICAgICAgICBhLmlubmVySFRNTCA9ICIiOwogICAgICB9CgogICAgICB2YXIgcmUgPSAiIjsKICAgICAgZnVuY3Rpb24gdG9SRUVsdChzdHIpIHsKICAgICAgICBpZiAoc3RyLmxlbmd0aCA+IDEpIHsKICAgICAgICAgIHZhciBpbnZlcnQgPSBmYWxzZTsKICAgICAgICAgIGlmIChzdHIubGVuZ3RoID4gY2hhcnMubGVuZ3RoICogLjYpIHsKICAgICAgICAgICAgaW52ZXJ0ID0gdHJ1ZTsKICAgICAgICAgICAgdmFyIG5ld1N0ciA9ICIiOwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGw7ICsraSkgaWYgKHN0ci5pbmRleE9mKGNoYXJzLmNoYXJBdChpKSkgPT0gLTEpIG5ld1N0ciArPSBjaGFycy5jaGFyQXQoaSk7CiAgICAgICAgICAgIHN0ciA9IG5ld1N0cjsKICAgICAgICAgIH0KICAgICAgICAgIHN0ciA9IHN0ci5yZXBsYWNlKC9bXC1cLlxdXCJcJ1xcXC9cXmFdL2csIGZ1bmN0aW9uKG9yaWcpIHsgcmV0dXJuIG9yaWcgPT0gImEiID8gIlxcdyIgOiAiXFwiICsgb3JpZzsgfSk7CiAgICAgICAgICByZXR1cm4gIlsiICsgKGludmVydCA/ICJeIiA6ICIiKSArIHN0ciArICJdIjsKICAgICAgICB9IGVsc2UgaWYgKHN0ciA9PSAiYSIpIHsKICAgICAgICAgIHJldHVybiAiXFx3IjsKICAgICAgICB9IGVsc2UgaWYgKC9bPyQqKCkre31bXF1cLnwvXCdcIl0vLnRlc3Qoc3RyKSkgewogICAgICAgICAgcmV0dXJuICJcXCIgKyBzdHI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBzdHI7CiAgICAgICAgfQogICAgICB9CgogICAgICB2YXIgbmV3UkUgPSAiIjsKICAgICAgZm9yICg7OykgewogICAgICAgIHZhciBsZWZ0ID0gbnVsbDsKICAgICAgICBmb3IgKHZhciBsZWZ0IGluIGJhZCkgYnJlYWs7CiAgICAgICAgaWYgKGxlZnQgPT0gbnVsbCkgYnJlYWs7CiAgICAgICAgdmFyIHJpZ2h0ID0gYmFkW2xlZnRdOwogICAgICAgIGRlbGV0ZSBiYWRbbGVmdF07CiAgICAgICAgZm9yICh2YXIgb3RoZXIgaW4gYmFkKSBpZiAoYmFkW290aGVyXSA9PSByaWdodCkgewogICAgICAgICAgbGVmdCArPSBvdGhlcjsKICAgICAgICAgIGRlbGV0ZSBiYWRbb3RoZXJdOwogICAgICAgIH0KICAgICAgICBuZXdSRSArPSAobmV3UkUgPyAifCIgOiAiIikgKyB0b1JFRWx0KGxlZnQpICsgdG9SRUVsdChyaWdodCk7CiAgICAgIH0KCiAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJvdXRwdXQiKS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiWW91ciByZWdleHAgaXM6ICIgKyAobmV3UkUgfHwgIl4kIikpKTsKICAgIDwvc2NyaXB0PgogIDwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/demo/sublime.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogU3VibGltZSBUZXh0IGJpbmRpbmdzIGRlbW88L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9saWIvY29kZW1pcnJvci5jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL2FkZG9uL2ZvbGQvZm9sZGd1dHRlci5jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL2FkZG9uL2RpYWxvZy9kaWFsb2cuY3NzIj4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi90aGVtZS9tb25va2FpLmNzcyI+CjxzY3JpcHQgc3JjPSIuLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9hZGRvbi9zZWFyY2gvc2VhcmNoY3Vyc29yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL2FkZG9uL3NlYXJjaC9zZWFyY2guanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vYWRkb24vZGlhbG9nL2RpYWxvZy5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9hZGRvbi9lZGl0L21hdGNoYnJhY2tldHMuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vYWRkb24vZWRpdC9jbG9zZWJyYWNrZXRzLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL2FkZG9uL2NvbW1lbnQvY29tbWVudC5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9hZGRvbi93cmFwL2hhcmR3cmFwLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL2FkZG9uL2ZvbGQvZm9sZGNvZGUuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vYWRkb24vZm9sZC9icmFjZS1mb2xkLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL21vZGUvamF2YXNjcmlwdC9qYXZhc2NyaXB0LmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL2tleW1hcC9zdWJsaW1lLmpzIj48L3NjcmlwdD4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KICAuQ29kZU1pcnJvciB7Ym9yZGVyLXRvcDogMXB4IHNvbGlkICNlZWU7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZWVlOyBsaW5lLWhlaWdodDogMS4zOyBoZWlnaHQ6IDUwMHB4fQogIC5Db2RlTWlycm9yLWxpbmVudW1iZXJzIHsgcGFkZGluZzogMCA4cHg7IH0KPC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aDE+Q29kZU1pcnJvcjwvaDE+PGltZyBpZD1sb2dvIHNyYz0iLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPlN1YmxpbWUgYmluZGluZ3M8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPlN1YmxpbWUgVGV4dCBiaW5kaW5ncyBkZW1vPC9oMj4KCjxwPlRoZSA8Y29kZT5zdWJsaW1lPC9jb2RlPiBrZXltYXAgZGVmaW5lcyBtYW55IFN1YmxpbWUgVGV4dC1zcGVjaWZpYwpiaW5kaW5ncyBmb3IgQ29kZU1pcnJvci4gU2VlIHRoZSBjb2RlIGJlbG93IGZvciBhbiBvdmVydmlldy48L3A+Cgo8cD5FbmFibGUgdGhlIGtleW1hcCBieQpsb2FkaW5nIDxhIGhyZWY9Ii4uL2tleW1hcC9zdWJsaW1lLmpzIj48Y29kZT5rZXltYXAvc3VibGltZS5qczwvY29kZT48L2E+CmFuZCBzZXR0aW5nCnRoZSA8YSBocmVmPSIuLi9kb2MvbWFudWFsLmh0bWwjb3B0aW9uX2tleU1hcCI+PGNvZGU+a2V5TWFwPC9jb2RlPjwvYT4Kb3B0aW9uIHRvIDxjb2RlPiJzdWJsaW1lIjwvY29kZT4uPC9wPgoKPHA+KEEgbG90IG9mIHRoZSBzZWFyY2ggZnVuY3Rpb25hbGl0eSBpcyBzdGlsbCBtaXNzaW5nLikKCjxzY3JpcHQ+CiAgdmFyIHZhbHVlID0gIi8vIFRoZSBiaW5kaW5ncyBkZWZpbmVkIHNwZWNpZmljYWxseSBpbiB0aGUgU3VibGltZSBUZXh0IG1vZGVcbnZhciBiaW5kaW5ncyA9IHtcbiI7CiAgdmFyIG1hcCA9IENvZGVNaXJyb3Iua2V5TWFwLnN1YmxpbWU7CiAgZm9yICh2YXIga2V5IGluIG1hcCkgewogICAgdmFyIHZhbCA9IG1hcFtrZXldOwogICAgaWYgKGtleSAhPSAiZmFsbHRocm91Z2giICYmIHZhbCAhPSAiLi4uIiAmJiAoIS9maW5kLy50ZXN0KHZhbCkgfHwgL2ZpbmRVbmRlci8udGVzdCh2YWwpKSkKICAgICAgdmFsdWUgKz0gIiAgXCIiICsga2V5ICsgIlwiOiBcIiIgKyB2YWwgKyAiXCIsXG4iOwogIH0KICB2YWx1ZSArPSAifVxuXG4vLyBUaGUgaW1wbGVtZW50YXRpb24gb2Ygam9pbkxpbmVzXG4iOwogIHZhbHVlICs9IENvZGVNaXJyb3IuY29tbWFuZHMuam9pbkxpbmVzLnRvU3RyaW5nKCkucmVwbGFjZSgvXmZ1bmN0aW9uXHMqXCgvLCAiZnVuY3Rpb24gam9pbkxpbmVzKCIpLnJlcGxhY2UoL1xuICAvZywgIlxuIikgKyAiXG4iOwogIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yKGRvY3VtZW50LmJvZHkuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImFydGljbGUiKVswXSwgewogICAgdmFsdWU6IHZhbHVlLAogICAgbGluZU51bWJlcnM6IHRydWUsCiAgICBtb2RlOiAiamF2YXNjcmlwdCIsCiAgICBrZXlNYXA6ICJzdWJsaW1lIiwKICAgIGF1dG9DbG9zZUJyYWNrZXRzOiB0cnVlLAogICAgbWF0Y2hCcmFja2V0czogdHJ1ZSwKICAgIHNob3dDdXJzb3JXaGVuU2VsZWN0aW5nOiB0cnVlLAogICAgdGhlbWU6ICJtb25va2FpIiwKICAgIHRhYlNpemU6IDIKICB9KTsKPC9zY3JpcHQ+Cgo8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/demo/tern.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogVGVybiBEZW1vPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9hZGRvbi9kaWFsb2cvZGlhbG9nLmNzcyI+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vYWRkb24vaGludC9zaG93LWhpbnQuY3NzIj4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9hZGRvbi90ZXJuL3Rlcm4uY3NzIj4KPHNjcmlwdCBzcmM9Ii4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL21vZGUvamF2YXNjcmlwdC9qYXZhc2NyaXB0LmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL2FkZG9uL2RpYWxvZy9kaWFsb2cuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vYWRkb24vaGludC9zaG93LWhpbnQuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vYWRkb24vdGVybi90ZXJuLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii8vdGVybmpzLm5ldC9ub2RlX21vZHVsZXMvYWNvcm4vZGlzdC9hY29ybi5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIvL3Rlcm5qcy5uZXQvbm9kZV9tb2R1bGVzL2Fjb3JuL2Rpc3QvYWNvcm5fbG9vc2UuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLy90ZXJuanMubmV0L25vZGVfbW9kdWxlcy9hY29ybi9kaXN0L3dhbGsuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLy90ZXJuanMubmV0L2RvYy9kZW1vL3BvbHlmaWxsLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii8vdGVybmpzLm5ldC9saWIvc2lnbmFsLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii8vdGVybmpzLm5ldC9saWIvdGVybi5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIvL3Rlcm5qcy5uZXQvbGliL2RlZi5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIvL3Rlcm5qcy5uZXQvbGliL2NvbW1lbnQuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLy90ZXJuanMubmV0L2xpYi9pbmZlci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIvL3Rlcm5qcy5uZXQvcGx1Z2luL2RvY19jb21tZW50LmpzIj48L3NjcmlwdD4KPHN0eWxlPgogICAgICAuQ29kZU1pcnJvciB7Ym9yZGVyOiAxcHggc29saWQgI2RkZDt9CiAgICA8L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxoMT5Db2RlTWlycm9yPC9oMT48aW1nIGlkPWxvZ28gc3JjPSIuLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+VGVybjwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+VGVybiBEZW1vPC9oMj4KPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4vLyBVc2UgY3RybC1zcGFjZSB0byBjb21wbGV0ZSBzb21ldGhpbmcKLy8gUHV0IHRoZSBjdXJzb3IgaW4gb3IgYWZ0ZXIgYW4gZXhwcmVzc2lvbiwgcHJlc3MgY3RybC1vIHRvCi8vIGZpbmQgaXRzIHR5cGUKCnZhciBmb28gPSBbImFycmF5IiwgIm9mIiwgInN0cmluZ3MiXTsKdmFyIGJhciA9IGZvby5zbGljZSgwLCAyKS5qb2luKCIiKS5zcGxpdCgiYSIpWzBdOwoKLy8gV29ya3MgZm9yIGxvY2FsbHkgZGVmaW5lZCB0eXBlcyB0b28uCgpmdW5jdGlvbiBDVG9yKCkgeyB0aGlzLnNpemUgPSAxMDsgfQpDVG9yLnByb3RvdHlwZS5oYWxsbyA9ICJoYWxsbyI7Cgp2YXIgYmF6ID0gbmV3IENUb3I7CmJhei4KCi8vIFlvdSBjYW4gcHJlc3MgY3RybC1xIHdoZW4gdGhlIGN1cnNvciBpcyBvbiBhIHZhcmlhYmxlIG5hbWUgdG8KLy8gcmVuYW1lIGl0LiBUcnkgaXQgd2l0aCBDVG9yLi4uCgovLyBXaGVuIHRoZSBjdXJzb3IgaXMgaW4gYW4gYXJndW1lbnQgbGlzdCwgdGhlIGFyZ3VtZW50cyBhcmUKLy8gc2hvd24gYmVsb3cgdGhlIGVkaXRvci4KClsxXS5yZWR1Y2UoICApOwoKLy8gQW5kIGEgbGl0dGxlIG1vcmUgYWR2YW5jZWQgY29kZS4uLgoKKGZ1bmN0aW9uKGV4cG9ydHMpIHsKICBleHBvcnRzLnJhbmRvbUVsdCA9IGZ1bmN0aW9uKGFycikgewogICAgcmV0dXJuIGFycltNYXRoLmZsb29yKGFyci5sZW5ndGggKiBNYXRoLnJhbmRvbSgpKV07CiAgfTsKICBleHBvcnRzLnN0ckxpc3QgPSAiZm9vIi5zcGxpdCgiIik7CiAgZXhwb3J0cy5pbnRMaXN0ID0gZXhwb3J0cy5zdHJMaXN0Lm1hcChmdW5jdGlvbihzKSB7IHJldHVybiBzLmNoYXJDb2RlQXQoMCk7IH0pOwp9KSh3aW5kb3cubXlNb2QgPSB7fSk7Cgp2YXIgcmFuZG9tU3RyID0gbXlNb2QucmFuZG9tRWx0KG15TW9kLnN0ckxpc3QpOwp2YXIgcmFuZG9tSW50ID0gbXlNb2QucmFuZG9tRWx0KG15TW9kLmludExpc3QpOwo8L3RleHRhcmVhPjwvZm9ybT4KCjxwPkRlbW9uc3RyYXRlcyBpbnRlZ3JhdGlvbiBvZiA8YSBocmVmPSJodHRwOi8vdGVybmpzLm5ldC8iPlRlcm48L2E+CmFuZCBDb2RlTWlycm9yLiBUaGUgZm9sbG93aW5nIGtleXMgYXJlIGJvdW5kOjwvcD4KCjxkbD4KICA8ZHQ+Q3RybC1TcGFjZTwvZHQ+PGRkPkF1dG9jb21wbGV0ZTwvZGQ+CiAgPGR0PkN0cmwtTzwvZHQ+PGRkPkZpbmQgZG9jcyBmb3IgdGhlIGV4cHJlc3Npb24gYXQgdGhlIGN1cnNvcjwvZGQ+CiAgPGR0PkN0cmwtSTwvZHQ+PGRkPkZpbmQgdHlwZSBhdCBjdXJzb3I8L2RkPgogIDxkdD5BbHQtLjwvZHQ+PGRkPkp1bXAgdG8gZGVmaW5pdGlvbiAoQWx0LSwgdG8ganVtcCBiYWNrKTwvZGQ+CiAgPGR0PkN0cmwtUTwvZHQ+PGRkPlJlbmFtZSB2YXJpYWJsZTwvZGQ+CiAgPGR0PkN0cmwtLjwvZHQ+PGRkPlNlbGVjdCBhbGwgb2NjdXJyZW5jZXMgb2YgYSB2YXJpYWJsZTwvZGQ+CjwvZGw+Cgo8cD5Eb2N1bWVudGF0aW9uIGlzIHNwYXJzZSBmb3Igbm93LiBTZWUgdGhlIHRvcCBvZgp0aGUgPGEgaHJlZj0iLi4vYWRkb24vdGVybi90ZXJuLmpzIj5zY3JpcHQ8L2E+IGZvciBhIHJvdWdoIEFQSQpvdmVydmlldy48L3A+Cgo8c2NyaXB0PgogIGZ1bmN0aW9uIGdldFVSTCh1cmwsIGMpIHsKICAgIHZhciB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKICAgIHhoci5vcGVuKCJnZXQiLCB1cmwsIHRydWUpOwogICAgeGhyLnNlbmQoKTsKICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpIHsKICAgICAgaWYgKHhoci5yZWFkeVN0YXRlICE9IDQpIHJldHVybjsKICAgICAgaWYgKHhoci5zdGF0dXMgPCA0MDApIHJldHVybiBjKG51bGwsIHhoci5yZXNwb25zZVRleHQpOwogICAgICB2YXIgZSA9IG5ldyBFcnJvcih4aHIucmVzcG9uc2VUZXh0IHx8ICJObyByZXNwb25zZSIpOwogICAgICBlLnN0YXR1cyA9IHhoci5zdGF0dXM7CiAgICAgIGMoZSk7CiAgICB9OwogIH0KCiAgdmFyIHNlcnZlcjsKICBnZXRVUkwoIi8vdGVybmpzLm5ldC9kZWZzL2VjbWFzY3JpcHQuanNvbiIsIGZ1bmN0aW9uKGVyciwgY29kZSkgewogICAgaWYgKGVycikgdGhyb3cgbmV3IEVycm9yKCJSZXF1ZXN0IGZvciBlY21hc2NyaXB0Lmpzb246ICIgKyBlcnIpOwogICAgc2VydmVyID0gbmV3IENvZGVNaXJyb3IuVGVyblNlcnZlcih7ZGVmczogW0pTT04ucGFyc2UoY29kZSldfSk7CiAgICBlZGl0b3Iuc2V0T3B0aW9uKCJleHRyYUtleXMiLCB7CiAgICAgICJDdHJsLVNwYWNlIjogZnVuY3Rpb24oY20pIHsgc2VydmVyLmNvbXBsZXRlKGNtKTsgfSwKICAgICAgIkN0cmwtSSI6IGZ1bmN0aW9uKGNtKSB7IHNlcnZlci5zaG93VHlwZShjbSk7IH0sCiAgICAgICJDdHJsLU8iOiBmdW5jdGlvbihjbSkgeyBzZXJ2ZXIuc2hvd0RvY3MoY20pOyB9LAogICAgICAiQWx0LS4iOiBmdW5jdGlvbihjbSkgeyBzZXJ2ZXIuanVtcFRvRGVmKGNtKTsgfSwKICAgICAgIkFsdC0sIjogZnVuY3Rpb24oY20pIHsgc2VydmVyLmp1bXBCYWNrKGNtKTsgfSwKICAgICAgIkN0cmwtUSI6IGZ1bmN0aW9uKGNtKSB7IHNlcnZlci5yZW5hbWUoY20pOyB9LAogICAgICAiQ3RybC0uIjogZnVuY3Rpb24oY20pIHsgc2VydmVyLnNlbGVjdE5hbWUoY20pOyB9CiAgICB9KQogICAgZWRpdG9yLm9uKCJjdXJzb3JBY3Rpdml0eSIsIGZ1bmN0aW9uKGNtKSB7IHNlcnZlci51cGRhdGVBcmdIaW50cyhjbSk7IH0pOwogIH0pOwoKICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgbGluZU51bWJlcnM6IHRydWUsCiAgICBtb2RlOiAiamF2YXNjcmlwdCIKICB9KTsKPC9zY3JpcHQ+CgogIDwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/demo/theme.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogVGhlbWUgRGVtbzwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vdGhlbWUvMzAyNC1kYXkuY3NzIj4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi90aGVtZS8zMDI0LW5pZ2h0LmNzcyI+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vdGhlbWUvYWJjZGVmLmNzcyI+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vdGhlbWUvYW1iaWFuY2UuY3NzIj4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi90aGVtZS9iYXNlMTYtZGFyay5jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL3RoZW1lL2Jlc3Bpbi5jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL3RoZW1lL2Jhc2UxNi1saWdodC5jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL3RoZW1lL2JsYWNrYm9hcmQuY3NzIj4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi90aGVtZS9jb2JhbHQuY3NzIj4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi90aGVtZS9jb2xvcmZvcnRoLmNzcyI+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vdGhlbWUvZHJhY3VsYS5jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL3RoZW1lL2R1b3RvbmUtZGFyay5jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL3RoZW1lL2R1b3RvbmUtbGlnaHQuY3NzIj4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi90aGVtZS9lY2xpcHNlLmNzcyI+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vdGhlbWUvZWxlZ2FudC5jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL3RoZW1lL2VybGFuZy1kYXJrLmNzcyI+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vdGhlbWUvaG9wc2NvdGNoLmNzcyI+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vdGhlbWUvaWNlY29kZXIuY3NzIj4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi90aGVtZS9pc290b3BlLmNzcyI+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vdGhlbWUvbGVzc2VyLWRhcmsuY3NzIj4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi90aGVtZS9saXF1aWJ5dGUuY3NzIj4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi90aGVtZS9tYXRlcmlhbC5jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL3RoZW1lL21iby5jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL3RoZW1lL21kbi1saWtlLmNzcyI+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vdGhlbWUvbWlkbmlnaHQuY3NzIj4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi90aGVtZS9tb25va2FpLmNzcyI+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vdGhlbWUvbmVhdC5jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL3RoZW1lL25lby5jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL3RoZW1lL25pZ2h0LmNzcyI+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vdGhlbWUvcGFuZGEtc3ludGF4LmNzcyI+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vdGhlbWUvcGFyYWlzby1kYXJrLmNzcyI+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vdGhlbWUvcGFyYWlzby1saWdodC5jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL3RoZW1lL3Bhc3RlbC1vbi1kYXJrLmNzcyI+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vdGhlbWUvcmFpbHNjYXN0cy5jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL3RoZW1lL3J1YnlibHVlLmNzcyI+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vdGhlbWUvc2V0aS5jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL3RoZW1lL3NvbGFyaXplZC5jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL3RoZW1lL3RoZS1tYXRyaXguY3NzIj4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi90aGVtZS90b21vcnJvdy1uaWdodC1icmlnaHQuY3NzIj4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi90aGVtZS90b21vcnJvdy1uaWdodC1laWdodGllcy5jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL3RoZW1lL3R0Y24uY3NzIj4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi90aGVtZS90d2lsaWdodC5jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL3RoZW1lL3ZpYnJhbnQtaW5rLmNzcyI+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vdGhlbWUveHEtZGFyay5jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL3RoZW1lL3hxLWxpZ2h0LmNzcyI+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vdGhlbWUveWV0aS5jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL3RoZW1lL3plbmJ1cm4uY3NzIj4KPHNjcmlwdCBzcmM9Ii4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL21vZGUvamF2YXNjcmlwdC9qYXZhc2NyaXB0LmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL2FkZG9uL3NlbGVjdGlvbi9hY3RpdmUtbGluZS5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9hZGRvbi9lZGl0L21hdGNoYnJhY2tldHMuanMiPjwvc2NyaXB0Pgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgogICAgICAuQ29kZU1pcnJvciB7Ym9yZGVyOiAxcHggc29saWQgYmxhY2s7IGZvbnQtc2l6ZToxM3B4fQogICAgPC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aDE+Q29kZU1pcnJvcjwvaDE+PGltZyBpZD1sb2dvIHNyYz0iLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPlRoZW1lPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5UaGVtZSBEZW1vPC9oMj4KPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KZnVuY3Rpb24gZmluZFNlcXVlbmNlKGdvYWwpIHsKICBmdW5jdGlvbiBmaW5kKHN0YXJ0LCBoaXN0b3J5KSB7CiAgICBpZiAoc3RhcnQgPT0gZ29hbCkKICAgICAgcmV0dXJuIGhpc3Rvcnk7CiAgICBlbHNlIGlmIChzdGFydCA+IGdvYWwpCiAgICAgIHJldHVybiBudWxsOwogICAgZWxzZQogICAgICByZXR1cm4gZmluZChzdGFydCArIDUsICIoIiArIGhpc3RvcnkgKyAiICsgNSkiKSB8fAogICAgICAgICAgICAgZmluZChzdGFydCAqIDMsICIoIiArIGhpc3RvcnkgKyAiICogMykiKTsKICB9CiAgcmV0dXJuIGZpbmQoMSwgIjEiKTsKfTwvdGV4dGFyZWE+PC9mb3JtPgoKPHA+U2VsZWN0IGEgdGhlbWU6IDxzZWxlY3Qgb25jaGFuZ2U9InNlbGVjdFRoZW1lKCkiIGlkPXNlbGVjdD4KICAgIDxvcHRpb24gc2VsZWN0ZWQ+ZGVmYXVsdDwvb3B0aW9uPgogICAgPG9wdGlvbj4zMDI0LWRheTwvb3B0aW9uPgogICAgPG9wdGlvbj4zMDI0LW5pZ2h0PC9vcHRpb24+CiAgICA8b3B0aW9uPmFiY2RlZjwvb3B0aW9uPgogICAgPG9wdGlvbj5hbWJpYW5jZTwvb3B0aW9uPgogICAgPG9wdGlvbj5iYXNlMTYtZGFyazwvb3B0aW9uPgogICAgPG9wdGlvbj5iYXNlMTYtbGlnaHQ8L29wdGlvbj4KICAgIDxvcHRpb24+YmVzcGluPC9vcHRpb24+CiAgICA8b3B0aW9uPmJsYWNrYm9hcmQ8L29wdGlvbj4KICAgIDxvcHRpb24+Y29iYWx0PC9vcHRpb24+CiAgICA8b3B0aW9uPmNvbG9yZm9ydGg8L29wdGlvbj4KICAgIDxvcHRpb24+ZHJhY3VsYTwvb3B0aW9uPgogICAgPG9wdGlvbj5kdW90b25lLWRhcms8L29wdGlvbj4KICAgIDxvcHRpb24+ZHVvdG9uZS1saWdodDwvb3B0aW9uPgogICAgPG9wdGlvbj5lY2xpcHNlPC9vcHRpb24+CiAgICA8b3B0aW9uPmVsZWdhbnQ8L29wdGlvbj4KICAgIDxvcHRpb24+ZXJsYW5nLWRhcms8L29wdGlvbj4KICAgIDxvcHRpb24+aG9wc2NvdGNoPC9vcHRpb24+CiAgICA8b3B0aW9uPmljZWNvZGVyPC9vcHRpb24+CiAgICA8b3B0aW9uPmlzb3RvcGU8L29wdGlvbj4KICAgIDxvcHRpb24+bGVzc2VyLWRhcms8L29wdGlvbj4KICAgIDxvcHRpb24+bGlxdWlieXRlPC9vcHRpb24+CiAgICA8b3B0aW9uPm1hdGVyaWFsPC9vcHRpb24+CiAgICA8b3B0aW9uPm1ibzwvb3B0aW9uPgogICAgPG9wdGlvbj5tZG4tbGlrZTwvb3B0aW9uPgogICAgPG9wdGlvbj5taWRuaWdodDwvb3B0aW9uPgogICAgPG9wdGlvbj5tb25va2FpPC9vcHRpb24+CiAgICA8b3B0aW9uPm5lYXQ8L29wdGlvbj4KICAgIDxvcHRpb24+bmVvPC9vcHRpb24+CiAgICA8b3B0aW9uPm5pZ2h0PC9vcHRpb24+CiAgICA8b3B0aW9uPnBhbmRhLXN5bnRheDwvb3B0aW9uPgogICAgPG9wdGlvbj5wYXJhaXNvLWRhcms8L29wdGlvbj4KICAgIDxvcHRpb24+cGFyYWlzby1saWdodDwvb3B0aW9uPgogICAgPG9wdGlvbj5wYXN0ZWwtb24tZGFyazwvb3B0aW9uPgogICAgPG9wdGlvbj5yYWlsc2Nhc3RzPC9vcHRpb24+CiAgICA8b3B0aW9uPnJ1YnlibHVlPC9vcHRpb24+CiAgICA8b3B0aW9uPnNldGk8L29wdGlvbj4KICAgIDxvcHRpb24+c29sYXJpemVkIGRhcms8L29wdGlvbj4KICAgIDxvcHRpb24+c29sYXJpemVkIGxpZ2h0PC9vcHRpb24+CiAgICA8b3B0aW9uPnRoZS1tYXRyaXg8L29wdGlvbj4KICAgIDxvcHRpb24+dG9tb3Jyb3ctbmlnaHQtYnJpZ2h0PC9vcHRpb24+CiAgICA8b3B0aW9uPnRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzPC9vcHRpb24+CiAgICA8b3B0aW9uPnR0Y248L29wdGlvbj4KICAgIDxvcHRpb24+dHdpbGlnaHQ8L29wdGlvbj4KICAgIDxvcHRpb24+dmlicmFudC1pbms8L29wdGlvbj4KICAgIDxvcHRpb24+eHEtZGFyazwvb3B0aW9uPgogICAgPG9wdGlvbj54cS1saWdodDwvb3B0aW9uPgogICAgPG9wdGlvbj55ZXRpPC9vcHRpb24+CiAgICA8b3B0aW9uPnplbmJ1cm48L29wdGlvbj4KPC9zZWxlY3Q+CjwvcD4KCjxzY3JpcHQ+CiAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgc3R5bGVBY3RpdmVMaW5lOiB0cnVlLAogICAgbWF0Y2hCcmFja2V0czogdHJ1ZQogIH0pOwogIHZhciBpbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZWxlY3QiKTsKICBmdW5jdGlvbiBzZWxlY3RUaGVtZSgpIHsKICAgIHZhciB0aGVtZSA9IGlucHV0Lm9wdGlvbnNbaW5wdXQuc2VsZWN0ZWRJbmRleF0udGV4dENvbnRlbnQ7CiAgICBlZGl0b3Iuc2V0T3B0aW9uKCJ0aGVtZSIsIHRoZW1lKTsKICAgIGxvY2F0aW9uLmhhc2ggPSAiIyIgKyB0aGVtZTsKICB9CiAgdmFyIGNob2ljZSA9IChsb2NhdGlvbi5oYXNoICYmIGxvY2F0aW9uLmhhc2guc2xpY2UoMSkpIHx8CiAgICAgICAgICAgICAgIChkb2N1bWVudC5sb2NhdGlvbi5zZWFyY2ggJiYKICAgICAgICAgICAgICAgIGRlY29kZVVSSUNvbXBvbmVudChkb2N1bWVudC5sb2NhdGlvbi5zZWFyY2guc2xpY2UoMSkpKTsKICBpZiAoY2hvaWNlKSB7CiAgICBpbnB1dC52YWx1ZSA9IGNob2ljZTsKICAgIGVkaXRvci5zZXRPcHRpb24oInRoZW1lIiwgY2hvaWNlKTsKICB9CiAgQ29kZU1pcnJvci5vbih3aW5kb3csICJoYXNoY2hhbmdlIiwgZnVuY3Rpb24oKSB7CiAgICB2YXIgdGhlbWUgPSBsb2NhdGlvbi5oYXNoLnNsaWNlKDEpOwogICAgaWYgKHRoZW1lKSB7IGlucHV0LnZhbHVlID0gdGhlbWU7IHNlbGVjdFRoZW1lKCk7IH0KICB9KTsKPC9zY3JpcHQ+CiAgPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/demo/trailingspace.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogVHJhaWxpbmcgV2hpdGVzcGFjZSBEZW1vPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL2FkZG9uL2VkaXQvdHJhaWxpbmdzcGFjZS5qcyI+PC9zY3JpcHQ+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICAgIC5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazt9CiAgICAgIC5jbS10cmFpbGluZ3NwYWNlIHsKICAgICAgICBiYWNrZ3JvdW5kLWltYWdlOiB1cmwoZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBUUFBQUFDQ0FZQUFBQi9xSDFqQUFBQUJtSkxSMFFBL3dEL0FQK2d2YWVUQUFBQUNYQklXWE1BQUFzVEFBQUxFd0VBbXB3WUFBQUFCM1JKVFVVSDNRVVhDVG9IMDBZMVVnQUFBQ0ZKUkVGVUNOZGpQTURCVWMvQXdOREFBQUZNVEF3TURBME9QMzR3UWdYL0FRQllnd1lFeDRmOWxRQUFBQUJKUlU1RXJrSmdnZz09KTsKICAgICAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBib3R0b20gbGVmdDsKICAgICAgICBiYWNrZ3JvdW5kLXJlcGVhdDogcmVwZWF0LXg7CiAgICAgIH0KICAgIDwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGgxPkNvZGVNaXJyb3I8L2gxPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5UcmFpbGluZyBXaGl0ZXNwYWNlPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5UcmFpbGluZyBXaGl0ZXNwYWNlIERlbW88L2gyPgo8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPlRoaXMgdGV4dCAgCiBoYXMgc29tZQkgCnRyYWlsaW5nIHdoaXRlc3BhY2UhPC90ZXh0YXJlYT48L2Zvcm0+CgogICAgPHNjcmlwdD4KdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICBsaW5lTnVtYmVyczogdHJ1ZSwKICBzaG93VHJhaWxpbmdTcGFjZTogdHJ1ZQp9KTsKPC9zY3JpcHQ+Cgo8cD5Vc2VzCnRoZSA8YSBocmVmPSIuLi9kb2MvbWFudWFsLmh0bWwjYWRkb25fdHJhaWxpbmdzcGFjZSI+dHJhaWxpbmdzcGFjZTwvYT4KYWRkb24gdG8gaGlnaGxpZ2h0IHRyYWlsaW5nIHdoaXRlc3BhY2UuPC9wPgoKICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/demo/variableheight.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogVmFyaWFibGUgSGVpZ2h0IERlbW88L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vbW9kZS9tYXJrZG93bi9tYXJrZG93bi5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9tb2RlL3htbC94bWwuanMiPjwvc2NyaXB0Pgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgogICAgICAuQ29kZU1pcnJvciB7Ym9yZGVyOiAxcHggc29saWQgc2lsdmVyOyBib3JkZXItd2lkdGg6IDFweCAycHg7IH0KICAgICAgLmNtLWhlYWRlciB7IGZvbnQtZmFtaWx5OiBhcmlhbDsgfQogICAgICAuY20taGVhZGVyLTEgeyBmb250LXNpemU6IDE1MCU7IH0KICAgICAgLmNtLWhlYWRlci0yIHsgZm9udC1zaXplOiAxMzAlOyB9CiAgICAgIC5jbS1oZWFkZXItMyB7IGZvbnQtc2l6ZTogMTIwJTsgfQogICAgICAuY20taGVhZGVyLTQgeyBmb250LXNpemU6IDExMCU7IH0KICAgICAgLmNtLWhlYWRlci01IHsgZm9udC1zaXplOiAxMDAlOyB9CiAgICAgIC5jbS1oZWFkZXItNiB7IGZvbnQtc2l6ZTogOTAlOyB9CiAgICAgIC5jbS1zdHJvbmcgeyBmb250LXNpemU6IDE0MCU7IH0KICAgIDwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGgxPkNvZGVNaXJyb3I8L2gxPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5WYXJpYWJsZSBIZWlnaHQ8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPlZhcmlhYmxlIEhlaWdodCBEZW1vPC9oMj4KPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4jIEEgRmlyc3QgTGV2ZWwgSGVhZGVyCgoqKkJvbGQqKiB0ZXh0IGluIGEgbm9ybWFsLXNpemUgcGFyYWdyYXBoLgoKQW5kIGEgdmVyeSBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nIGxvbmcgbG9uZyBsb25nLCB3cmFwcGVkIGxpbmUgd2l0aCBhIHBpZWNlIG9mICoqYmlnKiogdGV4dCBpbnNpZGUgb2YgaXQuCgojIyBBIFNlY29uZCBMZXZlbCBIZWFkZXIKCk5vdyBpcyB0aGUgdGltZSBmb3IgYWxsIGdvb2QgbWVuIHRvIGNvbWUgdG8KdGhlIGFpZCBvZiB0aGVpciBjb3VudHJ5LiBUaGlzIGlzIGp1c3QgYQpyZWd1bGFyIHBhcmFncmFwaC4KClRoZSBxdWljayBicm93biBmb3gganVtcGVkIG92ZXIgdGhlIGxhenkKZG9nJ3MgYmFjay4KCiMjIyBIZWFkZXIgMwoKPiBUaGlzIGlzIGEgYmxvY2txdW90ZS4KPiAKPiBUaGlzIGlzIHRoZSBzZWNvbmQgcGFyYWdyYXBoIGluIHRoZSBibG9ja3F1b3RlLgo+Cj4gIyMgVGhpcyBpcyBhbiBIMiBpbiBhIGJsb2NrcXVvdGUgICAgICAgCjwvdGV4dGFyZWE+PC9mb3JtPgogICAgPHNjcmlwdCBpZD0ic2NyaXB0Ij4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgICAgICBsaW5lV3JhcHBpbmc6IHRydWUsCiAgICAgICAgbW9kZTogIm1hcmtkb3duIgogICAgICB9KTsKICAgIDwvc2NyaXB0PgogIDwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/demo/vim.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogVmltIGJpbmRpbmdzIGRlbW88L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9saWIvY29kZW1pcnJvci5jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL2FkZG9uL2RpYWxvZy9kaWFsb2cuY3NzIj4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi90aGVtZS9taWRuaWdodC5jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL3RoZW1lL3NvbGFyaXplZC5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vYWRkb24vZGlhbG9nL2RpYWxvZy5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9hZGRvbi9zZWFyY2gvc2VhcmNoY3Vyc29yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL21vZGUvY2xpa2UvY2xpa2UuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vYWRkb24vZWRpdC9tYXRjaGJyYWNrZXRzLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL2tleW1hcC92aW0uanMiPjwvc2NyaXB0Pgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgogICAgICAuQ29kZU1pcnJvciB7Ym9yZGVyLXRvcDogMXB4IHNvbGlkICNlZWU7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjZWVlO30KICAgIDwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGgxPkNvZGVNaXJyb3I8L2gxPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5WaW0gYmluZGluZ3M8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPlZpbSBiaW5kaW5ncyBkZW1vPC9oMj4KCjxwPjxzdHJvbmcgc3R5bGU9ImNvbG9yOiAjYzMzOyB0ZXh0LWRlY29yYXRpb246IG5vbmUiPk5vdGU6PC9zdHJvbmc+IFRoZSBDb2RlTWlycm9yIHZpbSBiaW5kaW5ncyBkbyBub3QgaGF2ZSBhbgphY3RpdmUgbWFpbnRhaW5lci4gVGhhdCBtZWFucyB0aGF0IGlmIHlvdSByZXBvcnQgYnVncyBpbiBpdCwgdGhleSBhcmUKbGlrZWx5IHRvIGdvIHVuYW5zd2VyZWQuIEl0IGFsc28gbWVhbnMgdGhhdCBpZiB5b3Ugd2FudCB0byBoZWxwLCB5b3UKYXJlIHZlcnkgd2VsY29tZSB0byBsb29rCmF0IDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2NvZGVtaXJyb3IvaXNzdWVzP3E9aXMlM0Fpc3N1ZStpcyUzQW9wZW4rbGFiZWwlM0F2aW0iPnRoZQpvcGVuIGlzc3VlczwvYT4gYW5kIHNlZSB3aGljaCBvbmVzIHlvdSBjYW4gc29sdmUuPC9wPgoKPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KI2luY2x1ZGUgInN5c2NhbGxzLmgiCi8qIGdldGNoYXI6ICBzaW1wbGUgYnVmZmVyZWQgdmVyc2lvbiAqLwppbnQgZ2V0Y2hhcih2b2lkKQp7CiAgc3RhdGljIGNoYXIgYnVmW0JVRlNJWl07CiAgc3RhdGljIGNoYXIgKmJ1ZnAgPSBidWY7CiAgc3RhdGljIGludCBuID0gMDsKICBpZiAobiA9PSAwKSB7ICAvKiBidWZmZXIgaXMgZW1wdHkgKi8KICAgIG4gPSByZWFkKDAsIGJ1Ziwgc2l6ZW9mIGJ1Zik7CiAgICBidWZwID0gYnVmOwogIH0KICByZXR1cm4gKC0tbiA+PSAwKSA/ICh1bnNpZ25lZCBjaGFyKSAqYnVmcCsrIDogRU9GOwp9CjwvdGV4dGFyZWE+PC9mb3JtPgo8ZGl2IHN0eWxlPSJmb250LXNpemU6IDEzcHg7IHdpZHRoOiAzMDBweDsgaGVpZ2h0OiAzMHB4OyI+S2V5IGJ1ZmZlcjogPHNwYW4gaWQ9ImNvbW1hbmQtZGlzcGxheSI+PC9zcGFuPjwvZGl2PgoKPHA+VGhlIHZpbSBrZXliaW5kaW5ncyBhcmUgZW5hYmxlZCBieSBpbmNsdWRpbmcgPGNvZGU+PGEKaHJlZj0iLi4va2V5bWFwL3ZpbS5qcyI+a2V5bWFwL3ZpbS5qczwvYT48L2NvZGU+IGFuZCBzZXR0aW5nIHRoZQo8Y29kZT5rZXlNYXA8L2NvZGU+IG9wdGlvbiB0byA8Y29kZT52aW08L2NvZGU+LjwvcD4KCjxwPjxzdHJvbmc+RmVhdHVyZXM8L3N0cm9uZz48L3A+Cgo8dWw+CiAgPGxpPkFsbCBjb21tb24gbW90aW9ucyBhbmQgb3BlcmF0b3JzLCBpbmNsdWRpbmcgdGV4dCBvYmplY3RzPC9saT4KICA8bGk+T3BlcmF0b3IgbW90aW9uIG9ydGhvZ29uYWxpdHk8L2xpPgogIDxsaT5WaXN1YWwgbW9kZSAtIGNoYXJhY3Rlcndpc2UsIGxpbmV3aXNlLCBibG9ja3dpc2U8L2xpPgogIDxsaT5GdWxsIG1hY3JvIHN1cHBvcnQgKHEsIEApPC9saT4KICA8bGk+SW5jcmVtZW50YWwgaGlnaGxpZ2h0ZWQgc2VhcmNoICgvLCA/LCAjLCAqLCBnIywgZyopPC9saT4KICA8bGk+U2VhcmNoL3JlcGxhY2Ugd2l0aCBjb25maXJtICg6c3Vic3RpdHV0ZSwgOiVzKTwvbGk+CiAgPGxpPlNlYXJjaCBoaXN0b3J5PC9saT4KICA8bGk+SnVtcCBsaXN0cyAoQ3RybC1vLCBDdHJsLWkpPC9saT4KICA8bGk+S2V5L2NvbW1hbmQgbWFwcGluZyB3aXRoIEFQSSAoOm1hcCwgOm5tYXAsIDp2bWFwKTwvbGk+CiAgPGxpPlNvcnQgKDpzb3J0KTwvbGk+CiAgPGxpPk1hcmtzIChgLCAnKTwvbGk+CiAgPGxpPjpnbG9iYWw8L2xpPgogIDxsaT5JbnNlcnQgbW9kZSBiZWhhdmVzIGlkZW50aWNhbCB0byBiYXNlIENvZGVNaXJyb3I8L2xpPgogIDxsaT5Dcm9zcy1idWZmZXIgeWFuay9wYXN0ZTwvbGk+CjwvdWw+Cgo8cD5Gb3IgdGhlIGZ1bGwgbGlzdCBvZiBrZXkgbWFwcGluZ3MgYW5kIEV4IGNvbW1hbmRzLCByZWZlciB0byB0aGUKPGNvZGU+ZGVmYXVsdEtleW1hcDwvY29kZT4gYW5kIDxjb2RlPmRlZmF1bHRFeENvbW1hbmRNYXA8L2NvZGU+IGF0IHRoZQp0b3Agb2YgPGNvZGU+PGEgaHJlZj0iLi4va2V5bWFwL3ZpbS5qcyI+a2V5bWFwL3ZpbS5qczwvYT48L2NvZGU+LgoKPHA+Tm90ZSB0aGF0IHdoaWxlIHRoZSB2aW0gbW9kZSB0cmllcyB0byBlbXVsYXRlIHRoZSBtb3N0IHVzZWZ1bApmZWF0dXJlcyBvZiB2aW0gYXMgZmFpdGhmdWxseSBhcyBwb3NzaWJsZSwgaXQgZG9lcyBub3Qgc3RyaXZlIHRvCmJlY29tZSBhIGNvbXBsZXRlIHZpbSBpbXBsZW1lbnRhdGlvbjwvcD4KCiAgICA8c2NyaXB0PgogICAgICBDb2RlTWlycm9yLmNvbW1hbmRzLnNhdmUgPSBmdW5jdGlvbigpeyBhbGVydCgiU2F2aW5nIik7IH07CiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICAgICAgbGluZU51bWJlcnM6IHRydWUsCiAgICAgICAgbW9kZTogInRleHQveC1jc3JjIiwKICAgICAgICBrZXlNYXA6ICJ2aW0iLAogICAgICAgIG1hdGNoQnJhY2tldHM6IHRydWUsCiAgICAgICAgc2hvd0N1cnNvcldoZW5TZWxlY3Rpbmc6IHRydWUKICAgICAgfSk7CiAgICAgIHZhciBjb21tYW5kRGlzcGxheSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb21tYW5kLWRpc3BsYXknKTsKICAgICAgdmFyIGtleXMgPSAnJzsKICAgICAgQ29kZU1pcnJvci5vbihlZGl0b3IsICd2aW0ta2V5cHJlc3MnLCBmdW5jdGlvbihrZXkpIHsKICAgICAgICBrZXlzID0ga2V5cyArIGtleTsKICAgICAgICBjb21tYW5kRGlzcGxheS5pbm5lckhUTUwgPSBrZXlzOwogICAgICB9KTsKICAgICAgQ29kZU1pcnJvci5vbihlZGl0b3IsICd2aW0tY29tbWFuZC1kb25lJywgZnVuY3Rpb24oZSkgewogICAgICAgIGtleXMgPSAnJzsKICAgICAgICBjb21tYW5kRGlzcGxheS5pbm5lckhUTUwgPSBrZXlzOwogICAgICB9KTsKICAgIDwvc2NyaXB0PgoKICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/demo/visibletabs.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogVmlzaWJsZSB0YWJzIGRlbW88L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vbW9kZS9jbGlrZS9jbGlrZS5qcyI+PC9zY3JpcHQ+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICAgIC5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgI2VlZTsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlZWU7fQogICAgICAuY20tdGFiIHsKICAgICAgICAgYmFja2dyb3VuZDogdXJsKGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBREFBQUFBTUNBWUFBQUFrdWo1UkFBQUFBWE5TUjBJQXJzNGM2UUFBQUdGSlJFRlVTTWZ0MUxzUlFGQVFoZUhQb3dBS29BQ3gzSWdFS3RhRUh1akRqT1JTZ1dUSC9aT2RuWk9jTS9zZ2sva0ZGV1kwcVY4Zm9Rd1M0TUtCQ1MzcVI2aXhCSnZFbE9vYllBdGl2c2VJRTEyMEZhb3dKUE43NUdNdThqL0xmTXdOamg0SFVwd2c0TFVBQUFBQVNVVk9SSzVDWUlJPSk7CiAgICAgICAgIGJhY2tncm91bmQtcG9zaXRpb246IHJpZ2h0OwogICAgICAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OwogICAgICB9CiAgICA8L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxoMT5Db2RlTWlycm9yPC9oMT48aW1nIGlkPWxvZ28gc3JjPSIuLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+VmlzaWJsZSB0YWJzPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5WaXNpYmxlIHRhYnMgZGVtbzwvaDI+Cjxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+CiNpbmNsdWRlICJzeXNjYWxscy5oIgovKiBnZXRjaGFyOiAgc2ltcGxlIGJ1ZmZlcmVkIHZlcnNpb24gKi8KaW50IGdldGNoYXIodm9pZCkKewoJc3RhdGljIGNoYXIgYnVmW0JVRlNJWl07CglzdGF0aWMgY2hhciAqYnVmcCA9IGJ1ZjsKCXN0YXRpYyBpbnQgbiA9IDA7CglpZiAobiA9PSAwKSB7ICAvKiBidWZmZXIgaXMgZW1wdHkgKi8KCQluID0gcmVhZCgwLCBidWYsIHNpemVvZiBidWYpOwoJCWJ1ZnAgPSBidWY7Cgl9CglyZXR1cm4gKC0tbiA+PSAwKSA/ICh1bnNpZ25lZCBjaGFyKSAqYnVmcCsrIDogRU9GOwp9CjwvdGV4dGFyZWE+PC9mb3JtPgoKPHA+VGFicyBpbnNpZGUgdGhlIGVkaXRvciBhcmUgc3BhbnMgd2l0aCB0aGUKY2xhc3MgPGNvZGU+Y20tdGFiPC9jb2RlPiwgYW5kIGNhbiBiZSBzdHlsZWQuPC9wPgoKICAgIDxzY3JpcHQ+CiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICAgICAgbGluZU51bWJlcnM6IHRydWUsCiAgICAgICAgdGFiU2l6ZTogNCwKICAgICAgICBpbmRlbnRVbml0OiA0LAogICAgICAgIGluZGVudFdpdGhUYWJzOiB0cnVlLAogICAgICAgIG1vZGU6ICJ0ZXh0L3gtY3NyYyIKICAgICAgfSk7CiAgICA8L3NjcmlwdD4KCiAgPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/demo/widget.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogSW5saW5lIFdpZGdldCBEZW1vPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL21vZGUvamF2YXNjcmlwdC9qYXZhc2NyaXB0LmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii8vYWpheC5hc3BuZXRjZG4uY29tL2FqYXgvanNoaW50L3IwNy9qc2hpbnQuanMiPjwvc2NyaXB0Pgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgogICAgICAuQ29kZU1pcnJvciB7Ym9yZGVyOiAxcHggc29saWQgYmxhY2s7fQogICAgICAubGludC1lcnJvciB7Zm9udC1mYW1pbHk6IGFyaWFsOyBmb250LXNpemU6IDcwJTsgYmFja2dyb3VuZDogI2ZmYTsgY29sb3I6ICNhMDA7IHBhZGRpbmc6IDJweCA1cHggM3B4OyB9CiAgICAgIC5saW50LWVycm9yLWljb24ge2NvbG9yOiB3aGl0ZTsgYmFja2dyb3VuZC1jb2xvcjogcmVkOyBmb250LXdlaWdodDogYm9sZDsgYm9yZGVyLXJhZGl1czogNTAlOyBwYWRkaW5nOiAwIDNweDsgbWFyZ2luLXJpZ2h0OiA3cHg7fQogICAgPC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aDE+Q29kZU1pcnJvcjwvaDE+PGltZyBpZD1sb2dvIHNyYz0iLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPklubGluZSBXaWRnZXQ8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPklubGluZSBXaWRnZXQgRGVtbzwvaDI+CgoKICAgIDxkaXYgaWQ9Y29kZT48L2Rpdj4KICAgIDxzY3JpcHQgaWQ9InNjcmlwdCI+dmFyIHdpZGdldHMgPSBbXQpmdW5jdGlvbiB1cGRhdGVIaW50cygpIHsKICBlZGl0b3Iub3BlcmF0aW9uKGZ1bmN0aW9uKCl7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHdpZGdldHMubGVuZ3RoOyArK2kpCiAgICAgIGVkaXRvci5yZW1vdmVMaW5lV2lkZ2V0KHdpZGdldHNbaV0pOwogICAgd2lkZ2V0cy5sZW5ndGggPSAwOwoKICAgIEpTSElOVChlZGl0b3IuZ2V0VmFsdWUoKSk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IEpTSElOVC5lcnJvcnMubGVuZ3RoOyArK2kpIHsKICAgICAgdmFyIGVyciA9IEpTSElOVC5lcnJvcnNbaV07CiAgICAgIGlmICghZXJyKSBjb250aW51ZTsKICAgICAgdmFyIG1zZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogICAgICB2YXIgaWNvbiA9IG1zZy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIikpOwogICAgICBpY29uLmlubmVySFRNTCA9ICIhISI7CiAgICAgIGljb24uY2xhc3NOYW1lID0gImxpbnQtZXJyb3ItaWNvbiI7CiAgICAgIG1zZy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShlcnIucmVhc29uKSk7CiAgICAgIG1zZy5jbGFzc05hbWUgPSAibGludC1lcnJvciI7CiAgICAgIHdpZGdldHMucHVzaChlZGl0b3IuYWRkTGluZVdpZGdldChlcnIubGluZSAtIDEsIG1zZywge2NvdmVyR3V0dGVyOiBmYWxzZSwgbm9IU2Nyb2xsOiB0cnVlfSkpOwogICAgfQogIH0pOwogIHZhciBpbmZvID0gZWRpdG9yLmdldFNjcm9sbEluZm8oKTsKICB2YXIgYWZ0ZXIgPSBlZGl0b3IuY2hhckNvb3Jkcyh7bGluZTogZWRpdG9yLmdldEN1cnNvcigpLmxpbmUgKyAxLCBjaDogMH0sICJsb2NhbCIpLnRvcDsKICBpZiAoaW5mby50b3AgKyBpbmZvLmNsaWVudEhlaWdodCA8IGFmdGVyKQogICAgZWRpdG9yLnNjcm9sbFRvKG51bGwsIGFmdGVyIC0gaW5mby5jbGllbnRIZWlnaHQgKyAzKTsKfQoKd2luZG93Lm9ubG9hZCA9IGZ1bmN0aW9uKCkgewogIHZhciBzYyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzY3JpcHQiKTsKICB2YXIgY29udGVudCA9IHNjLnRleHRDb250ZW50IHx8IHNjLmlubmVyVGV4dCB8fCBzYy5pbm5lckhUTUw7CgogIHdpbmRvdy5lZGl0b3IgPSBDb2RlTWlycm9yKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgbW9kZTogImphdmFzY3JpcHQiLAogICAgdmFsdWU6IGNvbnRlbnQKICB9KTsKCiAgdmFyIHdhaXRpbmc7CiAgZWRpdG9yLm9uKCJjaGFuZ2UiLCBmdW5jdGlvbigpIHsKICAgIGNsZWFyVGltZW91dCh3YWl0aW5nKTsKICAgIHdhaXRpbmcgPSBzZXRUaW1lb3V0KHVwZGF0ZUhpbnRzLCA1MDApOwogIH0pOwoKICBzZXRUaW1lb3V0KHVwZGF0ZUhpbnRzLCAxMDApOwp9OwoKImxvbmcgbGluZSB0byBjcmVhdGUgYSBob3Jpem9udGFsIHNjcm9sbGJhciwgaW4gb3JkZXIgdG8gdGVzdCB3aGV0aGVyIHRoZSAobm9uLWlubGluZSkgd2lkZ2V0cyBzdGF5IGluIHBsYWNlIHdoZW4gc2Nyb2xsaW5nIHRvIHRoZSByaWdodCI7Cjwvc2NyaXB0Pgo8cD5UaGlzIGRlbW8gcnVucyA8YSBocmVmPSJodHRwOi8vanNoaW50LmNvbSI+SlNIaW50PC9hPiBvdmVyIHRoZSBjb2RlCmluIHRoZSBlZGl0b3IgKHdoaWNoIGlzIHRoZSBzY3JpcHQgdXNlZCBvbiB0aGlzIHBhZ2UpLCBhbmQKaW5zZXJ0cyA8YSBocmVmPSIuLi9kb2MvbWFudWFsLmh0bWwjYWRkTGluZVdpZGdldCI+bGluZSB3aWRnZXRzPC9hPiB0bwpkaXNwbGF5IHRoZSB3YXJuaW5ncyB0aGF0IEpTSGludCBjb21lcyB1cCB3aXRoLjwvcD4KICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/demo/xmlcomplete.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[77u/PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogWE1MIEF1dG9jb21wbGV0ZSBEZW1vPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi9hZGRvbi9oaW50L3Nob3ctaGludC5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vYWRkb24vaGludC9zaG93LWhpbnQuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vYWRkb24vaGludC94bWwtaGludC5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9tb2RlL3htbC94bWwuanMiPjwvc2NyaXB0Pgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgogICAgICAuQ29kZU1pcnJvciB7IGJvcmRlcjogMXB4IHNvbGlkICNlZWU7IH0KICAgIDwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGgxPkNvZGVNaXJyb3I8L2gxPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5YTUwgQXV0b2NvbXBsZXRlPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5YTUwgQXV0b2NvbXBsZXRlIERlbW88L2gyPgo8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPjwhLS0gd3JpdGUgc29tZSB4bWwgYmVsb3cgLS0+CjwvdGV4dGFyZWE+PC9mb3JtPgoKICAgIDxwPlByZXNzIDxzdHJvbmc+Y3RybC1zcGFjZTwvc3Ryb25nPiwgb3IgdHlwZSBhICcmbHQ7JyBjaGFyYWN0ZXIgdG8KICAgIGFjdGl2YXRlIGF1dG9jb21wbGV0aW9uLiBUaGlzIGRlbW8gZGVmaW5lcyBhIHNpbXBsZSBzY2hlbWEgdGhhdAogICAgZ3VpZGVzIGNvbXBsZXRpb24uIFRoZSBzY2hlbWEgY2FuIGJlIGN1c3RvbWl6ZWTigJRzZWUKICAgIHRoZSA8YSBocmVmPSIuLi9kb2MvbWFudWFsLmh0bWwjYWRkb25feG1sLWhpbnQiPm1hbnVhbDwvYT4uPC9wPgoKICAgIDxwPkRldmVsb3BtZW50IG9mIHRoZSA8Y29kZT54bWwtaGludDwvY29kZT4gYWRkb24gd2FzIGtpbmRseQogICAgc3BvbnNvcmVkCiAgICBieSA8YSBocmVmPSJodHRwOi8vd3d3LnhwZXJpbWVudC5tb2JpIj53d3cueHBlcmltZW50Lm1vYmk8L2E+LjwvcD4KCiAgICA8c2NyaXB0PgogICAgICB2YXIgZHVtbXkgPSB7CiAgICAgICAgYXR0cnM6IHsKICAgICAgICAgIGNvbG9yOiBbInJlZCIsICJncmVlbiIsICJibHVlIiwgInB1cnBsZSIsICJ3aGl0ZSIsICJibGFjayIsICJ5ZWxsb3ciXSwKICAgICAgICAgIHNpemU6IFsibGFyZ2UiLCAibWVkaXVtIiwgInNtYWxsIl0sCiAgICAgICAgICBkZXNjcmlwdGlvbjogbnVsbAogICAgICAgIH0sCiAgICAgICAgY2hpbGRyZW46IFtdCiAgICAgIH07CgogICAgICB2YXIgdGFncyA9IHsKICAgICAgICAiIXRvcCI6IFsidG9wIl0sCiAgICAgICAgIiFhdHRycyI6IHsKICAgICAgICAgIGlkOiBudWxsLAogICAgICAgICAgY2xhc3M6IFsiQSIsICJCIiwgIkMiXQogICAgICAgIH0sCiAgICAgICAgdG9wOiB7CiAgICAgICAgICBhdHRyczogewogICAgICAgICAgICBsYW5nOiBbImVuIiwgImRlIiwgImZyIiwgIm5sIl0sCiAgICAgICAgICAgIGZyZWVmb3JtOiBudWxsCiAgICAgICAgICB9LAogICAgICAgICAgY2hpbGRyZW46IFsiYW5pbWFsIiwgInBsYW50Il0KICAgICAgICB9LAogICAgICAgIGFuaW1hbDogewogICAgICAgICAgYXR0cnM6IHsKICAgICAgICAgICAgbmFtZTogbnVsbCwKICAgICAgICAgICAgaXNkdWNrOiBbInllcyIsICJubyJdCiAgICAgICAgICB9LAogICAgICAgICAgY2hpbGRyZW46IFsid2luZ3MiLCAiZmVldCIsICJib2R5IiwgImhlYWQiLCAidGFpbCJdCiAgICAgICAgfSwKICAgICAgICBwbGFudDogewogICAgICAgICAgYXR0cnM6IHtuYW1lOiBudWxsfSwKICAgICAgICAgIGNoaWxkcmVuOiBbImxlYXZlcyIsICJzdGVtIiwgImZsb3dlcnMiXQogICAgICAgIH0sCiAgICAgICAgd2luZ3M6IGR1bW15LCBmZWV0OiBkdW1teSwgYm9keTogZHVtbXksIGhlYWQ6IGR1bW15LCB0YWlsOiBkdW1teSwKICAgICAgICBsZWF2ZXM6IGR1bW15LCBzdGVtOiBkdW1teSwgZmxvd2VyczogZHVtbXkKICAgICAgfTsKCiAgICAgIGZ1bmN0aW9uIGNvbXBsZXRlQWZ0ZXIoY20sIHByZWQpIHsKICAgICAgICB2YXIgY3VyID0gY20uZ2V0Q3Vyc29yKCk7CiAgICAgICAgaWYgKCFwcmVkIHx8IHByZWQoKSkgc2V0VGltZW91dChmdW5jdGlvbigpIHsKICAgICAgICAgIGlmICghY20uc3RhdGUuY29tcGxldGlvbkFjdGl2ZSkKICAgICAgICAgICAgY20uc2hvd0hpbnQoe2NvbXBsZXRlU2luZ2xlOiBmYWxzZX0pOwogICAgICAgIH0sIDEwMCk7CiAgICAgICAgcmV0dXJuIENvZGVNaXJyb3IuUGFzczsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gY29tcGxldGVJZkFmdGVyTHQoY20pIHsKICAgICAgICByZXR1cm4gY29tcGxldGVBZnRlcihjbSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICB2YXIgY3VyID0gY20uZ2V0Q3Vyc29yKCk7CiAgICAgICAgICByZXR1cm4gY20uZ2V0UmFuZ2UoQ29kZU1pcnJvci5Qb3MoY3VyLmxpbmUsIGN1ci5jaCAtIDEpLCBjdXIpID09ICI8IjsKICAgICAgICB9KTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gY29tcGxldGVJZkluVGFnKGNtKSB7CiAgICAgICAgcmV0dXJuIGNvbXBsZXRlQWZ0ZXIoY20sIGZ1bmN0aW9uKCkgewogICAgICAgICAgdmFyIHRvayA9IGNtLmdldFRva2VuQXQoY20uZ2V0Q3Vyc29yKCkpOwogICAgICAgICAgaWYgKHRvay50eXBlID09ICJzdHJpbmciICYmICghL1snIl0vLnRlc3QodG9rLnN0cmluZy5jaGFyQXQodG9rLnN0cmluZy5sZW5ndGggLSAxKSkgfHwgdG9rLnN0cmluZy5sZW5ndGggPT0gMSkpIHJldHVybiBmYWxzZTsKICAgICAgICAgIHZhciBpbm5lciA9IENvZGVNaXJyb3IuaW5uZXJNb2RlKGNtLmdldE1vZGUoKSwgdG9rLnN0YXRlKS5zdGF0ZTsKICAgICAgICAgIHJldHVybiBpbm5lci50YWdOYW1lOwogICAgICAgIH0pOwogICAgICB9CgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgICAgIG1vZGU6ICJ4bWwiLAogICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgICAgIGV4dHJhS2V5czogewogICAgICAgICAgIic8JyI6IGNvbXBsZXRlQWZ0ZXIsCiAgICAgICAgICAiJy8nIjogY29tcGxldGVJZkFmdGVyTHQsCiAgICAgICAgICAiJyAnIjogY29tcGxldGVJZkluVGFnLAogICAgICAgICAgIic9JyI6IGNvbXBsZXRlSWZJblRhZywKICAgICAgICAgICJDdHJsLVNwYWNlIjogImF1dG9jb21wbGV0ZSIKICAgICAgICB9LAogICAgICAgIGhpbnRPcHRpb25zOiB7c2NoZW1hSW5mbzogdGFnc30KICAgICAgfSk7CiAgICA8L3NjcmlwdD4KICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/doc/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/doc/activebookmark.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gS2x1ZGdlIGluIEhUTUw1IHRhZyByZWNvZ25pdGlvbiBpbiBJRTgKZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2VjdGlvbiIpOwpkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJhcnRpY2xlIik7CgooZnVuY3Rpb24oKSB7CiAgaWYgKCF3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcikgcmV0dXJuOwogIHZhciBwZW5kaW5nID0gZmFsc2UsIHByZXZWYWwgPSBudWxsOwoKICBmdW5jdGlvbiB1cGRhdGVTb29uKCkgewogICAgaWYgKCFwZW5kaW5nKSB7CiAgICAgIHBlbmRpbmcgPSB0cnVlOwogICAgICBzZXRUaW1lb3V0KHVwZGF0ZSwgMjUwKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHVwZGF0ZSgpIHsKICAgIHBlbmRpbmcgPSBmYWxzZTsKICAgIHZhciBtYXJrcyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJuYXYiKS5nZXRFbGVtZW50c0J5VGFnTmFtZSgiYSIpLCBmb3VuZDsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWFya3MubGVuZ3RoOyArK2kpIHsKICAgICAgdmFyIG1hcmsgPSBtYXJrc1tpXSwgbTsKICAgICAgaWYgKG1hcmsuZ2V0QXR0cmlidXRlKCJkYXRhLWRlZmF1bHQiKSkgewogICAgICAgIGlmIChmb3VuZCA9PSBudWxsKSBmb3VuZCA9IGk7CiAgICAgIH0gZWxzZSBpZiAobSA9IG1hcmsuaHJlZi5tYXRjaCgvIyguKikvKSkgewogICAgICAgIHZhciByZWYgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChtWzFdKTsKICAgICAgICBpZiAocmVmICYmIHJlZi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgPCA1MCkKICAgICAgICAgIGZvdW5kID0gaTsKICAgICAgfQogICAgfQogICAgaWYgKGZvdW5kICE9IG51bGwgJiYgZm91bmQgIT0gcHJldlZhbCkgewogICAgICBwcmV2VmFsID0gZm91bmQ7CiAgICAgIHZhciBsaXMgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibmF2IikuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImxpIik7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGlzLmxlbmd0aDsgKytpKSBsaXNbaV0uY2xhc3NOYW1lID0gIiI7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWFya3MubGVuZ3RoOyArK2kpIHsKICAgICAgICBpZiAoZm91bmQgPT0gaSkgewogICAgICAgICAgbWFya3NbaV0uY2xhc3NOYW1lID0gImFjdGl2ZSI7CiAgICAgICAgICBmb3IgKHZhciBuID0gbWFya3NbaV07IG47IG4gPSBuLnBhcmVudE5vZGUpCiAgICAgICAgICAgIGlmIChuLm5vZGVOYW1lID09ICJMSSIpIG4uY2xhc3NOYW1lID0gImFjdGl2ZSI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG1hcmtzW2ldLmNsYXNzTmFtZSA9ICIiOwogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KCiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoInNjcm9sbCIsIHVwZGF0ZVNvb24pOwogIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwgdXBkYXRlU29vbik7CiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImhhc2hjaGFuZ2UiLCBmdW5jdGlvbigpIHsKICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7CiAgICAgIHZhciBoYXNoID0gZG9jdW1lbnQubG9jYXRpb24uaGFzaCwgZm91bmQgPSBudWxsLCBtOwogICAgICB2YXIgbWFya3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibmF2IikuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImEiKTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtYXJrcy5sZW5ndGg7IGkrKykKICAgICAgICBpZiAoKG0gPSBtYXJrc1tpXS5ocmVmLm1hdGNoKC8oIy4qKS8pKSAmJiBtWzFdID09IGhhc2gpIHsgZm91bmQgPSBpOyBicmVhazsgfQogICAgICBpZiAoZm91bmQgIT0gbnVsbCkgZm9yICh2YXIgaSA9IDA7IGkgPCBtYXJrcy5sZW5ndGg7IGkrKykKICAgICAgICBtYXJrc1tpXS5jbGFzc05hbWUgPSBpID09IGZvdW5kID8gImFjdGl2ZSIgOiAiIjsKICAgIH0sIDMwMCk7CiAgfSk7Cn0pKCk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/doc/docs.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[QGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdTb3VyY2UgU2FucyBQcm8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1NvdXJjZSBTYW5zIFBybycpLCBsb2NhbCgnU291cmNlU2Fuc1Byby1SZWd1bGFyJyksIHVybCgvL3RoZW1lcy5nb29nbGV1c2VyY29udGVudC5jb20vc3RhdGljL2ZvbnRzL3NvdXJjZXNhbnNwcm8vdjUvT0RlbEkxYUhCWURCcWdlSUFIMnpsQk0wWXp1VDdNZE9lMDNvdFBidVVTMC53b2ZmKSBmb3JtYXQoJ3dvZmYnKTsKfQoKYm9keSwgaHRtbCB7IG1hcmdpbjogMDsgcGFkZGluZzogMDsgaGVpZ2h0OiAxMDAlOyB9CnNlY3Rpb24sIGFydGljbGUgeyBkaXNwbGF5OiBibG9jazsgcGFkZGluZzogMDsgfQoKYm9keSB7CiAgYmFja2dyb3VuZDogI2Y4ZjhmODsKICBmb250LWZhbWlseTogJ1NvdXJjZSBTYW5zIFBybycsIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7CiAgbGluZS1oZWlnaHQ6IDEuNTsKfQoKcCB7IG1hcmdpbi10b3A6IDA7IH0KCmgyLCBoMywgaDEgewogIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgbWFyZ2luLWJvdHRvbTogLjdlbTsKfQpoMSB7IGZvbnQtc2l6ZTogMTQwJTsgfQpoMiB7IGZvbnQtc2l6ZTogMTIwJTsgfQpoMyB7IGZvbnQtc2l6ZTogMTEwJTsgfQphcnRpY2xlID4gaDI6Zmlyc3QtY2hpbGQsIHNlY3Rpb246Zmlyc3QtY2hpbGQgPiBoMiB7IG1hcmdpbi10b3A6IDA7IH0KCiNuYXYgaDEgewogIG1hcmdpbi1yaWdodDogMTJweDsKICBtYXJnaW4tdG9wOiAwOwogIG1hcmdpbi1ib3R0b206IDJweDsKICBjb2xvcjogI2QzMDcwNzsKICBsZXR0ZXItc3BhY2luZzogLjVweDsKfQoKYSwgYTp2aXNpdGVkLCBhOmxpbmssIC5xdWFzaWxpbmsgewogIGNvbG9yOiAjQTIxMzEzOwogIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKfQoKZW0gewogIHBhZGRpbmctcmlnaHQ6IDJweDsKfQoKLnF1YXNpbGluayB7CiAgY3Vyc29yOiBwb2ludGVyOwp9CgphcnRpY2xlIHsKICBtYXgtd2lkdGg6IDcwMHB4OwogIG1hcmdpbjogMCAwIDAgMTYwcHg7CiAgYm9yZGVyLWxlZnQ6IDJweCBzb2xpZCAjRTMwODA4OwogIGJvcmRlci1yaWdodDogMXB4IHNvbGlkICNkZGQ7CiAgcGFkZGluZzogMzBweCA1MHB4IDEwMHB4IDUwcHg7CiAgYmFja2dyb3VuZDogd2hpdGU7CiAgei1pbmRleDogMjsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgbWluLWhlaWdodDogMTAwJTsKICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogIC1tb3otYm94LXNpemluZzogYm9yZGVyLWJveDsKfQoKI25hdiB7CiAgcG9zaXRpb246IGZpeGVkOwogIHBhZGRpbmctdG9wOiAzMHB4OwogIG1heC1oZWlnaHQ6IDEwMCU7CiAgYm94LXNpemluZzogLW1vei1ib3JkZXItYm94OwogIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgb3ZlcmZsb3cteTogYXV0bzsKICBsZWZ0OiAwOyByaWdodDogbm9uZTsKICB3aWR0aDogMTYwcHg7CiAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgei1pbmRleDogMTsKfQoKQG1lZGlhIHNjcmVlbiBhbmQgKG1pbi13aWR0aDogMTAwMHB4KSB7CiAgYXJ0aWNsZSB7CiAgICBtYXJnaW46IDAgYXV0bzsKICB9CiAgI25hdiB7CiAgICByaWdodDogNTAlOwogICAgd2lkdGg6IGF1dG87CiAgICBib3JkZXItcmlnaHQ6IDM0OXB4IHNvbGlkIHRyYW5zcGFyZW50OwogIH0KfQoKI25hdiB1bCB7CiAgZGlzcGxheTogYmxvY2s7CiAgbWFyZ2luOiAwOyBwYWRkaW5nOiAwOwogIG1hcmdpbi1ib3R0b206IDMycHg7Cn0KCiNuYXYgbGkgewogIGRpc3BsYXk6IGJsb2NrOwogIG1hcmdpbi1ib3R0b206IDRweDsKfQoKI25hdiBsaSB1bCB7CiAgZm9udC1zaXplOiA4MCU7CiAgbWFyZ2luLWJvdHRvbTogMDsKICBkaXNwbGF5OiBub25lOwp9CgojbmF2IGxpLmFjdGl2ZSB1bCB7CiAgZGlzcGxheTogYmxvY2s7Cn0KCiNuYXYgbGkgbGkgYSB7CiAgcGFkZGluZy1yaWdodDogMjBweDsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7Cn0KCiNuYXYgdWwgYSB7CiAgY29sb3I6IGJsYWNrOwogIHBhZGRpbmc6IDAgN3B4IDFweCAxMXB4Owp9CgojbmF2IHVsIGEuYWN0aXZlLCAjbmF2IHVsIGE6aG92ZXIgewogIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjRTMwODA4OwogIG1hcmdpbi1ib3R0b206IC0xcHg7CiAgY29sb3I6ICNFMzA4MDg7Cn0KCiNsb2dvIHsKICBib3JkZXI6IDA7CiAgbWFyZ2luLXJpZ2h0OiAxMnB4OwogIG1hcmdpbi1ib3R0b206IDI1cHg7Cn0KCnNlY3Rpb24gewogIGJvcmRlci10b3A6IDFweCBzb2xpZCAjRTMwODA4OwogIG1hcmdpbjogMS41ZW0gMDsKfQoKc2VjdGlvbi5maXJzdCB7CiAgYm9yZGVyOiBub25lOwogIG1hcmdpbi10b3A6IDA7Cn0KCiNkZW1vIHsKICBwb3NpdGlvbjogcmVsYXRpdmU7Cn0KCiNkZW1vbGlzdCB7CiAgcG9zaXRpb246IGFic29sdXRlOwogIHJpZ2h0OiA1cHg7CiAgdG9wOiA1cHg7CiAgei1pbmRleDogMjU7Cn0KCi55aW55YW5nIHsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgdG9wOiAtMTBweDsKICBsZWZ0OiAwOyByaWdodDogMDsKICBtYXJnaW46IGF1dG87CiAgZGlzcGxheTogYmxvY2s7CiAgaGVpZ2h0OiAxMjBweDsKfQoKLmFjdGlvbnMgewogIG1hcmdpbjogMWVtIDAgMDsKICBtaW4taGVpZ2h0OiAxMDBweDsKICBwb3NpdGlvbjogcmVsYXRpdmU7Cn0KCi5hY3Rpb25zcGljdHVyZSB7CiAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgcG9zaXRpb246IGFic29sdXRlOwogIGhlaWdodDogMTAwcHg7CiAgdG9wOiAwOyBsZWZ0OiAwOyByaWdodDogMDsKfQoKLmFjdGlvbmxpbmsgewogIHBvaW50ZXItZXZlbnRzOiBhdXRvOwogIGZvbnQtZmFtaWx5OiBhcmlhbDsKICBmb250LXNpemU6IDgwJTsKICBmb250LXdlaWdodDogYm9sZDsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgdG9wOiAwOyBib3R0b206IDA7CiAgbGluZS1oZWlnaHQ6IDE7CiAgaGVpZ2h0OiAxZW07CiAgbWFyZ2luOiBhdXRvOwp9CgouYWN0aW9ubGluay5kb3dubG9hZCB7CiAgY29sb3I6IHdoaXRlOwogIHJpZ2h0OiA1MCU7CiAgbWFyZ2luLXJpZ2h0OiAxM3B4OwogIHRleHQtc2hhZG93OiAtMXB4IDFweCAzcHggI2IwMCwgLTFweCAtMXB4IDNweCAjYjAwLCAxcHggMHB4IDNweCAjYjAwOwp9CgouYWN0aW9ubGluay5mdW5kIHsKICBjb2xvcjogI2IwMDsKICBsZWZ0OiA1MCU7CiAgbWFyZ2luLWxlZnQ6IDE1cHg7Cn0KCi5hY3Rpb25saW5rOmhvdmVyIHsKICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKfQoKLmFjdGlvbmxpbmsgYSB7CiAgY29sb3I6IGluaGVyaXQ7Cn0KCi5hY3Rpb25zbGVmdCB7CiAgZmxvYXQ6IGxlZnQ7Cn0KCi5hY3Rpb25zcmlnaHQgewogIGZsb2F0OiByaWdodDsKICB0ZXh0LWFsaWduOiByaWdodDsKfQoKQG1lZGlhIHNjcmVlbiBhbmQgKG1heC13aWR0aDogODAwcHgpIHsKICAuYWN0aW9ucyB7CiAgICBwYWRkaW5nLXRvcDogMTIwcHg7CiAgfQogIC5hY3Rpb25zbGVmdCwgLmFjdGlvbnNyaWdodCB7CiAgICBmbG9hdDogbm9uZTsKICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICBtYXJnaW4tYm90dG9tOiAxZW07CiAgfQp9Cgp0aCB7CiAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKICB0ZXh0LWFsaWduOiBsZWZ0Owp9CgojZmVhdHVyZXMgdWwgewogIGxpc3Qtc3R5bGU6IG5vbmU7CiAgbWFyZ2luOiAwIDAgMWVtOwogIHBhZGRpbmc6IDAgMCAwIDEuMmVtOwp9CgojZmVhdHVyZXMgbGk6YmVmb3JlIHsKICBjb250ZW50OiAiLSI7CiAgd2lkdGg6IDFlbTsKICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgcGFkZGluZzogMDsKICBtYXJnaW46IDA7CiAgbWFyZ2luLWxlZnQ6IC0xZW07Cn0KCi5yZWwgewogIG1hcmdpbi1ib3R0b206IDA7Cn0KLnJlbC1ub3RlIHsKICBtYXJnaW4tdG9wOiAwOwogIGNvbG9yOiAjNTU1Owp9CgpwcmUgewogIHBhZGRpbmctbGVmdDogMTVweDsKICBib3JkZXItbGVmdDogMnB4IHNvbGlkICNkZGQ7Cn0KCmNvZGUgewogIHBhZGRpbmc6IDAgMnB4Owp9CgpzdHJvbmcgewogIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogIGZvbnQtd2VpZ2h0OiBub3JtYWw7Cn0KCi5maWVsZCB7CiAgYm9yZGVyOiAxcHggc29saWQgI0EyMTMxMzsKfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/doc/internals.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[77u/PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogSW50ZXJuYWxzPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iZG9jcy5jc3MiPgo8c3R5bGU+ZGwgZGwge21hcmdpbjogMDt9IC51cGRhdGUge2NvbG9yOiAjZDQwICFpbXBvcnRhbnR9PC9zdHlsZT4KPHNjcmlwdCBzcmM9ImFjdGl2ZWJvb2ttYXJrLmpzIj48L3NjcmlwdD4KCjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGgxPkNvZGVNaXJyb3I8L2gxPjxpbWcgaWQ9bG9nbyBzcmM9ImxvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Im1hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIjdG9wIj5JbnRyb2R1Y3Rpb248L2E+PC9saT4KICAgIDxsaT48YSBocmVmPSIjYXBwcm9hY2giPkdlbmVyYWwgQXBwcm9hY2g8L2E+PC9saT4KICAgIDxsaT48YSBocmVmPSIjaW5wdXQiPklucHV0PC9hPjwvbGk+CiAgICA8bGk+PGEgaHJlZj0iI3NlbGVjdGlvbiI+U2VsZWN0aW9uPC9hPjwvbGk+CiAgICA8bGk+PGEgaHJlZj0iI3VwZGF0ZSI+SW50ZWxsaWdlbnQgVXBkYXRpbmc8L2E+PC9saT4KICAgIDxsaT48YSBocmVmPSIjcGFyc2UiPlBhcnNpbmc8L2E+PC9saT4KICAgIDxsaT48YSBocmVmPSIjc3VtbWFyeSI+V2hhdCBHaXZlcz88L2E+PC9saT4KICAgIDxsaT48YSBocmVmPSIjYnRyZWUiPkNvbnRlbnQgUmVwcmVzZW50YXRpb248L2E+PC9saT4KICAgIDxsaT48YSBocmVmPSIja2V5bWFwIj5LZXkgTWFwczwvYT48L2xpPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+Cgo8aDIgaWQ9dG9wPihSZS0pIEltcGxlbWVudGluZyBBIFN5bnRheC1IaWdobGlnaHRpbmcgRWRpdG9yIGluIEphdmFTY3JpcHQ8L2gyPgoKPHAgc3R5bGU9ImZvbnQtc2l6ZTogODUlIiBpZD0iaW50cm8iPgogIDxzdHJvbmc+VG9waWM6PC9zdHJvbmc+IEphdmFTY3JpcHQsIGNvZGUgZWRpdG9yIGltcGxlbWVudGF0aW9uPGJyPgogIDxzdHJvbmc+QXV0aG9yOjwvc3Ryb25nPiBNYXJpam4gSGF2ZXJiZWtlPGJyPgogIDxzdHJvbmc+RGF0ZTo8L3N0cm9uZz4gTWFyY2ggMm5kIDIwMTEgKHVwZGF0ZWQgTm92ZW1iZXIgMTN0aCAyMDExKQo8L3A+Cgo8cCBzdHlsZT0icGFkZGluZzogMCAzZW0gMCAyZW0iPjxzdHJvbmc+Q2F1dGlvbjwvc3Ryb25nPjogdGhpcyB0ZXh0IHdhcyB3cml0dGVuIGJyaWVmbHkgYWZ0ZXIKdmVyc2lvbiAyIHdhcyBpbml0aWFsbHkgd3JpdHRlbi4gSXQgbm8gbG9uZ2VyIChldmVuIGluY2x1ZGluZyB0aGUKdXBkYXRlIGF0IHRoZSBib3R0b20pIGZ1bGx5IHJlcHJlc2VudHMgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24uIEknbQpsZWF2aW5nIGl0IGhlcmUgYXMgYSBoaXN0b3JpYyBkb2N1bWVudC4gRm9yIG1vcmUgdXAtdG8tZGF0ZQppbmZvcm1hdGlvbiwgbG9vayBhdCB0aGUgZW50cmllcwp0YWdnZWQgPGEgaHJlZj0iaHR0cDovL21hcmlqbmhhdmVyYmVrZS5ubC9ibG9nLyNjbS1pbnRlcm5hbHMiPmNtLWludGVybmFsczwvYT4Kb24gbXkgYmxvZy48L3A+Cgo8cD5UaGlzIGlzIGEgZm9sbG93dXAgdG8KbXkgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L3N0b3J5Lmh0bWwiPkJydXRhbCBPZHlzc2V5IHRvIHRoZQpEYXJrIFNpZGUgb2YgdGhlIERPTSBUcmVlPC9hPiBzdG9yeS4gVGhhdCBvbmUgZGVzY3JpYmVzIHRoZQptaW5kLWJlbmRpbmcgcHJvY2VzcyBvZiBpbXBsZW1lbnRpbmcgKHdoYXQgd291bGQgYmVjb21lKSBDb2RlTWlycm9yIDEuClRoaXMgb25lIGRlc2NyaWJlcyB0aGUgaW50ZXJuYWxzIG9mIENvZGVNaXJyb3IgMiwgYSBjb21wbGV0ZSByZXdyaXRlCmFuZCByZXRoaW5rIG9mIHRoZSBvbGQgY29kZSBiYXNlLiBJIHdhbnRlZCB0byBnaXZlIHRoaXMgcGllY2UgYW5vdGhlcgpIdW50ZXIgVGhvbXBzb24gY29weWNhdCBzdWJ0aXRsZSwgYnV0IHNvbWVob3cgdGhhdCB3b3VsZCBiZSBvdXQgb2YKcGxhY2XigJR0aGUgcHJvY2VzcyB0aGlzIHRpbWUgYXJvdW5kIHdhcyBvbmUgb2Ygc3RyYWlnaHRmb3J3YXJkCmVuZ2luZWVyaW5nLCByZXF1aXJpbmcgbm8gc2VyaW91cyBtaW5kLWJlbmRpbmcgd2hhdHNvZXZlci48L3A+Cgo8cD5Tbywgd2hhdCBpcyB3cm9uZyB3aXRoIENvZGVNaXJyb3IgMT8gSSdkIGVzdGltYXRlLCBieSBtYWlsaW5nIGxpc3QKYWN0aXZpdHkgYW5kIGdlbmVyYWwgc2VhcmNoLWVuZ2luZSBwcmVzZW5jZSwgdGhhdCBpdCBoYXMgYmVlbgppbnRlZ3JhdGVkIGludG8gYWJvdXQgYSB0aG91c2FuZCBzeXN0ZW1zIGJ5IG5vdy4gVGhlIG1vc3QgcHJvbWluZW50Cm9uZSwgc2luY2UgYSBmZXcgd2Vla3MsCmJlaW5nIDxhIGhyZWY9Imh0dHA6Ly9nb29nbGVjb2RlLmJsb2dzcG90LmNvbS8yMDExLzAxL21ha2UtcXVpY2stZml4ZXMtcXVpY2tlci1vbi1nb29nbGUuaHRtbCI+R29vZ2xlCmNvZGUncyBwcm9qZWN0IGhvc3Rpbmc8L2E+LiBJdCB3b3JrcywgYW5kIGl0J3MgYmVpbmcgdXNlZCB3aWRlbHkuPC9wPgoKPHA+U3RpbGwsIEkgZGlkIG5vdCBzdGFydCByZXBsYWNpbmcgaXQgYmVjYXVzZSBJIHdhcyBib3JlZC4gQ29kZU1pcnJvcgoxIHdhcyBoZWF2aWx5IHJlbGlhbnQgb24gPGNvZGU+ZGVzaWduTW9kZTwvY29kZT4Kb3IgPGNvZGU+Y29udGVudEVkaXRhYmxlPC9jb2RlPiAoZGVwZW5kaW5nIG9uIHRoZSBicm93c2VyKS4gTmVpdGhlciBvZgp0aGVzZSBhcmUgd2VsbCBzcGVjaWZpZWQgKEhUTUw1IHRyaWVzCnRvIDxhIGhyZWY9Imh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw1L2VkaXRpbmcuaHRtbCNjb250ZW50ZWRpdGFibGUiPnNwZWNpZnk8L2E+CnRoZWlyIGJhc2ljcyksIGFuZCwgbW9yZSBpbXBvcnRhbnRseSwgdGhleSB0ZW5kIHRvIGJlIG9uZSBvZiB0aGUgbW9yZQpvYnNjdXJlIGFuZCBidWdneSBhcmVhcyBvZiBicm93c2VyIGZ1bmN0aW9uYWxpdHnigJRDb2RlTWlycm9yLCBieSB1c2luZwp0aGlzIGZ1bmN0aW9uYWxpdHkgaW4gYSBub24tdHlwaWNhbCB3YXksIHdhcyBjb25zdGFudGx5IHJ1bm5pbmcgdXAKYWdhaW5zdCBicm93c2VyIGJ1Z3MuIFdlYktpdCB3b3VsZG4ndCBzaG93IGFuIGVtcHR5IGxpbmUgYXQgdGhlIGVuZCBvZgp0aGUgZG9jdW1lbnQsIGFuZCBpbiBzb21lIHJlbGVhc2VzIHdvdWxkIHN1ZGRlbmx5IGdldCB1bmJlYXJhYmx5IHNsb3cuCkZpcmVmb3ggd291bGQgc2hvdyB0aGUgY3Vyc29yIGluIHRoZSB3cm9uZyBwbGFjZS4gSW50ZXJuZXQgRXhwbG9yZXIKd291bGQgaW5zaXN0IG9uIGxpbmtpZnlpbmcgZXZlcnl0aGluZyB0aGF0IGxvb2tlZCBsaWtlIGEgVVJMIG9yIGVtYWlsCmFkZHJlc3MsIGEgYmVoYXZpb3VyIHRoYXQgY2FuJ3QgYmUgdHVybmVkIG9mZi4gU29tZSBidWdzIEkgbWFuYWdlZCB0bwp3b3JrIGFyb3VuZCAod2hpY2ggd2FzIG9mdGVuIGEgZnJ1c3RyYXRpbmcsIHBhaW5mdWwgcHJvY2VzcyksIG90aGVycywKc3VjaCBhcyB0aGUgRmlyZWZveCBjdXJzb3IgcGxhY2VtZW50LCBJIGdhdmUgdXAgb24sIGFuZCBoYWQgdG8gdGVsbAp1c2VyIGFmdGVyIHVzZXIgdGhhdCB0aGV5IHdlcmUga25vd24gcHJvYmxlbXMsIGJ1dCBub3Qgc29tZXRoaW5nIEkKY291bGQgaGVscC48L3A+Cgo8cD5BbHNvLCB0aGVyZSBpcyB0aGUgZmFjdCB0aGF0IDxjb2RlPmRlc2lnbk1vZGU8L2NvZGU+ICh3aGljaCBzZWVtZWQKdG8gYmUgbGVzcyBidWdneSB0aGFuIDxjb2RlPmNvbnRlbnRFZGl0YWJsZTwvY29kZT4gaW4gV2Via2l0IGFuZApGaXJlZm94LCBhbmQgd2FzIHRodXMgdXNlZCBieSBDb2RlTWlycm9yIDEgaW4gdGhvc2UgYnJvd3NlcnMpIHJlcXVpcmVzCmEgZnJhbWUuIEZyYW1lcyBhcmUgYW5vdGhlciB0cmlja3kgYXJlYS4gSXQgdGFrZXMgc29tZSBlZmZvcnQgdG8KcHJldmVudCBnZXR0aW5nIHRyaXBwZWQgdXAgYnkgZG9tYWluIHJlc3RyaWN0aW9ucywgdGhleSBkb24ndAppbml0aWFsaXplIHN5bmNocm9ub3VzbHksIGJlaGF2ZSBzdHJhbmdlbHkgaW4gcmVzcG9uc2UgdG8gdGhlIGJhY2sKYnV0dG9uLCBhbmQsIG9uIHNldmVyYWwgYnJvd3NlcnMsIGNhbid0IGJlIG1vdmVkIGFyb3VuZCB0aGUgRE9NCndpdGhvdXQgaGF2aW5nIHRoZW0gcmUtaW5pdGlhbGl6ZS4gVGhleSBkaWQgcHJvdmlkZSBhIHZlcnkgbmljZSB3YXkgdG8KbmFtZXNwYWNlIHRoZSBsaWJyYXJ5LCB0aG91Z2jigJRDb2RlTWlycm9yIDEgY291bGQgZnJlZWx5IHBvbGx1dGUgdGhlCm5hbWVzcGFjZSBpbnNpZGUgdGhlIGZyYW1lLjwvcD4KCjxwPkZpbmFsbHksIHdvcmtpbmcgd2l0aCBhbiBlZGl0YWJsZSBkb2N1bWVudCBtZWFucyB3b3JraW5nIHdpdGgKc2VsZWN0aW9uIGluIGFyYml0cmFyeSBET00gc3RydWN0dXJlcy4gSW50ZXJuZXQgRXhwbG9yZXIgKDggYW5kCmJlZm9yZSkgaGFzIGFuIHV0dGVybHkgZGlmZmVyZW50IChhbmQgYXdrd2FyZCkgc2VsZWN0aW9uIEFQSSB0aGFuIGFsbApvZiB0aGUgb3RoZXIgYnJvd3NlcnMsIGFuZCBldmVuIGFtb25nIHRoZSBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb25zIG9mCjxjb2RlPmRvY3VtZW50LnNlbGVjdGlvbjwvY29kZT4sIGRldGFpbHMgYWJvdXQgaG93IGV4YWN0bHkgYSBzZWxlY3Rpb24KaXMgcmVwcmVzZW50ZWQgdmFyeSBxdWl0ZSBhIGJpdC4gQWRkIHRvIHRoYXQgdGhlIGZhY3QgdGhhdCBPcGVyYSdzCnNlbGVjdGlvbiBzdXBwb3J0IHRlbmRlZCB0byBiZSB2ZXJ5IGJ1Z2d5IHVudGlsIHJlY2VudGx5LCBhbmQgeW91IGNhbgppbWFnaW5lIHdoeSBDb2RlTWlycm9yIDEgY29udGFpbnMgNzAwIGxpbmVzIG9mIHNlbGVjdGlvbi1oYW5kbGluZwpjb2RlLjwvcD4KCjxwPkFuZCB0aGF0IGJyaW5ncyB1cyB0byB0aGUgbWFpbiBpc3N1ZSB3aXRoIHRoZSBDb2RlTWlycm9yIDEKY29kZSBiYXNlOiBUaGUgcHJvcG9ydGlvbiBvZiBicm93c2VyLWJ1Zy13b3JrYXJvdW5kcyB0byByZWFsCmFwcGxpY2F0aW9uIGNvZGUgd2FzIGdldHRpbmcgZGFuZ2Vyb3VzbHkgaGlnaC4gQnkgYnVpbGRpbmcgb24gdG9wIG9mIGEKZmV3IGRvZGd5IGZlYXR1cmVzLCBJIHB1dCB0aGUgc3lzdGVtIGluIGEgdnVsbmVyYWJsZSBwb3NpdGlvbuKAlGFueQppbmNvbXBhdGliaWxpdHkgYW5kIGJ1Z2dpbmVzcyBpbiB0aGVzZSBmZWF0dXJlcywgSSBoYWQgdG8gcGFwZXIgb3Zlcgp3aXRoIG15IG93biBjb2RlLiBOb3Qgb25seSBkaWQgSSBoYXZlIHRvIGRvIHNvbWUgc2VyaW91cyBzdHVudC13b3JrIHRvCmdldCBpdCB0byB3b3JrIG9uIG9sZGVyIGJyb3dzZXJzIChhcyBkZXRhaWxlZCBpbiB0aGUKcHJldmlvdXMgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L3N0b3J5Lmh0bWwiPnN0b3J5PC9hPiksIHRoaW5ncwphbHNvIGtlcHQgYnJlYWtpbmcgaW4gbmV3bHkgcmVsZWFzZWQgdmVyc2lvbnMsIHJlcXVpcmluZyBtZSB0byBjb21lIHVwCndpdGggPGVtPm5ldzwvZW0+IHNjYXJ5IGhhY2tzIGluIG9yZGVyIHRvIGtlZXAgdXAuIFRoaXMgd2FzIHN0YXJ0aW5nCnRvIGxvc2UgaXRzIGFwcGVhbC48L3A+Cgo8c2VjdGlvbiBpZD1hcHByb2FjaD4KICA8aDI+R2VuZXJhbCBBcHByb2FjaDwvaDI+Cgo8cD5XaGF0IENvZGVNaXJyb3IgMiBkb2VzIGlzIHRyeSB0byBzaWRlc3RlcCBtb3N0IG9mIHRoZSBoYWlyeSBoYWNrcwp0aGF0IGNhbWUgdXAgaW4gdmVyc2lvbiAxLiBJIG93ZSBhIGxvdCB0byB0aGUKPGEgaHJlZj0iaHR0cDovL2FjZS5hamF4Lm9yZyI+QUNFPC9hPiBlZGl0b3IgZm9yIGluc3BpcmF0aW9uIG9uIGhvdyB0bwphcHByb2FjaCB0aGlzLjwvcD4KCjxwPkkgYWJzb2x1dGVseSBkaWQgbm90IHdhbnQgdG8gYmUgY29tcGxldGVseSByZWxpYW50IG9uIGtleSBldmVudHMgdG8KZ2VuZXJhdGUgbXkgaW5wdXQuIEV2ZXJ5IEphdmFTY3JpcHQgcHJvZ3JhbW1lciBrbm93cyB0aGF0IGtleSBldmVudAppbmZvcm1hdGlvbiBpcyBob3JyaWJsZSBhbmQgaW5jb21wbGV0ZS4gU29tZSBwZW9wbGUgKG1vc3QgYXdlc29tZWx5Ck1paGFpIEJhem9uIHdpdGggPGEgaHJlZj0iaHR0cDovL3ltYWNzLm9yZyI+WW1hY3M8L2E+KSBoYXZlIGJlZW4gYWJsZQp0byBidWlsZCBtb3JlIG9yIGxlc3MgZnVuY3Rpb25pbmcgZWRpdG9ycyBieSBkaXJlY3RseSByZWFkaW5nIGtleQpldmVudHMsIGJ1dCBpdCB0YWtlcyBhIGxvdCBvZiB3b3JrICh0aGUga2luZCBvZiBuZXZlci1lbmRpbmcsIGZyYWdpbGUKd29yayBJIGRlc2NyaWJlZCBlYXJsaWVyKSwgYW5kIHdpbGwgbmV2ZXIgYmUgYWJsZSB0byBwcm9wZXJseSBzdXBwb3J0CnRoaW5ncyBsaWtlIG11bHRpLWtleXN0b2tlIGludGVybmF0aW9uYWwgY2hhcmFjdGVyCmlucHV0LiA8YSBocmVmPSIja2V5bWFwIiBjbGFzcz0idXBkYXRlIj5bc2VlIGJlbG93IGZvciBjYXZlYXRdPC9hPjwvcD4KCjxwPlNvIHdoYXQgSSBkbyBpcyBmb2N1cyBhIGhpZGRlbiB0ZXh0YXJlYSwgYW5kIGxldCB0aGUgYnJvd3NlcgpiZWxpZXZlIHRoYXQgdGhlIHVzZXIgaXMgdHlwaW5nIGludG8gdGhhdC4gV2hhdCB3ZSBzaG93IHRvIHRoZSB1c2VyIGlzCmEgRE9NIHN0cnVjdHVyZSB3ZSBidWlsdCB0byByZXByZXNlbnQgaGlzIGRvY3VtZW50LiBJZiB0aGlzIGlzIHVwZGF0ZWQKcXVpY2tseSBlbm91Z2gsIGFuZCBzaG93cyBzb21lIGtpbmQgb2YgYmVsaWV2YWJsZSBjdXJzb3IsIGl0IGZlZWxzCmxpa2UgYSByZWFsIHRleHQtaW5wdXQgY29udHJvbC48L3A+Cgo8cD5Bbm90aGVyIGJpZyB3aW4gaXMgdGhhdCB0aGlzIERPTSByZXByZXNlbnRhdGlvbiBkb2VzIG5vdCBoYXZlIHRvCnNwYW4gdGhlIHdob2xlIGRvY3VtZW50LiBTb21lIENvZGVNaXJyb3IgMSB1c2VycyBpbnNpc3RlZCB0aGF0IHRoZXkKbmVlZGVkIHRvIHB1dCBhIDMwIHRob3VzYW5kIGxpbmUgWE1MIGRvY3VtZW50IGludG8gQ29kZU1pcnJvci4gUHV0dGluZwphbGwgdGhhdCBpbnRvIHRoZSBET00gdGFrZXMgYSB3aGlsZSwgZXNwZWNpYWxseSBzaW5jZSwgZm9yIHNvbWUKcmVhc29uLCBhbiBlZGl0YWJsZSBET00gdHJlZSBpcyBzbG93ZXIgdGhhbiBhIG5vcm1hbCBvbmUgb24gbW9zdApicm93c2Vycy4gSWYgd2UgaGF2ZSBmdWxsIGNvbnRyb2wgb3ZlciB3aGF0IHdlIHNob3csIHdlIG11c3Qgb25seQplbnN1cmUgdGhhdCB0aGUgdmlzaWJsZSBwYXJ0IG9mIHRoZSBkb2N1bWVudCBoYXMgYmVlbiBhZGRlZCwgYW5kIGNhbgpkbyB0aGUgcmVzdCBvbmx5IHdoZW4gbmVlZGVkLiAoRm9ydHVuYXRlbHksIHRoZSA8Y29kZT5vbnNjcm9sbDwvY29kZT4KZXZlbnQgd29ya3MgYWxtb3N0IHRoZSBzYW1lIG9uIGFsbCBicm93c2VycywgYW5kIGxlbmRzIGl0c2VsZiB3ZWxsIHRvCmRpc3BsYXlpbmcgdGhpbmdzIG9ubHkgYXMgdGhleSBhcmUgc2Nyb2xsZWQgaW50byB2aWV3Lik8L3A+Cjwvc2VjdGlvbj4KPHNlY3Rpb24gaWQ9ImlucHV0Ij4KICA8aDI+SW5wdXQ8L2gyPgoKPHA+QUNFIHVzZXMgaXRzIGhpZGRlbiB0ZXh0YXJlYSBvbmx5IGFzIGEgdGV4dCBpbnB1dCBzaGltLCBhbmQgZG9lcwphbGwgY3Vyc29yIG1vdmVtZW50IGFuZCB0aGluZ3MgbGlrZSB0ZXh0IGRlbGV0aW9uIGl0c2VsZiBieSBkaXJlY3RseQpoYW5kbGluZyBrZXkgZXZlbnRzLiBDb2RlTWlycm9yJ3Mgd2F5IGlzIHRvIGxldCB0aGUgYnJvd3NlciBkbyBpdHMKdGhpbmcgYXMgbXVjaCBhcyBwb3NzaWJsZSwgYW5kIG5vdCwgZm9yIGV4YW1wbGUsIGRlZmluZSBpdHMgb3duIHNldCBvZgprZXkgYmluZGluZ3MuIE9uZSB3YXkgdG8gZG8gdGhpcyB3b3VsZCBoYXZlIGJlZW4gdG8gaGF2ZSB0aGUgd2hvbGUKZG9jdW1lbnQgaW5zaWRlIHRoZSBoaWRkZW4gdGV4dGFyZWEsIGFuZCBhZnRlciBlYWNoIGtleSBldmVudCB1cGRhdGUKdGhlIGRpc3BsYXkgRE9NIHRvIHJlZmxlY3Qgd2hhdCdzIGluIHRoYXQgdGV4dGFyZWEuPC9wPgoKPHA+VGhhdCdkIGJlIHNpbXBsZSwgYnV0IGl0IGlzIG5vdCByZWFsaXN0aWMuIEZvciBldmVuIG1lZGl1bS1zaXplZApkb2N1bWVudCB0aGUgZWRpdG9yIHdvdWxkIGJlIGNvbnN0YW50bHkgbXVuZ2luZyBodWdlIHN0cmluZ3MsIGFuZCBnZXQKdGVycmlibHkgc2xvdy4gV2hhdCBDb2RlTWlycm9yIDIgZG9lcyBpcyBwdXQgdGhlIGN1cnJlbnQgc2VsZWN0aW9uLAphbG9uZyB3aXRoIGFuIGV4dHJhIGxpbmUgb24gdGhlIHRvcCBhbmQgb24gdGhlIGJvdHRvbSwgaW50byB0aGUKdGV4dGFyZWEuPC9wPgoKPHA+VGhpcyBtZWFucyB0aGF0IHRoZSBhcnJvdyBrZXlzIChhbmQgdGhlaXIgY3RybC12YXJpYXRpb25zKSwgaG9tZSwKZW5kLCBldGNldGVyYSwgZG8gbm90IGhhdmUgdG8gYmUgaGFuZGxlZCBzcGVjaWFsbHkuIFdlIGp1c3QgcmVhZCB0aGUKY3Vyc29yIHBvc2l0aW9uIGluIHRoZSB0ZXh0YXJlYSwgYW5kIHVwZGF0ZSBvdXIgY3Vyc29yIHRvIG1hdGNoIGl0LgpBbHNvLCBjb3B5IGFuZCBwYXN0ZSB3b3JrIHByZXR0eSBtdWNoIGZvciBmcmVlLCBhbmQgcGVvcGxlIGdldCB0aGVpcgpuYXRpdmUga2V5IGJpbmRpbmdzLCB3aXRob3V0IGFueSBzcGVjaWFsIHdvcmsgb24gbXkgcGFydC4gRm9yIGV4YW1wbGUsCkkgaGF2ZSBlbWFjcyBrZXkgYmluZGluZ3MgY29uZmlndXJlZCBmb3IgQ2hyb21lIGFuZCBGaXJlZm94LiBUaGVyZSBpcwpubyB3YXkgZm9yIGEgc2NyaXB0IHRvIGRldGVjdCB0aGlzLiA8YSBjbGFzcz0idXBkYXRlIgpocmVmPSIja2V5bWFwIj5bbm8gbG9uZ2VyIHRoZSBjYXNlXTwvYT48L3A+Cgo8cD5PZiBjb3Vyc2UsIHNpbmNlIG9ubHkgYSBzbWFsbCBwYXJ0IG9mIHRoZSBkb2N1bWVudCBzaXRzIGluIHRoZQp0ZXh0YXJlYSwga2V5cyBsaWtlIHBhZ2UgdXAgYW5kIGN0cmwtZW5kIHdvbid0IGRvIHRoZSByaWdodCB0aGluZy4KQ29kZU1pcnJvciBpcyBjYXRjaGluZyB0aG9zZSBldmVudHMgYW5kIGhhbmRsaW5nIHRoZW0gaXRzZWxmLjwvcD4KPC9zZWN0aW9uPgo8c2VjdGlvbiBpZD0ic2VsZWN0aW9uIj4KICA8aDI+U2VsZWN0aW9uPC9oMj4KCjxwPkdldHRpbmcgYW5kIHNldHRpbmcgdGhlIHNlbGVjdGlvbiByYW5nZSBvZiBhIHRleHRhcmVhIGluIG1vZGVybgpicm93c2VycyBpcyB0cml2aWFs4oCUeW91IGp1c3QgdXNlIHRoZSA8Y29kZT5zZWxlY3Rpb25TdGFydDwvY29kZT4KYW5kIDxjb2RlPnNlbGVjdGlvbkVuZDwvY29kZT4gcHJvcGVydGllcy4gT24gSUUgeW91IGhhdmUgdG8gZG8gc29tZQppbnNhbmUgc3R1ZmYgd2l0aCB0ZW1wb3JhcnkgcmFuZ2VzIGFuZCBjb21wZW5zYXRpbmcgZm9yIHRoZSBmYWN0IHRoYXQKbW92aW5nIHRoZSBzZWxlY3Rpb24gYnkgYSAnY2hhcmFjdGVyJyB3aWxsIHRyZWF0IFxyXG4gYXMgYSBzaW5nbGUKY2hhcmFjdGVyLCBidXQgZXZlbiB0aGVyZSBpdCBpcyBwb3NzaWJsZSB0byBidWlsZCBmdW5jdGlvbnMgdGhhdApyZWxpYWJseSBzZXQgYW5kIGdldCB0aGUgc2VsZWN0aW9uIHJhbmdlLjwvcD4KCjxwPkJ1dCBjb25zaWRlciB0aGlzIHR5cGljYWwgY2FzZTogV2hlbiBJJ20gc29tZXdoZXJlIGluIG15IGRvY3VtZW50LApwcmVzcyBzaGlmdCwgYW5kIHByZXNzIHRoZSB1cCBhcnJvdywgc29tZXRoaW5nIGdldHMgc2VsZWN0ZWQuIFRoZW4sIGlmCkksIHN0aWxsIGhvbGRpbmcgc2hpZnQsIHByZXNzIHRoZSB1cCBhcnJvdyBhZ2FpbiwgdGhlIHRvcCBvZiBteQpzZWxlY3Rpb24gaXMgYWRqdXN0ZWQuIFRoZSBzZWxlY3Rpb24gcmVtZW1iZXJzIHdoZXJlIGl0cyA8ZW0+aGVhZDwvZW0+CmFuZCBpdHMgPGVtPmFuY2hvcjwvZW0+IGFyZSwgYW5kIG1vdmVzIHRoZSBoZWFkIHdoZW4gd2Ugc2hpZnQtbW92ZS4KVGhpcyBpcyBhIGdlbmVyYWxseSBhY2NlcHRlZCBwcm9wZXJ0eSBvZiBzZWxlY3Rpb25zLCBhbmQgZG9uZSByaWdodCBieQpldmVyeSBlZGl0aW5nIGNvbXBvbmVudCBidWlsdCBpbiB0aGUgcGFzdCB0d2VudHkgeWVhcnMuPC9wPgoKPHA+QnV0IG5vdCBzb21ldGhpbmcgdGhhdCB0aGUgYnJvd3NlciBzZWxlY3Rpb24gQVBJcyBleHBvc2UuPC9wPgoKPHA+R3JlYXQuIFNvIHdoZW4gc29tZW9uZSBjcmVhdGVzIGFuICd1cHNpZGUtZG93bicgc2VsZWN0aW9uLCB0aGUgbmV4dAp0aW1lIENvZGVNaXJyb3IgaGFzIHRvIHVwZGF0ZSB0aGUgdGV4dGFyZWEsIGl0J2xsIHJlLWNyZWF0ZSB0aGUKc2VsZWN0aW9uIGFzIGFuICd1cHNpZGUtdXAnIHNlbGVjdGlvbiwgd2l0aCB0aGUgYW5jaG9yIGF0IHRoZSB0b3AsIGFuZAp0aGUgbmV4dCBjdXJzb3IgbW90aW9uIHdpbGwgYmVoYXZlIGluIGFuIHVuZXhwZWN0ZWQgd2F54oCUb3VyIHNlY29uZAp1cC1hcnJvdyBwcmVzcyBpbiB0aGUgZXhhbXBsZSBhYm92ZSB3aWxsIG5vdCBkbyBhbnl0aGluZywgc2luY2UgaXQgaXMKaW50ZXJwcmV0ZWQgaW4gZXhhY3RseSB0aGUgc2FtZSB3YXkgYXMgdGhlIGZpcnN0LjwvcD4KCjxwPk5vIHByb2JsZW0uIFdlJ2xsIGp1c3QsIGVobSwgZGV0ZWN0IHRoYXQgdGhlIHNlbGVjdGlvbiBpcwp1cHNpZGUtZG93biAoeW91IGNhbiB0ZWxsIGJ5IHRoZSB3YXkgaXQgd2FzIGNyZWF0ZWQpLCBhbmQgdGhlbiwgd2hlbgphbiB1cHNpZGUtZG93biBzZWxlY3Rpb24gaXMgcHJlc2VudCwgYW5kIGEgY3Vyc29yLW1vdmluZyBrZXkgaXMKcHJlc3NlZCBpbiBjb21iaW5hdGlvbiB3aXRoIHNoaWZ0LCB3ZSBxdWlja2x5IGNvbGxhcHNlIHRoZSBzZWxlY3Rpb24KaW4gdGhlIHRleHRhcmVhIHRvIGl0cyBzdGFydCwgYWxsb3cgdGhlIGtleSB0byB0YWtlIGVmZmVjdCwgYW5kIHRoZW4KY29tYmluZSBpdHMgbmV3IGhlYWQgd2l0aCBpdHMgb2xkIGFuY2hvciB0byBnZXQgdGhlIDxlbT5yZWFsPC9lbT4Kc2VsZWN0aW9uLjwvcD4KCjxwPkluIHNob3J0LCBzY2FyeSBoYWNrcyBjb3VsZCBub3QgYmUgYXZvaWRlZCBlbnRpcmVseSBpbiBDb2RlTWlycm9yCjIuPC9wPgoKPHA+QW5kLCB0aGUgb2JzZXJ2YW50IHJlYWRlciBtaWdodCBhc2ssIGhvdyBkbyB5b3UgZXZlbiBrbm93IHRoYXQgYQprZXkgY29tYm8gaXMgYSBjdXJzb3ItbW92aW5nIGNvbWJvLCBpZiB5b3UgY2xhaW0geW91IHN1cHBvcnQgYW55Cm5hdGl2ZSBrZXkgYmluZGluZ3M/IFdlbGwsIHdlIGRvbid0LCBidXQgd2UgY2FuIGxlYXJuLiBUaGUgZWRpdG9yCmtlZXBzIGEgc2V0IGtub3duIGN1cnNvci1tb3ZlbWVudCBjb21ib3MgKGluaXRpYWxpemVkIHRvIHRoZQpwcmVkaWN0YWJsZSBkZWZhdWx0cyksIGFuZCB1cGRhdGVzIHRoaXMgc2V0IHdoZW4gaXQgb2JzZXJ2ZXMgdGhhdApwcmVzc2luZyBhIGNlcnRhaW4ga2V5IGhhZCAob25seSkgdGhlIGVmZmVjdCBvZiBtb3ZpbmcgdGhlIGN1cnNvci4KVGhpcywgb2YgY291cnNlLCBkb2Vzbid0IHdvcmsgaWYgdGhlIGZpcnN0IHRpbWUgdGhlIGtleSBpcyB1c2VkIHdhcwpmb3IgZXh0ZW5kaW5nIGFuIGludmVydGVkIHNlbGVjdGlvbiwgYnV0IGl0IHdvcmtzIG1vc3Qgb2YgdGhlCnRpbWUuPC9wPgo8L3NlY3Rpb24+CjxzZWN0aW9uIGlkPSJ1cGRhdGUiPgogIDxoMj5JbnRlbGxpZ2VudCBVcGRhdGluZzwvaDI+Cgo8cD5PbmUgdGhpbmcgdGhhdCBhbHdheXMgY29tZXMgdXAgd2hlbiB5b3UgaGF2ZSBhIGNvbXBsaWNhdGVkIGludGVybmFsCnN0YXRlIHRoYXQncyByZWZsZWN0ZWQgaW4gc29tZSB1c2VyLXZpc2libGUgZXh0ZXJuYWwgcmVwcmVzZW50YXRpb24KKGluIHRoaXMgY2FzZSwgdGhlIGRpc3BsYXllZCBjb2RlIGFuZCB0aGUgdGV4dGFyZWEncyBjb250ZW50KSBpcwprZWVwaW5nIHRoZSB0d28gaW4gc3luYy4gVGhlIG5haXZlIHdheSBpcyB0byBqdXN0IHVwZGF0ZSB0aGUgZGlzcGxheQpldmVyeSB0aW1lIHlvdSBjaGFuZ2UgeW91ciBzdGF0ZSwgYnV0IHRoaXMgaXMgbm90IG9ubHkgZXJyb3IgcHJvbmUKKHlvdSdsbCBmb3JnZXQpLCBpdCBhbHNvIGVhc2lseSBsZWFkcyB0byBkdXBsaWNhdGUgd29yayBvbiBiaWcsCmNvbXBvc2l0ZSBvcGVyYXRpb25zLiBUaGVuIHlvdSBzdGFydCBwYXNzaW5nIGFyb3VuZCBmbGFncyBpbmRpY2F0aW5nCndoZXRoZXIgdGhlIGRpc3BsYXkgc2hvdWxkIGJlIHVwZGF0ZWQgaW4gYW4gYXR0ZW1wdCB0byBiZSBlZmZpY2llbnQKYWdhaW4gYW5kLCB3ZWxsLCBhdCB0aGF0IHBvaW50IHlvdSBtaWdodCBhcyB3ZWxsIGdpdmUgdXAgY29tcGxldGVseS48L3A+Cgo8cD5JIGRpZCBnbyBkb3duIHRoYXQgcm9hZCwgYnV0IHRoZW4gc3dpdGNoZWQgdG8gYSBtdWNoIHNpbXBsZXIgbW9kZWw6CnNpbXBseSBrZWVwIHRyYWNrIG9mIGFsbCB0aGUgdGhpbmdzIHRoYXQgaGF2ZSBiZWVuIGNoYW5nZWQgZHVyaW5nIGFuCmFjdGlvbiwgYW5kIHRoZW4sIG9ubHkgYXQgdGhlIGVuZCwgdXNlIHRoaXMgaW5mb3JtYXRpb24gdG8gdXBkYXRlIHRoZQp1c2VyLXZpc2libGUgZGlzcGxheS48L3A+Cgo8cD5Db2RlTWlycm9yIHVzZXMgYSBjb25jZXB0IG9mIDxlbT5vcGVyYXRpb25zPC9lbT4sIHdoaWNoIHN0YXJ0IGJ5CmNhbGxpbmcgYSBzcGVjaWZpYyBzZXQtdXAgZnVuY3Rpb24gdGhhdCBjbGVhcnMgdGhlIHN0YXRlIGFuZCBlbmQgYnkKY2FsbGluZyBhbm90aGVyIGZ1bmN0aW9uIHRoYXQgcmVhZHMgdGhpcyBzdGF0ZSBhbmQgZG9lcyB0aGUgcmVxdWlyZWQKdXBkYXRpbmcuIE1vc3QgZXZlbnQgaGFuZGxlcnMsIGFuZCBhbGwgdGhlIHVzZXItdmlzaWJsZSBtZXRob2RzIHRoYXQKY2hhbmdlIHN0YXRlIGFyZSB3cmFwcGVkIGxpa2UgdGhpcy4gVGhlcmUncyBhIG1ldGhvZApjYWxsZWQgPGNvZGU+b3BlcmF0aW9uPC9jb2RlPiB0aGF0IGFjY2VwdHMgYSBmdW5jdGlvbiwgYW5kIHJldHVybnMKYW5vdGhlciBmdW5jdGlvbiB0aGF0IHdyYXBzIHRoZSBnaXZlbiBmdW5jdGlvbiBhcyBhbiBvcGVyYXRpb24uPC9wPgoKPHA+SXQncyB0cml2aWFsIHRvIGV4dGVuZCB0aGlzIChhcyBDb2RlTWlycm9yIGRvZXMpIHRvIGRldGVjdCBuZXN0aW5nLAphbmQsIHdoZW4gYW4gb3BlcmF0aW9uIGlzIHN0YXJ0ZWQgaW5zaWRlIGFuIG9wZXJhdGlvbiwgc2ltcGx5CmluY3JlbWVudCB0aGUgbmVzdGluZyBjb3VudCwgYW5kIG9ubHkgZG8gdGhlIHVwZGF0aW5nIHdoZW4gdGhpcyBjb3VudApyZWFjaGVzIHplcm8gYWdhaW4uPC9wPgoKPHA+SWYgd2UgaGF2ZSBhIHNldCBvZiBjaGFuZ2VkIHJhbmdlcyBhbmQga25vdyB0aGUgY3VycmVudGx5IHNob3duCnJhbmdlLCB3ZSBjYW4gKHdpdGggc29tZSBhd2t3YXJkIGNvZGUgdG8gZGVhbCB3aXRoIHRoZSBmYWN0IHRoYXQKY2hhbmdlcyBjYW4gYWRkIGFuZCByZW1vdmUgbGluZXMsIHNvIHdlJ3JlIGRlYWxpbmcgd2l0aCBhIGNoYW5naW5nCmNvb3JkaW5hdGUgc3lzdGVtKSBjb25zdHJ1Y3QgYSBtYXAgb2YgdGhlIHJhbmdlcyB0aGF0IHdlcmUgbGVmdAppbnRhY3QuIFdlIGNhbiB0aGVuIGNvbXBhcmUgdGhpcyBtYXAgd2l0aCB0aGUgcGFydCBvZiB0aGUgZG9jdW1lbnQKdGhhdCdzIGN1cnJlbnRseSB2aXNpYmxlIChiYXNlZCBvbiBzY3JvbGwgb2Zmc2V0IGFuZCBlZGl0b3IgaGVpZ2h0KSB0bwpkZXRlcm1pbmUgd2hldGhlciBzb21ldGhpbmcgbmVlZHMgdG8gYmUgdXBkYXRlZC48L3A+Cgo8cD5Db2RlTWlycm9yIHVzZXMgdHdvIHVwZGF0ZSBhbGdvcml0aG1z4oCUYSBmdWxsIHJlZnJlc2gsIHdoZXJlIGl0IGp1c3QKZGlzY2FyZHMgdGhlIHdob2xlIHBhcnQgb2YgdGhlIERPTSB0aGF0IGNvbnRhaW5zIHRoZSBlZGl0ZWQgdGV4dCBhbmQKcmVidWlsZHMgaXQsIGFuZCBhIHBhdGNoIGFsZ29yaXRobSwgd2hlcmUgaXQgdXNlcyB0aGUgaW5mb3JtYXRpb24KYWJvdXQgY2hhbmdlZCBhbmQgaW50YWN0IHJhbmdlcyB0byB1cGRhdGUgb25seSB0aGUgb3V0LW9mLWRhdGUgcGFydHMKb2YgdGhlIERPTS4gV2hlbiBtb3JlIHRoYW4gMzAgcGVyY2VudCAod2hpY2ggaXMgdGhlIGN1cnJlbnQgaGV1cmlzdGljLAptaWdodCBjaGFuZ2UpIG9mIHRoZSBsaW5lcyBuZWVkIHRvIGJlIHVwZGF0ZWQsIHRoZSBmdWxsIHJlZnJlc2ggaXMKY2hvc2VuIChzaW5jZSBpdCdzIGZhc3RlciB0byBkbyB0aGFuIHBhaW5zdGFraW5nbHkgZmluZGluZyBhbmQKdXBkYXRpbmcgYWxsIHRoZSBjaGFuZ2VkIGxpbmVzKSwgaW4gdGhlIG90aGVyIGNhc2UgaXQgZG9lcyB0aGUKcGF0Y2hpbmcgKHNvIHRoYXQsIGlmIHlvdSBzY3JvbGwgYSBsaW5lIG9yIHNlbGVjdCBhbm90aGVyIGNoYXJhY3RlciwKdGhlIHdob2xlIHNjcmVlbiBkb2Vzbid0IGhhdmUgdG8gYmUKcmUtcmVuZGVyZWQpLiA8c3BhbiBjbGFzcz0idXBkYXRlIj5bdGhlIGZ1bGwtcmVmcmVzaAphbGdvcml0aG0gd2FzIGRyb3BwZWQsIGl0IHdhc24ndCByZWFsbHkgZmFzdGVyIHRoYW4gdGhlIHBhdGNoaW5nCm9uZV08L3NwYW4+PC9wPgoKPHA+QWxsIHVwZGF0aW5nIHVzZXMgPGNvZGU+aW5uZXJIVE1MPC9jb2RlPiByYXRoZXIgdGhhbiBkaXJlY3QgRE9NCm1hbmlwdWxhdGlvbiwgc2luY2UgdGhhdCBzdGlsbCBzZWVtcyB0byBiZSBieSBmYXIgdGhlIGZhc3Rlc3Qgd2F5IHRvCmJ1aWxkIGRvY3VtZW50cy4gVGhlcmUncyBhIHBlci1saW5lIGZ1bmN0aW9uIHRoYXQgY29tYmluZXMgdGhlCmhpZ2hsaWdodGluZywgPGEgaHJlZj0ibWFudWFsLmh0bWwjbWFya1RleHQiPm1hcmtpbmc8L2E+LCBhbmQKc2VsZWN0aW9uIGluZm8gZm9yIHRoYXQgbGluZSBpbnRvIGEgc25pcHBldCBvZiBIVE1MLiBUaGUgcGF0Y2ggdXBkYXRlcgp1c2VzIHRoaXMgdG8gcmVzZXQgaW5kaXZpZHVhbCBsaW5lcywgdGhlIHJlZnJlc2ggdXBkYXRlciBidWlsZHMgYW4KSFRNTCBjaHVuayBmb3IgdGhlIHdob2xlIHZpc2libGUgZG9jdW1lbnQgYXQgb25jZSwgYW5kIHRoZW4gdXNlcyBhCnNpbmdsZSA8Y29kZT5pbm5lckhUTUw8L2NvZGU+IHVwZGF0ZSB0byBkbyB0aGUgcmVmcmVzaC48L3A+Cjwvc2VjdGlvbj4KPHNlY3Rpb24gaWQ9InBhcnNlIj4KICA8aDI+UGFyc2VycyBjYW4gYmUgU2ltcGxlPC9oMj4KCjxwPldoZW4gSSB3cm90ZSBDb2RlTWlycm9yIDEsIEkKdGhvdWdodCA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvc3RvcnkuaHRtbCNwYXJzZXIiPmludGVycnVwdGFibGUKcGFyc2VyczwvYT4gd2VyZSBhIGh1Z2VseSBzY2FyeSBhbmQgY29tcGxpY2F0ZWQgdGhpbmcsIGFuZCBJIHVzZWQgYQpidW5jaCBvZiBoZWF2eXdlaWdodCBhYnN0cmFjdGlvbnMgdG8ga2VlcCB0aGlzIHN1cHBvc2VkIGNvbXBsZXhpdHkKdW5kZXIgY29udHJvbDogcGFyc2Vycwp3ZXJlIDxhIGhyZWY9Imh0dHA6Ly9ib2IucHl0aG9ubWFjLm9yZy9hcmNoaXZlcy8yMDA1LzA3LzA2L2l0ZXJhdGlvbi1pbi1qYXZhc2NyaXB0LyI+aXRlcmF0b3JzPC9hPgp0aGF0IGNvbnN1bWVkIGlucHV0IGZyb20gYW5vdGhlciBpdGVyYXRvciwgYW5kIHVzZWQgZnVubnkKY2xvc3VyZS1yZXNldHRpbmcgdHJpY2tzIHRvIGNvcHkgYW5kIHJlc3VtZSB0aGVtc2VsdmVzLjwvcD4KCjxwPlRoaXMgbWFkZSBmb3IgYSByYXRoZXIgbmljZSBzeXN0ZW0sIGluIHRoYXQgcGFyc2VycyBmb3JtZWQgc3RyaWN0bHkKc2VwYXJhdGUgbW9kdWxlcywgYW5kIGNvdWxkIGJlIGNvbXBvc2VkIGluIHByZWRpY3RhYmxlIHdheXMuClVuZm9ydHVuYXRlbHksIGl0IHdhcyBxdWl0ZSBzbG93IChzdGFja2luZyB0aHJlZSBvciBmb3VyIGl0ZXJhdG9ycyBvbgp0b3Agb2YgZWFjaCBvdGhlciksIGFuZCBleHRyZW1lbHkgaW50aW1pZGF0aW5nIHRvIHBlb3BsZSBub3QgdXNlZCB0byBhCmZ1bmN0aW9uYWwgcHJvZ3JhbW1pbmcgc3R5bGUuPC9wPgoKPHA+V2l0aCBhIGZldyBzbWFsbCBjaGFuZ2VzLCBob3dldmVyLCB3ZSBjYW4ga2VlcCBhbGwgdGhvc2UKYWR2YW50YWdlcywgYnV0IHNpbXBsaWZ5IHRoZSBBUEkgYW5kIG1ha2UgdGhlIHdob2xlIHRoaW5nIGxlc3MKaW5kaXJlY3QgYW5kIGluZWZmaWNpZW50LiBDb2RlTWlycm9yCjIncyA8YSBocmVmPSJtYW51YWwuaHRtbCNtb2RlYXBpIj5tb2RlIEFQSTwvYT4gdXNlcyBleHBsaWNpdCBzdGF0ZQpvYmplY3RzLCBhbmQgbWFrZXMgdGhlIHBhcnNlci90b2tlbml6ZXIgYSBmdW5jdGlvbiB0aGF0IHNpbXBseSB0YWtlcyBhCnN0YXRlIGFuZCBhIGNoYXJhY3RlciBzdHJlYW0gYWJzdHJhY3Rpb24sIGFkdmFuY2VzIHRoZSBzdHJlYW0gb25lCnRva2VuLCBhbmQgcmV0dXJucyB0aGUgd2F5IHRoZSB0b2tlbiBzaG91bGQgYmUgc3R5bGVkLiBUaGlzIHN0YXRlIG1heQpiZSBjb3BpZWQsIG9wdGlvbmFsbHkgaW4gYSBtb2RlLWRlZmluZWQgd2F5LCBpbiBvcmRlciB0byBiZSBhYmxlIHRvCmNvbnRpbnVlIGEgcGFyc2UgYXQgYSBnaXZlbiBwb2ludC4gRXZlbiBzb21lb25lIHdobydzIG5ldmVyIHRvdWNoZWQgYQpsYW1iZGEgaW4gaGlzIGxpZmUgY2FuIHVuZGVyc3RhbmQgdGhpcyBhcHByb2FjaC4gQWRkaXRpb25hbGx5LCBmYXIKZmV3ZXIgb2JqZWN0cyBhcmUgYWxsb2NhdGVkIGluIHRoZSBjb3Vyc2Ugb2YgcGFyc2luZyBub3cuPC9wPgoKPHA+VGhlIGJpZ2dlc3Qgc3BlZWR1cCBjb21lcyBmcm9tIHRoZSBmYWN0IHRoYXQgdGhlIHBhcnNpbmcgbm8gbG9uZ2VyCmhhcyB0byB0b3VjaCB0aGUgRE9NIHRob3VnaC4gSW4gQ29kZU1pcnJvciAxLCBvbiBhbiBvbGRlciBicm93c2VyLCB5b3UKY291bGQgPGVtPnNlZTwvZW0+IHRoZSBwYXJzZXIgd29yayBpdHMgd2F5IHRocm91Z2ggdGhlIGRvY3VtZW50LAptYW5hZ2luZyBzb21lIHR3ZW50eSBsaW5lcyBpbiBlYWNoIDUwLW1pbGxpc2Vjb25kIHRpbWUgc2xpY2UgaXQgZ290LiBJdAp3YXMgcmVhZGluZyBpdHMgaW5wdXQgZnJvbSB0aGUgRE9NLCBhbmQgdXBkYXRpbmcgdGhlIERPTSBhcyBpdCB3ZW50CmFsb25nLCB3aGljaCBhbnkgZXhwZXJpZW5jZWQgSmF2YVNjcmlwdCBwcm9ncmFtbWVyIHdpbGwgaW1tZWRpYXRlbHkKc3BvdCBhcyBhIHJlY2lwZSBmb3Igc2xvd25lc3MuIEluIENvZGVNaXJyb3IgMiwgdGhlIHBhcnNlciB1c3VhbGx5CmZpbmlzaGVzIHRoZSB3aG9sZSBkb2N1bWVudCBpbiBhIHNpbmdsZSAxMDAtbWlsbGlzZWNvbmQgdGltZSBzbGljZeKAlGl0Cm1hbmFnZXMgc29tZSAxNTAwIGxpbmVzIGR1cmluZyB0aGF0IHRpbWUgb24gQ2hyb21lLiBBbGwgaXQgaGFzIHRvIGRvCmlzIG11bmdlIHN0cmluZ3MsIHNvIHRoZXJlIGlzIG5vIHJlYWwgcmVhc29uIGZvciBpdCB0byBiZSBzbG93CmFueW1vcmUuPC9wPgo8L3NlY3Rpb24+CjxzZWN0aW9uIGlkPSJzdW1tYXJ5Ij4KICA8aDI+V2hhdCBHaXZlcz88L2gyPgoKPHA+R2l2ZW4gYWxsIHRoaXMsIHdoYXQgY2FuIHlvdSBleHBlY3QgZnJvbSBDb2RlTWlycm9yIDI/PC9wPgoKPHVsPgoKPGxpPjxzdHJvbmc+U21hbGwuPC9zdHJvbmc+IHRoZSBiYXNlIGxpYnJhcnkgaXMKc29tZSA8c3BhbiBjbGFzcz0idXBkYXRlIj40NWs8L3NwYW4+IHdoZW4gbWluaWZpZWQKbm93LCA8c3BhbiBjbGFzcz0idXBkYXRlIj4xN2s8L3NwYW4+IHdoZW4gZ3ppcHBlZC4gSXQncyBzbWFsbGVyIHRoYW4KaXRzIG93biBsb2dvLjwvbGk+Cgo8bGk+PHN0cm9uZz5MaWdodHdlaWdodC48L3N0cm9uZz4gQ29kZU1pcnJvciAyIGluaXRpYWxpemVzIHZlcnkKcXVpY2tseSwgYW5kIGRvZXMgYWxtb3N0IG5vIHdvcmsgd2hlbiBpdCBpcyBub3QgZm9jdXNlZC4gVGhpcyBtZWFucwp5b3UgY2FuIHRyZWF0IGl0IGFsbW9zdCBsaWtlIGEgdGV4dGFyZWEsIGhhdmUgbXVsdGlwbGUgaW5zdGFuY2VzIG9uIGEKcGFnZSB3aXRob3V0IHRyb3VibGUuPC9saT4KCjxsaT48c3Ryb25nPkh1Z2UgZG9jdW1lbnQgc3VwcG9ydC48L3N0cm9uZz4gU2luY2UgaGlnaGxpZ2h0aW5nIGlzCnJlYWxseSBmYXN0LCBhbmQgbm8gRE9NIHN0cnVjdHVyZSBpcyBiZWluZyBidWlsdCBmb3Igbm9uLXZpc2libGUKY29udGVudCwgeW91IGRvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgbG9ja2luZyB1cCB5b3VyIGJyb3dzZXIgd2hlbiBhCnVzZXIgZW50ZXJzIGEgbWVnYWJ5dGUtc2l6ZWQgZG9jdW1lbnQuPC9saT4KCjxsaT48c3Ryb25nPkV4dGVuZGVkIEFQSS48L3N0cm9uZz4gU29tZSB0aGluZ3Mga2VwdCBjb21pbmcgdXAgaW4gdGhlCm1haWxpbmcgbGlzdCwgc3VjaCBhcyBtYXJraW5nIHBpZWNlcyBvZiB0ZXh0IG9yIGxpbmVzLCB3aGljaCB3ZXJlCmV4dHJlbWVseSBoYXJkIHRvIGRvIHdpdGggQ29kZU1pcnJvciAxLiBUaGUgbmV3IHZlcnNpb24gaGFzIHByb3BlcgpzdXBwb3J0IGZvciB0aGVzZSBidWlsdCBpbi48L2xpPgoKPGxpPjxzdHJvbmc+VGFiIHN1cHBvcnQuPC9zdHJvbmc+IFRhYnMgaW5zaWRlIGVkaXRhYmxlIGRvY3VtZW50cyB3ZXJlLApmb3Igc29tZSByZWFzb24sIGEgbm8tZ28uIEF0IGxlYXN0IHNpeCBkaWZmZXJlbnQgcGVvcGxlIGFubm91bmNlZCB0aGV5CndlcmUgZ29pbmcgdG8gYWRkIHRhYiBzdXBwb3J0IHRvIENvZGVNaXJyb3IgMSwgbm9uZSBzdXJ2aXZlZCAoSSBtZWFuLApub25lIGRlbGl2ZXJlZCBhIHdvcmtpbmcgdmVyc2lvbikuIENvZGVNaXJyb3IgMiBubyBsb25nZXIgcmVtb3ZlcyB0YWJzCmZyb20geW91ciBkb2N1bWVudC48L2xpPgoKPGxpPjxzdHJvbmc+U2FuZSBzdHlsaW5nLjwvc3Ryb25nPiA8Y29kZT5pZnJhbWU8L2NvZGU+IG5vZGVzIGFyZW4ndApyZWFsbHkga25vd24gZm9yIHJlc3BlY3RpbmcgZG9jdW1lbnQgZmxvdy4gTm93IHRoYXQgYW4gZWRpdG9yIGluc3RhbmNlCmlzIGEgcGxhaW4gPGNvZGU+ZGl2PC9jb2RlPiBlbGVtZW50LCBpdCBpcyBtdWNoIGVhc2llciB0byBzaXplIGl0IHRvCmZpdCB0aGUgc3Vycm91bmRpbmcgZWxlbWVudHMuIFlvdSBkb24ndCBldmVuIGhhdmUgdG8gbWFrZSBpdCBzY3JvbGwgaWYKeW91IGRvIG5vdCA8YSBocmVmPSIuLi9kZW1vL3Jlc2l6ZS5odG1sIj53YW50IHRvPC9hPi48L2xpPgoKPC91bD4KCjxwPk9uIHRoZSBkb3duc2lkZSwgYSBDb2RlTWlycm9yIDIgaW5zdGFuY2UgaXMgPGVtPm5vdDwvZW0+IGEgbmF0aXZlCmVkaXRhYmxlIGNvbXBvbmVudC4gVGhvdWdoIGl0IGRvZXMgaXRzIGJlc3QgdG8gZW11bGF0ZSBzdWNoIGEKY29tcG9uZW50IGFzIG11Y2ggYXMgcG9zc2libGUsIHRoZXJlIGlzIGZ1bmN0aW9uYWxpdHkgdGhhdCBicm93c2VycwpqdXN0IGRvIG5vdCBhbGxvdyB1cyB0byBob29rIGludG8uIERvaW5nIHNlbGVjdC1hbGwgZnJvbSB0aGUgY29udGV4dAptZW51LCBmb3IgZXhhbXBsZSwgaXMgbm90IGN1cnJlbnRseSBkZXRlY3RlZCBieSBDb2RlTWlycm9yLjwvcD4KCjxwIGlkPSJjaGFuZ2VzIiBzdHlsZT0ibWFyZ2luLXRvcDogMmVtOyI+PHNwYW4gc3R5bGU9ImZvbnQtd2VpZ2h0Ogpib2xkIj5bVXBkYXRlcyBmcm9tIE5vdmVtYmVyIDEzdGggMjAxMV08L3NwYW4+IFJlY2VudGx5LCBJJ3ZlIG1hZGUKc29tZSBjaGFuZ2VzIHRvIHRoZSBjb2RlYmFzZSB0aGF0IGNhdXNlIHNvbWUgb2YgdGhlIHRleHQgYWJvdmUgdG8gbm8KbG9uZ2VyIGJlIGN1cnJlbnQuIEkndmUgbGVmdCB0aGUgdGV4dCBpbnRhY3QsIGJ1dCBhZGRlZCBtYXJrZXJzIGF0IHRoZQpwYXNzYWdlcyB0aGF0IGFyZSBub3cgaW5hY2N1cmF0ZS4gVGhlIG5ldyBzaXR1YXRpb24gaXMgZGVzY3JpYmVkCmJlbG93LjwvcD4KPC9zZWN0aW9uPgo8c2VjdGlvbiBpZD0iYnRyZWUiPgogIDxoMj5Db250ZW50IFJlcHJlc2VudGF0aW9uPC9oMj4KCjxwPlRoZSBvcmlnaW5hbCBpbXBsZW1lbnRhdGlvbiBvZiBDb2RlTWlycm9yIDIgcmVwcmVzZW50ZWQgdGhlCmRvY3VtZW50IGFzIGEgZmxhdCBhcnJheSBvZiBsaW5lIG9iamVjdHMuIFRoaXMgd29ya2VkIHdlbGzigJRzcGxpY2luZwphcnJheXMgd2lsbCByZXF1aXJlIHRoZSBwYXJ0IG9mIHRoZSBhcnJheSBhZnRlciB0aGUgc3BsaWNlIHRvIGJlCm1vdmVkLCBidXQgdGhpcyBpcyBiYXNpY2FsbHkganVzdCBhIHNpbXBsZSA8Y29kZT5tZW1tb3ZlPC9jb2RlPiBvZiBhCmJ1bmNoIG9mIHBvaW50ZXJzLCBzbyBpdCBpcyBjaGVhcCBldmVuIGZvciBodWdlIGRvY3VtZW50cy48L3A+Cgo8cD5Ib3dldmVyLCBJIHJlY2VudGx5IGFkZGVkIGxpbmUgd3JhcHBpbmcgYW5kIGNvZGUgZm9sZGluZyAobGluZQpjb2xsYXBzaW5nLCBiYXNpY2FsbHkpLiBPbmNlIGxpbmVzIHN0YXJ0IHRha2luZyB1cCBhIG5vbi1jb25zdGFudAphbW91bnQgb2YgdmVydGljYWwgc3BhY2UsIGxvb2tpbmcgdXAgYSBsaW5lIGJ5IHZlcnRpY2FsIHBvc2l0aW9uCih3aGljaCBpcyBuZWVkZWQgd2hlbiBzb21lb25lIGNsaWNrcyB0aGUgZG9jdW1lbnQsIGFuZCB0byBkZXRlcm1pbmUKdGhlIHZpc2libGUgcGFydCBvZiB0aGUgZG9jdW1lbnQgZHVyaW5nIHNjcm9sbGluZykgY2FuIG9ubHkgYmUgZG9uZQp3aXRoIGEgbGluZWFyIHNjYW4gdGhyb3VnaCB0aGUgd2hvbGUgYXJyYXksIHN1bW1pbmcgdXAgbGluZSBoZWlnaHRzIGFzCnlvdSBnby4gU2VlaW5nIGhvdyBJJ3ZlIGJlZW4gZ29pbmcgb3V0IG9mIG15IHdheSB0byBtYWtlIGJpZyBkb2N1bWVudHMKZmFzdCwgdGhpcyBpcyBub3QgYWNjZXB0YWJsZS48L3A+Cgo8cD5UaGUgbmV3IHJlcHJlc2VudGF0aW9uIGlzIGJhc2VkIG9uIGEgQi10cmVlLiBUaGUgbGVhdmVzIG9mIHRoZSB0cmVlCmNvbnRhaW4gYXJyYXlzIG9mIGxpbmUgb2JqZWN0cywgd2l0aCBhIGZpeGVkIG1pbmltdW0gYW5kIG1heGltdW0gc2l6ZSwKYW5kIHRoZSBub24tbGVhZiBub2RlcyBzaW1wbHkgaG9sZCBhcnJheXMgb2YgY2hpbGQgbm9kZXMuIEVhY2ggbm9kZQpzdG9yZXMgYm90aCB0aGUgYW1vdW50IG9mIGxpbmVzIHRoYXQgbGl2ZSBiZWxvdyB0aGVtIGFuZCB0aGUgdmVydGljYWwKc3BhY2UgdGFrZW4gdXAgYnkgdGhlc2UgbGluZXMuIFRoaXMgYWxsb3dzIHRoZSB0cmVlIHRvIGJlIGluZGV4ZWQgYm90aApieSBsaW5lIG51bWJlciBhbmQgYnkgdmVydGljYWwgcG9zaXRpb24sIGFuZCBhbGwgYWNjZXNzIGhhcwpsb2dhcml0aG1pYyBjb21wbGV4aXR5IGluIHJlbGF0aW9uIHRvIHRoZSBkb2N1bWVudCBzaXplLjwvcD4KCjxwPkkgZ2F2ZSBsaW5lIG9iamVjdHMgYW5kIHRyZWUgbm9kZXMgcGFyZW50IHBvaW50ZXJzLCB0byB0aGUgbm9kZQphYm92ZSB0aGVtLiBXaGVuIGEgbGluZSBoYXMgdG8gdXBkYXRlIGl0cyBoZWlnaHQsIGl0IGNhbiBzaW1wbHkgd2Fsawp0aGVzZSBwb2ludGVycyB0byB0aGUgdG9wIG9mIHRoZSB0cmVlLCBhZGRpbmcgb3Igc3VidHJhY3RpbmcgdGhlCmRpZmZlcmVuY2UgaW4gaGVpZ2h0IGZyb20gZWFjaCBub2RlIGl0IGVuY291bnRlcnMuIFRoZSBwYXJlbnQgcG9pbnRlcnMKYWxzbyBtYWtlIGl0IGNoZWFwZXIgKGluIGNvbXBsZXhpdHkgdGVybXMsIHRoZSBkaWZmZXJlbmNlIGlzIHByb2JhYmx5CnRpbnkgaW4gbm9ybWFsLXNpemVkIGRvY3VtZW50cykgdG8gZmluZCB0aGUgY3VycmVudCBsaW5lIG51bWJlciB3aGVuCmdpdmVuIGEgbGluZSBvYmplY3QuIEluIHRoZSBvbGQgYXBwcm9hY2gsIHRoZSB3aG9sZSBkb2N1bWVudCBhcnJheSBoYWQKdG8gYmUgc2VhcmNoZWQuIE5vdywgd2UgY2FuIGp1c3Qgd2FsayB1cCB0aGUgdHJlZSBhbmQgY291bnQgdGhlIHNpemVzCm9mIHRoZSBub2RlcyBjb21pbmcgYmVmb3JlIHVzIGF0IGVhY2ggbGV2ZWwuPC9wPgoKPHA+SSBjaG9zZSBCLXRyZWVzLCBub3QgcmVndWxhciBiaW5hcnkgdHJlZXMsIG1vc3RseSBiZWNhdXNlIHRoZXkKYWxsb3cgZm9yIHZlcnkgZmFzdCBidWxrIGluc2VydGlvbnMgYW5kIGRlbGV0aW9ucy4gV2hlbiB0aGVyZSBpcyBhIGJpZwpjaGFuZ2UgdG8gYSBkb2N1bWVudCwgaXQgdHlwaWNhbGx5IGludm9sdmVzIGFkZGluZywgZGVsZXRpbmcsIG9yCnJlcGxhY2luZyBhIGNodW5rIG9mIHN1YnNlcXVlbnQgbGluZXMuIEluIGEgcmVndWxhciBiYWxhbmNlZCB0cmVlLCBhbGwKdGhlc2UgaW5zZXJ0cyBvciBkZWxldGVzIHdvdWxkIGhhdmUgdG8gYmUgZG9uZSBzZXBhcmF0ZWx5LCB3aGljaCBjb3VsZApiZSByZWFsbHkgZXhwZW5zaXZlLiBJbiBhIEItdHJlZSwgdG8gaW5zZXJ0IGEgY2h1bmssIHlvdSBqdXN0IHdhbGsKZG93biB0aGUgdHJlZSBvbmNlIHRvIGZpbmQgd2hlcmUgaXQgc2hvdWxkIGdvLCBpbnNlcnQgdGhlbSBhbGwgaW4gb25lCnNob3QsIGFuZCB0aGVuIGJyZWFrIHVwIHRoZSBub2RlIGlmIG5lZWRlZC4gVGhpcyBicmVha2luZyB1cCBtaWdodAppbnZvbHZlIGJyZWFraW5nIHVwIG5vZGVzIGZ1cnRoZXIgdXAsIGJ1dCBvbmx5IHJlcXVpcmVzIGEgc2luZ2xlIHBhc3MKYmFjayB1cCB0aGUgdHJlZS4gRm9yIGRlbGV0aW9uLCBJJ20gc29tZXdoYXQgbGF4IGluIGtlZXBpbmcgdGhpbmdzCmJhbGFuY2Vk4oCUSSBqdXN0IGNvbGxhcHNlIG5vZGVzIGludG8gYSBsZWFmIHdoZW4gdGhlaXIgY2hpbGQgY291bnQgZ29lcwpiZWxvdyBhIGdpdmVuIG51bWJlci4gVGhpcyBtZWFucyB0aGF0IHRoZXJlIGFyZSBzb21lIHdlaXJkIGVkaXRpbmcKcGF0dGVybnMgdGhhdCBtYXkgcmVzdWx0IGluIGEgc2VyaW91c2x5IHVuYmFsYW5jZWQgdHJlZSwgYnV0IGV2ZW4gc3VjaAphbiB1bmJhbGFuY2VkIHRyZWUgd2lsbCBwZXJmb3JtIHdlbGwsIHVubGVzcyB5b3Ugc3BlbmQgYSBkYXkgbWFraW5nCnN0cmFuZ2VseSByZXBlYXRpbmcgZWRpdHMgdG8gYSByZWFsbHkgYmlnIGRvY3VtZW50LjwvcD4KPC9zZWN0aW9uPgo8c2VjdGlvbiBpZD0ia2V5bWFwIj4KICA8aDI+S2V5bWFwczwvaDI+Cgo8cD48YSBocmVmPSIjYXBwcm9hY2giPkFib3ZlPC9hPiwgSSBjbGFpbWVkIHRoYXQgZGlyZWN0bHkgY2F0Y2hpbmcga2V5CmV2ZW50cyBmb3IgdGhpbmdzIGxpa2UgY3Vyc29yIG1vdmVtZW50IGlzIGltcHJhY3RpY2FsIGJlY2F1c2UgaXQKcmVxdWlyZXMgc29tZSBicm93c2VyLXNwZWNpZmljIGtsdWRnZXMuIEkgdGhlbiBwcm9jZWVkZWQgdG8gZXhwbGFpbgpzb21lIGF3ZnVsIDxhIGhyZWY9IiNzZWxlY3Rpb24iPmhhY2tzPC9hPiB0aGF0IHdlcmUgbmVlZGVkIHRvIG1ha2UgaXQKcG9zc2libGUgZm9yIHRoZSBzZWxlY3Rpb24gY2hhbmdlcyB0byBiZSBkZXRlY3RlZCB0aHJvdWdoIHRoZQp0ZXh0YXJlYS4gSW4gZmFjdCwgdGhlIHNlY29uZCBoYWNrIGlzIGFib3V0IGFzIGJhZCBhcyB0aGUgZmlyc3QuPC9wPgoKPHA+T24gdG9wIG9mIHRoYXQsIGluIHRoZSBwcmVzZW5jZSBvZiB1c2VyLWNvbmZpZ3VyYWJsZSB0YWIgc2l6ZXMgYW5kCmNvbGxhcHNlZCBhbmQgd3JhcHBlZCBsaW5lcywgbGluaW5nIHVwIGN1cnNvciBtb3ZlbWVudCBpbiB0aGUgdGV4dGFyZWEKd2l0aCB3aGF0J3MgdmlzaWJsZSBvbiB0aGUgc2NyZWVuIGJlY29tZXMgYSBuaWdodG1hcmUuIFRodXMsIEkndmUKZGVjaWRlZCB0byBtb3ZlIHRvIGEgbW9kZWwgd2hlcmUgdGhlIHRleHRhcmVhJ3Mgc2VsZWN0aW9uIGlzIG5vIGxvbmdlcgpkZXBlbmRlZCBvbi48L3A+Cgo8cD5TbyBJIG1vdmVkIHRvIGEgbW9kZWwgd2hlcmUgYWxsIGN1cnNvciBtb3ZlbWVudCBpcyBoYW5kbGVkIGJ5IG15Cm93biBjb2RlLiBUaGlzIGFkZHMgc3VwcG9ydCBmb3IgYSBnb2FsIGNvbHVtbiwgcHJvcGVyIGludGVyYWN0aW9uIG9mCmN1cnNvciBtb3ZlbWVudCB3aXRoIGNvbGxhcHNlZCBsaW5lcywgYW5kIG1ha2VzIGl0IHBvc3NpYmxlIGZvcgp2ZXJ0aWNhbCBtb3ZlbWVudCB0byBtb3ZlIHRocm91Z2ggd3JhcHBlZCBsaW5lcyBwcm9wZXJseSwgaW5zdGVhZCBvZgpqdXN0IHRyZWF0aW5nIHRoZW0gbGlrZSBub24td3JhcHBlZCBsaW5lcy48L3A+Cgo8cD5UaGUga2V5IGV2ZW50IGhhbmRsZXJzIG5vdyB0cmFuc2xhdGUgdGhlIGtleSBldmVudCBpbnRvIGEgc3RyaW5nLApzb21ldGhpbmcgbGlrZSA8Y29kZT5DdHJsLUhvbWU8L2NvZGU+IG9yIDxjb2RlPlNoaWZ0LUNtZC1SPC9jb2RlPiwgYW5kCnVzZSB0aGF0IHN0cmluZyB0byBsb29rIHVwIGFuIGFjdGlvbiB0byBwZXJmb3JtLiBUbyBtYWtlIGtleWJpbmRpbmcKY3VzdG9taXphYmxlLCB0aGlzIGxvb2t1cCBnb2VzIHRocm91Z2gKYSA8YSBocmVmPSJtYW51YWwuaHRtbCNvcHRpb25fa2V5TWFwIj50YWJsZTwvYT4sIHVzaW5nIGEgc2NoZW1lIHRoYXQKYWxsb3dzIHN1Y2ggdGFibGVzIHRvIGJlIGNoYWluZWQgdG9nZXRoZXIgKGZvciBleGFtcGxlLCB0aGUgZGVmYXVsdApNYWMgYmluZGluZ3MgZmFsbCB0aHJvdWdoIHRvIGEgdGFibGUgbmFtZWQgJ2VtYWNzeScsIHdoaWNoIGRlZmluZXMKYmFzaWMgRW1hY3Mtc3R5bGUgYmluZGluZ3MgbGlrZSA8Y29kZT5DdHJsLUY8L2NvZGU+LCBhbmQgd2hpY2ggaXMgYWxzbwp1c2VkIGJ5IHRoZSBjdXN0b20gRW1hY3MgYmluZGluZ3MpLjwvcD4KCjxwPkEgbmV3Cm9wdGlvbiA8YSBocmVmPSJtYW51YWwuaHRtbCNvcHRpb25fZXh0cmFLZXlzIj48Y29kZT5leHRyYUtleXM8L2NvZGU+PC9hPgphbGxvd3MgYWQtaG9jIGtleWJpbmRpbmdzIHRvIGJlIGRlZmluZWQgaW4gYSBtdWNoIG5pY2VyIHdheSB0aGFuIHdoYXQKd2FzIHBvc3NpYmxlIHdpdGggdGhlCm9sZCA8YSBocmVmPSJtYW51YWwuaHRtbCNvcHRpb25fb25LZXlFdmVudCI+PGNvZGU+b25LZXlFdmVudDwvY29kZT48L2E+CmNhbGxiYWNrLiBZb3Ugc2ltcGx5IHByb3ZpZGUgYW4gb2JqZWN0IG1hcHBpbmcga2V5IGlkZW50aWZpZXJzIHRvCmZ1bmN0aW9ucywgaW5zdGVhZCBvZiBwYWluc3Rha2luZ2x5IGxvb2tpbmcgYXQgcmF3IGtleSBldmVudHMuPC9wPgoKPHA+QnVpbHQtaW4gY29tbWFuZHMgbWFwIHRvIHN0cmluZ3MsIHJhdGhlciB0aGFuIGZ1bmN0aW9ucywgZm9yCmV4YW1wbGUgPGNvZGU+ImdvTGluZVVwIjwvY29kZT4gaXMgdGhlIGRlZmF1bHQgYWN0aW9uIGJvdW5kIHRvIHRoZSB1cAphcnJvdyBrZXkuIFRoaXMgYWxsb3dzIG5ldyBrZXltYXBzIHRvIHJlZmVyIHRvIHRoZW0gd2l0aG91dApkdXBsaWNhdGluZyBhbnkgY29kZS4gTmV3IGNvbW1hbmRzIGNhbiBiZSBkZWZpbmVkIGJ5IGFzc2lnbmluZyB0bwp0aGUgPGNvZGU+Q29kZU1pcnJvci5jb21tYW5kczwvY29kZT4gb2JqZWN0LCB3aGljaCBtYXBzIHN1Y2ggY29tbWFuZHMKdG8gZnVuY3Rpb25zLjwvcD4KCjxwPlRoZSBoaWRkZW4gdGV4dGFyZWEgbm93IG9ubHkgaG9sZHMgdGhlIGN1cnJlbnQgc2VsZWN0aW9uLCB3aXRoIG5vCmV4dHJhIGNoYXJhY3RlcnMgYXJvdW5kIGl0LiBUaGlzIGhhcyBhIG5pY2UgYWR2YW50YWdlOiBwb2xsaW5nIGZvcgppbnB1dCBiZWNvbWVzIG11Y2gsIG11Y2ggZmFzdGVyLiBJZiB0aGVyZSdzIGEgYmlnIHNlbGVjdGlvbiwgdGhpcyB0ZXh0CmRvZXMgbm90IGhhdmUgdG8gYmUgcmVhZCBmcm9tIHRoZSB0ZXh0YXJlYSBldmVyeSB0aW1l4oCUd2hlbiB3ZSBwb2xsLApqdXN0IG5vdGljaW5nIHRoYXQgc29tZXRoaW5nIGlzIHN0aWxsIHNlbGVjdGVkIGlzIGVub3VnaCB0byB0ZWxsIHVzCnRoYXQgbm8gbmV3IHRleHQgd2FzIHR5cGVkLjwvcD4KCjxwPlRoZSByZWFzb24gdGhhdCBjaGVhcCBwb2xsaW5nIGlzIGltcG9ydGFudCBpcyB0aGF0IG1hbnkgYnJvd3NlcnMgZG8Kbm90IGZpcmUgdXNlZnVsIGV2ZW50cyBvbiBJTUUgKGlucHV0IG1ldGhvZCBlbmdpbmUpIGlucHV0LCB3aGljaCBpcwp0aGUgdGhpbmcgd2hlcmUgcGVvcGxlIGlucHV0dGluZyBhIGxhbmd1YWdlIGxpa2UgSmFwYW5lc2Ugb3IgQ2hpbmVzZQp1c2UgbXVsdGlwbGUga2V5c3Ryb2tlcyB0byBjcmVhdGUgYSBjaGFyYWN0ZXIgb3Igc2VxdWVuY2Ugb2YKY2hhcmFjdGVycy4gTW9zdCBtb2Rlcm4gYnJvd3NlcnMgZmlyZSA8Y29kZT5pbnB1dDwvY29kZT4gd2hlbiB0aGUKY29tcG9zaW5nIGlzIGZpbmlzaGVkLCBidXQgbWFueSBkb24ndCBmaXJlIGFueXRoaW5nIHdoZW4gdGhlIGNoYXJhY3RlcgppcyB1cGRhdGVkIDxlbT5kdXJpbmc8L2VtPiBjb21wb3NpdGlvbi4gU28gd2UgcG9sbCwgd2hlbmV2ZXIgdGhlCmVkaXRvciBpcyBmb2N1c2VkLCB0byBwcm92aWRlIGltbWVkaWF0ZSB1cGRhdGVzIG9mIHRoZSBkaXNwbGF5LjwvcD4KCjwvc2VjdGlvbj4KPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/doc/logo.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAHEAAABpCAYAAAAN+8wmAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAKOAAACjgH/xBOOAAAAB3RJTUUH3goUFDELO4vaAAAAIABJREFUeNrtnXd8VEXXx79zdze9kAABKVIUabsLIUEEBKSFEhBrQAhFQfTlUVBBUUCf18IDNlCkC4iF3osQpImFRyEQsrsEFGmhSktPNtnsnfePbMImJCFlA4HX8/nsJ9mZ2Tv3zu/OzDlnThFSSu4WEkKIls2btbYj+oDSTAjpKSSeUuApJZ4gPUFYQcRIKQ+gsMdsNpvu+Oe+00Fs1KiRn7e7e5iK0kdRRLiqqtVKeYlYkF+jKItNJlPCPyDeYtLr9YEaqekghN3LLoQ2wDfAe9ToUbOsVqty9uxZzp07x7kzZ7lw4QKZmZk3u9wlIZWXYg/HrvoHxNtIRr3Be+PmTb/Xr1+/uXO5lJLTp0/zyy+/8Ouen9l/IJqsrKwilmTW2+z2UXFxcRf+AfH2gPjoV18vnhoSEtK0uHZWq5Xf9v6X5UuXsfe3/xbWJFEKxprN5kV3wnMr3F3UNyUlxfdmjTw8PHikS2fmLpjPqjWrCe/bB41G49ykipAsNOoNPxiNxoB/QLx1s7An8CyqvKc0v2vcuDFTpkxh4+ZNBIe0KljdHVVuCw0N9f9nOa14APXAr0II359+2iP8A8o2eVRVZfHixcz6YiY2m8256r8qMsxisaT+MxMrBsCawGbAr1mzZtayAgigKArPPfccS5cvo0aNGs5vd1sF8c0/y2nFADhQq9XGAfUAHn/yCU9XXLdx48Z89fViUQDIxw0Gw/B/llPXAKd4eXn19vX1nfL333/rc8sHRg7izTffdGlf586d47lhz6oXLlzIfdlTUUQLk8l04h8QywZeg/r1649JSEgYlpSU5H9drhM8M2gg48ePRwjh8n7PnDnD008+paanpzuAlEtNFsugf0AsOXCtfLy8++vc3QYmJCTUKVjfpVtX/vWvf9GoUaMKvY9tUVt5fdwbefyPFOjNZvORyjJO2koGmg7oJITo5+bmFgEEpaanQXpaXpvadWrRrXsY4eHhNGnS5JbcV4+evfjl171sWLceQNFI/g0M+GcmXgdOAB2BIYqiPKWqql/BNnXr1qV7jzC6d+9O8+bNb8t9ZmRk8Fi/R+0Xzl/UAFJRNcZDcYcs/69BNOoN9wNDgMFA/YL19RvUo1v3MMLCwm7ZjHOWFxXlRsZ906ZNTHxrgmMvZlWs2Rzx/w5Eo95QBejvAK9dwfqgoCB69wmnT58+PPDAA7dlQFRVJTYmluCQ4ELrnnz8SXn8+F8CyFaRdS0Wy8X/F3uiUW94EBgL9APcnet8vLzp2qM7ffr0oXXr1oXOgFtJNpuNPT/vKRRERVEYPXq0GDNmNIBWQRkKfHhXg2jUG9oDbwM9Ctbdf38jBg8dTO/evXF3d680zFViYiIHow8UWd+5a2cCAgJISEgA5KC7FkSj3vAQMBnoUrCuTduHGDp0KO3bt68Qua7cICZc4/Tp00XWZ2VlOZ943HfXiRhGvSEAmAo8D+QhpNVq6dGrJ0OHDr3lTEpp6eq1BBISEkhJScHXN/+p1vnz5/n000+5cuVKbtHfQgghXchYtGzZsna9unVH6HTuPseOH1sQGxv7xy0D0ag3DASmA0HO5e07PMyECROoW7fuHaEZSryWCEB8fDzNmzcn+coVDu/ew/ZtUWz4/XdsDrw0QsQj7QNcCeCgAf3DqwYEruzbr5/XmlWrURCjWzRv0Tv2cOzOCgXRqDdUA74ruO8FBQXx5lvj6dY9jDuJ/r78NwCLp37M2VMniUtMIBcnBfAVmkup2P9jk+pCi+Wwy46menbr2cdmz1r37ZLvtLVq1SItLY2FXy5wUwSfAMEVBqJRbwgB1gL35pZpNBoGDY5k1KhReHl5caeR6WAMAEl/HONoRgrOE00FUqTdZrKYP3dlnwaDIdxNq1s3Y+YX2lq1agE51geOPluGhob6R0dHJ7kcRKPeMAyYA3jklumNBv73f//3tsl4rqD9v+9TAaVPlaqMq1mX3SkJXLXbEHZYmXwFu5S1mzVrdo+rDKkMBkNdnUa7esTI57Xt2rVDZtsQWh3nzp3La2O324VLZ6JRb1CAGcC/nMvD+/bh3Xffxc3N7Y4F8MiRIySnpykAPlotNXRuDAiskVfv56Zj3uXzuClKKLDJFX36evt+Vb16NbeRzw0nc9ka3MI6I6pV5Xz82RJfQyklgAL40hlAIQSjXvoXU6ZMuaMBBFi9cmUu08IDbjeeL/evWoNArS5ZRXnQJcxgM+NjqakpXV8f/4aSHbWd7PgzSJ0OgBOnTuK0RUmXgQh8DjyX+8Xd3Z2PPv6QF198kTud0tLS2Lx+gwoQ7OmNb37rNwB0El6sdo+3FvlCcHBwlfL0p9frfbRumrnt27ajbe17sR35M29SWCwWZzEmuWHDhqkuAdGoN0wBXs79HhgYyIJFC+nRs9dtGfTTp0+TlJTksutNmzbNlmGzKQCP+BSNTwf/QA2IQDU7e2p5+lNQPrDb7UGvjn2NrB0/5gCo0SB8fdixY4dz059XrlxpLzeIRr1hIvCm8wycNWc2LVq0uG0z595772XGjBnMmDGDy5cvl+taWzZvYdWKlTqAhm4e9KxStci2Pgja+fgqUjKyRfMWXcvSX3DT4PogX3rsiccJupaE/epVSE1DCaqKEIIdP2zPaysFP5Z7TzTqDWHA+85l7733/m0713PeiydOnEhWVhY9w3owadIkjh49WqprqKrKihUr7BMnTsjK5fIm1aqPuyh+WHr4VxOAkELdWBYg7Rr7OCGE5rmBkSLxYAzSlo166TKapo35888/iY+Pd37O3eXS2Bj1hkDgK2cV2vDnR9ArvBeVgRRFYdy4cRj0zXl70jtsXL+BoKAaBIcEExoaSkhICPfdd98NOtrExERMJhOzvphpP3LkiAbQKMDooNo0cr+5wVwH3yoYPbwxWdO8pFA3G43GniaTaU9J7rlFixZBIId36NRJrXXxb+VYehrVzl1AKBq0Rj07FuXzHEg0m80x5VW7zQNq5X7p+EgnXn755UrHlPTo2YsGDe/jldFjOHv2LNu2RrFtaxQA/v7+1KpTG51Oh1ar5eL5C5w/fz6P8QPwF5rsd+o00D7o5VuyVUBKXqlZl+dPHsEuhAeqXGMwGNqYzebjN5392eoYIfCI6NOH7LijpFozsdtsaBo1RPHwYMcPzvuh2CmlVMsMolFvGAI85bwHffjhh7f9vK8oeuCBB1i9dg3Lli3j66+/JvFajqthUlJSsQxQKy8f69u1G3pUUzSl6q+Ruyejg+rw+eVzqFBVSDEdeLTY3zRq5Ofl4fmvJk2aqH6nzihSKqQnJ6Hx9kb4+nL69Gn++uuY034oF5dZTjTqDXWBL5zLxo0bh7e3d6UWE7y8vBg+fDhRUVFMeudtuoV1p0pg0Rbhk++pz+d1G5UawFx6IjCId++pj04IO8ieN2vv6e7+opTSf1jkICXeZEZkWEm2WiGoGrpgI9u3b3dufqFp06ZbS3IfRc3ECUCewVLrkFAe6dL5jpH5vLy8iIiIICIiAikl58+fJyoqis+nf5avXapqL9V1U+x2liVcIjYtmQwpaeTpRVZ2NgpS4ymUv4v7bUREhAaUMb6+PpnNqgW5R6elIoVAq2hAq0HTqCE7PvvU6Rfy65uJFkXORKPecA/wrDMX+Nob4+5YIV4IQe3atenc+caXcN7Vi1n7M1JRS3Cdg9Y0hp06yrdXL2KypnMsM4MtiVfZnZZsD9S6HbJj73YTlV5XkLV6hffWxJ84STWrHeHtRYCvL5qAAC5lZREXF3ddS2PXfVXSZyxsJr6Gkx1Mr/Det12ccAU1aNAAX28fUtKuKz9SbDb7a/HHqKbV0dW3CmF+gTzgkf/kJT4rk3UJl1iXdBW704mGEPwkpFyUarWuizlmSr45MyQGgSQ8PFx7dPNWDDodokZ1qly8gPbBELZui3KehT/HHIn5s0wgOkSKPB2aVqtl9OjR3A0khKBaUHVSTl4H0SYwuQsl6Eq2rcGKhMusSLjMvW4e3KPRYROSFLudY5kZBS9lFVIZEGuJ3VDSvkNDQ71APhEQEJBmvP9+792X/6ZrrVooXl4EVK8OTRqxdOwrzsvjwtJpf/LTaMAn90v7Dg+Te751N5C/f0FfUXnxSmpyM62Q05Sc40Lis6z8npHCwfTUQgCUp6Sga+zhkgMIkG21Pgr4hPfto7EfiMVmV/EKDEBmZhL4WDibtm7h0qVLuc0vpmVmLi/N9bVOs1ADjHKuDO/di7uJ/AOqFHiDRfLJkyetwFi9Xr9cqxKBIrqp0BDwdSg5zoA8KITYn27N/OLYsWPJZVgHBgH07d7Dw37IQl3/HI5Z+PqirVmDxYuctz/x+bFjxzLLBCLQHqie+8XDw4NOj3S+q0DMzs7OL3gj8gCxWCz7gf1Oy69o27atx969ezPK06fD57+Hv79/yn0aja/q7k49X18UBJpgA7t27eLUqVN527RGp5lb2j6cQXzcuaJT50fw9PS8q0A8ffJUwaIixQKHAVRG+d8cQlDQPfhQG5vdfATFx5u6nt5oGtRH4+/HIic1mxDMj4mJSSy1+tHp/8fyLaW9et9VANpsNmd1W87Dy+wfKl7BqxoA2gS38rKfyTmtr6Zo0LQJYc+ePVhM5ut8lkYzvUxdOPbDFjg5tWg0Gtq2b3dXgXj27FlUNZ9E+Hds3JF9t6BrI0Bw9RxLTmmzITw9sQdUYep/pjjP/SWHDh06V2YQCy6lDRo0rFSm9a6gn3/+uYDIwRZ5S7yJhMHDwyOjri7HdEWmpKILacn8+fOdjaGsGrvu3TJPdsfffBxMo8aNuNto/dr1BZgaNt8C2VQBmjVs2DBZSb++vZ7z9y7AkcqPYo7EnCoviAbnwjvZ5LAwOmw25zsdALKklBW+HzZv3lwLeNZrUN9d2rLRuHugCw/j/SlTnOPkxPv4+ZXP1MOoN9QG8qn6GzdufFeBuHrt2gK8hlx0KwILWSyWLCC1Xr16fmpiErpe3Vi8cQP7fvvdSR2njCuvGKMtOAsr80yUUpbakyo+Pp6N6/MpWFKlTvPv8txH586dtdcuXWsrheygKLjlbq0qXFMUZW1sbOxZpyU1oWbNmj5u3btz4MgRZs5wPuGTO10RmlML6J0LNBoNQUFBlRLEq5cvU62U9/bxxx8XDPHlI+32pQaD4UutVrutpHKZ0Whs6Ovr29ffz3dgWkpqsBSqDsCZ4RWAtKvTjXrDT1LwutlsjgZ5+eLFi7XPXL2qvDHudWcO+QCK8rRrWKfm+q/Jcb8GwNfbh19//2+lAzA1NZWTx09iaGEo8W/27t3LiyNfKK6JHeReUL5HYYubm9txQJeWlqbVaDQBnu7uHQMCAh5LS0lrl5KWWhVyzioffKgN7dq1o327tgRWrUZGRgaHYg6yfcdOtm2NygUqC+SbUgjvAN8qb2Vn27xSr0cB2a/RacPKItgXBeJPQIfcgmrVqrHrx92VDsSFCxfSr18/qlUrWXTozMxMIp56mpMnT+Yua5RHorjvvvsYMmwo4eHhxVq6//HHH3w85UP2Redo8KTgqJA0yVltUUFscPNwG16cg0xZuNN8NheVUdWWmZnJlu83lxhAKSVvv/12HoBeXl68Nm4s999fOtFJURTatH2ImbNnsXb9Oh5//PGbuio0btyYBYsXMe2z6dSuXVt1AlARUulvspieciWAuXtiPhBzXaoqFXe5ejVBVUu+F86ePZuoLVvzBvWTaZ9Sr149Bg8ezPebN7Hth+0c3BeN0/JWUDSgV3hvevbsWWb+oFu3bnTs2FH55ptvmDnjC6GqUpXCXiHMhjA018cDeW68hhZGlixZUmkAPH78OIOeGcjY18fx9NM35wM2b97MhDffAuDp/hG88cYbhWqf7HY7cZY4/jrxF15eXnh7e+Pt7U2NGjVcfoa6b98+XnvlVTU5OVlRVPnJoTjL6y7twNBcf8XQXC9zP0MiB8vKQikpKbJP7z6yTesHZWpq6k3bb1i3QYYEt5JtW7eRUVu3VMg9ZWdny6SkpFL/Lj4+Xvbu2Us1NNdLQ1NDNyklrvrcsJwmJydXihkopWT8+PGcPn2KJ556slhzyczMTCZPnsyPu3YzZNhQBgwY4FIxKTs7my2bt7Bpwwb2H4hGVVXqN6hHr945gZNKEo+gbt26fDp9mogcOAgQC3HEaHXVcpoF6HILqlevzs7du247iLNmzWLenJzz0WUrlhdprHXh3HkWLf6Kpk2bEh4e7lLFvd1uZ+PGjcyfN5dzZ88X2kaj0TAwchCjRo0qkV3uggULmD1zVvrBQzEuM+LVApeA2pVpJq5cuZL5c+flMRnFWdvVrHUPEydOdGn/qqoStSWKOXPmcPq0s15aHAbpD9RxBvrbr79h29ZtRA6JpFevXtSoUaM4jldVVfVvVzM20UCIc+H+A9G35SjKbrczdepUVizLsRNyd3dnybKlt0wNKKVkxw87mDVrJidOXA8uLATrUZQ3Y2Nj/+jcubM24fLlx1SU/wF5Q7AlIQTBIa1o06YNTz75ZL5l/cqlS/Tp0zc7LS39I/Nhc5nfPKPeEAHMBMxAuBa4IcBcSlIS7rdY9RYfH8+7b/+b/Qei88rGvj7ulgH4467dzJo1iz/++MMZvIOoyiuxlti8w8jdu3dnA6uB1Xq9/l4hRHchZUvAR1E0fVVVrXow+gAHow+wbWsU6zde19suWLSI9PR0rRRyZTkADAW+BdzIidj1bKEgJiQllVpHWR512rx581j63ZJ8Os7OXbswYEDFx4X95ZdfmPXFTA4fPpzvPZaCSU2aNp1VnCm9xWKJBxY2bdq0qlbRDlRVNZ+Jy6WL+VfNixcvSkVREs1mU3kyxX3kADCXHisUxD+OHqnwkMyZmZmsWrWKL+fNdwS7c1I4eHny3nvvVWj/+/btY+aMLzh06FDBBXGNolXGlMZUQqfRTQU5omB5YLX8HscnTxxPVVX1x7JaFBj1hlpApwLF92uBUwUbxxyKpU/fRytk8KxWKytWrGDxoq+4evVqoW2yrJlcvHC+EGPf8jMsu3ft5JtvvyPmwMGC+sdzdsELZrPp+1LvpUL+JCQ3gPjCiyPz/o/aukWeOnnasyTu28VQf240+A7QAr8WbHko5qDLwcvIyMgD79q1azcd7P9MnsL8BV+6hMFKSkhg1Zo1rFy+gosXC48xqyriA7Op9AACmM3mb1sYWgyTUu3ixIWeaxUSWnvdunWsXbvWHhtzSAMiEcG6cjzKM4WU+QgpJUa94TJQzZnD+mXvrzdEGSwrx7ds2TLmzp2b5/hZGOn1euLi4vJZpAUHBzNj5hdlnpF/HD3CkqXL2Pr9lkLzJ9apU5uzZ8/lMjFLYs3myHIwHAtxCg8DZBXYuxKkICznjLFM178fOFZI1cVc4+GfcbJ4k1ISGxvLww8/XC4Az5w5wzvvvMOB/UXfd0BAAONeH0vfR/uxaNEiPpt23fQyJiaGIZGDefXVV2nbvt1NZ+WVK1eIjo7O+ezbn09McCb/gCq8MvoVWoW2op9j25CSsNDQUK/o6Oj00j5nixYtGuN0Jgv8BdgBf5BRUog1Vqt1e2nN8wvQU0WU/10oiLkDWFYQpZQsX76cz6ZNJyOjcPMRT09P+j8zgBEjRuDnl+PP+txzz5GUlMRXC69bRZ88eZLRo0fj6elJ+w4P07Jlyxtczk+cOEH0vv3O5vBFalfsdjsZaekE1QyiQYMG1KtXP1egr55lzXqLnEjJpXteu/1DENo8LZ1q71gBSTQfL6L8XO5yGoqTHwLkBNtbunRpmbjOl19+md/2Fm4d4OvtQ/9BzzBkyBCqVCk86M/8+fOZP3dekdlGS0O+vr706BFGl27d2LJlC5s35oRk0+l0zJozm4y0DBwxvQGsQqM0i42NPVnKpc7m0H6hwIpDFrNLZSOj3lAHiMcpiokTTcp9ew46GuWFvLSYzBw2m2luMJSqww8++KBQAP38/Bg0OJLIyMib7rUjR44kLCyMefPmsXvnLtLTS77C3XPPPeiNBgyGnI9er89bhh9++GHq1KnD3NlzsNlsfDT1I9asW0OHTh35ec9PAB7Sbp9OAZeGm5GC/B8V8b4QXJGKUhFu1QOLABBgd15KBaPe8BbwH+faXuG9+fDDkscpX7FiBZPf/yBfmZeXF0OfHcbgwYPx8fEpk0jy6y8/8+exvzhz5gznzpzFZs/Gy80Dd29PPD09qVevHkaDnuZ6w01P/5MSEujSpWueYuHTT6fRtHlTHu/3WB7zIwSTYs3myVQCMuoNnsAJoGZhuhIg0BnEIOCMM0el0WiI+mFbsQpd5z10+LPP5bmP6XQ6Igb0Z+TIkQQEVK6MruPHj2fr91sAeDC0NQsWL+K7777jo6kfOqvcRsWazXMqAYijyQmMWBh9brKYX8njEEwW8yVgVUGF9PLlJXNanTp1KtnZ2SiKwqOP9WPT95sZP358hQCYlpbG0aNHOXDgAHv27GHPj7s5fvx4iffQdg9ddxY6fSYnBFdkZCTPDneWEMSsNiEhz95mAN2BN4qotgGfwo2BF2YB+dLKrV65ihdeeKFY25szZ85w5HAcQUFBTJ/+WanMCkuqaYmLi2Pv3r3s3buX2JhD2O32vNUitFUIHbs8gsFgwGg03jRgkrMBcqbtOvCvvvoqKSkprF65CimlyMjMWtSpU6fXkpOTx8TExNyOQ9bncDomLEDfmizmMzeAaLKY/2vUG34lx2s4Zw9JSmLjxo1ERBSdFmn79u20Cg1h2rRpBAYGuuwJpJREbYlixhef3XAo2+7h9oT37kXHTo+UWhmQG6w9R+DPn9Fv0qRJpKens2VzjvIm4eo1PbCzU4eOl61W6xmrNeOaYy+KFnbNzgf0D+wvabyZUs7CKsWIOypOSVUKC4HyEhCNI+4ZwPy58+jZs2eePFeQjh8/zuzZs10auN1ms/HKK6/kco15VL9+fd6c8Bbt2pXdf/KnH6/H0qtaNb+SWlEUpk6dyiOPPMKX8+dx6uRp7HY7UsrqWkVT3Ul1/ZhU7B8cjTt6rEXzFq+XNhhDCWg6UFSm8rUmizkvREqhCb+MesMMnALUFsepJicnk5SU5PK8F2+99Rbfb9qcj8t9cdT/EBkZiVZb9iQCFpOJyMjBqKqKEAJvTy9WrVtD7dq1i1wNcpdfVVVZunRpPgbIqeV7Jovl3y6ahT2B4kKChZgs5oPXRZzC6W0KHFFt/X4LUVFRhcp/rgbwxIkTecsZQJUqVVi5ehXDhg0rF4CZmZlMmDghTz8rpSQ1PY3XXnutSLMU5/1z3759rFu7pqid9p2yBrEtAKAvML+YJmudASwSRJPFnATcYBs5+f0PuHI93kqF0ZIlS/JM7rVaLZ9/PoN77723/OvT9OmcOnnaibsTewGOHI4jctBAzsQXniMq5kAMEU9FyJEjnufYn385A3wJxCYgFpBS3HimWAb6GCc74AJ0Gm488iqSjTNZzN8B2/IJyklJTHrnnQoFMDk5mU0bNuZ979Kta6Fp8EpL+/btY9mSpc5y4CcqamdFlTMAeerkaZ4ZMFDu3nmjH8qn0z/l6NEjwum3WxRV0zbWbKphspgeNVnMLVVkB6BbOWdhN2BkMSJFf5PFnFBiEJ3UPfm0ynt/+ZUVK1aU+Uazjx7DunYT1rWbyNocRebOPdiPXY/1umP7D1it1rzvffuEuwTAV18e43SgLubEms0TLBZL1qE4yxgp6ALyVHJyshgzZjQjRozIZ67hFOv8shR0jjWbww/FHfot315rsfyqwR5eDgCbACuLUa+9YbKYfy90Ib+ZpYBRb2gJ7AXyPG08PDz4+ttvaNq0ack4zf0HyP7tANkHTahF7D2a2rXQde/EhB3b2L5zZ54M+Nu+38t1MLxl8xYmTZoos7OzRc4Ds8gUZxlR0ESiSZMmvm5atw8dZhY6gHr16tMqtBVxlsMOAyo5X4WXHR7ArhQnagL/pZC0vA5aZ7KYnyhS7i2JuYdRb4gkx8IqH0Pz5cIFxQJpv3CRjDmLsB8uWYB1Fehz4jApDgG8UaNGrFm3tsyDs2jRIvn59M+cnlF8Yz5sfra4kMyhjR+oZXNzf0lKIovYmxJALBUa8V5sbOwlFwDoA+wBWhXF5wGtHHxK2UF0dPY5OQH8SgSk/dx50iZ+gEwpuWt8bEYqL8VfP7zu2+9RJk8uvR76+PHjTJ48OSN6337P64pi+ZrJYvmyNNcJbhr8QLY2u4uQIghUT0CgKr9p3DU/usJB1Kg3aMlJV1RU1OIsoJ3JYj5Q3HVKw6+PBZo5b97Jyck8P3xEoUCmfzKzVAACrEm4ku97SZfrXEpMTGTGjBnWNatWu0kpcwHcKwVDzGbL8dIOsiPm6J9UHM0tBsBMByNz4GYXKXFUdpPFnE1OoPIdBbnJ54eP4MiRI/mYF7UUCasAzBmp7E7Jz3gFlzB5Snp6OnPnzrV169I1c/XKVR5SSgVIFII3mjRr2rEkUfJvsWJbGPWGD4HhRTRJBXqbLOYSaYFKnaLdqDd4AOspkPTSeWlNn70Q2849pbrui/F/cDjj+uFvrVq1iPph202F9+XLl8s5c+ZkpqemeVwfAPG5Rqf5xFU+8S4G0Bv4BiiKUbkG9DJZzCUOWVbq/Agmi9lKTqr1rYXNyB937UaWMofTxsRr+QAE6N4jrFi96ooVKwgLC7N9+vEnwgGgFeQ0rZuuoclimlRJAawL/FIMgBeAjqUBsEwz0emG3IE1wA2yUfh9jRiteOJ1k1QFKvDl5bN8dy1/ridFUVi1ZnWhVuiHDh5k/Pg35YULF3LlKZuiyoW4aT8oa4C7WwRgW2AdUKMYLrS7yWI+Udpri/JElDDqDW6OpaF/wbqaWjcm1KpHsGfhJhmpqsq7507yW/qNcuPT/SN4++0bT2F+3LWbsWPHqjZHdjXgrIp8whFwlkoM4BCHPrQogfewA8AyWcgJVwQaNOoNLwGfFLxJBXgIg8YpAAAD30lEQVQ6oDojg2rj5lBEnMiy8n3CZbYlXSOpEHEtMDCQDZs23nBGuGfPHka/9LKUUjpmoIiRQvYym81F+vo1aNDAw8fHx99ut3sAxMXFnb7F4GmAKRSih3YW5IERJov5Wln7Ea6KFulIEr0CuK9gnb/Q0MDTi8TsLE5lFW0/6+fnx4JFC2nSpEm+ciklPcN6JF+4cMHv+gsi+x2yWDbeIKyHhuqyrdYnVUQE0AunnMfAJRA/oTDVZDIdqGAAw8nxYGpWlEQEvOzQUZeLXJb4ySHPhJDju5ePkqSdQ+mpxQJYp04d5n05/wYAAXbt2oUzgADZkHLDwBmNnbKsmbEqYhk5xrYFbUqCQD6FKn8zGAzjKgi8YKPesJOcUJxFARgF6F0BYGmF/ZIAmQQ8XfjyWviM9/X1pf8zA3jhhReK1JGeP3++oF8DCmJ9i+YtRkiNNCv2bH9VaCeALIkr1yUQ04Skn16vX2+xWP5yIec5GYikaCV2CjDWZDF/6cpx11bE22iymGca9YZd5JyNFRlMvG7durzwwov07tO72MPexo0bF7Zi+EmhrkQFVWiKeklSHFxfLa5nGgiSUvqZD5s76PV6NxeA5we8BbxSyMzPx5cBz5os5lOuHm9R0RGUjXpDFweYRSl4CQoK4plBA3nqqacKNXrKzMyke9duMYmJiSU4WBS/K6izpUbzu8lk+lNKKSMiIjRH446OAfk+4AUkVK1eLcjhul3W56oNDHWAV72YpknAO8AXJou5QgZb3Iow2I7U7gMdy02R8Vs8PDx4uGMHWrduTevWrfNlIc3IyFjbpnXrZBCDcTLicqIjqGK0Kc60o6jrN2vW7B6d0HWRwt7KZLGMLcNzeDgUHc8C3W/CU1wEPgPmmCzmCg1JcktALKAgGE1Oar+bpjivEhhASEgIoaGhuaB2b9mypVmBAagYhcBbRSRLIaPc3d03RUdH2yrgnhsCXR2fHiW4778c/MBik8WceSvG9ZaC6DQw/uR4vQ4D2pT0d35+fhLYlZycvAn4nZzkJFdd9aY7XBmaOD5tHMCVNPJTDDAVWG2ymNVbOZ63BcQCA9fYAeZgirZ2vhnZgKvAFae/VwqUpZMTAs2bnKRmuZ9AoLHjUxafg93AVJPF/MPtGsPbDqITmAo5Z5VDHTJeZc1xZAV+csh6W00W89HbfUOVBsRC2PauwEOOZS2UAoEEbzEddYC2DdhjspgzKtN4VUoQCwFVAzR3AJoLbFNXapwKEQt25QJnsphPV+bxuSNALAJYX4fsWdOxlxX3CXTM5DSHAiDV8TfFwRwdd3CVxx2fCxUl01UE/R+4oNmVz83aAgAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/doc/logo.svg</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjwhLS0gQ3JlYXRlZCB3aXRoIElua3NjYXBlIChodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy8pIC0tPgoKPHN2ZwogICB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iCiAgIHhtbG5zOmNjPSJodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9ucyMiCiAgIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyIKICAgeG1sbnM6c3ZnPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKICAgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIgogICB4bWxuczpzb2RpcG9kaT0iaHR0cDovL3NvZGlwb2RpLnNvdXJjZWZvcmdlLm5ldC9EVEQvc29kaXBvZGktMC5kdGQiCiAgIHhtbG5zOmlua3NjYXBlPSJodHRwOi8vd3d3Lmlua3NjYXBlLm9yZy9uYW1lc3BhY2VzL2lua3NjYXBlIgogICBpZD0ic3ZnMiIKICAgdmVyc2lvbj0iMS4xIgogICBpbmtzY2FwZTp2ZXJzaW9uPSIwLjQ4LjQgcjk5MzkiCiAgIHdpZHRoPSI2NDAiCiAgIGhlaWdodD0iNjQwIgogICB4bWw6c3BhY2U9InByZXNlcnZlIgogICBzb2RpcG9kaTpkb2NuYW1lPSJsb2dvLnN2ZyIKICAgaW5rc2NhcGU6ZXhwb3J0LWZpbGVuYW1lPSIvaG9tZS9tYXJpam4vc3JjL2pzL2NvZGVtaXJyb3IvZG9jL2xvZ28ucG5nIgogICBpbmtzY2FwZTpleHBvcnQteGRwaT0iMTYuNjAxMzMyIgogICBpbmtzY2FwZTpleHBvcnQteWRwaT0iMTYuNjAxMzMyIj48bWV0YWRhdGEKICAgICBpZD0ibWV0YWRhdGE4Ij48cmRmOlJERj48Y2M6V29yawogICAgICAgICByZGY6YWJvdXQ9IiI+PGRjOmZvcm1hdD5pbWFnZS9zdmcreG1sPC9kYzpmb3JtYXQ+PGRjOnR5cGUKICAgICAgICAgICByZGY6cmVzb3VyY2U9Imh0dHA6Ly9wdXJsLm9yZy9kYy9kY21pdHlwZS9TdGlsbEltYWdlIiAvPjxkYzp0aXRsZT48L2RjOnRpdGxlPjwvY2M6V29yaz48L3JkZjpSREY+PC9tZXRhZGF0YT48ZGVmcwogICAgIGlkPSJkZWZzNiI+PGNsaXBQYXRoCiAgICAgICBjbGlwUGF0aFVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgIGlkPSJjbGlwUGF0aDE2Ij48cGF0aAogICAgICAgICBkPSJNIDAsNTEyIDUxMiw1MTIgNTEyLDAgMCwwIDAsNTEyIHoiCiAgICAgICAgIGlkPSJwYXRoMTgiIC8+PC9jbGlwUGF0aD48Y2xpcFBhdGgKICAgICAgIGNsaXBQYXRoVW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgaWQ9ImNsaXBQYXRoNDAiPjxwYXRoCiAgICAgICAgIGQ9Im0gNDM1LjYwNywzNjkuODk5IDMxLjI0MiwwIDAsLTY0Ljc4MiAtMzEuMjQyLDAgMCw2NC43ODIgeiIKICAgICAgICAgaWQ9InBhdGg0MiIgLz48L2NsaXBQYXRoPjxjbGlwUGF0aAogICAgICAgY2xpcFBhdGhVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgICBpZD0iY2xpcFBhdGg1NiI+PHBhdGgKICAgICAgICAgZD0ibSA0MjEuNzk2LDM0OS40NzcgMzkuMDc0LDAgMCwtODguNDIzIC0zOS4wNzQsMCAwLDg4LjQyMyB6IgogICAgICAgICBpZD0icGF0aDU4IiAvPjwvY2xpcFBhdGg+PC9kZWZzPjxzb2RpcG9kaTpuYW1lZHZpZXcKICAgICBwYWdlY29sb3I9IiNmZmZmZmYiCiAgICAgYm9yZGVyY29sb3I9IiM2NjY2NjYiCiAgICAgYm9yZGVyb3BhY2l0eT0iMSIKICAgICBvYmplY3R0b2xlcmFuY2U9IjEwIgogICAgIGdyaWR0b2xlcmFuY2U9IjEwIgogICAgIGd1aWRldG9sZXJhbmNlPSIxMCIKICAgICBpbmtzY2FwZTpwYWdlb3BhY2l0eT0iMCIKICAgICBpbmtzY2FwZTpwYWdlc2hhZG93PSIyIgogICAgIGlua3NjYXBlOndpbmRvdy13aWR0aD0iMTYwMCIKICAgICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSI4NzUiCiAgICAgaWQ9Im5hbWVkdmlldzQiCiAgICAgc2hvd2dyaWQ9ImZhbHNlIgogICAgIHNob3dndWlkZXM9InRydWUiCiAgICAgaW5rc2NhcGU6Z3VpZGUtYmJveD0idHJ1ZSIKICAgICBpbmtzY2FwZTp6b29tPSIwLjUyMTQ5MTI1IgogICAgIGlua3NjYXBlOmN4PSIzMDMuNTcyIgogICAgIGlua3NjYXBlOmN5PSI1NzQuNDgwMTIiCiAgICAgaW5rc2NhcGU6d2luZG93LXg9IjAiCiAgICAgaW5rc2NhcGU6d2luZG93LXk9IjI1IgogICAgIGlua3NjYXBlOndpbmRvdy1tYXhpbWl6ZWQ9IjAiCiAgICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0iZzEwIiAvPjxnCiAgICAgaWQ9ImcxMCIKICAgICBpbmtzY2FwZTpncm91cG1vZGU9ImxheWVyIgogICAgIGlua3NjYXBlOmxhYmVsPSIyMDE0LTEwX2NvZGVNaXJyb3JfbG9nb192ZWN0b3JzIgogICAgIHRyYW5zZm9ybT0ibWF0cml4KDEuMjUsMCwwLC0xLjI1LDAsNjQwKSI+PHBhdGgKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBpZD0icGF0aDIyIgogICAgICAgc3R5bGU9ImZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIKICAgICAgIGQ9Im0gMjMzLjk3OTc2LDQ2OS4zNzQzOCBjIDAsMCA3LjAxMzUzLC0xNC45NDg0OCAtMi45NDkxNiwtMzEuNDIzNzMgLTQuOTc5MjUsLTguMjM0MTcgLTEzMC41MDg0NywtMzQuOTQ5MTUgLTE3OS41MDg0NywtMTAyLjk0OTE1IC0zMCwtNDcgLTc2LC0xODMgNzEsLTI3MyA2NiwtMzQgOTQsLTMzIDk0LC0zMyAwLDAgLTQ0LDMxIC0xNiw1MiAyOCwyMSA2OSwzMSA4MCw2MCAxMywtMTAgMzQsLTMxIDU0LC0yOSAtMiwxMyAtNywxOCA5LDIwIDE2LDIgMjQsMiAyNCwyIDAsMCAtMTUsMTIgLTMyLDEzIC0xNywxIC00OSwzNCAtNDgsNDggMjEsMTIgNDgsMzIgNjQsMjYgMTYsLTYgMzIsLTE2IDM1LC0yNSAwLC02IC0zLC0xNiAxMCwtOCAxMyw4IDEwLDEzIDE1LDI0IDUsMTEgNiwxMyAtNSwyMiAtMTEsOSAtMzcsMzAgLTU4LDI0IC0yMSwtNiAtNjUsLTIzIC04NywtMiA5LDIwIDIzLDUyIDE2LDc0IDEzLDEwIDI4LDIxIDMwLDM5IDE1LDIgNDcsMTEgNDEsMjcgLTYsMTYgLTQ4LjU5MzIyLDg3LjE2OTQ5IC0xMTMuNTkzMjIsNzMuMTY5NDkiCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNzY2Njc2Njc2NzY3Njc3Nzc2NjY3NjIiAvPjxwYXRoCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgaWQ9InBhdGgyNiIKICAgICAgIHN0eWxlPSJmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiCiAgICAgICBkPSJtIDQ0MS41MjIxMywzMDYuMDAxNSBjIDExLDI5IDI5LDc4IDEyLDgwIC0xNywyIC0zNiwtNDQgLTQxLC01NiAtNSwtMTIgLTI1LC03MiAtMTQsLTgwIDExLC04IDQzLDU2IDQzLDU2IiAvPjxwYXRoCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgaWQ9InBhdGgzMCIKICAgICAgIHN0eWxlPSJmaWxsOiNkYTY4N2Q7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiCiAgICAgICBkPSJtIDM0OC41MjIxMywzODQuMDAxNSBjIDMuMTMsNC45MTkgNS44MjA4NiwwLjY0NTA4IC03LjY3OTE0LC0wLjM1NDkyIC0xMy41LC0xIC0yOS42MjE5NiwtNS4xODQ2MSAtMzIuMzg4OTksLTExLjA0ODM2IC01LjE5MTc0LC0xMS4wMDIwOCAtNi45MzE4NywtMzguMDk2NzIgLTI2LjQzMTg3LC00NC4wOTY3MiAtMSwtNyAwLC0yMyAyNy41LC0yNiAyNy41LC0zIDI4LjUsMTUgNDQuNSwxNC41IDE2LC0wLjUgMTQuNSw1LjUgOSwxMCAtNS41LDQuNSAtMjQuNSwzNSAtMjQuNSw0NSAwLDEwIDYuNSw2LjUgMTAsMTIiCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNzc2Nzc3NzYyIgLz48cGF0aAogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGlkPSJwYXRoMzQiCiAgICAgICBzdHlsZT0iZmlsbDojZGE2ODdkO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgZD0ibSAxMDMuMDIyMTMsODIuNTAyIGMgMCwwIC04LjUsMjIuNSAxNi41LDM0LjUgMjUsMTIgNDcuNSwyLjUgNTIsLTYgNC41LC04LjUgLTcuNSwtNDIuNSAtNTAuNSwtNDMgLTEwLjUsOC41IC0xOCwxNC41IC0xOCwxNC41IiAvPjxnCiAgICAgICBpZD0iZzM4IgogICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTIxLjQ3Njg3LDApIiAvPjxnCiAgICAgICBpZD0iZzQ0IgogICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoLTIxLjQ3Njg3LDApIj48ZwogICAgICAgICBzdHlsZT0ib3BhY2l0eTowLjY5OTk5NzAxIgogICAgICAgICBpZD0iZzQ2IgogICAgICAgICBjbGlwLXBhdGg9InVybCgjY2xpcFBhdGg0MCkiPjxnCiAgICAgICAgICAgaWQ9Imc0OCIKICAgICAgICAgICB0cmFuc2Zvcm09InRyYW5zbGF0ZSg0NjYuMjU4MywzNjkuODM4NCkiPjxwYXRoCiAgICAgICAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgICAgICAgaWQ9InBhdGg1MCIKICAgICAgICAgICAgIHN0eWxlPSJmaWxsOiNkYTY4N2Q7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOmV2ZW5vZGQ7c3Ryb2tlOm5vbmUiCiAgICAgICAgICAgICBkPSJNIDAsMCBDIDAuNDIzLC0xLjU2OSAwLjI5OCwtMy4xOTkgMC4yNTUsLTQuODM4IDAuMjEzLC02LjQ1MiAwLjA2MiwtOC4xNSAtMC4zNDksLTkuODAxIGMgMC4xMDYsLTAuMzc3IC0wLjA4MiwtMC44MTQgLTAuMDE4LC0xLjIwMSAtMC40MSwtMC41MTUgLTAuMTk0LC0wLjkwMyAtMC4yODQsLTEuMzU0IDAuNjYxLC0wLjY3NCAxLjUyMiwtMS4zMTMgMS4xNTIsLTIuMTYyIC0wLjI1OSwtMC41OTYgLTAuODc0LC0wLjcwNiAtMS40NjQsLTAuOTk1IC0wLjM4OSwtMS40MDMgLTAuNzA5LC0zLjA5OSAtMS4wMjgsLTQuNjQ5IC0wLjA5NywtMC40NzYgLTAuMDQ0LC0xLjA1MSAtMC4xODcsLTEuNDg1IC0wLjMzNCwtMS4wMSAtMC42OTEsLTEuOTc4IC0wLjk3MSwtMy4wOSAtMC4yMzcsLTAuOTQ1IDAuMDM0LC0yLjY4OSAtMS4wNjMsLTIuODExIC0wLjQyMywtMS4wNDkgLTAuNjYzLC0xLjg0MSAtMS4xNjUsLTIuODMgLTAuMjg2LC0wLjE2MyAtMC40NTIsMC4xMDYgLTAuNjkyLDAuMDA5IC0wLjMwNSwtMC4zNDggLTAuMjk0LC0wLjgyMyAtMC41NzcsLTEuMTE0IC0wLjIyMiwtMC4yMjkgLTAuNTAzLC0wLjE2MyAtMC42NjUsLTAuMzg1IC0wLjM2MywtMC41IC0wLjI2NiwtMS4yNCAtMC41MjMsLTEuOTAyIC0wLjQ2OCwtMC40IC0wLjg2MiwtMC45MDUgLTEuMTQ3LC0xLjQ3OCAtMC41ODgsLTEuMTc5IC0wLjY5OCwtMi42ODEgLTEuNTkxLC0zLjU5MyAtMC4yOCwtMC4yODYgLTAuNzYxLC0wLjM2NSAtMS4wMTEsLTAuNjQ3IC0wLjIzOCwtMC4yNjkgLTAuNDU1LC0wLjY2NSAtMC42ODksLTAuOTggLTAuMzM4LC0wLjQ1MiAtMC42NjksLTEuMDQ1IC0wLjk3MiwtMS41ODMgLTEuMDA0LC0xLjc4NyAtMi4zODMsLTMuNzEgLTMuMzAxLC01LjY2NCAtMC4xNzMsLTAuMzY5IC0wLjE5OSwtMC44MDUgLTAuMzY0LC0xLjE2NSAtMC4zODEsLTAuODI3IC0wLjk0MywtMS41NzkgLTEuMjU3LC0yLjMzMyAtMC41MTYsLTEuMjM5IC0xLjMxLC0zLjMzOSAtMi41MzgsLTQuNDIgLTAuMTQ5LC0wLjEzMSAtMC40NzMsLTAuMjU0IC0wLjYwNiwtMC40MTQgLTAuMTc5LC0wLjIxNSAtMC4xMzYsLTAuNTY4IC0wLjMyLC0wLjgwOCAtMC4wODYsLTAuMTEzIC0wLjQsLTAuMTY0IC0wLjUzNywtMC4zMDIgLTAuMjA4LC0wLjIxMSAtMC4zMDYsLTAuNDgxIC0wLjQ3OSwtMC42MzkgLTAuNDI2LC0wLjM4OCAtMS4wMTUsLTAuNTU1IC0xLjM4MSwtMC45NTkgLTAuMjc3LC0wLjMwNiAtMC4zOTcsLTAuNzQzIC0wLjY5MiwtMS4xMjcgLTAuMzE4LC0wLjQxMyAtMC43NjEsLTAuNzg0IC0xLjA5LC0xLjIwMiAtMC45OTQsLTEuMjY0IC0xLjM4LC0yLjggLTIuNzAyLC0zLjM5NiAtMC4zOTMsLTAuMTc4IC0wLjg4LC0wLjEyIC0xLjI5MSwtMC4yNDEgLTAuMzc0LDAuMzQ0IC0wLjA3OCwwLjgxOCAtMC4xNjMsMS4xNjQgLTAuMDU1LDAuMjIyIC0wLjI4NSwwLjM4MiAtMC4zNDYsMC41ODMgLTAuMTQzLDAuNDc0IC0wLjM0NywxLjMzNiAtMC4zNCwxLjg3OCAwLjAwNywwLjUzOCAwLjMwNSwwLjk3MSAwLjM3NSwxLjYxMiAwLjA2MSwwLjU0OSAtMC4xMzcsMS4yNDYgLTAuMTc3LDEuODU2IC0wLjAyMSwwLjMwNiAwLjA2NCwwLjYyNCAwLjA1OSwwLjk1NiAtMC4wMDgsMC41MzMgLTAuMDY2LDAuODAxIDAuMDA4LDEuNDQyIDAuMDg2LDAuNzQzIC0wLjA3NCwxLjQ2MiAtMC4xNzEsMi4xNTIgMC4zNDIsMS43MDUgMC41MzEsMy4wMDggMS4wOSw0LjkxOSAwLjI1OCwwLjg4MSAwLjcyMSwyLjM2NyAxLjE4LDMuMzQ2IDAuODg2LDEuODk1IDEuNjQsMy45NjQgMi42LDUuOTQ1IDAuMzE5LDAuNjU2IDAuODI1LDEuMTk2IDEuMTM5LDEuODUyIDAuMTgyLDAuMzgxIDAuMjExLDAuODI4IDAuMzk1LDEuMjE1IDEuNjE3LDMuMzk4IDMuODc3LDYuMjMzIDUuNTY1LDkuNzMxIDEuMzk5LDIuODU5IDIuODgsNS40MTggNC43NDUsOC41NDUgMC44NDIsMS40MTUgMS41NjgsMi45MTcgMi40MzQsNC4wODYgMC42NiwwLjg5MSAxLjYzMiwyLjQxMyAyLjMzNCwzLjkxNiAwLjI3OCwwLjU5NiAwLjI2OSwxLjA3MyAxLjAwNSwxLjEwMiAwLjc1OCwwLjk0OCAxLjMyNiwyLjAxOCAyLjExOSwyLjgyNCAwLjIsMC4yMDIgMC41MSwwLjMwMyAwLjczMywwLjQ5OCAwLjI2LDAuMjI4IDAuMzgzLDAuNTcgMC42MzgsMC43NzggMC41NDEsMC40NDEgMS40MzIsMC44MzIgMi4wMzUsMS42NTkgMC4xNiwwLjIyIDAuMjI5LDAuNDUxIDAuNDA2LDAuNjgyIDAuNDE0LDAuNTM5IDEuMTkxLDEuODY2IDEuODEsMi4wMTMgQyAtMC4yNDEsMC4wODUgLTAuMTI2LDAuMDYxIDAsMCIgLz48L2c+PC9nPjwvZz48ZwogICAgICAgaWQ9Imc1NCIKICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMS40NzY4NywwKSIgLz48ZwogICAgICAgaWQ9Imc2MCIKICAgICAgIHRyYW5zZm9ybT0idHJhbnNsYXRlKC0yMS40NzY4NywwKSI+PGcKICAgICAgICAgc3R5bGU9Im9wYWNpdHk6MC42OTk5OTcwMSIKICAgICAgICAgaWQ9Imc2MiIKICAgICAgICAgY2xpcC1wYXRoPSJ1cmwoI2NsaXBQYXRoNTYpIj48ZwogICAgICAgICAgIGlkPSJnNjQiCiAgICAgICAgICAgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoNDU5Ljg5NjUsMzQ5LjQ0ODcpIj48cGF0aAogICAgICAgICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgICAgICAgIGlkPSJwYXRoNjYiCiAgICAgICAgICAgICBzdHlsZT0iZmlsbDojZGE2ODdkO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpldmVub2RkO3N0cm9rZTpub25lIgogICAgICAgICAgICAgZD0ibSAwLDAgYyAwLjY4OCwtMS45MzYgMC43NjUsLTQuMTA2IDAuOTM1LC02LjI2NiAtMC4wMTksLTIuMTQgLTAuMTY4LC00LjU3OSAtMC43MTUsLTYuOTQzIDAuMDk4LC0wLjQ5MiAtMC4xNTUsLTEuMTA4IC0wLjEwOSwtMS42MjMgLTAuNTE5LC0wLjc1MiAtMC4yOTUsLTEuMjUgLTAuNDM4LC0xLjg3NiAwLjcxOCwtMC44MzUgMS42NjYsLTEuNjA5IDEuMTU1LC0yLjgzNiAtMC4zNywtMC44NDYgLTEuMTE4LC0xLjAzNyAtMS44NDUsLTEuNDc5IC0wLjY0LC0xLjkwNSAtMS4yMjYsLTQuMjYzIC0xLjg0NiwtNi4zMDUgLTAuMTg3LC0wLjYzNSAtMC4yMTIsLTEuMzk1IC0wLjQ0NywtMS45NzcgLTAuNTQ3LC0xLjM2MiAtMS4xMTEsLTIuNjU2IC0xLjU5NywtNC4xMDEgLTAuNDE2LC0xLjIzOCAtMC4zNTYsLTMuNDk4IC0xLjY1MiwtMy42ODkgLTAuNjEsLTEuMzU1IC0wLjk3OCwtMi4zNzMgLTEuNjc0LC0zLjY1MSAtMC4zNSwtMC4yMTcgLTAuNTEyLDAuMTE5IC0wLjgwMSwtMC4wMTMgLTAuMzkyLC0wLjQ1NiAtMC40NDIsLTEuMDYzIC0wLjc5NSwtMS40NDUgLTAuMjY5LC0wLjI5OCAtMC41ODUsLTAuMjI2IC0wLjc4NSwtMC41MTQgLTAuNDQ5LC0wLjY1MSAtMC4zODYsLTEuNTggLTAuNzIzLC0yLjQyNSAtMC4yODIsLTAuMjY2IC0wLjU0NiwtMC41NjQgLTAuNzg0LC0wLjg4OCAtMC4xMTksLTAuMTYyIC0wLjIzMywtMC4zMyAtMC4zMzcsLTAuNTA1IGwgLTAuMTUzLC0wLjI2NiAtMC4wNzIsLTAuMTM2IC0wLjAzNCwtMC4wNjkgLTAuMDAzLC0wLjAwNCAwLC0xMGUtNCBjIDAuMDk5LDAuMjM4IDAuMDI4LDAuMDY2IDAuMDUsMC4xMTkgbCAtMTBlLTQsLTAuMDAyIC0wLjAwMSwtMTBlLTQgLTAuMDA0LC0wLjAxIC0wLjAwOCwtMC4wMTkgLTAuMDE2LC0wLjAzNyBjIC0wLjY5NywtMS42MzUgLTAuODUxLC0zLjYzIC0xLjg5NSwtNC45NTUgLTAuMzM1LC0wLjQyMSAtMC44NzIsLTAuNTc3IC0xLjE0MiwtMC45NzEgLTAuMjU5LC0wLjM3NSAtMC40OTEsLTAuOTEyIC0wLjc0NiwtMS4zNDcgLTAuMzY2LC0wLjYyNSAtMC43MjIsLTEuNDMyIC0xLjA0NiwtMi4xNjQgLTEuMDg1LC0yLjQ1NiAtMi41NzEsLTUuMjc0IC0zLjU3MiwtOC4wMyAtMC4xODgsLTAuNTIzIC0wLjIwNSwtMS4xMDYgLTAuMzg1LC0xLjYxNyAtMC40MjIsLTEuMTczIC0xLjAyMiwtMi4yNzMgLTEuMzk0LC0zLjM0MiAtMC42MjYsLTEuNzUzIC0xLjQ3NCwtNC43MjcgLTMuMDEsLTYuMzc3IC0wLjE4MiwtMC4yIC0wLjU2NywtMC40MTUgLTAuNzMyLC0wLjY1IC0wLjIyLC0wLjMxNSAtMC4xOTEsLTAuNzg2IC0wLjQyLC0xLjEzNyAtMC4xMDYsLTAuMTY0IC0wLjQ3NSwtMC4yNzUgLTAuNjQyLC0wLjQ4IC0wLjI1NCwtMC4zMTMgLTAuMzgzLC0wLjY5IC0wLjU5NCwtMC45MjYgLTAuNTAzLC0wLjU4MSAtMS4yMywtMC44NjUgLTEuNzE0LC0xLjQzOCAtMC4zNjUsLTAuNDM1IC0wLjU2MiwtMS4wMjkgLTAuOTU4LC0xLjU2OCAtMC40MjYsLTAuNTc4IC0wLjk5MSwtMS4xMDQgLTEuNDI4LC0xLjY4MyAtMC42NSwtMC45MjggLTEuMjUxLC0xLjc4NiAtMS44MjgsLTIuNjA4IC0wLjU5MiwtMC44MTMgLTEuMjE1LC0xLjUxNCAtMi4wNDcsLTEuODg0IC0wLjQ5NSwtMC4yMTkgLTEuMDQyLC0wLjEyIC0xLjUzOSwtMC4yNTYgLTAuMzUzLDAuNDczIDAuMDg2LDEuMDcxIDAuMDYxLDEuNTI0IC0wLjAxOCwwLjI4OCAtMC4yNSwwLjUwNCAtMC4yOCwwLjc2NiAtMC4wNywwLjYxNSAtMC4xNDEsMS43MTIgLTAuMDM1LDIuMzg3IDAuMDk5LDAuNjc2IDAuNTQ4LDEuMTkxIDAuNzEyLDIuMDA1IDAuMTI1LDAuNzA4IC0wLjAzNCwxLjU5MSAtMC4wMjUsMi4zNTkgMC4wMDQsMC4zODcgMC4xMywwLjc5MSAwLjE1MywxLjIwNiAwLjAzOCwwLjY2OCAtMC4wMDgsMC45OTkgMC4xMywxLjc5NSAwLjE2MywwLjkyMiAtMC4wMzQsMS44NTQgLTAuMTIxLDIuNzA5IDAuNDI2LDIuMTkxIDAuNjg2LDMuODA2IDEuMjY1LDYuMzYyIDAuMjczLDEuMTc2IDAuNzg2LDMuMTA0IDEuMjY1LDQuNDg4IDAuNDcyLDEuMzE1IDAuOTA0LDIuNjgxIDEuMzQ3LDQuMDYzIDAuNDQ1LDEuNCAwLjkwNiwyLjg0MSAxLjQyNCw0LjI0OSAwLjM0NywwLjkzOSAwLjg5NiwxLjczNCAxLjI3NCwyLjcyOCAwLjIxMywwLjU2NSAwLjI0OSwxLjE5MiAwLjQ2NSwxLjc2NyAwLjQ3NSwxLjI1IDAuOTksMi41MTQgMS41NDEsMy42NTYgMC41NTMsMS4xMjMgMS4xMywyLjIyOCAxLjcxMSwzLjMzNiBsIDAuOTM4LDEuODA3IGMgMC4zMjYsMC41OCAwLjY1MywxLjE2MSAwLjk4MSwxLjc0NSAwLjY0OSwxLjE3MiAxLjI4MywyLjM2NyAxLjg4NiwzLjYwOSAxLjAyNywxLjk2NiAyLjA3MywzLjgyOCAzLjE4OCw1LjcyNSAxLjExNiwxLjg0NCAyLjMyNCwzLjc1NyAzLjYyOSw1LjgxNyAxLjE1OCwxLjg1MyAyLjI0OCwzLjgyNSAzLjM1Nyw1LjM1NSAwLjgyNywxLjE2NyAyLjE3MywzLjE2MyAzLjA0Miw1LjEyNiAwLjM0MiwwLjc4IDAuMzQ5LDEuMzggMS4xOTcsMS40ODIgMC45MDcsMS4yNzQgMS42NDksMi42OTcgMi40NTIsMy43NzMgMC4yMTQsMC4yNzYgMC41NjMsMC40NDUgMC44MDgsMC43MjIgMC4yODYsMC4zMjMgMC40MDgsMC43NjIgMC42OTMsMS4wNjUgMC41ODIsMC42NTMgMS42NzIsMS4yNzcgMi4yMSwyLjU2OSAwLjE1MSwwLjMzMiAwLjE5OCwwLjY1MyAwLjM2OCwxLjAwNiAwLjM5NywwLjgyMiAxLjA5OCwyLjc3OSAxLjc4LDMuMTQ1IEMgLTAuMjg0LDAuMDQ0IC0wLjE1MSwwLjA0NCAwLDAiIC8+PC9nPjwvZz48L2c+PHBhdGgKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBpZD0icGF0aDcwIgogICAgICAgc3R5bGU9ImZpbGw6I2ZmZmZmZjtmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIKICAgICAgIGQ9Im0gNDE2LjY4ODYzLDMyNy4wMDE1IGMgMCwwIC04LC0zMC42NjcgLTQuNjY3LC01NiAwLjY2Nyw4IDQuNjY3LDU2IDQuNjY3LDU2IiAvPjxwYXRoCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgaWQ9InBhdGg3NCIKICAgICAgIHN0eWxlPSJmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiCiAgICAgICBkPSJtIDQyNi4xODkxMywzNDcuNzI1NiBjIC0wLjYxLDIuMTQ3IC00LjU5NywtNTkuNDc4IC0zLjQzMiwtNjEuNjM2IDEuMTY2LC0yLjE1OSA3LjE0Nyw0OC41NzUgMy40MzIsNjEuNjM2IiAvPjxwYXRoCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgaWQ9InBhdGg3OCIKICAgICAgIHN0eWxlPSJmaWxsOiMyZDJiMmM7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiCiAgICAgICBkPSJtIDIzNS4yNDkxMyw0NjUuNjAzNjkgYyAwLDAgNC42NjcsLTI2LjYxOTggLTM4LjY2NywtNDAuNjE5OCAtNDMuMzMzLC0xNCAtMTAzLjA2MDUsLTI1Ljk4MjM5IC0xNDcuMDYwNSwtNzguNjQ5MzkgLTQ0LjAwMDAwMDQsLTUyLjY2NiAtNTIuMDAwMDAwNCwtMTM5Ljk5OSAtMjIsLTE5Ny4zMzMgMzAsLTU3LjMzMyAxMDMuMzMzLC0xMjguNjY3IDIzNS4zMzMsLTEyOC42NjcgMTMyLDAgMjM2Ljg1MzEyLDEwMS41MDU4MiAyMzYuODUzMTIsMTcxLjUwNTgyIDAsMzYuNjY3IC0yMC4xNDY5LDI4LjQ5MTggLTI3LjExNDMzLC01LjkwODI4IEMgNDY2LjMwNDY4LDE1NC44ODI4NiA0MDguMTg4NjMsMzkuMDAxNSAyNjIuMTg4NjMsMzkuMDAxNSBjIC0xNDYsMCAtMjIwLjY2Nyw4OC42NjcgLTIzMCwxNjQuNjY3IC05LjMzNCw3NiAxMS44OTg5NjksMTQxLjQ2OTI1IDg4LjU2NTk3LDE4MC44MDIyNSA3Ni42NjcsMzkuMzM0IDEyNS4zMjAzOSwyMy42NjQzNSAxMTQuNjUzMzksODAuOTk3MzUiCiAgICAgICBzb2RpcG9kaTpub2RldHlwZXM9ImNzc3Nzc3NzY3NjIiAvPjxwYXRoCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgaWQ9InBhdGg4MiIKICAgICAgIHN0eWxlPSJmaWxsOiMyZDJiMmM7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiCiAgICAgICBkPSJtIDE5OC44NTcxMywyNjAuMzM1IGMgMCwwIC04LjY2NywtNDAuMDAxIC01MC42NjcsLTU5LjMzMyAtNDIsLTE5LjMzNCAtNjAsLTMwIC02NiwtNjMuMzM0IDE2LDI2LjY2NiA2Mi42NjcsMzIgODguNjY3LDU4IDI2LDI2IDI4LDY0LjY2NyAyOCw2NC42NjciIC8+PHBhdGgKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBpZD0icGF0aDg2IgogICAgICAgc3R5bGU9ImZpbGw6IzJkMmIyYztmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIKICAgICAgIGQ9Im0gMjEwLjE5MDEzLDM1My4wMDE1IGMgMCwwIDM2LC00Ni42NjcgNzguNjY3LC0yNCA0Mi42NjYsMjIuNjY3IDIwLjY2Nyw3NS4zMzMgMjAsNzguNjY3IC0wLjY2NywzLjMzMyA0LjY2NiwtNTguNjY3IC0yNy4zMzQsLTY5LjMzNCAtMzIsLTEwLjY2NiAtNzEuMzMzLDE0LjY2NyAtNzEuMzMzLDE0LjY2NyIgLz48cGF0aAogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGlkPSJwYXRoOTAiCiAgICAgICBzdHlsZT0iZmlsbDojMmQyYjJjO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgZD0ibSAxMTYuMTg5MTMsNzQuMzM1OSBjIDAsMCAyMi42NjYsLTEuMzM0IDM5LjMzMywxNy4zMzIgMTYuNjY3LDE4LjY2OCA3LjMzNCw0OCAzNC42NjcsNTguNjY4IDI3LjMzMywxMC42NjYgNDYsNCA0Niw0IDAsMCAtNDguNjY3LC02LjY2OCAtNTIuNjY3LC0zNC42NjggLTQsLTI4IC0xMC42NjYsLTQwLjY2NiAtMjEuMzMzLC00OS4zMzIgLTEwLjY2NywtOC42NjggLTI0LjY2NywtMTAgLTI0LjY2NywtMTAgbCAtMjEuMzMzLDE0IHoiIC8+PHBhdGgKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBpZD0icGF0aDk0IgogICAgICAgc3R5bGU9ImZpbGw6IzJkMmIyYztmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIKICAgICAgIGQ9Im0gMjE5LjAyMjEzLDIxOS41MDIgYyAwLDAgNDAuNTIzLDYuNzgzIDU5LDQ4IDE1LjE2NywzMy44MzMgNSw2MyA1LDYzIGwgLTIwLjUsLTMgYyAwLDAgOC41LC0yNC41IDIsLTQ2LjUgLTYuNSwtMjIgLTIxLjUsLTQ3LjUgLTQ1LjUsLTYxLjUiIC8+PHBhdGgKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBpZD0icGF0aDk4IgogICAgICAgc3R5bGU9ImZpbGw6IzJkMmIyYztmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIKICAgICAgIGQ9Im0gNDM3LjEzMzAzLDMxMy4xNjIxIGMgLTE0LjQ2MSwtMzYuMTMgLTM1Ljc3MywtNjIuMDY4IC0zOC4yNjUsLTYwLjY3NCAtNC40OTQsMi41MTMgLTAuMzU4LDM0LjAzNiAxNC4xMDQsNzAuMTY2IDE0LjQ2LDM2LjEzIDMyLjQzMiw2My42MzUgMzkuMTA0LDYxLjAxNCA2LjY3MiwtMi42MjEgLTAuNDgzLC0zNC4zNzYgLTE0Ljk0MywtNzAuNTA2IG0gMjAuOTk5LDcyLjUwNiBjIC0xNi40NDIsOC45MzQgLTM2LjY0NCwtMjQuNDQ5IC01My4yNzYsLTYzLjMzNCAtMTYuNjMzLC0zOC44ODUgLTE4LjU0MiwtNzAuMjI5IC01Ljc1OSwtNzUuODM2IDE3LjA5MiwtNy40OTYgMzMuMTI3LDIyLjI4NSA0OS43NTksNjEuMTcgMTYuNjMyLDM4Ljg4NSAyNCw3MCA5LjI3Niw3OCIgLz48cGF0aAogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGlkPSJwYXRoMTAyIgogICAgICAgc3R5bGU9ImZpbGw6IzJkMmIyYztmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIKICAgICAgIGQ9Im0gMTU5LjUyMTYzLDE4OS42NjggYyAwLDAgMTAuMzMxLC0zMS4wMzcgNjIsLTI0LjY2NiA0OC42NjcsNiA2OS41OSwyNC43NDQgOTkuMzMzLDQzLjMzNCAyMS4zMzQsMTMuMzMyIDIwLDcuMzMyIDIyLjY2Nyw2LjY2NiAyLjY2NywtMC42NjYgMTQuNjY3LC04IDI3LjMzMywtNi42NjYgMC42NjcsLTYuNjY4IC01Ljk5OSwtMS4zMzQgLTguNjY2LC03LjMzNCAtMS4zMzMsLTQgMTAuMTIsLTIyLjgyNCAyNi42NjYsLTIwIDI3LjMzNCw0LjY2NiAxOS42NjcsMTYgMjUuMDAxLDI4LjY2NiA1LjMzMywxMi42NjYgOSwxOS4zMzQgLTE3LjY2NywzNy4zMzQgLTIwLjY2NywxOC42NjYgLTMyLDEzLjk5OSAtNDIsMTMuOTk5IC0xMCwwIC0zNiwtMTMuOTk5IC01NCwtMTAuNjY2IC0xOCwzLjMzMyAtMjkuMzM0LDEwIC0yOS4zMzQsMTAgbCAtMTEuOTk5LC0xMy4zMzMgYyAwLDAgMjEuOTk5LC0xNi42NjYgNDcuMzMzLC0xMC42NjYgMjUuMzMzLDYgNDQuMDAxLDI1LjMzMiA2Ni4wMDEsMTUuMzMyIDIyLC0xMCAyNi4yODIsLTE2LjcwMSAzMi45OTksLTIxLjY2NiA3LjY2NywtNS42NjggOC4zMzMsLTExLjY2NiAzLC0xNyAtNS4zMzQsLTUuMzM0IDAuMDAxLC05LjMzNCAtMy4zMzIsLTE1LjMzNCAtMy4zMzQsLTYgLTIwLC04LjY2NiAtMjAsLTguNjY2IDAsMCAxOC4yNzMsMjMuNDc3IC00LDI1LjMzMiAtMTYsMS4zMzQgLTI2LDIyLjY2OCAtNDguNjY3LDExLjMzNCAtMzIuNTUsLTE2LjI3NyAtNzguNjY4LC00NCAtMTEwLjY2OCwtNDcuMzMyIC0zMS4xOTMsLTMuMjQ4IC00Mi42NjcsNi42NjYgLTUwLjY2NywyNS4zMzIgLTkuMzMzLC04IC0xMS4zMzMsLTE0IC0xMS4zMzMsLTE0IiAvPjxwYXRoCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgaWQ9InBhdGgxMDYiCiAgICAgICBzdHlsZT0iZmlsbDojMmQyYjJjO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgZD0ibSAyNzQuMTg4NjMsMTgzLjAwMiBjIDAsMCAyMi42NjcsLTEyIDE2LC0zOCAtNi42NjcsLTI2IC0zNi42NjcsLTQ0IC01NiwtNTIuNjY4IC0xOS4zMzMsLTguNjY2IC0zMy43NDMsLTIwLjEyNyAtMTkuMzMzLC0yNy4zMzIgMTIsLTYgMTguNjY3LDkuMzM0IDM2LDEyIDE3LjMzMywyLjY2NiAzMi42NjcsLTQgMzQsLTE0IC03LjMzNCw0IC0xMi42NjcsNCAtMTIuNjY3LDQgMCwwIDYsLTQgNi42NjcsLTEwLjY2OCAwLjY2NiwtNi42NjYgLTAuNjY3LC0zLjMzMiAtNC42NjcsLTMuMzMyIC0xMCwwIC0xMS4zMzMsOC42NjYgLTIwLDcuMzMyIC0yMiwtMiAtMjMuMzMzLC0xMS4zMzQgLTM1LjMzMywtMTIuNjY2IC0xMiwtMS4zMzQgLTMyLDUuMzM0IC0yOS4zMzQsMjAuNjY2IDIuNjY3LDE1LjMzNCAyMy4zMzQsMjYgNDIuNjY3LDM0IDE5LjMzMyw4IDQ4LjY2NywzMy4zMzQgNDQuNjY3LDU2IC00LDIyLjY2OCAtMjEuMzM0LDE4IC0yMS4zMzQsMTggbCAxOC42NjcsNi42NjggeiIgLz48cGF0aAogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGlkPSJwYXRoMTEwIgogICAgICAgc3R5bGU9ImZpbGw6IzJkMmIyYztmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIKICAgICAgIGQ9Im0gMzMxLjAyMjEzLDM3MS43NTE1IGMgMCwwIDkuNSwtNC43NSAxNS41LC0yOC43NSA0LC04LjY2NyA5LjMzMywtMTUuNjY3IDE0LC0xNy42NjcgNC42NjcsLTIgLTIsLTQgLTUuMzMzLC0zLjMzMyAtMy4zMzQsMC42NjcgLTEwLjMzNCwzLjY2NyAtMTUsLTAuMzMzIC00LjY2NywtNCAtMTYsLTE0LjY2NyAtMzIsLTEyIC0xNiwyLjY2NiAtMjkuNjY3LDEyLjgzMyAtMjkuNjY3LDEyLjgzMyAwLDAgNiwtMjYuNSA0MS42NjcsLTI0LjgzMyAyNC43MjEsMS4xNTUgMTkuMzMzLDE0IDM2LDE2LjY2NiAxNi42NjYsMi42NjcgMTQuODkzLDExLjA4OSAxMS4zMzMsMTggLTUuNjY3LDExIC0yMy4zMzMsMTMuNjY3IC0yNS4zMzMsNDUuODM0IC0yLDMuMzMzIC0xNC41LC0wLjQxNyAtMTEuMTY3LC02LjQxNyIgLz48cGF0aAogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGlkPSJwYXRoMTE0IgogICAgICAgc3R5bGU9ImZpbGw6IzJkMmIyYztmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIKICAgICAgIGQ9Im0gMzg4LjAxMzgzLDIwNC40NzA3IGMgMS41MDYsLTEuNDc3IC0xMS44MjUsLTMxLjQ2OSAtMTEuODI1LC0zMS40NjkgMCwwIC0yLjY2NywtNy4zMzQgLTkuODE0LC00Ljc1IC03LjMxMSwyLjY0NSAtNS40MTMsNy45NDggLTUuNDEzLDcuOTQ4IGwgMTcuMDI2LDMwLjgzNyBjIDAsMCA5LjM1MywtMS45MDYgMTAuMDI2LC0yLjU2NiIgLz48cGF0aAogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGlkPSJwYXRoMTE4IgogICAgICAgc3R5bGU9ImZpbGw6IzJkMmIyYztmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIKICAgICAgIGQ9Im0gNDA2Ljc0NjIzLDI0Ny4xNjggYyAtMC42NjcsLTIgLTMuMzMzLC0xMCAtMy4zMzMsLTEwIGwgLTEwLjg5MSw4LjMzNCAyLjg5MSw2LjMzMiAxMS4zMzMsLTQuNjY2IHoiIC8+PHBhdGgKICAgICAgIGlua3NjYXBlOmNvbm5lY3Rvci1jdXJ2YXR1cmU9IjAiCiAgICAgICBpZD0icGF0aDEyMiIKICAgICAgIHN0eWxlPSJmaWxsOiMyZDJiMmM7ZmlsbC1vcGFjaXR5OjE7ZmlsbC1ydWxlOm5vbnplcm87c3Ryb2tlOm5vbmUiCiAgICAgICBkPSJtIDI4NC44NTU2MywxODkuMDAyIGMgLTIsLTcuMzM0IDIzLjMzMywtNTAuMDAyIDQwLjY2NywtNDcuMzM0IDE3LjMzMywyLjY2NiAxOS45OTksLTIuNjY4IDE0LjY2NiwtNiAtNS4zMzMsLTMuMzM0IC0xNC42NjYsLTQuNjY4IC0xMy4zMzMsLTkuMzM0IDEuMzMzLC00LjY2NiA1LC05LjMzNCAtMy42NjcsLTggLTguNjY2LDEuMzM0IC0yNi4zMzMsMTAuNjY4IC0zNywyOC42NjggLTMuMzMzLC0xMC42NjggLTQuNjY2LC0xNCAtNC42NjYsLTE0IDAsMCAzNCwtMzUuMzM0IDY4LjY2NiwtMjAuNjY4IC02LDQuNjY4IC0yMi42NjYsMy4zMzQgLTguNjY2LDExLjMzNCAxNCw4IDI0LjY2NiwxMC42NjYgMzEuMzMzLC0yIDMuMzMzLDAuNjY2IDMuMzMzLDMwIC00MC42NjcsMjggLTE1LjMzMywyIC0zNiwzMiAtMzYsNDcuMzM0IC00LC00IC05LjMzMywtMC42NjYgLTExLjMzMywtOCIgLz48cGF0aAogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGlkPSJwYXRoMTI2IgogICAgICAgc3R5bGU9ImZpbGw6IzJkMmIyYztmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIKICAgICAgIGQ9Im0gNDIwLjQ0NTUzLDMzNi41MDE1IGMgMCwwIC04Ljc1LC0yNi4yODYgLTUuMTA0LC00OCAwLjcyOSw2Ljg1NyA1LjEwNCw0OCA1LjEwNCw0OCIgLz48cGF0aAogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGlkPSJwYXRoMTMwIgogICAgICAgc3R5bGU9ImZpbGw6IzJkMmIyYztmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIKICAgICAgIGQ9Im0gNDI5LjQwNTQzLDM1Mi4wNTAzIGMgLTAuNDQ0LDEuNjYgLTQuMDcsLTQ1Ljc2MSAtMy4yMDMsLTQ3LjQzNSAwLjg2OCwtMS42NzMgNS45MDksMzcuMzM5IDMuMjAzLDQ3LjQzNSIgLz48cGF0aAogICAgICAgaW5rc2NhcGU6Y29ubmVjdG9yLWN1cnZhdHVyZT0iMCIKICAgICAgIGlkPSJwYXRoMTM0IgogICAgICAgc3R5bGU9ImZpbGw6IzJkMmIyYztmaWxsLW9wYWNpdHk6MTtmaWxsLXJ1bGU6bm9uemVybztzdHJva2U6bm9uZSIKICAgICAgIGQ9Im0gMzEyLjg1NTEzLDM3OC4zMzUgYyAwLDAgMzcuNjY3LDMuMzMzIDMxLDE4LjMzMyAtMjAuMTA1LDQ1LjIzOSAtNTguMzMzLDcxLjY2NyAtMTI5LDY5IDQwLDE2IDc0LjAwMDIxLDE0LjAwMDI1IDEwNi42NjcsLTE0IDE2LjMzMzExLC0xMy45OTk4OCAyMy44OTMyNCwtMzEuMDQwNjkgMjkuNzQ5NzksLTQ0LjA4Mjk2IDkuMzQwNDQsLTIwLjgwMDc0IDYuNTg5MTQsLTIyLjc0Njk2IC0zLjc0OTc5LC0yOC41ODMwNCAtMTIuNTY4NDcsLTcuMDk0NiAtMzQuMTkxLC0yLjU3IC0zNC42NjcsLTAuNjY3IgogICAgICAgc29kaXBvZGk6bm9kZXR5cGVzPSJjY2Nzc3NjIiAvPjxwYXRoCiAgICAgICBpbmtzY2FwZTpjb25uZWN0b3ItY3VydmF0dXJlPSIwIgogICAgICAgaWQ9InBhdGgxMzgiCiAgICAgICBzdHlsZT0iZmlsbDojMmQyYjJjO2ZpbGwtb3BhY2l0eToxO2ZpbGwtcnVsZTpub256ZXJvO3N0cm9rZTpub25lIgogICAgICAgZD0ibSAzMTYuNzA4NCwzNzIuNTgyNDIgYyAwLDAgMTAuMzY0MTUsLTcuMTM4MDIgMTguNTAyMTUsLTEuMzI2MDIgMy43NDA4NiwzLjg0ODg0IDYuMjMzMjMsNS45NTAyNiAtNC4zNzEzNyw1LjUxMjEzIGwgLTEyLjkwNDc5LDAuNTI4NzUgYyAtOC45NDExNiwxLjgyNDUyIC04Ljc2NDcsLTAuOTM3NTMgLTEuMjI1OTksLTQuNzE0ODYgeiIKICAgICAgIHNvZGlwb2RpOm5vZGV0eXBlcz0iY2NjY2MiIC8+PC9nPjwvc3ZnPg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/doc/manual.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogVXNlciBNYW51YWw8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSJkb2NzLmNzcyI+CjxzY3JpcHQgc3JjPSJhY3RpdmVib29rbWFyay5qcyI+PC9zY3JpcHQ+Cgo8c2NyaXB0IHNyYz0iLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxzY3JpcHQgc3JjPSIuLi9hZGRvbi9ydW5tb2RlL3J1bm1vZGUuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vYWRkb24vcnVubW9kZS9jb2xvcml6ZS5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9tb2RlL2phdmFzY3JpcHQvamF2YXNjcmlwdC5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9tb2RlL3htbC94bWwuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vbW9kZS9jc3MvY3NzLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL21vZGUvaHRtbG1peGVkL2h0bWxtaXhlZC5qcyI+PC9zY3JpcHQ+CjxzdHlsZT4KICBkdCB7IHRleHQtaW5kZW50OiAtMmVtOyBwYWRkaW5nLWxlZnQ6IDJlbTsgbWFyZ2luLXRvcDogMWVtOyB9CiAgZGQgeyBtYXJnaW4tbGVmdDogMS41ZW07IG1hcmdpbi1ib3R0b206IDFlbTsgfQogIGR0IHttYXJnaW4tdG9wOiAxZW07fQogIGRkIGRsLCBkZCBkdCwgZGQgZGQsIGRkIHVsIHsgbWFyZ2luLXRvcDogMDsgbWFyZ2luLWJvdHRvbTogMDsgfQogIGR0ICsgZHQgeyBtYXJnaW4tdG9wOiAwOyB9CiAgZHQuY29tbWFuZCB7IHBvc2l0aW9uOiByZWxhdGl2ZTsgfQogIHNwYW4ua2V5YmluZGluZyB7IHBvc2l0aW9uOiBhYnNvbHV0ZTsgcmlnaHQ6IDA7IGZvbnQtc2l6ZTogODAlOyBjb2xvcjogIzU1NTsgdGV4dC1pbmRlbnQ6IDA7IH0KPC9zdHlsZT4KCjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGgxPkNvZGVNaXJyb3I8L2gxPjxpbWcgaWQ9bG9nbyBzcmM9ImxvZ28ucG5nIj48L2E+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+PC9saT4KICAgIDxsaT48YSBocmVmPSIjb3ZlcnZpZXciIGNsYXNzPWFjdGl2ZSBkYXRhLWRlZmF1bHQ9InRydWUiPk1hbnVhbDwvYT48L2xpPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2NvZGVtaXJyb3IiPkNvZGU8L2E+PC9saT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIjdXNhZ2UiPkJhc2ljIFVzYWdlPC9hPjwvbGk+CiAgICA8bGk+PGEgaHJlZj0iI2NvbmZpZyI+Q29uZmlndXJhdGlvbjwvYT48L2xpPgogICAgPGxpPjxhIGhyZWY9IiNldmVudHMiPkV2ZW50czwvYT48L2xpPgogICAgPGxpPjxhIGhyZWY9IiNrZXltYXBzIj5LZXkgbWFwczwvYT48L2xpPgogICAgPGxpPjxhIGhyZWY9IiNjb21tYW5kcyI+Q29tbWFuZHM8L2E+PC9saT4KICAgIDxsaT48YSBocmVmPSIjc3R5bGluZyI+Q3VzdG9taXplZCBTdHlsaW5nPC9hPjwvbGk+CiAgICA8bGk+PGEgaHJlZj0iI2FwaSI+UHJvZ3JhbW1pbmcgQVBJPC9hPgogICAgICA8dWw+CiAgICAgICAgPGxpPjxhIGhyZWY9IiNhcGlfY29uc3RydWN0b3IiPkNvbnN0cnVjdG9yPC9hPjwvbGk+CiAgICAgICAgPGxpPjxhIGhyZWY9IiNhcGlfY29udGVudCI+Q29udGVudCBtYW5pcHVsYXRpb248L2E+PC9saT4KICAgICAgICA8bGk+PGEgaHJlZj0iI2FwaV9zZWxlY3Rpb24iPlNlbGVjdGlvbjwvYT48L2xpPgogICAgICAgIDxsaT48YSBocmVmPSIjYXBpX2NvbmZpZ3VyYXRpb24iPkNvbmZpZ3VyYXRpb248L2E+PC9saT4KICAgICAgICA8bGk+PGEgaHJlZj0iI2FwaV9kb2MiPkRvY3VtZW50IG1hbmFnZW1lbnQ8L2E+PC9saT4KICAgICAgICA8bGk+PGEgaHJlZj0iI2FwaV9oaXN0b3J5Ij5IaXN0b3J5PC9hPjwvbGk+CiAgICAgICAgPGxpPjxhIGhyZWY9IiNhcGlfbWFya2VyIj5UZXh0LW1hcmtpbmc8L2E+PC9saT4KICAgICAgICA8bGk+PGEgaHJlZj0iI2FwaV9kZWNvcmF0aW9uIj5XaWRnZXQsIGd1dHRlciwgYW5kIGRlY29yYXRpb248L2E+PC9saT4KICAgICAgICA8bGk+PGEgaHJlZj0iI2FwaV9zaXppbmciPlNpemluZywgc2Nyb2xsaW5nLCBhbmQgcG9zaXRpb25pbmc8L2E+PC9saT4KICAgICAgICA8bGk+PGEgaHJlZj0iI2FwaV9tb2RlIj5Nb2RlLCBzdGF0ZSwgYW5kIHRva2VuczwvYT48L2xpPgogICAgICAgIDxsaT48YSBocmVmPSIjYXBpX21pc2MiPk1pc2NlbGxhbmVvdXMgbWV0aG9kczwvYT48L2xpPgogICAgICAgIDxsaT48YSBocmVmPSIjYXBpX3N0YXRpYyI+U3RhdGljIHByb3BlcnRpZXM8L2E+PC9saT4KICAgICAgPC91bD4KICAgIDwvbGk+CiAgICA8bGk+PGEgaHJlZj0iI2FkZG9ucyI+QWRkb25zPC9hPjwvbGk+CiAgICA8bGk+PGEgaHJlZj0iI21vZGVhcGkiPldyaXRpbmcgQ29kZU1pcnJvciBNb2RlczwvYT48L2xpPgogICAgPGxpPjxhIGhyZWY9IiN2aW1hcGkiPlZpbSBNb2RlIEFQSTwvYT4KICAgICAgPHVsPgogICAgICAgIDxsaT48YSBocmVmPSIjdmltYXBpX2NvbmZpZ3VyYXRpb24iPkNvbmZpZ3VyYXRpb248L2E+PC9saT4KICAgICAgICA8bGk+PGEgaHJlZj0iI3ZpbWFwaV9leHRlbmRpbmciPkV4dGVuZGluZyBWSU08L2E+PC9saT4KICAgICAgPC91bD4KICAgIDwvbGk+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KCjxzZWN0aW9uIGNsYXNzPWZpcnN0IGlkPW92ZXJ2aWV3PgogICAgPGgyIHN0eWxlPSJwb3NpdGlvbjogcmVsYXRpdmUiPgogICAgICBVc2VyIG1hbnVhbCBhbmQgcmVmZXJlbmNlIGd1aWRlCiAgICAgIDxzcGFuIHN0eWxlPSJjb2xvcjogIzg4ODsgZm9udC1zaXplOiAxcmVtOyBwb3NpdGlvbjogYWJzb2x1dGU7IHJpZ2h0OiAwOyBib3R0b206IDAiPnZlcnNpb24gNS4yMC4yPC9zcGFuPgogICAgPC9oMj4KCiAgICA8cD5Db2RlTWlycm9yIGlzIGEgY29kZS1lZGl0b3IgY29tcG9uZW50IHRoYXQgY2FuIGJlIGVtYmVkZGVkIGluCiAgICBXZWIgcGFnZXMuIFRoZSBjb3JlIGxpYnJhcnkgcHJvdmlkZXMgPGVtPm9ubHk8L2VtPiB0aGUgZWRpdG9yCiAgICBjb21wb25lbnQsIG5vIGFjY29tcGFueWluZyBidXR0b25zLCBhdXRvLWNvbXBsZXRpb24sIG9yIG90aGVyIElERQogICAgZnVuY3Rpb25hbGl0eS4gSXQgZG9lcyBwcm92aWRlIGEgcmljaCBBUEkgb24gdG9wIG9mIHdoaWNoIHN1Y2gKICAgIGZ1bmN0aW9uYWxpdHkgY2FuIGJlIHN0cmFpZ2h0Zm9yd2FyZGx5IGltcGxlbWVudGVkLiBTZWUKICAgIHRoZSA8YSBocmVmPSIjYWRkb25zIj5hZGRvbnM8L2E+IGluY2x1ZGVkIGluIHRoZSBkaXN0cmlidXRpb24sCiAgICBhbmQgdGhlIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL0NvZGVNaXJyb3Ivd2lraS9Db2RlTWlycm9yLWFkZG9ucyI+bGlzdAogICAgb2YgZXh0ZXJuYWxseSBob3N0ZWQgYWRkb25zPC9hPiwgZm9yIHJldXNhYmxlCiAgICBpbXBsZW1lbnRhdGlvbnMgb2YgZXh0cmEgZmVhdHVyZXMuPC9wPgoKICAgIDxwPkNvZGVNaXJyb3Igd29ya3Mgd2l0aCBsYW5ndWFnZS1zcGVjaWZpYyBtb2Rlcy4gTW9kZXMgYXJlCiAgICBKYXZhU2NyaXB0IHByb2dyYW1zIHRoYXQgaGVscCBjb2xvciAoYW5kIG9wdGlvbmFsbHkgaW5kZW50KSB0ZXh0CiAgICB3cml0dGVuIGluIGEgZ2l2ZW4gbGFuZ3VhZ2UuIFRoZSBkaXN0cmlidXRpb24gY29tZXMgd2l0aCBhIG51bWJlcgogICAgb2YgbW9kZXMgKHNlZSB0aGUgPGEgaHJlZj0iLi4vbW9kZS8iPjxjb2RlPm1vZGUvPC9jb2RlPjwvYT4KICAgIGRpcmVjdG9yeSksIGFuZCBpdCBpc24ndCBoYXJkIHRvIDxhIGhyZWY9IiNtb2RlYXBpIj53cml0ZSBuZXcKICAgIG9uZXM8L2E+IGZvciBvdGhlciBsYW5ndWFnZXMuPC9wPgo8L3NlY3Rpb24+Cgo8c2VjdGlvbiBpZD11c2FnZT4KICAgIDxoMj5CYXNpYyBVc2FnZTwvaDI+CgogICAgPHA+VGhlIGVhc2llc3Qgd2F5IHRvIHVzZSBDb2RlTWlycm9yIGlzIHRvIHNpbXBseSBsb2FkIHRoZSBzY3JpcHQKICAgIGFuZCBzdHlsZSBzaGVldCBmb3VuZCB1bmRlciA8Y29kZT5saWIvPC9jb2RlPiBpbiB0aGUgZGlzdHJpYnV0aW9uLAogICAgcGx1cyBhIG1vZGUgc2NyaXB0IGZyb20gb25lIG9mIHRoZSA8Y29kZT5tb2RlLzwvY29kZT4gZGlyZWN0b3JpZXMuCiAgICBGb3IgZXhhbXBsZTo8L3A+CgogICAgPHByZSBkYXRhLWxhbmc9InRleHQvaHRtbCI+Jmx0O3NjcmlwdCBzcmM9ImxpYi9jb2RlbWlycm9yLmpzIj4mbHQ7L3NjcmlwdD4KJmx0O2xpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJsaWIvY29kZW1pcnJvci5jc3MiPgombHQ7c2NyaXB0IHNyYz0ibW9kZS9qYXZhc2NyaXB0L2phdmFzY3JpcHQuanMiPiZsdDsvc2NyaXB0PjwvcHJlPgoKICAgIDxwPihBbHRlcm5hdGl2ZWx5LCB1c2UgYSBtb2R1bGUgbG9hZGVyLiA8YSBocmVmPSIjbW9kbG9hZGVyIj5Nb3JlCiAgICBhYm91dCB0aGF0IGxhdGVyLjwvYT4pPC9wPgoKICAgIDxwPkhhdmluZyBkb25lIHRoaXMsIGFuIGVkaXRvciBpbnN0YW5jZSBjYW4gYmUgY3JlYXRlZCBsaWtlCiAgICB0aGlzOjwvcD4KCiAgICA8cHJlIGRhdGEtbGFuZz0iamF2YXNjcmlwdCI+dmFyIG15Q29kZU1pcnJvciA9IENvZGVNaXJyb3IoZG9jdW1lbnQuYm9keSk7PC9wcmU+CgogICAgPHA+VGhlIGVkaXRvciB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBkb2N1bWVudCBib2R5LCB3aWxsIHN0YXJ0CiAgICBlbXB0eSwgYW5kIHdpbGwgdXNlIHRoZSBtb2RlIHRoYXQgd2UgbG9hZGVkLiBUbyBoYXZlIG1vcmUgY29udHJvbAogICAgb3ZlciB0aGUgbmV3IGVkaXRvciwgYSBjb25maWd1cmF0aW9uIG9iamVjdCBjYW4gYmUgcGFzc2VkCiAgICB0byA8YSBocmVmPSIjQ29kZU1pcnJvciI+PGNvZGU+Q29kZU1pcnJvcjwvY29kZT48L2E+IGFzIGEgc2Vjb25kCiAgICBhcmd1bWVudDo8L3A+CgogICAgPHByZSBkYXRhLWxhbmc9ImphdmFzY3JpcHQiPnZhciBteUNvZGVNaXJyb3IgPSBDb2RlTWlycm9yKGRvY3VtZW50LmJvZHksIHsKICB2YWx1ZTogImZ1bmN0aW9uIG15U2NyaXB0KCl7cmV0dXJuIDEwMDt9XG4iLAogIG1vZGU6ICAiamF2YXNjcmlwdCIKfSk7PC9wcmU+CgogICAgPHA+VGhpcyB3aWxsIGluaXRpYWxpemUgdGhlIGVkaXRvciB3aXRoIGEgcGllY2Ugb2YgY29kZSBhbHJlYWR5IGluCiAgICBpdCwgYW5kIGV4cGxpY2l0bHkgdGVsbCBpdCB0byB1c2UgdGhlIEphdmFTY3JpcHQgbW9kZSAod2hpY2ggaXMKICAgIHVzZWZ1bCB3aGVuIG11bHRpcGxlIG1vZGVzIGFyZSBsb2FkZWQpLgogICAgU2VlIDxhIGhyZWY9IiNjb25maWciPmJlbG93PC9hPiBmb3IgYSBmdWxsIGRpc2N1c3Npb24gb2YgdGhlCiAgICBjb25maWd1cmF0aW9uIG9wdGlvbnMgdGhhdCBDb2RlTWlycm9yIGFjY2VwdHMuPC9wPgoKICAgIDxwPkluIGNhc2VzIHdoZXJlIHlvdSBkb24ndCB3YW50IHRvIGFwcGVuZCB0aGUgZWRpdG9yIHRvIGFuCiAgICBlbGVtZW50LCBhbmQgbmVlZCBtb3JlIGNvbnRyb2wgb3ZlciB0aGUgd2F5IGl0IGlzIGluc2VydGVkLCB0aGUKICAgIGZpcnN0IGFyZ3VtZW50IHRvIHRoZSA8Y29kZT5Db2RlTWlycm9yPC9jb2RlPiBmdW5jdGlvbiBjYW4gYWxzbwogICAgYmUgYSBmdW5jdGlvbiB0aGF0LCB3aGVuIGdpdmVuIGEgRE9NIGVsZW1lbnQsIGluc2VydHMgaXQgaW50byB0aGUKICAgIGRvY3VtZW50IHNvbWV3aGVyZS4gVGhpcyBjb3VsZCBiZSB1c2VkIHRvLCBmb3IgZXhhbXBsZSwgcmVwbGFjZSBhCiAgICB0ZXh0YXJlYSB3aXRoIGEgcmVhbCBlZGl0b3I6PC9wPgoKICAgIDxwcmUgZGF0YS1sYW5nPSJqYXZhc2NyaXB0Ij52YXIgbXlDb2RlTWlycm9yID0gQ29kZU1pcnJvcihmdW5jdGlvbihlbHQpIHsKICBteVRleHRBcmVhLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGVsdCwgbXlUZXh0QXJlYSk7Cn0sIHt2YWx1ZTogbXlUZXh0QXJlYS52YWx1ZX0pOzwvcHJlPgoKICAgIDxwPkhvd2V2ZXIsIGZvciB0aGlzIHVzZSBjYXNlLCB3aGljaCBpcyBhIGNvbW1vbiB3YXkgdG8gdXNlCiAgICBDb2RlTWlycm9yLCB0aGUgbGlicmFyeSBwcm92aWRlcyBhIG11Y2ggbW9yZSBwb3dlcmZ1bAogICAgc2hvcnRjdXQ6PC9wPgoKICAgIDxwcmUgZGF0YS1sYW5nPSJqYXZhc2NyaXB0Ij52YXIgbXlDb2RlTWlycm9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEobXlUZXh0QXJlYSk7PC9wcmU+CgogICAgPHA+VGhpcyB3aWxsLCBhbW9uZyBvdGhlciB0aGluZ3MsIGVuc3VyZSB0aGF0IHRoZSB0ZXh0YXJlYSdzIHZhbHVlCiAgICBpcyB1cGRhdGVkIHdpdGggdGhlIGVkaXRvcidzIGNvbnRlbnRzIHdoZW4gdGhlIGZvcm0gKGlmIGl0IGlzIHBhcnQKICAgIG9mIGEgZm9ybSkgaXMgc3VibWl0dGVkLiBTZWUgdGhlIDxhIGhyZWY9IiNmcm9tVGV4dEFyZWEiPkFQSQogICAgcmVmZXJlbmNlPC9hPiBmb3IgYSBmdWxsIGRlc2NyaXB0aW9uIG9mIHRoaXMgbWV0aG9kLjwvcD4KCiAgICA8aDMgaWQ9bW9kbG9hZGVyPk1vZHVsZSBsb2FkZXJzPC9oMz4KCiAgICA8cD5UaGUgZmlsZXMgaW4gdGhlIENvZGVNaXJyb3IgZGlzdHJpYnV0aW9uIGNvbnRhaW4gc2hpbXMgZm9yCiAgICBsb2FkaW5nIHRoZW0gKGFuZCB0aGVpciBkZXBlbmRlbmNpZXMpIGluIEFNRCBvciBDb21tb25KUwogICAgZW52aXJvbm1lbnRzLiBJZiB0aGUgdmFyaWFibGVzIDxjb2RlPmV4cG9ydHM8L2NvZGU+CiAgICBhbmQgPGNvZGU+bW9kdWxlPC9jb2RlPiBleGlzdCBhbmQgaGF2ZSB0eXBlIG9iamVjdCwgQ29tbW9uSlMtc3R5bGUKICAgIHJlcXVpcmUgd2lsbCBiZSB1c2VkLiBJZiBub3QsIGJ1dCB0aGVyZSBpcyBhCiAgICBmdW5jdGlvbiA8Y29kZT5kZWZpbmU8L2NvZGU+IHdpdGggYW4gPGNvZGU+YW1kPC9jb2RlPiBwcm9wZXJ0eQogICAgcHJlc2VudCwgQU1ELXN0eWxlIChSZXF1aXJlSlMpIHdpbGwgYmUgdXNlZC48L3A+CgogICAgPHA+SXQgaXMgcG9zc2libGUgdG8KICAgIHVzZSA8YSBocmVmPSJodHRwOi8vYnJvd3NlcmlmeS5vcmcvIj5Ccm93c2VyaWZ5PC9hPiBvciBzaW1pbGFyCiAgICB0b29scyB0byBzdGF0aWNhbGx5IGJ1aWxkIG1vZHVsZXMgdXNpbmcgQ29kZU1pcnJvci4gQWx0ZXJuYXRpdmVseSwKICAgIHVzZSA8YSBocmVmPSJodHRwOi8vcmVxdWlyZWpzLm9yZy8iPlJlcXVpcmVKUzwvYT4gdG8gZHluYW1pY2FsbHkKICAgIGxvYWQgZGVwZW5kZW5jaWVzIGF0IHJ1bnRpbWUuIEJvdGggb2YgdGhlc2UgYXBwcm9hY2hlcyBoYXZlIHRoZQogICAgYWR2YW50YWdlIHRoYXQgdGhleSBkb24ndCB1c2UgdGhlIGdsb2JhbCBuYW1lc3BhY2UgYW5kIGNhbiwgdGh1cywKICAgIGRvIHRoaW5ncyBsaWtlIGxvYWQgbXVsdGlwbGUgdmVyc2lvbnMgb2YgQ29kZU1pcnJvciBhbG9uZ3NpZGUgZWFjaAogICAgb3RoZXIuPC9wPgoKICAgIDxwPkhlcmUncyBhIHNpbXBsZSBleGFtcGxlIG9mIHVzaW5nIFJlcXVpcmVKUyB0byBsb2FkIENvZGVNaXJyb3I6PC9wPgoKICAgIDxwcmUgZGF0YS1sYW5nPSJqYXZhc2NyaXB0Ij5yZXF1aXJlKFsKICAiY20vbGliL2NvZGVtaXJyb3IiLCAiY20vbW9kZS9odG1sbWl4ZWQvaHRtbG1peGVkIgpdLCBmdW5jdGlvbihDb2RlTWlycm9yKSB7CiAgQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgbGluZU51bWJlcnM6IHRydWUsCiAgICBtb2RlOiAiaHRtbG1peGVkIgogIH0pOwp9KTs8L3ByZT4KCiAgICA8cD5JdCB3aWxsIGF1dG9tYXRpY2FsbHkgbG9hZCB0aGUgbW9kZXMgdGhhdCB0aGUgbWl4ZWQgSFRNTCBtb2RlCiAgICBkZXBlbmRzIG9uIChYTUwsIEphdmFTY3JpcHQsIGFuZCBDU1MpLiBEbyA8ZW0+bm90PC9lbT4gdXNlCiAgICBSZXF1aXJlSlMnIDxjb2RlPnBhdGhzPC9jb2RlPiBvcHRpb24gdG8gY29uZmlndXJlIHRoZSBwYXRoIHRvCiAgICBDb2RlTWlycm9yLCBzaW5jZSBpdCB3aWxsIGJyZWFrIGxvYWRpbmcgc3VibW9kdWxlcyB0aHJvdWdoCiAgICByZWxhdGl2ZSBwYXRocy4gVXNlCiAgICB0aGUgPGEgaHJlZj0iaHR0cDovL3JlcXVpcmVqcy5vcmcvZG9jcy9hcGkuaHRtbCNwYWNrYWdlcyI+PGNvZGU+cGFja2FnZXM8L2NvZGU+PC9hPgogICAgY29uZmlndXJhdGlvbiBvcHRpb24gaW5zdGVhZCwgYXMgaW46PC9wPgoKICAgIDxwcmUgZGF0YS1sYW5nPWphdmFzY3JpcHQ+cmVxdWlyZS5jb25maWcoewogIHBhY2thZ2VzOiBbewogICAgbmFtZTogImNvZGVtaXJyb3IiLAogICAgbG9jYXRpb246ICIuLi9wYXRoL3RvL2NvZGVtaXJyb3IiLAogICAgbWFpbjogImxpYi9jb2RlbWlycm9yIgogIH1dCn0pOzwvcHJlPgoKPC9zZWN0aW9uPgoKPHNlY3Rpb24gaWQ9Y29uZmlnPgogICAgPGgyPkNvbmZpZ3VyYXRpb248L2gyPgoKICAgIDxwPkJvdGggdGhlIDxhIGhyZWY9IiNDb2RlTWlycm9yIj48Y29kZT5Db2RlTWlycm9yPC9jb2RlPjwvYT4KICAgIGZ1bmN0aW9uIGFuZCBpdHMgPGNvZGU+ZnJvbVRleHRBcmVhPC9jb2RlPiBtZXRob2QgdGFrZSBhcyBzZWNvbmQKICAgIChvcHRpb25hbCkgYXJndW1lbnQgYW4gb2JqZWN0IGNvbnRhaW5pbmcgY29uZmlndXJhdGlvbiBvcHRpb25zLgogICAgQW55IG9wdGlvbiBub3Qgc3VwcGxpZWQgbGlrZSB0aGlzIHdpbGwgYmUgdGFrZW4KICAgIGZyb20gPGEgaHJlZj0iI2RlZmF1bHRzIj48Y29kZT5Db2RlTWlycm9yLmRlZmF1bHRzPC9jb2RlPjwvYT4sIGFuCiAgICBvYmplY3QgY29udGFpbmluZyB0aGUgZGVmYXVsdCBvcHRpb25zLiBZb3UgY2FuIHVwZGF0ZSB0aGlzIG9iamVjdAogICAgdG8gY2hhbmdlIHRoZSBkZWZhdWx0cyBvbiB5b3VyIHBhZ2UuPC9wPgoKICAgIDxwPk9wdGlvbnMgYXJlIG5vdCBjaGVja2VkIGluIGFueSB3YXksIHNvIHNldHRpbmcgYm9ndXMgb3B0aW9uCiAgICB2YWx1ZXMgaXMgYm91bmQgdG8gbGVhZCB0byBvZGQgZXJyb3JzLjwvcD4KCiAgICA8cD5UaGVzZSBhcmUgdGhlIHN1cHBvcnRlZCBvcHRpb25zOjwvcD4KCiAgICA8ZGw+CiAgICAgIDxkdCBpZD0ib3B0aW9uX3ZhbHVlIj48Y29kZT48c3Ryb25nPnZhbHVlPC9zdHJvbmc+OiBzdHJpbmd8Q29kZU1pcnJvci5Eb2M8L2NvZGU+PC9kdD4KICAgICAgPGRkPlRoZSBzdGFydGluZyB2YWx1ZSBvZiB0aGUgZWRpdG9yLiBDYW4gYmUgYSBzdHJpbmcsIG9yCiAgICAgIGEgPGEgaHJlZj0iI2FwaV9kb2MiPmRvY3VtZW50IG9iamVjdDwvYT4uPC9kZD4KCiAgICAgIDxkdCBpZD0ib3B0aW9uX21vZGUiPjxjb2RlPjxzdHJvbmc+bW9kZTwvc3Ryb25nPjogc3RyaW5nfG9iamVjdDwvY29kZT48L2R0PgogICAgICA8ZGQ+VGhlIG1vZGUgdG8gdXNlLiBXaGVuIG5vdCBnaXZlbiwgdGhpcyB3aWxsIGRlZmF1bHQgdG8gdGhlCiAgICAgIGZpcnN0IG1vZGUgdGhhdCB3YXMgbG9hZGVkLiBJdCBtYXkgYmUgYSBzdHJpbmcsIHdoaWNoIGVpdGhlcgogICAgICBzaW1wbHkgbmFtZXMgdGhlIG1vZGUgb3IgaXMKICAgICAgYSA8YSBocmVmPSJodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL01JTUUiPk1JTUU8L2E+IHR5cGUKICAgICAgYXNzb2NpYXRlZCB3aXRoIHRoZSBtb2RlLiBBbHRlcm5hdGl2ZWx5LCBpdCBtYXkgYmUgYW4gb2JqZWN0CiAgICAgIGNvbnRhaW5pbmcgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgbW9kZSwgd2l0aAogICAgICBhIDxjb2RlPm5hbWU8L2NvZGU+IHByb3BlcnR5IHRoYXQgbmFtZXMgdGhlIG1vZGUgKGZvcgogICAgICBleGFtcGxlIDxjb2RlPntuYW1lOiAiamF2YXNjcmlwdCIsIGpzb246IHRydWV9PC9jb2RlPikuIFRoZSBkZW1vCiAgICAgIHBhZ2VzIGZvciBlYWNoIG1vZGUgY29udGFpbiBpbmZvcm1hdGlvbiBhYm91dCB3aGF0IGNvbmZpZ3VyYXRpb24KICAgICAgcGFyYW1ldGVycyB0aGUgbW9kZSBzdXBwb3J0cy4gWW91IGNhbiBhc2sgQ29kZU1pcnJvciB3aGljaCBtb2RlcwogICAgICBhbmQgTUlNRSB0eXBlcyBoYXZlIGJlZW4gZGVmaW5lZCBieSBpbnNwZWN0aW5nCiAgICAgIHRoZSA8Y29kZT5Db2RlTWlycm9yLm1vZGVzPC9jb2RlPgogICAgICBhbmQgPGNvZGU+Q29kZU1pcnJvci5taW1lTW9kZXM8L2NvZGU+IG9iamVjdHMuIFRoZSBmaXJzdCBtYXBzCiAgICAgIG1vZGUgbmFtZXMgdG8gdGhlaXIgY29uc3RydWN0b3JzLCBhbmQgdGhlIHNlY29uZCBtYXBzIE1JTUUgdHlwZXMKICAgICAgdG8gbW9kZSBzcGVjcy48L2RkPgoKICAgICAgPGR0IGlkPSJvcHRpb25fbGluZVNlcGFyYXRvciI+PGNvZGU+PHN0cm9uZz5saW5lU2VwYXJhdG9yPC9zdHJvbmc+OiBzdHJpbmd8bnVsbDwvY29kZT48L2R0PgogICAgICA8ZGQ+RXhwbGljaXRseSBzZXQgdGhlIGxpbmUgc2VwYXJhdG9yIGZvciB0aGUgZWRpdG9yLiBCeSBkZWZhdWx0CiAgICAgICh2YWx1ZSA8Y29kZT5udWxsPC9jb2RlPiksIHRoZSBkb2N1bWVudCB3aWxsIGJlIHNwbGl0IG9uIENSTEZzCiAgICAgIGFzIHdlbGwgYXMgbG9uZSBDUnMgYW5kIExGcywgYW5kIGEgc2luZ2xlIExGIHdpbGwgYmUgdXNlZCBhcwogICAgICBsaW5lIHNlcGFyYXRvciBpbiBhbGwgb3V0cHV0IChzdWNoCiAgICAgIGFzIDxhIGhyZWY9IiNnZXRWYWx1ZSI+PGNvZGU+Z2V0VmFsdWU8L2NvZGU+PC9hPikuIFdoZW4gYQogICAgICBzcGVjaWZpYyBzdHJpbmcgaXMgZ2l2ZW4sIGxpbmVzIHdpbGwgb25seSBiZSBzcGxpdCBvbiB0aGF0CiAgICAgIHN0cmluZywgYW5kIG91dHB1dCB3aWxsLCBieSBkZWZhdWx0LCB1c2UgdGhhdCBzYW1lCiAgICAgIHNlcGFyYXRvci48L2RkPgoKICAgICAgPGR0IGlkPSJvcHRpb25fdGhlbWUiPjxjb2RlPjxzdHJvbmc+dGhlbWU8L3N0cm9uZz46IHN0cmluZzwvY29kZT48L2R0PgogICAgICA8ZGQ+VGhlIHRoZW1lIHRvIHN0eWxlIHRoZSBlZGl0b3Igd2l0aC4gWW91IG11c3QgbWFrZSBzdXJlIHRoZQogICAgICBDU1MgZmlsZSBkZWZpbmluZyB0aGUgY29ycmVzcG9uZGluZyA8Y29kZT4uY20tcy1bbmFtZV08L2NvZGU+CiAgICAgIHN0eWxlcyBpcyBsb2FkZWQgKHNlZQogICAgICB0aGUgPGEgaHJlZj0iLi4vdGhlbWUvIj48Y29kZT50aGVtZTwvY29kZT48L2E+IGRpcmVjdG9yeSBpbiB0aGUKICAgICAgZGlzdHJpYnV0aW9uKS4gVGhlIGRlZmF1bHQgaXMgPGNvZGU+ImRlZmF1bHQiPC9jb2RlPiwgZm9yIHdoaWNoCiAgICAgIGNvbG9ycyBhcmUgaW5jbHVkZWQgaW4gPGNvZGU+Y29kZW1pcnJvci5jc3M8L2NvZGU+LiBJdCBpcwogICAgICBwb3NzaWJsZSB0byB1c2UgbXVsdGlwbGUgdGhlbWluZyBjbGFzc2VzIGF0IG9uY2XigJRmb3IKICAgICAgZXhhbXBsZSA8Y29kZT4iZm9vIGJhciI8L2NvZGU+IHdpbGwgYXNzaWduIGJvdGgKICAgICAgdGhlIDxjb2RlPmNtLXMtZm9vPC9jb2RlPiBhbmQgdGhlIDxjb2RlPmNtLXMtYmFyPC9jb2RlPiBjbGFzc2VzCiAgICAgIHRvIHRoZSBlZGl0b3IuPC9kZD4KCiAgICAgIDxkdCBpZD0ib3B0aW9uX2luZGVudFVuaXQiPjxjb2RlPjxzdHJvbmc+aW5kZW50VW5pdDwvc3Ryb25nPjogaW50ZWdlcjwvY29kZT48L2R0PgogICAgICA8ZGQ+SG93IG1hbnkgc3BhY2VzIGEgYmxvY2sgKHdoYXRldmVyIHRoYXQgbWVhbnMgaW4gdGhlIGVkaXRlZAogICAgICBsYW5ndWFnZSkgc2hvdWxkIGJlIGluZGVudGVkLiBUaGUgZGVmYXVsdCBpcyAyLjwvZGQ+CgogICAgICA8ZHQgaWQ9Im9wdGlvbl9zbWFydEluZGVudCI+PGNvZGU+PHN0cm9uZz5zbWFydEluZGVudDwvc3Ryb25nPjogYm9vbGVhbjwvY29kZT48L2R0PgogICAgICA8ZGQ+V2hldGhlciB0byB1c2UgdGhlIGNvbnRleHQtc2Vuc2l0aXZlIGluZGVudGF0aW9uIHRoYXQgdGhlCiAgICAgIG1vZGUgcHJvdmlkZXMgKG9yIGp1c3QgaW5kZW50IHRoZSBzYW1lIGFzIHRoZSBsaW5lIGJlZm9yZSkuCiAgICAgIERlZmF1bHRzIHRvIHRydWUuPC9kZD4KCiAgICAgIDxkdCBpZD0ib3B0aW9uX3RhYlNpemUiPjxjb2RlPjxzdHJvbmc+dGFiU2l6ZTwvc3Ryb25nPjogaW50ZWdlcjwvY29kZT48L2R0PgogICAgICA8ZGQ+VGhlIHdpZHRoIG9mIGEgdGFiIGNoYXJhY3Rlci4gRGVmYXVsdHMgdG8gNC48L2RkPgoKICAgICAgPGR0IGlkPSJvcHRpb25faW5kZW50V2l0aFRhYnMiPjxjb2RlPjxzdHJvbmc+aW5kZW50V2l0aFRhYnM8L3N0cm9uZz46IGJvb2xlYW48L2NvZGU+PC9kdD4KICAgICAgPGRkPldoZXRoZXIsIHdoZW4gaW5kZW50aW5nLCB0aGUgZmlyc3QgTio8Y29kZT50YWJTaXplPC9jb2RlPgogICAgICBzcGFjZXMgc2hvdWxkIGJlIHJlcGxhY2VkIGJ5IE4gdGFicy4gRGVmYXVsdCBpcyBmYWxzZS48L2RkPgoKICAgICAgPGR0IGlkPSJvcHRpb25fZWxlY3RyaWNDaGFycyI+PGNvZGU+PHN0cm9uZz5lbGVjdHJpY0NoYXJzPC9zdHJvbmc+OiBib29sZWFuPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5Db25maWd1cmVzIHdoZXRoZXIgdGhlIGVkaXRvciBzaG91bGQgcmUtaW5kZW50IHRoZSBjdXJyZW50CiAgICAgIGxpbmUgd2hlbiBhIGNoYXJhY3RlciBpcyB0eXBlZCB0aGF0IG1pZ2h0IGNoYW5nZSBpdHMgcHJvcGVyCiAgICAgIGluZGVudGF0aW9uIChvbmx5IHdvcmtzIGlmIHRoZSBtb2RlIHN1cHBvcnRzIGluZGVudGF0aW9uKS4KICAgICAgRGVmYXVsdCBpcyB0cnVlLjwvZGQ+CgogICAgICA8ZHQgaWQ9Im9wdGlvbl9zcGVjaWFsQ2hhcnMiPjxjb2RlPjxzdHJvbmc+c3BlY2lhbENoYXJzPC9zdHJvbmc+OiBSZWdFeHA8L2NvZGU+PC9kdD4KICAgICAgPGRkPkEgcmVndWxhciBleHByZXNzaW9uIHVzZWQgdG8gZGV0ZXJtaW5lIHdoaWNoIGNoYXJhY3RlcnMKICAgICAgc2hvdWxkIGJlIHJlcGxhY2VkIGJ5IGEKICAgICAgc3BlY2lhbCA8YSBocmVmPSIjb3B0aW9uX3NwZWNpYWxDaGFyUGxhY2Vob2xkZXIiPnBsYWNlaG9sZGVyPC9hPi4KICAgICAgTW9zdGx5IHVzZWZ1bCBmb3Igbm9uLXByaW50aW5nIHNwZWNpYWwgY2hhcmFjdGVycy4gVGhlIGRlZmF1bHQKICAgICAgaXMgPGNvZGU+L1tcdTAwMDAtXHUwMDFmXHUwMDdmXHUwMGFkXHUyMDBiLVx1MjAwZlx1MjAyOFx1MjAyOVx1ZmVmZl0vPC9jb2RlPi48L2RkPgogICAgICA8ZHQgaWQ9Im9wdGlvbl9zcGVjaWFsQ2hhclBsYWNlaG9sZGVyIj48Y29kZT48c3Ryb25nPnNwZWNpYWxDaGFyUGxhY2Vob2xkZXI8L3N0cm9uZz46IGZ1bmN0aW9uKGNoYXIpwqDihpLCoEVsZW1lbnQ8L2NvZGU+PC9kdD4KICAgICAgPGRkPkEgZnVuY3Rpb24gdGhhdCwgZ2l2ZW4gYSBzcGVjaWFsIGNoYXJhY3RlciBpZGVudGlmaWVkIGJ5CiAgICAgIHRoZSA8YSBocmVmPSIjb3B0aW9uX3NwZWNpYWxDaGFycyI+PGNvZGU+c3BlY2lhbENoYXJzPC9jb2RlPjwvYT4KICAgICAgb3B0aW9uLCBwcm9kdWNlcyBhIERPTSBub2RlIHRoYXQgaXMgdXNlZCB0byByZXByZXNlbnQgdGhlCiAgICAgIGNoYXJhY3Rlci4gQnkgZGVmYXVsdCwgYSByZWQgZG90ICg8c3BhbiBzdHlsZT0iY29sb3I6IHJlZCI+4oCiPC9zcGFuPikKICAgICAgaXMgc2hvd24sIHdpdGggYSB0aXRsZSB0b29sdGlwIHRvIGluZGljYXRlIHRoZSBjaGFyYWN0ZXIgY29kZS48L2RkPgoKICAgICAgPGR0IGlkPSJvcHRpb25fcnRsTW92ZVZpc3VhbGx5Ij48Y29kZT48c3Ryb25nPnJ0bE1vdmVWaXN1YWxseTwvc3Ryb25nPjogYm9vbGVhbjwvY29kZT48L2R0PgogICAgICA8ZGQ+RGV0ZXJtaW5lcyB3aGV0aGVyIGhvcml6b250YWwgY3Vyc29yIG1vdmVtZW50IHRocm91Z2gKICAgICAgcmlnaHQtdG8tbGVmdCAoQXJhYmljLCBIZWJyZXcpIHRleHQgaXMgdmlzdWFsIChwcmVzc2luZyB0aGUgbGVmdAogICAgICBhcnJvdyBtb3ZlcyB0aGUgY3Vyc29yIGxlZnQpIG9yIGxvZ2ljYWwgKHByZXNzaW5nIHRoZSBsZWZ0IGFycm93CiAgICAgIG1vdmVzIHRvIHRoZSBuZXh0IGxvd2VyIGluZGV4IGluIHRoZSBzdHJpbmcsIHdoaWNoIGlzIHZpc3VhbGx5CiAgICAgIHJpZ2h0IGluIHJpZ2h0LXRvLWxlZnQgdGV4dCkuIFRoZSBkZWZhdWx0IGlzIDxjb2RlPmZhbHNlPC9jb2RlPgogICAgICBvbiBXaW5kb3dzLCBhbmQgPGNvZGU+dHJ1ZTwvY29kZT4gb24gb3RoZXIgcGxhdGZvcm1zLjwvZGQ+CgogICAgICA8ZHQgaWQ9Im9wdGlvbl9rZXlNYXAiPjxjb2RlPjxzdHJvbmc+a2V5TWFwPC9zdHJvbmc+OiBzdHJpbmc8L2NvZGU+PC9kdD4KICAgICAgPGRkPkNvbmZpZ3VyZXMgdGhlIGtleSBtYXAgdG8gdXNlLiBUaGUgZGVmYXVsdAogICAgICBpcyA8Y29kZT4iZGVmYXVsdCI8L2NvZGU+LCB3aGljaCBpcyB0aGUgb25seSBrZXkgbWFwIGRlZmluZWQKICAgICAgaW4gPGNvZGU+Y29kZW1pcnJvci5qczwvY29kZT4gaXRzZWxmLiBFeHRyYSBrZXkgbWFwcyBhcmUgZm91bmQgaW4KICAgICAgdGhlIDxhIGhyZWY9Ii4uL2tleW1hcC8iPjxjb2RlPmtleSBtYXA8L2NvZGU+PC9hPiBkaXJlY3RvcnkuIFNlZQogICAgICB0aGUgPGEgaHJlZj0iI2tleW1hcHMiPnNlY3Rpb24gb24ga2V5IG1hcHM8L2E+IGZvciBtb3JlCiAgICAgIGluZm9ybWF0aW9uLjwvZGQ+CgogICAgICA8ZHQgaWQ9Im9wdGlvbl9leHRyYUtleXMiPjxjb2RlPjxzdHJvbmc+ZXh0cmFLZXlzPC9zdHJvbmc+OiBvYmplY3Q8L2NvZGU+PC9kdD4KICAgICAgPGRkPkNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgZXh0cmEga2V5IGJpbmRpbmdzIGZvciB0aGUgZWRpdG9yLAogICAgICBhbG9uZ3NpZGUgdGhlIG9uZXMgZGVmaW5lZAogICAgICBieSA8YSBocmVmPSIjb3B0aW9uX2tleU1hcCI+PGNvZGU+a2V5TWFwPC9jb2RlPjwvYT4uIFNob3VsZCBiZQogICAgICBlaXRoZXIgbnVsbCwgb3IgYSB2YWxpZCA8YSBocmVmPSIja2V5bWFwcyI+a2V5IG1hcDwvYT4gdmFsdWUuPC9kZD4KCiAgICAgIDxkdCBpZD0ib3B0aW9uX2xpbmVXcmFwcGluZyI+PGNvZGU+PHN0cm9uZz5saW5lV3JhcHBpbmc8L3N0cm9uZz46IGJvb2xlYW48L2NvZGU+PC9kdD4KICAgICAgPGRkPldoZXRoZXIgQ29kZU1pcnJvciBzaG91bGQgc2Nyb2xsIG9yIHdyYXAgZm9yIGxvbmcgbGluZXMuCiAgICAgIERlZmF1bHRzIHRvIDxjb2RlPmZhbHNlPC9jb2RlPiAoc2Nyb2xsKS48L2RkPgoKICAgICAgPGR0IGlkPSJvcHRpb25fbGluZU51bWJlcnMiPjxjb2RlPjxzdHJvbmc+bGluZU51bWJlcnM8L3N0cm9uZz46IGJvb2xlYW48L2NvZGU+PC9kdD4KICAgICAgPGRkPldoZXRoZXIgdG8gc2hvdyBsaW5lIG51bWJlcnMgdG8gdGhlIGxlZnQgb2YgdGhlIGVkaXRvci48L2RkPgoKICAgICAgPGR0IGlkPSJvcHRpb25fZmlyc3RMaW5lTnVtYmVyIj48Y29kZT48c3Ryb25nPmZpcnN0TGluZU51bWJlcjwvc3Ryb25nPjogaW50ZWdlcjwvY29kZT48L2R0PgogICAgICA8ZGQ+QXQgd2hpY2ggbnVtYmVyIHRvIHN0YXJ0IGNvdW50aW5nIGxpbmVzLiBEZWZhdWx0IGlzIDEuPC9kZD4KCiAgICAgIDxkdCBpZD0ib3B0aW9uX2xpbmVOdW1iZXJGb3JtYXR0ZXIiPjxjb2RlPjxzdHJvbmc+bGluZU51bWJlckZvcm1hdHRlcjwvc3Ryb25nPjogZnVuY3Rpb24obGluZTogaW50ZWdlcikg4oaSIHN0cmluZzwvY29kZT48L2R0PgogICAgICA8ZGQ+QSBmdW5jdGlvbiB1c2VkIHRvIGZvcm1hdCBsaW5lIG51bWJlcnMuIFRoZSBmdW5jdGlvbiBpcwogICAgICBwYXNzZWQgdGhlIGxpbmUgbnVtYmVyLCBhbmQgc2hvdWxkIHJldHVybiBhIHN0cmluZyB0aGF0IHdpbGwgYmUKICAgICAgc2hvd24gaW4gdGhlIGd1dHRlci48L2RkPgoKICAgICAgPGR0IGlkPSJvcHRpb25fZ3V0dGVycyI+PGNvZGU+PHN0cm9uZz5ndXR0ZXJzPC9zdHJvbmc+OiBhcnJheSZsdDtzdHJpbmcmZ3Q7PC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5DYW4gYmUgdXNlZCB0byBhZGQgZXh0cmEgZ3V0dGVycyAoYmV5b25kIG9yIGluc3RlYWQgb2YgdGhlCiAgICAgIGxpbmUgbnVtYmVyIGd1dHRlcikuIFNob3VsZCBiZSBhbiBhcnJheSBvZiBDU1MgY2xhc3MgbmFtZXMsIGVhY2gKICAgICAgb2Ygd2hpY2ggZGVmaW5lcyBhIDxjb2RlPndpZHRoPC9jb2RlPiAoYW5kIG9wdGlvbmFsbHkgYQogICAgICBiYWNrZ3JvdW5kKSwgYW5kIHdoaWNoIHdpbGwgYmUgdXNlZCB0byBkcmF3IHRoZSBiYWNrZ3JvdW5kIG9mCiAgICAgIHRoZSBndXR0ZXJzLiA8ZW0+TWF5PC9lbT4gaW5jbHVkZQogICAgICB0aGUgPGNvZGU+Q29kZU1pcnJvci1saW5lbnVtYmVyczwvY29kZT4gY2xhc3MsIGluIG9yZGVyIHRvCiAgICAgIGV4cGxpY2l0bHkgc2V0IHRoZSBwb3NpdGlvbiBvZiB0aGUgbGluZSBudW1iZXIgZ3V0dGVyIChpdCB3aWxsCiAgICAgIGRlZmF1bHQgdG8gYmUgdG8gdGhlIHJpZ2h0IG9mIGFsbCBvdGhlciBndXR0ZXJzKS4gVGhlc2UgY2xhc3MKICAgICAgbmFtZXMgYXJlIHRoZSBrZXlzIHBhc3NlZAogICAgICB0byA8YSBocmVmPSIjc2V0R3V0dGVyTWFya2VyIj48Y29kZT5zZXRHdXR0ZXJNYXJrZXI8L2NvZGU+PC9hPi48L2RkPgoKICAgICAgPGR0IGlkPSJvcHRpb25fZml4ZWRHdXR0ZXIiPjxjb2RlPjxzdHJvbmc+Zml4ZWRHdXR0ZXI8L3N0cm9uZz46IGJvb2xlYW48L2NvZGU+PC9kdD4KICAgICAgPGRkPkRldGVybWluZXMgd2hldGhlciB0aGUgZ3V0dGVyIHNjcm9sbHMgYWxvbmcgd2l0aCB0aGUgY29udGVudAogICAgICBob3Jpem9udGFsbHkgKGZhbHNlKSBvciB3aGV0aGVyIGl0IHN0YXlzIGZpeGVkIGR1cmluZyBob3Jpem9udGFsCiAgICAgIHNjcm9sbGluZyAodHJ1ZSwgdGhlIGRlZmF1bHQpLjwvZGQ+CgogICAgICA8ZHQgaWQ9Im9wdGlvbl9zY3JvbGxiYXJTdHlsZSI+PGNvZGU+PHN0cm9uZz5zY3JvbGxiYXJTdHlsZTwvc3Ryb25nPjogc3RyaW5nPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5DaG9vc2VzIGEgc2Nyb2xsYmFyIGltcGxlbWVudGF0aW9uLiBUaGUgZGVmYXVsdAogICAgICBpcyA8Y29kZT4ibmF0aXZlIjwvY29kZT4sIHNob3dpbmcgbmF0aXZlIHNjcm9sbGJhcnMuIFRoZSBjb3JlCiAgICAgIGxpYnJhcnkgYWxzbyBwcm92aWRlcyB0aGUgPGNvZGU+Im51bGwiPC9jb2RlPiBzdHlsZSwgd2hpY2gKICAgICAgY29tcGxldGVseSBoaWRlcyB0aGUKICAgICAgc2Nyb2xsYmFycy4gPGEgaHJlZj0iI2FkZG9uX3NpbXBsZXNjcm9sbGJhcnMiPkFkZG9uczwvYT4gY2FuCiAgICAgIGltcGxlbWVudCBhZGRpdGlvbmFsIHNjcm9sbGJhciBtb2RlbHMuPC9kZD4KCiAgICAgIDxkdCBpZD0ib3B0aW9uX2NvdmVyR3V0dGVyTmV4dFRvU2Nyb2xsYmFyIj48Y29kZT48c3Ryb25nPmNvdmVyR3V0dGVyTmV4dFRvU2Nyb2xsYmFyPC9zdHJvbmc+OiBib29sZWFuPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5XaGVuIDxhIGhyZWY9IiNvcHRpb25fZml4ZWRHdXR0ZXIiPjxjb2RlPmZpeGVkR3V0dGVyPC9jb2RlPjwvYT4KICAgICAgaXMgb24sIGFuZCB0aGVyZSBpcyBhIGhvcml6b250YWwgc2Nyb2xsYmFyLCBieSBkZWZhdWx0IHRoZQogICAgICBndXR0ZXIgd2lsbCBiZSB2aXNpYmxlIHRvIHRoZSBsZWZ0IG9mIHRoaXMgc2Nyb2xsYmFyLiBJZiB0aGlzCiAgICAgIG9wdGlvbiBpcyBzZXQgdG8gdHJ1ZSwgaXQgd2lsbCBiZSBjb3ZlcmVkIGJ5IGFuIGVsZW1lbnQgd2l0aAogICAgICBjbGFzcyA8Y29kZT5Db2RlTWlycm9yLWd1dHRlci1maWxsZXI8L2NvZGU+LjwvZGQ+CgogICAgICA8ZHQgaWQ9Im9wdGlvbl9pbnB1dFN0eWxlIj48Y29kZT48c3Ryb25nPmlucHV0U3R5bGU8L3N0cm9uZz46IHN0cmluZzwvY29kZT48L2R0PgogICAgICA8ZGQ+U2VsZWN0cyB0aGUgd2F5IENvZGVNaXJyb3IgaGFuZGxlcyBpbnB1dCBhbmQgZm9jdXMuIFRoZSBjb3JlCiAgICAgIGxpYnJhcnkgZGVmaW5lcyB0aGUgPGNvZGU+InRleHRhcmVhIjwvY29kZT4KICAgICAgYW5kIDxjb2RlPiJjb250ZW50ZWRpdGFibGUiPC9jb2RlPiBpbnB1dCBtb2RlbHMuIE9uIG1vYmlsZQogICAgICBicm93c2VycywgdGhlIGRlZmF1bHQgaXMgPGNvZGU+ImNvbnRlbnRlZGl0YWJsZSI8L2NvZGU+LiBPbgogICAgICBkZXNrdG9wIGJyb3dzZXJzLCB0aGUgZGVmYXVsdCBpcyA8Y29kZT4idGV4dGFyZWEiPC9jb2RlPi4KICAgICAgU3VwcG9ydCBmb3IgSU1FIGFuZCBzY3JlZW4gcmVhZGVycyBpcyBiZXR0ZXIgaW4KICAgICAgdGhlIDxjb2RlPiJjb250ZW50ZWRpdGFibGUiPC9jb2RlPiBtb2RlbC4gVGhlIGludGVudGlvbiBpcyB0bwogICAgICBtYWtlIGl0IHRoZSBkZWZhdWx0IG9uIG1vZGVybiBkZXNrdG9wIGJyb3dzZXJzIGluIHRoZQogICAgICBmdXR1cmUuPC9kZD4KCiAgICAgIDxkdCBpZD0ib3B0aW9uX3JlYWRPbmx5Ij48Y29kZT48c3Ryb25nPnJlYWRPbmx5PC9zdHJvbmc+OiBib29sZWFufHN0cmluZzwvY29kZT48L2R0PgogICAgICA8ZGQ+VGhpcyBkaXNhYmxlcyBlZGl0aW5nIG9mIHRoZSBlZGl0b3IgY29udGVudCBieSB0aGUgdXNlci4gSWYKICAgICAgdGhlIHNwZWNpYWwgdmFsdWUgPGNvZGU+Im5vY3Vyc29yIjwvY29kZT4gaXMgZ2l2ZW4gKGluc3RlYWQgb2YKICAgICAgc2ltcGx5IDxjb2RlPnRydWU8L2NvZGU+KSwgZm9jdXNpbmcgb2YgdGhlIGVkaXRvciBpcyBhbHNvCiAgICAgIGRpc2FsbG93ZWQuPC9kZD4KCiAgICAgIDxkdCBpZD0ib3B0aW9uX3Nob3dDdXJzb3JXaGVuU2VsZWN0aW5nIj48Y29kZT48c3Ryb25nPnNob3dDdXJzb3JXaGVuU2VsZWN0aW5nPC9zdHJvbmc+OiBib29sZWFuPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5XaGV0aGVyIHRoZSBjdXJzb3Igc2hvdWxkIGJlIGRyYXduIHdoZW4gYSBzZWxlY3Rpb24gaXMKICAgICAgYWN0aXZlLiBEZWZhdWx0cyB0byBmYWxzZS48L2RkPgoKICAgICAgPGR0IGlkPSJvcHRpb25fbGluZVdpc2VDb3B5Q3V0Ij48Y29kZT48c3Ryb25nPmxpbmVXaXNlQ29weUN1dDwvc3Ryb25nPjogYm9vbGVhbjwvY29kZT48L2R0PgogICAgICA8ZGQ+V2hlbiBlbmFibGVkLCB3aGljaCBpcyB0aGUgZGVmYXVsdCwgZG9pbmcgY29weSBvciBjdXQgd2hlbgogICAgICB0aGVyZSBpcyBubyBzZWxlY3Rpb24gd2lsbCBjb3B5IG9yIGN1dCB0aGUgd2hvbGUgbGluZXMgdGhhdCBoYXZlCiAgICAgIGN1cnNvcnMgb24gdGhlbS48L2RkPgoKICAgICAgPGR0IGlkPSJvcHRpb25fdW5kb0RlcHRoIj48Y29kZT48c3Ryb25nPnVuZG9EZXB0aDwvc3Ryb25nPjogaW50ZWdlcjwvY29kZT48L2R0PgogICAgICA8ZGQ+VGhlIG1heGltdW0gbnVtYmVyIG9mIHVuZG8gbGV2ZWxzIHRoYXQgdGhlIGVkaXRvciBzdG9yZXMuCiAgICAgIE5vdGUgdGhhdCB0aGlzIGluY2x1ZGVzIHNlbGVjdGlvbiBjaGFuZ2UgZXZlbnRzLiBEZWZhdWx0cyB0bwogICAgICAyMDAuPC9kZD4KCiAgICAgIDxkdCBpZD0ib3B0aW9uX2hpc3RvcnlFdmVudERlbGF5Ij48Y29kZT48c3Ryb25nPmhpc3RvcnlFdmVudERlbGF5PC9zdHJvbmc+OiBpbnRlZ2VyPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5UaGUgcGVyaW9kIG9mIGluYWN0aXZpdHkgKGluIG1pbGxpc2Vjb25kcykgdGhhdCB3aWxsIGNhdXNlIGEKICAgICAgbmV3IGhpc3RvcnkgZXZlbnQgdG8gYmUgc3RhcnRlZCB3aGVuIHR5cGluZyBvciBkZWxldGluZy4KICAgICAgRGVmYXVsdHMgdG8gMTI1MC48L2RkPgoKICAgICAgPGR0IGlkPSJvcHRpb25fdGFiaW5kZXgiPjxjb2RlPjxzdHJvbmc+dGFiaW5kZXg8L3N0cm9uZz46IGludGVnZXI8L2NvZGU+PC9kdD4KICAgICAgPGRkPlRoZSA8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNDAxL2ludGVyYWN0L2Zvcm1zLmh0bWwjYWRlZi10YWJpbmRleCI+dGFiCiAgICAgIGluZGV4PC9hPiB0byBhc3NpZ24gdG8gdGhlIGVkaXRvci4gSWYgbm90IGdpdmVuLCBubyB0YWIgaW5kZXgKICAgICAgd2lsbCBiZSBhc3NpZ25lZC48L2RkPgoKICAgICAgPGR0IGlkPSJvcHRpb25fYXV0b2ZvY3VzIj48Y29kZT48c3Ryb25nPmF1dG9mb2N1czwvc3Ryb25nPjogYm9vbGVhbjwvY29kZT48L2R0PgogICAgICA8ZGQ+Q2FuIGJlIHVzZWQgdG8gbWFrZSBDb2RlTWlycm9yIGZvY3VzIGl0c2VsZiBvbgogICAgICBpbml0aWFsaXphdGlvbi4gRGVmYXVsdHMgdG8gb2ZmLgogICAgICBXaGVuIDxhIGhyZWY9IiNmcm9tVGV4dEFyZWEiPjxjb2RlPmZyb21UZXh0QXJlYTwvY29kZT48L2E+IGlzCiAgICAgIHVzZWQsIGFuZCBubyBleHBsaWNpdCB2YWx1ZSBpcyBnaXZlbiBmb3IgdGhpcyBvcHRpb24sIGl0IHdpbGwgYmUKICAgICAgc2V0IHRvIHRydWUgd2hlbiBlaXRoZXIgdGhlIHNvdXJjZSB0ZXh0YXJlYSBpcyBmb2N1c2VkLCBvciBpdAogICAgICBoYXMgYW4gPGNvZGU+YXV0b2ZvY3VzPC9jb2RlPiBhdHRyaWJ1dGUgYW5kIG5vIG90aGVyIGVsZW1lbnQgaXMKICAgICAgZm9jdXNlZC48L2RkPgogICAgPC9kbD4KCiAgICA8cD5CZWxvdyB0aGlzIGEgZmV3IG1vcmUgc3BlY2lhbGl6ZWQsIGxvdy1sZXZlbCBvcHRpb25zIGFyZQogICAgbGlzdGVkLiBUaGVzZSBhcmUgb25seSB1c2VmdWwgaW4gdmVyeSBzcGVjaWZpYyBzaXR1YXRpb25zLCB5b3UKICAgIG1pZ2h0IHdhbnQgdG8gc2tpcCB0aGVtIHRoZSBmaXJzdCB0aW1lIHlvdSByZWFkIHRoaXMgbWFudWFsLjwvcD4KCiAgICA8ZGw+CiAgICAgIDxkdCBpZD0ib3B0aW9uX2RyYWdEcm9wIj48Y29kZT48c3Ryb25nPmRyYWdEcm9wPC9zdHJvbmc+OiBib29sZWFuPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5Db250cm9scyB3aGV0aGVyIGRyYWctYW5kLWRyb3AgaXMgZW5hYmxlZC4gT24gYnkgZGVmYXVsdC48L2RkPgoKICAgICAgPGR0IGlkPSJvcHRpb25fYWxsb3dEcm9wRmlsZVR5cGVzIj48Y29kZT48c3Ryb25nPmFsbG93RHJvcEZpbGVUeXBlczwvc3Ryb25nPjogYXJyYXkmbHQ7c3RyaW5nJmd0OzwvY29kZT48L2R0PgogICAgICA8ZGQ+V2hlbiBzZXQgKGRlZmF1bHQgaXMgPGNvZGU+bnVsbDwvY29kZT4pIG9ubHkgZmlsZXMgd2hvc2UKICAgICAgdHlwZSBpcyBpbiB0aGUgYXJyYXkgY2FuIGJlIGRyb3BwZWQgaW50byB0aGUgZWRpdG9yLiBUaGUgc3RyaW5ncwogICAgICBzaG91bGQgYmUgTUlNRSB0eXBlcywgYW5kIHdpbGwgYmUgY2hlY2tlZCBhZ2FpbnN0CiAgICAgIHRoZSA8YSBocmVmPSJodHRwczovL3czYy5naXRodWIuaW8vRmlsZUFQSS8jZGZuLXR5cGUiPjxjb2RlPnR5cGU8L2NvZGU+PC9hPgogICAgICBvZiB0aGUgPGNvZGU+RmlsZTwvY29kZT4gb2JqZWN0IGFzIHJlcG9ydGVkIGJ5IHRoZSBicm93c2VyLjwvZGQ+CgogICAgICA8ZHQgaWQ9Im9wdGlvbl9jdXJzb3JCbGlua1JhdGUiPjxjb2RlPjxzdHJvbmc+Y3Vyc29yQmxpbmtSYXRlPC9zdHJvbmc+OiBudW1iZXI8L2NvZGU+PC9kdD4KICAgICAgPGRkPkhhbGYtcGVyaW9kIGluIG1pbGxpc2Vjb25kcyB1c2VkIGZvciBjdXJzb3IgYmxpbmtpbmcuIFRoZSBkZWZhdWx0IGJsaW5rCiAgICAgIHJhdGUgaXMgNTMwbXMuIEJ5IHNldHRpbmcgdGhpcyB0byB6ZXJvLCBibGlua2luZyBjYW4gYmUgZGlzYWJsZWQuIEEKICAgICAgbmVnYXRpdmUgdmFsdWUgaGlkZXMgdGhlIGN1cnNvciBlbnRpcmVseS48L2RkPgoKICAgICAgPGR0IGlkPSJvcHRpb25fY3Vyc29yU2Nyb2xsTWFyZ2luIj48Y29kZT48c3Ryb25nPmN1cnNvclNjcm9sbE1hcmdpbjwvc3Ryb25nPjogbnVtYmVyPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5Ib3cgbXVjaCBleHRyYSBzcGFjZSB0byBhbHdheXMga2VlcCBhYm92ZSBhbmQgYmVsb3cgdGhlCiAgICAgIGN1cnNvciB3aGVuIGFwcHJvYWNoaW5nIHRoZSB0b3Agb3IgYm90dG9tIG9mIHRoZSB2aXNpYmxlIHZpZXcgaW4KICAgICAgYSBzY3JvbGxhYmxlIGRvY3VtZW50LiBEZWZhdWx0IGlzIDAuPC9kZD4KCiAgICAgIDxkdCBpZD0ib3B0aW9uX2N1cnNvckhlaWdodCI+PGNvZGU+PHN0cm9uZz5jdXJzb3JIZWlnaHQ8L3N0cm9uZz46IG51bWJlcjwvY29kZT48L2R0PgogICAgICA8ZGQ+RGV0ZXJtaW5lcyB0aGUgaGVpZ2h0IG9mIHRoZSBjdXJzb3IuIERlZmF1bHQgaXMgMSwgbWVhbmluZwogICAgICBpdCBzcGFucyB0aGUgd2hvbGUgaGVpZ2h0IG9mIHRoZSBsaW5lLiBGb3Igc29tZSBmb250cyAoYW5kIGJ5CiAgICAgIHNvbWUgdGFzdGVzKSBhIHNtYWxsZXIgaGVpZ2h0IChmb3IgZXhhbXBsZSA8Y29kZT4wLjg1PC9jb2RlPiksCiAgICAgIHdoaWNoIGNhdXNlcyB0aGUgY3Vyc29yIHRvIG5vdCByZWFjaCBhbGwgdGhlIHdheSB0byB0aGUgYm90dG9tCiAgICAgIG9mIHRoZSBsaW5lLCBsb29rcyBiZXR0ZXI8L2RkPgoKICAgICAgPGR0IGlkPSJvcHRpb25fcmVzZXRTZWxlY3Rpb25PbkNvbnRleHRNZW51Ij48Y29kZT48c3Ryb25nPnJlc2V0U2VsZWN0aW9uT25Db250ZXh0TWVudTwvc3Ryb25nPjogYm9vbGVhbjwvY29kZT48L2R0PgogICAgICA8ZGQ+Q29udHJvbHMgd2hldGhlciwgd2hlbiB0aGUgY29udGV4dCBtZW51IGlzIG9wZW5lZCB3aXRoIGEKICAgICAgY2xpY2sgb3V0c2lkZSBvZiB0aGUgY3VycmVudCBzZWxlY3Rpb24sIHRoZSBjdXJzb3IgaXMgbW92ZWQgdG8KICAgICAgdGhlIHBvaW50IG9mIHRoZSBjbGljay4gRGVmYXVsdHMgdG8gPGNvZGU+dHJ1ZTwvY29kZT4uPC9kZD4KCiAgICAgIDxkdCBpZD0ib3B0aW9uX3dvcmtUaW1lIj48Y29kZSBpZD0ib3B0aW9uX3dvcmRrRGVsYXkiPjxzdHJvbmc+d29ya1RpbWU8L3N0cm9uZz4sIDxzdHJvbmc+d29ya0RlbGF5PC9zdHJvbmc+OiBudW1iZXI8L2NvZGU+PC9kdD4KICAgICAgPGRkPkhpZ2hsaWdodGluZyBpcyBkb25lIGJ5IGEgcHNldWRvIGJhY2tncm91bmQtdGhyZWFkIHRoYXQgd2lsbAogICAgICB3b3JrIGZvciA8Y29kZT53b3JrVGltZTwvY29kZT4gbWlsbGlzZWNvbmRzLCBhbmQgdGhlbiB1c2UKICAgICAgdGltZW91dCB0byBzbGVlcCBmb3IgPGNvZGU+d29ya0RlbGF5PC9jb2RlPiBtaWxsaXNlY29uZHMuIFRoZQogICAgICBkZWZhdWx0cyBhcmUgMjAwIGFuZCAzMDAsIHlvdSBjYW4gY2hhbmdlIHRoZXNlIG9wdGlvbnMgdG8gbWFrZQogICAgICB0aGUgaGlnaGxpZ2h0aW5nIG1vcmUgb3IgbGVzcyBhZ2dyZXNzaXZlLjwvZGQ+CgogICAgICA8ZHQgaWQ9Im9wdGlvbl9wb2xsSW50ZXJ2YWwiPjxjb2RlPjxzdHJvbmc+cG9sbEludGVydmFsPC9zdHJvbmc+OiBudW1iZXI8L2NvZGU+PC9kdD4KICAgICAgPGRkPkluZGljYXRlcyBob3cgcXVpY2tseSBDb2RlTWlycm9yIHNob3VsZCBwb2xsIGl0cyBpbnB1dAogICAgICB0ZXh0YXJlYSBmb3IgY2hhbmdlcyAod2hlbiBmb2N1c2VkKS4gTW9zdCBpbnB1dCBpcyBjYXB0dXJlZCBieQogICAgICBldmVudHMsIGJ1dCBzb21lIHRoaW5ncywgbGlrZSBJTUUgaW5wdXQgb24gc29tZSBicm93c2VycywgZG9uJ3QKICAgICAgZ2VuZXJhdGUgZXZlbnRzIHRoYXQgYWxsb3cgQ29kZU1pcnJvciB0byBwcm9wZXJseSBkZXRlY3QgaXQuCiAgICAgIFRodXMsIGl0IHBvbGxzLiBEZWZhdWx0IGlzIDEwMCBtaWxsaXNlY29uZHMuPC9kZD4KCiAgICAgIDxkdCBpZD0ib3B0aW9uX2ZsYXR0ZW5TcGFucyI+PGNvZGU+PHN0cm9uZz5mbGF0dGVuU3BhbnM8L3N0cm9uZz46IGJvb2xlYW48L2NvZGU+PC9kdD4KICAgICAgPGRkPkJ5IGRlZmF1bHQsIENvZGVNaXJyb3Igd2lsbCBjb21iaW5lIGFkamFjZW50IHRva2VucyBpbnRvIGEKICAgICAgc2luZ2xlIHNwYW4gaWYgdGhleSBoYXZlIHRoZSBzYW1lIGNsYXNzLiBUaGlzIHdpbGwgcmVzdWx0IGluIGEKICAgICAgc2ltcGxlciBET00gdHJlZSwgYW5kIHRodXMgcGVyZm9ybSBiZXR0ZXIuIFdpdGggc29tZSBraW5kcyBvZgogICAgICBzdHlsaW5nIChzdWNoIGFzIHJvdW5kZWQgY29ybmVycyksIHRoaXMgd2lsbCBjaGFuZ2UgdGhlIHdheSB0aGUKICAgICAgZG9jdW1lbnQgbG9va3MuIFlvdSBjYW4gc2V0IHRoaXMgb3B0aW9uIHRvIGZhbHNlIHRvIGRpc2FibGUgdGhpcwogICAgICBiZWhhdmlvci48L2RkPgoKICAgICAgPGR0IGlkPSJvcHRpb25fYWRkTW9kZUNsYXNzIj48Y29kZT48c3Ryb25nPmFkZE1vZGVDbGFzczwvc3Ryb25nPjogYm9vbGVhbjwvY29kZT48L2R0PgogICAgICA8ZGQ+V2hlbiBlbmFibGVkIChvZmYgYnkgZGVmYXVsdCksIGFuIGV4dHJhIENTUyBjbGFzcyB3aWxsIGJlCiAgICAgIGFkZGVkIHRvIGVhY2ggdG9rZW4sIGluZGljYXRpbmcgdGhlCiAgICAgICg8YSBocmVmPSIjaW5uZXJNb2RlIj5pbm5lcjwvYT4pIG1vZGUgdGhhdCBwcm9kdWNlZCBpdCwgcHJlZml4ZWQKICAgICAgd2l0aCA8Y29kZT4iY20tbS0iPC9jb2RlPi4gRm9yIGV4YW1wbGUsIHRva2VucyBmcm9tIHRoZSBYTUwgbW9kZQogICAgICB3aWxsIGdldCB0aGUgPGNvZGU+Y20tbS14bWw8L2NvZGU+IGNsYXNzLjwvZGQ+CgogICAgICA8ZHQgaWQ9Im9wdGlvbl9tYXhIaWdobGlnaHRMZW5ndGgiPjxjb2RlPjxzdHJvbmc+bWF4SGlnaGxpZ2h0TGVuZ3RoPC9zdHJvbmc+OiBudW1iZXI8L2NvZGU+PC9kdD4KICAgICAgPGRkPldoZW4gaGlnaGxpZ2h0aW5nIGxvbmcgbGluZXMsIGluIG9yZGVyIHRvIHN0YXkgcmVzcG9uc2l2ZSwKICAgICAgdGhlIGVkaXRvciB3aWxsIGdpdmUgdXAgYW5kIHNpbXBseSBzdHlsZSB0aGUgcmVzdCBvZiB0aGUgbGluZSBhcwogICAgICBwbGFpbiB0ZXh0IHdoZW4gaXQgcmVhY2hlcyBhIGNlcnRhaW4gcG9zaXRpb24uIFRoZSBkZWZhdWx0IGlzCiAgICAgIDEwIDAwMC4gWW91IGNhbiBzZXQgdGhpcyB0byA8Y29kZT5JbmZpbml0eTwvY29kZT4gdG8gdHVybiBvZmYKICAgICAgdGhpcyBiZWhhdmlvci48L2RkPgoKICAgICAgPGR0IGlkPSJvcHRpb25fdmlld3BvcnRNYXJnaW4iPjxjb2RlPjxzdHJvbmc+dmlld3BvcnRNYXJnaW48L3N0cm9uZz46IGludGVnZXI8L2NvZGU+PC9kdD4KICAgICAgPGRkPlNwZWNpZmllcyB0aGUgYW1vdW50IG9mIGxpbmVzIHRoYXQgYXJlIHJlbmRlcmVkIGFib3ZlIGFuZAogICAgICBiZWxvdyB0aGUgcGFydCBvZiB0aGUgZG9jdW1lbnQgdGhhdCdzIGN1cnJlbnRseSBzY3JvbGxlZCBpbnRvCiAgICAgIHZpZXcuIFRoaXMgYWZmZWN0cyB0aGUgYW1vdW50IG9mIHVwZGF0ZXMgbmVlZGVkIHdoZW4gc2Nyb2xsaW5nLAogICAgICBhbmQgdGhlIGFtb3VudCBvZiB3b3JrIHRoYXQgc3VjaCBhbiB1cGRhdGUgZG9lcy4gWW91IHNob3VsZAogICAgICB1c3VhbGx5IGxlYXZlIGl0IGF0IGl0cyBkZWZhdWx0LCAxMC4gQ2FuIGJlIHNldAogICAgICB0byA8Y29kZT5JbmZpbml0eTwvY29kZT4gdG8gbWFrZSBzdXJlIHRoZSB3aG9sZSBkb2N1bWVudCBpcwogICAgICBhbHdheXMgcmVuZGVyZWQsIGFuZCB0aHVzIHRoZSBicm93c2VyJ3MgdGV4dCBzZWFyY2ggd29ya3Mgb24gaXQuCiAgICAgIFRoaXMgPGVtPndpbGw8L2VtPiBoYXZlIGJhZCBlZmZlY3RzIG9uIHBlcmZvcm1hbmNlIG9mIGJpZwogICAgICBkb2N1bWVudHMuPC9kZD4KICAgIDwvZGw+Cjwvc2VjdGlvbj4KCjxzZWN0aW9uIGlkPWV2ZW50cz4KICAgIDxoMj5FdmVudHM8L2gyPgoKICAgIDxwPlZhcmlvdXMgQ29kZU1pcnJvci1yZWxhdGVkIG9iamVjdHMgZW1pdCBldmVudHMsIHdoaWNoIGFsbG93CiAgICBjbGllbnQgY29kZSB0byByZWFjdCB0byB2YXJpb3VzIHNpdHVhdGlvbnMuIEhhbmRsZXJzIGZvciBzdWNoCiAgICBldmVudHMgY2FuIGJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgPGEgaHJlZj0iI29uIj48Y29kZT5vbjwvY29kZT48L2E+CiAgICBhbmQgPGEgaHJlZj0iI29mZiI+PGNvZGU+b2ZmPC9jb2RlPjwvYT4gbWV0aG9kcyBvbiB0aGUgb2JqZWN0cwogICAgdGhhdCB0aGUgZXZlbnQgZmlyZXMgb24uIFRvIGZpcmUgeW91ciBvd24gZXZlbnRzLAogICAgdXNlIDxjb2RlPkNvZGVNaXJyb3Iuc2lnbmFsKHRhcmdldCwgbmFtZSwgYXJncy4uLik8L2NvZGU+LAogICAgd2hlcmUgPGNvZGU+dGFyZ2V0PC9jb2RlPiBpcyBhIG5vbi1ET00tbm9kZSBvYmplY3QuPC9wPgoKICAgIDxwPkFuIGVkaXRvciBpbnN0YW5jZSBmaXJlcyB0aGUgZm9sbG93aW5nIGV2ZW50cy4KICAgIFRoZSA8Y29kZT5pbnN0YW5jZTwvY29kZT4gYXJndW1lbnQgYWx3YXlzIHJlZmVycyB0byB0aGUgZWRpdG9yCiAgICBpdHNlbGYuPC9wPgoKICAgIDxkbD4KICAgICAgPGR0IGlkPSJldmVudF9jaGFuZ2UiPjxjb2RlPjxzdHJvbmc+ImNoYW5nZSI8L3N0cm9uZz4gKGluc3RhbmNlOiBDb2RlTWlycm9yLCBjaGFuZ2VPYmo6IG9iamVjdCk8L2NvZGU+PC9kdD4KICAgICAgPGRkPkZpcmVzIGV2ZXJ5IHRpbWUgdGhlIGNvbnRlbnQgb2YgdGhlIGVkaXRvciBpcyBjaGFuZ2VkLgogICAgICBUaGUgPGNvZGU+Y2hhbmdlT2JqPC9jb2RlPiBpcyBhIDxjb2RlPntmcm9tLCB0bywgdGV4dCwgcmVtb3ZlZCwKICAgICAgb3JpZ2lufTwvY29kZT4gb2JqZWN0IGNvbnRhaW5pbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNoYW5nZXMKICAgICAgdGhhdCBvY2N1cnJlZCBhcyBzZWNvbmQgYXJndW1lbnQuIDxjb2RlPmZyb208L2NvZGU+CiAgICAgIGFuZCA8Y29kZT50bzwvY29kZT4gYXJlIHRoZSBwb3NpdGlvbnMgKGluIHRoZSBwcmUtY2hhbmdlCiAgICAgIGNvb3JkaW5hdGUgc3lzdGVtKSB3aGVyZSB0aGUgY2hhbmdlIHN0YXJ0ZWQgYW5kIGVuZGVkIChmb3IKICAgICAgZXhhbXBsZSwgaXQgbWlnaHQgYmUgPGNvZGU+e2NoOjAsIGxpbmU6MTh9PC9jb2RlPiBpZiB0aGUKICAgICAgcG9zaXRpb24gaXMgYXQgdGhlIGJlZ2lubmluZyBvZiBsaW5lICMxOSkuIDxjb2RlPnRleHQ8L2NvZGU+IGlzCiAgICAgIGFuIGFycmF5IG9mIHN0cmluZ3MgcmVwcmVzZW50aW5nIHRoZSB0ZXh0IHRoYXQgcmVwbGFjZWQgdGhlCiAgICAgIGNoYW5nZWQgcmFuZ2UgKHNwbGl0IGJ5IGxpbmUpLiA8Y29kZT5yZW1vdmVkPC9jb2RlPiBpcyB0aGUgdGV4dAogICAgICB0aGF0IHVzZWQgdG8gYmUgYmV0d2VlbiA8Y29kZT5mcm9tPC9jb2RlPiBhbmQgPGNvZGU+dG88L2NvZGU+LAogICAgICB3aGljaCBpcyBvdmVyd3JpdHRlbiBieSB0aGlzIGNoYW5nZS4gVGhpcyBldmVudCBpcwogICAgICBmaXJlZCA8ZW0+YmVmb3JlPC9lbT4gdGhlIGVuZCBvZgogICAgICBhbiA8YSBocmVmPSIjb3BlcmF0aW9uIj5vcGVyYXRpb248L2E+LCBiZWZvcmUgdGhlIERPTSB1cGRhdGVzCiAgICAgIGhhcHBlbi48L2RkPgoKICAgICAgPGR0IGlkPSJldmVudF9jaGFuZ2VzIj48Y29kZT48c3Ryb25nPiJjaGFuZ2VzIjwvc3Ryb25nPiAoaW5zdGFuY2U6IENvZGVNaXJyb3IsIGNoYW5nZXM6IGFycmF5Jmx0O29iamVjdCZndDspPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5MaWtlIHRoZSA8YSBocmVmPSIjZXZlbnRfY2hhbmdlIj48Y29kZT4iY2hhbmdlIjwvY29kZT48L2E+CiAgICAgIGV2ZW50LCBidXQgYmF0Y2hlZCBwZXIgPGEgaHJlZj0iI29wZXJhdGlvbiI+b3BlcmF0aW9uPC9hPiwKICAgICAgcGFzc2luZyBhbiBhcnJheSBjb250YWluaW5nIGFsbCB0aGUgY2hhbmdlcyB0aGF0IGhhcHBlbmVkIGluIHRoZQogICAgICBvcGVyYXRpb24uIFRoaXMgZXZlbnQgaXMgZmlyZWQgYWZ0ZXIgdGhlIG9wZXJhdGlvbiBmaW5pc2hlZCwgYW5kCiAgICAgIGRpc3BsYXkgY2hhbmdlcyBpdCBtYWtlcyB3aWxsIHRyaWdnZXIgYSBuZXcgb3BlcmF0aW9uLjwvZGQ+CgogICAgICA8ZHQgaWQ9ImV2ZW50X2JlZm9yZUNoYW5nZSI+PGNvZGU+PHN0cm9uZz4iYmVmb3JlQ2hhbmdlIjwvc3Ryb25nPiAoaW5zdGFuY2U6IENvZGVNaXJyb3IsIGNoYW5nZU9iajogb2JqZWN0KTwvY29kZT48L2R0PgogICAgICA8ZGQ+VGhpcyBldmVudCBpcyBmaXJlZCBiZWZvcmUgYSBjaGFuZ2UgaXMgYXBwbGllZCwgYW5kIGl0cwogICAgICBoYW5kbGVyIG1heSBjaG9vc2UgdG8gbW9kaWZ5IG9yIGNhbmNlbCB0aGUgY2hhbmdlLgogICAgICBUaGUgPGNvZGU+Y2hhbmdlT2JqPC9jb2RlPiBvYmplY3QKICAgICAgaGFzIDxjb2RlPmZyb208L2NvZGU+LCA8Y29kZT50bzwvY29kZT4sIGFuZCA8Y29kZT50ZXh0PC9jb2RlPgogICAgICBwcm9wZXJ0aWVzLCBhcyB3aXRoCiAgICAgIHRoZSA8YSBocmVmPSIjZXZlbnRfY2hhbmdlIj48Y29kZT4iY2hhbmdlIjwvY29kZT48L2E+IGV2ZW50LiBJdAogICAgICBhbHNvIGhhcyBhIDxjb2RlPmNhbmNlbCgpPC9jb2RlPiBtZXRob2QsIHdoaWNoIGNhbiBiZSBjYWxsZWQgdG8KICAgICAgY2FuY2VsIHRoZSBjaGFuZ2UsIGFuZCwgPHN0cm9uZz5pZjwvc3Ryb25nPiB0aGUgY2hhbmdlIGlzbid0CiAgICAgIGNvbWluZyBmcm9tIGFuIHVuZG8gb3IgcmVkbyBldmVudCwgYW4gPGNvZGU+dXBkYXRlKGZyb20sIHRvLAogICAgICB0ZXh0KTwvY29kZT4gbWV0aG9kLCB3aGljaCBtYXkgYmUgdXNlZCB0byBtb2RpZnkgdGhlIGNoYW5nZS4KICAgICAgVW5kbyBvciByZWRvIGNoYW5nZXMgY2FuJ3QgYmUgbW9kaWZpZWQsIGJlY2F1c2UgdGhleSBob2xkIHNvbWUKICAgICAgbWV0YWluZm9ybWF0aW9uIGZvciByZXN0b3Jpbmcgb2xkIG1hcmtlZCByYW5nZXMgdGhhdCBpcyBvbmx5CiAgICAgIHZhbGlkIGZvciB0aGF0IHNwZWNpZmljIGNoYW5nZS4gQWxsIHRocmVlIGFyZ3VtZW50cwogICAgICB0byA8Y29kZT51cGRhdGU8L2NvZGU+IGFyZSBvcHRpb25hbCwgYW5kIGNhbiBiZSBsZWZ0IG9mZiB0bwogICAgICBsZWF2ZSB0aGUgZXhpc3RpbmcgdmFsdWUgZm9yIHRoYXQgZmllbGQKICAgICAgaW50YWN0LiA8c3Ryb25nPk5vdGU6PC9zdHJvbmc+IHlvdSBtYXkgbm90IGRvIGFueXRoaW5nIGZyb20KICAgICAgYSA8Y29kZT4iYmVmb3JlQ2hhbmdlIjwvY29kZT4gaGFuZGxlciB0aGF0IHdvdWxkIGNhdXNlIGNoYW5nZXMKICAgICAgdG8gdGhlIGRvY3VtZW50IG9yIGl0cyB2aXN1YWxpemF0aW9uLiBEb2luZyBzbyB3aWxsLCBzaW5jZSB0aGlzCiAgICAgIGhhbmRsZXIgaXMgY2FsbGVkIGRpcmVjdGx5IGZyb20gdGhlIGJvd2VscyBvZiB0aGUgQ29kZU1pcnJvcgogICAgICBpbXBsZW1lbnRhdGlvbiwgcHJvYmFibHkgY2F1c2UgdGhlIGVkaXRvciB0byBiZWNvbWUKICAgICAgY29ycnVwdGVkLjwvZGQ+CgogICAgICA8ZHQgaWQ9ImV2ZW50X2N1cnNvckFjdGl2aXR5Ij48Y29kZT48c3Ryb25nPiJjdXJzb3JBY3Rpdml0eSI8L3N0cm9uZz4gKGluc3RhbmNlOiBDb2RlTWlycm9yKTwvY29kZT48L2R0PgogICAgICA8ZGQ+V2lsbCBiZSBmaXJlZCB3aGVuIHRoZSBjdXJzb3Igb3Igc2VsZWN0aW9uIG1vdmVzLCBvciBhbnkKICAgICAgY2hhbmdlIGlzIG1hZGUgdG8gdGhlIGVkaXRvciBjb250ZW50LjwvZGQ+CgogICAgICA8ZHQgaWQ9ImV2ZW50X2tleUhhbmRsZWQiPjxjb2RlPjxzdHJvbmc+ImtleUhhbmRsZWQiPC9zdHJvbmc+IChpbnN0YW5jZTogQ29kZU1pcnJvciwgbmFtZTogc3RyaW5nLCBldmVudDogRXZlbnQpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5GaXJlZCBhZnRlciBhIGtleSBpcyBoYW5kbGVkIHRocm91Z2ggYQogICAgICBrZXkgbWFwLiA8Y29kZT5uYW1lPC9jb2RlPiBpcyB0aGUgbmFtZSBvZiB0aGUgaGFuZGxlZCBrZXkgKGZvcgogICAgICBleGFtcGxlIDxjb2RlPiJDdHJsLVgiPC9jb2RlPiBvciA8Y29kZT4iJ3EnIjwvY29kZT4pLAogICAgICBhbmQgPGNvZGU+ZXZlbnQ8L2NvZGU+IGlzIHRoZSBET00gPGNvZGU+a2V5ZG93bjwvY29kZT4KICAgICAgb3IgPGNvZGU+a2V5cHJlc3M8L2NvZGU+IGV2ZW50LjwvZGQ+CgogICAgICA8ZHQgaWQ9ImV2ZW50X2lucHV0UmVhZCI+PGNvZGU+PHN0cm9uZz4iaW5wdXRSZWFkIjwvc3Ryb25nPiAoaW5zdGFuY2U6IENvZGVNaXJyb3IsIGNoYW5nZU9iajogb2JqZWN0KTwvY29kZT48L2R0PgogICAgICA8ZGQ+RmlyZWQgd2hlbmV2ZXIgbmV3IGlucHV0IGlzIHJlYWQgZnJvbSB0aGUgaGlkZGVuIHRleHRhcmVhCiAgICAgICh0eXBlZCBvciBwYXN0ZWQgYnkgdGhlIHVzZXIpLjwvZGQ+CgogICAgICA8ZHQgaWQ9ImV2ZW50X2VsZWN0cmljSW5wdXQiPjxjb2RlPjxzdHJvbmc+ImVsZWN0cmljSW5wdXQiPC9zdHJvbmc+IChpbnN0YW5jZTogQ29kZU1pcnJvciwgbGluZTogaW50ZWdlcik8L2NvZGU+PC9kdD4KICAgICAgPGRkPkZpcmVkIGlmIHRleHQgaW5wdXQgbWF0Y2hlZCB0aGUKICAgICAgbW9kZSdzIDxhIGhyZWY9IiNvcHRpb25fZWxlY3RyaWNDaGFycyI+ZWxlY3RyaWM8L2E+IHBhdHRlcm5zLAogICAgICBhbmQgdGhpcyBjYXVzZWQgdGhlIGxpbmUncyBpbmRlbnRhdGlvbiB0byBjaGFuZ2UuPC9kZD4KCiAgICAgIDxkdCBpZD0iZXZlbnRfYmVmb3JlU2VsZWN0aW9uQ2hhbmdlIj48Y29kZT48c3Ryb25nPiJiZWZvcmVTZWxlY3Rpb25DaGFuZ2UiPC9zdHJvbmc+IChpbnN0YW5jZTogQ29kZU1pcnJvciwgb2JqOiB7cmFuZ2VzLCBvcmlnaW4sIHVwZGF0ZX0pPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5UaGlzIGV2ZW50IGlzIGZpcmVkIGJlZm9yZSB0aGUgc2VsZWN0aW9uIGlzIG1vdmVkLiBJdHMKICAgICAgaGFuZGxlciBtYXkgaW5zcGVjdCB0aGUgc2V0IG9mIHNlbGVjdGlvbiByYW5nZXMsIHByZXNlbnQgYXMgYW4KICAgICAgYXJyYXkgb2YgPGNvZGU+e2FuY2hvciwgaGVhZH08L2NvZGU+IG9iamVjdHMgaW4KICAgICAgdGhlIDxjb2RlPnJhbmdlczwvY29kZT4gcHJvcGVydHkgb2YgdGhlIDxjb2RlPm9iajwvY29kZT4KICAgICAgYXJndW1lbnQsIGFuZCBvcHRpb25hbGx5IGNoYW5nZSB0aGVtIGJ5IGNhbGxpbmcKICAgICAgdGhlIDxjb2RlPnVwZGF0ZTwvY29kZT4gbWV0aG9kIG9uIHRoaXMgb2JqZWN0LCBwYXNzaW5nIGFuIGFycmF5CiAgICAgIG9mIHJhbmdlcyBpbiB0aGUgc2FtZSBmb3JtYXQuIFRoZSBvYmplY3QgYWxzbyBjb250YWlucwogICAgICBhbiA8Y29kZT5vcmlnaW48L2NvZGU+IHByb3BlcnR5IGhvbGRpbmcgdGhlIG9yaWdpbiBzdHJpbmcgcGFzc2VkCiAgICAgIHRvIHRoZSBzZWxlY3Rpb24tY2hhbmdpbmcgbWV0aG9kLCBpZiBhbnkuIEhhbmRsZXJzIGZvciB0aGlzCiAgICAgIGV2ZW50IGhhdmUgdGhlIHNhbWUgcmVzdHJpY3Rpb24KICAgICAgYXMgPGEgaHJlZj0iI2V2ZW50X2JlZm9yZUNoYW5nZSI+PGNvZGU+ImJlZm9yZUNoYW5nZSI8L2NvZGU+PC9hPgogICAgICBoYW5kbGVycyDigJQgdGhleSBzaG91bGQgbm90IGRvIGFueXRoaW5nIHRvIGRpcmVjdGx5IHVwZGF0ZSB0aGUKICAgICAgc3RhdGUgb2YgdGhlIGVkaXRvci48L2RkPgoKICAgICAgPGR0IGlkPSJldmVudF92aWV3cG9ydENoYW5nZSI+PGNvZGU+PHN0cm9uZz4idmlld3BvcnRDaGFuZ2UiPC9zdHJvbmc+IChpbnN0YW5jZTogQ29kZU1pcnJvciwgZnJvbTogbnVtYmVyLCB0bzogbnVtYmVyKTwvY29kZT48L2R0PgogICAgICA8ZGQ+RmlyZXMgd2hlbmV2ZXIgdGhlIDxhIGhyZWY9IiNnZXRWaWV3cG9ydCI+dmlldyBwb3J0PC9hPiBvZgogICAgICB0aGUgZWRpdG9yIGNoYW5nZXMgKGR1ZSB0byBzY3JvbGxpbmcsIGVkaXRpbmcsIG9yIGFueSBvdGhlcgogICAgICBmYWN0b3IpLiBUaGUgPGNvZGU+ZnJvbTwvY29kZT4gYW5kIDxjb2RlPnRvPC9jb2RlPiBhcmd1bWVudHMKICAgICAgZ2l2ZSB0aGUgbmV3IHN0YXJ0IGFuZCBlbmQgb2YgdGhlIHZpZXdwb3J0LjwvZGQ+CgogICAgICA8ZHQgaWQ9ImV2ZW50X3N3YXBEb2MiPjxjb2RlPjxzdHJvbmc+InN3YXBEb2MiPC9zdHJvbmc+IChpbnN0YW5jZTogQ29kZU1pcnJvciwgb2xkRG9jOiBEb2MpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5UaGlzIGlzIHNpZ25hbGxlZCB3aGVuIHRoZSBlZGl0b3IncyBkb2N1bWVudCBpcyByZXBsYWNlZAogICAgICB1c2luZyB0aGUgPGEgaHJlZj0iI3N3YXBEb2MiPjxjb2RlPnN3YXBEb2M8L2NvZGU+PC9hPgogICAgICBtZXRob2QuPC9kZD4KCiAgICAgIDxkdCBpZD0iZXZlbnRfZ3V0dGVyQ2xpY2siPjxjb2RlPjxzdHJvbmc+Imd1dHRlckNsaWNrIjwvc3Ryb25nPiAoaW5zdGFuY2U6IENvZGVNaXJyb3IsIGxpbmU6IGludGVnZXIsIGd1dHRlcjogc3RyaW5nLCBjbGlja0V2ZW50OiBFdmVudCk8L2NvZGU+PC9kdD4KICAgICAgPGRkPkZpcmVzIHdoZW4gdGhlIGVkaXRvciBndXR0ZXIgKHRoZSBsaW5lLW51bWJlciBhcmVhKSBpcwogICAgICBjbGlja2VkLiBXaWxsIHBhc3MgdGhlIGVkaXRvciBpbnN0YW5jZSBhcyBmaXJzdCBhcmd1bWVudCwgdGhlCiAgICAgICh6ZXJvLWJhc2VkKSBudW1iZXIgb2YgdGhlIGxpbmUgdGhhdCB3YXMgY2xpY2tlZCBhcyBzZWNvbmQKICAgICAgYXJndW1lbnQsIHRoZSBDU1MgY2xhc3Mgb2YgdGhlIGd1dHRlciB0aGF0IHdhcyBjbGlja2VkIGFzIHRoaXJkCiAgICAgIGFyZ3VtZW50LCBhbmQgdGhlIHJhdyA8Y29kZT5tb3VzZWRvd248L2NvZGU+IGV2ZW50IG9iamVjdCBhcwogICAgICBmb3VydGggYXJndW1lbnQuPC9kZD4KCiAgICAgIDxkdCBpZD0iZXZlbnRfZ3V0dGVyQ29udGV4dE1lbnUiPjxjb2RlPjxzdHJvbmc+Imd1dHRlckNvbnRleHRNZW51Ijwvc3Ryb25nPiAoaW5zdGFuY2U6IENvZGVNaXJyb3IsIGxpbmU6IGludGVnZXIsIGd1dHRlcjogc3RyaW5nLCBjb250ZXh0TWVudTogRXZlbnQ6IEV2ZW50KTwvY29kZT48L2R0PgogICAgICA8ZGQ+RmlyZXMgd2hlbiB0aGUgZWRpdG9yIGd1dHRlciAodGhlIGxpbmUtbnVtYmVyIGFyZWEpCiAgICAgIHJlY2VpdmVzIGEgPGNvZGU+Y29udGV4dG1lbnU8L2NvZGU+IGV2ZW50LiBXaWxsIHBhc3MgdGhlIGVkaXRvcgogICAgICBpbnN0YW5jZSBhcyBmaXJzdCBhcmd1bWVudCwgdGhlICh6ZXJvLWJhc2VkKSBudW1iZXIgb2YgdGhlIGxpbmUKICAgICAgdGhhdCB3YXMgY2xpY2tlZCBhcyBzZWNvbmQgYXJndW1lbnQsIHRoZSBDU1MgY2xhc3Mgb2YgdGhlCiAgICAgIGd1dHRlciB0aGF0IHdhcyBjbGlja2VkIGFzIHRoaXJkIGFyZ3VtZW50LCBhbmQgdGhlIHJhdwogICAgICA8Y29kZT5jb250ZXh0bWVudTwvY29kZT4gbW91c2UgZXZlbnQgb2JqZWN0IGFzIGZvdXJ0aCBhcmd1bWVudC4KICAgICAgWW91IGNhbiA8Y29kZT5wcmV2ZW50RGVmYXVsdDwvY29kZT4gdGhlIGV2ZW50LCB0byBzaWduYWwgdGhhdAogICAgICBDb2RlTWlycm9yIHNob3VsZCBkbyBubyBmdXJ0aGVyIGhhbmRsaW5nLjwvZGQ+CgogICAgICA8ZHQgaWQ9ImV2ZW50X2ZvY3VzIj48Y29kZT48c3Ryb25nPiJmb2N1cyI8L3N0cm9uZz4gKGluc3RhbmNlOiBDb2RlTWlycm9yLCBldmVudDogRXZlbnQpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5GaXJlcyB3aGVuZXZlciB0aGUgZWRpdG9yIGlzIGZvY3VzZWQuPC9kZD4KCiAgICAgIDxkdCBpZD0iZXZlbnRfYmx1ciI+PGNvZGU+PHN0cm9uZz4iYmx1ciI8L3N0cm9uZz4gKGluc3RhbmNlOiBDb2RlTWlycm9yLCBldmVudDogRXZlbnQpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5GaXJlcyB3aGVuZXZlciB0aGUgZWRpdG9yIGlzIHVuZm9jdXNlZC48L2RkPgoKICAgICAgPGR0IGlkPSJldmVudF9zY3JvbGwiPjxjb2RlPjxzdHJvbmc+InNjcm9sbCI8L3N0cm9uZz4gKGluc3RhbmNlOiBDb2RlTWlycm9yKTwvY29kZT48L2R0PgogICAgICA8ZGQ+RmlyZXMgd2hlbiB0aGUgZWRpdG9yIGlzIHNjcm9sbGVkLjwvZGQ+CgogICAgICA8ZHQgaWQ9ImV2ZW50X3JlZnJlc2giPjxjb2RlPjxzdHJvbmc+InJlZnJlc2giPC9zdHJvbmc+IChpbnN0YW5jZTogQ29kZU1pcnJvcik8L2NvZGU+PC9kdD4KICAgICAgPGRkPkZpcmVzIHdoZW4gdGhlIGVkaXRvciBpcyA8YSBocmVmPSIjcmVmcmVzaCI+cmVmcmVzaGVkPC9hPgogICAgICBvciA8YSBocmVmPSIjc2V0U2l6ZSI+cmVzaXplZDwvYT4uIE1vc3RseSB1c2VmdWwgdG8gaW52YWxpZGF0ZQogICAgICBjYWNoZWQgdmFsdWVzIHRoYXQgZGVwZW5kIG9uIHRoZSBlZGl0b3Igb3IgY2hhcmFjdGVyIHNpemUuPC9kZD4KCiAgICAgIDxkdCBpZD0iZXZlbnRfc2Nyb2xsQ3Vyc29ySW50b1ZpZXciPjxjb2RlPjxzdHJvbmc+InNjcm9sbEN1cnNvckludG9WaWV3Ijwvc3Ryb25nPiAoaW5zdGFuY2U6IENvZGVNaXJyb3IsIGV2ZW50OiBFdmVudCk8L2NvZGU+PC9kdD4KICAgICAgPGRkPkZpcmVzIHdoZW4gdGhlIGVkaXRvciB0cmllcyB0byBzY3JvbGwgaXRzIGN1cnNvciBpbnRvIHZpZXcuCiAgICAgIENhbiBiZSBob29rZWQgaW50byB0byB0YWtlIGNhcmUgb2YgYWRkaXRpb25hbCBzY3JvbGxhYmxlCiAgICAgIGNvbnRhaW5lcnMgYXJvdW5kIHRoZSBlZGl0b3IuIFdoZW4gdGhlIGV2ZW50IG9iamVjdCBoYXMKICAgICAgaXRzIDxjb2RlPnByZXZlbnREZWZhdWx0PC9jb2RlPiBtZXRob2QgY2FsbGVkLCBDb2RlTWlycm9yIHdpbGwKICAgICAgbm90IGl0c2VsZiB0cnkgdG8gc2Nyb2xsIHRoZSB3aW5kb3cuPC9kZD4KCiAgICAgIDxkdCBpZD0iZXZlbnRfdXBkYXRlIj48Y29kZT48c3Ryb25nPiJ1cGRhdGUiPC9zdHJvbmc+IChpbnN0YW5jZTogQ29kZU1pcnJvcik8L2NvZGU+PC9kdD4KICAgICAgPGRkPldpbGwgYmUgZmlyZWQgd2hlbmV2ZXIgQ29kZU1pcnJvciB1cGRhdGVzIGl0cyBET00gZGlzcGxheS48L2RkPgoKICAgICAgPGR0IGlkPSJldmVudF9yZW5kZXJMaW5lIj48Y29kZT48c3Ryb25nPiJyZW5kZXJMaW5lIjwvc3Ryb25nPiAoaW5zdGFuY2U6IENvZGVNaXJyb3IsIGxpbmU6IExpbmVIYW5kbGUsIGVsZW1lbnQ6IEVsZW1lbnQpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5GaXJlZCB3aGVuZXZlciBhIGxpbmUgaXMgKHJlLSlyZW5kZXJlZCB0byB0aGUgRE9NLiBGaXJlZAogICAgICByaWdodCBhZnRlciB0aGUgRE9NIGVsZW1lbnQgaXMgYnVpbHQsIDxlbT5iZWZvcmU8L2VtPiBpdCBpcwogICAgICBhZGRlZCB0byB0aGUgZG9jdW1lbnQuIFRoZSBoYW5kbGVyIG1heSBtZXNzIHdpdGggdGhlIHN0eWxlIG9mCiAgICAgIHRoZSByZXN1bHRpbmcgZWxlbWVudCwgb3IgYWRkIGV2ZW50IGhhbmRsZXJzLCBidXQKICAgICAgc2hvdWxkIDxlbT5ub3Q8L2VtPiB0cnkgdG8gY2hhbmdlIHRoZSBzdGF0ZSBvZiB0aGUgZWRpdG9yLjwvZGQ+CgogICAgICA8ZHQgaWQ9ImV2ZW50X2RvbSI+PGNvZGU+PHN0cm9uZz4ibW91c2Vkb3duIjwvc3Ryb25nPiwKICAgICAgPHN0cm9uZz4iZGJsY2xpY2siPC9zdHJvbmc+LCA8c3Ryb25nPiJ0b3VjaHN0YXJ0Ijwvc3Ryb25nPiwgPHN0cm9uZz4iY29udGV4dG1lbnUiPC9zdHJvbmc+LAogICAgICA8c3Ryb25nPiJrZXlkb3duIjwvc3Ryb25nPiwgPHN0cm9uZz4ia2V5cHJlc3MiPC9zdHJvbmc+LAogICAgICA8c3Ryb25nPiJrZXl1cCI8L3N0cm9uZz4sIDxzdHJvbmc+ImN1dCI8L3N0cm9uZz4sIDxzdHJvbmc+ImNvcHkiPC9zdHJvbmc+LCA8c3Ryb25nPiJwYXN0ZSI8L3N0cm9uZz4sCiAgICAgIDxzdHJvbmc+ImRyYWdzdGFydCI8L3N0cm9uZz4sIDxzdHJvbmc+ImRyYWdlbnRlciI8L3N0cm9uZz4sCiAgICAgIDxzdHJvbmc+ImRyYWdvdmVyIjwvc3Ryb25nPiwgPHN0cm9uZz4iZHJhZ2xlYXZlIjwvc3Ryb25nPiwKICAgICAgPHN0cm9uZz4iZHJvcCI8L3N0cm9uZz4KICAgICAgKGluc3RhbmNlOiBDb2RlTWlycm9yLCBldmVudDogRXZlbnQpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5GaXJlZCB3aGVuIENvZGVNaXJyb3IgaXMgaGFuZGxpbmcgYSBET00gZXZlbnQgb2YgdGhpcyB0eXBlLgogICAgICBZb3UgY2FuIDxjb2RlPnByZXZlbnREZWZhdWx0PC9jb2RlPiB0aGUgZXZlbnQsIG9yIGdpdmUgaXQgYQogICAgICB0cnV0aHkgPGNvZGU+Y29kZW1pcnJvcklnbm9yZTwvY29kZT4gcHJvcGVydHksIHRvIHNpZ25hbCB0aGF0CiAgICAgIENvZGVNaXJyb3Igc2hvdWxkIGRvIG5vIGZ1cnRoZXIgaGFuZGxpbmcuPC9kZD4KICAgIDwvZGw+CgogICAgPHA+RG9jdW1lbnQgb2JqZWN0cyAoaW5zdGFuY2VzCiAgICBvZiA8YSBocmVmPSIjRG9jIj48Y29kZT5Db2RlTWlycm9yLkRvYzwvY29kZT48L2E+KSBlbWl0IHRoZQogICAgZm9sbG93aW5nIGV2ZW50czo8L3A+CgogICAgPGRsPgogICAgICA8ZHQgaWQ9ImV2ZW50X2RvY19jaGFuZ2UiPjxjb2RlPjxzdHJvbmc+ImNoYW5nZSI8L3N0cm9uZz4gKGRvYzogQ29kZU1pcnJvci5Eb2MsIGNoYW5nZU9iajogb2JqZWN0KTwvY29kZT48L2R0PgogICAgICA8ZGQ+RmlyZWQgd2hlbmV2ZXIgYSBjaGFuZ2Ugb2NjdXJzIHRvIHRoZQogICAgICBkb2N1bWVudC4gPGNvZGU+Y2hhbmdlT2JqPC9jb2RlPiBoYXMgYSBzaW1pbGFyIHR5cGUgYXMgdGhlCiAgICAgIG9iamVjdCBwYXNzZWQgdG8gdGhlCiAgICAgIGVkaXRvcidzIDxhIGhyZWY9IiNldmVudF9jaGFuZ2UiPjxjb2RlPiJjaGFuZ2UiPC9jb2RlPjwvYT4KICAgICAgZXZlbnQuPC9kZD4KCiAgICAgIDxkdCBpZD0iZXZlbnRfZG9jX2JlZm9yZUNoYW5nZSI+PGNvZGU+PHN0cm9uZz4iYmVmb3JlQ2hhbmdlIjwvc3Ryb25nPiAoZG9jOiBDb2RlTWlycm9yLkRvYywgY2hhbmdlOiBvYmplY3QpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5TZWUgdGhlIDxhIGhyZWY9IiNldmVudF9iZWZvcmVDaGFuZ2UiPmRlc2NyaXB0aW9uIG9mIHRoZQogICAgICBzYW1lIGV2ZW50PC9hPiBvbiBlZGl0b3IgaW5zdGFuY2VzLjwvZGQ+CgogICAgICA8ZHQgaWQ9ImV2ZW50X2RvY19jdXJzb3JBY3Rpdml0eSI+PGNvZGU+PHN0cm9uZz4iY3Vyc29yQWN0aXZpdHkiPC9zdHJvbmc+IChkb2M6IENvZGVNaXJyb3IuRG9jKTwvY29kZT48L2R0PgogICAgICA8ZGQ+RmlyZWQgd2hlbmV2ZXIgdGhlIGN1cnNvciBvciBzZWxlY3Rpb24gaW4gdGhpcyBkb2N1bWVudAogICAgICBjaGFuZ2VzLjwvZGQ+CgogICAgICA8ZHQgaWQ9ImV2ZW50X2RvY19iZWZvcmVTZWxlY3Rpb25DaGFuZ2UiPjxjb2RlPjxzdHJvbmc+ImJlZm9yZVNlbGVjdGlvbkNoYW5nZSI8L3N0cm9uZz4gKGRvYzogQ29kZU1pcnJvci5Eb2MsIHNlbGVjdGlvbjoge2hlYWQsIGFuY2hvcn0pPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5FcXVpdmFsZW50IHRvCiAgICAgIHRoZSA8YSBocmVmPSIjZXZlbnRfYmVmb3JlU2VsZWN0aW9uQ2hhbmdlIj5ldmVudCBieSB0aGUgc2FtZQogICAgICBuYW1lPC9hPiBhcyBmaXJlZCBvbiBlZGl0b3IgaW5zdGFuY2VzLjwvZGQ+CiAgICA8L2RsPgoKICAgIDxwPkxpbmUgaGFuZGxlcyAoYXMgcmV0dXJuZWQgYnksIGZvcgogICAgZXhhbXBsZSwgPGEgaHJlZj0iI2dldExpbmVIYW5kbGUiPjxjb2RlPmdldExpbmVIYW5kbGU8L2NvZGU+PC9hPikKICAgIHN1cHBvcnQgdGhlc2UgZXZlbnRzOjwvcD4KCiAgICA8ZGw+CiAgICAgIDxkdCBpZD0iZXZlbnRfZGVsZXRlIj48Y29kZT48c3Ryb25nPiJkZWxldGUiPC9zdHJvbmc+ICgpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5XaWxsIGJlIGZpcmVkIHdoZW4gdGhlIGxpbmUgb2JqZWN0IGlzIGRlbGV0ZWQuIEEgbGluZSBvYmplY3QKICAgICAgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSA8ZW0+c3RhcnQ8L2VtPiBvZiB0aGUgbGluZS4gTW9zdGx5IHVzZWZ1bAogICAgICB3aGVuIHlvdSBuZWVkIHRvIGZpbmQgb3V0IHdoZW4geW91ciA8YSBocmVmPSIjc2V0R3V0dGVyTWFya2VyIj5ndXR0ZXIKICAgICAgbWFya2VyczwvYT4gb24gYSBnaXZlbiBsaW5lIGFyZSByZW1vdmVkLjwvZGQ+CiAgICAgIDxkdCBpZD0iZXZlbnRfbGluZV9jaGFuZ2UiPjxjb2RlPjxzdHJvbmc+ImNoYW5nZSI8L3N0cm9uZz4gKGxpbmU6IExpbmVIYW5kbGUsIGNoYW5nZU9iajogb2JqZWN0KTwvY29kZT48L2R0PgogICAgICA8ZGQ+RmlyZXMgd2hlbiB0aGUgbGluZSdzIHRleHQgY29udGVudCBpcyBjaGFuZ2VkIGluIGFueSB3YXkKICAgICAgKGJ1dCB0aGUgbGluZSBpcyBub3QgZGVsZXRlZCBvdXRyaWdodCkuIFRoZSA8Y29kZT5jaGFuZ2U8L2NvZGU+CiAgICAgIG9iamVjdCBpcyBzaW1pbGFyIHRvIHRoZSBvbmUgcGFzc2VkCiAgICAgIHRvIDxhIGhyZWY9IiNldmVudF9jaGFuZ2UiPmNoYW5nZSBldmVudDwvYT4gb24gdGhlIGVkaXRvcgogICAgICBvYmplY3QuPC9kZD4KICAgIDwvZGw+CgogICAgPHA+TWFya2VkIHJhbmdlIGhhbmRsZXMgKDxjb2RlPkNvZGVNaXJyb3IuVGV4dE1hcmtlcjwvY29kZT4pLCBhcyByZXR1cm5lZAogICAgYnkgPGEgaHJlZj0iI21hcmtUZXh0Ij48Y29kZT5tYXJrVGV4dDwvY29kZT48L2E+CiAgICBhbmQgPGEgaHJlZj0iI3NldEJvb2ttYXJrIj48Y29kZT5zZXRCb29rbWFyazwvY29kZT48L2E+LCBlbWl0IHRoZQogICAgZm9sbG93aW5nIGV2ZW50czo8L3A+CgogICAgPGRsPgogICAgICA8ZHQgaWQ9ImV2ZW50X2JlZm9yZUN1cnNvckVudGVyIj48Y29kZT48c3Ryb25nPiJiZWZvcmVDdXJzb3JFbnRlciI8L3N0cm9uZz4gKCk8L2NvZGU+PC9kdD4KICAgICAgPGRkPkZpcmVkIHdoZW4gdGhlIGN1cnNvciBlbnRlcnMgdGhlIG1hcmtlZCByYW5nZS4gRnJvbSB0aGlzCiAgICAgIGV2ZW50IGhhbmRsZXIsIHRoZSBlZGl0b3Igc3RhdGUgbWF5IGJlIGluc3BlY3RlZAogICAgICBidXQgPGVtPm5vdDwvZW0+IG1vZGlmaWVkLCB3aXRoIHRoZSBleGNlcHRpb24gdGhhdCB0aGUgcmFuZ2Ugb24KICAgICAgd2hpY2ggdGhlIGV2ZW50IGZpcmVzIG1heSBiZSBjbGVhcmVkLjwvZGQ+CiAgICAgIDxkdCBpZD0iZXZlbnRfY2xlYXIiPjxjb2RlPjxzdHJvbmc+ImNsZWFyIjwvc3Ryb25nPiAoZnJvbToge2xpbmUsIGNofSwgdG86IHtsaW5lLCBjaH0pPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5GaXJlZCB3aGVuIHRoZSByYW5nZSBpcyBjbGVhcmVkLCBlaXRoZXIgdGhyb3VnaCBjdXJzb3IKICAgICAgbW92ZW1lbnQgaW4gY29tYmluYXRpb24KICAgICAgd2l0aCA8YSBocmVmPSIjbWFya19jbGVhck9uRW50ZXIiPjxjb2RlPmNsZWFyT25FbnRlcjwvY29kZT48L2E+CiAgICAgIG9yIHRocm91Z2ggYSBjYWxsIHRvIGl0cyA8Y29kZT5jbGVhcigpPC9jb2RlPiBtZXRob2QuIFdpbGwgb25seQogICAgICBiZSBmaXJlZCBvbmNlIHBlciBoYW5kbGUuIE5vdGUgdGhhdCBkZWxldGluZyB0aGUgcmFuZ2UgdGhyb3VnaAogICAgICB0ZXh0IGVkaXRpbmcgZG9lcyBub3QgZmlyZSB0aGlzIGV2ZW50LCBiZWNhdXNlIGFuIHVuZG8gYWN0aW9uCiAgICAgIG1pZ2h0IGJyaW5nIHRoZSByYW5nZSBiYWNrIGludG8gZXhpc3RlbmNlLiA8Y29kZT5mcm9tPC9jb2RlPgogICAgICBhbmQgPGNvZGU+dG88L2NvZGU+IGdpdmUgdGhlIHBhcnQgb2YgdGhlIGRvY3VtZW50IHRoYXQgdGhlIHJhbmdlCiAgICAgIHNwYW5uZWQgd2hlbiBpdCB3YXMgY2xlYXJlZC48L2RkPgogICAgICA8ZHQgaWQ9ImV2ZW50X2hpZGUiPjxjb2RlPjxzdHJvbmc+ImhpZGUiPC9zdHJvbmc+ICgpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5GaXJlZCB3aGVuIHRoZSBsYXN0IHBhcnQgb2YgdGhlIG1hcmtlciBpcyByZW1vdmVkIGZyb20gdGhlCiAgICAgIGRvY3VtZW50IGJ5IGVkaXRpbmcgb3BlcmF0aW9ucy48L2RkPgogICAgICA8ZHQgaWQ9ImV2ZW50X3VuaGlkZSI+PGNvZGU+PHN0cm9uZz4idW5oaWRlIjwvc3Ryb25nPiAoKTwvY29kZT48L2R0PgogICAgICA8ZGQ+RmlyZWQgd2hlbiwgYWZ0ZXIgdGhlIG1hcmtlciB3YXMgcmVtb3ZlZCBieSBlZGl0aW5nLCBhIHVuZG8KICAgICAgb3BlcmF0aW9uIGJyb3VnaHQgdGhlIG1hcmtlciBiYWNrLjwvZGQ+CiAgICA8L2RsPgoKICAgIDxwPkxpbmUgd2lkZ2V0cyAoPGNvZGU+Q29kZU1pcnJvci5MaW5lV2lkZ2V0PC9jb2RlPiksIHJldHVybmVkCiAgICBieSA8YSBocmVmPSIjYWRkTGluZVdpZGdldCI+PGNvZGU+YWRkTGluZVdpZGdldDwvY29kZT48L2E+LCBmaXJlCiAgICB0aGVzZSBldmVudHM6PC9wPgoKICAgIDxkbD4KICAgICAgPGR0IGlkPSJldmVudF9yZWRyYXciPjxjb2RlPjxzdHJvbmc+InJlZHJhdyI8L3N0cm9uZz4gKCk8L2NvZGU+PC9kdD4KICAgICAgPGRkPkZpcmVkIHdoZW5ldmVyIHRoZSBlZGl0b3IgcmUtYWRkcyB0aGUgd2lkZ2V0IHRvIHRoZSBET00uCiAgICAgIFRoaXMgd2lsbCBoYXBwZW4gb25jZSByaWdodCBhZnRlciB0aGUgd2lkZ2V0IGlzIGFkZGVkIChpZiBpdCBpcwogICAgICBzY3JvbGxlZCBpbnRvIHZpZXcpLCBhbmQgdGhlbiBhZ2FpbiB3aGVuZXZlciBpdCBpcyBzY3JvbGxlZCBvdXQKICAgICAgb2YgdmlldyBhbmQgYmFjayBpbiBhZ2Fpbiwgb3Igd2hlbiBjaGFuZ2VzIHRvIHRoZSBlZGl0b3Igb3B0aW9ucwogICAgICBvciB0aGUgbGluZSB0aGUgd2lkZ2V0IGlzIG9uIHJlcXVpcmUgdGhlIHdpZGdldCB0byBiZQogICAgICByZWRyYXduLjwvZGQ+CiAgICA8L2RsPgo8L3NlY3Rpb24+Cgo8c2VjdGlvbiBpZD1rZXltYXBzPgogICAgPGgyPktleSBNYXBzPC9oMj4KCiAgICA8cD5LZXkgbWFwcyBhcmUgd2F5cyB0byBhc3NvY2lhdGUga2V5cyB3aXRoIGZ1bmN0aW9uYWxpdHkuIEEga2V5IG1hcAogICAgaXMgYW4gb2JqZWN0IG1hcHBpbmcgc3RyaW5ncyB0aGF0IGlkZW50aWZ5IHRoZSBrZXlzIHRvIGZ1bmN0aW9ucwogICAgdGhhdCBpbXBsZW1lbnQgdGhlaXIgZnVuY3Rpb25hbGl0eS48L3A+CgogICAgPHA+VGhlIENvZGVNaXJyb3IgZGlzdHJpYnV0aW9ucyBjb21lcwogICAgd2l0aCA8YSBocmVmPSIuLi9kZW1vL2VtYWNzLmh0bWwiPkVtYWNzPC9hPiwgPGEgaHJlZj0iLi4vZGVtby92aW0uaHRtbCI+VmltPC9hPiwKICAgIGFuZCA8YSBocmVmPSIuLi9kZW1vL3N1YmxpbWUuaHRtbCI+U3VibGltZSBUZXh0PC9hPi1zdHlsZSBrZXltYXBzLjwvcD4KCiAgICA8cD5LZXlzIGFyZSBpZGVudGlmaWVkIGVpdGhlciBieSBuYW1lIG9yIGJ5IGNoYXJhY3Rlci4KICAgIFRoZSA8Y29kZT5Db2RlTWlycm9yLmtleU5hbWVzPC9jb2RlPiBvYmplY3QgZGVmaW5lcyBuYW1lcyBmb3IKICAgIGNvbW1vbiBrZXlzIGFuZCBhc3NvY2lhdGVzIHRoZW0gd2l0aCB0aGVpciBrZXkgY29kZXMuIEV4YW1wbGVzIG9mCiAgICBuYW1lcyBkZWZpbmVkIGhlcmUgYXJlIDxjb2RlPkVudGVyPC9jb2RlPiwgPGNvZGU+RjU8L2NvZGU+LAogICAgYW5kIDxjb2RlPlE8L2NvZGU+LiBUaGVzZSBjYW4gYmUgcHJlZml4ZWQKICAgIHdpdGggPGNvZGU+U2hpZnQtPC9jb2RlPiwgPGNvZGU+Q21kLTwvY29kZT4sIDxjb2RlPkN0cmwtPC9jb2RlPiwKICAgIGFuZCA8Y29kZT5BbHQtPC9jb2RlPiB0byBzcGVjaWZ5IGEgbW9kaWZpZXIuIFNvIGZvcgogICAgZXhhbXBsZSwgPGNvZGU+U2hpZnQtQ3RybC1TcGFjZTwvY29kZT4gd291bGQgYmUgYSB2YWxpZCBrZXkKICAgIGlkZW50aWZpZXIuPC9wPgoKICAgIDxwPkNvbW1vbiBleGFtcGxlOiBtYXAgdGhlIFRhYiBrZXkgdG8gaW5zZXJ0IHNwYWNlcyBpbnN0ZWFkIG9mIGEgdGFiCiAgICBjaGFyYWN0ZXIuPC9wPgoKICAgIDxwcmUgZGF0YS1sYW5nPSJqYXZhc2NyaXB0Ij4KZWRpdG9yLnNldE9wdGlvbigiZXh0cmFLZXlzIiwgewogIFRhYjogZnVuY3Rpb24oY20pIHsKICAgIHZhciBzcGFjZXMgPSBBcnJheShjbS5nZXRPcHRpb24oImluZGVudFVuaXQiKSArIDEpLmpvaW4oIiAiKTsKICAgIGNtLnJlcGxhY2VTZWxlY3Rpb24oc3BhY2VzKTsKICB9Cn0pOzwvcHJlPgoKICAgIDxwPkFsdGVybmF0aXZlbHksIGEgY2hhcmFjdGVyIGNhbiBiZSBzcGVjaWZpZWQgZGlyZWN0bHkgYnkKICAgIHN1cnJvdW5kaW5nIGl0IGluIHNpbmdsZSBxdW90ZXMsIGZvciBleGFtcGxlIDxjb2RlPickJzwvY29kZT4KICAgIG9yIDxjb2RlPidxJzwvY29kZT4uIER1ZSB0byBsaW1pdGF0aW9ucyBpbiB0aGUgd2F5IGJyb3dzZXJzIGZpcmUKICAgIGtleSBldmVudHMsIHRoZXNlIG1heSBub3QgYmUgcHJlZml4ZWQgd2l0aCBtb2RpZmllcnMuPC9wPgoKICAgIDxwIGlkPSJub3JtYWxpemVLZXlNYXAiPk11bHRpLXN0cm9rZSBrZXkgYmluZGluZ3MgY2FuIGJlIHNwZWNpZmllZAogICAgYnkgc2VwYXJhdGluZyB0aGUga2V5IG5hbWVzIGJ5IHNwYWNlcyBpbiB0aGUgcHJvcGVydHkgbmFtZSwgZm9yCiAgICBleGFtcGxlIDxjb2RlPkN0cmwtWCBDdHJsLVY8L2NvZGU+LiBXaGVuIGEgbWFwIGNvbnRhaW5zCiAgICBtdWx0aS1zdG9rZSBiaW5kaW5ncyBvciBrZXlzIHdpdGggbW9kaWZpZXJzIHRoYXQgYXJlIG5vdCBzcGVjaWZpZWQKICAgIGluIHRoZSBkZWZhdWx0IG9yZGVyICg8Y29kZT5TaGlmdC1DbWQtQ3RybC1BbHQ8L2NvZGU+KSwgeW91IG11c3QKICAgIGNhbGwgPGNvZGU+Q29kZU1pcnJvci5ub3JtYWxpemVLZXlNYXA8L2NvZGU+IG9uIGl0IGJlZm9yZSBpdCBjYW4KICAgIGJlIHVzZWQuIFRoaXMgZnVuY3Rpb24gdGFrZXMgYSBrZXltYXAgYW5kIG1vZGlmaWVzIGl0IHRvIG5vcm1hbGl6ZQogICAgbW9kaWZpZXIgb3JkZXIgYW5kIHByb3Blcmx5IHJlY29nbml6ZSBtdWx0aS1zdHJva2UgYmluZGluZ3MuIEl0CiAgICB3aWxsIHJldHVybiB0aGUga2V5bWFwIGl0c2VsZi48L3A+CgogICAgPHA+VGhlIDxjb2RlPkNvZGVNaXJyb3Iua2V5TWFwPC9jb2RlPiBvYmplY3QgYXNzb2NpYXRlcyBrZXkgbWFwcwogICAgd2l0aCBuYW1lcy4gVXNlciBjb2RlIGFuZCBrZXkgbWFwIGRlZmluaXRpb25zIGNhbiBhc3NpZ24gZXh0cmEKICAgIHByb3BlcnRpZXMgdG8gdGhpcyBvYmplY3QuIEFueXdoZXJlIHdoZXJlIGEga2V5IG1hcCBpcyBleHBlY3RlZCwgYQogICAgc3RyaW5nIGNhbiBiZSBnaXZlbiwgd2hpY2ggd2lsbCBiZSBsb29rZWQgdXAgaW4gdGhpcyBvYmplY3QuIEl0CiAgICBhbHNvIGNvbnRhaW5zIHRoZSA8Y29kZT4iZGVmYXVsdCI8L2NvZGU+IGtleSBtYXAgaG9sZGluZyB0aGUKICAgIGRlZmF1bHQgYmluZGluZ3MuPC9wPgoKICAgIDxwPlRoZSB2YWx1ZXMgb2YgcHJvcGVydGllcyBpbiBrZXkgbWFwcyBjYW4gYmUgZWl0aGVyIGZ1bmN0aW9ucyBvZgogICAgYSBzaW5nbGUgYXJndW1lbnQgKHRoZSBDb2RlTWlycm9yIGluc3RhbmNlKSwgc3RyaW5ncywgb3IKICAgIDxjb2RlPmZhbHNlPC9jb2RlPi4gU3RyaW5ncyByZWZlcgogICAgdG8gPGEgaHJlZj0iI2NvbW1hbmRzIj5jb21tYW5kczwvYT4sIHdoaWNoIGFyZSBkZXNjcmliZWQgYmVsb3cuIElmCiAgICB0aGUgcHJvcGVydHkgaXMgc2V0IHRvIDxjb2RlPmZhbHNlPC9jb2RlPiwgQ29kZU1pcnJvciBsZWF2ZXMKICAgIGhhbmRsaW5nIG9mIHRoZSBrZXkgdXAgdG8gdGhlIGJyb3dzZXIuIEEga2V5IGhhbmRsZXIgZnVuY3Rpb24gbWF5CiAgICByZXR1cm4gPGNvZGU+Q29kZU1pcnJvci5QYXNzPC9jb2RlPiB0byBpbmRpY2F0ZSB0aGF0IGl0IGhhcwogICAgZGVjaWRlZCBub3QgdG8gaGFuZGxlIHRoZSBrZXksIGFuZCBvdGhlciBoYW5kbGVycyAob3IgdGhlIGRlZmF1bHQKICAgIGJlaGF2aW9yKSBzaG91bGQgYmUgZ2l2ZW4gYSB0dXJuLjwvcD4KCiAgICA8cD5LZXlzIG1hcHBlZCB0byBjb21tYW5kIG5hbWVzIHRoYXQgc3RhcnQgd2l0aCB0aGUKICAgIGNoYXJhY3RlcnMgPGNvZGU+ImdvIjwvY29kZT4gb3IgdG8gZnVuY3Rpb25zIHRoYXQgaGF2ZSBhCiAgICB0cnV0aHkgPGNvZGU+bW90aW9uPC9jb2RlPiBwcm9wZXJ0eSAod2hpY2ggc2hvdWxkIGJlIHVzZWQgZm9yCiAgICBjdXJzb3ItbW92ZW1lbnQgYWN0aW9ucykgd2lsbCBiZSBmaXJlZCBldmVuIHdoZW4gYW4KICAgIGV4dHJhIDxjb2RlPlNoaWZ0PC9jb2RlPiBtb2RpZmllciBpcyBwcmVzZW50IChpLmUuIDxjb2RlPiJVcCI6CiAgICAiZ29MaW5lVXAiPC9jb2RlPiBtYXRjaGVzIGJvdGggdXAgYW5kIHNoaWZ0LXVwKS4gVGhpcyBpcyB1c2VkIHRvCiAgICBlYXNpbHkgaW1wbGVtZW50IHNoaWZ0LXNlbGVjdGlvbi48L3A+CgogICAgPHA+S2V5IG1hcHMgY2FuIGRlZmVyIHRvIGVhY2ggb3RoZXIgYnkgZGVmaW5pbmcKICAgIGEgPGNvZGU+ZmFsbHRocm91Z2g8L2NvZGU+IHByb3BlcnR5LiBUaGlzIGluZGljYXRlcyB0aGF0IHdoZW4gYQogICAga2V5IGlzIG5vdCBmb3VuZCBpbiB0aGUgbWFwIGl0c2VsZiwgb25lIG9yIG1vcmUgb3RoZXIgbWFwcyBzaG91bGQKICAgIGJlIHNlYXJjaGVkLiBJdCBjYW4gaG9sZCBlaXRoZXIgYSBzaW5nbGUga2V5IG1hcCBvciBhbiBhcnJheSBvZgogICAga2V5IG1hcHMuPC9wPgoKICAgIDxwPldoZW4gYSBrZXkgbWFwIG5lZWRzIHRvIHNldCBzb21ldGhpbmcgdXAgd2hlbiBpdCBiZWNvbWVzCiAgICBhY3RpdmUsIG9yIHRlYXIgc29tZXRoaW5nIGRvd24gd2hlbiBkZWFjdGl2YXRlZCwgaXQgY2FuCiAgICBjb250YWluIDxjb2RlPmF0dGFjaDwvY29kZT4gYW5kL29yIDxjb2RlPmRldGFjaDwvY29kZT4gcHJvcGVydGllcywKICAgIHdoaWNoIHNob3VsZCBob2xkIGZ1bmN0aW9ucyB0aGF0IHRha2UgdGhlIGVkaXRvciBpbnN0YW5jZSBhbmQgdGhlCiAgICBuZXh0IG9yIHByZXZpb3VzIGtleW1hcC4gTm90ZSB0aGF0IHRoaXMgb25seSB3b3JrcyBmb3IgdGhlCiAgICA8YSBocmVmPSIjb3B0aW9uX2tleU1hcCI+dG9wLWxldmVsIGtleW1hcDwvYT4sIG5vdCBmb3IgZmFsbHRocm91Z2gKICAgIG1hcHMgb3IgbWFwcyBhZGRlZAogICAgd2l0aCA8YSBocmVmPSIjb3B0aW9uX2V4dHJhS2V5cyI+PGNvZGU+ZXh0cmFLZXlzPC9jb2RlPjwvYT4KICAgIG9yIDxhIGhyZWY9IiNhZGRLZXlNYXAiPjxjb2RlPmFkZEtleU1hcDwvY29kZT48L2E+LjwvcD4KPC9zZWN0aW9uPgoKPHNlY3Rpb24gaWQ9Y29tbWFuZHM+CiAgICA8aDI+Q29tbWFuZHM8L2gyPgoKICAgIDxwPkNvbW1hbmRzIGFyZSBwYXJhbWV0ZXItbGVzcyBhY3Rpb25zIHRoYXQgY2FuIGJlIHBlcmZvcm1lZCBvbiBhbgogICAgZWRpdG9yLiBUaGVpciBtYWluIHVzZSBpcyBmb3Iga2V5IGJpbmRpbmdzLiBDb21tYW5kcyBhcmUgZGVmaW5lZCBieQogICAgYWRkaW5nIHByb3BlcnRpZXMgdG8gdGhlIDxjb2RlPkNvZGVNaXJyb3IuY29tbWFuZHM8L2NvZGU+IG9iamVjdC4KICAgIEEgbnVtYmVyIG9mIGNvbW1vbiBjb21tYW5kcyBhcmUgZGVmaW5lZCBieSB0aGUgbGlicmFyeSBpdHNlbGYsCiAgICBtb3N0IG9mIHRoZW0gdXNlZCBieSB0aGUgZGVmYXVsdCBrZXkgYmluZGluZ3MuIFRoZSB2YWx1ZSBvZiBhCiAgICBjb21tYW5kIHByb3BlcnR5IG11c3QgYmUgYSBmdW5jdGlvbiBvZiBvbmUgYXJndW1lbnQgKGFuIGVkaXRvcgogICAgaW5zdGFuY2UpLjwvcD4KCiAgICA8cD5Tb21lIG9mIHRoZSBjb21tYW5kcyBiZWxvdyBhcmUgcmVmZXJlbmNlZCBpbiB0aGUgZGVmYXVsdAogICAga2V5IG1hcCwgYnV0IG5vdCBkZWZpbmVkIGJ5IHRoZSBjb3JlIGxpYnJhcnkuIFRoZXNlIGFyZSBpbnRlbmRlZCB0bwogICAgYmUgZGVmaW5lZCBieSB1c2VyIGNvZGUgb3IgYWRkb25zLjwvcD4KCiAgICA8cD5Db21tYW5kcyBjYW4gYWxzbyBiZSBydW4gd2l0aAogICAgdGhlIDxhIGhyZWY9IiNleGVjQ29tbWFuZCI+PGNvZGU+ZXhlY0NvbW1hbmQ8L2NvZGU+PC9hPgogICAgbWV0aG9kLjwvcD4KCiAgICA8ZGw+CiAgICAgIDxkdCBjbGFzcz1jb21tYW5kIGlkPWNvbW1hbmRfc2VsZWN0QWxsPjxjb2RlPjxzdHJvbmc+c2VsZWN0QWxsPC9zdHJvbmc+PC9jb2RlPjxzcGFuIGNsYXNzPWtleWJpbmRpbmc+Q3RybC1BIChQQyksIENtZC1BIChNYWMpPC9zcGFuPjwvZHQ+CiAgICAgIDxkZD5TZWxlY3QgdGhlIHdob2xlIGNvbnRlbnQgb2YgdGhlIGVkaXRvci48L2RkPgoKICAgICAgPGR0IGNsYXNzPWNvbW1hbmQgaWQ9Y29tbWFuZF9zaW5nbGVTZWxlY3Rpb24+PGNvZGU+PHN0cm9uZz5zaW5nbGVTZWxlY3Rpb248L3N0cm9uZz48L2NvZGU+PHNwYW4gY2xhc3M9a2V5YmluZGluZz5Fc2M8L3NwYW4+PC9kdD4KICAgICAgPGRkPldoZW4gbXVsdGlwbGUgc2VsZWN0aW9ucyBhcmUgcHJlc2VudCwgdGhpcyBkZXNlbGVjdHMgYWxsIGJ1dAogICAgICB0aGUgcHJpbWFyeSBzZWxlY3Rpb24uPC9kZD4KCiAgICAgIDxkdCBjbGFzcz1jb21tYW5kIGlkPWNvbW1hbmRfa2lsbExpbmU+PGNvZGU+PHN0cm9uZz5raWxsTGluZTwvc3Ryb25nPjwvY29kZT48c3BhbiBjbGFzcz1rZXliaW5kaW5nPkN0cmwtSyAoTWFjKTwvc3Bhbj48L2R0PgogICAgICA8ZGQ+RW1hY3Mtc3R5bGUgbGluZSBraWxsaW5nLiBEZWxldGVzIHRoZSBwYXJ0IG9mIHRoZSBsaW5lIGFmdGVyCiAgICAgIHRoZSBjdXJzb3IuIElmIHRoYXQgY29uc2lzdHMgb25seSBvZiB3aGl0ZXNwYWNlLCB0aGUgbmV3bGluZSBhdAogICAgICB0aGUgZW5kIG9mIHRoZSBsaW5lIGlzIGFsc28gZGVsZXRlZC48L2RkPgoKICAgICAgPGR0IGNsYXNzPWNvbW1hbmQgaWQ9Y29tbWFuZF9kZWxldGVMaW5lPjxjb2RlPjxzdHJvbmc+ZGVsZXRlTGluZTwvc3Ryb25nPjwvY29kZT48c3BhbiBjbGFzcz1rZXliaW5kaW5nPkN0cmwtRCAoUEMpLCBDbWQtRCAoTWFjKTwvc3Bhbj48L2R0PgogICAgICA8ZGQ+RGVsZXRlcyB0aGUgd2hvbGUgbGluZSB1bmRlciB0aGUgY3Vyc29yLCBpbmNsdWRpbmcgbmV3bGluZSBhdCB0aGUgZW5kLjwvZGQ+CgogICAgICA8ZHQgY2xhc3M9Y29tbWFuZCBpZD1jb21tYW5kX2RlbExpbmVMZWZ0Pjxjb2RlPjxzdHJvbmc+ZGVsTGluZUxlZnQ8L3N0cm9uZz48L2NvZGU+PC9kdD4KICAgICAgPGRkPkRlbGV0ZSB0aGUgcGFydCBvZiB0aGUgbGluZSBiZWZvcmUgdGhlIGN1cnNvci48L2RkPgoKICAgICAgPGR0IGNsYXNzPWNvbW1hbmQgaWQ9Y29tbWFuZF9kZWxXcmFwcGVkTGluZUxlZnQ+PGNvZGU+PHN0cm9uZz5kZWxXcmFwcGVkTGluZUxlZnQ8L3N0cm9uZz48L2NvZGU+PHNwYW4gY2xhc3M9a2V5YmluZGluZz5DbWQtQmFja3NwYWNlIChNYWMpPC9zcGFuPjwvZHQ+CiAgICAgIDxkZD5EZWxldGUgdGhlIHBhcnQgb2YgdGhlIGxpbmUgZnJvbSB0aGUgbGVmdCBzaWRlIG9mIHRoZSB2aXN1YWwgbGluZSB0aGUgY3Vyc29yIGlzIG9uIHRvIHRoZSBjdXJzb3IuPC9kZD4KCiAgICAgIDxkdCBjbGFzcz1jb21tYW5kIGlkPWNvbW1hbmRfZGVsV3JhcHBlZExpbmVSaWdodD48Y29kZT48c3Ryb25nPmRlbFdyYXBwZWRMaW5lUmlnaHQ8L3N0cm9uZz48L2NvZGU+PHNwYW4gY2xhc3M9a2V5YmluZGluZz5DbWQtRGVsZXRlIChNYWMpPC9zcGFuPjwvZHQ+CiAgICAgIDxkZD5EZWxldGUgdGhlIHBhcnQgb2YgdGhlIGxpbmUgZnJvbSB0aGUgY3Vyc29yIHRvIHRoZSByaWdodCBzaWRlIG9mIHRoZSB2aXN1YWwgbGluZSB0aGUgY3Vyc29yIGlzIG9uLjwvZGQ+CgogICAgICA8ZHQgY2xhc3M9Y29tbWFuZCBpZD1jb21tYW5kX3VuZG8+PGNvZGU+PHN0cm9uZz51bmRvPC9zdHJvbmc+PC9jb2RlPjxzcGFuIGNsYXNzPWtleWJpbmRpbmc+Q3RybC1aIChQQyksIENtZC1aIChNYWMpPC9zcGFuPjwvZHQ+CiAgICAgIDxkZD5VbmRvIHRoZSBsYXN0IGNoYW5nZS48L2RkPgoKICAgICAgPGR0IGNsYXNzPWNvbW1hbmQgaWQ9Y29tbWFuZF9yZWRvPjxjb2RlPjxzdHJvbmc+cmVkbzwvc3Ryb25nPjwvY29kZT48c3BhbiBjbGFzcz1rZXliaW5kaW5nPkN0cmwtWSAoUEMpLCBTaGlmdC1DbWQtWiAoTWFjKSwgQ21kLVkgKE1hYyk8L3NwYW4+PC9kdD4KICAgICAgPGRkPlJlZG8gdGhlIGxhc3QgdW5kb25lIGNoYW5nZS48L2RkPgoKICAgICAgPGR0IGNsYXNzPWNvbW1hbmQgaWQ9Y29tbWFuZF91bmRvU2VsZWN0aW9uPjxjb2RlPjxzdHJvbmc+dW5kb1NlbGVjdGlvbjwvc3Ryb25nPjwvY29kZT48c3BhbiBjbGFzcz1rZXliaW5kaW5nPkN0cmwtVSAoUEMpLCBDbWQtVSAoTWFjKTwvc3Bhbj48L2R0PgogICAgICA8ZGQ+VW5kbyB0aGUgbGFzdCBjaGFuZ2UgdG8gdGhlIHNlbGVjdGlvbiwgb3IgaWYgdGhlcmUgYXJlIG5vCiAgICAgIHNlbGVjdGlvbi1vbmx5IGNoYW5nZXMgYXQgdGhlIHRvcCBvZiB0aGUgaGlzdG9yeSwgdW5kbyB0aGUgbGFzdAogICAgICBjaGFuZ2UuPC9kZD4KCiAgICAgIDxkdCBjbGFzcz1jb21tYW5kIGlkPWNvbW1hbmRfcmVkb1NlbGVjdGlvbj48Y29kZT48c3Ryb25nPnJlZG9TZWxlY3Rpb248L3N0cm9uZz48L2NvZGU+PHNwYW4gY2xhc3M9a2V5YmluZGluZz5BbHQtVSAoUEMpLCBTaGlmdC1DbWQtVSAoTWFjKTwvc3Bhbj48L2R0PgogICAgICA8ZGQ+UmVkbyB0aGUgbGFzdCBjaGFuZ2UgdG8gdGhlIHNlbGVjdGlvbiwgb3IgdGhlIGxhc3QgdGV4dCBjaGFuZ2UgaWYKICAgICAgbm8gc2VsZWN0aW9uIGNoYW5nZXMgcmVtYWluLjwvZGQ+CgogICAgICA8ZHQgY2xhc3M9Y29tbWFuZCBpZD1jb21tYW5kX2dvRG9jU3RhcnQ+PGNvZGU+PHN0cm9uZz5nb0RvY1N0YXJ0PC9zdHJvbmc+PC9jb2RlPjxzcGFuIGNsYXNzPWtleWJpbmRpbmc+Q3RybC1Ib21lIChQQyksIENtZC1VcCAoTWFjKSwgQ21kLUhvbWUgKE1hYyk8L3NwYW4+PC9kdD4KICAgICAgPGRkPk1vdmUgdGhlIGN1cnNvciB0byB0aGUgc3RhcnQgb2YgdGhlIGRvY3VtZW50LjwvZGQ+CgogICAgICA8ZHQgY2xhc3M9Y29tbWFuZCBpZD1jb21tYW5kX2dvRG9jRW5kPjxjb2RlPjxzdHJvbmc+Z29Eb2NFbmQ8L3N0cm9uZz48L2NvZGU+PHNwYW4gY2xhc3M9a2V5YmluZGluZz5DdHJsLUVuZCAoUEMpLCBDbWQtRW5kIChNYWMpLCBDbWQtRG93biAoTWFjKTwvc3Bhbj48L2R0PgogICAgICA8ZGQ+TW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50LjwvZGQ+CgogICAgICA8ZHQgY2xhc3M9Y29tbWFuZCBpZD1jb21tYW5kX2dvTGluZVN0YXJ0Pjxjb2RlPjxzdHJvbmc+Z29MaW5lU3RhcnQ8L3N0cm9uZz48L2NvZGU+PHNwYW4gY2xhc3M9a2V5YmluZGluZz5BbHQtTGVmdCAoUEMpLCBDdHJsLUEgKE1hYyk8L3NwYW4+PC9kdD4KICAgICAgPGRkPk1vdmUgdGhlIGN1cnNvciB0byB0aGUgc3RhcnQgb2YgdGhlIGxpbmUuPC9kZD4KCiAgICAgIDxkdCBjbGFzcz1jb21tYW5kIGlkPWNvbW1hbmRfZ29MaW5lU3RhcnRTbWFydD48Y29kZT48c3Ryb25nPmdvTGluZVN0YXJ0U21hcnQ8L3N0cm9uZz48L2NvZGU+PHNwYW4gY2xhc3M9a2V5YmluZGluZz5Ib21lPC9zcGFuPjwvZHQ+CiAgICAgIDxkZD5Nb3ZlIHRvIHRoZSBzdGFydCBvZiB0aGUgdGV4dCBvbiB0aGUgbGluZSwgb3IgaWYgd2UgYXJlCiAgICAgIGFscmVhZHkgdGhlcmUsIHRvIHRoZSBhY3R1YWwgc3RhcnQgb2YgdGhlIGxpbmUgKGluY2x1ZGluZwogICAgICB3aGl0ZXNwYWNlKS48L2RkPgoKICAgICAgPGR0IGNsYXNzPWNvbW1hbmQgaWQ9Y29tbWFuZF9nb0xpbmVFbmQ+PGNvZGU+PHN0cm9uZz5nb0xpbmVFbmQ8L3N0cm9uZz48L2NvZGU+PHNwYW4gY2xhc3M9a2V5YmluZGluZz5BbHQtUmlnaHQgKFBDKSwgQ3RybC1FIChNYWMpPC9zcGFuPjwvZHQ+CiAgICAgIDxkZD5Nb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIGVuZCBvZiB0aGUgbGluZS48L2RkPgoKICAgICAgPGR0IGNsYXNzPWNvbW1hbmQgaWQ9Y29tbWFuZF9nb0xpbmVSaWdodD48Y29kZT48c3Ryb25nPmdvTGluZVJpZ2h0PC9zdHJvbmc+PC9jb2RlPjxzcGFuIGNsYXNzPWtleWJpbmRpbmc+Q21kLVJpZ2h0IChNYWMpPC9zcGFuPjwvZHQ+CiAgICAgIDxkZD5Nb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIHZpc3VhbCBsaW5lIGl0IGlzIG9uLjwvZGQ+CgogICAgICA8ZHQgY2xhc3M9Y29tbWFuZCBpZD1jb21tYW5kX2dvTGluZUxlZnQ+PGNvZGU+PHN0cm9uZz5nb0xpbmVMZWZ0PC9zdHJvbmc+PC9jb2RlPjxzcGFuIGNsYXNzPWtleWJpbmRpbmc+Q21kLUxlZnQgKE1hYyk8L3NwYW4+PC9kdD4KICAgICAgPGRkPk1vdmUgdGhlIGN1cnNvciB0byB0aGUgbGVmdCBzaWRlIG9mIHRoZSB2aXN1YWwgbGluZSBpdCBpcyBvbi4gSWYKICAgICAgdGhpcyBsaW5lIGlzIHdyYXBwZWQsIHRoYXQgbWF5IG5vdCBiZSB0aGUgc3RhcnQgb2YgdGhlIGxpbmUuPC9kZD4KCiAgICAgIDxkdCBjbGFzcz1jb21tYW5kIGlkPWNvbW1hbmRfZ29MaW5lTGVmdFNtYXJ0Pjxjb2RlPjxzdHJvbmc+Z29MaW5lTGVmdFNtYXJ0PC9zdHJvbmc+PC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5Nb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIGxlZnQgc2lkZSBvZiB0aGUgdmlzdWFsIGxpbmUgaXQgaXMKICAgICAgb24uIElmIHRoYXQgdGFrZXMgaXQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lLCBiZWhhdmUKICAgICAgbGlrZSA8YSBocmVmPSIjY29tbWFuZF9nb0xpbmVTdGFydFNtYXJ0Ij48Y29kZT5nb0xpbmVTdGFydFNtYXJ0PC9jb2RlPjwvYT4uPC9kZD4KCiAgICAgIDxkdCBjbGFzcz1jb21tYW5kIGlkPWNvbW1hbmRfZ29MaW5lVXA+PGNvZGU+PHN0cm9uZz5nb0xpbmVVcDwvc3Ryb25nPjwvY29kZT48c3BhbiBjbGFzcz1rZXliaW5kaW5nPlVwLCBDdHJsLVAgKE1hYyk8L3NwYW4+PC9kdD4KICAgICAgPGRkPk1vdmUgdGhlIGN1cnNvciB1cCBvbmUgbGluZS48L2RkPgoKICAgICAgPGR0IGNsYXNzPWNvbW1hbmQgaWQ9Y29tbWFuZF9nb0xpbmVEb3duPjxjb2RlPjxzdHJvbmc+Z29MaW5lRG93bjwvc3Ryb25nPjwvY29kZT48c3BhbiBjbGFzcz1rZXliaW5kaW5nPkRvd24sIEN0cmwtTiAoTWFjKTwvc3Bhbj48L2R0PgogICAgICA8ZGQ+TW92ZSBkb3duIG9uZSBsaW5lLjwvZGQ+CgogICAgICA8ZHQgY2xhc3M9Y29tbWFuZCBpZD1jb21tYW5kX2dvUGFnZVVwPjxjb2RlPjxzdHJvbmc+Z29QYWdlVXA8L3N0cm9uZz48L2NvZGU+PHNwYW4gY2xhc3M9a2V5YmluZGluZz5QYWdlVXAsIFNoaWZ0LUN0cmwtViAoTWFjKTwvc3Bhbj48L2R0PgogICAgICA8ZGQ+TW92ZSB0aGUgY3Vyc29yIHVwIG9uZSBzY3JlZW4sIGFuZCBzY3JvbGwgdXAgYnkgdGhlIHNhbWUgZGlzdGFuY2UuPC9kZD4KCiAgICAgIDxkdCBjbGFzcz1jb21tYW5kIGlkPWNvbW1hbmRfZ29QYWdlRG93bj48Y29kZT48c3Ryb25nPmdvUGFnZURvd248L3N0cm9uZz48L2NvZGU+PHNwYW4gY2xhc3M9a2V5YmluZGluZz5QYWdlRG93biwgQ3RybC1WIChNYWMpPC9zcGFuPjwvZHQ+CiAgICAgIDxkZD5Nb3ZlIHRoZSBjdXJzb3IgZG93biBvbmUgc2NyZWVuLCBhbmQgc2Nyb2xsIGRvd24gYnkgdGhlIHNhbWUgZGlzdGFuY2UuPC9kZD4KCiAgICAgIDxkdCBjbGFzcz1jb21tYW5kIGlkPWNvbW1hbmRfZ29DaGFyTGVmdD48Y29kZT48c3Ryb25nPmdvQ2hhckxlZnQ8L3N0cm9uZz48L2NvZGU+PHNwYW4gY2xhc3M9a2V5YmluZGluZz5MZWZ0LCBDdHJsLUIgKE1hYyk8L3NwYW4+PC9kdD4KICAgICAgPGRkPk1vdmUgdGhlIGN1cnNvciBvbmUgY2hhcmFjdGVyIGxlZnQsIGdvaW5nIHRvIHRoZSBwcmV2aW91cyBsaW5lCiAgICAgIHdoZW4gaGl0dGluZyB0aGUgc3RhcnQgb2YgbGluZS48L2RkPgoKICAgICAgPGR0IGNsYXNzPWNvbW1hbmQgaWQ9Y29tbWFuZF9nb0NoYXJSaWdodD48Y29kZT48c3Ryb25nPmdvQ2hhclJpZ2h0PC9zdHJvbmc+PC9jb2RlPjxzcGFuIGNsYXNzPWtleWJpbmRpbmc+UmlnaHQsIEN0cmwtRiAoTWFjKTwvc3Bhbj48L2R0PgogICAgICA8ZGQ+TW92ZSB0aGUgY3Vyc29yIG9uZSBjaGFyYWN0ZXIgcmlnaHQsIGdvaW5nIHRvIHRoZSBuZXh0IGxpbmUKICAgICAgd2hlbiBoaXR0aW5nIHRoZSBlbmQgb2YgbGluZS48L2RkPgoKICAgICAgPGR0IGNsYXNzPWNvbW1hbmQgaWQ9Y29tbWFuZF9nb0NvbHVtbkxlZnQ+PGNvZGU+PHN0cm9uZz5nb0NvbHVtbkxlZnQ8L3N0cm9uZz48L2NvZGU+PC9kdD4KICAgICAgPGRkPk1vdmUgdGhlIGN1cnNvciBvbmUgY2hhcmFjdGVyIGxlZnQsIGJ1dCBkb24ndCBjcm9zcyBsaW5lIGJvdW5kYXJpZXMuPC9kZD4KCiAgICAgIDxkdCBjbGFzcz1jb21tYW5kIGlkPWNvbW1hbmRfZ29Db2x1bW5SaWdodD48Y29kZT48c3Ryb25nPmdvQ29sdW1uUmlnaHQ8L3N0cm9uZz48L2NvZGU+PC9kdD4KICAgICAgPGRkPk1vdmUgdGhlIGN1cnNvciBvbmUgY2hhcmFjdGVyIHJpZ2h0LCBkb24ndCBjcm9zcyBsaW5lIGJvdW5kYXJpZXMuPC9kZD4KCiAgICAgIDxkdCBjbGFzcz1jb21tYW5kIGlkPWNvbW1hbmRfZ29Xb3JkTGVmdD48Y29kZT48c3Ryb25nPmdvV29yZExlZnQ8L3N0cm9uZz48L2NvZGU+PHNwYW4gY2xhc3M9a2V5YmluZGluZz5BbHQtQiAoTWFjKTwvc3Bhbj48L2R0PgogICAgICA8ZGQ+TW92ZSB0aGUgY3Vyc29yIHRvIHRoZSBzdGFydCBvZiB0aGUgcHJldmlvdXMgd29yZC48L2RkPgoKICAgICAgPGR0IGNsYXNzPWNvbW1hbmQgaWQ9Y29tbWFuZF9nb1dvcmRSaWdodD48Y29kZT48c3Ryb25nPmdvV29yZFJpZ2h0PC9zdHJvbmc+PC9jb2RlPjxzcGFuIGNsYXNzPWtleWJpbmRpbmc+QWx0LUYgKE1hYyk8L3NwYW4+PC9kdD4KICAgICAgPGRkPk1vdmUgdGhlIGN1cnNvciB0byB0aGUgZW5kIG9mIHRoZSBuZXh0IHdvcmQuPC9kZD4KCiAgICAgIDxkdCBjbGFzcz1jb21tYW5kIGlkPWNvbW1hbmRfZ29Hcm91cExlZnQ+PGNvZGU+PHN0cm9uZz5nb0dyb3VwTGVmdDwvc3Ryb25nPjwvY29kZT48c3BhbiBjbGFzcz1rZXliaW5kaW5nPkN0cmwtTGVmdCAoUEMpLCBBbHQtTGVmdCAoTWFjKTwvc3Bhbj48L2R0PgogICAgICA8ZGQ+TW92ZSB0byB0aGUgbGVmdCBvZiB0aGUgZ3JvdXAgYmVmb3JlIHRoZSBjdXJzb3IuIEEgZ3JvdXAgaXMKICAgICAgYSBzdHJldGNoIG9mIHdvcmQgY2hhcmFjdGVycywgYSBzdHJldGNoIG9mIHB1bmN0dWF0aW9uCiAgICAgIGNoYXJhY3RlcnMsIGEgbmV3bGluZSwgb3IgYSBzdHJldGNoIG9mIDxlbT5tb3JlIHRoYW4gb25lPC9lbT4KICAgICAgd2hpdGVzcGFjZSBjaGFyYWN0ZXIuPC9kZD4KCiAgICAgIDxkdCBjbGFzcz1jb21tYW5kIGlkPWNvbW1hbmRfZ29Hcm91cFJpZ2h0Pjxjb2RlPjxzdHJvbmc+Z29Hcm91cFJpZ2h0PC9zdHJvbmc+PC9jb2RlPjxzcGFuIGNsYXNzPWtleWJpbmRpbmc+Q3RybC1SaWdodCAoUEMpLCBBbHQtUmlnaHQgKE1hYyk8L3NwYW4+PC9kdD4KICAgICAgPGRkPk1vdmUgdG8gdGhlIHJpZ2h0IG9mIHRoZSBncm91cCBhZnRlciB0aGUgY3Vyc29yCiAgICAgIChzZWUgPGEgaHJlZj0iI2NvbW1hbmRfZ29Hcm91cExlZnQiPmFib3ZlPC9hPikuPC9kZD4KCiAgICAgIDxkdCBjbGFzcz1jb21tYW5kIGlkPWNvbW1hbmRfZGVsQ2hhckJlZm9yZT48Y29kZT48c3Ryb25nPmRlbENoYXJCZWZvcmU8L3N0cm9uZz48L2NvZGU+PHNwYW4gY2xhc3M9a2V5YmluZGluZz5TaGlmdC1CYWNrc3BhY2UsIEN0cmwtSCAoTWFjKTwvc3Bhbj48L2R0PgogICAgICA8ZGQ+RGVsZXRlIHRoZSBjaGFyYWN0ZXIgYmVmb3JlIHRoZSBjdXJzb3IuPC9kZD4KCiAgICAgIDxkdCBjbGFzcz1jb21tYW5kIGlkPWNvbW1hbmRfZGVsQ2hhckFmdGVyPjxjb2RlPjxzdHJvbmc+ZGVsQ2hhckFmdGVyPC9zdHJvbmc+PC9jb2RlPjxzcGFuIGNsYXNzPWtleWJpbmRpbmc+RGVsZXRlLCBDdHJsLUQgKE1hYyk8L3NwYW4+PC9kdD4KICAgICAgPGRkPkRlbGV0ZSB0aGUgY2hhcmFjdGVyIGFmdGVyIHRoZSBjdXJzb3IuPC9kZD4KCiAgICAgIDxkdCBjbGFzcz1jb21tYW5kIGlkPWNvbW1hbmRfZGVsV29yZEJlZm9yZT48Y29kZT48c3Ryb25nPmRlbFdvcmRCZWZvcmU8L3N0cm9uZz48L2NvZGU+PHNwYW4gY2xhc3M9a2V5YmluZGluZz5BbHQtQmFja3NwYWNlIChNYWMpPC9zcGFuPjwvZHQ+CiAgICAgIDxkZD5EZWxldGUgdXAgdG8gdGhlIHN0YXJ0IG9mIHRoZSB3b3JkIGJlZm9yZSB0aGUgY3Vyc29yLjwvZGQ+CgogICAgICA8ZHQgY2xhc3M9Y29tbWFuZCBpZD1jb21tYW5kX2RlbFdvcmRBZnRlcj48Y29kZT48c3Ryb25nPmRlbFdvcmRBZnRlcjwvc3Ryb25nPjwvY29kZT48c3BhbiBjbGFzcz1rZXliaW5kaW5nPkFsdC1EIChNYWMpPC9zcGFuPjwvZHQ+CiAgICAgIDxkZD5EZWxldGUgdXAgdG8gdGhlIGVuZCBvZiB0aGUgd29yZCBhZnRlciB0aGUgY3Vyc29yLjwvZGQ+CgogICAgICA8ZHQgY2xhc3M9Y29tbWFuZCBpZD1jb21tYW5kX2RlbEdyb3VwQmVmb3JlPjxjb2RlPjxzdHJvbmc+ZGVsR3JvdXBCZWZvcmU8L3N0cm9uZz48L2NvZGU+PHNwYW4gY2xhc3M9a2V5YmluZGluZz5DdHJsLUJhY2tzcGFjZSAoUEMpLCBBbHQtQmFja3NwYWNlIChNYWMpPC9zcGFuPjwvZHQ+CiAgICAgIDxkZD5EZWxldGUgdG8gdGhlIGxlZnQgb2YgdGhlIDxhIGhyZWY9IiNjb21tYW5kX2dvR3JvdXBMZWZ0Ij5ncm91cDwvYT4gYmVmb3JlIHRoZSBjdXJzb3IuPC9kZD4KCiAgICAgIDxkdCBjbGFzcz1jb21tYW5kIGlkPWNvbW1hbmRfZGVsR3JvdXBBZnRlcj48Y29kZT48c3Ryb25nPmRlbEdyb3VwQWZ0ZXI8L3N0cm9uZz48L2NvZGU+PHNwYW4gY2xhc3M9a2V5YmluZGluZz5DdHJsLURlbGV0ZSAoUEMpLCBDdHJsLUFsdC1CYWNrc3BhY2UgKE1hYyksIEFsdC1EZWxldGUgKE1hYyk8L3NwYW4+PC9kdD4KICAgICAgPGRkPkRlbGV0ZSB0byB0aGUgc3RhcnQgb2YgdGhlIDxhIGhyZWY9IiNjb21tYW5kX2dvR3JvdXBMZWZ0Ij5ncm91cDwvYT4gYWZ0ZXIgdGhlIGN1cnNvci48L2RkPgoKICAgICAgPGR0IGNsYXNzPWNvbW1hbmQgaWQ9Y29tbWFuZF9pbmRlbnRBdXRvPjxjb2RlPjxzdHJvbmc+aW5kZW50QXV0bzwvc3Ryb25nPjwvY29kZT48c3BhbiBjbGFzcz1rZXliaW5kaW5nPlNoaWZ0LVRhYjwvc3Bhbj48L2R0PgogICAgICA8ZGQ+QXV0by1pbmRlbnQgdGhlIGN1cnJlbnQgbGluZSBvciBzZWxlY3Rpb24uPC9kZD4KCiAgICAgIDxkdCBjbGFzcz1jb21tYW5kIGlkPWNvbW1hbmRfaW5kZW50TW9yZT48Y29kZT48c3Ryb25nPmluZGVudE1vcmU8L3N0cm9uZz48L2NvZGU+PHNwYW4gY2xhc3M9a2V5YmluZGluZz5DdHJsLV0gKFBDKSwgQ21kLV0gKE1hYyk8L3NwYW4+PC9kdD4KICAgICAgPGRkPkluZGVudCB0aGUgY3VycmVudCBsaW5lIG9yIHNlbGVjdGlvbiBieSBvbmUgPGEgaHJlZj0iI29wdGlvbl9pbmRlbnRVbml0Ij5pbmRlbnQgdW5pdDwvYT4uPC9kZD4KCiAgICAgIDxkdCBjbGFzcz1jb21tYW5kIGlkPWNvbW1hbmRfaW5kZW50TGVzcz48Y29kZT48c3Ryb25nPmluZGVudExlc3M8L3N0cm9uZz48L2NvZGU+PHNwYW4gY2xhc3M9a2V5YmluZGluZz5DdHJsLVsgKFBDKSwgQ21kLVsgKE1hYyk8L3NwYW4+PC9kdD4KICAgICAgPGRkPkRlZGVudCB0aGUgY3VycmVudCBsaW5lIG9yIHNlbGVjdGlvbiBieSBvbmUgPGEgaHJlZj0iI29wdGlvbl9pbmRlbnRVbml0Ij5pbmRlbnQgdW5pdDwvYT4uPC9kZD4KCiAgICAgIDxkdCBjbGFzcz1jb21tYW5kIGlkPWNvbW1hbmRfaW5zZXJ0VGFiPjxjb2RlPjxzdHJvbmc+aW5zZXJ0VGFiPC9zdHJvbmc+PC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5JbnNlcnQgYSB0YWIgY2hhcmFjdGVyIGF0IHRoZSBjdXJzb3IuPC9kZD4KCiAgICAgIDxkdCBjbGFzcz1jb21tYW5kIGlkPWNvbW1hbmRfaW5zZXJ0U29mdFRhYj48Y29kZT48c3Ryb25nPmluc2VydFNvZnRUYWI8L3N0cm9uZz48L2NvZGU+PC9kdD4KICAgICAgPGRkPkluc2VydCB0aGUgYW1vdW50IG9mIHNwYWNlcyB0aGF0IG1hdGNoIHRoZSB3aWR0aCBhIHRhYiBhdAogICAgICB0aGUgY3Vyc29yIHBvc2l0aW9uIHdvdWxkIGhhdmUuPC9kZD4KCiAgICAgIDxkdCBjbGFzcz1jb21tYW5kIGlkPWNvbW1hbmRfZGVmYXVsdFRhYj48Y29kZT48c3Ryb25nPmRlZmF1bHRUYWI8L3N0cm9uZz48L2NvZGU+PHNwYW4gY2xhc3M9a2V5YmluZGluZz5UYWI8L3NwYW4+PC9kdD4KICAgICAgPGRkPklmIHNvbWV0aGluZyBpcyBzZWxlY3RlZCwgaW5kZW50IGl0IGJ5CiAgICAgIG9uZSA8YSBocmVmPSIjb3B0aW9uX2luZGVudFVuaXQiPmluZGVudCB1bml0PC9hPi4gSWYgbm90aGluZyBpcwogICAgICBzZWxlY3RlZCwgaW5zZXJ0IGEgdGFiIGNoYXJhY3Rlci48L2RkPgoKICAgICAgPGR0IGNsYXNzPWNvbW1hbmQgaWQ9Y29tbWFuZF90cmFuc3Bvc2VDaGFycz48Y29kZT48c3Ryb25nPnRyYW5zcG9zZUNoYXJzPC9zdHJvbmc+PC9jb2RlPjxzcGFuIGNsYXNzPWtleWJpbmRpbmc+Q3RybC1UIChNYWMpPC9zcGFuPjwvZHQ+CiAgICAgIDxkZD5Td2FwIHRoZSBjaGFyYWN0ZXJzIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIGN1cnNvci48L2RkPgoKICAgICAgPGR0IGNsYXNzPWNvbW1hbmQgaWQ9Y29tbWFuZF9uZXdsaW5lQW5kSW5kZW50Pjxjb2RlPjxzdHJvbmc+bmV3bGluZUFuZEluZGVudDwvc3Ryb25nPjwvY29kZT48c3BhbiBjbGFzcz1rZXliaW5kaW5nPkVudGVyPC9zcGFuPjwvZHQ+CiAgICAgIDxkZD5JbnNlcnQgYSBuZXdsaW5lIGFuZCBhdXRvLWluZGVudCB0aGUgbmV3IGxpbmUuPC9kZD4KCiAgICAgIDxkdCBjbGFzcz1jb21tYW5kIGlkPWNvbW1hbmRfdG9nZ2xlT3ZlcndyaXRlPjxjb2RlPjxzdHJvbmc+dG9nZ2xlT3ZlcndyaXRlPC9zdHJvbmc+PC9jb2RlPjxzcGFuIGNsYXNzPWtleWJpbmRpbmc+SW5zZXJ0PC9zcGFuPjwvZHQ+CiAgICAgIDxkZD5GbGlwIHRoZSA8YSBocmVmPSIjdG9nZ2xlT3ZlcndyaXRlIj5vdmVyd3JpdGU8L2E+IGZsYWcuPC9kZD4KCiAgICAgIDxkdCBjbGFzcz1jb21tYW5kIGlkPWNvbW1hbmRfc2F2ZT48Y29kZT48c3Ryb25nPnNhdmU8L3N0cm9uZz48L2NvZGU+PHNwYW4gY2xhc3M9a2V5YmluZGluZz5DdHJsLVMgKFBDKSwgQ21kLVMgKE1hYyk8L3NwYW4+PC9kdD4KICAgICAgPGRkPk5vdCBkZWZpbmVkIGJ5IHRoZSBjb3JlIGxpYnJhcnksIG9ubHkgcmVmZXJyZWQgdG8gaW4KICAgICAga2V5IG1hcHMuIEludGVuZGVkIHRvIHByb3ZpZGUgYW4gZWFzeSB3YXkgZm9yIHVzZXIgY29kZSB0byBkZWZpbmUKICAgICAgYSBzYXZlIGNvbW1hbmQuPC9kZD4KCiAgICAgIDxkdCBjbGFzcz1jb21tYW5kIGlkPWNvbW1hbmRfZmluZD48Y29kZT48c3Ryb25nPmZpbmQ8L3N0cm9uZz48L2NvZGU+PHNwYW4gY2xhc3M9a2V5YmluZGluZz5DdHJsLUYgKFBDKSwgQ21kLUYgKE1hYyk8L3NwYW4+PC9kdD4KICAgICAgPGR0IGNsYXNzPWNvbW1hbmQgaWQ9Y29tbWFuZF9maW5kTmV4dD48Y29kZT48c3Ryb25nPmZpbmROZXh0PC9zdHJvbmc+PC9jb2RlPjxzcGFuIGNsYXNzPWtleWJpbmRpbmc+Q3RybC1HIChQQyksIENtZC1HIChNYWMpPC9zcGFuPjwvZHQ+CiAgICAgIDxkdCBjbGFzcz1jb21tYW5kIGlkPWNvbW1hbmRfZmluZFByZXY+PGNvZGU+PHN0cm9uZz5maW5kUHJldjwvc3Ryb25nPjwvY29kZT48c3BhbiBjbGFzcz1rZXliaW5kaW5nPlNoaWZ0LUN0cmwtRyAoUEMpLCBTaGlmdC1DbWQtRyAoTWFjKTwvc3Bhbj48L2R0PgogICAgICA8ZHQgY2xhc3M9Y29tbWFuZCBpZD1jb21tYW5kX3JlcGxhY2U+PGNvZGU+PHN0cm9uZz5yZXBsYWNlPC9zdHJvbmc+PC9jb2RlPjxzcGFuIGNsYXNzPWtleWJpbmRpbmc+U2hpZnQtQ3RybC1GIChQQyksIENtZC1BbHQtRiAoTWFjKTwvc3Bhbj48L2R0PgogICAgICA8ZHQgY2xhc3M9Y29tbWFuZCBpZD1jb21tYW5kX3JlcGxhY2VBbGw+PGNvZGU+PHN0cm9uZz5yZXBsYWNlQWxsPC9zdHJvbmc+PC9jb2RlPjxzcGFuIGNsYXNzPWtleWJpbmRpbmc+U2hpZnQtQ3RybC1SIChQQyksIFNoaWZ0LUNtZC1BbHQtRiAoTWFjKTwvc3Bhbj48L2R0PgogICAgICA8ZGQ+Tm90IGRlZmluZWQgYnkgdGhlIGNvcmUgbGlicmFyeSwgYnV0IGRlZmluZWQgaW4KICAgICAgdGhlIDxhIGhyZWY9IiNhZGRvbl9zZWFyY2giPnNlYXJjaCBhZGRvbjwvYT4gKG9yIGN1c3RvbSBjbGllbnQKICAgICAgYWRkb25zKS48L2RkPgoKICAgIDwvZGw+Cgo8L3NlY3Rpb24+Cgo8c2VjdGlvbiBpZD1zdHlsaW5nPgogICAgPGgyPkN1c3RvbWl6ZWQgU3R5bGluZzwvaDI+CgogICAgPHA+VXAgdG8gYSBjZXJ0YWluIGV4dGVudCwgQ29kZU1pcnJvcidzIGxvb2sgY2FuIGJlIGNoYW5nZWQgYnkKICAgIG1vZGlmeWluZyBzdHlsZSBzaGVldCBmaWxlcy4gVGhlIHN0eWxlIHNoZWV0cyBzdXBwbGllZCBieSBtb2RlcwogICAgc2ltcGx5IHByb3ZpZGUgdGhlIGNvbG9ycyBmb3IgdGhhdCBtb2RlLCBhbmQgY2FuIGJlIGFkYXB0ZWQgaW4gYQogICAgdmVyeSBzdHJhaWdodGZvcndhcmQgd2F5LiBUbyBzdHlsZSB0aGUgZWRpdG9yIGl0c2VsZiwgaXQgaXMKICAgIHBvc3NpYmxlIHRvIGFsdGVyIG9yIG92ZXJyaWRlIHRoZSBzdHlsZXMgZGVmaW5lZAogICAgaW4gPGEgaHJlZj0iLi4vbGliL2NvZGVtaXJyb3IuY3NzIj48Y29kZT5jb2RlbWlycm9yLmNzczwvY29kZT48L2E+LjwvcD4KCiAgICA8cD5Tb21lIGNhcmUgbXVzdCBiZSB0YWtlbiB0aGVyZSwgc2luY2UgYSBsb3Qgb2YgdGhlIHJ1bGVzIGluIHRoaXMKICAgIGZpbGUgYXJlIG5lY2Vzc2FyeSB0byBoYXZlIENvZGVNaXJyb3IgZnVuY3Rpb24gcHJvcGVybHkuIEFkanVzdGluZwogICAgY29sb3JzIHNob3VsZCBiZSBzYWZlLCBvZiBjb3Vyc2UsIGFuZCB3aXRoIHNvbWUgY2FyZSBhIGxvdCBvZgogICAgb3RoZXIgdGhpbmdzIGNhbiBiZSBjaGFuZ2VkIGFzIHdlbGwuIFRoZSBDU1MgY2xhc3NlcyBkZWZpbmVkIGluCiAgICB0aGlzIGZpbGUgc2VydmUgdGhlIGZvbGxvd2luZyByb2xlczo8L3A+CgogICAgPGRsPgogICAgICA8ZHQgaWQ9ImNsYXNzX0NvZGVNaXJyb3IiPjxjb2RlPjxzdHJvbmc+Q29kZU1pcnJvcjwvc3Ryb25nPjwvY29kZT48L2R0PgogICAgICA8ZGQ+VGhlIG91dGVyIGVsZW1lbnQgb2YgdGhlIGVkaXRvci4gVGhpcyBzaG91bGQgYmUgdXNlZCBmb3IgdGhlCiAgICAgIGVkaXRvciB3aWR0aCwgaGVpZ2h0LCBib3JkZXJzIGFuZCBwb3NpdGlvbmluZy4gQ2FuIGFsc28gYmUgdXNlZAogICAgICB0byBzZXQgc3R5bGVzIHRoYXQgc2hvdWxkIGhvbGQgZm9yIGV2ZXJ5dGhpbmcgaW5zaWRlIHRoZSBlZGl0b3IKICAgICAgKHN1Y2ggYXMgZm9udCBhbmQgZm9udCBzaXplKSwgb3IgdG8gc2V0IGEgYmFja2dyb3VuZC4gU2V0dGluZwogICAgICB0aGlzIGNsYXNzJyA8Y29kZT5oZWlnaHQ8L2NvZGU+IHN0eWxlIHRvIDxjb2RlPmF1dG88L2NvZGU+IHdpbGwKICAgICAgbWFrZSB0aGUgZWRpdG9yIDxhIGhyZWY9Ii4uL2RlbW8vcmVzaXplLmh0bWwiPnJlc2l6ZSB0byBmaXQgaXRzCiAgICAgIGNvbnRlbnQ8L2E+IChpdCBpcyByZWNvbW1lbmRlZCB0byBhbHNvIHNldAogICAgICB0aGUgPGEgaHJlZj0iI29wdGlvbl92aWV3cG9ydE1hcmdpbiI+PGNvZGU+dmlld3BvcnRNYXJnaW48L2NvZGU+CiAgICAgIG9wdGlvbjwvYT4gdG8gPGNvZGU+SW5maW5pdHk8L2NvZGU+IHdoZW4gZG9pbmcgdGhpcy48L2RkPgoKICAgICAgPGR0IGlkPSJjbGFzc19Db2RlTWlycm9yX2ZvY3VzZWQiPjxjb2RlPjxzdHJvbmc+Q29kZU1pcnJvci1mb2N1c2VkPC9zdHJvbmc+PC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5XaGVuZXZlciB0aGUgZWRpdG9yIGlzIGZvY3VzZWQsIHRoZSB0b3AgZWxlbWVudCBnZXRzIHRoaXMKICAgICAgY2xhc3MuIFRoaXMgaXMgdXNlZCB0byBoaWRlIHRoZSBjdXJzb3IgYW5kIGdpdmUgdGhlIHNlbGVjdGlvbiBhCiAgICAgIGRpZmZlcmVudCBjb2xvciB3aGVuIHRoZSBlZGl0b3IgaXMgbm90IGZvY3VzZWQuPC9kZD4KCiAgICAgIDxkdCBpZD0iY2xhc3NfQ29kZU1pcnJvcl9ndXR0ZXJzIj48Y29kZT48c3Ryb25nPkNvZGVNaXJyb3ItZ3V0dGVyczwvc3Ryb25nPjwvY29kZT48L2R0PgogICAgICA8ZGQ+VGhpcyBpcyB0aGUgYmFja2Ryb3AgZm9yIGFsbCBndXR0ZXJzLiBVc2UgaXQgdG8gc2V0IHRoZQogICAgICBkZWZhdWx0IGd1dHRlciBiYWNrZ3JvdW5kIGNvbG9yLCBhbmQgb3B0aW9uYWxseSBhZGQgYSBib3JkZXIgb24KICAgICAgdGhlIHJpZ2h0IG9mIHRoZSBndXR0ZXJzLjwvZGQ+CgogICAgICA8ZHQgaWQ9ImNsYXNzX0NvZGVNaXJyb3JfbGluZW51bWJlcnMiPjxjb2RlPjxzdHJvbmc+Q29kZU1pcnJvci1saW5lbnVtYmVyczwvc3Ryb25nPjwvY29kZT48L2R0PgogICAgICA8ZGQ+VXNlIHRoaXMgZm9yIGdpdmluZyBhIGJhY2tncm91bmQgb3Igd2lkdGggdG8gdGhlIGxpbmUgbnVtYmVyCiAgICAgIGd1dHRlci48L2RkPgoKICAgICAgPGR0IGlkPSJjbGFzc19Db2RlTWlycm9yX2xpbmVudW1iZXIiPjxjb2RlPjxzdHJvbmc+Q29kZU1pcnJvci1saW5lbnVtYmVyPC9zdHJvbmc+PC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5Vc2VkIHRvIHN0eWxlIHRoZSBhY3R1YWwgaW5kaXZpZHVhbCBsaW5lIG51bWJlcnMuIFRoZXNlCiAgICAgIHdvbid0IGJlIGNoaWxkcmVuIG9mIHRoZSA8Y29kZT5Db2RlTWlycm9yLWxpbmVudW1iZXJzPC9jb2RlPgogICAgICAocGx1cmFsKSBlbGVtZW50LCBidXQgcmF0aGVyIHdpbGwgYmUgYWJzb2x1dGVseSBwb3NpdGlvbmVkIHRvCiAgICAgIG92ZXJsYXkgaXQuIFVzZSB0aGlzIHRvIHNldCBhbGlnbm1lbnQgYW5kIHRleHQgcHJvcGVydGllcyBmb3IKICAgICAgdGhlIGxpbmUgbnVtYmVycy48L2RkPgoKICAgICAgPGR0IGlkPSJjbGFzc19Db2RlTWlycm9yX2xpbmVzIj48Y29kZT48c3Ryb25nPkNvZGVNaXJyb3ItbGluZXM8L3N0cm9uZz48L2NvZGU+PC9kdD4KICAgICAgPGRkPlRoZSB2aXNpYmxlIGxpbmVzLiBUaGlzIGlzIHdoZXJlIHlvdSBzcGVjaWZ5IHZlcnRpY2FsCiAgICAgIHBhZGRpbmcgZm9yIHRoZSBlZGl0b3IgY29udGVudC48L2RkPgoKICAgICAgPGR0IGlkPSJjbGFzc19Db2RlTWlycm9yX2N1cnNvciI+PGNvZGU+PHN0cm9uZz5Db2RlTWlycm9yLWN1cnNvcjwvc3Ryb25nPjwvY29kZT48L2R0PgogICAgICA8ZGQ+VGhlIGN1cnNvciBpcyBhIGJsb2NrIGVsZW1lbnQgdGhhdCBpcyBhYnNvbHV0ZWx5IHBvc2l0aW9uZWQuCiAgICAgIFlvdSBjYW4gbWFrZSBpdCBsb29rIHdoaWNoZXZlciB3YXkgeW91IHdhbnQuPC9kZD4KCiAgICAgIDxkdCBpZD0iY2xhc3NfQ29kZU1pcnJvcl9zZWxlY3RlZCI+PGNvZGU+PHN0cm9uZz5Db2RlTWlycm9yLXNlbGVjdGVkPC9zdHJvbmc+PC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5UaGUgc2VsZWN0aW9uIGlzIHJlcHJlc2VudGVkIGJ5IDxjb2RlPnNwYW48L2NvZGU+IGVsZW1lbnRzCiAgICAgIHdpdGggdGhpcyBjbGFzcy48L2RkPgoKICAgICAgPGR0IGlkPSJjbGFzc19Db2RlTWlycm9yX21hdGNoaW5nYnJhY2tldCI+PGNvZGU+PHN0cm9uZz5Db2RlTWlycm9yLW1hdGNoaW5nYnJhY2tldDwvc3Ryb25nPjwvY29kZT4sCiAgICAgICAgPGNvZGU+PHN0cm9uZz5Db2RlTWlycm9yLW5vbm1hdGNoaW5nYnJhY2tldDwvc3Ryb25nPjwvY29kZT48L2R0PgogICAgICA8ZGQ+VGhlc2UgYXJlIHVzZWQgdG8gc3R5bGUgbWF0Y2hlZCAob3IgdW5tYXRjaGVkKSBicmFja2V0cy48L2RkPgogICAgPC9kbD4KCiAgICA8cD5JZiB5b3VyIHBhZ2UncyBzdHlsZSBzaGVldHMgZG8gZnVua3kgdGhpbmdzIHRvCiAgICBhbGwgPGNvZGU+ZGl2PC9jb2RlPiBvciA8Y29kZT5wcmU8L2NvZGU+IGVsZW1lbnRzICh5b3UgcHJvYmFibHkKICAgIHNob3VsZG4ndCBkbyB0aGF0KSwgeW91J2xsIGhhdmUgdG8gZGVmaW5lIHJ1bGVzIHRvIGNhbmNlbCB0aGVzZQogICAgZWZmZWN0cyBvdXQgYWdhaW4gZm9yIGVsZW1lbnRzIHVuZGVyIHRoZSA8Y29kZT5Db2RlTWlycm9yPC9jb2RlPgogICAgY2xhc3MuPC9wPgoKICAgIDxwPlRoZW1lcyBhcmUgYWxzbyBzaW1wbHkgQ1NTIGZpbGVzLCB3aGljaCBkZWZpbmUgY29sb3JzIGZvcgogICAgdmFyaW91cyBzeW50YWN0aWMgZWxlbWVudHMuIFNlZSB0aGUgZmlsZXMgaW4KICAgIHRoZSA8YSBocmVmPSIuLi90aGVtZS8iPjxjb2RlPnRoZW1lPC9jb2RlPjwvYT4gZGlyZWN0b3J5LjwvcD4KPC9zZWN0aW9uPgoKPHNlY3Rpb24gaWQ9YXBpPgogICAgPGgyPlByb2dyYW1taW5nIEFQSTwvaDI+CgogICAgPHA+QSBsb3Qgb2YgQ29kZU1pcnJvciBmZWF0dXJlcyBhcmUgb25seSBhdmFpbGFibGUgdGhyb3VnaCBpdHMKICAgIEFQSS4gVGh1cywgeW91IG5lZWQgdG8gd3JpdGUgY29kZSAob3IKICAgIHVzZSA8YSBocmVmPSIjYWRkb25zIj5hZGRvbnM8L2E+KSBpZiB5b3Ugd2FudCB0byBleHBvc2UgdGhlbSB0bwogICAgeW91ciB1c2Vycy48L3A+CgogICAgPHA+V2hlbmV2ZXIgcG9pbnRzIGluIHRoZSBkb2N1bWVudCBhcmUgcmVwcmVzZW50ZWQsIHRoZSBBUEkgdXNlcwogICAgb2JqZWN0cyB3aXRoIDxjb2RlPmxpbmU8L2NvZGU+IGFuZCA8Y29kZT5jaDwvY29kZT4gcHJvcGVydGllcy4KICAgIEJvdGggYXJlIHplcm8tYmFzZWQuIENvZGVNaXJyb3IgbWFrZXMgc3VyZSB0byAnY2xpcCcgYW55IHBvc2l0aW9ucwogICAgcGFzc2VkIGJ5IGNsaWVudCBjb2RlIHNvIHRoYXQgdGhleSBmaXQgaW5zaWRlIHRoZSBkb2N1bWVudCwgc28geW91CiAgICBzaG91bGRuJ3Qgd29ycnkgdG9vIG11Y2ggYWJvdXQgc2FuaXRpemluZyB5b3VyIGNvb3JkaW5hdGVzLiBJZiB5b3UKICAgIGdpdmUgPGNvZGU+Y2g8L2NvZGU+IGEgdmFsdWUgb2YgPGNvZGU+bnVsbDwvY29kZT4sIG9yIGRvbid0CiAgICBzcGVjaWZ5IGl0LCBpdCB3aWxsIGJlIHJlcGxhY2VkIHdpdGggdGhlIGxlbmd0aCBvZiB0aGUgc3BlY2lmaWVkCiAgICBsaW5lLjwvcD4KCiAgICA8cD5NZXRob2RzIHByZWZpeGVkIHdpdGggPGNvZGU+ZG9jLjwvY29kZT4gY2FuLCB1bmxlc3Mgb3RoZXJ3aXNlCiAgICBzcGVjaWZpZWQsIGJlIGNhbGxlZCBib3RoIG9uIDxjb2RlPkNvZGVNaXJyb3I8L2NvZGU+IChlZGl0b3IpCiAgICBpbnN0YW5jZXMgYW5kIDxjb2RlPkNvZGVNaXJyb3IuRG9jPC9jb2RlPiBpbnN0YW5jZXMuIE1ldGhvZHMKICAgIHByZWZpeGVkIHdpdGggPGNvZGU+Y20uPC9jb2RlPiBhcmUgPGVtPm9ubHk8L2VtPiBhdmFpbGFibGUKICAgIG9uIDxjb2RlPkNvZGVNaXJyb3I8L2NvZGU+IGluc3RhbmNlcy48L3A+CgogICAgPGgzIGlkPSJhcGlfY29uc3RydWN0b3IiPkNvbnN0cnVjdG9yPC9oMz4KCiAgICA8cCBpZD0iQ29kZU1pcnJvciI+Q29uc3RydWN0aW5nIGFuIGVkaXRvciBpbnN0YW5jZSBpcyBkb25lIHdpdGgKICAgIHRoZSA8Y29kZT48c3Ryb25nPkNvZGVNaXJyb3I8L3N0cm9uZz4ocGxhY2U6IEVsZW1lbnR8Zm4oRWxlbWVudCksCiAgICA/b3B0aW9uOiBvYmplY3QpPC9jb2RlPiBjb25zdHJ1Y3Rvci4gSWYgdGhlIDxjb2RlPnBsYWNlPC9jb2RlPgogICAgYXJndW1lbnQgaXMgYSBET00gZWxlbWVudCwgdGhlIGVkaXRvciB3aWxsIGJlIGFwcGVuZGVkIHRvIGl0LiBJZgogICAgaXQgaXMgYSBmdW5jdGlvbiwgaXQgd2lsbCBiZSBjYWxsZWQsIGFuZCBpcyBleHBlY3RlZCB0byBwbGFjZSB0aGUKICAgIGVkaXRvciBpbnRvIHRoZSBkb2N1bWVudC4gPGNvZGU+b3B0aW9uczwvY29kZT4gbWF5IGJlIGFuIGVsZW1lbnQKICAgIG1hcHBpbmcgPGEgaHJlZj0iI2NvbmZpZyI+b3B0aW9uIG5hbWVzPC9hPiB0byB2YWx1ZXMuIFRoZSBvcHRpb25zCiAgICB0aGF0IGl0IGRvZXNuJ3QgZXhwbGljaXRseSBzcGVjaWZ5IChvciBhbGwgb3B0aW9ucywgaWYgaXQgaXMgbm90CiAgICBwYXNzZWQpIHdpbGwgYmUgdGFrZW4KICAgIGZyb20gPGEgaHJlZj0iI2RlZmF1bHRzIj48Y29kZT5Db2RlTWlycm9yLmRlZmF1bHRzPC9jb2RlPjwvYT4uPC9wPgoKICAgIDxwPk5vdGUgdGhhdCB0aGUgb3B0aW9ucyBvYmplY3QgcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3RvciB3aWxsIGJlCiAgICBtdXRhdGVkIHdoZW4gdGhlIGluc3RhbmNlJ3Mgb3B0aW9ucwogICAgYXJlIDxhIGhyZWY9IiNzZXRPcHRpb24iPmNoYW5nZWQ8L2E+LCBzbyB5b3Ugc2hvdWxkbid0IHNoYXJlIHN1Y2gKICAgIG9iamVjdHMgYmV0d2VlbiBpbnN0YW5jZXMuPC9wPgoKICAgIDxwPlNlZSA8YSBocmVmPSIjZnJvbVRleHRBcmVhIj48Y29kZT5Db2RlTWlycm9yLmZyb21UZXh0QXJlYTwvY29kZT48L2E+CiAgICBmb3IgYW5vdGhlciB3YXkgdG8gY29uc3RydWN0IGFuIGVkaXRvciBpbnN0YW5jZS48L3A+CgogICAgPGgzIGlkPSJhcGlfY29udGVudCI+Q29udGVudCBtYW5pcHVsYXRpb24gbWV0aG9kczwvaDM+CgogICAgPGRsPgogICAgICA8ZHQgaWQ9ImdldFZhbHVlIj48Y29kZT48c3Ryb25nPmRvYy5nZXRWYWx1ZTwvc3Ryb25nPig/c2VwYXJhdG9yOiBzdHJpbmcpIOKGkiBzdHJpbmc8L2NvZGU+PC9kdD4KICAgICAgPGRkPkdldCB0aGUgY3VycmVudCBlZGl0b3IgY29udGVudC4gWW91IGNhbiBwYXNzIGl0IGFuIG9wdGlvbmFsCiAgICAgIGFyZ3VtZW50IHRvIHNwZWNpZnkgdGhlIHN0cmluZyB0byBiZSB1c2VkIHRvIHNlcGFyYXRlIGxpbmVzCiAgICAgIChkZWZhdWx0cyB0byA8Y29kZT4iXG4iPC9jb2RlPikuPC9kZD4KICAgICAgPGR0IGlkPSJzZXRWYWx1ZSI+PGNvZGU+PHN0cm9uZz5kb2Muc2V0VmFsdWU8L3N0cm9uZz4oY29udGVudDogc3RyaW5nKTwvY29kZT48L2R0PgogICAgICA8ZGQ+U2V0IHRoZSBlZGl0b3IgY29udGVudC48L2RkPgoKICAgICAgPGR0IGlkPSJnZXRSYW5nZSI+PGNvZGU+PHN0cm9uZz5kb2MuZ2V0UmFuZ2U8L3N0cm9uZz4oZnJvbToge2xpbmUsIGNofSwgdG86IHtsaW5lLCBjaH0sID9zZXBhcmF0b3I6IHN0cmluZykg4oaSIHN0cmluZzwvY29kZT48L2R0PgogICAgICA8ZGQ+R2V0IHRoZSB0ZXh0IGJldHdlZW4gdGhlIGdpdmVuIHBvaW50cyBpbiB0aGUgZWRpdG9yLCB3aGljaAogICAgICBzaG91bGQgYmUgPGNvZGU+e2xpbmUsIGNofTwvY29kZT4gb2JqZWN0cy4gQW4gb3B0aW9uYWwgdGhpcmQKICAgICAgYXJndW1lbnQgY2FuIGJlIGdpdmVuIHRvIGluZGljYXRlIHRoZSBsaW5lIHNlcGFyYXRvciBzdHJpbmcgdG8KICAgICAgdXNlIChkZWZhdWx0cyB0byA8Y29kZT4iXG4iPC9jb2RlPikuPC9kZD4KICAgICAgPGR0IGlkPSJyZXBsYWNlUmFuZ2UiPjxjb2RlPjxzdHJvbmc+ZG9jLnJlcGxhY2VSYW5nZTwvc3Ryb25nPihyZXBsYWNlbWVudDogc3RyaW5nLCBmcm9tOiB7bGluZSwgY2h9LCB0bzrCoHtsaW5lLMKgY2h9LCA/b3JpZ2luOsKgc3RyaW5nKTwvY29kZT48L2R0PgogICAgICA8ZGQ+UmVwbGFjZSB0aGUgcGFydCBvZiB0aGUgZG9jdW1lbnQgYmV0d2VlbiA8Y29kZT5mcm9tPC9jb2RlPgogICAgICBhbmQgPGNvZGU+dG88L2NvZGU+IHdpdGggdGhlIGdpdmVuIHN0cmluZy4gPGNvZGU+ZnJvbTwvY29kZT4KICAgICAgYW5kIDxjb2RlPnRvPC9jb2RlPiBtdXN0IGJlIDxjb2RlPntsaW5lLCBjaH08L2NvZGU+CiAgICAgIG9iamVjdHMuIDxjb2RlPnRvPC9jb2RlPiBjYW4gYmUgbGVmdCBvZmYgdG8gc2ltcGx5IGluc2VydCB0aGUKICAgICAgc3RyaW5nIGF0IHBvc2l0aW9uIDxjb2RlPmZyb208L2NvZGU+LiBXaGVuIDxjb2RlPm9yaWdpbjwvY29kZT4KICAgICAgaXMgZ2l2ZW4sIGl0IHdpbGwgYmUgcGFzc2VkIG9uCiAgICAgIHRvIDxhIGhyZWY9IiNldmVudF9jaGFuZ2UiPjxjb2RlPiJjaGFuZ2UiPC9jb2RlPiBldmVudHM8L2E+LCBhbmQKICAgICAgaXRzIGZpcnN0IGxldHRlciB3aWxsIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBjaGFuZ2UKICAgICAgY2FuIGJlIG1lcmdlZCB3aXRoIHByZXZpb3VzIGhpc3RvcnkgZXZlbnRzLCBpbiB0aGUgd2F5IGRlc2NyaWJlZAogICAgICBmb3IgPGEgaHJlZj0iI3NlbGVjdGlvbl9vcmlnaW4iPnNlbGVjdGlvbiBvcmlnaW5zPC9hPi48L2RkPgoKICAgICAgPGR0IGlkPSJnZXRMaW5lIj48Y29kZT48c3Ryb25nPmRvYy5nZXRMaW5lPC9zdHJvbmc+KG46IGludGVnZXIpIOKGkiBzdHJpbmc8L2NvZGU+PC9kdD4KICAgICAgPGRkPkdldCB0aGUgY29udGVudCBvZiBsaW5lIDxjb2RlPm48L2NvZGU+LjwvZGQ+CgogICAgICA8ZHQgaWQ9ImxpbmVDb3VudCI+PGNvZGU+PHN0cm9uZz5kb2MubGluZUNvdW50PC9zdHJvbmc+KCkg4oaSIGludGVnZXI8L2NvZGU+PC9kdD4KICAgICAgPGRkPkdldCB0aGUgbnVtYmVyIG9mIGxpbmVzIGluIHRoZSBlZGl0b3IuPC9kZD4KICAgICAgPGR0IGlkPSJmaXJzdExpbmUiPjxjb2RlPjxzdHJvbmc+ZG9jLmZpcnN0TGluZTwvc3Ryb25nPigpIOKGkiBpbnRlZ2VyPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5HZXQgdGhlIGZpcnN0IGxpbmUgb2YgdGhlIGVkaXRvci4gVGhpcyB3aWxsCiAgICAgIHVzdWFsbHkgYmUgemVybyBidXQgZm9yIDxhIGhyZWY9IiNsaW5rZWREb2NfZnJvbSI+bGlua2VkIHN1Yi12aWV3czwvYT4sCiAgICAgIG9yIDxhIGhyZWY9IiNhcGlfZG9jIj5kb2N1bWVudHM8L2E+IGluc3RhbnRpYXRlZCB3aXRoIGEgbm9uLXplcm8KICAgICAgZmlyc3QgbGluZSwgaXQgbWlnaHQgcmV0dXJuIG90aGVyIHZhbHVlcy48L2RkPgogICAgICA8ZHQgaWQ9Imxhc3RMaW5lIj48Y29kZT48c3Ryb25nPmRvYy5sYXN0TGluZTwvc3Ryb25nPigpIOKGkiBpbnRlZ2VyPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5HZXQgdGhlIGxhc3QgbGluZSBvZiB0aGUgZWRpdG9yLiBUaGlzIHdpbGwKICAgICAgdXN1YWxseSBiZSA8Y29kZT5kb2MubGluZUNvdW50KCkgLSAxPC9jb2RlPiwKICAgICAgYnV0IGZvciA8YSBocmVmPSIjbGlua2VkRG9jX2Zyb20iPmxpbmtlZCBzdWItdmlld3M8L2E+LAogICAgICBpdCBtaWdodCByZXR1cm4gb3RoZXIgdmFsdWVzLjwvZGQ+CgogICAgICA8ZHQgaWQ9ImdldExpbmVIYW5kbGUiPjxjb2RlPjxzdHJvbmc+ZG9jLmdldExpbmVIYW5kbGU8L3N0cm9uZz4obnVtOiBpbnRlZ2VyKSDihpIgTGluZUhhbmRsZTwvY29kZT48L2R0PgogICAgICA8ZGQ+RmV0Y2hlcyB0aGUgbGluZSBoYW5kbGUgZm9yIHRoZSBnaXZlbiBsaW5lIG51bWJlci48L2RkPgogICAgICA8ZHQgaWQ9ImdldExpbmVOdW1iZXIiPjxjb2RlPjxzdHJvbmc+ZG9jLmdldExpbmVOdW1iZXI8L3N0cm9uZz4oaGFuZGxlOiBMaW5lSGFuZGxlKSDihpIgaW50ZWdlcjwvY29kZT48L2R0PgogICAgICA8ZGQ+R2l2ZW4gYSBsaW5lIGhhbmRsZSwgcmV0dXJucyB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGF0CiAgICAgIGxpbmUgKG9yIDxjb2RlPm51bGw8L2NvZGU+IHdoZW4gaXQgaXMgbm8gbG9uZ2VyIGluIHRoZQogICAgICBkb2N1bWVudCkuPC9kZD4KICAgICAgPGR0IGlkPSJlYWNoTGluZSI+PGNvZGU+PHN0cm9uZz5kb2MuZWFjaExpbmU8L3N0cm9uZz4oZjogKGxpbmU6IExpbmVIYW5kbGUpKTwvY29kZT48L2R0PgogICAgICA8ZHQ+PGNvZGU+PHN0cm9uZz5kb2MuZWFjaExpbmU8L3N0cm9uZz4oc3RhcnQ6IGludGVnZXIsIGVuZDogaW50ZWdlciwgZjogKGxpbmU6IExpbmVIYW5kbGUpKTwvY29kZT48L2R0PgogICAgICA8ZGQ+SXRlcmF0ZSBvdmVyIHRoZSB3aG9sZSBkb2N1bWVudCwgb3IgaWYgPGNvZGU+c3RhcnQ8L2NvZGU+CiAgICAgIGFuZCA8Y29kZT5lbmQ8L2NvZGU+IGxpbmUgbnVtYmVycyBhcmUgZ2l2ZW4sIHRoZSByYW5nZQogICAgICBmcm9tIDxjb2RlPnN0YXJ0PC9jb2RlPiB1cCB0byAobm90IGluY2x1ZGluZykgPGNvZGU+ZW5kPC9jb2RlPiwKICAgICAgYW5kIGNhbGwgPGNvZGU+ZjwvY29kZT4gZm9yIGVhY2ggbGluZSwgcGFzc2luZyB0aGUgbGluZSBoYW5kbGUuCiAgICAgIFRoaXMgaXMgYSBmYXN0ZXIgd2F5IHRvIHZpc2l0IGEgcmFuZ2Ugb2YgbGluZSBoYW5kbGVycyB0aGFuCiAgICAgIGNhbGxpbmcgPGEgaHJlZj0iI2dldExpbmVIYW5kbGUiPjxjb2RlPmdldExpbmVIYW5kbGU8L2NvZGU+PC9hPgogICAgICBmb3IgZWFjaCBvZiB0aGVtLiBOb3RlIHRoYXQgbGluZSBoYW5kbGVzIGhhdmUKICAgICAgYSA8Y29kZT50ZXh0PC9jb2RlPiBwcm9wZXJ0eSBjb250YWluaW5nIHRoZSBsaW5lJ3MgY29udGVudCAoYXMgYQogICAgICBzdHJpbmcpLjwvZGQ+CgogICAgICA8ZHQgaWQ9Im1hcmtDbGVhbiI+PGNvZGU+PHN0cm9uZz5kb2MubWFya0NsZWFuPC9zdHJvbmc+KCk8L2NvZGU+PC9kdD4KICAgICAgPGRkPlNldCB0aGUgZWRpdG9yIGNvbnRlbnQgYXMgJ2NsZWFuJywgYSBmbGFnIHRoYXQgaXQgd2lsbAogICAgICByZXRhaW4gdW50aWwgaXQgaXMgZWRpdGVkLCBhbmQgd2hpY2ggd2lsbCBiZSBzZXQgYWdhaW4gd2hlbiBzdWNoCiAgICAgIGFuIGVkaXQgaXMgdW5kb25lIGFnYWluLiBVc2VmdWwgdG8gdHJhY2sgd2hldGhlciB0aGUgY29udGVudAogICAgICBuZWVkcyB0byBiZSBzYXZlZC4gVGhpcyBmdW5jdGlvbiBpcyBkZXByZWNhdGVkIGluIGZhdm9yCiAgICAgIG9mIDxhIGhyZWY9IiNjaGFuZ2VHZW5lcmF0aW9uIj48Y29kZT5jaGFuZ2VHZW5lcmF0aW9uPC9jb2RlPjwvYT4sCiAgICAgIHdoaWNoIGFsbG93cyBtdWx0aXBsZSBzdWJzeXN0ZW1zIHRvIHRyYWNrIGRpZmZlcmVudCBub3Rpb25zIG9mCiAgICAgIGNsZWFubmVzcyB3aXRob3V0IGludGVyZmVyaW5nLjwvZGQ+CiAgICAgIDxkdCBpZD0iY2hhbmdlR2VuZXJhdGlvbiI+PGNvZGU+PHN0cm9uZz5kb2MuY2hhbmdlR2VuZXJhdGlvbjwvc3Ryb25nPig/Y2xvc2VFdmVudDogYm9vbGVhbikg4oaSIGludGVnZXI8L2NvZGU+PC9kdD4KICAgICAgPGRkPlJldHVybnMgYSBudW1iZXIgdGhhdCBjYW4gbGF0ZXIgYmUgcGFzc2VkCiAgICAgIHRvIDxhIGhyZWY9IiNpc0NsZWFuIj48Y29kZT5pc0NsZWFuPC9jb2RlPjwvYT4gdG8gdGVzdCB3aGV0aGVyCiAgICAgIGFueSBlZGl0cyB3ZXJlIG1hZGUgKGFuZCBub3QgdW5kb25lKSBpbiB0aGUgbWVhbnRpbWUuCiAgICAgIElmIDxjb2RlPmNsb3NlRXZlbnQ8L2NvZGU+IGlzIHRydWUsIHRoZSBjdXJyZW50IGhpc3RvcnkgZXZlbnQKICAgICAgd2lsbCBiZSDigJhjbG9zZWTigJksIG1lYW5pbmcgaXQgY2FuJ3QgYmUgY29tYmluZWQgd2l0aCBmdXJ0aGVyCiAgICAgIGNoYW5nZXMgKHJhcGlkIHR5cGluZyBvciBkZWxldGluZyBldmVudHMgYXJlIHR5cGljYWxseQogICAgICBjb21iaW5lZCkuPC9kZD4KICAgICAgPGR0IGlkPSJpc0NsZWFuIj48Y29kZT48c3Ryb25nPmRvYy5pc0NsZWFuPC9zdHJvbmc+KD9nZW5lcmF0aW9uOiBpbnRlZ2VyKSDihpIgYm9vbGVhbjwvY29kZT48L2R0PgogICAgICA8ZGQ+UmV0dXJucyB3aGV0aGVyIHRoZSBkb2N1bWVudCBpcyBjdXJyZW50bHkgY2xlYW4g4oCUIG5vdAogICAgICBtb2RpZmllZCBzaW5jZSBpbml0aWFsaXphdGlvbiBvciB0aGUgbGFzdCBjYWxsCiAgICAgIHRvIDxhIGhyZWY9IiNtYXJrQ2xlYW4iPjxjb2RlPm1hcmtDbGVhbjwvY29kZT48L2E+IGlmIG5vCiAgICAgIGFyZ3VtZW50IGlzIHBhc3NlZCwgb3Igc2luY2UgdGhlIG1hdGNoaW5nIGNhbGwKICAgICAgdG8gPGEgaHJlZj0iI2NoYW5nZUdlbmVyYXRpb24iPjxjb2RlPmNoYW5nZUdlbmVyYXRpb248L2NvZGU+PC9hPgogICAgICBpZiBhIGdlbmVyYXRpb24gdmFsdWUgaXMgZ2l2ZW4uPC9kZD4KICAgIDwvZGw+CgogICAgPGgzIGlkPSJhcGlfc2VsZWN0aW9uIj5DdXJzb3IgYW5kIHNlbGVjdGlvbiBtZXRob2RzPC9oMz4KCiAgICA8ZGw+CiAgICAgIDxkdCBpZD0iZ2V0U2VsZWN0aW9uIj48Y29kZT48c3Ryb25nPmRvYy5nZXRTZWxlY3Rpb248L3N0cm9uZz4oP2xpbmVTZXA6IHN0cmluZykg4oaSIHN0cmluZzwvY29kZT48L2R0PgogICAgICA8ZGQ+R2V0IHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgY29kZS4gT3B0aW9uYWxseSBwYXNzIGEgbGluZQogICAgICBzZXBhcmF0b3IgdG8gcHV0IGJldHdlZW4gdGhlIGxpbmVzIGluIHRoZSBvdXRwdXQuIFdoZW4gbXVsdGlwbGUKICAgICAgc2VsZWN0aW9ucyBhcmUgcHJlc2VudCwgdGhleSBhcmUgY29uY2F0ZW5hdGVkIHdpdGggaW5zdGFuY2VzCiAgICAgIG9mIDxjb2RlPmxpbmVTZXA8L2NvZGU+IGluIGJldHdlZW4uPC9kZD4KICAgICAgPGR0IGlkPSJnZXRTZWxlY3Rpb25zIj48Y29kZT48c3Ryb25nPmRvYy5nZXRTZWxlY3Rpb25zPC9zdHJvbmc+KD9saW5lU2VwOiBzdHJpbmcpIOKGkiBhcnJheSZsdDtzdHJpbmcmZ3Q7PC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5SZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgYSBzdHJpbmcgZm9yIGVhY2ggc2VsZWN0aW9uLAogICAgICByZXByZXNlbnRpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIHNlbGVjdGlvbnMuPC9kZD4KCiAgICAgIDxkdCBpZD0icmVwbGFjZVNlbGVjdGlvbiI+PGNvZGU+PHN0cm9uZz5kb2MucmVwbGFjZVNlbGVjdGlvbjwvc3Ryb25nPihyZXBsYWNlbWVudDogc3RyaW5nLCA/c2VsZWN0OiBzdHJpbmcpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5SZXBsYWNlIHRoZSBzZWxlY3Rpb24ocykgd2l0aCB0aGUgZ2l2ZW4gc3RyaW5nLiBCeSBkZWZhdWx0LAogICAgICB0aGUgbmV3IHNlbGVjdGlvbiBlbmRzIHVwIGFmdGVyIHRoZSBpbnNlcnRlZCB0ZXh0LiBUaGUKICAgICAgb3B0aW9uYWwgPGNvZGU+c2VsZWN0PC9jb2RlPiBhcmd1bWVudCBjYW4gYmUgdXNlZCB0byBjaGFuZ2UKICAgICAgdGhpc+KAlHBhc3NpbmcgPGNvZGU+ImFyb3VuZCI8L2NvZGU+IHdpbGwgY2F1c2UgdGhlIG5ldyB0ZXh0IHRvIGJlCiAgICAgIHNlbGVjdGVkLCBwYXNzaW5nIDxjb2RlPiJzdGFydCI8L2NvZGU+IHdpbGwgY29sbGFwc2UgdGhlCiAgICAgIHNlbGVjdGlvbiB0byB0aGUgc3RhcnQgb2YgdGhlIGluc2VydGVkIHRleHQuPC9kZD4KICAgICAgPGR0IGlkPSJyZXBsYWNlU2VsZWN0aW9ucyI+PGNvZGU+PHN0cm9uZz5kb2MucmVwbGFjZVNlbGVjdGlvbnM8L3N0cm9uZz4ocmVwbGFjZW1lbnRzOiBhcnJheSZsdDtzdHJpbmcmZ3Q7LCA/c2VsZWN0OiBzdHJpbmcpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5UaGUgbGVuZ3RoIG9mIHRoZSBnaXZlbiBhcnJheSBzaG91bGQgYmUgdGhlIHNhbWUgYXMgdGhlCiAgICAgIG51bWJlciBvZiBhY3RpdmUgc2VsZWN0aW9ucy4gUmVwbGFjZXMgdGhlIGNvbnRlbnQgb2YgdGhlCiAgICAgIHNlbGVjdGlvbnMgd2l0aCB0aGUgc3RyaW5ncyBpbiB0aGUgYXJyYXkuCiAgICAgIFRoZSA8Y29kZT5zZWxlY3Q8L2NvZGU+IGFyZ3VtZW50IHdvcmtzIHRoZSBzYW1lIGFzCiAgICAgIGluIDxhIGhyZWY9IiNyZXBsYWNlU2VsZWN0aW9uIj48Y29kZT5yZXBsYWNlU2VsZWN0aW9uPC9jb2RlPjwvYT4uPC9kZD4KCiAgICAgIDxkdCBpZD0iZ2V0Q3Vyc29yIj48Y29kZT48c3Ryb25nPmRvYy5nZXRDdXJzb3I8L3N0cm9uZz4oP3N0YXJ0OiBzdHJpbmcpIOKGkiB7bGluZSwgY2h9PC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5SZXRyaWV2ZSBvbmUgZW5kIG9mIHRoZSA8ZW0+cHJpbWFyeTwvZW0+CiAgICAgIHNlbGVjdGlvbi4gPGNvZGU+c3RhcnQ8L2NvZGU+IGlzIGFuIG9wdGlvbmFsIHN0cmluZyBpbmRpY2F0aW5nCiAgICAgIHdoaWNoIGVuZCBvZiB0aGUgc2VsZWN0aW9uIHRvIHJldHVybi4gSXQgbWF5CiAgICAgIGJlIDxjb2RlPiJmcm9tIjwvY29kZT4sIDxjb2RlPiJ0byI8L2NvZGU+LCA8Y29kZT4iaGVhZCI8L2NvZGU+CiAgICAgICh0aGUgc2lkZSBvZiB0aGUgc2VsZWN0aW9uIHRoYXQgbW92ZXMgd2hlbiB5b3UgcHJlc3MKICAgICAgc2hpZnQrYXJyb3cpLCBvciA8Y29kZT4iYW5jaG9yIjwvY29kZT4gKHRoZSBmaXhlZCBzaWRlIG9mIHRoZQogICAgICBzZWxlY3Rpb24pLiBPbWl0dGluZyB0aGUgYXJndW1lbnQgaXMgdGhlIHNhbWUgYXMKICAgICAgcGFzc2luZyA8Y29kZT4iaGVhZCI8L2NvZGU+LiBBIDxjb2RlPntsaW5lLCBjaH08L2NvZGU+IG9iamVjdAogICAgICB3aWxsIGJlIHJldHVybmVkLjwvZGQ+CiAgICAgIDxkdCBpZD0ibGlzdFNlbGVjdGlvbnMiPjxjb2RlPjxzdHJvbmc+ZG9jLmxpc3RTZWxlY3Rpb25zPC9zdHJvbmc+KCkg4oaSIGFycmF5Jmx0O3thbmNob3IsIGhlYWR9Jmd0OzwvY29kZT48L2R0PgogICAgICA8ZGQ+UmV0cmlldmVzIGEgbGlzdCBvZiBhbGwgY3VycmVudCBzZWxlY3Rpb25zLiBUaGVzZSB3aWxsCiAgICAgIGFsd2F5cyBiZSBzb3J0ZWQsIGFuZCBuZXZlciBvdmVybGFwIChvdmVybGFwcGluZyBzZWxlY3Rpb25zIGFyZQogICAgICBtZXJnZWQpLiBFYWNoIG9iamVjdCBpbiB0aGUgYXJyYXkgY29udGFpbnMgPGNvZGU+YW5jaG9yPC9jb2RlPgogICAgICBhbmQgPGNvZGU+aGVhZDwvY29kZT4gcHJvcGVydGllcyByZWZlcnJpbmcgdG8gPGNvZGU+e2xpbmUsCiAgICAgIGNofTwvY29kZT4gb2JqZWN0cy48L2RkPgoKICAgICAgPGR0IGlkPSJzb21ldGhpbmdTZWxlY3RlZCI+PGNvZGU+PHN0cm9uZz5kb2Muc29tZXRoaW5nU2VsZWN0ZWQ8L3N0cm9uZz4oKSDihpIgYm9vbGVhbjwvY29kZT48L2R0PgogICAgICA8ZGQ+UmV0dXJuIHRydWUgaWYgYW55IHRleHQgaXMgc2VsZWN0ZWQuPC9kZD4KICAgICAgPGR0IGlkPSJzZXRDdXJzb3IiPjxjb2RlPjxzdHJvbmc+ZG9jLnNldEN1cnNvcjwvc3Ryb25nPihwb3M6IHtsaW5lLCBjaH18bnVtYmVyLCA/Y2g6IG51bWJlciwgP29wdGlvbnM6IG9iamVjdCk8L2NvZGU+PC9kdD4KICAgICAgPGRkPlNldCB0aGUgY3Vyc29yIHBvc2l0aW9uLiBZb3UgY2FuIGVpdGhlciBwYXNzIGEKICAgICAgc2luZ2xlIDxjb2RlPntsaW5lLCBjaH08L2NvZGU+IG9iamVjdCwgb3IgdGhlIGxpbmUgYW5kIHRoZQogICAgICBjaGFyYWN0ZXIgYXMgdHdvIHNlcGFyYXRlIHBhcmFtZXRlcnMuIFdpbGwgcmVwbGFjZSBhbGwKICAgICAgc2VsZWN0aW9ucyB3aXRoIGEgc2luZ2xlLCBlbXB0eSBzZWxlY3Rpb24gYXQgdGhlIGdpdmVuIHBvc2l0aW9uLgogICAgICBUaGUgc3VwcG9ydGVkIG9wdGlvbnMgYXJlIHRoZSBzYW1lIGFzIGZvciA8YSBocmVmPSIjc2V0U2VsZWN0aW9uIj48Y29kZT5zZXRTZWxlY3Rpb248L2NvZGU+PC9hPi48L2RkPgoKICAgICAgPGR0IGlkPSJzZXRTZWxlY3Rpb24iPjxjb2RlPjxzdHJvbmc+ZG9jLnNldFNlbGVjdGlvbjwvc3Ryb25nPihhbmNob3I6IHtsaW5lLCBjaH0sID9oZWFkOiB7bGluZSwgY2h9LCA/b3B0aW9uczogb2JqZWN0KTwvY29kZT48L2R0PgogICAgICA8ZGQ+U2V0IGEgc2luZ2xlIHNlbGVjdGlvbiByYW5nZS4gPGNvZGU+YW5jaG9yPC9jb2RlPgogICAgICBhbmQgPGNvZGU+aGVhZDwvY29kZT4gc2hvdWxkIGJlIDxjb2RlPntsaW5lLCBjaH08L2NvZGU+CiAgICAgIG9iamVjdHMuIDxjb2RlPmhlYWQ8L2NvZGU+IGRlZmF1bHRzIHRvIDxjb2RlPmFuY2hvcjwvY29kZT4gd2hlbgogICAgICBub3QgZ2l2ZW4uIFRoZXNlIG9wdGlvbnMgYXJlIHN1cHBvcnRlZDoKICAgICAgPGRsPgogICAgICAgIDxkdCBpZD0ic2VsZWN0aW9uX3Njcm9sbCI+PGNvZGU+PHN0cm9uZz5zY3JvbGw8L3N0cm9uZz46IGJvb2xlYW48L2NvZGU+PC9kdD4KICAgICAgICA8ZGQ+RGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBzZWxlY3Rpb24gaGVhZCBzaG91bGQgYmUgc2Nyb2xsZWQKICAgICAgICBpbnRvIHZpZXcuIERlZmF1bHRzIHRvIHRydWUuPC9kZD4KICAgICAgICA8ZHQgaWQ9InNlbGVjdGlvbl9vcmlnaW4iPjxjb2RlPjxzdHJvbmc+b3JpZ2luPC9zdHJvbmc+OiBzdHJpbmc8L2NvZGU+PC9kdD4KICAgICAgICA8ZGQ+RGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBzZWxlY3Rpb24gaGlzdG9yeSBldmVudCBtYXkgYmUKICAgICAgICBtZXJnZWQgd2l0aCB0aGUgcHJldmlvdXMgb25lLiBXaGVuIGFuIG9yaWdpbiBzdGFydHMgd2l0aCB0aGUKICAgICAgICBjaGFyYWN0ZXIgPGNvZGU+KzwvY29kZT4sIGFuZCB0aGUgbGFzdCByZWNvcmRlZCBzZWxlY3Rpb24gaGFkCiAgICAgICAgdGhlIHNhbWUgb3JpZ2luIGFuZCB3YXMgc2ltaWxhciAoY2xvc2UKICAgICAgICBpbiA8YSBocmVmPSIjb3B0aW9uX2hpc3RvcnlFdmVudERlbGF5Ij50aW1lPC9hPiwgYm90aAogICAgICAgIGNvbGxhcHNlZCBvciBib3RoIG5vbi1jb2xsYXBzZWQpLCB0aGUgbmV3IG9uZSB3aWxsIHJlcGxhY2UgdGhlCiAgICAgICAgb2xkIG9uZS4gV2hlbiBpdCBzdGFydHMgd2l0aCA8Y29kZT4qPC9jb2RlPiwgaXQgd2lsbCBhbHdheXMKICAgICAgICByZXBsYWNlIHRoZSBwcmV2aW91cyBldmVudCAoaWYgdGhhdCBoYWQgdGhlIHNhbWUgb3JpZ2luKS4KICAgICAgICBCdWlsdC1pbiBtb3Rpb24gdXNlcyB0aGUgPGNvZGU+Iittb3ZlIjwvY29kZT4gb3JpZ2luLiBVc2VyIGlucHV0IHVzZXMgdGhlIDxjb2RlPiIraW5wdXQiPC9jb2RlPiBvcmlnaW4uPC9kZD4KICAgICAgICA8ZHQgaWQ9InNlbGVjdGlvbl9iaWFzIj48Y29kZT48c3Ryb25nPmJpYXM8L3N0cm9uZz46IG51bWJlcjwvY29kZT48L2R0PgogICAgICAgIDxkZD5EZXRlcm1pbmUgdGhlIGRpcmVjdGlvbiBpbnRvIHdoaWNoIHRoZSBzZWxlY3Rpb24gZW5kcG9pbnRzCiAgICAgICAgc2hvdWxkIGJlIGFkanVzdGVkIHdoZW4gdGhleSBmYWxsIGluc2lkZQogICAgICAgIGFuIDxhIGhyZWY9IiNtYXJrX2F0b21pYyI+YXRvbWljPC9hPiByYW5nZS4gQ2FuIGJlIGVpdGhlciAtMQogICAgICAgIChiYWNrd2FyZCkgb3IgMSAoZm9yd2FyZCkuIFdoZW4gbm90IGdpdmVuLCB0aGUgYmlhcyB3aWxsIGJlCiAgICAgICAgYmFzZWQgb24gdGhlIHJlbGF0aXZlIHBvc2l0aW9uIG9mIHRoZSBvbGQgc2VsZWN0aW9u4oCUdGhlIGVkaXRvcgogICAgICAgIHdpbGwgdHJ5IHRvIG1vdmUgZnVydGhlciBhd2F5IGZyb20gdGhhdCwgdG8gcHJldmVudCBnZXR0aW5nCiAgICAgICAgc3R1Y2suPC9kZD4KICAgICAgPC9kbD48L2RkPgoKICAgICAgPGR0IGlkPSJzZXRTZWxlY3Rpb25zIj48Y29kZT48c3Ryb25nPmRvYy5zZXRTZWxlY3Rpb25zPC9zdHJvbmc+KHJhbmdlczogYXJyYXkmbHQ7e2FuY2hvciwgaGVhZH0mZ3Q7LCA/cHJpbWFyeTogaW50ZWdlciwgP29wdGlvbnM6IG9iamVjdCk8L2NvZGU+PC9kdD4KICAgICAgPGRkPlNldHMgYSBuZXcgc2V0IG9mIHNlbGVjdGlvbnMuIFRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lCiAgICAgIHNlbGVjdGlvbiBpbiB0aGUgZ2l2ZW4gYXJyYXkuIFdoZW4gPGNvZGU+cHJpbWFyeTwvY29kZT4gaXMgYQogICAgICBudW1iZXIsIGl0IGRldGVybWluZXMgd2hpY2ggc2VsZWN0aW9uIGlzIHRoZSBwcmltYXJ5IG9uZS4gV2hlbgogICAgICBpdCBpcyBub3QgZ2l2ZW4sIHRoZSBwcmltYXJ5IGluZGV4IGlzIHRha2VuIGZyb20gdGhlIHByZXZpb3VzCiAgICAgIHNlbGVjdGlvbiwgb3Igc2V0IHRvIHRoZSBsYXN0IHJhbmdlIGlmIHRoZSBwcmV2aW91cyBzZWxlY3Rpb24KICAgICAgaGFkIGxlc3MgcmFuZ2VzIHRoYW4gdGhlIG5ldyBvbmUuIFN1cHBvcnRzIHRoZSBzYW1lIG9wdGlvbnMKICAgICAgYXMgPGEgaHJlZj0iI3NldFNlbGVjdGlvbiI+PGNvZGU+c2V0U2VsZWN0aW9uPC9jb2RlPjwvYT4uPC9kZD4KICAgICAgPGR0IGlkPSJhZGRTZWxlY3Rpb24iPjxjb2RlPjxzdHJvbmc+ZG9jLmFkZFNlbGVjdGlvbjwvc3Ryb25nPihhbmNob3I6IHtsaW5lLCBjaH0sID9oZWFkOiB7bGluZSwgY2h9KTwvY29kZT48L2R0PgogICAgICA8ZGQ+QWRkcyBhIG5ldyBzZWxlY3Rpb24gdG8gdGhlIGV4aXN0aW5nIHNldCBvZiBzZWxlY3Rpb25zLCBhbmQKICAgICAgbWFrZXMgaXQgdGhlIHByaW1hcnkgc2VsZWN0aW9uLjwvZGQ+CgogICAgICA8ZHQgaWQ9ImV4dGVuZFNlbGVjdGlvbiI+PGNvZGU+PHN0cm9uZz5kb2MuZXh0ZW5kU2VsZWN0aW9uPC9zdHJvbmc+KGZyb206IHtsaW5lLCBjaH0sID90bzoge2xpbmUsIGNofSwgP29wdGlvbnM6IG9iamVjdCk8L2NvZGU+PC9kdD4KICAgICAgPGRkPlNpbWlsYXIKICAgICAgdG8gPGEgaHJlZj0iI3NldFNlbGVjdGlvbiI+PGNvZGU+c2V0U2VsZWN0aW9uPC9jb2RlPjwvYT4sIGJ1dAogICAgICB3aWxsLCBpZiBzaGlmdCBpcyBoZWxkIG9yCiAgICAgIHRoZSA8YSBocmVmPSIjc2V0RXh0ZW5kaW5nIj5leHRlbmRpbmc8L2E+IGZsYWcgaXMgc2V0LCBtb3ZlIHRoZQogICAgICBoZWFkIG9mIHRoZSBzZWxlY3Rpb24gd2hpbGUgbGVhdmluZyB0aGUgYW5jaG9yIGF0IGl0cyBjdXJyZW50CiAgICAgIHBsYWNlLiA8Y29kZT50bzwvY29kZT4gaXMgb3B0aW9uYWwsIGFuZCBjYW4gYmUgcGFzc2VkIHRvIGVuc3VyZQogICAgICBhIHJlZ2lvbiAoZm9yIGV4YW1wbGUgYSB3b3JkIG9yIHBhcmFncmFwaCkgd2lsbCBlbmQgdXAgc2VsZWN0ZWQKICAgICAgKGluIGFkZGl0aW9uIHRvIHdoYXRldmVyIGxpZXMgYmV0d2VlbiB0aGF0IHJlZ2lvbiBhbmQgdGhlCiAgICAgIGN1cnJlbnQgYW5jaG9yKS4gV2hlbiBtdWx0aXBsZSBzZWxlY3Rpb25zIGFyZSBwcmVzZW50LCBhbGwgYnV0CiAgICAgIHRoZSBwcmltYXJ5IHNlbGVjdGlvbiB3aWxsIGJlIGRyb3BwZWQgYnkgdGhpcyBtZXRob2QuCiAgICAgIFN1cHBvcnRzIHRoZSBzYW1lIG9wdGlvbnMgYXMgPGEgaHJlZj0iI3NldFNlbGVjdGlvbiI+PGNvZGU+c2V0U2VsZWN0aW9uPC9jb2RlPjwvYT4uPC9kZD4KICAgICAgPGR0IGlkPSJleHRlbmRTZWxlY3Rpb25zIj48Y29kZT48c3Ryb25nPmRvYy5leHRlbmRTZWxlY3Rpb25zPC9zdHJvbmc+KGhlYWRzOiBhcnJheSZsdDt7bGluZSwgY2h9Jmd0OywgP29wdGlvbnM6IG9iamVjdCk8L2NvZGU+PC9kdD4KICAgICAgPGRkPkFuIGVxdWl2YWxlbnQKICAgICAgb2YgPGEgaHJlZj0iI2V4dGVuZFNlbGVjdGlvbiI+PGNvZGU+ZXh0ZW5kU2VsZWN0aW9uPC9jb2RlPjwvYT4KICAgICAgdGhhdCBhY3RzIG9uIGFsbCBzZWxlY3Rpb25zIGF0IG9uY2UuPC9kZD4KICAgICAgPGR0IGlkPSJleHRlbmRTZWxlY3Rpb25zQnkiPjxjb2RlPjxzdHJvbmc+ZG9jLmV4dGVuZFNlbGVjdGlvbnNCeTwvc3Ryb25nPihmOiBmdW5jdGlvbihyYW5nZToge2FuY2hvciwgaGVhZH0pIOKGksKge2xpbmUsIGNofSksID9vcHRpb25zOiBvYmplY3QpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5BcHBsaWVzIHRoZSBnaXZlbiBmdW5jdGlvbiB0byBhbGwgZXhpc3Rpbmcgc2VsZWN0aW9ucywgYW5kCiAgICAgIGNhbGxzIDxhIGhyZWY9IiNleHRlbmRTZWxlY3Rpb25zIj48Y29kZT5leHRlbmRTZWxlY3Rpb25zPC9jb2RlPjwvYT4KICAgICAgb24gdGhlIHJlc3VsdC48L2RkPgogICAgICA8ZHQgaWQ9InNldEV4dGVuZGluZyI+PGNvZGU+PHN0cm9uZz5kb2Muc2V0RXh0ZW5kaW5nPC9zdHJvbmc+KHZhbHVlOiBib29sZWFuKTwvY29kZT48L2R0PgogICAgICA8ZGQ+U2V0cyBvciBjbGVhcnMgdGhlICdleHRlbmRpbmcnIGZsYWcsIHdoaWNoIGFjdHMgc2ltaWxhciB0bwogICAgICB0aGUgc2hpZnQga2V5LCBpbiB0aGF0IGl0IHdpbGwgY2F1c2UgY3Vyc29yIG1vdmVtZW50IGFuZCBjYWxscwogICAgICB0byA8YSBocmVmPSIjZXh0ZW5kU2VsZWN0aW9uIj48Y29kZT5leHRlbmRTZWxlY3Rpb248L2NvZGU+PC9hPgogICAgICB0byBsZWF2ZSB0aGUgc2VsZWN0aW9uIGFuY2hvciBpbiBwbGFjZS48L2RkPgogICAgICA8ZHQgaWQ9ImdldEV4dGVuZGluZyI+PGNvZGU+PHN0cm9uZz5kb2MuZ2V0RXh0ZW5kaW5nPC9zdHJvbmc+KCkg4oaSIGJvb2xlYW48L2NvZGU+PC9kdD4KICAgICAgPGRkPkdldCB0aGUgdmFsdWUgb2YgdGhlICdleHRlbmRpbmcnIGZsYWcuPC9kZD4KCiAgICAgIDxkdCBpZD0iaGFzRm9jdXMiPjxjb2RlPjxzdHJvbmc+Y20uaGFzRm9jdXM8L3N0cm9uZz4oKSDihpIgYm9vbGVhbjwvY29kZT48L2R0PgogICAgICA8ZGQ+VGVsbHMgeW91IHdoZXRoZXIgdGhlIGVkaXRvciBjdXJyZW50bHkgaGFzIGZvY3VzLjwvZGQ+CgogICAgICA8ZHQgaWQ9ImZpbmRQb3NIIj48Y29kZT48c3Ryb25nPmNtLmZpbmRQb3NIPC9zdHJvbmc+KHN0YXJ0OiB7bGluZSwgY2h9LCBhbW91bnQ6IGludGVnZXIsIHVuaXQ6IHN0cmluZywgdmlzdWFsbHk6wqBib29sZWFuKSDihpLCoHtsaW5lLCBjaCwgP2hpdFNpZGU6IGJvb2xlYW59PC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5Vc2VkIHRvIGZpbmQgdGhlIHRhcmdldCBwb3NpdGlvbiBmb3IgaG9yaXpvbnRhbCBjdXJzb3IKICAgICAgbW90aW9uLiA8Y29kZT5zdGFydDwvY29kZT4gaXMgYSA8Y29kZT57bGluZSwgY2h9PC9jb2RlPgogICAgICBvYmplY3QsIDxjb2RlPmFtb3VudDwvY29kZT4gYW4gaW50ZWdlciAobWF5IGJlIG5lZ2F0aXZlKSwKICAgICAgYW5kIDxjb2RlPnVuaXQ8L2NvZGU+IG9uZSBvZiB0aGUKICAgICAgc3RyaW5nIDxjb2RlPiJjaGFyIjwvY29kZT4sIDxjb2RlPiJjb2x1bW4iPC9jb2RlPiwKICAgICAgb3IgPGNvZGU+IndvcmQiPC9jb2RlPi4gV2lsbCByZXR1cm4gYSBwb3NpdGlvbiB0aGF0IGlzIHByb2R1Y2VkCiAgICAgIGJ5IG1vdmluZyA8Y29kZT5hbW91bnQ8L2NvZGU+IHRpbWVzIHRoZSBkaXN0YW5jZSBzcGVjaWZpZWQKICAgICAgYnkgPGNvZGU+dW5pdDwvY29kZT4uIFdoZW4gPGNvZGU+dmlzdWFsbHk8L2NvZGU+IGlzIHRydWUsIG1vdGlvbgogICAgICBpbiByaWdodC10by1sZWZ0IHRleHQgd2lsbCBiZSB2aXN1YWwgcmF0aGVyIHRoYW4gbG9naWNhbC4gV2hlbgogICAgICB0aGUgbW90aW9uIHdhcyBjbGlwcGVkIGJ5IGhpdHRpbmcgdGhlIGVuZCBvciBzdGFydCBvZiB0aGUKICAgICAgZG9jdW1lbnQsIHRoZSByZXR1cm5lZCB2YWx1ZSB3aWxsIGhhdmUgYSA8Y29kZT5oaXRTaWRlPC9jb2RlPgogICAgICBwcm9wZXJ0eSBzZXQgdG8gdHJ1ZS48L2RkPgogICAgICA8ZHQgaWQ9ImZpbmRQb3NWIj48Y29kZT48c3Ryb25nPmNtLmZpbmRQb3NWPC9zdHJvbmc+KHN0YXJ0OiB7bGluZSwgY2h9LCBhbW91bnQ6IGludGVnZXIsIHVuaXQ6IHN0cmluZykg4oaSIHtsaW5lLCBjaCwgP2hpdFNpZGU6IGJvb2xlYW59PC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5TaW1pbGFyIHRvIDxhIGhyZWY9IiNmaW5kUG9zSCI+PGNvZGU+ZmluZFBvc0g8L2NvZGU+PC9hPiwKICAgICAgYnV0IHVzZWQgZm9yIHZlcnRpY2FsIG1vdGlvbi4gPGNvZGU+dW5pdDwvY29kZT4gbWF5CiAgICAgIGJlIDxjb2RlPiJsaW5lIjwvY29kZT4gb3IgPGNvZGU+InBhZ2UiPC9jb2RlPi4gVGhlIG90aGVyCiAgICAgIGFyZ3VtZW50cyBhbmQgdGhlIHJldHVybmVkIHZhbHVlIGhhdmUgdGhlIHNhbWUgaW50ZXJwcmV0YXRpb24gYXMKICAgICAgdGhleSBoYXZlIGluIDxjb2RlPmZpbmRQb3NIPC9jb2RlPi48L2RkPgoKICAgICAgPGR0IGlkPSJmaW5kV29yZEF0Ij48Y29kZT48c3Ryb25nPmNtLmZpbmRXb3JkQXQ8L3N0cm9uZz4ocG9zOiB7bGluZSwgY2h9KSDihpIge2FuY2hvcjoge2xpbmUsIGNofSwgaGVhZDoge2xpbmUsIGNofX08L2NvZGU+PC9kdD4KICAgICAgPGRkPlJldHVybnMgdGhlIHN0YXJ0IGFuZCBlbmQgb2YgdGhlICd3b3JkJyAodGhlIHN0cmV0Y2ggb2YKICAgICAgbGV0dGVycywgd2hpdGVzcGFjZSwgb3IgcHVuY3R1YXRpb24pIGF0IHRoZSBnaXZlbiBwb3NpdGlvbi48L2RkPgogICAgPC9kbD4KCiAgICA8aDMgaWQ9ImFwaV9jb25maWd1cmF0aW9uIj5Db25maWd1cmF0aW9uIG1ldGhvZHM8L2gzPgoKICAgIDxkbD4KICAgICAgPGR0IGlkPSJzZXRPcHRpb24iPjxjb2RlPjxzdHJvbmc+Y20uc2V0T3B0aW9uPC9zdHJvbmc+KG9wdGlvbjogc3RyaW5nLCB2YWx1ZTogYW55KTwvY29kZT48L2R0PgogICAgICA8ZGQ+Q2hhbmdlIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBlZGl0b3IuIDxjb2RlPm9wdGlvbjwvY29kZT4KICAgICAgc2hvdWxkIHRoZSBuYW1lIG9mIGFuIDxhIGhyZWY9IiNjb25maWciPm9wdGlvbjwvYT4sCiAgICAgIGFuZCA8Y29kZT52YWx1ZTwvY29kZT4gc2hvdWxkIGJlIGEgdmFsaWQgdmFsdWUgZm9yIHRoYXQKICAgICAgb3B0aW9uLjwvZGQ+CiAgICAgIDxkdCBpZD0iZ2V0T3B0aW9uIj48Y29kZT48c3Ryb25nPmNtLmdldE9wdGlvbjwvc3Ryb25nPihvcHRpb246IHN0cmluZykg4oaSIGFueTwvY29kZT48L2R0PgogICAgICA8ZGQ+UmV0cmlldmVzIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBnaXZlbiBvcHRpb24gZm9yIHRoaXMKICAgICAgZWRpdG9yIGluc3RhbmNlLjwvZGQ+CgogICAgICA8ZHQgaWQ9ImFkZEtleU1hcCI+PGNvZGU+PHN0cm9uZz5jbS5hZGRLZXlNYXA8L3N0cm9uZz4obWFwOiBvYmplY3QsIGJvdHRvbTogYm9vbGVhbik8L2NvZGU+PC9kdD4KICAgICAgPGRkPkF0dGFjaCBhbiBhZGRpdGlvbmFsIDxhIGhyZWY9IiNrZXltYXBzIj5rZXkgbWFwPC9hPiB0byB0aGUKICAgICAgZWRpdG9yLiBUaGlzIGlzIG1vc3RseSB1c2VmdWwgZm9yIGFkZG9ucyB0aGF0IG5lZWQgdG8gcmVnaXN0ZXIKICAgICAgc29tZSBrZXkgaGFuZGxlcnMgd2l0aG91dCB0cmFtcGxpbmcgb24KICAgICAgdGhlIDxhIGhyZWY9IiNvcHRpb25fZXh0cmFLZXlzIj48Y29kZT5leHRyYUtleXM8L2NvZGU+PC9hPgogICAgICBvcHRpb24uIE1hcHMgYWRkZWQgaW4gdGhpcyB3YXkgaGF2ZSBhIGhpZ2hlciBwcmVjZWRlbmNlIHRoYW4KICAgICAgdGhlIDxjb2RlPmV4dHJhS2V5czwvY29kZT4KICAgICAgYW5kIDxhIGhyZWY9IiNvcHRpb25fa2V5TWFwIj48Y29kZT5rZXlNYXA8L2NvZGU+PC9hPiBvcHRpb25zLAogICAgICBhbmQgYmV0d2VlbiB0aGVtLCB0aGUgbWFwcyBhZGRlZCBlYXJsaWVyIGhhdmUgYSBsb3dlciBwcmVjZWRlbmNlCiAgICAgIHRoYW4gdGhvc2UgYWRkZWQgbGF0ZXIsIHVubGVzcyB0aGUgPGNvZGU+Ym90dG9tPC9jb2RlPiBhcmd1bWVudAogICAgICB3YXMgcGFzc2VkLCBpbiB3aGljaCBjYXNlIHRoZXkgZW5kIHVwIGJlbG93IG90aGVyIGtleSBtYXBzIGFkZGVkCiAgICAgIHdpdGggdGhpcyBtZXRob2QuPC9kZD4KICAgICAgPGR0IGlkPSJyZW1vdmVLZXlNYXAiPjxjb2RlPjxzdHJvbmc+Y20ucmVtb3ZlS2V5TWFwPC9zdHJvbmc+KG1hcDogb2JqZWN0KTwvY29kZT48L2R0PgogICAgICA8ZGQ+RGlzYWJsZSBhIGtleW1hcCBhZGRlZAogICAgICB3aXRoIDxhIGhyZWY9IiNhZGRLZXlNYXAiPjxjb2RlPmFkZEtleU1hcDwvY29kZT48L2E+LiBFaXRoZXIKICAgICAgcGFzcyBpbiB0aGUga2V5IG1hcCBvYmplY3QgaXRzZWxmLCBvciBhIHN0cmluZywgd2hpY2ggd2lsbCBiZQogICAgICBjb21wYXJlZCBhZ2FpbnN0IHRoZSA8Y29kZT5uYW1lPC9jb2RlPiBwcm9wZXJ0eSBvZiB0aGUgYWN0aXZlCiAgICAgIGtleSBtYXBzLjwvZGQ+CgogICAgICA8ZHQgaWQ9ImFkZE92ZXJsYXkiPjxjb2RlPjxzdHJvbmc+Y20uYWRkT3ZlcmxheTwvc3Ryb25nPihtb2RlOiBzdHJpbmd8b2JqZWN0LCA/b3B0aW9uczogb2JqZWN0KTwvY29kZT48L2R0PgogICAgICA8ZGQ+RW5hYmxlIGEgaGlnaGxpZ2h0aW5nIG92ZXJsYXkuIFRoaXMgaXMgYSBzdGF0ZWxlc3MgbWluaS1tb2RlCiAgICAgIHRoYXQgY2FuIGJlIHVzZWQgdG8gYWRkIGV4dHJhIGhpZ2hsaWdodGluZy4gRm9yIGV4YW1wbGUsCiAgICAgIHRoZSA8YSBocmVmPSIuLi9kZW1vL3NlYXJjaC5odG1sIj5zZWFyY2ggYWRkb248L2E+IHVzZXMgaXQgdG8KICAgICAgaGlnaGxpZ2h0IHRoZSB0ZXJtIHRoYXQncyBjdXJyZW50bHkgYmVpbmcKICAgICAgc2VhcmNoZWQuIDxjb2RlPm1vZGU8L2NvZGU+IGNhbiBiZSBhIDxhIGhyZWY9IiNvcHRpb25fbW9kZSI+bW9kZQogICAgICBzcGVjPC9hPiBvciBhIG1vZGUgb2JqZWN0IChhbiBvYmplY3Qgd2l0aAogICAgICBhIDxhIGhyZWY9IiN0b2tlbiI+PGNvZGU+dG9rZW48L2NvZGU+PC9hPiBtZXRob2QpLgogICAgICBUaGUgPGNvZGU+b3B0aW9uczwvY29kZT4gcGFyYW1ldGVyIGlzIG9wdGlvbmFsLiBJZiBnaXZlbiwgaXQKICAgICAgc2hvdWxkIGJlIGFuIG9iamVjdCwgb3B0aW9uYWxseSBjb250YWluaW5nIHRoZSBmb2xsb3dpbmcgb3B0aW9uczoKICAgICAgICA8ZGw+CiAgICAgICAgICA8ZHQ+PGNvZGU+PHN0cm9uZz5vcGFxdWU8L3N0cm9uZz46IGJvb2w8L2NvZGU+PC9kdD4KICAgICAgICAgIDxkZD5EZWZhdWx0cyB0byBvZmYsIGJ1dCBjYW4gYmUgZ2l2ZW4gdG8gYWxsb3cgdGhlIG92ZXJsYXkKICAgICAgICAgIHN0eWxpbmcsIHdoZW4gbm90IDxjb2RlPm51bGw8L2NvZGU+LCB0byBvdmVycmlkZSB0aGUgc3R5bGluZyBvZgogICAgICAgICAgdGhlIGJhc2UgbW9kZSBlbnRpcmVseSwgaW5zdGVhZCBvZiB0aGUgdHdvIGJlaW5nIGFwcGxpZWQKICAgICAgICAgIHRvZ2V0aGVyLjwvZGQ+CiAgICAgICAgICA8ZHQ+PGNvZGU+PHN0cm9uZz5wcmlvcml0eTwvc3Ryb25nPjogbnVtYmVyPC9jb2RlPjwvZHQ+CiAgICAgICAgICA8ZGQ+RGV0ZXJtaW5lcyB0aGUgb3JkZXJpbmcgaW4gd2hpY2ggdGhlIG92ZXJsYXlzIGFyZQogICAgICAgICAgYXBwbGllZC4gVGhvc2Ugd2l0aCBoaWdoIHByaW9yaXR5IGFyZSBhcHBsaWVkIGFmdGVyIHRob3NlCiAgICAgICAgICB3aXRoIGxvd2VyIHByaW9yaXR5LCBhbmQgYWJsZSB0byBvdmVycmlkZSB0aGUgb3BhcXVlbmVzcyBvZgogICAgICAgICAgdGhlIG9uZXMgdGhhdCBjb21lIGJlZm9yZS4gRGVmYXVsdHMgdG8gMC48L2RkPgogICAgICAgIDwvZGw+CiAgICAgIDwvZGQ+CgogICAgICA8ZHQgaWQ9InJlbW92ZU92ZXJsYXkiPjxjb2RlPjxzdHJvbmc+Y20ucmVtb3ZlT3ZlcmxheTwvc3Ryb25nPihtb2RlOiBzdHJpbmd8b2JqZWN0KTwvY29kZT48L2R0PgogICAgICA8ZGQ+UGFzcyB0aGlzIHRoZSBleGFjdCB2YWx1ZSBwYXNzZWQgZm9yIHRoZSA8Y29kZT5tb2RlPC9jb2RlPgogICAgICBwYXJhbWV0ZXIgdG8gPGEgaHJlZj0iI2FkZE92ZXJsYXkiPjxjb2RlPmFkZE92ZXJsYXk8L2NvZGU+PC9hPiwKICAgICAgb3IgYSBzdHJpbmcgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgPGNvZGU+bmFtZTwvY29kZT4gcHJvcGVydHkgb2YKICAgICAgdGhhdCB2YWx1ZSwgdG8gcmVtb3ZlIGFuIG92ZXJsYXkgYWdhaW4uPC9kZD4KCiAgICAgIDxkdCBpZD0ib24iPjxjb2RlPjxzdHJvbmc+Y20ub248L3N0cm9uZz4odHlwZTogc3RyaW5nLCBmdW5jOiAoLi4uYXJncykpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5SZWdpc3RlciBhbiBldmVudCBoYW5kbGVyIGZvciB0aGUgZ2l2ZW4gZXZlbnQgdHlwZSAoYQogICAgICBzdHJpbmcpIG9uIHRoZSBlZGl0b3IgaW5zdGFuY2UuIFRoZXJlIGlzIGFsc28KICAgICAgYSA8Y29kZT5Db2RlTWlycm9yLm9uKG9iamVjdCwgdHlwZSwgZnVuYyk8L2NvZGU+IHZlcnNpb24KICAgICAgdGhhdCBhbGxvd3MgcmVnaXN0ZXJpbmcgb2YgZXZlbnRzIG9uIGFueSBvYmplY3QuPC9kZD4KICAgICAgPGR0IGlkPSJvZmYiPjxjb2RlPjxzdHJvbmc+Y20ub2ZmPC9zdHJvbmc+KHR5cGU6IHN0cmluZywgZnVuYzogKC4uLmFyZ3MpKTwvY29kZT48L2R0PgogICAgICA8ZGQ+UmVtb3ZlIGFuIGV2ZW50IGhhbmRsZXIgb24gdGhlIGVkaXRvciBpbnN0YW5jZS4gQW4KICAgICAgZXF1aXZhbGVudCA8Y29kZT5Db2RlTWlycm9yLm9mZihvYmplY3QsIHR5cGUsCiAgICAgIGZ1bmMpPC9jb2RlPiBhbHNvIGV4aXN0cy48L2RkPgogICAgPC9kbD4KCiAgICA8aDMgaWQ9ImFwaV9kb2MiPkRvY3VtZW50IG1hbmFnZW1lbnQgbWV0aG9kczwvaDM+CgogICAgPHAgaWQ9IkRvYyI+RWFjaCBlZGl0b3IgaXMgYXNzb2NpYXRlZCB3aXRoIGFuIGluc3RhbmNlCiAgICBvZiA8Y29kZT5Db2RlTWlycm9yLkRvYzwvY29kZT4sIGl0cyBkb2N1bWVudC4gQSBkb2N1bWVudAogICAgcmVwcmVzZW50cyB0aGUgZWRpdG9yIGNvbnRlbnQsIHBsdXMgYSBzZWxlY3Rpb24sIGFuIHVuZG8gaGlzdG9yeSwKICAgIGFuZCBhIDxhIGhyZWY9IiNvcHRpb25fbW9kZSI+bW9kZTwvYT4uIEEgZG9jdW1lbnQgY2FuIG9ubHkgYmUKICAgIGFzc29jaWF0ZWQgd2l0aCBhIHNpbmdsZSBlZGl0b3IgYXQgYSB0aW1lLiBZb3UgY2FuIGNyZWF0ZSBuZXcKICAgIGRvY3VtZW50cyBieSBjYWxsaW5nIHRoZSA8Y29kZT5Db2RlTWlycm9yLkRvYyh0ZXh0LCBtb2RlLAogICAgZmlyc3RMaW5lTnVtYmVyKTwvY29kZT4gY29uc3RydWN0b3IuIFRoZSBsYXN0IHR3byBhcmd1bWVudHMgYXJlCiAgICBvcHRpb25hbCBhbmQgY2FuIGJlIHVzZWQgdG8gc2V0IGEgbW9kZSBmb3IgdGhlIGRvY3VtZW50IGFuZCBtYWtlCiAgICBpdCBzdGFydCBhdCBhIGxpbmUgbnVtYmVyIG90aGVyIHRoYW4gMCwgcmVzcGVjdGl2ZWx5LjwvcD4KCiAgICA8ZGw+CiAgICAgIDxkdCBpZD0iZ2V0RG9jIj48Y29kZT48c3Ryb25nPmNtLmdldERvYzwvc3Ryb25nPigpIOKGkiBEb2M8L2NvZGU+PC9kdD4KICAgICAgPGRkPlJldHJpZXZlIHRoZSBjdXJyZW50bHkgYWN0aXZlIGRvY3VtZW50IGZyb20gYW4gZWRpdG9yLjwvZGQ+CiAgICAgIDxkdCBpZD0iZ2V0RWRpdG9yIj48Y29kZT48c3Ryb25nPmRvYy5nZXRFZGl0b3I8L3N0cm9uZz4oKSDihpIgQ29kZU1pcnJvcjwvY29kZT48L2R0PgogICAgICA8ZGQ+UmV0cmlldmUgdGhlIGVkaXRvciBhc3NvY2lhdGVkIHdpdGggYSBkb2N1bWVudC4gTWF5CiAgICAgIHJldHVybiA8Y29kZT5udWxsPC9jb2RlPi48L2RkPgoKICAgICAgPGR0IGlkPSJzd2FwRG9jIj48Y29kZT48c3Ryb25nPmNtLnN3YXBEb2M8L3N0cm9uZz4oZG9jOiBDb2RlTWlycm9yLkRvYykg4oaSIERvYzwvY29kZT48L2R0PgogICAgICA8ZGQ+QXR0YWNoIGEgbmV3IGRvY3VtZW50IHRvIHRoZSBlZGl0b3IuIFJldHVybnMgdGhlIG9sZAogICAgICBkb2N1bWVudCwgd2hpY2ggaXMgbm93IG5vIGxvbmdlciBhc3NvY2lhdGVkIHdpdGggYW4gZWRpdG9yLjwvZGQ+CgogICAgICA8ZHQgaWQ9ImNvcHkiPjxjb2RlPjxzdHJvbmc+ZG9jLmNvcHk8L3N0cm9uZz4oY29weUhpc3Rvcnk6IGJvb2xlYW4pIOKGkiBEb2M8L2NvZGU+PC9kdD4KICAgICAgPGRkPkNyZWF0ZSBhbiBpZGVudGljYWwgY29weSBvZiB0aGUgZ2l2ZW4gZG9jLgogICAgICBXaGVuIDxjb2RlPmNvcHlIaXN0b3J5PC9jb2RlPiBpcyB0cnVlLCB0aGUgaGlzdG9yeSB3aWxsIGFsc28gYmUKICAgICAgY29waWVkLiBDYW4gbm90IGJlIGNhbGxlZCBkaXJlY3RseSBvbiBhbiBlZGl0b3IuPC9kZD4KCiAgICAgIDxkdCBpZD0ibGlua2VkRG9jIj48Y29kZT48c3Ryb25nPmRvYy5saW5rZWREb2M8L3N0cm9uZz4ob3B0aW9uczogb2JqZWN0KSDihpIgRG9jPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5DcmVhdGUgYSBuZXcgZG9jdW1lbnQgdGhhdCdzIGxpbmtlZCB0byB0aGUgdGFyZ2V0IGRvY3VtZW50LgogICAgICBMaW5rZWQgZG9jdW1lbnRzIHdpbGwgc3RheSBpbiBzeW5jIChjaGFuZ2VzIHRvIG9uZSBhcmUgYWxzbwogICAgICBhcHBsaWVkIHRvIHRoZSBvdGhlcikgdW50aWwgPGEgaHJlZj0iI3VubGlua0RvYyI+dW5saW5rZWQ8L2E+LgogICAgICBUaGVzZSBhcmUgdGhlIG9wdGlvbnMgdGhhdCBhcmUgc3VwcG9ydGVkOgogICAgICAgIDxkbD4KICAgICAgICAgIDxkdCBpZD0ibGlua2VkRG9jX3NoYXJlZEhpc3QiPjxjb2RlPjxzdHJvbmc+c2hhcmVkSGlzdDwvc3Ryb25nPjogYm9vbGVhbjwvY29kZT48L2R0PgogICAgICAgICAgPGRkPldoZW4gdHVybmVkIG9uLCB0aGUgbGlua2VkIGNvcHkgd2lsbCBzaGFyZSBhbiB1bmRvCiAgICAgICAgICBoaXN0b3J5IHdpdGggdGhlIG9yaWdpbmFsLiBUaHVzLCBzb21ldGhpbmcgZG9uZSBpbiBvbmUgb2YKICAgICAgICAgIHRoZSB0d28gY2FuIGJlIHVuZG9uZSBpbiB0aGUgb3RoZXIsIGFuZCB2aWNlIHZlcnNhLjwvZGQ+CiAgICAgICAgICA8ZHQgaWQ9ImxpbmtlZERvY19mcm9tIj48Y29kZT48c3Ryb25nPmZyb208L3N0cm9uZz46IGludGVnZXI8L2NvZGU+PC9kdD4KICAgICAgICAgIDxkdCBpZD0ibGlua2VkRG9jX3RvIj48Y29kZT48c3Ryb25nPnRvPC9zdHJvbmc+OiBpbnRlZ2VyPC9jb2RlPjwvZHQ+CiAgICAgICAgICA8ZGQ+Q2FuIGJlIGdpdmVuIHRvIG1ha2UgdGhlIG5ldyBkb2N1bWVudCBhIHN1YnZpZXcgb2YgdGhlCiAgICAgICAgICBvcmlnaW5hbC4gU3Vidmlld3Mgb25seSBzaG93IGEgZ2l2ZW4gcmFuZ2Ugb2YgbGluZXMuIE5vdGUKICAgICAgICAgIHRoYXQgbGluZSBjb29yZGluYXRlcyBpbnNpZGUgdGhlIHN1YnZpZXcgd2lsbCBiZSBjb25zaXN0ZW50CiAgICAgICAgICB3aXRoIHRob3NlIG9mIHRoZSBwYXJlbnQsIHNvIHRoYXQgZm9yIGV4YW1wbGUgYSBzdWJ2aWV3CiAgICAgICAgICBzdGFydGluZyBhdCBsaW5lIDEwIHdpbGwgcmVmZXIgdG8gaXRzIGZpcnN0IGxpbmUgYXMgbGluZSAxMCwKICAgICAgICAgIG5vdCAwLjwvZGQ+CiAgICAgICAgICA8ZHQgaWQ9ImxpbmtlZERvY19tb2RlIj48Y29kZT48c3Ryb25nPm1vZGU8L3N0cm9uZz46IHN0cmluZ3xvYmplY3Q8L2NvZGU+PC9kdD4KICAgICAgICAgIDxkZD5CeSBkZWZhdWx0LCB0aGUgbmV3IGRvY3VtZW50IGluaGVyaXRzIHRoZSBtb2RlIG9mIHRoZQogICAgICAgICAgcGFyZW50LiBUaGlzIG9wdGlvbiBjYW4gYmUgc2V0IHRvCiAgICAgICAgICBhIDxhIGhyZWY9IiNvcHRpb25fbW9kZSI+bW9kZSBzcGVjPC9hPiB0byBnaXZlIGl0IGEKICAgICAgICAgIGRpZmZlcmVudCBtb2RlLjwvZGQ+CiAgICAgICAgPC9kbD48L2RkPgogICAgICA8ZHQgaWQ9InVubGlua0RvYyI+PGNvZGU+PHN0cm9uZz5kb2MudW5saW5rRG9jPC9zdHJvbmc+KGRvYzogQ29kZU1pcnJvci5Eb2MpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5CcmVhayB0aGUgbGluayBiZXR3ZWVuIHR3byBkb2N1bWVudHMuIEFmdGVyIGNhbGxpbmcgdGhpcywKICAgICAgY2hhbmdlcyB3aWxsIG5vIGxvbmdlciBwcm9wYWdhdGUgYmV0d2VlbiB0aGUgZG9jdW1lbnRzLCBhbmQsIGlmCiAgICAgIHRoZXkgaGFkIGEgc2hhcmVkIGhpc3RvcnksIHRoZSBoaXN0b3J5IHdpbGwgYmVjb21lCiAgICAgIHNlcGFyYXRlLjwvZGQ+CiAgICAgIDxkdCBpZD0iaXRlckxpbmtlZERvY3MiPjxjb2RlPjxzdHJvbmc+ZG9jLml0ZXJMaW5rZWREb2NzPC9zdHJvbmc+KGZ1bmN0aW9uOiAoZG9jOiBDb2RlTWlycm9yLkRvYywgc2hhcmVkSGlzdDogYm9vbGVhbikpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5XaWxsIGNhbGwgdGhlIGdpdmVuIGZ1bmN0aW9uIGZvciBhbGwgZG9jdW1lbnRzIGxpbmtlZCB0byB0aGUKICAgICAgdGFyZ2V0IGRvY3VtZW50LiBJdCB3aWxsIGJlIHBhc3NlZCB0d28gYXJndW1lbnRzLCB0aGUgbGlua2VkIGRvY3VtZW50CiAgICAgIGFuZCBhIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIHRoYXQgZG9jdW1lbnQgc2hhcmVzIGhpc3RvcnkKICAgICAgd2l0aCB0aGUgdGFyZ2V0LjwvZGQ+CiAgICA8L2RsPgoKICAgIDxoMyBpZD0iYXBpX2hpc3RvcnkiPkhpc3RvcnktcmVsYXRlZCBtZXRob2RzPC9oMz4KCiAgICA8ZGw+CiAgICAgIDxkdCBpZD0idW5kbyI+PGNvZGU+PHN0cm9uZz5kb2MudW5kbzwvc3Ryb25nPigpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5VbmRvIG9uZSBlZGl0IChpZiBhbnkgdW5kbyBldmVudHMgYXJlIHN0b3JlZCkuPC9kZD4KICAgICAgPGR0IGlkPSJyZWRvIj48Y29kZT48c3Ryb25nPmRvYy5yZWRvPC9zdHJvbmc+KCk8L2NvZGU+PC9kdD4KICAgICAgPGRkPlJlZG8gb25lIHVuZG9uZSBlZGl0LjwvZGQ+CgogICAgICA8ZHQgaWQ9InVuZG9TZWxlY3Rpb24iPjxjb2RlPjxzdHJvbmc+ZG9jLnVuZG9TZWxlY3Rpb248L3N0cm9uZz4oKTwvY29kZT48L2R0PgogICAgICA8ZGQ+VW5kbyBvbmUgZWRpdCBvciBzZWxlY3Rpb24gY2hhbmdlLjwvZGQ+CiAgICAgIDxkdCBpZD0icmVkb1NlbGVjdGlvbiI+PGNvZGU+PHN0cm9uZz5kb2MucmVkb1NlbGVjdGlvbjwvc3Ryb25nPigpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5SZWRvIG9uZSB1bmRvbmUgZWRpdCBvciBzZWxlY3Rpb24gY2hhbmdlLjwvZGQ+CgogICAgICA8ZHQgaWQ9Imhpc3RvcnlTaXplIj48Y29kZT48c3Ryb25nPmRvYy5oaXN0b3J5U2l6ZTwvc3Ryb25nPigpIOKGkiB7dW5kbzogaW50ZWdlciwgcmVkbzogaW50ZWdlcn08L2NvZGU+PC9kdD4KICAgICAgPGRkPlJldHVybnMgYW4gb2JqZWN0IHdpdGggPGNvZGU+e3VuZG8sIHJlZG99PC9jb2RlPiBwcm9wZXJ0aWVzLAogICAgICBib3RoIG9mIHdoaWNoIGhvbGQgaW50ZWdlcnMsIGluZGljYXRpbmcgdGhlIGFtb3VudCBvZiBzdG9yZWQKICAgICAgdW5kbyBhbmQgcmVkbyBvcGVyYXRpb25zLjwvZGQ+CiAgICAgIDxkdCBpZD0iY2xlYXJIaXN0b3J5Ij48Y29kZT48c3Ryb25nPmRvYy5jbGVhckhpc3Rvcnk8L3N0cm9uZz4oKTwvY29kZT48L2R0PgogICAgICA8ZGQ+Q2xlYXJzIHRoZSBlZGl0b3IncyB1bmRvIGhpc3RvcnkuPC9kZD4KICAgICAgPGR0IGlkPSJnZXRIaXN0b3J5Ij48Y29kZT48c3Ryb25nPmRvYy5nZXRIaXN0b3J5PC9zdHJvbmc+KCkg4oaSIG9iamVjdDwvY29kZT48L2R0PgogICAgICA8ZGQ+R2V0IGEgKEpTT04tc2VyaWFsaXphYmxlKSByZXByZXNlbnRhdGlvbiBvZiB0aGUgdW5kbyBoaXN0b3J5LjwvZGQ+CiAgICAgIDxkdCBpZD0ic2V0SGlzdG9yeSI+PGNvZGU+PHN0cm9uZz5kb2Muc2V0SGlzdG9yeTwvc3Ryb25nPihoaXN0b3J5OiBvYmplY3QpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5SZXBsYWNlIHRoZSBlZGl0b3IncyB1bmRvIGhpc3Rvcnkgd2l0aCB0aGUgb25lIHByb3ZpZGVkLAogICAgICB3aGljaCBtdXN0IGJlIGEgdmFsdWUgYXMgcmV0dXJuZWQKICAgICAgYnkgPGEgaHJlZj0iI2dldEhpc3RvcnkiPjxjb2RlPmdldEhpc3Rvcnk8L2NvZGU+PC9hPi4gTm90ZSB0aGF0CiAgICAgIHRoaXMgd2lsbCBoYXZlIGVudGlyZWx5IHVuZGVmaW5lZCByZXN1bHRzIGlmIHRoZSBlZGl0b3IgY29udGVudAogICAgICBpc24ndCBhbHNvIHRoZSBzYW1lIGFzIGl0IHdhcyB3aGVuIDxjb2RlPmdldEhpc3Rvcnk8L2NvZGU+IHdhcwogICAgICBjYWxsZWQuPC9kZD4KICAgIDwvZGw+CgogICAgPGgzIGlkPSJhcGlfbWFya2VyIj5UZXh0LW1hcmtpbmcgbWV0aG9kczwvaDM+CgogICAgPGRsPgogICAgICA8ZHQgaWQ9Im1hcmtUZXh0Ij48Y29kZT48c3Ryb25nPmRvYy5tYXJrVGV4dDwvc3Ryb25nPihmcm9tOiB7bGluZSwgY2h9LCB0bzoge2xpbmUsIGNofSwgP29wdGlvbnM6IG9iamVjdCkg4oaSIFRleHRNYXJrZXI8L2NvZGU+PC9kdD4KICAgICAgPGRkPkNhbiBiZSB1c2VkIHRvIG1hcmsgYSByYW5nZSBvZiB0ZXh0IHdpdGggYSBzcGVjaWZpYyBDU1MKICAgICAgY2xhc3MgbmFtZS4gPGNvZGU+ZnJvbTwvY29kZT4gYW5kIDxjb2RlPnRvPC9jb2RlPiBzaG91bGQKICAgICAgYmUgPGNvZGU+e2xpbmUsIGNofTwvY29kZT4gb2JqZWN0cy4gVGhlIDxjb2RlPm9wdGlvbnM8L2NvZGU+CiAgICAgIHBhcmFtZXRlciBpcyBvcHRpb25hbC4gV2hlbiBnaXZlbiwgaXQgc2hvdWxkIGJlIGFuIG9iamVjdCB0aGF0CiAgICAgIG1heSBjb250YWluIHRoZSBmb2xsb3dpbmcgY29uZmlndXJhdGlvbiBvcHRpb25zOgogICAgICA8ZGw+CiAgICAgICAgPGR0IGlkPSJtYXJrX2NsYXNzTmFtZSI+PGNvZGU+PHN0cm9uZz5jbGFzc05hbWU8L3N0cm9uZz46IHN0cmluZzwvY29kZT48L2R0PgogICAgICAgIDxkZD5Bc3NpZ25zIGEgQ1NTIGNsYXNzIHRvIHRoZSBtYXJrZWQgc3RyZXRjaCBvZiB0ZXh0LjwvZGQ+CiAgICAgICAgPGR0IGlkPSJtYXJrX2luY2x1c2l2ZUxlZnQiPjxjb2RlPjxzdHJvbmc+aW5jbHVzaXZlTGVmdDwvc3Ryb25nPjogYm9vbGVhbjwvY29kZT48L2R0PgogICAgICAgIDxkZD5EZXRlcm1pbmVzIHdoZXRoZXIKICAgICAgICB0ZXh0IGluc2VydGVkIG9uIHRoZSBsZWZ0IG9mIHRoZSBtYXJrZXIgd2lsbCBlbmQgdXAgaW5zaWRlCiAgICAgICAgb3Igb3V0c2lkZSBvZiBpdC48L2RkPgogICAgICAgIDxkdCBpZD0ibWFya19pbmNsdXNpdmVSaWdodCI+PGNvZGU+PHN0cm9uZz5pbmNsdXNpdmVSaWdodDwvc3Ryb25nPjogYm9vbGVhbjwvY29kZT48L2R0PgogICAgICAgIDxkZD5MaWtlIDxjb2RlPmluY2x1c2l2ZUxlZnQ8L2NvZGU+LAogICAgICAgIGJ1dCBmb3IgdGhlIHJpZ2h0IHNpZGUuPC9kZD4KICAgICAgICA8ZHQgaWQ9Im1hcmtfYXRvbWljIj48Y29kZT48c3Ryb25nPmF0b21pYzwvc3Ryb25nPjogYm9vbGVhbjwvY29kZT48L2R0PgogICAgICAgIDxkZD5BdG9taWMgcmFuZ2VzIGFjdCBhcyBhIHNpbmdsZSB1bml0IHdoZW4gY3Vyc29yIG1vdmVtZW50IGlzCiAgICAgICAgY29uY2VybmVk4oCUaS5lLiBpdCBpcyBpbXBvc3NpYmxlIHRvIHBsYWNlIHRoZSBjdXJzb3IgaW5zaWRlIG9mCiAgICAgICAgdGhlbS4gSW4gYXRvbWljIHJhbmdlcywgPGNvZGU+aW5jbHVzaXZlTGVmdDwvY29kZT4KICAgICAgICBhbmQgPGNvZGU+aW5jbHVzaXZlUmlnaHQ8L2NvZGU+IGhhdmUgYSBkaWZmZXJlbnQgbWVhbmluZ+KAlHRoZXkKICAgICAgICB3aWxsIHByZXZlbnQgdGhlIGN1cnNvciBmcm9tIGJlaW5nIHBsYWNlZCByZXNwZWN0aXZlbHkKICAgICAgICBkaXJlY3RseSBiZWZvcmUgYW5kIGRpcmVjdGx5IGFmdGVyIHRoZSByYW5nZS48L2RkPgogICAgICAgIDxkdCBpZD0ibWFya19jb2xsYXBzZWQiPjxjb2RlPjxzdHJvbmc+Y29sbGFwc2VkPC9zdHJvbmc+OiBib29sZWFuPC9jb2RlPjwvZHQ+CiAgICAgICAgPGRkPkNvbGxhcHNlZCByYW5nZXMgZG8gbm90IHNob3cgdXAgaW4gdGhlIGRpc3BsYXkuIFNldHRpbmcgYQogICAgICAgIHJhbmdlIHRvIGJlIGNvbGxhcHNlZCB3aWxsIGF1dG9tYXRpY2FsbHkgbWFrZSBpdCBhdG9taWMuPC9kZD4KICAgICAgICA8ZHQgaWQ9Im1hcmtfY2xlYXJPbkVudGVyIj48Y29kZT48c3Ryb25nPmNsZWFyT25FbnRlcjwvc3Ryb25nPjogYm9vbGVhbjwvY29kZT48L2R0PgogICAgICAgIDxkZD5XaGVuIGVuYWJsZWQsIHdpbGwgY2F1c2UgdGhlIG1hcmsgdG8gY2xlYXIgaXRzZWxmIHdoZW5ldmVyCiAgICAgICAgdGhlIGN1cnNvciBlbnRlcnMgaXRzIHJhbmdlLiBUaGlzIGlzIG1vc3RseSB1c2VmdWwgZm9yCiAgICAgICAgdGV4dC1yZXBsYWNlbWVudCB3aWRnZXRzIHRoYXQgbmVlZCB0byAnc25hcCBvcGVuJyB3aGVuIHRoZQogICAgICAgIHVzZXIgdHJpZXMgdG8gZWRpdCB0aGVtLiBUaGUKICAgICAgICA8YSBocmVmPSIjZXZlbnRfY2xlYXIiPjxjb2RlPiJjbGVhciI8L2NvZGU+PC9hPiBldmVudAogICAgICAgIGZpcmVkIG9uIHRoZSByYW5nZSBoYW5kbGUgY2FuIGJlIHVzZWQgdG8gYmUgbm90aWZpZWQgd2hlbiB0aGlzCiAgICAgICAgaGFwcGVucy48L2RkPgogICAgICAgIDxkdCBpZD0ibWFya19jbGVhcldoZW5FbXB0eSI+PGNvZGU+PHN0cm9uZz5jbGVhcldoZW5FbXB0eTwvc3Ryb25nPjogYm9vbGVhbjwvY29kZT48L2R0PgogICAgICAgIDxkZD5EZXRlcm1pbmVzIHdoZXRoZXIgdGhlIG1hcmsgaXMgYXV0b21hdGljYWxseSBjbGVhcmVkIHdoZW4KICAgICAgICBpdCBiZWNvbWVzIGVtcHR5LiBEZWZhdWx0IGlzIHRydWUuPC9kZD4KICAgICAgICA8ZHQgaWQ9Im1hcmtfcmVwbGFjZWRXaXRoIj48Y29kZT48c3Ryb25nPnJlcGxhY2VkV2l0aDwvc3Ryb25nPjogRWxlbWVudDwvY29kZT48L2R0PgogICAgICAgIDxkZD5Vc2UgYSBnaXZlbiBub2RlIHRvIGRpc3BsYXkgdGhpcyByYW5nZS4gSW1wbGllcyBib3RoCiAgICAgICAgY29sbGFwc2VkIGFuZCBhdG9taWMuIFRoZSBnaXZlbiBET00gbm9kZSA8ZW0+bXVzdDwvZW0+IGJlIGFuCiAgICAgICAgaW5saW5lIGVsZW1lbnQgKGFzIG9wcG9zZWQgdG8gYSBibG9jayBlbGVtZW50KS48L2RkPgogICAgICAgIDxkdD48Y29kZT48c3Ryb25nPmhhbmRsZU1vdXNlRXZlbnRzPC9zdHJvbmc+OiBib29sZWFuPC9jb2RlPjwvZHQ+CiAgICAgICAgPGRkPldoZW4gPGNvZGU+cmVwbGFjZWRXaXRoPC9jb2RlPiBpcyBnaXZlbiwgdGhpcyBkZXRlcm1pbmVzCiAgICAgICAgd2hldGhlciB0aGUgZWRpdG9yIHdpbGwgY2FwdHVyZSBtb3VzZSBhbmQgZHJhZyBldmVudHMKICAgICAgICBvY2N1cnJpbmcgaW4gdGhpcyB3aWRnZXQuIERlZmF1bHQgaXMgZmFsc2XigJR0aGUgZXZlbnRzIHdpbGwgYmUKICAgICAgICBsZWZ0IGFsb25lIGZvciB0aGUgZGVmYXVsdCBicm93c2VyIGhhbmRsZXIsIG9yIHNwZWNpZmljCiAgICAgICAgaGFuZGxlcnMgb24gdGhlIHdpZGdldCwgdG8gY2FwdHVyZS48L2RkPgogICAgICAgIDxkdCBpZD0ibWFya19yZWFkT25seSI+PGNvZGU+PHN0cm9uZz5yZWFkT25seTwvc3Ryb25nPjogYm9vbGVhbjwvY29kZT48L2R0PgogICAgICAgIDxkZD5BIHJlYWQtb25seSBzcGFuIGNhbiwgYXMgbG9uZyBhcyBpdCBpcyBub3QgY2xlYXJlZCwgbm90IGJlCiAgICAgICAgbW9kaWZpZWQgZXhjZXB0IGJ5CiAgICAgICAgY2FsbGluZyA8YSBocmVmPSIjc2V0VmFsdWUiPjxjb2RlPnNldFZhbHVlPC9jb2RlPjwvYT4gdG8gcmVzZXQKICAgICAgICB0aGUgd2hvbGUgZG9jdW1lbnQuIDxlbT5Ob3RlOjwvZW0+IGFkZGluZyBhIHJlYWQtb25seSBzcGFuCiAgICAgICAgY3VycmVudGx5IGNsZWFycyB0aGUgdW5kbyBoaXN0b3J5IG9mIHRoZSBlZGl0b3IsIGJlY2F1c2UKICAgICAgICBleGlzdGluZyB1bmRvIGV2ZW50cyBiZWluZyBwYXJ0aWFsbHkgbnVsbGlmaWVkIGJ5IHJlYWQtb25seQogICAgICAgIHNwYW5zIHdvdWxkIGNvcnJ1cHQgdGhlIGhpc3RvcnkgKGluIHRoZSBjdXJyZW50CiAgICAgICAgaW1wbGVtZW50YXRpb24pLjwvZGQ+CiAgICAgICAgPGR0IGlkPSJtYXJrX2FkZFRvSGlzdG9yeSI+PGNvZGU+PHN0cm9uZz5hZGRUb0hpc3Rvcnk8L3N0cm9uZz46IGJvb2xlYW48L2NvZGU+PC9kdD4KICAgICAgICA8ZGQ+V2hlbiBzZXQgdG8gdHJ1ZSAoZGVmYXVsdCBpcyBmYWxzZSksIGFkZGluZyB0aGlzIG1hcmtlcgogICAgICAgIHdpbGwgY3JlYXRlIGFuIGV2ZW50IGluIHRoZSB1bmRvIGhpc3RvcnkgdGhhdCBjYW4gYmUKICAgICAgICBpbmRpdmlkdWFsbHkgdW5kb25lIChjbGVhcmluZyB0aGUgbWFya2VyKS48L2RkPgogICAgICAgIDxkdCBpZD0ibWFya19zdGFydFN0eWxlIj48Y29kZT48c3Ryb25nPnN0YXJ0U3R5bGU8L3N0cm9uZz46IHN0cmluZzwvY29kZT48L2R0PjxkZD5DYW4gYmUgdXNlZCB0byBzcGVjaWZ5CiAgICAgICAgYW4gZXh0cmEgQ1NTIGNsYXNzIHRvIGJlIGFwcGxpZWQgdG8gdGhlIGxlZnRtb3N0IHNwYW4gdGhhdAogICAgICAgIGlzIHBhcnQgb2YgdGhlIG1hcmtlci48L2RkPgogICAgICAgIDxkdCBpZD0ibWFya19lbmRTdHlsZSI+PGNvZGU+PHN0cm9uZz5lbmRTdHlsZTwvc3Ryb25nPjogc3RyaW5nPC9jb2RlPjwvZHQ+PGRkPkVxdWl2YWxlbnQKICAgICAgICB0byA8Y29kZT5zdGFydFN0eWxlPC9jb2RlPiwgYnV0IGZvciB0aGUgcmlnaHRtb3N0IHNwYW4uPC9kZD4KICAgICAgICA8ZHQgaWQ9Im1hcmtfY3NzIj48Y29kZT48c3Ryb25nPmNzczwvc3Ryb25nPjogc3RyaW5nPC9jb2RlPjwvZHQ+CiAgICAgICAgPGRkPkEgc3RyaW5nIG9mIENTUyB0byBiZSBhcHBsaWVkIHRvIHRoZSBjb3ZlcmVkIHRleHQuIEZvciBleGFtcGxlIDxjb2RlPiJjb2xvcjogI2ZlMyI8L2NvZGU+LjwvZGQ+CiAgICAgICAgPGR0IGlkPSJtYXJrX3RpdGxlIj48Y29kZT48c3Ryb25nPnRpdGxlPC9zdHJvbmc+OgogICAgICAgIHN0cmluZzwvY29kZT48L2R0PjxkZD5XaGVuIGdpdmVuLCB3aWxsIGdpdmUgdGhlIG5vZGVzIGNyZWF0ZWQKICAgICAgICBmb3IgdGhpcyBzcGFuIGEgSFRNTCA8Y29kZT50aXRsZTwvY29kZT4gYXR0cmlidXRlIHdpdGggdGhlCiAgICAgICAgZ2l2ZW4gdmFsdWUuPC9kZD4KICAgICAgICA8ZHQgaWQ9Im1hcmtfc2hhcmVkIj48Y29kZT48c3Ryb25nPnNoYXJlZDwvc3Ryb25nPjogYm9vbGVhbjwvY29kZT48L2R0PjxkZD5XaGVuIHRoZQogICAgICAgIHRhcmdldCBkb2N1bWVudCBpcyA8YSBocmVmPSIjbGlua2VkRG9jIj5saW5rZWQ8L2E+IHRvIG90aGVyCiAgICAgICAgZG9jdW1lbnRzLCB5b3UgY2FuIHNldCA8Y29kZT5zaGFyZWQ8L2NvZGU+IHRvIHRydWUgdG8gbWFrZSB0aGUKICAgICAgICBtYXJrZXIgYXBwZWFyIGluIGFsbCBkb2N1bWVudHMuIEJ5IGRlZmF1bHQsIGEgbWFya2VyIGFwcGVhcnMKICAgICAgICBvbmx5IGluIGl0cyB0YXJnZXQgZG9jdW1lbnQuPC9kZD4KICAgICAgPC9kbD4KICAgICAgVGhlIG1ldGhvZCB3aWxsIHJldHVybiBhbiBvYmplY3QgdGhhdCByZXByZXNlbnRzIHRoZSBtYXJrZXIKICAgICAgKHdpdGggY29uc3RydWN0b3IgPGNvZGU+Q29kZU1pcnJvci5UZXh0TWFya2VyPC9jb2RlPiksIHdoaWNoCiAgICAgIGV4cG9zZXMgdGhyZWUgbWV0aG9kczoKICAgICAgPGNvZGU+PHN0cm9uZz5jbGVhcjwvc3Ryb25nPigpPC9jb2RlPiwgdG8gcmVtb3ZlIHRoZSBtYXJrLAogICAgICA8Y29kZT48c3Ryb25nPmZpbmQ8L3N0cm9uZz4oKTwvY29kZT4sIHdoaWNoIHJldHVybnMKICAgICAgYSA8Y29kZT57ZnJvbSwgdG99PC9jb2RlPiBvYmplY3QgKGJvdGggaG9sZGluZyBkb2N1bWVudAogICAgICBwb3NpdGlvbnMpLCBpbmRpY2F0aW5nIHRoZSBjdXJyZW50IHBvc2l0aW9uIG9mIHRoZSBtYXJrZWQgcmFuZ2UsCiAgICAgIG9yIDxjb2RlPnVuZGVmaW5lZDwvY29kZT4gaWYgdGhlIG1hcmtlciBpcyBubyBsb25nZXIgaW4gdGhlCiAgICAgIGRvY3VtZW50LCBhbmQgZmluYWxseSA8Y29kZT48c3Ryb25nPmNoYW5nZWQ8L3N0cm9uZz4oKTwvY29kZT4sCiAgICAgIHdoaWNoIHlvdSBjYW4gY2FsbCBpZiB5b3UndmUgZG9uZSBzb21ldGhpbmcgdGhhdCBtaWdodCBjaGFuZ2UKICAgICAgdGhlIHNpemUgb2YgdGhlIG1hcmtlciAoZm9yIGV4YW1wbGUgY2hhbmdpbmcgdGhlIGNvbnRlbnQgb2YKICAgICAgYSA8YSBocmVmPSIjbWFya19yZXBsYWNlZFdpdGgiPjxjb2RlPnJlcGxhY2VkV2l0aDwvY29kZT48L2E+CiAgICAgIG5vZGUpLCBhbmQgd2FudCB0byBjaGVhcGx5IHVwZGF0ZSB0aGUgZGlzcGxheS48L2RkPgoKICAgICAgPGR0IGlkPSJzZXRCb29rbWFyayI+PGNvZGU+PHN0cm9uZz5kb2Muc2V0Qm9va21hcms8L3N0cm9uZz4ocG9zOiB7bGluZSwgY2h9LCA/b3B0aW9uczogb2JqZWN0KSDihpIgVGV4dE1hcmtlcjwvY29kZT48L2R0PgogICAgICA8ZGQ+SW5zZXJ0cyBhIGJvb2ttYXJrLCBhIGhhbmRsZSB0aGF0IGZvbGxvd3MgdGhlIHRleHQgYXJvdW5kIGl0CiAgICAgIGFzIGl0IGlzIGJlaW5nIGVkaXRlZCwgYXQgdGhlIGdpdmVuIHBvc2l0aW9uLiBBIGJvb2ttYXJrIGhhcyB0d28KICAgICAgbWV0aG9kcyA8Y29kZT5maW5kKCk8L2NvZGU+IGFuZCA8Y29kZT5jbGVhcigpPC9jb2RlPi4gVGhlIGZpcnN0CiAgICAgIHJldHVybnMgdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgdGhlIGJvb2ttYXJrLCBpZiBpdCBpcyBzdGlsbCBpbgogICAgICB0aGUgZG9jdW1lbnQsIGFuZCB0aGUgc2Vjb25kIGV4cGxpY2l0bHkgcmVtb3ZlcyB0aGUgYm9va21hcmsuCiAgICAgIFRoZSBvcHRpb25zIGFyZ3VtZW50IGlzIG9wdGlvbmFsLiBJZiBnaXZlbiwgdGhlIGZvbGxvd2luZwogICAgICBwcm9wZXJ0aWVzIGFyZSByZWNvZ25pemVkOgogICAgICA8ZGw+CiAgICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+d2lkZ2V0PC9zdHJvbmc+OiBFbGVtZW50PC9jb2RlPjwvZHQ+PGRkPkNhbiBiZSB1c2VkIHRvIGRpc3BsYXkgYSBET00KICAgICAgICBub2RlIGF0IHRoZSBjdXJyZW50IGxvY2F0aW9uIG9mIHRoZSBib29rbWFyayAoYW5hbG9nb3VzIHRvCiAgICAgICAgdGhlIDxhIGhyZWY9IiNtYXJrX3JlcGxhY2VkV2l0aCI+PGNvZGU+cmVwbGFjZWRXaXRoPC9jb2RlPjwvYT4KICAgICAgICBvcHRpb24gdG8gPGEgaHJlZj0iI21hcmtUZXh0Ij48Y29kZT5tYXJrVGV4dDwvY29kZT48L2E+KS48L2RkPgogICAgICAgIDxkdD48Y29kZT48c3Ryb25nPmluc2VydExlZnQ8L3N0cm9uZz46IGJvb2xlYW48L2NvZGU+PC9kdD48ZGQ+QnkgZGVmYXVsdCwgdGV4dCB0eXBlZAogICAgICAgIHdoZW4gdGhlIGN1cnNvciBpcyBvbiB0b3Agb2YgdGhlIGJvb2ttYXJrIHdpbGwgZW5kIHVwIHRvIHRoZQogICAgICAgIHJpZ2h0IG9mIHRoZSBib29rbWFyay4gU2V0IHRoaXMgb3B0aW9uIHRvIHRydWUgdG8gbWFrZSBpdCBnbwogICAgICAgIHRvIHRoZSBsZWZ0IGluc3RlYWQuPC9kZD4KICAgICAgICA8ZHQ+PGNvZGU+PHN0cm9uZz5zaGFyZWQ8L3N0cm9uZz46IGJvb2xlYW48L2NvZGU+PC9kdD48ZGQ+U2VlCiAgICAgICAgdGhlIGNvcnJlc3BvbmRpbmcgPGEgaHJlZj0iI21hcmtfc2hhcmVkIj5vcHRpb248L2E+CiAgICAgICAgdG8gPGNvZGU+bWFya1RleHQ8L2NvZGU+LjwvZGQ+CiAgICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+aGFuZGxlTW91c2VFdmVudHM8L3N0cm9uZz46IGJvb2xlYW48L2NvZGU+PC9kdD4KICAgICAgICA8ZGQ+QXMgd2l0aCA8YSBocmVmPSIjbWFya1RleHQiPjxjb2RlPm1hcmtUZXh0PC9jb2RlPjwvYT4sCiAgICAgICAgdGhpcyBkZXRlcm1pbmVzIHdoZXRoZXIgbW91c2UgZXZlbnRzIG9uIHRoZSB3aWRnZXQgaW5zZXJ0ZWQKICAgICAgICBmb3IgdGhpcyBib29rbWFyayBhcmUgaGFuZGxlZCBieSBDb2RlTWlycm9yLiBUaGUgZGVmYXVsdCBpcwogICAgICAgIGZhbHNlLjwvZGQ+CiAgICAgIDwvZGw+PC9kZD4KCiAgICAgIDxkdCBpZD0iZmluZE1hcmtzIj48Y29kZT48c3Ryb25nPmRvYy5maW5kTWFya3M8L3N0cm9uZz4oZnJvbToge2xpbmUsIGNofSwgdG86IHtsaW5lLCBjaH0pIOKGkiBhcnJheSZsdDtUZXh0TWFya2VyJmd0OzwvY29kZT48L2R0PgogICAgICA8ZGQ+UmV0dXJucyBhbiBhcnJheSBvZiBhbGwgdGhlIGJvb2ttYXJrcyBhbmQgbWFya2VkIHJhbmdlcwogICAgICBmb3VuZCBiZXR3ZWVuIHRoZSBnaXZlbiBwb3NpdGlvbnMgKG5vbi1pbmNsdXNpdmUpLjwvZGQ+CiAgICAgIDxkdCBpZD0iZmluZE1hcmtzQXQiPjxjb2RlPjxzdHJvbmc+ZG9jLmZpbmRNYXJrc0F0PC9zdHJvbmc+KHBvczoge2xpbmUsIGNofSkg4oaSIGFycmF5Jmx0O1RleHRNYXJrZXImZ3Q7PC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5SZXR1cm5zIGFuIGFycmF5IG9mIGFsbCB0aGUgYm9va21hcmtzIGFuZCBtYXJrZWQgcmFuZ2VzCiAgICAgIHByZXNlbnQgYXQgdGhlIGdpdmVuIHBvc2l0aW9uLjwvZGQ+CiAgICAgIDxkdCBpZD0iZ2V0QWxsTWFya3MiPjxjb2RlPjxzdHJvbmc+ZG9jLmdldEFsbE1hcmtzPC9zdHJvbmc+KCkg4oaSIGFycmF5Jmx0O1RleHRNYXJrZXImZ3Q7PC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5SZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgYWxsIG1hcmtlZCByYW5nZXMgaW4gdGhlIGRvY3VtZW50LjwvZGQ+CiAgICA8L2RsPgoKICAgIDxoMyBpZD0iYXBpX2RlY29yYXRpb24iPldpZGdldCwgZ3V0dGVyLCBhbmQgZGVjb3JhdGlvbiBtZXRob2RzPC9oMz4KCiAgICA8ZGw+CiAgICAgIDxkdCBpZD0ic2V0R3V0dGVyTWFya2VyIj48Y29kZT48c3Ryb25nPmNtLnNldEd1dHRlck1hcmtlcjwvc3Ryb25nPihsaW5lOiBpbnRlZ2VyfExpbmVIYW5kbGUsIGd1dHRlcklEOiBzdHJpbmcsIHZhbHVlOiBFbGVtZW50KSDihpIgTGluZUhhbmRsZTwvY29kZT48L2R0PgogICAgICA8ZGQ+U2V0cyB0aGUgZ3V0dGVyIG1hcmtlciBmb3IgdGhlIGdpdmVuIGd1dHRlciAoaWRlbnRpZmllZCBieQogICAgICBpdHMgQ1NTIGNsYXNzLCBzZWUKICAgICAgdGhlIDxhIGhyZWY9IiNvcHRpb25fZ3V0dGVycyI+PGNvZGU+Z3V0dGVyczwvY29kZT48L2E+IG9wdGlvbikKICAgICAgdG8gdGhlIGdpdmVuIHZhbHVlLiBWYWx1ZSBjYW4gYmUgZWl0aGVyIDxjb2RlPm51bGw8L2NvZGU+LCB0bwogICAgICBjbGVhciB0aGUgbWFya2VyLCBvciBhIERPTSBlbGVtZW50LCB0byBzZXQgaXQuIFRoZSBET00gZWxlbWVudAogICAgICB3aWxsIGJlIHNob3duIGluIHRoZSBzcGVjaWZpZWQgZ3V0dGVyIG5leHQgdG8gdGhlIHNwZWNpZmllZAogICAgICBsaW5lLjwvZGQ+CgogICAgICA8ZHQgaWQ9ImNsZWFyR3V0dGVyIj48Y29kZT48c3Ryb25nPmNtLmNsZWFyR3V0dGVyPC9zdHJvbmc+KGd1dHRlcklEOiBzdHJpbmcpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5SZW1vdmUgYWxsIGd1dHRlciBtYXJrZXJzIGluCiAgICAgIHRoZSA8YSBocmVmPSIjb3B0aW9uX2d1dHRlcnMiPmd1dHRlcjwvYT4gd2l0aCB0aGUgZ2l2ZW4gSUQuPC9kZD4KCiAgICAgIDxkdCBpZD0iYWRkTGluZUNsYXNzIj48Y29kZT48c3Ryb25nPmRvYy5hZGRMaW5lQ2xhc3M8L3N0cm9uZz4obGluZTogaW50ZWdlcnxMaW5lSGFuZGxlLCB3aGVyZTogc3RyaW5nLCBjbGFzczogc3RyaW5nKSDihpIgTGluZUhhbmRsZTwvY29kZT48L2R0PgogICAgICA8ZGQ+U2V0IGEgQ1NTIGNsYXNzIG5hbWUgZm9yIHRoZSBnaXZlbiBsaW5lLiA8Y29kZT5saW5lPC9jb2RlPgogICAgICBjYW4gYmUgYSBudW1iZXIgb3IgYSBsaW5lIGhhbmRsZS4gPGNvZGU+d2hlcmU8L2NvZGU+IGRldGVybWluZXMKICAgICAgdG8gd2hpY2ggZWxlbWVudCB0aGlzIGNsYXNzIHNob3VsZCBiZSBhcHBsaWVkLCBjYW4gY2FuIGJlIG9uZQogICAgICBvZiA8Y29kZT4idGV4dCI8L2NvZGU+ICh0aGUgdGV4dCBlbGVtZW50LCB3aGljaCBsaWVzIGluIGZyb250IG9mCiAgICAgIHRoZSBzZWxlY3Rpb24pLCA8Y29kZT4iYmFja2dyb3VuZCI8L2NvZGU+IChhIGJhY2tncm91bmQgZWxlbWVudAogICAgICB0aGF0IHdpbGwgYmUgYmVoaW5kIHRoZSBzZWxlY3Rpb24pLCA8Y29kZT4iZ3V0dGVyIjwvY29kZT4gKHRoZQogICAgICBsaW5lJ3MgZ3V0dGVyIHNwYWNlKSwgb3IgPGNvZGU+IndyYXAiPC9jb2RlPiAodGhlIHdyYXBwZXIgbm9kZQogICAgICB0aGF0IHdyYXBzIGFsbCBvZiB0aGUgbGluZSdzIGVsZW1lbnRzLCBpbmNsdWRpbmcgZ3V0dGVyCiAgICAgIGVsZW1lbnRzKS4gPGNvZGU+Y2xhc3M8L2NvZGU+IHNob3VsZCBiZSB0aGUgbmFtZSBvZiB0aGUgY2xhc3MgdG8KICAgICAgYXBwbHkuPC9kZD4KCiAgICAgIDxkdCBpZD0icmVtb3ZlTGluZUNsYXNzIj48Y29kZT48c3Ryb25nPmRvYy5yZW1vdmVMaW5lQ2xhc3M8L3N0cm9uZz4obGluZTogaW50ZWdlcnxMaW5lSGFuZGxlLCB3aGVyZTogc3RyaW5nLCBjbGFzczogc3RyaW5nKSDihpIgTGluZUhhbmRsZTwvY29kZT48L2R0PgogICAgICA8ZGQ+UmVtb3ZlIGEgQ1NTIGNsYXNzIGZyb20gYSBsaW5lLiA8Y29kZT5saW5lPC9jb2RlPiBjYW4gYmUgYQogICAgICBsaW5lIGhhbmRsZSBvciBudW1iZXIuIDxjb2RlPndoZXJlPC9jb2RlPiBzaG91bGQgYmUgb25lCiAgICAgIG9mIDxjb2RlPiJ0ZXh0IjwvY29kZT4sIDxjb2RlPiJiYWNrZ3JvdW5kIjwvY29kZT4sCiAgICAgIG9yIDxjb2RlPiJ3cmFwIjwvY29kZT4KICAgICAgKHNlZSA8YSBocmVmPSIjYWRkTGluZUNsYXNzIj48Y29kZT5hZGRMaW5lQ2xhc3M8L2NvZGU+PC9hPikuIDxjb2RlPmNsYXNzPC9jb2RlPgogICAgICBjYW4gYmUgbGVmdCBvZmYgdG8gcmVtb3ZlIGFsbCBjbGFzc2VzIGZvciB0aGUgc3BlY2lmaWVkIG5vZGUsIG9yCiAgICAgIGJlIGEgc3RyaW5nIHRvIHJlbW92ZSBvbmx5IGEgc3BlY2lmaWMgY2xhc3MuPC9kZD4KCiAgICAgIDxkdCBpZD0ibGluZUluZm8iPjxjb2RlPjxzdHJvbmc+Y20ubGluZUluZm88L3N0cm9uZz4obGluZTogaW50ZWdlcnxMaW5lSGFuZGxlKSDihpIgb2JqZWN0PC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5SZXR1cm5zIHRoZSBsaW5lIG51bWJlciwgdGV4dCBjb250ZW50LCBhbmQgbWFya2VyIHN0YXR1cyBvZgogICAgICB0aGUgZ2l2ZW4gbGluZSwgd2hpY2ggY2FuIGJlIGVpdGhlciBhIG51bWJlciBvciBhIGxpbmUgaGFuZGxlLgogICAgICBUaGUgcmV0dXJuZWQgb2JqZWN0IGhhcyB0aGUgc3RydWN0dXJlIDxjb2RlPntsaW5lLCBoYW5kbGUsIHRleHQsCiAgICAgIGd1dHRlck1hcmtlcnMsIHRleHRDbGFzcywgYmdDbGFzcywgd3JhcENsYXNzLCB3aWRnZXRzfTwvY29kZT4sCiAgICAgIHdoZXJlIDxjb2RlPmd1dHRlck1hcmtlcnM8L2NvZGU+IGlzIGFuIG9iamVjdCBtYXBwaW5nIGd1dHRlciBJRHMKICAgICAgdG8gbWFya2VyIGVsZW1lbnRzLCBhbmQgPGNvZGU+d2lkZ2V0czwvY29kZT4gaXMgYW4gYXJyYXkKICAgICAgb2YgPGEgaHJlZj0iI2FkZExpbmVXaWRnZXQiPmxpbmUgd2lkZ2V0czwvYT4gYXR0YWNoZWQgdG8gdGhpcwogICAgICBsaW5lLCBhbmQgdGhlIHZhcmlvdXMgY2xhc3MgcHJvcGVydGllcyByZWZlciB0byBjbGFzc2VzIGFkZGVkCiAgICAgIHdpdGggPGEgaHJlZj0iI2FkZExpbmVDbGFzcyI+PGNvZGU+YWRkTGluZUNsYXNzPC9jb2RlPjwvYT4uPC9kZD4KCiAgICAgIDxkdCBpZD0iYWRkV2lkZ2V0Ij48Y29kZT48c3Ryb25nPmNtLmFkZFdpZGdldDwvc3Ryb25nPihwb3M6IHtsaW5lLCBjaH0sIG5vZGU6IEVsZW1lbnQsIHNjcm9sbEludG9WaWV3OiBib29sZWFuKTwvY29kZT48L2R0PgogICAgICA8ZGQ+UHV0cyA8Y29kZT5ub2RlPC9jb2RlPiwgd2hpY2ggc2hvdWxkIGJlIGFuIGFic29sdXRlbHkKICAgICAgcG9zaXRpb25lZCBET00gbm9kZSwgaW50byB0aGUgZWRpdG9yLCBwb3NpdGlvbmVkIHJpZ2h0IGJlbG93IHRoZQogICAgICBnaXZlbiA8Y29kZT57bGluZSwgY2h9PC9jb2RlPiBwb3NpdGlvbi4KICAgICAgV2hlbiA8Y29kZT5zY3JvbGxJbnRvVmlldzwvY29kZT4gaXMgdHJ1ZSwgdGhlIGVkaXRvciB3aWxsIGVuc3VyZQogICAgICB0aGF0IHRoZSBlbnRpcmUgbm9kZSBpcyB2aXNpYmxlIChpZiBwb3NzaWJsZSkuIFRvIHJlbW92ZSB0aGUKICAgICAgd2lkZ2V0IGFnYWluLCBzaW1wbHkgdXNlIERPTSBtZXRob2RzIChtb3ZlIGl0IHNvbWV3aGVyZSBlbHNlLCBvcgogICAgICBjYWxsIDxjb2RlPnJlbW92ZUNoaWxkPC9jb2RlPiBvbiBpdHMgcGFyZW50KS48L2RkPgoKICAgICAgPGR0IGlkPSJhZGRMaW5lV2lkZ2V0Ij48Y29kZT48c3Ryb25nPmRvYy5hZGRMaW5lV2lkZ2V0PC9zdHJvbmc+KGxpbmU6IGludGVnZXJ8TGluZUhhbmRsZSwgbm9kZTogRWxlbWVudCwgP29wdGlvbnM6IG9iamVjdCkg4oaSIExpbmVXaWRnZXQ8L2NvZGU+PC9kdD4KICAgICAgPGRkPkFkZHMgYSBsaW5lIHdpZGdldCwgYW4gZWxlbWVudCBzaG93biBiZWxvdyBhIGxpbmUsIHNwYW5uaW5nCiAgICAgIHRoZSB3aG9sZSBvZiB0aGUgZWRpdG9yJ3Mgd2lkdGgsIGFuZCBtb3ZpbmcgdGhlIGxpbmVzIGJlbG93IGl0CiAgICAgIGRvd253YXJkcy4gPGNvZGU+bGluZTwvY29kZT4gc2hvdWxkIGJlIGVpdGhlciBhbiBpbnRlZ2VyIG9yIGEKICAgICAgbGluZSBoYW5kbGUsIGFuZCA8Y29kZT5ub2RlPC9jb2RlPiBzaG91bGQgYmUgYSBET00gbm9kZSwgd2hpY2gKICAgICAgd2lsbCBiZSBkaXNwbGF5ZWQgYmVsb3cgdGhlIGdpdmVuIGxpbmUuIDxjb2RlPm9wdGlvbnM8L2NvZGU+LAogICAgICB3aGVuIGdpdmVuLCBzaG91bGQgYmUgYW4gb2JqZWN0IHRoYXQgY29uZmlndXJlcyB0aGUgYmVoYXZpb3Igb2YKICAgICAgdGhlIHdpZGdldC4gVGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBzdXBwb3J0ZWQgKGFsbCBkZWZhdWx0IHRvCiAgICAgIGZhbHNlKToKICAgICAgICA8ZGw+CiAgICAgICAgICA8ZHQ+PGNvZGU+PHN0cm9uZz5jb3Zlckd1dHRlcjwvc3Ryb25nPjogYm9vbGVhbjwvY29kZT48L2R0PgogICAgICAgICAgPGRkPldoZXRoZXIgdGhlIHdpZGdldCBzaG91bGQgY292ZXIgdGhlIGd1dHRlci48L2RkPgogICAgICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+bm9IU2Nyb2xsPC9zdHJvbmc+OiBib29sZWFuPC9jb2RlPjwvZHQ+CiAgICAgICAgICA8ZGQ+V2hldGhlciB0aGUgd2lkZ2V0IHNob3VsZCBzdGF5IGZpeGVkIGluIHRoZSBmYWNlIG9mCiAgICAgICAgICBob3Jpem9udGFsIHNjcm9sbGluZy48L2RkPgogICAgICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+YWJvdmU8L3N0cm9uZz46IGJvb2xlYW48L2NvZGU+PC9kdD4KICAgICAgICAgIDxkZD5DYXVzZXMgdGhlIHdpZGdldCB0byBiZSBwbGFjZWQgYWJvdmUgaW5zdGVhZCBvZiBiZWxvdwogICAgICAgICAgdGhlIHRleHQgb2YgdGhlIGxpbmUuPC9kZD4KICAgICAgICAgIDxkdD48Y29kZT48c3Ryb25nPmhhbmRsZU1vdXNlRXZlbnRzPC9zdHJvbmc+OiBib29sZWFuPC9jb2RlPjwvZHQ+CiAgICAgICAgICA8ZGQ+RGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBlZGl0b3Igd2lsbCBjYXB0dXJlIG1vdXNlIGFuZAogICAgICAgICAgZHJhZyBldmVudHMgb2NjdXJyaW5nIGluIHRoaXMgd2lkZ2V0LiBEZWZhdWx0IGlzIGZhbHNl4oCUdGhlCiAgICAgICAgICBldmVudHMgd2lsbCBiZSBsZWZ0IGFsb25lIGZvciB0aGUgZGVmYXVsdCBicm93c2VyIGhhbmRsZXIsCiAgICAgICAgICBvciBzcGVjaWZpYyBoYW5kbGVycyBvbiB0aGUgd2lkZ2V0LCB0byBjYXB0dXJlLjwvZGQ+CiAgICAgICAgICA8ZHQ+PGNvZGU+PHN0cm9uZz5pbnNlcnRBdDwvc3Ryb25nPjogaW50ZWdlcjwvY29kZT48L2R0PgogICAgICAgICAgPGRkPkJ5IGRlZmF1bHQsIHRoZSB3aWRnZXQgaXMgYWRkZWQgYmVsb3cgb3RoZXIgd2lkZ2V0cyBmb3IKICAgICAgICAgIHRoZSBsaW5lLiBUaGlzIG9wdGlvbiBjYW4gYmUgdXNlZCB0byBwbGFjZSBpdCBhdCBhIGRpZmZlcmVudAogICAgICAgICAgcG9zaXRpb24gKHplcm8gZm9yIHRoZSB0b3AsIE4gdG8gcHV0IGl0IGFmdGVyIHRoZSBOdGggb3RoZXIKICAgICAgICAgIHdpZGdldCkuIE5vdGUgdGhhdCB0aGlzIG9ubHkgaGFzIGVmZmVjdCBvbmNlLCB3aGVuIHRoZQogICAgICAgICAgd2lkZ2V0IGlzIGNyZWF0ZWQuCiAgICAgICAgPC9kbD4KICAgICAgTm90ZSB0aGF0IHRoZSB3aWRnZXQgbm9kZSB3aWxsIGJlY29tZSBhIGRlc2NlbmRhbnQgb2Ygbm9kZXMgd2l0aAogICAgICBDb2RlTWlycm9yLXNwZWNpZmljIENTUyBjbGFzc2VzLCBhbmQgdGhvc2UgY2xhc3NlcyBtaWdodCBpbiBzb21lCiAgICAgIGNhc2VzIGFmZmVjdCBpdC4gVGhpcyBtZXRob2QgcmV0dXJucyBhbiBvYmplY3QgdGhhdCByZXByZXNlbnRzCiAgICAgIHRoZSB3aWRnZXQgcGxhY2VtZW50LiBJdCdsbCBoYXZlIGEgPGNvZGU+bGluZTwvY29kZT4gcHJvcGVydHkKICAgICAgcG9pbnRpbmcgYXQgdGhlIGxpbmUgaGFuZGxlIHRoYXQgaXQgaXMgYXNzb2NpYXRlZCB3aXRoLCBhbmQgdGhlIGZvbGxvd2luZyBtZXRob2RzOgogICAgICAgIDxkbD4KICAgICAgICAgIDxkdCBpZD0id2lkZ2V0X2NsZWFyIj48Y29kZT48c3Ryb25nPmNsZWFyPC9zdHJvbmc+KCk8L2NvZGU+PC9kdD48ZGQ+UmVtb3ZlcyB0aGUgd2lkZ2V0LjwvZGQ+CiAgICAgICAgICA8ZHQgaWQ9IndpZGdldF9jaGFuZ2VkIj48Y29kZT48c3Ryb25nPmNoYW5nZWQ8L3N0cm9uZz4oKTwvY29kZT48L2R0PjxkZD5DYWxsCiAgICAgICAgICB0aGlzIGlmIHlvdSBtYWRlIHNvbWUgY2hhbmdlIHRvIHRoZSB3aWRnZXQncyBET00gbm9kZSB0aGF0CiAgICAgICAgICBtaWdodCBhZmZlY3QgaXRzIGhlaWdodC4gSXQnbGwgZm9yY2UgQ29kZU1pcnJvciB0byB1cGRhdGUKICAgICAgICAgIHRoZSBoZWlnaHQgb2YgdGhlIGxpbmUgdGhhdCBjb250YWlucyB0aGUgd2lkZ2V0LjwvZGQ+CiAgICAgICAgPC9kbD4KICAgICAgPC9kZD4KICAgIDwvZGw+CgogICAgPGgzIGlkPSJhcGlfc2l6aW5nIj5TaXppbmcsIHNjcm9sbGluZyBhbmQgcG9zaXRpb25pbmcgbWV0aG9kczwvaDM+CgogICAgPGRsPgogICAgICA8ZHQgaWQ9InNldFNpemUiPjxjb2RlPjxzdHJvbmc+Y20uc2V0U2l6ZTwvc3Ryb25nPih3aWR0aDogbnVtYmVyfHN0cmluZywgaGVpZ2h0OiBudW1iZXJ8c3RyaW5nKTwvY29kZT48L2R0PgogICAgICA8ZGQ+UHJvZ3JhbW1hdGljYWxseSBzZXQgdGhlIHNpemUgb2YgdGhlIGVkaXRvciAob3ZlcnJpZGluZyB0aGUKICAgICAgYXBwbGljYWJsZSA8YSBocmVmPSIjY3NzLXJlc2l6ZSI+Q1NTCiAgICAgIHJ1bGVzPC9hPikuIDxjb2RlPndpZHRoPC9jb2RlPiBhbmQgPGNvZGU+aGVpZ2h0PC9jb2RlPgogICAgICBjYW4gYmUgZWl0aGVyIG51bWJlcnMgKGludGVycHJldGVkIGFzIHBpeGVscykgb3IgQ1NTIHVuaXRzCiAgICAgICg8Y29kZT4iMTAwJSI8L2NvZGU+LCBmb3IgZXhhbXBsZSkuIFlvdSBjYW4KICAgICAgcGFzcyA8Y29kZT5udWxsPC9jb2RlPiBmb3IgZWl0aGVyIG9mIHRoZW0gdG8gaW5kaWNhdGUgdGhhdCB0aGF0CiAgICAgIGRpbWVuc2lvbiBzaG91bGQgbm90IGJlIGNoYW5nZWQuPC9kZD4KCiAgICAgIDxkdCBpZD0ic2Nyb2xsVG8iPjxjb2RlPjxzdHJvbmc+Y20uc2Nyb2xsVG88L3N0cm9uZz4oeDogbnVtYmVyLCB5OiBudW1iZXIpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5TY3JvbGwgdGhlIGVkaXRvciB0byBhIGdpdmVuIChwaXhlbCkgcG9zaXRpb24uIEJvdGgKICAgICAgYXJndW1lbnRzIG1heSBiZSBsZWZ0IGFzIDxjb2RlPm51bGw8L2NvZGU+CiAgICAgIG9yIDxjb2RlPnVuZGVmaW5lZDwvY29kZT4gdG8gaGF2ZSBubyBlZmZlY3QuPC9kZD4KICAgICAgPGR0IGlkPSJnZXRTY3JvbGxJbmZvIj48Y29kZT48c3Ryb25nPmNtLmdldFNjcm9sbEluZm88L3N0cm9uZz4oKSDihpIge2xlZnQsIHRvcCwgd2lkdGgsIGhlaWdodCwgY2xpZW50V2lkdGgsIGNsaWVudEhlaWdodH08L2NvZGU+PC9kdD4KICAgICAgPGRkPkdldCBhbiA8Y29kZT57bGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0LCBjbGllbnRXaWR0aCwKICAgICAgY2xpZW50SGVpZ2h0fTwvY29kZT4gb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgY3VycmVudCBzY3JvbGwKICAgICAgcG9zaXRpb24sIHRoZSBzaXplIG9mIHRoZSBzY3JvbGxhYmxlIGFyZWEsIGFuZCB0aGUgc2l6ZSBvZiB0aGUKICAgICAgdmlzaWJsZSBhcmVhIChtaW51cyBzY3JvbGxiYXJzKS48L2RkPgogICAgICA8ZHQgaWQ9InNjcm9sbEludG9WaWV3Ij48Y29kZT48c3Ryb25nPmNtLnNjcm9sbEludG9WaWV3PC9zdHJvbmc+KHdoYXQ6IHtsaW5lLCBjaH18e2xlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbX18e2Zyb20sIHRvfXxudWxsLCA/bWFyZ2luOiBudW1iZXIpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5TY3JvbGxzIHRoZSBnaXZlbiBwb3NpdGlvbiBpbnRvIHZpZXcuIDxjb2RlPndoYXQ8L2NvZGU+IG1heQogICAgICBiZSA8Y29kZT5udWxsPC9jb2RlPiB0byBzY3JvbGwgdGhlIGN1cnNvciBpbnRvIHZpZXcsCiAgICAgIGEgPGNvZGU+e2xpbmUsIGNofTwvY29kZT4gcG9zaXRpb24gdG8gc2Nyb2xsIGEgY2hhcmFjdGVyIGludG8KICAgICAgdmlldywgYSA8Y29kZT57bGVmdCwgdG9wLCByaWdodCwgYm90dG9tfTwvY29kZT4gcGl4ZWwgcmFuZ2UgKGluCiAgICAgIGVkaXRvci1sb2NhbCBjb29yZGluYXRlcyksIG9yIGEgcmFuZ2UgPGNvZGU+e2Zyb20sIHRvfTwvY29kZT4KICAgICAgY29udGFpbmluZyBlaXRoZXIgdHdvIGNoYXJhY3RlciBwb3NpdGlvbnMgb3IgdHdvIHBpeGVsIHNxdWFyZXMuCiAgICAgIFRoZSA8Y29kZT5tYXJnaW48L2NvZGU+IHBhcmFtZXRlciBpcyBvcHRpb25hbC4gV2hlbiBnaXZlbiwgaXQKICAgICAgaW5kaWNhdGVzIHRoZSBhbW91bnQgb2YgdmVydGljYWwgcGl4ZWxzIGFyb3VuZCB0aGUgZ2l2ZW4gYXJlYQogICAgICB0aGF0IHNob3VsZCBiZSBtYWRlIHZpc2libGUgYXMgd2VsbC48L2RkPgoKICAgICAgPGR0IGlkPSJjdXJzb3JDb29yZHMiPjxjb2RlPjxzdHJvbmc+Y20uY3Vyc29yQ29vcmRzPC9zdHJvbmc+KHdoZXJlOiBib29sZWFufHtsaW5lLCBjaH0sIG1vZGU6IHN0cmluZykg4oaSIHtsZWZ0LCB0b3AsIGJvdHRvbX08L2NvZGU+PC9kdD4KICAgICAgPGRkPlJldHVybnMgYW4gPGNvZGU+e2xlZnQsIHRvcCwgYm90dG9tfTwvY29kZT4gb2JqZWN0CiAgICAgIGNvbnRhaW5pbmcgdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBjdXJzb3IgcG9zaXRpb24uCiAgICAgIElmIDxjb2RlPm1vZGU8L2NvZGU+IGlzIDxjb2RlPiJsb2NhbCI8L2NvZGU+LCB0aGV5IHdpbGwgYmUKICAgICAgcmVsYXRpdmUgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgZWRpdGFibGUgZG9jdW1lbnQuIElmIGl0CiAgICAgIGlzIDxjb2RlPiJwYWdlIjwvY29kZT4gb3Igbm90IGdpdmVuLCB0aGV5IGFyZSByZWxhdGl2ZSB0byB0aGUKICAgICAgdG9wLWxlZnQgY29ybmVyIG9mIHRoZSBwYWdlLiBJZiA8Y29kZT5tb2RlPC9jb2RlPgogICAgICBpcyA8Y29kZT4id2luZG93IjwvY29kZT4sIHRoZSBjb29yZGluYXRlcyBhcmUgcmVsYXRpdmUgdG8gdGhlCiAgICAgIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgY3VycmVudGx5IHZpc2libGUgKHNjcm9sbGVkKQogICAgICB3aW5kb3cuIDxjb2RlPndoZXJlPC9jb2RlPiBjYW4gYmUgYSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlcgogICAgICB5b3Ugd2FudCB0aGUgc3RhcnQgKDxjb2RlPnRydWU8L2NvZGU+KSBvciB0aGUgZW5kCiAgICAgICg8Y29kZT5mYWxzZTwvY29kZT4pIG9mIHRoZSBzZWxlY3Rpb24sIG9yLCBpZiBhIDxjb2RlPntsaW5lLAogICAgICBjaH08L2NvZGU+IG9iamVjdCBpcyBnaXZlbiwgaXQgc3BlY2lmaWVzIHRoZSBwcmVjaXNlIHBvc2l0aW9uIGF0CiAgICAgIHdoaWNoIHlvdSB3YW50IHRvIG1lYXN1cmUuPC9kZD4KICAgICAgPGR0IGlkPSJjaGFyQ29vcmRzIj48Y29kZT48c3Ryb25nPmNtLmNoYXJDb29yZHM8L3N0cm9uZz4ocG9zOiB7bGluZSwgY2h9LCA/bW9kZTogc3RyaW5nKSDihpIge2xlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbX08L2NvZGU+PC9kdD4KICAgICAgPGRkPlJldHVybnMgdGhlIHBvc2l0aW9uIGFuZCBkaW1lbnNpb25zIG9mIGFuIGFyYml0cmFyeQogICAgICBjaGFyYWN0ZXIuIDxjb2RlPnBvczwvY29kZT4gc2hvdWxkIGJlIGEgPGNvZGU+e2xpbmUsIGNofTwvY29kZT4KICAgICAgb2JqZWN0LiBUaGlzIGRpZmZlcnMgZnJvbSA8Y29kZT5jdXJzb3JDb29yZHM8L2NvZGU+IGluIHRoYXQKICAgICAgaXQnbGwgZ2l2ZSB0aGUgc2l6ZSBvZiB0aGUgd2hvbGUgY2hhcmFjdGVyLCByYXRoZXIgdGhhbiBqdXN0IHRoZQogICAgICBwb3NpdGlvbiB0aGF0IHRoZSBjdXJzb3Igd291bGQgaGF2ZSB3aGVuIGl0IHdvdWxkIHNpdCBhdCB0aGF0CiAgICAgIHBvc2l0aW9uLjwvZGQ+CiAgICAgIDxkdCBpZD0iY29vcmRzQ2hhciI+PGNvZGU+PHN0cm9uZz5jbS5jb29yZHNDaGFyPC9zdHJvbmc+KG9iamVjdDoge2xlZnQsIHRvcH0sID9tb2RlOiBzdHJpbmcpIOKGkiB7bGluZSwgY2h9PC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5HaXZlbiBhbiA8Y29kZT57bGVmdCwgdG9wfTwvY29kZT4gb2JqZWN0LCByZXR1cm5zCiAgICAgIHRoZSA8Y29kZT57bGluZSwgY2h9PC9jb2RlPiBwb3NpdGlvbiB0aGF0IGNvcnJlc3BvbmRzIHRvIGl0LiBUaGUKICAgICAgb3B0aW9uYWwgPGNvZGU+bW9kZTwvY29kZT4gcGFyYW1ldGVyIGRldGVybWluZXMgcmVsYXRpdmUgdG8gd2hhdAogICAgICB0aGUgY29vcmRpbmF0ZXMgYXJlIGludGVycHJldGVkLiBJdCBtYXkKICAgICAgYmUgPGNvZGU+IndpbmRvdyI8L2NvZGU+LCA8Y29kZT4icGFnZSI8L2NvZGU+ICh0aGUgZGVmYXVsdCksCiAgICAgIG9yIDxjb2RlPiJsb2NhbCI8L2NvZGU+LjwvZGQ+CiAgICAgIDxkdCBpZD0ibGluZUF0SGVpZ2h0Ij48Y29kZT48c3Ryb25nPmNtLmxpbmVBdEhlaWdodDwvc3Ryb25nPihoZWlnaHQ6IG51bWJlciwgP21vZGU6IHN0cmluZykg4oaSIG51bWJlcjwvY29kZT48L2R0PgogICAgICA8ZGQ+Q29tcHV0ZXMgdGhlIGxpbmUgYXQgdGhlIGdpdmVuIHBpeGVsCiAgICAgIGhlaWdodC4gPGNvZGU+bW9kZTwvY29kZT4gY2FuIGJlIG9uZSBvZiB0aGUgc2FtZSBzdHJpbmdzCiAgICAgIHRoYXQgPGEgaHJlZj0iI2Nvb3Jkc0NoYXIiPjxjb2RlPmNvb3Jkc0NoYXI8L2NvZGU+PC9hPgogICAgICBhY2NlcHRzLjwvZGQ+CiAgICAgIDxkdCBpZD0iaGVpZ2h0QXRMaW5lIj48Y29kZT48c3Ryb25nPmNtLmhlaWdodEF0TGluZTwvc3Ryb25nPihsaW5lOiBpbnRlZ2VyfExpbmVIYW5kbGUsID9tb2RlOiBzdHJpbmcpIOKGkiBudW1iZXI8L2NvZGU+PC9kdD4KICAgICAgPGRkPkNvbXB1dGVzIHRoZSBoZWlnaHQgb2YgdGhlIHRvcCBvZiBhIGxpbmUsIGluIHRoZSBjb29yZGluYXRlCiAgICAgIHN5c3RlbSBzcGVjaWZpZWQgYnkgPGNvZGU+bW9kZTwvY29kZT4KICAgICAgKHNlZSA8YSBocmVmPSIjY29vcmRzQ2hhciI+PGNvZGU+Y29vcmRzQ2hhcjwvY29kZT48L2E+KSwgd2hpY2gKICAgICAgZGVmYXVsdHMgdG8gPGNvZGU+InBhZ2UiPC9jb2RlPi4gV2hlbiBhIGxpbmUgYmVsb3cgdGhlIGJvdHRvbSBvZgogICAgICB0aGUgZG9jdW1lbnQgaXMgc3BlY2lmaWVkLCB0aGUgcmV0dXJuZWQgdmFsdWUgaXMgdGhlIGJvdHRvbSBvZgogICAgICB0aGUgbGFzdCBsaW5lIGluIHRoZSBkb2N1bWVudC48L2RkPgogICAgICA8ZHQgaWQ9ImRlZmF1bHRUZXh0SGVpZ2h0Ij48Y29kZT48c3Ryb25nPmNtLmRlZmF1bHRUZXh0SGVpZ2h0PC9zdHJvbmc+KCkg4oaSIG51bWJlcjwvY29kZT48L2R0PgogICAgICA8ZGQ+UmV0dXJucyB0aGUgbGluZSBoZWlnaHQgb2YgdGhlIGRlZmF1bHQgZm9udCBmb3IgdGhlIGVkaXRvci48L2RkPgogICAgICA8ZHQgaWQ9ImRlZmF1bHRDaGFyV2lkdGgiPjxjb2RlPjxzdHJvbmc+Y20uZGVmYXVsdENoYXJXaWR0aDwvc3Ryb25nPigpIOKGkiBudW1iZXI8L2NvZGU+PC9kdD4KICAgICAgPGRkPlJldHVybnMgdGhlIHBpeGVsIHdpZHRoIG9mIGFuICd4JyBpbiB0aGUgZGVmYXVsdCBmb250IGZvcgogICAgICB0aGUgZWRpdG9yLiAoTm90ZSB0aGF0IGZvciBub24tbW9ub3NwYWNlIGZvbnRzLCB0aGlzIGlzIG1vc3RseQogICAgICB1c2VsZXNzLCBhbmQgZXZlbiBmb3IgbW9ub3NwYWNlIGZvbnRzLCBub24tYXNjaWkgY2hhcmFjdGVycwogICAgICBtaWdodCBoYXZlIGEgZGlmZmVyZW50IHdpZHRoKS48L2RkPgoKICAgICAgPGR0IGlkPSJnZXRWaWV3cG9ydCI+PGNvZGU+PHN0cm9uZz5jbS5nZXRWaWV3cG9ydDwvc3Ryb25nPigpIOKGkiB7ZnJvbTogbnVtYmVyLCB0bzogbnVtYmVyfTwvY29kZT48L2R0PgogICAgICA8ZGQ+UmV0dXJucyBhIDxjb2RlPntmcm9tLCB0b308L2NvZGU+IG9iamVjdCBpbmRpY2F0aW5nIHRoZQogICAgICBzdGFydCAoaW5jbHVzaXZlKSBhbmQgZW5kIChleGNsdXNpdmUpIG9mIHRoZSBjdXJyZW50bHkgcmVuZGVyZWQKICAgICAgcGFydCBvZiB0aGUgZG9jdW1lbnQuIEluIGJpZyBkb2N1bWVudHMsIHdoZW4gbW9zdCBjb250ZW50IGlzCiAgICAgIHNjcm9sbGVkIG91dCBvZiB2aWV3LCBDb2RlTWlycm9yIHdpbGwgb25seSByZW5kZXIgdGhlIHZpc2libGUKICAgICAgcGFydCwgYW5kIGEgbWFyZ2luIGFyb3VuZCBpdC4gU2VlIGFsc28KICAgICAgdGhlIDxhIGhyZWY9IiNldmVudF92aWV3cG9ydENoYW5nZSI+PGNvZGU+dmlld3BvcnRDaGFuZ2U8L2NvZGU+PC9hPgogICAgICBldmVudC48L2RkPgoKICAgICAgPGR0IGlkPSJyZWZyZXNoIj48Y29kZT48c3Ryb25nPmNtLnJlZnJlc2g8L3N0cm9uZz4oKTwvY29kZT48L2R0PgogICAgICA8ZGQ+SWYgeW91ciBjb2RlIGRvZXMgc29tZXRoaW5nIHRvIGNoYW5nZSB0aGUgc2l6ZSBvZiB0aGUgZWRpdG9yCiAgICAgIGVsZW1lbnQgKHdpbmRvdyByZXNpemVzIGFyZSBhbHJlYWR5IGxpc3RlbmVkIGZvciksIG9yIHVuaGlkZXMKICAgICAgaXQsIHlvdSBzaG91bGQgcHJvYmFibHkgZm9sbG93IHVwIGJ5IGNhbGxpbmcgdGhpcyBtZXRob2QgdG8KICAgICAgZW5zdXJlIENvZGVNaXJyb3IgaXMgc3RpbGwgbG9va2luZyBhcyBpbnRlbmRlZC4gU2VlIGFsc28KICAgICAgdGhlIDxhIGhyZWY9IiNhZGRvbl9hdXRvcmVmcmVzaCI+YXV0b3JlZnJlc2ggYWRkb248L2E+LjwvZGQ+CiAgICA8L2RsPgoKICAgIDxoMyBpZD0iYXBpX21vZGUiPk1vZGUsIHN0YXRlLCBhbmQgdG9rZW4tcmVsYXRlZCBtZXRob2RzPC9oMz4KCiAgICA8cD5XaGVuIHdyaXRpbmcgbGFuZ3VhZ2UtYXdhcmUgZnVuY3Rpb25hbGl0eSwgaXQgY2FuIG9mdGVuIGJlCiAgICB1c2VmdWwgdG8gaG9vayBpbnRvIHRoZSBrbm93bGVkZ2UgdGhhdCB0aGUgQ29kZU1pcnJvciBsYW5ndWFnZQogICAgbW9kZSBoYXMuIFNlZSA8YSBocmVmPSIjbW9kZWFwaSI+dGhlIHNlY3Rpb24gb24gbW9kZXM8L2E+IGZvciBhCiAgICBtb3JlIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIGhvdyB0aGVzZSB3b3JrLjwvcD4KCiAgICA8ZGw+CiAgICAgIDxkdCBpZD0iZ2V0TW9kZSI+PGNvZGU+PHN0cm9uZz5kb2MuZ2V0TW9kZTwvc3Ryb25nPigpIOKGkiBvYmplY3Q8L2NvZGU+PC9kdD4KICAgICAgPGRkPkdldHMgdGhlIChvdXRlcikgbW9kZSBvYmplY3QgZm9yIHRoZSBlZGl0b3IuIE5vdGUgdGhhdCB0aGlzCiAgICAgIGlzIGRpc3RpbmN0IGZyb20gPGNvZGU+Z2V0T3B0aW9uKCJtb2RlIik8L2NvZGU+LCB3aGljaCBnaXZlcyB5b3UKICAgICAgdGhlIG1vZGUgc3BlY2lmaWNhdGlvbiwgcmF0aGVyIHRoYW4gdGhlIHJlc29sdmVkLCBpbnN0YW50aWF0ZWQKICAgICAgPGEgaHJlZj0iI2RlZmluZU1vZGUiPm1vZGUgb2JqZWN0PC9hPi48L2RkPgoKICAgICAgPGR0IGlkPSJnZXRNb2RlQXQiPjxjb2RlPjxzdHJvbmc+Y20uZ2V0TW9kZUF0PC9zdHJvbmc+KHBvczoge2xpbmUsIGNofSkg4oaSIG9iamVjdDwvY29kZT48L2R0PgogICAgICA8ZGQ+R2V0cyB0aGUgaW5uZXIgbW9kZSBhdCBhIGdpdmVuIHBvc2l0aW9uLiBUaGlzIHdpbGwgcmV0dXJuCiAgICAgIHRoZSBzYW1lIGFzIDxhIGhyZWY9IiNnZXRNb2RlIj48Y29kZT5nZXRNb2RlPC9jb2RlPjwvYT4gZm9yCiAgICAgIHNpbXBsZSBtb2RlcywgYnV0IHdpbGwgcmV0dXJuIGFuIGlubmVyIG1vZGUgZm9yIG5lc3RpbmcgbW9kZXMKICAgICAgKHN1Y2ggYXMgPGNvZGU+aHRtbG1peGVkPC9jb2RlPikuPC9kZD4KCiAgICAgIDxkdCBpZD0iZ2V0VG9rZW5BdCI+PGNvZGU+PHN0cm9uZz5jbS5nZXRUb2tlbkF0PC9zdHJvbmc+KHBvczoge2xpbmUsIGNofSwgP3ByZWNpc2U6IGJvb2xlYW4pIOKGkiBvYmplY3Q8L2NvZGU+PC9kdD4KICAgICAgPGRkPlJldHJpZXZlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdG9rZW4gdGhlIGN1cnJlbnQgbW9kZSBmb3VuZAogICAgICBiZWZvcmUgdGhlIGdpdmVuIHBvc2l0aW9uIChhIDxjb2RlPntsaW5lLCBjaH08L2NvZGU+IG9iamVjdCkuIFRoZQogICAgICByZXR1cm5lZCBvYmplY3QgaGFzIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKICAgICAgPGRsPgogICAgICAgIDxkdD48Y29kZT48c3Ryb25nPnN0YXJ0PC9zdHJvbmc+PC9jb2RlPjwvZHQ+PGRkPlRoZSBjaGFyYWN0ZXIgKG9uIHRoZSBnaXZlbiBsaW5lKSBhdCB3aGljaCB0aGUgdG9rZW4gc3RhcnRzLjwvZGQ+CiAgICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+ZW5kPC9zdHJvbmc+PC9jb2RlPjwvZHQ+PGRkPlRoZSBjaGFyYWN0ZXIgYXQgd2hpY2ggdGhlIHRva2VuIGVuZHMuPC9kZD4KICAgICAgICA8ZHQ+PGNvZGU+PHN0cm9uZz5zdHJpbmc8L3N0cm9uZz48L2NvZGU+PC9kdD48ZGQ+VGhlIHRva2VuJ3Mgc3RyaW5nLjwvZGQ+CiAgICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+dHlwZTwvc3Ryb25nPjwvY29kZT48L2R0PjxkZD5UaGUgdG9rZW4gdHlwZSB0aGUgbW9kZSBhc3NpZ25lZAogICAgICAgIHRvIHRoZSB0b2tlbiwgc3VjaCBhcyA8Y29kZT4ia2V5d29yZCI8L2NvZGU+CiAgICAgICAgb3IgPGNvZGU+ImNvbW1lbnQiPC9jb2RlPiAobWF5IGFsc28gYmUgbnVsbCkuPC9kZD4KICAgICAgICA8ZHQ+PGNvZGU+PHN0cm9uZz5zdGF0ZTwvc3Ryb25nPjwvY29kZT48L2R0PjxkZD5UaGUgbW9kZSdzIHN0YXRlIGF0IHRoZSBlbmQgb2YgdGhpcyB0b2tlbi48L2RkPgogICAgICA8L2RsPgogICAgICBJZiA8Y29kZT5wcmVjaXNlPC9jb2RlPiBpcyB0cnVlLCB0aGUgdG9rZW4gd2lsbCBiZSBndWFyYW50ZWVkIHRvIGJlIGFjY3VyYXRlIGJhc2VkIG9uIHJlY2VudCBlZGl0cy4gSWYgZmFsc2Ugb3IKICAgICAgbm90IHNwZWNpZmllZCwgdGhlIHRva2VuIHdpbGwgdXNlIGNhY2hlZCBzdGF0ZSBpbmZvcm1hdGlvbiwgd2hpY2ggd2lsbCBiZSBmYXN0ZXIgYnV0IG1pZ2h0IG5vdCBiZSBhY2N1cmF0ZSBpZgogICAgICBlZGl0cyB3ZXJlIHJlY2VudGx5IG1hZGUgYW5kIGhpZ2hsaWdodGluZyBoYXMgbm90IHlldCBjb21wbGV0ZWQuCiAgICAgIDwvZGQ+CgogICAgICA8ZHQgaWQ9ImdldExpbmVUb2tlbnMiPjxjb2RlPjxzdHJvbmc+Y20uZ2V0TGluZVRva2Vuczwvc3Ryb25nPihsaW5lOiBpbnRlZ2VyLCA/cHJlY2lzZTogYm9vbGVhbikg4oaSIGFycmF5Jmx0O3tzdGFydCwgZW5kLCBzdHJpbmcsIHR5cGUsIHN0YXRlfSZndDs8L2NvZGU+PC9kdD4KICAgICAgPGRkPlRoaXMgaXMgc2ltaWxhcgogICAgICB0byA8YSBocmVmPSIjZ2V0VG9rZW5BdCI+PGNvZGU+Z2V0VG9rZW5BdDwvY29kZT48L2E+LCBidXQKICAgICAgY29sbGVjdHMgYWxsIHRva2VucyBmb3IgYSBnaXZlbiBsaW5lIGludG8gYW4gYXJyYXkuIEl0IGlzIG11Y2gKICAgICAgY2hlYXBlciB0aGFuIHJlcGVhdGVkbHkgY2FsbGluZyA8Y29kZT5nZXRUb2tlbkF0PC9jb2RlPiwgd2hpY2gKICAgICAgcmUtcGFyc2VzIHRoZSBwYXJ0IG9mIHRoZSBsaW5lIGJlZm9yZSB0aGUgdG9rZW4gZm9yIGV2ZXJ5IGNhbGwuPC9kZD4KCiAgICAgIDxkdCBpZD0iZ2V0VG9rZW5UeXBlQXQiPjxjb2RlPjxzdHJvbmc+Y20uZ2V0VG9rZW5UeXBlQXQ8L3N0cm9uZz4ocG9zOiB7bGluZSwgY2h9KSDihpIgc3RyaW5nPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5UaGlzIGlzIGEgKG11Y2gpIGNoZWFwZXIgdmVyc2lvbgogICAgICBvZiA8YSBocmVmPSIjZ2V0VG9rZW5BdCI+PGNvZGU+Z2V0VG9rZW5BdDwvY29kZT48L2E+IHVzZWZ1bCBmb3IKICAgICAgd2hlbiB5b3UganVzdCBuZWVkIHRoZSB0eXBlIG9mIHRoZSB0b2tlbiBhdCBhIGdpdmVuIHBvc2l0aW9uLAogICAgICBhbmQgbm8gb3RoZXIgaW5mb3JtYXRpb24uIFdpbGwgcmV0dXJuIDxjb2RlPm51bGw8L2NvZGU+IGZvcgogICAgICB1bnN0eWxlZCB0b2tlbnMsIGFuZCBhIHN0cmluZywgcG90ZW50aWFsbHkgY29udGFpbmluZyBtdWx0aXBsZQogICAgICBzcGFjZS1zZXBhcmF0ZWQgc3R5bGUgbmFtZXMsIG90aGVyd2lzZS48L2RkPgoKICAgICAgPGR0IGlkPSJnZXRIZWxwZXJzIj48Y29kZT48c3Ryb25nPmNtLmdldEhlbHBlcnM8L3N0cm9uZz4ocG9zOiB7bGluZSwgY2h9LCB0eXBlOiBzdHJpbmcpIOKGkiBhcnJheSZsdDtoZWxwZXImZ3Q7PC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5GZXRjaCB0aGUgc2V0IG9mIGFwcGxpY2FibGUgaGVscGVyIHZhbHVlcyBmb3IgdGhlIGdpdmVuCiAgICAgIHBvc2l0aW9uLiBIZWxwZXJzIHByb3ZpZGUgYSB3YXkgdG8gbG9vayB1cCBmdW5jdGlvbmFsaXR5CiAgICAgIGFwcHJvcHJpYXRlIGZvciBhIG1vZGUuIFRoZSA8Y29kZT50eXBlPC9jb2RlPiBhcmd1bWVudCBwcm92aWRlcwogICAgICB0aGUgaGVscGVyIG5hbWVzcGFjZSAoc2VlCiAgICAgIDxhIGhyZWY9IiNyZWdpc3RlckhlbHBlciI+PGNvZGU+cmVnaXN0ZXJIZWxwZXI8L2NvZGU+PC9hPiksIGluCiAgICAgIHdoaWNoIHRoZSB2YWx1ZXMgd2lsbCBiZSBsb29rZWQgdXAuIFdoZW4gdGhlIG1vZGUgaXRzZWxmIGhhcyBhCiAgICAgIHByb3BlcnR5IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIDxjb2RlPnR5cGU8L2NvZGU+LCB0aGF0CiAgICAgIGRpcmVjdGx5IGRldGVybWluZXMgdGhlIGtleXMgdGhhdCBhcmUgdXNlZCB0byBsb29rIHVwIHRoZSBoZWxwZXIKICAgICAgdmFsdWVzIChpdCBtYXkgYmUgZWl0aGVyIGEgc2luZ2xlIHN0cmluZywgb3IgYW4gYXJyYXkgb2YKICAgICAgc3RyaW5ncykuIEZhaWxpbmcgdGhhdCwgdGhlIG1vZGUncyA8Y29kZT5oZWxwZXJUeXBlPC9jb2RlPgogICAgICBwcm9wZXJ0eSBhbmQgZmluYWxseSB0aGUgbW9kZSdzIG5hbWUgYXJlIHVzZWQuPC9kZD4KICAgICAgPGRkPkZvciBleGFtcGxlLCB0aGUgSmF2YVNjcmlwdCBtb2RlIGhhcyBhCiAgICAgIHByb3BlcnR5IDxjb2RlPmZvbGQ8L2NvZGU+IGNvbnRhaW5pbmcgPGNvZGU+ImJyYWNlIjwvY29kZT4uIFdoZW4KICAgICAgdGhlIDxjb2RlPmJyYWNlLWZvbGQ8L2NvZGU+IGFkZG9uIGlzIGxvYWRlZCwgdGhhdCBkZWZpbmVzIGEKICAgICAgaGVscGVyIG5hbWVkIDxjb2RlPmJyYWNlPC9jb2RlPiBpbiB0aGUgPGNvZGU+Zm9sZDwvY29kZT4KICAgICAgbmFtZXNwYWNlLiBUaGlzIGlzIHRoZW4gdXNlZCBieQogICAgICB0aGUgPGEgaHJlZj0iI2FkZG9uX2ZvbGRjb2RlIj48Y29kZT5mb2xkY29kZTwvY29kZT48L2E+IGFkZG9uIHRvCiAgICAgIGZpZ3VyZSBvdXQgdGhhdCBpdCBjYW4gdXNlIHRoYXQgZm9sZGluZyBmdW5jdGlvbiB0byBmb2xkCiAgICAgIEphdmFTY3JpcHQgY29kZS48L2RkPgogICAgICA8ZGQ+V2hlbiBhbnkgPGEgaHJlZj0iI3JlZ2lzdGVyR2xvYmFsSGVscGVyIj4nZ2xvYmFsJzwvYT4KICAgICAgaGVscGVycyBhcmUgZGVmaW5lZCBmb3IgdGhlIGdpdmVuIG5hbWVzcGFjZSwgdGhlaXIgcHJlZGljYXRlcwogICAgICBhcmUgY2FsbGVkIG9uIHRoZSBjdXJyZW50IG1vZGUgYW5kIGVkaXRvciwgYW5kIGFsbCB0aG9zZSB0aGF0CiAgICAgIGRlY2xhcmUgdGhleSBhcmUgYXBwbGljYWJsZSB3aWxsIGFsc28gYmUgYWRkZWQgdG8gdGhlIGFycmF5IHRoYXQKICAgICAgaXMgcmV0dXJuZWQuPC9kZD4KCiAgICAgIDxkdCBpZD0iZ2V0SGVscGVyIj48Y29kZT48c3Ryb25nPmNtLmdldEhlbHBlcjwvc3Ryb25nPihwb3M6IHtsaW5lLCBjaH0sIHR5cGU6IHN0cmluZykg4oaSIGhlbHBlcjwvY29kZT48L2R0PgogICAgICA8ZGQ+UmV0dXJucyB0aGUgZmlyc3QgYXBwbGljYWJsZSBoZWxwZXIgdmFsdWUuCiAgICAgIFNlZSA8YSBocmVmPSIjZ2V0SGVscGVycyI+PGNvZGU+Z2V0SGVscGVyczwvY29kZT48L2E+LjwvZGQ+CgogICAgICA8ZHQgaWQ9ImdldFN0YXRlQWZ0ZXIiPjxjb2RlPjxzdHJvbmc+Y20uZ2V0U3RhdGVBZnRlcjwvc3Ryb25nPig/bGluZTogaW50ZWdlciwgP3ByZWNpc2U6IGJvb2xlYW4pIOKGkiBvYmplY3Q8L2NvZGU+PC9kdD4KICAgICAgPGRkPlJldHVybnMgdGhlIG1vZGUncyBwYXJzZXIgc3RhdGUsIGlmIGFueSwgYXQgdGhlIGVuZCBvZiB0aGUKICAgICAgZ2l2ZW4gbGluZSBudW1iZXIuIElmIG5vIGxpbmUgbnVtYmVyIGlzIGdpdmVuLCB0aGUgc3RhdGUgYXQgdGhlCiAgICAgIGVuZCBvZiB0aGUgZG9jdW1lbnQgaXMgcmV0dXJuZWQuIFRoaXMgY2FuIGJlIHVzZWZ1bCBmb3Igc3RvcmluZwogICAgICBwYXJzaW5nIGVycm9ycyBpbiB0aGUgc3RhdGUsIG9yIGdldHRpbmcgb3RoZXIga2luZHMgb2YKICAgICAgY29udGV4dHVhbCBpbmZvcm1hdGlvbiBmb3IgYSBsaW5lLiA8Y29kZT5wcmVjaXNlPC9jb2RlPiBpcyBkZWZpbmVkCiAgICAgIGFzIGluIDxjb2RlPmdldFRva2VuQXQoKTwvY29kZT4uPC9kZD4KICAgIDwvZGw+CgogICAgPGgzIGlkPSJhcGlfbWlzYyI+TWlzY2VsbGFuZW91cyBtZXRob2RzPC9oMz4KCiAgICA8ZGw+CiAgICAgIDxkdCBpZD0ib3BlcmF0aW9uIj48Y29kZT48c3Ryb25nPmNtLm9wZXJhdGlvbjwvc3Ryb25nPihmdW5jOiAoKSDihpIgYW55KSDihpIgYW55PC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5Db2RlTWlycm9yIGludGVybmFsbHkgYnVmZmVycyBjaGFuZ2VzIGFuZCBvbmx5IHVwZGF0ZXMgaXRzCiAgICAgIERPTSBzdHJ1Y3R1cmUgYWZ0ZXIgaXQgaGFzIGZpbmlzaGVkIHBlcmZvcm1pbmcgc29tZSBvcGVyYXRpb24uCiAgICAgIElmIHlvdSBuZWVkIHRvIHBlcmZvcm0gYSBsb3Qgb2Ygb3BlcmF0aW9ucyBvbiBhIENvZGVNaXJyb3IKICAgICAgaW5zdGFuY2UsIHlvdSBjYW4gY2FsbCB0aGlzIG1ldGhvZCB3aXRoIGEgZnVuY3Rpb24gYXJndW1lbnQuIEl0CiAgICAgIHdpbGwgY2FsbCB0aGUgZnVuY3Rpb24sIGJ1ZmZlcmluZyB1cCBhbGwgY2hhbmdlcywgYW5kIG9ubHkgZG9pbmcKICAgICAgdGhlIGV4cGVuc2l2ZSB1cGRhdGUgYWZ0ZXIgdGhlIGZ1bmN0aW9uIHJldHVybnMuIFRoaXMgY2FuIGJlIGEKICAgICAgbG90IGZhc3Rlci4gVGhlIHJldHVybiB2YWx1ZSBmcm9tIHRoaXMgbWV0aG9kIHdpbGwgYmUgdGhlIHJldHVybgogICAgICB2YWx1ZSBvZiB5b3VyIGZ1bmN0aW9uLjwvZGQ+CgogICAgICA8ZHQgaWQ9ImluZGVudExpbmUiPjxjb2RlPjxzdHJvbmc+Y20uaW5kZW50TGluZTwvc3Ryb25nPihsaW5lOiBpbnRlZ2VyLCA/ZGlyOiBzdHJpbmd8aW50ZWdlcik8L2NvZGU+PC9kdD4KICAgICAgPGRkPkFkanVzdCB0aGUgaW5kZW50YXRpb24gb2YgdGhlIGdpdmVuIGxpbmUuIFRoZSBzZWNvbmQKICAgICAgYXJndW1lbnQgKHdoaWNoIGRlZmF1bHRzIHRvIDxjb2RlPiJzbWFydCI8L2NvZGU+KSBtYXkgYmUgb25lIG9mOgogICAgICAgIDxkbD4KICAgICAgICAgIDxkdD48Y29kZT48c3Ryb25nPiJwcmV2Ijwvc3Ryb25nPjwvY29kZT48L2R0PgogICAgICAgICAgPGRkPkJhc2UgaW5kZW50YXRpb24gb24gdGhlIGluZGVudGF0aW9uIG9mIHRoZSBwcmV2aW91cyBsaW5lLjwvZGQ+CiAgICAgICAgICA8ZHQ+PGNvZGU+PHN0cm9uZz4ic21hcnQiPC9zdHJvbmc+PC9jb2RlPjwvZHQ+CiAgICAgICAgICA8ZGQ+VXNlIHRoZSBtb2RlJ3Mgc21hcnQgaW5kZW50YXRpb24gaWYgYXZhaWxhYmxlLCBiZWhhdmUKICAgICAgICAgIGxpa2UgPGNvZGU+InByZXYiPC9jb2RlPiBvdGhlcndpc2UuPC9kZD4KICAgICAgICAgIDxkdD48Y29kZT48c3Ryb25nPiJhZGQiPC9zdHJvbmc+PC9jb2RlPjwvZHQ+CiAgICAgICAgICA8ZGQ+SW5jcmVhc2UgdGhlIGluZGVudGF0aW9uIG9mIHRoZSBsaW5lIGJ5CiAgICAgICAgICBvbmUgPGEgaHJlZj0iI29wdGlvbl9pbmRlbnRVbml0Ij5pbmRlbnQgdW5pdDwvYT4uPC9kZD4KICAgICAgICAgIDxkdD48Y29kZT48c3Ryb25nPiJzdWJ0cmFjdCI8L3N0cm9uZz48L2NvZGU+PC9kdD4KICAgICAgICAgIDxkZD5SZWR1Y2UgdGhlIGluZGVudGF0aW9uIG9mIHRoZSBsaW5lLjwvZGQ+CiAgICAgICAgICA8ZHQ+PGNvZGU+PHN0cm9uZz4mbHQ7aW50ZWdlcj48L3N0cm9uZz48L2NvZGU+PC9kdD4KICAgICAgICAgIDxkZD5BZGQgKHBvc2l0aXZlIG51bWJlcikgb3IgcmVkdWNlIChuZWdhdGl2ZSBudW1iZXIpIHRoZQogICAgICAgICAgaW5kZW50YXRpb24gYnkgdGhlIGdpdmVuIGFtb3VudCBvZiBzcGFjZXMuPC9kZD4KICAgICAgICA8L2RsPjwvZGQ+CgogICAgICA8ZHQgaWQ9InRvZ2dsZU92ZXJ3cml0ZSI+PGNvZGU+PHN0cm9uZz5jbS50b2dnbGVPdmVyd3JpdGU8L3N0cm9uZz4oP3ZhbHVlOiBib29sZWFuKTwvY29kZT48L2R0PgogICAgICA8ZGQ+U3dpdGNoZXMgYmV0d2VlbiBvdmVyd3JpdGUgYW5kIG5vcm1hbCBpbnNlcnQgbW9kZSAod2hlbiBub3QKICAgICAgZ2l2ZW4gYW4gYXJndW1lbnQpLCBvciBzZXRzIHRoZSBvdmVyd3JpdGUgbW9kZSB0byBhIHNwZWNpZmljCiAgICAgIHN0YXRlICh3aGVuIGdpdmVuIGFuIGFyZ3VtZW50KS48L2RkPgoKICAgICAgPGR0IGlkPSJpc1JlYWRPbmx5Ij48Y29kZT48c3Ryb25nPmNtLmlzUmVhZE9ubHk8L3N0cm9uZz4oKSDihpIgYm9vbGVhbjwvY29kZT48L2R0PgogICAgICA8ZGQ+VGVsbHMgeW91IHdoZXRoZXIgdGhlIGVkaXRvcidzIGNvbnRlbnQgY2FuIGJlIGVkaXRlZCBieSB0aGUKICAgICAgdXNlci48L2RkPgoKICAgICAgPGR0IGlkPSJsaW5lU2VwYXJhdG9yIj48Y29kZT48c3Ryb25nPmRvYy5saW5lU2VwYXJhdG9yPC9zdHJvbmc+KCk8L2NvZGU+PC9kdD4KICAgICAgPGRkPlJldHVybnMgdGhlIHByZWZlcnJlZCBsaW5lIHNlcGFyYXRvciBzdHJpbmcgZm9yIHRoaXMKICAgICAgZG9jdW1lbnQsIGFzIHBlciB0aGUgPGEgaHJlZj0iI29wdGlvbl9saW5lU2VwYXJhdG9yIj5vcHRpb248L2E+CiAgICAgIGJ5IHRoZSBzYW1lIG5hbWUuIFdoZW4gdGhhdCBvcHRpb24gaXMgPGNvZGU+bnVsbDwvY29kZT4sIHRoZQogICAgICBzdHJpbmcgPGNvZGU+IlxuIjwvY29kZT4gaXMgcmV0dXJuZWQuPC9kZD4KCiAgICAgIDxkdCBpZD0iZXhlY0NvbW1hbmQiPjxjb2RlPjxzdHJvbmc+Y20uZXhlY0NvbW1hbmQ8L3N0cm9uZz4obmFtZTogc3RyaW5nKTwvY29kZT48L2R0PgogICAgICA8ZGQ+UnVucyB0aGUgPGEgaHJlZj0iI2NvbW1hbmRzIj5jb21tYW5kPC9hPiB3aXRoIHRoZSBnaXZlbiBuYW1lIG9uIHRoZSBlZGl0b3IuPC9kZD4KCiAgICAgIDxkdCBpZD0icG9zRnJvbUluZGV4Ij48Y29kZT48c3Ryb25nPmRvYy5wb3NGcm9tSW5kZXg8L3N0cm9uZz4oaW5kZXg6IGludGVnZXIpIOKGkiB7bGluZSwgY2h9PC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5DYWxjdWxhdGVzIGFuZCByZXR1cm5zIGEgPGNvZGU+e2xpbmUsIGNofTwvY29kZT4gb2JqZWN0IGZvciBhCiAgICAgIHplcm8tYmFzZWQgPGNvZGU+aW5kZXg8L2NvZGU+IHdobydzIHZhbHVlIGlzIHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUKICAgICAgZWRpdG9yJ3MgdGV4dC4gSWYgdGhlIDxjb2RlPmluZGV4PC9jb2RlPiBpcyBvdXQgb2YgcmFuZ2Ugb2YgdGhlIHRleHQgdGhlbgogICAgICB0aGUgcmV0dXJuZWQgb2JqZWN0IGlzIGNsaXBwZWQgdG8gc3RhcnQgb3IgZW5kIG9mIHRoZSB0ZXh0CiAgICAgIHJlc3BlY3RpdmVseS48L2RkPgogICAgICA8ZHQgaWQ9ImluZGV4RnJvbVBvcyI+PGNvZGU+PHN0cm9uZz5kb2MuaW5kZXhGcm9tUG9zPC9zdHJvbmc+KG9iamVjdDoge2xpbmUsIGNofSkg4oaSIGludGVnZXI8L2NvZGU+PC9kdD4KICAgICAgPGRkPlRoZSByZXZlcnNlIG9mIDxhIGhyZWY9IiNwb3NGcm9tSW5kZXgiPjxjb2RlPnBvc0Zyb21JbmRleDwvY29kZT48L2E+LjwvZGQ+CgogICAgICA8ZHQgaWQ9ImZvY3VzIj48Y29kZT48c3Ryb25nPmNtLmZvY3VzPC9zdHJvbmc+KCk8L2NvZGU+PC9kdD4KICAgICAgPGRkPkdpdmUgdGhlIGVkaXRvciBmb2N1cy48L2RkPgoKICAgICAgPGR0IGlkPSJnZXRJbnB1dEZpZWxkIj48Y29kZT48c3Ryb25nPmNtLmdldElucHV0RmllbGQ8L3N0cm9uZz4oKSDihpIgRWxlbWVudDwvY29kZT48L2R0PgogICAgICA8ZGQ+UmV0dXJucyB0aGUgaW5wdXQgZmllbGQgZm9yIHRoZSBlZGl0b3IuIFdpbGwgYmUgYSB0ZXh0YXJlYQogICAgICBvciBhbiBlZGl0YWJsZSBkaXYsIGRlcGVuZGluZyBvbiB0aGUgdmFsdWUgb2YKICAgICAgdGhlIDxhIGhyZWY9IiNvcHRpb25faW5wdXRTdHlsZSI+PGNvZGU+aW5wdXRTdHlsZTwvY29kZT48L2E+CiAgICAgIG9wdGlvbi48L2RkPgogICAgICA8ZHQgaWQ9ImdldFdyYXBwZXJFbGVtZW50Ij48Y29kZT48c3Ryb25nPmNtLmdldFdyYXBwZXJFbGVtZW50PC9zdHJvbmc+KCkg4oaSIEVsZW1lbnQ8L2NvZGU+PC9kdD4KICAgICAgPGRkPlJldHVybnMgdGhlIERPTSBub2RlIHRoYXQgcmVwcmVzZW50cyB0aGUgZWRpdG9yLCBhbmQKICAgICAgY29udHJvbHMgaXRzIHNpemUuIFJlbW92ZSB0aGlzIGZyb20geW91ciB0cmVlIHRvIGRlbGV0ZSBhbgogICAgICBlZGl0b3IgaW5zdGFuY2UuPC9kZD4KICAgICAgPGR0IGlkPSJnZXRTY3JvbGxlckVsZW1lbnQiPjxjb2RlPjxzdHJvbmc+Y20uZ2V0U2Nyb2xsZXJFbGVtZW50PC9zdHJvbmc+KCkg4oaSIEVsZW1lbnQ8L2NvZGU+PC9kdD4KICAgICAgPGRkPlJldHVybnMgdGhlIERPTSBub2RlIHRoYXQgaXMgcmVzcG9uc2libGUgZm9yIHRoZSBzY3JvbGxpbmcKICAgICAgb2YgdGhlIGVkaXRvci48L2RkPgogICAgICA8ZHQgaWQ9ImdldEd1dHRlckVsZW1lbnQiPjxjb2RlPjxzdHJvbmc+Y20uZ2V0R3V0dGVyRWxlbWVudDwvc3Ryb25nPigpIOKGkiBFbGVtZW50PC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5GZXRjaGVzIHRoZSBET00gbm9kZSB0aGF0IGNvbnRhaW5zIHRoZSBlZGl0b3IgZ3V0dGVycy48L2RkPgogICAgPC9kbD4KCiAgICA8aDMgaWQ9ImFwaV9zdGF0aWMiPlN0YXRpYyBwcm9wZXJ0aWVzPC9oMz4KICAgIDxwPlRoZSA8Y29kZT5Db2RlTWlycm9yPC9jb2RlPiBvYmplY3QgaXRzZWxmIHByb3ZpZGVzCiAgICBzZXZlcmFsIHVzZWZ1bCBwcm9wZXJ0aWVzLjwvcD4KCiAgICA8ZGw+CiAgICAgIDxkdCBpZD0idmVyc2lvbiI+PGNvZGU+PHN0cm9uZz5Db2RlTWlycm9yLnZlcnNpb248L3N0cm9uZz46IHN0cmluZzwvY29kZT48L2R0PgogICAgICA8ZGQ+SXQgY29udGFpbnMgYSBzdHJpbmcgdGhhdCBpbmRpY2F0ZXMgdGhlIHZlcnNpb24gb2YgdGhlCiAgICAgIGxpYnJhcnkuIFRoaXMgaXMgYSB0cmlwbGUgb2YKICAgICAgaW50ZWdlcnMgPGNvZGU+Im1ham9yLm1pbm9yLnBhdGNoIjwvY29kZT4sCiAgICAgIHdoZXJlIDxjb2RlPnBhdGNoPC9jb2RlPiBpcyB6ZXJvIGZvciByZWxlYXNlcywgYW5kIHNvbWV0aGluZwogICAgICBlbHNlICh1c3VhbGx5IG9uZSkgZm9yIGRldiBzbmFwc2hvdHMuPC9kZD4KCiAgICAgIDxkdCBpZD0iZnJvbVRleHRBcmVhIj48Y29kZT48c3Ryb25nPkNvZGVNaXJyb3IuZnJvbVRleHRBcmVhPC9zdHJvbmc+KHRleHRBcmVhOiBUZXh0QXJlYUVsZW1lbnQsID9jb25maWc6IG9iamVjdCk8L2NvZGU+PC9kdD4KICAgICAgPGRkPlRoaXMgbWV0aG9kIHByb3ZpZGVzIGFub3RoZXIgd2F5IHRvIGluaXRpYWxpemUgYW4gZWRpdG9yLiBJdAogICAgICB0YWtlcyBhIHRleHRhcmVhIERPTSBub2RlIGFzIGZpcnN0IGFyZ3VtZW50IGFuZCBhbiBvcHRpb25hbAogICAgICBjb25maWd1cmF0aW9uIG9iamVjdCBhcyBzZWNvbmQuIEl0IHdpbGwgcmVwbGFjZSB0aGUgdGV4dGFyZWEKICAgICAgd2l0aCBhIENvZGVNaXJyb3IgaW5zdGFuY2UsIGFuZCB3aXJlIHVwIHRoZSBmb3JtIG9mIHRoYXQKICAgICAgdGV4dGFyZWEgKGlmIGFueSkgdG8gbWFrZSBzdXJlIHRoZSBlZGl0b3IgY29udGVudHMgYXJlIHB1dCBpbnRvCiAgICAgIHRoZSB0ZXh0YXJlYSB3aGVuIHRoZSBmb3JtIGlzIHN1Ym1pdHRlZC4gVGhlIHRleHQgaW4gdGhlCiAgICAgIHRleHRhcmVhIHdpbGwgcHJvdmlkZSB0aGUgY29udGVudCBmb3IgdGhlIGVkaXRvci4gQSBDb2RlTWlycm9yCiAgICAgIGluc3RhbmNlIGNyZWF0ZWQgdGhpcyB3YXkgaGFzIHRocmVlIGFkZGl0aW9uYWwgbWV0aG9kczoKICAgICAgPGRsPgogICAgICAgIDxkdCBpZD0ic2F2ZSI+PGNvZGU+PHN0cm9uZz5jbS5zYXZlPC9zdHJvbmc+KCk8L2NvZGU+PC9kdD4KICAgICAgICA8ZGQ+Q29weSB0aGUgY29udGVudCBvZiB0aGUgZWRpdG9yIGludG8gdGhlIHRleHRhcmVhLjwvZGQ+CgogICAgICAgIDxkdCBpZD0idG9UZXh0QXJlYSI+PGNvZGU+PHN0cm9uZz5jbS50b1RleHRBcmVhPC9zdHJvbmc+KCk8L2NvZGU+PC9kdD4KICAgICAgICA8ZGQ+UmVtb3ZlIHRoZSBlZGl0b3IsIGFuZCByZXN0b3JlIHRoZSBvcmlnaW5hbCB0ZXh0YXJlYSAod2l0aAogICAgICAgIHRoZSBlZGl0b3IncyBjdXJyZW50IGNvbnRlbnQpLiBJZiB5b3UgZHluYW1pY2FsbHkgY3JlYXRlIGFuZAogICAgICAgIGRlc3Ryb3kgZWRpdG9ycyBtYWRlIHdpdGggYGZyb21UZXh0QXJlYWAsIHdpdGhvdXQgZGVzdHJveWluZwogICAgICAgIHRoZSBmb3JtIHRoZXkgYXJlIHBhcnQgb2YsIHlvdSBzaG91bGQgbWFrZSBzdXJlIHRvIGNhbGwKICAgICAgICBgdG9UZXh0QXJlYWAgdG8gcmVtb3ZlIHRoZSBlZGl0b3IsIG9yIGl0cyBgInN1Ym1pdCJgIGhhbmRsZXIKICAgICAgICBvbiB0aGUgZm9ybSB3aWxsIGNhdXNlIGEgbWVtb3J5IGxlYWsuPC9kZD4KCiAgICAgICAgPGR0IGlkPSJnZXRUZXh0QXJlYSI+PGNvZGU+PHN0cm9uZz5jbS5nZXRUZXh0QXJlYTwvc3Ryb25nPigpIOKGkiBUZXh0QXJlYUVsZW1lbnQ8L2NvZGU+PC9kdD4KICAgICAgICA8ZGQ+UmV0dXJucyB0aGUgdGV4dGFyZWEgdGhhdCB0aGUgaW5zdGFuY2Ugd2FzIGJhc2VkIG9uLjwvZGQ+CiAgICAgIDwvZGw+CiAgICAgIDwvZGQ+CgogICAgICA8ZHQgaWQ9ImRlZmF1bHRzIj48Y29kZT48c3Ryb25nPkNvZGVNaXJyb3IuZGVmYXVsdHM8L3N0cm9uZz46IG9iamVjdDwvY29kZT48L2R0PgogICAgICA8ZGQ+QW4gb2JqZWN0IGNvbnRhaW5pbmcgZGVmYXVsdCB2YWx1ZXMgZm9yCiAgICAgIGFsbCA8YSBocmVmPSIjY29uZmlnIj5vcHRpb25zPC9hPi4gWW91IGNhbiBhc3NpZ24gdG8gaXRzCiAgICAgIHByb3BlcnRpZXMgdG8gbW9kaWZ5IGRlZmF1bHRzICh0aG91Z2ggdGhpcyB3b24ndCBhZmZlY3QgZWRpdG9ycwogICAgICB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuIGNyZWF0ZWQpLjwvZGQ+CgogICAgICA8ZHQgaWQ9ImRlZmluZUV4dGVuc2lvbiI+PGNvZGU+PHN0cm9uZz5Db2RlTWlycm9yLmRlZmluZUV4dGVuc2lvbjwvc3Ryb25nPihuYW1lOiBzdHJpbmcsIHZhbHVlOiBhbnkpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5JZiB5b3Ugd2FudCB0byBkZWZpbmUgZXh0cmEgbWV0aG9kcyBpbiB0ZXJtcyBvZiB0aGUKICAgICAgQ29kZU1pcnJvciBBUEksIGl0IGlzIHBvc3NpYmxlIHRvCiAgICAgIHVzZSA8Y29kZT5kZWZpbmVFeHRlbnNpb248L2NvZGU+LiBUaGlzIHdpbGwgY2F1c2UgdGhlIGdpdmVuCiAgICAgIHZhbHVlICh1c3VhbGx5IGEgbWV0aG9kKSB0byBiZSBhZGRlZCB0byBhbGwgQ29kZU1pcnJvciBpbnN0YW5jZXMKICAgICAgY3JlYXRlZCBmcm9tIHRoZW4gb24uPC9kZD4KCiAgICAgIDxkdCBpZD0iZGVmaW5lRG9jRXh0ZW5zaW9uIj48Y29kZT48c3Ryb25nPkNvZGVNaXJyb3IuZGVmaW5lRG9jRXh0ZW5zaW9uPC9zdHJvbmc+KG5hbWU6IHN0cmluZywgdmFsdWU6IGFueSk8L2NvZGU+PC9kdD4KICAgICAgPGRkPkxpa2UgPGEgaHJlZj0iI2RlZmluZUV4dGVuc2lvbiI+PGNvZGU+ZGVmaW5lRXh0ZW5zaW9uPC9jb2RlPjwvYT4sCiAgICAgIGJ1dCB0aGUgbWV0aG9kIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGludGVyZmFjZQogICAgICBmb3IgPGEgaHJlZj0iI0RvYyI+PGNvZGU+RG9jPC9jb2RlPjwvYT4gb2JqZWN0cyBpbnN0ZWFkLjwvZGQ+CgogICAgICA8ZHQgaWQ9ImRlZmluZU9wdGlvbiI+PGNvZGU+PHN0cm9uZz5Db2RlTWlycm9yLmRlZmluZU9wdGlvbjwvc3Ryb25nPihuYW1lOiBzdHJpbmcsCiAgICAgIGRlZmF1bHQ6IGFueSwgdXBkYXRlRnVuYzogZnVuY3Rpb24pPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5TaW1pbGFybHksIDxjb2RlPmRlZmluZU9wdGlvbjwvY29kZT4gY2FuIGJlIHVzZWQgdG8gZGVmaW5lIG5ldyBvcHRpb25zIGZvcgogICAgICBDb2RlTWlycm9yLiBUaGUgPGNvZGU+dXBkYXRlRnVuYzwvY29kZT4gd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUKICAgICAgZWRpdG9yIGluc3RhbmNlIGFuZCB0aGUgbmV3IHZhbHVlIHdoZW4gYW4gZWRpdG9yIGlzIGluaXRpYWxpemVkLAogICAgICBhbmQgd2hlbmV2ZXIgdGhlIG9wdGlvbiBpcyBtb2RpZmllZAogICAgICB0aHJvdWdoIDxhIGhyZWY9IiNzZXRPcHRpb24iPjxjb2RlPnNldE9wdGlvbjwvY29kZT48L2E+LjwvZGQ+CgogICAgICA8ZHQgaWQ9ImRlZmluZUluaXRIb29rIj48Y29kZT48c3Ryb25nPkNvZGVNaXJyb3IuZGVmaW5lSW5pdEhvb2s8L3N0cm9uZz4oZnVuYzogZnVuY3Rpb24pPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5JZiB5b3VyIGV4dGVuc2lvbiBqdXN0IG5lZWRzIHRvIHJ1biBzb21lCiAgICAgIGNvZGUgd2hlbmV2ZXIgYSBDb2RlTWlycm9yIGluc3RhbmNlIGlzIGluaXRpYWxpemVkLAogICAgICB1c2UgPGNvZGU+Q29kZU1pcnJvci5kZWZpbmVJbml0SG9vazwvY29kZT4uIEdpdmUgaXQgYSBmdW5jdGlvbiBhcwogICAgICBpdHMgb25seSBhcmd1bWVudCwgYW5kIGZyb20gdGhlbiBvbiwgdGhhdCBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZAogICAgICAod2l0aCB0aGUgaW5zdGFuY2UgYXMgYXJndW1lbnQpIHdoZW5ldmVyIGEgbmV3IENvZGVNaXJyb3IgaW5zdGFuY2UKICAgICAgaXMgaW5pdGlhbGl6ZWQuPC9kZD4KCiAgICAgIDxkdCBpZD0icmVnaXN0ZXJIZWxwZXIiPjxjb2RlPjxzdHJvbmc+Q29kZU1pcnJvci5yZWdpc3RlckhlbHBlcjwvc3Ryb25nPih0eXBlOsKgc3RyaW5nLCBuYW1lOsKgc3RyaW5nLCB2YWx1ZTrCoGhlbHBlcik8L2NvZGU+PC9kdD4KICAgICAgPGRkPlJlZ2lzdGVycyBhIGhlbHBlciB2YWx1ZSB3aXRoIHRoZSBnaXZlbiA8Y29kZT5uYW1lPC9jb2RlPiBpbgogICAgICB0aGUgZ2l2ZW4gbmFtZXNwYWNlICg8Y29kZT50eXBlPC9jb2RlPikuIFRoaXMgaXMgdXNlZCB0byBkZWZpbmUKICAgICAgZnVuY3Rpb25hbGl0eSB0aGF0IG1heSBiZSBsb29rZWQgdXAgYnkgbW9kZS4gV2lsbCBjcmVhdGUgKGlmIGl0CiAgICAgIGRvZXNuJ3QgYWxyZWFkeSBleGlzdCkgYSBwcm9wZXJ0eSBvbiB0aGUgPGNvZGU+Q29kZU1pcnJvcjwvY29kZT4KICAgICAgb2JqZWN0IGZvciB0aGUgZ2l2ZW4gPGNvZGU+dHlwZTwvY29kZT4sIHBvaW50aW5nIHRvIGFuIG9iamVjdAogICAgICB0aGF0IG1hcHMgbmFtZXMgdG8gdmFsdWVzLiBJLmUuIGFmdGVyCiAgICAgIGRvaW5nIDxjb2RlPkNvZGVNaXJyb3IucmVnaXN0ZXJIZWxwZXIoImhpbnQiLCAiZm9vIiwKICAgICAgbXlGb28pPC9jb2RlPiwgdGhlIHZhbHVlIDxjb2RlPkNvZGVNaXJyb3IuaGludC5mb288L2NvZGU+IHdpbGwKICAgICAgcG9pbnQgdG8gPGNvZGU+bXlGb288L2NvZGU+LjwvZGQ+CgogICAgICA8ZHQgaWQ9InJlZ2lzdGVyR2xvYmFsSGVscGVyIj48Y29kZT48c3Ryb25nPkNvZGVNaXJyb3IucmVnaXN0ZXJHbG9iYWxIZWxwZXI8L3N0cm9uZz4odHlwZTrCoHN0cmluZywgbmFtZTrCoHN0cmluZywgcHJlZGljYXRlOsKgZm4obW9kZSzCoENvZGVNaXJyb3IpLCB2YWx1ZTrCoGhlbHBlcik8L2NvZGU+PC9kdD4KICAgICAgPGRkPkFjdHMKICAgICAgbGlrZSA8YSBocmVmPSIjcmVnaXN0ZXJIZWxwZXIiPjxjb2RlPnJlZ2lzdGVySGVscGVyPC9jb2RlPjwvYT4sCiAgICAgIGJ1dCBhbHNvIHJlZ2lzdGVycyB0aGlzIGhlbHBlciBhcyAnZ2xvYmFsJywgbWVhbmluZyB0aGF0IGl0IHdpbGwKICAgICAgYmUgaW5jbHVkZWQgYnkgPGEgaHJlZj0iI2dldEhlbHBlcnMiPjxjb2RlPmdldEhlbHBlcnM8L2NvZGU+PC9hPgogICAgICB3aGVuZXZlciB0aGUgZ2l2ZW4gPGNvZGU+cHJlZGljYXRlPC9jb2RlPiByZXR1cm5zIHRydWUgd2hlbgogICAgICBjYWxsZWQgd2l0aCB0aGUgbG9jYWwgbW9kZSBhbmQgZWRpdG9yLjwvZGQ+CgogICAgICA8ZHQgaWQ9IlBvcyI+PGNvZGU+PHN0cm9uZz5Db2RlTWlycm9yLlBvczwvc3Ryb25nPihsaW5lOiBpbnRlZ2VyLCA/Y2g6IGludGVnZXIpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5BIGNvbnN0cnVjdG9yIGZvciB0aGUgPGNvZGU+e2xpbmUsIGNofTwvY29kZT4gb2JqZWN0cyB0aGF0CiAgICAgIGFyZSB1c2VkIHRvIHJlcHJlc2VudCBwb3NpdGlvbnMgaW4gZWRpdG9yIGRvY3VtZW50cy48L2RkPgoKICAgICAgPGR0IGlkPSJjaGFuZ2VFbmQiPjxjb2RlPjxzdHJvbmc+Q29kZU1pcnJvci5jaGFuZ2VFbmQ8L3N0cm9uZz4oY2hhbmdlOiBvYmplY3QpIOKGkiB7bGluZSwgY2h9PC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5VdGlsaXR5IGZ1bmN0aW9uIHRoYXQgY29tcHV0ZXMgYW4gZW5kIHBvc2l0aW9uIGZyb20gYSBjaGFuZ2UKICAgICAgKGFuIG9iamVjdCB3aXRoIDxjb2RlPmZyb208L2NvZGU+LCA8Y29kZT50bzwvY29kZT4sCiAgICAgIGFuZCA8Y29kZT50ZXh0PC9jb2RlPiBwcm9wZXJ0aWVzLCBhcyBwYXNzZWQgdG8KICAgICAgdmFyaW91cyA8YSBocmVmPSIjZXZlbnRfY2hhbmdlIj5ldmVudCBoYW5kbGVyczwvYT4pLiBUaGUKICAgICAgcmV0dXJuZWQgcG9zaXRpb24gd2lsbCBiZSB0aGUgZW5kIG9mIHRoZSBjaGFuZ2VkCiAgICAgIHJhbmdlLCA8ZW0+YWZ0ZXI8L2VtPiB0aGUgY2hhbmdlIGlzIGFwcGxpZWQuPC9kZD4KICAgIDwvZGw+Cjwvc2VjdGlvbj4KCjxzZWN0aW9uIGlkPWFkZG9ucz4KICAgIDxoMiBpZD0iYWRkb25zIj5BZGRvbnM8L2gyPgoKICAgIDxwPlRoZSA8Y29kZT5hZGRvbjwvY29kZT4gZGlyZWN0b3J5IGluIHRoZSBkaXN0cmlidXRpb24gY29udGFpbnMgYQogICAgbnVtYmVyIG9mIHJldXNhYmxlIGNvbXBvbmVudHMgdGhhdCBpbXBsZW1lbnQgZXh0cmEgZWRpdG9yCiAgICBmdW5jdGlvbmFsaXR5IChvbiB0b3Agb2YgZXh0ZW5zaW9uIGZ1bmN0aW9ucwogICAgbGlrZSA8YSBocmVmPSIjZGVmaW5lT3B0aW9uIj48Y29kZT5kZWZpbmVPcHRpb248L2NvZGU+PC9hPiwgPGEgaHJlZj0iI2RlZmluZUV4dGVuc2lvbiI+PGNvZGU+ZGVmaW5lRXh0ZW5zaW9uPC9jb2RlPjwvYT4sCiAgICBhbmQgPGEgaHJlZj0iI3JlZ2lzdGVySGVscGVyIj48Y29kZT5yZWdpc3RlckhlbHBlcjwvY29kZT48L2E+KS4gSW4KICAgIGJyaWVmLCB0aGV5IGFyZTo8L3A+CgogICAgPGRsPgogICAgICA8ZHQgaWQ9ImFkZG9uX2RpYWxvZyI+PGEgaHJlZj0iLi4vYWRkb24vZGlhbG9nL2RpYWxvZy5qcyI+PGNvZGU+ZGlhbG9nL2RpYWxvZy5qczwvY29kZT48L2E+PC9kdD4KICAgICAgPGRkPlByb3ZpZGVzIGEgdmVyeSBzaW1wbGUgd2F5IHRvIHF1ZXJ5IHVzZXJzIGZvciB0ZXh0IGlucHV0LgogICAgICBBZGRzIHRoZSA8c3Ryb25nPjxjb2RlPm9wZW5EaWFsb2codGVtcGxhdGUsIGNhbGxiYWNrLCBvcHRpb25zKSDihpIKICAgICAgY2xvc2VGdW5jdGlvbjwvY29kZT48L3N0cm9uZz4gbWV0aG9kIHRvIENvZGVNaXJyb3IgaW5zdGFuY2VzLAogICAgICB3aGljaCBjYW4gYmUgY2FsbGVkIHdpdGggYW4gSFRNTCBmcmFnbWVudCBvciBhIGRldGFjaGVkIERPTQogICAgICBub2RlIHRoYXQgcHJvdmlkZXMgdGhlIHByb21wdCAoc2hvdWxkIGluY2x1ZGUgYW4gPGNvZGU+aW5wdXQ8L2NvZGU+CiAgICAgIG9yIDxjb2RlPmJ1dHRvbjwvY29kZT4gdGFnKSwgYW5kIGEgY2FsbGJhY2sgZnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQKICAgICAgd2hlbiB0aGUgdXNlciBwcmVzc2VzIGVudGVyLiBJdCByZXR1cm5zIGEgZnVuY3Rpb24gPGNvZGU+Y2xvc2VGdW5jdGlvbjwvY29kZT4KICAgICAgd2hpY2gsIGlmIGNhbGxlZCwgd2lsbCBjbG9zZSB0aGUgZGlhbG9nIGltbWVkaWF0ZWx5LgogICAgICA8c3Ryb25nPjxjb2RlPm9wZW5EaWFsb2c8L2NvZGU+PC9zdHJvbmc+IHRha2VzIHRoZSBmb2xsb3dpbmcgb3B0aW9uczoKICAgICAgICA8ZGw+CiAgICAgICAgICA8ZHQ+PGNvZGU+PHN0cm9uZz5jbG9zZU9uRW50ZXI8L3N0cm9uZz46IGJvb2w8L2NvZGU+PC9kdD4KICAgICAgICAgIDxkZD5JZiB0cnVlLCB0aGUgZGlhbG9nIHdpbGwgYmUgY2xvc2VkIHdoZW4gdGhlIHVzZXIgcHJlc3NlcwogICAgICAgICAgZW50ZXIgaW4gdGhlIGlucHV0LiBEZWZhdWx0cyB0byA8Y29kZT50cnVlPC9jb2RlPi48L2RkPgogICAgICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+Y2xvc2VPbkJsdXI8L3N0cm9uZz46IGJvb2w8L2NvZGU+PC9kdD4KICAgICAgICAgIDxkZD5EZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGRpYWxvZyBpcyBjbG9zZWQgd2hlbiBpdCBsb3NlcyBmb2N1cy4gRGVmYXVsdHMgdG8gPGNvZGU+dHJ1ZTwvY29kZT4uPC9kZD4KICAgICAgICAgIDxkdD48Y29kZT48c3Ryb25nPm9uS2V5RG93bjwvc3Ryb25nPjogZm4oZXZlbnQ6IEtleWJvYXJkRXZlbnQsIHZhbHVlOiBzdHJpbmcsIGNsb3NlOiBmbigpKSDihpIgYm9vbDwvY29kZT48L2R0PgogICAgICAgICAgPGRkPkFuIGV2ZW50IGhhbmRsZXIgdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuZXZlciA8Y29kZT5rZXlkb3duPC9jb2RlPiBmaXJlcyBpbiB0aGUKICAgICAgICAgIGRpYWxvZydzIGlucHV0LiBJZiB5b3VyIGNhbGxiYWNrIHJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4sCiAgICAgICAgICB0aGUgZGlhbG9nIHdpbGwgbm90IGRvIGFueSBmdXJ0aGVyIHByb2Nlc3Npbmcgb2YgdGhlIGV2ZW50LjwvZGQ+CiAgICAgICAgICA8ZHQ+PGNvZGU+PHN0cm9uZz5vbktleVVwPC9zdHJvbmc+OiBmbihldmVudDogS2V5Ym9hcmRFdmVudCwgdmFsdWU6IHN0cmluZywgY2xvc2U6IGZuKCkpIOKGkiBib29sPC9jb2RlPjwvZHQ+CiAgICAgICAgICA8ZGQ+U2FtZSBhcyA8Y29kZT5vbktleURvd248L2NvZGU+IGJ1dCBmb3IgdGhlCiAgICAgICAgICA8Y29kZT5rZXl1cDwvY29kZT4gZXZlbnQuPC9kZD4KICAgICAgICAgIDxkdD48Y29kZT48c3Ryb25nPm9uSW5wdXQ8L3N0cm9uZz46IGZuKGV2ZW50OiBJbnB1dEV2ZW50LCB2YWx1ZTogc3RyaW5nLCBjbG9zZTogZm4oKSkg4oaSIGJvb2w8L2NvZGU+PC9kdD4KICAgICAgICAgIDxkZD5TYW1lIGFzIDxjb2RlPm9uS2V5RG93bjwvY29kZT4gYnV0IGZvciB0aGUKICAgICAgICAgIDxjb2RlPmlucHV0PC9jb2RlPiBldmVudC48L2RkPgogICAgICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+b25DbG9zZTwvc3Ryb25nPjogZm4oaW5zdGFuY2UpPC9jb2RlPjo8L2R0PgogICAgICAgICAgPGRkPkEgY2FsbGJhY2sgdGhhdCB3aWxsIGJlIGNhbGxlZCBhZnRlciB0aGUgZGlhbG9nIGhhcyBiZWVuIGNsb3NlZCBhbmQKICAgICAgICAgIHJlbW92ZWQgZnJvbSB0aGUgRE9NLiBObyByZXR1cm4gdmFsdWUuPC9kZD4KICAgICAgICA8L2RsPgoKICAgICAgPHA+QWxzbyBhZGRzIGFuIDxzdHJvbmc+PGNvZGU+b3Blbk5vdGlmaWNhdGlvbih0ZW1wbGF0ZSwgb3B0aW9ucykg4oaSCiAgICAgIGNsb3NlRnVuY3Rpb248L2NvZGU+PC9zdHJvbmc+IGZ1bmN0aW9uIHRoYXQgc2ltcGx5IHNob3dzIGFuIEhUTUwKICAgICAgZnJhZ21lbnQgYXMgYSBub3RpZmljYXRpb24gYXQgdGhlIHRvcCBvZiB0aGUgZWRpdG9yLiBJdCB0YWtlcyBhCiAgICAgIHNpbmdsZSBvcHRpb246IDxjb2RlPmR1cmF0aW9uPC9jb2RlPiwgdGhlIGFtb3VudCBvZiB0aW1lIGFmdGVyCiAgICAgIHdoaWNoIHRoZSBub3RpZmljYXRpb24gd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGNsb3NlZC4gSWYgPGNvZGU+CiAgICAgIGR1cmF0aW9uPC9jb2RlPiBpcyB6ZXJvLCB0aGUgZGlhbG9nIHdpbGwgbm90IGJlIGNsb3NlZCBhdXRvbWF0aWNhbGx5LjwvcD4KCiAgICAgIDxwPkRlcGVuZHMgb24gPGNvZGU+YWRkb24vZGlhbG9nL2RpYWxvZy5jc3M8L2NvZGU+LjwvcD48L2RkPgoKICAgICAgPGR0IGlkPSJhZGRvbl9zZWFyY2hjdXJzb3IiPjxhIGhyZWY9Ii4uL2FkZG9uL3NlYXJjaC9zZWFyY2hjdXJzb3IuanMiPjxjb2RlPnNlYXJjaC9zZWFyY2hjdXJzb3IuanM8L2NvZGU+PC9hPjwvZHQ+CiAgICAgIDxkZD5BZGRzIHRoZSA8Y29kZT5nZXRTZWFyY2hDdXJzb3IocXVlcnksIHN0YXJ0LCBjYXNlRm9sZCkg4oaSCiAgICAgIGN1cnNvcjwvY29kZT4gbWV0aG9kIHRvIENvZGVNaXJyb3IgaW5zdGFuY2VzLCB3aGljaCBjYW4gYmUgdXNlZAogICAgICB0byBpbXBsZW1lbnQgc2VhcmNoL3JlcGxhY2UgZnVuY3Rpb25hbGl0eS4gPGNvZGU+cXVlcnk8L2NvZGU+CiAgICAgIGNhbiBiZSBhIHJlZ3VsYXIgZXhwcmVzc2lvbiBvciBhIHN0cmluZyAob25seSBzdHJpbmdzIHdpbGwgbWF0Y2gKICAgICAgYWNyb3NzIGxpbmVz4oCUaWYgdGhleSBjb250YWluIG5ld2xpbmVzKS4gPGNvZGU+c3RhcnQ8L2NvZGU+CiAgICAgIHByb3ZpZGVzIHRoZSBzdGFydGluZyBwb3NpdGlvbiBvZiB0aGUgc2VhcmNoLiBJdCBjYW4gYmUKICAgICAgYSA8Y29kZT57bGluZSwgY2h9PC9jb2RlPiBvYmplY3QsIG9yIGNhbiBiZSBsZWZ0IG9mZiB0byBkZWZhdWx0CiAgICAgIHRvIHRoZSBzdGFydCBvZiB0aGUgZG9jdW1lbnQuIDxjb2RlPmNhc2VGb2xkPC9jb2RlPiBpcyBvbmx5CiAgICAgIHJlbGV2YW50IHdoZW4gbWF0Y2hpbmcgYSBzdHJpbmcuIEl0IHdpbGwgY2F1c2UgdGhlIHNlYXJjaCB0byBiZQogICAgICBjYXNlLWluc2Vuc2l0aXZlLiBBIHNlYXJjaCBjdXJzb3IgaGFzIHRoZSBmb2xsb3dpbmcgbWV0aG9kczoKICAgICAgICA8ZGw+CiAgICAgICAgICA8ZHQ+PGNvZGU+PHN0cm9uZz5maW5kTmV4dDwvc3Ryb25nPigpIOKGkiBib29sZWFuPC9jb2RlPjwvZHQ+CiAgICAgICAgICA8ZHQ+PGNvZGU+PHN0cm9uZz5maW5kUHJldmlvdXM8L3N0cm9uZz4oKSDihpIgYm9vbGVhbjwvY29kZT48L2R0PgogICAgICAgICAgPGRkPlNlYXJjaCBmb3J3YXJkIG9yIGJhY2t3YXJkIGZyb20gdGhlIGN1cnJlbnQgcG9zaXRpb24uCiAgICAgICAgICBUaGUgcmV0dXJuIHZhbHVlIGluZGljYXRlcyB3aGV0aGVyIGEgbWF0Y2ggd2FzIGZvdW5kLiBJZgogICAgICAgICAgbWF0Y2hpbmcgYSByZWd1bGFyIGV4cHJlc3Npb24sIHRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSB0aGUKICAgICAgICAgIGFycmF5IHJldHVybmVkIGJ5IHRoZSA8Y29kZT5tYXRjaDwvY29kZT4gbWV0aG9kLCBpbiBjYXNlIHlvdQogICAgICAgICAgd2FudCB0byBleHRyYWN0IG1hdGNoZWQgZ3JvdXBzLjwvZGQ+CiAgICAgICAgICA8ZHQ+PGNvZGU+PHN0cm9uZz5mcm9tPC9zdHJvbmc+KCkg4oaSIHtsaW5lLCBjaH08L2NvZGU+PC9kdD4KICAgICAgICAgIDxkdD48Y29kZT48c3Ryb25nPnRvPC9zdHJvbmc+KCkg4oaSIHtsaW5lLCBjaH08L2NvZGU+PC9kdD4KICAgICAgICAgIDxkZD5UaGVzZSBhcmUgb25seSB2YWxpZCB3aGVuIHRoZSBsYXN0IGNhbGwKICAgICAgICAgIHRvIDxjb2RlPmZpbmROZXh0PC9jb2RlPiBvciA8Y29kZT5maW5kUHJldmlvdXM8L2NvZGU+IGRpZAogICAgICAgICAgbm90IHJldHVybiBmYWxzZS4gVGhleSB3aWxsIHJldHVybiA8Y29kZT57bGluZSwgY2h9PC9jb2RlPgogICAgICAgICAgb2JqZWN0cyBwb2ludGluZyBhdCB0aGUgc3RhcnQgYW5kIGVuZCBvZiB0aGUgbWF0Y2guPC9kZD4KICAgICAgICAgIDxkdD48Y29kZT48c3Ryb25nPnJlcGxhY2U8L3N0cm9uZz4odGV4dDogc3RyaW5nLCA/b3JpZ2luOsKgc3RyaW5nKTwvY29kZT48L2R0PgogICAgICAgICAgPGRkPlJlcGxhY2VzIHRoZSBjdXJyZW50bHkgZm91bmQgbWF0Y2ggd2l0aCB0aGUgZ2l2ZW4gdGV4dAogICAgICAgICAgYW5kIGFkanVzdHMgdGhlIGN1cnNvciBwb3NpdGlvbiB0byByZWZsZWN0IHRoZQogICAgICAgICAgcmVwbGFjZW1lbnQuPC9kZD4KICAgICAgICA8L2RsPjwvZGQ+CgogICAgICA8ZHQgaWQ9ImFkZG9uX3NlYXJjaCI+PGEgaHJlZj0iLi4vYWRkb24vc2VhcmNoL3NlYXJjaC5qcyI+PGNvZGU+c2VhcmNoL3NlYXJjaC5qczwvY29kZT48L2E+PC9kdD4KICAgICAgPGRkPkltcGxlbWVudHMgdGhlIHNlYXJjaCBjb21tYW5kcy4gQ29kZU1pcnJvciBoYXMga2V5cyBib3VuZCB0bwogICAgICB0aGVzZSBieSBkZWZhdWx0LCBidXQgd2lsbCBub3QgZG8gYW55dGhpbmcgd2l0aCB0aGVtIHVubGVzcyBhbgogICAgICBpbXBsZW1lbnRhdGlvbiBpcyBwcm92aWRlZC4gRGVwZW5kcwogICAgICBvbiA8Y29kZT5zZWFyY2hjdXJzb3IuanM8L2NvZGU+LCBhbmQgd2lsbCBtYWtlIHVzZQogICAgICBvZiA8YSBocmVmPSIjYWRkb25fZGlhbG9nIj48Y29kZT5vcGVuRGlhbG9nPC9jb2RlPjwvYT4gd2hlbgogICAgICBhdmFpbGFibGUgdG8gbWFrZSBwcm9tcHRpbmcgZm9yIHNlYXJjaCBxdWVyaWVzIGxlc3MgdWdseS48L2RkPgoKICAgICAgPGR0IGlkPSJhZGRvbl9qdW1wLXRvLWxpbmUiPjxhIGhyZWY9Ii4uL2FkZG9uL3NlYXJjaC9qdW1wLXRvLWxpbmUuanMiPjxjb2RlPnNlYXJjaC9qdW1wLXRvLWxpbmUuanM8L2NvZGU+PC9hPjwvZHQ+CiAgICAgIDxkZD5JbXBsZW1lbnRzIGEgPGNvZGU+anVtcFRvTGluZTwvY29kZT4gY29tbWFuZCBhbmQgYmluZGluZyA8Y29kZT5BbHQtRzwvY29kZT4gdG8gaXQuCiAgICAgIEFjY2VwdHMgPGNvZGU+bGluZW51bWJlcjwvY29kZT4sIDxjb2RlPisvLWxpbmVudW1iZXI8L2NvZGU+LCA8Y29kZT5saW5lOmNoYXI8L2NvZGU+LAogICAgICA8Y29kZT5zY3JvbGwlPC9jb2RlPiBhbmQgPGNvZGU+OmxpbmVudW1iZXI8L2NvZGU+IGZvcm1hdHMuCiAgICAgIFRoaXMgd2lsbCBtYWtlIHVzZSBvZiA8YSBocmVmPSIjYWRkb25fZGlhbG9nIj48Y29kZT5vcGVuRGlhbG9nPC9jb2RlPjwvYT4KICAgICAgd2hlbiBhdmFpbGFibGUgdG8gbWFrZSBwcm9tcHRpbmcgZm9yIGxpbmUgbnVtYmVyIG5lYXRlci48L2RkPgoKICAgICAgPGR0IGlkPSJhZGRvbl9tYXRjaGVzb25zY3JvbGxiYXIiPjxhIGhyZWY9Ii4uL2FkZG9uL3NlYXJjaC9tYXRjaGVzb25zY3JvbGxiYXIuanMiPjxjb2RlPnNlYXJjaC9tYXRjaGVzb25zY3JvbGxiYXIuanM8L2NvZGU+PC9hPjwvZHQ+CiAgICAgIDxkZD5BZGRzIGEgPGNvZGU+c2hvd01hdGNoZXNPblNjcm9sbGJhcjwvY29kZT4gbWV0aG9kIHRvIGVkaXRvcgogICAgICBpbnN0YW5jZXMsIHdoaWNoIHNob3VsZCBiZSBnaXZlbiBhIHF1ZXJ5IChzdHJpbmcgb3IgcmVndWxhcgogICAgICBleHByZXNzaW9uKSwgb3B0aW9uYWxseSBhIGNhc2UtZm9sZCBmbGFnIChvbmx5IGFwcGxpY2FibGUgZm9yCiAgICAgIHN0cmluZ3MpLCBhbmQgb3B0aW9uYWxseSBhIGNsYXNzIG5hbWUgKGRlZmF1bHRzCiAgICAgIHRvIDxjb2RlPkNvZGVNaXJyb3Itc2VhcmNoLW1hdGNoPC9jb2RlPikgYXMgYXJndW1lbnRzLiBXaGVuCiAgICAgIGNhbGxlZCwgbWF0Y2hlcyBvZiB0aGUgZ2l2ZW4gcXVlcnkgd2lsbCBiZSBkaXNwbGF5ZWQgb24gdGhlCiAgICAgIGVkaXRvcidzIHZlcnRpY2FsIHNjcm9sbGJhci4gVGhlIG1ldGhvZCByZXR1cm5zIGFuIG9iamVjdCB3aXRoCiAgICAgIGEgPGNvZGU+Y2xlYXI8L2NvZGU+IG1ldGhvZCB0aGF0IGNhbiBiZSBjYWxsZWQgdG8gcmVtb3ZlIHRoZQogICAgICBtYXRjaGVzLiBEZXBlbmRzIG9uCiAgICAgIHRoZSA8YSBocmVmPSIjYWRkb25fYW5ub3RhdGVzY3JvbGxiYXIiPjxjb2RlPmFubm90YXRlc2Nyb2xsYmFyPC9jb2RlPjwvYT4KICAgICAgYWRkb24sIGFuZAogICAgICB0aGUgPGEgaHJlZj0iLi4vYWRkb24vc2VhcmNoL21hdGNoZXNvbnNjcm9sbGJhci5jc3MiPjxjb2RlPm1hdGNoZXNvbnNjcm9sbGJhci5jc3M8L2NvZGU+PC9hPgogICAgICBmaWxlIHByb3ZpZGVzIGEgZGVmYXVsdCAodHJhbnNwYXJlbnQgeWVsbG93aXNoKSBkZWZpbml0aW9uIG9mCiAgICAgIHRoZSBDU1MgY2xhc3MgYXBwbGllZCB0byB0aGUgbWF0Y2hlcy4gTm90ZSB0aGF0IHRoZSBtYXRjaGVzIGFyZQogICAgICBvbmx5IHBlcmZlY3RseSBhbGlnbmVkIGlmIHlvdXIgc2Nyb2xsYmFyIGRvZXMgbm90IGhhdmUgYnV0dG9ucwogICAgICBhdCB0aGUgdG9wIGFuZCBib3R0b20uIFlvdSBjYW4gdXNlCiAgICAgIHRoZSA8YSBocmVmPSIjYWRkb25fc2ltcGxlc2Nyb2xsYmFycyI+PGNvZGU+c2ltcGxlc2Nyb2xsYmFyPC9jb2RlPjwvYT4KICAgICAgYWRkb24gdG8gbWFrZSBzdXJlIG9mIHRoaXMuIElmIHRoaXMgYWRkb24gaXMgbG9hZGVkLAogICAgICB0aGUgPGEgaHJlZj0iI2FkZG9uX3NlYXJjaCI+PGNvZGU+c2VhcmNoPC9jb2RlPjwvYT4gYWRkb24gd2lsbAogICAgICBhdXRvbWF0aWNhbGx5IHVzZSBpdC48L2RkPgoKICAgICAgPGR0IGlkPSJhZGRvbl9tYXRjaGJyYWNrZXRzIj48YSBocmVmPSIuLi9hZGRvbi9lZGl0L21hdGNoYnJhY2tldHMuanMiPjxjb2RlPmVkaXQvbWF0Y2hicmFja2V0cy5qczwvY29kZT48L2E+PC9kdD4KICAgICAgPGRkPkRlZmluZXMgYW4gb3B0aW9uIDxjb2RlPm1hdGNoQnJhY2tldHM8L2NvZGU+IHdoaWNoLCB3aGVuIHNldAogICAgICB0byB0cnVlLCBjYXVzZXMgbWF0Y2hpbmcgYnJhY2tldHMgdG8gYmUgaGlnaGxpZ2h0ZWQgd2hlbmV2ZXIgdGhlCiAgICAgIGN1cnNvciBpcyBuZXh0IHRvIHRoZW0uIEl0IGFsc28gYWRkcyBhCiAgICAgIG1ldGhvZCA8Y29kZT5tYXRjaEJyYWNrZXRzPC9jb2RlPiB0aGF0IGZvcmNlcyB0aGlzIHRvIGhhcHBlbgogICAgICBvbmNlLCBhbmQgYSBtZXRob2QgPGNvZGU+ZmluZE1hdGNoaW5nQnJhY2tldDwvY29kZT4gdGhhdCBjYW4gYmUKICAgICAgdXNlZCB0byBydW4gdGhlIGJyYWNrZXQtZmluZGluZyBhbGdvcml0aG0gdGhhdCB0aGlzIHVzZXMKICAgICAgaW50ZXJuYWxseS48L2RkPgoKICAgICAgPGR0IGlkPSJhZGRvbl9jbG9zZWJyYWNrZXRzIj48YSBocmVmPSIuLi9hZGRvbi9lZGl0L2Nsb3NlYnJhY2tldHMuanMiPjxjb2RlPmVkaXQvY2xvc2VicmFja2V0cy5qczwvY29kZT48L2E+PC9kdD4KICAgICAgPGRkPkRlZmluZXMgYW4gb3B0aW9uIDxjb2RlPmF1dG9DbG9zZUJyYWNrZXRzPC9jb2RlPiB0aGF0IHdpbGwKICAgICAgYXV0by1jbG9zZSBicmFja2V0cyBhbmQgcXVvdGVzIHdoZW4gdHlwZWQuIEJ5IGRlZmF1bHQsIGl0J2xsCiAgICAgIGF1dG8tY2xvc2UgPGNvZGU+KClbXXt9JyciIjwvY29kZT4sIGJ1dCB5b3UgY2FuIHBhc3MgaXQgYSBzdHJpbmcKICAgICAgc2ltaWxhciB0byB0aGF0IChjb250YWluaW5nIHBhaXJzIG9mIG1hdGNoaW5nIGNoYXJhY3RlcnMpLCBvciBhbgogICAgICBvYmplY3Qgd2l0aCA8Y29kZT5wYWlyczwvY29kZT4gYW5kCiAgICAgIG9wdGlvbmFsbHkgPGNvZGU+ZXhwbG9kZTwvY29kZT4gcHJvcGVydGllcyB0byBjdXN0b21pemUKICAgICAgaXQuIDxjb2RlPmV4cGxvZGU8L2NvZGU+IHNob3VsZCBiZSBhIHNpbWlsYXIgc3RyaW5nIHRoYXQgZ2l2ZXMKICAgICAgdGhlIHBhaXJzIG9mIGNoYXJhY3RlcnMgdGhhdCwgd2hlbiBlbnRlciBpcyBwcmVzc2VkIGJldHdlZW4KICAgICAgdGhlbSwgc2hvdWxkIGhhdmUgdGhlIHNlY29uZCBjaGFyYWN0ZXIgYWxzbyBtb3ZlZCB0byBpdHMgb3duCiAgICAgIGxpbmUuIDxhIGhyZWY9Ii4uL2RlbW8vY2xvc2VicmFja2V0cy5odG1sIj5EZW1vIGhlcmU8L2E+LjwvZGQ+CgogICAgICA8ZHQgaWQ9ImFkZG9uX21hdGNodGFncyI+PGEgaHJlZj0iLi4vYWRkb24vZWRpdC9tYXRjaHRhZ3MuanMiPjxjb2RlPmVkaXQvbWF0Y2h0YWdzLmpzPC9jb2RlPjwvYT48L2R0PgogICAgICA8ZGQ+RGVmaW5lcyBhbiBvcHRpb24gPGNvZGU+bWF0Y2hUYWdzPC9jb2RlPiB0aGF0LCB3aGVuIGVuYWJsZWQsCiAgICAgIHdpbGwgY2F1c2UgdGhlIHRhZ3MgYXJvdW5kIHRoZSBjdXJzb3IgdG8gYmUgaGlnaGxpZ2h0ZWQgKHVzaW5nCiAgICAgIHRoZSA8Y29kZT5Db2RlTWlycm9yLW1hdGNoaW5ndGFnPC9jb2RlPiBjbGFzcykuIEFsc28KICAgICAgZGVmaW5lcwogICAgICBhIDxhIGhyZWY9IiNjb21tYW5kcyI+Y29tbWFuZDwvYT4gPGNvZGU+dG9NYXRjaGluZ1RhZzwvY29kZT4sCiAgICAgIHdoaWNoIHlvdSBjYW4gYmluZCBhIGtleSB0byBpbiBvcmRlciB0byBqdW1wIHRvIHRoZSB0YWcgbWF0Y2hpbmcKICAgICAgdGhlIG9uZSB1bmRlciB0aGUgY3Vyc29yLiBEZXBlbmRzIG9uCiAgICAgIHRoZSA8Y29kZT5hZGRvbi9mb2xkL3htbC1mb2xkLmpzPC9jb2RlPgogICAgICBhZGRvbi4gPGEgaHJlZj0iLi4vZGVtby9tYXRjaHRhZ3MuaHRtbCI+RGVtbyBoZXJlLjwvYT48L2RkPgoKICAgICAgPGR0IGlkPSJhZGRvbl90cmFpbGluZ3NwYWNlIj48YSBocmVmPSIuLi9hZGRvbi9lZGl0L3RyYWlsaW5nc3BhY2UuanMiPjxjb2RlPmVkaXQvdHJhaWxpbmdzcGFjZS5qczwvY29kZT48L2E+PC9kdD4KICAgICAgPGRkPkFkZHMgYW4gb3B0aW9uIDxjb2RlPnNob3dUcmFpbGluZ1NwYWNlPC9jb2RlPiB3aGljaCwgd2hlbgogICAgICBlbmFibGVkLCBhZGRzIHRoZSBDU1MgY2xhc3MgPGNvZGU+Y20tdHJhaWxpbmdzcGFjZTwvY29kZT4gdG8KICAgICAgc3RyZXRjaGVzIG9mIHdoaXRlc3BhY2UgYXQgdGhlIGVuZCBvZiBsaW5lcy4KICAgICAgVGhlIDxhIGhyZWY9Ii4uL2RlbW8vdHJhaWxpbmdzcGFjZS5odG1sIj5kZW1vPC9hPiBoYXMgYSBuaWNlCiAgICAgIHNxdWlnZ2x5IHVuZGVybGluZSBzdHlsZSBmb3IgdGhpcyBjbGFzcy48L2RkPgoKICAgICAgPGR0IGlkPSJhZGRvbl9jbG9zZXRhZyI+PGEgaHJlZj0iLi4vYWRkb24vZWRpdC9jbG9zZXRhZy5qcyI+PGNvZGU+ZWRpdC9jbG9zZXRhZy5qczwvY29kZT48L2E+PC9kdD4KICAgICAgPGRkPkRlZmluZXMgYW4gPGNvZGU+YXV0b0Nsb3NlVGFnczwvY29kZT4gb3B0aW9uIHRoYXQgd2lsbAogICAgICBhdXRvLWNsb3NlIFhNTCB0YWdzIHdoZW4gJzxjb2RlPiZndDs8L2NvZGU+JyBvciAnPGNvZGU+LzwvY29kZT4nCiAgICAgIGlzIHR5cGVkLCBhbmQKICAgICAgYSA8Y29kZT5jbG9zZVRhZzwvY29kZT4gPGEgaHJlZj0iI2NvbW1hbmRzIj5jb21tYW5kPC9hPiB0aGF0CiAgICAgIGNsb3NlcyB0aGUgbmVhcmVzdCBvcGVuIHRhZy4gRGVwZW5kcyBvbgogICAgICB0aGUgPGNvZGU+Zm9sZC94bWwtZm9sZC5qczwvY29kZT4gYWRkb24uIFNlZQogICAgICB0aGUgPGEgaHJlZj0iLi4vZGVtby9jbG9zZXRhZy5odG1sIj5kZW1vPC9hPi48L2RkPgoKICAgICAgPGR0IGlkPSJhZGRvbl9jb250aW51ZWxpc3QiPjxhIGhyZWY9Ii4uL2FkZG9uL2VkaXQvY29udGludWVsaXN0LmpzIj48Y29kZT5lZGl0L2NvbnRpbnVlbGlzdC5qczwvY29kZT48L2E+PC9kdD4KICAgICAgPGRkPk1hcmtkb3duIHNwZWNpZmljLiBEZWZpbmVzCiAgICAgIGEgPGNvZGU+Im5ld2xpbmVBbmRJbmRlbnRDb250aW51ZU1hcmtkb3duTGlzdCI8L2NvZGU+IDxhIGhyZWY9IiNjb21tYW5kcyI+Y29tbWFuZDwvYT4KICAgICAgdGhhdCBjYW4gYmUgYm91bmQgdG8gPGNvZGU+ZW50ZXI8L2NvZGU+IHRvIGF1dG9tYXRpY2FsbHkKICAgICAgaW5zZXJ0IHRoZSBsZWFkaW5nIGNoYXJhY3RlcnMgZm9yIGNvbnRpbnVpbmcgYSBsaXN0LiBTZWUKICAgICAgdGhlIDxhIGhyZWY9Ii4uL21vZGUvbWFya2Rvd24vaW5kZXguaHRtbCI+TWFya2Rvd24gbW9kZQogICAgICBkZW1vPC9hPi48L2RkPgoKICAgICAgPGR0IGlkPSJhZGRvbl9jb21tZW50Ij48YSBocmVmPSIuLi9hZGRvbi9jb21tZW50L2NvbW1lbnQuanMiPjxjb2RlPmNvbW1lbnQvY29tbWVudC5qczwvY29kZT48L2E+PC9kdD4KICAgICAgPGRkPkFkZG9uIGZvciBjb21tZW50aW5nIGFuZCB1bmNvbW1lbnRpbmcgY29kZS4gQWRkcyBmb3VyCiAgICAgIG1ldGhvZHMgdG8gQ29kZU1pcnJvciBpbnN0YW5jZXM6CiAgICAgIDxkbD4KICAgICAgICA8ZHQgaWQ9InRvZ2dsZUNvbW1lbnQiPjxjb2RlPjxzdHJvbmc+dG9nZ2xlQ29tbWVudDwvc3Ryb25nPihmcm9tOiB7bGluZSwgY2h9LCB0bzoge2xpbmUsIGNofSwgP29wdGlvbnM6IG9iamVjdCk8L2NvZGU+PC9kdD4KICAgICAgICA8ZGQ+VHJpZXMgdG8gdW5jb21tZW50IHRoZSBjdXJyZW50IHNlbGVjdGlvbiwgYW5kIGlmIHRoYXQKICAgICAgICBmYWlscywgbGluZS1jb21tZW50cyBpdC48L2RkPgogICAgICAgIDxkdCBpZD0ibGluZUNvbW1lbnQiPjxjb2RlPjxzdHJvbmc+bGluZUNvbW1lbnQ8L3N0cm9uZz4oZnJvbToge2xpbmUsIGNofSwgdG86IHtsaW5lLCBjaH0sID9vcHRpb25zOiBvYmplY3QpPC9jb2RlPjwvZHQ+CiAgICAgICAgPGRkPlNldCB0aGUgbGluZXMgaW4gdGhlIGdpdmVuIHJhbmdlIHRvIGJlIGxpbmUgY29tbWVudHMuIFdpbGwKICAgICAgICBmYWxsIGJhY2sgdG8gPGNvZGU+YmxvY2tDb21tZW50PC9jb2RlPiB3aGVuIG5vIGxpbmUgY29tbWVudAogICAgICAgIHN0eWxlIGlzIGRlZmluZWQgZm9yIHRoZSBtb2RlLjwvZGQ+CiAgICAgICAgPGR0IGlkPSJibG9ja0NvbW1lbnQiPjxjb2RlPjxzdHJvbmc+YmxvY2tDb21tZW50PC9zdHJvbmc+KGZyb206IHtsaW5lLCBjaH0sIHRvOiB7bGluZSwgY2h9LCA/b3B0aW9uczogb2JqZWN0KTwvY29kZT48L2R0PgogICAgICAgIDxkZD5XcmFwIHRoZSBjb2RlIGluIHRoZSBnaXZlbiByYW5nZSBpbiBhIGJsb2NrIGNvbW1lbnQuIFdpbGwKICAgICAgICBmYWxsIGJhY2sgdG8gPGNvZGU+bGluZUNvbW1lbnQ8L2NvZGU+IHdoZW4gbm8gYmxvY2sgY29tbWVudAogICAgICAgIHN0eWxlIGlzIGRlZmluZWQgZm9yIHRoZSBtb2RlLjwvZGQ+CiAgICAgICAgPGR0IGlkPSJ1bmNvbW1lbnQiPjxjb2RlPjxzdHJvbmc+dW5jb21tZW50PC9zdHJvbmc+KGZyb206IHtsaW5lLCBjaH0sIHRvOiB7bGluZSwgY2h9LCA/b3B0aW9uczogb2JqZWN0KSDihpIgYm9vbGVhbjwvY29kZT48L2R0PgogICAgICAgIDxkZD5UcnkgdG8gdW5jb21tZW50IHRoZSBnaXZlbiByYW5nZS4KICAgICAgICAgIFJldHVybnMgPGNvZGU+dHJ1ZTwvY29kZT4gaWYgYSBjb21tZW50IHJhbmdlIHdhcyBmb3VuZCBhbmQKICAgICAgICAgIHJlbW92ZWQsIDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuPC9kZD4KICAgICAgPC9kbD4KICAgICAgVGhlIDxjb2RlPm9wdGlvbnM8L2NvZGU+IG9iamVjdCBhY2NlcHRlZCBieSB0aGVzZSBtZXRob2RzIG1heQogICAgICBoYXZlIHRoZSBmb2xsb3dpbmcgcHJvcGVydGllczoKICAgICAgPGRsPgogICAgICAgIDxkdD48Y29kZT5ibG9ja0NvbW1lbnRTdGFydCwgYmxvY2tDb21tZW50RW5kLCBibG9ja0NvbW1lbnRMZWFkLCBsaW5lQ29tbWVudDogc3RyaW5nPC9jb2RlPjwvZHQ+CiAgICAgICAgPGRkPk92ZXJyaWRlIHRoZSA8YSBocmVmPSIjbW9kZV9jb21tZW50Ij5jb21tZW50IHN0cmluZwogICAgICAgIHByb3BlcnRpZXM8L2E+IG9mIHRoZSBtb2RlIHdpdGggY3VzdG9tIGNvbW1lbnQgc3RyaW5ncy48L2RkPgogICAgICAgIDxkdD48Y29kZT48c3Ryb25nPnBhZGRpbmc8L3N0cm9uZz46IHN0cmluZzwvY29kZT48L2R0PgogICAgICAgIDxkZD5BIHN0cmluZyB0aGF0IHdpbGwgYmUgaW5zZXJ0ZWQgYWZ0ZXIgb3BlbmluZyBhbmQgbGVhZGluZwogICAgICAgIG1hcmtlcnMsIGFuZCBiZWZvcmUgY2xvc2luZyBjb21tZW50IG1hcmtlcnMuIERlZmF1bHRzIHRvIGEKICAgICAgICBzaW5nbGUgc3BhY2UuPC9kZD4KICAgICAgICA8ZHQ+PGNvZGU+PHN0cm9uZz5jb21tZW50QmxhbmtMaW5lczwvc3Ryb25nPjogYm9vbGVhbjwvY29kZT48L2R0PgogICAgICAgIDxkZD5XaGV0aGVyLCB3aGVuIGFkZGluZyBsaW5lIGNvbW1lbnRzLCB0byBhbHNvIGNvbW1lbnQgbGluZXMKICAgICAgICB0aGF0IGNvbnRhaW4gb25seSB3aGl0ZXNwYWNlLjwvZGQ+CiAgICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+aW5kZW50PC9zdHJvbmc+OiBib29sZWFuPC9jb2RlPjwvZHQ+CiAgICAgICAgPGRkPldoZW4gYWRkaW5nIGxpbmUgY29tbWVudHMgYW5kIHRoaXMgaXMgdHVybmVkIG9uLCBpdCB3aWxsCiAgICAgICAgYWxpZ24gdGhlIGNvbW1lbnQgYmxvY2sgdG8gdGhlIGN1cnJlbnQgaW5kZW50YXRpb24gb2YgdGhlCiAgICAgICAgZmlyc3QgbGluZSBvZiB0aGUgYmxvY2suPC9kZD4KICAgICAgICA8ZHQ+PGNvZGU+PHN0cm9uZz5mdWxsTGluZXM8L3N0cm9uZz46IGJvb2xlYW48L2NvZGU+PC9kdD4KICAgICAgICA8ZGQ+V2hlbiBibG9jayBjb21tZW50aW5nLCB0aGlzIGNvbnRyb2xzIHdoZXRoZXIgdGhlIHdob2xlCiAgICAgICAgbGluZXMgYXJlIGluZGVudGVkLCBvciBvbmx5IHRoZSBwcmVjaXNlIHJhbmdlIHRoYXQgaXMgZ2l2ZW4uCiAgICAgICAgRGVmYXVsdHMgdG8gPGNvZGU+dHJ1ZTwvY29kZT4uPC9kZD4KICAgICAgPC9kbD4KICAgICAgVGhlIGFkZG9uIGFsc28gZGVmaW5lcwogICAgICBhIDxjb2RlPnRvZ2dsZUNvbW1lbnQ8L2NvZGU+IDxhIGhyZWY9IiNjb21tYW5kcyI+Y29tbWFuZDwvYT4sCiAgICAgIHdoaWNoIGlzIGEgc2hvcnRoYW5kIGNvbW1hbmQgZm9yIGNhbGxpbmcKICAgICAgPGNvZGU+dG9nZ2xlQ29tbWVudDwvY29kZT4gd2l0aCBubyBvcHRpb25zLjwvZGQ+CgogICAgICA8ZHQgaWQ9ImFkZG9uX2ZvbGRjb2RlIj48YSBocmVmPSIuLi9hZGRvbi9mb2xkL2ZvbGRjb2RlLmpzIj48Y29kZT5mb2xkL2ZvbGRjb2RlLmpzPC9jb2RlPjwvYT48L2R0PgogICAgICA8ZGQ+SGVscHMgd2l0aCBjb2RlIGZvbGRpbmcuIEFkZHMgYSA8Y29kZT5mb2xkQ29kZTwvY29kZT4gbWV0aG9kCiAgICAgIHRvIGVkaXRvciBpbnN0YW5jZXMsIHdoaWNoIHdpbGwgdHJ5IHRvIGRvIGEgY29kZSBmb2xkIHN0YXJ0aW5nCiAgICAgIGF0IHRoZSBnaXZlbiBsaW5lLCBvciB1bmZvbGQgdGhlIGZvbGQgdGhhdCBpcyBhbHJlYWR5IHByZXNlbnQuCiAgICAgIFRoZSBtZXRob2QgdGFrZXMgYXMgZmlyc3QgYXJndW1lbnQgdGhlIHBvc2l0aW9uIHRoYXQgc2hvdWxkIGJlCiAgICAgIGZvbGRlZCAobWF5IGJlIGEgbGluZSBudW1iZXIgb3IKICAgICAgYSA8YSBocmVmPSIjUG9zIj48Y29kZT5Qb3M8L2NvZGU+PC9hPiksIGFuZCBhcyBzZWNvbmQgb3B0aW9uYWwKICAgICAgYXJndW1lbnQgZWl0aGVyIGEgcmFuZ2UtZmluZGVyIGZ1bmN0aW9uLCBvciBhbiBvcHRpb25zIG9iamVjdCwKICAgICAgc3VwcG9ydGluZyB0aGUgZm9sbG93aW5nIHByb3BlcnRpZXM6CiAgICAgIDxkbD4KICAgICAgICA8ZHQ+PGNvZGU+PHN0cm9uZz5yYW5nZUZpbmRlcjwvc3Ryb25nPjogZm4oQ29kZU1pcnJvciwgUG9zKTwvY29kZT48L2R0PgogICAgICAgIDxkZCBpZD0iaGVscGVyX2ZvbGRfYXV0byI+VGhlIGZ1bmN0aW9uIHRoYXQgaXMgdXNlZCB0byBmaW5kCiAgICAgICAgZm9sZGFibGUgcmFuZ2VzLiBJZiB0aGlzIGlzIG5vdCBkaXJlY3RseSBwYXNzZWQsIGl0IHdpbGwKICAgICAgICBkZWZhdWx0IHRvIDxjb2RlPkNvZGVNaXJyb3IuZm9sZC5hdXRvPC9jb2RlPiwgd2hpY2gKICAgICAgICB1c2VzIDxhIGhyZWY9IiNnZXRIZWxwZXJzIj48Y29kZT5nZXRIZWxwZXJzPC9jb2RlPjwvYT4gd2l0aAogICAgICAgIGEgPGNvZGU+ImZvbGQiPC9jb2RlPiB0eXBlIHRvIGZpbmQgZm9sZGluZyBmdW5jdGlvbnMKICAgICAgICBhcHByb3ByaWF0ZSBmb3IgdGhlIGxvY2FsIG1vZGUuIFRoZXJlIGFyZSBmaWxlcyBpbgogICAgICAgIHRoZSA8YSBocmVmPSIuLi9hZGRvbi9mb2xkLyI+PGNvZGU+YWRkb24vZm9sZC88L2NvZGU+PC9hPgogICAgICAgIGRpcmVjdG9yeSBwcm92aWRpbmcgPGNvZGU+Q29kZU1pcnJvci5mb2xkLmJyYWNlPC9jb2RlPiwgd2hpY2gKICAgICAgICBmaW5kcyBibG9ja3MgaW4gYnJhY2UgbGFuZ3VhZ2VzIChKYXZhU2NyaXB0LCBDLCBKYXZhLAogICAgICAgIGV0YyksIDxjb2RlPkNvZGVNaXJyb3IuZm9sZC5pbmRlbnQ8L2NvZGU+LCBmb3IgbGFuZ3VhZ2VzIHdoZXJlCiAgICAgICAgaW5kZW50YXRpb24gZGV0ZXJtaW5lcyBibG9jayBzdHJ1Y3R1cmUgKFB5dGhvbiwgSGFza2VsbCksCiAgICAgICAgYW5kIDxjb2RlPkNvZGVNaXJyb3IuZm9sZC54bWw8L2NvZGU+LCBmb3IgWE1MLXN0eWxlIGxhbmd1YWdlcywKICAgICAgICBhbmQgPGNvZGU+Q29kZU1pcnJvci5mb2xkLmNvbW1lbnQ8L2NvZGU+LCBmb3IgZm9sZGluZyBjb21tZW50CiAgICAgICAgYmxvY2tzLjwvZGQ+CiAgICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+d2lkZ2V0PC9zdHJvbmc+OiBzdHJpbmd8RWxlbWVudDwvY29kZT48L2R0PgogICAgICAgIDxkZD5UaGUgd2lkZ2V0IHRvIHNob3cgZm9yIGZvbGRlZCByYW5nZXMuIENhbiBiZSBlaXRoZXIgYQogICAgICAgIHN0cmluZywgaW4gd2hpY2ggY2FzZSBpdCdsbCBiZWNvbWUgYSBzcGFuIHdpdGgKICAgICAgICBjbGFzcyA8Y29kZT5Db2RlTWlycm9yLWZvbGRtYXJrZXI8L2NvZGU+LCBvciBhIERPTSBub2RlLjwvZGQ+CiAgICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+c2NhblVwPC9zdHJvbmc+OiBib29sZWFuPC9jb2RlPjwvZHQ+CiAgICAgICAgPGRkPldoZW4gdHJ1ZSAoZGVmYXVsdCBpcyBmYWxzZSksIHRoZSBhZGRvbiB3aWxsIHRyeSB0byBmaW5kCiAgICAgICAgZm9sZGFibGUgcmFuZ2VzIG9uIHRoZSBsaW5lcyBhYm92ZSB0aGUgY3VycmVudCBvbmUgaWYgdGhlcmUKICAgICAgICBpc24ndCBhbiBlbGlnaWJsZSBvbmUgb24gdGhlIGdpdmVuIGxpbmUuPC9kZD4KICAgICAgICA8ZHQ+PGNvZGU+PHN0cm9uZz5taW5Gb2xkU2l6ZTwvc3Ryb25nPjogaW50ZWdlcjwvY29kZT48L2R0PgogICAgICAgIDxkZD5UaGUgbWluaW11bSBhbW91bnQgb2YgbGluZXMgdGhhdCBhIGZvbGQgc2hvdWxkIHNwYW4gdG8gYmUKICAgICAgICBhY2NlcHRlZC4gRGVmYXVsdHMgdG8gMCwgd2hpY2ggYWxzbyBhbGxvd3Mgc2luZ2xlLWxpbmUKICAgICAgICBmb2xkcy48L2RkPgogICAgICA8L2RsPgogICAgICBTZWUgPGEgaHJlZj0iLi4vZGVtby9mb2xkaW5nLmh0bWwiPnRoZSBkZW1vPC9hPiBmb3IgYW4KICAgICAgZXhhbXBsZS48L2RkPgoKICAgICAgPGR0IGlkPSJhZGRvbl9mb2xkZ3V0dGVyIj48YSBocmVmPSIuLi9hZGRvbi9mb2xkL2ZvbGRndXR0ZXIuanMiPjxjb2RlPmZvbGQvZm9sZGd1dHRlci5qczwvY29kZT48L2E+PC9kdD4KICAgICAgPGRkPlByb3ZpZGVzIGFuIG9wdGlvbiA8Y29kZT5mb2xkR3V0dGVyPC9jb2RlPiwgd2hpY2ggY2FuIGJlCiAgICAgIHVzZWQgdG8gY3JlYXRlIGEgZ3V0dGVyIHdpdGggbWFya2VycyBpbmRpY2F0aW5nIHRoZSBibG9ja3MgdGhhdAogICAgICBjYW4gYmUgZm9sZGVkLiBDcmVhdGUgYSBndXR0ZXIgdXNpbmcKICAgICAgdGhlIDxhIGhyZWY9IiNvcHRpb25fZ3V0dGVycyI+PGNvZGU+Z3V0dGVyczwvY29kZT48L2E+IG9wdGlvbiwKICAgICAgZ2l2aW5nIGl0IHRoZSBjbGFzcyA8Y29kZT5Db2RlTWlycm9yLWZvbGRndXR0ZXI8L2NvZGU+IG9yCiAgICAgIHNvbWV0aGluZyBlbHNlIGlmIHlvdSBjb25maWd1cmUgdGhlIGFkZG9uIHRvIHVzZSBhIGRpZmZlcmVudAogICAgICBjbGFzcywgYW5kIHRoaXMgYWRkb24gd2lsbCBzaG93IG1hcmtlcnMgbmV4dCB0byBmb2xkZWQgYW5kCiAgICAgIGZvbGRhYmxlIGJsb2NrcywgYW5kIGhhbmRsZSBjbGlja3MgaW4gdGhpcyBndXR0ZXIuIE5vdGUgdGhhdAogICAgICBDU1Mgc3R5bGVzIHNob3VsZCBiZSBhcHBsaWVkIHRvIG1ha2UgdGhlIGd1dHRlciwgYW5kIHRoZSBmb2xkCiAgICAgIG1hcmtlcnMgd2l0aGluIGl0LCB2aXNpYmxlLiBBIGRlZmF1bHQgc2V0IG9mIENTUyBzdHlsZXMgYXJlCiAgICAgIGF2YWlsYWJsZSBpbjoKICAgICAgPGEgaHJlZj0iLi4vYWRkb24vZm9sZC9mb2xkZ3V0dGVyLmNzcyI+CiAgICAgICAgPGNvZGU+YWRkb24vZm9sZC9mb2xkZ3V0dGVyLmNzczwvY29kZT4KICAgICAgPC9hPi4KICAgICAgVGhlIG9wdGlvbgogICAgICBjYW4gYmUgZWl0aGVyIHNldCB0byA8Y29kZT50cnVlPC9jb2RlPiwgb3IgYW4gb2JqZWN0IGNvbnRhaW5pbmcKICAgICAgdGhlIGZvbGxvd2luZyBvcHRpb25hbCBvcHRpb24gZmllbGRzOgogICAgICA8ZGw+CiAgICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+Z3V0dGVyPC9zdHJvbmc+OiBzdHJpbmc8L2NvZGU+PC9kdD4KICAgICAgICA8ZGQ+VGhlIENTUyBjbGFzcyBvZiB0aGUgZ3V0dGVyLiBEZWZhdWx0cwogICAgICAgIHRvIDxjb2RlPiJDb2RlTWlycm9yLWZvbGRndXR0ZXIiPC9jb2RlPi4gWW91IHdpbGwgaGF2ZSB0bwogICAgICAgIHN0eWxlIHRoaXMgeW91cnNlbGYgdG8gZ2l2ZSBpdCBhIHdpZHRoIChhbmQgcG9zc2libHkgYQogICAgICAgIGJhY2tncm91bmQpLiBTZWUgdGhlIGRlZmF1bHQgZ3V0dGVyIHN0eWxlIHJ1bGVzIGFib3ZlLjwvZGQ+CiAgICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+aW5kaWNhdG9yT3Blbjwvc3Ryb25nPjogc3RyaW5nIHwgRWxlbWVudDwvY29kZT48L2R0PgogICAgICAgIDxkZD5BIENTUyBjbGFzcyBvciBET00gZWxlbWVudCB0byBiZSB1c2VkIGFzIHRoZSBtYXJrZXIgZm9yCiAgICAgICAgb3BlbiwgZm9sZGFibGUgYmxvY2tzLiBEZWZhdWx0cwogICAgICAgIHRvIDxjb2RlPiJDb2RlTWlycm9yLWZvbGRndXR0ZXItb3BlbiI8L2NvZGU+LjwvZGQ+CiAgICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+aW5kaWNhdG9yRm9sZGVkPC9zdHJvbmc+OiBzdHJpbmcgfCBFbGVtZW50PC9jb2RlPjwvZHQ+CiAgICAgICAgPGRkPkEgQ1NTIGNsYXNzIG9yIERPTSBlbGVtZW50IHRvIGJlIHVzZWQgYXMgdGhlIG1hcmtlciBmb3IKICAgICAgICBmb2xkZWQgYmxvY2tzLiBEZWZhdWx0cyB0byA8Y29kZT4iQ29kZU1pcnJvci1mb2xkZ3V0dGVyLWZvbGRlZCI8L2NvZGU+LjwvZGQ+CiAgICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+cmFuZ2VGaW5kZXI8L3N0cm9uZz46IGZuKENvZGVNaXJyb3IsIFBvcyk8L2NvZGU+PC9kdD4KICAgICAgICA8ZGQ+VGhlIHJhbmdlLWZpbmRlciBmdW5jdGlvbiB0byB1c2Ugd2hlbiBkZXRlcm1pbmluZyB3aGV0aGVyCiAgICAgICAgc29tZXRoaW5nIGNhbiBiZSBmb2xkZWQuIFdoZW4gbm90CiAgICAgICAgZ2l2ZW4sIDxhIGhyZWY9IiNoZWxwZXJfZm9sZF9hdXRvIj48Y29kZT5Db2RlTWlycm9yLmZvbGQuYXV0bzwvY29kZT48L2E+CiAgICAgICAgd2lsbCBiZSB1c2VkIGFzIGRlZmF1bHQuPC9kZD4KICAgICAgPC9kbD4KICAgICAgVGhlIDxjb2RlPmZvbGRPcHRpb25zPC9jb2RlPiBlZGl0b3Igb3B0aW9uIGNhbiBiZSBzZXQgdG8gYW4KICAgICAgb2JqZWN0IHRvIHByb3ZpZGUgYW4gZWRpdG9yLXdpZGUgZGVmYXVsdCBjb25maWd1cmF0aW9uLgogICAgICBEZW1vIDxhIGhyZWY9Ii4uL2RlbW8vZm9sZGluZy5odG1sIj5oZXJlPC9hPi48L2RkPgoKICAgICAgPGR0IGlkPSJhZGRvbl9ydW5tb2RlIj48YSBocmVmPSIuLi9hZGRvbi9ydW5tb2RlL3J1bm1vZGUuanMiPjxjb2RlPnJ1bm1vZGUvcnVubW9kZS5qczwvY29kZT48L2E+PC9kdD4KICAgICAgPGRkPkNhbiBiZSB1c2VkIHRvIHJ1biBhIENvZGVNaXJyb3IgbW9kZSBvdmVyIHRleHQgd2l0aG91dAogICAgICBhY3R1YWxseSBvcGVuaW5nIGFuIGVkaXRvciBpbnN0YW5jZS4KICAgICAgU2VlIDxhIGhyZWY9Ii4uL2RlbW8vcnVubW9kZS5odG1sIj50aGUgZGVtbzwvYT4gZm9yIGFuIGV4YW1wbGUuCiAgICAgIFRoZXJlIGFyZSBhbHRlcm5hdGUgdmVyc2lvbnMgb2YgdGhlIGZpbGUgYXZhaWxhYmxlIGZvcgogICAgICBydW5uaW5nIDxhIGhyZWY9Ii4uL2FkZG9uL3J1bm1vZGUvcnVubW9kZS1zdGFuZGFsb25lLmpzIj5zdGFuZC1hbG9uZTwvYT4KICAgICAgKHdpdGhvdXQgaW5jbHVkaW5nIGFsbCBvZiBDb2RlTWlycm9yKSBhbmQKICAgICAgZm9yIDxhIGhyZWY9Ii4uL2FkZG9uL3J1bm1vZGUvcnVubW9kZS5ub2RlLmpzIj5ydW5uaW5nIHVuZGVyCiAgICAgIG5vZGUuanM8L2E+IChzZWUgPGNvZGU+YmluL3NvdXJjZS1oaWdobGlnaHQ8L2NvZGU+IGZvciBhbiBleGFtcGxlIG9mIHVzaW5nIHRoZSBsYXR0ZXIpLjwvZGQ+CgogICAgICA8ZHQgaWQ9ImFkZG9uX2NvbG9yaXplIj48YSBocmVmPSIuLi9hZGRvbi9ydW5tb2RlL2NvbG9yaXplLmpzIj48Y29kZT5ydW5tb2RlL2NvbG9yaXplLmpzPC9jb2RlPjwvYT48L2R0PgogICAgICA8ZGQ+UHJvdmlkZXMgYSBjb252ZW5pZW50IHdheSB0byBzeW50YXgtaGlnaGxpZ2h0IGNvZGUgc25pcHBldHMKICAgICAgaW4gYSB3ZWJwYWdlLiBEZXBlbmRzIG9uCiAgICAgIHRoZSA8YSBocmVmPSIjYWRkb25fcnVubW9kZSI+PGNvZGU+cnVubW9kZTwvY29kZT48L2E+IGFkZG9uIChvcgogICAgICBpdHMgc3RhbmRhbG9uZSB2YXJpYW50KS4gUHJvdmlkZXMKICAgICAgYSA8Y29kZT5Db2RlTWlycm9yLmNvbG9yaXplPC9jb2RlPiBmdW5jdGlvbiB0aGF0IGNhbiBiZSBjYWxsZWQKICAgICAgd2l0aCBhbiBhcnJheSAob3Igb3RoZXIgYXJyYXktaXNoIGNvbGxlY3Rpb24pIG9mIERPTSBub2RlcyB0aGF0CiAgICAgIHJlcHJlc2VudCB0aGUgY29kZSBzbmlwcGV0cy4gQnkgZGVmYXVsdCwgaXQnbGwgZ2V0CiAgICAgIGFsbCA8Y29kZT5wcmU8L2NvZGU+IHRhZ3MuIFdpbGwgcmVhZCB0aGUgPGNvZGU+ZGF0YS1sYW5nPC9jb2RlPgogICAgICBhdHRyaWJ1dGUgb2YgdGhlc2Ugbm9kZXMgdG8gZmlndXJlIG91dCB0aGVpciBsYW5ndWFnZSwgYW5kCiAgICAgIHN5bnRheC1jb2xvciB0aGVpciBjb250ZW50IHVzaW5nIHRoZSByZWxldmFudCBDb2RlTWlycm9yIG1vZGUKICAgICAgKHlvdSdsbCBoYXZlIHRvIGxvYWQgdGhlIHNjcmlwdHMgZm9yIHRoZSByZWxldmFudCBtb2RlcwogICAgICB5b3Vyc2VsZikuIEEgc2Vjb25kIGFyZ3VtZW50IG1heSBiZSBwcm92aWRlZCB0byBnaXZlIGEgZGVmYXVsdAogICAgICBtb2RlLCB1c2VkIHdoZW4gbm8gbGFuZ3VhZ2UgYXR0cmlidXRlIGlzIGZvdW5kIGZvciBhIG5vZGUuIFVzZWQKICAgICAgaW4gdGhpcyBtYW51YWwgdG8gaGlnaGxpZ2h0IGV4YW1wbGUgY29kZS48L2RkPgoKICAgICAgPGR0IGlkPSJhZGRvbl9vdmVybGF5Ij48YSBocmVmPSIuLi9hZGRvbi9tb2RlL292ZXJsYXkuanMiPjxjb2RlPm1vZGUvb3ZlcmxheS5qczwvY29kZT48L2E+PC9kdD4KICAgICAgPGRkPk1vZGUgY29tYmluYXRvciB0aGF0IGNhbiBiZSB1c2VkIHRvIGV4dGVuZCBhIG1vZGUgd2l0aCBhbgogICAgICAnb3ZlcmxheScg4oCUIGEgc2Vjb25kYXJ5IG1vZGUgaXMgcnVuIG92ZXIgdGhlIHN0cmVhbSwgYWxvbmcgd2l0aAogICAgICB0aGUgYmFzZSBtb2RlLCBhbmQgY2FuIGNvbG9yIHNwZWNpZmljIHBpZWNlcyBvZiB0ZXh0IHdpdGhvdXQKICAgICAgaW50ZXJmZXJpbmcgd2l0aCB0aGUgYmFzZSBtb2RlLgogICAgICBEZWZpbmVzIDxjb2RlPkNvZGVNaXJyb3Iub3ZlcmxheU1vZGU8L2NvZGU+LCB3aGljaCBpcyB1c2VkIHRvCiAgICAgIGNyZWF0ZSBzdWNoIGEgbW9kZS4gU2VlIDxhIGhyZWY9Ii4uL2RlbW8vbXVzdGFjaGUuaHRtbCI+dGhpcwogICAgICBkZW1vPC9hPiBmb3IgYSBkZXRhaWxlZCBleGFtcGxlLjwvZGQ+CgogICAgICA8ZHQgaWQ9ImFkZG9uX211bHRpcGxleCI+PGEgaHJlZj0iLi4vYWRkb24vbW9kZS9tdWx0aXBsZXguanMiPjxjb2RlPm1vZGUvbXVsdGlwbGV4LmpzPC9jb2RlPjwvYT48L2R0PgogICAgICA8ZGQ+TW9kZSBjb21iaW5hdG9yIHRoYXQgY2FuIGJlIHVzZWQgdG8gZWFzaWx5ICdtdWx0aXBsZXgnCiAgICAgIGJldHdlZW4gc2V2ZXJhbCBtb2Rlcy4KICAgICAgRGVmaW5lcyA8Y29kZT5Db2RlTWlycm9yLm11bHRpcGxleGluZ01vZGU8L2NvZGU+IHdoaWNoLCB3aGVuCiAgICAgIGdpdmVuIGFzIGZpcnN0IGFyZ3VtZW50IGEgbW9kZSBvYmplY3QsIGFuZCBhcyBvdGhlciBhcmd1bWVudHMKICAgICAgYW55IG51bWJlciBvZiA8Y29kZT57b3BlbiwgY2xvc2UsIG1vZGUgWywgZGVsaW1TdHlsZSwgaW5uZXJTdHlsZSwgcGFyc2VEZWxpbWl0ZXJzXX08L2NvZGU+CiAgICAgIG9iamVjdHMsIHdpbGwgcmV0dXJuIGEgbW9kZSBvYmplY3QgdGhhdCBzdGFydHMgcGFyc2luZyB1c2luZyB0aGUKICAgICAgbW9kZSBwYXNzZWQgYXMgZmlyc3QgYXJndW1lbnQsIGJ1dCB3aWxsIHN3aXRjaCB0byBhbm90aGVyIG1vZGUKICAgICAgYXMgc29vbiBhcyBpdCBlbmNvdW50ZXJzIGEgc3RyaW5nIHRoYXQgb2NjdXJzIGluIG9uZSBvZgogICAgICB0aGUgPGNvZGU+b3BlbjwvY29kZT4gZmllbGRzIG9mIHRoZSBwYXNzZWQgb2JqZWN0cy4gV2hlbiBpbiBhCiAgICAgIHN1Yi1tb2RlLCBpdCB3aWxsIGdvIGJhY2sgdG8gdGhlIHRvcCBtb2RlIGFnYWluIHdoZW4KICAgICAgdGhlIDxjb2RlPmNsb3NlPC9jb2RlPiBzdHJpbmcgaXMgZW5jb3VudGVyZWQuCiAgICAgIFBhc3MgPGNvZGU+IlxuIjwvY29kZT4gZm9yIDxjb2RlPm9wZW48L2NvZGU+IG9yIDxjb2RlPmNsb3NlPC9jb2RlPgogICAgICBpZiB5b3Ugd2FudCB0byBzd2l0Y2ggb24gYSBibGFuayBsaW5lLgogICAgICA8dWw+PGxpPldoZW4gPGNvZGU+ZGVsaW1TdHlsZTwvY29kZT4gaXMgc3BlY2lmaWVkLCBpdCB3aWxsIGJlIHRoZSB0b2tlbgogICAgICBzdHlsZSByZXR1cm5lZCBmb3IgdGhlIGRlbGltaXRlciB0b2tlbnMgKGFzIHdlbGwgYXMKICAgICAgPGNvZGU+W2RlbGltU3R5bGVdLW9wZW48L2NvZGU+IG9uIHRoZSBvcGVuaW5nIHRva2VuIGFuZAogICAgICA8Y29kZT5bZGVsaW1TdHlsZV0tY2xvc2U8L2NvZGU+IG9uIHRoZSBjbG9zaW5nIHRva2VuKS48L2xpPgogICAgICA8bGk+V2hlbiA8Y29kZT5pbm5lclN0eWxlPC9jb2RlPiBpcyBzcGVjaWZpZWQsIGl0IHdpbGwgYmUgdGhlIHRva2VuCiAgICAgIHN0eWxlIGFkZGVkIGZvciBlYWNoIGlubmVyIG1vZGUgdG9rZW4uPC9saT4KICAgICAgPGxpPldoZW4gPGNvZGU+cGFyc2VEZWxpbWl0ZXJzPC9jb2RlPiBpcyB0cnVlLCB0aGUgY29udGVudCBvZgogICAgICB0aGUgZGVsaW1pdGVycyB3aWxsIGFsc28gYmUgcGFzc2VkIHRvIHRoZSBpbm5lciBtb2RlLgogICAgICAoQW5kIDxjb2RlPmRlbGltU3R5bGU8L2NvZGU+IGlzIGlnbm9yZWQuKTwvbGk+PC91bD4gVGhlIG91dGVyCiAgICAgIG1vZGUgd2lsbCBub3Qgc2VlIHRoZSBjb250ZW50IGJldHdlZW4gdGhlIGRlbGltaXRlcnMuCiAgICAgIFNlZSA8YSBocmVmPSIuLi9kZW1vL211bHRpcGxleC5odG1sIj50aGlzIGRlbW88L2E+IGZvciBhbgogICAgICBleGFtcGxlLjwvZGQ+CgogICAgICA8ZHQgaWQ9ImFkZG9uX3Nob3ctaGludCI+PGEgaHJlZj0iLi4vYWRkb24vaGludC9zaG93LWhpbnQuanMiPjxjb2RlPmhpbnQvc2hvdy1oaW50LmpzPC9jb2RlPjwvYT48L2R0PgogICAgICA8ZGQ+UHJvdmlkZXMgYSBmcmFtZXdvcmsgZm9yIHNob3dpbmcgYXV0b2NvbXBsZXRpb24gaGludHMuCiAgICAgIERlZmluZXMgPGNvZGU+ZWRpdG9yLnNob3dIaW50PC9jb2RlPiwgd2hpY2ggdGFrZXMgYW4gb3B0aW9uYWwKICAgICAgb3B0aW9ucyBvYmplY3QsIGFuZCBwb3BzIHVwIGEgd2lkZ2V0IHRoYXQgYWxsb3dzIHRoZSB1c2VyIHRvCiAgICAgIHNlbGVjdCBhIGNvbXBsZXRpb24uIEZpbmRpbmcgaGludHMgaXMgZG9uZSB3aXRoIGEgaGludGluZwogICAgICBmdW5jdGlvbnMgKHRoZSA8Y29kZT5oaW50PC9jb2RlPiBvcHRpb24pLCB3aGljaCBpcyBhIGZ1bmN0aW9uCiAgICAgIHRoYXQgdGFrZSBhbiBlZGl0b3IgaW5zdGFuY2UgYW5kIG9wdGlvbnMgb2JqZWN0LCBhbmQgcmV0dXJuCiAgICAgIGEgPGNvZGU+e2xpc3QsIGZyb20sIHRvfTwvY29kZT4gb2JqZWN0LCB3aGVyZSA8Y29kZT5saXN0PC9jb2RlPgogICAgICBpcyBhbiBhcnJheSBvZiBzdHJpbmdzIG9yIG9iamVjdHMgKHRoZSBjb21wbGV0aW9ucyksCiAgICAgIGFuZCA8Y29kZT5mcm9tPC9jb2RlPiBhbmQgPGNvZGU+dG88L2NvZGU+IGdpdmUgdGhlIHN0YXJ0IGFuZCBlbmQKICAgICAgb2YgdGhlIHRva2VuIHRoYXQgaXMgYmVpbmcgY29tcGxldGVkIGFzIDxjb2RlPntsaW5lLCBjaH08L2NvZGU+CiAgICAgIG9iamVjdHMuIEFuIG9wdGlvbmFsIDxjb2RlPnNlbGVjdGVkSGludDwvY29kZT4gcHJvcGVydHkgKGFuCiAgICAgIGludGVnZXIpIGNhbiBiZSBhZGRlZCB0byB0aGUgY29tcGxldGlvbiBvYmplY3QgdG8gY29udHJvbCB0aGUKICAgICAgaW5pdGlhbGx5IHNlbGVjdGVkIGhpbnQuPC9kZD4KICAgICAgPGRkPklmIG5vIGhpbnRpbmcgZnVuY3Rpb24gaXMgZ2l2ZW4sIHRoZSBhZGRvbiB3aWxsCiAgICAgIHVzZSA8Y29kZT5Db2RlTWlycm9yLmhpbnQuYXV0bzwvY29kZT4sIHdoaWNoCiAgICAgIGNhbGxzIDxhIGhyZWY9IiNnZXRIZWxwZXJzIj48Y29kZT5nZXRIZWxwZXJzPC9jb2RlPjwvYT4gd2l0aAogICAgICB0aGUgPGNvZGU+ImhpbnQiPC9jb2RlPiB0eXBlIHRvIGZpbmQgYXBwbGljYWJsZSBoaW50aW5nCiAgICAgIGZ1bmN0aW9ucywgYW5kIHRyaWVzIHRoZW0gb25lIGJ5IG9uZS4gSWYgdGhhdCBmYWlscywgaXQgbG9va3MKICAgICAgZm9yIGEgPGNvZGU+ImhpbnRXb3JkcyI8L2NvZGU+IGhlbHBlciB0byBmZXRjaCBhIGxpc3Qgb2YKICAgICAgY29tcGxldGFibGUgd29yZHMgZm9yIHRoZSBtb2RlLCBhbmQKICAgICAgdXNlcyA8Y29kZT5Db2RlTWlycm9yLmhpbnQuZnJvbUxpc3Q8L2NvZGU+IHRvIGNvbXBsZXRlIGZyb20KICAgICAgdGhvc2UuPC9kZD4KICAgICAgPGRkPldoZW4gY29tcGxldGlvbnMgYXJlbid0IHNpbXBsZSBzdHJpbmdzLCB0aGV5IHNob3VsZCBiZQogICAgICBvYmplY3RzIHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgogICAgICA8ZGw+CiAgICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+dGV4dDwvc3Ryb25nPjogc3RyaW5nPC9jb2RlPjwvZHQ+CiAgICAgICAgPGRkPlRoZSBjb21wbGV0aW9uIHRleHQuIFRoaXMgaXMgdGhlIG9ubHkgcmVxdWlyZWQKICAgICAgICBwcm9wZXJ0eS48L2RkPgogICAgICAgIDxkdD48Y29kZT48c3Ryb25nPmRpc3BsYXlUZXh0PC9zdHJvbmc+OiBzdHJpbmc8L2NvZGU+PC9kdD4KICAgICAgICA8ZGQ+VGhlIHRleHQgdGhhdCBzaG91bGQgYmUgZGlzcGxheWVkIGluIHRoZSBtZW51LjwvZGQ+CiAgICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+Y2xhc3NOYW1lPC9zdHJvbmc+OiBzdHJpbmc8L2NvZGU+PC9kdD4KICAgICAgICA8ZGQ+QSBDU1MgY2xhc3MgbmFtZSB0byBhcHBseSB0byB0aGUgY29tcGxldGlvbidzIGxpbmUgaW4gdGhlCiAgICAgICAgbWVudS48L2RkPgogICAgICAgIDxkdD48Y29kZT48c3Ryb25nPnJlbmRlcjwvc3Ryb25nPjogZm4oRWxlbWVudCwgc2VsZiwgZGF0YSk8L2NvZGU+PC9kdD4KICAgICAgICA8ZGQ+QSBtZXRob2QgdXNlZCB0byBjcmVhdGUgdGhlIERPTSBzdHJ1Y3R1cmUgZm9yIHNob3dpbmcgdGhlCiAgICAgICAgY29tcGxldGlvbiBieSBhcHBlbmRpbmcgaXQgdG8gaXRzIGZpcnN0IGFyZ3VtZW50LjwvZGQ+CiAgICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+aGludDwvc3Ryb25nPjogZm4oQ29kZU1pcnJvciwgc2VsZiwgZGF0YSk8L2NvZGU+PC9kdD4KICAgICAgICA8ZGQ+QSBtZXRob2QgdXNlZCB0byBhY3R1YWxseSBhcHBseSB0aGUgY29tcGxldGlvbiwgaW5zdGVhZCBvZgogICAgICAgIHRoZSBkZWZhdWx0IGJlaGF2aW9yLjwvZGQ+CiAgICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+ZnJvbTwvc3Ryb25nPjoge2xpbmUsIGNofTwvY29kZT48L2R0PgogICAgICAgIDxkZD5PcHRpb25hbCA8Y29kZT5mcm9tPC9jb2RlPiBwb3NpdGlvbiB0aGF0IHdpbGwgYmUgdXNlZCBieSA8Y29kZT5waWNrKCk8L2NvZGU+IGluc3RlYWQKICAgICAgICBvZiB0aGUgZ2xvYmFsIG9uZSBwYXNzZWQgd2l0aCB0aGUgZnVsbCBsaXN0IG9mIGNvbXBsZXRpb25zLjwvZGQ+CiAgICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+dG88L3N0cm9uZz46IHtsaW5lLCBjaH08L2NvZGU+PC9kdD4KICAgICAgICA8ZGQ+T3B0aW9uYWwgPGNvZGU+dG88L2NvZGU+IHBvc2l0aW9uIHRoYXQgd2lsbCBiZSB1c2VkIGJ5IDxjb2RlPnBpY2soKTwvY29kZT4gaW5zdGVhZAogICAgICAgIG9mIHRoZSBnbG9iYWwgb25lIHBhc3NlZCB3aXRoIHRoZSBmdWxsIGxpc3Qgb2YgY29tcGxldGlvbnMuPC9kZD4KICAgICAgPC9kbD48L2RkPgoKICAgICAgPGRkPlRoZSBwbHVnaW4gdW5kZXJzdGFuZHMgdGhlIGZvbGxvd2luZyBvcHRpb25zICh0aGUgb3B0aW9ucyBvYmplY3QKICAgICAgd2lsbCBhbHNvIGJlIHBhc3NlZCBhbG9uZyB0byB0aGUgaGludGluZyBmdW5jdGlvbiwgd2hpY2ggbWF5CiAgICAgIHVuZGVyc3RhbmQgYWRkaXRpb25hbCBvcHRpb25zKToKICAgICAgPGRsPgogICAgICAgIDxkdD48Y29kZT48c3Ryb25nPmhpbnQ8L3N0cm9uZz46IGZ1bmN0aW9uPC9jb2RlPjwvZHQ+CiAgICAgICAgPGRkPkEgaGludGluZyBmdW5jdGlvbiwgYXMgc3BlY2lmaWVkIGFib3ZlLiBJdCBpcyBwb3NzaWJsZSB0bwogICAgICAgIHNldCB0aGUgPGNvZGU+YXN5bmM8L2NvZGU+IHByb3BlcnR5IG9uIGEgaGludGluZyBmdW5jdGlvbiB0bwogICAgICAgIHRydWUsIGluIHdoaWNoIGNhc2UgaXQgd2lsbCBiZSBjYWxsZWQgd2l0aAogICAgICAgIGFyZ3VtZW50cyA8Y29kZT4oY20sIGNhbGxiYWNrLCA/b3B0aW9ucyk8L2NvZGU+LCBhbmQgdGhlCiAgICAgICAgY29tcGxldGlvbiBpbnRlcmZhY2Ugd2lsbCBvbmx5IGJlIHBvcHBlZCB1cCB3aGVuIHRoZSBoaW50aW5nCiAgICAgICAgZnVuY3Rpb24gY2FsbHMgdGhlIGNhbGxiYWNrLCBwYXNzaW5nIGl0IHRoZSBvYmplY3QgaG9sZGluZyB0aGUKICAgICAgICBjb21wbGV0aW9ucy4KICAgICAgICBUaGUgaGludGluZyBmdW5jdGlvbiBjYW4gYWxzbyByZXR1cm4gYSBwcm9taXNlLCBhbmQgdGhlIGNvbXBsZXRpb24KICAgICAgICBpbnRlcmZhY2Ugd2lsbCBvbmx5IGJlIHBvcHBlZCB3aGVuIHRoZSBwcm9taXNlIHJlc29sdmVzLgogICAgICAgIEJ5IGRlZmF1bHQsIGhpbnRpbmcgb25seSB3b3JrcyB3aGVuIHRoZXJlIGlzIG5vCiAgICAgICAgc2VsZWN0aW9uLiBZb3UgY2FuIGdpdmUgYSBoaW50aW5nIGZ1bmN0aW9uCiAgICAgICAgYSA8Y29kZT5zdXBwb3J0c1NlbGVjdGlvbjwvY29kZT4gcHJvcGVydHkgd2l0aCBhIHRydXRoeSB2YWx1ZQogICAgICAgIHRvIGluZGljYXRlIHRoYXQgaXQgc3VwcG9ydHMgc2VsZWN0aW9ucy48L2RkPgogICAgICAgIDxkdD48Y29kZT48c3Ryb25nPmNvbXBsZXRlU2luZ2xlPC9zdHJvbmc+OiBib29sZWFuPC9jb2RlPjwvZHQ+CiAgICAgICAgPGRkPkRldGVybWluZXMgd2hldGhlciwgd2hlbiBvbmx5IGEgc2luZ2xlIGNvbXBsZXRpb24gaXMKICAgICAgICBhdmFpbGFibGUsIGl0IGlzIGNvbXBsZXRlZCB3aXRob3V0IHNob3dpbmcgdGhlIGRpYWxvZy4KICAgICAgICBEZWZhdWx0cyB0byB0cnVlLjwvZGQ+CiAgICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+YWxpZ25XaXRoV29yZDwvc3Ryb25nPjogYm9vbGVhbjwvY29kZT48L2R0PgogICAgICAgIDxkZD5XaGV0aGVyIHRoZSBwb3AtdXAgc2hvdWxkIGJlIGhvcml6b250YWxseSBhbGlnbmVkIHdpdGggdGhlCiAgICAgICAgc3RhcnQgb2YgdGhlIHdvcmQgKHRydWUsIGRlZmF1bHQpLCBvciB3aXRoIHRoZSBjdXJzb3IgKGZhbHNlKS48L2RkPgogICAgICAgIDxkdD48Y29kZT48c3Ryb25nPmNsb3NlT25VbmZvY3VzPC9zdHJvbmc+OiBib29sZWFuPC9jb2RlPjwvZHQ+CiAgICAgICAgPGRkPldoZW4gZW5hYmxlZCAod2hpY2ggaXMgdGhlIGRlZmF1bHQpLCB0aGUgcG9wLXVwIHdpbGwgY2xvc2UKICAgICAgICB3aGVuIHRoZSBlZGl0b3IgaXMgdW5mb2N1c2VkLjwvZGQ+CiAgICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+Y3VzdG9tS2V5czwvc3Ryb25nPjoga2V5bWFwPC9jb2RlPjwvZHQ+CiAgICAgICAgPGRkPkFsbG93cyB5b3UgdG8gcHJvdmlkZSBhIGN1c3RvbSBrZXkgbWFwIG9mIGtleXMgdG8gYmUgYWN0aXZlCiAgICAgICAgd2hlbiB0aGUgcG9wLXVwIGlzIGFjdGl2ZS4gVGhlIGhhbmRsZXJzIHdpbGwgYmUgY2FsbGVkIHdpdGggYW4KICAgICAgICBleHRyYSBhcmd1bWVudCwgYSBoYW5kbGUgdG8gdGhlIGNvbXBsZXRpb24gbWVudSwgd2hpY2gKICAgICAgICBoYXMgPGNvZGU+bW92ZUZvY3VzKG4pPC9jb2RlPiwgPGNvZGU+c2V0Rm9jdXMobik8L2NvZGU+LCA8Y29kZT5waWNrKCk8L2NvZGU+LAogICAgICAgIGFuZCA8Y29kZT5jbG9zZSgpPC9jb2RlPiBtZXRob2RzIChzZWUgdGhlIHNvdXJjZSBmb3IgZGV0YWlscyksCiAgICAgICAgdGhhdCBjYW4gYmUgdXNlZCB0byBjaGFuZ2UgdGhlIGZvY3VzZWQgZWxlbWVudCwgcGljayB0aGUKICAgICAgICBjdXJyZW50IGVsZW1lbnQgb3IgY2xvc2UgdGhlIG1lbnUuIEFkZGl0aW9uYWxseSA8Y29kZT5tZW51U2l6ZSgpPC9jb2RlPgogICAgICAgIGNhbiBnaXZlIHlvdSBhY2Nlc3MgdG8gdGhlIHNpemUgb2YgdGhlIGN1cnJlbnQgZHJvcGRvd24gbWVudSwKICAgICAgICA8Y29kZT5sZW5ndGg8L2NvZGU+IGdpdmUgeW91IHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIGNvbXBsZXRpb25zLCBhbmQKICAgICAgICA8Y29kZT5kYXRhPC9jb2RlPiBnaXZlIHlvdSBmdWxsIGFjY2VzcyB0byB0aGUgY29tcGxldGlvbiByZXR1cm5lZCBieSB0aGUKICAgICAgICBoaW50aW5nIGZ1bmN0aW9uLjwvZGQ+CiAgICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+ZXh0cmFLZXlzPC9zdHJvbmc+OiBrZXltYXA8L2NvZGU+PC9kdD4KICAgICAgICA8ZGQ+TGlrZSA8Y29kZT5jdXN0b21LZXlzPC9jb2RlPiBhYm92ZSwgYnV0IHRoZSBiaW5kaW5ncyB3aWxsCiAgICAgICAgYmUgYWRkZWQgdG8gdGhlIHNldCBvZiBkZWZhdWx0IGJpbmRpbmdzLCBpbnN0ZWFkIG9mIHJlcGxhY2luZwogICAgICAgIHRoZW0uPC9kZD4KICAgICAgPC9kbD4KICAgICAgVGhlIGZvbGxvd2luZyBldmVudHMgd2lsbCBiZSBmaXJlZCBvbiB0aGUgY29tcGxldGlvbnMgb2JqZWN0CiAgICAgIGR1cmluZyBjb21wbGV0aW9uOgogICAgICA8ZGw+CiAgICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+InNob3duIjwvc3Ryb25nPiAoKTwvY29kZT48L2R0PgogICAgICAgIDxkZD5GaXJlZCB3aGVuIHRoZSBwb3AtdXAgaXMgc2hvd24uPC9kZD4KICAgICAgICA8ZHQ+PGNvZGU+PHN0cm9uZz4ic2VsZWN0Ijwvc3Ryb25nPiAoY29tcGxldGlvbiwgRWxlbWVudCk8L2NvZGU+PC9kdD4KICAgICAgICA8ZGQ+RmlyZWQgd2hlbiBhIGNvbXBsZXRpb24gaXMgc2VsZWN0ZWQuIFBhc3NlZCB0aGUgY29tcGxldGlvbgogICAgICAgIHZhbHVlIChzdHJpbmcgb3Igb2JqZWN0KSBhbmQgdGhlIERPTSBub2RlIHRoYXQgcmVwcmVzZW50cyBpdAogICAgICAgIGluIHRoZSBtZW51LjwvZGQ+CiAgICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+InBpY2siPC9zdHJvbmc+IChjb21wbGV0aW9uKTwvY29kZT48L2R0PgogICAgICAgIDxkZD5GaXJlZCB3aGVuIGEgY29tcGxldGlvbiBpcyBwaWNrZWQuIFBhc3NlZCB0aGUgY29tcGxldGlvbiB2YWx1ZQogICAgICAgIChzdHJpbmcgb3Igb2JqZWN0KS48L2RkPgogICAgICAgIDxkdD48Y29kZT48c3Ryb25nPiJjbG9zZSI8L3N0cm9uZz4gKCk8L2NvZGU+PC9kdD4KICAgICAgICA8ZGQ+RmlyZWQgd2hlbiB0aGUgY29tcGxldGlvbiBpcyBmaW5pc2hlZC48L2RkPgogICAgICA8L2RsPgogICAgICBUaGlzIGFkZG9uIGRlcGVuZHMgb24gc3R5bGVzCiAgICAgIGZyb20gPGNvZGU+YWRkb24vaGludC9zaG93LWhpbnQuY3NzPC9jb2RlPi4gQ2hlY2sKICAgICAgb3V0IDxhIGhyZWY9Ii4uL2RlbW8vY29tcGxldGUuaHRtbCI+dGhlIGRlbW88L2E+IGZvciBhbgogICAgICBleGFtcGxlLjwvZGQ+CgogICAgICA8ZHQgaWQ9ImFkZG9uX2phdmFzY3JpcHQtaGludCI+PGEgaHJlZj0iLi4vYWRkb24vaGludC9qYXZhc2NyaXB0LWhpbnQuanMiPjxjb2RlPmhpbnQvamF2YXNjcmlwdC1oaW50LmpzPC9jb2RlPjwvYT48L2R0PgogICAgICA8ZGQ+RGVmaW5lcyBhIHNpbXBsZSBoaW50aW5nIGZ1bmN0aW9uIGZvciBKYXZhU2NyaXB0CiAgICAgICg8Y29kZT5Db2RlTWlycm9yLmhpbnQuamF2YXNjcmlwdDwvY29kZT4pIGFuZCBDb2ZmZWVTY3JpcHQKICAgICAgKDxjb2RlPkNvZGVNaXJyb3IuaGludC5jb2ZmZWVzY3JpcHQ8L2NvZGU+KSBjb2RlLiBUaGlzIHdpbGwKICAgICAgc2ltcGx5IHVzZSB0aGUgSmF2YVNjcmlwdCBlbnZpcm9ubWVudCB0aGF0IHRoZSBlZGl0b3IgcnVucyBpbiBhcwogICAgICBhIHNvdXJjZSBvZiBpbmZvcm1hdGlvbiBhYm91dCBvYmplY3RzIGFuZCB0aGVpciBwcm9wZXJ0aWVzLjwvZGQ+CgogICAgICA8ZHQgaWQ9ImFkZG9uX3htbC1oaW50Ij48YSBocmVmPSIuLi9hZGRvbi9oaW50L3htbC1oaW50LmpzIj48Y29kZT5oaW50L3htbC1oaW50LmpzPC9jb2RlPjwvYT48L2R0PgogICAgICA8ZGQ+RGVmaW5lcyA8Y29kZT5Db2RlTWlycm9yLmhpbnQueG1sPC9jb2RlPiwgd2hpY2ggcHJvZHVjZXMKICAgICAgaGludHMgZm9yIFhNTCB0YWduYW1lcywgYXR0cmlidXRlIG5hbWVzLCBhbmQgYXR0cmlidXRlIHZhbHVlcywKICAgICAgZ3VpZGVkIGJ5IGEgPGNvZGU+c2NoZW1hSW5mbzwvY29kZT4gb3B0aW9uIChhIHByb3BlcnR5IG9mIHRoZQogICAgICBzZWNvbmQgYXJndW1lbnQgcGFzc2VkIHRvIHRoZSBoaW50aW5nIGZ1bmN0aW9uLCBvciB0aGUgdGhpcmQKICAgICAgYXJndW1lbnQgcGFzc2VkIHRvIDxjb2RlPkNvZGVNaXJyb3Iuc2hvd0hpbnQ8L2NvZGU+KS48YnI+VGhlCiAgICAgIHNjaGVtYSBpbmZvIHNob3VsZCBiZSBhbiBvYmplY3QgbWFwcGluZyB0YWcgbmFtZXMgdG8gaW5mb3JtYXRpb24KICAgICAgYWJvdXQgdGhlc2UgdGFncywgd2l0aCBvcHRpb25hbGx5IGEgPGNvZGU+IiF0b3AiPC9jb2RlPiBwcm9wZXJ0eQogICAgICBjb250YWluaW5nIGEgbGlzdCBvZiB0aGUgbmFtZXMgb2YgdmFsaWQgdG9wLWxldmVsIHRhZ3MuIFRoZQogICAgICB2YWx1ZXMgb2YgdGhlIHByb3BlcnRpZXMgc2hvdWxkIGJlIG9iamVjdHMgd2l0aCBvcHRpb25hbAogICAgICBwcm9wZXJ0aWVzIDxjb2RlPmNoaWxkcmVuPC9jb2RlPiAoYW4gYXJyYXkgb2YgdmFsaWQgY2hpbGQKICAgICAgZWxlbWVudCBuYW1lcywgb21pdCB0byBzaW1wbHkgYWxsb3cgYWxsIHRhZ3MgdG8gYXBwZWFyKQogICAgICBhbmQgPGNvZGU+YXR0cnM8L2NvZGU+IChhbiBvYmplY3QgbWFwcGluZyBhdHRyaWJ1dGUgbmFtZXMKICAgICAgdG8gPGNvZGU+bnVsbDwvY29kZT4gZm9yIGZyZWUtZm9ybSBhdHRyaWJ1dGVzLCBhbmQgYW4gYXJyYXkgb2YKICAgICAgdmFsaWQgdmFsdWVzIGZvciByZXN0cmljdGVkCiAgICAgIGF0dHJpYnV0ZXMpLiA8YSBocmVmPSIuLi9kZW1vL3htbGNvbXBsZXRlLmh0bWwiPkRlbW8KICAgICAgaGVyZS48L2E+PC9kZD4KCiAgICAgIDxkdCBpZD0iYWRkb25faHRtbC1oaW50Ij48YSBocmVmPSIuLi9hZGRvbi9oaW50L2h0bWwtaGludC5qcyI+PGNvZGU+aGludC9odG1sLWhpbnQuanM8L2NvZGU+PC9hPjwvZHQ+CiAgICAgIDxkZD5Qcm92aWRlcyBzY2hlbWEgaW5mbyB0bwogICAgICB0aGUgPGEgaHJlZj0iI2FkZG9uX3htbC1oaW50Ij54bWwtaGludDwvYT4gYWRkb24gZm9yIEhUTUwKICAgICAgZG9jdW1lbnRzLiBEZWZpbmVzIGEgc2NoZW1hCiAgICAgIG9iamVjdCA8Y29kZT5Db2RlTWlycm9yLmh0bWxTY2hlbWE8L2NvZGU+IHRoYXQgeW91IGNhbiBwYXNzIHRvCiAgICAgIGFzIGEgPGNvZGU+c2NoZW1hSW5mbzwvY29kZT4gb3B0aW9uLCBhbmQKICAgICAgYSA8Y29kZT5Db2RlTWlycm9yLmhpbnQuaHRtbDwvY29kZT4gaGludGluZyBmdW5jdGlvbiB0aGF0CiAgICAgIGF1dG9tYXRpY2FsbHkgY2FsbHMgPGNvZGU+Q29kZU1pcnJvci5oaW50LnhtbDwvY29kZT4gd2l0aCB0aGlzCiAgICAgIHNjaGVtYSBkYXRhLiBTZWUKICAgICAgdGhlIDxhIGhyZWY9Ii4uL2RlbW8vaHRtbDVjb21wbGV0ZS5odG1sIj5kZW1vPC9hPi48L2RkPgoKICAgICAgPGR0IGlkPSJhZGRvbl9jc3MtaGludCI+PGEgaHJlZj0iLi4vYWRkb24vaGludC9jc3MtaGludC5qcyI+PGNvZGU+aGludC9jc3MtaGludC5qczwvY29kZT48L2E+PC9kdD4KICAgICAgPGRkPkEgaGludGluZyBmdW5jdGlvbiBmb3IgQ1NTLCBTQ1NTLCBvciBMRVNTIGNvZGUuCiAgICAgIERlZmluZXMgPGNvZGU+Q29kZU1pcnJvci5oaW50LmNzczwvY29kZT4uPC9kZD4KCiAgICAgIDxkdCBpZD0iYWRkb25fYW55d29yZC1oaW50Ij48YSBocmVmPSIuLi9hZGRvbi9oaW50L2FueXdvcmQtaGludC5qcyI+PGNvZGU+aGludC9hbnl3b3JkLWhpbnQuanM8L2NvZGU+PC9hPjwvZHQ+CiAgICAgIDxkZD5BIHZlcnkgc2ltcGxlIGhpbnRpbmcgZnVuY3Rpb24KICAgICAgKDxjb2RlPkNvZGVNaXJyb3IuaGludC5hbnl3b3JkPC9jb2RlPikgdGhhdCBzaW1wbHkgbG9va3MgZm9yCiAgICAgIHdvcmRzIGluIHRoZSBuZWFyYnkgY29kZSBhbmQgY29tcGxldGVzIHRvIHRob3NlLiBUYWtlcyB0d28KICAgICAgb3B0aW9uYWwgb3B0aW9ucywgPGNvZGU+d29yZDwvY29kZT4sIGEgcmVndWxhciBleHByZXNzaW9uIHRoYXQKICAgICAgbWF0Y2hlcyB3b3JkcyAoc2VxdWVuY2VzIG9mIG9uZSBvciBtb3JlIGNoYXJhY3RlciksCiAgICAgIGFuZCA8Y29kZT5yYW5nZTwvY29kZT4sIHdoaWNoIGRlZmluZXMgaG93IG1hbnkgbGluZXMgdGhlIGFkZG9uCiAgICAgIHNob3VsZCBzY2FuIHdoZW4gY29tcGxldGluZyAoZGVmYXVsdHMgdG8gNTAwKS48L2RkPgoKICAgICAgPGR0IGlkPSJhZGRvbl9zcWwtaGludCI+PGEgaHJlZj0iLi4vYWRkb24vaGludC9zcWwtaGludC5qcyI+PGNvZGU+aGludC9zcWwtaGludC5qczwvY29kZT48L2E+PC9kdD4KICAgICAgPGRkPkEgc2ltcGxlIFNRTCBoaW50ZXIuIERlZmluZXMgPGNvZGU+Q29kZU1pcnJvci5oaW50LnNxbDwvY29kZT4uCiAgICAgIFRha2VzIHR3byBvcHRpb25hbCBvcHRpb25zLCA8Y29kZT50YWJsZXM8L2NvZGU+LCBhIG9iamVjdCB3aXRoCiAgICAgIHRhYmxlIG5hbWVzIGFzIGtleXMgYW5kIGFycmF5IG9mIHJlc3BlY3RpdmUgY29sdW1uIG5hbWVzIGFzIHZhbHVlcywKICAgICAgYW5kIDxjb2RlPmRlZmF1bHRUYWJsZTwvY29kZT4sIGEgc3RyaW5nIGNvcnJlc3BvbmRpbmcgdG8gYQogICAgICB0YWJsZSBuYW1lIGluIDxjb2RlPnRhYmxlczwvY29kZT4gZm9yIGF1dG9jb21wbGV0aW9uLjwvZGQ+CgogICAgICA8ZHQgaWQ9ImFkZG9uX21hdGNoLWhpZ2hsaWdodGVyIj48YSBocmVmPSIuLi9hZGRvbi9zZWFyY2gvbWF0Y2gtaGlnaGxpZ2h0ZXIuanMiPjxjb2RlPnNlYXJjaC9tYXRjaC1oaWdobGlnaHRlci5qczwvY29kZT48L2E+PC9kdD4KICAgICAgPGRkPkFkZHMgYSA8Y29kZT5oaWdobGlnaHRTZWxlY3Rpb25NYXRjaGVzPC9jb2RlPiBvcHRpb24gdGhhdAogICAgICBjYW4gYmUgZW5hYmxlZCB0byBoaWdobGlnaHQgYWxsIGluc3RhbmNlcyBvZiBhIGN1cnJlbnRseQogICAgICBzZWxlY3RlZCB3b3JkLiBDYW4gYmUgc2V0IGVpdGhlciB0byB0cnVlIG9yIHRvIGFuIG9iamVjdAogICAgICBjb250YWluaW5nIHRoZSBmb2xsb3dpbmcgb3B0aW9uczogPGNvZGU+bWluQ2hhcnM8L2NvZGU+LCBmb3IgdGhlCiAgICAgIG1pbmltdW0gYW1vdW50IG9mIHNlbGVjdGVkIGNoYXJhY3RlcnMgdGhhdCB0cmlnZ2VycyBhIGhpZ2hsaWdodAogICAgICAoZGVmYXVsdCAyKSwgPGNvZGU+c3R5bGU8L2NvZGU+LCBmb3IgdGhlIHN0eWxlIHRvIGJlIHVzZWQgdG8KICAgICAgaGlnaGxpZ2h0IHRoZSBtYXRjaGVzIChkZWZhdWx0IDxjb2RlPiJtYXRjaGhpZ2hsaWdodCI8L2NvZGU+LAogICAgICB3aGljaCB3aWxsIGNvcnJlc3BvbmQgdG8gQ1NTCiAgICAgIGNsYXNzIDxjb2RlPmNtLW1hdGNoaGlnaGxpZ2h0PC9jb2RlPiksIDxjb2RlPnRyaW08L2NvZGU+LCB3aGljaAogICAgICBjb250cm9scyB3aGV0aGVyIHdoaXRlc3BhY2UgaXMgdHJpbW1lZCBmcm9tIHRoZSBzZWxlY3Rpb24sCiAgICAgIGFuZCA8Y29kZT5zaG93VG9rZW48L2NvZGU+IHdoaWNoIGNhbiBiZSBzZXQgdG8gPGNvZGU+dHJ1ZTwvY29kZT4KICAgICAgb3IgdG8gYSByZWdleHAgbWF0Y2hpbmcgdGhlIGNoYXJhY3RlcnMgdGhhdCBtYWtlIHVwIGEgd29yZC4gV2hlbgogICAgICBlbmFibGVkLCBpdCBjYXVzZXMgdGhlIGN1cnJlbnQgd29yZCB0byBiZSBoaWdobGlnaHRlZCB3aGVuCiAgICAgIG5vdGhpbmcgaXMgc2VsZWN0ZWQgKGRlZmF1bHRzIHRvIG9mZikuCiAgICAgIERlbW8gPGEgaHJlZj0iLi4vZGVtby9tYXRjaGhpZ2hsaWdodGVyLmh0bWwiPmhlcmU8L2E+LjwvZGQ+CgogICAgICA8ZHQgaWQ9ImFkZG9uX2xpbnQiPjxhIGhyZWY9Ii4uL2FkZG9uL2xpbnQvbGludC5qcyI+PGNvZGU+bGludC9saW50LmpzPC9jb2RlPjwvYT48L2R0PgogICAgICA8ZGQ+RGVmaW5lcyBhbiBpbnRlcmZhY2UgY29tcG9uZW50IGZvciBzaG93aW5nIGxpbnRpbmcgd2FybmluZ3MsCiAgICAgIHdpdGggcGx1Z2dhYmxlIHdhcm5pbmcgc291cmNlcwogICAgICAoc2VlIDxhIGhyZWY9Ii4uL2FkZG9uL2xpbnQvaHRtbC1saW50LmpzIj48Y29kZT5odG1sLWxpbnQuanM8L2NvZGU+PC9hPiwKICAgICAgPGEgaHJlZj0iLi4vYWRkb24vbGludC9qc29uLWxpbnQuanMiPjxjb2RlPmpzb24tbGludC5qczwvY29kZT48L2E+LAogICAgICA8YSBocmVmPSIuLi9hZGRvbi9saW50L2phdmFzY3JpcHQtbGludC5qcyI+PGNvZGU+amF2YXNjcmlwdC1saW50LmpzPC9jb2RlPjwvYT4sCiAgICAgIDxhIGhyZWY9Ii4uL2FkZG9uL2xpbnQvY29mZmVlc2NyaXB0LWxpbnQuanMiPjxjb2RlPmNvZmZlZXNjcmlwdC1saW50LmpzPC9jb2RlPjwvYT4sCiAgICAgIGFuZCA8YSBocmVmPSIuLi9hZGRvbi9saW50L2Nzcy1saW50LmpzIj48Y29kZT5jc3MtbGludC5qczwvY29kZT48L2E+CiAgICAgIGluIHRoZSBzYW1lIGRpcmVjdG9yeSkuIERlZmluZXMgYSA8Y29kZT5saW50PC9jb2RlPiBvcHRpb24gdGhhdAogICAgICBjYW4gYmUgc2V0IHRvIGFuIGFubm90YXRpb24gc291cmNlIChmb3IKICAgICAgZXhhbXBsZSA8Y29kZT5Db2RlTWlycm9yLmxpbnQuamF2YXNjcmlwdDwvY29kZT4pLCB0byBhbiBvcHRpb25zCiAgICAgIG9iamVjdCAoaW4gd2hpY2ggY2FzZSB0aGUgPGNvZGU+Z2V0QW5ub3RhdGlvbnM8L2NvZGU+IGZpZWxkIGlzCiAgICAgIHVzZWQgYXMgYW5ub3RhdGlvbiBzb3VyY2UpLCBvciBzaW1wbHkgdG8gPGNvZGU+dHJ1ZTwvY29kZT4uIFdoZW4KICAgICAgbm8gYW5ub3RhdGlvbiBzb3VyY2UgaXMKICAgICAgc3BlY2lmaWVkLCA8YSBocmVmPSIjZ2V0SGVscGVyIj48Y29kZT5nZXRIZWxwZXI8L2NvZGU+PC9hPiB3aXRoCiAgICAgIHR5cGUgPGNvZGU+ImxpbnQiPC9jb2RlPiBpcyB1c2VkIHRvIGZpbmQgYW4gYW5ub3RhdGlvbiBmdW5jdGlvbi4KICAgICAgQW4gYW5ub3RhdGlvbiBzb3VyY2UgZnVuY3Rpb24gc2hvdWxkLCB3aGVuIGdpdmVuIGEgZG9jdW1lbnQKICAgICAgc3RyaW5nLCBhbiBvcHRpb25zIG9iamVjdCwgYW5kIGFuIGVkaXRvciBpbnN0YW5jZSwgcmV0dXJuIGFuCiAgICAgIGFycmF5IG9mIDxjb2RlPnttZXNzYWdlLCBzZXZlcml0eSwgZnJvbSwgdG99PC9jb2RlPiBvYmplY3RzCiAgICAgIHJlcHJlc2VudGluZyBwcm9ibGVtcy4gV2hlbiB0aGUgZnVuY3Rpb24gaGFzCiAgICAgIGFuIDxjb2RlPmFzeW5jPC9jb2RlPiBwcm9wZXJ0eSB3aXRoIGEgdHJ1dGh5IHZhbHVlLCBpdCB3aWxsIGJlCiAgICAgIGNhbGxlZCB3aXRoIGFuIGFkZGl0aW9uYWwgc2Vjb25kIGFyZ3VtZW50LCB3aGljaCBpcyBhIGNhbGxiYWNrCiAgICAgIHRvIHBhc3MgdGhlIGFycmF5IHRvLiBCeSBkZWZhdWx0LCB0aGUgbGludGVyIHdpbGwgcnVuCiAgICAgIChkZWJvdW5jZWQpIHdoZW5ldmVyIHRoZSBkb2N1bWVudCBpcyBjaGFuZ2VkLiBZb3UgY2FuIHBhc3MKICAgICAgYSA8Y29kZT5saW50T25DaGFuZ2U6IGZhbHNlPC9jb2RlPiBvcHRpb24gdG8gZGlzYWJsZSB0aGF0LgogICAgICBEZXBlbmRzIG9uIDxjb2RlPmFkZG9uL2xpbnQvbGludC5jc3M8L2NvZGU+LiBBIGRlbW8gY2FuIGJlCiAgICAgIGZvdW5kIDxhIGhyZWY9Ii4uL2RlbW8vbGludC5odG1sIj5oZXJlPC9hPi48L2RkPgoKICAgICAgPGR0IGlkPSJhZGRvbl9tYXJrLXNlbGVjdGlvbiI+PGEgaHJlZj0iLi4vYWRkb24vc2VsZWN0aW9uL21hcmstc2VsZWN0aW9uLmpzIj48Y29kZT5zZWxlY3Rpb24vbWFyay1zZWxlY3Rpb24uanM8L2NvZGU+PC9hPjwvZHQ+CiAgICAgIDxkZD5DYXVzZXMgdGhlIHNlbGVjdGVkIHRleHQgdG8gYmUgbWFya2VkIHdpdGggdGhlIENTUyBjbGFzcwogICAgICA8Y29kZT5Db2RlTWlycm9yLXNlbGVjdGVkdGV4dDwvY29kZT4gd2hlbiB0aGUgPGNvZGU+c3R5bGVTZWxlY3RlZFRleHQ8L2NvZGU+IG9wdGlvbgogICAgICBpcyBlbmFibGVkLiBVc2VmdWwgdG8gY2hhbmdlIHRoZSBjb2xvdXIgb2YgdGhlIHNlbGVjdGlvbiAoaW4gYWRkaXRpb24gdG8gdGhlIGJhY2tncm91bmQpLAogICAgICBsaWtlIGluIDxhIGhyZWY9Ii4uL2RlbW8vbWFya3NlbGVjdGlvbi5odG1sIj50aGlzIGRlbW88L2E+LjwvZGQ+CgogICAgICA8ZHQgaWQ9ImFkZG9uX2FjdGl2ZS1saW5lIj48YSBocmVmPSIuLi9hZGRvbi9zZWxlY3Rpb24vYWN0aXZlLWxpbmUuanMiPjxjb2RlPnNlbGVjdGlvbi9hY3RpdmUtbGluZS5qczwvY29kZT48L2E+PC9kdD4KICAgICAgPGRkPkRlZmluZXMgYSA8Y29kZT5zdHlsZUFjdGl2ZUxpbmU8L2NvZGU+IG9wdGlvbiB0aGF0LCB3aGVuIGVuYWJsZWQsCiAgICAgIGdpdmVzIHRoZSB3cmFwcGVyIG9mIHRoZSBhY3RpdmUgbGluZSB0aGUgY2xhc3MgPGNvZGU+Q29kZU1pcnJvci1hY3RpdmVsaW5lPC9jb2RlPiwKICAgICAgYWRkcyBhIGJhY2tncm91bmQgd2l0aCB0aGUgY2xhc3MgPGNvZGU+Q29kZU1pcnJvci1hY3RpdmVsaW5lLWJhY2tncm91bmQ8L2NvZGU+LAogICAgICBhbmQgYWRkcyB0aGUgY2xhc3MgPGNvZGU+Q29kZU1pcnJvci1hY3RpdmVsaW5lLWd1dHRlcjwvY29kZT4gdG8gdGhlCiAgICAgIGxpbmUncyBndXR0ZXIgc3BhY2UgaXMgZW5hYmxlZC4gU2VlIHRoZQogICAgICA8YSBocmVmPSIuLi9kZW1vL2FjdGl2ZWxpbmUuaHRtbCI+ZGVtbzwvYT4uPC9kZD4KCiAgICAgIDxkdCBpZD0iYWRkb25fc2VsZWN0aW9uLXBvaW50ZXIiPjxhIGhyZWY9Ii4uL2FkZG9uL3NlbGVjdGlvbi9zZWxlY3Rpb24tcG9pbnRlci5qcyI+PGNvZGU+c2VsZWN0aW9uL3NlbGVjdGlvbi1wb2ludGVyLmpzPC9jb2RlPjwvYT48L2R0PgogICAgICA8ZGQ+RGVmaW5lcyBhIDxjb2RlPnNlbGVjdGlvblBvaW50ZXI8L2NvZGU+IG9wdGlvbiB3aGljaCB5b3UgY2FuCiAgICAgIHVzZSB0byBjb250cm9sIHRoZSBtb3VzZSBjdXJzb3IgYXBwZWFyYW5jZSB3aGVuIGhvdmVyaW5nIG92ZXIKICAgICAgdGhlIHNlbGVjdGlvbi4gSXQgY2FuIGJlIHNldCB0byBhIHN0cmluZywKICAgICAgbGlrZSA8Y29kZT4icG9pbnRlciI8L2NvZGU+LCBvciB0byB0cnVlLCBpbiB3aGljaCBjYXNlCiAgICAgIHRoZSA8Y29kZT4iZGVmYXVsdCI8L2NvZGU+IChhcnJvdykgY3Vyc29yIHdpbGwgYmUgdXNlZC4gWW91IGNhbgogICAgICBzZWUgYSBkZW1vIDxhIGhyZWY9Ii4uL21vZGUvaHRtbG1peGVkL2luZGV4Lmh0bWwiPmhlcmU8L2E+LjwvZGQ+CgogICAgICA8ZHQgaWQ9ImFkZG9uX2xvYWRtb2RlIj48YSBocmVmPSIuLi9hZGRvbi9tb2RlL2xvYWRtb2RlLmpzIj48Y29kZT5tb2RlL2xvYWRtb2RlLmpzPC9jb2RlPjwvYT48L2R0PgogICAgICA8ZGQ+RGVmaW5lcyBhIDxjb2RlPkNvZGVNaXJyb3IucmVxdWlyZU1vZGUobW9kZW5hbWUsCiAgICAgIGNhbGxiYWNrKTwvY29kZT4gZnVuY3Rpb24gdGhhdCB3aWxsIHRyeSB0byBsb2FkIGEgZ2l2ZW4gbW9kZSBhbmQKICAgICAgY2FsbCB0aGUgY2FsbGJhY2sgd2hlbiBpdCBzdWNjZWVkZWQuIFlvdSdsbCBoYXZlIHRvCiAgICAgIHNldCA8Y29kZT5Db2RlTWlycm9yLm1vZGVVUkw8L2NvZGU+IHRvIGEgc3RyaW5nIHRoYXQgbW9kZSBwYXRocwogICAgICBjYW4gYmUgY29uc3RydWN0ZWQgZnJvbSwgZm9yCiAgICAgIGV4YW1wbGUgPGNvZGU+Im1vZGUvJU4vJU4uanMiPC9jb2RlPuKAlHRoZSA8Y29kZT4lTjwvY29kZT4ncyB3aWxsCiAgICAgIGJlIHJlcGxhY2VkIHdpdGggdGhlIG1vZGUgbmFtZS4gQWxzbwogICAgICBkZWZpbmVzIDxjb2RlPkNvZGVNaXJyb3IuYXV0b0xvYWRNb2RlKGluc3RhbmNlLCBtb2RlKTwvY29kZT4sCiAgICAgIHdoaWNoIHdpbGwgZW5zdXJlIHRoZSBnaXZlbiBtb2RlIGlzIGxvYWRlZCBhbmQgY2F1c2UgdGhlIGdpdmVuCiAgICAgIGVkaXRvciBpbnN0YW5jZSB0byByZWZyZXNoIGl0cyBtb2RlIHdoZW4gdGhlIGxvYWRpbmcKICAgICAgc3VjY2VlZGVkLiBTZWUgdGhlIDxhIGhyZWY9Ii4uL2RlbW8vbG9hZG1vZGUuaHRtbCI+ZGVtbzwvYT4uPC9kZD4KCiAgICAgIDxkdCBpZD0iYWRkb25fbWV0YSI+PGEgaHJlZj0iLi4vbW9kZS9tZXRhLmpzIj48Y29kZT5tb2RlL21ldGEuanM8L2NvZGU+PC9hPjwvZHQ+CiAgICAgIDxkZD5Qcm92aWRlcyBtZXRhLWluZm9ybWF0aW9uIGFib3V0IGFsbCB0aGUgbW9kZXMgaW4gdGhlCiAgICAgIGRpc3RyaWJ1dGlvbiBpbiBhIHNpbmdsZSBmaWxlLgogICAgICBEZWZpbmVzIDxjb2RlPkNvZGVNaXJyb3IubW9kZUluZm88L2NvZGU+LCBhbiBhcnJheSBvZiBvYmplY3RzCiAgICAgIHdpdGggPGNvZGU+e25hbWUsIG1pbWUsIG1vZGV9PC9jb2RlPiBwcm9wZXJ0aWVzLAogICAgICB3aGVyZSA8Y29kZT5uYW1lPC9jb2RlPiBpcyB0aGUgaHVtYW4tcmVhZGFibGUKICAgICAgbmFtZSwgPGNvZGU+bWltZTwvY29kZT4gdGhlIE1JTUUgdHlwZSwgYW5kIDxjb2RlPm1vZGU8L2NvZGU+IHRoZQogICAgICBuYW1lIG9mIHRoZSBtb2RlIGZpbGUgdGhhdCBkZWZpbmVzIHRoaXMgTUlNRS4gVGhlcmUgYXJlIG9wdGlvbmFsCiAgICAgIHByb3BlcnRpZXMgPGNvZGU+bWltZXM8L2NvZGU+LCB3aGljaCBob2xkcyBhbiBhcnJheSBvZiBNSU1FCiAgICAgIHR5cGVzIGZvciBtb2RlcyB3aXRoIG11bHRpcGxlIE1JTUVzIGFzc29jaWF0ZWQsCiAgICAgIGFuZCA8Y29kZT5leHQ8L2NvZGU+LCB3aGljaCBob2xkcyBhbiBhcnJheSBvZiBmaWxlIGV4dGVuc2lvbnMKICAgICAgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbW9kZS4gRm91ciBjb252ZW5pZW5jZQogICAgICBmdW5jdGlvbnMsIDxjb2RlPkNvZGVNaXJyb3IuZmluZE1vZGVCeU1JTUU8L2NvZGU+LAogICAgICA8Y29kZT5Db2RlTWlycm9yLmZpbmRNb2RlQnlFeHRlbnNpb248L2NvZGU+LAogICAgICA8Y29kZT5Db2RlTWlycm9yLmZpbmRNb2RlQnlGaWxlTmFtZTwvY29kZT4KICAgICAgYW5kIDxjb2RlPkNvZGVNaXJyb3IuZmluZE1vZGVCeU5hbWU8L2NvZGU+IGFyZSBwcm92aWRlZCwgd2hpY2gKICAgICAgcmV0dXJuIHN1Y2ggYW4gb2JqZWN0IGdpdmVuIGEgTUlNRSwgZXh0ZW5zaW9uLCBmaWxlIG5hbWUgb3IgbW9kZSBuYW1lCiAgICAgIHN0cmluZy4gTm90ZSB0aGF0LCBmb3IgaGlzdG9yaWNhbCByZWFzb25zLCB0aGlzIGZpbGUgcmVzaWRlcyBpbiB0aGUKICAgICAgdG9wLWxldmVsIDxjb2RlPm1vZGU8L2NvZGU+IGRpcmVjdG9yeSwgbm90CiAgICAgIHVuZGVyIDxjb2RlPmFkZG9uPC9jb2RlPi4gPGEgaHJlZj0iLi4vZGVtby9sb2FkbW9kZS5odG1sIj5EZW1vPC9hPi48L2RkPgoKICAgICAgPGR0IGlkPSJhZGRvbl9jb250aW51ZWNvbW1lbnQiPjxhIGhyZWY9Ii4uL2FkZG9uL2NvbW1lbnQvY29udGludWVjb21tZW50LmpzIj48Y29kZT5jb21tZW50L2NvbnRpbnVlY29tbWVudC5qczwvY29kZT48L2E+PC9kdD4KICAgICAgPGRkPkFkZHMgYSA8Y29kZT5jb250aW51ZUNvbW1lbnRzPC9jb2RlPiBvcHRpb24sIHdoaWNoIHNldHMgd2hldGhlciB0aGUKICAgICAgZWRpdG9yIHdpbGwgbWFrZSB0aGUgbmV4dCBsaW5lIGNvbnRpbnVlIGEgY29tbWVudCB3aGVuIHlvdSBwcmVzcyBFbnRlcgogICAgICBpbnNpZGUgYSBjb21tZW50IGJsb2NrLiBDYW4gYmUgc2V0IHRvIGEgYm9vbGVhbiB0byBlbmFibGUvZGlzYWJsZSB0aGlzCiAgICAgIGZ1bmN0aW9uYWxpdHkuIFNldCB0byBhIHN0cmluZywgaXQgd2lsbCBjb250aW51ZSBjb21tZW50cyB1c2luZyBhIGN1c3RvbQogICAgICBzaG9ydGN1dC4gU2V0IHRvIGFuIG9iamVjdCwgaXQgd2lsbCB1c2UgdGhlIDxjb2RlPmtleTwvY29kZT4gcHJvcGVydHkgZm9yCiAgICAgIGEgY3VzdG9tIHNob3J0Y3V0IGFuZCB0aGUgYm9vbGVhbiA8Y29kZT5jb250aW51ZUxpbmVDb21tZW50PC9jb2RlPgogICAgICBwcm9wZXJ0eSB0byBkZXRlcm1pbmUgd2hldGhlciBzaW5nbGUtbGluZSBjb21tZW50cyBzaG91bGQgYmUgY29udGludWVkCiAgICAgIChkZWZhdWx0aW5nIHRvIDxjb2RlPnRydWU8L2NvZGU+KS48L2RkPgoKICAgICAgPGR0IGlkPSJhZGRvbl9wbGFjZWhvbGRlciI+PGEgaHJlZj0iLi4vYWRkb24vZGlzcGxheS9wbGFjZWhvbGRlci5qcyI+PGNvZGU+ZGlzcGxheS9wbGFjZWhvbGRlci5qczwvY29kZT48L2E+PC9kdD4KICAgICAgPGRkPkFkZHMgYSA8Y29kZT5wbGFjZWhvbGRlcjwvY29kZT4gb3B0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8KICAgICAgbWFrZSBjb250ZW50IGFwcGVhciBpbiB0aGUgZWRpdG9yIHdoZW4gaXQgaXMgZW1wdHkgYW5kIG5vdAogICAgICBmb2N1c2VkLiBJdCBjYW4gaG9sZCBlaXRoZXIgYSBzdHJpbmcgb3IgYSBET00gbm9kZS4gQWxzbyBnaXZlcwogICAgICB0aGUgZWRpdG9yIGEgPGNvZGU+Q29kZU1pcnJvci1lbXB0eTwvY29kZT4gQ1NTIGNsYXNzIHdoZW5ldmVyIGl0CiAgICAgIGRvZXNuJ3QgY29udGFpbiBhbnkgdGV4dC4KICAgICAgU2VlIDxhIGhyZWY9Ii4uL2RlbW8vcGxhY2Vob2xkZXIuaHRtbCI+dGhlIGRlbW88L2E+LjwvZGQ+CgogICAgICA8ZHQgaWQ9ImFkZG9uX2Z1bGxzY3JlZW4iPjxhIGhyZWY9Ii4uL2FkZG9uL2Rpc3BsYXkvZnVsbHNjcmVlbi5qcyI+PGNvZGU+ZGlzcGxheS9mdWxsc2NyZWVuLmpzPC9jb2RlPjwvYT48L2R0PgogICAgICA8ZGQ+RGVmaW5lcyBhbiBvcHRpb24gPGNvZGU+ZnVsbFNjcmVlbjwvY29kZT4gdGhhdCwgd2hlbiBzZXQKICAgICAgdG8gPGNvZGU+dHJ1ZTwvY29kZT4sIHdpbGwgbWFrZSB0aGUgZWRpdG9yIGZ1bGwtc2NyZWVuIChhcyBpbiwKICAgICAgdGFraW5nIHVwIHRoZSB3aG9sZSBicm93c2VyIHdpbmRvdykuIERlcGVuZHMKICAgICAgb24gPGEgaHJlZj0iLi4vYWRkb24vZGlzcGxheS9mdWxsc2NyZWVuLmNzcyI+PGNvZGU+ZnVsbHNjcmVlbi5jc3M8L2NvZGU+PC9hPi4gPGEgaHJlZj0iLi4vZGVtby9mdWxsc2NyZWVuLmh0bWwiPkRlbW8KICAgICAgaGVyZTwvYT4uPC9kZD4KCiAgICAgIDxkdCBpZD0iYWRkb25fYXV0b3JlZnJlc2giPjxhIGhyZWY9Ii4uL2FkZG9uL2Rpc3BsYXkvYXV0b3JlZnJlc2guanMiPjxjb2RlPmRpc3BsYXkvYXV0b3JlZnJlc2guanM8L2NvZGU+PC9hPjwvZHQ+CiAgICAgIDxkZD5UaGlzIGFkZG9uIGNhbiBiZSB1c2VmdWwgd2hlbiBpbml0aWFsaXppbmcgYW4gZWRpdG9yIGluIGEKICAgICAgaGlkZGVuIERPTSBub2RlLCBpbiBjYXNlcyB3aGVyZSBpdCBpcyBkaWZmaWN1bHQgdG8KICAgICAgY2FsbCA8YSBocmVmPSIjcmVmcmVzaCI+PGNvZGU+cmVmcmVzaDwvY29kZT48L2E+IHdoZW4gdGhlIGVkaXRvcgogICAgICBiZWNvbWVzIHZpc2libGUuIEl0IGRlZmluZXMgYW4gb3B0aW9uIDxjb2RlPmF1dG9SZWZyZXNoPC9jb2RlPgogICAgICB3aGljaCB5b3UgY2FuIHNldCB0byB0cnVlIHRvIGVuc3VyZSB0aGF0LCBpZiB0aGUgZWRpdG9yIHdhc24ndAogICAgICB2aXNpYmxlIG9uIGluaXRpYWxpemF0aW9uLCBpdCB3aWxsIGJlIHJlZnJlc2hlZCB0aGUgZmlyc3QgdGltZQogICAgICBpdCBiZWNvbWVzIHZpc2libGUuIFRoaXMgaXMgZG9uZSBieSBwb2xsaW5nIGV2ZXJ5IDI1MAogICAgICBtaWxsaXNlY29uZHMgKHlvdSBjYW4gcGFzcyBhIHZhbHVlIGxpa2UgPGNvZGU+e2RlbGF5OgogICAgICA1MDB9PC9jb2RlPiBhcyB0aGUgb3B0aW9uIHZhbHVlIHRvIGNvbmZpZ3VyZSB0aGlzKS4gTm90ZSB0aGF0CiAgICAgIHRoaXMgYWRkb24gd2lsbCBvbmx5IHJlZnJlc2ggdGhlIGVkaXRvciA8ZW0+b25jZTwvZW0+IHdoZW4gaXQKICAgICAgZmlyc3QgYmVjb21lcyB2aXNpYmxlLCBhbmQgd29uJ3QgdGFrZSBjYXJlIG9mIGZ1cnRoZXIgcmVzdHlsaW5nCiAgICAgIGFuZCByZXNpemluZy48L2RkPgoKICAgICAgPGR0IGlkPSJhZGRvbl9zaW1wbGVzY3JvbGxiYXJzIj48YSBocmVmPSIuLi9hZGRvbi9zY3JvbGwvc2ltcGxlc2Nyb2xsYmFycy5qcyI+PGNvZGU+c2Nyb2xsL3NpbXBsZXNjcm9sbGJhcnMuanM8L2NvZGU+PC9hPjwvZHQ+CiAgICAgIDxkZD5EZWZpbmVzIHR3byBhZGRpdGlvbmFsIHNjcm9sbGJhcgogICAgICBtb2RlbHMsIDxjb2RlPiJzaW1wbGUiPC9jb2RlPiBhbmQgPGNvZGU+Im92ZXJsYXkiPC9jb2RlPgogICAgICAoc2VlIDxhIGhyZWY9Ii4uL2RlbW8vc2ltcGxlc2Nyb2xsYmFycy5odG1sIj5kZW1vPC9hPikgdGhhdCBjYW4KICAgICAgYmUgc2VsZWN0ZWQgd2l0aAogICAgICB0aGUgPGEgaHJlZj0iI29wdGlvbl9zY3JvbGxiYXJTdHlsZSI+PGNvZGU+c2Nyb2xsYmFyU3R5bGU8L2NvZGU+PC9hPgogICAgICBvcHRpb24uIERlcGVuZHMKICAgICAgb24gPGEgaHJlZj0iLi4vYWRkb24vc2Nyb2xsL3NpbXBsZXNjcm9sbGJhcnMuY3NzIj48Y29kZT5zaW1wbGVzY3JvbGxiYXJzLmNzczwvY29kZT48L2E+LAogICAgICB3aGljaCBjYW4gYmUgZnVydGhlciBvdmVycmlkZGVuIHRvIHN0eWxlIHlvdXIgb3duCiAgICAgIHNjcm9sbGJhcnMuPC9kZD4KCiAgICAgIDxkdCBpZD0iYWRkb25fYW5ub3RhdGVzY3JvbGxiYXIiPjxhIGhyZWY9Ii4uL2FkZG9uL3Njcm9sbC9hbm5vdGF0ZXNjcm9sbGJhci5qcyI+PGNvZGU+c2Nyb2xsL2Fubm90YXRlc2Nyb2xsYmFyLmpzPC9jb2RlPjwvYT48L2R0PgogICAgICA8ZGQ+UHJvdmlkZXMgZnVuY3Rpb25hbGl0eSBmb3Igc2hvd2luZyBtYXJrZXJzIG9uIHRoZSBzY3JvbGxiYXIKICAgICAgdG8gY2FsbCBvdXQgY2VydGFpbiBwYXJ0cyBvZiB0aGUgZG9jdW1lbnQuIEFkZHMgYQogICAgICBtZXRob2QgPGNvZGU+YW5ub3RhdGVTY3JvbGxiYXI8L2NvZGU+IHRvIGVkaXRvciBpbnN0YW5jZXMgdGhhdAogICAgICBjYW4gYmUgY2FsbGVkLCB3aXRoIGEgQ1NTIGNsYXNzIG5hbWUgYXMgYXJndW1lbnQsIHRvIGNyZWF0ZSBhCiAgICAgIHNldCBvZiBhbm5vdGF0aW9ucy4gVGhlIG1ldGhvZCByZXR1cm5zIGFuIG9iamVjdAogICAgICB3aG9zZSA8Y29kZT51cGRhdGU8L2NvZGU+IG1ldGhvZCBjYW4gYmUgY2FsbGVkIHdpdGggYW4gYXJyYXkKICAgICAgb2YgPGNvZGU+e2Zyb206IFBvcywgdG86IFBvc308L2NvZGU+IG9iamVjdHMgbWFya2luZyB0aGUgcmFuZ2VzCiAgICAgIHRvIGJlIGhpZ2hsaWdodGVkLiBUbyBkZXRhY2ggdGhlIGFubm90YXRpb25zLCBjYWxsIHRoZQogICAgICBvYmplY3QncyA8Y29kZT5jbGVhcjwvY29kZT4gbWV0aG9kLjwvZGQ+CgogICAgICA8ZHQgaWQ9ImFkZG9uX3J1bGVycyI+PGEgaHJlZj0iLi4vYWRkb24vZGlzcGxheS9ydWxlcnMuanMiPjxjb2RlPmRpc3BsYXkvcnVsZXJzLmpzPC9jb2RlPjwvYT48L2R0PgogICAgICA8ZGQ+QWRkcyBhIDxjb2RlPnJ1bGVyczwvY29kZT4gb3B0aW9uLCB3aGljaCBjYW4gYmUgdXNlZCB0byBzaG93CiAgICAgIG9uZSBvciBtb3JlIHZlcnRpY2FsIHJ1bGVycyBpbiB0aGUgZWRpdG9yLiBUaGUgb3B0aW9uLCBpZgogICAgICBkZWZpbmVkLCBzaG91bGQgYmUgZ2l2ZW4gYW4gYXJyYXkgb2YgPGNvZGU+e2NvbHVtbiBbLCBjbGFzc05hbWUsCiAgICAgIGNvbG9yLCBsaW5lU3R5bGUsIHdpZHRoXX08L2NvZGU+IG9iamVjdHMgb3IgbnVtYmVycyAod2hpY2gKICAgICAgaW5kaWNhdGUgYSBjb2x1bW4pLiBUaGUgcnVsZXIgd2lsbCBiZSBkaXNwbGF5ZWQgYXQgdGhlIGNvbHVtbgogICAgICBpbmRpY2F0ZWQgYnkgdGhlIG51bWJlciBvciB0aGUgPGNvZGU+Y29sdW1uPC9jb2RlPiBwcm9wZXJ0eS4KICAgICAgVGhlIDxjb2RlPmNsYXNzTmFtZTwvY29kZT4gcHJvcGVydHkgY2FuIGJlIHVzZWQgdG8gYXNzaWduIGEKICAgICAgY3VzdG9tIHN0eWxlIHRvIGEgcnVsZXIuIDxhIGhyZWY9Ii4uL2RlbW8vcnVsZXJzLmh0bWwiPkRlbW8KICAgICAgaGVyZTwvYT4uPC9kZD4KCiAgICAgIDxkdCBpZD0iYWRkb25fcGFuZWwiPjxhIGhyZWY9Ii4uL2FkZG9uL2Rpc3BsYXkvcGFuZWwuanMiPjxjb2RlPmRpc3BsYXkvcGFuZWwuanM8L2NvZGU+PC9hPjwvZHQ+CiAgICAgIDxkZD5EZWZpbmVzIGFuIDxjb2RlPmFkZFBhbmVsPC9jb2RlPiBtZXRob2QgZm9yIENvZGVNaXJyb3IKICAgICAgaW5zdGFuY2VzLCB3aGljaCBwbGFjZXMgYSBET00gbm9kZSBhYm92ZSBvciBiZWxvdyBhbiBlZGl0b3IsIGFuZAogICAgICBzaHJpbmtzIHRoZSBlZGl0b3IgdG8gbWFrZSByb29tIGZvciB0aGUgbm9kZS4gVGhlIG1ldGhvZCB0YWtlcwogICAgICBhcyBmaXJzdCBhcmd1bWVudCBhcyBET00gbm9kZSwgYW5kIGFzIHNlY29uZCBhbiBvcHRpb25hbCBvcHRpb25zCiAgICAgIG9iamVjdC4gVGhlIDxjb2RlPlBhbmVsPC9jb2RlPiBvYmplY3QgcmV0dXJuZWQgYnkgdGhpcyBtZXRob2QKICAgICAgaGFzIGEgPGNvZGU+Y2xlYXI8L2NvZGU+IG1ldGhvZCB0aGF0IGlzIHVzZWQgdG8gcmVtb3ZlIHRoZQogICAgICBwYW5lbCwgYW5kIGEgPGNvZGU+Y2hhbmdlZDwvY29kZT4gbWV0aG9kIHRoYXQgY2FuIGJlIHVzZWQgdG8KICAgICAgbm90aWZ5IHRoZSBhZGRvbiB3aGVuIHRoZSBzaXplIG9mIHRoZSBwYW5lbCdzIERPTSBub2RlIGhhcwogICAgICBjaGFuZ2VkLjxici8+CiAgICAgIFRoZSBtZXRob2QgYWNjZXB0cyB0aGUgZm9sbG93aW5nIG9wdGlvbnM6CiAgICAgIDxkbD4KICAgICAgICA8ZHQ+PGNvZGU+PHN0cm9uZz5wb3NpdGlvbjwvc3Ryb25nPiA6IHN0cmluZzwvY29kZT48L2R0PgogICAgICAgIDxkZD5Db250cm9scyB0aGUgcG9zaXRpb24gb2YgdGhlIG5ld2x5IGFkZGVkIHBhbmVsLiBUaGUKICAgICAgICBmb2xsb3dpbmcgdmFsdWVzIGFyZSByZWNvZ25pemVkOgogICAgICAgICAgPGRsPgogICAgICAgICAgICA8ZHQ+PGNvZGU+PHN0cm9uZz50b3A8L3N0cm9uZz4gKGRlZmF1bHQpPC9jb2RlPjwvZHQ+CiAgICAgICAgICAgIDxkZD5BZGRzIHRoZSBwYW5lbCBhdCB0aGUgdmVyeSB0b3AuPC9kZD4KICAgICAgICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+YWZ0ZXItdG9wPC9zdHJvbmc+PC9jb2RlPjwvZHQ+CiAgICAgICAgICAgIDxkZD5BZGRzIHRoZSBwYW5lbCBhdCB0aGUgYm90dG9tIG9mIHRoZSB0b3AgcGFuZWxzLjwvZGQ+CiAgICAgICAgICAgIDxkdD48Y29kZT48c3Ryb25nPmJvdHRvbTwvc3Ryb25nPjwvY29kZT48L2R0PgogICAgICAgICAgICA8ZGQ+QWRkcyB0aGUgcGFuZWwgYXQgdGhlIHZlcnkgYm90dG9tLjwvZGQ+CiAgICAgICAgICAgIDxkdD48Y29kZT48c3Ryb25nPmJlZm9yZS1ib3R0b208L3N0cm9uZz48L2NvZGU+PC9kdD4KICAgICAgICAgICAgPGRkPkFkZHMgdGhlIHBhbmVsIGF0IHRoZSB0b3Agb2YgdGhlIGJvdHRvbSBwYW5lbHMuPC9kZD4KICAgICAgICAgIDwvZGw+CiAgICAgICAgPC9kZD4KICAgICAgICA8ZHQ+PGNvZGU+PHN0cm9uZz5iZWZvcmU8L3N0cm9uZz4gOiBQYW5lbDwvY29kZT48L2R0PgogICAgICAgIDxkZD5UaGUgbmV3IHBhbmVsIHdpbGwgYmUgYWRkZWQgYmVmb3JlIHRoZSBnaXZlbiBwYW5lbC48L2RkPgogICAgICAgIDxkdD48Y29kZT48c3Ryb25nPmFmdGVyPC9zdHJvbmc+IDogUGFuZWw8L2NvZGU+PC9kdD4KICAgICAgICA8ZGQ+VGhlIG5ldyBwYW5lbCB3aWxsIGJlIGFkZGVkIGFmdGVyIHRoZSBnaXZlbiBwYW5lbC48L2RkPgogICAgICAgIDxkdD48Y29kZT48c3Ryb25nPnJlcGxhY2U8L3N0cm9uZz4gOiBQYW5lbDwvY29kZT48L2R0PgogICAgICAgIDxkZD5UaGUgbmV3IHBhbmVsIHdpbGwgcmVwbGFjZSB0aGUgZ2l2ZW4gcGFuZWwuPC9kZD4KICAgICAgPC9kbD4KICAgICAgV2hlbiB1c2luZyB0aGUgPGNvZGU+YWZ0ZXI8L2NvZGU+LCA8Y29kZT5iZWZvcmU8L2NvZGU+IG9yIDxjb2RlPnJlcGxhY2U8L2NvZGU+IG9wdGlvbnMsCiAgICAgIGlmIHRoZSBwYW5lbCBkb2Vzbid0IGV4aXN0cyBvciBoYXMgYmVlbiByZW1vdmVkLAogICAgICB0aGUgdmFsdWUgb2YgdGhlIDxjb2RlPnBvc2l0aW9uPC9jb2RlPiBvcHRpb24gd2lsbCBiZSB1c2VkIGFzIGEgZmFsbGJhY2suCiAgICAgIDxicj4KICAgICAgQSBkZW1vIG9mIHRoZSBhZGRvbiBpcyBhdmFpbGFibGUgPGEgaHJlZj0iLi4vZGVtby9wYW5lbC5odG1sIj5oZXJlPC9hPi4KICAgICAgPC9kZD4KCiAgICAgIDxkdCBpZD0iYWRkb25faGFyZHdyYXAiPjxhIGhyZWY9Ii4uL2FkZG9uL3dyYXAvaGFyZHdyYXAuanMiPjxjb2RlPndyYXAvaGFyZHdyYXAuanM8L2NvZGU+PC9hPjwvZHQ+CiAgICAgIDxkZD5BZGRvbiB0byBwZXJmb3JtIGhhcmQgbGluZSB3cmFwcGluZy9icmVha2luZyBmb3IgcGFyYWdyYXBocwogICAgICBvZiB0ZXh0LiBBZGRzIHRoZXNlIG1ldGhvZHMgdG8gZWRpdG9yIGluc3RhbmNlczoKICAgICAgICA8ZGw+CiAgICAgICAgICA8ZHQ+PGNvZGU+PHN0cm9uZz53cmFwUGFyYWdyYXBoPC9zdHJvbmc+KD9wb3M6IHtsaW5lLCBjaH0sID9vcHRpb25zOiBvYmplY3QpPC9jb2RlPjwvZHQ+CiAgICAgICAgICA8ZGQ+V3JhcHMgdGhlIHBhcmFncmFwaCBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24uCiAgICAgICAgICBJZiA8Y29kZT5wb3M8L2NvZGU+IGlzIG5vdCBnaXZlbiwgaXQgZGVmYXVsdHMgdG8gdGhlIGN1cnNvcgogICAgICAgICAgcG9zaXRpb24uPC9kZD4KICAgICAgICAgIDxkdD48Y29kZT48c3Ryb25nPndyYXBSYW5nZTwvc3Ryb25nPihmcm9tOiB7bGluZSwgY2h9LCB0bzoge2xpbmUsIGNofSwgP29wdGlvbnM6IG9iamVjdCk8L2NvZGU+PC9kdD4KICAgICAgICAgIDxkZD5XcmFwcyB0aGUgZ2l2ZW4gcmFuZ2UgYXMgb25lIGJpZyBwYXJhZ3JhcGguPC9kZD4KICAgICAgICAgIDxkdD48Y29kZT48c3Ryb25nPndyYXBQYXJhZ3JhcGhzSW5SYW5nZTwvc3Ryb25nPihmcm9tOiB7bGluZSwgY2h9LCB0bzoge2xpbmUsIGNofSwgP29wdGlvbnM6IG9iamVjdCk8L2NvZGU+PC9kdD4KICAgICAgICAgIDxkZD5XcmFwcyB0aGUgcGFyYWdyYXBocyBpbiAoYW5kIG92ZXJsYXBwaW5nIHdpdGgpIHRoZQogICAgICAgICAgZ2l2ZW4gcmFuZ2UgaW5kaXZpZHVhbGx5LjwvZGQ+CiAgICAgICAgPC9kbD4KICAgICAgICBUaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIHJlY29nbml6ZWQ6CiAgICAgICAgPGRsPgogICAgICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+cGFyYWdyYXBoU3RhcnQ8L3N0cm9uZz4sIDxzdHJvbmc+cGFyYWdyYXBoRW5kPC9zdHJvbmc+OiBSZWdFeHA8L2NvZGU+PC9kdD4KICAgICAgICAgIDxkZD5CbGFuayBsaW5lcyBhcmUgYWx3YXlzIGNvbnNpZGVyZWQgcGFyYWdyYXBoIGJvdW5kYXJpZXMuCiAgICAgICAgICBUaGVzZSBvcHRpb25zIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBwYXR0ZXJuIHRoYXQgY2F1c2VzCiAgICAgICAgICBsaW5lcyB0byBiZSBjb25zaWRlcmVkIHRoZSBzdGFydCBvciBlbmQgb2YgYSBwYXJhZ3JhcGguPC9kZD4KICAgICAgICAgIDxkdD48Y29kZT48c3Ryb25nPmNvbHVtbjwvc3Ryb25nPjogbnVtYmVyPC9jb2RlPjwvZHQ+CiAgICAgICAgICA8ZGQ+VGhlIGNvbHVtbiB0byB3cmFwIGF0LiBEZWZhdWx0cyB0byA4MC48L2RkPgogICAgICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+d3JhcE9uPC9zdHJvbmc+OiBSZWdFeHA8L2NvZGU+PC9kdD4KICAgICAgICAgIDxkZD5BIHJlZ3VsYXIgZXhwcmVzc2lvbiB0aGF0IG1hdGNoZXMgb25seSB0aG9zZQogICAgICAgICAgdHdvLWNoYXJhY3RlciBzdHJpbmdzIHRoYXQgYWxsb3cgd3JhcHBpbmcuIEJ5IGRlZmF1bHQsIHRoZQogICAgICAgICAgYWRkb24gd3JhcHMgb24gd2hpdGVzcGFjZSBhbmQgYWZ0ZXIgZGFzaCBjaGFyYWN0ZXJzLjwvZGQ+CiAgICAgICAgICA8ZHQ+PGNvZGU+PHN0cm9uZz5raWxsVHJhaWxpbmdTcGFjZTwvc3Ryb25nPjogYm9vbGVhbjwvY29kZT48L2R0PgogICAgICAgICAgPGRkPldoZXRoZXIgdHJhaWxpbmcgc3BhY2UgY2F1c2VkIGJ5IHdyYXBwaW5nIHNob3VsZCBiZQogICAgICAgICAgcHJlc2VydmVkLCBvciBkZWxldGVkLiBEZWZhdWx0cyB0byB0cnVlLjwvZGQ+CiAgICAgICAgPC9kbD4KICAgICAgICBBIGRlbW8gb2YgdGhlIGFkZG9uIGlzIGF2YWlsYWJsZSA8YSBocmVmPSIuLi9kZW1vL2hhcmR3cmFwLmh0bWwiPmhlcmU8L2E+LgogICAgICA8L2RkPgoKICAgICAgPGR0IGlkPSJhZGRvbl9tZXJnZSI+PGEgaHJlZj0iLi4vYWRkb24vbWVyZ2UvbWVyZ2UuanMiPjxjb2RlPm1lcmdlL21lcmdlLmpzPC9jb2RlPjwvYT48L2R0PgogICAgICA8ZGQ+SW1wbGVtZW50cyBhbiBpbnRlcmZhY2UgZm9yIG1lcmdpbmcgY2hhbmdlcywgdXNpbmcgZWl0aGVyIGEKICAgICAgMi13YXkgb3IgYSAzLXdheSB2aWV3LiBUaGUgPGNvZGU+Q29kZU1pcnJvci5NZXJnZVZpZXc8L2NvZGU+CiAgICAgIGNvbnN0cnVjdG9yIHRha2VzIGFyZ3VtZW50cyBzaW1pbGFyIHRvCiAgICAgIHRoZSA8YSBocmVmPSIjQ29kZU1pcnJvciI+PGNvZGU+Q29kZU1pcnJvcjwvY29kZT48L2E+CiAgICAgIGNvbnN0cnVjdG9yLCBmaXJzdCBhIG5vZGUgdG8gYXBwZW5kIHRoZSBpbnRlcmZhY2UgdG8sIGFuZCB0aGVuCiAgICAgIGFuIG9wdGlvbnMgb2JqZWN0LiBPcHRpb25zIGFyZSBwYXNzZWQgdGhyb3VnaCB0byB0aGUgZWRpdG9ycwogICAgICBpbnNpZGUgdGhlIHZpZXcuIFRoZXNlIGV4dHJhIG9wdGlvbnMgYXJlIHJlY29nbml6ZWQ6CiAgICAgICAgPGRsPgogICAgICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+b3JpZ0xlZnQ8L3N0cm9uZz48L2NvZGU+IGFuZCA8Y29kZT48c3Ryb25nPm9yaWdSaWdodDwvc3Ryb25nPjogc3RyaW5nPC9jb2RlPjwvZHQ+CiAgICAgICAgICA8ZGQ+SWYgZ2l2ZW4gdGhlc2UgcHJvdmlkZSBvcmlnaW5hbCB2ZXJzaW9ucyBvZiB0aGUKICAgICAgICAgIGRvY3VtZW50LCB3aGljaCB3aWxsIGJlIHNob3duIHRvIHRoZSBsZWZ0IGFuZCByaWdodCBvZiB0aGUKICAgICAgICAgIGVkaXRvciBpbiBub24tZWRpdGFibGUgQ29kZU1pcnJvciBpbnN0YW5jZXMuIFRoZSBtZXJnZQogICAgICAgICAgaW50ZXJmYWNlIHdpbGwgaGlnaGxpZ2h0IGNoYW5nZXMgYmV0d2VlbiB0aGUgZWRpdGFibGUKICAgICAgICAgIGRvY3VtZW50IGFuZCB0aGUgb3JpZ2luYWwocykuIFRvIGNyZWF0ZSBhIDItd2F5IChhcyBvcHBvc2VkCiAgICAgICAgICB0byAzLXdheSkgbWVyZ2UgdmlldywgcHJvdmlkZSBvbmx5IG9uZSBvZiB0aGVtLjwvZGQ+CiAgICAgICAgICA8ZHQ+PGNvZGU+PHN0cm9uZz5yZXZlcnRCdXR0b25zPC9zdHJvbmc+OiBib29sZWFuPC9jb2RlPjwvZHQ+CiAgICAgICAgICA8ZGQ+RGV0ZXJtaW5lcyB3aGV0aGVyIGJ1dHRvbnMgdGhhdCBhbGxvdyB0aGUgdXNlciB0byByZXZlcnQKICAgICAgICAgIGNoYW5nZXMgYXJlIHNob3duLiBEZWZhdWx0cyB0byB0cnVlLjwvZGQ+CiAgICAgICAgICA8ZHQ+PGNvZGU+PHN0cm9uZz5jb25uZWN0PC9zdHJvbmc+OiBzdHJpbmc8L2NvZGU+PC9kdD4KICAgICAgICAgIDxkZD5TZXRzIHRoZSBzdHlsZSB1c2VkIHRvIGNvbm5lY3QgY2hhbmdlZCBjaHVua3Mgb2YgY29kZS4KICAgICAgICAgIEJ5IGRlZmF1bHQsIGNvbm5lY3RvcnMgYXJlIGRyYXduLiBXaGVuIHRoaXMgaXMgc2V0CiAgICAgICAgICB0byA8Y29kZT4iYWxpZ24iPC9jb2RlPiwgdGhlIHNtYWxsZXIgY2h1bmsgaXMgcGFkZGVkIHRvCiAgICAgICAgICBhbGlnbiB3aXRoIHRoZSBiaWdnZXIgY2h1bmsgaW5zdGVhZC48L2RkPgogICAgICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+Y29sbGFwc2VJZGVudGljYWw8L3N0cm9uZz46IGJvb2xlYW58bnVtYmVyPC9jb2RlPjwvZHQ+CiAgICAgICAgICA8ZGQ+V2hlbiB0cnVlIChkZWZhdWx0IGlzIGZhbHNlKSwgc3RyZXRjaGVzIG9mIHVuY2hhbmdlZAogICAgICAgICAgdGV4dCB3aWxsIGJlIGNvbGxhcHNlZC4gV2hlbiBhIG51bWJlciBpcyBnaXZlbiwgdGhpcwogICAgICAgICAgaW5kaWNhdGVzIHRoZSBhbW91bnQgb2YgbGluZXMgdG8gbGVhdmUgdmlzaWJsZSBhcm91bmQgc3VjaAogICAgICAgICAgc3RyZXRjaGVzICh3aGljaCBkZWZhdWx0cyB0byAyKS48L2RkPgogICAgICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+YWxsb3dFZGl0aW5nT3JpZ2luYWxzPC9zdHJvbmc+OiBib29sZWFuPC9jb2RlPjwvZHQ+CiAgICAgICAgICA8ZGQ+RGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBvcmlnaW5hbCBlZGl0b3IgYWxsb3dzIGVkaXRpbmcuCiAgICAgICAgICBEZWZhdWx0cyB0byBmYWxzZS48L2RkPgogICAgICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+c2hvd0RpZmZlcmVuY2VzPC9zdHJvbmc+OiBib29sZWFuPC9jb2RlPjwvZHQ+CiAgICAgICAgICA8ZGQ+V2hlbiB0cnVlICh0aGUgZGVmYXVsdCksIGNoYW5nZWQgcGllY2VzIG9mIHRleHQgYXJlCiAgICAgICAgICBoaWdobGlnaHRlZC48L2RkPgogICAgICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+Y2h1bmtDbGFzc0xvY2F0aW9uPC9zdHJvbmc+OiBzdHJpbmd8QXJyYXk8L2NvZGU+PC9kdD4KICAgICAgICAgIDxkZD5CeSBkZWZhdWx0IHRoZSBjaHVuayBoaWdobGlnaHRzIGFyZSBhZGRlZAogICAgICAgICAgdXNpbmcgPGEgaHJlZj0iI2FkZExpbmVDbGFzcyI+PGNvZGU+YWRkTGluZUNsYXNzPC9jb2RlPjwvYT4KICAgICAgICAgIHdpdGggImJhY2tncm91bmQiLiBPdmVycmlkZSB0aGlzIHRvIGN1c3RvbWl6ZSBpdCB0byBiZSBhbnkKICAgICAgICAgIHZhbGlkIGB3aGVyZWAgcGFyYW1ldGVyIG9yIGFuIEFycmF5IG9mIHZhbGlkIGB3aGVyZWAKICAgICAgICAgIHBhcmFtZXRlcnMuPC9kZD4KICAgICAgICA8L2RsPgogICAgICAgIFRoZSBhZGRvbiBhbHNvIGRlZmluZXMgY29tbWFuZHMgPGNvZGU+ImdvTmV4dERpZmYiPC9jb2RlPgogICAgICAgIGFuZCA8Y29kZT4iZ29QcmV2RGlmZiI8L2NvZGU+IHRvIHF1aWNrbHkganVtcCB0byB0aGUgbmV4dAogICAgICAgIGNoYW5nZWQgY2h1bmsuIDxhIGhyZWY9Ii4uL2RlbW8vbWVyZ2UuaHRtbCI+RGVtbwogICAgICAgIGhlcmU8L2E+LjwvZGQ+CgogICAgICA8ZHQgaWQ9ImFkZG9uX3Rlcm4iPjxhIGhyZWY9Ii4uL2FkZG9uL3Rlcm4vdGVybi5qcyI+PGNvZGU+dGVybi90ZXJuLmpzPC9jb2RlPjwvYT48L2R0PgogICAgICA8ZGQ+UHJvdmlkZXMgaW50ZWdyYXRpb24gd2l0aAogICAgICB0aGUgPGEgaHJlZj0iaHR0cDovL3Rlcm5qcy5uZXQiPlRlcm48L2E+IEphdmFTY3JpcHQgYW5hbHlzaXMKICAgICAgZW5naW5lLCBmb3IgY29tcGxldGlvbiwgZGVmaW5pdGlvbiBmaW5kaW5nLCBhbmQgbWlub3IKICAgICAgcmVmYWN0b3JpbmcgaGVscC4gU2VlIHRoZSA8YSBocmVmPSIuLi9kZW1vL3Rlcm4uaHRtbCI+ZGVtbzwvYT4KICAgICAgZm9yIGEgdmVyeSBzaW1wbGUgaW50ZWdyYXRpb24uIEZvciBtb3JlIGludm9sdmVkIHNjZW5hcmlvcywgc2VlCiAgICAgIHRoZSBjb21tZW50cyBhdCB0aGUgdG9wIG9mCiAgICAgIHRoZSA8YSBocmVmPSIuLi9hZGRvbi90ZXJuL3Rlcm4uanMiPmFkZG9uPC9hPiBhbmQgdGhlCiAgICAgIGltcGxlbWVudGF0aW9uIG9mIHRoZQogICAgICAobXVsdGktZmlsZSkgPGEgaHJlZj0iaHR0cDovL3Rlcm5qcy5uZXQvZG9jL2RlbW8uaHRtbCI+ZGVtb25zdHJhdGlvbgogICAgICBvbiB0aGUgVGVybiB3ZWJzaXRlPC9hPi48L2RkPgogICAgPC9kbD4KPC9zZWN0aW9uPgoKPHNlY3Rpb24gaWQ9bW9kZWFwaT4KICAgIDxoMj5Xcml0aW5nIENvZGVNaXJyb3IgTW9kZXM8L2gyPgoKICAgIDxwPk1vZGVzIHR5cGljYWxseSBjb25zaXN0IG9mIGEgc2luZ2xlIEphdmFTY3JpcHQgZmlsZS4gVGhpcyBmaWxlCiAgICBkZWZpbmVzLCBpbiB0aGUgc2ltcGxlc3QgY2FzZSwgYSBsZXhlciAodG9rZW5pemVyKSBmb3IgeW91cgogICAgbGFuZ3VhZ2XigJRhIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYSBjaGFyYWN0ZXIgc3RyZWFtIGFzIGlucHV0LAogICAgYWR2YW5jZXMgaXQgcGFzdCBhIHRva2VuLCBhbmQgcmV0dXJucyBhIHN0eWxlIGZvciB0aGF0IHRva2VuLiBNb3JlCiAgICBhZHZhbmNlZCBtb2RlcyBjYW4gYWxzbyBoYW5kbGUgaW5kZW50YXRpb24gZm9yIHRoZSBsYW5ndWFnZS48L3A+CgogICAgPHA+VGhpcyBzZWN0aW9uIGRlc2NyaWJlcyB0aGUgbG93LWxldmVsIG1vZGUgaW50ZXJmYWNlLiBNYW55IG1vZGVzCiAgICBhcmUgd3JpdHRlbiBkaXJlY3RseSBhZ2FpbnN0IHRoaXMsIHNpbmNlIGl0IG9mZmVycyBhIGxvdCBvZgogICAgY29udHJvbCwgYnV0IGZvciBhIHF1aWNrIG1vZGUgZGVmaW5pdGlvbiwgeW91IG1pZ2h0IHdhbnQgdG8gdXNlCiAgICB0aGUgPGEgaHJlZj0iLi4vZGVtby9zaW1wbGVtb2RlLmh0bWwiPnNpbXBsZSBtb2RlIGFkZG9uPC9hPi48L3A+CgogICAgPHAgaWQ9ImRlZmluZU1vZGUiPlRoZSBtb2RlIHNjcmlwdCBzaG91bGQKICAgIGNhbGwgPGNvZGU+PHN0cm9uZz5Db2RlTWlycm9yLmRlZmluZU1vZGU8L3N0cm9uZz48L2NvZGU+IHRvCiAgICByZWdpc3RlciBpdHNlbGYgd2l0aCBDb2RlTWlycm9yLiBUaGlzIGZ1bmN0aW9uIHRha2VzIHR3bwogICAgYXJndW1lbnRzLiBUaGUgZmlyc3Qgc2hvdWxkIGJlIHRoZSBuYW1lIG9mIHRoZSBtb2RlLCBmb3Igd2hpY2ggeW91CiAgICBzaG91bGQgdXNlIGEgbG93ZXJjYXNlIHN0cmluZywgcHJlZmVyYWJseSBvbmUgdGhhdCBpcyBhbHNvIHRoZQogICAgbmFtZSBvZiB0aGUgZmlsZXMgdGhhdCBkZWZpbmUgdGhlIG1vZGUgKGkuZS4gPGNvZGU+InhtbCI8L2NvZGU+IGlzCiAgICBkZWZpbmVkIGluIDxjb2RlPnhtbC5qczwvY29kZT4pLiBUaGUgc2Vjb25kIGFyZ3VtZW50IHNob3VsZCBiZSBhCiAgICBmdW5jdGlvbiB0aGF0LCBnaXZlbiBhIENvZGVNaXJyb3IgY29uZmlndXJhdGlvbiBvYmplY3QgKHRoZSB0aGluZwogICAgcGFzc2VkIHRvIHRoZSA8Y29kZT5Db2RlTWlycm9yPC9jb2RlPiBmdW5jdGlvbikgYW5kIGFuIG9wdGlvbmFsCiAgICBtb2RlIGNvbmZpZ3VyYXRpb24gb2JqZWN0IChhcyBpbgogICAgdGhlIDxhIGhyZWY9IiNvcHRpb25fbW9kZSI+PGNvZGU+bW9kZTwvY29kZT48L2E+IG9wdGlvbiksIHJldHVybnMKICAgIGEgbW9kZSBvYmplY3QuPC9wPgoKICAgIDxwPlR5cGljYWxseSwgeW91IHNob3VsZCB1c2UgdGhpcyBzZWNvbmQgYXJndW1lbnQKICAgIHRvIDxjb2RlPmRlZmluZU1vZGU8L2NvZGU+IGFzIHlvdXIgbW9kdWxlIHNjb3BlIGZ1bmN0aW9uIChtb2RlcwogICAgc2hvdWxkIG5vdCBsZWFrIGFueXRoaW5nIGludG8gdGhlIGdsb2JhbCBzY29wZSEpLCBpLmUuIHdyaXRlIHlvdXIKICAgIHdob2xlIG1vZGUgaW5zaWRlIHRoaXMgZnVuY3Rpb24uPC9wPgoKICAgIDxwPlRoZSBtYWluIHJlc3BvbnNpYmlsaXR5IG9mIGEgbW9kZSBzY3JpcHQgaXMgPGVtPnBhcnNpbmc8L2VtPgogICAgdGhlIGNvbnRlbnQgb2YgdGhlIGVkaXRvci4gRGVwZW5kaW5nIG9uIHRoZSBsYW5ndWFnZSBhbmQgdGhlCiAgICBhbW91bnQgb2YgZnVuY3Rpb25hbGl0eSBkZXNpcmVkLCB0aGlzIGNhbiBiZSBkb25lIGluIHJlYWxseSBlYXN5CiAgICBvciBleHRyZW1lbHkgY29tcGxpY2F0ZWQgd2F5cy4gU29tZSBwYXJzZXJzIGNhbiBiZSBzdGF0ZWxlc3MsCiAgICBtZWFuaW5nIHRoYXQgdGhleSBsb29rIGF0IG9uZSBlbGVtZW50ICg8ZW0+dG9rZW48L2VtPikgb2YgdGhlIGNvZGUKICAgIGF0IGEgdGltZSwgd2l0aCBubyBtZW1vcnkgb2Ygd2hhdCBjYW1lIGJlZm9yZS4gTW9zdCwgaG93ZXZlciwgd2lsbAogICAgbmVlZCB0byByZW1lbWJlciBzb21ldGhpbmcuIFRoaXMgaXMgZG9uZSBieSB1c2luZyBhIDxlbT5zdGF0ZQogICAgb2JqZWN0PC9lbT4sIHdoaWNoIGlzIGFuIG9iamVjdCB0aGF0IGlzIGFsd2F5cyBwYXNzZWQgd2hlbgogICAgcmVhZGluZyBhIHRva2VuLCBhbmQgd2hpY2ggY2FuIGJlIG11dGF0ZWQgYnkgdGhlIHRva2VuaXplci48L3A+CgogICAgPHAgaWQ9InN0YXJ0U3RhdGUiPk1vZGVzIHRoYXQgdXNlIGEgc3RhdGUgbXVzdCBkZWZpbmUKICAgIGEgPGNvZGU+PHN0cm9uZz5zdGFydFN0YXRlPC9zdHJvbmc+PC9jb2RlPiBtZXRob2Qgb24gdGhlaXIgbW9kZQogICAgb2JqZWN0LiBUaGlzIGlzIGEgZnVuY3Rpb24gb2Ygbm8gYXJndW1lbnRzIHRoYXQgcHJvZHVjZXMgYSBzdGF0ZQogICAgb2JqZWN0IHRvIGJlIHVzZWQgYXQgdGhlIHN0YXJ0IG9mIGEgZG9jdW1lbnQuPC9wPgoKICAgIDxwIGlkPSJ0b2tlbiI+VGhlIG1vc3QgaW1wb3J0YW50IHBhcnQgb2YgYSBtb2RlIG9iamVjdCBpcwogICAgaXRzIDxjb2RlPjxzdHJvbmc+dG9rZW48L3N0cm9uZz4oc3RyZWFtLCBzdGF0ZSk8L2NvZGU+IG1ldGhvZC4gQWxsCiAgICBtb2RlcyBtdXN0IGRlZmluZSB0aGlzIG1ldGhvZC4gSXQgc2hvdWxkIHJlYWQgb25lIHRva2VuIGZyb20gdGhlCiAgICBzdHJlYW0gaXQgaXMgZ2l2ZW4gYXMgYW4gYXJndW1lbnQsIG9wdGlvbmFsbHkgdXBkYXRlIGl0cyBzdGF0ZSwKICAgIGFuZCByZXR1cm4gYSBzdHlsZSBzdHJpbmcsIG9yIDxjb2RlPm51bGw8L2NvZGU+IGZvciB0b2tlbnMgdGhhdCBkbwogICAgbm90IGhhdmUgdG8gYmUgc3R5bGVkLiBGb3IgeW91ciBzdHlsZXMsIHlvdSBhcmUgZW5jb3VyYWdlZCB0byB1c2UKICAgIHRoZSAnc3RhbmRhcmQnIG5hbWVzIGRlZmluZWQgaW4gdGhlIHRoZW1lcyAod2l0aG91dAogICAgdGhlIDxjb2RlPmNtLTwvY29kZT4gcHJlZml4KS4gSWYgdGhhdCBmYWlscywgaXQgaXMgYWxzbyBwb3NzaWJsZQogICAgdG8gY29tZSB1cCB3aXRoIHlvdXIgb3duIGFuZCB3cml0ZSB5b3VyIG93biBDU1MgdGhlbWUgZmlsZS48cD4KCiAgICA8cCBpZD0idG9rZW5fc3R5bGVfbGluZSI+QSB0eXBpY2FsIHRva2VuIHN0cmluZyB3b3VsZAogICAgYmUgPGNvZGU+InZhcmlhYmxlIjwvY29kZT4gb3IgPGNvZGU+ImNvbW1lbnQiPC9jb2RlPi4gTXVsdGlwbGUKICAgIHN0eWxlcyBjYW4gYmUgcmV0dXJuZWQgKHNlcGFyYXRlZCBieSBzcGFjZXMpLCBmb3IKICAgIGV4YW1wbGUgPGNvZGU+InN0cmluZyBlcnJvciI8L2NvZGU+IGZvciBhIHRoaW5nIHRoYXQgbG9va3MgbGlrZSBhCiAgICBzdHJpbmcgYnV0IGlzIGludmFsaWQgc29tZWhvdyAoc2F5LCBtaXNzaW5nIGl0cyBjbG9zaW5nIHF1b3RlKS4KICAgIFdoZW4gYSBzdHlsZSBpcyBwcmVmaXhlZCBieSA8Y29kZT4ibGluZS0iPC9jb2RlPgogICAgb3IgPGNvZGU+ImxpbmUtYmFja2dyb3VuZC0iPC9jb2RlPiwgdGhlIHN0eWxlIHdpbGwgYmUgYXBwbGllZCB0bwogICAgdGhlIHdob2xlIGxpbmUsIGFuYWxvZ291cyB0byB3aGF0CiAgICB0aGUgPGEgaHJlZj0iI2FkZExpbmVDbGFzcyI+PGNvZGU+YWRkTGluZUNsYXNzPC9jb2RlPjwvYT4gbWV0aG9kCiAgICBkb2Vz4oCUc3R5bGluZyB0aGUgPGNvZGU+InRleHQiPC9jb2RlPiBpbiB0aGUgc2ltcGxlIGNhc2UsIGFuZAogICAgdGhlIDxjb2RlPiJiYWNrZ3JvdW5kIjwvY29kZT4gZWxlbWVudAogICAgd2hlbiA8Y29kZT4ibGluZS1iYWNrZ3JvdW5kLSI8L2NvZGU+IGlzIHByZWZpeGVkLjwvcD4KCiAgICA8cCBpZD0iU3RyaW5nU3RyZWFtIj5UaGUgc3RyZWFtIG9iamVjdCB0aGF0J3MgcGFzc2VkCiAgICB0byA8Y29kZT50b2tlbjwvY29kZT4gZW5jYXBzdWxhdGVzIGEgbGluZSBvZiBjb2RlICh0b2tlbnMgbWF5CiAgICBuZXZlciBzcGFuIGxpbmVzKSBhbmQgb3VyIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhhdCBsaW5lLiBJdCBoYXMKICAgIHRoZSBmb2xsb3dpbmcgQVBJOjwvcD4KCiAgICA8ZGw+CiAgICAgIDxkdD48Y29kZT48c3Ryb25nPmVvbDwvc3Ryb25nPigpIOKGkiBib29sZWFuPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5SZXR1cm5zIHRydWUgb25seSBpZiB0aGUgc3RyZWFtIGlzIGF0IHRoZSBlbmQgb2YgdGhlCiAgICAgIGxpbmUuPC9kZD4KICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+c29sPC9zdHJvbmc+KCkg4oaSIGJvb2xlYW48L2NvZGU+PC9kdD4KICAgICAgPGRkPlJldHVybnMgdHJ1ZSBvbmx5IGlmIHRoZSBzdHJlYW0gaXMgYXQgdGhlIHN0YXJ0IG9mIHRoZQogICAgICBsaW5lLjwvZGQ+CgogICAgICA8ZHQ+PGNvZGU+PHN0cm9uZz5wZWVrPC9zdHJvbmc+KCkg4oaSIHN0cmluZzwvY29kZT48L2R0PgogICAgICA8ZGQ+UmV0dXJucyB0aGUgbmV4dCBjaGFyYWN0ZXIgaW4gdGhlIHN0cmVhbSB3aXRob3V0IGFkdmFuY2luZwogICAgICBpdC4gV2lsbCByZXR1cm4gYSA8Y29kZT5udWxsPC9jb2RlPiBhdCB0aGUgZW5kIG9mIHRoZQogICAgICBsaW5lLjwvZGQ+CiAgICAgIDxkdD48Y29kZT48c3Ryb25nPm5leHQ8L3N0cm9uZz4oKSDihpIgc3RyaW5nPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5SZXR1cm5zIHRoZSBuZXh0IGNoYXJhY3RlciBpbiB0aGUgc3RyZWFtIGFuZCBhZHZhbmNlcyBpdC4KICAgICAgQWxzbyByZXR1cm5zIDxjb2RlPm51bGw8L2NvZGU+IHdoZW4gbm8gbW9yZSBjaGFyYWN0ZXJzIGFyZQogICAgICBhdmFpbGFibGUuPC9kZD4KCiAgICAgIDxkdD48Y29kZT48c3Ryb25nPmVhdDwvc3Ryb25nPihtYXRjaDogc3RyaW5nfHJlZ2V4cHxmdW5jdGlvbihjaGFyOiBzdHJpbmcpIOKGkiBib29sZWFuKSDihpIgc3RyaW5nPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD48Y29kZT5tYXRjaDwvY29kZT4gY2FuIGJlIGEgY2hhcmFjdGVyLCBhIHJlZ3VsYXIgZXhwcmVzc2lvbiwKICAgICAgb3IgYSBmdW5jdGlvbiB0aGF0IHRha2VzIGEgY2hhcmFjdGVyIGFuZCByZXR1cm5zIGEgYm9vbGVhbi4gSWYKICAgICAgdGhlIG5leHQgY2hhcmFjdGVyIGluIHRoZSBzdHJlYW0gJ21hdGNoZXMnIHRoZSBnaXZlbiBhcmd1bWVudCwKICAgICAgaXQgaXMgY29uc3VtZWQgYW5kIHJldHVybmVkLiBPdGhlcndpc2UsIDxjb2RlPnVuZGVmaW5lZDwvY29kZT4KICAgICAgaXMgcmV0dXJuZWQuPC9kZD4KICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+ZWF0V2hpbGU8L3N0cm9uZz4obWF0Y2g6IHN0cmluZ3xyZWdleHB8ZnVuY3Rpb24oY2hhcjogc3RyaW5nKSDihpIgYm9vbGVhbikg4oaSIGJvb2xlYW48L2NvZGU+PC9kdD4KICAgICAgPGRkPlJlcGVhdGVkbHkgY2FsbHMgPGNvZGU+ZWF0PC9jb2RlPiB3aXRoIHRoZSBnaXZlbiBhcmd1bWVudCwKICAgICAgdW50aWwgaXQgZmFpbHMuIFJldHVybnMgdHJ1ZSBpZiBhbnkgY2hhcmFjdGVycyB3ZXJlIGVhdGVuLjwvZGQ+CiAgICAgIDxkdD48Y29kZT48c3Ryb25nPmVhdFNwYWNlPC9zdHJvbmc+KCkg4oaSIGJvb2xlYW48L2NvZGU+PC9kdD4KICAgICAgPGRkPlNob3J0Y3V0IGZvciA8Y29kZT5lYXRXaGlsZTwvY29kZT4gd2hlbiBtYXRjaGluZwogICAgICB3aGl0ZS1zcGFjZS48L2RkPgogICAgICA8ZHQ+PGNvZGU+PHN0cm9uZz5za2lwVG9FbmQ8L3N0cm9uZz4oKTwvY29kZT48L2R0PgogICAgICA8ZGQ+TW92ZXMgdGhlIHBvc2l0aW9uIHRvIHRoZSBlbmQgb2YgdGhlIGxpbmUuPC9kZD4KICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+c2tpcFRvPC9zdHJvbmc+KGNoOiBzdHJpbmcpIOKGkiBib29sZWFuPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5Ta2lwcyB0byB0aGUgbmV4dCBvY2N1cnJlbmNlIG9mIHRoZSBnaXZlbiBjaGFyYWN0ZXIsIGlmCiAgICAgIGZvdW5kIG9uIHRoZSBjdXJyZW50IGxpbmUgKGRvZXNuJ3QgYWR2YW5jZSB0aGUgc3RyZWFtIGlmIHRoZQogICAgICBjaGFyYWN0ZXIgZG9lcyBub3Qgb2NjdXIgb24gdGhlIGxpbmUpLiBSZXR1cm5zIHRydWUgaWYgdGhlCiAgICAgIGNoYXJhY3RlciB3YXMgZm91bmQuPC9kZD4KICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+bWF0Y2g8L3N0cm9uZz4ocGF0dGVybjogc3RyaW5nLCA/Y29uc3VtZTogYm9vbGVhbiwgP2Nhc2VGb2xkOiBib29sZWFuKSDihpIgYm9vbGVhbjwvY29kZT48L2R0PgogICAgICA8ZHQ+PGNvZGU+PHN0cm9uZz5tYXRjaDwvc3Ryb25nPihwYXR0ZXJuOiByZWdleHAsID9jb25zdW1lOiBib29sZWFuKSDihpIgYXJyYXkmbHQ7c3RyaW5nJmd0OzwvY29kZT48L2R0PgogICAgICA8ZGQ+QWN0IGxpa2UgYQogICAgICBtdWx0aS1jaGFyYWN0ZXIgPGNvZGU+ZWF0PC9jb2RlPuKAlGlmIDxjb2RlPmNvbnN1bWU8L2NvZGU+IGlzIHRydWUKICAgICAgb3Igbm90IGdpdmVu4oCUb3IgYSBsb29rLWFoZWFkIHRoYXQgZG9lc24ndCB1cGRhdGUgdGhlIHN0cmVhbQogICAgICBwb3NpdGlvbuKAlGlmIGl0IGlzIGZhbHNlLiA8Y29kZT5wYXR0ZXJuPC9jb2RlPiBjYW4gYmUgZWl0aGVyIGEKICAgICAgc3RyaW5nIG9yIGEgcmVndWxhciBleHByZXNzaW9uIHN0YXJ0aW5nIHdpdGggPGNvZGU+XjwvY29kZT4uCiAgICAgIFdoZW4gaXQgaXMgYSBzdHJpbmcsIDxjb2RlPmNhc2VGb2xkPC9jb2RlPiBjYW4gYmUgc2V0IHRvIHRydWUgdG8KICAgICAgbWFrZSB0aGUgbWF0Y2ggY2FzZS1pbnNlbnNpdGl2ZS4gV2hlbiBzdWNjZXNzZnVsbHkgbWF0Y2hpbmcgYQogICAgICByZWd1bGFyIGV4cHJlc3Npb24sIHRoZSByZXR1cm5lZCB2YWx1ZSB3aWxsIGJlIHRoZSBhcnJheQogICAgICByZXR1cm5lZCBieSA8Y29kZT5tYXRjaDwvY29kZT4sIGluIGNhc2UgeW91IG5lZWQgdG8gZXh0cmFjdAogICAgICBtYXRjaGVkIGdyb3Vwcy48L2RkPgoKICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+YmFja1VwPC9zdHJvbmc+KG46IGludGVnZXIpPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5CYWNrcyB1cCB0aGUgc3RyZWFtIDxjb2RlPm48L2NvZGU+IGNoYXJhY3RlcnMuIEJhY2tpbmcgaXQgdXAKICAgICAgZnVydGhlciB0aGFuIHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCB0b2tlbiB3aWxsIGNhdXNlIHRoaW5ncyB0bwogICAgICBicmVhaywgc28gYmUgY2FyZWZ1bC48L2RkPgogICAgICA8ZHQ+PGNvZGU+PHN0cm9uZz5jb2x1bW48L3N0cm9uZz4oKSDihpIgaW50ZWdlcjwvY29kZT48L2R0PgogICAgICA8ZGQ+UmV0dXJucyB0aGUgY29sdW1uICh0YWtpbmcgaW50byBhY2NvdW50IHRhYnMpIGF0IHdoaWNoIHRoZQogICAgICBjdXJyZW50IHRva2VuIHN0YXJ0cy48L2RkPgogICAgICA8ZHQ+PGNvZGU+PHN0cm9uZz5pbmRlbnRhdGlvbjwvc3Ryb25nPigpIOKGkiBpbnRlZ2VyPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5UZWxscyB5b3UgaG93IGZhciB0aGUgY3VycmVudCBsaW5lIGhhcyBiZWVuIGluZGVudGVkLCBpbgogICAgICBzcGFjZXMuIENvcnJlY3RzIGZvciB0YWIgY2hhcmFjdGVycy48L2RkPgoKICAgICAgPGR0Pjxjb2RlPjxzdHJvbmc+Y3VycmVudDwvc3Ryb25nPigpIOKGkiBzdHJpbmc8L2NvZGU+PC9kdD4KICAgICAgPGRkPkdldCB0aGUgc3RyaW5nIGJldHdlZW4gdGhlIHN0YXJ0IG9mIHRoZSBjdXJyZW50IHRva2VuIGFuZAogICAgICB0aGUgY3VycmVudCBzdHJlYW0gcG9zaXRpb24uPC9kZD4KICAgIDwvZGw+CgogICAgPHAgaWQ9ImJsYW5rTGluZSI+QnkgZGVmYXVsdCwgYmxhbmsgbGluZXMgYXJlIHNpbXBseSBza2lwcGVkIHdoZW4KICAgIHRva2VuaXppbmcgYSBkb2N1bWVudC4gRm9yIGxhbmd1YWdlcyB0aGF0IGhhdmUgc2lnbmlmaWNhbnQgYmxhbmsKICAgIGxpbmVzLCB5b3UgY2FuIGRlZmluZQogICAgYSA8Y29kZT48c3Ryb25nPmJsYW5rTGluZTwvc3Ryb25nPihzdGF0ZSk8L2NvZGU+IG1ldGhvZCBvbiB5b3VyCiAgICBtb2RlIHRoYXQgd2lsbCBnZXQgY2FsbGVkIHdoZW5ldmVyIGEgYmxhbmsgbGluZSBpcyBwYXNzZWQgb3Zlciwgc28KICAgIHRoYXQgaXQgY2FuIHVwZGF0ZSB0aGUgcGFyc2VyIHN0YXRlLjwvcD4KCiAgICA8cCBpZD0iY29weVN0YXRlIj5CZWNhdXNlIHN0YXRlIG9iamVjdCBhcmUgbXV0YXRlZCwgYW5kIENvZGVNaXJyb3IKICAgIG5lZWRzIHRvIGtlZXAgdmFsaWQgdmVyc2lvbnMgb2YgYSBzdGF0ZSBhcm91bmQgc28gdGhhdCBpdCBjYW4KICAgIHJlc3RhcnQgYSBwYXJzZSBhdCBhbnkgbGluZSwgY29waWVzIG11c3QgYmUgbWFkZSBvZiBzdGF0ZSBvYmplY3RzLgogICAgVGhlIGRlZmF1bHQgYWxnb3JpdGhtIHVzZWQgaXMgdGhhdCBhIG5ldyBzdGF0ZSBvYmplY3QgaXMgY3JlYXRlZCwKICAgIHdoaWNoIGdldHMgYWxsIHRoZSBwcm9wZXJ0aWVzIG9mIHRoZSBvbGQgb2JqZWN0LiBBbnkgcHJvcGVydGllcwogICAgd2hpY2ggaG9sZCBhcnJheXMgZ2V0IGEgY29weSBvZiB0aGVzZSBhcnJheXMgKHNpbmNlIGFycmF5cyB0ZW5kIHRvCiAgICBiZSB1c2VkIGFzIG11dGFibGUgc3RhY2tzKS4gV2hlbiB0aGlzIGlzIG5vdCBjb3JyZWN0LCBmb3IgZXhhbXBsZQogICAgYmVjYXVzZSBhIG1vZGUgbXV0YXRlcyBub24tYXJyYXkgcHJvcGVydGllcyBvZiBpdHMgc3RhdGUgb2JqZWN0LCBhCiAgICBtb2RlIG9iamVjdCBzaG91bGQgZGVmaW5lCiAgICBhIDxjb2RlPjxzdHJvbmc+Y29weVN0YXRlPC9zdHJvbmc+PC9jb2RlPiBtZXRob2QsIHdoaWNoIGlzIGdpdmVuIGEKICAgIHN0YXRlIGFuZCBzaG91bGQgcmV0dXJuIGEgc2FmZSBjb3B5IG9mIHRoYXQgc3RhdGUuPC9wPgoKICAgIDxwIGlkPSJpbmRlbnQiPklmIHlvdSB3YW50IHlvdXIgbW9kZSB0byBwcm92aWRlIHNtYXJ0IGluZGVudGF0aW9uCiAgICAodGhyb3VnaCB0aGUgPGEgaHJlZj0iI2luZGVudExpbmUiPjxjb2RlPmluZGVudExpbmU8L2NvZGU+PC9hPgogICAgbWV0aG9kIGFuZCB0aGUgPGNvZGU+aW5kZW50QXV0bzwvY29kZT4KICAgIGFuZCA8Y29kZT5uZXdsaW5lQW5kSW5kZW50PC9jb2RlPiBjb21tYW5kcywgdG8gd2hpY2gga2V5cyBjYW4gYmUKICAgIDxhIGhyZWY9IiNvcHRpb25fZXh0cmFLZXlzIj5ib3VuZDwvYT4pLCB5b3UgbXVzdCBkZWZpbmUKICAgIGFuIDxjb2RlPjxzdHJvbmc+aW5kZW50PC9zdHJvbmc+KHN0YXRlLCB0ZXh0QWZ0ZXIpPC9jb2RlPiBtZXRob2QKICAgIG9uIHlvdXIgbW9kZSBvYmplY3QuPC9wPgoKICAgIDxwPlRoZSBpbmRlbnRhdGlvbiBtZXRob2Qgc2hvdWxkIGluc3BlY3QgdGhlIGdpdmVuIHN0YXRlIG9iamVjdCwKICAgIGFuZCBvcHRpb25hbGx5IHRoZSA8Y29kZT50ZXh0QWZ0ZXI8L2NvZGU+IHN0cmluZywgd2hpY2ggY29udGFpbnMKICAgIHRoZSB0ZXh0IG9uIHRoZSBsaW5lIHRoYXQgaXMgYmVpbmcgaW5kZW50ZWQsIGFuZCByZXR1cm4gYW4KICAgIGludGVnZXIsIHRoZSBhbW91bnQgb2Ygc3BhY2VzIHRvIGluZGVudC4gSXQgc2hvdWxkIHVzdWFsbHkgdGFrZQogICAgdGhlIDxhIGhyZWY9IiNvcHRpb25faW5kZW50VW5pdCI+PGNvZGU+aW5kZW50VW5pdDwvY29kZT48L2E+CiAgICBvcHRpb24gaW50byBhY2NvdW50LiBBbiBpbmRlbnRhdGlvbiBtZXRob2QgbWF5CiAgICByZXR1cm4gPGNvZGU+Q29kZU1pcnJvci5QYXNzPC9jb2RlPiB0byBpbmRpY2F0ZSB0aGF0IGl0CiAgICBjb3VsZCBub3QgY29tZSB1cCB3aXRoIGEgcHJlY2lzZSBpbmRlbnRhdGlvbi48L3A+CgogICAgPHAgaWQ9Im1vZGVfY29tbWVudCI+VG8gd29yayB3ZWxsIHdpdGgKICAgIHRoZSA8YSBocmVmPSIjYWRkb25fY29tbWVudCI+Y29tbWVudGluZyBhZGRvbjwvYT4sIGEgbW9kZSBtYXkKICAgIGRlZmluZSA8Y29kZT48c3Ryb25nPmxpbmVDb21tZW50PC9zdHJvbmc+PC9jb2RlPiAoc3RyaW5nIHRoYXQKICAgIHN0YXJ0cyBhIGxpbmUKICAgIGNvbW1lbnQpLCA8Y29kZT48c3Ryb25nPmJsb2NrQ29tbWVudFN0YXJ0PC9zdHJvbmc+PC9jb2RlPiwgPGNvZGU+PHN0cm9uZz5ibG9ja0NvbW1lbnRFbmQ8L3N0cm9uZz48L2NvZGU+CiAgICAoc3RyaW5ncyB0aGF0IHN0YXJ0IGFuZCBlbmQgYmxvY2sgY29tbWVudHMpLAogICAgYW5kIDxjb2RlPmJsb2NrQ29tbWVudExlYWQ8L2NvZGU+IChhIHN0cmluZyB0byBwdXQgYXQgdGhlIHN0YXJ0IG9mCiAgICBjb250aW51ZWQgbGluZXMgaW4gYSBibG9jayBjb21tZW50KS4gQWxsIG9mIHRoZXNlIGFyZQogICAgb3B0aW9uYWwuPC9wPgoKICAgIDxwIGlkPSJlbGVjdHJpY0NoYXJzIj5GaW5hbGx5LCBhIG1vZGUgbWF5IGRlZmluZSBlaXRoZXIKICAgIGFuIDxjb2RlPmVsZWN0cmljQ2hhcnM8L2NvZGU+IG9yIGFuIDxjb2RlPmVsZWN0cmljSW5wdXQ8L2NvZGU+CiAgICBwcm9wZXJ0eSwgd2hpY2ggYXJlIHVzZWQgdG8gYXV0b21hdGljYWxseSByZWluZGVudCB0aGUgbGluZSB3aGVuCiAgICBjZXJ0YWluIHBhdHRlcm5zIGFyZSB0eXBlZCBhbmQKICAgIHRoZSA8YSBocmVmPSIjb3B0aW9uX2VsZWN0cmljQ2hhcnMiPjxjb2RlPmVsZWN0cmljQ2hhcnM8L2NvZGU+PC9hPgogICAgb3B0aW9uIGlzIGVuYWJsZWQuIDxjb2RlPmVsZWN0cmljQ2hhcnM8L2NvZGU+IG1heSBiZSBhIHN0cmluZywgYW5kCiAgICB3aWxsIHRyaWdnZXIgYSByZWluZGVudCB3aGVuZXZlciBvbmUgb2YgdGhlIGNoYXJhY3RlcnMgaW4gdGhhdAogICAgc3RyaW5nIGFyZSB0eXBlZC4gT2Z0ZW4sIGl0IGlzIG1vcmUgYXBwcm9wcmlhdGUgdG8KICAgIHVzZSA8Y29kZT5lbGVjdHJpY0lucHV0PC9jb2RlPiwgd2hpY2ggc2hvdWxkIGhvbGQgYSByZWd1bGFyCiAgICBleHByZXNzaW9uLCBhbmQgd2lsbCB0cmlnZ2VyIGluZGVudGF0aW9uIHdoZW4gdGhlIHBhcnQgb2YgdGhlCiAgICBsaW5lIDxlbT5iZWZvcmU8L2VtPiB0aGUgY3Vyc29yIG1hdGNoZXMgdGhlIGV4cHJlc3Npb24uIEl0IHNob3VsZAogICAgdXN1YWxseSBlbmQgd2l0aCBhIDxjb2RlPiQ8L2NvZGU+IGNoYXJhY3Rlciwgc28gdGhhdCBpdCBvbmx5CiAgICBtYXRjaGVzIHdoZW4gdGhlIGluZGVudGF0aW9uLWNoYW5naW5nIHBhdHRlcm4gd2FzIGp1c3QgdHlwZWQsIG5vdCB3aGVuIHNvbWV0aGluZyB3YXMKICAgIHR5cGVkIGFmdGVyIHRoZSBwYXR0ZXJuLjwvcD4KCiAgICA8cD5TbywgdG8gc3VtbWFyaXplLCBhIG1vZGUgPGVtPm11c3Q8L2VtPiBwcm92aWRlCiAgICBhIDxjb2RlPnRva2VuPC9jb2RlPiBtZXRob2QsIGFuZCBpdCA8ZW0+bWF5PC9lbT4KICAgIHByb3ZpZGUgPGNvZGU+c3RhcnRTdGF0ZTwvY29kZT4sIDxjb2RlPmNvcHlTdGF0ZTwvY29kZT4sCiAgICBhbmQgPGNvZGU+aW5kZW50PC9jb2RlPiBtZXRob2RzLiBGb3IgYW4gZXhhbXBsZSBvZiBhIHRyaXZpYWwgbW9kZSwKICAgIHNlZSB0aGUgPGEgaHJlZj0iLi4vbW9kZS9kaWZmL2RpZmYuanMiPmRpZmYgbW9kZTwvYT4sIGZvciBhIG1vcmUKICAgIGludm9sdmVkIGV4YW1wbGUsIHNlZSB0aGUgPGEgaHJlZj0iLi4vbW9kZS9jbGlrZS9jbGlrZS5qcyI+Qy1saWtlCiAgICBtb2RlPC9hPi48L3A+CgogICAgPHA+U29tZXRpbWVzLCBpdCBpcyB1c2VmdWwgZm9yIG1vZGVzIHRvIDxlbT5uZXN0PC9lbT7igJR0byBoYXZlIG9uZQogICAgbW9kZSBkZWxlZ2F0ZSB3b3JrIHRvIGFub3RoZXIgbW9kZS4gQW4gZXhhbXBsZSBvZiB0aGlzIGtpbmQgb2YKICAgIG1vZGUgaXMgdGhlIDxhIGhyZWY9Ii4uL21vZGUvaHRtbG1peGVkL2h0bWxtaXhlZC5qcyI+bWl4ZWQtbW9kZSBIVE1MCiAgICBtb2RlPC9hPi4gVG8gaW1wbGVtZW50IHN1Y2ggbmVzdGluZywgaXQgaXMgdXN1YWxseSBuZWNlc3NhcnkgdG8KICAgIGNyZWF0ZSBtb2RlIG9iamVjdHMgYW5kIGNvcHkgc3RhdGVzIHlvdXJzZWxmLiBUbyBjcmVhdGUgYSBtb2RlCiAgICBvYmplY3QsIHRoZXJlIGFyZSA8Y29kZT5Db2RlTWlycm9yLmdldE1vZGUob3B0aW9ucywKICAgIHBhcnNlckNvbmZpZyk8L2NvZGU+LCB3aGVyZSB0aGUgZmlyc3QgYXJndW1lbnQgaXMgYSBjb25maWd1cmF0aW9uCiAgICBvYmplY3QgYXMgcGFzc2VkIHRvIHRoZSBtb2RlIGNvbnN0cnVjdG9yIGZ1bmN0aW9uLCBhbmQgdGhlIHNlY29uZAogICAgYXJndW1lbnQgaXMgYSBtb2RlIHNwZWNpZmljYXRpb24gYXMgaW4KICAgIHRoZSA8YSBocmVmPSIjb3B0aW9uX21vZGUiPjxjb2RlPm1vZGU8L2NvZGU+PC9hPiBvcHRpb24uIFRvIGNvcHkgYQogICAgc3RhdGUgb2JqZWN0LCBjYWxsIDxjb2RlPkNvZGVNaXJyb3IuY29weVN0YXRlKG1vZGUsIHN0YXRlKTwvY29kZT4sCiAgICB3aGVyZSA8Y29kZT5tb2RlPC9jb2RlPiBpcyB0aGUgbW9kZSB0aGF0IGNyZWF0ZWQgdGhlIGdpdmVuCiAgICBzdGF0ZS48L3A+CgogICAgPHAgaWQ9ImlubmVyTW9kZSI+SW4gYSBuZXN0ZWQgbW9kZSwgaXQgaXMgcmVjb21tZW5kZWQgdG8gYWRkIGFuCiAgICBleHRyYSBtZXRob2QsIDxjb2RlPjxzdHJvbmc+aW5uZXJNb2RlPC9zdHJvbmc+PC9jb2RlPiB3aGljaCwgZ2l2ZW4KICAgIGEgc3RhdGUgb2JqZWN0LCByZXR1cm5zIGEgPGNvZGU+e3N0YXRlLCBtb2RlfTwvY29kZT4gb2JqZWN0IHdpdGgKICAgIHRoZSBpbm5lciBtb2RlIGFuZCBpdHMgc3RhdGUgZm9yIHRoZSBjdXJyZW50IHBvc2l0aW9uLiBUaGVzZSBhcmUKICAgIHVzZWQgYnkgdXRpbGl0eSBzY3JpcHRzIHN1Y2ggYXMgdGhlIDxhIGhyZWY9IiNhZGRvbl9jbG9zZXRhZyI+dGFnCiAgICBjbG9zZXI8L2E+IHRvIGdldCBjb250ZXh0IGluZm9ybWF0aW9uLiBVc2UKICAgIHRoZSA8Y29kZT5Db2RlTWlycm9yLmlubmVyTW9kZTwvY29kZT4gaGVscGVyIGZ1bmN0aW9uIHRvLCBzdGFydGluZwogICAgZnJvbSBhIG1vZGUgYW5kIGEgc3RhdGUsIHJlY3Vyc2l2ZWx5IHdhbGsgZG93biB0byB0aGUgaW5uZXJtb3N0CiAgICBtb2RlIGFuZCBzdGF0ZS48L3A+CgogICAgPHA+VG8gbWFrZSBpbmRlbnRhdGlvbiB3b3JrIHByb3Blcmx5IGluIGEgbmVzdGVkIHBhcnNlciwgaXQgaXMKICAgIGFkdmlzYWJsZSB0byBnaXZlIHRoZSA8Y29kZT5zdGFydFN0YXRlPC9jb2RlPiBtZXRob2Qgb2YgbW9kZXMgdGhhdAogICAgYXJlIGludGVuZGVkIHRvIGJlIG5lc3RlZCBhbiBvcHRpb25hbCBhcmd1bWVudCB0aGF0IHByb3ZpZGVzIHRoZQogICAgYmFzZSBpbmRlbnRhdGlvbiBmb3IgdGhlIGJsb2NrIG9mIGNvZGUuIFRoZSBKYXZhU2NyaXB0IGFuZCBDU1MKICAgIHBhcnNlciBkbyB0aGlzLCBmb3IgZXhhbXBsZSwgdG8gYWxsb3cgSmF2YVNjcmlwdCBhbmQgQ1NTIGNvZGUKICAgIGluc2lkZSB0aGUgbWl4ZWQtbW9kZSBIVE1MIG1vZGUgdG8gYmUgcHJvcGVybHkgaW5kZW50ZWQuPC9wPgoKICAgIDxwIGlkPSJkZWZpbmVNSU1FIj5JdCBpcyBwb3NzaWJsZSwgYW5kIGVuY291cmFnZWQsIHRvIGFzc29jaWF0ZQogICAgeW91ciBtb2RlLCBvciBhIGNlcnRhaW4gY29uZmlndXJhdGlvbiBvZiB5b3VyIG1vZGUsIHdpdGgKICAgIGEgPGEgaHJlZj0iaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9NSU1FIj5NSU1FPC9hPiB0eXBlLiBGb3IKICAgIGV4YW1wbGUsIHRoZSBKYXZhU2NyaXB0IG1vZGUgYXNzb2NpYXRlcyBpdHNlbGYKICAgIHdpdGggPGNvZGU+dGV4dC9qYXZhc2NyaXB0PC9jb2RlPiwgYW5kIGl0cyBKU09OIHZhcmlhbnQKICAgIHdpdGggPGNvZGU+YXBwbGljYXRpb24vanNvbjwvY29kZT4uIFRvIGRvIHRoaXMsCiAgICBjYWxsIDxjb2RlPjxzdHJvbmc+Q29kZU1pcnJvci5kZWZpbmVNSU1FPC9zdHJvbmc+KG1pbWUsCiAgICBtb2RlU3BlYyk8L2NvZGU+LCB3aGVyZSA8Y29kZT5tb2RlU3BlYzwvY29kZT4gY2FuIGJlIGEgc3RyaW5nIG9yCiAgICBvYmplY3Qgc3BlY2lmeWluZyBhIG1vZGUsIGFzIGluCiAgICB0aGUgPGEgaHJlZj0iI29wdGlvbl9tb2RlIj48Y29kZT5tb2RlPC9jb2RlPjwvYT4gb3B0aW9uLjwvcD4KCiAgICA8cD5JZiBhIG1vZGUgc3BlY2lmaWNhdGlvbiB3YW50cyB0byBhZGQgc29tZSBwcm9wZXJ0aWVzIHRvIHRoZQogICAgcmVzdWx0aW5nIG1vZGUgb2JqZWN0LCB0eXBpY2FsbHkgZm9yIHVzZQogICAgd2l0aCA8YSBocmVmPSIjZ2V0SGVscGVycyI+PGNvZGU+Z2V0SGVscGVyczwvY29kZT48L2E+LCBpdCBtYXkKICAgIGNvbnRhaW4gYSA8Y29kZT5tb2RlUHJvcHM8L2NvZGU+IHByb3BlcnR5LCB3aGljaCBob2xkcyBhbiBvYmplY3QuCiAgICBUaGlzIG9iamVjdCdzIHByb3BlcnRpZXMgd2lsbCBiZSBjb3BpZWQgdG8gdGhlIGFjdHVhbCBtb2RlCiAgICBvYmplY3QuPC9wPgoKICAgIDxwIGlkPSJleHRlbmRNb2RlIj5Tb21ldGltZXMsIGl0IGlzIHVzZWZ1bCB0byBhZGQgb3Igb3ZlcnJpZGUgbW9kZQogICAgb2JqZWN0IHByb3BlcnRpZXMgZnJvbSBleHRlcm5hbCBjb2RlLgogICAgVGhlIDxjb2RlPjxzdHJvbmc+Q29kZU1pcnJvci5leHRlbmRNb2RlPC9zdHJvbmc+PC9jb2RlPiBmdW5jdGlvbgogICAgY2FuIGJlIHVzZWQgdG8gYWRkIHByb3BlcnRpZXMgdG8gbW9kZSBvYmplY3RzIHByb2R1Y2VkIGZvciBhCiAgICBzcGVjaWZpYyBtb2RlLiBJdHMgZmlyc3QgYXJndW1lbnQgaXMgdGhlIG5hbWUgb2YgdGhlIG1vZGUsIGl0cwogICAgc2Vjb25kIGFuIG9iamVjdCB0aGF0IHNwZWNpZmllcyB0aGUgcHJvcGVydGllcyB0aGF0IHNob3VsZCBiZQogICAgYWRkZWQuIFRoaXMgaXMgbW9zdGx5IHVzZWZ1bCB0byBhZGQgdXRpbGl0aWVzIHRoYXQgY2FuIGxhdGVyIGJlCiAgICBsb29rZWQgdXAgdGhyb3VnaCA8YSBocmVmPSIjZ2V0TW9kZSI+PGNvZGU+Z2V0TW9kZTwvY29kZT48L2E+LjwvcD4KPC9zZWN0aW9uPgoKPHNlY3Rpb24gaWQ9InZpbWFwaSI+CiAgICA8aDI+VklNIE1vZGUgQVBJPC9oMj4KCiAgICA8cD5Db2RlTWlycm9yIGhhcyBhIHJvYnVzdCBWSU0gbW9kZSB0aGF0IGF0dGVtcHRzIHRvIGZhaXRoZnVsbHkKICAgIGVtdWxhdGUgVklNJ3MgbW9zdCB1c2VmdWwgZmVhdHVyZXMuIEl0IGNhbiBiZSBlbmFibGVkIGJ5CiAgICBpbmNsdWRpbmcgPGEgaHJlZj0iLi4va2V5bWFwL3ZpbS5qcyI+PGNvZGU+a2V5bWFwL3ZpbS5qczwvY29kZT4KICAgIDwvYT4gYW5kIHNldHRpbmcgdGhlIDxjb2RlPmtleU1hcDwvY29kZT4gb3B0aW9uIHRvCiAgICA8Y29kZT4idmltIjwvY29kZT4uPC9wPgoKICAgIDxoMyBpZD0idmltYXBpX2NvbmZpZ3VyYXRpb24iPkNvbmZpZ3VyYXRpb248L2gzPgoKICAgIDxwPlZJTSBtb2RlIGFjY2VwdHMgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBjdXN0b21pemluZwogICAgYmVoYXZpb3IgYXQgcnVuIHRpbWUuIFRoZXNlIG1ldGhvZHMgY2FuIGJlIGNhbGxlZCBhdCBhbnkgdGltZQogICAgYW5kIHdpbGwgYWZmZWN0IGFsbCBleGlzdGluZyBDb2RlTWlycm9yIGluc3RhbmNlcyB1bmxlc3MKICAgIHNwZWNpZmllZCBvdGhlcndpc2UuIFRoZSBtZXRob2RzIGFyZSBleHBvc2VkIG9uIHRoZQogICAgPGNvZGU+PHN0cm9uZz5Db2RlTWlycm9yLlZpbTwvc3Ryb25nPjwvY29kZT4gb2JqZWN0LjwvcD4KCiAgICA8ZGw+CiAgICAgIDxkdCBpZD0idmltYXBpX3NldE9wdGlvbiI+PGNvZGU+PHN0cm9uZz5zZXRPcHRpb24obmFtZTogc3RyaW5nLCB2YWx1ZTogYW55LCA/Y206IENvZGVNaXJyb3IsID9jZmc6IG9iamVjdCk8L3N0cm9uZz48L2NvZGU+PC9kdD4KICAgICAgPGRkPlNldHMgdGhlIHZhbHVlIG9mIGEgVklNIG9wdGlvbi4gPGNvZGU+bmFtZTwvY29kZT4gc2hvdWxkCiAgICAgIGJlIHRoZSBuYW1lIG9mIGFuIG9wdGlvbi4gSWYgPGNvZGU+Y2ZnLnNjb3BlPC9jb2RlPiBpcyBub3Qgc2V0CiAgICAgIGFuZCA8Y29kZT5jbTwvY29kZT4gaXMgcHJvdmlkZWQsIHRoZW4gc2V0cyB0aGUgZ2xvYmFsIGFuZAogICAgICBpbnN0YW5jZSB2YWx1ZXMgb2YgdGhlIG9wdGlvbi4gT3RoZXJ3aXNlLCBzZXRzIGVpdGhlciB0aGUKICAgICAgZ2xvYmFsIG9yIGluc3RhbmNlIHZhbHVlIG9mIHRoZSBvcHRpb24gZGVwZW5kaW5nIG9uIHdoZXRoZXIKICAgICAgPGNvZGU+Y2ZnLnNjb3BlPC9jb2RlPiBpcyA8Y29kZT5nbG9iYWw8L2NvZGU+IG9yCiAgICAgIDxjb2RlPmxvY2FsPC9jb2RlPi48L2RkPgogICAgICA8ZHQgaWQ9InZpbWFwaV9nZXRPcHRpb24iPjxjb2RlPjxzdHJvbmc+Z2V0T3B0aW9uKG5hbWU6IHN0cmluZywgP2NtOiBDb2RlTWlycm9yOiA/Y2ZnOiBvYmplY3QpPC9zdHJvbmc+PC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5HZXRzIHRoZSBjdXJyZW50IHZhbHVlIG9mIGEgVklNIG9wdGlvbi4gSWYKICAgICAgPGNvZGU+Y2ZnLnNjb3BlPC9jb2RlPiBpcyBub3Qgc2V0IGFuZCA8Y29kZT5jbTwvY29kZT4gaXMKICAgICAgcHJvdmlkZWQsIHRoZW4gZ2V0cyB0aGUgaW5zdGFuY2UgdmFsdWUgb2YgdGhlIG9wdGlvbiwgZmFsbGluZwogICAgICBiYWNrIHRvIHRoZSBnbG9iYWwgdmFsdWUgaWYgbm90IHNldC4gSWYgPGNvZGU+Y2ZnLnNjb3BlPC9jb2RlPiBpcyBwcm92aWRlZCwgdGhlbiBnZXRzIHRoZSA8Y29kZT5nbG9iYWw8L2NvZGU+IG9yCiAgICAgIDxjb2RlPmxvY2FsPC9jb2RlPiB2YWx1ZSB3aXRob3V0IGNoZWNraW5nIHRoZSBvdGhlci48L2RkPgoKICAgICAgPGR0IGlkPSJ2aW1hcGlfbWFwIj48Y29kZT48c3Ryb25nPm1hcChsaHM6IHN0cmluZywgcmhzOiBzdHJpbmcsID9jb250ZXh0OiBzdHJpbmcpPC9zdHJvbmc+PC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5NYXBzIGEga2V5IHNlcXVlbmNlIHRvIGFub3RoZXIga2V5IHNlcXVlbmNlLiBJbXBsZW1lbnRzCiAgICAgIFZJTSdzIDxjb2RlPjptYXA8L2NvZGU+IGNvbW1hbmQuIFRvIG1hcCA7IHRvIDogaW4gVklNIHdvdWxkIGJlCiAgICAgIDxjb2RlPjxzdHJvbmc+Om1hcCA7IDo8L3N0cm9uZz48L2NvZGU+LiBUaGF0IHdvdWxkIHRyYW5zbGF0ZSB0bwogICAgICA8Y29kZT48c3Ryb25nPkNvZGVNaXJyb3IuVmltLm1hcCgnOycsICc6Jyk7PC9zdHJvbmc+PC9jb2RlPi4KICAgICAgVGhlIDxjb2RlPmNvbnRleHQ8L2NvZGU+IGNhbiBiZSA8Y29kZT5ub3JtYWw8L2NvZGU+LAogICAgICA8Y29kZT52aXN1YWw8L2NvZGU+LCBvciA8Y29kZT5pbnNlcnQ8L2NvZGU+LCB3aGljaCBjb3JyZXNwb25kCiAgICAgIHRvIDxjb2RlPjpubWFwPC9jb2RlPiwgPGNvZGU+OnZtYXA8L2NvZGU+LCBhbmQKICAgICAgPGNvZGU+OmltYXA8L2NvZGU+CiAgICAgIHJlc3BlY3RpdmVseS48L2RkPgoKICAgICAgPGR0IGlkPSJ2aW1hcGlfbWFwQ29tbWFuZCI+PGNvZGU+PHN0cm9uZz5tYXBDb21tYW5kKGtleXM6IHN0cmluZywgdHlwZTogc3RyaW5nLCBuYW1lOiBzdHJpbmcsID9hcmdzOiBvYmplY3QsID9leHRyYTogb2JqZWN0KTwvc3Ryb25nPjwvY29kZT48L2R0PgogICAgICA8ZGQ+TWFwcyBhIGtleSBzZXF1ZW5jZSB0byBhIDxjb2RlPm1vdGlvbjwvY29kZT4sCiAgICAgIDxjb2RlPm9wZXJhdG9yPC9jb2RlPiwgb3IgPGNvZGU+YWN0aW9uPC9jb2RlPiB0eXBlIGNvbW1hbmQuCiAgICAgIFRoZSBhcmdzIG9iamVjdCBpcyBwYXNzZWQgdGhyb3VnaCB0byB0aGUgY29tbWFuZCB3aGVuIGl0IGlzCiAgICAgIGludm9rZWQgYnkgdGhlIHByb3ZpZGVkIGtleSBzZXF1ZW5jZS4KICAgICAgPGNvZGU+ZXh0cmFzLmNvbnRleHQ8L2NvZGU+IGNhbiBiZSA8Y29kZT5ub3JtYWw8L2NvZGU+LAogICAgICA8Y29kZT52aXN1YWw8L2NvZGU+LCBvciA8Y29kZT5pbnNlcnQ8L2NvZGU+LCB0byBtYXAgdGhlIGtleQogICAgICBzZXF1ZW5jZSBvbmx5IGluIHRoZSBjb3JyZXNwb25kaW5nIG1vZGUuCiAgICAgIDxjb2RlPmV4dHJhcy5pc0VkaXQ8L2NvZGU+IGlzIGFwcGxpY2FibGUgb25seSB0byBhY3Rpb25zLAogICAgICBkZXRlcm1pbmluZyB3aGV0aGVyIGl0IGlzIHJlY29yZGVkIGZvciByZXBsYXkgZm9yIHRoZQogICAgICA8Y29kZT4uPC9jb2RlPiBzaW5nbGUtcmVwZWF0IGNvbW1hbmQuCiAgICA8L2RsPgoKICAgIDxoMyBpZD0idmltYXBpX2V4dGVuZGluZyI+RXh0ZW5kaW5nIFZJTTwvaDM+CgogICAgPHA+Q29kZU1pcnJvcidzIFZJTSBtb2RlIGltcGxlbWVudHMgYSBsYXJnZSBzdWJzZXQgb2YgVklNJ3MgY29yZQogICAgZWRpdGluZyBmdW5jdGlvbmFsaXR5LiBCdXQgc2luY2UgdGhlcmUncyBhbHdheXMgbW9yZSB0byBiZQogICAgZGVzaXJlZCwgdGhlcmUgaXMgYSBzZXQgb2YgQVBJcyBmb3IgZXh0ZW5kaW5nIFZJTSdzCiAgICBmdW5jdGlvbmFsaXR5LiBBcyB3aXRoIHRoZSBjb25maWd1cmF0aW9uIEFQSSwgdGhlIG1ldGhvZHMgYXJlCiAgICBleHBvc2VkIG9uIDxjb2RlPjxzdHJvbmc+Q29kZU1pcnJvci5WaW08L3N0cm9uZz48L2NvZGU+IGFuZCBtYXkKICAgIGJlIGNhbGxlZCBhdCBhbnkgdGltZS48L3A+CgogICAgPGRsPgogICAgICA8ZHQgaWQ9InZpbWFwaV9kZWZpbmVPcHRpb24iPjxjb2RlPjxzdHJvbmc+ZGVmaW5lT3B0aW9uKG5hbWU6IHN0cmluZywgZGVmYXVsdDogYW55LCB0eXBlOiBzdHJpbmcsID9hbGlhc2VzOiBhcnJheSZsdDtzdHJpbmcmZ3Q7LCA/Y2FsbGJhY2s6IGZ1bmN0aW9uICg/dmFsdWU6IGFueSwgP2NtOiBDb2RlTWlycm9yKSDihpIgP2FueSk8L3N0cm9uZz48L2NvZGU+PC9kdD4KICAgICAgPGRkPkRlZmluZXMgYSBWSU0gc3R5bGUgb3B0aW9uIGFuZCBtYWtlcyBpdCBhdmFpbGFibGUgdG8gdGhlCiAgICAgIDxjb2RlPjpzZXQ8L2NvZGU+IGNvbW1hbmQuIFR5cGUgY2FuIGJlIDxjb2RlPmJvb2xlYW48L2NvZGU+IG9yCiAgICAgIDxjb2RlPnN0cmluZzwvY29kZT4sIHVzZWQgZm9yIHZhbGlkYXRpb24gYW5kIGJ5CiAgICAgIDxjb2RlPjpzZXQ8L2NvZGU+IHRvIGRldGVybWluZSB3aGljaCBzeW50YXggdG8gYWNjZXB0LiBJZiBhCiAgICAgIDxjb2RlPmNhbGxiYWNrPC9jb2RlPiBpcyBwYXNzZWQgaW4sIFZJTSBkb2VzIG5vdCBzdG9yZSB0aGUgdmFsdWUgb2YgdGhlCiAgICAgIG9wdGlvbiBpdHNlbGYsIGJ1dCBpbnN0ZWFkIHVzZXMgdGhlIGNhbGxiYWNrIGFzIGEgc2V0dGVyL2dldHRlci4gSWYgdGhlCiAgICAgIGZpcnN0IGFyZ3VtZW50IHRvIHRoZSBjYWxsYmFjayBpcyA8Y29kZT51bmRlZmluZWQ8L2NvZGU+LCB0aGVuIHRoZQogICAgICBjYWxsYmFjayBzaG91bGQgcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGUgb3B0aW9uLiBPdGhlcndpc2UsIGl0IHNob3VsZCBzZXQKICAgICAgaW5zdGVhZC4gU2luY2UgVklNIG9wdGlvbnMgaGF2ZSBnbG9iYWwgYW5kIGluc3RhbmNlIHZhbHVlcywgd2hldGhlciBhCiAgICAgIDxjb2RlPkNvZGVNaXJyb3I8L2NvZGU+IGluc3RhbmNlIGlzIHBhc3NlZCBpbiBkZW5vdGVzIHdoZXRoZXIgdGhlIGdsb2JhbAogICAgICBvciBsb2NhbCB2YWx1ZSBzaG91bGQgYmUgdXNlZC4gQ29uc2VxdWVudGx5LCBpdCdzIHBvc3NpYmxlIGZvciB0aGUKICAgICAgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIHR3aWNlIGZvciBhIHNpbmdsZSA8Y29kZT5zZXRPcHRpb248L2NvZGU+IG9yCiAgICAgIDxjb2RlPmdldE9wdGlvbjwvY29kZT4gY2FsbC4gTm90ZSB0aGF0IHJpZ2h0IG5vdywgVklNIGRvZXMgbm90IHN1cHBvcnQKICAgICAgZGVmaW5pbmcgYnVmZmVyLWxvY2FsIG9wdGlvbnMgdGhhdCBkbyBub3QgaGF2ZSBnbG9iYWwgdmFsdWVzLiBJZiBhbgogICAgICBvcHRpb24gc2hvdWxkIG5vdCBoYXZlIGEgZ2xvYmFsIHZhbHVlLCBlaXRoZXIgYWx3YXlzIGlnbm9yZSB0aGUKICAgICAgPGNvZGU+Y208L2NvZGU+IHBhcmFtZXRlciBpbiB0aGUgY2FsbGJhY2ssIG9yIGFsd2F5cyBwYXNzIGluIGEKICAgICAgPGNvZGU+Y2ZnLnNjb3BlPC9jb2RlPiB0byA8Y29kZT5zZXRPcHRpb248L2NvZGU+IGFuZAogICAgICA8Y29kZT5nZXRPcHRpb248L2NvZGU+LjwvZGQ+CgogICAgICA8ZHQgaWQ9InZpbWFwaV9kZWZpbmVNb3Rpb24iPjxjb2RlPjxzdHJvbmc+ZGVmaW5lTW90aW9uKG5hbWU6IHN0cmluZywgZm46IGZ1bmN0aW9uKGNtOiBDb2RlTWlycm9yLCBoZWFkOiB7bGluZSwgY2h9LCA/bW90aW9uQXJnczogb2JqZWN0fSkg4oaSIHtsaW5lLCBjaH0pPC9zdHJvbmc+PC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5EZWZpbmVzIGEgbW90aW9uIGNvbW1hbmQgZm9yIFZJTS4gVGhlIG1vdGlvbiBzaG91bGQgcmV0dXJuCiAgICAgIHRoZSBkZXNpcmVkIHJlc3VsdCBwb3NpdGlvbiBvZiB0aGUgY3Vyc29yLiA8Y29kZT5oZWFkPC9jb2RlPgogICAgICBpcyB0aGUgY3VycmVudCBwb3NpdGlvbiBvZiB0aGUgY3Vyc29yLiBJdCBjYW4gZGlmZmVyIGZyb20KICAgICAgPGNvZGU+Y20uZ2V0Q3Vyc29yKCdoZWFkJyk8L2NvZGU+IGlmIFZJTSBpcyBpbiB2aXN1YWwgbW9kZS4KICAgICAgPGNvZGU+bW90aW9uQXJnczwvY29kZT4gaXMgdGhlIG9iamVjdCBwYXNzZWQgaW50bwogICAgICA8c3Ryb25nPjxjb2RlPm1hcENvbW1hbmQoKTwvY29kZT48L3N0cm9uZz4uPC9kZD4KCiAgICAgIDxkdCBpZD0idmltYXBpX2RlZmluZU9wZXJhdG9yIj48c3Ryb25nPjxjb2RlPmRlZmluZU9wZXJhdG9yKG5hbWU6IHN0cmluZywgZm46IGZ1bmN0aW9uKGNtOiBDb2RlTWlycm9yLCA/b3BlcmF0b3JBcmdzOiBvYmplY3QsIHJhbmdlczogYXJyYXkmbHQ7e2FuY2hvciwgaGVhZH0mZ3Q7KSDihpIgP3tsaW5lLCBjaH0pPC9jb2RlPjwvc3Ryb25nPjwvZHQ+CiAgICAgIDxkZD5EZWZpbmVzIGFuIG9wZXJhdG9yIGNvbW1hbmQsIHNpbWlsYXIgdG8gPHN0cm9uZz48Y29kZT4KICAgICAgZGVmaW5lTW90aW9uPC9jb2RlPjwvc3Ryb25nPi4gPGNvZGU+cmFuZ2VzPC9jb2RlPiBpcyB0aGUgcmFuZ2UKICAgICAgb2YgdGV4dCB0aGUgb3BlcmF0b3Igc2hvdWxkIG9wZXJhdGUgb24uIElmIHRoZSBjdXJzb3Igc2hvdWxkCiAgICAgIGJlIHNldCB0byBhIGNlcnRhaW4gcG9zaXRpb24gYWZ0ZXIgdGhlIG9wZXJhdGlvbiBmaW5pc2hlcywgaXQKICAgICAgY2FuIHJldHVybiBhIGN1cnNvciBvYmplY3QuPC9kZD4KCiAgICAgIDxkdCBpZD0idmltYXBpX2RlZmluZUFjdG9uIj48c3Ryb25nPjxjb2RlPmRlZmluZUFjdGlvbihuYW1lOiBzdHJpbmcsIGZuOiBmdW5jdGlvbihjbTogQ29kZU1pcnJvciwgP2FjdGlvbkFyZ3M6IG9iamVjdCkpPC9jb2RlPjwvc3Ryb25nPjwvZHQ+CiAgICAgIDxkZD5EZWZpbmVzIGFuIGFjdGlvbiBjb21tYW5kLCBzaW1pbGFyIHRvCiAgICAgIDxzdHJvbmc+PGNvZGU+ZGVmaW5lTW90aW9uPC9jb2RlPjwvc3Ryb25nPi4gQWN0aW9uIGNvbW1hbmRzCiAgICAgIGNhbiBoYXZlIGFyYml0cmFyeSBiZWhhdmlvciwgbWFraW5nIHRoZW0gbW9yZSBmbGV4aWJsZSB0aGFuCiAgICAgIG1vdGlvbnMgYW5kIG9wZXJhdG9ycywgYXQgdGhlIGxvc3Mgb2Ygb3J0aG9nb25hbGl0eS48L2RkPgoKICAgICAgPGR0IGlkPSJ2aW1hcGlfZGVmaW5lRXgiPjxzdHJvbmc+PGNvZGU+ZGVmaW5lRXgobmFtZTogc3RyaW5nLCA/cHJlZml4OiBzdHJpbmcsIGZuOiBmdW5jdGlvbihjbTogQ29kZU1pcnJvciwgP3BhcmFtczogb2JqZWN0KSk8L2NvZGU+PC9zdHJvbmc+PC9kdD4KICAgICAgPGRkPkRlZmluZXMgYW4gRXggY29tbWFuZCwgYW5kIG1hcHMgaXQgdG8gPGNvZGU+Om5hbWU8L2NvZGU+LgogICAgICBJZiBhIHByZWZpeCBpcyBwcm92aWRlZCwgaXQsIGFuZCBhbnkgcHJlZml4ZWQgc3Vic3RyaW5nIG9mIHRoZQogICAgICA8Y29kZT5uYW1lPC9jb2RlPiBiZWdpbm5pbmcgd2l0aCB0aGUgPGNvZGU+cHJlZml4PC9jb2RlPiBjYW4KICAgICAgYmUgdXNlZCB0byBpbnZva2UgdGhlIGNvbW1hbmQuIElmIHRoZSA8Y29kZT5wcmVmaXg8L2NvZGU+IGlzCiAgICAgIGZhbHN5LCB0aGVuIDxjb2RlPm5hbWU8L2NvZGU+IGlzIHVzZWQgYXMgdGhlIHByZWZpeC4gPGNvZGU+CiAgICAgIHBhcmFtcy5hcmdTdHJpbmc8L2NvZGU+IGNvbnRhaW5zIHRoZSBwYXJ0IG9mIHRoZSBwcm9tcHRlZAogICAgICBzdHJpbmcgYWZ0ZXIgdGhlIGNvbW1hbmQgbmFtZS4gPGNvZGU+cGFyYW1zLmFyZ3M8L2NvZGU+IGlzCiAgICAgIDxjb2RlPnBhcmFtcy5hcmdTdHJpbmc8L2NvZGU+IHNwbGl0IGJ5IHdoaXRlc3BhY2UuIElmIHRoZQogICAgICBjb21tYW5kIHdhcyBwcmVmaXhlZCB3aXRoIGEKICAgICAgPGNvZGU+PHN0cm9uZz48YSBocmVmPSJodHRwOi8vdmltZG9jLnNvdXJjZWZvcmdlLm5ldC9odG1sZG9jL2NtZGxpbmUuaHRtbCNjbWRsaW5lLXJhbmdlcyI+bGluZSByYW5nZTwvYT48L3N0cm9uZz48L2NvZGU+LAogICAgICA8Y29kZT5wYXJhbXMubGluZTwvY29kZT4gYW5kIDxjb2RlPnBhcmFtcy5saW5lRW5kPC9jb2RlPiB3aWxsCiAgICAgIGJlIHNldC4KICAgIDwvZGw+Cgo8L3NlY3Rpb24+Cgo8L2FydGljbGU+Cgo8c2NyaXB0PnNldFRpbWVvdXQoZnVuY3Rpb24oKXtDb2RlTWlycm9yLmNvbG9yaXplKCk7fSwgMjApOzwvc2NyaXB0Pgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/doc/realworld.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogUmVhbC13b3JsZCBVc2VzPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iZG9jcy5jc3MiPgoKPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aDE+Q29kZU1pcnJvcjwvaDE+PGltZyBpZD1sb2dvIHNyYz0ibG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0ibWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5SZWFsLXdvcmxkIHVzZXM8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KCjxoMj5Db2RlTWlycm9yIHJlYWwtd29ybGQgdXNlczwvaDI+CgogICAgPHA+Q3JlYXRlIGEgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvY29kZW1pcnJvciI+cHVsbAogICAgcmVxdWVzdDwvYT4gaWYgeW91J2QgbGlrZSB5b3VyIHByb2plY3QgdG8gYmUgYWRkZWQgdG8gdGhpcyBsaXN0LjwvcD4KCiAgICA8dWw+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vYnJhY2tldHMuaW8iPkFkb2JlIEJyYWNrZXRzPC9hPiAoY29kZSBlZGl0b3IpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9hbG0udG9vbHMiPkFMTSBUb29sczwvYT4gKFR5cGVTY3JpcHQgcG93ZXJlZCBJREUpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9hbWJlci1sYW5nLm5ldC8iPkFtYmVyPC9hPiAoSmF2YVNjcmlwdC1iYXNlZCBTbWFsbHRhbGsgc3lzdGVtKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vYXBhY2hlZ3VpLmNhLyI+QXBhY2hlIEdVSTwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2FwZXllLm9yZy8iPkFQRXllPC9hPiAodG9vbCBmb3IgdGVzdGluZyAmYW1wOyBkb2N1bWVudGluZyBBUElzKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2FwcGVuZ2luZS1jb2RpYWQiPkFwcGVuZ2luZSBDb2RpYWQ8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vY2hyb21lLmdvb2dsZS5jb20vd2Vic3RvcmUvZGV0YWlsL2JldHRlci10ZXh0LXZpZXdlci9sY2FpZG9wZGZmaGZlbW9lZm9hYWRlY3Bwbmpka25rYyI+QmV0dGVyIFRleHQgVmlld2VyPC9hPiAocGxhaW4gdGV4dCByZWFkZXIgYXBwIGZvciBDaHJvbWUpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9ibG9nLmJpdGJ1Y2tldC5vcmcvMjAxMy8wNS8xNC9lZGl0LXlvdXItY29kZS1pbi10aGUtY2xvdWQtd2l0aC1iaXRidWNrZXQvIj5CaXRidWNrZXQ8L2E+IChjb2RlIGhvc3RpbmcpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9idXp6LmJsb2dnZXIuY29tLzIwMTMvMDQvaW1wcm92ZW1lbnRzLXRvLWJsb2dnZXItdGVtcGxhdGUtaHRtbC5odG1sIj5CbG9nZ2VyJ3MgdGVtcGxhdGUgZWRpdG9yPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vYmx1ZWdyaWZmb24ub3JnLyI+Qmx1ZUdyaWZmb248L2E+IChIVE1MIGVkaXRvcik8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2lzZGFtcGUvQm9zb25FZGl0b3JFeHBlcmltZW50YWwiPkJvc29uIEVkaXRvcjwvYT4gKGNvZGUgZWRpdG9yKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vY2FyZ29jb2xsZWN0aXZlLmNvbS8iPkNhcmdvIENvbGxlY3RpdmU8L2E+IChjcmVhdGl2ZSBwdWJsaXNoaW5nIHBsYXRmb3JtKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9jaHJvbWUtZGV2ZWxvcGVyLXRvb2xzLyI+Q2hyb21lIERldlRvb2xzPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vY2xpY2toZWxwLmNvLyI+Q2xpY2tIZWxwPC9hPiAodGVjaG5pY2FsIHdyaXRpbmcgdG9vbCk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2NvZGUud29ybGQvIj5Db2RlV29ybGQ8L2E+IChIYXNrZWxsIHBsYXlncm91bmQpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9jb21wbGV0ZS1seS5hcHBzcG90LmNvbS9wbGF5Z3JvdW5kL2NvZGUucGxheWdyb3VuZC5odG1sIj5Db21wbGV0ZS5seSBwbGF5Z3JvdW5kPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwczovL2NvZGVhbnl3aGVyZS5jb20vIj5Db2RlYW55d2hlcmU8L2E+IChtdWx0aS1wbGF0Zm9ybSBjbG91ZCBlZGl0b3IpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9kcnVwYWwub3JnL3Byb2plY3QvY3BuIj5Db2RlIHBlciBOb2RlPC9hPiAoRHJ1cGFsIG1vZHVsZSk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5jb2RlYnVnYXBwLmNvbS8iPkNvZGVidWc8L2E+IChQSFAgWGRlYnVnIGZyb250LWVuZCk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2FuZ2Vsb3plcnIvQ29kZU1pcnJvci1FY2xpcHNlIj5Db2RlTWlycm9yIEVjbGlwc2U8L2E+IChlbWJlZCBDTSBpbiBFY2xpcHNlKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vZW1tZXQuaW8vYmxvZy9jb2RlbWlycm9yLW1vdmllLyI+Q29kZU1pcnJvciBtb3ZpZTwvYT4gKHNjcmlwdGVkIGVkaXRpbmcgZGVtb3MpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9jb2RlbWlycm9yMi1nd3QvIj5Db2RlTWlycm9yMi1HV1Q8L2E+IChHb29nbGUgV2ViIFRvb2xraXQgd3JhcHBlcik8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5jcnVuY2h6aWxsYS5jb20vY29kZS1tb25zdGVyIj5Db2RlIE1vbnN0ZXI8L2E+ICYgPGEgaHJlZj0iaHR0cDovL3d3dy5jcnVuY2h6aWxsYS5jb20vY29kZS1tYXZlbiI+Q29kZSBNYXZlbjwvYT4gKGxlYXJuaW5nIGVudmlyb25tZW50KTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vY29kZXBlbi5pbyI+Q29kZXBlbjwvYT4gKGdhbGxlcnkgb2YgYW5pbWF0aW9ucyk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9jb2RlcnBhZC5pby8iPkNvZGVycGFkPC9hPiAoaW50ZXJ2aWV3aW5nIHRvb2wpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9zYXNzdHdvLmNvZGVzY2hvb2wuY29tL2xldmVscy8xL2NoYWxsZW5nZXMvMSI+Q29kZSBTY2hvb2w8L2E+IChvbmxpbmUgdGVjaCBsZWFybmluZyBlbnZpcm9ubWVudCk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2NvZGUtc25pcHBldHMuYnVuZ2VzaGVhLmNvbS8iPkNvZGUgU25pcHBldHM8L2E+IChXb3JkUHJlc3Mgc25pcHBldCBtYW5hZ2VtZW50IHBsdWdpbik8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2FudG9ubWkuZ2l0aHViLmlvL2NvZGVfdG9nZXRoZXIvIj5Db2RlIHRvZ2V0aGVyPC9hPiAoY29sbGFib3JhdGl2ZSBlZGl0aW5nKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vY29kZXYuaXQvIj5Db2RldjwvYT4gKGNvbGxhYm9yYXRpdmUgSURFKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vd3d3LmNvZGV6YW1wbGUuY29tIj5Db2RlWmFtcGxlPC9hPiAoY29kZSBzbmlwcGV0IHNoYXJpbmcpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9jb2Rpby5jb20iPkNvZGlvPC9hPiAoV2ViIElERSk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL290LnN1YnN0YW5jZS5pby9kZW1vLyI+Q29sbGFib3JhdGl2ZSBDb2RlTWlycm9yIGRlbW88L2E+IChDb2RlTWlycm9yICsgb3BlcmF0aW9uYWwgdHJhbnNmb3Jtcyk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5jb21tdW5pdHljb2RlY2FtcC5jb20vIj5Db21tdW5pdHkgQ29kZSBDYW1wPC9hPiAoY29kZSBzbmlwcGV0IHNoYXJpbmcpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cuY29tcGlsZWphdmEubmV0LyI+Y29tcGlsZWphdmEubmV0PC9hPiAob25saW5lIEphdmEgc2FuZGJveCk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5ja3duYy5jb20vIj5DS1dOQzwvYT4gKFVNTCBlZGl0b3IpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cuY3Jvc3N1aS5jb20vIj5Dcm9zc1VJPC9hPiAoY3Jvc3MtcGxhdGZvcm0gVUkgYnVpbGRlcik8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3Jzbm91cy5jb20vY3J1bmNoZXIvIj5DcnVuY2hlcjwvYT4gKG5vdGVwYWQgd2l0aCBjYWxjdWxhdGlvbiBmZWF0dXJlcyk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5jcnVkemlsbGEuY29tLyI+Q3J1ZHppbGxhPC9hPiAoc2VsZi1ob3N0ZWQgd2ViIElERSk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2Nzc2RlY2suY29tLyI+Q1NTRGVjazwvYT4gKENTUyBzaG93Y2FzZSk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2lyZW5lcm9zLmNvbS9kZWNrL2RlY2suanMtY29kZW1pcnJvci9pbnRyb2R1Y3Rpb24vI3RleHRhcmVhLWNvZGUiPkRlY2suanMgaW50ZWdyYXRpb248L2E+IChzbGlkZXMgd2l0aCBlZGl0b3JzKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vd3d3LmRibmluamEuY29tIj5EYk5pbmphPC9hPiAoTXlTUUwgYWNjZXNzIGludGVyZmFjZSk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9jaGF0LmVjaG9wbGV4LnVzLyI+RWNob3BsZXh1czwvYT4gKGNoYXQgYW5kIGNvbGxhYm9yYXRpdmUgY29kaW5nKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vd3d3LmVjc3NwZXJ0LmNvbS8iPmVDU1NwZXJ0PC9hPiAoQ1NTIGRlbW9zIGFuZCBleHBlcmltZW50cyk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2VsbS1sYW5nLm9yZy9FeGFtcGxlcy5lbG0iPkVsbSBsYW5ndWFnZSBleGFtcGxlczwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2Vsb3F1ZW50amF2YXNjcmlwdC5uZXQvY2hhcHRlcjEuaHRtbCI+RWxvcXVlbnQgSmF2YVNjcmlwdDwvYT4gKGJvb2spPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9lbW1ldC5pbyI+RW1tZXQ8L2E+IChmYXN0IFhNTCBlZGl0aW5nKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vZXNwcnVpbm8vRXNwcnVpbm9XZWJJREUiPkVzcHJ1aW5vIFdlYiBJREU8L2E+IChDaHJvbWUgQXBwIGZvciB3cml0aW5nIGNvZGUgb24gRXNwcnVpbm8gZGV2aWNlcyk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5mYXN0ZmlnLmNvbS8iPkZhc3RmaWc8L2E+IChvbmxpbmUgY29tcHV0YXRpb24vbWF0aCB0b29sKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwczovL21ldGFjcGFuLm9yZy9tb2R1bGUvRmFyYWJpIj5GYXJhYmk8L2E+IChtb2Rlcm4gUGVybCBJREUpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9ibG9nLnBhbWVsYWZveC5vcmcvMjAxMi8wMi9pbnRlcmFjdGl2ZS1odG1sNS1zbGlkZXMtd2l0aC1mYXRob21qcy5odG1sIj5GYXRob21KUyBpbnRlZ3JhdGlvbjwvYT4gKHNsaWRlcyB3aXRoIGVkaXRvcnMsIGFnYWluKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwczovL3BoYW50b211cy5jb20vIj5QaGFudG9tdXM8L2E+IChibG9nZ2luZyBwbGF0Zm9ybSk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2ZpZGRsZXNhbGFkLmNvbS8iPkZpZGRsZSBTYWxhZDwvYT4gKHdlYiBkZXZlbG9wbWVudCBlbnZpcm9ubWVudCk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3NpbW9nZW8vRmlsZW1hbmFnZXIiPkZpbGVtYW5hZ2VyPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwczovL2hhY2tzLm1vemlsbGEub3JnLzIwMTMvMTEvZmlyZWZveC1kZXZlbG9wZXItdG9vbHMtZXBpc29kZS0yNy1lZGl0LWFzLWh0bWwtY29kZW1pcnJvci1tb3JlLyI+RmlyZWZveCBEZXZlbG9wZXIgVG9vbHM8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cuZmlyZXBhZC5pbyI+RmlyZXBhZDwvYT4gKGNvbGxhYm9yYXRpdmUgdGV4dCBlZGl0b3IpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2Vycml0Y29kZXJldmlldy5jb20vIj5HZXJyaXQ8L2E+J3MgZGlmZiB2aWV3IGFuZCBpbmxpbmUgZWRpdG9yPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYWtzL2dpdC1jcngiPkdpdCBDcng8L2E+IChDaHJvbWUgQXBwIGZvciBicm93c2luZyBsb2NhbCBnaXQgcmVwb3MpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly90b3VyLmdvbGFuZy5vcmciPkdvIGxhbmd1YWdlIHRvdXI8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9naXRodWIvYW5kcm9pZCI+R2l0SHViJ3MgQW5kcm9pZCBhcHA8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vc2NyaXB0Lmdvb2dsZS5jb20vIj5Hb29nbGUgQXBwcyBTY3JpcHQ8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93ZWIudXZpYy5jYS9+c2llZmtlbmovZ3JhcGhpdC9ncmFwaGl0Lmh0bWwiPkdyYXBoaXQ8L2E+IChmdW5jdGlvbiBncmFwaGluZyk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9oYWNrbWQuaW8iPkhhY2tNRDwvYT4gKFJlYWx0aW1lIGNvbGxhYm9yYXRpdmUgbWFya2Rvd24gbm90ZXMgb24gYWxsIHBsYXRmb3Jtcyk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5oYW5kY3JhZnQuY29tLyI+SGFuZGNyYWZ0PC9hPiAoSFRNTCBwcm90b3R5cGluZyk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2hhd2tlZS5jb20vIj5IYXdrZWU8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly90cnkuaGF4ZS5vcmciPkhheGU8L2E+IChIYXhlIFBsYXlncm91bmQpIDwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vaGF4cGFkLmNvbS8iPkhheFBhZDwvYT4gKGVkaXRvciBmb3IgV2luIFJUKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vbWVnYWZvbndlYmxhYi5naXRodWIuY29tL2hpc3RvbmUtamF2YXNjcmlwdC8iPkhpc3RvbmUgdGVtcGxhdGUgZW5naW5lIHBsYXlncm91bmQ8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cuaG9tZWdlbmllLml0L2RvY3MvYXV0b21hdGlvbl9nZXRzdGFydGVkLnBocCI+SG9tZWdlbmllPC9hPiAoaG9tZSBhdXRvbWF0aW9uIHNlcnZlcik8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2ljZWNvZGVyLm5ldCI+SUNFY29kZXI8L2E+ICh3ZWIgSURFKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vaXB5dGhvbi5vcmcvIj5JUHl0aG9uPC9hPiAoaW50ZXJhY3RpdmUgY29tcHV0aW5nIHNoZWxsKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJqb2VscGluaGVpcm8uZ2l0aHViLmlvL2l0cmFkaW5nLyI+aVRyYWRpbmc8L2E+IChBbGdvcml0aG1pYyBUcmFkaW5nKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vaS1tb3Mub3JnL2ltb3MvIj5pLU1PUzwvYT4gKG1vZGVsaW5nIGFuZCBzaW11bGF0aW9uIHBsYXRmb3JtKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vd3d3LmphbnZhcy5jb20vIj5KYW52YXM8L2E+ICh2ZWN0b3IgZ3JhcGhpY3MgZWRpdG9yKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vZXh0ZW5zaW9ucy5qb29tbGEub3JnL2V4dGVuc2lvbnMvZWRpdGlvbi9lZGl0b3JzLzg3MjMiPkpvb21sYSBwbHVnaW48L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9qcWZ1bmRhbWVudGFscy5jb20vIj5qUXVlcnkgZnVuZGFtZW50YWxzPC9hPiAoaW50ZXJhY3RpdmUgdHV0b3JpYWwpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9qc2Jpbi5jb20iPmpzYmluLmNvbTwvYT4gKEpTIHBsYXlncm91bmQpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly90b29sLmpzZXIuY29tL3ByZXByb2Nlc3NvciI+SlNFUiBwcmVwcm9jZXNzb3I8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9rdWNoZXJlbmtvL2pzY3BkIj5qc2NwZDwvYT4gKGNvZGUgZHVwbGljYXRpb24gZGV0ZWN0b3IpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9qc2ZpZGRsZS5uZXQiPkpTRmlkZGxlPC9hPiAoYW5vdGhlciBKUyBwbGF5Z3JvdW5kKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vd3d3LmpzaGludC5jb20vIj5KU0hpbnQ8L2E+IChKUyBsaW50ZXIpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9qdW1wc2VsbGVyLmNvbS8iPkp1bXBzZWxsZXI8L2E+IChvbmxpbmUgc3RvcmUgYnVpbGRlcik8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2tsMXAuY29tL2NtdGVzdC8xIj5rbDFwPC9hPiAocGFzdGUgc2VydmljZSk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5rb2RodXMuY29tL2tvZGl0eS8iPktvZGl0PC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8va29kdGVzdC5jb20vIj5Lb2R0ZXN0PC9hPiAoSFRNTC9KUy9DU1MgcGxheWdyb3VuZCk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3RyeS5rb3RsaW5sYW5nLm9yZyI+S290bGluPC9hPiAod2ViLWJhc2VkIG1pbmktSURFIGZvciBLb3RsaW4pPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vbGFib3JhdGUuaW8vIj5MYWJvcmF0ZTwvYT4gKGNvbGxhYm9yYXRpdmUgY29kaW5nKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vbGlnaHR0YWJsZS5jb20vIj5MaWdodCBUYWJsZTwvYT4gKGV4cGVyaW1lbnRhbCBJREUpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9saXZld2VhdmUuY29tLyI+TGl2ZXdlYXZlPC9hPiAoSFRNTC9DU1MvSlMgc2NyYXRjaHBhZCk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL21hcmtsaWdodGVkaXRvci5jb20vIj5NYXJrbGlnaHQgZWRpdG9yPC9hPiAobGlnaHR3ZWlnaHQgbWFya3VwIGVkaXRvcik8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5tZXJnZWx5LmNvbS8iPk1lcmdlbHk8L2E+IChpbnRlcmFjdGl2ZSBkaWZmaW5nKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vd3d3Lml1bmJ1Zy5jb20vbWlodG9vbCI+TUlIVG9vbDwvYT4gKGlPUyB3ZWItYXBwIGRlYnVnZ2luZyB0b29sKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vbW9uZ28tbWFwcmVkdWNlLXdlYmJyb3dzZXIub3BlbnNhZ3Jlcy5jbG91ZGJlZXMubmV0LyI+TW9uZ28gTWFwUmVkdWNlIFdlYkJyb3dzZXI8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9tb250YWdlc3R1ZGlvLmNvbS8iPk1vbnRhZ2UgU3R1ZGlvPC9hPiAod2ViIGFwcCBjcmVhdG9yIHN1aXRlKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vbXZjcGxheWdyb3VuZC5hcHBoYi5jb20vIj5NVkMgUGxheWdyb3VuZDwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly93d3cubXkybmRnZW5lcmF0aW9uLmNvbS8iPk15Mm5kR2VuZXJhdGlvbjwvYT4gKHNvY2lhbCBjb2RpbmcpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cubmF2aWdhdGVjbXMuY29tIj5OYXZpZ2F0ZSBDTVM8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9zb2xpdG9uNC9ub2RlTWlycm9yIj5ub2RlTWlycm9yPC9hPiAoSURFIHByb2plY3QpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vbm90ZXguY2giPk5vVGV4PC9hPiAoclNUIGF1dGhvcmluZyk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9udGVyYWN0LmlvIj5udGVyYWN0PC9hPiAoaW50ZXJhY3RpdmUgbGl0ZXJhdGUgY29kaW5nIG5vdGVib29rKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vb2Frb3V0bGluZXIuY29tIj5PYWs8L2E+IChvbmxpbmUgb3V0bGluZXIpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cuZ3JleWNhbXB1cy5jb20vb3BlbmNhbXB1cyI+T3BlbkNhbXB1czwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2NscmhvbWUub3JnL2FzbS8iPk9SRzwvYT4gKHo4MCBhc3NlbWJseSBJREUpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYW1hY2Rvbi9vcmlvbi1jb2RlbWlycm9yIj5Pcmlvbi1Db2RlTWlycm9yIGludGVncmF0aW9uPC9hPiAocnVubmluZyBDb2RlTWlycm9yIG1vZGVzIGluIE9yaW9uKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vcGFwZXJqcy5vcmcvIj5QYXBlci5qczwvYT4gKGdyYXBoaWNzIHNjcmlwdGluZyk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3BoYXJhb2guanMub3JnLyI+UGhhcmFvaDwvYT4gKGJyb3dzZXIgJmFtcDsgZGVza3RvcCBlZGl0b3IgZm9yIHRoZSBjbGFzc3Jvb20pPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9wcmluYml0LmNvbS8iPlByaW5CaXQ8L2E+IChjb2xsYWJvcmF0aXZlIGNvZGluZyB0b29sKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vcHJvc2UuaW8vIj5Qcm9zZS5pbzwvYT4gKGdpdGh1YiBjb250ZW50IGVkaXRvcik8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9weXBpLnB5dGhvbi5vcmcvcHlwaS9QdWJsaUZvcmdlLyI+UHVibGlGb3JnZTwvYT4gKG9ubGluZSBwdWJsaXNoaW5nIHN5c3RlbSk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3d3dy5wdXp6bGVzY3JpcHQubmV0LyI+UHV6emxlc2NyaXB0PC9hPiAocHV6emxlIGdhbWUgZW5naW5lKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vcWwuaW8vIj5xbC5pbzwvYT4gKGh0dHAgQVBJIHF1ZXJ5IGhlbHBlcik8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3F5YXBwLmNvbSI+UWlZdW4gd2ViIGFwcCBwbGF0Zm9ybTwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2FyaXlhLm9maWxhYnMuY29tLzIwMTEvMDkvaHlicmlkLXdlYm5hdGl2ZS1kZXNrdG9wLWNvZGVtaXJyb3IuaHRtbCI+UXQrV2Via2l0IGludGVncmF0aW9uPC9hPiAoYnVpbGRpbmcgYSBkZXNrdG9wIENvZGVNaXJyb3IgYXBwKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vd3d3LnF1aXZpdmUtZmlsZS1tYW5hZ2VyLmNvbSI+UXVpdml2ZSBGaWxlIE1hbmFnZXI8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9yYXNjYWxtaWNyby5jb20vZG9jcy9iYXNpYy10dXRvcmlhbC1nZXR0aW5nLXN0YXJ0ZWQuaHRtbCI+UmFzY2FsPC9hPiAodGlueSBjb21wdXRlcik8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly93d3cucmVhbHRpbWUuaW8vIj5SZWFsVGltZS5pbzwvYT4gKEludGVybmV0LW9mLVRoaW5ncyBpbmZyYXN0cnVjdHVyZSk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3JlZm9yay5jb20vIj5SZWZvcms8L2E+IChhbmltYXRpb24gZGVtbyBnYWxsZXJ5IGFuZCBzaGFyaW5nKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwczovL2Nsb3VkLnNhZ2VtYXRoLmNvbS8iPlNhZ2VNYXRoQ2xvdWQ8L2E+IChpbnRlcmFjdGl2ZSBtYXRoZW1hdGljYWwgc29mdHdhcmUgZW52aXJvbm1lbnQpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vY2hyb21lLmdvb2dsZS5jb20vd2Vic3RvcmUvZGV0YWlsL3NlcnZlcGhwL21ucGlrb21kY2hqaGtoYmhtYmJvZWhmZGprb2JiZnBvIj5TZXJ2ZVBIUDwvYT4gKFBIUCBjb2RlIHRlc3RpbmcgaW4gQ2hyb21lIGRldiB0b29scyk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly93d3cuc2hhZGVydG95LmNvbS8iPlNoYWRlcnRveTwvYT4gKHNoYWRlciBzaGFyaW5nKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vd3d3LnNrZXRjaHBhdGNoLm5ldC9sYWJzL2xpdmVjb2RlbGFiSW50cm8uaHRtbCI+c2tldGNoUGF0Y2ggTGl2ZWNvZGVsYWI8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cuc2t1bHB0Lm9yZy8iPlNrdWxwdDwvYT4gKGluLWJyb3dzZXIgUHl0aG9uIGVudmlyb25tZW50KTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vc25hcHRvbWF0by5hcHBzcG90LmNvbS9lZGl0b3IuaHRtbCI+U25hcCBUb21hdG88L2E+IChIVE1MIGVkaXRpbmcvdGVzdGluZyBwYWdlKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vc25pcHBldHMucHJvLyI+U25pcHBldHMucHJvPC9hPiAoY29kZSBzbmlwcGV0IHNoYXJpbmcpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cuc29saWRzaG9wcy5jb20vIj5Tb2xpZFNob3BzPC9hPiAoaG9zdGVkIGUtY29tbWVyY2UgcGxhdGZvcm0pPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cuY2VtZXRlY2gubmV0L3NjLyI+U291cmNlQ29kZXIgMzwvYT4gKG9ubGluZSBjYWxjdWxhdG9yIElERSBhbmQgZWRpdG9yKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vc3FsZmlkZGxlLmNvbSI+U1FMRmlkZGxlPC9hPiAoU1FMIHBsYXlncm91bmQpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cuc3VidGUub3JnL3BhZ2UvcHJvZ3JhbWFyLXRhLXRlLXRpLW9ubGluZS8iPlN1YlRlPC9hPiAoQUkgYm90IHByb2dyYW1taW5nIGVudmlyb25tZW50KTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8veHVhbmppLmFwcHNwb3QuY29tL2lzaWNwLyI+U3RydWN0dXJlIGFuZCBJbnRlcnByZXRhdGlvbiBvZiBDb21wdXRlciBQcm9ncmFtczwvYT4sIEludGVyYWN0aXZlIFZlcnNpb248L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3N5ZnJhbWV3b3JrLmFsd2F5c2RhdGEubmV0Ij5TeUJveDwvYT4gKFBIUCBwbGF5Z3JvdW5kKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vd3d3LnRhZ3NwYWNlcy5vcmcvIj5UYWdTcGFjZXM8L2E+IChwZXJzb25hbCBkYXRhIG1hbmFnZXIpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vdGV4dGJveC5pby8iPlRleHRib3guaW88L2E+IChXWVNJV1lHIHJpY2ggdGV4dCBlZGl0b3IpPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwczovL3RoZWZpbGV0cmVlLmNvbSI+VGhlIEZpbGUgVHJlZTwvYT4gKGNvbGxhYiBlZGl0b3IpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93d3cubWFwYm94LmNvbS90aWxlbWlsbC8iPlRpbGVNaWxsPC9hPiAobWFwIGRlc2lnbiB0b29sKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vZG9jLnRpa2kub3JnL1N5bnRheCtIaWdobGlnaHRlciI+VGlraTwvYT4gKHdpa2kgQ01TIGdyb3Vwd2FyZSk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3d3dy50b29sc3ZlcnNlLmNvbS9wcm9kdWN0cy9kYXRhLWV4cGxvcmVyLyI+VG9vbHN2ZXJzZSBEYXRhIEV4cGxvcmVyPC9hPiAoZGF0YWJhc2UgbWFuYWdlbWVudCk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2VuamFsb3QuY29tL3RyaWJ1dGFyeS8yNjM2Mjk2L3NpbndhdmVzLmpzIj5UcmlidXRhcnk8L2E+IChhdWdtZW50ZWQgZWRpdGluZyk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2Jsb2cuZW5nbGFyZC5uZXQvcG9zdC8zOTYwODAwMDYyOS9jb2RlaW50dW1ibHIiPlR1bWJsciBjb2RlIGhpZ2hsaWdodGluZyBzaGltPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vdHVyYm9weS5jb20vIj5UdXJib1BZPC9hPiAod2ViIHB1Ymxpc2hpbmcgZnJhbWV3b3JrKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vY3J1aXNlLmVlY3MudW90dGF3YS5jYS91bXBsZW9ubGluZS8iPlVtcGxlT25saW5lPC9hPiAobW9kZWwtb3JpZW50ZWQgcHJvZ3JhbW1pbmcgdG9vbCk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly91cHNvdXJjZS5qZXRicmFpbnMuY29tL2lkZWEtY2UvZmlsZS9pZGVhLWNlLTc3MDZlNzgzMmFhOWUyZmQwYzJkZWNkYjVjYmVmMjIyNTY5MmM2OTYvcGxhdGZvcm0vcGxhdGZvcm0taW1wbC9zcmMvY29tL2ludGVsbGlqL29wZW5hcGkvZWRpdG9yL2ltcGwvRWRpdG9yRmFjdG9yeUltcGwuamF2YSI+VXBzb3VyY2U8L2E+IChjb2RlIGJyb3dzZXIgYW5kIHJldmlldyB0b29sKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWdhaXRhbi93YWxpa2kiPldhbGlraTwvYT4gKHdpa2kgZW5naW5lKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vd2FtZXIubmV0LyI+V2FtZXI8L2E+ICh3ZWIgYXBwbGljYXRpb24gYnVpbGRlcik8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2JyZXR0ejkvd2ViYXBwZmluZCI+d2ViYXBwZmluZDwvYT4gKHdpbmRvd3MgZmlsZSBiaW5kaW5ncyBmb3Igd2ViYXBwcyk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3d3dy53ZWJnbGFjYWRlbXkuY29tLyI+V2ViR0wgYWNhZGVteTwvYT4gKGxlYXJuaW5nIFdlYkdMKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vd2ViZ2xwbGF5Z3JvdW5kLm5ldC8iPldlYkdMIHBsYXlncm91bmQ8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vd3d3LndlYmtpdC5vcmcvYmxvZy8yNTE4L3N0YXRlLW9mLXdlYi1pbnNwZWN0b3IvI3NvdXJjZS1jb2RlIj5XZWJLaXQgV2ViIGluc3BlY3RvcjwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaHR0cDovL3d3dy53ZXNjaGVtZS5vcmcvIj5XZVNjaGVtZTwvYT4gKGxlYXJuaW5nIHRvb2wpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9iM2xvZy93aWRlIj5XaWRlPC9hPiAoZ29sYW5nIHdlYiBJREUpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly93b3JkcHJlc3Mub3JnL2V4dGVuZC9wbHVnaW5zL2NvZGVtaXJyb3ItZm9yLWNvZGVlZGl0b3IvIj5Xb3JkUHJlc3MgcGx1Z2luPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwczovL3d3dy53cml0ZWxhdGV4LmNvbSI+d3JpdGVMYVRlWDwvYT4gKENvbGxhYm9yYXRpdmUgTGFUZVggRWRpdG9yKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwOi8vd3d3Lnhvc3lzdGVtLm9yZy9ob21lL2FwcGxpY2F0aW9uc193ZWJzaXRlcy94b3N5c3RlbV93ZWJzaXRlL3hvc2lkZV9FTi5waHAiPlhPU2lkZTwvYT4gKG9ubGluZSBlZGl0b3IpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly92aWRlbGlicmkuc291cmNlZm9yZ2UubmV0L2NnaS1iaW4veGlkZWxjZ2kiPlhRdWVyeSB0ZXN0ZXI8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9xNDJqYWFwLmdpdGh1Yi5pby94c2QyY29kZW1pcnJvci8iPnhzZDJjb2RlbWlycm9yPC9hPiAoY29udmVydCBYU0QgdG8gQ00gWE1MIGNvbXBsZXRpb24gaW5mbyk8L2xpPgogICAgPC91bD4KCjwvYXJ0aWNsZT4KCg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/doc/releases.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogUmVsZWFzZSBIaXN0b3J5PC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iZG9jcy5jc3MiPgo8c2NyaXB0IHNyYz0iYWN0aXZlYm9va21hcmsuanMiPjwvc2NyaXB0PgoKPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aDE+Q29kZU1pcnJvcjwvaDE+PGltZyBpZD1sb2dvIHNyYz0ibG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0ibWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBkYXRhLWRlZmF1bHQ9InRydWUiIGhyZWY9IiN2NSI+VmVyc2lvbiA1Lng8L2E+CiAgICA8bGk+PGEgaHJlZj0iI3Y0Ij5WZXJzaW9uIDQueDwvYT4KICAgIDxsaT48YSBocmVmPSIjdjMiPlZlcnNpb24gMy54PC9hPgogICAgPGxpPjxhIGhyZWY9IiN2MiI+VmVyc2lvbiAyLng8L2E+CiAgICA8bGk+PGEgaHJlZj0iI3YxIj5WZXJzaW9uIDAueDwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgoKPGgyPlJlbGVhc2Ugbm90ZXMgYW5kIHZlcnNpb24gaGlzdG9yeTwvaDI+Cgo8c2VjdGlvbiBpZD12NSBjbGFzcz1maXJzdD4KCiAgPGgyPlZlcnNpb24gNS54PC9oMj4KCiAgPHAgY2xhc3M9InJlbCI+MjAtMTAtMjAxNjogPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2NvZGVtaXJyb3ItNS4yMC4wLnppcCI+VmVyc2lvbiA1LjIwLjA8L2E+OjwvcD4KCiAgPHVsIGNsYXNzPXJlbC1ub3RlPgogICAgPGxpPk1ha2UgPGNvZGU+bmV3bGluZUFuZEluZGVudDwvY29kZT4gY29tbWFuZCB3b3JrIHdpdGggbXVsdGlwbGUgY3Vyc29ycyBvbiB0aGUgc2FtZSBsaW5lLjwvbGk+CiAgICA8bGk+TWFrZSBzdXJlIGtleXByZXNzIGV2ZW50cyBmb3IgYmFja3NwYWNlIGFyZSBpZ25vcmVkLjwvbGk+CiAgICA8bGk+VG9rZW5zIHN0eWxlZCB3aXRoIG92ZXJsYXlzIG5vIGxvbmdlciBnZXQgYSBub25zZW5zZSA8Y29kZT5jbS1jbS1vdmVybGF5PC9jb2RlPiBjbGFzcy48L2xpPgogICAgPGxpPkxpbmUgZW5kaW5ncyBmb3IgcGFzdGVkIGNvbnRlbnQgYXJlIG5vdyBub3JtYWxpemVkIHRvIHRoZSBlZGl0b3IncyA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL21hbnVhbC5odG1sI29wdGlvbl9saW5lU2VwYXJhdG9yIj5wcmVmZXJyZWQgZW5kaW5nPC9hPi48L2xpPgogICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL2phdmFzY3JpcHQiPmphdmFzY3JpcHQgbW9kZTwvYT46IEltcHJvdmUgc3VwcG9ydCBmb3IgY2xhc3MgZXhwcmVzc2lvbnMuIFN1cHBvcnQgVHlwZVNjcmlwdCBvcHRpb25hbCBjbGFzcyBwcm9wZXJ0aWVzLCB0aGUgPGNvZGU+YWJzdHJhY3Q8L2NvZGU+IGtleXdvcmQsIGFuZCByZXR1cm4gdHlwZSBkZWNsYXJhdGlvbnMgZm9yIGFycm93IGZ1bmN0aW9ucy48L2xpPgogICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL2NzcyI+Y3NzIG1vZGU8L2E+OiBGaXggaGlnaGxpZ2h0aW5nIG9mIG1peGVkLWNhc2Uga2V5d29yZHMuPC9saT4KICAgIDxsaT48YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL21hbnVhbC5odG1sI2FkZG9uX2Nsb3NlYnJhY2tldHMiPmNsb3NlYnJhY2tldHMgYWRkb248L2E+OiBJbXByb3ZlIGJlaGF2aW9yIHdoZW4gdHlwaW5nIGEgcXVvdGUgYmVmb3JlIGEgc3RyaW5nLjwvbGk+CiAgICA8bGk+VGhlIGNvcmUgaXMgbm93IG1haW50YWluZWQgYXMgYSBudW1iZXIgb2Ygc21hbGwgZmlsZXMsIHVzaW5nIEVTNiBzeW50YXggYW5kIG1vZHVsZXMsIHVuZGVyIHRoZSA8Y29kZT5zcmMvPC9jb2RlPiBkaXJlY3RvcnkuIEEgZ2l0IGNoZWNrb3V0IG5vIGxvbmdlciBjb250YWlucyBhIHdvcmtpbmcgPGNvZGU+Y29kZW1pcnJvci5qczwvY29kZT4gdW50aWwgeW91IDxjb2RlPm5wbSBidWlsZDwvY29kZT4gKGJ1dCB3aGVuIGluc3RhbGxpbmcgZnJvbSBOUE0sIGl0IGlzIGluY2x1ZGVkKS48L2xpPgogICAgPGxpPlRoZSA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL21hbnVhbC5odG1sI2V2ZW50X3JlZnJlc2giPjxjb2RlPnJlZnJlc2g8L2NvZGU+PC9hPiBldmVudCBpcyBub3cgZG9jdW1lbnRlZCBhbmQgc3RhYmxlLjwvbGk+CiAgPC91bD4KCiAgPHAgY2xhc3M9InJlbCI+MjAtMDktMjAxNjogPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2NvZGVtaXJyb3ItNS4xOS4wLnppcCI+VmVyc2lvbiA1LjE5LjA8L2E+OjwvcD4KCiAgPHVsIGNsYXNzPXJlbC1ub3RlPgogICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL2VybGFuZyI+ZXJsYW5nIG1vZGU8L2E+OiBGaXggbW9kZSBjcmFzaCB3aGVuIHRyeWluZyB0byByZWFkIGFuIGVtcHR5IGNvbnRleHQuPC9saT4KICAgIDxsaT48YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL21hbnVhbC5odG1sI2FkZG9uX2NvbW1lbnQiPmNvbW1lbnQgYWRkb248L2E+OiBGaXggYnJva2VuIGJlaGF2aW9yIHdoZW4gdG9nZ2xpbmcgY29tbWVudHMgaW5zaWRlIGEgY29tbWVudC48L2xpPgogICAgPGxpPnhtbC1mb2xkIGFkZG9uOiBGaXggYSBudWxsLWRlcmVmZXJlbmNlIGJ1Zy48L2xpPgogICAgPGxpPlBhZ2UgdXAgYW5kIHBhZ2UgZG93biBub3cgZG8gc29tZXRoaW5nIGV2ZW4gaW4gc2luZ2xlLWxpbmUgZG9jdW1lbnRzLjwvbGk+CiAgICA8bGk+Rml4IGFuIGlzc3VlIHdoZXJlIHRoZSBjdXJzb3IgcG9zaXRpb24gY291bGQgYmUgb2ZmIGluIHJlYWxseSBsb25nICh+ODAwMCBjaGFyYWN0ZXIpIHRva2Vucy48L2xpPgogICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL2phdmFzY3JpcHQiPmphdmFzY3JpcHQgbW9kZTwvYT46IEJldHRlciBpbmRlbnRhdGlvbiB3aGVuIHNlbWljb2xvbnMgYXJlIG1pc3NpbmcuIEJldHRlciBzdXBwb3J0IGZvciBUeXBlU2NyaXB0IGNsYXNzZXMsIG9wdGlvbmFsIHBhcmFtZXRlcnMsIGFuZCB0aGUgPGNvZGU+dHlwZTwvY29kZT4ga2V5d29yZC48L2xpPgogICAgPGxpPlRoZSA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL21hbnVhbC5odG1sI2V2ZW50X2JsdXIiPjxjb2RlPmJsdXI8L2NvZGU+PC9hPiBhbmQgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNldmVudF9mb2N1cyI+PGNvZGU+Zm9jdXM8L2NvZGU+PC9hPiBldmVudHMgbm93IHBhc3MgdGhlIERPTSBldmVudCB0byB0aGVpciBoYW5kbGVycy48L2xpPgogIDwvdWw+CgogIDxwIGNsYXNzPSJyZWwiPjIzLTA4LTIwMTY6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTUuMTguMi56aXAiPlZlcnNpb24gNS4xOC4yPC9hPjo8L3A+CgogIDx1bCBjbGFzcz1yZWwtbm90ZT4KICAgIDxsaT48YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS92dWUiPnZ1ZSBtb2RlPC9hPjogRml4IG91dGRhdGVkIHJlZmVyZW5jZXMgdG8gcmVuYW1lZCBQdWcgbW9kZSBkZXBlbmRlbmN5LjwvbGk+CiAgPC91bD4KCiAgPHAgY2xhc3M9InJlbCI+MjItMDgtMjAxNjogPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2NvZGVtaXJyb3ItNS4xOC4wLnppcCI+VmVyc2lvbiA1LjE4LjA8L2E+OjwvcD4KCiAgPHVsIGNsYXNzPXJlbC1ub3RlPgogICAgPGxpPk1ha2Ugc3VyZSA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL21hbnVhbC5odG1sI2FkZExpbmVDbGFzcyI+Z3V0dGVyIGJhY2tncm91bmRzPC9hPiBzdGljayB0byB0aGUgcmVzdCBvZiB0aGUgZ3V0dGVyIGR1cmluZyBob3Jpem9udGFsIHNjcm9sbGluZy48L2xpPgogICAgPGxpPlRoZSBjb250ZW50ZWRpdGFibGUgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNvcHRpb25faW5wdXRTdHlsZSI+PGNvZGU+aW5wdXRTdHlsZTwvY29kZT48L2E+IG5vdyBwcm9wZXJseSBzdXBwb3J0cyBwYXN0aW5nIG9uIHByZS1FZGdlIElFIHZlcnNpb25zLjwvbGk+CiAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvamF2YXNjcmlwdCI+amF2YXNjcmlwdCBtb2RlPC9hPjogRml4IHNvbWUgc21hbGwgcGFyc2luZyBidWdzIGFuZCBpbXByb3ZlIFR5cGVTY3JpcHQgc3VwcG9ydC48L2xpPgogICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjYWRkb25fbWF0Y2hicmFja2V0cyI+bWF0Y2hicmFja2V0cyBhZGRvbjwvYT46IEZpeCBidWcgd2hlcmUgYWN0aXZlIGhpZ2hsaWdodGluZyB3YXMgbGVmdCBpbiBlZGl0b3Igd2hlbiB0aGUgYWRkb24gd2FzIGRpc2FibGVkLjwvbGk+CiAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNhZGRvbl9tYXRjaC1oaWdobGlnaHRlciI+bWF0Y2gtaGlnaGxpZ2h0ZXIgYWRkb248L2E+OiBPbmx5IHN0YXJ0IGhpZ2hsaWdodGluZyB0aGluZ3Mgd2hlbiB0aGUgZWRpdG9yIGdhaW5zIGZvY3VzLjwvbGk+CiAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNhZGRvbl9qYXZhc2NyaXB0LWhpbnQiPmphdmFzY3JpcHQtaGludCBhZGRvbjwvYT46IEFsc28gY29tcGxldGUgbm9uLWVudW1lcmFibGUgcHJvcGVydGllcy48L2xpPgogICAgPGxpPlRoZSA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL21hbnVhbC5odG1sI2FkZE92ZXJsYXkiPjxjb2RlPmFkZE92ZXJsYXk8L2NvZGU+PC9hPiBtZXRob2Qgbm93IHN1cHBvcnRzIGEgPGNvZGU+cHJpb3JpdHk8L2NvZGU+IG9wdGlvbiB0byBjb250cm9sIHRoZSBvcmRlciBpbiB3aGljaCBvdmVybGF5cyBhcmUgYXBwbGllZC48L2xpPgogICAgPGxpPk1JTUUgdHlwZXMgdGhhdCBlbmQgaW4gPGNvZGU+K2pzb248L2NvZGU+IG5vdyBkZWZhdWx0IHRvIHRoZSBKU09OIG1vZGUgd2hlbiB0aGUgTUlNRSBpdHNlbGYgaXMgbm90IGRlZmluZWQuPC9saT4KICAgIDxsaT5UaGUgbW9kZSBmb3JtZXJseSBrbm93biBhcyBKYWRlIHdhcyByZW5hbWVkIHRvIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL3B1ZyI+UHVnPC9hPi48L2xpPgogICAgPGxpPlRoZSA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9weXRob24iPlB5dGhvbiBtb2RlPC9hPiBub3cgZGVmYXVsdHMgdG8gUHl0aG9uIDMgKHJhdGhlciB0aGFuIDIpIHN5bnRheC48L2xpPgogIDwvdWw+CgogIDxwIGNsYXNzPSJyZWwiPjE5LTA3LTIwMTY6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTUuMTcuMC56aXAiPlZlcnNpb24gNS4xNy4wPC9hPjo8L3A+CgogIDx1bCBjbGFzcz0icmVsLW5vdGUiPgogICAgPGxpPkZpeCBwcm9ibGVtIHdpdGggd3JhcHBlZCB0cmFpbGluZyB3aGl0ZXNwYWNlIGRpc3BsYXlpbmcgaW5jb3JyZWN0bHkuPC9saT4KICAgIDxsaT5QcmV2ZW50IElNRSBkaWFsb2cgZnJvbSBvdmVybGFwcGluZyB0eXBlZCBjb250ZW50IGluIENocm9tZS48L2xpPgogICAgPGxpPkltcHJvdmUgbWVhc3VyaW5nIG9mIGNoYXJhY3RlcnMgbmVhciBhIGxpbmUgd3JhcC48L2xpPgogICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL2phdmFzY3JpcHQiPmphdmFzY3JpcHQgbW9kZTwvYT46IEltcHJvdmUgc3VwcG9ydCBmb3IgPGNvZGU+YXN5bmM8L2NvZGU+LCBhbGxvdyB0cmFpbGluZyBjb21tYXMgaW4gPGNvZGU+aW1wb3J0PC9jb2RlPiBsaXN0cy48L2xpPgogICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kZW1vL3ZpbS5odG1sIj52aW0gYmluZGluZ3M8L2E+OiBGaXggYmFja3NwYWNlIGluIHJlcGxhY2UgbW9kZS48L2xpPgogICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kZW1vL3N1YmxpbWUuaHRtbCI+c3VibGltZSBiaW5kaW5nczwvYT46IEZpeCBzb21lIGtleSBiaW5kaW5ncyBvbiBPUyBYIHRvIG1hdGNoIFN1YmxpbWUgVGV4dC48L2xpPgogICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL21hcmtkb3duIj5tYXJrZG93biBtb2RlPC9hPjogQWRkIG1vcmUgY2xhc3NlcyB0byBpbWFnZSBsaW5rcyBpbiBoaWdobGlnaHQtZm9ybWF0dGluZyBtb2RlLjwvbGk+CiAgPC91bD4KCiAgPHAgY2xhc3M9InJlbCI+MjAtMDYtMjAxNjogPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2NvZGVtaXJyb3ItNS4xNi4wLnppcCI+VmVyc2lvbiA1LjE2LjA8L2E+OjwvcD4KCiAgPHVsIGNsYXNzPSJyZWwtbm90ZSI+CiAgICA8bGk+Rml4IGdsaXRjaGVzIHdoZW4gZHJhZ2dpbmcgY29udGVudCBjYXVzZWQgYnkgdGhlIGRyb3AgaW5kaWNhdG9yIHJlY2VpdmluZyBtb3VzZSBldmVudHMuPC9saT4KICAgIDxsaT5NYWtlIENvbnRyb2wtZHJhZyB3b3JrIG9uIEZpcmVmb3guPC9saT4KICAgIDxsaT5NYWtlIGNsaWNraW5nIG9yIHNlbGVjdGlvbi1kcmFnZ2luZyBhdCB0aGUgZW5kIG9mIGEgd3JhcHBlZCBsaW5lIHNlbGVjdCB0aGUgcmlnaHQgcG9zaXRpb24uPC9saT4KICAgIDxsaT48YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL21hbnVhbC5odG1sI2FkZG9uX3Nob3ctaGludCI+c2hvdy1oaW50IGFkZG9uPC9hPjogUHJldmVudCB3aWRnZXQgc2Nyb2xsYmFyIGZyb20gaGlkaW5nIHBhcnQgb2YgdGhlIGhpbnQgdGV4dC48L2xpPgogICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjYWRkb25fcnVsZXJzIj5ydWxlcnMgYWRkb248L2E+OiBQcmV2ZW50IHJ1bGVycyBmcm9tIGZvcmNpbmcgYSBob3Jpem9udGFsIGVkaXRvciBzY3JvbGxiYXIuPC9saT4KICAgIDxsaT48YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL21hbnVhbC5odG1sI2FkZG9uX3NlYXJjaCI+c2VhcmNoIGFkZG9uPC9hPjogQXV0b21hdGljYWxseSBiaW5kIHNlYXJjaC1yZWxhdGVkIGtleXMgaW4gcGVyc2lzdGVudCBkaWFsb2cuPC9saT4KICAgIDxsaT48YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvZGVtby9zdWJsaW1lLmh0bWwiPnN1YmxpbWUga2V5bWFwPC9hPjogQWRkIGEgbXVsdGktY3Vyc29yIGF3YXJlIHNtYXJ0IGJhY2tzcGFjZSBiaW5kaW5nLjwvbGk+CiAgPC91bD4KCiAgPHAgY2xhc3M9InJlbCI+MjAtMDUtMjAxNjogPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2NvZGVtaXJyb3ItNS4xNS4yLnppcCI+VmVyc2lvbiA1LjE1LjI8L2E+OjwvcD4KCiAgPHVsIGNsYXNzPSJyZWwtbm90ZSI+CiAgICA8bGk+Rml4IGEgY3JpdGljYWwgZG9jdW1lbnQgY29ycnVwdGlvbiBidWcgdGhhdCBvY2N1cnMgd2hlbiBhIGRvY3VtZW50IGlzIGdyYWR1YWxseSBncm93bi48L2xpPgogIDwvdWw+CgogIDxwIGNsYXNzPSJyZWwiPjIwLTA1LTIwMTY6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTUuMTUuMC56aXAiPlZlcnNpb24gNS4xNS4wPC9hPjo8L3A+CgogIDx1bCBjbGFzcz0icmVsLW5vdGUiPgogICAgPGxpPkZpeCBidWcgdGhhdCBjYXVzZWQgdGhlIHNlbGVjdGlvbiB0byByZXNldCB3aGVuIGZvY3VzaW5nIHRoZSBlZGl0b3IgaW4gY29udGVudEVkaXRhYmxlIGlucHV0IG1vZGUuPC9saT4KICAgIDxsaT5GaXggaXNzdWUgd2hlcmUgbm90IGFsbCBBU0NJSSBjb250cm9sIGNoYXJhY3RlcnMgd2VyZSBiZWluZyByZXBsYWNlZCBieSBwbGFjZWhvbGRlcnMuPC9saT4KICAgIDxsaT5SZW1vdmUgdGhlIGFzc3VtcHRpb24gdGhhdCBhbGwgbW9kZXMgaGF2ZSBhIDxjb2RlPnN0YXJ0U3RhdGU8L2NvZGU+IG1ldGhvZCBmcm9tIHNldmVyYWwgd3JhcHBpbmcgbW9kZXMuPC9saT4KICAgIDxsaT5GaXggaXNzdWUgd2hlcmUgdGhlIGVkaXRvciB3b3VsZCBjb21wbGFpbiBhYm91dCBvdmVybGFwcGluZyBjb2xsYXBzZWQgcmFuZ2VzIHdoZW4gdGhlcmUgd2VyZW4ndCBhbnkuPC9saT4KICAgIDxsaT5PcHRpbWl6ZSBkb2N1bWVudCB0cmVlIGJ1aWxkaW5nIHdoZW4gbG9hZGluZyBvciBwYXN0aW5nIGh1Z2UgY2h1bmtzIG9mIGNvbnRlbnQuPC9saT4KICAgIDxsaT5FeHBsaWNpdGx5IGJpbmQgQ3RybC1PIG9uIE9TIFggdG8gbWFrZSB0aGF0IGJpbmRpbmcgKOKAnG9wZW4gbGluZeKAnSkgYWN0IGFzIGV4cGVjdGVkLjwvbGk+CiAgICA8bGk+UGFzdGluZyA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL21hbnVhbC5odG1sI29wdGlvbl9saW5lV2lzZUNvcHlDdXQiPmxpbmV3aXNlLWNvcGllZDwvYT4gY29udGVudCB3aGVuIHRoZXJlIGlzIG5vIHNlbGVjdGlvbiBub3cgaW5zZXJ0cyB0aGUgbGluZXMgYWJvdmUgdGhlIGN1cnJlbnQgbGluZS48L2xpPgogICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL21hcmtkb3duLyI+bWFya2Rvd24gbW9kZTwvYT46IEZpeCBzZXZlcmFsIGlzc3VlcyBpbiBtYXRjaGluZyBsaW5rIHRhcmdldHMuPC9saT4KICAgIDxsaT48YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9jbGlrZS8iPmNsaWtlIG1vZGU8L2E+OiBJbXByb3ZlIGluZGVudGF0aW9uIG9mIEMrKyB0ZW1wbGF0ZSBkZWNsYXJhdGlvbnMuPC9saT4KICAgIDxsaT48YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9qYXZhc2NyaXB0LyI+amF2YXNjcmlwdCBtb2RlPC9hPjogU3VwcG9ydCA8Y29kZT5hc3luYzwvY29kZT4vPGNvZGU+YXdhaXQ8L2NvZGU+IGFuZCBpbXByb3ZlIHN1cHBvcnQgZm9yIFR5cGVTY3JpcHQgdHlwZSBzeW50YXguPC9saT4KICA8L3VsPgoKICA8cCBjbGFzcz0icmVsIj4yMC0wNC0yMDE2OiA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvY29kZW1pcnJvci01LjE0LjAuemlwIj5WZXJzaW9uIDUuMTQuMDwvYT46PC9wPgoKICA8dWwgY2xhc3M9InJlbC1ub3RlIj4KICAgIDxsaT48YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL21hbnVhbC5odG1sI3Bvc0Zyb21JbmRleCI+PGNvZGU+cG9zRnJvbUluZGV4PC9jb2RlPjwvYT4gYW5kIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjaW5kZXhGcm9tUG9zIj48Y29kZT5pbmRleEZyb21Qb3M8L2NvZGU+PC9hPiBub3cgdGFrZSA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL21hbnVhbC5odG1sI29wdGlvbl9saW5lU2VwYXJhdG9yIj48Y29kZT5saW5lU2VwYXJhdG9yPC9jb2RlPjwvYT4gaW50byBhY2NvdW50PC9saT4KICAgIDxsaT48YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvZGVtby92aW0uaHRtbCI+dmltIGJpbmRpbmdzPC9hPjogT25seSBjYWxsIDxjb2RlPi5zYXZlKCk8L2NvZGU+IHdoZW4gaXQgaXMgYWN0dWFsbHkgYXZhaWxhYmxlPC9saT4KICAgIDxsaT48YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL21hbnVhbC5odG1sI2FkZG9uX2NvbW1lbnQiPmNvbW1lbnQgYWRkb248L2E+OiBCZSBjYXJlZnVsIG5vdCB0byBtYW5nbGUgbXVsdGktbGluZSBzdHJpbmdzPC9saT4KICAgIDxsaT48YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9weXRob24vaW5kZXguaHRtbCI+UHl0aG9uIG1vZGU8L2E+OiBJbXByb3ZlIGRpc3Rpbmd1aXNoaW5nIG9mIGRlY29yYXRvcnMgZnJvbSA8Y29kZT5APC9jb2RlPiBvcGVyYXRvcnM8L2xpPgogICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjZmluZE1hcmtzIj48Y29kZT5maW5kTWFya3M8L2NvZGU+PC9hPjogTm8gbG9uZ2VyIHJldHVybiBtYXJrcyB0aGF0IHRvdWNoIGJ1dCBkb24ndCBvdmVybGFwIGdpdmVuIHJhbmdlPC9saT4KICAgIDxsaT48YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvZGVtby92aW0uaHRtbCI+dmltIGJpbmRpbmdzPC9hPjogQWRkIHlhbmsgY29tbWFuZDwvbGk+CiAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNhZGRvbl9tYXRjaC1oaWdobGlnaHRlciI+bWF0Y2gtaGlnaGxpZ2h0ZXIgYWRkb248L2E+OiBBZGQgPGNvZGU+dHJpbTwvY29kZT4gb3B0aW9uIHRvIGRpc2FibGUgaWdub3Jpbmcgb2Ygd2hpdGVzcGFjZTwvbGk+CiAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvcG93ZXJzaGVsbC9pbmRleC5odG1sIj5Qb3dlclNoZWxsIG1vZGU8L2E+OiBBZGRlZDwvbGk+CiAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUveWFjYXMvaW5kZXguaHRtbCI+WWFjYXMgbW9kZTwvYT46IEFkZGVkPC9saT4KICAgIDxsaT48YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS93ZWJpZGwvaW5kZXguaHRtbCI+V2ViIElETCBtb2RlPC9hPjogQWRkZWQ8L2xpPgogICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL3Nhcy9pbmRleC5odG1sIj5TQVMgbW9kZTwvYT46IEFkZGVkPC9saT4KICAgIDxsaT48YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9tYm94L2luZGV4Lmh0bWwiPm1ib3ggbW9kZTwvYT46IEFkZGVkPC9saT4KICAgIDxsaT5GdWxsIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL0NvZGVNaXJyb3IvY29tcGFyZS81LjEzLjQuLi41LjE0LjAiPmxpc3Qgb2YgcGF0Y2hlczwvYT48L2xpPgogIDwvdWw+CgogIDxwIGNsYXNzPSJyZWwiPjIxLTAzLTIwMTY6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTUuMTMuMi56aXAiPlZlcnNpb24gNS4xMy4yPC9hPjo8L3A+CgogIDx1bCBjbGFzcz0icmVsLW5vdGUiPgogICAgPGxpPlNvbHZlcyBhIHByb2JsZW0gd2hlcmUgdGhlIGd1dHRlciB3b3VsZCBzb21ldGltZXMgbm90IGV4dGVuZCBhbGwgdGhlIHdheSB0byB0aGUgZW5kIG9mIHRoZSBkb2N1bWVudC48L2xpPgogIDwvdWw+CgogIDxwIGNsYXNzPSJyZWwiPjIxLTAzLTIwMTY6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTUuMTMuemlwIj5WZXJzaW9uIDUuMTM8L2E+OjwvcD4KCiAgPHVsIGNsYXNzPSJyZWwtbm90ZSI+CiAgICA8bGk+TmV3IERPTSBldmVudCBmb3J3YXJkZWQ6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjZXZlbnRfZG9tIj48Y29kZT4mcXVvdDtkcmFnbGVhdmUmcXVvdDs8L2NvZGU+PC9hPi48L2xpPgogICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL3Byb3RvYnVmL2luZGV4Lmh0bWwiPnByb3RvYnVmIG1vZGU8L2E+OiBOZXdseSBhZGRlZC48L2xpPgogICAgPGxpPkZpeCBwcm9ibGVtIHdoZXJlIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjZmluZE1hcmtzIj48Y29kZT5maW5kTWFya3M8L2NvZGU+PC9hPiBzb21ldGltZXMgZmFpbGVkIHRvIGZpbmQgbXVsdGktbGluZSBtYXJrcy48L2xpPgogICAgPGxpPkZpeCBjcmFzaCB0aGF0IHNob3dlZCB1cCB3aGVuIGF0b21pYyByYW5nZXMgYW5kIGJpZGkgdGV4dCB3ZXJlIGNvbWJpbmVkLjwvbGk+CiAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2RlbW8vY29tcGxldGUuaHRtbCI+c2hvdy1oaW50IGFkZG9uPC9hPjogQ29tcGxldGlvbiB3aWRnZXRzIG5vIGxvbmdlciBjbG9zZSB3aGVuIHRoZSBsaW5lIGluZGVudGVkIG9yIGRlZGVudGVkLjwvbGk+CiAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2RlbW8vbWVyZ2UuaHRtbCI+bWVyZ2UgYWRkb248L2E+OiBGaXggYnVnIHdoZW4gbWVyZ2luZyBjaHVua3MgYXQgdGhlIGVuZCBvZiB0aGUgZmlsZS48L2xpPgogICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjYWRkb25fcGxhY2Vob2xkZXIiPnBsYWNlaG9sZGVyIGFkZG9uPC9hPjogTm8gbG9uZ2VyIGdldHMgY29uZnVzZWQgYnkgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2RvYy9tYW51YWwuaHRtbCNzd2FwRG9jIj48Y29kZT5zd2FwRG9jPC9jb2RlPjwvYT4uPC9saT4KICAgIDxsaT48YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL21hbnVhbC5odG1sI2FkZG9uX3NpbXBsZXNjcm9sbGJhcnMiPnNpbXBsZXNjcm9sbGJhcnMgYWRkb248L2E+OiBGaXggaW52YWxpZCBzdGF0ZSB3aGVuIGRlbGV0aW5nIGF0IGVuZCBvZiBkb2N1bWVudC48L2xpPgogICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL2NsaWtlL2luZGV4Lmh0bWwiPmNsaWtlIG1vZGU8L2E+OiBObyBsb25nZXIgZ2V0cyBjb25mdXNlZCB3aGVuIGEgY29tbWVudCBzdGFydHMgYWZ0ZXIgYW4gb3BlcmF0b3IuPC9saT4KICAgIDxsaT48YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9tYXJrZG93bi9pbmRleC5odG1sIj5tYXJrZG93biBtb2RlPC9hPjogTm93IHN1cHBvcnRzIENvbW1vbk1hcmstc3R5bGUgZmxleGlibGUgbGlzdCBpbmRlbnRhdGlvbi48L2xpPgogICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL2R5bGFuL2luZGV4Lmh0bWwiPmR5bGFuIG1vZGU8L2E+OiBTZXZlcmFsIGltcHJvdmVtZW50cyBhbmQgZml4ZXMuPC9saT4KICAgIDxsaT5GdWxsIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL0NvZGVNaXJyb3IvY29tcGFyZS81LjEyLjAuLi41LjEzLjAiPmxpc3Qgb2YgcGF0Y2hlczwvYT48L2xpPgogIDwvdWw+CgogIDxwIGNsYXNzPSJyZWwiPjE5LTAyLTIwMTY6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTUuMTIuemlwIj5WZXJzaW9uIDUuMTI8L2E+OjwvcD4KCiAgPHVsIGNsYXNzPSJyZWwtbm90ZSI+CiAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2RlbW8vdmltLmh0bWwiPlZpbSBiaW5kaW5nczwvYT46IEN0cmwtUSBpcyBub3cgYW4gYWxpYXMgZm9yIEN0cmwtVi48L2xpPgogICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kZW1vL3ZpbS5odG1sIj5WaW0gYmluZGluZ3M8L2E+OiBUaGUgVmltIEFQSSBub3cgZXhwb3NlcyBhbiA8Y29kZT51bm1hcDwvY29kZT4gbWV0aG9kIHRvIHVubWFwIGJpbmRpbmdzLjwvbGk+CiAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2RlbW8vYWN0aXZlbGluZS5odG1sIj5hY3RpdmUtbGluZSBhZGRvbjwvYT46IFRoaXMgYWRkb24gY2FuIG5vdyBzdHlsZSB0aGUgYWN0aXZlIGxpbmUncyBndXR0ZXIuPC9saT4KICAgIDxsaT48YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9mY2wvIj5GQ0wgbW9kZTwvYT46IE5ld2x5IGFkZGVkLjwvbGk+CiAgICA8bGk+PGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L21vZGUvc3FsLyI+U1FMIG1vZGU8L2E+OiBOb3cgaGFzIGEgUG9zdGdyZXNxbCBkaWFsZWN0LjwvbGk+CiAgICA8bGk+Rml4IDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL0NvZGVNaXJyb3IvaXNzdWVzLzM3ODEiPmlzc3VlPC9hPiB3aGVyZSB0cnlpbmcgdG8gc2Nyb2xsIHRvIGEgaG9yaXpvbnRhbCBwb3NpdGlvbiBvdXRzaWRlIG9mIHRoZSBkb2N1bWVudCdzIHdpZHRoIGNvdWxkIGNhdXNlIHRoZSBndXR0ZXIgdG8gYmUgcG9zaXRpb25lZCBpbmNvcnJlY3RseS48L2xpPgogICAgPGxpPlVzZSBhYnNvbHV0ZSwgcmF0aGVyIHRoYW4gZml4ZWQgcG9zaXRpb25pbmcgaW4gdGhlIGNvbnRleHQtbWVudSBpbnRlcmNlcHQgaGFjaywgdG8gd29yayBhcm91bmQgYSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9Db2RlTWlycm9yL2lzc3Vlcy8zMjM4Ij5wcm9ibGVtPC9hPiB3aGVuIHRoZSBlZGl0b3IgaXMgaW5zaWRlIGEgdHJhbnNmb3JtZWQgcGFyZW50IGNvbnRhaW5lci48L2xpPgogICAgPGxpPlNvbHZlIGEgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvQ29kZU1pcnJvci9pc3N1ZXMvMzgyMSI+cHJvYmxlbTwvYT4gd2hlcmUgdGhlIGhvcml6b250YWwgc2Nyb2xsYmFyIGNvdWxkIGhpZGUgdGV4dCBpbiBGaXJlZm94LjwvbGk+CiAgICA8bGk+Rml4IGEgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvQ29kZU1pcnJvci9pc3N1ZXMvMzgzNCI+YnVnPC9hPiB0aGF0IGNhdXNlZCBwaGFudG9tIHNjcm9sbCBzcGFjZSB1bmRlciB0aGUgdGV4dCBpbiBzb21lIHNpdHVhdGlvbnMuPC9saT4KICAgIDxsaT48YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvZGVtby9zdWJsaW1lLmh0bWwiPlN1YmxpbWUgVGV4dCBiaW5kaW5nczwvYT46IEJpbmQgZGVsZXRlLWxpbmUgdG8gU2hpZnQtQ3RybC1LIG9uIE9TIFguPC9saT4KICAgIDxsaT48YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9tYXJrZG93bi8iPk1hcmtkb3duIG1vZGU8L2E+OiBGaXggPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvQ29kZU1pcnJvci9pc3N1ZXMvMzc4NyI+aXNzdWU8L2E+IHdoZXJlIHRoZSBtb2RlIHdvdWxkIGtlZXAgc3RhdGUgcmVsYXRlZCB0byBmZW5jZWQgY29kZSBibG9ja3MgaW4gYW4gdW5zYWZlIHdheSwgbGVhZGluZyB0byBvY2Nhc2lvbmFsIGNvcnJ1cHRlZCBwYXJzZXMuPC9saT4KICAgIDxsaT48YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9tYXJrZG93bi8iPk1hcmtkb3duIG1vZGU8L2E+OiBJZ25vcmUgYmFja3NsYXNoZXMgaW4gY29kZSBmcmFnbWVudHMuPC9saT4KICAgIDxsaT48YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9tYXJrZG93bi8iPk1hcmtkb3duIG1vZGU8L2E+OiBVc2Ugd2hpY2hldmVyIG1vZGUgaXMgcmVnaXN0ZXJlZCBhcyA8Y29kZT50ZXh0L2h0bWw8L2NvZGU+IHRvIHBhcnNlIEhUTUwuPC9saT4KICAgIDxsaT48YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9jbGlrZS8iPkNsaWtlIG1vZGU8L2E+OiBJbXByb3ZlIGluZGVudGF0aW9uIG9mIFNjYWxhIDxjb2RlPj0mZ3Q7PC9jb2RlPiBmdW5jdGlvbnMuPC9saT4KICAgIDxsaT48YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9weXRob24vIj5QeXRob24gbW9kZTwvYT46IEltcHJvdmUgaW5kZW50YXRpb24gb2YgYnJhY2tldGVkIGNvZGUuPC9saT4KICAgIDxsaT48YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9odG1sbWl4ZWQvIj5IVE1MTWl4ZWQgbW9kZTwvYT46IFN1cHBvcnQgbXVsdGktbGluZSBvcGVuaW5nIHRhZ3MgZm9yIHN1Yi1sYW5ndWFnZXMgKDxjb2RlPiZsdDtzY3JpcHQmZ3Q7PC9jb2RlPiwgPGNvZGU+Jmx0O3N0eWxlJmd0OzwvY29kZT4sIGV0YykuPC9saT4KICAgIDxsaT48YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvbW9kZS9zcHJlYWRzaGVldC8iPlNwcmVhZHNoZWV0IG1vZGU8L2E+OiBGaXggYnVnIHdoZXJlIHRoZSBtb2RlIGRpZCBub3QgYWR2YW5jZSB0aGUgc3RyZWFtIHdoZW4gZmluZGluZyBhIGJhY2tzbGFzaC48L2xpPgogICAgPGxpPjxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9tb2RlL3htbC8iPlhNTCBtb2RlPC9hPjogVGhlIG1vZGUgbm93IHRha2VzIGEgPGNvZGU+bWF0Y2hDbG9zaW5nPC9jb2RlPiBvcHRpb24gdG8gY29uZmlndXJlIHdoZXRoZXIgbWlzbWF0Y2hlZCBjbG9zaW5nIHRhZ3Mgc2hvdWxkIGJlIGhpZ2hsaWdodGVkIGFzIGVycm9ycy48L2xpPgogIDwvdWw+CgogIDxwIGNsYXNzPSJyZWwiPjIwLTAxLTIwMTY6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTUuMTEuemlwIj5WZXJzaW9uIDUuMTE8L2E+OjwvcD4KCiAgPHVsIGNsYXNzPSJyZWwtbm90ZSI+CiAgICA8bGk+TmV3IG1vZGVzOiA8YSBocmVmPSIuLi9tb2RlL2pzeC9pbmRleC5odG1sIj5KU1g8L2E+LCA8YSBocmVmPSIuLi9tb2RlL2hhc2tlbGwtbGl0ZXJhdGUvaW5kZXguaHRtbCI+bGl0ZXJhdGUgSGFza2VsbDwvYT48L2xpPgogICAgPGxpPlRoZSBlZGl0b3Igbm93IGZvcndhcmRzIG1vcmUgPGEgaHJlZj0ibWFudWFsLmh0bWwjZXZlbnRfZG9tIj5ET00gZXZlbnRzPC9hPjogPGNvZGU+Y3V0PC9jb2RlPiwgPGNvZGU+Y29weTwvY29kZT4sIDxjb2RlPnBhc3RlPC9jb2RlPiwgYW5kIDxjb2RlPnRvdWNoc3RhcnQ8L2NvZGU+LiBJdCB3aWxsIGFsc28gZm9yd2FyZCA8Y29kZT5tb3VzZWRvd248L2NvZGU+IGZvciBkcmFnIGV2ZW50czwvbGk+CiAgICA8bGk+Rml4ZXMgYSBidWcgd2hlcmUgYm9va21hcmtzIG5leHQgdG8gY29sbGFwc2VkIHNwYW5zIHdlcmUgbm90IHJlbmRlcmVkPC9saT4KICAgIDxsaT5UaGUgPGEgaHJlZj0iLi4vbW9kZS9zd2lmdC9pbmRleC5odG1sIj5Td2lmdDwvYT4gbW9kZSBub3cgc3VwcG9ydHMgYXV0by1pbmRlbnRhdGlvbjwvbGk+CiAgICA8bGk+RnJvbnRtYXR0ZXJzIGluIHRoZSA8YSBocmVmPSIuLi9tb2RlL3lhbWwtZnJvbnRtYXR0ZXIvaW5kZXguaHRtbCI+WUFNTCBmcm9udG1hdHRlcjwvYT4gbW9kZSBhcmUgbm93IG9wdGlvbmFsIGFzIGludGVuZGVkPC9saT4KICAgIDxsaT5GdWxsIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL0NvZGVNaXJyb3IvY29tcGFyZS81LjEwLjAuLi41LjExLjAiPmxpc3Qgb2YgcGF0Y2hlczwvYT48L2xpPgogIDwvdWw+CgogIDxwIGNsYXNzPSJyZWwiPjIxLTEyLTIwMTU6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTUuMTAuemlwIj5WZXJzaW9uIDUuMTA8L2E+OjwvcD4KCiAgPHVsIGNsYXNzPSJyZWwtbm90ZSI+CiAgICA8bGk+TW9kaWZ5IHRoZSB3YXkgPGEgaHJlZj0ibWFudWFsLmh0bWwjbWFya19hdG9taWMiPmF0b21pYyByYW5nZXM8L2E+IGFyZSBza2lwcGVkIGJ5IHNlbGVjdGlvbiB0byB0cnkgYW5kIG1ha2UgaXQgbGVzcyBzdXJwcmlzaW5nLjwvbGk+CiAgICA8bGk+VGhlIDxhIGhyZWY9Ii4uL21vZGUvc3dpZnQvaW5kZXguaHRtbCI+U3dpZnQgbW9kZTwvYT4gd2FzIHJld3JpdHRlbi48L2xpPgogICAgPGxpPk5ldyBhZGRvbjogPGEgaHJlZj0ibWFudWFsLmh0bWwjYWRkb25fanVtcC10by1saW5lIj5qdW1wLXRvLWxpbmU8L2E+LjwvbGk+CiAgICA8bGk+TmV3IG1ldGhvZDogPGEgaHJlZj0ibWFudWFsLmh0bWwjaXNSZWFkT25seSI+PGNvZGU+aXNSZWFkT25seTwvY29kZT48L2E+LjwvbGk+CiAgICA8bGk+VGhlIDxhIGhyZWY9Im1hbnVhbC5odG1sI2FkZG9uX3Nob3ctaGludCI+c2hvdy1oaW50IGFkZG9uPC9hPiBub3cgZGVmYXVsdHMgdG8gcGlja2luZyBjb21wbGV0aW9ucyBvbiBzaW5nbGUgY2xpY2suPC9saT4KICAgIDxsaT5UaGUgb2JqZWN0IHBhc3NlZCB0byA8YSBocmVmPSJtYW51YWwuaHRtbCNldmVudF9iZWZvcmVTZWxlY3Rpb25DaGFuZ2UiPjxjb2RlPiZxdW90O2JlZm9yZVNlbGVjdGlvbkNoYW5nZSZxdW90OzwvY29kZT48L2E+IGV2ZW50cyBub3cgaGFzIGFuIDxjb2RlPm9yaWdpbjwvY29kZT4gcHJvcGVydHkuPC9saT4KICAgIDxsaT5OZXcgbW9kZTogPGEgaHJlZj0iLi4vbW9kZS9jcnlzdGFsL2luZGV4Lmh0bWwiPkNyeXN0YWw8L2E+LjwvbGk+CiAgICA8bGk+RnVsbCA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9Db2RlTWlycm9yL2NvbXBhcmUvNS45LjAuLi41LjEwLjAiPmxpc3Qgb2YgcGF0Y2hlczwvYT48L2xpPgogIDwvdWw+CgogIDxwIGNsYXNzPSJyZWwiPjIzLTExLTIwMTU6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTUuOS56aXAiPlZlcnNpb24gNS45PC9hPjo8L3A+CgogIDx1bCBjbGFzcz0icmVsLW5vdGUiPgogICAgPGxpPkltcHJvdmUgdGhlIHdheSBvdmVybGF5IChPUyBYLXN0eWxlKSBzY3JvbGxiYXJzIGFyZSBoYW5kbGVkPC9saT4KICAgIDxsaT5NYWtlIDxhIGhyZWY9Im1hbnVhbC5odG1sI2FkZG9uX2Fubm90YXRlc2Nyb2xsYmFyIj5hbm5vdGF0ZXNjcm9sbGJhcjwvYT4gYW5kIHNjcm9sbHBhc3RlbmQgYWRkb25zIHdvcmsgcHJvcGVybHkgdG9nZXRoZXI8L2xpPgogICAgPGxpPk1ha2UgPGEgaHJlZj0ibWFudWFsLmh0bWwjYWRkb25fc2hvdy1oaW50Ij5zaG93LWhpbnQ8L2E+IGFkZG9uIHNlbGVjdCBvcHRpb25zIG9uIHNpbmdsZSBjbGljayBieSBkZWZhdWx0LCBtb3ZlIHNlbGVjdGlvbiB0byBob3ZlcmVkIGl0ZW08L2xpPgogICAgPGxpPlByb3Blcmx5IGZvbGQgY29tbWVudHMgdGhhdCBpbmNsdWRlIGJsb2NrLWNvbW1lbnQtc3RhcnQgbWFya2VyczwvbGk+CiAgICA8bGk+TWFueSBzbWFsbCBsYW5ndWFnZSBtb2RlIGZpeGVzPC9saT4KICAgIDxsaT5GdWxsIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL0NvZGVNaXJyb3IvY29tcGFyZS81LjguMC4uLjUuOS4wIj5saXN0IG9mIHBhdGNoZXM8L2E+PC9saT4KICA8L3VsPgoKICA8cCBjbGFzcz0icmVsIj4yMC0xMC0yMDE1OiA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvY29kZW1pcnJvci01LjguemlwIj5WZXJzaW9uIDUuODwvYT46PC9wPgoKICA8dWwgY2xhc3M9InJlbC1ub3RlIj4KICAgIDxsaT5GaXhlcyBhbiBpbmZpbml0ZSBsb29wIGluCiAgICB0aGUgPGEgaHJlZj0ibWFudWFsLmh0bWwjYWRkb25faGFyZHdyYXAiPmhhcmR3cmFwCiAgICBhZGRvbjwvYT48L2xpPgogICAgPGxpPk5ldyBtb2RlczogPGEgaHJlZj0iLi4vbW9kZS9uc2lzL2luZGV4Lmh0bWwiPk5TSVM8L2E+LCA8YSBocmVmPSIuLi9tb2RlL2NsaWtlL2luZGV4Lmh0bWwiPkNleWxvbjwvYT48L2xpPgogICAgPGxpPlRoZSBLb3RsaW4gbW9kZSBpcyBub3cgYSA8YSBocmVmPSIuLi9tb2RlL2NsaWtlL2luZGV4Lmh0bWwiPmNsaWtlPC9hPiBkaWFsZWN0LCByYXRoZXIgdGhhbiBhIHN0YW5kLWFsb25lIG1vZGU8L2xpPgogICAgPGxpPk5ldyBvcHRpb246IDxhIGhyZWY9Im1hbnVhbC5odG1sI29wdGlvbl9hbGxvd0Ryb3BGaWxlVHlwZXMiPjxjb2RlPmFsbG93RHJvcEZpbGVUeXBlczwvY29kZT48L2E+LiBCaW5hcnkgZmlsZXMgY2FuIG5vIGxvbmdlciBiZSBkcm9wcGVkIGludG8gQ29kZU1pcnJvcjwvbGk+CiAgICA8bGk+TmV3IHRoZW1lczogPGEgaHJlZj0iLi4vZGVtby90aGVtZS5odG1sI2Jlc3BpbiI+YmVzcGluPC9hPiwgPGEgaHJlZj0iLi4vZGVtby90aGVtZS5odG1sI2hvcHNjb3RjaCI+aG9wc2NvdGNoPC9hPiwgPGEgaHJlZj0iLi4vZGVtby90aGVtZS5odG1sI2lzb3RvcGUiPmlzb3RvcGU8L2E+LCA8YSBocmVmPSIuLi9kZW1vL3RoZW1lLmh0bWwjcmFpbHNjYXN0cyI+cmFpbHNjYXN0czwvYT48L2xpPgogICAgPGxpPkZ1bGwgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvQ29kZU1pcnJvci9jb21wYXJlLzUuNy4wLi4uNS44LjAiPmxpc3Qgb2YgcGF0Y2hlczwvYT48L2xpPgogIDwvdWw+CgogIDxwIGNsYXNzPSJyZWwiPjIwLTA5LTIwMTU6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTUuNy56aXAiPlZlcnNpb24gNS43PC9hPjo8L3A+CgogIDx1bCBjbGFzcz0icmVsLW5vdGUiPgogICAgPGxpPk5ldyBtb2RlczogPGEgaHJlZj0iLi4vbW9kZS92dWUvaW5kZXguaHRtbCI+VnVlPC9hPiwgPGEgaHJlZj0iLi4vbW9kZS9vei9pbmRleC5odG1sIj5PejwvYT4sIDxhIGhyZWY9Ii4uL21vZGUvbXNjZ2VuL2luZGV4Lmh0bWwiPk1zY0dlbjwvYT4gKGFuZCBkaWFsZWN0cyksIDxhIGhyZWY9Ii4uL21vZGUvY3NzL2dzcy5odG1sIj5DbG9zdXJlIFN0eWxlc2hlZXRzPC9hPjwvbGk+CiAgICA8bGk+SW1wbGVtZW50IDxhIGhyZWY9Imh0dHA6Ly9jb21tb25tYXJrLm9yZyI+Q29tbW9uTWFyazwvYT4tc3R5bGUgZmxleGlibGUgbGlzdCBpbmRlbnQgYW5kIGNyb3NzLWxpbmUgY29kZSBzcGFucyBpbiA8YSBocmVmPSIuLi9tb2RlL21hcmtkb3duL2luZGV4Lmh0bWwiPk1hcmtkb3duPC9hPiBtb2RlPC9saT4KICAgIDxsaT5BZGQgYSByZXBsYWNlLWFsbCBidXR0b24gdG8gdGhlIDxhIGhyZWY9Im1hbnVhbC5odG1sI2FkZG9uX3NlYXJjaCI+c2VhcmNoIGFkZG9uPC9hPiwgYW5kIG1ha2UgdGhlIHBlcnNpc3RlbnQgc2VhcmNoIGRpYWxvZyB0cmFuc3BhcmVudCB3aGVuIGl0IG9ic2N1cmVzIHRoZSBtYXRjaDwvbGk+CiAgICA8bGk+SGFuZGxlIDxjb2RlPmFjeW5jPC9jb2RlPi88Y29kZT5hd2FpdDwvY29kZT4gYW5kIG9jYWwgYW5kIGJpbmFyeSBudW1iZXJzIGluIDxhIGhyZWY9Ii4uL21vZGUvamF2YXNjcmlwdC9pbmRleC5odG1sIj5KYXZhU2NyaXB0IG1vZGU8L2E+PC9saT4KICAgIDxsaT5GaXggdmFyaW91cyBpc3N1ZXMgd2l0aCB0aGUgPGEgaHJlZj0iLi4vbW9kZS9oYXhlL2luZGV4Lmh0bWwiPkhheGUgbW9kZTwvYT48L2xpPgogICAgPGxpPk1ha2UgdGhlIDxhIGhyZWY9Im1hbnVhbC5odG1sI2FkZG9uX2Nsb3NlYnJhY2tldHMiPmNsb3NlYnJhY2tldHMgYWRkb248L2E+IHNlbGVjdCBvbmx5IHRoZSB3cmFwcGVkIHRleHQgd2hlbiB3cmFwcGluZyBzZWxlY3Rpb24gaW4gYnJhY2tldHM8L2xpPgogICAgPGxpPlRva2VuaXplIHByb3BlcnRpZXMgYXMgcHJvcGVydGllcyBpbiB0aGUgPGEgaHJlZj0iLi4vbW9kZS9jb2ZmZWVzY3JpcHQvaW5kZXguaHRtbCI+Q29mZmVlU2NyaXB0IG1vZGU8L2E+PC9saT4KICAgIDxsaT5UaGUgPGEgaHJlZj0ibWFudWFsLmh0bWwjYWRkb25fcGxhY2Vob2xkZXIiPnBsYWNlaG9sZGVyIGFkZG9uPC9hPiBub3cgYWNjZXB0cyBhIERPTSBub2RlIGFzIHdlbGwgYXMgYSBzdHJpbmcgcGxhY2Vob2xkZXI8L2xpPgogICAgPGxpPkZ1bGwgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvQ29kZU1pcnJvci9jb21wYXJlLzUuNi4wLi4uNS43LjAiPmxpc3Qgb2YgcGF0Y2hlczwvYT48L2xpPgogIDwvdWw+CgogIDxwIGNsYXNzPSJyZWwiPjIwLTA4LTIwMTU6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTUuNi56aXAiPlZlcnNpb24gNS42PC9hPjo8L3A+CgogIDx1bCBjbGFzcz0icmVsLW5vdGUiPgogICAgPGxpPkZpeCBidWcgd2hlcmUgeW91IGNvdWxkIHBhc3RlIGludG8gYSA8Y29kZT5yZWFkT25seTwvY29kZT4gZWRpdG9yPC9saT4KICAgIDxsaT5TaG93IGEgY3Vyc29yIGF0IHRoZSBkcm9wIGxvY2F0aW9uIHdoZW4gZHJhZ2dpbmcgb3ZlciB0aGUgZWRpdG9yPC9saT4KICAgIDxsaT5UaGUgPGEgaHJlZj0iLi4vbW9kZS9ydXN0L2luZGV4Lmh0bWwiPlJ1c3QgbW9kZTwvYT4gd2FzIHJld3JpdHRlbiB0byBoYW5kbGUgbW9kZXJuIFJ1c3Q8L2xpPgogICAgPGxpPlRoZSBlZGl0b3IgYW5kIHRoZW1lIENTUyB3YXMgY2xlYW5lZCB1cC4gU29tZSBzZWxlY3RvcnMgYXJlIG5vdyBsZXNzIHNwZWNpZmljIHRoYW4gYmVmb3JlPC9saT4KICAgIDxsaT5OZXcgdGhlbWU6IDxhIGhyZWY9Ii4uL2RlbW8vdGhlbWUuaHRtbCNhYmNkZWYiPmFiY2RlZjwvYT48L2xpPgogICAgPGxpPkxpbmVzIGxvbmdlciB0aGFuIDxhIGhyZWY9Im1hbnVhbC5odG1sI29wdGlvbl9tYXhIaWdobGlnaHRMZW5ndGgiPjxjb2RlPm1heEhpZ2hsaWdodExlbmd0aDwvY29kZT48L2E+IGFyZSBub3cgbGVzcyBsaWtlbHkgdG8gbWVzcyB1cCBpbmRlbnRhdGlvbjwvbGk+CiAgICA8bGk+TmV3IGFkZG9uczogPGEgaHJlZj0ibWFudWFsLmh0bWwjYWRkb25fYXV0b3JlZnJlc2giPjxjb2RlPmF1dG9yZWZyZXNoPC9jb2RlPjwvYT4gZm9yIHJlZnJlc2hpbmcgYW4gZWRpdG9yIHRoZSBmaXJzdCB0aW1lIGl0IGJlY29tZXMgdmlzaWJsZSwgYW5kIDxjb2RlPmh0bWwtbGludDwvY29kZT4gZm9yIHVzaW5nIDxhIGhyZWY9Imh0dHA6Ly9odG1saGludC5jb20vIj5IVE1MSGludDwvYT48L2xpPgogICAgPGxpPlRoZSA8YSBocmVmPSJtYW51YWwuaHRtbCNhZGRvbl9zZWFyY2giPjxjb2RlPnNlYXJjaDwvY29kZT48L2E+IGFkZG9uIG5vdyByZWNvZ25pemVzIDxjb2RlPlxyPC9jb2RlPiBhbmQgPGNvZGU+XG48L2NvZGU+IGluIHBhdHRlcm4gYW5kIHJlcGxhY2VtZW50IGlucHV0PC9saT4KICAgIDxsaT5GdWxsIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL0NvZGVNaXJyb3IvY29tcGFyZS81LjUuMC4uLjUuNi4wIj5saXN0IG9mIHBhdGNoZXM8L2E+PC9saT4KICA8L3VsPgoKICA8cCBjbGFzcz0icmVsIj4yMC0wNy0yMDE1OiA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvY29kZW1pcnJvci01LjUuemlwIj5WZXJzaW9uIDUuNTwvYT46PC9wPgoKICA8dWwgY2xhc3M9InJlbC1ub3RlIj4KICAgIDxsaT5OZXcgb3B0aW9uOiA8YSBocmVmPSJtYW51YWwuaHRtbCNvcHRpb25fbGluZVNlcGFyYXRvciI+PGNvZGU+bGluZVNlcGFyYXRvcjwvY29kZT48L2E+ICh3aXRoIGNvcnJlc3BvbmRpbmcgPGEgaHJlZj0ibWFudWFsLmh0bWwjbGluZVNlcGFyYXRvciI+bWV0aG9kPC9hPikKICAgIDxsaT5OZXcgdGhlbWVzOiA8YSBocmVmPSIuLi9kZW1vL3RoZW1lLmh0bWwjZHJhY3VsYSI+ZHJhY3VsYTwvYT4sIDxhIGhyZWY9Ii4uL2RlbW8vdGhlbWUuaHRtbCNzZXRpIj5zZXRpPC9hPiwgPGEgaHJlZj0iLi4vZGVtby90aGVtZS5odG1sI3lldGkiPnlldGk8L2E+LCA8YSBocmVmPSIuLi9kZW1vL3RoZW1lLmh0bWwjbWF0ZXJpYWwiPm1hdGVyaWFsPC9hPiwgYW5kIDxhIGhyZWY9Ii4uL2RlbW8vdGhlbWUuaHRtbCNpY2Vjb2RlciI+aWNlY29kZXI8L2E+PC9saT4KICAgIDxsaT5OZXcgbW9kZXM6IDxhIGhyZWY9Ii4uL21vZGUvYnJhaW5mdWNrL2luZGV4Lmh0bWwiPkJyYWluZnVjazwvYT4sIDxhIGhyZWY9Ii4uL21vZGUvdmhkbC9pbmRleC5odG1sIj5WSERMPC9hPiwgU3F1aXJyZWwgKDxhIGhyZWY9Ii4uL21vZGUvY2xpa2UvaW5kZXguaHRtbCI+Y2xpa2U8L2E+IGRpYWxlY3QpPC9saT4KICAgIDxsaT5EZWZpbmUgYSA8Y29kZT5maW5kUGVyc2lzdGVudDwvY29kZT4gY29tbWFuZCBpbgogICAgdGhlIDxhIGhyZWY9Ii4uL2RlbW8vc2VhcmNoLmh0bWwiPnNlYXJjaDwvYT4gYWRkb24sIGZvciBhIGRpYWxvZwogICAgdGhhdCBzdGF5cyBvcGVuIGFzIHlvdSBjeWNsZSB0aHJvdWdoIG1hdGNoZXM8L2xpPgogICAgPGxpPkZyb20gdGhpcyByZWxlYXNlIG9uLCB0aGUgTlBNIG1vZHVsZSBkb2Vzbid0IGluY2x1ZGUgZG9jdW1lbnRhdGlvbiBhbmQgZGVtb3M8L2xpPgogICAgPGxpPkZ1bGwgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvQ29kZU1pcnJvci9jb21wYXJlLzUuNC4wLi4uNS41LjAiPmxpc3Qgb2YgcGF0Y2hlczwvYT48L2xpPgogIDwvdWw+CgogIDxwIGNsYXNzPSJyZWwiPjI1LTA2LTIwMTU6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTUuNC56aXAiPlZlcnNpb24gNS40PC9hPjo8L3A+CgogIDx1bCBjbGFzcz0icmVsLW5vdGUiPgogICAgPGxpPk5ldyBtb2RlczogPGEgaHJlZj0iLi4vbW9kZS90d2lnL2luZGV4Lmh0bWwiPlR3aWc8L2E+LCA8YSBocmVmPSIuLi9tb2RlL2VsbS9pbmRleC5odG1sIj5FbG08L2E+LCA8YSBocmVmPSIuLi9tb2RlL2ZhY3Rvci9pbmRleC5odG1sIj5GYWN0b3I8L2E+LCA8YSBocmVmPSIuLi9tb2RlL3N3aWZ0L2luZGV4Lmh0bWwiPlN3aWZ0PC9hPjwvbGk+CiAgICA8bGk+UHJlZmVyIGNsaXBib2FyZCBBUEkgKGlmIGF2YWlsYWJsZSkgd2hlbiBwYXN0aW5nPC9saT4KICAgIDxsaT5SZWZpbmVkIGRlZmluaXRpb24gaGlnaGxpZ2h0aW5nIGluIDxhIGhyZWY9Ii4uL21vZGUvY2xpa2UvaW5kZXguaHRtbCI+Y2xpa2U8L2E+IG1vZGU8L2xpPgogICAgPGxpPkZ1bGwgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvQ29kZU1pcnJvci9jb21wYXJlLzUuMy4wLi4uNS40LjAiPmxpc3Qgb2YgcGF0Y2hlczwvYT48L2xpPgogIDwvdWw+CgogIDxwIGNsYXNzPSJyZWwiPjIwLTA1LTIwMTU6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTUuMy56aXAiPlZlcnNpb24gNS4zPC9hPjo8L3A+CgogIDx1bCBjbGFzcz0icmVsLW5vdGUiPgogICAgPGxpPkZpeCBzZXZlcmFsIHJlZ3Jlc3Npb25zIGluIHRoZSA8YSBocmVmPSJtYW51YWwuaHRtbCNhZGRvbl9zaG93LWhpbnQiPjxjb2RlPnNob3ctaGludDwvY29kZT48L2E+IGFkZG9uICg8Y29kZT5jb21wbGV0ZVNpbmdsZTwvY29kZT4gb3B0aW9uLCA8Y29kZT4ic2hvd24iPC9jb2RlPiBhbmQgPGNvZGU+ImNsb3NlIjwvY29kZT4gZXZlbnRzKTwvbGk+CiAgICA8bGk+VGhlIDxhIGhyZWY9Ii4uL2RlbW8vdmltLmh0bWwiPnZpbSBtb2RlPC9hPiBBUEkgd2FzIDxhIGhyZWY9Im1hbnVhbC5odG1sI3ZpbWFwaSI+ZG9jdW1lbnRlZDwvYT48L2xpPgogICAgPGxpPk5ldyBtb2RlczogPGEgaHJlZj0iLi4vbW9kZS9hc24uMS9pbmRleC5odG1sIj5BU04uMTwvYT4sIDxhIGhyZWY9Ii4uL21vZGUvdHRjbi9pbmRleC5odG1sIj5UVENOPC9hPiwgYW5kIDxhIGhyZWY9Ii4uL21vZGUvdHRjbi1jZmcvaW5kZXguaHRtbCI+VFRDTi1DRkc8L2E+PC9saT4KICAgIDxsaT5UaGUgPGEgaHJlZj0iLi4vbW9kZS9jbGlrZS9pbmRleC5odG1sIj5jbGlrZTwvYT4gbW9kZSBjYW4gbm93IGRlZXAtaW5kZW50IDxjb2RlPnN3aXRjaDwvY29kZT4gc3RhdGVtZW50cywgYW5kIHJvdWdobHkgcmVjb2duaXplcyB0eXBlcyBhbmQgZGVmaW5lZCBpZGVudGlmaWVyczwvbGk+CiAgICA8bGk+RnVsbCA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9Db2RlTWlycm9yL2NvbXBhcmUvNS4yLjAuLi41LjMuMCI+bGlzdCBvZiBwYXRjaGVzPC9hPjwvbGk+CiAgPC91bD4KCiAgPHAgY2xhc3M9InJlbCI+MjAtMDQtMjAxNTogPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2NvZGVtaXJyb3ItNS4yLnppcCI+VmVyc2lvbiA1LjI8L2E+OjwvcD4KCiAgPHVsIGNsYXNzPSJyZWwtbm90ZSI+CiAgICA8bGk+Rml4IHNldmVyYWwgcmFjZSBjb25kaXRpb25zCiAgICBpbiA8YSBocmVmPSJtYW51YWwuaHRtbCNhZGRvbl9zaG93LWhpbnQiPjxjb2RlPnNob3ctaGludDwvY29kZT48L2E+J3MKICAgIGFzeW5jaHJvbm91cyBtb2RlPC9saT4KICAgIDxsaT5GaXggYmFja3NwYWNlIGJpbmRpbmcgaW4gPGEgaHJlZj0iLi4vZGVtby9zdWJsaW1lLmh0bWwiPlN1YmxpbWUgYmluZGluZ3M8L2E+PC9saT4KICAgIDxsaT5DaGFuZ2UgdGhlIHdheSBJTUUgaXMgaGFuZGxlZCBpbiB0aGUgPGNvZGU+InRleHRhcmVhIjwvY29kZT4gPGEgaHJlZj0ibWFudWFsLmh0bWwjb3B0aW9uX2lucHV0U3R5bGUiPmlucHV0IHN0eWxlPC9hPjwvbGk+CgogICAgPGxpPk5ldyBtb2RlczogPGEgaHJlZj0iLi4vbW9kZS9tdW1wcy9pbmRleC5odG1sIj5NVU1QUzwvYT4sIDxhIGhyZWY9Ii4uL21vZGUvaGFuZGxlYmFycy9pbmRleC5odG1sIj5IYW5kbGViYXJzPC9hPjwvbGk+CiAgICA8bGk+UmV3cml0dGVuIG1vZGVzOiA8YSBocmVmPSIuLi9tb2RlL2RqYW5nby9pbmRleC5odG1sIj5EamFuZ288L2E+LCA8YSBocmVmPSIuLi9tb2RlL3o4MC9pbmRleC5odG1sIj5aODA8L2E+PC9saT4KICAgIDxsaT5OZXcgdGhlbWU6IDxhIGhyZWY9Ii4uL2RlbW8vdGhlbWUuaHRtbCNsaXF1aWJ5dGUiPkxpcXVpYnl0ZTwvYT48L2xpPgogICAgPGxpPk5ldyBvcHRpb246IDxhIGhyZWY9Im1hbnVhbC5odG1sI29wdGlvbl9saW5lV2lzZUNvcHlDdXQiPjxjb2RlPmxpbmVXaXNlQ29weUN1dDwvY29kZT48L2E+PC9saT4KICAgIDxsaT5UaGUgPGEgaHJlZj0iLi4vZGVtby92aW0uaHRtbCI+VmltIG1vZGU8L2E+IG5vdyBzdXBwb3J0cyBidWZmZXItbG9jYWwgb3B0aW9ucyBhbmQgdGhlIDxjb2RlPmZpbGV0eXBlPC9jb2RlPiBzZXR0aW5nPC9saT4KICAgIDxsaT5GdWxsIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL0NvZGVNaXJyb3IvY29tcGFyZS81LjEuMC4uLjUuMi4wIj5saXN0IG9mIHBhdGNoZXM8L2E+PC9saT4KICA8L3VsPgoKICA8cCBjbGFzcz0icmVsIj4yMy0wMy0yMDE1OiA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvY29kZW1pcnJvci01LjEuemlwIj5WZXJzaW9uIDUuMTwvYT46PC9wPgoKICA8dWwgY2xhc3M9InJlbC1ub3RlIj4KICAgIDxsaT5OZXcgbW9kZXM6IDxhIGhyZWY9Ii4uL21vZGUvYXNjaWlhcm1vci9pbmRleC5odG1sIj5BU0NJSSBhcm1vcjwvYT4gKFBHUCBkYXRhKSwgPGEgaHJlZj0iLi4vbW9kZS90cm9mZi9pbmRleC5odG1sIj5Ucm9mZjwvYT4sIGFuZCA8YSBocmVmPSIuLi9tb2RlL2NtYWtlL2luZGV4Lmh0bWwiPkNNYWtlPC9hPi48L2xpPgogICAgPGxpPlJlbW92ZSBTbWFydHlNaXhlZCBtb2RlLCByZXdyaXRlIDxhIGhyZWY9Ii4uL21vZGUvc21hcnR5L2luZGV4Lmh0bWwiPlNtYXJ0eTwvYT4gbW9kZSB0byBzdXBlcnNlZGUgaXQuPC9saT4KICAgIDxsaT5OZXcgY29tbWFuZHMgaW4gdGhlIDxhIGhyZWY9Im1hbnVhbC5odG1sI2FkZG9uX21lcmdlIj5tZXJnZQogICAgYWRkb248L2E+OiA8Y29kZT5nb05leHREaWZmPC9jb2RlPiBhbmQgPGNvZGU+Z29QcmV2RGlmZjwvY29kZT4uPC9saT4KICAgIDxsaT5UaGUgPGEgaHJlZj0ibWFudWFsLmh0bWwjYWRkb25fY2xvc2VicmFja2V0cyI+Y2xvc2VicmFja2V0cyBhZGRvbjwvYT4gY2FuIG5vdyBiZSBjb25maWd1cmVkIHBlciBtb2RlLjwvbGk+CiAgICA8bGk+RnVsbCA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9Db2RlTWlycm9yL2NvbXBhcmUvNS4wLjAuLi41LjEuMCI+bGlzdCBvZiBwYXRjaGVzPC9hPi48L2xpPgogIDwvdWw+CgogIDxwIGNsYXNzPSJyZWwiPjIwLTAyLTIwMTU6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTUuMC56aXAiPlZlcnNpb24gNS4wPC9hPjo8L3A+CgogIDx1bCBjbGFzcz0icmVsLW5vdGUiPgogICAgPGxpPkV4cGVyaW1lbnRhbCBtb2JpbGUgc3VwcG9ydCAodGVzdGVkIG9uIGlPUywgQW5kcm9pZCBDaHJvbWUsIHN0b2NrIEFuZHJvaWQgYnJvd3Nlcik8L2xpPgogICAgPGxpPk5ldyBvcHRpb24gPGEgaHJlZj0ibWFudWFsLmh0bWwjb3B0aW9uX2lucHV0U3R5bGUiPjxjb2RlPmlucHV0U3R5bGU8L2NvZGU+PC9hPiB0byBzd2l0Y2ggYmV0d2VlbiBoaWRkZW4gdGV4dGFyZWEgYW5kIGNvbnRlbnRlZGl0YWJsZSBpbnB1dC48L2xpPgogICAgPGxpPlRoZSA8YSBocmVmPSJtYW51YWwuaHRtbCNnZXRJbnB1dEZpZWxkIj48Y29kZT5nZXRJbnB1dEZpZWxkPC9jb2RlPjwvYT4KICAgIG1ldGhvZCBpcyBubyBsb25nZXIgZ3VhcmFudGVlZCB0byByZXR1cm4gYSB0ZXh0YXJlYS48L2xpPgogICAgPGxpPkZ1bGwgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvQ29kZU1pcnJvci9jb21wYXJlLzQuMTMuMC4uLjUuMC4wIj5saXN0IG9mIHBhdGNoZXM8L2E+LjwvbGk+CiAgPC91bD4KCjwvc2VjdGlvbj4KCjxzZWN0aW9uIGlkPXY0IGNsYXNzPWZpcnN0PgoKICA8aDI+VmVyc2lvbiA0Lng8L2gyPgoKICA8cCBjbGFzcz0icmVsIj4yMC0wMi0yMDE1OiA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvY29kZW1pcnJvci00LjEzLnppcCI+VmVyc2lvbiA0LjEzPC9hPjo8L3A+CgogIDx1bCBjbGFzcz0icmVsLW5vdGUiPgogICAgPGxpPkZpeCB0aGUgd2F5IHRoZSA8YSBocmVmPSIuLi9kZW1vL2Nsb3NldGFnLmh0bWwiPjxjb2RlPmNsb3NldGFnPC9jb2RlPjwvYT4gZGVtbyBoYW5kbGVzIHRoZSBzbGFzaCBjaGFyYWN0ZXIuPC9saT4KICAgIDxsaT5OZXcgbW9kZXM6IDxhIGhyZWY9Ii4uL21vZGUvZm9ydGgvaW5kZXguaHRtbCI+Rm9ydGg8L2E+LCA8YSBocmVmPSIuLi9tb2RlL3N0eWx1cy9pbmRleC5odG1sIj5TdHlsdXM8L2E+LjwvbGk+CiAgICA8bGk+TWFrZSB0aGUgPGEgaHJlZj0iLi4vbW9kZS9jc3MvaW5kZXguaHRtbCI+Q1NTIG1vZGU8L2E+IHVuZGVyc3RhbmQgc29tZSBtb2Rlcm4gQ1NTIGV4dGVuc2lvbnMuPC9saT4KICAgIDxsaT5IYXZlIHRoZSA8YSBocmVmPSIuLi9tb2RlL2NsaWtlL2luZGV4Lmh0bWwiPlNjYWxhIG1vZGU8L2E+IGhhbmRsZSBzeW1ib2xzIGFuZCB0cmlwbGUtcXVvdGVkIHN0cmluZ3MuPC9saT4KICAgIDxsaT5GdWxsIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL0NvZGVNaXJyb3IvY29tcGFyZS80LjEyLjAuLi40LjEzLjAiPmxpc3Qgb2YgcGF0Y2hlczwvYT4uPC9saT4KICA8L3VsPgoKICA8cCBjbGFzcz0icmVsIj4yMi0wMS0yMDE1OiA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvY29kZW1pcnJvci00LjEyLnppcCI+VmVyc2lvbiA0LjEyPC9hPjo8L3A+CgogIDx1bCBjbGFzcz0icmVsLW5vdGUiPgogICAgPGxpPlRoZSA8YSBocmVmPSJtYW51YWwuaHRtbCNhZGRvbl9jbG9zZXRhZyI+PGNvZGU+Y2xvc2V0YWc8L2NvZGU+PC9hPgogICAgYWRkb24gbm93IGRlZmluZXMgYSA8Y29kZT4iY2xvc2VUYWciPC9jb2RlPiBjb21tYW5kLjwvbGk+CiAgICA8bGk+QWRkcyBhIDxjb2RlPmZpbmRNb2RlQnlGaWxlTmFtZTwvY29kZT4gdG8gdGhlIDxhIGhyZWY9Im1hbnVhbC5odG1sI2FkZG9uX21ldGEiPm1vZGUgbWV0YWRhdGE8L2E+CiAgICBhZGRvbi48L2xpPgogICAgPGxpPjxhIGhyZWY9Ii4uL2RlbW8vc2ltcGxlbW9kZS5odG1sIj5TaW1wbGUgbW9kZTwvYT4gcnVsZXMgY2FuCiAgICBub3cgY29udGFpbiBhIDxjb2RlPnNvbDwvY29kZT4gcHJvcGVydHkgdG8gb25seSBtYXRjaCBhdCB0aGUgc3RhcnQKICAgIG9mIGEgbGluZS48L2xpPgogICAgPGxpPk5ldwogICAgYWRkb246IDxhIGhyZWY9Im1hbnVhbC5odG1sI2FkZG9uX3NlbGVjdGlvbi1wb2ludGVyIj48Y29kZT5zZWxlY3Rpb24tcG9pbnRlcjwvY29kZT48L2E+CiAgICB0byBzdHlsZSB0aGUgbW91c2UgY3Vyc29yIG92ZXIgdGhlIHNlbGVjdGlvbi48L2xpPgogICAgPGxpPkltcHJvdmVtZW50cyB0byB0aGUgPGEgaHJlZj0iLi4vbW9kZS9zYXNzL2luZGV4Lmh0bWwiPlNhc3MgbW9kZTwvYT4ncyBpbmRlbnRhdGlvbi48L2xpPgogICAgPGxpPlRoZSA8YSBocmVmPSIuLi9kZW1vL3ZpbS5odG1sIj5WaW0ga2V5bWFwPC9hPidzIHNlYXJjaCBmdW5jdGlvbmFsaXR5IG5vdwogICAgc3VwcG9ydHMgPGEgaHJlZj0ibWFudWFsLmh0bWwjYWRkb25fbWF0Y2hlc29uc2Nyb2xsYmFyIj5zY3JvbGxiYXIKICAgIGFubm90YXRpb248L2E+LjwvbGk+CiAgICA8bGk+RnVsbCA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9Db2RlTWlycm9yL2NvbXBhcmUvNC4xMS4wLi4uNC4xMi4wIj5saXN0IG9mIHBhdGNoZXM8L2E+LjwvbGk+CiAgPC91bD4KCiAgPHAgY2xhc3M9InJlbCI+OS0wMS0yMDE1OiA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvY29kZW1pcnJvci00LjExLnppcCI+VmVyc2lvbiA0LjExPC9hPjo8L3A+CgogIDxwIGNsYXNzPSJyZWwtbm90ZSI+VW5mb3J0dW5hdGVseSwgNC4xMCBkaWQgbm90IHRha2UgY2FyZSBvZiB0aGUKICBGaXJlZm94IHNjcm9sbGluZyBpc3N1ZSBlbnRpcmVseS4gVGhpcyByZWxlYXNlIGFkZHMgdHdvIG1vcmUgcGF0Y2hlcwogIHRvIGFkZHJlc3MgdGhhdC48L3A+CgogIDxwIGNsYXNzPSJyZWwiPjI5LTEyLTIwMTQ6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTQuMTAuemlwIj5WZXJzaW9uIDQuMTA8L2E+OjwvcD4KCiAgPHAgY2xhc3M9InJlbC1ub3RlIj5FbWVyZ2VuY3kgc2luZ2xlLXBhdGNoIHVwZGF0ZSB0byA0LjkuIEZpeGVzCiAgRmlyZWZveC1zcGVjaWZpYyBwcm9ibGVtIHdoZXJlIHRoZSBjdXJzb3IgY291bGQgZW5kIHVwIGJlaGluZCB0aGUKICBob3Jpem9udGFsIHNjcm9sbGJhci48L3A+CgogIDxwIGNsYXNzPSJyZWwiPjIzLTEyLTIwMTQ6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTQuOS56aXAiPlZlcnNpb24gNC45PC9hPjo8L3A+CgogIDx1bCBjbGFzcz0icmVsLW5vdGUiPgogICAgPGxpPk92ZXJoYXVsZWQgc2Nyb2xsIGJhciBoYW5kbGluZy4KICAgIEFkZCBwbHVnZ2FibGUgPGEgaHJlZj0iLi4vZGVtby9zaW1wbGVzY3JvbGxiYXJzLmh0bWwiPnNjcm9sbGJhcgogICAgaW1wbGVtZW50YXRpb25zPC9hPi48L2xpPgogICAgPGxpPlR3ZWFrZWQgYmVoYXZpb3IgZm9yCiAgICB0aGUgPGEgaHJlZj0ibWFudWFsLmh0bWwjYWRkb25fc2hvdy1oaW50Ij5jb21wbGV0aW9uIGFkZG9uczwvYT4gdG8KICAgIG5vdCB0YWtlIHRleHQgYWZ0ZXIgY3Vyc29yIGludG8gYWNjb3VudC48L2xpPgogICAgPGxpPlR3byBuZXcgb3B0aW9uYWwgZmVhdHVyZXMgaW4KICAgIHRoZSA8YSBocmVmPSJtYW51YWwuaHRtbCNhZGRvbl9tZXJnZSI+bWVyZ2UgYWRkb248L2E+OiBhbGlnbmluZwogICAgZWRpdG9ycywgYW5kIGZvbGRpbmcgdW5jaGFuZ2VkIHRleHQuPC9saT4KICAgIDxsaT5OZXcKICAgIG1vZGVzOiA8YSBocmVmPSIuLi9tb2RlL2RhcnQvaW5kZXguaHRtbCI+RGFydDwvYT4sIDxhIGhyZWY9Ii4uL21vZGUvZWJuZi9pbmRleC5odG1sIj5FQk5GPC9hPiwgPGEgaHJlZj0iLi4vbW9kZS9zcHJlYWRzaGVldC9pbmRleC5odG1sIj5zcHJlYWRzaGVldDwvYT4sCiAgICBhbmQgPGEgaHJlZj0iLi4vbW9kZS9zb3kvaW5kZXguaHRtbCI+U295PC9hPi48L2xpPgogICAgPGxpPk5ldyA8YSBocmVmPSIuLi9kZW1vL3BhbmVsLmh0bWwiPmFkZG9uPC9hPiB0byBzaG93IHBlcnNpc3RlbnQgcGFuZWxzIGJlbG93L2Fib3ZlIGFuIGVkaXRvci48L2xpPgogICAgPGxpPk5ldyB0aGVtZXM6IDxhIGhyZWY9Ii4uL2RlbW8vdGhlbWUuaHRtbCN6ZW5idXJuIj56ZW5idXJuPC9hPgogICAgYW5kIDxhIGhyZWY9Ii4uL2RlbW8vdGhlbWUuaHRtbCN0b21vcnJvdy1uaWdodC1icmlnaHQiPnRvbW9ycm93IG5pZ2h0CiAgICBicmlnaHQ8L2E+LjwvbGk+CiAgICA8bGk+QWxsb3cgY3RybC1jbGljayB0byBjbGVhciBleGlzdGluZyBjdXJzb3JzLjwvbGk+CiAgICA8bGk+RnVsbCA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9Db2RlTWlycm9yL2NvbXBhcmUvNC44LjAuLi40LjkuMCI+bGlzdCBvZiBwYXRjaGVzPC9hPi48L2xpPgogIDwvdWw+CgogIDxwIGNsYXNzPSJyZWwiPjIyLTExLTIwMTQ6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTQuOC56aXAiPlZlcnNpb24gNC44PC9hPjo8L3A+CgogIDx1bCBjbGFzcz0icmVsLW5vdGUiPgogICAgPGxpPkJ1aWx0LWluIHN1cHBvcnQgZm9yIDxhIGhyZWY9Im1hbnVhbC5odG1sI25vcm1hbGl6ZUtleU1hcCI+bXVsdGktc3Ryb2tlIGtleSBiaW5kaW5nczwvYT4uPC9saT4KICAgIDxsaT5OZXcgbWV0aG9kOiA8YSBocmVmPSJtYW51YWwuaHRtbCNnZXRMaW5lVG9rZW5zIj48Y29kZT5nZXRMaW5lVG9rZW5zPC9jb2RlPjwvYT4uPC9saT4KICAgIDxsaT5OZXcgbW9kZXM6IDxhIGhyZWY9Ii4uL21vZGUvZG9ja2VyZmlsZS9pbmRleC5odG1sIj5kb2NrZXJmaWxlPC9hPiwgPGEgaHJlZj0iLi4vbW9kZS9pZGwvaW5kZXguaHRtbCI+SURMPC9hPiwgPGEgaHJlZj0iLi4vbW9kZS9jbGlrZS9pbmRleC5odG1sIj5PYmplY3RpdmUgQzwvYT4gKGNydWRlKS48L2xpPgogICAgPGxpPlN1cHBvcnQgc3R5bGluZyBvZiBndXR0ZXIgYmFja2dyb3VuZHMsIGFsbG93IDxjb2RlPiJndXR0ZXIiPC9jb2RlPiBzdHlsZXMgaW4gPGEgaHJlZj0ibWFudWFsLmh0bWwjYWRkTGluZUNsYXNzIj48Y29kZT5hZGRMaW5lQ2xhc3M8L2NvZGU+PC9hPi48L2xpPgogICAgPGxpPk1hbnkgaW1wcm92ZW1lbnRzIHRvIHRoZSA8YSBocmVmPSIuLi9kZW1vL3ZpbS5odG1sIj5WaW0gbW9kZTwvYT4sIHJld3JpdHRlbiB2aXN1YWwgbW9kZS48L2xpPgogICAgPGxpPkltcHJvdmVtZW50cyB0byBtb2RlczogPGEgaHJlZj0iLi4vbW9kZS9nZm0vaW5kZXguaHRtbCI+Z2ZtPC9hPiAoc3RyaWtldGhyb3VnaCksIDxhIGhyZWY9Ii4uL21vZGUvc3BhcnFsL2luZGV4Lmh0bWwiPlNQQVJRTDwvYT4gKHZlcnNpb24gMS4xIHN1cHBvcnQpLCBhbmQgPGEgaHJlZj0iLi4vbW9kZS9zdGV4L2luZGV4Lmh0bWwiPnNUZVg8L2E+IChubyBtb3JlIHJ1bmF3YXkgbWF0aCBtb2RlKS4KICAgIDxsaT5GdWxsIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL0NvZGVNaXJyb3IvY29tcGFyZS80LjcuMC4uLjQuOC4wIj5saXN0IG9mIHBhdGNoZXM8L2E+LjwvbGk+CiAgPC91bD4KCiAgPHAgY2xhc3M9InJlbCI+MjAtMTAtMjAxNDogPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2NvZGVtaXJyb3ItNC43LnppcCI+VmVyc2lvbiA0Ljc8L2E+OjwvcD4KCiAgPHVsIGNsYXNzPSJyZWwtbm90ZSI+CiAgICA8bGk+PHN0cm9uZz5JbmNvbXBhdGlibGU8L3N0cm9uZz46CiAgICBUaGUgPGEgaHJlZj0iLi4vZGVtby9saW50Lmh0bWwiPmxpbnQgYWRkb248L2E+IG5vdyBwYXNzZXMgdGhlCiAgICBlZGl0b3IncyB2YWx1ZSBhcyBmaXJzdCBhcmd1bWVudCB0byBhc3luY2hyb25vdXMgbGludCBmdW5jdGlvbnMsCiAgICBmb3IgY29uc2lzdGVuY3kuIFRoZSBlZGl0b3IgaXMgc3RpbGwgcGFzc2VkLCBhcyBmb3VydGgKICAgIGFyZ3VtZW50LjwvbGk+CiAgICA8bGk+SW1wcm92ZWQgaGFuZGxpbmcgb2YgdW5pY29kZSBpZGVudGlmaWVycyBpbiBtb2RlcyBmb3IKICAgIGxhbmd1YWdlcyB0aGF0IHN1cHBvcnQgdGhlbS48L2xpPgogICAgPGxpPk1vcmUgbW9kZQogICAgaW1wcm92ZW1lbnRzOiA8YSBocmVmPSIuLi9tb2RlL2NvZmZlZXNjcmlwdC9pbmRleC5odG1sIj5Db2ZmZWVTY3JpcHQ8L2E+CiAgICAoaW5kZW50YXRpb24pLCA8YSBocmVmPSIuLi9tb2RlL3Zlcmlsb2cvaW5kZXguaHRtbCI+VmVyaWxvZzwvYT4KICAgIChpbmRlbnRhdGlvbiksIDxhIGhyZWY9Ii4uL21vZGUvY2xpa2UvaW5kZXguaHRtbCI+U2NhbGE8L2E+CiAgICAoaW5kZW50YXRpb24sIHRyaXBsZS1xdW90ZWQgc3RyaW5ncyksCiAgICBhbmQgPGEgaHJlZj0iLi4vbW9kZS9waHAvaW5kZXguaHRtbCI+UEhQPC9hPiAoaW50ZXJwb2xhdGVkCiAgICB2YXJpYWJsZXMgaW4gaGVyZWRvYyBzdHJpbmdzKS48L2xpPgogICAgPGxpPk5ldyBtb2RlczogPGEgaHJlZj0iLi4vbW9kZS90ZXh0aWxlL2luZGV4Lmh0bWwiPlRleHRpbGU8L2E+IGFuZCA8YSBocmVmPSIuLi9tb2RlL3Rvcm5hZG8vaW5kZXguaHRtbCI+VG9ybmFkbyB0ZW1wbGF0ZXM8L2E+LjwvbGk+CiAgICA8bGk+RXhwZXJpbWVudGFsIG5ldyA8YSBocmVmPSIuLi9kZW1vL3NpbXBsZW1vZGUuaHRtbCI+d2F5IHRvIGRlZmluZSBtb2RlczwvYT4uPC9saT4KICAgIDxsaT5JbXByb3ZlbWVudHMgdG8gdGhlIDxhIGhyZWY9Ii4uL2RlbW8vdmltLmh0bWwiPlZpbQogICAgYmluZGluZ3M8L2E+OiBBcmJpdHJhcnkgaW5zZXJ0IG1vZGUga2V5IG1hcHBpbmdzIGFyZSBub3cgcG9zc2libGUsCiAgICBhbmQgdGV4dCBvYmplY3RzIGFyZSBzdXBwb3J0ZWQgaW4gdmlzdWFsIG1vZGUuPC9saT4KICAgIDxsaT5UaGUgbW9kZSA8YSBocmVmPSIuLi9tb2RlL21ldGEuanMiPm1ldGEtaW5mb3JtYXRpb24gZmlsZTwvYT4KICAgIG5vdyBpbmNsdWRlcyBpbmZvcm1hdGlvbiBhYm91dCBmaWxlIGV4dGVuc2lvbnMsCiAgICBhbmQgPGEgaHJlZj0ibWFudWFsLmh0bWwjYWRkb25fbWV0YSI+aGVscGVyCiAgICBmdW5jdGlvbnM8L2E+IDxjb2RlPmZpbmRNb2RlQnlNSU1FPC9jb2RlPgogICAgYW5kIDxjb2RlPmZpbmRNb2RlQnlFeHRlbnNpb248L2NvZGU+LjwvbGk+CiAgICA8bGk+TmV3IGxvZ28hPC9saT4KICAgIDxsaT5GdWxsIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL0NvZGVNaXJyb3IvY29tcGFyZS80LjYuMC4uLjQuNy4wIj5saXN0IG9mIHBhdGNoZXM8L2E+LjwvbGk+CiAgPC91bD4KCiAgPHAgY2xhc3M9InJlbCI+MTktMDktMjAxNDogPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2NvZGVtaXJyb3ItNC42LnppcCI+VmVyc2lvbiA0LjY8L2E+OjwvcD4KCiAgPHVsIGNsYXNzPSJyZWwtbm90ZSI+CiAgICA8bGk+TmV3IG1vZGU6IDxhIGhyZWY9Ii4uL21vZGUvbW9kZWxpY2EvaW5kZXguaHRtbCI+TW9kZWxpY2E8L2E+PC9saT4KICAgIDxsaT5OZXcgbWV0aG9kOiA8YSBocmVmPSJtYW51YWwuaHRtbCNmaW5kV29yZEF0Ij48Y29kZT5maW5kV29yZEF0PC9jb2RlPjwvYT48L2xpPgogICAgPGxpPk1ha2UgaXQgZWFzaWVyIHRvIDxhIGhyZWY9Ii4uL2RlbW8vbWFya3NlbGVjdGlvbi5odG1sIj51c2UgdGV4dCBiYWNrZ3JvdW5kIHN0eWxpbmc8L2E+PC9saT4KICAgIDxsaT5GdWxsIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL0NvZGVNaXJyb3IvY29tcGFyZS80LjUuMC4uLjQuNi4wIj5saXN0IG9mIHBhdGNoZXM8L2E+LjwvbGk+CiAgPC91bD4KCiAgPHAgY2xhc3M9InJlbCI+MjEtMDgtMjAxNDogPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2NvZGVtaXJyb3ItNC41LnppcCI+VmVyc2lvbiA0LjU8L2E+OjwvcD4KCiAgPHVsIGNsYXNzPSJyZWwtbm90ZSI+CiAgICA8bGk+Rml4IHNldmVyYWwgc2VyaW91cyBidWdzIHdpdGggaG9yaXpvbnRhbCBzY3JvbGxpbmc8L2xpPgogICAgPGxpPk5ldyBtb2RlOiA8YSBocmVmPSIuLi9tb2RlL3NsaW0vaW5kZXguaHRtbCI+U2xpbTwvYT48L2xpPgogICAgPGxpPk5ldyBjb21tYW5kOiA8YSBocmVmPSJtYW51YWwuaHRtbCNjb21tYW5kX2dvTGluZUxlZnRTbWFydCI+PGNvZGU+Z29MaW5lTGVmdFNtYXJ0PC9jb2RlPjwvYT48L2xpPgogICAgPGxpPk1vcmUgZml4ZXMgYW5kIGV4dGVuc2lvbnMgZm9yIHRoZSA8YSBocmVmPSIuLi9kZW1vL3ZpbS5odG1sIj5WaW08L2E+IHZpc3VhbCBibG9jayBtb2RlPC9saT4KICAgIDxsaT5GdWxsIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL0NvZGVNaXJyb3IvY29tcGFyZS80LjQuMC4uLjQuNS4wIj5saXN0IG9mIHBhdGNoZXM8L2E+LjwvbGk+CiAgPC91bD4KCiAgPHAgY2xhc3M9InJlbCI+MjEtMDctMjAxNDogPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2NvZGVtaXJyb3ItNC40LnppcCI+VmVyc2lvbiA0LjQ8L2E+OjwvcD4KCiAgPHVsIGNsYXNzPSJyZWwtbm90ZSI+CiAgICA8bGk+PHN0cm9uZz5Ob3RlOjwvc3Ryb25nPiBTb21lIGV2ZW50cyBtaWdodCBub3cgZmlyZSBpbiBzbGlnaHRseQogICAgZGlmZmVyZW50IG9yZGVyICg8Y29kZT4iY2hhbmdlIjwvY29kZT4gaXMgc3RpbGwgZ3VhcmFudGVlZCB0byBmaXJlCiAgICBiZWZvcmUgPGNvZGU+ImN1cnNvckFjdGl2aXR5IjwvY29kZT4pPC9saT4KICAgIDxsaT5OZXN0ZWQgb3BlcmF0aW9ucyBpbiBtdWx0aXBsZSBlZGl0b3JzIGFyZSBub3cgc3luY2VkIChjb21wbGV0ZQogICAgYXQgc2FtZSB0aW1lLCByZWR1Y2luZyBET00gcmVmbG93cyk8L2xpPgogICAgPGxpPlZpc3VhbCBibG9jayBtb2RlIGZvciA8YSBocmVmPSIuLi9kZW1vL3ZpbS5odG1sIj52aW08L2E+ICgmbHQ7Qy12PikgaXMgbmVhcmx5IGNvbXBsZXRlPC9saT4KICAgIDxsaT5OZXcgbW9kZTogPGEgaHJlZj0iLi4vbW9kZS9rb3RsaW4vaW5kZXguaHRtbCI+S290bGluPC9hPjwvbGk+CiAgICA8bGk+QmV0dGVyIG11bHRpLXNlbGVjdGlvbiBwYXN0ZSBmb3IgdGV4dCBjb3BpZWQgZnJvbSBtdWx0aXBsZSBDb2RlTWlycm9yIHNlbGVjdGlvbnM8L2xpPgogICAgPGxpPkZ1bGwgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvQ29kZU1pcnJvci9jb21wYXJlLzQuMy4wLi4uNC40LjAiPmxpc3Qgb2YgcGF0Y2hlczwvYT4uPC9saT4KICA8L3VsPgoKICA8cCBjbGFzcz0icmVsIj4yMy0wNi0yMDE0OiA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvY29kZW1pcnJvci00LjMuemlwIj5WZXJzaW9uIDQuMzwvYT46PC9wPgoKICA8dWwgY2xhc3M9InJlbC1ub3RlIj4KICAgIDxsaT5TZXZlcmFsIDxhIGhyZWY9Ii4uL2RlbW8vdmltLmh0bWwiPnZpbSBiaW5kaW5nczwvYT4KICAgIGltcHJvdmVtZW50czogc2VhcmNoIGFuZCBleENvbW1hbmQgaGlzdG9yeSwgZ2xvYmFsIGZsYWcKICAgIGZvciA8Y29kZT46c3Vic3RpdHV0ZTwvY29kZT4sIDxjb2RlPjpnbG9iYWw8L2NvZGU+IGNvbW1hbmQuCiAgICA8bGk+QWxsb3cgaGlkaW5nIHRoZSBjdXJzb3IgYnkKICAgIHNldHRpbmcgPGEgaHJlZj0ibWFudWFsLmh0bWwjb3B0aW9uX2N1cnNvckJsaW5rUmF0ZSI+PGNvZGU+Y3Vyc29yQmxpbmtSYXRlPC9jb2RlPjwvYT4KICAgIHRvIGEgbmVnYXRpdmUgdmFsdWUuPC9saT4KICAgIDxsaT5NYWtlIGd1dHRlciBtYXJrZXJzIHRoZW1lYWJsZSwgdXNlIHRoaXMgaW4gZm9sZGd1dHRlci48L2xpPgogICAgPGxpPkZ1bGwgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvQ29kZU1pcnJvci9jb21wYXJlLzQuMi4wLi4uNC4zLjAiPmxpc3Qgb2YgcGF0Y2hlczwvYT4uPC9saT4KICA8L3VsPgoKICA8cCBjbGFzcz0icmVsIj4xOS0wNS0yMDE0OiA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvY29kZW1pcnJvci00LjIuemlwIj5WZXJzaW9uIDQuMjwvYT46PC9wPgoKICA8dWwgY2xhc3M9InJlbC1ub3RlIj4KICAgIDxsaT5GaXggcHJvYmxlbSB3aGVyZSBzb21lIG1vZGVzIHdlcmUgYnJva2VuIGJ5IHRoZSBmYWN0IHRoYXQgZW1wdHkgdG9rZW5zIHdlcmUgZm9yYmlkZGVuLjwvbGk+CiAgICA8bGk+U2V2ZXJhbCBmaXhlcyB0byBjb250ZXh0IG1lbnUgaGFuZGxpbmcuPC9saT4KICAgIDxsaT5PbiB1bmRvLCBzY3JvbGwgPGVtPmNoYW5nZTwvZW0+LCBub3QgY3Vyc29yLCBpbnRvIHZpZXcuPC9saT4KICAgIDxsaT5SZXdyaXR0ZW4gPGEgaHJlZj0iLi4vbW9kZS9qYWRlL2luZGV4Lmh0bWwiPkphZGU8L2E+IG1vZGUuPC9saT4KICAgIDxsaT5WYXJpb3VzIGltcHJvdmVtZW50cyB0byA8YSBocmVmPSIuLi9tb2RlL3NoZWxsL2luZGV4Lmh0bWwiPlNoZWxsPC9hPiAoc3VwcG9ydCBmb3IgbW9yZSBzeW50YXgpIGFuZCA8YSBocmVmPSIuLi9tb2RlL3B5dGhvbi9pbmRleC5odG1sIj5QeXRob248L2E+IChiZXR0ZXIgaW5kZW50YXRpb24pIG1vZGVzLjwvbGk+CiAgICA8bGk+TmV3IG1vZGU6IDxhIGhyZWY9Ii4uL21vZGUvY3lwaGVyL2luZGV4Lmh0bWwiPkN5cGhlcjwvYT4uPC9saT4KICAgIDxsaT5OZXcgdGhlbWU6IDxhIGhyZWY9Ii4uL2RlbW8vdGhlbWUuaHRtbCNuZW8iPk5lbzwvYT4uPC9saT4KICAgIDxsaT5TdXBwb3J0IGRpcmVjdCBzdHlsaW5nIG9wdGlvbnMgKGNvbG9yLCBsaW5lIHN0eWxlLCB3aWR0aCkgaW4gdGhlIDxhIGhyZWY9Im1hbnVhbC5odG1sI2FkZG9uX3J1bGVycyI+cnVsZXJzPC9hPiBhZGRvbi48L2xpPgogICAgPGxpPlJlY29nbml6ZSBwZXItZWRpdG9yIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSA8YSBocmVmPSJtYW51YWwuaHRtbCNhZGRvbl9zaG93LWhpbnQiPnNob3ctaGludDwvYT4gYW5kIDxhIGhyZWY9Im1hbnVhbC5odG1sI2FkZG9uX2ZvbGRjb2RlIj5mb2xkY29kZTwvYT4gYWRkb25zLjwvbGk+CiAgICA8bGk+TW9yZSBpbnRlbGxpZ2VudCBzY2FubmluZyBmb3IgZXhpc3RpbmcgY2xvc2UgdGFncyBpbiA8YSBocmVmPSJtYW51YWwuaHRtbCNhZGRvbl9jbG9zZXRhZyI+Y2xvc2V0YWc8L2E+IGFkZG9uLjwvbGk+CiAgICA8bGk+SW4gdGhlIDxhIGhyZWY9Ii4uL2RlbW8vdmltLmh0bWwiPlZpbSBiaW5kaW5nczwvYT46IEZpeCBicmFja2V0IG1hdGNoaW5nLCBzdXBwb3J0IGNhc2UgY29udmVyc2lvbiBpbiB2aXN1YWwgbW9kZSwgdmlzdWFsIHBhc3RlLCBhcHBlbmQgYWN0aW9uLjwvbGk+CiAgICA8bGk+RnVsbCA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9Db2RlTWlycm9yL2NvbXBhcmUvNC4xLjAuLi40LjIuMCI+bGlzdCBvZiBwYXRjaGVzPC9hPi48L2xpPgogIDwvdWw+CgogIDxwIGNsYXNzPSJyZWwiPjIyLTA0LTIwMTQ6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTQuMS56aXAiPlZlcnNpb24gNC4xPC9hPjo8L3A+CgogIDx1bCBjbGFzcz0icmVsLW5vdGUiPgogICAgPGxpPjxlbT5TbGlnaHRseSBpbmNvbXBhdGlibGU8L2VtPjoKICAgIFRoZSA8YSBocmVmPSJtYW51YWwuaHRtbCNldmVudF9jdXJzb3JBY3Rpdml0eSI+PGNvZGU+ImN1cnNvckFjdGl2aXR5IjwvY29kZT48L2E+CiAgICBldmVudCBub3cgZmlyZXMgYWZ0ZXIgYWxsIG90aGVyIGV2ZW50cyBmb3IgdGhlIG9wZXJhdGlvbiAoYW5kIG9ubHkKICAgIGZvciBoYW5kbGVycyB0aGF0IHdlcmUgYWN0dWFsbHkgcmVnaXN0ZXJlZCBhdCB0aGUgdGltZSB0aGUKICAgIGFjdGl2aXR5IGhhcHBlbmVkKS48L2xpPgogICAgPGxpPk5ldyBjb21tYW5kOiA8YSBocmVmPSJtYW51YWwuaHRtbCNjb21tYW5kX2luc2VydFNvZnRUYWIiPjxjb2RlPmluc2VydFNvZnRUYWI8L2NvZGU+PC9hPi48L2xpPgogICAgPGxpPk5ldyBtb2RlOiA8YSBocmVmPSIuLi9tb2RlL2RqYW5nby9pbmRleC5odG1sIj5EamFuZ288L2E+LjwvbGk+CiAgICA8bGk+SW1wcm92ZWQgbW9kZXM6IDxhIGhyZWY9Ii4uL21vZGUvdmVyaWxvZy9pbmRleC5odG1sIj5WZXJpbG9nPC9hPiAocmV3cml0dGVuKSwgPGEgaHJlZj0iLi4vbW9kZS9qaW5qYTIvaW5kZXguaHRtbCI+SmluamEyPC9hPiwgPGEgaHJlZj0iLi4vbW9kZS9oYXhlL2luZGV4Lmh0bWwiPkhheGU8L2E+LCA8YSBocmVmPSIuLi9tb2RlL3BocC9pbmRleC5odG1sIj5QSFA8L2E+IChzdHJpbmcgaW50ZXJwb2xhdGlvbiBoaWdobGlnaHRlZCksIDxhIGhyZWY9Ii4uL21vZGUvamF2YXNjcmlwdC9pbmRleC5odG1sIj5KYXZhU2NyaXB0PC9hPiAoaW5kZW50YXRpb24gb2YgdHJhaWxpbmcgZWxzZSwgdGVtcGxhdGUgc3RyaW5ncyksIDxhIGhyZWY9Ii4uL21vZGUvbGl2ZXNjcmlwdC9pbmRleC5odG1sIj5MaXZlU2NyaXB0PC9hPiAobXVsdGktbGluZSBzdHJpbmdzKS48L2xpPgogICAgPGxpPk1hbnkgc21hbGwgaXNzdWVzIGZyb20gdGhlIDMueOKGkjQueCB0cmFuc2l0aW9uIHdlcmUgZm91bmQgYW5kIGZpeGVkLjwvbGk+CiAgICA8bGk+RnVsbCA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9Db2RlTWlycm9yL2NvbXBhcmUvNC4wLjMuLi40LjEuMCI+bGlzdCBvZiBwYXRjaGVzPC9hPi48L2xpPgogIDwvdWw+CgogIDxwIGNsYXNzPSJyZWwiPjIwLTAzLTIwMTQ6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTQuMC56aXAiPlZlcnNpb24gNC4wPC9hPjo8L3A+CgogIDxwIGNsYXNzPSJyZWwtbm90ZSI+VGhpcyBpcyBhIG5ldyBtYWpvciB2ZXJzaW9uIG9mIENvZGVNaXJyb3IuIFRoZXJlCiAgYXJlIGEgZmV3IDxzdHJvbmc+aW5jb21wYXRpYmxlPC9zdHJvbmc+IGNoYW5nZXMgaW4gdGhlIEFQSS4gVXBncmFkZQogIHdpdGggY2FyZSwgYW5kIHJlYWQgdGhlIDxhIGhyZWY9InVwZ3JhZGVfdjQuaHRtbCI+dXBncmFkaW5nCiAgZ3VpZGU8L2E+LjwvcD4KCiAgPHVsIGNsYXNzPSJyZWwtbm90ZSI+CiAgICA8bGk+TXVsdGlwbGUgc2VsZWN0aW9ucyAoY3RybC1jbGljaywgYWx0LWRyYWcsIDxhIGhyZWY9Im1hbnVhbC5odG1sI3NldFNlbGVjdGlvbnMiPkFQSTwvYT4pLjwvbGk+CiAgICA8bGk+U3VibGltZSBUZXh0IDxhIGhyZWY9Ii4uL2RlbW8vc3VibGltZS5odG1sIj5iaW5kaW5nczwvYT4uPC9saT4KICAgIDxsaT48YSBocmVmPSJtYW51YWwuaHRtbCNtb2Rsb2FkZXIiPk1vZHVsZSBsb2FkZXIgc2hpbXM8L2E+IHdyYXBwZWQgYXJvdW5kIGFsbCBtb2R1bGVzLjwvbGk+CiAgICA8bGk+U2VsZWN0aW9uIDxhIGhyZWY9Im1hbnVhbC5odG1sI2NvbW1hbmRfdW5kb1NlbGVjdGlvbiI+dW5kbzwvYT4vPGEgaHJlZj0ibWFudWFsLmh0bWwjY29tbWFuZF9yZWRvU2VsZWN0aW9uIj5yZWRvPC9hPi48L2xpPgogICAgPGxpPkltcHJvdmVkIGNoYXJhY3RlciBtZWFzdXJpbmcgKGZhc3RlciwgaGFuZGxlcyB3cmFwcGVkIGxpbmVzIG1vcmUgcm9idXN0bHkpLjwvbGk+CiAgICA8bGk+RnVsbCA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9Db2RlTWlycm9yL2NvbXBhcmUvMy4yMy4wLi4uNC4wLjMiPmxpc3Qgb2YgcGF0Y2hlczwvYT4uPC9saT4KICA8L3VsPgoKPC9zZWN0aW9uPgoKPHNlY3Rpb24gaWQ9djM+CgogIDxoMj5WZXJzaW9uIDMueDwvaDI+CgogIDxwIGNsYXNzPSJyZWwiPjIyLTA0LTIwMTQ6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTMuMjQuemlwIj5WZXJzaW9uIDMuMjQ8L2E+OjwvcD4KCiAgPHAgY2xhc3M9InJlbC1ub3RlIj5NZXJnZXMgdGhlIGltcHJvdmVtZW50cyBmcm9tIDQuMSB0aGF0IGNvdWxkCiAgZWFzaWx5IGJlIGFwcGxpZWQgdG8gdGhlIDMueCBjb2RlLiBBbHNvIGltcHJvdmVzIHRoZSB3YXkgdGhlIGVkaXRvcgogIHNpemUgaXMgdXBkYXRlZCB3aGVuIGxpbmUgd2lkZ2V0cyBjaGFuZ2UuPC9wPgoKICA8cCBjbGFzcz0icmVsIj4yMC0wMy0yMDE0OiA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvY29kZW1pcnJvci0zLjIzLnppcCI+VmVyc2lvbiAzLjIzPC9hPjo8L3A+CgogIDx1bCBjbGFzcz0icmVsLW5vdGUiPgogICAgPGxpPkluIHRoZSA8YSBocmVmPSIuLi9tb2RlL3htbC9pbmRleC5odG1sIj5YTUwgbW9kZTwvYT4sCiAgICBhZGQgPGNvZGU+YnJhY2tldHM8L2NvZGU+IHN0eWxlIHRvIGFuZ2xlIGJyYWNrZXRzLCBmaXgKICAgIGNhc2Utc2Vuc2l0aXZpdHkgb2YgdGFncyBmb3IgSFRNTC48L2xpPgogICAgPGxpPk5ldyBtb2RlOiA8YSBocmVmPSIuLi9tb2RlL2R5bGFuL2luZGV4Lmh0bWwiPkR5bGFuPC9hPi48L2xpPgogICAgPGxpPk1hbnkgaW1wcm92ZW1lbnRzIHRvIHRoZSA8YSBocmVmPSIuLi9kZW1vL3ZpbS5odG1sIj5WaW0gYmluZGluZ3M8L2E+LjwvbGk+CiAgPC91bD4KCiAgPHAgY2xhc3M9InJlbCI+MjEtMDItMjAxNDogPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2NvZGVtaXJyb3ItMy4yMi56aXAiPlZlcnNpb24gMy4yMjwvYT46PC9wPgoKICA8dWwgY2xhc3M9InJlbC1ub3RlIj4KICAgIDxsaT5BZGRzIHRoZSA8YSBocmVmPSJtYW51YWwuaHRtbCNmaW5kTWFya3MiPjxjb2RlPmZpbmRNYXJrczwvY29kZT48L2E+IG1ldGhvZC48L2xpPgogICAgPGxpPk5ldyBhZGRvbnM6IDxhIGhyZWY9Im1hbnVhbC5odG1sI2FkZG9uX3J1bGVycyI+cnVsZXJzPC9hPiwgbWFya2Rvd24tZm9sZCwgeWFtbC1saW50LjwvbGk+CiAgICA8bGk+TmV3IHRoZW1lOiA8YSBocmVmPSIuLi9kZW1vL3RoZW1lLmh0bWwjbWRuLWxpa2UiPm1kbi1saWtlPC9hPi48L2xpPgogICAgPGxpPk5ldyBtb2RlOiA8YSBocmVmPSIuLi9tb2RlL3NvbHIvaW5kZXguaHRtbCI+U29scjwvYT4uPC9saT4KICAgIDxsaT5GdWxsIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL0NvZGVNaXJyb3IvY29tcGFyZS8zLjIxLjAuLi4zLjIyLjAiPmxpc3Qgb2YgcGF0Y2hlczwvYT4uPC9saT4KICA8L3VsPgoKICA8cCBjbGFzcz0icmVsIj4xNi0wMS0yMDE0OiA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvY29kZW1pcnJvci0zLjIxLnppcCI+VmVyc2lvbiAzLjIxPC9hPjo8L3A+CgogIDx1bCBjbGFzcz0icmVsLW5vdGUiPgogICAgPGxpPkF1dG8taW5kZW50aW5nIGEgYmxvY2sgd2lsbCBubyBsb25nZXIgYWRkIHRyYWlsaW5nIHdoaXRlc3BhY2UgdG8gYmxhbmsgbGluZXMuPC9saT4KICAgIDxsaT5NYXJraW5nIHRleHQgaGFzIGEgbmV3IG9wdGlvbiA8YSBocmVmPSJtYW51YWwuaHRtbCNtYXJrVGV4dCI+PGNvZGU+Y2xlYXJXaGVuRW1wdHk8L2NvZGU+PC9hPiB0byBjb250cm9sIGF1dG8tcmVtb3ZhbC48L2xpPgogICAgPGxpPlNldmVyYWwgYnVnZml4ZXMgaW4gdGhlIGhhbmRsaW5nIG9mIGJpZGlyZWN0aW9uYWwgdGV4dC48L2xpPgogICAgPGxpPlRoZSA8YSBocmVmPSIuLi9tb2RlL3htbC9pbmRleC5odG1sIj5YTUw8L2E+IGFuZCA8YSBocmVmPSIuLi9tb2RlL2Nzcy9pbmRleC5odG1sIj5DU1M8L2E+IG1vZGVzIHdlcmUgbGFyZ2VseSByZXdyaXR0ZW4uIDxhIGhyZWY9Ii4uL21vZGUvY3NzL2xlc3MuaHRtbCI+TEVTUzwvYT4gc3VwcG9ydCB3YXMgYWRkZWQgdG8gdGhlIENTUyBtb2RlLjwvbGk+CiAgICA8bGk+VGhlIE9DYW1sIG1vZGUgd2FzIG1vdmVkIHRvIGFuIDxhIGhyZWY9Ii4uL21vZGUvbWxsaWtlL2luZGV4Lmh0bWwiPm1sbGlrZTwvYT4gbW9kZSwgRiMgc3VwcG9ydCBhZGRlZC48L2xpPgogICAgPGxpPk1ha2UgaXQgcG9zc2libGUgdG8gZmV0Y2ggbXVsdGlwbGUgYXBwbGljYWJsZSBoZWxwZXIgdmFsdWVzIHdpdGggPGEgaHJlZj0ibWFudWFsLmh0bWwjZ2V0SGVscGVycyI+PGNvZGU+Z2V0SGVscGVyczwvY29kZT48L2E+LCBhbmQgdG8gcmVnaXN0ZXIgaGVscGVycyBtYXRjaGVkIG9uIHByZWRpY2F0ZXMgd2l0aCA8YSBocmVmPSJtYW51YWwuaHRtbCNyZWdpc3Rlckdsb2JhbEhlbHBlciI+PGNvZGU+cmVnaXN0ZXJHbG9iYWxIZWxwZXI8L2NvZGU+PC9hPi48L2xpPgogICAgPGxpPk5ldyB0aGVtZSA8YSBocmVmPSIuLi9kZW1vL3RoZW1lLmh0bWwjcGFzdGVsLW9uLWRhcmsiPnBhc3RlbC1vbi1kYXJrPC9hPi48L2xpPgogICAgPGxpPkJldHRlciBFQ01BU2NyaXB0IDYgc3VwcG9ydCBpbiA8YSBocmVmPSIuLi9tb2RlL2phdmFzY3JpcHQvaW5kZXguaHRtbCI+SmF2YVNjcmlwdDwvYT4gbW9kZS48L2xpPgogICAgPGxpPkZ1bGwgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvQ29kZU1pcnJvci9jb21wYXJlLzMuMjAuMC4uLjMuMjEuMCI+bGlzdCBvZiBwYXRjaGVzPC9hPi48L2xpPgogIDwvdWw+CgogIDxwIGNsYXNzPSJyZWwiPjIxLTExLTIwMTM6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTMuMjAuemlwIj5WZXJzaW9uIDMuMjA8L2E+OjwvcD4KCiAgPHVsIGNsYXNzPSJyZWwtbm90ZSI+CiAgICA8bGk+TmV3IG1vZGVzOiA8YSBocmVmPSIuLi9tb2RlL2p1bGlhL2luZGV4Lmh0bWwiPkp1bGlhPC9hPiBhbmQgPGEgaHJlZj0iLi4vbW9kZS9wZWdqcy9pbmRleC5odG1sIj5QRUcuanM8L2E+LjwvbGk+CiAgICA8bGk+U3VwcG9ydCBFQ01BU2NyaXB0IDYgaW4gdGhlIDxhIGhyZWY9Ii4uL21vZGUvamF2YXNjcmlwdC9pbmRleC5odG1sIj5KYXZhU2NyaXB0IG1vZGU8L2E+LjwvbGk+CiAgICA8bGk+SW1wcm92ZWQgaW5kZW50YXRpb24gZm9yIHRoZSA8YSBocmVmPSIuLi9tb2RlL2NvZmZlZXNjcmlwdC9pbmRleC5odG1sIj5Db2ZmZWVTY3JpcHQgbW9kZTwvYT4uPC9saT4KICAgIDxsaT5NYWtlIG5vbi1wcmludGFibGUtY2hhcmFjdGVyIHJlcHJlc2VudGF0aW9uIDxhIGhyZWY9Im1hbnVhbC5odG1sI29wdGlvbl9zcGVjaWFsQ2hhcnMiPmNvbmZpZ3VyYWJsZTwvYT4uPC9saT4KICAgIDxsaT5BZGQg4oCYbm90aWZpY2F0aW9u4oCZIGZ1bmN0aW9uYWxpdHkgdG8gPGEgaHJlZj0ibWFudWFsLmh0bWwjYWRkb25fZGlhbG9nIj5kaWFsb2c8L2E+IGFkZG9uLjwvbGk+CiAgICA8bGk+RnVsbCA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9Db2RlTWlycm9yL2NvbXBhcmUvMy4xOS4wLi4uMy4yMC4wIj5saXN0IG9mIHBhdGNoZXM8L2E+LjwvbGk+CiAgPC91bD4KCiAgPHAgY2xhc3M9InJlbCI+MjEtMTAtMjAxMzogPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2NvZGVtaXJyb3ItMy4xOS56aXAiPlZlcnNpb24gMy4xOTwvYT46PC9wPgoKICA8dWwgY2xhc3M9InJlbC1ub3RlIj4KICAgIDxsaT5OZXcgbW9kZXM6IDxhIGhyZWY9Ii4uL21vZGUvZWlmZmVsL2luZGV4Lmh0bWwiPkVpZmZlbDwvYT4sIDxhIGhyZWY9Ii4uL21vZGUvZ2hlcmtpbi9pbmRleC5odG1sIj5HaGVya2luPC9hPiwgPGEgaHJlZj0iLi4vbW9kZS9zcWwvP21pbWU9dGV4dC94LW1zc3FsIj5NU1NRTCBkaWFsZWN0PC9hPi48L2xpPgogICAgPGxpPk5ldyBhZGRvbnM6IDxhIGhyZWY9Im1hbnVhbC5odG1sI2FkZG9uX2hhcmR3cmFwIj5oYXJkd3JhcDwvYT4sIDxhIGhyZWY9Im1hbnVhbC5odG1sI2FkZG9uX3NxbC1oaW50Ij5zcWwtaGludDwvYT4uPC9saT4KICAgIDxsaT5OZXcgdGhlbWU6IDxhIGhyZWY9Ii4uL2RlbW8vdGhlbWUuaHRtbCNtYm8iPk1CTzwvYT4uPC9saT4KICAgIDxsaT5BZGQgPGEgaHJlZj0ibWFudWFsLmh0bWwjdG9rZW5fc3R5bGVfbGluZSI+c3VwcG9ydDwvYT4gZm9yIGxpbmUtbGV2ZWwgc3R5bGluZyBmcm9tIG1vZGUgdG9rZW5pemVycy48L2xpPgogICAgPGxpPkZ1bGwgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvQ29kZU1pcnJvci9jb21wYXJlLzMuMTguMC4uLjMuMTkuMCI+bGlzdCBvZiBwYXRjaGVzPC9hPi48L2xpPgogIDwvdWw+CgogIDxwIGNsYXNzPSJyZWwiPjIzLTA5LTIwMTM6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTMuMTguemlwIj5WZXJzaW9uIDMuMTg8L2E+OjwvcD4KCiAgPHAgY2xhc3M9InJlbC1ub3RlIj5FbWVyZ2VuY3kgcmVsZWFzZSB0byBmaXggYSBwcm9ibGVtIGluIDMuMTcKICB3aGVyZSA8Y29kZT4uc2V0T3B0aW9uKCJsaW5lTnVtYmVycyIsIGZhbHNlKTwvY29kZT4gd291bGQgcmFpc2UgYW4KICBlcnJvci48L3A+CgogIDxwIGNsYXNzPSJyZWwiPjIzLTA5LTIwMTM6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTMuMTcuemlwIj5WZXJzaW9uIDMuMTc8L2E+OjwvcD4KCiAgPHVsIGNsYXNzPSJyZWwtbm90ZSI+CiAgICA8bGk+TmV3IG1vZGVzOiA8YSBocmVmPSIuLi9tb2RlL2ZvcnRyYW4vaW5kZXguaHRtbCI+Rm9ydHJhbjwvYT4sIDxhIGhyZWY9Ii4uL21vZGUvb2N0YXZlL2luZGV4Lmh0bWwiPk9jdGF2ZTwvYT4gKE1hdGxhYiksIDxhIGhyZWY9Ii4uL21vZGUvdG9tbC9pbmRleC5odG1sIj5UT01MPC9hPiwgYW5kIDxhIGhyZWY9Ii4uL21vZGUvZHRkL2luZGV4Lmh0bWwiPkRURDwvYT4uPC9saT4KICAgIDxsaT5OZXcgYWRkb25zOiA8YSBocmVmPSIuLi9hZGRvbi9saW50L2Nzcy1saW50LmpzIj48Y29kZT5jc3MtbGludDwvY29kZT48L2E+LCA8YSBocmVmPSJtYW51YWwuaHRtbCNhZGRvbl9jc3MtaGludCI+PGNvZGU+Y3NzLWhpbnQ8L2NvZGU+PC9hPi48L2xpPgogICAgPGxpPkltcHJvdmUgcmVzaWxpZW5jZSB0byBDU1MgJ2ZyYW1ld29ya3MnIHRoYXQgZ2xvYmFsbHkgbWVzcyB1cCA8Y29kZT5ib3gtc2l6aW5nPC9jb2RlPi48L2xpPgogICAgPGxpPkZ1bGwgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvQ29kZU1pcnJvci9jb21wYXJlLzMuMTYuMC4uLjMuMTcuMCI+bGlzdCBvZiBwYXRjaGVzPC9hPi48L2xpPgogIDwvdWw+CgogIDxwIGNsYXNzPSJyZWwiPjIxLTA4LTIwMTM6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTMuMTYuemlwIj5WZXJzaW9uIDMuMTY8L2E+OjwvcD4KCiAgPHVsIGNsYXNzPSJyZWwtbm90ZSI+CiAgICA8bGk+VGhlIHdob2xlIGNvZGViYXNlIGlzIG5vdyB1bmRlciBhIHNpbmdsZSA8YSBocmVmPSIuLi9MSUNFTlNFIj5saWNlbnNlPC9hPiBmaWxlLjwvbGk+CiAgICA8bGk+VGhlIHByb2plY3QgcGFnZSB3YXMgb3ZlcmhhdWxlZCBhbmQgcmVkZXNpZ25lZC48L2xpPgogICAgPGxpPk5ldyB0aGVtZXM6IDxhIGhyZWY9Ii4uL2RlbW8vdGhlbWUuaHRtbCNwYXJhaXNvLWRhcmsiPlBhcmFpc288L2E+ICg8YSBocmVmPSIuLi9kZW1vL3RoZW1lLmh0bWwjcGFyYWlzby1saWdodCI+bGlnaHQ8L2E+KSwgPGEgaHJlZj0iLi4vZGVtby90aGVtZS5odG1sI3RoZS1tYXRyaXgiPlRoZSBNYXRyaXg8L2E+LjwvbGk+CiAgICA8bGk+SW1wcm92ZWQgaW50ZXJhY3Rpb24gYmV0d2VlbiB0aGVtZXMgYW5kIDxhIGhyZWY9Im1hbnVhbC5odG1sI2FkZG9uX2FjdGl2ZS1saW5lIj5hY3RpdmUtbGluZTwvYT4vPGEgaHJlZj0ibWFudWFsLmh0bWwjYWRkb25fbWF0Y2hicmFja2V0cyI+bWF0Y2hicmFja2V0czwvYT4gYWRkb25zLjwvbGk+CiAgICA8bGk+TmV3IDxhIGhyZWY9Im1hbnVhbC5odG1sI2FkZG9uX2ZvbGRjb2RlIj5mb2xkaW5nPC9hPiBmdW5jdGlvbiA8Y29kZT5Db2RlTWlycm9yLmZvbGQuY29tbWVudDwvY29kZT4uPC9saT4KICAgIDxsaT5BZGRlZCA8YSBocmVmPSJtYW51YWwuaHRtbCNhZGRvbl9mdWxsc2NyZWVuIj5mdWxsc2NyZWVuPC9hPiBhZGRvbi48L2xpPgogICAgPGxpPkZ1bGwgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvQ29kZU1pcnJvci9jb21wYXJlLzMuMTUuMC4uLjMuMTYuMCI+bGlzdCBvZiBwYXRjaGVzPC9hPi48L2xpPgogIDwvdWw+CgogIDxwIGNsYXNzPSJyZWwiPjI5LTA3LTIwMTM6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTMuMTUuemlwIj5WZXJzaW9uIDMuMTU8L2E+OjwvcD4KCiAgPHVsIGNsYXNzPSJyZWwtbm90ZSI+CiAgICA8bGk+TmV3IG1vZGVzOiA8YSBocmVmPSIuLi9tb2RlL2phZGUvaW5kZXguaHRtbCI+SmFkZTwvYT4sIDxhIGhyZWY9Ii4uL21vZGUvbmdpbngvaW5kZXguaHRtbCI+Tmdpbng8L2E+LjwvbGk+CiAgICA8bGk+TmV3IGFkZG9uczogPGEgaHJlZj0iLi4vZGVtby90ZXJuLmh0bWwiPlRlcm48L2E+LCA8YSBocmVmPSJtYW51YWwuaHRtbCNhZGRvbl9tYXRjaHRhZ3MiPm1hdGNodGFnczwvYT4sIGFuZCA8YSBocmVmPSJtYW51YWwuaHRtbCNhZGRvbl9mb2xkZ3V0dGVyIj5mb2xkZ3V0dGVyPC9hPi48L2xpPgogICAgPGxpPkludHJvZHVjZWQgPGEgaHJlZj0ibWFudWFsLmh0bWwjZ2V0SGVscGVyIj48ZW0+aGVscGVyPC9lbT48L2E+IGNvbmNlcHQgKDxhIGhyZWY9Imh0dHBzOi8vZ3JvdXBzLmdvb2dsZS5jb20vZm9ydW0vIyFtc2cvY29kZW1pcnJvci9jT2MweHZVVUVVVS9uTHJYMS1xbmlkZ0oiPmNvbnRleHQ8L2E+KS48L2xpPgogICAgPGxpPk5ldyBtZXRob2Q6IDxhIGhyZWY9Im1hbnVhbC5odG1sI2dldE1vZGVBdCI+PGNvZGU+Z2V0TW9kZUF0PC9jb2RlPjwvYT4uPC9saT4KICAgIDxsaT5OZXcgdGhlbWVzOiBiYXNlMTYgPGEgaHJlZj0iLi4vZGVtby90aGVtZS5odG1sI2Jhc2UxNi1kYXJrIj5kYXJrPC9hPi88YSBocmVmPSIuLi9kZW1vL3RoZW1lLmh0bWwjYmFzZTE2LWxpZ2h0Ij5saWdodDwvYT4sIDMwMjQgPGEgaHJlZj0iLi4vZGVtby90aGVtZS5odG1sIzMwMjQtbmlnaHQiPmRhcms8L2E+LzxhIGhyZWY9Ii4uL2RlbW8vdGhlbWUuaHRtbCMzMDI0LWRheSI+bGlnaHQ8L2E+LCA8YSBocmVmPSIuLi9kZW1vL3RoZW1lLmh0bWwjdG9tb3Jyb3ctbmlnaHQtZWlnaHRpZXMiPnRvbW9ycm93LW5pZ2h0PC9hPi48L2xpPgogICAgPGxpPkZ1bGwgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvQ29kZU1pcnJvci9jb21wYXJlLzMuMTQuMC4uLjMuMTUuMCI+bGlzdCBvZiBwYXRjaGVzPC9hPi48L2xpPgogIDwvdWw+CgogIDxwIGNsYXNzPSJyZWwiPjIwLTA2LTIwMTM6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTMuMTQuemlwIj5WZXJzaW9uIDMuMTQ8L2E+OjwvcD4KCiAgPHVsIGNsYXNzPSJyZWwtbm90ZSI+CiAgICA8bGk+TmV3CiAgICBhZGRvbnM6IDxhIGhyZWY9Im1hbnVhbC5odG1sI2FkZG9uX3RyYWlsaW5nc3BhY2UiPnRyYWlsaW5nCiAgICBzcGFjZSBoaWdobGlnaHQ8L2E+LCA8YSBocmVmPSJtYW51YWwuaHRtbCNhZGRvbl94bWwtaGludCI+WE1MCiAgICBjb21wbGV0aW9uPC9hPiAocmV3cml0dGVuKSwKICAgIGFuZCA8YSBocmVmPSJtYW51YWwuaHRtbCNhZGRvbl9tZXJnZSI+ZGlmZiBtZXJnaW5nPC9hPi48L2xpPgogICAgPGxpPjxhIGhyZWY9Im1hbnVhbC5odG1sI21hcmtUZXh0Ij48Y29kZT5tYXJrVGV4dDwvY29kZT48L2E+CiAgICBhbmQgPGEgaHJlZj0ibWFudWFsLmh0bWwjYWRkTGluZVdpZGdldCI+PGNvZGU+YWRkTGluZVdpZGdldDwvY29kZT48L2E+CiAgICBub3cgdGFrZSBhIDxjb2RlPmhhbmRsZU1vdXNlRXZlbnRzPC9jb2RlPiBvcHRpb24uPC9saT4KICAgIDxsaT5OZXcgbWV0aG9kczogPGEgaHJlZj0ibWFudWFsLmh0bWwjbGluZUF0SGVpZ2h0Ij48Y29kZT5saW5lQXRIZWlnaHQ8L2NvZGU+PC9hPiwKICAgIDxhIGhyZWY9Im1hbnVhbC5odG1sI2dldFRva2VuVHlwZUF0Ij48Y29kZT5nZXRUb2tlblR5cGVBdDwvY29kZT48L2E+LjwvbGk+CiAgICA8bGk+TW9yZSBwcmVjaXNlIGNsZWFubmVzcy10cmFja2luZwogICAgdXNpbmcgPGEgaHJlZj0ibWFudWFsLmh0bWwjY2hhbmdlR2VuZXJhdGlvbiI+PGNvZGU+Y2hhbmdlR2VuZXJhdGlvbjwvY29kZT48L2E+CiAgICBhbmQgPGEgaHJlZj0ibWFudWFsLmh0bWwjaXNDbGVhbiI+PGNvZGU+aXNDbGVhbjwvY29kZT48L2E+LjwvbGk+CiAgICA8bGk+TWFueSBleHRlbnNpb25zIHRvIDxhIGhyZWY9Ii4uL2RlbW8vZW1hY3MuaHRtbCI+RW1hY3M8L2E+IG1vZGUKICAgIChwcmVmaXhlcywgbW9yZSBuYXZpZ2F0aW9uIHVuaXRzLCBhbmQgbW9yZSkuPC9saT4KICAgIDxsaT5OZXcKICAgIGV2ZW50cyA8YSBocmVmPSJtYW51YWwuaHRtbCNldmVudF9rZXlIYW5kbGVkIj48Y29kZT4ia2V5SGFuZGxlZCI8L2NvZGU+PC9hPgogICAgYW5kIDxhIGhyZWY9Im1hbnVhbC5odG1sI2V2ZW50X2lucHV0UmVhZCI+PGNvZGU+ImlucHV0UmVhZCI8L2NvZGU+PC9hPi48L2xpPgogICAgPGxpPlZhcmlvdXMgaW1wcm92ZW1lbnRzIHRvIDxhIGhyZWY9Ii4uL21vZGUvcnVieS9pbmRleC5odG1sIj5SdWJ5PC9hPiwKICAgIDxhIGhyZWY9Ii4uL21vZGUvc21hcnR5L2luZGV4Lmh0bWwiPlNtYXJ0eTwvYT4sIDxhIGhyZWY9Ii4uL21vZGUvc3FsL2luZGV4Lmh0bWwiPlNRTDwvYT4sCiAgICBhbmQgPGEgaHJlZj0iLi4vZGVtby92aW0uaHRtbCI+VmltPC9hPiBtb2Rlcy48L2xpPgogICAgPGxpPkZ1bGwgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvQ29kZU1pcnJvci9jb21wYXJlLzMuMTMuMC4uLjMuMTQuMCI+bGlzdCBvZiBwYXRjaGVzPC9hPi48L2xpPgogIDwvdWw+CgogIDxwIGNsYXNzPSJyZWwiPjIwLTA1LTIwMTM6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTMuMTMuemlwIj5WZXJzaW9uIDMuMTM8L2E+OjwvcD4KCiAgPHVsIGNsYXNzPSJyZWwtbm90ZSI+CiAgICA8bGk+TmV3IG1vZGVzOiA8YSBocmVmPSIuLi9tb2RlL2NvYm9sL2luZGV4Lmh0bWwiPkNPQk9MPC9hPiBhbmQgPGEgaHJlZj0iLi4vbW9kZS9oYW1sL2luZGV4Lmh0bWwiPkhBTUw8L2E+LjwvbGk+CiAgICA8bGk+TmV3IG9wdGlvbnM6IDxhIGhyZWY9Im1hbnVhbC5odG1sI29wdGlvbl9jdXJzb3JTY3JvbGxNYXJnaW4iPjxjb2RlPmN1cnNvclNjcm9sbE1hcmdpbjwvY29kZT48L2E+IGFuZCA8YSBocmVmPSJtYW51YWwuaHRtbCNvcHRpb25fY292ZXJHdXR0ZXJOZXh0VG9TY3JvbGxiYXIiPjxjb2RlPmNvdmVyR3V0dGVyTmV4dFRvU2Nyb2xsYmFyPC9jb2RlPjwvYT4uPC9saT4KICAgIDxsaT5OZXcgYWRkb246IDxhIGhyZWY9Im1hbnVhbC5odG1sI2FkZG9uX2NvbW1lbnQiPmNvbW1lbnRpbmc8L2E+LjwvbGk+CiAgICA8bGk+TW9yZSBmZWF0dXJlcyBhZGRlZCB0byB0aGUgPGEgaHJlZj0iLi4vZGVtby92aW0uaHRtbCI+VmltIGtleW1hcDwvYT4uPC9saT4KICAgIDxsaT5GdWxsIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL0NvZGVNaXJyb3IvY29tcGFyZS92My4xMi4uLjMuMTMuMCI+bGlzdCBvZiBwYXRjaGVzPC9hPi48L2xpPgogIDwvdWw+CgogIDxwIGNsYXNzPSJyZWwiPjE5LTA0LTIwMTM6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTMuMTIuemlwIj5WZXJzaW9uIDMuMTI8L2E+OjwvcD4KCiAgPHVsIGNsYXNzPSJyZWwtbm90ZSI+CiAgICA8bGk+TmV3IG1vZGU6IDxhIGhyZWY9Ii4uL21vZGUvZ2FzL2luZGV4Lmh0bWwiPkdOVSBhc3NlbWJsZXI8L2E+LjwvbGk+CiAgICA8bGk+TmV3CiAgICBvcHRpb25zOiA8YSBocmVmPSJtYW51YWwuaHRtbCNvcHRpb25fbWF4SGlnaGxpZ2h0TGVuZ3RoIj48Y29kZT5tYXhIaWdobGlnaHRMZW5ndGg8L2NvZGU+PC9hPgogICAgYW5kIDxhIGhyZWY9Im1hbnVhbC5odG1sI29wdGlvbl9oaXN0b3J5RXZlbnREZWxheSI+PGNvZGU+aGlzdG9yeUV2ZW50RGVsYXk8L2NvZGU+PC9hPi48L2xpPgogICAgPGxpPkFkZGVkIDxhIGhyZWY9Im1hbnVhbC5odG1sI21hcmtfYWRkVG9IaXN0b3J5Ij48Y29kZT5hZGRUb0hpc3Rvcnk8L2NvZGU+PC9hPgogICAgb3B0aW9uIGZvciA8Y29kZT5tYXJrVGV4dDwvY29kZT4uPC9saT4KICAgIDxsaT5WYXJpb3VzIGZpeGVzIHRvIEphdmFTY3JpcHQgdG9rZW5pemF0aW9uIGFuZCBpbmRlbnRhdGlvbiBjb3JuZXIgY2FzZXMuPC9saT4KICAgIDxsaT5GdXJ0aGVyIGltcHJvdmVtZW50cyB0byB0aGUgdmltIG1vZGUuPC9saT4KICAgIDxsaT5GdWxsIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL0NvZGVNaXJyb3IvY29tcGFyZS92My4xMS4uLnYzLjEyIj5saXN0IG9mIHBhdGNoZXM8L2E+LjwvbGk+CiAgPC91bD4KCiAgPHAgY2xhc3M9InJlbCI+MjAtMDMtMjAxMzogPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2NvZGVtaXJyb3ItMy4xMS56aXAiPlZlcnNpb24gMy4xMTwvYT46PC9wPgoKICA8dWwgY2xhc3M9InJlbC1ub3RlIj4KICAgIDxsaT48c3Ryb25nPlJlbW92ZWQgY29kZTo8L3N0cm9uZz4gPGNvZGU+Y29sbGFwc2VyYW5nZTwvY29kZT4sCiAgICA8Y29kZT5mb3JtYXR0aW5nPC9jb2RlPiwgYW5kIDxjb2RlPnNpbXBsZS1oaW50PC9jb2RlPgogICAgYWRkb25zLiA8Y29kZT5wbHNxbDwvY29kZT4gYW5kIDxjb2RlPm15c3FsPC9jb2RlPiBtb2RlcwogICAgKHVzZSA8YSBocmVmPSIuLi9tb2RlL3NxbC9pbmRleC5odG1sIj48Y29kZT5zcWw8L2NvZGU+PC9hPiBtb2RlKS48L2xpPgogICAgPGxpPjxzdHJvbmc+TW92ZWQgY29kZTo8L3N0cm9uZz4gdGhlIHJhbmdlLWZpbmRpbmcgZnVuY3Rpb25zIGZvciBmb2xkaW5nIG5vdyBoYXZlIDxhIGhyZWY9Ii4uL2FkZG9uL2ZvbGQvIj50aGVpciBvd24gZmlsZXM8L2E+LjwvbGk+CiAgICA8bGk+PHN0cm9uZz5DaGFuZ2VkIGludGVyZmFjZTo8L3N0cm9uZz4KICAgIHRoZSA8YSBocmVmPSJtYW51YWwuaHRtbCNhZGRvbl9jb250aW51ZWNvbW1lbnQiPjxjb2RlPmNvbnRpbnVlY29tbWVudDwvY29kZT48L2E+CiAgICBhZGRvbiBub3cgZXhwb3NlcyBhbiBvcHRpb24sIHJhdGhlciB0aGFuIGEgY29tbWFuZC48L2xpPgogICAgPGxpPk5ldwogICAgbW9kZXM6IDxhIGhyZWY9Ii4uL21vZGUvY3NzL3Njc3MuaHRtbCI+U0NTUzwvYT4sIDxhIGhyZWY9Ii4uL21vZGUvdGNsL2luZGV4Lmh0bWwiPlRjbDwvYT4sIDxhIGhyZWY9Ii4uL21vZGUvbGl2ZXNjcmlwdC9pbmRleC5odG1sIj5MaXZlU2NyaXB0PC9hPiwKICAgIGFuZCA8YSBocmVmPSIuLi9tb2RlL21pcmMvaW5kZXguaHRtbCI+bUlSQzwvYT4uPC9saT4KICAgIDxsaT5OZXcgYWRkb25zOiA8YSBocmVmPSIuLi9kZW1vL3BsYWNlaG9sZGVyLmh0bWwiPjxjb2RlPnBsYWNlaG9sZGVyPC9jb2RlPjwvYT4sIDxhIGhyZWY9Ii4uL2RlbW8vaHRtbDVjb21wbGV0ZS5odG1sIj5IVE1MIGNvbXBsZXRpb248L2E+LjwvbGk+CiAgICA8bGk+TmV3CiAgICBtZXRob2RzOiA8YSBocmVmPSJtYW51YWwuaHRtbCNoYXNGb2N1cyI+PGNvZGU+aGFzRm9jdXM8L2NvZGU+PC9hPiwgPGEgaHJlZj0ibWFudWFsLmh0bWwjZGVmYXVsdENoYXJXaWR0aCI+PGNvZGU+ZGVmYXVsdENoYXJXaWR0aDwvY29kZT48L2E+LjwvbGk+CiAgICA8bGk+TmV3IGV2ZW50czogPGEgaHJlZj0ibWFudWFsLmh0bWwjZXZlbnRfYmVmb3JlQ3Vyc29yRW50ZXIiPjxjb2RlPmJlZm9yZUN1cnNvckVudGVyPC9jb2RlPjwvYT4sIDxhIGhyZWY9Im1hbnVhbC5odG1sI2V2ZW50X3JlbmRlckxpbmUiPjxjb2RlPnJlbmRlckxpbmU8L2NvZGU+PC9hPi48L2xpPgogICAgPGxpPk1hbnkgaW1wcm92ZW1lbnRzIHRvIHRoZSA8YSBocmVmPSJtYW51YWwuaHRtbCNhZGRvbl9zaG93LWhpbnQiPjxjb2RlPnNob3ctaGludDwvY29kZT48L2E+IGNvbXBsZXRpb24KICAgIGRpYWxvZyBhZGRvbi48L2xpPgogICAgPGxpPlR3ZWFrIGJlaGF2aW9yIG9mIGJ5LXdvcmQgY3Vyc29yIG1vdGlvbi48L2xpPgogICAgPGxpPkZ1cnRoZXIgaW1wcm92ZW1lbnRzIHRvIHRoZSA8YSBocmVmPSIuLi9kZW1vL3ZpbS5odG1sIj52aW0gbW9kZTwvYT4uPC9saT4KICAgIDxsaT5GdWxsIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL0NvZGVNaXJyb3IvY29tcGFyZS92My4xLi4udjMuMTEiPmxpc3Qgb2YgcGF0Y2hlczwvYT4uPC9saT4KICA8L3VsPgoKICA8cCBjbGFzcz0icmVsIj4yMS0wMi0yMDEzOiA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvY29kZW1pcnJvci0zLjEuemlwIj5WZXJzaW9uIDMuMTwvYT46PC9wPgoKICA8dWwgY2xhc3M9InJlbC1ub3RlIj4KICAgIDxsaT48c3Ryb25nPkluY29tcGF0aWJsZTo8L3N0cm9uZz4ga2V5IGhhbmRsZXJzIG1heQogICAgbm93IDxlbT5yZXR1cm48L2VtPiwgcmF0aGVyCiAgICB0aGFuIDxlbT50aHJvdzwvZW0+IDxjb2RlPkNvZGVNaXJyb3IuUGFzczwvY29kZT4gdG8gc2lnbmFsIHRoZXkKICAgIGRpZG4ndCBoYW5kbGUgdGhlIGtleS48L2xpPgogICAgPGxpPk1ha2UgZG9jdW1lbnRzIGEgPGEgaHJlZj0ibWFudWFsLmh0bWwjYXBpX2RvYyI+Zmlyc3QtY2xhc3MKICAgIGNvbnN0cnVjdDwvYT4sIHN1cHBvcnQgc3BsaXQgdmlld3MgYW5kIHN1YnZpZXdzLjwvbGk+CiAgICA8bGk+QWRkIGEgPGEgaHJlZj0ibWFudWFsLmh0bWwjYWRkb25fc2hvdy1oaW50Ij5uZXcgbW9kdWxlPC9hPgogICAgZm9yIHNob3dpbmcgY29tcGxldGlvbiBoaW50cy4KICAgIERlcHJlY2F0ZSA8Y29kZT5zaW1wbGUtaGludC5qczwvY29kZT4uPC9saT4KICAgIDxsaT5FeHRlbmQgPGEgaHJlZj0iLi4vbW9kZS9odG1sbWl4ZWQvaW5kZXguaHRtbCI+aHRtbG1peGVkIG1vZGU8L2E+CiAgICB0byBhbGxvdyBjdXN0b20gaGFuZGxpbmcgb2Ygc2NyaXB0IHR5cGVzLjwvbGk+CiAgICA8bGk+U3VwcG9ydCBhbiA8Y29kZT5pbnNlcnRMZWZ0PC9jb2RlPiBvcHRpb24KICAgIHRvIDxhIGhyZWY9Im1hbnVhbC5odG1sI3NldEJvb2ttYXJrIj48Y29kZT5zZXRCb29rbWFyazwvY29kZT48L2E+LjwvbGk+CiAgICA8bGk+QWRkIGFuIDxhIGhyZWY9Im1hbnVhbC5odG1sI2VhY2hMaW5lIj48Y29kZT5lYWNoTGluZTwvY29kZT48L2E+CiAgICBtZXRob2QgdG8gaXRlcmF0ZSBvdmVyIGEgZG9jdW1lbnQuPC9saT4KICAgIDxsaT5OZXcgYWRkb24gbW9kdWxlczogPGEgaHJlZj0iLi4vZGVtby9tYXJrc2VsZWN0aW9uLmh0bWwiPnNlbGVjdGlvbgogICAgbWFya2luZzwvYT4sIDxhIGhyZWY9Ii4uL2RlbW8vbGludC5odG1sIj5saW50aW5nPC9hPiwKICAgIGFuZCA8YSBocmVmPSIuLi9kZW1vL2Nsb3NlYnJhY2tldHMuaHRtbCI+YXV0b21hdGljIGJyYWNrZXQKICAgIGNsb3Npbmc8L2E+LjwvbGk+CiAgICA8bGk+QWRkIDxhIGhyZWY9Im1hbnVhbC5odG1sI2V2ZW50X2JlZm9yZUNoYW5nZSI+PGNvZGU+ImJlZm9yZUNoYW5nZSI8L2NvZGU+PC9hPgogICAgYW5kIDxhIGhyZWY9Im1hbnVhbC5odG1sI2V2ZW50X2JlZm9yZVNlbGVjdGlvbkNoYW5nZSI+PGNvZGU+ImJlZm9yZVNlbGVjdGlvbkNoYW5nZSI8L2NvZGU+PC9hPgogICAgZXZlbnRzLjwvbGk+CiAgICA8bGk+QWRkIDxhIGhyZWY9Im1hbnVhbC5odG1sI2V2ZW50X2hpZGUiPjxjb2RlPiJoaWRlIjwvY29kZT48L2E+CiAgICBhbmQgPGEgaHJlZj0ibWFudWFsLmh0bWwjZXZlbnRfdW5oaWRlIj48Y29kZT4idW5oaWRlIjwvY29kZT48L2E+CiAgICBldmVudHMgdG8gbWFya2VkIHJhbmdlcy48L2xpPgogICAgPGxpPkZpeCA8YSBocmVmPSJtYW51YWwuaHRtbCNjb29yZHNDaGFyIj48Y29kZT5jb29yZHNDaGFyPC9jb2RlPjwvYT4ncwogICAgaW50ZXJwcmV0YXRpb24gb2YgaXRzIGFyZ3VtZW50IHRvIG1hdGNoIHRoZSBkb2N1bWVudGF0aW9uLjwvbGk+CiAgICA8bGk+TmV3IG1vZGVzOiA8YSBocmVmPSIuLi9tb2RlL3R1cnRsZS9pbmRleC5odG1sIj5UdXJ0bGU8L2E+CiAgICBhbmQgPGEgaHJlZj0iLi4vbW9kZS9xL2luZGV4Lmh0bWwiPlE8L2E+LjwvbGk+CiAgICA8bGk+RnVydGhlciBpbXByb3ZlbWVudHMgdG8gdGhlIDxhIGhyZWY9Ii4uL2RlbW8vdmltLmh0bWwiPnZpbSBtb2RlPC9hPi48L2xpPgogICAgPGxpPkZ1bGwgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvQ29kZU1pcnJvci9jb21wYXJlL3YzLjAxLi4udjMuMSI+bGlzdCBvZiBwYXRjaGVzPC9hPi48L2xpPgogIDwvdWw+CgoKICA8cCBjbGFzcz0icmVsIj4yNS0wMS0yMDEzOiA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvY29kZW1pcnJvci0zLjAyLnppcCI+VmVyc2lvbiAzLjAyPC9hPjo8L3A+CgogIDxwIGNsYXNzPSJyZWwtbm90ZSI+U2luZ2xlLWJ1Z2ZpeCByZWxlYXNlLiBGaXhlcyBhIHByb2JsZW0gdGhhdAogIHByZXZlbnRzIENvZGVNaXJyb3IgaW5zdGFuY2VzIGZyb20gYmVpbmcgZ2FyYmFnZS1jb2xsZWN0ZWQgYWZ0ZXIKICB0aGV5IGJlY29tZSB1bnVzZWQuPC9wPgoKICA8cCBjbGFzcz0icmVsIj4yMS0wMS0yMDEzOiA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvY29kZW1pcnJvci0zLjAxLnppcCI+VmVyc2lvbiAzLjAxPC9hPjo8L3A+CgogIDx1bCBjbGFzcz0icmVsLW5vdGUiPgogICAgPGxpPk1vdmUgYWxsIGFkZC1vbnMgaW50byBhbiBvcmdhbml6ZWQgZGlyZWN0b3J5IHN0cnVjdHVyZQogICAgdW5kZXIgPGEgaHJlZj0iLi4vYWRkb24vIj48Y29kZT4vYWRkb248L2NvZGU+PC9hPi4gPHN0cm9uZz5Zb3UgbWlnaHQgaGF2ZSB0byBhZGp1c3QgeW91cgogICAgcGF0aHMuPC9zdHJvbmc+PC9saT4KICAgIDxsaT5OZXcKICAgIG1vZGVzOiA8YSBocmVmPSIuLi9tb2RlL2QvaW5kZXguaHRtbCI+RDwvYT4sIDxhIGhyZWY9Ii4uL21vZGUvc2Fzcy9pbmRleC5odG1sIj5TYXNzPC9hPiwgPGEgaHJlZj0iLi4vbW9kZS9hcGwvaW5kZXguaHRtbCI+QVBMPC9hPiwgPGEgaHJlZj0iLi4vbW9kZS9zcWwvaW5kZXguaHRtbCI+U1FMPC9hPgogICAgKGNvbmZpZ3VyYWJsZSksIGFuZCA8YSBocmVmPSIuLi9tb2RlL2FzdGVyaXNrL2luZGV4Lmh0bWwiPkFzdGVyaXNrPC9hPi48L2xpPgogICAgPGxpPlNldmVyYWwgYnVnZml4ZXMgaW4gcmlnaHQtdG8tbGVmdCB0ZXh0IHN1cHBvcnQuPC9saT4KICAgIDxsaT5BZGQgPGEgaHJlZj0ibWFudWFsLmh0bWwjb3B0aW9uX3J0bE1vdmVWaXN1YWxseSI+PGNvZGU+cnRsTW92ZVZpc3VhbGx5PC9jb2RlPjwvYT4gb3B0aW9uLjwvbGk+CiAgICA8bGk+SW1wcm92ZW1lbnRzIHRvIHZpbSBrZXltYXAuPC9saT4KICAgIDxsaT5BZGQgYnVpbHQtaW4gKGxpZ2h0d2VpZ2h0KSA8YSBocmVmPSJtYW51YWwuaHRtbCNhZGRPdmVybGF5Ij5vdmVybGF5IG1vZGU8L2E+IHN1cHBvcnQuPC9saT4KICAgIDxsaT5TdXBwb3J0IDxjb2RlPnNob3dJZkhpZGRlbjwvY29kZT4gb3B0aW9uIGZvciA8YSBocmVmPSJtYW51YWwuaHRtbCNhZGRMaW5lV2lkZ2V0Ij5saW5lIHdpZGdldHM8L2E+LjwvbGk+CiAgICA8bGk+QWRkIHNpbXBsZSA8YSBocmVmPSJtYW51YWwuaHRtbCNhZGRvbl9weXRob24taGludCI+UHl0aG9uIGhpbnRlcjwvYT4uPC9saT4KICAgIDxsaT5CcmluZyBiYWNrIHRoZSA8YSBocmVmPSJtYW51YWwuaHRtbCNvcHRpb25fZml4ZWRHdXR0ZXIiPjxjb2RlPmZpeGVkR3V0dGVyPC9jb2RlPjwvYT4gb3B0aW9uLjwvbGk+CiAgICA8bGk+RnVsbCA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9Db2RlTWlycm9yL2NvbXBhcmUvdjMuMC4uLnYzLjAxIj5saXN0IG9mIHBhdGNoZXM8L2E+LjwvbGk+CiAgPC91bD4KCiAgPHAgY2xhc3M9InJlbCI+MTAtMTItMjAxMjogPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2NvZGVtaXJyb3ItMy4wLnppcCI+VmVyc2lvbiAzLjA8L2E+OjwvcD4KCiAgPHAgY2xhc3M9InJlbC1ub3RlIj48c3Ryb25nPk5ldyBtYWpvciB2ZXJzaW9uPC9zdHJvbmc+LiBPbmx5CiAgcGFydGlhbGx5IGJhY2t3YXJkcy1jb21wYXRpYmxlLiBTZWUKICB0aGUgPGEgaHJlZj0idXBncmFkZV92My5odG1sIj51cGdyYWRpbmcgZ3VpZGU8L2E+IGZvciBtb3JlCiAgaW5mb3JtYXRpb24uIENoYW5nZXMgc2luY2UgcmVsZWFzZSBjYW5kaWRhdGUgMjo8L3A+CgogIDx1bCBjbGFzcz0icmVsLW5vdGUiPgogICAgPGxpPlJld3JpdHRlbiBWSU0gbW9kZS48L2xpPgogICAgPGxpPkZpeCBhIGZldyBtaW5vciBzY3JvbGxpbmcgYW5kIHNpemluZyBpc3N1ZXMuPC9saT4KICAgIDxsaT5Xb3JrIGFyb3VuZCBTYWZhcmkgc2VnZmF1bHQgd2hlbiBkcmFnZ2luZy48L2xpPgogICAgPGxpPkZ1bGwgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvQ29kZU1pcnJvci9jb21wYXJlL3YzLjByYzIuLi52My4wIj5saXN0IG9mIHBhdGNoZXM8L2E+LjwvbGk+CiAgPC91bD4KCiAgPHAgY2xhc3M9InJlbCI+MjAtMTEtMjAxMjogPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2NvZGVtaXJyb3ItMy4wcmMyLnppcCI+VmVyc2lvbiAzLjAsIHJlbGVhc2UgY2FuZGlkYXRlIDI8L2E+OjwvcD4KCiAgPHVsIGNsYXNzPSJyZWwtbm90ZSI+CiAgICA8bGk+TmV3IG1vZGU6IDxhIGhyZWY9Ii4uL21vZGUvaHR0cC9pbmRleC5odG1sIj5IVFRQPC9hPi48L2xpPgogICAgPGxpPkltcHJvdmVkIGhhbmRsaW5nIG9mIHNlbGVjdGlvbiBhbmNob3IgcG9zaXRpb24uPC9saT4KICAgIDxsaT5JbXByb3ZlIElFIHBlcmZvcm1hbmNlIG9uIGxvbmdlciBsaW5lcy48L2xpPgogICAgPGxpPlJlZHVjZSBndXR0ZXIgZ2xpdGNoZXMgZHVyaW5nIGhvcml6LiBzY3JvbGxpbmcuPC9saT4KICAgIDxsaT5BZGQgPGEgaHJlZj0ibWFudWFsLmh0bWwjYWRkS2V5TWFwIj48Y29kZT5hZGRLZXlNYXA8L2NvZGU+PC9hPiBhbmQgPGEgaHJlZj0ibWFudWFsLmh0bWwjcmVtb3ZlS2V5TWFwIj48Y29kZT5yZW1vdmVLZXlNYXA8L2NvZGU+PC9hPiBtZXRob2RzLjwvbGk+CiAgICA8bGk+UmV3cml0ZSA8Y29kZT5mb3JtYXR0aW5nPC9jb2RlPiBhbmQgPGNvZGU+Y2xvc2V0YWc8L2NvZGU+IGFkZC1vbnMuPC9saT4KICAgIDxsaT5GdWxsIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL0NvZGVNaXJyb3IvY29tcGFyZS92My4wcmMxLi4udjMuMHJjMiI+bGlzdCBvZiBwYXRjaGVzPC9hPi48L2xpPgogIDwvdWw+CgogIDxwIGNsYXNzPSJyZWwiPjIwLTExLTIwMTI6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTMuMHJjMS56aXAiPlZlcnNpb24gMy4wLCByZWxlYXNlIGNhbmRpZGF0ZSAxPC9hPjo8L3A+CgogIDx1bCBjbGFzcz0icmVsLW5vdGUiPgogICAgPGxpPk5ldyB0aGVtZTogPGEgaHJlZj0iLi4vZGVtby90aGVtZS5odG1sI3NvbGFyaXplZCUyMGxpZ2h0Ij5Tb2xhcml6ZWQ8L2E+LjwvbGk+CiAgICA8bGk+SW50cm9kdWNlIDxhIGhyZWY9Im1hbnVhbC5odG1sI2FkZExpbmVDbGFzcyI+PGNvZGU+YWRkTGluZUNsYXNzPC9jb2RlPjwvYT4KICAgIGFuZCA8YSBocmVmPSJtYW51YWwuaHRtbCNyZW1vdmVMaW5lQ2xhc3MiPjxjb2RlPnJlbW92ZUxpbmVDbGFzczwvY29kZT48L2E+LAogICAgZHJvcCA8Y29kZT5zZXRMaW5lQ2xhc3M8L2NvZGU+LjwvbGk+CiAgICA8bGk+QWRkIGEgPGVtPmxvdDwvZW0+IG9mCiAgICBuZXcgPGEgaHJlZj0ibWFudWFsLmh0bWwjbWFya1RleHQiPm9wdGlvbnMgZm9yIG1hcmtlZCB0ZXh0PC9hPgogICAgKHJlYWQtb25seSwgYXRvbWljLCBjb2xsYXBzZWQsIHdpZGdldCByZXBsYWNlbWVudCkuPC9saT4KICAgIDxsaT5SZW1vdmUgdGhlIG9sZCBjb2RlIGZvbGRpbmcgaW50ZXJmYWNlIGluIGZhdm91ciBvZiB0aGVzZSBuZXcgcmFuZ2VzLjwvbGk+CiAgICA8bGk+QWRkIDxhIGhyZWY9Im1hbnVhbC5odG1sI2lzQ2xlYW4iPjxjb2RlPmlzQ2xlYW48L2NvZGU+PC9hPi88YSBocmVmPSJtYW51YWwuaHRtbCNtYXJrQ2xlYW4iPjxjb2RlPm1hcmtDbGVhbjwvY29kZT48L2E+IG1ldGhvZHMuPC9saT4KICAgIDxsaT5SZW1vdmUgPGNvZGU+Y29tcG91bmRDaGFuZ2U8L2NvZGU+IG1ldGhvZCwgdXNlIGJldHRlciB1bmRvLWV2ZW50LWNvbWJpbmluZyBoZXVyaXN0aWMuPC9saT4KICAgIDxsaT5JbXByb3ZlIHNjcm9sbGluZyBwZXJmb3JtYW5jZSBzbW9vdGhuZXNzLjwvbGk+CiAgICA8bGk+RnVsbCA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9Db2RlTWlycm9yL2NvbXBhcmUvdjMuMGJldGEyLi4udjMuMHJjMSI+bGlzdCBvZiBwYXRjaGVzPC9hPi48L2xpPgogIDwvdWw+CgogIDxwIGNsYXNzPSJyZWwiPjIyLTEwLTIwMTI6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTMuMGJldGEyLnppcCI+VmVyc2lvbiAzLjAsIGJldGEgMjwvYT46PC9wPgoKICA8dWwgY2xhc3M9InJlbC1ub3RlIj4KICAgIDxsaT5GaXggcGFnZS1iYXNlZCBjb29yZGluYXRlIGNvbXB1dGF0aW9uLjwvbGk+CiAgICA8bGk+Rml4IGZpcmluZyBvZiA8YSBocmVmPSJtYW51YWwuaHRtbCNldmVudF9ndXR0ZXJDbGljayI+PGNvZGU+Z3V0dGVyQ2xpY2s8L2NvZGU+PC9hPiBldmVudC48L2xpPgogICAgPGxpPkFkZCA8YSBocmVmPSJtYW51YWwuaHRtbCNvcHRpb25fY3Vyc29ySGVpZ2h0Ij48Y29kZT5jdXJzb3JIZWlnaHQ8L2NvZGU+PC9hPiBvcHRpb24uPC9saT4KICAgIDxsaT5GaXggYmktZGlyZWN0aW9uYWwgdGV4dCByZWdyZXNzaW9uLjwvbGk+CiAgICA8bGk+QWRkIDxhIGhyZWY9Im1hbnVhbC5odG1sI29wdGlvbl92aWV3cG9ydE1hcmdpbiI+PGNvZGU+dmlld3BvcnRNYXJnaW48L2NvZGU+PC9hPiBvcHRpb24uPC9saT4KICAgIDxsaT5EaXJlY3RseSBoYW5kbGUgbW91c2V3aGVlbCBldmVudHMgKGFnYWluLCBob3BlZnVsbHkgYmV0dGVyKS48L2xpPgogICAgPGxpPk1ha2UgdmVydGljYWwgY3Vyc29yIG1vdmVtZW50IG1vcmUgcm9idXN0ICh0aHJvdWdoIHdpZGdldHMsIGJpZyBsaW5lIGdhcHMpLjwvbGk+CiAgICA8bGk+QWRkIDxhIGhyZWY9Im1hbnVhbC5odG1sI29wdGlvbl9mbGF0dGVuU3BhbnMiPjxjb2RlPmZsYXR0ZW5TcGFuczwvY29kZT48L2E+IG9wdGlvbi48L2xpPgogICAgPGxpPk1hbnkgb3B0aW1pemF0aW9ucy4gUG9vciByZXNwb25zaXZlbmVzcyBzaG91bGQgYmUgZml4ZWQuPC9saT4KICAgIDxsaT5Jbml0aWFsaXphdGlvbiBpbiBoaWRkZW4gc3RhdGUgd29ya3MgYWdhaW4uPC9saT4KICAgIDxsaT5GdWxsIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL0NvZGVNaXJyb3IvY29tcGFyZS92My4wYmV0YTEuLi52My4wYmV0YTIiPmxpc3Qgb2YgcGF0Y2hlczwvYT4uPC9saT4KICA8L3VsPgoKICA8cCBjbGFzcz0icmVsIj4xOS0wOS0yMDEyOiA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvY29kZW1pcnJvci0zLjBiZXRhMS56aXAiPlZlcnNpb24gMy4wLCBiZXRhIDE8L2E+OjwvcD4KCiAgPHVsIGNsYXNzPSJyZWwtbm90ZSI+CiAgICA8bGk+QmktZGlyZWN0aW9uYWwgdGV4dCBzdXBwb3J0LjwvbGk+CiAgICA8bGk+TW9yZSBwb3dlcmZ1bCBndXR0ZXIgbW9kZWwuPC9saT4KICAgIDxsaT5TdXBwb3J0IGZvciBhcmJpdHJhcnkgdGV4dC93aWRnZXQgaGVpZ2h0LjwvbGk+CiAgICA8bGk+SW4tbGluZSB3aWRnZXRzLjwvbGk+CiAgICA8bGk+R2VuZXJhbGl6ZWQgZXZlbnQgaGFuZGxpbmcuPC9saT4KICA8L3VsPgoKPC9zZWN0aW9uPgoKPHNlY3Rpb24gaWQ9djI+CgogIDxoMj5WZXJzaW9uIDIueDwvaDI+CgogIDxwIGNsYXNzPSJyZWwiPjIxLTAxLTIwMTM6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTIuMzguemlwIj5WZXJzaW9uIDIuMzg8L2E+OjwvcD4KCiAgPHAgY2xhc3M9InJlbC1ub3RlIj5JbnRlZ3JhdGUgc29tZSBidWdmaXhlcywgZW5oYW5jZW1lbnRzIHRvIHRoZSB2aW0ga2V5bWFwLCBhbmQgbmV3CiAgbW9kZXMKICAoPGEgaHJlZj0iLi4vbW9kZS9kL2luZGV4Lmh0bWwiPkQ8L2E+LCA8YSBocmVmPSIuLi9tb2RlL3Nhc3MvaW5kZXguaHRtbCI+U2FzczwvYT4sIDxhIGhyZWY9Ii4uL21vZGUvYXBsL2luZGV4Lmh0bWwiPkFQTDwvYT4pCiAgZnJvbSB0aGUgdjMgYnJhbmNoLjwvcD4KCiAgPHAgY2xhc3M9InJlbCI+MjAtMTItMjAxMjogPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2NvZGVtaXJyb3ItMi4zNy56aXAiPlZlcnNpb24gMi4zNzwvYT46PC9wPgoKICA8dWwgY2xhc3M9InJlbC1ub3RlIj4KICAgIDxsaT5OZXcgbW9kZTogPGEgaHJlZj0iLi4vbW9kZS9zcWwvaW5kZXguaHRtbCI+U1FMPC9hPiAod2lsbCByZXBsYWNlIDxhIGhyZWY9Ii4uL21vZGUvcGxzcWwvaW5kZXguaHRtbCI+cGxzcWw8L2E+IGFuZCA8YSBocmVmPSIuLi9tb2RlL215c3FsL2luZGV4Lmh0bWwiPm15c3FsPC9hPiBtb2RlcykuPC9saT4KICAgIDxsaT5GdXJ0aGVyIHdvcmsgb24gdGhlIG5ldyBWSU0gbW9kZS48L2xpPgogICAgPGxpPkZpeCBDbWQvQ3RybCBrZXlzIG9uIHJlY2VudCBPcGVyYXMgb24gT1MgWC48L2xpPgogICAgPGxpPkZ1bGwgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvQ29kZU1pcnJvci9jb21wYXJlL3YyLjM2Li4udjIuMzciPmxpc3Qgb2YgcGF0Y2hlczwvYT4uPC9saT4KICA8L3VsPgoKICA8cCBjbGFzcz0icmVsIj4yMC0xMS0yMDEyOiA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvY29kZW1pcnJvci0yLjM2LnppcCI+VmVyc2lvbiAyLjM2PC9hPjo8L3A+CgogIDx1bCBjbGFzcz0icmVsLW5vdGUiPgogICAgPGxpPk5ldyBtb2RlOiA8YSBocmVmPSIuLi9tb2RlL3o4MC9pbmRleC5odG1sIj5aODAgYXNzZW1ibHk8L2E+LjwvbGk+CiAgICA8bGk+TmV3IHRoZW1lOiA8YSBocmVmPSIuLi9kZW1vL3RoZW1lLmh0bWwjdHdpbGlnaHQiPlR3aWxpZ2h0PC9hPi48L2xpPgogICAgPGxpPkFkZCBjb21tYW5kLWxpbmUgY29tcHJlc3Npb24gaGVscGVyLjwvbGk+CiAgICA8bGk+TWFrZSA8YSBocmVmPSJtYW51YWwuaHRtbCNzY3JvbGxJbnRvVmlldyI+PGNvZGU+c2Nyb2xsSW50b1ZpZXc8L2NvZGU+PC9hPiBwdWJsaWMuPC9saT4KICAgIDxsaT5BZGQgPGEgaHJlZj0ibWFudWFsLmh0bWwjZGVmYXVsdFRleHRIZWlnaHQiPjxjb2RlPmRlZmF1bHRUZXh0SGVpZ2h0PC9jb2RlPjwvYT4gbWV0aG9kLjwvbGk+CiAgICA8bGk+VmFyaW91cyBleHRlbnNpb25zIHRvIHRoZSB2aW0ga2V5bWFwLjwvbGk+CiAgICA8bGk+TWFrZSA8YSBocmVmPSIuLi9tb2RlL3BocC9pbmRleC5odG1sIj5QSFAgbW9kZTwvYT4gYnVpbGQgb24gPGEgaHJlZj0iLi4vbW9kZS9odG1sbWl4ZWQvaW5kZXguaHRtbCI+bWl4ZWQgSFRNTCBtb2RlPC9hPi48L2xpPgogICAgPGxpPkFkZCA8YSBocmVmPSJtYW51YWwuaHRtbCNhZGRvbl9jb250aW51ZWNvbW1lbnQiPmNvbW1lbnQtY29udGludWluZzwvYT4gYWRkLW9uLjwvbGk+CiAgICA8bGk+RnVsbCA8YSBocmVmPSIuLi9odHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9Db2RlTWlycm9yL2NvbXBhcmUvdjIuMzUuLi52Mi4zNiI+bGlzdCBvZiBwYXRjaGVzPC9hPi48L2xpPgogIDwvdWw+CgogIDxwIGNsYXNzPSJyZWwiPjIyLTEwLTIwMTI6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTIuMzUuemlwIj5WZXJzaW9uIDIuMzU8L2E+OjwvcD4KCiAgPHVsIGNsYXNzPSJyZWwtbm90ZSI+CiAgICA8bGk+TmV3IChzdWIpIG1vZGU6IDxhIGhyZWY9Ii4uL21vZGUvamF2YXNjcmlwdC90eXBlc2NyaXB0Lmh0bWwiPlR5cGVTY3JpcHQ8L2E+LjwvbGk+CiAgICA8bGk+RG9uJ3Qgb3ZlcndyaXRlIChpbnNlcnQga2V5KSB3aGVuIHBhc3RpbmcuPC9saT4KICAgIDxsaT5GaXggc2V2ZXJhbCBidWdzIGluIDxhIGhyZWY9Im1hbnVhbC5odG1sI21hcmtUZXh0Ij48Y29kZT5tYXJrVGV4dDwvY29kZT48L2E+L3VuZG8gaW50ZXJhY3Rpb24uPC9saT4KICAgIDxsaT5CZXR0ZXIgaW5kZW50YXRpb24gb2YgSmF2YVNjcmlwdCBjb2RlIHdpdGhvdXQgc2VtaWNvbG9ucy48L2xpPgogICAgPGxpPkFkZCA8YSBocmVmPSJtYW51YWwuaHRtbCNkZWZpbmVJbml0SG9vayI+PGNvZGU+ZGVmaW5lSW5pdEhvb2s8L2NvZGU+PC9hPiBmdW5jdGlvbi48L2xpPgogICAgPGxpPkZ1bGwgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvQ29kZU1pcnJvci9jb21wYXJlL3YyLjM0Li4udjIuMzUiPmxpc3Qgb2YgcGF0Y2hlczwvYT4uPC9saT4KICA8L3VsPgoKICA8cCBjbGFzcz0icmVsIj4xOS0wOS0yMDEyOiA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvY29kZW1pcnJvci0yLjM0LnppcCI+VmVyc2lvbiAyLjM0PC9hPjo8L3A+CgogIDx1bCBjbGFzcz0icmVsLW5vdGUiPgogICAgPGxpPk5ldyBtb2RlOiA8YSBocmVmPSIuLi9tb2RlL2NvbW1vbmxpc3AvaW5kZXguaHRtbCI+Q29tbW9uIExpc3A8L2E+LjwvbGk+CiAgICA8bGk+Rml4IHJpZ2h0LWNsaWNrIHNlbGVjdC1hbGwgb24gbW9zdCBicm93c2Vycy48L2xpPgogICAgPGxpPkNoYW5nZSB0aGUgd2F5IGhpZ2hsaWdodGluZyBoYXBwZW5zOjxicj4mbmJzcDsgU2F2ZXMgbWVtb3J5IGFuZCBDUFUgY3ljbGVzLjxicj4mbmJzcDsgPGNvZGU+Y29tcGFyZVN0YXRlczwvY29kZT4gaXMgbm8gbG9uZ2VyIG5lZWRlZC48YnI+Jm5ic3A7IDxjb2RlPm9uSGlnaGxpZ2h0Q29tcGxldGU8L2NvZGU+IG5vIGxvbmdlciB3b3Jrcy48L2xpPgogICAgPGxpPkludGVncmF0ZSBtb2RlIChNYXJrZG93biwgWFF1ZXJ5LCBDU1MsIHNUZXgpIHRlc3RzIGluIGNlbnRyYWwgdGVzdHN1aXRlLjwvbGk+CiAgICA8bGk+QWRkIGEgPGEgaHJlZj0ibWFudWFsLmh0bWwjdmVyc2lvbiI+PGNvZGU+Q29kZU1pcnJvci52ZXJzaW9uPC9jb2RlPjwvYT4gcHJvcGVydHkuPC9saT4KICAgIDxsaT5Nb3JlIHJvYnVzdCBoYW5kbGluZyBvZiBuZXN0ZWQgbW9kZXMgaW4gPGEgaHJlZj0iLi4vZGVtby9mb3JtYXR0aW5nLmh0bWwiPmZvcm1hdHRpbmc8L2E+IGFuZCA8YSBocmVmPSIuLi9kZW1vL2Nsb3NldGFnLmh0bWwiPmNsb3NldGFnPC9hPiBwbHVnLWlucy48L2xpPgogICAgPGxpPlVuL3JlZG8gbm93IHByZXNlcnZlcyA8YSBocmVmPSJtYW51YWwuaHRtbCNtYXJrVGV4dCI+bWFya2VkIHRleHQ8L2E+IGFuZCBib29rbWFya3MuPC9saT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9Db2RlTWlycm9yL2NvbXBhcmUvdjIuMzMuLi52Mi4zNCI+RnVsbCBsaXN0PC9hPiBvZiBwYXRjaGVzLjwvbGk+CiAgPC91bD4KCiAgPHAgY2xhc3M9InJlbCI+MjMtMDgtMjAxMjogPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2NvZGVtaXJyb3ItMi4zMy56aXAiPlZlcnNpb24gMi4zMzwvYT46PC9wPgoKICA8dWwgY2xhc3M9InJlbC1ub3RlIj4KICAgIDxsaT5OZXcgbW9kZTogPGEgaHJlZj0iLi4vbW9kZS9zaWV2ZS9pbmRleC5odG1sIj5TaWV2ZTwvYT4uPC9saT4KICAgIDxsaT5OZXcgPGEgaHJlZj0ibWFudWFsLmh0bWwjZ2V0Vmlld3BvcnQiPjxjb2RlPmdldFZpZXdQb3J0PC9jb2RlPjwvYT4gYW5kIDxhIGhyZWY9Im1hbnVhbC5odG1sI29wdGlvbl9vblZpZXdwb3J0Q2hhbmdlIj48Y29kZT5vblZpZXdwb3J0Q2hhbmdlPC9jb2RlPjwvYT4gQVBJLjwvbGk+CiAgICA8bGk+PGEgaHJlZj0ibWFudWFsLmh0bWwjb3B0aW9uX2N1cnNvckJsaW5rUmF0ZSI+Q29uZmlndXJhYmxlPC9hPiBjdXJzb3IgYmxpbmsgcmF0ZS48L2xpPgogICAgPGxpPk1ha2UgYmluZGluZyBhIGtleSB0byA8Y29kZT5mYWxzZTwvY29kZT4gZGlzYWJsaW5nIGhhbmRsaW5nIChhZ2FpbikuPC9saT4KICAgIDxsaT5TaG93IG5vbi1wcmludGluZyBjaGFyYWN0ZXJzIGFzIHJlZCBkb3RzLjwvbGk+CiAgICA8bGk+TW9yZSB0d2Vha3MgdG8gdGhlIHNjcm9sbGluZyBtb2RlbC48L2xpPgogICAgPGxpPkV4cGFuZGVkIHRlc3RzdWl0ZS4gQmFzaWMgbGludGVyIGFkZGVkLjwvbGk+CiAgICA8bGk+UmVtb3ZlIG1vc3QgdXNlcyBvZiA8Y29kZT5pbm5lckhUTUw8L2NvZGU+LiBSZW1vdmUgPGNvZGU+Q29kZU1pcnJvci5odG1sRXNjYXBlPC9jb2RlPi48L2xpPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL0NvZGVNaXJyb3IvY29tcGFyZS92Mi4zMi4uLnYyLjMzIj5GdWxsIGxpc3Q8L2E+IG9mIHBhdGNoZXMuPC9saT4KICA8L3VsPgoKICA8cCBjbGFzcz0icmVsIj4yMy0wNy0yMDEyOiA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvY29kZW1pcnJvci0yLjMyLnppcCI+VmVyc2lvbiAyLjMyPC9hPjo8L3A+CgogIDxwIGNsYXNzPSJyZWwtbm90ZSI+RW1lcmdlbmN5IGZpeCBmb3IgYSBidWcgd2hlcmUgYW4gZWRpdG9yIHdpdGgKICBsaW5lIHdyYXBwaW5nIG9uIElFIHdpbGwgYnJlYWsgd2hlbiB0aGVyZSBpcyA8ZW0+bm88L2VtPgogIHNjcm9sbGJhci48L3A+CgogIDxwIGNsYXNzPSJyZWwiPjIwLTA3LTIwMTI6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTIuMzEuemlwIj5WZXJzaW9uIDIuMzE8L2E+OjwvcD4KCiAgPHVsIGNsYXNzPSJyZWwtbm90ZSI+CiAgICA8bGk+TmV3IG1vZGVzOiA8YSBocmVmPSIuLi9tb2RlL29jYW1sL2luZGV4Lmh0bWwiPk9DYW1sPC9hPiwgPGEgaHJlZj0iLi4vbW9kZS9oYXhlL2luZGV4Lmh0bWwiPkhheGU8L2E+LCBhbmQgPGEgaHJlZj0iLi4vbW9kZS92Yi9pbmRleC5odG1sIj5WQi5ORVQ8L2E+LjwvbGk+CiAgICA8bGk+U2V2ZXJhbCBmaXhlcyB0byB0aGUgbmV3IHNjcm9sbGluZyBtb2RlbC48L2xpPgogICAgPGxpPkFkZCBhIDxhIGhyZWY9Im1hbnVhbC5odG1sI3NldFNpemUiPjxjb2RlPnNldFNpemU8L2NvZGU+PC9hPiBtZXRob2QgZm9yIHByb2dyYW1tYXRpYyByZXNpemluZy48L2xpPgogICAgPGxpPkFkZCA8YSBocmVmPSJtYW51YWwuaHRtbCNnZXRIaXN0b3J5Ij48Y29kZT5nZXRIaXN0b3J5PC9jb2RlPjwvYT4gYW5kIDxhIGhyZWY9Im1hbnVhbC5odG1sI3NldEhpc3RvcnkiPjxjb2RlPnNldEhpc3Rvcnk8L2NvZGU+PC9hPiBtZXRob2RzLjwvbGk+CiAgICA8bGk+QWxsb3cgY3VzdG9tIGxpbmUgc2VwYXJhdG9yIHN0cmluZyBpbiA8YSBocmVmPSJtYW51YWwuaHRtbCNnZXRWYWx1ZSI+PGNvZGU+Z2V0VmFsdWU8L2NvZGU+PC9hPiBhbmQgPGEgaHJlZj0ibWFudWFsLmh0bWwjZ2V0UmFuZ2UiPjxjb2RlPmdldFJhbmdlPC9jb2RlPjwvYT4uPC9saT4KICAgIDxsaT5TdXBwb3J0IGRvdWJsZS0gYW5kIHRyaXBsZS1jbGljayBkcmFnLCBkb3VibGUtY2xpY2tpbmcgd2hpdGVzcGFjZS48L2xpPgogICAgPGxpPkFuZCBtb3JlLi4uIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL0NvZGVNaXJyb3IvY29tcGFyZS92Mi4zLi4udjIuMzEiPihhbGwgcGF0Y2hlcyk8L2E+PC9saT4KICA8L3VsPgoKICA8cCBjbGFzcz0icmVsIj4yMi0wNi0yMDEyOiA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvY29kZW1pcnJvci0yLjMuemlwIj5WZXJzaW9uIDIuMzwvYT46PC9wPgoKICA8dWwgY2xhc3M9InJlbC1ub3RlIj4KICAgIDxsaT48c3Ryb25nPk5ldyBzY3JvbGxiYXIgaW1wbGVtZW50YXRpb248L3N0cm9uZz4uIFNob3VsZCBmbGlja2VyIGxlc3MuIENoYW5nZXMgRE9NIHN0cnVjdHVyZSBvZiB0aGUgZWRpdG9yLjwvbGk+CiAgICA8bGk+TmV3IHRoZW1lOiA8YSBocmVmPSIuLi9kZW1vL3RoZW1lLmh0bWwjdmlicmFudC1pbmsiPnZpYnJhbnQtaW5rPC9hPi48L2xpPgogICAgPGxpPk1hbnkgZXh0ZW5zaW9ucyB0byB0aGUgVklNIGtleW1hcCAoaW5jbHVkaW5nIHRleHQgb2JqZWN0cykuPC9saT4KICAgIDxsaT5BZGQgPGEgaHJlZj0iLi4vZGVtby9tdWx0aXBsZXguaHRtbCI+bW9kZS1tdWx0aXBsZXhpbmc8L2E+IHV0aWxpdHkgc2NyaXB0LjwvbGk+CiAgICA8bGk+Rml4IGJ1ZyB3aGVyZSByaWdodC1jbGljayBwYXN0ZSB3b3JrcyBpbiByZWFkLW9ubHkgbW9kZS48L2xpPgogICAgPGxpPkFkZCBhIDxhIGhyZWY9Im1hbnVhbC5odG1sI2dldFNjcm9sbEluZm8iPjxjb2RlPmdldFNjcm9sbEluZm88L2NvZGU+PC9hPiBtZXRob2QuPC9saT4KICAgIDxsaT5Mb3RzIG9mIG90aGVyIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL0NvZGVNaXJyb3IvY29tcGFyZS92Mi4yNS4uLnYyLjMiPmZpeGVzPC9hPi48L2xpPgogIDwvdWw+CgogIDxwIGNsYXNzPSJyZWwiPjIzLTA1LTIwMTI6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTIuMjUuemlwIj5WZXJzaW9uIDIuMjU8L2E+OjwvcD4KCiAgPHVsIGNsYXNzPSJyZWwtbm90ZSI+CiAgICA8bGk+TmV3IG1vZGU6IDxhIGhyZWY9Ii4uL21vZGUvZXJsYW5nL2luZGV4Lmh0bWwiPkVybGFuZzwvYT4uPC9saT4KICAgIDxsaT48c3Ryb25nPlJlbW92ZSB4bWxwdXJlIG1vZGU8L3N0cm9uZz4gKHVzZSA8YSBocmVmPSIuLi9tb2RlL3htbC9pbmRleC5odG1sIj54bWwuanM8L2E+KS48L2xpPgogICAgPGxpPkZpeCBsaW5lLXdyYXBwaW5nIGluIE9wZXJhLjwvbGk+CiAgICA8bGk+Rml4IFggV2luZG93cyBtaWRkbGUtY2xpY2sgcGFzdGUgaW4gQ2hyb21lLjwvbGk+CiAgICA8bGk+Rml4IGJ1ZyB0aGF0IGJyb2tlIHBhc3Rpbmcgb2YgaHVnZSBkb2N1bWVudHMuPC9saT4KICAgIDxsaT5GaXggYmFja3NwYWNlIGFuZCB0YWIga2V5IHJlcGVhdCBpbiBPcGVyYS48L2xpPgogIDwvdWw+CgogIDxwIGNsYXNzPSJyZWwiPjIzLTA0LTIwMTI6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTIuMjQuemlwIj5WZXJzaW9uIDIuMjQ8L2E+OjwvcD4KCiAgPHVsIGNsYXNzPSJyZWwtbm90ZSI+CiAgICA8bGk+PHN0cm9uZz5Ecm9wIHN1cHBvcnQgZm9yIEludGVybmV0IEV4cGxvcmVyIDY8L3N0cm9uZz4uPC9saT4KICAgIDxsaT5OZXcKICAgIG1vZGVzOiA8YSBocmVmPSIuLi9tb2RlL3NoZWxsL2luZGV4Lmh0bWwiPlNoZWxsPC9hPiwgPGEgaHJlZj0iLi4vbW9kZS90aWtpL2luZGV4Lmh0bWwiPlRpa2kKICAgIHdpa2k8L2E+LCA8YSBocmVmPSIuLi9tb2RlL3BpZy9pbmRleC5odG1sIj5QaWcgTGF0aW48L2E+LjwvbGk+CiAgICA8bGk+TmV3IHRoZW1lczogPGEgaHJlZj0iLi4vZGVtby90aGVtZS5odG1sI2FtYmlhbmNlIj5BbWJpYW5jZTwvYT4sIDxhIGhyZWY9Ii4uL2RlbW8vdGhlbWUuaHRtbCNibGFja2JvYXJkIj5CbGFja2JvYXJkPC9hPi48L2xpPgogICAgPGxpPk1vcmUgY29udHJvbCBvdmVyIGRyYWcvZHJvcAogICAgd2l0aCA8YSBocmVmPSJtYW51YWwuaHRtbCNvcHRpb25fZHJhZ0Ryb3AiPjxjb2RlPmRyYWdEcm9wPC9jb2RlPjwvYT4KICAgIGFuZCA8YSBocmVmPSJtYW51YWwuaHRtbCNvcHRpb25fb25EcmFnRXZlbnQiPjxjb2RlPm9uRHJhZ0V2ZW50PC9jb2RlPjwvYT4KICAgIG9wdGlvbnMuPC9saT4KICAgIDxsaT5NYWtlIEhUTUwgbW9kZSBhIGJpdCBsZXNzIHBlZGFudGljLjwvbGk+CiAgICA8bGk+QWRkIDxhIGhyZWY9Im1hbnVhbC5odG1sI2NvbXBvdW5kQ2hhbmdlIj48Y29kZT5jb21wb3VuZENoYW5nZTwvY29kZT48L2E+IEFQSSBtZXRob2QuPC9saT4KICAgIDxsaT5TZXZlcmFsIGZpeGVzIGluIHVuZG8gaGlzdG9yeSBhbmQgbGluZSBoaWRpbmcuPC9saT4KICAgIDxsaT5SZW1vdmUgKGJyb2tlbikgc3VwcG9ydCBmb3IgPGNvZGU+Y2F0Y2hhbGw8L2NvZGU+IGluIGtleSBtYXBzLAogICAgYWRkIDxjb2RlPm5vZmFsbHRocm91Z2g8L2NvZGU+IGJvb2xlYW4gZmllbGQgaW5zdGVhZC48L2xpPgogIDwvdWw+CgogIDxwIGNsYXNzPSJyZWwiPjI2LTAzLTIwMTI6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTIuMjMuemlwIj5WZXJzaW9uIDIuMjM8L2E+OjwvcD4KCiAgPHVsIGNsYXNzPSJyZWwtbm90ZSI+CiAgICA8bGk+Q2hhbmdlIDxzdHJvbmc+ZGVmYXVsdCBiaW5kaW5nIGZvciB0YWI8L3N0cm9uZz4gPGEgaHJlZj0iamF2YXNjcmlwdDp2b2lkKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0YWJiaW5kaW5nJykuc3R5bGUuZGlzcGxheT0nJykiPlttb3JlXTwvYT4KICAgICAgPGRpdiBzdHlsZT0iZGlzcGxheTogbm9uZSIgaWQ9dGFiYmluZGluZz4KICAgICAgICBTdGFydGluZyBpbiAyLjIzLCB0aGVzZSBiaW5kaW5ncyBhcmUgZGVmYXVsdDoKICAgICAgICA8dWw+PGxpPlRhYjogSW5zZXJ0IHRhYiBjaGFyYWN0ZXI8L2xpPgogICAgICAgICAgPGxpPlNoaWZ0LXRhYjogUmVzZXQgbGluZSBpbmRlbnRhdGlvbiB0byBkZWZhdWx0PC9saT4KICAgICAgICAgIDxsaT5DdHJsL0NtZC1bOiBSZWR1Y2UgbGluZSBpbmRlbnRhdGlvbiAob2xkIHRhYiBiZWhhdmlvdXIpPC9saT4KICAgICAgICAgIDxsaT5DdHJsL0NtZC1dOiBJbmNyZWFzZSBsaW5lIGluZGVudGF0aW9uIChvbGQgc2hpZnQtdGFiIGJlaGF2aW91cik8L2xpPgogICAgICAgIDwvdWw+CiAgICAgIDwvZGl2PgogICAgPC9saT4KICAgIDxsaT5OZXcgbW9kZXM6IDxhIGhyZWY9Ii4uL21vZGUveHF1ZXJ5L2luZGV4Lmh0bWwiPlhRdWVyeTwvYT4gYW5kIDxhIGhyZWY9Ii4uL21vZGUvdmJzY3JpcHQvaW5kZXguaHRtbCI+VkJTY3JpcHQ8L2E+LjwvbGk+CiAgICA8bGk+VHdvIG5ldyB0aGVtZXM6IDxhIGhyZWY9Ii4uL21vZGUvbGVzcy9pbmRleC5odG1sIj5sZXNzZXItZGFyazwvYT4gYW5kIDxhIGhyZWY9Ii4uL21vZGUveHF1ZXJ5L2luZGV4Lmh0bWwiPnhxLWRhcms8L2E+LjwvbGk+CiAgICA8bGk+RGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGJhY2tncm91bmQgYW5kIHRleHQgc3R5bGVzIGluIDxhIGhyZWY9Im1hbnVhbC5odG1sI3NldExpbmVDbGFzcyI+PGNvZGU+c2V0TGluZUNsYXNzPC9jb2RlPjwvYT4uPC9saT4KICAgIDxsaT5GaXggZHJhZy1hbmQtZHJvcCBpbiBJRTkrLjwvbGk+CiAgICA8bGk+RXh0ZW5kIDxhIGhyZWY9Im1hbnVhbC5odG1sI2NoYXJDb29yZHMiPjxjb2RlPmNoYXJDb29yZHM8L2NvZGU+PC9hPgogICAgYW5kIDxhIGhyZWY9Im1hbnVhbC5odG1sI2N1cnNvckNvb3JkcyI+PGNvZGU+Y3Vyc29yQ29vcmRzPC9jb2RlPjwvYT4gd2l0aCBhIDxjb2RlPm1vZGU8L2NvZGU+IGFyZ3VtZW50LjwvbGk+CiAgICA8bGk+QWRkIDxhIGhyZWY9Im1hbnVhbC5odG1sI29wdGlvbl9hdXRvZm9jdXMiPjxjb2RlPmF1dG9mb2N1czwvY29kZT48L2E+IG9wdGlvbi48L2xpPgogICAgPGxpPkFkZCA8YSBocmVmPSJtYW51YWwuaHRtbCNmaW5kTWFya3NBdCI+PGNvZGU+ZmluZE1hcmtzQXQ8L2NvZGU+PC9hPiBtZXRob2QuPC9saT4KICA8L3VsPgoKICA8cCBjbGFzcz0icmVsIj4yNy0wMi0yMDEyOiA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvY29kZW1pcnJvci0yLjIyLnppcCI+VmVyc2lvbiAyLjIyPC9hPjo8L3A+CgogIDx1bCBjbGFzcz0icmVsLW5vdGUiPgogICAgPGxpPkFsbG93IDxhIGhyZWY9Im1hbnVhbC5odG1sI2tleW1hcHMiPmtleSBoYW5kbGVyczwvYT4gdG8gcGFzcyB1cCBldmVudHMsIGFsbG93IGJpbmRpbmcgY2hhcmFjdGVycy48L2xpPgogICAgPGxpPkFkZCA8YSBocmVmPSJtYW51YWwuaHRtbCNvcHRpb25fYXV0b0NsZWFyRW1wdHlMaW5lcyI+PGNvZGU+YXV0b0NsZWFyRW1wdHlMaW5lczwvY29kZT48L2E+IG9wdGlvbi48L2xpPgogICAgPGxpPlByb3Blcmx5IHVzZSB0YWIgc3RvcHMgd2hlbiByZW5kZXJpbmcgdGFicy48L2xpPgogICAgPGxpPk1ha2UgUEhQIG1vZGUgbW9yZSByb2J1c3QuPC9saT4KICAgIDxsaT5TdXBwb3J0IGluZGVudGF0aW9uIGJsb2NrcyBpbiA8YSBocmVmPSJtYW51YWwuaHRtbCNhZGRvbl9mb2xkY29kZSI+Y29kZSBmb2xkZXI8L2E+LjwvbGk+CiAgICA8bGk+QWRkIGEgc2NyaXB0IGZvciA8YSBocmVmPSJtYW51YWwuaHRtbCNhZGRvbl9tYXRjaC1oaWdobGlnaHRlciI+aGlnaGxpZ2h0aW5nIGluc3RhbmNlcyBvZiB0aGUgc2VsZWN0aW9uPC9hPi48L2xpPgogICAgPGxpPk5ldyA8YSBocmVmPSIuLi9tb2RlL3Byb3BlcnRpZXMvaW5kZXguaHRtbCI+LnByb3BlcnRpZXM8L2E+IG1vZGUuPC9saT4KICAgIDxsaT5GaXggbWFueSBidWdzLjwvbGk+CiAgPC91bD4KCiAgPHAgY2xhc3M9InJlbCI+MjctMDEtMjAxMjogPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2NvZGVtaXJyb3ItMi4yMS56aXAiPlZlcnNpb24gMi4yMTwvYT46PC9wPgoKICA8dWwgY2xhc3M9InJlbC1ub3RlIj4KICAgIDxsaT5BZGRlZCA8YSBocmVmPSIuLi9tb2RlL2xlc3MvaW5kZXguaHRtbCI+TEVTUzwvYT4sIDxhIGhyZWY9Ii4uL21vZGUvbXlzcWwvaW5kZXguaHRtbCI+TXlTUUw8L2E+LAogICAgPGEgaHJlZj0iLi4vbW9kZS9nby9pbmRleC5odG1sIj5HbzwvYT4sIGFuZCA8YSBocmVmPSIuLi9tb2RlL3Zlcmlsb2cvaW5kZXguaHRtbCI+VmVyaWxvZzwvYT4gbW9kZXMuPC9saT4KICAgIDxsaT5BZGQgPGEgaHJlZj0ibWFudWFsLmh0bWwjb3B0aW9uX3NtYXJ0SW5kZW50Ij48Y29kZT5zbWFydEluZGVudDwvY29kZT48L2E+CiAgICBvcHRpb24uPC9saT4KICAgIDxsaT5TdXBwb3J0IGEgY3Vyc29yIGluIDxhIGhyZWY9Im1hbnVhbC5odG1sI29wdGlvbl9yZWFkT25seSI+PGNvZGU+cmVhZE9ubHk8L2NvZGU+PC9hPi1tb2RlLjwvbGk+CiAgICA8bGk+U3VwcG9ydCBhc3NpZ25pbmcgbXVsdGlwbGUgc3R5bGVzIHRvIGEgdG9rZW4uPC9saT4KICAgIDxsaT5Vc2UgYSBuZXcgYXBwcm9hY2ggdG8gZHJhd2luZyB0aGUgc2VsZWN0aW9uLjwvbGk+CiAgICA8bGk+QWRkIDxhIGhyZWY9Im1hbnVhbC5odG1sI3Njcm9sbFRvIj48Y29kZT5zY3JvbGxUbzwvY29kZT48L2E+IG1ldGhvZC48L2xpPgogICAgPGxpPkFsbG93IHVuZG8vcmVkbyBldmVudHMgdG8gc3BhbiBub24tYWRqYWNlbnQgbGluZXMuPC9saT4KICAgIDxsaT5Mb3RzIGFuZCBsb3RzIG9mIGJ1Z2ZpeGVzLjwvbGk+CiAgPC91bD4KCiAgPHAgY2xhc3M9InJlbCI+MjAtMTItMjAxMTogPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2NvZGVtaXJyb3ItMi4yLnppcCI+VmVyc2lvbiAyLjI8L2E+OjwvcD4KCiAgPHVsIGNsYXNzPSJyZWwtbm90ZSI+CiAgICA8bGk+U2xpZ2h0bHkgaW5jb21wYXRpYmxlIEFQSSBjaGFuZ2VzLiBSZWFkIDxhIGhyZWY9InVwZ3JhZGVfdjIuMi5odG1sIj50aGlzPC9hPi48L2xpPgogICAgPGxpPk5ldyBhcHByb2FjaAogICAgdG8gPGEgaHJlZj0ibWFudWFsLmh0bWwjb3B0aW9uX2V4dHJhS2V5cyI+YmluZGluZzwvYT4ga2V5cywKICAgIHN1cHBvcnQgZm9yIDxhIGhyZWY9Im1hbnVhbC5odG1sI29wdGlvbl9rZXlNYXAiPmN1c3RvbQogICAgYmluZGluZ3M8L2E+LjwvbGk+CiAgICA8bGk+U3VwcG9ydCBmb3Igb3ZlcndyaXRlIChpbnNlcnQpLjwvbGk+CiAgICA8bGk+PGEgaHJlZj0ibWFudWFsLmh0bWwjb3B0aW9uX3RhYlNpemUiPkN1c3RvbS13aWR0aDwvYT4KICAgIGFuZCA8YSBocmVmPSIuLi9kZW1vL3Zpc2libGV0YWJzLmh0bWwiPnN0eWxhYmxlPC9hPiB0YWJzLjwvbGk+CiAgICA8bGk+TW92ZWQgbW9yZSBjb2RlIGludG8gPGEgaHJlZj0ibWFudWFsLmh0bWwjYWRkb25zIj5hZGQtb24gc2NyaXB0czwvYT4uPC9saT4KICAgIDxsaT5TdXBwb3J0IGZvciBzYW5lIHZlcnRpY2FsIGN1cnNvciBtb3ZlbWVudCBpbiB3cmFwcGVkIGxpbmVzLjwvbGk+CiAgICA8bGk+TW9yZSByZWxpYWJsZSBoYW5kbGluZyBvZgogICAgZWRpdGluZyA8YSBocmVmPSJtYW51YWwuaHRtbCNtYXJrVGV4dCI+bWFya2VkIHRleHQ8L2E+LjwvbGk+CiAgICA8bGk+QWRkIG1pbmltYWwgPGEgaHJlZj0iLi4vZGVtby9lbWFjcy5odG1sIj5lbWFjczwvYT4KICAgIGFuZCA8YSBocmVmPSIuLi9kZW1vL3ZpbS5odG1sIj52aW08L2E+IGJpbmRpbmdzLjwvbGk+CiAgICA8bGk+UmVuYW1lIDxjb2RlPmNvb3Jkc0Zyb21JbmRleDwvY29kZT4KICAgIHRvIDxhIGhyZWY9Im1hbnVhbC5odG1sI3Bvc0Zyb21JbmRleCI+PGNvZGU+cG9zRnJvbUluZGV4PC9jb2RlPjwvYT4sCiAgICBhZGQgPGEgaHJlZj0ibWFudWFsLmh0bWwjaW5kZXhGcm9tUG9zIj48Y29kZT5pbmRleEZyb21Qb3M8L2NvZGU+PC9hPgogICAgbWV0aG9kLjwvbGk+CiAgPC91bD4KCiAgPHAgY2xhc3M9InJlbCI+MjEtMTEtMjAxMTogPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2NvZGVtaXJyb3ItMi4xOC56aXAiPlZlcnNpb24gMi4xODwvYT46PC9wPgogIDxwIGNsYXNzPSJyZWwtbm90ZSI+Rml4ZXMgPGNvZGU+VGV4dE1hcmtlci5jbGVhcjwvY29kZT4sIHdoaWNoIGlzIGJyb2tlbiBpbiAyLjE3LjwvcD4KCiAgPHAgY2xhc3M9InJlbCI+MjEtMTEtMjAxMTogPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2NvZGVtaXJyb3ItMi4xNy56aXAiPlZlcnNpb24gMi4xNzwvYT46PC9wPgogIDx1bCBjbGFzcz0icmVsLW5vdGUiPgogICAgPGxpPkFkZCBzdXBwb3J0IGZvciA8YSBocmVmPSJtYW51YWwuaHRtbCNvcHRpb25fbGluZVdyYXBwaW5nIj5saW5lCiAgICB3cmFwcGluZzwvYT4gYW5kIDxhIGhyZWY9Im1hbnVhbC5odG1sI2hpZGVMaW5lIj5jb2RlCiAgICBmb2xkaW5nPC9hPi48L2xpPgogICAgPGxpPkFkZCA8YSBocmVmPSIuLi9tb2RlL2dmbS9pbmRleC5odG1sIj5HaXRodWItc3R5bGUgTWFya2Rvd248L2E+IG1vZGUuPC9saT4KICAgIDxsaT5BZGQgPGEgaHJlZj0iLi4vdGhlbWUvbW9ub2thaS5jc3MiPk1vbm9rYWk8L2E+CiAgICBhbmQgPGEgaHJlZj0iLi4vdGhlbWUvcnVieWJsdWUuY3NzIj5SdWJ5Ymx1ZTwvYT4gdGhlbWVzLjwvbGk+CiAgICA8bGk+QWRkIDxhIGhyZWY9Im1hbnVhbC5odG1sI3NldEJvb2ttYXJrIj48Y29kZT5zZXRCb29rbWFyazwvY29kZT48L2E+IG1ldGhvZC48L2xpPgogICAgPGxpPk1vdmUgc29tZSBvZiB0aGUgZGVtbyBjb2RlIGludG8gcmV1c2FibGUgY29tcG9uZW50cwogICAgdW5kZXIgPGEgaHJlZj0iLi4vYWRkb24vIj48Y29kZT5saWIvdXRpbDwvY29kZT48L2E+LjwvbGk+CiAgICA8bGk+TWFrZSBzY3JlZW4tY29vcmQtZmluZGluZyBjb2RlIGZhc3RlciBhbmQgbW9yZSByZWxpYWJsZS48L2xpPgogICAgPGxpPkZpeCBkcmFnLWFuZC1kcm9wIGluIEZpcmVmb3guPC9saT4KICAgIDxsaT5JbXByb3ZlIHN1cHBvcnQgZm9yIElNRS48L2xpPgogICAgPGxpPlNwZWVkIHVwIGNvbnRlbnQgcmVuZGVyaW5nLjwvbGk+CiAgICA8bGk+Rml4IGJyb3dzZXIncyBidWlsdC1pbiBzZWFyY2ggaW4gV2Via2l0LjwvbGk+CiAgICA8bGk+TWFrZSBkb3VibGUtIGFuZCB0cmlwbGUtY2xpY2sgd29yayBpbiBJRS48L2xpPgogICAgPGxpPlZhcmlvdXMgZml4ZXMgdG8gbW9kZXMuPC9saT4KICA8L3VsPgoKICA8cCBjbGFzcz0icmVsIj4yNy0xMC0yMDExOiA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvY29kZW1pcnJvci0yLjE2LnppcCI+VmVyc2lvbiAyLjE2PC9hPjo8L3A+CiAgPHVsIGNsYXNzPSJyZWwtbm90ZSI+CiAgICA8bGk+QWRkIDxhIGhyZWY9Ii4uL21vZGUvcGVybC9pbmRleC5odG1sIj5QZXJsPC9hPiwgPGEgaHJlZj0iLi4vbW9kZS9ydXN0L2luZGV4Lmh0bWwiPlJ1c3Q8L2E+LCA8YSBocmVmPSIuLi9tb2RlL3RpZGRseXdpa2kvaW5kZXguaHRtbCI+VGlkZGx5V2lraTwvYT4sIGFuZCA8YSBocmVmPSIuLi9tb2RlL2dyb292eS9pbmRleC5odG1sIj5Hcm9vdnk8L2E+IG1vZGVzLjwvbGk+CiAgICA8bGk+RHJhZ2dpbmcgdGV4dCBpbnNpZGUgdGhlIGVkaXRvciBub3cgbW92ZXMsIHJhdGhlciB0aGFuIGNvcGllcy48L2xpPgogICAgPGxpPkFkZCBhIDxhIGhyZWY9Im1hbnVhbC5odG1sI2Nvb3Jkc0Zyb21JbmRleCI+PGNvZGU+Y29vcmRzRnJvbUluZGV4PC9jb2RlPjwvYT4gbWV0aG9kLjwvbGk+CiAgICA8bGk+PHN0cm9uZz5BUEkgY2hhbmdlPC9zdHJvbmc+OiA8Y29kZT5zZXRWYWx1ZTwvY29kZT4gbm93IG5vIGxvbmdlciBjbGVhcnMgaGlzdG9yeS4gVXNlIDxhIGhyZWY9Im1hbnVhbC5odG1sI2NsZWFySGlzdG9yeSI+PGNvZGU+Y2xlYXJIaXN0b3J5PC9jb2RlPjwvYT4gZm9yIHRoYXQuPC9saT4KICAgIDxsaT48c3Ryb25nPkFQSSBjaGFuZ2U8L3N0cm9uZz46IDxhIGhyZWY9Im1hbnVhbC5odG1sI21hcmtUZXh0Ij48Y29kZT5tYXJrVGV4dDwvY29kZT48L2E+IG5vdwogICAgcmV0dXJucyBhbiBvYmplY3Qgd2l0aCA8Y29kZT5jbGVhcjwvY29kZT4gYW5kIDxjb2RlPmZpbmQ8L2NvZGU+CiAgICBtZXRob2RzLiBNYXJrZWQgdGV4dCBpcyBub3cgbW9yZSByb2J1c3Qgd2hlbiBlZGl0ZWQuPC9saT4KICAgIDxsaT5GaXggZWRpdGluZyBjb2RlIHdpdGggdGFicyBpbiBJbnRlcm5ldCBFeHBsb3Jlci48L2xpPgogIDwvdWw+CgogIDxwIGNsYXNzPSJyZWwiPjI2LTA5LTIwMTE6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTIuMTUuemlwIj5WZXJzaW9uIDIuMTU8L2E+OjwvcD4KICA8cCBjbGFzcz0icmVsLW5vdGUiPkZpeCBidWcgdGhhdCBzbnVjayBpbnRvIDIuMTQ6IENsaWNraW5nIHRoZQogIGNoYXJhY3RlciB0aGF0IGN1cnJlbnRseSBoYXMgdGhlIGN1cnNvciBkaWRuJ3QgcmUtZm9jdXMgdGhlCiAgZWRpdG9yLjwvcD4KCiAgPHAgY2xhc3M9InJlbCI+MjYtMDktMjAxMTogPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2NvZGVtaXJyb3ItMi4xNC56aXAiPlZlcnNpb24gMi4xNDwvYT46PC9wPgogIDx1bCBjbGFzcz0icmVsLW5vdGUiPgogICAgPGxpPkFkZCA8YSBocmVmPSIuLi9tb2RlL2Nsb2p1cmUvaW5kZXguaHRtbCI+Q2xvanVyZTwvYT4sIDxhIGhyZWY9Ii4uL21vZGUvcGFzY2FsL2luZGV4Lmh0bWwiPlBhc2NhbDwvYT4sIDxhIGhyZWY9Ii4uL21vZGUvbnRyaXBsZXMvaW5kZXguaHRtbCI+TlRyaXBsZXM8L2E+LCA8YSBocmVmPSIuLi9tb2RlL2ppbmphMi9pbmRleC5odG1sIj5KaW5qYTI8L2E+LCBhbmQgPGEgaHJlZj0iLi4vbW9kZS9tYXJrZG93bi9pbmRleC5odG1sIj5NYXJrZG93bjwvYT4gbW9kZXMuPC9saT4KICAgIDxsaT5BZGQgPGEgaHJlZj0iLi4vdGhlbWUvY29iYWx0LmNzcyI+Q29iYWx0PC9hPiBhbmQgPGEgaHJlZj0iLi4vdGhlbWUvZWNsaXBzZS5jc3MiPkVjbGlwc2U8L2E+IHRoZW1lcy48L2xpPgogICAgPGxpPkFkZCBhIDxhIGhyZWY9Im1hbnVhbC5odG1sI29wdGlvbl9maXhlZEd1dHRlciI+PGNvZGU+Zml4ZWRHdXR0ZXI8L2NvZGU+PC9hPiBvcHRpb24uPC9saT4KICAgIDxsaT5GaXggYnVnIHdpdGggPGNvZGU+c2V0VmFsdWU8L2NvZGU+IGJyZWFraW5nIGN1cnNvciBtb3ZlbWVudC48L2xpPgogICAgPGxpPk1ha2UgZ3V0dGVyIHVwZGF0ZXMgbXVjaCBtb3JlIGVmZmljaWVudC48L2xpPgogICAgPGxpPkFsbG93IGRyYWdnaW5nIG9mIHRleHQgb3V0IG9mIHRoZSBlZGl0b3IgKG9uIG1vZGVybiBicm93c2VycykuPC9saT4KICA8L3VsPgoKCiAgPHAgY2xhc3M9InJlbCI+MjMtMDgtMjAxMTogPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2NvZGVtaXJyb3ItMi4xMy56aXAiPlZlcnNpb24gMi4xMzwvYT46PC9wPgogIDx1bCBjbGFzcz0icmVsLW5vdGUiPgogICAgPGxpPkFkZCA8YSBocmVmPSIuLi9tb2RlL3J1YnkvaW5kZXguaHRtbCI+UnVieTwvYT4sIDxhIGhyZWY9Ii4uL21vZGUvci9pbmRleC5odG1sIj5SPC9hPiwgPGEgaHJlZj0iLi4vbW9kZS9jb2ZmZWVzY3JpcHQvaW5kZXguaHRtbCI+Q29mZmVlU2NyaXB0PC9hPiwgYW5kIDxhIGhyZWY9Ii4uL21vZGUvdmVsb2NpdHkvaW5kZXguaHRtbCI+VmVsb2NpdHk8L2E+IG1vZGVzLjwvbGk+CiAgICA8bGk+QWRkIDxhIGhyZWY9Im1hbnVhbC5odG1sI2dldEd1dHRlckVsZW1lbnQiPjxjb2RlPmdldEd1dHRlckVsZW1lbnQ8L2NvZGU+PC9hPiB0byBBUEkuPC9saT4KICAgIDxsaT5TZXZlcmFsIGZpeGVzIHRvIHNjcm9sbGluZyBhbmQgcG9zaXRpb25pbmcuPC9saT4KICAgIDxsaT5BZGQgPGEgaHJlZj0ibWFudWFsLmh0bWwjb3B0aW9uX3NtYXJ0SG9tZSI+PGNvZGU+c21hcnRIb21lPC9jb2RlPjwvYT4gb3B0aW9uLjwvbGk+CiAgICA8bGk+QWRkIGFuIGV4cGVyaW1lbnRhbCA8YSBocmVmPSIuLi9tb2RlL3htbHB1cmUvaW5kZXguaHRtbCI+cHVyZSBYTUw8L2E+IG1vZGUuPC9saT4KICA8L3VsPgoKICA8cCBjbGFzcz0icmVsIj4yNS0wNy0yMDExOiA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvY29kZW1pcnJvci0yLjEyLnppcCI+VmVyc2lvbiAyLjEyPC9hPjo8L3A+CiAgPHVsIGNsYXNzPSJyZWwtbm90ZSI+CiAgICA8bGk+QWRkIGEgPGEgaHJlZj0iLi4vbW9kZS9zcGFycWwvaW5kZXguaHRtbCI+U1BBUlFMPC9hPiBtb2RlLjwvbGk+CiAgICA8bGk+Rml4IGJ1ZyB3aXRoIGN1cnNvciBqdW1waW5nIGFyb3VuZCBpbiBhbiB1bmZvY3VzZWQgZWRpdG9yIGluIElFLjwvbGk+CiAgICA8bGk+QWxsb3cga2V5IGFuZCBtb3VzZSBldmVudHMgdG8gYnViYmxlIG91dCBvZiB0aGUgZWRpdG9yLiBJZ25vcmUgd2lkZ2V0IGNsaWNrcy48L2xpPgogICAgPGxpPlNvbHZlIGN1cnNvciBmbGFraW5lc3MgYWZ0ZXIgdW5kby9yZWRvLjwvbGk+CiAgICA8bGk+Rml4IGJsb2NrLXJlaW5kZW50IGlnbm9yaW5nIHRoZSBsYXN0IGZldyBsaW5lcy48L2xpPgogICAgPGxpPkZpeCBwYXJzaW5nIG9mIG11bHRpLWxpbmUgYXR0cnMgaW4gWE1MIG1vZGUuPC9saT4KICAgIDxsaT5Vc2UgPGNvZGU+aW5uZXJIVE1MPC9jb2RlPiBmb3IgSFRNTC1lc2NhcGluZy48L2xpPgogICAgPGxpPlNvbWUgZml4ZXMgdG8gaW5kZW50YXRpb24gaW4gQy1saWtlIG1vZGUuPC9saT4KICAgIDxsaT5TaHJpbmsgaG9yaXogc2Nyb2xsYmFycyB3aGVuIGxvbmcgbGluZXMgcmVtb3ZlZC48L2xpPgogICAgPGxpPkZpeCB3aWR0aCBmZWVkYmFjayBsb29wIGJ1ZyB0aGF0IGNhdXNlZCB0aGUgd2lkdGggb2YgYW4gaW5uZXIgRElWIHRvIHNocmluay48L2xpPgogIDwvdWw+CgogIDxwIGNsYXNzPSJyZWwiPjA0LTA3LTIwMTE6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTIuMTEuemlwIj5WZXJzaW9uIDIuMTE8L2E+OjwvcD4KICA8dWwgY2xhc3M9InJlbC1ub3RlIj4KICAgIDxsaT5BZGQgYSA8YSBocmVmPSIuLi9tb2RlL3NjaGVtZS9pbmRleC5odG1sIj5TY2hlbWUgbW9kZTwvYT4uPC9saT4KICAgIDxsaT5BZGQgYSA8Y29kZT5yZXBsYWNlPC9jb2RlPiBtZXRob2QgdG8gc2VhcmNoIGN1cnNvcnMsIGZvciBjdXJzb3ItcHJlc2VydmluZyByZXBsYWNlbWVudHMuPC9saT4KICAgIDxsaT5NYWtlIHRoZSA8YSBocmVmPSIuLi9tb2RlL2NsaWtlL2luZGV4Lmh0bWwiPkMtbGlrZSBtb2RlPC9hPiBtb2RlIG1vcmUgY3VzdG9taXphYmxlLjwvbGk+CiAgICA8bGk+VXBkYXRlIFhNTCBtb2RlIHRvIHNwb3QgbWlzbWF0Y2hlZCB0YWdzLjwvbGk+CiAgICA8bGk+QWRkIDxjb2RlPmdldFN0YXRlQWZ0ZXI8L2NvZGU+IEFQSSBhbmQgPGNvZGU+Y29tcGFyZVN0YXRlPC9jb2RlPiBtb2RlIEFQSSBtZXRob2RzIGZvciBmaW5lci1ncmFpbmVkIG1vZGUgbWFnaWMuPC9saT4KICAgIDxsaT5BZGQgYSA8Y29kZT5nZXRTY3JvbGxlckVsZW1lbnQ8L2NvZGU+IEFQSSBtZXRob2QgdG8gbWFuaXB1bGF0ZSB0aGUgc2Nyb2xsaW5nIERJVi48L2xpPgogICAgPGxpPkZpeCBkcmFnLWFuZC1kcm9wIGZvciBGaXJlZm94LjwvbGk+CiAgICA8bGk+QWRkIGEgQyMgY29uZmlndXJhdGlvbiBmb3IgdGhlIDxhIGhyZWY9Ii4uL21vZGUvY2xpa2UvaW5kZXguaHRtbCI+Qy1saWtlIG1vZGU8L2E+LjwvbGk+CiAgICA8bGk+QWRkIDxhIGhyZWY9Ii4uL2RlbW8vZnVsbHNjcmVlbi5odG1sIj5mdWxsLXNjcmVlbiBlZGl0aW5nPC9hPiBhbmQgPGEgaHJlZj0iLi4vZGVtby9jaGFuZ2Vtb2RlLmh0bWwiPm1vZGUtY2hhbmdpbmc8L2E+IGRlbW9zLjwvbGk+CiAgPC91bD4KCiAgPHAgY2xhc3M9InJlbCI+MDctMDYtMjAxMTogPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2NvZGVtaXJyb3ItMi4xLnppcCI+VmVyc2lvbiAyLjE8L2E+OjwvcD4KICA8cCBjbGFzcz0icmVsLW5vdGUiPkFkZAogIGEgPGEgaHJlZj0ibWFudWFsLmh0bWwjb3B0aW9uX3RoZW1lIj50aGVtZTwvYT4gc3lzdGVtCiAgKDxhIGhyZWY9Ii4uL2RlbW8vdGhlbWUuaHRtbCI+ZGVtbzwvYT4pLiBOb3RlIHRoYXQgdGhpcyBpcyBub3QKICBiYWNrd2FyZHMtY29tcGF0aWJsZeKAlHlvdSdsbCBoYXZlIHRvIHVwZGF0ZSB5b3VyIHN0eWxlcyBhbmQKICBtb2RlcyE8L3A+CgogIDxwIGNsYXNzPSJyZWwiPjA3LTA2LTIwMTE6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTIuMDIuemlwIj5WZXJzaW9uIDIuMDI8L2E+OjwvcD4KICA8dWwgY2xhc3M9InJlbC1ub3RlIj4KICAgIDxsaT5BZGQgYSA8YSBocmVmPSIuLi9tb2RlL2x1YS9pbmRleC5odG1sIj5MdWEgbW9kZTwvYT4uPC9saT4KICAgIDxsaT5GaXggcmV2ZXJzZS1zZWFyY2hpbmcgZm9yIGEgcmVnZXhwLjwvbGk+CiAgICA8bGk+RW1wdHkgbGluZXMgY2FuIG5vIGxvbmdlciBicmVhayBoaWdobGlnaHRpbmcuPC9saT4KICAgIDxsaT5SZXdvcmsgc2Nyb2xsaW5nIG1vZGVsICh0aGUgb3V0ZXIgd3JhcHBlciBubyBsb25nZXIgZG9lcyB0aGUgc2Nyb2xsaW5nKS48L2xpPgogICAgPGxpPlNvbHZlIGhvcml6b250YWwgaml0dGVyaW5nIG9uIGxvbmcgbGluZXMuPC9saT4KICAgIDxsaT5BZGQgPGEgaHJlZj0iLi4vZGVtby9ydW5tb2RlLmh0bWwiPnJ1bm1vZGUuanM8L2E+LjwvbGk+CiAgICA8bGk+SW1tZWRpYXRlbHkgcmUtaGlnaGxpZ2h0IHRleHQgd2hlbiB0eXBpbmcuPC9saT4KICAgIDxsaT5GaXggcHJvYmxlbSB3aXRoICdzdGlja2luZycgaG9yaXpvbnRhbCBzY3JvbGxiYXIuPC9saT4KICA8L3VsPgoKICA8cCBjbGFzcz0icmVsIj4yNi0wNS0yMDExOiA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvY29kZW1pcnJvci0yLjAxLnppcCI+VmVyc2lvbiAyLjAxPC9hPjo8L3A+CiAgPHVsIGNsYXNzPSJyZWwtbm90ZSI+CiAgICA8bGk+QWRkIGEgPGEgaHJlZj0iLi4vbW9kZS9zbWFsbHRhbGsvaW5kZXguaHRtbCI+U21hbGx0YWxrIG1vZGU8L2E+LjwvbGk+CiAgICA8bGk+QWRkIGEgPGEgaHJlZj0iLi4vbW9kZS9yc3QvaW5kZXguaHRtbCI+cmVTdHJ1Y3R1cmVkVGV4dCBtb2RlPC9hPi48L2xpPgogICAgPGxpPkFkZCBhIDxhIGhyZWY9Ii4uL21vZGUvcHl0aG9uL2luZGV4Lmh0bWwiPlB5dGhvbiBtb2RlPC9hPi48L2xpPgogICAgPGxpPkFkZCBhIDxhIGhyZWY9Ii4uL21vZGUvcGxzcWwvaW5kZXguaHRtbCI+UEwvU1FMIG1vZGU8L2E+LjwvbGk+CiAgICA8bGk+PGNvZGU+Y29vcmRzQ2hhcjwvY29kZT4gbm93IHdvcmtzPC9saT4KICAgIDxsaT5GaXggYSBwcm9ibGVtIHdoZXJlIDxjb2RlPm9uQ3Vyc29yQWN0aXZpdHk8L2NvZGU+IGludGVyZmVyZWQgd2l0aCA8Y29kZT5vbkNoYW5nZTwvY29kZT4uPC9saT4KICAgIDxsaT5GaXggYSBudW1iZXIgb2Ygc2Nyb2xsaW5nIGFuZCBtb3VzZS1jbGljay1wb3NpdGlvbiBnbGl0Y2hlcy48L2xpPgogICAgPGxpPlBhc3MgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNoYW5nZWQgbGluZXMgdG8gPGNvZGU+b25DaGFuZ2U8L2NvZGU+LjwvbGk+CiAgICA8bGk+U3VwcG9ydCBjbWQtdXAvZG93biBvbiBPUyBYLjwvbGk+CiAgICA8bGk+QWRkIHRyaXBsZS1jbGljayBsaW5lIHNlbGVjdGlvbi48L2xpPgogICAgPGxpPkRvbid0IGhhbmRsZSBzaGlmdCB3aGVuIGNoYW5naW5nIHRoZSBzZWxlY3Rpb24gdGhyb3VnaCB0aGUgQVBJLjwvbGk+CiAgICA8bGk+U3VwcG9ydCA8Y29kZT4ibm9jdXJzb3IiPC9jb2RlPiBtb2RlIGZvciA8Y29kZT5yZWFkT25seTwvY29kZT4gb3B0aW9uLjwvbGk+CiAgICA8bGk+QWRkIGFuIDxjb2RlPm9uSGlnaGxpZ2h0Q29tcGxldGU8L2NvZGU+IG9wdGlvbi48L2xpPgogICAgPGxpPkZpeCB0aGUgY29udGV4dCBtZW51IGZvciBGaXJlZm94LjwvbGk+CiAgPC91bD4KCiAgPHAgY2xhc3M9InJlbCI+MjgtMDMtMjAxMTogPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2NvZGVtaXJyb3ItMi4wLnppcCI+VmVyc2lvbiAyLjA8L2E+OjwvcD4KICA8cCBjbGFzcz0icmVsLW5vdGUiPkNvZGVNaXJyb3IgMiBpcyBhIGNvbXBsZXRlIHJld3JpdGUgdGhhdCdzCiAgZmFzdGVyLCBzbWFsbGVyLCBzaW1wbGVyIHRvIHVzZSwgYW5kIGxlc3MgZGVwZW5kZW50IG9uIGJyb3dzZXIKICBxdWlya3MuIFNlZSA8YSBocmVmPSJpbnRlcm5hbHMuaHRtbCI+dGhpczwvYT4KICBhbmQgPGEgaHJlZj0iaHR0cDovL2dyb3Vwcy5nb29nbGUuY29tL2dyb3VwL2NvZGVtaXJyb3IvYnJvd3NlX3RocmVhZC90aHJlYWQvNWE4ZTg5NDAyNGE5ZjU4MCI+dGhpczwvYT4KICBmb3IgbW9yZSBpbmZvcm1hdGlvbi48L3A+CgogIDxwIGNsYXNzPSJyZWwiPjIyLTAyLTIwMTE6IDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2NvZGVtaXJyb3IvdHJlZS9iZXRhMiI+VmVyc2lvbiAyLjAgYmV0YSAyPC9hPjo8L3A+CiAgPHAgY2xhc3M9InJlbC1ub3RlIj5Tb21ld2hhdCBtb3JlIG1hdHVyZSBBUEksIGxvdHMgb2YgYnVncyBzaGFrZW4gb3V0LjwvcD4KCiAgPHAgY2xhc3M9InJlbCI+MTctMDItMjAxMTogPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2NvZGVtaXJyb3ItMC45NC56aXAiPlZlcnNpb24gMC45NDwvYT46PC9wPgogIDx1bCBjbGFzcz0icmVsLW5vdGUiPgogICAgPGxpPjxjb2RlPnRhYk1vZGU6ICJzcGFjZXMiPC9jb2RlPiB3YXMgbW9kaWZpZWQgc2xpZ2h0bHkgKG5vdyBpbmRlbnRzIHdoZW4gc29tZXRoaW5nIGlzIHNlbGVjdGVkKS48L2xpPgogICAgPGxpPkZpeGVzIGEgYnVnIHRoYXQgd291bGQgY2F1c2UgdGhlIHNlbGVjdGlvbiBjb2RlIHRvIGJyZWFrIG9uIHNvbWUgSUUgdmVyc2lvbnMuPC9saT4KICAgIDxsaT5EaXNhYmxpbmcgc3BlbGwtY2hlY2sgb24gV2ViS2l0IGJyb3dzZXJzIG5vdyB3b3Jrcy48L2xpPgogIDwvdWw+CgogIDxwIGNsYXNzPSJyZWwiPjA4LTAyLTIwMTE6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC8iPlZlcnNpb24gMi4wIGJldGEgMTwvYT46PC9wPgogIDxwIGNsYXNzPSJyZWwtbm90ZSI+Q29kZU1pcnJvciAyIGlzIGEgY29tcGxldGUgcmV3cml0ZSBvZgogIENvZGVNaXJyb3IsIG5vIGxvbmdlciBkZXBlbmRpbmcgb24gYW4gZWRpdGFibGUgZnJhbWUuPC9wPgoKICA8cCBjbGFzcz0icmVsIj4xOS0wMS0yMDExOiA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvY29kZW1pcnJvci0wLjkzLnppcCI+VmVyc2lvbiAwLjkzPC9hPjo8L3A+CiAgPHVsIGNsYXNzPSJyZWwtbm90ZSI+CiAgICA8bGk+QWRkZWQgYSA8YSBocmVmPSJjb250cmliL3JlZ2V4L2luZGV4Lmh0bWwiPlJlZ3VsYXIgRXhwcmVzc2lvbjwvYT4gcGFyc2VyLjwvbGk+CiAgICA8bGk+Rml4ZXMgdG8gdGhlIFBIUCBwYXJzZXIuPC9saT4KICAgIDxsaT5TdXBwb3J0IGZvciByZWd1bGFyIGV4cHJlc3Npb24gaW4gc2VhcmNoL3JlcGxhY2UuPC9saT4KICAgIDxsaT5BZGQgPGNvZGU+c2F2ZTwvY29kZT4gbWV0aG9kIHRvIGluc3RhbmNlcyBjcmVhdGVkIHdpdGggPGNvZGU+ZnJvbVRleHRBcmVhPC9jb2RlPi48L2xpPgogICAgPGxpPkFkZCBzdXBwb3J0IGZvciBNUyBULVNRTCBpbiB0aGUgU1FMIHBhcnNlci48L2xpPgogICAgPGxpPlN1cHBvcnQgdXNlIG9mIENTUyBjbGFzc2VzIGZvciBoaWdobGlnaHRpbmcgYnJhY2tldHMuPC9saT4KICAgIDxsaT5GaXggeWV0IGFub3RoZXIgaGFuZyB3aXRoIGxpbmUtbnVtYmVyaW5nIGluIGhpZGRlbiBlZGl0b3JzLjwvbGk+CiAgPC91bD4KPC9zZWN0aW9uPgoKPHNlY3Rpb24gaWQ9djE+CgogIDxoMj5WZXJzaW9uIDAueDwvaDI+CgogIDxwIGNsYXNzPSJyZWwiPjI4LTAzLTIwMTE6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTEuMC56aXAiPlZlcnNpb24gMS4wPC9hPjo8L3A+CiAgPHVsIGNsYXNzPSJyZWwtbm90ZSI+CiAgICA8bGk+Rml4IGVycm9yIHdoZW4gZGVidWcgaGlzdG9yeSBvdmVyZmxvd3MuPC9saT4KICAgIDxsaT5SZWZpbmUgaGFuZGxpbmcgb2YgQyMgdmVyYmF0aW0gc3RyaW5ncy48L2xpPgogICAgPGxpPkZpeCBzb21lIGlzc3VlcyB3aXRoIEphdmFTY3JpcHQgaW5kZW50YXRpb24uPC9saT4KICA8L3VsPgoKICA8cCBjbGFzcz0icmVsIj4xNy0xMi0yMDEwOiA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvY29kZW1pcnJvci0wLjkyLnppcCI+VmVyc2lvbiAwLjkyPC9hPjo8L3A+CiAgPHVsIGNsYXNzPSJyZWwtbm90ZSI+CiAgICA8bGk+TWFrZSBDb2RlTWlycm9yIHdvcmsgaW4gWEhUTUwgZG9jdW1lbnRzLjwvbGk+CiAgICA8bGk+Rml4IGJ1ZyBpbiBoYW5kbGluZyBvZiBiYWNrc2xhc2hlcyBpbiBQeXRob24gc3RyaW5ncy48L2xpPgogICAgPGxpPlRoZSA8Y29kZT5zdHlsZU51bWJlcnM8L2NvZGU+IG9wdGlvbiBpcyBub3cgb2ZmaWNpYWxseQogICAgc3VwcG9ydGVkIGFuZCBkb2N1bWVudGVkLjwvbGk+CiAgICA8bGk+PGNvZGU+b25MaW5lTnVtYmVyQ2xpY2s8L2NvZGU+IG9wdGlvbiBhZGRlZC48L2xpPgogICAgPGxpPk1vcmUgY29uc2lzdGVudCBuYW1lcyA8Y29kZT5vbkxvYWQ8L2NvZGU+IGFuZAogICAgPGNvZGU+b25DdXJzb3JBY3Rpdml0eTwvY29kZT4gY2FsbGJhY2tzLiBPbGQgbmFtZXMgc3RpbGwgd29yaywgYnV0CiAgICBhcmUgZGVwcmVjYXRlZC48L2xpPgogICAgPGxpPkFkZCBhIDxhIGhyZWY9ImNvbnRyaWIvZnJlZW1hcmtlci9pbmRleC5odG1sIj5GcmVlbWFya2VyPC9hPiBtb2RlLjwvbGk+CiAgPC91bD4KCiAgPHAgY2xhc3M9InJlbCI+MTEtMTEtMjAxMDogPGEKICBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvY29kZW1pcnJvci0wLjkxLnppcCI+VmVyc2lvbiAwLjkxPC9hPjo8L3A+CiAgPHVsIGNsYXNzPSJyZWwtbm90ZSI+CiAgICA8bGk+QWRkcyBzdXBwb3J0IGZvciA8YSBocmVmPSJjb250cmliL2phdmEiPkphdmE8L2E+LjwvbGk+CiAgICA8bGk+U21hbGwgYWRkaXRpb25zIHRvIHRoZSA8YSBocmVmPSJjb250cmliL3BocCI+UEhQPC9hPiBhbmQgPGEgaHJlZj0iY29udHJpYi9zcWwiPlNRTDwvYT4gcGFyc2Vycy48L2xpPgogICAgPGxpPldvcmsgYXJvdW5kIHZhcmlvdXMgPGEgaHJlZj0iaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTQ3ODA2Ij5XZWJraXQ8L2E+IDxhIGhyZWY9Imh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0yMzQ3NCI+aXNzdWVzPC9hPi48L2xpPgogICAgPGxpPkZpeCA8Y29kZT50b1RleHRBcmVhPC9jb2RlPiB0byB1cGRhdGUgdGhlIGNvZGUgaW4gdGhlIHRleHRhcmVhLjwvbGk+CiAgICA8bGk+QWRkIGEgPGNvZGU+bm9TY3JpcHRDYWNoaW5nPC9jb2RlPiBvcHRpb24gKGhhY2sgdG8gZWFzZSBkZXZlbG9wbWVudCkuPC9saT4KICAgIDxsaT5NYWtlIHN1Yi1tb2RlcyBvZiA8YSBocmVmPSJtaXhlZHRlc3QuaHRtbCI+SFRNTCBtaXhlZDwvYT4gbW9kZSBjb25maWd1cmFibGUuPC9saT4KICA8L3VsPgoKICA8cCBjbGFzcz0icmVsIj4wMi0xMC0yMDEwOiA8YQogIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTAuOS56aXAiPlZlcnNpb24gMC45PC9hPjo8L3A+CiAgPHVsIGNsYXNzPSJyZWwtbm90ZSI+CiAgICA8bGk+QWRkIHN1cHBvcnQgZm9yIHNlYXJjaGluZyBiYWNrd2FyZHMuPC9saT4KICAgIDxsaT5UaGVyZSBhcmUgbm93IHBhcnNlcnMgZm9yIDxhIGhyZWY9ImNvbnRyaWIvc2NoZW1lL2luZGV4Lmh0bWwiPlNjaGVtZTwvYT4sIDxhIGhyZWY9ImNvbnRyaWIveHF1ZXJ5L2luZGV4Lmh0bWwiPlhRdWVyeTwvYT4sIGFuZCA8YSBocmVmPSJjb250cmliL29tZXRhL2luZGV4Lmh0bWwiPk9tZXRhSlM8L2E+LjwvbGk+CiAgICA8bGk+TWFrZXMgPGNvZGU+aGVpZ2h0OiAiZHluYW1pYyI8L2NvZGU+IG1vcmUgcm9idXN0LjwvbGk+CiAgICA8bGk+Rml4ZXMgYnVnIHdoZXJlIHBhc3RlIGRpZCBub3Qgd29yayBvbiBPUyBYLjwvbGk+CiAgICA8bGk+QWRkIGEgPGNvZGU+ZW50ZXJNb2RlPC9jb2RlPiBhbmQgPGNvZGU+ZWxlY3RyaWNDaGFyczwvY29kZT4gb3B0aW9ucyB0byBtYWtlIGluZGVudGF0aW9uIGV2ZW4gbW9yZSBjdXN0b21pemFibGUuPC9saT4KICAgIDxsaT5BZGQgPGNvZGU+Zmlyc3RMaW5lTnVtYmVyPC9jb2RlPiBvcHRpb24uPC9saT4KICAgIDxsaT5GaXggYmFkIGhhbmRsaW5nIG9mIDxjb2RlPkBtZWRpYTwvY29kZT4gcnVsZXMgYnkgdGhlIENTUyBwYXJzZXIuPC9saT4KICAgIDxsaT5UYWtlIGEgbmV3LCBtb3JlIHJvYnVzdCBhcHByb2FjaCB0byB3b3JraW5nIGFyb3VuZCB0aGUgaW52aXNpYmxlLWxhc3QtbGluZSBidWcgaW4gV2ViS2l0LjwvbGk+CiAgPC91bD4KCiAgPHAgY2xhc3M9InJlbCI+MjItMDctMjAxMDogPGEKICBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvY29kZW1pcnJvci0wLjguemlwIj5WZXJzaW9uIDAuODwvYT46PC9wPgogIDx1bCBjbGFzcz0icmVsLW5vdGUiPgogICAgPGxpPkFkZCBhIDxjb2RlPmN1cnNvckNvb3JkczwvY29kZT4gbWV0aG9kIHRvIGZpbmQgdGhlIHNjcmVlbgogICAgY29vcmRpbmF0ZXMgb2YgdGhlIGN1cnNvci48L2xpPgogICAgPGxpPkEgbnVtYmVyIG9mIGZpeGVzIGFuZCBzdXBwb3J0IGZvciBtb3JlIHN5bnRheCBpbiB0aGUgUEhQIHBhcnNlci48L2xpPgogICAgPGxpPkZpeCBpbmRlbnRhdGlvbiBwcm9ibGVtIHdpdGggSlNPTi1tb2RlIEpTIHBhcnNlciBpbiBXZWJraXQuPC9saT4KICAgIDxsaT5BZGQgYSA8YSBocmVmPSJjb21wcmVzcy5odG1sIj5taW5pZmljYXRpb248L2E+IFVJLjwvbGk+CiAgICA8bGk+U3VwcG9ydCBhIDxjb2RlPmhlaWdodDogZHluYW1pYzwvY29kZT4gbW9kZSwgd2hlcmUgdGhlIGVkaXRvcidzCiAgICBoZWlnaHQgd2lsbCBhZGp1c3QgdG8gdGhlIHNpemUgb2YgaXRzIGNvbnRlbnQuPC9saT4KICAgIDxsaT5CZXR0ZXIgc3VwcG9ydCBmb3IgSU1FIGlucHV0IG1vZGUuPC9saT4KICAgIDxsaT5GaXggSmF2YVNjcmlwdCBwYXJzZXIgZ2V0dGluZyBjb25mdXNlZCB3aGVuIHNlZWluZyBhIG5vLWFyZ3VtZW50CiAgICBmdW5jdGlvbiBjYWxsLjwvbGk+CiAgICA8bGk+SGF2ZSBDU1MgcGFyc2VyIHNlZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHNlbGVjdG9ycyBhbmQgb3RoZXIKICAgIGlkZW50aWZpZXJzLjwvbGk+CiAgICA8bGk+Rml4IHNjcm9sbGluZyBidWcgd2hlbiBwYXN0aW5nIGluIGEgaG9yaXpvbnRhbGx5LXNjcm9sbGVkCiAgICBlZGl0b3IuPC9saT4KICAgIDxsaT5TdXBwb3J0IDxjb2RlPnRvVGV4dEFyZWE8L2NvZGU+IG1ldGhvZCBpbiBpbnN0YW5jZXMgY3JlYXRlZCB3aXRoCiAgICA8Y29kZT5mcm9tVGV4dEFyZWE8L2NvZGU+LjwvbGk+CiAgICA8bGk+V29yayBhcm91bmQgbmV3IE9wZXJhIGN1cnNvciBidWcgdGhhdCBjYXVzZXMgdGhlIGN1cnNvciB0byBqdW1wCiAgICB3aGVuIHByZXNzaW5nIGJhY2tzcGFjZSBhdCB0aGUgZW5kIG9mIGEgbGluZS48L2xpPgogIDwvdWw+CgogIDxwIGNsYXNzPSJyZWwiPjI3LTA0LTIwMTA6IDxhCiAgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2NvZGVtaXJyb3ItMC42Ny56aXAiPlZlcnNpb24KICAwLjY3PC9hPjo8L3A+CiAgPHAgY2xhc3M9InJlbC1ub3RlIj5Nb3JlIGNvbnNpc3RlbnQgcGFnZS11cC9wYWdlLWRvd24gYmVoYXZpb3VyCiAgYWNyb3NzIGJyb3dzZXJzLiBGaXggc29tZSBpc3N1ZXMgd2l0aCBoaWRkZW4gZWRpdG9ycyBsb29waW5nIGZvcmV2ZXIKICB3aGVuIGxpbmUtbnVtYmVycyB3ZXJlIGVuYWJsZWQuIE1ha2UgUEhQIHBhcnNlciBwYXJzZQogIDxjb2RlPiJcXCI8L2NvZGU+IGNvcnJlY3RseS4gSGF2ZSA8Y29kZT5qdW1wVG9MaW5lPC9jb2RlPiB3b3JrIG9uCiAgbGluZSBoYW5kbGVzLCBhbmQgYWRkIDxjb2RlPmN1cnNvckxpbmU8L2NvZGU+IGZ1bmN0aW9uIHRvIGZldGNoIHRoZQogIGxpbmUgaGFuZGxlIHdoZXJlIHRoZSBjdXJzb3IgY3VycmVudGx5IGlzLiBBZGQgbmV3CiAgPGNvZGU+c2V0U3R5bGVzaGVldDwvY29kZT4gZnVuY3Rpb24gdG8gc3dpdGNoIHN0eWxlLXNoZWV0cyBpbiBhCiAgcnVubmluZyBlZGl0b3IuPC9wPgoKICA8cCBjbGFzcz0icmVsIj4wMS0wMy0yMDEwOiA8YQogIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTAuNjYuemlwIj5WZXJzaW9uCiAgMC42NjwvYT46PC9wPgogIDxwIGNsYXNzPSJyZWwtbm90ZSI+QWRkcyA8Y29kZT5yZW1vdmVMaW5lPC9jb2RlPiBtZXRob2QgdG8gQVBJLgogIEludHJvZHVjZXMgdGhlIDxhIGhyZWY9ImNvbnRyaWIvcGxzcWwvaW5kZXguaHRtbCI+UExTUUwgcGFyc2VyPC9hPi4KICBNYXJrcyBYTUwgZXJyb3JzIGJ5IGFkZGluZyAocmF0aGVyIHRoYW4gcmVwbGFjaW5nKSBhIENTUyBjbGFzcywgc28KICB0aGF0IHRoZXkgY2FuIGJlIGRpc2FibGVkIGJ5IG1vZGlmeWluZyB0aGVpciBzdHlsZS4gRml4ZXMgc2V2ZXJhbAogIHNlbGVjdGlvbiBidWdzLCBhbmQgYSBudW1iZXIgb2Ygc21hbGwgZ2xpdGNoZXMuPC9wPgoKICA8cCBjbGFzcz0icmVsIj4xMi0xMS0yMDA5OiA8YQogIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTAuNjUuemlwIj5WZXJzaW9uCiAgMC42NTwvYT46PC9wPgogIDxwIGNsYXNzPSJyZWwtbm90ZSI+QWRkIHN1cHBvcnQgZm9yIGhhdmluZyBib3RoIGxpbmUtd3JhcHBpbmcgYW5kCiAgbGluZS1udW1iZXJzIHR1cm5lZCBvbiwgbWFrZSBwYXJlbi1oaWdobGlnaHRpbmcgc3R5bGUgY3VzdG9taXNhYmxlCiAgKDxjb2RlPm1hcmtQYXJlbjwvY29kZT4gYW5kIDxjb2RlPnVubWFya1BhcmVuPC9jb2RlPiBjb25maWcKICBvcHRpb25zKSwgd29yayBhcm91bmQgYSBzZWxlY3Rpb24gYnVnIHRoYXQgT3BlcmEKICA8ZW0+cmU8L2VtPmludHJvZHVjZWQgaW4gdmVyc2lvbiAxMC48L3A+CgogIDxwIGNsYXNzPSJyZWwiPjIzLTEwLTIwMDk6IDxhCiAgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0L2NvZGVtaXJyb3ItMC42NC56aXAiPlZlcnNpb24KICAwLjY0PC9hPjo8L3A+CiAgPHAgY2xhc3M9InJlbC1ub3RlIj5Tb2x2ZXMgc29tZSBpc3N1ZXMgaW50cm9kdWNlZCBieSB0aGUKICBwYXN0ZS1oYW5kbGluZyBjaGFuZ2VzIGZyb20gdGhlIHByZXZpb3VzIHJlbGVhc2UuIEFkZHMKICA8Y29kZT5zZXRTcGVsbGNoZWNrPC9jb2RlPiwgPGNvZGU+c2V0VGV4dFdyYXBwaW5nPC9jb2RlPiwKICA8Y29kZT5zZXRJbmRlbnRVbml0PC9jb2RlPiwgPGNvZGU+c2V0VW5kb0RlcHRoPC9jb2RlPiwKICA8Y29kZT5zZXRUYWJNb2RlPC9jb2RlPiwgYW5kIDxjb2RlPnNldExpbmVOdW1iZXJzPC9jb2RlPiB0bwogIGN1c3RvbWlzZSBhIHJ1bm5pbmcgZWRpdG9yLiBJbnRyb2R1Y2VzIGFuIDxhCiAgaHJlZj0iY29udHJpYi9zcWwvaW5kZXguaHRtbCI+U1FMPC9hPiBwYXJzZXIuIEZpeGVzIGEgZmV3IHNtYWxsCiAgcHJvYmxlbXMgaW4gdGhlIDxhIGhyZWY9ImNvbnRyaWIvcHl0aG9uL2luZGV4Lmh0bWwiPlB5dGhvbjwvYT4KICBwYXJzZXIuIEFuZCwgYXMgdXN1YWwsIGFkZCB3b3JrYXJvdW5kcyBmb3IgdmFyaW91cyBuZXdseSBkaXNjb3ZlcmVkCiAgYnJvd3NlciBpbmNvbXBhdGliaWxpdGllcy48L3A+CgogIDxwIGNsYXNzPSJyZWwiPjMxLTA4LTIwMDk6IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLTAuNjMuemlwIj5WZXJzaW9uIDAuNjM8L2E+OjwvcD4KICA8cCBjbGFzcz0icmVsLW5vdGUiPiBPdmVyaGF1bCBvZiBwYXN0ZS1oYW5kbGluZyAobGVzcyBmcmFnaWxlKSwgZml4ZXMgZm9yIHNldmVyYWwKICBzZXJpb3VzIElFOCBpc3N1ZXMgKGN1cnNvciBqdW1waW5nLCBlbmQtb2YtZG9jdW1lbnQgYnVncykgYW5kIGEgbnVtYmVyCiAgb2Ygc21hbGwgcHJvYmxlbXMuPC9wPgoKICA8cCBjbGFzcz0icmVsIj4zMC0wNS0yMDA5OiA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvY29kZW1pcnJvci0wLjYyLnppcCI+VmVyc2lvbiAwLjYyPC9hPjo8L3A+CiAgPHAgY2xhc3M9InJlbC1ub3RlIj5JbnRyb2R1Y2VzIDxhIGhyZWY9ImNvbnRyaWIvcHl0aG9uL2luZGV4Lmh0bWwiPlB5dGhvbjwvYT4KICBhbmQgPGEgaHJlZj0iY29udHJpYi9sdWEvaW5kZXguaHRtbCI+THVhPC9hPiBwYXJzZXJzLiBBZGQKICA8Y29kZT5zZXRQYXJzZXI8L2NvZGU+IChvbi10aGUtZmx5IG1vZGUgY2hhbmdpbmcpIGFuZAogIDxjb2RlPmNsZWFySGlzdG9yeTwvY29kZT4gbWV0aG9kcy4gTWFrZSBwYXJzaW5nIHBhc3NlcyB0aW1lLWJhc2VkCiAgaW5zdGVhZCBvZiBsaW5lcy1iYXNlZCAoc2VlIHRoZSA8Y29kZT5wYXNzVGltZTwvY29kZT4gb3B0aW9uKS48L3A+Cgo8L3NlY3Rpb24+CjwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/doc/reporting.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogUmVwb3J0aW5nIEJ1Z3M8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSJkb2NzLmNzcyI+Cgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxoMT5Db2RlTWlycm9yPC9oMT48aW1nIGlkPWxvZ28gc3JjPSJsb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSJtYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPlJlcG9ydGluZyBidWdzPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+Cgo8aDI+UmVwb3J0aW5nIGJ1Z3MgZWZmZWN0aXZlbHk8L2gyPgoKPGRpdiBjbGFzcz0ibGVmdCI+Cgo8cD5TbyB5b3UgZm91bmQgYSBwcm9ibGVtIGluIENvZGVNaXJyb3IuIEJ5IGFsbCBtZWFucywgcmVwb3J0IGl0ISBCdWcKcmVwb3J0cyBmcm9tIHVzZXJzIGFyZSB0aGUgbWFpbiBkcml2ZSBiZWhpbmQgaW1wcm92ZW1lbnRzIHRvCkNvZGVNaXJyb3IuIEJ1dCBmaXJzdCwgcGxlYXNlIHJlYWQgb3ZlciB0aGVzZSBwb2ludHM6PC9wPgoKPG9sPgogIDxsaT5Db2RlTWlycm9yIGlzIG1haW50YWluZWQgYnkgdm9sdW50ZWVycy4gVGhleSBkb24ndCBvd2UgeW91CiAgYW55dGhpbmcsIHNvIGJlIHBvbGl0ZS4gUmVwb3J0cyB3aXRoIGFuIGluZGlnbmFudCBvciBiZWxsaWdlcmVudAogIHRvbmUgdGVuZCB0byBiZSBtb3ZlZCB0byB0aGUgYm90dG9tIG9mIHRoZSBwaWxlLjwvbGk+CgogIDxsaT5JbmNsdWRlIGluZm9ybWF0aW9uIGFib3V0IDxzdHJvbmc+dGhlIGJyb3dzZXIgaW4gd2hpY2ggdGhlCiAgcHJvYmxlbSBvY2N1cnJlZDwvc3Ryb25nPi4gRXZlbiBpZiB5b3UgdGVzdGVkIHNldmVyYWwgYnJvd3NlcnMsIGFuZAogIHRoZSBwcm9ibGVtIG9jY3VycmVkIGluIGFsbCBvZiB0aGVtLCBtZW50aW9uIHRoaXMgZmFjdCBpbiB0aGUgYnVnCiAgcmVwb3J0LiBBbHNvIGluY2x1ZGUgYnJvd3NlciB2ZXJzaW9uIG51bWJlcnMgYW5kIHRoZSBvcGVyYXRpbmcKICBzeXN0ZW0gdGhhdCB5b3UncmUgb24uPC9saT4KCiAgPGxpPk1lbnRpb24gd2hpY2ggcmVsZWFzZSBvZiBDb2RlTWlycm9yIHlvdSdyZSB1c2luZy4gUHJlZmVyYWJseSwKICB0cnkgYWxzbyB3aXRoIHRoZSBjdXJyZW50IGRldmVsb3BtZW50IHNuYXBzaG90LCB0byBlbnN1cmUgdGhlCiAgcHJvYmxlbSBoYXMgbm90IGFscmVhZHkgYmVlbiBmaXhlZC48L2xpPgoKICA8bGk+TWVudGlvbiB2ZXJ5IHByZWNpc2VseSB3aGF0IHdlbnQgd3JvbmcuICJYIGlzIGJyb2tlbiIgaXMgbm90IGEKICBnb29kIGJ1ZyByZXBvcnQuIFdoYXQgZGlkIHlvdSBleHBlY3QgdG8gaGFwcGVuPyBXaGF0IGhhcHBlbmVkCiAgaW5zdGVhZD8gRGVzY3JpYmUgdGhlIGV4YWN0IHN0ZXBzIGEgbWFpbnRhaW5lciBoYXMgdG8gdGFrZSB0byBtYWtlCiAgdGhlIHByb2JsZW0gb2NjdXIuIFdlIGNhbiBub3QgZml4IHNvbWV0aGluZyB0aGF0IHdlIGNhbiBub3QKICBvYnNlcnZlLjwvbGk+CgogIDxsaT5JZiB0aGUgcHJvYmxlbSBjYW4gbm90IGJlIHJlcHJvZHVjZWQgaW4gYW55IG9mIHRoZSBkZW1vcwogIGluY2x1ZGVkIGluIHRoZSBDb2RlTWlycm9yIGRpc3RyaWJ1dGlvbiwgcGxlYXNlIHByb3ZpZGUgYW4gSFRNTAogIGRvY3VtZW50IHRoYXQgZGVtb25zdHJhdGVzIHRoZSBwcm9ibGVtLiBUaGUgYmVzdCB3YXkgdG8gZG8gdGhpcyBpcwogIHRvIGdvIHRvIDxhIGhyZWY9Imh0dHA6Ly9qc2Jpbi5jb20vaWh1bmluLzEvZWRpdCI+anNiaW4uY29tPC9hPiwgZW50ZXIKICBpdCB0aGVyZSwgcHJlc3Mgc2F2ZSwgYW5kIGluY2x1ZGUgdGhlIHJlc3VsdGluZyBsaW5rIGluIHlvdXIgYnVnCiAgcmVwb3J0LjwvbGk+Cjwvb2w+Cgo8L2Rpdj4KCjwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/doc/upgrade_v2.2.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogVmVyc2lvbiAyLjIgdXBncmFkZSBndWlkZTwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9ImRvY3MuY3NzIj4KCjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGgxPkNvZGVNaXJyb3I8L2gxPjxpbWcgaWQ9bG9nbyBzcmM9ImxvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Im1hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+Mi4yIHVwZ3JhZGUgZ3VpZGU8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KCjxoMj5VcGdyYWRpbmcgdG8gdjIuMjwvaDI+Cgo8cD5UaGVyZSBhcmUgYSBmZXcgdGhpbmdzIGluIHRoZSAyLjIgcmVsZWFzZSB0aGF0IHJlcXVpcmUgc29tZSBjYXJlCndoZW4gdXBncmFkaW5nLjwvcD4KCjxoMz5ObyBtb3JlIGRlZmF1bHQuY3NzPC9oMz4KCjxwPlRoZSBkZWZhdWx0IHRoZW1lIGlzIG5vdyBpbmNsdWRlZAppbiA8YSBocmVmPSIuLi9saWIvY29kZW1pcnJvci5jc3MiPjxjb2RlPmNvZGVtaXJyb3IuY3NzPC9jb2RlPjwvYT4sIHNvCnlvdSBkbyBub3QgaGF2ZSB0byBpbmNsdWRlZCBpdCBzZXBhcmF0ZWx5IGFueW1vcmUuIChJdCB3YXMgdGlueSwgc28KZXZlbiBpZiB5b3UncmUgbm90IHVzaW5nIGl0LCB0aGUgZXh0cmEgZGF0YSBvdmVyaGVhZCBpcyBuZWdsaWdpYmxlLikKCjxoMz5EaWZmZXJlbnQga2V5IGN1c3RvbWl6YXRpb248L2gzPgoKPHA+Q29kZU1pcnJvciBoYXMgbW92ZWQgdG8gYSBzeXN0ZW0Kd2hlcmUgPGEgaHJlZj0ibWFudWFsLmh0bWwjb3B0aW9uX2tleU1hcCI+a2V5bWFwczwvYT4gYXJlIHVzZWQgdG8KYmluZCBiZWhhdmlvciB0byBrZXlzLiBUaGlzIG1lYW5zIDxhIGhyZWY9Ii4uL2RlbW8vZW1hY3MuaHRtbCI+Y3VzdG9tCmJpbmRpbmdzPC9hPiBhcmUgbm93IHBvc3NpYmxlLjwvcD4KCjxwPlRocmVlIG9wdGlvbnMgdGhhdCBpbmZsdWVuY2VkIGtleQpiZWhhdmlvciwgPGNvZGU+dGFiTW9kZTwvY29kZT4sIDxjb2RlPmVudGVyTW9kZTwvY29kZT4sCmFuZCA8Y29kZT5zbWFydEhvbWU8L2NvZGU+LCBhcmUgbm8gbG9uZ2VyIHN1cHBvcnRlZC4gSW5zdGVhZCwgeW91IGNhbgpwcm92aWRlIGN1c3RvbSBiaW5kaW5ncyB0byBpbmZsdWVuY2UgdGhlIHdheSB0aGVzZSBrZXlzIGFjdC4gVGhpcyBpcwpkb25lIHRocm91Z2ggdGhlCm5ldyA8YSBocmVmPSJtYW51YWwuaHRtbCNvcHRpb25fZXh0cmFLZXlzIj48Y29kZT5leHRyYUtleXM8L2NvZGU+PC9hPgpvcHRpb24sIHdoaWNoIGNhbiBob2xkIGFuIG9iamVjdCBtYXBwaW5nIGtleSBuYW1lcyB0byBmdW5jdGlvbmFsaXR5LiBBCnNpbXBsZSBleGFtcGxlIHdvdWxkIGJlOjwvcD4KCjxwcmU+ICBleHRyYUtleXM6IHsKICAgICJDdHJsLVMiOiBmdW5jdGlvbihpbnN0YW5jZSkgeyBzYXZlVGV4dChpbnN0YW5jZS5nZXRWYWx1ZSgpKTsgfSwKICAgICJDdHJsLS8iOiAidW5kbyIKICB9PC9wcmU+Cgo8cD5LZXlzIGNhbiBiZSBtYXBwZWQgZWl0aGVyIHRvIGZ1bmN0aW9ucywgd2hpY2ggd2lsbCBiZSBnaXZlbiB0aGUKZWRpdG9yIGluc3RhbmNlIGFzIGFyZ3VtZW50LCBvciB0byBzdHJpbmdzLCB3aGljaCBhcmUgbWFwcGVkIHRocm91Z2gKZnVuY3Rpb25zIHRocm91Z2ggdGhlIDxjb2RlPkNvZGVNaXJyb3IuY29tbWFuZHM8L2NvZGU+IHRhYmxlLCB3aGljaApjb250YWlucyBhbGwgdGhlIGJ1aWx0LWluIGVkaXRpbmcgY29tbWFuZHMsIGFuZCBjYW4gYmUgaW5zcGVjdGVkIGFuZApleHRlbmRlZCBieSBleHRlcm5hbCBjb2RlLjwvcD4KCjxwPkJ5IGRlZmF1bHQsIHRoZSA8Y29kZT5Ib21lPC9jb2RlPiBrZXkgaXMgYm91bmQgdG8KdGhlIDxjb2RlPiJnb0xpbmVTdGFydFNtYXJ0IjwvY29kZT4gY29tbWFuZCwgd2hpY2ggbW92ZXMgdGhlIGN1cnNvciB0bwp0aGUgZmlyc3Qgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyIG9uIHRoZSBsaW5lLiBZb3UgY2FuIHNldCBkbyB0aGlzIHRvCm1ha2UgaXQgYWx3YXlzIGdvIHRvIHRoZSB2ZXJ5IHN0YXJ0IGluc3RlYWQ6PC9wPgoKPHByZT4gIGV4dHJhS2V5czogeyJIb21lIjogImdvTGluZVN0YXJ0In08L3ByZT4KCjxwPlNpbWlsYXJseSwgPGNvZGU+RW50ZXI8L2NvZGU+IGlzIGJvdW5kCnRvIDxjb2RlPiJuZXdsaW5lQW5kSW5kZW50IjwvY29kZT4gYnkgZGVmYXVsdC4gWW91IGNhbiBiaW5kIGl0IHRvCnNvbWV0aGluZyBlbHNlIHRvIGdldCBkaWZmZXJlbnQgYmVoYXZpb3IuIFRvIGRpc2FibGUgc3BlY2lhbCBoYW5kbGluZwpjb21wbGV0ZWx5IGFuZCBvbmx5IGdldCBhIG5ld2xpbmUgY2hhcmFjdGVyIGluc2VydGVkLCB5b3UgY2FuIGJpbmQgaXQKdG8gPGNvZGU+ZmFsc2U8L2NvZGU+OjwvcD4KCjxwcmU+ICBleHRyYUtleXM6IHsiRW50ZXIiOiBmYWxzZX08L3ByZT4KCjxwPlRoZSBzYW1lIHdvcmtzIGZvciA8Y29kZT5UYWI8L2NvZGU+LiBJZiB5b3UgZG9uJ3Qgd2FudCBDb2RlTWlycm9yCnRvIGhhbmRsZSBpdCwgYmluZCBpdCB0byA8Y29kZT5mYWxzZTwvY29kZT4uIFRoZSBkZWZhdWx0IGJlaGF2aW91ciBpcwp0byBpbmRlbnQgdGhlIGN1cnJlbnQgbGluZSBtb3JlICg8Y29kZT4iaW5kZW50TW9yZSI8L2NvZGU+IGNvbW1hbmQpLAphbmQgaW5kZW50IGl0IGxlc3Mgd2hlbiBzaGlmdCBpcyBoZWxkICg8Y29kZT4iaW5kZW50TGVzcyI8L2NvZGU+KS4KVGhlcmUgYXJlIGFsc28gPGNvZGU+ImluZGVudEF1dG8iPC9jb2RlPiAoc21hcnQgaW5kZW50KQphbmQgPGNvZGU+Imluc2VydFRhYiI8L2NvZGU+IGNvbW1hbmRzIHByb3ZpZGVkIGZvciBhbHRlcm5hdGUKYmVoYXZpb3JzLiBPciB5b3UgY2FuIHdyaXRlIHlvdXIgb3duIGhhbmRsZXIgZnVuY3Rpb24gdG8gZG8gc29tZXRoaW5nCmRpZmZlcmVudCBhbHRvZ2V0aGVyLjwvcD4KCjxoMz5UYWJzPC9oMz4KCjxwPkhhbmRsaW5nIG9mIHRhYnMgY2hhbmdlZCBjb21wbGV0ZWx5LiBUaGUgZGlzcGxheSB3aWR0aCBvZiB0YWJzIGNhbgpub3cgYmUgc2V0IHdpdGggdGhlIDxjb2RlPnRhYlNpemU8L2NvZGU+IG9wdGlvbiwgYW5kIHRhYnMgY2FuCmJlIDxhIGhyZWY9Ii4uL2RlbW8vdmlzaWJsZXRhYnMuaHRtbCI+c3R5bGVkPC9hPiBieSBzZXR0aW5nIENTUyBydWxlcwpmb3IgdGhlIDxjb2RlPmNtLXRhYjwvY29kZT4gY2xhc3MuPC9wPgoKPHA+VGhlIGRlZmF1bHQgd2lkdGggZm9yIHRhYnMgaXMgbm93IDQsIGFzIG9wcG9zZWQgdG8gdGhlIDggdGhhdCBpcwpoYXJkLXdpcmVkIGludG8gYnJvd3NlcnMuIElmIHlvdSBhcmUgcmVseWluZyBvbiA4LXNwYWNlIHRhYnMsIG1ha2UKc3VyZSB5b3UgZXhwbGljaXRseSBzZXQgPGNvZGU+dGFiU2l6ZTogODwvY29kZT4gaW4geW91ciBvcHRpb25zLjwvcD4KCjwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/doc/upgrade_v3.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogVmVyc2lvbiAzIHVwZ3JhZGUgZ3VpZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSJkb2NzLmNzcyI+CjxzY3JpcHQgc3JjPSIuLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uL2FkZG9uL3J1bm1vZGUvcnVubW9kZS5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9hZGRvbi9ydW5tb2RlL2NvbG9yaXplLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL21vZGUvamF2YXNjcmlwdC9qYXZhc2NyaXB0LmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL21vZGUveG1sL3htbC5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9tb2RlL2Nzcy9jc3MuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vbW9kZS9odG1sbWl4ZWQvaHRtbG1peGVkLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9ImFjdGl2ZWJvb2ttYXJrLmpzIj48L3NjcmlwdD4KCjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGgxPkNvZGVNaXJyb3I8L2gxPjxpbWcgaWQ9bG9nbyBzcmM9ImxvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Im1hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iI3VwZ3JhZGUiPlVwZ3JhZGUgZ3VpZGU8L2E+CiAgICA8bGk+PGEgaHJlZj0iI2RvbSI+RE9NIHN0cnVjdHVyZTwvYT48L2xpPgogICAgPGxpPjxhIGhyZWY9IiNndXR0ZXJzIj5HdXR0ZXIgbW9kZWw8L2E+PC9saT4KICAgIDxsaT48YSBocmVmPSIjZXZlbnRzIj5FdmVudCBoYW5kbGluZzwvYT48L2xpPgogICAgPGxpPjxhIGhyZWY9IiNtYXJrdGV4dCI+bWFya1RleHQgbWV0aG9kIGFyZ3VtZW50czwvYT48L2xpPgogICAgPGxpPjxhIGhyZWY9IiNmb2xkaW5nIj5MaW5lIGZvbGRpbmc8L2E+PC9saT4KICAgIDxsaT48YSBocmVmPSIjbGluZWNsYXNzIj5MaW5lIENTUyBjbGFzc2VzPC9hPjwvbGk+CiAgICA8bGk+PGEgaHJlZj0iI3Bvc2l0aW9ucyI+UG9zaXRpb24gcHJvcGVydGllczwvYT48L2xpPgogICAgPGxpPjxhIGhyZWY9IiNtYXRjaGJyYWNrZXRzIj5CcmFja2V0IG1hdGNoaW5nPC9hPjwvbGk+CiAgICA8bGk+PGEgaHJlZj0iI21vZGVzIj5Nb2RlIG1hbmFnZW1lbnQ8L2E+PC9saT4KICAgIDxsaT48YSBocmVmPSIjbmV3Ij5OZXcgZmVhdHVyZXM8L2E+PC9saT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgoKPGgyIGlkPXVwZ3JhZGU+VXBncmFkaW5nIHRvIHZlcnNpb24gMzwvaDI+Cgo8cD5WZXJzaW9uIDMgZG9lcyBub3QgZGVwYXJ0IHRvbyBtdWNoIGZyb20gMi54IEFQSSwgYW5kIHNpdGVzIHRoYXQgdXNlCkNvZGVNaXJyb3IgaW4gYSB2ZXJ5IHNpbXBsZSB3YXkgbWlnaHQgYmUgYWJsZSB0byB1cGdyYWRlIHdpdGhvdXQKdHJvdWJsZS4gQnV0IGl0IGRvZXMgaW50cm9kdWNlIGEgbnVtYmVyIG9mIGluY29tcGF0aWJpbGl0aWVzLiBQbGVhc2UKYXQgbGVhc3Qgc2tpbSB0aGlzIHRleHQgYmVmb3JlIHVwZ3JhZGluZy48L3A+Cgo8cD5Ob3RlIHRoYXQgPHN0cm9uZz52ZXJzaW9uIDMgZHJvcHMgZnVsbCBzdXBwb3J0IGZvciBJbnRlcm5ldApFeHBsb3JlciA3PC9zdHJvbmc+LiBUaGUgZWRpdG9yIHdpbGwgbW9zdGx5IHdvcmsgb24gdGhhdCBicm93c2VyLCBidXQKaXQnbGwgYmUgc2lnbmlmaWNhbnRseSBnbGl0Y2h5LjwvcD4KCjxzZWN0aW9uIGlkPWRvbT4KICA8aDI+RE9NIHN0cnVjdHVyZTwvaDI+Cgo8cD5UaGlzIG9uZSBpcyB0aGUgbW9zdCBsaWtlbHkgdG8gY2F1c2UgcHJvYmxlbXMuIFRoZSBpbnRlcm5hbApzdHJ1Y3R1cmUgb2YgdGhlIGVkaXRvciBoYXMgY2hhbmdlZCBxdWl0ZSBhIGxvdCwgbW9zdGx5IHRvIGltcGxlbWVudCBhCm5ldyBzY3JvbGxpbmcgbW9kZWwuPC9wPgoKPHA+RWRpdG9yIGhlaWdodCBpcyBub3cgc2V0IG9uIHRoZSBvdXRlciB3cmFwcGVyIGVsZW1lbnQgKENTUwpjbGFzcyA8Y29kZT5Db2RlTWlycm9yPC9jb2RlPiksIG5vdCBvbiB0aGUgc2Nyb2xsZXIgZWxlbWVudAooPGNvZGU+Q29kZU1pcnJvci1zY3JvbGw8L2NvZGU+KS48L3A+Cgo8cD5PdGhlciBub2RlcyB3ZXJlIG1vdmVkLCBkcm9wcGVkLCBhbmQgYWRkZWQuIElmIHlvdSBoYXZlIGFueSBjb2RlCnRoYXQgbWFrZXMgYXNzdW1wdGlvbnMgYWJvdXQgdGhlIGludGVybmFsIERPTSBzdHJ1Y3R1cmUgb2YgdGhlIGVkaXRvciwKeW91J2xsIGhhdmUgdG8gcmUtdGVzdCBpdCBhbmQgcHJvYmFibHkgdXBkYXRlIGl0IHRvIHdvcmsgd2l0aCB2My48L3A+Cgo8cD5TZWUgdGhlIDxhIGhyZWY9Im1hbnVhbC5odG1sI3N0eWxpbmciPnN0eWxpbmcgc2VjdGlvbjwvYT4gb2YgdGhlCm1hbnVhbCBmb3IgbW9yZSBpbmZvcm1hdGlvbi48L3A+Cjwvc2VjdGlvbj4KPHNlY3Rpb24gaWQ9Z3V0dGVycz4KICA8aDI+R3V0dGVyIG1vZGVsPC9oMj4KCjxwPkluIENvZGVNaXJyb3IgMi54LCB0aGVyZSB3YXMgYSBzaW5nbGUgZ3V0dGVyLCBhbmQgbGluZSBtYXJrZXJzCmNyZWF0ZWQgd2l0aCA8Y29kZT5zZXRNYXJrZXI8L2NvZGU+IHdvdWxkIGhhdmUgdG8gc29tZWhvdyBjb2V4aXN0IHdpdGgKdGhlIGxpbmUgbnVtYmVycyAoaWYgcHJlc2VudCkuIFZlcnNpb24gMyBhbGxvd3MgeW91IHRvIHNwZWNpZnkgYW4KYXJyYXkgb2YgZ3V0dGVycywgPGEgaHJlZj0ibWFudWFsLmh0bWwjb3B0aW9uX2d1dHRlcnMiPmJ5IGNsYXNzCm5hbWU8L2E+LAp1c2UgPGEgaHJlZj0ibWFudWFsLmh0bWwjc2V0R3V0dGVyTWFya2VyIj48Y29kZT5zZXRHdXR0ZXJNYXJrZXI8L2NvZGU+PC9hPgp0byBhZGQgb3IgcmVtb3ZlIG1hcmtlcnMgaW4gaW5kaXZpZHVhbCBndXR0ZXJzLCBhbmQgY2xlYXIgd2hvbGUKZ3V0dGVycwp3aXRoIDxhIGhyZWY9Im1hbnVhbC5odG1sI2NsZWFyR3V0dGVyIj48Y29kZT5jbGVhckd1dHRlcjwvY29kZT48L2E+LgpHdXR0ZXIgbWFya2VycyBhcmUgbm93IHNwZWNpZmllZCBhcyBET00gbm9kZXMsIHJhdGhlciB0aGFuIEhUTUwKc25pcHBldHMuPC9wPgoKPHA+VGhlIGd1dHRlcnMgbm8gbG9uZ2VyIGhvcml6b250YWxseSBzY3JvbGxzIGFsb25nIHdpdGggdGhlIGNvbnRlbnQuClRoZSA8Y29kZT5maXhlZEd1dHRlcjwvY29kZT4gb3B0aW9uIHdhcyByZW1vdmVkIChzaW5jZSBpdCBpcyBub3cgdGhlCm9ubHkgYmVoYXZpb3IpLjwvcD4KCjxwcmUgZGF0YS1sYW5nPSJ0ZXh0L2h0bWwiPgombHQ7c3R5bGU+CiAgLyogRGVmaW5lIGEgZ3V0dGVyIHN0eWxlICovCiAgLm5vdGUtZ3V0dGVyIHsgd2lkdGg6IDNlbTsgYmFja2dyb3VuZDogY3lhbjsgfQombHQ7L3N0eWxlPgombHQ7c2NyaXB0PgogIC8vIENyZWF0ZSBhbiBpbnN0YW5jZSB3aXRoIHR3byBndXR0ZXJzIC0tIGxpbmUgbnVtYmVycyBhbmQgbm90ZXMKICB2YXIgY20gPSBuZXcgQ29kZU1pcnJvcihkb2N1bWVudC5ib2R5LCB7CiAgICBndXR0ZXJzOiBbIm5vdGUtZ3V0dGVyIiwgIkNvZGVNaXJyb3ItbGluZW51bWJlcnMiXSwKICAgIGxpbmVOdW1iZXJzOiB0cnVlCiAgfSk7CiAgLy8gQWRkIGEgbm90ZSB0byBsaW5lIDAKICBjbS5zZXRHdXR0ZXJNYXJrZXIoMCwgIm5vdGUtZ3V0dGVyIiwgZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoImhpIikpOwombHQ7L3NjcmlwdD4KPC9wcmU+Cjwvc2VjdGlvbj4KPHNlY3Rpb24gaWQ9ZXZlbnRzPgogIDxoMj5FdmVudCBoYW5kbGluZzwvaDI+Cgo8cD5Nb3N0IG9mIHRoZSA8Y29kZT5vblhZWjwvY29kZT4gb3B0aW9ucyBoYXZlIGJlZW4gcmVtb3ZlZC4gVGhlIHNhbWUKZWZmZWN0IGlzIG5vdyBvYnRhaW5lZCBieSBjYWxsaW5nCnRoZSA8YSBocmVmPSJtYW51YWwuaHRtbCNvbiI+PGNvZGU+b248L2NvZGU+PC9hPiBtZXRob2Qgd2l0aCBhIHN0cmluZwppZGVudGlmeWluZyB0aGUgZXZlbnQgdHlwZS4gTXVsdGlwbGUgaGFuZGxlcnMgY2FuIG5vdyBiZSByZWdpc3RlcmVkCihhbmQgaW5kaXZpZHVhbGx5IHVucmVnaXN0ZXJlZCkgZm9yIGFuIGV2ZW50LCBhbmQgb2JqZWN0cyBzdWNoIGFzIGxpbmUKaGFuZGxlcnMgbm93IGFsc28gZXhwb3NlIGV2ZW50cy4gU2VlIDxhIGhyZWY9Im1hbnVhbC5odG1sI2V2ZW50cyI+dGhlCmZ1bGwgbGlzdCBoZXJlPC9hPi48L3A+Cgo8cD4oVGhlIDxjb2RlPm9uS2V5RXZlbnQ8L2NvZGU+IGFuZCA8Y29kZT5vbkRyYWdFdmVudDwvY29kZT4gb3B0aW9ucywKd2hpY2ggYWN0IG1vcmUgYXMgaG9va3MgdGhhbiBhcyBldmVudCBoYW5kbGVycywgYXJlIHN0aWxsIHRoZXJlIGluCnRoZWlyIG9sZCBmb3JtLik8L3A+Cgo8cHJlIGRhdGEtbGFuZz0iamF2YXNjcmlwdCI+CmNtLm9uKCJjaGFuZ2UiLCBmdW5jdGlvbihjbSwgY2hhbmdlKSB7CiAgY29uc29sZS5sb2coInNvbWV0aGluZyBjaGFuZ2VkISAoIiArIGNoYW5nZS5vcmlnaW4gKyAiKSIpOwp9KTsKPC9wcmU+Cjwvc2VjdGlvbj4KPHNlY3Rpb24gaWQ9bWFya3RleHQ+CiAgPGgyPm1hcmtUZXh0IG1ldGhvZCBhcmd1bWVudHM8L2gyPgoKPHA+VGhlIDxhIGhyZWY9Im1hbnVhbC5odG1sI21hcmtUZXh0Ij48Y29kZT5tYXJrVGV4dDwvY29kZT48L2E+IG1ldGhvZAood2hpY2ggaGFzIGdhaW5lZCBzb21lIGludGVyZXN0aW5nIG5ldyBmZWF0dXJlcywgc3VjaCBhcyBjcmVhdGluZwphdG9taWMgYW5kIHJlYWQtb25seSBzcGFucywgb3IgcmVwbGFjaW5nIHNwYW5zIHdpdGggd2lkZ2V0cykgbm8gbG9uZ2VyCnRha2VzIHRoZSBDU1MgY2xhc3MgbmFtZSBhcyBhIHNlcGFyYXRlIGFyZ3VtZW50LCBidXQgbWFrZXMgaXQgYW4Kb3B0aW9uYWwgZmllbGQgaW4gdGhlIG9wdGlvbnMgb2JqZWN0IGluc3RlYWQuPC9wPgoKPHByZSBkYXRhLWxhbmc9ImphdmFzY3JpcHQiPgovLyBTdHlsZSBmaXJzdCB0ZW4gbGluZXMsIGFuZCBmb3JiaWQgdGhlIGN1cnNvciBmcm9tIGVudGVyaW5nIHRoZW0KY20ubWFya1RleHQoe2xpbmU6IDAsIGNoOiAwfSwge2xpbmU6IDEwLCBjaDogMH0sIHsKICBjbGFzc05hbWU6ICJtYWdpYy10ZXh0IiwKICBpbmNsdXNpdmVMZWZ0OiB0cnVlLAogIGF0b21pYzogdHJ1ZQp9KTsKPC9wcmU+Cjwvc2VjdGlvbj4KPHNlY3Rpb24gaWQ9Zm9sZGluZz4KICA8aDI+TGluZSBmb2xkaW5nPC9oMj4KCjxwPlRoZSBpbnRlcmZhY2UgZm9yIGhpZGluZyBsaW5lcyBoYXMgYmVlbgpyZW1vdmVkLiA8YSBocmVmPSJtYW51YWwuaHRtbCNtYXJrVGV4dCI+PGNvZGU+bWFya1RleHQ8L2NvZGU+PC9hPiBjYW4Kbm93IGJlIHVzZWQgdG8gZG8gdGhlIHNhbWUgaW4gYSBtb3JlIGZsZXhpYmxlIGFuZCBwb3dlcmZ1bCB3YXkuPC9wPgoKPHA+VGhlIDxhIGhyZWY9Ii4uL2RlbW8vZm9sZGluZy5odG1sIj5mb2xkaW5nIHNjcmlwdDwvYT4gaGFzIGJlZW4KdXBkYXRlZCB0byB1c2UgdGhlIG5ldyBpbnRlcmZhY2UsIGFuZCBzaG91bGQgbm93IGJlIG1vcmUgcm9idXN0LjwvcD4KCjxwcmUgZGF0YS1sYW5nPSJqYXZhc2NyaXB0Ij4KLy8gRm9sZCBhIHJhbmdlLCByZXBsYWNpbmcgaXQgd2l0aCB0aGUgdGV4dCAiPz8iCnZhciByYW5nZSA9IGNtLm1hcmtUZXh0KHtsaW5lOiA0LCBjaDogMn0sIHtsaW5lOiA4LCBjaDogMX0sIHsKICByZXBsYWNlZFdpdGg6IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCI/PyIpLAogIC8vIEF1dG8tdW5mb2xkIHdoZW4gY3Vyc29yIG1vdmVzIGludG8gdGhlIHJhbmdlCiAgY2xlYXJPbkVudGVyOiB0cnVlCn0pOwovLyBHZXQgbm90aWZpZWQgd2hlbiBhdXRvLXVuZm9sZGluZwpDb2RlTWlycm9yLm9uKHJhbmdlLCAiY2xlYXIiLCBmdW5jdGlvbigpIHsKICBjb25zb2xlLmxvZygiYm9vbSIpOwp9KTsKPC9wcmU+Cjwvc2VjdGlvbj4KPHNlY3Rpb24gaWQ9bGluZWNsYXNzPgogIDxoMj5MaW5lIENTUyBjbGFzc2VzPC9oMj4KCjxwPlRoZSA8Y29kZT5zZXRMaW5lQ2xhc3M8L2NvZGU+IG1ldGhvZCBoYXMgYmVlbiByZXBsYWNlZApieSA8YSBocmVmPSJtYW51YWwuaHRtbCNhZGRMaW5lQ2xhc3MiPjxjb2RlPmFkZExpbmVDbGFzczwvY29kZT48L2E+CmFuZCA8YSBocmVmPSJtYW51YWwuaHRtbCNyZW1vdmVMaW5lQ2xhc3MiPjxjb2RlPnJlbW92ZUxpbmVDbGFzczwvY29kZT48L2E+LAp3aGljaCBhbGxvdyBtb3JlIG1vZHVsYXIgY29udHJvbCBvdmVyIHRoZSBjbGFzc2VzIGF0dGFjaGVkIHRvIGEgbGluZS48L3A+Cgo8cHJlIGRhdGEtbGFuZz0iamF2YXNjcmlwdCI+CnZhciBtYXJrZWQgPSBjbS5hZGRMaW5lQ2xhc3MoMTAsICJiYWNrZ3JvdW5kIiwgImhpZ2hsaWdodGVkLWxpbmUiKTsKc2V0VGltZW91dChmdW5jdGlvbigpIHsKICBjbS5yZW1vdmVMaW5lQ2xhc3MobWFya2VkLCAiYmFja2dyb3VuZCIsICJoaWdobGlnaHRlZC1saW5lIik7Cn0pOwo8L3ByZT4KPC9zZWN0aW9uPgo8c2VjdGlvbiBpZD1wb3NpdGlvbnM+CiAgPGgyPlBvc2l0aW9uIHByb3BlcnRpZXM8L2gyPgoKPHA+QWxsIG1ldGhvZHMgdGhhdCB0YWtlIG9yIHJldHVybiBvYmplY3RzIHRoYXQgcmVwcmVzZW50IHNjcmVlbgpwb3NpdGlvbnMgbm93IHVzZSA8Y29kZT57bGVmdCwgdG9wLCBib3R0b20sIHJpZ2h0fTwvY29kZT4gcHJvcGVydGllcwoobm90IGFsd2F5cyBhbGwgb2YgdGhlbSkgaW5zdGVhZCBvZiB0aGUgPGNvZGU+e3gsIHksIHlCb3R9PC9jb2RlPiB1c2VkCmJ5IHNvbWUgbWV0aG9kcyBpbiB2Mi54LjwvcD4KCjxwPkFmZmVjdGVkIG1ldGhvZHMKYXJlIDxhIGhyZWY9Im1hbnVhbC5odG1sI2N1cnNvckNvb3JkcyI+PGNvZGU+Y3Vyc29yQ29vcmRzPC9jb2RlPjwvYT4sIDxhIGhyZWY9Im1hbnVhbC5odG1sI2NoYXJDb29yZHMiPjxjb2RlPmNoYXJDb29yZHM8L2NvZGU+PC9hPiwgPGEgaHJlZj0ibWFudWFsLmh0bWwjY29vcmRzQ2hhciI+PGNvZGU+Y29vcmRzQ2hhcjwvY29kZT48L2E+LAphbmQgPGEgaHJlZj0ibWFudWFsLmh0bWwjZ2V0U2Nyb2xsSW5mbyI+PGNvZGU+Z2V0U2Nyb2xsSW5mbzwvY29kZT48L2E+LjwvcD4KPC9zZWN0aW9uPgo8c2VjdGlvbiBpZD1tYXRjaGJyYWNrZXRzPgogIDxoMj5CcmFja2V0IG1hdGNoaW5nIG5vIGxvbmdlciBpbiBjb3JlPC9oMj4KCjxwPlRoZSA8YSBocmVmPSJtYW51YWwuaHRtbCNhZGRvbl9tYXRjaGJyYWNrZXRzIj48Y29kZT5tYXRjaEJyYWNrZXRzPC9jb2RlPjwvYT4Kb3B0aW9uIGlzIG5vIGxvbmdlciBkZWZpbmVkIGluIHRoZSBjb3JlIGVkaXRvci4KTG9hZCA8Y29kZT5hZGRvbi9lZGl0L21hdGNoYnJhY2tldHMuanM8L2NvZGU+IHRvIGVuYWJsZSBpdC48L3A+Cjwvc2VjdGlvbj4KPHNlY3Rpb24gaWQ9bW9kZXM+CiAgPGgyPk1vZGUgbWFuYWdlbWVudDwvaDI+Cgo8cD5UaGUgPGNvZGU+Q29kZU1pcnJvci5saXN0TW9kZXM8L2NvZGU+CmFuZCA8Y29kZT5Db2RlTWlycm9yLmxpc3RNSU1FczwvY29kZT4gZnVuY3Rpb25zLCB1c2VkIGZvciBsaXN0aW5nCmRlZmluZWQgbW9kZXMsIGFyZSBnb25lLiBZb3UgYXJlIG5vdyBlbmNvdXJhZ2VkIHRvIHNpbXBseQppbnNwZWN0IDxjb2RlPkNvZGVNaXJyb3IubW9kZXM8L2NvZGU+IChtYXBwaW5nIG1vZGUgbmFtZXMgdG8gbW9kZQpjb25zdHJ1Y3RvcnMpIGFuZCA8Y29kZT5Db2RlTWlycm9yLm1pbWVNb2RlczwvY29kZT4gKG1hcHBpbmcgTUlNRQpzdHJpbmdzIHRvIG1vZGUgc3BlY3MpLjwvcD4KPC9zZWN0aW9uPgo8c2VjdGlvbiBpZD1uZXc+CiAgPGgyPk5ldyBmZWF0dXJlczwvaDI+Cgo8cD5Tb21lIG1vcmUgcmVhc29ucyB0byB1cGdyYWRlIHRvIHZlcnNpb24gMy48L3A+Cgo8dWw+CiAgPGxpPkJpLWRpcmVjdGlvbmFsIHRleHQgc3VwcG9ydC4gQ29kZU1pcnJvciB3aWxsIG5vdyBtb3N0bHkgZG8gdGhlCiAgcmlnaHQgdGhpbmcgd2hlbiBlZGl0aW5nIEFyYWJpYyBvciBIZWJyZXcgdGV4dC48L2xpPgogIDxsaT5BcmJpdHJhcnkgbGluZSBoZWlnaHRzLiBVc2luZyBmb250cyB3aXRoIGRpZmZlcmVudCBoZWlnaHRzCiAgaW5zaWRlIHRoZSBlZGl0b3IgKHdoZXRoZXIgb2ZmIGJ5IG9uZSBwaXhlbCBvciBmaWZ0eSkgaXMgbm93CiAgc3VwcG9ydGVkIGFuZCBoYW5kbGVkIGdyYWNlZnVsbHkuPC9saT4KICA8bGk+SW4tbGluZSB3aWRnZXRzLiBTZWUgPGEgaHJlZj0iLi4vZGVtby93aWRnZXQuaHRtbCI+dGhlIGRlbW88L2E+CiAgYW5kIDxhIGhyZWY9Im1hbnVhbC5odG1sI2FkZExpbmVXaWRnZXQiPnRoZSBkb2NzPC9hPi48L2xpPgogIDxsaT5EZWZpbmluZyBjdXN0b20gb3B0aW9ucwogIHdpdGggPGEgaHJlZj0ibWFudWFsLmh0bWwjZGVmaW5lT3B0aW9uIj48Y29kZT5Db2RlTWlycm9yLmRlZmluZU9wdGlvbjwvY29kZT48L2E+LjwvbGk+CjwvdWw+Cjwvc2VjdGlvbj4KPC9hcnRpY2xlPgoKPHNjcmlwdD5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Q29kZU1pcnJvci5jb2xvcml6ZSgpO30sIDIwKTs8L3NjcmlwdD4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/doc/upgrade_v4.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogVmVyc2lvbiA0IHVwZ3JhZGUgZ3VpZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSJkb2NzLmNzcyI+CjxzY3JpcHQgc3JjPSJhY3RpdmVib29rbWFyay5qcyI+PC9zY3JpcHQ+Cgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxoMT5Db2RlTWlycm9yPC9oMT48aW1nIGlkPWxvZ28gc3JjPSJsb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSJtYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiN1cGdyYWRlIj5VcGdyYWRlIGd1aWRlPC9hPgogICAgPGxpPjxhIGhyZWY9IiNtdWx0aXNlbCI+TXVsdGlwbGUgc2VsZWN0aW9uczwvYT4KICAgIDxsaT48YSBocmVmPSIjYmVmb3JlU2VsZWN0aW9uQ2hhbmdlIj5UaGUgYmVmb3JlU2VsZWN0aW9uQ2hhbmdlIGV2ZW50PC9hPgogICAgPGxpPjxhIGhyZWY9IiNyZXBsYWNlU2VsZWN0aW9uIj5yZXBsYWNlU2VsZWN0aW9uIGFuZCBjb2xsYXBzaW5nPC9hPgogICAgPGxpPjxhIGhyZWY9IiNjaGFuZ2VFdmVudCI+Y2hhbmdlIGV2ZW50IGRhdGE8L2E+CiAgICA8bGk+PGEgaHJlZj0iI3Nob3dJZkhpZGRlbiI+c2hvd0lmSGlkZGVuIG9wdGlvbiB0byBsaW5lIHdpZGdldHM8L2E+CiAgICA8bGk+PGEgaHJlZj0iI21vZHVsZSI+TW9kdWxlIGxvYWRlcnM8L2E+CiAgICA8bGk+PGEgaHJlZj0iI3NoYXJlZGRhdGEiPk11dGF0aW5nIHNoYXJlZCBkYXRhIHN0cnVjdHVyZXM8L2E+PC9saT4KICAgIDxsaT48YSBocmVmPSIjZGVwcmVjYXRlZCI+RGVwcmVjYXRlZCBpbnRlcmZhY2VzIGRyb3BwZWQ8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KCjxoMiBpZD11cGdyYWRlPlVwZ3JhZGluZyB0byB2ZXJzaW9uIDQ8L2gyPgoKPHA+Q29kZU1pcnJvciA0J3MgaW50ZXJmYWNlIGlzIDxlbT52ZXJ5PC9lbT4gY2xvc2UgdmVyc2lvbiAzLCBidXQgaXQKZG9lcyBmaXggYSBmZXcgYXdrd2FyZCBkZXRhaWxzIGluIGEgYmFja3dhcmRzLWluY29tcGF0aWJsZSB3YXlzLiBBdApsZWFzdCBza2ltIHRoZSB0ZXh0IGJlbG93IGJlZm9yZSB1cGdyYWRpbmcuPC9wPgoKPHNlY3Rpb24gaWQ9bXVsdGlzZWw+PGgyPk11bHRpcGxlIHNlbGVjdGlvbnM8L2gyPgoKPHA+VGhlIG1haW4gbmV3IGZlYXR1cmUgaW4gdmVyc2lvbiA0IGlzIG11bHRpcGxlIHNlbGVjdGlvbnMuIFRoZQpzaW5nbGUtc2VsZWN0aW9uIHZhcmlhbnRzIG9mIG1ldGhvZHMgYXJlIHN0aWxsIHRoZXJlLCBidXQgbm93CnR5cGljYWxseSBhY3Qgb25seSBvbiB0aGUgPGVtPnByaW1hcnk8L2VtPiBzZWxlY3Rpb24gKHVzdWFsbHkgdGhlIGxhc3QKb25lIGFkZGVkKS48L3A+Cgo8cD5UaGUgZXhjZXB0aW9uIHRvIHRoaXMKaXMgPGEgaHJlZj0ibWFudWFsLmh0bWwjZ2V0U2VsZWN0aW9uIj48c3Ryb25nPjxjb2RlPmdldFNlbGVjdGlvbjwvY29kZT48L3N0cm9uZz48L2E+LAp3aGljaCB3aWxsIG5vdyByZXR1cm4gdGhlIGNvbnRlbnQgb2YgPGVtPmFsbDwvZW0+IHNlbGVjdGlvbnMKKHNlcGFyYXRlZCBieSBuZXdsaW5lcywgb3Igd2hhdGV2ZXIgPGNvZGU+bGluZVNlcDwvY29kZT4gcGFyYW1ldGVyIHlvdSBwYXNzZWQKaXQpLjwvcD4KCjwvc2VjdGlvbj4KCjxzZWN0aW9uIGlkPWJlZm9yZVNlbGVjdGlvbkNoYW5nZT48aDI+VGhlIGJlZm9yZVNlbGVjdGlvbkNoYW5nZSBldmVudDwvaDI+Cgo8cD5UaGlzIGV2ZW50IHN0aWxsIGV4aXN0cywgYnV0IHRoZSBvYmplY3QgaXQgaXMgcGFzc2VkIGhhcwphIDxhIGhyZWY9Im1hbnVhbC5odG1sI2V2ZW50X2JlZm9yZVNlbGVjdGlvbkNoYW5nZSI+Y29tcGxldGVseSBuZXcKaW50ZXJmYWNlPC9hPiwgYmVjYXVzZSBzdWNoIGNoYW5nZXMgbm93IGNvbmNlcm4gbXVsdGlwbGUKc2VsZWN0aW9ucy48L3A+Cgo8L3NlY3Rpb24+Cgo8c2VjdGlvbiBpZD1yZXBsYWNlU2VsZWN0aW9uPjxoMj5yZXBsYWNlU2VsZWN0aW9uJ3MgY29sbGFwc2luZyBiZWhhdmlvcjwvaDI+Cgo8cD5CeQpkZWZhdWx0LCA8YSBocmVmPSJtYW51YWwuaHRtbCNyZXBsYWNlU2VsZWN0aW9uIj48Y29kZT5yZXBsYWNlU2VsZWN0aW9uPC9jb2RlPjwvYT4Kd291bGQgbGVhdmUgdGhlIG5ld2x5IGluc2VydGVkIHRleHQgc2VsZWN0ZWQuIFRoaXMgaXMgb25seSByYXJlbHkgd2hhdAp5b3Ugd2FudCwgYW5kIGFsc28gKHNsaWdodGx5KSBtb3JlIGV4cGVuc2l2ZSBpbiB0aGUgbmV3IG1vZGVsLCBzbyB0aGUKZGVmYXVsdCB3YXMgY2hhbmdlZCB0byA8Y29kZT4iZW5kIjwvY29kZT4sIG1lYW5pbmcgdGhlIG9sZCBiZWhhdmlvcgptdXN0IGJlIGV4cGxpY2l0bHkgc3BlY2lmaWVkIGJ5IHBhc3NpbmcgYSBzZWNvbmQgYXJndW1lbnQKb2YgPGNvZGU+ImFyb3VuZCI8L2NvZGU+LjwvcD4KCjwvc2VjdGlvbj4KCjxzZWN0aW9uIGlkPWNoYW5nZUV2ZW50PjxoMj5jaGFuZ2UgZXZlbnQgZGF0YTwvaDI+Cgo8cD5SYXRoZXIgdGhhbiBmb3JjaW5nIGNsaWVudCBjb2RlIHRvIGZvbGxvdyA8Y29kZT5uZXh0PC9jb2RlPgpwb2ludGVycyBmcm9tIG9uZSBjaGFuZ2Ugb2JqZWN0IHRvIHRoZSBuZXh0LCB0aGUgbGlicmFyeSB3aWxsIG5vdwpzaW1wbHkgZmlyZQptdWx0aXBsZSA8YSBocmVmPSJtYW51YWwuaHRtbCNldmVudF9jaGFuZ2UiPjxjb2RlPiJjaGFuZ2UiPC9jb2RlPjwvYT4KZXZlbnRzLiBFeGlzdGluZyBjb2RlIHdpbGwgcHJvYmFibHkgY29udGludWUgdG8gd29yayB1bm1vZGlmaWVkLjwvcD4KCjwvc2VjdGlvbj4KCjxzZWN0aW9uIGlkPXNob3dJZkhpZGRlbj48aDI+c2hvd0lmSGlkZGVuIG9wdGlvbiB0byBsaW5lIHdpZGdldHM8L2gyPgoKPHA+VGhpcyBvcHRpb24sIHdoaWNoIGNvbmNlcHR1YWxseSBjYXVzZWQgbGluZSB3aWRnZXRzIHRvIGJlIHZpc2libGUKZXZlbiBpZiB0aGVpciBsaW5lIHdhcyBoaWRkZW4sIHdhcyBuZXZlciByZWFsbHkgd2VsbC1kZWZpbmVkLCBhbmQgd2FzCmJ1Z2d5IGZyb20gdGhlIHN0YXJ0LiBJdCB3b3VsZCBiZSBhIHJhdGhlciBleHBlbnNpdmUgZmVhdHVyZSwgYm90aCBpbgpjb2RlIGNvbXBsZXhpdHkgYW5kIHJ1bi10aW1lIHBlcmZvcm1hbmNlLCB0byBpbXBsZW1lbnQgcHJvcGVybHkuIEl0CmhhcyBiZWVuIGRyb3BwZWQgZW50aXJlbHkgaW4gNC4wLjwvcD4KCjwvc2VjdGlvbj4KCjxzZWN0aW9uIGlkPW1vZHVsZT48aDI+TW9kdWxlIGxvYWRlcnM8L2gyPgoKPHA+QWxsIG1vZHVsZXMgaW4gdGhlIENvZGVNaXJyb3IgZGlzdHJpYnV0aW9uIGFyZSBub3cgd3JhcHBlZCBpbiBhCnNoaW0gZnVuY3Rpb24gdG8gbWFrZSB0aGVtIGNvbXBhdGlibGUgd2l0aCBib3RoIEFNRAooPGEgaHJlZj0iaHR0cDovL3JlcXVpcmVqcy5vcmciPnJlcXVpcmVqczwvYT4pIGFuZCBDb21tb25KUyAoYXMgdXNlZApieSA8YSBocmVmPSJodHRwOi8vbm9kZWpzLm9yZy8iPm5vZGU8L2E+CmFuZCA8YSBocmVmPSJodHRwOi8vYnJvd3NlcmlmeS5vcmcvIj5icm93c2VyaWZ5PC9hPikgbW9kdWxlIGxvYWRlcnMuCldoZW4gbmVpdGhlciBvZiB0aGVzZSBpcyBwcmVzZW50LCB0aGV5IGZhbGwgYmFjayB0byBzaW1wbHkgdXNpbmcgdGhlCmdsb2JhbCA8Y29kZT5Db2RlTWlycm9yPC9jb2RlPiB2YXJpYWJsZS48L3A+Cgo8cD5JZiB5b3UgaGF2ZSBhIG1vZHVsZSBsb2FkZXIgcHJlc2VudCBpbiB5b3VyIGVudmlyb25tZW50LCBDb2RlTWlycm9yCndpbGwgYXR0ZW1wdCB0byB1c2UgaXQsIGFuZCB5b3UgbWlnaHQgbmVlZCB0byBjaGFuZ2UgdGhlIHdheSB5b3UgbG9hZApDb2RlTWlycm9yIG1vZHVsZXMuPC9wPgoKPC9zZWN0aW9uPgoKPHNlY3Rpb24gaWQ9c2hhcmVkZGF0YT48aDI+TXV0YXRpbmcgc2hhcmVkIGRhdGEgc3RydWN0dXJlczwvaDI+Cgo8cD5EYXRhIHN0cnVjdHVyZXMgcHJvZHVjZWQgYnkgdGhlIGxpYnJhcnkgc2hvdWxkIG5vdCBiZSBtdXRhdGVkCnVubGVzcyBleHBsaWNpdGx5IGFsbG93ZWQsIGluIGdlbmVyYWwuIFRoaXMgaXMgc2xpZ2h0bHkgbW9yZSBzdHJpY3QgaW4KNC4wIHRoYW4gaXQgd2FzIGluIGVhcmxpZXIgdmVyc2lvbnMsIHdoaWNoIGNvcGllZCB0aGUgcG9zaXRpb24gb2JqZWN0cwpyZXR1cm5lZCBieSA8YSBocmVmPSJtYW51YWwuaHRtbCNnZXRDdXJzb3IiPjxjb2RlPmdldEN1cnNvcjwvY29kZT48L2E+CmZvciBuZWJ1bG91cywgaGlzdG9yaWMgcmVhc29ucy4gSW4gNC4wLCBtdXRhdGluZyB0aGVzZQpvYmplY3RzIDxlbT53aWxsPC9lbT4gY29ycnVwdCB5b3VyIGVkaXRvcidzIHNlbGVjdGlvbi48L3A+Cgo8L3NlY3Rpb24+Cgo8c2VjdGlvbiBpZD1kZXByZWNhdGVkPjxoMj5EZXByZWNhdGVkIGludGVyZmFjZXMgZHJvcHBlZDwvaDI+Cgo8cD5BIGZldyBwcm9wZXJ0aWVzIGFuZCBtZXRob2RzIHRoYXQgaGF2ZSBiZWVuIGRlcHJlY2F0ZWQgZm9yIGEgd2hpbGUKYXJlIG5vdyBnb25lLiBNb3N0IG5vdGFibHksIHRoZSA8Y29kZT5vbktleUV2ZW50PC9jb2RlPgphbmQgPGNvZGU+b25EcmFnRXZlbnQ8L2NvZGU+IG9wdGlvbnMgKHVzZSB0aGUKY29ycmVzcG9uZGluZyA8YSBocmVmPSJtYW51YWwuaHRtbCNldmVudF9kb20iPmV2ZW50czwvYT4gaW5zdGVhZCkuPC9wPgoKPHA+VHdvIHNpbGx5IG1ldGhvZHMsIHdoaWNoIHdlcmUgbW9zdGx5IHRoZXJlIHRvIHN0YXkgY2xvc2UgdG8gdGhlIDAueApBUEksIDxjb2RlPnNldExpbmU8L2NvZGU+IGFuZCA8Y29kZT5yZW1vdmVMaW5lPC9jb2RlPiBhcmUgbm93IGdvbmUuClVzZSB0aGUgbW9yZQpmbGV4aWJsZSA8YSBocmVmPSJtYW51YWwuaHRtbCNyZXBsYWNlUmFuZ2UiPjxjb2RlPnJlcGxhY2VSYW5nZTwvY29kZT48L2E+Cm1ldGhvZCBpbnN0ZWFkLjwvcD4KCjxwPlRoZSBsb25nIG5hbWVzIGZvciBmb2xkaW5nIGFuZCBjb21wbGV0aW5nIGZ1bmN0aW9ucwooPGNvZGU+Q29kZU1pcnJvci5icmFjZVJhbmdlRmluZGVyPC9jb2RlPiwgPGNvZGU+Q29kZU1pcnJvci5qYXZhc2NyaXB0SGludDwvY29kZT4sCmV0YykgYXJlIGFsc28gZ29uZQoodXNlIDxjb2RlPkNvZGVNaXJyb3IuZm9sZC5icmFjZTwvY29kZT4sIDxjb2RlPkNvZGVNaXJyb3IuaGludC5qYXZhc2NyaXB0PC9jb2RlPikuPC9wPgoKPHA+VGhlIDxjb2RlPmNsYXNzTmFtZTwvY29kZT4gcHJvcGVydHkgaW4gdGhlIHJldHVybiB2YWx1ZQpvZiA8YSBocmVmPSJtYW51YWwuaHRtbCNnZXRUb2tlbkF0Ij48Y29kZT5nZXRUb2tlbkF0PC9jb2RlPjwvYT4sIHdoaWNoCmhhcyBiZWVuIHN1cGVyc2VkZWQgYnkgdGhlIDxjb2RlPnR5cGU8L2NvZGU+IHByb3BlcnR5LCBpcyBhbHNvIG5vCmxvbmdlciBwcmVzZW50LjwvcD4KCjwvc2VjdGlvbj4KPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/doc/yinyang.png</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[iVBORw0KGgoAAAANSUhEUgAAAHgAAAB4CAYAAAA5ZDbSAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAABJNAAASdAH9E0kdAAAAB3RJTUUH3wITCgccQQfgFQAAABl0RVh0Q29tbWVudABDcmVhdGVkIHdpdGggR0lNUFeBDhcAABGBSURBVHja7Z1dbBvXlcf/QzFixFgiaUmmbdki6Xjhr8Qapt14k8Vaw64FNA5akS8BYqQW2bcURUQVBermoSJfkhQ1Ygoo2qAoQKoPbZ9Kqkg/AHnNkdPsYrdYc5jYTrS2NWQsS5ZFhUPJpkqZ8t0Higxl65MczgwpHYCwJUv0lX5zPu+551KEENSSzLEsAYA0x2FREAqfzwoCFmIxaGm68Ll6sxkas7nwcSPDUKgxoaoVcIbnSToaxTzHIb30mo7H0XbyJABAS9Oo0+sLX6/W61FvNiPNcYXPLcRiyMRihY/vXL6MVpMJWpqGlqbRyDBo6OjoUhsMF7cBSyDpSIQkBgcxx7KYHhvDbqsVjQwDLU1DYzZDa7WK8eBgjmULD00x9EaGgb67GxqLhdoGLJIkQyEihEIYDwax02yG3m6HwW4XBeYmHiykOQ5zLIt4MIjWAwfQ4nSisbMTWquV2gZcgvmdGRxEIhBAnU4Ho9uNRoaBxmJRiiVBIhCAEAoBFIUWpxPNPT3K1GxCiGJeqUuXyFhPDwk3NpKxs2fJgytXyOPy4MoVMhsOk4dffkmUIA+uXCFjZ8/m1tzTQ1KXLhEl/U4VocGz4TCZ9HqR4Xns9Xiwg2EwvxRAzbEs7kUiWJidXfX7d3d0FAKjvK+UWrLJJGYCAUz5fKgzGGB0u9HidFJb2kRneJ7EXK4C2DqDATOBAOJDQ2W9b31TE0wuF1p6eiT11UUPLCY8HizE4zD7/Wiy2agtBTjD82TC60X8D3/AkXfewWIigVsXLqyppaVKq8kEo9udj34lBx1zOqGxWLCnv18W0JIDnvL5yLVz52BoakKLy4XYBx9UBOxKWv1sXx/2ejySP9AJvx8THg8abTbsv3BB0rxaMsAZnie3HA5M3biBR+m0bG6h1WTKm03JffSUz4cxnw/PBQIwOBxUzQCe8HjI6Lvv4tHCgmKyhwM9Pdh/4QLUBoMsZlvvcGBvf3/FtVlV4af21Gdf/zoZ/dnPkFUQXAAYGxzEqM2GbDIp6f/bZLPhKMcBhOC61TqcjkRIVWpwOhIh//3yy7l8LJNRbKVnd0cHLH6/bNH2le5uPDcwgBaXi6oawFM+H7n+ox8pyiSvF4B9jWVlgZyORHDTbkeLy4W9Hg+leMBjZ86QLz78EItzc6gmkRNyNpnEKMNAa7XCEgiIClm1DTcnC7Oz4F0uyX0yAKgNBhxiWYAQXKNpkk0mTykKcDaZPDV25gyZ+stfqhJuXu5Go5iQIU/OQ7YMDkLb0YFRm21YMSY6m0yeGj15cnh2fBzpog6KapZ/vnRJ8jy5WPieHoCiRDHXZQO+9vzzpJbg5v3xS7GY5DlyJSCXZaLHzpypObh5f3zb7ZZ1DZbBQWR4HrzTSWQBfKe/n3zx4Yc1B7fw8P7mN8jwvKxrOBgK5ZoL/H4iKeCE309uvv9+VQdUGxG5Aq7iwOtgKISrvb0oteK1aR+cr1A9+sc/UOuiBF8MAMlgEFedTrwUi226dr0pDc4mk6duvPoqCCVvo8Kuol7mSvviKZ9P9gfN4HDggNuNWw7HcEU1+IveXjL9299CSCQk/QH30DSMvb1oZBjUF8FdiMUwx7KY8Hpxr6i/WWwt/rdUShEW5fPOTjQyDNq8Xkp0wMlgkHxy9iyy9+9L9gM16HR4PhTaUI/VTCBQMdBy58V5yfA8/qujAy9Foxvu4NyQic4mk6c+eeMNSeHuoWlYWXbDDXTNTieORiLYU3Q0RSyZY1lFaLDGYsERrxcxl0tcH3zb7R6GWi0p3EPhMBo2CatOr8fBYBANOl1NAgYAY18fCCGYunBhQ6Z3XRM9Gw6TqN0uSd9UXl7mODR0dJT8/fMchwjDYF4k36kkP7yUyeB/GQYvcty6pnpdDZ748Y/x8OFDyRa/P3fgqzzfTdPY63CIGk2nIxHFANZarTjgdm8oT1etp72Tn34KMj8v2eLF6nrU2+2iriursIqd0e1GPBhEhudJyYBj3/mOpB2Qe2gaOzo7xQHc3S2qL16oUBpWqqgNhg0FXKsCTvj9JCVxKVJddJ5XFGsgopnOKAxwPuDK8Dxmw2GyacCT770naWC1LaW7tEmvd3MaPBsOk8T4uOSLbRA5h11QoNaJLS1LZ7tW0+IVAU///OeynD5YrNGtRym0eCYQ2JgGZ3iexP/0J1kWOhEMYlHEfFNMv6mtQIVMLNHb7YgHg1ipWe8JwIlAAHj0SJaFzqdSuVPzIsjM4KCodWmNRDtYpUbUJocDUz7fE7tNT1SyuF27yMz0tGyLNdvteDYYLPt9PrVYRAX87wqfZZKORHDT4cDxWIxaVYPTkQhJPngg60JjoRBmBgfLeo/7IyOiwt19/Lji/bDWakWdTodkMEhWBZz6859lPdpZsCJOJ+aj0dLMfDSKT7q7RV2Pks3zsrzY7X7CxS0DPP3rXytmsZHOzk1DnhkczH2fyBsDcsz8KHWd46sBzvA8Sdy5o5jFzqdS+E+aRszlwkI8vnZ6lUph0uvNaX4Fdn3ErmtXSjQWC3aazcsa9AqbvGJFr2LLrUAAtwIBPOt0Qm+3Q63Xo4GmMc9xyAoChFAIE8FgRcACgOnb31bMfK6NanEiEED70iG6rwAPDYFIuC1YCmisksxXOsesJmlxOsEXbUAUTPSXJQY1tSx1jY1VB1hrtWJ6bKywjagCcj1X6e0y4ZPm2eGQvSe6pLTOai1U8VQAkOa4YUqj2Sb6mPbulflkQzl+ON9HpgJyTWVKnqMhh/xTX19VBVfLzPRSEPoV4IsXt4kWSWt7O9rW2GNVfLpkNiO9FFOpAOD+6Og21SIxyxCtix5oLdUOVACQmpnZppo3zW+9pYhTDOVK28mTmA2HiWo2HCbNRuM2WQAHzp5F+8BATf1MOQ2WsC1WsanF8ePYr4CThGIHWqptvc3BPcSyVZnzrprm6fXICgLUC7EYslu4e7IY7mrHeKil89Dr/bsiTXRmC3QeriaHf/ITHOU41On1ufsNKGrFVzHI1f49f0eC0kS9FcG2trfjQDCIZ6xW0bRvJS2XU7PVSyZ6y/ngQ2+/jedu3sSOF16oCIBizZZTq+vNZsxzHNTzRVe91bJodDocCwRgkHB36HGtllKj0xyHBpqGur5K+o3KSvoZBha/X7beqmJtltpsq+pEPvClNDnS34/D4bDsjXPFZns7yBLJJL/Asoo7kVAMuZLaPM9xaHY6c0FWS3v7NlyJIa+VV4shWUFAnV4PlVqvB7LZbbg1CBkAVA00jYUa2uw/7PMpHq6UebIKADQ7dtQE3Od8PrQ4nVW15koFXncuX0aTzUZRhBD8B0WRaoe7j2FwKByuyrWLHXRleB6jDIPj8TiVC7JqYD/Y7PdX7drFNtVzRTGICgCeOXGiunNdj6dqDohJYarzVawC4AaaRl1jY1X+YlrNZuzq7a2ZIFEMyGmOKxyYUwG53X+9VluVv5C9Ho/o45eq3VTfuXwZWpruWgZYqMKTDRqdDnqRzwJXuxanIxG0trcjPxk+lyZZLFRzFVaz2hyOmtFesbQ4zXHL6gCFWrTulVdwLx4HquRCSaCyJ/8WBQHC0BCEUAiLgoDbLIv9DIM6vR56ux3NPT2K/J3MPTZjuzCEJR2JkOg3vlE11+S0ms04XqFrbyY8HsR8vjXPHO8ym7HX46kY6FK3Fj/S6ZaNGS50dGitVipTRSXLSmjvoiAg5nLhM6933QPl92IxcE4nrlutihngNhsOY6fZvGyG9LKWnfYqCljEnpuxKAgYtdlyB803IZMch1siDj0tR4RQ6IlS7TLAhtdeq5p8uFGkscN5uWm3Y7LE9qXbLLupexQqFWwJQ0NPPPjLATsclP7pp6vC/4oZPS/EYhgfGSnrPW4FAqLPOdlMupSORABCoLVaVx+EBgCtb74J6qmnlJ3/ilyWFOsKOzkH2Uz5fGheYSftCcAtTqeiO/UBQMxGwYVYDLfKnKxXeFBkApxNJjG+gv9dEbDGYqHaTp7cMhos5smO+VRq1bG+lZSZQAD77PYVb2BZsfF999tvQ1WltWm5RY6UaWpgYEXzvCrgJpuNMh4+vCWAiD0VvkHidqHZcBh1Oh2abDZqw4ABYN/589gKk3eqfcr8pNcL4xq3la8KuMlmo/aUeUFVNUizyD1cUm5+zIbDyPA8WlwuatOAAcD0wQeKTJnSIp6nqtPrYRapgrevs1NSEx1zudYdGLMmYK3VSpm+9S2gvr6mzapYdW0pB6cl/H7Um0yr+t68rHs5ZYbnycdHjihuUJqYI/YXBQGjDIPJMuZ17unowFERLctau0nZZBLXrVaY/f51Aa97PlhjsVDH3n0XaoWlTWkRh6fW6fU4xLLYZTKVVnhpaoJFwvx3wuNBY2fnunA3BBgAjH19VMvBgzXrh/OQD4ZCqG9q2rTmnohGJfO9s+Ewxvx+7Pf5ujby9Rs+4W8JBKBSkC+uRN23gaZxIhrFsxvcxN/X2YlDLAupzlhnk0nEXC50DA4Weq7WE2ozOxZ3+vvJzfPnkVXAxR0A0CkIUIt823dxAWTC48Ecy+ZamZZkl8mERoaB0e2umNau5n+/WGoPbh8Y2PBmAbXZDr7PTpwgExyniN6tjkAALRL1Ri0uHceUQlYCnAwGcdvtxlGO69qo9pYEOJtMnvpbW9vwogKm41WyL0tOeRxw/kr3r7HsE/u9ovngQqXGYLj44scfK8IfT8diSIi01adUuNlkEjcdDhzx+TYNtyTA+QLI0ffeg1YBPckTVTqVfaNB1ajNhuaenjXLkaKa6GIZe/11cvuPf5Q96JLSF0upvbzTCRACy+BgyR0YVLmHncZef51M/fWvsvZTa3Q6/Es8XrGIWiq4wFfNdrzTiXQkgmPRaFntNWVPujvwu99Rxm9+U1ZznUmlEKuyk/0rattjcA+xbFe57ynKKMP2X/yiq6mtTVbI8VAIU1U6zLvYNOfN8rFolNpMOlRRwGqD4eKhjz6SHfKN/n5Ra9RSmuZsMolRhinb51YEcB7ysatXZTXXmVQKvNOJbIXuMawU3IVYDKM2G+pNJlHhigq42Ce3v/UW1DJN7rnLcRhlGMVDzsMVQiH8D03D2NsrOlxRoujVJOH3k0+/9z0QigKRoeq1m6ZxMBSCpsQtQCngTnq9+L/338eLIyMlFTFkBQzkjqTeOH0a2WwWQiIhS/r0wsgItArqLSOEIMPziH/3uyCE4GAo1CVGMCWZiS4WrdVKHbt+vWvn6dOymOxMKoUrnZ2KKWcSQnBvYAB/t1qxo7MTh0dGqErCrbgGF0syGCSfvPEGdmi1smjzPoaBORCQxWQTQpCORDD+gx+AEAJLILDiKYSq0+BiMTgc1L+Oj3ftPH16010TYsg4y+JvZjMmJLyTMJtK4fa5c7jd14e/Mwz03d04PDJCSQVXUg0ultlwmNw5dw53r17FIxnq2BqdDu0uF4xud0U0OptK4Z7Ph89/+lNQFIW2l1+G6Ve/gpRgZQVcDHr8hz/E3WvXZOvaNNnt0C+9yqllZ5cOnk35fJiOxUBpNNjT0YEDv/+9LGAVAfhx0FOffy6LRhf76Qaahjb/WiX6TkejWBQEpDmu8Gd8qUdMpdXCePgw9p0/v6Guxy0BuBj03XfewZ3LlwG1WlbYK8GfjkSQWaGAotJqQRYXYXr1VbR+//uKAKtIwAVzl0yeEkKh4elf/hKTHAfy8CGUKFq9Hg1PPYXWN9+E0e3uqnTKUzOAH4c9EwgMTw0MIDExkUs75AJeXw+tVotMJoP27m4YXnsNBodD0eMQFA94WeGC54kQCkEYGsLc1atIzcyA0mgqFqDVNzWhqaEBSUFAc3s7dK+8ghans2JlxS0PeCXtTnPc8BzLYu7iRdwfHUVqZgYtRiNml+rfC+n0mpeOtJpMINkskM1C9fTTuBePo8VoxDMnTqCBptHIMNA8NlysmqSqAa8VrOX/no9y8zLPcag3m5f1OKv1+kITu5ICJDHk/wHZyJDIyfNuLQAAAABJRU5ErkJggg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+Cgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSJsaWIvY29kZW1pcnJvci5jc3MiPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSJkb2MvZG9jcy5jc3MiPgo8c2NyaXB0IHNyYz0ibGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0ibW9kZS94bWwveG1sLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Im1vZGUvamF2YXNjcmlwdC9qYXZhc2NyaXB0LmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Im1vZGUvY3NzL2Nzcy5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJtb2RlL2h0bWxtaXhlZC9odG1sbWl4ZWQuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iYWRkb24vZWRpdC9tYXRjaGJyYWNrZXRzLmpzIj48L3NjcmlwdD4KCjxzY3JpcHQgc3JjPSJkb2MvYWN0aXZlYm9va21hcmsuanMiPjwvc2NyaXB0PgoKPHN0eWxlPgogIC5Db2RlTWlycm9yIHsgaGVpZ2h0OiBhdXRvOyBib3JkZXI6IDFweCBzb2xpZCAjZGRkOyB9CiAgLkNvZGVNaXJyb3Itc2Nyb2xsIHsgbWF4LWhlaWdodDogMjAwcHg7IH0KICAuQ29kZU1pcnJvciBwcmUgeyBwYWRkaW5nLWxlZnQ6IDdweDsgbGluZS1oZWlnaHQ6IDEuMjU7IH0KPC9zdHlsZT4KCjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGgxPkNvZGVNaXJyb3I8L2gxPjxpbWcgaWQ9bG9nbyBzcmM9ImRvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGRhdGEtZGVmYXVsdD0idHJ1ZSIgaHJlZj0iI2Rlc2NyaXB0aW9uIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9ImRvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iI2ZlYXR1cmVzIj5GZWF0dXJlczwvYT4KICAgIDxsaT48YSBocmVmPSIjY29tbXVuaXR5Ij5Db21tdW5pdHk8L2E+CiAgICA8bGk+PGEgaHJlZj0iI2Jyb3dzZXJzdXBwb3J0Ij5Ccm93c2VyIHN1cHBvcnQ8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KCjxzZWN0aW9uIGlkPWRlc2NyaXB0aW9uIGNsYXNzPWZpcnN0PgogIDxwPjxzdHJvbmc+Q29kZU1pcnJvcjwvc3Ryb25nPiBpcyBhIHZlcnNhdGlsZSB0ZXh0IGVkaXRvcgogIGltcGxlbWVudGVkIGluIEphdmFTY3JpcHQgZm9yIHRoZSBicm93c2VyLiBJdCBpcyBzcGVjaWFsaXplZCBmb3IKICBlZGl0aW5nIGNvZGUsIGFuZCBjb21lcyB3aXRoIGEgbnVtYmVyIG9mIDxhIGhyZWY9Im1vZGUvaW5kZXguaHRtbCI+bGFuZ3VhZ2UgbW9kZXM8L2E+IGFuZCA8YSBocmVmPSJkb2MvbWFudWFsLmh0bWwjYWRkb25zIj5hZGRvbnM8L2E+CiAgdGhhdCBpbXBsZW1lbnQgbW9yZSBhZHZhbmNlZCBlZGl0aW5nIGZ1bmN0aW9uYWxpdHkuPC9wPgoKICA8cD5BIHJpY2ggPGEgaHJlZj0iZG9jL21hbnVhbC5odG1sI2FwaSI+cHJvZ3JhbW1pbmcgQVBJPC9hPiBhbmQgYQogIENTUyA8YSBocmVmPSJkb2MvbWFudWFsLmh0bWwjc3R5bGluZyI+dGhlbWluZzwvYT4gc3lzdGVtIGFyZQogIGF2YWlsYWJsZSBmb3IgY3VzdG9taXppbmcgQ29kZU1pcnJvciB0byBmaXQgeW91ciBhcHBsaWNhdGlvbiwgYW5kCiAgZXh0ZW5kaW5nIGl0IHdpdGggbmV3IGZ1bmN0aW9uYWxpdHkuPC9wPgo8L3NlY3Rpb24+Cgo8c2VjdGlvbiBpZD1kZW1vPgogIDxoMj5UaGlzIGlzIENvZGVNaXJyb3I8L2gyPgogIDxmb3JtIHN0eWxlPSJwb3NpdGlvbjogcmVsYXRpdmU7IG1hcmdpbi10b3A6IC41ZW07Ij48dGV4dGFyZWEgaWQ9ZGVtb3RleHQ+CjwhLS0gQ3JlYXRlIGEgc2ltcGxlIENvZGVNaXJyb3IgaW5zdGFuY2UgLS0+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0ibGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9ImxpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdD4KICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEobXlUZXh0YXJlYSwgewogICAgbGluZU51bWJlcnM6IHRydWUKICB9KTsKPC9zY3JpcHQ+PC90ZXh0YXJlYT4KICA8c2VsZWN0IGlkPSJkZW1vbGlzdCIgb25jaGFuZ2U9ImRvY3VtZW50LmxvY2F0aW9uID0gdGhpcy5vcHRpb25zW3RoaXMuc2VsZWN0ZWRJbmRleF0udmFsdWU7Ij4KICAgIDxvcHRpb24gdmFsdWU9IiMiPk90aGVyIGRlbW9zLi4uPC9vcHRpb24+CiAgICA8b3B0aW9uIHZhbHVlPSJkZW1vL2NvbXBsZXRlLmh0bWwiPkF1dG9jb21wbGV0aW9uPC9vcHRpb24+CiAgICA8b3B0aW9uIHZhbHVlPSJkZW1vL2ZvbGRpbmcuaHRtbCI+Q29kZSBmb2xkaW5nPC9vcHRpb24+CiAgICA8b3B0aW9uIHZhbHVlPSJkZW1vL3RoZW1lLmh0bWwiPlRoZW1lczwvb3B0aW9uPgogICAgPG9wdGlvbiB2YWx1ZT0ibW9kZS9odG1sbWl4ZWQvaW5kZXguaHRtbCI+TWl4ZWQgbGFuZ3VhZ2UgbW9kZXM8L29wdGlvbj4KICAgIDxvcHRpb24gdmFsdWU9ImRlbW8vYmlkaS5odG1sIj5CaS1kaXJlY3Rpb25hbCB0ZXh0PC9vcHRpb24+CiAgICA8b3B0aW9uIHZhbHVlPSJkZW1vL3ZhcmlhYmxlaGVpZ2h0Lmh0bWwiPlZhcmlhYmxlIGZvbnQgc2l6ZXM8L29wdGlvbj4KICAgIDxvcHRpb24gdmFsdWU9ImRlbW8vc2VhcmNoLmh0bWwiPlNlYXJjaCBpbnRlcmZhY2U8L29wdGlvbj4KICAgIDxvcHRpb24gdmFsdWU9ImRlbW8vdmltLmh0bWwiPlZpbSBiaW5kaW5nczwvb3B0aW9uPgogICAgPG9wdGlvbiB2YWx1ZT0iZGVtby9lbWFjcy5odG1sIj5FbWFjcyBiaW5kaW5nczwvb3B0aW9uPgogICAgPG9wdGlvbiB2YWx1ZT0iZGVtby9zdWJsaW1lLmh0bWwiPlN1YmxpbWUgVGV4dCBiaW5kaW5nczwvb3B0aW9uPgogICAgPG9wdGlvbiB2YWx1ZT0iZGVtby90ZXJuLmh0bWwiPlRlcm4gaW50ZWdyYXRpb248L29wdGlvbj4KICAgIDxvcHRpb24gdmFsdWU9ImRlbW8vbWVyZ2UuaHRtbCI+TWVyZ2UvZGlmZiBpbnRlcmZhY2U8L29wdGlvbj4KICAgIDxvcHRpb24gdmFsdWU9ImRlbW8vZnVsbHNjcmVlbi5odG1sIj5GdWxsLXNjcmVlbiBlZGl0b3I8L29wdGlvbj4KICAgIDxvcHRpb24gdmFsdWU9ImRlbW8vc2ltcGxlc2Nyb2xsYmFycy5odG1sIj5DdXN0b20gc2Nyb2xsYmFyczwvb3B0aW9uPgogIDwvc2VsZWN0PjwvZm9ybT4KICA8c2NyaXB0PgogICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJkZW1vdGV4dCIpLCB7CiAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgICBtb2RlOiAidGV4dC9odG1sIiwKICAgICAgbWF0Y2hCcmFja2V0czogdHJ1ZQogICAgfSk7CiAgPC9zY3JpcHQ+CgogIDxkaXYgY2xhc3M9YWN0aW9ucz4KICAgIDxkaXYgY2xhc3M9YWN0aW9uc3BpY3R1cmU+CiAgICAgIDxpbWcgc3JjPSJkb2MveWlueWFuZy5wbmciIGNsYXNzPXlpbnlhbmc+CiAgICAgIDxkaXYgY2xhc3M9ImFjdGlvbmxpbmsgZG93bmxvYWQiPgogICAgICAgIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLnppcCI+RE9XTkxPQUQ8L2E+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJhY3Rpb25saW5rIGZ1bmQiPgogICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vbWFyaWpuaGF2ZXJiZWtlLm5sL2Z1bmQvIj5GVU5EPC9hPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgogICAgPGRpdiBjbGFzcz1hY3Rpb25zbGVmdD4KICAgICAgR2V0IHRoZSBjdXJyZW50IHZlcnNpb246IDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC9jb2RlbWlycm9yLnppcCI+NS4yMC4yPC9hPi48YnI+CiAgICAgIFlvdSBjYW4gc2VlIHRoZSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9jb2RlbWlycm9yIiB0aXRsZT0iR2l0aHViIHJlcG9zaXRvcnkiPmNvZGU8L2E+LDxicj4KICAgICAgcmVhZCB0aGUgPGEgaHJlZj0iZG9jL3JlbGVhc2VzLmh0bWwiPnJlbGVhc2Ugbm90ZXM8L2E+LDxicj4KICAgICAgb3Igc3R1ZHkgdGhlIDxhIGhyZWY9ImRvYy9tYW51YWwuaHRtbCI+dXNlciBtYW51YWw8L2E+LgogICAgPC9kaXY+CiAgICA8ZGl2IGNsYXNzPWFjdGlvbnNyaWdodD4KICAgICAgU29mdHdhcmUgbmVlZHMgbWFpbnRlbmFuY2UsPGJyPgogICAgICBtYWludGFpbmVycyBuZWVkIHRvIHN1YnNpc3QuPGJyPgogICAgICBDdXJyZW50IGZ1bmRpbmcgc3RhdHVzID0gPGltZyBzcmM9Imh0dHBzOi8vbWFyaWpuaGF2ZXJiZWtlLm5sL2Z1bmQvc3RhdHVzX3MucG5nIiB0aXRsZT0iQ3VycmVudCBtYWludGFpbmVyIGhhcHBpbmVzcyIgc3R5bGU9InZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IGhlaWdodDogMTZweDsgd2lkdGg6IDE2cHgiPjxicj4KICAgICAgWW91IGNhbiBoZWxwIDxhIGhyZWY9Imh0dHBzOi8vbWFyaWpuaGF2ZXJiZWtlLm5sL2Z1bmQvIiB0aXRsZT0iU2V0IHVwIGEgbW9udGhseSBjb250cmlidXRpb24iPnBlciBtb250aDwvYT4gb3IKICAgICAgPGEgdGl0bGU9IkRvbmF0ZSB3aXRoIFBheVBhbCIgaHJlZj0iamF2YXNjcmlwdDpkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgncGF5cGFsJykuc3VibWl0KCk7Ij5vbmNlPC9hPi4KICAgICAgPGZvcm0gYWN0aW9uPSJodHRwczovL3d3dy5wYXlwYWwuY29tL2NnaS1iaW4vd2Vic2NyIiBtZXRob2Q9InBvc3QiIGlkPSJwYXlwYWwiPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImNtZCIgdmFsdWU9Il9zLXhjbGljayIvPgogICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9Imhvc3RlZF9idXR0b25faWQiIHZhbHVlPSIzRlZIUzVGR1VZN0NDIi8+CiAgICAgIDwvZm9ybT4KICAgIDwvZGl2PgogIDwvZGl2PgoKPC9zZWN0aW9uPgoKPHNlY3Rpb24gaWQ9ZmVhdHVyZXM+CiAgPGgyPkZlYXR1cmVzPC9oMj4KICA8dWw+CiAgICA8bGk+U3VwcG9ydCBmb3IgPGEgaHJlZj0ibW9kZS9pbmRleC5odG1sIj5vdmVyIDEwMCBsYW5ndWFnZXM8L2E+IG91dCBvZiB0aGUgYm94CiAgICA8bGk+QSBwb3dlcmZ1bCwgPGEgaHJlZj0ibW9kZS9odG1sbWl4ZWQvaW5kZXguaHRtbCI+Y29tcG9zYWJsZTwvYT4gbGFuZ3VhZ2UgbW9kZSA8YSBocmVmPSJkb2MvbWFudWFsLmh0bWwjbW9kZWFwaSI+c3lzdGVtPC9hPgogICAgPGxpPjxhIGhyZWY9ImRvYy9tYW51YWwuaHRtbCNhZGRvbl9zaG93LWhpbnQiPkF1dG9jb21wbGV0aW9uPC9hPiAoPGEgaHJlZj0iZGVtby94bWxjb21wbGV0ZS5odG1sIj5YTUw8L2E+KQogICAgPGxpPjxhIGhyZWY9ImRvYy9tYW51YWwuaHRtbCNhZGRvbl9mb2xkY29kZSI+Q29kZSBmb2xkaW5nPC9hPgogICAgPGxpPjxhIGhyZWY9ImRvYy9tYW51YWwuaHRtbCNvcHRpb25fZXh0cmFLZXlzIj5Db25maWd1cmFibGU8L2E+IGtleWJpbmRpbmdzCiAgICA8bGk+PGEgaHJlZj0iZGVtby92aW0uaHRtbCI+VmltPC9hPiwgPGEgaHJlZj0iZGVtby9lbWFjcy5odG1sIj5FbWFjczwvYT4sIGFuZCA8YSBocmVmPSJkZW1vL3N1YmxpbWUuaHRtbCI+U3VibGltZSBUZXh0PC9hPiBiaW5kaW5ncwogICAgPGxpPjxhIGhyZWY9ImRvYy9tYW51YWwuaHRtbCNhZGRvbl9zZWFyY2giPlNlYXJjaCBhbmQgcmVwbGFjZTwvYT4gaW50ZXJmYWNlCiAgICA8bGk+PGEgaHJlZj0iZG9jL21hbnVhbC5odG1sI2FkZG9uX21hdGNoYnJhY2tldHMiPkJyYWNrZXQ8L2E+IGFuZCA8YSBocmVmPSJkb2MvbWFudWFsLmh0bWwjYWRkb25fbWF0Y2h0YWdzIj50YWc8L2E+IG1hdGNoaW5nCiAgICA8bGk+U3VwcG9ydCBmb3IgPGEgaHJlZj0iZGVtby9idWZmZXJzLmh0bWwiPnNwbGl0IHZpZXdzPC9hPgogICAgPGxpPjxhIGhyZWY9ImRvYy9tYW51YWwuaHRtbCNhZGRvbl9saW50Ij5MaW50ZXIgaW50ZWdyYXRpb248L2E+CiAgICA8bGk+PGEgaHJlZj0iZGVtby92YXJpYWJsZWhlaWdodC5odG1sIj5NaXhpbmcgZm9udCBzaXplcyBhbmQgc3R5bGVzPC9hPgogICAgPGxpPjxhIGhyZWY9ImRlbW8vdGhlbWUuaHRtbCI+VmFyaW91cyB0aGVtZXM8L2E+CiAgICA8bGk+QWJsZSB0byA8YSBocmVmPSJkZW1vL3Jlc2l6ZS5odG1sIj5yZXNpemUgdG8gZml0IGNvbnRlbnQ8L2E+CiAgICA8bGk+PGEgaHJlZj0iZG9jL21hbnVhbC5odG1sI21hcmtfcmVwbGFjZWRXaXRoIj5JbmxpbmU8L2E+IGFuZCA8YSBocmVmPSJkb2MvbWFudWFsLmh0bWwjYWRkTGluZVdpZGdldCI+YmxvY2s8L2E+IHdpZGdldHMKICAgIDxsaT5Qcm9ncmFtbWFibGUgPGEgaHJlZj0iZGVtby9tYXJrZXIuaHRtbCI+Z3V0dGVyczwvYT4KICAgIDxsaT5NYWtpbmcgcmFuZ2VzIG9mIHRleHQgPGEgaHJlZj0iZG9jL21hbnVhbC5odG1sI21hcmtUZXh0Ij5zdHlsZWQsIHJlYWQtb25seSwgb3IgYXRvbWljPC9hPgogICAgPGxpPjxhIGhyZWY9ImRlbW8vYmlkaS5odG1sIj5CaS1kaXJlY3Rpb25hbCB0ZXh0PC9hPiBzdXBwb3J0CiAgICA8bGk+TWFueSBvdGhlciA8YSBocmVmPSJkb2MvbWFudWFsLmh0bWwjYXBpIj5tZXRob2RzPC9hPiBhbmQgPGEgaHJlZj0iZG9jL21hbnVhbC5odG1sI2FkZG9ucyI+YWRkb25zPC9hPi4uLgogIDwvdWw+Cjwvc2VjdGlvbj4KCjxzZWN0aW9uIGlkPWNvbW11bml0eT4KICA8aDI+Q29tbXVuaXR5PC9oMj4KCiAgPHA+Q29kZU1pcnJvciBpcyBhbiBvcGVuLXNvdXJjZSBwcm9qZWN0IHNoYXJlZCB1bmRlcgogIGFuIDxhIGhyZWY9IkxJQ0VOU0UiPk1JVCBsaWNlbnNlPC9hPi4gSXQgaXMgdGhlIGVkaXRvciB1c2VkIGluIHRoZQogIGRldiB0b29scyBmb3IKICBib3RoIDxhIGhyZWY9Imh0dHBzOi8vaGFja3MubW96aWxsYS5vcmcvMjAxMy8xMS9maXJlZm94LWRldmVsb3Blci10b29scy1lcGlzb2RlLTI3LWVkaXQtYXMtaHRtbC1jb2RlbWlycm9yLW1vcmUvIj5GaXJlZm94PC9hPgogIGFuZCA8YSBocmVmPSJodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9jaHJvbWUtZGV2ZWxvcGVyLXRvb2xzLyI+Q2hyb21lPC9hPiwgPGEgaHJlZj0iaHR0cDovL3d3dy5saWdodHRhYmxlLmNvbS8iPkxpZ2h0CiAgVGFibGU8L2E+LCA8YSBocmVmPSJodHRwOi8vYnJhY2tldHMuaW8vIj5BZG9iZQogIEJyYWNrZXRzPC9hPiwgPGEgaHJlZj0iaHR0cDovL2Jsb2cuYml0YnVja2V0Lm9yZy8yMDEzLzA1LzE0L2VkaXQteW91ci1jb2RlLWluLXRoZS1jbG91ZC13aXRoLWJpdGJ1Y2tldC8iPkJpdGJ1Y2tldDwvYT4sCiAgYW5kIDxhIGhyZWY9ImRvYy9yZWFsd29ybGQuaHRtbCI+bWFueSBvdGhlciBwcm9qZWN0czwvYT4uPC9wPgoKICA8cD5EZXZlbG9wbWVudCBhbmQgYnVnIHRyYWNraW5nIGhhcHBlbnMKICBvbiA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9Db2RlTWlycm9yLyI+Z2l0aHViPC9hPgogICg8YSBocmVmPSJodHRwOi8vbWFyaWpuaGF2ZXJiZWtlLm5sL2dpdC9jb2RlbWlycm9yIj5hbHRlcm5hdGUgZ2l0CiAgcmVwb3NpdG9yeTwvYT4pLgogIFBsZWFzZSA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQvZG9jL3JlcG9ydGluZy5odG1sIj5yZWFkIHRoZXNlCiAgcG9pbnRlcnM8L2E+IGJlZm9yZSBzdWJtaXR0aW5nIGEgYnVnLiBVc2UgcHVsbCByZXF1ZXN0cyB0byBzdWJtaXQKICBwYXRjaGVzLiBBbGwgY29udHJpYnV0aW9ucyBtdXN0IGJlIHJlbGVhc2VkIHVuZGVyIHRoZSBzYW1lIE1JVAogIGxpY2Vuc2UgdGhhdCBDb2RlTWlycm9yIHVzZXMuPC9wPgoKICA8cD5EaXNjdXNzaW9uIGFyb3VuZCB0aGUgcHJvamVjdCBpcyBkb25lIG9uCiAgYSA8YSBocmVmPSJodHRwczovL2Rpc2N1c3MuY29kZW1pcnJvci5uZXQiPmRpc2N1c3Npb24gZm9ydW08L2E+LgogIFRoZXJlIGlzIGFsc28KICB0aGUgPGEgaHJlZj0iaHR0cDovL2dyb3Vwcy5nb29nbGUuY29tL2dyb3VwL2NvZGVtaXJyb3ItYW5ub3VuY2UiPmNvZGVtaXJyb3ItYW5ub3VuY2U8L2E+CiAgbGlzdCwgd2hpY2ggaXMgb25seSB1c2VkIGZvciBtYWpvciBhbm5vdW5jZW1lbnRzIChzdWNoIGFzIG5ldwogIHZlcnNpb25zKS4gSWYgbmVlZGVkLCB5b3UgY2FuCiAgY29udGFjdCA8YSBocmVmPSJtYWlsdG86bWFyaWpuaEBnbWFpbC5jb20iPnRoZSBtYWludGFpbmVyPC9hPgogIGRpcmVjdGx5LiBXZSBhaW0gdG8gYmUgYW4gaW5jbHVzaXZlLCB3ZWxjb21pbmcgY29tbXVuaXR5LiBUbyBtYWtlCiAgdGhhdCBleHBsaWNpdCwgd2UgaGF2ZQogIGEgPGEgaHJlZj0iaHR0cDovL2NvbnRyaWJ1dG9yLWNvdmVuYW50Lm9yZy92ZXJzaW9uLzEvMS8wLyI+Y29kZSBvZgogIGNvbmR1Y3Q8L2E+IHRoYXQgYXBwbGllcyB0byBjb21tdW5pY2F0aW9uIGFyb3VuZCB0aGUgcHJvamVjdC48L3A+CgogIDxwPkEgbGlzdCBvZiBDb2RlTWlycm9yLXJlbGF0ZWQgc29mdHdhcmUgdGhhdCBpcyBub3QgcGFydCBvZiB0aGUKICBtYWluIGRpc3RyaWJ1dGlvbiBpcyBtYWludGFpbmVkCiAgb24gPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvQ29kZU1pcnJvci93aWtpL0NvZGVNaXJyb3ItYWRkb25zIj5vdXIKICB3aWtpPC9hPi4gRmVlbCBmcmVlIHRvIGFkZCB5b3VyIHByb2plY3QuPC9wPgo8L3NlY3Rpb24+Cgo8c2VjdGlvbiBpZD1icm93c2Vyc3VwcG9ydD4KICA8aDI+QnJvd3NlciBzdXBwb3J0PC9oMj4KICA8cD5UaGUgPGVtPmRlc2t0b3A8L2VtPiB2ZXJzaW9ucyBvZiB0aGUgZm9sbG93aW5nIGJyb3dzZXJzLAogIGluIDxlbT5zdGFuZGFyZHMgbW9kZTwvZW0+IChIVE1MNSA8Y29kZT4mbHQ7IWRvY3R5cGXCoGh0bWw+PC9jb2RlPgogIHJlY29tbWVuZGVkKSBhcmUgc3VwcG9ydGVkOjwvcD4KICA8dGFibGUgc3R5bGU9Im1hcmdpbi1ib3R0b206IDFlbSI+CiAgICA8dHI+PHRoPkZpcmVmb3g8L3RoPjx0ZD52ZXJzaW9uIDQgYW5kIHVwPC90ZD48L3RyPgogICAgPHRyPjx0aD5DaHJvbWU8L3RoPjx0ZD5hbnkgdmVyc2lvbjwvdGQ+PC90cj4KICAgIDx0cj48dGg+U2FmYXJpPC90aD48dGQ+dmVyc2lvbiA1LjIgYW5kIHVwPC90ZD48L3RyPgogICAgPHRyPjx0aCBzdHlsZT0icGFkZGluZy1yaWdodDogMWVtOyI+SW50ZXJuZXQgRXhwbG9yZXI8L3RoPjx0ZD52ZXJzaW9uIDggYW5kIHVwPC90ZD48L3RyPgogICAgPHRyPjx0aD5PcGVyYTwvdGg+PHRkPnZlcnNpb24gOSBhbmQgdXA8L3RkPjwvdHI+CiAgPC90YWJsZT4KICA8cD5TdXBwb3J0IGZvciBtb2Rlcm4gbW9iaWxlIGJyb3dzZXJzIGlzIGV4cGVyaW1lbnRhbC4gUmVjZW50CiAgdmVyc2lvbnMgb2YgdGhlIGlPUyBicm93c2VyIGFuZCBDaHJvbWUgb24gQW5kcm9pZCBzaG91bGQgd29yawogIHByZXR0eSB3ZWxsLjwvcD4KPC9zZWN0aW9uPgoKPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/keymap/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/keymap/emacs.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CgogIHZhciBQb3MgPSBDb2RlTWlycm9yLlBvczsKICBmdW5jdGlvbiBwb3NFcShhLCBiKSB7IHJldHVybiBhLmxpbmUgPT0gYi5saW5lICYmIGEuY2ggPT0gYi5jaDsgfQoKICAvLyBLaWxsICdyaW5nJwoKICB2YXIga2lsbFJpbmcgPSBbXTsKICBmdW5jdGlvbiBhZGRUb1Jpbmcoc3RyKSB7CiAgICBraWxsUmluZy5wdXNoKHN0cik7CiAgICBpZiAoa2lsbFJpbmcubGVuZ3RoID4gNTApIGtpbGxSaW5nLnNoaWZ0KCk7CiAgfQogIGZ1bmN0aW9uIGdyb3dSaW5nVG9wKHN0cikgewogICAgaWYgKCFraWxsUmluZy5sZW5ndGgpIHJldHVybiBhZGRUb1Jpbmcoc3RyKTsKICAgIGtpbGxSaW5nW2tpbGxSaW5nLmxlbmd0aCAtIDFdICs9IHN0cjsKICB9CiAgZnVuY3Rpb24gZ2V0RnJvbVJpbmcobikgeyByZXR1cm4ga2lsbFJpbmdba2lsbFJpbmcubGVuZ3RoIC0gKG4gPyBNYXRoLm1pbihuLCAxKSA6IDEpXSB8fCAiIjsgfQogIGZ1bmN0aW9uIHBvcEZyb21SaW5nKCkgeyBpZiAoa2lsbFJpbmcubGVuZ3RoID4gMSkga2lsbFJpbmcucG9wKCk7IHJldHVybiBnZXRGcm9tUmluZygpOyB9CgogIHZhciBsYXN0S2lsbCA9IG51bGw7CgogIGZ1bmN0aW9uIGtpbGwoY20sIGZyb20sIHRvLCBtYXlHcm93LCB0ZXh0KSB7CiAgICBpZiAodGV4dCA9PSBudWxsKSB0ZXh0ID0gY20uZ2V0UmFuZ2UoZnJvbSwgdG8pOwoKICAgIGlmIChtYXlHcm93ICYmIGxhc3RLaWxsICYmIGxhc3RLaWxsLmNtID09IGNtICYmIHBvc0VxKGZyb20sIGxhc3RLaWxsLnBvcykgJiYgY20uaXNDbGVhbihsYXN0S2lsbC5nZW4pKQogICAgICBncm93UmluZ1RvcCh0ZXh0KTsKICAgIGVsc2UKICAgICAgYWRkVG9SaW5nKHRleHQpOwogICAgY20ucmVwbGFjZVJhbmdlKCIiLCBmcm9tLCB0bywgIitkZWxldGUiKTsKCiAgICBpZiAobWF5R3JvdykgbGFzdEtpbGwgPSB7Y206IGNtLCBwb3M6IGZyb20sIGdlbjogY20uY2hhbmdlR2VuZXJhdGlvbigpfTsKICAgIGVsc2UgbGFzdEtpbGwgPSBudWxsOwogIH0KCiAgLy8gQm91bmRhcmllcyBvZiB2YXJpb3VzIHVuaXRzCgogIGZ1bmN0aW9uIGJ5Q2hhcihjbSwgcG9zLCBkaXIpIHsKICAgIHJldHVybiBjbS5maW5kUG9zSChwb3MsIGRpciwgImNoYXIiLCB0cnVlKTsKICB9CgogIGZ1bmN0aW9uIGJ5V29yZChjbSwgcG9zLCBkaXIpIHsKICAgIHJldHVybiBjbS5maW5kUG9zSChwb3MsIGRpciwgIndvcmQiLCB0cnVlKTsKICB9CgogIGZ1bmN0aW9uIGJ5TGluZShjbSwgcG9zLCBkaXIpIHsKICAgIHJldHVybiBjbS5maW5kUG9zVihwb3MsIGRpciwgImxpbmUiLCBjbS5kb2Muc2VsLmdvYWxDb2x1bW4pOwogIH0KCiAgZnVuY3Rpb24gYnlQYWdlKGNtLCBwb3MsIGRpcikgewogICAgcmV0dXJuIGNtLmZpbmRQb3NWKHBvcywgZGlyLCAicGFnZSIsIGNtLmRvYy5zZWwuZ29hbENvbHVtbik7CiAgfQoKICBmdW5jdGlvbiBieVBhcmFncmFwaChjbSwgcG9zLCBkaXIpIHsKICAgIHZhciBubyA9IHBvcy5saW5lLCBsaW5lID0gY20uZ2V0TGluZShubyk7CiAgICB2YXIgc2F3VGV4dCA9IC9cUy8udGVzdChkaXIgPCAwID8gbGluZS5zbGljZSgwLCBwb3MuY2gpIDogbGluZS5zbGljZShwb3MuY2gpKTsKICAgIHZhciBmc3QgPSBjbS5maXJzdExpbmUoKSwgbHN0ID0gY20ubGFzdExpbmUoKTsKICAgIGZvciAoOzspIHsKICAgICAgbm8gKz0gZGlyOwogICAgICBpZiAobm8gPCBmc3QgfHwgbm8gPiBsc3QpCiAgICAgICAgcmV0dXJuIGNtLmNsaXBQb3MoUG9zKG5vIC0gZGlyLCBkaXIgPCAwID8gMCA6IG51bGwpKTsKICAgICAgbGluZSA9IGNtLmdldExpbmUobm8pOwogICAgICB2YXIgaGFzVGV4dCA9IC9cUy8udGVzdChsaW5lKTsKICAgICAgaWYgKGhhc1RleHQpIHNhd1RleHQgPSB0cnVlOwogICAgICBlbHNlIGlmIChzYXdUZXh0KSByZXR1cm4gUG9zKG5vLCAwKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGJ5U2VudGVuY2UoY20sIHBvcywgZGlyKSB7CiAgICB2YXIgbGluZSA9IHBvcy5saW5lLCBjaCA9IHBvcy5jaDsKICAgIHZhciB0ZXh0ID0gY20uZ2V0TGluZShwb3MubGluZSksIHNhd1dvcmQgPSBmYWxzZTsKICAgIGZvciAoOzspIHsKICAgICAgdmFyIG5leHQgPSB0ZXh0LmNoYXJBdChjaCArIChkaXIgPCAwID8gLTEgOiAwKSk7CiAgICAgIGlmICghbmV4dCkgeyAvLyBFbmQvYmVnaW5uaW5nIG9mIGxpbmUgcmVhY2hlZAogICAgICAgIGlmIChsaW5lID09IChkaXIgPCAwID8gY20uZmlyc3RMaW5lKCkgOiBjbS5sYXN0TGluZSgpKSkgcmV0dXJuIFBvcyhsaW5lLCBjaCk7CiAgICAgICAgdGV4dCA9IGNtLmdldExpbmUobGluZSArIGRpcik7CiAgICAgICAgaWYgKCEvXFMvLnRlc3QodGV4dCkpIHJldHVybiBQb3MobGluZSwgY2gpOwogICAgICAgIGxpbmUgKz0gZGlyOwogICAgICAgIGNoID0gZGlyIDwgMCA/IHRleHQubGVuZ3RoIDogMDsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgICBpZiAoc2F3V29yZCAmJiAvWyE/Ll0vLnRlc3QobmV4dCkpIHJldHVybiBQb3MobGluZSwgY2ggKyAoZGlyID4gMCA/IDEgOiAwKSk7CiAgICAgIGlmICghc2F3V29yZCkgc2F3V29yZCA9IC9cdy8udGVzdChuZXh0KTsKICAgICAgY2ggKz0gZGlyOwogICAgfQogIH0KCiAgZnVuY3Rpb24gYnlFeHByKGNtLCBwb3MsIGRpcikgewogICAgdmFyIHdyYXA7CiAgICBpZiAoY20uZmluZE1hdGNoaW5nQnJhY2tldCAmJiAod3JhcCA9IGNtLmZpbmRNYXRjaGluZ0JyYWNrZXQocG9zLCB0cnVlKSkKICAgICAgICAmJiB3cmFwLm1hdGNoICYmICh3cmFwLmZvcndhcmQgPyAxIDogLTEpID09IGRpcikKICAgICAgcmV0dXJuIGRpciA+IDAgPyBQb3Mod3JhcC50by5saW5lLCB3cmFwLnRvLmNoICsgMSkgOiB3cmFwLnRvOwoKICAgIGZvciAodmFyIGZpcnN0ID0gdHJ1ZTs7IGZpcnN0ID0gZmFsc2UpIHsKICAgICAgdmFyIHRva2VuID0gY20uZ2V0VG9rZW5BdChwb3MpOwogICAgICB2YXIgYWZ0ZXIgPSBQb3MocG9zLmxpbmUsIGRpciA8IDAgPyB0b2tlbi5zdGFydCA6IHRva2VuLmVuZCk7CiAgICAgIGlmIChmaXJzdCAmJiBkaXIgPiAwICYmIHRva2VuLmVuZCA9PSBwb3MuY2ggfHwgIS9cdy8udGVzdCh0b2tlbi5zdHJpbmcpKSB7CiAgICAgICAgdmFyIG5ld1BvcyA9IGNtLmZpbmRQb3NIKGFmdGVyLCBkaXIsICJjaGFyIik7CiAgICAgICAgaWYgKHBvc0VxKGFmdGVyLCBuZXdQb3MpKSByZXR1cm4gcG9zOwogICAgICAgIGVsc2UgcG9zID0gbmV3UG9zOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBhZnRlcjsKICAgICAgfQogICAgfQogIH0KCiAgLy8gUHJlZml4ZXMgKG9ubHkgY3J1ZGVseSBzdXBwb3J0ZWQpCgogIGZ1bmN0aW9uIGdldFByZWZpeChjbSwgcHJlY2lzZSkgewogICAgdmFyIGRpZ2l0cyA9IGNtLnN0YXRlLmVtYWNzUHJlZml4OwogICAgaWYgKCFkaWdpdHMpIHJldHVybiBwcmVjaXNlID8gbnVsbCA6IDE7CiAgICBjbGVhclByZWZpeChjbSk7CiAgICByZXR1cm4gZGlnaXRzID09ICItIiA/IC0xIDogTnVtYmVyKGRpZ2l0cyk7CiAgfQoKICBmdW5jdGlvbiByZXBlYXRlZChjbWQpIHsKICAgIHZhciBmID0gdHlwZW9mIGNtZCA9PSAic3RyaW5nIiA/IGZ1bmN0aW9uKGNtKSB7IGNtLmV4ZWNDb21tYW5kKGNtZCk7IH0gOiBjbWQ7CiAgICByZXR1cm4gZnVuY3Rpb24oY20pIHsKICAgICAgdmFyIHByZWZpeCA9IGdldFByZWZpeChjbSk7CiAgICAgIGYoY20pOwogICAgICBmb3IgKHZhciBpID0gMTsgaSA8IHByZWZpeDsgKytpKSBmKGNtKTsKICAgIH07CiAgfQoKICBmdW5jdGlvbiBmaW5kRW5kKGNtLCBwb3MsIGJ5LCBkaXIpIHsKICAgIHZhciBwcmVmaXggPSBnZXRQcmVmaXgoY20pOwogICAgaWYgKHByZWZpeCA8IDApIHsgZGlyID0gLWRpcjsgcHJlZml4ID0gLXByZWZpeDsgfQogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwcmVmaXg7ICsraSkgewogICAgICB2YXIgbmV3UG9zID0gYnkoY20sIHBvcywgZGlyKTsKICAgICAgaWYgKHBvc0VxKG5ld1BvcywgcG9zKSkgYnJlYWs7CiAgICAgIHBvcyA9IG5ld1BvczsKICAgIH0KICAgIHJldHVybiBwb3M7CiAgfQoKICBmdW5jdGlvbiBtb3ZlKGJ5LCBkaXIpIHsKICAgIHZhciBmID0gZnVuY3Rpb24oY20pIHsKICAgICAgY20uZXh0ZW5kU2VsZWN0aW9uKGZpbmRFbmQoY20sIGNtLmdldEN1cnNvcigpLCBieSwgZGlyKSk7CiAgICB9OwogICAgZi5tb3Rpb24gPSB0cnVlOwogICAgcmV0dXJuIGY7CiAgfQoKICBmdW5jdGlvbiBraWxsVG8oY20sIGJ5LCBkaXIpIHsKICAgIHZhciBzZWxlY3Rpb25zID0gY20ubGlzdFNlbGVjdGlvbnMoKSwgY3Vyc29yOwogICAgdmFyIGkgPSBzZWxlY3Rpb25zLmxlbmd0aDsKICAgIHdoaWxlIChpLS0pIHsKICAgICAgY3Vyc29yID0gc2VsZWN0aW9uc1tpXS5oZWFkOwogICAgICBraWxsKGNtLCBjdXJzb3IsIGZpbmRFbmQoY20sIGN1cnNvciwgYnksIGRpciksIHRydWUpOwogICAgfQogIH0KCiAgZnVuY3Rpb24ga2lsbFJlZ2lvbihjbSkgewogICAgaWYgKGNtLnNvbWV0aGluZ1NlbGVjdGVkKCkpIHsKICAgICAgdmFyIHNlbGVjdGlvbnMgPSBjbS5saXN0U2VsZWN0aW9ucygpLCBzZWxlY3Rpb247CiAgICAgIHZhciBpID0gc2VsZWN0aW9ucy5sZW5ndGg7CiAgICAgIHdoaWxlIChpLS0pIHsKICAgICAgICBzZWxlY3Rpb24gPSBzZWxlY3Rpb25zW2ldOwogICAgICAgIGtpbGwoY20sIHNlbGVjdGlvbi5hbmNob3IsIHNlbGVjdGlvbi5oZWFkKTsKICAgICAgfQogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGFkZFByZWZpeChjbSwgZGlnaXQpIHsKICAgIGlmIChjbS5zdGF0ZS5lbWFjc1ByZWZpeCkgewogICAgICBpZiAoZGlnaXQgIT0gIi0iKSBjbS5zdGF0ZS5lbWFjc1ByZWZpeCArPSBkaWdpdDsKICAgICAgcmV0dXJuOwogICAgfQogICAgLy8gTm90IGFjdGl2ZSB5ZXQKICAgIGNtLnN0YXRlLmVtYWNzUHJlZml4ID0gZGlnaXQ7CiAgICBjbS5vbigia2V5SGFuZGxlZCIsIG1heWJlQ2xlYXJQcmVmaXgpOwogICAgY20ub24oImlucHV0UmVhZCIsIG1heWJlRHVwbGljYXRlSW5wdXQpOwogIH0KCiAgdmFyIHByZWZpeFByZXNlcnZpbmdLZXlzID0geyJBbHQtRyI6IHRydWUsICJDdHJsLVgiOiB0cnVlLCAiQ3RybC1RIjogdHJ1ZSwgIkN0cmwtVSI6IHRydWV9OwoKICBmdW5jdGlvbiBtYXliZUNsZWFyUHJlZml4KGNtLCBhcmcpIHsKICAgIGlmICghY20uc3RhdGUuZW1hY3NQcmVmaXhNYXAgJiYgIXByZWZpeFByZXNlcnZpbmdLZXlzLmhhc093blByb3BlcnR5KGFyZykpCiAgICAgIGNsZWFyUHJlZml4KGNtKTsKICB9CgogIGZ1bmN0aW9uIGNsZWFyUHJlZml4KGNtKSB7CiAgICBjbS5zdGF0ZS5lbWFjc1ByZWZpeCA9IG51bGw7CiAgICBjbS5vZmYoImtleUhhbmRsZWQiLCBtYXliZUNsZWFyUHJlZml4KTsKICAgIGNtLm9mZigiaW5wdXRSZWFkIiwgbWF5YmVEdXBsaWNhdGVJbnB1dCk7CiAgfQoKICBmdW5jdGlvbiBtYXliZUR1cGxpY2F0ZUlucHV0KGNtLCBldmVudCkgewogICAgdmFyIGR1cCA9IGdldFByZWZpeChjbSk7CiAgICBpZiAoZHVwID4gMSAmJiBldmVudC5vcmlnaW4gPT0gIitpbnB1dCIpIHsKICAgICAgdmFyIG9uZSA9IGV2ZW50LnRleHQuam9pbigiXG4iKSwgdHh0ID0gIiI7CiAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgZHVwOyArK2kpIHR4dCArPSBvbmU7CiAgICAgIGNtLnJlcGxhY2VTZWxlY3Rpb24odHh0KTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGFkZFByZWZpeE1hcChjbSkgewogICAgY20uc3RhdGUuZW1hY3NQcmVmaXhNYXAgPSB0cnVlOwogICAgY20uYWRkS2V5TWFwKHByZWZpeE1hcCk7CiAgICBjbS5vbigia2V5SGFuZGxlZCIsIG1heWJlUmVtb3ZlUHJlZml4TWFwKTsKICAgIGNtLm9uKCJpbnB1dFJlYWQiLCBtYXliZVJlbW92ZVByZWZpeE1hcCk7CiAgfQoKICBmdW5jdGlvbiBtYXliZVJlbW92ZVByZWZpeE1hcChjbSwgYXJnKSB7CiAgICBpZiAodHlwZW9mIGFyZyA9PSAic3RyaW5nIiAmJiAoL15cZCQvLnRlc3QoYXJnKSB8fCBhcmcgPT0gIkN0cmwtVSIpKSByZXR1cm47CiAgICBjbS5yZW1vdmVLZXlNYXAocHJlZml4TWFwKTsKICAgIGNtLnN0YXRlLmVtYWNzUHJlZml4TWFwID0gZmFsc2U7CiAgICBjbS5vZmYoImtleUhhbmRsZWQiLCBtYXliZVJlbW92ZVByZWZpeE1hcCk7CiAgICBjbS5vZmYoImlucHV0UmVhZCIsIG1heWJlUmVtb3ZlUHJlZml4TWFwKTsKICB9CgogIC8vIFV0aWxpdGllcwoKICBmdW5jdGlvbiBzZXRNYXJrKGNtKSB7CiAgICBjbS5zZXRDdXJzb3IoY20uZ2V0Q3Vyc29yKCkpOwogICAgY20uc2V0RXh0ZW5kaW5nKCFjbS5nZXRFeHRlbmRpbmcoKSk7CiAgICBjbS5vbigiY2hhbmdlIiwgZnVuY3Rpb24oKSB7IGNtLnNldEV4dGVuZGluZyhmYWxzZSk7IH0pOwogIH0KCiAgZnVuY3Rpb24gY2xlYXJNYXJrKGNtKSB7CiAgICBjbS5zZXRFeHRlbmRpbmcoZmFsc2UpOwogICAgY20uc2V0Q3Vyc29yKGNtLmdldEN1cnNvcigpKTsKICB9CgogIGZ1bmN0aW9uIGdldElucHV0KGNtLCBtc2csIGYpIHsKICAgIGlmIChjbS5vcGVuRGlhbG9nKQogICAgICBjbS5vcGVuRGlhbG9nKG1zZyArICI6IDxpbnB1dCB0eXBlPVwidGV4dFwiIHN0eWxlPVwid2lkdGg6IDEwZW1cIi8+IiwgZiwge2JvdHRvbTogdHJ1ZX0pOwogICAgZWxzZQogICAgICBmKHByb21wdChtc2csICIiKSk7CiAgfQoKICBmdW5jdGlvbiBvcGVyYXRlT25Xb3JkKGNtLCBvcCkgewogICAgdmFyIHN0YXJ0ID0gY20uZ2V0Q3Vyc29yKCksIGVuZCA9IGNtLmZpbmRQb3NIKHN0YXJ0LCAxLCAid29yZCIpOwogICAgY20ucmVwbGFjZVJhbmdlKG9wKGNtLmdldFJhbmdlKHN0YXJ0LCBlbmQpKSwgc3RhcnQsIGVuZCk7CiAgICBjbS5zZXRDdXJzb3IoZW5kKTsKICB9CgogIGZ1bmN0aW9uIHRvRW5jbG9zaW5nRXhwcihjbSkgewogICAgdmFyIHBvcyA9IGNtLmdldEN1cnNvcigpLCBsaW5lID0gcG9zLmxpbmUsIGNoID0gcG9zLmNoOwogICAgdmFyIHN0YWNrID0gW107CiAgICB3aGlsZSAobGluZSA+PSBjbS5maXJzdExpbmUoKSkgewogICAgICB2YXIgdGV4dCA9IGNtLmdldExpbmUobGluZSk7CiAgICAgIGZvciAodmFyIGkgPSBjaCA9PSBudWxsID8gdGV4dC5sZW5ndGggOiBjaDsgaSA+IDA7KSB7CiAgICAgICAgdmFyIGNoID0gdGV4dC5jaGFyQXQoLS1pKTsKICAgICAgICBpZiAoY2ggPT0gIikiKQogICAgICAgICAgc3RhY2sucHVzaCgiKCIpOwogICAgICAgIGVsc2UgaWYgKGNoID09ICJdIikKICAgICAgICAgIHN0YWNrLnB1c2goIlsiKTsKICAgICAgICBlbHNlIGlmIChjaCA9PSAifSIpCiAgICAgICAgICBzdGFjay5wdXNoKCJ7Iik7CiAgICAgICAgZWxzZSBpZiAoL1tcKFx7XFtdLy50ZXN0KGNoKSAmJiAoIXN0YWNrLmxlbmd0aCB8fCBzdGFjay5wb3AoKSAhPSBjaCkpCiAgICAgICAgICByZXR1cm4gY20uZXh0ZW5kU2VsZWN0aW9uKFBvcyhsaW5lLCBpKSk7CiAgICAgIH0KICAgICAgLS1saW5lOyBjaCA9IG51bGw7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBxdWl0KGNtKSB7CiAgICBjbS5leGVjQ29tbWFuZCgiY2xlYXJTZWFyY2giKTsKICAgIGNsZWFyTWFyayhjbSk7CiAgfQoKICAvLyBBY3R1YWwga2V5bWFwCgogIHZhciBrZXlNYXAgPSBDb2RlTWlycm9yLmtleU1hcC5lbWFjcyA9IENvZGVNaXJyb3Iubm9ybWFsaXplS2V5TWFwKHsKICAgICJDdHJsLVciOiBmdW5jdGlvbihjbSkge2tpbGwoY20sIGNtLmdldEN1cnNvcigic3RhcnQiKSwgY20uZ2V0Q3Vyc29yKCJlbmQiKSk7fSwKICAgICJDdHJsLUsiOiByZXBlYXRlZChmdW5jdGlvbihjbSkgewogICAgICB2YXIgc3RhcnQgPSBjbS5nZXRDdXJzb3IoKSwgZW5kID0gY20uY2xpcFBvcyhQb3Moc3RhcnQubGluZSkpOwogICAgICB2YXIgdGV4dCA9IGNtLmdldFJhbmdlKHN0YXJ0LCBlbmQpOwogICAgICBpZiAoIS9cUy8udGVzdCh0ZXh0KSkgewogICAgICAgIHRleHQgKz0gIlxuIjsKICAgICAgICBlbmQgPSBQb3Moc3RhcnQubGluZSArIDEsIDApOwogICAgICB9CiAgICAgIGtpbGwoY20sIHN0YXJ0LCBlbmQsIHRydWUsIHRleHQpOwogICAgfSksCiAgICAiQWx0LVciOiBmdW5jdGlvbihjbSkgewogICAgICBhZGRUb1JpbmcoY20uZ2V0U2VsZWN0aW9uKCkpOwogICAgICBjbGVhck1hcmsoY20pOwogICAgfSwKICAgICJDdHJsLVkiOiBmdW5jdGlvbihjbSkgewogICAgICB2YXIgc3RhcnQgPSBjbS5nZXRDdXJzb3IoKTsKICAgICAgY20ucmVwbGFjZVJhbmdlKGdldEZyb21SaW5nKGdldFByZWZpeChjbSkpLCBzdGFydCwgc3RhcnQsICJwYXN0ZSIpOwogICAgICBjbS5zZXRTZWxlY3Rpb24oc3RhcnQsIGNtLmdldEN1cnNvcigpKTsKICAgIH0sCiAgICAiQWx0LVkiOiBmdW5jdGlvbihjbSkge2NtLnJlcGxhY2VTZWxlY3Rpb24ocG9wRnJvbVJpbmcoKSwgImFyb3VuZCIsICJwYXN0ZSIpO30sCgogICAgIkN0cmwtU3BhY2UiOiBzZXRNYXJrLCAiQ3RybC1TaGlmdC0yIjogc2V0TWFyaywKCiAgICAiQ3RybC1GIjogbW92ZShieUNoYXIsIDEpLCAiQ3RybC1CIjogbW92ZShieUNoYXIsIC0xKSwKICAgICJSaWdodCI6IG1vdmUoYnlDaGFyLCAxKSwgIkxlZnQiOiBtb3ZlKGJ5Q2hhciwgLTEpLAogICAgIkN0cmwtRCI6IGZ1bmN0aW9uKGNtKSB7IGtpbGxUbyhjbSwgYnlDaGFyLCAxKTsgfSwKICAgICJEZWxldGUiOiBmdW5jdGlvbihjbSkgeyBraWxsUmVnaW9uKGNtKSB8fCBraWxsVG8oY20sIGJ5Q2hhciwgMSk7IH0sCiAgICAiQ3RybC1IIjogZnVuY3Rpb24oY20pIHsga2lsbFRvKGNtLCBieUNoYXIsIC0xKTsgfSwKICAgICJCYWNrc3BhY2UiOiBmdW5jdGlvbihjbSkgeyBraWxsUmVnaW9uKGNtKSB8fCBraWxsVG8oY20sIGJ5Q2hhciwgLTEpOyB9LAoKICAgICJBbHQtRiI6IG1vdmUoYnlXb3JkLCAxKSwgIkFsdC1CIjogbW92ZShieVdvcmQsIC0xKSwKICAgICJBbHQtRCI6IGZ1bmN0aW9uKGNtKSB7IGtpbGxUbyhjbSwgYnlXb3JkLCAxKTsgfSwKICAgICJBbHQtQmFja3NwYWNlIjogZnVuY3Rpb24oY20pIHsga2lsbFRvKGNtLCBieVdvcmQsIC0xKTsgfSwKCiAgICAiQ3RybC1OIjogbW92ZShieUxpbmUsIDEpLCAiQ3RybC1QIjogbW92ZShieUxpbmUsIC0xKSwKICAgICJEb3duIjogbW92ZShieUxpbmUsIDEpLCAiVXAiOiBtb3ZlKGJ5TGluZSwgLTEpLAogICAgIkN0cmwtQSI6ICJnb0xpbmVTdGFydCIsICJDdHJsLUUiOiAiZ29MaW5lRW5kIiwKICAgICJFbmQiOiAiZ29MaW5lRW5kIiwgIkhvbWUiOiAiZ29MaW5lU3RhcnQiLAoKICAgICJBbHQtViI6IG1vdmUoYnlQYWdlLCAtMSksICJDdHJsLVYiOiBtb3ZlKGJ5UGFnZSwgMSksCiAgICAiUGFnZVVwIjogbW92ZShieVBhZ2UsIC0xKSwgIlBhZ2VEb3duIjogbW92ZShieVBhZ2UsIDEpLAoKICAgICJDdHJsLVVwIjogbW92ZShieVBhcmFncmFwaCwgLTEpLCAiQ3RybC1Eb3duIjogbW92ZShieVBhcmFncmFwaCwgMSksCgogICAgIkFsdC1BIjogbW92ZShieVNlbnRlbmNlLCAtMSksICJBbHQtRSI6IG1vdmUoYnlTZW50ZW5jZSwgMSksCiAgICAiQWx0LUsiOiBmdW5jdGlvbihjbSkgeyBraWxsVG8oY20sIGJ5U2VudGVuY2UsIDEpOyB9LAoKICAgICJDdHJsLUFsdC1LIjogZnVuY3Rpb24oY20pIHsga2lsbFRvKGNtLCBieUV4cHIsIDEpOyB9LAogICAgIkN0cmwtQWx0LUJhY2tzcGFjZSI6IGZ1bmN0aW9uKGNtKSB7IGtpbGxUbyhjbSwgYnlFeHByLCAtMSk7IH0sCiAgICAiQ3RybC1BbHQtRiI6IG1vdmUoYnlFeHByLCAxKSwgIkN0cmwtQWx0LUIiOiBtb3ZlKGJ5RXhwciwgLTEpLAoKICAgICJTaGlmdC1DdHJsLUFsdC0yIjogZnVuY3Rpb24oY20pIHsKICAgICAgdmFyIGN1cnNvciA9IGNtLmdldEN1cnNvcigpOwogICAgICBjbS5zZXRTZWxlY3Rpb24oZmluZEVuZChjbSwgY3Vyc29yLCBieUV4cHIsIDEpLCBjdXJzb3IpOwogICAgfSwKICAgICJDdHJsLUFsdC1UIjogZnVuY3Rpb24oY20pIHsKICAgICAgdmFyIGxlZnRTdGFydCA9IGJ5RXhwcihjbSwgY20uZ2V0Q3Vyc29yKCksIC0xKSwgbGVmdEVuZCA9IGJ5RXhwcihjbSwgbGVmdFN0YXJ0LCAxKTsKICAgICAgdmFyIHJpZ2h0RW5kID0gYnlFeHByKGNtLCBsZWZ0RW5kLCAxKSwgcmlnaHRTdGFydCA9IGJ5RXhwcihjbSwgcmlnaHRFbmQsIC0xKTsKICAgICAgY20ucmVwbGFjZVJhbmdlKGNtLmdldFJhbmdlKHJpZ2h0U3RhcnQsIHJpZ2h0RW5kKSArIGNtLmdldFJhbmdlKGxlZnRFbmQsIHJpZ2h0U3RhcnQpICsKICAgICAgICAgICAgICAgICAgICAgIGNtLmdldFJhbmdlKGxlZnRTdGFydCwgbGVmdEVuZCksIGxlZnRTdGFydCwgcmlnaHRFbmQpOwogICAgfSwKICAgICJDdHJsLUFsdC1VIjogcmVwZWF0ZWQodG9FbmNsb3NpbmdFeHByKSwKCiAgICAiQWx0LVNwYWNlIjogZnVuY3Rpb24oY20pIHsKICAgICAgdmFyIHBvcyA9IGNtLmdldEN1cnNvcigpLCBmcm9tID0gcG9zLmNoLCB0byA9IHBvcy5jaCwgdGV4dCA9IGNtLmdldExpbmUocG9zLmxpbmUpOwogICAgICB3aGlsZSAoZnJvbSAmJiAvXHMvLnRlc3QodGV4dC5jaGFyQXQoZnJvbSAtIDEpKSkgLS1mcm9tOwogICAgICB3aGlsZSAodG8gPCB0ZXh0Lmxlbmd0aCAmJiAvXHMvLnRlc3QodGV4dC5jaGFyQXQodG8pKSkgKyt0bzsKICAgICAgY20ucmVwbGFjZVJhbmdlKCIgIiwgUG9zKHBvcy5saW5lLCBmcm9tKSwgUG9zKHBvcy5saW5lLCB0bykpOwogICAgfSwKICAgICJDdHJsLU8iOiByZXBlYXRlZChmdW5jdGlvbihjbSkgeyBjbS5yZXBsYWNlU2VsZWN0aW9uKCJcbiIsICJzdGFydCIpOyB9KSwKICAgICJDdHJsLVQiOiByZXBlYXRlZChmdW5jdGlvbihjbSkgewogICAgICBjbS5leGVjQ29tbWFuZCgidHJhbnNwb3NlQ2hhcnMiKTsKICAgIH0pLAoKICAgICJBbHQtQyI6IHJlcGVhdGVkKGZ1bmN0aW9uKGNtKSB7CiAgICAgIG9wZXJhdGVPbldvcmQoY20sIGZ1bmN0aW9uKHcpIHsKICAgICAgICB2YXIgbGV0dGVyID0gdy5zZWFyY2goL1x3Lyk7CiAgICAgICAgaWYgKGxldHRlciA9PSAtMSkgcmV0dXJuIHc7CiAgICAgICAgcmV0dXJuIHcuc2xpY2UoMCwgbGV0dGVyKSArIHcuY2hhckF0KGxldHRlcikudG9VcHBlckNhc2UoKSArIHcuc2xpY2UobGV0dGVyICsgMSkudG9Mb3dlckNhc2UoKTsKICAgICAgfSk7CiAgICB9KSwKICAgICJBbHQtVSI6IHJlcGVhdGVkKGZ1bmN0aW9uKGNtKSB7CiAgICAgIG9wZXJhdGVPbldvcmQoY20sIGZ1bmN0aW9uKHcpIHsgcmV0dXJuIHcudG9VcHBlckNhc2UoKTsgfSk7CiAgICB9KSwKICAgICJBbHQtTCI6IHJlcGVhdGVkKGZ1bmN0aW9uKGNtKSB7CiAgICAgIG9wZXJhdGVPbldvcmQoY20sIGZ1bmN0aW9uKHcpIHsgcmV0dXJuIHcudG9Mb3dlckNhc2UoKTsgfSk7CiAgICB9KSwKCiAgICAiQWx0LTsiOiAidG9nZ2xlQ29tbWVudCIsCgogICAgIkN0cmwtLyI6IHJlcGVhdGVkKCJ1bmRvIiksICJTaGlmdC1DdHJsLS0iOiByZXBlYXRlZCgidW5kbyIpLAogICAgIkN0cmwtWiI6IHJlcGVhdGVkKCJ1bmRvIiksICJDbWQtWiI6IHJlcGVhdGVkKCJ1bmRvIiksCiAgICAiU2hpZnQtQWx0LSwiOiAiZ29Eb2NTdGFydCIsICJTaGlmdC1BbHQtLiI6ICJnb0RvY0VuZCIsCiAgICAiQ3RybC1TIjogImZpbmROZXh0IiwgIkN0cmwtUiI6ICJmaW5kUHJldiIsICJDdHJsLUciOiBxdWl0LCAiU2hpZnQtQWx0LTUiOiAicmVwbGFjZSIsCiAgICAiQWx0LS8iOiAiYXV0b2NvbXBsZXRlIiwKICAgICJDdHJsLUoiOiAibmV3bGluZUFuZEluZGVudCIsICJFbnRlciI6IGZhbHNlLCAiVGFiIjogImluZGVudEF1dG8iLAoKICAgICJBbHQtRyBHIjogZnVuY3Rpb24oY20pIHsKICAgICAgdmFyIHByZWZpeCA9IGdldFByZWZpeChjbSwgdHJ1ZSk7CiAgICAgIGlmIChwcmVmaXggIT0gbnVsbCAmJiBwcmVmaXggPiAwKSByZXR1cm4gY20uc2V0Q3Vyc29yKHByZWZpeCAtIDEpOwoKICAgICAgZ2V0SW5wdXQoY20sICJHb3RvIGxpbmUiLCBmdW5jdGlvbihzdHIpIHsKICAgICAgICB2YXIgbnVtOwogICAgICAgIGlmIChzdHIgJiYgIWlzTmFOKG51bSA9IE51bWJlcihzdHIpKSAmJiBudW0gPT0gKG51bXwwKSAmJiBudW0gPiAwKQogICAgICAgICAgY20uc2V0Q3Vyc29yKG51bSAtIDEpOwogICAgICB9KTsKICAgIH0sCgogICAgIkN0cmwtWCBUYWIiOiBmdW5jdGlvbihjbSkgewogICAgICBjbS5pbmRlbnRTZWxlY3Rpb24oZ2V0UHJlZml4KGNtLCB0cnVlKSB8fCBjbS5nZXRPcHRpb24oImluZGVudFVuaXQiKSk7CiAgICB9LAogICAgIkN0cmwtWCBDdHJsLVgiOiBmdW5jdGlvbihjbSkgewogICAgICBjbS5zZXRTZWxlY3Rpb24oY20uZ2V0Q3Vyc29yKCJoZWFkIiksIGNtLmdldEN1cnNvcigiYW5jaG9yIikpOwogICAgfSwKICAgICJDdHJsLVggQ3RybC1TIjogInNhdmUiLAogICAgIkN0cmwtWCBDdHJsLVciOiAic2F2ZSIsCiAgICAiQ3RybC1YIFMiOiAic2F2ZUFsbCIsCiAgICAiQ3RybC1YIEYiOiAib3BlbiIsCiAgICAiQ3RybC1YIFUiOiByZXBlYXRlZCgidW5kbyIpLAogICAgIkN0cmwtWCBLIjogImNsb3NlIiwKICAgICJDdHJsLVggRGVsZXRlIjogZnVuY3Rpb24oY20pIHsga2lsbChjbSwgY20uZ2V0Q3Vyc29yKCksIGJ5U2VudGVuY2UoY20sIGNtLmdldEN1cnNvcigpLCAxKSwgdHJ1ZSk7IH0sCiAgICAiQ3RybC1YIEgiOiAic2VsZWN0QWxsIiwKCiAgICAiQ3RybC1RIFRhYiI6IHJlcGVhdGVkKCJpbnNlcnRUYWIiKSwKICAgICJDdHJsLVUiOiBhZGRQcmVmaXhNYXAKICB9KTsKCiAgdmFyIHByZWZpeE1hcCA9IHsiQ3RybC1HIjogY2xlYXJQcmVmaXh9OwogIGZ1bmN0aW9uIHJlZ1ByZWZpeChkKSB7CiAgICBwcmVmaXhNYXBbZF0gPSBmdW5jdGlvbihjbSkgeyBhZGRQcmVmaXgoY20sIGQpOyB9OwogICAga2V5TWFwWyJDdHJsLSIgKyBkXSA9IGZ1bmN0aW9uKGNtKSB7IGFkZFByZWZpeChjbSwgZCk7IH07CiAgICBwcmVmaXhQcmVzZXJ2aW5nS2V5c1siQ3RybC0iICsgZF0gPSB0cnVlOwogIH0KICBmb3IgKHZhciBpID0gMDsgaSA8IDEwOyArK2kpIHJlZ1ByZWZpeChTdHJpbmcoaSkpOwogIHJlZ1ByZWZpeCgiLSIpOwp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/keymap/sublime.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovLyBBIHJvdWdoIGFwcHJveGltYXRpb24gb2YgU3VibGltZSBUZXh0J3Mga2V5YmluZGluZ3MKLy8gRGVwZW5kcyBvbiBhZGRvbi9zZWFyY2gvc2VhcmNoY3Vyc29yLmpzIGFuZCBvcHRpb25hbGx5IGFkZG9uL2RpYWxvZy9kaWFsb2dzLmpzCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vbGliL2NvZGVtaXJyb3IiKSwgcmVxdWlyZSgiLi4vYWRkb24vc2VhcmNoL3NlYXJjaGN1cnNvciIpLCByZXF1aXJlKCIuLi9hZGRvbi9lZGl0L21hdGNoYnJhY2tldHMiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vbGliL2NvZGVtaXJyb3IiLCAiLi4vYWRkb24vc2VhcmNoL3NlYXJjaGN1cnNvciIsICIuLi9hZGRvbi9lZGl0L21hdGNoYnJhY2tldHMiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CgogIHZhciBtYXAgPSBDb2RlTWlycm9yLmtleU1hcC5zdWJsaW1lID0ge2ZhbGx0aHJvdWdoOiAiZGVmYXVsdCJ9OwogIHZhciBjbWRzID0gQ29kZU1pcnJvci5jb21tYW5kczsKICB2YXIgUG9zID0gQ29kZU1pcnJvci5Qb3M7CiAgdmFyIG1hYyA9IENvZGVNaXJyb3Iua2V5TWFwWyJkZWZhdWx0Il0gPT0gQ29kZU1pcnJvci5rZXlNYXAubWFjRGVmYXVsdDsKICB2YXIgY3RybCA9IG1hYyA/ICJDbWQtIiA6ICJDdHJsLSI7CgogIC8vIFRoaXMgaXMgbm90IGV4YWN0bHkgU3VibGltZSdzIGFsZ29yaXRobS4gSSBjb3VsZG4ndCBtYWtlIGhlYWRzIG9yIHRhaWxzIG9mIHRoYXQuCiAgZnVuY3Rpb24gZmluZFBvc1N1YndvcmQoZG9jLCBzdGFydCwgZGlyKSB7CiAgICBpZiAoZGlyIDwgMCAmJiBzdGFydC5jaCA9PSAwKSByZXR1cm4gZG9jLmNsaXBQb3MoUG9zKHN0YXJ0LmxpbmUgLSAxKSk7CiAgICB2YXIgbGluZSA9IGRvYy5nZXRMaW5lKHN0YXJ0LmxpbmUpOwogICAgaWYgKGRpciA+IDAgJiYgc3RhcnQuY2ggPj0gbGluZS5sZW5ndGgpIHJldHVybiBkb2MuY2xpcFBvcyhQb3Moc3RhcnQubGluZSArIDEsIDApKTsKICAgIHZhciBzdGF0ZSA9ICJzdGFydCIsIHR5cGU7CiAgICBmb3IgKHZhciBwb3MgPSBzdGFydC5jaCwgZSA9IGRpciA8IDAgPyAwIDogbGluZS5sZW5ndGgsIGkgPSAwOyBwb3MgIT0gZTsgcG9zICs9IGRpciwgaSsrKSB7CiAgICAgIHZhciBuZXh0ID0gbGluZS5jaGFyQXQoZGlyIDwgMCA/IHBvcyAtIDEgOiBwb3MpOwogICAgICB2YXIgY2F0ID0gbmV4dCAhPSAiXyIgJiYgQ29kZU1pcnJvci5pc1dvcmRDaGFyKG5leHQpID8gInciIDogIm8iOwogICAgICBpZiAoY2F0ID09ICJ3IiAmJiBuZXh0LnRvVXBwZXJDYXNlKCkgPT0gbmV4dCkgY2F0ID0gIlciOwogICAgICBpZiAoc3RhdGUgPT0gInN0YXJ0IikgewogICAgICAgIGlmIChjYXQgIT0gIm8iKSB7IHN0YXRlID0gImluIjsgdHlwZSA9IGNhdDsgfQogICAgICB9IGVsc2UgaWYgKHN0YXRlID09ICJpbiIpIHsKICAgICAgICBpZiAodHlwZSAhPSBjYXQpIHsKICAgICAgICAgIGlmICh0eXBlID09ICJ3IiAmJiBjYXQgPT0gIlciICYmIGRpciA8IDApIHBvcy0tOwogICAgICAgICAgaWYgKHR5cGUgPT0gIlciICYmIGNhdCA9PSAidyIgJiYgZGlyID4gMCkgeyB0eXBlID0gInciOyBjb250aW51ZTsgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICByZXR1cm4gUG9zKHN0YXJ0LmxpbmUsIHBvcyk7CiAgfQoKICBmdW5jdGlvbiBtb3ZlU3Vid29yZChjbSwgZGlyKSB7CiAgICBjbS5leHRlbmRTZWxlY3Rpb25zQnkoZnVuY3Rpb24ocmFuZ2UpIHsKICAgICAgaWYgKGNtLmRpc3BsYXkuc2hpZnQgfHwgY20uZG9jLmV4dGVuZCB8fCByYW5nZS5lbXB0eSgpKQogICAgICAgIHJldHVybiBmaW5kUG9zU3Vid29yZChjbS5kb2MsIHJhbmdlLmhlYWQsIGRpcik7CiAgICAgIGVsc2UKICAgICAgICByZXR1cm4gZGlyIDwgMCA/IHJhbmdlLmZyb20oKSA6IHJhbmdlLnRvKCk7CiAgICB9KTsKICB9CgogIHZhciBnb1N1YndvcmRDb21ibyA9IG1hYyA/ICJDdHJsLSIgOiAiQWx0LSI7CgogIGNtZHNbbWFwW2dvU3Vid29yZENvbWJvICsgIkxlZnQiXSA9ICJnb1N1YndvcmRMZWZ0Il0gPSBmdW5jdGlvbihjbSkgeyBtb3ZlU3Vid29yZChjbSwgLTEpOyB9OwogIGNtZHNbbWFwW2dvU3Vid29yZENvbWJvICsgIlJpZ2h0Il0gPSAiZ29TdWJ3b3JkUmlnaHQiXSA9IGZ1bmN0aW9uKGNtKSB7IG1vdmVTdWJ3b3JkKGNtLCAxKTsgfTsKCiAgaWYgKG1hYykgbWFwWyJDbWQtTGVmdCJdID0gImdvTGluZVN0YXJ0U21hcnQiOwoKICB2YXIgc2Nyb2xsTGluZUNvbWJvID0gbWFjID8gIkN0cmwtQWx0LSIgOiAiQ3RybC0iOwoKICBjbWRzW21hcFtzY3JvbGxMaW5lQ29tYm8gKyAiVXAiXSA9ICJzY3JvbGxMaW5lVXAiXSA9IGZ1bmN0aW9uKGNtKSB7CiAgICB2YXIgaW5mbyA9IGNtLmdldFNjcm9sbEluZm8oKTsKICAgIGlmICghY20uc29tZXRoaW5nU2VsZWN0ZWQoKSkgewogICAgICB2YXIgdmlzaWJsZUJvdHRvbUxpbmUgPSBjbS5saW5lQXRIZWlnaHQoaW5mby50b3AgKyBpbmZvLmNsaWVudEhlaWdodCwgImxvY2FsIik7CiAgICAgIGlmIChjbS5nZXRDdXJzb3IoKS5saW5lID49IHZpc2libGVCb3R0b21MaW5lKQogICAgICAgIGNtLmV4ZWNDb21tYW5kKCJnb0xpbmVVcCIpOwogICAgfQogICAgY20uc2Nyb2xsVG8obnVsbCwgaW5mby50b3AgLSBjbS5kZWZhdWx0VGV4dEhlaWdodCgpKTsKICB9OwogIGNtZHNbbWFwW3Njcm9sbExpbmVDb21ibyArICJEb3duIl0gPSAic2Nyb2xsTGluZURvd24iXSA9IGZ1bmN0aW9uKGNtKSB7CiAgICB2YXIgaW5mbyA9IGNtLmdldFNjcm9sbEluZm8oKTsKICAgIGlmICghY20uc29tZXRoaW5nU2VsZWN0ZWQoKSkgewogICAgICB2YXIgdmlzaWJsZVRvcExpbmUgPSBjbS5saW5lQXRIZWlnaHQoaW5mby50b3AsICJsb2NhbCIpKzE7CiAgICAgIGlmIChjbS5nZXRDdXJzb3IoKS5saW5lIDw9IHZpc2libGVUb3BMaW5lKQogICAgICAgIGNtLmV4ZWNDb21tYW5kKCJnb0xpbmVEb3duIik7CiAgICB9CiAgICBjbS5zY3JvbGxUbyhudWxsLCBpbmZvLnRvcCArIGNtLmRlZmF1bHRUZXh0SGVpZ2h0KCkpOwogIH07CgogIGNtZHNbbWFwWyJTaGlmdC0iICsgY3RybCArICJMIl0gPSAic3BsaXRTZWxlY3Rpb25CeUxpbmUiXSA9IGZ1bmN0aW9uKGNtKSB7CiAgICB2YXIgcmFuZ2VzID0gY20ubGlzdFNlbGVjdGlvbnMoKSwgbGluZVJhbmdlcyA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGZyb20gPSByYW5nZXNbaV0uZnJvbSgpLCB0byA9IHJhbmdlc1tpXS50bygpOwogICAgICBmb3IgKHZhciBsaW5lID0gZnJvbS5saW5lOyBsaW5lIDw9IHRvLmxpbmU7ICsrbGluZSkKICAgICAgICBpZiAoISh0by5saW5lID4gZnJvbS5saW5lICYmIGxpbmUgPT0gdG8ubGluZSAmJiB0by5jaCA9PSAwKSkKICAgICAgICAgIGxpbmVSYW5nZXMucHVzaCh7YW5jaG9yOiBsaW5lID09IGZyb20ubGluZSA/IGZyb20gOiBQb3MobGluZSwgMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWQ6IGxpbmUgPT0gdG8ubGluZSA/IHRvIDogUG9zKGxpbmUpfSk7CiAgICB9CiAgICBjbS5zZXRTZWxlY3Rpb25zKGxpbmVSYW5nZXMsIDApOwogIH07CgogIG1hcFsiU2hpZnQtVGFiIl0gPSAiaW5kZW50TGVzcyI7CgogIGNtZHNbbWFwWyJFc2MiXSA9ICJzaW5nbGVTZWxlY3Rpb25Ub3AiXSA9IGZ1bmN0aW9uKGNtKSB7CiAgICB2YXIgcmFuZ2UgPSBjbS5saXN0U2VsZWN0aW9ucygpWzBdOwogICAgY20uc2V0U2VsZWN0aW9uKHJhbmdlLmFuY2hvciwgcmFuZ2UuaGVhZCwge3Njcm9sbDogZmFsc2V9KTsKICB9OwoKICBjbWRzW21hcFtjdHJsICsgIkwiXSA9ICJzZWxlY3RMaW5lIl0gPSBmdW5jdGlvbihjbSkgewogICAgdmFyIHJhbmdlcyA9IGNtLmxpc3RTZWxlY3Rpb25zKCksIGV4dGVuZGVkID0gW107CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJhbmdlcy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgcmFuZ2UgPSByYW5nZXNbaV07CiAgICAgIGV4dGVuZGVkLnB1c2goe2FuY2hvcjogUG9zKHJhbmdlLmZyb20oKS5saW5lLCAwKSwKICAgICAgICAgICAgICAgICAgICAgaGVhZDogUG9zKHJhbmdlLnRvKCkubGluZSArIDEsIDApfSk7CiAgICB9CiAgICBjbS5zZXRTZWxlY3Rpb25zKGV4dGVuZGVkKTsKICB9OwoKICBtYXBbIlNoaWZ0LUN0cmwtSyJdID0gImRlbGV0ZUxpbmUiOwoKICBmdW5jdGlvbiBpbnNlcnRMaW5lKGNtLCBhYm92ZSkgewogICAgaWYgKGNtLmlzUmVhZE9ubHkoKSkgcmV0dXJuIENvZGVNaXJyb3IuUGFzcwogICAgY20ub3BlcmF0aW9uKGZ1bmN0aW9uKCkgewogICAgICB2YXIgbGVuID0gY20ubGlzdFNlbGVjdGlvbnMoKS5sZW5ndGgsIG5ld1NlbGVjdGlvbiA9IFtdLCBsYXN0ID0gLTE7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICB2YXIgaGVhZCA9IGNtLmxpc3RTZWxlY3Rpb25zKClbaV0uaGVhZDsKICAgICAgICBpZiAoaGVhZC5saW5lIDw9IGxhc3QpIGNvbnRpbnVlOwogICAgICAgIHZhciBhdCA9IFBvcyhoZWFkLmxpbmUgKyAoYWJvdmUgPyAwIDogMSksIDApOwogICAgICAgIGNtLnJlcGxhY2VSYW5nZSgiXG4iLCBhdCwgbnVsbCwgIitpbnNlcnRMaW5lIik7CiAgICAgICAgY20uaW5kZW50TGluZShhdC5saW5lLCBudWxsLCB0cnVlKTsKICAgICAgICBuZXdTZWxlY3Rpb24ucHVzaCh7aGVhZDogYXQsIGFuY2hvcjogYXR9KTsKICAgICAgICBsYXN0ID0gaGVhZC5saW5lICsgMTsKICAgICAgfQogICAgICBjbS5zZXRTZWxlY3Rpb25zKG5ld1NlbGVjdGlvbik7CiAgICB9KTsKICAgIGNtLmV4ZWNDb21tYW5kKCJpbmRlbnRBdXRvIik7CiAgfQoKICBjbWRzW21hcFtjdHJsICsgIkVudGVyIl0gPSAiaW5zZXJ0TGluZUFmdGVyIl0gPSBmdW5jdGlvbihjbSkgeyByZXR1cm4gaW5zZXJ0TGluZShjbSwgZmFsc2UpOyB9OwoKICBjbWRzW21hcFsiU2hpZnQtIiArIGN0cmwgKyAiRW50ZXIiXSA9ICJpbnNlcnRMaW5lQmVmb3JlIl0gPSBmdW5jdGlvbihjbSkgeyByZXR1cm4gaW5zZXJ0TGluZShjbSwgdHJ1ZSk7IH07CgogIGZ1bmN0aW9uIHdvcmRBdChjbSwgcG9zKSB7CiAgICB2YXIgc3RhcnQgPSBwb3MuY2gsIGVuZCA9IHN0YXJ0LCBsaW5lID0gY20uZ2V0TGluZShwb3MubGluZSk7CiAgICB3aGlsZSAoc3RhcnQgJiYgQ29kZU1pcnJvci5pc1dvcmRDaGFyKGxpbmUuY2hhckF0KHN0YXJ0IC0gMSkpKSAtLXN0YXJ0OwogICAgd2hpbGUgKGVuZCA8IGxpbmUubGVuZ3RoICYmIENvZGVNaXJyb3IuaXNXb3JkQ2hhcihsaW5lLmNoYXJBdChlbmQpKSkgKytlbmQ7CiAgICByZXR1cm4ge2Zyb206IFBvcyhwb3MubGluZSwgc3RhcnQpLCB0bzogUG9zKHBvcy5saW5lLCBlbmQpLCB3b3JkOiBsaW5lLnNsaWNlKHN0YXJ0LCBlbmQpfTsKICB9CgogIGNtZHNbbWFwW2N0cmwgKyAiRCJdID0gInNlbGVjdE5leHRPY2N1cnJlbmNlIl0gPSBmdW5jdGlvbihjbSkgewogICAgdmFyIGZyb20gPSBjbS5nZXRDdXJzb3IoImZyb20iKSwgdG8gPSBjbS5nZXRDdXJzb3IoInRvIik7CiAgICB2YXIgZnVsbFdvcmQgPSBjbS5zdGF0ZS5zdWJsaW1lRmluZEZ1bGxXb3JkID09IGNtLmRvYy5zZWw7CiAgICBpZiAoQ29kZU1pcnJvci5jbXBQb3MoZnJvbSwgdG8pID09IDApIHsKICAgICAgdmFyIHdvcmQgPSB3b3JkQXQoY20sIGZyb20pOwogICAgICBpZiAoIXdvcmQud29yZCkgcmV0dXJuOwogICAgICBjbS5zZXRTZWxlY3Rpb24od29yZC5mcm9tLCB3b3JkLnRvKTsKICAgICAgZnVsbFdvcmQgPSB0cnVlOwogICAgfSBlbHNlIHsKICAgICAgdmFyIHRleHQgPSBjbS5nZXRSYW5nZShmcm9tLCB0byk7CiAgICAgIHZhciBxdWVyeSA9IGZ1bGxXb3JkID8gbmV3IFJlZ0V4cCgiXFxiIiArIHRleHQgKyAiXFxiIikgOiB0ZXh0OwogICAgICB2YXIgY3VyID0gY20uZ2V0U2VhcmNoQ3Vyc29yKHF1ZXJ5LCB0byk7CiAgICAgIGlmIChjdXIuZmluZE5leHQoKSkgewogICAgICAgIGNtLmFkZFNlbGVjdGlvbihjdXIuZnJvbSgpLCBjdXIudG8oKSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgY3VyID0gY20uZ2V0U2VhcmNoQ3Vyc29yKHF1ZXJ5LCBQb3MoY20uZmlyc3RMaW5lKCksIDApKTsKICAgICAgICBpZiAoY3VyLmZpbmROZXh0KCkpCiAgICAgICAgICBjbS5hZGRTZWxlY3Rpb24oY3VyLmZyb20oKSwgY3VyLnRvKCkpOwogICAgICB9CiAgICB9CiAgICBpZiAoZnVsbFdvcmQpCiAgICAgIGNtLnN0YXRlLnN1YmxpbWVGaW5kRnVsbFdvcmQgPSBjbS5kb2Muc2VsOwogIH07CgogIHZhciBtaXJyb3IgPSAiKCl7fVtdIjsKICBmdW5jdGlvbiBzZWxlY3RCZXR3ZWVuQnJhY2tldHMoY20pIHsKICAgIHZhciBwb3MgPSBjbS5nZXRDdXJzb3IoKSwgb3BlbmluZyA9IGNtLnNjYW5Gb3JCcmFja2V0KHBvcywgLTEpOwogICAgaWYgKCFvcGVuaW5nKSByZXR1cm47CiAgICBmb3IgKDs7KSB7CiAgICAgIHZhciBjbG9zaW5nID0gY20uc2NhbkZvckJyYWNrZXQocG9zLCAxKTsKICAgICAgaWYgKCFjbG9zaW5nKSByZXR1cm47CiAgICAgIGlmIChjbG9zaW5nLmNoID09IG1pcnJvci5jaGFyQXQobWlycm9yLmluZGV4T2Yob3BlbmluZy5jaCkgKyAxKSkgewogICAgICAgIGNtLnNldFNlbGVjdGlvbihQb3Mob3BlbmluZy5wb3MubGluZSwgb3BlbmluZy5wb3MuY2ggKyAxKSwgY2xvc2luZy5wb3MsIGZhbHNlKTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICBwb3MgPSBQb3MoY2xvc2luZy5wb3MubGluZSwgY2xvc2luZy5wb3MuY2ggKyAxKTsKICAgIH0KICB9CgogIGNtZHNbbWFwWyJTaGlmdC0iICsgY3RybCArICJTcGFjZSJdID0gInNlbGVjdFNjb3BlIl0gPSBmdW5jdGlvbihjbSkgewogICAgc2VsZWN0QmV0d2VlbkJyYWNrZXRzKGNtKSB8fCBjbS5leGVjQ29tbWFuZCgic2VsZWN0QWxsIik7CiAgfTsKICBjbWRzW21hcFsiU2hpZnQtIiArIGN0cmwgKyAiTSJdID0gInNlbGVjdEJldHdlZW5CcmFja2V0cyJdID0gZnVuY3Rpb24oY20pIHsKICAgIGlmICghc2VsZWN0QmV0d2VlbkJyYWNrZXRzKGNtKSkgcmV0dXJuIENvZGVNaXJyb3IuUGFzczsKICB9OwoKICBjbWRzW21hcFtjdHJsICsgIk0iXSA9ICJnb1RvQnJhY2tldCJdID0gZnVuY3Rpb24oY20pIHsKICAgIGNtLmV4dGVuZFNlbGVjdGlvbnNCeShmdW5jdGlvbihyYW5nZSkgewogICAgICB2YXIgbmV4dCA9IGNtLnNjYW5Gb3JCcmFja2V0KHJhbmdlLmhlYWQsIDEpOwogICAgICBpZiAobmV4dCAmJiBDb2RlTWlycm9yLmNtcFBvcyhuZXh0LnBvcywgcmFuZ2UuaGVhZCkgIT0gMCkgcmV0dXJuIG5leHQucG9zOwogICAgICB2YXIgcHJldiA9IGNtLnNjYW5Gb3JCcmFja2V0KHJhbmdlLmhlYWQsIC0xKTsKICAgICAgcmV0dXJuIHByZXYgJiYgUG9zKHByZXYucG9zLmxpbmUsIHByZXYucG9zLmNoICsgMSkgfHwgcmFuZ2UuaGVhZDsKICAgIH0pOwogIH07CgogIHZhciBzd2FwTGluZUNvbWJvID0gbWFjID8gIkNtZC1DdHJsLSIgOiAiU2hpZnQtQ3RybC0iOwoKICBjbWRzW21hcFtzd2FwTGluZUNvbWJvICsgIlVwIl0gPSAic3dhcExpbmVVcCJdID0gZnVuY3Rpb24oY20pIHsKICAgIGlmIChjbS5pc1JlYWRPbmx5KCkpIHJldHVybiBDb2RlTWlycm9yLlBhc3MKICAgIHZhciByYW5nZXMgPSBjbS5saXN0U2VsZWN0aW9ucygpLCBsaW5lc1RvTW92ZSA9IFtdLCBhdCA9IGNtLmZpcnN0TGluZSgpIC0gMSwgbmV3U2VscyA9IFtdOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIHJhbmdlID0gcmFuZ2VzW2ldLCBmcm9tID0gcmFuZ2UuZnJvbSgpLmxpbmUgLSAxLCB0byA9IHJhbmdlLnRvKCkubGluZTsKICAgICAgbmV3U2Vscy5wdXNoKHthbmNob3I6IFBvcyhyYW5nZS5hbmNob3IubGluZSAtIDEsIHJhbmdlLmFuY2hvci5jaCksCiAgICAgICAgICAgICAgICAgICAgaGVhZDogUG9zKHJhbmdlLmhlYWQubGluZSAtIDEsIHJhbmdlLmhlYWQuY2gpfSk7CiAgICAgIGlmIChyYW5nZS50bygpLmNoID09IDAgJiYgIXJhbmdlLmVtcHR5KCkpIC0tdG87CiAgICAgIGlmIChmcm9tID4gYXQpIGxpbmVzVG9Nb3ZlLnB1c2goZnJvbSwgdG8pOwogICAgICBlbHNlIGlmIChsaW5lc1RvTW92ZS5sZW5ndGgpIGxpbmVzVG9Nb3ZlW2xpbmVzVG9Nb3ZlLmxlbmd0aCAtIDFdID0gdG87CiAgICAgIGF0ID0gdG87CiAgICB9CiAgICBjbS5vcGVyYXRpb24oZnVuY3Rpb24oKSB7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZXNUb01vdmUubGVuZ3RoOyBpICs9IDIpIHsKICAgICAgICB2YXIgZnJvbSA9IGxpbmVzVG9Nb3ZlW2ldLCB0byA9IGxpbmVzVG9Nb3ZlW2kgKyAxXTsKICAgICAgICB2YXIgbGluZSA9IGNtLmdldExpbmUoZnJvbSk7CiAgICAgICAgY20ucmVwbGFjZVJhbmdlKCIiLCBQb3MoZnJvbSwgMCksIFBvcyhmcm9tICsgMSwgMCksICIrc3dhcExpbmUiKTsKICAgICAgICBpZiAodG8gPiBjbS5sYXN0TGluZSgpKQogICAgICAgICAgY20ucmVwbGFjZVJhbmdlKCJcbiIgKyBsaW5lLCBQb3MoY20ubGFzdExpbmUoKSksIG51bGwsICIrc3dhcExpbmUiKTsKICAgICAgICBlbHNlCiAgICAgICAgICBjbS5yZXBsYWNlUmFuZ2UobGluZSArICJcbiIsIFBvcyh0bywgMCksIG51bGwsICIrc3dhcExpbmUiKTsKICAgICAgfQogICAgICBjbS5zZXRTZWxlY3Rpb25zKG5ld1NlbHMpOwogICAgICBjbS5zY3JvbGxJbnRvVmlldygpOwogICAgfSk7CiAgfTsKCiAgY21kc1ttYXBbc3dhcExpbmVDb21ibyArICJEb3duIl0gPSAic3dhcExpbmVEb3duIl0gPSBmdW5jdGlvbihjbSkgewogICAgaWYgKGNtLmlzUmVhZE9ubHkoKSkgcmV0dXJuIENvZGVNaXJyb3IuUGFzcwogICAgdmFyIHJhbmdlcyA9IGNtLmxpc3RTZWxlY3Rpb25zKCksIGxpbmVzVG9Nb3ZlID0gW10sIGF0ID0gY20ubGFzdExpbmUoKSArIDE7CiAgICBmb3IgKHZhciBpID0gcmFuZ2VzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgIHZhciByYW5nZSA9IHJhbmdlc1tpXSwgZnJvbSA9IHJhbmdlLnRvKCkubGluZSArIDEsIHRvID0gcmFuZ2UuZnJvbSgpLmxpbmU7CiAgICAgIGlmIChyYW5nZS50bygpLmNoID09IDAgJiYgIXJhbmdlLmVtcHR5KCkpIGZyb20tLTsKICAgICAgaWYgKGZyb20gPCBhdCkgbGluZXNUb01vdmUucHVzaChmcm9tLCB0byk7CiAgICAgIGVsc2UgaWYgKGxpbmVzVG9Nb3ZlLmxlbmd0aCkgbGluZXNUb01vdmVbbGluZXNUb01vdmUubGVuZ3RoIC0gMV0gPSB0bzsKICAgICAgYXQgPSB0bzsKICAgIH0KICAgIGNtLm9wZXJhdGlvbihmdW5jdGlvbigpIHsKICAgICAgZm9yICh2YXIgaSA9IGxpbmVzVG9Nb3ZlLmxlbmd0aCAtIDI7IGkgPj0gMDsgaSAtPSAyKSB7CiAgICAgICAgdmFyIGZyb20gPSBsaW5lc1RvTW92ZVtpXSwgdG8gPSBsaW5lc1RvTW92ZVtpICsgMV07CiAgICAgICAgdmFyIGxpbmUgPSBjbS5nZXRMaW5lKGZyb20pOwogICAgICAgIGlmIChmcm9tID09IGNtLmxhc3RMaW5lKCkpCiAgICAgICAgICBjbS5yZXBsYWNlUmFuZ2UoIiIsIFBvcyhmcm9tIC0gMSksIFBvcyhmcm9tKSwgIitzd2FwTGluZSIpOwogICAgICAgIGVsc2UKICAgICAgICAgIGNtLnJlcGxhY2VSYW5nZSgiIiwgUG9zKGZyb20sIDApLCBQb3MoZnJvbSArIDEsIDApLCAiK3N3YXBMaW5lIik7CiAgICAgICAgY20ucmVwbGFjZVJhbmdlKGxpbmUgKyAiXG4iLCBQb3ModG8sIDApLCBudWxsLCAiK3N3YXBMaW5lIik7CiAgICAgIH0KICAgICAgY20uc2Nyb2xsSW50b1ZpZXcoKTsKICAgIH0pOwogIH07CgogIGNtZHNbbWFwW2N0cmwgKyAiLyJdID0gInRvZ2dsZUNvbW1lbnRJbmRlbnRlZCJdID0gZnVuY3Rpb24oY20pIHsKICAgIGNtLnRvZ2dsZUNvbW1lbnQoeyBpbmRlbnQ6IHRydWUgfSk7CiAgfQoKICBjbWRzW21hcFtjdHJsICsgIkoiXSA9ICJqb2luTGluZXMiXSA9IGZ1bmN0aW9uKGNtKSB7CiAgICB2YXIgcmFuZ2VzID0gY20ubGlzdFNlbGVjdGlvbnMoKSwgam9pbmVkID0gW107CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJhbmdlcy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgcmFuZ2UgPSByYW5nZXNbaV0sIGZyb20gPSByYW5nZS5mcm9tKCk7CiAgICAgIHZhciBzdGFydCA9IGZyb20ubGluZSwgZW5kID0gcmFuZ2UudG8oKS5saW5lOwogICAgICB3aGlsZSAoaSA8IHJhbmdlcy5sZW5ndGggLSAxICYmIHJhbmdlc1tpICsgMV0uZnJvbSgpLmxpbmUgPT0gZW5kKQogICAgICAgIGVuZCA9IHJhbmdlc1srK2ldLnRvKCkubGluZTsKICAgICAgam9pbmVkLnB1c2goe3N0YXJ0OiBzdGFydCwgZW5kOiBlbmQsIGFuY2hvcjogIXJhbmdlLmVtcHR5KCkgJiYgZnJvbX0pOwogICAgfQogICAgY20ub3BlcmF0aW9uKGZ1bmN0aW9uKCkgewogICAgICB2YXIgb2Zmc2V0ID0gMCwgcmFuZ2VzID0gW107CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgam9pbmVkLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIG9iaiA9IGpvaW5lZFtpXTsKICAgICAgICB2YXIgYW5jaG9yID0gb2JqLmFuY2hvciAmJiBQb3Mob2JqLmFuY2hvci5saW5lIC0gb2Zmc2V0LCBvYmouYW5jaG9yLmNoKSwgaGVhZDsKICAgICAgICBmb3IgKHZhciBsaW5lID0gb2JqLnN0YXJ0OyBsaW5lIDw9IG9iai5lbmQ7IGxpbmUrKykgewogICAgICAgICAgdmFyIGFjdHVhbCA9IGxpbmUgLSBvZmZzZXQ7CiAgICAgICAgICBpZiAobGluZSA9PSBvYmouZW5kKSBoZWFkID0gUG9zKGFjdHVhbCwgY20uZ2V0TGluZShhY3R1YWwpLmxlbmd0aCArIDEpOwogICAgICAgICAgaWYgKGFjdHVhbCA8IGNtLmxhc3RMaW5lKCkpIHsKICAgICAgICAgICAgY20ucmVwbGFjZVJhbmdlKCIgIiwgUG9zKGFjdHVhbCksIFBvcyhhY3R1YWwgKyAxLCAvXlxzKi8uZXhlYyhjbS5nZXRMaW5lKGFjdHVhbCArIDEpKVswXS5sZW5ndGgpKTsKICAgICAgICAgICAgKytvZmZzZXQ7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJhbmdlcy5wdXNoKHthbmNob3I6IGFuY2hvciB8fCBoZWFkLCBoZWFkOiBoZWFkfSk7CiAgICAgIH0KICAgICAgY20uc2V0U2VsZWN0aW9ucyhyYW5nZXMsIDApOwogICAgfSk7CiAgfTsKCiAgY21kc1ttYXBbIlNoaWZ0LSIgKyBjdHJsICsgIkQiXSA9ICJkdXBsaWNhdGVMaW5lIl0gPSBmdW5jdGlvbihjbSkgewogICAgY20ub3BlcmF0aW9uKGZ1bmN0aW9uKCkgewogICAgICB2YXIgcmFuZ2VDb3VudCA9IGNtLmxpc3RTZWxlY3Rpb25zKCkubGVuZ3RoOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJhbmdlQ291bnQ7IGkrKykgewogICAgICAgIHZhciByYW5nZSA9IGNtLmxpc3RTZWxlY3Rpb25zKClbaV07CiAgICAgICAgaWYgKHJhbmdlLmVtcHR5KCkpCiAgICAgICAgICBjbS5yZXBsYWNlUmFuZ2UoY20uZ2V0TGluZShyYW5nZS5oZWFkLmxpbmUpICsgIlxuIiwgUG9zKHJhbmdlLmhlYWQubGluZSwgMCkpOwogICAgICAgIGVsc2UKICAgICAgICAgIGNtLnJlcGxhY2VSYW5nZShjbS5nZXRSYW5nZShyYW5nZS5mcm9tKCksIHJhbmdlLnRvKCkpLCByYW5nZS5mcm9tKCkpOwogICAgICB9CiAgICAgIGNtLnNjcm9sbEludG9WaWV3KCk7CiAgICB9KTsKICB9OwoKICBpZiAoIW1hYykgbWFwW2N0cmwgKyAiVCJdID0gInRyYW5zcG9zZUNoYXJzIjsKCiAgZnVuY3Rpb24gc29ydExpbmVzKGNtLCBjYXNlU2Vuc2l0aXZlKSB7CiAgICBpZiAoY20uaXNSZWFkT25seSgpKSByZXR1cm4gQ29kZU1pcnJvci5QYXNzCiAgICB2YXIgcmFuZ2VzID0gY20ubGlzdFNlbGVjdGlvbnMoKSwgdG9Tb3J0ID0gW10sIHNlbGVjdGVkOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIHJhbmdlID0gcmFuZ2VzW2ldOwogICAgICBpZiAocmFuZ2UuZW1wdHkoKSkgY29udGludWU7CiAgICAgIHZhciBmcm9tID0gcmFuZ2UuZnJvbSgpLmxpbmUsIHRvID0gcmFuZ2UudG8oKS5saW5lOwogICAgICB3aGlsZSAoaSA8IHJhbmdlcy5sZW5ndGggLSAxICYmIHJhbmdlc1tpICsgMV0uZnJvbSgpLmxpbmUgPT0gdG8pCiAgICAgICAgdG8gPSByYW5nZVsrK2ldLnRvKCkubGluZTsKICAgICAgdG9Tb3J0LnB1c2goZnJvbSwgdG8pOwogICAgfQogICAgaWYgKHRvU29ydC5sZW5ndGgpIHNlbGVjdGVkID0gdHJ1ZTsKICAgIGVsc2UgdG9Tb3J0LnB1c2goY20uZmlyc3RMaW5lKCksIGNtLmxhc3RMaW5lKCkpOwoKICAgIGNtLm9wZXJhdGlvbihmdW5jdGlvbigpIHsKICAgICAgdmFyIHJhbmdlcyA9IFtdOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRvU29ydC5sZW5ndGg7IGkgKz0gMikgewogICAgICAgIHZhciBmcm9tID0gdG9Tb3J0W2ldLCB0byA9IHRvU29ydFtpICsgMV07CiAgICAgICAgdmFyIHN0YXJ0ID0gUG9zKGZyb20sIDApLCBlbmQgPSBQb3ModG8pOwogICAgICAgIHZhciBsaW5lcyA9IGNtLmdldFJhbmdlKHN0YXJ0LCBlbmQsIGZhbHNlKTsKICAgICAgICBpZiAoY2FzZVNlbnNpdGl2ZSkKICAgICAgICAgIGxpbmVzLnNvcnQoKTsKICAgICAgICBlbHNlCiAgICAgICAgICBsaW5lcy5zb3J0KGZ1bmN0aW9uKGEsIGIpIHsKICAgICAgICAgICAgdmFyIGF1ID0gYS50b1VwcGVyQ2FzZSgpLCBidSA9IGIudG9VcHBlckNhc2UoKTsKICAgICAgICAgICAgaWYgKGF1ICE9IGJ1KSB7IGEgPSBhdTsgYiA9IGJ1OyB9CiAgICAgICAgICAgIHJldHVybiBhIDwgYiA/IC0xIDogYSA9PSBiID8gMCA6IDE7CiAgICAgICAgICB9KTsKICAgICAgICBjbS5yZXBsYWNlUmFuZ2UobGluZXMsIHN0YXJ0LCBlbmQpOwogICAgICAgIGlmIChzZWxlY3RlZCkgcmFuZ2VzLnB1c2goe2FuY2hvcjogc3RhcnQsIGhlYWQ6IGVuZH0pOwogICAgICB9CiAgICAgIGlmIChzZWxlY3RlZCkgY20uc2V0U2VsZWN0aW9ucyhyYW5nZXMsIDApOwogICAgfSk7CiAgfQoKICBjbWRzW21hcFsiRjkiXSA9ICJzb3J0TGluZXMiXSA9IGZ1bmN0aW9uKGNtKSB7IHNvcnRMaW5lcyhjbSwgdHJ1ZSk7IH07CiAgY21kc1ttYXBbY3RybCArICJGOSJdID0gInNvcnRMaW5lc0luc2Vuc2l0aXZlIl0gPSBmdW5jdGlvbihjbSkgeyBzb3J0TGluZXMoY20sIGZhbHNlKTsgfTsKCiAgY21kc1ttYXBbIkYyIl0gPSAibmV4dEJvb2ttYXJrIl0gPSBmdW5jdGlvbihjbSkgewogICAgdmFyIG1hcmtzID0gY20uc3RhdGUuc3VibGltZUJvb2ttYXJrczsKICAgIGlmIChtYXJrcykgd2hpbGUgKG1hcmtzLmxlbmd0aCkgewogICAgICB2YXIgY3VycmVudCA9IG1hcmtzLnNoaWZ0KCk7CiAgICAgIHZhciBmb3VuZCA9IGN1cnJlbnQuZmluZCgpOwogICAgICBpZiAoZm91bmQpIHsKICAgICAgICBtYXJrcy5wdXNoKGN1cnJlbnQpOwogICAgICAgIHJldHVybiBjbS5zZXRTZWxlY3Rpb24oZm91bmQuZnJvbSwgZm91bmQudG8pOwogICAgICB9CiAgICB9CiAgfTsKCiAgY21kc1ttYXBbIlNoaWZ0LUYyIl0gPSAicHJldkJvb2ttYXJrIl0gPSBmdW5jdGlvbihjbSkgewogICAgdmFyIG1hcmtzID0gY20uc3RhdGUuc3VibGltZUJvb2ttYXJrczsKICAgIGlmIChtYXJrcykgd2hpbGUgKG1hcmtzLmxlbmd0aCkgewogICAgICBtYXJrcy51bnNoaWZ0KG1hcmtzLnBvcCgpKTsKICAgICAgdmFyIGZvdW5kID0gbWFya3NbbWFya3MubGVuZ3RoIC0gMV0uZmluZCgpOwogICAgICBpZiAoIWZvdW5kKQogICAgICAgIG1hcmtzLnBvcCgpOwogICAgICBlbHNlCiAgICAgICAgcmV0dXJuIGNtLnNldFNlbGVjdGlvbihmb3VuZC5mcm9tLCBmb3VuZC50byk7CiAgICB9CiAgfTsKCiAgY21kc1ttYXBbY3RybCArICJGMiJdID0gInRvZ2dsZUJvb2ttYXJrIl0gPSBmdW5jdGlvbihjbSkgewogICAgdmFyIHJhbmdlcyA9IGNtLmxpc3RTZWxlY3Rpb25zKCk7CiAgICB2YXIgbWFya3MgPSBjbS5zdGF0ZS5zdWJsaW1lQm9va21hcmtzIHx8IChjbS5zdGF0ZS5zdWJsaW1lQm9va21hcmtzID0gW10pOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGZyb20gPSByYW5nZXNbaV0uZnJvbSgpLCB0byA9IHJhbmdlc1tpXS50bygpOwogICAgICB2YXIgZm91bmQgPSBjbS5maW5kTWFya3MoZnJvbSwgdG8pOwogICAgICBmb3IgKHZhciBqID0gMDsgaiA8IGZvdW5kLmxlbmd0aDsgaisrKSB7CiAgICAgICAgaWYgKGZvdW5kW2pdLnN1YmxpbWVCb29rbWFyaykgewogICAgICAgICAgZm91bmRbal0uY2xlYXIoKTsKICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgbWFya3MubGVuZ3RoOyBrKyspCiAgICAgICAgICAgIGlmIChtYXJrc1trXSA9PSBmb3VuZFtqXSkKICAgICAgICAgICAgICBtYXJrcy5zcGxpY2Uoay0tLCAxKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoaiA9PSBmb3VuZC5sZW5ndGgpCiAgICAgICAgbWFya3MucHVzaChjbS5tYXJrVGV4dChmcm9tLCB0bywge3N1YmxpbWVCb29rbWFyazogdHJ1ZSwgY2xlYXJXaGVuRW1wdHk6IGZhbHNlfSkpOwogICAgfQogIH07CgogIGNtZHNbbWFwWyJTaGlmdC0iICsgY3RybCArICJGMiJdID0gImNsZWFyQm9va21hcmtzIl0gPSBmdW5jdGlvbihjbSkgewogICAgdmFyIG1hcmtzID0gY20uc3RhdGUuc3VibGltZUJvb2ttYXJrczsKICAgIGlmIChtYXJrcykgZm9yICh2YXIgaSA9IDA7IGkgPCBtYXJrcy5sZW5ndGg7IGkrKykgbWFya3NbaV0uY2xlYXIoKTsKICAgIG1hcmtzLmxlbmd0aCA9IDA7CiAgfTsKCiAgY21kc1ttYXBbIkFsdC1GMiJdID0gInNlbGVjdEJvb2ttYXJrcyJdID0gZnVuY3Rpb24oY20pIHsKICAgIHZhciBtYXJrcyA9IGNtLnN0YXRlLnN1YmxpbWVCb29rbWFya3MsIHJhbmdlcyA9IFtdOwogICAgaWYgKG1hcmtzKSBmb3IgKHZhciBpID0gMDsgaSA8IG1hcmtzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBmb3VuZCA9IG1hcmtzW2ldLmZpbmQoKTsKICAgICAgaWYgKCFmb3VuZCkKICAgICAgICBtYXJrcy5zcGxpY2UoaS0tLCAwKTsKICAgICAgZWxzZQogICAgICAgIHJhbmdlcy5wdXNoKHthbmNob3I6IGZvdW5kLmZyb20sIGhlYWQ6IGZvdW5kLnRvfSk7CiAgICB9CiAgICBpZiAocmFuZ2VzLmxlbmd0aCkKICAgICAgY20uc2V0U2VsZWN0aW9ucyhyYW5nZXMsIDApOwogIH07CgogIG1hcFsiQWx0LVEiXSA9ICJ3cmFwTGluZXMiOwoKICB2YXIgY0sgPSBjdHJsICsgIksgIjsKCiAgZnVuY3Rpb24gbW9kaWZ5V29yZE9yU2VsZWN0aW9uKGNtLCBtb2QpIHsKICAgIGNtLm9wZXJhdGlvbihmdW5jdGlvbigpIHsKICAgICAgdmFyIHJhbmdlcyA9IGNtLmxpc3RTZWxlY3Rpb25zKCksIGluZGljZXMgPSBbXSwgcmVwbGFjZW1lbnRzID0gW107CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIHJhbmdlID0gcmFuZ2VzW2ldOwogICAgICAgIGlmIChyYW5nZS5lbXB0eSgpKSB7IGluZGljZXMucHVzaChpKTsgcmVwbGFjZW1lbnRzLnB1c2goIiIpOyB9CiAgICAgICAgZWxzZSByZXBsYWNlbWVudHMucHVzaChtb2QoY20uZ2V0UmFuZ2UocmFuZ2UuZnJvbSgpLCByYW5nZS50bygpKSkpOwogICAgICB9CiAgICAgIGNtLnJlcGxhY2VTZWxlY3Rpb25zKHJlcGxhY2VtZW50cywgImFyb3VuZCIsICJjYXNlIik7CiAgICAgIGZvciAodmFyIGkgPSBpbmRpY2VzLmxlbmd0aCAtIDEsIGF0OyBpID49IDA7IGktLSkgewogICAgICAgIHZhciByYW5nZSA9IHJhbmdlc1tpbmRpY2VzW2ldXTsKICAgICAgICBpZiAoYXQgJiYgQ29kZU1pcnJvci5jbXBQb3MocmFuZ2UuaGVhZCwgYXQpID4gMCkgY29udGludWU7CiAgICAgICAgdmFyIHdvcmQgPSB3b3JkQXQoY20sIHJhbmdlLmhlYWQpOwogICAgICAgIGF0ID0gd29yZC5mcm9tOwogICAgICAgIGNtLnJlcGxhY2VSYW5nZShtb2Qod29yZC53b3JkKSwgd29yZC5mcm9tLCB3b3JkLnRvKTsKICAgICAgfQogICAgfSk7CiAgfQoKICBtYXBbY0sgKyBjdHJsICsgIkJhY2tzcGFjZSJdID0gImRlbExpbmVMZWZ0IjsKCiAgY21kc1ttYXBbIkJhY2tzcGFjZSJdID0gInNtYXJ0QmFja3NwYWNlIl0gPSBmdW5jdGlvbihjbSkgewogICAgaWYgKGNtLnNvbWV0aGluZ1NlbGVjdGVkKCkpIHJldHVybiBDb2RlTWlycm9yLlBhc3M7CgogICAgY20ub3BlcmF0aW9uKGZ1bmN0aW9uKCkgewogICAgICB2YXIgY3Vyc29ycyA9IGNtLmxpc3RTZWxlY3Rpb25zKCk7CiAgICAgIHZhciBpbmRlbnRVbml0ID0gY20uZ2V0T3B0aW9uKCJpbmRlbnRVbml0Iik7CgogICAgICBmb3IgKHZhciBpID0gY3Vyc29ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewogICAgICAgIHZhciBjdXJzb3IgPSBjdXJzb3JzW2ldLmhlYWQ7CiAgICAgICAgdmFyIHRvU3RhcnRPZkxpbmUgPSBjbS5nZXRSYW5nZSh7bGluZTogY3Vyc29yLmxpbmUsIGNoOiAwfSwgY3Vyc29yKTsKICAgICAgICB2YXIgY29sdW1uID0gQ29kZU1pcnJvci5jb3VudENvbHVtbih0b1N0YXJ0T2ZMaW5lLCBudWxsLCBjbS5nZXRPcHRpb24oInRhYlNpemUiKSk7CgogICAgICAgIC8vIERlbGV0ZSBieSBvbmUgY2hhcmFjdGVyIGJ5IGRlZmF1bHQKICAgICAgICB2YXIgZGVsZXRlUG9zID0gY20uZmluZFBvc0goY3Vyc29yLCAtMSwgImNoYXIiLCBmYWxzZSk7CgogICAgICAgIGlmICh0b1N0YXJ0T2ZMaW5lICYmICEvXFMvLnRlc3QodG9TdGFydE9mTGluZSkgJiYgY29sdW1uICUgaW5kZW50VW5pdCA9PSAwKSB7CiAgICAgICAgICB2YXIgcHJldkluZGVudCA9IG5ldyBQb3MoY3Vyc29yLmxpbmUsCiAgICAgICAgICAgIENvZGVNaXJyb3IuZmluZENvbHVtbih0b1N0YXJ0T2ZMaW5lLCBjb2x1bW4gLSBpbmRlbnRVbml0LCBpbmRlbnRVbml0KSk7CgogICAgICAgICAgLy8gU21hcnQgZGVsZXRlIG9ubHkgaWYgd2UgZm91bmQgYSB2YWxpZCBwcmV2SW5kZW50IGxvY2F0aW9uCiAgICAgICAgICBpZiAocHJldkluZGVudC5jaCAhPSBjdXJzb3IuY2gpIGRlbGV0ZVBvcyA9IHByZXZJbmRlbnQ7CiAgICAgICAgfQoKICAgICAgICBjbS5yZXBsYWNlUmFuZ2UoIiIsIGRlbGV0ZVBvcywgY3Vyc29yLCAiK2RlbGV0ZSIpOwogICAgICB9CiAgICB9KTsKICB9OwoKICBjbWRzW21hcFtjSyArIGN0cmwgKyAiSyJdID0gImRlbExpbmVSaWdodCJdID0gZnVuY3Rpb24oY20pIHsKICAgIGNtLm9wZXJhdGlvbihmdW5jdGlvbigpIHsKICAgICAgdmFyIHJhbmdlcyA9IGNtLmxpc3RTZWxlY3Rpb25zKCk7CiAgICAgIGZvciAodmFyIGkgPSByYW5nZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pCiAgICAgICAgY20ucmVwbGFjZVJhbmdlKCIiLCByYW5nZXNbaV0uYW5jaG9yLCBQb3MocmFuZ2VzW2ldLnRvKCkubGluZSksICIrZGVsZXRlIik7CiAgICAgIGNtLnNjcm9sbEludG9WaWV3KCk7CiAgICB9KTsKICB9OwoKICBjbWRzW21hcFtjSyArIGN0cmwgKyAiVSJdID0gInVwY2FzZUF0Q3Vyc29yIl0gPSBmdW5jdGlvbihjbSkgewogICAgbW9kaWZ5V29yZE9yU2VsZWN0aW9uKGNtLCBmdW5jdGlvbihzdHIpIHsgcmV0dXJuIHN0ci50b1VwcGVyQ2FzZSgpOyB9KTsKICB9OwogIGNtZHNbbWFwW2NLICsgY3RybCArICJMIl0gPSAiZG93bmNhc2VBdEN1cnNvciJdID0gZnVuY3Rpb24oY20pIHsKICAgIG1vZGlmeVdvcmRPclNlbGVjdGlvbihjbSwgZnVuY3Rpb24oc3RyKSB7IHJldHVybiBzdHIudG9Mb3dlckNhc2UoKTsgfSk7CiAgfTsKCiAgY21kc1ttYXBbY0sgKyBjdHJsICsgIlNwYWNlIl0gPSAic2V0U3VibGltZU1hcmsiXSA9IGZ1bmN0aW9uKGNtKSB7CiAgICBpZiAoY20uc3RhdGUuc3VibGltZU1hcmspIGNtLnN0YXRlLnN1YmxpbWVNYXJrLmNsZWFyKCk7CiAgICBjbS5zdGF0ZS5zdWJsaW1lTWFyayA9IGNtLnNldEJvb2ttYXJrKGNtLmdldEN1cnNvcigpKTsKICB9OwogIGNtZHNbbWFwW2NLICsgY3RybCArICJBIl0gPSAic2VsZWN0VG9TdWJsaW1lTWFyayJdID0gZnVuY3Rpb24oY20pIHsKICAgIHZhciBmb3VuZCA9IGNtLnN0YXRlLnN1YmxpbWVNYXJrICYmIGNtLnN0YXRlLnN1YmxpbWVNYXJrLmZpbmQoKTsKICAgIGlmIChmb3VuZCkgY20uc2V0U2VsZWN0aW9uKGNtLmdldEN1cnNvcigpLCBmb3VuZCk7CiAgfTsKICBjbWRzW21hcFtjSyArIGN0cmwgKyAiVyJdID0gImRlbGV0ZVRvU3VibGltZU1hcmsiXSA9IGZ1bmN0aW9uKGNtKSB7CiAgICB2YXIgZm91bmQgPSBjbS5zdGF0ZS5zdWJsaW1lTWFyayAmJiBjbS5zdGF0ZS5zdWJsaW1lTWFyay5maW5kKCk7CiAgICBpZiAoZm91bmQpIHsKICAgICAgdmFyIGZyb20gPSBjbS5nZXRDdXJzb3IoKSwgdG8gPSBmb3VuZDsKICAgICAgaWYgKENvZGVNaXJyb3IuY21wUG9zKGZyb20sIHRvKSA+IDApIHsgdmFyIHRtcCA9IHRvOyB0byA9IGZyb207IGZyb20gPSB0bXA7IH0KICAgICAgY20uc3RhdGUuc3VibGltZUtpbGxlZCA9IGNtLmdldFJhbmdlKGZyb20sIHRvKTsKICAgICAgY20ucmVwbGFjZVJhbmdlKCIiLCBmcm9tLCB0byk7CiAgICB9CiAgfTsKICBjbWRzW21hcFtjSyArIGN0cmwgKyAiWCJdID0gInN3YXBXaXRoU3VibGltZU1hcmsiXSA9IGZ1bmN0aW9uKGNtKSB7CiAgICB2YXIgZm91bmQgPSBjbS5zdGF0ZS5zdWJsaW1lTWFyayAmJiBjbS5zdGF0ZS5zdWJsaW1lTWFyay5maW5kKCk7CiAgICBpZiAoZm91bmQpIHsKICAgICAgY20uc3RhdGUuc3VibGltZU1hcmsuY2xlYXIoKTsKICAgICAgY20uc3RhdGUuc3VibGltZU1hcmsgPSBjbS5zZXRCb29rbWFyayhjbS5nZXRDdXJzb3IoKSk7CiAgICAgIGNtLnNldEN1cnNvcihmb3VuZCk7CiAgICB9CiAgfTsKICBjbWRzW21hcFtjSyArIGN0cmwgKyAiWSJdID0gInN1YmxpbWVZYW5rIl0gPSBmdW5jdGlvbihjbSkgewogICAgaWYgKGNtLnN0YXRlLnN1YmxpbWVLaWxsZWQgIT0gbnVsbCkKICAgICAgY20ucmVwbGFjZVNlbGVjdGlvbihjbS5zdGF0ZS5zdWJsaW1lS2lsbGVkLCBudWxsLCAicGFzdGUiKTsKICB9OwoKICBtYXBbY0sgKyBjdHJsICsgIkciXSA9ICJjbGVhckJvb2ttYXJrcyI7CiAgY21kc1ttYXBbY0sgKyBjdHJsICsgIkMiXSA9ICJzaG93SW5DZW50ZXIiXSA9IGZ1bmN0aW9uKGNtKSB7CiAgICB2YXIgcG9zID0gY20uY3Vyc29yQ29vcmRzKG51bGwsICJsb2NhbCIpOwogICAgY20uc2Nyb2xsVG8obnVsbCwgKHBvcy50b3AgKyBwb3MuYm90dG9tKSAvIDIgLSBjbS5nZXRTY3JvbGxJbmZvKCkuY2xpZW50SGVpZ2h0IC8gMik7CiAgfTsKCiAgdmFyIHNlbGVjdExpbmVzQ29tYm8gPSBtYWMgPyAiQ3RybC1TaGlmdC0iIDogIkN0cmwtQWx0LSI7CiAgY21kc1ttYXBbc2VsZWN0TGluZXNDb21ibyArICJVcCJdID0gInNlbGVjdExpbmVzVXB3YXJkIl0gPSBmdW5jdGlvbihjbSkgewogICAgY20ub3BlcmF0aW9uKGZ1bmN0aW9uKCkgewogICAgICB2YXIgcmFuZ2VzID0gY20ubGlzdFNlbGVjdGlvbnMoKTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICB2YXIgcmFuZ2UgPSByYW5nZXNbaV07CiAgICAgICAgaWYgKHJhbmdlLmhlYWQubGluZSA+IGNtLmZpcnN0TGluZSgpKQogICAgICAgICAgY20uYWRkU2VsZWN0aW9uKFBvcyhyYW5nZS5oZWFkLmxpbmUgLSAxLCByYW5nZS5oZWFkLmNoKSk7CiAgICAgIH0KICAgIH0pOwogIH07CiAgY21kc1ttYXBbc2VsZWN0TGluZXNDb21ibyArICJEb3duIl0gPSAic2VsZWN0TGluZXNEb3dud2FyZCJdID0gZnVuY3Rpb24oY20pIHsKICAgIGNtLm9wZXJhdGlvbihmdW5jdGlvbigpIHsKICAgICAgdmFyIHJhbmdlcyA9IGNtLmxpc3RTZWxlY3Rpb25zKCk7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIHJhbmdlID0gcmFuZ2VzW2ldOwogICAgICAgIGlmIChyYW5nZS5oZWFkLmxpbmUgPCBjbS5sYXN0TGluZSgpKQogICAgICAgICAgY20uYWRkU2VsZWN0aW9uKFBvcyhyYW5nZS5oZWFkLmxpbmUgKyAxLCByYW5nZS5oZWFkLmNoKSk7CiAgICAgIH0KICAgIH0pOwogIH07CgogIGZ1bmN0aW9uIGdldFRhcmdldChjbSkgewogICAgdmFyIGZyb20gPSBjbS5nZXRDdXJzb3IoImZyb20iKSwgdG8gPSBjbS5nZXRDdXJzb3IoInRvIik7CiAgICBpZiAoQ29kZU1pcnJvci5jbXBQb3MoZnJvbSwgdG8pID09IDApIHsKICAgICAgdmFyIHdvcmQgPSB3b3JkQXQoY20sIGZyb20pOwogICAgICBpZiAoIXdvcmQud29yZCkgcmV0dXJuOwogICAgICBmcm9tID0gd29yZC5mcm9tOwogICAgICB0byA9IHdvcmQudG87CiAgICB9CiAgICByZXR1cm4ge2Zyb206IGZyb20sIHRvOiB0bywgcXVlcnk6IGNtLmdldFJhbmdlKGZyb20sIHRvKSwgd29yZDogd29yZH07CiAgfQoKICBmdW5jdGlvbiBmaW5kQW5kR29UbyhjbSwgZm9yd2FyZCkgewogICAgdmFyIHRhcmdldCA9IGdldFRhcmdldChjbSk7CiAgICBpZiAoIXRhcmdldCkgcmV0dXJuOwogICAgdmFyIHF1ZXJ5ID0gdGFyZ2V0LnF1ZXJ5OwogICAgdmFyIGN1ciA9IGNtLmdldFNlYXJjaEN1cnNvcihxdWVyeSwgZm9yd2FyZCA/IHRhcmdldC50byA6IHRhcmdldC5mcm9tKTsKCiAgICBpZiAoZm9yd2FyZCA/IGN1ci5maW5kTmV4dCgpIDogY3VyLmZpbmRQcmV2aW91cygpKSB7CiAgICAgIGNtLnNldFNlbGVjdGlvbihjdXIuZnJvbSgpLCBjdXIudG8oKSk7CiAgICB9IGVsc2UgewogICAgICBjdXIgPSBjbS5nZXRTZWFyY2hDdXJzb3IocXVlcnksIGZvcndhcmQgPyBQb3MoY20uZmlyc3RMaW5lKCksIDApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGNtLmNsaXBQb3MoUG9zKGNtLmxhc3RMaW5lKCkpKSk7CiAgICAgIGlmIChmb3J3YXJkID8gY3VyLmZpbmROZXh0KCkgOiBjdXIuZmluZFByZXZpb3VzKCkpCiAgICAgICAgY20uc2V0U2VsZWN0aW9uKGN1ci5mcm9tKCksIGN1ci50bygpKTsKICAgICAgZWxzZSBpZiAodGFyZ2V0LndvcmQpCiAgICAgICAgY20uc2V0U2VsZWN0aW9uKHRhcmdldC5mcm9tLCB0YXJnZXQudG8pOwogICAgfQogIH07CiAgY21kc1ttYXBbY3RybCArICJGMyJdID0gImZpbmRVbmRlciJdID0gZnVuY3Rpb24oY20pIHsgZmluZEFuZEdvVG8oY20sIHRydWUpOyB9OwogIGNtZHNbbWFwWyJTaGlmdC0iICsgY3RybCArICJGMyJdID0gImZpbmRVbmRlclByZXZpb3VzIl0gPSBmdW5jdGlvbihjbSkgeyBmaW5kQW5kR29UbyhjbSxmYWxzZSk7IH07CiAgY21kc1ttYXBbIkFsdC1GMyJdID0gImZpbmRBbGxVbmRlciJdID0gZnVuY3Rpb24oY20pIHsKICAgIHZhciB0YXJnZXQgPSBnZXRUYXJnZXQoY20pOwogICAgaWYgKCF0YXJnZXQpIHJldHVybjsKICAgIHZhciBjdXIgPSBjbS5nZXRTZWFyY2hDdXJzb3IodGFyZ2V0LnF1ZXJ5KTsKICAgIHZhciBtYXRjaGVzID0gW107CiAgICB2YXIgcHJpbWFyeUluZGV4ID0gLTE7CiAgICB3aGlsZSAoY3VyLmZpbmROZXh0KCkpIHsKICAgICAgbWF0Y2hlcy5wdXNoKHthbmNob3I6IGN1ci5mcm9tKCksIGhlYWQ6IGN1ci50bygpfSk7CiAgICAgIGlmIChjdXIuZnJvbSgpLmxpbmUgPD0gdGFyZ2V0LmZyb20ubGluZSAmJiBjdXIuZnJvbSgpLmNoIDw9IHRhcmdldC5mcm9tLmNoKQogICAgICAgIHByaW1hcnlJbmRleCsrOwogICAgfQogICAgY20uc2V0U2VsZWN0aW9ucyhtYXRjaGVzLCBwcmltYXJ5SW5kZXgpOwogIH07CgogIG1hcFsiU2hpZnQtIiArIGN0cmwgKyAiWyJdID0gImZvbGQiOwogIG1hcFsiU2hpZnQtIiArIGN0cmwgKyAiXSJdID0gInVuZm9sZCI7CiAgbWFwW2NLICsgY3RybCArICIwIl0gPSBtYXBbY0sgKyBjdHJsICsgIkoiXSA9ICJ1bmZvbGRBbGwiOwoKICBtYXBbY3RybCArICJJIl0gPSAiZmluZEluY3JlbWVudGFsIjsKICBtYXBbIlNoaWZ0LSIgKyBjdHJsICsgIkkiXSA9ICJmaW5kSW5jcmVtZW50YWxSZXZlcnNlIjsKICBtYXBbY3RybCArICJIIl0gPSAicmVwbGFjZSI7CiAgbWFwWyJGMyJdID0gImZpbmROZXh0IjsKICBtYXBbIlNoaWZ0LUYzIl0gPSAiZmluZFByZXYiOwoKICBDb2RlTWlycm9yLm5vcm1hbGl6ZUtleU1hcChtYXApOwp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/keymap/vim.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovKioKICogU3VwcG9ydGVkIGtleWJpbmRpbmdzOgogKiAgIFRvbyBtYW55IHRvIGxpc3QuIFJlZmVyIHRvIGRlZmF1bHRLZXlNYXAgYmVsb3cuCiAqCiAqIFN1cHBvcnRlZCBFeCBjb21tYW5kczoKICogICBSZWZlciB0byBkZWZhdWx0RXhDb21tYW5kTWFwIGJlbG93LgogKgogKiBSZWdpc3RlcnM6IHVubmFtZWQsIC0sIGEteiwgQS1aLCAwLTkKICogICAoRG9lcyBub3QgcmVzcGVjdCB0aGUgc3BlY2lhbCBjYXNlIGZvciBudW1iZXIgcmVnaXN0ZXJzIHdoZW4gZGVsZXRlCiAqICAgIG9wZXJhdG9yIGlzIG1hZGUgd2l0aCB0aGVzZSBjb21tYW5kczogJSwgKCwgKSwgICwgLywgPywgbiwgTiwgeywgfSApCiAqICAgVE9ETzogSW1wbGVtZW50IHRoZSByZW1haW5pbmcgcmVnaXN0ZXJzLgogKgogKiBNYXJrczogYS16LCBBLVosIGFuZCAwLTkKICogICBUT0RPOiBJbXBsZW1lbnQgdGhlIHJlbWFpbmluZyBzcGVjaWFsIG1hcmtzLiBUaGV5IGhhdmUgbW9yZSBjb21wbGV4CiAqICAgICAgIGJlaGF2aW9yLgogKgogKiBFdmVudHM6CiAqICAndmltLW1vZGUtY2hhbmdlJyAtIHJhaXNlZCBvbiB0aGUgZWRpdG9yIGFueXRpbWUgdGhlIGN1cnJlbnQgbW9kZSBjaGFuZ2VzLAogKiAgICAgICAgICAgICAgICAgICAgICBFdmVudCBvYmplY3Q6IHttb2RlOiAidmlzdWFsIiwgc3ViTW9kZTogImxpbmV3aXNlIn0KICoKICogQ29kZSBzdHJ1Y3R1cmU6CiAqICAxLiBEZWZhdWx0IGtleW1hcAogKiAgMi4gVmFyaWFibGUgZGVjbGFyYXRpb25zIGFuZCBzaG9ydCBiYXNpYyBoZWxwZXJzCiAqICAzLiBJbnN0YW5jZSAoRXh0ZXJuYWwgQVBJKSBpbXBsZW1lbnRhdGlvbgogKiAgNC4gSW50ZXJuYWwgc3RhdGUgdHJhY2tpbmcgb2JqZWN0cyAoaW5wdXQgc3RhdGUsIGNvdW50ZXIpIGltcGxlbWVudGF0aW9uCiAqICAgICBhbmQgaW5zdGFudGlhdGlvbgogKiAgNS4gS2V5IGhhbmRsZXIgKHRoZSBtYWluIGNvbW1hbmQgZGlzcGF0Y2hlcikgaW1wbGVtZW50YXRpb24KICogIDYuIE1vdGlvbiwgb3BlcmF0b3IsIGFuZCBhY3Rpb24gaW1wbGVtZW50YXRpb25zCiAqICA3LiBIZWxwZXIgZnVuY3Rpb25zIGZvciB0aGUga2V5IGhhbmRsZXIsIG1vdGlvbnMsIG9wZXJhdG9ycywgYW5kIGFjdGlvbnMKICogIDguIFNldCB1cCBWaW0gdG8gd29yayBhcyBhIGtleW1hcCBmb3IgQ29kZU1pcnJvci4KICogIDkuIEV4IGNvbW1hbmQgaW1wbGVtZW50YXRpb25zLgogKi8KCihmdW5jdGlvbihtb2QpIHsKICBpZiAodHlwZW9mIGV4cG9ydHMgPT0gIm9iamVjdCIgJiYgdHlwZW9mIG1vZHVsZSA9PSAib2JqZWN0IikgLy8gQ29tbW9uSlMKICAgIG1vZChyZXF1aXJlKCIuLi9saWIvY29kZW1pcnJvciIpLCByZXF1aXJlKCIuLi9hZGRvbi9zZWFyY2gvc2VhcmNoY3Vyc29yIiksIHJlcXVpcmUoIi4uL2FkZG9uL2RpYWxvZy9kaWFsb2ciKSwgcmVxdWlyZSgiLi4vYWRkb24vZWRpdC9tYXRjaGJyYWNrZXRzLmpzIikpOwogIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kKSAvLyBBTUQKICAgIGRlZmluZShbIi4uL2xpYi9jb2RlbWlycm9yIiwgIi4uL2FkZG9uL3NlYXJjaC9zZWFyY2hjdXJzb3IiLCAiLi4vYWRkb24vZGlhbG9nL2RpYWxvZyIsICIuLi9hZGRvbi9lZGl0L21hdGNoYnJhY2tldHMiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAndXNlIHN0cmljdCc7CgogIHZhciBkZWZhdWx0S2V5bWFwID0gWwogICAgLy8gS2V5IHRvIGtleSBtYXBwaW5nLiBUaGlzIGdvZXMgZmlyc3QgdG8gbWFrZSBpdCBwb3NzaWJsZSB0byBvdmVycmlkZQogICAgLy8gZXhpc3RpbmcgbWFwcGluZ3MuCiAgICB7IGtleXM6ICc8TGVmdD4nLCB0eXBlOiAna2V5VG9LZXknLCB0b0tleXM6ICdoJyB9LAogICAgeyBrZXlzOiAnPFJpZ2h0PicsIHR5cGU6ICdrZXlUb0tleScsIHRvS2V5czogJ2wnIH0sCiAgICB7IGtleXM6ICc8VXA+JywgdHlwZTogJ2tleVRvS2V5JywgdG9LZXlzOiAnaycgfSwKICAgIHsga2V5czogJzxEb3duPicsIHR5cGU6ICdrZXlUb0tleScsIHRvS2V5czogJ2onIH0sCiAgICB7IGtleXM6ICc8U3BhY2U+JywgdHlwZTogJ2tleVRvS2V5JywgdG9LZXlzOiAnbCcgfSwKICAgIHsga2V5czogJzxCUz4nLCB0eXBlOiAna2V5VG9LZXknLCB0b0tleXM6ICdoJywgY29udGV4dDogJ25vcm1hbCd9LAogICAgeyBrZXlzOiAnPEMtU3BhY2U+JywgdHlwZTogJ2tleVRvS2V5JywgdG9LZXlzOiAnVycgfSwKICAgIHsga2V5czogJzxDLUJTPicsIHR5cGU6ICdrZXlUb0tleScsIHRvS2V5czogJ0InLCBjb250ZXh0OiAnbm9ybWFsJyB9LAogICAgeyBrZXlzOiAnPFMtU3BhY2U+JywgdHlwZTogJ2tleVRvS2V5JywgdG9LZXlzOiAndycgfSwKICAgIHsga2V5czogJzxTLUJTPicsIHR5cGU6ICdrZXlUb0tleScsIHRvS2V5czogJ2InLCBjb250ZXh0OiAnbm9ybWFsJyB9LAogICAgeyBrZXlzOiAnPEMtbj4nLCB0eXBlOiAna2V5VG9LZXknLCB0b0tleXM6ICdqJyB9LAogICAgeyBrZXlzOiAnPEMtcD4nLCB0eXBlOiAna2V5VG9LZXknLCB0b0tleXM6ICdrJyB9LAogICAgeyBrZXlzOiAnPEMtWz4nLCB0eXBlOiAna2V5VG9LZXknLCB0b0tleXM6ICc8RXNjPicgfSwKICAgIHsga2V5czogJzxDLWM+JywgdHlwZTogJ2tleVRvS2V5JywgdG9LZXlzOiAnPEVzYz4nIH0sCiAgICB7IGtleXM6ICc8Qy1bPicsIHR5cGU6ICdrZXlUb0tleScsIHRvS2V5czogJzxFc2M+JywgY29udGV4dDogJ2luc2VydCcgfSwKICAgIHsga2V5czogJzxDLWM+JywgdHlwZTogJ2tleVRvS2V5JywgdG9LZXlzOiAnPEVzYz4nLCBjb250ZXh0OiAnaW5zZXJ0JyB9LAogICAgeyBrZXlzOiAncycsIHR5cGU6ICdrZXlUb0tleScsIHRvS2V5czogJ2NsJywgY29udGV4dDogJ25vcm1hbCcgfSwKICAgIHsga2V5czogJ3MnLCB0eXBlOiAna2V5VG9LZXknLCB0b0tleXM6ICdjJywgY29udGV4dDogJ3Zpc3VhbCd9LAogICAgeyBrZXlzOiAnUycsIHR5cGU6ICdrZXlUb0tleScsIHRvS2V5czogJ2NjJywgY29udGV4dDogJ25vcm1hbCcgfSwKICAgIHsga2V5czogJ1MnLCB0eXBlOiAna2V5VG9LZXknLCB0b0tleXM6ICdWZE8nLCBjb250ZXh0OiAndmlzdWFsJyB9LAogICAgeyBrZXlzOiAnPEhvbWU+JywgdHlwZTogJ2tleVRvS2V5JywgdG9LZXlzOiAnMCcgfSwKICAgIHsga2V5czogJzxFbmQ+JywgdHlwZTogJ2tleVRvS2V5JywgdG9LZXlzOiAnJCcgfSwKICAgIHsga2V5czogJzxQYWdlVXA+JywgdHlwZTogJ2tleVRvS2V5JywgdG9LZXlzOiAnPEMtYj4nIH0sCiAgICB7IGtleXM6ICc8UGFnZURvd24+JywgdHlwZTogJ2tleVRvS2V5JywgdG9LZXlzOiAnPEMtZj4nIH0sCiAgICB7IGtleXM6ICc8Q1I+JywgdHlwZTogJ2tleVRvS2V5JywgdG9LZXlzOiAnal4nLCBjb250ZXh0OiAnbm9ybWFsJyB9LAogICAgeyBrZXlzOiAnPElucz4nLCB0eXBlOiAnYWN0aW9uJywgYWN0aW9uOiAndG9nZ2xlT3ZlcndyaXRlJywgY29udGV4dDogJ2luc2VydCcgfSwKICAgIC8vIE1vdGlvbnMKICAgIHsga2V5czogJ0gnLCB0eXBlOiAnbW90aW9uJywgbW90aW9uOiAnbW92ZVRvVG9wTGluZScsIG1vdGlvbkFyZ3M6IHsgbGluZXdpc2U6IHRydWUsIHRvSnVtcGxpc3Q6IHRydWUgfX0sCiAgICB7IGtleXM6ICdNJywgdHlwZTogJ21vdGlvbicsIG1vdGlvbjogJ21vdmVUb01pZGRsZUxpbmUnLCBtb3Rpb25BcmdzOiB7IGxpbmV3aXNlOiB0cnVlLCB0b0p1bXBsaXN0OiB0cnVlIH19LAogICAgeyBrZXlzOiAnTCcsIHR5cGU6ICdtb3Rpb24nLCBtb3Rpb246ICdtb3ZlVG9Cb3R0b21MaW5lJywgbW90aW9uQXJnczogeyBsaW5ld2lzZTogdHJ1ZSwgdG9KdW1wbGlzdDogdHJ1ZSB9fSwKICAgIHsga2V5czogJ2gnLCB0eXBlOiAnbW90aW9uJywgbW90aW9uOiAnbW92ZUJ5Q2hhcmFjdGVycycsIG1vdGlvbkFyZ3M6IHsgZm9yd2FyZDogZmFsc2UgfX0sCiAgICB7IGtleXM6ICdsJywgdHlwZTogJ21vdGlvbicsIG1vdGlvbjogJ21vdmVCeUNoYXJhY3RlcnMnLCBtb3Rpb25BcmdzOiB7IGZvcndhcmQ6IHRydWUgfX0sCiAgICB7IGtleXM6ICdqJywgdHlwZTogJ21vdGlvbicsIG1vdGlvbjogJ21vdmVCeUxpbmVzJywgbW90aW9uQXJnczogeyBmb3J3YXJkOiB0cnVlLCBsaW5ld2lzZTogdHJ1ZSB9fSwKICAgIHsga2V5czogJ2snLCB0eXBlOiAnbW90aW9uJywgbW90aW9uOiAnbW92ZUJ5TGluZXMnLCBtb3Rpb25BcmdzOiB7IGZvcndhcmQ6IGZhbHNlLCBsaW5ld2lzZTogdHJ1ZSB9fSwKICAgIHsga2V5czogJ2dqJywgdHlwZTogJ21vdGlvbicsIG1vdGlvbjogJ21vdmVCeURpc3BsYXlMaW5lcycsIG1vdGlvbkFyZ3M6IHsgZm9yd2FyZDogdHJ1ZSB9fSwKICAgIHsga2V5czogJ2drJywgdHlwZTogJ21vdGlvbicsIG1vdGlvbjogJ21vdmVCeURpc3BsYXlMaW5lcycsIG1vdGlvbkFyZ3M6IHsgZm9yd2FyZDogZmFsc2UgfX0sCiAgICB7IGtleXM6ICd3JywgdHlwZTogJ21vdGlvbicsIG1vdGlvbjogJ21vdmVCeVdvcmRzJywgbW90aW9uQXJnczogeyBmb3J3YXJkOiB0cnVlLCB3b3JkRW5kOiBmYWxzZSB9fSwKICAgIHsga2V5czogJ1cnLCB0eXBlOiAnbW90aW9uJywgbW90aW9uOiAnbW92ZUJ5V29yZHMnLCBtb3Rpb25BcmdzOiB7IGZvcndhcmQ6IHRydWUsIHdvcmRFbmQ6IGZhbHNlLCBiaWdXb3JkOiB0cnVlIH19LAogICAgeyBrZXlzOiAnZScsIHR5cGU6ICdtb3Rpb24nLCBtb3Rpb246ICdtb3ZlQnlXb3JkcycsIG1vdGlvbkFyZ3M6IHsgZm9yd2FyZDogdHJ1ZSwgd29yZEVuZDogdHJ1ZSwgaW5jbHVzaXZlOiB0cnVlIH19LAogICAgeyBrZXlzOiAnRScsIHR5cGU6ICdtb3Rpb24nLCBtb3Rpb246ICdtb3ZlQnlXb3JkcycsIG1vdGlvbkFyZ3M6IHsgZm9yd2FyZDogdHJ1ZSwgd29yZEVuZDogdHJ1ZSwgYmlnV29yZDogdHJ1ZSwgaW5jbHVzaXZlOiB0cnVlIH19LAogICAgeyBrZXlzOiAnYicsIHR5cGU6ICdtb3Rpb24nLCBtb3Rpb246ICdtb3ZlQnlXb3JkcycsIG1vdGlvbkFyZ3M6IHsgZm9yd2FyZDogZmFsc2UsIHdvcmRFbmQ6IGZhbHNlIH19LAogICAgeyBrZXlzOiAnQicsIHR5cGU6ICdtb3Rpb24nLCBtb3Rpb246ICdtb3ZlQnlXb3JkcycsIG1vdGlvbkFyZ3M6IHsgZm9yd2FyZDogZmFsc2UsIHdvcmRFbmQ6IGZhbHNlLCBiaWdXb3JkOiB0cnVlIH19LAogICAgeyBrZXlzOiAnZ2UnLCB0eXBlOiAnbW90aW9uJywgbW90aW9uOiAnbW92ZUJ5V29yZHMnLCBtb3Rpb25BcmdzOiB7IGZvcndhcmQ6IGZhbHNlLCB3b3JkRW5kOiB0cnVlLCBpbmNsdXNpdmU6IHRydWUgfX0sCiAgICB7IGtleXM6ICdnRScsIHR5cGU6ICdtb3Rpb24nLCBtb3Rpb246ICdtb3ZlQnlXb3JkcycsIG1vdGlvbkFyZ3M6IHsgZm9yd2FyZDogZmFsc2UsIHdvcmRFbmQ6IHRydWUsIGJpZ1dvcmQ6IHRydWUsIGluY2x1c2l2ZTogdHJ1ZSB9fSwKICAgIHsga2V5czogJ3snLCB0eXBlOiAnbW90aW9uJywgbW90aW9uOiAnbW92ZUJ5UGFyYWdyYXBoJywgbW90aW9uQXJnczogeyBmb3J3YXJkOiBmYWxzZSwgdG9KdW1wbGlzdDogdHJ1ZSB9fSwKICAgIHsga2V5czogJ30nLCB0eXBlOiAnbW90aW9uJywgbW90aW9uOiAnbW92ZUJ5UGFyYWdyYXBoJywgbW90aW9uQXJnczogeyBmb3J3YXJkOiB0cnVlLCB0b0p1bXBsaXN0OiB0cnVlIH19LAogICAgeyBrZXlzOiAnPEMtZj4nLCB0eXBlOiAnbW90aW9uJywgbW90aW9uOiAnbW92ZUJ5UGFnZScsIG1vdGlvbkFyZ3M6IHsgZm9yd2FyZDogdHJ1ZSB9fSwKICAgIHsga2V5czogJzxDLWI+JywgdHlwZTogJ21vdGlvbicsIG1vdGlvbjogJ21vdmVCeVBhZ2UnLCBtb3Rpb25BcmdzOiB7IGZvcndhcmQ6IGZhbHNlIH19LAogICAgeyBrZXlzOiAnPEMtZD4nLCB0eXBlOiAnbW90aW9uJywgbW90aW9uOiAnbW92ZUJ5U2Nyb2xsJywgbW90aW9uQXJnczogeyBmb3J3YXJkOiB0cnVlLCBleHBsaWNpdFJlcGVhdDogdHJ1ZSB9fSwKICAgIHsga2V5czogJzxDLXU+JywgdHlwZTogJ21vdGlvbicsIG1vdGlvbjogJ21vdmVCeVNjcm9sbCcsIG1vdGlvbkFyZ3M6IHsgZm9yd2FyZDogZmFsc2UsIGV4cGxpY2l0UmVwZWF0OiB0cnVlIH19LAogICAgeyBrZXlzOiAnZ2cnLCB0eXBlOiAnbW90aW9uJywgbW90aW9uOiAnbW92ZVRvTGluZU9yRWRnZU9mRG9jdW1lbnQnLCBtb3Rpb25BcmdzOiB7IGZvcndhcmQ6IGZhbHNlLCBleHBsaWNpdFJlcGVhdDogdHJ1ZSwgbGluZXdpc2U6IHRydWUsIHRvSnVtcGxpc3Q6IHRydWUgfX0sCiAgICB7IGtleXM6ICdHJywgdHlwZTogJ21vdGlvbicsIG1vdGlvbjogJ21vdmVUb0xpbmVPckVkZ2VPZkRvY3VtZW50JywgbW90aW9uQXJnczogeyBmb3J3YXJkOiB0cnVlLCBleHBsaWNpdFJlcGVhdDogdHJ1ZSwgbGluZXdpc2U6IHRydWUsIHRvSnVtcGxpc3Q6IHRydWUgfX0sCiAgICB7IGtleXM6ICcwJywgdHlwZTogJ21vdGlvbicsIG1vdGlvbjogJ21vdmVUb1N0YXJ0T2ZMaW5lJyB9LAogICAgeyBrZXlzOiAnXicsIHR5cGU6ICdtb3Rpb24nLCBtb3Rpb246ICdtb3ZlVG9GaXJzdE5vbldoaXRlU3BhY2VDaGFyYWN0ZXInIH0sCiAgICB7IGtleXM6ICcrJywgdHlwZTogJ21vdGlvbicsIG1vdGlvbjogJ21vdmVCeUxpbmVzJywgbW90aW9uQXJnczogeyBmb3J3YXJkOiB0cnVlLCB0b0ZpcnN0Q2hhcjp0cnVlIH19LAogICAgeyBrZXlzOiAnLScsIHR5cGU6ICdtb3Rpb24nLCBtb3Rpb246ICdtb3ZlQnlMaW5lcycsIG1vdGlvbkFyZ3M6IHsgZm9yd2FyZDogZmFsc2UsIHRvRmlyc3RDaGFyOnRydWUgfX0sCiAgICB7IGtleXM6ICdfJywgdHlwZTogJ21vdGlvbicsIG1vdGlvbjogJ21vdmVCeUxpbmVzJywgbW90aW9uQXJnczogeyBmb3J3YXJkOiB0cnVlLCB0b0ZpcnN0Q2hhcjp0cnVlLCByZXBlYXRPZmZzZXQ6LTEgfX0sCiAgICB7IGtleXM6ICckJywgdHlwZTogJ21vdGlvbicsIG1vdGlvbjogJ21vdmVUb0VvbCcsIG1vdGlvbkFyZ3M6IHsgaW5jbHVzaXZlOiB0cnVlIH19LAogICAgeyBrZXlzOiAnJScsIHR5cGU6ICdtb3Rpb24nLCBtb3Rpb246ICdtb3ZlVG9NYXRjaGVkU3ltYm9sJywgbW90aW9uQXJnczogeyBpbmNsdXNpdmU6IHRydWUsIHRvSnVtcGxpc3Q6IHRydWUgfX0sCiAgICB7IGtleXM6ICdmPGNoYXJhY3Rlcj4nLCB0eXBlOiAnbW90aW9uJywgbW90aW9uOiAnbW92ZVRvQ2hhcmFjdGVyJywgbW90aW9uQXJnczogeyBmb3J3YXJkOiB0cnVlICwgaW5jbHVzaXZlOiB0cnVlIH19LAogICAgeyBrZXlzOiAnRjxjaGFyYWN0ZXI+JywgdHlwZTogJ21vdGlvbicsIG1vdGlvbjogJ21vdmVUb0NoYXJhY3RlcicsIG1vdGlvbkFyZ3M6IHsgZm9yd2FyZDogZmFsc2UgfX0sCiAgICB7IGtleXM6ICd0PGNoYXJhY3Rlcj4nLCB0eXBlOiAnbW90aW9uJywgbW90aW9uOiAnbW92ZVRpbGxDaGFyYWN0ZXInLCBtb3Rpb25BcmdzOiB7IGZvcndhcmQ6IHRydWUsIGluY2x1c2l2ZTogdHJ1ZSB9fSwKICAgIHsga2V5czogJ1Q8Y2hhcmFjdGVyPicsIHR5cGU6ICdtb3Rpb24nLCBtb3Rpb246ICdtb3ZlVGlsbENoYXJhY3RlcicsIG1vdGlvbkFyZ3M6IHsgZm9yd2FyZDogZmFsc2UgfX0sCiAgICB7IGtleXM6ICc7JywgdHlwZTogJ21vdGlvbicsIG1vdGlvbjogJ3JlcGVhdExhc3RDaGFyYWN0ZXJTZWFyY2gnLCBtb3Rpb25BcmdzOiB7IGZvcndhcmQ6IHRydWUgfX0sCiAgICB7IGtleXM6ICcsJywgdHlwZTogJ21vdGlvbicsIG1vdGlvbjogJ3JlcGVhdExhc3RDaGFyYWN0ZXJTZWFyY2gnLCBtb3Rpb25BcmdzOiB7IGZvcndhcmQ6IGZhbHNlIH19LAogICAgeyBrZXlzOiAnXCc8Y2hhcmFjdGVyPicsIHR5cGU6ICdtb3Rpb24nLCBtb3Rpb246ICdnb1RvTWFyaycsIG1vdGlvbkFyZ3M6IHt0b0p1bXBsaXN0OiB0cnVlLCBsaW5ld2lzZTogdHJ1ZX19LAogICAgeyBrZXlzOiAnYDxjaGFyYWN0ZXI+JywgdHlwZTogJ21vdGlvbicsIG1vdGlvbjogJ2dvVG9NYXJrJywgbW90aW9uQXJnczoge3RvSnVtcGxpc3Q6IHRydWV9fSwKICAgIHsga2V5czogJ11gJywgdHlwZTogJ21vdGlvbicsIG1vdGlvbjogJ2p1bXBUb01hcmsnLCBtb3Rpb25BcmdzOiB7IGZvcndhcmQ6IHRydWUgfSB9LAogICAgeyBrZXlzOiAnW2AnLCB0eXBlOiAnbW90aW9uJywgbW90aW9uOiAnanVtcFRvTWFyaycsIG1vdGlvbkFyZ3M6IHsgZm9yd2FyZDogZmFsc2UgfSB9LAogICAgeyBrZXlzOiAnXVwnJywgdHlwZTogJ21vdGlvbicsIG1vdGlvbjogJ2p1bXBUb01hcmsnLCBtb3Rpb25BcmdzOiB7IGZvcndhcmQ6IHRydWUsIGxpbmV3aXNlOiB0cnVlIH0gfSwKICAgIHsga2V5czogJ1tcJycsIHR5cGU6ICdtb3Rpb24nLCBtb3Rpb246ICdqdW1wVG9NYXJrJywgbW90aW9uQXJnczogeyBmb3J3YXJkOiBmYWxzZSwgbGluZXdpc2U6IHRydWUgfSB9LAogICAgLy8gdGhlIG5leHQgdHdvIGFyZW4ndCBtb3Rpb25zIGJ1dCBtdXN0IGNvbWUgYmVmb3JlIG1vcmUgZ2VuZXJhbCBtb3Rpb24gZGVjbGFyYXRpb25zCiAgICB7IGtleXM6ICddcCcsIHR5cGU6ICdhY3Rpb24nLCBhY3Rpb246ICdwYXN0ZScsIGlzRWRpdDogdHJ1ZSwgYWN0aW9uQXJnczogeyBhZnRlcjogdHJ1ZSwgaXNFZGl0OiB0cnVlLCBtYXRjaEluZGVudDogdHJ1ZX19LAogICAgeyBrZXlzOiAnW3AnLCB0eXBlOiAnYWN0aW9uJywgYWN0aW9uOiAncGFzdGUnLCBpc0VkaXQ6IHRydWUsIGFjdGlvbkFyZ3M6IHsgYWZ0ZXI6IGZhbHNlLCBpc0VkaXQ6IHRydWUsIG1hdGNoSW5kZW50OiB0cnVlfX0sCiAgICB7IGtleXM6ICddPGNoYXJhY3Rlcj4nLCB0eXBlOiAnbW90aW9uJywgbW90aW9uOiAnbW92ZVRvU3ltYm9sJywgbW90aW9uQXJnczogeyBmb3J3YXJkOiB0cnVlLCB0b0p1bXBsaXN0OiB0cnVlfX0sCiAgICB7IGtleXM6ICdbPGNoYXJhY3Rlcj4nLCB0eXBlOiAnbW90aW9uJywgbW90aW9uOiAnbW92ZVRvU3ltYm9sJywgbW90aW9uQXJnczogeyBmb3J3YXJkOiBmYWxzZSwgdG9KdW1wbGlzdDogdHJ1ZX19LAogICAgeyBrZXlzOiAnfCcsIHR5cGU6ICdtb3Rpb24nLCBtb3Rpb246ICdtb3ZlVG9Db2x1bW4nfSwKICAgIHsga2V5czogJ28nLCB0eXBlOiAnbW90aW9uJywgbW90aW9uOiAnbW92ZVRvT3RoZXJIaWdobGlnaHRlZEVuZCcsIGNvbnRleHQ6J3Zpc3VhbCd9LAogICAgeyBrZXlzOiAnTycsIHR5cGU6ICdtb3Rpb24nLCBtb3Rpb246ICdtb3ZlVG9PdGhlckhpZ2hsaWdodGVkRW5kJywgbW90aW9uQXJnczoge3NhbWVMaW5lOiB0cnVlfSwgY29udGV4dDondmlzdWFsJ30sCiAgICAvLyBPcGVyYXRvcnMKICAgIHsga2V5czogJ2QnLCB0eXBlOiAnb3BlcmF0b3InLCBvcGVyYXRvcjogJ2RlbGV0ZScgfSwKICAgIHsga2V5czogJ3knLCB0eXBlOiAnb3BlcmF0b3InLCBvcGVyYXRvcjogJ3lhbmsnIH0sCiAgICB7IGtleXM6ICdjJywgdHlwZTogJ29wZXJhdG9yJywgb3BlcmF0b3I6ICdjaGFuZ2UnIH0sCiAgICB7IGtleXM6ICc+JywgdHlwZTogJ29wZXJhdG9yJywgb3BlcmF0b3I6ICdpbmRlbnQnLCBvcGVyYXRvckFyZ3M6IHsgaW5kZW50UmlnaHQ6IHRydWUgfX0sCiAgICB7IGtleXM6ICc8JywgdHlwZTogJ29wZXJhdG9yJywgb3BlcmF0b3I6ICdpbmRlbnQnLCBvcGVyYXRvckFyZ3M6IHsgaW5kZW50UmlnaHQ6IGZhbHNlIH19LAogICAgeyBrZXlzOiAnZ34nLCB0eXBlOiAnb3BlcmF0b3InLCBvcGVyYXRvcjogJ2NoYW5nZUNhc2UnIH0sCiAgICB7IGtleXM6ICdndScsIHR5cGU6ICdvcGVyYXRvcicsIG9wZXJhdG9yOiAnY2hhbmdlQ2FzZScsIG9wZXJhdG9yQXJnczoge3RvTG93ZXI6IHRydWV9LCBpc0VkaXQ6IHRydWUgfSwKICAgIHsga2V5czogJ2dVJywgdHlwZTogJ29wZXJhdG9yJywgb3BlcmF0b3I6ICdjaGFuZ2VDYXNlJywgb3BlcmF0b3JBcmdzOiB7dG9Mb3dlcjogZmFsc2V9LCBpc0VkaXQ6IHRydWUgfSwKICAgIHsga2V5czogJ24nLCB0eXBlOiAnbW90aW9uJywgbW90aW9uOiAnZmluZE5leHQnLCBtb3Rpb25BcmdzOiB7IGZvcndhcmQ6IHRydWUsIHRvSnVtcGxpc3Q6IHRydWUgfX0sCiAgICB7IGtleXM6ICdOJywgdHlwZTogJ21vdGlvbicsIG1vdGlvbjogJ2ZpbmROZXh0JywgbW90aW9uQXJnczogeyBmb3J3YXJkOiBmYWxzZSwgdG9KdW1wbGlzdDogdHJ1ZSB9fSwKICAgIC8vIE9wZXJhdG9yLU1vdGlvbiBkdWFsIGNvbW1hbmRzCiAgICB7IGtleXM6ICd4JywgdHlwZTogJ29wZXJhdG9yTW90aW9uJywgb3BlcmF0b3I6ICdkZWxldGUnLCBtb3Rpb246ICdtb3ZlQnlDaGFyYWN0ZXJzJywgbW90aW9uQXJnczogeyBmb3J3YXJkOiB0cnVlIH0sIG9wZXJhdG9yTW90aW9uQXJnczogeyB2aXN1YWxMaW5lOiBmYWxzZSB9fSwKICAgIHsga2V5czogJ1gnLCB0eXBlOiAnb3BlcmF0b3JNb3Rpb24nLCBvcGVyYXRvcjogJ2RlbGV0ZScsIG1vdGlvbjogJ21vdmVCeUNoYXJhY3RlcnMnLCBtb3Rpb25BcmdzOiB7IGZvcndhcmQ6IGZhbHNlIH0sIG9wZXJhdG9yTW90aW9uQXJnczogeyB2aXN1YWxMaW5lOiB0cnVlIH19LAogICAgeyBrZXlzOiAnRCcsIHR5cGU6ICdvcGVyYXRvck1vdGlvbicsIG9wZXJhdG9yOiAnZGVsZXRlJywgbW90aW9uOiAnbW92ZVRvRW9sJywgbW90aW9uQXJnczogeyBpbmNsdXNpdmU6IHRydWUgfSwgY29udGV4dDogJ25vcm1hbCd9LAogICAgeyBrZXlzOiAnRCcsIHR5cGU6ICdvcGVyYXRvcicsIG9wZXJhdG9yOiAnZGVsZXRlJywgb3BlcmF0b3JBcmdzOiB7IGxpbmV3aXNlOiB0cnVlIH0sIGNvbnRleHQ6ICd2aXN1YWwnfSwKICAgIHsga2V5czogJ1knLCB0eXBlOiAnb3BlcmF0b3JNb3Rpb24nLCBvcGVyYXRvcjogJ3lhbmsnLCBtb3Rpb246ICdtb3ZlVG9Fb2wnLCBtb3Rpb25BcmdzOiB7IGluY2x1c2l2ZTogdHJ1ZSB9LCBjb250ZXh0OiAnbm9ybWFsJ30sCiAgICB7IGtleXM6ICdZJywgdHlwZTogJ29wZXJhdG9yJywgb3BlcmF0b3I6ICd5YW5rJywgb3BlcmF0b3JBcmdzOiB7IGxpbmV3aXNlOiB0cnVlIH0sIGNvbnRleHQ6ICd2aXN1YWwnfSwKICAgIHsga2V5czogJ0MnLCB0eXBlOiAnb3BlcmF0b3JNb3Rpb24nLCBvcGVyYXRvcjogJ2NoYW5nZScsIG1vdGlvbjogJ21vdmVUb0VvbCcsIG1vdGlvbkFyZ3M6IHsgaW5jbHVzaXZlOiB0cnVlIH0sIGNvbnRleHQ6ICdub3JtYWwnfSwKICAgIHsga2V5czogJ0MnLCB0eXBlOiAnb3BlcmF0b3InLCBvcGVyYXRvcjogJ2NoYW5nZScsIG9wZXJhdG9yQXJnczogeyBsaW5ld2lzZTogdHJ1ZSB9LCBjb250ZXh0OiAndmlzdWFsJ30sCiAgICB7IGtleXM6ICd+JywgdHlwZTogJ29wZXJhdG9yTW90aW9uJywgb3BlcmF0b3I6ICdjaGFuZ2VDYXNlJywgbW90aW9uOiAnbW92ZUJ5Q2hhcmFjdGVycycsIG1vdGlvbkFyZ3M6IHsgZm9yd2FyZDogdHJ1ZSB9LCBvcGVyYXRvckFyZ3M6IHsgc2hvdWxkTW92ZUN1cnNvcjogdHJ1ZSB9LCBjb250ZXh0OiAnbm9ybWFsJ30sCiAgICB7IGtleXM6ICd+JywgdHlwZTogJ29wZXJhdG9yJywgb3BlcmF0b3I6ICdjaGFuZ2VDYXNlJywgY29udGV4dDogJ3Zpc3VhbCd9LAogICAgeyBrZXlzOiAnPEMtdz4nLCB0eXBlOiAnb3BlcmF0b3JNb3Rpb24nLCBvcGVyYXRvcjogJ2RlbGV0ZScsIG1vdGlvbjogJ21vdmVCeVdvcmRzJywgbW90aW9uQXJnczogeyBmb3J3YXJkOiBmYWxzZSwgd29yZEVuZDogZmFsc2UgfSwgY29udGV4dDogJ2luc2VydCcgfSwKICAgIC8vIEFjdGlvbnMKICAgIHsga2V5czogJzxDLWk+JywgdHlwZTogJ2FjdGlvbicsIGFjdGlvbjogJ2p1bXBMaXN0V2FsaycsIGFjdGlvbkFyZ3M6IHsgZm9yd2FyZDogdHJ1ZSB9fSwKICAgIHsga2V5czogJzxDLW8+JywgdHlwZTogJ2FjdGlvbicsIGFjdGlvbjogJ2p1bXBMaXN0V2FsaycsIGFjdGlvbkFyZ3M6IHsgZm9yd2FyZDogZmFsc2UgfX0sCiAgICB7IGtleXM6ICc8Qy1lPicsIHR5cGU6ICdhY3Rpb24nLCBhY3Rpb246ICdzY3JvbGwnLCBhY3Rpb25BcmdzOiB7IGZvcndhcmQ6IHRydWUsIGxpbmV3aXNlOiB0cnVlIH19LAogICAgeyBrZXlzOiAnPEMteT4nLCB0eXBlOiAnYWN0aW9uJywgYWN0aW9uOiAnc2Nyb2xsJywgYWN0aW9uQXJnczogeyBmb3J3YXJkOiBmYWxzZSwgbGluZXdpc2U6IHRydWUgfX0sCiAgICB7IGtleXM6ICdhJywgdHlwZTogJ2FjdGlvbicsIGFjdGlvbjogJ2VudGVySW5zZXJ0TW9kZScsIGlzRWRpdDogdHJ1ZSwgYWN0aW9uQXJnczogeyBpbnNlcnRBdDogJ2NoYXJBZnRlcicgfSwgY29udGV4dDogJ25vcm1hbCcgfSwKICAgIHsga2V5czogJ0EnLCB0eXBlOiAnYWN0aW9uJywgYWN0aW9uOiAnZW50ZXJJbnNlcnRNb2RlJywgaXNFZGl0OiB0cnVlLCBhY3Rpb25BcmdzOiB7IGluc2VydEF0OiAnZW9sJyB9LCBjb250ZXh0OiAnbm9ybWFsJyB9LAogICAgeyBrZXlzOiAnQScsIHR5cGU6ICdhY3Rpb24nLCBhY3Rpb246ICdlbnRlckluc2VydE1vZGUnLCBpc0VkaXQ6IHRydWUsIGFjdGlvbkFyZ3M6IHsgaW5zZXJ0QXQ6ICdlbmRPZlNlbGVjdGVkQXJlYScgfSwgY29udGV4dDogJ3Zpc3VhbCcgfSwKICAgIHsga2V5czogJ2knLCB0eXBlOiAnYWN0aW9uJywgYWN0aW9uOiAnZW50ZXJJbnNlcnRNb2RlJywgaXNFZGl0OiB0cnVlLCBhY3Rpb25BcmdzOiB7IGluc2VydEF0OiAnaW5wbGFjZScgfSwgY29udGV4dDogJ25vcm1hbCcgfSwKICAgIHsga2V5czogJ0knLCB0eXBlOiAnYWN0aW9uJywgYWN0aW9uOiAnZW50ZXJJbnNlcnRNb2RlJywgaXNFZGl0OiB0cnVlLCBhY3Rpb25BcmdzOiB7IGluc2VydEF0OiAnZmlyc3ROb25CbGFuayd9LCBjb250ZXh0OiAnbm9ybWFsJyB9LAogICAgeyBrZXlzOiAnSScsIHR5cGU6ICdhY3Rpb24nLCBhY3Rpb246ICdlbnRlckluc2VydE1vZGUnLCBpc0VkaXQ6IHRydWUsIGFjdGlvbkFyZ3M6IHsgaW5zZXJ0QXQ6ICdzdGFydE9mU2VsZWN0ZWRBcmVhJyB9LCBjb250ZXh0OiAndmlzdWFsJyB9LAogICAgeyBrZXlzOiAnbycsIHR5cGU6ICdhY3Rpb24nLCBhY3Rpb246ICduZXdMaW5lQW5kRW50ZXJJbnNlcnRNb2RlJywgaXNFZGl0OiB0cnVlLCBpbnRlcmxhY2VJbnNlcnRSZXBlYXQ6IHRydWUsIGFjdGlvbkFyZ3M6IHsgYWZ0ZXI6IHRydWUgfSwgY29udGV4dDogJ25vcm1hbCcgfSwKICAgIHsga2V5czogJ08nLCB0eXBlOiAnYWN0aW9uJywgYWN0aW9uOiAnbmV3TGluZUFuZEVudGVySW5zZXJ0TW9kZScsIGlzRWRpdDogdHJ1ZSwgaW50ZXJsYWNlSW5zZXJ0UmVwZWF0OiB0cnVlLCBhY3Rpb25BcmdzOiB7IGFmdGVyOiBmYWxzZSB9LCBjb250ZXh0OiAnbm9ybWFsJyB9LAogICAgeyBrZXlzOiAndicsIHR5cGU6ICdhY3Rpb24nLCBhY3Rpb246ICd0b2dnbGVWaXN1YWxNb2RlJyB9LAogICAgeyBrZXlzOiAnVicsIHR5cGU6ICdhY3Rpb24nLCBhY3Rpb246ICd0b2dnbGVWaXN1YWxNb2RlJywgYWN0aW9uQXJnczogeyBsaW5ld2lzZTogdHJ1ZSB9fSwKICAgIHsga2V5czogJzxDLXY+JywgdHlwZTogJ2FjdGlvbicsIGFjdGlvbjogJ3RvZ2dsZVZpc3VhbE1vZGUnLCBhY3Rpb25BcmdzOiB7IGJsb2Nrd2lzZTogdHJ1ZSB9fSwKICAgIHsga2V5czogJzxDLXE+JywgdHlwZTogJ2FjdGlvbicsIGFjdGlvbjogJ3RvZ2dsZVZpc3VhbE1vZGUnLCBhY3Rpb25BcmdzOiB7IGJsb2Nrd2lzZTogdHJ1ZSB9fSwKICAgIHsga2V5czogJ2d2JywgdHlwZTogJ2FjdGlvbicsIGFjdGlvbjogJ3Jlc2VsZWN0TGFzdFNlbGVjdGlvbicgfSwKICAgIHsga2V5czogJ0onLCB0eXBlOiAnYWN0aW9uJywgYWN0aW9uOiAnam9pbkxpbmVzJywgaXNFZGl0OiB0cnVlIH0sCiAgICB7IGtleXM6ICdwJywgdHlwZTogJ2FjdGlvbicsIGFjdGlvbjogJ3Bhc3RlJywgaXNFZGl0OiB0cnVlLCBhY3Rpb25BcmdzOiB7IGFmdGVyOiB0cnVlLCBpc0VkaXQ6IHRydWUgfX0sCiAgICB7IGtleXM6ICdQJywgdHlwZTogJ2FjdGlvbicsIGFjdGlvbjogJ3Bhc3RlJywgaXNFZGl0OiB0cnVlLCBhY3Rpb25BcmdzOiB7IGFmdGVyOiBmYWxzZSwgaXNFZGl0OiB0cnVlIH19LAogICAgeyBrZXlzOiAncjxjaGFyYWN0ZXI+JywgdHlwZTogJ2FjdGlvbicsIGFjdGlvbjogJ3JlcGxhY2UnLCBpc0VkaXQ6IHRydWUgfSwKICAgIHsga2V5czogJ0A8Y2hhcmFjdGVyPicsIHR5cGU6ICdhY3Rpb24nLCBhY3Rpb246ICdyZXBsYXlNYWNybycgfSwKICAgIHsga2V5czogJ3E8Y2hhcmFjdGVyPicsIHR5cGU6ICdhY3Rpb24nLCBhY3Rpb246ICdlbnRlck1hY3JvUmVjb3JkTW9kZScgfSwKICAgIC8vIEhhbmRsZSBSZXBsYWNlLW1vZGUgYXMgYSBzcGVjaWFsIGNhc2Ugb2YgaW5zZXJ0IG1vZGUuCiAgICB7IGtleXM6ICdSJywgdHlwZTogJ2FjdGlvbicsIGFjdGlvbjogJ2VudGVySW5zZXJ0TW9kZScsIGlzRWRpdDogdHJ1ZSwgYWN0aW9uQXJnczogeyByZXBsYWNlOiB0cnVlIH19LAogICAgeyBrZXlzOiAndScsIHR5cGU6ICdhY3Rpb24nLCBhY3Rpb246ICd1bmRvJywgY29udGV4dDogJ25vcm1hbCcgfSwKICAgIHsga2V5czogJ3UnLCB0eXBlOiAnb3BlcmF0b3InLCBvcGVyYXRvcjogJ2NoYW5nZUNhc2UnLCBvcGVyYXRvckFyZ3M6IHt0b0xvd2VyOiB0cnVlfSwgY29udGV4dDogJ3Zpc3VhbCcsIGlzRWRpdDogdHJ1ZSB9LAogICAgeyBrZXlzOiAnVScsIHR5cGU6ICdvcGVyYXRvcicsIG9wZXJhdG9yOiAnY2hhbmdlQ2FzZScsIG9wZXJhdG9yQXJnczoge3RvTG93ZXI6IGZhbHNlfSwgY29udGV4dDogJ3Zpc3VhbCcsIGlzRWRpdDogdHJ1ZSB9LAogICAgeyBrZXlzOiAnPEMtcj4nLCB0eXBlOiAnYWN0aW9uJywgYWN0aW9uOiAncmVkbycgfSwKICAgIHsga2V5czogJ208Y2hhcmFjdGVyPicsIHR5cGU6ICdhY3Rpb24nLCBhY3Rpb246ICdzZXRNYXJrJyB9LAogICAgeyBrZXlzOiAnIjxjaGFyYWN0ZXI+JywgdHlwZTogJ2FjdGlvbicsIGFjdGlvbjogJ3NldFJlZ2lzdGVyJyB9LAogICAgeyBrZXlzOiAnenonLCB0eXBlOiAnYWN0aW9uJywgYWN0aW9uOiAnc2Nyb2xsVG9DdXJzb3InLCBhY3Rpb25BcmdzOiB7IHBvc2l0aW9uOiAnY2VudGVyJyB9fSwKICAgIHsga2V5czogJ3ouJywgdHlwZTogJ2FjdGlvbicsIGFjdGlvbjogJ3Njcm9sbFRvQ3Vyc29yJywgYWN0aW9uQXJnczogeyBwb3NpdGlvbjogJ2NlbnRlcicgfSwgbW90aW9uOiAnbW92ZVRvRmlyc3ROb25XaGl0ZVNwYWNlQ2hhcmFjdGVyJyB9LAogICAgeyBrZXlzOiAnenQnLCB0eXBlOiAnYWN0aW9uJywgYWN0aW9uOiAnc2Nyb2xsVG9DdXJzb3InLCBhY3Rpb25BcmdzOiB7IHBvc2l0aW9uOiAndG9wJyB9fSwKICAgIHsga2V5czogJ3o8Q1I+JywgdHlwZTogJ2FjdGlvbicsIGFjdGlvbjogJ3Njcm9sbFRvQ3Vyc29yJywgYWN0aW9uQXJnczogeyBwb3NpdGlvbjogJ3RvcCcgfSwgbW90aW9uOiAnbW92ZVRvRmlyc3ROb25XaGl0ZVNwYWNlQ2hhcmFjdGVyJyB9LAogICAgeyBrZXlzOiAnei0nLCB0eXBlOiAnYWN0aW9uJywgYWN0aW9uOiAnc2Nyb2xsVG9DdXJzb3InLCBhY3Rpb25BcmdzOiB7IHBvc2l0aW9uOiAnYm90dG9tJyB9fSwKICAgIHsga2V5czogJ3piJywgdHlwZTogJ2FjdGlvbicsIGFjdGlvbjogJ3Njcm9sbFRvQ3Vyc29yJywgYWN0aW9uQXJnczogeyBwb3NpdGlvbjogJ2JvdHRvbScgfSwgbW90aW9uOiAnbW92ZVRvRmlyc3ROb25XaGl0ZVNwYWNlQ2hhcmFjdGVyJyB9LAogICAgeyBrZXlzOiAnLicsIHR5cGU6ICdhY3Rpb24nLCBhY3Rpb246ICdyZXBlYXRMYXN0RWRpdCcgfSwKICAgIHsga2V5czogJzxDLWE+JywgdHlwZTogJ2FjdGlvbicsIGFjdGlvbjogJ2luY3JlbWVudE51bWJlclRva2VuJywgaXNFZGl0OiB0cnVlLCBhY3Rpb25BcmdzOiB7aW5jcmVhc2U6IHRydWUsIGJhY2t0cmFjazogZmFsc2V9fSwKICAgIHsga2V5czogJzxDLXg+JywgdHlwZTogJ2FjdGlvbicsIGFjdGlvbjogJ2luY3JlbWVudE51bWJlclRva2VuJywgaXNFZGl0OiB0cnVlLCBhY3Rpb25BcmdzOiB7aW5jcmVhc2U6IGZhbHNlLCBiYWNrdHJhY2s6IGZhbHNlfX0sCiAgICAvLyBUZXh0IG9iamVjdCBtb3Rpb25zCiAgICB7IGtleXM6ICdhPGNoYXJhY3Rlcj4nLCB0eXBlOiAnbW90aW9uJywgbW90aW9uOiAndGV4dE9iamVjdE1hbmlwdWxhdGlvbicgfSwKICAgIHsga2V5czogJ2k8Y2hhcmFjdGVyPicsIHR5cGU6ICdtb3Rpb24nLCBtb3Rpb246ICd0ZXh0T2JqZWN0TWFuaXB1bGF0aW9uJywgbW90aW9uQXJnczogeyB0ZXh0T2JqZWN0SW5uZXI6IHRydWUgfX0sCiAgICAvLyBTZWFyY2gKICAgIHsga2V5czogJy8nLCB0eXBlOiAnc2VhcmNoJywgc2VhcmNoQXJnczogeyBmb3J3YXJkOiB0cnVlLCBxdWVyeVNyYzogJ3Byb21wdCcsIHRvSnVtcGxpc3Q6IHRydWUgfX0sCiAgICB7IGtleXM6ICc/JywgdHlwZTogJ3NlYXJjaCcsIHNlYXJjaEFyZ3M6IHsgZm9yd2FyZDogZmFsc2UsIHF1ZXJ5U3JjOiAncHJvbXB0JywgdG9KdW1wbGlzdDogdHJ1ZSB9fSwKICAgIHsga2V5czogJyonLCB0eXBlOiAnc2VhcmNoJywgc2VhcmNoQXJnczogeyBmb3J3YXJkOiB0cnVlLCBxdWVyeVNyYzogJ3dvcmRVbmRlckN1cnNvcicsIHdob2xlV29yZE9ubHk6IHRydWUsIHRvSnVtcGxpc3Q6IHRydWUgfX0sCiAgICB7IGtleXM6ICcjJywgdHlwZTogJ3NlYXJjaCcsIHNlYXJjaEFyZ3M6IHsgZm9yd2FyZDogZmFsc2UsIHF1ZXJ5U3JjOiAnd29yZFVuZGVyQ3Vyc29yJywgd2hvbGVXb3JkT25seTogdHJ1ZSwgdG9KdW1wbGlzdDogdHJ1ZSB9fSwKICAgIHsga2V5czogJ2cqJywgdHlwZTogJ3NlYXJjaCcsIHNlYXJjaEFyZ3M6IHsgZm9yd2FyZDogdHJ1ZSwgcXVlcnlTcmM6ICd3b3JkVW5kZXJDdXJzb3InLCB0b0p1bXBsaXN0OiB0cnVlIH19LAogICAgeyBrZXlzOiAnZyMnLCB0eXBlOiAnc2VhcmNoJywgc2VhcmNoQXJnczogeyBmb3J3YXJkOiBmYWxzZSwgcXVlcnlTcmM6ICd3b3JkVW5kZXJDdXJzb3InLCB0b0p1bXBsaXN0OiB0cnVlIH19LAogICAgLy8gRXggY29tbWFuZAogICAgeyBrZXlzOiAnOicsIHR5cGU6ICdleCcgfQogIF07CgogIC8qKgogICAqIEV4IGNvbW1hbmRzCiAgICogQ2FyZSBtdXN0IGJlIHRha2VuIHdoZW4gYWRkaW5nIHRvIHRoZSBkZWZhdWx0IEV4IGNvbW1hbmQgbWFwLiBGb3IgYW55CiAgICogcGFpciBvZiBjb21tYW5kcyB0aGF0IGhhdmUgYSBzaGFyZWQgcHJlZml4LCBhdCBsZWFzdCBvbmUgb2YgdGhlaXIKICAgKiBzaG9ydE5hbWVzIG11c3Qgbm90IG1hdGNoIHRoZSBwcmVmaXggb2YgdGhlIG90aGVyIGNvbW1hbmQuCiAgICovCiAgdmFyIGRlZmF1bHRFeENvbW1hbmRNYXAgPSBbCiAgICB7IG5hbWU6ICdjb2xvcnNjaGVtZScsIHNob3J0TmFtZTogJ2NvbG8nIH0sCiAgICB7IG5hbWU6ICdtYXAnIH0sCiAgICB7IG5hbWU6ICdpbWFwJywgc2hvcnROYW1lOiAnaW0nIH0sCiAgICB7IG5hbWU6ICdubWFwJywgc2hvcnROYW1lOiAnbm0nIH0sCiAgICB7IG5hbWU6ICd2bWFwJywgc2hvcnROYW1lOiAndm0nIH0sCiAgICB7IG5hbWU6ICd1bm1hcCcgfSwKICAgIHsgbmFtZTogJ3dyaXRlJywgc2hvcnROYW1lOiAndycgfSwKICAgIHsgbmFtZTogJ3VuZG8nLCBzaG9ydE5hbWU6ICd1JyB9LAogICAgeyBuYW1lOiAncmVkbycsIHNob3J0TmFtZTogJ3JlZCcgfSwKICAgIHsgbmFtZTogJ3NldCcsIHNob3J0TmFtZTogJ3NlJyB9LAogICAgeyBuYW1lOiAnc2V0Jywgc2hvcnROYW1lOiAnc2UnIH0sCiAgICB7IG5hbWU6ICdzZXRsb2NhbCcsIHNob3J0TmFtZTogJ3NldGwnIH0sCiAgICB7IG5hbWU6ICdzZXRnbG9iYWwnLCBzaG9ydE5hbWU6ICdzZXRnJyB9LAogICAgeyBuYW1lOiAnc29ydCcsIHNob3J0TmFtZTogJ3NvcicgfSwKICAgIHsgbmFtZTogJ3N1YnN0aXR1dGUnLCBzaG9ydE5hbWU6ICdzJywgcG9zc2libHlBc3luYzogdHJ1ZSB9LAogICAgeyBuYW1lOiAnbm9obHNlYXJjaCcsIHNob3J0TmFtZTogJ25vaCcgfSwKICAgIHsgbmFtZTogJ3lhbmsnLCBzaG9ydE5hbWU6ICd5JyB9LAogICAgeyBuYW1lOiAnZGVsbWFya3MnLCBzaG9ydE5hbWU6ICdkZWxtJyB9LAogICAgeyBuYW1lOiAncmVnaXN0ZXJzJywgc2hvcnROYW1lOiAncmVnJywgZXhjbHVkZUZyb21Db21tYW5kSGlzdG9yeTogdHJ1ZSB9LAogICAgeyBuYW1lOiAnZ2xvYmFsJywgc2hvcnROYW1lOiAnZycgfQogIF07CgogIHZhciBQb3MgPSBDb2RlTWlycm9yLlBvczsKCiAgdmFyIFZpbSA9IGZ1bmN0aW9uKCkgewogICAgZnVuY3Rpb24gZW50ZXJWaW1Nb2RlKGNtKSB7CiAgICAgIGNtLnNldE9wdGlvbignZGlzYWJsZUlucHV0JywgdHJ1ZSk7CiAgICAgIGNtLnNldE9wdGlvbignc2hvd0N1cnNvcldoZW5TZWxlY3RpbmcnLCBmYWxzZSk7CiAgICAgIENvZGVNaXJyb3Iuc2lnbmFsKGNtLCAidmltLW1vZGUtY2hhbmdlIiwge21vZGU6ICJub3JtYWwifSk7CiAgICAgIGNtLm9uKCdjdXJzb3JBY3Rpdml0eScsIG9uQ3Vyc29yQWN0aXZpdHkpOwogICAgICBtYXliZUluaXRWaW1TdGF0ZShjbSk7CiAgICAgIENvZGVNaXJyb3Iub24oY20uZ2V0SW5wdXRGaWVsZCgpLCAncGFzdGUnLCBnZXRPblBhc3RlRm4oY20pKTsKICAgIH0KCiAgICBmdW5jdGlvbiBsZWF2ZVZpbU1vZGUoY20pIHsKICAgICAgY20uc2V0T3B0aW9uKCdkaXNhYmxlSW5wdXQnLCBmYWxzZSk7CiAgICAgIGNtLm9mZignY3Vyc29yQWN0aXZpdHknLCBvbkN1cnNvckFjdGl2aXR5KTsKICAgICAgQ29kZU1pcnJvci5vZmYoY20uZ2V0SW5wdXRGaWVsZCgpLCAncGFzdGUnLCBnZXRPblBhc3RlRm4oY20pKTsKICAgICAgY20uc3RhdGUudmltID0gbnVsbDsKICAgIH0KCiAgICBmdW5jdGlvbiBkZXRhY2hWaW1NYXAoY20sIG5leHQpIHsKICAgICAgaWYgKHRoaXMgPT0gQ29kZU1pcnJvci5rZXlNYXAudmltKQogICAgICAgIENvZGVNaXJyb3Iucm1DbGFzcyhjbS5nZXRXcmFwcGVyRWxlbWVudCgpLCAiY20tZmF0LWN1cnNvciIpOwoKICAgICAgaWYgKCFuZXh0IHx8IG5leHQuYXR0YWNoICE9IGF0dGFjaFZpbU1hcCkKICAgICAgICBsZWF2ZVZpbU1vZGUoY20sIGZhbHNlKTsKICAgIH0KICAgIGZ1bmN0aW9uIGF0dGFjaFZpbU1hcChjbSwgcHJldikgewogICAgICBpZiAodGhpcyA9PSBDb2RlTWlycm9yLmtleU1hcC52aW0pCiAgICAgICAgQ29kZU1pcnJvci5hZGRDbGFzcyhjbS5nZXRXcmFwcGVyRWxlbWVudCgpLCAiY20tZmF0LWN1cnNvciIpOwoKICAgICAgaWYgKCFwcmV2IHx8IHByZXYuYXR0YWNoICE9IGF0dGFjaFZpbU1hcCkKICAgICAgICBlbnRlclZpbU1vZGUoY20pOwogICAgfQoKICAgIC8vIERlcHJlY2F0ZWQsIHNpbXBseSBzZXR0aW5nIHRoZSBrZXltYXAgd29ya3MgYWdhaW4uCiAgICBDb2RlTWlycm9yLmRlZmluZU9wdGlvbigndmltTW9kZScsIGZhbHNlLCBmdW5jdGlvbihjbSwgdmFsLCBwcmV2KSB7CiAgICAgIGlmICh2YWwgJiYgY20uZ2V0T3B0aW9uKCJrZXlNYXAiKSAhPSAidmltIikKICAgICAgICBjbS5zZXRPcHRpb24oImtleU1hcCIsICJ2aW0iKTsKICAgICAgZWxzZSBpZiAoIXZhbCAmJiBwcmV2ICE9IENvZGVNaXJyb3IuSW5pdCAmJiAvXnZpbS8udGVzdChjbS5nZXRPcHRpb24oImtleU1hcCIpKSkKICAgICAgICBjbS5zZXRPcHRpb24oImtleU1hcCIsICJkZWZhdWx0Iik7CiAgICB9KTsKCiAgICBmdW5jdGlvbiBjbUtleShrZXksIGNtKSB7CiAgICAgIGlmICghY20pIHsgcmV0dXJuIHVuZGVmaW5lZDsgfQogICAgICBpZiAodGhpc1trZXldKSB7IHJldHVybiB0aGlzW2tleV07IH0KICAgICAgdmFyIHZpbUtleSA9IGNtS2V5VG9WaW1LZXkoa2V5KTsKICAgICAgaWYgKCF2aW1LZXkpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgdmFyIGNtZCA9IENvZGVNaXJyb3IuVmltLmZpbmRLZXkoY20sIHZpbUtleSk7CiAgICAgIGlmICh0eXBlb2YgY21kID09ICdmdW5jdGlvbicpIHsKICAgICAgICBDb2RlTWlycm9yLnNpZ25hbChjbSwgJ3ZpbS1rZXlwcmVzcycsIHZpbUtleSk7CiAgICAgIH0KICAgICAgcmV0dXJuIGNtZDsKICAgIH0KCiAgICB2YXIgbW9kaWZpZXJzID0geydTaGlmdCc6ICdTJywgJ0N0cmwnOiAnQycsICdBbHQnOiAnQScsICdDbWQnOiAnRCcsICdNb2QnOiAnQSd9OwogICAgdmFyIHNwZWNpYWxLZXlzID0ge0VudGVyOidDUicsQmFja3NwYWNlOidCUycsRGVsZXRlOidEZWwnLEluc2VydDonSW5zJ307CiAgICBmdW5jdGlvbiBjbUtleVRvVmltS2V5KGtleSkgewogICAgICBpZiAoa2V5LmNoYXJBdCgwKSA9PSAnXCcnKSB7CiAgICAgICAgLy8gS2V5cHJlc3MgY2hhcmFjdGVyIGJpbmRpbmcgb2YgZm9ybWF0ICInYSciCiAgICAgICAgcmV0dXJuIGtleS5jaGFyQXQoMSk7CiAgICAgIH0KICAgICAgdmFyIHBpZWNlcyA9IGtleS5zcGxpdCgvLSg/ISQpLyk7CiAgICAgIHZhciBsYXN0UGllY2UgPSBwaWVjZXNbcGllY2VzLmxlbmd0aCAtIDFdOwogICAgICBpZiAocGllY2VzLmxlbmd0aCA9PSAxICYmIHBpZWNlc1swXS5sZW5ndGggPT0gMSkgewogICAgICAgIC8vIE5vLW1vZGlmaWVyIGJpbmRpbmdzIHVzZSBsaXRlcmFsIGNoYXJhY3RlciBiaW5kaW5ncyBhYm92ZS4gU2tpcC4KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0gZWxzZSBpZiAocGllY2VzLmxlbmd0aCA9PSAyICYmIHBpZWNlc1swXSA9PSAnU2hpZnQnICYmIGxhc3RQaWVjZS5sZW5ndGggPT0gMSkgewogICAgICAgIC8vIElnbm9yZSBTaGlmdCtjaGFyIGJpbmRpbmdzIGFzIHRoZXkgc2hvdWxkIGJlIGhhbmRsZWQgYnkgbGl0ZXJhbCBjaGFyYWN0ZXIuCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIHZhciBoYXNDaGFyYWN0ZXIgPSBmYWxzZTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwaWVjZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICB2YXIgcGllY2UgPSBwaWVjZXNbaV07CiAgICAgICAgaWYgKHBpZWNlIGluIG1vZGlmaWVycykgeyBwaWVjZXNbaV0gPSBtb2RpZmllcnNbcGllY2VdOyB9CiAgICAgICAgZWxzZSB7IGhhc0NoYXJhY3RlciA9IHRydWU7IH0KICAgICAgICBpZiAocGllY2UgaW4gc3BlY2lhbEtleXMpIHsgcGllY2VzW2ldID0gc3BlY2lhbEtleXNbcGllY2VdOyB9CiAgICAgIH0KICAgICAgaWYgKCFoYXNDaGFyYWN0ZXIpIHsKICAgICAgICAvLyBWaW0gZG9lcyBub3Qgc3VwcG9ydCBtb2RpZmllciBvbmx5IGtleXMuCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIC8vIFRPRE86IEN1cnJlbnQgYmluZGluZ3MgZXhwZWN0IHRoZSBjaGFyYWN0ZXIgdG8gYmUgbG93ZXIgY2FzZSwgYnV0CiAgICAgIC8vIGl0IGxvb2tzIGxpa2UgdmltIGtleSBub3RhdGlvbiB1c2VzIHVwcGVyIGNhc2UuCiAgICAgIGlmIChpc1VwcGVyQ2FzZShsYXN0UGllY2UpKSB7CiAgICAgICAgcGllY2VzW3BpZWNlcy5sZW5ndGggLSAxXSA9IGxhc3RQaWVjZS50b0xvd2VyQ2FzZSgpOwogICAgICB9CiAgICAgIHJldHVybiAnPCcgKyBwaWVjZXMuam9pbignLScpICsgJz4nOwogICAgfQoKICAgIGZ1bmN0aW9uIGdldE9uUGFzdGVGbihjbSkgewogICAgICB2YXIgdmltID0gY20uc3RhdGUudmltOwogICAgICBpZiAoIXZpbS5vblBhc3RlRm4pIHsKICAgICAgICB2aW0ub25QYXN0ZUZuID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICBpZiAoIXZpbS5pbnNlcnRNb2RlKSB7CiAgICAgICAgICAgIGNtLnNldEN1cnNvcihvZmZzZXRDdXJzb3IoY20uZ2V0Q3Vyc29yKCksIDAsIDEpKTsKICAgICAgICAgICAgYWN0aW9ucy5lbnRlckluc2VydE1vZGUoY20sIHt9LCB2aW0pOwogICAgICAgICAgfQogICAgICAgIH07CiAgICAgIH0KICAgICAgcmV0dXJuIHZpbS5vblBhc3RlRm47CiAgICB9CgogICAgdmFyIG51bWJlclJlZ2V4ID0gL1tcZF0vOwogICAgdmFyIHdvcmRDaGFyVGVzdCA9IFtDb2RlTWlycm9yLmlzV29yZENoYXIsIGZ1bmN0aW9uKGNoKSB7CiAgICAgIHJldHVybiBjaCAmJiAhQ29kZU1pcnJvci5pc1dvcmRDaGFyKGNoKSAmJiAhL1xzLy50ZXN0KGNoKTsKICAgIH1dLCBiaWdXb3JkQ2hhclRlc3QgPSBbZnVuY3Rpb24oY2gpIHsKICAgICAgcmV0dXJuIC9cUy8udGVzdChjaCk7CiAgICB9XTsKICAgIGZ1bmN0aW9uIG1ha2VLZXlSYW5nZShzdGFydCwgc2l6ZSkgewogICAgICB2YXIga2V5cyA9IFtdOwogICAgICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBzdGFydCArIHNpemU7IGkrKykgewogICAgICAgIGtleXMucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlKGkpKTsKICAgICAgfQogICAgICByZXR1cm4ga2V5czsKICAgIH0KICAgIHZhciB1cHBlckNhc2VBbHBoYWJldCA9IG1ha2VLZXlSYW5nZSg2NSwgMjYpOwogICAgdmFyIGxvd2VyQ2FzZUFscGhhYmV0ID0gbWFrZUtleVJhbmdlKDk3LCAyNik7CiAgICB2YXIgbnVtYmVycyA9IG1ha2VLZXlSYW5nZSg0OCwgMTApOwogICAgdmFyIHZhbGlkTWFya3MgPSBbXS5jb25jYXQodXBwZXJDYXNlQWxwaGFiZXQsIGxvd2VyQ2FzZUFscGhhYmV0LCBudW1iZXJzLCBbJzwnLCAnPiddKTsKICAgIHZhciB2YWxpZFJlZ2lzdGVycyA9IFtdLmNvbmNhdCh1cHBlckNhc2VBbHBoYWJldCwgbG93ZXJDYXNlQWxwaGFiZXQsIG51bWJlcnMsIFsnLScsICciJywgJy4nLCAnOicsICcvJ10pOwoKICAgIGZ1bmN0aW9uIGlzTGluZShjbSwgbGluZSkgewogICAgICByZXR1cm4gbGluZSA+PSBjbS5maXJzdExpbmUoKSAmJiBsaW5lIDw9IGNtLmxhc3RMaW5lKCk7CiAgICB9CiAgICBmdW5jdGlvbiBpc0xvd2VyQ2FzZShrKSB7CiAgICAgIHJldHVybiAoL15bYS16XSQvKS50ZXN0KGspOwogICAgfQogICAgZnVuY3Rpb24gaXNNYXRjaGFibGVTeW1ib2woaykgewogICAgICByZXR1cm4gJygpW117fScuaW5kZXhPZihrKSAhPSAtMTsKICAgIH0KICAgIGZ1bmN0aW9uIGlzTnVtYmVyKGspIHsKICAgICAgcmV0dXJuIG51bWJlclJlZ2V4LnRlc3Qoayk7CiAgICB9CiAgICBmdW5jdGlvbiBpc1VwcGVyQ2FzZShrKSB7CiAgICAgIHJldHVybiAoL15bQS1aXSQvKS50ZXN0KGspOwogICAgfQogICAgZnVuY3Rpb24gaXNXaGl0ZVNwYWNlU3RyaW5nKGspIHsKICAgICAgcmV0dXJuICgvXlxzKiQvKS50ZXN0KGspOwogICAgfQogICAgZnVuY3Rpb24gaW5BcnJheSh2YWwsIGFycikgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7IGkrKykgewogICAgICAgIGlmIChhcnJbaV0gPT0gdmFsKSB7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIHZhciBvcHRpb25zID0ge307CiAgICBmdW5jdGlvbiBkZWZpbmVPcHRpb24obmFtZSwgZGVmYXVsdFZhbHVlLCB0eXBlLCBhbGlhc2VzLCBjYWxsYmFjaykgewogICAgICBpZiAoZGVmYXVsdFZhbHVlID09PSB1bmRlZmluZWQgJiYgIWNhbGxiYWNrKSB7CiAgICAgICAgdGhyb3cgRXJyb3IoJ2RlZmF1bHRWYWx1ZSBpcyByZXF1aXJlZCB1bmxlc3MgY2FsbGJhY2sgaXMgcHJvdmlkZWQnKTsKICAgICAgfQogICAgICBpZiAoIXR5cGUpIHsgdHlwZSA9ICdzdHJpbmcnOyB9CiAgICAgIG9wdGlvbnNbbmFtZV0gPSB7CiAgICAgICAgdHlwZTogdHlwZSwKICAgICAgICBkZWZhdWx0VmFsdWU6IGRlZmF1bHRWYWx1ZSwKICAgICAgICBjYWxsYmFjazogY2FsbGJhY2sKICAgICAgfTsKICAgICAgaWYgKGFsaWFzZXMpIHsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFsaWFzZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIG9wdGlvbnNbYWxpYXNlc1tpXV0gPSBvcHRpb25zW25hbWVdOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoZGVmYXVsdFZhbHVlKSB7CiAgICAgICAgc2V0T3B0aW9uKG5hbWUsIGRlZmF1bHRWYWx1ZSk7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBzZXRPcHRpb24obmFtZSwgdmFsdWUsIGNtLCBjZmcpIHsKICAgICAgdmFyIG9wdGlvbiA9IG9wdGlvbnNbbmFtZV07CiAgICAgIGNmZyA9IGNmZyB8fCB7fTsKICAgICAgdmFyIHNjb3BlID0gY2ZnLnNjb3BlOwogICAgICBpZiAoIW9wdGlvbikgewogICAgICAgIHRocm93IEVycm9yKCdVbmtub3duIG9wdGlvbjogJyArIG5hbWUpOwogICAgICB9CiAgICAgIGlmIChvcHRpb24udHlwZSA9PSAnYm9vbGVhbicpIHsKICAgICAgICBpZiAodmFsdWUgJiYgdmFsdWUgIT09IHRydWUpIHsKICAgICAgICAgIHRocm93IEVycm9yKCdJbnZhbGlkIGFyZ3VtZW50OiAnICsgbmFtZSArICc9JyArIHZhbHVlKTsKICAgICAgICB9IGVsc2UgaWYgKHZhbHVlICE9PSBmYWxzZSkgewogICAgICAgICAgLy8gQm9vbGVhbiBvcHRpb25zIGFyZSBzZXQgdG8gdHJ1ZSBpZiB2YWx1ZSBpcyBub3QgZGVmaW5lZC4KICAgICAgICAgIHZhbHVlID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKG9wdGlvbi5jYWxsYmFjaykgewogICAgICAgIGlmIChzY29wZSAhPT0gJ2xvY2FsJykgewogICAgICAgICAgb3B0aW9uLmNhbGxiYWNrKHZhbHVlLCB1bmRlZmluZWQpOwogICAgICAgIH0KICAgICAgICBpZiAoc2NvcGUgIT09ICdnbG9iYWwnICYmIGNtKSB7CiAgICAgICAgICBvcHRpb24uY2FsbGJhY2sodmFsdWUsIGNtKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKHNjb3BlICE9PSAnbG9jYWwnKSB7CiAgICAgICAgICBvcHRpb24udmFsdWUgPSBvcHRpb24udHlwZSA9PSAnYm9vbGVhbicgPyAhIXZhbHVlIDogdmFsdWU7CiAgICAgICAgfQogICAgICAgIGlmIChzY29wZSAhPT0gJ2dsb2JhbCcgJiYgY20pIHsKICAgICAgICAgIGNtLnN0YXRlLnZpbS5vcHRpb25zW25hbWVdID0ge3ZhbHVlOiB2YWx1ZX07CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gZ2V0T3B0aW9uKG5hbWUsIGNtLCBjZmcpIHsKICAgICAgdmFyIG9wdGlvbiA9IG9wdGlvbnNbbmFtZV07CiAgICAgIGNmZyA9IGNmZyB8fCB7fTsKICAgICAgdmFyIHNjb3BlID0gY2ZnLnNjb3BlOwogICAgICBpZiAoIW9wdGlvbikgewogICAgICAgIHRocm93IEVycm9yKCdVbmtub3duIG9wdGlvbjogJyArIG5hbWUpOwogICAgICB9CiAgICAgIGlmIChvcHRpb24uY2FsbGJhY2spIHsKICAgICAgICB2YXIgbG9jYWwgPSBjbSAmJiBvcHRpb24uY2FsbGJhY2sodW5kZWZpbmVkLCBjbSk7CiAgICAgICAgaWYgKHNjb3BlICE9PSAnZ2xvYmFsJyAmJiBsb2NhbCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICByZXR1cm4gbG9jYWw7CiAgICAgICAgfQogICAgICAgIGlmIChzY29wZSAhPT0gJ2xvY2FsJykgewogICAgICAgICAgcmV0dXJuIG9wdGlvbi5jYWxsYmFjaygpOwogICAgICAgIH0KICAgICAgICByZXR1cm47CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIGxvY2FsID0gKHNjb3BlICE9PSAnZ2xvYmFsJykgJiYgKGNtICYmIGNtLnN0YXRlLnZpbS5vcHRpb25zW25hbWVdKTsKICAgICAgICByZXR1cm4gKGxvY2FsIHx8IChzY29wZSAhPT0gJ2xvY2FsJykgJiYgb3B0aW9uIHx8IHt9KS52YWx1ZTsKICAgICAgfQogICAgfQoKICAgIGRlZmluZU9wdGlvbignZmlsZXR5cGUnLCB1bmRlZmluZWQsICdzdHJpbmcnLCBbJ2Z0J10sIGZ1bmN0aW9uKG5hbWUsIGNtKSB7CiAgICAgIC8vIE9wdGlvbiBpcyBsb2NhbC4gRG8gbm90aGluZyBmb3IgZ2xvYmFsLgogICAgICBpZiAoY20gPT09IHVuZGVmaW5lZCkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICAvLyBUaGUgJ2ZpbGV0eXBlJyBvcHRpb24gcHJveGllcyB0byB0aGUgQ29kZU1pcnJvciAnbW9kZScgb3B0aW9uLgogICAgICBpZiAobmFtZSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgdmFyIG1vZGUgPSBjbS5nZXRPcHRpb24oJ21vZGUnKTsKICAgICAgICByZXR1cm4gbW9kZSA9PSAnbnVsbCcgPyAnJyA6IG1vZGU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIG1vZGUgPSBuYW1lID09ICcnID8gJ251bGwnIDogbmFtZTsKICAgICAgICBjbS5zZXRPcHRpb24oJ21vZGUnLCBtb2RlKTsKICAgICAgfQogICAgfSk7CgogICAgdmFyIGNyZWF0ZUNpcmN1bGFySnVtcExpc3QgPSBmdW5jdGlvbigpIHsKICAgICAgdmFyIHNpemUgPSAxMDA7CiAgICAgIHZhciBwb2ludGVyID0gLTE7CiAgICAgIHZhciBoZWFkID0gMDsKICAgICAgdmFyIHRhaWwgPSAwOwogICAgICB2YXIgYnVmZmVyID0gbmV3IEFycmF5KHNpemUpOwogICAgICBmdW5jdGlvbiBhZGQoY20sIG9sZEN1ciwgbmV3Q3VyKSB7CiAgICAgICAgdmFyIGN1cnJlbnQgPSBwb2ludGVyICUgc2l6ZTsKICAgICAgICB2YXIgY3VyTWFyayA9IGJ1ZmZlcltjdXJyZW50XTsKICAgICAgICBmdW5jdGlvbiB1c2VOZXh0U2xvdChjdXJzb3IpIHsKICAgICAgICAgIHZhciBuZXh0ID0gKytwb2ludGVyICUgc2l6ZTsKICAgICAgICAgIHZhciB0cmFzaE1hcmsgPSBidWZmZXJbbmV4dF07CiAgICAgICAgICBpZiAodHJhc2hNYXJrKSB7CiAgICAgICAgICAgIHRyYXNoTWFyay5jbGVhcigpOwogICAgICAgICAgfQogICAgICAgICAgYnVmZmVyW25leHRdID0gY20uc2V0Qm9va21hcmsoY3Vyc29yKTsKICAgICAgICB9CiAgICAgICAgaWYgKGN1ck1hcmspIHsKICAgICAgICAgIHZhciBtYXJrUG9zID0gY3VyTWFyay5maW5kKCk7CiAgICAgICAgICAvLyBhdm9pZCByZWNvcmRpbmcgcmVkdW5kYW50IGN1cnNvciBwb3NpdGlvbgogICAgICAgICAgaWYgKG1hcmtQb3MgJiYgIWN1cnNvckVxdWFsKG1hcmtQb3MsIG9sZEN1cikpIHsKICAgICAgICAgICAgdXNlTmV4dFNsb3Qob2xkQ3VyKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgdXNlTmV4dFNsb3Qob2xkQ3VyKTsKICAgICAgICB9CiAgICAgICAgdXNlTmV4dFNsb3QobmV3Q3VyKTsKICAgICAgICBoZWFkID0gcG9pbnRlcjsKICAgICAgICB0YWlsID0gcG9pbnRlciAtIHNpemUgKyAxOwogICAgICAgIGlmICh0YWlsIDwgMCkgewogICAgICAgICAgdGFpbCA9IDA7CiAgICAgICAgfQogICAgICB9CiAgICAgIGZ1bmN0aW9uIG1vdmUoY20sIG9mZnNldCkgewogICAgICAgIHBvaW50ZXIgKz0gb2Zmc2V0OwogICAgICAgIGlmIChwb2ludGVyID4gaGVhZCkgewogICAgICAgICAgcG9pbnRlciA9IGhlYWQ7CiAgICAgICAgfSBlbHNlIGlmIChwb2ludGVyIDwgdGFpbCkgewogICAgICAgICAgcG9pbnRlciA9IHRhaWw7CiAgICAgICAgfQogICAgICAgIHZhciBtYXJrID0gYnVmZmVyWyhzaXplICsgcG9pbnRlcikgJSBzaXplXTsKICAgICAgICAvLyBza2lwIG1hcmtzIHRoYXQgYXJlIHRlbXBvcmFyaWx5IHJlbW92ZWQgZnJvbSB0ZXh0IGJ1ZmZlcgogICAgICAgIGlmIChtYXJrICYmICFtYXJrLmZpbmQoKSkgewogICAgICAgICAgdmFyIGluYyA9IG9mZnNldCA+IDAgPyAxIDogLTE7CiAgICAgICAgICB2YXIgbmV3Q3VyOwogICAgICAgICAgdmFyIG9sZEN1ciA9IGNtLmdldEN1cnNvcigpOwogICAgICAgICAgZG8gewogICAgICAgICAgICBwb2ludGVyICs9IGluYzsKICAgICAgICAgICAgbWFyayA9IGJ1ZmZlclsoc2l6ZSArIHBvaW50ZXIpICUgc2l6ZV07CiAgICAgICAgICAgIC8vIHNraXAgbWFya3MgdGhhdCBhcmUgdGhlIHNhbWUgYXMgY3VycmVudCBwb3NpdGlvbgogICAgICAgICAgICBpZiAobWFyayAmJgogICAgICAgICAgICAgICAgKG5ld0N1ciA9IG1hcmsuZmluZCgpKSAmJgogICAgICAgICAgICAgICAgIWN1cnNvckVxdWFsKG9sZEN1ciwgbmV3Q3VyKSkgewogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICB9IHdoaWxlIChwb2ludGVyIDwgaGVhZCAmJiBwb2ludGVyID4gdGFpbCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBtYXJrOwogICAgICB9CiAgICAgIHJldHVybiB7CiAgICAgICAgY2FjaGVkQ3Vyc29yOiB1bmRlZmluZWQsIC8vdXNlZCBmb3IgIyBhbmQgKiBqdW1wcwogICAgICAgIGFkZDogYWRkLAogICAgICAgIG1vdmU6IG1vdmUKICAgICAgfTsKICAgIH07CgogICAgLy8gUmV0dXJucyBhbiBvYmplY3QgdG8gdHJhY2sgdGhlIGNoYW5nZXMgYXNzb2NpYXRlZCBpbnNlcnQgbW9kZS4gIEl0CiAgICAvLyBjbG9uZXMgdGhlIG9iamVjdCB0aGF0IGlzIHBhc3NlZCBpbiwgb3IgY3JlYXRlcyBhbiBlbXB0eSBvYmplY3Qgb25lIGlmCiAgICAvLyBub25lIGlzIHByb3ZpZGVkLgogICAgdmFyIGNyZWF0ZUluc2VydE1vZGVDaGFuZ2VzID0gZnVuY3Rpb24oYykgewogICAgICBpZiAoYykgewogICAgICAgIC8vIENvcHkgY29uc3RydWN0aW9uCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIGNoYW5nZXM6IGMuY2hhbmdlcywKICAgICAgICAgIGV4cGVjdEN1cnNvckFjdGl2aXR5Rm9yQ2hhbmdlOiBjLmV4cGVjdEN1cnNvckFjdGl2aXR5Rm9yQ2hhbmdlCiAgICAgICAgfTsKICAgICAgfQogICAgICByZXR1cm4gewogICAgICAgIC8vIENoYW5nZSBsaXN0CiAgICAgICAgY2hhbmdlczogW10sCiAgICAgICAgLy8gU2V0IHRvIHRydWUgb24gY2hhbmdlLCBmYWxzZSBvbiBjdXJzb3JBY3Rpdml0eS4KICAgICAgICBleHBlY3RDdXJzb3JBY3Rpdml0eUZvckNoYW5nZTogZmFsc2UKICAgICAgfTsKICAgIH07CgogICAgZnVuY3Rpb24gTWFjcm9Nb2RlU3RhdGUoKSB7CiAgICAgIHRoaXMubGF0ZXN0UmVnaXN0ZXIgPSB1bmRlZmluZWQ7CiAgICAgIHRoaXMuaXNQbGF5aW5nID0gZmFsc2U7CiAgICAgIHRoaXMuaXNSZWNvcmRpbmcgPSBmYWxzZTsKICAgICAgdGhpcy5yZXBsYXlTZWFyY2hRdWVyaWVzID0gW107CiAgICAgIHRoaXMub25SZWNvcmRpbmdEb25lID0gdW5kZWZpbmVkOwogICAgICB0aGlzLmxhc3RJbnNlcnRNb2RlQ2hhbmdlcyA9IGNyZWF0ZUluc2VydE1vZGVDaGFuZ2VzKCk7CiAgICB9CiAgICBNYWNyb01vZGVTdGF0ZS5wcm90b3R5cGUgPSB7CiAgICAgIGV4aXRNYWNyb1JlY29yZE1vZGU6IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBtYWNyb01vZGVTdGF0ZSA9IHZpbUdsb2JhbFN0YXRlLm1hY3JvTW9kZVN0YXRlOwogICAgICAgIGlmIChtYWNyb01vZGVTdGF0ZS5vblJlY29yZGluZ0RvbmUpIHsKICAgICAgICAgIG1hY3JvTW9kZVN0YXRlLm9uUmVjb3JkaW5nRG9uZSgpOyAvLyBjbG9zZSBkaWFsb2cKICAgICAgICB9CiAgICAgICAgbWFjcm9Nb2RlU3RhdGUub25SZWNvcmRpbmdEb25lID0gdW5kZWZpbmVkOwogICAgICAgIG1hY3JvTW9kZVN0YXRlLmlzUmVjb3JkaW5nID0gZmFsc2U7CiAgICAgIH0sCiAgICAgIGVudGVyTWFjcm9SZWNvcmRNb2RlOiBmdW5jdGlvbihjbSwgcmVnaXN0ZXJOYW1lKSB7CiAgICAgICAgdmFyIHJlZ2lzdGVyID0KICAgICAgICAgICAgdmltR2xvYmFsU3RhdGUucmVnaXN0ZXJDb250cm9sbGVyLmdldFJlZ2lzdGVyKHJlZ2lzdGVyTmFtZSk7CiAgICAgICAgaWYgKHJlZ2lzdGVyKSB7CiAgICAgICAgICByZWdpc3Rlci5jbGVhcigpOwogICAgICAgICAgdGhpcy5sYXRlc3RSZWdpc3RlciA9IHJlZ2lzdGVyTmFtZTsKICAgICAgICAgIGlmIChjbS5vcGVuRGlhbG9nKSB7CiAgICAgICAgICAgIHRoaXMub25SZWNvcmRpbmdEb25lID0gY20ub3BlbkRpYWxvZygKICAgICAgICAgICAgICAgICcocmVjb3JkaW5nKVsnK3JlZ2lzdGVyTmFtZSsnXScsIG51bGwsIHtib3R0b206dHJ1ZX0pOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5pc1JlY29yZGluZyA9IHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICB9OwoKICAgIGZ1bmN0aW9uIG1heWJlSW5pdFZpbVN0YXRlKGNtKSB7CiAgICAgIGlmICghY20uc3RhdGUudmltKSB7CiAgICAgICAgLy8gU3RvcmUgaW5zdGFuY2Ugc3RhdGUgaW4gdGhlIENvZGVNaXJyb3Igb2JqZWN0LgogICAgICAgIGNtLnN0YXRlLnZpbSA9IHsKICAgICAgICAgIGlucHV0U3RhdGU6IG5ldyBJbnB1dFN0YXRlKCksCiAgICAgICAgICAvLyBWaW0ncyBpbnB1dCBzdGF0ZSB0aGF0IHRyaWdnZXJlZCB0aGUgbGFzdCBlZGl0LCB1c2VkIHRvIHJlcGVhdAogICAgICAgICAgLy8gbW90aW9ucyBhbmQgb3BlcmF0b3JzIHdpdGggJy4nLgogICAgICAgICAgbGFzdEVkaXRJbnB1dFN0YXRlOiB1bmRlZmluZWQsCiAgICAgICAgICAvLyBWaW0ncyBhY3Rpb24gY29tbWFuZCBiZWZvcmUgdGhlIGxhc3QgZWRpdCwgdXNlZCB0byByZXBlYXQgYWN0aW9ucwogICAgICAgICAgLy8gd2l0aCAnLicgYW5kIGluc2VydCBtb2RlIHJlcGVhdC4KICAgICAgICAgIGxhc3RFZGl0QWN0aW9uQ29tbWFuZDogdW5kZWZpbmVkLAogICAgICAgICAgLy8gV2hlbiB1c2luZyBqayBmb3IgbmF2aWdhdGlvbiwgaWYgeW91IG1vdmUgZnJvbSBhIGxvbmdlciBsaW5lIHRvIGEKICAgICAgICAgIC8vIHNob3J0ZXIgbGluZSwgdGhlIGN1cnNvciBtYXkgY2xpcCB0byB0aGUgZW5kIG9mIHRoZSBzaG9ydGVyIGxpbmUuCiAgICAgICAgICAvLyBJZiBqIGlzIHByZXNzZWQgYWdhaW4gYW5kIGN1cnNvciBnb2VzIHRvIHRoZSBuZXh0IGxpbmUsIHRoZQogICAgICAgICAgLy8gY3Vyc29yIHNob3VsZCBnbyBiYWNrIHRvIGl0cyBob3Jpem9udGFsIHBvc2l0aW9uIG9uIHRoZSBsb25nZXIKICAgICAgICAgIC8vIGxpbmUgaWYgaXQgY2FuLiBUaGlzIGlzIHRvIGtlZXAgdHJhY2sgb2YgdGhlIGhvcml6b250YWwgcG9zaXRpb24uCiAgICAgICAgICBsYXN0SFBvczogLTEsCiAgICAgICAgICAvLyBEb2luZyB0aGUgc2FtZSB3aXRoIHNjcmVlbi1wb3NpdGlvbiBmb3IgZ2ovZ2sKICAgICAgICAgIGxhc3RIU1BvczogLTEsCiAgICAgICAgICAvLyBUaGUgbGFzdCBtb3Rpb24gY29tbWFuZCBydW4uIENsZWFyZWQgaWYgYSBub24tbW90aW9uIGNvbW1hbmQgZ2V0cwogICAgICAgICAgLy8gZXhlY3V0ZWQgaW4gYmV0d2Vlbi4KICAgICAgICAgIGxhc3RNb3Rpb246IG51bGwsCiAgICAgICAgICBtYXJrczoge30sCiAgICAgICAgICAvLyBNYXJrIGZvciByZW5kZXJpbmcgZmFrZSBjdXJzb3IgZm9yIHZpc3VhbCBtb2RlLgogICAgICAgICAgZmFrZUN1cnNvcjogbnVsbCwKICAgICAgICAgIGluc2VydE1vZGU6IGZhbHNlLAogICAgICAgICAgLy8gUmVwZWF0IGNvdW50IGZvciBjaGFuZ2VzIG1hZGUgaW4gaW5zZXJ0IG1vZGUsIHRyaWdnZXJlZCBieSBrZXkKICAgICAgICAgIC8vIHNlcXVlbmNlcyBsaWtlIDMsaS4gT25seSBleGlzdHMgd2hlbiBpbnNlcnRNb2RlIGlzIHRydWUuCiAgICAgICAgICBpbnNlcnRNb2RlUmVwZWF0OiB1bmRlZmluZWQsCiAgICAgICAgICB2aXN1YWxNb2RlOiBmYWxzZSwKICAgICAgICAgIC8vIElmIHdlIGFyZSBpbiB2aXN1YWwgbGluZSBtb2RlLiBObyBlZmZlY3QgaWYgdmlzdWFsTW9kZSBpcyBmYWxzZS4KICAgICAgICAgIHZpc3VhbExpbmU6IGZhbHNlLAogICAgICAgICAgdmlzdWFsQmxvY2s6IGZhbHNlLAogICAgICAgICAgbGFzdFNlbGVjdGlvbjogbnVsbCwKICAgICAgICAgIGxhc3RQYXN0ZWRUZXh0OiBudWxsLAogICAgICAgICAgc2VsOiB7fSwKICAgICAgICAgIC8vIEJ1ZmZlci1sb2NhbC93aW5kb3ctbG9jYWwgdmFsdWVzIG9mIHZpbSBvcHRpb25zLgogICAgICAgICAgb3B0aW9uczoge30KICAgICAgICB9OwogICAgICB9CiAgICAgIHJldHVybiBjbS5zdGF0ZS52aW07CiAgICB9CiAgICB2YXIgdmltR2xvYmFsU3RhdGU7CiAgICBmdW5jdGlvbiByZXNldFZpbUdsb2JhbFN0YXRlKCkgewogICAgICB2aW1HbG9iYWxTdGF0ZSA9IHsKICAgICAgICAvLyBUaGUgY3VycmVudCBzZWFyY2ggcXVlcnkuCiAgICAgICAgc2VhcmNoUXVlcnk6IG51bGwsCiAgICAgICAgLy8gV2hldGhlciB3ZSBhcmUgc2VhcmNoaW5nIGJhY2t3YXJkcy4KICAgICAgICBzZWFyY2hJc1JldmVyc2VkOiBmYWxzZSwKICAgICAgICAvLyBSZXBsYWNlIHBhcnQgb2YgdGhlIGxhc3Qgc3Vic3RpdHV0ZWQgcGF0dGVybgogICAgICAgIGxhc3RTdWJzdGl0dXRlUmVwbGFjZVBhcnQ6IHVuZGVmaW5lZCwKICAgICAgICBqdW1wTGlzdDogY3JlYXRlQ2lyY3VsYXJKdW1wTGlzdCgpLAogICAgICAgIG1hY3JvTW9kZVN0YXRlOiBuZXcgTWFjcm9Nb2RlU3RhdGUsCiAgICAgICAgLy8gUmVjb3JkaW5nIGxhdGVzdCBmLCB0LCBGIG9yIFQgbW90aW9uIGNvbW1hbmQuCiAgICAgICAgbGFzdENoYXJhY3RlclNlYXJjaDoge2luY3JlbWVudDowLCBmb3J3YXJkOnRydWUsIHNlbGVjdGVkQ2hhcmFjdGVyOicnfSwKICAgICAgICByZWdpc3RlckNvbnRyb2xsZXI6IG5ldyBSZWdpc3RlckNvbnRyb2xsZXIoe30pLAogICAgICAgIC8vIHNlYXJjaCBoaXN0b3J5IGJ1ZmZlcgogICAgICAgIHNlYXJjaEhpc3RvcnlDb250cm9sbGVyOiBuZXcgSGlzdG9yeUNvbnRyb2xsZXIoe30pLAogICAgICAgIC8vIGV4IENvbW1hbmQgaGlzdG9yeSBidWZmZXIKICAgICAgICBleENvbW1hbmRIaXN0b3J5Q29udHJvbGxlciA6IG5ldyBIaXN0b3J5Q29udHJvbGxlcih7fSkKICAgICAgfTsKICAgICAgZm9yICh2YXIgb3B0aW9uTmFtZSBpbiBvcHRpb25zKSB7CiAgICAgICAgdmFyIG9wdGlvbiA9IG9wdGlvbnNbb3B0aW9uTmFtZV07CiAgICAgICAgb3B0aW9uLnZhbHVlID0gb3B0aW9uLmRlZmF1bHRWYWx1ZTsKICAgICAgfQogICAgfQoKICAgIHZhciBsYXN0SW5zZXJ0TW9kZUtleVRpbWVyOwogICAgdmFyIHZpbUFwaT0gewogICAgICBidWlsZEtleU1hcDogZnVuY3Rpb24oKSB7CiAgICAgICAgLy8gVE9ETzogQ29udmVydCBrZXltYXAgaW50byBkaWN0aW9uYXJ5IGZvcm1hdCBmb3IgZmFzdCBsb29rdXAuCiAgICAgIH0sCiAgICAgIC8vIFRlc3RpbmcgaG9vaywgdGhvdWdoIGl0IG1pZ2h0IGJlIHVzZWZ1bCB0byBleHBvc2UgdGhlIHJlZ2lzdGVyCiAgICAgIC8vIGNvbnRyb2xsZXIgYW55d2F5cy4KICAgICAgZ2V0UmVnaXN0ZXJDb250cm9sbGVyOiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdmltR2xvYmFsU3RhdGUucmVnaXN0ZXJDb250cm9sbGVyOwogICAgICB9LAogICAgICAvLyBUZXN0aW5nIGhvb2suCiAgICAgIHJlc2V0VmltR2xvYmFsU3RhdGVfOiByZXNldFZpbUdsb2JhbFN0YXRlLAoKICAgICAgLy8gVGVzdGluZyBob29rLgogICAgICBnZXRWaW1HbG9iYWxTdGF0ZV86IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB2aW1HbG9iYWxTdGF0ZTsKICAgICAgfSwKCiAgICAgIC8vIFRlc3RpbmcgaG9vay4KICAgICAgbWF5YmVJbml0VmltU3RhdGVfOiBtYXliZUluaXRWaW1TdGF0ZSwKCiAgICAgIHN1cHByZXNzRXJyb3JMb2dnaW5nOiBmYWxzZSwKCiAgICAgIEluc2VydE1vZGVLZXk6IEluc2VydE1vZGVLZXksCiAgICAgIG1hcDogZnVuY3Rpb24obGhzLCByaHMsIGN0eCkgewogICAgICAgIC8vIEFkZCB1c2VyIGRlZmluZWQga2V5IGJpbmRpbmdzLgogICAgICAgIGV4Q29tbWFuZERpc3BhdGNoZXIubWFwKGxocywgcmhzLCBjdHgpOwogICAgICB9LAogICAgICB1bm1hcDogZnVuY3Rpb24obGhzLCBjdHgpIHsKICAgICAgICBleENvbW1hbmREaXNwYXRjaGVyLnVubWFwKGxocywgY3R4KTsKICAgICAgfSwKICAgICAgLy8gVE9ETzogRXhwb3NlIHNldE9wdGlvbiBhbmQgZ2V0T3B0aW9uIGFzIGluc3RhbmNlIG1ldGhvZHMuIE5lZWQgdG8gZGVjaWRlIGhvdyB0byBuYW1lc3BhY2UKICAgICAgLy8gdGhlbSwgb3Igc29tZWhvdyBtYWtlIHRoZW0gd29yayB3aXRoIHRoZSBleGlzdGluZyBDb2RlTWlycm9yIHNldE9wdGlvbi9nZXRPcHRpb24gQVBJLgogICAgICBzZXRPcHRpb246IHNldE9wdGlvbiwKICAgICAgZ2V0T3B0aW9uOiBnZXRPcHRpb24sCiAgICAgIGRlZmluZU9wdGlvbjogZGVmaW5lT3B0aW9uLAogICAgICBkZWZpbmVFeDogZnVuY3Rpb24obmFtZSwgcHJlZml4LCBmdW5jKXsKICAgICAgICBpZiAoIXByZWZpeCkgewogICAgICAgICAgcHJlZml4ID0gbmFtZTsKICAgICAgICB9IGVsc2UgaWYgKG5hbWUuaW5kZXhPZihwcmVmaXgpICE9PSAwKSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJyhWaW0uZGVmaW5lRXgpICInK3ByZWZpeCsnIiBpcyBub3QgYSBwcmVmaXggb2YgIicrbmFtZSsnIiwgY29tbWFuZCBub3QgcmVnaXN0ZXJlZCcpOwogICAgICAgIH0KICAgICAgICBleENvbW1hbmRzW25hbWVdPWZ1bmM7CiAgICAgICAgZXhDb21tYW5kRGlzcGF0Y2hlci5jb21tYW5kTWFwX1twcmVmaXhdPXtuYW1lOm5hbWUsIHNob3J0TmFtZTpwcmVmaXgsIHR5cGU6J2FwaSd9OwogICAgICB9LAogICAgICBoYW5kbGVLZXk6IGZ1bmN0aW9uIChjbSwga2V5LCBvcmlnaW4pIHsKICAgICAgICB2YXIgY29tbWFuZCA9IHRoaXMuZmluZEtleShjbSwga2V5LCBvcmlnaW4pOwogICAgICAgIGlmICh0eXBlb2YgY29tbWFuZCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgcmV0dXJuIGNvbW1hbmQoKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIC8qKgogICAgICAgKiBUaGlzIGlzIHRoZSBvdXRlcm1vc3QgZnVuY3Rpb24gY2FsbGVkIGJ5IENvZGVNaXJyb3IsIGFmdGVyIGtleXMgaGF2ZQogICAgICAgKiBiZWVuIG1hcHBlZCB0byB0aGVpciBWaW0gZXF1aXZhbGVudHMuCiAgICAgICAqCiAgICAgICAqIEZpbmRzIGEgY29tbWFuZCBiYXNlZCBvbiB0aGUga2V5IChhbmQgY2FjaGVkIGtleXMgaWYgdGhlcmUgaXMgYQogICAgICAgKiBtdWx0aS1rZXkgc2VxdWVuY2UpLiBSZXR1cm5zIGB1bmRlZmluZWRgIGlmIG5vIGtleSBpcyBtYXRjaGVkLCBhIG5vb3AKICAgICAgICogZnVuY3Rpb24gaWYgYSBwYXJ0aWFsIG1hdGNoIGlzIGZvdW5kIChtdWx0aS1rZXkpLCBhbmQgYSBmdW5jdGlvbiB0bwogICAgICAgKiBleGVjdXRlIHRoZSBib3VuZCBjb21tYW5kIGlmIGEgYSBrZXkgaXMgbWF0Y2hlZC4gVGhlIGZ1bmN0aW9uIGFsd2F5cwogICAgICAgKiByZXR1cm5zIHRydWUuCiAgICAgICAqLwogICAgICBmaW5kS2V5OiBmdW5jdGlvbihjbSwga2V5LCBvcmlnaW4pIHsKICAgICAgICB2YXIgdmltID0gbWF5YmVJbml0VmltU3RhdGUoY20pOwogICAgICAgIGZ1bmN0aW9uIGhhbmRsZU1hY3JvUmVjb3JkaW5nKCkgewogICAgICAgICAgdmFyIG1hY3JvTW9kZVN0YXRlID0gdmltR2xvYmFsU3RhdGUubWFjcm9Nb2RlU3RhdGU7CiAgICAgICAgICBpZiAobWFjcm9Nb2RlU3RhdGUuaXNSZWNvcmRpbmcpIHsKICAgICAgICAgICAgaWYgKGtleSA9PSAncScpIHsKICAgICAgICAgICAgICBtYWNyb01vZGVTdGF0ZS5leGl0TWFjcm9SZWNvcmRNb2RlKCk7CiAgICAgICAgICAgICAgY2xlYXJJbnB1dFN0YXRlKGNtKTsKICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAob3JpZ2luICE9ICdtYXBwaW5nJykgewogICAgICAgICAgICAgIGxvZ0tleShtYWNyb01vZGVTdGF0ZSwga2V5KTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBoYW5kbGVFc2MoKSB7CiAgICAgICAgICBpZiAoa2V5ID09ICc8RXNjPicpIHsKICAgICAgICAgICAgLy8gQ2xlYXIgaW5wdXQgc3RhdGUgYW5kIGdldCBiYWNrIHRvIG5vcm1hbCBtb2RlLgogICAgICAgICAgICBjbGVhcklucHV0U3RhdGUoY20pOwogICAgICAgICAgICBpZiAodmltLnZpc3VhbE1vZGUpIHsKICAgICAgICAgICAgICBleGl0VmlzdWFsTW9kZShjbSk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAodmltLmluc2VydE1vZGUpIHsKICAgICAgICAgICAgICBleGl0SW5zZXJ0TW9kZShjbSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGRvS2V5VG9LZXkoa2V5cykgewogICAgICAgICAgLy8gVE9ETzogcHJldmVudCBpbmZpbml0ZSByZWN1cnNpb24uCiAgICAgICAgICB2YXIgbWF0Y2g7CiAgICAgICAgICB3aGlsZSAoa2V5cykgewogICAgICAgICAgICAvLyBQdWxsIG9mZiBvbmUgY29tbWFuZCBrZXksIHdoaWNoIGlzIGVpdGhlciBhIHNpbmdsZSBjaGFyYWN0ZXIKICAgICAgICAgICAgLy8gb3IgYSBzcGVjaWFsIHNlcXVlbmNlIHdyYXBwZWQgaW4gJzwnIGFuZCAnPicsIGUuZy4gJzxTcGFjZT4nLgogICAgICAgICAgICBtYXRjaCA9ICgvPFx3Ky0uKz8+fDxcdys+fC4vKS5leGVjKGtleXMpOwogICAgICAgICAgICBrZXkgPSBtYXRjaFswXTsKICAgICAgICAgICAga2V5cyA9IGtleXMuc3Vic3RyaW5nKG1hdGNoLmluZGV4ICsga2V5Lmxlbmd0aCk7CiAgICAgICAgICAgIENvZGVNaXJyb3IuVmltLmhhbmRsZUtleShjbSwga2V5LCAnbWFwcGluZycpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gaGFuZGxlS2V5SW5zZXJ0TW9kZSgpIHsKICAgICAgICAgIGlmIChoYW5kbGVFc2MoKSkgeyByZXR1cm4gdHJ1ZTsgfQogICAgICAgICAgdmFyIGtleXMgPSB2aW0uaW5wdXRTdGF0ZS5rZXlCdWZmZXIgPSB2aW0uaW5wdXRTdGF0ZS5rZXlCdWZmZXIgKyBrZXk7CiAgICAgICAgICB2YXIga2V5c0FyZUNoYXJzID0ga2V5Lmxlbmd0aCA9PSAxOwogICAgICAgICAgdmFyIG1hdGNoID0gY29tbWFuZERpc3BhdGNoZXIubWF0Y2hDb21tYW5kKGtleXMsIGRlZmF1bHRLZXltYXAsIHZpbS5pbnB1dFN0YXRlLCAnaW5zZXJ0Jyk7CiAgICAgICAgICAvLyBOZWVkIHRvIGNoZWNrIGFsbCBrZXkgc3Vic3RyaW5ncyBpbiBpbnNlcnQgbW9kZS4KICAgICAgICAgIHdoaWxlIChrZXlzLmxlbmd0aCA+IDEgJiYgbWF0Y2gudHlwZSAhPSAnZnVsbCcpIHsKICAgICAgICAgICAgdmFyIGtleXMgPSB2aW0uaW5wdXRTdGF0ZS5rZXlCdWZmZXIgPSBrZXlzLnNsaWNlKDEpOwogICAgICAgICAgICB2YXIgdGhpc01hdGNoID0gY29tbWFuZERpc3BhdGNoZXIubWF0Y2hDb21tYW5kKGtleXMsIGRlZmF1bHRLZXltYXAsIHZpbS5pbnB1dFN0YXRlLCAnaW5zZXJ0Jyk7CiAgICAgICAgICAgIGlmICh0aGlzTWF0Y2gudHlwZSAhPSAnbm9uZScpIHsgbWF0Y2ggPSB0aGlzTWF0Y2g7IH0KICAgICAgICAgIH0KICAgICAgICAgIGlmIChtYXRjaC50eXBlID09ICdub25lJykgeyBjbGVhcklucHV0U3RhdGUoY20pOyByZXR1cm4gZmFsc2U7IH0KICAgICAgICAgIGVsc2UgaWYgKG1hdGNoLnR5cGUgPT0gJ3BhcnRpYWwnKSB7CiAgICAgICAgICAgIGlmIChsYXN0SW5zZXJ0TW9kZUtleVRpbWVyKSB7IHdpbmRvdy5jbGVhclRpbWVvdXQobGFzdEluc2VydE1vZGVLZXlUaW1lcik7IH0KICAgICAgICAgICAgbGFzdEluc2VydE1vZGVLZXlUaW1lciA9IHdpbmRvdy5zZXRUaW1lb3V0KAogICAgICAgICAgICAgIGZ1bmN0aW9uKCkgeyBpZiAodmltLmluc2VydE1vZGUgJiYgdmltLmlucHV0U3RhdGUua2V5QnVmZmVyKSB7IGNsZWFySW5wdXRTdGF0ZShjbSk7IH0gfSwKICAgICAgICAgICAgICBnZXRPcHRpb24oJ2luc2VydE1vZGVFc2NLZXlzVGltZW91dCcpKTsKICAgICAgICAgICAgcmV0dXJuICFrZXlzQXJlQ2hhcnM7CiAgICAgICAgICB9CgogICAgICAgICAgaWYgKGxhc3RJbnNlcnRNb2RlS2V5VGltZXIpIHsgd2luZG93LmNsZWFyVGltZW91dChsYXN0SW5zZXJ0TW9kZUtleVRpbWVyKTsgfQogICAgICAgICAgaWYgKGtleXNBcmVDaGFycykgewogICAgICAgICAgICB2YXIgc2VsZWN0aW9ucyA9IGNtLmxpc3RTZWxlY3Rpb25zKCk7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2VsZWN0aW9ucy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgIHZhciBoZXJlID0gc2VsZWN0aW9uc1tpXS5oZWFkOwogICAgICAgICAgICAgIGNtLnJlcGxhY2VSYW5nZSgnJywgb2Zmc2V0Q3Vyc29yKGhlcmUsIDAsIC0oa2V5cy5sZW5ndGggLSAxKSksIGhlcmUsICcraW5wdXQnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2aW1HbG9iYWxTdGF0ZS5tYWNyb01vZGVTdGF0ZS5sYXN0SW5zZXJ0TW9kZUNoYW5nZXMuY2hhbmdlcy5wb3AoKTsKICAgICAgICAgIH0KICAgICAgICAgIGNsZWFySW5wdXRTdGF0ZShjbSk7CiAgICAgICAgICByZXR1cm4gbWF0Y2guY29tbWFuZDsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGhhbmRsZUtleU5vbkluc2VydE1vZGUoKSB7CiAgICAgICAgICBpZiAoaGFuZGxlTWFjcm9SZWNvcmRpbmcoKSB8fCBoYW5kbGVFc2MoKSkgeyByZXR1cm4gdHJ1ZTsgfTsKCiAgICAgICAgICB2YXIga2V5cyA9IHZpbS5pbnB1dFN0YXRlLmtleUJ1ZmZlciA9IHZpbS5pbnB1dFN0YXRlLmtleUJ1ZmZlciArIGtleTsKICAgICAgICAgIGlmICgvXlsxLTldXGQqJC8udGVzdChrZXlzKSkgeyByZXR1cm4gdHJ1ZTsgfQoKICAgICAgICAgIHZhciBrZXlzTWF0Y2hlciA9IC9eKFxkKikoLiopJC8uZXhlYyhrZXlzKTsKICAgICAgICAgIGlmICgha2V5c01hdGNoZXIpIHsgY2xlYXJJbnB1dFN0YXRlKGNtKTsgcmV0dXJuIGZhbHNlOyB9CiAgICAgICAgICB2YXIgY29udGV4dCA9IHZpbS52aXN1YWxNb2RlID8gJ3Zpc3VhbCcgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdub3JtYWwnOwogICAgICAgICAgdmFyIG1hdGNoID0gY29tbWFuZERpc3BhdGNoZXIubWF0Y2hDb21tYW5kKGtleXNNYXRjaGVyWzJdIHx8IGtleXNNYXRjaGVyWzFdLCBkZWZhdWx0S2V5bWFwLCB2aW0uaW5wdXRTdGF0ZSwgY29udGV4dCk7CiAgICAgICAgICBpZiAobWF0Y2gudHlwZSA9PSAnbm9uZScpIHsgY2xlYXJJbnB1dFN0YXRlKGNtKTsgcmV0dXJuIGZhbHNlOyB9CiAgICAgICAgICBlbHNlIGlmIChtYXRjaC50eXBlID09ICdwYXJ0aWFsJykgeyByZXR1cm4gdHJ1ZTsgfQoKICAgICAgICAgIHZpbS5pbnB1dFN0YXRlLmtleUJ1ZmZlciA9ICcnOwogICAgICAgICAgdmFyIGtleXNNYXRjaGVyID0gL14oXGQqKSguKikkLy5leGVjKGtleXMpOwogICAgICAgICAgaWYgKGtleXNNYXRjaGVyWzFdICYmIGtleXNNYXRjaGVyWzFdICE9ICcwJykgewogICAgICAgICAgICB2aW0uaW5wdXRTdGF0ZS5wdXNoUmVwZWF0RGlnaXQoa2V5c01hdGNoZXJbMV0pOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIG1hdGNoLmNvbW1hbmQ7CiAgICAgICAgfQoKICAgICAgICB2YXIgY29tbWFuZDsKICAgICAgICBpZiAodmltLmluc2VydE1vZGUpIHsgY29tbWFuZCA9IGhhbmRsZUtleUluc2VydE1vZGUoKTsgfQogICAgICAgIGVsc2UgeyBjb21tYW5kID0gaGFuZGxlS2V5Tm9uSW5zZXJ0TW9kZSgpOyB9CiAgICAgICAgaWYgKGNvbW1hbmQgPT09IGZhbHNlKSB7CiAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgICAgIH0gZWxzZSBpZiAoY29tbWFuZCA9PT0gdHJ1ZSkgewogICAgICAgICAgLy8gVE9ETzogTG9vayBpbnRvIHVzaW5nIENvZGVNaXJyb3IncyBtdWx0aS1rZXkgaGFuZGxpbmcuCiAgICAgICAgICAvLyBSZXR1cm4gbm8tb3Agc2luY2Ugd2UgYXJlIGNhY2hpbmcgdGhlIGtleS4gQ291bnRzIGFzIGhhbmRsZWQsIGJ1dAogICAgICAgICAgLy8gZG9uJ3Qgd2FudCBhY3Qgb24gaXQganVzdCB5ZXQuCiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7IHJldHVybiB0cnVlOyB9OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBjbS5vcGVyYXRpb24oZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgY20uY3VyT3AuaXNWaW1PcCA9IHRydWU7CiAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGlmIChjb21tYW5kLnR5cGUgPT0gJ2tleVRvS2V5JykgewogICAgICAgICAgICAgICAgICBkb0tleVRvS2V5KGNvbW1hbmQudG9LZXlzKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGNvbW1hbmREaXNwYXRjaGVyLnByb2Nlc3NDb21tYW5kKGNtLCB2aW0sIGNvbW1hbmQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgIC8vIGNsZWFyIFZJTSBzdGF0ZSBpbiBjYXNlIGl0J3MgaW4gYSBiYWQgc3RhdGUuCiAgICAgICAgICAgICAgICBjbS5zdGF0ZS52aW0gPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICBtYXliZUluaXRWaW1TdGF0ZShjbSk7CiAgICAgICAgICAgICAgICBpZiAoIUNvZGVNaXJyb3IuVmltLnN1cHByZXNzRXJyb3JMb2dnaW5nKSB7CiAgICAgICAgICAgICAgICAgIGNvbnNvbGVbJ2xvZyddKGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhyb3cgZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGhhbmRsZUV4OiBmdW5jdGlvbihjbSwgaW5wdXQpIHsKICAgICAgICBleENvbW1hbmREaXNwYXRjaGVyLnByb2Nlc3NDb21tYW5kKGNtLCBpbnB1dCk7CiAgICAgIH0sCgogICAgICBkZWZpbmVNb3Rpb246IGRlZmluZU1vdGlvbiwKICAgICAgZGVmaW5lQWN0aW9uOiBkZWZpbmVBY3Rpb24sCiAgICAgIGRlZmluZU9wZXJhdG9yOiBkZWZpbmVPcGVyYXRvciwKICAgICAgbWFwQ29tbWFuZDogbWFwQ29tbWFuZCwKICAgICAgX21hcENvbW1hbmQ6IF9tYXBDb21tYW5kLAoKICAgICAgZGVmaW5lUmVnaXN0ZXI6IGRlZmluZVJlZ2lzdGVyLAoKICAgICAgZXhpdFZpc3VhbE1vZGU6IGV4aXRWaXN1YWxNb2RlLAogICAgICBleGl0SW5zZXJ0TW9kZTogZXhpdEluc2VydE1vZGUKICAgIH07CgogICAgLy8gUmVwcmVzZW50cyB0aGUgY3VycmVudCBpbnB1dCBzdGF0ZS4KICAgIGZ1bmN0aW9uIElucHV0U3RhdGUoKSB7CiAgICAgIHRoaXMucHJlZml4UmVwZWF0ID0gW107CiAgICAgIHRoaXMubW90aW9uUmVwZWF0ID0gW107CgogICAgICB0aGlzLm9wZXJhdG9yID0gbnVsbDsKICAgICAgdGhpcy5vcGVyYXRvckFyZ3MgPSBudWxsOwogICAgICB0aGlzLm1vdGlvbiA9IG51bGw7CiAgICAgIHRoaXMubW90aW9uQXJncyA9IG51bGw7CiAgICAgIHRoaXMua2V5QnVmZmVyID0gW107IC8vIEZvciBtYXRjaGluZyBtdWx0aS1rZXkgY29tbWFuZHMuCiAgICAgIHRoaXMucmVnaXN0ZXJOYW1lID0gbnVsbDsgLy8gRGVmYXVsdHMgdG8gdGhlIHVubmFtZWQgcmVnaXN0ZXIuCiAgICB9CiAgICBJbnB1dFN0YXRlLnByb3RvdHlwZS5wdXNoUmVwZWF0RGlnaXQgPSBmdW5jdGlvbihuKSB7CiAgICAgIGlmICghdGhpcy5vcGVyYXRvcikgewogICAgICAgIHRoaXMucHJlZml4UmVwZWF0ID0gdGhpcy5wcmVmaXhSZXBlYXQuY29uY2F0KG4pOwogICAgICB9IGVsc2UgewogICAgICAgIHRoaXMubW90aW9uUmVwZWF0ID0gdGhpcy5tb3Rpb25SZXBlYXQuY29uY2F0KG4pOwogICAgICB9CiAgICB9OwogICAgSW5wdXRTdGF0ZS5wcm90b3R5cGUuZ2V0UmVwZWF0ID0gZnVuY3Rpb24oKSB7CiAgICAgIHZhciByZXBlYXQgPSAwOwogICAgICBpZiAodGhpcy5wcmVmaXhSZXBlYXQubGVuZ3RoID4gMCB8fCB0aGlzLm1vdGlvblJlcGVhdC5sZW5ndGggPiAwKSB7CiAgICAgICAgcmVwZWF0ID0gMTsKICAgICAgICBpZiAodGhpcy5wcmVmaXhSZXBlYXQubGVuZ3RoID4gMCkgewogICAgICAgICAgcmVwZWF0ICo9IHBhcnNlSW50KHRoaXMucHJlZml4UmVwZWF0LmpvaW4oJycpLCAxMCk7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLm1vdGlvblJlcGVhdC5sZW5ndGggPiAwKSB7CiAgICAgICAgICByZXBlYXQgKj0gcGFyc2VJbnQodGhpcy5tb3Rpb25SZXBlYXQuam9pbignJyksIDEwKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHJlcGVhdDsKICAgIH07CgogICAgZnVuY3Rpb24gY2xlYXJJbnB1dFN0YXRlKGNtLCByZWFzb24pIHsKICAgICAgY20uc3RhdGUudmltLmlucHV0U3RhdGUgPSBuZXcgSW5wdXRTdGF0ZSgpOwogICAgICBDb2RlTWlycm9yLnNpZ25hbChjbSwgJ3ZpbS1jb21tYW5kLWRvbmUnLCByZWFzb24pOwogICAgfQoKICAgIC8qCiAgICAgKiBSZWdpc3RlciBzdG9yZXMgaW5mb3JtYXRpb24gYWJvdXQgY29weSBhbmQgcGFzdGUgcmVnaXN0ZXJzLiAgQmVzaWRlcwogICAgICogdGV4dCwgYSByZWdpc3RlciBtdXN0IHN0b3JlIHdoZXRoZXIgaXQgaXMgbGluZXdpc2UgKGkuZS4sIHdoZW4gaXQgaXMKICAgICAqIHBhc3RlZCwgc2hvdWxkIGl0IGluc2VydCBpdHNlbGYgaW50byBhIG5ldyBsaW5lLCBvciBzaG91bGQgdGhlIHRleHQgYmUKICAgICAqIGluc2VydGVkIGF0IHRoZSBjdXJzb3IgcG9zaXRpb24uKQogICAgICovCiAgICBmdW5jdGlvbiBSZWdpc3Rlcih0ZXh0LCBsaW5ld2lzZSwgYmxvY2t3aXNlKSB7CiAgICAgIHRoaXMuY2xlYXIoKTsKICAgICAgdGhpcy5rZXlCdWZmZXIgPSBbdGV4dCB8fCAnJ107CiAgICAgIHRoaXMuaW5zZXJ0TW9kZUNoYW5nZXMgPSBbXTsKICAgICAgdGhpcy5zZWFyY2hRdWVyaWVzID0gW107CiAgICAgIHRoaXMubGluZXdpc2UgPSAhIWxpbmV3aXNlOwogICAgICB0aGlzLmJsb2Nrd2lzZSA9ICEhYmxvY2t3aXNlOwogICAgfQogICAgUmVnaXN0ZXIucHJvdG90eXBlID0gewogICAgICBzZXRUZXh0OiBmdW5jdGlvbih0ZXh0LCBsaW5ld2lzZSwgYmxvY2t3aXNlKSB7CiAgICAgICAgdGhpcy5rZXlCdWZmZXIgPSBbdGV4dCB8fCAnJ107CiAgICAgICAgdGhpcy5saW5ld2lzZSA9ICEhbGluZXdpc2U7CiAgICAgICAgdGhpcy5ibG9ja3dpc2UgPSAhIWJsb2Nrd2lzZTsKICAgICAgfSwKICAgICAgcHVzaFRleHQ6IGZ1bmN0aW9uKHRleHQsIGxpbmV3aXNlKSB7CiAgICAgICAgLy8gaWYgdGhpcyByZWdpc3RlciBoYXMgZXZlciBiZWVuIHNldCB0byBsaW5ld2lzZSwgdXNlIGxpbmV3aXNlLgogICAgICAgIGlmIChsaW5ld2lzZSkgewogICAgICAgICAgaWYgKCF0aGlzLmxpbmV3aXNlKSB7CiAgICAgICAgICAgIHRoaXMua2V5QnVmZmVyLnB1c2goJ1xuJyk7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLmxpbmV3aXNlID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgdGhpcy5rZXlCdWZmZXIucHVzaCh0ZXh0KTsKICAgICAgfSwKICAgICAgcHVzaEluc2VydE1vZGVDaGFuZ2VzOiBmdW5jdGlvbihjaGFuZ2VzKSB7CiAgICAgICAgdGhpcy5pbnNlcnRNb2RlQ2hhbmdlcy5wdXNoKGNyZWF0ZUluc2VydE1vZGVDaGFuZ2VzKGNoYW5nZXMpKTsKICAgICAgfSwKICAgICAgcHVzaFNlYXJjaFF1ZXJ5OiBmdW5jdGlvbihxdWVyeSkgewogICAgICAgIHRoaXMuc2VhcmNoUXVlcmllcy5wdXNoKHF1ZXJ5KTsKICAgICAgfSwKICAgICAgY2xlYXI6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMua2V5QnVmZmVyID0gW107CiAgICAgICAgdGhpcy5pbnNlcnRNb2RlQ2hhbmdlcyA9IFtdOwogICAgICAgIHRoaXMuc2VhcmNoUXVlcmllcyA9IFtdOwogICAgICAgIHRoaXMubGluZXdpc2UgPSBmYWxzZTsKICAgICAgfSwKICAgICAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLmtleUJ1ZmZlci5qb2luKCcnKTsKICAgICAgfQogICAgfTsKCiAgICAvKioKICAgICAqIERlZmluZXMgYW4gZXh0ZXJuYWwgcmVnaXN0ZXIuCiAgICAgKgogICAgICogVGhlIG5hbWUgc2hvdWxkIGJlIGEgc2luZ2xlIGNoYXJhY3RlciB0aGF0IHdpbGwgYmUgdXNlZCB0byByZWZlcmVuY2UgdGhlIHJlZ2lzdGVyLgogICAgICogVGhlIHJlZ2lzdGVyIHNob3VsZCBzdXBwb3J0IHNldFRleHQsIHB1c2hUZXh0LCBjbGVhciwgYW5kIHRvU3RyaW5nKCkuIFNlZSBSZWdpc3RlcgogICAgICogZm9yIGEgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uLgogICAgICovCiAgICBmdW5jdGlvbiBkZWZpbmVSZWdpc3RlcihuYW1lLCByZWdpc3RlcikgewogICAgICB2YXIgcmVnaXN0ZXJzID0gdmltR2xvYmFsU3RhdGUucmVnaXN0ZXJDb250cm9sbGVyLnJlZ2lzdGVyc1tuYW1lXTsKICAgICAgaWYgKCFuYW1lIHx8IG5hbWUubGVuZ3RoICE9IDEpIHsKICAgICAgICB0aHJvdyBFcnJvcignUmVnaXN0ZXIgbmFtZSBtdXN0IGJlIDEgY2hhcmFjdGVyJyk7CiAgICAgIH0KICAgICAgaWYgKHJlZ2lzdGVyc1tuYW1lXSkgewogICAgICAgIHRocm93IEVycm9yKCdSZWdpc3RlciBhbHJlYWR5IGRlZmluZWQgJyArIG5hbWUpOwogICAgICB9CiAgICAgIHJlZ2lzdGVyc1tuYW1lXSA9IHJlZ2lzdGVyOwogICAgICB2YWxpZFJlZ2lzdGVycy5wdXNoKG5hbWUpOwogICAgfQoKICAgIC8qCiAgICAgKiB2aW0gcmVnaXN0ZXJzIGFsbG93IHlvdSB0byBrZWVwIG1hbnkgaW5kZXBlbmRlbnQgY29weSBhbmQgcGFzdGUgYnVmZmVycy4KICAgICAqIFNlZSBodHRwOi8vdXNldmltLmNvbS8yMDEyLzA0LzEzL3JlZ2lzdGVycy8gZm9yIGFuIGludHJvZHVjdGlvbi4KICAgICAqCiAgICAgKiBSZWdpc3RlckNvbnRyb2xsZXIga2VlcHMgdGhlIHN0YXRlIG9mIGFsbCB0aGUgcmVnaXN0ZXJzLiAgQW4gaW5pdGlhbAogICAgICogc3RhdGUgbWF5IGJlIHBhc3NlZCBpbi4gIFRoZSB1bm5hbWVkIHJlZ2lzdGVyICciJyB3aWxsIGFsd2F5cyBiZQogICAgICogb3ZlcnJpZGRlbi4KICAgICAqLwogICAgZnVuY3Rpb24gUmVnaXN0ZXJDb250cm9sbGVyKHJlZ2lzdGVycykgewogICAgICB0aGlzLnJlZ2lzdGVycyA9IHJlZ2lzdGVyczsKICAgICAgdGhpcy51bm5hbWVkUmVnaXN0ZXIgPSByZWdpc3RlcnNbJyInXSA9IG5ldyBSZWdpc3RlcigpOwogICAgICByZWdpc3RlcnNbJy4nXSA9IG5ldyBSZWdpc3RlcigpOwogICAgICByZWdpc3RlcnNbJzonXSA9IG5ldyBSZWdpc3RlcigpOwogICAgICByZWdpc3RlcnNbJy8nXSA9IG5ldyBSZWdpc3RlcigpOwogICAgfQogICAgUmVnaXN0ZXJDb250cm9sbGVyLnByb3RvdHlwZSA9IHsKICAgICAgcHVzaFRleHQ6IGZ1bmN0aW9uKHJlZ2lzdGVyTmFtZSwgb3BlcmF0b3IsIHRleHQsIGxpbmV3aXNlLCBibG9ja3dpc2UpIHsKICAgICAgICBpZiAobGluZXdpc2UgJiYgdGV4dC5jaGFyQXQoMCkgPT0gJ1xuJykgewogICAgICAgICAgdGV4dCA9IHRleHQuc2xpY2UoMSkgKyAnXG4nOwogICAgICAgIH0KICAgICAgICBpZiAobGluZXdpc2UgJiYgdGV4dC5jaGFyQXQodGV4dC5sZW5ndGggLSAxKSAhPT0gJ1xuJyl7CiAgICAgICAgICB0ZXh0ICs9ICdcbic7CiAgICAgICAgfQogICAgICAgIC8vIExvd2VyY2FzZSBhbmQgdXBwZXJjYXNlIHJlZ2lzdGVycyByZWZlciB0byB0aGUgc2FtZSByZWdpc3Rlci4KICAgICAgICAvLyBVcHBlcmNhc2UganVzdCBtZWFucyBhcHBlbmQuCiAgICAgICAgdmFyIHJlZ2lzdGVyID0gdGhpcy5pc1ZhbGlkUmVnaXN0ZXIocmVnaXN0ZXJOYW1lKSA/CiAgICAgICAgICAgIHRoaXMuZ2V0UmVnaXN0ZXIocmVnaXN0ZXJOYW1lKSA6IG51bGw7CiAgICAgICAgLy8gaWYgbm8gcmVnaXN0ZXIvYW4gaW52YWxpZCByZWdpc3RlciB3YXMgc3BlY2lmaWVkLCB0aGluZ3MgZ28gdG8gdGhlCiAgICAgICAgLy8gZGVmYXVsdCByZWdpc3RlcnMKICAgICAgICBpZiAoIXJlZ2lzdGVyKSB7CiAgICAgICAgICBzd2l0Y2ggKG9wZXJhdG9yKSB7CiAgICAgICAgICAgIGNhc2UgJ3lhbmsnOgogICAgICAgICAgICAgIC8vIFRoZSAwIHJlZ2lzdGVyIGNvbnRhaW5zIHRoZSB0ZXh0IGZyb20gdGhlIG1vc3QgcmVjZW50IHlhbmsuCiAgICAgICAgICAgICAgdGhpcy5yZWdpc3RlcnNbJzAnXSA9IG5ldyBSZWdpc3Rlcih0ZXh0LCBsaW5ld2lzZSwgYmxvY2t3aXNlKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnZGVsZXRlJzoKICAgICAgICAgICAgY2FzZSAnY2hhbmdlJzoKICAgICAgICAgICAgICBpZiAodGV4dC5pbmRleE9mKCdcbicpID09IC0xKSB7CiAgICAgICAgICAgICAgICAvLyBEZWxldGUgbGVzcyB0aGFuIDEgbGluZS4gVXBkYXRlIHRoZSBzbWFsbCBkZWxldGUgcmVnaXN0ZXIuCiAgICAgICAgICAgICAgICB0aGlzLnJlZ2lzdGVyc1snLSddID0gbmV3IFJlZ2lzdGVyKHRleHQsIGxpbmV3aXNlKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgLy8gU2hpZnQgZG93biB0aGUgY29udGVudHMgb2YgdGhlIG51bWJlcmVkIHJlZ2lzdGVycyBhbmQgcHV0IHRoZQogICAgICAgICAgICAgICAgLy8gZGVsZXRlZCB0ZXh0IGludG8gcmVnaXN0ZXIgMS4KICAgICAgICAgICAgICAgIHRoaXMuc2hpZnROdW1lcmljUmVnaXN0ZXJzXygpOwogICAgICAgICAgICAgICAgdGhpcy5yZWdpc3RlcnNbJzEnXSA9IG5ldyBSZWdpc3Rlcih0ZXh0LCBsaW5ld2lzZSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSB1bm5hbWVkIHJlZ2lzdGVyIGlzIHNldCB0byB3aGF0IGp1c3QgaGFwcGVuZWQKICAgICAgICAgIHRoaXMudW5uYW1lZFJlZ2lzdGVyLnNldFRleHQodGV4dCwgbGluZXdpc2UsIGJsb2Nrd2lzZSk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAvLyBJZiB3ZSd2ZSBnb3R0ZW4gdG8gdGhpcyBwb2ludCwgd2UndmUgYWN0dWFsbHkgc3BlY2lmaWVkIGEgcmVnaXN0ZXIKICAgICAgICB2YXIgYXBwZW5kID0gaXNVcHBlckNhc2UocmVnaXN0ZXJOYW1lKTsKICAgICAgICBpZiAoYXBwZW5kKSB7CiAgICAgICAgICByZWdpc3Rlci5wdXNoVGV4dCh0ZXh0LCBsaW5ld2lzZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJlZ2lzdGVyLnNldFRleHQodGV4dCwgbGluZXdpc2UsIGJsb2Nrd2lzZSk7CiAgICAgICAgfQogICAgICAgIC8vIFRoZSB1bm5hbWVkIHJlZ2lzdGVyIGFsd2F5cyBoYXMgdGhlIHNhbWUgdmFsdWUgYXMgdGhlIGxhc3QgdXNlZAogICAgICAgIC8vIHJlZ2lzdGVyLgogICAgICAgIHRoaXMudW5uYW1lZFJlZ2lzdGVyLnNldFRleHQocmVnaXN0ZXIudG9TdHJpbmcoKSwgbGluZXdpc2UpOwogICAgICB9LAogICAgICAvLyBHZXRzIHRoZSByZWdpc3RlciBuYW1lZCBAbmFtZS4gIElmIG9uZSBvZiBAbmFtZSBkb2Vzbid0IGFscmVhZHkgZXhpc3QsCiAgICAgIC8vIGNyZWF0ZSBpdC4gIElmIEBuYW1lIGlzIGludmFsaWQsIHJldHVybiB0aGUgdW5uYW1lZFJlZ2lzdGVyLgogICAgICBnZXRSZWdpc3RlcjogZnVuY3Rpb24obmFtZSkgewogICAgICAgIGlmICghdGhpcy5pc1ZhbGlkUmVnaXN0ZXIobmFtZSkpIHsKICAgICAgICAgIHJldHVybiB0aGlzLnVubmFtZWRSZWdpc3RlcjsKICAgICAgICB9CiAgICAgICAgbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTsKICAgICAgICBpZiAoIXRoaXMucmVnaXN0ZXJzW25hbWVdKSB7CiAgICAgICAgICB0aGlzLnJlZ2lzdGVyc1tuYW1lXSA9IG5ldyBSZWdpc3RlcigpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5yZWdpc3RlcnNbbmFtZV07CiAgICAgIH0sCiAgICAgIGlzVmFsaWRSZWdpc3RlcjogZnVuY3Rpb24obmFtZSkgewogICAgICAgIHJldHVybiBuYW1lICYmIGluQXJyYXkobmFtZSwgdmFsaWRSZWdpc3RlcnMpOwogICAgICB9LAogICAgICBzaGlmdE51bWVyaWNSZWdpc3RlcnNfOiBmdW5jdGlvbigpIHsKICAgICAgICBmb3IgKHZhciBpID0gOTsgaSA+PSAyOyBpLS0pIHsKICAgICAgICAgIHRoaXMucmVnaXN0ZXJzW2ldID0gdGhpcy5nZXRSZWdpc3RlcignJyArIChpIC0gMSkpOwogICAgICAgIH0KICAgICAgfQogICAgfTsKICAgIGZ1bmN0aW9uIEhpc3RvcnlDb250cm9sbGVyKCkgewogICAgICAgIHRoaXMuaGlzdG9yeUJ1ZmZlciA9IFtdOwogICAgICAgIHRoaXMuaXRlcmF0b3IgPSAwOwogICAgICAgIHRoaXMuaW5pdGlhbFByZWZpeCA9IG51bGw7CiAgICB9CiAgICBIaXN0b3J5Q29udHJvbGxlci5wcm90b3R5cGUgPSB7CiAgICAgIC8vIHRoZSBpbnB1dCBhcmd1bWVudCBoZXJlIGFjdHMgYSB1c2VyIGVudGVyZWQgcHJlZml4IGZvciBhIHNtYWxsIHRpbWUKICAgICAgLy8gdW50aWwgd2Ugc3RhcnQgYXV0b2NvbXBsZXRpb24gaW4gd2hpY2ggY2FzZSBpdCBpcyB0aGUgYXV0b2NvbXBsZXRlZC4KICAgICAgbmV4dE1hdGNoOiBmdW5jdGlvbiAoaW5wdXQsIHVwKSB7CiAgICAgICAgdmFyIGhpc3RvcnlCdWZmZXIgPSB0aGlzLmhpc3RvcnlCdWZmZXI7CiAgICAgICAgdmFyIGRpciA9IHVwID8gLTEgOiAxOwogICAgICAgIGlmICh0aGlzLmluaXRpYWxQcmVmaXggPT09IG51bGwpIHRoaXMuaW5pdGlhbFByZWZpeCA9IGlucHV0OwogICAgICAgIGZvciAodmFyIGkgPSB0aGlzLml0ZXJhdG9yICsgZGlyOyB1cCA/IGkgPj0gMCA6IGkgPCBoaXN0b3J5QnVmZmVyLmxlbmd0aDsgaSs9IGRpcikgewogICAgICAgICAgdmFyIGVsZW1lbnQgPSBoaXN0b3J5QnVmZmVyW2ldOwogICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPD0gZWxlbWVudC5sZW5ndGg7IGorKykgewogICAgICAgICAgICBpZiAodGhpcy5pbml0aWFsUHJlZml4ID09IGVsZW1lbnQuc3Vic3RyaW5nKDAsIGopKSB7CiAgICAgICAgICAgICAgdGhpcy5pdGVyYXRvciA9IGk7CiAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gc2hvdWxkIHJldHVybiB0aGUgdXNlciBpbnB1dCBpbiBjYXNlIHdlIHJlYWNoIHRoZSBlbmQgb2YgYnVmZmVyLgogICAgICAgIGlmIChpID49IGhpc3RvcnlCdWZmZXIubGVuZ3RoKSB7CiAgICAgICAgICB0aGlzLml0ZXJhdG9yID0gaGlzdG9yeUJ1ZmZlci5sZW5ndGg7CiAgICAgICAgICByZXR1cm4gdGhpcy5pbml0aWFsUHJlZml4OwogICAgICAgIH0KICAgICAgICAvLyByZXR1cm4gdGhlIGxhc3QgYXV0b2NvbXBsZXRlZCBxdWVyeSBvciBleENvbW1hbmQgYXMgaXQgaXMuCiAgICAgICAgaWYgKGkgPCAwICkgcmV0dXJuIGlucHV0OwogICAgICB9LAogICAgICBwdXNoSW5wdXQ6IGZ1bmN0aW9uKGlucHV0KSB7CiAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5oaXN0b3J5QnVmZmVyLmluZGV4T2YoaW5wdXQpOwogICAgICAgIGlmIChpbmRleCA+IC0xKSB0aGlzLmhpc3RvcnlCdWZmZXIuc3BsaWNlKGluZGV4LCAxKTsKICAgICAgICBpZiAoaW5wdXQubGVuZ3RoKSB0aGlzLmhpc3RvcnlCdWZmZXIucHVzaChpbnB1dCk7CiAgICAgIH0sCiAgICAgIHJlc2V0OiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLmluaXRpYWxQcmVmaXggPSBudWxsOwogICAgICAgIHRoaXMuaXRlcmF0b3IgPSB0aGlzLmhpc3RvcnlCdWZmZXIubGVuZ3RoOwogICAgICB9CiAgICB9OwogICAgdmFyIGNvbW1hbmREaXNwYXRjaGVyID0gewogICAgICBtYXRjaENvbW1hbmQ6IGZ1bmN0aW9uKGtleXMsIGtleU1hcCwgaW5wdXRTdGF0ZSwgY29udGV4dCkgewogICAgICAgIHZhciBtYXRjaGVzID0gY29tbWFuZE1hdGNoZXMoa2V5cywga2V5TWFwLCBjb250ZXh0LCBpbnB1dFN0YXRlKTsKICAgICAgICBpZiAoIW1hdGNoZXMuZnVsbCAmJiAhbWF0Y2hlcy5wYXJ0aWFsKSB7CiAgICAgICAgICByZXR1cm4ge3R5cGU6ICdub25lJ307CiAgICAgICAgfSBlbHNlIGlmICghbWF0Y2hlcy5mdWxsICYmIG1hdGNoZXMucGFydGlhbCkgewogICAgICAgICAgcmV0dXJuIHt0eXBlOiAncGFydGlhbCd9OwogICAgICAgIH0KCiAgICAgICAgdmFyIGJlc3RNYXRjaDsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1hdGNoZXMuZnVsbC5sZW5ndGg7IGkrKykgewogICAgICAgICAgdmFyIG1hdGNoID0gbWF0Y2hlcy5mdWxsW2ldOwogICAgICAgICAgaWYgKCFiZXN0TWF0Y2gpIHsKICAgICAgICAgICAgYmVzdE1hdGNoID0gbWF0Y2g7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChiZXN0TWF0Y2gua2V5cy5zbGljZSgtMTEpID09ICc8Y2hhcmFjdGVyPicpIHsKICAgICAgICAgIGlucHV0U3RhdGUuc2VsZWN0ZWRDaGFyYWN0ZXIgPSBsYXN0Q2hhcihrZXlzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHt0eXBlOiAnZnVsbCcsIGNvbW1hbmQ6IGJlc3RNYXRjaH07CiAgICAgIH0sCiAgICAgIHByb2Nlc3NDb21tYW5kOiBmdW5jdGlvbihjbSwgdmltLCBjb21tYW5kKSB7CiAgICAgICAgdmltLmlucHV0U3RhdGUucmVwZWF0T3ZlcnJpZGUgPSBjb21tYW5kLnJlcGVhdE92ZXJyaWRlOwogICAgICAgIHN3aXRjaCAoY29tbWFuZC50eXBlKSB7CiAgICAgICAgICBjYXNlICdtb3Rpb24nOgogICAgICAgICAgICB0aGlzLnByb2Nlc3NNb3Rpb24oY20sIHZpbSwgY29tbWFuZCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnb3BlcmF0b3InOgogICAgICAgICAgICB0aGlzLnByb2Nlc3NPcGVyYXRvcihjbSwgdmltLCBjb21tYW5kKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdvcGVyYXRvck1vdGlvbic6CiAgICAgICAgICAgIHRoaXMucHJvY2Vzc09wZXJhdG9yTW90aW9uKGNtLCB2aW0sIGNvbW1hbmQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ2FjdGlvbic6CiAgICAgICAgICAgIHRoaXMucHJvY2Vzc0FjdGlvbihjbSwgdmltLCBjb21tYW5kKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdzZWFyY2gnOgogICAgICAgICAgICB0aGlzLnByb2Nlc3NTZWFyY2goY20sIHZpbSwgY29tbWFuZCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnZXgnOgogICAgICAgICAgY2FzZSAna2V5VG9FeCc6CiAgICAgICAgICAgIHRoaXMucHJvY2Vzc0V4KGNtLCB2aW0sIGNvbW1hbmQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfSwKICAgICAgcHJvY2Vzc01vdGlvbjogZnVuY3Rpb24oY20sIHZpbSwgY29tbWFuZCkgewogICAgICAgIHZpbS5pbnB1dFN0YXRlLm1vdGlvbiA9IGNvbW1hbmQubW90aW9uOwogICAgICAgIHZpbS5pbnB1dFN0YXRlLm1vdGlvbkFyZ3MgPSBjb3B5QXJncyhjb21tYW5kLm1vdGlvbkFyZ3MpOwogICAgICAgIHRoaXMuZXZhbElucHV0KGNtLCB2aW0pOwogICAgICB9LAogICAgICBwcm9jZXNzT3BlcmF0b3I6IGZ1bmN0aW9uKGNtLCB2aW0sIGNvbW1hbmQpIHsKICAgICAgICB2YXIgaW5wdXRTdGF0ZSA9IHZpbS5pbnB1dFN0YXRlOwogICAgICAgIGlmIChpbnB1dFN0YXRlLm9wZXJhdG9yKSB7CiAgICAgICAgICBpZiAoaW5wdXRTdGF0ZS5vcGVyYXRvciA9PSBjb21tYW5kLm9wZXJhdG9yKSB7CiAgICAgICAgICAgIC8vIFR5cGluZyBhbiBvcGVyYXRvciB0d2ljZSBsaWtlICdkZCcgbWFrZXMgdGhlIG9wZXJhdG9yIG9wZXJhdGUKICAgICAgICAgICAgLy8gbGluZXdpc2UKICAgICAgICAgICAgaW5wdXRTdGF0ZS5tb3Rpb24gPSAnZXhwYW5kVG9MaW5lJzsKICAgICAgICAgICAgaW5wdXRTdGF0ZS5tb3Rpb25BcmdzID0geyBsaW5ld2lzZTogdHJ1ZSB9OwogICAgICAgICAgICB0aGlzLmV2YWxJbnB1dChjbSwgdmltKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gMiBkaWZmZXJlbnQgb3BlcmF0b3JzIGluIGEgcm93IGRvZXNuJ3QgbWFrZSBzZW5zZS4KICAgICAgICAgICAgY2xlYXJJbnB1dFN0YXRlKGNtKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaW5wdXRTdGF0ZS5vcGVyYXRvciA9IGNvbW1hbmQub3BlcmF0b3I7CiAgICAgICAgaW5wdXRTdGF0ZS5vcGVyYXRvckFyZ3MgPSBjb3B5QXJncyhjb21tYW5kLm9wZXJhdG9yQXJncyk7CiAgICAgICAgaWYgKHZpbS52aXN1YWxNb2RlKSB7CiAgICAgICAgICAvLyBPcGVyYXRpbmcgb24gYSBzZWxlY3Rpb24gaW4gdmlzdWFsIG1vZGUuIFdlIGRvbid0IG5lZWQgYSBtb3Rpb24uCiAgICAgICAgICB0aGlzLmV2YWxJbnB1dChjbSwgdmltKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIHByb2Nlc3NPcGVyYXRvck1vdGlvbjogZnVuY3Rpb24oY20sIHZpbSwgY29tbWFuZCkgewogICAgICAgIHZhciB2aXN1YWxNb2RlID0gdmltLnZpc3VhbE1vZGU7CiAgICAgICAgdmFyIG9wZXJhdG9yTW90aW9uQXJncyA9IGNvcHlBcmdzKGNvbW1hbmQub3BlcmF0b3JNb3Rpb25BcmdzKTsKICAgICAgICBpZiAob3BlcmF0b3JNb3Rpb25BcmdzKSB7CiAgICAgICAgICAvLyBPcGVyYXRvciBtb3Rpb25zIG1heSBoYXZlIHNwZWNpYWwgYmVoYXZpb3IgaW4gdmlzdWFsIG1vZGUuCiAgICAgICAgICBpZiAodmlzdWFsTW9kZSAmJiBvcGVyYXRvck1vdGlvbkFyZ3MudmlzdWFsTGluZSkgewogICAgICAgICAgICB2aW0udmlzdWFsTGluZSA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRoaXMucHJvY2Vzc09wZXJhdG9yKGNtLCB2aW0sIGNvbW1hbmQpOwogICAgICAgIGlmICghdmlzdWFsTW9kZSkgewogICAgICAgICAgdGhpcy5wcm9jZXNzTW90aW9uKGNtLCB2aW0sIGNvbW1hbmQpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgcHJvY2Vzc0FjdGlvbjogZnVuY3Rpb24oY20sIHZpbSwgY29tbWFuZCkgewogICAgICAgIHZhciBpbnB1dFN0YXRlID0gdmltLmlucHV0U3RhdGU7CiAgICAgICAgdmFyIHJlcGVhdCA9IGlucHV0U3RhdGUuZ2V0UmVwZWF0KCk7CiAgICAgICAgdmFyIHJlcGVhdElzRXhwbGljaXQgPSAhIXJlcGVhdDsKICAgICAgICB2YXIgYWN0aW9uQXJncyA9IGNvcHlBcmdzKGNvbW1hbmQuYWN0aW9uQXJncykgfHwge307CiAgICAgICAgaWYgKGlucHV0U3RhdGUuc2VsZWN0ZWRDaGFyYWN0ZXIpIHsKICAgICAgICAgIGFjdGlvbkFyZ3Muc2VsZWN0ZWRDaGFyYWN0ZXIgPSBpbnB1dFN0YXRlLnNlbGVjdGVkQ2hhcmFjdGVyOwogICAgICAgIH0KICAgICAgICAvLyBBY3Rpb25zIG1heSBvciBtYXkgbm90IGhhdmUgbW90aW9ucyBhbmQgb3BlcmF0b3JzLiBEbyB0aGVzZSBmaXJzdC4KICAgICAgICBpZiAoY29tbWFuZC5vcGVyYXRvcikgewogICAgICAgICAgdGhpcy5wcm9jZXNzT3BlcmF0b3IoY20sIHZpbSwgY29tbWFuZCk7CiAgICAgICAgfQogICAgICAgIGlmIChjb21tYW5kLm1vdGlvbikgewogICAgICAgICAgdGhpcy5wcm9jZXNzTW90aW9uKGNtLCB2aW0sIGNvbW1hbmQpOwogICAgICAgIH0KICAgICAgICBpZiAoY29tbWFuZC5tb3Rpb24gfHwgY29tbWFuZC5vcGVyYXRvcikgewogICAgICAgICAgdGhpcy5ldmFsSW5wdXQoY20sIHZpbSk7CiAgICAgICAgfQogICAgICAgIGFjdGlvbkFyZ3MucmVwZWF0ID0gcmVwZWF0IHx8IDE7CiAgICAgICAgYWN0aW9uQXJncy5yZXBlYXRJc0V4cGxpY2l0ID0gcmVwZWF0SXNFeHBsaWNpdDsKICAgICAgICBhY3Rpb25BcmdzLnJlZ2lzdGVyTmFtZSA9IGlucHV0U3RhdGUucmVnaXN0ZXJOYW1lOwogICAgICAgIGNsZWFySW5wdXRTdGF0ZShjbSk7CiAgICAgICAgdmltLmxhc3RNb3Rpb24gPSBudWxsOwogICAgICAgIGlmIChjb21tYW5kLmlzRWRpdCkgewogICAgICAgICAgdGhpcy5yZWNvcmRMYXN0RWRpdCh2aW0sIGlucHV0U3RhdGUsIGNvbW1hbmQpOwogICAgICAgIH0KICAgICAgICBhY3Rpb25zW2NvbW1hbmQuYWN0aW9uXShjbSwgYWN0aW9uQXJncywgdmltKTsKICAgICAgfSwKICAgICAgcHJvY2Vzc1NlYXJjaDogZnVuY3Rpb24oY20sIHZpbSwgY29tbWFuZCkgewogICAgICAgIGlmICghY20uZ2V0U2VhcmNoQ3Vyc29yKSB7CiAgICAgICAgICAvLyBTZWFyY2ggZGVwZW5kcyBvbiBTZWFyY2hDdXJzb3IuCiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHZhciBmb3J3YXJkID0gY29tbWFuZC5zZWFyY2hBcmdzLmZvcndhcmQ7CiAgICAgICAgdmFyIHdob2xlV29yZE9ubHkgPSBjb21tYW5kLnNlYXJjaEFyZ3Mud2hvbGVXb3JkT25seTsKICAgICAgICBnZXRTZWFyY2hTdGF0ZShjbSkuc2V0UmV2ZXJzZWQoIWZvcndhcmQpOwogICAgICAgIHZhciBwcm9tcHRQcmVmaXggPSAoZm9yd2FyZCkgPyAnLycgOiAnPyc7CiAgICAgICAgdmFyIG9yaWdpbmFsUXVlcnkgPSBnZXRTZWFyY2hTdGF0ZShjbSkuZ2V0UXVlcnkoKTsKICAgICAgICB2YXIgb3JpZ2luYWxTY3JvbGxQb3MgPSBjbS5nZXRTY3JvbGxJbmZvKCk7CiAgICAgICAgZnVuY3Rpb24gaGFuZGxlUXVlcnkocXVlcnksIGlnbm9yZUNhc2UsIHNtYXJ0Q2FzZSkgewogICAgICAgICAgdmltR2xvYmFsU3RhdGUuc2VhcmNoSGlzdG9yeUNvbnRyb2xsZXIucHVzaElucHV0KHF1ZXJ5KTsKICAgICAgICAgIHZpbUdsb2JhbFN0YXRlLnNlYXJjaEhpc3RvcnlDb250cm9sbGVyLnJlc2V0KCk7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICB1cGRhdGVTZWFyY2hRdWVyeShjbSwgcXVlcnksIGlnbm9yZUNhc2UsIHNtYXJ0Q2FzZSk7CiAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgIHNob3dDb25maXJtKGNtLCAnSW52YWxpZCByZWdleDogJyArIHF1ZXJ5KTsKICAgICAgICAgICAgY2xlYXJJbnB1dFN0YXRlKGNtKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgICAgY29tbWFuZERpc3BhdGNoZXIucHJvY2Vzc01vdGlvbihjbSwgdmltLCB7CiAgICAgICAgICAgIHR5cGU6ICdtb3Rpb24nLAogICAgICAgICAgICBtb3Rpb246ICdmaW5kTmV4dCcsCiAgICAgICAgICAgIG1vdGlvbkFyZ3M6IHsgZm9yd2FyZDogdHJ1ZSwgdG9KdW1wbGlzdDogY29tbWFuZC5zZWFyY2hBcmdzLnRvSnVtcGxpc3QgfQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIG9uUHJvbXB0Q2xvc2UocXVlcnkpIHsKICAgICAgICAgIGNtLnNjcm9sbFRvKG9yaWdpbmFsU2Nyb2xsUG9zLmxlZnQsIG9yaWdpbmFsU2Nyb2xsUG9zLnRvcCk7CiAgICAgICAgICBoYW5kbGVRdWVyeShxdWVyeSwgdHJ1ZSAvKiogaWdub3JlQ2FzZSAqLywgdHJ1ZSAvKiogc21hcnRDYXNlICovKTsKICAgICAgICAgIHZhciBtYWNyb01vZGVTdGF0ZSA9IHZpbUdsb2JhbFN0YXRlLm1hY3JvTW9kZVN0YXRlOwogICAgICAgICAgaWYgKG1hY3JvTW9kZVN0YXRlLmlzUmVjb3JkaW5nKSB7CiAgICAgICAgICAgIGxvZ1NlYXJjaFF1ZXJ5KG1hY3JvTW9kZVN0YXRlLCBxdWVyeSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIG9uUHJvbXB0S2V5VXAoZSwgcXVlcnksIGNsb3NlKSB7CiAgICAgICAgICB2YXIga2V5TmFtZSA9IENvZGVNaXJyb3Iua2V5TmFtZShlKSwgdXA7CiAgICAgICAgICBpZiAoa2V5TmFtZSA9PSAnVXAnIHx8IGtleU5hbWUgPT0gJ0Rvd24nKSB7CiAgICAgICAgICAgIHVwID0ga2V5TmFtZSA9PSAnVXAnID8gdHJ1ZSA6IGZhbHNlOwogICAgICAgICAgICBxdWVyeSA9IHZpbUdsb2JhbFN0YXRlLnNlYXJjaEhpc3RvcnlDb250cm9sbGVyLm5leHRNYXRjaChxdWVyeSwgdXApIHx8ICcnOwogICAgICAgICAgICBjbG9zZShxdWVyeSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoIGtleU5hbWUgIT0gJ0xlZnQnICYmIGtleU5hbWUgIT0gJ1JpZ2h0JyAmJiBrZXlOYW1lICE9ICdDdHJsJyAmJiBrZXlOYW1lICE9ICdBbHQnICYmIGtleU5hbWUgIT0gJ1NoaWZ0JykKICAgICAgICAgICAgICB2aW1HbG9iYWxTdGF0ZS5zZWFyY2hIaXN0b3J5Q29udHJvbGxlci5yZXNldCgpOwogICAgICAgICAgfQogICAgICAgICAgdmFyIHBhcnNlZFF1ZXJ5OwogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgcGFyc2VkUXVlcnkgPSB1cGRhdGVTZWFyY2hRdWVyeShjbSwgcXVlcnksCiAgICAgICAgICAgICAgICB0cnVlIC8qKiBpZ25vcmVDYXNlICovLCB0cnVlIC8qKiBzbWFydENhc2UgKi8pOwogICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICAvLyBTd2FsbG93IGJhZCByZWdleGVzIGZvciBpbmNyZW1lbnRhbCBzZWFyY2guCiAgICAgICAgICB9CiAgICAgICAgICBpZiAocGFyc2VkUXVlcnkpIHsKICAgICAgICAgICAgY20uc2Nyb2xsSW50b1ZpZXcoZmluZE5leHQoY20sICFmb3J3YXJkLCBwYXJzZWRRdWVyeSksIDMwKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNsZWFyU2VhcmNoSGlnaGxpZ2h0KGNtKTsKICAgICAgICAgICAgY20uc2Nyb2xsVG8ob3JpZ2luYWxTY3JvbGxQb3MubGVmdCwgb3JpZ2luYWxTY3JvbGxQb3MudG9wKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gb25Qcm9tcHRLZXlEb3duKGUsIHF1ZXJ5LCBjbG9zZSkgewogICAgICAgICAgdmFyIGtleU5hbWUgPSBDb2RlTWlycm9yLmtleU5hbWUoZSk7CiAgICAgICAgICBpZiAoa2V5TmFtZSA9PSAnRXNjJyB8fCBrZXlOYW1lID09ICdDdHJsLUMnIHx8IGtleU5hbWUgPT0gJ0N0cmwtWycgfHwKICAgICAgICAgICAgICAoa2V5TmFtZSA9PSAnQmFja3NwYWNlJyAmJiBxdWVyeSA9PSAnJykpIHsKICAgICAgICAgICAgdmltR2xvYmFsU3RhdGUuc2VhcmNoSGlzdG9yeUNvbnRyb2xsZXIucHVzaElucHV0KHF1ZXJ5KTsKICAgICAgICAgICAgdmltR2xvYmFsU3RhdGUuc2VhcmNoSGlzdG9yeUNvbnRyb2xsZXIucmVzZXQoKTsKICAgICAgICAgICAgdXBkYXRlU2VhcmNoUXVlcnkoY20sIG9yaWdpbmFsUXVlcnkpOwogICAgICAgICAgICBjbGVhclNlYXJjaEhpZ2hsaWdodChjbSk7CiAgICAgICAgICAgIGNtLnNjcm9sbFRvKG9yaWdpbmFsU2Nyb2xsUG9zLmxlZnQsIG9yaWdpbmFsU2Nyb2xsUG9zLnRvcCk7CiAgICAgICAgICAgIENvZGVNaXJyb3IuZV9zdG9wKGUpOwogICAgICAgICAgICBjbGVhcklucHV0U3RhdGUoY20pOwogICAgICAgICAgICBjbG9zZSgpOwogICAgICAgICAgICBjbS5mb2N1cygpOwogICAgICAgICAgfSBlbHNlIGlmIChrZXlOYW1lID09ICdDdHJsLVUnKSB7CiAgICAgICAgICAgIC8vIEN0cmwtVSBjbGVhcnMgaW5wdXQuCiAgICAgICAgICAgIENvZGVNaXJyb3IuZV9zdG9wKGUpOwogICAgICAgICAgICBjbG9zZSgnJyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHN3aXRjaCAoY29tbWFuZC5zZWFyY2hBcmdzLnF1ZXJ5U3JjKSB7CiAgICAgICAgICBjYXNlICdwcm9tcHQnOgogICAgICAgICAgICB2YXIgbWFjcm9Nb2RlU3RhdGUgPSB2aW1HbG9iYWxTdGF0ZS5tYWNyb01vZGVTdGF0ZTsKICAgICAgICAgICAgaWYgKG1hY3JvTW9kZVN0YXRlLmlzUGxheWluZykgewogICAgICAgICAgICAgIHZhciBxdWVyeSA9IG1hY3JvTW9kZVN0YXRlLnJlcGxheVNlYXJjaFF1ZXJpZXMuc2hpZnQoKTsKICAgICAgICAgICAgICBoYW5kbGVRdWVyeShxdWVyeSwgdHJ1ZSAvKiogaWdub3JlQ2FzZSAqLywgZmFsc2UgLyoqIHNtYXJ0Q2FzZSAqLyk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgc2hvd1Byb21wdChjbSwgewogICAgICAgICAgICAgICAgICBvbkNsb3NlOiBvblByb21wdENsb3NlLAogICAgICAgICAgICAgICAgICBwcmVmaXg6IHByb21wdFByZWZpeCwKICAgICAgICAgICAgICAgICAgZGVzYzogc2VhcmNoUHJvbXB0RGVzYywKICAgICAgICAgICAgICAgICAgb25LZXlVcDogb25Qcm9tcHRLZXlVcCwKICAgICAgICAgICAgICAgICAgb25LZXlEb3duOiBvblByb21wdEtleURvd24KICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ3dvcmRVbmRlckN1cnNvcic6CiAgICAgICAgICAgIHZhciB3b3JkID0gZXhwYW5kV29yZFVuZGVyQ3Vyc29yKGNtLCBmYWxzZSAvKiogaW5jbHVzaXZlICovLAogICAgICAgICAgICAgICAgdHJ1ZSAvKiogZm9yd2FyZCAqLywgZmFsc2UgLyoqIGJpZ1dvcmQgKi8sCiAgICAgICAgICAgICAgICB0cnVlIC8qKiBub1N5bWJvbCAqLyk7CiAgICAgICAgICAgIHZhciBpc0tleXdvcmQgPSB0cnVlOwogICAgICAgICAgICBpZiAoIXdvcmQpIHsKICAgICAgICAgICAgICB3b3JkID0gZXhwYW5kV29yZFVuZGVyQ3Vyc29yKGNtLCBmYWxzZSAvKiogaW5jbHVzaXZlICovLAogICAgICAgICAgICAgICAgICB0cnVlIC8qKiBmb3J3YXJkICovLCBmYWxzZSAvKiogYmlnV29yZCAqLywKICAgICAgICAgICAgICAgICAgZmFsc2UgLyoqIG5vU3ltYm9sICovKTsKICAgICAgICAgICAgICBpc0tleXdvcmQgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXdvcmQpIHsKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHF1ZXJ5ID0gY20uZ2V0TGluZSh3b3JkLnN0YXJ0LmxpbmUpLnN1YnN0cmluZyh3b3JkLnN0YXJ0LmNoLAogICAgICAgICAgICAgICAgd29yZC5lbmQuY2gpOwogICAgICAgICAgICBpZiAoaXNLZXl3b3JkICYmIHdob2xlV29yZE9ubHkpIHsKICAgICAgICAgICAgICAgIHF1ZXJ5ID0gJ1xcYicgKyBxdWVyeSArICdcXGInOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHF1ZXJ5ID0gZXNjYXBlUmVnZXgocXVlcnkpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBjYWNoZWRDdXJzb3IgaXMgdXNlZCB0byBzYXZlIHRoZSBvbGQgcG9zaXRpb24gb2YgdGhlIGN1cnNvcgogICAgICAgICAgICAvLyB3aGVuICogb3IgIyBjYXVzZXMgdmltIHRvIHNlZWsgZm9yIHRoZSBuZWFyZXN0IHdvcmQgYW5kIHNoaWZ0CiAgICAgICAgICAgIC8vIHRoZSBjdXJzb3IgYmVmb3JlIGVudGVyaW5nIHRoZSBtb3Rpb24uCiAgICAgICAgICAgIHZpbUdsb2JhbFN0YXRlLmp1bXBMaXN0LmNhY2hlZEN1cnNvciA9IGNtLmdldEN1cnNvcigpOwogICAgICAgICAgICBjbS5zZXRDdXJzb3Iod29yZC5zdGFydCk7CgogICAgICAgICAgICBoYW5kbGVRdWVyeShxdWVyeSwgdHJ1ZSAvKiogaWdub3JlQ2FzZSAqLywgZmFsc2UgLyoqIHNtYXJ0Q2FzZSAqLyk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfSwKICAgICAgcHJvY2Vzc0V4OiBmdW5jdGlvbihjbSwgdmltLCBjb21tYW5kKSB7CiAgICAgICAgZnVuY3Rpb24gb25Qcm9tcHRDbG9zZShpbnB1dCkgewogICAgICAgICAgLy8gR2l2ZSB0aGUgcHJvbXB0IHNvbWUgdGltZSB0byBjbG9zZSBzbyB0aGF0IGlmIHByb2Nlc3NDb21tYW5kIHNob3dzCiAgICAgICAgICAvLyBhbiBlcnJvciwgdGhlIGVsZW1lbnRzIGRvbid0IG92ZXJsYXAuCiAgICAgICAgICB2aW1HbG9iYWxTdGF0ZS5leENvbW1hbmRIaXN0b3J5Q29udHJvbGxlci5wdXNoSW5wdXQoaW5wdXQpOwogICAgICAgICAgdmltR2xvYmFsU3RhdGUuZXhDb21tYW5kSGlzdG9yeUNvbnRyb2xsZXIucmVzZXQoKTsKICAgICAgICAgIGV4Q29tbWFuZERpc3BhdGNoZXIucHJvY2Vzc0NvbW1hbmQoY20sIGlucHV0KTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gb25Qcm9tcHRLZXlEb3duKGUsIGlucHV0LCBjbG9zZSkgewogICAgICAgICAgdmFyIGtleU5hbWUgPSBDb2RlTWlycm9yLmtleU5hbWUoZSksIHVwOwogICAgICAgICAgaWYgKGtleU5hbWUgPT0gJ0VzYycgfHwga2V5TmFtZSA9PSAnQ3RybC1DJyB8fCBrZXlOYW1lID09ICdDdHJsLVsnIHx8CiAgICAgICAgICAgICAgKGtleU5hbWUgPT0gJ0JhY2tzcGFjZScgJiYgaW5wdXQgPT0gJycpKSB7CiAgICAgICAgICAgIHZpbUdsb2JhbFN0YXRlLmV4Q29tbWFuZEhpc3RvcnlDb250cm9sbGVyLnB1c2hJbnB1dChpbnB1dCk7CiAgICAgICAgICAgIHZpbUdsb2JhbFN0YXRlLmV4Q29tbWFuZEhpc3RvcnlDb250cm9sbGVyLnJlc2V0KCk7CiAgICAgICAgICAgIENvZGVNaXJyb3IuZV9zdG9wKGUpOwogICAgICAgICAgICBjbGVhcklucHV0U3RhdGUoY20pOwogICAgICAgICAgICBjbG9zZSgpOwogICAgICAgICAgICBjbS5mb2N1cygpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGtleU5hbWUgPT0gJ1VwJyB8fCBrZXlOYW1lID09ICdEb3duJykgewogICAgICAgICAgICB1cCA9IGtleU5hbWUgPT0gJ1VwJyA/IHRydWUgOiBmYWxzZTsKICAgICAgICAgICAgaW5wdXQgPSB2aW1HbG9iYWxTdGF0ZS5leENvbW1hbmRIaXN0b3J5Q29udHJvbGxlci5uZXh0TWF0Y2goaW5wdXQsIHVwKSB8fCAnJzsKICAgICAgICAgICAgY2xvc2UoaW5wdXQpOwogICAgICAgICAgfSBlbHNlIGlmIChrZXlOYW1lID09ICdDdHJsLVUnKSB7CiAgICAgICAgICAgIC8vIEN0cmwtVSBjbGVhcnMgaW5wdXQuCiAgICAgICAgICAgIENvZGVNaXJyb3IuZV9zdG9wKGUpOwogICAgICAgICAgICBjbG9zZSgnJyk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoIGtleU5hbWUgIT0gJ0xlZnQnICYmIGtleU5hbWUgIT0gJ1JpZ2h0JyAmJiBrZXlOYW1lICE9ICdDdHJsJyAmJiBrZXlOYW1lICE9ICdBbHQnICYmIGtleU5hbWUgIT0gJ1NoaWZ0JykKICAgICAgICAgICAgICB2aW1HbG9iYWxTdGF0ZS5leENvbW1hbmRIaXN0b3J5Q29udHJvbGxlci5yZXNldCgpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoY29tbWFuZC50eXBlID09ICdrZXlUb0V4JykgewogICAgICAgICAgLy8gSGFuZGxlIHVzZXIgZGVmaW5lZCBFeCB0byBFeCBtYXBwaW5ncwogICAgICAgICAgZXhDb21tYW5kRGlzcGF0Y2hlci5wcm9jZXNzQ29tbWFuZChjbSwgY29tbWFuZC5leEFyZ3MuaW5wdXQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAodmltLnZpc3VhbE1vZGUpIHsKICAgICAgICAgICAgc2hvd1Byb21wdChjbSwgeyBvbkNsb3NlOiBvblByb21wdENsb3NlLCBwcmVmaXg6ICc6JywgdmFsdWU6ICdcJzwsXCc+JywKICAgICAgICAgICAgICAgIG9uS2V5RG93bjogb25Qcm9tcHRLZXlEb3dufSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzaG93UHJvbXB0KGNtLCB7IG9uQ2xvc2U6IG9uUHJvbXB0Q2xvc2UsIHByZWZpeDogJzonLAogICAgICAgICAgICAgICAgb25LZXlEb3duOiBvblByb21wdEtleURvd259KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgIGV2YWxJbnB1dDogZnVuY3Rpb24oY20sIHZpbSkgewogICAgICAgIC8vIElmIHRoZSBtb3Rpb24gY29tbWFuZCBpcyBzZXQsIGV4ZWN1dGUgYm90aCB0aGUgb3BlcmF0b3IgYW5kIG1vdGlvbi4KICAgICAgICAvLyBPdGhlcndpc2UgcmV0dXJuLgogICAgICAgIHZhciBpbnB1dFN0YXRlID0gdmltLmlucHV0U3RhdGU7CiAgICAgICAgdmFyIG1vdGlvbiA9IGlucHV0U3RhdGUubW90aW9uOwogICAgICAgIHZhciBtb3Rpb25BcmdzID0gaW5wdXRTdGF0ZS5tb3Rpb25BcmdzIHx8IHt9OwogICAgICAgIHZhciBvcGVyYXRvciA9IGlucHV0U3RhdGUub3BlcmF0b3I7CiAgICAgICAgdmFyIG9wZXJhdG9yQXJncyA9IGlucHV0U3RhdGUub3BlcmF0b3JBcmdzIHx8IHt9OwogICAgICAgIHZhciByZWdpc3Rlck5hbWUgPSBpbnB1dFN0YXRlLnJlZ2lzdGVyTmFtZTsKICAgICAgICB2YXIgc2VsID0gdmltLnNlbDsKICAgICAgICAvLyBUT0RPOiBNYWtlIHN1cmUgY20gYW5kIHZpbSBzZWxlY3Rpb25zIGFyZSBpZGVudGljYWwgb3V0c2lkZSB2aXN1YWwgbW9kZS4KICAgICAgICB2YXIgb3JpZ0hlYWQgPSBjb3B5Q3Vyc29yKHZpbS52aXN1YWxNb2RlID8gY2xpcEN1cnNvclRvQ29udGVudChjbSwgc2VsLmhlYWQpOiBjbS5nZXRDdXJzb3IoJ2hlYWQnKSk7CiAgICAgICAgdmFyIG9yaWdBbmNob3IgPSBjb3B5Q3Vyc29yKHZpbS52aXN1YWxNb2RlID8gY2xpcEN1cnNvclRvQ29udGVudChjbSwgc2VsLmFuY2hvcikgOiBjbS5nZXRDdXJzb3IoJ2FuY2hvcicpKTsKICAgICAgICB2YXIgb2xkSGVhZCA9IGNvcHlDdXJzb3Iob3JpZ0hlYWQpOwogICAgICAgIHZhciBvbGRBbmNob3IgPSBjb3B5Q3Vyc29yKG9yaWdBbmNob3IpOwogICAgICAgIHZhciBuZXdIZWFkLCBuZXdBbmNob3I7CiAgICAgICAgdmFyIHJlcGVhdDsKICAgICAgICBpZiAob3BlcmF0b3IpIHsKICAgICAgICAgIHRoaXMucmVjb3JkTGFzdEVkaXQodmltLCBpbnB1dFN0YXRlKTsKICAgICAgICB9CiAgICAgICAgaWYgKGlucHV0U3RhdGUucmVwZWF0T3ZlcnJpZGUgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgLy8gSWYgcmVwZWF0T3ZlcnJpZGUgaXMgc3BlY2lmaWVkLCB0aGF0IHRha2VzIHByZWNlZGVuY2Ugb3ZlciB0aGUKICAgICAgICAgIC8vIGlucHV0IHN0YXRlJ3MgcmVwZWF0LiBVc2VkIGJ5IEV4IG1vZGUgYW5kIGNhbiBiZSB1c2VyIGRlZmluZWQuCiAgICAgICAgICByZXBlYXQgPSBpbnB1dFN0YXRlLnJlcGVhdE92ZXJyaWRlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXBlYXQgPSBpbnB1dFN0YXRlLmdldFJlcGVhdCgpOwogICAgICAgIH0KICAgICAgICBpZiAocmVwZWF0ID4gMCAmJiBtb3Rpb25BcmdzLmV4cGxpY2l0UmVwZWF0KSB7CiAgICAgICAgICBtb3Rpb25BcmdzLnJlcGVhdElzRXhwbGljaXQgPSB0cnVlOwogICAgICAgIH0gZWxzZSBpZiAobW90aW9uQXJncy5ub1JlcGVhdCB8fAogICAgICAgICAgICAoIW1vdGlvbkFyZ3MuZXhwbGljaXRSZXBlYXQgJiYgcmVwZWF0ID09PSAwKSkgewogICAgICAgICAgcmVwZWF0ID0gMTsKICAgICAgICAgIG1vdGlvbkFyZ3MucmVwZWF0SXNFeHBsaWNpdCA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICBpZiAoaW5wdXRTdGF0ZS5zZWxlY3RlZENoYXJhY3RlcikgewogICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBjaGFyYWN0ZXIgaW5wdXQsIHN0aWNrIGl0IGluIGFsbCBvZiB0aGUgYXJnIGFycmF5cy4KICAgICAgICAgIG1vdGlvbkFyZ3Muc2VsZWN0ZWRDaGFyYWN0ZXIgPSBvcGVyYXRvckFyZ3Muc2VsZWN0ZWRDaGFyYWN0ZXIgPQogICAgICAgICAgICAgIGlucHV0U3RhdGUuc2VsZWN0ZWRDaGFyYWN0ZXI7CiAgICAgICAgfQogICAgICAgIG1vdGlvbkFyZ3MucmVwZWF0ID0gcmVwZWF0OwogICAgICAgIGNsZWFySW5wdXRTdGF0ZShjbSk7CiAgICAgICAgaWYgKG1vdGlvbikgewogICAgICAgICAgdmFyIG1vdGlvblJlc3VsdCA9IG1vdGlvbnNbbW90aW9uXShjbSwgb3JpZ0hlYWQsIG1vdGlvbkFyZ3MsIHZpbSk7CiAgICAgICAgICB2aW0ubGFzdE1vdGlvbiA9IG1vdGlvbnNbbW90aW9uXTsKICAgICAgICAgIGlmICghbW90aW9uUmVzdWx0KSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChtb3Rpb25BcmdzLnRvSnVtcGxpc3QpIHsKICAgICAgICAgICAgdmFyIGp1bXBMaXN0ID0gdmltR2xvYmFsU3RhdGUuanVtcExpc3Q7CiAgICAgICAgICAgIC8vIGlmIHRoZSBjdXJyZW50IG1vdGlvbiBpcyAjIG9yICosIHVzZSBjYWNoZWRDdXJzb3IKICAgICAgICAgICAgdmFyIGNhY2hlZEN1cnNvciA9IGp1bXBMaXN0LmNhY2hlZEN1cnNvcjsKICAgICAgICAgICAgaWYgKGNhY2hlZEN1cnNvcikgewogICAgICAgICAgICAgIHJlY29yZEp1bXBQb3NpdGlvbihjbSwgY2FjaGVkQ3Vyc29yLCBtb3Rpb25SZXN1bHQpOwogICAgICAgICAgICAgIGRlbGV0ZSBqdW1wTGlzdC5jYWNoZWRDdXJzb3I7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgcmVjb3JkSnVtcFBvc2l0aW9uKGNtLCBvcmlnSGVhZCwgbW90aW9uUmVzdWx0KTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKG1vdGlvblJlc3VsdCBpbnN0YW5jZW9mIEFycmF5KSB7CiAgICAgICAgICAgIG5ld0FuY2hvciA9IG1vdGlvblJlc3VsdFswXTsKICAgICAgICAgICAgbmV3SGVhZCA9IG1vdGlvblJlc3VsdFsxXTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG5ld0hlYWQgPSBtb3Rpb25SZXN1bHQ7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBUT0RPOiBIYW5kbGUgbnVsbCByZXR1cm5zIGZyb20gbW90aW9uIGNvbW1hbmRzIGJldHRlci4KICAgICAgICAgIGlmICghbmV3SGVhZCkgewogICAgICAgICAgICBuZXdIZWFkID0gY29weUN1cnNvcihvcmlnSGVhZCk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodmltLnZpc3VhbE1vZGUpIHsKICAgICAgICAgICAgaWYgKCEodmltLnZpc3VhbEJsb2NrICYmIG5ld0hlYWQuY2ggPT09IEluZmluaXR5KSkgewogICAgICAgICAgICAgIG5ld0hlYWQgPSBjbGlwQ3Vyc29yVG9Db250ZW50KGNtLCBuZXdIZWFkLCB2aW0udmlzdWFsQmxvY2spOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChuZXdBbmNob3IpIHsKICAgICAgICAgICAgICBuZXdBbmNob3IgPSBjbGlwQ3Vyc29yVG9Db250ZW50KGNtLCBuZXdBbmNob3IsIHRydWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG5ld0FuY2hvciA9IG5ld0FuY2hvciB8fCBvbGRBbmNob3I7CiAgICAgICAgICAgIHNlbC5hbmNob3IgPSBuZXdBbmNob3I7CiAgICAgICAgICAgIHNlbC5oZWFkID0gbmV3SGVhZDsKICAgICAgICAgICAgdXBkYXRlQ21TZWxlY3Rpb24oY20pOwogICAgICAgICAgICB1cGRhdGVNYXJrKGNtLCB2aW0sICc8JywKICAgICAgICAgICAgICAgIGN1cnNvcklzQmVmb3JlKG5ld0FuY2hvciwgbmV3SGVhZCkgPyBuZXdBbmNob3IKICAgICAgICAgICAgICAgICAgICA6IG5ld0hlYWQpOwogICAgICAgICAgICB1cGRhdGVNYXJrKGNtLCB2aW0sICc+JywKICAgICAgICAgICAgICAgIGN1cnNvcklzQmVmb3JlKG5ld0FuY2hvciwgbmV3SGVhZCkgPyBuZXdIZWFkCiAgICAgICAgICAgICAgICAgICAgOiBuZXdBbmNob3IpOwogICAgICAgICAgfSBlbHNlIGlmICghb3BlcmF0b3IpIHsKICAgICAgICAgICAgbmV3SGVhZCA9IGNsaXBDdXJzb3JUb0NvbnRlbnQoY20sIG5ld0hlYWQpOwogICAgICAgICAgICBjbS5zZXRDdXJzb3IobmV3SGVhZC5saW5lLCBuZXdIZWFkLmNoKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKG9wZXJhdG9yKSB7CiAgICAgICAgICBpZiAob3BlcmF0b3JBcmdzLmxhc3RTZWwpIHsKICAgICAgICAgICAgLy8gUmVwbGF5aW5nIGEgdmlzdWFsIG1vZGUgb3BlcmF0aW9uCiAgICAgICAgICAgIG5ld0FuY2hvciA9IG9sZEFuY2hvcjsKICAgICAgICAgICAgdmFyIGxhc3RTZWwgPSBvcGVyYXRvckFyZ3MubGFzdFNlbDsKICAgICAgICAgICAgdmFyIGxpbmVPZmZzZXQgPSBNYXRoLmFicyhsYXN0U2VsLmhlYWQubGluZSAtIGxhc3RTZWwuYW5jaG9yLmxpbmUpOwogICAgICAgICAgICB2YXIgY2hPZmZzZXQgPSBNYXRoLmFicyhsYXN0U2VsLmhlYWQuY2ggLSBsYXN0U2VsLmFuY2hvci5jaCk7CiAgICAgICAgICAgIGlmIChsYXN0U2VsLnZpc3VhbExpbmUpIHsKICAgICAgICAgICAgICAvLyBMaW5ld2lzZSBWaXN1YWwgbW9kZTogVGhlIHNhbWUgbnVtYmVyIG9mIGxpbmVzLgogICAgICAgICAgICAgIG5ld0hlYWQgPSBQb3Mob2xkQW5jaG9yLmxpbmUgKyBsaW5lT2Zmc2V0LCBvbGRBbmNob3IuY2gpOwogICAgICAgICAgICB9IGVsc2UgaWYgKGxhc3RTZWwudmlzdWFsQmxvY2spIHsKICAgICAgICAgICAgICAvLyBCbG9ja3dpc2UgVmlzdWFsIG1vZGU6IFRoZSBzYW1lIG51bWJlciBvZiBsaW5lcyBhbmQgY29sdW1ucy4KICAgICAgICAgICAgICBuZXdIZWFkID0gUG9zKG9sZEFuY2hvci5saW5lICsgbGluZU9mZnNldCwgb2xkQW5jaG9yLmNoICsgY2hPZmZzZXQpOwogICAgICAgICAgICB9IGVsc2UgaWYgKGxhc3RTZWwuaGVhZC5saW5lID09IGxhc3RTZWwuYW5jaG9yLmxpbmUpIHsKICAgICAgICAgICAgICAvLyBOb3JtYWwgVmlzdWFsIG1vZGUgd2l0aGluIG9uZSBsaW5lOiBUaGUgc2FtZSBudW1iZXIgb2YgY2hhcmFjdGVycy4KICAgICAgICAgICAgICBuZXdIZWFkID0gUG9zKG9sZEFuY2hvci5saW5lLCBvbGRBbmNob3IuY2ggKyBjaE9mZnNldCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgLy8gTm9ybWFsIFZpc3VhbCBtb2RlIHdpdGggc2V2ZXJhbCBsaW5lczogVGhlIHNhbWUgbnVtYmVyIG9mIGxpbmVzLCBpbiB0aGUKICAgICAgICAgICAgICAvLyBsYXN0IGxpbmUgdGhlIHNhbWUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgYXMgaW4gdGhlIGxhc3QgbGluZSB0aGUgbGFzdCB0aW1lLgogICAgICAgICAgICAgIG5ld0hlYWQgPSBQb3Mob2xkQW5jaG9yLmxpbmUgKyBsaW5lT2Zmc2V0LCBvbGRBbmNob3IuY2gpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZpbS52aXN1YWxNb2RlID0gdHJ1ZTsKICAgICAgICAgICAgdmltLnZpc3VhbExpbmUgPSBsYXN0U2VsLnZpc3VhbExpbmU7CiAgICAgICAgICAgIHZpbS52aXN1YWxCbG9jayA9IGxhc3RTZWwudmlzdWFsQmxvY2s7CiAgICAgICAgICAgIHNlbCA9IHZpbS5zZWwgPSB7CiAgICAgICAgICAgICAgYW5jaG9yOiBuZXdBbmNob3IsCiAgICAgICAgICAgICAgaGVhZDogbmV3SGVhZAogICAgICAgICAgICB9OwogICAgICAgICAgICB1cGRhdGVDbVNlbGVjdGlvbihjbSk7CiAgICAgICAgICB9IGVsc2UgaWYgKHZpbS52aXN1YWxNb2RlKSB7CiAgICAgICAgICAgIG9wZXJhdG9yQXJncy5sYXN0U2VsID0gewogICAgICAgICAgICAgIGFuY2hvcjogY29weUN1cnNvcihzZWwuYW5jaG9yKSwKICAgICAgICAgICAgICBoZWFkOiBjb3B5Q3Vyc29yKHNlbC5oZWFkKSwKICAgICAgICAgICAgICB2aXN1YWxCbG9jazogdmltLnZpc3VhbEJsb2NrLAogICAgICAgICAgICAgIHZpc3VhbExpbmU6IHZpbS52aXN1YWxMaW5lCiAgICAgICAgICAgIH07CiAgICAgICAgICB9CiAgICAgICAgICB2YXIgY3VyU3RhcnQsIGN1ckVuZCwgbGluZXdpc2UsIG1vZGU7CiAgICAgICAgICB2YXIgY21TZWw7CiAgICAgICAgICBpZiAodmltLnZpc3VhbE1vZGUpIHsKICAgICAgICAgICAgLy8gSW5pdCB2aXN1YWwgb3AKICAgICAgICAgICAgY3VyU3RhcnQgPSBjdXJzb3JNaW4oc2VsLmhlYWQsIHNlbC5hbmNob3IpOwogICAgICAgICAgICBjdXJFbmQgPSBjdXJzb3JNYXgoc2VsLmhlYWQsIHNlbC5hbmNob3IpOwogICAgICAgICAgICBsaW5ld2lzZSA9IHZpbS52aXN1YWxMaW5lIHx8IG9wZXJhdG9yQXJncy5saW5ld2lzZTsKICAgICAgICAgICAgbW9kZSA9IHZpbS52aXN1YWxCbG9jayA/ICdibG9jaycgOgogICAgICAgICAgICAgICAgICAgbGluZXdpc2UgPyAnbGluZScgOgogICAgICAgICAgICAgICAgICAgJ2NoYXInOwogICAgICAgICAgICBjbVNlbCA9IG1ha2VDbVNlbGVjdGlvbihjbSwgewogICAgICAgICAgICAgIGFuY2hvcjogY3VyU3RhcnQsCiAgICAgICAgICAgICAgaGVhZDogY3VyRW5kCiAgICAgICAgICAgIH0sIG1vZGUpOwogICAgICAgICAgICBpZiAobGluZXdpc2UpIHsKICAgICAgICAgICAgICB2YXIgcmFuZ2VzID0gY21TZWwucmFuZ2VzOwogICAgICAgICAgICAgIGlmIChtb2RlID09ICdibG9jaycpIHsKICAgICAgICAgICAgICAgIC8vIExpbmV3aXNlIG9wZXJhdG9ycyBpbiB2aXN1YWwgYmxvY2sgbW9kZSBleHRlbmQgdG8gZW5kIG9mIGxpbmUKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgIHJhbmdlc1tpXS5oZWFkLmNoID0gbGluZUxlbmd0aChjbSwgcmFuZ2VzW2ldLmhlYWQubGluZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSBlbHNlIGlmIChtb2RlID09ICdsaW5lJykgewogICAgICAgICAgICAgICAgcmFuZ2VzWzBdLmhlYWQgPSBQb3MocmFuZ2VzWzBdLmhlYWQubGluZSArIDEsIDApOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gSW5pdCBtb3Rpb24gb3AKICAgICAgICAgICAgY3VyU3RhcnQgPSBjb3B5Q3Vyc29yKG5ld0FuY2hvciB8fCBvbGRBbmNob3IpOwogICAgICAgICAgICBjdXJFbmQgPSBjb3B5Q3Vyc29yKG5ld0hlYWQgfHwgb2xkSGVhZCk7CiAgICAgICAgICAgIGlmIChjdXJzb3JJc0JlZm9yZShjdXJFbmQsIGN1clN0YXJ0KSkgewogICAgICAgICAgICAgIHZhciB0bXAgPSBjdXJTdGFydDsKICAgICAgICAgICAgICBjdXJTdGFydCA9IGN1ckVuZDsKICAgICAgICAgICAgICBjdXJFbmQgPSB0bXA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGluZXdpc2UgPSBtb3Rpb25BcmdzLmxpbmV3aXNlIHx8IG9wZXJhdG9yQXJncy5saW5ld2lzZTsKICAgICAgICAgICAgaWYgKGxpbmV3aXNlKSB7CiAgICAgICAgICAgICAgLy8gRXhwYW5kIHNlbGVjdGlvbiB0byBlbnRpcmUgbGluZS4KICAgICAgICAgICAgICBleHBhbmRTZWxlY3Rpb25Ub0xpbmUoY20sIGN1clN0YXJ0LCBjdXJFbmQpOwogICAgICAgICAgICB9IGVsc2UgaWYgKG1vdGlvbkFyZ3MuZm9yd2FyZCkgewogICAgICAgICAgICAgIC8vIENsaXAgdG8gdHJhaWxpbmcgbmV3bGluZXMgb25seSBpZiB0aGUgbW90aW9uIGdvZXMgZm9yd2FyZC4KICAgICAgICAgICAgICBjbGlwVG9MaW5lKGNtLCBjdXJTdGFydCwgY3VyRW5kKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBtb2RlID0gJ2NoYXInOwogICAgICAgICAgICB2YXIgZXhjbHVzaXZlID0gIW1vdGlvbkFyZ3MuaW5jbHVzaXZlIHx8IGxpbmV3aXNlOwogICAgICAgICAgICBjbVNlbCA9IG1ha2VDbVNlbGVjdGlvbihjbSwgewogICAgICAgICAgICAgIGFuY2hvcjogY3VyU3RhcnQsCiAgICAgICAgICAgICAgaGVhZDogY3VyRW5kCiAgICAgICAgICAgIH0sIG1vZGUsIGV4Y2x1c2l2ZSk7CiAgICAgICAgICB9CiAgICAgICAgICBjbS5zZXRTZWxlY3Rpb25zKGNtU2VsLnJhbmdlcywgY21TZWwucHJpbWFyeSk7CiAgICAgICAgICB2aW0ubGFzdE1vdGlvbiA9IG51bGw7CiAgICAgICAgICBvcGVyYXRvckFyZ3MucmVwZWF0ID0gcmVwZWF0OyAvLyBGb3IgaW5kZW50IGluIHZpc3VhbCBtb2RlLgogICAgICAgICAgb3BlcmF0b3JBcmdzLnJlZ2lzdGVyTmFtZSA9IHJlZ2lzdGVyTmFtZTsKICAgICAgICAgIC8vIEtlZXAgdHJhY2sgb2YgbGluZXdpc2UgYXMgaXQgYWZmZWN0cyBob3cgcGFzdGUgYW5kIGNoYW5nZSBiZWhhdmUuCiAgICAgICAgICBvcGVyYXRvckFyZ3MubGluZXdpc2UgPSBsaW5ld2lzZTsKICAgICAgICAgIHZhciBvcGVyYXRvck1vdmVUbyA9IG9wZXJhdG9yc1tvcGVyYXRvcl0oCiAgICAgICAgICAgIGNtLCBvcGVyYXRvckFyZ3MsIGNtU2VsLnJhbmdlcywgb2xkQW5jaG9yLCBuZXdIZWFkKTsKICAgICAgICAgIGlmICh2aW0udmlzdWFsTW9kZSkgewogICAgICAgICAgICBleGl0VmlzdWFsTW9kZShjbSwgb3BlcmF0b3JNb3ZlVG8gIT0gbnVsbCk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAob3BlcmF0b3JNb3ZlVG8pIHsKICAgICAgICAgICAgY20uc2V0Q3Vyc29yKG9wZXJhdG9yTW92ZVRvKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgIHJlY29yZExhc3RFZGl0OiBmdW5jdGlvbih2aW0sIGlucHV0U3RhdGUsIGFjdGlvbkNvbW1hbmQpIHsKICAgICAgICB2YXIgbWFjcm9Nb2RlU3RhdGUgPSB2aW1HbG9iYWxTdGF0ZS5tYWNyb01vZGVTdGF0ZTsKICAgICAgICBpZiAobWFjcm9Nb2RlU3RhdGUuaXNQbGF5aW5nKSB7IHJldHVybjsgfQogICAgICAgIHZpbS5sYXN0RWRpdElucHV0U3RhdGUgPSBpbnB1dFN0YXRlOwogICAgICAgIHZpbS5sYXN0RWRpdEFjdGlvbkNvbW1hbmQgPSBhY3Rpb25Db21tYW5kOwogICAgICAgIG1hY3JvTW9kZVN0YXRlLmxhc3RJbnNlcnRNb2RlQ2hhbmdlcy5jaGFuZ2VzID0gW107CiAgICAgICAgbWFjcm9Nb2RlU3RhdGUubGFzdEluc2VydE1vZGVDaGFuZ2VzLmV4cGVjdEN1cnNvckFjdGl2aXR5Rm9yQ2hhbmdlID0gZmFsc2U7CiAgICAgIH0KICAgIH07CgogICAgLyoqCiAgICAgKiB0eXBlZGVmIHtPYmplY3R7bGluZTpudW1iZXIsY2g6bnVtYmVyfX0gQ3Vyc29yIEFuIG9iamVjdCBjb250YWluaW5nIHRoZQogICAgICogICAgIHBvc2l0aW9uIG9mIHRoZSBjdXJzb3IuCiAgICAgKi8KICAgIC8vIEFsbCBvZiB0aGUgZnVuY3Rpb25zIGJlbG93IHJldHVybiBDdXJzb3Igb2JqZWN0cy4KICAgIHZhciBtb3Rpb25zID0gewogICAgICBtb3ZlVG9Ub3BMaW5lOiBmdW5jdGlvbihjbSwgX2hlYWQsIG1vdGlvbkFyZ3MpIHsKICAgICAgICB2YXIgbGluZSA9IGdldFVzZXJWaXNpYmxlTGluZXMoY20pLnRvcCArIG1vdGlvbkFyZ3MucmVwZWF0IC0xOwogICAgICAgIHJldHVybiBQb3MobGluZSwgZmluZEZpcnN0Tm9uV2hpdGVTcGFjZUNoYXJhY3RlcihjbS5nZXRMaW5lKGxpbmUpKSk7CiAgICAgIH0sCiAgICAgIG1vdmVUb01pZGRsZUxpbmU6IGZ1bmN0aW9uKGNtKSB7CiAgICAgICAgdmFyIHJhbmdlID0gZ2V0VXNlclZpc2libGVMaW5lcyhjbSk7CiAgICAgICAgdmFyIGxpbmUgPSBNYXRoLmZsb29yKChyYW5nZS50b3AgKyByYW5nZS5ib3R0b20pICogMC41KTsKICAgICAgICByZXR1cm4gUG9zKGxpbmUsIGZpbmRGaXJzdE5vbldoaXRlU3BhY2VDaGFyYWN0ZXIoY20uZ2V0TGluZShsaW5lKSkpOwogICAgICB9LAogICAgICBtb3ZlVG9Cb3R0b21MaW5lOiBmdW5jdGlvbihjbSwgX2hlYWQsIG1vdGlvbkFyZ3MpIHsKICAgICAgICB2YXIgbGluZSA9IGdldFVzZXJWaXNpYmxlTGluZXMoY20pLmJvdHRvbSAtIG1vdGlvbkFyZ3MucmVwZWF0ICsxOwogICAgICAgIHJldHVybiBQb3MobGluZSwgZmluZEZpcnN0Tm9uV2hpdGVTcGFjZUNoYXJhY3RlcihjbS5nZXRMaW5lKGxpbmUpKSk7CiAgICAgIH0sCiAgICAgIGV4cGFuZFRvTGluZTogZnVuY3Rpb24oX2NtLCBoZWFkLCBtb3Rpb25BcmdzKSB7CiAgICAgICAgLy8gRXhwYW5kcyBmb3J3YXJkIHRvIGVuZCBvZiBsaW5lLCBhbmQgdGhlbiB0byBuZXh0IGxpbmUgaWYgcmVwZWF0IGlzCiAgICAgICAgLy8gPjEuIERvZXMgbm90IGhhbmRsZSBiYWNrd2FyZCBtb3Rpb24hCiAgICAgICAgdmFyIGN1ciA9IGhlYWQ7CiAgICAgICAgcmV0dXJuIFBvcyhjdXIubGluZSArIG1vdGlvbkFyZ3MucmVwZWF0IC0gMSwgSW5maW5pdHkpOwogICAgICB9LAogICAgICBmaW5kTmV4dDogZnVuY3Rpb24oY20sIF9oZWFkLCBtb3Rpb25BcmdzKSB7CiAgICAgICAgdmFyIHN0YXRlID0gZ2V0U2VhcmNoU3RhdGUoY20pOwogICAgICAgIHZhciBxdWVyeSA9IHN0YXRlLmdldFF1ZXJ5KCk7CiAgICAgICAgaWYgKCFxdWVyeSkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB2YXIgcHJldiA9ICFtb3Rpb25BcmdzLmZvcndhcmQ7CiAgICAgICAgLy8gSWYgc2VhcmNoIGlzIGluaXRpYXRlZCB3aXRoID8gaW5zdGVhZCBvZiAvLCBuZWdhdGUgZGlyZWN0aW9uLgogICAgICAgIHByZXYgPSAoc3RhdGUuaXNSZXZlcnNlZCgpKSA/ICFwcmV2IDogcHJldjsKICAgICAgICBoaWdobGlnaHRTZWFyY2hNYXRjaGVzKGNtLCBxdWVyeSk7CiAgICAgICAgcmV0dXJuIGZpbmROZXh0KGNtLCBwcmV2LyoqIHByZXYgKi8sIHF1ZXJ5LCBtb3Rpb25BcmdzLnJlcGVhdCk7CiAgICAgIH0sCiAgICAgIGdvVG9NYXJrOiBmdW5jdGlvbihjbSwgX2hlYWQsIG1vdGlvbkFyZ3MsIHZpbSkgewogICAgICAgIHZhciBtYXJrID0gdmltLm1hcmtzW21vdGlvbkFyZ3Muc2VsZWN0ZWRDaGFyYWN0ZXJdOwogICAgICAgIGlmIChtYXJrKSB7CiAgICAgICAgICB2YXIgcG9zID0gbWFyay5maW5kKCk7CiAgICAgICAgICByZXR1cm4gbW90aW9uQXJncy5saW5ld2lzZSA/IHsgbGluZTogcG9zLmxpbmUsIGNoOiBmaW5kRmlyc3ROb25XaGl0ZVNwYWNlQ2hhcmFjdGVyKGNtLmdldExpbmUocG9zLmxpbmUpKSB9IDogcG9zOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfSwKICAgICAgbW92ZVRvT3RoZXJIaWdobGlnaHRlZEVuZDogZnVuY3Rpb24oY20sIF9oZWFkLCBtb3Rpb25BcmdzLCB2aW0pIHsKICAgICAgICBpZiAodmltLnZpc3VhbEJsb2NrICYmIG1vdGlvbkFyZ3Muc2FtZUxpbmUpIHsKICAgICAgICAgIHZhciBzZWwgPSB2aW0uc2VsOwogICAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgY2xpcEN1cnNvclRvQ29udGVudChjbSwgUG9zKHNlbC5hbmNob3IubGluZSwgc2VsLmhlYWQuY2gpKSwKICAgICAgICAgICAgY2xpcEN1cnNvclRvQ29udGVudChjbSwgUG9zKHNlbC5oZWFkLmxpbmUsIHNlbC5hbmNob3IuY2gpKQogICAgICAgICAgXTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIChbdmltLnNlbC5oZWFkLCB2aW0uc2VsLmFuY2hvcl0pOwogICAgICAgIH0KICAgICAgfSwKICAgICAganVtcFRvTWFyazogZnVuY3Rpb24oY20sIGhlYWQsIG1vdGlvbkFyZ3MsIHZpbSkgewogICAgICAgIHZhciBiZXN0ID0gaGVhZDsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1vdGlvbkFyZ3MucmVwZWF0OyBpKyspIHsKICAgICAgICAgIHZhciBjdXJzb3IgPSBiZXN0OwogICAgICAgICAgZm9yICh2YXIga2V5IGluIHZpbS5tYXJrcykgewogICAgICAgICAgICBpZiAoIWlzTG93ZXJDYXNlKGtleSkpIHsKICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgbWFyayA9IHZpbS5tYXJrc1trZXldLmZpbmQoKTsKICAgICAgICAgICAgdmFyIGlzV3JvbmdEaXJlY3Rpb24gPSAobW90aW9uQXJncy5mb3J3YXJkKSA/CiAgICAgICAgICAgICAgY3Vyc29ySXNCZWZvcmUobWFyaywgY3Vyc29yKSA6IGN1cnNvcklzQmVmb3JlKGN1cnNvciwgbWFyayk7CgogICAgICAgICAgICBpZiAoaXNXcm9uZ0RpcmVjdGlvbikgewogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChtb3Rpb25BcmdzLmxpbmV3aXNlICYmIChtYXJrLmxpbmUgPT0gY3Vyc29yLmxpbmUpKSB7CiAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBlcXVhbCA9IGN1cnNvckVxdWFsKGN1cnNvciwgYmVzdCk7CiAgICAgICAgICAgIHZhciBiZXR3ZWVuID0gKG1vdGlvbkFyZ3MuZm9yd2FyZCkgPwogICAgICAgICAgICAgIGN1cnNvcklzQmV0d2VlbihjdXJzb3IsIG1hcmssIGJlc3QpIDoKICAgICAgICAgICAgICBjdXJzb3JJc0JldHdlZW4oYmVzdCwgbWFyaywgY3Vyc29yKTsKCiAgICAgICAgICAgIGlmIChlcXVhbCB8fCBiZXR3ZWVuKSB7CiAgICAgICAgICAgICAgYmVzdCA9IG1hcms7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChtb3Rpb25BcmdzLmxpbmV3aXNlKSB7CiAgICAgICAgICAvLyBWaW0gcGxhY2VzIHRoZSBjdXJzb3Igb24gdGhlIGZpcnN0IG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlciBvZgogICAgICAgICAgLy8gdGhlIGxpbmUgaWYgdGhlcmUgaXMgb25lLCBlbHNlIGl0IHBsYWNlcyB0aGUgY3Vyc29yIGF0IHRoZSBlbmQKICAgICAgICAgIC8vIG9mIHRoZSBsaW5lLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgYSBtYXJrIHdhcyBmb3VuZC4KICAgICAgICAgIGJlc3QgPSBQb3MoYmVzdC5saW5lLCBmaW5kRmlyc3ROb25XaGl0ZVNwYWNlQ2hhcmFjdGVyKGNtLmdldExpbmUoYmVzdC5saW5lKSkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gYmVzdDsKICAgICAgfSwKICAgICAgbW92ZUJ5Q2hhcmFjdGVyczogZnVuY3Rpb24oX2NtLCBoZWFkLCBtb3Rpb25BcmdzKSB7CiAgICAgICAgdmFyIGN1ciA9IGhlYWQ7CiAgICAgICAgdmFyIHJlcGVhdCA9IG1vdGlvbkFyZ3MucmVwZWF0OwogICAgICAgIHZhciBjaCA9IG1vdGlvbkFyZ3MuZm9yd2FyZCA/IGN1ci5jaCArIHJlcGVhdCA6IGN1ci5jaCAtIHJlcGVhdDsKICAgICAgICByZXR1cm4gUG9zKGN1ci5saW5lLCBjaCk7CiAgICAgIH0sCiAgICAgIG1vdmVCeUxpbmVzOiBmdW5jdGlvbihjbSwgaGVhZCwgbW90aW9uQXJncywgdmltKSB7CiAgICAgICAgdmFyIGN1ciA9IGhlYWQ7CiAgICAgICAgdmFyIGVuZENoID0gY3VyLmNoOwogICAgICAgIC8vIERlcGVuZGluZyB3aGF0IG91ciBsYXN0IG1vdGlvbiB3YXMsIHdlIG1heSB3YW50IHRvIGRvIGRpZmZlcmVudAogICAgICAgIC8vIHRoaW5ncy4gSWYgb3VyIGxhc3QgbW90aW9uIHdhcyBtb3ZpbmcgdmVydGljYWxseSwgd2Ugd2FudCB0bwogICAgICAgIC8vIHByZXNlcnZlIHRoZSBIUG9zIGZyb20gb3VyIGxhc3QgaG9yaXpvbnRhbCBtb3ZlLiAgSWYgb3VyIGxhc3QgbW90aW9uCiAgICAgICAgLy8gd2FzIGdvaW5nIHRvIHRoZSBlbmQgb2YgYSBsaW5lLCBtb3ZpbmcgdmVydGljYWxseSB3ZSBzaG91bGQgZ28gdG8KICAgICAgICAvLyB0aGUgZW5kIG9mIHRoZSBsaW5lLCBldGMuCiAgICAgICAgc3dpdGNoICh2aW0ubGFzdE1vdGlvbikgewogICAgICAgICAgY2FzZSB0aGlzLm1vdmVCeUxpbmVzOgogICAgICAgICAgY2FzZSB0aGlzLm1vdmVCeURpc3BsYXlMaW5lczoKICAgICAgICAgIGNhc2UgdGhpcy5tb3ZlQnlTY3JvbGw6CiAgICAgICAgICBjYXNlIHRoaXMubW92ZVRvQ29sdW1uOgogICAgICAgICAgY2FzZSB0aGlzLm1vdmVUb0VvbDoKICAgICAgICAgICAgZW5kQ2ggPSB2aW0ubGFzdEhQb3M7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgdmltLmxhc3RIUG9zID0gZW5kQ2g7CiAgICAgICAgfQogICAgICAgIHZhciByZXBlYXQgPSBtb3Rpb25BcmdzLnJlcGVhdCsobW90aW9uQXJncy5yZXBlYXRPZmZzZXR8fDApOwogICAgICAgIHZhciBsaW5lID0gbW90aW9uQXJncy5mb3J3YXJkID8gY3VyLmxpbmUgKyByZXBlYXQgOiBjdXIubGluZSAtIHJlcGVhdDsKICAgICAgICB2YXIgZmlyc3QgPSBjbS5maXJzdExpbmUoKTsKICAgICAgICB2YXIgbGFzdCA9IGNtLmxhc3RMaW5lKCk7CiAgICAgICAgLy8gVmltIGdvIHRvIGxpbmUgYmVnaW4gb3IgbGluZSBlbmQgd2hlbiBjdXJzb3IgYXQgZmlyc3QvbGFzdCBsaW5lIGFuZAogICAgICAgIC8vIG1vdmUgdG8gcHJldmlvdXMvbmV4dCBsaW5lIGlzIHRyaWdnZXJlZC4KICAgICAgICBpZiAobGluZSA8IGZpcnN0ICYmIGN1ci5saW5lID09IGZpcnN0KXsKICAgICAgICAgIHJldHVybiB0aGlzLm1vdmVUb1N0YXJ0T2ZMaW5lKGNtLCBoZWFkLCBtb3Rpb25BcmdzLCB2aW0pOwogICAgICAgIH1lbHNlIGlmIChsaW5lID4gbGFzdCAmJiBjdXIubGluZSA9PSBsYXN0KXsKICAgICAgICAgICAgcmV0dXJuIHRoaXMubW92ZVRvRW9sKGNtLCBoZWFkLCBtb3Rpb25BcmdzLCB2aW0pOwogICAgICAgIH0KICAgICAgICBpZiAobW90aW9uQXJncy50b0ZpcnN0Q2hhcil7CiAgICAgICAgICBlbmRDaD1maW5kRmlyc3ROb25XaGl0ZVNwYWNlQ2hhcmFjdGVyKGNtLmdldExpbmUobGluZSkpOwogICAgICAgICAgdmltLmxhc3RIUG9zID0gZW5kQ2g7CiAgICAgICAgfQogICAgICAgIHZpbS5sYXN0SFNQb3MgPSBjbS5jaGFyQ29vcmRzKFBvcyhsaW5lLCBlbmRDaCksJ2RpdicpLmxlZnQ7CiAgICAgICAgcmV0dXJuIFBvcyhsaW5lLCBlbmRDaCk7CiAgICAgIH0sCiAgICAgIG1vdmVCeURpc3BsYXlMaW5lczogZnVuY3Rpb24oY20sIGhlYWQsIG1vdGlvbkFyZ3MsIHZpbSkgewogICAgICAgIHZhciBjdXIgPSBoZWFkOwogICAgICAgIHN3aXRjaCAodmltLmxhc3RNb3Rpb24pIHsKICAgICAgICAgIGNhc2UgdGhpcy5tb3ZlQnlEaXNwbGF5TGluZXM6CiAgICAgICAgICBjYXNlIHRoaXMubW92ZUJ5U2Nyb2xsOgogICAgICAgICAgY2FzZSB0aGlzLm1vdmVCeUxpbmVzOgogICAgICAgICAgY2FzZSB0aGlzLm1vdmVUb0NvbHVtbjoKICAgICAgICAgIGNhc2UgdGhpcy5tb3ZlVG9Fb2w6CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgdmltLmxhc3RIU1BvcyA9IGNtLmNoYXJDb29yZHMoY3VyLCdkaXYnKS5sZWZ0OwogICAgICAgIH0KICAgICAgICB2YXIgcmVwZWF0ID0gbW90aW9uQXJncy5yZXBlYXQ7CiAgICAgICAgdmFyIHJlcz1jbS5maW5kUG9zVihjdXIsKG1vdGlvbkFyZ3MuZm9yd2FyZCA/IHJlcGVhdCA6IC1yZXBlYXQpLCdsaW5lJyx2aW0ubGFzdEhTUG9zKTsKICAgICAgICBpZiAocmVzLmhpdFNpZGUpIHsKICAgICAgICAgIGlmIChtb3Rpb25BcmdzLmZvcndhcmQpIHsKICAgICAgICAgICAgdmFyIGxhc3RDaGFyQ29vcmRzID0gY20uY2hhckNvb3JkcyhyZXMsICdkaXYnKTsKICAgICAgICAgICAgdmFyIGdvYWxDb29yZHMgPSB7IHRvcDogbGFzdENoYXJDb29yZHMudG9wICsgOCwgbGVmdDogdmltLmxhc3RIU1BvcyB9OwogICAgICAgICAgICB2YXIgcmVzID0gY20uY29vcmRzQ2hhcihnb2FsQ29vcmRzLCAnZGl2Jyk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB2YXIgcmVzQ29vcmRzID0gY20uY2hhckNvb3JkcyhQb3MoY20uZmlyc3RMaW5lKCksIDApLCAnZGl2Jyk7CiAgICAgICAgICAgIHJlc0Nvb3Jkcy5sZWZ0ID0gdmltLmxhc3RIU1BvczsKICAgICAgICAgICAgcmVzID0gY20uY29vcmRzQ2hhcihyZXNDb29yZHMsICdkaXYnKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdmltLmxhc3RIUG9zID0gcmVzLmNoOwogICAgICAgIHJldHVybiByZXM7CiAgICAgIH0sCiAgICAgIG1vdmVCeVBhZ2U6IGZ1bmN0aW9uKGNtLCBoZWFkLCBtb3Rpb25BcmdzKSB7CiAgICAgICAgLy8gQ29kZU1pcnJvciBvbmx5IGV4cG9zZXMgZnVuY3Rpb25zIHRoYXQgbW92ZSB0aGUgY3Vyc29yIHBhZ2UgZG93biwgc28KICAgICAgICAvLyBkb2luZyB0aGlzIGJhZCBoYWNrIHRvIG1vdmUgdGhlIGN1cnNvciBhbmQgbW92ZSBpdCBiYWNrLiBldmFsSW5wdXQKICAgICAgICAvLyB3aWxsIG1vdmUgdGhlIGN1cnNvciB0byB3aGVyZSBpdCBzaG91bGQgYmUgaW4gdGhlIGVuZC4KICAgICAgICB2YXIgY3VyU3RhcnQgPSBoZWFkOwogICAgICAgIHZhciByZXBlYXQgPSBtb3Rpb25BcmdzLnJlcGVhdDsKICAgICAgICByZXR1cm4gY20uZmluZFBvc1YoY3VyU3RhcnQsIChtb3Rpb25BcmdzLmZvcndhcmQgPyByZXBlYXQgOiAtcmVwZWF0KSwgJ3BhZ2UnKTsKICAgICAgfSwKICAgICAgbW92ZUJ5UGFyYWdyYXBoOiBmdW5jdGlvbihjbSwgaGVhZCwgbW90aW9uQXJncykgewogICAgICAgIHZhciBkaXIgPSBtb3Rpb25BcmdzLmZvcndhcmQgPyAxIDogLTE7CiAgICAgICAgcmV0dXJuIGZpbmRQYXJhZ3JhcGgoY20sIGhlYWQsIG1vdGlvbkFyZ3MucmVwZWF0LCBkaXIpOwogICAgICB9LAogICAgICBtb3ZlQnlTY3JvbGw6IGZ1bmN0aW9uKGNtLCBoZWFkLCBtb3Rpb25BcmdzLCB2aW0pIHsKICAgICAgICB2YXIgc2Nyb2xsYm94ID0gY20uZ2V0U2Nyb2xsSW5mbygpOwogICAgICAgIHZhciBjdXJFbmQgPSBudWxsOwogICAgICAgIHZhciByZXBlYXQgPSBtb3Rpb25BcmdzLnJlcGVhdDsKICAgICAgICBpZiAoIXJlcGVhdCkgewogICAgICAgICAgcmVwZWF0ID0gc2Nyb2xsYm94LmNsaWVudEhlaWdodCAvICgyICogY20uZGVmYXVsdFRleHRIZWlnaHQoKSk7CiAgICAgICAgfQogICAgICAgIHZhciBvcmlnID0gY20uY2hhckNvb3JkcyhoZWFkLCAnbG9jYWwnKTsKICAgICAgICBtb3Rpb25BcmdzLnJlcGVhdCA9IHJlcGVhdDsKICAgICAgICB2YXIgY3VyRW5kID0gbW90aW9ucy5tb3ZlQnlEaXNwbGF5TGluZXMoY20sIGhlYWQsIG1vdGlvbkFyZ3MsIHZpbSk7CiAgICAgICAgaWYgKCFjdXJFbmQpIHsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICB2YXIgZGVzdCA9IGNtLmNoYXJDb29yZHMoY3VyRW5kLCAnbG9jYWwnKTsKICAgICAgICBjbS5zY3JvbGxUbyhudWxsLCBzY3JvbGxib3gudG9wICsgZGVzdC50b3AgLSBvcmlnLnRvcCk7CiAgICAgICAgcmV0dXJuIGN1ckVuZDsKICAgICAgfSwKICAgICAgbW92ZUJ5V29yZHM6IGZ1bmN0aW9uKGNtLCBoZWFkLCBtb3Rpb25BcmdzKSB7CiAgICAgICAgcmV0dXJuIG1vdmVUb1dvcmQoY20sIGhlYWQsIG1vdGlvbkFyZ3MucmVwZWF0LCAhIW1vdGlvbkFyZ3MuZm9yd2FyZCwKICAgICAgICAgICAgISFtb3Rpb25BcmdzLndvcmRFbmQsICEhbW90aW9uQXJncy5iaWdXb3JkKTsKICAgICAgfSwKICAgICAgbW92ZVRpbGxDaGFyYWN0ZXI6IGZ1bmN0aW9uKGNtLCBfaGVhZCwgbW90aW9uQXJncykgewogICAgICAgIHZhciByZXBlYXQgPSBtb3Rpb25BcmdzLnJlcGVhdDsKICAgICAgICB2YXIgY3VyRW5kID0gbW92ZVRvQ2hhcmFjdGVyKGNtLCByZXBlYXQsIG1vdGlvbkFyZ3MuZm9yd2FyZCwKICAgICAgICAgICAgbW90aW9uQXJncy5zZWxlY3RlZENoYXJhY3Rlcik7CiAgICAgICAgdmFyIGluY3JlbWVudCA9IG1vdGlvbkFyZ3MuZm9yd2FyZCA/IC0xIDogMTsKICAgICAgICByZWNvcmRMYXN0Q2hhcmFjdGVyU2VhcmNoKGluY3JlbWVudCwgbW90aW9uQXJncyk7CiAgICAgICAgaWYgKCFjdXJFbmQpIHJldHVybiBudWxsOwogICAgICAgIGN1ckVuZC5jaCArPSBpbmNyZW1lbnQ7CiAgICAgICAgcmV0dXJuIGN1ckVuZDsKICAgICAgfSwKICAgICAgbW92ZVRvQ2hhcmFjdGVyOiBmdW5jdGlvbihjbSwgaGVhZCwgbW90aW9uQXJncykgewogICAgICAgIHZhciByZXBlYXQgPSBtb3Rpb25BcmdzLnJlcGVhdDsKICAgICAgICByZWNvcmRMYXN0Q2hhcmFjdGVyU2VhcmNoKDAsIG1vdGlvbkFyZ3MpOwogICAgICAgIHJldHVybiBtb3ZlVG9DaGFyYWN0ZXIoY20sIHJlcGVhdCwgbW90aW9uQXJncy5mb3J3YXJkLAogICAgICAgICAgICBtb3Rpb25BcmdzLnNlbGVjdGVkQ2hhcmFjdGVyKSB8fCBoZWFkOwogICAgICB9LAogICAgICBtb3ZlVG9TeW1ib2w6IGZ1bmN0aW9uKGNtLCBoZWFkLCBtb3Rpb25BcmdzKSB7CiAgICAgICAgdmFyIHJlcGVhdCA9IG1vdGlvbkFyZ3MucmVwZWF0OwogICAgICAgIHJldHVybiBmaW5kU3ltYm9sKGNtLCByZXBlYXQsIG1vdGlvbkFyZ3MuZm9yd2FyZCwKICAgICAgICAgICAgbW90aW9uQXJncy5zZWxlY3RlZENoYXJhY3RlcikgfHwgaGVhZDsKICAgICAgfSwKICAgICAgbW92ZVRvQ29sdW1uOiBmdW5jdGlvbihjbSwgaGVhZCwgbW90aW9uQXJncywgdmltKSB7CiAgICAgICAgdmFyIHJlcGVhdCA9IG1vdGlvbkFyZ3MucmVwZWF0OwogICAgICAgIC8vIHJlcGVhdCBpcyBlcXVpdmFsZW50IHRvIHdoaWNoIGNvbHVtbiB3ZSB3YW50IHRvIG1vdmUgdG8hCiAgICAgICAgdmltLmxhc3RIUG9zID0gcmVwZWF0IC0gMTsKICAgICAgICB2aW0ubGFzdEhTUG9zID0gY20uY2hhckNvb3JkcyhoZWFkLCdkaXYnKS5sZWZ0OwogICAgICAgIHJldHVybiBtb3ZlVG9Db2x1bW4oY20sIHJlcGVhdCk7CiAgICAgIH0sCiAgICAgIG1vdmVUb0VvbDogZnVuY3Rpb24oY20sIGhlYWQsIG1vdGlvbkFyZ3MsIHZpbSkgewogICAgICAgIHZhciBjdXIgPSBoZWFkOwogICAgICAgIHZpbS5sYXN0SFBvcyA9IEluZmluaXR5OwogICAgICAgIHZhciByZXR2YWw9IFBvcyhjdXIubGluZSArIG1vdGlvbkFyZ3MucmVwZWF0IC0gMSwgSW5maW5pdHkpOwogICAgICAgIHZhciBlbmQ9Y20uY2xpcFBvcyhyZXR2YWwpOwogICAgICAgIGVuZC5jaC0tOwogICAgICAgIHZpbS5sYXN0SFNQb3MgPSBjbS5jaGFyQ29vcmRzKGVuZCwnZGl2JykubGVmdDsKICAgICAgICByZXR1cm4gcmV0dmFsOwogICAgICB9LAogICAgICBtb3ZlVG9GaXJzdE5vbldoaXRlU3BhY2VDaGFyYWN0ZXI6IGZ1bmN0aW9uKGNtLCBoZWFkKSB7CiAgICAgICAgLy8gR28gdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lIHdoZXJlIHRoZSB0ZXh0IGJlZ2lucywgb3IgdGhlIGVuZCBmb3IKICAgICAgICAvLyB3aGl0ZXNwYWNlLW9ubHkgbGluZXMKICAgICAgICB2YXIgY3Vyc29yID0gaGVhZDsKICAgICAgICByZXR1cm4gUG9zKGN1cnNvci5saW5lLAogICAgICAgICAgICAgICAgICAgZmluZEZpcnN0Tm9uV2hpdGVTcGFjZUNoYXJhY3RlcihjbS5nZXRMaW5lKGN1cnNvci5saW5lKSkpOwogICAgICB9LAogICAgICBtb3ZlVG9NYXRjaGVkU3ltYm9sOiBmdW5jdGlvbihjbSwgaGVhZCkgewogICAgICAgIHZhciBjdXJzb3IgPSBoZWFkOwogICAgICAgIHZhciBsaW5lID0gY3Vyc29yLmxpbmU7CiAgICAgICAgdmFyIGNoID0gY3Vyc29yLmNoOwogICAgICAgIHZhciBsaW5lVGV4dCA9IGNtLmdldExpbmUobGluZSk7CiAgICAgICAgdmFyIHN5bWJvbDsKICAgICAgICBkbyB7CiAgICAgICAgICBzeW1ib2wgPSBsaW5lVGV4dC5jaGFyQXQoY2grKyk7CiAgICAgICAgICBpZiAoc3ltYm9sICYmIGlzTWF0Y2hhYmxlU3ltYm9sKHN5bWJvbCkpIHsKICAgICAgICAgICAgdmFyIHN0eWxlID0gY20uZ2V0VG9rZW5UeXBlQXQoUG9zKGxpbmUsIGNoKSk7CiAgICAgICAgICAgIGlmIChzdHlsZSAhPT0gInN0cmluZyIgJiYgc3R5bGUgIT09ICJjb21tZW50IikgewogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSB3aGlsZSAoc3ltYm9sKTsKICAgICAgICBpZiAoc3ltYm9sKSB7CiAgICAgICAgICB2YXIgbWF0Y2hlZCA9IGNtLmZpbmRNYXRjaGluZ0JyYWNrZXQoUG9zKGxpbmUsIGNoKSk7CiAgICAgICAgICByZXR1cm4gbWF0Y2hlZC50bzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIGN1cnNvcjsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIG1vdmVUb1N0YXJ0T2ZMaW5lOiBmdW5jdGlvbihfY20sIGhlYWQpIHsKICAgICAgICByZXR1cm4gUG9zKGhlYWQubGluZSwgMCk7CiAgICAgIH0sCiAgICAgIG1vdmVUb0xpbmVPckVkZ2VPZkRvY3VtZW50OiBmdW5jdGlvbihjbSwgX2hlYWQsIG1vdGlvbkFyZ3MpIHsKICAgICAgICB2YXIgbGluZU51bSA9IG1vdGlvbkFyZ3MuZm9yd2FyZCA/IGNtLmxhc3RMaW5lKCkgOiBjbS5maXJzdExpbmUoKTsKICAgICAgICBpZiAobW90aW9uQXJncy5yZXBlYXRJc0V4cGxpY2l0KSB7CiAgICAgICAgICBsaW5lTnVtID0gbW90aW9uQXJncy5yZXBlYXQgLSBjbS5nZXRPcHRpb24oJ2ZpcnN0TGluZU51bWJlcicpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gUG9zKGxpbmVOdW0sCiAgICAgICAgICAgICAgICAgICBmaW5kRmlyc3ROb25XaGl0ZVNwYWNlQ2hhcmFjdGVyKGNtLmdldExpbmUobGluZU51bSkpKTsKICAgICAgfSwKICAgICAgdGV4dE9iamVjdE1hbmlwdWxhdGlvbjogZnVuY3Rpb24oY20sIGhlYWQsIG1vdGlvbkFyZ3MsIHZpbSkgewogICAgICAgIC8vIFRPRE86IGxvdHMgb2YgcG9zc2libGUgZXhjZXB0aW9ucyB0aGF0IGNhbiBiZSB0aHJvd24gaGVyZS4gVHJ5IGRhKAogICAgICAgIC8vICAgICBvdXRzaWRlIG9mIGEgKCkgYmxvY2suCgogICAgICAgIC8vIFRPRE86IGFkZGluZyA8PiA+PCB0byB0aGlzIG1hcCBkb2Vzbid0IHdvcmssIHByZXN1bWFibHkgYmVjYXVzZQogICAgICAgIC8vIHRoZXkncmUgb3BlcmF0b3JzCiAgICAgICAgdmFyIG1pcnJvcmVkUGFpcnMgPSB7JygnOiAnKScsICcpJzogJygnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICd7JzogJ30nLCAnfSc6ICd7JywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnWyc6ICddJywgJ10nOiAnWyd9OwogICAgICAgIHZhciBzZWxmUGFpcmVkID0geydcJyc6IHRydWUsICciJzogdHJ1ZX07CgogICAgICAgIHZhciBjaGFyYWN0ZXIgPSBtb3Rpb25BcmdzLnNlbGVjdGVkQ2hhcmFjdGVyOwogICAgICAgIC8vICdiJyByZWZlcnMgdG8gICcoKScgYmxvY2suCiAgICAgICAgLy8gJ0InIHJlZmVycyB0byAgJ3t9JyBibG9jay4KICAgICAgICBpZiAoY2hhcmFjdGVyID09ICdiJykgewogICAgICAgICAgY2hhcmFjdGVyID0gJygnOwogICAgICAgIH0gZWxzZSBpZiAoY2hhcmFjdGVyID09ICdCJykgewogICAgICAgICAgY2hhcmFjdGVyID0gJ3snOwogICAgICAgIH0KCiAgICAgICAgLy8gSW5jbHVzaXZlIGlzIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYSBhbmQgaQogICAgICAgIC8vIFRPRE86IEluc3RlYWQgb2YgdXNpbmcgdGhlIGFkZGl0aW9uYWwgdGV4dCBvYmplY3QgbWFwIHRvIHBlcmZvcm0gdGV4dAogICAgICAgIC8vICAgICBvYmplY3Qgb3BlcmF0aW9ucywgbWVyZ2UgdGhlIG1hcCBpbnRvIHRoZSBkZWZhdWx0S2V5TWFwIGFuZCB1c2UKICAgICAgICAvLyAgICAgbW90aW9uQXJncyB0byBkZWZpbmUgYmVoYXZpb3IuIERlZmluZSBzZXBhcmF0ZSBlbnRyaWVzIGZvciAnYXcnLAogICAgICAgIC8vICAgICAnaXcnLCAnYVsnLCAnaVsnLCBldGMuCiAgICAgICAgdmFyIGluY2x1c2l2ZSA9ICFtb3Rpb25BcmdzLnRleHRPYmplY3RJbm5lcjsKCiAgICAgICAgdmFyIHRtcDsKICAgICAgICBpZiAobWlycm9yZWRQYWlyc1tjaGFyYWN0ZXJdKSB7CiAgICAgICAgICB0bXAgPSBzZWxlY3RDb21wYW5pb25PYmplY3QoY20sIGhlYWQsIGNoYXJhY3RlciwgaW5jbHVzaXZlKTsKICAgICAgICB9IGVsc2UgaWYgKHNlbGZQYWlyZWRbY2hhcmFjdGVyXSkgewogICAgICAgICAgdG1wID0gZmluZEJlZ2lubmluZ0FuZEVuZChjbSwgaGVhZCwgY2hhcmFjdGVyLCBpbmNsdXNpdmUpOwogICAgICAgIH0gZWxzZSBpZiAoY2hhcmFjdGVyID09PSAnVycpIHsKICAgICAgICAgIHRtcCA9IGV4cGFuZFdvcmRVbmRlckN1cnNvcihjbSwgaW5jbHVzaXZlLCB0cnVlIC8qKiBmb3J3YXJkICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyoqIGJpZ1dvcmQgKi8pOwogICAgICAgIH0gZWxzZSBpZiAoY2hhcmFjdGVyID09PSAndycpIHsKICAgICAgICAgIHRtcCA9IGV4cGFuZFdvcmRVbmRlckN1cnNvcihjbSwgaW5jbHVzaXZlLCB0cnVlIC8qKiBmb3J3YXJkICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qKiBiaWdXb3JkICovKTsKICAgICAgICB9IGVsc2UgaWYgKGNoYXJhY3RlciA9PT0gJ3AnKSB7CiAgICAgICAgICB0bXAgPSBmaW5kUGFyYWdyYXBoKGNtLCBoZWFkLCBtb3Rpb25BcmdzLnJlcGVhdCwgMCwgaW5jbHVzaXZlKTsKICAgICAgICAgIG1vdGlvbkFyZ3MubGluZXdpc2UgPSB0cnVlOwogICAgICAgICAgaWYgKHZpbS52aXN1YWxNb2RlKSB7CiAgICAgICAgICAgIGlmICghdmltLnZpc3VhbExpbmUpIHsgdmltLnZpc3VhbExpbmUgPSB0cnVlOyB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB2YXIgb3BlcmF0b3JBcmdzID0gdmltLmlucHV0U3RhdGUub3BlcmF0b3JBcmdzOwogICAgICAgICAgICBpZiAob3BlcmF0b3JBcmdzKSB7IG9wZXJhdG9yQXJncy5saW5ld2lzZSA9IHRydWU7IH0KICAgICAgICAgICAgdG1wLmVuZC5saW5lLS07CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIE5vIHRleHQgb2JqZWN0IGRlZmluZWQgZm9yIHRoaXMsIGRvbid0IG1vdmUuCiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgIGlmICghY20uc3RhdGUudmltLnZpc3VhbE1vZGUpIHsKICAgICAgICAgIHJldHVybiBbdG1wLnN0YXJ0LCB0bXAuZW5kXTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIGV4cGFuZFNlbGVjdGlvbihjbSwgdG1wLnN0YXJ0LCB0bXAuZW5kKTsKICAgICAgICB9CiAgICAgIH0sCgogICAgICByZXBlYXRMYXN0Q2hhcmFjdGVyU2VhcmNoOiBmdW5jdGlvbihjbSwgaGVhZCwgbW90aW9uQXJncykgewogICAgICAgIHZhciBsYXN0U2VhcmNoID0gdmltR2xvYmFsU3RhdGUubGFzdENoYXJhY3RlclNlYXJjaDsKICAgICAgICB2YXIgcmVwZWF0ID0gbW90aW9uQXJncy5yZXBlYXQ7CiAgICAgICAgdmFyIGZvcndhcmQgPSBtb3Rpb25BcmdzLmZvcndhcmQgPT09IGxhc3RTZWFyY2guZm9yd2FyZDsKICAgICAgICB2YXIgaW5jcmVtZW50ID0gKGxhc3RTZWFyY2guaW5jcmVtZW50ID8gMSA6IDApICogKGZvcndhcmQgPyAtMSA6IDEpOwogICAgICAgIGNtLm1vdmVIKC1pbmNyZW1lbnQsICdjaGFyJyk7CiAgICAgICAgbW90aW9uQXJncy5pbmNsdXNpdmUgPSBmb3J3YXJkID8gdHJ1ZSA6IGZhbHNlOwogICAgICAgIHZhciBjdXJFbmQgPSBtb3ZlVG9DaGFyYWN0ZXIoY20sIHJlcGVhdCwgZm9yd2FyZCwgbGFzdFNlYXJjaC5zZWxlY3RlZENoYXJhY3Rlcik7CiAgICAgICAgaWYgKCFjdXJFbmQpIHsKICAgICAgICAgIGNtLm1vdmVIKGluY3JlbWVudCwgJ2NoYXInKTsKICAgICAgICAgIHJldHVybiBoZWFkOwogICAgICAgIH0KICAgICAgICBjdXJFbmQuY2ggKz0gaW5jcmVtZW50OwogICAgICAgIHJldHVybiBjdXJFbmQ7CiAgICAgIH0KICAgIH07CgogICAgZnVuY3Rpb24gZGVmaW5lTW90aW9uKG5hbWUsIGZuKSB7CiAgICAgIG1vdGlvbnNbbmFtZV0gPSBmbjsKICAgIH0KCiAgICBmdW5jdGlvbiBmaWxsQXJyYXkodmFsLCB0aW1lcykgewogICAgICB2YXIgYXJyID0gW107CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGltZXM7IGkrKykgewogICAgICAgIGFyci5wdXNoKHZhbCk7CiAgICAgIH0KICAgICAgcmV0dXJuIGFycjsKICAgIH0KICAgIC8qKgogICAgICogQW4gb3BlcmF0b3IgYWN0cyBvbiBhIHRleHQgc2VsZWN0aW9uLiBJdCByZWNlaXZlcyB0aGUgbGlzdCBvZiBzZWxlY3Rpb25zCiAgICAgKiBhcyBpbnB1dC4gVGhlIGNvcnJlc3BvbmRpbmcgQ29kZU1pcnJvciBzZWxlY3Rpb24gaXMgZ3VhcmFudGVlZCB0bwogICAgKiBtYXRjaCB0aGUgaW5wdXQgc2VsZWN0aW9uLgogICAgICovCiAgICB2YXIgb3BlcmF0b3JzID0gewogICAgICBjaGFuZ2U6IGZ1bmN0aW9uKGNtLCBhcmdzLCByYW5nZXMpIHsKICAgICAgICB2YXIgZmluYWxIZWFkLCB0ZXh0OwogICAgICAgIHZhciB2aW0gPSBjbS5zdGF0ZS52aW07CiAgICAgICAgdmltR2xvYmFsU3RhdGUubWFjcm9Nb2RlU3RhdGUubGFzdEluc2VydE1vZGVDaGFuZ2VzLmluVmlzdWFsQmxvY2sgPSB2aW0udmlzdWFsQmxvY2s7CiAgICAgICAgaWYgKCF2aW0udmlzdWFsTW9kZSkgewogICAgICAgICAgdmFyIGFuY2hvciA9IHJhbmdlc1swXS5hbmNob3IsCiAgICAgICAgICAgICAgaGVhZCA9IHJhbmdlc1swXS5oZWFkOwogICAgICAgICAgdGV4dCA9IGNtLmdldFJhbmdlKGFuY2hvciwgaGVhZCk7CiAgICAgICAgICB2YXIgbGFzdFN0YXRlID0gdmltLmxhc3RFZGl0SW5wdXRTdGF0ZSB8fCB7fTsKICAgICAgICAgIGlmIChsYXN0U3RhdGUubW90aW9uID09ICJtb3ZlQnlXb3JkcyIgJiYgIWlzV2hpdGVTcGFjZVN0cmluZyh0ZXh0KSkgewogICAgICAgICAgICAvLyBFeGNsdWRlIHRyYWlsaW5nIHdoaXRlc3BhY2UgaWYgdGhlIHJhbmdlIGlzIG5vdCBhbGwgd2hpdGVzcGFjZS4KICAgICAgICAgICAgdmFyIG1hdGNoID0gKC9ccyskLykuZXhlYyh0ZXh0KTsKICAgICAgICAgICAgaWYgKG1hdGNoICYmIGxhc3RTdGF0ZS5tb3Rpb25BcmdzICYmIGxhc3RTdGF0ZS5tb3Rpb25BcmdzLmZvcndhcmQpIHsKICAgICAgICAgICAgICBoZWFkID0gb2Zmc2V0Q3Vyc29yKGhlYWQsIDAsIC0gbWF0Y2hbMF0ubGVuZ3RoKTsKICAgICAgICAgICAgICB0ZXh0ID0gdGV4dC5zbGljZSgwLCAtIG1hdGNoWzBdLmxlbmd0aCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHZhciBwcmV2TGluZUVuZCA9IG5ldyBQb3MoYW5jaG9yLmxpbmUgLSAxLCBOdW1iZXIuTUFYX1ZBTFVFKTsKICAgICAgICAgIHZhciB3YXNMYXN0TGluZSA9IGNtLmZpcnN0TGluZSgpID09IGNtLmxhc3RMaW5lKCk7CiAgICAgICAgICBpZiAoaGVhZC5saW5lID4gY20ubGFzdExpbmUoKSAmJiBhcmdzLmxpbmV3aXNlICYmICF3YXNMYXN0TGluZSkgewogICAgICAgICAgICBjbS5yZXBsYWNlUmFuZ2UoJycsIHByZXZMaW5lRW5kLCBoZWFkKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNtLnJlcGxhY2VSYW5nZSgnJywgYW5jaG9yLCBoZWFkKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChhcmdzLmxpbmV3aXNlKSB7CiAgICAgICAgICAgIC8vIFB1c2ggdGhlIG5leHQgbGluZSBiYWNrIGRvd24sIGlmIHRoZXJlIGlzIGEgbmV4dCBsaW5lLgogICAgICAgICAgICBpZiAoIXdhc0xhc3RMaW5lKSB7CiAgICAgICAgICAgICAgY20uc2V0Q3Vyc29yKHByZXZMaW5lRW5kKTsKICAgICAgICAgICAgICBDb2RlTWlycm9yLmNvbW1hbmRzLm5ld2xpbmVBbmRJbmRlbnQoY20pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSBjdXJzb3IgZW5kcyB1cCBhdCB0aGUgZW5kIG9mIHRoZSBsaW5lLgogICAgICAgICAgICBhbmNob3IuY2ggPSBOdW1iZXIuTUFYX1ZBTFVFOwogICAgICAgICAgfQogICAgICAgICAgZmluYWxIZWFkID0gYW5jaG9yOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0ZXh0ID0gY20uZ2V0U2VsZWN0aW9uKCk7CiAgICAgICAgICB2YXIgcmVwbGFjZW1lbnQgPSBmaWxsQXJyYXkoJycsIHJhbmdlcy5sZW5ndGgpOwogICAgICAgICAgY20ucmVwbGFjZVNlbGVjdGlvbnMocmVwbGFjZW1lbnQpOwogICAgICAgICAgZmluYWxIZWFkID0gY3Vyc29yTWluKHJhbmdlc1swXS5oZWFkLCByYW5nZXNbMF0uYW5jaG9yKTsKICAgICAgICB9CiAgICAgICAgdmltR2xvYmFsU3RhdGUucmVnaXN0ZXJDb250cm9sbGVyLnB1c2hUZXh0KAogICAgICAgICAgICBhcmdzLnJlZ2lzdGVyTmFtZSwgJ2NoYW5nZScsIHRleHQsCiAgICAgICAgICAgIGFyZ3MubGluZXdpc2UsIHJhbmdlcy5sZW5ndGggPiAxKTsKICAgICAgICBhY3Rpb25zLmVudGVySW5zZXJ0TW9kZShjbSwge2hlYWQ6IGZpbmFsSGVhZH0sIGNtLnN0YXRlLnZpbSk7CiAgICAgIH0sCiAgICAgIC8vIGRlbGV0ZSBpcyBhIGphdmFzY3JpcHQga2V5d29yZC4KICAgICAgJ2RlbGV0ZSc6IGZ1bmN0aW9uKGNtLCBhcmdzLCByYW5nZXMpIHsKICAgICAgICB2YXIgZmluYWxIZWFkLCB0ZXh0OwogICAgICAgIHZhciB2aW0gPSBjbS5zdGF0ZS52aW07CiAgICAgICAgaWYgKCF2aW0udmlzdWFsQmxvY2spIHsKICAgICAgICAgIHZhciBhbmNob3IgPSByYW5nZXNbMF0uYW5jaG9yLAogICAgICAgICAgICAgIGhlYWQgPSByYW5nZXNbMF0uaGVhZDsKICAgICAgICAgIGlmIChhcmdzLmxpbmV3aXNlICYmCiAgICAgICAgICAgICAgaGVhZC5saW5lICE9IGNtLmZpcnN0TGluZSgpICYmCiAgICAgICAgICAgICAgYW5jaG9yLmxpbmUgPT0gY20ubGFzdExpbmUoKSAmJgogICAgICAgICAgICAgIGFuY2hvci5saW5lID09IGhlYWQubGluZSAtIDEpIHsKICAgICAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGZvciBkZCBvbiBsYXN0IGxpbmUgKGFuZCBmaXJzdCBsaW5lKS4KICAgICAgICAgICAgaWYgKGFuY2hvci5saW5lID09IGNtLmZpcnN0TGluZSgpKSB7CiAgICAgICAgICAgICAgYW5jaG9yLmNoID0gMDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBhbmNob3IgPSBQb3MoYW5jaG9yLmxpbmUgLSAxLCBsaW5lTGVuZ3RoKGNtLCBhbmNob3IubGluZSAtIDEpKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgdGV4dCA9IGNtLmdldFJhbmdlKGFuY2hvciwgaGVhZCk7CiAgICAgICAgICBjbS5yZXBsYWNlUmFuZ2UoJycsIGFuY2hvciwgaGVhZCk7CiAgICAgICAgICBmaW5hbEhlYWQgPSBhbmNob3I7CiAgICAgICAgICBpZiAoYXJncy5saW5ld2lzZSkgewogICAgICAgICAgICBmaW5hbEhlYWQgPSBtb3Rpb25zLm1vdmVUb0ZpcnN0Tm9uV2hpdGVTcGFjZUNoYXJhY3RlcihjbSwgYW5jaG9yKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGV4dCA9IGNtLmdldFNlbGVjdGlvbigpOwogICAgICAgICAgdmFyIHJlcGxhY2VtZW50ID0gZmlsbEFycmF5KCcnLCByYW5nZXMubGVuZ3RoKTsKICAgICAgICAgIGNtLnJlcGxhY2VTZWxlY3Rpb25zKHJlcGxhY2VtZW50KTsKICAgICAgICAgIGZpbmFsSGVhZCA9IHJhbmdlc1swXS5hbmNob3I7CiAgICAgICAgfQogICAgICAgIHZpbUdsb2JhbFN0YXRlLnJlZ2lzdGVyQ29udHJvbGxlci5wdXNoVGV4dCgKICAgICAgICAgICAgYXJncy5yZWdpc3Rlck5hbWUsICdkZWxldGUnLCB0ZXh0LAogICAgICAgICAgICBhcmdzLmxpbmV3aXNlLCB2aW0udmlzdWFsQmxvY2spOwogICAgICAgIHJldHVybiBjbGlwQ3Vyc29yVG9Db250ZW50KGNtLCBmaW5hbEhlYWQpOwogICAgICB9LAogICAgICBpbmRlbnQ6IGZ1bmN0aW9uKGNtLCBhcmdzLCByYW5nZXMpIHsKICAgICAgICB2YXIgdmltID0gY20uc3RhdGUudmltOwogICAgICAgIHZhciBzdGFydExpbmUgPSByYW5nZXNbMF0uYW5jaG9yLmxpbmU7CiAgICAgICAgdmFyIGVuZExpbmUgPSB2aW0udmlzdWFsQmxvY2sgPwogICAgICAgICAgcmFuZ2VzW3Jhbmdlcy5sZW5ndGggLSAxXS5hbmNob3IubGluZSA6CiAgICAgICAgICByYW5nZXNbMF0uaGVhZC5saW5lOwogICAgICAgIC8vIEluIHZpc3VhbCBtb2RlLCBuPiBzaGlmdHMgdGhlIHNlbGVjdGlvbiByaWdodCBuIHRpbWVzLCBpbnN0ZWFkIG9mCiAgICAgICAgLy8gc2hpZnRpbmcgbiBsaW5lcyByaWdodCBvbmNlLgogICAgICAgIHZhciByZXBlYXQgPSAodmltLnZpc3VhbE1vZGUpID8gYXJncy5yZXBlYXQgOiAxOwogICAgICAgIGlmIChhcmdzLmxpbmV3aXNlKSB7CiAgICAgICAgICAvLyBUaGUgb25seSB3YXkgdG8gZGVsZXRlIGEgbmV3bGluZSBpcyB0byBkZWxldGUgdW50aWwgdGhlIHN0YXJ0IG9mCiAgICAgICAgICAvLyB0aGUgbmV4dCBsaW5lLCBzbyBpbiBsaW5ld2lzZSBtb2RlIGV2YWxJbnB1dCB3aWxsIGluY2x1ZGUgdGhlIG5leHQKICAgICAgICAgIC8vIGxpbmUuIFdlIGRvbid0IHdhbnQgdGhpcyBpbiBpbmRlbnQsIHNvIHdlIGdvIGJhY2sgYSBsaW5lLgogICAgICAgICAgZW5kTGluZS0tOwogICAgICAgIH0KICAgICAgICBmb3IgKHZhciBpID0gc3RhcnRMaW5lOyBpIDw9IGVuZExpbmU7IGkrKykgewogICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCByZXBlYXQ7IGorKykgewogICAgICAgICAgICBjbS5pbmRlbnRMaW5lKGksIGFyZ3MuaW5kZW50UmlnaHQpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gbW90aW9ucy5tb3ZlVG9GaXJzdE5vbldoaXRlU3BhY2VDaGFyYWN0ZXIoY20sIHJhbmdlc1swXS5hbmNob3IpOwogICAgICB9LAogICAgICBjaGFuZ2VDYXNlOiBmdW5jdGlvbihjbSwgYXJncywgcmFuZ2VzLCBvbGRBbmNob3IsIG5ld0hlYWQpIHsKICAgICAgICB2YXIgc2VsZWN0aW9ucyA9IGNtLmdldFNlbGVjdGlvbnMoKTsKICAgICAgICB2YXIgc3dhcHBlZCA9IFtdOwogICAgICAgIHZhciB0b0xvd2VyID0gYXJncy50b0xvd2VyOwogICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgc2VsZWN0aW9ucy5sZW5ndGg7IGorKykgewogICAgICAgICAgdmFyIHRvU3dhcCA9IHNlbGVjdGlvbnNbal07CiAgICAgICAgICB2YXIgdGV4dCA9ICcnOwogICAgICAgICAgaWYgKHRvTG93ZXIgPT09IHRydWUpIHsKICAgICAgICAgICAgdGV4dCA9IHRvU3dhcC50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgfSBlbHNlIGlmICh0b0xvd2VyID09PSBmYWxzZSkgewogICAgICAgICAgICB0ZXh0ID0gdG9Td2FwLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRvU3dhcC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgIHZhciBjaGFyYWN0ZXIgPSB0b1N3YXAuY2hhckF0KGkpOwogICAgICAgICAgICAgIHRleHQgKz0gaXNVcHBlckNhc2UoY2hhcmFjdGVyKSA/IGNoYXJhY3Rlci50b0xvd2VyQ2FzZSgpIDoKICAgICAgICAgICAgICAgICAgY2hhcmFjdGVyLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHN3YXBwZWQucHVzaCh0ZXh0KTsKICAgICAgICB9CiAgICAgICAgY20ucmVwbGFjZVNlbGVjdGlvbnMoc3dhcHBlZCk7CiAgICAgICAgaWYgKGFyZ3Muc2hvdWxkTW92ZUN1cnNvcil7CiAgICAgICAgICByZXR1cm4gbmV3SGVhZDsKICAgICAgICB9IGVsc2UgaWYgKCFjbS5zdGF0ZS52aW0udmlzdWFsTW9kZSAmJiBhcmdzLmxpbmV3aXNlICYmIHJhbmdlc1swXS5hbmNob3IubGluZSArIDEgPT0gcmFuZ2VzWzBdLmhlYWQubGluZSkgewogICAgICAgICAgcmV0dXJuIG1vdGlvbnMubW92ZVRvRmlyc3ROb25XaGl0ZVNwYWNlQ2hhcmFjdGVyKGNtLCBvbGRBbmNob3IpOwogICAgICAgIH0gZWxzZSBpZiAoYXJncy5saW5ld2lzZSl7CiAgICAgICAgICByZXR1cm4gb2xkQW5jaG9yOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gY3Vyc29yTWluKHJhbmdlc1swXS5hbmNob3IsIHJhbmdlc1swXS5oZWFkKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIHlhbms6IGZ1bmN0aW9uKGNtLCBhcmdzLCByYW5nZXMsIG9sZEFuY2hvcikgewogICAgICAgIHZhciB2aW0gPSBjbS5zdGF0ZS52aW07CiAgICAgICAgdmFyIHRleHQgPSBjbS5nZXRTZWxlY3Rpb24oKTsKICAgICAgICB2YXIgZW5kUG9zID0gdmltLnZpc3VhbE1vZGUKICAgICAgICAgID8gY3Vyc29yTWluKHZpbS5zZWwuYW5jaG9yLCB2aW0uc2VsLmhlYWQsIHJhbmdlc1swXS5oZWFkLCByYW5nZXNbMF0uYW5jaG9yKQogICAgICAgICAgOiBvbGRBbmNob3I7CiAgICAgICAgdmltR2xvYmFsU3RhdGUucmVnaXN0ZXJDb250cm9sbGVyLnB1c2hUZXh0KAogICAgICAgICAgICBhcmdzLnJlZ2lzdGVyTmFtZSwgJ3lhbmsnLAogICAgICAgICAgICB0ZXh0LCBhcmdzLmxpbmV3aXNlLCB2aW0udmlzdWFsQmxvY2spOwogICAgICAgIHJldHVybiBlbmRQb3M7CiAgICAgIH0KICAgIH07CgogICAgZnVuY3Rpb24gZGVmaW5lT3BlcmF0b3IobmFtZSwgZm4pIHsKICAgICAgb3BlcmF0b3JzW25hbWVdID0gZm47CiAgICB9CgogICAgdmFyIGFjdGlvbnMgPSB7CiAgICAgIGp1bXBMaXN0V2FsazogZnVuY3Rpb24oY20sIGFjdGlvbkFyZ3MsIHZpbSkgewogICAgICAgIGlmICh2aW0udmlzdWFsTW9kZSkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB2YXIgcmVwZWF0ID0gYWN0aW9uQXJncy5yZXBlYXQ7CiAgICAgICAgdmFyIGZvcndhcmQgPSBhY3Rpb25BcmdzLmZvcndhcmQ7CiAgICAgICAgdmFyIGp1bXBMaXN0ID0gdmltR2xvYmFsU3RhdGUuanVtcExpc3Q7CgogICAgICAgIHZhciBtYXJrID0ganVtcExpc3QubW92ZShjbSwgZm9yd2FyZCA/IHJlcGVhdCA6IC1yZXBlYXQpOwogICAgICAgIHZhciBtYXJrUG9zID0gbWFyayA/IG1hcmsuZmluZCgpIDogdW5kZWZpbmVkOwogICAgICAgIG1hcmtQb3MgPSBtYXJrUG9zID8gbWFya1BvcyA6IGNtLmdldEN1cnNvcigpOwogICAgICAgIGNtLnNldEN1cnNvcihtYXJrUG9zKTsKICAgICAgfSwKICAgICAgc2Nyb2xsOiBmdW5jdGlvbihjbSwgYWN0aW9uQXJncywgdmltKSB7CiAgICAgICAgaWYgKHZpbS52aXN1YWxNb2RlKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHZhciByZXBlYXQgPSBhY3Rpb25BcmdzLnJlcGVhdCB8fCAxOwogICAgICAgIHZhciBsaW5lSGVpZ2h0ID0gY20uZGVmYXVsdFRleHRIZWlnaHQoKTsKICAgICAgICB2YXIgdG9wID0gY20uZ2V0U2Nyb2xsSW5mbygpLnRvcDsKICAgICAgICB2YXIgZGVsdGEgPSBsaW5lSGVpZ2h0ICogcmVwZWF0OwogICAgICAgIHZhciBuZXdQb3MgPSBhY3Rpb25BcmdzLmZvcndhcmQgPyB0b3AgKyBkZWx0YSA6IHRvcCAtIGRlbHRhOwogICAgICAgIHZhciBjdXJzb3IgPSBjb3B5Q3Vyc29yKGNtLmdldEN1cnNvcigpKTsKICAgICAgICB2YXIgY3Vyc29yQ29vcmRzID0gY20uY2hhckNvb3JkcyhjdXJzb3IsICdsb2NhbCcpOwogICAgICAgIGlmIChhY3Rpb25BcmdzLmZvcndhcmQpIHsKICAgICAgICAgIGlmIChuZXdQb3MgPiBjdXJzb3JDb29yZHMudG9wKSB7CiAgICAgICAgICAgICBjdXJzb3IubGluZSArPSAobmV3UG9zIC0gY3Vyc29yQ29vcmRzLnRvcCkgLyBsaW5lSGVpZ2h0OwogICAgICAgICAgICAgY3Vyc29yLmxpbmUgPSBNYXRoLmNlaWwoY3Vyc29yLmxpbmUpOwogICAgICAgICAgICAgY20uc2V0Q3Vyc29yKGN1cnNvcik7CiAgICAgICAgICAgICBjdXJzb3JDb29yZHMgPSBjbS5jaGFyQ29vcmRzKGN1cnNvciwgJ2xvY2FsJyk7CiAgICAgICAgICAgICBjbS5zY3JvbGxUbyhudWxsLCBjdXJzb3JDb29yZHMudG9wKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBDdXJzb3Igc3RheXMgd2l0aGluIGJvdW5kcy4gIEp1c3QgcmVwb3NpdGlvbiB0aGUgc2Nyb2xsIHdpbmRvdy4KICAgICAgICAgICAgIGNtLnNjcm9sbFRvKG51bGwsIG5ld1Bvcyk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHZhciBuZXdCb3R0b20gPSBuZXdQb3MgKyBjbS5nZXRTY3JvbGxJbmZvKCkuY2xpZW50SGVpZ2h0OwogICAgICAgICAgaWYgKG5ld0JvdHRvbSA8IGN1cnNvckNvb3Jkcy5ib3R0b20pIHsKICAgICAgICAgICAgIGN1cnNvci5saW5lIC09IChjdXJzb3JDb29yZHMuYm90dG9tIC0gbmV3Qm90dG9tKSAvIGxpbmVIZWlnaHQ7CiAgICAgICAgICAgICBjdXJzb3IubGluZSA9IE1hdGguZmxvb3IoY3Vyc29yLmxpbmUpOwogICAgICAgICAgICAgY20uc2V0Q3Vyc29yKGN1cnNvcik7CiAgICAgICAgICAgICBjdXJzb3JDb29yZHMgPSBjbS5jaGFyQ29vcmRzKGN1cnNvciwgJ2xvY2FsJyk7CiAgICAgICAgICAgICBjbS5zY3JvbGxUbygKICAgICAgICAgICAgICAgICBudWxsLCBjdXJzb3JDb29yZHMuYm90dG9tIC0gY20uZ2V0U2Nyb2xsSW5mbygpLmNsaWVudEhlaWdodCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gQ3Vyc29yIHN0YXlzIHdpdGhpbiBib3VuZHMuICBKdXN0IHJlcG9zaXRpb24gdGhlIHNjcm9sbCB3aW5kb3cuCiAgICAgICAgICAgICBjbS5zY3JvbGxUbyhudWxsLCBuZXdQb3MpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgc2Nyb2xsVG9DdXJzb3I6IGZ1bmN0aW9uKGNtLCBhY3Rpb25BcmdzKSB7CiAgICAgICAgdmFyIGxpbmVOdW0gPSBjbS5nZXRDdXJzb3IoKS5saW5lOwogICAgICAgIHZhciBjaGFyQ29vcmRzID0gY20uY2hhckNvb3JkcyhQb3MobGluZU51bSwgMCksICdsb2NhbCcpOwogICAgICAgIHZhciBoZWlnaHQgPSBjbS5nZXRTY3JvbGxJbmZvKCkuY2xpZW50SGVpZ2h0OwogICAgICAgIHZhciB5ID0gY2hhckNvb3Jkcy50b3A7CiAgICAgICAgdmFyIGxpbmVIZWlnaHQgPSBjaGFyQ29vcmRzLmJvdHRvbSAtIHk7CiAgICAgICAgc3dpdGNoIChhY3Rpb25BcmdzLnBvc2l0aW9uKSB7CiAgICAgICAgICBjYXNlICdjZW50ZXInOiB5ID0geSAtIChoZWlnaHQgLyAyKSArIGxpbmVIZWlnaHQ7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnYm90dG9tJzogeSA9IHkgLSBoZWlnaHQgKyBsaW5lSGVpZ2h0OwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgY20uc2Nyb2xsVG8obnVsbCwgeSk7CiAgICAgIH0sCiAgICAgIHJlcGxheU1hY3JvOiBmdW5jdGlvbihjbSwgYWN0aW9uQXJncywgdmltKSB7CiAgICAgICAgdmFyIHJlZ2lzdGVyTmFtZSA9IGFjdGlvbkFyZ3Muc2VsZWN0ZWRDaGFyYWN0ZXI7CiAgICAgICAgdmFyIHJlcGVhdCA9IGFjdGlvbkFyZ3MucmVwZWF0OwogICAgICAgIHZhciBtYWNyb01vZGVTdGF0ZSA9IHZpbUdsb2JhbFN0YXRlLm1hY3JvTW9kZVN0YXRlOwogICAgICAgIGlmIChyZWdpc3Rlck5hbWUgPT0gJ0AnKSB7CiAgICAgICAgICByZWdpc3Rlck5hbWUgPSBtYWNyb01vZGVTdGF0ZS5sYXRlc3RSZWdpc3RlcjsKICAgICAgICB9CiAgICAgICAgd2hpbGUocmVwZWF0LS0pewogICAgICAgICAgZXhlY3V0ZU1hY3JvUmVnaXN0ZXIoY20sIHZpbSwgbWFjcm9Nb2RlU3RhdGUsIHJlZ2lzdGVyTmFtZSk7CiAgICAgICAgfQogICAgICB9LAogICAgICBlbnRlck1hY3JvUmVjb3JkTW9kZTogZnVuY3Rpb24oY20sIGFjdGlvbkFyZ3MpIHsKICAgICAgICB2YXIgbWFjcm9Nb2RlU3RhdGUgPSB2aW1HbG9iYWxTdGF0ZS5tYWNyb01vZGVTdGF0ZTsKICAgICAgICB2YXIgcmVnaXN0ZXJOYW1lID0gYWN0aW9uQXJncy5zZWxlY3RlZENoYXJhY3RlcjsKICAgICAgICBtYWNyb01vZGVTdGF0ZS5lbnRlck1hY3JvUmVjb3JkTW9kZShjbSwgcmVnaXN0ZXJOYW1lKTsKICAgICAgfSwKICAgICAgdG9nZ2xlT3ZlcndyaXRlOiBmdW5jdGlvbihjbSkgewogICAgICAgIGlmICghY20uc3RhdGUub3ZlcndyaXRlKSB7CiAgICAgICAgICBjbS50b2dnbGVPdmVyd3JpdGUodHJ1ZSk7CiAgICAgICAgICBjbS5zZXRPcHRpb24oJ2tleU1hcCcsICd2aW0tcmVwbGFjZScpOwogICAgICAgICAgQ29kZU1pcnJvci5zaWduYWwoY20sICJ2aW0tbW9kZS1jaGFuZ2UiLCB7bW9kZTogInJlcGxhY2UifSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNtLnRvZ2dsZU92ZXJ3cml0ZShmYWxzZSk7CiAgICAgICAgICBjbS5zZXRPcHRpb24oJ2tleU1hcCcsICd2aW0taW5zZXJ0Jyk7CiAgICAgICAgICBDb2RlTWlycm9yLnNpZ25hbChjbSwgInZpbS1tb2RlLWNoYW5nZSIsIHttb2RlOiAiaW5zZXJ0In0pOwogICAgICAgIH0KICAgICAgfSwKICAgICAgZW50ZXJJbnNlcnRNb2RlOiBmdW5jdGlvbihjbSwgYWN0aW9uQXJncywgdmltKSB7CiAgICAgICAgaWYgKGNtLmdldE9wdGlvbigncmVhZE9ubHknKSkgeyByZXR1cm47IH0KICAgICAgICB2aW0uaW5zZXJ0TW9kZSA9IHRydWU7CiAgICAgICAgdmltLmluc2VydE1vZGVSZXBlYXQgPSBhY3Rpb25BcmdzICYmIGFjdGlvbkFyZ3MucmVwZWF0IHx8IDE7CiAgICAgICAgdmFyIGluc2VydEF0ID0gKGFjdGlvbkFyZ3MpID8gYWN0aW9uQXJncy5pbnNlcnRBdCA6IG51bGw7CiAgICAgICAgdmFyIHNlbCA9IHZpbS5zZWw7CiAgICAgICAgdmFyIGhlYWQgPSBhY3Rpb25BcmdzLmhlYWQgfHwgY20uZ2V0Q3Vyc29yKCdoZWFkJyk7CiAgICAgICAgdmFyIGhlaWdodCA9IGNtLmxpc3RTZWxlY3Rpb25zKCkubGVuZ3RoOwogICAgICAgIGlmIChpbnNlcnRBdCA9PSAnZW9sJykgewogICAgICAgICAgaGVhZCA9IFBvcyhoZWFkLmxpbmUsIGxpbmVMZW5ndGgoY20sIGhlYWQubGluZSkpOwogICAgICAgIH0gZWxzZSBpZiAoaW5zZXJ0QXQgPT0gJ2NoYXJBZnRlcicpIHsKICAgICAgICAgIGhlYWQgPSBvZmZzZXRDdXJzb3IoaGVhZCwgMCwgMSk7CiAgICAgICAgfSBlbHNlIGlmIChpbnNlcnRBdCA9PSAnZmlyc3ROb25CbGFuaycpIHsKICAgICAgICAgIGhlYWQgPSBtb3Rpb25zLm1vdmVUb0ZpcnN0Tm9uV2hpdGVTcGFjZUNoYXJhY3RlcihjbSwgaGVhZCk7CiAgICAgICAgfSBlbHNlIGlmIChpbnNlcnRBdCA9PSAnc3RhcnRPZlNlbGVjdGVkQXJlYScpIHsKICAgICAgICAgIGlmICghdmltLnZpc3VhbEJsb2NrKSB7CiAgICAgICAgICAgIGlmIChzZWwuaGVhZC5saW5lIDwgc2VsLmFuY2hvci5saW5lKSB7CiAgICAgICAgICAgICAgaGVhZCA9IHNlbC5oZWFkOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGhlYWQgPSBQb3Moc2VsLmFuY2hvci5saW5lLCAwKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaGVhZCA9IFBvcygKICAgICAgICAgICAgICAgIE1hdGgubWluKHNlbC5oZWFkLmxpbmUsIHNlbC5hbmNob3IubGluZSksCiAgICAgICAgICAgICAgICBNYXRoLm1pbihzZWwuaGVhZC5jaCwgc2VsLmFuY2hvci5jaCkpOwogICAgICAgICAgICBoZWlnaHQgPSBNYXRoLmFicyhzZWwuaGVhZC5saW5lIC0gc2VsLmFuY2hvci5saW5lKSArIDE7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChpbnNlcnRBdCA9PSAnZW5kT2ZTZWxlY3RlZEFyZWEnKSB7CiAgICAgICAgICBpZiAoIXZpbS52aXN1YWxCbG9jaykgewogICAgICAgICAgICBpZiAoc2VsLmhlYWQubGluZSA+PSBzZWwuYW5jaG9yLmxpbmUpIHsKICAgICAgICAgICAgICBoZWFkID0gb2Zmc2V0Q3Vyc29yKHNlbC5oZWFkLCAwLCAxKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBoZWFkID0gUG9zKHNlbC5hbmNob3IubGluZSwgMCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGhlYWQgPSBQb3MoCiAgICAgICAgICAgICAgICBNYXRoLm1pbihzZWwuaGVhZC5saW5lLCBzZWwuYW5jaG9yLmxpbmUpLAogICAgICAgICAgICAgICAgTWF0aC5tYXgoc2VsLmhlYWQuY2ggKyAxLCBzZWwuYW5jaG9yLmNoKSk7CiAgICAgICAgICAgIGhlaWdodCA9IE1hdGguYWJzKHNlbC5oZWFkLmxpbmUgLSBzZWwuYW5jaG9yLmxpbmUpICsgMTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKGluc2VydEF0ID09ICdpbnBsYWNlJykgewogICAgICAgICAgaWYgKHZpbS52aXN1YWxNb2RlKXsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjbS5zZXRPcHRpb24oJ2Rpc2FibGVJbnB1dCcsIGZhbHNlKTsKICAgICAgICBpZiAoYWN0aW9uQXJncyAmJiBhY3Rpb25BcmdzLnJlcGxhY2UpIHsKICAgICAgICAgIC8vIEhhbmRsZSBSZXBsYWNlLW1vZGUgYXMgYSBzcGVjaWFsIGNhc2Ugb2YgaW5zZXJ0IG1vZGUuCiAgICAgICAgICBjbS50b2dnbGVPdmVyd3JpdGUodHJ1ZSk7CiAgICAgICAgICBjbS5zZXRPcHRpb24oJ2tleU1hcCcsICd2aW0tcmVwbGFjZScpOwogICAgICAgICAgQ29kZU1pcnJvci5zaWduYWwoY20sICJ2aW0tbW9kZS1jaGFuZ2UiLCB7bW9kZTogInJlcGxhY2UifSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNtLnRvZ2dsZU92ZXJ3cml0ZShmYWxzZSk7CiAgICAgICAgICBjbS5zZXRPcHRpb24oJ2tleU1hcCcsICd2aW0taW5zZXJ0Jyk7CiAgICAgICAgICBDb2RlTWlycm9yLnNpZ25hbChjbSwgInZpbS1tb2RlLWNoYW5nZSIsIHttb2RlOiAiaW5zZXJ0In0pOwogICAgICAgIH0KICAgICAgICBpZiAoIXZpbUdsb2JhbFN0YXRlLm1hY3JvTW9kZVN0YXRlLmlzUGxheWluZykgewogICAgICAgICAgLy8gT25seSByZWNvcmQgaWYgbm90IHJlcGxheWluZy4KICAgICAgICAgIGNtLm9uKCdjaGFuZ2UnLCBvbkNoYW5nZSk7CiAgICAgICAgICBDb2RlTWlycm9yLm9uKGNtLmdldElucHV0RmllbGQoKSwgJ2tleWRvd24nLCBvbktleUV2ZW50VGFyZ2V0S2V5RG93bik7CiAgICAgICAgfQogICAgICAgIGlmICh2aW0udmlzdWFsTW9kZSkgewogICAgICAgICAgZXhpdFZpc3VhbE1vZGUoY20pOwogICAgICAgIH0KICAgICAgICBzZWxlY3RGb3JJbnNlcnQoY20sIGhlYWQsIGhlaWdodCk7CiAgICAgIH0sCiAgICAgIHRvZ2dsZVZpc3VhbE1vZGU6IGZ1bmN0aW9uKGNtLCBhY3Rpb25BcmdzLCB2aW0pIHsKICAgICAgICB2YXIgcmVwZWF0ID0gYWN0aW9uQXJncy5yZXBlYXQ7CiAgICAgICAgdmFyIGFuY2hvciA9IGNtLmdldEN1cnNvcigpOwogICAgICAgIHZhciBoZWFkOwogICAgICAgIC8vIFRPRE86IFRoZSByZXBlYXQgc2hvdWxkIGFjdHVhbGx5IHNlbGVjdCBudW1iZXIgb2YgY2hhcmFjdGVycy9saW5lcwogICAgICAgIC8vICAgICBlcXVhbCB0byB0aGUgcmVwZWF0IHRpbWVzIHRoZSBzaXplIG9mIHRoZSBwcmV2aW91cyB2aXN1YWwKICAgICAgICAvLyAgICAgb3BlcmF0aW9uLgogICAgICAgIGlmICghdmltLnZpc3VhbE1vZGUpIHsKICAgICAgICAgIC8vIEVudGVyaW5nIHZpc3VhbCBtb2RlCiAgICAgICAgICB2aW0udmlzdWFsTW9kZSA9IHRydWU7CiAgICAgICAgICB2aW0udmlzdWFsTGluZSA9ICEhYWN0aW9uQXJncy5saW5ld2lzZTsKICAgICAgICAgIHZpbS52aXN1YWxCbG9jayA9ICEhYWN0aW9uQXJncy5ibG9ja3dpc2U7CiAgICAgICAgICBoZWFkID0gY2xpcEN1cnNvclRvQ29udGVudCgKICAgICAgICAgICAgICBjbSwgUG9zKGFuY2hvci5saW5lLCBhbmNob3IuY2ggKyByZXBlYXQgLSAxKSwKICAgICAgICAgICAgICB0cnVlIC8qKiBpbmNsdWRlTGluZUJyZWFrICovKTsKICAgICAgICAgIHZpbS5zZWwgPSB7CiAgICAgICAgICAgIGFuY2hvcjogYW5jaG9yLAogICAgICAgICAgICBoZWFkOiBoZWFkCiAgICAgICAgICB9OwogICAgICAgICAgQ29kZU1pcnJvci5zaWduYWwoY20sICJ2aW0tbW9kZS1jaGFuZ2UiLCB7bW9kZTogInZpc3VhbCIsIHN1Yk1vZGU6IHZpbS52aXN1YWxMaW5lID8gImxpbmV3aXNlIiA6IHZpbS52aXN1YWxCbG9jayA/ICJibG9ja3dpc2UiIDogIiJ9KTsKICAgICAgICAgIHVwZGF0ZUNtU2VsZWN0aW9uKGNtKTsKICAgICAgICAgIHVwZGF0ZU1hcmsoY20sIHZpbSwgJzwnLCBjdXJzb3JNaW4oYW5jaG9yLCBoZWFkKSk7CiAgICAgICAgICB1cGRhdGVNYXJrKGNtLCB2aW0sICc+JywgY3Vyc29yTWF4KGFuY2hvciwgaGVhZCkpOwogICAgICAgIH0gZWxzZSBpZiAodmltLnZpc3VhbExpbmUgXiBhY3Rpb25BcmdzLmxpbmV3aXNlIHx8CiAgICAgICAgICAgIHZpbS52aXN1YWxCbG9jayBeIGFjdGlvbkFyZ3MuYmxvY2t3aXNlKSB7CiAgICAgICAgICAvLyBUb2dnbGluZyBiZXR3ZWVuIG1vZGVzCiAgICAgICAgICB2aW0udmlzdWFsTGluZSA9ICEhYWN0aW9uQXJncy5saW5ld2lzZTsKICAgICAgICAgIHZpbS52aXN1YWxCbG9jayA9ICEhYWN0aW9uQXJncy5ibG9ja3dpc2U7CiAgICAgICAgICBDb2RlTWlycm9yLnNpZ25hbChjbSwgInZpbS1tb2RlLWNoYW5nZSIsIHttb2RlOiAidmlzdWFsIiwgc3ViTW9kZTogdmltLnZpc3VhbExpbmUgPyAibGluZXdpc2UiIDogdmltLnZpc3VhbEJsb2NrID8gImJsb2Nrd2lzZSIgOiAiIn0pOwogICAgICAgICAgdXBkYXRlQ21TZWxlY3Rpb24oY20pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBleGl0VmlzdWFsTW9kZShjbSk7CiAgICAgICAgfQogICAgICB9LAogICAgICByZXNlbGVjdExhc3RTZWxlY3Rpb246IGZ1bmN0aW9uKGNtLCBfYWN0aW9uQXJncywgdmltKSB7CiAgICAgICAgdmFyIGxhc3RTZWxlY3Rpb24gPSB2aW0ubGFzdFNlbGVjdGlvbjsKICAgICAgICBpZiAodmltLnZpc3VhbE1vZGUpIHsKICAgICAgICAgIHVwZGF0ZUxhc3RTZWxlY3Rpb24oY20sIHZpbSk7CiAgICAgICAgfQogICAgICAgIGlmIChsYXN0U2VsZWN0aW9uKSB7CiAgICAgICAgICB2YXIgYW5jaG9yID0gbGFzdFNlbGVjdGlvbi5hbmNob3JNYXJrLmZpbmQoKTsKICAgICAgICAgIHZhciBoZWFkID0gbGFzdFNlbGVjdGlvbi5oZWFkTWFyay5maW5kKCk7CiAgICAgICAgICBpZiAoIWFuY2hvciB8fCAhaGVhZCkgewogICAgICAgICAgICAvLyBJZiB0aGUgbWFya3MgaGF2ZSBiZWVuIGRlc3Ryb3llZCBkdWUgdG8gZWRpdHMsIGRvIG5vdGhpbmcuCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIHZpbS5zZWwgPSB7CiAgICAgICAgICAgIGFuY2hvcjogYW5jaG9yLAogICAgICAgICAgICBoZWFkOiBoZWFkCiAgICAgICAgICB9OwogICAgICAgICAgdmltLnZpc3VhbE1vZGUgPSB0cnVlOwogICAgICAgICAgdmltLnZpc3VhbExpbmUgPSBsYXN0U2VsZWN0aW9uLnZpc3VhbExpbmU7CiAgICAgICAgICB2aW0udmlzdWFsQmxvY2sgPSBsYXN0U2VsZWN0aW9uLnZpc3VhbEJsb2NrOwogICAgICAgICAgdXBkYXRlQ21TZWxlY3Rpb24oY20pOwogICAgICAgICAgdXBkYXRlTWFyayhjbSwgdmltLCAnPCcsIGN1cnNvck1pbihhbmNob3IsIGhlYWQpKTsKICAgICAgICAgIHVwZGF0ZU1hcmsoY20sIHZpbSwgJz4nLCBjdXJzb3JNYXgoYW5jaG9yLCBoZWFkKSk7CiAgICAgICAgICBDb2RlTWlycm9yLnNpZ25hbChjbSwgJ3ZpbS1tb2RlLWNoYW5nZScsIHsKICAgICAgICAgICAgbW9kZTogJ3Zpc3VhbCcsCiAgICAgICAgICAgIHN1Yk1vZGU6IHZpbS52aXN1YWxMaW5lID8gJ2xpbmV3aXNlJyA6CiAgICAgICAgICAgICAgICAgICAgIHZpbS52aXN1YWxCbG9jayA/ICdibG9ja3dpc2UnIDogJyd9KTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGpvaW5MaW5lczogZnVuY3Rpb24oY20sIGFjdGlvbkFyZ3MsIHZpbSkgewogICAgICAgIHZhciBjdXJTdGFydCwgY3VyRW5kOwogICAgICAgIGlmICh2aW0udmlzdWFsTW9kZSkgewogICAgICAgICAgY3VyU3RhcnQgPSBjbS5nZXRDdXJzb3IoJ2FuY2hvcicpOwogICAgICAgICAgY3VyRW5kID0gY20uZ2V0Q3Vyc29yKCdoZWFkJyk7CiAgICAgICAgICBpZiAoY3Vyc29ySXNCZWZvcmUoY3VyRW5kLCBjdXJTdGFydCkpIHsKICAgICAgICAgICAgdmFyIHRtcCA9IGN1ckVuZDsKICAgICAgICAgICAgY3VyRW5kID0gY3VyU3RhcnQ7CiAgICAgICAgICAgIGN1clN0YXJ0ID0gdG1wOwogICAgICAgICAgfQogICAgICAgICAgY3VyRW5kLmNoID0gbGluZUxlbmd0aChjbSwgY3VyRW5kLmxpbmUpIC0gMTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gUmVwZWF0IGlzIHRoZSBudW1iZXIgb2YgbGluZXMgdG8gam9pbi4gTWluaW11bSAyIGxpbmVzLgogICAgICAgICAgdmFyIHJlcGVhdCA9IE1hdGgubWF4KGFjdGlvbkFyZ3MucmVwZWF0LCAyKTsKICAgICAgICAgIGN1clN0YXJ0ID0gY20uZ2V0Q3Vyc29yKCk7CiAgICAgICAgICBjdXJFbmQgPSBjbGlwQ3Vyc29yVG9Db250ZW50KGNtLCBQb3MoY3VyU3RhcnQubGluZSArIHJlcGVhdCAtIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5maW5pdHkpKTsKICAgICAgICB9CiAgICAgICAgdmFyIGZpbmFsQ2ggPSAwOwogICAgICAgIGZvciAodmFyIGkgPSBjdXJTdGFydC5saW5lOyBpIDwgY3VyRW5kLmxpbmU7IGkrKykgewogICAgICAgICAgZmluYWxDaCA9IGxpbmVMZW5ndGgoY20sIGN1clN0YXJ0LmxpbmUpOwogICAgICAgICAgdmFyIHRtcCA9IFBvcyhjdXJTdGFydC5saW5lICsgMSwKICAgICAgICAgICAgICAgICAgICAgICAgbGluZUxlbmd0aChjbSwgY3VyU3RhcnQubGluZSArIDEpKTsKICAgICAgICAgIHZhciB0ZXh0ID0gY20uZ2V0UmFuZ2UoY3VyU3RhcnQsIHRtcCk7CiAgICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC9cblxzKi9nLCAnICcpOwogICAgICAgICAgY20ucmVwbGFjZVJhbmdlKHRleHQsIGN1clN0YXJ0LCB0bXApOwogICAgICAgIH0KICAgICAgICB2YXIgY3VyRmluYWxQb3MgPSBQb3MoY3VyU3RhcnQubGluZSwgZmluYWxDaCk7CiAgICAgICAgaWYgKHZpbS52aXN1YWxNb2RlKSB7CiAgICAgICAgICBleGl0VmlzdWFsTW9kZShjbSwgZmFsc2UpOwogICAgICAgIH0KICAgICAgICBjbS5zZXRDdXJzb3IoY3VyRmluYWxQb3MpOwogICAgICB9LAogICAgICBuZXdMaW5lQW5kRW50ZXJJbnNlcnRNb2RlOiBmdW5jdGlvbihjbSwgYWN0aW9uQXJncywgdmltKSB7CiAgICAgICAgdmltLmluc2VydE1vZGUgPSB0cnVlOwogICAgICAgIHZhciBpbnNlcnRBdCA9IGNvcHlDdXJzb3IoY20uZ2V0Q3Vyc29yKCkpOwogICAgICAgIGlmIChpbnNlcnRBdC5saW5lID09PSBjbS5maXJzdExpbmUoKSAmJiAhYWN0aW9uQXJncy5hZnRlcikgewogICAgICAgICAgLy8gU3BlY2lhbCBjYXNlIGZvciBpbnNlcnRpbmcgbmV3bGluZSBiZWZvcmUgc3RhcnQgb2YgZG9jdW1lbnQuCiAgICAgICAgICBjbS5yZXBsYWNlUmFuZ2UoJ1xuJywgUG9zKGNtLmZpcnN0TGluZSgpLCAwKSk7CiAgICAgICAgICBjbS5zZXRDdXJzb3IoY20uZmlyc3RMaW5lKCksIDApOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpbnNlcnRBdC5saW5lID0gKGFjdGlvbkFyZ3MuYWZ0ZXIpID8gaW5zZXJ0QXQubGluZSA6CiAgICAgICAgICAgICAgaW5zZXJ0QXQubGluZSAtIDE7CiAgICAgICAgICBpbnNlcnRBdC5jaCA9IGxpbmVMZW5ndGgoY20sIGluc2VydEF0LmxpbmUpOwogICAgICAgICAgY20uc2V0Q3Vyc29yKGluc2VydEF0KTsKICAgICAgICAgIHZhciBuZXdsaW5lRm4gPSBDb2RlTWlycm9yLmNvbW1hbmRzLm5ld2xpbmVBbmRJbmRlbnRDb250aW51ZUNvbW1lbnQgfHwKICAgICAgICAgICAgICBDb2RlTWlycm9yLmNvbW1hbmRzLm5ld2xpbmVBbmRJbmRlbnQ7CiAgICAgICAgICBuZXdsaW5lRm4oY20pOwogICAgICAgIH0KICAgICAgICB0aGlzLmVudGVySW5zZXJ0TW9kZShjbSwgeyByZXBlYXQ6IGFjdGlvbkFyZ3MucmVwZWF0IH0sIHZpbSk7CiAgICAgIH0sCiAgICAgIHBhc3RlOiBmdW5jdGlvbihjbSwgYWN0aW9uQXJncywgdmltKSB7CiAgICAgICAgdmFyIGN1ciA9IGNvcHlDdXJzb3IoY20uZ2V0Q3Vyc29yKCkpOwogICAgICAgIHZhciByZWdpc3RlciA9IHZpbUdsb2JhbFN0YXRlLnJlZ2lzdGVyQ29udHJvbGxlci5nZXRSZWdpc3RlcigKICAgICAgICAgICAgYWN0aW9uQXJncy5yZWdpc3Rlck5hbWUpOwogICAgICAgIHZhciB0ZXh0ID0gcmVnaXN0ZXIudG9TdHJpbmcoKTsKICAgICAgICBpZiAoIXRleHQpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKGFjdGlvbkFyZ3MubWF0Y2hJbmRlbnQpIHsKICAgICAgICAgIHZhciB0YWJTaXplID0gY20uZ2V0T3B0aW9uKCJ0YWJTaXplIik7CiAgICAgICAgICAvLyBsZW5ndGggdGhhdCBjb25zaWRlcnMgdGFicyBhbmQgdGFiU2l6ZQogICAgICAgICAgdmFyIHdoaXRlc3BhY2VMZW5ndGggPSBmdW5jdGlvbihzdHIpIHsKICAgICAgICAgICAgdmFyIHRhYnMgPSAoc3RyLnNwbGl0KCJcdCIpLmxlbmd0aCAtIDEpOwogICAgICAgICAgICB2YXIgc3BhY2VzID0gKHN0ci5zcGxpdCgiICIpLmxlbmd0aCAtIDEpOwogICAgICAgICAgICByZXR1cm4gdGFicyAqIHRhYlNpemUgKyBzcGFjZXMgKiAxOwogICAgICAgICAgfTsKICAgICAgICAgIHZhciBjdXJyZW50TGluZSA9IGNtLmdldExpbmUoY20uZ2V0Q3Vyc29yKCkubGluZSk7CiAgICAgICAgICB2YXIgaW5kZW50ID0gd2hpdGVzcGFjZUxlbmd0aChjdXJyZW50TGluZS5tYXRjaCgvXlxzKi8pWzBdKTsKICAgICAgICAgIC8vIGNob21wIGxhc3QgbmV3bGluZSBiL2MgZG9uJ3Qgd2FudCBpdCB0byBtYXRjaCAvXlxzKi9nbQogICAgICAgICAgdmFyIGNob21wZWRUZXh0ID0gdGV4dC5yZXBsYWNlKC9cbiQvLCAnJyk7CiAgICAgICAgICB2YXIgd2FzQ2hvbXBlZCA9IHRleHQgIT09IGNob21wZWRUZXh0OwogICAgICAgICAgdmFyIGZpcnN0SW5kZW50ID0gd2hpdGVzcGFjZUxlbmd0aCh0ZXh0Lm1hdGNoKC9eXHMqLylbMF0pOwogICAgICAgICAgdmFyIHRleHQgPSBjaG9tcGVkVGV4dC5yZXBsYWNlKC9eXHMqL2dtLCBmdW5jdGlvbih3c3BhY2UpIHsKICAgICAgICAgICAgdmFyIG5ld0luZGVudCA9IGluZGVudCArICh3aGl0ZXNwYWNlTGVuZ3RoKHdzcGFjZSkgLSBmaXJzdEluZGVudCk7CiAgICAgICAgICAgIGlmIChuZXdJbmRlbnQgPCAwKSB7CiAgICAgICAgICAgICAgcmV0dXJuICIiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGNtLmdldE9wdGlvbigiaW5kZW50V2l0aFRhYnMiKSkgewogICAgICAgICAgICAgIHZhciBxdW90aWVudCA9IE1hdGguZmxvb3IobmV3SW5kZW50IC8gdGFiU2l6ZSk7CiAgICAgICAgICAgICAgcmV0dXJuIEFycmF5KHF1b3RpZW50ICsgMSkuam9pbignXHQnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICByZXR1cm4gQXJyYXkobmV3SW5kZW50ICsgMSkuam9pbignICcpOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICAgIHRleHQgKz0gd2FzQ2hvbXBlZCA/ICJcbiIgOiAiIjsKICAgICAgICB9CiAgICAgICAgaWYgKGFjdGlvbkFyZ3MucmVwZWF0ID4gMSkgewogICAgICAgICAgdmFyIHRleHQgPSBBcnJheShhY3Rpb25BcmdzLnJlcGVhdCArIDEpLmpvaW4odGV4dCk7CiAgICAgICAgfQogICAgICAgIHZhciBsaW5ld2lzZSA9IHJlZ2lzdGVyLmxpbmV3aXNlOwogICAgICAgIHZhciBibG9ja3dpc2UgPSByZWdpc3Rlci5ibG9ja3dpc2U7CiAgICAgICAgaWYgKGxpbmV3aXNlKSB7CiAgICAgICAgICBpZih2aW0udmlzdWFsTW9kZSkgewogICAgICAgICAgICB0ZXh0ID0gdmltLnZpc3VhbExpbmUgPyB0ZXh0LnNsaWNlKDAsIC0xKSA6ICdcbicgKyB0ZXh0LnNsaWNlKDAsIHRleHQubGVuZ3RoIC0gMSkgKyAnXG4nOwogICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb25BcmdzLmFmdGVyKSB7CiAgICAgICAgICAgIC8vIE1vdmUgdGhlIG5ld2xpbmUgYXQgdGhlIGVuZCB0byB0aGUgc3RhcnQgaW5zdGVhZCwgYW5kIHBhc3RlIGp1c3QKICAgICAgICAgICAgLy8gYmVmb3JlIHRoZSBuZXdsaW5lIGNoYXJhY3RlciBvZiB0aGUgbGluZSB3ZSBhcmUgb24gcmlnaHQgbm93LgogICAgICAgICAgICB0ZXh0ID0gJ1xuJyArIHRleHQuc2xpY2UoMCwgdGV4dC5sZW5ndGggLSAxKTsKICAgICAgICAgICAgY3VyLmNoID0gbGluZUxlbmd0aChjbSwgY3VyLmxpbmUpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY3VyLmNoID0gMDsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKGJsb2Nrd2lzZSkgewogICAgICAgICAgICB0ZXh0ID0gdGV4dC5zcGxpdCgnXG4nKTsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgdGV4dFtpXSA9ICh0ZXh0W2ldID09ICcnKSA/ICcgJyA6IHRleHRbaV07CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGN1ci5jaCArPSBhY3Rpb25BcmdzLmFmdGVyID8gMSA6IDA7CiAgICAgICAgfQogICAgICAgIHZhciBjdXJQb3NGaW5hbDsKICAgICAgICB2YXIgaWR4OwogICAgICAgIGlmICh2aW0udmlzdWFsTW9kZSkgewogICAgICAgICAgLy8gIHNhdmUgdGhlIHBhc3RlZCB0ZXh0IGZvciByZXNlbGVjdGlvbiBpZiB0aGUgbmVlZCBhcmlzZXMKICAgICAgICAgIHZpbS5sYXN0UGFzdGVkVGV4dCA9IHRleHQ7CiAgICAgICAgICB2YXIgbGFzdFNlbGVjdGlvbkN1ckVuZDsKICAgICAgICAgIHZhciBzZWxlY3RlZEFyZWEgPSBnZXRTZWxlY3RlZEFyZWFSYW5nZShjbSwgdmltKTsKICAgICAgICAgIHZhciBzZWxlY3Rpb25TdGFydCA9IHNlbGVjdGVkQXJlYVswXTsKICAgICAgICAgIHZhciBzZWxlY3Rpb25FbmQgPSBzZWxlY3RlZEFyZWFbMV07CiAgICAgICAgICB2YXIgc2VsZWN0ZWRUZXh0ID0gY20uZ2V0U2VsZWN0aW9uKCk7CiAgICAgICAgICB2YXIgc2VsZWN0aW9ucyA9IGNtLmxpc3RTZWxlY3Rpb25zKCk7CiAgICAgICAgICB2YXIgZW1wdHlTdHJpbmdzID0gbmV3IEFycmF5KHNlbGVjdGlvbnMubGVuZ3RoKS5qb2luKCcxJykuc3BsaXQoJzEnKTsKICAgICAgICAgIC8vIHNhdmUgdGhlIGN1ckVuZCBtYXJrZXIgYmVmb3JlIGl0IGdldCBjbGVhcmVkIGR1ZSB0byBjbS5yZXBsYWNlUmFuZ2UuCiAgICAgICAgICBpZiAodmltLmxhc3RTZWxlY3Rpb24pIHsKICAgICAgICAgICAgbGFzdFNlbGVjdGlvbkN1ckVuZCA9IHZpbS5sYXN0U2VsZWN0aW9uLmhlYWRNYXJrLmZpbmQoKTsKICAgICAgICAgIH0KICAgICAgICAgIC8vIHB1c2ggdGhlIHByZXZpb3VzbHkgc2VsZWN0ZWQgdGV4dCB0byB1bm5hbWVkIHJlZ2lzdGVyCiAgICAgICAgICB2aW1HbG9iYWxTdGF0ZS5yZWdpc3RlckNvbnRyb2xsZXIudW5uYW1lZFJlZ2lzdGVyLnNldFRleHQoc2VsZWN0ZWRUZXh0KTsKICAgICAgICAgIGlmIChibG9ja3dpc2UpIHsKICAgICAgICAgICAgLy8gZmlyc3QgZGVsZXRlIHRoZSBzZWxlY3RlZCB0ZXh0CiAgICAgICAgICAgIGNtLnJlcGxhY2VTZWxlY3Rpb25zKGVtcHR5U3RyaW5ncyk7CiAgICAgICAgICAgIC8vIFNldCBuZXcgc2VsZWN0aW9ucyBhcyBwZXIgdGhlIGJsb2NrIGxlbmd0aCBvZiB0aGUgeWFua2VkIHRleHQKICAgICAgICAgICAgc2VsZWN0aW9uRW5kID0gUG9zKHNlbGVjdGlvblN0YXJ0LmxpbmUgKyB0ZXh0Lmxlbmd0aC0xLCBzZWxlY3Rpb25TdGFydC5jaCk7CiAgICAgICAgICAgIGNtLnNldEN1cnNvcihzZWxlY3Rpb25TdGFydCk7CiAgICAgICAgICAgIHNlbGVjdEJsb2NrKGNtLCBzZWxlY3Rpb25FbmQpOwogICAgICAgICAgICBjbS5yZXBsYWNlU2VsZWN0aW9ucyh0ZXh0KTsKICAgICAgICAgICAgY3VyUG9zRmluYWwgPSBzZWxlY3Rpb25TdGFydDsKICAgICAgICAgIH0gZWxzZSBpZiAodmltLnZpc3VhbEJsb2NrKSB7CiAgICAgICAgICAgIGNtLnJlcGxhY2VTZWxlY3Rpb25zKGVtcHR5U3RyaW5ncyk7CiAgICAgICAgICAgIGNtLnNldEN1cnNvcihzZWxlY3Rpb25TdGFydCk7CiAgICAgICAgICAgIGNtLnJlcGxhY2VSYW5nZSh0ZXh0LCBzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uU3RhcnQpOwogICAgICAgICAgICBjdXJQb3NGaW5hbCA9IHNlbGVjdGlvblN0YXJ0OwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY20ucmVwbGFjZVJhbmdlKHRleHQsIHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmQpOwogICAgICAgICAgICBjdXJQb3NGaW5hbCA9IGNtLnBvc0Zyb21JbmRleChjbS5pbmRleEZyb21Qb3Moc2VsZWN0aW9uU3RhcnQpICsgdGV4dC5sZW5ndGggLSAxKTsKICAgICAgICAgIH0KICAgICAgICAgIC8vIHJlc3RvcmUgdGhlIHRoZSBjdXJFbmQgbWFya2VyCiAgICAgICAgICBpZihsYXN0U2VsZWN0aW9uQ3VyRW5kKSB7CiAgICAgICAgICAgIHZpbS5sYXN0U2VsZWN0aW9uLmhlYWRNYXJrID0gY20uc2V0Qm9va21hcmsobGFzdFNlbGVjdGlvbkN1ckVuZCk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAobGluZXdpc2UpIHsKICAgICAgICAgICAgY3VyUG9zRmluYWwuY2g9MDsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKGJsb2Nrd2lzZSkgewogICAgICAgICAgICBjbS5zZXRDdXJzb3IoY3VyKTsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgdmFyIGxpbmUgPSBjdXIubGluZStpOwogICAgICAgICAgICAgIGlmIChsaW5lID4gY20ubGFzdExpbmUoKSkgewogICAgICAgICAgICAgICAgY20ucmVwbGFjZVJhbmdlKCdcbicsICBQb3MobGluZSwgMCkpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB2YXIgbGFzdENoID0gbGluZUxlbmd0aChjbSwgbGluZSk7CiAgICAgICAgICAgICAgaWYgKGxhc3RDaCA8IGN1ci5jaCkgewogICAgICAgICAgICAgICAgZXh0ZW5kTGluZVRvQ29sdW1uKGNtLCBsaW5lLCBjdXIuY2gpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBjbS5zZXRDdXJzb3IoY3VyKTsKICAgICAgICAgICAgc2VsZWN0QmxvY2soY20sIFBvcyhjdXIubGluZSArIHRleHQubGVuZ3RoLTEsIGN1ci5jaCkpOwogICAgICAgICAgICBjbS5yZXBsYWNlU2VsZWN0aW9ucyh0ZXh0KTsKICAgICAgICAgICAgY3VyUG9zRmluYWwgPSBjdXI7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBjbS5yZXBsYWNlUmFuZ2UodGV4dCwgY3VyKTsKICAgICAgICAgICAgLy8gTm93IGZpbmUgdHVuZSB0aGUgY3Vyc29yIHRvIHdoZXJlIHdlIHdhbnQgaXQuCiAgICAgICAgICAgIGlmIChsaW5ld2lzZSAmJiBhY3Rpb25BcmdzLmFmdGVyKSB7CiAgICAgICAgICAgICAgY3VyUG9zRmluYWwgPSBQb3MoCiAgICAgICAgICAgICAgY3VyLmxpbmUgKyAxLAogICAgICAgICAgICAgIGZpbmRGaXJzdE5vbldoaXRlU3BhY2VDaGFyYWN0ZXIoY20uZ2V0TGluZShjdXIubGluZSArIDEpKSk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAobGluZXdpc2UgJiYgIWFjdGlvbkFyZ3MuYWZ0ZXIpIHsKICAgICAgICAgICAgICBjdXJQb3NGaW5hbCA9IFBvcygKICAgICAgICAgICAgICAgIGN1ci5saW5lLAogICAgICAgICAgICAgICAgZmluZEZpcnN0Tm9uV2hpdGVTcGFjZUNoYXJhY3RlcihjbS5nZXRMaW5lKGN1ci5saW5lKSkpOwogICAgICAgICAgICB9IGVsc2UgaWYgKCFsaW5ld2lzZSAmJiBhY3Rpb25BcmdzLmFmdGVyKSB7CiAgICAgICAgICAgICAgaWR4ID0gY20uaW5kZXhGcm9tUG9zKGN1cik7CiAgICAgICAgICAgICAgY3VyUG9zRmluYWwgPSBjbS5wb3NGcm9tSW5kZXgoaWR4ICsgdGV4dC5sZW5ndGggLSAxKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBpZHggPSBjbS5pbmRleEZyb21Qb3MoY3VyKTsKICAgICAgICAgICAgICBjdXJQb3NGaW5hbCA9IGNtLnBvc0Zyb21JbmRleChpZHggKyB0ZXh0Lmxlbmd0aCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHZpbS52aXN1YWxNb2RlKSB7CiAgICAgICAgICBleGl0VmlzdWFsTW9kZShjbSwgZmFsc2UpOwogICAgICAgIH0KICAgICAgICBjbS5zZXRDdXJzb3IoY3VyUG9zRmluYWwpOwogICAgICB9LAogICAgICB1bmRvOiBmdW5jdGlvbihjbSwgYWN0aW9uQXJncykgewogICAgICAgIGNtLm9wZXJhdGlvbihmdW5jdGlvbigpIHsKICAgICAgICAgIHJlcGVhdEZuKGNtLCBDb2RlTWlycm9yLmNvbW1hbmRzLnVuZG8sIGFjdGlvbkFyZ3MucmVwZWF0KSgpOwogICAgICAgICAgY20uc2V0Q3Vyc29yKGNtLmdldEN1cnNvcignYW5jaG9yJykpOwogICAgICAgIH0pOwogICAgICB9LAogICAgICByZWRvOiBmdW5jdGlvbihjbSwgYWN0aW9uQXJncykgewogICAgICAgIHJlcGVhdEZuKGNtLCBDb2RlTWlycm9yLmNvbW1hbmRzLnJlZG8sIGFjdGlvbkFyZ3MucmVwZWF0KSgpOwogICAgICB9LAogICAgICBzZXRSZWdpc3RlcjogZnVuY3Rpb24oX2NtLCBhY3Rpb25BcmdzLCB2aW0pIHsKICAgICAgICB2aW0uaW5wdXRTdGF0ZS5yZWdpc3Rlck5hbWUgPSBhY3Rpb25BcmdzLnNlbGVjdGVkQ2hhcmFjdGVyOwogICAgICB9LAogICAgICBzZXRNYXJrOiBmdW5jdGlvbihjbSwgYWN0aW9uQXJncywgdmltKSB7CiAgICAgICAgdmFyIG1hcmtOYW1lID0gYWN0aW9uQXJncy5zZWxlY3RlZENoYXJhY3RlcjsKICAgICAgICB1cGRhdGVNYXJrKGNtLCB2aW0sIG1hcmtOYW1lLCBjbS5nZXRDdXJzb3IoKSk7CiAgICAgIH0sCiAgICAgIHJlcGxhY2U6IGZ1bmN0aW9uKGNtLCBhY3Rpb25BcmdzLCB2aW0pIHsKICAgICAgICB2YXIgcmVwbGFjZVdpdGggPSBhY3Rpb25BcmdzLnNlbGVjdGVkQ2hhcmFjdGVyOwogICAgICAgIHZhciBjdXJTdGFydCA9IGNtLmdldEN1cnNvcigpOwogICAgICAgIHZhciByZXBsYWNlVG87CiAgICAgICAgdmFyIGN1ckVuZDsKICAgICAgICB2YXIgc2VsZWN0aW9ucyA9IGNtLmxpc3RTZWxlY3Rpb25zKCk7CiAgICAgICAgaWYgKHZpbS52aXN1YWxNb2RlKSB7CiAgICAgICAgICBjdXJTdGFydCA9IGNtLmdldEN1cnNvcignc3RhcnQnKTsKICAgICAgICAgIGN1ckVuZCA9IGNtLmdldEN1cnNvcignZW5kJyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHZhciBsaW5lID0gY20uZ2V0TGluZShjdXJTdGFydC5saW5lKTsKICAgICAgICAgIHJlcGxhY2VUbyA9IGN1clN0YXJ0LmNoICsgYWN0aW9uQXJncy5yZXBlYXQ7CiAgICAgICAgICBpZiAocmVwbGFjZVRvID4gbGluZS5sZW5ndGgpIHsKICAgICAgICAgICAgcmVwbGFjZVRvPWxpbmUubGVuZ3RoOwogICAgICAgICAgfQogICAgICAgICAgY3VyRW5kID0gUG9zKGN1clN0YXJ0LmxpbmUsIHJlcGxhY2VUbyk7CiAgICAgICAgfQogICAgICAgIGlmIChyZXBsYWNlV2l0aD09J1xuJykgewogICAgICAgICAgaWYgKCF2aW0udmlzdWFsTW9kZSkgY20ucmVwbGFjZVJhbmdlKCcnLCBjdXJTdGFydCwgY3VyRW5kKTsKICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZSwgd2hlcmUgdmltIGhlbHAgc2F5cyB0byByZXBsYWNlIGJ5IGp1c3Qgb25lIGxpbmUtYnJlYWsKICAgICAgICAgIChDb2RlTWlycm9yLmNvbW1hbmRzLm5ld2xpbmVBbmRJbmRlbnRDb250aW51ZUNvbW1lbnQgfHwgQ29kZU1pcnJvci5jb21tYW5kcy5uZXdsaW5lQW5kSW5kZW50KShjbSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHZhciByZXBsYWNlV2l0aFN0ciA9IGNtLmdldFJhbmdlKGN1clN0YXJ0LCBjdXJFbmQpOwogICAgICAgICAgLy9yZXBsYWNlIGFsbCBjaGFyYWN0ZXJzIGluIHJhbmdlIGJ5IHNlbGVjdGVkLCBidXQga2VlcCBsaW5lYnJlYWtzCiAgICAgICAgICByZXBsYWNlV2l0aFN0ciA9IHJlcGxhY2VXaXRoU3RyLnJlcGxhY2UoL1teXG5dL2csIHJlcGxhY2VXaXRoKTsKICAgICAgICAgIGlmICh2aW0udmlzdWFsQmxvY2spIHsKICAgICAgICAgICAgLy8gVGFicyBhcmUgc3BsaXQgaW4gdmlzdWEgYmxvY2sgYmVmb3JlIHJlcGxhY2luZwogICAgICAgICAgICB2YXIgc3BhY2VzID0gbmV3IEFycmF5KGNtLmdldE9wdGlvbigidGFiU2l6ZSIpKzEpLmpvaW4oJyAnKTsKICAgICAgICAgICAgcmVwbGFjZVdpdGhTdHIgPSBjbS5nZXRTZWxlY3Rpb24oKTsKICAgICAgICAgICAgcmVwbGFjZVdpdGhTdHIgPSByZXBsYWNlV2l0aFN0ci5yZXBsYWNlKC9cdC9nLCBzcGFjZXMpLnJlcGxhY2UoL1teXG5dL2csIHJlcGxhY2VXaXRoKS5zcGxpdCgnXG4nKTsKICAgICAgICAgICAgY20ucmVwbGFjZVNlbGVjdGlvbnMocmVwbGFjZVdpdGhTdHIpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY20ucmVwbGFjZVJhbmdlKHJlcGxhY2VXaXRoU3RyLCBjdXJTdGFydCwgY3VyRW5kKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh2aW0udmlzdWFsTW9kZSkgewogICAgICAgICAgICBjdXJTdGFydCA9IGN1cnNvcklzQmVmb3JlKHNlbGVjdGlvbnNbMF0uYW5jaG9yLCBzZWxlY3Rpb25zWzBdLmhlYWQpID8KICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbnNbMF0uYW5jaG9yIDogc2VsZWN0aW9uc1swXS5oZWFkOwogICAgICAgICAgICBjbS5zZXRDdXJzb3IoY3VyU3RhcnQpOwogICAgICAgICAgICBleGl0VmlzdWFsTW9kZShjbSwgZmFsc2UpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgY20uc2V0Q3Vyc29yKG9mZnNldEN1cnNvcihjdXJFbmQsIDAsIC0xKSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICBpbmNyZW1lbnROdW1iZXJUb2tlbjogZnVuY3Rpb24oY20sIGFjdGlvbkFyZ3MpIHsKICAgICAgICB2YXIgY3VyID0gY20uZ2V0Q3Vyc29yKCk7CiAgICAgICAgdmFyIGxpbmVTdHIgPSBjbS5nZXRMaW5lKGN1ci5saW5lKTsKICAgICAgICB2YXIgcmUgPSAvLT9cZCsvZzsKICAgICAgICB2YXIgbWF0Y2g7CiAgICAgICAgdmFyIHN0YXJ0OwogICAgICAgIHZhciBlbmQ7CiAgICAgICAgdmFyIG51bWJlclN0cjsKICAgICAgICB2YXIgdG9rZW47CiAgICAgICAgd2hpbGUgKChtYXRjaCA9IHJlLmV4ZWMobGluZVN0cikpICE9PSBudWxsKSB7CiAgICAgICAgICB0b2tlbiA9IG1hdGNoWzBdOwogICAgICAgICAgc3RhcnQgPSBtYXRjaC5pbmRleDsKICAgICAgICAgIGVuZCA9IHN0YXJ0ICsgdG9rZW4ubGVuZ3RoOwogICAgICAgICAgaWYgKGN1ci5jaCA8IGVuZClicmVhazsKICAgICAgICB9CiAgICAgICAgaWYgKCFhY3Rpb25BcmdzLmJhY2t0cmFjayAmJiAoZW5kIDw9IGN1ci5jaCkpcmV0dXJuOwogICAgICAgIGlmICh0b2tlbikgewogICAgICAgICAgdmFyIGluY3JlbWVudCA9IGFjdGlvbkFyZ3MuaW5jcmVhc2UgPyAxIDogLTE7CiAgICAgICAgICB2YXIgbnVtYmVyID0gcGFyc2VJbnQodG9rZW4pICsgKGluY3JlbWVudCAqIGFjdGlvbkFyZ3MucmVwZWF0KTsKICAgICAgICAgIHZhciBmcm9tID0gUG9zKGN1ci5saW5lLCBzdGFydCk7CiAgICAgICAgICB2YXIgdG8gPSBQb3MoY3VyLmxpbmUsIGVuZCk7CiAgICAgICAgICBudW1iZXJTdHIgPSBudW1iZXIudG9TdHJpbmcoKTsKICAgICAgICAgIGNtLnJlcGxhY2VSYW5nZShudW1iZXJTdHIsIGZyb20sIHRvKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBjbS5zZXRDdXJzb3IoUG9zKGN1ci5saW5lLCBzdGFydCArIG51bWJlclN0ci5sZW5ndGggLSAxKSk7CiAgICAgIH0sCiAgICAgIHJlcGVhdExhc3RFZGl0OiBmdW5jdGlvbihjbSwgYWN0aW9uQXJncywgdmltKSB7CiAgICAgICAgdmFyIGxhc3RFZGl0SW5wdXRTdGF0ZSA9IHZpbS5sYXN0RWRpdElucHV0U3RhdGU7CiAgICAgICAgaWYgKCFsYXN0RWRpdElucHV0U3RhdGUpIHsgcmV0dXJuOyB9CiAgICAgICAgdmFyIHJlcGVhdCA9IGFjdGlvbkFyZ3MucmVwZWF0OwogICAgICAgIGlmIChyZXBlYXQgJiYgYWN0aW9uQXJncy5yZXBlYXRJc0V4cGxpY2l0KSB7CiAgICAgICAgICB2aW0ubGFzdEVkaXRJbnB1dFN0YXRlLnJlcGVhdE92ZXJyaWRlID0gcmVwZWF0OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXBlYXQgPSB2aW0ubGFzdEVkaXRJbnB1dFN0YXRlLnJlcGVhdE92ZXJyaWRlIHx8IHJlcGVhdDsKICAgICAgICB9CiAgICAgICAgcmVwZWF0TGFzdEVkaXQoY20sIHZpbSwgcmVwZWF0LCBmYWxzZSAvKiogcmVwZWF0Rm9ySW5zZXJ0ICovKTsKICAgICAgfSwKICAgICAgZXhpdEluc2VydE1vZGU6IGV4aXRJbnNlcnRNb2RlCiAgICB9OwoKICAgIGZ1bmN0aW9uIGRlZmluZUFjdGlvbihuYW1lLCBmbikgewogICAgICBhY3Rpb25zW25hbWVdID0gZm47CiAgICB9CgogICAgLyoKICAgICAqIEJlbG93IGFyZSBtaXNjZWxsYW5lb3VzIHV0aWxpdHkgZnVuY3Rpb25zIHVzZWQgYnkgdmltLmpzCiAgICAgKi8KCiAgICAvKioKICAgICAqIENsaXBzIGN1cnNvciB0byBlbnN1cmUgdGhhdCBsaW5lIGlzIHdpdGhpbiB0aGUgYnVmZmVyJ3MgcmFuZ2UKICAgICAqIElmIGluY2x1ZGVMaW5lQnJlYWsgaXMgdHJ1ZSwgdGhlbiBhbGxvdyBjdXIuY2ggPT0gbGluZUxlbmd0aC4KICAgICAqLwogICAgZnVuY3Rpb24gY2xpcEN1cnNvclRvQ29udGVudChjbSwgY3VyLCBpbmNsdWRlTGluZUJyZWFrKSB7CiAgICAgIHZhciBsaW5lID0gTWF0aC5taW4oTWF0aC5tYXgoY20uZmlyc3RMaW5lKCksIGN1ci5saW5lKSwgY20ubGFzdExpbmUoKSApOwogICAgICB2YXIgbWF4Q2ggPSBsaW5lTGVuZ3RoKGNtLCBsaW5lKSAtIDE7CiAgICAgIG1heENoID0gKGluY2x1ZGVMaW5lQnJlYWspID8gbWF4Q2ggKyAxIDogbWF4Q2g7CiAgICAgIHZhciBjaCA9IE1hdGgubWluKE1hdGgubWF4KDAsIGN1ci5jaCksIG1heENoKTsKICAgICAgcmV0dXJuIFBvcyhsaW5lLCBjaCk7CiAgICB9CiAgICBmdW5jdGlvbiBjb3B5QXJncyhhcmdzKSB7CiAgICAgIHZhciByZXQgPSB7fTsKICAgICAgZm9yICh2YXIgcHJvcCBpbiBhcmdzKSB7CiAgICAgICAgaWYgKGFyZ3MuaGFzT3duUHJvcGVydHkocHJvcCkpIHsKICAgICAgICAgIHJldFtwcm9wXSA9IGFyZ3NbcHJvcF07CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiByZXQ7CiAgICB9CiAgICBmdW5jdGlvbiBvZmZzZXRDdXJzb3IoY3VyLCBvZmZzZXRMaW5lLCBvZmZzZXRDaCkgewogICAgICBpZiAodHlwZW9mIG9mZnNldExpbmUgPT09ICdvYmplY3QnKSB7CiAgICAgICAgb2Zmc2V0Q2ggPSBvZmZzZXRMaW5lLmNoOwogICAgICAgIG9mZnNldExpbmUgPSBvZmZzZXRMaW5lLmxpbmU7CiAgICAgIH0KICAgICAgcmV0dXJuIFBvcyhjdXIubGluZSArIG9mZnNldExpbmUsIGN1ci5jaCArIG9mZnNldENoKTsKICAgIH0KICAgIGZ1bmN0aW9uIGdldE9mZnNldChhbmNob3IsIGhlYWQpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBsaW5lOiBoZWFkLmxpbmUgLSBhbmNob3IubGluZSwKICAgICAgICBjaDogaGVhZC5saW5lIC0gYW5jaG9yLmxpbmUKICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIGNvbW1hbmRNYXRjaGVzKGtleXMsIGtleU1hcCwgY29udGV4dCwgaW5wdXRTdGF0ZSkgewogICAgICAvLyBQYXJ0aWFsIG1hdGNoZXMgYXJlIG5vdCBhcHBsaWVkLiBUaGV5IGluZm9ybSB0aGUga2V5IGhhbmRsZXIKICAgICAgLy8gdGhhdCB0aGUgY3VycmVudCBrZXkgc2VxdWVuY2UgaXMgYSBzdWJzZXF1ZW5jZSBvZiBhIHZhbGlkIGtleQogICAgICAvLyBzZXF1ZW5jZSwgc28gdGhhdCB0aGUga2V5IGJ1ZmZlciBpcyBub3QgY2xlYXJlZC4KICAgICAgdmFyIG1hdGNoLCBwYXJ0aWFsID0gW10sIGZ1bGwgPSBbXTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlNYXAubGVuZ3RoOyBpKyspIHsKICAgICAgICB2YXIgY29tbWFuZCA9IGtleU1hcFtpXTsKICAgICAgICBpZiAoY29udGV4dCA9PSAnaW5zZXJ0JyAmJiBjb21tYW5kLmNvbnRleHQgIT0gJ2luc2VydCcgfHwKICAgICAgICAgICAgY29tbWFuZC5jb250ZXh0ICYmIGNvbW1hbmQuY29udGV4dCAhPSBjb250ZXh0IHx8CiAgICAgICAgICAgIGlucHV0U3RhdGUub3BlcmF0b3IgJiYgY29tbWFuZC50eXBlID09ICdhY3Rpb24nIHx8CiAgICAgICAgICAgICEobWF0Y2ggPSBjb21tYW5kTWF0Y2goa2V5cywgY29tbWFuZC5rZXlzKSkpIHsgY29udGludWU7IH0KICAgICAgICBpZiAobWF0Y2ggPT0gJ3BhcnRpYWwnKSB7IHBhcnRpYWwucHVzaChjb21tYW5kKTsgfQogICAgICAgIGlmIChtYXRjaCA9PSAnZnVsbCcpIHsgZnVsbC5wdXNoKGNvbW1hbmQpOyB9CiAgICAgIH0KICAgICAgcmV0dXJuIHsKICAgICAgICBwYXJ0aWFsOiBwYXJ0aWFsLmxlbmd0aCAmJiBwYXJ0aWFsLAogICAgICAgIGZ1bGw6IGZ1bGwubGVuZ3RoICYmIGZ1bGwKICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIGNvbW1hbmRNYXRjaChwcmVzc2VkLCBtYXBwZWQpIHsKICAgICAgaWYgKG1hcHBlZC5zbGljZSgtMTEpID09ICc8Y2hhcmFjdGVyPicpIHsKICAgICAgICAvLyBMYXN0IGNoYXJhY3RlciBtYXRjaGVzIGFueXRoaW5nLgogICAgICAgIHZhciBwcmVmaXhMZW4gPSBtYXBwZWQubGVuZ3RoIC0gMTE7CiAgICAgICAgdmFyIHByZXNzZWRQcmVmaXggPSBwcmVzc2VkLnNsaWNlKDAsIHByZWZpeExlbik7CiAgICAgICAgdmFyIG1hcHBlZFByZWZpeCA9IG1hcHBlZC5zbGljZSgwLCBwcmVmaXhMZW4pOwogICAgICAgIHJldHVybiBwcmVzc2VkUHJlZml4ID09IG1hcHBlZFByZWZpeCAmJiBwcmVzc2VkLmxlbmd0aCA+IHByZWZpeExlbiA/ICdmdWxsJyA6CiAgICAgICAgICAgICAgIG1hcHBlZFByZWZpeC5pbmRleE9mKHByZXNzZWRQcmVmaXgpID09IDAgPyAncGFydGlhbCcgOiBmYWxzZTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gcHJlc3NlZCA9PSBtYXBwZWQgPyAnZnVsbCcgOgogICAgICAgICAgICAgICBtYXBwZWQuaW5kZXhPZihwcmVzc2VkKSA9PSAwID8gJ3BhcnRpYWwnIDogZmFsc2U7CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGxhc3RDaGFyKGtleXMpIHsKICAgICAgdmFyIG1hdGNoID0gL14uKig8W1x3XC1dKz4pJC8uZXhlYyhrZXlzKTsKICAgICAgdmFyIHNlbGVjdGVkQ2hhcmFjdGVyID0gbWF0Y2ggPyBtYXRjaFsxXSA6IGtleXMuc2xpY2UoLTEpOwogICAgICBpZiAoc2VsZWN0ZWRDaGFyYWN0ZXIubGVuZ3RoID4gMSl7CiAgICAgICAgc3dpdGNoKHNlbGVjdGVkQ2hhcmFjdGVyKXsKICAgICAgICAgIGNhc2UgJzxDUj4nOgogICAgICAgICAgICBzZWxlY3RlZENoYXJhY3Rlcj0nXG4nOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJzxTcGFjZT4nOgogICAgICAgICAgICBzZWxlY3RlZENoYXJhY3Rlcj0nICc7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBzZWxlY3RlZENoYXJhY3RlcjsKICAgIH0KICAgIGZ1bmN0aW9uIHJlcGVhdEZuKGNtLCBmbiwgcmVwZWF0KSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlcGVhdDsgaSsrKSB7CiAgICAgICAgICBmbihjbSk7CiAgICAgICAgfQogICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gY29weUN1cnNvcihjdXIpIHsKICAgICAgcmV0dXJuIFBvcyhjdXIubGluZSwgY3VyLmNoKTsKICAgIH0KICAgIGZ1bmN0aW9uIGN1cnNvckVxdWFsKGN1cjEsIGN1cjIpIHsKICAgICAgcmV0dXJuIGN1cjEuY2ggPT0gY3VyMi5jaCAmJiBjdXIxLmxpbmUgPT0gY3VyMi5saW5lOwogICAgfQogICAgZnVuY3Rpb24gY3Vyc29ySXNCZWZvcmUoY3VyMSwgY3VyMikgewogICAgICBpZiAoY3VyMS5saW5lIDwgY3VyMi5saW5lKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgaWYgKGN1cjEubGluZSA9PSBjdXIyLmxpbmUgJiYgY3VyMS5jaCA8IGN1cjIuY2gpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBmdW5jdGlvbiBjdXJzb3JNaW4oY3VyMSwgY3VyMikgewogICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDIpIHsKICAgICAgICBjdXIyID0gY3Vyc29yTWluLmFwcGx5KHVuZGVmaW5lZCwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7CiAgICAgIH0KICAgICAgcmV0dXJuIGN1cnNvcklzQmVmb3JlKGN1cjEsIGN1cjIpID8gY3VyMSA6IGN1cjI7CiAgICB9CiAgICBmdW5jdGlvbiBjdXJzb3JNYXgoY3VyMSwgY3VyMikgewogICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDIpIHsKICAgICAgICBjdXIyID0gY3Vyc29yTWF4LmFwcGx5KHVuZGVmaW5lZCwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7CiAgICAgIH0KICAgICAgcmV0dXJuIGN1cnNvcklzQmVmb3JlKGN1cjEsIGN1cjIpID8gY3VyMiA6IGN1cjE7CiAgICB9CiAgICBmdW5jdGlvbiBjdXJzb3JJc0JldHdlZW4oY3VyMSwgY3VyMiwgY3VyMykgewogICAgICAvLyByZXR1cm5zIHRydWUgaWYgY3VyMiBpcyBiZXR3ZWVuIGN1cjEgYW5kIGN1cjMuCiAgICAgIHZhciBjdXIxYmVmb3JlMiA9IGN1cnNvcklzQmVmb3JlKGN1cjEsIGN1cjIpOwogICAgICB2YXIgY3VyMmJlZm9yZTMgPSBjdXJzb3JJc0JlZm9yZShjdXIyLCBjdXIzKTsKICAgICAgcmV0dXJuIGN1cjFiZWZvcmUyICYmIGN1cjJiZWZvcmUzOwogICAgfQogICAgZnVuY3Rpb24gbGluZUxlbmd0aChjbSwgbGluZU51bSkgewogICAgICByZXR1cm4gY20uZ2V0TGluZShsaW5lTnVtKS5sZW5ndGg7CiAgICB9CiAgICBmdW5jdGlvbiB0cmltKHMpIHsKICAgICAgaWYgKHMudHJpbSkgewogICAgICAgIHJldHVybiBzLnRyaW0oKTsKICAgICAgfQogICAgICByZXR1cm4gcy5yZXBsYWNlKC9eXHMrfFxzKyQvZywgJycpOwogICAgfQogICAgZnVuY3Rpb24gZXNjYXBlUmVnZXgocykgewogICAgICByZXR1cm4gcy5yZXBsYWNlKC8oWy4/KiskXFtcXVwvXFwoKXt9fFwtXSkvZywgJ1xcJDEnKTsKICAgIH0KICAgIGZ1bmN0aW9uIGV4dGVuZExpbmVUb0NvbHVtbihjbSwgbGluZU51bSwgY29sdW1uKSB7CiAgICAgIHZhciBlbmRDaCA9IGxpbmVMZW5ndGgoY20sIGxpbmVOdW0pOwogICAgICB2YXIgc3BhY2VzID0gbmV3IEFycmF5KGNvbHVtbi1lbmRDaCsxKS5qb2luKCcgJyk7CiAgICAgIGNtLnNldEN1cnNvcihQb3MobGluZU51bSwgZW5kQ2gpKTsKICAgICAgY20ucmVwbGFjZVJhbmdlKHNwYWNlcywgY20uZ2V0Q3Vyc29yKCkpOwogICAgfQogICAgLy8gVGhpcyBmdW5jdGlvbnMgc2VsZWN0cyBhIHJlY3Rhbmd1bGFyIGJsb2NrCiAgICAvLyBvZiB0ZXh0IHdpdGggc2VsZWN0aW9uRW5kIGFzIGFueSBvZiBpdHMgY29ybmVyCiAgICAvLyBIZWlnaHQgb2YgYmxvY2s6CiAgICAvLyBEaWZmZXJlbmNlIGluIHNlbGVjdGlvbkVuZC5saW5lIGFuZCBmaXJzdC9sYXN0IHNlbGVjdGlvbi5saW5lCiAgICAvLyBXaWR0aCBvZiB0aGUgYmxvY2s6CiAgICAvLyBEaXN0YW5jZSBiZXR3ZWVuIHNlbGVjdGlvbkVuZC5jaCBhbmQgYW55KGZpcnN0IGNvbnNpZGVyZWQgaGVyZSkgc2VsZWN0aW9uLmNoCiAgICBmdW5jdGlvbiBzZWxlY3RCbG9jayhjbSwgc2VsZWN0aW9uRW5kKSB7CiAgICAgIHZhciBzZWxlY3Rpb25zID0gW10sIHJhbmdlcyA9IGNtLmxpc3RTZWxlY3Rpb25zKCk7CiAgICAgIHZhciBoZWFkID0gY29weUN1cnNvcihjbS5jbGlwUG9zKHNlbGVjdGlvbkVuZCkpOwogICAgICB2YXIgaXNDbGlwcGVkID0gIWN1cnNvckVxdWFsKHNlbGVjdGlvbkVuZCwgaGVhZCk7CiAgICAgIHZhciBjdXJIZWFkID0gY20uZ2V0Q3Vyc29yKCdoZWFkJyk7CiAgICAgIHZhciBwcmltSW5kZXggPSBnZXRJbmRleChyYW5nZXMsIGN1ckhlYWQpOwogICAgICB2YXIgd2FzQ2xpcHBlZCA9IGN1cnNvckVxdWFsKHJhbmdlc1twcmltSW5kZXhdLmhlYWQsIHJhbmdlc1twcmltSW5kZXhdLmFuY2hvcik7CiAgICAgIHZhciBtYXggPSByYW5nZXMubGVuZ3RoIC0gMTsKICAgICAgdmFyIGluZGV4ID0gbWF4IC0gcHJpbUluZGV4ID4gcHJpbUluZGV4ID8gbWF4IDogMDsKICAgICAgdmFyIGJhc2UgPSByYW5nZXNbaW5kZXhdLmFuY2hvcjsKCiAgICAgIHZhciBmaXJzdExpbmUgPSBNYXRoLm1pbihiYXNlLmxpbmUsIGhlYWQubGluZSk7CiAgICAgIHZhciBsYXN0TGluZSA9IE1hdGgubWF4KGJhc2UubGluZSwgaGVhZC5saW5lKTsKICAgICAgdmFyIGJhc2VDaCA9IGJhc2UuY2gsIGhlYWRDaCA9IGhlYWQuY2g7CgogICAgICB2YXIgZGlyID0gcmFuZ2VzW2luZGV4XS5oZWFkLmNoIC0gYmFzZUNoOwogICAgICB2YXIgbmV3RGlyID0gaGVhZENoIC0gYmFzZUNoOwogICAgICBpZiAoZGlyID4gMCAmJiBuZXdEaXIgPD0gMCkgewogICAgICAgIGJhc2VDaCsrOwogICAgICAgIGlmICghaXNDbGlwcGVkKSB7IGhlYWRDaC0tOyB9CiAgICAgIH0gZWxzZSBpZiAoZGlyIDwgMCAmJiBuZXdEaXIgPj0gMCkgewogICAgICAgIGJhc2VDaC0tOwogICAgICAgIGlmICghd2FzQ2xpcHBlZCkgeyBoZWFkQ2grKzsgfQogICAgICB9IGVsc2UgaWYgKGRpciA8IDAgJiYgbmV3RGlyID09IC0xKSB7CiAgICAgICAgYmFzZUNoLS07CiAgICAgICAgaGVhZENoKys7CiAgICAgIH0KICAgICAgZm9yICh2YXIgbGluZSA9IGZpcnN0TGluZTsgbGluZSA8PSBsYXN0TGluZTsgbGluZSsrKSB7CiAgICAgICAgdmFyIHJhbmdlID0ge2FuY2hvcjogbmV3IFBvcyhsaW5lLCBiYXNlQ2gpLCBoZWFkOiBuZXcgUG9zKGxpbmUsIGhlYWRDaCl9OwogICAgICAgIHNlbGVjdGlvbnMucHVzaChyYW5nZSk7CiAgICAgIH0KICAgICAgcHJpbUluZGV4ID0gaGVhZC5saW5lID09IGxhc3RMaW5lID8gc2VsZWN0aW9ucy5sZW5ndGggLSAxIDogMDsKICAgICAgY20uc2V0U2VsZWN0aW9ucyhzZWxlY3Rpb25zKTsKICAgICAgc2VsZWN0aW9uRW5kLmNoID0gaGVhZENoOwogICAgICBiYXNlLmNoID0gYmFzZUNoOwogICAgICByZXR1cm4gYmFzZTsKICAgIH0KICAgIGZ1bmN0aW9uIHNlbGVjdEZvckluc2VydChjbSwgaGVhZCwgaGVpZ2h0KSB7CiAgICAgIHZhciBzZWwgPSBbXTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgewogICAgICAgIHZhciBsaW5lSGVhZCA9IG9mZnNldEN1cnNvcihoZWFkLCBpLCAwKTsKICAgICAgICBzZWwucHVzaCh7YW5jaG9yOiBsaW5lSGVhZCwgaGVhZDogbGluZUhlYWR9KTsKICAgICAgfQogICAgICBjbS5zZXRTZWxlY3Rpb25zKHNlbCwgMCk7CiAgICB9CiAgICAvLyBnZXRJbmRleCByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgY3Vyc29yIGluIHRoZSBzZWxlY3Rpb25zLgogICAgZnVuY3Rpb24gZ2V0SW5kZXgocmFuZ2VzLCBjdXJzb3IsIGVuZCkgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJhbmdlcy5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciBhdEFuY2hvciA9IGVuZCAhPSAnaGVhZCcgJiYgY3Vyc29yRXF1YWwocmFuZ2VzW2ldLmFuY2hvciwgY3Vyc29yKTsKICAgICAgICB2YXIgYXRIZWFkID0gZW5kICE9ICdhbmNob3InICYmIGN1cnNvckVxdWFsKHJhbmdlc1tpXS5oZWFkLCBjdXJzb3IpOwogICAgICAgIGlmIChhdEFuY2hvciB8fCBhdEhlYWQpIHsKICAgICAgICAgIHJldHVybiBpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gLTE7CiAgICB9CiAgICBmdW5jdGlvbiBnZXRTZWxlY3RlZEFyZWFSYW5nZShjbSwgdmltKSB7CiAgICAgIHZhciBsYXN0U2VsZWN0aW9uID0gdmltLmxhc3RTZWxlY3Rpb247CiAgICAgIHZhciBnZXRDdXJyZW50U2VsZWN0ZWRBcmVhUmFuZ2UgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgc2VsZWN0aW9ucyA9IGNtLmxpc3RTZWxlY3Rpb25zKCk7CiAgICAgICAgdmFyIHN0YXJ0ID0gIHNlbGVjdGlvbnNbMF07CiAgICAgICAgdmFyIGVuZCA9IHNlbGVjdGlvbnNbc2VsZWN0aW9ucy5sZW5ndGgtMV07CiAgICAgICAgdmFyIHNlbGVjdGlvblN0YXJ0ID0gY3Vyc29ySXNCZWZvcmUoc3RhcnQuYW5jaG9yLCBzdGFydC5oZWFkKSA/IHN0YXJ0LmFuY2hvciA6IHN0YXJ0LmhlYWQ7CiAgICAgICAgdmFyIHNlbGVjdGlvbkVuZCA9IGN1cnNvcklzQmVmb3JlKGVuZC5hbmNob3IsIGVuZC5oZWFkKSA/IGVuZC5oZWFkIDogZW5kLmFuY2hvcjsKICAgICAgICByZXR1cm4gW3NlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmRdOwogICAgICB9OwogICAgICB2YXIgZ2V0TGFzdFNlbGVjdGVkQXJlYVJhbmdlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHNlbGVjdGlvblN0YXJ0ID0gY20uZ2V0Q3Vyc29yKCk7CiAgICAgICAgdmFyIHNlbGVjdGlvbkVuZCA9IGNtLmdldEN1cnNvcigpOwogICAgICAgIHZhciBibG9jayA9IGxhc3RTZWxlY3Rpb24udmlzdWFsQmxvY2s7CiAgICAgICAgaWYgKGJsb2NrKSB7CiAgICAgICAgICB2YXIgd2lkdGggPSBibG9jay53aWR0aDsKICAgICAgICAgIHZhciBoZWlnaHQgPSBibG9jay5oZWlnaHQ7CiAgICAgICAgICBzZWxlY3Rpb25FbmQgPSBQb3Moc2VsZWN0aW9uU3RhcnQubGluZSArIGhlaWdodCwgc2VsZWN0aW9uU3RhcnQuY2ggKyB3aWR0aCk7CiAgICAgICAgICB2YXIgc2VsZWN0aW9ucyA9IFtdOwogICAgICAgICAgLy8gc2VsZWN0QmxvY2sgY3JlYXRlcyBhICdwcm9wZXInIHJlY3Rhbmd1bGFyIGJsb2NrLgogICAgICAgICAgLy8gV2UgZG8gbm90IHdhbnQgdGhhdCBpbiBhbGwgY2FzZXMsIHNvIHdlIG1hbnVhbGx5IHNldCBzZWxlY3Rpb25zLgogICAgICAgICAgZm9yICh2YXIgaSA9IHNlbGVjdGlvblN0YXJ0LmxpbmU7IGkgPCBzZWxlY3Rpb25FbmQubGluZTsgaSsrKSB7CiAgICAgICAgICAgIHZhciBhbmNob3IgPSBQb3MoaSwgc2VsZWN0aW9uU3RhcnQuY2gpOwogICAgICAgICAgICB2YXIgaGVhZCA9IFBvcyhpLCBzZWxlY3Rpb25FbmQuY2gpOwogICAgICAgICAgICB2YXIgcmFuZ2UgPSB7YW5jaG9yOiBhbmNob3IsIGhlYWQ6IGhlYWR9OwogICAgICAgICAgICBzZWxlY3Rpb25zLnB1c2gocmFuZ2UpOwogICAgICAgICAgfQogICAgICAgICAgY20uc2V0U2VsZWN0aW9ucyhzZWxlY3Rpb25zKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdmFyIHN0YXJ0ID0gbGFzdFNlbGVjdGlvbi5hbmNob3JNYXJrLmZpbmQoKTsKICAgICAgICAgIHZhciBlbmQgPSBsYXN0U2VsZWN0aW9uLmhlYWRNYXJrLmZpbmQoKTsKICAgICAgICAgIHZhciBsaW5lID0gZW5kLmxpbmUgLSBzdGFydC5saW5lOwogICAgICAgICAgdmFyIGNoID0gZW5kLmNoIC0gc3RhcnQuY2g7CiAgICAgICAgICBzZWxlY3Rpb25FbmQgPSB7bGluZTogc2VsZWN0aW9uRW5kLmxpbmUgKyBsaW5lLCBjaDogbGluZSA/IHNlbGVjdGlvbkVuZC5jaCA6IGNoICsgc2VsZWN0aW9uRW5kLmNofTsKICAgICAgICAgIGlmIChsYXN0U2VsZWN0aW9uLnZpc3VhbExpbmUpIHsKICAgICAgICAgICAgc2VsZWN0aW9uU3RhcnQgPSBQb3Moc2VsZWN0aW9uU3RhcnQubGluZSwgMCk7CiAgICAgICAgICAgIHNlbGVjdGlvbkVuZCA9IFBvcyhzZWxlY3Rpb25FbmQubGluZSwgbGluZUxlbmd0aChjbSwgc2VsZWN0aW9uRW5kLmxpbmUpKTsKICAgICAgICAgIH0KICAgICAgICAgIGNtLnNldFNlbGVjdGlvbihzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIFtzZWxlY3Rpb25TdGFydCwgc2VsZWN0aW9uRW5kXTsKICAgICAgfTsKICAgICAgaWYgKCF2aW0udmlzdWFsTW9kZSkgewogICAgICAvLyBJbiBjYXNlIG9mIHJlcGxheWluZyB0aGUgYWN0aW9uLgogICAgICAgIHJldHVybiBnZXRMYXN0U2VsZWN0ZWRBcmVhUmFuZ2UoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gZ2V0Q3VycmVudFNlbGVjdGVkQXJlYVJhbmdlKCk7CiAgICAgIH0KICAgIH0KICAgIC8vIFVwZGF0ZXMgdGhlIHByZXZpb3VzIHNlbGVjdGlvbiB3aXRoIHRoZSBjdXJyZW50IHNlbGVjdGlvbidzIHZhbHVlcy4gVGhpcwogICAgLy8gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGluIHZpc3VhbCBtb2RlLgogICAgZnVuY3Rpb24gdXBkYXRlTGFzdFNlbGVjdGlvbihjbSwgdmltKSB7CiAgICAgIHZhciBhbmNob3IgPSB2aW0uc2VsLmFuY2hvcjsKICAgICAgdmFyIGhlYWQgPSB2aW0uc2VsLmhlYWQ7CiAgICAgIC8vIFRvIGFjY29tbW9kYXRlIHRoZSBlZmZlY3Qgb2YgbGFzdFBhc3RlZFRleHQgaW4gdGhlIGxhc3Qgc2VsZWN0aW9uCiAgICAgIGlmICh2aW0ubGFzdFBhc3RlZFRleHQpIHsKICAgICAgICBoZWFkID0gY20ucG9zRnJvbUluZGV4KGNtLmluZGV4RnJvbVBvcyhhbmNob3IpICsgdmltLmxhc3RQYXN0ZWRUZXh0Lmxlbmd0aCk7CiAgICAgICAgdmltLmxhc3RQYXN0ZWRUZXh0ID0gbnVsbDsKICAgICAgfQogICAgICB2aW0ubGFzdFNlbGVjdGlvbiA9IHsnYW5jaG9yTWFyayc6IGNtLnNldEJvb2ttYXJrKGFuY2hvciksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICdoZWFkTWFyayc6IGNtLnNldEJvb2ttYXJrKGhlYWQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAnYW5jaG9yJzogY29weUN1cnNvcihhbmNob3IpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAnaGVhZCc6IGNvcHlDdXJzb3IoaGVhZCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICd2aXN1YWxNb2RlJzogdmltLnZpc3VhbE1vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICd2aXN1YWxMaW5lJzogdmltLnZpc3VhbExpbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICd2aXN1YWxCbG9jayc6IHZpbS52aXN1YWxCbG9ja307CiAgICB9CiAgICBmdW5jdGlvbiBleHBhbmRTZWxlY3Rpb24oY20sIHN0YXJ0LCBlbmQpIHsKICAgICAgdmFyIHNlbCA9IGNtLnN0YXRlLnZpbS5zZWw7CiAgICAgIHZhciBoZWFkID0gc2VsLmhlYWQ7CiAgICAgIHZhciBhbmNob3IgPSBzZWwuYW5jaG9yOwogICAgICB2YXIgdG1wOwogICAgICBpZiAoY3Vyc29ySXNCZWZvcmUoZW5kLCBzdGFydCkpIHsKICAgICAgICB0bXAgPSBlbmQ7CiAgICAgICAgZW5kID0gc3RhcnQ7CiAgICAgICAgc3RhcnQgPSB0bXA7CiAgICAgIH0KICAgICAgaWYgKGN1cnNvcklzQmVmb3JlKGhlYWQsIGFuY2hvcikpIHsKICAgICAgICBoZWFkID0gY3Vyc29yTWluKHN0YXJ0LCBoZWFkKTsKICAgICAgICBhbmNob3IgPSBjdXJzb3JNYXgoYW5jaG9yLCBlbmQpOwogICAgICB9IGVsc2UgewogICAgICAgIGFuY2hvciA9IGN1cnNvck1pbihzdGFydCwgYW5jaG9yKTsKICAgICAgICBoZWFkID0gY3Vyc29yTWF4KGhlYWQsIGVuZCk7CiAgICAgICAgaGVhZCA9IG9mZnNldEN1cnNvcihoZWFkLCAwLCAtMSk7CiAgICAgICAgaWYgKGhlYWQuY2ggPT0gLTEgJiYgaGVhZC5saW5lICE9IGNtLmZpcnN0TGluZSgpKSB7CiAgICAgICAgICBoZWFkID0gUG9zKGhlYWQubGluZSAtIDEsIGxpbmVMZW5ndGgoY20sIGhlYWQubGluZSAtIDEpKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIFthbmNob3IsIGhlYWRdOwogICAgfQogICAgLyoqCiAgICAgKiBVcGRhdGVzIHRoZSBDb2RlTWlycm9yIHNlbGVjdGlvbiB0byBtYXRjaCB0aGUgcHJvdmlkZWQgdmltIHNlbGVjdGlvbi4KICAgICAqIElmIG5vIGFyZ3VtZW50cyBhcmUgZ2l2ZW4sIGl0IHVzZXMgdGhlIGN1cnJlbnQgdmltIHNlbGVjdGlvbiBzdGF0ZS4KICAgICAqLwogICAgZnVuY3Rpb24gdXBkYXRlQ21TZWxlY3Rpb24oY20sIHNlbCwgbW9kZSkgewogICAgICB2YXIgdmltID0gY20uc3RhdGUudmltOwogICAgICBzZWwgPSBzZWwgfHwgdmltLnNlbDsKICAgICAgdmFyIG1vZGUgPSBtb2RlIHx8CiAgICAgICAgdmltLnZpc3VhbExpbmUgPyAnbGluZScgOiB2aW0udmlzdWFsQmxvY2sgPyAnYmxvY2snIDogJ2NoYXInOwogICAgICB2YXIgY21TZWwgPSBtYWtlQ21TZWxlY3Rpb24oY20sIHNlbCwgbW9kZSk7CiAgICAgIGNtLnNldFNlbGVjdGlvbnMoY21TZWwucmFuZ2VzLCBjbVNlbC5wcmltYXJ5KTsKICAgICAgdXBkYXRlRmFrZUN1cnNvcihjbSk7CiAgICB9CiAgICBmdW5jdGlvbiBtYWtlQ21TZWxlY3Rpb24oY20sIHNlbCwgbW9kZSwgZXhjbHVzaXZlKSB7CiAgICAgIHZhciBoZWFkID0gY29weUN1cnNvcihzZWwuaGVhZCk7CiAgICAgIHZhciBhbmNob3IgPSBjb3B5Q3Vyc29yKHNlbC5hbmNob3IpOwogICAgICBpZiAobW9kZSA9PSAnY2hhcicpIHsKICAgICAgICB2YXIgaGVhZE9mZnNldCA9ICFleGNsdXNpdmUgJiYgIWN1cnNvcklzQmVmb3JlKHNlbC5oZWFkLCBzZWwuYW5jaG9yKSA/IDEgOiAwOwogICAgICAgIHZhciBhbmNob3JPZmZzZXQgPSBjdXJzb3JJc0JlZm9yZShzZWwuaGVhZCwgc2VsLmFuY2hvcikgPyAxIDogMDsKICAgICAgICBoZWFkID0gb2Zmc2V0Q3Vyc29yKHNlbC5oZWFkLCAwLCBoZWFkT2Zmc2V0KTsKICAgICAgICBhbmNob3IgPSBvZmZzZXRDdXJzb3Ioc2VsLmFuY2hvciwgMCwgYW5jaG9yT2Zmc2V0KTsKICAgICAgICByZXR1cm4gewogICAgICAgICAgcmFuZ2VzOiBbe2FuY2hvcjogYW5jaG9yLCBoZWFkOiBoZWFkfV0sCiAgICAgICAgICBwcmltYXJ5OiAwCiAgICAgICAgfTsKICAgICAgfSBlbHNlIGlmIChtb2RlID09ICdsaW5lJykgewogICAgICAgIGlmICghY3Vyc29ySXNCZWZvcmUoc2VsLmhlYWQsIHNlbC5hbmNob3IpKSB7CiAgICAgICAgICBhbmNob3IuY2ggPSAwOwoKICAgICAgICAgIHZhciBsYXN0TGluZSA9IGNtLmxhc3RMaW5lKCk7CiAgICAgICAgICBpZiAoaGVhZC5saW5lID4gbGFzdExpbmUpIHsKICAgICAgICAgICAgaGVhZC5saW5lID0gbGFzdExpbmU7CiAgICAgICAgICB9CiAgICAgICAgICBoZWFkLmNoID0gbGluZUxlbmd0aChjbSwgaGVhZC5saW5lKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaGVhZC5jaCA9IDA7CiAgICAgICAgICBhbmNob3IuY2ggPSBsaW5lTGVuZ3RoKGNtLCBhbmNob3IubGluZSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB7CiAgICAgICAgICByYW5nZXM6IFt7YW5jaG9yOiBhbmNob3IsIGhlYWQ6IGhlYWR9XSwKICAgICAgICAgIHByaW1hcnk6IDAKICAgICAgICB9OwogICAgICB9IGVsc2UgaWYgKG1vZGUgPT0gJ2Jsb2NrJykgewogICAgICAgIHZhciB0b3AgPSBNYXRoLm1pbihhbmNob3IubGluZSwgaGVhZC5saW5lKSwKICAgICAgICAgICAgbGVmdCA9IE1hdGgubWluKGFuY2hvci5jaCwgaGVhZC5jaCksCiAgICAgICAgICAgIGJvdHRvbSA9IE1hdGgubWF4KGFuY2hvci5saW5lLCBoZWFkLmxpbmUpLAogICAgICAgICAgICByaWdodCA9IE1hdGgubWF4KGFuY2hvci5jaCwgaGVhZC5jaCkgKyAxOwogICAgICAgIHZhciBoZWlnaHQgPSBib3R0b20gLSB0b3AgKyAxOwogICAgICAgIHZhciBwcmltYXJ5ID0gaGVhZC5saW5lID09IHRvcCA/IDAgOiBoZWlnaHQgLSAxOwogICAgICAgIHZhciByYW5nZXMgPSBbXTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7CiAgICAgICAgICByYW5nZXMucHVzaCh7CiAgICAgICAgICAgIGFuY2hvcjogUG9zKHRvcCArIGksIGxlZnQpLAogICAgICAgICAgICBoZWFkOiBQb3ModG9wICsgaSwgcmlnaHQpCiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHJhbmdlczogcmFuZ2VzLAogICAgICAgICAgcHJpbWFyeTogcHJpbWFyeQogICAgICAgIH07CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGdldEhlYWQoY20pIHsKICAgICAgdmFyIGN1ciA9IGNtLmdldEN1cnNvcignaGVhZCcpOwogICAgICBpZiAoY20uZ2V0U2VsZWN0aW9uKCkubGVuZ3RoID09IDEpIHsKICAgICAgICAvLyBTbWFsbCBjb3JuZXIgY2FzZSB3aGVuIG9ubHkgMSBjaGFyYWN0ZXIgaXMgc2VsZWN0ZWQuIFRoZSAicmVhbCIKICAgICAgICAvLyBoZWFkIGlzIHRoZSBsZWZ0IG9mIGhlYWQgYW5kIGFuY2hvci4KICAgICAgICBjdXIgPSBjdXJzb3JNaW4oY3VyLCBjbS5nZXRDdXJzb3IoJ2FuY2hvcicpKTsKICAgICAgfQogICAgICByZXR1cm4gY3VyOwogICAgfQoKICAgIC8qKgogICAgICogSWYgbW92ZUhlYWQgaXMgc2V0IHRvIGZhbHNlLCB0aGUgQ29kZU1pcnJvciBzZWxlY3Rpb24gd2lsbCBub3QgYmUKICAgICAqIHRvdWNoZWQuIFRoZSBjYWxsZXIgYXNzdW1lcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgcHV0dGluZyB0aGUgY3Vyc29yCiAgICAqIGluIHRoZSByaWdodCBwbGFjZS4KICAgICAqLwogICAgZnVuY3Rpb24gZXhpdFZpc3VhbE1vZGUoY20sIG1vdmVIZWFkKSB7CiAgICAgIHZhciB2aW0gPSBjbS5zdGF0ZS52aW07CiAgICAgIGlmIChtb3ZlSGVhZCAhPT0gZmFsc2UpIHsKICAgICAgICBjbS5zZXRDdXJzb3IoY2xpcEN1cnNvclRvQ29udGVudChjbSwgdmltLnNlbC5oZWFkKSk7CiAgICAgIH0KICAgICAgdXBkYXRlTGFzdFNlbGVjdGlvbihjbSwgdmltKTsKICAgICAgdmltLnZpc3VhbE1vZGUgPSBmYWxzZTsKICAgICAgdmltLnZpc3VhbExpbmUgPSBmYWxzZTsKICAgICAgdmltLnZpc3VhbEJsb2NrID0gZmFsc2U7CiAgICAgIENvZGVNaXJyb3Iuc2lnbmFsKGNtLCAidmltLW1vZGUtY2hhbmdlIiwge21vZGU6ICJub3JtYWwifSk7CiAgICAgIGlmICh2aW0uZmFrZUN1cnNvcikgewogICAgICAgIHZpbS5mYWtlQ3Vyc29yLmNsZWFyKCk7CiAgICAgIH0KICAgIH0KCiAgICAvLyBSZW1vdmUgYW55IHRyYWlsaW5nIG5ld2xpbmVzIGZyb20gdGhlIHNlbGVjdGlvbi4gRm9yCiAgICAvLyBleGFtcGxlLCB3aXRoIHRoZSBjYXJldCBhdCB0aGUgc3RhcnQgb2YgdGhlIGxhc3Qgd29yZCBvbiB0aGUgbGluZSwKICAgIC8vICdkdycgc2hvdWxkIHdvcmQsIGJ1dCBub3QgdGhlIG5ld2xpbmUsIHdoaWxlICd3JyBzaG91bGQgYWR2YW5jZSB0aGUKICAgIC8vIGNhcmV0IHRvIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgdGhlIG5leHQgbGluZS4KICAgIGZ1bmN0aW9uIGNsaXBUb0xpbmUoY20sIGN1clN0YXJ0LCBjdXJFbmQpIHsKICAgICAgdmFyIHNlbGVjdGlvbiA9IGNtLmdldFJhbmdlKGN1clN0YXJ0LCBjdXJFbmQpOwogICAgICAvLyBPbmx5IGNsaXAgaWYgdGhlIHNlbGVjdGlvbiBlbmRzIHdpdGggdHJhaWxpbmcgbmV3bGluZSArIHdoaXRlc3BhY2UKICAgICAgaWYgKC9cblxzKiQvLnRlc3Qoc2VsZWN0aW9uKSkgewogICAgICAgIHZhciBsaW5lcyA9IHNlbGVjdGlvbi5zcGxpdCgnXG4nKTsKICAgICAgICAvLyBXZSBrbm93IHRoaXMgaXMgYWxsIHdoaXRlc3BhY2UuCiAgICAgICAgbGluZXMucG9wKCk7CgogICAgICAgIC8vIENhc2VzOgogICAgICAgIC8vIDEuIExhc3Qgd29yZCBpcyBhbiBlbXB0eSBsaW5lIC0gZG8gbm90IGNsaXAgdGhlIHRyYWlsaW5nICdcbicKICAgICAgICAvLyAyLiBMYXN0IHdvcmQgaXMgbm90IGFuIGVtcHR5IGxpbmUgLSBjbGlwIHRoZSB0cmFpbGluZyAnXG4nCiAgICAgICAgdmFyIGxpbmU7CiAgICAgICAgLy8gRmluZCB0aGUgbGluZSBjb250YWluaW5nIHRoZSBsYXN0IHdvcmQsIGFuZCBjbGlwIGFsbCB3aGl0ZXNwYWNlIHVwCiAgICAgICAgLy8gdG8gaXQuCiAgICAgICAgZm9yICh2YXIgbGluZSA9IGxpbmVzLnBvcCgpOyBsaW5lcy5sZW5ndGggPiAwICYmIGxpbmUgJiYgaXNXaGl0ZVNwYWNlU3RyaW5nKGxpbmUpOyBsaW5lID0gbGluZXMucG9wKCkpIHsKICAgICAgICAgIGN1ckVuZC5saW5lLS07CiAgICAgICAgICBjdXJFbmQuY2ggPSAwOwogICAgICAgIH0KICAgICAgICAvLyBJZiB0aGUgbGFzdCB3b3JkIGlzIG5vdCBhbiBlbXB0eSBsaW5lLCBjbGlwIGFuIGFkZGl0aW9uYWwgbmV3bGluZQogICAgICAgIGlmIChsaW5lKSB7CiAgICAgICAgICBjdXJFbmQubGluZS0tOwogICAgICAgICAgY3VyRW5kLmNoID0gbGluZUxlbmd0aChjbSwgY3VyRW5kLmxpbmUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjdXJFbmQuY2ggPSAwOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8vIEV4cGFuZCB0aGUgc2VsZWN0aW9uIHRvIGxpbmUgZW5kcy4KICAgIGZ1bmN0aW9uIGV4cGFuZFNlbGVjdGlvblRvTGluZShfY20sIGN1clN0YXJ0LCBjdXJFbmQpIHsKICAgICAgY3VyU3RhcnQuY2ggPSAwOwogICAgICBjdXJFbmQuY2ggPSAwOwogICAgICBjdXJFbmQubGluZSsrOwogICAgfQoKICAgIGZ1bmN0aW9uIGZpbmRGaXJzdE5vbldoaXRlU3BhY2VDaGFyYWN0ZXIodGV4dCkgewogICAgICBpZiAoIXRleHQpIHsKICAgICAgICByZXR1cm4gMDsKICAgICAgfQogICAgICB2YXIgZmlyc3ROb25XUyA9IHRleHQuc2VhcmNoKC9cUy8pOwogICAgICByZXR1cm4gZmlyc3ROb25XUyA9PSAtMSA/IHRleHQubGVuZ3RoIDogZmlyc3ROb25XUzsKICAgIH0KCiAgICBmdW5jdGlvbiBleHBhbmRXb3JkVW5kZXJDdXJzb3IoY20sIGluY2x1c2l2ZSwgX2ZvcndhcmQsIGJpZ1dvcmQsIG5vU3ltYm9sKSB7CiAgICAgIHZhciBjdXIgPSBnZXRIZWFkKGNtKTsKICAgICAgdmFyIGxpbmUgPSBjbS5nZXRMaW5lKGN1ci5saW5lKTsKICAgICAgdmFyIGlkeCA9IGN1ci5jaDsKCiAgICAgIC8vIFNlZWsgdG8gZmlyc3Qgd29yZCBvciBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIsIGRlcGVuZGluZyBvbiBpZgogICAgICAvLyBub1N5bWJvbCBpcyB0cnVlLgogICAgICB2YXIgdGVzdCA9IG5vU3ltYm9sID8gd29yZENoYXJUZXN0WzBdIDogYmlnV29yZENoYXJUZXN0IFswXTsKICAgICAgd2hpbGUgKCF0ZXN0KGxpbmUuY2hhckF0KGlkeCkpKSB7CiAgICAgICAgaWR4Kys7CiAgICAgICAgaWYgKGlkeCA+PSBsaW5lLmxlbmd0aCkgeyByZXR1cm4gbnVsbDsgfQogICAgICB9CgogICAgICBpZiAoYmlnV29yZCkgewogICAgICAgIHRlc3QgPSBiaWdXb3JkQ2hhclRlc3RbMF07CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdGVzdCA9IHdvcmRDaGFyVGVzdFswXTsKICAgICAgICBpZiAoIXRlc3QobGluZS5jaGFyQXQoaWR4KSkpIHsKICAgICAgICAgIHRlc3QgPSB3b3JkQ2hhclRlc3RbMV07CiAgICAgICAgfQogICAgICB9CgogICAgICB2YXIgZW5kID0gaWR4LCBzdGFydCA9IGlkeDsKICAgICAgd2hpbGUgKHRlc3QobGluZS5jaGFyQXQoZW5kKSkgJiYgZW5kIDwgbGluZS5sZW5ndGgpIHsgZW5kKys7IH0KICAgICAgd2hpbGUgKHRlc3QobGluZS5jaGFyQXQoc3RhcnQpKSAmJiBzdGFydCA+PSAwKSB7IHN0YXJ0LS07IH0KICAgICAgc3RhcnQrKzsKCiAgICAgIGlmIChpbmNsdXNpdmUpIHsKICAgICAgICAvLyBJZiBwcmVzZW50LCBpbmNsdWRlIGFsbCB3aGl0ZXNwYWNlIGFmdGVyIHdvcmQuCiAgICAgICAgLy8gT3RoZXJ3aXNlLCBpbmNsdWRlIGFsbCB3aGl0ZXNwYWNlIGJlZm9yZSB3b3JkLCBleGNlcHQgaW5kZW50YXRpb24uCiAgICAgICAgdmFyIHdvcmRFbmQgPSBlbmQ7CiAgICAgICAgd2hpbGUgKC9ccy8udGVzdChsaW5lLmNoYXJBdChlbmQpKSAmJiBlbmQgPCBsaW5lLmxlbmd0aCkgeyBlbmQrKzsgfQogICAgICAgIGlmICh3b3JkRW5kID09IGVuZCkgewogICAgICAgICAgdmFyIHdvcmRTdGFydCA9IHN0YXJ0OwogICAgICAgICAgd2hpbGUgKC9ccy8udGVzdChsaW5lLmNoYXJBdChzdGFydCAtIDEpKSAmJiBzdGFydCA+IDApIHsgc3RhcnQtLTsgfQogICAgICAgICAgaWYgKCFzdGFydCkgeyBzdGFydCA9IHdvcmRTdGFydDsgfQogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4geyBzdGFydDogUG9zKGN1ci5saW5lLCBzdGFydCksIGVuZDogUG9zKGN1ci5saW5lLCBlbmQpIH07CiAgICB9CgogICAgZnVuY3Rpb24gcmVjb3JkSnVtcFBvc2l0aW9uKGNtLCBvbGRDdXIsIG5ld0N1cikgewogICAgICBpZiAoIWN1cnNvckVxdWFsKG9sZEN1ciwgbmV3Q3VyKSkgewogICAgICAgIHZpbUdsb2JhbFN0YXRlLmp1bXBMaXN0LmFkZChjbSwgb2xkQ3VyLCBuZXdDdXIpOwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gcmVjb3JkTGFzdENoYXJhY3RlclNlYXJjaChpbmNyZW1lbnQsIGFyZ3MpIHsKICAgICAgICB2aW1HbG9iYWxTdGF0ZS5sYXN0Q2hhcmFjdGVyU2VhcmNoLmluY3JlbWVudCA9IGluY3JlbWVudDsKICAgICAgICB2aW1HbG9iYWxTdGF0ZS5sYXN0Q2hhcmFjdGVyU2VhcmNoLmZvcndhcmQgPSBhcmdzLmZvcndhcmQ7CiAgICAgICAgdmltR2xvYmFsU3RhdGUubGFzdENoYXJhY3RlclNlYXJjaC5zZWxlY3RlZENoYXJhY3RlciA9IGFyZ3Muc2VsZWN0ZWRDaGFyYWN0ZXI7CiAgICB9CgogICAgdmFyIHN5bWJvbFRvTW9kZSA9IHsKICAgICAgICAnKCc6ICdicmFja2V0JywgJyknOiAnYnJhY2tldCcsICd7JzogJ2JyYWNrZXQnLCAnfSc6ICdicmFja2V0JywKICAgICAgICAnWyc6ICdzZWN0aW9uJywgJ10nOiAnc2VjdGlvbicsCiAgICAgICAgJyonOiAnY29tbWVudCcsICcvJzogJ2NvbW1lbnQnLAogICAgICAgICdtJzogJ21ldGhvZCcsICdNJzogJ21ldGhvZCcsCiAgICAgICAgJyMnOiAncHJlcHJvY2VzcycKICAgIH07CiAgICB2YXIgZmluZFN5bWJvbE1vZGVzID0gewogICAgICBicmFja2V0OiB7CiAgICAgICAgaXNDb21wbGV0ZTogZnVuY3Rpb24oc3RhdGUpIHsKICAgICAgICAgIGlmIChzdGF0ZS5uZXh0Q2ggPT09IHN0YXRlLnN5bWIpIHsKICAgICAgICAgICAgc3RhdGUuZGVwdGgrKzsKICAgICAgICAgICAgaWYgKHN0YXRlLmRlcHRoID49IDEpcmV0dXJuIHRydWU7CiAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlLm5leHRDaCA9PT0gc3RhdGUucmV2ZXJzZVN5bWIpIHsKICAgICAgICAgICAgc3RhdGUuZGVwdGgtLTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIHNlY3Rpb246IHsKICAgICAgICBpbml0OiBmdW5jdGlvbihzdGF0ZSkgewogICAgICAgICAgc3RhdGUuY3VyTW92ZVRocm91Z2ggPSB0cnVlOwogICAgICAgICAgc3RhdGUuc3ltYiA9IChzdGF0ZS5mb3J3YXJkID8gJ10nIDogJ1snKSA9PT0gc3RhdGUuc3ltYiA/ICd7JyA6ICd9JzsKICAgICAgICB9LAogICAgICAgIGlzQ29tcGxldGU6IGZ1bmN0aW9uKHN0YXRlKSB7CiAgICAgICAgICByZXR1cm4gc3RhdGUuaW5kZXggPT09IDAgJiYgc3RhdGUubmV4dENoID09PSBzdGF0ZS5zeW1iOwogICAgICAgIH0KICAgICAgfSwKICAgICAgY29tbWVudDogewogICAgICAgIGlzQ29tcGxldGU6IGZ1bmN0aW9uKHN0YXRlKSB7CiAgICAgICAgICB2YXIgZm91bmQgPSBzdGF0ZS5sYXN0Q2ggPT09ICcqJyAmJiBzdGF0ZS5uZXh0Q2ggPT09ICcvJzsKICAgICAgICAgIHN0YXRlLmxhc3RDaCA9IHN0YXRlLm5leHRDaDsKICAgICAgICAgIHJldHVybiBmb3VuZDsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIC8vIFRPRE86IFRoZSBvcmlnaW5hbCBWaW0gaW1wbGVtZW50YXRpb24gb25seSBvcGVyYXRlcyBvbiBsZXZlbCAxIGFuZCAyLgogICAgICAvLyBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IGNoZWNrIGZvciBjb2RlIGJsb2NrIGxldmVsIGFuZAogICAgICAvLyB0aGVyZWZvcmUgaXQgb3BlcmF0ZXMgb24gYW55IGxldmVscy4KICAgICAgbWV0aG9kOiB7CiAgICAgICAgaW5pdDogZnVuY3Rpb24oc3RhdGUpIHsKICAgICAgICAgIHN0YXRlLnN5bWIgPSAoc3RhdGUuc3ltYiA9PT0gJ20nID8gJ3snIDogJ30nKTsKICAgICAgICAgIHN0YXRlLnJldmVyc2VTeW1iID0gc3RhdGUuc3ltYiA9PT0gJ3snID8gJ30nIDogJ3snOwogICAgICAgIH0sCiAgICAgICAgaXNDb21wbGV0ZTogZnVuY3Rpb24oc3RhdGUpIHsKICAgICAgICAgIGlmIChzdGF0ZS5uZXh0Q2ggPT09IHN0YXRlLnN5bWIpcmV0dXJuIHRydWU7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICB9LAogICAgICBwcmVwcm9jZXNzOiB7CiAgICAgICAgaW5pdDogZnVuY3Rpb24oc3RhdGUpIHsKICAgICAgICAgIHN0YXRlLmluZGV4ID0gMDsKICAgICAgICB9LAogICAgICAgIGlzQ29tcGxldGU6IGZ1bmN0aW9uKHN0YXRlKSB7CiAgICAgICAgICBpZiAoc3RhdGUubmV4dENoID09PSAnIycpIHsKICAgICAgICAgICAgdmFyIHRva2VuID0gc3RhdGUubGluZVRleHQubWF0Y2goLyMoXHcrKS8pWzFdOwogICAgICAgICAgICBpZiAodG9rZW4gPT09ICdlbmRpZicpIHsKICAgICAgICAgICAgICBpZiAoc3RhdGUuZm9yd2FyZCAmJiBzdGF0ZS5kZXB0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHN0YXRlLmRlcHRoKys7CiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdpZicpIHsKICAgICAgICAgICAgICBpZiAoIXN0YXRlLmZvcndhcmQgJiYgc3RhdGUuZGVwdGggPT09IDApIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBzdGF0ZS5kZXB0aC0tOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0b2tlbiA9PT0gJ2Vsc2UnICYmIHN0YXRlLmRlcHRoID09PSAwKXJldHVybiB0cnVlOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgfQogICAgfTsKICAgIGZ1bmN0aW9uIGZpbmRTeW1ib2woY20sIHJlcGVhdCwgZm9yd2FyZCwgc3ltYikgewogICAgICB2YXIgY3VyID0gY29weUN1cnNvcihjbS5nZXRDdXJzb3IoKSk7CiAgICAgIHZhciBpbmNyZW1lbnQgPSBmb3J3YXJkID8gMSA6IC0xOwogICAgICB2YXIgZW5kTGluZSA9IGZvcndhcmQgPyBjbS5saW5lQ291bnQoKSA6IC0xOwogICAgICB2YXIgY3VyQ2ggPSBjdXIuY2g7CiAgICAgIHZhciBsaW5lID0gY3VyLmxpbmU7CiAgICAgIHZhciBsaW5lVGV4dCA9IGNtLmdldExpbmUobGluZSk7CiAgICAgIHZhciBzdGF0ZSA9IHsKICAgICAgICBsaW5lVGV4dDogbGluZVRleHQsCiAgICAgICAgbmV4dENoOiBsaW5lVGV4dC5jaGFyQXQoY3VyQ2gpLAogICAgICAgIGxhc3RDaDogbnVsbCwKICAgICAgICBpbmRleDogY3VyQ2gsCiAgICAgICAgc3ltYjogc3ltYiwKICAgICAgICByZXZlcnNlU3ltYjogKGZvcndhcmQgPyAgeyAnKSc6ICcoJywgJ30nOiAneycgfSA6IHsgJygnOiAnKScsICd7JzogJ30nIH0pW3N5bWJdLAogICAgICAgIGZvcndhcmQ6IGZvcndhcmQsCiAgICAgICAgZGVwdGg6IDAsCiAgICAgICAgY3VyTW92ZVRocm91Z2g6IGZhbHNlCiAgICAgIH07CiAgICAgIHZhciBtb2RlID0gc3ltYm9sVG9Nb2RlW3N5bWJdOwogICAgICBpZiAoIW1vZGUpcmV0dXJuIGN1cjsKICAgICAgdmFyIGluaXQgPSBmaW5kU3ltYm9sTW9kZXNbbW9kZV0uaW5pdDsKICAgICAgdmFyIGlzQ29tcGxldGUgPSBmaW5kU3ltYm9sTW9kZXNbbW9kZV0uaXNDb21wbGV0ZTsKICAgICAgaWYgKGluaXQpIHsgaW5pdChzdGF0ZSk7IH0KICAgICAgd2hpbGUgKGxpbmUgIT09IGVuZExpbmUgJiYgcmVwZWF0KSB7CiAgICAgICAgc3RhdGUuaW5kZXggKz0gaW5jcmVtZW50OwogICAgICAgIHN0YXRlLm5leHRDaCA9IHN0YXRlLmxpbmVUZXh0LmNoYXJBdChzdGF0ZS5pbmRleCk7CiAgICAgICAgaWYgKCFzdGF0ZS5uZXh0Q2gpIHsKICAgICAgICAgIGxpbmUgKz0gaW5jcmVtZW50OwogICAgICAgICAgc3RhdGUubGluZVRleHQgPSBjbS5nZXRMaW5lKGxpbmUpIHx8ICcnOwogICAgICAgICAgaWYgKGluY3JlbWVudCA+IDApIHsKICAgICAgICAgICAgc3RhdGUuaW5kZXggPSAwOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdmFyIGxpbmVMZW4gPSBzdGF0ZS5saW5lVGV4dC5sZW5ndGg7CiAgICAgICAgICAgIHN0YXRlLmluZGV4ID0gKGxpbmVMZW4gPiAwKSA/IChsaW5lTGVuLTEpIDogMDsKICAgICAgICAgIH0KICAgICAgICAgIHN0YXRlLm5leHRDaCA9IHN0YXRlLmxpbmVUZXh0LmNoYXJBdChzdGF0ZS5pbmRleCk7CiAgICAgICAgfQogICAgICAgIGlmIChpc0NvbXBsZXRlKHN0YXRlKSkgewogICAgICAgICAgY3VyLmxpbmUgPSBsaW5lOwogICAgICAgICAgY3VyLmNoID0gc3RhdGUuaW5kZXg7CiAgICAgICAgICByZXBlYXQtLTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHN0YXRlLm5leHRDaCB8fCBzdGF0ZS5jdXJNb3ZlVGhyb3VnaCkgewogICAgICAgIHJldHVybiBQb3MobGluZSwgc3RhdGUuaW5kZXgpOwogICAgICB9CiAgICAgIHJldHVybiBjdXI7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBib3VuZGFyaWVzIG9mIHRoZSBuZXh0IHdvcmQuIElmIHRoZSBjdXJzb3IgaW4gdGhlIG1pZGRsZSBvZgogICAgICogdGhlIHdvcmQsIHRoZW4gcmV0dXJucyB0aGUgYm91bmRhcmllcyBvZiB0aGUgY3VycmVudCB3b3JkLCBzdGFydGluZyBhdAogICAgICogdGhlIGN1cnNvci4gSWYgdGhlIGN1cnNvciBpcyBhdCB0aGUgc3RhcnQvZW5kIG9mIGEgd29yZCwgYW5kIHdlIGFyZSBnb2luZwogICAgICogZm9yd2FyZC9iYWNrd2FyZCwgcmVzcGVjdGl2ZWx5LCBmaW5kIHRoZSBib3VuZGFyaWVzIG9mIHRoZSBuZXh0IHdvcmQuCiAgICAgKgogICAgICogQHBhcmFtIHtDb2RlTWlycm9yfSBjbSBDb2RlTWlycm9yIG9iamVjdC4KICAgICAqIEBwYXJhbSB7Q3Vyc29yfSBjdXIgVGhlIGN1cnNvciBwb3NpdGlvbi4KICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZm9yd2FyZCBUcnVlIHRvIHNlYXJjaCBmb3J3YXJkLiBGYWxzZSB0byBzZWFyY2gKICAgICAqICAgICBiYWNrd2FyZC4KICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gYmlnV29yZCBUcnVlIGlmIHB1bmN0dWF0aW9uIGNvdW50IGFzIHBhcnQgb2YgdGhlIHdvcmQuCiAgICAgKiAgICAgRmFsc2UgaWYgb25seSBbYS16QS1aMC05XSBjaGFyYWN0ZXJzIGNvdW50IGFzIHBhcnQgb2YgdGhlIHdvcmQuCiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGVtcHR5TGluZUlzV29yZCBUcnVlIGlmIGVtcHR5IGxpbmVzIHNob3VsZCBiZSB0cmVhdGVkCiAgICAgKiAgICAgYXMgd29yZHMuCiAgICAgKiBAcmV0dXJuIHtPYmplY3R7ZnJvbTpudW1iZXIsIHRvOm51bWJlciwgbGluZTogbnVtYmVyfX0gVGhlIGJvdW5kYXJpZXMgb2YKICAgICAqICAgICB0aGUgd29yZCwgb3IgbnVsbCBpZiB0aGVyZSBhcmUgbm8gbW9yZSB3b3Jkcy4KICAgICAqLwogICAgZnVuY3Rpb24gZmluZFdvcmQoY20sIGN1ciwgZm9yd2FyZCwgYmlnV29yZCwgZW1wdHlMaW5lSXNXb3JkKSB7CiAgICAgIHZhciBsaW5lTnVtID0gY3VyLmxpbmU7CiAgICAgIHZhciBwb3MgPSBjdXIuY2g7CiAgICAgIHZhciBsaW5lID0gY20uZ2V0TGluZShsaW5lTnVtKTsKICAgICAgdmFyIGRpciA9IGZvcndhcmQgPyAxIDogLTE7CiAgICAgIHZhciBjaGFyVGVzdHMgPSBiaWdXb3JkID8gYmlnV29yZENoYXJUZXN0OiB3b3JkQ2hhclRlc3Q7CgogICAgICBpZiAoZW1wdHlMaW5lSXNXb3JkICYmIGxpbmUgPT0gJycpIHsKICAgICAgICBsaW5lTnVtICs9IGRpcjsKICAgICAgICBsaW5lID0gY20uZ2V0TGluZShsaW5lTnVtKTsKICAgICAgICBpZiAoIWlzTGluZShjbSwgbGluZU51bSkpIHsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBwb3MgPSAoZm9yd2FyZCkgPyAwIDogbGluZS5sZW5ndGg7CiAgICAgIH0KCiAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgaWYgKGVtcHR5TGluZUlzV29yZCAmJiBsaW5lID09ICcnKSB7CiAgICAgICAgICByZXR1cm4geyBmcm9tOiAwLCB0bzogMCwgbGluZTogbGluZU51bSB9OwogICAgICAgIH0KICAgICAgICB2YXIgc3RvcCA9IChkaXIgPiAwKSA/IGxpbmUubGVuZ3RoIDogLTE7CiAgICAgICAgdmFyIHdvcmRTdGFydCA9IHN0b3AsIHdvcmRFbmQgPSBzdG9wOwogICAgICAgIC8vIEZpbmQgYm91bmRzIG9mIG5leHQgd29yZC4KICAgICAgICB3aGlsZSAocG9zICE9IHN0b3ApIHsKICAgICAgICAgIHZhciBmb3VuZFdvcmQgPSBmYWxzZTsKICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2hhclRlc3RzLmxlbmd0aCAmJiAhZm91bmRXb3JkOyArK2kpIHsKICAgICAgICAgICAgaWYgKGNoYXJUZXN0c1tpXShsaW5lLmNoYXJBdChwb3MpKSkgewogICAgICAgICAgICAgIHdvcmRTdGFydCA9IHBvczsKICAgICAgICAgICAgICAvLyBBZHZhbmNlIHRvIGVuZCBvZiB3b3JkLgogICAgICAgICAgICAgIHdoaWxlIChwb3MgIT0gc3RvcCAmJiBjaGFyVGVzdHNbaV0obGluZS5jaGFyQXQocG9zKSkpIHsKICAgICAgICAgICAgICAgIHBvcyArPSBkaXI7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHdvcmRFbmQgPSBwb3M7CiAgICAgICAgICAgICAgZm91bmRXb3JkID0gd29yZFN0YXJ0ICE9IHdvcmRFbmQ7CiAgICAgICAgICAgICAgaWYgKHdvcmRTdGFydCA9PSBjdXIuY2ggJiYgbGluZU51bSA9PSBjdXIubGluZSAmJgogICAgICAgICAgICAgICAgICB3b3JkRW5kID09IHdvcmRTdGFydCArIGRpcikgewogICAgICAgICAgICAgICAgLy8gV2Ugc3RhcnRlZCBhdCB0aGUgZW5kIG9mIGEgd29yZC4gRmluZCB0aGUgbmV4dCBvbmUuCiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgZnJvbTogTWF0aC5taW4od29yZFN0YXJ0LCB3b3JkRW5kICsgMSksCiAgICAgICAgICAgICAgICAgIHRvOiBNYXRoLm1heCh3b3JkU3RhcnQsIHdvcmRFbmQpLAogICAgICAgICAgICAgICAgICBsaW5lOiBsaW5lTnVtIH07CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoIWZvdW5kV29yZCkgewogICAgICAgICAgICBwb3MgKz0gZGlyOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBBZHZhbmNlIHRvIG5leHQvcHJldiBsaW5lLgogICAgICAgIGxpbmVOdW0gKz0gZGlyOwogICAgICAgIGlmICghaXNMaW5lKGNtLCBsaW5lTnVtKSkgewogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIGxpbmUgPSBjbS5nZXRMaW5lKGxpbmVOdW0pOwogICAgICAgIHBvcyA9IChkaXIgPiAwKSA/IDAgOiBsaW5lLmxlbmd0aDsKICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIHtDb2RlTWlycm9yfSBjbSBDb2RlTWlycm9yIG9iamVjdC4KICAgICAqIEBwYXJhbSB7UG9zfSBjdXIgVGhlIHBvc2l0aW9uIHRvIHN0YXJ0IGZyb20uCiAgICAgKiBAcGFyYW0ge2ludH0gcmVwZWF0IE51bWJlciBvZiB3b3JkcyB0byBtb3ZlIHBhc3QuCiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGZvcndhcmQgVHJ1ZSB0byBzZWFyY2ggZm9yd2FyZC4gRmFsc2UgdG8gc2VhcmNoCiAgICAgKiAgICAgYmFja3dhcmQuCiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHdvcmRFbmQgVHJ1ZSB0byBtb3ZlIHRvIGVuZCBvZiB3b3JkLiBGYWxzZSB0byBtb3ZlIHRvCiAgICAgKiAgICAgYmVnaW5uaW5nIG9mIHdvcmQuCiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGJpZ1dvcmQgVHJ1ZSBpZiBwdW5jdHVhdGlvbiBjb3VudCBhcyBwYXJ0IG9mIHRoZSB3b3JkLgogICAgICogICAgIEZhbHNlIGlmIG9ubHkgYWxwaGFiZXQgY2hhcmFjdGVycyBjb3VudCBhcyBwYXJ0IG9mIHRoZSB3b3JkLgogICAgICogQHJldHVybiB7Q3Vyc29yfSBUaGUgcG9zaXRpb24gdGhlIGN1cnNvciBzaG91bGQgbW92ZSB0by4KICAgICAqLwogICAgZnVuY3Rpb24gbW92ZVRvV29yZChjbSwgY3VyLCByZXBlYXQsIGZvcndhcmQsIHdvcmRFbmQsIGJpZ1dvcmQpIHsKICAgICAgdmFyIGN1clN0YXJ0ID0gY29weUN1cnNvcihjdXIpOwogICAgICB2YXIgd29yZHMgPSBbXTsKICAgICAgaWYgKGZvcndhcmQgJiYgIXdvcmRFbmQgfHwgIWZvcndhcmQgJiYgd29yZEVuZCkgewogICAgICAgIHJlcGVhdCsrOwogICAgICB9CiAgICAgIC8vIEZvciAnZScsIGVtcHR5IGxpbmVzIGFyZSBub3QgY29uc2lkZXJlZCB3b3JkcywgZ28gZmlndXJlLgogICAgICB2YXIgZW1wdHlMaW5lSXNXb3JkID0gIShmb3J3YXJkICYmIHdvcmRFbmQpOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlcGVhdDsgaSsrKSB7CiAgICAgICAgdmFyIHdvcmQgPSBmaW5kV29yZChjbSwgY3VyLCBmb3J3YXJkLCBiaWdXb3JkLCBlbXB0eUxpbmVJc1dvcmQpOwogICAgICAgIGlmICghd29yZCkgewogICAgICAgICAgdmFyIGVvZENoID0gbGluZUxlbmd0aChjbSwgY20ubGFzdExpbmUoKSk7CiAgICAgICAgICB3b3Jkcy5wdXNoKGZvcndhcmQKICAgICAgICAgICAgICA/IHtsaW5lOiBjbS5sYXN0TGluZSgpLCBmcm9tOiBlb2RDaCwgdG86IGVvZENofQogICAgICAgICAgICAgIDoge2xpbmU6IDAsIGZyb206IDAsIHRvOiAwfSk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgd29yZHMucHVzaCh3b3JkKTsKICAgICAgICBjdXIgPSBQb3Mod29yZC5saW5lLCBmb3J3YXJkID8gKHdvcmQudG8gLSAxKSA6IHdvcmQuZnJvbSk7CiAgICAgIH0KICAgICAgdmFyIHNob3J0Q2lyY3VpdCA9IHdvcmRzLmxlbmd0aCAhPSByZXBlYXQ7CiAgICAgIHZhciBmaXJzdFdvcmQgPSB3b3Jkc1swXTsKICAgICAgdmFyIGxhc3RXb3JkID0gd29yZHMucG9wKCk7CiAgICAgIGlmIChmb3J3YXJkICYmICF3b3JkRW5kKSB7CiAgICAgICAgLy8gdwogICAgICAgIGlmICghc2hvcnRDaXJjdWl0ICYmIChmaXJzdFdvcmQuZnJvbSAhPSBjdXJTdGFydC5jaCB8fCBmaXJzdFdvcmQubGluZSAhPSBjdXJTdGFydC5saW5lKSkgewogICAgICAgICAgLy8gV2UgZGlkIG5vdCBzdGFydCBpbiB0aGUgbWlkZGxlIG9mIGEgd29yZC4gRGlzY2FyZCB0aGUgZXh0cmEgd29yZCBhdCB0aGUgZW5kLgogICAgICAgICAgbGFzdFdvcmQgPSB3b3Jkcy5wb3AoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIFBvcyhsYXN0V29yZC5saW5lLCBsYXN0V29yZC5mcm9tKTsKICAgICAgfSBlbHNlIGlmIChmb3J3YXJkICYmIHdvcmRFbmQpIHsKICAgICAgICByZXR1cm4gUG9zKGxhc3RXb3JkLmxpbmUsIGxhc3RXb3JkLnRvIC0gMSk7CiAgICAgIH0gZWxzZSBpZiAoIWZvcndhcmQgJiYgd29yZEVuZCkgewogICAgICAgIC8vIGdlCiAgICAgICAgaWYgKCFzaG9ydENpcmN1aXQgJiYgKGZpcnN0V29yZC50byAhPSBjdXJTdGFydC5jaCB8fCBmaXJzdFdvcmQubGluZSAhPSBjdXJTdGFydC5saW5lKSkgewogICAgICAgICAgLy8gV2UgZGlkIG5vdCBzdGFydCBpbiB0aGUgbWlkZGxlIG9mIGEgd29yZC4gRGlzY2FyZCB0aGUgZXh0cmEgd29yZCBhdCB0aGUgZW5kLgogICAgICAgICAgbGFzdFdvcmQgPSB3b3Jkcy5wb3AoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIFBvcyhsYXN0V29yZC5saW5lLCBsYXN0V29yZC50byk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gYgogICAgICAgIHJldHVybiBQb3MobGFzdFdvcmQubGluZSwgbGFzdFdvcmQuZnJvbSk7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBtb3ZlVG9DaGFyYWN0ZXIoY20sIHJlcGVhdCwgZm9yd2FyZCwgY2hhcmFjdGVyKSB7CiAgICAgIHZhciBjdXIgPSBjbS5nZXRDdXJzb3IoKTsKICAgICAgdmFyIHN0YXJ0ID0gY3VyLmNoOwogICAgICB2YXIgaWR4OwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlcGVhdDsgaSArKykgewogICAgICAgIHZhciBsaW5lID0gY20uZ2V0TGluZShjdXIubGluZSk7CiAgICAgICAgaWR4ID0gY2hhcklkeEluTGluZShzdGFydCwgbGluZSwgY2hhcmFjdGVyLCBmb3J3YXJkLCB0cnVlKTsKICAgICAgICBpZiAoaWR4ID09IC0xKSB7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgc3RhcnQgPSBpZHg7CiAgICAgIH0KICAgICAgcmV0dXJuIFBvcyhjbS5nZXRDdXJzb3IoKS5saW5lLCBpZHgpOwogICAgfQoKICAgIGZ1bmN0aW9uIG1vdmVUb0NvbHVtbihjbSwgcmVwZWF0KSB7CiAgICAgIC8vIHJlcGVhdCBpcyBhbHdheXMgPj0gMSwgc28gcmVwZWF0IC0gMSBhbHdheXMgY29ycmVzcG9uZHMKICAgICAgLy8gdG8gdGhlIGNvbHVtbiB3ZSB3YW50IHRvIGdvIHRvLgogICAgICB2YXIgbGluZSA9IGNtLmdldEN1cnNvcigpLmxpbmU7CiAgICAgIHJldHVybiBjbGlwQ3Vyc29yVG9Db250ZW50KGNtLCBQb3MobGluZSwgcmVwZWF0IC0gMSkpOwogICAgfQoKICAgIGZ1bmN0aW9uIHVwZGF0ZU1hcmsoY20sIHZpbSwgbWFya05hbWUsIHBvcykgewogICAgICBpZiAoIWluQXJyYXkobWFya05hbWUsIHZhbGlkTWFya3MpKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmICh2aW0ubWFya3NbbWFya05hbWVdKSB7CiAgICAgICAgdmltLm1hcmtzW21hcmtOYW1lXS5jbGVhcigpOwogICAgICB9CiAgICAgIHZpbS5tYXJrc1ttYXJrTmFtZV0gPSBjbS5zZXRCb29rbWFyayhwb3MpOwogICAgfQoKICAgIGZ1bmN0aW9uIGNoYXJJZHhJbkxpbmUoc3RhcnQsIGxpbmUsIGNoYXJhY3RlciwgZm9yd2FyZCwgaW5jbHVkZUNoYXIpIHsKICAgICAgLy8gU2VhcmNoIGZvciBjaGFyIGluIGxpbmUuCiAgICAgIC8vIG1vdGlvbl9vcHRpb25zOiB7Zm9yd2FyZCwgaW5jbHVkZUNoYXJ9CiAgICAgIC8vIElmIGluY2x1ZGVDaGFyID0gdHJ1ZSwgaW5jbHVkZSBpdCB0b28uCiAgICAgIC8vIElmIGZvcndhcmQgPSB0cnVlLCBzZWFyY2ggZm9yd2FyZCwgZWxzZSBzZWFyY2ggYmFja3dhcmRzLgogICAgICAvLyBJZiBjaGFyIGlzIG5vdCBmb3VuZCBvbiB0aGlzIGxpbmUsIGRvIG5vdGhpbmcKICAgICAgdmFyIGlkeDsKICAgICAgaWYgKGZvcndhcmQpIHsKICAgICAgICBpZHggPSBsaW5lLmluZGV4T2YoY2hhcmFjdGVyLCBzdGFydCArIDEpOwogICAgICAgIGlmIChpZHggIT0gLTEgJiYgIWluY2x1ZGVDaGFyKSB7CiAgICAgICAgICBpZHggLT0gMTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWR4ID0gbGluZS5sYXN0SW5kZXhPZihjaGFyYWN0ZXIsIHN0YXJ0IC0gMSk7CiAgICAgICAgaWYgKGlkeCAhPSAtMSAmJiAhaW5jbHVkZUNoYXIpIHsKICAgICAgICAgIGlkeCArPSAxOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gaWR4OwogICAgfQoKICAgIGZ1bmN0aW9uIGZpbmRQYXJhZ3JhcGgoY20sIGhlYWQsIHJlcGVhdCwgZGlyLCBpbmNsdXNpdmUpIHsKICAgICAgdmFyIGxpbmUgPSBoZWFkLmxpbmU7CiAgICAgIHZhciBtaW4gPSBjbS5maXJzdExpbmUoKTsKICAgICAgdmFyIG1heCA9IGNtLmxhc3RMaW5lKCk7CiAgICAgIHZhciBzdGFydCwgZW5kLCBpID0gbGluZTsKICAgICAgZnVuY3Rpb24gaXNFbXB0eShpKSB7IHJldHVybiAhY20uZ2V0TGluZShpKTsgfQogICAgICBmdW5jdGlvbiBpc0JvdW5kYXJ5KGksIGRpciwgYW55KSB7CiAgICAgICAgaWYgKGFueSkgeyByZXR1cm4gaXNFbXB0eShpKSAhPSBpc0VtcHR5KGkgKyBkaXIpOyB9CiAgICAgICAgcmV0dXJuICFpc0VtcHR5KGkpICYmIGlzRW1wdHkoaSArIGRpcik7CiAgICAgIH0KICAgICAgaWYgKGRpcikgewogICAgICAgIHdoaWxlIChtaW4gPD0gaSAmJiBpIDw9IG1heCAmJiByZXBlYXQgPiAwKSB7CiAgICAgICAgICBpZiAoaXNCb3VuZGFyeShpLCBkaXIpKSB7IHJlcGVhdC0tOyB9CiAgICAgICAgICBpICs9IGRpcjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5ldyBQb3MoaSwgMCk7CiAgICAgIH0KCiAgICAgIHZhciB2aW0gPSBjbS5zdGF0ZS52aW07CiAgICAgIGlmICh2aW0udmlzdWFsTGluZSAmJiBpc0JvdW5kYXJ5KGxpbmUsIDEsIHRydWUpKSB7CiAgICAgICAgdmFyIGFuY2hvciA9IHZpbS5zZWwuYW5jaG9yOwogICAgICAgIGlmIChpc0JvdW5kYXJ5KGFuY2hvci5saW5lLCAtMSwgdHJ1ZSkpIHsKICAgICAgICAgIGlmICghaW5jbHVzaXZlIHx8IGFuY2hvci5saW5lICE9IGxpbmUpIHsKICAgICAgICAgICAgbGluZSArPSAxOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICB2YXIgc3RhcnRTdGF0ZSA9IGlzRW1wdHkobGluZSk7CiAgICAgIGZvciAoaSA9IGxpbmU7IGkgPD0gbWF4ICYmIHJlcGVhdDsgaSsrKSB7CiAgICAgICAgaWYgKGlzQm91bmRhcnkoaSwgMSwgdHJ1ZSkpIHsKICAgICAgICAgIGlmICghaW5jbHVzaXZlIHx8IGlzRW1wdHkoaSkgIT0gc3RhcnRTdGF0ZSkgewogICAgICAgICAgICByZXBlYXQtLTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgZW5kID0gbmV3IFBvcyhpLCAwKTsKICAgICAgLy8gc2VsZWN0IGJvdW5kYXJ5IGJlZm9yZSBwYXJhZ3JhcGggZm9yIHRoZSBsYXN0IG9uZQogICAgICBpZiAoaSA+IG1heCAmJiAhc3RhcnRTdGF0ZSkgeyBzdGFydFN0YXRlID0gdHJ1ZTsgfQogICAgICBlbHNlIHsgaW5jbHVzaXZlID0gZmFsc2U7IH0KICAgICAgZm9yIChpID0gbGluZTsgaSA+IG1pbjsgaS0tKSB7CiAgICAgICAgaWYgKCFpbmNsdXNpdmUgfHwgaXNFbXB0eShpKSA9PSBzdGFydFN0YXRlIHx8IGkgPT0gbGluZSkgewogICAgICAgICAgaWYgKGlzQm91bmRhcnkoaSwgLTEsIHRydWUpKSB7IGJyZWFrOyB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHN0YXJ0ID0gbmV3IFBvcyhpLCAwKTsKICAgICAgcmV0dXJuIHsgc3RhcnQ6IHN0YXJ0LCBlbmQ6IGVuZCB9OwogICAgfQoKICAgIC8vIFRPRE86IHBlcmhhcHMgdGhpcyBmaW5hZ2xpbmcgb2Ygc3RhcnQgYW5kIGVuZCBwb3NpdGlvbnMgYmVsb25kcwogICAgLy8gaW4gY29kZW1pcnJvci9yZXBsYWNlUmFuZ2U/CiAgICBmdW5jdGlvbiBzZWxlY3RDb21wYW5pb25PYmplY3QoY20sIGhlYWQsIHN5bWIsIGluY2x1c2l2ZSkgewogICAgICB2YXIgY3VyID0gaGVhZCwgc3RhcnQsIGVuZDsKCiAgICAgIHZhciBicmFja2V0UmVnZXhwID0gKHsKICAgICAgICAnKCc6IC9bKCldLywgJyknOiAvWygpXS8sCiAgICAgICAgJ1snOiAvW1tcXV0vLCAnXSc6IC9bW1xdXS8sCiAgICAgICAgJ3snOiAvW3t9XS8sICd9JzogL1t7fV0vfSlbc3ltYl07CiAgICAgIHZhciBvcGVuU3ltID0gKHsKICAgICAgICAnKCc6ICcoJywgJyknOiAnKCcsCiAgICAgICAgJ1snOiAnWycsICddJzogJ1snLAogICAgICAgICd7JzogJ3snLCAnfSc6ICd7J30pW3N5bWJdOwogICAgICB2YXIgY3VyQ2hhciA9IGNtLmdldExpbmUoY3VyLmxpbmUpLmNoYXJBdChjdXIuY2gpOwogICAgICAvLyBEdWUgdG8gdGhlIGJlaGF2aW9yIG9mIHNjYW5Gb3JCcmFja2V0LCB3ZSBuZWVkIHRvIGFkZCBhbiBvZmZzZXQgaWYgdGhlCiAgICAgIC8vIGN1cnNvciBpcyBvbiBhIG1hdGNoaW5nIG9wZW4gYnJhY2tldC4KICAgICAgdmFyIG9mZnNldCA9IGN1ckNoYXIgPT09IG9wZW5TeW0gPyAxIDogMDsKCiAgICAgIHN0YXJ0ID0gY20uc2NhbkZvckJyYWNrZXQoUG9zKGN1ci5saW5lLCBjdXIuY2ggKyBvZmZzZXQpLCAtMSwgbnVsbCwgeydicmFja2V0UmVnZXgnOiBicmFja2V0UmVnZXhwfSk7CiAgICAgIGVuZCA9IGNtLnNjYW5Gb3JCcmFja2V0KFBvcyhjdXIubGluZSwgY3VyLmNoICsgb2Zmc2V0KSwgMSwgbnVsbCwgeydicmFja2V0UmVnZXgnOiBicmFja2V0UmVnZXhwfSk7CgogICAgICBpZiAoIXN0YXJ0IHx8ICFlbmQpIHsKICAgICAgICByZXR1cm4geyBzdGFydDogY3VyLCBlbmQ6IGN1ciB9OwogICAgICB9CgogICAgICBzdGFydCA9IHN0YXJ0LnBvczsKICAgICAgZW5kID0gZW5kLnBvczsKCiAgICAgIGlmICgoc3RhcnQubGluZSA9PSBlbmQubGluZSAmJiBzdGFydC5jaCA+IGVuZC5jaCkKICAgICAgICAgIHx8IChzdGFydC5saW5lID4gZW5kLmxpbmUpKSB7CiAgICAgICAgdmFyIHRtcCA9IHN0YXJ0OwogICAgICAgIHN0YXJ0ID0gZW5kOwogICAgICAgIGVuZCA9IHRtcDsKICAgICAgfQoKICAgICAgaWYgKGluY2x1c2l2ZSkgewogICAgICAgIGVuZC5jaCArPSAxOwogICAgICB9IGVsc2UgewogICAgICAgIHN0YXJ0LmNoICs9IDE7CiAgICAgIH0KCiAgICAgIHJldHVybiB7IHN0YXJ0OiBzdGFydCwgZW5kOiBlbmQgfTsKICAgIH0KCiAgICAvLyBUYWtlcyBpbiBhIHN5bWJvbCBhbmQgYSBjdXJzb3IgYW5kIHRyaWVzIHRvIHNpbXVsYXRlIHRleHQgb2JqZWN0cyB0aGF0CiAgICAvLyBoYXZlIGlkZW50aWNhbCBvcGVuaW5nIGFuZCBjbG9zaW5nIHN5bWJvbHMKICAgIC8vIFRPRE8gc3VwcG9ydCBhY3Jvc3MgbXVsdGlwbGUgbGluZXMKICAgIGZ1bmN0aW9uIGZpbmRCZWdpbm5pbmdBbmRFbmQoY20sIGhlYWQsIHN5bWIsIGluY2x1c2l2ZSkgewogICAgICB2YXIgY3VyID0gY29weUN1cnNvcihoZWFkKTsKICAgICAgdmFyIGxpbmUgPSBjbS5nZXRMaW5lKGN1ci5saW5lKTsKICAgICAgdmFyIGNoYXJzID0gbGluZS5zcGxpdCgnJyk7CiAgICAgIHZhciBzdGFydCwgZW5kLCBpLCBsZW47CiAgICAgIHZhciBmaXJzdEluZGV4ID0gY2hhcnMuaW5kZXhPZihzeW1iKTsKCiAgICAgIC8vIHRoZSBkZWNpc2lvbiB0cmVlIGlzIHRvIGFsd2F5cyBsb29rIGJhY2t3YXJkcyBmb3IgdGhlIGJlZ2lubmluZyBmaXJzdCwKICAgICAgLy8gYnV0IGlmIHRoZSBjdXJzb3IgaXMgaW4gZnJvbnQgb2YgdGhlIGZpcnN0IGluc3RhbmNlIG9mIHRoZSBzeW1iLAogICAgICAvLyB0aGVuIG1vdmUgdGhlIGN1cnNvciBmb3J3YXJkCiAgICAgIGlmIChjdXIuY2ggPCBmaXJzdEluZGV4KSB7CiAgICAgICAgY3VyLmNoID0gZmlyc3RJbmRleDsKICAgICAgICAvLyBXaHkgaXMgdGhpcyBsaW5lIGV2ZW4gaGVyZT8/PwogICAgICAgIC8vIGNtLnNldEN1cnNvcihjdXIubGluZSwgZmlyc3RJbmRleCsxKTsKICAgICAgfQogICAgICAvLyBvdGhlcndpc2UgaWYgdGhlIGN1cnNvciBpcyBjdXJyZW50bHkgb24gdGhlIGNsb3Npbmcgc3ltYm9sCiAgICAgIGVsc2UgaWYgKGZpcnN0SW5kZXggPCBjdXIuY2ggJiYgY2hhcnNbY3VyLmNoXSA9PSBzeW1iKSB7CiAgICAgICAgZW5kID0gY3VyLmNoOyAvLyBhc3NpZ24gZW5kIHRvIHRoZSBjdXJyZW50IGN1cnNvcgogICAgICAgIC0tY3VyLmNoOyAvLyBtYWtlIHN1cmUgdG8gbG9vayBiYWNrd2FyZHMKICAgICAgfQoKICAgICAgLy8gaWYgd2UncmUgY3VycmVudGx5IG9uIHRoZSBzeW1ib2wsIHdlJ3ZlIGdvdCBhIHN0YXJ0CiAgICAgIGlmIChjaGFyc1tjdXIuY2hdID09IHN5bWIgJiYgIWVuZCkgewogICAgICAgIHN0YXJ0ID0gY3VyLmNoICsgMTsgLy8gYXNzaWduIHN0YXJ0IHRvIGFoZWFkIG9mIHRoZSBjdXJzb3IKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBnbyBiYWNrd2FyZHMgdG8gZmluZCB0aGUgc3RhcnQKICAgICAgICBmb3IgKGkgPSBjdXIuY2g7IGkgPiAtMSAmJiAhc3RhcnQ7IGktLSkgewogICAgICAgICAgaWYgKGNoYXJzW2ldID09IHN5bWIpIHsKICAgICAgICAgICAgc3RhcnQgPSBpICsgMTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIGxvb2sgZm9yd2FyZHMgZm9yIHRoZSBlbmQgc3ltYm9sCiAgICAgIGlmIChzdGFydCAmJiAhZW5kKSB7CiAgICAgICAgZm9yIChpID0gc3RhcnQsIGxlbiA9IGNoYXJzLmxlbmd0aDsgaSA8IGxlbiAmJiAhZW5kOyBpKyspIHsKICAgICAgICAgIGlmIChjaGFyc1tpXSA9PSBzeW1iKSB7CiAgICAgICAgICAgIGVuZCA9IGk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyBub3RoaW5nIGZvdW5kCiAgICAgIGlmICghc3RhcnQgfHwgIWVuZCkgewogICAgICAgIHJldHVybiB7IHN0YXJ0OiBjdXIsIGVuZDogY3VyIH07CiAgICAgIH0KCiAgICAgIC8vIGluY2x1ZGUgdGhlIHN5bWJvbHMKICAgICAgaWYgKGluY2x1c2l2ZSkgewogICAgICAgIC0tc3RhcnQ7ICsrZW5kOwogICAgICB9CgogICAgICByZXR1cm4gewogICAgICAgIHN0YXJ0OiBQb3MoY3VyLmxpbmUsIHN0YXJ0KSwKICAgICAgICBlbmQ6IFBvcyhjdXIubGluZSwgZW5kKQogICAgICB9OwogICAgfQoKICAgIC8vIFNlYXJjaCBmdW5jdGlvbnMKICAgIGRlZmluZU9wdGlvbigncGNyZScsIHRydWUsICdib29sZWFuJyk7CiAgICBmdW5jdGlvbiBTZWFyY2hTdGF0ZSgpIHt9CiAgICBTZWFyY2hTdGF0ZS5wcm90b3R5cGUgPSB7CiAgICAgIGdldFF1ZXJ5OiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdmltR2xvYmFsU3RhdGUucXVlcnk7CiAgICAgIH0sCiAgICAgIHNldFF1ZXJ5OiBmdW5jdGlvbihxdWVyeSkgewogICAgICAgIHZpbUdsb2JhbFN0YXRlLnF1ZXJ5ID0gcXVlcnk7CiAgICAgIH0sCiAgICAgIGdldE92ZXJsYXk6IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLnNlYXJjaE92ZXJsYXk7CiAgICAgIH0sCiAgICAgIHNldE92ZXJsYXk6IGZ1bmN0aW9uKG92ZXJsYXkpIHsKICAgICAgICB0aGlzLnNlYXJjaE92ZXJsYXkgPSBvdmVybGF5OwogICAgICB9LAogICAgICBpc1JldmVyc2VkOiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdmltR2xvYmFsU3RhdGUuaXNSZXZlcnNlZDsKICAgICAgfSwKICAgICAgc2V0UmV2ZXJzZWQ6IGZ1bmN0aW9uKHJldmVyc2VkKSB7CiAgICAgICAgdmltR2xvYmFsU3RhdGUuaXNSZXZlcnNlZCA9IHJldmVyc2VkOwogICAgICB9LAogICAgICBnZXRTY3JvbGxiYXJBbm5vdGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuYW5ub3RhdGU7CiAgICAgIH0sCiAgICAgIHNldFNjcm9sbGJhckFubm90YXRlOiBmdW5jdGlvbihhbm5vdGF0ZSkgewogICAgICAgIHRoaXMuYW5ub3RhdGUgPSBhbm5vdGF0ZTsKICAgICAgfQogICAgfTsKICAgIGZ1bmN0aW9uIGdldFNlYXJjaFN0YXRlKGNtKSB7CiAgICAgIHZhciB2aW0gPSBjbS5zdGF0ZS52aW07CiAgICAgIHJldHVybiB2aW0uc2VhcmNoU3RhdGVfIHx8ICh2aW0uc2VhcmNoU3RhdGVfID0gbmV3IFNlYXJjaFN0YXRlKCkpOwogICAgfQogICAgZnVuY3Rpb24gZGlhbG9nKGNtLCB0ZW1wbGF0ZSwgc2hvcnRUZXh0LCBvbkNsb3NlLCBvcHRpb25zKSB7CiAgICAgIGlmIChjbS5vcGVuRGlhbG9nKSB7CiAgICAgICAgY20ub3BlbkRpYWxvZyh0ZW1wbGF0ZSwgb25DbG9zZSwgeyBib3R0b206IHRydWUsIHZhbHVlOiBvcHRpb25zLnZhbHVlLAogICAgICAgICAgICBvbktleURvd246IG9wdGlvbnMub25LZXlEb3duLCBvbktleVVwOiBvcHRpb25zLm9uS2V5VXAsCiAgICAgICAgICAgIHNlbGVjdFZhbHVlT25PcGVuOiBmYWxzZX0pOwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIG9uQ2xvc2UocHJvbXB0KHNob3J0VGV4dCwgJycpKTsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gc3BsaXRCeVNsYXNoKGFyZ1N0cmluZykgewogICAgICB2YXIgc2xhc2hlcyA9IGZpbmRVbmVzY2FwZWRTbGFzaGVzKGFyZ1N0cmluZykgfHwgW107CiAgICAgIGlmICghc2xhc2hlcy5sZW5ndGgpIHJldHVybiBbXTsKICAgICAgdmFyIHRva2VucyA9IFtdOwogICAgICAvLyBpbiBjYXNlIG9mIHN0cmluZ3MgbGlrZSBmb28vYmFyCiAgICAgIGlmIChzbGFzaGVzWzBdICE9PSAwKSByZXR1cm47CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2xhc2hlcy5sZW5ndGg7IGkrKykgewogICAgICAgIGlmICh0eXBlb2Ygc2xhc2hlc1tpXSA9PSAnbnVtYmVyJykKICAgICAgICAgIHRva2Vucy5wdXNoKGFyZ1N0cmluZy5zdWJzdHJpbmcoc2xhc2hlc1tpXSArIDEsIHNsYXNoZXNbaSsxXSkpOwogICAgICB9CiAgICAgIHJldHVybiB0b2tlbnM7CiAgICB9CgogICAgZnVuY3Rpb24gZmluZFVuZXNjYXBlZFNsYXNoZXMoc3RyKSB7CiAgICAgIHZhciBlc2NhcGVOZXh0Q2hhciA9IGZhbHNlOwogICAgICB2YXIgc2xhc2hlcyA9IFtdOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciBjID0gc3RyLmNoYXJBdChpKTsKICAgICAgICBpZiAoIWVzY2FwZU5leHRDaGFyICYmIGMgPT0gJy8nKSB7CiAgICAgICAgICBzbGFzaGVzLnB1c2goaSk7CiAgICAgICAgfQogICAgICAgIGVzY2FwZU5leHRDaGFyID0gIWVzY2FwZU5leHRDaGFyICYmIChjID09ICdcXCcpOwogICAgICB9CiAgICAgIHJldHVybiBzbGFzaGVzOwogICAgfQoKICAgIC8vIFRyYW5zbGF0ZXMgYSBzZWFyY2ggc3RyaW5nIGZyb20gZXggKHZpbSkgc3ludGF4IGludG8gamF2YXNjcmlwdCBmb3JtLgogICAgZnVuY3Rpb24gdHJhbnNsYXRlUmVnZXgoc3RyKSB7CiAgICAgIC8vIFdoZW4gdGhlc2UgbWF0Y2gsIGFkZCBhICdcJyBpZiB1bmVzY2FwZWQgb3IgcmVtb3ZlIG9uZSBpZiBlc2NhcGVkLgogICAgICB2YXIgc3BlY2lhbHMgPSAnfCgpeyc7CiAgICAgIC8vIFJlbW92ZSwgYnV0IG5ldmVyIGFkZCwgYSAnXCcgZm9yIHRoZXNlLgogICAgICB2YXIgdW5lc2NhcGUgPSAnfSc7CiAgICAgIHZhciBlc2NhcGVOZXh0Q2hhciA9IGZhbHNlOwogICAgICB2YXIgb3V0ID0gW107CiAgICAgIGZvciAodmFyIGkgPSAtMTsgaSA8IHN0ci5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciBjID0gc3RyLmNoYXJBdChpKSB8fCAnJzsKICAgICAgICB2YXIgbiA9IHN0ci5jaGFyQXQoaSsxKSB8fCAnJzsKICAgICAgICB2YXIgc3BlY2lhbENvbWVzTmV4dCA9IChuICYmIHNwZWNpYWxzLmluZGV4T2YobikgIT0gLTEpOwogICAgICAgIGlmIChlc2NhcGVOZXh0Q2hhcikgewogICAgICAgICAgaWYgKGMgIT09ICdcXCcgfHwgIXNwZWNpYWxDb21lc05leHQpIHsKICAgICAgICAgICAgb3V0LnB1c2goYyk7CiAgICAgICAgICB9CiAgICAgICAgICBlc2NhcGVOZXh0Q2hhciA9IGZhbHNlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoYyA9PT0gJ1xcJykgewogICAgICAgICAgICBlc2NhcGVOZXh0Q2hhciA9IHRydWU7CiAgICAgICAgICAgIC8vIFRyZWF0IHRoZSB1bmVzY2FwZSBsaXN0IGFzIHNwZWNpYWwgZm9yIHJlbW92aW5nLCBidXQgbm90IGFkZGluZyAnXCcuCiAgICAgICAgICAgIGlmIChuICYmIHVuZXNjYXBlLmluZGV4T2YobikgIT0gLTEpIHsKICAgICAgICAgICAgICBzcGVjaWFsQ29tZXNOZXh0ID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBOb3QgcGFzc2luZyB0aGlzIHRlc3QgbWVhbnMgcmVtb3ZpbmcgYSAnXCcuCiAgICAgICAgICAgIGlmICghc3BlY2lhbENvbWVzTmV4dCB8fCBuID09PSAnXFwnKSB7CiAgICAgICAgICAgICAgb3V0LnB1c2goYyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG91dC5wdXNoKGMpOwogICAgICAgICAgICBpZiAoc3BlY2lhbENvbWVzTmV4dCAmJiBuICE9PSAnXFwnKSB7CiAgICAgICAgICAgICAgb3V0LnB1c2goJ1xcJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIG91dC5qb2luKCcnKTsKICAgIH0KCiAgICAvLyBUcmFuc2xhdGVzIHRoZSByZXBsYWNlIHBhcnQgb2YgYSBzZWFyY2ggYW5kIHJlcGxhY2UgZnJvbSBleCAodmltKSBzeW50YXggaW50bwogICAgLy8gamF2YXNjcmlwdCBmb3JtLiAgU2ltaWxhciB0byB0cmFuc2xhdGVSZWdleCwgYnV0IGFkZGl0aW9uYWxseSBmaXhlcyBiYWNrIHJlZmVyZW5jZXMKICAgIC8vICh0cmFuc2xhdGVzICdcWzAuLjldJyB0byAnJFswLi45XScpIGFuZCBmb2xsb3dzIGRpZmZlcmVudCBydWxlcyBmb3IgZXNjYXBpbmcgJyQnLgogICAgdmFyIGNoYXJVbmVzY2FwZXMgPSB7J1xcbic6ICdcbicsICdcXHInOiAnXHInLCAnXFx0JzogJ1x0J307CiAgICBmdW5jdGlvbiB0cmFuc2xhdGVSZWdleFJlcGxhY2Uoc3RyKSB7CiAgICAgIHZhciBlc2NhcGVOZXh0Q2hhciA9IGZhbHNlOwogICAgICB2YXIgb3V0ID0gW107CiAgICAgIGZvciAodmFyIGkgPSAtMTsgaSA8IHN0ci5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciBjID0gc3RyLmNoYXJBdChpKSB8fCAnJzsKICAgICAgICB2YXIgbiA9IHN0ci5jaGFyQXQoaSsxKSB8fCAnJzsKICAgICAgICBpZiAoY2hhclVuZXNjYXBlc1tjICsgbl0pIHsKICAgICAgICAgIG91dC5wdXNoKGNoYXJVbmVzY2FwZXNbYytuXSk7CiAgICAgICAgICBpKys7CiAgICAgICAgfSBlbHNlIGlmIChlc2NhcGVOZXh0Q2hhcikgewogICAgICAgICAgLy8gQXQgYW55IHBvaW50IGluIHRoZSBsb29wLCBlc2NhcGVOZXh0Q2hhciBpcyB0cnVlIGlmIHRoZSBwcmV2aW91cwogICAgICAgICAgLy8gY2hhcmFjdGVyIHdhcyBhICdcJyBhbmQgd2FzIG5vdCBlc2NhcGVkLgogICAgICAgICAgb3V0LnB1c2goYyk7CiAgICAgICAgICBlc2NhcGVOZXh0Q2hhciA9IGZhbHNlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoYyA9PT0gJ1xcJykgewogICAgICAgICAgICBlc2NhcGVOZXh0Q2hhciA9IHRydWU7CiAgICAgICAgICAgIGlmICgoaXNOdW1iZXIobikgfHwgbiA9PT0gJyQnKSkgewogICAgICAgICAgICAgIG91dC5wdXNoKCckJyk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAobiAhPT0gJy8nICYmIG4gIT09ICdcXCcpIHsKICAgICAgICAgICAgICBvdXQucHVzaCgnXFwnKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKGMgPT09ICckJykgewogICAgICAgICAgICAgIG91dC5wdXNoKCckJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgb3V0LnB1c2goYyk7CiAgICAgICAgICAgIGlmIChuID09PSAnLycpIHsKICAgICAgICAgICAgICBvdXQucHVzaCgnXFwnKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gb3V0LmpvaW4oJycpOwogICAgfQoKICAgIC8vIFVuZXNjYXBlIFwgYW5kIC8gaW4gdGhlIHJlcGxhY2UgcGFydCwgZm9yIFBDUkUgbW9kZS4KICAgIHZhciB1bmVzY2FwZXMgPSB7J1xcLyc6ICcvJywgJ1xcXFwnOiAnXFwnLCAnXFxuJzogJ1xuJywgJ1xccic6ICdccicsICdcXHQnOiAnXHQnfTsKICAgIGZ1bmN0aW9uIHVuZXNjYXBlUmVnZXhSZXBsYWNlKHN0cikgewogICAgICB2YXIgc3RyZWFtID0gbmV3IENvZGVNaXJyb3IuU3RyaW5nU3RyZWFtKHN0cik7CiAgICAgIHZhciBvdXRwdXQgPSBbXTsKICAgICAgd2hpbGUgKCFzdHJlYW0uZW9sKCkpIHsKICAgICAgICAvLyBTZWFyY2ggZm9yIFwuCiAgICAgICAgd2hpbGUgKHN0cmVhbS5wZWVrKCkgJiYgc3RyZWFtLnBlZWsoKSAhPSAnXFwnKSB7CiAgICAgICAgICBvdXRwdXQucHVzaChzdHJlYW0ubmV4dCgpKTsKICAgICAgICB9CiAgICAgICAgdmFyIG1hdGNoZWQgPSBmYWxzZTsKICAgICAgICBmb3IgKHZhciBtYXRjaGVyIGluIHVuZXNjYXBlcykgewogICAgICAgICAgaWYgKHN0cmVhbS5tYXRjaChtYXRjaGVyLCB0cnVlKSkgewogICAgICAgICAgICBtYXRjaGVkID0gdHJ1ZTsKICAgICAgICAgICAgb3V0cHV0LnB1c2godW5lc2NhcGVzW21hdGNoZXJdKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghbWF0Y2hlZCkgewogICAgICAgICAgLy8gRG9uJ3QgY2hhbmdlIGFueXRoaW5nCiAgICAgICAgICBvdXRwdXQucHVzaChzdHJlYW0ubmV4dCgpKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIG91dHB1dC5qb2luKCcnKTsKICAgIH0KCiAgICAvKioKICAgICAqIEV4dHJhY3QgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBmcm9tIHRoZSBxdWVyeSBhbmQgcmV0dXJuIGEgUmVnZXhwIG9iamVjdC4KICAgICAqIFJldHVybnMgbnVsbCBpZiB0aGUgcXVlcnkgaXMgYmxhbmsuCiAgICAgKiBJZiBpZ25vcmVDYXNlIGlzIHBhc3NlZCBpbiwgdGhlIFJlZ2V4cCBvYmplY3Qgd2lsbCBoYXZlIHRoZSAnaScgZmxhZyBzZXQuCiAgICAgKiBJZiBzbWFydENhc2UgaXMgcGFzc2VkIGluLCBhbmQgdGhlIHF1ZXJ5IGNvbnRhaW5zIHVwcGVyIGNhc2UgbGV0dGVycywKICAgICAqICAgdGhlbiBpZ25vcmVDYXNlIGlzIG92ZXJyaWRkZW4sIGFuZCB0aGUgJ2knIGZsYWcgd2lsbCBub3QgYmUgc2V0LgogICAgICogSWYgdGhlIHF1ZXJ5IGNvbnRhaW5zIHRoZSAvaSBpbiB0aGUgZmxhZyBwYXJ0IG9mIHRoZSByZWd1bGFyIGV4cHJlc3Npb24sCiAgICAgKiAgIHRoZW4gYm90aCBpZ25vcmVDYXNlIGFuZCBzbWFydENhc2UgYXJlIGlnbm9yZWQsIGFuZCAnaScgd2lsbCBiZSBwYXNzZWQKICAgICAqICAgdGhyb3VnaCB0byB0aGUgUmVnZXggb2JqZWN0LgogICAgICovCiAgICBmdW5jdGlvbiBwYXJzZVF1ZXJ5KHF1ZXJ5LCBpZ25vcmVDYXNlLCBzbWFydENhc2UpIHsKICAgICAgLy8gRmlyc3QgdXBkYXRlIHRoZSBsYXN0IHNlYXJjaCByZWdpc3RlcgogICAgICB2YXIgbGFzdFNlYXJjaFJlZ2lzdGVyID0gdmltR2xvYmFsU3RhdGUucmVnaXN0ZXJDb250cm9sbGVyLmdldFJlZ2lzdGVyKCcvJyk7CiAgICAgIGxhc3RTZWFyY2hSZWdpc3Rlci5zZXRUZXh0KHF1ZXJ5KTsKICAgICAgLy8gQ2hlY2sgaWYgdGhlIHF1ZXJ5IGlzIGFscmVhZHkgYSByZWdleC4KICAgICAgaWYgKHF1ZXJ5IGluc3RhbmNlb2YgUmVnRXhwKSB7IHJldHVybiBxdWVyeTsgfQogICAgICAvLyBGaXJzdCB0cnkgdG8gZXh0cmFjdCByZWdleCArIGZsYWdzIGZyb20gdGhlIGlucHV0LiBJZiBubyBmbGFncyBmb3VuZCwKICAgICAgLy8gZXh0cmFjdCBqdXN0IHRoZSByZWdleC4gSUUgZG9lcyBub3QgYWNjZXB0IGZsYWdzIGRpcmVjdGx5IGRlZmluZWQgaW4KICAgICAgLy8gdGhlIHJlZ2V4IHN0cmluZyBpbiB0aGUgZm9ybSAvcmVnZXgvZmxhZ3MKICAgICAgdmFyIHNsYXNoZXMgPSBmaW5kVW5lc2NhcGVkU2xhc2hlcyhxdWVyeSk7CiAgICAgIHZhciByZWdleFBhcnQ7CiAgICAgIHZhciBmb3JjZUlnbm9yZUNhc2U7CiAgICAgIGlmICghc2xhc2hlcy5sZW5ndGgpIHsKICAgICAgICAvLyBRdWVyeSBsb29rcyBsaWtlICdyZWdleHAnCiAgICAgICAgcmVnZXhQYXJ0ID0gcXVlcnk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLy8gUXVlcnkgbG9va3MgbGlrZSAncmVnZXhwLy4uLicKICAgICAgICByZWdleFBhcnQgPSBxdWVyeS5zdWJzdHJpbmcoMCwgc2xhc2hlc1swXSk7CiAgICAgICAgdmFyIGZsYWdzUGFydCA9IHF1ZXJ5LnN1YnN0cmluZyhzbGFzaGVzWzBdKTsKICAgICAgICBmb3JjZUlnbm9yZUNhc2UgPSAoZmxhZ3NQYXJ0LmluZGV4T2YoJ2knKSAhPSAtMSk7CiAgICAgIH0KICAgICAgaWYgKCFyZWdleFBhcnQpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBpZiAoIWdldE9wdGlvbigncGNyZScpKSB7CiAgICAgICAgcmVnZXhQYXJ0ID0gdHJhbnNsYXRlUmVnZXgocmVnZXhQYXJ0KTsKICAgICAgfQogICAgICBpZiAoc21hcnRDYXNlKSB7CiAgICAgICAgaWdub3JlQ2FzZSA9ICgvXlteQS1aXSokLykudGVzdChyZWdleFBhcnQpOwogICAgICB9CiAgICAgIHZhciByZWdleHAgPSBuZXcgUmVnRXhwKHJlZ2V4UGFydCwKICAgICAgICAgIChpZ25vcmVDYXNlIHx8IGZvcmNlSWdub3JlQ2FzZSkgPyAnaScgOiB1bmRlZmluZWQpOwogICAgICByZXR1cm4gcmVnZXhwOwogICAgfQogICAgZnVuY3Rpb24gc2hvd0NvbmZpcm0oY20sIHRleHQpIHsKICAgICAgaWYgKGNtLm9wZW5Ob3RpZmljYXRpb24pIHsKICAgICAgICBjbS5vcGVuTm90aWZpY2F0aW9uKCc8c3BhbiBzdHlsZT0iY29sb3I6IHJlZCI+JyArIHRleHQgKyAnPC9zcGFuPicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ym90dG9tOiB0cnVlLCBkdXJhdGlvbjogNTAwMH0pOwogICAgICB9IGVsc2UgewogICAgICAgIGFsZXJ0KHRleHQpOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBtYWtlUHJvbXB0KHByZWZpeCwgZGVzYykgewogICAgICB2YXIgcmF3ID0gJzxzcGFuIHN0eWxlPSJmb250LWZhbWlseTogbW9ub3NwYWNlOyB3aGl0ZS1zcGFjZTogcHJlIj4nICsKICAgICAgICAgIChwcmVmaXggfHwgIiIpICsgJzxpbnB1dCB0eXBlPSJ0ZXh0Ij48L3NwYW4+JzsKICAgICAgaWYgKGRlc2MpCiAgICAgICAgcmF3ICs9ICcgPHNwYW4gc3R5bGU9ImNvbG9yOiAjODg4Ij4nICsgZGVzYyArICc8L3NwYW4+JzsKICAgICAgcmV0dXJuIHJhdzsKICAgIH0KICAgIHZhciBzZWFyY2hQcm9tcHREZXNjID0gJyhKYXZhc2NyaXB0IHJlZ2V4cCknOwogICAgZnVuY3Rpb24gc2hvd1Byb21wdChjbSwgb3B0aW9ucykgewogICAgICB2YXIgc2hvcnRUZXh0ID0gKG9wdGlvbnMucHJlZml4IHx8ICcnKSArICcgJyArIChvcHRpb25zLmRlc2MgfHwgJycpOwogICAgICB2YXIgcHJvbXB0ID0gbWFrZVByb21wdChvcHRpb25zLnByZWZpeCwgb3B0aW9ucy5kZXNjKTsKICAgICAgZGlhbG9nKGNtLCBwcm9tcHQsIHNob3J0VGV4dCwgb3B0aW9ucy5vbkNsb3NlLCBvcHRpb25zKTsKICAgIH0KICAgIGZ1bmN0aW9uIHJlZ2V4RXF1YWwocjEsIHIyKSB7CiAgICAgIGlmIChyMSBpbnN0YW5jZW9mIFJlZ0V4cCAmJiByMiBpbnN0YW5jZW9mIFJlZ0V4cCkgewogICAgICAgICAgdmFyIHByb3BzID0gWydnbG9iYWwnLCAnbXVsdGlsaW5lJywgJ2lnbm9yZUNhc2UnLCAnc291cmNlJ107CiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgdmFyIHByb3AgPSBwcm9wc1tpXTsKICAgICAgICAgICAgICBpZiAocjFbcHJvcF0gIT09IHIyW3Byb3BdKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIHF1ZXJ5IGlzIHZhbGlkLgogICAgZnVuY3Rpb24gdXBkYXRlU2VhcmNoUXVlcnkoY20sIHJhd1F1ZXJ5LCBpZ25vcmVDYXNlLCBzbWFydENhc2UpIHsKICAgICAgaWYgKCFyYXdRdWVyeSkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICB2YXIgc3RhdGUgPSBnZXRTZWFyY2hTdGF0ZShjbSk7CiAgICAgIHZhciBxdWVyeSA9IHBhcnNlUXVlcnkocmF3UXVlcnksICEhaWdub3JlQ2FzZSwgISFzbWFydENhc2UpOwogICAgICBpZiAoIXF1ZXJ5KSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGhpZ2hsaWdodFNlYXJjaE1hdGNoZXMoY20sIHF1ZXJ5KTsKICAgICAgaWYgKHJlZ2V4RXF1YWwocXVlcnksIHN0YXRlLmdldFF1ZXJ5KCkpKSB7CiAgICAgICAgcmV0dXJuIHF1ZXJ5OwogICAgICB9CiAgICAgIHN0YXRlLnNldFF1ZXJ5KHF1ZXJ5KTsKICAgICAgcmV0dXJuIHF1ZXJ5OwogICAgfQogICAgZnVuY3Rpb24gc2VhcmNoT3ZlcmxheShxdWVyeSkgewogICAgICBpZiAocXVlcnkuc291cmNlLmNoYXJBdCgwKSA9PSAnXicpIHsKICAgICAgICB2YXIgbWF0Y2hTb2wgPSB0cnVlOwogICAgICB9CiAgICAgIHJldHVybiB7CiAgICAgICAgdG9rZW46IGZ1bmN0aW9uKHN0cmVhbSkgewogICAgICAgICAgaWYgKG1hdGNoU29sICYmICFzdHJlYW0uc29sKCkpIHsKICAgICAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICB2YXIgbWF0Y2ggPSBzdHJlYW0ubWF0Y2gocXVlcnksIGZhbHNlKTsKICAgICAgICAgIGlmIChtYXRjaCkgewogICAgICAgICAgICBpZiAobWF0Y2hbMF0ubGVuZ3RoID09IDApIHsKICAgICAgICAgICAgICAvLyBNYXRjaGVkIGVtcHR5IHN0cmluZywgc2tpcCB0byBuZXh0LgogICAgICAgICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgICAgICAgcmV0dXJuICdzZWFyY2hpbmcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghc3RyZWFtLnNvbCgpKSB7CiAgICAgICAgICAgICAgLy8gQmFja3RyYWNrIDEgdG8gbWF0Y2ggXGIKICAgICAgICAgICAgICBzdHJlYW0uYmFja1VwKDEpOwogICAgICAgICAgICAgIGlmICghcXVlcnkuZXhlYyhzdHJlYW0ubmV4dCgpICsgbWF0Y2hbMF0pKSB7CiAgICAgICAgICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0cmVhbS5tYXRjaChxdWVyeSk7CiAgICAgICAgICAgIHJldHVybiAnc2VhcmNoaW5nJzsKICAgICAgICAgIH0KICAgICAgICAgIHdoaWxlICghc3RyZWFtLmVvbCgpKSB7CiAgICAgICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgICAgIGlmIChzdHJlYW0ubWF0Y2gocXVlcnksIGZhbHNlKSkgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgICBxdWVyeTogcXVlcnkKICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIGhpZ2hsaWdodFNlYXJjaE1hdGNoZXMoY20sIHF1ZXJ5KSB7CiAgICAgIHZhciBzZWFyY2hTdGF0ZSA9IGdldFNlYXJjaFN0YXRlKGNtKTsKICAgICAgdmFyIG92ZXJsYXkgPSBzZWFyY2hTdGF0ZS5nZXRPdmVybGF5KCk7CiAgICAgIGlmICghb3ZlcmxheSB8fCBxdWVyeSAhPSBvdmVybGF5LnF1ZXJ5KSB7CiAgICAgICAgaWYgKG92ZXJsYXkpIHsKICAgICAgICAgIGNtLnJlbW92ZU92ZXJsYXkob3ZlcmxheSk7CiAgICAgICAgfQogICAgICAgIG92ZXJsYXkgPSBzZWFyY2hPdmVybGF5KHF1ZXJ5KTsKICAgICAgICBjbS5hZGRPdmVybGF5KG92ZXJsYXkpOwogICAgICAgIGlmIChjbS5zaG93TWF0Y2hlc09uU2Nyb2xsYmFyKSB7CiAgICAgICAgICBpZiAoc2VhcmNoU3RhdGUuZ2V0U2Nyb2xsYmFyQW5ub3RhdGUoKSkgewogICAgICAgICAgICBzZWFyY2hTdGF0ZS5nZXRTY3JvbGxiYXJBbm5vdGF0ZSgpLmNsZWFyKCk7CiAgICAgICAgICB9CiAgICAgICAgICBzZWFyY2hTdGF0ZS5zZXRTY3JvbGxiYXJBbm5vdGF0ZShjbS5zaG93TWF0Y2hlc09uU2Nyb2xsYmFyKHF1ZXJ5KSk7CiAgICAgICAgfQogICAgICAgIHNlYXJjaFN0YXRlLnNldE92ZXJsYXkob3ZlcmxheSk7CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGZpbmROZXh0KGNtLCBwcmV2LCBxdWVyeSwgcmVwZWF0KSB7CiAgICAgIGlmIChyZXBlYXQgPT09IHVuZGVmaW5lZCkgeyByZXBlYXQgPSAxOyB9CiAgICAgIHJldHVybiBjbS5vcGVyYXRpb24oZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHBvcyA9IGNtLmdldEN1cnNvcigpOwogICAgICAgIHZhciBjdXJzb3IgPSBjbS5nZXRTZWFyY2hDdXJzb3IocXVlcnksIHBvcyk7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXBlYXQ7IGkrKykgewogICAgICAgICAgdmFyIGZvdW5kID0gY3Vyc29yLmZpbmQocHJldik7CiAgICAgICAgICBpZiAoaSA9PSAwICYmIGZvdW5kICYmIGN1cnNvckVxdWFsKGN1cnNvci5mcm9tKCksIHBvcykpIHsgZm91bmQgPSBjdXJzb3IuZmluZChwcmV2KTsgfQogICAgICAgICAgaWYgKCFmb3VuZCkgewogICAgICAgICAgICAvLyBTZWFyY2hDdXJzb3IgbWF5IGhhdmUgcmV0dXJuZWQgbnVsbCBiZWNhdXNlIGl0IGhpdCBFT0YsIHdyYXAKICAgICAgICAgICAgLy8gYXJvdW5kIGFuZCB0cnkgYWdhaW4uCiAgICAgICAgICAgIGN1cnNvciA9IGNtLmdldFNlYXJjaEN1cnNvcihxdWVyeSwKICAgICAgICAgICAgICAgIChwcmV2KSA/IFBvcyhjbS5sYXN0TGluZSgpKSA6IFBvcyhjbS5maXJzdExpbmUoKSwgMCkgKTsKICAgICAgICAgICAgaWYgKCFjdXJzb3IuZmluZChwcmV2KSkgewogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gY3Vyc29yLmZyb20oKTsKICAgICAgfSk7CiAgICB9CiAgICBmdW5jdGlvbiBjbGVhclNlYXJjaEhpZ2hsaWdodChjbSkgewogICAgICB2YXIgc3RhdGUgPSBnZXRTZWFyY2hTdGF0ZShjbSk7CiAgICAgIGNtLnJlbW92ZU92ZXJsYXkoZ2V0U2VhcmNoU3RhdGUoY20pLmdldE92ZXJsYXkoKSk7CiAgICAgIHN0YXRlLnNldE92ZXJsYXkobnVsbCk7CiAgICAgIGlmIChzdGF0ZS5nZXRTY3JvbGxiYXJBbm5vdGF0ZSgpKSB7CiAgICAgICAgc3RhdGUuZ2V0U2Nyb2xsYmFyQW5ub3RhdGUoKS5jbGVhcigpOwogICAgICAgIHN0YXRlLnNldFNjcm9sbGJhckFubm90YXRlKG51bGwpOwogICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIENoZWNrIGlmIHBvcyBpcyBpbiB0aGUgc3BlY2lmaWVkIHJhbmdlLCBJTkNMVVNJVkUuCiAgICAgKiBSYW5nZSBjYW4gYmUgc3BlY2lmaWVkIHdpdGggMSBvciAyIGFyZ3VtZW50cy4KICAgICAqIElmIHRoZSBmaXJzdCByYW5nZSBhcmd1bWVudCBpcyBhbiBhcnJheSwgdHJlYXQgaXQgYXMgYW4gYXJyYXkgb2YgbGluZQogICAgICogbnVtYmVycy4gTWF0Y2ggcG9zIGFnYWluc3QgYW55IG9mIHRoZSBsaW5lcy4KICAgICAqIElmIHRoZSBmaXJzdCByYW5nZSBhcmd1bWVudCBpcyBhIG51bWJlciwKICAgICAqICAgaWYgdGhlcmUgaXMgb25seSAxIHJhbmdlIGFyZ3VtZW50LCBjaGVjayBpZiBwb3MgaGFzIHRoZSBzYW1lIGxpbmUKICAgICAqICAgICAgIG51bWJlcgogICAgICogICBpZiB0aGVyZSBhcmUgMiByYW5nZSBhcmd1bWVudHMsIHRoZW4gY2hlY2sgaWYgcG9zIGlzIGluIGJldHdlZW4gdGhlIHR3bwogICAgICogICAgICAgcmFuZ2UgYXJndW1lbnRzLgogICAgICovCiAgICBmdW5jdGlvbiBpc0luUmFuZ2UocG9zLCBzdGFydCwgZW5kKSB7CiAgICAgIGlmICh0eXBlb2YgcG9zICE9ICdudW1iZXInKSB7CiAgICAgICAgLy8gQXNzdW1lIGl0IGlzIGEgY3Vyc29yIHBvc2l0aW9uLiBHZXQgdGhlIGxpbmUgbnVtYmVyLgogICAgICAgIHBvcyA9IHBvcy5saW5lOwogICAgICB9CiAgICAgIGlmIChzdGFydCBpbnN0YW5jZW9mIEFycmF5KSB7CiAgICAgICAgcmV0dXJuIGluQXJyYXkocG9zLCBzdGFydCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGVuZCkgewogICAgICAgICAgcmV0dXJuIChwb3MgPj0gc3RhcnQgJiYgcG9zIDw9IGVuZCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBwb3MgPT0gc3RhcnQ7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBnZXRVc2VyVmlzaWJsZUxpbmVzKGNtKSB7CiAgICAgIHZhciBzY3JvbGxJbmZvID0gY20uZ2V0U2Nyb2xsSW5mbygpOwogICAgICB2YXIgb2NjbHVkZVRvbGVyYW5jZVRvcCA9IDY7CiAgICAgIHZhciBvY2NsdWRlVG9sZXJhbmNlQm90dG9tID0gMTA7CiAgICAgIHZhciBmcm9tID0gY20uY29vcmRzQ2hhcih7bGVmdDowLCB0b3A6IG9jY2x1ZGVUb2xlcmFuY2VUb3AgKyBzY3JvbGxJbmZvLnRvcH0sICdsb2NhbCcpOwogICAgICB2YXIgYm90dG9tWSA9IHNjcm9sbEluZm8uY2xpZW50SGVpZ2h0IC0gb2NjbHVkZVRvbGVyYW5jZUJvdHRvbSArIHNjcm9sbEluZm8udG9wOwogICAgICB2YXIgdG8gPSBjbS5jb29yZHNDaGFyKHtsZWZ0OjAsIHRvcDogYm90dG9tWX0sICdsb2NhbCcpOwogICAgICByZXR1cm4ge3RvcDogZnJvbS5saW5lLCBib3R0b206IHRvLmxpbmV9OwogICAgfQoKICAgIHZhciBFeENvbW1hbmREaXNwYXRjaGVyID0gZnVuY3Rpb24oKSB7CiAgICAgIHRoaXMuYnVpbGRDb21tYW5kTWFwXygpOwogICAgfTsKICAgIEV4Q29tbWFuZERpc3BhdGNoZXIucHJvdG90eXBlID0gewogICAgICBwcm9jZXNzQ29tbWFuZDogZnVuY3Rpb24oY20sIGlucHV0LCBvcHRfcGFyYW1zKSB7CiAgICAgICAgdmFyIHRoYXQgPSB0aGlzOwogICAgICAgIGNtLm9wZXJhdGlvbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICBjbS5jdXJPcC5pc1ZpbU9wID0gdHJ1ZTsKICAgICAgICAgIHRoYXQuX3Byb2Nlc3NDb21tYW5kKGNtLCBpbnB1dCwgb3B0X3BhcmFtcyk7CiAgICAgICAgfSk7CiAgICAgIH0sCiAgICAgIF9wcm9jZXNzQ29tbWFuZDogZnVuY3Rpb24oY20sIGlucHV0LCBvcHRfcGFyYW1zKSB7CiAgICAgICAgdmFyIHZpbSA9IGNtLnN0YXRlLnZpbTsKICAgICAgICB2YXIgY29tbWFuZEhpc3RvcnlSZWdpc3RlciA9IHZpbUdsb2JhbFN0YXRlLnJlZ2lzdGVyQ29udHJvbGxlci5nZXRSZWdpc3RlcignOicpOwogICAgICAgIHZhciBwcmV2aW91c0NvbW1hbmQgPSBjb21tYW5kSGlzdG9yeVJlZ2lzdGVyLnRvU3RyaW5nKCk7CiAgICAgICAgaWYgKHZpbS52aXN1YWxNb2RlKSB7CiAgICAgICAgICBleGl0VmlzdWFsTW9kZShjbSk7CiAgICAgICAgfQogICAgICAgIHZhciBpbnB1dFN0cmVhbSA9IG5ldyBDb2RlTWlycm9yLlN0cmluZ1N0cmVhbShpbnB1dCk7CiAgICAgICAgLy8gdXBkYXRlICI6IHdpdGggdGhlIGxhdGVzdCBjb21tYW5kIHdoZXRoZXIgdmFsaWQgb3IgaW52YWxpZAogICAgICAgIGNvbW1hbmRIaXN0b3J5UmVnaXN0ZXIuc2V0VGV4dChpbnB1dCk7CiAgICAgICAgdmFyIHBhcmFtcyA9IG9wdF9wYXJhbXMgfHwge307CiAgICAgICAgcGFyYW1zLmlucHV0ID0gaW5wdXQ7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHRoaXMucGFyc2VJbnB1dF8oY20sIGlucHV0U3RyZWFtLCBwYXJhbXMpOwogICAgICAgIH0gY2F0Y2goZSkgewogICAgICAgICAgc2hvd0NvbmZpcm0oY20sIGUpOwogICAgICAgICAgdGhyb3cgZTsKICAgICAgICB9CiAgICAgICAgdmFyIGNvbW1hbmQ7CiAgICAgICAgdmFyIGNvbW1hbmROYW1lOwogICAgICAgIGlmICghcGFyYW1zLmNvbW1hbmROYW1lKSB7CiAgICAgICAgICAvLyBJZiBvbmx5IGEgbGluZSByYW5nZSBpcyBkZWZpbmVkLCBtb3ZlIHRvIHRoZSBsaW5lLgogICAgICAgICAgaWYgKHBhcmFtcy5saW5lICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgY29tbWFuZE5hbWUgPSAnbW92ZSc7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbW1hbmQgPSB0aGlzLm1hdGNoQ29tbWFuZF8ocGFyYW1zLmNvbW1hbmROYW1lKTsKICAgICAgICAgIGlmIChjb21tYW5kKSB7CiAgICAgICAgICAgIGNvbW1hbmROYW1lID0gY29tbWFuZC5uYW1lOwogICAgICAgICAgICBpZiAoY29tbWFuZC5leGNsdWRlRnJvbUNvbW1hbmRIaXN0b3J5KSB7CiAgICAgICAgICAgICAgY29tbWFuZEhpc3RvcnlSZWdpc3Rlci5zZXRUZXh0KHByZXZpb3VzQ29tbWFuZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5wYXJzZUNvbW1hbmRBcmdzXyhpbnB1dFN0cmVhbSwgcGFyYW1zLCBjb21tYW5kKTsKICAgICAgICAgICAgaWYgKGNvbW1hbmQudHlwZSA9PSAnZXhUb0tleScpIHsKICAgICAgICAgICAgICAvLyBIYW5kbGUgRXggdG8gS2V5IG1hcHBpbmcuCiAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb21tYW5kLnRvS2V5cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgQ29kZU1pcnJvci5WaW0uaGFuZGxlS2V5KGNtLCBjb21tYW5kLnRvS2V5c1tpXSwgJ21hcHBpbmcnKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9IGVsc2UgaWYgKGNvbW1hbmQudHlwZSA9PSAnZXhUb0V4JykgewogICAgICAgICAgICAgIC8vIEhhbmRsZSBFeCB0byBFeCBtYXBwaW5nLgogICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0NvbW1hbmQoY20sIGNvbW1hbmQudG9JbnB1dCk7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICghY29tbWFuZE5hbWUpIHsKICAgICAgICAgIHNob3dDb25maXJtKGNtLCAnTm90IGFuIGVkaXRvciBjb21tYW5kICI6JyArIGlucHV0ICsgJyInKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGV4Q29tbWFuZHNbY29tbWFuZE5hbWVdKGNtLCBwYXJhbXMpOwogICAgICAgICAgLy8gUG9zc2libHkgYXN5bmNocm9ub3VzIGNvbW1hbmRzIChlLmcuIHN1YnN0aXR1dGUsIHdoaWNoIG1pZ2h0IGhhdmUgYQogICAgICAgICAgLy8gdXNlciBjb25maXJtYXRpb24pLCBhcmUgcmVzcG9uc2libGUgZm9yIGNhbGxpbmcgdGhlIGNhbGxiYWNrIHdoZW4KICAgICAgICAgIC8vIGRvbmUuIEFsbCBvdGhlcnMgaGF2ZSBpdCB0YWtlbiBjYXJlIG9mIGZvciB0aGVtIGhlcmUuCiAgICAgICAgICBpZiAoKCFjb21tYW5kIHx8ICFjb21tYW5kLnBvc3NpYmx5QXN5bmMpICYmIHBhcmFtcy5jYWxsYmFjaykgewogICAgICAgICAgICBwYXJhbXMuY2FsbGJhY2soKTsKICAgICAgICAgIH0KICAgICAgICB9IGNhdGNoKGUpIHsKICAgICAgICAgIHNob3dDb25maXJtKGNtLCBlKTsKICAgICAgICAgIHRocm93IGU7CiAgICAgICAgfQogICAgICB9LAogICAgICBwYXJzZUlucHV0XzogZnVuY3Rpb24oY20sIGlucHV0U3RyZWFtLCByZXN1bHQpIHsKICAgICAgICBpbnB1dFN0cmVhbS5lYXRXaGlsZSgnOicpOwogICAgICAgIC8vIFBhcnNlIHJhbmdlLgogICAgICAgIGlmIChpbnB1dFN0cmVhbS5lYXQoJyUnKSkgewogICAgICAgICAgcmVzdWx0LmxpbmUgPSBjbS5maXJzdExpbmUoKTsKICAgICAgICAgIHJlc3VsdC5saW5lRW5kID0gY20ubGFzdExpbmUoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmVzdWx0LmxpbmUgPSB0aGlzLnBhcnNlTGluZVNwZWNfKGNtLCBpbnB1dFN0cmVhbSk7CiAgICAgICAgICBpZiAocmVzdWx0LmxpbmUgIT09IHVuZGVmaW5lZCAmJiBpbnB1dFN0cmVhbS5lYXQoJywnKSkgewogICAgICAgICAgICByZXN1bHQubGluZUVuZCA9IHRoaXMucGFyc2VMaW5lU3BlY18oY20sIGlucHV0U3RyZWFtKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIFBhcnNlIGNvbW1hbmQgbmFtZS4KICAgICAgICB2YXIgY29tbWFuZE1hdGNoID0gaW5wdXRTdHJlYW0ubWF0Y2goL14oXHcrKS8pOwogICAgICAgIGlmIChjb21tYW5kTWF0Y2gpIHsKICAgICAgICAgIHJlc3VsdC5jb21tYW5kTmFtZSA9IGNvbW1hbmRNYXRjaFsxXTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmVzdWx0LmNvbW1hbmROYW1lID0gaW5wdXRTdHJlYW0ubWF0Y2goLy4qLylbMF07CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9LAogICAgICBwYXJzZUxpbmVTcGVjXzogZnVuY3Rpb24oY20sIGlucHV0U3RyZWFtKSB7CiAgICAgICAgdmFyIG51bWJlck1hdGNoID0gaW5wdXRTdHJlYW0ubWF0Y2goL14oXGQrKS8pOwogICAgICAgIGlmIChudW1iZXJNYXRjaCkgewogICAgICAgICAgcmV0dXJuIHBhcnNlSW50KG51bWJlck1hdGNoWzFdLCAxMCkgLSAxOwogICAgICAgIH0KICAgICAgICBzd2l0Y2ggKGlucHV0U3RyZWFtLm5leHQoKSkgewogICAgICAgICAgY2FzZSAnLic6CiAgICAgICAgICAgIHJldHVybiBjbS5nZXRDdXJzb3IoKS5saW5lOwogICAgICAgICAgY2FzZSAnJCc6CiAgICAgICAgICAgIHJldHVybiBjbS5sYXN0TGluZSgpOwogICAgICAgICAgY2FzZSAnXCcnOgogICAgICAgICAgICB2YXIgbWFyayA9IGNtLnN0YXRlLnZpbS5tYXJrc1tpbnB1dFN0cmVhbS5uZXh0KCldOwogICAgICAgICAgICBpZiAobWFyayAmJiBtYXJrLmZpbmQoKSkgewogICAgICAgICAgICAgIHJldHVybiBtYXJrLmZpbmQoKS5saW5lOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTWFyayBub3Qgc2V0Jyk7CiAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBpbnB1dFN0cmVhbS5iYWNrVXAoMSk7CiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgICAgfQogICAgICB9LAogICAgICBwYXJzZUNvbW1hbmRBcmdzXzogZnVuY3Rpb24oaW5wdXRTdHJlYW0sIHBhcmFtcywgY29tbWFuZCkgewogICAgICAgIGlmIChpbnB1dFN0cmVhbS5lb2woKSkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBwYXJhbXMuYXJnU3RyaW5nID0gaW5wdXRTdHJlYW0ubWF0Y2goLy4qLylbMF07CiAgICAgICAgLy8gUGFyc2UgY29tbWFuZC1saW5lIGFyZ3VtZW50cwogICAgICAgIHZhciBkZWxpbSA9IGNvbW1hbmQuYXJnRGVsaW1pdGVyIHx8IC9ccysvOwogICAgICAgIHZhciBhcmdzID0gdHJpbShwYXJhbXMuYXJnU3RyaW5nKS5zcGxpdChkZWxpbSk7CiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoICYmIGFyZ3NbMF0pIHsKICAgICAgICAgIHBhcmFtcy5hcmdzID0gYXJnczsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIG1hdGNoQ29tbWFuZF86IGZ1bmN0aW9uKGNvbW1hbmROYW1lKSB7CiAgICAgICAgLy8gUmV0dXJuIHRoZSBjb21tYW5kIGluIHRoZSBjb21tYW5kIG1hcCB0aGF0IG1hdGNoZXMgdGhlIHNob3J0ZXN0CiAgICAgICAgLy8gcHJlZml4IG9mIHRoZSBwYXNzZWQgaW4gY29tbWFuZCBuYW1lLiBUaGUgbWF0Y2ggaXMgZ3VhcmFudGVlZCB0byBiZQogICAgICAgIC8vIHVuYW1iaWd1b3VzIGlmIHRoZSBkZWZhdWx0RXhDb21tYW5kTWFwJ3Mgc2hvcnROYW1lcyBhcmUgc2V0IHVwCiAgICAgICAgLy8gY29ycmVjdGx5LiAoc2VlIEBjb2Rle2RlZmF1bHRFeENvbW1hbmRNYXB9KS4KICAgICAgICBmb3IgKHZhciBpID0gY29tbWFuZE5hbWUubGVuZ3RoOyBpID4gMDsgaS0tKSB7CiAgICAgICAgICB2YXIgcHJlZml4ID0gY29tbWFuZE5hbWUuc3Vic3RyaW5nKDAsIGkpOwogICAgICAgICAgaWYgKHRoaXMuY29tbWFuZE1hcF9bcHJlZml4XSkgewogICAgICAgICAgICB2YXIgY29tbWFuZCA9IHRoaXMuY29tbWFuZE1hcF9bcHJlZml4XTsKICAgICAgICAgICAgaWYgKGNvbW1hbmQubmFtZS5pbmRleE9mKGNvbW1hbmROYW1lKSA9PT0gMCkgewogICAgICAgICAgICAgIHJldHVybiBjb21tYW5kOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgICB9LAogICAgICBidWlsZENvbW1hbmRNYXBfOiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLmNvbW1hbmRNYXBfID0ge307CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZWZhdWx0RXhDb21tYW5kTWFwLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB2YXIgY29tbWFuZCA9IGRlZmF1bHRFeENvbW1hbmRNYXBbaV07CiAgICAgICAgICB2YXIga2V5ID0gY29tbWFuZC5zaG9ydE5hbWUgfHwgY29tbWFuZC5uYW1lOwogICAgICAgICAgdGhpcy5jb21tYW5kTWFwX1trZXldID0gY29tbWFuZDsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIG1hcDogZnVuY3Rpb24obGhzLCByaHMsIGN0eCkgewogICAgICAgIGlmIChsaHMgIT0gJzonICYmIGxocy5jaGFyQXQoMCkgPT0gJzonKSB7CiAgICAgICAgICBpZiAoY3R4KSB7IHRocm93IEVycm9yKCdNb2RlIG5vdCBzdXBwb3J0ZWQgZm9yIGV4IG1hcHBpbmdzJyk7IH0KICAgICAgICAgIHZhciBjb21tYW5kTmFtZSA9IGxocy5zdWJzdHJpbmcoMSk7CiAgICAgICAgICBpZiAocmhzICE9ICc6JyAmJiByaHMuY2hhckF0KDApID09ICc6JykgewogICAgICAgICAgICAvLyBFeCB0byBFeCBtYXBwaW5nCiAgICAgICAgICAgIHRoaXMuY29tbWFuZE1hcF9bY29tbWFuZE5hbWVdID0gewogICAgICAgICAgICAgIG5hbWU6IGNvbW1hbmROYW1lLAogICAgICAgICAgICAgIHR5cGU6ICdleFRvRXgnLAogICAgICAgICAgICAgIHRvSW5wdXQ6IHJocy5zdWJzdHJpbmcoMSksCiAgICAgICAgICAgICAgdXNlcjogdHJ1ZQogICAgICAgICAgICB9OwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gRXggdG8ga2V5IG1hcHBpbmcKICAgICAgICAgICAgdGhpcy5jb21tYW5kTWFwX1tjb21tYW5kTmFtZV0gPSB7CiAgICAgICAgICAgICAgbmFtZTogY29tbWFuZE5hbWUsCiAgICAgICAgICAgICAgdHlwZTogJ2V4VG9LZXknLAogICAgICAgICAgICAgIHRvS2V5czogcmhzLAogICAgICAgICAgICAgIHVzZXI6IHRydWUKICAgICAgICAgICAgfTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKHJocyAhPSAnOicgJiYgcmhzLmNoYXJBdCgwKSA9PSAnOicpIHsKICAgICAgICAgICAgLy8gS2V5IHRvIEV4IG1hcHBpbmcuCiAgICAgICAgICAgIHZhciBtYXBwaW5nID0gewogICAgICAgICAgICAgIGtleXM6IGxocywKICAgICAgICAgICAgICB0eXBlOiAna2V5VG9FeCcsCiAgICAgICAgICAgICAgZXhBcmdzOiB7IGlucHV0OiByaHMuc3Vic3RyaW5nKDEpIH0sCiAgICAgICAgICAgICAgdXNlcjogdHJ1ZX07CiAgICAgICAgICAgIGlmIChjdHgpIHsgbWFwcGluZy5jb250ZXh0ID0gY3R4OyB9CiAgICAgICAgICAgIGRlZmF1bHRLZXltYXAudW5zaGlmdChtYXBwaW5nKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIEtleSB0byBrZXkgbWFwcGluZwogICAgICAgICAgICB2YXIgbWFwcGluZyA9IHsKICAgICAgICAgICAgICBrZXlzOiBsaHMsCiAgICAgICAgICAgICAgdHlwZTogJ2tleVRvS2V5JywKICAgICAgICAgICAgICB0b0tleXM6IHJocywKICAgICAgICAgICAgICB1c2VyOiB0cnVlCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGlmIChjdHgpIHsgbWFwcGluZy5jb250ZXh0ID0gY3R4OyB9CiAgICAgICAgICAgIGRlZmF1bHRLZXltYXAudW5zaGlmdChtYXBwaW5nKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgIHVubWFwOiBmdW5jdGlvbihsaHMsIGN0eCkgewogICAgICAgIGlmIChsaHMgIT0gJzonICYmIGxocy5jaGFyQXQoMCkgPT0gJzonKSB7CiAgICAgICAgICAvLyBFeCB0byBFeCBvciBFeCB0byBrZXkgbWFwcGluZwogICAgICAgICAgaWYgKGN0eCkgeyB0aHJvdyBFcnJvcignTW9kZSBub3Qgc3VwcG9ydGVkIGZvciBleCBtYXBwaW5ncycpOyB9CiAgICAgICAgICB2YXIgY29tbWFuZE5hbWUgPSBsaHMuc3Vic3RyaW5nKDEpOwogICAgICAgICAgaWYgKHRoaXMuY29tbWFuZE1hcF9bY29tbWFuZE5hbWVdICYmIHRoaXMuY29tbWFuZE1hcF9bY29tbWFuZE5hbWVdLnVzZXIpIHsKICAgICAgICAgICAgZGVsZXRlIHRoaXMuY29tbWFuZE1hcF9bY29tbWFuZE5hbWVdOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIEtleSB0byBFeCBvciBrZXkgdG8ga2V5IG1hcHBpbmcKICAgICAgICAgIHZhciBrZXlzID0gbGhzOwogICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZWZhdWx0S2V5bWFwLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGlmIChrZXlzID09IGRlZmF1bHRLZXltYXBbaV0ua2V5cwogICAgICAgICAgICAgICAgJiYgZGVmYXVsdEtleW1hcFtpXS5jb250ZXh0ID09PSBjdHgKICAgICAgICAgICAgICAgICYmIGRlZmF1bHRLZXltYXBbaV0udXNlcikgewogICAgICAgICAgICAgIGRlZmF1bHRLZXltYXAuc3BsaWNlKGksIDEpOwogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0aHJvdyBFcnJvcignTm8gc3VjaCBtYXBwaW5nLicpOwogICAgICB9CiAgICB9OwoKICAgIHZhciBleENvbW1hbmRzID0gewogICAgICBjb2xvcnNjaGVtZTogZnVuY3Rpb24oY20sIHBhcmFtcykgewogICAgICAgIGlmICghcGFyYW1zLmFyZ3MgfHwgcGFyYW1zLmFyZ3MubGVuZ3RoIDwgMSkgewogICAgICAgICAgc2hvd0NvbmZpcm0oY20sIGNtLmdldE9wdGlvbigndGhlbWUnKSk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGNtLnNldE9wdGlvbigndGhlbWUnLCBwYXJhbXMuYXJnc1swXSk7CiAgICAgIH0sCiAgICAgIG1hcDogZnVuY3Rpb24oY20sIHBhcmFtcywgY3R4KSB7CiAgICAgICAgdmFyIG1hcEFyZ3MgPSBwYXJhbXMuYXJnczsKICAgICAgICBpZiAoIW1hcEFyZ3MgfHwgbWFwQXJncy5sZW5ndGggPCAyKSB7CiAgICAgICAgICBpZiAoY20pIHsKICAgICAgICAgICAgc2hvd0NvbmZpcm0oY20sICdJbnZhbGlkIG1hcHBpbmc6ICcgKyBwYXJhbXMuaW5wdXQpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBleENvbW1hbmREaXNwYXRjaGVyLm1hcChtYXBBcmdzWzBdLCBtYXBBcmdzWzFdLCBjdHgpOwogICAgICB9LAogICAgICBpbWFwOiBmdW5jdGlvbihjbSwgcGFyYW1zKSB7IHRoaXMubWFwKGNtLCBwYXJhbXMsICdpbnNlcnQnKTsgfSwKICAgICAgbm1hcDogZnVuY3Rpb24oY20sIHBhcmFtcykgeyB0aGlzLm1hcChjbSwgcGFyYW1zLCAnbm9ybWFsJyk7IH0sCiAgICAgIHZtYXA6IGZ1bmN0aW9uKGNtLCBwYXJhbXMpIHsgdGhpcy5tYXAoY20sIHBhcmFtcywgJ3Zpc3VhbCcpOyB9LAogICAgICB1bm1hcDogZnVuY3Rpb24oY20sIHBhcmFtcywgY3R4KSB7CiAgICAgICAgdmFyIG1hcEFyZ3MgPSBwYXJhbXMuYXJnczsKICAgICAgICBpZiAoIW1hcEFyZ3MgfHwgbWFwQXJncy5sZW5ndGggPCAxKSB7CiAgICAgICAgICBpZiAoY20pIHsKICAgICAgICAgICAgc2hvd0NvbmZpcm0oY20sICdObyBzdWNoIG1hcHBpbmc6ICcgKyBwYXJhbXMuaW5wdXQpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBleENvbW1hbmREaXNwYXRjaGVyLnVubWFwKG1hcEFyZ3NbMF0sIGN0eCk7CiAgICAgIH0sCiAgICAgIG1vdmU6IGZ1bmN0aW9uKGNtLCBwYXJhbXMpIHsKICAgICAgICBjb21tYW5kRGlzcGF0Y2hlci5wcm9jZXNzQ29tbWFuZChjbSwgY20uc3RhdGUudmltLCB7CiAgICAgICAgICAgIHR5cGU6ICdtb3Rpb24nLAogICAgICAgICAgICBtb3Rpb246ICdtb3ZlVG9MaW5lT3JFZGdlT2ZEb2N1bWVudCcsCiAgICAgICAgICAgIG1vdGlvbkFyZ3M6IHsgZm9yd2FyZDogZmFsc2UsIGV4cGxpY2l0UmVwZWF0OiB0cnVlLAogICAgICAgICAgICAgIGxpbmV3aXNlOiB0cnVlIH0sCiAgICAgICAgICAgIHJlcGVhdE92ZXJyaWRlOiBwYXJhbXMubGluZSsxfSk7CiAgICAgIH0sCiAgICAgIHNldDogZnVuY3Rpb24oY20sIHBhcmFtcykgewogICAgICAgIHZhciBzZXRBcmdzID0gcGFyYW1zLmFyZ3M7CiAgICAgICAgLy8gT3B0aW9ucyBwYXNzZWQgdGhyb3VnaCB0byB0aGUgc2V0T3B0aW9uL2dldE9wdGlvbiBjYWxscy4gTWF5IGJlIHBhc3NlZCBpbiBieSB0aGUKICAgICAgICAvLyBsb2NhbC9nbG9iYWwgdmVyc2lvbnMgb2YgdGhlIHNldCBjb21tYW5kCiAgICAgICAgdmFyIHNldENmZyA9IHBhcmFtcy5zZXRDZmcgfHwge307CiAgICAgICAgaWYgKCFzZXRBcmdzIHx8IHNldEFyZ3MubGVuZ3RoIDwgMSkgewogICAgICAgICAgaWYgKGNtKSB7CiAgICAgICAgICAgIHNob3dDb25maXJtKGNtLCAnSW52YWxpZCBtYXBwaW5nOiAnICsgcGFyYW1zLmlucHV0KTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdmFyIGV4cHIgPSBzZXRBcmdzWzBdLnNwbGl0KCc9Jyk7CiAgICAgICAgdmFyIG9wdGlvbk5hbWUgPSBleHByWzBdOwogICAgICAgIHZhciB2YWx1ZSA9IGV4cHJbMV07CiAgICAgICAgdmFyIGZvcmNlR2V0ID0gZmFsc2U7CgogICAgICAgIGlmIChvcHRpb25OYW1lLmNoYXJBdChvcHRpb25OYW1lLmxlbmd0aCAtIDEpID09ICc/JykgewogICAgICAgICAgLy8gSWYgcG9zdC1maXhlZCB3aXRoID8sIHRoZW4gdGhlIHNldCBpcyBhY3R1YWxseSBhIGdldC4KICAgICAgICAgIGlmICh2YWx1ZSkgeyB0aHJvdyBFcnJvcignVHJhaWxpbmcgY2hhcmFjdGVyczogJyArIHBhcmFtcy5hcmdTdHJpbmcpOyB9CiAgICAgICAgICBvcHRpb25OYW1lID0gb3B0aW9uTmFtZS5zdWJzdHJpbmcoMCwgb3B0aW9uTmFtZS5sZW5ndGggLSAxKTsKICAgICAgICAgIGZvcmNlR2V0ID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgb3B0aW9uTmFtZS5zdWJzdHJpbmcoMCwgMikgPT0gJ25vJykgewogICAgICAgICAgLy8gVG8gc2V0IGJvb2xlYW4gb3B0aW9ucyB0byBmYWxzZSwgdGhlIG9wdGlvbiBuYW1lIGlzIHByZWZpeGVkIHdpdGgKICAgICAgICAgIC8vICdubycuCiAgICAgICAgICBvcHRpb25OYW1lID0gb3B0aW9uTmFtZS5zdWJzdHJpbmcoMik7CiAgICAgICAgICB2YWx1ZSA9IGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgdmFyIG9wdGlvbklzQm9vbGVhbiA9IG9wdGlvbnNbb3B0aW9uTmFtZV0gJiYgb3B0aW9uc1tvcHRpb25OYW1lXS50eXBlID09ICdib29sZWFuJzsKICAgICAgICBpZiAob3B0aW9uSXNCb29sZWFuICYmIHZhbHVlID09IHVuZGVmaW5lZCkgewogICAgICAgICAgLy8gQ2FsbGluZyBzZXQgd2l0aCBhIGJvb2xlYW4gb3B0aW9uIHNldHMgaXQgdG8gdHJ1ZS4KICAgICAgICAgIHZhbHVlID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgLy8gSWYgbm8gdmFsdWUgaXMgcHJvdmlkZWQsIHRoZW4gd2UgYXNzdW1lIHRoaXMgaXMgYSBnZXQuCiAgICAgICAgaWYgKCFvcHRpb25Jc0Jvb2xlYW4gJiYgdmFsdWUgPT09IHVuZGVmaW5lZCB8fCBmb3JjZUdldCkgewogICAgICAgICAgdmFyIG9sZFZhbHVlID0gZ2V0T3B0aW9uKG9wdGlvbk5hbWUsIGNtLCBzZXRDZmcpOwogICAgICAgICAgaWYgKG9sZFZhbHVlID09PSB0cnVlIHx8IG9sZFZhbHVlID09PSBmYWxzZSkgewogICAgICAgICAgICBzaG93Q29uZmlybShjbSwgJyAnICsgKG9sZFZhbHVlID8gJycgOiAnbm8nKSArIG9wdGlvbk5hbWUpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2hvd0NvbmZpcm0oY20sICcgICcgKyBvcHRpb25OYW1lICsgJz0nICsgb2xkVmFsdWUpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzZXRPcHRpb24ob3B0aW9uTmFtZSwgdmFsdWUsIGNtLCBzZXRDZmcpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgc2V0bG9jYWw6IGZ1bmN0aW9uIChjbSwgcGFyYW1zKSB7CiAgICAgICAgLy8gc2V0Q2ZnIGlzIHBhc3NlZCB0aHJvdWdoIHRvIHNldE9wdGlvbgogICAgICAgIHBhcmFtcy5zZXRDZmcgPSB7c2NvcGU6ICdsb2NhbCd9OwogICAgICAgIHRoaXMuc2V0KGNtLCBwYXJhbXMpOwogICAgICB9LAogICAgICBzZXRnbG9iYWw6IGZ1bmN0aW9uIChjbSwgcGFyYW1zKSB7CiAgICAgICAgLy8gc2V0Q2ZnIGlzIHBhc3NlZCB0aHJvdWdoIHRvIHNldE9wdGlvbgogICAgICAgIHBhcmFtcy5zZXRDZmcgPSB7c2NvcGU6ICdnbG9iYWwnfTsKICAgICAgICB0aGlzLnNldChjbSwgcGFyYW1zKTsKICAgICAgfSwKICAgICAgcmVnaXN0ZXJzOiBmdW5jdGlvbihjbSwgcGFyYW1zKSB7CiAgICAgICAgdmFyIHJlZ0FyZ3MgPSBwYXJhbXMuYXJnczsKICAgICAgICB2YXIgcmVnaXN0ZXJzID0gdmltR2xvYmFsU3RhdGUucmVnaXN0ZXJDb250cm9sbGVyLnJlZ2lzdGVyczsKICAgICAgICB2YXIgcmVnSW5mbyA9ICctLS0tLS0tLS0tUmVnaXN0ZXJzLS0tLS0tLS0tLTxicj48YnI+JzsKICAgICAgICBpZiAoIXJlZ0FyZ3MpIHsKICAgICAgICAgIGZvciAodmFyIHJlZ2lzdGVyTmFtZSBpbiByZWdpc3RlcnMpIHsKICAgICAgICAgICAgdmFyIHRleHQgPSByZWdpc3RlcnNbcmVnaXN0ZXJOYW1lXS50b1N0cmluZygpOwogICAgICAgICAgICBpZiAodGV4dC5sZW5ndGgpIHsKICAgICAgICAgICAgICByZWdJbmZvICs9ICciJyArIHJlZ2lzdGVyTmFtZSArICcgICAgJyArIHRleHQgKyAnPGJyPic7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgdmFyIHJlZ2lzdGVyTmFtZTsKICAgICAgICAgIHJlZ0FyZ3MgPSByZWdBcmdzLmpvaW4oJycpOwogICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZWdBcmdzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHJlZ2lzdGVyTmFtZSA9IHJlZ0FyZ3MuY2hhckF0KGkpOwogICAgICAgICAgICBpZiAoIXZpbUdsb2JhbFN0YXRlLnJlZ2lzdGVyQ29udHJvbGxlci5pc1ZhbGlkUmVnaXN0ZXIocmVnaXN0ZXJOYW1lKSkgewogICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciByZWdpc3RlciA9IHJlZ2lzdGVyc1tyZWdpc3Rlck5hbWVdIHx8IG5ldyBSZWdpc3RlcigpOwogICAgICAgICAgICByZWdJbmZvICs9ICciJyArIHJlZ2lzdGVyTmFtZSArICcgICAgJyArIHJlZ2lzdGVyLnRvU3RyaW5nKCkgKyAnPGJyPic7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHNob3dDb25maXJtKGNtLCByZWdJbmZvKTsKICAgICAgfSwKICAgICAgc29ydDogZnVuY3Rpb24oY20sIHBhcmFtcykgewogICAgICAgIHZhciByZXZlcnNlLCBpZ25vcmVDYXNlLCB1bmlxdWUsIG51bWJlcjsKICAgICAgICBmdW5jdGlvbiBwYXJzZUFyZ3MoKSB7CiAgICAgICAgICBpZiAocGFyYW1zLmFyZ1N0cmluZykgewogICAgICAgICAgICB2YXIgYXJncyA9IG5ldyBDb2RlTWlycm9yLlN0cmluZ1N0cmVhbShwYXJhbXMuYXJnU3RyaW5nKTsKICAgICAgICAgICAgaWYgKGFyZ3MuZWF0KCchJykpIHsgcmV2ZXJzZSA9IHRydWU7IH0KICAgICAgICAgICAgaWYgKGFyZ3MuZW9sKCkpIHsgcmV0dXJuOyB9CiAgICAgICAgICAgIGlmICghYXJncy5lYXRTcGFjZSgpKSB7IHJldHVybiAnSW52YWxpZCBhcmd1bWVudHMnOyB9CiAgICAgICAgICAgIHZhciBvcHRzID0gYXJncy5tYXRjaCgvW2Etel0rLyk7CiAgICAgICAgICAgIGlmIChvcHRzKSB7CiAgICAgICAgICAgICAgb3B0cyA9IG9wdHNbMF07CiAgICAgICAgICAgICAgaWdub3JlQ2FzZSA9IG9wdHMuaW5kZXhPZignaScpICE9IC0xOwogICAgICAgICAgICAgIHVuaXF1ZSA9IG9wdHMuaW5kZXhPZigndScpICE9IC0xOwogICAgICAgICAgICAgIHZhciBkZWNpbWFsID0gb3B0cy5pbmRleE9mKCdkJykgIT0gLTEgJiYgMTsKICAgICAgICAgICAgICB2YXIgaGV4ID0gb3B0cy5pbmRleE9mKCd4JykgIT0gLTEgJiYgMTsKICAgICAgICAgICAgICB2YXIgb2N0YWwgPSBvcHRzLmluZGV4T2YoJ28nKSAhPSAtMSAmJiAxOwogICAgICAgICAgICAgIGlmIChkZWNpbWFsICsgaGV4ICsgb2N0YWwgPiAxKSB7IHJldHVybiAnSW52YWxpZCBhcmd1bWVudHMnOyB9CiAgICAgICAgICAgICAgbnVtYmVyID0gZGVjaW1hbCAmJiAnZGVjaW1hbCcgfHwgaGV4ICYmICdoZXgnIHx8IG9jdGFsICYmICdvY3RhbCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGFyZ3MubWF0Y2goL1wvLipcLy8pKSB7IHJldHVybiAncGF0dGVybnMgbm90IHN1cHBvcnRlZCc7IH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdmFyIGVyciA9IHBhcnNlQXJncygpOwogICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgIHNob3dDb25maXJtKGNtLCBlcnIgKyAnOiAnICsgcGFyYW1zLmFyZ1N0cmluZyk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHZhciBsaW5lU3RhcnQgPSBwYXJhbXMubGluZSB8fCBjbS5maXJzdExpbmUoKTsKICAgICAgICB2YXIgbGluZUVuZCA9IHBhcmFtcy5saW5lRW5kIHx8IHBhcmFtcy5saW5lIHx8IGNtLmxhc3RMaW5lKCk7CiAgICAgICAgaWYgKGxpbmVTdGFydCA9PSBsaW5lRW5kKSB7IHJldHVybjsgfQogICAgICAgIHZhciBjdXJTdGFydCA9IFBvcyhsaW5lU3RhcnQsIDApOwogICAgICAgIHZhciBjdXJFbmQgPSBQb3MobGluZUVuZCwgbGluZUxlbmd0aChjbSwgbGluZUVuZCkpOwogICAgICAgIHZhciB0ZXh0ID0gY20uZ2V0UmFuZ2UoY3VyU3RhcnQsIGN1ckVuZCkuc3BsaXQoJ1xuJyk7CiAgICAgICAgdmFyIG51bWJlclJlZ2V4ID0gKG51bWJlciA9PSAnZGVjaW1hbCcpID8gLygtPykoW1xkXSspLyA6CiAgICAgICAgICAgKG51bWJlciA9PSAnaGV4JykgPyAvKC0/KSg/OjB4KT8oWzAtOWEtZl0rKS9pIDoKICAgICAgICAgICAobnVtYmVyID09ICdvY3RhbCcpID8gLyhbMC03XSspLyA6IG51bGw7CiAgICAgICAgdmFyIHJhZGl4ID0gKG51bWJlciA9PSAnZGVjaW1hbCcpID8gMTAgOiAobnVtYmVyID09ICdoZXgnKSA/IDE2IDogKG51bWJlciA9PSAnb2N0YWwnKSA/IDggOiBudWxsOwogICAgICAgIHZhciBudW1QYXJ0ID0gW10sIHRleHRQYXJ0ID0gW107CiAgICAgICAgaWYgKG51bWJlcikgewogICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGlmIChudW1iZXJSZWdleC5leGVjKHRleHRbaV0pKSB7CiAgICAgICAgICAgICAgbnVtUGFydC5wdXNoKHRleHRbaV0pOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHRleHRQYXJ0LnB1c2godGV4dFtpXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGV4dFBhcnQgPSB0ZXh0OwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBjb21wYXJlRm4oYSwgYikgewogICAgICAgICAgaWYgKHJldmVyc2UpIHsgdmFyIHRtcDsgdG1wID0gYTsgYSA9IGI7IGIgPSB0bXA7IH0KICAgICAgICAgIGlmIChpZ25vcmVDYXNlKSB7IGEgPSBhLnRvTG93ZXJDYXNlKCk7IGIgPSBiLnRvTG93ZXJDYXNlKCk7IH0KICAgICAgICAgIHZhciBhbnVtID0gbnVtYmVyICYmIG51bWJlclJlZ2V4LmV4ZWMoYSk7CiAgICAgICAgICB2YXIgYm51bSA9IG51bWJlciAmJiBudW1iZXJSZWdleC5leGVjKGIpOwogICAgICAgICAgaWYgKCFhbnVtKSB7IHJldHVybiBhIDwgYiA/IC0xIDogMTsgfQogICAgICAgICAgYW51bSA9IHBhcnNlSW50KChhbnVtWzFdICsgYW51bVsyXSkudG9Mb3dlckNhc2UoKSwgcmFkaXgpOwogICAgICAgICAgYm51bSA9IHBhcnNlSW50KChibnVtWzFdICsgYm51bVsyXSkudG9Mb3dlckNhc2UoKSwgcmFkaXgpOwogICAgICAgICAgcmV0dXJuIGFudW0gLSBibnVtOwogICAgICAgIH0KICAgICAgICBudW1QYXJ0LnNvcnQoY29tcGFyZUZuKTsKICAgICAgICB0ZXh0UGFydC5zb3J0KGNvbXBhcmVGbik7CiAgICAgICAgdGV4dCA9ICghcmV2ZXJzZSkgPyB0ZXh0UGFydC5jb25jYXQobnVtUGFydCkgOiBudW1QYXJ0LmNvbmNhdCh0ZXh0UGFydCk7CiAgICAgICAgaWYgKHVuaXF1ZSkgeyAvLyBSZW1vdmUgZHVwbGljYXRlIGxpbmVzCiAgICAgICAgICB2YXIgdGV4dE9sZCA9IHRleHQ7CiAgICAgICAgICB2YXIgbGFzdExpbmU7CiAgICAgICAgICB0ZXh0ID0gW107CiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRleHRPbGQubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgaWYgKHRleHRPbGRbaV0gIT0gbGFzdExpbmUpIHsKICAgICAgICAgICAgICB0ZXh0LnB1c2godGV4dE9sZFtpXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGFzdExpbmUgPSB0ZXh0T2xkW2ldOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjbS5yZXBsYWNlUmFuZ2UodGV4dC5qb2luKCdcbicpLCBjdXJTdGFydCwgY3VyRW5kKTsKICAgICAgfSwKICAgICAgZ2xvYmFsOiBmdW5jdGlvbihjbSwgcGFyYW1zKSB7CiAgICAgICAgLy8gYSBnbG9iYWwgY29tbWFuZCBpcyBvZiB0aGUgZm9ybQogICAgICAgIC8vIDpbcmFuZ2VdZy9wYXR0ZXJuL1tjbWRdCiAgICAgICAgLy8gYXJnU3RyaW5nIGhvbGRzIHRoZSBzdHJpbmcgL3BhdHRlcm4vW2NtZF0KICAgICAgICB2YXIgYXJnU3RyaW5nID0gcGFyYW1zLmFyZ1N0cmluZzsKICAgICAgICBpZiAoIWFyZ1N0cmluZykgewogICAgICAgICAgc2hvd0NvbmZpcm0oY20sICdSZWd1bGFyIEV4cHJlc3Npb24gbWlzc2luZyBmcm9tIGdsb2JhbCcpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAvLyByYW5nZSBpcyBzcGVjaWZpZWQgaGVyZQogICAgICAgIHZhciBsaW5lU3RhcnQgPSAocGFyYW1zLmxpbmUgIT09IHVuZGVmaW5lZCkgPyBwYXJhbXMubGluZSA6IGNtLmZpcnN0TGluZSgpOwogICAgICAgIHZhciBsaW5lRW5kID0gcGFyYW1zLmxpbmVFbmQgfHwgcGFyYW1zLmxpbmUgfHwgY20ubGFzdExpbmUoKTsKICAgICAgICAvLyBnZXQgdGhlIHRva2VucyBmcm9tIGFyZ1N0cmluZwogICAgICAgIHZhciB0b2tlbnMgPSBzcGxpdEJ5U2xhc2goYXJnU3RyaW5nKTsKICAgICAgICB2YXIgcmVnZXhQYXJ0ID0gYXJnU3RyaW5nLCBjbWQ7CiAgICAgICAgaWYgKHRva2Vucy5sZW5ndGgpIHsKICAgICAgICAgIHJlZ2V4UGFydCA9IHRva2Vuc1swXTsKICAgICAgICAgIGNtZCA9IHRva2Vucy5zbGljZSgxLCB0b2tlbnMubGVuZ3RoKS5qb2luKCcvJyk7CiAgICAgICAgfQogICAgICAgIGlmIChyZWdleFBhcnQpIHsKICAgICAgICAgIC8vIElmIHJlZ2V4IHBhcnQgaXMgZW1wdHksIHRoZW4gdXNlIHRoZSBwcmV2aW91cyBxdWVyeS4gT3RoZXJ3aXNlCiAgICAgICAgICAvLyB1c2UgdGhlIHJlZ2V4IHBhcnQgYXMgdGhlIG5ldyBxdWVyeS4KICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgdXBkYXRlU2VhcmNoUXVlcnkoY20sIHJlZ2V4UGFydCwgdHJ1ZSAvKiogaWdub3JlQ2FzZSAqLywKICAgICAgICAgICAgIHRydWUgLyoqIHNtYXJ0Q2FzZSAqLyk7CiAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgc2hvd0NvbmZpcm0oY20sICdJbnZhbGlkIHJlZ2V4OiAnICsgcmVnZXhQYXJ0KTsKICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIG5vdyB0aGF0IHdlIGhhdmUgdGhlIHJlZ2V4UGFydCwgc2VhcmNoIGZvciByZWdleCBtYXRjaGVzIGluIHRoZQogICAgICAgIC8vIHNwZWNpZmllZCByYW5nZSBvZiBsaW5lcwogICAgICAgIHZhciBxdWVyeSA9IGdldFNlYXJjaFN0YXRlKGNtKS5nZXRRdWVyeSgpOwogICAgICAgIHZhciBtYXRjaGVkTGluZXMgPSBbXSwgY29udGVudCA9ICcnOwogICAgICAgIGZvciAodmFyIGkgPSBsaW5lU3RhcnQ7IGkgPD0gbGluZUVuZDsgaSsrKSB7CiAgICAgICAgICB2YXIgbWF0Y2hlZCA9IHF1ZXJ5LnRlc3QoY20uZ2V0TGluZShpKSk7CiAgICAgICAgICBpZiAobWF0Y2hlZCkgewogICAgICAgICAgICBtYXRjaGVkTGluZXMucHVzaChpKzEpOwogICAgICAgICAgICBjb250ZW50Kz0gY20uZ2V0TGluZShpKSArICc8YnI+JzsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gaWYgdGhlcmUgaXMgbm8gW2NtZF0sIGp1c3QgZGlzcGxheSB0aGUgbGlzdCBvZiBtYXRjaGVkIGxpbmVzCiAgICAgICAgaWYgKCFjbWQpIHsKICAgICAgICAgIHNob3dDb25maXJtKGNtLCBjb250ZW50KTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdmFyIGluZGV4ID0gMDsKICAgICAgICB2YXIgbmV4dENvbW1hbmQgPSBmdW5jdGlvbigpIHsKICAgICAgICAgIGlmIChpbmRleCA8IG1hdGNoZWRMaW5lcy5sZW5ndGgpIHsKICAgICAgICAgICAgdmFyIGNvbW1hbmQgPSBtYXRjaGVkTGluZXNbaW5kZXhdICsgY21kOwogICAgICAgICAgICBleENvbW1hbmREaXNwYXRjaGVyLnByb2Nlc3NDb21tYW5kKGNtLCBjb21tYW5kLCB7CiAgICAgICAgICAgICAgY2FsbGJhY2s6IG5leHRDb21tYW5kCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgICAgaW5kZXgrKzsKICAgICAgICB9OwogICAgICAgIG5leHRDb21tYW5kKCk7CiAgICAgIH0sCiAgICAgIHN1YnN0aXR1dGU6IGZ1bmN0aW9uKGNtLCBwYXJhbXMpIHsKICAgICAgICBpZiAoIWNtLmdldFNlYXJjaEN1cnNvcikgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTZWFyY2ggZmVhdHVyZSBub3QgYXZhaWxhYmxlLiBSZXF1aXJlcyBzZWFyY2hjdXJzb3IuanMgb3IgJyArCiAgICAgICAgICAgICAgJ2FueSBvdGhlciBnZXRTZWFyY2hDdXJzb3IgaW1wbGVtZW50YXRpb24uJyk7CiAgICAgICAgfQogICAgICAgIHZhciBhcmdTdHJpbmcgPSBwYXJhbXMuYXJnU3RyaW5nOwogICAgICAgIHZhciB0b2tlbnMgPSBhcmdTdHJpbmcgPyBzcGxpdEJ5U2xhc2goYXJnU3RyaW5nKSA6IFtdOwogICAgICAgIHZhciByZWdleFBhcnQsIHJlcGxhY2VQYXJ0ID0gJycsIHRyYWlsaW5nLCBmbGFnc1BhcnQsIGNvdW50OwogICAgICAgIHZhciBjb25maXJtID0gZmFsc2U7IC8vIFdoZXRoZXIgdG8gY29uZmlybSBlYWNoIHJlcGxhY2UuCiAgICAgICAgdmFyIGdsb2JhbCA9IGZhbHNlOyAvLyBUcnVlIHRvIHJlcGxhY2UgYWxsIGluc3RhbmNlcyBvbiBhIGxpbmUsIGZhbHNlIHRvIHJlcGxhY2Ugb25seSAxLgogICAgICAgIGlmICh0b2tlbnMubGVuZ3RoKSB7CiAgICAgICAgICByZWdleFBhcnQgPSB0b2tlbnNbMF07CiAgICAgICAgICByZXBsYWNlUGFydCA9IHRva2Vuc1sxXTsKICAgICAgICAgIGlmIChyZXBsYWNlUGFydCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIGlmIChnZXRPcHRpb24oJ3BjcmUnKSkgewogICAgICAgICAgICAgIHJlcGxhY2VQYXJ0ID0gdW5lc2NhcGVSZWdleFJlcGxhY2UocmVwbGFjZVBhcnQpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHJlcGxhY2VQYXJ0ID0gdHJhbnNsYXRlUmVnZXhSZXBsYWNlKHJlcGxhY2VQYXJ0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2aW1HbG9iYWxTdGF0ZS5sYXN0U3Vic3RpdHV0ZVJlcGxhY2VQYXJ0ID0gcmVwbGFjZVBhcnQ7CiAgICAgICAgICB9CiAgICAgICAgICB0cmFpbGluZyA9IHRva2Vuc1syXSA/IHRva2Vuc1syXS5zcGxpdCgnICcpIDogW107CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIGVpdGhlciB0aGUgYXJnU3RyaW5nIGlzIGVtcHR5IG9yIGl0cyBvZiB0aGUgZm9ybSAnIGhlbGxvL3dvcmxkJwogICAgICAgICAgLy8gYWN0dWFsbHkgc3BsaXRCeVNsYXNoIHJldHVybnMgYSBsaXN0IG9mIHRva2VucwogICAgICAgICAgLy8gb25seSBpZiB0aGUgc3RyaW5nIHN0YXJ0cyB3aXRoIGEgJy8nCiAgICAgICAgICBpZiAoYXJnU3RyaW5nICYmIGFyZ1N0cmluZy5sZW5ndGgpIHsKICAgICAgICAgICAgc2hvd0NvbmZpcm0oY20sICdTdWJzdGl0dXRpb25zIHNob3VsZCBiZSBvZiB0aGUgZm9ybSAnICsKICAgICAgICAgICAgICAgICc6cy9wYXR0ZXJuL3JlcGxhY2UvJyk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gQWZ0ZXIgdGhlIDNyZCBzbGFzaCwgd2UgY2FuIGhhdmUgZmxhZ3MgZm9sbG93ZWQgYnkgYSBzcGFjZSBmb2xsb3dlZAogICAgICAgIC8vIGJ5IGNvdW50LgogICAgICAgIGlmICh0cmFpbGluZykgewogICAgICAgICAgZmxhZ3NQYXJ0ID0gdHJhaWxpbmdbMF07CiAgICAgICAgICBjb3VudCA9IHBhcnNlSW50KHRyYWlsaW5nWzFdKTsKICAgICAgICAgIGlmIChmbGFnc1BhcnQpIHsKICAgICAgICAgICAgaWYgKGZsYWdzUGFydC5pbmRleE9mKCdjJykgIT0gLTEpIHsKICAgICAgICAgICAgICBjb25maXJtID0gdHJ1ZTsKICAgICAgICAgICAgICBmbGFnc1BhcnQucmVwbGFjZSgnYycsICcnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZmxhZ3NQYXJ0LmluZGV4T2YoJ2cnKSAhPSAtMSkgewogICAgICAgICAgICAgIGdsb2JhbCA9IHRydWU7CiAgICAgICAgICAgICAgZmxhZ3NQYXJ0LnJlcGxhY2UoJ2cnLCAnJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVnZXhQYXJ0ID0gcmVnZXhQYXJ0ICsgJy8nICsgZmxhZ3NQYXJ0OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAocmVnZXhQYXJ0KSB7CiAgICAgICAgICAvLyBJZiByZWdleCBwYXJ0IGlzIGVtcHR5LCB0aGVuIHVzZSB0aGUgcHJldmlvdXMgcXVlcnkuIE90aGVyd2lzZSB1c2UKICAgICAgICAgIC8vIHRoZSByZWdleCBwYXJ0IGFzIHRoZSBuZXcgcXVlcnkuCiAgICAgICAgICB0cnkgewogICAgICAgICAgICB1cGRhdGVTZWFyY2hRdWVyeShjbSwgcmVnZXhQYXJ0LCB0cnVlIC8qKiBpZ25vcmVDYXNlICovLAogICAgICAgICAgICAgIHRydWUgLyoqIHNtYXJ0Q2FzZSAqLyk7CiAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgIHNob3dDb25maXJtKGNtLCAnSW52YWxpZCByZWdleDogJyArIHJlZ2V4UGFydCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmVwbGFjZVBhcnQgPSByZXBsYWNlUGFydCB8fCB2aW1HbG9iYWxTdGF0ZS5sYXN0U3Vic3RpdHV0ZVJlcGxhY2VQYXJ0OwogICAgICAgIGlmIChyZXBsYWNlUGFydCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICBzaG93Q29uZmlybShjbSwgJ05vIHByZXZpb3VzIHN1YnN0aXR1dGUgcmVndWxhciBleHByZXNzaW9uJyk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHZhciBzdGF0ZSA9IGdldFNlYXJjaFN0YXRlKGNtKTsKICAgICAgICB2YXIgcXVlcnkgPSBzdGF0ZS5nZXRRdWVyeSgpOwogICAgICAgIHZhciBsaW5lU3RhcnQgPSAocGFyYW1zLmxpbmUgIT09IHVuZGVmaW5lZCkgPyBwYXJhbXMubGluZSA6IGNtLmdldEN1cnNvcigpLmxpbmU7CiAgICAgICAgdmFyIGxpbmVFbmQgPSBwYXJhbXMubGluZUVuZCB8fCBsaW5lU3RhcnQ7CiAgICAgICAgaWYgKGxpbmVTdGFydCA9PSBjbS5maXJzdExpbmUoKSAmJiBsaW5lRW5kID09IGNtLmxhc3RMaW5lKCkpIHsKICAgICAgICAgIGxpbmVFbmQgPSBJbmZpbml0eTsKICAgICAgICB9CiAgICAgICAgaWYgKGNvdW50KSB7CiAgICAgICAgICBsaW5lU3RhcnQgPSBsaW5lRW5kOwogICAgICAgICAgbGluZUVuZCA9IGxpbmVTdGFydCArIGNvdW50IC0gMTsKICAgICAgICB9CiAgICAgICAgdmFyIHN0YXJ0UG9zID0gY2xpcEN1cnNvclRvQ29udGVudChjbSwgUG9zKGxpbmVTdGFydCwgMCkpOwogICAgICAgIHZhciBjdXJzb3IgPSBjbS5nZXRTZWFyY2hDdXJzb3IocXVlcnksIHN0YXJ0UG9zKTsKICAgICAgICBkb1JlcGxhY2UoY20sIGNvbmZpcm0sIGdsb2JhbCwgbGluZVN0YXJ0LCBsaW5lRW5kLCBjdXJzb3IsIHF1ZXJ5LCByZXBsYWNlUGFydCwgcGFyYW1zLmNhbGxiYWNrKTsKICAgICAgfSwKICAgICAgcmVkbzogQ29kZU1pcnJvci5jb21tYW5kcy5yZWRvLAogICAgICB1bmRvOiBDb2RlTWlycm9yLmNvbW1hbmRzLnVuZG8sCiAgICAgIHdyaXRlOiBmdW5jdGlvbihjbSkgewogICAgICAgIGlmIChDb2RlTWlycm9yLmNvbW1hbmRzLnNhdmUpIHsKICAgICAgICAgIC8vIElmIGEgc2F2ZSBjb21tYW5kIGlzIGRlZmluZWQsIGNhbGwgaXQuCiAgICAgICAgICBDb2RlTWlycm9yLmNvbW1hbmRzLnNhdmUoY20pOwogICAgICAgIH0gZWxzZSBpZiAoY20uc2F2ZSkgewogICAgICAgICAgLy8gU2F2ZXMgdG8gdGV4dCBhcmVhIGlmIG5vIHNhdmUgY29tbWFuZCBpcyBkZWZpbmVkIGFuZCBjbS5zYXZlKCkgaXMgYXZhaWxhYmxlLgogICAgICAgICAgY20uc2F2ZSgpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgbm9obHNlYXJjaDogZnVuY3Rpb24oY20pIHsKICAgICAgICBjbGVhclNlYXJjaEhpZ2hsaWdodChjbSk7CiAgICAgIH0sCiAgICAgIHlhbms6IGZ1bmN0aW9uIChjbSkgewogICAgICAgIHZhciBjdXIgPSBjb3B5Q3Vyc29yKGNtLmdldEN1cnNvcigpKTsKICAgICAgICB2YXIgbGluZSA9IGN1ci5saW5lOwogICAgICAgIHZhciBsaW5lVGV4dCA9IGNtLmdldExpbmUobGluZSk7CiAgICAgICAgdmltR2xvYmFsU3RhdGUucmVnaXN0ZXJDb250cm9sbGVyLnB1c2hUZXh0KAogICAgICAgICAgJzAnLCAneWFuaycsIGxpbmVUZXh0LCB0cnVlLCB0cnVlKTsKICAgICAgfSwKICAgICAgZGVsbWFya3M6IGZ1bmN0aW9uKGNtLCBwYXJhbXMpIHsKICAgICAgICBpZiAoIXBhcmFtcy5hcmdTdHJpbmcgfHwgIXRyaW0ocGFyYW1zLmFyZ1N0cmluZykpIHsKICAgICAgICAgIHNob3dDb25maXJtKGNtLCAnQXJndW1lbnQgcmVxdWlyZWQnKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHZhciBzdGF0ZSA9IGNtLnN0YXRlLnZpbTsKICAgICAgICB2YXIgc3RyZWFtID0gbmV3IENvZGVNaXJyb3IuU3RyaW5nU3RyZWFtKHRyaW0ocGFyYW1zLmFyZ1N0cmluZykpOwogICAgICAgIHdoaWxlICghc3RyZWFtLmVvbCgpKSB7CiAgICAgICAgICBzdHJlYW0uZWF0U3BhY2UoKTsKCiAgICAgICAgICAvLyBSZWNvcmQgdGhlIHN0cmVhbXMgcG9zaXRpb24gYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbG9vcCBmb3IgdXNlCiAgICAgICAgICAvLyBpbiBlcnJvciBtZXNzYWdlcy4KICAgICAgICAgIHZhciBjb3VudCA9IHN0cmVhbS5wb3M7CgogICAgICAgICAgaWYgKCFzdHJlYW0ubWF0Y2goL1thLXpBLVpdLywgZmFsc2UpKSB7CiAgICAgICAgICAgIHNob3dDb25maXJtKGNtLCAnSW52YWxpZCBhcmd1bWVudDogJyArIHBhcmFtcy5hcmdTdHJpbmcuc3Vic3RyaW5nKGNvdW50KSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KCiAgICAgICAgICB2YXIgc3ltID0gc3RyZWFtLm5leHQoKTsKICAgICAgICAgIC8vIENoZWNrIGlmIHRoaXMgc3ltYm9sIGlzIHBhcnQgb2YgYSByYW5nZQogICAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgnLScsIHRydWUpKSB7CiAgICAgICAgICAgIC8vIFRoaXMgc3ltYm9sIGlzIHBhcnQgb2YgYSByYW5nZS4KCiAgICAgICAgICAgIC8vIFRoZSByYW5nZSBtdXN0IHRlcm1pbmF0ZSBhdCBhbiBhbHBoYWJldGljIGNoYXJhY3Rlci4KICAgICAgICAgICAgaWYgKCFzdHJlYW0ubWF0Y2goL1thLXpBLVpdLywgZmFsc2UpKSB7CiAgICAgICAgICAgICAgc2hvd0NvbmZpcm0oY20sICdJbnZhbGlkIGFyZ3VtZW50OiAnICsgcGFyYW1zLmFyZ1N0cmluZy5zdWJzdHJpbmcoY291bnQpKTsKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBzdGFydE1hcmsgPSBzeW07CiAgICAgICAgICAgIHZhciBmaW5pc2hNYXJrID0gc3RyZWFtLm5leHQoKTsKICAgICAgICAgICAgLy8gVGhlIHJhbmdlIG11c3QgdGVybWluYXRlIGF0IGFuIGFscGhhYmV0aWMgY2hhcmFjdGVyIHdoaWNoCiAgICAgICAgICAgIC8vIHNoYXJlcyB0aGUgc2FtZSBjYXNlIGFzIHRoZSBzdGFydCBvZiB0aGUgcmFuZ2UuCiAgICAgICAgICAgIGlmIChpc0xvd2VyQ2FzZShzdGFydE1hcmspICYmIGlzTG93ZXJDYXNlKGZpbmlzaE1hcmspIHx8CiAgICAgICAgICAgICAgICBpc1VwcGVyQ2FzZShzdGFydE1hcmspICYmIGlzVXBwZXJDYXNlKGZpbmlzaE1hcmspKSB7CiAgICAgICAgICAgICAgdmFyIHN0YXJ0ID0gc3RhcnRNYXJrLmNoYXJDb2RlQXQoMCk7CiAgICAgICAgICAgICAgdmFyIGZpbmlzaCA9IGZpbmlzaE1hcmsuY2hhckNvZGVBdCgwKTsKICAgICAgICAgICAgICBpZiAoc3RhcnQgPj0gZmluaXNoKSB7CiAgICAgICAgICAgICAgICBzaG93Q29uZmlybShjbSwgJ0ludmFsaWQgYXJndW1lbnQ6ICcgKyBwYXJhbXMuYXJnU3RyaW5nLnN1YnN0cmluZyhjb3VudCkpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgLy8gQmVjYXVzZSBtYXJrcyBhcmUgYWx3YXlzIEFTQ0lJIHZhbHVlcywgYW5kIHdlIGhhdmUKICAgICAgICAgICAgICAvLyBkZXRlcm1pbmVkIHRoYXQgdGhleSBhcmUgdGhlIHNhbWUgY2FzZSwgd2UgY2FuIHVzZQogICAgICAgICAgICAgIC8vIHRoZWlyIGNoYXIgY29kZXMgdG8gaXRlcmF0ZSB0aHJvdWdoIHRoZSBkZWZpbmVkIHJhbmdlLgogICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDw9IGZpbmlzaCAtIHN0YXJ0OyBqKyspIHsKICAgICAgICAgICAgICAgIHZhciBtYXJrID0gU3RyaW5nLmZyb21DaGFyQ29kZShzdGFydCArIGopOwogICAgICAgICAgICAgICAgZGVsZXRlIHN0YXRlLm1hcmtzW21hcmtdOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBzaG93Q29uZmlybShjbSwgJ0ludmFsaWQgYXJndW1lbnQ6ICcgKyBzdGFydE1hcmsgKyAnLScpOwogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gVGhpcyBzeW1ib2wgaXMgYSB2YWxpZCBtYXJrLCBhbmQgaXMgbm90IHBhcnQgb2YgYSByYW5nZS4KICAgICAgICAgICAgZGVsZXRlIHN0YXRlLm1hcmtzW3N5bV07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9OwoKICAgIHZhciBleENvbW1hbmREaXNwYXRjaGVyID0gbmV3IEV4Q29tbWFuZERpc3BhdGNoZXIoKTsKCiAgICAvKioKICAgICogQHBhcmFtIHtDb2RlTWlycm9yfSBjbSBDb2RlTWlycm9yIGluc3RhbmNlIHdlIGFyZSBpbi4KICAgICogQHBhcmFtIHtib29sZWFufSBjb25maXJtIFdoZXRoZXIgdG8gY29uZmlybSBlYWNoIHJlcGxhY2UuCiAgICAqIEBwYXJhbSB7Q3Vyc29yfSBsaW5lU3RhcnQgTGluZSB0byBzdGFydCByZXBsYWNpbmcgZnJvbS4KICAgICogQHBhcmFtIHtDdXJzb3J9IGxpbmVFbmQgTGluZSB0byBzdG9wIHJlcGxhY2luZyBhdC4KICAgICogQHBhcmFtIHtSZWdFeHB9IHF1ZXJ5IFF1ZXJ5IGZvciBwZXJmb3JtaW5nIG1hdGNoZXMgd2l0aC4KICAgICogQHBhcmFtIHtzdHJpbmd9IHJlcGxhY2VXaXRoIFRleHQgdG8gcmVwbGFjZSBtYXRjaGVzIHdpdGguIE1heSBjb250YWluICQxLAogICAgKiAgICAgJDIsIGV0YyBmb3IgcmVwbGFjaW5nIGNhcHR1cmVkIGdyb3VwcyB1c2luZyBKYXZhc2NyaXB0IHJlcGxhY2UuCiAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oKX0gY2FsbGJhY2sgQSBjYWxsYmFjayBmb3Igd2hlbiB0aGUgcmVwbGFjZSBpcyBkb25lLgogICAgKi8KICAgIGZ1bmN0aW9uIGRvUmVwbGFjZShjbSwgY29uZmlybSwgZ2xvYmFsLCBsaW5lU3RhcnQsIGxpbmVFbmQsIHNlYXJjaEN1cnNvciwgcXVlcnksCiAgICAgICAgcmVwbGFjZVdpdGgsIGNhbGxiYWNrKSB7CiAgICAgIC8vIFNldCB1cCBhbGwgdGhlIGZ1bmN0aW9ucy4KICAgICAgY20uc3RhdGUudmltLmV4TW9kZSA9IHRydWU7CiAgICAgIHZhciBkb25lID0gZmFsc2U7CiAgICAgIHZhciBsYXN0UG9zID0gc2VhcmNoQ3Vyc29yLmZyb20oKTsKICAgICAgZnVuY3Rpb24gcmVwbGFjZUFsbCgpIHsKICAgICAgICBjbS5vcGVyYXRpb24oZnVuY3Rpb24oKSB7CiAgICAgICAgICB3aGlsZSAoIWRvbmUpIHsKICAgICAgICAgICAgcmVwbGFjZSgpOwogICAgICAgICAgICBuZXh0KCk7CiAgICAgICAgICB9CiAgICAgICAgICBzdG9wKCk7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gcmVwbGFjZSgpIHsKICAgICAgICB2YXIgdGV4dCA9IGNtLmdldFJhbmdlKHNlYXJjaEN1cnNvci5mcm9tKCksIHNlYXJjaEN1cnNvci50bygpKTsKICAgICAgICB2YXIgbmV3VGV4dCA9IHRleHQucmVwbGFjZShxdWVyeSwgcmVwbGFjZVdpdGgpOwogICAgICAgIHNlYXJjaEN1cnNvci5yZXBsYWNlKG5ld1RleHQpOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIG5leHQoKSB7CiAgICAgICAgLy8gVGhlIGJlbG93IG9ubHkgbG9vcHMgdG8gc2tpcCBvdmVyIG11bHRpcGxlIG9jY3VycmVuY2VzIG9uIHRoZSBzYW1lCiAgICAgICAgLy8gbGluZSB3aGVuICdnbG9iYWwnIGlzIG5vdCB0cnVlLgogICAgICAgIHdoaWxlKHNlYXJjaEN1cnNvci5maW5kTmV4dCgpICYmCiAgICAgICAgICAgICAgaXNJblJhbmdlKHNlYXJjaEN1cnNvci5mcm9tKCksIGxpbmVTdGFydCwgbGluZUVuZCkpIHsKICAgICAgICAgIGlmICghZ2xvYmFsICYmIGxhc3RQb3MgJiYgc2VhcmNoQ3Vyc29yLmZyb20oKS5saW5lID09IGxhc3RQb3MubGluZSkgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KICAgICAgICAgIGNtLnNjcm9sbEludG9WaWV3KHNlYXJjaEN1cnNvci5mcm9tKCksIDMwKTsKICAgICAgICAgIGNtLnNldFNlbGVjdGlvbihzZWFyY2hDdXJzb3IuZnJvbSgpLCBzZWFyY2hDdXJzb3IudG8oKSk7CiAgICAgICAgICBsYXN0UG9zID0gc2VhcmNoQ3Vyc29yLmZyb20oKTsKICAgICAgICAgIGRvbmUgPSBmYWxzZTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgZG9uZSA9IHRydWU7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gc3RvcChjbG9zZSkgewogICAgICAgIGlmIChjbG9zZSkgeyBjbG9zZSgpOyB9CiAgICAgICAgY20uZm9jdXMoKTsKICAgICAgICBpZiAobGFzdFBvcykgewogICAgICAgICAgY20uc2V0Q3Vyc29yKGxhc3RQb3MpOwogICAgICAgICAgdmFyIHZpbSA9IGNtLnN0YXRlLnZpbTsKICAgICAgICAgIHZpbS5leE1vZGUgPSBmYWxzZTsKICAgICAgICAgIHZpbS5sYXN0SFBvcyA9IHZpbS5sYXN0SFNQb3MgPSBsYXN0UG9zLmNoOwogICAgICAgIH0KICAgICAgICBpZiAoY2FsbGJhY2spIHsgY2FsbGJhY2soKTsgfQogICAgICB9CiAgICAgIGZ1bmN0aW9uIG9uUHJvbXB0S2V5RG93bihlLCBfdmFsdWUsIGNsb3NlKSB7CiAgICAgICAgLy8gU3dhbGxvdyBhbGwga2V5cy4KICAgICAgICBDb2RlTWlycm9yLmVfc3RvcChlKTsKICAgICAgICB2YXIga2V5TmFtZSA9IENvZGVNaXJyb3Iua2V5TmFtZShlKTsKICAgICAgICBzd2l0Y2ggKGtleU5hbWUpIHsKICAgICAgICAgIGNhc2UgJ1knOgogICAgICAgICAgICByZXBsYWNlKCk7IG5leHQoKTsgYnJlYWs7CiAgICAgICAgICBjYXNlICdOJzoKICAgICAgICAgICAgbmV4dCgpOyBicmVhazsKICAgICAgICAgIGNhc2UgJ0EnOgogICAgICAgICAgICAvLyByZXBsYWNlQWxsIGNvbnRhaW5zIGEgY2FsbCB0byBjbG9zZSBvZiBpdHMgb3duLiBXZSBkb24ndCB3YW50IGl0CiAgICAgICAgICAgIC8vIHRvIGZpcmUgdG9vIGVhcmx5IG9yIG11bHRpcGxlIHRpbWVzLgogICAgICAgICAgICB2YXIgc2F2ZWRDYWxsYmFjayA9IGNhbGxiYWNrOwogICAgICAgICAgICBjYWxsYmFjayA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgY20ub3BlcmF0aW9uKHJlcGxhY2VBbGwpOwogICAgICAgICAgICBjYWxsYmFjayA9IHNhdmVkQ2FsbGJhY2s7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnTCc6CiAgICAgICAgICAgIHJlcGxhY2UoKTsKICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoIGFuZCBleGl0LgogICAgICAgICAgY2FzZSAnUSc6CiAgICAgICAgICBjYXNlICdFc2MnOgogICAgICAgICAgY2FzZSAnQ3RybC1DJzoKICAgICAgICAgIGNhc2UgJ0N0cmwtWyc6CiAgICAgICAgICAgIHN0b3AoY2xvc2UpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgaWYgKGRvbmUpIHsgc3RvcChjbG9zZSk7IH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQoKICAgICAgLy8gQWN0dWFsbHkgZG8gcmVwbGFjZS4KICAgICAgbmV4dCgpOwogICAgICBpZiAoZG9uZSkgewogICAgICAgIHNob3dDb25maXJtKGNtLCAnTm8gbWF0Y2hlcyBmb3IgJyArIHF1ZXJ5LnNvdXJjZSk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmICghY29uZmlybSkgewogICAgICAgIHJlcGxhY2VBbGwoKTsKICAgICAgICBpZiAoY2FsbGJhY2spIHsgY2FsbGJhY2soKTsgfTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgc2hvd1Byb21wdChjbSwgewogICAgICAgIHByZWZpeDogJ3JlcGxhY2Ugd2l0aCA8c3Ryb25nPicgKyByZXBsYWNlV2l0aCArICc8L3N0cm9uZz4gKHkvbi9hL3EvbCknLAogICAgICAgIG9uS2V5RG93bjogb25Qcm9tcHRLZXlEb3duCiAgICAgIH0pOwogICAgfQoKICAgIENvZGVNaXJyb3Iua2V5TWFwLnZpbSA9IHsKICAgICAgYXR0YWNoOiBhdHRhY2hWaW1NYXAsCiAgICAgIGRldGFjaDogZGV0YWNoVmltTWFwLAogICAgICBjYWxsOiBjbUtleQogICAgfTsKCiAgICBmdW5jdGlvbiBleGl0SW5zZXJ0TW9kZShjbSkgewogICAgICB2YXIgdmltID0gY20uc3RhdGUudmltOwogICAgICB2YXIgbWFjcm9Nb2RlU3RhdGUgPSB2aW1HbG9iYWxTdGF0ZS5tYWNyb01vZGVTdGF0ZTsKICAgICAgdmFyIGluc2VydE1vZGVDaGFuZ2VSZWdpc3RlciA9IHZpbUdsb2JhbFN0YXRlLnJlZ2lzdGVyQ29udHJvbGxlci5nZXRSZWdpc3RlcignLicpOwogICAgICB2YXIgaXNQbGF5aW5nID0gbWFjcm9Nb2RlU3RhdGUuaXNQbGF5aW5nOwogICAgICB2YXIgbGFzdENoYW5nZSA9IG1hY3JvTW9kZVN0YXRlLmxhc3RJbnNlcnRNb2RlQ2hhbmdlczsKICAgICAgLy8gSW4gY2FzZSBvZiB2aXN1YWwgYmxvY2ssIHRoZSBpbnNlcnRNb2RlQ2hhbmdlcyBhcmUgbm90IHNhdmVkIGFzIGEKICAgICAgLy8gc2luZ2xlIHdvcmQsIHNvIHdlIGNvbnZlcnQgdGhlbSB0byBhIHNpbmdsZSB3b3JkCiAgICAgIC8vIHNvIGFzIHRvIHVwZGF0ZSB0aGUgIi4gcmVnaXN0ZXIgYXMgZXhwZWN0ZWQgaW4gcmVhbCB2aW0uCiAgICAgIHZhciB0ZXh0ID0gW107CiAgICAgIGlmICghaXNQbGF5aW5nKSB7CiAgICAgICAgdmFyIHNlbExlbmd0aCA9IGxhc3RDaGFuZ2UuaW5WaXN1YWxCbG9jayA/IHZpbS5sYXN0U2VsZWN0aW9uLnZpc3VhbEJsb2NrLmhlaWdodCA6IDE7CiAgICAgICAgdmFyIGNoYW5nZXMgPSBsYXN0Q2hhbmdlLmNoYW5nZXM7CiAgICAgICAgdmFyIHRleHQgPSBbXTsKICAgICAgICB2YXIgaSA9IDA7CiAgICAgICAgLy8gSW4gY2FzZSBvZiBtdWx0aXBsZSBzZWxlY3Rpb25zIGluIGJsb2Nrd2lzZSB2aXN1YWwsCiAgICAgICAgLy8gdGhlIGluc2VydGVkIHRleHQsIGZvciBleGFtcGxlOiAnZjxCYWNrc3BhY2U+b28nLCBpcyBzdG9yZWQgYXMKICAgICAgICAvLyAnZicsICdmJywgSW5zZXJ0TW9kZUtleSAnbycsICdvJywgJ28nLCAnbycuIChpZiB5b3UgaGF2ZSBhIGJsb2NrIHdpdGggMiBsaW5lcykuCiAgICAgICAgLy8gV2UgcHVzaCB0aGUgY29udGVudHMgb2YgdGhlIGNoYW5nZXMgYXJyYXkgYXMgcGVyIHRoZSBmb2xsb3dpbmc6CiAgICAgICAgLy8gMS4gSW4gY2FzZSBvZiBJbnNlcnRNb2RlS2V5LCBqdXN0IGluY3JlbWVudCBieSAxLgogICAgICAgIC8vIDIuIEluIGNhc2Ugb2YgYSBjaGFyYWN0ZXIsIGp1bXAgYnkgc2VsTGVuZ3RoICgyIGluIHRoZSBleGFtcGxlKS4KICAgICAgICB3aGlsZSAoaSA8IGNoYW5nZXMubGVuZ3RoKSB7CiAgICAgICAgICAvLyBUaGlzIGxvb3Agd2lsbCBjb252ZXJ0ICdmZjxicz5vb29vJyB0byAnZjxicz5vbycuCiAgICAgICAgICB0ZXh0LnB1c2goY2hhbmdlc1tpXSk7CiAgICAgICAgICBpZiAoY2hhbmdlc1tpXSBpbnN0YW5jZW9mIEluc2VydE1vZGVLZXkpIHsKICAgICAgICAgICAgIGkrKzsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpKz0gc2VsTGVuZ3RoOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBsYXN0Q2hhbmdlLmNoYW5nZXMgPSB0ZXh0OwogICAgICAgIGNtLm9mZignY2hhbmdlJywgb25DaGFuZ2UpOwogICAgICAgIENvZGVNaXJyb3Iub2ZmKGNtLmdldElucHV0RmllbGQoKSwgJ2tleWRvd24nLCBvbktleUV2ZW50VGFyZ2V0S2V5RG93bik7CiAgICAgIH0KICAgICAgaWYgKCFpc1BsYXlpbmcgJiYgdmltLmluc2VydE1vZGVSZXBlYXQgPiAxKSB7CiAgICAgICAgLy8gUGVyZm9ybSBpbnNlcnQgbW9kZSByZXBlYXQgZm9yIGNvbW1hbmRzIGxpa2UgMyxhIGFuZCAzLG8uCiAgICAgICAgcmVwZWF0TGFzdEVkaXQoY20sIHZpbSwgdmltLmluc2VydE1vZGVSZXBlYXQgLSAxLAogICAgICAgICAgICB0cnVlIC8qKiByZXBlYXRGb3JJbnNlcnQgKi8pOwogICAgICAgIHZpbS5sYXN0RWRpdElucHV0U3RhdGUucmVwZWF0T3ZlcnJpZGUgPSB2aW0uaW5zZXJ0TW9kZVJlcGVhdDsKICAgICAgfQogICAgICBkZWxldGUgdmltLmluc2VydE1vZGVSZXBlYXQ7CiAgICAgIHZpbS5pbnNlcnRNb2RlID0gZmFsc2U7CiAgICAgIGNtLnNldEN1cnNvcihjbS5nZXRDdXJzb3IoKS5saW5lLCBjbS5nZXRDdXJzb3IoKS5jaC0xKTsKICAgICAgY20uc2V0T3B0aW9uKCdrZXlNYXAnLCAndmltJyk7CiAgICAgIGNtLnNldE9wdGlvbignZGlzYWJsZUlucHV0JywgdHJ1ZSk7CiAgICAgIGNtLnRvZ2dsZU92ZXJ3cml0ZShmYWxzZSk7IC8vIGV4aXQgcmVwbGFjZSBtb2RlIGlmIHdlIHdlcmUgaW4gaXQuCiAgICAgIC8vIHVwZGF0ZSB0aGUgIi4gcmVnaXN0ZXIgYmVmb3JlIGV4aXRpbmcgaW5zZXJ0IG1vZGUKICAgICAgaW5zZXJ0TW9kZUNoYW5nZVJlZ2lzdGVyLnNldFRleHQobGFzdENoYW5nZS5jaGFuZ2VzLmpvaW4oJycpKTsKICAgICAgQ29kZU1pcnJvci5zaWduYWwoY20sICJ2aW0tbW9kZS1jaGFuZ2UiLCB7bW9kZTogIm5vcm1hbCJ9KTsKICAgICAgaWYgKG1hY3JvTW9kZVN0YXRlLmlzUmVjb3JkaW5nKSB7CiAgICAgICAgbG9nSW5zZXJ0TW9kZUNoYW5nZShtYWNyb01vZGVTdGF0ZSk7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBfbWFwQ29tbWFuZChjb21tYW5kKSB7CiAgICAgIGRlZmF1bHRLZXltYXAudW5zaGlmdChjb21tYW5kKTsKICAgIH0KCiAgICBmdW5jdGlvbiBtYXBDb21tYW5kKGtleXMsIHR5cGUsIG5hbWUsIGFyZ3MsIGV4dHJhKSB7CiAgICAgIHZhciBjb21tYW5kID0ge2tleXM6IGtleXMsIHR5cGU6IHR5cGV9OwogICAgICBjb21tYW5kW3R5cGVdID0gbmFtZTsKICAgICAgY29tbWFuZFt0eXBlICsgIkFyZ3MiXSA9IGFyZ3M7CiAgICAgIGZvciAodmFyIGtleSBpbiBleHRyYSkKICAgICAgICBjb21tYW5kW2tleV0gPSBleHRyYVtrZXldOwogICAgICBfbWFwQ29tbWFuZChjb21tYW5kKTsKICAgIH0KCiAgICAvLyBUaGUgdGltZW91dCBpbiBtaWxsaXNlY29uZHMgZm9yIHRoZSB0d28tY2hhcmFjdGVyIEVTQyBrZXltYXAgc2hvdWxkIGJlCiAgICAvLyBhZGp1c3RlZCBhY2NvcmRpbmcgdG8geW91ciB0eXBpbmcgc3BlZWQgdG8gcHJldmVudCBmYWxzZSBwb3NpdGl2ZXMuCiAgICBkZWZpbmVPcHRpb24oJ2luc2VydE1vZGVFc2NLZXlzVGltZW91dCcsIDIwMCwgJ251bWJlcicpOwoKICAgIENvZGVNaXJyb3Iua2V5TWFwWyd2aW0taW5zZXJ0J10gPSB7CiAgICAgIC8vIFRPRE86IG92ZXJyaWRlIG5hdmlnYXRpb24ga2V5cyBzbyB0aGF0IEVzYyB3aWxsIGNhbmNlbCBhdXRvbWF0aWMKICAgICAgLy8gaW5kZW50YXRpb24gZnJvbSBvLCBPLCBpXzxDUj4KICAgICAgZmFsbHRocm91Z2g6IFsnZGVmYXVsdCddLAogICAgICBhdHRhY2g6IGF0dGFjaFZpbU1hcCwKICAgICAgZGV0YWNoOiBkZXRhY2hWaW1NYXAsCiAgICAgIGNhbGw6IGNtS2V5CiAgICB9OwoKICAgIENvZGVNaXJyb3Iua2V5TWFwWyd2aW0tcmVwbGFjZSddID0gewogICAgICAnQmFja3NwYWNlJzogJ2dvQ2hhckxlZnQnLAogICAgICBmYWxsdGhyb3VnaDogWyd2aW0taW5zZXJ0J10sCiAgICAgIGF0dGFjaDogYXR0YWNoVmltTWFwLAogICAgICBkZXRhY2g6IGRldGFjaFZpbU1hcCwKICAgICAgY2FsbDogY21LZXkKICAgIH07CgogICAgZnVuY3Rpb24gZXhlY3V0ZU1hY3JvUmVnaXN0ZXIoY20sIHZpbSwgbWFjcm9Nb2RlU3RhdGUsIHJlZ2lzdGVyTmFtZSkgewogICAgICB2YXIgcmVnaXN0ZXIgPSB2aW1HbG9iYWxTdGF0ZS5yZWdpc3RlckNvbnRyb2xsZXIuZ2V0UmVnaXN0ZXIocmVnaXN0ZXJOYW1lKTsKICAgICAgaWYgKHJlZ2lzdGVyTmFtZSA9PSAnOicpIHsKICAgICAgICAvLyBSZWFkLW9ubHkgcmVnaXN0ZXIgY29udGFpbmluZyBsYXN0IEV4IGNvbW1hbmQuCiAgICAgICAgaWYgKHJlZ2lzdGVyLmtleUJ1ZmZlclswXSkgewogICAgICAgICAgZXhDb21tYW5kRGlzcGF0Y2hlci5wcm9jZXNzQ29tbWFuZChjbSwgcmVnaXN0ZXIua2V5QnVmZmVyWzBdKTsKICAgICAgICB9CiAgICAgICAgbWFjcm9Nb2RlU3RhdGUuaXNQbGF5aW5nID0gZmFsc2U7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHZhciBrZXlCdWZmZXIgPSByZWdpc3Rlci5rZXlCdWZmZXI7CiAgICAgIHZhciBpbWMgPSAwOwogICAgICBtYWNyb01vZGVTdGF0ZS5pc1BsYXlpbmcgPSB0cnVlOwogICAgICBtYWNyb01vZGVTdGF0ZS5yZXBsYXlTZWFyY2hRdWVyaWVzID0gcmVnaXN0ZXIuc2VhcmNoUXVlcmllcy5zbGljZSgwKTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlCdWZmZXIubGVuZ3RoOyBpKyspIHsKICAgICAgICB2YXIgdGV4dCA9IGtleUJ1ZmZlcltpXTsKICAgICAgICB2YXIgbWF0Y2gsIGtleTsKICAgICAgICB3aGlsZSAodGV4dCkgewogICAgICAgICAgLy8gUHVsbCBvZmYgb25lIGNvbW1hbmQga2V5LCB3aGljaCBpcyBlaXRoZXIgYSBzaW5nbGUgY2hhcmFjdGVyCiAgICAgICAgICAvLyBvciBhIHNwZWNpYWwgc2VxdWVuY2Ugd3JhcHBlZCBpbiAnPCcgYW5kICc+JywgZS5nLiAnPFNwYWNlPicuCiAgICAgICAgICBtYXRjaCA9ICgvPFx3Ky0uKz8+fDxcdys+fC4vKS5leGVjKHRleHQpOwogICAgICAgICAga2V5ID0gbWF0Y2hbMF07CiAgICAgICAgICB0ZXh0ID0gdGV4dC5zdWJzdHJpbmcobWF0Y2guaW5kZXggKyBrZXkubGVuZ3RoKTsKICAgICAgICAgIENvZGVNaXJyb3IuVmltLmhhbmRsZUtleShjbSwga2V5LCAnbWFjcm8nKTsKICAgICAgICAgIGlmICh2aW0uaW5zZXJ0TW9kZSkgewogICAgICAgICAgICB2YXIgY2hhbmdlcyA9IHJlZ2lzdGVyLmluc2VydE1vZGVDaGFuZ2VzW2ltYysrXS5jaGFuZ2VzOwogICAgICAgICAgICB2aW1HbG9iYWxTdGF0ZS5tYWNyb01vZGVTdGF0ZS5sYXN0SW5zZXJ0TW9kZUNoYW5nZXMuY2hhbmdlcyA9CiAgICAgICAgICAgICAgICBjaGFuZ2VzOwogICAgICAgICAgICByZXBlYXRJbnNlcnRNb2RlQ2hhbmdlcyhjbSwgY2hhbmdlcywgMSk7CiAgICAgICAgICAgIGV4aXRJbnNlcnRNb2RlKGNtKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH07CiAgICAgIG1hY3JvTW9kZVN0YXRlLmlzUGxheWluZyA9IGZhbHNlOwogICAgfQoKICAgIGZ1bmN0aW9uIGxvZ0tleShtYWNyb01vZGVTdGF0ZSwga2V5KSB7CiAgICAgIGlmIChtYWNyb01vZGVTdGF0ZS5pc1BsYXlpbmcpIHsgcmV0dXJuOyB9CiAgICAgIHZhciByZWdpc3Rlck5hbWUgPSBtYWNyb01vZGVTdGF0ZS5sYXRlc3RSZWdpc3RlcjsKICAgICAgdmFyIHJlZ2lzdGVyID0gdmltR2xvYmFsU3RhdGUucmVnaXN0ZXJDb250cm9sbGVyLmdldFJlZ2lzdGVyKHJlZ2lzdGVyTmFtZSk7CiAgICAgIGlmIChyZWdpc3RlcikgewogICAgICAgIHJlZ2lzdGVyLnB1c2hUZXh0KGtleSk7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBsb2dJbnNlcnRNb2RlQ2hhbmdlKG1hY3JvTW9kZVN0YXRlKSB7CiAgICAgIGlmIChtYWNyb01vZGVTdGF0ZS5pc1BsYXlpbmcpIHsgcmV0dXJuOyB9CiAgICAgIHZhciByZWdpc3Rlck5hbWUgPSBtYWNyb01vZGVTdGF0ZS5sYXRlc3RSZWdpc3RlcjsKICAgICAgdmFyIHJlZ2lzdGVyID0gdmltR2xvYmFsU3RhdGUucmVnaXN0ZXJDb250cm9sbGVyLmdldFJlZ2lzdGVyKHJlZ2lzdGVyTmFtZSk7CiAgICAgIGlmIChyZWdpc3RlciAmJiByZWdpc3Rlci5wdXNoSW5zZXJ0TW9kZUNoYW5nZXMpIHsKICAgICAgICByZWdpc3Rlci5wdXNoSW5zZXJ0TW9kZUNoYW5nZXMobWFjcm9Nb2RlU3RhdGUubGFzdEluc2VydE1vZGVDaGFuZ2VzKTsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGxvZ1NlYXJjaFF1ZXJ5KG1hY3JvTW9kZVN0YXRlLCBxdWVyeSkgewogICAgICBpZiAobWFjcm9Nb2RlU3RhdGUuaXNQbGF5aW5nKSB7IHJldHVybjsgfQogICAgICB2YXIgcmVnaXN0ZXJOYW1lID0gbWFjcm9Nb2RlU3RhdGUubGF0ZXN0UmVnaXN0ZXI7CiAgICAgIHZhciByZWdpc3RlciA9IHZpbUdsb2JhbFN0YXRlLnJlZ2lzdGVyQ29udHJvbGxlci5nZXRSZWdpc3RlcihyZWdpc3Rlck5hbWUpOwogICAgICBpZiAocmVnaXN0ZXIgJiYgcmVnaXN0ZXIucHVzaFNlYXJjaFF1ZXJ5KSB7CiAgICAgICAgcmVnaXN0ZXIucHVzaFNlYXJjaFF1ZXJ5KHF1ZXJ5KTsKICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogTGlzdGVucyBmb3IgY2hhbmdlcyBtYWRlIGluIGluc2VydCBtb2RlLgogICAgICogU2hvdWxkIG9ubHkgYmUgYWN0aXZlIGluIGluc2VydCBtb2RlLgogICAgICovCiAgICBmdW5jdGlvbiBvbkNoYW5nZShfY20sIGNoYW5nZU9iaikgewogICAgICB2YXIgbWFjcm9Nb2RlU3RhdGUgPSB2aW1HbG9iYWxTdGF0ZS5tYWNyb01vZGVTdGF0ZTsKICAgICAgdmFyIGxhc3RDaGFuZ2UgPSBtYWNyb01vZGVTdGF0ZS5sYXN0SW5zZXJ0TW9kZUNoYW5nZXM7CiAgICAgIGlmICghbWFjcm9Nb2RlU3RhdGUuaXNQbGF5aW5nKSB7CiAgICAgICAgd2hpbGUoY2hhbmdlT2JqKSB7CiAgICAgICAgICBsYXN0Q2hhbmdlLmV4cGVjdEN1cnNvckFjdGl2aXR5Rm9yQ2hhbmdlID0gdHJ1ZTsKICAgICAgICAgIGlmIChjaGFuZ2VPYmoub3JpZ2luID09ICcraW5wdXQnIHx8IGNoYW5nZU9iai5vcmlnaW4gPT0gJ3Bhc3RlJwogICAgICAgICAgICAgIHx8IGNoYW5nZU9iai5vcmlnaW4gPT09IHVuZGVmaW5lZCAvKiBvbmx5IGluIHRlc3RpbmcgKi8pIHsKICAgICAgICAgICAgdmFyIHRleHQgPSBjaGFuZ2VPYmoudGV4dC5qb2luKCdcbicpOwogICAgICAgICAgICBpZiAobGFzdENoYW5nZS5tYXliZVJlc2V0KSB7CiAgICAgICAgICAgICAgbGFzdENoYW5nZS5jaGFuZ2VzID0gW107CiAgICAgICAgICAgICAgbGFzdENoYW5nZS5tYXliZVJlc2V0ID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGFzdENoYW5nZS5jaGFuZ2VzLnB1c2godGV4dCk7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBDaGFuZ2Ugb2JqZWN0cyBtYXkgYmUgY2hhaW5lZCB3aXRoIG5leHQuCiAgICAgICAgICBjaGFuZ2VPYmogPSBjaGFuZ2VPYmoubmV4dDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICogTGlzdGVucyBmb3IgYW55IGtpbmQgb2YgY3Vyc29yIGFjdGl2aXR5IG9uIENvZGVNaXJyb3IuCiAgICAqLwogICAgZnVuY3Rpb24gb25DdXJzb3JBY3Rpdml0eShjbSkgewogICAgICB2YXIgdmltID0gY20uc3RhdGUudmltOwogICAgICBpZiAodmltLmluc2VydE1vZGUpIHsKICAgICAgICAvLyBUcmFja2luZyBjdXJzb3IgYWN0aXZpdHkgaW4gaW5zZXJ0IG1vZGUgKGZvciBtYWNybyBzdXBwb3J0KS4KICAgICAgICB2YXIgbWFjcm9Nb2RlU3RhdGUgPSB2aW1HbG9iYWxTdGF0ZS5tYWNyb01vZGVTdGF0ZTsKICAgICAgICBpZiAobWFjcm9Nb2RlU3RhdGUuaXNQbGF5aW5nKSB7IHJldHVybjsgfQogICAgICAgIHZhciBsYXN0Q2hhbmdlID0gbWFjcm9Nb2RlU3RhdGUubGFzdEluc2VydE1vZGVDaGFuZ2VzOwogICAgICAgIGlmIChsYXN0Q2hhbmdlLmV4cGVjdEN1cnNvckFjdGl2aXR5Rm9yQ2hhbmdlKSB7CiAgICAgICAgICBsYXN0Q2hhbmdlLmV4cGVjdEN1cnNvckFjdGl2aXR5Rm9yQ2hhbmdlID0gZmFsc2U7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIEN1cnNvciBtb3ZlZCBvdXRzaWRlIHRoZSBjb250ZXh0IG9mIGFuIGVkaXQuIFJlc2V0IHRoZSBjaGFuZ2UuCiAgICAgICAgICBsYXN0Q2hhbmdlLm1heWJlUmVzZXQgPSB0cnVlOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICghY20uY3VyT3AuaXNWaW1PcCkgewogICAgICAgIGhhbmRsZUV4dGVybmFsU2VsZWN0aW9uKGNtLCB2aW0pOwogICAgICB9CiAgICAgIGlmICh2aW0udmlzdWFsTW9kZSkgewogICAgICAgIHVwZGF0ZUZha2VDdXJzb3IoY20pOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiB1cGRhdGVGYWtlQ3Vyc29yKGNtKSB7CiAgICAgIHZhciB2aW0gPSBjbS5zdGF0ZS52aW07CiAgICAgIHZhciBmcm9tID0gY2xpcEN1cnNvclRvQ29udGVudChjbSwgY29weUN1cnNvcih2aW0uc2VsLmhlYWQpKTsKICAgICAgdmFyIHRvID0gb2Zmc2V0Q3Vyc29yKGZyb20sIDAsIDEpOwogICAgICBpZiAodmltLmZha2VDdXJzb3IpIHsKICAgICAgICB2aW0uZmFrZUN1cnNvci5jbGVhcigpOwogICAgICB9CiAgICAgIHZpbS5mYWtlQ3Vyc29yID0gY20ubWFya1RleHQoZnJvbSwgdG8sIHtjbGFzc05hbWU6ICdjbS1hbmltYXRlLWZhdC1jdXJzb3InfSk7CiAgICB9CiAgICBmdW5jdGlvbiBoYW5kbGVFeHRlcm5hbFNlbGVjdGlvbihjbSwgdmltKSB7CiAgICAgIHZhciBhbmNob3IgPSBjbS5nZXRDdXJzb3IoJ2FuY2hvcicpOwogICAgICB2YXIgaGVhZCA9IGNtLmdldEN1cnNvcignaGVhZCcpOwogICAgICAvLyBFbnRlciBvciBleGl0IHZpc3VhbCBtb2RlIHRvIG1hdGNoIG1vdXNlIHNlbGVjdGlvbi4KICAgICAgaWYgKHZpbS52aXN1YWxNb2RlICYmICFjbS5zb21ldGhpbmdTZWxlY3RlZCgpKSB7CiAgICAgICAgZXhpdFZpc3VhbE1vZGUoY20sIGZhbHNlKTsKICAgICAgfSBlbHNlIGlmICghdmltLnZpc3VhbE1vZGUgJiYgIXZpbS5pbnNlcnRNb2RlICYmIGNtLnNvbWV0aGluZ1NlbGVjdGVkKCkpIHsKICAgICAgICB2aW0udmlzdWFsTW9kZSA9IHRydWU7CiAgICAgICAgdmltLnZpc3VhbExpbmUgPSBmYWxzZTsKICAgICAgICBDb2RlTWlycm9yLnNpZ25hbChjbSwgInZpbS1tb2RlLWNoYW5nZSIsIHttb2RlOiAidmlzdWFsIn0pOwogICAgICB9CiAgICAgIGlmICh2aW0udmlzdWFsTW9kZSkgewogICAgICAgIC8vIEJpbmQgQ29kZU1pcnJvciBzZWxlY3Rpb24gbW9kZWwgdG8gdmltIHNlbGVjdGlvbiBtb2RlbC4KICAgICAgICAvLyBNb3VzZSBzZWxlY3Rpb25zIGFyZSBjb25zaWRlcmVkIHZpc3VhbCBjaGFyYWN0ZXJ3aXNlLgogICAgICAgIHZhciBoZWFkT2Zmc2V0ID0gIWN1cnNvcklzQmVmb3JlKGhlYWQsIGFuY2hvcikgPyAtMSA6IDA7CiAgICAgICAgdmFyIGFuY2hvck9mZnNldCA9IGN1cnNvcklzQmVmb3JlKGhlYWQsIGFuY2hvcikgPyAtMSA6IDA7CiAgICAgICAgaGVhZCA9IG9mZnNldEN1cnNvcihoZWFkLCAwLCBoZWFkT2Zmc2V0KTsKICAgICAgICBhbmNob3IgPSBvZmZzZXRDdXJzb3IoYW5jaG9yLCAwLCBhbmNob3JPZmZzZXQpOwogICAgICAgIHZpbS5zZWwgPSB7CiAgICAgICAgICBhbmNob3I6IGFuY2hvciwKICAgICAgICAgIGhlYWQ6IGhlYWQKICAgICAgICB9OwogICAgICAgIHVwZGF0ZU1hcmsoY20sIHZpbSwgJzwnLCBjdXJzb3JNaW4oaGVhZCwgYW5jaG9yKSk7CiAgICAgICAgdXBkYXRlTWFyayhjbSwgdmltLCAnPicsIGN1cnNvck1heChoZWFkLCBhbmNob3IpKTsKICAgICAgfSBlbHNlIGlmICghdmltLmluc2VydE1vZGUpIHsKICAgICAgICAvLyBSZXNldCBsYXN0SFBvcyBpZiBzZWxlY3Rpb24gd2FzIG1vZGlmaWVkIGJ5IHNvbWV0aGluZyBvdXRzaWRlIG9mIHZpbSBtb2RlIGUuZy4gYnkgbW91c2UuCiAgICAgICAgdmltLmxhc3RIUG9zID0gY20uZ2V0Q3Vyc29yKCkuY2g7CiAgICAgIH0KICAgIH0KCiAgICAvKiogV3JhcHBlciBmb3Igc3BlY2lhbCBrZXlzIHByZXNzZWQgaW4gaW5zZXJ0IG1vZGUgKi8KICAgIGZ1bmN0aW9uIEluc2VydE1vZGVLZXkoa2V5TmFtZSkgewogICAgICB0aGlzLmtleU5hbWUgPSBrZXlOYW1lOwogICAgfQoKICAgIC8qKgogICAgKiBIYW5kbGVzIHJhdyBrZXkgZG93biBldmVudHMgZnJvbSB0aGUgdGV4dCBhcmVhLgogICAgKiAtIFNob3VsZCBvbmx5IGJlIGFjdGl2ZSBpbiBpbnNlcnQgbW9kZS4KICAgICogLSBGb3IgcmVjb3JkaW5nIGRlbGV0ZXMgaW4gaW5zZXJ0IG1vZGUuCiAgICAqLwogICAgZnVuY3Rpb24gb25LZXlFdmVudFRhcmdldEtleURvd24oZSkgewogICAgICB2YXIgbWFjcm9Nb2RlU3RhdGUgPSB2aW1HbG9iYWxTdGF0ZS5tYWNyb01vZGVTdGF0ZTsKICAgICAgdmFyIGxhc3RDaGFuZ2UgPSBtYWNyb01vZGVTdGF0ZS5sYXN0SW5zZXJ0TW9kZUNoYW5nZXM7CiAgICAgIHZhciBrZXlOYW1lID0gQ29kZU1pcnJvci5rZXlOYW1lKGUpOwogICAgICBpZiAoIWtleU5hbWUpIHsgcmV0dXJuOyB9CiAgICAgIGZ1bmN0aW9uIG9uS2V5Rm91bmQoKSB7CiAgICAgICAgaWYgKGxhc3RDaGFuZ2UubWF5YmVSZXNldCkgewogICAgICAgICAgbGFzdENoYW5nZS5jaGFuZ2VzID0gW107CiAgICAgICAgICBsYXN0Q2hhbmdlLm1heWJlUmVzZXQgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgbGFzdENoYW5nZS5jaGFuZ2VzLnB1c2gobmV3IEluc2VydE1vZGVLZXkoa2V5TmFtZSkpOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIGlmIChrZXlOYW1lLmluZGV4T2YoJ0RlbGV0ZScpICE9IC0xIHx8IGtleU5hbWUuaW5kZXhPZignQmFja3NwYWNlJykgIT0gLTEpIHsKICAgICAgICBDb2RlTWlycm9yLmxvb2t1cEtleShrZXlOYW1lLCAndmltLWluc2VydCcsIG9uS2V5Rm91bmQpOwogICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXBlYXRzIHRoZSBsYXN0IGVkaXQsIHdoaWNoIGluY2x1ZGVzIGV4YWN0bHkgMSBjb21tYW5kIGFuZCBhdCBtb3N0IDEKICAgICAqIGluc2VydC4gT3BlcmF0b3IgYW5kIG1vdGlvbiBjb21tYW5kcyBhcmUgcmVhZCBmcm9tIGxhc3RFZGl0SW5wdXRTdGF0ZSwKICAgICAqIHdoaWxlIGFjdGlvbiBjb21tYW5kcyBhcmUgcmVhZCBmcm9tIGxhc3RFZGl0QWN0aW9uQ29tbWFuZC4KICAgICAqCiAgICAgKiBJZiByZXBlYXRGb3JJbnNlcnQgaXMgdHJ1ZSwgdGhlbiB0aGUgZnVuY3Rpb24gd2FzIGNhbGxlZCBieQogICAgICogZXhpdEluc2VydE1vZGUgdG8gcmVwZWF0IHRoZSBpbnNlcnQgbW9kZSBjaGFuZ2VzIHRoZSB1c2VyIGp1c3QgbWFkZS4gVGhlCiAgICAgKiBjb3JyZXNwb25kaW5nIGVudGVySW5zZXJ0TW9kZSBjYWxsIHdhcyBtYWRlIHdpdGggYSBjb3VudC4KICAgICAqLwogICAgZnVuY3Rpb24gcmVwZWF0TGFzdEVkaXQoY20sIHZpbSwgcmVwZWF0LCByZXBlYXRGb3JJbnNlcnQpIHsKICAgICAgdmFyIG1hY3JvTW9kZVN0YXRlID0gdmltR2xvYmFsU3RhdGUubWFjcm9Nb2RlU3RhdGU7CiAgICAgIG1hY3JvTW9kZVN0YXRlLmlzUGxheWluZyA9IHRydWU7CiAgICAgIHZhciBpc0FjdGlvbiA9ICEhdmltLmxhc3RFZGl0QWN0aW9uQ29tbWFuZDsKICAgICAgdmFyIGNhY2hlZElucHV0U3RhdGUgPSB2aW0uaW5wdXRTdGF0ZTsKICAgICAgZnVuY3Rpb24gcmVwZWF0Q29tbWFuZCgpIHsKICAgICAgICBpZiAoaXNBY3Rpb24pIHsKICAgICAgICAgIGNvbW1hbmREaXNwYXRjaGVyLnByb2Nlc3NBY3Rpb24oY20sIHZpbSwgdmltLmxhc3RFZGl0QWN0aW9uQ29tbWFuZCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbW1hbmREaXNwYXRjaGVyLmV2YWxJbnB1dChjbSwgdmltKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZnVuY3Rpb24gcmVwZWF0SW5zZXJ0KHJlcGVhdCkgewogICAgICAgIGlmIChtYWNyb01vZGVTdGF0ZS5sYXN0SW5zZXJ0TW9kZUNoYW5nZXMuY2hhbmdlcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAvLyBGb3Igc29tZSByZWFzb24sIHJlcGVhdCBjdyBpbiBkZXNrdG9wIFZJTSBkb2VzIG5vdCByZXBlYXQKICAgICAgICAgIC8vIGluc2VydCBtb2RlIGNoYW5nZXMuIFdpbGwgY29uZm9ybSB0byB0aGF0IGJlaGF2aW9yLgogICAgICAgICAgcmVwZWF0ID0gIXZpbS5sYXN0RWRpdEFjdGlvbkNvbW1hbmQgPyAxIDogcmVwZWF0OwogICAgICAgICAgdmFyIGNoYW5nZU9iamVjdCA9IG1hY3JvTW9kZVN0YXRlLmxhc3RJbnNlcnRNb2RlQ2hhbmdlczsKICAgICAgICAgIHJlcGVhdEluc2VydE1vZGVDaGFuZ2VzKGNtLCBjaGFuZ2VPYmplY3QuY2hhbmdlcywgcmVwZWF0KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgdmltLmlucHV0U3RhdGUgPSB2aW0ubGFzdEVkaXRJbnB1dFN0YXRlOwogICAgICBpZiAoaXNBY3Rpb24gJiYgdmltLmxhc3RFZGl0QWN0aW9uQ29tbWFuZC5pbnRlcmxhY2VJbnNlcnRSZXBlYXQpIHsKICAgICAgICAvLyBvIGFuZCBPIHJlcGVhdCBoYXZlIHRvIGJlIGludGVybGFjZWQgd2l0aCBpbnNlcnQgcmVwZWF0cyBzbyB0aGF0IHRoZQogICAgICAgIC8vIGluc2VydGlvbnMgYXBwZWFyIG9uIHNlcGFyYXRlIGxpbmVzIGluc3RlYWQgb2YgdGhlIGxhc3QgbGluZS4KICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlcGVhdDsgaSsrKSB7CiAgICAgICAgICByZXBlYXRDb21tYW5kKCk7CiAgICAgICAgICByZXBlYXRJbnNlcnQoMSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGlmICghcmVwZWF0Rm9ySW5zZXJ0KSB7CiAgICAgICAgICAvLyBIYWNrIHRvIGdldCB0aGUgY3Vyc29yIHRvIGVuZCB1cCBhdCB0aGUgcmlnaHQgcGxhY2UuIElmIEkgaXMKICAgICAgICAgIC8vIHJlcGVhdGVkIGluIGluc2VydCBtb2RlIHJlcGVhdCwgY3Vyc29yIHdpbGwgYmUgMSBpbnNlcnQKICAgICAgICAgIC8vIGNoYW5nZSBzZXQgbGVmdCBvZiB3aGVyZSBpdCBzaG91bGQgYmUuCiAgICAgICAgICByZXBlYXRDb21tYW5kKCk7CiAgICAgICAgfQogICAgICAgIHJlcGVhdEluc2VydChyZXBlYXQpOwogICAgICB9CiAgICAgIHZpbS5pbnB1dFN0YXRlID0gY2FjaGVkSW5wdXRTdGF0ZTsKICAgICAgaWYgKHZpbS5pbnNlcnRNb2RlICYmICFyZXBlYXRGb3JJbnNlcnQpIHsKICAgICAgICAvLyBEb24ndCBleGl0IGluc2VydCBtb2RlIHR3aWNlLiBJZiByZXBlYXRGb3JJbnNlcnQgaXMgc2V0LCB0aGVuIHdlCiAgICAgICAgLy8gd2VyZSBjYWxsZWQgYnkgYW4gZXhpdEluc2VydE1vZGUgY2FsbCBsb3dlciBvbiB0aGUgc3RhY2suCiAgICAgICAgZXhpdEluc2VydE1vZGUoY20pOwogICAgICB9CiAgICAgIG1hY3JvTW9kZVN0YXRlLmlzUGxheWluZyA9IGZhbHNlOwogICAgfTsKCiAgICBmdW5jdGlvbiByZXBlYXRJbnNlcnRNb2RlQ2hhbmdlcyhjbSwgY2hhbmdlcywgcmVwZWF0KSB7CiAgICAgIGZ1bmN0aW9uIGtleUhhbmRsZXIoYmluZGluZykgewogICAgICAgIGlmICh0eXBlb2YgYmluZGluZyA9PSAnc3RyaW5nJykgewogICAgICAgICAgQ29kZU1pcnJvci5jb21tYW5kc1tiaW5kaW5nXShjbSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGJpbmRpbmcoY20pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICB2YXIgaGVhZCA9IGNtLmdldEN1cnNvcignaGVhZCcpOwogICAgICB2YXIgaW5WaXN1YWxCbG9jayA9IHZpbUdsb2JhbFN0YXRlLm1hY3JvTW9kZVN0YXRlLmxhc3RJbnNlcnRNb2RlQ2hhbmdlcy5pblZpc3VhbEJsb2NrOwogICAgICBpZiAoaW5WaXN1YWxCbG9jaykgewogICAgICAgIC8vIFNldCB1cCBibG9jayBzZWxlY3Rpb24gYWdhaW4gZm9yIHJlcGVhdGluZyB0aGUgY2hhbmdlcy4KICAgICAgICB2YXIgdmltID0gY20uc3RhdGUudmltOwogICAgICAgIHZhciBsYXN0U2VsID0gdmltLmxhc3RTZWxlY3Rpb247CiAgICAgICAgdmFyIG9mZnNldCA9IGdldE9mZnNldChsYXN0U2VsLmFuY2hvciwgbGFzdFNlbC5oZWFkKTsKICAgICAgICBzZWxlY3RGb3JJbnNlcnQoY20sIGhlYWQsIG9mZnNldC5saW5lICsgMSk7CiAgICAgICAgcmVwZWF0ID0gY20ubGlzdFNlbGVjdGlvbnMoKS5sZW5ndGg7CiAgICAgICAgY20uc2V0Q3Vyc29yKGhlYWQpOwogICAgICB9CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVwZWF0OyBpKyspIHsKICAgICAgICBpZiAoaW5WaXN1YWxCbG9jaykgewogICAgICAgICAgY20uc2V0Q3Vyc29yKG9mZnNldEN1cnNvcihoZWFkLCBpLCAwKSk7CiAgICAgICAgfQogICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgY2hhbmdlcy5sZW5ndGg7IGorKykgewogICAgICAgICAgdmFyIGNoYW5nZSA9IGNoYW5nZXNbal07CiAgICAgICAgICBpZiAoY2hhbmdlIGluc3RhbmNlb2YgSW5zZXJ0TW9kZUtleSkgewogICAgICAgICAgICBDb2RlTWlycm9yLmxvb2t1cEtleShjaGFuZ2Uua2V5TmFtZSwgJ3ZpbS1pbnNlcnQnLCBrZXlIYW5kbGVyKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHZhciBjdXIgPSBjbS5nZXRDdXJzb3IoKTsKICAgICAgICAgICAgY20ucmVwbGFjZVJhbmdlKGNoYW5nZSwgY3VyLCBjdXIpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoaW5WaXN1YWxCbG9jaykgewogICAgICAgIGNtLnNldEN1cnNvcihvZmZzZXRDdXJzb3IoaGVhZCwgMCwgMSkpOwogICAgICB9CiAgICB9CgogICAgcmVzZXRWaW1HbG9iYWxTdGF0ZSgpOwogICAgcmV0dXJuIHZpbUFwaTsKICB9OwogIC8vIEluaXRpYWxpemUgVmltIGFuZCBtYWtlIGl0IGF2YWlsYWJsZSBhcyBhbiBBUEkuCiAgQ29kZU1pcnJvci5WaW0gPSBWaW0oKTsKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/lib/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/lib/codemirror.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogQkFTSUNTICovCgouQ29kZU1pcnJvciB7CiAgLyogU2V0IGhlaWdodCwgd2lkdGgsIGJvcmRlcnMsIGFuZCBnbG9iYWwgZm9udCBwcm9wZXJ0aWVzIGhlcmUgKi8KICBmb250LWZhbWlseTogbW9ub3NwYWNlOwogIGhlaWdodDogMzAwcHg7CiAgY29sb3I6IGJsYWNrOwp9CgovKiBQQURESU5HICovCgouQ29kZU1pcnJvci1saW5lcyB7CiAgcGFkZGluZzogNHB4IDA7IC8qIFZlcnRpY2FsIHBhZGRpbmcgYXJvdW5kIGNvbnRlbnQgKi8KfQouQ29kZU1pcnJvciBwcmUgewogIHBhZGRpbmc6IDAgNHB4OyAvKiBIb3Jpem9udGFsIHBhZGRpbmcgb2YgY29udGVudCAqLwp9CgouQ29kZU1pcnJvci1zY3JvbGxiYXItZmlsbGVyLCAuQ29kZU1pcnJvci1ndXR0ZXItZmlsbGVyIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsgLyogVGhlIGxpdHRsZSBzcXVhcmUgYmV0d2VlbiBIIGFuZCBWIHNjcm9sbGJhcnMgKi8KfQoKLyogR1VUVEVSICovCgouQ29kZU1pcnJvci1ndXR0ZXJzIHsKICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjZGRkOwogIGJhY2tncm91bmQtY29sb3I6ICNmN2Y3Zjc7CiAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQouQ29kZU1pcnJvci1saW5lbnVtYmVycyB7fQouQ29kZU1pcnJvci1saW5lbnVtYmVyIHsKICBwYWRkaW5nOiAwIDNweCAwIDVweDsKICBtaW4td2lkdGg6IDIwcHg7CiAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgY29sb3I6ICM5OTk7CiAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKfQoKLkNvZGVNaXJyb3ItZ3V0dGVybWFya2VyIHsgY29sb3I6IGJsYWNrOyB9Ci5Db2RlTWlycm9yLWd1dHRlcm1hcmtlci1zdWJ0bGUgeyBjb2xvcjogIzk5OTsgfQoKLyogQ1VSU09SICovCgouQ29kZU1pcnJvci1jdXJzb3IgewogIGJvcmRlci1sZWZ0OiAxcHggc29saWQgYmxhY2s7CiAgYm9yZGVyLXJpZ2h0OiBub25lOwogIHdpZHRoOiAwOwp9Ci8qIFNob3duIHdoZW4gbW92aW5nIGluIGJpLWRpcmVjdGlvbmFsIHRleHQgKi8KLkNvZGVNaXJyb3IgZGl2LkNvZGVNaXJyb3Itc2Vjb25kYXJ5Y3Vyc29yIHsKICBib3JkZXItbGVmdDogMXB4IHNvbGlkIHNpbHZlcjsKfQouY20tZmF0LWN1cnNvciAuQ29kZU1pcnJvci1jdXJzb3IgewogIHdpZHRoOiBhdXRvOwogIGJvcmRlcjogMCAhaW1wb3J0YW50OwogIGJhY2tncm91bmQ6ICM3ZTc7Cn0KLmNtLWZhdC1jdXJzb3IgZGl2LkNvZGVNaXJyb3ItY3Vyc29ycyB7CiAgei1pbmRleDogMTsKfQoKLmNtLWFuaW1hdGUtZmF0LWN1cnNvciB7CiAgd2lkdGg6IGF1dG87CiAgYm9yZGVyOiAwOwogIC13ZWJraXQtYW5pbWF0aW9uOiBibGluayAxLjA2cyBzdGVwcygxKSBpbmZpbml0ZTsKICAtbW96LWFuaW1hdGlvbjogYmxpbmsgMS4wNnMgc3RlcHMoMSkgaW5maW5pdGU7CiAgYW5pbWF0aW9uOiBibGluayAxLjA2cyBzdGVwcygxKSBpbmZpbml0ZTsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjN2U3Owp9CkAtbW96LWtleWZyYW1lcyBibGluayB7CiAgMCUge30KICA1MCUgeyBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsgfQogIDEwMCUge30KfQpALXdlYmtpdC1rZXlmcmFtZXMgYmxpbmsgewogIDAlIHt9CiAgNTAlIHsgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7IH0KICAxMDAlIHt9Cn0KQGtleWZyYW1lcyBibGluayB7CiAgMCUge30KICA1MCUgeyBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDsgfQogIDEwMCUge30KfQoKLyogQ2FuIHN0eWxlIGN1cnNvciBkaWZmZXJlbnQgaW4gb3ZlcndyaXRlIChub24taW5zZXJ0KSBtb2RlICovCi5Db2RlTWlycm9yLW92ZXJ3cml0ZSAuQ29kZU1pcnJvci1jdXJzb3Ige30KCi5jbS10YWIgeyBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHRleHQtZGVjb3JhdGlvbjogaW5oZXJpdDsgfQoKLkNvZGVNaXJyb3ItcnVsZXJzIHsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgbGVmdDogMDsgcmlnaHQ6IDA7IHRvcDogLTUwcHg7IGJvdHRvbTogLTIwcHg7CiAgb3ZlcmZsb3c6IGhpZGRlbjsKfQouQ29kZU1pcnJvci1ydWxlciB7CiAgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjY2NjOwogIHRvcDogMDsgYm90dG9tOiAwOwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKfQoKLyogREVGQVVMVCBUSEVNRSAqLwoKLmNtLXMtZGVmYXVsdCAuY20taGVhZGVyIHtjb2xvcjogYmx1ZTt9Ci5jbS1zLWRlZmF1bHQgLmNtLXF1b3RlIHtjb2xvcjogIzA5MDt9Ci5jbS1uZWdhdGl2ZSB7Y29sb3I6ICNkNDQ7fQouY20tcG9zaXRpdmUge2NvbG9yOiAjMjkyO30KLmNtLWhlYWRlciwgLmNtLXN0cm9uZyB7Zm9udC13ZWlnaHQ6IGJvbGQ7fQouY20tZW0ge2ZvbnQtc3R5bGU6IGl0YWxpYzt9Ci5jbS1saW5rIHt0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTt9Ci5jbS1zdHJpa2V0aHJvdWdoIHt0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDt9CgouY20tcy1kZWZhdWx0IC5jbS1rZXl3b3JkIHtjb2xvcjogIzcwODt9Ci5jbS1zLWRlZmF1bHQgLmNtLWF0b20ge2NvbG9yOiAjMjE5O30KLmNtLXMtZGVmYXVsdCAuY20tbnVtYmVyIHtjb2xvcjogIzE2NDt9Ci5jbS1zLWRlZmF1bHQgLmNtLWRlZiB7Y29sb3I6ICMwMGY7fQouY20tcy1kZWZhdWx0IC5jbS12YXJpYWJsZSwKLmNtLXMtZGVmYXVsdCAuY20tcHVuY3R1YXRpb24sCi5jbS1zLWRlZmF1bHQgLmNtLXByb3BlcnR5LAouY20tcy1kZWZhdWx0IC5jbS1vcGVyYXRvciB7fQouY20tcy1kZWZhdWx0IC5jbS12YXJpYWJsZS0yIHtjb2xvcjogIzA1YTt9Ci5jbS1zLWRlZmF1bHQgLmNtLXZhcmlhYmxlLTMge2NvbG9yOiAjMDg1O30KLmNtLXMtZGVmYXVsdCAuY20tY29tbWVudCB7Y29sb3I6ICNhNTA7fQouY20tcy1kZWZhdWx0IC5jbS1zdHJpbmcge2NvbG9yOiAjYTExO30KLmNtLXMtZGVmYXVsdCAuY20tc3RyaW5nLTIge2NvbG9yOiAjZjUwO30KLmNtLXMtZGVmYXVsdCAuY20tbWV0YSB7Y29sb3I6ICM1NTU7fQouY20tcy1kZWZhdWx0IC5jbS1xdWFsaWZpZXIge2NvbG9yOiAjNTU1O30KLmNtLXMtZGVmYXVsdCAuY20tYnVpbHRpbiB7Y29sb3I6ICMzMGE7fQouY20tcy1kZWZhdWx0IC5jbS1icmFja2V0IHtjb2xvcjogIzk5Nzt9Ci5jbS1zLWRlZmF1bHQgLmNtLXRhZyB7Y29sb3I6ICMxNzA7fQouY20tcy1kZWZhdWx0IC5jbS1hdHRyaWJ1dGUge2NvbG9yOiAjMDBjO30KLmNtLXMtZGVmYXVsdCAuY20taHIge2NvbG9yOiAjOTk5O30KLmNtLXMtZGVmYXVsdCAuY20tbGluayB7Y29sb3I6ICMwMGM7fQoKLmNtLXMtZGVmYXVsdCAuY20tZXJyb3Ige2NvbG9yOiAjZjAwO30KLmNtLWludmFsaWRjaGFyIHtjb2xvcjogI2YwMDt9CgouQ29kZU1pcnJvci1jb21wb3NpbmcgeyBib3JkZXItYm90dG9tOiAycHggc29saWQ7IH0KCi8qIERlZmF1bHQgc3R5bGVzIGZvciBjb21tb24gYWRkb25zICovCgpkaXYuQ29kZU1pcnJvciBzcGFuLkNvZGVNaXJyb3ItbWF0Y2hpbmdicmFja2V0IHtjb2xvcjogIzBmMDt9CmRpdi5Db2RlTWlycm9yIHNwYW4uQ29kZU1pcnJvci1ub25tYXRjaGluZ2JyYWNrZXQge2NvbG9yOiAjZjIyO30KLkNvZGVNaXJyb3ItbWF0Y2hpbmd0YWcgeyBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMTUwLCAwLCAuMyk7IH0KLkNvZGVNaXJyb3ItYWN0aXZlbGluZS1iYWNrZ3JvdW5kIHtiYWNrZ3JvdW5kOiAjZThmMmZmO30KCi8qIFNUT1AgKi8KCi8qIFRoZSByZXN0IG9mIHRoaXMgZmlsZSBjb250YWlucyBzdHlsZXMgcmVsYXRlZCB0byB0aGUgbWVjaGFuaWNzIG9mCiAgIHRoZSBlZGl0b3IuIFlvdSBwcm9iYWJseSBzaG91bGRuJ3QgdG91Y2ggdGhlbS4gKi8KCi5Db2RlTWlycm9yIHsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgb3ZlcmZsb3c6IGhpZGRlbjsKICBiYWNrZ3JvdW5kOiB3aGl0ZTsKfQoKLkNvZGVNaXJyb3Itc2Nyb2xsIHsKICBvdmVyZmxvdzogc2Nyb2xsICFpbXBvcnRhbnQ7IC8qIFRoaW5ncyB3aWxsIGJyZWFrIGlmIHRoaXMgaXMgb3ZlcnJpZGRlbiAqLwogIC8qIDMwcHggaXMgdGhlIG1hZ2ljIG1hcmdpbiB1c2VkIHRvIGhpZGUgdGhlIGVsZW1lbnQncyByZWFsIHNjcm9sbGJhcnMgKi8KICAvKiBTZWUgb3ZlcmZsb3c6IGhpZGRlbiBpbiAuQ29kZU1pcnJvciAqLwogIG1hcmdpbi1ib3R0b206IC0zMHB4OyBtYXJnaW4tcmlnaHQ6IC0zMHB4OwogIHBhZGRpbmctYm90dG9tOiAzMHB4OwogIGhlaWdodDogMTAwJTsKICBvdXRsaW5lOiBub25lOyAvKiBQcmV2ZW50IGRyYWdnaW5nIGZyb20gaGlnaGxpZ2h0aW5nIHRoZSBlbGVtZW50ICovCiAgcG9zaXRpb246IHJlbGF0aXZlOwp9Ci5Db2RlTWlycm9yLXNpemVyIHsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgYm9yZGVyLXJpZ2h0OiAzMHB4IHNvbGlkIHRyYW5zcGFyZW50Owp9CgovKiBUaGUgZmFrZSwgdmlzaWJsZSBzY3JvbGxiYXJzLiBVc2VkIHRvIGZvcmNlIHJlZHJhdyBkdXJpbmcgc2Nyb2xsaW5nCiAgIGJlZm9yZSBhY3R1YWwgc2Nyb2xsaW5nIGhhcHBlbnMsIHRodXMgcHJldmVudGluZyBzaGFraW5nIGFuZAogICBmbGlja2VyaW5nIGFydGlmYWN0cy4gKi8KLkNvZGVNaXJyb3ItdnNjcm9sbGJhciwgLkNvZGVNaXJyb3ItaHNjcm9sbGJhciwgLkNvZGVNaXJyb3Itc2Nyb2xsYmFyLWZpbGxlciwgLkNvZGVNaXJyb3ItZ3V0dGVyLWZpbGxlciB7CiAgcG9zaXRpb246IGFic29sdXRlOwogIHotaW5kZXg6IDY7CiAgZGlzcGxheTogbm9uZTsKfQouQ29kZU1pcnJvci12c2Nyb2xsYmFyIHsKICByaWdodDogMDsgdG9wOiAwOwogIG92ZXJmbG93LXg6IGhpZGRlbjsKICBvdmVyZmxvdy15OiBzY3JvbGw7Cn0KLkNvZGVNaXJyb3ItaHNjcm9sbGJhciB7CiAgYm90dG9tOiAwOyBsZWZ0OiAwOwogIG92ZXJmbG93LXk6IGhpZGRlbjsKICBvdmVyZmxvdy14OiBzY3JvbGw7Cn0KLkNvZGVNaXJyb3Itc2Nyb2xsYmFyLWZpbGxlciB7CiAgcmlnaHQ6IDA7IGJvdHRvbTogMDsKfQouQ29kZU1pcnJvci1ndXR0ZXItZmlsbGVyIHsKICBsZWZ0OiAwOyBib3R0b206IDA7Cn0KCi5Db2RlTWlycm9yLWd1dHRlcnMgewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsgbGVmdDogMDsgdG9wOiAwOwogIG1pbi1oZWlnaHQ6IDEwMCU7CiAgei1pbmRleDogMzsKfQouQ29kZU1pcnJvci1ndXR0ZXIgewogIHdoaXRlLXNwYWNlOiBub3JtYWw7CiAgaGVpZ2h0OiAxMDAlOwogIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwogIG1hcmdpbi1ib3R0b206IC0zMHB4Owp9Ci5Db2RlTWlycm9yLWd1dHRlci13cmFwcGVyIHsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgei1pbmRleDogNDsKICBiYWNrZ3JvdW5kOiBub25lICFpbXBvcnRhbnQ7CiAgYm9yZGVyOiBub25lICFpbXBvcnRhbnQ7Cn0KLkNvZGVNaXJyb3ItZ3V0dGVyLWJhY2tncm91bmQgewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB0b3A6IDA7IGJvdHRvbTogMDsKICB6LWluZGV4OiA0Owp9Ci5Db2RlTWlycm9yLWd1dHRlci1lbHQgewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICBjdXJzb3I6IGRlZmF1bHQ7CiAgei1pbmRleDogNDsKfQouQ29kZU1pcnJvci1ndXR0ZXItd3JhcHBlciB7CiAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogIHVzZXItc2VsZWN0OiBub25lOwp9CgouQ29kZU1pcnJvci1saW5lcyB7CiAgY3Vyc29yOiB0ZXh0OwogIG1pbi1oZWlnaHQ6IDFweDsgLyogcHJldmVudHMgY29sbGFwc2luZyBiZWZvcmUgZmlyc3QgZHJhdyAqLwp9Ci5Db2RlTWlycm9yIHByZSB7CiAgLyogUmVzZXQgc29tZSBzdHlsZXMgdGhhdCB0aGUgcmVzdCBvZiB0aGUgcGFnZSBtaWdodCBoYXZlIHNldCAqLwogIC1tb3otYm9yZGVyLXJhZGl1czogMDsgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiAwOyBib3JkZXItcmFkaXVzOiAwOwogIGJvcmRlci13aWR0aDogMDsKICBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsKICBmb250LWZhbWlseTogaW5oZXJpdDsKICBmb250LXNpemU6IGluaGVyaXQ7CiAgbWFyZ2luOiAwOwogIHdoaXRlLXNwYWNlOiBwcmU7CiAgd29yZC13cmFwOiBub3JtYWw7CiAgbGluZS1oZWlnaHQ6IGluaGVyaXQ7CiAgY29sb3I6IGluaGVyaXQ7CiAgei1pbmRleDogMjsKICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgb3ZlcmZsb3c6IHZpc2libGU7CiAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsKICAtd2Via2l0LWZvbnQtdmFyaWFudC1saWdhdHVyZXM6IG5vbmU7CiAgZm9udC12YXJpYW50LWxpZ2F0dXJlczogbm9uZTsKfQouQ29kZU1pcnJvci13cmFwIHByZSB7CiAgd29yZC13cmFwOiBicmVhay13b3JkOwogIHdoaXRlLXNwYWNlOiBwcmUtd3JhcDsKICB3b3JkLWJyZWFrOiBub3JtYWw7Cn0KCi5Db2RlTWlycm9yLWxpbmViYWNrZ3JvdW5kIHsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgbGVmdDogMDsgcmlnaHQ6IDA7IHRvcDogMDsgYm90dG9tOiAwOwogIHotaW5kZXg6IDA7Cn0KCi5Db2RlTWlycm9yLWxpbmV3aWRnZXQgewogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICB6LWluZGV4OiAyOwogIG92ZXJmbG93OiBhdXRvOwp9CgouQ29kZU1pcnJvci13aWRnZXQge30KCi5Db2RlTWlycm9yLWNvZGUgewogIG91dGxpbmU6IG5vbmU7Cn0KCi8qIEZvcmNlIGNvbnRlbnQtYm94IHNpemluZyBmb3IgdGhlIGVsZW1lbnRzIHdoZXJlIHdlIGV4cGVjdCBpdCAqLwouQ29kZU1pcnJvci1zY3JvbGwsCi5Db2RlTWlycm9yLXNpemVyLAouQ29kZU1pcnJvci1ndXR0ZXIsCi5Db2RlTWlycm9yLWd1dHRlcnMsCi5Db2RlTWlycm9yLWxpbmVudW1iZXIgewogIC1tb3otYm94LXNpemluZzogY29udGVudC1ib3g7CiAgYm94LXNpemluZzogY29udGVudC1ib3g7Cn0KCi5Db2RlTWlycm9yLW1lYXN1cmUgewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB3aWR0aDogMTAwJTsKICBoZWlnaHQ6IDA7CiAgb3ZlcmZsb3c6IGhpZGRlbjsKICB2aXNpYmlsaXR5OiBoaWRkZW47Cn0KCi5Db2RlTWlycm9yLWN1cnNvciB7CiAgcG9zaXRpb246IGFic29sdXRlOwogIHBvaW50ZXItZXZlbnRzOiBub25lOwp9Ci5Db2RlTWlycm9yLW1lYXN1cmUgcHJlIHsgcG9zaXRpb246IHN0YXRpYzsgfQoKZGl2LkNvZGVNaXJyb3ItY3Vyc29ycyB7CiAgdmlzaWJpbGl0eTogaGlkZGVuOwogIHBvc2l0aW9uOiByZWxhdGl2ZTsKICB6LWluZGV4OiAzOwp9CmRpdi5Db2RlTWlycm9yLWRyYWdjdXJzb3JzIHsKICB2aXNpYmlsaXR5OiB2aXNpYmxlOwp9CgouQ29kZU1pcnJvci1mb2N1c2VkIGRpdi5Db2RlTWlycm9yLWN1cnNvcnMgewogIHZpc2liaWxpdHk6IHZpc2libGU7Cn0KCi5Db2RlTWlycm9yLXNlbGVjdGVkIHsgYmFja2dyb3VuZDogI2Q5ZDlkOTsgfQouQ29kZU1pcnJvci1mb2N1c2VkIC5Db2RlTWlycm9yLXNlbGVjdGVkIHsgYmFja2dyb3VuZDogI2Q3ZDRmMDsgfQouQ29kZU1pcnJvci1jcm9zc2hhaXIgeyBjdXJzb3I6IGNyb3NzaGFpcjsgfQouQ29kZU1pcnJvci1saW5lOjpzZWxlY3Rpb24sIC5Db2RlTWlycm9yLWxpbmUgPiBzcGFuOjpzZWxlY3Rpb24sIC5Db2RlTWlycm9yLWxpbmUgPiBzcGFuID4gc3Bhbjo6c2VsZWN0aW9uIHsgYmFja2dyb3VuZDogI2Q3ZDRmMDsgfQouQ29kZU1pcnJvci1saW5lOjotbW96LXNlbGVjdGlvbiwgLkNvZGVNaXJyb3ItbGluZSA+IHNwYW46Oi1tb3otc2VsZWN0aW9uLCAuQ29kZU1pcnJvci1saW5lID4gc3BhbiA+IHNwYW46Oi1tb3otc2VsZWN0aW9uIHsgYmFja2dyb3VuZDogI2Q3ZDRmMDsgfQoKLmNtLXNlYXJjaGluZyB7CiAgYmFja2dyb3VuZDogI2ZmYTsKICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAwLCAuNCk7Cn0KCi8qIFVzZWQgdG8gZm9yY2UgYSBib3JkZXIgbW9kZWwgZm9yIGEgbm9kZSAqLwouY20tZm9yY2UtYm9yZGVyIHsgcGFkZGluZy1yaWdodDogLjFweDsgfQoKQG1lZGlhIHByaW50IHsKICAvKiBIaWRlIHRoZSBjdXJzb3Igd2hlbiBwcmludGluZyAqLwogIC5Db2RlTWlycm9yIGRpdi5Db2RlTWlycm9yLWN1cnNvcnMgewogICAgdmlzaWJpbGl0eTogaGlkZGVuOwogIH0KfQoKLyogU2VlIGlzc3VlICMyOTAxICovCi5jbS10YWItd3JhcC1oYWNrOmFmdGVyIHsgY29udGVudDogJyc7IH0KCi8qIEhlbHAgdXNlcnMgdXNlIG1hcmtzZWxlY3Rpb24gdG8gc2FmZWx5IHN0eWxlIHRleHQgYmFja2dyb3VuZCAqLwpzcGFuLkNvZGVNaXJyb3Itc2VsZWN0ZWR0ZXh0IHsgYmFja2dyb3VuZDogbm9uZTsgfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/lib/codemirror.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovLyBUaGlzIGlzIENvZGVNaXJyb3IgKGh0dHA6Ly9jb2RlbWlycm9yLm5ldCksIGEgY29kZSBlZGl0b3IKLy8gaW1wbGVtZW50ZWQgaW4gSmF2YVNjcmlwdCBvbiB0b3Agb2YgdGhlIGJyb3dzZXIncyBET00uCi8vCi8vIFlvdSBjYW4gZmluZCBzb21lIHRlY2huaWNhbCBiYWNrZ3JvdW5kIGZvciBzb21lIG9mIHRoZSBjb2RlIGJlbG93Ci8vIGF0IGh0dHA6Ly9tYXJpam5oYXZlcmJla2UubmwvYmxvZy8jY20taW50ZXJuYWxzIC4KCihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7CiAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCkgOgogIHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCA/IGRlZmluZShmYWN0b3J5KSA6CiAgKGdsb2JhbC5Db2RlTWlycm9yID0gZmFjdG9yeSgpKTsKfSh0aGlzLCAoZnVuY3Rpb24gKCkgeyAndXNlIHN0cmljdCc7CgovLyBLbHVkZ2VzIGZvciBidWdzIGFuZCBiZWhhdmlvciBkaWZmZXJlbmNlcyB0aGF0IGNhbid0IGJlIGZlYXR1cmUKLy8gZGV0ZWN0ZWQgYXJlIGVuYWJsZWQgYmFzZWQgb24gdXNlckFnZW50IGV0YyBzbmlmZmluZy4KdmFyIHVzZXJBZ2VudCA9IG5hdmlnYXRvci51c2VyQWdlbnQKdmFyIHBsYXRmb3JtID0gbmF2aWdhdG9yLnBsYXRmb3JtCgp2YXIgZ2Vja28gPSAvZ2Vja29cL1xkL2kudGVzdCh1c2VyQWdlbnQpCnZhciBpZV91cHRvMTAgPSAvTVNJRSBcZC8udGVzdCh1c2VyQWdlbnQpCnZhciBpZV8xMXVwID0gL1RyaWRlbnRcLyg/Ols3LTldfFxkezIsfSlcLi4qcnY6KFxkKykvLmV4ZWModXNlckFnZW50KQp2YXIgaWUgPSBpZV91cHRvMTAgfHwgaWVfMTF1cAp2YXIgaWVfdmVyc2lvbiA9IGllICYmIChpZV91cHRvMTAgPyBkb2N1bWVudC5kb2N1bWVudE1vZGUgfHwgNiA6IGllXzExdXBbMV0pCnZhciB3ZWJraXQgPSAvV2ViS2l0XC8vLnRlc3QodXNlckFnZW50KQp2YXIgcXR3ZWJraXQgPSB3ZWJraXQgJiYgL1F0XC9cZCtcLlxkKy8udGVzdCh1c2VyQWdlbnQpCnZhciBjaHJvbWUgPSAvQ2hyb21lXC8vLnRlc3QodXNlckFnZW50KQp2YXIgcHJlc3RvID0gL09wZXJhXC8vLnRlc3QodXNlckFnZW50KQp2YXIgc2FmYXJpID0gL0FwcGxlIENvbXB1dGVyLy50ZXN0KG5hdmlnYXRvci52ZW5kb3IpCnZhciBtYWNfZ2VNb3VudGFpbkxpb24gPSAvTWFjIE9TIFggMVxkXEQoWzgtOV18XGRcZClcRC8udGVzdCh1c2VyQWdlbnQpCnZhciBwaGFudG9tID0gL1BoYW50b21KUy8udGVzdCh1c2VyQWdlbnQpCgp2YXIgaW9zID0gL0FwcGxlV2ViS2l0Ly50ZXN0KHVzZXJBZ2VudCkgJiYgL01vYmlsZVwvXHcrLy50ZXN0KHVzZXJBZ2VudCkKLy8gVGhpcyBpcyB3b2VmdWxseSBpbmNvbXBsZXRlLiBTdWdnZXN0aW9ucyBmb3IgYWx0ZXJuYXRpdmUgbWV0aG9kcyB3ZWxjb21lLgp2YXIgbW9iaWxlID0gaW9zIHx8IC9BbmRyb2lkfHdlYk9TfEJsYWNrQmVycnl8T3BlcmEgTWluaXxPcGVyYSBNb2JpfElFTW9iaWxlL2kudGVzdCh1c2VyQWdlbnQpCnZhciBtYWMgPSBpb3MgfHwgL01hYy8udGVzdChwbGF0Zm9ybSkKdmFyIGNocm9tZU9TID0gL1xiQ3JPU1xiLy50ZXN0KHVzZXJBZ2VudCkKdmFyIHdpbmRvd3MgPSAvd2luL2kudGVzdChwbGF0Zm9ybSkKCnZhciBwcmVzdG9fdmVyc2lvbiA9IHByZXN0byAmJiB1c2VyQWdlbnQubWF0Y2goL1ZlcnNpb25cLyhcZCpcLlxkKikvKQppZiAocHJlc3RvX3ZlcnNpb24pIHsgcHJlc3RvX3ZlcnNpb24gPSBOdW1iZXIocHJlc3RvX3ZlcnNpb25bMV0pIH0KaWYgKHByZXN0b192ZXJzaW9uICYmIHByZXN0b192ZXJzaW9uID49IDE1KSB7IHByZXN0byA9IGZhbHNlOyB3ZWJraXQgPSB0cnVlIH0KLy8gU29tZSBicm93c2VycyB1c2UgdGhlIHdyb25nIGV2ZW50IHByb3BlcnRpZXMgdG8gc2lnbmFsIGNtZC9jdHJsIG9uIE9TIFgKdmFyIGZsaXBDdHJsQ21kID0gbWFjICYmIChxdHdlYmtpdCB8fCBwcmVzdG8gJiYgKHByZXN0b192ZXJzaW9uID09IG51bGwgfHwgcHJlc3RvX3ZlcnNpb24gPCAxMi4xMSkpCnZhciBjYXB0dXJlUmlnaHRDbGljayA9IGdlY2tvIHx8IChpZSAmJiBpZV92ZXJzaW9uID49IDkpCgpmdW5jdGlvbiBjbGFzc1Rlc3QoY2xzKSB7IHJldHVybiBuZXcgUmVnRXhwKCIoXnxcXHMpIiArIGNscyArICIoPzokfFxccylcXHMqIikgfQoKdmFyIHJtQ2xhc3MgPSBmdW5jdGlvbihub2RlLCBjbHMpIHsKICB2YXIgY3VycmVudCA9IG5vZGUuY2xhc3NOYW1lCiAgdmFyIG1hdGNoID0gY2xhc3NUZXN0KGNscykuZXhlYyhjdXJyZW50KQogIGlmIChtYXRjaCkgewogICAgdmFyIGFmdGVyID0gY3VycmVudC5zbGljZShtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aCkKICAgIG5vZGUuY2xhc3NOYW1lID0gY3VycmVudC5zbGljZSgwLCBtYXRjaC5pbmRleCkgKyAoYWZ0ZXIgPyBtYXRjaFsxXSArIGFmdGVyIDogIiIpCiAgfQp9CgpmdW5jdGlvbiByZW1vdmVDaGlsZHJlbihlKSB7CiAgZm9yICh2YXIgY291bnQgPSBlLmNoaWxkTm9kZXMubGVuZ3RoOyBjb3VudCA+IDA7IC0tY291bnQpCiAgICB7IGUucmVtb3ZlQ2hpbGQoZS5maXJzdENoaWxkKSB9CiAgcmV0dXJuIGUKfQoKZnVuY3Rpb24gcmVtb3ZlQ2hpbGRyZW5BbmRBZGQocGFyZW50LCBlKSB7CiAgcmV0dXJuIHJlbW92ZUNoaWxkcmVuKHBhcmVudCkuYXBwZW5kQ2hpbGQoZSkKfQoKZnVuY3Rpb24gZWx0KHRhZywgY29udGVudCwgY2xhc3NOYW1lLCBzdHlsZSkgewogIHZhciBlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWcpCiAgaWYgKGNsYXNzTmFtZSkgeyBlLmNsYXNzTmFtZSA9IGNsYXNzTmFtZSB9CiAgaWYgKHN0eWxlKSB7IGUuc3R5bGUuY3NzVGV4dCA9IHN0eWxlIH0KICBpZiAodHlwZW9mIGNvbnRlbnQgPT0gInN0cmluZyIpIHsgZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShjb250ZW50KSkgfQogIGVsc2UgaWYgKGNvbnRlbnQpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBjb250ZW50Lmxlbmd0aDsgKytpKSB7IGUuYXBwZW5kQ2hpbGQoY29udGVudFtpXSkgfSB9CiAgcmV0dXJuIGUKfQoKdmFyIHJhbmdlCmlmIChkb2N1bWVudC5jcmVhdGVSYW5nZSkgeyByYW5nZSA9IGZ1bmN0aW9uKG5vZGUsIHN0YXJ0LCBlbmQsIGVuZE5vZGUpIHsKICB2YXIgciA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCkKICByLnNldEVuZChlbmROb2RlIHx8IG5vZGUsIGVuZCkKICByLnNldFN0YXJ0KG5vZGUsIHN0YXJ0KQogIHJldHVybiByCn0gfQplbHNlIHsgcmFuZ2UgPSBmdW5jdGlvbihub2RlLCBzdGFydCwgZW5kKSB7CiAgdmFyIHIgPSBkb2N1bWVudC5ib2R5LmNyZWF0ZVRleHRSYW5nZSgpCiAgdHJ5IHsgci5tb3ZlVG9FbGVtZW50VGV4dChub2RlLnBhcmVudE5vZGUpIH0KICBjYXRjaChlKSB7IHJldHVybiByIH0KICByLmNvbGxhcHNlKHRydWUpCiAgci5tb3ZlRW5kKCJjaGFyYWN0ZXIiLCBlbmQpCiAgci5tb3ZlU3RhcnQoImNoYXJhY3RlciIsIHN0YXJ0KQogIHJldHVybiByCn0gfQoKZnVuY3Rpb24gY29udGFpbnMocGFyZW50LCBjaGlsZCkgewogIGlmIChjaGlsZC5ub2RlVHlwZSA9PSAzKSAvLyBBbmRyb2lkIGJyb3dzZXIgYWx3YXlzIHJldHVybnMgZmFsc2Ugd2hlbiBjaGlsZCBpcyBhIHRleHRub2RlCiAgICB7IGNoaWxkID0gY2hpbGQucGFyZW50Tm9kZSB9CiAgaWYgKHBhcmVudC5jb250YWlucykKICAgIHsgcmV0dXJuIHBhcmVudC5jb250YWlucyhjaGlsZCkgfQogIGRvIHsKICAgIGlmIChjaGlsZC5ub2RlVHlwZSA9PSAxMSkgeyBjaGlsZCA9IGNoaWxkLmhvc3QgfQogICAgaWYgKGNoaWxkID09IHBhcmVudCkgeyByZXR1cm4gdHJ1ZSB9CiAgfSB3aGlsZSAoY2hpbGQgPSBjaGlsZC5wYXJlbnROb2RlKQp9Cgp2YXIgYWN0aXZlRWx0ID0gZnVuY3Rpb24oKSB7CiAgdmFyIGFjdGl2ZUVsZW1lbnQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50CiAgd2hpbGUgKGFjdGl2ZUVsZW1lbnQgJiYgYWN0aXZlRWxlbWVudC5yb290ICYmIGFjdGl2ZUVsZW1lbnQucm9vdC5hY3RpdmVFbGVtZW50KQogICAgeyBhY3RpdmVFbGVtZW50ID0gYWN0aXZlRWxlbWVudC5yb290LmFjdGl2ZUVsZW1lbnQgfQogIHJldHVybiBhY3RpdmVFbGVtZW50Cn0KLy8gT2xkZXIgdmVyc2lvbnMgb2YgSUUgdGhyb3dzIHVuc3BlY2lmaWVkIGVycm9yIHdoZW4gdG91Y2hpbmcKLy8gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCBpbiBzb21lIGNhc2VzIChkdXJpbmcgbG9hZGluZywgaW4gaWZyYW1lKQppZiAoaWUgJiYgaWVfdmVyc2lvbiA8IDExKSB7IGFjdGl2ZUVsdCA9IGZ1bmN0aW9uKCkgewogIHRyeSB7IHJldHVybiBkb2N1bWVudC5hY3RpdmVFbGVtZW50IH0KICBjYXRjaChlKSB7IHJldHVybiBkb2N1bWVudC5ib2R5IH0KfSB9CgpmdW5jdGlvbiBhZGRDbGFzcyhub2RlLCBjbHMpIHsKICB2YXIgY3VycmVudCA9IG5vZGUuY2xhc3NOYW1lCiAgaWYgKCFjbGFzc1Rlc3QoY2xzKS50ZXN0KGN1cnJlbnQpKSB7IG5vZGUuY2xhc3NOYW1lICs9IChjdXJyZW50ID8gIiAiIDogIiIpICsgY2xzIH0KfQpmdW5jdGlvbiBqb2luQ2xhc3NlcyhhLCBiKSB7CiAgdmFyIGFzID0gYS5zcGxpdCgiICIpCiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcy5sZW5ndGg7IGkrKykKICAgIHsgaWYgKGFzW2ldICYmICFjbGFzc1Rlc3QoYXNbaV0pLnRlc3QoYikpIHsgYiArPSAiICIgKyBhc1tpXSB9IH0KICByZXR1cm4gYgp9Cgp2YXIgc2VsZWN0SW5wdXQgPSBmdW5jdGlvbihub2RlKSB7IG5vZGUuc2VsZWN0KCkgfQppZiAoaW9zKSAvLyBNb2JpbGUgU2FmYXJpIGFwcGFyZW50bHkgaGFzIGEgYnVnIHdoZXJlIHNlbGVjdCgpIGlzIGJyb2tlbi4KICB7IHNlbGVjdElucHV0ID0gZnVuY3Rpb24obm9kZSkgeyBub2RlLnNlbGVjdGlvblN0YXJ0ID0gMDsgbm9kZS5zZWxlY3Rpb25FbmQgPSBub2RlLnZhbHVlLmxlbmd0aCB9IH0KZWxzZSBpZiAoaWUpIC8vIFN1cHByZXNzIG15c3RlcmlvdXMgSUUxMCBlcnJvcnMKICB7IHNlbGVjdElucHV0ID0gZnVuY3Rpb24obm9kZSkgeyB0cnkgeyBub2RlLnNlbGVjdCgpIH0gY2F0Y2goX2UpIHt9IH0gfQoKZnVuY3Rpb24gYmluZChmKSB7CiAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpCiAgcmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGYuYXBwbHkobnVsbCwgYXJncyl9Cn0KCmZ1bmN0aW9uIGNvcHlPYmoob2JqLCB0YXJnZXQsIG92ZXJ3cml0ZSkgewogIGlmICghdGFyZ2V0KSB7IHRhcmdldCA9IHt9IH0KICBmb3IgKHZhciBwcm9wIGluIG9iaikKICAgIHsgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShwcm9wKSAmJiAob3ZlcndyaXRlICE9PSBmYWxzZSB8fCAhdGFyZ2V0Lmhhc093blByb3BlcnR5KHByb3ApKSkKICAgICAgeyB0YXJnZXRbcHJvcF0gPSBvYmpbcHJvcF0gfSB9CiAgcmV0dXJuIHRhcmdldAp9CgovLyBDb3VudHMgdGhlIGNvbHVtbiBvZmZzZXQgaW4gYSBzdHJpbmcsIHRha2luZyB0YWJzIGludG8gYWNjb3VudC4KLy8gVXNlZCBtb3N0bHkgdG8gZmluZCBpbmRlbnRhdGlvbi4KZnVuY3Rpb24gY291bnRDb2x1bW4oc3RyaW5nLCBlbmQsIHRhYlNpemUsIHN0YXJ0SW5kZXgsIHN0YXJ0VmFsdWUpIHsKICBpZiAoZW5kID09IG51bGwpIHsKICAgIGVuZCA9IHN0cmluZy5zZWFyY2goL1teXHNcdTAwYTBdLykKICAgIGlmIChlbmQgPT0gLTEpIHsgZW5kID0gc3RyaW5nLmxlbmd0aCB9CiAgfQogIGZvciAodmFyIGkgPSBzdGFydEluZGV4IHx8IDAsIG4gPSBzdGFydFZhbHVlIHx8IDA7OykgewogICAgdmFyIG5leHRUYWIgPSBzdHJpbmcuaW5kZXhPZigiXHQiLCBpKQogICAgaWYgKG5leHRUYWIgPCAwIHx8IG5leHRUYWIgPj0gZW5kKQogICAgICB7IHJldHVybiBuICsgKGVuZCAtIGkpIH0KICAgIG4gKz0gbmV4dFRhYiAtIGkKICAgIG4gKz0gdGFiU2l6ZSAtIChuICUgdGFiU2l6ZSkKICAgIGkgPSBuZXh0VGFiICsgMQogIH0KfQoKZnVuY3Rpb24gRGVsYXllZCgpIHt0aGlzLmlkID0gbnVsbH0KRGVsYXllZC5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24obXMsIGYpIHsKICBjbGVhclRpbWVvdXQodGhpcy5pZCkKICB0aGlzLmlkID0gc2V0VGltZW91dChmLCBtcykKfQoKZnVuY3Rpb24gaW5kZXhPZihhcnJheSwgZWx0KSB7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7ICsraSkKICAgIHsgaWYgKGFycmF5W2ldID09IGVsdCkgeyByZXR1cm4gaSB9IH0KICByZXR1cm4gLTEKfQoKLy8gTnVtYmVyIG9mIHBpeGVscyBhZGRlZCB0byBzY3JvbGxlciBhbmQgc2l6ZXIgdG8gaGlkZSBzY3JvbGxiYXIKdmFyIHNjcm9sbGVyR2FwID0gMzAKCi8vIFJldHVybmVkIG9yIHRocm93biBieSB2YXJpb3VzIHByb3RvY29scyB0byBzaWduYWwgJ0knbSBub3QKLy8gaGFuZGxpbmcgdGhpcycuCnZhciBQYXNzID0ge3RvU3RyaW5nOiBmdW5jdGlvbigpe3JldHVybiAiQ29kZU1pcnJvci5QYXNzIn19CgovLyBSZXVzZWQgb3B0aW9uIG9iamVjdHMgZm9yIHNldFNlbGVjdGlvbiAmIGZyaWVuZHMKdmFyIHNlbF9kb250U2Nyb2xsID0ge3Njcm9sbDogZmFsc2V9Owp2YXIgc2VsX21vdXNlID0ge29yaWdpbjogIiptb3VzZSJ9Owp2YXIgc2VsX21vdmUgPSB7b3JpZ2luOiAiK21vdmUifQoKLy8gVGhlIGludmVyc2Ugb2YgY291bnRDb2x1bW4gLS0gZmluZCB0aGUgb2Zmc2V0IHRoYXQgY29ycmVzcG9uZHMgdG8KLy8gYSBwYXJ0aWN1bGFyIGNvbHVtbi4KZnVuY3Rpb24gZmluZENvbHVtbihzdHJpbmcsIGdvYWwsIHRhYlNpemUpIHsKICBmb3IgKHZhciBwb3MgPSAwLCBjb2wgPSAwOzspIHsKICAgIHZhciBuZXh0VGFiID0gc3RyaW5nLmluZGV4T2YoIlx0IiwgcG9zKQogICAgaWYgKG5leHRUYWIgPT0gLTEpIHsgbmV4dFRhYiA9IHN0cmluZy5sZW5ndGggfQogICAgdmFyIHNraXBwZWQgPSBuZXh0VGFiIC0gcG9zCiAgICBpZiAobmV4dFRhYiA9PSBzdHJpbmcubGVuZ3RoIHx8IGNvbCArIHNraXBwZWQgPj0gZ29hbCkKICAgICAgeyByZXR1cm4gcG9zICsgTWF0aC5taW4oc2tpcHBlZCwgZ29hbCAtIGNvbCkgfQogICAgY29sICs9IG5leHRUYWIgLSBwb3MKICAgIGNvbCArPSB0YWJTaXplIC0gKGNvbCAlIHRhYlNpemUpCiAgICBwb3MgPSBuZXh0VGFiICsgMQogICAgaWYgKGNvbCA+PSBnb2FsKSB7IHJldHVybiBwb3MgfQogIH0KfQoKdmFyIHNwYWNlU3RycyA9IFsiIl0KZnVuY3Rpb24gc3BhY2VTdHIobikgewogIHdoaWxlIChzcGFjZVN0cnMubGVuZ3RoIDw9IG4pCiAgICB7IHNwYWNlU3Rycy5wdXNoKGxzdChzcGFjZVN0cnMpICsgIiAiKSB9CiAgcmV0dXJuIHNwYWNlU3Ryc1tuXQp9CgpmdW5jdGlvbiBsc3QoYXJyKSB7IHJldHVybiBhcnJbYXJyLmxlbmd0aC0xXSB9CgpmdW5jdGlvbiBtYXAoYXJyYXksIGYpIHsKICB2YXIgb3V0ID0gW10KICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7IG91dFtpXSA9IGYoYXJyYXlbaV0sIGkpIH0KICByZXR1cm4gb3V0Cn0KCmZ1bmN0aW9uIGluc2VydFNvcnRlZChhcnJheSwgdmFsdWUsIHNjb3JlKSB7CiAgdmFyIHBvcyA9IDAsIHByaW9yaXR5ID0gc2NvcmUodmFsdWUpCiAgd2hpbGUgKHBvcyA8IGFycmF5Lmxlbmd0aCAmJiBzY29yZShhcnJheVtwb3NdKSA8PSBwcmlvcml0eSkgeyBwb3MrKyB9CiAgYXJyYXkuc3BsaWNlKHBvcywgMCwgdmFsdWUpCn0KCmZ1bmN0aW9uIG5vdGhpbmcoKSB7fQoKZnVuY3Rpb24gY3JlYXRlT2JqKGJhc2UsIHByb3BzKSB7CiAgdmFyIGluc3QKICBpZiAoT2JqZWN0LmNyZWF0ZSkgewogICAgaW5zdCA9IE9iamVjdC5jcmVhdGUoYmFzZSkKICB9IGVsc2UgewogICAgbm90aGluZy5wcm90b3R5cGUgPSBiYXNlCiAgICBpbnN0ID0gbmV3IG5vdGhpbmcoKQogIH0KICBpZiAocHJvcHMpIHsgY29weU9iaihwcm9wcywgaW5zdCkgfQogIHJldHVybiBpbnN0Cn0KCnZhciBub25BU0NJSVNpbmdsZUNhc2VXb3JkQ2hhciA9IC9bXHUwMGRmXHUwNTg3XHUwNTkwLVx1MDVmNFx1MDYwMC1cdTA2ZmZcdTMwNDAtXHUzMDlmXHUzMGEwLVx1MzBmZlx1MzQwMC1cdTRkYjVcdTRlMDAtXHU5ZmNjXHVhYzAwLVx1ZDdhZl0vCmZ1bmN0aW9uIGlzV29yZENoYXJCYXNpYyhjaCkgewogIHJldHVybiAvXHcvLnRlc3QoY2gpIHx8IGNoID4gIlx4ODAiICYmCiAgICAoY2gudG9VcHBlckNhc2UoKSAhPSBjaC50b0xvd2VyQ2FzZSgpIHx8IG5vbkFTQ0lJU2luZ2xlQ2FzZVdvcmRDaGFyLnRlc3QoY2gpKQp9CmZ1bmN0aW9uIGlzV29yZENoYXIoY2gsIGhlbHBlcikgewogIGlmICghaGVscGVyKSB7IHJldHVybiBpc1dvcmRDaGFyQmFzaWMoY2gpIH0KICBpZiAoaGVscGVyLnNvdXJjZS5pbmRleE9mKCJcXHciKSA+IC0xICYmIGlzV29yZENoYXJCYXNpYyhjaCkpIHsgcmV0dXJuIHRydWUgfQogIHJldHVybiBoZWxwZXIudGVzdChjaCkKfQoKZnVuY3Rpb24gaXNFbXB0eShvYmopIHsKICBmb3IgKHZhciBuIGluIG9iaikgeyBpZiAob2JqLmhhc093blByb3BlcnR5KG4pICYmIG9ialtuXSkgeyByZXR1cm4gZmFsc2UgfSB9CiAgcmV0dXJuIHRydWUKfQoKLy8gRXh0ZW5kaW5nIHVuaWNvZGUgY2hhcmFjdGVycy4gQSBzZXJpZXMgb2YgYSBub24tZXh0ZW5kaW5nIGNoYXIgKwovLyBhbnkgbnVtYmVyIG9mIGV4dGVuZGluZyBjaGFycyBpcyB0cmVhdGVkIGFzIGEgc2luZ2xlIHVuaXQgYXMgZmFyCi8vIGFzIGVkaXRpbmcgYW5kIG1lYXN1cmluZyBpcyBjb25jZXJuZWQuIFRoaXMgaXMgbm90IGZ1bGx5IGNvcnJlY3QsCi8vIHNpbmNlIHNvbWUgc2NyaXB0cy9mb250cy9icm93c2VycyBhbHNvIHRyZWF0IG90aGVyIGNvbmZpZ3VyYXRpb25zCi8vIG9mIGNvZGUgcG9pbnRzIGFzIGEgZ3JvdXAuCnZhciBleHRlbmRpbmdDaGFycyA9IC9bXHUwMzAwLVx1MDM2Zlx1MDQ4My1cdTA0ODlcdTA1OTEtXHUwNWJkXHUwNWJmXHUwNWMxXHUwNWMyXHUwNWM0XHUwNWM1XHUwNWM3XHUwNjEwLVx1MDYxYVx1MDY0Yi1cdTA2NWVcdTA2NzBcdTA2ZDYtXHUwNmRjXHUwNmRlLVx1MDZlNFx1MDZlN1x1MDZlOFx1MDZlYS1cdTA2ZWRcdTA3MTFcdTA3MzAtXHUwNzRhXHUwN2E2LVx1MDdiMFx1MDdlYi1cdTA3ZjNcdTA4MTYtXHUwODE5XHUwODFiLVx1MDgyM1x1MDgyNS1cdTA4MjdcdTA4MjktXHUwODJkXHUwOTAwLVx1MDkwMlx1MDkzY1x1MDk0MS1cdTA5NDhcdTA5NGRcdTA5NTEtXHUwOTU1XHUwOTYyXHUwOTYzXHUwOTgxXHUwOWJjXHUwOWJlXHUwOWMxLVx1MDljNFx1MDljZFx1MDlkN1x1MDllMlx1MDllM1x1MGEwMVx1MGEwMlx1MGEzY1x1MGE0MVx1MGE0Mlx1MGE0N1x1MGE0OFx1MGE0Yi1cdTBhNGRcdTBhNTFcdTBhNzBcdTBhNzFcdTBhNzVcdTBhODFcdTBhODJcdTBhYmNcdTBhYzEtXHUwYWM1XHUwYWM3XHUwYWM4XHUwYWNkXHUwYWUyXHUwYWUzXHUwYjAxXHUwYjNjXHUwYjNlXHUwYjNmXHUwYjQxLVx1MGI0NFx1MGI0ZFx1MGI1Nlx1MGI1N1x1MGI2Mlx1MGI2M1x1MGI4Mlx1MGJiZVx1MGJjMFx1MGJjZFx1MGJkN1x1MGMzZS1cdTBjNDBcdTBjNDYtXHUwYzQ4XHUwYzRhLVx1MGM0ZFx1MGM1NVx1MGM1Nlx1MGM2Mlx1MGM2M1x1MGNiY1x1MGNiZlx1MGNjMlx1MGNjNlx1MGNjY1x1MGNjZFx1MGNkNVx1MGNkNlx1MGNlMlx1MGNlM1x1MGQzZVx1MGQ0MS1cdTBkNDRcdTBkNGRcdTBkNTdcdTBkNjJcdTBkNjNcdTBkY2FcdTBkY2ZcdTBkZDItXHUwZGQ0XHUwZGQ2XHUwZGRmXHUwZTMxXHUwZTM0LVx1MGUzYVx1MGU0Ny1cdTBlNGVcdTBlYjFcdTBlYjQtXHUwZWI5XHUwZWJiXHUwZWJjXHUwZWM4LVx1MGVjZFx1MGYxOFx1MGYxOVx1MGYzNVx1MGYzN1x1MGYzOVx1MGY3MS1cdTBmN2VcdTBmODAtXHUwZjg0XHUwZjg2XHUwZjg3XHUwZjkwLVx1MGY5N1x1MGY5OS1cdTBmYmNcdTBmYzZcdTEwMmQtXHUxMDMwXHUxMDMyLVx1MTAzN1x1MTAzOVx1MTAzYVx1MTAzZFx1MTAzZVx1MTA1OFx1MTA1OVx1MTA1ZS1cdTEwNjBcdTEwNzEtXHUxMDc0XHUxMDgyXHUxMDg1XHUxMDg2XHUxMDhkXHUxMDlkXHUxMzVmXHUxNzEyLVx1MTcxNFx1MTczMi1cdTE3MzRcdTE3NTJcdTE3NTNcdTE3NzJcdTE3NzNcdTE3YjctXHUxN2JkXHUxN2M2XHUxN2M5LVx1MTdkM1x1MTdkZFx1MTgwYi1cdTE4MGRcdTE4YTlcdTE5MjAtXHUxOTIyXHUxOTI3XHUxOTI4XHUxOTMyXHUxOTM5LVx1MTkzYlx1MWExN1x1MWExOFx1MWE1Nlx1MWE1OC1cdTFhNWVcdTFhNjBcdTFhNjJcdTFhNjUtXHUxYTZjXHUxYTczLVx1MWE3Y1x1MWE3Zlx1MWIwMC1cdTFiMDNcdTFiMzRcdTFiMzYtXHUxYjNhXHUxYjNjXHUxYjQyXHUxYjZiLVx1MWI3M1x1MWI4MFx1MWI4MVx1MWJhMi1cdTFiYTVcdTFiYThcdTFiYTlcdTFjMmMtXHUxYzMzXHUxYzM2XHUxYzM3XHUxY2QwLVx1MWNkMlx1MWNkNC1cdTFjZTBcdTFjZTItXHUxY2U4XHUxY2VkXHUxZGMwLVx1MWRlNlx1MWRmZC1cdTFkZmZcdTIwMGNcdTIwMGRcdTIwZDAtXHUyMGYwXHUyY2VmLVx1MmNmMVx1MmRlMC1cdTJkZmZcdTMwMmEtXHUzMDJmXHUzMDk5XHUzMDlhXHVhNjZmLVx1YTY3Mlx1YTY3Y1x1YTY3ZFx1YTZmMFx1YTZmMVx1YTgwMlx1YTgwNlx1YTgwYlx1YTgyNVx1YTgyNlx1YThjNFx1YThlMC1cdWE4ZjFcdWE5MjYtXHVhOTJkXHVhOTQ3LVx1YTk1MVx1YTk4MC1cdWE5ODJcdWE5YjNcdWE5YjYtXHVhOWI5XHVhOWJjXHVhYTI5LVx1YWEyZVx1YWEzMVx1YWEzMlx1YWEzNVx1YWEzNlx1YWE0M1x1YWE0Y1x1YWFiMFx1YWFiMi1cdWFhYjRcdWFhYjdcdWFhYjhcdWFhYmVcdWFhYmZcdWFhYzFcdWFiZTVcdWFiZThcdWFiZWRcdWRjMDAtXHVkZmZmXHVmYjFlXHVmZTAwLVx1ZmUwZlx1ZmUyMC1cdWZlMjZcdWZmOWVcdWZmOWZdLwpmdW5jdGlvbiBpc0V4dGVuZGluZ0NoYXIoY2gpIHsgcmV0dXJuIGNoLmNoYXJDb2RlQXQoMCkgPj0gNzY4ICYmIGV4dGVuZGluZ0NoYXJzLnRlc3QoY2gpIH0KCi8vIFRoZSBkaXNwbGF5IGhhbmRsZXMgdGhlIERPTSBpbnRlZ3JhdGlvbiwgYm90aCBmb3IgaW5wdXQgcmVhZGluZwovLyBhbmQgY29udGVudCBkcmF3aW5nLiBJdCBob2xkcyByZWZlcmVuY2VzIHRvIERPTSBub2RlcyBhbmQKLy8gZGlzcGxheS1yZWxhdGVkIHN0YXRlLgoKZnVuY3Rpb24gRGlzcGxheShwbGFjZSwgZG9jLCBpbnB1dCkgewogIHZhciBkID0gdGhpcwogIHRoaXMuaW5wdXQgPSBpbnB1dAoKICAvLyBDb3ZlcnMgYm90dG9tLXJpZ2h0IHNxdWFyZSB3aGVuIGJvdGggc2Nyb2xsYmFycyBhcmUgcHJlc2VudC4KICBkLnNjcm9sbGJhckZpbGxlciA9IGVsdCgiZGl2IiwgbnVsbCwgIkNvZGVNaXJyb3Itc2Nyb2xsYmFyLWZpbGxlciIpCiAgZC5zY3JvbGxiYXJGaWxsZXIuc2V0QXR0cmlidXRlKCJjbS1ub3QtY29udGVudCIsICJ0cnVlIikKICAvLyBDb3ZlcnMgYm90dG9tIG9mIGd1dHRlciB3aGVuIGNvdmVyR3V0dGVyTmV4dFRvU2Nyb2xsYmFyIGlzIG9uCiAgLy8gYW5kIGggc2Nyb2xsYmFyIGlzIHByZXNlbnQuCiAgZC5ndXR0ZXJGaWxsZXIgPSBlbHQoImRpdiIsIG51bGwsICJDb2RlTWlycm9yLWd1dHRlci1maWxsZXIiKQogIGQuZ3V0dGVyRmlsbGVyLnNldEF0dHJpYnV0ZSgiY20tbm90LWNvbnRlbnQiLCAidHJ1ZSIpCiAgLy8gV2lsbCBjb250YWluIHRoZSBhY3R1YWwgY29kZSwgcG9zaXRpb25lZCB0byBjb3ZlciB0aGUgdmlld3BvcnQuCiAgZC5saW5lRGl2ID0gZWx0KCJkaXYiLCBudWxsLCAiQ29kZU1pcnJvci1jb2RlIikKICAvLyBFbGVtZW50cyBhcmUgYWRkZWQgdG8gdGhlc2UgdG8gcmVwcmVzZW50IHNlbGVjdGlvbiBhbmQgY3Vyc29ycy4KICBkLnNlbGVjdGlvbkRpdiA9IGVsdCgiZGl2IiwgbnVsbCwgbnVsbCwgInBvc2l0aW9uOiByZWxhdGl2ZTsgei1pbmRleDogMSIpCiAgZC5jdXJzb3JEaXYgPSBlbHQoImRpdiIsIG51bGwsICJDb2RlTWlycm9yLWN1cnNvcnMiKQogIC8vIEEgdmlzaWJpbGl0eTogaGlkZGVuIGVsZW1lbnQgdXNlZCB0byBmaW5kIHRoZSBzaXplIG9mIHRoaW5ncy4KICBkLm1lYXN1cmUgPSBlbHQoImRpdiIsIG51bGwsICJDb2RlTWlycm9yLW1lYXN1cmUiKQogIC8vIFdoZW4gbGluZXMgb3V0c2lkZSBvZiB0aGUgdmlld3BvcnQgYXJlIG1lYXN1cmVkLCB0aGV5IGFyZSBkcmF3biBpbiB0aGlzLgogIGQubGluZU1lYXN1cmUgPSBlbHQoImRpdiIsIG51bGwsICJDb2RlTWlycm9yLW1lYXN1cmUiKQogIC8vIFdyYXBzIGV2ZXJ5dGhpbmcgdGhhdCBuZWVkcyB0byBleGlzdCBpbnNpZGUgdGhlIHZlcnRpY2FsbHktcGFkZGVkIGNvb3JkaW5hdGUgc3lzdGVtCiAgZC5saW5lU3BhY2UgPSBlbHQoImRpdiIsIFtkLm1lYXN1cmUsIGQubGluZU1lYXN1cmUsIGQuc2VsZWN0aW9uRGl2LCBkLmN1cnNvckRpdiwgZC5saW5lRGl2XSwKICAgICAgICAgICAgICAgICAgICBudWxsLCAicG9zaXRpb246IHJlbGF0aXZlOyBvdXRsaW5lOiBub25lIikKICAvLyBNb3ZlZCBhcm91bmQgaXRzIHBhcmVudCB0byBjb3ZlciB2aXNpYmxlIHZpZXcuCiAgZC5tb3ZlciA9IGVsdCgiZGl2IiwgW2VsdCgiZGl2IiwgW2QubGluZVNwYWNlXSwgIkNvZGVNaXJyb3ItbGluZXMiKV0sIG51bGwsICJwb3NpdGlvbjogcmVsYXRpdmUiKQogIC8vIFNldCB0byB0aGUgaGVpZ2h0IG9mIHRoZSBkb2N1bWVudCwgYWxsb3dpbmcgc2Nyb2xsaW5nLgogIGQuc2l6ZXIgPSBlbHQoImRpdiIsIFtkLm1vdmVyXSwgIkNvZGVNaXJyb3Itc2l6ZXIiKQogIGQuc2l6ZXJXaWR0aCA9IG51bGwKICAvLyBCZWhhdmlvciBvZiBlbHRzIHdpdGggb3ZlcmZsb3c6IGF1dG8gYW5kIHBhZGRpbmcgaXMKICAvLyBpbmNvbnNpc3RlbnQgYWNyb3NzIGJyb3dzZXJzLiBUaGlzIGlzIHVzZWQgdG8gZW5zdXJlIHRoZQogIC8vIHNjcm9sbGFibGUgYXJlYSBpcyBiaWcgZW5vdWdoLgogIGQuaGVpZ2h0Rm9yY2VyID0gZWx0KCJkaXYiLCBudWxsLCBudWxsLCAicG9zaXRpb246IGFic29sdXRlOyBoZWlnaHQ6ICIgKyBzY3JvbGxlckdhcCArICJweDsgd2lkdGg6IDFweDsiKQogIC8vIFdpbGwgY29udGFpbiB0aGUgZ3V0dGVycywgaWYgYW55LgogIGQuZ3V0dGVycyA9IGVsdCgiZGl2IiwgbnVsbCwgIkNvZGVNaXJyb3ItZ3V0dGVycyIpCiAgZC5saW5lR3V0dGVyID0gbnVsbAogIC8vIEFjdHVhbCBzY3JvbGxhYmxlIGVsZW1lbnQuCiAgZC5zY3JvbGxlciA9IGVsdCgiZGl2IiwgW2Quc2l6ZXIsIGQuaGVpZ2h0Rm9yY2VyLCBkLmd1dHRlcnNdLCAiQ29kZU1pcnJvci1zY3JvbGwiKQogIGQuc2Nyb2xsZXIuc2V0QXR0cmlidXRlKCJ0YWJJbmRleCIsICItMSIpCiAgLy8gVGhlIGVsZW1lbnQgaW4gd2hpY2ggdGhlIGVkaXRvciBsaXZlcy4KICBkLndyYXBwZXIgPSBlbHQoImRpdiIsIFtkLnNjcm9sbGJhckZpbGxlciwgZC5ndXR0ZXJGaWxsZXIsIGQuc2Nyb2xsZXJdLCAiQ29kZU1pcnJvciIpCgogIC8vIFdvcmsgYXJvdW5kIElFNyB6LWluZGV4IGJ1ZyAobm90IHBlcmZlY3QsIGhlbmNlIElFNyBub3QgcmVhbGx5IGJlaW5nIHN1cHBvcnRlZCkKICBpZiAoaWUgJiYgaWVfdmVyc2lvbiA8IDgpIHsgZC5ndXR0ZXJzLnN0eWxlLnpJbmRleCA9IC0xOyBkLnNjcm9sbGVyLnN0eWxlLnBhZGRpbmdSaWdodCA9IDAgfQogIGlmICghd2Via2l0ICYmICEoZ2Vja28gJiYgbW9iaWxlKSkgeyBkLnNjcm9sbGVyLmRyYWdnYWJsZSA9IHRydWUgfQoKICBpZiAocGxhY2UpIHsKICAgIGlmIChwbGFjZS5hcHBlbmRDaGlsZCkgeyBwbGFjZS5hcHBlbmRDaGlsZChkLndyYXBwZXIpIH0KICAgIGVsc2UgeyBwbGFjZShkLndyYXBwZXIpIH0KICB9CgogIC8vIEN1cnJlbnQgcmVuZGVyZWQgcmFuZ2UgKG1heSBiZSBiaWdnZXIgdGhhbiB0aGUgdmlldyB3aW5kb3cpLgogIGQudmlld0Zyb20gPSBkLnZpZXdUbyA9IGRvYy5maXJzdAogIGQucmVwb3J0ZWRWaWV3RnJvbSA9IGQucmVwb3J0ZWRWaWV3VG8gPSBkb2MuZmlyc3QKICAvLyBJbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVuZGVyZWQgbGluZXMuCiAgZC52aWV3ID0gW10KICBkLnJlbmRlcmVkVmlldyA9IG51bGwKICAvLyBIb2xkcyBpbmZvIGFib3V0IGEgc2luZ2xlIHJlbmRlcmVkIGxpbmUgd2hlbiBpdCB3YXMgcmVuZGVyZWQKICAvLyBmb3IgbWVhc3VyZW1lbnQsIHdoaWxlIG5vdCBpbiB2aWV3LgogIGQuZXh0ZXJuYWxNZWFzdXJlZCA9IG51bGwKICAvLyBFbXB0eSBzcGFjZSAoaW4gcGl4ZWxzKSBhYm92ZSB0aGUgdmlldwogIGQudmlld09mZnNldCA9IDAKICBkLmxhc3RXcmFwSGVpZ2h0ID0gZC5sYXN0V3JhcFdpZHRoID0gMAogIGQudXBkYXRlTGluZU51bWJlcnMgPSBudWxsCgogIGQubmF0aXZlQmFyV2lkdGggPSBkLmJhckhlaWdodCA9IGQuYmFyV2lkdGggPSAwCiAgZC5zY3JvbGxiYXJzQ2xpcHBlZCA9IGZhbHNlCgogIC8vIFVzZWQgdG8gb25seSByZXNpemUgdGhlIGxpbmUgbnVtYmVyIGd1dHRlciB3aGVuIG5lY2Vzc2FyeSAod2hlbgogIC8vIHRoZSBhbW91bnQgb2YgbGluZXMgY3Jvc3NlcyBhIGJvdW5kYXJ5IHRoYXQgbWFrZXMgaXRzIHdpZHRoIGNoYW5nZSkKICBkLmxpbmVOdW1XaWR0aCA9IGQubGluZU51bUlubmVyV2lkdGggPSBkLmxpbmVOdW1DaGFycyA9IG51bGwKICAvLyBTZXQgdG8gdHJ1ZSB3aGVuIGEgbm9uLWhvcml6b250YWwtc2Nyb2xsaW5nIGxpbmUgd2lkZ2V0IGlzCiAgLy8gYWRkZWQuIEFzIGFuIG9wdGltaXphdGlvbiwgbGluZSB3aWRnZXQgYWxpZ25pbmcgaXMgc2tpcHBlZCB3aGVuCiAgLy8gdGhpcyBpcyBmYWxzZS4KICBkLmFsaWduV2lkZ2V0cyA9IGZhbHNlCgogIGQuY2FjaGVkQ2hhcldpZHRoID0gZC5jYWNoZWRUZXh0SGVpZ2h0ID0gZC5jYWNoZWRQYWRkaW5nSCA9IG51bGwKCiAgLy8gVHJhY2tzIHRoZSBtYXhpbXVtIGxpbmUgbGVuZ3RoIHNvIHRoYXQgdGhlIGhvcml6b250YWwgc2Nyb2xsYmFyCiAgLy8gY2FuIGJlIGtlcHQgc3RhdGljIHdoZW4gc2Nyb2xsaW5nLgogIGQubWF4TGluZSA9IG51bGwKICBkLm1heExpbmVMZW5ndGggPSAwCiAgZC5tYXhMaW5lQ2hhbmdlZCA9IGZhbHNlCgogIC8vIFVzZWQgZm9yIG1lYXN1cmluZyB3aGVlbCBzY3JvbGxpbmcgZ3JhbnVsYXJpdHkKICBkLndoZWVsRFggPSBkLndoZWVsRFkgPSBkLndoZWVsU3RhcnRYID0gZC53aGVlbFN0YXJ0WSA9IG51bGwKCiAgLy8gVHJ1ZSB3aGVuIHNoaWZ0IGlzIGhlbGQgZG93bi4KICBkLnNoaWZ0ID0gZmFsc2UKCiAgLy8gVXNlZCB0byB0cmFjayB3aGV0aGVyIGFueXRoaW5nIGhhcHBlbmVkIHNpbmNlIHRoZSBjb250ZXh0IG1lbnUKICAvLyB3YXMgb3BlbmVkLgogIGQuc2VsRm9yQ29udGV4dE1lbnUgPSBudWxsCgogIGQuYWN0aXZlVG91Y2ggPSBudWxsCgogIGlucHV0LmluaXQoZCkKfQoKLy8gRmluZCB0aGUgbGluZSBvYmplY3QgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gbGluZSBudW1iZXIuCmZ1bmN0aW9uIGdldExpbmUoZG9jLCBuKSB7CiAgbiAtPSBkb2MuZmlyc3QKICBpZiAobiA8IDAgfHwgbiA+PSBkb2Muc2l6ZSkgeyB0aHJvdyBuZXcgRXJyb3IoIlRoZXJlIGlzIG5vIGxpbmUgIiArIChuICsgZG9jLmZpcnN0KSArICIgaW4gdGhlIGRvY3VtZW50LiIpIH0KICB2YXIgY2h1bmsgPSBkb2MKICB3aGlsZSAoIWNodW5rLmxpbmVzKSB7CiAgICBmb3IgKHZhciBpID0gMDs7ICsraSkgewogICAgICB2YXIgY2hpbGQgPSBjaHVuay5jaGlsZHJlbltpXSwgc3ogPSBjaGlsZC5jaHVua1NpemUoKQogICAgICBpZiAobiA8IHN6KSB7IGNodW5rID0gY2hpbGQ7IGJyZWFrIH0KICAgICAgbiAtPSBzegogICAgfQogIH0KICByZXR1cm4gY2h1bmsubGluZXNbbl0KfQoKLy8gR2V0IHRoZSBwYXJ0IG9mIGEgZG9jdW1lbnQgYmV0d2VlbiB0d28gcG9zaXRpb25zLCBhcyBhbiBhcnJheSBvZgovLyBzdHJpbmdzLgpmdW5jdGlvbiBnZXRCZXR3ZWVuKGRvYywgc3RhcnQsIGVuZCkgewogIHZhciBvdXQgPSBbXSwgbiA9IHN0YXJ0LmxpbmUKICBkb2MuaXRlcihzdGFydC5saW5lLCBlbmQubGluZSArIDEsIGZ1bmN0aW9uIChsaW5lKSB7CiAgICB2YXIgdGV4dCA9IGxpbmUudGV4dAogICAgaWYgKG4gPT0gZW5kLmxpbmUpIHsgdGV4dCA9IHRleHQuc2xpY2UoMCwgZW5kLmNoKSB9CiAgICBpZiAobiA9PSBzdGFydC5saW5lKSB7IHRleHQgPSB0ZXh0LnNsaWNlKHN0YXJ0LmNoKSB9CiAgICBvdXQucHVzaCh0ZXh0KQogICAgKytuCiAgfSkKICByZXR1cm4gb3V0Cn0KLy8gR2V0IHRoZSBsaW5lcyBiZXR3ZWVuIGZyb20gYW5kIHRvLCBhcyBhcnJheSBvZiBzdHJpbmdzLgpmdW5jdGlvbiBnZXRMaW5lcyhkb2MsIGZyb20sIHRvKSB7CiAgdmFyIG91dCA9IFtdCiAgZG9jLml0ZXIoZnJvbSwgdG8sIGZ1bmN0aW9uIChsaW5lKSB7IG91dC5wdXNoKGxpbmUudGV4dCkgfSkgLy8gaXRlciBhYm9ydHMgd2hlbiBjYWxsYmFjayByZXR1cm5zIHRydXRoeSB2YWx1ZQogIHJldHVybiBvdXQKfQoKLy8gVXBkYXRlIHRoZSBoZWlnaHQgb2YgYSBsaW5lLCBwcm9wYWdhdGluZyB0aGUgaGVpZ2h0IGNoYW5nZQovLyB1cHdhcmRzIHRvIHBhcmVudCBub2Rlcy4KZnVuY3Rpb24gdXBkYXRlTGluZUhlaWdodChsaW5lLCBoZWlnaHQpIHsKICB2YXIgZGlmZiA9IGhlaWdodCAtIGxpbmUuaGVpZ2h0CiAgaWYgKGRpZmYpIHsgZm9yICh2YXIgbiA9IGxpbmU7IG47IG4gPSBuLnBhcmVudCkgeyBuLmhlaWdodCArPSBkaWZmIH0gfQp9CgovLyBHaXZlbiBhIGxpbmUgb2JqZWN0LCBmaW5kIGl0cyBsaW5lIG51bWJlciBieSB3YWxraW5nIHVwIHRocm91Z2gKLy8gaXRzIHBhcmVudCBsaW5rcy4KZnVuY3Rpb24gbGluZU5vKGxpbmUpIHsKICBpZiAobGluZS5wYXJlbnQgPT0gbnVsbCkgeyByZXR1cm4gbnVsbCB9CiAgdmFyIGN1ciA9IGxpbmUucGFyZW50LCBubyA9IGluZGV4T2YoY3VyLmxpbmVzLCBsaW5lKQogIGZvciAodmFyIGNodW5rID0gY3VyLnBhcmVudDsgY2h1bms7IGN1ciA9IGNodW5rLCBjaHVuayA9IGNodW5rLnBhcmVudCkgewogICAgZm9yICh2YXIgaSA9IDA7OyArK2kpIHsKICAgICAgaWYgKGNodW5rLmNoaWxkcmVuW2ldID09IGN1cikgeyBicmVhayB9CiAgICAgIG5vICs9IGNodW5rLmNoaWxkcmVuW2ldLmNodW5rU2l6ZSgpCiAgICB9CiAgfQogIHJldHVybiBubyArIGN1ci5maXJzdAp9CgovLyBGaW5kIHRoZSBsaW5lIGF0IHRoZSBnaXZlbiB2ZXJ0aWNhbCBwb3NpdGlvbiwgdXNpbmcgdGhlIGhlaWdodAovLyBpbmZvcm1hdGlvbiBpbiB0aGUgZG9jdW1lbnQgdHJlZS4KZnVuY3Rpb24gbGluZUF0SGVpZ2h0KGNodW5rLCBoKSB7CiAgdmFyIG4gPSBjaHVuay5maXJzdAogIG91dGVyOiBkbyB7CiAgICBmb3IgKHZhciBpJDEgPSAwOyBpJDEgPCBjaHVuay5jaGlsZHJlbi5sZW5ndGg7ICsraSQxKSB7CiAgICAgIHZhciBjaGlsZCA9IGNodW5rLmNoaWxkcmVuW2kkMV0sIGNoID0gY2hpbGQuaGVpZ2h0CiAgICAgIGlmIChoIDwgY2gpIHsgY2h1bmsgPSBjaGlsZDsgY29udGludWUgb3V0ZXIgfQogICAgICBoIC09IGNoCiAgICAgIG4gKz0gY2hpbGQuY2h1bmtTaXplKCkKICAgIH0KICAgIHJldHVybiBuCiAgfSB3aGlsZSAoIWNodW5rLmxpbmVzKQogIHZhciBpID0gMAogIGZvciAoOyBpIDwgY2h1bmsubGluZXMubGVuZ3RoOyArK2kpIHsKICAgIHZhciBsaW5lID0gY2h1bmsubGluZXNbaV0sIGxoID0gbGluZS5oZWlnaHQKICAgIGlmIChoIDwgbGgpIHsgYnJlYWsgfQogICAgaCAtPSBsaAogIH0KICByZXR1cm4gbiArIGkKfQoKZnVuY3Rpb24gaXNMaW5lKGRvYywgbCkge3JldHVybiBsID49IGRvYy5maXJzdCAmJiBsIDwgZG9jLmZpcnN0ICsgZG9jLnNpemV9CgpmdW5jdGlvbiBsaW5lTnVtYmVyRm9yKG9wdGlvbnMsIGkpIHsKICByZXR1cm4gU3RyaW5nKG9wdGlvbnMubGluZU51bWJlckZvcm1hdHRlcihpICsgb3B0aW9ucy5maXJzdExpbmVOdW1iZXIpKQp9CgovLyBBIFBvcyBpbnN0YW5jZSByZXByZXNlbnRzIGEgcG9zaXRpb24gd2l0aGluIHRoZSB0ZXh0LgpmdW5jdGlvbiBQb3MgKGxpbmUsIGNoKSB7CiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFBvcykpIHsgcmV0dXJuIG5ldyBQb3MobGluZSwgY2gpIH0KICB0aGlzLmxpbmUgPSBsaW5lOyB0aGlzLmNoID0gY2gKfQoKLy8gQ29tcGFyZSB0d28gcG9zaXRpb25zLCByZXR1cm4gMCBpZiB0aGV5IGFyZSB0aGUgc2FtZSwgYSBuZWdhdGl2ZQovLyBudW1iZXIgd2hlbiBhIGlzIGxlc3MsIGFuZCBhIHBvc2l0aXZlIG51bWJlciBvdGhlcndpc2UuCmZ1bmN0aW9uIGNtcChhLCBiKSB7IHJldHVybiBhLmxpbmUgLSBiLmxpbmUgfHwgYS5jaCAtIGIuY2ggfQoKZnVuY3Rpb24gY29weVBvcyh4KSB7cmV0dXJuIFBvcyh4LmxpbmUsIHguY2gpfQpmdW5jdGlvbiBtYXhQb3MoYSwgYikgeyByZXR1cm4gY21wKGEsIGIpIDwgMCA/IGIgOiBhIH0KZnVuY3Rpb24gbWluUG9zKGEsIGIpIHsgcmV0dXJuIGNtcChhLCBiKSA8IDAgPyBhIDogYiB9CgovLyBNb3N0IG9mIHRoZSBleHRlcm5hbCBBUEkgY2xpcHMgZ2l2ZW4gcG9zaXRpb25zIHRvIG1ha2Ugc3VyZSB0aGV5Ci8vIGFjdHVhbGx5IGV4aXN0IHdpdGhpbiB0aGUgZG9jdW1lbnQuCmZ1bmN0aW9uIGNsaXBMaW5lKGRvYywgbikge3JldHVybiBNYXRoLm1heChkb2MuZmlyc3QsIE1hdGgubWluKG4sIGRvYy5maXJzdCArIGRvYy5zaXplIC0gMSkpfQpmdW5jdGlvbiBjbGlwUG9zKGRvYywgcG9zKSB7CiAgaWYgKHBvcy5saW5lIDwgZG9jLmZpcnN0KSB7IHJldHVybiBQb3MoZG9jLmZpcnN0LCAwKSB9CiAgdmFyIGxhc3QgPSBkb2MuZmlyc3QgKyBkb2Muc2l6ZSAtIDEKICBpZiAocG9zLmxpbmUgPiBsYXN0KSB7IHJldHVybiBQb3MobGFzdCwgZ2V0TGluZShkb2MsIGxhc3QpLnRleHQubGVuZ3RoKSB9CiAgcmV0dXJuIGNsaXBUb0xlbihwb3MsIGdldExpbmUoZG9jLCBwb3MubGluZSkudGV4dC5sZW5ndGgpCn0KZnVuY3Rpb24gY2xpcFRvTGVuKHBvcywgbGluZWxlbikgewogIHZhciBjaCA9IHBvcy5jaAogIGlmIChjaCA9PSBudWxsIHx8IGNoID4gbGluZWxlbikgeyByZXR1cm4gUG9zKHBvcy5saW5lLCBsaW5lbGVuKSB9CiAgZWxzZSBpZiAoY2ggPCAwKSB7IHJldHVybiBQb3MocG9zLmxpbmUsIDApIH0KICBlbHNlIHsgcmV0dXJuIHBvcyB9Cn0KZnVuY3Rpb24gY2xpcFBvc0FycmF5KGRvYywgYXJyYXkpIHsKICB2YXIgb3V0ID0gW10KICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgaSsrKSB7IG91dFtpXSA9IGNsaXBQb3MoZG9jLCBhcnJheVtpXSkgfQogIHJldHVybiBvdXQKfQoKLy8gT3B0aW1pemUgc29tZSBjb2RlIHdoZW4gdGhlc2UgZmVhdHVyZXMgYXJlIG5vdCB1c2VkLgp2YXIgc2F3UmVhZE9ubHlTcGFucyA9IGZhbHNlOwp2YXIgc2F3Q29sbGFwc2VkU3BhbnMgPSBmYWxzZQoKZnVuY3Rpb24gc2VlUmVhZE9ubHlTcGFucygpIHsKICBzYXdSZWFkT25seVNwYW5zID0gdHJ1ZQp9CgpmdW5jdGlvbiBzZWVDb2xsYXBzZWRTcGFucygpIHsKICBzYXdDb2xsYXBzZWRTcGFucyA9IHRydWUKfQoKLy8gVEVYVE1BUktFUiBTUEFOUwoKZnVuY3Rpb24gTWFya2VkU3BhbihtYXJrZXIsIGZyb20sIHRvKSB7CiAgdGhpcy5tYXJrZXIgPSBtYXJrZXIKICB0aGlzLmZyb20gPSBmcm9tOyB0aGlzLnRvID0gdG8KfQoKLy8gU2VhcmNoIGFuIGFycmF5IG9mIHNwYW5zIGZvciBhIHNwYW4gbWF0Y2hpbmcgdGhlIGdpdmVuIG1hcmtlci4KZnVuY3Rpb24gZ2V0TWFya2VkU3BhbkZvcihzcGFucywgbWFya2VyKSB7CiAgaWYgKHNwYW5zKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgc3BhbnMubGVuZ3RoOyArK2kpIHsKICAgIHZhciBzcGFuID0gc3BhbnNbaV0KICAgIGlmIChzcGFuLm1hcmtlciA9PSBtYXJrZXIpIHsgcmV0dXJuIHNwYW4gfQogIH0gfQp9Ci8vIFJlbW92ZSBhIHNwYW4gZnJvbSBhbiBhcnJheSwgcmV0dXJuaW5nIHVuZGVmaW5lZCBpZiBubyBzcGFucyBhcmUKLy8gbGVmdCAod2UgZG9uJ3Qgc3RvcmUgYXJyYXlzIGZvciBsaW5lcyB3aXRob3V0IHNwYW5zKS4KZnVuY3Rpb24gcmVtb3ZlTWFya2VkU3BhbihzcGFucywgc3BhbikgewogIHZhciByCiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzcGFucy5sZW5ndGg7ICsraSkKICAgIHsgaWYgKHNwYW5zW2ldICE9IHNwYW4pIHsgKHIgfHwgKHIgPSBbXSkpLnB1c2goc3BhbnNbaV0pIH0gfQogIHJldHVybiByCn0KLy8gQWRkIGEgc3BhbiB0byBhIGxpbmUuCmZ1bmN0aW9uIGFkZE1hcmtlZFNwYW4obGluZSwgc3BhbikgewogIGxpbmUubWFya2VkU3BhbnMgPSBsaW5lLm1hcmtlZFNwYW5zID8gbGluZS5tYXJrZWRTcGFucy5jb25jYXQoW3NwYW5dKSA6IFtzcGFuXQogIHNwYW4ubWFya2VyLmF0dGFjaExpbmUobGluZSkKfQoKLy8gVXNlZCBmb3IgdGhlIGFsZ29yaXRobSB0aGF0IGFkanVzdHMgbWFya2VycyBmb3IgYSBjaGFuZ2UgaW4gdGhlCi8vIGRvY3VtZW50LiBUaGVzZSBmdW5jdGlvbnMgY3V0IGFuIGFycmF5IG9mIHNwYW5zIGF0IGEgZ2l2ZW4KLy8gY2hhcmFjdGVyIHBvc2l0aW9uLCByZXR1cm5pbmcgYW4gYXJyYXkgb2YgcmVtYWluaW5nIGNodW5rcyAob3IKLy8gdW5kZWZpbmVkIGlmIG5vdGhpbmcgcmVtYWlucykuCmZ1bmN0aW9uIG1hcmtlZFNwYW5zQmVmb3JlKG9sZCwgc3RhcnRDaCwgaXNJbnNlcnQpIHsKICB2YXIgbncKICBpZiAob2xkKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgb2xkLmxlbmd0aDsgKytpKSB7CiAgICB2YXIgc3BhbiA9IG9sZFtpXSwgbWFya2VyID0gc3Bhbi5tYXJrZXIKICAgIHZhciBzdGFydHNCZWZvcmUgPSBzcGFuLmZyb20gPT0gbnVsbCB8fCAobWFya2VyLmluY2x1c2l2ZUxlZnQgPyBzcGFuLmZyb20gPD0gc3RhcnRDaCA6IHNwYW4uZnJvbSA8IHN0YXJ0Q2gpCiAgICBpZiAoc3RhcnRzQmVmb3JlIHx8IHNwYW4uZnJvbSA9PSBzdGFydENoICYmIG1hcmtlci50eXBlID09ICJib29rbWFyayIgJiYgKCFpc0luc2VydCB8fCAhc3Bhbi5tYXJrZXIuaW5zZXJ0TGVmdCkpIHsKICAgICAgdmFyIGVuZHNBZnRlciA9IHNwYW4udG8gPT0gbnVsbCB8fCAobWFya2VyLmluY2x1c2l2ZVJpZ2h0ID8gc3Bhbi50byA+PSBzdGFydENoIDogc3Bhbi50byA+IHN0YXJ0Q2gpOyhudyB8fCAobncgPSBbXSkpLnB1c2gobmV3IE1hcmtlZFNwYW4obWFya2VyLCBzcGFuLmZyb20sIGVuZHNBZnRlciA/IG51bGwgOiBzcGFuLnRvKSkKICAgIH0KICB9IH0KICByZXR1cm4gbncKfQpmdW5jdGlvbiBtYXJrZWRTcGFuc0FmdGVyKG9sZCwgZW5kQ2gsIGlzSW5zZXJ0KSB7CiAgdmFyIG53CiAgaWYgKG9sZCkgeyBmb3IgKHZhciBpID0gMDsgaSA8IG9sZC5sZW5ndGg7ICsraSkgewogICAgdmFyIHNwYW4gPSBvbGRbaV0sIG1hcmtlciA9IHNwYW4ubWFya2VyCiAgICB2YXIgZW5kc0FmdGVyID0gc3Bhbi50byA9PSBudWxsIHx8IChtYXJrZXIuaW5jbHVzaXZlUmlnaHQgPyBzcGFuLnRvID49IGVuZENoIDogc3Bhbi50byA+IGVuZENoKQogICAgaWYgKGVuZHNBZnRlciB8fCBzcGFuLmZyb20gPT0gZW5kQ2ggJiYgbWFya2VyLnR5cGUgPT0gImJvb2ttYXJrIiAmJiAoIWlzSW5zZXJ0IHx8IHNwYW4ubWFya2VyLmluc2VydExlZnQpKSB7CiAgICAgIHZhciBzdGFydHNCZWZvcmUgPSBzcGFuLmZyb20gPT0gbnVsbCB8fCAobWFya2VyLmluY2x1c2l2ZUxlZnQgPyBzcGFuLmZyb20gPD0gZW5kQ2ggOiBzcGFuLmZyb20gPCBlbmRDaCk7KG53IHx8IChudyA9IFtdKSkucHVzaChuZXcgTWFya2VkU3BhbihtYXJrZXIsIHN0YXJ0c0JlZm9yZSA/IG51bGwgOiBzcGFuLmZyb20gLSBlbmRDaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFuLnRvID09IG51bGwgPyBudWxsIDogc3Bhbi50byAtIGVuZENoKSkKICAgIH0KICB9IH0KICByZXR1cm4gbncKfQoKLy8gR2l2ZW4gYSBjaGFuZ2Ugb2JqZWN0LCBjb21wdXRlIHRoZSBuZXcgc2V0IG9mIG1hcmtlciBzcGFucyB0aGF0Ci8vIGNvdmVyIHRoZSBsaW5lIGluIHdoaWNoIHRoZSBjaGFuZ2UgdG9vayBwbGFjZS4gUmVtb3ZlcyBzcGFucwovLyBlbnRpcmVseSB3aXRoaW4gdGhlIGNoYW5nZSwgcmVjb25uZWN0cyBzcGFucyBiZWxvbmdpbmcgdG8gdGhlCi8vIHNhbWUgbWFya2VyIHRoYXQgYXBwZWFyIG9uIGJvdGggc2lkZXMgb2YgdGhlIGNoYW5nZSwgYW5kIGN1dHMgb2ZmCi8vIHNwYW5zIHBhcnRpYWxseSB3aXRoaW4gdGhlIGNoYW5nZS4gUmV0dXJucyBhbiBhcnJheSBvZiBzcGFuCi8vIGFycmF5cyB3aXRoIG9uZSBlbGVtZW50IGZvciBlYWNoIGxpbmUgaW4gKGFmdGVyKSB0aGUgY2hhbmdlLgpmdW5jdGlvbiBzdHJldGNoU3BhbnNPdmVyQ2hhbmdlKGRvYywgY2hhbmdlKSB7CiAgaWYgKGNoYW5nZS5mdWxsKSB7IHJldHVybiBudWxsIH0KICB2YXIgb2xkRmlyc3QgPSBpc0xpbmUoZG9jLCBjaGFuZ2UuZnJvbS5saW5lKSAmJiBnZXRMaW5lKGRvYywgY2hhbmdlLmZyb20ubGluZSkubWFya2VkU3BhbnMKICB2YXIgb2xkTGFzdCA9IGlzTGluZShkb2MsIGNoYW5nZS50by5saW5lKSAmJiBnZXRMaW5lKGRvYywgY2hhbmdlLnRvLmxpbmUpLm1hcmtlZFNwYW5zCiAgaWYgKCFvbGRGaXJzdCAmJiAhb2xkTGFzdCkgeyByZXR1cm4gbnVsbCB9CgogIHZhciBzdGFydENoID0gY2hhbmdlLmZyb20uY2gsIGVuZENoID0gY2hhbmdlLnRvLmNoLCBpc0luc2VydCA9IGNtcChjaGFuZ2UuZnJvbSwgY2hhbmdlLnRvKSA9PSAwCiAgLy8gR2V0IHRoZSBzcGFucyB0aGF0ICdzdGljayBvdXQnIG9uIGJvdGggc2lkZXMKICB2YXIgZmlyc3QgPSBtYXJrZWRTcGFuc0JlZm9yZShvbGRGaXJzdCwgc3RhcnRDaCwgaXNJbnNlcnQpCiAgdmFyIGxhc3QgPSBtYXJrZWRTcGFuc0FmdGVyKG9sZExhc3QsIGVuZENoLCBpc0luc2VydCkKCiAgLy8gTmV4dCwgbWVyZ2UgdGhvc2UgdHdvIGVuZHMKICB2YXIgc2FtZUxpbmUgPSBjaGFuZ2UudGV4dC5sZW5ndGggPT0gMSwgb2Zmc2V0ID0gbHN0KGNoYW5nZS50ZXh0KS5sZW5ndGggKyAoc2FtZUxpbmUgPyBzdGFydENoIDogMCkKICBpZiAoZmlyc3QpIHsKICAgIC8vIEZpeCB1cCAudG8gcHJvcGVydGllcyBvZiBmaXJzdAogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmaXJzdC5sZW5ndGg7ICsraSkgewogICAgICB2YXIgc3BhbiA9IGZpcnN0W2ldCiAgICAgIGlmIChzcGFuLnRvID09IG51bGwpIHsKICAgICAgICB2YXIgZm91bmQgPSBnZXRNYXJrZWRTcGFuRm9yKGxhc3QsIHNwYW4ubWFya2VyKQogICAgICAgIGlmICghZm91bmQpIHsgc3Bhbi50byA9IHN0YXJ0Q2ggfQogICAgICAgIGVsc2UgaWYgKHNhbWVMaW5lKSB7IHNwYW4udG8gPSBmb3VuZC50byA9PSBudWxsID8gbnVsbCA6IGZvdW5kLnRvICsgb2Zmc2V0IH0KICAgICAgfQogICAgfQogIH0KICBpZiAobGFzdCkgewogICAgLy8gRml4IHVwIC5mcm9tIGluIGxhc3QgKG9yIG1vdmUgdGhlbSBpbnRvIGZpcnN0IGluIGNhc2Ugb2Ygc2FtZUxpbmUpCiAgICBmb3IgKHZhciBpJDEgPSAwOyBpJDEgPCBsYXN0Lmxlbmd0aDsgKytpJDEpIHsKICAgICAgdmFyIHNwYW4kMSA9IGxhc3RbaSQxXQogICAgICBpZiAoc3BhbiQxLnRvICE9IG51bGwpIHsgc3BhbiQxLnRvICs9IG9mZnNldCB9CiAgICAgIGlmIChzcGFuJDEuZnJvbSA9PSBudWxsKSB7CiAgICAgICAgdmFyIGZvdW5kJDEgPSBnZXRNYXJrZWRTcGFuRm9yKGZpcnN0LCBzcGFuJDEubWFya2VyKQogICAgICAgIGlmICghZm91bmQkMSkgewogICAgICAgICAgc3BhbiQxLmZyb20gPSBvZmZzZXQKICAgICAgICAgIGlmIChzYW1lTGluZSkgeyAoZmlyc3QgfHwgKGZpcnN0ID0gW10pKS5wdXNoKHNwYW4kMSkgfQogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICBzcGFuJDEuZnJvbSArPSBvZmZzZXQKICAgICAgICBpZiAoc2FtZUxpbmUpIHsgKGZpcnN0IHx8IChmaXJzdCA9IFtdKSkucHVzaChzcGFuJDEpIH0KICAgICAgfQogICAgfQogIH0KICAvLyBNYWtlIHN1cmUgd2UgZGlkbid0IGNyZWF0ZSBhbnkgemVyby1sZW5ndGggc3BhbnMKICBpZiAoZmlyc3QpIHsgZmlyc3QgPSBjbGVhckVtcHR5U3BhbnMoZmlyc3QpIH0KICBpZiAobGFzdCAmJiBsYXN0ICE9IGZpcnN0KSB7IGxhc3QgPSBjbGVhckVtcHR5U3BhbnMobGFzdCkgfQoKICB2YXIgbmV3TWFya2VycyA9IFtmaXJzdF0KICBpZiAoIXNhbWVMaW5lKSB7CiAgICAvLyBGaWxsIGdhcCB3aXRoIHdob2xlLWxpbmUtc3BhbnMKICAgIHZhciBnYXAgPSBjaGFuZ2UudGV4dC5sZW5ndGggLSAyLCBnYXBNYXJrZXJzCiAgICBpZiAoZ2FwID4gMCAmJiBmaXJzdCkKICAgICAgeyBmb3IgKHZhciBpJDIgPSAwOyBpJDIgPCBmaXJzdC5sZW5ndGg7ICsraSQyKQogICAgICAgIHsgaWYgKGZpcnN0W2kkMl0udG8gPT0gbnVsbCkKICAgICAgICAgIHsgKGdhcE1hcmtlcnMgfHwgKGdhcE1hcmtlcnMgPSBbXSkpLnB1c2gobmV3IE1hcmtlZFNwYW4oZmlyc3RbaSQyXS5tYXJrZXIsIG51bGwsIG51bGwpKSB9IH0gfQogICAgZm9yICh2YXIgaSQzID0gMDsgaSQzIDwgZ2FwOyArK2kkMykKICAgICAgeyBuZXdNYXJrZXJzLnB1c2goZ2FwTWFya2VycykgfQogICAgbmV3TWFya2Vycy5wdXNoKGxhc3QpCiAgfQogIHJldHVybiBuZXdNYXJrZXJzCn0KCi8vIFJlbW92ZSBzcGFucyB0aGF0IGFyZSBlbXB0eSBhbmQgZG9uJ3QgaGF2ZSBhIGNsZWFyV2hlbkVtcHR5Ci8vIG9wdGlvbiBvZiBmYWxzZS4KZnVuY3Rpb24gY2xlYXJFbXB0eVNwYW5zKHNwYW5zKSB7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzcGFucy5sZW5ndGg7ICsraSkgewogICAgdmFyIHNwYW4gPSBzcGFuc1tpXQogICAgaWYgKHNwYW4uZnJvbSAhPSBudWxsICYmIHNwYW4uZnJvbSA9PSBzcGFuLnRvICYmIHNwYW4ubWFya2VyLmNsZWFyV2hlbkVtcHR5ICE9PSBmYWxzZSkKICAgICAgeyBzcGFucy5zcGxpY2UoaS0tLCAxKSB9CiAgfQogIGlmICghc3BhbnMubGVuZ3RoKSB7IHJldHVybiBudWxsIH0KICByZXR1cm4gc3BhbnMKfQoKLy8gVXNlZCB0byAnY2xpcCcgb3V0IHJlYWRPbmx5IHJhbmdlcyB3aGVuIG1ha2luZyBhIGNoYW5nZS4KZnVuY3Rpb24gcmVtb3ZlUmVhZE9ubHlSYW5nZXMoZG9jLCBmcm9tLCB0bykgewogIHZhciBtYXJrZXJzID0gbnVsbAogIGRvYy5pdGVyKGZyb20ubGluZSwgdG8ubGluZSArIDEsIGZ1bmN0aW9uIChsaW5lKSB7CiAgICBpZiAobGluZS5tYXJrZWRTcGFucykgeyBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmUubWFya2VkU3BhbnMubGVuZ3RoOyArK2kpIHsKICAgICAgdmFyIG1hcmsgPSBsaW5lLm1hcmtlZFNwYW5zW2ldLm1hcmtlcgogICAgICBpZiAobWFyay5yZWFkT25seSAmJiAoIW1hcmtlcnMgfHwgaW5kZXhPZihtYXJrZXJzLCBtYXJrKSA9PSAtMSkpCiAgICAgICAgeyAobWFya2VycyB8fCAobWFya2VycyA9IFtdKSkucHVzaChtYXJrKSB9CiAgICB9IH0KICB9KQogIGlmICghbWFya2VycykgeyByZXR1cm4gbnVsbCB9CiAgdmFyIHBhcnRzID0gW3tmcm9tOiBmcm9tLCB0bzogdG99XQogIGZvciAodmFyIGkgPSAwOyBpIDwgbWFya2Vycy5sZW5ndGg7ICsraSkgewogICAgdmFyIG1rID0gbWFya2Vyc1tpXSwgbSA9IG1rLmZpbmQoMCkKICAgIGZvciAodmFyIGogPSAwOyBqIDwgcGFydHMubGVuZ3RoOyArK2opIHsKICAgICAgdmFyIHAgPSBwYXJ0c1tqXQogICAgICBpZiAoY21wKHAudG8sIG0uZnJvbSkgPCAwIHx8IGNtcChwLmZyb20sIG0udG8pID4gMCkgeyBjb250aW51ZSB9CiAgICAgIHZhciBuZXdQYXJ0cyA9IFtqLCAxXSwgZGZyb20gPSBjbXAocC5mcm9tLCBtLmZyb20pLCBkdG8gPSBjbXAocC50bywgbS50bykKICAgICAgaWYgKGRmcm9tIDwgMCB8fCAhbWsuaW5jbHVzaXZlTGVmdCAmJiAhZGZyb20pCiAgICAgICAgeyBuZXdQYXJ0cy5wdXNoKHtmcm9tOiBwLmZyb20sIHRvOiBtLmZyb219KSB9CiAgICAgIGlmIChkdG8gPiAwIHx8ICFtay5pbmNsdXNpdmVSaWdodCAmJiAhZHRvKQogICAgICAgIHsgbmV3UGFydHMucHVzaCh7ZnJvbTogbS50bywgdG86IHAudG99KSB9CiAgICAgIHBhcnRzLnNwbGljZS5hcHBseShwYXJ0cywgbmV3UGFydHMpCiAgICAgIGogKz0gbmV3UGFydHMubGVuZ3RoIC0gMQogICAgfQogIH0KICByZXR1cm4gcGFydHMKfQoKLy8gQ29ubmVjdCBvciBkaXNjb25uZWN0IHNwYW5zIGZyb20gYSBsaW5lLgpmdW5jdGlvbiBkZXRhY2hNYXJrZWRTcGFucyhsaW5lKSB7CiAgdmFyIHNwYW5zID0gbGluZS5tYXJrZWRTcGFucwogIGlmICghc3BhbnMpIHsgcmV0dXJuIH0KICBmb3IgKHZhciBpID0gMDsgaSA8IHNwYW5zLmxlbmd0aDsgKytpKQogICAgeyBzcGFuc1tpXS5tYXJrZXIuZGV0YWNoTGluZShsaW5lKSB9CiAgbGluZS5tYXJrZWRTcGFucyA9IG51bGwKfQpmdW5jdGlvbiBhdHRhY2hNYXJrZWRTcGFucyhsaW5lLCBzcGFucykgewogIGlmICghc3BhbnMpIHsgcmV0dXJuIH0KICBmb3IgKHZhciBpID0gMDsgaSA8IHNwYW5zLmxlbmd0aDsgKytpKQogICAgeyBzcGFuc1tpXS5tYXJrZXIuYXR0YWNoTGluZShsaW5lKSB9CiAgbGluZS5tYXJrZWRTcGFucyA9IHNwYW5zCn0KCi8vIEhlbHBlcnMgdXNlZCB3aGVuIGNvbXB1dGluZyB3aGljaCBvdmVybGFwcGluZyBjb2xsYXBzZWQgc3BhbgovLyBjb3VudHMgYXMgdGhlIGxhcmdlciBvbmUuCmZ1bmN0aW9uIGV4dHJhTGVmdChtYXJrZXIpIHsgcmV0dXJuIG1hcmtlci5pbmNsdXNpdmVMZWZ0ID8gLTEgOiAwIH0KZnVuY3Rpb24gZXh0cmFSaWdodChtYXJrZXIpIHsgcmV0dXJuIG1hcmtlci5pbmNsdXNpdmVSaWdodCA/IDEgOiAwIH0KCi8vIFJldHVybnMgYSBudW1iZXIgaW5kaWNhdGluZyB3aGljaCBvZiB0d28gb3ZlcmxhcHBpbmcgY29sbGFwc2VkCi8vIHNwYW5zIGlzIGxhcmdlciAoYW5kIHRodXMgaW5jbHVkZXMgdGhlIG90aGVyKS4gRmFsbHMgYmFjayB0bwovLyBjb21wYXJpbmcgaWRzIHdoZW4gdGhlIHNwYW5zIGNvdmVyIGV4YWN0bHkgdGhlIHNhbWUgcmFuZ2UuCmZ1bmN0aW9uIGNvbXBhcmVDb2xsYXBzZWRNYXJrZXJzKGEsIGIpIHsKICB2YXIgbGVuRGlmZiA9IGEubGluZXMubGVuZ3RoIC0gYi5saW5lcy5sZW5ndGgKICBpZiAobGVuRGlmZiAhPSAwKSB7IHJldHVybiBsZW5EaWZmIH0KICB2YXIgYVBvcyA9IGEuZmluZCgpLCBiUG9zID0gYi5maW5kKCkKICB2YXIgZnJvbUNtcCA9IGNtcChhUG9zLmZyb20sIGJQb3MuZnJvbSkgfHwgZXh0cmFMZWZ0KGEpIC0gZXh0cmFMZWZ0KGIpCiAgaWYgKGZyb21DbXApIHsgcmV0dXJuIC1mcm9tQ21wIH0KICB2YXIgdG9DbXAgPSBjbXAoYVBvcy50bywgYlBvcy50bykgfHwgZXh0cmFSaWdodChhKSAtIGV4dHJhUmlnaHQoYikKICBpZiAodG9DbXApIHsgcmV0dXJuIHRvQ21wIH0KICByZXR1cm4gYi5pZCAtIGEuaWQKfQoKLy8gRmluZCBvdXQgd2hldGhlciBhIGxpbmUgZW5kcyBvciBzdGFydHMgaW4gYSBjb2xsYXBzZWQgc3Bhbi4gSWYKLy8gc28sIHJldHVybiB0aGUgbWFya2VyIGZvciB0aGF0IHNwYW4uCmZ1bmN0aW9uIGNvbGxhcHNlZFNwYW5BdFNpZGUobGluZSwgc3RhcnQpIHsKICB2YXIgc3BzID0gc2F3Q29sbGFwc2VkU3BhbnMgJiYgbGluZS5tYXJrZWRTcGFucywgZm91bmQKICBpZiAoc3BzKSB7IGZvciAodmFyIHNwID0gdm9pZCAwLCBpID0gMDsgaSA8IHNwcy5sZW5ndGg7ICsraSkgewogICAgc3AgPSBzcHNbaV0KICAgIGlmIChzcC5tYXJrZXIuY29sbGFwc2VkICYmIChzdGFydCA/IHNwLmZyb20gOiBzcC50bykgPT0gbnVsbCAmJgogICAgICAgICghZm91bmQgfHwgY29tcGFyZUNvbGxhcHNlZE1hcmtlcnMoZm91bmQsIHNwLm1hcmtlcikgPCAwKSkKICAgICAgeyBmb3VuZCA9IHNwLm1hcmtlciB9CiAgfSB9CiAgcmV0dXJuIGZvdW5kCn0KZnVuY3Rpb24gY29sbGFwc2VkU3BhbkF0U3RhcnQobGluZSkgeyByZXR1cm4gY29sbGFwc2VkU3BhbkF0U2lkZShsaW5lLCB0cnVlKSB9CmZ1bmN0aW9uIGNvbGxhcHNlZFNwYW5BdEVuZChsaW5lKSB7IHJldHVybiBjb2xsYXBzZWRTcGFuQXRTaWRlKGxpbmUsIGZhbHNlKSB9CgovLyBUZXN0IHdoZXRoZXIgdGhlcmUgZXhpc3RzIGEgY29sbGFwc2VkIHNwYW4gdGhhdCBwYXJ0aWFsbHkKLy8gb3ZlcmxhcHMgKGNvdmVycyB0aGUgc3RhcnQgb3IgZW5kLCBidXQgbm90IGJvdGgpIG9mIGEgbmV3IHNwYW4uCi8vIFN1Y2ggb3ZlcmxhcCBpcyBub3QgYWxsb3dlZC4KZnVuY3Rpb24gY29uZmxpY3RpbmdDb2xsYXBzZWRSYW5nZShkb2MsIGxpbmVObyQkMSwgZnJvbSwgdG8sIG1hcmtlcikgewogIHZhciBsaW5lID0gZ2V0TGluZShkb2MsIGxpbmVObyQkMSkKICB2YXIgc3BzID0gc2F3Q29sbGFwc2VkU3BhbnMgJiYgbGluZS5tYXJrZWRTcGFucwogIGlmIChzcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBzcHMubGVuZ3RoOyArK2kpIHsKICAgIHZhciBzcCA9IHNwc1tpXQogICAgaWYgKCFzcC5tYXJrZXIuY29sbGFwc2VkKSB7IGNvbnRpbnVlIH0KICAgIHZhciBmb3VuZCA9IHNwLm1hcmtlci5maW5kKDApCiAgICB2YXIgZnJvbUNtcCA9IGNtcChmb3VuZC5mcm9tLCBmcm9tKSB8fCBleHRyYUxlZnQoc3AubWFya2VyKSAtIGV4dHJhTGVmdChtYXJrZXIpCiAgICB2YXIgdG9DbXAgPSBjbXAoZm91bmQudG8sIHRvKSB8fCBleHRyYVJpZ2h0KHNwLm1hcmtlcikgLSBleHRyYVJpZ2h0KG1hcmtlcikKICAgIGlmIChmcm9tQ21wID49IDAgJiYgdG9DbXAgPD0gMCB8fCBmcm9tQ21wIDw9IDAgJiYgdG9DbXAgPj0gMCkgeyBjb250aW51ZSB9CiAgICBpZiAoZnJvbUNtcCA8PSAwICYmIChzcC5tYXJrZXIuaW5jbHVzaXZlUmlnaHQgJiYgbWFya2VyLmluY2x1c2l2ZUxlZnQgPyBjbXAoZm91bmQudG8sIGZyb20pID49IDAgOiBjbXAoZm91bmQudG8sIGZyb20pID4gMCkgfHwKICAgICAgICBmcm9tQ21wID49IDAgJiYgKHNwLm1hcmtlci5pbmNsdXNpdmVSaWdodCAmJiBtYXJrZXIuaW5jbHVzaXZlTGVmdCA/IGNtcChmb3VuZC5mcm9tLCB0bykgPD0gMCA6IGNtcChmb3VuZC5mcm9tLCB0bykgPCAwKSkKICAgICAgeyByZXR1cm4gdHJ1ZSB9CiAgfSB9Cn0KCi8vIEEgdmlzdWFsIGxpbmUgaXMgYSBsaW5lIGFzIGRyYXduIG9uIHRoZSBzY3JlZW4uIEZvbGRpbmcsIGZvcgovLyBleGFtcGxlLCBjYW4gY2F1c2UgbXVsdGlwbGUgbG9naWNhbCBsaW5lcyB0byBhcHBlYXIgb24gdGhlIHNhbWUKLy8gdmlzdWFsIGxpbmUuIFRoaXMgZmluZHMgdGhlIHN0YXJ0IG9mIHRoZSB2aXN1YWwgbGluZSB0aGF0IHRoZQovLyBnaXZlbiBsaW5lIGlzIHBhcnQgb2YgKHVzdWFsbHkgdGhhdCBpcyB0aGUgbGluZSBpdHNlbGYpLgpmdW5jdGlvbiB2aXN1YWxMaW5lKGxpbmUpIHsKICB2YXIgbWVyZ2VkCiAgd2hpbGUgKG1lcmdlZCA9IGNvbGxhcHNlZFNwYW5BdFN0YXJ0KGxpbmUpKQogICAgeyBsaW5lID0gbWVyZ2VkLmZpbmQoLTEsIHRydWUpLmxpbmUgfQogIHJldHVybiBsaW5lCn0KCi8vIFJldHVybnMgYW4gYXJyYXkgb2YgbG9naWNhbCBsaW5lcyB0aGF0IGNvbnRpbnVlIHRoZSB2aXN1YWwgbGluZQovLyBzdGFydGVkIGJ5IHRoZSBhcmd1bWVudCwgb3IgdW5kZWZpbmVkIGlmIHRoZXJlIGFyZSBubyBzdWNoIGxpbmVzLgpmdW5jdGlvbiB2aXN1YWxMaW5lQ29udGludWVkKGxpbmUpIHsKICB2YXIgbWVyZ2VkLCBsaW5lcwogIHdoaWxlIChtZXJnZWQgPSBjb2xsYXBzZWRTcGFuQXRFbmQobGluZSkpIHsKICAgIGxpbmUgPSBtZXJnZWQuZmluZCgxLCB0cnVlKS5saW5lCiAgICA7KGxpbmVzIHx8IChsaW5lcyA9IFtdKSkucHVzaChsaW5lKQogIH0KICByZXR1cm4gbGluZXMKfQoKLy8gR2V0IHRoZSBsaW5lIG51bWJlciBvZiB0aGUgc3RhcnQgb2YgdGhlIHZpc3VhbCBsaW5lIHRoYXQgdGhlCi8vIGdpdmVuIGxpbmUgbnVtYmVyIGlzIHBhcnQgb2YuCmZ1bmN0aW9uIHZpc3VhbExpbmVObyhkb2MsIGxpbmVOKSB7CiAgdmFyIGxpbmUgPSBnZXRMaW5lKGRvYywgbGluZU4pLCB2aXMgPSB2aXN1YWxMaW5lKGxpbmUpCiAgaWYgKGxpbmUgPT0gdmlzKSB7IHJldHVybiBsaW5lTiB9CiAgcmV0dXJuIGxpbmVObyh2aXMpCn0KCi8vIEdldCB0aGUgbGluZSBudW1iZXIgb2YgdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IHZpc3VhbCBsaW5lIGFmdGVyCi8vIHRoZSBnaXZlbiBsaW5lLgpmdW5jdGlvbiB2aXN1YWxMaW5lRW5kTm8oZG9jLCBsaW5lTikgewogIGlmIChsaW5lTiA+IGRvYy5sYXN0TGluZSgpKSB7IHJldHVybiBsaW5lTiB9CiAgdmFyIGxpbmUgPSBnZXRMaW5lKGRvYywgbGluZU4pLCBtZXJnZWQKICBpZiAoIWxpbmVJc0hpZGRlbihkb2MsIGxpbmUpKSB7IHJldHVybiBsaW5lTiB9CiAgd2hpbGUgKG1lcmdlZCA9IGNvbGxhcHNlZFNwYW5BdEVuZChsaW5lKSkKICAgIHsgbGluZSA9IG1lcmdlZC5maW5kKDEsIHRydWUpLmxpbmUgfQogIHJldHVybiBsaW5lTm8obGluZSkgKyAxCn0KCi8vIENvbXB1dGUgd2hldGhlciBhIGxpbmUgaXMgaGlkZGVuLiBMaW5lcyBjb3VudCBhcyBoaWRkZW4gd2hlbiB0aGV5Ci8vIGFyZSBwYXJ0IG9mIGEgdmlzdWFsIGxpbmUgdGhhdCBzdGFydHMgd2l0aCBhbm90aGVyIGxpbmUsIG9yIHdoZW4KLy8gdGhleSBhcmUgZW50aXJlbHkgY292ZXJlZCBieSBjb2xsYXBzZWQsIG5vbi13aWRnZXQgc3Bhbi4KZnVuY3Rpb24gbGluZUlzSGlkZGVuKGRvYywgbGluZSkgewogIHZhciBzcHMgPSBzYXdDb2xsYXBzZWRTcGFucyAmJiBsaW5lLm1hcmtlZFNwYW5zCiAgaWYgKHNwcykgeyBmb3IgKHZhciBzcCA9IHZvaWQgMCwgaSA9IDA7IGkgPCBzcHMubGVuZ3RoOyArK2kpIHsKICAgIHNwID0gc3BzW2ldCiAgICBpZiAoIXNwLm1hcmtlci5jb2xsYXBzZWQpIHsgY29udGludWUgfQogICAgaWYgKHNwLmZyb20gPT0gbnVsbCkgeyByZXR1cm4gdHJ1ZSB9CiAgICBpZiAoc3AubWFya2VyLndpZGdldE5vZGUpIHsgY29udGludWUgfQogICAgaWYgKHNwLmZyb20gPT0gMCAmJiBzcC5tYXJrZXIuaW5jbHVzaXZlTGVmdCAmJiBsaW5lSXNIaWRkZW5Jbm5lcihkb2MsIGxpbmUsIHNwKSkKICAgICAgeyByZXR1cm4gdHJ1ZSB9CiAgfSB9Cn0KZnVuY3Rpb24gbGluZUlzSGlkZGVuSW5uZXIoZG9jLCBsaW5lLCBzcGFuKSB7CiAgaWYgKHNwYW4udG8gPT0gbnVsbCkgewogICAgdmFyIGVuZCA9IHNwYW4ubWFya2VyLmZpbmQoMSwgdHJ1ZSkKICAgIHJldHVybiBsaW5lSXNIaWRkZW5Jbm5lcihkb2MsIGVuZC5saW5lLCBnZXRNYXJrZWRTcGFuRm9yKGVuZC5saW5lLm1hcmtlZFNwYW5zLCBzcGFuLm1hcmtlcikpCiAgfQogIGlmIChzcGFuLm1hcmtlci5pbmNsdXNpdmVSaWdodCAmJiBzcGFuLnRvID09IGxpbmUudGV4dC5sZW5ndGgpCiAgICB7IHJldHVybiB0cnVlIH0KICBmb3IgKHZhciBzcCA9IHZvaWQgMCwgaSA9IDA7IGkgPCBsaW5lLm1hcmtlZFNwYW5zLmxlbmd0aDsgKytpKSB7CiAgICBzcCA9IGxpbmUubWFya2VkU3BhbnNbaV0KICAgIGlmIChzcC5tYXJrZXIuY29sbGFwc2VkICYmICFzcC5tYXJrZXIud2lkZ2V0Tm9kZSAmJiBzcC5mcm9tID09IHNwYW4udG8gJiYKICAgICAgICAoc3AudG8gPT0gbnVsbCB8fCBzcC50byAhPSBzcGFuLmZyb20pICYmCiAgICAgICAgKHNwLm1hcmtlci5pbmNsdXNpdmVMZWZ0IHx8IHNwYW4ubWFya2VyLmluY2x1c2l2ZVJpZ2h0KSAmJgogICAgICAgIGxpbmVJc0hpZGRlbklubmVyKGRvYywgbGluZSwgc3ApKSB7IHJldHVybiB0cnVlIH0KICB9Cn0KCi8vIEZpbmQgdGhlIGhlaWdodCBhYm92ZSB0aGUgZ2l2ZW4gbGluZS4KZnVuY3Rpb24gaGVpZ2h0QXRMaW5lKGxpbmVPYmopIHsKICBsaW5lT2JqID0gdmlzdWFsTGluZShsaW5lT2JqKQoKICB2YXIgaCA9IDAsIGNodW5rID0gbGluZU9iai5wYXJlbnQKICBmb3IgKHZhciBpID0gMDsgaSA8IGNodW5rLmxpbmVzLmxlbmd0aDsgKytpKSB7CiAgICB2YXIgbGluZSA9IGNodW5rLmxpbmVzW2ldCiAgICBpZiAobGluZSA9PSBsaW5lT2JqKSB7IGJyZWFrIH0KICAgIGVsc2UgeyBoICs9IGxpbmUuaGVpZ2h0IH0KICB9CiAgZm9yICh2YXIgcCA9IGNodW5rLnBhcmVudDsgcDsgY2h1bmsgPSBwLCBwID0gY2h1bmsucGFyZW50KSB7CiAgICBmb3IgKHZhciBpJDEgPSAwOyBpJDEgPCBwLmNoaWxkcmVuLmxlbmd0aDsgKytpJDEpIHsKICAgICAgdmFyIGN1ciA9IHAuY2hpbGRyZW5baSQxXQogICAgICBpZiAoY3VyID09IGNodW5rKSB7IGJyZWFrIH0KICAgICAgZWxzZSB7IGggKz0gY3VyLmhlaWdodCB9CiAgICB9CiAgfQogIHJldHVybiBoCn0KCi8vIENvbXB1dGUgdGhlIGNoYXJhY3RlciBsZW5ndGggb2YgYSBsaW5lLCB0YWtpbmcgaW50byBhY2NvdW50Ci8vIGNvbGxhcHNlZCByYW5nZXMgKHNlZSBtYXJrVGV4dCkgdGhhdCBtaWdodCBoaWRlIHBhcnRzLCBhbmQgam9pbgovLyBvdGhlciBsaW5lcyBvbnRvIGl0LgpmdW5jdGlvbiBsaW5lTGVuZ3RoKGxpbmUpIHsKICBpZiAobGluZS5oZWlnaHQgPT0gMCkgeyByZXR1cm4gMCB9CiAgdmFyIGxlbiA9IGxpbmUudGV4dC5sZW5ndGgsIG1lcmdlZCwgY3VyID0gbGluZQogIHdoaWxlIChtZXJnZWQgPSBjb2xsYXBzZWRTcGFuQXRTdGFydChjdXIpKSB7CiAgICB2YXIgZm91bmQgPSBtZXJnZWQuZmluZCgwLCB0cnVlKQogICAgY3VyID0gZm91bmQuZnJvbS5saW5lCiAgICBsZW4gKz0gZm91bmQuZnJvbS5jaCAtIGZvdW5kLnRvLmNoCiAgfQogIGN1ciA9IGxpbmUKICB3aGlsZSAobWVyZ2VkID0gY29sbGFwc2VkU3BhbkF0RW5kKGN1cikpIHsKICAgIHZhciBmb3VuZCQxID0gbWVyZ2VkLmZpbmQoMCwgdHJ1ZSkKICAgIGxlbiAtPSBjdXIudGV4dC5sZW5ndGggLSBmb3VuZCQxLmZyb20uY2gKICAgIGN1ciA9IGZvdW5kJDEudG8ubGluZQogICAgbGVuICs9IGN1ci50ZXh0Lmxlbmd0aCAtIGZvdW5kJDEudG8uY2gKICB9CiAgcmV0dXJuIGxlbgp9CgovLyBGaW5kIHRoZSBsb25nZXN0IGxpbmUgaW4gdGhlIGRvY3VtZW50LgpmdW5jdGlvbiBmaW5kTWF4TGluZShjbSkgewogIHZhciBkID0gY20uZGlzcGxheSwgZG9jID0gY20uZG9jCiAgZC5tYXhMaW5lID0gZ2V0TGluZShkb2MsIGRvYy5maXJzdCkKICBkLm1heExpbmVMZW5ndGggPSBsaW5lTGVuZ3RoKGQubWF4TGluZSkKICBkLm1heExpbmVDaGFuZ2VkID0gdHJ1ZQogIGRvYy5pdGVyKGZ1bmN0aW9uIChsaW5lKSB7CiAgICB2YXIgbGVuID0gbGluZUxlbmd0aChsaW5lKQogICAgaWYgKGxlbiA+IGQubWF4TGluZUxlbmd0aCkgewogICAgICBkLm1heExpbmVMZW5ndGggPSBsZW4KICAgICAgZC5tYXhMaW5lID0gbGluZQogICAgfQogIH0pCn0KCi8vIEJJREkgSEVMUEVSUwoKZnVuY3Rpb24gaXRlcmF0ZUJpZGlTZWN0aW9ucyhvcmRlciwgZnJvbSwgdG8sIGYpIHsKICBpZiAoIW9yZGVyKSB7IHJldHVybiBmKGZyb20sIHRvLCAibHRyIikgfQogIHZhciBmb3VuZCA9IGZhbHNlCiAgZm9yICh2YXIgaSA9IDA7IGkgPCBvcmRlci5sZW5ndGg7ICsraSkgewogICAgdmFyIHBhcnQgPSBvcmRlcltpXQogICAgaWYgKHBhcnQuZnJvbSA8IHRvICYmIHBhcnQudG8gPiBmcm9tIHx8IGZyb20gPT0gdG8gJiYgcGFydC50byA9PSBmcm9tKSB7CiAgICAgIGYoTWF0aC5tYXgocGFydC5mcm9tLCBmcm9tKSwgTWF0aC5taW4ocGFydC50bywgdG8pLCBwYXJ0LmxldmVsID09IDEgPyAicnRsIiA6ICJsdHIiKQogICAgICBmb3VuZCA9IHRydWUKICAgIH0KICB9CiAgaWYgKCFmb3VuZCkgeyBmKGZyb20sIHRvLCAibHRyIikgfQp9CgpmdW5jdGlvbiBiaWRpTGVmdChwYXJ0KSB7IHJldHVybiBwYXJ0LmxldmVsICUgMiA/IHBhcnQudG8gOiBwYXJ0LmZyb20gfQpmdW5jdGlvbiBiaWRpUmlnaHQocGFydCkgeyByZXR1cm4gcGFydC5sZXZlbCAlIDIgPyBwYXJ0LmZyb20gOiBwYXJ0LnRvIH0KCmZ1bmN0aW9uIGxpbmVMZWZ0KGxpbmUpIHsgdmFyIG9yZGVyID0gZ2V0T3JkZXIobGluZSk7IHJldHVybiBvcmRlciA/IGJpZGlMZWZ0KG9yZGVyWzBdKSA6IDAgfQpmdW5jdGlvbiBsaW5lUmlnaHQobGluZSkgewogIHZhciBvcmRlciA9IGdldE9yZGVyKGxpbmUpCiAgaWYgKCFvcmRlcikgeyByZXR1cm4gbGluZS50ZXh0Lmxlbmd0aCB9CiAgcmV0dXJuIGJpZGlSaWdodChsc3Qob3JkZXIpKQp9CgpmdW5jdGlvbiBjb21wYXJlQmlkaUxldmVsKG9yZGVyLCBhLCBiKSB7CiAgdmFyIGxpbmVkaXIgPSBvcmRlclswXS5sZXZlbAogIGlmIChhID09IGxpbmVkaXIpIHsgcmV0dXJuIHRydWUgfQogIGlmIChiID09IGxpbmVkaXIpIHsgcmV0dXJuIGZhbHNlIH0KICByZXR1cm4gYSA8IGIKfQoKdmFyIGJpZGlPdGhlciA9IG51bGwKZnVuY3Rpb24gZ2V0QmlkaVBhcnRBdChvcmRlciwgcG9zKSB7CiAgdmFyIGZvdW5kCiAgYmlkaU90aGVyID0gbnVsbAogIGZvciAodmFyIGkgPSAwOyBpIDwgb3JkZXIubGVuZ3RoOyArK2kpIHsKICAgIHZhciBjdXIgPSBvcmRlcltpXQogICAgaWYgKGN1ci5mcm9tIDwgcG9zICYmIGN1ci50byA+IHBvcykgeyByZXR1cm4gaSB9CiAgICBpZiAoKGN1ci5mcm9tID09IHBvcyB8fCBjdXIudG8gPT0gcG9zKSkgewogICAgICBpZiAoZm91bmQgPT0gbnVsbCkgewogICAgICAgIGZvdW5kID0gaQogICAgICB9IGVsc2UgaWYgKGNvbXBhcmVCaWRpTGV2ZWwob3JkZXIsIGN1ci5sZXZlbCwgb3JkZXJbZm91bmRdLmxldmVsKSkgewogICAgICAgIGlmIChjdXIuZnJvbSAhPSBjdXIudG8pIHsgYmlkaU90aGVyID0gZm91bmQgfQogICAgICAgIHJldHVybiBpCiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGN1ci5mcm9tICE9IGN1ci50bykgeyBiaWRpT3RoZXIgPSBpIH0KICAgICAgICByZXR1cm4gZm91bmQKICAgICAgfQogICAgfQogIH0KICByZXR1cm4gZm91bmQKfQoKZnVuY3Rpb24gbW92ZUluTGluZShsaW5lLCBwb3MsIGRpciwgYnlVbml0KSB7CiAgaWYgKCFieVVuaXQpIHsgcmV0dXJuIHBvcyArIGRpciB9CiAgZG8geyBwb3MgKz0gZGlyIH0KICB3aGlsZSAocG9zID4gMCAmJiBpc0V4dGVuZGluZ0NoYXIobGluZS50ZXh0LmNoYXJBdChwb3MpKSkKICByZXR1cm4gcG9zCn0KCi8vIFRoaXMgaXMgbmVlZGVkIGluIG9yZGVyIHRvIG1vdmUgJ3Zpc3VhbGx5JyB0aHJvdWdoIGJpLWRpcmVjdGlvbmFsCi8vIHRleHQgLS0gaS5lLiwgcHJlc3NpbmcgbGVmdCBzaG91bGQgbWFrZSB0aGUgY3Vyc29yIGdvIGxlZnQsIGV2ZW4KLy8gd2hlbiBpbiBSVEwgdGV4dC4gVGhlIHRyaWNreSBwYXJ0IGlzIHRoZSAnanVtcHMnLCB3aGVyZSBSVEwgYW5kCi8vIExUUiB0ZXh0IHRvdWNoIGVhY2ggb3RoZXIuIFRoaXMgb2Z0ZW4gcmVxdWlyZXMgdGhlIGN1cnNvciBvZmZzZXQKLy8gdG8gbW92ZSBtb3JlIHRoYW4gb25lIHVuaXQsIGluIG9yZGVyIHRvIHZpc3VhbGx5IG1vdmUgb25lIHVuaXQuCmZ1bmN0aW9uIG1vdmVWaXN1YWxseShsaW5lLCBzdGFydCwgZGlyLCBieVVuaXQpIHsKICB2YXIgYmlkaSA9IGdldE9yZGVyKGxpbmUpCiAgaWYgKCFiaWRpKSB7IHJldHVybiBtb3ZlTG9naWNhbGx5KGxpbmUsIHN0YXJ0LCBkaXIsIGJ5VW5pdCkgfQogIHZhciBwb3MgPSBnZXRCaWRpUGFydEF0KGJpZGksIHN0YXJ0KSwgcGFydCA9IGJpZGlbcG9zXQogIHZhciB0YXJnZXQgPSBtb3ZlSW5MaW5lKGxpbmUsIHN0YXJ0LCBwYXJ0LmxldmVsICUgMiA/IC1kaXIgOiBkaXIsIGJ5VW5pdCkKCiAgZm9yICg7OykgewogICAgaWYgKHRhcmdldCA+IHBhcnQuZnJvbSAmJiB0YXJnZXQgPCBwYXJ0LnRvKSB7IHJldHVybiB0YXJnZXQgfQogICAgaWYgKHRhcmdldCA9PSBwYXJ0LmZyb20gfHwgdGFyZ2V0ID09IHBhcnQudG8pIHsKICAgICAgaWYgKGdldEJpZGlQYXJ0QXQoYmlkaSwgdGFyZ2V0KSA9PSBwb3MpIHsgcmV0dXJuIHRhcmdldCB9CiAgICAgIHBhcnQgPSBiaWRpW3BvcyArPSBkaXJdCiAgICAgIHJldHVybiAoZGlyID4gMCkgPT0gcGFydC5sZXZlbCAlIDIgPyBwYXJ0LnRvIDogcGFydC5mcm9tCiAgICB9IGVsc2UgewogICAgICBwYXJ0ID0gYmlkaVtwb3MgKz0gZGlyXQogICAgICBpZiAoIXBhcnQpIHsgcmV0dXJuIG51bGwgfQogICAgICBpZiAoKGRpciA+IDApID09IHBhcnQubGV2ZWwgJSAyKQogICAgICAgIHsgdGFyZ2V0ID0gbW92ZUluTGluZShsaW5lLCBwYXJ0LnRvLCAtMSwgYnlVbml0KSB9CiAgICAgIGVsc2UKICAgICAgICB7IHRhcmdldCA9IG1vdmVJbkxpbmUobGluZSwgcGFydC5mcm9tLCAxLCBieVVuaXQpIH0KICAgIH0KICB9Cn0KCmZ1bmN0aW9uIG1vdmVMb2dpY2FsbHkobGluZSwgc3RhcnQsIGRpciwgYnlVbml0KSB7CiAgdmFyIHRhcmdldCA9IHN0YXJ0ICsgZGlyCiAgaWYgKGJ5VW5pdCkgeyB3aGlsZSAodGFyZ2V0ID4gMCAmJiBpc0V4dGVuZGluZ0NoYXIobGluZS50ZXh0LmNoYXJBdCh0YXJnZXQpKSkgeyB0YXJnZXQgKz0gZGlyIH0gfQogIHJldHVybiB0YXJnZXQgPCAwIHx8IHRhcmdldCA+IGxpbmUudGV4dC5sZW5ndGggPyBudWxsIDogdGFyZ2V0Cn0KCi8vIEJpZGlyZWN0aW9uYWwgb3JkZXJpbmcgYWxnb3JpdGhtCi8vIFNlZSBodHRwOi8vdW5pY29kZS5vcmcvcmVwb3J0cy90cjkvdHI5LTEzLmh0bWwgZm9yIHRoZSBhbGdvcml0aG0KLy8gdGhhdCB0aGlzIChwYXJ0aWFsbHkpIGltcGxlbWVudHMuCgovLyBPbmUtY2hhciBjb2RlcyB1c2VkIGZvciBjaGFyYWN0ZXIgdHlwZXM6Ci8vIEwgKEwpOiAgIExlZnQtdG8tUmlnaHQKLy8gUiAoUik6ICAgUmlnaHQtdG8tTGVmdAovLyByIChBTCk6ICBSaWdodC10by1MZWZ0IEFyYWJpYwovLyAxIChFTik6ICBFdXJvcGVhbiBOdW1iZXIKLy8gKyAoRVMpOiAgRXVyb3BlYW4gTnVtYmVyIFNlcGFyYXRvcgovLyAlIChFVCk6ICBFdXJvcGVhbiBOdW1iZXIgVGVybWluYXRvcgovLyBuIChBTik6ICBBcmFiaWMgTnVtYmVyCi8vICwgKENTKTogIENvbW1vbiBOdW1iZXIgU2VwYXJhdG9yCi8vIG0gKE5TTSk6IE5vbi1TcGFjaW5nIE1hcmsKLy8gYiAoQk4pOiAgQm91bmRhcnkgTmV1dHJhbAovLyBzIChCKTogICBQYXJhZ3JhcGggU2VwYXJhdG9yCi8vIHQgKFMpOiAgIFNlZ21lbnQgU2VwYXJhdG9yCi8vIHcgKFdTKTogIFdoaXRlc3BhY2UKLy8gTiAoT04pOiAgT3RoZXIgTmV1dHJhbHMKCi8vIFJldHVybnMgbnVsbCBpZiBjaGFyYWN0ZXJzIGFyZSBvcmRlcmVkIGFzIHRoZXkgYXBwZWFyCi8vIChsZWZ0LXRvLXJpZ2h0KSwgb3IgYW4gYXJyYXkgb2Ygc2VjdGlvbnMgKHtmcm9tLCB0bywgbGV2ZWx9Ci8vIG9iamVjdHMpIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IG9jY3VyIHZpc3VhbGx5Lgp2YXIgYmlkaU9yZGVyaW5nID0gKGZ1bmN0aW9uKCkgewogIC8vIENoYXJhY3RlciB0eXBlcyBmb3IgY29kZXBvaW50cyAwIHRvIDB4ZmYKICB2YXIgbG93VHlwZXMgPSAiYmJiYmJiYmJidHN0d3NiYmJiYmJiYmJiYmJiYnNzc3R3Tk4lJSVOTk5OTk4sTixOMTExMTExMTExMU5OTk5OTk5MTExMTExMTExMTExMTExMTExMTExMTExMTE5OTk5OTkxMTExMTExMTExMTExMTExMTExMTExMTExMTk5OTmJiYmJiYnNiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYixOJSUlJU5OTk5MTk5OTk4lJTExTkxOTk4xTE5OTk5OTExMTExMTExMTExMTExMTExMTExMTExOTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTE4iCiAgLy8gQ2hhcmFjdGVyIHR5cGVzIGZvciBjb2RlcG9pbnRzIDB4NjAwIHRvIDB4NmZmCiAgdmFyIGFyYWJpY1R5cGVzID0gInJycnJycnJycnJycixyTk5tbW1tbW1ycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycm1tbW1tbW1tbW1tbW1tcnJycnJycm5ubm5ubm5ubm4lbm5ycnJtcnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJtbW1tbW1tbW1tbW1tbW1tbW1tTm1tbW0iCiAgZnVuY3Rpb24gY2hhclR5cGUoY29kZSkgewogICAgaWYgKGNvZGUgPD0gMHhmNykgeyByZXR1cm4gbG93VHlwZXMuY2hhckF0KGNvZGUpIH0KICAgIGVsc2UgaWYgKDB4NTkwIDw9IGNvZGUgJiYgY29kZSA8PSAweDVmNCkgeyByZXR1cm4gIlIiIH0KICAgIGVsc2UgaWYgKDB4NjAwIDw9IGNvZGUgJiYgY29kZSA8PSAweDZlZCkgeyByZXR1cm4gYXJhYmljVHlwZXMuY2hhckF0KGNvZGUgLSAweDYwMCkgfQogICAgZWxzZSBpZiAoMHg2ZWUgPD0gY29kZSAmJiBjb2RlIDw9IDB4OGFjKSB7IHJldHVybiAiciIgfQogICAgZWxzZSBpZiAoMHgyMDAwIDw9IGNvZGUgJiYgY29kZSA8PSAweDIwMGIpIHsgcmV0dXJuICJ3IiB9CiAgICBlbHNlIGlmIChjb2RlID09IDB4MjAwYykgeyByZXR1cm4gImIiIH0KICAgIGVsc2UgeyByZXR1cm4gIkwiIH0KICB9CgogIHZhciBiaWRpUkUgPSAvW1x1MDU5MC1cdTA1ZjRcdTA2MDAtXHUwNmZmXHUwNzAwLVx1MDhhY10vCiAgdmFyIGlzTmV1dHJhbCA9IC9bc3R3Tl0vLCBpc1N0cm9uZyA9IC9bTFJyXS8sIGNvdW50c0FzTGVmdCA9IC9bTGIxbl0vLCBjb3VudHNBc051bSA9IC9bMW5dLwogIC8vIEJyb3dzZXJzIHNlZW0gdG8gYWx3YXlzIHRyZWF0IHRoZSBib3VuZGFyaWVzIG9mIGJsb2NrIGVsZW1lbnRzIGFzIGJlaW5nIEwuCiAgdmFyIG91dGVyVHlwZSA9ICJMIgoKICBmdW5jdGlvbiBCaWRpU3BhbihsZXZlbCwgZnJvbSwgdG8pIHsKICAgIHRoaXMubGV2ZWwgPSBsZXZlbAogICAgdGhpcy5mcm9tID0gZnJvbTsgdGhpcy50byA9IHRvCiAgfQoKICByZXR1cm4gZnVuY3Rpb24oc3RyKSB7CiAgICBpZiAoIWJpZGlSRS50ZXN0KHN0cikpIHsgcmV0dXJuIGZhbHNlIH0KICAgIHZhciBsZW4gPSBzdHIubGVuZ3RoLCB0eXBlcyA9IFtdCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKQogICAgICB7IHR5cGVzLnB1c2goY2hhclR5cGUoc3RyLmNoYXJDb2RlQXQoaSkpKSB9CgogICAgLy8gVzEuIEV4YW1pbmUgZWFjaCBub24tc3BhY2luZyBtYXJrIChOU00pIGluIHRoZSBsZXZlbCBydW4sIGFuZAogICAgLy8gY2hhbmdlIHRoZSB0eXBlIG9mIHRoZSBOU00gdG8gdGhlIHR5cGUgb2YgdGhlIHByZXZpb3VzCiAgICAvLyBjaGFyYWN0ZXIuIElmIHRoZSBOU00gaXMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBsZXZlbCBydW4sIGl0IHdpbGwKICAgIC8vIGdldCB0aGUgdHlwZSBvZiBzb3IuCiAgICBmb3IgKHZhciBpJDEgPSAwLCBwcmV2ID0gb3V0ZXJUeXBlOyBpJDEgPCBsZW47ICsraSQxKSB7CiAgICAgIHZhciB0eXBlID0gdHlwZXNbaSQxXQogICAgICBpZiAodHlwZSA9PSAibSIpIHsgdHlwZXNbaSQxXSA9IHByZXYgfQogICAgICBlbHNlIHsgcHJldiA9IHR5cGUgfQogICAgfQoKICAgIC8vIFcyLiBTZWFyY2ggYmFja3dhcmRzIGZyb20gZWFjaCBpbnN0YW5jZSBvZiBhIEV1cm9wZWFuIG51bWJlcgogICAgLy8gdW50aWwgdGhlIGZpcnN0IHN0cm9uZyB0eXBlIChSLCBMLCBBTCwgb3Igc29yKSBpcyBmb3VuZC4gSWYgYW4KICAgIC8vIEFMIGlzIGZvdW5kLCBjaGFuZ2UgdGhlIHR5cGUgb2YgdGhlIEV1cm9wZWFuIG51bWJlciB0byBBcmFiaWMKICAgIC8vIG51bWJlci4KICAgIC8vIFczLiBDaGFuZ2UgYWxsIEFMcyB0byBSLgogICAgZm9yICh2YXIgaSQyID0gMCwgY3VyID0gb3V0ZXJUeXBlOyBpJDIgPCBsZW47ICsraSQyKSB7CiAgICAgIHZhciB0eXBlJDEgPSB0eXBlc1tpJDJdCiAgICAgIGlmICh0eXBlJDEgPT0gIjEiICYmIGN1ciA9PSAiciIpIHsgdHlwZXNbaSQyXSA9ICJuIiB9CiAgICAgIGVsc2UgaWYgKGlzU3Ryb25nLnRlc3QodHlwZSQxKSkgeyBjdXIgPSB0eXBlJDE7IGlmICh0eXBlJDEgPT0gInIiKSB7IHR5cGVzW2kkMl0gPSAiUiIgfSB9CiAgICB9CgogICAgLy8gVzQuIEEgc2luZ2xlIEV1cm9wZWFuIHNlcGFyYXRvciBiZXR3ZWVuIHR3byBFdXJvcGVhbiBudW1iZXJzCiAgICAvLyBjaGFuZ2VzIHRvIGEgRXVyb3BlYW4gbnVtYmVyLiBBIHNpbmdsZSBjb21tb24gc2VwYXJhdG9yIGJldHdlZW4KICAgIC8vIHR3byBudW1iZXJzIG9mIHRoZSBzYW1lIHR5cGUgY2hhbmdlcyB0byB0aGF0IHR5cGUuCiAgICBmb3IgKHZhciBpJDMgPSAxLCBwcmV2JDEgPSB0eXBlc1swXTsgaSQzIDwgbGVuIC0gMTsgKytpJDMpIHsKICAgICAgdmFyIHR5cGUkMiA9IHR5cGVzW2kkM10KICAgICAgaWYgKHR5cGUkMiA9PSAiKyIgJiYgcHJldiQxID09ICIxIiAmJiB0eXBlc1tpJDMrMV0gPT0gIjEiKSB7IHR5cGVzW2kkM10gPSAiMSIgfQogICAgICBlbHNlIGlmICh0eXBlJDIgPT0gIiwiICYmIHByZXYkMSA9PSB0eXBlc1tpJDMrMV0gJiYKICAgICAgICAgICAgICAgKHByZXYkMSA9PSAiMSIgfHwgcHJldiQxID09ICJuIikpIHsgdHlwZXNbaSQzXSA9IHByZXYkMSB9CiAgICAgIHByZXYkMSA9IHR5cGUkMgogICAgfQoKICAgIC8vIFc1LiBBIHNlcXVlbmNlIG9mIEV1cm9wZWFuIHRlcm1pbmF0b3JzIGFkamFjZW50IHRvIEV1cm9wZWFuCiAgICAvLyBudW1iZXJzIGNoYW5nZXMgdG8gYWxsIEV1cm9wZWFuIG51bWJlcnMuCiAgICAvLyBXNi4gT3RoZXJ3aXNlLCBzZXBhcmF0b3JzIGFuZCB0ZXJtaW5hdG9ycyBjaGFuZ2UgdG8gT3RoZXIKICAgIC8vIE5ldXRyYWwuCiAgICBmb3IgKHZhciBpJDQgPSAwOyBpJDQgPCBsZW47ICsraSQ0KSB7CiAgICAgIHZhciB0eXBlJDMgPSB0eXBlc1tpJDRdCiAgICAgIGlmICh0eXBlJDMgPT0gIiwiKSB7IHR5cGVzW2kkNF0gPSAiTiIgfQogICAgICBlbHNlIGlmICh0eXBlJDMgPT0gIiUiKSB7CiAgICAgICAgdmFyIGVuZCA9IHZvaWQgMAogICAgICAgIGZvciAoZW5kID0gaSQ0ICsgMTsgZW5kIDwgbGVuICYmIHR5cGVzW2VuZF0gPT0gIiUiOyArK2VuZCkge30KICAgICAgICB2YXIgcmVwbGFjZSA9IChpJDQgJiYgdHlwZXNbaSQ0LTFdID09ICIhIikgfHwgKGVuZCA8IGxlbiAmJiB0eXBlc1tlbmRdID09ICIxIikgPyAiMSIgOiAiTiIKICAgICAgICBmb3IgKHZhciBqID0gaSQ0OyBqIDwgZW5kOyArK2opIHsgdHlwZXNbal0gPSByZXBsYWNlIH0KICAgICAgICBpJDQgPSBlbmQgLSAxCiAgICAgIH0KICAgIH0KCiAgICAvLyBXNy4gU2VhcmNoIGJhY2t3YXJkcyBmcm9tIGVhY2ggaW5zdGFuY2Ugb2YgYSBFdXJvcGVhbiBudW1iZXIKICAgIC8vIHVudGlsIHRoZSBmaXJzdCBzdHJvbmcgdHlwZSAoUiwgTCwgb3Igc29yKSBpcyBmb3VuZC4gSWYgYW4gTCBpcwogICAgLy8gZm91bmQsIHRoZW4gY2hhbmdlIHRoZSB0eXBlIG9mIHRoZSBFdXJvcGVhbiBudW1iZXIgdG8gTC4KICAgIGZvciAodmFyIGkkNSA9IDAsIGN1ciQxID0gb3V0ZXJUeXBlOyBpJDUgPCBsZW47ICsraSQ1KSB7CiAgICAgIHZhciB0eXBlJDQgPSB0eXBlc1tpJDVdCiAgICAgIGlmIChjdXIkMSA9PSAiTCIgJiYgdHlwZSQ0ID09ICIxIikgeyB0eXBlc1tpJDVdID0gIkwiIH0KICAgICAgZWxzZSBpZiAoaXNTdHJvbmcudGVzdCh0eXBlJDQpKSB7IGN1ciQxID0gdHlwZSQ0IH0KICAgIH0KCiAgICAvLyBOMS4gQSBzZXF1ZW5jZSBvZiBuZXV0cmFscyB0YWtlcyB0aGUgZGlyZWN0aW9uIG9mIHRoZQogICAgLy8gc3Vycm91bmRpbmcgc3Ryb25nIHRleHQgaWYgdGhlIHRleHQgb24gYm90aCBzaWRlcyBoYXMgdGhlIHNhbWUKICAgIC8vIGRpcmVjdGlvbi4gRXVyb3BlYW4gYW5kIEFyYWJpYyBudW1iZXJzIGFjdCBhcyBpZiB0aGV5IHdlcmUgUiBpbgogICAgLy8gdGVybXMgb2YgdGhlaXIgaW5mbHVlbmNlIG9uIG5ldXRyYWxzLiBTdGFydC1vZi1sZXZlbC1ydW4gKHNvcikKICAgIC8vIGFuZCBlbmQtb2YtbGV2ZWwtcnVuIChlb3IpIGFyZSB1c2VkIGF0IGxldmVsIHJ1biBib3VuZGFyaWVzLgogICAgLy8gTjIuIEFueSByZW1haW5pbmcgbmV1dHJhbHMgdGFrZSB0aGUgZW1iZWRkaW5nIGRpcmVjdGlvbi4KICAgIGZvciAodmFyIGkkNiA9IDA7IGkkNiA8IGxlbjsgKytpJDYpIHsKICAgICAgaWYgKGlzTmV1dHJhbC50ZXN0KHR5cGVzW2kkNl0pKSB7CiAgICAgICAgdmFyIGVuZCQxID0gdm9pZCAwCiAgICAgICAgZm9yIChlbmQkMSA9IGkkNiArIDE7IGVuZCQxIDwgbGVuICYmIGlzTmV1dHJhbC50ZXN0KHR5cGVzW2VuZCQxXSk7ICsrZW5kJDEpIHt9CiAgICAgICAgdmFyIGJlZm9yZSA9IChpJDYgPyB0eXBlc1tpJDYtMV0gOiBvdXRlclR5cGUpID09ICJMIgogICAgICAgIHZhciBhZnRlciA9IChlbmQkMSA8IGxlbiA/IHR5cGVzW2VuZCQxXSA6IG91dGVyVHlwZSkgPT0gIkwiCiAgICAgICAgdmFyIHJlcGxhY2UkMSA9IGJlZm9yZSB8fCBhZnRlciA/ICJMIiA6ICJSIgogICAgICAgIGZvciAodmFyIGokMSA9IGkkNjsgaiQxIDwgZW5kJDE7ICsraiQxKSB7IHR5cGVzW2okMV0gPSByZXBsYWNlJDEgfQogICAgICAgIGkkNiA9IGVuZCQxIC0gMQogICAgICB9CiAgICB9CgogICAgLy8gSGVyZSB3ZSBkZXBhcnQgZnJvbSB0aGUgZG9jdW1lbnRlZCBhbGdvcml0aG0sIGluIG9yZGVyIHRvIGF2b2lkCiAgICAvLyBidWlsZGluZyB1cCBhbiBhY3R1YWwgbGV2ZWxzIGFycmF5LiBTaW5jZSB0aGVyZSBhcmUgb25seSB0aHJlZQogICAgLy8gbGV2ZWxzICgwLCAxLCAyKSBpbiBhbiBpbXBsZW1lbnRhdGlvbiB0aGF0IGRvZXNuJ3QgdGFrZQogICAgLy8gZXhwbGljaXQgZW1iZWRkaW5nIGludG8gYWNjb3VudCwgd2UgY2FuIGJ1aWxkIHVwIHRoZSBvcmRlciBvbgogICAgLy8gdGhlIGZseSwgd2l0aG91dCBmb2xsb3dpbmcgdGhlIGxldmVsLWJhc2VkIGFsZ29yaXRobS4KICAgIHZhciBvcmRlciA9IFtdLCBtCiAgICBmb3IgKHZhciBpJDcgPSAwOyBpJDcgPCBsZW47KSB7CiAgICAgIGlmIChjb3VudHNBc0xlZnQudGVzdCh0eXBlc1tpJDddKSkgewogICAgICAgIHZhciBzdGFydCA9IGkkNwogICAgICAgIGZvciAoKytpJDc7IGkkNyA8IGxlbiAmJiBjb3VudHNBc0xlZnQudGVzdCh0eXBlc1tpJDddKTsgKytpJDcpIHt9CiAgICAgICAgb3JkZXIucHVzaChuZXcgQmlkaVNwYW4oMCwgc3RhcnQsIGkkNykpCiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIHBvcyA9IGkkNywgYXQgPSBvcmRlci5sZW5ndGgKICAgICAgICBmb3IgKCsraSQ3OyBpJDcgPCBsZW4gJiYgdHlwZXNbaSQ3XSAhPSAiTCI7ICsraSQ3KSB7fQogICAgICAgIGZvciAodmFyIGokMiA9IHBvczsgaiQyIDwgaSQ3OykgewogICAgICAgICAgaWYgKGNvdW50c0FzTnVtLnRlc3QodHlwZXNbaiQyXSkpIHsKICAgICAgICAgICAgaWYgKHBvcyA8IGokMikgeyBvcmRlci5zcGxpY2UoYXQsIDAsIG5ldyBCaWRpU3BhbigxLCBwb3MsIGokMikpIH0KICAgICAgICAgICAgdmFyIG5zdGFydCA9IGokMgogICAgICAgICAgICBmb3IgKCsraiQyOyBqJDIgPCBpJDcgJiYgY291bnRzQXNOdW0udGVzdCh0eXBlc1tqJDJdKTsgKytqJDIpIHt9CiAgICAgICAgICAgIG9yZGVyLnNwbGljZShhdCwgMCwgbmV3IEJpZGlTcGFuKDIsIG5zdGFydCwgaiQyKSkKICAgICAgICAgICAgcG9zID0gaiQyCiAgICAgICAgICB9IGVsc2UgeyArK2okMiB9CiAgICAgICAgfQogICAgICAgIGlmIChwb3MgPCBpJDcpIHsgb3JkZXIuc3BsaWNlKGF0LCAwLCBuZXcgQmlkaVNwYW4oMSwgcG9zLCBpJDcpKSB9CiAgICAgIH0KICAgIH0KICAgIGlmIChvcmRlclswXS5sZXZlbCA9PSAxICYmIChtID0gc3RyLm1hdGNoKC9eXHMrLykpKSB7CiAgICAgIG9yZGVyWzBdLmZyb20gPSBtWzBdLmxlbmd0aAogICAgICBvcmRlci51bnNoaWZ0KG5ldyBCaWRpU3BhbigwLCAwLCBtWzBdLmxlbmd0aCkpCiAgICB9CiAgICBpZiAobHN0KG9yZGVyKS5sZXZlbCA9PSAxICYmIChtID0gc3RyLm1hdGNoKC9ccyskLykpKSB7CiAgICAgIGxzdChvcmRlcikudG8gLT0gbVswXS5sZW5ndGgKICAgICAgb3JkZXIucHVzaChuZXcgQmlkaVNwYW4oMCwgbGVuIC0gbVswXS5sZW5ndGgsIGxlbikpCiAgICB9CiAgICBpZiAob3JkZXJbMF0ubGV2ZWwgPT0gMikKICAgICAgeyBvcmRlci51bnNoaWZ0KG5ldyBCaWRpU3BhbigxLCBvcmRlclswXS50bywgb3JkZXJbMF0udG8pKSB9CiAgICBpZiAob3JkZXJbMF0ubGV2ZWwgIT0gbHN0KG9yZGVyKS5sZXZlbCkKICAgICAgeyBvcmRlci5wdXNoKG5ldyBCaWRpU3BhbihvcmRlclswXS5sZXZlbCwgbGVuLCBsZW4pKSB9CgogICAgcmV0dXJuIG9yZGVyCiAgfQp9KSgpCgovLyBHZXQgdGhlIGJpZGkgb3JkZXJpbmcgZm9yIHRoZSBnaXZlbiBsaW5lIChhbmQgY2FjaGUgaXQpLiBSZXR1cm5zCi8vIGZhbHNlIGZvciBsaW5lcyB0aGF0IGFyZSBmdWxseSBsZWZ0LXRvLXJpZ2h0LCBhbmQgYW4gYXJyYXkgb2YKLy8gQmlkaVNwYW4gb2JqZWN0cyBvdGhlcndpc2UuCmZ1bmN0aW9uIGdldE9yZGVyKGxpbmUpIHsKICB2YXIgb3JkZXIgPSBsaW5lLm9yZGVyCiAgaWYgKG9yZGVyID09IG51bGwpIHsgb3JkZXIgPSBsaW5lLm9yZGVyID0gYmlkaU9yZGVyaW5nKGxpbmUudGV4dCkgfQogIHJldHVybiBvcmRlcgp9CgovLyBFVkVOVCBIQU5ETElORwoKLy8gTGlnaHR3ZWlnaHQgZXZlbnQgZnJhbWV3b3JrLiBvbi9vZmYgYWxzbyB3b3JrIG9uIERPTSBub2RlcywKLy8gcmVnaXN0ZXJpbmcgbmF0aXZlIERPTSBoYW5kbGVycy4KCnZhciBvbiA9IGZ1bmN0aW9uKGVtaXR0ZXIsIHR5cGUsIGYpIHsKICBpZiAoZW1pdHRlci5hZGRFdmVudExpc3RlbmVyKQogICAgeyBlbWl0dGVyLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgZiwgZmFsc2UpIH0KICBlbHNlIGlmIChlbWl0dGVyLmF0dGFjaEV2ZW50KQogICAgeyBlbWl0dGVyLmF0dGFjaEV2ZW50KCJvbiIgKyB0eXBlLCBmKSB9CiAgZWxzZSB7CiAgICB2YXIgbWFwJCQxID0gZW1pdHRlci5faGFuZGxlcnMgfHwgKGVtaXR0ZXIuX2hhbmRsZXJzID0ge30pCiAgICB2YXIgYXJyID0gbWFwJCQxW3R5cGVdIHx8IChtYXAkJDFbdHlwZV0gPSBbXSkKICAgIGFyci5wdXNoKGYpCiAgfQp9Cgp2YXIgbm9IYW5kbGVycyA9IFtdCmZ1bmN0aW9uIGdldEhhbmRsZXJzKGVtaXR0ZXIsIHR5cGUsIGNvcHkpIHsKICB2YXIgYXJyID0gZW1pdHRlci5faGFuZGxlcnMgJiYgZW1pdHRlci5faGFuZGxlcnNbdHlwZV0KICBpZiAoY29weSkgeyByZXR1cm4gYXJyICYmIGFyci5sZW5ndGggPiAwID8gYXJyLnNsaWNlKCkgOiBub0hhbmRsZXJzIH0KICBlbHNlIHsgcmV0dXJuIGFyciB8fCBub0hhbmRsZXJzIH0KfQoKZnVuY3Rpb24gb2ZmKGVtaXR0ZXIsIHR5cGUsIGYpIHsKICBpZiAoZW1pdHRlci5yZW1vdmVFdmVudExpc3RlbmVyKQogICAgeyBlbWl0dGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIodHlwZSwgZiwgZmFsc2UpIH0KICBlbHNlIGlmIChlbWl0dGVyLmRldGFjaEV2ZW50KQogICAgeyBlbWl0dGVyLmRldGFjaEV2ZW50KCJvbiIgKyB0eXBlLCBmKSB9CiAgZWxzZSB7CiAgICB2YXIgaGFuZGxlcnMgPSBnZXRIYW5kbGVycyhlbWl0dGVyLCB0eXBlLCBmYWxzZSkKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaGFuZGxlcnMubGVuZ3RoOyArK2kpCiAgICAgIHsgaWYgKGhhbmRsZXJzW2ldID09IGYpIHsgaGFuZGxlcnMuc3BsaWNlKGksIDEpOyBicmVhayB9IH0KICB9Cn0KCmZ1bmN0aW9uIHNpZ25hbChlbWl0dGVyLCB0eXBlIC8qLCB2YWx1ZXMuLi4qLykgewogIHZhciBoYW5kbGVycyA9IGdldEhhbmRsZXJzKGVtaXR0ZXIsIHR5cGUsIHRydWUpCiAgaWYgKCFoYW5kbGVycy5sZW5ndGgpIHsgcmV0dXJuIH0KICB2YXIgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMikKICBmb3IgKHZhciBpID0gMDsgaSA8IGhhbmRsZXJzLmxlbmd0aDsgKytpKSB7IGhhbmRsZXJzW2ldLmFwcGx5KG51bGwsIGFyZ3MpIH0KfQoKLy8gVGhlIERPTSBldmVudHMgdGhhdCBDb2RlTWlycm9yIGhhbmRsZXMgY2FuIGJlIG92ZXJyaWRkZW4gYnkKLy8gcmVnaXN0ZXJpbmcgYSAobm9uLURPTSkgaGFuZGxlciBvbiB0aGUgZWRpdG9yIGZvciB0aGUgZXZlbnQgbmFtZSwKLy8gYW5kIHByZXZlbnREZWZhdWx0LWluZyB0aGUgZXZlbnQgaW4gdGhhdCBoYW5kbGVyLgpmdW5jdGlvbiBzaWduYWxET01FdmVudChjbSwgZSwgb3ZlcnJpZGUpIHsKICBpZiAodHlwZW9mIGUgPT0gInN0cmluZyIpCiAgICB7IGUgPSB7dHlwZTogZSwgcHJldmVudERlZmF1bHQ6IGZ1bmN0aW9uKCkgeyB0aGlzLmRlZmF1bHRQcmV2ZW50ZWQgPSB0cnVlIH19IH0KICBzaWduYWwoY20sIG92ZXJyaWRlIHx8IGUudHlwZSwgY20sIGUpCiAgcmV0dXJuIGVfZGVmYXVsdFByZXZlbnRlZChlKSB8fCBlLmNvZGVtaXJyb3JJZ25vcmUKfQoKZnVuY3Rpb24gc2lnbmFsQ3Vyc29yQWN0aXZpdHkoY20pIHsKICB2YXIgYXJyID0gY20uX2hhbmRsZXJzICYmIGNtLl9oYW5kbGVycy5jdXJzb3JBY3Rpdml0eQogIGlmICghYXJyKSB7IHJldHVybiB9CiAgdmFyIHNldCA9IGNtLmN1ck9wLmN1cnNvckFjdGl2aXR5SGFuZGxlcnMgfHwgKGNtLmN1ck9wLmN1cnNvckFjdGl2aXR5SGFuZGxlcnMgPSBbXSkKICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7ICsraSkgeyBpZiAoaW5kZXhPZihzZXQsIGFycltpXSkgPT0gLTEpCiAgICB7IHNldC5wdXNoKGFycltpXSkgfSB9Cn0KCmZ1bmN0aW9uIGhhc0hhbmRsZXIoZW1pdHRlciwgdHlwZSkgewogIHJldHVybiBnZXRIYW5kbGVycyhlbWl0dGVyLCB0eXBlKS5sZW5ndGggPiAwCn0KCi8vIEFkZCBvbiBhbmQgb2ZmIG1ldGhvZHMgdG8gYSBjb25zdHJ1Y3RvcidzIHByb3RvdHlwZSwgdG8gbWFrZQovLyByZWdpc3RlcmluZyBldmVudHMgb24gc3VjaCBvYmplY3RzIG1vcmUgY29udmVuaWVudC4KZnVuY3Rpb24gZXZlbnRNaXhpbihjdG9yKSB7CiAgY3Rvci5wcm90b3R5cGUub24gPSBmdW5jdGlvbih0eXBlLCBmKSB7b24odGhpcywgdHlwZSwgZil9CiAgY3Rvci5wcm90b3R5cGUub2ZmID0gZnVuY3Rpb24odHlwZSwgZikge29mZih0aGlzLCB0eXBlLCBmKX0KfQoKLy8gRHVlIHRvIHRoZSBmYWN0IHRoYXQgd2Ugc3RpbGwgc3VwcG9ydCBqdXJhc3NpYyBJRSB2ZXJzaW9ucywgc29tZQovLyBjb21wYXRpYmlsaXR5IHdyYXBwZXJzIGFyZSBuZWVkZWQuCgpmdW5jdGlvbiBlX3ByZXZlbnREZWZhdWx0KGUpIHsKICBpZiAoZS5wcmV2ZW50RGVmYXVsdCkgeyBlLnByZXZlbnREZWZhdWx0KCkgfQogIGVsc2UgeyBlLnJldHVyblZhbHVlID0gZmFsc2UgfQp9CmZ1bmN0aW9uIGVfc3RvcFByb3BhZ2F0aW9uKGUpIHsKICBpZiAoZS5zdG9wUHJvcGFnYXRpb24pIHsgZS5zdG9wUHJvcGFnYXRpb24oKSB9CiAgZWxzZSB7IGUuY2FuY2VsQnViYmxlID0gdHJ1ZSB9Cn0KZnVuY3Rpb24gZV9kZWZhdWx0UHJldmVudGVkKGUpIHsKICByZXR1cm4gZS5kZWZhdWx0UHJldmVudGVkICE9IG51bGwgPyBlLmRlZmF1bHRQcmV2ZW50ZWQgOiBlLnJldHVyblZhbHVlID09IGZhbHNlCn0KZnVuY3Rpb24gZV9zdG9wKGUpIHtlX3ByZXZlbnREZWZhdWx0KGUpOyBlX3N0b3BQcm9wYWdhdGlvbihlKX0KCmZ1bmN0aW9uIGVfdGFyZ2V0KGUpIHtyZXR1cm4gZS50YXJnZXQgfHwgZS5zcmNFbGVtZW50fQpmdW5jdGlvbiBlX2J1dHRvbihlKSB7CiAgdmFyIGIgPSBlLndoaWNoCiAgaWYgKGIgPT0gbnVsbCkgewogICAgaWYgKGUuYnV0dG9uICYgMSkgeyBiID0gMSB9CiAgICBlbHNlIGlmIChlLmJ1dHRvbiAmIDIpIHsgYiA9IDMgfQogICAgZWxzZSBpZiAoZS5idXR0b24gJiA0KSB7IGIgPSAyIH0KICB9CiAgaWYgKG1hYyAmJiBlLmN0cmxLZXkgJiYgYiA9PSAxKSB7IGIgPSAzIH0KICByZXR1cm4gYgp9CgovLyBEZXRlY3QgZHJhZy1hbmQtZHJvcAp2YXIgZHJhZ0FuZERyb3AgPSBmdW5jdGlvbigpIHsKICAvLyBUaGVyZSBpcyAqc29tZSoga2luZCBvZiBkcmFnLWFuZC1kcm9wIHN1cHBvcnQgaW4gSUU2LTgsIGJ1dCBJCiAgLy8gY291bGRuJ3QgZ2V0IGl0IHRvIHdvcmsgeWV0LgogIGlmIChpZSAmJiBpZV92ZXJzaW9uIDwgOSkgeyByZXR1cm4gZmFsc2UgfQogIHZhciBkaXYgPSBlbHQoJ2RpdicpCiAgcmV0dXJuICJkcmFnZ2FibGUiIGluIGRpdiB8fCAiZHJhZ0Ryb3AiIGluIGRpdgp9KCkKCnZhciB6d3NwU3VwcG9ydGVkCmZ1bmN0aW9uIHplcm9XaWR0aEVsZW1lbnQobWVhc3VyZSkgewogIGlmICh6d3NwU3VwcG9ydGVkID09IG51bGwpIHsKICAgIHZhciB0ZXN0ID0gZWx0KCJzcGFuIiwgIlx1MjAwYiIpCiAgICByZW1vdmVDaGlsZHJlbkFuZEFkZChtZWFzdXJlLCBlbHQoInNwYW4iLCBbdGVzdCwgZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIngiKV0pKQogICAgaWYgKG1lYXN1cmUuZmlyc3RDaGlsZC5vZmZzZXRIZWlnaHQgIT0gMCkKICAgICAgeyB6d3NwU3VwcG9ydGVkID0gdGVzdC5vZmZzZXRXaWR0aCA8PSAxICYmIHRlc3Qub2Zmc2V0SGVpZ2h0ID4gMiAmJiAhKGllICYmIGllX3ZlcnNpb24gPCA4KSB9CiAgfQogIHZhciBub2RlID0gendzcFN1cHBvcnRlZCA/IGVsdCgic3BhbiIsICJcdTIwMGIiKSA6CiAgICBlbHQoInNwYW4iLCAiXHUwMGEwIiwgbnVsbCwgImRpc3BsYXk6IGlubGluZS1ibG9jazsgd2lkdGg6IDFweDsgbWFyZ2luLXJpZ2h0OiAtMXB4IikKICBub2RlLnNldEF0dHJpYnV0ZSgiY20tdGV4dCIsICIiKQogIHJldHVybiBub2RlCn0KCi8vIEZlYXR1cmUtZGV0ZWN0IElFJ3MgY3J1bW15IGNsaWVudCByZWN0IHJlcG9ydGluZyBmb3IgYmlkaSB0ZXh0CnZhciBiYWRCaWRpUmVjdHMKZnVuY3Rpb24gaGFzQmFkQmlkaVJlY3RzKG1lYXN1cmUpIHsKICBpZiAoYmFkQmlkaVJlY3RzICE9IG51bGwpIHsgcmV0dXJuIGJhZEJpZGlSZWN0cyB9CiAgdmFyIHR4dCA9IHJlbW92ZUNoaWxkcmVuQW5kQWRkKG1lYXN1cmUsIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCJBXHUwNjJlQSIpKQogIHZhciByMCA9IHJhbmdlKHR4dCwgMCwgMSkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkKICB2YXIgcjEgPSByYW5nZSh0eHQsIDEsIDIpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpCiAgcmVtb3ZlQ2hpbGRyZW4obWVhc3VyZSkKICBpZiAoIXIwIHx8IHIwLmxlZnQgPT0gcjAucmlnaHQpIHsgcmV0dXJuIGZhbHNlIH0gLy8gU2FmYXJpIHJldHVybnMgbnVsbCBpbiBzb21lIGNhc2VzICgjMjc4MCkKICByZXR1cm4gYmFkQmlkaVJlY3RzID0gKHIxLnJpZ2h0IC0gcjAucmlnaHQgPCAzKQp9CgovLyBTZWUgaWYgIiIuc3BsaXQgaXMgdGhlIGJyb2tlbiBJRSB2ZXJzaW9uLCBpZiBzbywgcHJvdmlkZSBhbgovLyBhbHRlcm5hdGl2ZSB3YXkgdG8gc3BsaXQgbGluZXMuCnZhciBzcGxpdExpbmVzQXV0byA9ICJcblxuYiIuc3BsaXQoL1xuLykubGVuZ3RoICE9IDMgPyBmdW5jdGlvbiAoc3RyaW5nKSB7CiAgdmFyIHBvcyA9IDAsIHJlc3VsdCA9IFtdLCBsID0gc3RyaW5nLmxlbmd0aAogIHdoaWxlIChwb3MgPD0gbCkgewogICAgdmFyIG5sID0gc3RyaW5nLmluZGV4T2YoIlxuIiwgcG9zKQogICAgaWYgKG5sID09IC0xKSB7IG5sID0gc3RyaW5nLmxlbmd0aCB9CiAgICB2YXIgbGluZSA9IHN0cmluZy5zbGljZShwb3MsIHN0cmluZy5jaGFyQXQobmwgLSAxKSA9PSAiXHIiID8gbmwgLSAxIDogbmwpCiAgICB2YXIgcnQgPSBsaW5lLmluZGV4T2YoIlxyIikKICAgIGlmIChydCAhPSAtMSkgewogICAgICByZXN1bHQucHVzaChsaW5lLnNsaWNlKDAsIHJ0KSkKICAgICAgcG9zICs9IHJ0ICsgMQogICAgfSBlbHNlIHsKICAgICAgcmVzdWx0LnB1c2gobGluZSkKICAgICAgcG9zID0gbmwgKyAxCiAgICB9CiAgfQogIHJldHVybiByZXN1bHQKfSA6IGZ1bmN0aW9uIChzdHJpbmcpIHsgcmV0dXJuIHN0cmluZy5zcGxpdCgvXHJcbj98XG4vKTsgfQoKdmFyIGhhc1NlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24gPyBmdW5jdGlvbiAodGUpIHsKICB0cnkgeyByZXR1cm4gdGUuc2VsZWN0aW9uU3RhcnQgIT0gdGUuc2VsZWN0aW9uRW5kIH0KICBjYXRjaChlKSB7IHJldHVybiBmYWxzZSB9Cn0gOiBmdW5jdGlvbiAodGUpIHsKICB2YXIgcmFuZ2UkJDEKICB0cnkge3JhbmdlJCQxID0gdGUub3duZXJEb2N1bWVudC5zZWxlY3Rpb24uY3JlYXRlUmFuZ2UoKX0KICBjYXRjaChlKSB7fQogIGlmICghcmFuZ2UkJDEgfHwgcmFuZ2UkJDEucGFyZW50RWxlbWVudCgpICE9IHRlKSB7IHJldHVybiBmYWxzZSB9CiAgcmV0dXJuIHJhbmdlJCQxLmNvbXBhcmVFbmRQb2ludHMoIlN0YXJ0VG9FbmQiLCByYW5nZSQkMSkgIT0gMAp9Cgp2YXIgaGFzQ29weUV2ZW50ID0gKGZ1bmN0aW9uICgpIHsKICB2YXIgZSA9IGVsdCgiZGl2IikKICBpZiAoIm9uY29weSIgaW4gZSkgeyByZXR1cm4gdHJ1ZSB9CiAgZS5zZXRBdHRyaWJ1dGUoIm9uY29weSIsICJyZXR1cm47IikKICByZXR1cm4gdHlwZW9mIGUub25jb3B5ID09ICJmdW5jdGlvbiIKfSkoKQoKdmFyIGJhZFpvb21lZFJlY3RzID0gbnVsbApmdW5jdGlvbiBoYXNCYWRab29tZWRSZWN0cyhtZWFzdXJlKSB7CiAgaWYgKGJhZFpvb21lZFJlY3RzICE9IG51bGwpIHsgcmV0dXJuIGJhZFpvb21lZFJlY3RzIH0KICB2YXIgbm9kZSA9IHJlbW92ZUNoaWxkcmVuQW5kQWRkKG1lYXN1cmUsIGVsdCgic3BhbiIsICJ4IikpCiAgdmFyIG5vcm1hbCA9IG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkKICB2YXIgZnJvbVJhbmdlID0gcmFuZ2Uobm9kZSwgMCwgMSkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkKICByZXR1cm4gYmFkWm9vbWVkUmVjdHMgPSBNYXRoLmFicyhub3JtYWwubGVmdCAtIGZyb21SYW5nZS5sZWZ0KSA+IDEKfQoKLy8gS25vd24gbW9kZXMsIGJ5IG5hbWUgYW5kIGJ5IE1JTUUKdmFyIG1vZGVzID0ge307CnZhciBtaW1lTW9kZXMgPSB7fQoKLy8gRXh0cmEgYXJndW1lbnRzIGFyZSBzdG9yZWQgYXMgdGhlIG1vZGUncyBkZXBlbmRlbmNpZXMsIHdoaWNoIGlzCi8vIHVzZWQgYnkgKGxlZ2FjeSkgbWVjaGFuaXNtcyBsaWtlIGxvYWRtb2RlLmpzIHRvIGF1dG9tYXRpY2FsbHkKLy8gbG9hZCBhIG1vZGUuIChQcmVmZXJyZWQgbWVjaGFuaXNtIGlzIHRoZSByZXF1aXJlL2RlZmluZSBjYWxscy4pCmZ1bmN0aW9uIGRlZmluZU1vZGUobmFtZSwgbW9kZSkgewogIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMikKICAgIHsgbW9kZS5kZXBlbmRlbmNpZXMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpIH0KICBtb2Rlc1tuYW1lXSA9IG1vZGUKfQoKZnVuY3Rpb24gZGVmaW5lTUlNRShtaW1lLCBzcGVjKSB7CiAgbWltZU1vZGVzW21pbWVdID0gc3BlYwp9CgovLyBHaXZlbiBhIE1JTUUgdHlwZSwgYSB7bmFtZSwgLi4ub3B0aW9uc30gY29uZmlnIG9iamVjdCwgb3IgYSBuYW1lCi8vIHN0cmluZywgcmV0dXJuIGEgbW9kZSBjb25maWcgb2JqZWN0LgpmdW5jdGlvbiByZXNvbHZlTW9kZShzcGVjKSB7CiAgaWYgKHR5cGVvZiBzcGVjID09ICJzdHJpbmciICYmIG1pbWVNb2Rlcy5oYXNPd25Qcm9wZXJ0eShzcGVjKSkgewogICAgc3BlYyA9IG1pbWVNb2Rlc1tzcGVjXQogIH0gZWxzZSBpZiAoc3BlYyAmJiB0eXBlb2Ygc3BlYy5uYW1lID09ICJzdHJpbmciICYmIG1pbWVNb2Rlcy5oYXNPd25Qcm9wZXJ0eShzcGVjLm5hbWUpKSB7CiAgICB2YXIgZm91bmQgPSBtaW1lTW9kZXNbc3BlYy5uYW1lXQogICAgaWYgKHR5cGVvZiBmb3VuZCA9PSAic3RyaW5nIikgeyBmb3VuZCA9IHtuYW1lOiBmb3VuZH0gfQogICAgc3BlYyA9IGNyZWF0ZU9iaihmb3VuZCwgc3BlYykKICAgIHNwZWMubmFtZSA9IGZvdW5kLm5hbWUKICB9IGVsc2UgaWYgKHR5cGVvZiBzcGVjID09ICJzdHJpbmciICYmIC9eW1x3XC1dK1wvW1x3XC1dK1wreG1sJC8udGVzdChzcGVjKSkgewogICAgcmV0dXJuIHJlc29sdmVNb2RlKCJhcHBsaWNhdGlvbi94bWwiKQogIH0gZWxzZSBpZiAodHlwZW9mIHNwZWMgPT0gInN0cmluZyIgJiYgL15bXHdcLV0rXC9bXHdcLV0rXCtqc29uJC8udGVzdChzcGVjKSkgewogICAgcmV0dXJuIHJlc29sdmVNb2RlKCJhcHBsaWNhdGlvbi9qc29uIikKICB9CiAgaWYgKHR5cGVvZiBzcGVjID09ICJzdHJpbmciKSB7IHJldHVybiB7bmFtZTogc3BlY30gfQogIGVsc2UgeyByZXR1cm4gc3BlYyB8fCB7bmFtZTogIm51bGwifSB9Cn0KCi8vIEdpdmVuIGEgbW9kZSBzcGVjIChhbnl0aGluZyB0aGF0IHJlc29sdmVNb2RlIGFjY2VwdHMpLCBmaW5kIGFuZAovLyBpbml0aWFsaXplIGFuIGFjdHVhbCBtb2RlIG9iamVjdC4KZnVuY3Rpb24gZ2V0TW9kZShvcHRpb25zLCBzcGVjKSB7CiAgc3BlYyA9IHJlc29sdmVNb2RlKHNwZWMpCiAgdmFyIG1mYWN0b3J5ID0gbW9kZXNbc3BlYy5uYW1lXQogIGlmICghbWZhY3RvcnkpIHsgcmV0dXJuIGdldE1vZGUob3B0aW9ucywgInRleHQvcGxhaW4iKSB9CiAgdmFyIG1vZGVPYmogPSBtZmFjdG9yeShvcHRpb25zLCBzcGVjKQogIGlmIChtb2RlRXh0ZW5zaW9ucy5oYXNPd25Qcm9wZXJ0eShzcGVjLm5hbWUpKSB7CiAgICB2YXIgZXh0cyA9IG1vZGVFeHRlbnNpb25zW3NwZWMubmFtZV0KICAgIGZvciAodmFyIHByb3AgaW4gZXh0cykgewogICAgICBpZiAoIWV4dHMuaGFzT3duUHJvcGVydHkocHJvcCkpIHsgY29udGludWUgfQogICAgICBpZiAobW9kZU9iai5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgeyBtb2RlT2JqWyJfIiArIHByb3BdID0gbW9kZU9ialtwcm9wXSB9CiAgICAgIG1vZGVPYmpbcHJvcF0gPSBleHRzW3Byb3BdCiAgICB9CiAgfQogIG1vZGVPYmoubmFtZSA9IHNwZWMubmFtZQogIGlmIChzcGVjLmhlbHBlclR5cGUpIHsgbW9kZU9iai5oZWxwZXJUeXBlID0gc3BlYy5oZWxwZXJUeXBlIH0KICBpZiAoc3BlYy5tb2RlUHJvcHMpIHsgZm9yICh2YXIgcHJvcCQxIGluIHNwZWMubW9kZVByb3BzKQogICAgeyBtb2RlT2JqW3Byb3AkMV0gPSBzcGVjLm1vZGVQcm9wc1twcm9wJDFdIH0gfQoKICByZXR1cm4gbW9kZU9iagp9CgovLyBUaGlzIGNhbiBiZSB1c2VkIHRvIGF0dGFjaCBwcm9wZXJ0aWVzIHRvIG1vZGUgb2JqZWN0cyBmcm9tCi8vIG91dHNpZGUgdGhlIGFjdHVhbCBtb2RlIGRlZmluaXRpb24uCnZhciBtb2RlRXh0ZW5zaW9ucyA9IHt9CmZ1bmN0aW9uIGV4dGVuZE1vZGUobW9kZSwgcHJvcGVydGllcykgewogIHZhciBleHRzID0gbW9kZUV4dGVuc2lvbnMuaGFzT3duUHJvcGVydHkobW9kZSkgPyBtb2RlRXh0ZW5zaW9uc1ttb2RlXSA6IChtb2RlRXh0ZW5zaW9uc1ttb2RlXSA9IHt9KQogIGNvcHlPYmoocHJvcGVydGllcywgZXh0cykKfQoKZnVuY3Rpb24gY29weVN0YXRlKG1vZGUsIHN0YXRlKSB7CiAgaWYgKHN0YXRlID09PSB0cnVlKSB7IHJldHVybiBzdGF0ZSB9CiAgaWYgKG1vZGUuY29weVN0YXRlKSB7IHJldHVybiBtb2RlLmNvcHlTdGF0ZShzdGF0ZSkgfQogIHZhciBuc3RhdGUgPSB7fQogIGZvciAodmFyIG4gaW4gc3RhdGUpIHsKICAgIHZhciB2YWwgPSBzdGF0ZVtuXQogICAgaWYgKHZhbCBpbnN0YW5jZW9mIEFycmF5KSB7IHZhbCA9IHZhbC5jb25jYXQoW10pIH0KICAgIG5zdGF0ZVtuXSA9IHZhbAogIH0KICByZXR1cm4gbnN0YXRlCn0KCi8vIEdpdmVuIGEgbW9kZSBhbmQgYSBzdGF0ZSAoZm9yIHRoYXQgbW9kZSksIGZpbmQgdGhlIGlubmVyIG1vZGUgYW5kCi8vIHN0YXRlIGF0IHRoZSBwb3NpdGlvbiB0aGF0IHRoZSBzdGF0ZSByZWZlcnMgdG8uCmZ1bmN0aW9uIGlubmVyTW9kZShtb2RlLCBzdGF0ZSkgewogIHZhciBpbmZvCiAgd2hpbGUgKG1vZGUuaW5uZXJNb2RlKSB7CiAgICBpbmZvID0gbW9kZS5pbm5lck1vZGUoc3RhdGUpCiAgICBpZiAoIWluZm8gfHwgaW5mby5tb2RlID09IG1vZGUpIHsgYnJlYWsgfQogICAgc3RhdGUgPSBpbmZvLnN0YXRlCiAgICBtb2RlID0gaW5mby5tb2RlCiAgfQogIHJldHVybiBpbmZvIHx8IHttb2RlOiBtb2RlLCBzdGF0ZTogc3RhdGV9Cn0KCmZ1bmN0aW9uIHN0YXJ0U3RhdGUobW9kZSwgYTEsIGEyKSB7CiAgcmV0dXJuIG1vZGUuc3RhcnRTdGF0ZSA/IG1vZGUuc3RhcnRTdGF0ZShhMSwgYTIpIDogdHJ1ZQp9CgovLyBTVFJJTkcgU1RSRUFNCgovLyBGZWQgdG8gdGhlIG1vZGUgcGFyc2VycywgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byBtYWtlCi8vIHBhcnNlcnMgbW9yZSBzdWNjaW5jdC4KCnZhciBTdHJpbmdTdHJlYW0gPSBmdW5jdGlvbihzdHJpbmcsIHRhYlNpemUpIHsKICB0aGlzLnBvcyA9IHRoaXMuc3RhcnQgPSAwCiAgdGhpcy5zdHJpbmcgPSBzdHJpbmcKICB0aGlzLnRhYlNpemUgPSB0YWJTaXplIHx8IDgKICB0aGlzLmxhc3RDb2x1bW5Qb3MgPSB0aGlzLmxhc3RDb2x1bW5WYWx1ZSA9IDAKICB0aGlzLmxpbmVTdGFydCA9IDAKfQoKU3RyaW5nU3RyZWFtLnByb3RvdHlwZSA9IHsKICBlb2w6IGZ1bmN0aW9uKCkge3JldHVybiB0aGlzLnBvcyA+PSB0aGlzLnN0cmluZy5sZW5ndGh9LAogIHNvbDogZnVuY3Rpb24oKSB7cmV0dXJuIHRoaXMucG9zID09IHRoaXMubGluZVN0YXJ0fSwKICBwZWVrOiBmdW5jdGlvbigpIHtyZXR1cm4gdGhpcy5zdHJpbmcuY2hhckF0KHRoaXMucG9zKSB8fCB1bmRlZmluZWR9LAogIG5leHQ6IGZ1bmN0aW9uKCkgewogICAgaWYgKHRoaXMucG9zIDwgdGhpcy5zdHJpbmcubGVuZ3RoKQogICAgICB7IHJldHVybiB0aGlzLnN0cmluZy5jaGFyQXQodGhpcy5wb3MrKykgfQogIH0sCiAgZWF0OiBmdW5jdGlvbihtYXRjaCkgewogICAgdmFyIGNoID0gdGhpcy5zdHJpbmcuY2hhckF0KHRoaXMucG9zKQogICAgdmFyIG9rCiAgICBpZiAodHlwZW9mIG1hdGNoID09ICJzdHJpbmciKSB7IG9rID0gY2ggPT0gbWF0Y2ggfQogICAgZWxzZSB7IG9rID0gY2ggJiYgKG1hdGNoLnRlc3QgPyBtYXRjaC50ZXN0KGNoKSA6IG1hdGNoKGNoKSkgfQogICAgaWYgKG9rKSB7Kyt0aGlzLnBvczsgcmV0dXJuIGNofQogIH0sCiAgZWF0V2hpbGU6IGZ1bmN0aW9uKG1hdGNoKSB7CiAgICB2YXIgc3RhcnQgPSB0aGlzLnBvcwogICAgd2hpbGUgKHRoaXMuZWF0KG1hdGNoKSl7fQogICAgcmV0dXJuIHRoaXMucG9zID4gc3RhcnQKICB9LAogIGVhdFNwYWNlOiBmdW5jdGlvbigpIHsKICAgIHZhciB0aGlzJDEgPSB0aGlzOwoKICAgIHZhciBzdGFydCA9IHRoaXMucG9zCiAgICB3aGlsZSAoL1tcc1x1MDBhMF0vLnRlc3QodGhpcy5zdHJpbmcuY2hhckF0KHRoaXMucG9zKSkpIHsgKyt0aGlzJDEucG9zIH0KICAgIHJldHVybiB0aGlzLnBvcyA+IHN0YXJ0CiAgfSwKICBza2lwVG9FbmQ6IGZ1bmN0aW9uKCkge3RoaXMucG9zID0gdGhpcy5zdHJpbmcubGVuZ3RofSwKICBza2lwVG86IGZ1bmN0aW9uKGNoKSB7CiAgICB2YXIgZm91bmQgPSB0aGlzLnN0cmluZy5pbmRleE9mKGNoLCB0aGlzLnBvcykKICAgIGlmIChmb3VuZCA+IC0xKSB7dGhpcy5wb3MgPSBmb3VuZDsgcmV0dXJuIHRydWV9CiAgfSwKICBiYWNrVXA6IGZ1bmN0aW9uKG4pIHt0aGlzLnBvcyAtPSBufSwKICBjb2x1bW46IGZ1bmN0aW9uKCkgewogICAgaWYgKHRoaXMubGFzdENvbHVtblBvcyA8IHRoaXMuc3RhcnQpIHsKICAgICAgdGhpcy5sYXN0Q29sdW1uVmFsdWUgPSBjb3VudENvbHVtbih0aGlzLnN0cmluZywgdGhpcy5zdGFydCwgdGhpcy50YWJTaXplLCB0aGlzLmxhc3RDb2x1bW5Qb3MsIHRoaXMubGFzdENvbHVtblZhbHVlKQogICAgICB0aGlzLmxhc3RDb2x1bW5Qb3MgPSB0aGlzLnN0YXJ0CiAgICB9CiAgICByZXR1cm4gdGhpcy5sYXN0Q29sdW1uVmFsdWUgLSAodGhpcy5saW5lU3RhcnQgPyBjb3VudENvbHVtbih0aGlzLnN0cmluZywgdGhpcy5saW5lU3RhcnQsIHRoaXMudGFiU2l6ZSkgOiAwKQogIH0sCiAgaW5kZW50YXRpb246IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIGNvdW50Q29sdW1uKHRoaXMuc3RyaW5nLCBudWxsLCB0aGlzLnRhYlNpemUpIC0KICAgICAgKHRoaXMubGluZVN0YXJ0ID8gY291bnRDb2x1bW4odGhpcy5zdHJpbmcsIHRoaXMubGluZVN0YXJ0LCB0aGlzLnRhYlNpemUpIDogMCkKICB9LAogIG1hdGNoOiBmdW5jdGlvbihwYXR0ZXJuLCBjb25zdW1lLCBjYXNlSW5zZW5zaXRpdmUpIHsKICAgIGlmICh0eXBlb2YgcGF0dGVybiA9PSAic3RyaW5nIikgewogICAgICB2YXIgY2FzZWQgPSBmdW5jdGlvbiAoc3RyKSB7IHJldHVybiBjYXNlSW5zZW5zaXRpdmUgPyBzdHIudG9Mb3dlckNhc2UoKSA6IHN0cjsgfQogICAgICB2YXIgc3Vic3RyID0gdGhpcy5zdHJpbmcuc3Vic3RyKHRoaXMucG9zLCBwYXR0ZXJuLmxlbmd0aCkKICAgICAgaWYgKGNhc2VkKHN1YnN0cikgPT0gY2FzZWQocGF0dGVybikpIHsKICAgICAgICBpZiAoY29uc3VtZSAhPT0gZmFsc2UpIHsgdGhpcy5wb3MgKz0gcGF0dGVybi5sZW5ndGggfQogICAgICAgIHJldHVybiB0cnVlCiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHZhciBtYXRjaCA9IHRoaXMuc3RyaW5nLnNsaWNlKHRoaXMucG9zKS5tYXRjaChwYXR0ZXJuKQogICAgICBpZiAobWF0Y2ggJiYgbWF0Y2guaW5kZXggPiAwKSB7IHJldHVybiBudWxsIH0KICAgICAgaWYgKG1hdGNoICYmIGNvbnN1bWUgIT09IGZhbHNlKSB7IHRoaXMucG9zICs9IG1hdGNoWzBdLmxlbmd0aCB9CiAgICAgIHJldHVybiBtYXRjaAogICAgfQogIH0sCiAgY3VycmVudDogZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5zdHJpbmcuc2xpY2UodGhpcy5zdGFydCwgdGhpcy5wb3MpfSwKICBoaWRlRmlyc3RDaGFyczogZnVuY3Rpb24obiwgaW5uZXIpIHsKICAgIHRoaXMubGluZVN0YXJ0ICs9IG4KICAgIHRyeSB7IHJldHVybiBpbm5lcigpIH0KICAgIGZpbmFsbHkgeyB0aGlzLmxpbmVTdGFydCAtPSBuIH0KICB9Cn0KCi8vIENvbXB1dGUgYSBzdHlsZSBhcnJheSAoYW4gYXJyYXkgc3RhcnRpbmcgd2l0aCBhIG1vZGUgZ2VuZXJhdGlvbgovLyAtLSBmb3IgaW52YWxpZGF0aW9uIC0tIGZvbGxvd2VkIGJ5IHBhaXJzIG9mIGVuZCBwb3NpdGlvbnMgYW5kCi8vIHN0eWxlIHN0cmluZ3MpLCB3aGljaCBpcyB1c2VkIHRvIGhpZ2hsaWdodCB0aGUgdG9rZW5zIG9uIHRoZQovLyBsaW5lLgpmdW5jdGlvbiBoaWdobGlnaHRMaW5lKGNtLCBsaW5lLCBzdGF0ZSwgZm9yY2VUb0VuZCkgewogIC8vIEEgc3R5bGVzIGFycmF5IGFsd2F5cyBzdGFydHMgd2l0aCBhIG51bWJlciBpZGVudGlmeWluZyB0aGUKICAvLyBtb2RlL292ZXJsYXlzIHRoYXQgaXQgaXMgYmFzZWQgb24gKGZvciBlYXN5IGludmFsaWRhdGlvbikuCiAgdmFyIHN0ID0gW2NtLnN0YXRlLm1vZGVHZW5dLCBsaW5lQ2xhc3NlcyA9IHt9CiAgLy8gQ29tcHV0ZSB0aGUgYmFzZSBhcnJheSBvZiBzdHlsZXMKICBydW5Nb2RlKGNtLCBsaW5lLnRleHQsIGNtLmRvYy5tb2RlLCBzdGF0ZSwgZnVuY3Rpb24gKGVuZCwgc3R5bGUpIHsgcmV0dXJuIHN0LnB1c2goZW5kLCBzdHlsZSk7IH0sCiAgICBsaW5lQ2xhc3NlcywgZm9yY2VUb0VuZCkKCiAgLy8gUnVuIG92ZXJsYXlzLCBhZGp1c3Qgc3R5bGUgYXJyYXkuCiAgdmFyIGxvb3AgPSBmdW5jdGlvbiAoIG8gKSB7CiAgICB2YXIgb3ZlcmxheSA9IGNtLnN0YXRlLm92ZXJsYXlzW29dLCBpID0gMSwgYXQgPSAwCiAgICBydW5Nb2RlKGNtLCBsaW5lLnRleHQsIG92ZXJsYXkubW9kZSwgdHJ1ZSwgZnVuY3Rpb24gKGVuZCwgc3R5bGUpIHsKICAgICAgdmFyIHN0YXJ0ID0gaQogICAgICAvLyBFbnN1cmUgdGhlcmUncyBhIHRva2VuIGVuZCBhdCB0aGUgY3VycmVudCBwb3NpdGlvbiwgYW5kIHRoYXQgaSBwb2ludHMgYXQgaXQKICAgICAgd2hpbGUgKGF0IDwgZW5kKSB7CiAgICAgICAgdmFyIGlfZW5kID0gc3RbaV0KICAgICAgICBpZiAoaV9lbmQgPiBlbmQpCiAgICAgICAgICB7IHN0LnNwbGljZShpLCAxLCBlbmQsIHN0W2krMV0sIGlfZW5kKSB9CiAgICAgICAgaSArPSAyCiAgICAgICAgYXQgPSBNYXRoLm1pbihlbmQsIGlfZW5kKQogICAgICB9CiAgICAgIGlmICghc3R5bGUpIHsgcmV0dXJuIH0KICAgICAgaWYgKG92ZXJsYXkub3BhcXVlKSB7CiAgICAgICAgc3Quc3BsaWNlKHN0YXJ0LCBpIC0gc3RhcnQsIGVuZCwgIm92ZXJsYXkgIiArIHN0eWxlKQogICAgICAgIGkgPSBzdGFydCArIDIKICAgICAgfSBlbHNlIHsKICAgICAgICBmb3IgKDsgc3RhcnQgPCBpOyBzdGFydCArPSAyKSB7CiAgICAgICAgICB2YXIgY3VyID0gc3Rbc3RhcnQrMV0KICAgICAgICAgIHN0W3N0YXJ0KzFdID0gKGN1ciA/IGN1ciArICIgIiA6ICIiKSArICJvdmVybGF5ICIgKyBzdHlsZQogICAgICAgIH0KICAgICAgfQogICAgfSwgbGluZUNsYXNzZXMpCiAgfTsKCiAgZm9yICh2YXIgbyA9IDA7IG8gPCBjbS5zdGF0ZS5vdmVybGF5cy5sZW5ndGg7ICsrbykgbG9vcCggbyApOwoKICByZXR1cm4ge3N0eWxlczogc3QsIGNsYXNzZXM6IGxpbmVDbGFzc2VzLmJnQ2xhc3MgfHwgbGluZUNsYXNzZXMudGV4dENsYXNzID8gbGluZUNsYXNzZXMgOiBudWxsfQp9CgpmdW5jdGlvbiBnZXRMaW5lU3R5bGVzKGNtLCBsaW5lLCB1cGRhdGVGcm9udGllcikgewogIGlmICghbGluZS5zdHlsZXMgfHwgbGluZS5zdHlsZXNbMF0gIT0gY20uc3RhdGUubW9kZUdlbikgewogICAgdmFyIHN0YXRlID0gZ2V0U3RhdGVCZWZvcmUoY20sIGxpbmVObyhsaW5lKSkKICAgIHZhciByZXN1bHQgPSBoaWdobGlnaHRMaW5lKGNtLCBsaW5lLCBsaW5lLnRleHQubGVuZ3RoID4gY20ub3B0aW9ucy5tYXhIaWdobGlnaHRMZW5ndGggPyBjb3B5U3RhdGUoY20uZG9jLm1vZGUsIHN0YXRlKSA6IHN0YXRlKQogICAgbGluZS5zdGF0ZUFmdGVyID0gc3RhdGUKICAgIGxpbmUuc3R5bGVzID0gcmVzdWx0LnN0eWxlcwogICAgaWYgKHJlc3VsdC5jbGFzc2VzKSB7IGxpbmUuc3R5bGVDbGFzc2VzID0gcmVzdWx0LmNsYXNzZXMgfQogICAgZWxzZSBpZiAobGluZS5zdHlsZUNsYXNzZXMpIHsgbGluZS5zdHlsZUNsYXNzZXMgPSBudWxsIH0KICAgIGlmICh1cGRhdGVGcm9udGllciA9PT0gY20uZG9jLmZyb250aWVyKSB7IGNtLmRvYy5mcm9udGllcisrIH0KICB9CiAgcmV0dXJuIGxpbmUuc3R5bGVzCn0KCmZ1bmN0aW9uIGdldFN0YXRlQmVmb3JlKGNtLCBuLCBwcmVjaXNlKSB7CiAgdmFyIGRvYyA9IGNtLmRvYywgZGlzcGxheSA9IGNtLmRpc3BsYXkKICBpZiAoIWRvYy5tb2RlLnN0YXJ0U3RhdGUpIHsgcmV0dXJuIHRydWUgfQogIHZhciBwb3MgPSBmaW5kU3RhcnRMaW5lKGNtLCBuLCBwcmVjaXNlKSwgc3RhdGUgPSBwb3MgPiBkb2MuZmlyc3QgJiYgZ2V0TGluZShkb2MsIHBvcy0xKS5zdGF0ZUFmdGVyCiAgaWYgKCFzdGF0ZSkgeyBzdGF0ZSA9IHN0YXJ0U3RhdGUoZG9jLm1vZGUpIH0KICBlbHNlIHsgc3RhdGUgPSBjb3B5U3RhdGUoZG9jLm1vZGUsIHN0YXRlKSB9CiAgZG9jLml0ZXIocG9zLCBuLCBmdW5jdGlvbiAobGluZSkgewogICAgcHJvY2Vzc0xpbmUoY20sIGxpbmUudGV4dCwgc3RhdGUpCiAgICB2YXIgc2F2ZSA9IHBvcyA9PSBuIC0gMSB8fCBwb3MgJSA1ID09IDAgfHwgcG9zID49IGRpc3BsYXkudmlld0Zyb20gJiYgcG9zIDwgZGlzcGxheS52aWV3VG8KICAgIGxpbmUuc3RhdGVBZnRlciA9IHNhdmUgPyBjb3B5U3RhdGUoZG9jLm1vZGUsIHN0YXRlKSA6IG51bGwKICAgICsrcG9zCiAgfSkKICBpZiAocHJlY2lzZSkgeyBkb2MuZnJvbnRpZXIgPSBwb3MgfQogIHJldHVybiBzdGF0ZQp9CgovLyBMaWdodHdlaWdodCBmb3JtIG9mIGhpZ2hsaWdodCAtLSBwcm9jZWVkIG92ZXIgdGhpcyBsaW5lIGFuZAovLyB1cGRhdGUgc3RhdGUsIGJ1dCBkb24ndCBzYXZlIGEgc3R5bGUgYXJyYXkuIFVzZWQgZm9yIGxpbmVzIHRoYXQKLy8gYXJlbid0IGN1cnJlbnRseSB2aXNpYmxlLgpmdW5jdGlvbiBwcm9jZXNzTGluZShjbSwgdGV4dCwgc3RhdGUsIHN0YXJ0QXQpIHsKICB2YXIgbW9kZSA9IGNtLmRvYy5tb2RlCiAgdmFyIHN0cmVhbSA9IG5ldyBTdHJpbmdTdHJlYW0odGV4dCwgY20ub3B0aW9ucy50YWJTaXplKQogIHN0cmVhbS5zdGFydCA9IHN0cmVhbS5wb3MgPSBzdGFydEF0IHx8IDAKICBpZiAodGV4dCA9PSAiIikgeyBjYWxsQmxhbmtMaW5lKG1vZGUsIHN0YXRlKSB9CiAgd2hpbGUgKCFzdHJlYW0uZW9sKCkpIHsKICAgIHJlYWRUb2tlbihtb2RlLCBzdHJlYW0sIHN0YXRlKQogICAgc3RyZWFtLnN0YXJ0ID0gc3RyZWFtLnBvcwogIH0KfQoKZnVuY3Rpb24gY2FsbEJsYW5rTGluZShtb2RlLCBzdGF0ZSkgewogIGlmIChtb2RlLmJsYW5rTGluZSkgeyByZXR1cm4gbW9kZS5ibGFua0xpbmUoc3RhdGUpIH0KICBpZiAoIW1vZGUuaW5uZXJNb2RlKSB7IHJldHVybiB9CiAgdmFyIGlubmVyID0gaW5uZXJNb2RlKG1vZGUsIHN0YXRlKQogIGlmIChpbm5lci5tb2RlLmJsYW5rTGluZSkgeyByZXR1cm4gaW5uZXIubW9kZS5ibGFua0xpbmUoaW5uZXIuc3RhdGUpIH0KfQoKZnVuY3Rpb24gcmVhZFRva2VuKG1vZGUsIHN0cmVhbSwgc3RhdGUsIGlubmVyKSB7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCAxMDsgaSsrKSB7CiAgICBpZiAoaW5uZXIpIHsgaW5uZXJbMF0gPSBpbm5lck1vZGUobW9kZSwgc3RhdGUpLm1vZGUgfQogICAgdmFyIHN0eWxlID0gbW9kZS50b2tlbihzdHJlYW0sIHN0YXRlKQogICAgaWYgKHN0cmVhbS5wb3MgPiBzdHJlYW0uc3RhcnQpIHsgcmV0dXJuIHN0eWxlIH0KICB9CiAgdGhyb3cgbmV3IEVycm9yKCJNb2RlICIgKyBtb2RlLm5hbWUgKyAiIGZhaWxlZCB0byBhZHZhbmNlIHN0cmVhbS4iKQp9CgovLyBVdGlsaXR5IGZvciBnZXRUb2tlbkF0IGFuZCBnZXRMaW5lVG9rZW5zCmZ1bmN0aW9uIHRha2VUb2tlbihjbSwgcG9zLCBwcmVjaXNlLCBhc0FycmF5KSB7CiAgdmFyIGdldE9iaiA9IGZ1bmN0aW9uIChjb3B5KSB7IHJldHVybiAoewogICAgc3RhcnQ6IHN0cmVhbS5zdGFydCwgZW5kOiBzdHJlYW0ucG9zLAogICAgc3RyaW5nOiBzdHJlYW0uY3VycmVudCgpLAogICAgdHlwZTogc3R5bGUgfHwgbnVsbCwKICAgIHN0YXRlOiBjb3B5ID8gY29weVN0YXRlKGRvYy5tb2RlLCBzdGF0ZSkgOiBzdGF0ZQogIH0pOyB9CgogIHZhciBkb2MgPSBjbS5kb2MsIG1vZGUgPSBkb2MubW9kZSwgc3R5bGUKICBwb3MgPSBjbGlwUG9zKGRvYywgcG9zKQogIHZhciBsaW5lID0gZ2V0TGluZShkb2MsIHBvcy5saW5lKSwgc3RhdGUgPSBnZXRTdGF0ZUJlZm9yZShjbSwgcG9zLmxpbmUsIHByZWNpc2UpCiAgdmFyIHN0cmVhbSA9IG5ldyBTdHJpbmdTdHJlYW0obGluZS50ZXh0LCBjbS5vcHRpb25zLnRhYlNpemUpLCB0b2tlbnMKICBpZiAoYXNBcnJheSkgeyB0b2tlbnMgPSBbXSB9CiAgd2hpbGUgKChhc0FycmF5IHx8IHN0cmVhbS5wb3MgPCBwb3MuY2gpICYmICFzdHJlYW0uZW9sKCkpIHsKICAgIHN0cmVhbS5zdGFydCA9IHN0cmVhbS5wb3MKICAgIHN0eWxlID0gcmVhZFRva2VuKG1vZGUsIHN0cmVhbSwgc3RhdGUpCiAgICBpZiAoYXNBcnJheSkgeyB0b2tlbnMucHVzaChnZXRPYmoodHJ1ZSkpIH0KICB9CiAgcmV0dXJuIGFzQXJyYXkgPyB0b2tlbnMgOiBnZXRPYmooKQp9CgpmdW5jdGlvbiBleHRyYWN0TGluZUNsYXNzZXModHlwZSwgb3V0cHV0KSB7CiAgaWYgKHR5cGUpIHsgZm9yICg7OykgewogICAgdmFyIGxpbmVDbGFzcyA9IHR5cGUubWF0Y2goLyg/Ol58XHMrKWxpbmUtKGJhY2tncm91bmQtKT8oXFMrKS8pCiAgICBpZiAoIWxpbmVDbGFzcykgeyBicmVhayB9CiAgICB0eXBlID0gdHlwZS5zbGljZSgwLCBsaW5lQ2xhc3MuaW5kZXgpICsgdHlwZS5zbGljZShsaW5lQ2xhc3MuaW5kZXggKyBsaW5lQ2xhc3NbMF0ubGVuZ3RoKQogICAgdmFyIHByb3AgPSBsaW5lQ2xhc3NbMV0gPyAiYmdDbGFzcyIgOiAidGV4dENsYXNzIgogICAgaWYgKG91dHB1dFtwcm9wXSA9PSBudWxsKQogICAgICB7IG91dHB1dFtwcm9wXSA9IGxpbmVDbGFzc1syXSB9CiAgICBlbHNlIGlmICghKG5ldyBSZWdFeHAoIig/Ol58XHMpIiArIGxpbmVDbGFzc1syXSArICIoPzokfFxzKSIpKS50ZXN0KG91dHB1dFtwcm9wXSkpCiAgICAgIHsgb3V0cHV0W3Byb3BdICs9ICIgIiArIGxpbmVDbGFzc1syXSB9CiAgfSB9CiAgcmV0dXJuIHR5cGUKfQoKLy8gUnVuIHRoZSBnaXZlbiBtb2RlJ3MgcGFyc2VyIG92ZXIgYSBsaW5lLCBjYWxsaW5nIGYgZm9yIGVhY2ggdG9rZW4uCmZ1bmN0aW9uIHJ1bk1vZGUoY20sIHRleHQsIG1vZGUsIHN0YXRlLCBmLCBsaW5lQ2xhc3NlcywgZm9yY2VUb0VuZCkgewogIHZhciBmbGF0dGVuU3BhbnMgPSBtb2RlLmZsYXR0ZW5TcGFucwogIGlmIChmbGF0dGVuU3BhbnMgPT0gbnVsbCkgeyBmbGF0dGVuU3BhbnMgPSBjbS5vcHRpb25zLmZsYXR0ZW5TcGFucyB9CiAgdmFyIGN1clN0YXJ0ID0gMCwgY3VyU3R5bGUgPSBudWxsCiAgdmFyIHN0cmVhbSA9IG5ldyBTdHJpbmdTdHJlYW0odGV4dCwgY20ub3B0aW9ucy50YWJTaXplKSwgc3R5bGUKICB2YXIgaW5uZXIgPSBjbS5vcHRpb25zLmFkZE1vZGVDbGFzcyAmJiBbbnVsbF0KICBpZiAodGV4dCA9PSAiIikgeyBleHRyYWN0TGluZUNsYXNzZXMoY2FsbEJsYW5rTGluZShtb2RlLCBzdGF0ZSksIGxpbmVDbGFzc2VzKSB9CiAgd2hpbGUgKCFzdHJlYW0uZW9sKCkpIHsKICAgIGlmIChzdHJlYW0ucG9zID4gY20ub3B0aW9ucy5tYXhIaWdobGlnaHRMZW5ndGgpIHsKICAgICAgZmxhdHRlblNwYW5zID0gZmFsc2UKICAgICAgaWYgKGZvcmNlVG9FbmQpIHsgcHJvY2Vzc0xpbmUoY20sIHRleHQsIHN0YXRlLCBzdHJlYW0ucG9zKSB9CiAgICAgIHN0cmVhbS5wb3MgPSB0ZXh0Lmxlbmd0aAogICAgICBzdHlsZSA9IG51bGwKICAgIH0gZWxzZSB7CiAgICAgIHN0eWxlID0gZXh0cmFjdExpbmVDbGFzc2VzKHJlYWRUb2tlbihtb2RlLCBzdHJlYW0sIHN0YXRlLCBpbm5lciksIGxpbmVDbGFzc2VzKQogICAgfQogICAgaWYgKGlubmVyKSB7CiAgICAgIHZhciBtTmFtZSA9IGlubmVyWzBdLm5hbWUKICAgICAgaWYgKG1OYW1lKSB7IHN0eWxlID0gIm0tIiArIChzdHlsZSA/IG1OYW1lICsgIiAiICsgc3R5bGUgOiBtTmFtZSkgfQogICAgfQogICAgaWYgKCFmbGF0dGVuU3BhbnMgfHwgY3VyU3R5bGUgIT0gc3R5bGUpIHsKICAgICAgd2hpbGUgKGN1clN0YXJ0IDwgc3RyZWFtLnN0YXJ0KSB7CiAgICAgICAgY3VyU3RhcnQgPSBNYXRoLm1pbihzdHJlYW0uc3RhcnQsIGN1clN0YXJ0ICsgNTAwMCkKICAgICAgICBmKGN1clN0YXJ0LCBjdXJTdHlsZSkKICAgICAgfQogICAgICBjdXJTdHlsZSA9IHN0eWxlCiAgICB9CiAgICBzdHJlYW0uc3RhcnQgPSBzdHJlYW0ucG9zCiAgfQogIHdoaWxlIChjdXJTdGFydCA8IHN0cmVhbS5wb3MpIHsKICAgIC8vIFdlYmtpdCBzZWVtcyB0byByZWZ1c2UgdG8gcmVuZGVyIHRleHQgbm9kZXMgbG9uZ2VyIHRoYW4gNTc0NDQKICAgIC8vIGNoYXJhY3RlcnMsIGFuZCByZXR1cm5zIGluYWNjdXJhdGUgbWVhc3VyZW1lbnRzIGluIG5vZGVzCiAgICAvLyBzdGFydGluZyBhcm91bmQgNTAwMCBjaGFycy4KICAgIHZhciBwb3MgPSBNYXRoLm1pbihzdHJlYW0ucG9zLCBjdXJTdGFydCArIDUwMDApCiAgICBmKHBvcywgY3VyU3R5bGUpCiAgICBjdXJTdGFydCA9IHBvcwogIH0KfQoKLy8gRmluZHMgdGhlIGxpbmUgdG8gc3RhcnQgd2l0aCB3aGVuIHN0YXJ0aW5nIGEgcGFyc2UuIFRyaWVzIHRvCi8vIGZpbmQgYSBsaW5lIHdpdGggYSBzdGF0ZUFmdGVyLCBzbyB0aGF0IGl0IGNhbiBzdGFydCB3aXRoIGEKLy8gdmFsaWQgc3RhdGUuIElmIHRoYXQgZmFpbHMsIGl0IHJldHVybnMgdGhlIGxpbmUgd2l0aCB0aGUKLy8gc21hbGxlc3QgaW5kZW50YXRpb24sIHdoaWNoIHRlbmRzIHRvIG5lZWQgdGhlIGxlYXN0IGNvbnRleHQgdG8KLy8gcGFyc2UgY29ycmVjdGx5LgpmdW5jdGlvbiBmaW5kU3RhcnRMaW5lKGNtLCBuLCBwcmVjaXNlKSB7CiAgdmFyIG1pbmluZGVudCwgbWlubGluZSwgZG9jID0gY20uZG9jCiAgdmFyIGxpbSA9IHByZWNpc2UgPyAtMSA6IG4gLSAoY20uZG9jLm1vZGUuaW5uZXJNb2RlID8gMTAwMCA6IDEwMCkKICBmb3IgKHZhciBzZWFyY2ggPSBuOyBzZWFyY2ggPiBsaW07IC0tc2VhcmNoKSB7CiAgICBpZiAoc2VhcmNoIDw9IGRvYy5maXJzdCkgeyByZXR1cm4gZG9jLmZpcnN0IH0KICAgIHZhciBsaW5lID0gZ2V0TGluZShkb2MsIHNlYXJjaCAtIDEpCiAgICBpZiAobGluZS5zdGF0ZUFmdGVyICYmICghcHJlY2lzZSB8fCBzZWFyY2ggPD0gZG9jLmZyb250aWVyKSkgeyByZXR1cm4gc2VhcmNoIH0KICAgIHZhciBpbmRlbnRlZCA9IGNvdW50Q29sdW1uKGxpbmUudGV4dCwgbnVsbCwgY20ub3B0aW9ucy50YWJTaXplKQogICAgaWYgKG1pbmxpbmUgPT0gbnVsbCB8fCBtaW5pbmRlbnQgPiBpbmRlbnRlZCkgewogICAgICBtaW5saW5lID0gc2VhcmNoIC0gMQogICAgICBtaW5pbmRlbnQgPSBpbmRlbnRlZAogICAgfQogIH0KICByZXR1cm4gbWlubGluZQp9CgovLyBMSU5FIERBVEEgU1RSVUNUVVJFCgovLyBMaW5lIG9iamVjdHMuIFRoZXNlIGhvbGQgc3RhdGUgcmVsYXRlZCB0byBhIGxpbmUsIGluY2x1ZGluZwovLyBoaWdobGlnaHRpbmcgaW5mbyAodGhlIHN0eWxlcyBhcnJheSkuCmZ1bmN0aW9uIExpbmUodGV4dCwgbWFya2VkU3BhbnMsIGVzdGltYXRlSGVpZ2h0KSB7CiAgdGhpcy50ZXh0ID0gdGV4dAogIGF0dGFjaE1hcmtlZFNwYW5zKHRoaXMsIG1hcmtlZFNwYW5zKQogIHRoaXMuaGVpZ2h0ID0gZXN0aW1hdGVIZWlnaHQgPyBlc3RpbWF0ZUhlaWdodCh0aGlzKSA6IDEKfQpldmVudE1peGluKExpbmUpCkxpbmUucHJvdG90eXBlLmxpbmVObyA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gbGluZU5vKHRoaXMpIH0KCi8vIENoYW5nZSB0aGUgY29udGVudCAodGV4dCwgbWFya2Vycykgb2YgYSBsaW5lLiBBdXRvbWF0aWNhbGx5Ci8vIGludmFsaWRhdGVzIGNhY2hlZCBpbmZvcm1hdGlvbiBhbmQgdHJpZXMgdG8gcmUtZXN0aW1hdGUgdGhlCi8vIGxpbmUncyBoZWlnaHQuCmZ1bmN0aW9uIHVwZGF0ZUxpbmUobGluZSwgdGV4dCwgbWFya2VkU3BhbnMsIGVzdGltYXRlSGVpZ2h0KSB7CiAgbGluZS50ZXh0ID0gdGV4dAogIGlmIChsaW5lLnN0YXRlQWZ0ZXIpIHsgbGluZS5zdGF0ZUFmdGVyID0gbnVsbCB9CiAgaWYgKGxpbmUuc3R5bGVzKSB7IGxpbmUuc3R5bGVzID0gbnVsbCB9CiAgaWYgKGxpbmUub3JkZXIgIT0gbnVsbCkgeyBsaW5lLm9yZGVyID0gbnVsbCB9CiAgZGV0YWNoTWFya2VkU3BhbnMobGluZSkKICBhdHRhY2hNYXJrZWRTcGFucyhsaW5lLCBtYXJrZWRTcGFucykKICB2YXIgZXN0SGVpZ2h0ID0gZXN0aW1hdGVIZWlnaHQgPyBlc3RpbWF0ZUhlaWdodChsaW5lKSA6IDEKICBpZiAoZXN0SGVpZ2h0ICE9IGxpbmUuaGVpZ2h0KSB7IHVwZGF0ZUxpbmVIZWlnaHQobGluZSwgZXN0SGVpZ2h0KSB9Cn0KCi8vIERldGFjaCBhIGxpbmUgZnJvbSB0aGUgZG9jdW1lbnQgdHJlZSBhbmQgaXRzIG1hcmtlcnMuCmZ1bmN0aW9uIGNsZWFuVXBMaW5lKGxpbmUpIHsKICBsaW5lLnBhcmVudCA9IG51bGwKICBkZXRhY2hNYXJrZWRTcGFucyhsaW5lKQp9CgovLyBDb252ZXJ0IGEgc3R5bGUgYXMgcmV0dXJuZWQgYnkgYSBtb2RlIChlaXRoZXIgbnVsbCwgb3IgYSBzdHJpbmcKLy8gY29udGFpbmluZyBvbmUgb3IgbW9yZSBzdHlsZXMpIHRvIGEgQ1NTIHN0eWxlLiBUaGlzIGlzIGNhY2hlZCwKLy8gYW5kIGFsc28gbG9va3MgZm9yIGxpbmUtd2lkZSBzdHlsZXMuCnZhciBzdHlsZVRvQ2xhc3NDYWNoZSA9IHt9Owp2YXIgc3R5bGVUb0NsYXNzQ2FjaGVXaXRoTW9kZSA9IHt9CmZ1bmN0aW9uIGludGVycHJldFRva2VuU3R5bGUoc3R5bGUsIG9wdGlvbnMpIHsKICBpZiAoIXN0eWxlIHx8IC9eXHMqJC8udGVzdChzdHlsZSkpIHsgcmV0dXJuIG51bGwgfQogIHZhciBjYWNoZSA9IG9wdGlvbnMuYWRkTW9kZUNsYXNzID8gc3R5bGVUb0NsYXNzQ2FjaGVXaXRoTW9kZSA6IHN0eWxlVG9DbGFzc0NhY2hlCiAgcmV0dXJuIGNhY2hlW3N0eWxlXSB8fAogICAgKGNhY2hlW3N0eWxlXSA9IHN0eWxlLnJlcGxhY2UoL1xTKy9nLCAiY20tJCYiKSkKfQoKLy8gUmVuZGVyIHRoZSBET00gcmVwcmVzZW50YXRpb24gb2YgdGhlIHRleHQgb2YgYSBsaW5lLiBBbHNvIGJ1aWxkcwovLyB1cCBhICdsaW5lIG1hcCcsIHdoaWNoIHBvaW50cyBhdCB0aGUgRE9NIG5vZGVzIHRoYXQgcmVwcmVzZW50Ci8vIHNwZWNpZmljIHN0cmV0Y2hlcyBvZiB0ZXh0LCBhbmQgaXMgdXNlZCBieSB0aGUgbWVhc3VyaW5nIGNvZGUuCi8vIFRoZSByZXR1cm5lZCBvYmplY3QgY29udGFpbnMgdGhlIERPTSBub2RlLCB0aGlzIG1hcCwgYW5kCi8vIGluZm9ybWF0aW9uIGFib3V0IGxpbmUtd2lkZSBzdHlsZXMgdGhhdCB3ZXJlIHNldCBieSB0aGUgbW9kZS4KZnVuY3Rpb24gYnVpbGRMaW5lQ29udGVudChjbSwgbGluZVZpZXcpIHsKICAvLyBUaGUgcGFkZGluZy1yaWdodCBmb3JjZXMgdGhlIGVsZW1lbnQgdG8gaGF2ZSBhICdib3JkZXInLCB3aGljaAogIC8vIGlzIG5lZWRlZCBvbiBXZWJraXQgdG8gYmUgYWJsZSB0byBnZXQgbGluZS1sZXZlbCBib3VuZGluZwogIC8vIHJlY3RhbmdsZXMgZm9yIGl0IChpbiBtZWFzdXJlQ2hhcikuCiAgdmFyIGNvbnRlbnQgPSBlbHQoInNwYW4iLCBudWxsLCBudWxsLCB3ZWJraXQgPyAicGFkZGluZy1yaWdodDogLjFweCIgOiBudWxsKQogIHZhciBidWlsZGVyID0ge3ByZTogZWx0KCJwcmUiLCBbY29udGVudF0sICJDb2RlTWlycm9yLWxpbmUiKSwgY29udGVudDogY29udGVudCwKICAgICAgICAgICAgICAgICBjb2w6IDAsIHBvczogMCwgY206IGNtLAogICAgICAgICAgICAgICAgIHRyYWlsaW5nU3BhY2U6IGZhbHNlLAogICAgICAgICAgICAgICAgIHNwbGl0U3BhY2VzOiAoaWUgfHwgd2Via2l0KSAmJiBjbS5nZXRPcHRpb24oImxpbmVXcmFwcGluZyIpfQogIGxpbmVWaWV3Lm1lYXN1cmUgPSB7fQoKICAvLyBJdGVyYXRlIG92ZXIgdGhlIGxvZ2ljYWwgbGluZXMgdGhhdCBtYWtlIHVwIHRoaXMgdmlzdWFsIGxpbmUuCiAgZm9yICh2YXIgaSA9IDA7IGkgPD0gKGxpbmVWaWV3LnJlc3QgPyBsaW5lVmlldy5yZXN0Lmxlbmd0aCA6IDApOyBpKyspIHsKICAgIHZhciBsaW5lID0gaSA/IGxpbmVWaWV3LnJlc3RbaSAtIDFdIDogbGluZVZpZXcubGluZSwgb3JkZXIgPSB2b2lkIDAKICAgIGJ1aWxkZXIucG9zID0gMAogICAgYnVpbGRlci5hZGRUb2tlbiA9IGJ1aWxkVG9rZW4KICAgIC8vIE9wdGlvbmFsbHkgd2lyZSBpbiBzb21lIGhhY2tzIGludG8gdGhlIHRva2VuLXJlbmRlcmluZwogICAgLy8gYWxnb3JpdGhtLCB0byBkZWFsIHdpdGggYnJvd3NlciBxdWlya3MuCiAgICBpZiAoaGFzQmFkQmlkaVJlY3RzKGNtLmRpc3BsYXkubWVhc3VyZSkgJiYgKG9yZGVyID0gZ2V0T3JkZXIobGluZSkpKQogICAgICB7IGJ1aWxkZXIuYWRkVG9rZW4gPSBidWlsZFRva2VuQmFkQmlkaShidWlsZGVyLmFkZFRva2VuLCBvcmRlcikgfQogICAgYnVpbGRlci5tYXAgPSBbXQogICAgdmFyIGFsbG93RnJvbnRpZXJVcGRhdGUgPSBsaW5lVmlldyAhPSBjbS5kaXNwbGF5LmV4dGVybmFsTWVhc3VyZWQgJiYgbGluZU5vKGxpbmUpCiAgICBpbnNlcnRMaW5lQ29udGVudChsaW5lLCBidWlsZGVyLCBnZXRMaW5lU3R5bGVzKGNtLCBsaW5lLCBhbGxvd0Zyb250aWVyVXBkYXRlKSkKICAgIGlmIChsaW5lLnN0eWxlQ2xhc3NlcykgewogICAgICBpZiAobGluZS5zdHlsZUNsYXNzZXMuYmdDbGFzcykKICAgICAgICB7IGJ1aWxkZXIuYmdDbGFzcyA9IGpvaW5DbGFzc2VzKGxpbmUuc3R5bGVDbGFzc2VzLmJnQ2xhc3MsIGJ1aWxkZXIuYmdDbGFzcyB8fCAiIikgfQogICAgICBpZiAobGluZS5zdHlsZUNsYXNzZXMudGV4dENsYXNzKQogICAgICAgIHsgYnVpbGRlci50ZXh0Q2xhc3MgPSBqb2luQ2xhc3NlcyhsaW5lLnN0eWxlQ2xhc3Nlcy50ZXh0Q2xhc3MsIGJ1aWxkZXIudGV4dENsYXNzIHx8ICIiKSB9CiAgICB9CgogICAgLy8gRW5zdXJlIGF0IGxlYXN0IGEgc2luZ2xlIG5vZGUgaXMgcHJlc2VudCwgZm9yIG1lYXN1cmluZy4KICAgIGlmIChidWlsZGVyLm1hcC5sZW5ndGggPT0gMCkKICAgICAgeyBidWlsZGVyLm1hcC5wdXNoKDAsIDAsIGJ1aWxkZXIuY29udGVudC5hcHBlbmRDaGlsZCh6ZXJvV2lkdGhFbGVtZW50KGNtLmRpc3BsYXkubWVhc3VyZSkpKSB9CgogICAgLy8gU3RvcmUgdGhlIG1hcCBhbmQgYSBjYWNoZSBvYmplY3QgZm9yIHRoZSBjdXJyZW50IGxvZ2ljYWwgbGluZQogICAgaWYgKGkgPT0gMCkgewogICAgICBsaW5lVmlldy5tZWFzdXJlLm1hcCA9IGJ1aWxkZXIubWFwCiAgICAgIGxpbmVWaWV3Lm1lYXN1cmUuY2FjaGUgPSB7fQogICAgfSBlbHNlIHsKICAgICAgKGxpbmVWaWV3Lm1lYXN1cmUubWFwcyB8fCAobGluZVZpZXcubWVhc3VyZS5tYXBzID0gW10pKS5wdXNoKGJ1aWxkZXIubWFwKQogICAgICA7KGxpbmVWaWV3Lm1lYXN1cmUuY2FjaGVzIHx8IChsaW5lVmlldy5tZWFzdXJlLmNhY2hlcyA9IFtdKSkucHVzaCh7fSkKICAgIH0KICB9CgogIC8vIFNlZSBpc3N1ZSAjMjkwMQogIGlmICh3ZWJraXQpIHsKICAgIHZhciBsYXN0ID0gYnVpbGRlci5jb250ZW50Lmxhc3RDaGlsZAogICAgaWYgKC9cYmNtLXRhYlxiLy50ZXN0KGxhc3QuY2xhc3NOYW1lKSB8fCAobGFzdC5xdWVyeVNlbGVjdG9yICYmIGxhc3QucXVlcnlTZWxlY3RvcigiLmNtLXRhYiIpKSkKICAgICAgeyBidWlsZGVyLmNvbnRlbnQuY2xhc3NOYW1lID0gImNtLXRhYi13cmFwLWhhY2siIH0KICB9CgogIHNpZ25hbChjbSwgInJlbmRlckxpbmUiLCBjbSwgbGluZVZpZXcubGluZSwgYnVpbGRlci5wcmUpCiAgaWYgKGJ1aWxkZXIucHJlLmNsYXNzTmFtZSkKICAgIHsgYnVpbGRlci50ZXh0Q2xhc3MgPSBqb2luQ2xhc3NlcyhidWlsZGVyLnByZS5jbGFzc05hbWUsIGJ1aWxkZXIudGV4dENsYXNzIHx8ICIiKSB9CgogIHJldHVybiBidWlsZGVyCn0KCmZ1bmN0aW9uIGRlZmF1bHRTcGVjaWFsQ2hhclBsYWNlaG9sZGVyKGNoKSB7CiAgdmFyIHRva2VuID0gZWx0KCJzcGFuIiwgIlx1MjAyMiIsICJjbS1pbnZhbGlkY2hhciIpCiAgdG9rZW4udGl0bGUgPSAiXFx1IiArIGNoLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpCiAgdG9rZW4uc2V0QXR0cmlidXRlKCJhcmlhLWxhYmVsIiwgdG9rZW4udGl0bGUpCiAgcmV0dXJuIHRva2VuCn0KCi8vIEJ1aWxkIHVwIHRoZSBET00gcmVwcmVzZW50YXRpb24gZm9yIGEgc2luZ2xlIHRva2VuLCBhbmQgYWRkIGl0IHRvCi8vIHRoZSBsaW5lIG1hcC4gVGFrZXMgY2FyZSB0byByZW5kZXIgc3BlY2lhbCBjaGFyYWN0ZXJzIHNlcGFyYXRlbHkuCmZ1bmN0aW9uIGJ1aWxkVG9rZW4oYnVpbGRlciwgdGV4dCwgc3R5bGUsIHN0YXJ0U3R5bGUsIGVuZFN0eWxlLCB0aXRsZSwgY3NzKSB7CiAgaWYgKCF0ZXh0KSB7IHJldHVybiB9CiAgdmFyIGRpc3BsYXlUZXh0ID0gYnVpbGRlci5zcGxpdFNwYWNlcyA/IHNwbGl0U3BhY2VzKHRleHQsIGJ1aWxkZXIudHJhaWxpbmdTcGFjZSkgOiB0ZXh0CiAgdmFyIHNwZWNpYWwgPSBidWlsZGVyLmNtLnN0YXRlLnNwZWNpYWxDaGFycywgbXVzdFdyYXAgPSBmYWxzZQogIHZhciBjb250ZW50CiAgaWYgKCFzcGVjaWFsLnRlc3QodGV4dCkpIHsKICAgIGJ1aWxkZXIuY29sICs9IHRleHQubGVuZ3RoCiAgICBjb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZGlzcGxheVRleHQpCiAgICBidWlsZGVyLm1hcC5wdXNoKGJ1aWxkZXIucG9zLCBidWlsZGVyLnBvcyArIHRleHQubGVuZ3RoLCBjb250ZW50KQogICAgaWYgKGllICYmIGllX3ZlcnNpb24gPCA5KSB7IG11c3RXcmFwID0gdHJ1ZSB9CiAgICBidWlsZGVyLnBvcyArPSB0ZXh0Lmxlbmd0aAogIH0gZWxzZSB7CiAgICBjb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpCiAgICB2YXIgcG9zID0gMAogICAgd2hpbGUgKHRydWUpIHsKICAgICAgc3BlY2lhbC5sYXN0SW5kZXggPSBwb3MKICAgICAgdmFyIG0gPSBzcGVjaWFsLmV4ZWModGV4dCkKICAgICAgdmFyIHNraXBwZWQgPSBtID8gbS5pbmRleCAtIHBvcyA6IHRleHQubGVuZ3RoIC0gcG9zCiAgICAgIGlmIChza2lwcGVkKSB7CiAgICAgICAgdmFyIHR4dCA9IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGRpc3BsYXlUZXh0LnNsaWNlKHBvcywgcG9zICsgc2tpcHBlZCkpCiAgICAgICAgaWYgKGllICYmIGllX3ZlcnNpb24gPCA5KSB7IGNvbnRlbnQuYXBwZW5kQ2hpbGQoZWx0KCJzcGFuIiwgW3R4dF0pKSB9CiAgICAgICAgZWxzZSB7IGNvbnRlbnQuYXBwZW5kQ2hpbGQodHh0KSB9CiAgICAgICAgYnVpbGRlci5tYXAucHVzaChidWlsZGVyLnBvcywgYnVpbGRlci5wb3MgKyBza2lwcGVkLCB0eHQpCiAgICAgICAgYnVpbGRlci5jb2wgKz0gc2tpcHBlZAogICAgICAgIGJ1aWxkZXIucG9zICs9IHNraXBwZWQKICAgICAgfQogICAgICBpZiAoIW0pIHsgYnJlYWsgfQogICAgICBwb3MgKz0gc2tpcHBlZCArIDEKICAgICAgdmFyIHR4dCQxID0gdm9pZCAwCiAgICAgIGlmIChtWzBdID09ICJcdCIpIHsKICAgICAgICB2YXIgdGFiU2l6ZSA9IGJ1aWxkZXIuY20ub3B0aW9ucy50YWJTaXplLCB0YWJXaWR0aCA9IHRhYlNpemUgLSBidWlsZGVyLmNvbCAlIHRhYlNpemUKICAgICAgICB0eHQkMSA9IGNvbnRlbnQuYXBwZW5kQ2hpbGQoZWx0KCJzcGFuIiwgc3BhY2VTdHIodGFiV2lkdGgpLCAiY20tdGFiIikpCiAgICAgICAgdHh0JDEuc2V0QXR0cmlidXRlKCJyb2xlIiwgInByZXNlbnRhdGlvbiIpCiAgICAgICAgdHh0JDEuc2V0QXR0cmlidXRlKCJjbS10ZXh0IiwgIlx0IikKICAgICAgICBidWlsZGVyLmNvbCArPSB0YWJXaWR0aAogICAgICB9IGVsc2UgaWYgKG1bMF0gPT0gIlxyIiB8fCBtWzBdID09ICJcbiIpIHsKICAgICAgICB0eHQkMSA9IGNvbnRlbnQuYXBwZW5kQ2hpbGQoZWx0KCJzcGFuIiwgbVswXSA9PSAiXHIiID8gIlx1MjQwZCIgOiAiXHUyNDI0IiwgImNtLWludmFsaWRjaGFyIikpCiAgICAgICAgdHh0JDEuc2V0QXR0cmlidXRlKCJjbS10ZXh0IiwgbVswXSkKICAgICAgICBidWlsZGVyLmNvbCArPSAxCiAgICAgIH0gZWxzZSB7CiAgICAgICAgdHh0JDEgPSBidWlsZGVyLmNtLm9wdGlvbnMuc3BlY2lhbENoYXJQbGFjZWhvbGRlcihtWzBdKQogICAgICAgIHR4dCQxLnNldEF0dHJpYnV0ZSgiY20tdGV4dCIsIG1bMF0pCiAgICAgICAgaWYgKGllICYmIGllX3ZlcnNpb24gPCA5KSB7IGNvbnRlbnQuYXBwZW5kQ2hpbGQoZWx0KCJzcGFuIiwgW3R4dCQxXSkpIH0KICAgICAgICBlbHNlIHsgY29udGVudC5hcHBlbmRDaGlsZCh0eHQkMSkgfQogICAgICAgIGJ1aWxkZXIuY29sICs9IDEKICAgICAgfQogICAgICBidWlsZGVyLm1hcC5wdXNoKGJ1aWxkZXIucG9zLCBidWlsZGVyLnBvcyArIDEsIHR4dCQxKQogICAgICBidWlsZGVyLnBvcysrCiAgICB9CiAgfQogIGJ1aWxkZXIudHJhaWxpbmdTcGFjZSA9IGRpc3BsYXlUZXh0LmNoYXJDb2RlQXQodGV4dC5sZW5ndGggLSAxKSA9PSAzMgogIGlmIChzdHlsZSB8fCBzdGFydFN0eWxlIHx8IGVuZFN0eWxlIHx8IG11c3RXcmFwIHx8IGNzcykgewogICAgdmFyIGZ1bGxTdHlsZSA9IHN0eWxlIHx8ICIiCiAgICBpZiAoc3RhcnRTdHlsZSkgeyBmdWxsU3R5bGUgKz0gc3RhcnRTdHlsZSB9CiAgICBpZiAoZW5kU3R5bGUpIHsgZnVsbFN0eWxlICs9IGVuZFN0eWxlIH0KICAgIHZhciB0b2tlbiA9IGVsdCgic3BhbiIsIFtjb250ZW50XSwgZnVsbFN0eWxlLCBjc3MpCiAgICBpZiAodGl0bGUpIHsgdG9rZW4udGl0bGUgPSB0aXRsZSB9CiAgICByZXR1cm4gYnVpbGRlci5jb250ZW50LmFwcGVuZENoaWxkKHRva2VuKQogIH0KICBidWlsZGVyLmNvbnRlbnQuYXBwZW5kQ2hpbGQoY29udGVudCkKfQoKZnVuY3Rpb24gc3BsaXRTcGFjZXModGV4dCwgdHJhaWxpbmdCZWZvcmUpIHsKICBpZiAodGV4dC5sZW5ndGggPiAxICYmICEvICAvLnRlc3QodGV4dCkpIHsgcmV0dXJuIHRleHQgfQogIHZhciBzcGFjZUJlZm9yZSA9IHRyYWlsaW5nQmVmb3JlLCByZXN1bHQgPSAiIgogIGZvciAodmFyIGkgPSAwOyBpIDwgdGV4dC5sZW5ndGg7IGkrKykgewogICAgdmFyIGNoID0gdGV4dC5jaGFyQXQoaSkKICAgIGlmIChjaCA9PSAiICIgJiYgc3BhY2VCZWZvcmUgJiYgKGkgPT0gdGV4dC5sZW5ndGggLSAxIHx8IHRleHQuY2hhckNvZGVBdChpICsgMSkgPT0gMzIpKQogICAgICB7IGNoID0gIlx1MDBhMCIgfQogICAgcmVzdWx0ICs9IGNoCiAgICBzcGFjZUJlZm9yZSA9IGNoID09ICIgIgogIH0KICByZXR1cm4gcmVzdWx0Cn0KCi8vIFdvcmsgYXJvdW5kIG5vbnNlbnNlIGRpbWVuc2lvbnMgYmVpbmcgcmVwb3J0ZWQgZm9yIHN0cmV0Y2hlcyBvZgovLyByaWdodC10by1sZWZ0IHRleHQuCmZ1bmN0aW9uIGJ1aWxkVG9rZW5CYWRCaWRpKGlubmVyLCBvcmRlcikgewogIHJldHVybiBmdW5jdGlvbiAoYnVpbGRlciwgdGV4dCwgc3R5bGUsIHN0YXJ0U3R5bGUsIGVuZFN0eWxlLCB0aXRsZSwgY3NzKSB7CiAgICBzdHlsZSA9IHN0eWxlID8gc3R5bGUgKyAiIGNtLWZvcmNlLWJvcmRlciIgOiAiY20tZm9yY2UtYm9yZGVyIgogICAgdmFyIHN0YXJ0ID0gYnVpbGRlci5wb3MsIGVuZCA9IHN0YXJ0ICsgdGV4dC5sZW5ndGgKICAgIGZvciAoOzspIHsKICAgICAgLy8gRmluZCB0aGUgcGFydCB0aGF0IG92ZXJsYXBzIHdpdGggdGhlIHN0YXJ0IG9mIHRoaXMgdGV4dAogICAgICB2YXIgcGFydCA9IHZvaWQgMAogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9yZGVyLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgcGFydCA9IG9yZGVyW2ldCiAgICAgICAgaWYgKHBhcnQudG8gPiBzdGFydCAmJiBwYXJ0LmZyb20gPD0gc3RhcnQpIHsgYnJlYWsgfQogICAgICB9CiAgICAgIGlmIChwYXJ0LnRvID49IGVuZCkgeyByZXR1cm4gaW5uZXIoYnVpbGRlciwgdGV4dCwgc3R5bGUsIHN0YXJ0U3R5bGUsIGVuZFN0eWxlLCB0aXRsZSwgY3NzKSB9CiAgICAgIGlubmVyKGJ1aWxkZXIsIHRleHQuc2xpY2UoMCwgcGFydC50byAtIHN0YXJ0KSwgc3R5bGUsIHN0YXJ0U3R5bGUsIG51bGwsIHRpdGxlLCBjc3MpCiAgICAgIHN0YXJ0U3R5bGUgPSBudWxsCiAgICAgIHRleHQgPSB0ZXh0LnNsaWNlKHBhcnQudG8gLSBzdGFydCkKICAgICAgc3RhcnQgPSBwYXJ0LnRvCiAgICB9CiAgfQp9CgpmdW5jdGlvbiBidWlsZENvbGxhcHNlZFNwYW4oYnVpbGRlciwgc2l6ZSwgbWFya2VyLCBpZ25vcmVXaWRnZXQpIHsKICB2YXIgd2lkZ2V0ID0gIWlnbm9yZVdpZGdldCAmJiBtYXJrZXIud2lkZ2V0Tm9kZQogIGlmICh3aWRnZXQpIHsgYnVpbGRlci5tYXAucHVzaChidWlsZGVyLnBvcywgYnVpbGRlci5wb3MgKyBzaXplLCB3aWRnZXQpIH0KICBpZiAoIWlnbm9yZVdpZGdldCAmJiBidWlsZGVyLmNtLmRpc3BsYXkuaW5wdXQubmVlZHNDb250ZW50QXR0cmlidXRlKSB7CiAgICBpZiAoIXdpZGdldCkKICAgICAgeyB3aWRnZXQgPSBidWlsZGVyLmNvbnRlbnQuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpKSB9CiAgICB3aWRnZXQuc2V0QXR0cmlidXRlKCJjbS1tYXJrZXIiLCBtYXJrZXIuaWQpCiAgfQogIGlmICh3aWRnZXQpIHsKICAgIGJ1aWxkZXIuY20uZGlzcGxheS5pbnB1dC5zZXRVbmVkaXRhYmxlKHdpZGdldCkKICAgIGJ1aWxkZXIuY29udGVudC5hcHBlbmRDaGlsZCh3aWRnZXQpCiAgfQogIGJ1aWxkZXIucG9zICs9IHNpemUKICBidWlsZGVyLnRyYWlsaW5nU3BhY2UgPSBmYWxzZQp9CgovLyBPdXRwdXRzIGEgbnVtYmVyIG9mIHNwYW5zIHRvIG1ha2UgdXAgYSBsaW5lLCB0YWtpbmcgaGlnaGxpZ2h0aW5nCi8vIGFuZCBtYXJrZWQgdGV4dCBpbnRvIGFjY291bnQuCmZ1bmN0aW9uIGluc2VydExpbmVDb250ZW50KGxpbmUsIGJ1aWxkZXIsIHN0eWxlcykgewogIHZhciBzcGFucyA9IGxpbmUubWFya2VkU3BhbnMsIGFsbFRleHQgPSBsaW5lLnRleHQsIGF0ID0gMAogIGlmICghc3BhbnMpIHsKICAgIGZvciAodmFyIGkkMSA9IDE7IGkkMSA8IHN0eWxlcy5sZW5ndGg7IGkkMSs9MikKICAgICAgeyBidWlsZGVyLmFkZFRva2VuKGJ1aWxkZXIsIGFsbFRleHQuc2xpY2UoYXQsIGF0ID0gc3R5bGVzW2kkMV0pLCBpbnRlcnByZXRUb2tlblN0eWxlKHN0eWxlc1tpJDErMV0sIGJ1aWxkZXIuY20ub3B0aW9ucykpIH0KICAgIHJldHVybgogIH0KCiAgdmFyIGxlbiA9IGFsbFRleHQubGVuZ3RoLCBwb3MgPSAwLCBpID0gMSwgdGV4dCA9ICIiLCBzdHlsZSwgY3NzCiAgdmFyIG5leHRDaGFuZ2UgPSAwLCBzcGFuU3R5bGUsIHNwYW5FbmRTdHlsZSwgc3BhblN0YXJ0U3R5bGUsIHRpdGxlLCBjb2xsYXBzZWQKICBmb3IgKDs7KSB7CiAgICBpZiAobmV4dENoYW5nZSA9PSBwb3MpIHsgLy8gVXBkYXRlIGN1cnJlbnQgbWFya2VyIHNldAogICAgICBzcGFuU3R5bGUgPSBzcGFuRW5kU3R5bGUgPSBzcGFuU3RhcnRTdHlsZSA9IHRpdGxlID0gY3NzID0gIiIKICAgICAgY29sbGFwc2VkID0gbnVsbDsgbmV4dENoYW5nZSA9IEluZmluaXR5CiAgICAgIHZhciBmb3VuZEJvb2ttYXJrcyA9IFtdLCBlbmRTdHlsZXMgPSB2b2lkIDAKICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBzcGFucy5sZW5ndGg7ICsraikgewogICAgICAgIHZhciBzcCA9IHNwYW5zW2pdLCBtID0gc3AubWFya2VyCiAgICAgICAgaWYgKG0udHlwZSA9PSAiYm9va21hcmsiICYmIHNwLmZyb20gPT0gcG9zICYmIG0ud2lkZ2V0Tm9kZSkgewogICAgICAgICAgZm91bmRCb29rbWFya3MucHVzaChtKQogICAgICAgIH0gZWxzZSBpZiAoc3AuZnJvbSA8PSBwb3MgJiYgKHNwLnRvID09IG51bGwgfHwgc3AudG8gPiBwb3MgfHwgbS5jb2xsYXBzZWQgJiYgc3AudG8gPT0gcG9zICYmIHNwLmZyb20gPT0gcG9zKSkgewogICAgICAgICAgaWYgKHNwLnRvICE9IG51bGwgJiYgc3AudG8gIT0gcG9zICYmIG5leHRDaGFuZ2UgPiBzcC50bykgewogICAgICAgICAgICBuZXh0Q2hhbmdlID0gc3AudG8KICAgICAgICAgICAgc3BhbkVuZFN0eWxlID0gIiIKICAgICAgICAgIH0KICAgICAgICAgIGlmIChtLmNsYXNzTmFtZSkgeyBzcGFuU3R5bGUgKz0gIiAiICsgbS5jbGFzc05hbWUgfQogICAgICAgICAgaWYgKG0uY3NzKSB7IGNzcyA9IChjc3MgPyBjc3MgKyAiOyIgOiAiIikgKyBtLmNzcyB9CiAgICAgICAgICBpZiAobS5zdGFydFN0eWxlICYmIHNwLmZyb20gPT0gcG9zKSB7IHNwYW5TdGFydFN0eWxlICs9ICIgIiArIG0uc3RhcnRTdHlsZSB9CiAgICAgICAgICBpZiAobS5lbmRTdHlsZSAmJiBzcC50byA9PSBuZXh0Q2hhbmdlKSB7IChlbmRTdHlsZXMgfHwgKGVuZFN0eWxlcyA9IFtdKSkucHVzaChtLmVuZFN0eWxlLCBzcC50bykgfQogICAgICAgICAgaWYgKG0udGl0bGUgJiYgIXRpdGxlKSB7IHRpdGxlID0gbS50aXRsZSB9CiAgICAgICAgICBpZiAobS5jb2xsYXBzZWQgJiYgKCFjb2xsYXBzZWQgfHwgY29tcGFyZUNvbGxhcHNlZE1hcmtlcnMoY29sbGFwc2VkLm1hcmtlciwgbSkgPCAwKSkKICAgICAgICAgICAgeyBjb2xsYXBzZWQgPSBzcCB9CiAgICAgICAgfSBlbHNlIGlmIChzcC5mcm9tID4gcG9zICYmIG5leHRDaGFuZ2UgPiBzcC5mcm9tKSB7CiAgICAgICAgICBuZXh0Q2hhbmdlID0gc3AuZnJvbQogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoZW5kU3R5bGVzKSB7IGZvciAodmFyIGokMSA9IDA7IGokMSA8IGVuZFN0eWxlcy5sZW5ndGg7IGokMSArPSAyKQogICAgICAgIHsgaWYgKGVuZFN0eWxlc1tqJDEgKyAxXSA9PSBuZXh0Q2hhbmdlKSB7IHNwYW5FbmRTdHlsZSArPSAiICIgKyBlbmRTdHlsZXNbaiQxXSB9IH0gfQoKICAgICAgaWYgKCFjb2xsYXBzZWQgfHwgY29sbGFwc2VkLmZyb20gPT0gcG9zKSB7IGZvciAodmFyIGokMiA9IDA7IGokMiA8IGZvdW5kQm9va21hcmtzLmxlbmd0aDsgKytqJDIpCiAgICAgICAgeyBidWlsZENvbGxhcHNlZFNwYW4oYnVpbGRlciwgMCwgZm91bmRCb29rbWFya3NbaiQyXSkgfSB9CiAgICAgIGlmIChjb2xsYXBzZWQgJiYgKGNvbGxhcHNlZC5mcm9tIHx8IDApID09IHBvcykgewogICAgICAgIGJ1aWxkQ29sbGFwc2VkU3BhbihidWlsZGVyLCAoY29sbGFwc2VkLnRvID09IG51bGwgPyBsZW4gKyAxIDogY29sbGFwc2VkLnRvKSAtIHBvcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGFwc2VkLm1hcmtlciwgY29sbGFwc2VkLmZyb20gPT0gbnVsbCkKICAgICAgICBpZiAoY29sbGFwc2VkLnRvID09IG51bGwpIHsgcmV0dXJuIH0KICAgICAgICBpZiAoY29sbGFwc2VkLnRvID09IHBvcykgeyBjb2xsYXBzZWQgPSBmYWxzZSB9CiAgICAgIH0KICAgIH0KICAgIGlmIChwb3MgPj0gbGVuKSB7IGJyZWFrIH0KCiAgICB2YXIgdXB0byA9IE1hdGgubWluKGxlbiwgbmV4dENoYW5nZSkKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIGlmICh0ZXh0KSB7CiAgICAgICAgdmFyIGVuZCA9IHBvcyArIHRleHQubGVuZ3RoCiAgICAgICAgaWYgKCFjb2xsYXBzZWQpIHsKICAgICAgICAgIHZhciB0b2tlblRleHQgPSBlbmQgPiB1cHRvID8gdGV4dC5zbGljZSgwLCB1cHRvIC0gcG9zKSA6IHRleHQKICAgICAgICAgIGJ1aWxkZXIuYWRkVG9rZW4oYnVpbGRlciwgdG9rZW5UZXh0LCBzdHlsZSA/IHN0eWxlICsgc3BhblN0eWxlIDogc3BhblN0eWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFuU3RhcnRTdHlsZSwgcG9zICsgdG9rZW5UZXh0Lmxlbmd0aCA9PSBuZXh0Q2hhbmdlID8gc3BhbkVuZFN0eWxlIDogIiIsIHRpdGxlLCBjc3MpCiAgICAgICAgfQogICAgICAgIGlmIChlbmQgPj0gdXB0bykge3RleHQgPSB0ZXh0LnNsaWNlKHVwdG8gLSBwb3MpOyBwb3MgPSB1cHRvOyBicmVha30KICAgICAgICBwb3MgPSBlbmQKICAgICAgICBzcGFuU3RhcnRTdHlsZSA9ICIiCiAgICAgIH0KICAgICAgdGV4dCA9IGFsbFRleHQuc2xpY2UoYXQsIGF0ID0gc3R5bGVzW2krK10pCiAgICAgIHN0eWxlID0gaW50ZXJwcmV0VG9rZW5TdHlsZShzdHlsZXNbaSsrXSwgYnVpbGRlci5jbS5vcHRpb25zKQogICAgfQogIH0KfQoKCi8vIFRoZXNlIG9iamVjdHMgYXJlIHVzZWQgdG8gcmVwcmVzZW50IHRoZSB2aXNpYmxlIChjdXJyZW50bHkgZHJhd24pCi8vIHBhcnQgb2YgdGhlIGRvY3VtZW50LiBBIExpbmVWaWV3IG1heSBjb3JyZXNwb25kIHRvIG11bHRpcGxlCi8vIGxvZ2ljYWwgbGluZXMsIGlmIHRob3NlIGFyZSBjb25uZWN0ZWQgYnkgY29sbGFwc2VkIHJhbmdlcy4KZnVuY3Rpb24gTGluZVZpZXcoZG9jLCBsaW5lLCBsaW5lTikgewogIC8vIFRoZSBzdGFydGluZyBsaW5lCiAgdGhpcy5saW5lID0gbGluZQogIC8vIENvbnRpbnVpbmcgbGluZXMsIGlmIGFueQogIHRoaXMucmVzdCA9IHZpc3VhbExpbmVDb250aW51ZWQobGluZSkKICAvLyBOdW1iZXIgb2YgbG9naWNhbCBsaW5lcyBpbiB0aGlzIHZpc3VhbCBsaW5lCiAgdGhpcy5zaXplID0gdGhpcy5yZXN0ID8gbGluZU5vKGxzdCh0aGlzLnJlc3QpKSAtIGxpbmVOICsgMSA6IDEKICB0aGlzLm5vZGUgPSB0aGlzLnRleHQgPSBudWxsCiAgdGhpcy5oaWRkZW4gPSBsaW5lSXNIaWRkZW4oZG9jLCBsaW5lKQp9CgovLyBDcmVhdGUgYSByYW5nZSBvZiBMaW5lVmlldyBvYmplY3RzIGZvciB0aGUgZ2l2ZW4gbGluZXMuCmZ1bmN0aW9uIGJ1aWxkVmlld0FycmF5KGNtLCBmcm9tLCB0bykgewogIHZhciBhcnJheSA9IFtdLCBuZXh0UG9zCiAgZm9yICh2YXIgcG9zID0gZnJvbTsgcG9zIDwgdG87IHBvcyA9IG5leHRQb3MpIHsKICAgIHZhciB2aWV3ID0gbmV3IExpbmVWaWV3KGNtLmRvYywgZ2V0TGluZShjbS5kb2MsIHBvcyksIHBvcykKICAgIG5leHRQb3MgPSBwb3MgKyB2aWV3LnNpemUKICAgIGFycmF5LnB1c2godmlldykKICB9CiAgcmV0dXJuIGFycmF5Cn0KCnZhciBvcGVyYXRpb25Hcm91cCA9IG51bGwKCmZ1bmN0aW9uIHB1c2hPcGVyYXRpb24ob3ApIHsKICBpZiAob3BlcmF0aW9uR3JvdXApIHsKICAgIG9wZXJhdGlvbkdyb3VwLm9wcy5wdXNoKG9wKQogIH0gZWxzZSB7CiAgICBvcC5vd25zR3JvdXAgPSBvcGVyYXRpb25Hcm91cCA9IHsKICAgICAgb3BzOiBbb3BdLAogICAgICBkZWxheWVkQ2FsbGJhY2tzOiBbXQogICAgfQogIH0KfQoKZnVuY3Rpb24gZmlyZUNhbGxiYWNrc0Zvck9wcyhncm91cCkgewogIC8vIENhbGxzIGRlbGF5ZWQgY2FsbGJhY2tzIGFuZCBjdXJzb3JBY3Rpdml0eSBoYW5kbGVycyB1bnRpbCBubwogIC8vIG5ldyBvbmVzIGFwcGVhcgogIHZhciBjYWxsYmFja3MgPSBncm91cC5kZWxheWVkQ2FsbGJhY2tzLCBpID0gMAogIGRvIHsKICAgIGZvciAoOyBpIDwgY2FsbGJhY2tzLmxlbmd0aDsgaSsrKQogICAgICB7IGNhbGxiYWNrc1tpXS5jYWxsKG51bGwpIH0KICAgIGZvciAodmFyIGogPSAwOyBqIDwgZ3JvdXAub3BzLmxlbmd0aDsgaisrKSB7CiAgICAgIHZhciBvcCA9IGdyb3VwLm9wc1tqXQogICAgICBpZiAob3AuY3Vyc29yQWN0aXZpdHlIYW5kbGVycykKICAgICAgICB7IHdoaWxlIChvcC5jdXJzb3JBY3Rpdml0eUNhbGxlZCA8IG9wLmN1cnNvckFjdGl2aXR5SGFuZGxlcnMubGVuZ3RoKQogICAgICAgICAgeyBvcC5jdXJzb3JBY3Rpdml0eUhhbmRsZXJzW29wLmN1cnNvckFjdGl2aXR5Q2FsbGVkKytdLmNhbGwobnVsbCwgb3AuY20pIH0gfQogICAgfQogIH0gd2hpbGUgKGkgPCBjYWxsYmFja3MubGVuZ3RoKQp9CgpmdW5jdGlvbiBmaW5pc2hPcGVyYXRpb24ob3AsIGVuZENiKSB7CiAgdmFyIGdyb3VwID0gb3Aub3duc0dyb3VwCiAgaWYgKCFncm91cCkgeyByZXR1cm4gfQoKICB0cnkgeyBmaXJlQ2FsbGJhY2tzRm9yT3BzKGdyb3VwKSB9CiAgZmluYWxseSB7CiAgICBvcGVyYXRpb25Hcm91cCA9IG51bGwKICAgIGVuZENiKGdyb3VwKQogIH0KfQoKdmFyIG9ycGhhbkRlbGF5ZWRDYWxsYmFja3MgPSBudWxsCgovLyBPZnRlbiwgd2Ugd2FudCB0byBzaWduYWwgZXZlbnRzIGF0IGEgcG9pbnQgd2hlcmUgd2UgYXJlIGluIHRoZQovLyBtaWRkbGUgb2Ygc29tZSB3b3JrLCBidXQgZG9uJ3Qgd2FudCB0aGUgaGFuZGxlciB0byBzdGFydCBjYWxsaW5nCi8vIG90aGVyIG1ldGhvZHMgb24gdGhlIGVkaXRvciwgd2hpY2ggbWlnaHQgYmUgaW4gYW4gaW5jb25zaXN0ZW50Ci8vIHN0YXRlIG9yIHNpbXBseSBub3QgZXhwZWN0IGFueSBvdGhlciBldmVudHMgdG8gaGFwcGVuLgovLyBzaWduYWxMYXRlciBsb29rcyB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgaGFuZGxlcnMsIGFuZCBzY2hlZHVsZXMKLy8gdGhlbSB0byBiZSBleGVjdXRlZCB3aGVuIHRoZSBsYXN0IG9wZXJhdGlvbiBlbmRzLCBvciwgaWYgbm8KLy8gb3BlcmF0aW9uIGlzIGFjdGl2ZSwgd2hlbiBhIHRpbWVvdXQgZmlyZXMuCmZ1bmN0aW9uIHNpZ25hbExhdGVyKGVtaXR0ZXIsIHR5cGUgLyosIHZhbHVlcy4uLiovKSB7CiAgdmFyIGFyciA9IGdldEhhbmRsZXJzKGVtaXR0ZXIsIHR5cGUsIGZhbHNlKQogIGlmICghYXJyLmxlbmd0aCkgeyByZXR1cm4gfQogIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAyKSwgbGlzdAogIGlmIChvcGVyYXRpb25Hcm91cCkgewogICAgbGlzdCA9IG9wZXJhdGlvbkdyb3VwLmRlbGF5ZWRDYWxsYmFja3MKICB9IGVsc2UgaWYgKG9ycGhhbkRlbGF5ZWRDYWxsYmFja3MpIHsKICAgIGxpc3QgPSBvcnBoYW5EZWxheWVkQ2FsbGJhY2tzCiAgfSBlbHNlIHsKICAgIGxpc3QgPSBvcnBoYW5EZWxheWVkQ2FsbGJhY2tzID0gW10KICAgIHNldFRpbWVvdXQoZmlyZU9ycGhhbkRlbGF5ZWQsIDApCiAgfQogIHZhciBsb29wID0gZnVuY3Rpb24gKCBpICkgewogICAgbGlzdC5wdXNoKGZ1bmN0aW9uICgpIHsgcmV0dXJuIGFycltpXS5hcHBseShudWxsLCBhcmdzKTsgfSkKICB9OwoKICBmb3IgKHZhciBpID0gMDsgaSA8IGFyci5sZW5ndGg7ICsraSkKICAgIGxvb3AoIGkgKTsKfQoKZnVuY3Rpb24gZmlyZU9ycGhhbkRlbGF5ZWQoKSB7CiAgdmFyIGRlbGF5ZWQgPSBvcnBoYW5EZWxheWVkQ2FsbGJhY2tzCiAgb3JwaGFuRGVsYXllZENhbGxiYWNrcyA9IG51bGwKICBmb3IgKHZhciBpID0gMDsgaSA8IGRlbGF5ZWQubGVuZ3RoOyArK2kpIHsgZGVsYXllZFtpXSgpIH0KfQoKLy8gV2hlbiBhbiBhc3BlY3Qgb2YgYSBsaW5lIGNoYW5nZXMsIGEgc3RyaW5nIGlzIGFkZGVkIHRvCi8vIGxpbmVWaWV3LmNoYW5nZXMuIFRoaXMgdXBkYXRlcyB0aGUgcmVsZXZhbnQgcGFydCBvZiB0aGUgbGluZSdzCi8vIERPTSBzdHJ1Y3R1cmUuCmZ1bmN0aW9uIHVwZGF0ZUxpbmVGb3JDaGFuZ2VzKGNtLCBsaW5lVmlldywgbGluZU4sIGRpbXMpIHsKICBmb3IgKHZhciBqID0gMDsgaiA8IGxpbmVWaWV3LmNoYW5nZXMubGVuZ3RoOyBqKyspIHsKICAgIHZhciB0eXBlID0gbGluZVZpZXcuY2hhbmdlc1tqXQogICAgaWYgKHR5cGUgPT0gInRleHQiKSB7IHVwZGF0ZUxpbmVUZXh0KGNtLCBsaW5lVmlldykgfQogICAgZWxzZSBpZiAodHlwZSA9PSAiZ3V0dGVyIikgeyB1cGRhdGVMaW5lR3V0dGVyKGNtLCBsaW5lVmlldywgbGluZU4sIGRpbXMpIH0KICAgIGVsc2UgaWYgKHR5cGUgPT0gImNsYXNzIikgeyB1cGRhdGVMaW5lQ2xhc3NlcyhsaW5lVmlldykgfQogICAgZWxzZSBpZiAodHlwZSA9PSAid2lkZ2V0IikgeyB1cGRhdGVMaW5lV2lkZ2V0cyhjbSwgbGluZVZpZXcsIGRpbXMpIH0KICB9CiAgbGluZVZpZXcuY2hhbmdlcyA9IG51bGwKfQoKLy8gTGluZXMgd2l0aCBndXR0ZXIgZWxlbWVudHMsIHdpZGdldHMgb3IgYSBiYWNrZ3JvdW5kIGNsYXNzIG5lZWQgdG8KLy8gYmUgd3JhcHBlZCwgYW5kIGhhdmUgdGhlIGV4dHJhIGVsZW1lbnRzIGFkZGVkIHRvIHRoZSB3cmFwcGVyIGRpdgpmdW5jdGlvbiBlbnN1cmVMaW5lV3JhcHBlZChsaW5lVmlldykgewogIGlmIChsaW5lVmlldy5ub2RlID09IGxpbmVWaWV3LnRleHQpIHsKICAgIGxpbmVWaWV3Lm5vZGUgPSBlbHQoImRpdiIsIG51bGwsIG51bGwsICJwb3NpdGlvbjogcmVsYXRpdmUiKQogICAgaWYgKGxpbmVWaWV3LnRleHQucGFyZW50Tm9kZSkKICAgICAgeyBsaW5lVmlldy50ZXh0LnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGxpbmVWaWV3Lm5vZGUsIGxpbmVWaWV3LnRleHQpIH0KICAgIGxpbmVWaWV3Lm5vZGUuYXBwZW5kQ2hpbGQobGluZVZpZXcudGV4dCkKICAgIGlmIChpZSAmJiBpZV92ZXJzaW9uIDwgOCkgeyBsaW5lVmlldy5ub2RlLnN0eWxlLnpJbmRleCA9IDIgfQogIH0KICByZXR1cm4gbGluZVZpZXcubm9kZQp9CgpmdW5jdGlvbiB1cGRhdGVMaW5lQmFja2dyb3VuZChsaW5lVmlldykgewogIHZhciBjbHMgPSBsaW5lVmlldy5iZ0NsYXNzID8gbGluZVZpZXcuYmdDbGFzcyArICIgIiArIChsaW5lVmlldy5saW5lLmJnQ2xhc3MgfHwgIiIpIDogbGluZVZpZXcubGluZS5iZ0NsYXNzCiAgaWYgKGNscykgeyBjbHMgKz0gIiBDb2RlTWlycm9yLWxpbmViYWNrZ3JvdW5kIiB9CiAgaWYgKGxpbmVWaWV3LmJhY2tncm91bmQpIHsKICAgIGlmIChjbHMpIHsgbGluZVZpZXcuYmFja2dyb3VuZC5jbGFzc05hbWUgPSBjbHMgfQogICAgZWxzZSB7IGxpbmVWaWV3LmJhY2tncm91bmQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChsaW5lVmlldy5iYWNrZ3JvdW5kKTsgbGluZVZpZXcuYmFja2dyb3VuZCA9IG51bGwgfQogIH0gZWxzZSBpZiAoY2xzKSB7CiAgICB2YXIgd3JhcCA9IGVuc3VyZUxpbmVXcmFwcGVkKGxpbmVWaWV3KQogICAgbGluZVZpZXcuYmFja2dyb3VuZCA9IHdyYXAuaW5zZXJ0QmVmb3JlKGVsdCgiZGl2IiwgbnVsbCwgY2xzKSwgd3JhcC5maXJzdENoaWxkKQogIH0KfQoKLy8gV3JhcHBlciBhcm91bmQgYnVpbGRMaW5lQ29udGVudCB3aGljaCB3aWxsIHJldXNlIHRoZSBzdHJ1Y3R1cmUKLy8gaW4gZGlzcGxheS5leHRlcm5hbE1lYXN1cmVkIHdoZW4gcG9zc2libGUuCmZ1bmN0aW9uIGdldExpbmVDb250ZW50KGNtLCBsaW5lVmlldykgewogIHZhciBleHQgPSBjbS5kaXNwbGF5LmV4dGVybmFsTWVhc3VyZWQKICBpZiAoZXh0ICYmIGV4dC5saW5lID09IGxpbmVWaWV3LmxpbmUpIHsKICAgIGNtLmRpc3BsYXkuZXh0ZXJuYWxNZWFzdXJlZCA9IG51bGwKICAgIGxpbmVWaWV3Lm1lYXN1cmUgPSBleHQubWVhc3VyZQogICAgcmV0dXJuIGV4dC5idWlsdAogIH0KICByZXR1cm4gYnVpbGRMaW5lQ29udGVudChjbSwgbGluZVZpZXcpCn0KCi8vIFJlZHJhdyB0aGUgbGluZSdzIHRleHQuIEludGVyYWN0cyB3aXRoIHRoZSBiYWNrZ3JvdW5kIGFuZCB0ZXh0Ci8vIGNsYXNzZXMgYmVjYXVzZSB0aGUgbW9kZSBtYXkgb3V0cHV0IHRva2VucyB0aGF0IGluZmx1ZW5jZSB0aGVzZQovLyBjbGFzc2VzLgpmdW5jdGlvbiB1cGRhdGVMaW5lVGV4dChjbSwgbGluZVZpZXcpIHsKICB2YXIgY2xzID0gbGluZVZpZXcudGV4dC5jbGFzc05hbWUKICB2YXIgYnVpbHQgPSBnZXRMaW5lQ29udGVudChjbSwgbGluZVZpZXcpCiAgaWYgKGxpbmVWaWV3LnRleHQgPT0gbGluZVZpZXcubm9kZSkgeyBsaW5lVmlldy5ub2RlID0gYnVpbHQucHJlIH0KICBsaW5lVmlldy50ZXh0LnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGJ1aWx0LnByZSwgbGluZVZpZXcudGV4dCkKICBsaW5lVmlldy50ZXh0ID0gYnVpbHQucHJlCiAgaWYgKGJ1aWx0LmJnQ2xhc3MgIT0gbGluZVZpZXcuYmdDbGFzcyB8fCBidWlsdC50ZXh0Q2xhc3MgIT0gbGluZVZpZXcudGV4dENsYXNzKSB7CiAgICBsaW5lVmlldy5iZ0NsYXNzID0gYnVpbHQuYmdDbGFzcwogICAgbGluZVZpZXcudGV4dENsYXNzID0gYnVpbHQudGV4dENsYXNzCiAgICB1cGRhdGVMaW5lQ2xhc3NlcyhsaW5lVmlldykKICB9IGVsc2UgaWYgKGNscykgewogICAgbGluZVZpZXcudGV4dC5jbGFzc05hbWUgPSBjbHMKICB9Cn0KCmZ1bmN0aW9uIHVwZGF0ZUxpbmVDbGFzc2VzKGxpbmVWaWV3KSB7CiAgdXBkYXRlTGluZUJhY2tncm91bmQobGluZVZpZXcpCiAgaWYgKGxpbmVWaWV3LmxpbmUud3JhcENsYXNzKQogICAgeyBlbnN1cmVMaW5lV3JhcHBlZChsaW5lVmlldykuY2xhc3NOYW1lID0gbGluZVZpZXcubGluZS53cmFwQ2xhc3MgfQogIGVsc2UgaWYgKGxpbmVWaWV3Lm5vZGUgIT0gbGluZVZpZXcudGV4dCkKICAgIHsgbGluZVZpZXcubm9kZS5jbGFzc05hbWUgPSAiIiB9CiAgdmFyIHRleHRDbGFzcyA9IGxpbmVWaWV3LnRleHRDbGFzcyA/IGxpbmVWaWV3LnRleHRDbGFzcyArICIgIiArIChsaW5lVmlldy5saW5lLnRleHRDbGFzcyB8fCAiIikgOiBsaW5lVmlldy5saW5lLnRleHRDbGFzcwogIGxpbmVWaWV3LnRleHQuY2xhc3NOYW1lID0gdGV4dENsYXNzIHx8ICIiCn0KCmZ1bmN0aW9uIHVwZGF0ZUxpbmVHdXR0ZXIoY20sIGxpbmVWaWV3LCBsaW5lTiwgZGltcykgewogIGlmIChsaW5lVmlldy5ndXR0ZXIpIHsKICAgIGxpbmVWaWV3Lm5vZGUucmVtb3ZlQ2hpbGQobGluZVZpZXcuZ3V0dGVyKQogICAgbGluZVZpZXcuZ3V0dGVyID0gbnVsbAogIH0KICBpZiAobGluZVZpZXcuZ3V0dGVyQmFja2dyb3VuZCkgewogICAgbGluZVZpZXcubm9kZS5yZW1vdmVDaGlsZChsaW5lVmlldy5ndXR0ZXJCYWNrZ3JvdW5kKQogICAgbGluZVZpZXcuZ3V0dGVyQmFja2dyb3VuZCA9IG51bGwKICB9CiAgaWYgKGxpbmVWaWV3LmxpbmUuZ3V0dGVyQ2xhc3MpIHsKICAgIHZhciB3cmFwID0gZW5zdXJlTGluZVdyYXBwZWQobGluZVZpZXcpCiAgICBsaW5lVmlldy5ndXR0ZXJCYWNrZ3JvdW5kID0gZWx0KCJkaXYiLCBudWxsLCAiQ29kZU1pcnJvci1ndXR0ZXItYmFja2dyb3VuZCAiICsgbGluZVZpZXcubGluZS5ndXR0ZXJDbGFzcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJsZWZ0OiAiICsgKGNtLm9wdGlvbnMuZml4ZWRHdXR0ZXIgPyBkaW1zLmZpeGVkUG9zIDogLWRpbXMuZ3V0dGVyVG90YWxXaWR0aCkgKyAicHg7IHdpZHRoOiAiICsgKGRpbXMuZ3V0dGVyVG90YWxXaWR0aCkgKyAicHgiKSkKICAgIHdyYXAuaW5zZXJ0QmVmb3JlKGxpbmVWaWV3Lmd1dHRlckJhY2tncm91bmQsIGxpbmVWaWV3LnRleHQpCiAgfQogIHZhciBtYXJrZXJzID0gbGluZVZpZXcubGluZS5ndXR0ZXJNYXJrZXJzCiAgaWYgKGNtLm9wdGlvbnMubGluZU51bWJlcnMgfHwgbWFya2VycykgewogICAgdmFyIHdyYXAkMSA9IGVuc3VyZUxpbmVXcmFwcGVkKGxpbmVWaWV3KQogICAgdmFyIGd1dHRlcldyYXAgPSBsaW5lVmlldy5ndXR0ZXIgPSBlbHQoImRpdiIsIG51bGwsICJDb2RlTWlycm9yLWd1dHRlci13cmFwcGVyIiwgKCJsZWZ0OiAiICsgKGNtLm9wdGlvbnMuZml4ZWRHdXR0ZXIgPyBkaW1zLmZpeGVkUG9zIDogLWRpbXMuZ3V0dGVyVG90YWxXaWR0aCkgKyAicHgiKSkKICAgIGNtLmRpc3BsYXkuaW5wdXQuc2V0VW5lZGl0YWJsZShndXR0ZXJXcmFwKQogICAgd3JhcCQxLmluc2VydEJlZm9yZShndXR0ZXJXcmFwLCBsaW5lVmlldy50ZXh0KQogICAgaWYgKGxpbmVWaWV3LmxpbmUuZ3V0dGVyQ2xhc3MpCiAgICAgIHsgZ3V0dGVyV3JhcC5jbGFzc05hbWUgKz0gIiAiICsgbGluZVZpZXcubGluZS5ndXR0ZXJDbGFzcyB9CiAgICBpZiAoY20ub3B0aW9ucy5saW5lTnVtYmVycyAmJiAoIW1hcmtlcnMgfHwgIW1hcmtlcnNbIkNvZGVNaXJyb3ItbGluZW51bWJlcnMiXSkpCiAgICAgIHsgbGluZVZpZXcubGluZU51bWJlciA9IGd1dHRlcldyYXAuYXBwZW5kQ2hpbGQoCiAgICAgICAgZWx0KCJkaXYiLCBsaW5lTnVtYmVyRm9yKGNtLm9wdGlvbnMsIGxpbmVOKSwKICAgICAgICAgICAgIkNvZGVNaXJyb3ItbGluZW51bWJlciBDb2RlTWlycm9yLWd1dHRlci1lbHQiLAogICAgICAgICAgICAoImxlZnQ6ICIgKyAoZGltcy5ndXR0ZXJMZWZ0WyJDb2RlTWlycm9yLWxpbmVudW1iZXJzIl0pICsgInB4OyB3aWR0aDogIiArIChjbS5kaXNwbGF5LmxpbmVOdW1Jbm5lcldpZHRoKSArICJweCIpKSkgfQogICAgaWYgKG1hcmtlcnMpIHsgZm9yICh2YXIgayA9IDA7IGsgPCBjbS5vcHRpb25zLmd1dHRlcnMubGVuZ3RoOyArK2spIHsKICAgICAgdmFyIGlkID0gY20ub3B0aW9ucy5ndXR0ZXJzW2tdLCBmb3VuZCA9IG1hcmtlcnMuaGFzT3duUHJvcGVydHkoaWQpICYmIG1hcmtlcnNbaWRdCiAgICAgIGlmIChmb3VuZCkKICAgICAgICB7IGd1dHRlcldyYXAuYXBwZW5kQ2hpbGQoZWx0KCJkaXYiLCBbZm91bmRdLCAiQ29kZU1pcnJvci1ndXR0ZXItZWx0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImxlZnQ6ICIgKyAoZGltcy5ndXR0ZXJMZWZ0W2lkXSkgKyAicHg7IHdpZHRoOiAiICsgKGRpbXMuZ3V0dGVyV2lkdGhbaWRdKSArICJweCIpKSkgfQogICAgfSB9CiAgfQp9CgpmdW5jdGlvbiB1cGRhdGVMaW5lV2lkZ2V0cyhjbSwgbGluZVZpZXcsIGRpbXMpIHsKICBpZiAobGluZVZpZXcuYWxpZ25hYmxlKSB7IGxpbmVWaWV3LmFsaWduYWJsZSA9IG51bGwgfQogIGZvciAodmFyIG5vZGUgPSBsaW5lVmlldy5ub2RlLmZpcnN0Q2hpbGQsIG5leHQgPSB2b2lkIDA7IG5vZGU7IG5vZGUgPSBuZXh0KSB7CiAgICBuZXh0ID0gbm9kZS5uZXh0U2libGluZwogICAgaWYgKG5vZGUuY2xhc3NOYW1lID09ICJDb2RlTWlycm9yLWxpbmV3aWRnZXQiKQogICAgICB7IGxpbmVWaWV3Lm5vZGUucmVtb3ZlQ2hpbGQobm9kZSkgfQogIH0KICBpbnNlcnRMaW5lV2lkZ2V0cyhjbSwgbGluZVZpZXcsIGRpbXMpCn0KCi8vIEJ1aWxkIGEgbGluZSdzIERPTSByZXByZXNlbnRhdGlvbiBmcm9tIHNjcmF0Y2gKZnVuY3Rpb24gYnVpbGRMaW5lRWxlbWVudChjbSwgbGluZVZpZXcsIGxpbmVOLCBkaW1zKSB7CiAgdmFyIGJ1aWx0ID0gZ2V0TGluZUNvbnRlbnQoY20sIGxpbmVWaWV3KQogIGxpbmVWaWV3LnRleHQgPSBsaW5lVmlldy5ub2RlID0gYnVpbHQucHJlCiAgaWYgKGJ1aWx0LmJnQ2xhc3MpIHsgbGluZVZpZXcuYmdDbGFzcyA9IGJ1aWx0LmJnQ2xhc3MgfQogIGlmIChidWlsdC50ZXh0Q2xhc3MpIHsgbGluZVZpZXcudGV4dENsYXNzID0gYnVpbHQudGV4dENsYXNzIH0KCiAgdXBkYXRlTGluZUNsYXNzZXMobGluZVZpZXcpCiAgdXBkYXRlTGluZUd1dHRlcihjbSwgbGluZVZpZXcsIGxpbmVOLCBkaW1zKQogIGluc2VydExpbmVXaWRnZXRzKGNtLCBsaW5lVmlldywgZGltcykKICByZXR1cm4gbGluZVZpZXcubm9kZQp9CgovLyBBIGxpbmVWaWV3IG1heSBjb250YWluIG11bHRpcGxlIGxvZ2ljYWwgbGluZXMgKHdoZW4gbWVyZ2VkIGJ5Ci8vIGNvbGxhcHNlZCBzcGFucykuIFRoZSB3aWRnZXRzIGZvciBhbGwgb2YgdGhlbSBuZWVkIHRvIGJlIGRyYXduLgpmdW5jdGlvbiBpbnNlcnRMaW5lV2lkZ2V0cyhjbSwgbGluZVZpZXcsIGRpbXMpIHsKICBpbnNlcnRMaW5lV2lkZ2V0c0ZvcihjbSwgbGluZVZpZXcubGluZSwgbGluZVZpZXcsIGRpbXMsIHRydWUpCiAgaWYgKGxpbmVWaWV3LnJlc3QpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW5lVmlldy5yZXN0Lmxlbmd0aDsgaSsrKQogICAgeyBpbnNlcnRMaW5lV2lkZ2V0c0ZvcihjbSwgbGluZVZpZXcucmVzdFtpXSwgbGluZVZpZXcsIGRpbXMsIGZhbHNlKSB9IH0KfQoKZnVuY3Rpb24gaW5zZXJ0TGluZVdpZGdldHNGb3IoY20sIGxpbmUsIGxpbmVWaWV3LCBkaW1zLCBhbGxvd0Fib3ZlKSB7CiAgaWYgKCFsaW5lLndpZGdldHMpIHsgcmV0dXJuIH0KICB2YXIgd3JhcCA9IGVuc3VyZUxpbmVXcmFwcGVkKGxpbmVWaWV3KQogIGZvciAodmFyIGkgPSAwLCB3cyA9IGxpbmUud2lkZ2V0czsgaSA8IHdzLmxlbmd0aDsgKytpKSB7CiAgICB2YXIgd2lkZ2V0ID0gd3NbaV0sIG5vZGUgPSBlbHQoImRpdiIsIFt3aWRnZXQubm9kZV0sICJDb2RlTWlycm9yLWxpbmV3aWRnZXQiKQogICAgaWYgKCF3aWRnZXQuaGFuZGxlTW91c2VFdmVudHMpIHsgbm9kZS5zZXRBdHRyaWJ1dGUoImNtLWlnbm9yZS1ldmVudHMiLCAidHJ1ZSIpIH0KICAgIHBvc2l0aW9uTGluZVdpZGdldCh3aWRnZXQsIG5vZGUsIGxpbmVWaWV3LCBkaW1zKQogICAgY20uZGlzcGxheS5pbnB1dC5zZXRVbmVkaXRhYmxlKG5vZGUpCiAgICBpZiAoYWxsb3dBYm92ZSAmJiB3aWRnZXQuYWJvdmUpCiAgICAgIHsgd3JhcC5pbnNlcnRCZWZvcmUobm9kZSwgbGluZVZpZXcuZ3V0dGVyIHx8IGxpbmVWaWV3LnRleHQpIH0KICAgIGVsc2UKICAgICAgeyB3cmFwLmFwcGVuZENoaWxkKG5vZGUpIH0KICAgIHNpZ25hbExhdGVyKHdpZGdldCwgInJlZHJhdyIpCiAgfQp9CgpmdW5jdGlvbiBwb3NpdGlvbkxpbmVXaWRnZXQod2lkZ2V0LCBub2RlLCBsaW5lVmlldywgZGltcykgewogIGlmICh3aWRnZXQubm9IU2Nyb2xsKSB7CiAgICAobGluZVZpZXcuYWxpZ25hYmxlIHx8IChsaW5lVmlldy5hbGlnbmFibGUgPSBbXSkpLnB1c2gobm9kZSkKICAgIHZhciB3aWR0aCA9IGRpbXMud3JhcHBlcldpZHRoCiAgICBub2RlLnN0eWxlLmxlZnQgPSBkaW1zLmZpeGVkUG9zICsgInB4IgogICAgaWYgKCF3aWRnZXQuY292ZXJHdXR0ZXIpIHsKICAgICAgd2lkdGggLT0gZGltcy5ndXR0ZXJUb3RhbFdpZHRoCiAgICAgIG5vZGUuc3R5bGUucGFkZGluZ0xlZnQgPSBkaW1zLmd1dHRlclRvdGFsV2lkdGggKyAicHgiCiAgICB9CiAgICBub2RlLnN0eWxlLndpZHRoID0gd2lkdGggKyAicHgiCiAgfQogIGlmICh3aWRnZXQuY292ZXJHdXR0ZXIpIHsKICAgIG5vZGUuc3R5bGUuekluZGV4ID0gNQogICAgbm9kZS5zdHlsZS5wb3NpdGlvbiA9ICJyZWxhdGl2ZSIKICAgIGlmICghd2lkZ2V0Lm5vSFNjcm9sbCkgeyBub2RlLnN0eWxlLm1hcmdpbkxlZnQgPSAtZGltcy5ndXR0ZXJUb3RhbFdpZHRoICsgInB4IiB9CiAgfQp9CgpmdW5jdGlvbiB3aWRnZXRIZWlnaHQod2lkZ2V0KSB7CiAgaWYgKHdpZGdldC5oZWlnaHQgIT0gbnVsbCkgeyByZXR1cm4gd2lkZ2V0LmhlaWdodCB9CiAgdmFyIGNtID0gd2lkZ2V0LmRvYy5jbQogIGlmICghY20pIHsgcmV0dXJuIDAgfQogIGlmICghY29udGFpbnMoZG9jdW1lbnQuYm9keSwgd2lkZ2V0Lm5vZGUpKSB7CiAgICB2YXIgcGFyZW50U3R5bGUgPSAicG9zaXRpb246IHJlbGF0aXZlOyIKICAgIGlmICh3aWRnZXQuY292ZXJHdXR0ZXIpCiAgICAgIHsgcGFyZW50U3R5bGUgKz0gIm1hcmdpbi1sZWZ0OiAtIiArIGNtLmRpc3BsYXkuZ3V0dGVycy5vZmZzZXRXaWR0aCArICJweDsiIH0KICAgIGlmICh3aWRnZXQubm9IU2Nyb2xsKQogICAgICB7IHBhcmVudFN0eWxlICs9ICJ3aWR0aDogIiArIGNtLmRpc3BsYXkud3JhcHBlci5jbGllbnRXaWR0aCArICJweDsiIH0KICAgIHJlbW92ZUNoaWxkcmVuQW5kQWRkKGNtLmRpc3BsYXkubWVhc3VyZSwgZWx0KCJkaXYiLCBbd2lkZ2V0Lm5vZGVdLCBudWxsLCBwYXJlbnRTdHlsZSkpCiAgfQogIHJldHVybiB3aWRnZXQuaGVpZ2h0ID0gd2lkZ2V0Lm5vZGUucGFyZW50Tm9kZS5vZmZzZXRIZWlnaHQKfQoKLy8gUmV0dXJuIHRydWUgd2hlbiB0aGUgZ2l2ZW4gbW91c2UgZXZlbnQgaGFwcGVuZWQgaW4gYSB3aWRnZXQKZnVuY3Rpb24gZXZlbnRJbldpZGdldChkaXNwbGF5LCBlKSB7CiAgZm9yICh2YXIgbiA9IGVfdGFyZ2V0KGUpOyBuICE9IGRpc3BsYXkud3JhcHBlcjsgbiA9IG4ucGFyZW50Tm9kZSkgewogICAgaWYgKCFuIHx8IChuLm5vZGVUeXBlID09IDEgJiYgbi5nZXRBdHRyaWJ1dGUoImNtLWlnbm9yZS1ldmVudHMiKSA9PSAidHJ1ZSIpIHx8CiAgICAgICAgKG4ucGFyZW50Tm9kZSA9PSBkaXNwbGF5LnNpemVyICYmIG4gIT0gZGlzcGxheS5tb3ZlcikpCiAgICAgIHsgcmV0dXJuIHRydWUgfQogIH0KfQoKLy8gUE9TSVRJT04gTUVBU1VSRU1FTlQKCmZ1bmN0aW9uIHBhZGRpbmdUb3AoZGlzcGxheSkge3JldHVybiBkaXNwbGF5LmxpbmVTcGFjZS5vZmZzZXRUb3B9CmZ1bmN0aW9uIHBhZGRpbmdWZXJ0KGRpc3BsYXkpIHtyZXR1cm4gZGlzcGxheS5tb3Zlci5vZmZzZXRIZWlnaHQgLSBkaXNwbGF5LmxpbmVTcGFjZS5vZmZzZXRIZWlnaHR9CmZ1bmN0aW9uIHBhZGRpbmdIKGRpc3BsYXkpIHsKICBpZiAoZGlzcGxheS5jYWNoZWRQYWRkaW5nSCkgeyByZXR1cm4gZGlzcGxheS5jYWNoZWRQYWRkaW5nSCB9CiAgdmFyIGUgPSByZW1vdmVDaGlsZHJlbkFuZEFkZChkaXNwbGF5Lm1lYXN1cmUsIGVsdCgicHJlIiwgIngiKSkKICB2YXIgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSA/IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGUpIDogZS5jdXJyZW50U3R5bGUKICB2YXIgZGF0YSA9IHtsZWZ0OiBwYXJzZUludChzdHlsZS5wYWRkaW5nTGVmdCksIHJpZ2h0OiBwYXJzZUludChzdHlsZS5wYWRkaW5nUmlnaHQpfQogIGlmICghaXNOYU4oZGF0YS5sZWZ0KSAmJiAhaXNOYU4oZGF0YS5yaWdodCkpIHsgZGlzcGxheS5jYWNoZWRQYWRkaW5nSCA9IGRhdGEgfQogIHJldHVybiBkYXRhCn0KCmZ1bmN0aW9uIHNjcm9sbEdhcChjbSkgeyByZXR1cm4gc2Nyb2xsZXJHYXAgLSBjbS5kaXNwbGF5Lm5hdGl2ZUJhcldpZHRoIH0KZnVuY3Rpb24gZGlzcGxheVdpZHRoKGNtKSB7CiAgcmV0dXJuIGNtLmRpc3BsYXkuc2Nyb2xsZXIuY2xpZW50V2lkdGggLSBzY3JvbGxHYXAoY20pIC0gY20uZGlzcGxheS5iYXJXaWR0aAp9CmZ1bmN0aW9uIGRpc3BsYXlIZWlnaHQoY20pIHsKICByZXR1cm4gY20uZGlzcGxheS5zY3JvbGxlci5jbGllbnRIZWlnaHQgLSBzY3JvbGxHYXAoY20pIC0gY20uZGlzcGxheS5iYXJIZWlnaHQKfQoKLy8gRW5zdXJlIHRoZSBsaW5lVmlldy53cmFwcGluZy5oZWlnaHRzIGFycmF5IGlzIHBvcHVsYXRlZC4gVGhpcyBpcwovLyBhbiBhcnJheSBvZiBib3R0b20gb2Zmc2V0cyBmb3IgdGhlIGxpbmVzIHRoYXQgbWFrZSB1cCBhIGRyYXduCi8vIGxpbmUuIFdoZW4gbGluZVdyYXBwaW5nIGlzIG9uLCB0aGVyZSBtaWdodCBiZSBtb3JlIHRoYW4gb25lCi8vIGhlaWdodC4KZnVuY3Rpb24gZW5zdXJlTGluZUhlaWdodHMoY20sIGxpbmVWaWV3LCByZWN0KSB7CiAgdmFyIHdyYXBwaW5nID0gY20ub3B0aW9ucy5saW5lV3JhcHBpbmcKICB2YXIgY3VyV2lkdGggPSB3cmFwcGluZyAmJiBkaXNwbGF5V2lkdGgoY20pCiAgaWYgKCFsaW5lVmlldy5tZWFzdXJlLmhlaWdodHMgfHwgd3JhcHBpbmcgJiYgbGluZVZpZXcubWVhc3VyZS53aWR0aCAhPSBjdXJXaWR0aCkgewogICAgdmFyIGhlaWdodHMgPSBsaW5lVmlldy5tZWFzdXJlLmhlaWdodHMgPSBbXQogICAgaWYgKHdyYXBwaW5nKSB7CiAgICAgIGxpbmVWaWV3Lm1lYXN1cmUud2lkdGggPSBjdXJXaWR0aAogICAgICB2YXIgcmVjdHMgPSBsaW5lVmlldy50ZXh0LmZpcnN0Q2hpbGQuZ2V0Q2xpZW50UmVjdHMoKQogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlY3RzLmxlbmd0aCAtIDE7IGkrKykgewogICAgICAgIHZhciBjdXIgPSByZWN0c1tpXSwgbmV4dCA9IHJlY3RzW2kgKyAxXQogICAgICAgIGlmIChNYXRoLmFicyhjdXIuYm90dG9tIC0gbmV4dC5ib3R0b20pID4gMikKICAgICAgICAgIHsgaGVpZ2h0cy5wdXNoKChjdXIuYm90dG9tICsgbmV4dC50b3ApIC8gMiAtIHJlY3QudG9wKSB9CiAgICAgIH0KICAgIH0KICAgIGhlaWdodHMucHVzaChyZWN0LmJvdHRvbSAtIHJlY3QudG9wKQogIH0KfQoKLy8gRmluZCBhIGxpbmUgbWFwIChtYXBwaW5nIGNoYXJhY3RlciBvZmZzZXRzIHRvIHRleHQgbm9kZXMpIGFuZCBhCi8vIG1lYXN1cmVtZW50IGNhY2hlIGZvciB0aGUgZ2l2ZW4gbGluZSBudW1iZXIuIChBIGxpbmUgdmlldyBtaWdodAovLyBjb250YWluIG11bHRpcGxlIGxpbmVzIHdoZW4gY29sbGFwc2VkIHJhbmdlcyBhcmUgcHJlc2VudC4pCmZ1bmN0aW9uIG1hcEZyb21MaW5lVmlldyhsaW5lVmlldywgbGluZSwgbGluZU4pIHsKICBpZiAobGluZVZpZXcubGluZSA9PSBsaW5lKQogICAgeyByZXR1cm4ge21hcDogbGluZVZpZXcubWVhc3VyZS5tYXAsIGNhY2hlOiBsaW5lVmlldy5tZWFzdXJlLmNhY2hlfSB9CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW5lVmlldy5yZXN0Lmxlbmd0aDsgaSsrKQogICAgeyBpZiAobGluZVZpZXcucmVzdFtpXSA9PSBsaW5lKQogICAgICB7IHJldHVybiB7bWFwOiBsaW5lVmlldy5tZWFzdXJlLm1hcHNbaV0sIGNhY2hlOiBsaW5lVmlldy5tZWFzdXJlLmNhY2hlc1tpXX0gfSB9CiAgZm9yICh2YXIgaSQxID0gMDsgaSQxIDwgbGluZVZpZXcucmVzdC5sZW5ndGg7IGkkMSsrKQogICAgeyBpZiAobGluZU5vKGxpbmVWaWV3LnJlc3RbaSQxXSkgPiBsaW5lTikKICAgICAgeyByZXR1cm4ge21hcDogbGluZVZpZXcubWVhc3VyZS5tYXBzW2kkMV0sIGNhY2hlOiBsaW5lVmlldy5tZWFzdXJlLmNhY2hlc1tpJDFdLCBiZWZvcmU6IHRydWV9IH0gfQp9CgovLyBSZW5kZXIgYSBsaW5lIGludG8gdGhlIGhpZGRlbiBub2RlIGRpc3BsYXkuZXh0ZXJuYWxNZWFzdXJlZC4gVXNlZAovLyB3aGVuIG1lYXN1cmVtZW50IGlzIG5lZWRlZCBmb3IgYSBsaW5lIHRoYXQncyBub3QgaW4gdGhlIHZpZXdwb3J0LgpmdW5jdGlvbiB1cGRhdGVFeHRlcm5hbE1lYXN1cmVtZW50KGNtLCBsaW5lKSB7CiAgbGluZSA9IHZpc3VhbExpbmUobGluZSkKICB2YXIgbGluZU4gPSBsaW5lTm8obGluZSkKICB2YXIgdmlldyA9IGNtLmRpc3BsYXkuZXh0ZXJuYWxNZWFzdXJlZCA9IG5ldyBMaW5lVmlldyhjbS5kb2MsIGxpbmUsIGxpbmVOKQogIHZpZXcubGluZU4gPSBsaW5lTgogIHZhciBidWlsdCA9IHZpZXcuYnVpbHQgPSBidWlsZExpbmVDb250ZW50KGNtLCB2aWV3KQogIHZpZXcudGV4dCA9IGJ1aWx0LnByZQogIHJlbW92ZUNoaWxkcmVuQW5kQWRkKGNtLmRpc3BsYXkubGluZU1lYXN1cmUsIGJ1aWx0LnByZSkKICByZXR1cm4gdmlldwp9CgovLyBHZXQgYSB7dG9wLCBib3R0b20sIGxlZnQsIHJpZ2h0fSBib3ggKGluIGxpbmUtbG9jYWwgY29vcmRpbmF0ZXMpCi8vIGZvciBhIGdpdmVuIGNoYXJhY3Rlci4KZnVuY3Rpb24gbWVhc3VyZUNoYXIoY20sIGxpbmUsIGNoLCBiaWFzKSB7CiAgcmV0dXJuIG1lYXN1cmVDaGFyUHJlcGFyZWQoY20sIHByZXBhcmVNZWFzdXJlRm9yTGluZShjbSwgbGluZSksIGNoLCBiaWFzKQp9CgovLyBGaW5kIGEgbGluZSB2aWV3IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGdpdmVuIGxpbmUgbnVtYmVyLgpmdW5jdGlvbiBmaW5kVmlld0ZvckxpbmUoY20sIGxpbmVOKSB7CiAgaWYgKGxpbmVOID49IGNtLmRpc3BsYXkudmlld0Zyb20gJiYgbGluZU4gPCBjbS5kaXNwbGF5LnZpZXdUbykKICAgIHsgcmV0dXJuIGNtLmRpc3BsYXkudmlld1tmaW5kVmlld0luZGV4KGNtLCBsaW5lTildIH0KICB2YXIgZXh0ID0gY20uZGlzcGxheS5leHRlcm5hbE1lYXN1cmVkCiAgaWYgKGV4dCAmJiBsaW5lTiA+PSBleHQubGluZU4gJiYgbGluZU4gPCBleHQubGluZU4gKyBleHQuc2l6ZSkKICAgIHsgcmV0dXJuIGV4dCB9Cn0KCi8vIE1lYXN1cmVtZW50IGNhbiBiZSBzcGxpdCBpbiB0d28gc3RlcHMsIHRoZSBzZXQtdXAgd29yayB0aGF0Ci8vIGFwcGxpZXMgdG8gdGhlIHdob2xlIGxpbmUsIGFuZCB0aGUgbWVhc3VyZW1lbnQgb2YgdGhlIGFjdHVhbAovLyBjaGFyYWN0ZXIuIEZ1bmN0aW9ucyBsaWtlIGNvb3Jkc0NoYXIsIHRoYXQgbmVlZCB0byBkbyBhIGxvdCBvZgovLyBtZWFzdXJlbWVudHMgaW4gYSByb3csIGNhbiB0aHVzIGVuc3VyZSB0aGF0IHRoZSBzZXQtdXAgd29yayBpcwovLyBvbmx5IGRvbmUgb25jZS4KZnVuY3Rpb24gcHJlcGFyZU1lYXN1cmVGb3JMaW5lKGNtLCBsaW5lKSB7CiAgdmFyIGxpbmVOID0gbGluZU5vKGxpbmUpCiAgdmFyIHZpZXcgPSBmaW5kVmlld0ZvckxpbmUoY20sIGxpbmVOKQogIGlmICh2aWV3ICYmICF2aWV3LnRleHQpIHsKICAgIHZpZXcgPSBudWxsCiAgfSBlbHNlIGlmICh2aWV3ICYmIHZpZXcuY2hhbmdlcykgewogICAgdXBkYXRlTGluZUZvckNoYW5nZXMoY20sIHZpZXcsIGxpbmVOLCBnZXREaW1lbnNpb25zKGNtKSkKICAgIGNtLmN1ck9wLmZvcmNlVXBkYXRlID0gdHJ1ZQogIH0KICBpZiAoIXZpZXcpCiAgICB7IHZpZXcgPSB1cGRhdGVFeHRlcm5hbE1lYXN1cmVtZW50KGNtLCBsaW5lKSB9CgogIHZhciBpbmZvID0gbWFwRnJvbUxpbmVWaWV3KHZpZXcsIGxpbmUsIGxpbmVOKQogIHJldHVybiB7CiAgICBsaW5lOiBsaW5lLCB2aWV3OiB2aWV3LCByZWN0OiBudWxsLAogICAgbWFwOiBpbmZvLm1hcCwgY2FjaGU6IGluZm8uY2FjaGUsIGJlZm9yZTogaW5mby5iZWZvcmUsCiAgICBoYXNIZWlnaHRzOiBmYWxzZQogIH0KfQoKLy8gR2l2ZW4gYSBwcmVwYXJlZCBtZWFzdXJlbWVudCBvYmplY3QsIG1lYXN1cmVzIHRoZSBwb3NpdGlvbiBvZiBhbgovLyBhY3R1YWwgY2hhcmFjdGVyIChvciBmZXRjaGVzIGl0IGZyb20gdGhlIGNhY2hlKS4KZnVuY3Rpb24gbWVhc3VyZUNoYXJQcmVwYXJlZChjbSwgcHJlcGFyZWQsIGNoLCBiaWFzLCB2YXJIZWlnaHQpIHsKICBpZiAocHJlcGFyZWQuYmVmb3JlKSB7IGNoID0gLTEgfQogIHZhciBrZXkgPSBjaCArIChiaWFzIHx8ICIiKSwgZm91bmQKICBpZiAocHJlcGFyZWQuY2FjaGUuaGFzT3duUHJvcGVydHkoa2V5KSkgewogICAgZm91bmQgPSBwcmVwYXJlZC5jYWNoZVtrZXldCiAgfSBlbHNlIHsKICAgIGlmICghcHJlcGFyZWQucmVjdCkKICAgICAgeyBwcmVwYXJlZC5yZWN0ID0gcHJlcGFyZWQudmlldy50ZXh0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpIH0KICAgIGlmICghcHJlcGFyZWQuaGFzSGVpZ2h0cykgewogICAgICBlbnN1cmVMaW5lSGVpZ2h0cyhjbSwgcHJlcGFyZWQudmlldywgcHJlcGFyZWQucmVjdCkKICAgICAgcHJlcGFyZWQuaGFzSGVpZ2h0cyA9IHRydWUKICAgIH0KICAgIGZvdW5kID0gbWVhc3VyZUNoYXJJbm5lcihjbSwgcHJlcGFyZWQsIGNoLCBiaWFzKQogICAgaWYgKCFmb3VuZC5ib2d1cykgeyBwcmVwYXJlZC5jYWNoZVtrZXldID0gZm91bmQgfQogIH0KICByZXR1cm4ge2xlZnQ6IGZvdW5kLmxlZnQsIHJpZ2h0OiBmb3VuZC5yaWdodCwKICAgICAgICAgIHRvcDogdmFySGVpZ2h0ID8gZm91bmQucnRvcCA6IGZvdW5kLnRvcCwKICAgICAgICAgIGJvdHRvbTogdmFySGVpZ2h0ID8gZm91bmQucmJvdHRvbSA6IGZvdW5kLmJvdHRvbX0KfQoKdmFyIG51bGxSZWN0ID0ge2xlZnQ6IDAsIHJpZ2h0OiAwLCB0b3A6IDAsIGJvdHRvbTogMH0KCmZ1bmN0aW9uIG5vZGVBbmRPZmZzZXRJbkxpbmVNYXAobWFwJCQxLCBjaCwgYmlhcykgewogIHZhciBub2RlLCBzdGFydCwgZW5kLCBjb2xsYXBzZSwgbVN0YXJ0LCBtRW5kCiAgLy8gRmlyc3QsIHNlYXJjaCB0aGUgbGluZSBtYXAgZm9yIHRoZSB0ZXh0IG5vZGUgY29ycmVzcG9uZGluZyB0bywKICAvLyBvciBjbG9zZXN0IHRvLCB0aGUgdGFyZ2V0IGNoYXJhY3Rlci4KICBmb3IgKHZhciBpID0gMDsgaSA8IG1hcCQkMS5sZW5ndGg7IGkgKz0gMykgewogICAgbVN0YXJ0ID0gbWFwJCQxW2ldCiAgICBtRW5kID0gbWFwJCQxW2kgKyAxXQogICAgaWYgKGNoIDwgbVN0YXJ0KSB7CiAgICAgIHN0YXJ0ID0gMDsgZW5kID0gMQogICAgICBjb2xsYXBzZSA9ICJsZWZ0IgogICAgfSBlbHNlIGlmIChjaCA8IG1FbmQpIHsKICAgICAgc3RhcnQgPSBjaCAtIG1TdGFydAogICAgICBlbmQgPSBzdGFydCArIDEKICAgIH0gZWxzZSBpZiAoaSA9PSBtYXAkJDEubGVuZ3RoIC0gMyB8fCBjaCA9PSBtRW5kICYmIG1hcCQkMVtpICsgM10gPiBjaCkgewogICAgICBlbmQgPSBtRW5kIC0gbVN0YXJ0CiAgICAgIHN0YXJ0ID0gZW5kIC0gMQogICAgICBpZiAoY2ggPj0gbUVuZCkgeyBjb2xsYXBzZSA9ICJyaWdodCIgfQogICAgfQogICAgaWYgKHN0YXJ0ICE9IG51bGwpIHsKICAgICAgbm9kZSA9IG1hcCQkMVtpICsgMl0KICAgICAgaWYgKG1TdGFydCA9PSBtRW5kICYmIGJpYXMgPT0gKG5vZGUuaW5zZXJ0TGVmdCA/ICJsZWZ0IiA6ICJyaWdodCIpKQogICAgICAgIHsgY29sbGFwc2UgPSBiaWFzIH0KICAgICAgaWYgKGJpYXMgPT0gImxlZnQiICYmIHN0YXJ0ID09IDApCiAgICAgICAgeyB3aGlsZSAoaSAmJiBtYXAkJDFbaSAtIDJdID09IG1hcCQkMVtpIC0gM10gJiYgbWFwJCQxW2kgLSAxXS5pbnNlcnRMZWZ0KSB7CiAgICAgICAgICBub2RlID0gbWFwJCQxWyhpIC09IDMpICsgMl0KICAgICAgICAgIGNvbGxhcHNlID0gImxlZnQiCiAgICAgICAgfSB9CiAgICAgIGlmIChiaWFzID09ICJyaWdodCIgJiYgc3RhcnQgPT0gbUVuZCAtIG1TdGFydCkKICAgICAgICB7IHdoaWxlIChpIDwgbWFwJCQxLmxlbmd0aCAtIDMgJiYgbWFwJCQxW2kgKyAzXSA9PSBtYXAkJDFbaSArIDRdICYmICFtYXAkJDFbaSArIDVdLmluc2VydExlZnQpIHsKICAgICAgICAgIG5vZGUgPSBtYXAkJDFbKGkgKz0gMykgKyAyXQogICAgICAgICAgY29sbGFwc2UgPSAicmlnaHQiCiAgICAgICAgfSB9CiAgICAgIGJyZWFrCiAgICB9CiAgfQogIHJldHVybiB7bm9kZTogbm9kZSwgc3RhcnQ6IHN0YXJ0LCBlbmQ6IGVuZCwgY29sbGFwc2U6IGNvbGxhcHNlLCBjb3ZlclN0YXJ0OiBtU3RhcnQsIGNvdmVyRW5kOiBtRW5kfQp9CgpmdW5jdGlvbiBnZXRVc2VmdWxSZWN0KHJlY3RzLCBiaWFzKSB7CiAgdmFyIHJlY3QgPSBudWxsUmVjdAogIGlmIChiaWFzID09ICJsZWZ0IikgeyBmb3IgKHZhciBpID0gMDsgaSA8IHJlY3RzLmxlbmd0aDsgaSsrKSB7CiAgICBpZiAoKHJlY3QgPSByZWN0c1tpXSkubGVmdCAhPSByZWN0LnJpZ2h0KSB7IGJyZWFrIH0KICB9IH0gZWxzZSB7IGZvciAodmFyIGkkMSA9IHJlY3RzLmxlbmd0aCAtIDE7IGkkMSA+PSAwOyBpJDEtLSkgewogICAgaWYgKChyZWN0ID0gcmVjdHNbaSQxXSkubGVmdCAhPSByZWN0LnJpZ2h0KSB7IGJyZWFrIH0KICB9IH0KICByZXR1cm4gcmVjdAp9CgpmdW5jdGlvbiBtZWFzdXJlQ2hhcklubmVyKGNtLCBwcmVwYXJlZCwgY2gsIGJpYXMpIHsKICB2YXIgcGxhY2UgPSBub2RlQW5kT2Zmc2V0SW5MaW5lTWFwKHByZXBhcmVkLm1hcCwgY2gsIGJpYXMpCiAgdmFyIG5vZGUgPSBwbGFjZS5ub2RlLCBzdGFydCA9IHBsYWNlLnN0YXJ0LCBlbmQgPSBwbGFjZS5lbmQsIGNvbGxhcHNlID0gcGxhY2UuY29sbGFwc2UKCiAgdmFyIHJlY3QKICBpZiAobm9kZS5ub2RlVHlwZSA9PSAzKSB7IC8vIElmIGl0IGlzIGEgdGV4dCBub2RlLCB1c2UgYSByYW5nZSB0byByZXRyaWV2ZSB0aGUgY29vcmRpbmF0ZXMuCiAgICBmb3IgKHZhciBpJDEgPSAwOyBpJDEgPCA0OyBpJDErKykgeyAvLyBSZXRyeSBhIG1heGltdW0gb2YgNCB0aW1lcyB3aGVuIG5vbnNlbnNlIHJlY3RhbmdsZXMgYXJlIHJldHVybmVkCiAgICAgIHdoaWxlIChzdGFydCAmJiBpc0V4dGVuZGluZ0NoYXIocHJlcGFyZWQubGluZS50ZXh0LmNoYXJBdChwbGFjZS5jb3ZlclN0YXJ0ICsgc3RhcnQpKSkgeyAtLXN0YXJ0IH0KICAgICAgd2hpbGUgKHBsYWNlLmNvdmVyU3RhcnQgKyBlbmQgPCBwbGFjZS5jb3ZlckVuZCAmJiBpc0V4dGVuZGluZ0NoYXIocHJlcGFyZWQubGluZS50ZXh0LmNoYXJBdChwbGFjZS5jb3ZlclN0YXJ0ICsgZW5kKSkpIHsgKytlbmQgfQogICAgICBpZiAoaWUgJiYgaWVfdmVyc2lvbiA8IDkgJiYgc3RhcnQgPT0gMCAmJiBlbmQgPT0gcGxhY2UuY292ZXJFbmQgLSBwbGFjZS5jb3ZlclN0YXJ0KQogICAgICAgIHsgcmVjdCA9IG5vZGUucGFyZW50Tm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSB9CiAgICAgIGVsc2UKICAgICAgICB7IHJlY3QgPSBnZXRVc2VmdWxSZWN0KHJhbmdlKG5vZGUsIHN0YXJ0LCBlbmQpLmdldENsaWVudFJlY3RzKCksIGJpYXMpIH0KICAgICAgaWYgKHJlY3QubGVmdCB8fCByZWN0LnJpZ2h0IHx8IHN0YXJ0ID09IDApIHsgYnJlYWsgfQogICAgICBlbmQgPSBzdGFydAogICAgICBzdGFydCA9IHN0YXJ0IC0gMQogICAgICBjb2xsYXBzZSA9ICJyaWdodCIKICAgIH0KICAgIGlmIChpZSAmJiBpZV92ZXJzaW9uIDwgMTEpIHsgcmVjdCA9IG1heWJlVXBkYXRlUmVjdEZvclpvb21pbmcoY20uZGlzcGxheS5tZWFzdXJlLCByZWN0KSB9CiAgfSBlbHNlIHsgLy8gSWYgaXQgaXMgYSB3aWRnZXQsIHNpbXBseSBnZXQgdGhlIGJveCBmb3IgdGhlIHdob2xlIHdpZGdldC4KICAgIGlmIChzdGFydCA+IDApIHsgY29sbGFwc2UgPSBiaWFzID0gInJpZ2h0IiB9CiAgICB2YXIgcmVjdHMKICAgIGlmIChjbS5vcHRpb25zLmxpbmVXcmFwcGluZyAmJiAocmVjdHMgPSBub2RlLmdldENsaWVudFJlY3RzKCkpLmxlbmd0aCA+IDEpCiAgICAgIHsgcmVjdCA9IHJlY3RzW2JpYXMgPT0gInJpZ2h0IiA/IHJlY3RzLmxlbmd0aCAtIDEgOiAwXSB9CiAgICBlbHNlCiAgICAgIHsgcmVjdCA9IG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkgfQogIH0KICBpZiAoaWUgJiYgaWVfdmVyc2lvbiA8IDkgJiYgIXN0YXJ0ICYmICghcmVjdCB8fCAhcmVjdC5sZWZ0ICYmICFyZWN0LnJpZ2h0KSkgewogICAgdmFyIHJTcGFuID0gbm9kZS5wYXJlbnROb2RlLmdldENsaWVudFJlY3RzKClbMF0KICAgIGlmIChyU3BhbikKICAgICAgeyByZWN0ID0ge2xlZnQ6IHJTcGFuLmxlZnQsIHJpZ2h0OiByU3Bhbi5sZWZ0ICsgY2hhcldpZHRoKGNtLmRpc3BsYXkpLCB0b3A6IHJTcGFuLnRvcCwgYm90dG9tOiByU3Bhbi5ib3R0b219IH0KICAgIGVsc2UKICAgICAgeyByZWN0ID0gbnVsbFJlY3QgfQogIH0KCiAgdmFyIHJ0b3AgPSByZWN0LnRvcCAtIHByZXBhcmVkLnJlY3QudG9wLCByYm90ID0gcmVjdC5ib3R0b20gLSBwcmVwYXJlZC5yZWN0LnRvcAogIHZhciBtaWQgPSAocnRvcCArIHJib3QpIC8gMgogIHZhciBoZWlnaHRzID0gcHJlcGFyZWQudmlldy5tZWFzdXJlLmhlaWdodHMKICB2YXIgaSA9IDAKICBmb3IgKDsgaSA8IGhlaWdodHMubGVuZ3RoIC0gMTsgaSsrKQogICAgeyBpZiAobWlkIDwgaGVpZ2h0c1tpXSkgeyBicmVhayB9IH0KICB2YXIgdG9wID0gaSA/IGhlaWdodHNbaSAtIDFdIDogMCwgYm90ID0gaGVpZ2h0c1tpXQogIHZhciByZXN1bHQgPSB7bGVmdDogKGNvbGxhcHNlID09ICJyaWdodCIgPyByZWN0LnJpZ2h0IDogcmVjdC5sZWZ0KSAtIHByZXBhcmVkLnJlY3QubGVmdCwKICAgICAgICAgICAgICAgIHJpZ2h0OiAoY29sbGFwc2UgPT0gImxlZnQiID8gcmVjdC5sZWZ0IDogcmVjdC5yaWdodCkgLSBwcmVwYXJlZC5yZWN0LmxlZnQsCiAgICAgICAgICAgICAgICB0b3A6IHRvcCwgYm90dG9tOiBib3R9CiAgaWYgKCFyZWN0LmxlZnQgJiYgIXJlY3QucmlnaHQpIHsgcmVzdWx0LmJvZ3VzID0gdHJ1ZSB9CiAgaWYgKCFjbS5vcHRpb25zLnNpbmdsZUN1cnNvckhlaWdodFBlckxpbmUpIHsgcmVzdWx0LnJ0b3AgPSBydG9wOyByZXN1bHQucmJvdHRvbSA9IHJib3QgfQoKICByZXR1cm4gcmVzdWx0Cn0KCi8vIFdvcmsgYXJvdW5kIHByb2JsZW0gd2l0aCBib3VuZGluZyBjbGllbnQgcmVjdHMgb24gcmFuZ2VzIGJlaW5nCi8vIHJldHVybmVkIGluY29ycmVjdGx5IHdoZW4gem9vbWVkIG9uIElFMTAgYW5kIGJlbG93LgpmdW5jdGlvbiBtYXliZVVwZGF0ZVJlY3RGb3Jab29taW5nKG1lYXN1cmUsIHJlY3QpIHsKICBpZiAoIXdpbmRvdy5zY3JlZW4gfHwgc2NyZWVuLmxvZ2ljYWxYRFBJID09IG51bGwgfHwKICAgICAgc2NyZWVuLmxvZ2ljYWxYRFBJID09IHNjcmVlbi5kZXZpY2VYRFBJIHx8ICFoYXNCYWRab29tZWRSZWN0cyhtZWFzdXJlKSkKICAgIHsgcmV0dXJuIHJlY3QgfQogIHZhciBzY2FsZVggPSBzY3JlZW4ubG9naWNhbFhEUEkgLyBzY3JlZW4uZGV2aWNlWERQSQogIHZhciBzY2FsZVkgPSBzY3JlZW4ubG9naWNhbFlEUEkgLyBzY3JlZW4uZGV2aWNlWURQSQogIHJldHVybiB7bGVmdDogcmVjdC5sZWZ0ICogc2NhbGVYLCByaWdodDogcmVjdC5yaWdodCAqIHNjYWxlWCwKICAgICAgICAgIHRvcDogcmVjdC50b3AgKiBzY2FsZVksIGJvdHRvbTogcmVjdC5ib3R0b20gKiBzY2FsZVl9Cn0KCmZ1bmN0aW9uIGNsZWFyTGluZU1lYXN1cmVtZW50Q2FjaGVGb3IobGluZVZpZXcpIHsKICBpZiAobGluZVZpZXcubWVhc3VyZSkgewogICAgbGluZVZpZXcubWVhc3VyZS5jYWNoZSA9IHt9CiAgICBsaW5lVmlldy5tZWFzdXJlLmhlaWdodHMgPSBudWxsCiAgICBpZiAobGluZVZpZXcucmVzdCkgeyBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmVWaWV3LnJlc3QubGVuZ3RoOyBpKyspCiAgICAgIHsgbGluZVZpZXcubWVhc3VyZS5jYWNoZXNbaV0gPSB7fSB9IH0KICB9Cn0KCmZ1bmN0aW9uIGNsZWFyTGluZU1lYXN1cmVtZW50Q2FjaGUoY20pIHsKICBjbS5kaXNwbGF5LmV4dGVybmFsTWVhc3VyZSA9IG51bGwKICByZW1vdmVDaGlsZHJlbihjbS5kaXNwbGF5LmxpbmVNZWFzdXJlKQogIGZvciAodmFyIGkgPSAwOyBpIDwgY20uZGlzcGxheS52aWV3Lmxlbmd0aDsgaSsrKQogICAgeyBjbGVhckxpbmVNZWFzdXJlbWVudENhY2hlRm9yKGNtLmRpc3BsYXkudmlld1tpXSkgfQp9CgpmdW5jdGlvbiBjbGVhckNhY2hlcyhjbSkgewogIGNsZWFyTGluZU1lYXN1cmVtZW50Q2FjaGUoY20pCiAgY20uZGlzcGxheS5jYWNoZWRDaGFyV2lkdGggPSBjbS5kaXNwbGF5LmNhY2hlZFRleHRIZWlnaHQgPSBjbS5kaXNwbGF5LmNhY2hlZFBhZGRpbmdIID0gbnVsbAogIGlmICghY20ub3B0aW9ucy5saW5lV3JhcHBpbmcpIHsgY20uZGlzcGxheS5tYXhMaW5lQ2hhbmdlZCA9IHRydWUgfQogIGNtLmRpc3BsYXkubGluZU51bUNoYXJzID0gbnVsbAp9CgpmdW5jdGlvbiBwYWdlU2Nyb2xsWCgpIHsgcmV0dXJuIHdpbmRvdy5wYWdlWE9mZnNldCB8fCAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IHx8IGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQgfQpmdW5jdGlvbiBwYWdlU2Nyb2xsWSgpIHsgcmV0dXJuIHdpbmRvdy5wYWdlWU9mZnNldCB8fCAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IHx8IGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCB9CgovLyBDb252ZXJ0cyBhIHt0b3AsIGJvdHRvbSwgbGVmdCwgcmlnaHR9IGJveCBmcm9tIGxpbmUtbG9jYWwKLy8gY29vcmRpbmF0ZXMgaW50byBhbm90aGVyIGNvb3JkaW5hdGUgc3lzdGVtLiBDb250ZXh0IG1heSBiZSBvbmUgb2YKLy8gImxpbmUiLCAiZGl2IiAoZGlzcGxheS5saW5lRGl2KSwgImxvY2FsIi4vbnVsbCAoZWRpdG9yKSwgIndpbmRvdyIsCi8vIG9yICJwYWdlIi4KZnVuY3Rpb24gaW50b0Nvb3JkU3lzdGVtKGNtLCBsaW5lT2JqLCByZWN0LCBjb250ZXh0KSB7CiAgaWYgKGxpbmVPYmoud2lkZ2V0cykgeyBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmVPYmoud2lkZ2V0cy5sZW5ndGg7ICsraSkgeyBpZiAobGluZU9iai53aWRnZXRzW2ldLmFib3ZlKSB7CiAgICB2YXIgc2l6ZSA9IHdpZGdldEhlaWdodChsaW5lT2JqLndpZGdldHNbaV0pCiAgICByZWN0LnRvcCArPSBzaXplOyByZWN0LmJvdHRvbSArPSBzaXplCiAgfSB9IH0KICBpZiAoY29udGV4dCA9PSAibGluZSIpIHsgcmV0dXJuIHJlY3QgfQogIGlmICghY29udGV4dCkgeyBjb250ZXh0ID0gImxvY2FsIiB9CiAgdmFyIHlPZmYgPSBoZWlnaHRBdExpbmUobGluZU9iaikKICBpZiAoY29udGV4dCA9PSAibG9jYWwiKSB7IHlPZmYgKz0gcGFkZGluZ1RvcChjbS5kaXNwbGF5KSB9CiAgZWxzZSB7IHlPZmYgLT0gY20uZGlzcGxheS52aWV3T2Zmc2V0IH0KICBpZiAoY29udGV4dCA9PSAicGFnZSIgfHwgY29udGV4dCA9PSAid2luZG93IikgewogICAgdmFyIGxPZmYgPSBjbS5kaXNwbGF5LmxpbmVTcGFjZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKQogICAgeU9mZiArPSBsT2ZmLnRvcCArIChjb250ZXh0ID09ICJ3aW5kb3ciID8gMCA6IHBhZ2VTY3JvbGxZKCkpCiAgICB2YXIgeE9mZiA9IGxPZmYubGVmdCArIChjb250ZXh0ID09ICJ3aW5kb3ciID8gMCA6IHBhZ2VTY3JvbGxYKCkpCiAgICByZWN0LmxlZnQgKz0geE9mZjsgcmVjdC5yaWdodCArPSB4T2ZmCiAgfQogIHJlY3QudG9wICs9IHlPZmY7IHJlY3QuYm90dG9tICs9IHlPZmYKICByZXR1cm4gcmVjdAp9CgovLyBDb3ZlcnRzIGEgYm94IGZyb20gImRpdiIgY29vcmRzIHRvIGFub3RoZXIgY29vcmRpbmF0ZSBzeXN0ZW0uCi8vIENvbnRleHQgbWF5IGJlICJ3aW5kb3ciLCAicGFnZSIsICJkaXYiLCBvciAibG9jYWwiLi9udWxsLgpmdW5jdGlvbiBmcm9tQ29vcmRTeXN0ZW0oY20sIGNvb3JkcywgY29udGV4dCkgewogIGlmIChjb250ZXh0ID09ICJkaXYiKSB7IHJldHVybiBjb29yZHMgfQogIHZhciBsZWZ0ID0gY29vcmRzLmxlZnQsIHRvcCA9IGNvb3Jkcy50b3AKICAvLyBGaXJzdCBtb3ZlIGludG8gInBhZ2UiIGNvb3JkaW5hdGUgc3lzdGVtCiAgaWYgKGNvbnRleHQgPT0gInBhZ2UiKSB7CiAgICBsZWZ0IC09IHBhZ2VTY3JvbGxYKCkKICAgIHRvcCAtPSBwYWdlU2Nyb2xsWSgpCiAgfSBlbHNlIGlmIChjb250ZXh0ID09ICJsb2NhbCIgfHwgIWNvbnRleHQpIHsKICAgIHZhciBsb2NhbEJveCA9IGNtLmRpc3BsYXkuc2l6ZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkKICAgIGxlZnQgKz0gbG9jYWxCb3gubGVmdAogICAgdG9wICs9IGxvY2FsQm94LnRvcAogIH0KCiAgdmFyIGxpbmVTcGFjZUJveCA9IGNtLmRpc3BsYXkubGluZVNwYWNlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpCiAgcmV0dXJuIHtsZWZ0OiBsZWZ0IC0gbGluZVNwYWNlQm94LmxlZnQsIHRvcDogdG9wIC0gbGluZVNwYWNlQm94LnRvcH0KfQoKZnVuY3Rpb24gY2hhckNvb3JkcyhjbSwgcG9zLCBjb250ZXh0LCBsaW5lT2JqLCBiaWFzKSB7CiAgaWYgKCFsaW5lT2JqKSB7IGxpbmVPYmogPSBnZXRMaW5lKGNtLmRvYywgcG9zLmxpbmUpIH0KICByZXR1cm4gaW50b0Nvb3JkU3lzdGVtKGNtLCBsaW5lT2JqLCBtZWFzdXJlQ2hhcihjbSwgbGluZU9iaiwgcG9zLmNoLCBiaWFzKSwgY29udGV4dCkKfQoKLy8gUmV0dXJucyBhIGJveCBmb3IgYSBnaXZlbiBjdXJzb3IgcG9zaXRpb24sIHdoaWNoIG1heSBoYXZlIGFuCi8vICdvdGhlcicgcHJvcGVydHkgY29udGFpbmluZyB0aGUgcG9zaXRpb24gb2YgdGhlIHNlY29uZGFyeSBjdXJzb3IKLy8gb24gYSBiaWRpIGJvdW5kYXJ5LgpmdW5jdGlvbiBjdXJzb3JDb29yZHMoY20sIHBvcywgY29udGV4dCwgbGluZU9iaiwgcHJlcGFyZWRNZWFzdXJlLCB2YXJIZWlnaHQpIHsKICBsaW5lT2JqID0gbGluZU9iaiB8fCBnZXRMaW5lKGNtLmRvYywgcG9zLmxpbmUpCiAgaWYgKCFwcmVwYXJlZE1lYXN1cmUpIHsgcHJlcGFyZWRNZWFzdXJlID0gcHJlcGFyZU1lYXN1cmVGb3JMaW5lKGNtLCBsaW5lT2JqKSB9CiAgZnVuY3Rpb24gZ2V0KGNoLCByaWdodCkgewogICAgdmFyIG0gPSBtZWFzdXJlQ2hhclByZXBhcmVkKGNtLCBwcmVwYXJlZE1lYXN1cmUsIGNoLCByaWdodCA/ICJyaWdodCIgOiAibGVmdCIsIHZhckhlaWdodCkKICAgIGlmIChyaWdodCkgeyBtLmxlZnQgPSBtLnJpZ2h0OyB9IGVsc2UgeyBtLnJpZ2h0ID0gbS5sZWZ0IH0KICAgIHJldHVybiBpbnRvQ29vcmRTeXN0ZW0oY20sIGxpbmVPYmosIG0sIGNvbnRleHQpCiAgfQogIGZ1bmN0aW9uIGdldEJpZGkoY2gsIHBhcnRQb3MpIHsKICAgIHZhciBwYXJ0ID0gb3JkZXJbcGFydFBvc10sIHJpZ2h0ID0gcGFydC5sZXZlbCAlIDIKICAgIGlmIChjaCA9PSBiaWRpTGVmdChwYXJ0KSAmJiBwYXJ0UG9zICYmIHBhcnQubGV2ZWwgPCBvcmRlcltwYXJ0UG9zIC0gMV0ubGV2ZWwpIHsKICAgICAgcGFydCA9IG9yZGVyWy0tcGFydFBvc10KICAgICAgY2ggPSBiaWRpUmlnaHQocGFydCkgLSAocGFydC5sZXZlbCAlIDIgPyAwIDogMSkKICAgICAgcmlnaHQgPSB0cnVlCiAgICB9IGVsc2UgaWYgKGNoID09IGJpZGlSaWdodChwYXJ0KSAmJiBwYXJ0UG9zIDwgb3JkZXIubGVuZ3RoIC0gMSAmJiBwYXJ0LmxldmVsIDwgb3JkZXJbcGFydFBvcyArIDFdLmxldmVsKSB7CiAgICAgIHBhcnQgPSBvcmRlclsrK3BhcnRQb3NdCiAgICAgIGNoID0gYmlkaUxlZnQocGFydCkgLSBwYXJ0LmxldmVsICUgMgogICAgICByaWdodCA9IGZhbHNlCiAgICB9CiAgICBpZiAocmlnaHQgJiYgY2ggPT0gcGFydC50byAmJiBjaCA+IHBhcnQuZnJvbSkgeyByZXR1cm4gZ2V0KGNoIC0gMSkgfQogICAgcmV0dXJuIGdldChjaCwgcmlnaHQpCiAgfQogIHZhciBvcmRlciA9IGdldE9yZGVyKGxpbmVPYmopLCBjaCA9IHBvcy5jaAogIGlmICghb3JkZXIpIHsgcmV0dXJuIGdldChjaCkgfQogIHZhciBwYXJ0UG9zID0gZ2V0QmlkaVBhcnRBdChvcmRlciwgY2gpCiAgdmFyIHZhbCA9IGdldEJpZGkoY2gsIHBhcnRQb3MpCiAgaWYgKGJpZGlPdGhlciAhPSBudWxsKSB7IHZhbC5vdGhlciA9IGdldEJpZGkoY2gsIGJpZGlPdGhlcikgfQogIHJldHVybiB2YWwKfQoKLy8gVXNlZCB0byBjaGVhcGx5IGVzdGltYXRlIHRoZSBjb29yZGluYXRlcyBmb3IgYSBwb3NpdGlvbi4gVXNlZCBmb3IKLy8gaW50ZXJtZWRpYXRlIHNjcm9sbCB1cGRhdGVzLgpmdW5jdGlvbiBlc3RpbWF0ZUNvb3JkcyhjbSwgcG9zKSB7CiAgdmFyIGxlZnQgPSAwCiAgcG9zID0gY2xpcFBvcyhjbS5kb2MsIHBvcykKICBpZiAoIWNtLm9wdGlvbnMubGluZVdyYXBwaW5nKSB7IGxlZnQgPSBjaGFyV2lkdGgoY20uZGlzcGxheSkgKiBwb3MuY2ggfQogIHZhciBsaW5lT2JqID0gZ2V0TGluZShjbS5kb2MsIHBvcy5saW5lKQogIHZhciB0b3AgPSBoZWlnaHRBdExpbmUobGluZU9iaikgKyBwYWRkaW5nVG9wKGNtLmRpc3BsYXkpCiAgcmV0dXJuIHtsZWZ0OiBsZWZ0LCByaWdodDogbGVmdCwgdG9wOiB0b3AsIGJvdHRvbTogdG9wICsgbGluZU9iai5oZWlnaHR9Cn0KCi8vIFBvc2l0aW9ucyByZXR1cm5lZCBieSBjb29yZHNDaGFyIGNvbnRhaW4gc29tZSBleHRyYSBpbmZvcm1hdGlvbi4KLy8geFJlbCBpcyB0aGUgcmVsYXRpdmUgeCBwb3NpdGlvbiBvZiB0aGUgaW5wdXQgY29vcmRpbmF0ZXMgY29tcGFyZWQKLy8gdG8gdGhlIGZvdW5kIHBvc2l0aW9uIChzbyB4UmVsID4gMCBtZWFucyB0aGUgY29vcmRpbmF0ZXMgYXJlIHRvCi8vIHRoZSByaWdodCBvZiB0aGUgY2hhcmFjdGVyIHBvc2l0aW9uLCBmb3IgZXhhbXBsZSkuIFdoZW4gb3V0c2lkZQovLyBpcyB0cnVlLCB0aGF0IG1lYW5zIHRoZSBjb29yZGluYXRlcyBsaWUgb3V0c2lkZSB0aGUgbGluZSdzCi8vIHZlcnRpY2FsIHJhbmdlLgpmdW5jdGlvbiBQb3NXaXRoSW5mbyhsaW5lLCBjaCwgb3V0c2lkZSwgeFJlbCkgewogIHZhciBwb3MgPSBQb3MobGluZSwgY2gpCiAgcG9zLnhSZWwgPSB4UmVsCiAgaWYgKG91dHNpZGUpIHsgcG9zLm91dHNpZGUgPSB0cnVlIH0KICByZXR1cm4gcG9zCn0KCi8vIENvbXB1dGUgdGhlIGNoYXJhY3RlciBwb3NpdGlvbiBjbG9zZXN0IHRvIHRoZSBnaXZlbiBjb29yZGluYXRlcy4KLy8gSW5wdXQgbXVzdCBiZSBsaW5lU3BhY2UtbG9jYWwgKCJkaXYiIGNvb3JkaW5hdGUgc3lzdGVtKS4KZnVuY3Rpb24gY29vcmRzQ2hhcihjbSwgeCwgeSkgewogIHZhciBkb2MgPSBjbS5kb2MKICB5ICs9IGNtLmRpc3BsYXkudmlld09mZnNldAogIGlmICh5IDwgMCkgeyByZXR1cm4gUG9zV2l0aEluZm8oZG9jLmZpcnN0LCAwLCB0cnVlLCAtMSkgfQogIHZhciBsaW5lTiA9IGxpbmVBdEhlaWdodChkb2MsIHkpLCBsYXN0ID0gZG9jLmZpcnN0ICsgZG9jLnNpemUgLSAxCiAgaWYgKGxpbmVOID4gbGFzdCkKICAgIHsgcmV0dXJuIFBvc1dpdGhJbmZvKGRvYy5maXJzdCArIGRvYy5zaXplIC0gMSwgZ2V0TGluZShkb2MsIGxhc3QpLnRleHQubGVuZ3RoLCB0cnVlLCAxKSB9CiAgaWYgKHggPCAwKSB7IHggPSAwIH0KCiAgdmFyIGxpbmVPYmogPSBnZXRMaW5lKGRvYywgbGluZU4pCiAgZm9yICg7OykgewogICAgdmFyIGZvdW5kID0gY29vcmRzQ2hhcklubmVyKGNtLCBsaW5lT2JqLCBsaW5lTiwgeCwgeSkKICAgIHZhciBtZXJnZWQgPSBjb2xsYXBzZWRTcGFuQXRFbmQobGluZU9iaikKICAgIHZhciBtZXJnZWRQb3MgPSBtZXJnZWQgJiYgbWVyZ2VkLmZpbmQoMCwgdHJ1ZSkKICAgIGlmIChtZXJnZWQgJiYgKGZvdW5kLmNoID4gbWVyZ2VkUG9zLmZyb20uY2ggfHwgZm91bmQuY2ggPT0gbWVyZ2VkUG9zLmZyb20uY2ggJiYgZm91bmQueFJlbCA+IDApKQogICAgICB7IGxpbmVOID0gbGluZU5vKGxpbmVPYmogPSBtZXJnZWRQb3MudG8ubGluZSkgfQogICAgZWxzZQogICAgICB7IHJldHVybiBmb3VuZCB9CiAgfQp9CgpmdW5jdGlvbiBjb29yZHNDaGFySW5uZXIoY20sIGxpbmVPYmosIGxpbmVObyQkMSwgeCwgeSkgewogIHZhciBpbm5lck9mZiA9IHkgLSBoZWlnaHRBdExpbmUobGluZU9iaikKICB2YXIgd3JvbmdMaW5lID0gZmFsc2UsIGFkanVzdCA9IDIgKiBjbS5kaXNwbGF5LndyYXBwZXIuY2xpZW50V2lkdGgKICB2YXIgcHJlcGFyZWRNZWFzdXJlID0gcHJlcGFyZU1lYXN1cmVGb3JMaW5lKGNtLCBsaW5lT2JqKQoKICBmdW5jdGlvbiBnZXRYKGNoKSB7CiAgICB2YXIgc3AgPSBjdXJzb3JDb29yZHMoY20sIFBvcyhsaW5lTm8kJDEsIGNoKSwgImxpbmUiLCBsaW5lT2JqLCBwcmVwYXJlZE1lYXN1cmUpCiAgICB3cm9uZ0xpbmUgPSB0cnVlCiAgICBpZiAoaW5uZXJPZmYgPiBzcC5ib3R0b20pIHsgcmV0dXJuIHNwLmxlZnQgLSBhZGp1c3QgfQogICAgZWxzZSBpZiAoaW5uZXJPZmYgPCBzcC50b3ApIHsgcmV0dXJuIHNwLmxlZnQgKyBhZGp1c3QgfQogICAgZWxzZSB7IHdyb25nTGluZSA9IGZhbHNlIH0KICAgIHJldHVybiBzcC5sZWZ0CiAgfQoKICB2YXIgYmlkaSA9IGdldE9yZGVyKGxpbmVPYmopLCBkaXN0ID0gbGluZU9iai50ZXh0Lmxlbmd0aAogIHZhciBmcm9tID0gbGluZUxlZnQobGluZU9iaiksIHRvID0gbGluZVJpZ2h0KGxpbmVPYmopCiAgdmFyIGZyb21YID0gZ2V0WChmcm9tKSwgZnJvbU91dHNpZGUgPSB3cm9uZ0xpbmUsIHRvWCA9IGdldFgodG8pLCB0b091dHNpZGUgPSB3cm9uZ0xpbmUKCiAgaWYgKHggPiB0b1gpIHsgcmV0dXJuIFBvc1dpdGhJbmZvKGxpbmVObyQkMSwgdG8sIHRvT3V0c2lkZSwgMSkgfQogIC8vIERvIGEgYmluYXJ5IHNlYXJjaCBiZXR3ZWVuIHRoZXNlIGJvdW5kcy4KICBmb3IgKDs7KSB7CiAgICBpZiAoYmlkaSA/IHRvID09IGZyb20gfHwgdG8gPT0gbW92ZVZpc3VhbGx5KGxpbmVPYmosIGZyb20sIDEpIDogdG8gLSBmcm9tIDw9IDEpIHsKICAgICAgdmFyIGNoID0geCA8IGZyb21YIHx8IHggLSBmcm9tWCA8PSB0b1ggLSB4ID8gZnJvbSA6IHRvCiAgICAgIHZhciBvdXRzaWRlID0gY2ggPT0gZnJvbSA/IGZyb21PdXRzaWRlIDogdG9PdXRzaWRlCiAgICAgIHZhciB4RGlmZiA9IHggLSAoY2ggPT0gZnJvbSA/IGZyb21YIDogdG9YKQogICAgICAvLyBUaGlzIGlzIGEga2x1ZGdlIHRvIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGUgY29vcmRpbmF0ZXMKICAgICAgLy8gYXJlIGFmdGVyIGEgbGluZS13cmFwcGVkIGxpbmUuIFdlIHNob3VsZCByZXBsYWNlIGl0IHdpdGggYQogICAgICAvLyBtb3JlIGdlbmVyYWwgaGFuZGxpbmcgb2YgY3Vyc29yIHBvc2l0aW9ucyBhcm91bmQgbGluZQogICAgICAvLyBicmVha3MuIChJc3N1ZSAjNDA3OCkKICAgICAgaWYgKHRvT3V0c2lkZSAmJiAhYmlkaSAmJiAhL1xzLy50ZXN0KGxpbmVPYmoudGV4dC5jaGFyQXQoY2gpKSAmJiB4RGlmZiA+IDAgJiYKICAgICAgICAgIGNoIDwgbGluZU9iai50ZXh0Lmxlbmd0aCAmJiBwcmVwYXJlZE1lYXN1cmUudmlldy5tZWFzdXJlLmhlaWdodHMubGVuZ3RoID4gMSkgewogICAgICAgIHZhciBjaGFyU2l6ZSA9IG1lYXN1cmVDaGFyUHJlcGFyZWQoY20sIHByZXBhcmVkTWVhc3VyZSwgY2gsICJyaWdodCIpCiAgICAgICAgaWYgKGlubmVyT2ZmIDw9IGNoYXJTaXplLmJvdHRvbSAmJiBpbm5lck9mZiA+PSBjaGFyU2l6ZS50b3AgJiYgTWF0aC5hYnMoeCAtIGNoYXJTaXplLnJpZ2h0KSA8IHhEaWZmKSB7CiAgICAgICAgICBvdXRzaWRlID0gZmFsc2UKICAgICAgICAgIGNoKysKICAgICAgICAgIHhEaWZmID0geCAtIGNoYXJTaXplLnJpZ2h0CiAgICAgICAgfQogICAgICB9CiAgICAgIHdoaWxlIChpc0V4dGVuZGluZ0NoYXIobGluZU9iai50ZXh0LmNoYXJBdChjaCkpKSB7ICsrY2ggfQogICAgICB2YXIgcG9zID0gUG9zV2l0aEluZm8obGluZU5vJCQxLCBjaCwgb3V0c2lkZSwgeERpZmYgPCAtMSA/IC0xIDogeERpZmYgPiAxID8gMSA6IDApCiAgICAgIHJldHVybiBwb3MKICAgIH0KICAgIHZhciBzdGVwID0gTWF0aC5jZWlsKGRpc3QgLyAyKSwgbWlkZGxlID0gZnJvbSArIHN0ZXAKICAgIGlmIChiaWRpKSB7CiAgICAgIG1pZGRsZSA9IGZyb20KICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGVwOyArK2kpIHsgbWlkZGxlID0gbW92ZVZpc3VhbGx5KGxpbmVPYmosIG1pZGRsZSwgMSkgfQogICAgfQogICAgdmFyIG1pZGRsZVggPSBnZXRYKG1pZGRsZSkKICAgIGlmIChtaWRkbGVYID4geCkge3RvID0gbWlkZGxlOyB0b1ggPSBtaWRkbGVYOyBpZiAodG9PdXRzaWRlID0gd3JvbmdMaW5lKSB7IHRvWCArPSAxMDAwOyB9IGRpc3QgPSBzdGVwfQogICAgZWxzZSB7ZnJvbSA9IG1pZGRsZTsgZnJvbVggPSBtaWRkbGVYOyBmcm9tT3V0c2lkZSA9IHdyb25nTGluZTsgZGlzdCAtPSBzdGVwfQogIH0KfQoKdmFyIG1lYXN1cmVUZXh0Ci8vIENvbXB1dGUgdGhlIGRlZmF1bHQgdGV4dCBoZWlnaHQuCmZ1bmN0aW9uIHRleHRIZWlnaHQoZGlzcGxheSkgewogIGlmIChkaXNwbGF5LmNhY2hlZFRleHRIZWlnaHQgIT0gbnVsbCkgeyByZXR1cm4gZGlzcGxheS5jYWNoZWRUZXh0SGVpZ2h0IH0KICBpZiAobWVhc3VyZVRleHQgPT0gbnVsbCkgewogICAgbWVhc3VyZVRleHQgPSBlbHQoInByZSIpCiAgICAvLyBNZWFzdXJlIGEgYnVuY2ggb2YgbGluZXMsIGZvciBicm93c2VycyB0aGF0IGNvbXB1dGUKICAgIC8vIGZyYWN0aW9uYWwgaGVpZ2h0cy4KICAgIGZvciAodmFyIGkgPSAwOyBpIDwgNDk7ICsraSkgewogICAgICBtZWFzdXJlVGV4dC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgieCIpKQogICAgICBtZWFzdXJlVGV4dC5hcHBlbmRDaGlsZChlbHQoImJyIikpCiAgICB9CiAgICBtZWFzdXJlVGV4dC5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgieCIpKQogIH0KICByZW1vdmVDaGlsZHJlbkFuZEFkZChkaXNwbGF5Lm1lYXN1cmUsIG1lYXN1cmVUZXh0KQogIHZhciBoZWlnaHQgPSBtZWFzdXJlVGV4dC5vZmZzZXRIZWlnaHQgLyA1MAogIGlmIChoZWlnaHQgPiAzKSB7IGRpc3BsYXkuY2FjaGVkVGV4dEhlaWdodCA9IGhlaWdodCB9CiAgcmVtb3ZlQ2hpbGRyZW4oZGlzcGxheS5tZWFzdXJlKQogIHJldHVybiBoZWlnaHQgfHwgMQp9CgovLyBDb21wdXRlIHRoZSBkZWZhdWx0IGNoYXJhY3RlciB3aWR0aC4KZnVuY3Rpb24gY2hhcldpZHRoKGRpc3BsYXkpIHsKICBpZiAoZGlzcGxheS5jYWNoZWRDaGFyV2lkdGggIT0gbnVsbCkgeyByZXR1cm4gZGlzcGxheS5jYWNoZWRDaGFyV2lkdGggfQogIHZhciBhbmNob3IgPSBlbHQoInNwYW4iLCAieHh4eHh4eHh4eCIpCiAgdmFyIHByZSA9IGVsdCgicHJlIiwgW2FuY2hvcl0pCiAgcmVtb3ZlQ2hpbGRyZW5BbmRBZGQoZGlzcGxheS5tZWFzdXJlLCBwcmUpCiAgdmFyIHJlY3QgPSBhbmNob3IuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIHdpZHRoID0gKHJlY3QucmlnaHQgLSByZWN0LmxlZnQpIC8gMTAKICBpZiAod2lkdGggPiAyKSB7IGRpc3BsYXkuY2FjaGVkQ2hhcldpZHRoID0gd2lkdGggfQogIHJldHVybiB3aWR0aCB8fCAxMAp9CgovLyBEbyBhIGJ1bGstcmVhZCBvZiB0aGUgRE9NIHBvc2l0aW9ucyBhbmQgc2l6ZXMgbmVlZGVkIHRvIGRyYXcgdGhlCi8vIHZpZXcsIHNvIHRoYXQgd2UgZG9uJ3QgaW50ZXJsZWF2ZSByZWFkaW5nIGFuZCB3cml0aW5nIHRvIHRoZSBET00uCmZ1bmN0aW9uIGdldERpbWVuc2lvbnMoY20pIHsKICB2YXIgZCA9IGNtLmRpc3BsYXksIGxlZnQgPSB7fSwgd2lkdGggPSB7fQogIHZhciBndXR0ZXJMZWZ0ID0gZC5ndXR0ZXJzLmNsaWVudExlZnQKICBmb3IgKHZhciBuID0gZC5ndXR0ZXJzLmZpcnN0Q2hpbGQsIGkgPSAwOyBuOyBuID0gbi5uZXh0U2libGluZywgKytpKSB7CiAgICBsZWZ0W2NtLm9wdGlvbnMuZ3V0dGVyc1tpXV0gPSBuLm9mZnNldExlZnQgKyBuLmNsaWVudExlZnQgKyBndXR0ZXJMZWZ0CiAgICB3aWR0aFtjbS5vcHRpb25zLmd1dHRlcnNbaV1dID0gbi5jbGllbnRXaWR0aAogIH0KICByZXR1cm4ge2ZpeGVkUG9zOiBjb21wZW5zYXRlRm9ySFNjcm9sbChkKSwKICAgICAgICAgIGd1dHRlclRvdGFsV2lkdGg6IGQuZ3V0dGVycy5vZmZzZXRXaWR0aCwKICAgICAgICAgIGd1dHRlckxlZnQ6IGxlZnQsCiAgICAgICAgICBndXR0ZXJXaWR0aDogd2lkdGgsCiAgICAgICAgICB3cmFwcGVyV2lkdGg6IGQud3JhcHBlci5jbGllbnRXaWR0aH0KfQoKLy8gQ29tcHV0ZXMgZGlzcGxheS5zY3JvbGxlci5zY3JvbGxMZWZ0ICsgZGlzcGxheS5ndXR0ZXJzLm9mZnNldFdpZHRoLAovLyBidXQgdXNpbmcgZ2V0Qm91bmRpbmdDbGllbnRSZWN0IHRvIGdldCBhIHN1Yi1waXhlbC1hY2N1cmF0ZQovLyByZXN1bHQuCmZ1bmN0aW9uIGNvbXBlbnNhdGVGb3JIU2Nyb2xsKGRpc3BsYXkpIHsKICByZXR1cm4gZGlzcGxheS5zY3JvbGxlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0IC0gZGlzcGxheS5zaXplci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0Cn0KCi8vIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGVzdGltYXRlcyB0aGUgaGVpZ2h0IG9mIGEgbGluZSwgdG8gdXNlIGFzCi8vIGZpcnN0IGFwcHJveGltYXRpb24gdW50aWwgdGhlIGxpbmUgYmVjb21lcyB2aXNpYmxlIChhbmQgaXMgdGh1cwovLyBwcm9wZXJseSBtZWFzdXJhYmxlKS4KZnVuY3Rpb24gZXN0aW1hdGVIZWlnaHQoY20pIHsKICB2YXIgdGggPSB0ZXh0SGVpZ2h0KGNtLmRpc3BsYXkpLCB3cmFwcGluZyA9IGNtLm9wdGlvbnMubGluZVdyYXBwaW5nCiAgdmFyIHBlckxpbmUgPSB3cmFwcGluZyAmJiBNYXRoLm1heCg1LCBjbS5kaXNwbGF5LnNjcm9sbGVyLmNsaWVudFdpZHRoIC8gY2hhcldpZHRoKGNtLmRpc3BsYXkpIC0gMykKICByZXR1cm4gZnVuY3Rpb24gKGxpbmUpIHsKICAgIGlmIChsaW5lSXNIaWRkZW4oY20uZG9jLCBsaW5lKSkgeyByZXR1cm4gMCB9CgogICAgdmFyIHdpZGdldHNIZWlnaHQgPSAwCiAgICBpZiAobGluZS53aWRnZXRzKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgbGluZS53aWRnZXRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmIChsaW5lLndpZGdldHNbaV0uaGVpZ2h0KSB7IHdpZGdldHNIZWlnaHQgKz0gbGluZS53aWRnZXRzW2ldLmhlaWdodCB9CiAgICB9IH0KCiAgICBpZiAod3JhcHBpbmcpCiAgICAgIHsgcmV0dXJuIHdpZGdldHNIZWlnaHQgKyAoTWF0aC5jZWlsKGxpbmUudGV4dC5sZW5ndGggLyBwZXJMaW5lKSB8fCAxKSAqIHRoIH0KICAgIGVsc2UKICAgICAgeyByZXR1cm4gd2lkZ2V0c0hlaWdodCArIHRoIH0KICB9Cn0KCmZ1bmN0aW9uIGVzdGltYXRlTGluZUhlaWdodHMoY20pIHsKICB2YXIgZG9jID0gY20uZG9jLCBlc3QgPSBlc3RpbWF0ZUhlaWdodChjbSkKICBkb2MuaXRlcihmdW5jdGlvbiAobGluZSkgewogICAgdmFyIGVzdEhlaWdodCA9IGVzdChsaW5lKQogICAgaWYgKGVzdEhlaWdodCAhPSBsaW5lLmhlaWdodCkgeyB1cGRhdGVMaW5lSGVpZ2h0KGxpbmUsIGVzdEhlaWdodCkgfQogIH0pCn0KCi8vIEdpdmVuIGEgbW91c2UgZXZlbnQsIGZpbmQgdGhlIGNvcnJlc3BvbmRpbmcgcG9zaXRpb24uIElmIGxpYmVyYWwKLy8gaXMgZmFsc2UsIGl0IGNoZWNrcyB3aGV0aGVyIGEgZ3V0dGVyIG9yIHNjcm9sbGJhciB3YXMgY2xpY2tlZCwKLy8gYW5kIHJldHVybnMgbnVsbCBpZiBpdCB3YXMuIGZvclJlY3QgaXMgdXNlZCBieSByZWN0YW5ndWxhcgovLyBzZWxlY3Rpb25zLCBhbmQgdHJpZXMgdG8gZXN0aW1hdGUgYSBjaGFyYWN0ZXIgcG9zaXRpb24gZXZlbiBmb3IKLy8gY29vcmRpbmF0ZXMgYmV5b25kIHRoZSByaWdodCBvZiB0aGUgdGV4dC4KZnVuY3Rpb24gcG9zRnJvbU1vdXNlKGNtLCBlLCBsaWJlcmFsLCBmb3JSZWN0KSB7CiAgdmFyIGRpc3BsYXkgPSBjbS5kaXNwbGF5CiAgaWYgKCFsaWJlcmFsICYmIGVfdGFyZ2V0KGUpLmdldEF0dHJpYnV0ZSgiY20tbm90LWNvbnRlbnQiKSA9PSAidHJ1ZSIpIHsgcmV0dXJuIG51bGwgfQoKICB2YXIgeCwgeSwgc3BhY2UgPSBkaXNwbGF5LmxpbmVTcGFjZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKQogIC8vIEZhaWxzIHVucHJlZGljdGFibHkgb24gSUVbNjddIHdoZW4gbW91c2UgaXMgZHJhZ2dlZCBhcm91bmQgcXVpY2tseS4KICB0cnkgeyB4ID0gZS5jbGllbnRYIC0gc3BhY2UubGVmdDsgeSA9IGUuY2xpZW50WSAtIHNwYWNlLnRvcCB9CiAgY2F0Y2ggKGUpIHsgcmV0dXJuIG51bGwgfQogIHZhciBjb29yZHMgPSBjb29yZHNDaGFyKGNtLCB4LCB5KSwgbGluZQogIGlmIChmb3JSZWN0ICYmIGNvb3Jkcy54UmVsID09IDEgJiYgKGxpbmUgPSBnZXRMaW5lKGNtLmRvYywgY29vcmRzLmxpbmUpLnRleHQpLmxlbmd0aCA9PSBjb29yZHMuY2gpIHsKICAgIHZhciBjb2xEaWZmID0gY291bnRDb2x1bW4obGluZSwgbGluZS5sZW5ndGgsIGNtLm9wdGlvbnMudGFiU2l6ZSkgLSBsaW5lLmxlbmd0aAogICAgY29vcmRzID0gUG9zKGNvb3Jkcy5saW5lLCBNYXRoLm1heCgwLCBNYXRoLnJvdW5kKCh4IC0gcGFkZGluZ0goY20uZGlzcGxheSkubGVmdCkgLyBjaGFyV2lkdGgoY20uZGlzcGxheSkpIC0gY29sRGlmZikpCiAgfQogIHJldHVybiBjb29yZHMKfQoKLy8gRmluZCB0aGUgdmlldyBlbGVtZW50IGNvcnJlc3BvbmRpbmcgdG8gYSBnaXZlbiBsaW5lLiBSZXR1cm4gbnVsbAovLyB3aGVuIHRoZSBsaW5lIGlzbid0IHZpc2libGUuCmZ1bmN0aW9uIGZpbmRWaWV3SW5kZXgoY20sIG4pIHsKICBpZiAobiA+PSBjbS5kaXNwbGF5LnZpZXdUbykgeyByZXR1cm4gbnVsbCB9CiAgbiAtPSBjbS5kaXNwbGF5LnZpZXdGcm9tCiAgaWYgKG4gPCAwKSB7IHJldHVybiBudWxsIH0KICB2YXIgdmlldyA9IGNtLmRpc3BsYXkudmlldwogIGZvciAodmFyIGkgPSAwOyBpIDwgdmlldy5sZW5ndGg7IGkrKykgewogICAgbiAtPSB2aWV3W2ldLnNpemUKICAgIGlmIChuIDwgMCkgeyByZXR1cm4gaSB9CiAgfQp9CgpmdW5jdGlvbiB1cGRhdGVTZWxlY3Rpb24oY20pIHsKICBjbS5kaXNwbGF5LmlucHV0LnNob3dTZWxlY3Rpb24oY20uZGlzcGxheS5pbnB1dC5wcmVwYXJlU2VsZWN0aW9uKCkpCn0KCmZ1bmN0aW9uIHByZXBhcmVTZWxlY3Rpb24oY20sIHByaW1hcnkpIHsKICB2YXIgZG9jID0gY20uZG9jLCByZXN1bHQgPSB7fQogIHZhciBjdXJGcmFnbWVudCA9IHJlc3VsdC5jdXJzb3JzID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpCiAgdmFyIHNlbEZyYWdtZW50ID0gcmVzdWx0LnNlbGVjdGlvbiA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKQoKICBmb3IgKHZhciBpID0gMDsgaSA8IGRvYy5zZWwucmFuZ2VzLmxlbmd0aDsgaSsrKSB7CiAgICBpZiAocHJpbWFyeSA9PT0gZmFsc2UgJiYgaSA9PSBkb2Muc2VsLnByaW1JbmRleCkgeyBjb250aW51ZSB9CiAgICB2YXIgcmFuZ2UkJDEgPSBkb2Muc2VsLnJhbmdlc1tpXQogICAgaWYgKHJhbmdlJCQxLmZyb20oKS5saW5lID49IGNtLmRpc3BsYXkudmlld1RvIHx8IHJhbmdlJCQxLnRvKCkubGluZSA8IGNtLmRpc3BsYXkudmlld0Zyb20pIHsgY29udGludWUgfQogICAgdmFyIGNvbGxhcHNlZCA9IHJhbmdlJCQxLmVtcHR5KCkKICAgIGlmIChjb2xsYXBzZWQgfHwgY20ub3B0aW9ucy5zaG93Q3Vyc29yV2hlblNlbGVjdGluZykKICAgICAgeyBkcmF3U2VsZWN0aW9uQ3Vyc29yKGNtLCByYW5nZSQkMS5oZWFkLCBjdXJGcmFnbWVudCkgfQogICAgaWYgKCFjb2xsYXBzZWQpCiAgICAgIHsgZHJhd1NlbGVjdGlvblJhbmdlKGNtLCByYW5nZSQkMSwgc2VsRnJhZ21lbnQpIH0KICB9CiAgcmV0dXJuIHJlc3VsdAp9CgovLyBEcmF3cyBhIGN1cnNvciBmb3IgdGhlIGdpdmVuIHJhbmdlCmZ1bmN0aW9uIGRyYXdTZWxlY3Rpb25DdXJzb3IoY20sIGhlYWQsIG91dHB1dCkgewogIHZhciBwb3MgPSBjdXJzb3JDb29yZHMoY20sIGhlYWQsICJkaXYiLCBudWxsLCBudWxsLCAhY20ub3B0aW9ucy5zaW5nbGVDdXJzb3JIZWlnaHRQZXJMaW5lKQoKICB2YXIgY3Vyc29yID0gb3V0cHV0LmFwcGVuZENoaWxkKGVsdCgiZGl2IiwgIlx1MDBhMCIsICJDb2RlTWlycm9yLWN1cnNvciIpKQogIGN1cnNvci5zdHlsZS5sZWZ0ID0gcG9zLmxlZnQgKyAicHgiCiAgY3Vyc29yLnN0eWxlLnRvcCA9IHBvcy50b3AgKyAicHgiCiAgY3Vyc29yLnN0eWxlLmhlaWdodCA9IE1hdGgubWF4KDAsIHBvcy5ib3R0b20gLSBwb3MudG9wKSAqIGNtLm9wdGlvbnMuY3Vyc29ySGVpZ2h0ICsgInB4IgoKICBpZiAocG9zLm90aGVyKSB7CiAgICAvLyBTZWNvbmRhcnkgY3Vyc29yLCBzaG93biB3aGVuIG9uIGEgJ2p1bXAnIGluIGJpLWRpcmVjdGlvbmFsIHRleHQKICAgIHZhciBvdGhlckN1cnNvciA9IG91dHB1dC5hcHBlbmRDaGlsZChlbHQoImRpdiIsICJcdTAwYTAiLCAiQ29kZU1pcnJvci1jdXJzb3IgQ29kZU1pcnJvci1zZWNvbmRhcnljdXJzb3IiKSkKICAgIG90aGVyQ3Vyc29yLnN0eWxlLmRpc3BsYXkgPSAiIgogICAgb3RoZXJDdXJzb3Iuc3R5bGUubGVmdCA9IHBvcy5vdGhlci5sZWZ0ICsgInB4IgogICAgb3RoZXJDdXJzb3Iuc3R5bGUudG9wID0gcG9zLm90aGVyLnRvcCArICJweCIKICAgIG90aGVyQ3Vyc29yLnN0eWxlLmhlaWdodCA9IChwb3Mub3RoZXIuYm90dG9tIC0gcG9zLm90aGVyLnRvcCkgKiAuODUgKyAicHgiCiAgfQp9CgovLyBEcmF3cyB0aGUgZ2l2ZW4gcmFuZ2UgYXMgYSBoaWdobGlnaHRlZCBzZWxlY3Rpb24KZnVuY3Rpb24gZHJhd1NlbGVjdGlvblJhbmdlKGNtLCByYW5nZSQkMSwgb3V0cHV0KSB7CiAgdmFyIGRpc3BsYXkgPSBjbS5kaXNwbGF5LCBkb2MgPSBjbS5kb2MKICB2YXIgZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkKICB2YXIgcGFkZGluZyA9IHBhZGRpbmdIKGNtLmRpc3BsYXkpLCBsZWZ0U2lkZSA9IHBhZGRpbmcubGVmdAogIHZhciByaWdodFNpZGUgPSBNYXRoLm1heChkaXNwbGF5LnNpemVyV2lkdGgsIGRpc3BsYXlXaWR0aChjbSkgLSBkaXNwbGF5LnNpemVyLm9mZnNldExlZnQpIC0gcGFkZGluZy5yaWdodAoKICBmdW5jdGlvbiBhZGQobGVmdCwgdG9wLCB3aWR0aCwgYm90dG9tKSB7CiAgICBpZiAodG9wIDwgMCkgeyB0b3AgPSAwIH0KICAgIHRvcCA9IE1hdGgucm91bmQodG9wKQogICAgYm90dG9tID0gTWF0aC5yb3VuZChib3R0b20pCiAgICBmcmFnbWVudC5hcHBlbmRDaGlsZChlbHQoImRpdiIsIG51bGwsICJDb2RlTWlycm9yLXNlbGVjdGVkIiwgKCJwb3NpdGlvbjogYWJzb2x1dGU7IGxlZnQ6ICIgKyBsZWZ0ICsgInB4O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3A6ICIgKyB0b3AgKyAicHg7IHdpZHRoOiAiICsgKHdpZHRoID09IG51bGwgPyByaWdodFNpZGUgLSBsZWZ0IDogd2lkdGgpICsgInB4O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6ICIgKyAoYm90dG9tIC0gdG9wKSArICJweCIpKSkKICB9CgogIGZ1bmN0aW9uIGRyYXdGb3JMaW5lKGxpbmUsIGZyb21BcmcsIHRvQXJnKSB7CiAgICB2YXIgbGluZU9iaiA9IGdldExpbmUoZG9jLCBsaW5lKQogICAgdmFyIGxpbmVMZW4gPSBsaW5lT2JqLnRleHQubGVuZ3RoCiAgICB2YXIgc3RhcnQsIGVuZAogICAgZnVuY3Rpb24gY29vcmRzKGNoLCBiaWFzKSB7CiAgICAgIHJldHVybiBjaGFyQ29vcmRzKGNtLCBQb3MobGluZSwgY2gpLCAiZGl2IiwgbGluZU9iaiwgYmlhcykKICAgIH0KCiAgICBpdGVyYXRlQmlkaVNlY3Rpb25zKGdldE9yZGVyKGxpbmVPYmopLCBmcm9tQXJnIHx8IDAsIHRvQXJnID09IG51bGwgPyBsaW5lTGVuIDogdG9BcmcsIGZ1bmN0aW9uIChmcm9tLCB0bywgZGlyKSB7CiAgICAgIHZhciBsZWZ0UG9zID0gY29vcmRzKGZyb20sICJsZWZ0IiksIHJpZ2h0UG9zLCBsZWZ0LCByaWdodAogICAgICBpZiAoZnJvbSA9PSB0bykgewogICAgICAgIHJpZ2h0UG9zID0gbGVmdFBvcwogICAgICAgIGxlZnQgPSByaWdodCA9IGxlZnRQb3MubGVmdAogICAgICB9IGVsc2UgewogICAgICAgIHJpZ2h0UG9zID0gY29vcmRzKHRvIC0gMSwgInJpZ2h0IikKICAgICAgICBpZiAoZGlyID09ICJydGwiKSB7IHZhciB0bXAgPSBsZWZ0UG9zOyBsZWZ0UG9zID0gcmlnaHRQb3M7IHJpZ2h0UG9zID0gdG1wIH0KICAgICAgICBsZWZ0ID0gbGVmdFBvcy5sZWZ0CiAgICAgICAgcmlnaHQgPSByaWdodFBvcy5yaWdodAogICAgICB9CiAgICAgIGlmIChmcm9tQXJnID09IG51bGwgJiYgZnJvbSA9PSAwKSB7IGxlZnQgPSBsZWZ0U2lkZSB9CiAgICAgIGlmIChyaWdodFBvcy50b3AgLSBsZWZ0UG9zLnRvcCA+IDMpIHsgLy8gRGlmZmVyZW50IGxpbmVzLCBkcmF3IHRvcCBwYXJ0CiAgICAgICAgYWRkKGxlZnQsIGxlZnRQb3MudG9wLCBudWxsLCBsZWZ0UG9zLmJvdHRvbSkKICAgICAgICBsZWZ0ID0gbGVmdFNpZGUKICAgICAgICBpZiAobGVmdFBvcy5ib3R0b20gPCByaWdodFBvcy50b3ApIHsgYWRkKGxlZnQsIGxlZnRQb3MuYm90dG9tLCBudWxsLCByaWdodFBvcy50b3ApIH0KICAgICAgfQogICAgICBpZiAodG9BcmcgPT0gbnVsbCAmJiB0byA9PSBsaW5lTGVuKSB7IHJpZ2h0ID0gcmlnaHRTaWRlIH0KICAgICAgaWYgKCFzdGFydCB8fCBsZWZ0UG9zLnRvcCA8IHN0YXJ0LnRvcCB8fCBsZWZ0UG9zLnRvcCA9PSBzdGFydC50b3AgJiYgbGVmdFBvcy5sZWZ0IDwgc3RhcnQubGVmdCkKICAgICAgICB7IHN0YXJ0ID0gbGVmdFBvcyB9CiAgICAgIGlmICghZW5kIHx8IHJpZ2h0UG9zLmJvdHRvbSA+IGVuZC5ib3R0b20gfHwgcmlnaHRQb3MuYm90dG9tID09IGVuZC5ib3R0b20gJiYgcmlnaHRQb3MucmlnaHQgPiBlbmQucmlnaHQpCiAgICAgICAgeyBlbmQgPSByaWdodFBvcyB9CiAgICAgIGlmIChsZWZ0IDwgbGVmdFNpZGUgKyAxKSB7IGxlZnQgPSBsZWZ0U2lkZSB9CiAgICAgIGFkZChsZWZ0LCByaWdodFBvcy50b3AsIHJpZ2h0IC0gbGVmdCwgcmlnaHRQb3MuYm90dG9tKQogICAgfSkKICAgIHJldHVybiB7c3RhcnQ6IHN0YXJ0LCBlbmQ6IGVuZH0KICB9CgogIHZhciBzRnJvbSA9IHJhbmdlJCQxLmZyb20oKSwgc1RvID0gcmFuZ2UkJDEudG8oKQogIGlmIChzRnJvbS5saW5lID09IHNUby5saW5lKSB7CiAgICBkcmF3Rm9yTGluZShzRnJvbS5saW5lLCBzRnJvbS5jaCwgc1RvLmNoKQogIH0gZWxzZSB7CiAgICB2YXIgZnJvbUxpbmUgPSBnZXRMaW5lKGRvYywgc0Zyb20ubGluZSksIHRvTGluZSA9IGdldExpbmUoZG9jLCBzVG8ubGluZSkKICAgIHZhciBzaW5nbGVWTGluZSA9IHZpc3VhbExpbmUoZnJvbUxpbmUpID09IHZpc3VhbExpbmUodG9MaW5lKQogICAgdmFyIGxlZnRFbmQgPSBkcmF3Rm9yTGluZShzRnJvbS5saW5lLCBzRnJvbS5jaCwgc2luZ2xlVkxpbmUgPyBmcm9tTGluZS50ZXh0Lmxlbmd0aCArIDEgOiBudWxsKS5lbmQKICAgIHZhciByaWdodFN0YXJ0ID0gZHJhd0ZvckxpbmUoc1RvLmxpbmUsIHNpbmdsZVZMaW5lID8gMCA6IG51bGwsIHNUby5jaCkuc3RhcnQKICAgIGlmIChzaW5nbGVWTGluZSkgewogICAgICBpZiAobGVmdEVuZC50b3AgPCByaWdodFN0YXJ0LnRvcCAtIDIpIHsKICAgICAgICBhZGQobGVmdEVuZC5yaWdodCwgbGVmdEVuZC50b3AsIG51bGwsIGxlZnRFbmQuYm90dG9tKQogICAgICAgIGFkZChsZWZ0U2lkZSwgcmlnaHRTdGFydC50b3AsIHJpZ2h0U3RhcnQubGVmdCwgcmlnaHRTdGFydC5ib3R0b20pCiAgICAgIH0gZWxzZSB7CiAgICAgICAgYWRkKGxlZnRFbmQucmlnaHQsIGxlZnRFbmQudG9wLCByaWdodFN0YXJ0LmxlZnQgLSBsZWZ0RW5kLnJpZ2h0LCBsZWZ0RW5kLmJvdHRvbSkKICAgICAgfQogICAgfQogICAgaWYgKGxlZnRFbmQuYm90dG9tIDwgcmlnaHRTdGFydC50b3ApCiAgICAgIHsgYWRkKGxlZnRTaWRlLCBsZWZ0RW5kLmJvdHRvbSwgbnVsbCwgcmlnaHRTdGFydC50b3ApIH0KICB9CgogIG91dHB1dC5hcHBlbmRDaGlsZChmcmFnbWVudCkKfQoKLy8gQ3Vyc29yLWJsaW5raW5nCmZ1bmN0aW9uIHJlc3RhcnRCbGluayhjbSkgewogIGlmICghY20uc3RhdGUuZm9jdXNlZCkgeyByZXR1cm4gfQogIHZhciBkaXNwbGF5ID0gY20uZGlzcGxheQogIGNsZWFySW50ZXJ2YWwoZGlzcGxheS5ibGlua2VyKQogIHZhciBvbiA9IHRydWUKICBkaXNwbGF5LmN1cnNvckRpdi5zdHlsZS52aXNpYmlsaXR5ID0gIiIKICBpZiAoY20ub3B0aW9ucy5jdXJzb3JCbGlua1JhdGUgPiAwKQogICAgeyBkaXNwbGF5LmJsaW5rZXIgPSBzZXRJbnRlcnZhbChmdW5jdGlvbiAoKSB7IHJldHVybiBkaXNwbGF5LmN1cnNvckRpdi5zdHlsZS52aXNpYmlsaXR5ID0gKG9uID0gIW9uKSA/ICIiIDogImhpZGRlbiI7IH0sCiAgICAgIGNtLm9wdGlvbnMuY3Vyc29yQmxpbmtSYXRlKSB9CiAgZWxzZSBpZiAoY20ub3B0aW9ucy5jdXJzb3JCbGlua1JhdGUgPCAwKQogICAgeyBkaXNwbGF5LmN1cnNvckRpdi5zdHlsZS52aXNpYmlsaXR5ID0gImhpZGRlbiIgfQp9CgpmdW5jdGlvbiBlbnN1cmVGb2N1cyhjbSkgewogIGlmICghY20uc3RhdGUuZm9jdXNlZCkgeyBjbS5kaXNwbGF5LmlucHV0LmZvY3VzKCk7IG9uRm9jdXMoY20pIH0KfQoKZnVuY3Rpb24gZGVsYXlCbHVyRXZlbnQoY20pIHsKICBjbS5zdGF0ZS5kZWxheWluZ0JsdXJFdmVudCA9IHRydWUKICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgaWYgKGNtLnN0YXRlLmRlbGF5aW5nQmx1ckV2ZW50KSB7CiAgICBjbS5zdGF0ZS5kZWxheWluZ0JsdXJFdmVudCA9IGZhbHNlCiAgICBvbkJsdXIoY20pCiAgfSB9LCAxMDApCn0KCmZ1bmN0aW9uIG9uRm9jdXMoY20sIGUpIHsKICBpZiAoY20uc3RhdGUuZGVsYXlpbmdCbHVyRXZlbnQpIHsgY20uc3RhdGUuZGVsYXlpbmdCbHVyRXZlbnQgPSBmYWxzZSB9CgogIGlmIChjbS5vcHRpb25zLnJlYWRPbmx5ID09ICJub2N1cnNvciIpIHsgcmV0dXJuIH0KICBpZiAoIWNtLnN0YXRlLmZvY3VzZWQpIHsKICAgIHNpZ25hbChjbSwgImZvY3VzIiwgY20sIGUpCiAgICBjbS5zdGF0ZS5mb2N1c2VkID0gdHJ1ZQogICAgYWRkQ2xhc3MoY20uZGlzcGxheS53cmFwcGVyLCAiQ29kZU1pcnJvci1mb2N1c2VkIikKICAgIC8vIFRoaXMgdGVzdCBwcmV2ZW50cyB0aGlzIGZyb20gZmlyaW5nIHdoZW4gYSBjb250ZXh0CiAgICAvLyBtZW51IGlzIGNsb3NlZCAoc2luY2UgdGhlIGlucHV0IHJlc2V0IHdvdWxkIGtpbGwgdGhlCiAgICAvLyBzZWxlY3QtYWxsIGRldGVjdGlvbiBoYWNrKQogICAgaWYgKCFjbS5jdXJPcCAmJiBjbS5kaXNwbGF5LnNlbEZvckNvbnRleHRNZW51ICE9IGNtLmRvYy5zZWwpIHsKICAgICAgY20uZGlzcGxheS5pbnB1dC5yZXNldCgpCiAgICAgIGlmICh3ZWJraXQpIHsgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IHJldHVybiBjbS5kaXNwbGF5LmlucHV0LnJlc2V0KHRydWUpOyB9LCAyMCkgfSAvLyBJc3N1ZSAjMTczMAogICAgfQogICAgY20uZGlzcGxheS5pbnB1dC5yZWNlaXZlZEZvY3VzKCkKICB9CiAgcmVzdGFydEJsaW5rKGNtKQp9CmZ1bmN0aW9uIG9uQmx1cihjbSwgZSkgewogIGlmIChjbS5zdGF0ZS5kZWxheWluZ0JsdXJFdmVudCkgeyByZXR1cm4gfQoKICBpZiAoY20uc3RhdGUuZm9jdXNlZCkgewogICAgc2lnbmFsKGNtLCAiYmx1ciIsIGNtLCBlKQogICAgY20uc3RhdGUuZm9jdXNlZCA9IGZhbHNlCiAgICBybUNsYXNzKGNtLmRpc3BsYXkud3JhcHBlciwgIkNvZGVNaXJyb3ItZm9jdXNlZCIpCiAgfQogIGNsZWFySW50ZXJ2YWwoY20uZGlzcGxheS5ibGlua2VyKQogIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyBpZiAoIWNtLnN0YXRlLmZvY3VzZWQpIHsgY20uZGlzcGxheS5zaGlmdCA9IGZhbHNlIH0gfSwgMTUwKQp9CgovLyBSZS1hbGlnbiBsaW5lIG51bWJlcnMgYW5kIGd1dHRlciBtYXJrcyB0byBjb21wZW5zYXRlIGZvcgovLyBob3Jpem9udGFsIHNjcm9sbGluZy4KZnVuY3Rpb24gYWxpZ25Ib3Jpem9udGFsbHkoY20pIHsKICB2YXIgZGlzcGxheSA9IGNtLmRpc3BsYXksIHZpZXcgPSBkaXNwbGF5LnZpZXcKICBpZiAoIWRpc3BsYXkuYWxpZ25XaWRnZXRzICYmICghZGlzcGxheS5ndXR0ZXJzLmZpcnN0Q2hpbGQgfHwgIWNtLm9wdGlvbnMuZml4ZWRHdXR0ZXIpKSB7IHJldHVybiB9CiAgdmFyIGNvbXAgPSBjb21wZW5zYXRlRm9ySFNjcm9sbChkaXNwbGF5KSAtIGRpc3BsYXkuc2Nyb2xsZXIuc2Nyb2xsTGVmdCArIGNtLmRvYy5zY3JvbGxMZWZ0CiAgdmFyIGd1dHRlclcgPSBkaXNwbGF5Lmd1dHRlcnMub2Zmc2V0V2lkdGgsIGxlZnQgPSBjb21wICsgInB4IgogIGZvciAodmFyIGkgPSAwOyBpIDwgdmlldy5sZW5ndGg7IGkrKykgeyBpZiAoIXZpZXdbaV0uaGlkZGVuKSB7CiAgICBpZiAoY20ub3B0aW9ucy5maXhlZEd1dHRlcikgewogICAgICBpZiAodmlld1tpXS5ndXR0ZXIpCiAgICAgICAgeyB2aWV3W2ldLmd1dHRlci5zdHlsZS5sZWZ0ID0gbGVmdCB9CiAgICAgIGlmICh2aWV3W2ldLmd1dHRlckJhY2tncm91bmQpCiAgICAgICAgeyB2aWV3W2ldLmd1dHRlckJhY2tncm91bmQuc3R5bGUubGVmdCA9IGxlZnQgfQogICAgfQogICAgdmFyIGFsaWduID0gdmlld1tpXS5hbGlnbmFibGUKICAgIGlmIChhbGlnbikgeyBmb3IgKHZhciBqID0gMDsgaiA8IGFsaWduLmxlbmd0aDsgaisrKQogICAgICB7IGFsaWduW2pdLnN0eWxlLmxlZnQgPSBsZWZ0IH0gfQogIH0gfQogIGlmIChjbS5vcHRpb25zLmZpeGVkR3V0dGVyKQogICAgeyBkaXNwbGF5Lmd1dHRlcnMuc3R5bGUubGVmdCA9IChjb21wICsgZ3V0dGVyVykgKyAicHgiIH0KfQoKLy8gVXNlZCB0byBlbnN1cmUgdGhhdCB0aGUgbGluZSBudW1iZXIgZ3V0dGVyIGlzIHN0aWxsIHRoZSByaWdodAovLyBzaXplIGZvciB0aGUgY3VycmVudCBkb2N1bWVudCBzaXplLiBSZXR1cm5zIHRydWUgd2hlbiBhbiB1cGRhdGUKLy8gaXMgbmVlZGVkLgpmdW5jdGlvbiBtYXliZVVwZGF0ZUxpbmVOdW1iZXJXaWR0aChjbSkgewogIGlmICghY20ub3B0aW9ucy5saW5lTnVtYmVycykgeyByZXR1cm4gZmFsc2UgfQogIHZhciBkb2MgPSBjbS5kb2MsIGxhc3QgPSBsaW5lTnVtYmVyRm9yKGNtLm9wdGlvbnMsIGRvYy5maXJzdCArIGRvYy5zaXplIC0gMSksIGRpc3BsYXkgPSBjbS5kaXNwbGF5CiAgaWYgKGxhc3QubGVuZ3RoICE9IGRpc3BsYXkubGluZU51bUNoYXJzKSB7CiAgICB2YXIgdGVzdCA9IGRpc3BsYXkubWVhc3VyZS5hcHBlbmRDaGlsZChlbHQoImRpdiIsIFtlbHQoImRpdiIsIGxhc3QpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29kZU1pcnJvci1saW5lbnVtYmVyIENvZGVNaXJyb3ItZ3V0dGVyLWVsdCIpKQogICAgdmFyIGlubmVyVyA9IHRlc3QuZmlyc3RDaGlsZC5vZmZzZXRXaWR0aCwgcGFkZGluZyA9IHRlc3Qub2Zmc2V0V2lkdGggLSBpbm5lclcKICAgIGRpc3BsYXkubGluZUd1dHRlci5zdHlsZS53aWR0aCA9ICIiCiAgICBkaXNwbGF5LmxpbmVOdW1Jbm5lcldpZHRoID0gTWF0aC5tYXgoaW5uZXJXLCBkaXNwbGF5LmxpbmVHdXR0ZXIub2Zmc2V0V2lkdGggLSBwYWRkaW5nKSArIDEKICAgIGRpc3BsYXkubGluZU51bVdpZHRoID0gZGlzcGxheS5saW5lTnVtSW5uZXJXaWR0aCArIHBhZGRpbmcKICAgIGRpc3BsYXkubGluZU51bUNoYXJzID0gZGlzcGxheS5saW5lTnVtSW5uZXJXaWR0aCA/IGxhc3QubGVuZ3RoIDogLTEKICAgIGRpc3BsYXkubGluZUd1dHRlci5zdHlsZS53aWR0aCA9IGRpc3BsYXkubGluZU51bVdpZHRoICsgInB4IgogICAgdXBkYXRlR3V0dGVyU3BhY2UoY20pCiAgICByZXR1cm4gdHJ1ZQogIH0KICByZXR1cm4gZmFsc2UKfQoKLy8gUmVhZCB0aGUgYWN0dWFsIGhlaWdodHMgb2YgdGhlIHJlbmRlcmVkIGxpbmVzLCBhbmQgdXBkYXRlIHRoZWlyCi8vIHN0b3JlZCBoZWlnaHRzIHRvIG1hdGNoLgpmdW5jdGlvbiB1cGRhdGVIZWlnaHRzSW5WaWV3cG9ydChjbSkgewogIHZhciBkaXNwbGF5ID0gY20uZGlzcGxheQogIHZhciBwcmV2Qm90dG9tID0gZGlzcGxheS5saW5lRGl2Lm9mZnNldFRvcAogIGZvciAodmFyIGkgPSAwOyBpIDwgZGlzcGxheS52aWV3Lmxlbmd0aDsgaSsrKSB7CiAgICB2YXIgY3VyID0gZGlzcGxheS52aWV3W2ldLCBoZWlnaHQgPSB2b2lkIDAKICAgIGlmIChjdXIuaGlkZGVuKSB7IGNvbnRpbnVlIH0KICAgIGlmIChpZSAmJiBpZV92ZXJzaW9uIDwgOCkgewogICAgICB2YXIgYm90ID0gY3VyLm5vZGUub2Zmc2V0VG9wICsgY3VyLm5vZGUub2Zmc2V0SGVpZ2h0CiAgICAgIGhlaWdodCA9IGJvdCAtIHByZXZCb3R0b20KICAgICAgcHJldkJvdHRvbSA9IGJvdAogICAgfSBlbHNlIHsKICAgICAgdmFyIGJveCA9IGN1ci5ub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpCiAgICAgIGhlaWdodCA9IGJveC5ib3R0b20gLSBib3gudG9wCiAgICB9CiAgICB2YXIgZGlmZiA9IGN1ci5saW5lLmhlaWdodCAtIGhlaWdodAogICAgaWYgKGhlaWdodCA8IDIpIHsgaGVpZ2h0ID0gdGV4dEhlaWdodChkaXNwbGF5KSB9CiAgICBpZiAoZGlmZiA+IC4wMDEgfHwgZGlmZiA8IC0uMDAxKSB7CiAgICAgIHVwZGF0ZUxpbmVIZWlnaHQoY3VyLmxpbmUsIGhlaWdodCkKICAgICAgdXBkYXRlV2lkZ2V0SGVpZ2h0KGN1ci5saW5lKQogICAgICBpZiAoY3VyLnJlc3QpIHsgZm9yICh2YXIgaiA9IDA7IGogPCBjdXIucmVzdC5sZW5ndGg7IGorKykKICAgICAgICB7IHVwZGF0ZVdpZGdldEhlaWdodChjdXIucmVzdFtqXSkgfSB9CiAgICB9CiAgfQp9CgovLyBSZWFkIGFuZCBzdG9yZSB0aGUgaGVpZ2h0IG9mIGxpbmUgd2lkZ2V0cyBhc3NvY2lhdGVkIHdpdGggdGhlCi8vIGdpdmVuIGxpbmUuCmZ1bmN0aW9uIHVwZGF0ZVdpZGdldEhlaWdodChsaW5lKSB7CiAgaWYgKGxpbmUud2lkZ2V0cykgeyBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmUud2lkZ2V0cy5sZW5ndGg7ICsraSkKICAgIHsgbGluZS53aWRnZXRzW2ldLmhlaWdodCA9IGxpbmUud2lkZ2V0c1tpXS5ub2RlLnBhcmVudE5vZGUub2Zmc2V0SGVpZ2h0IH0gfQp9CgovLyBDb21wdXRlIHRoZSBsaW5lcyB0aGF0IGFyZSB2aXNpYmxlIGluIGEgZ2l2ZW4gdmlld3BvcnQgKGRlZmF1bHRzCi8vIHRoZSB0aGUgY3VycmVudCBzY3JvbGwgcG9zaXRpb24pLiB2aWV3cG9ydCBtYXkgY29udGFpbiB0b3AsCi8vIGhlaWdodCwgYW5kIGVuc3VyZSAoc2VlIG9wLnNjcm9sbFRvUG9zKSBwcm9wZXJ0aWVzLgpmdW5jdGlvbiB2aXNpYmxlTGluZXMoZGlzcGxheSwgZG9jLCB2aWV3cG9ydCkgewogIHZhciB0b3AgPSB2aWV3cG9ydCAmJiB2aWV3cG9ydC50b3AgIT0gbnVsbCA/IE1hdGgubWF4KDAsIHZpZXdwb3J0LnRvcCkgOiBkaXNwbGF5LnNjcm9sbGVyLnNjcm9sbFRvcAogIHRvcCA9IE1hdGguZmxvb3IodG9wIC0gcGFkZGluZ1RvcChkaXNwbGF5KSkKICB2YXIgYm90dG9tID0gdmlld3BvcnQgJiYgdmlld3BvcnQuYm90dG9tICE9IG51bGwgPyB2aWV3cG9ydC5ib3R0b20gOiB0b3AgKyBkaXNwbGF5LndyYXBwZXIuY2xpZW50SGVpZ2h0CgogIHZhciBmcm9tID0gbGluZUF0SGVpZ2h0KGRvYywgdG9wKSwgdG8gPSBsaW5lQXRIZWlnaHQoZG9jLCBib3R0b20pCiAgLy8gRW5zdXJlIGlzIGEge2Zyb206IHtsaW5lLCBjaH0sIHRvOiB7bGluZSwgY2h9fSBvYmplY3QsIGFuZAogIC8vIGZvcmNlcyB0aG9zZSBsaW5lcyBpbnRvIHRoZSB2aWV3cG9ydCAoaWYgcG9zc2libGUpLgogIGlmICh2aWV3cG9ydCAmJiB2aWV3cG9ydC5lbnN1cmUpIHsKICAgIHZhciBlbnN1cmVGcm9tID0gdmlld3BvcnQuZW5zdXJlLmZyb20ubGluZSwgZW5zdXJlVG8gPSB2aWV3cG9ydC5lbnN1cmUudG8ubGluZQogICAgaWYgKGVuc3VyZUZyb20gPCBmcm9tKSB7CiAgICAgIGZyb20gPSBlbnN1cmVGcm9tCiAgICAgIHRvID0gbGluZUF0SGVpZ2h0KGRvYywgaGVpZ2h0QXRMaW5lKGdldExpbmUoZG9jLCBlbnN1cmVGcm9tKSkgKyBkaXNwbGF5LndyYXBwZXIuY2xpZW50SGVpZ2h0KQogICAgfSBlbHNlIGlmIChNYXRoLm1pbihlbnN1cmVUbywgZG9jLmxhc3RMaW5lKCkpID49IHRvKSB7CiAgICAgIGZyb20gPSBsaW5lQXRIZWlnaHQoZG9jLCBoZWlnaHRBdExpbmUoZ2V0TGluZShkb2MsIGVuc3VyZVRvKSkgLSBkaXNwbGF5LndyYXBwZXIuY2xpZW50SGVpZ2h0KQogICAgICB0byA9IGVuc3VyZVRvCiAgICB9CiAgfQogIHJldHVybiB7ZnJvbTogZnJvbSwgdG86IE1hdGgubWF4KHRvLCBmcm9tICsgMSl9Cn0KCi8vIFN5bmMgdGhlIHNjcm9sbGFibGUgYXJlYSBhbmQgc2Nyb2xsYmFycywgZW5zdXJlIHRoZSB2aWV3cG9ydAovLyBjb3ZlcnMgdGhlIHZpc2libGUgYXJlYS4KZnVuY3Rpb24gc2V0U2Nyb2xsVG9wKGNtLCB2YWwpIHsKICBpZiAoTWF0aC5hYnMoY20uZG9jLnNjcm9sbFRvcCAtIHZhbCkgPCAyKSB7IHJldHVybiB9CiAgY20uZG9jLnNjcm9sbFRvcCA9IHZhbAogIGlmICghZ2Vja28pIHsgdXBkYXRlRGlzcGxheVNpbXBsZShjbSwge3RvcDogdmFsfSkgfQogIGlmIChjbS5kaXNwbGF5LnNjcm9sbGVyLnNjcm9sbFRvcCAhPSB2YWwpIHsgY20uZGlzcGxheS5zY3JvbGxlci5zY3JvbGxUb3AgPSB2YWwgfQogIGNtLmRpc3BsYXkuc2Nyb2xsYmFycy5zZXRTY3JvbGxUb3AodmFsKQogIGlmIChnZWNrbykgeyB1cGRhdGVEaXNwbGF5U2ltcGxlKGNtKSB9CiAgc3RhcnRXb3JrZXIoY20sIDEwMCkKfQovLyBTeW5jIHNjcm9sbGVyIGFuZCBzY3JvbGxiYXIsIGVuc3VyZSB0aGUgZ3V0dGVyIGVsZW1lbnRzIGFyZQovLyBhbGlnbmVkLgpmdW5jdGlvbiBzZXRTY3JvbGxMZWZ0KGNtLCB2YWwsIGlzU2Nyb2xsZXIpIHsKICBpZiAoaXNTY3JvbGxlciA/IHZhbCA9PSBjbS5kb2Muc2Nyb2xsTGVmdCA6IE1hdGguYWJzKGNtLmRvYy5zY3JvbGxMZWZ0IC0gdmFsKSA8IDIpIHsgcmV0dXJuIH0KICB2YWwgPSBNYXRoLm1pbih2YWwsIGNtLmRpc3BsYXkuc2Nyb2xsZXIuc2Nyb2xsV2lkdGggLSBjbS5kaXNwbGF5LnNjcm9sbGVyLmNsaWVudFdpZHRoKQogIGNtLmRvYy5zY3JvbGxMZWZ0ID0gdmFsCiAgYWxpZ25Ib3Jpem9udGFsbHkoY20pCiAgaWYgKGNtLmRpc3BsYXkuc2Nyb2xsZXIuc2Nyb2xsTGVmdCAhPSB2YWwpIHsgY20uZGlzcGxheS5zY3JvbGxlci5zY3JvbGxMZWZ0ID0gdmFsIH0KICBjbS5kaXNwbGF5LnNjcm9sbGJhcnMuc2V0U2Nyb2xsTGVmdCh2YWwpCn0KCi8vIFNpbmNlIHRoZSBkZWx0YSB2YWx1ZXMgcmVwb3J0ZWQgb24gbW91c2Ugd2hlZWwgZXZlbnRzIGFyZQovLyB1bnN0YW5kYXJkaXplZCBiZXR3ZWVuIGJyb3dzZXJzIGFuZCBldmVuIGJyb3dzZXIgdmVyc2lvbnMsIGFuZAovLyBnZW5lcmFsbHkgaG9ycmlibHkgdW5wcmVkaWN0YWJsZSwgdGhpcyBjb2RlIHN0YXJ0cyBieSBtZWFzdXJpbmcKLy8gdGhlIHNjcm9sbCBlZmZlY3QgdGhhdCB0aGUgZmlyc3QgZmV3IG1vdXNlIHdoZWVsIGV2ZW50cyBoYXZlLAovLyBhbmQsIGZyb20gdGhhdCwgZGV0ZWN0cyB0aGUgd2F5IGl0IGNhbiBjb252ZXJ0IGRlbHRhcyB0byBwaXhlbAovLyBvZmZzZXRzIGFmdGVyd2FyZHMuCi8vCi8vIFRoZSByZWFzb24gd2Ugd2FudCB0byBrbm93IHRoZSBhbW91bnQgYSB3aGVlbCBldmVudCB3aWxsIHNjcm9sbAovLyBpcyB0aGF0IGl0IGdpdmVzIHVzIGEgY2hhbmNlIHRvIHVwZGF0ZSB0aGUgZGlzcGxheSBiZWZvcmUgdGhlCi8vIGFjdHVhbCBzY3JvbGxpbmcgaGFwcGVucywgcmVkdWNpbmcgZmxpY2tlcmluZy4KCnZhciB3aGVlbFNhbXBsZXMgPSAwOwp2YXIgd2hlZWxQaXhlbHNQZXJVbml0ID0gbnVsbAovLyBGaWxsIGluIGEgYnJvd3Nlci1kZXRlY3RlZCBzdGFydGluZyB2YWx1ZSBvbiBicm93c2VycyB3aGVyZSB3ZQovLyBrbm93IG9uZS4gVGhlc2UgZG9uJ3QgaGF2ZSB0byBiZSBhY2N1cmF0ZSAtLSB0aGUgcmVzdWx0IG9mIHRoZW0KLy8gYmVpbmcgd3Jvbmcgd291bGQganVzdCBiZSBhIHNsaWdodCBmbGlja2VyIG9uIHRoZSBmaXJzdCB3aGVlbAovLyBzY3JvbGwgKGlmIGl0IGlzIGxhcmdlIGVub3VnaCkuCmlmIChpZSkgeyB3aGVlbFBpeGVsc1BlclVuaXQgPSAtLjUzIH0KZWxzZSBpZiAoZ2Vja28pIHsgd2hlZWxQaXhlbHNQZXJVbml0ID0gMTUgfQplbHNlIGlmIChjaHJvbWUpIHsgd2hlZWxQaXhlbHNQZXJVbml0ID0gLS43IH0KZWxzZSBpZiAoc2FmYXJpKSB7IHdoZWVsUGl4ZWxzUGVyVW5pdCA9IC0xLzMgfQoKZnVuY3Rpb24gd2hlZWxFdmVudERlbHRhKGUpIHsKICB2YXIgZHggPSBlLndoZWVsRGVsdGFYLCBkeSA9IGUud2hlZWxEZWx0YVkKICBpZiAoZHggPT0gbnVsbCAmJiBlLmRldGFpbCAmJiBlLmF4aXMgPT0gZS5IT1JJWk9OVEFMX0FYSVMpIHsgZHggPSBlLmRldGFpbCB9CiAgaWYgKGR5ID09IG51bGwgJiYgZS5kZXRhaWwgJiYgZS5heGlzID09IGUuVkVSVElDQUxfQVhJUykgeyBkeSA9IGUuZGV0YWlsIH0KICBlbHNlIGlmIChkeSA9PSBudWxsKSB7IGR5ID0gZS53aGVlbERlbHRhIH0KICByZXR1cm4ge3g6IGR4LCB5OiBkeX0KfQpmdW5jdGlvbiB3aGVlbEV2ZW50UGl4ZWxzKGUpIHsKICB2YXIgZGVsdGEgPSB3aGVlbEV2ZW50RGVsdGEoZSkKICBkZWx0YS54ICo9IHdoZWVsUGl4ZWxzUGVyVW5pdAogIGRlbHRhLnkgKj0gd2hlZWxQaXhlbHNQZXJVbml0CiAgcmV0dXJuIGRlbHRhCn0KCmZ1bmN0aW9uIG9uU2Nyb2xsV2hlZWwoY20sIGUpIHsKICB2YXIgZGVsdGEgPSB3aGVlbEV2ZW50RGVsdGEoZSksIGR4ID0gZGVsdGEueCwgZHkgPSBkZWx0YS55CgogIHZhciBkaXNwbGF5ID0gY20uZGlzcGxheSwgc2Nyb2xsID0gZGlzcGxheS5zY3JvbGxlcgogIC8vIFF1aXQgaWYgdGhlcmUncyBub3RoaW5nIHRvIHNjcm9sbCBoZXJlCiAgdmFyIGNhblNjcm9sbFggPSBzY3JvbGwuc2Nyb2xsV2lkdGggPiBzY3JvbGwuY2xpZW50V2lkdGgKICB2YXIgY2FuU2Nyb2xsWSA9IHNjcm9sbC5zY3JvbGxIZWlnaHQgPiBzY3JvbGwuY2xpZW50SGVpZ2h0CiAgaWYgKCEoZHggJiYgY2FuU2Nyb2xsWCB8fCBkeSAmJiBjYW5TY3JvbGxZKSkgeyByZXR1cm4gfQoKICAvLyBXZWJraXQgYnJvd3NlcnMgb24gT1MgWCBhYm9ydCBtb21lbnR1bSBzY3JvbGxzIHdoZW4gdGhlIHRhcmdldAogIC8vIG9mIHRoZSBzY3JvbGwgZXZlbnQgaXMgcmVtb3ZlZCBmcm9tIHRoZSBzY3JvbGxhYmxlIGVsZW1lbnQuCiAgLy8gVGhpcyBoYWNrIChzZWUgcmVsYXRlZCBjb2RlIGluIHBhdGNoRGlzcGxheSkgbWFrZXMgc3VyZSB0aGUKICAvLyBlbGVtZW50IGlzIGtlcHQgYXJvdW5kLgogIGlmIChkeSAmJiBtYWMgJiYgd2Via2l0KSB7CiAgICBvdXRlcjogZm9yICh2YXIgY3VyID0gZS50YXJnZXQsIHZpZXcgPSBkaXNwbGF5LnZpZXc7IGN1ciAhPSBzY3JvbGw7IGN1ciA9IGN1ci5wYXJlbnROb2RlKSB7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdmlldy5sZW5ndGg7IGkrKykgewogICAgICAgIGlmICh2aWV3W2ldLm5vZGUgPT0gY3VyKSB7CiAgICAgICAgICBjbS5kaXNwbGF5LmN1cnJlbnRXaGVlbFRhcmdldCA9IGN1cgogICAgICAgICAgYnJlYWsgb3V0ZXIKICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgogIC8vIE9uIHNvbWUgYnJvd3NlcnMsIGhvcml6b250YWwgc2Nyb2xsaW5nIHdpbGwgY2F1c2UgcmVkcmF3cyB0bwogIC8vIGhhcHBlbiBiZWZvcmUgdGhlIGd1dHRlciBoYXMgYmVlbiByZWFsaWduZWQsIGNhdXNpbmcgaXQgdG8KICAvLyB3cmlnZ2xlIGFyb3VuZCBpbiBhIG1vc3QgdW5zZWVtbHkgd2F5LiBXaGVuIHdlIGhhdmUgYW4KICAvLyBlc3RpbWF0ZWQgcGl4ZWxzL2RlbHRhIHZhbHVlLCB3ZSBqdXN0IGhhbmRsZSBob3Jpem9udGFsCiAgLy8gc2Nyb2xsaW5nIGVudGlyZWx5IGhlcmUuIEl0J2xsIGJlIHNsaWdodGx5IG9mZiBmcm9tIG5hdGl2ZSwgYnV0CiAgLy8gYmV0dGVyIHRoYW4gZ2xpdGNoaW5nIG91dC4KICBpZiAoZHggJiYgIWdlY2tvICYmICFwcmVzdG8gJiYgd2hlZWxQaXhlbHNQZXJVbml0ICE9IG51bGwpIHsKICAgIGlmIChkeSAmJiBjYW5TY3JvbGxZKQogICAgICB7IHNldFNjcm9sbFRvcChjbSwgTWF0aC5tYXgoMCwgTWF0aC5taW4oc2Nyb2xsLnNjcm9sbFRvcCArIGR5ICogd2hlZWxQaXhlbHNQZXJVbml0LCBzY3JvbGwuc2Nyb2xsSGVpZ2h0IC0gc2Nyb2xsLmNsaWVudEhlaWdodCkpKSB9CiAgICBzZXRTY3JvbGxMZWZ0KGNtLCBNYXRoLm1heCgwLCBNYXRoLm1pbihzY3JvbGwuc2Nyb2xsTGVmdCArIGR4ICogd2hlZWxQaXhlbHNQZXJVbml0LCBzY3JvbGwuc2Nyb2xsV2lkdGggLSBzY3JvbGwuY2xpZW50V2lkdGgpKSkKICAgIC8vIE9ubHkgcHJldmVudCBkZWZhdWx0IHNjcm9sbGluZyBpZiB2ZXJ0aWNhbCBzY3JvbGxpbmcgaXMKICAgIC8vIGFjdHVhbGx5IHBvc3NpYmxlLiBPdGhlcndpc2UsIGl0IGNhdXNlcyB2ZXJ0aWNhbCBzY3JvbGwKICAgIC8vIGppdHRlciBvbiBPU1ggdHJhY2twYWRzIHdoZW4gZGVsdGFYIGlzIHNtYWxsIGFuZCBkZWx0YVkKICAgIC8vIGlzIGxhcmdlIChpc3N1ZSAjMzU3OSkKICAgIGlmICghZHkgfHwgKGR5ICYmIGNhblNjcm9sbFkpKQogICAgICB7IGVfcHJldmVudERlZmF1bHQoZSkgfQogICAgZGlzcGxheS53aGVlbFN0YXJ0WCA9IG51bGwgLy8gQWJvcnQgbWVhc3VyZW1lbnQsIGlmIGluIHByb2dyZXNzCiAgICByZXR1cm4KICB9CgogIC8vICdQcm9qZWN0JyB0aGUgdmlzaWJsZSB2aWV3cG9ydCB0byBjb3ZlciB0aGUgYXJlYSB0aGF0IGlzIGJlaW5nCiAgLy8gc2Nyb2xsZWQgaW50byB2aWV3IChpZiB3ZSBrbm93IGVub3VnaCB0byBlc3RpbWF0ZSBpdCkuCiAgaWYgKGR5ICYmIHdoZWVsUGl4ZWxzUGVyVW5pdCAhPSBudWxsKSB7CiAgICB2YXIgcGl4ZWxzID0gZHkgKiB3aGVlbFBpeGVsc1BlclVuaXQKICAgIHZhciB0b3AgPSBjbS5kb2Muc2Nyb2xsVG9wLCBib3QgPSB0b3AgKyBkaXNwbGF5LndyYXBwZXIuY2xpZW50SGVpZ2h0CiAgICBpZiAocGl4ZWxzIDwgMCkgeyB0b3AgPSBNYXRoLm1heCgwLCB0b3AgKyBwaXhlbHMgLSA1MCkgfQogICAgZWxzZSB7IGJvdCA9IE1hdGgubWluKGNtLmRvYy5oZWlnaHQsIGJvdCArIHBpeGVscyArIDUwKSB9CiAgICB1cGRhdGVEaXNwbGF5U2ltcGxlKGNtLCB7dG9wOiB0b3AsIGJvdHRvbTogYm90fSkKICB9CgogIGlmICh3aGVlbFNhbXBsZXMgPCAyMCkgewogICAgaWYgKGRpc3BsYXkud2hlZWxTdGFydFggPT0gbnVsbCkgewogICAgICBkaXNwbGF5LndoZWVsU3RhcnRYID0gc2Nyb2xsLnNjcm9sbExlZnQ7IGRpc3BsYXkud2hlZWxTdGFydFkgPSBzY3JvbGwuc2Nyb2xsVG9wCiAgICAgIGRpc3BsYXkud2hlZWxEWCA9IGR4OyBkaXNwbGF5LndoZWVsRFkgPSBkeQogICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICBpZiAoZGlzcGxheS53aGVlbFN0YXJ0WCA9PSBudWxsKSB7IHJldHVybiB9CiAgICAgICAgdmFyIG1vdmVkWCA9IHNjcm9sbC5zY3JvbGxMZWZ0IC0gZGlzcGxheS53aGVlbFN0YXJ0WAogICAgICAgIHZhciBtb3ZlZFkgPSBzY3JvbGwuc2Nyb2xsVG9wIC0gZGlzcGxheS53aGVlbFN0YXJ0WQogICAgICAgIHZhciBzYW1wbGUgPSAobW92ZWRZICYmIGRpc3BsYXkud2hlZWxEWSAmJiBtb3ZlZFkgLyBkaXNwbGF5LndoZWVsRFkpIHx8CiAgICAgICAgICAobW92ZWRYICYmIGRpc3BsYXkud2hlZWxEWCAmJiBtb3ZlZFggLyBkaXNwbGF5LndoZWVsRFgpCiAgICAgICAgZGlzcGxheS53aGVlbFN0YXJ0WCA9IGRpc3BsYXkud2hlZWxTdGFydFkgPSBudWxsCiAgICAgICAgaWYgKCFzYW1wbGUpIHsgcmV0dXJuIH0KICAgICAgICB3aGVlbFBpeGVsc1BlclVuaXQgPSAod2hlZWxQaXhlbHNQZXJVbml0ICogd2hlZWxTYW1wbGVzICsgc2FtcGxlKSAvICh3aGVlbFNhbXBsZXMgKyAxKQogICAgICAgICsrd2hlZWxTYW1wbGVzCiAgICAgIH0sIDIwMCkKICAgIH0gZWxzZSB7CiAgICAgIGRpc3BsYXkud2hlZWxEWCArPSBkeDsgZGlzcGxheS53aGVlbERZICs9IGR5CiAgICB9CiAgfQp9CgovLyBTQ1JPTExCQVJTCgovLyBQcmVwYXJlIERPTSByZWFkcyBuZWVkZWQgdG8gdXBkYXRlIHRoZSBzY3JvbGxiYXJzLiBEb25lIGluIG9uZQovLyBzaG90IHRvIG1pbmltaXplIHVwZGF0ZS9tZWFzdXJlIHJvdW5kdHJpcHMuCmZ1bmN0aW9uIG1lYXN1cmVGb3JTY3JvbGxiYXJzKGNtKSB7CiAgdmFyIGQgPSBjbS5kaXNwbGF5LCBndXR0ZXJXID0gZC5ndXR0ZXJzLm9mZnNldFdpZHRoCiAgdmFyIGRvY0ggPSBNYXRoLnJvdW5kKGNtLmRvYy5oZWlnaHQgKyBwYWRkaW5nVmVydChjbS5kaXNwbGF5KSkKICByZXR1cm4gewogICAgY2xpZW50SGVpZ2h0OiBkLnNjcm9sbGVyLmNsaWVudEhlaWdodCwKICAgIHZpZXdIZWlnaHQ6IGQud3JhcHBlci5jbGllbnRIZWlnaHQsCiAgICBzY3JvbGxXaWR0aDogZC5zY3JvbGxlci5zY3JvbGxXaWR0aCwgY2xpZW50V2lkdGg6IGQuc2Nyb2xsZXIuY2xpZW50V2lkdGgsCiAgICB2aWV3V2lkdGg6IGQud3JhcHBlci5jbGllbnRXaWR0aCwKICAgIGJhckxlZnQ6IGNtLm9wdGlvbnMuZml4ZWRHdXR0ZXIgPyBndXR0ZXJXIDogMCwKICAgIGRvY0hlaWdodDogZG9jSCwKICAgIHNjcm9sbEhlaWdodDogZG9jSCArIHNjcm9sbEdhcChjbSkgKyBkLmJhckhlaWdodCwKICAgIG5hdGl2ZUJhcldpZHRoOiBkLm5hdGl2ZUJhcldpZHRoLAogICAgZ3V0dGVyV2lkdGg6IGd1dHRlclcKICB9Cn0KCmZ1bmN0aW9uIE5hdGl2ZVNjcm9sbGJhcnMocGxhY2UsIHNjcm9sbCwgY20pIHsKICB0aGlzLmNtID0gY20KICB2YXIgdmVydCA9IHRoaXMudmVydCA9IGVsdCgiZGl2IiwgW2VsdCgiZGl2IiwgbnVsbCwgbnVsbCwgIm1pbi13aWR0aDogMXB4IildLCAiQ29kZU1pcnJvci12c2Nyb2xsYmFyIikKICB2YXIgaG9yaXogPSB0aGlzLmhvcml6ID0gZWx0KCJkaXYiLCBbZWx0KCJkaXYiLCBudWxsLCBudWxsLCAiaGVpZ2h0OiAxMDAlOyBtaW4taGVpZ2h0OiAxcHgiKV0sICJDb2RlTWlycm9yLWhzY3JvbGxiYXIiKQogIHBsYWNlKHZlcnQpOyBwbGFjZShob3JpeikKCiAgb24odmVydCwgInNjcm9sbCIsIGZ1bmN0aW9uICgpIHsKICAgIGlmICh2ZXJ0LmNsaWVudEhlaWdodCkgeyBzY3JvbGwodmVydC5zY3JvbGxUb3AsICJ2ZXJ0aWNhbCIpIH0KICB9KQogIG9uKGhvcml6LCAic2Nyb2xsIiwgZnVuY3Rpb24gKCkgewogICAgaWYgKGhvcml6LmNsaWVudFdpZHRoKSB7IHNjcm9sbChob3Jpei5zY3JvbGxMZWZ0LCAiaG9yaXpvbnRhbCIpIH0KICB9KQoKICB0aGlzLmNoZWNrZWRaZXJvV2lkdGggPSBmYWxzZQogIC8vIE5lZWQgdG8gc2V0IGEgbWluaW11bSB3aWR0aCB0byBzZWUgdGhlIHNjcm9sbGJhciBvbiBJRTcgKGJ1dCBtdXN0IG5vdCBzZXQgaXQgb24gSUU4KS4KICBpZiAoaWUgJiYgaWVfdmVyc2lvbiA8IDgpIHsgdGhpcy5ob3Jpei5zdHlsZS5taW5IZWlnaHQgPSB0aGlzLnZlcnQuc3R5bGUubWluV2lkdGggPSAiMThweCIgfQp9CgpOYXRpdmVTY3JvbGxiYXJzLnByb3RvdHlwZSA9IGNvcHlPYmooewogIHVwZGF0ZTogZnVuY3Rpb24obWVhc3VyZSkgewogICAgdmFyIG5lZWRzSCA9IG1lYXN1cmUuc2Nyb2xsV2lkdGggPiBtZWFzdXJlLmNsaWVudFdpZHRoICsgMQogICAgdmFyIG5lZWRzViA9IG1lYXN1cmUuc2Nyb2xsSGVpZ2h0ID4gbWVhc3VyZS5jbGllbnRIZWlnaHQgKyAxCiAgICB2YXIgc1dpZHRoID0gbWVhc3VyZS5uYXRpdmVCYXJXaWR0aAoKICAgIGlmIChuZWVkc1YpIHsKICAgICAgdGhpcy52ZXJ0LnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siCiAgICAgIHRoaXMudmVydC5zdHlsZS5ib3R0b20gPSBuZWVkc0ggPyBzV2lkdGggKyAicHgiIDogIjAiCiAgICAgIHZhciB0b3RhbEhlaWdodCA9IG1lYXN1cmUudmlld0hlaWdodCAtIChuZWVkc0ggPyBzV2lkdGggOiAwKQogICAgICAvLyBBIGJ1ZyBpbiBJRTggY2FuIGNhdXNlIHRoaXMgdmFsdWUgdG8gYmUgbmVnYXRpdmUsIHNvIGd1YXJkIGl0LgogICAgICB0aGlzLnZlcnQuZmlyc3RDaGlsZC5zdHlsZS5oZWlnaHQgPQogICAgICAgIE1hdGgubWF4KDAsIG1lYXN1cmUuc2Nyb2xsSGVpZ2h0IC0gbWVhc3VyZS5jbGllbnRIZWlnaHQgKyB0b3RhbEhlaWdodCkgKyAicHgiCiAgICB9IGVsc2UgewogICAgICB0aGlzLnZlcnQuc3R5bGUuZGlzcGxheSA9ICIiCiAgICAgIHRoaXMudmVydC5maXJzdENoaWxkLnN0eWxlLmhlaWdodCA9ICIwIgogICAgfQoKICAgIGlmIChuZWVkc0gpIHsKICAgICAgdGhpcy5ob3Jpei5zdHlsZS5kaXNwbGF5ID0gImJsb2NrIgogICAgICB0aGlzLmhvcml6LnN0eWxlLnJpZ2h0ID0gbmVlZHNWID8gc1dpZHRoICsgInB4IiA6ICIwIgogICAgICB0aGlzLmhvcml6LnN0eWxlLmxlZnQgPSBtZWFzdXJlLmJhckxlZnQgKyAicHgiCiAgICAgIHZhciB0b3RhbFdpZHRoID0gbWVhc3VyZS52aWV3V2lkdGggLSBtZWFzdXJlLmJhckxlZnQgLSAobmVlZHNWID8gc1dpZHRoIDogMCkKICAgICAgdGhpcy5ob3Jpei5maXJzdENoaWxkLnN0eWxlLndpZHRoID0KICAgICAgICAobWVhc3VyZS5zY3JvbGxXaWR0aCAtIG1lYXN1cmUuY2xpZW50V2lkdGggKyB0b3RhbFdpZHRoKSArICJweCIKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMuaG9yaXouc3R5bGUuZGlzcGxheSA9ICIiCiAgICAgIHRoaXMuaG9yaXouZmlyc3RDaGlsZC5zdHlsZS53aWR0aCA9ICIwIgogICAgfQoKICAgIGlmICghdGhpcy5jaGVja2VkWmVyb1dpZHRoICYmIG1lYXN1cmUuY2xpZW50SGVpZ2h0ID4gMCkgewogICAgICBpZiAoc1dpZHRoID09IDApIHsgdGhpcy56ZXJvV2lkdGhIYWNrKCkgfQogICAgICB0aGlzLmNoZWNrZWRaZXJvV2lkdGggPSB0cnVlCiAgICB9CgogICAgcmV0dXJuIHtyaWdodDogbmVlZHNWID8gc1dpZHRoIDogMCwgYm90dG9tOiBuZWVkc0ggPyBzV2lkdGggOiAwfQogIH0sCiAgc2V0U2Nyb2xsTGVmdDogZnVuY3Rpb24ocG9zKSB7CiAgICBpZiAodGhpcy5ob3Jpei5zY3JvbGxMZWZ0ICE9IHBvcykgeyB0aGlzLmhvcml6LnNjcm9sbExlZnQgPSBwb3MgfQogICAgaWYgKHRoaXMuZGlzYWJsZUhvcml6KSB7IHRoaXMuZW5hYmxlWmVyb1dpZHRoQmFyKHRoaXMuaG9yaXosIHRoaXMuZGlzYWJsZUhvcml6KSB9CiAgfSwKICBzZXRTY3JvbGxUb3A6IGZ1bmN0aW9uKHBvcykgewogICAgaWYgKHRoaXMudmVydC5zY3JvbGxUb3AgIT0gcG9zKSB7IHRoaXMudmVydC5zY3JvbGxUb3AgPSBwb3MgfQogICAgaWYgKHRoaXMuZGlzYWJsZVZlcnQpIHsgdGhpcy5lbmFibGVaZXJvV2lkdGhCYXIodGhpcy52ZXJ0LCB0aGlzLmRpc2FibGVWZXJ0KSB9CiAgfSwKICB6ZXJvV2lkdGhIYWNrOiBmdW5jdGlvbigpIHsKICAgIHZhciB3ID0gbWFjICYmICFtYWNfZ2VNb3VudGFpbkxpb24gPyAiMTJweCIgOiAiMThweCIKICAgIHRoaXMuaG9yaXouc3R5bGUuaGVpZ2h0ID0gdGhpcy52ZXJ0LnN0eWxlLndpZHRoID0gdwogICAgdGhpcy5ob3Jpei5zdHlsZS5wb2ludGVyRXZlbnRzID0gdGhpcy52ZXJ0LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAibm9uZSIKICAgIHRoaXMuZGlzYWJsZUhvcml6ID0gbmV3IERlbGF5ZWQKICAgIHRoaXMuZGlzYWJsZVZlcnQgPSBuZXcgRGVsYXllZAogIH0sCiAgZW5hYmxlWmVyb1dpZHRoQmFyOiBmdW5jdGlvbihiYXIsIGRlbGF5KSB7CiAgICBiYXIuc3R5bGUucG9pbnRlckV2ZW50cyA9ICJhdXRvIgogICAgZnVuY3Rpb24gbWF5YmVEaXNhYmxlKCkgewogICAgICAvLyBUbyBmaW5kIG91dCB3aGV0aGVyIHRoZSBzY3JvbGxiYXIgaXMgc3RpbGwgdmlzaWJsZSwgd2UKICAgICAgLy8gY2hlY2sgd2hldGhlciB0aGUgZWxlbWVudCB1bmRlciB0aGUgcGl4ZWwgaW4gdGhlIGJvdHRvbQogICAgICAvLyBsZWZ0IGNvcm5lciBvZiB0aGUgc2Nyb2xsYmFyIGJveCBpcyB0aGUgc2Nyb2xsYmFyIGJveAogICAgICAvLyBpdHNlbGYgKHdoZW4gdGhlIGJhciBpcyBzdGlsbCB2aXNpYmxlKSBvciBpdHMgZmlsbGVyIGNoaWxkCiAgICAgIC8vICh3aGVuIHRoZSBiYXIgaXMgaGlkZGVuKS4gSWYgaXQgaXMgc3RpbGwgdmlzaWJsZSwgd2Uga2VlcAogICAgICAvLyBpdCBlbmFibGVkLCBpZiBpdCdzIGhpZGRlbiwgd2UgZGlzYWJsZSBwb2ludGVyIGV2ZW50cy4KICAgICAgdmFyIGJveCA9IGJhci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKQogICAgICB2YXIgZWx0JCQxID0gZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludChib3gubGVmdCArIDEsIGJveC5ib3R0b20gLSAxKQogICAgICBpZiAoZWx0JCQxICE9IGJhcikgeyBiYXIuc3R5bGUucG9pbnRlckV2ZW50cyA9ICJub25lIiB9CiAgICAgIGVsc2UgeyBkZWxheS5zZXQoMTAwMCwgbWF5YmVEaXNhYmxlKSB9CiAgICB9CiAgICBkZWxheS5zZXQoMTAwMCwgbWF5YmVEaXNhYmxlKQogIH0sCiAgY2xlYXI6IGZ1bmN0aW9uKCkgewogICAgdmFyIHBhcmVudCA9IHRoaXMuaG9yaXoucGFyZW50Tm9kZQogICAgcGFyZW50LnJlbW92ZUNoaWxkKHRoaXMuaG9yaXopCiAgICBwYXJlbnQucmVtb3ZlQ2hpbGQodGhpcy52ZXJ0KQogIH0KfSwgTmF0aXZlU2Nyb2xsYmFycy5wcm90b3R5cGUpCgpmdW5jdGlvbiBOdWxsU2Nyb2xsYmFycygpIHt9CgpOdWxsU2Nyb2xsYmFycy5wcm90b3R5cGUgPSBjb3B5T2JqKHsKICB1cGRhdGU6IGZ1bmN0aW9uKCkgeyByZXR1cm4ge2JvdHRvbTogMCwgcmlnaHQ6IDB9IH0sCiAgc2V0U2Nyb2xsTGVmdDogZnVuY3Rpb24oKSB7fSwKICBzZXRTY3JvbGxUb3A6IGZ1bmN0aW9uKCkge30sCiAgY2xlYXI6IGZ1bmN0aW9uKCkge30KfSwgTnVsbFNjcm9sbGJhcnMucHJvdG90eXBlKQoKZnVuY3Rpb24gdXBkYXRlU2Nyb2xsYmFycyhjbSwgbWVhc3VyZSkgewogIGlmICghbWVhc3VyZSkgeyBtZWFzdXJlID0gbWVhc3VyZUZvclNjcm9sbGJhcnMoY20pIH0KICB2YXIgc3RhcnRXaWR0aCA9IGNtLmRpc3BsYXkuYmFyV2lkdGgsIHN0YXJ0SGVpZ2h0ID0gY20uZGlzcGxheS5iYXJIZWlnaHQKICB1cGRhdGVTY3JvbGxiYXJzSW5uZXIoY20sIG1lYXN1cmUpCiAgZm9yICh2YXIgaSA9IDA7IGkgPCA0ICYmIHN0YXJ0V2lkdGggIT0gY20uZGlzcGxheS5iYXJXaWR0aCB8fCBzdGFydEhlaWdodCAhPSBjbS5kaXNwbGF5LmJhckhlaWdodDsgaSsrKSB7CiAgICBpZiAoc3RhcnRXaWR0aCAhPSBjbS5kaXNwbGF5LmJhcldpZHRoICYmIGNtLm9wdGlvbnMubGluZVdyYXBwaW5nKQogICAgICB7IHVwZGF0ZUhlaWdodHNJblZpZXdwb3J0KGNtKSB9CiAgICB1cGRhdGVTY3JvbGxiYXJzSW5uZXIoY20sIG1lYXN1cmVGb3JTY3JvbGxiYXJzKGNtKSkKICAgIHN0YXJ0V2lkdGggPSBjbS5kaXNwbGF5LmJhcldpZHRoOyBzdGFydEhlaWdodCA9IGNtLmRpc3BsYXkuYmFySGVpZ2h0CiAgfQp9CgovLyBSZS1zeW5jaHJvbml6ZSB0aGUgZmFrZSBzY3JvbGxiYXJzIHdpdGggdGhlIGFjdHVhbCBzaXplIG9mIHRoZQovLyBjb250ZW50LgpmdW5jdGlvbiB1cGRhdGVTY3JvbGxiYXJzSW5uZXIoY20sIG1lYXN1cmUpIHsKICB2YXIgZCA9IGNtLmRpc3BsYXkKICB2YXIgc2l6ZXMgPSBkLnNjcm9sbGJhcnMudXBkYXRlKG1lYXN1cmUpCgogIGQuc2l6ZXIuc3R5bGUucGFkZGluZ1JpZ2h0ID0gKGQuYmFyV2lkdGggPSBzaXplcy5yaWdodCkgKyAicHgiCiAgZC5zaXplci5zdHlsZS5wYWRkaW5nQm90dG9tID0gKGQuYmFySGVpZ2h0ID0gc2l6ZXMuYm90dG9tKSArICJweCIKICBkLmhlaWdodEZvcmNlci5zdHlsZS5ib3JkZXJCb3R0b20gPSBzaXplcy5ib3R0b20gKyAicHggc29saWQgdHJhbnNwYXJlbnQiCgogIGlmIChzaXplcy5yaWdodCAmJiBzaXplcy5ib3R0b20pIHsKICAgIGQuc2Nyb2xsYmFyRmlsbGVyLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siCiAgICBkLnNjcm9sbGJhckZpbGxlci5zdHlsZS5oZWlnaHQgPSBzaXplcy5ib3R0b20gKyAicHgiCiAgICBkLnNjcm9sbGJhckZpbGxlci5zdHlsZS53aWR0aCA9IHNpemVzLnJpZ2h0ICsgInB4IgogIH0gZWxzZSB7IGQuc2Nyb2xsYmFyRmlsbGVyLnN0eWxlLmRpc3BsYXkgPSAiIiB9CiAgaWYgKHNpemVzLmJvdHRvbSAmJiBjbS5vcHRpb25zLmNvdmVyR3V0dGVyTmV4dFRvU2Nyb2xsYmFyICYmIGNtLm9wdGlvbnMuZml4ZWRHdXR0ZXIpIHsKICAgIGQuZ3V0dGVyRmlsbGVyLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siCiAgICBkLmd1dHRlckZpbGxlci5zdHlsZS5oZWlnaHQgPSBzaXplcy5ib3R0b20gKyAicHgiCiAgICBkLmd1dHRlckZpbGxlci5zdHlsZS53aWR0aCA9IG1lYXN1cmUuZ3V0dGVyV2lkdGggKyAicHgiCiAgfSBlbHNlIHsgZC5ndXR0ZXJGaWxsZXIuc3R5bGUuZGlzcGxheSA9ICIiIH0KfQoKdmFyIHNjcm9sbGJhck1vZGVsID0geyJuYXRpdmUiOiBOYXRpdmVTY3JvbGxiYXJzLCAibnVsbCI6IE51bGxTY3JvbGxiYXJzfQoKZnVuY3Rpb24gaW5pdFNjcm9sbGJhcnMoY20pIHsKICBpZiAoY20uZGlzcGxheS5zY3JvbGxiYXJzKSB7CiAgICBjbS5kaXNwbGF5LnNjcm9sbGJhcnMuY2xlYXIoKQogICAgaWYgKGNtLmRpc3BsYXkuc2Nyb2xsYmFycy5hZGRDbGFzcykKICAgICAgeyBybUNsYXNzKGNtLmRpc3BsYXkud3JhcHBlciwgY20uZGlzcGxheS5zY3JvbGxiYXJzLmFkZENsYXNzKSB9CiAgfQoKICBjbS5kaXNwbGF5LnNjcm9sbGJhcnMgPSBuZXcgc2Nyb2xsYmFyTW9kZWxbY20ub3B0aW9ucy5zY3JvbGxiYXJTdHlsZV0oZnVuY3Rpb24gKG5vZGUpIHsKICAgIGNtLmRpc3BsYXkud3JhcHBlci5pbnNlcnRCZWZvcmUobm9kZSwgY20uZGlzcGxheS5zY3JvbGxiYXJGaWxsZXIpCiAgICAvLyBQcmV2ZW50IGNsaWNrcyBpbiB0aGUgc2Nyb2xsYmFycyBmcm9tIGtpbGxpbmcgZm9jdXMKICAgIG9uKG5vZGUsICJtb3VzZWRvd24iLCBmdW5jdGlvbiAoKSB7CiAgICAgIGlmIChjbS5zdGF0ZS5mb2N1c2VkKSB7IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyByZXR1cm4gY20uZGlzcGxheS5pbnB1dC5mb2N1cygpOyB9LCAwKSB9CiAgICB9KQogICAgbm9kZS5zZXRBdHRyaWJ1dGUoImNtLW5vdC1jb250ZW50IiwgInRydWUiKQogIH0sIGZ1bmN0aW9uIChwb3MsIGF4aXMpIHsKICAgIGlmIChheGlzID09ICJob3Jpem9udGFsIikgeyBzZXRTY3JvbGxMZWZ0KGNtLCBwb3MpIH0KICAgIGVsc2UgeyBzZXRTY3JvbGxUb3AoY20sIHBvcykgfQogIH0sIGNtKQogIGlmIChjbS5kaXNwbGF5LnNjcm9sbGJhcnMuYWRkQ2xhc3MpCiAgICB7IGFkZENsYXNzKGNtLmRpc3BsYXkud3JhcHBlciwgY20uZGlzcGxheS5zY3JvbGxiYXJzLmFkZENsYXNzKSB9Cn0KCi8vIFNDUk9MTElORyBUSElOR1MgSU5UTyBWSUVXCgovLyBJZiBhbiBlZGl0b3Igc2l0cyBvbiB0aGUgdG9wIG9yIGJvdHRvbSBvZiB0aGUgd2luZG93LCBwYXJ0aWFsbHkKLy8gc2Nyb2xsZWQgb3V0IG9mIHZpZXcsIHRoaXMgZW5zdXJlcyB0aGF0IHRoZSBjdXJzb3IgaXMgdmlzaWJsZS4KZnVuY3Rpb24gbWF5YmVTY3JvbGxXaW5kb3coY20sIGNvb3JkcykgewogIGlmIChzaWduYWxET01FdmVudChjbSwgInNjcm9sbEN1cnNvckludG9WaWV3IikpIHsgcmV0dXJuIH0KCiAgdmFyIGRpc3BsYXkgPSBjbS5kaXNwbGF5LCBib3ggPSBkaXNwbGF5LnNpemVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCBkb1Njcm9sbCA9IG51bGwKICBpZiAoY29vcmRzLnRvcCArIGJveC50b3AgPCAwKSB7IGRvU2Nyb2xsID0gdHJ1ZSB9CiAgZWxzZSBpZiAoY29vcmRzLmJvdHRvbSArIGJveC50b3AgPiAod2luZG93LmlubmVySGVpZ2h0IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpKSB7IGRvU2Nyb2xsID0gZmFsc2UgfQogIGlmIChkb1Njcm9sbCAhPSBudWxsICYmICFwaGFudG9tKSB7CiAgICB2YXIgc2Nyb2xsTm9kZSA9IGVsdCgiZGl2IiwgIlx1MjAwYiIsIG51bGwsICgicG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICAgICAgICAgICAgICAgICAgIHRvcDogIiArIChjb29yZHMudG9wIC0gZGlzcGxheS52aWV3T2Zmc2V0IC0gcGFkZGluZ1RvcChjbS5kaXNwbGF5KSkgKyAicHg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAiICsgKGNvb3Jkcy5ib3R0b20gLSBjb29yZHMudG9wICsgc2Nyb2xsR2FwKGNtKSArIGRpc3BsYXkuYmFySGVpZ2h0KSArICJweDtcbiAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiAiICsgKGNvb3Jkcy5sZWZ0KSArICJweDsgd2lkdGg6IDJweDsiKSkKICAgIGNtLmRpc3BsYXkubGluZVNwYWNlLmFwcGVuZENoaWxkKHNjcm9sbE5vZGUpCiAgICBzY3JvbGxOb2RlLnNjcm9sbEludG9WaWV3KGRvU2Nyb2xsKQogICAgY20uZGlzcGxheS5saW5lU3BhY2UucmVtb3ZlQ2hpbGQoc2Nyb2xsTm9kZSkKICB9Cn0KCi8vIFNjcm9sbCBhIGdpdmVuIHBvc2l0aW9uIGludG8gdmlldyAoaW1tZWRpYXRlbHkpLCB2ZXJpZnlpbmcgdGhhdAovLyBpdCBhY3R1YWxseSBiZWNhbWUgdmlzaWJsZSAoYXMgbGluZSBoZWlnaHRzIGFyZSBhY2N1cmF0ZWx5Ci8vIG1lYXN1cmVkLCB0aGUgcG9zaXRpb24gb2Ygc29tZXRoaW5nIG1heSAnZHJpZnQnIGR1cmluZyBkcmF3aW5nKS4KZnVuY3Rpb24gc2Nyb2xsUG9zSW50b1ZpZXcoY20sIHBvcywgZW5kLCBtYXJnaW4pIHsKICBpZiAobWFyZ2luID09IG51bGwpIHsgbWFyZ2luID0gMCB9CiAgdmFyIGNvb3JkcwogIGZvciAodmFyIGxpbWl0ID0gMDsgbGltaXQgPCA1OyBsaW1pdCsrKSB7CiAgICB2YXIgY2hhbmdlZCA9IGZhbHNlCiAgICBjb29yZHMgPSBjdXJzb3JDb29yZHMoY20sIHBvcykKICAgIHZhciBlbmRDb29yZHMgPSAhZW5kIHx8IGVuZCA9PSBwb3MgPyBjb29yZHMgOiBjdXJzb3JDb29yZHMoY20sIGVuZCkKICAgIHZhciBzY3JvbGxQb3MgPSBjYWxjdWxhdGVTY3JvbGxQb3MoY20sIE1hdGgubWluKGNvb3Jkcy5sZWZ0LCBlbmRDb29yZHMubGVmdCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGgubWluKGNvb3Jkcy50b3AsIGVuZENvb3Jkcy50b3ApIC0gbWFyZ2luLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLm1heChjb29yZHMubGVmdCwgZW5kQ29vcmRzLmxlZnQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLm1heChjb29yZHMuYm90dG9tLCBlbmRDb29yZHMuYm90dG9tKSArIG1hcmdpbikKICAgIHZhciBzdGFydFRvcCA9IGNtLmRvYy5zY3JvbGxUb3AsIHN0YXJ0TGVmdCA9IGNtLmRvYy5zY3JvbGxMZWZ0CiAgICBpZiAoc2Nyb2xsUG9zLnNjcm9sbFRvcCAhPSBudWxsKSB7CiAgICAgIHNldFNjcm9sbFRvcChjbSwgc2Nyb2xsUG9zLnNjcm9sbFRvcCkKICAgICAgaWYgKE1hdGguYWJzKGNtLmRvYy5zY3JvbGxUb3AgLSBzdGFydFRvcCkgPiAxKSB7IGNoYW5nZWQgPSB0cnVlIH0KICAgIH0KICAgIGlmIChzY3JvbGxQb3Muc2Nyb2xsTGVmdCAhPSBudWxsKSB7CiAgICAgIHNldFNjcm9sbExlZnQoY20sIHNjcm9sbFBvcy5zY3JvbGxMZWZ0KQogICAgICBpZiAoTWF0aC5hYnMoY20uZG9jLnNjcm9sbExlZnQgLSBzdGFydExlZnQpID4gMSkgeyBjaGFuZ2VkID0gdHJ1ZSB9CiAgICB9CiAgICBpZiAoIWNoYW5nZWQpIHsgYnJlYWsgfQogIH0KICByZXR1cm4gY29vcmRzCn0KCi8vIFNjcm9sbCBhIGdpdmVuIHNldCBvZiBjb29yZGluYXRlcyBpbnRvIHZpZXcgKGltbWVkaWF0ZWx5KS4KZnVuY3Rpb24gc2Nyb2xsSW50b1ZpZXcoY20sIHgxLCB5MSwgeDIsIHkyKSB7CiAgdmFyIHNjcm9sbFBvcyA9IGNhbGN1bGF0ZVNjcm9sbFBvcyhjbSwgeDEsIHkxLCB4MiwgeTIpCiAgaWYgKHNjcm9sbFBvcy5zY3JvbGxUb3AgIT0gbnVsbCkgeyBzZXRTY3JvbGxUb3AoY20sIHNjcm9sbFBvcy5zY3JvbGxUb3ApIH0KICBpZiAoc2Nyb2xsUG9zLnNjcm9sbExlZnQgIT0gbnVsbCkgeyBzZXRTY3JvbGxMZWZ0KGNtLCBzY3JvbGxQb3Muc2Nyb2xsTGVmdCkgfQp9CgovLyBDYWxjdWxhdGUgYSBuZXcgc2Nyb2xsIHBvc2l0aW9uIG5lZWRlZCB0byBzY3JvbGwgdGhlIGdpdmVuCi8vIHJlY3RhbmdsZSBpbnRvIHZpZXcuIFJldHVybnMgYW4gb2JqZWN0IHdpdGggc2Nyb2xsVG9wIGFuZAovLyBzY3JvbGxMZWZ0IHByb3BlcnRpZXMuIFdoZW4gdGhlc2UgYXJlIHVuZGVmaW5lZCwgdGhlCi8vIHZlcnRpY2FsL2hvcml6b250YWwgcG9zaXRpb24gZG9lcyBub3QgbmVlZCB0byBiZSBhZGp1c3RlZC4KZnVuY3Rpb24gY2FsY3VsYXRlU2Nyb2xsUG9zKGNtLCB4MSwgeTEsIHgyLCB5MikgewogIHZhciBkaXNwbGF5ID0gY20uZGlzcGxheSwgc25hcE1hcmdpbiA9IHRleHRIZWlnaHQoY20uZGlzcGxheSkKICBpZiAoeTEgPCAwKSB7IHkxID0gMCB9CiAgdmFyIHNjcmVlbnRvcCA9IGNtLmN1ck9wICYmIGNtLmN1ck9wLnNjcm9sbFRvcCAhPSBudWxsID8gY20uY3VyT3Auc2Nyb2xsVG9wIDogZGlzcGxheS5zY3JvbGxlci5zY3JvbGxUb3AKICB2YXIgc2NyZWVuID0gZGlzcGxheUhlaWdodChjbSksIHJlc3VsdCA9IHt9CiAgaWYgKHkyIC0geTEgPiBzY3JlZW4pIHsgeTIgPSB5MSArIHNjcmVlbiB9CiAgdmFyIGRvY0JvdHRvbSA9IGNtLmRvYy5oZWlnaHQgKyBwYWRkaW5nVmVydChkaXNwbGF5KQogIHZhciBhdFRvcCA9IHkxIDwgc25hcE1hcmdpbiwgYXRCb3R0b20gPSB5MiA+IGRvY0JvdHRvbSAtIHNuYXBNYXJnaW4KICBpZiAoeTEgPCBzY3JlZW50b3ApIHsKICAgIHJlc3VsdC5zY3JvbGxUb3AgPSBhdFRvcCA/IDAgOiB5MQogIH0gZWxzZSBpZiAoeTIgPiBzY3JlZW50b3AgKyBzY3JlZW4pIHsKICAgIHZhciBuZXdUb3AgPSBNYXRoLm1pbih5MSwgKGF0Qm90dG9tID8gZG9jQm90dG9tIDogeTIpIC0gc2NyZWVuKQogICAgaWYgKG5ld1RvcCAhPSBzY3JlZW50b3ApIHsgcmVzdWx0LnNjcm9sbFRvcCA9IG5ld1RvcCB9CiAgfQoKICB2YXIgc2NyZWVubGVmdCA9IGNtLmN1ck9wICYmIGNtLmN1ck9wLnNjcm9sbExlZnQgIT0gbnVsbCA/IGNtLmN1ck9wLnNjcm9sbExlZnQgOiBkaXNwbGF5LnNjcm9sbGVyLnNjcm9sbExlZnQKICB2YXIgc2NyZWVudyA9IGRpc3BsYXlXaWR0aChjbSkgLSAoY20ub3B0aW9ucy5maXhlZEd1dHRlciA/IGRpc3BsYXkuZ3V0dGVycy5vZmZzZXRXaWR0aCA6IDApCiAgdmFyIHRvb1dpZGUgPSB4MiAtIHgxID4gc2NyZWVudwogIGlmICh0b29XaWRlKSB7IHgyID0geDEgKyBzY3JlZW53IH0KICBpZiAoeDEgPCAxMCkKICAgIHsgcmVzdWx0LnNjcm9sbExlZnQgPSAwIH0KICBlbHNlIGlmICh4MSA8IHNjcmVlbmxlZnQpCiAgICB7IHJlc3VsdC5zY3JvbGxMZWZ0ID0gTWF0aC5tYXgoMCwgeDEgLSAodG9vV2lkZSA/IDAgOiAxMCkpIH0KICBlbHNlIGlmICh4MiA+IHNjcmVlbncgKyBzY3JlZW5sZWZ0IC0gMykKICAgIHsgcmVzdWx0LnNjcm9sbExlZnQgPSB4MiArICh0b29XaWRlID8gMCA6IDEwKSAtIHNjcmVlbncgfQogIHJldHVybiByZXN1bHQKfQoKLy8gU3RvcmUgYSByZWxhdGl2ZSBhZGp1c3RtZW50IHRvIHRoZSBzY3JvbGwgcG9zaXRpb24gaW4gdGhlIGN1cnJlbnQKLy8gb3BlcmF0aW9uICh0byBiZSBhcHBsaWVkIHdoZW4gdGhlIG9wZXJhdGlvbiBmaW5pc2hlcykuCmZ1bmN0aW9uIGFkZFRvU2Nyb2xsUG9zKGNtLCBsZWZ0LCB0b3ApIHsKICBpZiAobGVmdCAhPSBudWxsIHx8IHRvcCAhPSBudWxsKSB7IHJlc29sdmVTY3JvbGxUb1BvcyhjbSkgfQogIGlmIChsZWZ0ICE9IG51bGwpCiAgICB7IGNtLmN1ck9wLnNjcm9sbExlZnQgPSAoY20uY3VyT3Auc2Nyb2xsTGVmdCA9PSBudWxsID8gY20uZG9jLnNjcm9sbExlZnQgOiBjbS5jdXJPcC5zY3JvbGxMZWZ0KSArIGxlZnQgfQogIGlmICh0b3AgIT0gbnVsbCkKICAgIHsgY20uY3VyT3Auc2Nyb2xsVG9wID0gKGNtLmN1ck9wLnNjcm9sbFRvcCA9PSBudWxsID8gY20uZG9jLnNjcm9sbFRvcCA6IGNtLmN1ck9wLnNjcm9sbFRvcCkgKyB0b3AgfQp9CgovLyBNYWtlIHN1cmUgdGhhdCBhdCB0aGUgZW5kIG9mIHRoZSBvcGVyYXRpb24gdGhlIGN1cnJlbnQgY3Vyc29yIGlzCi8vIHNob3duLgpmdW5jdGlvbiBlbnN1cmVDdXJzb3JWaXNpYmxlKGNtKSB7CiAgcmVzb2x2ZVNjcm9sbFRvUG9zKGNtKQogIHZhciBjdXIgPSBjbS5nZXRDdXJzb3IoKSwgZnJvbSA9IGN1ciwgdG8gPSBjdXIKICBpZiAoIWNtLm9wdGlvbnMubGluZVdyYXBwaW5nKSB7CiAgICBmcm9tID0gY3VyLmNoID8gUG9zKGN1ci5saW5lLCBjdXIuY2ggLSAxKSA6IGN1cgogICAgdG8gPSBQb3MoY3VyLmxpbmUsIGN1ci5jaCArIDEpCiAgfQogIGNtLmN1ck9wLnNjcm9sbFRvUG9zID0ge2Zyb206IGZyb20sIHRvOiB0bywgbWFyZ2luOiBjbS5vcHRpb25zLmN1cnNvclNjcm9sbE1hcmdpbiwgaXNDdXJzb3I6IHRydWV9Cn0KCi8vIFdoZW4gYW4gb3BlcmF0aW9uIGhhcyBpdHMgc2Nyb2xsVG9Qb3MgcHJvcGVydHkgc2V0LCBhbmQgYW5vdGhlcgovLyBzY3JvbGwgYWN0aW9uIGlzIGFwcGxpZWQgYmVmb3JlIHRoZSBlbmQgb2YgdGhlIG9wZXJhdGlvbiwgdGhpcwovLyAnc2ltdWxhdGVzJyBzY3JvbGxpbmcgdGhhdCBwb3NpdGlvbiBpbnRvIHZpZXcgaW4gYSBjaGVhcCB3YXksIHNvCi8vIHRoYXQgdGhlIGVmZmVjdCBvZiBpbnRlcm1lZGlhdGUgc2Nyb2xsIGNvbW1hbmRzIGlzIG5vdCBpZ25vcmVkLgpmdW5jdGlvbiByZXNvbHZlU2Nyb2xsVG9Qb3MoY20pIHsKICB2YXIgcmFuZ2UkJDEgPSBjbS5jdXJPcC5zY3JvbGxUb1BvcwogIGlmIChyYW5nZSQkMSkgewogICAgY20uY3VyT3Auc2Nyb2xsVG9Qb3MgPSBudWxsCiAgICB2YXIgZnJvbSA9IGVzdGltYXRlQ29vcmRzKGNtLCByYW5nZSQkMS5mcm9tKSwgdG8gPSBlc3RpbWF0ZUNvb3JkcyhjbSwgcmFuZ2UkJDEudG8pCiAgICB2YXIgc1BvcyA9IGNhbGN1bGF0ZVNjcm9sbFBvcyhjbSwgTWF0aC5taW4oZnJvbS5sZWZ0LCB0by5sZWZ0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGgubWluKGZyb20udG9wLCB0by50b3ApIC0gcmFuZ2UkJDEubWFyZ2luLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5tYXgoZnJvbS5yaWdodCwgdG8ucmlnaHQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5tYXgoZnJvbS5ib3R0b20sIHRvLmJvdHRvbSkgKyByYW5nZSQkMS5tYXJnaW4pCiAgICBjbS5zY3JvbGxUbyhzUG9zLnNjcm9sbExlZnQsIHNQb3Muc2Nyb2xsVG9wKQogIH0KfQoKLy8gT3BlcmF0aW9ucyBhcmUgdXNlZCB0byB3cmFwIGEgc2VyaWVzIG9mIGNoYW5nZXMgdG8gdGhlIGVkaXRvcgovLyBzdGF0ZSBpbiBzdWNoIGEgd2F5IHRoYXQgZWFjaCBjaGFuZ2Ugd29uJ3QgaGF2ZSB0byB1cGRhdGUgdGhlCi8vIGN1cnNvciBhbmQgZGlzcGxheSAod2hpY2ggd291bGQgYmUgYXdrd2FyZCwgc2xvdywgYW5kCi8vIGVycm9yLXByb25lKS4gSW5zdGVhZCwgZGlzcGxheSB1cGRhdGVzIGFyZSBiYXRjaGVkIGFuZCB0aGVuIGFsbAovLyBjb21iaW5lZCBhbmQgZXhlY3V0ZWQgYXQgb25jZS4KCnZhciBuZXh0T3BJZCA9IDAKLy8gU3RhcnQgYSBuZXcgb3BlcmF0aW9uLgpmdW5jdGlvbiBzdGFydE9wZXJhdGlvbihjbSkgewogIGNtLmN1ck9wID0gewogICAgY206IGNtLAogICAgdmlld0NoYW5nZWQ6IGZhbHNlLCAgICAgIC8vIEZsYWcgdGhhdCBpbmRpY2F0ZXMgdGhhdCBsaW5lcyBtaWdodCBuZWVkIHRvIGJlIHJlZHJhd24KICAgIHN0YXJ0SGVpZ2h0OiBjbS5kb2MuaGVpZ2h0LCAvLyBVc2VkIHRvIGRldGVjdCBuZWVkIHRvIHVwZGF0ZSBzY3JvbGxiYXIKICAgIGZvcmNlVXBkYXRlOiBmYWxzZSwgICAgICAvLyBVc2VkIHRvIGZvcmNlIGEgcmVkcmF3CiAgICB1cGRhdGVJbnB1dDogbnVsbCwgICAgICAgLy8gV2hldGhlciB0byByZXNldCB0aGUgaW5wdXQgdGV4dGFyZWEKICAgIHR5cGluZzogZmFsc2UsICAgICAgICAgICAvLyBXaGV0aGVyIHRoaXMgcmVzZXQgc2hvdWxkIGJlIGNhcmVmdWwgdG8gbGVhdmUgZXhpc3RpbmcgdGV4dCAoZm9yIGNvbXBvc2l0aW5nKQogICAgY2hhbmdlT2JqczogbnVsbCwgICAgICAgIC8vIEFjY3VtdWxhdGVkIGNoYW5nZXMsIGZvciBmaXJpbmcgY2hhbmdlIGV2ZW50cwogICAgY3Vyc29yQWN0aXZpdHlIYW5kbGVyczogbnVsbCwgLy8gU2V0IG9mIGhhbmRsZXJzIHRvIGZpcmUgY3Vyc29yQWN0aXZpdHkgb24KICAgIGN1cnNvckFjdGl2aXR5Q2FsbGVkOiAwLCAvLyBUcmFja3Mgd2hpY2ggY3Vyc29yQWN0aXZpdHkgaGFuZGxlcnMgaGF2ZSBiZWVuIGNhbGxlZCBhbHJlYWR5CiAgICBzZWxlY3Rpb25DaGFuZ2VkOiBmYWxzZSwgLy8gV2hldGhlciB0aGUgc2VsZWN0aW9uIG5lZWRzIHRvIGJlIHJlZHJhd24KICAgIHVwZGF0ZU1heExpbmU6IGZhbHNlLCAgICAvLyBTZXQgd2hlbiB0aGUgd2lkZXN0IGxpbmUgbmVlZHMgdG8gYmUgZGV0ZXJtaW5lZCBhbmV3CiAgICBzY3JvbGxMZWZ0OiBudWxsLCBzY3JvbGxUb3A6IG51bGwsIC8vIEludGVybWVkaWF0ZSBzY3JvbGwgcG9zaXRpb24sIG5vdCBwdXNoZWQgdG8gRE9NIHlldAogICAgc2Nyb2xsVG9Qb3M6IG51bGwsICAgICAgIC8vIFVzZWQgdG8gc2Nyb2xsIHRvIGEgc3BlY2lmaWMgcG9zaXRpb24KICAgIGZvY3VzOiBmYWxzZSwKICAgIGlkOiArK25leHRPcElkICAgICAgICAgICAvLyBVbmlxdWUgSUQKICB9CiAgcHVzaE9wZXJhdGlvbihjbS5jdXJPcCkKfQoKLy8gRmluaXNoIGFuIG9wZXJhdGlvbiwgdXBkYXRpbmcgdGhlIGRpc3BsYXkgYW5kIHNpZ25hbGxpbmcgZGVsYXllZCBldmVudHMKZnVuY3Rpb24gZW5kT3BlcmF0aW9uKGNtKSB7CiAgdmFyIG9wID0gY20uY3VyT3AKICBmaW5pc2hPcGVyYXRpb24ob3AsIGZ1bmN0aW9uIChncm91cCkgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBncm91cC5vcHMubGVuZ3RoOyBpKyspCiAgICAgIHsgZ3JvdXAub3BzW2ldLmNtLmN1ck9wID0gbnVsbCB9CiAgICBlbmRPcGVyYXRpb25zKGdyb3VwKQogIH0pCn0KCi8vIFRoZSBET00gdXBkYXRlcyBkb25lIHdoZW4gYW4gb3BlcmF0aW9uIGZpbmlzaGVzIGFyZSBiYXRjaGVkIHNvCi8vIHRoYXQgdGhlIG1pbmltdW0gbnVtYmVyIG9mIHJlbGF5b3V0cyBhcmUgcmVxdWlyZWQuCmZ1bmN0aW9uIGVuZE9wZXJhdGlvbnMoZ3JvdXApIHsKICB2YXIgb3BzID0gZ3JvdXAub3BzCiAgZm9yICh2YXIgaSA9IDA7IGkgPCBvcHMubGVuZ3RoOyBpKyspIC8vIFJlYWQgRE9NCiAgICB7IGVuZE9wZXJhdGlvbl9SMShvcHNbaV0pIH0KICBmb3IgKHZhciBpJDEgPSAwOyBpJDEgPCBvcHMubGVuZ3RoOyBpJDErKykgLy8gV3JpdGUgRE9NIChtYXliZSkKICAgIHsgZW5kT3BlcmF0aW9uX1cxKG9wc1tpJDFdKSB9CiAgZm9yICh2YXIgaSQyID0gMDsgaSQyIDwgb3BzLmxlbmd0aDsgaSQyKyspIC8vIFJlYWQgRE9NCiAgICB7IGVuZE9wZXJhdGlvbl9SMihvcHNbaSQyXSkgfQogIGZvciAodmFyIGkkMyA9IDA7IGkkMyA8IG9wcy5sZW5ndGg7IGkkMysrKSAvLyBXcml0ZSBET00gKG1heWJlKQogICAgeyBlbmRPcGVyYXRpb25fVzIob3BzW2kkM10pIH0KICBmb3IgKHZhciBpJDQgPSAwOyBpJDQgPCBvcHMubGVuZ3RoOyBpJDQrKykgLy8gUmVhZCBET00KICAgIHsgZW5kT3BlcmF0aW9uX2ZpbmlzaChvcHNbaSQ0XSkgfQp9CgpmdW5jdGlvbiBlbmRPcGVyYXRpb25fUjEob3ApIHsKICB2YXIgY20gPSBvcC5jbSwgZGlzcGxheSA9IGNtLmRpc3BsYXkKICBtYXliZUNsaXBTY3JvbGxiYXJzKGNtKQogIGlmIChvcC51cGRhdGVNYXhMaW5lKSB7IGZpbmRNYXhMaW5lKGNtKSB9CgogIG9wLm11c3RVcGRhdGUgPSBvcC52aWV3Q2hhbmdlZCB8fCBvcC5mb3JjZVVwZGF0ZSB8fCBvcC5zY3JvbGxUb3AgIT0gbnVsbCB8fAogICAgb3Auc2Nyb2xsVG9Qb3MgJiYgKG9wLnNjcm9sbFRvUG9zLmZyb20ubGluZSA8IGRpc3BsYXkudmlld0Zyb20gfHwKICAgICAgICAgICAgICAgICAgICAgICBvcC5zY3JvbGxUb1Bvcy50by5saW5lID49IGRpc3BsYXkudmlld1RvKSB8fAogICAgZGlzcGxheS5tYXhMaW5lQ2hhbmdlZCAmJiBjbS5vcHRpb25zLmxpbmVXcmFwcGluZwogIG9wLnVwZGF0ZSA9IG9wLm11c3RVcGRhdGUgJiYKICAgIG5ldyBEaXNwbGF5VXBkYXRlKGNtLCBvcC5tdXN0VXBkYXRlICYmIHt0b3A6IG9wLnNjcm9sbFRvcCwgZW5zdXJlOiBvcC5zY3JvbGxUb1Bvc30sIG9wLmZvcmNlVXBkYXRlKQp9CgpmdW5jdGlvbiBlbmRPcGVyYXRpb25fVzEob3ApIHsKICBvcC51cGRhdGVkRGlzcGxheSA9IG9wLm11c3RVcGRhdGUgJiYgdXBkYXRlRGlzcGxheUlmTmVlZGVkKG9wLmNtLCBvcC51cGRhdGUpCn0KCmZ1bmN0aW9uIGVuZE9wZXJhdGlvbl9SMihvcCkgewogIHZhciBjbSA9IG9wLmNtLCBkaXNwbGF5ID0gY20uZGlzcGxheQogIGlmIChvcC51cGRhdGVkRGlzcGxheSkgeyB1cGRhdGVIZWlnaHRzSW5WaWV3cG9ydChjbSkgfQoKICBvcC5iYXJNZWFzdXJlID0gbWVhc3VyZUZvclNjcm9sbGJhcnMoY20pCgogIC8vIElmIHRoZSBtYXggbGluZSBjaGFuZ2VkIHNpbmNlIGl0IHdhcyBsYXN0IG1lYXN1cmVkLCBtZWFzdXJlIGl0LAogIC8vIGFuZCBlbnN1cmUgdGhlIGRvY3VtZW50J3Mgd2lkdGggbWF0Y2hlcyBpdC4KICAvLyB1cGRhdGVEaXNwbGF5X1cyIHdpbGwgdXNlIHRoZXNlIHByb3BlcnRpZXMgdG8gZG8gdGhlIGFjdHVhbCByZXNpemluZwogIGlmIChkaXNwbGF5Lm1heExpbmVDaGFuZ2VkICYmICFjbS5vcHRpb25zLmxpbmVXcmFwcGluZykgewogICAgb3AuYWRqdXN0V2lkdGhUbyA9IG1lYXN1cmVDaGFyKGNtLCBkaXNwbGF5Lm1heExpbmUsIGRpc3BsYXkubWF4TGluZS50ZXh0Lmxlbmd0aCkubGVmdCArIDMKICAgIGNtLmRpc3BsYXkuc2l6ZXJXaWR0aCA9IG9wLmFkanVzdFdpZHRoVG8KICAgIG9wLmJhck1lYXN1cmUuc2Nyb2xsV2lkdGggPQogICAgICBNYXRoLm1heChkaXNwbGF5LnNjcm9sbGVyLmNsaWVudFdpZHRoLCBkaXNwbGF5LnNpemVyLm9mZnNldExlZnQgKyBvcC5hZGp1c3RXaWR0aFRvICsgc2Nyb2xsR2FwKGNtKSArIGNtLmRpc3BsYXkuYmFyV2lkdGgpCiAgICBvcC5tYXhTY3JvbGxMZWZ0ID0gTWF0aC5tYXgoMCwgZGlzcGxheS5zaXplci5vZmZzZXRMZWZ0ICsgb3AuYWRqdXN0V2lkdGhUbyAtIGRpc3BsYXlXaWR0aChjbSkpCiAgfQoKICBpZiAob3AudXBkYXRlZERpc3BsYXkgfHwgb3Auc2VsZWN0aW9uQ2hhbmdlZCkKICAgIHsgb3AucHJlcGFyZWRTZWxlY3Rpb24gPSBkaXNwbGF5LmlucHV0LnByZXBhcmVTZWxlY3Rpb24ob3AuZm9jdXMpIH0KfQoKZnVuY3Rpb24gZW5kT3BlcmF0aW9uX1cyKG9wKSB7CiAgdmFyIGNtID0gb3AuY20KCiAgaWYgKG9wLmFkanVzdFdpZHRoVG8gIT0gbnVsbCkgewogICAgY20uZGlzcGxheS5zaXplci5zdHlsZS5taW5XaWR0aCA9IG9wLmFkanVzdFdpZHRoVG8gKyAicHgiCiAgICBpZiAob3AubWF4U2Nyb2xsTGVmdCA8IGNtLmRvYy5zY3JvbGxMZWZ0KQogICAgICB7IHNldFNjcm9sbExlZnQoY20sIE1hdGgubWluKGNtLmRpc3BsYXkuc2Nyb2xsZXIuc2Nyb2xsTGVmdCwgb3AubWF4U2Nyb2xsTGVmdCksIHRydWUpIH0KICAgIGNtLmRpc3BsYXkubWF4TGluZUNoYW5nZWQgPSBmYWxzZQogIH0KCiAgdmFyIHRha2VGb2N1cyA9IG9wLmZvY3VzICYmIG9wLmZvY3VzID09IGFjdGl2ZUVsdCgpICYmICghZG9jdW1lbnQuaGFzRm9jdXMgfHwgZG9jdW1lbnQuaGFzRm9jdXMoKSkKICBpZiAob3AucHJlcGFyZWRTZWxlY3Rpb24pCiAgICB7IGNtLmRpc3BsYXkuaW5wdXQuc2hvd1NlbGVjdGlvbihvcC5wcmVwYXJlZFNlbGVjdGlvbiwgdGFrZUZvY3VzKSB9CiAgaWYgKG9wLnVwZGF0ZWREaXNwbGF5IHx8IG9wLnN0YXJ0SGVpZ2h0ICE9IGNtLmRvYy5oZWlnaHQpCiAgICB7IHVwZGF0ZVNjcm9sbGJhcnMoY20sIG9wLmJhck1lYXN1cmUpIH0KICBpZiAob3AudXBkYXRlZERpc3BsYXkpCiAgICB7IHNldERvY3VtZW50SGVpZ2h0KGNtLCBvcC5iYXJNZWFzdXJlKSB9CgogIGlmIChvcC5zZWxlY3Rpb25DaGFuZ2VkKSB7IHJlc3RhcnRCbGluayhjbSkgfQoKICBpZiAoY20uc3RhdGUuZm9jdXNlZCAmJiBvcC51cGRhdGVJbnB1dCkKICAgIHsgY20uZGlzcGxheS5pbnB1dC5yZXNldChvcC50eXBpbmcpIH0KICBpZiAodGFrZUZvY3VzKSB7IGVuc3VyZUZvY3VzKG9wLmNtKSB9Cn0KCmZ1bmN0aW9uIGVuZE9wZXJhdGlvbl9maW5pc2gob3ApIHsKICB2YXIgY20gPSBvcC5jbSwgZGlzcGxheSA9IGNtLmRpc3BsYXksIGRvYyA9IGNtLmRvYwoKICBpZiAob3AudXBkYXRlZERpc3BsYXkpIHsgcG9zdFVwZGF0ZURpc3BsYXkoY20sIG9wLnVwZGF0ZSkgfQoKICAvLyBBYm9ydCBtb3VzZSB3aGVlbCBkZWx0YSBtZWFzdXJlbWVudCwgd2hlbiBzY3JvbGxpbmcgZXhwbGljaXRseQogIGlmIChkaXNwbGF5LndoZWVsU3RhcnRYICE9IG51bGwgJiYgKG9wLnNjcm9sbFRvcCAhPSBudWxsIHx8IG9wLnNjcm9sbExlZnQgIT0gbnVsbCB8fCBvcC5zY3JvbGxUb1BvcykpCiAgICB7IGRpc3BsYXkud2hlZWxTdGFydFggPSBkaXNwbGF5LndoZWVsU3RhcnRZID0gbnVsbCB9CgogIC8vIFByb3BhZ2F0ZSB0aGUgc2Nyb2xsIHBvc2l0aW9uIHRvIHRoZSBhY3R1YWwgRE9NIHNjcm9sbGVyCiAgaWYgKG9wLnNjcm9sbFRvcCAhPSBudWxsICYmIChkaXNwbGF5LnNjcm9sbGVyLnNjcm9sbFRvcCAhPSBvcC5zY3JvbGxUb3AgfHwgb3AuZm9yY2VTY3JvbGwpKSB7CiAgICBkb2Muc2Nyb2xsVG9wID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oZGlzcGxheS5zY3JvbGxlci5zY3JvbGxIZWlnaHQgLSBkaXNwbGF5LnNjcm9sbGVyLmNsaWVudEhlaWdodCwgb3Auc2Nyb2xsVG9wKSkKICAgIGRpc3BsYXkuc2Nyb2xsYmFycy5zZXRTY3JvbGxUb3AoZG9jLnNjcm9sbFRvcCkKICAgIGRpc3BsYXkuc2Nyb2xsZXIuc2Nyb2xsVG9wID0gZG9jLnNjcm9sbFRvcAogIH0KICBpZiAob3Auc2Nyb2xsTGVmdCAhPSBudWxsICYmIChkaXNwbGF5LnNjcm9sbGVyLnNjcm9sbExlZnQgIT0gb3Auc2Nyb2xsTGVmdCB8fCBvcC5mb3JjZVNjcm9sbCkpIHsKICAgIGRvYy5zY3JvbGxMZWZ0ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oZGlzcGxheS5zY3JvbGxlci5zY3JvbGxXaWR0aCAtIGRpc3BsYXkuc2Nyb2xsZXIuY2xpZW50V2lkdGgsIG9wLnNjcm9sbExlZnQpKQogICAgZGlzcGxheS5zY3JvbGxiYXJzLnNldFNjcm9sbExlZnQoZG9jLnNjcm9sbExlZnQpCiAgICBkaXNwbGF5LnNjcm9sbGVyLnNjcm9sbExlZnQgPSBkb2Muc2Nyb2xsTGVmdAogICAgYWxpZ25Ib3Jpem9udGFsbHkoY20pCiAgfQogIC8vIElmIHdlIG5lZWQgdG8gc2Nyb2xsIGEgc3BlY2lmaWMgcG9zaXRpb24gaW50byB2aWV3LCBkbyBzby4KICBpZiAob3Auc2Nyb2xsVG9Qb3MpIHsKICAgIHZhciBjb29yZHMgPSBzY3JvbGxQb3NJbnRvVmlldyhjbSwgY2xpcFBvcyhkb2MsIG9wLnNjcm9sbFRvUG9zLmZyb20pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBQb3MoZG9jLCBvcC5zY3JvbGxUb1Bvcy50byksIG9wLnNjcm9sbFRvUG9zLm1hcmdpbikKICAgIGlmIChvcC5zY3JvbGxUb1Bvcy5pc0N1cnNvciAmJiBjbS5zdGF0ZS5mb2N1c2VkKSB7IG1heWJlU2Nyb2xsV2luZG93KGNtLCBjb29yZHMpIH0KICB9CgogIC8vIEZpcmUgZXZlbnRzIGZvciBtYXJrZXJzIHRoYXQgYXJlIGhpZGRlbi91bmlkZGVuIGJ5IGVkaXRpbmcgb3IKICAvLyB1bmRvaW5nCiAgdmFyIGhpZGRlbiA9IG9wLm1heWJlSGlkZGVuTWFya2VycywgdW5oaWRkZW4gPSBvcC5tYXliZVVuaGlkZGVuTWFya2VycwogIGlmIChoaWRkZW4pIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBoaWRkZW4ubGVuZ3RoOyArK2kpCiAgICB7IGlmICghaGlkZGVuW2ldLmxpbmVzLmxlbmd0aCkgeyBzaWduYWwoaGlkZGVuW2ldLCAiaGlkZSIpIH0gfSB9CiAgaWYgKHVuaGlkZGVuKSB7IGZvciAodmFyIGkkMSA9IDA7IGkkMSA8IHVuaGlkZGVuLmxlbmd0aDsgKytpJDEpCiAgICB7IGlmICh1bmhpZGRlbltpJDFdLmxpbmVzLmxlbmd0aCkgeyBzaWduYWwodW5oaWRkZW5baSQxXSwgInVuaGlkZSIpIH0gfSB9CgogIGlmIChkaXNwbGF5LndyYXBwZXIub2Zmc2V0SGVpZ2h0KQogICAgeyBkb2Muc2Nyb2xsVG9wID0gY20uZGlzcGxheS5zY3JvbGxlci5zY3JvbGxUb3AgfQoKICAvLyBGaXJlIGNoYW5nZSBldmVudHMsIGFuZCBkZWxheWVkIGV2ZW50IGhhbmRsZXJzCiAgaWYgKG9wLmNoYW5nZU9ianMpCiAgICB7IHNpZ25hbChjbSwgImNoYW5nZXMiLCBjbSwgb3AuY2hhbmdlT2JqcykgfQogIGlmIChvcC51cGRhdGUpCiAgICB7IG9wLnVwZGF0ZS5maW5pc2goKSB9Cn0KCi8vIFJ1biB0aGUgZ2l2ZW4gZnVuY3Rpb24gaW4gYW4gb3BlcmF0aW9uCmZ1bmN0aW9uIHJ1bkluT3AoY20sIGYpIHsKICBpZiAoY20uY3VyT3ApIHsgcmV0dXJuIGYoKSB9CiAgc3RhcnRPcGVyYXRpb24oY20pCiAgdHJ5IHsgcmV0dXJuIGYoKSB9CiAgZmluYWxseSB7IGVuZE9wZXJhdGlvbihjbSkgfQp9Ci8vIFdyYXBzIGEgZnVuY3Rpb24gaW4gYW4gb3BlcmF0aW9uLiBSZXR1cm5zIHRoZSB3cmFwcGVkIGZ1bmN0aW9uLgpmdW5jdGlvbiBvcGVyYXRpb24oY20sIGYpIHsKICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICBpZiAoY20uY3VyT3ApIHsgcmV0dXJuIGYuYXBwbHkoY20sIGFyZ3VtZW50cykgfQogICAgc3RhcnRPcGVyYXRpb24oY20pCiAgICB0cnkgeyByZXR1cm4gZi5hcHBseShjbSwgYXJndW1lbnRzKSB9CiAgICBmaW5hbGx5IHsgZW5kT3BlcmF0aW9uKGNtKSB9CiAgfQp9Ci8vIFVzZWQgdG8gYWRkIG1ldGhvZHMgdG8gZWRpdG9yIGFuZCBkb2MgaW5zdGFuY2VzLCB3cmFwcGluZyB0aGVtIGluCi8vIG9wZXJhdGlvbnMuCmZ1bmN0aW9uIG1ldGhvZE9wKGYpIHsKICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICBpZiAodGhpcy5jdXJPcCkgeyByZXR1cm4gZi5hcHBseSh0aGlzLCBhcmd1bWVudHMpIH0KICAgIHN0YXJ0T3BlcmF0aW9uKHRoaXMpCiAgICB0cnkgeyByZXR1cm4gZi5hcHBseSh0aGlzLCBhcmd1bWVudHMpIH0KICAgIGZpbmFsbHkgeyBlbmRPcGVyYXRpb24odGhpcykgfQogIH0KfQpmdW5jdGlvbiBkb2NNZXRob2RPcChmKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgdmFyIGNtID0gdGhpcy5jbQogICAgaWYgKCFjbSB8fCBjbS5jdXJPcCkgeyByZXR1cm4gZi5hcHBseSh0aGlzLCBhcmd1bWVudHMpIH0KICAgIHN0YXJ0T3BlcmF0aW9uKGNtKQogICAgdHJ5IHsgcmV0dXJuIGYuYXBwbHkodGhpcywgYXJndW1lbnRzKSB9CiAgICBmaW5hbGx5IHsgZW5kT3BlcmF0aW9uKGNtKSB9CiAgfQp9CgovLyBVcGRhdGVzIHRoZSBkaXNwbGF5LnZpZXcgZGF0YSBzdHJ1Y3R1cmUgZm9yIGEgZ2l2ZW4gY2hhbmdlIHRvIHRoZQovLyBkb2N1bWVudC4gRnJvbSBhbmQgdG8gYXJlIGluIHByZS1jaGFuZ2UgY29vcmRpbmF0ZXMuIExlbmRpZmYgaXMKLy8gdGhlIGFtb3VudCBvZiBsaW5lcyBhZGRlZCBvciBzdWJ0cmFjdGVkIGJ5IHRoZSBjaGFuZ2UuIFRoaXMgaXMKLy8gdXNlZCBmb3IgY2hhbmdlcyB0aGF0IHNwYW4gbXVsdGlwbGUgbGluZXMsIG9yIGNoYW5nZSB0aGUgd2F5Ci8vIGxpbmVzIGFyZSBkaXZpZGVkIGludG8gdmlzdWFsIGxpbmVzLiByZWdMaW5lQ2hhbmdlIChiZWxvdykKLy8gcmVnaXN0ZXJzIHNpbmdsZS1saW5lIGNoYW5nZXMuCmZ1bmN0aW9uIHJlZ0NoYW5nZShjbSwgZnJvbSwgdG8sIGxlbmRpZmYpIHsKICBpZiAoZnJvbSA9PSBudWxsKSB7IGZyb20gPSBjbS5kb2MuZmlyc3QgfQogIGlmICh0byA9PSBudWxsKSB7IHRvID0gY20uZG9jLmZpcnN0ICsgY20uZG9jLnNpemUgfQogIGlmICghbGVuZGlmZikgeyBsZW5kaWZmID0gMCB9CgogIHZhciBkaXNwbGF5ID0gY20uZGlzcGxheQogIGlmIChsZW5kaWZmICYmIHRvIDwgZGlzcGxheS52aWV3VG8gJiYKICAgICAgKGRpc3BsYXkudXBkYXRlTGluZU51bWJlcnMgPT0gbnVsbCB8fCBkaXNwbGF5LnVwZGF0ZUxpbmVOdW1iZXJzID4gZnJvbSkpCiAgICB7IGRpc3BsYXkudXBkYXRlTGluZU51bWJlcnMgPSBmcm9tIH0KCiAgY20uY3VyT3Audmlld0NoYW5nZWQgPSB0cnVlCgogIGlmIChmcm9tID49IGRpc3BsYXkudmlld1RvKSB7IC8vIENoYW5nZSBhZnRlcgogICAgaWYgKHNhd0NvbGxhcHNlZFNwYW5zICYmIHZpc3VhbExpbmVObyhjbS5kb2MsIGZyb20pIDwgZGlzcGxheS52aWV3VG8pCiAgICAgIHsgcmVzZXRWaWV3KGNtKSB9CiAgfSBlbHNlIGlmICh0byA8PSBkaXNwbGF5LnZpZXdGcm9tKSB7IC8vIENoYW5nZSBiZWZvcmUKICAgIGlmIChzYXdDb2xsYXBzZWRTcGFucyAmJiB2aXN1YWxMaW5lRW5kTm8oY20uZG9jLCB0byArIGxlbmRpZmYpID4gZGlzcGxheS52aWV3RnJvbSkgewogICAgICByZXNldFZpZXcoY20pCiAgICB9IGVsc2UgewogICAgICBkaXNwbGF5LnZpZXdGcm9tICs9IGxlbmRpZmYKICAgICAgZGlzcGxheS52aWV3VG8gKz0gbGVuZGlmZgogICAgfQogIH0gZWxzZSBpZiAoZnJvbSA8PSBkaXNwbGF5LnZpZXdGcm9tICYmIHRvID49IGRpc3BsYXkudmlld1RvKSB7IC8vIEZ1bGwgb3ZlcmxhcAogICAgcmVzZXRWaWV3KGNtKQogIH0gZWxzZSBpZiAoZnJvbSA8PSBkaXNwbGF5LnZpZXdGcm9tKSB7IC8vIFRvcCBvdmVybGFwCiAgICB2YXIgY3V0ID0gdmlld0N1dHRpbmdQb2ludChjbSwgdG8sIHRvICsgbGVuZGlmZiwgMSkKICAgIGlmIChjdXQpIHsKICAgICAgZGlzcGxheS52aWV3ID0gZGlzcGxheS52aWV3LnNsaWNlKGN1dC5pbmRleCkKICAgICAgZGlzcGxheS52aWV3RnJvbSA9IGN1dC5saW5lTgogICAgICBkaXNwbGF5LnZpZXdUbyArPSBsZW5kaWZmCiAgICB9IGVsc2UgewogICAgICByZXNldFZpZXcoY20pCiAgICB9CiAgfSBlbHNlIGlmICh0byA+PSBkaXNwbGF5LnZpZXdUbykgeyAvLyBCb3R0b20gb3ZlcmxhcAogICAgdmFyIGN1dCQxID0gdmlld0N1dHRpbmdQb2ludChjbSwgZnJvbSwgZnJvbSwgLTEpCiAgICBpZiAoY3V0JDEpIHsKICAgICAgZGlzcGxheS52aWV3ID0gZGlzcGxheS52aWV3LnNsaWNlKDAsIGN1dCQxLmluZGV4KQogICAgICBkaXNwbGF5LnZpZXdUbyA9IGN1dCQxLmxpbmVOCiAgICB9IGVsc2UgewogICAgICByZXNldFZpZXcoY20pCiAgICB9CiAgfSBlbHNlIHsgLy8gR2FwIGluIHRoZSBtaWRkbGUKICAgIHZhciBjdXRUb3AgPSB2aWV3Q3V0dGluZ1BvaW50KGNtLCBmcm9tLCBmcm9tLCAtMSkKICAgIHZhciBjdXRCb3QgPSB2aWV3Q3V0dGluZ1BvaW50KGNtLCB0bywgdG8gKyBsZW5kaWZmLCAxKQogICAgaWYgKGN1dFRvcCAmJiBjdXRCb3QpIHsKICAgICAgZGlzcGxheS52aWV3ID0gZGlzcGxheS52aWV3LnNsaWNlKDAsIGN1dFRvcC5pbmRleCkKICAgICAgICAuY29uY2F0KGJ1aWxkVmlld0FycmF5KGNtLCBjdXRUb3AubGluZU4sIGN1dEJvdC5saW5lTikpCiAgICAgICAgLmNvbmNhdChkaXNwbGF5LnZpZXcuc2xpY2UoY3V0Qm90LmluZGV4KSkKICAgICAgZGlzcGxheS52aWV3VG8gKz0gbGVuZGlmZgogICAgfSBlbHNlIHsKICAgICAgcmVzZXRWaWV3KGNtKQogICAgfQogIH0KCiAgdmFyIGV4dCA9IGRpc3BsYXkuZXh0ZXJuYWxNZWFzdXJlZAogIGlmIChleHQpIHsKICAgIGlmICh0byA8IGV4dC5saW5lTikKICAgICAgeyBleHQubGluZU4gKz0gbGVuZGlmZiB9CiAgICBlbHNlIGlmIChmcm9tIDwgZXh0LmxpbmVOICsgZXh0LnNpemUpCiAgICAgIHsgZGlzcGxheS5leHRlcm5hbE1lYXN1cmVkID0gbnVsbCB9CiAgfQp9CgovLyBSZWdpc3RlciBhIGNoYW5nZSB0byBhIHNpbmdsZSBsaW5lLiBUeXBlIG11c3QgYmUgb25lIG9mICJ0ZXh0IiwKLy8gImd1dHRlciIsICJjbGFzcyIsICJ3aWRnZXQiCmZ1bmN0aW9uIHJlZ0xpbmVDaGFuZ2UoY20sIGxpbmUsIHR5cGUpIHsKICBjbS5jdXJPcC52aWV3Q2hhbmdlZCA9IHRydWUKICB2YXIgZGlzcGxheSA9IGNtLmRpc3BsYXksIGV4dCA9IGNtLmRpc3BsYXkuZXh0ZXJuYWxNZWFzdXJlZAogIGlmIChleHQgJiYgbGluZSA+PSBleHQubGluZU4gJiYgbGluZSA8IGV4dC5saW5lTiArIGV4dC5zaXplKQogICAgeyBkaXNwbGF5LmV4dGVybmFsTWVhc3VyZWQgPSBudWxsIH0KCiAgaWYgKGxpbmUgPCBkaXNwbGF5LnZpZXdGcm9tIHx8IGxpbmUgPj0gZGlzcGxheS52aWV3VG8pIHsgcmV0dXJuIH0KICB2YXIgbGluZVZpZXcgPSBkaXNwbGF5LnZpZXdbZmluZFZpZXdJbmRleChjbSwgbGluZSldCiAgaWYgKGxpbmVWaWV3Lm5vZGUgPT0gbnVsbCkgeyByZXR1cm4gfQogIHZhciBhcnIgPSBsaW5lVmlldy5jaGFuZ2VzIHx8IChsaW5lVmlldy5jaGFuZ2VzID0gW10pCiAgaWYgKGluZGV4T2YoYXJyLCB0eXBlKSA9PSAtMSkgeyBhcnIucHVzaCh0eXBlKSB9Cn0KCi8vIENsZWFyIHRoZSB2aWV3LgpmdW5jdGlvbiByZXNldFZpZXcoY20pIHsKICBjbS5kaXNwbGF5LnZpZXdGcm9tID0gY20uZGlzcGxheS52aWV3VG8gPSBjbS5kb2MuZmlyc3QKICBjbS5kaXNwbGF5LnZpZXcgPSBbXQogIGNtLmRpc3BsYXkudmlld09mZnNldCA9IDAKfQoKZnVuY3Rpb24gdmlld0N1dHRpbmdQb2ludChjbSwgb2xkTiwgbmV3TiwgZGlyKSB7CiAgdmFyIGluZGV4ID0gZmluZFZpZXdJbmRleChjbSwgb2xkTiksIGRpZmYsIHZpZXcgPSBjbS5kaXNwbGF5LnZpZXcKICBpZiAoIXNhd0NvbGxhcHNlZFNwYW5zIHx8IG5ld04gPT0gY20uZG9jLmZpcnN0ICsgY20uZG9jLnNpemUpCiAgICB7IHJldHVybiB7aW5kZXg6IGluZGV4LCBsaW5lTjogbmV3Tn0gfQogIHZhciBuID0gY20uZGlzcGxheS52aWV3RnJvbQogIGZvciAodmFyIGkgPSAwOyBpIDwgaW5kZXg7IGkrKykKICAgIHsgbiArPSB2aWV3W2ldLnNpemUgfQogIGlmIChuICE9IG9sZE4pIHsKICAgIGlmIChkaXIgPiAwKSB7CiAgICAgIGlmIChpbmRleCA9PSB2aWV3Lmxlbmd0aCAtIDEpIHsgcmV0dXJuIG51bGwgfQogICAgICBkaWZmID0gKG4gKyB2aWV3W2luZGV4XS5zaXplKSAtIG9sZE4KICAgICAgaW5kZXgrKwogICAgfSBlbHNlIHsKICAgICAgZGlmZiA9IG4gLSBvbGROCiAgICB9CiAgICBvbGROICs9IGRpZmY7IG5ld04gKz0gZGlmZgogIH0KICB3aGlsZSAodmlzdWFsTGluZU5vKGNtLmRvYywgbmV3TikgIT0gbmV3TikgewogICAgaWYgKGluZGV4ID09IChkaXIgPCAwID8gMCA6IHZpZXcubGVuZ3RoIC0gMSkpIHsgcmV0dXJuIG51bGwgfQogICAgbmV3TiArPSBkaXIgKiB2aWV3W2luZGV4IC0gKGRpciA8IDAgPyAxIDogMCldLnNpemUKICAgIGluZGV4ICs9IGRpcgogIH0KICByZXR1cm4ge2luZGV4OiBpbmRleCwgbGluZU46IG5ld059Cn0KCi8vIEZvcmNlIHRoZSB2aWV3IHRvIGNvdmVyIGEgZ2l2ZW4gcmFuZ2UsIGFkZGluZyBlbXB0eSB2aWV3IGVsZW1lbnQKLy8gb3IgY2xpcHBpbmcgb2ZmIGV4aXN0aW5nIG9uZXMgYXMgbmVlZGVkLgpmdW5jdGlvbiBhZGp1c3RWaWV3KGNtLCBmcm9tLCB0bykgewogIHZhciBkaXNwbGF5ID0gY20uZGlzcGxheSwgdmlldyA9IGRpc3BsYXkudmlldwogIGlmICh2aWV3Lmxlbmd0aCA9PSAwIHx8IGZyb20gPj0gZGlzcGxheS52aWV3VG8gfHwgdG8gPD0gZGlzcGxheS52aWV3RnJvbSkgewogICAgZGlzcGxheS52aWV3ID0gYnVpbGRWaWV3QXJyYXkoY20sIGZyb20sIHRvKQogICAgZGlzcGxheS52aWV3RnJvbSA9IGZyb20KICB9IGVsc2UgewogICAgaWYgKGRpc3BsYXkudmlld0Zyb20gPiBmcm9tKQogICAgICB7IGRpc3BsYXkudmlldyA9IGJ1aWxkVmlld0FycmF5KGNtLCBmcm9tLCBkaXNwbGF5LnZpZXdGcm9tKS5jb25jYXQoZGlzcGxheS52aWV3KSB9CiAgICBlbHNlIGlmIChkaXNwbGF5LnZpZXdGcm9tIDwgZnJvbSkKICAgICAgeyBkaXNwbGF5LnZpZXcgPSBkaXNwbGF5LnZpZXcuc2xpY2UoZmluZFZpZXdJbmRleChjbSwgZnJvbSkpIH0KICAgIGRpc3BsYXkudmlld0Zyb20gPSBmcm9tCiAgICBpZiAoZGlzcGxheS52aWV3VG8gPCB0bykKICAgICAgeyBkaXNwbGF5LnZpZXcgPSBkaXNwbGF5LnZpZXcuY29uY2F0KGJ1aWxkVmlld0FycmF5KGNtLCBkaXNwbGF5LnZpZXdUbywgdG8pKSB9CiAgICBlbHNlIGlmIChkaXNwbGF5LnZpZXdUbyA+IHRvKQogICAgICB7IGRpc3BsYXkudmlldyA9IGRpc3BsYXkudmlldy5zbGljZSgwLCBmaW5kVmlld0luZGV4KGNtLCB0bykpIH0KICB9CiAgZGlzcGxheS52aWV3VG8gPSB0bwp9CgovLyBDb3VudCB0aGUgbnVtYmVyIG9mIGxpbmVzIGluIHRoZSB2aWV3IHdob3NlIERPTSByZXByZXNlbnRhdGlvbiBpcwovLyBvdXQgb2YgZGF0ZSAob3Igbm9uZXhpc3RlbnQpLgpmdW5jdGlvbiBjb3VudERpcnR5VmlldyhjbSkgewogIHZhciB2aWV3ID0gY20uZGlzcGxheS52aWV3LCBkaXJ0eSA9IDAKICBmb3IgKHZhciBpID0gMDsgaSA8IHZpZXcubGVuZ3RoOyBpKyspIHsKICAgIHZhciBsaW5lVmlldyA9IHZpZXdbaV0KICAgIGlmICghbGluZVZpZXcuaGlkZGVuICYmICghbGluZVZpZXcubm9kZSB8fCBsaW5lVmlldy5jaGFuZ2VzKSkgeyArK2RpcnR5IH0KICB9CiAgcmV0dXJuIGRpcnR5Cn0KCi8vIEhJR0hMSUdIVCBXT1JLRVIKCmZ1bmN0aW9uIHN0YXJ0V29ya2VyKGNtLCB0aW1lKSB7CiAgaWYgKGNtLmRvYy5tb2RlLnN0YXJ0U3RhdGUgJiYgY20uZG9jLmZyb250aWVyIDwgY20uZGlzcGxheS52aWV3VG8pCiAgICB7IGNtLnN0YXRlLmhpZ2hsaWdodC5zZXQodGltZSwgYmluZChoaWdobGlnaHRXb3JrZXIsIGNtKSkgfQp9CgpmdW5jdGlvbiBoaWdobGlnaHRXb3JrZXIoY20pIHsKICB2YXIgZG9jID0gY20uZG9jCiAgaWYgKGRvYy5mcm9udGllciA8IGRvYy5maXJzdCkgeyBkb2MuZnJvbnRpZXIgPSBkb2MuZmlyc3QgfQogIGlmIChkb2MuZnJvbnRpZXIgPj0gY20uZGlzcGxheS52aWV3VG8pIHsgcmV0dXJuIH0KICB2YXIgZW5kID0gK25ldyBEYXRlICsgY20ub3B0aW9ucy53b3JrVGltZQogIHZhciBzdGF0ZSA9IGNvcHlTdGF0ZShkb2MubW9kZSwgZ2V0U3RhdGVCZWZvcmUoY20sIGRvYy5mcm9udGllcikpCiAgdmFyIGNoYW5nZWRMaW5lcyA9IFtdCgogIGRvYy5pdGVyKGRvYy5mcm9udGllciwgTWF0aC5taW4oZG9jLmZpcnN0ICsgZG9jLnNpemUsIGNtLmRpc3BsYXkudmlld1RvICsgNTAwKSwgZnVuY3Rpb24gKGxpbmUpIHsKICAgIGlmIChkb2MuZnJvbnRpZXIgPj0gY20uZGlzcGxheS52aWV3RnJvbSkgeyAvLyBWaXNpYmxlCiAgICAgIHZhciBvbGRTdHlsZXMgPSBsaW5lLnN0eWxlcywgdG9vTG9uZyA9IGxpbmUudGV4dC5sZW5ndGggPiBjbS5vcHRpb25zLm1heEhpZ2hsaWdodExlbmd0aAogICAgICB2YXIgaGlnaGxpZ2h0ZWQgPSBoaWdobGlnaHRMaW5lKGNtLCBsaW5lLCB0b29Mb25nID8gY29weVN0YXRlKGRvYy5tb2RlLCBzdGF0ZSkgOiBzdGF0ZSwgdHJ1ZSkKICAgICAgbGluZS5zdHlsZXMgPSBoaWdobGlnaHRlZC5zdHlsZXMKICAgICAgdmFyIG9sZENscyA9IGxpbmUuc3R5bGVDbGFzc2VzLCBuZXdDbHMgPSBoaWdobGlnaHRlZC5jbGFzc2VzCiAgICAgIGlmIChuZXdDbHMpIHsgbGluZS5zdHlsZUNsYXNzZXMgPSBuZXdDbHMgfQogICAgICBlbHNlIGlmIChvbGRDbHMpIHsgbGluZS5zdHlsZUNsYXNzZXMgPSBudWxsIH0KICAgICAgdmFyIGlzY2hhbmdlID0gIW9sZFN0eWxlcyB8fCBvbGRTdHlsZXMubGVuZ3RoICE9IGxpbmUuc3R5bGVzLmxlbmd0aCB8fAogICAgICAgIG9sZENscyAhPSBuZXdDbHMgJiYgKCFvbGRDbHMgfHwgIW5ld0NscyB8fCBvbGRDbHMuYmdDbGFzcyAhPSBuZXdDbHMuYmdDbGFzcyB8fCBvbGRDbHMudGV4dENsYXNzICE9IG5ld0Nscy50ZXh0Q2xhc3MpCiAgICAgIGZvciAodmFyIGkgPSAwOyAhaXNjaGFuZ2UgJiYgaSA8IG9sZFN0eWxlcy5sZW5ndGg7ICsraSkgeyBpc2NoYW5nZSA9IG9sZFN0eWxlc1tpXSAhPSBsaW5lLnN0eWxlc1tpXSB9CiAgICAgIGlmIChpc2NoYW5nZSkgeyBjaGFuZ2VkTGluZXMucHVzaChkb2MuZnJvbnRpZXIpIH0KICAgICAgbGluZS5zdGF0ZUFmdGVyID0gdG9vTG9uZyA/IHN0YXRlIDogY29weVN0YXRlKGRvYy5tb2RlLCBzdGF0ZSkKICAgIH0gZWxzZSB7CiAgICAgIGlmIChsaW5lLnRleHQubGVuZ3RoIDw9IGNtLm9wdGlvbnMubWF4SGlnaGxpZ2h0TGVuZ3RoKQogICAgICAgIHsgcHJvY2Vzc0xpbmUoY20sIGxpbmUudGV4dCwgc3RhdGUpIH0KICAgICAgbGluZS5zdGF0ZUFmdGVyID0gZG9jLmZyb250aWVyICUgNSA9PSAwID8gY29weVN0YXRlKGRvYy5tb2RlLCBzdGF0ZSkgOiBudWxsCiAgICB9CiAgICArK2RvYy5mcm9udGllcgogICAgaWYgKCtuZXcgRGF0ZSA+IGVuZCkgewogICAgICBzdGFydFdvcmtlcihjbSwgY20ub3B0aW9ucy53b3JrRGVsYXkpCiAgICAgIHJldHVybiB0cnVlCiAgICB9CiAgfSkKICBpZiAoY2hhbmdlZExpbmVzLmxlbmd0aCkgeyBydW5Jbk9wKGNtLCBmdW5jdGlvbiAoKSB7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoYW5nZWRMaW5lcy5sZW5ndGg7IGkrKykKICAgICAgeyByZWdMaW5lQ2hhbmdlKGNtLCBjaGFuZ2VkTGluZXNbaV0sICJ0ZXh0IikgfQogIH0pIH0KfQoKLy8gRElTUExBWSBEUkFXSU5HCgpmdW5jdGlvbiBEaXNwbGF5VXBkYXRlKGNtLCB2aWV3cG9ydCwgZm9yY2UpIHsKICB2YXIgZGlzcGxheSA9IGNtLmRpc3BsYXkKCiAgdGhpcy52aWV3cG9ydCA9IHZpZXdwb3J0CiAgLy8gU3RvcmUgc29tZSB2YWx1ZXMgdGhhdCB3ZSdsbCBuZWVkIGxhdGVyIChidXQgZG9uJ3Qgd2FudCB0byBmb3JjZSBhIHJlbGF5b3V0IGZvcikKICB0aGlzLnZpc2libGUgPSB2aXNpYmxlTGluZXMoZGlzcGxheSwgY20uZG9jLCB2aWV3cG9ydCkKICB0aGlzLmVkaXRvcklzSGlkZGVuID0gIWRpc3BsYXkud3JhcHBlci5vZmZzZXRXaWR0aAogIHRoaXMud3JhcHBlckhlaWdodCA9IGRpc3BsYXkud3JhcHBlci5jbGllbnRIZWlnaHQKICB0aGlzLndyYXBwZXJXaWR0aCA9IGRpc3BsYXkud3JhcHBlci5jbGllbnRXaWR0aAogIHRoaXMub2xkRGlzcGxheVdpZHRoID0gZGlzcGxheVdpZHRoKGNtKQogIHRoaXMuZm9yY2UgPSBmb3JjZQogIHRoaXMuZGltcyA9IGdldERpbWVuc2lvbnMoY20pCiAgdGhpcy5ldmVudHMgPSBbXQp9CgpEaXNwbGF5VXBkYXRlLnByb3RvdHlwZS5zaWduYWwgPSBmdW5jdGlvbihlbWl0dGVyLCB0eXBlKSB7CiAgaWYgKGhhc0hhbmRsZXIoZW1pdHRlciwgdHlwZSkpCiAgICB7IHRoaXMuZXZlbnRzLnB1c2goYXJndW1lbnRzKSB9Cn0KRGlzcGxheVVwZGF0ZS5wcm90b3R5cGUuZmluaXNoID0gZnVuY3Rpb24oKSB7CiAgdmFyIHRoaXMkMSA9IHRoaXM7CgogIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5ldmVudHMubGVuZ3RoOyBpKyspCiAgICB7IHNpZ25hbC5hcHBseShudWxsLCB0aGlzJDEuZXZlbnRzW2ldKSB9Cn0KCmZ1bmN0aW9uIG1heWJlQ2xpcFNjcm9sbGJhcnMoY20pIHsKICB2YXIgZGlzcGxheSA9IGNtLmRpc3BsYXkKICBpZiAoIWRpc3BsYXkuc2Nyb2xsYmFyc0NsaXBwZWQgJiYgZGlzcGxheS5zY3JvbGxlci5vZmZzZXRXaWR0aCkgewogICAgZGlzcGxheS5uYXRpdmVCYXJXaWR0aCA9IGRpc3BsYXkuc2Nyb2xsZXIub2Zmc2V0V2lkdGggLSBkaXNwbGF5LnNjcm9sbGVyLmNsaWVudFdpZHRoCiAgICBkaXNwbGF5LmhlaWdodEZvcmNlci5zdHlsZS5oZWlnaHQgPSBzY3JvbGxHYXAoY20pICsgInB4IgogICAgZGlzcGxheS5zaXplci5zdHlsZS5tYXJnaW5Cb3R0b20gPSAtZGlzcGxheS5uYXRpdmVCYXJXaWR0aCArICJweCIKICAgIGRpc3BsYXkuc2l6ZXIuc3R5bGUuYm9yZGVyUmlnaHRXaWR0aCA9IHNjcm9sbEdhcChjbSkgKyAicHgiCiAgICBkaXNwbGF5LnNjcm9sbGJhcnNDbGlwcGVkID0gdHJ1ZQogIH0KfQoKLy8gRG9lcyB0aGUgYWN0dWFsIHVwZGF0aW5nIG9mIHRoZSBsaW5lIGRpc3BsYXkuIEJhaWxzIG91dAovLyAocmV0dXJuaW5nIGZhbHNlKSB3aGVuIHRoZXJlIGlzIG5vdGhpbmcgdG8gYmUgZG9uZSBhbmQgZm9yY2VkIGlzCi8vIGZhbHNlLgpmdW5jdGlvbiB1cGRhdGVEaXNwbGF5SWZOZWVkZWQoY20sIHVwZGF0ZSkgewogIHZhciBkaXNwbGF5ID0gY20uZGlzcGxheSwgZG9jID0gY20uZG9jCgogIGlmICh1cGRhdGUuZWRpdG9ySXNIaWRkZW4pIHsKICAgIHJlc2V0VmlldyhjbSkKICAgIHJldHVybiBmYWxzZQogIH0KCiAgLy8gQmFpbCBvdXQgaWYgdGhlIHZpc2libGUgYXJlYSBpcyBhbHJlYWR5IHJlbmRlcmVkIGFuZCBub3RoaW5nIGNoYW5nZWQuCiAgaWYgKCF1cGRhdGUuZm9yY2UgJiYKICAgICAgdXBkYXRlLnZpc2libGUuZnJvbSA+PSBkaXNwbGF5LnZpZXdGcm9tICYmIHVwZGF0ZS52aXNpYmxlLnRvIDw9IGRpc3BsYXkudmlld1RvICYmCiAgICAgIChkaXNwbGF5LnVwZGF0ZUxpbmVOdW1iZXJzID09IG51bGwgfHwgZGlzcGxheS51cGRhdGVMaW5lTnVtYmVycyA+PSBkaXNwbGF5LnZpZXdUbykgJiYKICAgICAgZGlzcGxheS5yZW5kZXJlZFZpZXcgPT0gZGlzcGxheS52aWV3ICYmIGNvdW50RGlydHlWaWV3KGNtKSA9PSAwKQogICAgeyByZXR1cm4gZmFsc2UgfQoKICBpZiAobWF5YmVVcGRhdGVMaW5lTnVtYmVyV2lkdGgoY20pKSB7CiAgICByZXNldFZpZXcoY20pCiAgICB1cGRhdGUuZGltcyA9IGdldERpbWVuc2lvbnMoY20pCiAgfQoKICAvLyBDb21wdXRlIGEgc3VpdGFibGUgbmV3IHZpZXdwb3J0IChmcm9tICYgdG8pCiAgdmFyIGVuZCA9IGRvYy5maXJzdCArIGRvYy5zaXplCiAgdmFyIGZyb20gPSBNYXRoLm1heCh1cGRhdGUudmlzaWJsZS5mcm9tIC0gY20ub3B0aW9ucy52aWV3cG9ydE1hcmdpbiwgZG9jLmZpcnN0KQogIHZhciB0byA9IE1hdGgubWluKGVuZCwgdXBkYXRlLnZpc2libGUudG8gKyBjbS5vcHRpb25zLnZpZXdwb3J0TWFyZ2luKQogIGlmIChkaXNwbGF5LnZpZXdGcm9tIDwgZnJvbSAmJiBmcm9tIC0gZGlzcGxheS52aWV3RnJvbSA8IDIwKSB7IGZyb20gPSBNYXRoLm1heChkb2MuZmlyc3QsIGRpc3BsYXkudmlld0Zyb20pIH0KICBpZiAoZGlzcGxheS52aWV3VG8gPiB0byAmJiBkaXNwbGF5LnZpZXdUbyAtIHRvIDwgMjApIHsgdG8gPSBNYXRoLm1pbihlbmQsIGRpc3BsYXkudmlld1RvKSB9CiAgaWYgKHNhd0NvbGxhcHNlZFNwYW5zKSB7CiAgICBmcm9tID0gdmlzdWFsTGluZU5vKGNtLmRvYywgZnJvbSkKICAgIHRvID0gdmlzdWFsTGluZUVuZE5vKGNtLmRvYywgdG8pCiAgfQoKICB2YXIgZGlmZmVyZW50ID0gZnJvbSAhPSBkaXNwbGF5LnZpZXdGcm9tIHx8IHRvICE9IGRpc3BsYXkudmlld1RvIHx8CiAgICBkaXNwbGF5Lmxhc3RXcmFwSGVpZ2h0ICE9IHVwZGF0ZS53cmFwcGVySGVpZ2h0IHx8IGRpc3BsYXkubGFzdFdyYXBXaWR0aCAhPSB1cGRhdGUud3JhcHBlcldpZHRoCiAgYWRqdXN0VmlldyhjbSwgZnJvbSwgdG8pCgogIGRpc3BsYXkudmlld09mZnNldCA9IGhlaWdodEF0TGluZShnZXRMaW5lKGNtLmRvYywgZGlzcGxheS52aWV3RnJvbSkpCiAgLy8gUG9zaXRpb24gdGhlIG1vdmVyIGRpdiB0byBhbGlnbiB3aXRoIHRoZSBjdXJyZW50IHNjcm9sbCBwb3NpdGlvbgogIGNtLmRpc3BsYXkubW92ZXIuc3R5bGUudG9wID0gZGlzcGxheS52aWV3T2Zmc2V0ICsgInB4IgoKICB2YXIgdG9VcGRhdGUgPSBjb3VudERpcnR5VmlldyhjbSkKICBpZiAoIWRpZmZlcmVudCAmJiB0b1VwZGF0ZSA9PSAwICYmICF1cGRhdGUuZm9yY2UgJiYgZGlzcGxheS5yZW5kZXJlZFZpZXcgPT0gZGlzcGxheS52aWV3ICYmCiAgICAgIChkaXNwbGF5LnVwZGF0ZUxpbmVOdW1iZXJzID09IG51bGwgfHwgZGlzcGxheS51cGRhdGVMaW5lTnVtYmVycyA+PSBkaXNwbGF5LnZpZXdUbykpCiAgICB7IHJldHVybiBmYWxzZSB9CgogIC8vIEZvciBiaWcgY2hhbmdlcywgd2UgaGlkZSB0aGUgZW5jbG9zaW5nIGVsZW1lbnQgZHVyaW5nIHRoZQogIC8vIHVwZGF0ZSwgc2luY2UgdGhhdCBzcGVlZHMgdXAgdGhlIG9wZXJhdGlvbnMgb24gbW9zdCBicm93c2Vycy4KICB2YXIgZm9jdXNlZCA9IGFjdGl2ZUVsdCgpCiAgaWYgKHRvVXBkYXRlID4gNCkgeyBkaXNwbGF5LmxpbmVEaXYuc3R5bGUuZGlzcGxheSA9ICJub25lIiB9CiAgcGF0Y2hEaXNwbGF5KGNtLCBkaXNwbGF5LnVwZGF0ZUxpbmVOdW1iZXJzLCB1cGRhdGUuZGltcykKICBpZiAodG9VcGRhdGUgPiA0KSB7IGRpc3BsYXkubGluZURpdi5zdHlsZS5kaXNwbGF5ID0gIiIgfQogIGRpc3BsYXkucmVuZGVyZWRWaWV3ID0gZGlzcGxheS52aWV3CiAgLy8gVGhlcmUgbWlnaHQgaGF2ZSBiZWVuIGEgd2lkZ2V0IHdpdGggYSBmb2N1c2VkIGVsZW1lbnQgdGhhdCBnb3QKICAvLyBoaWRkZW4gb3IgdXBkYXRlZCwgaWYgc28gcmUtZm9jdXMgaXQuCiAgaWYgKGZvY3VzZWQgJiYgYWN0aXZlRWx0KCkgIT0gZm9jdXNlZCAmJiBmb2N1c2VkLm9mZnNldEhlaWdodCkgeyBmb2N1c2VkLmZvY3VzKCkgfQoKICAvLyBQcmV2ZW50IHNlbGVjdGlvbiBhbmQgY3Vyc29ycyBmcm9tIGludGVyZmVyaW5nIHdpdGggdGhlIHNjcm9sbAogIC8vIHdpZHRoIGFuZCBoZWlnaHQuCiAgcmVtb3ZlQ2hpbGRyZW4oZGlzcGxheS5jdXJzb3JEaXYpCiAgcmVtb3ZlQ2hpbGRyZW4oZGlzcGxheS5zZWxlY3Rpb25EaXYpCiAgZGlzcGxheS5ndXR0ZXJzLnN0eWxlLmhlaWdodCA9IGRpc3BsYXkuc2l6ZXIuc3R5bGUubWluSGVpZ2h0ID0gMAoKICBpZiAoZGlmZmVyZW50KSB7CiAgICBkaXNwbGF5Lmxhc3RXcmFwSGVpZ2h0ID0gdXBkYXRlLndyYXBwZXJIZWlnaHQKICAgIGRpc3BsYXkubGFzdFdyYXBXaWR0aCA9IHVwZGF0ZS53cmFwcGVyV2lkdGgKICAgIHN0YXJ0V29ya2VyKGNtLCA0MDApCiAgfQoKICBkaXNwbGF5LnVwZGF0ZUxpbmVOdW1iZXJzID0gbnVsbAoKICByZXR1cm4gdHJ1ZQp9CgpmdW5jdGlvbiBwb3N0VXBkYXRlRGlzcGxheShjbSwgdXBkYXRlKSB7CiAgdmFyIHZpZXdwb3J0ID0gdXBkYXRlLnZpZXdwb3J0CgogIGZvciAodmFyIGZpcnN0ID0gdHJ1ZTs7IGZpcnN0ID0gZmFsc2UpIHsKICAgIGlmICghZmlyc3QgfHwgIWNtLm9wdGlvbnMubGluZVdyYXBwaW5nIHx8IHVwZGF0ZS5vbGREaXNwbGF5V2lkdGggPT0gZGlzcGxheVdpZHRoKGNtKSkgewogICAgICAvLyBDbGlwIGZvcmNlZCB2aWV3cG9ydCB0byBhY3R1YWwgc2Nyb2xsYWJsZSBhcmVhLgogICAgICBpZiAodmlld3BvcnQgJiYgdmlld3BvcnQudG9wICE9IG51bGwpCiAgICAgICAgeyB2aWV3cG9ydCA9IHt0b3A6IE1hdGgubWluKGNtLmRvYy5oZWlnaHQgKyBwYWRkaW5nVmVydChjbS5kaXNwbGF5KSAtIGRpc3BsYXlIZWlnaHQoY20pLCB2aWV3cG9ydC50b3ApfSB9CiAgICAgIC8vIFVwZGF0ZWQgbGluZSBoZWlnaHRzIG1pZ2h0IHJlc3VsdCBpbiB0aGUgZHJhd24gYXJlYSBub3QKICAgICAgLy8gYWN0dWFsbHkgY292ZXJpbmcgdGhlIHZpZXdwb3J0LiBLZWVwIGxvb3BpbmcgdW50aWwgaXQgZG9lcy4KICAgICAgdXBkYXRlLnZpc2libGUgPSB2aXNpYmxlTGluZXMoY20uZGlzcGxheSwgY20uZG9jLCB2aWV3cG9ydCkKICAgICAgaWYgKHVwZGF0ZS52aXNpYmxlLmZyb20gPj0gY20uZGlzcGxheS52aWV3RnJvbSAmJiB1cGRhdGUudmlzaWJsZS50byA8PSBjbS5kaXNwbGF5LnZpZXdUbykKICAgICAgICB7IGJyZWFrIH0KICAgIH0KICAgIGlmICghdXBkYXRlRGlzcGxheUlmTmVlZGVkKGNtLCB1cGRhdGUpKSB7IGJyZWFrIH0KICAgIHVwZGF0ZUhlaWdodHNJblZpZXdwb3J0KGNtKQogICAgdmFyIGJhck1lYXN1cmUgPSBtZWFzdXJlRm9yU2Nyb2xsYmFycyhjbSkKICAgIHVwZGF0ZVNlbGVjdGlvbihjbSkKICAgIHVwZGF0ZVNjcm9sbGJhcnMoY20sIGJhck1lYXN1cmUpCiAgICBzZXREb2N1bWVudEhlaWdodChjbSwgYmFyTWVhc3VyZSkKICB9CgogIHVwZGF0ZS5zaWduYWwoY20sICJ1cGRhdGUiLCBjbSkKICBpZiAoY20uZGlzcGxheS52aWV3RnJvbSAhPSBjbS5kaXNwbGF5LnJlcG9ydGVkVmlld0Zyb20gfHwgY20uZGlzcGxheS52aWV3VG8gIT0gY20uZGlzcGxheS5yZXBvcnRlZFZpZXdUbykgewogICAgdXBkYXRlLnNpZ25hbChjbSwgInZpZXdwb3J0Q2hhbmdlIiwgY20sIGNtLmRpc3BsYXkudmlld0Zyb20sIGNtLmRpc3BsYXkudmlld1RvKQogICAgY20uZGlzcGxheS5yZXBvcnRlZFZpZXdGcm9tID0gY20uZGlzcGxheS52aWV3RnJvbTsgY20uZGlzcGxheS5yZXBvcnRlZFZpZXdUbyA9IGNtLmRpc3BsYXkudmlld1RvCiAgfQp9CgpmdW5jdGlvbiB1cGRhdGVEaXNwbGF5U2ltcGxlKGNtLCB2aWV3cG9ydCkgewogIHZhciB1cGRhdGUgPSBuZXcgRGlzcGxheVVwZGF0ZShjbSwgdmlld3BvcnQpCiAgaWYgKHVwZGF0ZURpc3BsYXlJZk5lZWRlZChjbSwgdXBkYXRlKSkgewogICAgdXBkYXRlSGVpZ2h0c0luVmlld3BvcnQoY20pCiAgICBwb3N0VXBkYXRlRGlzcGxheShjbSwgdXBkYXRlKQogICAgdmFyIGJhck1lYXN1cmUgPSBtZWFzdXJlRm9yU2Nyb2xsYmFycyhjbSkKICAgIHVwZGF0ZVNlbGVjdGlvbihjbSkKICAgIHVwZGF0ZVNjcm9sbGJhcnMoY20sIGJhck1lYXN1cmUpCiAgICBzZXREb2N1bWVudEhlaWdodChjbSwgYmFyTWVhc3VyZSkKICAgIHVwZGF0ZS5maW5pc2goKQogIH0KfQoKLy8gU3luYyB0aGUgYWN0dWFsIGRpc3BsYXkgRE9NIHN0cnVjdHVyZSB3aXRoIGRpc3BsYXkudmlldywgcmVtb3ZpbmcKLy8gbm9kZXMgZm9yIGxpbmVzIHRoYXQgYXJlIG5vIGxvbmdlciBpbiB2aWV3LCBhbmQgY3JlYXRpbmcgdGhlIG9uZXMKLy8gdGhhdCBhcmUgbm90IHRoZXJlIHlldCwgYW5kIHVwZGF0aW5nIHRoZSBvbmVzIHRoYXQgYXJlIG91dCBvZgovLyBkYXRlLgpmdW5jdGlvbiBwYXRjaERpc3BsYXkoY20sIHVwZGF0ZU51bWJlcnNGcm9tLCBkaW1zKSB7CiAgdmFyIGRpc3BsYXkgPSBjbS5kaXNwbGF5LCBsaW5lTnVtYmVycyA9IGNtLm9wdGlvbnMubGluZU51bWJlcnMKICB2YXIgY29udGFpbmVyID0gZGlzcGxheS5saW5lRGl2LCBjdXIgPSBjb250YWluZXIuZmlyc3RDaGlsZAoKICBmdW5jdGlvbiBybShub2RlKSB7CiAgICB2YXIgbmV4dCA9IG5vZGUubmV4dFNpYmxpbmcKICAgIC8vIFdvcmtzIGFyb3VuZCBhIHRocm93LXNjcm9sbCBidWcgaW4gT1MgWCBXZWJraXQKICAgIGlmICh3ZWJraXQgJiYgbWFjICYmIGNtLmRpc3BsYXkuY3VycmVudFdoZWVsVGFyZ2V0ID09IG5vZGUpCiAgICAgIHsgbm9kZS5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiIH0KICAgIGVsc2UKICAgICAgeyBub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobm9kZSkgfQogICAgcmV0dXJuIG5leHQKICB9CgogIHZhciB2aWV3ID0gZGlzcGxheS52aWV3LCBsaW5lTiA9IGRpc3BsYXkudmlld0Zyb20KICAvLyBMb29wIG92ZXIgdGhlIGVsZW1lbnRzIGluIHRoZSB2aWV3LCBzeW5jaW5nIGN1ciAodGhlIERPTSBub2RlcwogIC8vIGluIGRpc3BsYXkubGluZURpdikgd2l0aCB0aGUgdmlldyBhcyB3ZSBnby4KICBmb3IgKHZhciBpID0gMDsgaSA8IHZpZXcubGVuZ3RoOyBpKyspIHsKICAgIHZhciBsaW5lVmlldyA9IHZpZXdbaV0KICAgIGlmIChsaW5lVmlldy5oaWRkZW4pIHsKICAgIH0gZWxzZSBpZiAoIWxpbmVWaWV3Lm5vZGUgfHwgbGluZVZpZXcubm9kZS5wYXJlbnROb2RlICE9IGNvbnRhaW5lcikgeyAvLyBOb3QgZHJhd24geWV0CiAgICAgIHZhciBub2RlID0gYnVpbGRMaW5lRWxlbWVudChjbSwgbGluZVZpZXcsIGxpbmVOLCBkaW1zKQogICAgICBjb250YWluZXIuaW5zZXJ0QmVmb3JlKG5vZGUsIGN1cikKICAgIH0gZWxzZSB7IC8vIEFscmVhZHkgZHJhd24KICAgICAgd2hpbGUgKGN1ciAhPSBsaW5lVmlldy5ub2RlKSB7IGN1ciA9IHJtKGN1cikgfQogICAgICB2YXIgdXBkYXRlTnVtYmVyID0gbGluZU51bWJlcnMgJiYgdXBkYXRlTnVtYmVyc0Zyb20gIT0gbnVsbCAmJgogICAgICAgIHVwZGF0ZU51bWJlcnNGcm9tIDw9IGxpbmVOICYmIGxpbmVWaWV3LmxpbmVOdW1iZXIKICAgICAgaWYgKGxpbmVWaWV3LmNoYW5nZXMpIHsKICAgICAgICBpZiAoaW5kZXhPZihsaW5lVmlldy5jaGFuZ2VzLCAiZ3V0dGVyIikgPiAtMSkgeyB1cGRhdGVOdW1iZXIgPSBmYWxzZSB9CiAgICAgICAgdXBkYXRlTGluZUZvckNoYW5nZXMoY20sIGxpbmVWaWV3LCBsaW5lTiwgZGltcykKICAgICAgfQogICAgICBpZiAodXBkYXRlTnVtYmVyKSB7CiAgICAgICAgcmVtb3ZlQ2hpbGRyZW4obGluZVZpZXcubGluZU51bWJlcikKICAgICAgICBsaW5lVmlldy5saW5lTnVtYmVyLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGxpbmVOdW1iZXJGb3IoY20ub3B0aW9ucywgbGluZU4pKSkKICAgICAgfQogICAgICBjdXIgPSBsaW5lVmlldy5ub2RlLm5leHRTaWJsaW5nCiAgICB9CiAgICBsaW5lTiArPSBsaW5lVmlldy5zaXplCiAgfQogIHdoaWxlIChjdXIpIHsgY3VyID0gcm0oY3VyKSB9Cn0KCmZ1bmN0aW9uIHVwZGF0ZUd1dHRlclNwYWNlKGNtKSB7CiAgdmFyIHdpZHRoID0gY20uZGlzcGxheS5ndXR0ZXJzLm9mZnNldFdpZHRoCiAgY20uZGlzcGxheS5zaXplci5zdHlsZS5tYXJnaW5MZWZ0ID0gd2lkdGggKyAicHgiCn0KCmZ1bmN0aW9uIHNldERvY3VtZW50SGVpZ2h0KGNtLCBtZWFzdXJlKSB7CiAgY20uZGlzcGxheS5zaXplci5zdHlsZS5taW5IZWlnaHQgPSBtZWFzdXJlLmRvY0hlaWdodCArICJweCIKICBjbS5kaXNwbGF5LmhlaWdodEZvcmNlci5zdHlsZS50b3AgPSBtZWFzdXJlLmRvY0hlaWdodCArICJweCIKICBjbS5kaXNwbGF5Lmd1dHRlcnMuc3R5bGUuaGVpZ2h0ID0gKG1lYXN1cmUuZG9jSGVpZ2h0ICsgY20uZGlzcGxheS5iYXJIZWlnaHQgKyBzY3JvbGxHYXAoY20pKSArICJweCIKfQoKLy8gUmVidWlsZCB0aGUgZ3V0dGVyIGVsZW1lbnRzLCBlbnN1cmUgdGhlIG1hcmdpbiB0byB0aGUgbGVmdCBvZiB0aGUKLy8gY29kZSBtYXRjaGVzIHRoZWlyIHdpZHRoLgpmdW5jdGlvbiB1cGRhdGVHdXR0ZXJzKGNtKSB7CiAgdmFyIGd1dHRlcnMgPSBjbS5kaXNwbGF5Lmd1dHRlcnMsIHNwZWNzID0gY20ub3B0aW9ucy5ndXR0ZXJzCiAgcmVtb3ZlQ2hpbGRyZW4oZ3V0dGVycykKICB2YXIgaSA9IDAKICBmb3IgKDsgaSA8IHNwZWNzLmxlbmd0aDsgKytpKSB7CiAgICB2YXIgZ3V0dGVyQ2xhc3MgPSBzcGVjc1tpXQogICAgdmFyIGdFbHQgPSBndXR0ZXJzLmFwcGVuZENoaWxkKGVsdCgiZGl2IiwgbnVsbCwgIkNvZGVNaXJyb3ItZ3V0dGVyICIgKyBndXR0ZXJDbGFzcykpCiAgICBpZiAoZ3V0dGVyQ2xhc3MgPT0gIkNvZGVNaXJyb3ItbGluZW51bWJlcnMiKSB7CiAgICAgIGNtLmRpc3BsYXkubGluZUd1dHRlciA9IGdFbHQKICAgICAgZ0VsdC5zdHlsZS53aWR0aCA9IChjbS5kaXNwbGF5LmxpbmVOdW1XaWR0aCB8fCAxKSArICJweCIKICAgIH0KICB9CiAgZ3V0dGVycy5zdHlsZS5kaXNwbGF5ID0gaSA/ICIiIDogIm5vbmUiCiAgdXBkYXRlR3V0dGVyU3BhY2UoY20pCn0KCi8vIE1ha2Ugc3VyZSB0aGUgZ3V0dGVycyBvcHRpb25zIGNvbnRhaW5zIHRoZSBlbGVtZW50Ci8vICJDb2RlTWlycm9yLWxpbmVudW1iZXJzIiB3aGVuIHRoZSBsaW5lTnVtYmVycyBvcHRpb24gaXMgdHJ1ZS4KZnVuY3Rpb24gc2V0R3V0dGVyc0ZvckxpbmVOdW1iZXJzKG9wdGlvbnMpIHsKICB2YXIgZm91bmQgPSBpbmRleE9mKG9wdGlvbnMuZ3V0dGVycywgIkNvZGVNaXJyb3ItbGluZW51bWJlcnMiKQogIGlmIChmb3VuZCA9PSAtMSAmJiBvcHRpb25zLmxpbmVOdW1iZXJzKSB7CiAgICBvcHRpb25zLmd1dHRlcnMgPSBvcHRpb25zLmd1dHRlcnMuY29uY2F0KFsiQ29kZU1pcnJvci1saW5lbnVtYmVycyJdKQogIH0gZWxzZSBpZiAoZm91bmQgPiAtMSAmJiAhb3B0aW9ucy5saW5lTnVtYmVycykgewogICAgb3B0aW9ucy5ndXR0ZXJzID0gb3B0aW9ucy5ndXR0ZXJzLnNsaWNlKDApCiAgICBvcHRpb25zLmd1dHRlcnMuc3BsaWNlKGZvdW5kLCAxKQogIH0KfQoKLy8gU2VsZWN0aW9uIG9iamVjdHMgYXJlIGltbXV0YWJsZS4gQSBuZXcgb25lIGlzIGNyZWF0ZWQgZXZlcnkgdGltZQovLyB0aGUgc2VsZWN0aW9uIGNoYW5nZXMuIEEgc2VsZWN0aW9uIGlzIG9uZSBvciBtb3JlIG5vbi1vdmVybGFwcGluZwovLyAoYW5kIG5vbi10b3VjaGluZykgcmFuZ2VzLCBzb3J0ZWQsIGFuZCBhbiBpbnRlZ2VyIHRoYXQgaW5kaWNhdGVzCi8vIHdoaWNoIG9uZSBpcyB0aGUgcHJpbWFyeSBzZWxlY3Rpb24gKHRoZSBvbmUgdGhhdCdzIHNjcm9sbGVkIGludG8KLy8gdmlldywgdGhhdCBnZXRDdXJzb3IgcmV0dXJucywgZXRjKS4KZnVuY3Rpb24gU2VsZWN0aW9uKHJhbmdlcywgcHJpbUluZGV4KSB7CiAgdGhpcy5yYW5nZXMgPSByYW5nZXMKICB0aGlzLnByaW1JbmRleCA9IHByaW1JbmRleAp9CgpTZWxlY3Rpb24ucHJvdG90eXBlID0gewogIHByaW1hcnk6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5yYW5nZXNbdGhpcy5wcmltSW5kZXhdIH0sCiAgZXF1YWxzOiBmdW5jdGlvbihvdGhlcikgewogICAgdmFyIHRoaXMkMSA9IHRoaXM7CgogICAgaWYgKG90aGVyID09IHRoaXMpIHsgcmV0dXJuIHRydWUgfQogICAgaWYgKG90aGVyLnByaW1JbmRleCAhPSB0aGlzLnByaW1JbmRleCB8fCBvdGhlci5yYW5nZXMubGVuZ3RoICE9IHRoaXMucmFuZ2VzLmxlbmd0aCkgeyByZXR1cm4gZmFsc2UgfQogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnJhbmdlcy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgaGVyZSA9IHRoaXMkMS5yYW5nZXNbaV0sIHRoZXJlID0gb3RoZXIucmFuZ2VzW2ldCiAgICAgIGlmIChjbXAoaGVyZS5hbmNob3IsIHRoZXJlLmFuY2hvcikgIT0gMCB8fCBjbXAoaGVyZS5oZWFkLCB0aGVyZS5oZWFkKSAhPSAwKSB7IHJldHVybiBmYWxzZSB9CiAgICB9CiAgICByZXR1cm4gdHJ1ZQogIH0sCiAgZGVlcENvcHk6IGZ1bmN0aW9uKCkgewogICAgdmFyIHRoaXMkMSA9IHRoaXM7CgogICAgdmFyIG91dCA9IFtdCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMucmFuZ2VzLmxlbmd0aDsgaSsrKQogICAgICB7IG91dFtpXSA9IG5ldyBSYW5nZShjb3B5UG9zKHRoaXMkMS5yYW5nZXNbaV0uYW5jaG9yKSwgY29weVBvcyh0aGlzJDEucmFuZ2VzW2ldLmhlYWQpKSB9CiAgICByZXR1cm4gbmV3IFNlbGVjdGlvbihvdXQsIHRoaXMucHJpbUluZGV4KQogIH0sCiAgc29tZXRoaW5nU2VsZWN0ZWQ6IGZ1bmN0aW9uKCkgewogICAgdmFyIHRoaXMkMSA9IHRoaXM7CgogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnJhbmdlcy5sZW5ndGg7IGkrKykKICAgICAgeyBpZiAoIXRoaXMkMS5yYW5nZXNbaV0uZW1wdHkoKSkgeyByZXR1cm4gdHJ1ZSB9IH0KICAgIHJldHVybiBmYWxzZQogIH0sCiAgY29udGFpbnM6IGZ1bmN0aW9uKHBvcywgZW5kKSB7CiAgICB2YXIgdGhpcyQxID0gdGhpczsKCiAgICBpZiAoIWVuZCkgeyBlbmQgPSBwb3MgfQogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnJhbmdlcy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgcmFuZ2UgPSB0aGlzJDEucmFuZ2VzW2ldCiAgICAgIGlmIChjbXAoZW5kLCByYW5nZS5mcm9tKCkpID49IDAgJiYgY21wKHBvcywgcmFuZ2UudG8oKSkgPD0gMCkKICAgICAgICB7IHJldHVybiBpIH0KICAgIH0KICAgIHJldHVybiAtMQogIH0KfQoKZnVuY3Rpb24gUmFuZ2UoYW5jaG9yLCBoZWFkKSB7CiAgdGhpcy5hbmNob3IgPSBhbmNob3I7IHRoaXMuaGVhZCA9IGhlYWQKfQoKUmFuZ2UucHJvdG90eXBlID0gewogIGZyb206IGZ1bmN0aW9uKCkgeyByZXR1cm4gbWluUG9zKHRoaXMuYW5jaG9yLCB0aGlzLmhlYWQpIH0sCiAgdG86IGZ1bmN0aW9uKCkgeyByZXR1cm4gbWF4UG9zKHRoaXMuYW5jaG9yLCB0aGlzLmhlYWQpIH0sCiAgZW1wdHk6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHRoaXMuaGVhZC5saW5lID09IHRoaXMuYW5jaG9yLmxpbmUgJiYgdGhpcy5oZWFkLmNoID09IHRoaXMuYW5jaG9yLmNoCiAgfQp9CgovLyBUYWtlIGFuIHVuc29ydGVkLCBwb3RlbnRpYWxseSBvdmVybGFwcGluZyBzZXQgb2YgcmFuZ2VzLCBhbmQKLy8gYnVpbGQgYSBzZWxlY3Rpb24gb3V0IG9mIGl0LiAnQ29uc3VtZXMnIHJhbmdlcyBhcnJheSAobW9kaWZ5aW5nCi8vIGl0KS4KZnVuY3Rpb24gbm9ybWFsaXplU2VsZWN0aW9uKHJhbmdlcywgcHJpbUluZGV4KSB7CiAgdmFyIHByaW0gPSByYW5nZXNbcHJpbUluZGV4XQogIHJhbmdlcy5zb3J0KGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBjbXAoYS5mcm9tKCksIGIuZnJvbSgpKTsgfSkKICBwcmltSW5kZXggPSBpbmRleE9mKHJhbmdlcywgcHJpbSkKICBmb3IgKHZhciBpID0gMTsgaSA8IHJhbmdlcy5sZW5ndGg7IGkrKykgewogICAgdmFyIGN1ciA9IHJhbmdlc1tpXSwgcHJldiA9IHJhbmdlc1tpIC0gMV0KICAgIGlmIChjbXAocHJldi50bygpLCBjdXIuZnJvbSgpKSA+PSAwKSB7CiAgICAgIHZhciBmcm9tID0gbWluUG9zKHByZXYuZnJvbSgpLCBjdXIuZnJvbSgpKSwgdG8gPSBtYXhQb3MocHJldi50bygpLCBjdXIudG8oKSkKICAgICAgdmFyIGludiA9IHByZXYuZW1wdHkoKSA/IGN1ci5mcm9tKCkgPT0gY3VyLmhlYWQgOiBwcmV2LmZyb20oKSA9PSBwcmV2LmhlYWQKICAgICAgaWYgKGkgPD0gcHJpbUluZGV4KSB7IC0tcHJpbUluZGV4IH0KICAgICAgcmFuZ2VzLnNwbGljZSgtLWksIDIsIG5ldyBSYW5nZShpbnYgPyB0byA6IGZyb20sIGludiA/IGZyb20gOiB0bykpCiAgICB9CiAgfQogIHJldHVybiBuZXcgU2VsZWN0aW9uKHJhbmdlcywgcHJpbUluZGV4KQp9CgpmdW5jdGlvbiBzaW1wbGVTZWxlY3Rpb24oYW5jaG9yLCBoZWFkKSB7CiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24oW25ldyBSYW5nZShhbmNob3IsIGhlYWQgfHwgYW5jaG9yKV0sIDApCn0KCi8vIENvbXB1dGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBlbmQgb2YgYSBjaGFuZ2UgKGl0cyAndG8nIHByb3BlcnR5Ci8vIHJlZmVycyB0byB0aGUgcHJlLWNoYW5nZSBlbmQpLgpmdW5jdGlvbiBjaGFuZ2VFbmQoY2hhbmdlKSB7CiAgaWYgKCFjaGFuZ2UudGV4dCkgeyByZXR1cm4gY2hhbmdlLnRvIH0KICByZXR1cm4gUG9zKGNoYW5nZS5mcm9tLmxpbmUgKyBjaGFuZ2UudGV4dC5sZW5ndGggLSAxLAogICAgICAgICAgICAgbHN0KGNoYW5nZS50ZXh0KS5sZW5ndGggKyAoY2hhbmdlLnRleHQubGVuZ3RoID09IDEgPyBjaGFuZ2UuZnJvbS5jaCA6IDApKQp9CgovLyBBZGp1c3QgYSBwb3NpdGlvbiB0byByZWZlciB0byB0aGUgcG9zdC1jaGFuZ2UgcG9zaXRpb24gb2YgdGhlCi8vIHNhbWUgdGV4dCwgb3IgdGhlIGVuZCBvZiB0aGUgY2hhbmdlIGlmIHRoZSBjaGFuZ2UgY292ZXJzIGl0LgpmdW5jdGlvbiBhZGp1c3RGb3JDaGFuZ2UocG9zLCBjaGFuZ2UpIHsKICBpZiAoY21wKHBvcywgY2hhbmdlLmZyb20pIDwgMCkgeyByZXR1cm4gcG9zIH0KICBpZiAoY21wKHBvcywgY2hhbmdlLnRvKSA8PSAwKSB7IHJldHVybiBjaGFuZ2VFbmQoY2hhbmdlKSB9CgogIHZhciBsaW5lID0gcG9zLmxpbmUgKyBjaGFuZ2UudGV4dC5sZW5ndGggLSAoY2hhbmdlLnRvLmxpbmUgLSBjaGFuZ2UuZnJvbS5saW5lKSAtIDEsIGNoID0gcG9zLmNoCiAgaWYgKHBvcy5saW5lID09IGNoYW5nZS50by5saW5lKSB7IGNoICs9IGNoYW5nZUVuZChjaGFuZ2UpLmNoIC0gY2hhbmdlLnRvLmNoIH0KICByZXR1cm4gUG9zKGxpbmUsIGNoKQp9CgpmdW5jdGlvbiBjb21wdXRlU2VsQWZ0ZXJDaGFuZ2UoZG9jLCBjaGFuZ2UpIHsKICB2YXIgb3V0ID0gW10KICBmb3IgKHZhciBpID0gMDsgaSA8IGRvYy5zZWwucmFuZ2VzLmxlbmd0aDsgaSsrKSB7CiAgICB2YXIgcmFuZ2UgPSBkb2Muc2VsLnJhbmdlc1tpXQogICAgb3V0LnB1c2gobmV3IFJhbmdlKGFkanVzdEZvckNoYW5nZShyYW5nZS5hbmNob3IsIGNoYW5nZSksCiAgICAgICAgICAgICAgICAgICAgICAgYWRqdXN0Rm9yQ2hhbmdlKHJhbmdlLmhlYWQsIGNoYW5nZSkpKQogIH0KICByZXR1cm4gbm9ybWFsaXplU2VsZWN0aW9uKG91dCwgZG9jLnNlbC5wcmltSW5kZXgpCn0KCmZ1bmN0aW9uIG9mZnNldFBvcyhwb3MsIG9sZCwgbncpIHsKICBpZiAocG9zLmxpbmUgPT0gb2xkLmxpbmUpCiAgICB7IHJldHVybiBQb3MobncubGluZSwgcG9zLmNoIC0gb2xkLmNoICsgbncuY2gpIH0KICBlbHNlCiAgICB7IHJldHVybiBQb3MobncubGluZSArIChwb3MubGluZSAtIG9sZC5saW5lKSwgcG9zLmNoKSB9Cn0KCi8vIFVzZWQgYnkgcmVwbGFjZVNlbGVjdGlvbnMgdG8gYWxsb3cgbW92aW5nIHRoZSBzZWxlY3Rpb24gdG8gdGhlCi8vIHN0YXJ0IG9yIGFyb3VuZCB0aGUgcmVwbGFjZWQgdGVzdC4gSGludCBtYXkgYmUgInN0YXJ0IiBvciAiYXJvdW5kIi4KZnVuY3Rpb24gY29tcHV0ZVJlcGxhY2VkU2VsKGRvYywgY2hhbmdlcywgaGludCkgewogIHZhciBvdXQgPSBbXQogIHZhciBvbGRQcmV2ID0gUG9zKGRvYy5maXJzdCwgMCksIG5ld1ByZXYgPSBvbGRQcmV2CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGFuZ2VzLmxlbmd0aDsgaSsrKSB7CiAgICB2YXIgY2hhbmdlID0gY2hhbmdlc1tpXQogICAgdmFyIGZyb20gPSBvZmZzZXRQb3MoY2hhbmdlLmZyb20sIG9sZFByZXYsIG5ld1ByZXYpCiAgICB2YXIgdG8gPSBvZmZzZXRQb3MoY2hhbmdlRW5kKGNoYW5nZSksIG9sZFByZXYsIG5ld1ByZXYpCiAgICBvbGRQcmV2ID0gY2hhbmdlLnRvCiAgICBuZXdQcmV2ID0gdG8KICAgIGlmIChoaW50ID09ICJhcm91bmQiKSB7CiAgICAgIHZhciByYW5nZSA9IGRvYy5zZWwucmFuZ2VzW2ldLCBpbnYgPSBjbXAocmFuZ2UuaGVhZCwgcmFuZ2UuYW5jaG9yKSA8IDAKICAgICAgb3V0W2ldID0gbmV3IFJhbmdlKGludiA/IHRvIDogZnJvbSwgaW52ID8gZnJvbSA6IHRvKQogICAgfSBlbHNlIHsKICAgICAgb3V0W2ldID0gbmV3IFJhbmdlKGZyb20sIGZyb20pCiAgICB9CiAgfQogIHJldHVybiBuZXcgU2VsZWN0aW9uKG91dCwgZG9jLnNlbC5wcmltSW5kZXgpCn0KCi8vIFVzZWQgdG8gZ2V0IHRoZSBlZGl0b3IgaW50byBhIGNvbnNpc3RlbnQgc3RhdGUgYWdhaW4gd2hlbiBvcHRpb25zIGNoYW5nZS4KCmZ1bmN0aW9uIGxvYWRNb2RlKGNtKSB7CiAgY20uZG9jLm1vZGUgPSBnZXRNb2RlKGNtLm9wdGlvbnMsIGNtLmRvYy5tb2RlT3B0aW9uKQogIHJlc2V0TW9kZVN0YXRlKGNtKQp9CgpmdW5jdGlvbiByZXNldE1vZGVTdGF0ZShjbSkgewogIGNtLmRvYy5pdGVyKGZ1bmN0aW9uIChsaW5lKSB7CiAgICBpZiAobGluZS5zdGF0ZUFmdGVyKSB7IGxpbmUuc3RhdGVBZnRlciA9IG51bGwgfQogICAgaWYgKGxpbmUuc3R5bGVzKSB7IGxpbmUuc3R5bGVzID0gbnVsbCB9CiAgfSkKICBjbS5kb2MuZnJvbnRpZXIgPSBjbS5kb2MuZmlyc3QKICBzdGFydFdvcmtlcihjbSwgMTAwKQogIGNtLnN0YXRlLm1vZGVHZW4rKwogIGlmIChjbS5jdXJPcCkgeyByZWdDaGFuZ2UoY20pIH0KfQoKLy8gRE9DVU1FTlQgREFUQSBTVFJVQ1RVUkUKCi8vIEJ5IGRlZmF1bHQsIHVwZGF0ZXMgdGhhdCBzdGFydCBhbmQgZW5kIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lCi8vIGFyZSB0cmVhdGVkIHNwZWNpYWxseSwgaW4gb3JkZXIgdG8gbWFrZSB0aGUgYXNzb2NpYXRpb24gb2YgbGluZQovLyB3aWRnZXRzIGFuZCBtYXJrZXIgZWxlbWVudHMgd2l0aCB0aGUgdGV4dCBiZWhhdmUgbW9yZSBpbnR1aXRpdmUuCmZ1bmN0aW9uIGlzV2hvbGVMaW5lVXBkYXRlKGRvYywgY2hhbmdlKSB7CiAgcmV0dXJuIGNoYW5nZS5mcm9tLmNoID09IDAgJiYgY2hhbmdlLnRvLmNoID09IDAgJiYgbHN0KGNoYW5nZS50ZXh0KSA9PSAiIiAmJgogICAgKCFkb2MuY20gfHwgZG9jLmNtLm9wdGlvbnMud2hvbGVMaW5lVXBkYXRlQmVmb3JlKQp9CgovLyBQZXJmb3JtIGEgY2hhbmdlIG9uIHRoZSBkb2N1bWVudCBkYXRhIHN0cnVjdHVyZS4KZnVuY3Rpb24gdXBkYXRlRG9jKGRvYywgY2hhbmdlLCBtYXJrZWRTcGFucywgZXN0aW1hdGVIZWlnaHQkJDEpIHsKICBmdW5jdGlvbiBzcGFuc0ZvcihuKSB7cmV0dXJuIG1hcmtlZFNwYW5zID8gbWFya2VkU3BhbnNbbl0gOiBudWxsfQogIGZ1bmN0aW9uIHVwZGF0ZShsaW5lLCB0ZXh0LCBzcGFucykgewogICAgdXBkYXRlTGluZShsaW5lLCB0ZXh0LCBzcGFucywgZXN0aW1hdGVIZWlnaHQkJDEpCiAgICBzaWduYWxMYXRlcihsaW5lLCAiY2hhbmdlIiwgbGluZSwgY2hhbmdlKQogIH0KICBmdW5jdGlvbiBsaW5lc0ZvcihzdGFydCwgZW5kKSB7CiAgICB2YXIgcmVzdWx0ID0gW10KICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKQogICAgICB7IHJlc3VsdC5wdXNoKG5ldyBMaW5lKHRleHRbaV0sIHNwYW5zRm9yKGkpLCBlc3RpbWF0ZUhlaWdodCQkMSkpIH0KICAgIHJldHVybiByZXN1bHQKICB9CgogIHZhciBmcm9tID0gY2hhbmdlLmZyb20sIHRvID0gY2hhbmdlLnRvLCB0ZXh0ID0gY2hhbmdlLnRleHQKICB2YXIgZmlyc3RMaW5lID0gZ2V0TGluZShkb2MsIGZyb20ubGluZSksIGxhc3RMaW5lID0gZ2V0TGluZShkb2MsIHRvLmxpbmUpCiAgdmFyIGxhc3RUZXh0ID0gbHN0KHRleHQpLCBsYXN0U3BhbnMgPSBzcGFuc0Zvcih0ZXh0Lmxlbmd0aCAtIDEpLCBubGluZXMgPSB0by5saW5lIC0gZnJvbS5saW5lCgogIC8vIEFkanVzdCB0aGUgbGluZSBzdHJ1Y3R1cmUKICBpZiAoY2hhbmdlLmZ1bGwpIHsKICAgIGRvYy5pbnNlcnQoMCwgbGluZXNGb3IoMCwgdGV4dC5sZW5ndGgpKQogICAgZG9jLnJlbW92ZSh0ZXh0Lmxlbmd0aCwgZG9jLnNpemUgLSB0ZXh0Lmxlbmd0aCkKICB9IGVsc2UgaWYgKGlzV2hvbGVMaW5lVXBkYXRlKGRvYywgY2hhbmdlKSkgewogICAgLy8gVGhpcyBpcyBhIHdob2xlLWxpbmUgcmVwbGFjZS4gVHJlYXRlZCBzcGVjaWFsbHkgdG8gbWFrZQogICAgLy8gc3VyZSBsaW5lIG9iamVjdHMgbW92ZSB0aGUgd2F5IHRoZXkgYXJlIHN1cHBvc2VkIHRvLgogICAgdmFyIGFkZGVkID0gbGluZXNGb3IoMCwgdGV4dC5sZW5ndGggLSAxKQogICAgdXBkYXRlKGxhc3RMaW5lLCBsYXN0TGluZS50ZXh0LCBsYXN0U3BhbnMpCiAgICBpZiAobmxpbmVzKSB7IGRvYy5yZW1vdmUoZnJvbS5saW5lLCBubGluZXMpIH0KICAgIGlmIChhZGRlZC5sZW5ndGgpIHsgZG9jLmluc2VydChmcm9tLmxpbmUsIGFkZGVkKSB9CiAgfSBlbHNlIGlmIChmaXJzdExpbmUgPT0gbGFzdExpbmUpIHsKICAgIGlmICh0ZXh0Lmxlbmd0aCA9PSAxKSB7CiAgICAgIHVwZGF0ZShmaXJzdExpbmUsIGZpcnN0TGluZS50ZXh0LnNsaWNlKDAsIGZyb20uY2gpICsgbGFzdFRleHQgKyBmaXJzdExpbmUudGV4dC5zbGljZSh0by5jaCksIGxhc3RTcGFucykKICAgIH0gZWxzZSB7CiAgICAgIHZhciBhZGRlZCQxID0gbGluZXNGb3IoMSwgdGV4dC5sZW5ndGggLSAxKQogICAgICBhZGRlZCQxLnB1c2gobmV3IExpbmUobGFzdFRleHQgKyBmaXJzdExpbmUudGV4dC5zbGljZSh0by5jaCksIGxhc3RTcGFucywgZXN0aW1hdGVIZWlnaHQkJDEpKQogICAgICB1cGRhdGUoZmlyc3RMaW5lLCBmaXJzdExpbmUudGV4dC5zbGljZSgwLCBmcm9tLmNoKSArIHRleHRbMF0sIHNwYW5zRm9yKDApKQogICAgICBkb2MuaW5zZXJ0KGZyb20ubGluZSArIDEsIGFkZGVkJDEpCiAgICB9CiAgfSBlbHNlIGlmICh0ZXh0Lmxlbmd0aCA9PSAxKSB7CiAgICB1cGRhdGUoZmlyc3RMaW5lLCBmaXJzdExpbmUudGV4dC5zbGljZSgwLCBmcm9tLmNoKSArIHRleHRbMF0gKyBsYXN0TGluZS50ZXh0LnNsaWNlKHRvLmNoKSwgc3BhbnNGb3IoMCkpCiAgICBkb2MucmVtb3ZlKGZyb20ubGluZSArIDEsIG5saW5lcykKICB9IGVsc2UgewogICAgdXBkYXRlKGZpcnN0TGluZSwgZmlyc3RMaW5lLnRleHQuc2xpY2UoMCwgZnJvbS5jaCkgKyB0ZXh0WzBdLCBzcGFuc0ZvcigwKSkKICAgIHVwZGF0ZShsYXN0TGluZSwgbGFzdFRleHQgKyBsYXN0TGluZS50ZXh0LnNsaWNlKHRvLmNoKSwgbGFzdFNwYW5zKQogICAgdmFyIGFkZGVkJDIgPSBsaW5lc0ZvcigxLCB0ZXh0Lmxlbmd0aCAtIDEpCiAgICBpZiAobmxpbmVzID4gMSkgeyBkb2MucmVtb3ZlKGZyb20ubGluZSArIDEsIG5saW5lcyAtIDEpIH0KICAgIGRvYy5pbnNlcnQoZnJvbS5saW5lICsgMSwgYWRkZWQkMikKICB9CgogIHNpZ25hbExhdGVyKGRvYywgImNoYW5nZSIsIGRvYywgY2hhbmdlKQp9CgovLyBDYWxsIGYgZm9yIGFsbCBsaW5rZWQgZG9jdW1lbnRzLgpmdW5jdGlvbiBsaW5rZWREb2NzKGRvYywgZiwgc2hhcmVkSGlzdE9ubHkpIHsKICBmdW5jdGlvbiBwcm9wYWdhdGUoZG9jLCBza2lwLCBzaGFyZWRIaXN0KSB7CiAgICBpZiAoZG9jLmxpbmtlZCkgeyBmb3IgKHZhciBpID0gMDsgaSA8IGRvYy5saW5rZWQubGVuZ3RoOyArK2kpIHsKICAgICAgdmFyIHJlbCA9IGRvYy5saW5rZWRbaV0KICAgICAgaWYgKHJlbC5kb2MgPT0gc2tpcCkgeyBjb250aW51ZSB9CiAgICAgIHZhciBzaGFyZWQgPSBzaGFyZWRIaXN0ICYmIHJlbC5zaGFyZWRIaXN0CiAgICAgIGlmIChzaGFyZWRIaXN0T25seSAmJiAhc2hhcmVkKSB7IGNvbnRpbnVlIH0KICAgICAgZihyZWwuZG9jLCBzaGFyZWQpCiAgICAgIHByb3BhZ2F0ZShyZWwuZG9jLCBkb2MsIHNoYXJlZCkKICAgIH0gfQogIH0KICBwcm9wYWdhdGUoZG9jLCBudWxsLCB0cnVlKQp9CgovLyBBdHRhY2ggYSBkb2N1bWVudCB0byBhbiBlZGl0b3IuCmZ1bmN0aW9uIGF0dGFjaERvYyhjbSwgZG9jKSB7CiAgaWYgKGRvYy5jbSkgeyB0aHJvdyBuZXcgRXJyb3IoIlRoaXMgZG9jdW1lbnQgaXMgYWxyZWFkeSBpbiB1c2UuIikgfQogIGNtLmRvYyA9IGRvYwogIGRvYy5jbSA9IGNtCiAgZXN0aW1hdGVMaW5lSGVpZ2h0cyhjbSkKICBsb2FkTW9kZShjbSkKICBpZiAoIWNtLm9wdGlvbnMubGluZVdyYXBwaW5nKSB7IGZpbmRNYXhMaW5lKGNtKSB9CiAgY20ub3B0aW9ucy5tb2RlID0gZG9jLm1vZGVPcHRpb24KICByZWdDaGFuZ2UoY20pCn0KCmZ1bmN0aW9uIEhpc3Rvcnkoc3RhcnRHZW4pIHsKICAvLyBBcnJheXMgb2YgY2hhbmdlIGV2ZW50cyBhbmQgc2VsZWN0aW9ucy4gRG9pbmcgc29tZXRoaW5nIGFkZHMgYW4KICAvLyBldmVudCB0byBkb25lIGFuZCBjbGVhcnMgdW5kby4gVW5kb2luZyBtb3ZlcyBldmVudHMgZnJvbSBkb25lCiAgLy8gdG8gdW5kb25lLCByZWRvaW5nIG1vdmVzIHRoZW0gaW4gdGhlIG90aGVyIGRpcmVjdGlvbi4KICB0aGlzLmRvbmUgPSBbXTsgdGhpcy51bmRvbmUgPSBbXQogIHRoaXMudW5kb0RlcHRoID0gSW5maW5pdHkKICAvLyBVc2VkIHRvIHRyYWNrIHdoZW4gY2hhbmdlcyBjYW4gYmUgbWVyZ2VkIGludG8gYSBzaW5nbGUgdW5kbwogIC8vIGV2ZW50CiAgdGhpcy5sYXN0TW9kVGltZSA9IHRoaXMubGFzdFNlbFRpbWUgPSAwCiAgdGhpcy5sYXN0T3AgPSB0aGlzLmxhc3RTZWxPcCA9IG51bGwKICB0aGlzLmxhc3RPcmlnaW4gPSB0aGlzLmxhc3RTZWxPcmlnaW4gPSBudWxsCiAgLy8gVXNlZCBieSB0aGUgaXNDbGVhbigpIG1ldGhvZAogIHRoaXMuZ2VuZXJhdGlvbiA9IHRoaXMubWF4R2VuZXJhdGlvbiA9IHN0YXJ0R2VuIHx8IDEKfQoKLy8gQ3JlYXRlIGEgaGlzdG9yeSBjaGFuZ2UgZXZlbnQgZnJvbSBhbiB1cGRhdGVEb2Mtc3R5bGUgY2hhbmdlCi8vIG9iamVjdC4KZnVuY3Rpb24gaGlzdG9yeUNoYW5nZUZyb21DaGFuZ2UoZG9jLCBjaGFuZ2UpIHsKICB2YXIgaGlzdENoYW5nZSA9IHtmcm9tOiBjb3B5UG9zKGNoYW5nZS5mcm9tKSwgdG86IGNoYW5nZUVuZChjaGFuZ2UpLCB0ZXh0OiBnZXRCZXR3ZWVuKGRvYywgY2hhbmdlLmZyb20sIGNoYW5nZS50byl9CiAgYXR0YWNoTG9jYWxTcGFucyhkb2MsIGhpc3RDaGFuZ2UsIGNoYW5nZS5mcm9tLmxpbmUsIGNoYW5nZS50by5saW5lICsgMSkKICBsaW5rZWREb2NzKGRvYywgZnVuY3Rpb24gKGRvYykgeyByZXR1cm4gYXR0YWNoTG9jYWxTcGFucyhkb2MsIGhpc3RDaGFuZ2UsIGNoYW5nZS5mcm9tLmxpbmUsIGNoYW5nZS50by5saW5lICsgMSk7IH0sIHRydWUpCiAgcmV0dXJuIGhpc3RDaGFuZ2UKfQoKLy8gUG9wIGFsbCBzZWxlY3Rpb24gZXZlbnRzIG9mZiB0aGUgZW5kIG9mIGEgaGlzdG9yeSBhcnJheS4gU3RvcCBhdAovLyBhIGNoYW5nZSBldmVudC4KZnVuY3Rpb24gY2xlYXJTZWxlY3Rpb25FdmVudHMoYXJyYXkpIHsKICB3aGlsZSAoYXJyYXkubGVuZ3RoKSB7CiAgICB2YXIgbGFzdCA9IGxzdChhcnJheSkKICAgIGlmIChsYXN0LnJhbmdlcykgeyBhcnJheS5wb3AoKSB9CiAgICBlbHNlIHsgYnJlYWsgfQogIH0KfQoKLy8gRmluZCB0aGUgdG9wIGNoYW5nZSBldmVudCBpbiB0aGUgaGlzdG9yeS4gUG9wIG9mZiBzZWxlY3Rpb24KLy8gZXZlbnRzIHRoYXQgYXJlIGluIHRoZSB3YXkuCmZ1bmN0aW9uIGxhc3RDaGFuZ2VFdmVudChoaXN0LCBmb3JjZSkgewogIGlmIChmb3JjZSkgewogICAgY2xlYXJTZWxlY3Rpb25FdmVudHMoaGlzdC5kb25lKQogICAgcmV0dXJuIGxzdChoaXN0LmRvbmUpCiAgfSBlbHNlIGlmIChoaXN0LmRvbmUubGVuZ3RoICYmICFsc3QoaGlzdC5kb25lKS5yYW5nZXMpIHsKICAgIHJldHVybiBsc3QoaGlzdC5kb25lKQogIH0gZWxzZSBpZiAoaGlzdC5kb25lLmxlbmd0aCA+IDEgJiYgIWhpc3QuZG9uZVtoaXN0LmRvbmUubGVuZ3RoIC0gMl0ucmFuZ2VzKSB7CiAgICBoaXN0LmRvbmUucG9wKCkKICAgIHJldHVybiBsc3QoaGlzdC5kb25lKQogIH0KfQoKLy8gUmVnaXN0ZXIgYSBjaGFuZ2UgaW4gdGhlIGhpc3RvcnkuIE1lcmdlcyBjaGFuZ2VzIHRoYXQgYXJlIHdpdGhpbgovLyBhIHNpbmdsZSBvcGVyYXRpb24sIG9yIGFyZSBjbG9zZSB0b2dldGhlciB3aXRoIGFuIG9yaWdpbiB0aGF0Ci8vIGFsbG93cyBtZXJnaW5nIChzdGFydGluZyB3aXRoICIrIikgaW50byBhIHNpbmdsZSBldmVudC4KZnVuY3Rpb24gYWRkQ2hhbmdlVG9IaXN0b3J5KGRvYywgY2hhbmdlLCBzZWxBZnRlciwgb3BJZCkgewogIHZhciBoaXN0ID0gZG9jLmhpc3RvcnkKICBoaXN0LnVuZG9uZS5sZW5ndGggPSAwCiAgdmFyIHRpbWUgPSArbmV3IERhdGUsIGN1cgogIHZhciBsYXN0CgogIGlmICgoaGlzdC5sYXN0T3AgPT0gb3BJZCB8fAogICAgICAgaGlzdC5sYXN0T3JpZ2luID09IGNoYW5nZS5vcmlnaW4gJiYgY2hhbmdlLm9yaWdpbiAmJgogICAgICAgKChjaGFuZ2Uub3JpZ2luLmNoYXJBdCgwKSA9PSAiKyIgJiYgZG9jLmNtICYmIGhpc3QubGFzdE1vZFRpbWUgPiB0aW1lIC0gZG9jLmNtLm9wdGlvbnMuaGlzdG9yeUV2ZW50RGVsYXkpIHx8CiAgICAgICAgY2hhbmdlLm9yaWdpbi5jaGFyQXQoMCkgPT0gIioiKSkgJiYKICAgICAgKGN1ciA9IGxhc3RDaGFuZ2VFdmVudChoaXN0LCBoaXN0Lmxhc3RPcCA9PSBvcElkKSkpIHsKICAgIC8vIE1lcmdlIHRoaXMgY2hhbmdlIGludG8gdGhlIGxhc3QgZXZlbnQKICAgIGxhc3QgPSBsc3QoY3VyLmNoYW5nZXMpCiAgICBpZiAoY21wKGNoYW5nZS5mcm9tLCBjaGFuZ2UudG8pID09IDAgJiYgY21wKGNoYW5nZS5mcm9tLCBsYXN0LnRvKSA9PSAwKSB7CiAgICAgIC8vIE9wdGltaXplZCBjYXNlIGZvciBzaW1wbGUgaW5zZXJ0aW9uIC0tIGRvbid0IHdhbnQgdG8gYWRkCiAgICAgIC8vIG5ldyBjaGFuZ2VzZXRzIGZvciBldmVyeSBjaGFyYWN0ZXIgdHlwZWQKICAgICAgbGFzdC50byA9IGNoYW5nZUVuZChjaGFuZ2UpCiAgICB9IGVsc2UgewogICAgICAvLyBBZGQgbmV3IHN1Yi1ldmVudAogICAgICBjdXIuY2hhbmdlcy5wdXNoKGhpc3RvcnlDaGFuZ2VGcm9tQ2hhbmdlKGRvYywgY2hhbmdlKSkKICAgIH0KICB9IGVsc2UgewogICAgLy8gQ2FuIG5vdCBiZSBtZXJnZWQsIHN0YXJ0IGEgbmV3IGV2ZW50LgogICAgdmFyIGJlZm9yZSA9IGxzdChoaXN0LmRvbmUpCiAgICBpZiAoIWJlZm9yZSB8fCAhYmVmb3JlLnJhbmdlcykKICAgICAgeyBwdXNoU2VsZWN0aW9uVG9IaXN0b3J5KGRvYy5zZWwsIGhpc3QuZG9uZSkgfQogICAgY3VyID0ge2NoYW5nZXM6IFtoaXN0b3J5Q2hhbmdlRnJvbUNoYW5nZShkb2MsIGNoYW5nZSldLAogICAgICAgICAgIGdlbmVyYXRpb246IGhpc3QuZ2VuZXJhdGlvbn0KICAgIGhpc3QuZG9uZS5wdXNoKGN1cikKICAgIHdoaWxlIChoaXN0LmRvbmUubGVuZ3RoID4gaGlzdC51bmRvRGVwdGgpIHsKICAgICAgaGlzdC5kb25lLnNoaWZ0KCkKICAgICAgaWYgKCFoaXN0LmRvbmVbMF0ucmFuZ2VzKSB7IGhpc3QuZG9uZS5zaGlmdCgpIH0KICAgIH0KICB9CiAgaGlzdC5kb25lLnB1c2goc2VsQWZ0ZXIpCiAgaGlzdC5nZW5lcmF0aW9uID0gKytoaXN0Lm1heEdlbmVyYXRpb24KICBoaXN0Lmxhc3RNb2RUaW1lID0gaGlzdC5sYXN0U2VsVGltZSA9IHRpbWUKICBoaXN0Lmxhc3RPcCA9IGhpc3QubGFzdFNlbE9wID0gb3BJZAogIGhpc3QubGFzdE9yaWdpbiA9IGhpc3QubGFzdFNlbE9yaWdpbiA9IGNoYW5nZS5vcmlnaW4KCiAgaWYgKCFsYXN0KSB7IHNpZ25hbChkb2MsICJoaXN0b3J5QWRkZWQiKSB9Cn0KCmZ1bmN0aW9uIHNlbGVjdGlvbkV2ZW50Q2FuQmVNZXJnZWQoZG9jLCBvcmlnaW4sIHByZXYsIHNlbCkgewogIHZhciBjaCA9IG9yaWdpbi5jaGFyQXQoMCkKICByZXR1cm4gY2ggPT0gIioiIHx8CiAgICBjaCA9PSAiKyIgJiYKICAgIHByZXYucmFuZ2VzLmxlbmd0aCA9PSBzZWwucmFuZ2VzLmxlbmd0aCAmJgogICAgcHJldi5zb21ldGhpbmdTZWxlY3RlZCgpID09IHNlbC5zb21ldGhpbmdTZWxlY3RlZCgpICYmCiAgICBuZXcgRGF0ZSAtIGRvYy5oaXN0b3J5Lmxhc3RTZWxUaW1lIDw9IChkb2MuY20gPyBkb2MuY20ub3B0aW9ucy5oaXN0b3J5RXZlbnREZWxheSA6IDUwMCkKfQoKLy8gQ2FsbGVkIHdoZW5ldmVyIHRoZSBzZWxlY3Rpb24gY2hhbmdlcywgc2V0cyB0aGUgbmV3IHNlbGVjdGlvbiBhcwovLyB0aGUgcGVuZGluZyBzZWxlY3Rpb24gaW4gdGhlIGhpc3RvcnksIGFuZCBwdXNoZXMgdGhlIG9sZCBwZW5kaW5nCi8vIHNlbGVjdGlvbiBpbnRvIHRoZSAnZG9uZScgYXJyYXkgd2hlbiBpdCB3YXMgc2lnbmlmaWNhbnRseQovLyBkaWZmZXJlbnQgKGluIG51bWJlciBvZiBzZWxlY3RlZCByYW5nZXMsIGVtcHRpbmVzcywgb3IgdGltZSkuCmZ1bmN0aW9uIGFkZFNlbGVjdGlvblRvSGlzdG9yeShkb2MsIHNlbCwgb3BJZCwgb3B0aW9ucykgewogIHZhciBoaXN0ID0gZG9jLmhpc3RvcnksIG9yaWdpbiA9IG9wdGlvbnMgJiYgb3B0aW9ucy5vcmlnaW4KCiAgLy8gQSBuZXcgZXZlbnQgaXMgc3RhcnRlZCB3aGVuIHRoZSBwcmV2aW91cyBvcmlnaW4gZG9lcyBub3QgbWF0Y2gKICAvLyB0aGUgY3VycmVudCwgb3IgdGhlIG9yaWdpbnMgZG9uJ3QgYWxsb3cgbWF0Y2hpbmcuIE9yaWdpbnMKICAvLyBzdGFydGluZyB3aXRoICogYXJlIGFsd2F5cyBtZXJnZWQsIHRob3NlIHN0YXJ0aW5nIHdpdGggKyBhcmUKICAvLyBtZXJnZWQgd2hlbiBzaW1pbGFyIGFuZCBjbG9zZSB0b2dldGhlciBpbiB0aW1lLgogIGlmIChvcElkID09IGhpc3QubGFzdFNlbE9wIHx8CiAgICAgIChvcmlnaW4gJiYgaGlzdC5sYXN0U2VsT3JpZ2luID09IG9yaWdpbiAmJgogICAgICAgKGhpc3QubGFzdE1vZFRpbWUgPT0gaGlzdC5sYXN0U2VsVGltZSAmJiBoaXN0Lmxhc3RPcmlnaW4gPT0gb3JpZ2luIHx8CiAgICAgICAgc2VsZWN0aW9uRXZlbnRDYW5CZU1lcmdlZChkb2MsIG9yaWdpbiwgbHN0KGhpc3QuZG9uZSksIHNlbCkpKSkKICAgIHsgaGlzdC5kb25lW2hpc3QuZG9uZS5sZW5ndGggLSAxXSA9IHNlbCB9CiAgZWxzZQogICAgeyBwdXNoU2VsZWN0aW9uVG9IaXN0b3J5KHNlbCwgaGlzdC5kb25lKSB9CgogIGhpc3QubGFzdFNlbFRpbWUgPSArbmV3IERhdGUKICBoaXN0Lmxhc3RTZWxPcmlnaW4gPSBvcmlnaW4KICBoaXN0Lmxhc3RTZWxPcCA9IG9wSWQKICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmNsZWFyUmVkbyAhPT0gZmFsc2UpCiAgICB7IGNsZWFyU2VsZWN0aW9uRXZlbnRzKGhpc3QudW5kb25lKSB9Cn0KCmZ1bmN0aW9uIHB1c2hTZWxlY3Rpb25Ub0hpc3Rvcnkoc2VsLCBkZXN0KSB7CiAgdmFyIHRvcCA9IGxzdChkZXN0KQogIGlmICghKHRvcCAmJiB0b3AucmFuZ2VzICYmIHRvcC5lcXVhbHMoc2VsKSkpCiAgICB7IGRlc3QucHVzaChzZWwpIH0KfQoKLy8gVXNlZCB0byBzdG9yZSBtYXJrZWQgc3BhbiBpbmZvcm1hdGlvbiBpbiB0aGUgaGlzdG9yeS4KZnVuY3Rpb24gYXR0YWNoTG9jYWxTcGFucyhkb2MsIGNoYW5nZSwgZnJvbSwgdG8pIHsKICB2YXIgZXhpc3RpbmcgPSBjaGFuZ2VbInNwYW5zXyIgKyBkb2MuaWRdLCBuID0gMAogIGRvYy5pdGVyKE1hdGgubWF4KGRvYy5maXJzdCwgZnJvbSksIE1hdGgubWluKGRvYy5maXJzdCArIGRvYy5zaXplLCB0byksIGZ1bmN0aW9uIChsaW5lKSB7CiAgICBpZiAobGluZS5tYXJrZWRTcGFucykKICAgICAgeyAoZXhpc3RpbmcgfHwgKGV4aXN0aW5nID0gY2hhbmdlWyJzcGFuc18iICsgZG9jLmlkXSA9IHt9KSlbbl0gPSBsaW5lLm1hcmtlZFNwYW5zIH0KICAgICsrbgogIH0pCn0KCi8vIFdoZW4gdW4vcmUtZG9pbmcgcmVzdG9yZXMgdGV4dCBjb250YWluaW5nIG1hcmtlZCBzcGFucywgdGhvc2UKLy8gdGhhdCBoYXZlIGJlZW4gZXhwbGljaXRseSBjbGVhcmVkIHNob3VsZCBub3QgYmUgcmVzdG9yZWQuCmZ1bmN0aW9uIHJlbW92ZUNsZWFyZWRTcGFucyhzcGFucykgewogIGlmICghc3BhbnMpIHsgcmV0dXJuIG51bGwgfQogIHZhciBvdXQKICBmb3IgKHZhciBpID0gMDsgaSA8IHNwYW5zLmxlbmd0aDsgKytpKSB7CiAgICBpZiAoc3BhbnNbaV0ubWFya2VyLmV4cGxpY2l0bHlDbGVhcmVkKSB7IGlmICghb3V0KSB7IG91dCA9IHNwYW5zLnNsaWNlKDAsIGkpIH0gfQogICAgZWxzZSBpZiAob3V0KSB7IG91dC5wdXNoKHNwYW5zW2ldKSB9CiAgfQogIHJldHVybiAhb3V0ID8gc3BhbnMgOiBvdXQubGVuZ3RoID8gb3V0IDogbnVsbAp9CgovLyBSZXRyaWV2ZSBhbmQgZmlsdGVyIHRoZSBvbGQgbWFya2VkIHNwYW5zIHN0b3JlZCBpbiBhIGNoYW5nZSBldmVudC4KZnVuY3Rpb24gZ2V0T2xkU3BhbnMoZG9jLCBjaGFuZ2UpIHsKICB2YXIgZm91bmQgPSBjaGFuZ2VbInNwYW5zXyIgKyBkb2MuaWRdCiAgaWYgKCFmb3VuZCkgeyByZXR1cm4gbnVsbCB9CiAgdmFyIG53ID0gW10KICBmb3IgKHZhciBpID0gMDsgaSA8IGNoYW5nZS50ZXh0Lmxlbmd0aDsgKytpKQogICAgeyBudy5wdXNoKHJlbW92ZUNsZWFyZWRTcGFucyhmb3VuZFtpXSkpIH0KICByZXR1cm4gbncKfQoKLy8gVXNlZCBmb3IgdW4vcmUtZG9pbmcgY2hhbmdlcyBmcm9tIHRoZSBoaXN0b3J5LiBDb21iaW5lcyB0aGUKLy8gcmVzdWx0IG9mIGNvbXB1dGluZyB0aGUgZXhpc3Rpbmcgc3BhbnMgd2l0aCB0aGUgc2V0IG9mIHNwYW5zIHRoYXQKLy8gZXhpc3RlZCBpbiB0aGUgaGlzdG9yeSAoc28gdGhhdCBkZWxldGluZyBhcm91bmQgYSBzcGFuIGFuZCB0aGVuCi8vIHVuZG9pbmcgYnJpbmdzIGJhY2sgdGhlIHNwYW4pLgpmdW5jdGlvbiBtZXJnZU9sZFNwYW5zKGRvYywgY2hhbmdlKSB7CiAgdmFyIG9sZCA9IGdldE9sZFNwYW5zKGRvYywgY2hhbmdlKQogIHZhciBzdHJldGNoZWQgPSBzdHJldGNoU3BhbnNPdmVyQ2hhbmdlKGRvYywgY2hhbmdlKQogIGlmICghb2xkKSB7IHJldHVybiBzdHJldGNoZWQgfQogIGlmICghc3RyZXRjaGVkKSB7IHJldHVybiBvbGQgfQoKICBmb3IgKHZhciBpID0gMDsgaSA8IG9sZC5sZW5ndGg7ICsraSkgewogICAgdmFyIG9sZEN1ciA9IG9sZFtpXSwgc3RyZXRjaEN1ciA9IHN0cmV0Y2hlZFtpXQogICAgaWYgKG9sZEN1ciAmJiBzdHJldGNoQ3VyKSB7CiAgICAgIHNwYW5zOiBmb3IgKHZhciBqID0gMDsgaiA8IHN0cmV0Y2hDdXIubGVuZ3RoOyArK2opIHsKICAgICAgICB2YXIgc3BhbiA9IHN0cmV0Y2hDdXJbal0KICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IG9sZEN1ci5sZW5ndGg7ICsraykKICAgICAgICAgIHsgaWYgKG9sZEN1cltrXS5tYXJrZXIgPT0gc3Bhbi5tYXJrZXIpIHsgY29udGludWUgc3BhbnMgfSB9CiAgICAgICAgb2xkQ3VyLnB1c2goc3BhbikKICAgICAgfQogICAgfSBlbHNlIGlmIChzdHJldGNoQ3VyKSB7CiAgICAgIG9sZFtpXSA9IHN0cmV0Y2hDdXIKICAgIH0KICB9CiAgcmV0dXJuIG9sZAp9CgovLyBVc2VkIGJvdGggdG8gcHJvdmlkZSBhIEpTT04tc2FmZSBvYmplY3QgaW4gLmdldEhpc3RvcnksIGFuZCwgd2hlbgovLyBkZXRhY2hpbmcgYSBkb2N1bWVudCwgdG8gc3BsaXQgdGhlIGhpc3RvcnkgaW4gdHdvCmZ1bmN0aW9uIGNvcHlIaXN0b3J5QXJyYXkoZXZlbnRzLCBuZXdHcm91cCwgaW5zdGFudGlhdGVTZWwpIHsKICB2YXIgY29weSA9IFtdCiAgZm9yICh2YXIgaSA9IDA7IGkgPCBldmVudHMubGVuZ3RoOyArK2kpIHsKICAgIHZhciBldmVudCA9IGV2ZW50c1tpXQogICAgaWYgKGV2ZW50LnJhbmdlcykgewogICAgICBjb3B5LnB1c2goaW5zdGFudGlhdGVTZWwgPyBTZWxlY3Rpb24ucHJvdG90eXBlLmRlZXBDb3B5LmNhbGwoZXZlbnQpIDogZXZlbnQpCiAgICAgIGNvbnRpbnVlCiAgICB9CiAgICB2YXIgY2hhbmdlcyA9IGV2ZW50LmNoYW5nZXMsIG5ld0NoYW5nZXMgPSBbXQogICAgY29weS5wdXNoKHtjaGFuZ2VzOiBuZXdDaGFuZ2VzfSkKICAgIGZvciAodmFyIGogPSAwOyBqIDwgY2hhbmdlcy5sZW5ndGg7ICsraikgewogICAgICB2YXIgY2hhbmdlID0gY2hhbmdlc1tqXSwgbSA9IHZvaWQgMAogICAgICBuZXdDaGFuZ2VzLnB1c2goe2Zyb206IGNoYW5nZS5mcm9tLCB0bzogY2hhbmdlLnRvLCB0ZXh0OiBjaGFuZ2UudGV4dH0pCiAgICAgIGlmIChuZXdHcm91cCkgeyBmb3IgKHZhciBwcm9wIGluIGNoYW5nZSkgeyBpZiAobSA9IHByb3AubWF0Y2goL15zcGFuc18oXGQrKSQvKSkgewogICAgICAgIGlmIChpbmRleE9mKG5ld0dyb3VwLCBOdW1iZXIobVsxXSkpID4gLTEpIHsKICAgICAgICAgIGxzdChuZXdDaGFuZ2VzKVtwcm9wXSA9IGNoYW5nZVtwcm9wXQogICAgICAgICAgZGVsZXRlIGNoYW5nZVtwcm9wXQogICAgICAgIH0KICAgICAgfSB9IH0KICAgIH0KICB9CiAgcmV0dXJuIGNvcHkKfQoKLy8gVGhlICdzY3JvbGwnIHBhcmFtZXRlciBnaXZlbiB0byBtYW55IG9mIHRoZXNlIGluZGljYXRlZCB3aGV0aGVyCi8vIHRoZSBuZXcgY3Vyc29yIHBvc2l0aW9uIHNob3VsZCBiZSBzY3JvbGxlZCBpbnRvIHZpZXcgYWZ0ZXIKLy8gbW9kaWZ5aW5nIHRoZSBzZWxlY3Rpb24uCgovLyBJZiBzaGlmdCBpcyBoZWxkIG9yIHRoZSBleHRlbmQgZmxhZyBpcyBzZXQsIGV4dGVuZHMgYSByYW5nZSB0bwovLyBpbmNsdWRlIGEgZ2l2ZW4gcG9zaXRpb24gKGFuZCBvcHRpb25hbGx5IGEgc2Vjb25kIHBvc2l0aW9uKS4KLy8gT3RoZXJ3aXNlLCBzaW1wbHkgcmV0dXJucyB0aGUgcmFuZ2UgYmV0d2VlbiB0aGUgZ2l2ZW4gcG9zaXRpb25zLgovLyBVc2VkIGZvciBjdXJzb3IgbW90aW9uIGFuZCBzdWNoLgpmdW5jdGlvbiBleHRlbmRSYW5nZShkb2MsIHJhbmdlLCBoZWFkLCBvdGhlcikgewogIGlmIChkb2MuY20gJiYgZG9jLmNtLmRpc3BsYXkuc2hpZnQgfHwgZG9jLmV4dGVuZCkgewogICAgdmFyIGFuY2hvciA9IHJhbmdlLmFuY2hvcgogICAgaWYgKG90aGVyKSB7CiAgICAgIHZhciBwb3NCZWZvcmUgPSBjbXAoaGVhZCwgYW5jaG9yKSA8IDAKICAgICAgaWYgKHBvc0JlZm9yZSAhPSAoY21wKG90aGVyLCBhbmNob3IpIDwgMCkpIHsKICAgICAgICBhbmNob3IgPSBoZWFkCiAgICAgICAgaGVhZCA9IG90aGVyCiAgICAgIH0gZWxzZSBpZiAocG9zQmVmb3JlICE9IChjbXAoaGVhZCwgb3RoZXIpIDwgMCkpIHsKICAgICAgICBoZWFkID0gb3RoZXIKICAgICAgfQogICAgfQogICAgcmV0dXJuIG5ldyBSYW5nZShhbmNob3IsIGhlYWQpCiAgfSBlbHNlIHsKICAgIHJldHVybiBuZXcgUmFuZ2Uob3RoZXIgfHwgaGVhZCwgaGVhZCkKICB9Cn0KCi8vIEV4dGVuZCB0aGUgcHJpbWFyeSBzZWxlY3Rpb24gcmFuZ2UsIGRpc2NhcmQgdGhlIHJlc3QuCmZ1bmN0aW9uIGV4dGVuZFNlbGVjdGlvbihkb2MsIGhlYWQsIG90aGVyLCBvcHRpb25zKSB7CiAgc2V0U2VsZWN0aW9uKGRvYywgbmV3IFNlbGVjdGlvbihbZXh0ZW5kUmFuZ2UoZG9jLCBkb2Muc2VsLnByaW1hcnkoKSwgaGVhZCwgb3RoZXIpXSwgMCksIG9wdGlvbnMpCn0KCi8vIEV4dGVuZCBhbGwgc2VsZWN0aW9ucyAocG9zIGlzIGFuIGFycmF5IG9mIHNlbGVjdGlvbnMgd2l0aCBsZW5ndGgKLy8gZXF1YWwgdGhlIG51bWJlciBvZiBzZWxlY3Rpb25zKQpmdW5jdGlvbiBleHRlbmRTZWxlY3Rpb25zKGRvYywgaGVhZHMsIG9wdGlvbnMpIHsKICB2YXIgb3V0ID0gW10KICBmb3IgKHZhciBpID0gMDsgaSA8IGRvYy5zZWwucmFuZ2VzLmxlbmd0aDsgaSsrKQogICAgeyBvdXRbaV0gPSBleHRlbmRSYW5nZShkb2MsIGRvYy5zZWwucmFuZ2VzW2ldLCBoZWFkc1tpXSwgbnVsbCkgfQogIHZhciBuZXdTZWwgPSBub3JtYWxpemVTZWxlY3Rpb24ob3V0LCBkb2Muc2VsLnByaW1JbmRleCkKICBzZXRTZWxlY3Rpb24oZG9jLCBuZXdTZWwsIG9wdGlvbnMpCn0KCi8vIFVwZGF0ZXMgYSBzaW5nbGUgcmFuZ2UgaW4gdGhlIHNlbGVjdGlvbi4KZnVuY3Rpb24gcmVwbGFjZU9uZVNlbGVjdGlvbihkb2MsIGksIHJhbmdlLCBvcHRpb25zKSB7CiAgdmFyIHJhbmdlcyA9IGRvYy5zZWwucmFuZ2VzLnNsaWNlKDApCiAgcmFuZ2VzW2ldID0gcmFuZ2UKICBzZXRTZWxlY3Rpb24oZG9jLCBub3JtYWxpemVTZWxlY3Rpb24ocmFuZ2VzLCBkb2Muc2VsLnByaW1JbmRleCksIG9wdGlvbnMpCn0KCi8vIFJlc2V0IHRoZSBzZWxlY3Rpb24gdG8gYSBzaW5nbGUgcmFuZ2UuCmZ1bmN0aW9uIHNldFNpbXBsZVNlbGVjdGlvbihkb2MsIGFuY2hvciwgaGVhZCwgb3B0aW9ucykgewogIHNldFNlbGVjdGlvbihkb2MsIHNpbXBsZVNlbGVjdGlvbihhbmNob3IsIGhlYWQpLCBvcHRpb25zKQp9CgovLyBHaXZlIGJlZm9yZVNlbGVjdGlvbkNoYW5nZSBoYW5kbGVycyBhIGNoYW5nZSB0byBpbmZsdWVuY2UgYQovLyBzZWxlY3Rpb24gdXBkYXRlLgpmdW5jdGlvbiBmaWx0ZXJTZWxlY3Rpb25DaGFuZ2UoZG9jLCBzZWwsIG9wdGlvbnMpIHsKICB2YXIgb2JqID0gewogICAgcmFuZ2VzOiBzZWwucmFuZ2VzLAogICAgdXBkYXRlOiBmdW5jdGlvbihyYW5nZXMpIHsKICAgICAgdmFyIHRoaXMkMSA9IHRoaXM7CgogICAgICB0aGlzLnJhbmdlcyA9IFtdCiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSsrKQogICAgICAgIHsgdGhpcyQxLnJhbmdlc1tpXSA9IG5ldyBSYW5nZShjbGlwUG9zKGRvYywgcmFuZ2VzW2ldLmFuY2hvciksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcFBvcyhkb2MsIHJhbmdlc1tpXS5oZWFkKSkgfQogICAgfSwKICAgIG9yaWdpbjogb3B0aW9ucyAmJiBvcHRpb25zLm9yaWdpbgogIH0KICBzaWduYWwoZG9jLCAiYmVmb3JlU2VsZWN0aW9uQ2hhbmdlIiwgZG9jLCBvYmopCiAgaWYgKGRvYy5jbSkgeyBzaWduYWwoZG9jLmNtLCAiYmVmb3JlU2VsZWN0aW9uQ2hhbmdlIiwgZG9jLmNtLCBvYmopIH0KICBpZiAob2JqLnJhbmdlcyAhPSBzZWwucmFuZ2VzKSB7IHJldHVybiBub3JtYWxpemVTZWxlY3Rpb24ob2JqLnJhbmdlcywgb2JqLnJhbmdlcy5sZW5ndGggLSAxKSB9CiAgZWxzZSB7IHJldHVybiBzZWwgfQp9CgpmdW5jdGlvbiBzZXRTZWxlY3Rpb25SZXBsYWNlSGlzdG9yeShkb2MsIHNlbCwgb3B0aW9ucykgewogIHZhciBkb25lID0gZG9jLmhpc3RvcnkuZG9uZSwgbGFzdCA9IGxzdChkb25lKQogIGlmIChsYXN0ICYmIGxhc3QucmFuZ2VzKSB7CiAgICBkb25lW2RvbmUubGVuZ3RoIC0gMV0gPSBzZWwKICAgIHNldFNlbGVjdGlvbk5vVW5kbyhkb2MsIHNlbCwgb3B0aW9ucykKICB9IGVsc2UgewogICAgc2V0U2VsZWN0aW9uKGRvYywgc2VsLCBvcHRpb25zKQogIH0KfQoKLy8gU2V0IGEgbmV3IHNlbGVjdGlvbi4KZnVuY3Rpb24gc2V0U2VsZWN0aW9uKGRvYywgc2VsLCBvcHRpb25zKSB7CiAgc2V0U2VsZWN0aW9uTm9VbmRvKGRvYywgc2VsLCBvcHRpb25zKQogIGFkZFNlbGVjdGlvblRvSGlzdG9yeShkb2MsIGRvYy5zZWwsIGRvYy5jbSA/IGRvYy5jbS5jdXJPcC5pZCA6IE5hTiwgb3B0aW9ucykKfQoKZnVuY3Rpb24gc2V0U2VsZWN0aW9uTm9VbmRvKGRvYywgc2VsLCBvcHRpb25zKSB7CiAgaWYgKGhhc0hhbmRsZXIoZG9jLCAiYmVmb3JlU2VsZWN0aW9uQ2hhbmdlIikgfHwgZG9jLmNtICYmIGhhc0hhbmRsZXIoZG9jLmNtLCAiYmVmb3JlU2VsZWN0aW9uQ2hhbmdlIikpCiAgICB7IHNlbCA9IGZpbHRlclNlbGVjdGlvbkNoYW5nZShkb2MsIHNlbCwgb3B0aW9ucykgfQoKICB2YXIgYmlhcyA9IG9wdGlvbnMgJiYgb3B0aW9ucy5iaWFzIHx8CiAgICAoY21wKHNlbC5wcmltYXJ5KCkuaGVhZCwgZG9jLnNlbC5wcmltYXJ5KCkuaGVhZCkgPCAwID8gLTEgOiAxKQogIHNldFNlbGVjdGlvbklubmVyKGRvYywgc2tpcEF0b21pY0luU2VsZWN0aW9uKGRvYywgc2VsLCBiaWFzLCB0cnVlKSkKCiAgaWYgKCEob3B0aW9ucyAmJiBvcHRpb25zLnNjcm9sbCA9PT0gZmFsc2UpICYmIGRvYy5jbSkKICAgIHsgZW5zdXJlQ3Vyc29yVmlzaWJsZShkb2MuY20pIH0KfQoKZnVuY3Rpb24gc2V0U2VsZWN0aW9uSW5uZXIoZG9jLCBzZWwpIHsKICBpZiAoc2VsLmVxdWFscyhkb2Muc2VsKSkgeyByZXR1cm4gfQoKICBkb2Muc2VsID0gc2VsCgogIGlmIChkb2MuY20pIHsKICAgIGRvYy5jbS5jdXJPcC51cGRhdGVJbnB1dCA9IGRvYy5jbS5jdXJPcC5zZWxlY3Rpb25DaGFuZ2VkID0gdHJ1ZQogICAgc2lnbmFsQ3Vyc29yQWN0aXZpdHkoZG9jLmNtKQogIH0KICBzaWduYWxMYXRlcihkb2MsICJjdXJzb3JBY3Rpdml0eSIsIGRvYykKfQoKLy8gVmVyaWZ5IHRoYXQgdGhlIHNlbGVjdGlvbiBkb2VzIG5vdCBwYXJ0aWFsbHkgc2VsZWN0IGFueSBhdG9taWMKLy8gbWFya2VkIHJhbmdlcy4KZnVuY3Rpb24gcmVDaGVja1NlbGVjdGlvbihkb2MpIHsKICBzZXRTZWxlY3Rpb25Jbm5lcihkb2MsIHNraXBBdG9taWNJblNlbGVjdGlvbihkb2MsIGRvYy5zZWwsIG51bGwsIGZhbHNlKSwgc2VsX2RvbnRTY3JvbGwpCn0KCi8vIFJldHVybiBhIHNlbGVjdGlvbiB0aGF0IGRvZXMgbm90IHBhcnRpYWxseSBzZWxlY3QgYW55IGF0b21pYwovLyByYW5nZXMuCmZ1bmN0aW9uIHNraXBBdG9taWNJblNlbGVjdGlvbihkb2MsIHNlbCwgYmlhcywgbWF5Q2xlYXIpIHsKICB2YXIgb3V0CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWwucmFuZ2VzLmxlbmd0aDsgaSsrKSB7CiAgICB2YXIgcmFuZ2UgPSBzZWwucmFuZ2VzW2ldCiAgICB2YXIgb2xkID0gc2VsLnJhbmdlcy5sZW5ndGggPT0gZG9jLnNlbC5yYW5nZXMubGVuZ3RoICYmIGRvYy5zZWwucmFuZ2VzW2ldCiAgICB2YXIgbmV3QW5jaG9yID0gc2tpcEF0b21pYyhkb2MsIHJhbmdlLmFuY2hvciwgb2xkICYmIG9sZC5hbmNob3IsIGJpYXMsIG1heUNsZWFyKQogICAgdmFyIG5ld0hlYWQgPSBza2lwQXRvbWljKGRvYywgcmFuZ2UuaGVhZCwgb2xkICYmIG9sZC5oZWFkLCBiaWFzLCBtYXlDbGVhcikKICAgIGlmIChvdXQgfHwgbmV3QW5jaG9yICE9IHJhbmdlLmFuY2hvciB8fCBuZXdIZWFkICE9IHJhbmdlLmhlYWQpIHsKICAgICAgaWYgKCFvdXQpIHsgb3V0ID0gc2VsLnJhbmdlcy5zbGljZSgwLCBpKSB9CiAgICAgIG91dFtpXSA9IG5ldyBSYW5nZShuZXdBbmNob3IsIG5ld0hlYWQpCiAgICB9CiAgfQogIHJldHVybiBvdXQgPyBub3JtYWxpemVTZWxlY3Rpb24ob3V0LCBzZWwucHJpbUluZGV4KSA6IHNlbAp9CgpmdW5jdGlvbiBza2lwQXRvbWljSW5uZXIoZG9jLCBwb3MsIG9sZFBvcywgZGlyLCBtYXlDbGVhcikgewogIHZhciBsaW5lID0gZ2V0TGluZShkb2MsIHBvcy5saW5lKQogIGlmIChsaW5lLm1hcmtlZFNwYW5zKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgbGluZS5tYXJrZWRTcGFucy5sZW5ndGg7ICsraSkgewogICAgdmFyIHNwID0gbGluZS5tYXJrZWRTcGFuc1tpXSwgbSA9IHNwLm1hcmtlcgogICAgaWYgKChzcC5mcm9tID09IG51bGwgfHwgKG0uaW5jbHVzaXZlTGVmdCA/IHNwLmZyb20gPD0gcG9zLmNoIDogc3AuZnJvbSA8IHBvcy5jaCkpICYmCiAgICAgICAgKHNwLnRvID09IG51bGwgfHwgKG0uaW5jbHVzaXZlUmlnaHQgPyBzcC50byA+PSBwb3MuY2ggOiBzcC50byA+IHBvcy5jaCkpKSB7CiAgICAgIGlmIChtYXlDbGVhcikgewogICAgICAgIHNpZ25hbChtLCAiYmVmb3JlQ3Vyc29yRW50ZXIiKQogICAgICAgIGlmIChtLmV4cGxpY2l0bHlDbGVhcmVkKSB7CiAgICAgICAgICBpZiAoIWxpbmUubWFya2VkU3BhbnMpIHsgYnJlYWsgfQogICAgICAgICAgZWxzZSB7LS1pOyBjb250aW51ZX0KICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKCFtLmF0b21pYykgeyBjb250aW51ZSB9CgogICAgICBpZiAob2xkUG9zKSB7CiAgICAgICAgdmFyIG5lYXIgPSBtLmZpbmQoZGlyIDwgMCA/IDEgOiAtMSksIGRpZmYgPSB2b2lkIDAKICAgICAgICBpZiAoZGlyIDwgMCA/IG0uaW5jbHVzaXZlUmlnaHQgOiBtLmluY2x1c2l2ZUxlZnQpCiAgICAgICAgICB7IG5lYXIgPSBtb3ZlUG9zKGRvYywgbmVhciwgLWRpciwgbmVhciAmJiBuZWFyLmxpbmUgPT0gcG9zLmxpbmUgPyBsaW5lIDogbnVsbCkgfQogICAgICAgIGlmIChuZWFyICYmIG5lYXIubGluZSA9PSBwb3MubGluZSAmJiAoZGlmZiA9IGNtcChuZWFyLCBvbGRQb3MpKSAmJiAoZGlyIDwgMCA/IGRpZmYgPCAwIDogZGlmZiA+IDApKQogICAgICAgICAgeyByZXR1cm4gc2tpcEF0b21pY0lubmVyKGRvYywgbmVhciwgcG9zLCBkaXIsIG1heUNsZWFyKSB9CiAgICAgIH0KCiAgICAgIHZhciBmYXIgPSBtLmZpbmQoZGlyIDwgMCA/IC0xIDogMSkKICAgICAgaWYgKGRpciA8IDAgPyBtLmluY2x1c2l2ZUxlZnQgOiBtLmluY2x1c2l2ZVJpZ2h0KQogICAgICAgIHsgZmFyID0gbW92ZVBvcyhkb2MsIGZhciwgZGlyLCBmYXIubGluZSA9PSBwb3MubGluZSA/IGxpbmUgOiBudWxsKSB9CiAgICAgIHJldHVybiBmYXIgPyBza2lwQXRvbWljSW5uZXIoZG9jLCBmYXIsIHBvcywgZGlyLCBtYXlDbGVhcikgOiBudWxsCiAgICB9CiAgfSB9CiAgcmV0dXJuIHBvcwp9CgovLyBFbnN1cmUgYSBnaXZlbiBwb3NpdGlvbiBpcyBub3QgaW5zaWRlIGFuIGF0b21pYyByYW5nZS4KZnVuY3Rpb24gc2tpcEF0b21pYyhkb2MsIHBvcywgb2xkUG9zLCBiaWFzLCBtYXlDbGVhcikgewogIHZhciBkaXIgPSBiaWFzIHx8IDEKICB2YXIgZm91bmQgPSBza2lwQXRvbWljSW5uZXIoZG9jLCBwb3MsIG9sZFBvcywgZGlyLCBtYXlDbGVhcikgfHwKICAgICAgKCFtYXlDbGVhciAmJiBza2lwQXRvbWljSW5uZXIoZG9jLCBwb3MsIG9sZFBvcywgZGlyLCB0cnVlKSkgfHwKICAgICAgc2tpcEF0b21pY0lubmVyKGRvYywgcG9zLCBvbGRQb3MsIC1kaXIsIG1heUNsZWFyKSB8fAogICAgICAoIW1heUNsZWFyICYmIHNraXBBdG9taWNJbm5lcihkb2MsIHBvcywgb2xkUG9zLCAtZGlyLCB0cnVlKSkKICBpZiAoIWZvdW5kKSB7CiAgICBkb2MuY2FudEVkaXQgPSB0cnVlCiAgICByZXR1cm4gUG9zKGRvYy5maXJzdCwgMCkKICB9CiAgcmV0dXJuIGZvdW5kCn0KCmZ1bmN0aW9uIG1vdmVQb3MoZG9jLCBwb3MsIGRpciwgbGluZSkgewogIGlmIChkaXIgPCAwICYmIHBvcy5jaCA9PSAwKSB7CiAgICBpZiAocG9zLmxpbmUgPiBkb2MuZmlyc3QpIHsgcmV0dXJuIGNsaXBQb3MoZG9jLCBQb3MocG9zLmxpbmUgLSAxKSkgfQogICAgZWxzZSB7IHJldHVybiBudWxsIH0KICB9IGVsc2UgaWYgKGRpciA+IDAgJiYgcG9zLmNoID09IChsaW5lIHx8IGdldExpbmUoZG9jLCBwb3MubGluZSkpLnRleHQubGVuZ3RoKSB7CiAgICBpZiAocG9zLmxpbmUgPCBkb2MuZmlyc3QgKyBkb2Muc2l6ZSAtIDEpIHsgcmV0dXJuIFBvcyhwb3MubGluZSArIDEsIDApIH0KICAgIGVsc2UgeyByZXR1cm4gbnVsbCB9CiAgfSBlbHNlIHsKICAgIHJldHVybiBuZXcgUG9zKHBvcy5saW5lLCBwb3MuY2ggKyBkaXIpCiAgfQp9CgpmdW5jdGlvbiBzZWxlY3RBbGwoY20pIHsKICBjbS5zZXRTZWxlY3Rpb24oUG9zKGNtLmZpcnN0TGluZSgpLCAwKSwgUG9zKGNtLmxhc3RMaW5lKCkpLCBzZWxfZG9udFNjcm9sbCkKfQoKLy8gVVBEQVRJTkcKCi8vIEFsbG93ICJiZWZvcmVDaGFuZ2UiIGV2ZW50IGhhbmRsZXJzIHRvIGluZmx1ZW5jZSBhIGNoYW5nZQpmdW5jdGlvbiBmaWx0ZXJDaGFuZ2UoZG9jLCBjaGFuZ2UsIHVwZGF0ZSkgewogIHZhciBvYmogPSB7CiAgICBjYW5jZWxlZDogZmFsc2UsCiAgICBmcm9tOiBjaGFuZ2UuZnJvbSwKICAgIHRvOiBjaGFuZ2UudG8sCiAgICB0ZXh0OiBjaGFuZ2UudGV4dCwKICAgIG9yaWdpbjogY2hhbmdlLm9yaWdpbiwKICAgIGNhbmNlbDogZnVuY3Rpb24gKCkgeyByZXR1cm4gb2JqLmNhbmNlbGVkID0gdHJ1ZTsgfQogIH0KICBpZiAodXBkYXRlKSB7IG9iai51cGRhdGUgPSBmdW5jdGlvbiAoZnJvbSwgdG8sIHRleHQsIG9yaWdpbikgewogICAgaWYgKGZyb20pIHsgb2JqLmZyb20gPSBjbGlwUG9zKGRvYywgZnJvbSkgfQogICAgaWYgKHRvKSB7IG9iai50byA9IGNsaXBQb3MoZG9jLCB0bykgfQogICAgaWYgKHRleHQpIHsgb2JqLnRleHQgPSB0ZXh0IH0KICAgIGlmIChvcmlnaW4gIT09IHVuZGVmaW5lZCkgeyBvYmoub3JpZ2luID0gb3JpZ2luIH0KICB9IH0KICBzaWduYWwoZG9jLCAiYmVmb3JlQ2hhbmdlIiwgZG9jLCBvYmopCiAgaWYgKGRvYy5jbSkgeyBzaWduYWwoZG9jLmNtLCAiYmVmb3JlQ2hhbmdlIiwgZG9jLmNtLCBvYmopIH0KCiAgaWYgKG9iai5jYW5jZWxlZCkgeyByZXR1cm4gbnVsbCB9CiAgcmV0dXJuIHtmcm9tOiBvYmouZnJvbSwgdG86IG9iai50bywgdGV4dDogb2JqLnRleHQsIG9yaWdpbjogb2JqLm9yaWdpbn0KfQoKLy8gQXBwbHkgYSBjaGFuZ2UgdG8gYSBkb2N1bWVudCwgYW5kIGFkZCBpdCB0byB0aGUgZG9jdW1lbnQncwovLyBoaXN0b3J5LCBhbmQgcHJvcGFnYXRpbmcgaXQgdG8gYWxsIGxpbmtlZCBkb2N1bWVudHMuCmZ1bmN0aW9uIG1ha2VDaGFuZ2UoZG9jLCBjaGFuZ2UsIGlnbm9yZVJlYWRPbmx5KSB7CiAgaWYgKGRvYy5jbSkgewogICAgaWYgKCFkb2MuY20uY3VyT3ApIHsgcmV0dXJuIG9wZXJhdGlvbihkb2MuY20sIG1ha2VDaGFuZ2UpKGRvYywgY2hhbmdlLCBpZ25vcmVSZWFkT25seSkgfQogICAgaWYgKGRvYy5jbS5zdGF0ZS5zdXBwcmVzc0VkaXRzKSB7IHJldHVybiB9CiAgfQoKICBpZiAoaGFzSGFuZGxlcihkb2MsICJiZWZvcmVDaGFuZ2UiKSB8fCBkb2MuY20gJiYgaGFzSGFuZGxlcihkb2MuY20sICJiZWZvcmVDaGFuZ2UiKSkgewogICAgY2hhbmdlID0gZmlsdGVyQ2hhbmdlKGRvYywgY2hhbmdlLCB0cnVlKQogICAgaWYgKCFjaGFuZ2UpIHsgcmV0dXJuIH0KICB9CgogIC8vIFBvc3NpYmx5IHNwbGl0IG9yIHN1cHByZXNzIHRoZSB1cGRhdGUgYmFzZWQgb24gdGhlIHByZXNlbmNlCiAgLy8gb2YgcmVhZC1vbmx5IHNwYW5zIGluIGl0cyByYW5nZS4KICB2YXIgc3BsaXQgPSBzYXdSZWFkT25seVNwYW5zICYmICFpZ25vcmVSZWFkT25seSAmJiByZW1vdmVSZWFkT25seVJhbmdlcyhkb2MsIGNoYW5nZS5mcm9tLCBjaGFuZ2UudG8pCiAgaWYgKHNwbGl0KSB7CiAgICBmb3IgKHZhciBpID0gc3BsaXQubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpCiAgICAgIHsgbWFrZUNoYW5nZUlubmVyKGRvYywge2Zyb206IHNwbGl0W2ldLmZyb20sIHRvOiBzcGxpdFtpXS50bywgdGV4dDogaSA/IFsiIl0gOiBjaGFuZ2UudGV4dH0pIH0KICB9IGVsc2UgewogICAgbWFrZUNoYW5nZUlubmVyKGRvYywgY2hhbmdlKQogIH0KfQoKZnVuY3Rpb24gbWFrZUNoYW5nZUlubmVyKGRvYywgY2hhbmdlKSB7CiAgaWYgKGNoYW5nZS50ZXh0Lmxlbmd0aCA9PSAxICYmIGNoYW5nZS50ZXh0WzBdID09ICIiICYmIGNtcChjaGFuZ2UuZnJvbSwgY2hhbmdlLnRvKSA9PSAwKSB7IHJldHVybiB9CiAgdmFyIHNlbEFmdGVyID0gY29tcHV0ZVNlbEFmdGVyQ2hhbmdlKGRvYywgY2hhbmdlKQogIGFkZENoYW5nZVRvSGlzdG9yeShkb2MsIGNoYW5nZSwgc2VsQWZ0ZXIsIGRvYy5jbSA/IGRvYy5jbS5jdXJPcC5pZCA6IE5hTikKCiAgbWFrZUNoYW5nZVNpbmdsZURvYyhkb2MsIGNoYW5nZSwgc2VsQWZ0ZXIsIHN0cmV0Y2hTcGFuc092ZXJDaGFuZ2UoZG9jLCBjaGFuZ2UpKQogIHZhciByZWJhc2VkID0gW10KCiAgbGlua2VkRG9jcyhkb2MsIGZ1bmN0aW9uIChkb2MsIHNoYXJlZEhpc3QpIHsKICAgIGlmICghc2hhcmVkSGlzdCAmJiBpbmRleE9mKHJlYmFzZWQsIGRvYy5oaXN0b3J5KSA9PSAtMSkgewogICAgICByZWJhc2VIaXN0KGRvYy5oaXN0b3J5LCBjaGFuZ2UpCiAgICAgIHJlYmFzZWQucHVzaChkb2MuaGlzdG9yeSkKICAgIH0KICAgIG1ha2VDaGFuZ2VTaW5nbGVEb2MoZG9jLCBjaGFuZ2UsIG51bGwsIHN0cmV0Y2hTcGFuc092ZXJDaGFuZ2UoZG9jLCBjaGFuZ2UpKQogIH0pCn0KCi8vIFJldmVydCBhIGNoYW5nZSBzdG9yZWQgaW4gYSBkb2N1bWVudCdzIGhpc3RvcnkuCmZ1bmN0aW9uIG1ha2VDaGFuZ2VGcm9tSGlzdG9yeShkb2MsIHR5cGUsIGFsbG93U2VsZWN0aW9uT25seSkgewogIGlmIChkb2MuY20gJiYgZG9jLmNtLnN0YXRlLnN1cHByZXNzRWRpdHMgJiYgIWFsbG93U2VsZWN0aW9uT25seSkgeyByZXR1cm4gfQoKICB2YXIgaGlzdCA9IGRvYy5oaXN0b3J5LCBldmVudCwgc2VsQWZ0ZXIgPSBkb2Muc2VsCiAgdmFyIHNvdXJjZSA9IHR5cGUgPT0gInVuZG8iID8gaGlzdC5kb25lIDogaGlzdC51bmRvbmUsIGRlc3QgPSB0eXBlID09ICJ1bmRvIiA/IGhpc3QudW5kb25lIDogaGlzdC5kb25lCgogIC8vIFZlcmlmeSB0aGF0IHRoZXJlIGlzIGEgdXNlYWJsZSBldmVudCAoc28gdGhhdCBjdHJsLXogd29uJ3QKICAvLyBuZWVkbGVzc2x5IGNsZWFyIHNlbGVjdGlvbiBldmVudHMpCiAgdmFyIGkgPSAwCiAgZm9yICg7IGkgPCBzb3VyY2UubGVuZ3RoOyBpKyspIHsKICAgIGV2ZW50ID0gc291cmNlW2ldCiAgICBpZiAoYWxsb3dTZWxlY3Rpb25Pbmx5ID8gZXZlbnQucmFuZ2VzICYmICFldmVudC5lcXVhbHMoZG9jLnNlbCkgOiAhZXZlbnQucmFuZ2VzKQogICAgICB7IGJyZWFrIH0KICB9CiAgaWYgKGkgPT0gc291cmNlLmxlbmd0aCkgeyByZXR1cm4gfQogIGhpc3QubGFzdE9yaWdpbiA9IGhpc3QubGFzdFNlbE9yaWdpbiA9IG51bGwKCiAgZm9yICg7OykgewogICAgZXZlbnQgPSBzb3VyY2UucG9wKCkKICAgIGlmIChldmVudC5yYW5nZXMpIHsKICAgICAgcHVzaFNlbGVjdGlvblRvSGlzdG9yeShldmVudCwgZGVzdCkKICAgICAgaWYgKGFsbG93U2VsZWN0aW9uT25seSAmJiAhZXZlbnQuZXF1YWxzKGRvYy5zZWwpKSB7CiAgICAgICAgc2V0U2VsZWN0aW9uKGRvYywgZXZlbnQsIHtjbGVhclJlZG86IGZhbHNlfSkKICAgICAgICByZXR1cm4KICAgICAgfQogICAgICBzZWxBZnRlciA9IGV2ZW50CiAgICB9CiAgICBlbHNlIHsgYnJlYWsgfQogIH0KCiAgLy8gQnVpbGQgdXAgYSByZXZlcnNlIGNoYW5nZSBvYmplY3QgdG8gYWRkIHRvIHRoZSBvcHBvc2l0ZSBoaXN0b3J5CiAgLy8gc3RhY2sgKHJlZG8gd2hlbiB1bmRvaW5nLCBhbmQgdmljZSB2ZXJzYSkuCiAgdmFyIGFudGlDaGFuZ2VzID0gW10KICBwdXNoU2VsZWN0aW9uVG9IaXN0b3J5KHNlbEFmdGVyLCBkZXN0KQogIGRlc3QucHVzaCh7Y2hhbmdlczogYW50aUNoYW5nZXMsIGdlbmVyYXRpb246IGhpc3QuZ2VuZXJhdGlvbn0pCiAgaGlzdC5nZW5lcmF0aW9uID0gZXZlbnQuZ2VuZXJhdGlvbiB8fCArK2hpc3QubWF4R2VuZXJhdGlvbgoKICB2YXIgZmlsdGVyID0gaGFzSGFuZGxlcihkb2MsICJiZWZvcmVDaGFuZ2UiKSB8fCBkb2MuY20gJiYgaGFzSGFuZGxlcihkb2MuY20sICJiZWZvcmVDaGFuZ2UiKQoKICB2YXIgbG9vcCA9IGZ1bmN0aW9uICggaSApIHsKICAgIHZhciBjaGFuZ2UgPSBldmVudC5jaGFuZ2VzW2ldCiAgICBjaGFuZ2Uub3JpZ2luID0gdHlwZQogICAgaWYgKGZpbHRlciAmJiAhZmlsdGVyQ2hhbmdlKGRvYywgY2hhbmdlLCBmYWxzZSkpIHsKICAgICAgc291cmNlLmxlbmd0aCA9IDAKICAgICAgcmV0dXJuIHt9CiAgICB9CgogICAgYW50aUNoYW5nZXMucHVzaChoaXN0b3J5Q2hhbmdlRnJvbUNoYW5nZShkb2MsIGNoYW5nZSkpCgogICAgdmFyIGFmdGVyID0gaSA/IGNvbXB1dGVTZWxBZnRlckNoYW5nZShkb2MsIGNoYW5nZSkgOiBsc3Qoc291cmNlKQogICAgbWFrZUNoYW5nZVNpbmdsZURvYyhkb2MsIGNoYW5nZSwgYWZ0ZXIsIG1lcmdlT2xkU3BhbnMoZG9jLCBjaGFuZ2UpKQogICAgaWYgKCFpICYmIGRvYy5jbSkgeyBkb2MuY20uc2Nyb2xsSW50b1ZpZXcoe2Zyb206IGNoYW5nZS5mcm9tLCB0bzogY2hhbmdlRW5kKGNoYW5nZSl9KSB9CiAgICB2YXIgcmViYXNlZCA9IFtdCgogICAgLy8gUHJvcGFnYXRlIHRvIHRoZSBsaW5rZWQgZG9jdW1lbnRzCiAgICBsaW5rZWREb2NzKGRvYywgZnVuY3Rpb24gKGRvYywgc2hhcmVkSGlzdCkgewogICAgICBpZiAoIXNoYXJlZEhpc3QgJiYgaW5kZXhPZihyZWJhc2VkLCBkb2MuaGlzdG9yeSkgPT0gLTEpIHsKICAgICAgICByZWJhc2VIaXN0KGRvYy5oaXN0b3J5LCBjaGFuZ2UpCiAgICAgICAgcmViYXNlZC5wdXNoKGRvYy5oaXN0b3J5KQogICAgICB9CiAgICAgIG1ha2VDaGFuZ2VTaW5nbGVEb2MoZG9jLCBjaGFuZ2UsIG51bGwsIG1lcmdlT2xkU3BhbnMoZG9jLCBjaGFuZ2UpKQogICAgfSkKICB9OwoKICBmb3IgKHZhciBpJDEgPSBldmVudC5jaGFuZ2VzLmxlbmd0aCAtIDE7IGkkMSA+PSAwOyAtLWkkMSkgewogICAgdmFyIHJldHVybmVkID0gbG9vcCggaSQxICk7CgogICAgaWYgKCByZXR1cm5lZCApIHJldHVybiByZXR1cm5lZC52OwogIH0KfQoKLy8gU3ViLXZpZXdzIG5lZWQgdGhlaXIgbGluZSBudW1iZXJzIHNoaWZ0ZWQgd2hlbiB0ZXh0IGlzIGFkZGVkCi8vIGFib3ZlIG9yIGJlbG93IHRoZW0gaW4gdGhlIHBhcmVudCBkb2N1bWVudC4KZnVuY3Rpb24gc2hpZnREb2MoZG9jLCBkaXN0YW5jZSkgewogIGlmIChkaXN0YW5jZSA9PSAwKSB7IHJldHVybiB9CiAgZG9jLmZpcnN0ICs9IGRpc3RhbmNlCiAgZG9jLnNlbCA9IG5ldyBTZWxlY3Rpb24obWFwKGRvYy5zZWwucmFuZ2VzLCBmdW5jdGlvbiAocmFuZ2UpIHsgcmV0dXJuIG5ldyBSYW5nZSgKICAgIFBvcyhyYW5nZS5hbmNob3IubGluZSArIGRpc3RhbmNlLCByYW5nZS5hbmNob3IuY2gpLAogICAgUG9zKHJhbmdlLmhlYWQubGluZSArIGRpc3RhbmNlLCByYW5nZS5oZWFkLmNoKQogICk7IH0pLCBkb2Muc2VsLnByaW1JbmRleCkKICBpZiAoZG9jLmNtKSB7CiAgICByZWdDaGFuZ2UoZG9jLmNtLCBkb2MuZmlyc3QsIGRvYy5maXJzdCAtIGRpc3RhbmNlLCBkaXN0YW5jZSkKICAgIGZvciAodmFyIGQgPSBkb2MuY20uZGlzcGxheSwgbCA9IGQudmlld0Zyb207IGwgPCBkLnZpZXdUbzsgbCsrKQogICAgICB7IHJlZ0xpbmVDaGFuZ2UoZG9jLmNtLCBsLCAiZ3V0dGVyIikgfQogIH0KfQoKLy8gTW9yZSBsb3dlci1sZXZlbCBjaGFuZ2UgZnVuY3Rpb24sIGhhbmRsaW5nIG9ubHkgYSBzaW5nbGUgZG9jdW1lbnQKLy8gKG5vdCBsaW5rZWQgb25lcykuCmZ1bmN0aW9uIG1ha2VDaGFuZ2VTaW5nbGVEb2MoZG9jLCBjaGFuZ2UsIHNlbEFmdGVyLCBzcGFucykgewogIGlmIChkb2MuY20gJiYgIWRvYy5jbS5jdXJPcCkKICAgIHsgcmV0dXJuIG9wZXJhdGlvbihkb2MuY20sIG1ha2VDaGFuZ2VTaW5nbGVEb2MpKGRvYywgY2hhbmdlLCBzZWxBZnRlciwgc3BhbnMpIH0KCiAgaWYgKGNoYW5nZS50by5saW5lIDwgZG9jLmZpcnN0KSB7CiAgICBzaGlmdERvYyhkb2MsIGNoYW5nZS50ZXh0Lmxlbmd0aCAtIDEgLSAoY2hhbmdlLnRvLmxpbmUgLSBjaGFuZ2UuZnJvbS5saW5lKSkKICAgIHJldHVybgogIH0KICBpZiAoY2hhbmdlLmZyb20ubGluZSA+IGRvYy5sYXN0TGluZSgpKSB7IHJldHVybiB9CgogIC8vIENsaXAgdGhlIGNoYW5nZSB0byB0aGUgc2l6ZSBvZiB0aGlzIGRvYwogIGlmIChjaGFuZ2UuZnJvbS5saW5lIDwgZG9jLmZpcnN0KSB7CiAgICB2YXIgc2hpZnQgPSBjaGFuZ2UudGV4dC5sZW5ndGggLSAxIC0gKGRvYy5maXJzdCAtIGNoYW5nZS5mcm9tLmxpbmUpCiAgICBzaGlmdERvYyhkb2MsIHNoaWZ0KQogICAgY2hhbmdlID0ge2Zyb206IFBvcyhkb2MuZmlyc3QsIDApLCB0bzogUG9zKGNoYW5nZS50by5saW5lICsgc2hpZnQsIGNoYW5nZS50by5jaCksCiAgICAgICAgICAgICAgdGV4dDogW2xzdChjaGFuZ2UudGV4dCldLCBvcmlnaW46IGNoYW5nZS5vcmlnaW59CiAgfQogIHZhciBsYXN0ID0gZG9jLmxhc3RMaW5lKCkKICBpZiAoY2hhbmdlLnRvLmxpbmUgPiBsYXN0KSB7CiAgICBjaGFuZ2UgPSB7ZnJvbTogY2hhbmdlLmZyb20sIHRvOiBQb3MobGFzdCwgZ2V0TGluZShkb2MsIGxhc3QpLnRleHQubGVuZ3RoKSwKICAgICAgICAgICAgICB0ZXh0OiBbY2hhbmdlLnRleHRbMF1dLCBvcmlnaW46IGNoYW5nZS5vcmlnaW59CiAgfQoKICBjaGFuZ2UucmVtb3ZlZCA9IGdldEJldHdlZW4oZG9jLCBjaGFuZ2UuZnJvbSwgY2hhbmdlLnRvKQoKICBpZiAoIXNlbEFmdGVyKSB7IHNlbEFmdGVyID0gY29tcHV0ZVNlbEFmdGVyQ2hhbmdlKGRvYywgY2hhbmdlKSB9CiAgaWYgKGRvYy5jbSkgeyBtYWtlQ2hhbmdlU2luZ2xlRG9jSW5FZGl0b3IoZG9jLmNtLCBjaGFuZ2UsIHNwYW5zKSB9CiAgZWxzZSB7IHVwZGF0ZURvYyhkb2MsIGNoYW5nZSwgc3BhbnMpIH0KICBzZXRTZWxlY3Rpb25Ob1VuZG8oZG9jLCBzZWxBZnRlciwgc2VsX2RvbnRTY3JvbGwpCn0KCi8vIEhhbmRsZSB0aGUgaW50ZXJhY3Rpb24gb2YgYSBjaGFuZ2UgdG8gYSBkb2N1bWVudCB3aXRoIHRoZSBlZGl0b3IKLy8gdGhhdCB0aGlzIGRvY3VtZW50IGlzIHBhcnQgb2YuCmZ1bmN0aW9uIG1ha2VDaGFuZ2VTaW5nbGVEb2NJbkVkaXRvcihjbSwgY2hhbmdlLCBzcGFucykgewogIHZhciBkb2MgPSBjbS5kb2MsIGRpc3BsYXkgPSBjbS5kaXNwbGF5LCBmcm9tID0gY2hhbmdlLmZyb20sIHRvID0gY2hhbmdlLnRvCgogIHZhciByZWNvbXB1dGVNYXhMZW5ndGggPSBmYWxzZSwgY2hlY2tXaWR0aFN0YXJ0ID0gZnJvbS5saW5lCiAgaWYgKCFjbS5vcHRpb25zLmxpbmVXcmFwcGluZykgewogICAgY2hlY2tXaWR0aFN0YXJ0ID0gbGluZU5vKHZpc3VhbExpbmUoZ2V0TGluZShkb2MsIGZyb20ubGluZSkpKQogICAgZG9jLml0ZXIoY2hlY2tXaWR0aFN0YXJ0LCB0by5saW5lICsgMSwgZnVuY3Rpb24gKGxpbmUpIHsKICAgICAgaWYgKGxpbmUgPT0gZGlzcGxheS5tYXhMaW5lKSB7CiAgICAgICAgcmVjb21wdXRlTWF4TGVuZ3RoID0gdHJ1ZQogICAgICAgIHJldHVybiB0cnVlCiAgICAgIH0KICAgIH0pCiAgfQoKICBpZiAoZG9jLnNlbC5jb250YWlucyhjaGFuZ2UuZnJvbSwgY2hhbmdlLnRvKSA+IC0xKQogICAgeyBzaWduYWxDdXJzb3JBY3Rpdml0eShjbSkgfQoKICB1cGRhdGVEb2MoZG9jLCBjaGFuZ2UsIHNwYW5zLCBlc3RpbWF0ZUhlaWdodChjbSkpCgogIGlmICghY20ub3B0aW9ucy5saW5lV3JhcHBpbmcpIHsKICAgIGRvYy5pdGVyKGNoZWNrV2lkdGhTdGFydCwgZnJvbS5saW5lICsgY2hhbmdlLnRleHQubGVuZ3RoLCBmdW5jdGlvbiAobGluZSkgewogICAgICB2YXIgbGVuID0gbGluZUxlbmd0aChsaW5lKQogICAgICBpZiAobGVuID4gZGlzcGxheS5tYXhMaW5lTGVuZ3RoKSB7CiAgICAgICAgZGlzcGxheS5tYXhMaW5lID0gbGluZQogICAgICAgIGRpc3BsYXkubWF4TGluZUxlbmd0aCA9IGxlbgogICAgICAgIGRpc3BsYXkubWF4TGluZUNoYW5nZWQgPSB0cnVlCiAgICAgICAgcmVjb21wdXRlTWF4TGVuZ3RoID0gZmFsc2UKICAgICAgfQogICAgfSkKICAgIGlmIChyZWNvbXB1dGVNYXhMZW5ndGgpIHsgY20uY3VyT3AudXBkYXRlTWF4TGluZSA9IHRydWUgfQogIH0KCiAgLy8gQWRqdXN0IGZyb250aWVyLCBzY2hlZHVsZSB3b3JrZXIKICBkb2MuZnJvbnRpZXIgPSBNYXRoLm1pbihkb2MuZnJvbnRpZXIsIGZyb20ubGluZSkKICBzdGFydFdvcmtlcihjbSwgNDAwKQoKICB2YXIgbGVuZGlmZiA9IGNoYW5nZS50ZXh0Lmxlbmd0aCAtICh0by5saW5lIC0gZnJvbS5saW5lKSAtIDEKICAvLyBSZW1lbWJlciB0aGF0IHRoZXNlIGxpbmVzIGNoYW5nZWQsIGZvciB1cGRhdGluZyB0aGUgZGlzcGxheQogIGlmIChjaGFuZ2UuZnVsbCkKICAgIHsgcmVnQ2hhbmdlKGNtKSB9CiAgZWxzZSBpZiAoZnJvbS5saW5lID09IHRvLmxpbmUgJiYgY2hhbmdlLnRleHQubGVuZ3RoID09IDEgJiYgIWlzV2hvbGVMaW5lVXBkYXRlKGNtLmRvYywgY2hhbmdlKSkKICAgIHsgcmVnTGluZUNoYW5nZShjbSwgZnJvbS5saW5lLCAidGV4dCIpIH0KICBlbHNlCiAgICB7IHJlZ0NoYW5nZShjbSwgZnJvbS5saW5lLCB0by5saW5lICsgMSwgbGVuZGlmZikgfQoKICB2YXIgY2hhbmdlc0hhbmRsZXIgPSBoYXNIYW5kbGVyKGNtLCAiY2hhbmdlcyIpLCBjaGFuZ2VIYW5kbGVyID0gaGFzSGFuZGxlcihjbSwgImNoYW5nZSIpCiAgaWYgKGNoYW5nZUhhbmRsZXIgfHwgY2hhbmdlc0hhbmRsZXIpIHsKICAgIHZhciBvYmogPSB7CiAgICAgIGZyb206IGZyb20sIHRvOiB0bywKICAgICAgdGV4dDogY2hhbmdlLnRleHQsCiAgICAgIHJlbW92ZWQ6IGNoYW5nZS5yZW1vdmVkLAogICAgICBvcmlnaW46IGNoYW5nZS5vcmlnaW4KICAgIH0KICAgIGlmIChjaGFuZ2VIYW5kbGVyKSB7IHNpZ25hbExhdGVyKGNtLCAiY2hhbmdlIiwgY20sIG9iaikgfQogICAgaWYgKGNoYW5nZXNIYW5kbGVyKSB7IChjbS5jdXJPcC5jaGFuZ2VPYmpzIHx8IChjbS5jdXJPcC5jaGFuZ2VPYmpzID0gW10pKS5wdXNoKG9iaikgfQogIH0KICBjbS5kaXNwbGF5LnNlbEZvckNvbnRleHRNZW51ID0gbnVsbAp9CgpmdW5jdGlvbiByZXBsYWNlUmFuZ2UoZG9jLCBjb2RlLCBmcm9tLCB0bywgb3JpZ2luKSB7CiAgaWYgKCF0bykgeyB0byA9IGZyb20gfQogIGlmIChjbXAodG8sIGZyb20pIDwgMCkgeyB2YXIgdG1wID0gdG87IHRvID0gZnJvbTsgZnJvbSA9IHRtcCB9CiAgaWYgKHR5cGVvZiBjb2RlID09ICJzdHJpbmciKSB7IGNvZGUgPSBkb2Muc3BsaXRMaW5lcyhjb2RlKSB9CiAgbWFrZUNoYW5nZShkb2MsIHtmcm9tOiBmcm9tLCB0bzogdG8sIHRleHQ6IGNvZGUsIG9yaWdpbjogb3JpZ2lufSkKfQoKLy8gUmViYXNpbmcvcmVzZXR0aW5nIGhpc3RvcnkgdG8gZGVhbCB3aXRoIGV4dGVybmFsbHktc291cmNlZCBjaGFuZ2VzCgpmdW5jdGlvbiByZWJhc2VIaXN0U2VsU2luZ2xlKHBvcywgZnJvbSwgdG8sIGRpZmYpIHsKICBpZiAodG8gPCBwb3MubGluZSkgewogICAgcG9zLmxpbmUgKz0gZGlmZgogIH0gZWxzZSBpZiAoZnJvbSA8IHBvcy5saW5lKSB7CiAgICBwb3MubGluZSA9IGZyb20KICAgIHBvcy5jaCA9IDAKICB9Cn0KCi8vIFRyaWVzIHRvIHJlYmFzZSBhbiBhcnJheSBvZiBoaXN0b3J5IGV2ZW50cyBnaXZlbiBhIGNoYW5nZSBpbiB0aGUKLy8gZG9jdW1lbnQuIElmIHRoZSBjaGFuZ2UgdG91Y2hlcyB0aGUgc2FtZSBsaW5lcyBhcyB0aGUgZXZlbnQsIHRoZQovLyBldmVudCwgYW5kIGV2ZXJ5dGhpbmcgJ2JlaGluZCcgaXQsIGlzIGRpc2NhcmRlZC4gSWYgdGhlIGNoYW5nZSBpcwovLyBiZWZvcmUgdGhlIGV2ZW50LCB0aGUgZXZlbnQncyBwb3NpdGlvbnMgYXJlIHVwZGF0ZWQuIFVzZXMgYQovLyBjb3B5LW9uLXdyaXRlIHNjaGVtZSBmb3IgdGhlIHBvc2l0aW9ucywgdG8gYXZvaWQgaGF2aW5nIHRvCi8vIHJlYWxsb2NhdGUgdGhlbSBhbGwgb24gZXZlcnkgcmViYXNlLCBidXQgYWxzbyBhdm9pZCBwcm9ibGVtcyB3aXRoCi8vIHNoYXJlZCBwb3NpdGlvbiBvYmplY3RzIGJlaW5nIHVuc2FmZWx5IHVwZGF0ZWQuCmZ1bmN0aW9uIHJlYmFzZUhpc3RBcnJheShhcnJheSwgZnJvbSwgdG8sIGRpZmYpIHsKICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgKytpKSB7CiAgICB2YXIgc3ViID0gYXJyYXlbaV0sIG9rID0gdHJ1ZQogICAgaWYgKHN1Yi5yYW5nZXMpIHsKICAgICAgaWYgKCFzdWIuY29waWVkKSB7IHN1YiA9IGFycmF5W2ldID0gc3ViLmRlZXBDb3B5KCk7IHN1Yi5jb3BpZWQgPSB0cnVlIH0KICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBzdWIucmFuZ2VzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgcmViYXNlSGlzdFNlbFNpbmdsZShzdWIucmFuZ2VzW2pdLmFuY2hvciwgZnJvbSwgdG8sIGRpZmYpCiAgICAgICAgcmViYXNlSGlzdFNlbFNpbmdsZShzdWIucmFuZ2VzW2pdLmhlYWQsIGZyb20sIHRvLCBkaWZmKQogICAgICB9CiAgICAgIGNvbnRpbnVlCiAgICB9CiAgICBmb3IgKHZhciBqJDEgPSAwOyBqJDEgPCBzdWIuY2hhbmdlcy5sZW5ndGg7ICsraiQxKSB7CiAgICAgIHZhciBjdXIgPSBzdWIuY2hhbmdlc1tqJDFdCiAgICAgIGlmICh0byA8IGN1ci5mcm9tLmxpbmUpIHsKICAgICAgICBjdXIuZnJvbSA9IFBvcyhjdXIuZnJvbS5saW5lICsgZGlmZiwgY3VyLmZyb20uY2gpCiAgICAgICAgY3VyLnRvID0gUG9zKGN1ci50by5saW5lICsgZGlmZiwgY3VyLnRvLmNoKQogICAgICB9IGVsc2UgaWYgKGZyb20gPD0gY3VyLnRvLmxpbmUpIHsKICAgICAgICBvayA9IGZhbHNlCiAgICAgICAgYnJlYWsKICAgICAgfQogICAgfQogICAgaWYgKCFvaykgewogICAgICBhcnJheS5zcGxpY2UoMCwgaSArIDEpCiAgICAgIGkgPSAwCiAgICB9CiAgfQp9CgpmdW5jdGlvbiByZWJhc2VIaXN0KGhpc3QsIGNoYW5nZSkgewogIHZhciBmcm9tID0gY2hhbmdlLmZyb20ubGluZSwgdG8gPSBjaGFuZ2UudG8ubGluZSwgZGlmZiA9IGNoYW5nZS50ZXh0Lmxlbmd0aCAtICh0byAtIGZyb20pIC0gMQogIHJlYmFzZUhpc3RBcnJheShoaXN0LmRvbmUsIGZyb20sIHRvLCBkaWZmKQogIHJlYmFzZUhpc3RBcnJheShoaXN0LnVuZG9uZSwgZnJvbSwgdG8sIGRpZmYpCn0KCi8vIFV0aWxpdHkgZm9yIGFwcGx5aW5nIGEgY2hhbmdlIHRvIGEgbGluZSBieSBoYW5kbGUgb3IgbnVtYmVyLAovLyByZXR1cm5pbmcgdGhlIG51bWJlciBhbmQgb3B0aW9uYWxseSByZWdpc3RlcmluZyB0aGUgbGluZSBhcwovLyBjaGFuZ2VkLgpmdW5jdGlvbiBjaGFuZ2VMaW5lKGRvYywgaGFuZGxlLCBjaGFuZ2VUeXBlLCBvcCkgewogIHZhciBubyA9IGhhbmRsZSwgbGluZSA9IGhhbmRsZQogIGlmICh0eXBlb2YgaGFuZGxlID09ICJudW1iZXIiKSB7IGxpbmUgPSBnZXRMaW5lKGRvYywgY2xpcExpbmUoZG9jLCBoYW5kbGUpKSB9CiAgZWxzZSB7IG5vID0gbGluZU5vKGhhbmRsZSkgfQogIGlmIChubyA9PSBudWxsKSB7IHJldHVybiBudWxsIH0KICBpZiAob3AobGluZSwgbm8pICYmIGRvYy5jbSkgeyByZWdMaW5lQ2hhbmdlKGRvYy5jbSwgbm8sIGNoYW5nZVR5cGUpIH0KICByZXR1cm4gbGluZQp9CgovLyBUaGUgZG9jdW1lbnQgaXMgcmVwcmVzZW50ZWQgYXMgYSBCVHJlZSBjb25zaXN0aW5nIG9mIGxlYXZlcywgd2l0aAovLyBjaHVuayBvZiBsaW5lcyBpbiB0aGVtLCBhbmQgYnJhbmNoZXMsIHdpdGggdXAgdG8gdGVuIGxlYXZlcyBvcgovLyBvdGhlciBicmFuY2ggbm9kZXMgYmVsb3cgdGhlbS4gVGhlIHRvcCBub2RlIGlzIGFsd2F5cyBhIGJyYW5jaAovLyBub2RlLCBhbmQgaXMgdGhlIGRvY3VtZW50IG9iamVjdCBpdHNlbGYgKG1lYW5pbmcgaXQgaGFzCi8vIGFkZGl0aW9uYWwgbWV0aG9kcyBhbmQgcHJvcGVydGllcykuCi8vCi8vIEFsbCBub2RlcyBoYXZlIHBhcmVudCBsaW5rcy4gVGhlIHRyZWUgaXMgdXNlZCBib3RoIHRvIGdvIGZyb20KLy8gbGluZSBudW1iZXJzIHRvIGxpbmUgb2JqZWN0cywgYW5kIHRvIGdvIGZyb20gb2JqZWN0cyB0byBudW1iZXJzLgovLyBJdCBhbHNvIGluZGV4ZXMgYnkgaGVpZ2h0LCBhbmQgaXMgdXNlZCB0byBjb252ZXJ0IGJldHdlZW4gaGVpZ2h0Ci8vIGFuZCBsaW5lIG9iamVjdCwgYW5kIHRvIGZpbmQgdGhlIHRvdGFsIGhlaWdodCBvZiB0aGUgZG9jdW1lbnQuCi8vCi8vIFNlZSBhbHNvIGh0dHA6Ly9tYXJpam5oYXZlcmJla2UubmwvYmxvZy9jb2RlbWlycm9yLWxpbmUtdHJlZS5odG1sCgpmdW5jdGlvbiBMZWFmQ2h1bmsobGluZXMpIHsKICB2YXIgdGhpcyQxID0gdGhpczsKCiAgdGhpcy5saW5lcyA9IGxpbmVzCiAgdGhpcy5wYXJlbnQgPSBudWxsCiAgdmFyIGhlaWdodCA9IDAKICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgKytpKSB7CiAgICBsaW5lc1tpXS5wYXJlbnQgPSB0aGlzJDEKICAgIGhlaWdodCArPSBsaW5lc1tpXS5oZWlnaHQKICB9CiAgdGhpcy5oZWlnaHQgPSBoZWlnaHQKfQoKTGVhZkNodW5rLnByb3RvdHlwZSA9IHsKICBjaHVua1NpemU6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5saW5lcy5sZW5ndGggfSwKICAvLyBSZW1vdmUgdGhlIG4gbGluZXMgYXQgb2Zmc2V0ICdhdCcuCiAgcmVtb3ZlSW5uZXI6IGZ1bmN0aW9uKGF0LCBuKSB7CiAgICB2YXIgdGhpcyQxID0gdGhpczsKCiAgICBmb3IgKHZhciBpID0gYXQsIGUgPSBhdCArIG47IGkgPCBlOyArK2kpIHsKICAgICAgdmFyIGxpbmUgPSB0aGlzJDEubGluZXNbaV0KICAgICAgdGhpcyQxLmhlaWdodCAtPSBsaW5lLmhlaWdodAogICAgICBjbGVhblVwTGluZShsaW5lKQogICAgICBzaWduYWxMYXRlcihsaW5lLCAiZGVsZXRlIikKICAgIH0KICAgIHRoaXMubGluZXMuc3BsaWNlKGF0LCBuKQogIH0sCiAgLy8gSGVscGVyIHVzZWQgdG8gY29sbGFwc2UgYSBzbWFsbCBicmFuY2ggaW50byBhIHNpbmdsZSBsZWFmLgogIGNvbGxhcHNlOiBmdW5jdGlvbihsaW5lcykgewogICAgbGluZXMucHVzaC5hcHBseShsaW5lcywgdGhpcy5saW5lcykKICB9LAogIC8vIEluc2VydCB0aGUgZ2l2ZW4gYXJyYXkgb2YgbGluZXMgYXQgb2Zmc2V0ICdhdCcsIGNvdW50IHRoZW0gYXMKICAvLyBoYXZpbmcgdGhlIGdpdmVuIGhlaWdodC4KICBpbnNlcnRJbm5lcjogZnVuY3Rpb24oYXQsIGxpbmVzLCBoZWlnaHQpIHsKICAgIHZhciB0aGlzJDEgPSB0aGlzOwoKICAgIHRoaXMuaGVpZ2h0ICs9IGhlaWdodAogICAgdGhpcy5saW5lcyA9IHRoaXMubGluZXMuc2xpY2UoMCwgYXQpLmNvbmNhdChsaW5lcykuY29uY2F0KHRoaXMubGluZXMuc2xpY2UoYXQpKQogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7ICsraSkgeyBsaW5lc1tpXS5wYXJlbnQgPSB0aGlzJDEgfQogIH0sCiAgLy8gVXNlZCB0byBpdGVyYXRlIG92ZXIgYSBwYXJ0IG9mIHRoZSB0cmVlLgogIGl0ZXJOOiBmdW5jdGlvbihhdCwgbiwgb3ApIHsKICAgIHZhciB0aGlzJDEgPSB0aGlzOwoKICAgIGZvciAodmFyIGUgPSBhdCArIG47IGF0IDwgZTsgKythdCkKICAgICAgeyBpZiAob3AodGhpcyQxLmxpbmVzW2F0XSkpIHsgcmV0dXJuIHRydWUgfSB9CiAgfQp9CgpmdW5jdGlvbiBCcmFuY2hDaHVuayhjaGlsZHJlbikgewogIHZhciB0aGlzJDEgPSB0aGlzOwoKICB0aGlzLmNoaWxkcmVuID0gY2hpbGRyZW4KICB2YXIgc2l6ZSA9IDAsIGhlaWdodCA9IDAKICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgKytpKSB7CiAgICB2YXIgY2ggPSBjaGlsZHJlbltpXQogICAgc2l6ZSArPSBjaC5jaHVua1NpemUoKTsgaGVpZ2h0ICs9IGNoLmhlaWdodAogICAgY2gucGFyZW50ID0gdGhpcyQxCiAgfQogIHRoaXMuc2l6ZSA9IHNpemUKICB0aGlzLmhlaWdodCA9IGhlaWdodAogIHRoaXMucGFyZW50ID0gbnVsbAp9CgpCcmFuY2hDaHVuay5wcm90b3R5cGUgPSB7CiAgY2h1bmtTaXplOiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuc2l6ZSB9LAogIHJlbW92ZUlubmVyOiBmdW5jdGlvbihhdCwgbikgewogICAgdmFyIHRoaXMkMSA9IHRoaXM7CgogICAgdGhpcy5zaXplIC09IG4KICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7ICsraSkgewogICAgICB2YXIgY2hpbGQgPSB0aGlzJDEuY2hpbGRyZW5baV0sIHN6ID0gY2hpbGQuY2h1bmtTaXplKCkKICAgICAgaWYgKGF0IDwgc3opIHsKICAgICAgICB2YXIgcm0gPSBNYXRoLm1pbihuLCBzeiAtIGF0KSwgb2xkSGVpZ2h0ID0gY2hpbGQuaGVpZ2h0CiAgICAgICAgY2hpbGQucmVtb3ZlSW5uZXIoYXQsIHJtKQogICAgICAgIHRoaXMkMS5oZWlnaHQgLT0gb2xkSGVpZ2h0IC0gY2hpbGQuaGVpZ2h0CiAgICAgICAgaWYgKHN6ID09IHJtKSB7IHRoaXMkMS5jaGlsZHJlbi5zcGxpY2UoaS0tLCAxKTsgY2hpbGQucGFyZW50ID0gbnVsbCB9CiAgICAgICAgaWYgKChuIC09IHJtKSA9PSAwKSB7IGJyZWFrIH0KICAgICAgICBhdCA9IDAKICAgICAgfSBlbHNlIHsgYXQgLT0gc3ogfQogICAgfQogICAgLy8gSWYgdGhlIHJlc3VsdCBpcyBzbWFsbGVyIHRoYW4gMjUgbGluZXMsIGVuc3VyZSB0aGF0IGl0IGlzIGEKICAgIC8vIHNpbmdsZSBsZWFmIG5vZGUuCiAgICBpZiAodGhpcy5zaXplIC0gbiA8IDI1ICYmCiAgICAgICAgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID4gMSB8fCAhKHRoaXMuY2hpbGRyZW5bMF0gaW5zdGFuY2VvZiBMZWFmQ2h1bmspKSkgewogICAgICB2YXIgbGluZXMgPSBbXQogICAgICB0aGlzLmNvbGxhcHNlKGxpbmVzKQogICAgICB0aGlzLmNoaWxkcmVuID0gW25ldyBMZWFmQ2h1bmsobGluZXMpXQogICAgICB0aGlzLmNoaWxkcmVuWzBdLnBhcmVudCA9IHRoaXMKICAgIH0KICB9LAogIGNvbGxhcHNlOiBmdW5jdGlvbihsaW5lcykgewogICAgdmFyIHRoaXMkMSA9IHRoaXM7CgogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgKytpKSB7IHRoaXMkMS5jaGlsZHJlbltpXS5jb2xsYXBzZShsaW5lcykgfQogIH0sCiAgaW5zZXJ0SW5uZXI6IGZ1bmN0aW9uKGF0LCBsaW5lcywgaGVpZ2h0KSB7CiAgICB2YXIgdGhpcyQxID0gdGhpczsKCiAgICB0aGlzLnNpemUgKz0gbGluZXMubGVuZ3RoCiAgICB0aGlzLmhlaWdodCArPSBoZWlnaHQKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7ICsraSkgewogICAgICB2YXIgY2hpbGQgPSB0aGlzJDEuY2hpbGRyZW5baV0sIHN6ID0gY2hpbGQuY2h1bmtTaXplKCkKICAgICAgaWYgKGF0IDw9IHN6KSB7CiAgICAgICAgY2hpbGQuaW5zZXJ0SW5uZXIoYXQsIGxpbmVzLCBoZWlnaHQpCiAgICAgICAgaWYgKGNoaWxkLmxpbmVzICYmIGNoaWxkLmxpbmVzLmxlbmd0aCA+IDUwKSB7CiAgICAgICAgICAvLyBUbyBhdm9pZCBtZW1vcnkgdGhyYXNoaW5nIHdoZW4gY2hpbGQubGluZXMgaXMgaHVnZSAoZS5nLiBmaXJzdCB2aWV3IG9mIGEgbGFyZ2UgZmlsZSksIGl0J3MgbmV2ZXIgc3BsaWNlZC4KICAgICAgICAgIC8vIEluc3RlYWQsIHNtYWxsIHNsaWNlcyBhcmUgdGFrZW4uIFRoZXkncmUgdGFrZW4gaW4gb3JkZXIgYmVjYXVzZSBzZXF1ZW50aWFsIG1lbW9yeSBhY2Nlc3NlcyBhcmUgZmFzdGVzdC4KICAgICAgICAgIHZhciByZW1haW5pbmcgPSBjaGlsZC5saW5lcy5sZW5ndGggJSAyNSArIDI1CiAgICAgICAgICBmb3IgKHZhciBwb3MgPSByZW1haW5pbmc7IHBvcyA8IGNoaWxkLmxpbmVzLmxlbmd0aDspIHsKICAgICAgICAgICAgdmFyIGxlYWYgPSBuZXcgTGVhZkNodW5rKGNoaWxkLmxpbmVzLnNsaWNlKHBvcywgcG9zICs9IDI1KSkKICAgICAgICAgICAgY2hpbGQuaGVpZ2h0IC09IGxlYWYuaGVpZ2h0CiAgICAgICAgICAgIHRoaXMkMS5jaGlsZHJlbi5zcGxpY2UoKytpLCAwLCBsZWFmKQogICAgICAgICAgICBsZWFmLnBhcmVudCA9IHRoaXMkMQogICAgICAgICAgfQogICAgICAgICAgY2hpbGQubGluZXMgPSBjaGlsZC5saW5lcy5zbGljZSgwLCByZW1haW5pbmcpCiAgICAgICAgICB0aGlzJDEubWF5YmVTcGlsbCgpCiAgICAgICAgfQogICAgICAgIGJyZWFrCiAgICAgIH0KICAgICAgYXQgLT0gc3oKICAgIH0KICB9LAogIC8vIFdoZW4gYSBub2RlIGhhcyBncm93biwgY2hlY2sgd2hldGhlciBpdCBzaG91bGQgYmUgc3BsaXQuCiAgbWF5YmVTcGlsbDogZnVuY3Rpb24oKSB7CiAgICBpZiAodGhpcy5jaGlsZHJlbi5sZW5ndGggPD0gMTApIHsgcmV0dXJuIH0KICAgIHZhciBtZSA9IHRoaXMKICAgIGRvIHsKICAgICAgdmFyIHNwaWxsZWQgPSBtZS5jaGlsZHJlbi5zcGxpY2UobWUuY2hpbGRyZW4ubGVuZ3RoIC0gNSwgNSkKICAgICAgdmFyIHNpYmxpbmcgPSBuZXcgQnJhbmNoQ2h1bmsoc3BpbGxlZCkKICAgICAgaWYgKCFtZS5wYXJlbnQpIHsgLy8gQmVjb21lIHRoZSBwYXJlbnQgbm9kZQogICAgICAgIHZhciBjb3B5ID0gbmV3IEJyYW5jaENodW5rKG1lLmNoaWxkcmVuKQogICAgICAgIGNvcHkucGFyZW50ID0gbWUKICAgICAgICBtZS5jaGlsZHJlbiA9IFtjb3B5LCBzaWJsaW5nXQogICAgICAgIG1lID0gY29weQogICAgIH0gZWxzZSB7CiAgICAgICAgbWUuc2l6ZSAtPSBzaWJsaW5nLnNpemUKICAgICAgICBtZS5oZWlnaHQgLT0gc2libGluZy5oZWlnaHQKICAgICAgICB2YXIgbXlJbmRleCA9IGluZGV4T2YobWUucGFyZW50LmNoaWxkcmVuLCBtZSkKICAgICAgICBtZS5wYXJlbnQuY2hpbGRyZW4uc3BsaWNlKG15SW5kZXggKyAxLCAwLCBzaWJsaW5nKQogICAgICB9CiAgICAgIHNpYmxpbmcucGFyZW50ID0gbWUucGFyZW50CiAgICB9IHdoaWxlIChtZS5jaGlsZHJlbi5sZW5ndGggPiAxMCkKICAgIG1lLnBhcmVudC5tYXliZVNwaWxsKCkKICB9LAogIGl0ZXJOOiBmdW5jdGlvbihhdCwgbiwgb3ApIHsKICAgIHZhciB0aGlzJDEgPSB0aGlzOwoKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7ICsraSkgewogICAgICB2YXIgY2hpbGQgPSB0aGlzJDEuY2hpbGRyZW5baV0sIHN6ID0gY2hpbGQuY2h1bmtTaXplKCkKICAgICAgaWYgKGF0IDwgc3opIHsKICAgICAgICB2YXIgdXNlZCA9IE1hdGgubWluKG4sIHN6IC0gYXQpCiAgICAgICAgaWYgKGNoaWxkLml0ZXJOKGF0LCB1c2VkLCBvcCkpIHsgcmV0dXJuIHRydWUgfQogICAgICAgIGlmICgobiAtPSB1c2VkKSA9PSAwKSB7IGJyZWFrIH0KICAgICAgICBhdCA9IDAKICAgICAgfSBlbHNlIHsgYXQgLT0gc3ogfQogICAgfQogIH0KfQoKLy8gTGluZSB3aWRnZXRzIGFyZSBibG9jayBlbGVtZW50cyBkaXNwbGF5ZWQgYWJvdmUgb3IgYmVsb3cgYSBsaW5lLgoKZnVuY3Rpb24gTGluZVdpZGdldChkb2MsIG5vZGUsIG9wdGlvbnMpIHsKICB2YXIgdGhpcyQxID0gdGhpczsKCiAgaWYgKG9wdGlvbnMpIHsgZm9yICh2YXIgb3B0IGluIG9wdGlvbnMpIHsgaWYgKG9wdGlvbnMuaGFzT3duUHJvcGVydHkob3B0KSkKICAgIHsgdGhpcyQxW29wdF0gPSBvcHRpb25zW29wdF0gfSB9IH0KICB0aGlzLmRvYyA9IGRvYwogIHRoaXMubm9kZSA9IG5vZGUKfQpldmVudE1peGluKExpbmVXaWRnZXQpCgpmdW5jdGlvbiBhZGp1c3RTY3JvbGxXaGVuQWJvdmVWaXNpYmxlKGNtLCBsaW5lLCBkaWZmKSB7CiAgaWYgKGhlaWdodEF0TGluZShsaW5lKSA8ICgoY20uY3VyT3AgJiYgY20uY3VyT3Auc2Nyb2xsVG9wKSB8fCBjbS5kb2Muc2Nyb2xsVG9wKSkKICAgIHsgYWRkVG9TY3JvbGxQb3MoY20sIG51bGwsIGRpZmYpIH0KfQoKTGluZVdpZGdldC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbigpIHsKICB2YXIgdGhpcyQxID0gdGhpczsKCiAgdmFyIGNtID0gdGhpcy5kb2MuY20sIHdzID0gdGhpcy5saW5lLndpZGdldHMsIGxpbmUgPSB0aGlzLmxpbmUsIG5vID0gbGluZU5vKGxpbmUpCiAgaWYgKG5vID09IG51bGwgfHwgIXdzKSB7IHJldHVybiB9CiAgZm9yICh2YXIgaSA9IDA7IGkgPCB3cy5sZW5ndGg7ICsraSkgeyBpZiAod3NbaV0gPT0gdGhpcyQxKSB7IHdzLnNwbGljZShpLS0sIDEpIH0gfQogIGlmICghd3MubGVuZ3RoKSB7IGxpbmUud2lkZ2V0cyA9IG51bGwgfQogIHZhciBoZWlnaHQgPSB3aWRnZXRIZWlnaHQodGhpcykKICB1cGRhdGVMaW5lSGVpZ2h0KGxpbmUsIE1hdGgubWF4KDAsIGxpbmUuaGVpZ2h0IC0gaGVpZ2h0KSkKICBpZiAoY20pIHsgcnVuSW5PcChjbSwgZnVuY3Rpb24gKCkgewogICAgYWRqdXN0U2Nyb2xsV2hlbkFib3ZlVmlzaWJsZShjbSwgbGluZSwgLWhlaWdodCkKICAgIHJlZ0xpbmVDaGFuZ2UoY20sIG5vLCAid2lkZ2V0IikKICB9KSB9Cn0KTGluZVdpZGdldC5wcm90b3R5cGUuY2hhbmdlZCA9IGZ1bmN0aW9uKCkgewogIHZhciBvbGRIID0gdGhpcy5oZWlnaHQsIGNtID0gdGhpcy5kb2MuY20sIGxpbmUgPSB0aGlzLmxpbmUKICB0aGlzLmhlaWdodCA9IG51bGwKICB2YXIgZGlmZiA9IHdpZGdldEhlaWdodCh0aGlzKSAtIG9sZEgKICBpZiAoIWRpZmYpIHsgcmV0dXJuIH0KICB1cGRhdGVMaW5lSGVpZ2h0KGxpbmUsIGxpbmUuaGVpZ2h0ICsgZGlmZikKICBpZiAoY20pIHsgcnVuSW5PcChjbSwgZnVuY3Rpb24gKCkgewogICAgY20uY3VyT3AuZm9yY2VVcGRhdGUgPSB0cnVlCiAgICBhZGp1c3RTY3JvbGxXaGVuQWJvdmVWaXNpYmxlKGNtLCBsaW5lLCBkaWZmKQogIH0pIH0KfQoKZnVuY3Rpb24gYWRkTGluZVdpZGdldChkb2MsIGhhbmRsZSwgbm9kZSwgb3B0aW9ucykgewogIHZhciB3aWRnZXQgPSBuZXcgTGluZVdpZGdldChkb2MsIG5vZGUsIG9wdGlvbnMpCiAgdmFyIGNtID0gZG9jLmNtCiAgaWYgKGNtICYmIHdpZGdldC5ub0hTY3JvbGwpIHsgY20uZGlzcGxheS5hbGlnbldpZGdldHMgPSB0cnVlIH0KICBjaGFuZ2VMaW5lKGRvYywgaGFuZGxlLCAid2lkZ2V0IiwgZnVuY3Rpb24gKGxpbmUpIHsKICAgIHZhciB3aWRnZXRzID0gbGluZS53aWRnZXRzIHx8IChsaW5lLndpZGdldHMgPSBbXSkKICAgIGlmICh3aWRnZXQuaW5zZXJ0QXQgPT0gbnVsbCkgeyB3aWRnZXRzLnB1c2god2lkZ2V0KSB9CiAgICBlbHNlIHsgd2lkZ2V0cy5zcGxpY2UoTWF0aC5taW4od2lkZ2V0cy5sZW5ndGggLSAxLCBNYXRoLm1heCgwLCB3aWRnZXQuaW5zZXJ0QXQpKSwgMCwgd2lkZ2V0KSB9CiAgICB3aWRnZXQubGluZSA9IGxpbmUKICAgIGlmIChjbSAmJiAhbGluZUlzSGlkZGVuKGRvYywgbGluZSkpIHsKICAgICAgdmFyIGFib3ZlVmlzaWJsZSA9IGhlaWdodEF0TGluZShsaW5lKSA8IGRvYy5zY3JvbGxUb3AKICAgICAgdXBkYXRlTGluZUhlaWdodChsaW5lLCBsaW5lLmhlaWdodCArIHdpZGdldEhlaWdodCh3aWRnZXQpKQogICAgICBpZiAoYWJvdmVWaXNpYmxlKSB7IGFkZFRvU2Nyb2xsUG9zKGNtLCBudWxsLCB3aWRnZXQuaGVpZ2h0KSB9CiAgICAgIGNtLmN1ck9wLmZvcmNlVXBkYXRlID0gdHJ1ZQogICAgfQogICAgcmV0dXJuIHRydWUKICB9KQogIHJldHVybiB3aWRnZXQKfQoKLy8gVEVYVE1BUktFUlMKCi8vIENyZWF0ZWQgd2l0aCBtYXJrVGV4dCBhbmQgc2V0Qm9va21hcmsgbWV0aG9kcy4gQSBUZXh0TWFya2VyIGlzIGEKLy8gaGFuZGxlIHRoYXQgY2FuIGJlIHVzZWQgdG8gY2xlYXIgb3IgZmluZCBhIG1hcmtlZCBwb3NpdGlvbiBpbiB0aGUKLy8gZG9jdW1lbnQuIExpbmUgb2JqZWN0cyBob2xkIGFycmF5cyAobWFya2VkU3BhbnMpIGNvbnRhaW5pbmcKLy8ge2Zyb20sIHRvLCBtYXJrZXJ9IG9iamVjdCBwb2ludGluZyB0byBzdWNoIG1hcmtlciBvYmplY3RzLCBhbmQKLy8gaW5kaWNhdGluZyB0aGF0IHN1Y2ggYSBtYXJrZXIgaXMgcHJlc2VudCBvbiB0aGF0IGxpbmUuIE11bHRpcGxlCi8vIGxpbmVzIG1heSBwb2ludCB0byB0aGUgc2FtZSBtYXJrZXIgd2hlbiBpdCBzcGFucyBhY3Jvc3MgbGluZXMuCi8vIFRoZSBzcGFucyB3aWxsIGhhdmUgbnVsbCBmb3IgdGhlaXIgZnJvbS90byBwcm9wZXJ0aWVzIHdoZW4gdGhlCi8vIG1hcmtlciBjb250aW51ZXMgYmV5b25kIHRoZSBzdGFydC9lbmQgb2YgdGhlIGxpbmUuIE1hcmtlcnMgaGF2ZQovLyBsaW5rcyBiYWNrIHRvIHRoZSBsaW5lcyB0aGV5IGN1cnJlbnRseSB0b3VjaC4KCi8vIENvbGxhcHNlZCBtYXJrZXJzIGhhdmUgdW5pcXVlIGlkcywgaW4gb3JkZXIgdG8gYmUgYWJsZSB0byBvcmRlcgovLyB0aGVtLCB3aGljaCBpcyBuZWVkZWQgZm9yIHVuaXF1ZWx5IGRldGVybWluaW5nIGFuIG91dGVyIG1hcmtlcgovLyB3aGVuIHRoZXkgb3ZlcmxhcCAodGhleSBtYXkgbmVzdCwgYnV0IG5vdCBwYXJ0aWFsbHkgb3ZlcmxhcCkuCnZhciBuZXh0TWFya2VySWQgPSAwCgpmdW5jdGlvbiBUZXh0TWFya2VyKGRvYywgdHlwZSkgewogIHRoaXMubGluZXMgPSBbXQogIHRoaXMudHlwZSA9IHR5cGUKICB0aGlzLmRvYyA9IGRvYwogIHRoaXMuaWQgPSArK25leHRNYXJrZXJJZAp9CmV2ZW50TWl4aW4oVGV4dE1hcmtlcikKCi8vIENsZWFyIHRoZSBtYXJrZXIuClRleHRNYXJrZXIucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24oKSB7CiAgdmFyIHRoaXMkMSA9IHRoaXM7CgogIGlmICh0aGlzLmV4cGxpY2l0bHlDbGVhcmVkKSB7IHJldHVybiB9CiAgdmFyIGNtID0gdGhpcy5kb2MuY20sIHdpdGhPcCA9IGNtICYmICFjbS5jdXJPcAogIGlmICh3aXRoT3ApIHsgc3RhcnRPcGVyYXRpb24oY20pIH0KICBpZiAoaGFzSGFuZGxlcih0aGlzLCAiY2xlYXIiKSkgewogICAgdmFyIGZvdW5kID0gdGhpcy5maW5kKCkKICAgIGlmIChmb3VuZCkgeyBzaWduYWxMYXRlcih0aGlzLCAiY2xlYXIiLCBmb3VuZC5mcm9tLCBmb3VuZC50bykgfQogIH0KICB2YXIgbWluID0gbnVsbCwgbWF4ID0gbnVsbAogIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5saW5lcy5sZW5ndGg7ICsraSkgewogICAgdmFyIGxpbmUgPSB0aGlzJDEubGluZXNbaV0KICAgIHZhciBzcGFuID0gZ2V0TWFya2VkU3BhbkZvcihsaW5lLm1hcmtlZFNwYW5zLCB0aGlzJDEpCiAgICBpZiAoY20gJiYgIXRoaXMkMS5jb2xsYXBzZWQpIHsgcmVnTGluZUNoYW5nZShjbSwgbGluZU5vKGxpbmUpLCAidGV4dCIpIH0KICAgIGVsc2UgaWYgKGNtKSB7CiAgICAgIGlmIChzcGFuLnRvICE9IG51bGwpIHsgbWF4ID0gbGluZU5vKGxpbmUpIH0KICAgICAgaWYgKHNwYW4uZnJvbSAhPSBudWxsKSB7IG1pbiA9IGxpbmVObyhsaW5lKSB9CiAgICB9CiAgICBsaW5lLm1hcmtlZFNwYW5zID0gcmVtb3ZlTWFya2VkU3BhbihsaW5lLm1hcmtlZFNwYW5zLCBzcGFuKQogICAgaWYgKHNwYW4uZnJvbSA9PSBudWxsICYmIHRoaXMkMS5jb2xsYXBzZWQgJiYgIWxpbmVJc0hpZGRlbih0aGlzJDEuZG9jLCBsaW5lKSAmJiBjbSkKICAgICAgeyB1cGRhdGVMaW5lSGVpZ2h0KGxpbmUsIHRleHRIZWlnaHQoY20uZGlzcGxheSkpIH0KICB9CiAgaWYgKGNtICYmIHRoaXMuY29sbGFwc2VkICYmICFjbS5vcHRpb25zLmxpbmVXcmFwcGluZykgeyBmb3IgKHZhciBpJDEgPSAwOyBpJDEgPCB0aGlzLmxpbmVzLmxlbmd0aDsgKytpJDEpIHsKICAgIHZhciB2aXN1YWwgPSB2aXN1YWxMaW5lKHRoaXMkMS5saW5lc1tpJDFdKSwgbGVuID0gbGluZUxlbmd0aCh2aXN1YWwpCiAgICBpZiAobGVuID4gY20uZGlzcGxheS5tYXhMaW5lTGVuZ3RoKSB7CiAgICAgIGNtLmRpc3BsYXkubWF4TGluZSA9IHZpc3VhbAogICAgICBjbS5kaXNwbGF5Lm1heExpbmVMZW5ndGggPSBsZW4KICAgICAgY20uZGlzcGxheS5tYXhMaW5lQ2hhbmdlZCA9IHRydWUKICAgIH0KICB9IH0KCiAgaWYgKG1pbiAhPSBudWxsICYmIGNtICYmIHRoaXMuY29sbGFwc2VkKSB7IHJlZ0NoYW5nZShjbSwgbWluLCBtYXggKyAxKSB9CiAgdGhpcy5saW5lcy5sZW5ndGggPSAwCiAgdGhpcy5leHBsaWNpdGx5Q2xlYXJlZCA9IHRydWUKICBpZiAodGhpcy5hdG9taWMgJiYgdGhpcy5kb2MuY2FudEVkaXQpIHsKICAgIHRoaXMuZG9jLmNhbnRFZGl0ID0gZmFsc2UKICAgIGlmIChjbSkgeyByZUNoZWNrU2VsZWN0aW9uKGNtLmRvYykgfQogIH0KICBpZiAoY20pIHsgc2lnbmFsTGF0ZXIoY20sICJtYXJrZXJDbGVhcmVkIiwgY20sIHRoaXMpIH0KICBpZiAod2l0aE9wKSB7IGVuZE9wZXJhdGlvbihjbSkgfQogIGlmICh0aGlzLnBhcmVudCkgeyB0aGlzLnBhcmVudC5jbGVhcigpIH0KfQoKLy8gRmluZCB0aGUgcG9zaXRpb24gb2YgdGhlIG1hcmtlciBpbiB0aGUgZG9jdW1lbnQuIFJldHVybnMgYSB7ZnJvbSwKLy8gdG99IG9iamVjdCBieSBkZWZhdWx0LiBTaWRlIGNhbiBiZSBwYXNzZWQgdG8gZ2V0IGEgc3BlY2lmaWMgc2lkZQovLyAtLSAwIChib3RoKSwgLTEgKGxlZnQpLCBvciAxIChyaWdodCkuIFdoZW4gbGluZU9iaiBpcyB0cnVlLCB0aGUKLy8gUG9zIG9iamVjdHMgcmV0dXJuZWQgY29udGFpbiBhIGxpbmUgb2JqZWN0LCByYXRoZXIgdGhhbiBhIGxpbmUKLy8gbnVtYmVyICh1c2VkIHRvIHByZXZlbnQgbG9va2luZyB1cCB0aGUgc2FtZSBsaW5lIHR3aWNlKS4KVGV4dE1hcmtlci5wcm90b3R5cGUuZmluZCA9IGZ1bmN0aW9uKHNpZGUsIGxpbmVPYmopIHsKICB2YXIgdGhpcyQxID0gdGhpczsKCiAgaWYgKHNpZGUgPT0gbnVsbCAmJiB0aGlzLnR5cGUgPT0gImJvb2ttYXJrIikgeyBzaWRlID0gMSB9CiAgdmFyIGZyb20sIHRvCiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxpbmVzLmxlbmd0aDsgKytpKSB7CiAgICB2YXIgbGluZSA9IHRoaXMkMS5saW5lc1tpXQogICAgdmFyIHNwYW4gPSBnZXRNYXJrZWRTcGFuRm9yKGxpbmUubWFya2VkU3BhbnMsIHRoaXMkMSkKICAgIGlmIChzcGFuLmZyb20gIT0gbnVsbCkgewogICAgICBmcm9tID0gUG9zKGxpbmVPYmogPyBsaW5lIDogbGluZU5vKGxpbmUpLCBzcGFuLmZyb20pCiAgICAgIGlmIChzaWRlID09IC0xKSB7IHJldHVybiBmcm9tIH0KICAgIH0KICAgIGlmIChzcGFuLnRvICE9IG51bGwpIHsKICAgICAgdG8gPSBQb3MobGluZU9iaiA/IGxpbmUgOiBsaW5lTm8obGluZSksIHNwYW4udG8pCiAgICAgIGlmIChzaWRlID09IDEpIHsgcmV0dXJuIHRvIH0KICAgIH0KICB9CiAgcmV0dXJuIGZyb20gJiYge2Zyb206IGZyb20sIHRvOiB0b30KfQoKLy8gU2lnbmFscyB0aGF0IHRoZSBtYXJrZXIncyB3aWRnZXQgY2hhbmdlZCwgYW5kIHN1cnJvdW5kaW5nIGxheW91dAovLyBzaG91bGQgYmUgcmVjb21wdXRlZC4KVGV4dE1hcmtlci5wcm90b3R5cGUuY2hhbmdlZCA9IGZ1bmN0aW9uKCkgewogIHZhciBwb3MgPSB0aGlzLmZpbmQoLTEsIHRydWUpLCB3aWRnZXQgPSB0aGlzLCBjbSA9IHRoaXMuZG9jLmNtCiAgaWYgKCFwb3MgfHwgIWNtKSB7IHJldHVybiB9CiAgcnVuSW5PcChjbSwgZnVuY3Rpb24gKCkgewogICAgdmFyIGxpbmUgPSBwb3MubGluZSwgbGluZU4gPSBsaW5lTm8ocG9zLmxpbmUpCiAgICB2YXIgdmlldyA9IGZpbmRWaWV3Rm9yTGluZShjbSwgbGluZU4pCiAgICBpZiAodmlldykgewogICAgICBjbGVhckxpbmVNZWFzdXJlbWVudENhY2hlRm9yKHZpZXcpCiAgICAgIGNtLmN1ck9wLnNlbGVjdGlvbkNoYW5nZWQgPSBjbS5jdXJPcC5mb3JjZVVwZGF0ZSA9IHRydWUKICAgIH0KICAgIGNtLmN1ck9wLnVwZGF0ZU1heExpbmUgPSB0cnVlCiAgICBpZiAoIWxpbmVJc0hpZGRlbih3aWRnZXQuZG9jLCBsaW5lKSAmJiB3aWRnZXQuaGVpZ2h0ICE9IG51bGwpIHsKICAgICAgdmFyIG9sZEhlaWdodCA9IHdpZGdldC5oZWlnaHQKICAgICAgd2lkZ2V0LmhlaWdodCA9IG51bGwKICAgICAgdmFyIGRIZWlnaHQgPSB3aWRnZXRIZWlnaHQod2lkZ2V0KSAtIG9sZEhlaWdodAogICAgICBpZiAoZEhlaWdodCkKICAgICAgICB7IHVwZGF0ZUxpbmVIZWlnaHQobGluZSwgbGluZS5oZWlnaHQgKyBkSGVpZ2h0KSB9CiAgICB9CiAgfSkKfQoKVGV4dE1hcmtlci5wcm90b3R5cGUuYXR0YWNoTGluZSA9IGZ1bmN0aW9uKGxpbmUpIHsKICBpZiAoIXRoaXMubGluZXMubGVuZ3RoICYmIHRoaXMuZG9jLmNtKSB7CiAgICB2YXIgb3AgPSB0aGlzLmRvYy5jbS5jdXJPcAogICAgaWYgKCFvcC5tYXliZUhpZGRlbk1hcmtlcnMgfHwgaW5kZXhPZihvcC5tYXliZUhpZGRlbk1hcmtlcnMsIHRoaXMpID09IC0xKQogICAgICB7IChvcC5tYXliZVVuaGlkZGVuTWFya2VycyB8fCAob3AubWF5YmVVbmhpZGRlbk1hcmtlcnMgPSBbXSkpLnB1c2godGhpcykgfQogIH0KICB0aGlzLmxpbmVzLnB1c2gobGluZSkKfQpUZXh0TWFya2VyLnByb3RvdHlwZS5kZXRhY2hMaW5lID0gZnVuY3Rpb24obGluZSkgewogIHRoaXMubGluZXMuc3BsaWNlKGluZGV4T2YodGhpcy5saW5lcywgbGluZSksIDEpCiAgaWYgKCF0aGlzLmxpbmVzLmxlbmd0aCAmJiB0aGlzLmRvYy5jbSkgewogICAgdmFyIG9wID0gdGhpcy5kb2MuY20uY3VyT3A7KG9wLm1heWJlSGlkZGVuTWFya2VycyB8fCAob3AubWF5YmVIaWRkZW5NYXJrZXJzID0gW10pKS5wdXNoKHRoaXMpCiAgfQp9CgovLyBDcmVhdGUgYSBtYXJrZXIsIHdpcmUgaXQgdXAgdG8gdGhlIHJpZ2h0IGxpbmVzLCBhbmQKZnVuY3Rpb24gbWFya1RleHQoZG9jLCBmcm9tLCB0bywgb3B0aW9ucywgdHlwZSkgewogIC8vIFNoYXJlZCBtYXJrZXJzIChhY3Jvc3MgbGlua2VkIGRvY3VtZW50cykgYXJlIGhhbmRsZWQgc2VwYXJhdGVseQogIC8vIChtYXJrVGV4dFNoYXJlZCB3aWxsIGNhbGwgb3V0IHRvIHRoaXMgYWdhaW4sIG9uY2UgcGVyCiAgLy8gZG9jdW1lbnQpLgogIGlmIChvcHRpb25zICYmIG9wdGlvbnMuc2hhcmVkKSB7IHJldHVybiBtYXJrVGV4dFNoYXJlZChkb2MsIGZyb20sIHRvLCBvcHRpb25zLCB0eXBlKSB9CiAgLy8gRW5zdXJlIHdlIGFyZSBpbiBhbiBvcGVyYXRpb24uCiAgaWYgKGRvYy5jbSAmJiAhZG9jLmNtLmN1ck9wKSB7IHJldHVybiBvcGVyYXRpb24oZG9jLmNtLCBtYXJrVGV4dCkoZG9jLCBmcm9tLCB0bywgb3B0aW9ucywgdHlwZSkgfQoKICB2YXIgbWFya2VyID0gbmV3IFRleHRNYXJrZXIoZG9jLCB0eXBlKSwgZGlmZiA9IGNtcChmcm9tLCB0bykKICBpZiAob3B0aW9ucykgeyBjb3B5T2JqKG9wdGlvbnMsIG1hcmtlciwgZmFsc2UpIH0KICAvLyBEb24ndCBjb25uZWN0IGVtcHR5IG1hcmtlcnMgdW5sZXNzIGNsZWFyV2hlbkVtcHR5IGlzIGZhbHNlCiAgaWYgKGRpZmYgPiAwIHx8IGRpZmYgPT0gMCAmJiBtYXJrZXIuY2xlYXJXaGVuRW1wdHkgIT09IGZhbHNlKQogICAgeyByZXR1cm4gbWFya2VyIH0KICBpZiAobWFya2VyLnJlcGxhY2VkV2l0aCkgewogICAgLy8gU2hvd2luZyB1cCBhcyBhIHdpZGdldCBpbXBsaWVzIGNvbGxhcHNlZCAod2lkZ2V0IHJlcGxhY2VzIHRleHQpCiAgICBtYXJrZXIuY29sbGFwc2VkID0gdHJ1ZQogICAgbWFya2VyLndpZGdldE5vZGUgPSBlbHQoInNwYW4iLCBbbWFya2VyLnJlcGxhY2VkV2l0aF0sICJDb2RlTWlycm9yLXdpZGdldCIpCiAgICBpZiAoIW9wdGlvbnMuaGFuZGxlTW91c2VFdmVudHMpIHsgbWFya2VyLndpZGdldE5vZGUuc2V0QXR0cmlidXRlKCJjbS1pZ25vcmUtZXZlbnRzIiwgInRydWUiKSB9CiAgICBpZiAob3B0aW9ucy5pbnNlcnRMZWZ0KSB7IG1hcmtlci53aWRnZXROb2RlLmluc2VydExlZnQgPSB0cnVlIH0KICB9CiAgaWYgKG1hcmtlci5jb2xsYXBzZWQpIHsKICAgIGlmIChjb25mbGljdGluZ0NvbGxhcHNlZFJhbmdlKGRvYywgZnJvbS5saW5lLCBmcm9tLCB0bywgbWFya2VyKSB8fAogICAgICAgIGZyb20ubGluZSAhPSB0by5saW5lICYmIGNvbmZsaWN0aW5nQ29sbGFwc2VkUmFuZ2UoZG9jLCB0by5saW5lLCBmcm9tLCB0bywgbWFya2VyKSkKICAgICAgeyB0aHJvdyBuZXcgRXJyb3IoIkluc2VydGluZyBjb2xsYXBzZWQgbWFya2VyIHBhcnRpYWxseSBvdmVybGFwcGluZyBhbiBleGlzdGluZyBvbmUiKSB9CiAgICBzZWVDb2xsYXBzZWRTcGFucygpCiAgfQoKICBpZiAobWFya2VyLmFkZFRvSGlzdG9yeSkKICAgIHsgYWRkQ2hhbmdlVG9IaXN0b3J5KGRvYywge2Zyb206IGZyb20sIHRvOiB0bywgb3JpZ2luOiAibWFya1RleHQifSwgZG9jLnNlbCwgTmFOKSB9CgogIHZhciBjdXJMaW5lID0gZnJvbS5saW5lLCBjbSA9IGRvYy5jbSwgdXBkYXRlTWF4TGluZQogIGRvYy5pdGVyKGN1ckxpbmUsIHRvLmxpbmUgKyAxLCBmdW5jdGlvbiAobGluZSkgewogICAgaWYgKGNtICYmIG1hcmtlci5jb2xsYXBzZWQgJiYgIWNtLm9wdGlvbnMubGluZVdyYXBwaW5nICYmIHZpc3VhbExpbmUobGluZSkgPT0gY20uZGlzcGxheS5tYXhMaW5lKQogICAgICB7IHVwZGF0ZU1heExpbmUgPSB0cnVlIH0KICAgIGlmIChtYXJrZXIuY29sbGFwc2VkICYmIGN1ckxpbmUgIT0gZnJvbS5saW5lKSB7IHVwZGF0ZUxpbmVIZWlnaHQobGluZSwgMCkgfQogICAgYWRkTWFya2VkU3BhbihsaW5lLCBuZXcgTWFya2VkU3BhbihtYXJrZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1ckxpbmUgPT0gZnJvbS5saW5lID8gZnJvbS5jaCA6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1ckxpbmUgPT0gdG8ubGluZSA/IHRvLmNoIDogbnVsbCkpCiAgICArK2N1ckxpbmUKICB9KQogIC8vIGxpbmVJc0hpZGRlbiBkZXBlbmRzIG9uIHRoZSBwcmVzZW5jZSBvZiB0aGUgc3BhbnMsIHNvIG5lZWRzIGEgc2Vjb25kIHBhc3MKICBpZiAobWFya2VyLmNvbGxhcHNlZCkgeyBkb2MuaXRlcihmcm9tLmxpbmUsIHRvLmxpbmUgKyAxLCBmdW5jdGlvbiAobGluZSkgewogICAgaWYgKGxpbmVJc0hpZGRlbihkb2MsIGxpbmUpKSB7IHVwZGF0ZUxpbmVIZWlnaHQobGluZSwgMCkgfQogIH0pIH0KCiAgaWYgKG1hcmtlci5jbGVhck9uRW50ZXIpIHsgb24obWFya2VyLCAiYmVmb3JlQ3Vyc29yRW50ZXIiLCBmdW5jdGlvbiAoKSB7IHJldHVybiBtYXJrZXIuY2xlYXIoKTsgfSkgfQoKICBpZiAobWFya2VyLnJlYWRPbmx5KSB7CiAgICBzZWVSZWFkT25seVNwYW5zKCkKICAgIGlmIChkb2MuaGlzdG9yeS5kb25lLmxlbmd0aCB8fCBkb2MuaGlzdG9yeS51bmRvbmUubGVuZ3RoKQogICAgICB7IGRvYy5jbGVhckhpc3RvcnkoKSB9CiAgfQogIGlmIChtYXJrZXIuY29sbGFwc2VkKSB7CiAgICBtYXJrZXIuaWQgPSArK25leHRNYXJrZXJJZAogICAgbWFya2VyLmF0b21pYyA9IHRydWUKICB9CiAgaWYgKGNtKSB7CiAgICAvLyBTeW5jIGVkaXRvciBzdGF0ZQogICAgaWYgKHVwZGF0ZU1heExpbmUpIHsgY20uY3VyT3AudXBkYXRlTWF4TGluZSA9IHRydWUgfQogICAgaWYgKG1hcmtlci5jb2xsYXBzZWQpCiAgICAgIHsgcmVnQ2hhbmdlKGNtLCBmcm9tLmxpbmUsIHRvLmxpbmUgKyAxKSB9CiAgICBlbHNlIGlmIChtYXJrZXIuY2xhc3NOYW1lIHx8IG1hcmtlci50aXRsZSB8fCBtYXJrZXIuc3RhcnRTdHlsZSB8fCBtYXJrZXIuZW5kU3R5bGUgfHwgbWFya2VyLmNzcykKICAgICAgeyBmb3IgKHZhciBpID0gZnJvbS5saW5lOyBpIDw9IHRvLmxpbmU7IGkrKykgeyByZWdMaW5lQ2hhbmdlKGNtLCBpLCAidGV4dCIpIH0gfQogICAgaWYgKG1hcmtlci5hdG9taWMpIHsgcmVDaGVja1NlbGVjdGlvbihjbS5kb2MpIH0KICAgIHNpZ25hbExhdGVyKGNtLCAibWFya2VyQWRkZWQiLCBjbSwgbWFya2VyKQogIH0KICByZXR1cm4gbWFya2VyCn0KCi8vIFNIQVJFRCBURVhUTUFSS0VSUwoKLy8gQSBzaGFyZWQgbWFya2VyIHNwYW5zIG11bHRpcGxlIGxpbmtlZCBkb2N1bWVudHMuIEl0IGlzCi8vIGltcGxlbWVudGVkIGFzIGEgbWV0YS1tYXJrZXItb2JqZWN0IGNvbnRyb2xsaW5nIG11bHRpcGxlIG5vcm1hbAovLyBtYXJrZXJzLgpmdW5jdGlvbiBTaGFyZWRUZXh0TWFya2VyKG1hcmtlcnMsIHByaW1hcnkpIHsKICB2YXIgdGhpcyQxID0gdGhpczsKCiAgdGhpcy5tYXJrZXJzID0gbWFya2VycwogIHRoaXMucHJpbWFyeSA9IHByaW1hcnkKICBmb3IgKHZhciBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyArK2kpCiAgICB7IG1hcmtlcnNbaV0ucGFyZW50ID0gdGhpcyQxIH0KfQpldmVudE1peGluKFNoYXJlZFRleHRNYXJrZXIpCgpTaGFyZWRUZXh0TWFya2VyLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uKCkgewogIHZhciB0aGlzJDEgPSB0aGlzOwoKICBpZiAodGhpcy5leHBsaWNpdGx5Q2xlYXJlZCkgeyByZXR1cm4gfQogIHRoaXMuZXhwbGljaXRseUNsZWFyZWQgPSB0cnVlCiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLm1hcmtlcnMubGVuZ3RoOyArK2kpCiAgICB7IHRoaXMkMS5tYXJrZXJzW2ldLmNsZWFyKCkgfQogIHNpZ25hbExhdGVyKHRoaXMsICJjbGVhciIpCn0KU2hhcmVkVGV4dE1hcmtlci5wcm90b3R5cGUuZmluZCA9IGZ1bmN0aW9uKHNpZGUsIGxpbmVPYmopIHsKICByZXR1cm4gdGhpcy5wcmltYXJ5LmZpbmQoc2lkZSwgbGluZU9iaikKfQoKZnVuY3Rpb24gbWFya1RleHRTaGFyZWQoZG9jLCBmcm9tLCB0bywgb3B0aW9ucywgdHlwZSkgewogIG9wdGlvbnMgPSBjb3B5T2JqKG9wdGlvbnMpCiAgb3B0aW9ucy5zaGFyZWQgPSBmYWxzZQogIHZhciBtYXJrZXJzID0gW21hcmtUZXh0KGRvYywgZnJvbSwgdG8sIG9wdGlvbnMsIHR5cGUpXSwgcHJpbWFyeSA9IG1hcmtlcnNbMF0KICB2YXIgd2lkZ2V0ID0gb3B0aW9ucy53aWRnZXROb2RlCiAgbGlua2VkRG9jcyhkb2MsIGZ1bmN0aW9uIChkb2MpIHsKICAgIGlmICh3aWRnZXQpIHsgb3B0aW9ucy53aWRnZXROb2RlID0gd2lkZ2V0LmNsb25lTm9kZSh0cnVlKSB9CiAgICBtYXJrZXJzLnB1c2gobWFya1RleHQoZG9jLCBjbGlwUG9zKGRvYywgZnJvbSksIGNsaXBQb3MoZG9jLCB0byksIG9wdGlvbnMsIHR5cGUpKQogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkb2MubGlua2VkLmxlbmd0aDsgKytpKQogICAgICB7IGlmIChkb2MubGlua2VkW2ldLmlzUGFyZW50KSB7IHJldHVybiB9IH0KICAgIHByaW1hcnkgPSBsc3QobWFya2VycykKICB9KQogIHJldHVybiBuZXcgU2hhcmVkVGV4dE1hcmtlcihtYXJrZXJzLCBwcmltYXJ5KQp9CgpmdW5jdGlvbiBmaW5kU2hhcmVkTWFya2Vycyhkb2MpIHsKICByZXR1cm4gZG9jLmZpbmRNYXJrcyhQb3MoZG9jLmZpcnN0LCAwKSwgZG9jLmNsaXBQb3MoUG9zKGRvYy5sYXN0TGluZSgpKSksIGZ1bmN0aW9uIChtKSB7IHJldHVybiBtLnBhcmVudDsgfSkKfQoKZnVuY3Rpb24gY29weVNoYXJlZE1hcmtlcnMoZG9jLCBtYXJrZXJzKSB7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBtYXJrZXJzLmxlbmd0aDsgaSsrKSB7CiAgICB2YXIgbWFya2VyID0gbWFya2Vyc1tpXSwgcG9zID0gbWFya2VyLmZpbmQoKQogICAgdmFyIG1Gcm9tID0gZG9jLmNsaXBQb3MocG9zLmZyb20pLCBtVG8gPSBkb2MuY2xpcFBvcyhwb3MudG8pCiAgICBpZiAoY21wKG1Gcm9tLCBtVG8pKSB7CiAgICAgIHZhciBzdWJNYXJrID0gbWFya1RleHQoZG9jLCBtRnJvbSwgbVRvLCBtYXJrZXIucHJpbWFyeSwgbWFya2VyLnByaW1hcnkudHlwZSkKICAgICAgbWFya2VyLm1hcmtlcnMucHVzaChzdWJNYXJrKQogICAgICBzdWJNYXJrLnBhcmVudCA9IG1hcmtlcgogICAgfQogIH0KfQoKZnVuY3Rpb24gZGV0YWNoU2hhcmVkTWFya2VycyhtYXJrZXJzKSB7CiAgdmFyIGxvb3AgPSBmdW5jdGlvbiAoIGkgKSB7CiAgICB2YXIgbWFya2VyID0gbWFya2Vyc1tpXSwgbGlua2VkID0gW21hcmtlci5wcmltYXJ5LmRvY10KICAgIGxpbmtlZERvY3MobWFya2VyLnByaW1hcnkuZG9jLCBmdW5jdGlvbiAoZCkgeyByZXR1cm4gbGlua2VkLnB1c2goZCk7IH0pCiAgICBmb3IgKHZhciBqID0gMDsgaiA8IG1hcmtlci5tYXJrZXJzLmxlbmd0aDsgaisrKSB7CiAgICAgIHZhciBzdWJNYXJrZXIgPSBtYXJrZXIubWFya2Vyc1tqXQogICAgICBpZiAoaW5kZXhPZihsaW5rZWQsIHN1Yk1hcmtlci5kb2MpID09IC0xKSB7CiAgICAgICAgc3ViTWFya2VyLnBhcmVudCA9IG51bGwKICAgICAgICBtYXJrZXIubWFya2Vycy5zcGxpY2Uoai0tLCAxKQogICAgICB9CiAgICB9CiAgfTsKCiAgZm9yICh2YXIgaSA9IDA7IGkgPCBtYXJrZXJzLmxlbmd0aDsgaSsrKSBsb29wKCBpICk7Cn0KCnZhciBuZXh0RG9jSWQgPSAwCnZhciBEb2MgPSBmdW5jdGlvbih0ZXh0LCBtb2RlLCBmaXJzdExpbmUsIGxpbmVTZXApIHsKICBpZiAoISh0aGlzIGluc3RhbmNlb2YgRG9jKSkgeyByZXR1cm4gbmV3IERvYyh0ZXh0LCBtb2RlLCBmaXJzdExpbmUsIGxpbmVTZXApIH0KICBpZiAoZmlyc3RMaW5lID09IG51bGwpIHsgZmlyc3RMaW5lID0gMCB9CgogIEJyYW5jaENodW5rLmNhbGwodGhpcywgW25ldyBMZWFmQ2h1bmsoW25ldyBMaW5lKCIiLCBudWxsKV0pXSkKICB0aGlzLmZpcnN0ID0gZmlyc3RMaW5lCiAgdGhpcy5zY3JvbGxUb3AgPSB0aGlzLnNjcm9sbExlZnQgPSAwCiAgdGhpcy5jYW50RWRpdCA9IGZhbHNlCiAgdGhpcy5jbGVhbkdlbmVyYXRpb24gPSAxCiAgdGhpcy5mcm9udGllciA9IGZpcnN0TGluZQogIHZhciBzdGFydCA9IFBvcyhmaXJzdExpbmUsIDApCiAgdGhpcy5zZWwgPSBzaW1wbGVTZWxlY3Rpb24oc3RhcnQpCiAgdGhpcy5oaXN0b3J5ID0gbmV3IEhpc3RvcnkobnVsbCkKICB0aGlzLmlkID0gKytuZXh0RG9jSWQKICB0aGlzLm1vZGVPcHRpb24gPSBtb2RlCiAgdGhpcy5saW5lU2VwID0gbGluZVNlcAogIHRoaXMuZXh0ZW5kID0gZmFsc2UKCiAgaWYgKHR5cGVvZiB0ZXh0ID09ICJzdHJpbmciKSB7IHRleHQgPSB0aGlzLnNwbGl0TGluZXModGV4dCkgfQogIHVwZGF0ZURvYyh0aGlzLCB7ZnJvbTogc3RhcnQsIHRvOiBzdGFydCwgdGV4dDogdGV4dH0pCiAgc2V0U2VsZWN0aW9uKHRoaXMsIHNpbXBsZVNlbGVjdGlvbihzdGFydCksIHNlbF9kb250U2Nyb2xsKQp9CgpEb2MucHJvdG90eXBlID0gY3JlYXRlT2JqKEJyYW5jaENodW5rLnByb3RvdHlwZSwgewogIGNvbnN0cnVjdG9yOiBEb2MsCiAgLy8gSXRlcmF0ZSBvdmVyIHRoZSBkb2N1bWVudC4gU3VwcG9ydHMgdHdvIGZvcm1zIC0tIHdpdGggb25seSBvbmUKICAvLyBhcmd1bWVudCwgaXQgY2FsbHMgdGhhdCBmb3IgZWFjaCBsaW5lIGluIHRoZSBkb2N1bWVudC4gV2l0aAogIC8vIHRocmVlLCBpdCBpdGVyYXRlcyBvdmVyIHRoZSByYW5nZSBnaXZlbiBieSB0aGUgZmlyc3QgdHdvICh3aXRoCiAgLy8gdGhlIHNlY29uZCBiZWluZyBub24taW5jbHVzaXZlKS4KICBpdGVyOiBmdW5jdGlvbihmcm9tLCB0bywgb3ApIHsKICAgIGlmIChvcCkgeyB0aGlzLml0ZXJOKGZyb20gLSB0aGlzLmZpcnN0LCB0byAtIGZyb20sIG9wKSB9CiAgICBlbHNlIHsgdGhpcy5pdGVyTih0aGlzLmZpcnN0LCB0aGlzLmZpcnN0ICsgdGhpcy5zaXplLCBmcm9tKSB9CiAgfSwKCiAgLy8gTm9uLXB1YmxpYyBpbnRlcmZhY2UgZm9yIGFkZGluZyBhbmQgcmVtb3ZpbmcgbGluZXMuCiAgaW5zZXJ0OiBmdW5jdGlvbihhdCwgbGluZXMpIHsKICAgIHZhciBoZWlnaHQgPSAwCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgKytpKSB7IGhlaWdodCArPSBsaW5lc1tpXS5oZWlnaHQgfQogICAgdGhpcy5pbnNlcnRJbm5lcihhdCAtIHRoaXMuZmlyc3QsIGxpbmVzLCBoZWlnaHQpCiAgfSwKICByZW1vdmU6IGZ1bmN0aW9uKGF0LCBuKSB7IHRoaXMucmVtb3ZlSW5uZXIoYXQgLSB0aGlzLmZpcnN0LCBuKSB9LAoKICAvLyBGcm9tIGhlcmUsIHRoZSBtZXRob2RzIGFyZSBwYXJ0IG9mIHRoZSBwdWJsaWMgaW50ZXJmYWNlLiBNb3N0CiAgLy8gYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gQ29kZU1pcnJvciAoZWRpdG9yKSBpbnN0YW5jZXMuCgogIGdldFZhbHVlOiBmdW5jdGlvbihsaW5lU2VwKSB7CiAgICB2YXIgbGluZXMgPSBnZXRMaW5lcyh0aGlzLCB0aGlzLmZpcnN0LCB0aGlzLmZpcnN0ICsgdGhpcy5zaXplKQogICAgaWYgKGxpbmVTZXAgPT09IGZhbHNlKSB7IHJldHVybiBsaW5lcyB9CiAgICByZXR1cm4gbGluZXMuam9pbihsaW5lU2VwIHx8IHRoaXMubGluZVNlcGFyYXRvcigpKQogIH0sCiAgc2V0VmFsdWU6IGRvY01ldGhvZE9wKGZ1bmN0aW9uKGNvZGUpIHsKICAgIHZhciB0b3AgPSBQb3ModGhpcy5maXJzdCwgMCksIGxhc3QgPSB0aGlzLmZpcnN0ICsgdGhpcy5zaXplIC0gMQogICAgbWFrZUNoYW5nZSh0aGlzLCB7ZnJvbTogdG9wLCB0bzogUG9zKGxhc3QsIGdldExpbmUodGhpcywgbGFzdCkudGV4dC5sZW5ndGgpLAogICAgICAgICAgICAgICAgICAgICAgdGV4dDogdGhpcy5zcGxpdExpbmVzKGNvZGUpLCBvcmlnaW46ICJzZXRWYWx1ZSIsIGZ1bGw6IHRydWV9LCB0cnVlKQogICAgc2V0U2VsZWN0aW9uKHRoaXMsIHNpbXBsZVNlbGVjdGlvbih0b3ApKQogIH0pLAogIHJlcGxhY2VSYW5nZTogZnVuY3Rpb24oY29kZSwgZnJvbSwgdG8sIG9yaWdpbikgewogICAgZnJvbSA9IGNsaXBQb3ModGhpcywgZnJvbSkKICAgIHRvID0gdG8gPyBjbGlwUG9zKHRoaXMsIHRvKSA6IGZyb20KICAgIHJlcGxhY2VSYW5nZSh0aGlzLCBjb2RlLCBmcm9tLCB0bywgb3JpZ2luKQogIH0sCiAgZ2V0UmFuZ2U6IGZ1bmN0aW9uKGZyb20sIHRvLCBsaW5lU2VwKSB7CiAgICB2YXIgbGluZXMgPSBnZXRCZXR3ZWVuKHRoaXMsIGNsaXBQb3ModGhpcywgZnJvbSksIGNsaXBQb3ModGhpcywgdG8pKQogICAgaWYgKGxpbmVTZXAgPT09IGZhbHNlKSB7IHJldHVybiBsaW5lcyB9CiAgICByZXR1cm4gbGluZXMuam9pbihsaW5lU2VwIHx8IHRoaXMubGluZVNlcGFyYXRvcigpKQogIH0sCgogIGdldExpbmU6IGZ1bmN0aW9uKGxpbmUpIHt2YXIgbCA9IHRoaXMuZ2V0TGluZUhhbmRsZShsaW5lKTsgcmV0dXJuIGwgJiYgbC50ZXh0fSwKCiAgZ2V0TGluZUhhbmRsZTogZnVuY3Rpb24obGluZSkge2lmIChpc0xpbmUodGhpcywgbGluZSkpIHsgcmV0dXJuIGdldExpbmUodGhpcywgbGluZSkgfX0sCiAgZ2V0TGluZU51bWJlcjogZnVuY3Rpb24obGluZSkge3JldHVybiBsaW5lTm8obGluZSl9LAoKICBnZXRMaW5lSGFuZGxlVmlzdWFsU3RhcnQ6IGZ1bmN0aW9uKGxpbmUpIHsKICAgIGlmICh0eXBlb2YgbGluZSA9PSAibnVtYmVyIikgeyBsaW5lID0gZ2V0TGluZSh0aGlzLCBsaW5lKSB9CiAgICByZXR1cm4gdmlzdWFsTGluZShsaW5lKQogIH0sCgogIGxpbmVDb3VudDogZnVuY3Rpb24oKSB7cmV0dXJuIHRoaXMuc2l6ZX0sCiAgZmlyc3RMaW5lOiBmdW5jdGlvbigpIHtyZXR1cm4gdGhpcy5maXJzdH0sCiAgbGFzdExpbmU6IGZ1bmN0aW9uKCkge3JldHVybiB0aGlzLmZpcnN0ICsgdGhpcy5zaXplIC0gMX0sCgogIGNsaXBQb3M6IGZ1bmN0aW9uKHBvcykge3JldHVybiBjbGlwUG9zKHRoaXMsIHBvcyl9LAoKICBnZXRDdXJzb3I6IGZ1bmN0aW9uKHN0YXJ0KSB7CiAgICB2YXIgcmFuZ2UkJDEgPSB0aGlzLnNlbC5wcmltYXJ5KCksIHBvcwogICAgaWYgKHN0YXJ0ID09IG51bGwgfHwgc3RhcnQgPT0gImhlYWQiKSB7IHBvcyA9IHJhbmdlJCQxLmhlYWQgfQogICAgZWxzZSBpZiAoc3RhcnQgPT0gImFuY2hvciIpIHsgcG9zID0gcmFuZ2UkJDEuYW5jaG9yIH0KICAgIGVsc2UgaWYgKHN0YXJ0ID09ICJlbmQiIHx8IHN0YXJ0ID09ICJ0byIgfHwgc3RhcnQgPT09IGZhbHNlKSB7IHBvcyA9IHJhbmdlJCQxLnRvKCkgfQogICAgZWxzZSB7IHBvcyA9IHJhbmdlJCQxLmZyb20oKSB9CiAgICByZXR1cm4gcG9zCiAgfSwKICBsaXN0U2VsZWN0aW9uczogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLnNlbC5yYW5nZXMgfSwKICBzb21ldGhpbmdTZWxlY3RlZDogZnVuY3Rpb24oKSB7cmV0dXJuIHRoaXMuc2VsLnNvbWV0aGluZ1NlbGVjdGVkKCl9LAoKICBzZXRDdXJzb3I6IGRvY01ldGhvZE9wKGZ1bmN0aW9uKGxpbmUsIGNoLCBvcHRpb25zKSB7CiAgICBzZXRTaW1wbGVTZWxlY3Rpb24odGhpcywgY2xpcFBvcyh0aGlzLCB0eXBlb2YgbGluZSA9PSAibnVtYmVyIiA/IFBvcyhsaW5lLCBjaCB8fCAwKSA6IGxpbmUpLCBudWxsLCBvcHRpb25zKQogIH0pLAogIHNldFNlbGVjdGlvbjogZG9jTWV0aG9kT3AoZnVuY3Rpb24oYW5jaG9yLCBoZWFkLCBvcHRpb25zKSB7CiAgICBzZXRTaW1wbGVTZWxlY3Rpb24odGhpcywgY2xpcFBvcyh0aGlzLCBhbmNob3IpLCBjbGlwUG9zKHRoaXMsIGhlYWQgfHwgYW5jaG9yKSwgb3B0aW9ucykKICB9KSwKICBleHRlbmRTZWxlY3Rpb246IGRvY01ldGhvZE9wKGZ1bmN0aW9uKGhlYWQsIG90aGVyLCBvcHRpb25zKSB7CiAgICBleHRlbmRTZWxlY3Rpb24odGhpcywgY2xpcFBvcyh0aGlzLCBoZWFkKSwgb3RoZXIgJiYgY2xpcFBvcyh0aGlzLCBvdGhlciksIG9wdGlvbnMpCiAgfSksCiAgZXh0ZW5kU2VsZWN0aW9uczogZG9jTWV0aG9kT3AoZnVuY3Rpb24oaGVhZHMsIG9wdGlvbnMpIHsKICAgIGV4dGVuZFNlbGVjdGlvbnModGhpcywgY2xpcFBvc0FycmF5KHRoaXMsIGhlYWRzKSwgb3B0aW9ucykKICB9KSwKICBleHRlbmRTZWxlY3Rpb25zQnk6IGRvY01ldGhvZE9wKGZ1bmN0aW9uKGYsIG9wdGlvbnMpIHsKICAgIHZhciBoZWFkcyA9IG1hcCh0aGlzLnNlbC5yYW5nZXMsIGYpCiAgICBleHRlbmRTZWxlY3Rpb25zKHRoaXMsIGNsaXBQb3NBcnJheSh0aGlzLCBoZWFkcyksIG9wdGlvbnMpCiAgfSksCiAgc2V0U2VsZWN0aW9uczogZG9jTWV0aG9kT3AoZnVuY3Rpb24ocmFuZ2VzLCBwcmltYXJ5LCBvcHRpb25zKSB7CiAgICB2YXIgdGhpcyQxID0gdGhpczsKCiAgICBpZiAoIXJhbmdlcy5sZW5ndGgpIHsgcmV0dXJuIH0KICAgIHZhciBvdXQgPSBbXQogICAgZm9yICh2YXIgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspCiAgICAgIHsgb3V0W2ldID0gbmV3IFJhbmdlKGNsaXBQb3ModGhpcyQxLCByYW5nZXNbaV0uYW5jaG9yKSwKICAgICAgICAgICAgICAgICAgICAgICAgIGNsaXBQb3ModGhpcyQxLCByYW5nZXNbaV0uaGVhZCkpIH0KICAgIGlmIChwcmltYXJ5ID09IG51bGwpIHsgcHJpbWFyeSA9IE1hdGgubWluKHJhbmdlcy5sZW5ndGggLSAxLCB0aGlzLnNlbC5wcmltSW5kZXgpIH0KICAgIHNldFNlbGVjdGlvbih0aGlzLCBub3JtYWxpemVTZWxlY3Rpb24ob3V0LCBwcmltYXJ5KSwgb3B0aW9ucykKICB9KSwKICBhZGRTZWxlY3Rpb246IGRvY01ldGhvZE9wKGZ1bmN0aW9uKGFuY2hvciwgaGVhZCwgb3B0aW9ucykgewogICAgdmFyIHJhbmdlcyA9IHRoaXMuc2VsLnJhbmdlcy5zbGljZSgwKQogICAgcmFuZ2VzLnB1c2gobmV3IFJhbmdlKGNsaXBQb3ModGhpcywgYW5jaG9yKSwgY2xpcFBvcyh0aGlzLCBoZWFkIHx8IGFuY2hvcikpKQogICAgc2V0U2VsZWN0aW9uKHRoaXMsIG5vcm1hbGl6ZVNlbGVjdGlvbihyYW5nZXMsIHJhbmdlcy5sZW5ndGggLSAxKSwgb3B0aW9ucykKICB9KSwKCiAgZ2V0U2VsZWN0aW9uOiBmdW5jdGlvbihsaW5lU2VwKSB7CiAgICB2YXIgdGhpcyQxID0gdGhpczsKCiAgICB2YXIgcmFuZ2VzID0gdGhpcy5zZWwucmFuZ2VzLCBsaW5lcwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIHNlbCA9IGdldEJldHdlZW4odGhpcyQxLCByYW5nZXNbaV0uZnJvbSgpLCByYW5nZXNbaV0udG8oKSkKICAgICAgbGluZXMgPSBsaW5lcyA/IGxpbmVzLmNvbmNhdChzZWwpIDogc2VsCiAgICB9CiAgICBpZiAobGluZVNlcCA9PT0gZmFsc2UpIHsgcmV0dXJuIGxpbmVzIH0KICAgIGVsc2UgeyByZXR1cm4gbGluZXMuam9pbihsaW5lU2VwIHx8IHRoaXMubGluZVNlcGFyYXRvcigpKSB9CiAgfSwKICBnZXRTZWxlY3Rpb25zOiBmdW5jdGlvbihsaW5lU2VwKSB7CiAgICB2YXIgdGhpcyQxID0gdGhpczsKCiAgICB2YXIgcGFydHMgPSBbXSwgcmFuZ2VzID0gdGhpcy5zZWwucmFuZ2VzCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJhbmdlcy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgc2VsID0gZ2V0QmV0d2Vlbih0aGlzJDEsIHJhbmdlc1tpXS5mcm9tKCksIHJhbmdlc1tpXS50bygpKQogICAgICBpZiAobGluZVNlcCAhPT0gZmFsc2UpIHsgc2VsID0gc2VsLmpvaW4obGluZVNlcCB8fCB0aGlzJDEubGluZVNlcGFyYXRvcigpKSB9CiAgICAgIHBhcnRzW2ldID0gc2VsCiAgICB9CiAgICByZXR1cm4gcGFydHMKICB9LAogIHJlcGxhY2VTZWxlY3Rpb246IGZ1bmN0aW9uKGNvZGUsIGNvbGxhcHNlLCBvcmlnaW4pIHsKICAgIHZhciBkdXAgPSBbXQogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLnNlbC5yYW5nZXMubGVuZ3RoOyBpKyspCiAgICAgIHsgZHVwW2ldID0gY29kZSB9CiAgICB0aGlzLnJlcGxhY2VTZWxlY3Rpb25zKGR1cCwgY29sbGFwc2UsIG9yaWdpbiB8fCAiK2lucHV0IikKICB9LAogIHJlcGxhY2VTZWxlY3Rpb25zOiBkb2NNZXRob2RPcChmdW5jdGlvbihjb2RlLCBjb2xsYXBzZSwgb3JpZ2luKSB7CiAgICB2YXIgdGhpcyQxID0gdGhpczsKCiAgICB2YXIgY2hhbmdlcyA9IFtdLCBzZWwgPSB0aGlzLnNlbAogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWwucmFuZ2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciByYW5nZSQkMSA9IHNlbC5yYW5nZXNbaV0KICAgICAgY2hhbmdlc1tpXSA9IHtmcm9tOiByYW5nZSQkMS5mcm9tKCksIHRvOiByYW5nZSQkMS50bygpLCB0ZXh0OiB0aGlzJDEuc3BsaXRMaW5lcyhjb2RlW2ldKSwgb3JpZ2luOiBvcmlnaW59CiAgICB9CiAgICB2YXIgbmV3U2VsID0gY29sbGFwc2UgJiYgY29sbGFwc2UgIT0gImVuZCIgJiYgY29tcHV0ZVJlcGxhY2VkU2VsKHRoaXMsIGNoYW5nZXMsIGNvbGxhcHNlKQogICAgZm9yICh2YXIgaSQxID0gY2hhbmdlcy5sZW5ndGggLSAxOyBpJDEgPj0gMDsgaSQxLS0pCiAgICAgIHsgbWFrZUNoYW5nZSh0aGlzJDEsIGNoYW5nZXNbaSQxXSkgfQogICAgaWYgKG5ld1NlbCkgeyBzZXRTZWxlY3Rpb25SZXBsYWNlSGlzdG9yeSh0aGlzLCBuZXdTZWwpIH0KICAgIGVsc2UgaWYgKHRoaXMuY20pIHsgZW5zdXJlQ3Vyc29yVmlzaWJsZSh0aGlzLmNtKSB9CiAgfSksCiAgdW5kbzogZG9jTWV0aG9kT3AoZnVuY3Rpb24oKSB7bWFrZUNoYW5nZUZyb21IaXN0b3J5KHRoaXMsICJ1bmRvIil9KSwKICByZWRvOiBkb2NNZXRob2RPcChmdW5jdGlvbigpIHttYWtlQ2hhbmdlRnJvbUhpc3RvcnkodGhpcywgInJlZG8iKX0pLAogIHVuZG9TZWxlY3Rpb246IGRvY01ldGhvZE9wKGZ1bmN0aW9uKCkge21ha2VDaGFuZ2VGcm9tSGlzdG9yeSh0aGlzLCAidW5kbyIsIHRydWUpfSksCiAgcmVkb1NlbGVjdGlvbjogZG9jTWV0aG9kT3AoZnVuY3Rpb24oKSB7bWFrZUNoYW5nZUZyb21IaXN0b3J5KHRoaXMsICJyZWRvIiwgdHJ1ZSl9KSwKCiAgc2V0RXh0ZW5kaW5nOiBmdW5jdGlvbih2YWwpIHt0aGlzLmV4dGVuZCA9IHZhbH0sCiAgZ2V0RXh0ZW5kaW5nOiBmdW5jdGlvbigpIHtyZXR1cm4gdGhpcy5leHRlbmR9LAoKICBoaXN0b3J5U2l6ZTogZnVuY3Rpb24oKSB7CiAgICB2YXIgaGlzdCA9IHRoaXMuaGlzdG9yeSwgZG9uZSA9IDAsIHVuZG9uZSA9IDAKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaGlzdC5kb25lLmxlbmd0aDsgaSsrKSB7IGlmICghaGlzdC5kb25lW2ldLnJhbmdlcykgeyArK2RvbmUgfSB9CiAgICBmb3IgKHZhciBpJDEgPSAwOyBpJDEgPCBoaXN0LnVuZG9uZS5sZW5ndGg7IGkkMSsrKSB7IGlmICghaGlzdC51bmRvbmVbaSQxXS5yYW5nZXMpIHsgKyt1bmRvbmUgfSB9CiAgICByZXR1cm4ge3VuZG86IGRvbmUsIHJlZG86IHVuZG9uZX0KICB9LAogIGNsZWFySGlzdG9yeTogZnVuY3Rpb24oKSB7dGhpcy5oaXN0b3J5ID0gbmV3IEhpc3RvcnkodGhpcy5oaXN0b3J5Lm1heEdlbmVyYXRpb24pfSwKCiAgbWFya0NsZWFuOiBmdW5jdGlvbigpIHsKICAgIHRoaXMuY2xlYW5HZW5lcmF0aW9uID0gdGhpcy5jaGFuZ2VHZW5lcmF0aW9uKHRydWUpCiAgfSwKICBjaGFuZ2VHZW5lcmF0aW9uOiBmdW5jdGlvbihmb3JjZVNwbGl0KSB7CiAgICBpZiAoZm9yY2VTcGxpdCkKICAgICAgeyB0aGlzLmhpc3RvcnkubGFzdE9wID0gdGhpcy5oaXN0b3J5Lmxhc3RTZWxPcCA9IHRoaXMuaGlzdG9yeS5sYXN0T3JpZ2luID0gbnVsbCB9CiAgICByZXR1cm4gdGhpcy5oaXN0b3J5LmdlbmVyYXRpb24KICB9LAogIGlzQ2xlYW46IGZ1bmN0aW9uIChnZW4pIHsKICAgIHJldHVybiB0aGlzLmhpc3RvcnkuZ2VuZXJhdGlvbiA9PSAoZ2VuIHx8IHRoaXMuY2xlYW5HZW5lcmF0aW9uKQogIH0sCgogIGdldEhpc3Rvcnk6IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHtkb25lOiBjb3B5SGlzdG9yeUFycmF5KHRoaXMuaGlzdG9yeS5kb25lKSwKICAgICAgICAgICAgdW5kb25lOiBjb3B5SGlzdG9yeUFycmF5KHRoaXMuaGlzdG9yeS51bmRvbmUpfQogIH0sCiAgc2V0SGlzdG9yeTogZnVuY3Rpb24oaGlzdERhdGEpIHsKICAgIHZhciBoaXN0ID0gdGhpcy5oaXN0b3J5ID0gbmV3IEhpc3RvcnkodGhpcy5oaXN0b3J5Lm1heEdlbmVyYXRpb24pCiAgICBoaXN0LmRvbmUgPSBjb3B5SGlzdG9yeUFycmF5KGhpc3REYXRhLmRvbmUuc2xpY2UoMCksIG51bGwsIHRydWUpCiAgICBoaXN0LnVuZG9uZSA9IGNvcHlIaXN0b3J5QXJyYXkoaGlzdERhdGEudW5kb25lLnNsaWNlKDApLCBudWxsLCB0cnVlKQogIH0sCgogIGFkZExpbmVDbGFzczogZG9jTWV0aG9kT3AoZnVuY3Rpb24oaGFuZGxlLCB3aGVyZSwgY2xzKSB7CiAgICByZXR1cm4gY2hhbmdlTGluZSh0aGlzLCBoYW5kbGUsIHdoZXJlID09ICJndXR0ZXIiID8gImd1dHRlciIgOiAiY2xhc3MiLCBmdW5jdGlvbiAobGluZSkgewogICAgICB2YXIgcHJvcCA9IHdoZXJlID09ICJ0ZXh0IiA/ICJ0ZXh0Q2xhc3MiCiAgICAgICAgICAgICAgIDogd2hlcmUgPT0gImJhY2tncm91bmQiID8gImJnQ2xhc3MiCiAgICAgICAgICAgICAgIDogd2hlcmUgPT0gImd1dHRlciIgPyAiZ3V0dGVyQ2xhc3MiIDogIndyYXBDbGFzcyIKICAgICAgaWYgKCFsaW5lW3Byb3BdKSB7IGxpbmVbcHJvcF0gPSBjbHMgfQogICAgICBlbHNlIGlmIChjbGFzc1Rlc3QoY2xzKS50ZXN0KGxpbmVbcHJvcF0pKSB7IHJldHVybiBmYWxzZSB9CiAgICAgIGVsc2UgeyBsaW5lW3Byb3BdICs9ICIgIiArIGNscyB9CiAgICAgIHJldHVybiB0cnVlCiAgICB9KQogIH0pLAogIHJlbW92ZUxpbmVDbGFzczogZG9jTWV0aG9kT3AoZnVuY3Rpb24oaGFuZGxlLCB3aGVyZSwgY2xzKSB7CiAgICByZXR1cm4gY2hhbmdlTGluZSh0aGlzLCBoYW5kbGUsIHdoZXJlID09ICJndXR0ZXIiID8gImd1dHRlciIgOiAiY2xhc3MiLCBmdW5jdGlvbiAobGluZSkgewogICAgICB2YXIgcHJvcCA9IHdoZXJlID09ICJ0ZXh0IiA/ICJ0ZXh0Q2xhc3MiCiAgICAgICAgICAgICAgIDogd2hlcmUgPT0gImJhY2tncm91bmQiID8gImJnQ2xhc3MiCiAgICAgICAgICAgICAgIDogd2hlcmUgPT0gImd1dHRlciIgPyAiZ3V0dGVyQ2xhc3MiIDogIndyYXBDbGFzcyIKICAgICAgdmFyIGN1ciA9IGxpbmVbcHJvcF0KICAgICAgaWYgKCFjdXIpIHsgcmV0dXJuIGZhbHNlIH0KICAgICAgZWxzZSBpZiAoY2xzID09IG51bGwpIHsgbGluZVtwcm9wXSA9IG51bGwgfQogICAgICBlbHNlIHsKICAgICAgICB2YXIgZm91bmQgPSBjdXIubWF0Y2goY2xhc3NUZXN0KGNscykpCiAgICAgICAgaWYgKCFmb3VuZCkgeyByZXR1cm4gZmFsc2UgfQogICAgICAgIHZhciBlbmQgPSBmb3VuZC5pbmRleCArIGZvdW5kWzBdLmxlbmd0aAogICAgICAgIGxpbmVbcHJvcF0gPSBjdXIuc2xpY2UoMCwgZm91bmQuaW5kZXgpICsgKCFmb3VuZC5pbmRleCB8fCBlbmQgPT0gY3VyLmxlbmd0aCA/ICIiIDogIiAiKSArIGN1ci5zbGljZShlbmQpIHx8IG51bGwKICAgICAgfQogICAgICByZXR1cm4gdHJ1ZQogICAgfSkKICB9KSwKCiAgYWRkTGluZVdpZGdldDogZG9jTWV0aG9kT3AoZnVuY3Rpb24oaGFuZGxlLCBub2RlLCBvcHRpb25zKSB7CiAgICByZXR1cm4gYWRkTGluZVdpZGdldCh0aGlzLCBoYW5kbGUsIG5vZGUsIG9wdGlvbnMpCiAgfSksCiAgcmVtb3ZlTGluZVdpZGdldDogZnVuY3Rpb24od2lkZ2V0KSB7IHdpZGdldC5jbGVhcigpIH0sCgogIG1hcmtUZXh0OiBmdW5jdGlvbihmcm9tLCB0bywgb3B0aW9ucykgewogICAgcmV0dXJuIG1hcmtUZXh0KHRoaXMsIGNsaXBQb3ModGhpcywgZnJvbSksIGNsaXBQb3ModGhpcywgdG8pLCBvcHRpb25zLCBvcHRpb25zICYmIG9wdGlvbnMudHlwZSB8fCAicmFuZ2UiKQogIH0sCiAgc2V0Qm9va21hcms6IGZ1bmN0aW9uKHBvcywgb3B0aW9ucykgewogICAgdmFyIHJlYWxPcHRzID0ge3JlcGxhY2VkV2l0aDogb3B0aW9ucyAmJiAob3B0aW9ucy5ub2RlVHlwZSA9PSBudWxsID8gb3B0aW9ucy53aWRnZXQgOiBvcHRpb25zKSwKICAgICAgICAgICAgICAgICAgICBpbnNlcnRMZWZ0OiBvcHRpb25zICYmIG9wdGlvbnMuaW5zZXJ0TGVmdCwKICAgICAgICAgICAgICAgICAgICBjbGVhcldoZW5FbXB0eTogZmFsc2UsIHNoYXJlZDogb3B0aW9ucyAmJiBvcHRpb25zLnNoYXJlZCwKICAgICAgICAgICAgICAgICAgICBoYW5kbGVNb3VzZUV2ZW50czogb3B0aW9ucyAmJiBvcHRpb25zLmhhbmRsZU1vdXNlRXZlbnRzfQogICAgcG9zID0gY2xpcFBvcyh0aGlzLCBwb3MpCiAgICByZXR1cm4gbWFya1RleHQodGhpcywgcG9zLCBwb3MsIHJlYWxPcHRzLCAiYm9va21hcmsiKQogIH0sCiAgZmluZE1hcmtzQXQ6IGZ1bmN0aW9uKHBvcykgewogICAgcG9zID0gY2xpcFBvcyh0aGlzLCBwb3MpCiAgICB2YXIgbWFya2VycyA9IFtdLCBzcGFucyA9IGdldExpbmUodGhpcywgcG9zLmxpbmUpLm1hcmtlZFNwYW5zCiAgICBpZiAoc3BhbnMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBzcGFucy5sZW5ndGg7ICsraSkgewogICAgICB2YXIgc3BhbiA9IHNwYW5zW2ldCiAgICAgIGlmICgoc3Bhbi5mcm9tID09IG51bGwgfHwgc3Bhbi5mcm9tIDw9IHBvcy5jaCkgJiYKICAgICAgICAgIChzcGFuLnRvID09IG51bGwgfHwgc3Bhbi50byA+PSBwb3MuY2gpKQogICAgICAgIHsgbWFya2Vycy5wdXNoKHNwYW4ubWFya2VyLnBhcmVudCB8fCBzcGFuLm1hcmtlcikgfQogICAgfSB9CiAgICByZXR1cm4gbWFya2VycwogIH0sCiAgZmluZE1hcmtzOiBmdW5jdGlvbihmcm9tLCB0bywgZmlsdGVyKSB7CiAgICBmcm9tID0gY2xpcFBvcyh0aGlzLCBmcm9tKTsgdG8gPSBjbGlwUG9zKHRoaXMsIHRvKQogICAgdmFyIGZvdW5kID0gW10sIGxpbmVObyQkMSA9IGZyb20ubGluZQogICAgdGhpcy5pdGVyKGZyb20ubGluZSwgdG8ubGluZSArIDEsIGZ1bmN0aW9uIChsaW5lKSB7CiAgICAgIHZhciBzcGFucyA9IGxpbmUubWFya2VkU3BhbnMKICAgICAgaWYgKHNwYW5zKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgc3BhbnMubGVuZ3RoOyBpKyspIHsKICAgICAgICB2YXIgc3BhbiA9IHNwYW5zW2ldCiAgICAgICAgaWYgKCEoc3Bhbi50byAhPSBudWxsICYmIGxpbmVObyQkMSA9PSBmcm9tLmxpbmUgJiYgZnJvbS5jaCA+PSBzcGFuLnRvIHx8CiAgICAgICAgICAgICAgc3Bhbi5mcm9tID09IG51bGwgJiYgbGluZU5vJCQxICE9IGZyb20ubGluZSB8fAogICAgICAgICAgICAgIHNwYW4uZnJvbSAhPSBudWxsICYmIGxpbmVObyQkMSA9PSB0by5saW5lICYmIHNwYW4uZnJvbSA+PSB0by5jaCkgJiYKICAgICAgICAgICAgKCFmaWx0ZXIgfHwgZmlsdGVyKHNwYW4ubWFya2VyKSkpCiAgICAgICAgICB7IGZvdW5kLnB1c2goc3Bhbi5tYXJrZXIucGFyZW50IHx8IHNwYW4ubWFya2VyKSB9CiAgICAgIH0gfQogICAgICArK2xpbmVObyQkMQogICAgfSkKICAgIHJldHVybiBmb3VuZAogIH0sCiAgZ2V0QWxsTWFya3M6IGZ1bmN0aW9uKCkgewogICAgdmFyIG1hcmtlcnMgPSBbXQogICAgdGhpcy5pdGVyKGZ1bmN0aW9uIChsaW5lKSB7CiAgICAgIHZhciBzcHMgPSBsaW5lLm1hcmtlZFNwYW5zCiAgICAgIGlmIChzcHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBzcHMubGVuZ3RoOyArK2kpCiAgICAgICAgeyBpZiAoc3BzW2ldLmZyb20gIT0gbnVsbCkgeyBtYXJrZXJzLnB1c2goc3BzW2ldLm1hcmtlcikgfSB9IH0KICAgIH0pCiAgICByZXR1cm4gbWFya2VycwogIH0sCgogIHBvc0Zyb21JbmRleDogZnVuY3Rpb24ob2ZmKSB7CiAgICB2YXIgY2gsIGxpbmVObyQkMSA9IHRoaXMuZmlyc3QsIHNlcFNpemUgPSB0aGlzLmxpbmVTZXBhcmF0b3IoKS5sZW5ndGgKICAgIHRoaXMuaXRlcihmdW5jdGlvbiAobGluZSkgewogICAgICB2YXIgc3ogPSBsaW5lLnRleHQubGVuZ3RoICsgc2VwU2l6ZQogICAgICBpZiAoc3ogPiBvZmYpIHsgY2ggPSBvZmY7IHJldHVybiB0cnVlIH0KICAgICAgb2ZmIC09IHN6CiAgICAgICsrbGluZU5vJCQxCiAgICB9KQogICAgcmV0dXJuIGNsaXBQb3ModGhpcywgUG9zKGxpbmVObyQkMSwgY2gpKQogIH0sCiAgaW5kZXhGcm9tUG9zOiBmdW5jdGlvbiAoY29vcmRzKSB7CiAgICBjb29yZHMgPSBjbGlwUG9zKHRoaXMsIGNvb3JkcykKICAgIHZhciBpbmRleCA9IGNvb3Jkcy5jaAogICAgaWYgKGNvb3Jkcy5saW5lIDwgdGhpcy5maXJzdCB8fCBjb29yZHMuY2ggPCAwKSB7IHJldHVybiAwIH0KICAgIHZhciBzZXBTaXplID0gdGhpcy5saW5lU2VwYXJhdG9yKCkubGVuZ3RoCiAgICB0aGlzLml0ZXIodGhpcy5maXJzdCwgY29vcmRzLmxpbmUsIGZ1bmN0aW9uIChsaW5lKSB7IC8vIGl0ZXIgYWJvcnRzIHdoZW4gY2FsbGJhY2sgcmV0dXJucyBhIHRydXRoeSB2YWx1ZQogICAgICBpbmRleCArPSBsaW5lLnRleHQubGVuZ3RoICsgc2VwU2l6ZQogICAgfSkKICAgIHJldHVybiBpbmRleAogIH0sCgogIGNvcHk6IGZ1bmN0aW9uKGNvcHlIaXN0b3J5KSB7CiAgICB2YXIgZG9jID0gbmV3IERvYyhnZXRMaW5lcyh0aGlzLCB0aGlzLmZpcnN0LCB0aGlzLmZpcnN0ICsgdGhpcy5zaXplKSwKICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZU9wdGlvbiwgdGhpcy5maXJzdCwgdGhpcy5saW5lU2VwKQogICAgZG9jLnNjcm9sbFRvcCA9IHRoaXMuc2Nyb2xsVG9wOyBkb2Muc2Nyb2xsTGVmdCA9IHRoaXMuc2Nyb2xsTGVmdAogICAgZG9jLnNlbCA9IHRoaXMuc2VsCiAgICBkb2MuZXh0ZW5kID0gZmFsc2UKICAgIGlmIChjb3B5SGlzdG9yeSkgewogICAgICBkb2MuaGlzdG9yeS51bmRvRGVwdGggPSB0aGlzLmhpc3RvcnkudW5kb0RlcHRoCiAgICAgIGRvYy5zZXRIaXN0b3J5KHRoaXMuZ2V0SGlzdG9yeSgpKQogICAgfQogICAgcmV0dXJuIGRvYwogIH0sCgogIGxpbmtlZERvYzogZnVuY3Rpb24ob3B0aW9ucykgewogICAgaWYgKCFvcHRpb25zKSB7IG9wdGlvbnMgPSB7fSB9CiAgICB2YXIgZnJvbSA9IHRoaXMuZmlyc3QsIHRvID0gdGhpcy5maXJzdCArIHRoaXMuc2l6ZQogICAgaWYgKG9wdGlvbnMuZnJvbSAhPSBudWxsICYmIG9wdGlvbnMuZnJvbSA+IGZyb20pIHsgZnJvbSA9IG9wdGlvbnMuZnJvbSB9CiAgICBpZiAob3B0aW9ucy50byAhPSBudWxsICYmIG9wdGlvbnMudG8gPCB0bykgeyB0byA9IG9wdGlvbnMudG8gfQogICAgdmFyIGNvcHkgPSBuZXcgRG9jKGdldExpbmVzKHRoaXMsIGZyb20sIHRvKSwgb3B0aW9ucy5tb2RlIHx8IHRoaXMubW9kZU9wdGlvbiwgZnJvbSwgdGhpcy5saW5lU2VwKQogICAgaWYgKG9wdGlvbnMuc2hhcmVkSGlzdCkgeyBjb3B5Lmhpc3RvcnkgPSB0aGlzLmhpc3RvcnkKICAgIDsgfSh0aGlzLmxpbmtlZCB8fCAodGhpcy5saW5rZWQgPSBbXSkpLnB1c2goe2RvYzogY29weSwgc2hhcmVkSGlzdDogb3B0aW9ucy5zaGFyZWRIaXN0fSkKICAgIGNvcHkubGlua2VkID0gW3tkb2M6IHRoaXMsIGlzUGFyZW50OiB0cnVlLCBzaGFyZWRIaXN0OiBvcHRpb25zLnNoYXJlZEhpc3R9XQogICAgY29weVNoYXJlZE1hcmtlcnMoY29weSwgZmluZFNoYXJlZE1hcmtlcnModGhpcykpCiAgICByZXR1cm4gY29weQogIH0sCiAgdW5saW5rRG9jOiBmdW5jdGlvbihvdGhlcikgewogICAgdmFyIHRoaXMkMSA9IHRoaXM7CgogICAgaWYgKG90aGVyIGluc3RhbmNlb2YgQ29kZU1pcnJvciQxKSB7IG90aGVyID0gb3RoZXIuZG9jIH0KICAgIGlmICh0aGlzLmxpbmtlZCkgeyBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMubGlua2VkLmxlbmd0aDsgKytpKSB7CiAgICAgIHZhciBsaW5rID0gdGhpcyQxLmxpbmtlZFtpXQogICAgICBpZiAobGluay5kb2MgIT0gb3RoZXIpIHsgY29udGludWUgfQogICAgICB0aGlzJDEubGlua2VkLnNwbGljZShpLCAxKQogICAgICBvdGhlci51bmxpbmtEb2ModGhpcyQxKQogICAgICBkZXRhY2hTaGFyZWRNYXJrZXJzKGZpbmRTaGFyZWRNYXJrZXJzKHRoaXMkMSkpCiAgICAgIGJyZWFrCiAgICB9IH0KICAgIC8vIElmIHRoZSBoaXN0b3JpZXMgd2VyZSBzaGFyZWQsIHNwbGl0IHRoZW0gYWdhaW4KICAgIGlmIChvdGhlci5oaXN0b3J5ID09IHRoaXMuaGlzdG9yeSkgewogICAgICB2YXIgc3BsaXRJZHMgPSBbb3RoZXIuaWRdCiAgICAgIGxpbmtlZERvY3Mob3RoZXIsIGZ1bmN0aW9uIChkb2MpIHsgcmV0dXJuIHNwbGl0SWRzLnB1c2goZG9jLmlkKTsgfSwgdHJ1ZSkKICAgICAgb3RoZXIuaGlzdG9yeSA9IG5ldyBIaXN0b3J5KG51bGwpCiAgICAgIG90aGVyLmhpc3RvcnkuZG9uZSA9IGNvcHlIaXN0b3J5QXJyYXkodGhpcy5oaXN0b3J5LmRvbmUsIHNwbGl0SWRzKQogICAgICBvdGhlci5oaXN0b3J5LnVuZG9uZSA9IGNvcHlIaXN0b3J5QXJyYXkodGhpcy5oaXN0b3J5LnVuZG9uZSwgc3BsaXRJZHMpCiAgICB9CiAgfSwKICBpdGVyTGlua2VkRG9jczogZnVuY3Rpb24oZikge2xpbmtlZERvY3ModGhpcywgZil9LAoKICBnZXRNb2RlOiBmdW5jdGlvbigpIHtyZXR1cm4gdGhpcy5tb2RlfSwKICBnZXRFZGl0b3I6IGZ1bmN0aW9uKCkge3JldHVybiB0aGlzLmNtfSwKCiAgc3BsaXRMaW5lczogZnVuY3Rpb24oc3RyKSB7CiAgICBpZiAodGhpcy5saW5lU2VwKSB7IHJldHVybiBzdHIuc3BsaXQodGhpcy5saW5lU2VwKSB9CiAgICByZXR1cm4gc3BsaXRMaW5lc0F1dG8oc3RyKQogIH0sCiAgbGluZVNlcGFyYXRvcjogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLmxpbmVTZXAgfHwgIlxuIiB9Cn0pCgovLyBQdWJsaWMgYWxpYXMuCkRvYy5wcm90b3R5cGUuZWFjaExpbmUgPSBEb2MucHJvdG90eXBlLml0ZXIKCi8vIEtsdWRnZSB0byB3b3JrIGFyb3VuZCBzdHJhbmdlIElFIGJlaGF2aW9yIHdoZXJlIGl0J2xsIHNvbWV0aW1lcwovLyByZS1maXJlIGEgc2VyaWVzIG9mIGRyYWctcmVsYXRlZCBldmVudHMgcmlnaHQgYWZ0ZXIgdGhlIGRyb3AgKCMxNTUxKQp2YXIgbGFzdERyb3AgPSAwCgpmdW5jdGlvbiBvbkRyb3AoZSkgewogIHZhciBjbSA9IHRoaXMKICBjbGVhckRyYWdDdXJzb3IoY20pCiAgaWYgKHNpZ25hbERPTUV2ZW50KGNtLCBlKSB8fCBldmVudEluV2lkZ2V0KGNtLmRpc3BsYXksIGUpKQogICAgeyByZXR1cm4gfQogIGVfcHJldmVudERlZmF1bHQoZSkKICBpZiAoaWUpIHsgbGFzdERyb3AgPSArbmV3IERhdGUgfQogIHZhciBwb3MgPSBwb3NGcm9tTW91c2UoY20sIGUsIHRydWUpLCBmaWxlcyA9IGUuZGF0YVRyYW5zZmVyLmZpbGVzCiAgaWYgKCFwb3MgfHwgY20uaXNSZWFkT25seSgpKSB7IHJldHVybiB9CiAgLy8gTWlnaHQgYmUgYSBmaWxlIGRyb3AsIGluIHdoaWNoIGNhc2Ugd2Ugc2ltcGx5IGV4dHJhY3QgdGhlIHRleHQKICAvLyBhbmQgaW5zZXJ0IGl0LgogIGlmIChmaWxlcyAmJiBmaWxlcy5sZW5ndGggJiYgd2luZG93LkZpbGVSZWFkZXIgJiYgd2luZG93LkZpbGUpIHsKICAgIHZhciBuID0gZmlsZXMubGVuZ3RoLCB0ZXh0ID0gQXJyYXkobiksIHJlYWQgPSAwCiAgICB2YXIgbG9hZEZpbGUgPSBmdW5jdGlvbiAoZmlsZSwgaSkgewogICAgICBpZiAoY20ub3B0aW9ucy5hbGxvd0Ryb3BGaWxlVHlwZXMgJiYKICAgICAgICAgIGluZGV4T2YoY20ub3B0aW9ucy5hbGxvd0Ryb3BGaWxlVHlwZXMsIGZpbGUudHlwZSkgPT0gLTEpCiAgICAgICAgeyByZXR1cm4gfQoKICAgICAgdmFyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyCiAgICAgIHJlYWRlci5vbmxvYWQgPSBvcGVyYXRpb24oY20sIGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgY29udGVudCA9IHJlYWRlci5yZXN1bHQKICAgICAgICBpZiAoL1tceDAwLVx4MDhceDBlLVx4MWZdezJ9Ly50ZXN0KGNvbnRlbnQpKSB7IGNvbnRlbnQgPSAiIiB9CiAgICAgICAgdGV4dFtpXSA9IGNvbnRlbnQKICAgICAgICBpZiAoKytyZWFkID09IG4pIHsKICAgICAgICAgIHBvcyA9IGNsaXBQb3MoY20uZG9jLCBwb3MpCiAgICAgICAgICB2YXIgY2hhbmdlID0ge2Zyb206IHBvcywgdG86IHBvcywKICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogY20uZG9jLnNwbGl0TGluZXModGV4dC5qb2luKGNtLmRvYy5saW5lU2VwYXJhdG9yKCkpKSwKICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luOiAicGFzdGUifQogICAgICAgICAgbWFrZUNoYW5nZShjbS5kb2MsIGNoYW5nZSkKICAgICAgICAgIHNldFNlbGVjdGlvblJlcGxhY2VIaXN0b3J5KGNtLmRvYywgc2ltcGxlU2VsZWN0aW9uKHBvcywgY2hhbmdlRW5kKGNoYW5nZSkpKQogICAgICAgIH0KICAgICAgfSkKICAgICAgcmVhZGVyLnJlYWRBc1RleHQoZmlsZSkKICAgIH0KICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgKytpKSB7IGxvYWRGaWxlKGZpbGVzW2ldLCBpKSB9CiAgfSBlbHNlIHsgLy8gTm9ybWFsIGRyb3AKICAgIC8vIERvbid0IGRvIGEgcmVwbGFjZSBpZiB0aGUgZHJvcCBoYXBwZW5lZCBpbnNpZGUgb2YgdGhlIHNlbGVjdGVkIHRleHQuCiAgICBpZiAoY20uc3RhdGUuZHJhZ2dpbmdUZXh0ICYmIGNtLmRvYy5zZWwuY29udGFpbnMocG9zKSA+IC0xKSB7CiAgICAgIGNtLnN0YXRlLmRyYWdnaW5nVGV4dChlKQogICAgICAvLyBFbnN1cmUgdGhlIGVkaXRvciBpcyByZS1mb2N1c2VkCiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyByZXR1cm4gY20uZGlzcGxheS5pbnB1dC5mb2N1cygpOyB9LCAyMCkKICAgICAgcmV0dXJuCiAgICB9CiAgICB0cnkgewogICAgICB2YXIgdGV4dCQxID0gZS5kYXRhVHJhbnNmZXIuZ2V0RGF0YSgiVGV4dCIpCiAgICAgIGlmICh0ZXh0JDEpIHsKICAgICAgICB2YXIgc2VsZWN0ZWQKICAgICAgICBpZiAoY20uc3RhdGUuZHJhZ2dpbmdUZXh0ICYmICFjbS5zdGF0ZS5kcmFnZ2luZ1RleHQuY29weSkKICAgICAgICAgIHsgc2VsZWN0ZWQgPSBjbS5saXN0U2VsZWN0aW9ucygpIH0KICAgICAgICBzZXRTZWxlY3Rpb25Ob1VuZG8oY20uZG9jLCBzaW1wbGVTZWxlY3Rpb24ocG9zLCBwb3MpKQogICAgICAgIGlmIChzZWxlY3RlZCkgeyBmb3IgKHZhciBpJDEgPSAwOyBpJDEgPCBzZWxlY3RlZC5sZW5ndGg7ICsraSQxKQogICAgICAgICAgeyByZXBsYWNlUmFuZ2UoY20uZG9jLCAiIiwgc2VsZWN0ZWRbaSQxXS5hbmNob3IsIHNlbGVjdGVkW2kkMV0uaGVhZCwgImRyYWciKSB9IH0KICAgICAgICBjbS5yZXBsYWNlU2VsZWN0aW9uKHRleHQkMSwgImFyb3VuZCIsICJwYXN0ZSIpCiAgICAgICAgY20uZGlzcGxheS5pbnB1dC5mb2N1cygpCiAgICAgIH0KICAgIH0KICAgIGNhdGNoKGUpe30KICB9Cn0KCmZ1bmN0aW9uIG9uRHJhZ1N0YXJ0KGNtLCBlKSB7CiAgaWYgKGllICYmICghY20uc3RhdGUuZHJhZ2dpbmdUZXh0IHx8ICtuZXcgRGF0ZSAtIGxhc3REcm9wIDwgMTAwKSkgeyBlX3N0b3AoZSk7IHJldHVybiB9CiAgaWYgKHNpZ25hbERPTUV2ZW50KGNtLCBlKSB8fCBldmVudEluV2lkZ2V0KGNtLmRpc3BsYXksIGUpKSB7IHJldHVybiB9CgogIGUuZGF0YVRyYW5zZmVyLnNldERhdGEoIlRleHQiLCBjbS5nZXRTZWxlY3Rpb24oKSkKICBlLmRhdGFUcmFuc2Zlci5lZmZlY3RBbGxvd2VkID0gImNvcHlNb3ZlIgoKICAvLyBVc2UgZHVtbXkgaW1hZ2UgaW5zdGVhZCBvZiBkZWZhdWx0IGJyb3dzZXJzIGltYWdlLgogIC8vIFJlY2VudCBTYWZhcmkgKH42LjAuMikgaGF2ZSBhIHRlbmRlbmN5IHRvIHNlZ2ZhdWx0IHdoZW4gdGhpcyBoYXBwZW5zLCBzbyB3ZSBkb24ndCBkbyBpdCB0aGVyZS4KICBpZiAoZS5kYXRhVHJhbnNmZXIuc2V0RHJhZ0ltYWdlICYmICFzYWZhcmkpIHsKICAgIHZhciBpbWcgPSBlbHQoImltZyIsIG51bGwsIG51bGwsICJwb3NpdGlvbjogZml4ZWQ7IGxlZnQ6IDA7IHRvcDogMDsiKQogICAgaW1nLnNyYyA9ICJkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhBUUFCQUFBQUFDSDVCQUVLQUFFQUxBQUFBQUFCQUFFQUFBSUNUQUVBT3c9PSIKICAgIGlmIChwcmVzdG8pIHsKICAgICAgaW1nLndpZHRoID0gaW1nLmhlaWdodCA9IDEKICAgICAgY20uZGlzcGxheS53cmFwcGVyLmFwcGVuZENoaWxkKGltZykKICAgICAgLy8gRm9yY2UgYSByZWxheW91dCwgb3IgT3BlcmEgd29uJ3QgdXNlIG91ciBpbWFnZSBmb3Igc29tZSBvYnNjdXJlIHJlYXNvbgogICAgICBpbWcuX3RvcCA9IGltZy5vZmZzZXRUb3AKICAgIH0KICAgIGUuZGF0YVRyYW5zZmVyLnNldERyYWdJbWFnZShpbWcsIDAsIDApCiAgICBpZiAocHJlc3RvKSB7IGltZy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGltZykgfQogIH0KfQoKZnVuY3Rpb24gb25EcmFnT3ZlcihjbSwgZSkgewogIHZhciBwb3MgPSBwb3NGcm9tTW91c2UoY20sIGUpCiAgaWYgKCFwb3MpIHsgcmV0dXJuIH0KICB2YXIgZnJhZyA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKQogIGRyYXdTZWxlY3Rpb25DdXJzb3IoY20sIHBvcywgZnJhZykKICBpZiAoIWNtLmRpc3BsYXkuZHJhZ0N1cnNvcikgewogICAgY20uZGlzcGxheS5kcmFnQ3Vyc29yID0gZWx0KCJkaXYiLCBudWxsLCAiQ29kZU1pcnJvci1jdXJzb3JzIENvZGVNaXJyb3ItZHJhZ2N1cnNvcnMiKQogICAgY20uZGlzcGxheS5saW5lU3BhY2UuaW5zZXJ0QmVmb3JlKGNtLmRpc3BsYXkuZHJhZ0N1cnNvciwgY20uZGlzcGxheS5jdXJzb3JEaXYpCiAgfQogIHJlbW92ZUNoaWxkcmVuQW5kQWRkKGNtLmRpc3BsYXkuZHJhZ0N1cnNvciwgZnJhZykKfQoKZnVuY3Rpb24gY2xlYXJEcmFnQ3Vyc29yKGNtKSB7CiAgaWYgKGNtLmRpc3BsYXkuZHJhZ0N1cnNvcikgewogICAgY20uZGlzcGxheS5saW5lU3BhY2UucmVtb3ZlQ2hpbGQoY20uZGlzcGxheS5kcmFnQ3Vyc29yKQogICAgY20uZGlzcGxheS5kcmFnQ3Vyc29yID0gbnVsbAogIH0KfQoKLy8gVGhlc2UgbXVzdCBiZSBoYW5kbGVkIGNhcmVmdWxseSwgYmVjYXVzZSBuYWl2ZWx5IHJlZ2lzdGVyaW5nIGEKLy8gaGFuZGxlciBmb3IgZWFjaCBlZGl0b3Igd2lsbCBjYXVzZSB0aGUgZWRpdG9ycyB0byBuZXZlciBiZQovLyBnYXJiYWdlIGNvbGxlY3RlZC4KCmZ1bmN0aW9uIGZvckVhY2hDb2RlTWlycm9yKGYpIHsKICBpZiAoIWRvY3VtZW50LmJvZHkuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSkgeyByZXR1cm4gfQogIHZhciBieUNsYXNzID0gZG9jdW1lbnQuYm9keS5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKCJDb2RlTWlycm9yIikKICBmb3IgKHZhciBpID0gMDsgaSA8IGJ5Q2xhc3MubGVuZ3RoOyBpKyspIHsKICAgIHZhciBjbSA9IGJ5Q2xhc3NbaV0uQ29kZU1pcnJvcgogICAgaWYgKGNtKSB7IGYoY20pIH0KICB9Cn0KCnZhciBnbG9iYWxzUmVnaXN0ZXJlZCA9IGZhbHNlCmZ1bmN0aW9uIGVuc3VyZUdsb2JhbEhhbmRsZXJzKCkgewogIGlmIChnbG9iYWxzUmVnaXN0ZXJlZCkgeyByZXR1cm4gfQogIHJlZ2lzdGVyR2xvYmFsSGFuZGxlcnMoKQogIGdsb2JhbHNSZWdpc3RlcmVkID0gdHJ1ZQp9CmZ1bmN0aW9uIHJlZ2lzdGVyR2xvYmFsSGFuZGxlcnMoKSB7CiAgLy8gV2hlbiB0aGUgd2luZG93IHJlc2l6ZXMsIHdlIG5lZWQgdG8gcmVmcmVzaCBhY3RpdmUgZWRpdG9ycy4KICB2YXIgcmVzaXplVGltZXIKICBvbih3aW5kb3csICJyZXNpemUiLCBmdW5jdGlvbiAoKSB7CiAgICBpZiAocmVzaXplVGltZXIgPT0gbnVsbCkgeyByZXNpemVUaW1lciA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICByZXNpemVUaW1lciA9IG51bGwKICAgICAgZm9yRWFjaENvZGVNaXJyb3Iob25SZXNpemUpCiAgICB9LCAxMDApIH0KICB9KQogIC8vIFdoZW4gdGhlIHdpbmRvdyBsb3NlcyBmb2N1cywgd2Ugd2FudCB0byBzaG93IHRoZSBlZGl0b3IgYXMgYmx1cnJlZAogIG9uKHdpbmRvdywgImJsdXIiLCBmdW5jdGlvbiAoKSB7IHJldHVybiBmb3JFYWNoQ29kZU1pcnJvcihvbkJsdXIpOyB9KQp9Ci8vIENhbGxlZCB3aGVuIHRoZSB3aW5kb3cgcmVzaXplcwpmdW5jdGlvbiBvblJlc2l6ZShjbSkgewogIHZhciBkID0gY20uZGlzcGxheQogIGlmIChkLmxhc3RXcmFwSGVpZ2h0ID09IGQud3JhcHBlci5jbGllbnRIZWlnaHQgJiYgZC5sYXN0V3JhcFdpZHRoID09IGQud3JhcHBlci5jbGllbnRXaWR0aCkKICAgIHsgcmV0dXJuIH0KICAvLyBNaWdodCBiZSBhIHRleHQgc2NhbGluZyBvcGVyYXRpb24sIGNsZWFyIHNpemUgY2FjaGVzLgogIGQuY2FjaGVkQ2hhcldpZHRoID0gZC5jYWNoZWRUZXh0SGVpZ2h0ID0gZC5jYWNoZWRQYWRkaW5nSCA9IG51bGwKICBkLnNjcm9sbGJhcnNDbGlwcGVkID0gZmFsc2UKICBjbS5zZXRTaXplKCkKfQoKdmFyIGtleU5hbWVzID0gewogIDM6ICJFbnRlciIsIDg6ICJCYWNrc3BhY2UiLCA5OiAiVGFiIiwgMTM6ICJFbnRlciIsIDE2OiAiU2hpZnQiLCAxNzogIkN0cmwiLCAxODogIkFsdCIsCiAgMTk6ICJQYXVzZSIsIDIwOiAiQ2Fwc0xvY2siLCAyNzogIkVzYyIsIDMyOiAiU3BhY2UiLCAzMzogIlBhZ2VVcCIsIDM0OiAiUGFnZURvd24iLCAzNTogIkVuZCIsCiAgMzY6ICJIb21lIiwgMzc6ICJMZWZ0IiwgMzg6ICJVcCIsIDM5OiAiUmlnaHQiLCA0MDogIkRvd24iLCA0NDogIlByaW50U2NybiIsIDQ1OiAiSW5zZXJ0IiwKICA0NjogIkRlbGV0ZSIsIDU5OiAiOyIsIDYxOiAiPSIsIDkxOiAiTW9kIiwgOTI6ICJNb2QiLCA5MzogIk1vZCIsCiAgMTA2OiAiKiIsIDEwNzogIj0iLCAxMDk6ICItIiwgMTEwOiAiLiIsIDExMTogIi8iLCAxMjc6ICJEZWxldGUiLAogIDE3MzogIi0iLCAxODY6ICI7IiwgMTg3OiAiPSIsIDE4ODogIiwiLCAxODk6ICItIiwgMTkwOiAiLiIsIDE5MTogIi8iLCAxOTI6ICJgIiwgMjE5OiAiWyIsIDIyMDogIlxcIiwKICAyMjE6ICJdIiwgMjIyOiAiJyIsIDYzMjMyOiAiVXAiLCA2MzIzMzogIkRvd24iLCA2MzIzNDogIkxlZnQiLCA2MzIzNTogIlJpZ2h0IiwgNjMyNzI6ICJEZWxldGUiLAogIDYzMjczOiAiSG9tZSIsIDYzMjc1OiAiRW5kIiwgNjMyNzY6ICJQYWdlVXAiLCA2MzI3NzogIlBhZ2VEb3duIiwgNjMzMDI6ICJJbnNlcnQiCn0KCi8vIE51bWJlciBrZXlzCmZvciAodmFyIGkgPSAwOyBpIDwgMTA7IGkrKykgeyBrZXlOYW1lc1tpICsgNDhdID0ga2V5TmFtZXNbaSArIDk2XSA9IFN0cmluZyhpKSB9Ci8vIEFscGhhYmV0aWMga2V5cwpmb3IgKHZhciBpJDEgPSA2NTsgaSQxIDw9IDkwOyBpJDErKykgeyBrZXlOYW1lc1tpJDFdID0gU3RyaW5nLmZyb21DaGFyQ29kZShpJDEpIH0KLy8gRnVuY3Rpb24ga2V5cwpmb3IgKHZhciBpJDIgPSAxOyBpJDIgPD0gMTI7IGkkMisrKSB7IGtleU5hbWVzW2kkMiArIDExMV0gPSBrZXlOYW1lc1tpJDIgKyA2MzIzNV0gPSAiRiIgKyBpJDIgfQoKdmFyIGtleU1hcCA9IHt9CgprZXlNYXAuYmFzaWMgPSB7CiAgIkxlZnQiOiAiZ29DaGFyTGVmdCIsICJSaWdodCI6ICJnb0NoYXJSaWdodCIsICJVcCI6ICJnb0xpbmVVcCIsICJEb3duIjogImdvTGluZURvd24iLAogICJFbmQiOiAiZ29MaW5lRW5kIiwgIkhvbWUiOiAiZ29MaW5lU3RhcnRTbWFydCIsICJQYWdlVXAiOiAiZ29QYWdlVXAiLCAiUGFnZURvd24iOiAiZ29QYWdlRG93biIsCiAgIkRlbGV0ZSI6ICJkZWxDaGFyQWZ0ZXIiLCAiQmFja3NwYWNlIjogImRlbENoYXJCZWZvcmUiLCAiU2hpZnQtQmFja3NwYWNlIjogImRlbENoYXJCZWZvcmUiLAogICJUYWIiOiAiZGVmYXVsdFRhYiIsICJTaGlmdC1UYWIiOiAiaW5kZW50QXV0byIsCiAgIkVudGVyIjogIm5ld2xpbmVBbmRJbmRlbnQiLCAiSW5zZXJ0IjogInRvZ2dsZU92ZXJ3cml0ZSIsCiAgIkVzYyI6ICJzaW5nbGVTZWxlY3Rpb24iCn0KLy8gTm90ZSB0aGF0IHRoZSBzYXZlIGFuZCBmaW5kLXJlbGF0ZWQgY29tbWFuZHMgYXJlbid0IGRlZmluZWQgYnkKLy8gZGVmYXVsdC4gVXNlciBjb2RlIG9yIGFkZG9ucyBjYW4gZGVmaW5lIHRoZW0uIFVua25vd24gY29tbWFuZHMKLy8gYXJlIHNpbXBseSBpZ25vcmVkLgprZXlNYXAucGNEZWZhdWx0ID0gewogICJDdHJsLUEiOiAic2VsZWN0QWxsIiwgIkN0cmwtRCI6ICJkZWxldGVMaW5lIiwgIkN0cmwtWiI6ICJ1bmRvIiwgIlNoaWZ0LUN0cmwtWiI6ICJyZWRvIiwgIkN0cmwtWSI6ICJyZWRvIiwKICAiQ3RybC1Ib21lIjogImdvRG9jU3RhcnQiLCAiQ3RybC1FbmQiOiAiZ29Eb2NFbmQiLCAiQ3RybC1VcCI6ICJnb0xpbmVVcCIsICJDdHJsLURvd24iOiAiZ29MaW5lRG93biIsCiAgIkN0cmwtTGVmdCI6ICJnb0dyb3VwTGVmdCIsICJDdHJsLVJpZ2h0IjogImdvR3JvdXBSaWdodCIsICJBbHQtTGVmdCI6ICJnb0xpbmVTdGFydCIsICJBbHQtUmlnaHQiOiAiZ29MaW5lRW5kIiwKICAiQ3RybC1CYWNrc3BhY2UiOiAiZGVsR3JvdXBCZWZvcmUiLCAiQ3RybC1EZWxldGUiOiAiZGVsR3JvdXBBZnRlciIsICJDdHJsLVMiOiAic2F2ZSIsICJDdHJsLUYiOiAiZmluZCIsCiAgIkN0cmwtRyI6ICJmaW5kTmV4dCIsICJTaGlmdC1DdHJsLUciOiAiZmluZFByZXYiLCAiU2hpZnQtQ3RybC1GIjogInJlcGxhY2UiLCAiU2hpZnQtQ3RybC1SIjogInJlcGxhY2VBbGwiLAogICJDdHJsLVsiOiAiaW5kZW50TGVzcyIsICJDdHJsLV0iOiAiaW5kZW50TW9yZSIsCiAgIkN0cmwtVSI6ICJ1bmRvU2VsZWN0aW9uIiwgIlNoaWZ0LUN0cmwtVSI6ICJyZWRvU2VsZWN0aW9uIiwgIkFsdC1VIjogInJlZG9TZWxlY3Rpb24iLAogIGZhbGx0aHJvdWdoOiAiYmFzaWMiCn0KLy8gVmVyeSBiYXNpYyByZWFkbGluZS9lbWFjcy1zdHlsZSBiaW5kaW5ncywgd2hpY2ggYXJlIHN0YW5kYXJkIG9uIE1hYy4Ka2V5TWFwLmVtYWNzeSA9IHsKICAiQ3RybC1GIjogImdvQ2hhclJpZ2h0IiwgIkN0cmwtQiI6ICJnb0NoYXJMZWZ0IiwgIkN0cmwtUCI6ICJnb0xpbmVVcCIsICJDdHJsLU4iOiAiZ29MaW5lRG93biIsCiAgIkFsdC1GIjogImdvV29yZFJpZ2h0IiwgIkFsdC1CIjogImdvV29yZExlZnQiLCAiQ3RybC1BIjogImdvTGluZVN0YXJ0IiwgIkN0cmwtRSI6ICJnb0xpbmVFbmQiLAogICJDdHJsLVYiOiAiZ29QYWdlRG93biIsICJTaGlmdC1DdHJsLVYiOiAiZ29QYWdlVXAiLCAiQ3RybC1EIjogImRlbENoYXJBZnRlciIsICJDdHJsLUgiOiAiZGVsQ2hhckJlZm9yZSIsCiAgIkFsdC1EIjogImRlbFdvcmRBZnRlciIsICJBbHQtQmFja3NwYWNlIjogImRlbFdvcmRCZWZvcmUiLCAiQ3RybC1LIjogImtpbGxMaW5lIiwgIkN0cmwtVCI6ICJ0cmFuc3Bvc2VDaGFycyIsCiAgIkN0cmwtTyI6ICJvcGVuTGluZSIKfQprZXlNYXAubWFjRGVmYXVsdCA9IHsKICAiQ21kLUEiOiAic2VsZWN0QWxsIiwgIkNtZC1EIjogImRlbGV0ZUxpbmUiLCAiQ21kLVoiOiAidW5kbyIsICJTaGlmdC1DbWQtWiI6ICJyZWRvIiwgIkNtZC1ZIjogInJlZG8iLAogICJDbWQtSG9tZSI6ICJnb0RvY1N0YXJ0IiwgIkNtZC1VcCI6ICJnb0RvY1N0YXJ0IiwgIkNtZC1FbmQiOiAiZ29Eb2NFbmQiLCAiQ21kLURvd24iOiAiZ29Eb2NFbmQiLCAiQWx0LUxlZnQiOiAiZ29Hcm91cExlZnQiLAogICJBbHQtUmlnaHQiOiAiZ29Hcm91cFJpZ2h0IiwgIkNtZC1MZWZ0IjogImdvTGluZUxlZnQiLCAiQ21kLVJpZ2h0IjogImdvTGluZVJpZ2h0IiwgIkFsdC1CYWNrc3BhY2UiOiAiZGVsR3JvdXBCZWZvcmUiLAogICJDdHJsLUFsdC1CYWNrc3BhY2UiOiAiZGVsR3JvdXBBZnRlciIsICJBbHQtRGVsZXRlIjogImRlbEdyb3VwQWZ0ZXIiLCAiQ21kLVMiOiAic2F2ZSIsICJDbWQtRiI6ICJmaW5kIiwKICAiQ21kLUciOiAiZmluZE5leHQiLCAiU2hpZnQtQ21kLUciOiAiZmluZFByZXYiLCAiQ21kLUFsdC1GIjogInJlcGxhY2UiLCAiU2hpZnQtQ21kLUFsdC1GIjogInJlcGxhY2VBbGwiLAogICJDbWQtWyI6ICJpbmRlbnRMZXNzIiwgIkNtZC1dIjogImluZGVudE1vcmUiLCAiQ21kLUJhY2tzcGFjZSI6ICJkZWxXcmFwcGVkTGluZUxlZnQiLCAiQ21kLURlbGV0ZSI6ICJkZWxXcmFwcGVkTGluZVJpZ2h0IiwKICAiQ21kLVUiOiAidW5kb1NlbGVjdGlvbiIsICJTaGlmdC1DbWQtVSI6ICJyZWRvU2VsZWN0aW9uIiwgIkN0cmwtVXAiOiAiZ29Eb2NTdGFydCIsICJDdHJsLURvd24iOiAiZ29Eb2NFbmQiLAogIGZhbGx0aHJvdWdoOiBbImJhc2ljIiwgImVtYWNzeSJdCn0Ka2V5TWFwWyJkZWZhdWx0Il0gPSBtYWMgPyBrZXlNYXAubWFjRGVmYXVsdCA6IGtleU1hcC5wY0RlZmF1bHQKCi8vIEtFWU1BUCBESVNQQVRDSAoKZnVuY3Rpb24gbm9ybWFsaXplS2V5TmFtZShuYW1lKSB7CiAgdmFyIHBhcnRzID0gbmFtZS5zcGxpdCgvLSg/ISQpLykKICBuYW1lID0gcGFydHNbcGFydHMubGVuZ3RoIC0gMV0KICB2YXIgYWx0LCBjdHJsLCBzaGlmdCwgY21kCiAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGggLSAxOyBpKyspIHsKICAgIHZhciBtb2QgPSBwYXJ0c1tpXQogICAgaWYgKC9eKGNtZHxtZXRhfG0pJC9pLnRlc3QobW9kKSkgeyBjbWQgPSB0cnVlIH0KICAgIGVsc2UgaWYgKC9eYShsdCk/JC9pLnRlc3QobW9kKSkgeyBhbHQgPSB0cnVlIH0KICAgIGVsc2UgaWYgKC9eKGN8Y3RybHxjb250cm9sKSQvaS50ZXN0KG1vZCkpIHsgY3RybCA9IHRydWUgfQogICAgZWxzZSBpZiAoL15zKGhpZnQpPyQvaS50ZXN0KG1vZCkpIHsgc2hpZnQgPSB0cnVlIH0KICAgIGVsc2UgeyB0aHJvdyBuZXcgRXJyb3IoIlVucmVjb2duaXplZCBtb2RpZmllciBuYW1lOiAiICsgbW9kKSB9CiAgfQogIGlmIChhbHQpIHsgbmFtZSA9ICJBbHQtIiArIG5hbWUgfQogIGlmIChjdHJsKSB7IG5hbWUgPSAiQ3RybC0iICsgbmFtZSB9CiAgaWYgKGNtZCkgeyBuYW1lID0gIkNtZC0iICsgbmFtZSB9CiAgaWYgKHNoaWZ0KSB7IG5hbWUgPSAiU2hpZnQtIiArIG5hbWUgfQogIHJldHVybiBuYW1lCn0KCi8vIFRoaXMgaXMgYSBrbHVkZ2UgdG8ga2VlcCBrZXltYXBzIG1vc3RseSB3b3JraW5nIGFzIHJhdyBvYmplY3RzCi8vIChiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSkgd2hpbGUgYXQgdGhlIHNhbWUgdGltZSBzdXBwb3J0IGZlYXR1cmVzCi8vIGxpa2Ugbm9ybWFsaXphdGlvbiBhbmQgbXVsdGktc3Ryb2tlIGtleSBiaW5kaW5ncy4gSXQgY29tcGlsZXMgYQovLyBuZXcgbm9ybWFsaXplZCBrZXltYXAsIGFuZCB0aGVuIHVwZGF0ZXMgdGhlIG9sZCBvYmplY3QgdG8gcmVmbGVjdAovLyB0aGlzLgpmdW5jdGlvbiBub3JtYWxpemVLZXlNYXAoa2V5bWFwKSB7CiAgdmFyIGNvcHkgPSB7fQogIGZvciAodmFyIGtleW5hbWUgaW4ga2V5bWFwKSB7IGlmIChrZXltYXAuaGFzT3duUHJvcGVydHkoa2V5bmFtZSkpIHsKICAgIHZhciB2YWx1ZSA9IGtleW1hcFtrZXluYW1lXQogICAgaWYgKC9eKG5hbWV8ZmFsbHRocm91Z2h8KGRlfGF0KXRhY2gpJC8udGVzdChrZXluYW1lKSkgeyBjb250aW51ZSB9CiAgICBpZiAodmFsdWUgPT0gIi4uLiIpIHsgZGVsZXRlIGtleW1hcFtrZXluYW1lXTsgY29udGludWUgfQoKICAgIHZhciBrZXlzID0gbWFwKGtleW5hbWUuc3BsaXQoIiAiKSwgbm9ybWFsaXplS2V5TmFtZSkKICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgdmFsID0gdm9pZCAwLCBuYW1lID0gdm9pZCAwCiAgICAgIGlmIChpID09IGtleXMubGVuZ3RoIC0gMSkgewogICAgICAgIG5hbWUgPSBrZXlzLmpvaW4oIiAiKQogICAgICAgIHZhbCA9IHZhbHVlCiAgICAgIH0gZWxzZSB7CiAgICAgICAgbmFtZSA9IGtleXMuc2xpY2UoMCwgaSArIDEpLmpvaW4oIiAiKQogICAgICAgIHZhbCA9ICIuLi4iCiAgICAgIH0KICAgICAgdmFyIHByZXYgPSBjb3B5W25hbWVdCiAgICAgIGlmICghcHJldikgeyBjb3B5W25hbWVdID0gdmFsIH0KICAgICAgZWxzZSBpZiAocHJldiAhPSB2YWwpIHsgdGhyb3cgbmV3IEVycm9yKCJJbmNvbnNpc3RlbnQgYmluZGluZ3MgZm9yICIgKyBuYW1lKSB9CiAgICB9CiAgICBkZWxldGUga2V5bWFwW2tleW5hbWVdCiAgfSB9CiAgZm9yICh2YXIgcHJvcCBpbiBjb3B5KSB7IGtleW1hcFtwcm9wXSA9IGNvcHlbcHJvcF0gfQogIHJldHVybiBrZXltYXAKfQoKZnVuY3Rpb24gbG9va3VwS2V5KGtleSwgbWFwJCQxLCBoYW5kbGUsIGNvbnRleHQpIHsKICBtYXAkJDEgPSBnZXRLZXlNYXAobWFwJCQxKQogIHZhciBmb3VuZCA9IG1hcCQkMS5jYWxsID8gbWFwJCQxLmNhbGwoa2V5LCBjb250ZXh0KSA6IG1hcCQkMVtrZXldCiAgaWYgKGZvdW5kID09PSBmYWxzZSkgeyByZXR1cm4gIm5vdGhpbmciIH0KICBpZiAoZm91bmQgPT09ICIuLi4iKSB7IHJldHVybiAibXVsdGkiIH0KICBpZiAoZm91bmQgIT0gbnVsbCAmJiBoYW5kbGUoZm91bmQpKSB7IHJldHVybiAiaGFuZGxlZCIgfQoKICBpZiAobWFwJCQxLmZhbGx0aHJvdWdoKSB7CiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG1hcCQkMS5mYWxsdGhyb3VnaCkgIT0gIltvYmplY3QgQXJyYXldIikKICAgICAgeyByZXR1cm4gbG9va3VwS2V5KGtleSwgbWFwJCQxLmZhbGx0aHJvdWdoLCBoYW5kbGUsIGNvbnRleHQpIH0KICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWFwJCQxLmZhbGx0aHJvdWdoLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciByZXN1bHQgPSBsb29rdXBLZXkoa2V5LCBtYXAkJDEuZmFsbHRocm91Z2hbaV0sIGhhbmRsZSwgY29udGV4dCkKICAgICAgaWYgKHJlc3VsdCkgeyByZXR1cm4gcmVzdWx0IH0KICAgIH0KICB9Cn0KCi8vIE1vZGlmaWVyIGtleSBwcmVzc2VzIGRvbid0IGNvdW50IGFzICdyZWFsJyBrZXkgcHJlc3NlcyBmb3IgdGhlCi8vIHB1cnBvc2Ugb2Yga2V5bWFwIGZhbGx0aHJvdWdoLgpmdW5jdGlvbiBpc01vZGlmaWVyS2V5KHZhbHVlKSB7CiAgdmFyIG5hbWUgPSB0eXBlb2YgdmFsdWUgPT0gInN0cmluZyIgPyB2YWx1ZSA6IGtleU5hbWVzW3ZhbHVlLmtleUNvZGVdCiAgcmV0dXJuIG5hbWUgPT0gIkN0cmwiIHx8IG5hbWUgPT0gIkFsdCIgfHwgbmFtZSA9PSAiU2hpZnQiIHx8IG5hbWUgPT0gIk1vZCIKfQoKLy8gTG9vayB1cCB0aGUgbmFtZSBvZiBhIGtleSBhcyBpbmRpY2F0ZWQgYnkgYW4gZXZlbnQgb2JqZWN0LgpmdW5jdGlvbiBrZXlOYW1lKGV2ZW50LCBub1NoaWZ0KSB7CiAgaWYgKHByZXN0byAmJiBldmVudC5rZXlDb2RlID09IDM0ICYmIGV2ZW50WyJjaGFyIl0pIHsgcmV0dXJuIGZhbHNlIH0KICB2YXIgYmFzZSA9IGtleU5hbWVzW2V2ZW50LmtleUNvZGVdLCBuYW1lID0gYmFzZQogIGlmIChuYW1lID09IG51bGwgfHwgZXZlbnQuYWx0R3JhcGhLZXkpIHsgcmV0dXJuIGZhbHNlIH0KICBpZiAoZXZlbnQuYWx0S2V5ICYmIGJhc2UgIT0gIkFsdCIpIHsgbmFtZSA9ICJBbHQtIiArIG5hbWUgfQogIGlmICgoZmxpcEN0cmxDbWQgPyBldmVudC5tZXRhS2V5IDogZXZlbnQuY3RybEtleSkgJiYgYmFzZSAhPSAiQ3RybCIpIHsgbmFtZSA9ICJDdHJsLSIgKyBuYW1lIH0KICBpZiAoKGZsaXBDdHJsQ21kID8gZXZlbnQuY3RybEtleSA6IGV2ZW50Lm1ldGFLZXkpICYmIGJhc2UgIT0gIkNtZCIpIHsgbmFtZSA9ICJDbWQtIiArIG5hbWUgfQogIGlmICghbm9TaGlmdCAmJiBldmVudC5zaGlmdEtleSAmJiBiYXNlICE9ICJTaGlmdCIpIHsgbmFtZSA9ICJTaGlmdC0iICsgbmFtZSB9CiAgcmV0dXJuIG5hbWUKfQoKZnVuY3Rpb24gZ2V0S2V5TWFwKHZhbCkgewogIHJldHVybiB0eXBlb2YgdmFsID09ICJzdHJpbmciID8ga2V5TWFwW3ZhbF0gOiB2YWwKfQoKLy8gSGVscGVyIGZvciBkZWxldGluZyB0ZXh0IG5lYXIgdGhlIHNlbGVjdGlvbihzKSwgdXNlZCB0byBpbXBsZW1lbnQKLy8gYmFja3NwYWNlLCBkZWxldGUsIGFuZCBzaW1pbGFyIGZ1bmN0aW9uYWxpdHkuCmZ1bmN0aW9uIGRlbGV0ZU5lYXJTZWxlY3Rpb24oY20sIGNvbXB1dGUpIHsKICB2YXIgcmFuZ2VzID0gY20uZG9jLnNlbC5yYW5nZXMsIGtpbGwgPSBbXQogIC8vIEJ1aWxkIHVwIGEgc2V0IG9mIHJhbmdlcyB0byBraWxsIGZpcnN0LCBtZXJnaW5nIG92ZXJsYXBwaW5nCiAgLy8gcmFuZ2VzLgogIGZvciAodmFyIGkgPSAwOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSsrKSB7CiAgICB2YXIgdG9LaWxsID0gY29tcHV0ZShyYW5nZXNbaV0pCiAgICB3aGlsZSAoa2lsbC5sZW5ndGggJiYgY21wKHRvS2lsbC5mcm9tLCBsc3Qoa2lsbCkudG8pIDw9IDApIHsKICAgICAgdmFyIHJlcGxhY2VkID0ga2lsbC5wb3AoKQogICAgICBpZiAoY21wKHJlcGxhY2VkLmZyb20sIHRvS2lsbC5mcm9tKSA8IDApIHsKICAgICAgICB0b0tpbGwuZnJvbSA9IHJlcGxhY2VkLmZyb20KICAgICAgICBicmVhawogICAgICB9CiAgICB9CiAgICBraWxsLnB1c2godG9LaWxsKQogIH0KICAvLyBOZXh0LCByZW1vdmUgdGhvc2UgYWN0dWFsIHJhbmdlcy4KICBydW5Jbk9wKGNtLCBmdW5jdGlvbiAoKSB7CiAgICBmb3IgKHZhciBpID0ga2lsbC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkKICAgICAgeyByZXBsYWNlUmFuZ2UoY20uZG9jLCAiIiwga2lsbFtpXS5mcm9tLCBraWxsW2ldLnRvLCAiK2RlbGV0ZSIpIH0KICAgIGVuc3VyZUN1cnNvclZpc2libGUoY20pCiAgfSkKfQoKLy8gQ29tbWFuZHMgYXJlIHBhcmFtZXRlci1sZXNzIGFjdGlvbnMgdGhhdCBjYW4gYmUgcGVyZm9ybWVkIG9uIGFuCi8vIGVkaXRvciwgbW9zdGx5IHVzZWQgZm9yIGtleWJpbmRpbmdzLgp2YXIgY29tbWFuZHMgPSB7CiAgc2VsZWN0QWxsOiBzZWxlY3RBbGwsCiAgc2luZ2xlU2VsZWN0aW9uOiBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIGNtLnNldFNlbGVjdGlvbihjbS5nZXRDdXJzb3IoImFuY2hvciIpLCBjbS5nZXRDdXJzb3IoImhlYWQiKSwgc2VsX2RvbnRTY3JvbGwpOyB9LAogIGtpbGxMaW5lOiBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIGRlbGV0ZU5lYXJTZWxlY3Rpb24oY20sIGZ1bmN0aW9uIChyYW5nZSkgewogICAgaWYgKHJhbmdlLmVtcHR5KCkpIHsKICAgICAgdmFyIGxlbiA9IGdldExpbmUoY20uZG9jLCByYW5nZS5oZWFkLmxpbmUpLnRleHQubGVuZ3RoCiAgICAgIGlmIChyYW5nZS5oZWFkLmNoID09IGxlbiAmJiByYW5nZS5oZWFkLmxpbmUgPCBjbS5sYXN0TGluZSgpKQogICAgICAgIHsgcmV0dXJuIHtmcm9tOiByYW5nZS5oZWFkLCB0bzogUG9zKHJhbmdlLmhlYWQubGluZSArIDEsIDApfSB9CiAgICAgIGVsc2UKICAgICAgICB7IHJldHVybiB7ZnJvbTogcmFuZ2UuaGVhZCwgdG86IFBvcyhyYW5nZS5oZWFkLmxpbmUsIGxlbil9IH0KICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB7ZnJvbTogcmFuZ2UuZnJvbSgpLCB0bzogcmFuZ2UudG8oKX0KICAgIH0KICB9KTsgfSwKICBkZWxldGVMaW5lOiBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIGRlbGV0ZU5lYXJTZWxlY3Rpb24oY20sIGZ1bmN0aW9uIChyYW5nZSkgeyByZXR1cm4gKHsKICAgIGZyb206IFBvcyhyYW5nZS5mcm9tKCkubGluZSwgMCksCiAgICB0bzogY2xpcFBvcyhjbS5kb2MsIFBvcyhyYW5nZS50bygpLmxpbmUgKyAxLCAwKSkKICB9KTsgfSk7IH0sCiAgZGVsTGluZUxlZnQ6IGZ1bmN0aW9uIChjbSkgeyByZXR1cm4gZGVsZXRlTmVhclNlbGVjdGlvbihjbSwgZnVuY3Rpb24gKHJhbmdlKSB7IHJldHVybiAoewogICAgZnJvbTogUG9zKHJhbmdlLmZyb20oKS5saW5lLCAwKSwgdG86IHJhbmdlLmZyb20oKQogIH0pOyB9KTsgfSwKICBkZWxXcmFwcGVkTGluZUxlZnQ6IGZ1bmN0aW9uIChjbSkgeyByZXR1cm4gZGVsZXRlTmVhclNlbGVjdGlvbihjbSwgZnVuY3Rpb24gKHJhbmdlKSB7CiAgICB2YXIgdG9wID0gY20uY2hhckNvb3JkcyhyYW5nZS5oZWFkLCAiZGl2IikudG9wICsgNQogICAgdmFyIGxlZnRQb3MgPSBjbS5jb29yZHNDaGFyKHtsZWZ0OiAwLCB0b3A6IHRvcH0sICJkaXYiKQogICAgcmV0dXJuIHtmcm9tOiBsZWZ0UG9zLCB0bzogcmFuZ2UuZnJvbSgpfQogIH0pOyB9LAogIGRlbFdyYXBwZWRMaW5lUmlnaHQ6IGZ1bmN0aW9uIChjbSkgeyByZXR1cm4gZGVsZXRlTmVhclNlbGVjdGlvbihjbSwgZnVuY3Rpb24gKHJhbmdlKSB7CiAgICB2YXIgdG9wID0gY20uY2hhckNvb3JkcyhyYW5nZS5oZWFkLCAiZGl2IikudG9wICsgNQogICAgdmFyIHJpZ2h0UG9zID0gY20uY29vcmRzQ2hhcih7bGVmdDogY20uZGlzcGxheS5saW5lRGl2Lm9mZnNldFdpZHRoICsgMTAwLCB0b3A6IHRvcH0sICJkaXYiKQogICAgcmV0dXJuIHtmcm9tOiByYW5nZS5mcm9tKCksIHRvOiByaWdodFBvcyB9CiAgfSk7IH0sCiAgdW5kbzogZnVuY3Rpb24gKGNtKSB7IHJldHVybiBjbS51bmRvKCk7IH0sCiAgcmVkbzogZnVuY3Rpb24gKGNtKSB7IHJldHVybiBjbS5yZWRvKCk7IH0sCiAgdW5kb1NlbGVjdGlvbjogZnVuY3Rpb24gKGNtKSB7IHJldHVybiBjbS51bmRvU2VsZWN0aW9uKCk7IH0sCiAgcmVkb1NlbGVjdGlvbjogZnVuY3Rpb24gKGNtKSB7IHJldHVybiBjbS5yZWRvU2VsZWN0aW9uKCk7IH0sCiAgZ29Eb2NTdGFydDogZnVuY3Rpb24gKGNtKSB7IHJldHVybiBjbS5leHRlbmRTZWxlY3Rpb24oUG9zKGNtLmZpcnN0TGluZSgpLCAwKSk7IH0sCiAgZ29Eb2NFbmQ6IGZ1bmN0aW9uIChjbSkgeyByZXR1cm4gY20uZXh0ZW5kU2VsZWN0aW9uKFBvcyhjbS5sYXN0TGluZSgpKSk7IH0sCiAgZ29MaW5lU3RhcnQ6IGZ1bmN0aW9uIChjbSkgeyByZXR1cm4gY20uZXh0ZW5kU2VsZWN0aW9uc0J5KGZ1bmN0aW9uIChyYW5nZSkgeyByZXR1cm4gbGluZVN0YXJ0KGNtLCByYW5nZS5oZWFkLmxpbmUpOyB9LAogICAge29yaWdpbjogIittb3ZlIiwgYmlhczogMX0KICApOyB9LAogIGdvTGluZVN0YXJ0U21hcnQ6IGZ1bmN0aW9uIChjbSkgeyByZXR1cm4gY20uZXh0ZW5kU2VsZWN0aW9uc0J5KGZ1bmN0aW9uIChyYW5nZSkgeyByZXR1cm4gbGluZVN0YXJ0U21hcnQoY20sIHJhbmdlLmhlYWQpOyB9LAogICAge29yaWdpbjogIittb3ZlIiwgYmlhczogMX0KICApOyB9LAogIGdvTGluZUVuZDogZnVuY3Rpb24gKGNtKSB7IHJldHVybiBjbS5leHRlbmRTZWxlY3Rpb25zQnkoZnVuY3Rpb24gKHJhbmdlKSB7IHJldHVybiBsaW5lRW5kKGNtLCByYW5nZS5oZWFkLmxpbmUpOyB9LAogICAge29yaWdpbjogIittb3ZlIiwgYmlhczogLTF9CiAgKTsgfSwKICBnb0xpbmVSaWdodDogZnVuY3Rpb24gKGNtKSB7IHJldHVybiBjbS5leHRlbmRTZWxlY3Rpb25zQnkoZnVuY3Rpb24gKHJhbmdlKSB7CiAgICB2YXIgdG9wID0gY20uY2hhckNvb3JkcyhyYW5nZS5oZWFkLCAiZGl2IikudG9wICsgNQogICAgcmV0dXJuIGNtLmNvb3Jkc0NoYXIoe2xlZnQ6IGNtLmRpc3BsYXkubGluZURpdi5vZmZzZXRXaWR0aCArIDEwMCwgdG9wOiB0b3B9LCAiZGl2IikKICB9LCBzZWxfbW92ZSk7IH0sCiAgZ29MaW5lTGVmdDogZnVuY3Rpb24gKGNtKSB7IHJldHVybiBjbS5leHRlbmRTZWxlY3Rpb25zQnkoZnVuY3Rpb24gKHJhbmdlKSB7CiAgICB2YXIgdG9wID0gY20uY2hhckNvb3JkcyhyYW5nZS5oZWFkLCAiZGl2IikudG9wICsgNQogICAgcmV0dXJuIGNtLmNvb3Jkc0NoYXIoe2xlZnQ6IDAsIHRvcDogdG9wfSwgImRpdiIpCiAgfSwgc2VsX21vdmUpOyB9LAogIGdvTGluZUxlZnRTbWFydDogZnVuY3Rpb24gKGNtKSB7IHJldHVybiBjbS5leHRlbmRTZWxlY3Rpb25zQnkoZnVuY3Rpb24gKHJhbmdlKSB7CiAgICB2YXIgdG9wID0gY20uY2hhckNvb3JkcyhyYW5nZS5oZWFkLCAiZGl2IikudG9wICsgNQogICAgdmFyIHBvcyA9IGNtLmNvb3Jkc0NoYXIoe2xlZnQ6IDAsIHRvcDogdG9wfSwgImRpdiIpCiAgICBpZiAocG9zLmNoIDwgY20uZ2V0TGluZShwb3MubGluZSkuc2VhcmNoKC9cUy8pKSB7IHJldHVybiBsaW5lU3RhcnRTbWFydChjbSwgcmFuZ2UuaGVhZCkgfQogICAgcmV0dXJuIHBvcwogIH0sIHNlbF9tb3ZlKTsgfSwKICBnb0xpbmVVcDogZnVuY3Rpb24gKGNtKSB7IHJldHVybiBjbS5tb3ZlVigtMSwgImxpbmUiKTsgfSwKICBnb0xpbmVEb3duOiBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIGNtLm1vdmVWKDEsICJsaW5lIik7IH0sCiAgZ29QYWdlVXA6IGZ1bmN0aW9uIChjbSkgeyByZXR1cm4gY20ubW92ZVYoLTEsICJwYWdlIik7IH0sCiAgZ29QYWdlRG93bjogZnVuY3Rpb24gKGNtKSB7IHJldHVybiBjbS5tb3ZlVigxLCAicGFnZSIpOyB9LAogIGdvQ2hhckxlZnQ6IGZ1bmN0aW9uIChjbSkgeyByZXR1cm4gY20ubW92ZUgoLTEsICJjaGFyIik7IH0sCiAgZ29DaGFyUmlnaHQ6IGZ1bmN0aW9uIChjbSkgeyByZXR1cm4gY20ubW92ZUgoMSwgImNoYXIiKTsgfSwKICBnb0NvbHVtbkxlZnQ6IGZ1bmN0aW9uIChjbSkgeyByZXR1cm4gY20ubW92ZUgoLTEsICJjb2x1bW4iKTsgfSwKICBnb0NvbHVtblJpZ2h0OiBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIGNtLm1vdmVIKDEsICJjb2x1bW4iKTsgfSwKICBnb1dvcmRMZWZ0OiBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIGNtLm1vdmVIKC0xLCAid29yZCIpOyB9LAogIGdvR3JvdXBSaWdodDogZnVuY3Rpb24gKGNtKSB7IHJldHVybiBjbS5tb3ZlSCgxLCAiZ3JvdXAiKTsgfSwKICBnb0dyb3VwTGVmdDogZnVuY3Rpb24gKGNtKSB7IHJldHVybiBjbS5tb3ZlSCgtMSwgImdyb3VwIik7IH0sCiAgZ29Xb3JkUmlnaHQ6IGZ1bmN0aW9uIChjbSkgeyByZXR1cm4gY20ubW92ZUgoMSwgIndvcmQiKTsgfSwKICBkZWxDaGFyQmVmb3JlOiBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIGNtLmRlbGV0ZUgoLTEsICJjaGFyIik7IH0sCiAgZGVsQ2hhckFmdGVyOiBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIGNtLmRlbGV0ZUgoMSwgImNoYXIiKTsgfSwKICBkZWxXb3JkQmVmb3JlOiBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIGNtLmRlbGV0ZUgoLTEsICJ3b3JkIik7IH0sCiAgZGVsV29yZEFmdGVyOiBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIGNtLmRlbGV0ZUgoMSwgIndvcmQiKTsgfSwKICBkZWxHcm91cEJlZm9yZTogZnVuY3Rpb24gKGNtKSB7IHJldHVybiBjbS5kZWxldGVIKC0xLCAiZ3JvdXAiKTsgfSwKICBkZWxHcm91cEFmdGVyOiBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIGNtLmRlbGV0ZUgoMSwgImdyb3VwIik7IH0sCiAgaW5kZW50QXV0bzogZnVuY3Rpb24gKGNtKSB7IHJldHVybiBjbS5pbmRlbnRTZWxlY3Rpb24oInNtYXJ0Iik7IH0sCiAgaW5kZW50TW9yZTogZnVuY3Rpb24gKGNtKSB7IHJldHVybiBjbS5pbmRlbnRTZWxlY3Rpb24oImFkZCIpOyB9LAogIGluZGVudExlc3M6IGZ1bmN0aW9uIChjbSkgeyByZXR1cm4gY20uaW5kZW50U2VsZWN0aW9uKCJzdWJ0cmFjdCIpOyB9LAogIGluc2VydFRhYjogZnVuY3Rpb24gKGNtKSB7IHJldHVybiBjbS5yZXBsYWNlU2VsZWN0aW9uKCJcdCIpOyB9LAogIGluc2VydFNvZnRUYWI6IGZ1bmN0aW9uIChjbSkgewogICAgdmFyIHNwYWNlcyA9IFtdLCByYW5nZXMgPSBjbS5saXN0U2VsZWN0aW9ucygpLCB0YWJTaXplID0gY20ub3B0aW9ucy50YWJTaXplCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJhbmdlcy5sZW5ndGg7IGkrKykgewogICAgICB2YXIgcG9zID0gcmFuZ2VzW2ldLmZyb20oKQogICAgICB2YXIgY29sID0gY291bnRDb2x1bW4oY20uZ2V0TGluZShwb3MubGluZSksIHBvcy5jaCwgdGFiU2l6ZSkKICAgICAgc3BhY2VzLnB1c2goc3BhY2VTdHIodGFiU2l6ZSAtIGNvbCAlIHRhYlNpemUpKQogICAgfQogICAgY20ucmVwbGFjZVNlbGVjdGlvbnMoc3BhY2VzKQogIH0sCiAgZGVmYXVsdFRhYjogZnVuY3Rpb24gKGNtKSB7CiAgICBpZiAoY20uc29tZXRoaW5nU2VsZWN0ZWQoKSkgeyBjbS5pbmRlbnRTZWxlY3Rpb24oImFkZCIpIH0KICAgIGVsc2UgeyBjbS5leGVjQ29tbWFuZCgiaW5zZXJ0VGFiIikgfQogIH0sCiAgLy8gU3dhcCB0aGUgdHdvIGNoYXJzIGxlZnQgYW5kIHJpZ2h0IG9mIGVhY2ggc2VsZWN0aW9uJ3MgaGVhZC4KICAvLyBNb3ZlIGN1cnNvciBiZWhpbmQgdGhlIHR3byBzd2FwcGVkIGNoYXJhY3RlcnMgYWZ0ZXJ3YXJkcy4KICAvLwogIC8vIERvZXNuJ3QgY29uc2lkZXIgbGluZSBmZWVkcyBhIGNoYXJhY3Rlci4KICAvLyBEb2Vzbid0IHNjYW4gbW9yZSB0aGFuIG9uZSBsaW5lIGFib3ZlIHRvIGZpbmQgYSBjaGFyYWN0ZXIuCiAgLy8gRG9lc24ndCBkbyBhbnl0aGluZyBvbiBhbiBlbXB0eSBsaW5lLgogIC8vIERvZXNuJ3QgZG8gYW55dGhpbmcgd2l0aCBub24tZW1wdHkgc2VsZWN0aW9ucy4KICB0cmFuc3Bvc2VDaGFyczogZnVuY3Rpb24gKGNtKSB7IHJldHVybiBydW5Jbk9wKGNtLCBmdW5jdGlvbiAoKSB7CiAgICB2YXIgcmFuZ2VzID0gY20ubGlzdFNlbGVjdGlvbnMoKSwgbmV3U2VsID0gW10KICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmICghcmFuZ2VzW2ldLmVtcHR5KCkpIHsgY29udGludWUgfQogICAgICB2YXIgY3VyID0gcmFuZ2VzW2ldLmhlYWQsIGxpbmUgPSBnZXRMaW5lKGNtLmRvYywgY3VyLmxpbmUpLnRleHQKICAgICAgaWYgKGxpbmUpIHsKICAgICAgICBpZiAoY3VyLmNoID09IGxpbmUubGVuZ3RoKSB7IGN1ciA9IG5ldyBQb3MoY3VyLmxpbmUsIGN1ci5jaCAtIDEpIH0KICAgICAgICBpZiAoY3VyLmNoID4gMCkgewogICAgICAgICAgY3VyID0gbmV3IFBvcyhjdXIubGluZSwgY3VyLmNoICsgMSkKICAgICAgICAgIGNtLnJlcGxhY2VSYW5nZShsaW5lLmNoYXJBdChjdXIuY2ggLSAxKSArIGxpbmUuY2hhckF0KGN1ci5jaCAtIDIpLAogICAgICAgICAgICAgICAgICAgICAgICAgIFBvcyhjdXIubGluZSwgY3VyLmNoIC0gMiksIGN1ciwgIit0cmFuc3Bvc2UiKQogICAgICAgIH0gZWxzZSBpZiAoY3VyLmxpbmUgPiBjbS5kb2MuZmlyc3QpIHsKICAgICAgICAgIHZhciBwcmV2ID0gZ2V0TGluZShjbS5kb2MsIGN1ci5saW5lIC0gMSkudGV4dAogICAgICAgICAgaWYgKHByZXYpIHsKICAgICAgICAgICAgY3VyID0gbmV3IFBvcyhjdXIubGluZSwgMSkKICAgICAgICAgICAgY20ucmVwbGFjZVJhbmdlKGxpbmUuY2hhckF0KDApICsgY20uZG9jLmxpbmVTZXBhcmF0b3IoKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2LmNoYXJBdChwcmV2Lmxlbmd0aCAtIDEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zKGN1ci5saW5lIC0gMSwgcHJldi5sZW5ndGggLSAxKSwgY3VyLCAiK3RyYW5zcG9zZSIpCiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIG5ld1NlbC5wdXNoKG5ldyBSYW5nZShjdXIsIGN1cikpCiAgICB9CiAgICBjbS5zZXRTZWxlY3Rpb25zKG5ld1NlbCkKICB9KTsgfSwKICBuZXdsaW5lQW5kSW5kZW50OiBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIHJ1bkluT3AoY20sIGZ1bmN0aW9uICgpIHsKICAgIHZhciBzZWxzID0gY20ubGlzdFNlbGVjdGlvbnMoKQogICAgZm9yICh2YXIgaSA9IHNlbHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pCiAgICAgIHsgY20ucmVwbGFjZVJhbmdlKGNtLmRvYy5saW5lU2VwYXJhdG9yKCksIHNlbHNbaV0uYW5jaG9yLCBzZWxzW2ldLmhlYWQsICIraW5wdXQiKSB9CiAgICBzZWxzID0gY20ubGlzdFNlbGVjdGlvbnMoKQogICAgZm9yICh2YXIgaSQxID0gMDsgaSQxIDwgc2Vscy5sZW5ndGg7IGkkMSsrKQogICAgICB7IGNtLmluZGVudExpbmUoc2Vsc1tpJDFdLmZyb20oKS5saW5lLCBudWxsLCB0cnVlKSB9CiAgICBlbnN1cmVDdXJzb3JWaXNpYmxlKGNtKQogIH0pOyB9LAogIG9wZW5MaW5lOiBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIGNtLnJlcGxhY2VTZWxlY3Rpb24oIlxuIiwgInN0YXJ0Iik7IH0sCiAgdG9nZ2xlT3ZlcndyaXRlOiBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIGNtLnRvZ2dsZU92ZXJ3cml0ZSgpOyB9Cn0KCgpmdW5jdGlvbiBsaW5lU3RhcnQoY20sIGxpbmVOKSB7CiAgdmFyIGxpbmUgPSBnZXRMaW5lKGNtLmRvYywgbGluZU4pCiAgdmFyIHZpc3VhbCA9IHZpc3VhbExpbmUobGluZSkKICBpZiAodmlzdWFsICE9IGxpbmUpIHsgbGluZU4gPSBsaW5lTm8odmlzdWFsKSB9CiAgdmFyIG9yZGVyID0gZ2V0T3JkZXIodmlzdWFsKQogIHZhciBjaCA9ICFvcmRlciA/IDAgOiBvcmRlclswXS5sZXZlbCAlIDIgPyBsaW5lUmlnaHQodmlzdWFsKSA6IGxpbmVMZWZ0KHZpc3VhbCkKICByZXR1cm4gUG9zKGxpbmVOLCBjaCkKfQpmdW5jdGlvbiBsaW5lRW5kKGNtLCBsaW5lTikgewogIHZhciBtZXJnZWQsIGxpbmUgPSBnZXRMaW5lKGNtLmRvYywgbGluZU4pCiAgd2hpbGUgKG1lcmdlZCA9IGNvbGxhcHNlZFNwYW5BdEVuZChsaW5lKSkgewogICAgbGluZSA9IG1lcmdlZC5maW5kKDEsIHRydWUpLmxpbmUKICAgIGxpbmVOID0gbnVsbAogIH0KICB2YXIgb3JkZXIgPSBnZXRPcmRlcihsaW5lKQogIHZhciBjaCA9ICFvcmRlciA/IGxpbmUudGV4dC5sZW5ndGggOiBvcmRlclswXS5sZXZlbCAlIDIgPyBsaW5lTGVmdChsaW5lKSA6IGxpbmVSaWdodChsaW5lKQogIHJldHVybiBQb3MobGluZU4gPT0gbnVsbCA/IGxpbmVObyhsaW5lKSA6IGxpbmVOLCBjaCkKfQpmdW5jdGlvbiBsaW5lU3RhcnRTbWFydChjbSwgcG9zKSB7CiAgdmFyIHN0YXJ0ID0gbGluZVN0YXJ0KGNtLCBwb3MubGluZSkKICB2YXIgbGluZSA9IGdldExpbmUoY20uZG9jLCBzdGFydC5saW5lKQogIHZhciBvcmRlciA9IGdldE9yZGVyKGxpbmUpCiAgaWYgKCFvcmRlciB8fCBvcmRlclswXS5sZXZlbCA9PSAwKSB7CiAgICB2YXIgZmlyc3ROb25XUyA9IE1hdGgubWF4KDAsIGxpbmUudGV4dC5zZWFyY2goL1xTLykpCiAgICB2YXIgaW5XUyA9IHBvcy5saW5lID09IHN0YXJ0LmxpbmUgJiYgcG9zLmNoIDw9IGZpcnN0Tm9uV1MgJiYgcG9zLmNoCiAgICByZXR1cm4gUG9zKHN0YXJ0LmxpbmUsIGluV1MgPyAwIDogZmlyc3ROb25XUykKICB9CiAgcmV0dXJuIHN0YXJ0Cn0KCi8vIFJ1biBhIGhhbmRsZXIgdGhhdCB3YXMgYm91bmQgdG8gYSBrZXkuCmZ1bmN0aW9uIGRvSGFuZGxlQmluZGluZyhjbSwgYm91bmQsIGRyb3BTaGlmdCkgewogIGlmICh0eXBlb2YgYm91bmQgPT0gInN0cmluZyIpIHsKICAgIGJvdW5kID0gY29tbWFuZHNbYm91bmRdCiAgICBpZiAoIWJvdW5kKSB7IHJldHVybiBmYWxzZSB9CiAgfQogIC8vIEVuc3VyZSBwcmV2aW91cyBpbnB1dCBoYXMgYmVlbiByZWFkLCBzbyB0aGF0IHRoZSBoYW5kbGVyIHNlZXMgYQogIC8vIGNvbnNpc3RlbnQgdmlldyBvZiB0aGUgZG9jdW1lbnQKICBjbS5kaXNwbGF5LmlucHV0LmVuc3VyZVBvbGxlZCgpCiAgdmFyIHByZXZTaGlmdCA9IGNtLmRpc3BsYXkuc2hpZnQsIGRvbmUgPSBmYWxzZQogIHRyeSB7CiAgICBpZiAoY20uaXNSZWFkT25seSgpKSB7IGNtLnN0YXRlLnN1cHByZXNzRWRpdHMgPSB0cnVlIH0KICAgIGlmIChkcm9wU2hpZnQpIHsgY20uZGlzcGxheS5zaGlmdCA9IGZhbHNlIH0KICAgIGRvbmUgPSBib3VuZChjbSkgIT0gUGFzcwogIH0gZmluYWxseSB7CiAgICBjbS5kaXNwbGF5LnNoaWZ0ID0gcHJldlNoaWZ0CiAgICBjbS5zdGF0ZS5zdXBwcmVzc0VkaXRzID0gZmFsc2UKICB9CiAgcmV0dXJuIGRvbmUKfQoKZnVuY3Rpb24gbG9va3VwS2V5Rm9yRWRpdG9yKGNtLCBuYW1lLCBoYW5kbGUpIHsKICBmb3IgKHZhciBpID0gMDsgaSA8IGNtLnN0YXRlLmtleU1hcHMubGVuZ3RoOyBpKyspIHsKICAgIHZhciByZXN1bHQgPSBsb29rdXBLZXkobmFtZSwgY20uc3RhdGUua2V5TWFwc1tpXSwgaGFuZGxlLCBjbSkKICAgIGlmIChyZXN1bHQpIHsgcmV0dXJuIHJlc3VsdCB9CiAgfQogIHJldHVybiAoY20ub3B0aW9ucy5leHRyYUtleXMgJiYgbG9va3VwS2V5KG5hbWUsIGNtLm9wdGlvbnMuZXh0cmFLZXlzLCBoYW5kbGUsIGNtKSkKICAgIHx8IGxvb2t1cEtleShuYW1lLCBjbS5vcHRpb25zLmtleU1hcCwgaGFuZGxlLCBjbSkKfQoKdmFyIHN0b3BTZXEgPSBuZXcgRGVsYXllZApmdW5jdGlvbiBkaXNwYXRjaEtleShjbSwgbmFtZSwgZSwgaGFuZGxlKSB7CiAgdmFyIHNlcSA9IGNtLnN0YXRlLmtleVNlcQogIGlmIChzZXEpIHsKICAgIGlmIChpc01vZGlmaWVyS2V5KG5hbWUpKSB7IHJldHVybiAiaGFuZGxlZCIgfQogICAgc3RvcFNlcS5zZXQoNTAsIGZ1bmN0aW9uICgpIHsKICAgICAgaWYgKGNtLnN0YXRlLmtleVNlcSA9PSBzZXEpIHsKICAgICAgICBjbS5zdGF0ZS5rZXlTZXEgPSBudWxsCiAgICAgICAgY20uZGlzcGxheS5pbnB1dC5yZXNldCgpCiAgICAgIH0KICAgIH0pCiAgICBuYW1lID0gc2VxICsgIiAiICsgbmFtZQogIH0KICB2YXIgcmVzdWx0ID0gbG9va3VwS2V5Rm9yRWRpdG9yKGNtLCBuYW1lLCBoYW5kbGUpCgogIGlmIChyZXN1bHQgPT0gIm11bHRpIikKICAgIHsgY20uc3RhdGUua2V5U2VxID0gbmFtZSB9CiAgaWYgKHJlc3VsdCA9PSAiaGFuZGxlZCIpCiAgICB7IHNpZ25hbExhdGVyKGNtLCAia2V5SGFuZGxlZCIsIGNtLCBuYW1lLCBlKSB9CgogIGlmIChyZXN1bHQgPT0gImhhbmRsZWQiIHx8IHJlc3VsdCA9PSAibXVsdGkiKSB7CiAgICBlX3ByZXZlbnREZWZhdWx0KGUpCiAgICByZXN0YXJ0QmxpbmsoY20pCiAgfQoKICBpZiAoc2VxICYmICFyZXN1bHQgJiYgL1wnJC8udGVzdChuYW1lKSkgewogICAgZV9wcmV2ZW50RGVmYXVsdChlKQogICAgcmV0dXJuIHRydWUKICB9CiAgcmV0dXJuICEhcmVzdWx0Cn0KCi8vIEhhbmRsZSBhIGtleSBmcm9tIHRoZSBrZXlkb3duIGV2ZW50LgpmdW5jdGlvbiBoYW5kbGVLZXlCaW5kaW5nKGNtLCBlKSB7CiAgdmFyIG5hbWUgPSBrZXlOYW1lKGUsIHRydWUpCiAgaWYgKCFuYW1lKSB7IHJldHVybiBmYWxzZSB9CgogIGlmIChlLnNoaWZ0S2V5ICYmICFjbS5zdGF0ZS5rZXlTZXEpIHsKICAgIC8vIEZpcnN0IHRyeSB0byByZXNvbHZlIGZ1bGwgbmFtZSAoaW5jbHVkaW5nICdTaGlmdC0nKS4gRmFpbGluZwogICAgLy8gdGhhdCwgc2VlIGlmIHRoZXJlIGlzIGEgY3Vyc29yLW1vdGlvbiBjb21tYW5kIChzdGFydGluZyB3aXRoCiAgICAvLyAnZ28nKSBib3VuZCB0byB0aGUga2V5bmFtZSB3aXRob3V0ICdTaGlmdC0nLgogICAgcmV0dXJuIGRpc3BhdGNoS2V5KGNtLCAiU2hpZnQtIiArIG5hbWUsIGUsIGZ1bmN0aW9uIChiKSB7IHJldHVybiBkb0hhbmRsZUJpbmRpbmcoY20sIGIsIHRydWUpOyB9KQogICAgICAgIHx8IGRpc3BhdGNoS2V5KGNtLCBuYW1lLCBlLCBmdW5jdGlvbiAoYikgewogICAgICAgICAgICAgaWYgKHR5cGVvZiBiID09ICJzdHJpbmciID8gL15nb1tBLVpdLy50ZXN0KGIpIDogYi5tb3Rpb24pCiAgICAgICAgICAgICAgIHsgcmV0dXJuIGRvSGFuZGxlQmluZGluZyhjbSwgYikgfQogICAgICAgICAgIH0pCiAgfSBlbHNlIHsKICAgIHJldHVybiBkaXNwYXRjaEtleShjbSwgbmFtZSwgZSwgZnVuY3Rpb24gKGIpIHsgcmV0dXJuIGRvSGFuZGxlQmluZGluZyhjbSwgYik7IH0pCiAgfQp9CgovLyBIYW5kbGUgYSBrZXkgZnJvbSB0aGUga2V5cHJlc3MgZXZlbnQKZnVuY3Rpb24gaGFuZGxlQ2hhckJpbmRpbmcoY20sIGUsIGNoKSB7CiAgcmV0dXJuIGRpc3BhdGNoS2V5KGNtLCAiJyIgKyBjaCArICInIiwgZSwgZnVuY3Rpb24gKGIpIHsgcmV0dXJuIGRvSGFuZGxlQmluZGluZyhjbSwgYiwgdHJ1ZSk7IH0pCn0KCnZhciBsYXN0U3RvcHBlZEtleSA9IG51bGwKZnVuY3Rpb24gb25LZXlEb3duKGUpIHsKICB2YXIgY20gPSB0aGlzCiAgY20uY3VyT3AuZm9jdXMgPSBhY3RpdmVFbHQoKQogIGlmIChzaWduYWxET01FdmVudChjbSwgZSkpIHsgcmV0dXJuIH0KICAvLyBJRSBkb2VzIHN0cmFuZ2UgdGhpbmdzIHdpdGggZXNjYXBlLgogIGlmIChpZSAmJiBpZV92ZXJzaW9uIDwgMTEgJiYgZS5rZXlDb2RlID09IDI3KSB7IGUucmV0dXJuVmFsdWUgPSBmYWxzZSB9CiAgdmFyIGNvZGUgPSBlLmtleUNvZGUKICBjbS5kaXNwbGF5LnNoaWZ0ID0gY29kZSA9PSAxNiB8fCBlLnNoaWZ0S2V5CiAgdmFyIGhhbmRsZWQgPSBoYW5kbGVLZXlCaW5kaW5nKGNtLCBlKQogIGlmIChwcmVzdG8pIHsKICAgIGxhc3RTdG9wcGVkS2V5ID0gaGFuZGxlZCA/IGNvZGUgOiBudWxsCiAgICAvLyBPcGVyYSBoYXMgbm8gY3V0IGV2ZW50Li4uIHdlIHRyeSB0byBhdCBsZWFzdCBjYXRjaCB0aGUga2V5IGNvbWJvCiAgICBpZiAoIWhhbmRsZWQgJiYgY29kZSA9PSA4OCAmJiAhaGFzQ29weUV2ZW50ICYmIChtYWMgPyBlLm1ldGFLZXkgOiBlLmN0cmxLZXkpKQogICAgICB7IGNtLnJlcGxhY2VTZWxlY3Rpb24oIiIsIG51bGwsICJjdXQiKSB9CiAgfQoKICAvLyBUdXJuIG1vdXNlIGludG8gY3Jvc3NoYWlyIHdoZW4gQWx0IGlzIGhlbGQgb24gTWFjLgogIGlmIChjb2RlID09IDE4ICYmICEvXGJDb2RlTWlycm9yLWNyb3NzaGFpclxiLy50ZXN0KGNtLmRpc3BsYXkubGluZURpdi5jbGFzc05hbWUpKQogICAgeyBzaG93Q3Jvc3NIYWlyKGNtKSB9Cn0KCmZ1bmN0aW9uIHNob3dDcm9zc0hhaXIoY20pIHsKICB2YXIgbGluZURpdiA9IGNtLmRpc3BsYXkubGluZURpdgogIGFkZENsYXNzKGxpbmVEaXYsICJDb2RlTWlycm9yLWNyb3NzaGFpciIpCgogIGZ1bmN0aW9uIHVwKGUpIHsKICAgIGlmIChlLmtleUNvZGUgPT0gMTggfHwgIWUuYWx0S2V5KSB7CiAgICAgIHJtQ2xhc3MobGluZURpdiwgIkNvZGVNaXJyb3ItY3Jvc3NoYWlyIikKICAgICAgb2ZmKGRvY3VtZW50LCAia2V5dXAiLCB1cCkKICAgICAgb2ZmKGRvY3VtZW50LCAibW91c2VvdmVyIiwgdXApCiAgICB9CiAgfQogIG9uKGRvY3VtZW50LCAia2V5dXAiLCB1cCkKICBvbihkb2N1bWVudCwgIm1vdXNlb3ZlciIsIHVwKQp9CgpmdW5jdGlvbiBvbktleVVwKGUpIHsKICBpZiAoZS5rZXlDb2RlID09IDE2KSB7IHRoaXMuZG9jLnNlbC5zaGlmdCA9IGZhbHNlIH0KICBzaWduYWxET01FdmVudCh0aGlzLCBlKQp9CgpmdW5jdGlvbiBvbktleVByZXNzKGUpIHsKICB2YXIgY20gPSB0aGlzCiAgaWYgKGV2ZW50SW5XaWRnZXQoY20uZGlzcGxheSwgZSkgfHwgc2lnbmFsRE9NRXZlbnQoY20sIGUpIHx8IGUuY3RybEtleSAmJiAhZS5hbHRLZXkgfHwgbWFjICYmIGUubWV0YUtleSkgeyByZXR1cm4gfQogIHZhciBrZXlDb2RlID0gZS5rZXlDb2RlLCBjaGFyQ29kZSA9IGUuY2hhckNvZGUKICBpZiAocHJlc3RvICYmIGtleUNvZGUgPT0gbGFzdFN0b3BwZWRLZXkpIHtsYXN0U3RvcHBlZEtleSA9IG51bGw7IGVfcHJldmVudERlZmF1bHQoZSk7IHJldHVybn0KICBpZiAoKHByZXN0byAmJiAoIWUud2hpY2ggfHwgZS53aGljaCA8IDEwKSkgJiYgaGFuZGxlS2V5QmluZGluZyhjbSwgZSkpIHsgcmV0dXJuIH0KICB2YXIgY2ggPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoYXJDb2RlID09IG51bGwgPyBrZXlDb2RlIDogY2hhckNvZGUpCiAgLy8gU29tZSBicm93c2VycyBmaXJlIGtleXByZXNzIGV2ZW50cyBmb3IgYmFja3NwYWNlCiAgaWYgKGNoID09ICJceDA4IikgeyByZXR1cm4gfQogIGlmIChoYW5kbGVDaGFyQmluZGluZyhjbSwgZSwgY2gpKSB7IHJldHVybiB9CiAgY20uZGlzcGxheS5pbnB1dC5vbktleVByZXNzKGUpCn0KCi8vIEEgbW91c2UgZG93biBjYW4gYmUgYSBzaW5nbGUgY2xpY2ssIGRvdWJsZSBjbGljaywgdHJpcGxlIGNsaWNrLAovLyBzdGFydCBvZiBzZWxlY3Rpb24gZHJhZywgc3RhcnQgb2YgdGV4dCBkcmFnLCBuZXcgY3Vyc29yCi8vIChjdHJsLWNsaWNrKSwgcmVjdGFuZ2xlIGRyYWcgKGFsdC1kcmFnKSwgb3IgeHdpbgovLyBtaWRkbGUtY2xpY2stcGFzdGUuIE9yIGl0IG1pZ2h0IGJlIGEgY2xpY2sgb24gc29tZXRoaW5nIHdlIHNob3VsZAovLyBub3QgaW50ZXJmZXJlIHdpdGgsIHN1Y2ggYXMgYSBzY3JvbGxiYXIgb3Igd2lkZ2V0LgpmdW5jdGlvbiBvbk1vdXNlRG93bihlKSB7CiAgdmFyIGNtID0gdGhpcywgZGlzcGxheSA9IGNtLmRpc3BsYXkKICBpZiAoc2lnbmFsRE9NRXZlbnQoY20sIGUpIHx8IGRpc3BsYXkuYWN0aXZlVG91Y2ggJiYgZGlzcGxheS5pbnB1dC5zdXBwb3J0c1RvdWNoKCkpIHsgcmV0dXJuIH0KICBkaXNwbGF5LnNoaWZ0ID0gZS5zaGlmdEtleQoKICBpZiAoZXZlbnRJbldpZGdldChkaXNwbGF5LCBlKSkgewogICAgaWYgKCF3ZWJraXQpIHsKICAgICAgLy8gQnJpZWZseSB0dXJuIG9mZiBkcmFnZ2FiaWxpdHksIHRvIGFsbG93IHdpZGdldHMgdG8gZG8KICAgICAgLy8gbm9ybWFsIGRyYWdnaW5nIHRoaW5ncy4KICAgICAgZGlzcGxheS5zY3JvbGxlci5kcmFnZ2FibGUgPSBmYWxzZQogICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgcmV0dXJuIGRpc3BsYXkuc2Nyb2xsZXIuZHJhZ2dhYmxlID0gdHJ1ZTsgfSwgMTAwKQogICAgfQogICAgcmV0dXJuCiAgfQogIGlmIChjbGlja0luR3V0dGVyKGNtLCBlKSkgeyByZXR1cm4gfQogIHZhciBzdGFydCA9IHBvc0Zyb21Nb3VzZShjbSwgZSkKICB3aW5kb3cuZm9jdXMoKQoKICBzd2l0Y2ggKGVfYnV0dG9uKGUpKSB7CiAgY2FzZSAxOgogICAgLy8gIzMyNjE6IG1ha2Ugc3VyZSwgdGhhdCB3ZSdyZSBub3Qgc3RhcnRpbmcgYSBzZWNvbmQgc2VsZWN0aW9uCiAgICBpZiAoY20uc3RhdGUuc2VsZWN0aW5nVGV4dCkKICAgICAgeyBjbS5zdGF0ZS5zZWxlY3RpbmdUZXh0KGUpIH0KICAgIGVsc2UgaWYgKHN0YXJ0KQogICAgICB7IGxlZnRCdXR0b25Eb3duKGNtLCBlLCBzdGFydCkgfQogICAgZWxzZSBpZiAoZV90YXJnZXQoZSkgPT0gZGlzcGxheS5zY3JvbGxlcikKICAgICAgeyBlX3ByZXZlbnREZWZhdWx0KGUpIH0KICAgIGJyZWFrCiAgY2FzZSAyOgogICAgaWYgKHdlYmtpdCkgeyBjbS5zdGF0ZS5sYXN0TWlkZGxlRG93biA9ICtuZXcgRGF0ZSB9CiAgICBpZiAoc3RhcnQpIHsgZXh0ZW5kU2VsZWN0aW9uKGNtLmRvYywgc3RhcnQpIH0KICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyByZXR1cm4gZGlzcGxheS5pbnB1dC5mb2N1cygpOyB9LCAyMCkKICAgIGVfcHJldmVudERlZmF1bHQoZSkKICAgIGJyZWFrCiAgY2FzZSAzOgogICAgaWYgKGNhcHR1cmVSaWdodENsaWNrKSB7IG9uQ29udGV4dE1lbnUoY20sIGUpIH0KICAgIGVsc2UgeyBkZWxheUJsdXJFdmVudChjbSkgfQogICAgYnJlYWsKICB9Cn0KCnZhciBsYXN0Q2xpY2s7CnZhciBsYXN0RG91YmxlQ2xpY2sKZnVuY3Rpb24gbGVmdEJ1dHRvbkRvd24oY20sIGUsIHN0YXJ0KSB7CiAgaWYgKGllKSB7IHNldFRpbWVvdXQoYmluZChlbnN1cmVGb2N1cywgY20pLCAwKSB9CiAgZWxzZSB7IGNtLmN1ck9wLmZvY3VzID0gYWN0aXZlRWx0KCkgfQoKICB2YXIgbm93ID0gK25ldyBEYXRlLCB0eXBlCiAgaWYgKGxhc3REb3VibGVDbGljayAmJiBsYXN0RG91YmxlQ2xpY2sudGltZSA+IG5vdyAtIDQwMCAmJiBjbXAobGFzdERvdWJsZUNsaWNrLnBvcywgc3RhcnQpID09IDApIHsKICAgIHR5cGUgPSAidHJpcGxlIgogIH0gZWxzZSBpZiAobGFzdENsaWNrICYmIGxhc3RDbGljay50aW1lID4gbm93IC0gNDAwICYmIGNtcChsYXN0Q2xpY2sucG9zLCBzdGFydCkgPT0gMCkgewogICAgdHlwZSA9ICJkb3VibGUiCiAgICBsYXN0RG91YmxlQ2xpY2sgPSB7dGltZTogbm93LCBwb3M6IHN0YXJ0fQogIH0gZWxzZSB7CiAgICB0eXBlID0gInNpbmdsZSIKICAgIGxhc3RDbGljayA9IHt0aW1lOiBub3csIHBvczogc3RhcnR9CiAgfQoKICB2YXIgc2VsID0gY20uZG9jLnNlbCwgbW9kaWZpZXIgPSBtYWMgPyBlLm1ldGFLZXkgOiBlLmN0cmxLZXksIGNvbnRhaW5lZAogIGlmIChjbS5vcHRpb25zLmRyYWdEcm9wICYmIGRyYWdBbmREcm9wICYmICFjbS5pc1JlYWRPbmx5KCkgJiYKICAgICAgdHlwZSA9PSAic2luZ2xlIiAmJiAoY29udGFpbmVkID0gc2VsLmNvbnRhaW5zKHN0YXJ0KSkgPiAtMSAmJgogICAgICAoY21wKChjb250YWluZWQgPSBzZWwucmFuZ2VzW2NvbnRhaW5lZF0pLmZyb20oKSwgc3RhcnQpIDwgMCB8fCBzdGFydC54UmVsID4gMCkgJiYKICAgICAgKGNtcChjb250YWluZWQudG8oKSwgc3RhcnQpID4gMCB8fCBzdGFydC54UmVsIDwgMCkpCiAgICB7IGxlZnRCdXR0b25TdGFydERyYWcoY20sIGUsIHN0YXJ0LCBtb2RpZmllcikgfQogIGVsc2UKICAgIHsgbGVmdEJ1dHRvblNlbGVjdChjbSwgZSwgc3RhcnQsIHR5cGUsIG1vZGlmaWVyKSB9Cn0KCi8vIFN0YXJ0IGEgdGV4dCBkcmFnLiBXaGVuIGl0IGVuZHMsIHNlZSBpZiBhbnkgZHJhZ2dpbmcgYWN0dWFsbHkKLy8gaGFwcGVuLCBhbmQgdHJlYXQgYXMgYSBjbGljayBpZiBpdCBkaWRuJ3QuCmZ1bmN0aW9uIGxlZnRCdXR0b25TdGFydERyYWcoY20sIGUsIHN0YXJ0LCBtb2RpZmllcikgewogIHZhciBkaXNwbGF5ID0gY20uZGlzcGxheSwgc3RhcnRUaW1lID0gK25ldyBEYXRlCiAgdmFyIGRyYWdFbmQgPSBvcGVyYXRpb24oY20sIGZ1bmN0aW9uIChlMikgewogICAgaWYgKHdlYmtpdCkgeyBkaXNwbGF5LnNjcm9sbGVyLmRyYWdnYWJsZSA9IGZhbHNlIH0KICAgIGNtLnN0YXRlLmRyYWdnaW5nVGV4dCA9IGZhbHNlCiAgICBvZmYoZG9jdW1lbnQsICJtb3VzZXVwIiwgZHJhZ0VuZCkKICAgIG9mZihkaXNwbGF5LnNjcm9sbGVyLCAiZHJvcCIsIGRyYWdFbmQpCiAgICBpZiAoTWF0aC5hYnMoZS5jbGllbnRYIC0gZTIuY2xpZW50WCkgKyBNYXRoLmFicyhlLmNsaWVudFkgLSBlMi5jbGllbnRZKSA8IDEwKSB7CiAgICAgIGVfcHJldmVudERlZmF1bHQoZTIpCiAgICAgIGlmICghbW9kaWZpZXIgJiYgK25ldyBEYXRlIC0gMjAwIDwgc3RhcnRUaW1lKQogICAgICAgIHsgZXh0ZW5kU2VsZWN0aW9uKGNtLmRvYywgc3RhcnQpIH0KICAgICAgLy8gV29yayBhcm91bmQgdW5leHBsYWluYWJsZSBmb2N1cyBwcm9ibGVtIGluIElFOSAoIzIxMjcpIGFuZCBDaHJvbWUgKCMzMDgxKQogICAgICBpZiAod2Via2l0IHx8IGllICYmIGllX3ZlcnNpb24gPT0gOSkKICAgICAgICB7IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge2RvY3VtZW50LmJvZHkuZm9jdXMoKTsgZGlzcGxheS5pbnB1dC5mb2N1cygpfSwgMjApIH0KICAgICAgZWxzZQogICAgICAgIHsgZGlzcGxheS5pbnB1dC5mb2N1cygpIH0KICAgIH0KICB9KQogIC8vIExldCB0aGUgZHJhZyBoYW5kbGVyIGhhbmRsZSB0aGlzLgogIGlmICh3ZWJraXQpIHsgZGlzcGxheS5zY3JvbGxlci5kcmFnZ2FibGUgPSB0cnVlIH0KICBjbS5zdGF0ZS5kcmFnZ2luZ1RleHQgPSBkcmFnRW5kCiAgZHJhZ0VuZC5jb3B5ID0gbWFjID8gZS5hbHRLZXkgOiBlLmN0cmxLZXkKICAvLyBJRSdzIGFwcHJvYWNoIHRvIGRyYWdnYWJsZQogIGlmIChkaXNwbGF5LnNjcm9sbGVyLmRyYWdEcm9wKSB7IGRpc3BsYXkuc2Nyb2xsZXIuZHJhZ0Ryb3AoKSB9CiAgb24oZG9jdW1lbnQsICJtb3VzZXVwIiwgZHJhZ0VuZCkKICBvbihkaXNwbGF5LnNjcm9sbGVyLCAiZHJvcCIsIGRyYWdFbmQpCn0KCi8vIE5vcm1hbCBzZWxlY3Rpb24sIGFzIG9wcG9zZWQgdG8gdGV4dCBkcmFnZ2luZy4KZnVuY3Rpb24gbGVmdEJ1dHRvblNlbGVjdChjbSwgZSwgc3RhcnQsIHR5cGUsIGFkZE5ldykgewogIHZhciBkaXNwbGF5ID0gY20uZGlzcGxheSwgZG9jID0gY20uZG9jCiAgZV9wcmV2ZW50RGVmYXVsdChlKQoKICB2YXIgb3VyUmFuZ2UsIG91ckluZGV4LCBzdGFydFNlbCA9IGRvYy5zZWwsIHJhbmdlcyA9IHN0YXJ0U2VsLnJhbmdlcwogIGlmIChhZGROZXcgJiYgIWUuc2hpZnRLZXkpIHsKICAgIG91ckluZGV4ID0gZG9jLnNlbC5jb250YWlucyhzdGFydCkKICAgIGlmIChvdXJJbmRleCA+IC0xKQogICAgICB7IG91clJhbmdlID0gcmFuZ2VzW291ckluZGV4XSB9CiAgICBlbHNlCiAgICAgIHsgb3VyUmFuZ2UgPSBuZXcgUmFuZ2Uoc3RhcnQsIHN0YXJ0KSB9CiAgfSBlbHNlIHsKICAgIG91clJhbmdlID0gZG9jLnNlbC5wcmltYXJ5KCkKICAgIG91ckluZGV4ID0gZG9jLnNlbC5wcmltSW5kZXgKICB9CgogIGlmIChjaHJvbWVPUyA/IGUuc2hpZnRLZXkgJiYgZS5tZXRhS2V5IDogZS5hbHRLZXkpIHsKICAgIHR5cGUgPSAicmVjdCIKICAgIGlmICghYWRkTmV3KSB7IG91clJhbmdlID0gbmV3IFJhbmdlKHN0YXJ0LCBzdGFydCkgfQogICAgc3RhcnQgPSBwb3NGcm9tTW91c2UoY20sIGUsIHRydWUsIHRydWUpCiAgICBvdXJJbmRleCA9IC0xCiAgfSBlbHNlIGlmICh0eXBlID09ICJkb3VibGUiKSB7CiAgICB2YXIgd29yZCA9IGNtLmZpbmRXb3JkQXQoc3RhcnQpCiAgICBpZiAoY20uZGlzcGxheS5zaGlmdCB8fCBkb2MuZXh0ZW5kKQogICAgICB7IG91clJhbmdlID0gZXh0ZW5kUmFuZ2UoZG9jLCBvdXJSYW5nZSwgd29yZC5hbmNob3IsIHdvcmQuaGVhZCkgfQogICAgZWxzZQogICAgICB7IG91clJhbmdlID0gd29yZCB9CiAgfSBlbHNlIGlmICh0eXBlID09ICJ0cmlwbGUiKSB7CiAgICB2YXIgbGluZSA9IG5ldyBSYW5nZShQb3Moc3RhcnQubGluZSwgMCksIGNsaXBQb3MoZG9jLCBQb3Moc3RhcnQubGluZSArIDEsIDApKSkKICAgIGlmIChjbS5kaXNwbGF5LnNoaWZ0IHx8IGRvYy5leHRlbmQpCiAgICAgIHsgb3VyUmFuZ2UgPSBleHRlbmRSYW5nZShkb2MsIG91clJhbmdlLCBsaW5lLmFuY2hvciwgbGluZS5oZWFkKSB9CiAgICBlbHNlCiAgICAgIHsgb3VyUmFuZ2UgPSBsaW5lIH0KICB9IGVsc2UgewogICAgb3VyUmFuZ2UgPSBleHRlbmRSYW5nZShkb2MsIG91clJhbmdlLCBzdGFydCkKICB9CgogIGlmICghYWRkTmV3KSB7CiAgICBvdXJJbmRleCA9IDAKICAgIHNldFNlbGVjdGlvbihkb2MsIG5ldyBTZWxlY3Rpb24oW291clJhbmdlXSwgMCksIHNlbF9tb3VzZSkKICAgIHN0YXJ0U2VsID0gZG9jLnNlbAogIH0gZWxzZSBpZiAob3VySW5kZXggPT0gLTEpIHsKICAgIG91ckluZGV4ID0gcmFuZ2VzLmxlbmd0aAogICAgc2V0U2VsZWN0aW9uKGRvYywgbm9ybWFsaXplU2VsZWN0aW9uKHJhbmdlcy5jb25jYXQoW291clJhbmdlXSksIG91ckluZGV4KSwKICAgICAgICAgICAgICAgICB7c2Nyb2xsOiBmYWxzZSwgb3JpZ2luOiAiKm1vdXNlIn0pCiAgfSBlbHNlIGlmIChyYW5nZXMubGVuZ3RoID4gMSAmJiByYW5nZXNbb3VySW5kZXhdLmVtcHR5KCkgJiYgdHlwZSA9PSAic2luZ2xlIiAmJiAhZS5zaGlmdEtleSkgewogICAgc2V0U2VsZWN0aW9uKGRvYywgbm9ybWFsaXplU2VsZWN0aW9uKHJhbmdlcy5zbGljZSgwLCBvdXJJbmRleCkuY29uY2F0KHJhbmdlcy5zbGljZShvdXJJbmRleCArIDEpKSwgMCksCiAgICAgICAgICAgICAgICAge3Njcm9sbDogZmFsc2UsIG9yaWdpbjogIiptb3VzZSJ9KQogICAgc3RhcnRTZWwgPSBkb2Muc2VsCiAgfSBlbHNlIHsKICAgIHJlcGxhY2VPbmVTZWxlY3Rpb24oZG9jLCBvdXJJbmRleCwgb3VyUmFuZ2UsIHNlbF9tb3VzZSkKICB9CgogIHZhciBsYXN0UG9zID0gc3RhcnQKICBmdW5jdGlvbiBleHRlbmRUbyhwb3MpIHsKICAgIGlmIChjbXAobGFzdFBvcywgcG9zKSA9PSAwKSB7IHJldHVybiB9CiAgICBsYXN0UG9zID0gcG9zCgogICAgaWYgKHR5cGUgPT0gInJlY3QiKSB7CiAgICAgIHZhciByYW5nZXMgPSBbXSwgdGFiU2l6ZSA9IGNtLm9wdGlvbnMudGFiU2l6ZQogICAgICB2YXIgc3RhcnRDb2wgPSBjb3VudENvbHVtbihnZXRMaW5lKGRvYywgc3RhcnQubGluZSkudGV4dCwgc3RhcnQuY2gsIHRhYlNpemUpCiAgICAgIHZhciBwb3NDb2wgPSBjb3VudENvbHVtbihnZXRMaW5lKGRvYywgcG9zLmxpbmUpLnRleHQsIHBvcy5jaCwgdGFiU2l6ZSkKICAgICAgdmFyIGxlZnQgPSBNYXRoLm1pbihzdGFydENvbCwgcG9zQ29sKSwgcmlnaHQgPSBNYXRoLm1heChzdGFydENvbCwgcG9zQ29sKQogICAgICBmb3IgKHZhciBsaW5lID0gTWF0aC5taW4oc3RhcnQubGluZSwgcG9zLmxpbmUpLCBlbmQgPSBNYXRoLm1pbihjbS5sYXN0TGluZSgpLCBNYXRoLm1heChzdGFydC5saW5lLCBwb3MubGluZSkpOwogICAgICAgICAgIGxpbmUgPD0gZW5kOyBsaW5lKyspIHsKICAgICAgICB2YXIgdGV4dCA9IGdldExpbmUoZG9jLCBsaW5lKS50ZXh0LCBsZWZ0UG9zID0gZmluZENvbHVtbih0ZXh0LCBsZWZ0LCB0YWJTaXplKQogICAgICAgIGlmIChsZWZ0ID09IHJpZ2h0KQogICAgICAgICAgeyByYW5nZXMucHVzaChuZXcgUmFuZ2UoUG9zKGxpbmUsIGxlZnRQb3MpLCBQb3MobGluZSwgbGVmdFBvcykpKSB9CiAgICAgICAgZWxzZSBpZiAodGV4dC5sZW5ndGggPiBsZWZ0UG9zKQogICAgICAgICAgeyByYW5nZXMucHVzaChuZXcgUmFuZ2UoUG9zKGxpbmUsIGxlZnRQb3MpLCBQb3MobGluZSwgZmluZENvbHVtbih0ZXh0LCByaWdodCwgdGFiU2l6ZSkpKSkgfQogICAgICB9CiAgICAgIGlmICghcmFuZ2VzLmxlbmd0aCkgeyByYW5nZXMucHVzaChuZXcgUmFuZ2Uoc3RhcnQsIHN0YXJ0KSkgfQogICAgICBzZXRTZWxlY3Rpb24oZG9jLCBub3JtYWxpemVTZWxlY3Rpb24oc3RhcnRTZWwucmFuZ2VzLnNsaWNlKDAsIG91ckluZGV4KS5jb25jYXQocmFuZ2VzKSwgb3VySW5kZXgpLAogICAgICAgICAgICAgICAgICAge29yaWdpbjogIiptb3VzZSIsIHNjcm9sbDogZmFsc2V9KQogICAgICBjbS5zY3JvbGxJbnRvVmlldyhwb3MpCiAgICB9IGVsc2UgewogICAgICB2YXIgb2xkUmFuZ2UgPSBvdXJSYW5nZQogICAgICB2YXIgYW5jaG9yID0gb2xkUmFuZ2UuYW5jaG9yLCBoZWFkID0gcG9zCiAgICAgIGlmICh0eXBlICE9ICJzaW5nbGUiKSB7CiAgICAgICAgdmFyIHJhbmdlJCQxCiAgICAgICAgaWYgKHR5cGUgPT0gImRvdWJsZSIpCiAgICAgICAgICB7IHJhbmdlJCQxID0gY20uZmluZFdvcmRBdChwb3MpIH0KICAgICAgICBlbHNlCiAgICAgICAgICB7IHJhbmdlJCQxID0gbmV3IFJhbmdlKFBvcyhwb3MubGluZSwgMCksIGNsaXBQb3MoZG9jLCBQb3MocG9zLmxpbmUgKyAxLCAwKSkpIH0KICAgICAgICBpZiAoY21wKHJhbmdlJCQxLmFuY2hvciwgYW5jaG9yKSA+IDApIHsKICAgICAgICAgIGhlYWQgPSByYW5nZSQkMS5oZWFkCiAgICAgICAgICBhbmNob3IgPSBtaW5Qb3Mob2xkUmFuZ2UuZnJvbSgpLCByYW5nZSQkMS5hbmNob3IpCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGhlYWQgPSByYW5nZSQkMS5hbmNob3IKICAgICAgICAgIGFuY2hvciA9IG1heFBvcyhvbGRSYW5nZS50bygpLCByYW5nZSQkMS5oZWFkKQogICAgICAgIH0KICAgICAgfQogICAgICB2YXIgcmFuZ2VzJDEgPSBzdGFydFNlbC5yYW5nZXMuc2xpY2UoMCkKICAgICAgcmFuZ2VzJDFbb3VySW5kZXhdID0gbmV3IFJhbmdlKGNsaXBQb3MoZG9jLCBhbmNob3IpLCBoZWFkKQogICAgICBzZXRTZWxlY3Rpb24oZG9jLCBub3JtYWxpemVTZWxlY3Rpb24ocmFuZ2VzJDEsIG91ckluZGV4KSwgc2VsX21vdXNlKQogICAgfQogIH0KCiAgdmFyIGVkaXRvclNpemUgPSBkaXNwbGF5LndyYXBwZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkKICAvLyBVc2VkIHRvIGVuc3VyZSB0aW1lb3V0IHJlLXRyaWVzIGRvbid0IGZpcmUgd2hlbiBhbm90aGVyIGV4dGVuZAogIC8vIGhhcHBlbmVkIGluIHRoZSBtZWFudGltZSAoY2xlYXJUaW1lb3V0IGlzbid0IHJlbGlhYmxlIC0tIGF0CiAgLy8gbGVhc3Qgb24gQ2hyb21lLCB0aGUgdGltZW91dHMgc3RpbGwgaGFwcGVuIGV2ZW4gd2hlbiBjbGVhcmVkLAogIC8vIGlmIHRoZSBjbGVhciBoYXBwZW5zIGFmdGVyIHRoZWlyIHNjaGVkdWxlZCBmaXJpbmcgdGltZSkuCiAgdmFyIGNvdW50ZXIgPSAwCgogIGZ1bmN0aW9uIGV4dGVuZChlKSB7CiAgICB2YXIgY3VyQ291bnQgPSArK2NvdW50ZXIKICAgIHZhciBjdXIgPSBwb3NGcm9tTW91c2UoY20sIGUsIHRydWUsIHR5cGUgPT0gInJlY3QiKQogICAgaWYgKCFjdXIpIHsgcmV0dXJuIH0KICAgIGlmIChjbXAoY3VyLCBsYXN0UG9zKSAhPSAwKSB7CiAgICAgIGNtLmN1ck9wLmZvY3VzID0gYWN0aXZlRWx0KCkKICAgICAgZXh0ZW5kVG8oY3VyKQogICAgICB2YXIgdmlzaWJsZSA9IHZpc2libGVMaW5lcyhkaXNwbGF5LCBkb2MpCiAgICAgIGlmIChjdXIubGluZSA+PSB2aXNpYmxlLnRvIHx8IGN1ci5saW5lIDwgdmlzaWJsZS5mcm9tKQogICAgICAgIHsgc2V0VGltZW91dChvcGVyYXRpb24oY20sIGZ1bmN0aW9uICgpIHtpZiAoY291bnRlciA9PSBjdXJDb3VudCkgeyBleHRlbmQoZSkgfX0pLCAxNTApIH0KICAgIH0gZWxzZSB7CiAgICAgIHZhciBvdXRzaWRlID0gZS5jbGllbnRZIDwgZWRpdG9yU2l6ZS50b3AgPyAtMjAgOiBlLmNsaWVudFkgPiBlZGl0b3JTaXplLmJvdHRvbSA/IDIwIDogMAogICAgICBpZiAob3V0c2lkZSkgeyBzZXRUaW1lb3V0KG9wZXJhdGlvbihjbSwgZnVuY3Rpb24gKCkgewogICAgICAgIGlmIChjb3VudGVyICE9IGN1ckNvdW50KSB7IHJldHVybiB9CiAgICAgICAgZGlzcGxheS5zY3JvbGxlci5zY3JvbGxUb3AgKz0gb3V0c2lkZQogICAgICAgIGV4dGVuZChlKQogICAgICB9KSwgNTApIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIGRvbmUoZSkgewogICAgY20uc3RhdGUuc2VsZWN0aW5nVGV4dCA9IGZhbHNlCiAgICBjb3VudGVyID0gSW5maW5pdHkKICAgIGVfcHJldmVudERlZmF1bHQoZSkKICAgIGRpc3BsYXkuaW5wdXQuZm9jdXMoKQogICAgb2ZmKGRvY3VtZW50LCAibW91c2Vtb3ZlIiwgbW92ZSkKICAgIG9mZihkb2N1bWVudCwgIm1vdXNldXAiLCB1cCkKICAgIGRvYy5oaXN0b3J5Lmxhc3RTZWxPcmlnaW4gPSBudWxsCiAgfQoKICB2YXIgbW92ZSA9IG9wZXJhdGlvbihjbSwgZnVuY3Rpb24gKGUpIHsKICAgIGlmICghZV9idXR0b24oZSkpIHsgZG9uZShlKSB9CiAgICBlbHNlIHsgZXh0ZW5kKGUpIH0KICB9KQogIHZhciB1cCA9IG9wZXJhdGlvbihjbSwgZG9uZSkKICBjbS5zdGF0ZS5zZWxlY3RpbmdUZXh0ID0gdXAKICBvbihkb2N1bWVudCwgIm1vdXNlbW92ZSIsIG1vdmUpCiAgb24oZG9jdW1lbnQsICJtb3VzZXVwIiwgdXApCn0KCgovLyBEZXRlcm1pbmVzIHdoZXRoZXIgYW4gZXZlbnQgaGFwcGVuZWQgaW4gdGhlIGd1dHRlciwgYW5kIGZpcmVzIHRoZQovLyBoYW5kbGVycyBmb3IgdGhlIGNvcnJlc3BvbmRpbmcgZXZlbnQuCmZ1bmN0aW9uIGd1dHRlckV2ZW50KGNtLCBlLCB0eXBlLCBwcmV2ZW50KSB7CiAgdmFyIG1YLCBtWQogIHRyeSB7IG1YID0gZS5jbGllbnRYOyBtWSA9IGUuY2xpZW50WSB9CiAgY2F0Y2goZSkgeyByZXR1cm4gZmFsc2UgfQogIGlmIChtWCA+PSBNYXRoLmZsb29yKGNtLmRpc3BsYXkuZ3V0dGVycy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5yaWdodCkpIHsgcmV0dXJuIGZhbHNlIH0KICBpZiAocHJldmVudCkgeyBlX3ByZXZlbnREZWZhdWx0KGUpIH0KCiAgdmFyIGRpc3BsYXkgPSBjbS5kaXNwbGF5CiAgdmFyIGxpbmVCb3ggPSBkaXNwbGF5LmxpbmVEaXYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkKCiAgaWYgKG1ZID4gbGluZUJveC5ib3R0b20gfHwgIWhhc0hhbmRsZXIoY20sIHR5cGUpKSB7IHJldHVybiBlX2RlZmF1bHRQcmV2ZW50ZWQoZSkgfQogIG1ZIC09IGxpbmVCb3gudG9wIC0gZGlzcGxheS52aWV3T2Zmc2V0CgogIGZvciAodmFyIGkgPSAwOyBpIDwgY20ub3B0aW9ucy5ndXR0ZXJzLmxlbmd0aDsgKytpKSB7CiAgICB2YXIgZyA9IGRpc3BsYXkuZ3V0dGVycy5jaGlsZE5vZGVzW2ldCiAgICBpZiAoZyAmJiBnLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnJpZ2h0ID49IG1YKSB7CiAgICAgIHZhciBsaW5lID0gbGluZUF0SGVpZ2h0KGNtLmRvYywgbVkpCiAgICAgIHZhciBndXR0ZXIgPSBjbS5vcHRpb25zLmd1dHRlcnNbaV0KICAgICAgc2lnbmFsKGNtLCB0eXBlLCBjbSwgbGluZSwgZ3V0dGVyLCBlKQogICAgICByZXR1cm4gZV9kZWZhdWx0UHJldmVudGVkKGUpCiAgICB9CiAgfQp9CgpmdW5jdGlvbiBjbGlja0luR3V0dGVyKGNtLCBlKSB7CiAgcmV0dXJuIGd1dHRlckV2ZW50KGNtLCBlLCAiZ3V0dGVyQ2xpY2siLCB0cnVlKQp9CgovLyBDT05URVhUIE1FTlUgSEFORExJTkcKCi8vIFRvIG1ha2UgdGhlIGNvbnRleHQgbWVudSB3b3JrLCB3ZSBuZWVkIHRvIGJyaWVmbHkgdW5oaWRlIHRoZQovLyB0ZXh0YXJlYSAobWFraW5nIGl0IGFzIHVub2J0cnVzaXZlIGFzIHBvc3NpYmxlKSB0byBsZXQgdGhlCi8vIHJpZ2h0LWNsaWNrIHRha2UgZWZmZWN0IG9uIGl0LgpmdW5jdGlvbiBvbkNvbnRleHRNZW51KGNtLCBlKSB7CiAgaWYgKGV2ZW50SW5XaWRnZXQoY20uZGlzcGxheSwgZSkgfHwgY29udGV4dE1lbnVJbkd1dHRlcihjbSwgZSkpIHsgcmV0dXJuIH0KICBpZiAoc2lnbmFsRE9NRXZlbnQoY20sIGUsICJjb250ZXh0bWVudSIpKSB7IHJldHVybiB9CiAgY20uZGlzcGxheS5pbnB1dC5vbkNvbnRleHRNZW51KGUpCn0KCmZ1bmN0aW9uIGNvbnRleHRNZW51SW5HdXR0ZXIoY20sIGUpIHsKICBpZiAoIWhhc0hhbmRsZXIoY20sICJndXR0ZXJDb250ZXh0TWVudSIpKSB7IHJldHVybiBmYWxzZSB9CiAgcmV0dXJuIGd1dHRlckV2ZW50KGNtLCBlLCAiZ3V0dGVyQ29udGV4dE1lbnUiLCBmYWxzZSkKfQoKZnVuY3Rpb24gdGhlbWVDaGFuZ2VkKGNtKSB7CiAgY20uZGlzcGxheS53cmFwcGVyLmNsYXNzTmFtZSA9IGNtLmRpc3BsYXkud3JhcHBlci5jbGFzc05hbWUucmVwbGFjZSgvXHMqY20tcy1cUysvZywgIiIpICsKICAgIGNtLm9wdGlvbnMudGhlbWUucmVwbGFjZSgvKF58XHMpXHMqL2csICIgY20tcy0iKQogIGNsZWFyQ2FjaGVzKGNtKQp9Cgp2YXIgSW5pdCA9IHt0b1N0cmluZzogZnVuY3Rpb24oKXtyZXR1cm4gIkNvZGVNaXJyb3IuSW5pdCJ9fQoKdmFyIGRlZmF1bHRzID0ge30KdmFyIG9wdGlvbkhhbmRsZXJzID0ge30KCmZ1bmN0aW9uIGRlZmluZU9wdGlvbnMoQ29kZU1pcnJvcikgewogIHZhciBvcHRpb25IYW5kbGVycyA9IENvZGVNaXJyb3Iub3B0aW9uSGFuZGxlcnMKCiAgZnVuY3Rpb24gb3B0aW9uKG5hbWUsIGRlZmx0LCBoYW5kbGUsIG5vdE9uSW5pdCkgewogICAgQ29kZU1pcnJvci5kZWZhdWx0c1tuYW1lXSA9IGRlZmx0CiAgICBpZiAoaGFuZGxlKSB7IG9wdGlvbkhhbmRsZXJzW25hbWVdID0KICAgICAgbm90T25Jbml0ID8gZnVuY3Rpb24gKGNtLCB2YWwsIG9sZCkge2lmIChvbGQgIT0gSW5pdCkgeyBoYW5kbGUoY20sIHZhbCwgb2xkKSB9fSA6IGhhbmRsZSB9CiAgfQoKICBDb2RlTWlycm9yLmRlZmluZU9wdGlvbiA9IG9wdGlvbgoKICAvLyBQYXNzZWQgdG8gb3B0aW9uIGhhbmRsZXJzIHdoZW4gdGhlcmUgaXMgbm8gb2xkIHZhbHVlLgogIENvZGVNaXJyb3IuSW5pdCA9IEluaXQKCiAgLy8gVGhlc2UgdHdvIGFyZSwgb24gaW5pdCwgY2FsbGVkIGZyb20gdGhlIGNvbnN0cnVjdG9yIGJlY2F1c2UgdGhleQogIC8vIGhhdmUgdG8gYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIHRoZSBlZGl0b3IgY2FuIHN0YXJ0IGF0IGFsbC4KICBvcHRpb24oInZhbHVlIiwgIiIsIGZ1bmN0aW9uIChjbSwgdmFsKSB7IHJldHVybiBjbS5zZXRWYWx1ZSh2YWwpOyB9LCB0cnVlKQogIG9wdGlvbigibW9kZSIsIG51bGwsIGZ1bmN0aW9uIChjbSwgdmFsKSB7CiAgICBjbS5kb2MubW9kZU9wdGlvbiA9IHZhbAogICAgbG9hZE1vZGUoY20pCiAgfSwgdHJ1ZSkKCiAgb3B0aW9uKCJpbmRlbnRVbml0IiwgMiwgbG9hZE1vZGUsIHRydWUpCiAgb3B0aW9uKCJpbmRlbnRXaXRoVGFicyIsIGZhbHNlKQogIG9wdGlvbigic21hcnRJbmRlbnQiLCB0cnVlKQogIG9wdGlvbigidGFiU2l6ZSIsIDQsIGZ1bmN0aW9uIChjbSkgewogICAgcmVzZXRNb2RlU3RhdGUoY20pCiAgICBjbGVhckNhY2hlcyhjbSkKICAgIHJlZ0NoYW5nZShjbSkKICB9LCB0cnVlKQogIG9wdGlvbigibGluZVNlcGFyYXRvciIsIG51bGwsIGZ1bmN0aW9uIChjbSwgdmFsKSB7CiAgICBjbS5kb2MubGluZVNlcCA9IHZhbAogICAgaWYgKCF2YWwpIHsgcmV0dXJuIH0KICAgIHZhciBuZXdCcmVha3MgPSBbXSwgbGluZU5vID0gY20uZG9jLmZpcnN0CiAgICBjbS5kb2MuaXRlcihmdW5jdGlvbiAobGluZSkgewogICAgICBmb3IgKHZhciBwb3MgPSAwOzspIHsKICAgICAgICB2YXIgZm91bmQgPSBsaW5lLnRleHQuaW5kZXhPZih2YWwsIHBvcykKICAgICAgICBpZiAoZm91bmQgPT0gLTEpIHsgYnJlYWsgfQogICAgICAgIHBvcyA9IGZvdW5kICsgdmFsLmxlbmd0aAogICAgICAgIG5ld0JyZWFrcy5wdXNoKFBvcyhsaW5lTm8sIGZvdW5kKSkKICAgICAgfQogICAgICBsaW5lTm8rKwogICAgfSkKICAgIGZvciAodmFyIGkgPSBuZXdCcmVha3MubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pCiAgICAgIHsgcmVwbGFjZVJhbmdlKGNtLmRvYywgdmFsLCBuZXdCcmVha3NbaV0sIFBvcyhuZXdCcmVha3NbaV0ubGluZSwgbmV3QnJlYWtzW2ldLmNoICsgdmFsLmxlbmd0aCkpIH0KICB9KQogIG9wdGlvbigic3BlY2lhbENoYXJzIiwgL1tcdTAwMDAtXHUwMDFmXHUwMDdmXHUwMGFkXHUyMDBiLVx1MjAwZlx1MjAyOFx1MjAyOVx1ZmVmZl0vZywgZnVuY3Rpb24gKGNtLCB2YWwsIG9sZCkgewogICAgY20uc3RhdGUuc3BlY2lhbENoYXJzID0gbmV3IFJlZ0V4cCh2YWwuc291cmNlICsgKHZhbC50ZXN0KCJcdCIpID8gIiIgOiAifFx0IiksICJnIikKICAgIGlmIChvbGQgIT0gSW5pdCkgeyBjbS5yZWZyZXNoKCkgfQogIH0pCiAgb3B0aW9uKCJzcGVjaWFsQ2hhclBsYWNlaG9sZGVyIiwgZGVmYXVsdFNwZWNpYWxDaGFyUGxhY2Vob2xkZXIsIGZ1bmN0aW9uIChjbSkgeyByZXR1cm4gY20ucmVmcmVzaCgpOyB9LCB0cnVlKQogIG9wdGlvbigiZWxlY3RyaWNDaGFycyIsIHRydWUpCiAgb3B0aW9uKCJpbnB1dFN0eWxlIiwgbW9iaWxlID8gImNvbnRlbnRlZGl0YWJsZSIgOiAidGV4dGFyZWEiLCBmdW5jdGlvbiAoKSB7CiAgICB0aHJvdyBuZXcgRXJyb3IoImlucHV0U3R5bGUgY2FuIG5vdCAoeWV0KSBiZSBjaGFuZ2VkIGluIGEgcnVubmluZyBlZGl0b3IiKSAvLyBGSVhNRQogIH0sIHRydWUpCiAgb3B0aW9uKCJzcGVsbGNoZWNrIiwgZmFsc2UsIGZ1bmN0aW9uIChjbSwgdmFsKSB7IHJldHVybiBjbS5nZXRJbnB1dEZpZWxkKCkuc3BlbGxjaGVjayA9IHZhbDsgfSwgdHJ1ZSkKICBvcHRpb24oInJ0bE1vdmVWaXN1YWxseSIsICF3aW5kb3dzKQogIG9wdGlvbigid2hvbGVMaW5lVXBkYXRlQmVmb3JlIiwgdHJ1ZSkKCiAgb3B0aW9uKCJ0aGVtZSIsICJkZWZhdWx0IiwgZnVuY3Rpb24gKGNtKSB7CiAgICB0aGVtZUNoYW5nZWQoY20pCiAgICBndXR0ZXJzQ2hhbmdlZChjbSkKICB9LCB0cnVlKQogIG9wdGlvbigia2V5TWFwIiwgImRlZmF1bHQiLCBmdW5jdGlvbiAoY20sIHZhbCwgb2xkKSB7CiAgICB2YXIgbmV4dCA9IGdldEtleU1hcCh2YWwpCiAgICB2YXIgcHJldiA9IG9sZCAhPSBJbml0ICYmIGdldEtleU1hcChvbGQpCiAgICBpZiAocHJldiAmJiBwcmV2LmRldGFjaCkgeyBwcmV2LmRldGFjaChjbSwgbmV4dCkgfQogICAgaWYgKG5leHQuYXR0YWNoKSB7IG5leHQuYXR0YWNoKGNtLCBwcmV2IHx8IG51bGwpIH0KICB9KQogIG9wdGlvbigiZXh0cmFLZXlzIiwgbnVsbCkKCiAgb3B0aW9uKCJsaW5lV3JhcHBpbmciLCBmYWxzZSwgd3JhcHBpbmdDaGFuZ2VkLCB0cnVlKQogIG9wdGlvbigiZ3V0dGVycyIsIFtdLCBmdW5jdGlvbiAoY20pIHsKICAgIHNldEd1dHRlcnNGb3JMaW5lTnVtYmVycyhjbS5vcHRpb25zKQogICAgZ3V0dGVyc0NoYW5nZWQoY20pCiAgfSwgdHJ1ZSkKICBvcHRpb24oImZpeGVkR3V0dGVyIiwgdHJ1ZSwgZnVuY3Rpb24gKGNtLCB2YWwpIHsKICAgIGNtLmRpc3BsYXkuZ3V0dGVycy5zdHlsZS5sZWZ0ID0gdmFsID8gY29tcGVuc2F0ZUZvckhTY3JvbGwoY20uZGlzcGxheSkgKyAicHgiIDogIjAiCiAgICBjbS5yZWZyZXNoKCkKICB9LCB0cnVlKQogIG9wdGlvbigiY292ZXJHdXR0ZXJOZXh0VG9TY3JvbGxiYXIiLCBmYWxzZSwgZnVuY3Rpb24gKGNtKSB7IHJldHVybiB1cGRhdGVTY3JvbGxiYXJzKGNtKTsgfSwgdHJ1ZSkKICBvcHRpb24oInNjcm9sbGJhclN0eWxlIiwgIm5hdGl2ZSIsIGZ1bmN0aW9uIChjbSkgewogICAgaW5pdFNjcm9sbGJhcnMoY20pCiAgICB1cGRhdGVTY3JvbGxiYXJzKGNtKQogICAgY20uZGlzcGxheS5zY3JvbGxiYXJzLnNldFNjcm9sbFRvcChjbS5kb2Muc2Nyb2xsVG9wKQogICAgY20uZGlzcGxheS5zY3JvbGxiYXJzLnNldFNjcm9sbExlZnQoY20uZG9jLnNjcm9sbExlZnQpCiAgfSwgdHJ1ZSkKICBvcHRpb24oImxpbmVOdW1iZXJzIiwgZmFsc2UsIGZ1bmN0aW9uIChjbSkgewogICAgc2V0R3V0dGVyc0ZvckxpbmVOdW1iZXJzKGNtLm9wdGlvbnMpCiAgICBndXR0ZXJzQ2hhbmdlZChjbSkKICB9LCB0cnVlKQogIG9wdGlvbigiZmlyc3RMaW5lTnVtYmVyIiwgMSwgZ3V0dGVyc0NoYW5nZWQsIHRydWUpCiAgb3B0aW9uKCJsaW5lTnVtYmVyRm9ybWF0dGVyIiwgZnVuY3Rpb24gKGludGVnZXIpIHsgcmV0dXJuIGludGVnZXI7IH0sIGd1dHRlcnNDaGFuZ2VkLCB0cnVlKQogIG9wdGlvbigic2hvd0N1cnNvcldoZW5TZWxlY3RpbmciLCBmYWxzZSwgdXBkYXRlU2VsZWN0aW9uLCB0cnVlKQoKICBvcHRpb24oInJlc2V0U2VsZWN0aW9uT25Db250ZXh0TWVudSIsIHRydWUpCiAgb3B0aW9uKCJsaW5lV2lzZUNvcHlDdXQiLCB0cnVlKQoKICBvcHRpb24oInJlYWRPbmx5IiwgZmFsc2UsIGZ1bmN0aW9uIChjbSwgdmFsKSB7CiAgICBpZiAodmFsID09ICJub2N1cnNvciIpIHsKICAgICAgb25CbHVyKGNtKQogICAgICBjbS5kaXNwbGF5LmlucHV0LmJsdXIoKQogICAgICBjbS5kaXNwbGF5LmRpc2FibGVkID0gdHJ1ZQogICAgfSBlbHNlIHsKICAgICAgY20uZGlzcGxheS5kaXNhYmxlZCA9IGZhbHNlCiAgICB9CiAgICBjbS5kaXNwbGF5LmlucHV0LnJlYWRPbmx5Q2hhbmdlZCh2YWwpCiAgfSkKICBvcHRpb24oImRpc2FibGVJbnB1dCIsIGZhbHNlLCBmdW5jdGlvbiAoY20sIHZhbCkge2lmICghdmFsKSB7IGNtLmRpc3BsYXkuaW5wdXQucmVzZXQoKSB9fSwgdHJ1ZSkKICBvcHRpb24oImRyYWdEcm9wIiwgdHJ1ZSwgZHJhZ0Ryb3BDaGFuZ2VkKQogIG9wdGlvbigiYWxsb3dEcm9wRmlsZVR5cGVzIiwgbnVsbCkKCiAgb3B0aW9uKCJjdXJzb3JCbGlua1JhdGUiLCA1MzApCiAgb3B0aW9uKCJjdXJzb3JTY3JvbGxNYXJnaW4iLCAwKQogIG9wdGlvbigiY3Vyc29ySGVpZ2h0IiwgMSwgdXBkYXRlU2VsZWN0aW9uLCB0cnVlKQogIG9wdGlvbigic2luZ2xlQ3Vyc29ySGVpZ2h0UGVyTGluZSIsIHRydWUsIHVwZGF0ZVNlbGVjdGlvbiwgdHJ1ZSkKICBvcHRpb24oIndvcmtUaW1lIiwgMTAwKQogIG9wdGlvbigid29ya0RlbGF5IiwgMTAwKQogIG9wdGlvbigiZmxhdHRlblNwYW5zIiwgdHJ1ZSwgcmVzZXRNb2RlU3RhdGUsIHRydWUpCiAgb3B0aW9uKCJhZGRNb2RlQ2xhc3MiLCBmYWxzZSwgcmVzZXRNb2RlU3RhdGUsIHRydWUpCiAgb3B0aW9uKCJwb2xsSW50ZXJ2YWwiLCAxMDApCiAgb3B0aW9uKCJ1bmRvRGVwdGgiLCAyMDAsIGZ1bmN0aW9uIChjbSwgdmFsKSB7IHJldHVybiBjbS5kb2MuaGlzdG9yeS51bmRvRGVwdGggPSB2YWw7IH0pCiAgb3B0aW9uKCJoaXN0b3J5RXZlbnREZWxheSIsIDEyNTApCiAgb3B0aW9uKCJ2aWV3cG9ydE1hcmdpbiIsIDEwLCBmdW5jdGlvbiAoY20pIHsgcmV0dXJuIGNtLnJlZnJlc2goKTsgfSwgdHJ1ZSkKICBvcHRpb24oIm1heEhpZ2hsaWdodExlbmd0aCIsIDEwMDAwLCByZXNldE1vZGVTdGF0ZSwgdHJ1ZSkKICBvcHRpb24oIm1vdmVJbnB1dFdpdGhDdXJzb3IiLCB0cnVlLCBmdW5jdGlvbiAoY20sIHZhbCkgewogICAgaWYgKCF2YWwpIHsgY20uZGlzcGxheS5pbnB1dC5yZXNldFBvc2l0aW9uKCkgfQogIH0pCgogIG9wdGlvbigidGFiaW5kZXgiLCBudWxsLCBmdW5jdGlvbiAoY20sIHZhbCkgeyByZXR1cm4gY20uZGlzcGxheS5pbnB1dC5nZXRGaWVsZCgpLnRhYkluZGV4ID0gdmFsIHx8ICIiOyB9KQogIG9wdGlvbigiYXV0b2ZvY3VzIiwgbnVsbCkKfQoKZnVuY3Rpb24gZ3V0dGVyc0NoYW5nZWQoY20pIHsKICB1cGRhdGVHdXR0ZXJzKGNtKQogIHJlZ0NoYW5nZShjbSkKICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgcmV0dXJuIGFsaWduSG9yaXpvbnRhbGx5KGNtKTsgfSwgMjApCn0KCmZ1bmN0aW9uIGRyYWdEcm9wQ2hhbmdlZChjbSwgdmFsdWUsIG9sZCkgewogIHZhciB3YXNPbiA9IG9sZCAmJiBvbGQgIT0gSW5pdAogIGlmICghdmFsdWUgIT0gIXdhc09uKSB7CiAgICB2YXIgZnVuY3MgPSBjbS5kaXNwbGF5LmRyYWdGdW5jdGlvbnMKICAgIHZhciB0b2dnbGUgPSB2YWx1ZSA/IG9uIDogb2ZmCiAgICB0b2dnbGUoY20uZGlzcGxheS5zY3JvbGxlciwgImRyYWdzdGFydCIsIGZ1bmNzLnN0YXJ0KQogICAgdG9nZ2xlKGNtLmRpc3BsYXkuc2Nyb2xsZXIsICJkcmFnZW50ZXIiLCBmdW5jcy5lbnRlcikKICAgIHRvZ2dsZShjbS5kaXNwbGF5LnNjcm9sbGVyLCAiZHJhZ292ZXIiLCBmdW5jcy5vdmVyKQogICAgdG9nZ2xlKGNtLmRpc3BsYXkuc2Nyb2xsZXIsICJkcmFnbGVhdmUiLCBmdW5jcy5sZWF2ZSkKICAgIHRvZ2dsZShjbS5kaXNwbGF5LnNjcm9sbGVyLCAiZHJvcCIsIGZ1bmNzLmRyb3ApCiAgfQp9CgpmdW5jdGlvbiB3cmFwcGluZ0NoYW5nZWQoY20pIHsKICBpZiAoY20ub3B0aW9ucy5saW5lV3JhcHBpbmcpIHsKICAgIGFkZENsYXNzKGNtLmRpc3BsYXkud3JhcHBlciwgIkNvZGVNaXJyb3Itd3JhcCIpCiAgICBjbS5kaXNwbGF5LnNpemVyLnN0eWxlLm1pbldpZHRoID0gIiIKICAgIGNtLmRpc3BsYXkuc2l6ZXJXaWR0aCA9IG51bGwKICB9IGVsc2UgewogICAgcm1DbGFzcyhjbS5kaXNwbGF5LndyYXBwZXIsICJDb2RlTWlycm9yLXdyYXAiKQogICAgZmluZE1heExpbmUoY20pCiAgfQogIGVzdGltYXRlTGluZUhlaWdodHMoY20pCiAgcmVnQ2hhbmdlKGNtKQogIGNsZWFyQ2FjaGVzKGNtKQogIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyByZXR1cm4gdXBkYXRlU2Nyb2xsYmFycyhjbSk7IH0sIDEwMCkKfQoKLy8gQSBDb2RlTWlycm9yIGluc3RhbmNlIHJlcHJlc2VudHMgYW4gZWRpdG9yLiBUaGlzIGlzIHRoZSBvYmplY3QKLy8gdGhhdCB1c2VyIGNvZGUgaXMgdXN1YWxseSBkZWFsaW5nIHdpdGguCgpmdW5jdGlvbiBDb2RlTWlycm9yJDEocGxhY2UsIG9wdGlvbnMpIHsKICB2YXIgdGhpcyQxID0gdGhpczsKCiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIENvZGVNaXJyb3IkMSkpIHsgcmV0dXJuIG5ldyBDb2RlTWlycm9yJDEocGxhY2UsIG9wdGlvbnMpIH0KCiAgdGhpcy5vcHRpb25zID0gb3B0aW9ucyA9IG9wdGlvbnMgPyBjb3B5T2JqKG9wdGlvbnMpIDoge30KICAvLyBEZXRlcm1pbmUgZWZmZWN0aXZlIG9wdGlvbnMgYmFzZWQgb24gZ2l2ZW4gdmFsdWVzIGFuZCBkZWZhdWx0cy4KICBjb3B5T2JqKGRlZmF1bHRzLCBvcHRpb25zLCBmYWxzZSkKICBzZXRHdXR0ZXJzRm9yTGluZU51bWJlcnMob3B0aW9ucykKCiAgdmFyIGRvYyA9IG9wdGlvbnMudmFsdWUKICBpZiAodHlwZW9mIGRvYyA9PSAic3RyaW5nIikgeyBkb2MgPSBuZXcgRG9jKGRvYywgb3B0aW9ucy5tb2RlLCBudWxsLCBvcHRpb25zLmxpbmVTZXBhcmF0b3IpIH0KICB0aGlzLmRvYyA9IGRvYwoKICB2YXIgaW5wdXQgPSBuZXcgQ29kZU1pcnJvciQxLmlucHV0U3R5bGVzW29wdGlvbnMuaW5wdXRTdHlsZV0odGhpcykKICB2YXIgZGlzcGxheSA9IHRoaXMuZGlzcGxheSA9IG5ldyBEaXNwbGF5KHBsYWNlLCBkb2MsIGlucHV0KQogIGRpc3BsYXkud3JhcHBlci5Db2RlTWlycm9yID0gdGhpcwogIHVwZGF0ZUd1dHRlcnModGhpcykKICB0aGVtZUNoYW5nZWQodGhpcykKICBpZiAob3B0aW9ucy5saW5lV3JhcHBpbmcpCiAgICB7IHRoaXMuZGlzcGxheS53cmFwcGVyLmNsYXNzTmFtZSArPSAiIENvZGVNaXJyb3Itd3JhcCIgfQogIGlmIChvcHRpb25zLmF1dG9mb2N1cyAmJiAhbW9iaWxlKSB7IGRpc3BsYXkuaW5wdXQuZm9jdXMoKSB9CiAgaW5pdFNjcm9sbGJhcnModGhpcykKCiAgdGhpcy5zdGF0ZSA9IHsKICAgIGtleU1hcHM6IFtdLCAgLy8gc3RvcmVzIG1hcHMgYWRkZWQgYnkgYWRkS2V5TWFwCiAgICBvdmVybGF5czogW10sIC8vIGhpZ2hsaWdodGluZyBvdmVybGF5cywgYXMgYWRkZWQgYnkgYWRkT3ZlcmxheQogICAgbW9kZUdlbjogMCwgICAvLyBidW1wZWQgd2hlbiBtb2RlL292ZXJsYXkgY2hhbmdlcywgdXNlZCB0byBpbnZhbGlkYXRlIGhpZ2hsaWdodGluZyBpbmZvCiAgICBvdmVyd3JpdGU6IGZhbHNlLAogICAgZGVsYXlpbmdCbHVyRXZlbnQ6IGZhbHNlLAogICAgZm9jdXNlZDogZmFsc2UsCiAgICBzdXBwcmVzc0VkaXRzOiBmYWxzZSwgLy8gdXNlZCB0byBkaXNhYmxlIGVkaXRpbmcgZHVyaW5nIGtleSBoYW5kbGVycyB3aGVuIGluIHJlYWRPbmx5IG1vZGUKICAgIHBhc3RlSW5jb21pbmc6IGZhbHNlLCBjdXRJbmNvbWluZzogZmFsc2UsIC8vIGhlbHAgcmVjb2duaXplIHBhc3RlL2N1dCBlZGl0cyBpbiBpbnB1dC5wb2xsCiAgICBzZWxlY3RpbmdUZXh0OiBmYWxzZSwKICAgIGRyYWdnaW5nVGV4dDogZmFsc2UsCiAgICBoaWdobGlnaHQ6IG5ldyBEZWxheWVkKCksIC8vIHN0b3JlcyBoaWdobGlnaHQgd29ya2VyIHRpbWVvdXQKICAgIGtleVNlcTogbnVsbCwgIC8vIFVuZmluaXNoZWQga2V5IHNlcXVlbmNlCiAgICBzcGVjaWFsQ2hhcnM6IG51bGwKICB9CgogIC8vIE92ZXJyaWRlIG1hZ2ljIHRleHRhcmVhIGNvbnRlbnQgcmVzdG9yZSB0aGF0IElFIHNvbWV0aW1lcyBkb2VzCiAgLy8gb24gb3VyIGhpZGRlbiB0ZXh0YXJlYSBvbiByZWxvYWQKICBpZiAoaWUgJiYgaWVfdmVyc2lvbiA8IDExKSB7IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcyQxLmRpc3BsYXkuaW5wdXQucmVzZXQodHJ1ZSk7IH0sIDIwKSB9CgogIHJlZ2lzdGVyRXZlbnRIYW5kbGVycyh0aGlzKQogIGVuc3VyZUdsb2JhbEhhbmRsZXJzKCkKCiAgc3RhcnRPcGVyYXRpb24odGhpcykKICB0aGlzLmN1ck9wLmZvcmNlVXBkYXRlID0gdHJ1ZQogIGF0dGFjaERvYyh0aGlzLCBkb2MpCgogIGlmICgob3B0aW9ucy5hdXRvZm9jdXMgJiYgIW1vYmlsZSkgfHwgdGhpcy5oYXNGb2N1cygpKQogICAgeyBzZXRUaW1lb3V0KGJpbmQob25Gb2N1cywgdGhpcyksIDIwKSB9CiAgZWxzZQogICAgeyBvbkJsdXIodGhpcykgfQoKICBmb3IgKHZhciBvcHQgaW4gb3B0aW9uSGFuZGxlcnMpIHsgaWYgKG9wdGlvbkhhbmRsZXJzLmhhc093blByb3BlcnR5KG9wdCkpCiAgICB7IG9wdGlvbkhhbmRsZXJzW29wdF0odGhpcyQxLCBvcHRpb25zW29wdF0sIEluaXQpIH0gfQogIG1heWJlVXBkYXRlTGluZU51bWJlcldpZHRoKHRoaXMpCiAgaWYgKG9wdGlvbnMuZmluaXNoSW5pdCkgeyBvcHRpb25zLmZpbmlzaEluaXQodGhpcykgfQogIGZvciAodmFyIGkgPSAwOyBpIDwgaW5pdEhvb2tzLmxlbmd0aDsgKytpKSB7IGluaXRIb29rc1tpXSh0aGlzJDEpIH0KICBlbmRPcGVyYXRpb24odGhpcykKICAvLyBTdXBwcmVzcyBvcHRpbWl6ZWxlZ2liaWxpdHkgaW4gV2Via2l0LCBzaW5jZSBpdCBicmVha3MgdGV4dAogIC8vIG1lYXN1cmluZyBvbiBsaW5lIHdyYXBwaW5nIGJvdW5kYXJpZXMuCiAgaWYgKHdlYmtpdCAmJiBvcHRpb25zLmxpbmVXcmFwcGluZyAmJgogICAgICBnZXRDb21wdXRlZFN0eWxlKGRpc3BsYXkubGluZURpdikudGV4dFJlbmRlcmluZyA9PSAib3B0aW1pemVsZWdpYmlsaXR5IikKICAgIHsgZGlzcGxheS5saW5lRGl2LnN0eWxlLnRleHRSZW5kZXJpbmcgPSAiYXV0byIgfQp9CgovLyBUaGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIG9wdGlvbnMuCkNvZGVNaXJyb3IkMS5kZWZhdWx0cyA9IGRlZmF1bHRzCi8vIEZ1bmN0aW9ucyB0byBydW4gd2hlbiBvcHRpb25zIGFyZSBjaGFuZ2VkLgpDb2RlTWlycm9yJDEub3B0aW9uSGFuZGxlcnMgPSBvcHRpb25IYW5kbGVycwoKLy8gQXR0YWNoIHRoZSBuZWNlc3NhcnkgZXZlbnQgaGFuZGxlcnMgd2hlbiBpbml0aWFsaXppbmcgdGhlIGVkaXRvcgpmdW5jdGlvbiByZWdpc3RlckV2ZW50SGFuZGxlcnMoY20pIHsKICB2YXIgZCA9IGNtLmRpc3BsYXkKICBvbihkLnNjcm9sbGVyLCAibW91c2Vkb3duIiwgb3BlcmF0aW9uKGNtLCBvbk1vdXNlRG93bikpCiAgLy8gT2xkZXIgSUUncyB3aWxsIG5vdCBmaXJlIGEgc2Vjb25kIG1vdXNlZG93biBmb3IgYSBkb3VibGUgY2xpY2sKICBpZiAoaWUgJiYgaWVfdmVyc2lvbiA8IDExKQogICAgeyBvbihkLnNjcm9sbGVyLCAiZGJsY2xpY2siLCBvcGVyYXRpb24oY20sIGZ1bmN0aW9uIChlKSB7CiAgICAgIGlmIChzaWduYWxET01FdmVudChjbSwgZSkpIHsgcmV0dXJuIH0KICAgICAgdmFyIHBvcyA9IHBvc0Zyb21Nb3VzZShjbSwgZSkKICAgICAgaWYgKCFwb3MgfHwgY2xpY2tJbkd1dHRlcihjbSwgZSkgfHwgZXZlbnRJbldpZGdldChjbS5kaXNwbGF5LCBlKSkgeyByZXR1cm4gfQogICAgICBlX3ByZXZlbnREZWZhdWx0KGUpCiAgICAgIHZhciB3b3JkID0gY20uZmluZFdvcmRBdChwb3MpCiAgICAgIGV4dGVuZFNlbGVjdGlvbihjbS5kb2MsIHdvcmQuYW5jaG9yLCB3b3JkLmhlYWQpCiAgICB9KSkgfQogIGVsc2UKICAgIHsgb24oZC5zY3JvbGxlciwgImRibGNsaWNrIiwgZnVuY3Rpb24gKGUpIHsgcmV0dXJuIHNpZ25hbERPTUV2ZW50KGNtLCBlKSB8fCBlX3ByZXZlbnREZWZhdWx0KGUpOyB9KSB9CiAgLy8gU29tZSBicm93c2VycyBmaXJlIGNvbnRleHRtZW51ICphZnRlciogb3BlbmluZyB0aGUgbWVudSwgYXQKICAvLyB3aGljaCBwb2ludCB3ZSBjYW4ndCBtZXNzIHdpdGggaXQgYW55bW9yZS4gQ29udGV4dCBtZW51IGlzCiAgLy8gaGFuZGxlZCBpbiBvbk1vdXNlRG93biBmb3IgdGhlc2UgYnJvd3NlcnMuCiAgaWYgKCFjYXB0dXJlUmlnaHRDbGljaykgeyBvbihkLnNjcm9sbGVyLCAiY29udGV4dG1lbnUiLCBmdW5jdGlvbiAoZSkgeyByZXR1cm4gb25Db250ZXh0TWVudShjbSwgZSk7IH0pIH0KCiAgLy8gVXNlZCB0byBzdXBwcmVzcyBtb3VzZSBldmVudCBoYW5kbGluZyB3aGVuIGEgdG91Y2ggaGFwcGVucwogIHZhciB0b3VjaEZpbmlzaGVkLCBwcmV2VG91Y2ggPSB7ZW5kOiAwfQogIGZ1bmN0aW9uIGZpbmlzaFRvdWNoKCkgewogICAgaWYgKGQuYWN0aXZlVG91Y2gpIHsKICAgICAgdG91Y2hGaW5pc2hlZCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyByZXR1cm4gZC5hY3RpdmVUb3VjaCA9IG51bGw7IH0sIDEwMDApCiAgICAgIHByZXZUb3VjaCA9IGQuYWN0aXZlVG91Y2gKICAgICAgcHJldlRvdWNoLmVuZCA9ICtuZXcgRGF0ZQogICAgfQogIH0KICBmdW5jdGlvbiBpc01vdXNlTGlrZVRvdWNoRXZlbnQoZSkgewogICAgaWYgKGUudG91Y2hlcy5sZW5ndGggIT0gMSkgeyByZXR1cm4gZmFsc2UgfQogICAgdmFyIHRvdWNoID0gZS50b3VjaGVzWzBdCiAgICByZXR1cm4gdG91Y2gucmFkaXVzWCA8PSAxICYmIHRvdWNoLnJhZGl1c1kgPD0gMQogIH0KICBmdW5jdGlvbiBmYXJBd2F5KHRvdWNoLCBvdGhlcikgewogICAgaWYgKG90aGVyLmxlZnQgPT0gbnVsbCkgeyByZXR1cm4gdHJ1ZSB9CiAgICB2YXIgZHggPSBvdGhlci5sZWZ0IC0gdG91Y2gubGVmdCwgZHkgPSBvdGhlci50b3AgLSB0b3VjaC50b3AKICAgIHJldHVybiBkeCAqIGR4ICsgZHkgKiBkeSA+IDIwICogMjAKICB9CiAgb24oZC5zY3JvbGxlciwgInRvdWNoc3RhcnQiLCBmdW5jdGlvbiAoZSkgewogICAgaWYgKCFzaWduYWxET01FdmVudChjbSwgZSkgJiYgIWlzTW91c2VMaWtlVG91Y2hFdmVudChlKSkgewogICAgICBjbGVhclRpbWVvdXQodG91Y2hGaW5pc2hlZCkKICAgICAgdmFyIG5vdyA9ICtuZXcgRGF0ZQogICAgICBkLmFjdGl2ZVRvdWNoID0ge3N0YXJ0OiBub3csIG1vdmVkOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICBwcmV2OiBub3cgLSBwcmV2VG91Y2guZW5kIDw9IDMwMCA/IHByZXZUb3VjaCA6IG51bGx9CiAgICAgIGlmIChlLnRvdWNoZXMubGVuZ3RoID09IDEpIHsKICAgICAgICBkLmFjdGl2ZVRvdWNoLmxlZnQgPSBlLnRvdWNoZXNbMF0ucGFnZVgKICAgICAgICBkLmFjdGl2ZVRvdWNoLnRvcCA9IGUudG91Y2hlc1swXS5wYWdlWQogICAgICB9CiAgICB9CiAgfSkKICBvbihkLnNjcm9sbGVyLCAidG91Y2htb3ZlIiwgZnVuY3Rpb24gKCkgewogICAgaWYgKGQuYWN0aXZlVG91Y2gpIHsgZC5hY3RpdmVUb3VjaC5tb3ZlZCA9IHRydWUgfQogIH0pCiAgb24oZC5zY3JvbGxlciwgInRvdWNoZW5kIiwgZnVuY3Rpb24gKGUpIHsKICAgIHZhciB0b3VjaCA9IGQuYWN0aXZlVG91Y2gKICAgIGlmICh0b3VjaCAmJiAhZXZlbnRJbldpZGdldChkLCBlKSAmJiB0b3VjaC5sZWZ0ICE9IG51bGwgJiYKICAgICAgICAhdG91Y2gubW92ZWQgJiYgbmV3IERhdGUgLSB0b3VjaC5zdGFydCA8IDMwMCkgewogICAgICB2YXIgcG9zID0gY20uY29vcmRzQ2hhcihkLmFjdGl2ZVRvdWNoLCAicGFnZSIpLCByYW5nZQogICAgICBpZiAoIXRvdWNoLnByZXYgfHwgZmFyQXdheSh0b3VjaCwgdG91Y2gucHJldikpIC8vIFNpbmdsZSB0YXAKICAgICAgICB7IHJhbmdlID0gbmV3IFJhbmdlKHBvcywgcG9zKSB9CiAgICAgIGVsc2UgaWYgKCF0b3VjaC5wcmV2LnByZXYgfHwgZmFyQXdheSh0b3VjaCwgdG91Y2gucHJldi5wcmV2KSkgLy8gRG91YmxlIHRhcAogICAgICAgIHsgcmFuZ2UgPSBjbS5maW5kV29yZEF0KHBvcykgfQogICAgICBlbHNlIC8vIFRyaXBsZSB0YXAKICAgICAgICB7IHJhbmdlID0gbmV3IFJhbmdlKFBvcyhwb3MubGluZSwgMCksIGNsaXBQb3MoY20uZG9jLCBQb3MocG9zLmxpbmUgKyAxLCAwKSkpIH0KICAgICAgY20uc2V0U2VsZWN0aW9uKHJhbmdlLmFuY2hvciwgcmFuZ2UuaGVhZCkKICAgICAgY20uZm9jdXMoKQogICAgICBlX3ByZXZlbnREZWZhdWx0KGUpCiAgICB9CiAgICBmaW5pc2hUb3VjaCgpCiAgfSkKICBvbihkLnNjcm9sbGVyLCAidG91Y2hjYW5jZWwiLCBmaW5pc2hUb3VjaCkKCiAgLy8gU3luYyBzY3JvbGxpbmcgYmV0d2VlbiBmYWtlIHNjcm9sbGJhcnMgYW5kIHJlYWwgc2Nyb2xsYWJsZQogIC8vIGFyZWEsIGVuc3VyZSB2aWV3cG9ydCBpcyB1cGRhdGVkIHdoZW4gc2Nyb2xsaW5nLgogIG9uKGQuc2Nyb2xsZXIsICJzY3JvbGwiLCBmdW5jdGlvbiAoKSB7CiAgICBpZiAoZC5zY3JvbGxlci5jbGllbnRIZWlnaHQpIHsKICAgICAgc2V0U2Nyb2xsVG9wKGNtLCBkLnNjcm9sbGVyLnNjcm9sbFRvcCkKICAgICAgc2V0U2Nyb2xsTGVmdChjbSwgZC5zY3JvbGxlci5zY3JvbGxMZWZ0LCB0cnVlKQogICAgICBzaWduYWwoY20sICJzY3JvbGwiLCBjbSkKICAgIH0KICB9KQoKICAvLyBMaXN0ZW4gdG8gd2hlZWwgZXZlbnRzIGluIG9yZGVyIHRvIHRyeSBhbmQgdXBkYXRlIHRoZSB2aWV3cG9ydCBvbiB0aW1lLgogIG9uKGQuc2Nyb2xsZXIsICJtb3VzZXdoZWVsIiwgZnVuY3Rpb24gKGUpIHsgcmV0dXJuIG9uU2Nyb2xsV2hlZWwoY20sIGUpOyB9KQogIG9uKGQuc2Nyb2xsZXIsICJET01Nb3VzZVNjcm9sbCIsIGZ1bmN0aW9uIChlKSB7IHJldHVybiBvblNjcm9sbFdoZWVsKGNtLCBlKTsgfSkKCiAgLy8gUHJldmVudCB3cmFwcGVyIGZyb20gZXZlciBzY3JvbGxpbmcKICBvbihkLndyYXBwZXIsICJzY3JvbGwiLCBmdW5jdGlvbiAoKSB7IHJldHVybiBkLndyYXBwZXIuc2Nyb2xsVG9wID0gZC53cmFwcGVyLnNjcm9sbExlZnQgPSAwOyB9KQoKICBkLmRyYWdGdW5jdGlvbnMgPSB7CiAgICBlbnRlcjogZnVuY3Rpb24gKGUpIHtpZiAoIXNpZ25hbERPTUV2ZW50KGNtLCBlKSkgeyBlX3N0b3AoZSkgfX0sCiAgICBvdmVyOiBmdW5jdGlvbiAoZSkge2lmICghc2lnbmFsRE9NRXZlbnQoY20sIGUpKSB7IG9uRHJhZ092ZXIoY20sIGUpOyBlX3N0b3AoZSkgfX0sCiAgICBzdGFydDogZnVuY3Rpb24gKGUpIHsgcmV0dXJuIG9uRHJhZ1N0YXJ0KGNtLCBlKTsgfSwKICAgIGRyb3A6IG9wZXJhdGlvbihjbSwgb25Ecm9wKSwKICAgIGxlYXZlOiBmdW5jdGlvbiAoZSkge2lmICghc2lnbmFsRE9NRXZlbnQoY20sIGUpKSB7IGNsZWFyRHJhZ0N1cnNvcihjbSkgfX0KICB9CgogIHZhciBpbnAgPSBkLmlucHV0LmdldEZpZWxkKCkKICBvbihpbnAsICJrZXl1cCIsIGZ1bmN0aW9uIChlKSB7IHJldHVybiBvbktleVVwLmNhbGwoY20sIGUpOyB9KQogIG9uKGlucCwgImtleWRvd24iLCBvcGVyYXRpb24oY20sIG9uS2V5RG93bikpCiAgb24oaW5wLCAia2V5cHJlc3MiLCBvcGVyYXRpb24oY20sIG9uS2V5UHJlc3MpKQogIG9uKGlucCwgImZvY3VzIiwgZnVuY3Rpb24gKGUpIHsgcmV0dXJuIG9uRm9jdXMoY20sIGUpOyB9KQogIG9uKGlucCwgImJsdXIiLCBmdW5jdGlvbiAoZSkgeyByZXR1cm4gb25CbHVyKGNtLCBlKTsgfSkKfQoKdmFyIGluaXRIb29rcyA9IFtdCkNvZGVNaXJyb3IkMS5kZWZpbmVJbml0SG9vayA9IGZ1bmN0aW9uIChmKSB7IHJldHVybiBpbml0SG9va3MucHVzaChmKTsgfQoKLy8gSW5kZW50IHRoZSBnaXZlbiBsaW5lLiBUaGUgaG93IHBhcmFtZXRlciBjYW4gYmUgInNtYXJ0IiwKLy8gImFkZCIvbnVsbCwgInN1YnRyYWN0Iiwgb3IgInByZXYiLiBXaGVuIGFnZ3Jlc3NpdmUgaXMgZmFsc2UKLy8gKHR5cGljYWxseSBzZXQgdG8gdHJ1ZSBmb3IgZm9yY2VkIHNpbmdsZS1saW5lIGluZGVudHMpLCBlbXB0eQovLyBsaW5lcyBhcmUgbm90IGluZGVudGVkLCBhbmQgcGxhY2VzIHdoZXJlIHRoZSBtb2RlIHJldHVybnMgUGFzcwovLyBhcmUgbGVmdCBhbG9uZS4KZnVuY3Rpb24gaW5kZW50TGluZShjbSwgbiwgaG93LCBhZ2dyZXNzaXZlKSB7CiAgdmFyIGRvYyA9IGNtLmRvYywgc3RhdGUKICBpZiAoaG93ID09IG51bGwpIHsgaG93ID0gImFkZCIgfQogIGlmIChob3cgPT0gInNtYXJ0IikgewogICAgLy8gRmFsbCBiYWNrIHRvICJwcmV2IiB3aGVuIHRoZSBtb2RlIGRvZXNuJ3QgaGF2ZSBhbiBpbmRlbnRhdGlvbgogICAgLy8gbWV0aG9kLgogICAgaWYgKCFkb2MubW9kZS5pbmRlbnQpIHsgaG93ID0gInByZXYiIH0KICAgIGVsc2UgeyBzdGF0ZSA9IGdldFN0YXRlQmVmb3JlKGNtLCBuKSB9CiAgfQoKICB2YXIgdGFiU2l6ZSA9IGNtLm9wdGlvbnMudGFiU2l6ZQogIHZhciBsaW5lID0gZ2V0TGluZShkb2MsIG4pLCBjdXJTcGFjZSA9IGNvdW50Q29sdW1uKGxpbmUudGV4dCwgbnVsbCwgdGFiU2l6ZSkKICBpZiAobGluZS5zdGF0ZUFmdGVyKSB7IGxpbmUuc3RhdGVBZnRlciA9IG51bGwgfQogIHZhciBjdXJTcGFjZVN0cmluZyA9IGxpbmUudGV4dC5tYXRjaCgvXlxzKi8pWzBdLCBpbmRlbnRhdGlvbgogIGlmICghYWdncmVzc2l2ZSAmJiAhL1xTLy50ZXN0KGxpbmUudGV4dCkpIHsKICAgIGluZGVudGF0aW9uID0gMAogICAgaG93ID0gIm5vdCIKICB9IGVsc2UgaWYgKGhvdyA9PSAic21hcnQiKSB7CiAgICBpbmRlbnRhdGlvbiA9IGRvYy5tb2RlLmluZGVudChzdGF0ZSwgbGluZS50ZXh0LnNsaWNlKGN1clNwYWNlU3RyaW5nLmxlbmd0aCksIGxpbmUudGV4dCkKICAgIGlmIChpbmRlbnRhdGlvbiA9PSBQYXNzIHx8IGluZGVudGF0aW9uID4gMTUwKSB7CiAgICAgIGlmICghYWdncmVzc2l2ZSkgeyByZXR1cm4gfQogICAgICBob3cgPSAicHJldiIKICAgIH0KICB9CiAgaWYgKGhvdyA9PSAicHJldiIpIHsKICAgIGlmIChuID4gZG9jLmZpcnN0KSB7IGluZGVudGF0aW9uID0gY291bnRDb2x1bW4oZ2V0TGluZShkb2MsIG4tMSkudGV4dCwgbnVsbCwgdGFiU2l6ZSkgfQogICAgZWxzZSB7IGluZGVudGF0aW9uID0gMCB9CiAgfSBlbHNlIGlmIChob3cgPT0gImFkZCIpIHsKICAgIGluZGVudGF0aW9uID0gY3VyU3BhY2UgKyBjbS5vcHRpb25zLmluZGVudFVuaXQKICB9IGVsc2UgaWYgKGhvdyA9PSAic3VidHJhY3QiKSB7CiAgICBpbmRlbnRhdGlvbiA9IGN1clNwYWNlIC0gY20ub3B0aW9ucy5pbmRlbnRVbml0CiAgfSBlbHNlIGlmICh0eXBlb2YgaG93ID09ICJudW1iZXIiKSB7CiAgICBpbmRlbnRhdGlvbiA9IGN1clNwYWNlICsgaG93CiAgfQogIGluZGVudGF0aW9uID0gTWF0aC5tYXgoMCwgaW5kZW50YXRpb24pCgogIHZhciBpbmRlbnRTdHJpbmcgPSAiIiwgcG9zID0gMAogIGlmIChjbS5vcHRpb25zLmluZGVudFdpdGhUYWJzKQogICAgeyBmb3IgKHZhciBpID0gTWF0aC5mbG9vcihpbmRlbnRhdGlvbiAvIHRhYlNpemUpOyBpOyAtLWkpIHtwb3MgKz0gdGFiU2l6ZTsgaW5kZW50U3RyaW5nICs9ICJcdCJ9IH0KICBpZiAocG9zIDwgaW5kZW50YXRpb24pIHsgaW5kZW50U3RyaW5nICs9IHNwYWNlU3RyKGluZGVudGF0aW9uIC0gcG9zKSB9CgogIGlmIChpbmRlbnRTdHJpbmcgIT0gY3VyU3BhY2VTdHJpbmcpIHsKICAgIHJlcGxhY2VSYW5nZShkb2MsIGluZGVudFN0cmluZywgUG9zKG4sIDApLCBQb3MobiwgY3VyU3BhY2VTdHJpbmcubGVuZ3RoKSwgIitpbnB1dCIpCiAgICBsaW5lLnN0YXRlQWZ0ZXIgPSBudWxsCiAgICByZXR1cm4gdHJ1ZQogIH0gZWxzZSB7CiAgICAvLyBFbnN1cmUgdGhhdCwgaWYgdGhlIGN1cnNvciB3YXMgaW4gdGhlIHdoaXRlc3BhY2UgYXQgdGhlIHN0YXJ0CiAgICAvLyBvZiB0aGUgbGluZSwgaXQgaXMgbW92ZWQgdG8gdGhlIGVuZCBvZiB0aGF0IHNwYWNlLgogICAgZm9yICh2YXIgaSQxID0gMDsgaSQxIDwgZG9jLnNlbC5yYW5nZXMubGVuZ3RoOyBpJDErKykgewogICAgICB2YXIgcmFuZ2UgPSBkb2Muc2VsLnJhbmdlc1tpJDFdCiAgICAgIGlmIChyYW5nZS5oZWFkLmxpbmUgPT0gbiAmJiByYW5nZS5oZWFkLmNoIDwgY3VyU3BhY2VTdHJpbmcubGVuZ3RoKSB7CiAgICAgICAgdmFyIHBvcyQxID0gUG9zKG4sIGN1clNwYWNlU3RyaW5nLmxlbmd0aCkKICAgICAgICByZXBsYWNlT25lU2VsZWN0aW9uKGRvYywgaSQxLCBuZXcgUmFuZ2UocG9zJDEsIHBvcyQxKSkKICAgICAgICBicmVhawogICAgICB9CiAgICB9CiAgfQp9CgovLyBUaGlzIHdpbGwgYmUgc2V0IHRvIGEge2xpbmVXaXNlOiBib29sLCB0ZXh0OiBbc3RyaW5nXX0gb2JqZWN0LCBzbwovLyB0aGF0LCB3aGVuIHBhc3RpbmcsIHdlIGtub3cgd2hhdCBraW5kIG9mIHNlbGVjdGlvbnMgdGhlIGNvcGllZAovLyB0ZXh0IHdhcyBtYWRlIG91dCBvZi4KdmFyIGxhc3RDb3BpZWQgPSBudWxsCgpmdW5jdGlvbiBzZXRMYXN0Q29waWVkKG5ld0xhc3RDb3BpZWQpIHsKICBsYXN0Q29waWVkID0gbmV3TGFzdENvcGllZAp9CgpmdW5jdGlvbiBhcHBseVRleHRJbnB1dChjbSwgaW5zZXJ0ZWQsIGRlbGV0ZWQsIHNlbCwgb3JpZ2luKSB7CiAgdmFyIGRvYyA9IGNtLmRvYwogIGNtLmRpc3BsYXkuc2hpZnQgPSBmYWxzZQogIGlmICghc2VsKSB7IHNlbCA9IGRvYy5zZWwgfQoKICB2YXIgcGFzdGUgPSBjbS5zdGF0ZS5wYXN0ZUluY29taW5nIHx8IG9yaWdpbiA9PSAicGFzdGUiCiAgdmFyIHRleHRMaW5lcyA9IHNwbGl0TGluZXNBdXRvKGluc2VydGVkKSwgbXVsdGlQYXN0ZSA9IG51bGwKICAvLyBXaGVuIHBhc2luZyBOIGxpbmVzIGludG8gTiBzZWxlY3Rpb25zLCBpbnNlcnQgb25lIGxpbmUgcGVyIHNlbGVjdGlvbgogIGlmIChwYXN0ZSAmJiBzZWwucmFuZ2VzLmxlbmd0aCA+IDEpIHsKICAgIGlmIChsYXN0Q29waWVkICYmIGxhc3RDb3BpZWQudGV4dC5qb2luKCJcbiIpID09IGluc2VydGVkKSB7CiAgICAgIGlmIChzZWwucmFuZ2VzLmxlbmd0aCAlIGxhc3RDb3BpZWQudGV4dC5sZW5ndGggPT0gMCkgewogICAgICAgIG11bHRpUGFzdGUgPSBbXQogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGFzdENvcGllZC50ZXh0Lmxlbmd0aDsgaSsrKQogICAgICAgICAgeyBtdWx0aVBhc3RlLnB1c2goZG9jLnNwbGl0TGluZXMobGFzdENvcGllZC50ZXh0W2ldKSkgfQogICAgICB9CiAgICB9IGVsc2UgaWYgKHRleHRMaW5lcy5sZW5ndGggPT0gc2VsLnJhbmdlcy5sZW5ndGgpIHsKICAgICAgbXVsdGlQYXN0ZSA9IG1hcCh0ZXh0TGluZXMsIGZ1bmN0aW9uIChsKSB7IHJldHVybiBbbF07IH0pCiAgICB9CiAgfQoKICB2YXIgdXBkYXRlSW5wdXQKICAvLyBOb3JtYWwgYmVoYXZpb3IgaXMgdG8gaW5zZXJ0IHRoZSBuZXcgdGV4dCBpbnRvIGV2ZXJ5IHNlbGVjdGlvbgogIGZvciAodmFyIGkkMSA9IHNlbC5yYW5nZXMubGVuZ3RoIC0gMTsgaSQxID49IDA7IGkkMS0tKSB7CiAgICB2YXIgcmFuZ2UkJDEgPSBzZWwucmFuZ2VzW2kkMV0KICAgIHZhciBmcm9tID0gcmFuZ2UkJDEuZnJvbSgpLCB0byA9IHJhbmdlJCQxLnRvKCkKICAgIGlmIChyYW5nZSQkMS5lbXB0eSgpKSB7CiAgICAgIGlmIChkZWxldGVkICYmIGRlbGV0ZWQgPiAwKSAvLyBIYW5kbGUgZGVsZXRpb24KICAgICAgICB7IGZyb20gPSBQb3MoZnJvbS5saW5lLCBmcm9tLmNoIC0gZGVsZXRlZCkgfQogICAgICBlbHNlIGlmIChjbS5zdGF0ZS5vdmVyd3JpdGUgJiYgIXBhc3RlKSAvLyBIYW5kbGUgb3ZlcndyaXRlCiAgICAgICAgeyB0byA9IFBvcyh0by5saW5lLCBNYXRoLm1pbihnZXRMaW5lKGRvYywgdG8ubGluZSkudGV4dC5sZW5ndGgsIHRvLmNoICsgbHN0KHRleHRMaW5lcykubGVuZ3RoKSkgfQogICAgICBlbHNlIGlmIChsYXN0Q29waWVkICYmIGxhc3RDb3BpZWQubGluZVdpc2UgJiYgbGFzdENvcGllZC50ZXh0LmpvaW4oIlxuIikgPT0gaW5zZXJ0ZWQpCiAgICAgICAgeyBmcm9tID0gdG8gPSBQb3MoZnJvbS5saW5lLCAwKSB9CiAgICB9CiAgICB1cGRhdGVJbnB1dCA9IGNtLmN1ck9wLnVwZGF0ZUlucHV0CiAgICB2YXIgY2hhbmdlRXZlbnQgPSB7ZnJvbTogZnJvbSwgdG86IHRvLCB0ZXh0OiBtdWx0aVBhc3RlID8gbXVsdGlQYXN0ZVtpJDEgJSBtdWx0aVBhc3RlLmxlbmd0aF0gOiB0ZXh0TGluZXMsCiAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luOiBvcmlnaW4gfHwgKHBhc3RlID8gInBhc3RlIiA6IGNtLnN0YXRlLmN1dEluY29taW5nID8gImN1dCIgOiAiK2lucHV0Iil9CiAgICBtYWtlQ2hhbmdlKGNtLmRvYywgY2hhbmdlRXZlbnQpCiAgICBzaWduYWxMYXRlcihjbSwgImlucHV0UmVhZCIsIGNtLCBjaGFuZ2VFdmVudCkKICB9CiAgaWYgKGluc2VydGVkICYmICFwYXN0ZSkKICAgIHsgdHJpZ2dlckVsZWN0cmljKGNtLCBpbnNlcnRlZCkgfQoKICBlbnN1cmVDdXJzb3JWaXNpYmxlKGNtKQogIGNtLmN1ck9wLnVwZGF0ZUlucHV0ID0gdXBkYXRlSW5wdXQKICBjbS5jdXJPcC50eXBpbmcgPSB0cnVlCiAgY20uc3RhdGUucGFzdGVJbmNvbWluZyA9IGNtLnN0YXRlLmN1dEluY29taW5nID0gZmFsc2UKfQoKZnVuY3Rpb24gaGFuZGxlUGFzdGUoZSwgY20pIHsKICB2YXIgcGFzdGVkID0gZS5jbGlwYm9hcmREYXRhICYmIGUuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCJUZXh0IikKICBpZiAocGFzdGVkKSB7CiAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgIGlmICghY20uaXNSZWFkT25seSgpICYmICFjbS5vcHRpb25zLmRpc2FibGVJbnB1dCkKICAgICAgeyBydW5Jbk9wKGNtLCBmdW5jdGlvbiAoKSB7IHJldHVybiBhcHBseVRleHRJbnB1dChjbSwgcGFzdGVkLCAwLCBudWxsLCAicGFzdGUiKTsgfSkgfQogICAgcmV0dXJuIHRydWUKICB9Cn0KCmZ1bmN0aW9uIHRyaWdnZXJFbGVjdHJpYyhjbSwgaW5zZXJ0ZWQpIHsKICAvLyBXaGVuIGFuICdlbGVjdHJpYycgY2hhcmFjdGVyIGlzIGluc2VydGVkLCBpbW1lZGlhdGVseSB0cmlnZ2VyIGEgcmVpbmRlbnQKICBpZiAoIWNtLm9wdGlvbnMuZWxlY3RyaWNDaGFycyB8fCAhY20ub3B0aW9ucy5zbWFydEluZGVudCkgeyByZXR1cm4gfQogIHZhciBzZWwgPSBjbS5kb2Muc2VsCgogIGZvciAodmFyIGkgPSBzZWwucmFuZ2VzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICB2YXIgcmFuZ2UkJDEgPSBzZWwucmFuZ2VzW2ldCiAgICBpZiAocmFuZ2UkJDEuaGVhZC5jaCA+IDEwMCB8fCAoaSAmJiBzZWwucmFuZ2VzW2kgLSAxXS5oZWFkLmxpbmUgPT0gcmFuZ2UkJDEuaGVhZC5saW5lKSkgeyBjb250aW51ZSB9CiAgICB2YXIgbW9kZSA9IGNtLmdldE1vZGVBdChyYW5nZSQkMS5oZWFkKQogICAgdmFyIGluZGVudGVkID0gZmFsc2UKICAgIGlmIChtb2RlLmVsZWN0cmljQ2hhcnMpIHsKICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBtb2RlLmVsZWN0cmljQ2hhcnMubGVuZ3RoOyBqKyspCiAgICAgICAgeyBpZiAoaW5zZXJ0ZWQuaW5kZXhPZihtb2RlLmVsZWN0cmljQ2hhcnMuY2hhckF0KGopKSA+IC0xKSB7CiAgICAgICAgICBpbmRlbnRlZCA9IGluZGVudExpbmUoY20sIHJhbmdlJCQxLmhlYWQubGluZSwgInNtYXJ0IikKICAgICAgICAgIGJyZWFrCiAgICAgICAgfSB9CiAgICB9IGVsc2UgaWYgKG1vZGUuZWxlY3RyaWNJbnB1dCkgewogICAgICBpZiAobW9kZS5lbGVjdHJpY0lucHV0LnRlc3QoZ2V0TGluZShjbS5kb2MsIHJhbmdlJCQxLmhlYWQubGluZSkudGV4dC5zbGljZSgwLCByYW5nZSQkMS5oZWFkLmNoKSkpCiAgICAgICAgeyBpbmRlbnRlZCA9IGluZGVudExpbmUoY20sIHJhbmdlJCQxLmhlYWQubGluZSwgInNtYXJ0IikgfQogICAgfQogICAgaWYgKGluZGVudGVkKSB7IHNpZ25hbExhdGVyKGNtLCAiZWxlY3RyaWNJbnB1dCIsIGNtLCByYW5nZSQkMS5oZWFkLmxpbmUpIH0KICB9Cn0KCmZ1bmN0aW9uIGNvcHlhYmxlUmFuZ2VzKGNtKSB7CiAgdmFyIHRleHQgPSBbXSwgcmFuZ2VzID0gW10KICBmb3IgKHZhciBpID0gMDsgaSA8IGNtLmRvYy5zZWwucmFuZ2VzLmxlbmd0aDsgaSsrKSB7CiAgICB2YXIgbGluZSA9IGNtLmRvYy5zZWwucmFuZ2VzW2ldLmhlYWQubGluZQogICAgdmFyIGxpbmVSYW5nZSA9IHthbmNob3I6IFBvcyhsaW5lLCAwKSwgaGVhZDogUG9zKGxpbmUgKyAxLCAwKX0KICAgIHJhbmdlcy5wdXNoKGxpbmVSYW5nZSkKICAgIHRleHQucHVzaChjbS5nZXRSYW5nZShsaW5lUmFuZ2UuYW5jaG9yLCBsaW5lUmFuZ2UuaGVhZCkpCiAgfQogIHJldHVybiB7dGV4dDogdGV4dCwgcmFuZ2VzOiByYW5nZXN9Cn0KCmZ1bmN0aW9uIGRpc2FibGVCcm93c2VyTWFnaWMoZmllbGQsIHNwZWxsY2hlY2spIHsKICBmaWVsZC5zZXRBdHRyaWJ1dGUoImF1dG9jb3JyZWN0IiwgIm9mZiIpCiAgZmllbGQuc2V0QXR0cmlidXRlKCJhdXRvY2FwaXRhbGl6ZSIsICJvZmYiKQogIGZpZWxkLnNldEF0dHJpYnV0ZSgic3BlbGxjaGVjayIsICEhc3BlbGxjaGVjaykKfQoKZnVuY3Rpb24gaGlkZGVuVGV4dGFyZWEoKSB7CiAgdmFyIHRlID0gZWx0KCJ0ZXh0YXJlYSIsIG51bGwsIG51bGwsICJwb3NpdGlvbjogYWJzb2x1dGU7IGJvdHRvbTogLTFlbTsgcGFkZGluZzogMDsgd2lkdGg6IDFweDsgaGVpZ2h0OiAxZW07IG91dGxpbmU6IG5vbmUiKQogIHZhciBkaXYgPSBlbHQoImRpdiIsIFt0ZV0sIG51bGwsICJvdmVyZmxvdzogaGlkZGVuOyBwb3NpdGlvbjogcmVsYXRpdmU7IHdpZHRoOiAzcHg7IGhlaWdodDogMHB4OyIpCiAgLy8gVGhlIHRleHRhcmVhIGlzIGtlcHQgcG9zaXRpb25lZCBuZWFyIHRoZSBjdXJzb3IgdG8gcHJldmVudCB0aGUKICAvLyBmYWN0IHRoYXQgaXQnbGwgYmUgc2Nyb2xsZWQgaW50byB2aWV3IG9uIGlucHV0IGZyb20gc2Nyb2xsaW5nCiAgLy8gb3VyIGZha2UgY3Vyc29yIG91dCBvZiB2aWV3LiBPbiB3ZWJraXQsIHdoZW4gd3JhcD1vZmYsIHBhc3RlIGlzCiAgLy8gdmVyeSBzbG93LiBTbyBtYWtlIHRoZSBhcmVhIHdpZGUgaW5zdGVhZC4KICBpZiAod2Via2l0KSB7IHRlLnN0eWxlLndpZHRoID0gIjEwMDBweCIgfQogIGVsc2UgeyB0ZS5zZXRBdHRyaWJ1dGUoIndyYXAiLCAib2ZmIikgfQogIC8vIElmIGJvcmRlcjogMDsgLS0gaU9TIGZhaWxzIHRvIG9wZW4ga2V5Ym9hcmQgKGlzc3VlICMxMjg3KQogIGlmIChpb3MpIHsgdGUuc3R5bGUuYm9yZGVyID0gIjFweCBzb2xpZCBibGFjayIgfQogIGRpc2FibGVCcm93c2VyTWFnaWModGUpCiAgcmV0dXJuIGRpdgp9CgovLyBUaGUgcHVibGljbHkgdmlzaWJsZSBBUEkuIE5vdGUgdGhhdCBtZXRob2RPcChmKSBtZWFucwovLyAnd3JhcCBmIGluIGFuIG9wZXJhdGlvbiwgcGVyZm9ybWVkIG9uIGl0cyBgdGhpc2AgcGFyYW1ldGVyJy4KCi8vIFRoaXMgaXMgbm90IHRoZSBjb21wbGV0ZSBzZXQgb2YgZWRpdG9yIG1ldGhvZHMuIE1vc3Qgb2YgdGhlCi8vIG1ldGhvZHMgZGVmaW5lZCBvbiB0aGUgRG9jIHR5cGUgYXJlIGFsc28gaW5qZWN0ZWQgaW50bwovLyBDb2RlTWlycm9yLnByb3RvdHlwZSwgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGFuZAovLyBjb252ZW5pZW5jZS4KCnZhciBhZGRFZGl0b3JNZXRob2RzID0gZnVuY3Rpb24oQ29kZU1pcnJvcikgewogIHZhciBvcHRpb25IYW5kbGVycyA9IENvZGVNaXJyb3Iub3B0aW9uSGFuZGxlcnMKCiAgdmFyIGhlbHBlcnMgPSBDb2RlTWlycm9yLmhlbHBlcnMgPSB7fQoKICBDb2RlTWlycm9yLnByb3RvdHlwZSA9IHsKICAgIGNvbnN0cnVjdG9yOiBDb2RlTWlycm9yLAogICAgZm9jdXM6IGZ1bmN0aW9uKCl7d2luZG93LmZvY3VzKCk7IHRoaXMuZGlzcGxheS5pbnB1dC5mb2N1cygpfSwKCiAgICBzZXRPcHRpb246IGZ1bmN0aW9uKG9wdGlvbiwgdmFsdWUpIHsKICAgICAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMsIG9sZCA9IG9wdGlvbnNbb3B0aW9uXQogICAgICBpZiAob3B0aW9uc1tvcHRpb25dID09IHZhbHVlICYmIG9wdGlvbiAhPSAibW9kZSIpIHsgcmV0dXJuIH0KICAgICAgb3B0aW9uc1tvcHRpb25dID0gdmFsdWUKICAgICAgaWYgKG9wdGlvbkhhbmRsZXJzLmhhc093blByb3BlcnR5KG9wdGlvbikpCiAgICAgICAgeyBvcGVyYXRpb24odGhpcywgb3B0aW9uSGFuZGxlcnNbb3B0aW9uXSkodGhpcywgdmFsdWUsIG9sZCkgfQogICAgfSwKCiAgICBnZXRPcHRpb246IGZ1bmN0aW9uKG9wdGlvbikge3JldHVybiB0aGlzLm9wdGlvbnNbb3B0aW9uXX0sCiAgICBnZXREb2M6IGZ1bmN0aW9uKCkge3JldHVybiB0aGlzLmRvY30sCgogICAgYWRkS2V5TWFwOiBmdW5jdGlvbihtYXAkJDEsIGJvdHRvbSkgewogICAgICB0aGlzLnN0YXRlLmtleU1hcHNbYm90dG9tID8gInB1c2giIDogInVuc2hpZnQiXShnZXRLZXlNYXAobWFwJCQxKSkKICAgIH0sCiAgICByZW1vdmVLZXlNYXA6IGZ1bmN0aW9uKG1hcCQkMSkgewogICAgICB2YXIgbWFwcyA9IHRoaXMuc3RhdGUua2V5TWFwcwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1hcHMubGVuZ3RoOyArK2kpCiAgICAgICAgeyBpZiAobWFwc1tpXSA9PSBtYXAkJDEgfHwgbWFwc1tpXS5uYW1lID09IG1hcCQkMSkgewogICAgICAgICAgbWFwcy5zcGxpY2UoaSwgMSkKICAgICAgICAgIHJldHVybiB0cnVlCiAgICAgICAgfSB9CiAgICB9LAoKICAgIGFkZE92ZXJsYXk6IG1ldGhvZE9wKGZ1bmN0aW9uKHNwZWMsIG9wdGlvbnMpIHsKICAgICAgdmFyIG1vZGUgPSBzcGVjLnRva2VuID8gc3BlYyA6IENvZGVNaXJyb3IuZ2V0TW9kZSh0aGlzLm9wdGlvbnMsIHNwZWMpCiAgICAgIGlmIChtb2RlLnN0YXJ0U3RhdGUpIHsgdGhyb3cgbmV3IEVycm9yKCJPdmVybGF5cyBtYXkgbm90IGJlIHN0YXRlZnVsLiIpIH0KICAgICAgaW5zZXJ0U29ydGVkKHRoaXMuc3RhdGUub3ZlcmxheXMsCiAgICAgICAgICAgICAgICAgICB7bW9kZTogbW9kZSwgbW9kZVNwZWM6IHNwZWMsIG9wYXF1ZTogb3B0aW9ucyAmJiBvcHRpb25zLm9wYXF1ZSwKICAgICAgICAgICAgICAgICAgICBwcmlvcml0eTogKG9wdGlvbnMgJiYgb3B0aW9ucy5wcmlvcml0eSkgfHwgMH0sCiAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAob3ZlcmxheSkgeyByZXR1cm4gb3ZlcmxheS5wcmlvcml0eTsgfSkKICAgICAgdGhpcy5zdGF0ZS5tb2RlR2VuKysKICAgICAgcmVnQ2hhbmdlKHRoaXMpCiAgICB9KSwKICAgIHJlbW92ZU92ZXJsYXk6IG1ldGhvZE9wKGZ1bmN0aW9uKHNwZWMpIHsKICAgICAgdmFyIHRoaXMkMSA9IHRoaXM7CgogICAgICB2YXIgb3ZlcmxheXMgPSB0aGlzLnN0YXRlLm92ZXJsYXlzCiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb3ZlcmxheXMubGVuZ3RoOyArK2kpIHsKICAgICAgICB2YXIgY3VyID0gb3ZlcmxheXNbaV0ubW9kZVNwZWMKICAgICAgICBpZiAoY3VyID09IHNwZWMgfHwgdHlwZW9mIHNwZWMgPT0gInN0cmluZyIgJiYgY3VyLm5hbWUgPT0gc3BlYykgewogICAgICAgICAgb3ZlcmxheXMuc3BsaWNlKGksIDEpCiAgICAgICAgICB0aGlzJDEuc3RhdGUubW9kZUdlbisrCiAgICAgICAgICByZWdDaGFuZ2UodGhpcyQxKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICB9CiAgICB9KSwKCiAgICBpbmRlbnRMaW5lOiBtZXRob2RPcChmdW5jdGlvbihuLCBkaXIsIGFnZ3Jlc3NpdmUpIHsKICAgICAgaWYgKHR5cGVvZiBkaXIgIT0gInN0cmluZyIgJiYgdHlwZW9mIGRpciAhPSAibnVtYmVyIikgewogICAgICAgIGlmIChkaXIgPT0gbnVsbCkgeyBkaXIgPSB0aGlzLm9wdGlvbnMuc21hcnRJbmRlbnQgPyAic21hcnQiIDogInByZXYiIH0KICAgICAgICBlbHNlIHsgZGlyID0gZGlyID8gImFkZCIgOiAic3VidHJhY3QiIH0KICAgICAgfQogICAgICBpZiAoaXNMaW5lKHRoaXMuZG9jLCBuKSkgeyBpbmRlbnRMaW5lKHRoaXMsIG4sIGRpciwgYWdncmVzc2l2ZSkgfQogICAgfSksCiAgICBpbmRlbnRTZWxlY3Rpb246IG1ldGhvZE9wKGZ1bmN0aW9uKGhvdykgewogICAgICB2YXIgdGhpcyQxID0gdGhpczsKCiAgICAgIHZhciByYW5nZXMgPSB0aGlzLmRvYy5zZWwucmFuZ2VzLCBlbmQgPSAtMQogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJhbmdlcy5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciByYW5nZSQkMSA9IHJhbmdlc1tpXQogICAgICAgIGlmICghcmFuZ2UkJDEuZW1wdHkoKSkgewogICAgICAgICAgdmFyIGZyb20gPSByYW5nZSQkMS5mcm9tKCksIHRvID0gcmFuZ2UkJDEudG8oKQogICAgICAgICAgdmFyIHN0YXJ0ID0gTWF0aC5tYXgoZW5kLCBmcm9tLmxpbmUpCiAgICAgICAgICBlbmQgPSBNYXRoLm1pbih0aGlzJDEubGFzdExpbmUoKSwgdG8ubGluZSAtICh0by5jaCA/IDAgOiAxKSkgKyAxCiAgICAgICAgICBmb3IgKHZhciBqID0gc3RhcnQ7IGogPCBlbmQ7ICsraikKICAgICAgICAgICAgeyBpbmRlbnRMaW5lKHRoaXMkMSwgaiwgaG93KSB9CiAgICAgICAgICB2YXIgbmV3UmFuZ2VzID0gdGhpcyQxLmRvYy5zZWwucmFuZ2VzCiAgICAgICAgICBpZiAoZnJvbS5jaCA9PSAwICYmIHJhbmdlcy5sZW5ndGggPT0gbmV3UmFuZ2VzLmxlbmd0aCAmJiBuZXdSYW5nZXNbaV0uZnJvbSgpLmNoID4gMCkKICAgICAgICAgICAgeyByZXBsYWNlT25lU2VsZWN0aW9uKHRoaXMkMS5kb2MsIGksIG5ldyBSYW5nZShmcm9tLCBuZXdSYW5nZXNbaV0udG8oKSksIHNlbF9kb250U2Nyb2xsKSB9CiAgICAgICAgfSBlbHNlIGlmIChyYW5nZSQkMS5oZWFkLmxpbmUgPiBlbmQpIHsKICAgICAgICAgIGluZGVudExpbmUodGhpcyQxLCByYW5nZSQkMS5oZWFkLmxpbmUsIGhvdywgdHJ1ZSkKICAgICAgICAgIGVuZCA9IHJhbmdlJCQxLmhlYWQubGluZQogICAgICAgICAgaWYgKGkgPT0gdGhpcyQxLmRvYy5zZWwucHJpbUluZGV4KSB7IGVuc3VyZUN1cnNvclZpc2libGUodGhpcyQxKSB9CiAgICAgICAgfQogICAgICB9CiAgICB9KSwKCiAgICAvLyBGZXRjaCB0aGUgcGFyc2VyIHRva2VuIGZvciBhIGdpdmVuIGNoYXJhY3Rlci4gVXNlZnVsIGZvciBoYWNrcwogICAgLy8gdGhhdCB3YW50IHRvIGluc3BlY3QgdGhlIG1vZGUgc3RhdGUgKHNheSwgZm9yIGNvbXBsZXRpb24pLgogICAgZ2V0VG9rZW5BdDogZnVuY3Rpb24ocG9zLCBwcmVjaXNlKSB7CiAgICAgIHJldHVybiB0YWtlVG9rZW4odGhpcywgcG9zLCBwcmVjaXNlKQogICAgfSwKCiAgICBnZXRMaW5lVG9rZW5zOiBmdW5jdGlvbihsaW5lLCBwcmVjaXNlKSB7CiAgICAgIHJldHVybiB0YWtlVG9rZW4odGhpcywgUG9zKGxpbmUpLCBwcmVjaXNlLCB0cnVlKQogICAgfSwKCiAgICBnZXRUb2tlblR5cGVBdDogZnVuY3Rpb24ocG9zKSB7CiAgICAgIHBvcyA9IGNsaXBQb3ModGhpcy5kb2MsIHBvcykKICAgICAgdmFyIHN0eWxlcyA9IGdldExpbmVTdHlsZXModGhpcywgZ2V0TGluZSh0aGlzLmRvYywgcG9zLmxpbmUpKQogICAgICB2YXIgYmVmb3JlID0gMCwgYWZ0ZXIgPSAoc3R5bGVzLmxlbmd0aCAtIDEpIC8gMiwgY2ggPSBwb3MuY2gKICAgICAgdmFyIHR5cGUKICAgICAgaWYgKGNoID09IDApIHsgdHlwZSA9IHN0eWxlc1syXSB9CiAgICAgIGVsc2UgeyBmb3IgKDs7KSB7CiAgICAgICAgdmFyIG1pZCA9IChiZWZvcmUgKyBhZnRlcikgPj4gMQogICAgICAgIGlmICgobWlkID8gc3R5bGVzW21pZCAqIDIgLSAxXSA6IDApID49IGNoKSB7IGFmdGVyID0gbWlkIH0KICAgICAgICBlbHNlIGlmIChzdHlsZXNbbWlkICogMiArIDFdIDwgY2gpIHsgYmVmb3JlID0gbWlkICsgMSB9CiAgICAgICAgZWxzZSB7IHR5cGUgPSBzdHlsZXNbbWlkICogMiArIDJdOyBicmVhayB9CiAgICAgIH0gfQogICAgICB2YXIgY3V0ID0gdHlwZSA/IHR5cGUuaW5kZXhPZigib3ZlcmxheSAiKSA6IC0xCiAgICAgIHJldHVybiBjdXQgPCAwID8gdHlwZSA6IGN1dCA9PSAwID8gbnVsbCA6IHR5cGUuc2xpY2UoMCwgY3V0IC0gMSkKICAgIH0sCgogICAgZ2V0TW9kZUF0OiBmdW5jdGlvbihwb3MpIHsKICAgICAgdmFyIG1vZGUgPSB0aGlzLmRvYy5tb2RlCiAgICAgIGlmICghbW9kZS5pbm5lck1vZGUpIHsgcmV0dXJuIG1vZGUgfQogICAgICByZXR1cm4gQ29kZU1pcnJvci5pbm5lck1vZGUobW9kZSwgdGhpcy5nZXRUb2tlbkF0KHBvcykuc3RhdGUpLm1vZGUKICAgIH0sCgogICAgZ2V0SGVscGVyOiBmdW5jdGlvbihwb3MsIHR5cGUpIHsKICAgICAgcmV0dXJuIHRoaXMuZ2V0SGVscGVycyhwb3MsIHR5cGUpWzBdCiAgICB9LAoKICAgIGdldEhlbHBlcnM6IGZ1bmN0aW9uKHBvcywgdHlwZSkgewogICAgICB2YXIgdGhpcyQxID0gdGhpczsKCiAgICAgIHZhciBmb3VuZCA9IFtdCiAgICAgIGlmICghaGVscGVycy5oYXNPd25Qcm9wZXJ0eSh0eXBlKSkgeyByZXR1cm4gZm91bmQgfQogICAgICB2YXIgaGVscCA9IGhlbHBlcnNbdHlwZV0sIG1vZGUgPSB0aGlzLmdldE1vZGVBdChwb3MpCiAgICAgIGlmICh0eXBlb2YgbW9kZVt0eXBlXSA9PSAic3RyaW5nIikgewogICAgICAgIGlmIChoZWxwW21vZGVbdHlwZV1dKSB7IGZvdW5kLnB1c2goaGVscFttb2RlW3R5cGVdXSkgfQogICAgICB9IGVsc2UgaWYgKG1vZGVbdHlwZV0pIHsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG1vZGVbdHlwZV0ubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHZhciB2YWwgPSBoZWxwW21vZGVbdHlwZV1baV1dCiAgICAgICAgICBpZiAodmFsKSB7IGZvdW5kLnB1c2godmFsKSB9CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKG1vZGUuaGVscGVyVHlwZSAmJiBoZWxwW21vZGUuaGVscGVyVHlwZV0pIHsKICAgICAgICBmb3VuZC5wdXNoKGhlbHBbbW9kZS5oZWxwZXJUeXBlXSkKICAgICAgfSBlbHNlIGlmIChoZWxwW21vZGUubmFtZV0pIHsKICAgICAgICBmb3VuZC5wdXNoKGhlbHBbbW9kZS5uYW1lXSkKICAgICAgfQogICAgICBmb3IgKHZhciBpJDEgPSAwOyBpJDEgPCBoZWxwLl9nbG9iYWwubGVuZ3RoOyBpJDErKykgewogICAgICAgIHZhciBjdXIgPSBoZWxwLl9nbG9iYWxbaSQxXQogICAgICAgIGlmIChjdXIucHJlZChtb2RlLCB0aGlzJDEpICYmIGluZGV4T2YoZm91bmQsIGN1ci52YWwpID09IC0xKQogICAgICAgICAgeyBmb3VuZC5wdXNoKGN1ci52YWwpIH0KICAgICAgfQogICAgICByZXR1cm4gZm91bmQKICAgIH0sCgogICAgZ2V0U3RhdGVBZnRlcjogZnVuY3Rpb24obGluZSwgcHJlY2lzZSkgewogICAgICB2YXIgZG9jID0gdGhpcy5kb2MKICAgICAgbGluZSA9IGNsaXBMaW5lKGRvYywgbGluZSA9PSBudWxsID8gZG9jLmZpcnN0ICsgZG9jLnNpemUgLSAxOiBsaW5lKQogICAgICByZXR1cm4gZ2V0U3RhdGVCZWZvcmUodGhpcywgbGluZSArIDEsIHByZWNpc2UpCiAgICB9LAoKICAgIGN1cnNvckNvb3JkczogZnVuY3Rpb24oc3RhcnQsIG1vZGUpIHsKICAgICAgdmFyIHBvcywgcmFuZ2UkJDEgPSB0aGlzLmRvYy5zZWwucHJpbWFyeSgpCiAgICAgIGlmIChzdGFydCA9PSBudWxsKSB7IHBvcyA9IHJhbmdlJCQxLmhlYWQgfQogICAgICBlbHNlIGlmICh0eXBlb2Ygc3RhcnQgPT0gIm9iamVjdCIpIHsgcG9zID0gY2xpcFBvcyh0aGlzLmRvYywgc3RhcnQpIH0KICAgICAgZWxzZSB7IHBvcyA9IHN0YXJ0ID8gcmFuZ2UkJDEuZnJvbSgpIDogcmFuZ2UkJDEudG8oKSB9CiAgICAgIHJldHVybiBjdXJzb3JDb29yZHModGhpcywgcG9zLCBtb2RlIHx8ICJwYWdlIikKICAgIH0sCgogICAgY2hhckNvb3JkczogZnVuY3Rpb24ocG9zLCBtb2RlKSB7CiAgICAgIHJldHVybiBjaGFyQ29vcmRzKHRoaXMsIGNsaXBQb3ModGhpcy5kb2MsIHBvcyksIG1vZGUgfHwgInBhZ2UiKQogICAgfSwKCiAgICBjb29yZHNDaGFyOiBmdW5jdGlvbihjb29yZHMsIG1vZGUpIHsKICAgICAgY29vcmRzID0gZnJvbUNvb3JkU3lzdGVtKHRoaXMsIGNvb3JkcywgbW9kZSB8fCAicGFnZSIpCiAgICAgIHJldHVybiBjb29yZHNDaGFyKHRoaXMsIGNvb3Jkcy5sZWZ0LCBjb29yZHMudG9wKQogICAgfSwKCiAgICBsaW5lQXRIZWlnaHQ6IGZ1bmN0aW9uKGhlaWdodCwgbW9kZSkgewogICAgICBoZWlnaHQgPSBmcm9tQ29vcmRTeXN0ZW0odGhpcywge3RvcDogaGVpZ2h0LCBsZWZ0OiAwfSwgbW9kZSB8fCAicGFnZSIpLnRvcAogICAgICByZXR1cm4gbGluZUF0SGVpZ2h0KHRoaXMuZG9jLCBoZWlnaHQgKyB0aGlzLmRpc3BsYXkudmlld09mZnNldCkKICAgIH0sCiAgICBoZWlnaHRBdExpbmU6IGZ1bmN0aW9uKGxpbmUsIG1vZGUpIHsKICAgICAgdmFyIGVuZCA9IGZhbHNlLCBsaW5lT2JqCiAgICAgIGlmICh0eXBlb2YgbGluZSA9PSAibnVtYmVyIikgewogICAgICAgIHZhciBsYXN0ID0gdGhpcy5kb2MuZmlyc3QgKyB0aGlzLmRvYy5zaXplIC0gMQogICAgICAgIGlmIChsaW5lIDwgdGhpcy5kb2MuZmlyc3QpIHsgbGluZSA9IHRoaXMuZG9jLmZpcnN0IH0KICAgICAgICBlbHNlIGlmIChsaW5lID4gbGFzdCkgeyBsaW5lID0gbGFzdDsgZW5kID0gdHJ1ZSB9CiAgICAgICAgbGluZU9iaiA9IGdldExpbmUodGhpcy5kb2MsIGxpbmUpCiAgICAgIH0gZWxzZSB7CiAgICAgICAgbGluZU9iaiA9IGxpbmUKICAgICAgfQogICAgICByZXR1cm4gaW50b0Nvb3JkU3lzdGVtKHRoaXMsIGxpbmVPYmosIHt0b3A6IDAsIGxlZnQ6IDB9LCBtb2RlIHx8ICJwYWdlIikudG9wICsKICAgICAgICAoZW5kID8gdGhpcy5kb2MuaGVpZ2h0IC0gaGVpZ2h0QXRMaW5lKGxpbmVPYmopIDogMCkKICAgIH0sCgogICAgZGVmYXVsdFRleHRIZWlnaHQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGV4dEhlaWdodCh0aGlzLmRpc3BsYXkpIH0sCiAgICBkZWZhdWx0Q2hhcldpZHRoOiBmdW5jdGlvbigpIHsgcmV0dXJuIGNoYXJXaWR0aCh0aGlzLmRpc3BsYXkpIH0sCgogICAgc2V0R3V0dGVyTWFya2VyOiBtZXRob2RPcChmdW5jdGlvbihsaW5lLCBndXR0ZXJJRCwgdmFsdWUpIHsKICAgICAgcmV0dXJuIGNoYW5nZUxpbmUodGhpcy5kb2MsIGxpbmUsICJndXR0ZXIiLCBmdW5jdGlvbiAobGluZSkgewogICAgICAgIHZhciBtYXJrZXJzID0gbGluZS5ndXR0ZXJNYXJrZXJzIHx8IChsaW5lLmd1dHRlck1hcmtlcnMgPSB7fSkKICAgICAgICBtYXJrZXJzW2d1dHRlcklEXSA9IHZhbHVlCiAgICAgICAgaWYgKCF2YWx1ZSAmJiBpc0VtcHR5KG1hcmtlcnMpKSB7IGxpbmUuZ3V0dGVyTWFya2VycyA9IG51bGwgfQogICAgICAgIHJldHVybiB0cnVlCiAgICAgIH0pCiAgICB9KSwKCiAgICBjbGVhckd1dHRlcjogbWV0aG9kT3AoZnVuY3Rpb24oZ3V0dGVySUQpIHsKICAgICAgdmFyIHRoaXMkMSA9IHRoaXM7CgogICAgICB2YXIgZG9jID0gdGhpcy5kb2MsIGkgPSBkb2MuZmlyc3QKICAgICAgZG9jLml0ZXIoZnVuY3Rpb24gKGxpbmUpIHsKICAgICAgICBpZiAobGluZS5ndXR0ZXJNYXJrZXJzICYmIGxpbmUuZ3V0dGVyTWFya2Vyc1tndXR0ZXJJRF0pIHsKICAgICAgICAgIGxpbmUuZ3V0dGVyTWFya2Vyc1tndXR0ZXJJRF0gPSBudWxsCiAgICAgICAgICByZWdMaW5lQ2hhbmdlKHRoaXMkMSwgaSwgImd1dHRlciIpCiAgICAgICAgICBpZiAoaXNFbXB0eShsaW5lLmd1dHRlck1hcmtlcnMpKSB7IGxpbmUuZ3V0dGVyTWFya2VycyA9IG51bGwgfQogICAgICAgIH0KICAgICAgICArK2kKICAgICAgfSkKICAgIH0pLAoKICAgIGxpbmVJbmZvOiBmdW5jdGlvbihsaW5lKSB7CiAgICAgIHZhciBuCiAgICAgIGlmICh0eXBlb2YgbGluZSA9PSAibnVtYmVyIikgewogICAgICAgIGlmICghaXNMaW5lKHRoaXMuZG9jLCBsaW5lKSkgeyByZXR1cm4gbnVsbCB9CiAgICAgICAgbiA9IGxpbmUKICAgICAgICBsaW5lID0gZ2V0TGluZSh0aGlzLmRvYywgbGluZSkKICAgICAgICBpZiAoIWxpbmUpIHsgcmV0dXJuIG51bGwgfQogICAgICB9IGVsc2UgewogICAgICAgIG4gPSBsaW5lTm8obGluZSkKICAgICAgICBpZiAobiA9PSBudWxsKSB7IHJldHVybiBudWxsIH0KICAgICAgfQogICAgICByZXR1cm4ge2xpbmU6IG4sIGhhbmRsZTogbGluZSwgdGV4dDogbGluZS50ZXh0LCBndXR0ZXJNYXJrZXJzOiBsaW5lLmd1dHRlck1hcmtlcnMsCiAgICAgICAgICAgICAgdGV4dENsYXNzOiBsaW5lLnRleHRDbGFzcywgYmdDbGFzczogbGluZS5iZ0NsYXNzLCB3cmFwQ2xhc3M6IGxpbmUud3JhcENsYXNzLAogICAgICAgICAgICAgIHdpZGdldHM6IGxpbmUud2lkZ2V0c30KICAgIH0sCgogICAgZ2V0Vmlld3BvcnQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4ge2Zyb206IHRoaXMuZGlzcGxheS52aWV3RnJvbSwgdG86IHRoaXMuZGlzcGxheS52aWV3VG99fSwKCiAgICBhZGRXaWRnZXQ6IGZ1bmN0aW9uKHBvcywgbm9kZSwgc2Nyb2xsLCB2ZXJ0LCBob3JpeikgewogICAgICB2YXIgZGlzcGxheSA9IHRoaXMuZGlzcGxheQogICAgICBwb3MgPSBjdXJzb3JDb29yZHModGhpcywgY2xpcFBvcyh0aGlzLmRvYywgcG9zKSkKICAgICAgdmFyIHRvcCA9IHBvcy5ib3R0b20sIGxlZnQgPSBwb3MubGVmdAogICAgICBub2RlLnN0eWxlLnBvc2l0aW9uID0gImFic29sdXRlIgogICAgICBub2RlLnNldEF0dHJpYnV0ZSgiY20taWdub3JlLWV2ZW50cyIsICJ0cnVlIikKICAgICAgdGhpcy5kaXNwbGF5LmlucHV0LnNldFVuZWRpdGFibGUobm9kZSkKICAgICAgZGlzcGxheS5zaXplci5hcHBlbmRDaGlsZChub2RlKQogICAgICBpZiAodmVydCA9PSAib3ZlciIpIHsKICAgICAgICB0b3AgPSBwb3MudG9wCiAgICAgIH0gZWxzZSBpZiAodmVydCA9PSAiYWJvdmUiIHx8IHZlcnQgPT0gIm5lYXIiKSB7CiAgICAgICAgdmFyIHZzcGFjZSA9IE1hdGgubWF4KGRpc3BsYXkud3JhcHBlci5jbGllbnRIZWlnaHQsIHRoaXMuZG9jLmhlaWdodCksCiAgICAgICAgaHNwYWNlID0gTWF0aC5tYXgoZGlzcGxheS5zaXplci5jbGllbnRXaWR0aCwgZGlzcGxheS5saW5lU3BhY2UuY2xpZW50V2lkdGgpCiAgICAgICAgLy8gRGVmYXVsdCB0byBwb3NpdGlvbmluZyBhYm92ZSAoaWYgc3BlY2lmaWVkIGFuZCBwb3NzaWJsZSk7IG90aGVyd2lzZSBkZWZhdWx0IHRvIHBvc2l0aW9uaW5nIGJlbG93CiAgICAgICAgaWYgKCh2ZXJ0ID09ICdhYm92ZScgfHwgcG9zLmJvdHRvbSArIG5vZGUub2Zmc2V0SGVpZ2h0ID4gdnNwYWNlKSAmJiBwb3MudG9wID4gbm9kZS5vZmZzZXRIZWlnaHQpCiAgICAgICAgICB7IHRvcCA9IHBvcy50b3AgLSBub2RlLm9mZnNldEhlaWdodCB9CiAgICAgICAgZWxzZSBpZiAocG9zLmJvdHRvbSArIG5vZGUub2Zmc2V0SGVpZ2h0IDw9IHZzcGFjZSkKICAgICAgICAgIHsgdG9wID0gcG9zLmJvdHRvbSB9CiAgICAgICAgaWYgKGxlZnQgKyBub2RlLm9mZnNldFdpZHRoID4gaHNwYWNlKQogICAgICAgICAgeyBsZWZ0ID0gaHNwYWNlIC0gbm9kZS5vZmZzZXRXaWR0aCB9CiAgICAgIH0KICAgICAgbm9kZS5zdHlsZS50b3AgPSB0b3AgKyAicHgiCiAgICAgIG5vZGUuc3R5bGUubGVmdCA9IG5vZGUuc3R5bGUucmlnaHQgPSAiIgogICAgICBpZiAoaG9yaXogPT0gInJpZ2h0IikgewogICAgICAgIGxlZnQgPSBkaXNwbGF5LnNpemVyLmNsaWVudFdpZHRoIC0gbm9kZS5vZmZzZXRXaWR0aAogICAgICAgIG5vZGUuc3R5bGUucmlnaHQgPSAiMHB4IgogICAgICB9IGVsc2UgewogICAgICAgIGlmIChob3JpeiA9PSAibGVmdCIpIHsgbGVmdCA9IDAgfQogICAgICAgIGVsc2UgaWYgKGhvcml6ID09ICJtaWRkbGUiKSB7IGxlZnQgPSAoZGlzcGxheS5zaXplci5jbGllbnRXaWR0aCAtIG5vZGUub2Zmc2V0V2lkdGgpIC8gMiB9CiAgICAgICAgbm9kZS5zdHlsZS5sZWZ0ID0gbGVmdCArICJweCIKICAgICAgfQogICAgICBpZiAoc2Nyb2xsKQogICAgICAgIHsgc2Nyb2xsSW50b1ZpZXcodGhpcywgbGVmdCwgdG9wLCBsZWZ0ICsgbm9kZS5vZmZzZXRXaWR0aCwgdG9wICsgbm9kZS5vZmZzZXRIZWlnaHQpIH0KICAgIH0sCgogICAgdHJpZ2dlck9uS2V5RG93bjogbWV0aG9kT3Aob25LZXlEb3duKSwKICAgIHRyaWdnZXJPbktleVByZXNzOiBtZXRob2RPcChvbktleVByZXNzKSwKICAgIHRyaWdnZXJPbktleVVwOiBvbktleVVwLAoKICAgIGV4ZWNDb21tYW5kOiBmdW5jdGlvbihjbWQpIHsKICAgICAgaWYgKGNvbW1hbmRzLmhhc093blByb3BlcnR5KGNtZCkpCiAgICAgICAgeyByZXR1cm4gY29tbWFuZHNbY21kXS5jYWxsKG51bGwsIHRoaXMpIH0KICAgIH0sCgogICAgdHJpZ2dlckVsZWN0cmljOiBtZXRob2RPcChmdW5jdGlvbih0ZXh0KSB7IHRyaWdnZXJFbGVjdHJpYyh0aGlzLCB0ZXh0KSB9KSwKCiAgICBmaW5kUG9zSDogZnVuY3Rpb24oZnJvbSwgYW1vdW50LCB1bml0LCB2aXN1YWxseSkgewogICAgICB2YXIgdGhpcyQxID0gdGhpczsKCiAgICAgIHZhciBkaXIgPSAxCiAgICAgIGlmIChhbW91bnQgPCAwKSB7IGRpciA9IC0xOyBhbW91bnQgPSAtYW1vdW50IH0KICAgICAgdmFyIGN1ciA9IGNsaXBQb3ModGhpcy5kb2MsIGZyb20pCiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYW1vdW50OyArK2kpIHsKICAgICAgICBjdXIgPSBmaW5kUG9zSCh0aGlzJDEuZG9jLCBjdXIsIGRpciwgdW5pdCwgdmlzdWFsbHkpCiAgICAgICAgaWYgKGN1ci5oaXRTaWRlKSB7IGJyZWFrIH0KICAgICAgfQogICAgICByZXR1cm4gY3VyCiAgICB9LAoKICAgIG1vdmVIOiBtZXRob2RPcChmdW5jdGlvbihkaXIsIHVuaXQpIHsKICAgICAgdmFyIHRoaXMkMSA9IHRoaXM7CgogICAgICB0aGlzLmV4dGVuZFNlbGVjdGlvbnNCeShmdW5jdGlvbiAocmFuZ2UkJDEpIHsKICAgICAgICBpZiAodGhpcyQxLmRpc3BsYXkuc2hpZnQgfHwgdGhpcyQxLmRvYy5leHRlbmQgfHwgcmFuZ2UkJDEuZW1wdHkoKSkKICAgICAgICAgIHsgcmV0dXJuIGZpbmRQb3NIKHRoaXMkMS5kb2MsIHJhbmdlJCQxLmhlYWQsIGRpciwgdW5pdCwgdGhpcyQxLm9wdGlvbnMucnRsTW92ZVZpc3VhbGx5KSB9CiAgICAgICAgZWxzZQogICAgICAgICAgeyByZXR1cm4gZGlyIDwgMCA/IHJhbmdlJCQxLmZyb20oKSA6IHJhbmdlJCQxLnRvKCkgfQogICAgICB9LCBzZWxfbW92ZSkKICAgIH0pLAoKICAgIGRlbGV0ZUg6IG1ldGhvZE9wKGZ1bmN0aW9uKGRpciwgdW5pdCkgewogICAgICB2YXIgc2VsID0gdGhpcy5kb2Muc2VsLCBkb2MgPSB0aGlzLmRvYwogICAgICBpZiAoc2VsLnNvbWV0aGluZ1NlbGVjdGVkKCkpCiAgICAgICAgeyBkb2MucmVwbGFjZVNlbGVjdGlvbigiIiwgbnVsbCwgIitkZWxldGUiKSB9CiAgICAgIGVsc2UKICAgICAgICB7IGRlbGV0ZU5lYXJTZWxlY3Rpb24odGhpcywgZnVuY3Rpb24gKHJhbmdlJCQxKSB7CiAgICAgICAgICB2YXIgb3RoZXIgPSBmaW5kUG9zSChkb2MsIHJhbmdlJCQxLmhlYWQsIGRpciwgdW5pdCwgZmFsc2UpCiAgICAgICAgICByZXR1cm4gZGlyIDwgMCA/IHtmcm9tOiBvdGhlciwgdG86IHJhbmdlJCQxLmhlYWR9IDoge2Zyb206IHJhbmdlJCQxLmhlYWQsIHRvOiBvdGhlcn0KICAgICAgICB9KSB9CiAgICB9KSwKCiAgICBmaW5kUG9zVjogZnVuY3Rpb24oZnJvbSwgYW1vdW50LCB1bml0LCBnb2FsQ29sdW1uKSB7CiAgICAgIHZhciB0aGlzJDEgPSB0aGlzOwoKICAgICAgdmFyIGRpciA9IDEsIHggPSBnb2FsQ29sdW1uCiAgICAgIGlmIChhbW91bnQgPCAwKSB7IGRpciA9IC0xOyBhbW91bnQgPSAtYW1vdW50IH0KICAgICAgdmFyIGN1ciA9IGNsaXBQb3ModGhpcy5kb2MsIGZyb20pCiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYW1vdW50OyArK2kpIHsKICAgICAgICB2YXIgY29vcmRzID0gY3Vyc29yQ29vcmRzKHRoaXMkMSwgY3VyLCAiZGl2IikKICAgICAgICBpZiAoeCA9PSBudWxsKSB7IHggPSBjb29yZHMubGVmdCB9CiAgICAgICAgZWxzZSB7IGNvb3Jkcy5sZWZ0ID0geCB9CiAgICAgICAgY3VyID0gZmluZFBvc1YodGhpcyQxLCBjb29yZHMsIGRpciwgdW5pdCkKICAgICAgICBpZiAoY3VyLmhpdFNpZGUpIHsgYnJlYWsgfQogICAgICB9CiAgICAgIHJldHVybiBjdXIKICAgIH0sCgogICAgbW92ZVY6IG1ldGhvZE9wKGZ1bmN0aW9uKGRpciwgdW5pdCkgewogICAgICB2YXIgdGhpcyQxID0gdGhpczsKCiAgICAgIHZhciBkb2MgPSB0aGlzLmRvYywgZ29hbHMgPSBbXQogICAgICB2YXIgY29sbGFwc2UgPSAhdGhpcy5kaXNwbGF5LnNoaWZ0ICYmICFkb2MuZXh0ZW5kICYmIGRvYy5zZWwuc29tZXRoaW5nU2VsZWN0ZWQoKQogICAgICBkb2MuZXh0ZW5kU2VsZWN0aW9uc0J5KGZ1bmN0aW9uIChyYW5nZSQkMSkgewogICAgICAgIGlmIChjb2xsYXBzZSkKICAgICAgICAgIHsgcmV0dXJuIGRpciA8IDAgPyByYW5nZSQkMS5mcm9tKCkgOiByYW5nZSQkMS50bygpIH0KICAgICAgICB2YXIgaGVhZFBvcyA9IGN1cnNvckNvb3Jkcyh0aGlzJDEsIHJhbmdlJCQxLmhlYWQsICJkaXYiKQogICAgICAgIGlmIChyYW5nZSQkMS5nb2FsQ29sdW1uICE9IG51bGwpIHsgaGVhZFBvcy5sZWZ0ID0gcmFuZ2UkJDEuZ29hbENvbHVtbiB9CiAgICAgICAgZ29hbHMucHVzaChoZWFkUG9zLmxlZnQpCiAgICAgICAgdmFyIHBvcyA9IGZpbmRQb3NWKHRoaXMkMSwgaGVhZFBvcywgZGlyLCB1bml0KQogICAgICAgIGlmICh1bml0ID09ICJwYWdlIiAmJiByYW5nZSQkMSA9PSBkb2Muc2VsLnByaW1hcnkoKSkKICAgICAgICAgIHsgYWRkVG9TY3JvbGxQb3ModGhpcyQxLCBudWxsLCBjaGFyQ29vcmRzKHRoaXMkMSwgcG9zLCAiZGl2IikudG9wIC0gaGVhZFBvcy50b3ApIH0KICAgICAgICByZXR1cm4gcG9zCiAgICAgIH0sIHNlbF9tb3ZlKQogICAgICBpZiAoZ29hbHMubGVuZ3RoKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgZG9jLnNlbC5yYW5nZXMubGVuZ3RoOyBpKyspCiAgICAgICAgeyBkb2Muc2VsLnJhbmdlc1tpXS5nb2FsQ29sdW1uID0gZ29hbHNbaV0gfSB9CiAgICB9KSwKCiAgICAvLyBGaW5kIHRoZSB3b3JkIGF0IHRoZSBnaXZlbiBwb3NpdGlvbiAoYXMgcmV0dXJuZWQgYnkgY29vcmRzQ2hhcikuCiAgICBmaW5kV29yZEF0OiBmdW5jdGlvbihwb3MpIHsKICAgICAgdmFyIGRvYyA9IHRoaXMuZG9jLCBsaW5lID0gZ2V0TGluZShkb2MsIHBvcy5saW5lKS50ZXh0CiAgICAgIHZhciBzdGFydCA9IHBvcy5jaCwgZW5kID0gcG9zLmNoCiAgICAgIGlmIChsaW5lKSB7CiAgICAgICAgdmFyIGhlbHBlciA9IHRoaXMuZ2V0SGVscGVyKHBvcywgIndvcmRDaGFycyIpCiAgICAgICAgaWYgKChwb3MueFJlbCA8IDAgfHwgZW5kID09IGxpbmUubGVuZ3RoKSAmJiBzdGFydCkgeyAtLXN0YXJ0OyB9IGVsc2UgeyArK2VuZCB9CiAgICAgICAgdmFyIHN0YXJ0Q2hhciA9IGxpbmUuY2hhckF0KHN0YXJ0KQogICAgICAgIHZhciBjaGVjayA9IGlzV29yZENoYXIoc3RhcnRDaGFyLCBoZWxwZXIpCiAgICAgICAgICA/IGZ1bmN0aW9uIChjaCkgeyByZXR1cm4gaXNXb3JkQ2hhcihjaCwgaGVscGVyKTsgfQogICAgICAgICAgOiAvXHMvLnRlc3Qoc3RhcnRDaGFyKSA/IGZ1bmN0aW9uIChjaCkgeyByZXR1cm4gL1xzLy50ZXN0KGNoKTsgfQogICAgICAgICAgOiBmdW5jdGlvbiAoY2gpIHsgcmV0dXJuICghL1xzLy50ZXN0KGNoKSAmJiAhaXNXb3JkQ2hhcihjaCkpOyB9CiAgICAgICAgd2hpbGUgKHN0YXJ0ID4gMCAmJiBjaGVjayhsaW5lLmNoYXJBdChzdGFydCAtIDEpKSkgeyAtLXN0YXJ0IH0KICAgICAgICB3aGlsZSAoZW5kIDwgbGluZS5sZW5ndGggJiYgY2hlY2sobGluZS5jaGFyQXQoZW5kKSkpIHsgKytlbmQgfQogICAgICB9CiAgICAgIHJldHVybiBuZXcgUmFuZ2UoUG9zKHBvcy5saW5lLCBzdGFydCksIFBvcyhwb3MubGluZSwgZW5kKSkKICAgIH0sCgogICAgdG9nZ2xlT3ZlcndyaXRlOiBmdW5jdGlvbih2YWx1ZSkgewogICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZSA9PSB0aGlzLnN0YXRlLm92ZXJ3cml0ZSkgeyByZXR1cm4gfQogICAgICBpZiAodGhpcy5zdGF0ZS5vdmVyd3JpdGUgPSAhdGhpcy5zdGF0ZS5vdmVyd3JpdGUpCiAgICAgICAgeyBhZGRDbGFzcyh0aGlzLmRpc3BsYXkuY3Vyc29yRGl2LCAiQ29kZU1pcnJvci1vdmVyd3JpdGUiKSB9CiAgICAgIGVsc2UKICAgICAgICB7IHJtQ2xhc3ModGhpcy5kaXNwbGF5LmN1cnNvckRpdiwgIkNvZGVNaXJyb3Itb3ZlcndyaXRlIikgfQoKICAgICAgc2lnbmFsKHRoaXMsICJvdmVyd3JpdGVUb2dnbGUiLCB0aGlzLCB0aGlzLnN0YXRlLm92ZXJ3cml0ZSkKICAgIH0sCiAgICBoYXNGb2N1czogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLmRpc3BsYXkuaW5wdXQuZ2V0RmllbGQoKSA9PSBhY3RpdmVFbHQoKSB9LAogICAgaXNSZWFkT25seTogZnVuY3Rpb24oKSB7IHJldHVybiAhISh0aGlzLm9wdGlvbnMucmVhZE9ubHkgfHwgdGhpcy5kb2MuY2FudEVkaXQpIH0sCgogICAgc2Nyb2xsVG86IG1ldGhvZE9wKGZ1bmN0aW9uKHgsIHkpIHsKICAgICAgaWYgKHggIT0gbnVsbCB8fCB5ICE9IG51bGwpIHsgcmVzb2x2ZVNjcm9sbFRvUG9zKHRoaXMpIH0KICAgICAgaWYgKHggIT0gbnVsbCkgeyB0aGlzLmN1ck9wLnNjcm9sbExlZnQgPSB4IH0KICAgICAgaWYgKHkgIT0gbnVsbCkgeyB0aGlzLmN1ck9wLnNjcm9sbFRvcCA9IHkgfQogICAgfSksCiAgICBnZXRTY3JvbGxJbmZvOiBmdW5jdGlvbigpIHsKICAgICAgdmFyIHNjcm9sbGVyID0gdGhpcy5kaXNwbGF5LnNjcm9sbGVyCiAgICAgIHJldHVybiB7bGVmdDogc2Nyb2xsZXIuc2Nyb2xsTGVmdCwgdG9wOiBzY3JvbGxlci5zY3JvbGxUb3AsCiAgICAgICAgICAgICAgaGVpZ2h0OiBzY3JvbGxlci5zY3JvbGxIZWlnaHQgLSBzY3JvbGxHYXAodGhpcykgLSB0aGlzLmRpc3BsYXkuYmFySGVpZ2h0LAogICAgICAgICAgICAgIHdpZHRoOiBzY3JvbGxlci5zY3JvbGxXaWR0aCAtIHNjcm9sbEdhcCh0aGlzKSAtIHRoaXMuZGlzcGxheS5iYXJXaWR0aCwKICAgICAgICAgICAgICBjbGllbnRIZWlnaHQ6IGRpc3BsYXlIZWlnaHQodGhpcyksIGNsaWVudFdpZHRoOiBkaXNwbGF5V2lkdGgodGhpcyl9CiAgICB9LAoKICAgIHNjcm9sbEludG9WaWV3OiBtZXRob2RPcChmdW5jdGlvbihyYW5nZSQkMSwgbWFyZ2luKSB7CiAgICAgIGlmIChyYW5nZSQkMSA9PSBudWxsKSB7CiAgICAgICAgcmFuZ2UkJDEgPSB7ZnJvbTogdGhpcy5kb2Muc2VsLnByaW1hcnkoKS5oZWFkLCB0bzogbnVsbH0KICAgICAgICBpZiAobWFyZ2luID09IG51bGwpIHsgbWFyZ2luID0gdGhpcy5vcHRpb25zLmN1cnNvclNjcm9sbE1hcmdpbiB9CiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHJhbmdlJCQxID09ICJudW1iZXIiKSB7CiAgICAgICAgcmFuZ2UkJDEgPSB7ZnJvbTogUG9zKHJhbmdlJCQxLCAwKSwgdG86IG51bGx9CiAgICAgIH0gZWxzZSBpZiAocmFuZ2UkJDEuZnJvbSA9PSBudWxsKSB7CiAgICAgICAgcmFuZ2UkJDEgPSB7ZnJvbTogcmFuZ2UkJDEsIHRvOiBudWxsfQogICAgICB9CiAgICAgIGlmICghcmFuZ2UkJDEudG8pIHsgcmFuZ2UkJDEudG8gPSByYW5nZSQkMS5mcm9tIH0KICAgICAgcmFuZ2UkJDEubWFyZ2luID0gbWFyZ2luIHx8IDAKCiAgICAgIGlmIChyYW5nZSQkMS5mcm9tLmxpbmUgIT0gbnVsbCkgewogICAgICAgIHJlc29sdmVTY3JvbGxUb1Bvcyh0aGlzKQogICAgICAgIHRoaXMuY3VyT3Auc2Nyb2xsVG9Qb3MgPSByYW5nZSQkMQogICAgICB9IGVsc2UgewogICAgICAgIHZhciBzUG9zID0gY2FsY3VsYXRlU2Nyb2xsUG9zKHRoaXMsIE1hdGgubWluKHJhbmdlJCQxLmZyb20ubGVmdCwgcmFuZ2UkJDEudG8ubGVmdCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5taW4ocmFuZ2UkJDEuZnJvbS50b3AsIHJhbmdlJCQxLnRvLnRvcCkgLSByYW5nZSQkMS5tYXJnaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5tYXgocmFuZ2UkJDEuZnJvbS5yaWdodCwgcmFuZ2UkJDEudG8ucmlnaHQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGgubWF4KHJhbmdlJCQxLmZyb20uYm90dG9tLCByYW5nZSQkMS50by5ib3R0b20pICsgcmFuZ2UkJDEubWFyZ2luKQogICAgICAgIHRoaXMuc2Nyb2xsVG8oc1Bvcy5zY3JvbGxMZWZ0LCBzUG9zLnNjcm9sbFRvcCkKICAgICAgfQogICAgfSksCgogICAgc2V0U2l6ZTogbWV0aG9kT3AoZnVuY3Rpb24od2lkdGgsIGhlaWdodCkgewogICAgICB2YXIgdGhpcyQxID0gdGhpczsKCiAgICAgIHZhciBpbnRlcnByZXQgPSBmdW5jdGlvbiAodmFsKSB7IHJldHVybiB0eXBlb2YgdmFsID09ICJudW1iZXIiIHx8IC9eXGQrJC8udGVzdChTdHJpbmcodmFsKSkgPyB2YWwgKyAicHgiIDogdmFsOyB9CiAgICAgIGlmICh3aWR0aCAhPSBudWxsKSB7IHRoaXMuZGlzcGxheS53cmFwcGVyLnN0eWxlLndpZHRoID0gaW50ZXJwcmV0KHdpZHRoKSB9CiAgICAgIGlmIChoZWlnaHQgIT0gbnVsbCkgeyB0aGlzLmRpc3BsYXkud3JhcHBlci5zdHlsZS5oZWlnaHQgPSBpbnRlcnByZXQoaGVpZ2h0KSB9CiAgICAgIGlmICh0aGlzLm9wdGlvbnMubGluZVdyYXBwaW5nKSB7IGNsZWFyTGluZU1lYXN1cmVtZW50Q2FjaGUodGhpcykgfQogICAgICB2YXIgbGluZU5vJCQxID0gdGhpcy5kaXNwbGF5LnZpZXdGcm9tCiAgICAgIHRoaXMuZG9jLml0ZXIobGluZU5vJCQxLCB0aGlzLmRpc3BsYXkudmlld1RvLCBmdW5jdGlvbiAobGluZSkgewogICAgICAgIGlmIChsaW5lLndpZGdldHMpIHsgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW5lLndpZGdldHMubGVuZ3RoOyBpKyspCiAgICAgICAgICB7IGlmIChsaW5lLndpZGdldHNbaV0ubm9IU2Nyb2xsKSB7IHJlZ0xpbmVDaGFuZ2UodGhpcyQxLCBsaW5lTm8kJDEsICJ3aWRnZXQiKTsgYnJlYWsgfSB9IH0KICAgICAgICArK2xpbmVObyQkMQogICAgICB9KQogICAgICB0aGlzLmN1ck9wLmZvcmNlVXBkYXRlID0gdHJ1ZQogICAgICBzaWduYWwodGhpcywgInJlZnJlc2giLCB0aGlzKQogICAgfSksCgogICAgb3BlcmF0aW9uOiBmdW5jdGlvbihmKXtyZXR1cm4gcnVuSW5PcCh0aGlzLCBmKX0sCgogICAgcmVmcmVzaDogbWV0aG9kT3AoZnVuY3Rpb24oKSB7CiAgICAgIHZhciBvbGRIZWlnaHQgPSB0aGlzLmRpc3BsYXkuY2FjaGVkVGV4dEhlaWdodAogICAgICByZWdDaGFuZ2UodGhpcykKICAgICAgdGhpcy5jdXJPcC5mb3JjZVVwZGF0ZSA9IHRydWUKICAgICAgY2xlYXJDYWNoZXModGhpcykKICAgICAgdGhpcy5zY3JvbGxUbyh0aGlzLmRvYy5zY3JvbGxMZWZ0LCB0aGlzLmRvYy5zY3JvbGxUb3ApCiAgICAgIHVwZGF0ZUd1dHRlclNwYWNlKHRoaXMpCiAgICAgIGlmIChvbGRIZWlnaHQgPT0gbnVsbCB8fCBNYXRoLmFicyhvbGRIZWlnaHQgLSB0ZXh0SGVpZ2h0KHRoaXMuZGlzcGxheSkpID4gLjUpCiAgICAgICAgeyBlc3RpbWF0ZUxpbmVIZWlnaHRzKHRoaXMpIH0KICAgICAgc2lnbmFsKHRoaXMsICJyZWZyZXNoIiwgdGhpcykKICAgIH0pLAoKICAgIHN3YXBEb2M6IG1ldGhvZE9wKGZ1bmN0aW9uKGRvYykgewogICAgICB2YXIgb2xkID0gdGhpcy5kb2MKICAgICAgb2xkLmNtID0gbnVsbAogICAgICBhdHRhY2hEb2ModGhpcywgZG9jKQogICAgICBjbGVhckNhY2hlcyh0aGlzKQogICAgICB0aGlzLmRpc3BsYXkuaW5wdXQucmVzZXQoKQogICAgICB0aGlzLnNjcm9sbFRvKGRvYy5zY3JvbGxMZWZ0LCBkb2Muc2Nyb2xsVG9wKQogICAgICB0aGlzLmN1ck9wLmZvcmNlU2Nyb2xsID0gdHJ1ZQogICAgICBzaWduYWxMYXRlcih0aGlzLCAic3dhcERvYyIsIHRoaXMsIG9sZCkKICAgICAgcmV0dXJuIG9sZAogICAgfSksCgogICAgZ2V0SW5wdXRGaWVsZDogZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kaXNwbGF5LmlucHV0LmdldEZpZWxkKCl9LAogICAgZ2V0V3JhcHBlckVsZW1lbnQ6IGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGlzcGxheS53cmFwcGVyfSwKICAgIGdldFNjcm9sbGVyRWxlbWVudDogZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kaXNwbGF5LnNjcm9sbGVyfSwKICAgIGdldEd1dHRlckVsZW1lbnQ6IGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGlzcGxheS5ndXR0ZXJzfQogIH0KICBldmVudE1peGluKENvZGVNaXJyb3IpCgogIENvZGVNaXJyb3IucmVnaXN0ZXJIZWxwZXIgPSBmdW5jdGlvbih0eXBlLCBuYW1lLCB2YWx1ZSkgewogICAgaWYgKCFoZWxwZXJzLmhhc093blByb3BlcnR5KHR5cGUpKSB7IGhlbHBlcnNbdHlwZV0gPSBDb2RlTWlycm9yW3R5cGVdID0ge19nbG9iYWw6IFtdfSB9CiAgICBoZWxwZXJzW3R5cGVdW25hbWVdID0gdmFsdWUKICB9CiAgQ29kZU1pcnJvci5yZWdpc3Rlckdsb2JhbEhlbHBlciA9IGZ1bmN0aW9uKHR5cGUsIG5hbWUsIHByZWRpY2F0ZSwgdmFsdWUpIHsKICAgIENvZGVNaXJyb3IucmVnaXN0ZXJIZWxwZXIodHlwZSwgbmFtZSwgdmFsdWUpCiAgICBoZWxwZXJzW3R5cGVdLl9nbG9iYWwucHVzaCh7cHJlZDogcHJlZGljYXRlLCB2YWw6IHZhbHVlfSkKICB9Cn0KCi8vIFVzZWQgZm9yIGhvcml6b250YWwgcmVsYXRpdmUgbW90aW9uLiBEaXIgaXMgLTEgb3IgMSAobGVmdCBvcgovLyByaWdodCksIHVuaXQgY2FuIGJlICJjaGFyIiwgImNvbHVtbiIgKGxpa2UgY2hhciwgYnV0IGRvZXNuJ3QKLy8gY3Jvc3MgbGluZSBib3VuZGFyaWVzKSwgIndvcmQiIChhY3Jvc3MgbmV4dCB3b3JkKSwgb3IgImdyb3VwIiAodG8KLy8gdGhlIHN0YXJ0IG9mIG5leHQgZ3JvdXAgb2Ygd29yZCBvciBub24td29yZC1ub24td2hpdGVzcGFjZQovLyBjaGFycykuIFRoZSB2aXN1YWxseSBwYXJhbSBjb250cm9scyB3aGV0aGVyLCBpbiByaWdodC10by1sZWZ0Ci8vIHRleHQsIGRpcmVjdGlvbiAxIG1lYW5zIHRvIG1vdmUgdG93YXJkcyB0aGUgbmV4dCBpbmRleCBpbiB0aGUKLy8gc3RyaW5nLCBvciB0b3dhcmRzIHRoZSBjaGFyYWN0ZXIgdG8gdGhlIHJpZ2h0IG9mIHRoZSBjdXJyZW50Ci8vIHBvc2l0aW9uLiBUaGUgcmVzdWx0aW5nIHBvc2l0aW9uIHdpbGwgaGF2ZSBhIGhpdFNpZGU9dHJ1ZQovLyBwcm9wZXJ0eSBpZiBpdCByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50LgpmdW5jdGlvbiBmaW5kUG9zSChkb2MsIHBvcywgZGlyLCB1bml0LCB2aXN1YWxseSkgewogIHZhciBsaW5lID0gcG9zLmxpbmUsIGNoID0gcG9zLmNoLCBvcmlnRGlyID0gZGlyCiAgdmFyIGxpbmVPYmogPSBnZXRMaW5lKGRvYywgbGluZSkKICBmdW5jdGlvbiBmaW5kTmV4dExpbmUoKSB7CiAgICB2YXIgbCA9IGxpbmUgKyBkaXIKICAgIGlmIChsIDwgZG9jLmZpcnN0IHx8IGwgPj0gZG9jLmZpcnN0ICsgZG9jLnNpemUpIHsgcmV0dXJuIGZhbHNlIH0KICAgIGxpbmUgPSBsCiAgICByZXR1cm4gbGluZU9iaiA9IGdldExpbmUoZG9jLCBsKQogIH0KICBmdW5jdGlvbiBtb3ZlT25jZShib3VuZFRvTGluZSkgewogICAgdmFyIG5leHQgPSAodmlzdWFsbHkgPyBtb3ZlVmlzdWFsbHkgOiBtb3ZlTG9naWNhbGx5KShsaW5lT2JqLCBjaCwgZGlyLCB0cnVlKQogICAgaWYgKG5leHQgPT0gbnVsbCkgewogICAgICBpZiAoIWJvdW5kVG9MaW5lICYmIGZpbmROZXh0TGluZSgpKSB7CiAgICAgICAgaWYgKHZpc3VhbGx5KSB7IGNoID0gKGRpciA8IDAgPyBsaW5lUmlnaHQgOiBsaW5lTGVmdCkobGluZU9iaikgfQogICAgICAgIGVsc2UgeyBjaCA9IGRpciA8IDAgPyBsaW5lT2JqLnRleHQubGVuZ3RoIDogMCB9CiAgICAgIH0gZWxzZSB7IHJldHVybiBmYWxzZSB9CiAgICB9IGVsc2UgeyBjaCA9IG5leHQgfQogICAgcmV0dXJuIHRydWUKICB9CgogIGlmICh1bml0ID09ICJjaGFyIikgewogICAgbW92ZU9uY2UoKQogIH0gZWxzZSBpZiAodW5pdCA9PSAiY29sdW1uIikgewogICAgbW92ZU9uY2UodHJ1ZSkKICB9IGVsc2UgaWYgKHVuaXQgPT0gIndvcmQiIHx8IHVuaXQgPT0gImdyb3VwIikgewogICAgdmFyIHNhd1R5cGUgPSBudWxsLCBncm91cCA9IHVuaXQgPT0gImdyb3VwIgogICAgdmFyIGhlbHBlciA9IGRvYy5jbSAmJiBkb2MuY20uZ2V0SGVscGVyKHBvcywgIndvcmRDaGFycyIpCiAgICBmb3IgKHZhciBmaXJzdCA9IHRydWU7OyBmaXJzdCA9IGZhbHNlKSB7CiAgICAgIGlmIChkaXIgPCAwICYmICFtb3ZlT25jZSghZmlyc3QpKSB7IGJyZWFrIH0KICAgICAgdmFyIGN1ciA9IGxpbmVPYmoudGV4dC5jaGFyQXQoY2gpIHx8ICJcbiIKICAgICAgdmFyIHR5cGUgPSBpc1dvcmRDaGFyKGN1ciwgaGVscGVyKSA/ICJ3IgogICAgICAgIDogZ3JvdXAgJiYgY3VyID09ICJcbiIgPyAibiIKICAgICAgICA6ICFncm91cCB8fCAvXHMvLnRlc3QoY3VyKSA/IG51bGwKICAgICAgICA6ICJwIgogICAgICBpZiAoZ3JvdXAgJiYgIWZpcnN0ICYmICF0eXBlKSB7IHR5cGUgPSAicyIgfQogICAgICBpZiAoc2F3VHlwZSAmJiBzYXdUeXBlICE9IHR5cGUpIHsKICAgICAgICBpZiAoZGlyIDwgMCkge2RpciA9IDE7IG1vdmVPbmNlKCl9CiAgICAgICAgYnJlYWsKICAgICAgfQoKICAgICAgaWYgKHR5cGUpIHsgc2F3VHlwZSA9IHR5cGUgfQogICAgICBpZiAoZGlyID4gMCAmJiAhbW92ZU9uY2UoIWZpcnN0KSkgeyBicmVhayB9CiAgICB9CiAgfQogIHZhciByZXN1bHQgPSBza2lwQXRvbWljKGRvYywgUG9zKGxpbmUsIGNoKSwgcG9zLCBvcmlnRGlyLCB0cnVlKQogIGlmICghY21wKHBvcywgcmVzdWx0KSkgeyByZXN1bHQuaGl0U2lkZSA9IHRydWUgfQogIHJldHVybiByZXN1bHQKfQoKLy8gRm9yIHJlbGF0aXZlIHZlcnRpY2FsIG1vdmVtZW50LiBEaXIgbWF5IGJlIC0xIG9yIDEuIFVuaXQgY2FuIGJlCi8vICJwYWdlIiBvciAibGluZSIuIFRoZSByZXN1bHRpbmcgcG9zaXRpb24gd2lsbCBoYXZlIGEgaGl0U2lkZT10cnVlCi8vIHByb3BlcnR5IGlmIGl0IHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQuCmZ1bmN0aW9uIGZpbmRQb3NWKGNtLCBwb3MsIGRpciwgdW5pdCkgewogIHZhciBkb2MgPSBjbS5kb2MsIHggPSBwb3MubGVmdCwgeQogIGlmICh1bml0ID09ICJwYWdlIikgewogICAgdmFyIHBhZ2VTaXplID0gTWF0aC5taW4oY20uZGlzcGxheS53cmFwcGVyLmNsaWVudEhlaWdodCwgd2luZG93LmlubmVySGVpZ2h0IHx8IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQpCiAgICB2YXIgbW92ZUFtb3VudCA9IE1hdGgubWF4KHBhZ2VTaXplIC0gLjUgKiB0ZXh0SGVpZ2h0KGNtLmRpc3BsYXkpLCAzKQogICAgeSA9IChkaXIgPiAwID8gcG9zLmJvdHRvbSA6IHBvcy50b3ApICsgZGlyICogbW92ZUFtb3VudAoKICB9IGVsc2UgaWYgKHVuaXQgPT0gImxpbmUiKSB7CiAgICB5ID0gZGlyID4gMCA/IHBvcy5ib3R0b20gKyAzIDogcG9zLnRvcCAtIDMKICB9CiAgdmFyIHRhcmdldAogIGZvciAoOzspIHsKICAgIHRhcmdldCA9IGNvb3Jkc0NoYXIoY20sIHgsIHkpCiAgICBpZiAoIXRhcmdldC5vdXRzaWRlKSB7IGJyZWFrIH0KICAgIGlmIChkaXIgPCAwID8geSA8PSAwIDogeSA+PSBkb2MuaGVpZ2h0KSB7IHRhcmdldC5oaXRTaWRlID0gdHJ1ZTsgYnJlYWsgfQogICAgeSArPSBkaXIgKiA1CiAgfQogIHJldHVybiB0YXJnZXQKfQoKLy8gQ09OVEVOVEVESVRBQkxFIElOUFVUIFNUWUxFCgpmdW5jdGlvbiBDb250ZW50RWRpdGFibGVJbnB1dChjbSkgewogIHRoaXMuY20gPSBjbQogIHRoaXMubGFzdEFuY2hvck5vZGUgPSB0aGlzLmxhc3RBbmNob3JPZmZzZXQgPSB0aGlzLmxhc3RGb2N1c05vZGUgPSB0aGlzLmxhc3RGb2N1c09mZnNldCA9IG51bGwKICB0aGlzLnBvbGxpbmcgPSBuZXcgRGVsYXllZCgpCiAgdGhpcy5ncmFjZVBlcmlvZCA9IGZhbHNlCn0KCkNvbnRlbnRFZGl0YWJsZUlucHV0LnByb3RvdHlwZSA9IGNvcHlPYmooewogIGluaXQ6IGZ1bmN0aW9uKGRpc3BsYXkpIHsKICAgIHZhciBpbnB1dCA9IHRoaXMsIGNtID0gaW5wdXQuY20KICAgIHZhciBkaXYgPSBpbnB1dC5kaXYgPSBkaXNwbGF5LmxpbmVEaXYKICAgIGRpc2FibGVCcm93c2VyTWFnaWMoZGl2LCBjbS5vcHRpb25zLnNwZWxsY2hlY2spCgogICAgb24oZGl2LCAicGFzdGUiLCBmdW5jdGlvbiAoZSkgewogICAgICBpZiAoc2lnbmFsRE9NRXZlbnQoY20sIGUpIHx8IGhhbmRsZVBhc3RlKGUsIGNtKSkgeyByZXR1cm4gfQogICAgICAvLyBJRSBkb2Vzbid0IGZpcmUgaW5wdXQgZXZlbnRzLCBzbyB3ZSBzY2hlZHVsZSBhIHJlYWQgZm9yIHRoZSBwYXN0ZWQgY29udGVudCBpbiB0aGlzIHdheQogICAgICBpZiAoaWVfdmVyc2lvbiA8PSAxMSkgeyBzZXRUaW1lb3V0KG9wZXJhdGlvbihjbSwgZnVuY3Rpb24gKCkgewogICAgICAgIGlmICghaW5wdXQucG9sbENvbnRlbnQoKSkgeyByZWdDaGFuZ2UoY20pIH0KICAgICAgfSksIDIwKSB9CiAgICB9KQoKICAgIG9uKGRpdiwgImNvbXBvc2l0aW9uc3RhcnQiLCBmdW5jdGlvbiAoZSkgewogICAgICB2YXIgZGF0YSA9IGUuZGF0YQogICAgICBpbnB1dC5jb21wb3NpbmcgPSB7c2VsOiBjbS5kb2Muc2VsLCBkYXRhOiBkYXRhLCBzdGFydERhdGE6IGRhdGF9CiAgICAgIGlmICghZGF0YSkgeyByZXR1cm4gfQogICAgICB2YXIgcHJpbSA9IGNtLmRvYy5zZWwucHJpbWFyeSgpCiAgICAgIHZhciBsaW5lID0gY20uZ2V0TGluZShwcmltLmhlYWQubGluZSkKICAgICAgdmFyIGZvdW5kID0gbGluZS5pbmRleE9mKGRhdGEsIE1hdGgubWF4KDAsIHByaW0uaGVhZC5jaCAtIGRhdGEubGVuZ3RoKSkKICAgICAgaWYgKGZvdW5kID4gLTEgJiYgZm91bmQgPD0gcHJpbS5oZWFkLmNoKQogICAgICAgIHsgaW5wdXQuY29tcG9zaW5nLnNlbCA9IHNpbXBsZVNlbGVjdGlvbihQb3MocHJpbS5oZWFkLmxpbmUsIGZvdW5kKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvcyhwcmltLmhlYWQubGluZSwgZm91bmQgKyBkYXRhLmxlbmd0aCkpIH0KICAgIH0pCiAgICBvbihkaXYsICJjb21wb3NpdGlvbnVwZGF0ZSIsIGZ1bmN0aW9uIChlKSB7IHJldHVybiBpbnB1dC5jb21wb3NpbmcuZGF0YSA9IGUuZGF0YTsgfSkKICAgIG9uKGRpdiwgImNvbXBvc2l0aW9uZW5kIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgdmFyIG91cnMgPSBpbnB1dC5jb21wb3NpbmcKICAgICAgaWYgKCFvdXJzKSB7IHJldHVybiB9CiAgICAgIGlmIChlLmRhdGEgIT0gb3Vycy5zdGFydERhdGEgJiYgIS9cdTIwMGIvLnRlc3QoZS5kYXRhKSkKICAgICAgICB7IG91cnMuZGF0YSA9IGUuZGF0YSB9CiAgICAgIC8vIE5lZWQgYSBzbWFsbCBkZWxheSB0byBwcmV2ZW50IG90aGVyIGNvZGUgKGlucHV0IGV2ZW50LAogICAgICAvLyBzZWxlY3Rpb24gcG9sbGluZykgZnJvbSBkb2luZyBkYW1hZ2Ugd2hlbiBmaXJlZCByaWdodCBhZnRlcgogICAgICAvLyBjb21wb3NpdGlvbmVuZC4KICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgaWYgKCFvdXJzLmhhbmRsZWQpCiAgICAgICAgICB7IGlucHV0LmFwcGx5Q29tcG9zaXRpb24ob3VycykgfQogICAgICAgIGlmIChpbnB1dC5jb21wb3NpbmcgPT0gb3VycykKICAgICAgICAgIHsgaW5wdXQuY29tcG9zaW5nID0gbnVsbCB9CiAgICAgIH0sIDUwKQogICAgfSkKCiAgICBvbihkaXYsICJ0b3VjaHN0YXJ0IiwgZnVuY3Rpb24gKCkgeyByZXR1cm4gaW5wdXQuZm9yY2VDb21wb3NpdGlvbkVuZCgpOyB9KQoKICAgIG9uKGRpdiwgImlucHV0IiwgZnVuY3Rpb24gKCkgewogICAgICBpZiAoaW5wdXQuY29tcG9zaW5nKSB7IHJldHVybiB9CiAgICAgIGlmIChjbS5pc1JlYWRPbmx5KCkgfHwgIWlucHV0LnBvbGxDb250ZW50KCkpCiAgICAgICAgeyBydW5Jbk9wKGlucHV0LmNtLCBmdW5jdGlvbiAoKSB7IHJldHVybiByZWdDaGFuZ2UoY20pOyB9KSB9CiAgICB9KQoKICAgIGZ1bmN0aW9uIG9uQ29weUN1dChlKSB7CiAgICAgIGlmIChzaWduYWxET01FdmVudChjbSwgZSkpIHsgcmV0dXJuIH0KICAgICAgaWYgKGNtLnNvbWV0aGluZ1NlbGVjdGVkKCkpIHsKICAgICAgICBzZXRMYXN0Q29waWVkKHtsaW5lV2lzZTogZmFsc2UsIHRleHQ6IGNtLmdldFNlbGVjdGlvbnMoKX0pCiAgICAgICAgaWYgKGUudHlwZSA9PSAiY3V0IikgeyBjbS5yZXBsYWNlU2VsZWN0aW9uKCIiLCBudWxsLCAiY3V0IikgfQogICAgICB9IGVsc2UgaWYgKCFjbS5vcHRpb25zLmxpbmVXaXNlQ29weUN1dCkgewogICAgICAgIHJldHVybgogICAgICB9IGVsc2UgewogICAgICAgIHZhciByYW5nZXMgPSBjb3B5YWJsZVJhbmdlcyhjbSkKICAgICAgICBzZXRMYXN0Q29waWVkKHtsaW5lV2lzZTogdHJ1ZSwgdGV4dDogcmFuZ2VzLnRleHR9KQogICAgICAgIGlmIChlLnR5cGUgPT0gImN1dCIpIHsKICAgICAgICAgIGNtLm9wZXJhdGlvbihmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGNtLnNldFNlbGVjdGlvbnMocmFuZ2VzLnJhbmdlcywgMCwgc2VsX2RvbnRTY3JvbGwpCiAgICAgICAgICAgIGNtLnJlcGxhY2VTZWxlY3Rpb24oIiIsIG51bGwsICJjdXQiKQogICAgICAgICAgfSkKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGUuY2xpcGJvYXJkRGF0YSkgewogICAgICAgIGUuY2xpcGJvYXJkRGF0YS5jbGVhckRhdGEoKQogICAgICAgIHZhciBjb250ZW50ID0gbGFzdENvcGllZC50ZXh0LmpvaW4oIlxuIikKICAgICAgICAvLyBpT1MgZXhwb3NlcyB0aGUgY2xpcGJvYXJkIEFQSSwgYnV0IHNlZW1zIHRvIGRpc2NhcmQgY29udGVudCBpbnNlcnRlZCBpbnRvIGl0CiAgICAgICAgZS5jbGlwYm9hcmREYXRhLnNldERhdGEoIlRleHQiLCBjb250ZW50KQogICAgICAgIGlmIChlLmNsaXBib2FyZERhdGEuZ2V0RGF0YSgiVGV4dCIpID09IGNvbnRlbnQpIHsKICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKQogICAgICAgICAgcmV0dXJuCiAgICAgICAgfQogICAgICB9CiAgICAgIC8vIE9sZC1mYXNoaW9uZWQgYnJpZWZseS1mb2N1cy1hLXRleHRhcmVhIGhhY2sKICAgICAgdmFyIGtsdWRnZSA9IGhpZGRlblRleHRhcmVhKCksIHRlID0ga2x1ZGdlLmZpcnN0Q2hpbGQKICAgICAgY20uZGlzcGxheS5saW5lU3BhY2UuaW5zZXJ0QmVmb3JlKGtsdWRnZSwgY20uZGlzcGxheS5saW5lU3BhY2UuZmlyc3RDaGlsZCkKICAgICAgdGUudmFsdWUgPSBsYXN0Q29waWVkLnRleHQuam9pbigiXG4iKQogICAgICB2YXIgaGFkRm9jdXMgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50CiAgICAgIHNlbGVjdElucHV0KHRlKQogICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICBjbS5kaXNwbGF5LmxpbmVTcGFjZS5yZW1vdmVDaGlsZChrbHVkZ2UpCiAgICAgICAgaGFkRm9jdXMuZm9jdXMoKQogICAgICAgIGlmIChoYWRGb2N1cyA9PSBkaXYpIHsgaW5wdXQuc2hvd1ByaW1hcnlTZWxlY3Rpb24oKSB9CiAgICAgIH0sIDUwKQogICAgfQogICAgb24oZGl2LCAiY29weSIsIG9uQ29weUN1dCkKICAgIG9uKGRpdiwgImN1dCIsIG9uQ29weUN1dCkKICB9LAoKICBwcmVwYXJlU2VsZWN0aW9uOiBmdW5jdGlvbigpIHsKICAgIHZhciByZXN1bHQgPSBwcmVwYXJlU2VsZWN0aW9uKHRoaXMuY20sIGZhbHNlKQogICAgcmVzdWx0LmZvY3VzID0gdGhpcy5jbS5zdGF0ZS5mb2N1c2VkCiAgICByZXR1cm4gcmVzdWx0CiAgfSwKCiAgc2hvd1NlbGVjdGlvbjogZnVuY3Rpb24oaW5mbywgdGFrZUZvY3VzKSB7CiAgICBpZiAoIWluZm8gfHwgIXRoaXMuY20uZGlzcGxheS52aWV3Lmxlbmd0aCkgeyByZXR1cm4gfQogICAgaWYgKGluZm8uZm9jdXMgfHwgdGFrZUZvY3VzKSB7IHRoaXMuc2hvd1ByaW1hcnlTZWxlY3Rpb24oKSB9CiAgICB0aGlzLnNob3dNdWx0aXBsZVNlbGVjdGlvbnMoaW5mbykKICB9LAoKICBzaG93UHJpbWFyeVNlbGVjdGlvbjogZnVuY3Rpb24oKSB7CiAgICB2YXIgc2VsID0gd2luZG93LmdldFNlbGVjdGlvbigpLCBwcmltID0gdGhpcy5jbS5kb2Muc2VsLnByaW1hcnkoKQogICAgdmFyIGN1ckFuY2hvciA9IGRvbVRvUG9zKHRoaXMuY20sIHNlbC5hbmNob3JOb2RlLCBzZWwuYW5jaG9yT2Zmc2V0KQogICAgdmFyIGN1ckZvY3VzID0gZG9tVG9Qb3ModGhpcy5jbSwgc2VsLmZvY3VzTm9kZSwgc2VsLmZvY3VzT2Zmc2V0KQogICAgaWYgKGN1ckFuY2hvciAmJiAhY3VyQW5jaG9yLmJhZCAmJiBjdXJGb2N1cyAmJiAhY3VyRm9jdXMuYmFkICYmCiAgICAgICAgY21wKG1pblBvcyhjdXJBbmNob3IsIGN1ckZvY3VzKSwgcHJpbS5mcm9tKCkpID09IDAgJiYKICAgICAgICBjbXAobWF4UG9zKGN1ckFuY2hvciwgY3VyRm9jdXMpLCBwcmltLnRvKCkpID09IDApCiAgICAgIHsgcmV0dXJuIH0KCiAgICB2YXIgc3RhcnQgPSBwb3NUb0RPTSh0aGlzLmNtLCBwcmltLmZyb20oKSkKICAgIHZhciBlbmQgPSBwb3NUb0RPTSh0aGlzLmNtLCBwcmltLnRvKCkpCiAgICBpZiAoIXN0YXJ0ICYmICFlbmQpIHsgcmV0dXJuIH0KCiAgICB2YXIgdmlldyA9IHRoaXMuY20uZGlzcGxheS52aWV3CiAgICB2YXIgb2xkID0gc2VsLnJhbmdlQ291bnQgJiYgc2VsLmdldFJhbmdlQXQoMCkKICAgIGlmICghc3RhcnQpIHsKICAgICAgc3RhcnQgPSB7bm9kZTogdmlld1swXS5tZWFzdXJlLm1hcFsyXSwgb2Zmc2V0OiAwfQogICAgfSBlbHNlIGlmICghZW5kKSB7IC8vIEZJWE1FIGRhbmdlcm91c2x5IGhhY2t5CiAgICAgIHZhciBtZWFzdXJlID0gdmlld1t2aWV3Lmxlbmd0aCAtIDFdLm1lYXN1cmUKICAgICAgdmFyIG1hcCQkMSA9IG1lYXN1cmUubWFwcyA/IG1lYXN1cmUubWFwc1ttZWFzdXJlLm1hcHMubGVuZ3RoIC0gMV0gOiBtZWFzdXJlLm1hcAogICAgICBlbmQgPSB7bm9kZTogbWFwJCQxW21hcCQkMS5sZW5ndGggLSAxXSwgb2Zmc2V0OiBtYXAkJDFbbWFwJCQxLmxlbmd0aCAtIDJdIC0gbWFwJCQxW21hcCQkMS5sZW5ndGggLSAzXX0KICAgIH0KCiAgICB2YXIgcm5nCiAgICB0cnkgeyBybmcgPSByYW5nZShzdGFydC5ub2RlLCBzdGFydC5vZmZzZXQsIGVuZC5vZmZzZXQsIGVuZC5ub2RlKSB9CiAgICBjYXRjaChlKSB7fSAvLyBPdXIgbW9kZWwgb2YgdGhlIERPTSBtaWdodCBiZSBvdXRkYXRlZCwgaW4gd2hpY2ggY2FzZSB0aGUgcmFuZ2Ugd2UgdHJ5IHRvIHNldCBjYW4gYmUgaW1wb3NzaWJsZQogICAgaWYgKHJuZykgewogICAgICBpZiAoIWdlY2tvICYmIHRoaXMuY20uc3RhdGUuZm9jdXNlZCkgewogICAgICAgIHNlbC5jb2xsYXBzZShzdGFydC5ub2RlLCBzdGFydC5vZmZzZXQpCiAgICAgICAgaWYgKCFybmcuY29sbGFwc2VkKSB7CiAgICAgICAgICBzZWwucmVtb3ZlQWxsUmFuZ2VzKCkKICAgICAgICAgIHNlbC5hZGRSYW5nZShybmcpCiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHNlbC5yZW1vdmVBbGxSYW5nZXMoKQogICAgICAgIHNlbC5hZGRSYW5nZShybmcpCiAgICAgIH0KICAgICAgaWYgKG9sZCAmJiBzZWwuYW5jaG9yTm9kZSA9PSBudWxsKSB7IHNlbC5hZGRSYW5nZShvbGQpIH0KICAgICAgZWxzZSBpZiAoZ2Vja28pIHsgdGhpcy5zdGFydEdyYWNlUGVyaW9kKCkgfQogICAgfQogICAgdGhpcy5yZW1lbWJlclNlbGVjdGlvbigpCiAgfSwKCiAgc3RhcnRHcmFjZVBlcmlvZDogZnVuY3Rpb24oKSB7CiAgICB2YXIgdGhpcyQxID0gdGhpczsKCiAgICBjbGVhclRpbWVvdXQodGhpcy5ncmFjZVBlcmlvZCkKICAgIHRoaXMuZ3JhY2VQZXJpb2QgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgdGhpcyQxLmdyYWNlUGVyaW9kID0gZmFsc2UKICAgICAgaWYgKHRoaXMkMS5zZWxlY3Rpb25DaGFuZ2VkKCkpCiAgICAgICAgeyB0aGlzJDEuY20ub3BlcmF0aW9uKGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMkMS5jbS5jdXJPcC5zZWxlY3Rpb25DaGFuZ2VkID0gdHJ1ZTsgfSkgfQogICAgfSwgMjApCiAgfSwKCiAgc2hvd011bHRpcGxlU2VsZWN0aW9uczogZnVuY3Rpb24oaW5mbykgewogICAgcmVtb3ZlQ2hpbGRyZW5BbmRBZGQodGhpcy5jbS5kaXNwbGF5LmN1cnNvckRpdiwgaW5mby5jdXJzb3JzKQogICAgcmVtb3ZlQ2hpbGRyZW5BbmRBZGQodGhpcy5jbS5kaXNwbGF5LnNlbGVjdGlvbkRpdiwgaW5mby5zZWxlY3Rpb24pCiAgfSwKCiAgcmVtZW1iZXJTZWxlY3Rpb246IGZ1bmN0aW9uKCkgewogICAgdmFyIHNlbCA9IHdpbmRvdy5nZXRTZWxlY3Rpb24oKQogICAgdGhpcy5sYXN0QW5jaG9yTm9kZSA9IHNlbC5hbmNob3JOb2RlOyB0aGlzLmxhc3RBbmNob3JPZmZzZXQgPSBzZWwuYW5jaG9yT2Zmc2V0CiAgICB0aGlzLmxhc3RGb2N1c05vZGUgPSBzZWwuZm9jdXNOb2RlOyB0aGlzLmxhc3RGb2N1c09mZnNldCA9IHNlbC5mb2N1c09mZnNldAogIH0sCgogIHNlbGVjdGlvbkluRWRpdG9yOiBmdW5jdGlvbigpIHsKICAgIHZhciBzZWwgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkKICAgIGlmICghc2VsLnJhbmdlQ291bnQpIHsgcmV0dXJuIGZhbHNlIH0KICAgIHZhciBub2RlID0gc2VsLmdldFJhbmdlQXQoMCkuY29tbW9uQW5jZXN0b3JDb250YWluZXIKICAgIHJldHVybiBjb250YWlucyh0aGlzLmRpdiwgbm9kZSkKICB9LAoKICBmb2N1czogZnVuY3Rpb24oKSB7CiAgICBpZiAodGhpcy5jbS5vcHRpb25zLnJlYWRPbmx5ICE9ICJub2N1cnNvciIpIHsgdGhpcy5kaXYuZm9jdXMoKSB9CiAgfSwKICBibHVyOiBmdW5jdGlvbigpIHsgdGhpcy5kaXYuYmx1cigpIH0sCiAgZ2V0RmllbGQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5kaXYgfSwKCiAgc3VwcG9ydHNUb3VjaDogZnVuY3Rpb24oKSB7IHJldHVybiB0cnVlIH0sCgogIHJlY2VpdmVkRm9jdXM6IGZ1bmN0aW9uKCkgewogICAgdmFyIGlucHV0ID0gdGhpcwogICAgaWYgKHRoaXMuc2VsZWN0aW9uSW5FZGl0b3IoKSkKICAgICAgeyB0aGlzLnBvbGxTZWxlY3Rpb24oKSB9CiAgICBlbHNlCiAgICAgIHsgcnVuSW5PcCh0aGlzLmNtLCBmdW5jdGlvbiAoKSB7IHJldHVybiBpbnB1dC5jbS5jdXJPcC5zZWxlY3Rpb25DaGFuZ2VkID0gdHJ1ZTsgfSkgfQoKICAgIGZ1bmN0aW9uIHBvbGwoKSB7CiAgICAgIGlmIChpbnB1dC5jbS5zdGF0ZS5mb2N1c2VkKSB7CiAgICAgICAgaW5wdXQucG9sbFNlbGVjdGlvbigpCiAgICAgICAgaW5wdXQucG9sbGluZy5zZXQoaW5wdXQuY20ub3B0aW9ucy5wb2xsSW50ZXJ2YWwsIHBvbGwpCiAgICAgIH0KICAgIH0KICAgIHRoaXMucG9sbGluZy5zZXQodGhpcy5jbS5vcHRpb25zLnBvbGxJbnRlcnZhbCwgcG9sbCkKICB9LAoKICBzZWxlY3Rpb25DaGFuZ2VkOiBmdW5jdGlvbigpIHsKICAgIHZhciBzZWwgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkKICAgIHJldHVybiBzZWwuYW5jaG9yTm9kZSAhPSB0aGlzLmxhc3RBbmNob3JOb2RlIHx8IHNlbC5hbmNob3JPZmZzZXQgIT0gdGhpcy5sYXN0QW5jaG9yT2Zmc2V0IHx8CiAgICAgIHNlbC5mb2N1c05vZGUgIT0gdGhpcy5sYXN0Rm9jdXNOb2RlIHx8IHNlbC5mb2N1c09mZnNldCAhPSB0aGlzLmxhc3RGb2N1c09mZnNldAogIH0sCgogIHBvbGxTZWxlY3Rpb246IGZ1bmN0aW9uKCkgewogICAgaWYgKCF0aGlzLmNvbXBvc2luZyAmJiAhdGhpcy5ncmFjZVBlcmlvZCAmJiB0aGlzLnNlbGVjdGlvbkNoYW5nZWQoKSkgewogICAgICB2YXIgc2VsID0gd2luZG93LmdldFNlbGVjdGlvbigpLCBjbSA9IHRoaXMuY20KICAgICAgdGhpcy5yZW1lbWJlclNlbGVjdGlvbigpCiAgICAgIHZhciBhbmNob3IgPSBkb21Ub1BvcyhjbSwgc2VsLmFuY2hvck5vZGUsIHNlbC5hbmNob3JPZmZzZXQpCiAgICAgIHZhciBoZWFkID0gZG9tVG9Qb3MoY20sIHNlbC5mb2N1c05vZGUsIHNlbC5mb2N1c09mZnNldCkKICAgICAgaWYgKGFuY2hvciAmJiBoZWFkKSB7IHJ1bkluT3AoY20sIGZ1bmN0aW9uICgpIHsKICAgICAgICBzZXRTZWxlY3Rpb24oY20uZG9jLCBzaW1wbGVTZWxlY3Rpb24oYW5jaG9yLCBoZWFkKSwgc2VsX2RvbnRTY3JvbGwpCiAgICAgICAgaWYgKGFuY2hvci5iYWQgfHwgaGVhZC5iYWQpIHsgY20uY3VyT3Auc2VsZWN0aW9uQ2hhbmdlZCA9IHRydWUgfQogICAgICB9KSB9CiAgICB9CiAgfSwKCiAgcG9sbENvbnRlbnQ6IGZ1bmN0aW9uKCkgewogICAgdmFyIGNtID0gdGhpcy5jbSwgZGlzcGxheSA9IGNtLmRpc3BsYXksIHNlbCA9IGNtLmRvYy5zZWwucHJpbWFyeSgpCiAgICB2YXIgZnJvbSA9IHNlbC5mcm9tKCksIHRvID0gc2VsLnRvKCkKICAgIGlmIChmcm9tLmxpbmUgPCBkaXNwbGF5LnZpZXdGcm9tIHx8IHRvLmxpbmUgPiBkaXNwbGF5LnZpZXdUbyAtIDEpIHsgcmV0dXJuIGZhbHNlIH0KCiAgICB2YXIgZnJvbUluZGV4LCBmcm9tTGluZSwgZnJvbU5vZGUKICAgIGlmIChmcm9tLmxpbmUgPT0gZGlzcGxheS52aWV3RnJvbSB8fCAoZnJvbUluZGV4ID0gZmluZFZpZXdJbmRleChjbSwgZnJvbS5saW5lKSkgPT0gMCkgewogICAgICBmcm9tTGluZSA9IGxpbmVObyhkaXNwbGF5LnZpZXdbMF0ubGluZSkKICAgICAgZnJvbU5vZGUgPSBkaXNwbGF5LnZpZXdbMF0ubm9kZQogICAgfSBlbHNlIHsKICAgICAgZnJvbUxpbmUgPSBsaW5lTm8oZGlzcGxheS52aWV3W2Zyb21JbmRleF0ubGluZSkKICAgICAgZnJvbU5vZGUgPSBkaXNwbGF5LnZpZXdbZnJvbUluZGV4IC0gMV0ubm9kZS5uZXh0U2libGluZwogICAgfQogICAgdmFyIHRvSW5kZXggPSBmaW5kVmlld0luZGV4KGNtLCB0by5saW5lKQogICAgdmFyIHRvTGluZSwgdG9Ob2RlCiAgICBpZiAodG9JbmRleCA9PSBkaXNwbGF5LnZpZXcubGVuZ3RoIC0gMSkgewogICAgICB0b0xpbmUgPSBkaXNwbGF5LnZpZXdUbyAtIDEKICAgICAgdG9Ob2RlID0gZGlzcGxheS5saW5lRGl2Lmxhc3RDaGlsZAogICAgfSBlbHNlIHsKICAgICAgdG9MaW5lID0gbGluZU5vKGRpc3BsYXkudmlld1t0b0luZGV4ICsgMV0ubGluZSkgLSAxCiAgICAgIHRvTm9kZSA9IGRpc3BsYXkudmlld1t0b0luZGV4ICsgMV0ubm9kZS5wcmV2aW91c1NpYmxpbmcKICAgIH0KCiAgICB2YXIgbmV3VGV4dCA9IGNtLmRvYy5zcGxpdExpbmVzKGRvbVRleHRCZXR3ZWVuKGNtLCBmcm9tTm9kZSwgdG9Ob2RlLCBmcm9tTGluZSwgdG9MaW5lKSkKICAgIHZhciBvbGRUZXh0ID0gZ2V0QmV0d2VlbihjbS5kb2MsIFBvcyhmcm9tTGluZSwgMCksIFBvcyh0b0xpbmUsIGdldExpbmUoY20uZG9jLCB0b0xpbmUpLnRleHQubGVuZ3RoKSkKICAgIHdoaWxlIChuZXdUZXh0Lmxlbmd0aCA+IDEgJiYgb2xkVGV4dC5sZW5ndGggPiAxKSB7CiAgICAgIGlmIChsc3QobmV3VGV4dCkgPT0gbHN0KG9sZFRleHQpKSB7IG5ld1RleHQucG9wKCk7IG9sZFRleHQucG9wKCk7IHRvTGluZS0tIH0KICAgICAgZWxzZSBpZiAobmV3VGV4dFswXSA9PSBvbGRUZXh0WzBdKSB7IG5ld1RleHQuc2hpZnQoKTsgb2xkVGV4dC5zaGlmdCgpOyBmcm9tTGluZSsrIH0KICAgICAgZWxzZSB7IGJyZWFrIH0KICAgIH0KCiAgICB2YXIgY3V0RnJvbnQgPSAwLCBjdXRFbmQgPSAwCiAgICB2YXIgbmV3VG9wID0gbmV3VGV4dFswXSwgb2xkVG9wID0gb2xkVGV4dFswXSwgbWF4Q3V0RnJvbnQgPSBNYXRoLm1pbihuZXdUb3AubGVuZ3RoLCBvbGRUb3AubGVuZ3RoKQogICAgd2hpbGUgKGN1dEZyb250IDwgbWF4Q3V0RnJvbnQgJiYgbmV3VG9wLmNoYXJDb2RlQXQoY3V0RnJvbnQpID09IG9sZFRvcC5jaGFyQ29kZUF0KGN1dEZyb250KSkKICAgICAgeyArK2N1dEZyb250IH0KICAgIHZhciBuZXdCb3QgPSBsc3QobmV3VGV4dCksIG9sZEJvdCA9IGxzdChvbGRUZXh0KQogICAgdmFyIG1heEN1dEVuZCA9IE1hdGgubWluKG5ld0JvdC5sZW5ndGggLSAobmV3VGV4dC5sZW5ndGggPT0gMSA/IGN1dEZyb250IDogMCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkQm90Lmxlbmd0aCAtIChvbGRUZXh0Lmxlbmd0aCA9PSAxID8gY3V0RnJvbnQgOiAwKSkKICAgIHdoaWxlIChjdXRFbmQgPCBtYXhDdXRFbmQgJiYKICAgICAgICAgICBuZXdCb3QuY2hhckNvZGVBdChuZXdCb3QubGVuZ3RoIC0gY3V0RW5kIC0gMSkgPT0gb2xkQm90LmNoYXJDb2RlQXQob2xkQm90Lmxlbmd0aCAtIGN1dEVuZCAtIDEpKQogICAgICB7ICsrY3V0RW5kIH0KCiAgICBuZXdUZXh0W25ld1RleHQubGVuZ3RoIC0gMV0gPSBuZXdCb3Quc2xpY2UoMCwgbmV3Qm90Lmxlbmd0aCAtIGN1dEVuZCkKICAgIG5ld1RleHRbMF0gPSBuZXdUZXh0WzBdLnNsaWNlKGN1dEZyb250KQoKICAgIHZhciBjaEZyb20gPSBQb3MoZnJvbUxpbmUsIGN1dEZyb250KQogICAgdmFyIGNoVG8gPSBQb3ModG9MaW5lLCBvbGRUZXh0Lmxlbmd0aCA/IGxzdChvbGRUZXh0KS5sZW5ndGggLSBjdXRFbmQgOiAwKQogICAgaWYgKG5ld1RleHQubGVuZ3RoID4gMSB8fCBuZXdUZXh0WzBdIHx8IGNtcChjaEZyb20sIGNoVG8pKSB7CiAgICAgIHJlcGxhY2VSYW5nZShjbS5kb2MsIG5ld1RleHQsIGNoRnJvbSwgY2hUbywgIitpbnB1dCIpCiAgICAgIHJldHVybiB0cnVlCiAgICB9CiAgfSwKCiAgZW5zdXJlUG9sbGVkOiBmdW5jdGlvbigpIHsKICAgIHRoaXMuZm9yY2VDb21wb3NpdGlvbkVuZCgpCiAgfSwKICByZXNldDogZnVuY3Rpb24oKSB7CiAgICB0aGlzLmZvcmNlQ29tcG9zaXRpb25FbmQoKQogIH0sCiAgZm9yY2VDb21wb3NpdGlvbkVuZDogZnVuY3Rpb24oKSB7CiAgICBpZiAoIXRoaXMuY29tcG9zaW5nIHx8IHRoaXMuY29tcG9zaW5nLmhhbmRsZWQpIHsgcmV0dXJuIH0KICAgIHRoaXMuYXBwbHlDb21wb3NpdGlvbih0aGlzLmNvbXBvc2luZykKICAgIHRoaXMuY29tcG9zaW5nLmhhbmRsZWQgPSB0cnVlCiAgICB0aGlzLmRpdi5ibHVyKCkKICAgIHRoaXMuZGl2LmZvY3VzKCkKICB9LAogIGFwcGx5Q29tcG9zaXRpb246IGZ1bmN0aW9uKGNvbXBvc2luZykgewogICAgaWYgKHRoaXMuY20uaXNSZWFkT25seSgpKQogICAgICB7IG9wZXJhdGlvbih0aGlzLmNtLCByZWdDaGFuZ2UpKHRoaXMuY20pIH0KICAgIGVsc2UgaWYgKGNvbXBvc2luZy5kYXRhICYmIGNvbXBvc2luZy5kYXRhICE9IGNvbXBvc2luZy5zdGFydERhdGEpCiAgICAgIHsgb3BlcmF0aW9uKHRoaXMuY20sIGFwcGx5VGV4dElucHV0KSh0aGlzLmNtLCBjb21wb3NpbmcuZGF0YSwgMCwgY29tcG9zaW5nLnNlbCkgfQogIH0sCgogIHNldFVuZWRpdGFibGU6IGZ1bmN0aW9uKG5vZGUpIHsKICAgIG5vZGUuY29udGVudEVkaXRhYmxlID0gImZhbHNlIgogIH0sCgogIG9uS2V5UHJlc3M6IGZ1bmN0aW9uKGUpIHsKICAgIGUucHJldmVudERlZmF1bHQoKQogICAgaWYgKCF0aGlzLmNtLmlzUmVhZE9ubHkoKSkKICAgICAgeyBvcGVyYXRpb24odGhpcy5jbSwgYXBwbHlUZXh0SW5wdXQpKHRoaXMuY20sIFN0cmluZy5mcm9tQ2hhckNvZGUoZS5jaGFyQ29kZSA9PSBudWxsID8gZS5rZXlDb2RlIDogZS5jaGFyQ29kZSksIDApIH0KICB9LAoKICByZWFkT25seUNoYW5nZWQ6IGZ1bmN0aW9uKHZhbCkgewogICAgdGhpcy5kaXYuY29udGVudEVkaXRhYmxlID0gU3RyaW5nKHZhbCAhPSAibm9jdXJzb3IiKQogIH0sCgogIG9uQ29udGV4dE1lbnU6IG5vdGhpbmcsCiAgcmVzZXRQb3NpdGlvbjogbm90aGluZywKCiAgbmVlZHNDb250ZW50QXR0cmlidXRlOiB0cnVlCiAgfSwgQ29udGVudEVkaXRhYmxlSW5wdXQucHJvdG90eXBlKQoKZnVuY3Rpb24gcG9zVG9ET00oY20sIHBvcykgewogIHZhciB2aWV3ID0gZmluZFZpZXdGb3JMaW5lKGNtLCBwb3MubGluZSkKICBpZiAoIXZpZXcgfHwgdmlldy5oaWRkZW4pIHsgcmV0dXJuIG51bGwgfQogIHZhciBsaW5lID0gZ2V0TGluZShjbS5kb2MsIHBvcy5saW5lKQogIHZhciBpbmZvID0gbWFwRnJvbUxpbmVWaWV3KHZpZXcsIGxpbmUsIHBvcy5saW5lKQoKICB2YXIgb3JkZXIgPSBnZXRPcmRlcihsaW5lKSwgc2lkZSA9ICJsZWZ0IgogIGlmIChvcmRlcikgewogICAgdmFyIHBhcnRQb3MgPSBnZXRCaWRpUGFydEF0KG9yZGVyLCBwb3MuY2gpCiAgICBzaWRlID0gcGFydFBvcyAlIDIgPyAicmlnaHQiIDogImxlZnQiCiAgfQogIHZhciByZXN1bHQgPSBub2RlQW5kT2Zmc2V0SW5MaW5lTWFwKGluZm8ubWFwLCBwb3MuY2gsIHNpZGUpCiAgcmVzdWx0Lm9mZnNldCA9IHJlc3VsdC5jb2xsYXBzZSA9PSAicmlnaHQiID8gcmVzdWx0LmVuZCA6IHJlc3VsdC5zdGFydAogIHJldHVybiByZXN1bHQKfQoKZnVuY3Rpb24gYmFkUG9zKHBvcywgYmFkKSB7IGlmIChiYWQpIHsgcG9zLmJhZCA9IHRydWU7IH0gcmV0dXJuIHBvcyB9CgpmdW5jdGlvbiBkb21UZXh0QmV0d2VlbihjbSwgZnJvbSwgdG8sIGZyb21MaW5lLCB0b0xpbmUpIHsKICB2YXIgdGV4dCA9ICIiLCBjbG9zaW5nID0gZmFsc2UsIGxpbmVTZXAgPSBjbS5kb2MubGluZVNlcGFyYXRvcigpCiAgZnVuY3Rpb24gcmVjb2duaXplTWFya2VyKGlkKSB7IHJldHVybiBmdW5jdGlvbiAobWFya2VyKSB7IHJldHVybiBtYXJrZXIuaWQgPT0gaWQ7IH0gfQogIGZ1bmN0aW9uIHdhbGsobm9kZSkgewogICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMSkgewogICAgICB2YXIgY21UZXh0ID0gbm9kZS5nZXRBdHRyaWJ1dGUoImNtLXRleHQiKQogICAgICBpZiAoY21UZXh0ICE9IG51bGwpIHsKICAgICAgICBpZiAoY21UZXh0ID09ICIiKSB7IGNtVGV4dCA9IG5vZGUudGV4dENvbnRlbnQucmVwbGFjZSgvXHUyMDBiL2csICIiKSB9CiAgICAgICAgdGV4dCArPSBjbVRleHQKICAgICAgICByZXR1cm4KICAgICAgfQogICAgICB2YXIgbWFya2VySUQgPSBub2RlLmdldEF0dHJpYnV0ZSgiY20tbWFya2VyIiksIHJhbmdlJCQxCiAgICAgIGlmIChtYXJrZXJJRCkgewogICAgICAgIHZhciBmb3VuZCA9IGNtLmZpbmRNYXJrcyhQb3MoZnJvbUxpbmUsIDApLCBQb3ModG9MaW5lICsgMSwgMCksIHJlY29nbml6ZU1hcmtlcigrbWFya2VySUQpKQogICAgICAgIGlmIChmb3VuZC5sZW5ndGggJiYgKHJhbmdlJCQxID0gZm91bmRbMF0uZmluZCgpKSkKICAgICAgICAgIHsgdGV4dCArPSBnZXRCZXR3ZWVuKGNtLmRvYywgcmFuZ2UkJDEuZnJvbSwgcmFuZ2UkJDEudG8pLmpvaW4obGluZVNlcCkgfQogICAgICAgIHJldHVybgogICAgICB9CiAgICAgIGlmIChub2RlLmdldEF0dHJpYnV0ZSgiY29udGVudGVkaXRhYmxlIikgPT0gImZhbHNlIikgeyByZXR1cm4gfQogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG5vZGUuY2hpbGROb2Rlcy5sZW5ndGg7IGkrKykKICAgICAgICB7IHdhbGsobm9kZS5jaGlsZE5vZGVzW2ldKSB9CiAgICAgIGlmICgvXihwcmV8ZGl2fHApJC9pLnRlc3Qobm9kZS5ub2RlTmFtZSkpCiAgICAgICAgeyBjbG9zaW5nID0gdHJ1ZSB9CiAgICB9IGVsc2UgaWYgKG5vZGUubm9kZVR5cGUgPT0gMykgewogICAgICB2YXIgdmFsID0gbm9kZS5ub2RlVmFsdWUKICAgICAgaWYgKCF2YWwpIHsgcmV0dXJuIH0KICAgICAgaWYgKGNsb3NpbmcpIHsKICAgICAgICB0ZXh0ICs9IGxpbmVTZXAKICAgICAgICBjbG9zaW5nID0gZmFsc2UKICAgICAgfQogICAgICB0ZXh0ICs9IHZhbAogICAgfQogIH0KICBmb3IgKDs7KSB7CiAgICB3YWxrKGZyb20pCiAgICBpZiAoZnJvbSA9PSB0bykgeyBicmVhayB9CiAgICBmcm9tID0gZnJvbS5uZXh0U2libGluZwogIH0KICByZXR1cm4gdGV4dAp9CgpmdW5jdGlvbiBkb21Ub1BvcyhjbSwgbm9kZSwgb2Zmc2V0KSB7CiAgdmFyIGxpbmVOb2RlCiAgaWYgKG5vZGUgPT0gY20uZGlzcGxheS5saW5lRGl2KSB7CiAgICBsaW5lTm9kZSA9IGNtLmRpc3BsYXkubGluZURpdi5jaGlsZE5vZGVzW29mZnNldF0KICAgIGlmICghbGluZU5vZGUpIHsgcmV0dXJuIGJhZFBvcyhjbS5jbGlwUG9zKFBvcyhjbS5kaXNwbGF5LnZpZXdUbyAtIDEpKSwgdHJ1ZSkgfQogICAgbm9kZSA9IG51bGw7IG9mZnNldCA9IDAKICB9IGVsc2UgewogICAgZm9yIChsaW5lTm9kZSA9IG5vZGU7OyBsaW5lTm9kZSA9IGxpbmVOb2RlLnBhcmVudE5vZGUpIHsKICAgICAgaWYgKCFsaW5lTm9kZSB8fCBsaW5lTm9kZSA9PSBjbS5kaXNwbGF5LmxpbmVEaXYpIHsgcmV0dXJuIG51bGwgfQogICAgICBpZiAobGluZU5vZGUucGFyZW50Tm9kZSAmJiBsaW5lTm9kZS5wYXJlbnROb2RlID09IGNtLmRpc3BsYXkubGluZURpdikgeyBicmVhayB9CiAgICB9CiAgfQogIGZvciAodmFyIGkgPSAwOyBpIDwgY20uZGlzcGxheS52aWV3Lmxlbmd0aDsgaSsrKSB7CiAgICB2YXIgbGluZVZpZXcgPSBjbS5kaXNwbGF5LnZpZXdbaV0KICAgIGlmIChsaW5lVmlldy5ub2RlID09IGxpbmVOb2RlKQogICAgICB7IHJldHVybiBsb2NhdGVOb2RlSW5MaW5lVmlldyhsaW5lVmlldywgbm9kZSwgb2Zmc2V0KSB9CiAgfQp9CgpmdW5jdGlvbiBsb2NhdGVOb2RlSW5MaW5lVmlldyhsaW5lVmlldywgbm9kZSwgb2Zmc2V0KSB7CiAgdmFyIHdyYXBwZXIgPSBsaW5lVmlldy50ZXh0LmZpcnN0Q2hpbGQsIGJhZCA9IGZhbHNlCiAgaWYgKCFub2RlIHx8ICFjb250YWlucyh3cmFwcGVyLCBub2RlKSkgeyByZXR1cm4gYmFkUG9zKFBvcyhsaW5lTm8obGluZVZpZXcubGluZSksIDApLCB0cnVlKSB9CiAgaWYgKG5vZGUgPT0gd3JhcHBlcikgewogICAgYmFkID0gdHJ1ZQogICAgbm9kZSA9IHdyYXBwZXIuY2hpbGROb2Rlc1tvZmZzZXRdCiAgICBvZmZzZXQgPSAwCiAgICBpZiAoIW5vZGUpIHsKICAgICAgdmFyIGxpbmUgPSBsaW5lVmlldy5yZXN0ID8gbHN0KGxpbmVWaWV3LnJlc3QpIDogbGluZVZpZXcubGluZQogICAgICByZXR1cm4gYmFkUG9zKFBvcyhsaW5lTm8obGluZSksIGxpbmUudGV4dC5sZW5ndGgpLCBiYWQpCiAgICB9CiAgfQoKICB2YXIgdGV4dE5vZGUgPSBub2RlLm5vZGVUeXBlID09IDMgPyBub2RlIDogbnVsbCwgdG9wTm9kZSA9IG5vZGUKICBpZiAoIXRleHROb2RlICYmIG5vZGUuY2hpbGROb2Rlcy5sZW5ndGggPT0gMSAmJiBub2RlLmZpcnN0Q2hpbGQubm9kZVR5cGUgPT0gMykgewogICAgdGV4dE5vZGUgPSBub2RlLmZpcnN0Q2hpbGQKICAgIGlmIChvZmZzZXQpIHsgb2Zmc2V0ID0gdGV4dE5vZGUubm9kZVZhbHVlLmxlbmd0aCB9CiAgfQogIHdoaWxlICh0b3BOb2RlLnBhcmVudE5vZGUgIT0gd3JhcHBlcikgeyB0b3BOb2RlID0gdG9wTm9kZS5wYXJlbnROb2RlIH0KICB2YXIgbWVhc3VyZSA9IGxpbmVWaWV3Lm1lYXN1cmUsIG1hcHMgPSBtZWFzdXJlLm1hcHMKCiAgZnVuY3Rpb24gZmluZCh0ZXh0Tm9kZSwgdG9wTm9kZSwgb2Zmc2V0KSB7CiAgICBmb3IgKHZhciBpID0gLTE7IGkgPCAobWFwcyA/IG1hcHMubGVuZ3RoIDogMCk7IGkrKykgewogICAgICB2YXIgbWFwJCQxID0gaSA8IDAgPyBtZWFzdXJlLm1hcCA6IG1hcHNbaV0KICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBtYXAkJDEubGVuZ3RoOyBqICs9IDMpIHsKICAgICAgICB2YXIgY3VyTm9kZSA9IG1hcCQkMVtqICsgMl0KICAgICAgICBpZiAoY3VyTm9kZSA9PSB0ZXh0Tm9kZSB8fCBjdXJOb2RlID09IHRvcE5vZGUpIHsKICAgICAgICAgIHZhciBsaW5lID0gbGluZU5vKGkgPCAwID8gbGluZVZpZXcubGluZSA6IGxpbmVWaWV3LnJlc3RbaV0pCiAgICAgICAgICB2YXIgY2ggPSBtYXAkJDFbal0gKyBvZmZzZXQKICAgICAgICAgIGlmIChvZmZzZXQgPCAwIHx8IGN1ck5vZGUgIT0gdGV4dE5vZGUpIHsgY2ggPSBtYXAkJDFbaiArIChvZmZzZXQgPyAxIDogMCldIH0KICAgICAgICAgIHJldHVybiBQb3MobGluZSwgY2gpCiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQogIHZhciBmb3VuZCA9IGZpbmQodGV4dE5vZGUsIHRvcE5vZGUsIG9mZnNldCkKICBpZiAoZm91bmQpIHsgcmV0dXJuIGJhZFBvcyhmb3VuZCwgYmFkKSB9CgogIC8vIEZJWE1FIHRoaXMgaXMgYWxsIHJlYWxseSBzaGFreS4gbWlnaHQgaGFuZGxlIHRoZSBmZXcgY2FzZXMgaXQgbmVlZHMgdG8gaGFuZGxlLCBidXQgbGlrZWx5IHRvIGNhdXNlIHByb2JsZW1zCiAgZm9yICh2YXIgYWZ0ZXIgPSB0b3BOb2RlLm5leHRTaWJsaW5nLCBkaXN0ID0gdGV4dE5vZGUgPyB0ZXh0Tm9kZS5ub2RlVmFsdWUubGVuZ3RoIC0gb2Zmc2V0IDogMDsgYWZ0ZXI7IGFmdGVyID0gYWZ0ZXIubmV4dFNpYmxpbmcpIHsKICAgIGZvdW5kID0gZmluZChhZnRlciwgYWZ0ZXIuZmlyc3RDaGlsZCwgMCkKICAgIGlmIChmb3VuZCkKICAgICAgeyByZXR1cm4gYmFkUG9zKFBvcyhmb3VuZC5saW5lLCBmb3VuZC5jaCAtIGRpc3QpLCBiYWQpIH0KICAgIGVsc2UKICAgICAgeyBkaXN0ICs9IGFmdGVyLnRleHRDb250ZW50Lmxlbmd0aCB9CiAgfQogIGZvciAodmFyIGJlZm9yZSA9IHRvcE5vZGUucHJldmlvdXNTaWJsaW5nLCBkaXN0JDEgPSBvZmZzZXQ7IGJlZm9yZTsgYmVmb3JlID0gYmVmb3JlLnByZXZpb3VzU2libGluZykgewogICAgZm91bmQgPSBmaW5kKGJlZm9yZSwgYmVmb3JlLmZpcnN0Q2hpbGQsIC0xKQogICAgaWYgKGZvdW5kKQogICAgICB7IHJldHVybiBiYWRQb3MoUG9zKGZvdW5kLmxpbmUsIGZvdW5kLmNoICsgZGlzdCQxKSwgYmFkKSB9CiAgICBlbHNlCiAgICAgIHsgZGlzdCQxICs9IGJlZm9yZS50ZXh0Q29udGVudC5sZW5ndGggfQogIH0KfQoKLy8gVEVYVEFSRUEgSU5QVVQgU1RZTEUKCmZ1bmN0aW9uIFRleHRhcmVhSW5wdXQoY20pIHsKICB0aGlzLmNtID0gY20KICAvLyBTZWUgaW5wdXQucG9sbCBhbmQgaW5wdXQucmVzZXQKICB0aGlzLnByZXZJbnB1dCA9ICIiCgogIC8vIEZsYWcgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciB3ZSBleHBlY3QgaW5wdXQgdG8gYXBwZWFyIHJlYWwgc29vbgogIC8vIG5vdyAoYWZ0ZXIgc29tZSBldmVudCBsaWtlICdrZXlwcmVzcycgb3IgJ2lucHV0JykgYW5kIGFyZQogIC8vIHBvbGxpbmcgaW50ZW5zaXZlbHkuCiAgdGhpcy5wb2xsaW5nRmFzdCA9IGZhbHNlCiAgLy8gU2VsZi1yZXNldHRpbmcgdGltZW91dCBmb3IgdGhlIHBvbGxlcgogIHRoaXMucG9sbGluZyA9IG5ldyBEZWxheWVkKCkKICAvLyBUcmFja3Mgd2hlbiBpbnB1dC5yZXNldCBoYXMgcHVudGVkIHRvIGp1c3QgcHV0dGluZyBhIHNob3J0CiAgLy8gc3RyaW5nIGludG8gdGhlIHRleHRhcmVhIGluc3RlYWQgb2YgdGhlIGZ1bGwgc2VsZWN0aW9uLgogIHRoaXMuaW5hY2N1cmF0ZVNlbGVjdGlvbiA9IGZhbHNlCiAgLy8gVXNlZCB0byB3b3JrIGFyb3VuZCBJRSBpc3N1ZSB3aXRoIHNlbGVjdGlvbiBiZWluZyBmb3Jnb3R0ZW4gd2hlbiBmb2N1cyBtb3ZlcyBhd2F5IGZyb20gdGV4dGFyZWEKICB0aGlzLmhhc1NlbGVjdGlvbiA9IGZhbHNlCiAgdGhpcy5jb21wb3NpbmcgPSBudWxsCn0KClRleHRhcmVhSW5wdXQucHJvdG90eXBlID0gY29weU9iaih7CiAgaW5pdDogZnVuY3Rpb24oZGlzcGxheSkgewogICAgdmFyIHRoaXMkMSA9IHRoaXM7CgogICAgdmFyIGlucHV0ID0gdGhpcywgY20gPSB0aGlzLmNtCgogICAgLy8gV3JhcHMgYW5kIGhpZGVzIGlucHV0IHRleHRhcmVhCiAgICB2YXIgZGl2ID0gdGhpcy53cmFwcGVyID0gaGlkZGVuVGV4dGFyZWEoKQogICAgLy8gVGhlIHNlbWloaWRkZW4gdGV4dGFyZWEgdGhhdCBpcyBmb2N1c2VkIHdoZW4gdGhlIGVkaXRvciBpcwogICAgLy8gZm9jdXNlZCwgYW5kIHJlY2VpdmVzIGlucHV0LgogICAgdmFyIHRlID0gdGhpcy50ZXh0YXJlYSA9IGRpdi5maXJzdENoaWxkCiAgICBkaXNwbGF5LndyYXBwZXIuaW5zZXJ0QmVmb3JlKGRpdiwgZGlzcGxheS53cmFwcGVyLmZpcnN0Q2hpbGQpCgogICAgLy8gTmVlZGVkIHRvIGhpZGUgYmlnIGJsdWUgYmxpbmtpbmcgY3Vyc29yIG9uIE1vYmlsZSBTYWZhcmkgKGRvZXNuJ3Qgc2VlbSB0byB3b3JrIGluIGlPUyA4IGFueW1vcmUpCiAgICBpZiAoaW9zKSB7IHRlLnN0eWxlLndpZHRoID0gIjBweCIgfQoKICAgIG9uKHRlLCAiaW5wdXQiLCBmdW5jdGlvbiAoKSB7CiAgICAgIGlmIChpZSAmJiBpZV92ZXJzaW9uID49IDkgJiYgdGhpcyQxLmhhc1NlbGVjdGlvbikgeyB0aGlzJDEuaGFzU2VsZWN0aW9uID0gbnVsbCB9CiAgICAgIGlucHV0LnBvbGwoKQogICAgfSkKCiAgICBvbih0ZSwgInBhc3RlIiwgZnVuY3Rpb24gKGUpIHsKICAgICAgaWYgKHNpZ25hbERPTUV2ZW50KGNtLCBlKSB8fCBoYW5kbGVQYXN0ZShlLCBjbSkpIHsgcmV0dXJuIH0KCiAgICAgIGNtLnN0YXRlLnBhc3RlSW5jb21pbmcgPSB0cnVlCiAgICAgIGlucHV0LmZhc3RQb2xsKCkKICAgIH0pCgogICAgZnVuY3Rpb24gcHJlcGFyZUNvcHlDdXQoZSkgewogICAgICBpZiAoc2lnbmFsRE9NRXZlbnQoY20sIGUpKSB7IHJldHVybiB9CiAgICAgIGlmIChjbS5zb21ldGhpbmdTZWxlY3RlZCgpKSB7CiAgICAgICAgc2V0TGFzdENvcGllZCh7bGluZVdpc2U6IGZhbHNlLCB0ZXh0OiBjbS5nZXRTZWxlY3Rpb25zKCl9KQogICAgICAgIGlmIChpbnB1dC5pbmFjY3VyYXRlU2VsZWN0aW9uKSB7CiAgICAgICAgICBpbnB1dC5wcmV2SW5wdXQgPSAiIgogICAgICAgICAgaW5wdXQuaW5hY2N1cmF0ZVNlbGVjdGlvbiA9IGZhbHNlCiAgICAgICAgICB0ZS52YWx1ZSA9IGxhc3RDb3BpZWQudGV4dC5qb2luKCJcbiIpCiAgICAgICAgICBzZWxlY3RJbnB1dCh0ZSkKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoIWNtLm9wdGlvbnMubGluZVdpc2VDb3B5Q3V0KSB7CiAgICAgICAgcmV0dXJuCiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIHJhbmdlcyA9IGNvcHlhYmxlUmFuZ2VzKGNtKQogICAgICAgIHNldExhc3RDb3BpZWQoe2xpbmVXaXNlOiB0cnVlLCB0ZXh0OiByYW5nZXMudGV4dH0pCiAgICAgICAgaWYgKGUudHlwZSA9PSAiY3V0IikgewogICAgICAgICAgY20uc2V0U2VsZWN0aW9ucyhyYW5nZXMucmFuZ2VzLCBudWxsLCBzZWxfZG9udFNjcm9sbCkKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaW5wdXQucHJldklucHV0ID0gIiIKICAgICAgICAgIHRlLnZhbHVlID0gcmFuZ2VzLnRleHQuam9pbigiXG4iKQogICAgICAgICAgc2VsZWN0SW5wdXQodGUpCiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChlLnR5cGUgPT0gImN1dCIpIHsgY20uc3RhdGUuY3V0SW5jb21pbmcgPSB0cnVlIH0KICAgIH0KICAgIG9uKHRlLCAiY3V0IiwgcHJlcGFyZUNvcHlDdXQpCiAgICBvbih0ZSwgImNvcHkiLCBwcmVwYXJlQ29weUN1dCkKCiAgICBvbihkaXNwbGF5LnNjcm9sbGVyLCAicGFzdGUiLCBmdW5jdGlvbiAoZSkgewogICAgICBpZiAoZXZlbnRJbldpZGdldChkaXNwbGF5LCBlKSB8fCBzaWduYWxET01FdmVudChjbSwgZSkpIHsgcmV0dXJuIH0KICAgICAgY20uc3RhdGUucGFzdGVJbmNvbWluZyA9IHRydWUKICAgICAgaW5wdXQuZm9jdXMoKQogICAgfSkKCiAgICAvLyBQcmV2ZW50IG5vcm1hbCBzZWxlY3Rpb24gaW4gdGhlIGVkaXRvciAod2UgaGFuZGxlIG91ciBvd24pCiAgICBvbihkaXNwbGF5LmxpbmVTcGFjZSwgInNlbGVjdHN0YXJ0IiwgZnVuY3Rpb24gKGUpIHsKICAgICAgaWYgKCFldmVudEluV2lkZ2V0KGRpc3BsYXksIGUpKSB7IGVfcHJldmVudERlZmF1bHQoZSkgfQogICAgfSkKCiAgICBvbih0ZSwgImNvbXBvc2l0aW9uc3RhcnQiLCBmdW5jdGlvbiAoKSB7CiAgICAgIHZhciBzdGFydCA9IGNtLmdldEN1cnNvcigiZnJvbSIpCiAgICAgIGlmIChpbnB1dC5jb21wb3NpbmcpIHsgaW5wdXQuY29tcG9zaW5nLnJhbmdlLmNsZWFyKCkgfQogICAgICBpbnB1dC5jb21wb3NpbmcgPSB7CiAgICAgICAgc3RhcnQ6IHN0YXJ0LAogICAgICAgIHJhbmdlOiBjbS5tYXJrVGV4dChzdGFydCwgY20uZ2V0Q3Vyc29yKCJ0byIpLCB7Y2xhc3NOYW1lOiAiQ29kZU1pcnJvci1jb21wb3NpbmcifSkKICAgICAgfQogICAgfSkKICAgIG9uKHRlLCAiY29tcG9zaXRpb25lbmQiLCBmdW5jdGlvbiAoKSB7CiAgICAgIGlmIChpbnB1dC5jb21wb3NpbmcpIHsKICAgICAgICBpbnB1dC5wb2xsKCkKICAgICAgICBpbnB1dC5jb21wb3NpbmcucmFuZ2UuY2xlYXIoKQogICAgICAgIGlucHV0LmNvbXBvc2luZyA9IG51bGwKICAgICAgfQogICAgfSkKICB9LAoKICBwcmVwYXJlU2VsZWN0aW9uOiBmdW5jdGlvbigpIHsKICAgIC8vIFJlZHJhdyB0aGUgc2VsZWN0aW9uIGFuZC9vciBjdXJzb3IKICAgIHZhciBjbSA9IHRoaXMuY20sIGRpc3BsYXkgPSBjbS5kaXNwbGF5LCBkb2MgPSBjbS5kb2MKICAgIHZhciByZXN1bHQgPSBwcmVwYXJlU2VsZWN0aW9uKGNtKQoKICAgIC8vIE1vdmUgdGhlIGhpZGRlbiB0ZXh0YXJlYSBuZWFyIHRoZSBjdXJzb3IgdG8gcHJldmVudCBzY3JvbGxpbmcgYXJ0aWZhY3RzCiAgICBpZiAoY20ub3B0aW9ucy5tb3ZlSW5wdXRXaXRoQ3Vyc29yKSB7CiAgICAgIHZhciBoZWFkUG9zID0gY3Vyc29yQ29vcmRzKGNtLCBkb2Muc2VsLnByaW1hcnkoKS5oZWFkLCAiZGl2IikKICAgICAgdmFyIHdyYXBPZmYgPSBkaXNwbGF5LndyYXBwZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIGxpbmVPZmYgPSBkaXNwbGF5LmxpbmVEaXYuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkKICAgICAgcmVzdWx0LnRlVG9wID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oZGlzcGxheS53cmFwcGVyLmNsaWVudEhlaWdodCAtIDEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkUG9zLnRvcCArIGxpbmVPZmYudG9wIC0gd3JhcE9mZi50b3ApKQogICAgICByZXN1bHQudGVMZWZ0ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oZGlzcGxheS53cmFwcGVyLmNsaWVudFdpZHRoIC0gMTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkUG9zLmxlZnQgKyBsaW5lT2ZmLmxlZnQgLSB3cmFwT2ZmLmxlZnQpKQogICAgfQoKICAgIHJldHVybiByZXN1bHQKICB9LAoKICBzaG93U2VsZWN0aW9uOiBmdW5jdGlvbihkcmF3bikgewogICAgdmFyIGNtID0gdGhpcy5jbSwgZGlzcGxheSA9IGNtLmRpc3BsYXkKICAgIHJlbW92ZUNoaWxkcmVuQW5kQWRkKGRpc3BsYXkuY3Vyc29yRGl2LCBkcmF3bi5jdXJzb3JzKQogICAgcmVtb3ZlQ2hpbGRyZW5BbmRBZGQoZGlzcGxheS5zZWxlY3Rpb25EaXYsIGRyYXduLnNlbGVjdGlvbikKICAgIGlmIChkcmF3bi50ZVRvcCAhPSBudWxsKSB7CiAgICAgIHRoaXMud3JhcHBlci5zdHlsZS50b3AgPSBkcmF3bi50ZVRvcCArICJweCIKICAgICAgdGhpcy53cmFwcGVyLnN0eWxlLmxlZnQgPSBkcmF3bi50ZUxlZnQgKyAicHgiCiAgICB9CiAgfSwKCiAgLy8gUmVzZXQgdGhlIGlucHV0IHRvIGNvcnJlc3BvbmQgdG8gdGhlIHNlbGVjdGlvbiAob3IgdG8gYmUgZW1wdHksCiAgLy8gd2hlbiBub3QgdHlwaW5nIGFuZCBub3RoaW5nIGlzIHNlbGVjdGVkKQogIHJlc2V0OiBmdW5jdGlvbih0eXBpbmcpIHsKICAgIGlmICh0aGlzLmNvbnRleHRNZW51UGVuZGluZykgeyByZXR1cm4gfQogICAgdmFyIG1pbmltYWwsIHNlbGVjdGVkLCBjbSA9IHRoaXMuY20sIGRvYyA9IGNtLmRvYwogICAgaWYgKGNtLnNvbWV0aGluZ1NlbGVjdGVkKCkpIHsKICAgICAgdGhpcy5wcmV2SW5wdXQgPSAiIgogICAgICB2YXIgcmFuZ2UkJDEgPSBkb2Muc2VsLnByaW1hcnkoKQogICAgICBtaW5pbWFsID0gaGFzQ29weUV2ZW50ICYmCiAgICAgICAgKHJhbmdlJCQxLnRvKCkubGluZSAtIHJhbmdlJCQxLmZyb20oKS5saW5lID4gMTAwIHx8IChzZWxlY3RlZCA9IGNtLmdldFNlbGVjdGlvbigpKS5sZW5ndGggPiAxMDAwKQogICAgICB2YXIgY29udGVudCA9IG1pbmltYWwgPyAiLSIgOiBzZWxlY3RlZCB8fCBjbS5nZXRTZWxlY3Rpb24oKQogICAgICB0aGlzLnRleHRhcmVhLnZhbHVlID0gY29udGVudAogICAgICBpZiAoY20uc3RhdGUuZm9jdXNlZCkgeyBzZWxlY3RJbnB1dCh0aGlzLnRleHRhcmVhKSB9CiAgICAgIGlmIChpZSAmJiBpZV92ZXJzaW9uID49IDkpIHsgdGhpcy5oYXNTZWxlY3Rpb24gPSBjb250ZW50IH0KICAgIH0gZWxzZSBpZiAoIXR5cGluZykgewogICAgICB0aGlzLnByZXZJbnB1dCA9IHRoaXMudGV4dGFyZWEudmFsdWUgPSAiIgogICAgICBpZiAoaWUgJiYgaWVfdmVyc2lvbiA+PSA5KSB7IHRoaXMuaGFzU2VsZWN0aW9uID0gbnVsbCB9CiAgICB9CiAgICB0aGlzLmluYWNjdXJhdGVTZWxlY3Rpb24gPSBtaW5pbWFsCiAgfSwKCiAgZ2V0RmllbGQ6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy50ZXh0YXJlYSB9LAoKICBzdXBwb3J0c1RvdWNoOiBmdW5jdGlvbigpIHsgcmV0dXJuIGZhbHNlIH0sCgogIGZvY3VzOiBmdW5jdGlvbigpIHsKICAgIGlmICh0aGlzLmNtLm9wdGlvbnMucmVhZE9ubHkgIT0gIm5vY3Vyc29yIiAmJiAoIW1vYmlsZSB8fCBhY3RpdmVFbHQoKSAhPSB0aGlzLnRleHRhcmVhKSkgewogICAgICB0cnkgeyB0aGlzLnRleHRhcmVhLmZvY3VzKCkgfQogICAgICBjYXRjaCAoZSkge30gLy8gSUU4IHdpbGwgdGhyb3cgaWYgdGhlIHRleHRhcmVhIGlzIGRpc3BsYXk6IG5vbmUgb3Igbm90IGluIERPTQogICAgfQogIH0sCgogIGJsdXI6IGZ1bmN0aW9uKCkgeyB0aGlzLnRleHRhcmVhLmJsdXIoKSB9LAoKICByZXNldFBvc2l0aW9uOiBmdW5jdGlvbigpIHsKICAgIHRoaXMud3JhcHBlci5zdHlsZS50b3AgPSB0aGlzLndyYXBwZXIuc3R5bGUubGVmdCA9IDAKICB9LAoKICByZWNlaXZlZEZvY3VzOiBmdW5jdGlvbigpIHsgdGhpcy5zbG93UG9sbCgpIH0sCgogIC8vIFBvbGwgZm9yIGlucHV0IGNoYW5nZXMsIHVzaW5nIHRoZSBub3JtYWwgcmF0ZSBvZiBwb2xsaW5nLiBUaGlzCiAgLy8gcnVucyBhcyBsb25nIGFzIHRoZSBlZGl0b3IgaXMgZm9jdXNlZC4KICBzbG93UG9sbDogZnVuY3Rpb24oKSB7CiAgICB2YXIgdGhpcyQxID0gdGhpczsKCiAgICBpZiAodGhpcy5wb2xsaW5nRmFzdCkgeyByZXR1cm4gfQogICAgdGhpcy5wb2xsaW5nLnNldCh0aGlzLmNtLm9wdGlvbnMucG9sbEludGVydmFsLCBmdW5jdGlvbiAoKSB7CiAgICAgIHRoaXMkMS5wb2xsKCkKICAgICAgaWYgKHRoaXMkMS5jbS5zdGF0ZS5mb2N1c2VkKSB7IHRoaXMkMS5zbG93UG9sbCgpIH0KICAgIH0pCiAgfSwKCiAgLy8gV2hlbiBhbiBldmVudCBoYXMganVzdCBjb21lIGluIHRoYXQgaXMgbGlrZWx5IHRvIGFkZCBvciBjaGFuZ2UKICAvLyBzb21ldGhpbmcgaW4gdGhlIGlucHV0IHRleHRhcmVhLCB3ZSBwb2xsIGZhc3RlciwgdG8gZW5zdXJlIHRoYXQKICAvLyB0aGUgY2hhbmdlIGFwcGVhcnMgb24gdGhlIHNjcmVlbiBxdWlja2x5LgogIGZhc3RQb2xsOiBmdW5jdGlvbigpIHsKICAgIHZhciBtaXNzZWQgPSBmYWxzZSwgaW5wdXQgPSB0aGlzCiAgICBpbnB1dC5wb2xsaW5nRmFzdCA9IHRydWUKICAgIGZ1bmN0aW9uIHAoKSB7CiAgICAgIHZhciBjaGFuZ2VkID0gaW5wdXQucG9sbCgpCiAgICAgIGlmICghY2hhbmdlZCAmJiAhbWlzc2VkKSB7bWlzc2VkID0gdHJ1ZTsgaW5wdXQucG9sbGluZy5zZXQoNjAsIHApfQogICAgICBlbHNlIHtpbnB1dC5wb2xsaW5nRmFzdCA9IGZhbHNlOyBpbnB1dC5zbG93UG9sbCgpfQogICAgfQogICAgaW5wdXQucG9sbGluZy5zZXQoMjAsIHApCiAgfSwKCiAgLy8gUmVhZCBpbnB1dCBmcm9tIHRoZSB0ZXh0YXJlYSwgYW5kIHVwZGF0ZSB0aGUgZG9jdW1lbnQgdG8gbWF0Y2guCiAgLy8gV2hlbiBzb21ldGhpbmcgaXMgc2VsZWN0ZWQsIGl0IGlzIHByZXNlbnQgaW4gdGhlIHRleHRhcmVhLCBhbmQKICAvLyBzZWxlY3RlZCAodW5sZXNzIGl0IGlzIGh1Z2UsIGluIHdoaWNoIGNhc2UgYSBwbGFjZWhvbGRlciBpcwogIC8vIHVzZWQpLiBXaGVuIG5vdGhpbmcgaXMgc2VsZWN0ZWQsIHRoZSBjdXJzb3Igc2l0cyBhZnRlciBwcmV2aW91c2x5CiAgLy8gc2VlbiB0ZXh0IChjYW4gYmUgZW1wdHkpLCB3aGljaCBpcyBzdG9yZWQgaW4gcHJldklucHV0ICh3ZSBtdXN0CiAgLy8gbm90IHJlc2V0IHRoZSB0ZXh0YXJlYSB3aGVuIHR5cGluZywgYmVjYXVzZSB0aGF0IGJyZWFrcyBJTUUpLgogIHBvbGw6IGZ1bmN0aW9uKCkgewogICAgdmFyIHRoaXMkMSA9IHRoaXM7CgogICAgdmFyIGNtID0gdGhpcy5jbSwgaW5wdXQgPSB0aGlzLnRleHRhcmVhLCBwcmV2SW5wdXQgPSB0aGlzLnByZXZJbnB1dAogICAgLy8gU2luY2UgdGhpcyBpcyBjYWxsZWQgYSAqbG90KiwgdHJ5IHRvIGJhaWwgb3V0IGFzIGNoZWFwbHkgYXMKICAgIC8vIHBvc3NpYmxlIHdoZW4gaXQgaXMgY2xlYXIgdGhhdCBub3RoaW5nIGhhcHBlbmVkLiBoYXNTZWxlY3Rpb24KICAgIC8vIHdpbGwgYmUgdGhlIGNhc2Ugd2hlbiB0aGVyZSBpcyBhIGxvdCBvZiB0ZXh0IGluIHRoZSB0ZXh0YXJlYSwKICAgIC8vIGluIHdoaWNoIGNhc2UgcmVhZGluZyBpdHMgdmFsdWUgd291bGQgYmUgZXhwZW5zaXZlLgogICAgaWYgKHRoaXMuY29udGV4dE1lbnVQZW5kaW5nIHx8ICFjbS5zdGF0ZS5mb2N1c2VkIHx8CiAgICAgICAgKGhhc1NlbGVjdGlvbihpbnB1dCkgJiYgIXByZXZJbnB1dCAmJiAhdGhpcy5jb21wb3NpbmcpIHx8CiAgICAgICAgY20uaXNSZWFkT25seSgpIHx8IGNtLm9wdGlvbnMuZGlzYWJsZUlucHV0IHx8IGNtLnN0YXRlLmtleVNlcSkKICAgICAgeyByZXR1cm4gZmFsc2UgfQoKICAgIHZhciB0ZXh0ID0gaW5wdXQudmFsdWUKICAgIC8vIElmIG5vdGhpbmcgY2hhbmdlZCwgYmFpbC4KICAgIGlmICh0ZXh0ID09IHByZXZJbnB1dCAmJiAhY20uc29tZXRoaW5nU2VsZWN0ZWQoKSkgeyByZXR1cm4gZmFsc2UgfQogICAgLy8gV29yayBhcm91bmQgbm9uc2Vuc2ljYWwgc2VsZWN0aW9uIHJlc2V0dGluZyBpbiBJRTkvMTAsIGFuZAogICAgLy8gaW5leHBsaWNhYmxlIGFwcGVhcmFuY2Ugb2YgcHJpdmF0ZSBhcmVhIHVuaWNvZGUgY2hhcmFjdGVycyBvbgogICAgLy8gc29tZSBrZXkgY29tYm9zIGluIE1hYyAoIzI2ODkpLgogICAgaWYgKGllICYmIGllX3ZlcnNpb24gPj0gOSAmJiB0aGlzLmhhc1NlbGVjdGlvbiA9PT0gdGV4dCB8fAogICAgICAgIG1hYyAmJiAvW1x1ZjcwMC1cdWY3ZmZdLy50ZXN0KHRleHQpKSB7CiAgICAgIGNtLmRpc3BsYXkuaW5wdXQucmVzZXQoKQogICAgICByZXR1cm4gZmFsc2UKICAgIH0KCiAgICBpZiAoY20uZG9jLnNlbCA9PSBjbS5kaXNwbGF5LnNlbEZvckNvbnRleHRNZW51KSB7CiAgICAgIHZhciBmaXJzdCA9IHRleHQuY2hhckNvZGVBdCgwKQogICAgICBpZiAoZmlyc3QgPT0gMHgyMDBiICYmICFwcmV2SW5wdXQpIHsgcHJldklucHV0ID0gIlx1MjAwYiIgfQogICAgICBpZiAoZmlyc3QgPT0gMHgyMWRhKSB7IHRoaXMucmVzZXQoKTsgcmV0dXJuIHRoaXMuY20uZXhlY0NvbW1hbmQoInVuZG8iKSB9CiAgICB9CiAgICAvLyBGaW5kIHRoZSBwYXJ0IG9mIHRoZSBpbnB1dCB0aGF0IGlzIGFjdHVhbGx5IG5ldwogICAgdmFyIHNhbWUgPSAwLCBsID0gTWF0aC5taW4ocHJldklucHV0Lmxlbmd0aCwgdGV4dC5sZW5ndGgpCiAgICB3aGlsZSAoc2FtZSA8IGwgJiYgcHJldklucHV0LmNoYXJDb2RlQXQoc2FtZSkgPT0gdGV4dC5jaGFyQ29kZUF0KHNhbWUpKSB7ICsrc2FtZSB9CgogICAgcnVuSW5PcChjbSwgZnVuY3Rpb24gKCkgewogICAgICBhcHBseVRleHRJbnB1dChjbSwgdGV4dC5zbGljZShzYW1lKSwgcHJldklucHV0Lmxlbmd0aCAtIHNhbWUsCiAgICAgICAgICAgICAgICAgICAgIG51bGwsIHRoaXMkMS5jb21wb3NpbmcgPyAiKmNvbXBvc2UiIDogbnVsbCkKCiAgICAgIC8vIERvbid0IGxlYXZlIGxvbmcgdGV4dCBpbiB0aGUgdGV4dGFyZWEsIHNpbmNlIGl0IG1ha2VzIGZ1cnRoZXIgcG9sbGluZyBzbG93CiAgICAgIGlmICh0ZXh0Lmxlbmd0aCA+IDEwMDAgfHwgdGV4dC5pbmRleE9mKCJcbiIpID4gLTEpIHsgaW5wdXQudmFsdWUgPSB0aGlzJDEucHJldklucHV0ID0gIiIgfQogICAgICBlbHNlIHsgdGhpcyQxLnByZXZJbnB1dCA9IHRleHQgfQoKICAgICAgaWYgKHRoaXMkMS5jb21wb3NpbmcpIHsKICAgICAgICB0aGlzJDEuY29tcG9zaW5nLnJhbmdlLmNsZWFyKCkKICAgICAgICB0aGlzJDEuY29tcG9zaW5nLnJhbmdlID0gY20ubWFya1RleHQodGhpcyQxLmNvbXBvc2luZy5zdGFydCwgY20uZ2V0Q3Vyc29yKCJ0byIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogIkNvZGVNaXJyb3ItY29tcG9zaW5nIn0pCiAgICAgIH0KICAgIH0pCiAgICByZXR1cm4gdHJ1ZQogIH0sCgogIGVuc3VyZVBvbGxlZDogZnVuY3Rpb24oKSB7CiAgICBpZiAodGhpcy5wb2xsaW5nRmFzdCAmJiB0aGlzLnBvbGwoKSkgeyB0aGlzLnBvbGxpbmdGYXN0ID0gZmFsc2UgfQogIH0sCgogIG9uS2V5UHJlc3M6IGZ1bmN0aW9uKCkgewogICAgaWYgKGllICYmIGllX3ZlcnNpb24gPj0gOSkgeyB0aGlzLmhhc1NlbGVjdGlvbiA9IG51bGwgfQogICAgdGhpcy5mYXN0UG9sbCgpCiAgfSwKCiAgb25Db250ZXh0TWVudTogZnVuY3Rpb24oZSkgewogICAgdmFyIGlucHV0ID0gdGhpcywgY20gPSBpbnB1dC5jbSwgZGlzcGxheSA9IGNtLmRpc3BsYXksIHRlID0gaW5wdXQudGV4dGFyZWEKICAgIHZhciBwb3MgPSBwb3NGcm9tTW91c2UoY20sIGUpLCBzY3JvbGxQb3MgPSBkaXNwbGF5LnNjcm9sbGVyLnNjcm9sbFRvcAogICAgaWYgKCFwb3MgfHwgcHJlc3RvKSB7IHJldHVybiB9IC8vIE9wZXJhIGlzIGRpZmZpY3VsdC4KCiAgICAvLyBSZXNldCB0aGUgY3VycmVudCB0ZXh0IHNlbGVjdGlvbiBvbmx5IGlmIHRoZSBjbGljayBpcyBkb25lIG91dHNpZGUgb2YgdGhlIHNlbGVjdGlvbgogICAgLy8gYW5kICdyZXNldFNlbGVjdGlvbk9uQ29udGV4dE1lbnUnIG9wdGlvbiBpcyB0cnVlLgogICAgdmFyIHJlc2V0ID0gY20ub3B0aW9ucy5yZXNldFNlbGVjdGlvbk9uQ29udGV4dE1lbnUKICAgIGlmIChyZXNldCAmJiBjbS5kb2Muc2VsLmNvbnRhaW5zKHBvcykgPT0gLTEpCiAgICAgIHsgb3BlcmF0aW9uKGNtLCBzZXRTZWxlY3Rpb24pKGNtLmRvYywgc2ltcGxlU2VsZWN0aW9uKHBvcyksIHNlbF9kb250U2Nyb2xsKSB9CgogICAgdmFyIG9sZENTUyA9IHRlLnN0eWxlLmNzc1RleHQsIG9sZFdyYXBwZXJDU1MgPSBpbnB1dC53cmFwcGVyLnN0eWxlLmNzc1RleHQKICAgIGlucHV0LndyYXBwZXIuc3R5bGUuY3NzVGV4dCA9ICJwb3NpdGlvbjogYWJzb2x1dGUiCiAgICB2YXIgd3JhcHBlckJveCA9IGlucHV0LndyYXBwZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkKICAgIHRlLnN0eWxlLmNzc1RleHQgPSAicG9zaXRpb246IGFic29sdXRlOyB3aWR0aDogMzBweDsgaGVpZ2h0OiAzMHB4O1xuICAgICAgdG9wOiAiICsgKGUuY2xpZW50WSAtIHdyYXBwZXJCb3gudG9wIC0gNSkgKyAicHg7IGxlZnQ6ICIgKyAoZS5jbGllbnRYIC0gd3JhcHBlckJveC5sZWZ0IC0gNSkgKyAicHg7XG4gICAgICB6LWluZGV4OiAxMDAwOyBiYWNrZ3JvdW5kOiAiICsgKGllID8gInJnYmEoMjU1LCAyNTUsIDI1NSwgLjA1KSIgOiAidHJhbnNwYXJlbnQiKSArICI7XG4gICAgICBvdXRsaW5lOiBub25lOyBib3JkZXItd2lkdGg6IDA7IG91dGxpbmU6IG5vbmU7IG92ZXJmbG93OiBoaWRkZW47IG9wYWNpdHk6IC4wNTsgZmlsdGVyOiBhbHBoYShvcGFjaXR5PTUpOyIKICAgIHZhciBvbGRTY3JvbGxZCiAgICBpZiAod2Via2l0KSB7IG9sZFNjcm9sbFkgPSB3aW5kb3cuc2Nyb2xsWSB9IC8vIFdvcmsgYXJvdW5kIENocm9tZSBpc3N1ZSAoIzI3MTIpCiAgICBkaXNwbGF5LmlucHV0LmZvY3VzKCkKICAgIGlmICh3ZWJraXQpIHsgd2luZG93LnNjcm9sbFRvKG51bGwsIG9sZFNjcm9sbFkpIH0KICAgIGRpc3BsYXkuaW5wdXQucmVzZXQoKQogICAgLy8gQWRkcyAiU2VsZWN0IGFsbCIgdG8gY29udGV4dCBtZW51IGluIEZGCiAgICBpZiAoIWNtLnNvbWV0aGluZ1NlbGVjdGVkKCkpIHsgdGUudmFsdWUgPSBpbnB1dC5wcmV2SW5wdXQgPSAiICIgfQogICAgaW5wdXQuY29udGV4dE1lbnVQZW5kaW5nID0gdHJ1ZQogICAgZGlzcGxheS5zZWxGb3JDb250ZXh0TWVudSA9IGNtLmRvYy5zZWwKICAgIGNsZWFyVGltZW91dChkaXNwbGF5LmRldGVjdGluZ1NlbGVjdEFsbCkKCiAgICAvLyBTZWxlY3QtYWxsIHdpbGwgYmUgZ3JleWVkIG91dCBpZiB0aGVyZSdzIG5vdGhpbmcgdG8gc2VsZWN0LCBzbwogICAgLy8gdGhpcyBhZGRzIGEgemVyby13aWR0aCBzcGFjZSBzbyB0aGF0IHdlIGNhbiBsYXRlciBjaGVjayB3aGV0aGVyCiAgICAvLyBpdCBnb3Qgc2VsZWN0ZWQuCiAgICBmdW5jdGlvbiBwcmVwYXJlU2VsZWN0QWxsSGFjaygpIHsKICAgICAgaWYgKHRlLnNlbGVjdGlvblN0YXJ0ICE9IG51bGwpIHsKICAgICAgICB2YXIgc2VsZWN0ZWQgPSBjbS5zb21ldGhpbmdTZWxlY3RlZCgpCiAgICAgICAgdmFyIGV4dHZhbCA9ICJcdTIwMGIiICsgKHNlbGVjdGVkID8gdGUudmFsdWUgOiAiIikKICAgICAgICB0ZS52YWx1ZSA9ICJcdTIxZGEiIC8vIFVzZWQgdG8gY2F0Y2ggY29udGV4dC1tZW51IHVuZG8KICAgICAgICB0ZS52YWx1ZSA9IGV4dHZhbAogICAgICAgIGlucHV0LnByZXZJbnB1dCA9IHNlbGVjdGVkID8gIiIgOiAiXHUyMDBiIgogICAgICAgIHRlLnNlbGVjdGlvblN0YXJ0ID0gMTsgdGUuc2VsZWN0aW9uRW5kID0gZXh0dmFsLmxlbmd0aAogICAgICAgIC8vIFJlLXNldCB0aGlzLCBpbiBjYXNlIHNvbWUgb3RoZXIgaGFuZGxlciB0b3VjaGVkIHRoZQogICAgICAgIC8vIHNlbGVjdGlvbiBpbiB0aGUgbWVhbnRpbWUuCiAgICAgICAgZGlzcGxheS5zZWxGb3JDb250ZXh0TWVudSA9IGNtLmRvYy5zZWwKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gcmVoaWRlKCkgewogICAgICBpbnB1dC5jb250ZXh0TWVudVBlbmRpbmcgPSBmYWxzZQogICAgICBpbnB1dC53cmFwcGVyLnN0eWxlLmNzc1RleHQgPSBvbGRXcmFwcGVyQ1NTCiAgICAgIHRlLnN0eWxlLmNzc1RleHQgPSBvbGRDU1MKICAgICAgaWYgKGllICYmIGllX3ZlcnNpb24gPCA5KSB7IGRpc3BsYXkuc2Nyb2xsYmFycy5zZXRTY3JvbGxUb3AoZGlzcGxheS5zY3JvbGxlci5zY3JvbGxUb3AgPSBzY3JvbGxQb3MpIH0KCiAgICAgIC8vIFRyeSB0byBkZXRlY3QgdGhlIHVzZXIgY2hvb3Npbmcgc2VsZWN0LWFsbAogICAgICBpZiAodGUuc2VsZWN0aW9uU3RhcnQgIT0gbnVsbCkgewogICAgICAgIGlmICghaWUgfHwgKGllICYmIGllX3ZlcnNpb24gPCA5KSkgeyBwcmVwYXJlU2VsZWN0QWxsSGFjaygpIH0KICAgICAgICB2YXIgaSA9IDAsIHBvbGwgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBpZiAoZGlzcGxheS5zZWxGb3JDb250ZXh0TWVudSA9PSBjbS5kb2Muc2VsICYmIHRlLnNlbGVjdGlvblN0YXJ0ID09IDAgJiYKICAgICAgICAgICAgICB0ZS5zZWxlY3Rpb25FbmQgPiAwICYmIGlucHV0LnByZXZJbnB1dCA9PSAiXHUyMDBiIikKICAgICAgICAgICAgeyBvcGVyYXRpb24oY20sIHNlbGVjdEFsbCkoY20pIH0KICAgICAgICAgIGVsc2UgaWYgKGkrKyA8IDEwKSB7IGRpc3BsYXkuZGV0ZWN0aW5nU2VsZWN0QWxsID0gc2V0VGltZW91dChwb2xsLCA1MDApIH0KICAgICAgICAgIGVsc2UgeyBkaXNwbGF5LmlucHV0LnJlc2V0KCkgfQogICAgICAgIH0KICAgICAgICBkaXNwbGF5LmRldGVjdGluZ1NlbGVjdEFsbCA9IHNldFRpbWVvdXQocG9sbCwgMjAwKQogICAgICB9CiAgICB9CgogICAgaWYgKGllICYmIGllX3ZlcnNpb24gPj0gOSkgeyBwcmVwYXJlU2VsZWN0QWxsSGFjaygpIH0KICAgIGlmIChjYXB0dXJlUmlnaHRDbGljaykgewogICAgICBlX3N0b3AoZSkKICAgICAgdmFyIG1vdXNldXAgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgb2ZmKHdpbmRvdywgIm1vdXNldXAiLCBtb3VzZXVwKQogICAgICAgIHNldFRpbWVvdXQocmVoaWRlLCAyMCkKICAgICAgfQogICAgICBvbih3aW5kb3csICJtb3VzZXVwIiwgbW91c2V1cCkKICAgIH0gZWxzZSB7CiAgICAgIHNldFRpbWVvdXQocmVoaWRlLCA1MCkKICAgIH0KICB9LAoKICByZWFkT25seUNoYW5nZWQ6IGZ1bmN0aW9uKHZhbCkgewogICAgaWYgKCF2YWwpIHsgdGhpcy5yZXNldCgpIH0KICB9LAoKICBzZXRVbmVkaXRhYmxlOiBub3RoaW5nLAoKICBuZWVkc0NvbnRlbnRBdHRyaWJ1dGU6IGZhbHNlCn0sIFRleHRhcmVhSW5wdXQucHJvdG90eXBlKQoKZnVuY3Rpb24gZnJvbVRleHRBcmVhKHRleHRhcmVhLCBvcHRpb25zKSB7CiAgb3B0aW9ucyA9IG9wdGlvbnMgPyBjb3B5T2JqKG9wdGlvbnMpIDoge30KICBvcHRpb25zLnZhbHVlID0gdGV4dGFyZWEudmFsdWUKICBpZiAoIW9wdGlvbnMudGFiaW5kZXggJiYgdGV4dGFyZWEudGFiSW5kZXgpCiAgICB7IG9wdGlvbnMudGFiaW5kZXggPSB0ZXh0YXJlYS50YWJJbmRleCB9CiAgaWYgKCFvcHRpb25zLnBsYWNlaG9sZGVyICYmIHRleHRhcmVhLnBsYWNlaG9sZGVyKQogICAgeyBvcHRpb25zLnBsYWNlaG9sZGVyID0gdGV4dGFyZWEucGxhY2Vob2xkZXIgfQogIC8vIFNldCBhdXRvZm9jdXMgdG8gdHJ1ZSBpZiB0aGlzIHRleHRhcmVhIGlzIGZvY3VzZWQsIG9yIGlmIGl0IGhhcwogIC8vIGF1dG9mb2N1cyBhbmQgbm8gb3RoZXIgZWxlbWVudCBpcyBmb2N1c2VkLgogIGlmIChvcHRpb25zLmF1dG9mb2N1cyA9PSBudWxsKSB7CiAgICB2YXIgaGFzRm9jdXMgPSBhY3RpdmVFbHQoKQogICAgb3B0aW9ucy5hdXRvZm9jdXMgPSBoYXNGb2N1cyA9PSB0ZXh0YXJlYSB8fAogICAgICB0ZXh0YXJlYS5nZXRBdHRyaWJ1dGUoImF1dG9mb2N1cyIpICE9IG51bGwgJiYgaGFzRm9jdXMgPT0gZG9jdW1lbnQuYm9keQogIH0KCiAgZnVuY3Rpb24gc2F2ZSgpIHt0ZXh0YXJlYS52YWx1ZSA9IGNtLmdldFZhbHVlKCl9CgogIHZhciByZWFsU3VibWl0CiAgaWYgKHRleHRhcmVhLmZvcm0pIHsKICAgIG9uKHRleHRhcmVhLmZvcm0sICJzdWJtaXQiLCBzYXZlKQogICAgLy8gRGVwbG9yYWJsZSBoYWNrIHRvIG1ha2UgdGhlIHN1Ym1pdCBtZXRob2QgZG8gdGhlIHJpZ2h0IHRoaW5nLgogICAgaWYgKCFvcHRpb25zLmxlYXZlU3VibWl0TWV0aG9kQWxvbmUpIHsKICAgICAgdmFyIGZvcm0gPSB0ZXh0YXJlYS5mb3JtCiAgICAgIHJlYWxTdWJtaXQgPSBmb3JtLnN1Ym1pdAogICAgICB0cnkgewogICAgICAgIHZhciB3cmFwcGVkU3VibWl0ID0gZm9ybS5zdWJtaXQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICBzYXZlKCkKICAgICAgICAgIGZvcm0uc3VibWl0ID0gcmVhbFN1Ym1pdAogICAgICAgICAgZm9ybS5zdWJtaXQoKQogICAgICAgICAgZm9ybS5zdWJtaXQgPSB3cmFwcGVkU3VibWl0CiAgICAgICAgfQogICAgICB9IGNhdGNoKGUpIHt9CiAgICB9CiAgfQoKICBvcHRpb25zLmZpbmlzaEluaXQgPSBmdW5jdGlvbiAoY20pIHsKICAgIGNtLnNhdmUgPSBzYXZlCiAgICBjbS5nZXRUZXh0QXJlYSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRleHRhcmVhOyB9CiAgICBjbS50b1RleHRBcmVhID0gZnVuY3Rpb24gKCkgewogICAgICBjbS50b1RleHRBcmVhID0gaXNOYU4gLy8gUHJldmVudCB0aGlzIGZyb20gYmVpbmcgcmFuIHR3aWNlCiAgICAgIHNhdmUoKQogICAgICB0ZXh0YXJlYS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGNtLmdldFdyYXBwZXJFbGVtZW50KCkpCiAgICAgIHRleHRhcmVhLnN0eWxlLmRpc3BsYXkgPSAiIgogICAgICBpZiAodGV4dGFyZWEuZm9ybSkgewogICAgICAgIG9mZih0ZXh0YXJlYS5mb3JtLCAic3VibWl0Iiwgc2F2ZSkKICAgICAgICBpZiAodHlwZW9mIHRleHRhcmVhLmZvcm0uc3VibWl0ID09ICJmdW5jdGlvbiIpCiAgICAgICAgICB7IHRleHRhcmVhLmZvcm0uc3VibWl0ID0gcmVhbFN1Ym1pdCB9CiAgICAgIH0KICAgIH0KICB9CgogIHRleHRhcmVhLnN0eWxlLmRpc3BsYXkgPSAibm9uZSIKICB2YXIgY20gPSBDb2RlTWlycm9yJDEoZnVuY3Rpb24gKG5vZGUpIHsgcmV0dXJuIHRleHRhcmVhLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5vZGUsIHRleHRhcmVhLm5leHRTaWJsaW5nKTsgfSwKICAgIG9wdGlvbnMpCiAgcmV0dXJuIGNtCn0KCmZ1bmN0aW9uIGFkZExlZ2FjeVByb3BzKENvZGVNaXJyb3IpIHsKICBDb2RlTWlycm9yLm9mZiA9IG9mZgogIENvZGVNaXJyb3Iub24gPSBvbgogIENvZGVNaXJyb3Iud2hlZWxFdmVudFBpeGVscyA9IHdoZWVsRXZlbnRQaXhlbHMKICBDb2RlTWlycm9yLkRvYyA9IERvYwogIENvZGVNaXJyb3Iuc3BsaXRMaW5lcyA9IHNwbGl0TGluZXNBdXRvCiAgQ29kZU1pcnJvci5jb3VudENvbHVtbiA9IGNvdW50Q29sdW1uCiAgQ29kZU1pcnJvci5maW5kQ29sdW1uID0gZmluZENvbHVtbgogIENvZGVNaXJyb3IuaXNXb3JkQ2hhciA9IGlzV29yZENoYXJCYXNpYwogIENvZGVNaXJyb3IuUGFzcyA9IFBhc3MKICBDb2RlTWlycm9yLnNpZ25hbCA9IHNpZ25hbAogIENvZGVNaXJyb3IuTGluZSA9IExpbmUKICBDb2RlTWlycm9yLmNoYW5nZUVuZCA9IGNoYW5nZUVuZAogIENvZGVNaXJyb3Iuc2Nyb2xsYmFyTW9kZWwgPSBzY3JvbGxiYXJNb2RlbAogIENvZGVNaXJyb3IuUG9zID0gUG9zCiAgQ29kZU1pcnJvci5jbXBQb3MgPSBjbXAKICBDb2RlTWlycm9yLm1vZGVzID0gbW9kZXMKICBDb2RlTWlycm9yLm1pbWVNb2RlcyA9IG1pbWVNb2RlcwogIENvZGVNaXJyb3IucmVzb2x2ZU1vZGUgPSByZXNvbHZlTW9kZQogIENvZGVNaXJyb3IuZ2V0TW9kZSA9IGdldE1vZGUKICBDb2RlTWlycm9yLm1vZGVFeHRlbnNpb25zID0gbW9kZUV4dGVuc2lvbnMKICBDb2RlTWlycm9yLmV4dGVuZE1vZGUgPSBleHRlbmRNb2RlCiAgQ29kZU1pcnJvci5jb3B5U3RhdGUgPSBjb3B5U3RhdGUKICBDb2RlTWlycm9yLnN0YXJ0U3RhdGUgPSBzdGFydFN0YXRlCiAgQ29kZU1pcnJvci5pbm5lck1vZGUgPSBpbm5lck1vZGUKICBDb2RlTWlycm9yLmNvbW1hbmRzID0gY29tbWFuZHMKICBDb2RlTWlycm9yLmtleU1hcCA9IGtleU1hcAogIENvZGVNaXJyb3Iua2V5TmFtZSA9IGtleU5hbWUKICBDb2RlTWlycm9yLmlzTW9kaWZpZXJLZXkgPSBpc01vZGlmaWVyS2V5CiAgQ29kZU1pcnJvci5sb29rdXBLZXkgPSBsb29rdXBLZXkKICBDb2RlTWlycm9yLm5vcm1hbGl6ZUtleU1hcCA9IG5vcm1hbGl6ZUtleU1hcAogIENvZGVNaXJyb3IuU3RyaW5nU3RyZWFtID0gU3RyaW5nU3RyZWFtCiAgQ29kZU1pcnJvci5TaGFyZWRUZXh0TWFya2VyID0gU2hhcmVkVGV4dE1hcmtlcgogIENvZGVNaXJyb3IuVGV4dE1hcmtlciA9IFRleHRNYXJrZXIKICBDb2RlTWlycm9yLkxpbmVXaWRnZXQgPSBMaW5lV2lkZ2V0CiAgQ29kZU1pcnJvci5lX3ByZXZlbnREZWZhdWx0ID0gZV9wcmV2ZW50RGVmYXVsdAogIENvZGVNaXJyb3IuZV9zdG9wUHJvcGFnYXRpb24gPSBlX3N0b3BQcm9wYWdhdGlvbgogIENvZGVNaXJyb3IuZV9zdG9wID0gZV9zdG9wCiAgQ29kZU1pcnJvci5hZGRDbGFzcyA9IGFkZENsYXNzCiAgQ29kZU1pcnJvci5jb250YWlucyA9IGNvbnRhaW5zCiAgQ29kZU1pcnJvci5ybUNsYXNzID0gcm1DbGFzcwogIENvZGVNaXJyb3Iua2V5TmFtZXMgPSBrZXlOYW1lcwp9CgovLyBFRElUT1IgQ09OU1RSVUNUT1IKCmRlZmluZU9wdGlvbnMoQ29kZU1pcnJvciQxKQoKYWRkRWRpdG9yTWV0aG9kcyhDb2RlTWlycm9yJDEpCgovLyBTZXQgdXAgbWV0aG9kcyBvbiBDb2RlTWlycm9yJ3MgcHJvdG90eXBlIHRvIHJlZGlyZWN0IHRvIHRoZSBlZGl0b3IncyBkb2N1bWVudC4KdmFyIGRvbnREZWxlZ2F0ZSA9ICJpdGVyIGluc2VydCByZW1vdmUgY29weSBnZXRFZGl0b3IgY29uc3RydWN0b3IiLnNwbGl0KCIgIikKZm9yICh2YXIgcHJvcCBpbiBEb2MucHJvdG90eXBlKSB7IGlmIChEb2MucHJvdG90eXBlLmhhc093blByb3BlcnR5KHByb3ApICYmIGluZGV4T2YoZG9udERlbGVnYXRlLCBwcm9wKSA8IDApCiAgeyBDb2RlTWlycm9yJDEucHJvdG90eXBlW3Byb3BdID0gKGZ1bmN0aW9uKG1ldGhvZCkgewogICAgcmV0dXJuIGZ1bmN0aW9uKCkge3JldHVybiBtZXRob2QuYXBwbHkodGhpcy5kb2MsIGFyZ3VtZW50cyl9CiAgfSkoRG9jLnByb3RvdHlwZVtwcm9wXSkgfSB9CgpldmVudE1peGluKERvYykKCi8vIElOUFVUIEhBTkRMSU5HCgpDb2RlTWlycm9yJDEuaW5wdXRTdHlsZXMgPSB7InRleHRhcmVhIjogVGV4dGFyZWFJbnB1dCwgImNvbnRlbnRlZGl0YWJsZSI6IENvbnRlbnRFZGl0YWJsZUlucHV0fQoKLy8gTU9ERSBERUZJTklUSU9OIEFORCBRVUVSWUlORwoKLy8gRXh0cmEgYXJndW1lbnRzIGFyZSBzdG9yZWQgYXMgdGhlIG1vZGUncyBkZXBlbmRlbmNpZXMsIHdoaWNoIGlzCi8vIHVzZWQgYnkgKGxlZ2FjeSkgbWVjaGFuaXNtcyBsaWtlIGxvYWRtb2RlLmpzIHRvIGF1dG9tYXRpY2FsbHkKLy8gbG9hZCBhIG1vZGUuIChQcmVmZXJyZWQgbWVjaGFuaXNtIGlzIHRoZSByZXF1aXJlL2RlZmluZSBjYWxscy4pCkNvZGVNaXJyb3IkMS5kZWZpbmVNb2RlID0gZnVuY3Rpb24obmFtZS8qLCBtb2RlLCDigKYqLykgewogIGlmICghQ29kZU1pcnJvciQxLmRlZmF1bHRzLm1vZGUgJiYgbmFtZSAhPSAibnVsbCIpIHsgQ29kZU1pcnJvciQxLmRlZmF1bHRzLm1vZGUgPSBuYW1lIH0KICBkZWZpbmVNb2RlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykKfQoKQ29kZU1pcnJvciQxLmRlZmluZU1JTUUgPSBkZWZpbmVNSU1FCgovLyBNaW5pbWFsIGRlZmF1bHQgbW9kZS4KQ29kZU1pcnJvciQxLmRlZmluZU1vZGUoIm51bGwiLCBmdW5jdGlvbiAoKSB7IHJldHVybiAoe3Rva2VuOiBmdW5jdGlvbiAoc3RyZWFtKSB7IHJldHVybiBzdHJlYW0uc2tpcFRvRW5kKCk7IH19KTsgfSkKQ29kZU1pcnJvciQxLmRlZmluZU1JTUUoInRleHQvcGxhaW4iLCAibnVsbCIpCgovLyBFWFRFTlNJT05TCgpDb2RlTWlycm9yJDEuZGVmaW5lRXh0ZW5zaW9uID0gZnVuY3Rpb24gKG5hbWUsIGZ1bmMpIHsKICBDb2RlTWlycm9yJDEucHJvdG90eXBlW25hbWVdID0gZnVuYwp9CkNvZGVNaXJyb3IkMS5kZWZpbmVEb2NFeHRlbnNpb24gPSBmdW5jdGlvbiAobmFtZSwgZnVuYykgewogIERvYy5wcm90b3R5cGVbbmFtZV0gPSBmdW5jCn0KCkNvZGVNaXJyb3IkMS5mcm9tVGV4dEFyZWEgPSBmcm9tVGV4dEFyZWEKCmFkZExlZ2FjeVByb3BzKENvZGVNaXJyb3IkMSkKCkNvZGVNaXJyb3IkMS52ZXJzaW9uID0gIjUuMjAuMiIKCnJldHVybiBDb2RlTWlycm9yJDE7Cgp9KSkpOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/LICENSE</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Q29weXJpZ2h0IChDKSAyMDE2IGJ5IE1hcmlqbiBIYXZlcmJla2UgPG1hcmlqbmhAZ21haWwuY29tPiBhbmQgb3RoZXJzCgpQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5Cm9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlICJTb2Z0d2FyZSIpLCB0byBkZWFsCmluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMKdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbApjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMKZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKClRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCmFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLgoKVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCkZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQpBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCkxJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCk9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KVEhFIFNPRlRXQVJFLgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/apl/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/apl/apl.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJhcGwiLCBmdW5jdGlvbigpIHsKICB2YXIgYnVpbHRJbk9wcyA9IHsKICAgICIuIjogImlubmVyUHJvZHVjdCIsCiAgICAiXFwiOiAic2NhbiIsCiAgICAiLyI6ICJyZWR1Y2UiLAogICAgIuKMvyI6ICJyZWR1Y2UxQXhpcyIsCiAgICAi4o2AIjogInNjYW4xQXhpcyIsCiAgICAiwqgiOiAiZWFjaCIsCiAgICAi4o2jIjogInBvd2VyIgogIH07CiAgdmFyIGJ1aWx0SW5GdW5jcyA9IHsKICAgICIrIjogWyJjb25qdWdhdGUiLCAiYWRkIl0sCiAgICAi4oiSIjogWyJuZWdhdGUiLCAic3VidHJhY3QiXSwKICAgICLDlyI6IFsic2lnbk9mIiwgIm11bHRpcGx5Il0sCiAgICAiw7ciOiBbInJlY2lwcm9jYWwiLCAiZGl2aWRlIl0sCiAgICAi4oyIIjogWyJjZWlsaW5nIiwgImdyZWF0ZXJPZiJdLAogICAgIuKMiiI6IFsiZmxvb3IiLCAibGVzc2VyT2YiXSwKICAgICLiiKMiOiBbImFic29sdXRlIiwgInJlc2lkdWUiXSwKICAgICLijbMiOiBbImluZGV4R2VuZXJhdGUiLCAiaW5kZXhPZiJdLAogICAgIj8iOiBbInJvbGwiLCAiZGVhbCJdLAogICAgIuKLhiI6IFsiZXhwb25lbnRpYXRlIiwgInRvVGhlUG93ZXJPZiJdLAogICAgIuKNnyI6IFsibmF0dXJhbExvZyIsICJsb2dUb1RoZUJhc2UiXSwKICAgICLil4siOiBbInBpVGltZXMiLCAiY2lyY3VsYXJGdW5jcyJdLAogICAgIiEiOiBbImZhY3RvcmlhbCIsICJiaW5vbWlhbCJdLAogICAgIuKMuSI6IFsibWF0cml4SW52ZXJzZSIsICJtYXRyaXhEaXZpZGUiXSwKICAgICI8IjogW251bGwsICJsZXNzVGhhbiJdLAogICAgIuKJpCI6IFtudWxsLCAibGVzc1RoYW5PckVxdWFsIl0sCiAgICAiPSI6IFtudWxsLCAiZXF1YWxzIl0sCiAgICAiPiI6IFtudWxsLCAiZ3JlYXRlclRoYW4iXSwKICAgICLiiaUiOiBbbnVsbCwgImdyZWF0ZXJUaGFuT3JFcXVhbCJdLAogICAgIuKJoCI6IFtudWxsLCAibm90RXF1YWwiXSwKICAgICLiiaEiOiBbImRlcHRoIiwgIm1hdGNoIl0sCiAgICAi4omiIjogW251bGwsICJub3RNYXRjaCJdLAogICAgIuKIiCI6IFsiZW5saXN0IiwgIm1lbWJlcnNoaXAiXSwKICAgICLijbciOiBbbnVsbCwgImZpbmQiXSwKICAgICLiiKoiOiBbInVuaXF1ZSIsICJ1bmlvbiJdLAogICAgIuKIqSI6IFtudWxsLCAiaW50ZXJzZWN0aW9uIl0sCiAgICAi4oi8IjogWyJub3QiLCAid2l0aG91dCJdLAogICAgIuKIqCI6IFtudWxsLCAib3IiXSwKICAgICLiiKciOiBbbnVsbCwgImFuZCJdLAogICAgIuKNsSI6IFtudWxsLCAibm9yIl0sCiAgICAi4o2yIjogW251bGwsICJuYW5kIl0sCiAgICAi4o20IjogWyJzaGFwZU9mIiwgInJlc2hhcGUiXSwKICAgICIsIjogWyJyYXZlbCIsICJjYXRlbmF0ZSJdLAogICAgIuKNqiI6IFtudWxsLCAiZmlyc3RBeGlzQ2F0ZW5hdGUiXSwKICAgICLijL0iOiBbInJldmVyc2UiLCAicm90YXRlIl0sCiAgICAi4oqWIjogWyJheGlzMVJldmVyc2UiLCAiYXhpczFSb3RhdGUiXSwKICAgICLijYkiOiBbInRyYW5zcG9zZSIsIG51bGxdLAogICAgIuKGkSI6IFsiZmlyc3QiLCAidGFrZSJdLAogICAgIuKGkyI6IFtudWxsLCAiZHJvcCJdLAogICAgIuKKgiI6IFsiZW5jbG9zZSIsICJwYXJ0aXRpb25XaXRoQXhpcyJdLAogICAgIuKKgyI6IFsiZGljbG9zZSIsICJwaWNrIl0sCiAgICAi4oy3IjogW251bGwsICJpbmRleCJdLAogICAgIuKNiyI6IFsiZ3JhZGVVcCIsIG51bGxdLAogICAgIuKNkiI6IFsiZ3JhZGVEb3duIiwgbnVsbF0sCiAgICAi4oqkIjogWyJlbmNvZGUiLCBudWxsXSwKICAgICLiiqUiOiBbImRlY29kZSIsIG51bGxdLAogICAgIuKNlSI6IFsiZm9ybWF0IiwgImZvcm1hdEJ5RXhhbXBsZSJdLAogICAgIuKNjiI6IFsiZXhlY3V0ZSIsIG51bGxdLAogICAgIuKKoyI6IFsic3RvcCIsICJsZWZ0Il0sCiAgICAi4oqiIjogWyJwYXNzIiwgInJpZ2h0Il0KICB9OwoKICB2YXIgaXNPcGVyYXRvciA9IC9bXC5cL+KMv+KNgMKo4o2jXS87CiAgdmFyIGlzTmlsYWRpYyA9IC/ijawvOwogIHZhciBpc0Z1bmN0aW9uID0gL1tcK+KIksOXw7fijIjijIriiKPijbNcP+KLhuKNn+KXiyHijLk84omkPT7iiaXiiaDiiaHiiaLiiIjijbfiiKriiKniiLziiKjiiKfijbHijbLijbQs4o2q4oy94oqW4o2J4oaR4oaT4oqC4oqD4oy34o2L4o2S4oqk4oql4o2V4o2O4oqj4oqiXS87CiAgdmFyIGlzQXJyb3cgPSAv4oaQLzsKICB2YXIgaXNDb21tZW50ID0gL1vijZ0jXS4qJC87CgogIHZhciBzdHJpbmdFYXRlciA9IGZ1bmN0aW9uKHR5cGUpIHsKICAgIHZhciBwcmV2OwogICAgcHJldiA9IGZhbHNlOwogICAgcmV0dXJuIGZ1bmN0aW9uKGMpIHsKICAgICAgcHJldiA9IGM7CiAgICAgIGlmIChjID09PSB0eXBlKSB7CiAgICAgICAgcmV0dXJuIHByZXYgPT09ICJcXCI7CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWU7CiAgICB9OwogIH07CiAgcmV0dXJuIHsKICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gewogICAgICAgIHByZXY6IGZhbHNlLAogICAgICAgIGZ1bmM6IGZhbHNlLAogICAgICAgIG9wOiBmYWxzZSwKICAgICAgICBzdHJpbmc6IGZhbHNlLAogICAgICAgIGVzY2FwZTogZmFsc2UKICAgICAgfTsKICAgIH0sCiAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICB2YXIgY2gsIGZ1bmNOYW1lOwogICAgICBpZiAoc3RyZWFtLmVhdFNwYWNlKCkpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBjaCA9IHN0cmVhbS5uZXh0KCk7CiAgICAgIGlmIChjaCA9PT0gJyInIHx8IGNoID09PSAiJyIpIHsKICAgICAgICBzdHJlYW0uZWF0V2hpbGUoc3RyaW5nRWF0ZXIoY2gpKTsKICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgIHN0YXRlLnByZXYgPSB0cnVlOwogICAgICAgIHJldHVybiAic3RyaW5nIjsKICAgICAgfQogICAgICBpZiAoL1tcW3tcKF0vLnRlc3QoY2gpKSB7CiAgICAgICAgc3RhdGUucHJldiA9IGZhbHNlOwogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGlmICgvW1xdfVwpXS8udGVzdChjaCkpIHsKICAgICAgICBzdGF0ZS5wcmV2ID0gdHJ1ZTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBpZiAoaXNOaWxhZGljLnRlc3QoY2gpKSB7CiAgICAgICAgc3RhdGUucHJldiA9IGZhbHNlOwogICAgICAgIHJldHVybiAibmlsYWRpYyI7CiAgICAgIH0KICAgICAgaWYgKC9bwq9cZF0vLnRlc3QoY2gpKSB7CiAgICAgICAgaWYgKHN0YXRlLmZ1bmMpIHsKICAgICAgICAgIHN0YXRlLmZ1bmMgPSBmYWxzZTsKICAgICAgICAgIHN0YXRlLnByZXYgPSBmYWxzZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc3RhdGUucHJldiA9IHRydWU7CiAgICAgICAgfQogICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1x3XC5dLyk7CiAgICAgICAgcmV0dXJuICJudW1iZXIiOwogICAgICB9CiAgICAgIGlmIChpc09wZXJhdG9yLnRlc3QoY2gpKSB7CiAgICAgICAgcmV0dXJuICJvcGVyYXRvciBhcGwtIiArIGJ1aWx0SW5PcHNbY2hdOwogICAgICB9CiAgICAgIGlmIChpc0Fycm93LnRlc3QoY2gpKSB7CiAgICAgICAgcmV0dXJuICJhcGwtYXJyb3ciOwogICAgICB9CiAgICAgIGlmIChpc0Z1bmN0aW9uLnRlc3QoY2gpKSB7CiAgICAgICAgZnVuY05hbWUgPSAiYXBsLSI7CiAgICAgICAgaWYgKGJ1aWx0SW5GdW5jc1tjaF0gIT0gbnVsbCkgewogICAgICAgICAgaWYgKHN0YXRlLnByZXYpIHsKICAgICAgICAgICAgZnVuY05hbWUgKz0gYnVpbHRJbkZ1bmNzW2NoXVsxXTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGZ1bmNOYW1lICs9IGJ1aWx0SW5GdW5jc1tjaF1bMF07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHN0YXRlLmZ1bmMgPSB0cnVlOwogICAgICAgIHN0YXRlLnByZXYgPSBmYWxzZTsKICAgICAgICByZXR1cm4gImZ1bmN0aW9uICIgKyBmdW5jTmFtZTsKICAgICAgfQogICAgICBpZiAoaXNDb21tZW50LnRlc3QoY2gpKSB7CiAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICAgIHJldHVybiAiY29tbWVudCI7CiAgICAgIH0KICAgICAgaWYgKGNoID09PSAi4oiYIiAmJiBzdHJlYW0ucGVlaygpID09PSAiLiIpIHsKICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgIHJldHVybiAiZnVuY3Rpb24gam90LWRvdCI7CiAgICAgIH0KICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXHdcJF9dLyk7CiAgICAgIHN0YXRlLnByZXYgPSB0cnVlOwogICAgICByZXR1cm4gImtleXdvcmQiOwogICAgfQogIH07Cn0pOwoKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L2FwbCIsICJhcGwiKTsKCn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/apl/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogQVBMIG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vLi4vYWRkb24vZWRpdC9tYXRjaGJyYWNrZXRzLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4vYXBsLmpzIj48L3NjcmlwdD4KPHN0eWxlPgoJLkNvZGVNaXJyb3IgeyBib3JkZXI6IDJweCBpbnNldCAjZGVlOyB9CiAgICA8L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxoMT5Db2RlTWlycm9yPC9oMT48aW1nIGlkPWxvZ28gc3JjPSIuLi8uLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5MYW5ndWFnZSBtb2RlczwvYT4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+QVBMPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5BUEwgbW9kZTwvaDI+Cjxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+CuKNnSBDb253YXkncyBnYW1lIG9mIGxpZmUKCuKNnSBUaGlzIGV4YW1wbGUgd2FzIGluc3BpcmVkIGJ5IHRoZSBpbXByZXNzaXZlIGRlbW8gYXQK4o2dIGh0dHA6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj1hOXhBS3R0V2dQNAoK4o2dIENyZWF0ZSBhIG1hdHJpeDoK4o2dICAgICAwIDEgMQrijZ0gICAgIDEgMSAwCuKNnSAgICAgMCAxIDAKY3JlYXR1cmUg4oaQICgzIDMg4o20IOKNsyA5KSDiiIggMSAyIDMgNCA3ICAg4o2dIE9yaWdpbmFsIGNyZWF0dXJlIGZyb20gZGVtbwpjcmVhdHVyZSDihpAgKDMgMyDijbQg4o2zIDkpIOKIiCAxIDMgNiA3IDggICDijZ0gR2xpZGVyCgrijZ0gUGxhY2UgdGhlIGNyZWF0dXJlIG9uIGEgbGFyZ2VyIGJvYXJkLCBuZWFyIHRoZSBjZW50cmUKYm9hcmQg4oaQIMKvMSDiipYgwq8yIOKMvSA1IDcg4oaRIGNyZWF0dXJlCgrijZ0gQSBmdW5jdGlvbiB0byBtb3ZlIGZyb20gb25lIGdlbmVyYXRpb24gdG8gdGhlIG5leHQKbGlmZSDihpAge+KIqC8gMSDijbUg4oinIDMgNCA9IOKKgisvICvijL8gMSAwIMKvMSDiiJgu4oqWIDEgMCDCrzEg4oy9wqgg4oqC4o21fQoK4o2dIENvbXB1dGUgbi10aCBnZW5lcmF0aW9uIGFuZCBmb3JtYXQgaXQgYXMgYQrijZ0gY2hhcmFjdGVyIG1hdHJpeApnZW4g4oaQIHsnICMnWyhsaWZlIOKNoyDijbUpIGJvYXJkXX0KCuKNnSBTaG93IGZpcnN0IHRocmVlIGdlbmVyYXRpb25zCihnZW4gMSkgKGdlbiAyKSAoZ2VuIDMpCjwvdGV4dGFyZWE+PC9mb3JtPgoKICAgIDxzY3JpcHQ+CiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICAgICAgbGluZU51bWJlcnM6IHRydWUsCiAgICAgICAgbWF0Y2hCcmFja2V0czogdHJ1ZSwKICAgICAgICBtb2RlOiAidGV4dC9hcGwiCiAgICAgIH0pOwogICAgPC9zY3JpcHQ+CgogICAgPHA+U2ltcGxlIG1vZGUgdGhhdCB0cmllcyB0byBoYW5kbGUgQVBMIGFzIHdlbGwgYXMgaXQgY2FuLjwvcD4KICAgIDxwPkl0IGF0dGVtcHRzIHRvIGxhYmVsIGZ1bmN0aW9ucy9vcGVyYXRvcnMgYmFzZWQgdXBvbgogICAgbW9uYWRpYy9keWFkaWMgdXNhZ2UgKGJ1dCB0aGlzIGlzIGZhciBmcm9tIGZ1bGx5IGZsZXNoZWQgb3V0KS4KICAgIFRoaXMgbWVhbnMgdGhlcmUgYXJlIG1lYW5pbmdmdWwgY2xhc3NuYW1lcyBzbyBob3ZlciBzdGF0ZXMgY2FuCiAgICBoYXZlIHBvcHVwcyBldGMuPC9wPgoKICAgIDxwPjxzdHJvbmc+TUlNRSB0eXBlcyBkZWZpbmVkOjwvc3Ryb25nPiA8Y29kZT50ZXh0L2FwbDwvY29kZT4gKEFQTCBjb2RlKTwvcD4KICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/asciiarmor/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/asciiarmor/asciiarmor.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CgogIGZ1bmN0aW9uIGVycm9ySWZOb3RFbXB0eShzdHJlYW0pIHsKICAgIHZhciBub25XUyA9IHN0cmVhbS5tYXRjaCgvXlxzKlxTLyk7CiAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICByZXR1cm4gbm9uV1MgPyAiZXJyb3IiIDogbnVsbDsKICB9CgogIENvZGVNaXJyb3IuZGVmaW5lTW9kZSgiYXNjaWlhcm1vciIsIGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHsKICAgICAgdG9rZW46IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgICB2YXIgbTsKICAgICAgICBpZiAoc3RhdGUuc3RhdGUgPT0gInRvcCIpIHsKICAgICAgICAgIGlmIChzdHJlYW0uc29sKCkgJiYgKG0gPSBzdHJlYW0ubWF0Y2goL14tLS0tLUJFR0lOICguKik/LS0tLS1ccyokLykpKSB7CiAgICAgICAgICAgIHN0YXRlLnN0YXRlID0gImhlYWRlcnMiOwogICAgICAgICAgICBzdGF0ZS50eXBlID0gbVsxXTsKICAgICAgICAgICAgcmV0dXJuICJ0YWciOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGVycm9ySWZOb3RFbXB0eShzdHJlYW0pOwogICAgICAgIH0gZWxzZSBpZiAoc3RhdGUuc3RhdGUgPT0gImhlYWRlcnMiKSB7CiAgICAgICAgICBpZiAoc3RyZWFtLnNvbCgpICYmIHN0cmVhbS5tYXRjaCgvXlx3KzovKSkgewogICAgICAgICAgICBzdGF0ZS5zdGF0ZSA9ICJoZWFkZXIiOwogICAgICAgICAgICByZXR1cm4gImF0b20iOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGVycm9ySWZOb3RFbXB0eShzdHJlYW0pOwogICAgICAgICAgICBpZiAocmVzdWx0KSBzdGF0ZS5zdGF0ZSA9ICJib2R5IjsKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHN0YXRlLnN0YXRlID09ICJoZWFkZXIiKSB7CiAgICAgICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICAgICAgICBzdGF0ZS5zdGF0ZSA9ICJoZWFkZXJzIjsKICAgICAgICAgIHJldHVybiAic3RyaW5nIjsKICAgICAgICB9IGVsc2UgaWYgKHN0YXRlLnN0YXRlID09ICJib2R5IikgewogICAgICAgICAgaWYgKHN0cmVhbS5zb2woKSAmJiAobSA9IHN0cmVhbS5tYXRjaCgvXi0tLS0tRU5EICguKik/LS0tLS1ccyokLykpKSB7CiAgICAgICAgICAgIGlmIChtWzFdICE9IHN0YXRlLnR5cGUpIHJldHVybiAiZXJyb3IiOwogICAgICAgICAgICBzdGF0ZS5zdGF0ZSA9ICJlbmQiOwogICAgICAgICAgICByZXR1cm4gInRhZyI7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoc3RyZWFtLmVhdFdoaWxlKC9bQS1aYS16MC05K1wvPV0vKSkgewogICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgICAgICAgcmV0dXJuICJlcnJvciI7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHN0YXRlLnN0YXRlID09ICJlbmQiKSB7CiAgICAgICAgICByZXR1cm4gZXJyb3JJZk5vdEVtcHR5KHN0cmVhbSk7CiAgICAgICAgfQogICAgICB9LAogICAgICBibGFua0xpbmU6IGZ1bmN0aW9uKHN0YXRlKSB7CiAgICAgICAgaWYgKHN0YXRlLnN0YXRlID09ICJoZWFkZXJzIikgc3RhdGUuc3RhdGUgPSAiYm9keSI7CiAgICAgIH0sCiAgICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB7c3RhdGU6ICJ0b3AiLCB0eXBlOiBudWxsfTsKICAgICAgfQogICAgfTsKICB9KTsKCiAgQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJhcHBsaWNhdGlvbi9wZ3AiLCAiYXNjaWlhcm1vciIpOwogIENvZGVNaXJyb3IuZGVmaW5lTUlNRSgiYXBwbGljYXRpb24vcGdwLWtleXMiLCAiYXNjaWlhcm1vciIpOwogIENvZGVNaXJyb3IuZGVmaW5lTUlNRSgiYXBwbGljYXRpb24vcGdwLXNpZ25hdHVyZSIsICJhc2NpaWFybW9yIik7Cn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/asciiarmor/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogQVNDSUkgQXJtb3IgKFBHUCkgbW9kZTwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uLy4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxzY3JpcHQgc3JjPSIuLi8uLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJhc2NpaWFybW9yLmpzIj48L3NjcmlwdD4KPHN0eWxlPi5Db2RlTWlycm9yIHtiYWNrZ3JvdW5kOiAjZjhmOGY4O308L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxoMT5Db2RlTWlycm9yPC9oMT48aW1nIGlkPWxvZ28gc3JjPSIuLi8uLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5MYW5ndWFnZSBtb2RlczwvYT4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+QVNDSUkgQXJtb3I8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPkFTQ0lJIEFybW9yIChQR1ApIG1vZGU8L2gyPgo8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgotLS0tLUJFR0lOIFBHUCBNRVNTQUdFLS0tLS0KVmVyc2lvbjogT3BlblByaXZhY3kgMC45OQoKeURnQk8yMld4Qkh2N084WDdPL2p5Z0FFem9sNTZpVUtpWG1WK1htcEN0bXBxUVVLaVFyRnFjbEZxVURCb3Z6Uwp2QlNGak5TaVZIc3VBQT09Cj1ualVOCi0tLS0tRU5EIFBHUCBNRVNTQUdFLS0tLS0KPC90ZXh0YXJlYT48L2Zvcm0+Cgo8c2NyaXB0Pgp2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogIGxpbmVOdW1iZXJzOiB0cnVlCn0pOwo8L3NjcmlwdD4KCjxwPjxzdHJvbmc+TUlNRSB0eXBlcwpkZWZpbmVkOjwvc3Ryb25nPiA8Y29kZT5hcHBsaWNhdGlvbi9wZ3A8L2NvZGU+LCA8Y29kZT5hcHBsaWNhdGlvbi9wZ3Ata2V5czwvY29kZT4sIDxjb2RlPmFwcGxpY2F0aW9uL3BncC1zaWduYXR1cmU8L2NvZGU+PC9wPgoKPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/asn.1/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/asn.1/asn.1.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CgogIENvZGVNaXJyb3IuZGVmaW5lTW9kZSgiYXNuLjEiLCBmdW5jdGlvbihjb25maWcsIHBhcnNlckNvbmZpZykgewogICAgdmFyIGluZGVudFVuaXQgPSBjb25maWcuaW5kZW50VW5pdCwKICAgICAgICBrZXl3b3JkcyA9IHBhcnNlckNvbmZpZy5rZXl3b3JkcyB8fCB7fSwKICAgICAgICBjbWlwVmVyYnMgPSBwYXJzZXJDb25maWcuY21pcFZlcmJzIHx8IHt9LAogICAgICAgIGNvbXBhcmVUeXBlcyA9IHBhcnNlckNvbmZpZy5jb21wYXJlVHlwZXMgfHwge30sCiAgICAgICAgc3RhdHVzID0gcGFyc2VyQ29uZmlnLnN0YXR1cyB8fCB7fSwKICAgICAgICB0YWdzID0gcGFyc2VyQ29uZmlnLnRhZ3MgfHwge30sCiAgICAgICAgc3RvcmFnZSA9IHBhcnNlckNvbmZpZy5zdG9yYWdlIHx8IHt9LAogICAgICAgIG1vZGlmaWVyID0gcGFyc2VyQ29uZmlnLm1vZGlmaWVyIHx8IHt9LAogICAgICAgIGFjY2Vzc1R5cGVzID0gcGFyc2VyQ29uZmlnLmFjY2Vzc1R5cGVzfHwge30sCiAgICAgICAgbXVsdGlMaW5lU3RyaW5ncyA9IHBhcnNlckNvbmZpZy5tdWx0aUxpbmVTdHJpbmdzLAogICAgICAgIGluZGVudFN0YXRlbWVudHMgPSBwYXJzZXJDb25maWcuaW5kZW50U3RhdGVtZW50cyAhPT0gZmFsc2U7CiAgICB2YXIgaXNPcGVyYXRvckNoYXIgPSAvW1x8XF5dLzsKICAgIHZhciBjdXJQdW5jOwoKICAgIGZ1bmN0aW9uIHRva2VuQmFzZShzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHZhciBjaCA9IHN0cmVhbS5uZXh0KCk7CiAgICAgIGlmIChjaCA9PSAnIicgfHwgY2ggPT0gIiciKSB7CiAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlblN0cmluZyhjaCk7CiAgICAgICAgcmV0dXJuIHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgICB9CiAgICAgIGlmICgvW1xbXF1cKFwpe306PSw7XS8udGVzdChjaCkpIHsKICAgICAgICBjdXJQdW5jID0gY2g7CiAgICAgICAgcmV0dXJuICJwdW5jdHVhdGlvbiI7CiAgICAgIH0KICAgICAgaWYgKGNoID09ICItIil7CiAgICAgICAgaWYgKHN0cmVhbS5lYXQoIi0iKSkgewogICAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICAgICAgcmV0dXJuICJjb21tZW50IjsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKC9cZC8udGVzdChjaCkpIHsKICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcd1wuXS8pOwogICAgICAgIHJldHVybiAibnVtYmVyIjsKICAgICAgfQogICAgICBpZiAoaXNPcGVyYXRvckNoYXIudGVzdChjaCkpIHsKICAgICAgICBzdHJlYW0uZWF0V2hpbGUoaXNPcGVyYXRvckNoYXIpOwogICAgICAgIHJldHVybiAib3BlcmF0b3IiOwogICAgICB9CgogICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcd1wtXS8pOwogICAgICB2YXIgY3VyID0gc3RyZWFtLmN1cnJlbnQoKTsKICAgICAgaWYgKGtleXdvcmRzLnByb3BlcnR5SXNFbnVtZXJhYmxlKGN1cikpIHJldHVybiAia2V5d29yZCI7CiAgICAgIGlmIChjbWlwVmVyYnMucHJvcGVydHlJc0VudW1lcmFibGUoY3VyKSkgcmV0dXJuICJ2YXJpYWJsZSBjbWlwVmVyYnMiOwogICAgICBpZiAoY29tcGFyZVR5cGVzLnByb3BlcnR5SXNFbnVtZXJhYmxlKGN1cikpIHJldHVybiAiYXRvbSBjb21wYXJlVHlwZXMiOwogICAgICBpZiAoc3RhdHVzLnByb3BlcnR5SXNFbnVtZXJhYmxlKGN1cikpIHJldHVybiAiY29tbWVudCBzdGF0dXMiOwogICAgICBpZiAodGFncy5wcm9wZXJ0eUlzRW51bWVyYWJsZShjdXIpKSByZXR1cm4gInZhcmlhYmxlLTMgdGFncyI7CiAgICAgIGlmIChzdG9yYWdlLnByb3BlcnR5SXNFbnVtZXJhYmxlKGN1cikpIHJldHVybiAiYnVpbHRpbiBzdG9yYWdlIjsKICAgICAgaWYgKG1vZGlmaWVyLnByb3BlcnR5SXNFbnVtZXJhYmxlKGN1cikpIHJldHVybiAic3RyaW5nLTIgbW9kaWZpZXIiOwogICAgICBpZiAoYWNjZXNzVHlwZXMucHJvcGVydHlJc0VudW1lcmFibGUoY3VyKSkgcmV0dXJuICJhdG9tIGFjY2Vzc1R5cGVzIjsKCiAgICAgIHJldHVybiAidmFyaWFibGUiOwogICAgfQoKICAgIGZ1bmN0aW9uIHRva2VuU3RyaW5nKHF1b3RlKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgICAgdmFyIGVzY2FwZWQgPSBmYWxzZSwgbmV4dCwgZW5kID0gZmFsc2U7CiAgICAgICAgd2hpbGUgKChuZXh0ID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkgewogICAgICAgICAgaWYgKG5leHQgPT0gcXVvdGUgJiYgIWVzY2FwZWQpewogICAgICAgICAgICB2YXIgYWZ0ZXJOZXh0ID0gc3RyZWFtLnBlZWsoKTsKICAgICAgICAgICAgLy9sb29rIGlmIHRoZSBjaGFyYWN0ZXIgaWYgdGhlIHF1b3RlIGlzIGxpa2UgdGhlIEIgaW4gJzEwMTAwMDEwJ0IKICAgICAgICAgICAgaWYgKGFmdGVyTmV4dCl7CiAgICAgICAgICAgICAgYWZ0ZXJOZXh0ID0gYWZ0ZXJOZXh0LnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgICAgaWYoYWZ0ZXJOZXh0ID09ICJiIiB8fCBhZnRlck5leHQgPT0gImgiIHx8IGFmdGVyTmV4dCA9PSAibyIpCiAgICAgICAgICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVuZCA9IHRydWU7IGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgZXNjYXBlZCA9ICFlc2NhcGVkICYmIG5leHQgPT0gIlxcIjsKICAgICAgICB9CiAgICAgICAgaWYgKGVuZCB8fCAhKGVzY2FwZWQgfHwgbXVsdGlMaW5lU3RyaW5ncykpCiAgICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IG51bGw7CiAgICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIENvbnRleHQoaW5kZW50ZWQsIGNvbHVtbiwgdHlwZSwgYWxpZ24sIHByZXYpIHsKICAgICAgdGhpcy5pbmRlbnRlZCA9IGluZGVudGVkOwogICAgICB0aGlzLmNvbHVtbiA9IGNvbHVtbjsKICAgICAgdGhpcy50eXBlID0gdHlwZTsKICAgICAgdGhpcy5hbGlnbiA9IGFsaWduOwogICAgICB0aGlzLnByZXYgPSBwcmV2OwogICAgfQogICAgZnVuY3Rpb24gcHVzaENvbnRleHQoc3RhdGUsIGNvbCwgdHlwZSkgewogICAgICB2YXIgaW5kZW50ID0gc3RhdGUuaW5kZW50ZWQ7CiAgICAgIGlmIChzdGF0ZS5jb250ZXh0ICYmIHN0YXRlLmNvbnRleHQudHlwZSA9PSAic3RhdGVtZW50IikKICAgICAgICBpbmRlbnQgPSBzdGF0ZS5jb250ZXh0LmluZGVudGVkOwogICAgICByZXR1cm4gc3RhdGUuY29udGV4dCA9IG5ldyBDb250ZXh0KGluZGVudCwgY29sLCB0eXBlLCBudWxsLCBzdGF0ZS5jb250ZXh0KTsKICAgIH0KICAgIGZ1bmN0aW9uIHBvcENvbnRleHQoc3RhdGUpIHsKICAgICAgdmFyIHQgPSBzdGF0ZS5jb250ZXh0LnR5cGU7CiAgICAgIGlmICh0ID09ICIpIiB8fCB0ID09ICJdIiB8fCB0ID09ICJ9IikKICAgICAgICBzdGF0ZS5pbmRlbnRlZCA9IHN0YXRlLmNvbnRleHQuaW5kZW50ZWQ7CiAgICAgIHJldHVybiBzdGF0ZS5jb250ZXh0ID0gc3RhdGUuY29udGV4dC5wcmV2OwogICAgfQoKICAgIC8vSW50ZXJmYWNlCiAgICByZXR1cm4gewogICAgICBzdGFydFN0YXRlOiBmdW5jdGlvbihiYXNlY29sdW1uKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHRva2VuaXplOiBudWxsLAogICAgICAgICAgY29udGV4dDogbmV3IENvbnRleHQoKGJhc2Vjb2x1bW4gfHwgMCkgLSBpbmRlbnRVbml0LCAwLCAidG9wIiwgZmFsc2UpLAogICAgICAgICAgaW5kZW50ZWQ6IDAsCiAgICAgICAgICBzdGFydE9mTGluZTogdHJ1ZQogICAgICAgIH07CiAgICAgIH0sCgogICAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICAgIHZhciBjdHggPSBzdGF0ZS5jb250ZXh0OwogICAgICAgIGlmIChzdHJlYW0uc29sKCkpIHsKICAgICAgICAgIGlmIChjdHguYWxpZ24gPT0gbnVsbCkgY3R4LmFsaWduID0gZmFsc2U7CiAgICAgICAgICBzdGF0ZS5pbmRlbnRlZCA9IHN0cmVhbS5pbmRlbnRhdGlvbigpOwogICAgICAgICAgc3RhdGUuc3RhcnRPZkxpbmUgPSB0cnVlOwogICAgICAgIH0KICAgICAgICBpZiAoc3RyZWFtLmVhdFNwYWNlKCkpIHJldHVybiBudWxsOwogICAgICAgIGN1clB1bmMgPSBudWxsOwogICAgICAgIHZhciBzdHlsZSA9IChzdGF0ZS50b2tlbml6ZSB8fCB0b2tlbkJhc2UpKHN0cmVhbSwgc3RhdGUpOwogICAgICAgIGlmIChzdHlsZSA9PSAiY29tbWVudCIpIHJldHVybiBzdHlsZTsKICAgICAgICBpZiAoY3R4LmFsaWduID09IG51bGwpIGN0eC5hbGlnbiA9IHRydWU7CgogICAgICAgIGlmICgoY3VyUHVuYyA9PSAiOyIgfHwgY3VyUHVuYyA9PSAiOiIgfHwgY3VyUHVuYyA9PSAiLCIpCiAgICAgICAgICAgICYmIGN0eC50eXBlID09ICJzdGF0ZW1lbnQiKXsKICAgICAgICAgIHBvcENvbnRleHQoc3RhdGUpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChjdXJQdW5jID09ICJ7IikgcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbS5jb2x1bW4oKSwgIn0iKTsKICAgICAgICBlbHNlIGlmIChjdXJQdW5jID09ICJbIikgcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbS5jb2x1bW4oKSwgIl0iKTsKICAgICAgICBlbHNlIGlmIChjdXJQdW5jID09ICIoIikgcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbS5jb2x1bW4oKSwgIikiKTsKICAgICAgICBlbHNlIGlmIChjdXJQdW5jID09ICJ9IikgewogICAgICAgICAgd2hpbGUgKGN0eC50eXBlID09ICJzdGF0ZW1lbnQiKSBjdHggPSBwb3BDb250ZXh0KHN0YXRlKTsKICAgICAgICAgIGlmIChjdHgudHlwZSA9PSAifSIpIGN0eCA9IHBvcENvbnRleHQoc3RhdGUpOwogICAgICAgICAgd2hpbGUgKGN0eC50eXBlID09ICJzdGF0ZW1lbnQiKSBjdHggPSBwb3BDb250ZXh0KHN0YXRlKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoY3VyUHVuYyA9PSBjdHgudHlwZSkgcG9wQ29udGV4dChzdGF0ZSk7CiAgICAgICAgZWxzZSBpZiAoaW5kZW50U3RhdGVtZW50cyAmJiAoKChjdHgudHlwZSA9PSAifSIgfHwgY3R4LnR5cGUgPT0gInRvcCIpCiAgICAgICAgICAgICYmIGN1clB1bmMgIT0gJzsnKSB8fCAoY3R4LnR5cGUgPT0gInN0YXRlbWVudCIKICAgICAgICAgICAgJiYgY3VyUHVuYyA9PSAibmV3c3RhdGVtZW50IikpKQogICAgICAgICAgcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbS5jb2x1bW4oKSwgInN0YXRlbWVudCIpOwoKICAgICAgICBzdGF0ZS5zdGFydE9mTGluZSA9IGZhbHNlOwogICAgICAgIHJldHVybiBzdHlsZTsKICAgICAgfSwKCiAgICAgIGVsZWN0cmljQ2hhcnM6ICJ7fSIsCiAgICAgIGxpbmVDb21tZW50OiAiLS0iLAogICAgICBmb2xkOiAiYnJhY2UiCiAgICB9OwogIH0pOwoKICBmdW5jdGlvbiB3b3JkcyhzdHIpIHsKICAgIHZhciBvYmogPSB7fSwgd29yZHMgPSBzdHIuc3BsaXQoIiAiKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgd29yZHMubGVuZ3RoOyArK2kpIG9ialt3b3Jkc1tpXV0gPSB0cnVlOwogICAgcmV0dXJuIG9iajsKICB9CgogIENvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC94LXR0Y24tYXNuIiwgewogICAgbmFtZTogImFzbi4xIiwKICAgIGtleXdvcmRzOiB3b3JkcygiREVGSU5JVElPTlMgT0JKRUNUUyBJRiBERVJJVkVEIElORk9STUFUSU9OIEFDVElPTiIgKwogICAgIiBSRVBMWSBBTlkgTkFNRUQgQ0hBUkFDVEVSSVpFRCBCRUhBVklPVVIgUkVHSVNURVJFRCIgKwogICAgIiBXSVRIIEFTIElERU5USUZJRUQgQ09OU1RSQUlORUQgQlkgUFJFU0VOVCBCRUdJTiIgKwogICAgIiBJTVBPUlRTIEZST00gVU5JVFMgU1lOVEFYIE1JTi1BQ0NFU1MgTUFYLUFDQ0VTUyIgKwogICAgIiBNSU5BQ0NFU1MgTUFYQUNDRVNTIFJFVklTSU9OIFNUQVRVUyBERVNDUklQVElPTiIgKwogICAgIiBTRVFVRU5DRSBTRVQgQ09NUE9ORU5UUyBPRiBDSE9JQ0UgRGlzdGluZ3Vpc2hlZE5hbWUiICsKICAgICIgRU5VTUVSQVRFRCBTSVpFIE1PRFVMRSBFTkQgSU5ERVggQVVHTUVOVFMgRVhURU5TSUJJTElUWSIgKwogICAgIiBJTVBMSUVEIEVYUE9SVFMiKSwKICAgIGNtaXBWZXJiczogd29yZHMoIkFDVElPTlMgQUREIEdFVCBOT1RJRklDQVRJT05TIFJFUExBQ0UgUkVNT1ZFIiksCiAgICBjb21wYXJlVHlwZXM6IHdvcmRzKCJPUFRJT05BTCBERUZBVUxUIE1BTkFHRUQgTU9EVUxFLVRZUEUgTU9EVUxFX0lERU5USVRZIiArCiAgICAiIE1PRFVMRS1DT01QTElBTkNFIE9CSkVDVC1UWVBFIE9CSkVDVC1JREVOVElUWSIgKwogICAgIiBPQkpFQ1QtQ09NUExJQU5DRSBNT0RFIENPTkZJUk1FRCBDT05ESVRJT05BTCIgKwogICAgIiBTVUJPUkRJTkFURSBTVVBFUklPUiBDTEFTUyBUUlVFIEZBTFNFIE5VTEwiICsKICAgICIgVEVYVFVBTC1DT05WRU5USU9OIiksCiAgICBzdGF0dXM6IHdvcmRzKCJjdXJyZW50IGRlcHJlY2F0ZWQgbWFuZGF0b3J5IG9ic29sZXRlIiksCiAgICB0YWdzOiB3b3JkcygiQVBQTElDQVRJT04gQVVUT01BVElDIEVYUExJQ0lUIElNUExJQ0lUIFBSSVZBVEUgVEFHUyIgKwogICAgIiBVTklWRVJTQUwiKSwKICAgIHN0b3JhZ2U6IHdvcmRzKCJCT09MRUFOIElOVEVHRVIgT0JKRUNUIElERU5USUZJRVIgQklUIE9DVEVUIFNUUklORyIgKwogICAgIiBVVENUaW1lIEludGVyZmFjZUluZGV4IElBTkFpZlR5cGUgQ01JUC1BdHRyaWJ1dGUiICsKICAgICIgUkVBTCBQQUNLQUdFIFBBQ0tBR0VTIElwQWRkcmVzcyBQaHlzQWRkcmVzcyIgKwogICAgIiBOZXR3b3JrQWRkcmVzcyBCSVRTIEJNUFN0cmluZyBUaW1lU3RhbXAgVGltZVRpY2tzIiArCiAgICAiIFRydXRoVmFsdWUgUm93U3RhdHVzIERpc3BsYXlTdHJpbmcgR2VuZXJhbFN0cmluZyIgKwogICAgIiBHcmFwaGljU3RyaW5nIElBNVN0cmluZyBOdW1lcmljU3RyaW5nIiArCiAgICAiIFByaW50YWJsZVN0cmluZyBTbm1wQWRtaW5BdHJpbmcgVGVsZXRleFN0cmluZyIgKwogICAgIiBVVEY4U3RyaW5nIFZpZGVvdGV4U3RyaW5nIFZpc2libGVTdHJpbmcgU3RyaW5nU3RvcmUiICsKICAgICIgSVNPNjQ2U3RyaW5nIFQ2MVN0cmluZyBVbml2ZXJzYWxTdHJpbmcgVW5zaWduZWQzMiIgKwogICAgIiBJbnRlZ2VyMzIgR2F1Z2UgR2F1Z2UzMiBDb3VudGVyIENvdW50ZXIzMiBDb3VudGVyNjQiKSwKICAgIG1vZGlmaWVyOiB3b3JkcygiQVRUUklCVVRFIEFUVFJJQlVURVMgTUFOREFUT1JZLUdST1VQIE1BTkRBVE9SWS1HUk9VUFMiICsKICAgICIgR1JPVVAgR1JPVVBTIEVMRU1FTlRTIEVRVUFMSVRZIE9SREVSSU5HIFNVQlNUUklOR1MiICsKICAgICIgREVGSU5FRCIpLAogICAgYWNjZXNzVHlwZXM6IHdvcmRzKCJub3QtYWNjZXNzaWJsZSBhY2Nlc3NpYmxlLWZvci1ub3RpZnkgcmVhZC1vbmx5IiArCiAgICAiIHJlYWQtY3JlYXRlIHJlYWQtd3JpdGUiKSwKICAgIG11bHRpTGluZVN0cmluZ3M6IHRydWUKICB9KTsKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/asn.1/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[77u/PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogQVNOLjEgbW9kZTwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uLy4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxzY3JpcHQgc3JjPSIuLi8uLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJhc24uMS5qcyI+PC9zY3JpcHQ+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICAuQ29kZU1pcnJvciB7CiAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIGJsYWNrOwogICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazsKICAgIH0KPC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxoMT5Db2RlTWlycm9yPC9oMT4KICAgICAgICA8aW1nIGlkPWxvZ28gc3JjPSIuLi8uLi9kb2MvbG9nby5wbmciPgogICAgPC9hPgoKICAgIDx1bD4KICAgICAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgICAgICA8bGk+PGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgICA8L3VsPgogICAgPHVsPgogICAgICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5MYW5ndWFnZSBtb2RlczwvYT4KICAgICAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9Imh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQWJzdHJhY3RfU3ludGF4X05vdGF0aW9uX09uZSI+QVNOLjE8L2E+CiAgICA8L3VsPgo8L2Rpdj4KPGFydGljbGU+CiAgICA8aDI+QVNOLjEgZXhhbXBsZTwvaDI+CiAgICA8ZGl2PgogICAgICAgIDx0ZXh0YXJlYSBpZD0idHRjbi1hc24tY29kZSI+CiAtLQogLS0gU2FtcGxlIEFTTi4xIENvZGUKIC0tCiBNeU1vZHVsZSBERUZJTklUSU9OUyA6Oj0KIEJFR0lOCgogTXlUeXBlcyA6Oj0gU0VRVUVOQ0UgewogICAgIG15T2JqZWN0SWQgICBPQkpFQ1QgSURFTlRJRklFUiwKICAgICBteVNlcU9mICAgICAgU0VRVUVOQ0UgT0YgTXlJbnQsCiAgICAgbXlCaXRTdHJpbmcgIEJJVCBTVFJJTkcgewogICAgICAgICAgICAgICAgICAgICAgICAgbXV4VG9rZW4oMCksCiAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlbVRva2VuKDEpCiAgICAgICAgICAgICAgICAgIH0KIH0KCiBNeUludCA6Oj0gSU5URUdFUiAoMC4uNjU1MzUpCgogRU5ECiAgICAgICAgPC90ZXh0YXJlYT4KICAgIDwvZGl2PgoKICAgIDxzY3JpcHQ+CiAgICAgICAgdmFyIHR0Y25FZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidHRjbi1hc24tY29kZSIpLCB7CiAgICAgICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgICAgICAgICBtYXRjaEJyYWNrZXRzOiB0cnVlLAogICAgICAgICAgICBtb2RlOiAidGV4dC94LXR0Y24tYXNuIgogICAgICAgIH0pOwogICAgICAgIHR0Y25FZGl0b3Iuc2V0U2l6ZSg0MDAsIDQwMCk7CiAgICAgICAgdmFyIG1hYyA9IENvZGVNaXJyb3Iua2V5TWFwLmRlZmF1bHQgPT0gQ29kZU1pcnJvci5rZXlNYXAubWFjRGVmYXVsdDsKICAgICAgICBDb2RlTWlycm9yLmtleU1hcC5kZWZhdWx0WyhtYWMgPyAiQ21kIiA6ICJDdHJsIikgKyAiLVNwYWNlIl0gPSAiYXV0b2NvbXBsZXRlIjsKICAgIDwvc2NyaXB0PgogICAgPGJyLz4KICAgIDxwPjxzdHJvbmc+TGFuZ3VhZ2U6PC9zdHJvbmc+IEFic3RyYWN0IFN5bnRheCBOb3RhdGlvbiBPbmUKICAgICAgICAoPGEgaHJlZj0iaHR0cDovL3d3dy5pdHUuaW50L2VuL0lUVS1UL2FzbjEvUGFnZXMvaW50cm9kdWN0aW9uLmFzcHgiPkFTTi4xPC9hPikKICAgIDwvcD4KICAgIDxwPjxzdHJvbmc+TUlNRSB0eXBlcyBkZWZpbmVkOjwvc3Ryb25nPiA8Y29kZT50ZXh0L3gtdHRjbi1hc248L2NvZGU+PC9wPgoKICAgIDxici8+CiAgICA8cD5UaGUgZGV2ZWxvcG1lbnQgb2YgdGhpcyBtb2RlIGhhcyBiZWVuIHNwb25zb3JlZCBieSA8YSBocmVmPSJodHRwOi8vd3d3LmVyaWNzc29uLmNvbS8iPkVyaWNzc29uCiAgICA8L2E+LjwvcD4KICAgIDxwPkNvZGVkIGJ5IEFzbWVsYXNoIFRzZWdheSBHZWJyZXRzYWRrYW4gPC9wPgo8L2FydGljbGU+Cgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/asterisk/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/asterisk/asterisk.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovKgogKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqCiAqICAgICAgIEZpbGVuYW1lOiAgbW9kZS9hc3Rlcmlzay9hc3Rlcmlzay5qcwogKgogKiAgICBEZXNjcmlwdGlvbjogIENvZGVNaXJyb3IgbW9kZSBmb3IgQXN0ZXJpc2sgZGlhbHBsYW4KICoKICogICAgICAgIENyZWF0ZWQ6ICAwNS8xNy8yMDEyIDA5OjIwOjI1IFBNCiAqICAgICAgIFJldmlzaW9uOiAgbm9uZQogKgogKiAgICAgICAgIEF1dGhvcjogIFN0YXMgS29iemFyIChzdGFzQG1vZHVsaXMuY2EpLAogKiAgICAgICAgQ29tcGFueTogIE1vZHVsaXMuY2EgSW5jLgogKgogKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAqLwoKKGZ1bmN0aW9uKG1vZCkgewogIGlmICh0eXBlb2YgZXhwb3J0cyA9PSAib2JqZWN0IiAmJiB0eXBlb2YgbW9kdWxlID09ICJvYmplY3QiKSAvLyBDb21tb25KUwogICAgbW9kKHJlcXVpcmUoIi4uLy4uL2xpYi9jb2RlbWlycm9yIikpOwogIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kKSAvLyBBTUQKICAgIGRlZmluZShbIi4uLy4uL2xpYi9jb2RlbWlycm9yIl0sIG1vZCk7CiAgZWxzZSAvLyBQbGFpbiBicm93c2VyIGVudgogICAgbW9kKENvZGVNaXJyb3IpOwp9KShmdW5jdGlvbihDb2RlTWlycm9yKSB7CiJ1c2Ugc3RyaWN0IjsKCkNvZGVNaXJyb3IuZGVmaW5lTW9kZSgiYXN0ZXJpc2siLCBmdW5jdGlvbigpIHsKICB2YXIgYXRvbXMgICAgPSBbImV4dGVuIiwgInNhbWUiLCAiaW5jbHVkZSIsImlnbm9yZXBhdCIsInN3aXRjaCJdLAogICAgICBkcGNtZCAgICA9IFsiI2luY2x1ZGUiLCIjZXhlYyJdLAogICAgICBhcHBzICAgICA9IFsKICAgICAgICAgICAgICAgICAgImFkZHF1ZXVlbWVtYmVyIiwiYWRzaXByb2ciLCJhZWxzdWIiLCJhZ2VudGxvZ2luIiwiYWdlbnRtb25pdG9yb3V0Z29pbmciLCJhZ2kiLAogICAgICAgICAgICAgICAgICAiYWxhcm1yZWNlaXZlciIsImFtZCIsImFuc3dlciIsImF1dGhlbnRpY2F0ZSIsImJhY2tncm91bmQiLCJiYWNrZ3JvdW5kZGV0ZWN0IiwKICAgICAgICAgICAgICAgICAgImJyaWRnZSIsImJ1c3kiLCJjYWxsY29tcGxldGlvbmNhbmNlbCIsImNhbGxjb21wbGV0aW9ucmVxdWVzdCIsImNlbGdlbnVzZXJldmVudCIsCiAgICAgICAgICAgICAgICAgICJjaGFuZ2Vtb25pdG9yIiwiY2hhbmlzYXZhaWwiLCJjaGFubmVscmVkaXJlY3QiLCJjaGFuc3B5IiwiY2xlYXJoYXNoIiwiY29uZmJyaWRnZSIsCiAgICAgICAgICAgICAgICAgICJjb25nZXN0aW9uIiwiY29udGludWV3aGlsZSIsImNvbnRyb2xwbGF5YmFjayIsImRhaGRpYWNjZXB0cjJjYWxsIiwiZGFoZGliYXJnZSIsCiAgICAgICAgICAgICAgICAgICJkYWhkaXJhcyIsImRhaGRpc2NhbiIsImRhaGRpc2VuZGNhbGxyZXJvdXRpbmdmYWNpbGl0eSIsImRhaGRpc2VuZGtleXBhZGZhY2lsaXR5IiwKICAgICAgICAgICAgICAgICAgImRhdGV0aW1lIiwiZGJkZWwiLCJkYmRlbHRyZWUiLCJkZWFkYWdpIiwiZGlhbCIsImRpY3RhdGUiLCJkaXJlY3RvcnkiLCJkaXNhIiwKICAgICAgICAgICAgICAgICAgImR1bXBjaGFuIiwiZWFnaSIsImVjaG8iLCJlbmR3aGlsZSIsImV4ZWMiLCJleGVjaWYiLCJleGVjaWZ0aW1lIiwiZXhpdHdoaWxlIiwiZXh0ZW5zcHkiLAogICAgICAgICAgICAgICAgICAiZXh0ZXJuYWxpdnIiLCJmZXN0aXZhbCIsImZsYXNoIiwiZm9sbG93bWUiLCJmb3JrY2RyIiwiZ2V0Y3BlaWQiLCJnb3N1YiIsImdvc3ViaWYiLAogICAgICAgICAgICAgICAgICAiZ290byIsImdvdG9pZiIsImdvdG9pZnRpbWUiLCJoYW5ndXAiLCJpYXgycHJvdmlzaW9uIiwiaWNlcyIsImltcG9ydHZhciIsImluY29tcGxldGUiLAogICAgICAgICAgICAgICAgICAiaXZyZGVtbyIsImphYmJlcmpvaW4iLCJqYWJiZXJsZWF2ZSIsImphYmJlcnNlbmQiLCJqYWJiZXJzZW5kZ3JvdXAiLCJqYWJiZXJzdGF0dXMiLAogICAgICAgICAgICAgICAgICAiamFjayIsImxvZyIsIm1hY3JvIiwibWFjcm9leGNsdXNpdmUiLCJtYWNyb2V4aXQiLCJtYWNyb2lmIiwibWFpbGJveGV4aXN0cyIsIm1lZXRtZSIsCiAgICAgICAgICAgICAgICAgICJtZWV0bWVhZG1pbiIsIm1lZXRtZWNoYW5uZWxhZG1pbiIsIm1lZXRtZWNvdW50IiwibWlsbGl3YXR0IiwibWluaXZtYWNjbWVzcyIsIm1pbml2bWRlbGV0ZSIsCiAgICAgICAgICAgICAgICAgICJtaW5pdm1ncmVldCIsIm1pbml2bW13aSIsIm1pbml2bW5vdGlmeSIsIm1pbml2bXJlY29yZCIsIm1peG1vbml0b3IiLCJtb25pdG9yIiwibW9yc2Vjb2RlIiwKICAgICAgICAgICAgICAgICAgIm1wM3BsYXllciIsIm1zZXQiLCJtdXNpY29uaG9sZCIsIm5ic2NhdCIsIm5vY2RyIiwibm9vcCIsIm9kYmMiLCJvZGJjIiwib2RiY2ZpbmlzaCIsCiAgICAgICAgICAgICAgICAgICJvcmlnaW5hdGUiLCJvc3BhdXRoIiwib3NwZmluaXNoIiwib3NwbG9va3VwIiwib3NwbmV4dCIsInBhZ2UiLCJwYXJrIiwicGFya2FuZGFubm91bmNlIiwKICAgICAgICAgICAgICAgICAgInBhcmtlZGNhbGwiLCJwYXVzZW1vbml0b3IiLCJwYXVzZXF1ZXVlbWVtYmVyIiwicGlja3VwIiwicGlja3VwY2hhbiIsInBsYXliYWNrIiwicGxheXRvbmVzIiwKICAgICAgICAgICAgICAgICAgInByaXZhY3ltYW5hZ2VyIiwicHJvY2VlZGluZyIsInByb2dyZXNzIiwicXVldWUiLCJxdWV1ZWxvZyIsInJhaXNlZXhjZXB0aW9uIiwicmVhZCIsInJlYWRleHRlbiIsCiAgICAgICAgICAgICAgICAgICJyZWFkZmlsZSIsInJlY2VpdmVmYXgiLCJyZWNlaXZlZmF4IiwicmVjZWl2ZWZheCIsInJlY29yZCIsInJlbW92ZXF1ZXVlbWVtYmVyIiwKICAgICAgICAgICAgICAgICAgInJlc2V0Y2RyIiwicmV0cnlkaWFsIiwicmV0dXJuIiwicmluZ2luZyIsInNheWFscGhhIiwic2F5Y291bnRlZGFkaiIsInNheWNvdW50ZWRub3VuIiwKICAgICAgICAgICAgICAgICAgInNheWNvdW50cGwiLCJzYXlkaWdpdHMiLCJzYXludW1iZXIiLCJzYXlwaG9uZXRpYyIsInNheXVuaXh0aW1lIiwic2VuZGR0bWYiLCJzZW5kZmF4IiwKICAgICAgICAgICAgICAgICAgInNlbmRmYXgiLCJzZW5kZmF4Iiwic2VuZGltYWdlIiwic2VuZHRleHQiLCJzZW5kdXJsIiwic2V0Iiwic2V0YW1hZmxhZ3MiLAogICAgICAgICAgICAgICAgICAic2V0Y2FsbGVycHJlcyIsInNldG11c2ljb25ob2xkIiwic2lwYWRkaGVhZGVyIiwic2lwZHRtZm1vZGUiLCJzaXByZW1vdmVoZWFkZXIiLCJza2VsIiwKICAgICAgICAgICAgICAgICAgInNsYXN0YXRpb24iLCJzbGF0cnVuayIsInNtcyIsInNvZnRoYW5ndXAiLCJzcGVlY2hhY3RpdmF0ZWdyYW1tYXIiLCJzcGVlY2hiYWNrZ3JvdW5kIiwKICAgICAgICAgICAgICAgICAgInNwZWVjaGNyZWF0ZSIsInNwZWVjaGRlYWN0aXZhdGVncmFtbWFyIiwic3BlZWNoZGVzdHJveSIsInNwZWVjaGxvYWRncmFtbWFyIiwic3BlZWNocHJvY2Vzc2luZ3NvdW5kIiwKICAgICAgICAgICAgICAgICAgInNwZWVjaHN0YXJ0Iiwic3BlZWNodW5sb2FkZ3JhbW1hciIsInN0YWNrcG9wIiwic3RhcnRtdXNpY29uaG9sZCIsInN0b3BtaXhtb25pdG9yIiwic3RvcG1vbml0b3IiLAogICAgICAgICAgICAgICAgICAic3RvcG11c2ljb25ob2xkIiwic3RvcHBsYXl0b25lcyIsInN5c3RlbSIsInRlc3RjbGllbnQiLCJ0ZXN0c2VydmVyIiwidHJhbnNmZXIiLCJ0cnlleGVjIiwKICAgICAgICAgICAgICAgICAgInRyeXN5c3RlbSIsInVucGF1c2Vtb25pdG9yIiwidW5wYXVzZXF1ZXVlbWVtYmVyIiwidXNlcmV2ZW50IiwidmVyYm9zZSIsInZtYXV0aGVudGljYXRlIiwKICAgICAgICAgICAgICAgICAgInZtc2F5bmFtZSIsInZvaWNlbWFpbCIsInZvaWNlbWFpbG1haW4iLCJ3YWl0Iiwid2FpdGV4dGVuIiwid2FpdGZvcm5vaXNlIiwid2FpdGZvcnJpbmciLAogICAgICAgICAgICAgICAgICAid2FpdGZvcnNpbGVuY2UiLCJ3YWl0bXVzaWNvbmhvbGQiLCJ3YWl0dW50aWwiLCJ3aGlsZSIsInphcGF0ZWxsZXIiCiAgICAgICAgICAgICAgICAgXTsKCiAgZnVuY3Rpb24gYmFzaWNUb2tlbihzdHJlYW0sc3RhdGUpewogICAgdmFyIGN1ciA9ICcnOwogICAgdmFyIGNoID0gc3RyZWFtLm5leHQoKTsKICAgIC8vIGNvbW1lbnQKICAgIGlmKGNoID09ICI7IikgewogICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICAgIHJldHVybiAiY29tbWVudCI7CiAgICB9CiAgICAvLyBjb250ZXh0CiAgICBpZihjaCA9PSAnWycpIHsKICAgICAgc3RyZWFtLnNraXBUbygnXScpOwogICAgICBzdHJlYW0uZWF0KCddJyk7CiAgICAgIHJldHVybiAiaGVhZGVyIjsKICAgIH0KICAgIC8vIHN0cmluZwogICAgaWYoY2ggPT0gJyInKSB7CiAgICAgIHN0cmVhbS5za2lwVG8oJyInKTsKICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgfQogICAgaWYoY2ggPT0gIiciKSB7CiAgICAgIHN0cmVhbS5za2lwVG8oIiciKTsKICAgICAgcmV0dXJuICJzdHJpbmctMiI7CiAgICB9CiAgICAvLyBkaWFscGxhbiBjb21tYW5kcwogICAgaWYoY2ggPT0gJyMnKSB7CiAgICAgIHN0cmVhbS5lYXRXaGlsZSgvXHcvKTsKICAgICAgY3VyID0gc3RyZWFtLmN1cnJlbnQoKTsKICAgICAgaWYoZHBjbWQuaW5kZXhPZihjdXIpICE9PSAtMSkgewogICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgICByZXR1cm4gInN0cm9uZyI7CiAgICAgIH0KICAgIH0KICAgIC8vIGFwcGxpY2F0aW9uIGFyZ3MKICAgIGlmKGNoID09ICckJyl7CiAgICAgIHZhciBjaDEgPSBzdHJlYW0ucGVlaygpOwogICAgICBpZihjaDEgPT0gJ3snKXsKICAgICAgICBzdHJlYW0uc2tpcFRvKCd9Jyk7CiAgICAgICAgc3RyZWFtLmVhdCgnfScpOwogICAgICAgIHJldHVybiAidmFyaWFibGUtMyI7CiAgICAgIH0KICAgIH0KICAgIC8vIGV4dGVuc2lvbgogICAgc3RyZWFtLmVhdFdoaWxlKC9cdy8pOwogICAgY3VyID0gc3RyZWFtLmN1cnJlbnQoKTsKICAgIGlmKGF0b21zLmluZGV4T2YoY3VyKSAhPT0gLTEpIHsKICAgICAgc3RhdGUuZXh0ZW5TdGFydCA9IHRydWU7CiAgICAgIHN3aXRjaChjdXIpIHsKICAgICAgICBjYXNlICdzYW1lJzogc3RhdGUuZXh0ZW5TYW1lID0gdHJ1ZTsgYnJlYWs7CiAgICAgICAgY2FzZSAnaW5jbHVkZSc6CiAgICAgICAgY2FzZSAnc3dpdGNoJzoKICAgICAgICBjYXNlICdpZ25vcmVwYXQnOgogICAgICAgICAgc3RhdGUuZXh0ZW5JbmNsdWRlID0gdHJ1ZTticmVhazsKICAgICAgICBkZWZhdWx0OmJyZWFrOwogICAgICB9CiAgICAgIHJldHVybiAiYXRvbSI7CiAgICB9CiAgfQoKICByZXR1cm4gewogICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgZXh0ZW5TdGFydDogZmFsc2UsCiAgICAgICAgZXh0ZW5TYW1lOiAgZmFsc2UsCiAgICAgICAgZXh0ZW5JbmNsdWRlOiBmYWxzZSwKICAgICAgICBleHRlbkV4dGVuOiBmYWxzZSwKICAgICAgICBleHRlblByaW9yaXR5OiBmYWxzZSwKICAgICAgICBleHRlbkFwcGxpY2F0aW9uOiBmYWxzZQogICAgICB9OwogICAgfSwKICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CgogICAgICB2YXIgY3VyID0gJyc7CiAgICAgIGlmKHN0cmVhbS5lYXRTcGFjZSgpKSByZXR1cm4gbnVsbDsKICAgICAgLy8gZXh0ZW5zaW9uIHN0YXJ0ZWQKICAgICAgaWYoc3RhdGUuZXh0ZW5TdGFydCl7CiAgICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXlxzXS8pOwogICAgICAgIGN1ciA9IHN0cmVhbS5jdXJyZW50KCk7CiAgICAgICAgaWYoL149Pj8kLy50ZXN0KGN1cikpewogICAgICAgICAgc3RhdGUuZXh0ZW5FeHRlbiA9IHRydWU7CiAgICAgICAgICBzdGF0ZS5leHRlblN0YXJ0ID0gZmFsc2U7CiAgICAgICAgICByZXR1cm4gInN0cm9uZyI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHN0YXRlLmV4dGVuU3RhcnQgPSBmYWxzZTsKICAgICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgICAgIHJldHVybiAiZXJyb3IiOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmKHN0YXRlLmV4dGVuRXh0ZW4pIHsKICAgICAgICAvLyBzZXQgZXh0ZW4gYW5kIHByaW9yaXR5CiAgICAgICAgc3RhdGUuZXh0ZW5FeHRlbiA9IGZhbHNlOwogICAgICAgIHN0YXRlLmV4dGVuUHJpb3JpdHkgPSB0cnVlOwogICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW14sXS8pOwogICAgICAgIGlmKHN0YXRlLmV4dGVuSW5jbHVkZSkgewogICAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICAgICAgc3RhdGUuZXh0ZW5Qcmlvcml0eSA9IGZhbHNlOwogICAgICAgICAgc3RhdGUuZXh0ZW5JbmNsdWRlID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGlmKHN0YXRlLmV4dGVuU2FtZSkgewogICAgICAgICAgc3RhdGUuZXh0ZW5Qcmlvcml0eSA9IGZhbHNlOwogICAgICAgICAgc3RhdGUuZXh0ZW5TYW1lID0gZmFsc2U7CiAgICAgICAgICBzdGF0ZS5leHRlbkFwcGxpY2F0aW9uID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICJ0YWciOwogICAgICB9IGVsc2UgaWYoc3RhdGUuZXh0ZW5Qcmlvcml0eSkgewogICAgICAgIHN0YXRlLmV4dGVuUHJpb3JpdHkgPSBmYWxzZTsKICAgICAgICBzdGF0ZS5leHRlbkFwcGxpY2F0aW9uID0gdHJ1ZTsKICAgICAgICBzdHJlYW0ubmV4dCgpOyAvLyBnZXQgY29tbWEKICAgICAgICBpZihzdGF0ZS5leHRlblNhbWUpIHJldHVybiBudWxsOwogICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW14sXS8pOwogICAgICAgIHJldHVybiAibnVtYmVyIjsKICAgICAgfSBlbHNlIGlmKHN0YXRlLmV4dGVuQXBwbGljYXRpb24pIHsKICAgICAgICBzdHJlYW0uZWF0V2hpbGUoLywvKTsKICAgICAgICBjdXIgPSBzdHJlYW0uY3VycmVudCgpOwogICAgICAgIGlmKGN1ciA9PT0gJywnKSByZXR1cm4gbnVsbDsKICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1x3Lyk7CiAgICAgICAgY3VyID0gc3RyZWFtLmN1cnJlbnQoKS50b0xvd2VyQ2FzZSgpOwogICAgICAgIHN0YXRlLmV4dGVuQXBwbGljYXRpb24gPSBmYWxzZTsKICAgICAgICBpZihhcHBzLmluZGV4T2YoY3VyKSAhPT0gLTEpewogICAgICAgICAgcmV0dXJuICJkZWYgc3Ryb25nIjsKICAgICAgICB9CiAgICAgIH0gZWxzZXsKICAgICAgICByZXR1cm4gYmFzaWNUb2tlbihzdHJlYW0sc3RhdGUpOwogICAgICB9CgogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICB9Owp9KTsKCkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC94LWFzdGVyaXNrIiwgImFzdGVyaXNrIik7Cgp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/asterisk/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogQXN0ZXJpc2sgZGlhbHBsYW4gbW9kZTwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uLy4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxzY3JpcHQgc3JjPSIuLi8uLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJhc3Rlcmlzay5qcyI+PC9zY3JpcHQ+CjxzdHlsZT4KICAgICAgLkNvZGVNaXJyb3Ige2JvcmRlcjogMXB4IHNvbGlkICM5OTk7fQogICAgICAuY20tcy1kZWZhdWx0IHNwYW4uY20tYXJyb3cgeyBjb2xvcjogcmVkOyB9CiAgICA8L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxoMT5Db2RlTWlycm9yPC9oMT48aW1nIGlkPWxvZ28gc3JjPSIuLi8uLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5MYW5ndWFnZSBtb2RlczwvYT4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+QXN0ZXJpc2sgZGlhbHBsYW48L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPkFzdGVyaXNrIGRpYWxwbGFuIG1vZGU8L2gyPgo8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgo7IGV4dGVuc2lvbnMuY29uZiAtIHRoZSBBc3RlcmlzayBkaWFsIHBsYW4KOwoKW2dlbmVyYWxdCjsKOyBJZiBzdGF0aWMgaXMgc2V0IHRvIG5vLCBvciBvbWl0dGVkLCB0aGVuIHRoZSBwYnhfY29uZmlnIHdpbGwgcmV3cml0ZQo7IHRoaXMgZmlsZSB3aGVuIGV4dGVuc2lvbnMgYXJlIG1vZGlmaWVkLiAgUmVtZW1iZXIgdGhhdCBhbGwgY29tbWVudHMKOyBtYWRlIGluIHRoZSBmaWxlIHdpbGwgYmUgbG9zdCB3aGVuIHRoYXQgaGFwcGVucy4Kc3RhdGljPXllcwoKI2luY2x1ZGUgIi9ldGMvYXN0ZXJpc2svYWRkaXRpb25hbF9nZW5lcmFsLmNvbmYKCltpYXhwcm92aWRlcl0Kc3dpdGNoID0+IElBWDIvdXNlcjpba2V5XUBteXNlcnZlci9teWNvbnRleHQKCltkeW5hbWljXQojZXhlYyAvdXNyL2Jpbi9keW5hbWljLXBlZXJzLnBsCgpbdHJ1bmtpbnRdCjsKOyBJbnRlcm5hdGlvbmFsIGxvbmcgZGlzdGFuY2UgdGhyb3VnaCB0cnVuawo7CmV4dGVuID0+IF85MDExLiwxLE1hY3JvKGR1bmRpLWUxNjQsJHtFWFRFTjo0fSkKZXh0ZW4gPT4gXzkwMTEuLG4sRGlhbCgke0dMT0JBTChUUlVOSyl9LyR7RklMVEVSKDAtOSwke0VYVEVOOiR7R0xPQkFMKFRSVU5LTVNEKX19KX0pCgpbbG9jYWxdCjsKOyBNYXN0ZXIgY29udGV4dCBmb3IgbG9jYWwsIHRvbGwtZnJlZSwgYW5kIGlheHRlbCBjYWxscyBvbmx5CjsKaWdub3JlcGF0ID0+IDkKaW5jbHVkZSA9PiBkZWZhdWx0CgpbZGVtb10KaW5jbHVkZSA9PiBzdGRleHRlbgo7CjsgV2Ugc3RhcnQgd2l0aCB3aGF0IHRvIGRvIHdoZW4gYSBjYWxsIGZpcnN0IGNvbWVzIGluLgo7CmV4dGVuID0+IHMsMSxXYWl0KDEpCQkJOyBXYWl0IGEgc2Vjb25kLCBqdXN0IGZvciBmdW4Kc2FtZSAgPT4gbixBbnN3ZXIJCQk7IEFuc3dlciB0aGUgbGluZQpzYW1lICA9PiBuLFNldChUSU1FT1VUKGRpZ2l0KT01KQk7IFNldCBEaWdpdCBUaW1lb3V0IHRvIDUgc2Vjb25kcwpzYW1lICA9PiBuLFNldChUSU1FT1VUKHJlc3BvbnNlKT0xMCkJOyBTZXQgUmVzcG9uc2UgVGltZW91dCB0byAxMCBzZWNvbmRzCnNhbWUgID0+IG4ocmVzdGFydCksQmFja0dyb3VuZChkZW1vLWNvbmdyYXRzKQk7IFBsYXkgYSBjb25ncmF0dWxhdG9yeSBtZXNzYWdlCnNhbWUgID0+IG4oaW5zdHJ1Y3QpLEJhY2tHcm91bmQoZGVtby1pbnN0cnVjdCkJOyBQbGF5IHNvbWUgaW5zdHJ1Y3Rpb25zCnNhbWUgID0+IG4sV2FpdEV4dGVuCQkJOyBXYWl0IGZvciBhbiBleHRlbnNpb24gdG8gYmUgZGlhbGVkLgoKZXh0ZW4gPT4gMiwxLEJhY2tHcm91bmQoZGVtby1tb3JlaW5mbykJOyBHaXZlIHNvbWUgbW9yZSBpbmZvcm1hdGlvbi4KZXh0ZW4gPT4gMixuLEdvdG8ocyxpbnN0cnVjdCkKCmV4dGVuID0+IDMsMSxTZXQoTEFOR1VBR0UoKT1mcikJCTsgU2V0IGxhbmd1YWdlIHRvIGZyZW5jaApleHRlbiA9PiAzLG4sR290byhzLHJlc3RhcnQpCQk7IFN0YXJ0IHdpdGggdGhlIGNvbmdyYXR1bGF0aW9ucwoKZXh0ZW4gPT4gMTAwMCwxLEdvdG8oZGVmYXVsdCxzLDEpCjsKOyBXZSBhbHNvIGNyZWF0ZSBhbiBleGFtcGxlIHVzZXIsIDEyMzQsIHdobyBpcyBvbiB0aGUgY29uc29sZSBhbmQgaGFzCjsgdm9pY2VtYWlsLCBldGMuCjsKZXh0ZW4gPT4gMTIzNCwxLFBsYXliYWNrKHRyYW5zZmVyLHNraXApCQk7ICJQbGVhc2UgaG9sZCB3aGlsZS4uLiIKCQkJCQk7IChidXQgc2tpcCBpZiBjaGFubmVsIGlzIG5vdCB1cCkKZXh0ZW4gPT4gMTIzNCxuLEdvc3ViKCR7RVhURU59LHN0ZGV4dGVuKCR7R0xPQkFMKENPTlNPTEUpfSkpCmV4dGVuID0+IDEyMzQsbixHb3RvKGRlZmF1bHQscywxKQkJOyBleGl0ZWQgVm9pY2VtYWlsCgpleHRlbiA9PiAxMjM1LDEsVm9pY2VtYWlsKDEyMzQsdSkJCTsgUmlnaHQgdG8gdm9pY2VtYWlsCgpleHRlbiA9PiAxMjM2LDEsRGlhbChDb25zb2xlL2RzcCkJCTsgUmluZyBmb3JldmVyCmV4dGVuID0+IDEyMzYsbixWb2ljZW1haWwoMTIzNCxiKQkJOyBVbmxlc3MgYnVzeQoKOwo7ICMgZm9yIHdoZW4gdGhleSdyZSBkb25lIHdpdGggdGhlIGRlbW8KOwpleHRlbiA9PiAjLDEsUGxheWJhY2soZGVtby10aGFua3MpCTsgIlRoYW5rcyBmb3IgdHJ5aW5nIHRoZSBkZW1vIgpleHRlbiA9PiAjLG4sSGFuZ3VwCQkJOyBIYW5nIHRoZW0gdXAuCgo7CjsgQSB0aW1lb3V0IGFuZCAiaW52YWxpZCBleHRlbnNpb24gcnVsZSIKOwpleHRlbiA9PiB0LDEsR290bygjLDEpCQkJOyBJZiB0aGV5IHRha2UgdG9vIGxvbmcsIGdpdmUgdXAKZXh0ZW4gPT4gaSwxLFBsYXliYWNrKGludmFsaWQpCQk7ICJUaGF0J3Mgbm90IHZhbGlkLCB0cnkgYWdhaW4iCgo7CjsgQ3JlYXRlIGFuIGV4dGVuc2lvbiwgNTAwLCBmb3IgZGlhbGluZyB0aGUKOyBBc3RlcmlzayBkZW1vLgo7CmV4dGVuID0+IDUwMCwxLFBsYXliYWNrKGRlbW8tYWJvdXR0b3RyeSk7IExldCB0aGVtIGtub3cgd2hhdCdzIGdvaW5nIG9uCmV4dGVuID0+IDUwMCxuLERpYWwoSUFYMi9ndWVzdEBwYnguZGlnaXVtLmNvbS9zQGRlZmF1bHQpCTsgQ2FsbCB0aGUgQXN0ZXJpc2sgZGVtbwpleHRlbiA9PiA1MDAsbixQbGF5YmFjayhkZW1vLW5vZ28pCTsgQ291bGRuJ3QgY29ubmVjdCB0byB0aGUgZGVtbyBzaXRlCmV4dGVuID0+IDUwMCxuLEdvdG8ocyw2KQkJOyBSZXR1cm4gdG8gdGhlIHN0YXJ0IG92ZXIgbWVzc2FnZS4KCjsKOyBDcmVhdGUgYW4gZXh0ZW5zaW9uLCA2MDAsIGZvciBldmFsdWF0aW5nIGVjaG8gbGF0ZW5jeS4KOwpleHRlbiA9PiA2MDAsMSxQbGF5YmFjayhkZW1vLWVjaG90ZXN0KQk7IExldCB0aGVtIGtub3cgd2hhdCdzIGdvaW5nIG9uCmV4dGVuID0+IDYwMCxuLEVjaG8JCQk7IERvIHRoZSBlY2hvIHRlc3QKZXh0ZW4gPT4gNjAwLG4sUGxheWJhY2soZGVtby1lY2hvZG9uZSkJOyBMZXQgdGhlbSBrbm93IGl0J3Mgb3ZlcgpleHRlbiA9PiA2MDAsbixHb3RvKHMsNikJCTsgU3RhcnQgb3ZlcgoKOwo7CVlvdSBjYW4gdXNlIHRoZSBNYWNybyBQYWdlIHRvIGludGVyY29tIGEgaW5kaXZpZHVhbCB1c2VyCmV4dGVuID0+IDc2MjQ1LDEsTWFjcm8ocGFnZSxTSVAvR3JhbmRzdHJlYW0xKQo7IG9yIGlmIHlvdXIgcGVlcm5hbWVzIGFyZSB0aGUgc2FtZSBhcyBleHRlbnNpb25zCmV4dGVuID0+IF83WFhYLDEsTWFjcm8ocGFnZSxTSVAvJHtFWFRFTn0pCjsKOwo7IFN5c3RlbSBXaWRlIFBhZ2UgYXQgZXh0ZW5zaW9uIDc5OTkKOwpleHRlbiA9PiA3OTk5LDEsU2V0KFRJTUVPVVQoYWJzb2x1dGUpPTYwKQpleHRlbiA9PiA3OTk5LDIsUGFnZShMb2NhbC9HcmFuZHN0cmVhbTFAcGFnZSZMb2NhbC9YbGl0ZTFAcGFnZSZMb2NhbC8xMjM0QHBhZ2UvbixkKQoKOyBHaXZlIHZvaWNlbWFpbCBhdCBleHRlbnNpb24gODUwMAo7CmV4dGVuID0+IDg1MDAsMSxWb2ljZW1haWxNYWluCmV4dGVuID0+IDg1MDAsbixHb3RvKHMsNikKCiAgICA8L3RleHRhcmVhPjwvZm9ybT4KICAgIDxzY3JpcHQ+CiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICAgICAgbW9kZTogInRleHQveC1hc3RlcmlzayIsCiAgICAgICAgbWF0Y2hCcmFja2V0czogdHJ1ZSwKICAgICAgICBsaW5lTnVtYmVyOiB0cnVlCiAgICAgIH0pOwogICAgPC9zY3JpcHQ+CgogICAgPHA+PHN0cm9uZz5NSU1FIHR5cGVzIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPnRleHQveC1hc3RlcmlzazwvY29kZT4uPC9wPgoKICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/brainfuck/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/brainfuck/brainfuck.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovLyBCcmFpbmZ1Y2sgbW9kZSBjcmVhdGVkIGJ5IE1pY2hhZWwgS2FtaW5za3kgaHR0cHM6Ly9naXRodWIuY29tL21rYW1pbnNreTExCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSkKICBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCkKICAgIGRlZmluZShbIi4uLy4uL2xpYi9jb2RlbWlycm9yIl0sIG1vZCkKICBlbHNlCiAgICBtb2QoQ29kZU1pcnJvcikKfSkoZnVuY3Rpb24oQ29kZU1pcnJvcikgewogICJ1c2Ugc3RyaWN0IgogIHZhciByZXNlcnZlID0gIj48Ky0uLFtdIi5zcGxpdCgiIik7CiAgLyoKICBjb21tZW50cyBjYW4gYmUgZWl0aGVyOgogIHBsYWNlZCBiZWhpbmQgbGluZXMKCiAgICAgICAgKysrICAgIHRoaXMgaXMgYSBjb21tZW50CgogIHdoZXJlIHJlc2VydmVkIGNoYXJhY3RlcnMgY2Fubm90IGJlIHVzZWQKICBvciBpbiBhIGxvb3AKICBbCiAgICB0aGlzIGlzIG9rIHRvIHVzZSBbIF0gYW5kIHN0dWZmCiAgXQogIG9yIHByZWNlZGVkIGJ5ICMKICAqLwogIENvZGVNaXJyb3IuZGVmaW5lTW9kZSgiYnJhaW5mdWNrIiwgZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gewogICAgICBzdGFydFN0YXRlOiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgY29tbWVudExpbmU6IGZhbHNlLAogICAgICAgICAgbGVmdDogMCwKICAgICAgICAgIHJpZ2h0OiAwLAogICAgICAgICAgY29tbWVudExvb3A6IGZhbHNlCiAgICAgICAgfQogICAgICB9LAogICAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICAgIGlmIChzdHJlYW0uZWF0U3BhY2UoKSkgcmV0dXJuIG51bGwKICAgICAgICBpZihzdHJlYW0uc29sKCkpewogICAgICAgICAgc3RhdGUuY29tbWVudExpbmUgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgdmFyIGNoID0gc3RyZWFtLm5leHQoKS50b1N0cmluZygpOwogICAgICAgIGlmKHJlc2VydmUuaW5kZXhPZihjaCkgIT09IC0xKXsKICAgICAgICAgIGlmKHN0YXRlLmNvbW1lbnRMaW5lID09PSB0cnVlKXsKICAgICAgICAgICAgaWYoc3RyZWFtLmVvbCgpKXsKICAgICAgICAgICAgICBzdGF0ZS5jb21tZW50TGluZSA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAiY29tbWVudCI7CiAgICAgICAgICB9CiAgICAgICAgICBpZihjaCA9PT0gIl0iIHx8IGNoID09PSAiWyIpewogICAgICAgICAgICBpZihjaCA9PT0gIlsiKXsKICAgICAgICAgICAgICBzdGF0ZS5sZWZ0Kys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZXsKICAgICAgICAgICAgICBzdGF0ZS5yaWdodCsrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAiYnJhY2tldCI7CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlIGlmKGNoID09PSAiKyIgfHwgY2ggPT09ICItIil7CiAgICAgICAgICAgIHJldHVybiAia2V5d29yZCI7CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlIGlmKGNoID09PSAiPCIgfHwgY2ggPT09ICI+Iil7CiAgICAgICAgICAgIHJldHVybiAiYXRvbSI7CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlIGlmKGNoID09PSAiLiIgfHwgY2ggPT09ICIsIil7CiAgICAgICAgICAgIHJldHVybiAiZGVmIjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZXsKICAgICAgICAgIHN0YXRlLmNvbW1lbnRMaW5lID0gdHJ1ZTsKICAgICAgICAgIGlmKHN0cmVhbS5lb2woKSl7CiAgICAgICAgICAgIHN0YXRlLmNvbW1lbnRMaW5lID0gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gImNvbW1lbnQiOwogICAgICAgIH0KICAgICAgICBpZihzdHJlYW0uZW9sKCkpewogICAgICAgICAgc3RhdGUuY29tbWVudExpbmUgPSBmYWxzZTsKICAgICAgICB9CiAgICAgIH0KICAgIH07CiAgfSk7CkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC94LWJyYWluZnVjayIsImJyYWluZnVjayIpCn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/brainfuck/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogQnJhaW5mdWNrIG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vLi4vYWRkb24vZWRpdC9tYXRjaGJyYWNrZXRzLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4vYnJhaW5mdWNrLmpzIj48L3NjcmlwdD4KPHN0eWxlPgoJLkNvZGVNaXJyb3IgeyBib3JkZXI6IDJweCBpbnNldCAjZGVlOyB9CiAgICA8L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxoMT5Db2RlTWlycm9yPC9oMT48aW1nIGlkPWxvZ28gc3JjPSIuLi8uLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5MYW5ndWFnZSBtb2RlczwvYT4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+PC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5CcmFpbmZ1Y2sgbW9kZTwvaDI+Cjxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+ClsgVGhpcyBwcm9ncmFtIHByaW50cyAiSGVsbG8gV29ybGQhIiBhbmQgYSBuZXdsaW5lIHRvIHRoZSBzY3JlZW4sIGl0cwogIGxlbmd0aCBpcyAxMDYgYWN0aXZlIGNvbW1hbmQgY2hhcmFjdGVycyBbaXQgaXMgbm90IHRoZSBzaG9ydGVzdC5dCgogIFRoaXMgbG9vcCBpcyBhICJjb21tZW50IGxvb3AiLCBpdCdzIGEgc2ltcGxlIHdheSBvZiBhZGRpbmcgYSBjb21tZW50CiAgdG8gYSBCRiBwcm9ncmFtIHN1Y2ggdGhhdCB5b3UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCBhbnkgY29tbWFuZAogIGNoYXJhY3RlcnMuIEFueSAiLiIsICIsIiwgIisiLCAiLSIsICImbHQ7IiBhbmQgIiZndDsiIGNoYXJhY3RlcnMgYXJlIHNpbXBseQogIGlnbm9yZWQsIHRoZSAiWyIgYW5kICJdIiBjaGFyYWN0ZXJzIGp1c3QgaGF2ZSB0byBiZSBiYWxhbmNlZC4KXQorKysrKyArKysgICAgICAgICAgICAgICBTZXQgQ2VsbCAjMCB0byA4ClsKICAgICZndDsrKysrICAgICAgICAgICAgICAgQWRkIDQgdG8gQ2VsbCAjMTsgdGhpcyB3aWxsIGFsd2F5cyBzZXQgQ2VsbCAjMSB0byA0CiAgICBbICAgICAgICAgICAgICAgICAgIGFzIHRoZSBjZWxsIHdpbGwgYmUgY2xlYXJlZCBieSB0aGUgbG9vcAogICAgICAgICZndDsrKyAgICAgICAgICAgICBBZGQgMiB0byBDZWxsICMyCiAgICAgICAgJmd0OysrKyAgICAgICAgICAgIEFkZCAzIHRvIENlbGwgIzMKICAgICAgICAmZ3Q7KysrICAgICAgICAgICAgQWRkIDMgdG8gQ2VsbCAjNAogICAgICAgICZndDsrICAgICAgICAgICAgICBBZGQgMSB0byBDZWxsICM1CiAgICAgICAgJmx0OyZsdDsmbHQ7Jmx0Oy0gICAgICAgICAgIERlY3JlbWVudCB0aGUgbG9vcCBjb3VudGVyIGluIENlbGwgIzEKICAgIF0gICAgICAgICAgICAgICAgICAgTG9vcCB0aWxsIENlbGwgIzEgaXMgemVybzsgbnVtYmVyIG9mIGl0ZXJhdGlvbnMgaXMgNAogICAgJmd0OysgICAgICAgICAgICAgICAgICBBZGQgMSB0byBDZWxsICMyCiAgICAmZ3Q7KyAgICAgICAgICAgICAgICAgIEFkZCAxIHRvIENlbGwgIzMKICAgICZndDstICAgICAgICAgICAgICAgICAgU3VidHJhY3QgMSBmcm9tIENlbGwgIzQKICAgICZndDsmZ3Q7KyAgICAgICAgICAgICAgICAgQWRkIDEgdG8gQ2VsbCAjNgogICAgWyZsdDtdICAgICAgICAgICAgICAgICBNb3ZlIGJhY2sgdG8gdGhlIGZpcnN0IHplcm8gY2VsbCB5b3UgZmluZDsgdGhpcyB3aWxsCiAgICAgICAgICAgICAgICAgICAgICAgIGJlIENlbGwgIzEgd2hpY2ggd2FzIGNsZWFyZWQgYnkgdGhlIHByZXZpb3VzIGxvb3AKICAgICZsdDstICAgICAgICAgICAgICAgICAgRGVjcmVtZW50IHRoZSBsb29wIENvdW50ZXIgaW4gQ2VsbCAjMApdICAgICAgICAgICAgICAgICAgICAgICBMb29wIHRpbGwgQ2VsbCAjMCBpcyB6ZXJvOyBudW1iZXIgb2YgaXRlcmF0aW9ucyBpcyA4CgpUaGUgcmVzdWx0IG9mIHRoaXMgaXM6CkNlbGwgTm8gOiAgIDAgICAxICAgMiAgIDMgICA0ICAgNSAgIDYKQ29udGVudHM6ICAgMCAgIDAgIDcyIDEwNCAgODggIDMyICAgOApQb2ludGVyIDogICBeCgomZ3Q7Jmd0Oy4gICAgICAgICAgICAgICAgICAgICBDZWxsICMyIGhhcyB2YWx1ZSA3MiB3aGljaCBpcyAnSCcKJmd0Oy0tLS4gICAgICAgICAgICAgICAgICAgU3VidHJhY3QgMyBmcm9tIENlbGwgIzMgdG8gZ2V0IDEwMSB3aGljaCBpcyAnZScKKysrKysrKy4uKysrLiAgICAgICAgICAgTGlrZXdpc2UgZm9yICdsbG8nIGZyb20gQ2VsbCAjMwomZ3Q7Jmd0Oy4gICAgICAgICAgICAgICAgICAgICBDZWxsICM1IGlzIDMyIGZvciB0aGUgc3BhY2UKJmx0Oy0uICAgICAgICAgICAgICAgICAgICAgU3VidHJhY3QgMSBmcm9tIENlbGwgIzQgZm9yIDg3IHRvIGdpdmUgYSAnVycKJmx0Oy4gICAgICAgICAgICAgICAgICAgICAgQ2VsbCAjMyB3YXMgc2V0IHRvICdvJyBmcm9tIHRoZSBlbmQgb2YgJ0hlbGxvJworKysuLS0tLS0tLi0tLS0tLS0tLiAgICBDZWxsICMzIGZvciAncmwnIGFuZCAnZCcKJmd0OyZndDsrLiAgICAgICAgICAgICAgICAgICAgQWRkIDEgdG8gQ2VsbCAjNSBnaXZlcyB1cyBhbiBleGNsYW1hdGlvbiBwb2ludAomZ3Q7KysuICAgICAgICAgICAgICAgICAgICBBbmQgZmluYWxseSBhIG5ld2xpbmUgZnJvbSBDZWxsICM2CjwvdGV4dGFyZWE+PC9mb3JtPgoKICAgIDxzY3JpcHQ+CiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICAgICAgbGluZU51bWJlcnM6IHRydWUsCiAgICAgICAgbWF0Y2hCcmFja2V0czogdHJ1ZSwKICAgICAgICBtb2RlOiAidGV4dC94LWJyYWluZnVjayIKICAgICAgfSk7CiAgICA8L3NjcmlwdD4KCiAgICA8cD5BIG1vZGUgZm9yIEJyYWluZnVjazwvcD4KCiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC94LWJyYWluZnVjazwvY29kZT48L3A+CiAgPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/clike/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/clike/clike.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKZnVuY3Rpb24gQ29udGV4dChpbmRlbnRlZCwgY29sdW1uLCB0eXBlLCBpbmZvLCBhbGlnbiwgcHJldikgewogIHRoaXMuaW5kZW50ZWQgPSBpbmRlbnRlZDsKICB0aGlzLmNvbHVtbiA9IGNvbHVtbjsKICB0aGlzLnR5cGUgPSB0eXBlOwogIHRoaXMuaW5mbyA9IGluZm87CiAgdGhpcy5hbGlnbiA9IGFsaWduOwogIHRoaXMucHJldiA9IHByZXY7Cn0KZnVuY3Rpb24gcHVzaENvbnRleHQoc3RhdGUsIGNvbCwgdHlwZSwgaW5mbykgewogIHZhciBpbmRlbnQgPSBzdGF0ZS5pbmRlbnRlZDsKICBpZiAoc3RhdGUuY29udGV4dCAmJiBzdGF0ZS5jb250ZXh0LnR5cGUgPT0gInN0YXRlbWVudCIgJiYgdHlwZSAhPSAic3RhdGVtZW50IikKICAgIGluZGVudCA9IHN0YXRlLmNvbnRleHQuaW5kZW50ZWQ7CiAgcmV0dXJuIHN0YXRlLmNvbnRleHQgPSBuZXcgQ29udGV4dChpbmRlbnQsIGNvbCwgdHlwZSwgaW5mbywgbnVsbCwgc3RhdGUuY29udGV4dCk7Cn0KZnVuY3Rpb24gcG9wQ29udGV4dChzdGF0ZSkgewogIHZhciB0ID0gc3RhdGUuY29udGV4dC50eXBlOwogIGlmICh0ID09ICIpIiB8fCB0ID09ICJdIiB8fCB0ID09ICJ9IikKICAgIHN0YXRlLmluZGVudGVkID0gc3RhdGUuY29udGV4dC5pbmRlbnRlZDsKICByZXR1cm4gc3RhdGUuY29udGV4dCA9IHN0YXRlLmNvbnRleHQucHJldjsKfQoKZnVuY3Rpb24gdHlwZUJlZm9yZShzdHJlYW0sIHN0YXRlLCBwb3MpIHsKICBpZiAoc3RhdGUucHJldlRva2VuID09ICJ2YXJpYWJsZSIgfHwgc3RhdGUucHJldlRva2VuID09ICJ2YXJpYWJsZS0zIikgcmV0dXJuIHRydWU7CiAgaWYgKC9cUyg/OlteLSBdPnxbKlxdXSlccyokfFwqJC8udGVzdChzdHJlYW0uc3RyaW5nLnNsaWNlKDAsIHBvcykpKSByZXR1cm4gdHJ1ZTsKICBpZiAoc3RhdGUudHlwZUF0RW5kT2ZMaW5lICYmIHN0cmVhbS5jb2x1bW4oKSA9PSBzdHJlYW0uaW5kZW50YXRpb24oKSkgcmV0dXJuIHRydWU7Cn0KCmZ1bmN0aW9uIGlzVG9wU2NvcGUoY29udGV4dCkgewogIGZvciAoOzspIHsKICAgIGlmICghY29udGV4dCB8fCBjb250ZXh0LnR5cGUgPT0gInRvcCIpIHJldHVybiB0cnVlOwogICAgaWYgKGNvbnRleHQudHlwZSA9PSAifSIgJiYgY29udGV4dC5wcmV2LmluZm8gIT0gIm5hbWVzcGFjZSIpIHJldHVybiBmYWxzZTsKICAgIGNvbnRleHQgPSBjb250ZXh0LnByZXY7CiAgfQp9CgpDb2RlTWlycm9yLmRlZmluZU1vZGUoImNsaWtlIiwgZnVuY3Rpb24oY29uZmlnLCBwYXJzZXJDb25maWcpIHsKICB2YXIgaW5kZW50VW5pdCA9IGNvbmZpZy5pbmRlbnRVbml0LAogICAgICBzdGF0ZW1lbnRJbmRlbnRVbml0ID0gcGFyc2VyQ29uZmlnLnN0YXRlbWVudEluZGVudFVuaXQgfHwgaW5kZW50VW5pdCwKICAgICAgZG9udEFsaWduQ2FsbHMgPSBwYXJzZXJDb25maWcuZG9udEFsaWduQ2FsbHMsCiAgICAgIGtleXdvcmRzID0gcGFyc2VyQ29uZmlnLmtleXdvcmRzIHx8IHt9LAogICAgICB0eXBlcyA9IHBhcnNlckNvbmZpZy50eXBlcyB8fCB7fSwKICAgICAgYnVpbHRpbiA9IHBhcnNlckNvbmZpZy5idWlsdGluIHx8IHt9LAogICAgICBibG9ja0tleXdvcmRzID0gcGFyc2VyQ29uZmlnLmJsb2NrS2V5d29yZHMgfHwge30sCiAgICAgIGRlZktleXdvcmRzID0gcGFyc2VyQ29uZmlnLmRlZktleXdvcmRzIHx8IHt9LAogICAgICBhdG9tcyA9IHBhcnNlckNvbmZpZy5hdG9tcyB8fCB7fSwKICAgICAgaG9va3MgPSBwYXJzZXJDb25maWcuaG9va3MgfHwge30sCiAgICAgIG11bHRpTGluZVN0cmluZ3MgPSBwYXJzZXJDb25maWcubXVsdGlMaW5lU3RyaW5ncywKICAgICAgaW5kZW50U3RhdGVtZW50cyA9IHBhcnNlckNvbmZpZy5pbmRlbnRTdGF0ZW1lbnRzICE9PSBmYWxzZSwKICAgICAgaW5kZW50U3dpdGNoID0gcGFyc2VyQ29uZmlnLmluZGVudFN3aXRjaCAhPT0gZmFsc2UsCiAgICAgIG5hbWVzcGFjZVNlcGFyYXRvciA9IHBhcnNlckNvbmZpZy5uYW1lc3BhY2VTZXBhcmF0b3IsCiAgICAgIGlzUHVuY3R1YXRpb25DaGFyID0gcGFyc2VyQ29uZmlnLmlzUHVuY3R1YXRpb25DaGFyIHx8IC9bXFtcXXt9XChcKSw7XDpcLl0vLAogICAgICBudW1iZXJTdGFydCA9IHBhcnNlckNvbmZpZy5udW1iZXJTdGFydCB8fCAvW1xkXC5dLywKICAgICAgbnVtYmVyID0gcGFyc2VyQ29uZmlnLm51bWJlciB8fCAvXig/OjB4W2EtZlxkXSt8MGJbMDFdK3woPzpcZCtcLj9cZCp8XC5cZCspKD86ZVstK10/XGQrKT8pKHV8bGw/fGx8Zik/L2ksCiAgICAgIGlzT3BlcmF0b3JDaGFyID0gcGFyc2VyQ29uZmlnLmlzT3BlcmF0b3JDaGFyIHx8IC9bK1wtKiYlPTw+IT98XC9dLzsKCiAgdmFyIGN1clB1bmMsIGlzRGVmS2V5d29yZDsKCiAgZnVuY3Rpb24gdG9rZW5CYXNlKHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBjaCA9IHN0cmVhbS5uZXh0KCk7CiAgICBpZiAoaG9va3NbY2hdKSB7CiAgICAgIHZhciByZXN1bHQgPSBob29rc1tjaF0oc3RyZWFtLCBzdGF0ZSk7CiAgICAgIGlmIChyZXN1bHQgIT09IGZhbHNlKSByZXR1cm4gcmVzdWx0OwogICAgfQogICAgaWYgKGNoID09ICciJyB8fCBjaCA9PSAiJyIpIHsKICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlblN0cmluZyhjaCk7CiAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgIH0KICAgIGlmIChpc1B1bmN0dWF0aW9uQ2hhci50ZXN0KGNoKSkgewogICAgICBjdXJQdW5jID0gY2g7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgaWYgKG51bWJlclN0YXJ0LnRlc3QoY2gpKSB7CiAgICAgIHN0cmVhbS5iYWNrVXAoMSkKICAgICAgaWYgKHN0cmVhbS5tYXRjaChudW1iZXIpKSByZXR1cm4gIm51bWJlciIKICAgICAgc3RyZWFtLm5leHQoKQogICAgfQogICAgaWYgKGNoID09ICIvIikgewogICAgICBpZiAoc3RyZWFtLmVhdCgiKiIpKSB7CiAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkNvbW1lbnQ7CiAgICAgICAgcmV0dXJuIHRva2VuQ29tbWVudChzdHJlYW0sIHN0YXRlKTsKICAgICAgfQogICAgICBpZiAoc3RyZWFtLmVhdCgiLyIpKSB7CiAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICAgIHJldHVybiAiY29tbWVudCI7CiAgICAgIH0KICAgIH0KICAgIGlmIChpc09wZXJhdG9yQ2hhci50ZXN0KGNoKSkgewogICAgICB3aGlsZSAoIXN0cmVhbS5tYXRjaCgvXlwvW1wvKl0vLCBmYWxzZSkgJiYgc3RyZWFtLmVhdChpc09wZXJhdG9yQ2hhcikpIHt9CiAgICAgIHJldHVybiAib3BlcmF0b3IiOwogICAgfQogICAgc3RyZWFtLmVhdFdoaWxlKC9bXHdcJF9ceGExLVx1ZmZmZl0vKTsKICAgIGlmIChuYW1lc3BhY2VTZXBhcmF0b3IpIHdoaWxlIChzdHJlYW0ubWF0Y2gobmFtZXNwYWNlU2VwYXJhdG9yKSkKICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXHdcJF9ceGExLVx1ZmZmZl0vKTsKCiAgICB2YXIgY3VyID0gc3RyZWFtLmN1cnJlbnQoKTsKICAgIGlmIChjb250YWlucyhrZXl3b3JkcywgY3VyKSkgewogICAgICBpZiAoY29udGFpbnMoYmxvY2tLZXl3b3JkcywgY3VyKSkgY3VyUHVuYyA9ICJuZXdzdGF0ZW1lbnQiOwogICAgICBpZiAoY29udGFpbnMoZGVmS2V5d29yZHMsIGN1cikpIGlzRGVmS2V5d29yZCA9IHRydWU7CiAgICAgIHJldHVybiAia2V5d29yZCI7CiAgICB9CiAgICBpZiAoY29udGFpbnModHlwZXMsIGN1cikpIHJldHVybiAidmFyaWFibGUtMyI7CiAgICBpZiAoY29udGFpbnMoYnVpbHRpbiwgY3VyKSkgewogICAgICBpZiAoY29udGFpbnMoYmxvY2tLZXl3b3JkcywgY3VyKSkgY3VyUHVuYyA9ICJuZXdzdGF0ZW1lbnQiOwogICAgICByZXR1cm4gImJ1aWx0aW4iOwogICAgfQogICAgaWYgKGNvbnRhaW5zKGF0b21zLCBjdXIpKSByZXR1cm4gImF0b20iOwogICAgcmV0dXJuICJ2YXJpYWJsZSI7CiAgfQoKICBmdW5jdGlvbiB0b2tlblN0cmluZyhxdW90ZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgdmFyIGVzY2FwZWQgPSBmYWxzZSwgbmV4dCwgZW5kID0gZmFsc2U7CiAgICAgIHdoaWxlICgobmV4dCA9IHN0cmVhbS5uZXh0KCkpICE9IG51bGwpIHsKICAgICAgICBpZiAobmV4dCA9PSBxdW90ZSAmJiAhZXNjYXBlZCkge2VuZCA9IHRydWU7IGJyZWFrO30KICAgICAgICBlc2NhcGVkID0gIWVzY2FwZWQgJiYgbmV4dCA9PSAiXFwiOwogICAgICB9CiAgICAgIGlmIChlbmQgfHwgIShlc2NhcGVkIHx8IG11bHRpTGluZVN0cmluZ3MpKQogICAgICAgIHN0YXRlLnRva2VuaXplID0gbnVsbDsKICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgfTsKICB9CgogIGZ1bmN0aW9uIHRva2VuQ29tbWVudChzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgbWF5YmVFbmQgPSBmYWxzZSwgY2g7CiAgICB3aGlsZSAoY2ggPSBzdHJlYW0ubmV4dCgpKSB7CiAgICAgIGlmIChjaCA9PSAiLyIgJiYgbWF5YmVFbmQpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IG51bGw7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgbWF5YmVFbmQgPSAoY2ggPT0gIioiKTsKICAgIH0KICAgIHJldHVybiAiY29tbWVudCI7CiAgfQoKICBmdW5jdGlvbiBtYXliZUVPTChzdHJlYW0sIHN0YXRlKSB7CiAgICBpZiAocGFyc2VyQ29uZmlnLnR5cGVGaXJzdERlZmluaXRpb25zICYmIHN0cmVhbS5lb2woKSAmJiBpc1RvcFNjb3BlKHN0YXRlLmNvbnRleHQpKQogICAgICBzdGF0ZS50eXBlQXRFbmRPZkxpbmUgPSB0eXBlQmVmb3JlKHN0cmVhbSwgc3RhdGUsIHN0cmVhbS5wb3MpCiAgfQoKICAvLyBJbnRlcmZhY2UKCiAgcmV0dXJuIHsKICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKGJhc2Vjb2x1bW4pIHsKICAgICAgcmV0dXJuIHsKICAgICAgICB0b2tlbml6ZTogbnVsbCwKICAgICAgICBjb250ZXh0OiBuZXcgQ29udGV4dCgoYmFzZWNvbHVtbiB8fCAwKSAtIGluZGVudFVuaXQsIDAsICJ0b3AiLCBudWxsLCBmYWxzZSksCiAgICAgICAgaW5kZW50ZWQ6IDAsCiAgICAgICAgc3RhcnRPZkxpbmU6IHRydWUsCiAgICAgICAgcHJldlRva2VuOiBudWxsCiAgICAgIH07CiAgICB9LAoKICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHZhciBjdHggPSBzdGF0ZS5jb250ZXh0OwogICAgICBpZiAoc3RyZWFtLnNvbCgpKSB7CiAgICAgICAgaWYgKGN0eC5hbGlnbiA9PSBudWxsKSBjdHguYWxpZ24gPSBmYWxzZTsKICAgICAgICBzdGF0ZS5pbmRlbnRlZCA9IHN0cmVhbS5pbmRlbnRhdGlvbigpOwogICAgICAgIHN0YXRlLnN0YXJ0T2ZMaW5lID0gdHJ1ZTsKICAgICAgfQogICAgICBpZiAoc3RyZWFtLmVhdFNwYWNlKCkpIHsgbWF5YmVFT0woc3RyZWFtLCBzdGF0ZSk7IHJldHVybiBudWxsOyB9CiAgICAgIGN1clB1bmMgPSBpc0RlZktleXdvcmQgPSBudWxsOwogICAgICB2YXIgc3R5bGUgPSAoc3RhdGUudG9rZW5pemUgfHwgdG9rZW5CYXNlKShzdHJlYW0sIHN0YXRlKTsKICAgICAgaWYgKHN0eWxlID09ICJjb21tZW50IiB8fCBzdHlsZSA9PSAibWV0YSIpIHJldHVybiBzdHlsZTsKICAgICAgaWYgKGN0eC5hbGlnbiA9PSBudWxsKSBjdHguYWxpZ24gPSB0cnVlOwoKICAgICAgaWYgKGN1clB1bmMgPT0gIjsiIHx8IGN1clB1bmMgPT0gIjoiIHx8IChjdXJQdW5jID09ICIsIiAmJiBzdHJlYW0ubWF0Y2goL15ccyooPzpcL1wvLiopPyQvLCBmYWxzZSkpKQogICAgICAgIHdoaWxlIChzdGF0ZS5jb250ZXh0LnR5cGUgPT0gInN0YXRlbWVudCIpIHBvcENvbnRleHQoc3RhdGUpOwogICAgICBlbHNlIGlmIChjdXJQdW5jID09ICJ7IikgcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbS5jb2x1bW4oKSwgIn0iKTsKICAgICAgZWxzZSBpZiAoY3VyUHVuYyA9PSAiWyIpIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0uY29sdW1uKCksICJdIik7CiAgICAgIGVsc2UgaWYgKGN1clB1bmMgPT0gIigiKSBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLmNvbHVtbigpLCAiKSIpOwogICAgICBlbHNlIGlmIChjdXJQdW5jID09ICJ9IikgewogICAgICAgIHdoaWxlIChjdHgudHlwZSA9PSAic3RhdGVtZW50IikgY3R4ID0gcG9wQ29udGV4dChzdGF0ZSk7CiAgICAgICAgaWYgKGN0eC50eXBlID09ICJ9IikgY3R4ID0gcG9wQ29udGV4dChzdGF0ZSk7CiAgICAgICAgd2hpbGUgKGN0eC50eXBlID09ICJzdGF0ZW1lbnQiKSBjdHggPSBwb3BDb250ZXh0KHN0YXRlKTsKICAgICAgfQogICAgICBlbHNlIGlmIChjdXJQdW5jID09IGN0eC50eXBlKSBwb3BDb250ZXh0KHN0YXRlKTsKICAgICAgZWxzZSBpZiAoaW5kZW50U3RhdGVtZW50cyAmJgogICAgICAgICAgICAgICAoKChjdHgudHlwZSA9PSAifSIgfHwgY3R4LnR5cGUgPT0gInRvcCIpICYmIGN1clB1bmMgIT0gIjsiKSB8fAogICAgICAgICAgICAgICAgKGN0eC50eXBlID09ICJzdGF0ZW1lbnQiICYmIGN1clB1bmMgPT0gIm5ld3N0YXRlbWVudCIpKSkgewogICAgICAgIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0uY29sdW1uKCksICJzdGF0ZW1lbnQiLCBzdHJlYW0uY3VycmVudCgpKTsKICAgICAgfQoKICAgICAgaWYgKHN0eWxlID09ICJ2YXJpYWJsZSIgJiYKICAgICAgICAgICgoc3RhdGUucHJldlRva2VuID09ICJkZWYiIHx8CiAgICAgICAgICAgIChwYXJzZXJDb25maWcudHlwZUZpcnN0RGVmaW5pdGlvbnMgJiYgdHlwZUJlZm9yZShzdHJlYW0sIHN0YXRlLCBzdHJlYW0uc3RhcnQpICYmCiAgICAgICAgICAgICBpc1RvcFNjb3BlKHN0YXRlLmNvbnRleHQpICYmIHN0cmVhbS5tYXRjaCgvXlxzKlwoLywgZmFsc2UpKSkpKQogICAgICAgIHN0eWxlID0gImRlZiI7CgogICAgICBpZiAoaG9va3MudG9rZW4pIHsKICAgICAgICB2YXIgcmVzdWx0ID0gaG9va3MudG9rZW4oc3RyZWFtLCBzdGF0ZSwgc3R5bGUpOwogICAgICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCkgc3R5bGUgPSByZXN1bHQ7CiAgICAgIH0KCiAgICAgIGlmIChzdHlsZSA9PSAiZGVmIiAmJiBwYXJzZXJDb25maWcuc3R5bGVEZWZzID09PSBmYWxzZSkgc3R5bGUgPSAidmFyaWFibGUiOwoKICAgICAgc3RhdGUuc3RhcnRPZkxpbmUgPSBmYWxzZTsKICAgICAgc3RhdGUucHJldlRva2VuID0gaXNEZWZLZXl3b3JkID8gImRlZiIgOiBzdHlsZSB8fCBjdXJQdW5jOwogICAgICBtYXliZUVPTChzdHJlYW0sIHN0YXRlKTsKICAgICAgcmV0dXJuIHN0eWxlOwogICAgfSwKCiAgICBpbmRlbnQ6IGZ1bmN0aW9uKHN0YXRlLCB0ZXh0QWZ0ZXIpIHsKICAgICAgaWYgKHN0YXRlLnRva2VuaXplICE9IHRva2VuQmFzZSAmJiBzdGF0ZS50b2tlbml6ZSAhPSBudWxsIHx8IHN0YXRlLnR5cGVBdEVuZE9mTGluZSkgcmV0dXJuIENvZGVNaXJyb3IuUGFzczsKICAgICAgdmFyIGN0eCA9IHN0YXRlLmNvbnRleHQsIGZpcnN0Q2hhciA9IHRleHRBZnRlciAmJiB0ZXh0QWZ0ZXIuY2hhckF0KDApOwogICAgICBpZiAoY3R4LnR5cGUgPT0gInN0YXRlbWVudCIgJiYgZmlyc3RDaGFyID09ICJ9IikgY3R4ID0gY3R4LnByZXY7CiAgICAgIGlmIChwYXJzZXJDb25maWcuZG9udEluZGVudFN0YXRlbWVudHMpCiAgICAgICAgd2hpbGUgKGN0eC50eXBlID09ICJzdGF0ZW1lbnQiICYmIHBhcnNlckNvbmZpZy5kb250SW5kZW50U3RhdGVtZW50cy50ZXN0KGN0eC5pbmZvKSkKICAgICAgICAgIGN0eCA9IGN0eC5wcmV2CiAgICAgIGlmIChob29rcy5pbmRlbnQpIHsKICAgICAgICB2YXIgaG9vayA9IGhvb2tzLmluZGVudChzdGF0ZSwgY3R4LCB0ZXh0QWZ0ZXIpOwogICAgICAgIGlmICh0eXBlb2YgaG9vayA9PSAibnVtYmVyIikgcmV0dXJuIGhvb2sKICAgICAgfQogICAgICB2YXIgY2xvc2luZyA9IGZpcnN0Q2hhciA9PSBjdHgudHlwZTsKICAgICAgdmFyIHN3aXRjaEJsb2NrID0gY3R4LnByZXYgJiYgY3R4LnByZXYuaW5mbyA9PSAic3dpdGNoIjsKICAgICAgaWYgKHBhcnNlckNvbmZpZy5hbGxtYW5JbmRlbnRhdGlvbiAmJiAvW3soXS8udGVzdChmaXJzdENoYXIpKSB7CiAgICAgICAgd2hpbGUgKGN0eC50eXBlICE9ICJ0b3AiICYmIGN0eC50eXBlICE9ICJ9IikgY3R4ID0gY3R4LnByZXYKICAgICAgICByZXR1cm4gY3R4LmluZGVudGVkCiAgICAgIH0KICAgICAgaWYgKGN0eC50eXBlID09ICJzdGF0ZW1lbnQiKQogICAgICAgIHJldHVybiBjdHguaW5kZW50ZWQgKyAoZmlyc3RDaGFyID09ICJ7IiA/IDAgOiBzdGF0ZW1lbnRJbmRlbnRVbml0KTsKICAgICAgaWYgKGN0eC5hbGlnbiAmJiAoIWRvbnRBbGlnbkNhbGxzIHx8IGN0eC50eXBlICE9ICIpIikpCiAgICAgICAgcmV0dXJuIGN0eC5jb2x1bW4gKyAoY2xvc2luZyA/IDAgOiAxKTsKICAgICAgaWYgKGN0eC50eXBlID09ICIpIiAmJiAhY2xvc2luZykKICAgICAgICByZXR1cm4gY3R4LmluZGVudGVkICsgc3RhdGVtZW50SW5kZW50VW5pdDsKCiAgICAgIHJldHVybiBjdHguaW5kZW50ZWQgKyAoY2xvc2luZyA/IDAgOiBpbmRlbnRVbml0KSArCiAgICAgICAgKCFjbG9zaW5nICYmIHN3aXRjaEJsb2NrICYmICEvXig/OmNhc2V8ZGVmYXVsdClcYi8udGVzdCh0ZXh0QWZ0ZXIpID8gaW5kZW50VW5pdCA6IDApOwogICAgfSwKCiAgICBlbGVjdHJpY0lucHV0OiBpbmRlbnRTd2l0Y2ggPyAvXlxzKig/OmNhc2UgLio/OnxkZWZhdWx0Onxce1x9P3xcfSkkLyA6IC9eXHMqW3t9XSQvLAogICAgYmxvY2tDb21tZW50U3RhcnQ6ICIvKiIsCiAgICBibG9ja0NvbW1lbnRFbmQ6ICIqLyIsCiAgICBsaW5lQ29tbWVudDogIi8vIiwKICAgIGZvbGQ6ICJicmFjZSIKICB9Owp9KTsKCiAgZnVuY3Rpb24gd29yZHMoc3RyKSB7CiAgICB2YXIgb2JqID0ge30sIHdvcmRzID0gc3RyLnNwbGl0KCIgIik7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHdvcmRzLmxlbmd0aDsgKytpKSBvYmpbd29yZHNbaV1dID0gdHJ1ZTsKICAgIHJldHVybiBvYmo7CiAgfQogIGZ1bmN0aW9uIGNvbnRhaW5zKHdvcmRzLCB3b3JkKSB7CiAgICBpZiAodHlwZW9mIHdvcmRzID09PSAiZnVuY3Rpb24iKSB7CiAgICAgIHJldHVybiB3b3Jkcyh3b3JkKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB3b3Jkcy5wcm9wZXJ0eUlzRW51bWVyYWJsZSh3b3JkKTsKICAgIH0KICB9CiAgdmFyIGNLZXl3b3JkcyA9ICJhdXRvIGlmIGJyZWFrIGNhc2UgcmVnaXN0ZXIgY29udGludWUgcmV0dXJuIGRlZmF1bHQgZG8gc2l6ZW9mICIgKwogICAgInN0YXRpYyBlbHNlIHN0cnVjdCBzd2l0Y2ggZXh0ZXJuIHR5cGVkZWYgdW5pb24gZm9yIGdvdG8gd2hpbGUgZW51bSBjb25zdCB2b2xhdGlsZSI7CiAgdmFyIGNUeXBlcyA9ICJpbnQgbG9uZyBjaGFyIHNob3J0IGRvdWJsZSBmbG9hdCB1bnNpZ25lZCBzaWduZWQgdm9pZCBzaXplX3QgcHRyZGlmZl90IjsKCiAgZnVuY3Rpb24gY3BwSG9vayhzdHJlYW0sIHN0YXRlKSB7CiAgICBpZiAoIXN0YXRlLnN0YXJ0T2ZMaW5lKSByZXR1cm4gZmFsc2UKICAgIGZvciAodmFyIGNoLCBuZXh0ID0gbnVsbDsgY2ggPSBzdHJlYW0ucGVlaygpOykgewogICAgICBpZiAoY2ggPT0gIlxcIiAmJiBzdHJlYW0ubWF0Y2goL14uJC8pKSB7CiAgICAgICAgbmV4dCA9IGNwcEhvb2sKICAgICAgICBicmVhawogICAgICB9IGVsc2UgaWYgKGNoID09ICIvIiAmJiBzdHJlYW0ubWF0Y2goL15cL1tcL1wqXS8sIGZhbHNlKSkgewogICAgICAgIGJyZWFrCiAgICAgIH0KICAgICAgc3RyZWFtLm5leHQoKQogICAgfQogICAgc3RhdGUudG9rZW5pemUgPSBuZXh0CiAgICByZXR1cm4gIm1ldGEiCiAgfQoKICBmdW5jdGlvbiBwb2ludGVySG9vayhfc3RyZWFtLCBzdGF0ZSkgewogICAgaWYgKHN0YXRlLnByZXZUb2tlbiA9PSAidmFyaWFibGUtMyIpIHJldHVybiAidmFyaWFibGUtMyI7CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBmdW5jdGlvbiBjcHAxNExpdGVyYWwoc3RyZWFtKSB7CiAgICBzdHJlYW0uZWF0V2hpbGUoL1tcd1wuJ10vKTsKICAgIHJldHVybiAibnVtYmVyIjsKICB9CgogIGZ1bmN0aW9uIGNwcDExU3RyaW5nSG9vayhzdHJlYW0sIHN0YXRlKSB7CiAgICBzdHJlYW0uYmFja1VwKDEpOwogICAgLy8gUmF3IHN0cmluZ3MuCiAgICBpZiAoc3RyZWFtLm1hdGNoKC8oUnx1OFJ8dVJ8VVJ8TFIpLykpIHsKICAgICAgdmFyIG1hdGNoID0gc3RyZWFtLm1hdGNoKC8iKFteXHNcXCgpXXswLDE2fSlcKC8pOwogICAgICBpZiAoIW1hdGNoKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIHN0YXRlLmNwcDExUmF3U3RyaW5nRGVsaW0gPSBtYXRjaFsxXTsKICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlblJhd1N0cmluZzsKICAgICAgcmV0dXJuIHRva2VuUmF3U3RyaW5nKHN0cmVhbSwgc3RhdGUpOwogICAgfQogICAgLy8gVW5pY29kZSBzdHJpbmdzL2NoYXJzLgogICAgaWYgKHN0cmVhbS5tYXRjaCgvKHU4fHV8VXxMKS8pKSB7CiAgICAgIGlmIChzdHJlYW0ubWF0Y2goL1siJ10vLCAvKiBlYXQgKi8gZmFsc2UpKSB7CiAgICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgICB9CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIC8vIElnbm9yZSB0aGlzIGhvb2suCiAgICBzdHJlYW0ubmV4dCgpOwogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgZnVuY3Rpb24gY3BwTG9va3NMaWtlQ29uc3RydWN0b3Iod29yZCkgewogICAgdmFyIGxhc3RUd28gPSAvKFx3Kyk6OihcdyspJC8uZXhlYyh3b3JkKTsKICAgIHJldHVybiBsYXN0VHdvICYmIGxhc3RUd29bMV0gPT0gbGFzdFR3b1syXTsKICB9CgogIC8vIEMjLXN0eWxlIHN0cmluZ3Mgd2hlcmUgIiIgZXNjYXBlcyBhIHF1b3RlLgogIGZ1bmN0aW9uIHRva2VuQXRTdHJpbmcoc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIG5leHQ7CiAgICB3aGlsZSAoKG5leHQgPSBzdHJlYW0ubmV4dCgpKSAhPSBudWxsKSB7CiAgICAgIGlmIChuZXh0ID09ICciJyAmJiAhc3RyZWFtLmVhdCgnIicpKSB7CiAgICAgICAgc3RhdGUudG9rZW5pemUgPSBudWxsOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gInN0cmluZyI7CiAgfQoKICAvLyBDKysxMSByYXcgc3RyaW5nIGxpdGVyYWwgaXMgPHByZWZpeD4iPGRlbGltPiggYW55dGhpbmcgKTxkZWxpbT4iLCB3aGVyZQogIC8vIDxkZWxpbT4gY2FuIGJlIGEgc3RyaW5nIHVwIHRvIDE2IGNoYXJhY3RlcnMgbG9uZy4KICBmdW5jdGlvbiB0b2tlblJhd1N0cmluZyhzdHJlYW0sIHN0YXRlKSB7CiAgICAvLyBFc2NhcGUgY2hhcmFjdGVycyB0aGF0IGhhdmUgc3BlY2lhbCByZWdleCBtZWFuaW5ncy4KICAgIHZhciBkZWxpbSA9IHN0YXRlLmNwcDExUmF3U3RyaW5nRGVsaW0ucmVwbGFjZSgvW15cd1xzXS9nLCAnXFwkJicpOwogICAgdmFyIG1hdGNoID0gc3RyZWFtLm1hdGNoKG5ldyBSZWdFeHAoIi4qP1xcKSIgKyBkZWxpbSArICciJykpOwogICAgaWYgKG1hdGNoKQogICAgICBzdGF0ZS50b2tlbml6ZSA9IG51bGw7CiAgICBlbHNlCiAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgIHJldHVybiAic3RyaW5nIjsKICB9CgogIGZ1bmN0aW9uIGRlZihtaW1lcywgbW9kZSkgewogICAgaWYgKHR5cGVvZiBtaW1lcyA9PSAic3RyaW5nIikgbWltZXMgPSBbbWltZXNdOwogICAgdmFyIHdvcmRzID0gW107CiAgICBmdW5jdGlvbiBhZGQob2JqKSB7CiAgICAgIGlmIChvYmopIGZvciAodmFyIHByb3AgaW4gb2JqKSBpZiAob2JqLmhhc093blByb3BlcnR5KHByb3ApKQogICAgICAgIHdvcmRzLnB1c2gocHJvcCk7CiAgICB9CiAgICBhZGQobW9kZS5rZXl3b3Jkcyk7CiAgICBhZGQobW9kZS50eXBlcyk7CiAgICBhZGQobW9kZS5idWlsdGluKTsKICAgIGFkZChtb2RlLmF0b21zKTsKICAgIGlmICh3b3Jkcy5sZW5ndGgpIHsKICAgICAgbW9kZS5oZWxwZXJUeXBlID0gbWltZXNbMF07CiAgICAgIENvZGVNaXJyb3IucmVnaXN0ZXJIZWxwZXIoImhpbnRXb3JkcyIsIG1pbWVzWzBdLCB3b3Jkcyk7CiAgICB9CgogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtaW1lcy5sZW5ndGg7ICsraSkKICAgICAgQ29kZU1pcnJvci5kZWZpbmVNSU1FKG1pbWVzW2ldLCBtb2RlKTsKICB9CgogIGRlZihbInRleHQveC1jc3JjIiwgInRleHQveC1jIiwgInRleHQveC1jaGRyIl0sIHsKICAgIG5hbWU6ICJjbGlrZSIsCiAgICBrZXl3b3Jkczogd29yZHMoY0tleXdvcmRzKSwKICAgIHR5cGVzOiB3b3JkcyhjVHlwZXMgKyAiIGJvb2wgX0NvbXBsZXggX0Jvb2wgZmxvYXRfdCBkb3VibGVfdCBpbnRwdHJfdCBpbnRtYXhfdCAiICsKICAgICAgICAgICAgICAgICAiaW50OF90IGludDE2X3QgaW50MzJfdCBpbnQ2NF90IHVpbnRwdHJfdCB1aW50bWF4X3QgdWludDhfdCB1aW50MTZfdCAiICsKICAgICAgICAgICAgICAgICAidWludDMyX3QgdWludDY0X3QiKSwKICAgIGJsb2NrS2V5d29yZHM6IHdvcmRzKCJjYXNlIGRvIGVsc2UgZm9yIGlmIHN3aXRjaCB3aGlsZSBzdHJ1Y3QiKSwKICAgIGRlZktleXdvcmRzOiB3b3Jkcygic3RydWN0IiksCiAgICB0eXBlRmlyc3REZWZpbml0aW9uczogdHJ1ZSwKICAgIGF0b21zOiB3b3JkcygibnVsbCB0cnVlIGZhbHNlIiksCiAgICBob29rczogeyIjIjogY3BwSG9vaywgIioiOiBwb2ludGVySG9va30sCiAgICBtb2RlUHJvcHM6IHtmb2xkOiBbImJyYWNlIiwgImluY2x1ZGUiXX0KICB9KTsKCiAgZGVmKFsidGV4dC94LWMrK3NyYyIsICJ0ZXh0L3gtYysraGRyIl0sIHsKICAgIG5hbWU6ICJjbGlrZSIsCiAgICBrZXl3b3Jkczogd29yZHMoY0tleXdvcmRzICsgIiBhc20gZHluYW1pY19jYXN0IG5hbWVzcGFjZSByZWludGVycHJldF9jYXN0IHRyeSBleHBsaWNpdCBuZXcgIiArCiAgICAgICAgICAgICAgICAgICAgInN0YXRpY19jYXN0IHR5cGVpZCBjYXRjaCBvcGVyYXRvciB0ZW1wbGF0ZSB0eXBlbmFtZSBjbGFzcyBmcmllbmQgcHJpdmF0ZSAiICsKICAgICAgICAgICAgICAgICAgICAidGhpcyB1c2luZyBjb25zdF9jYXN0IGlubGluZSBwdWJsaWMgdGhyb3cgdmlydHVhbCBkZWxldGUgbXV0YWJsZSBwcm90ZWN0ZWQgIiArCiAgICAgICAgICAgICAgICAgICAgImFsaWduYXMgYWxpZ25vZiBjb25zdGV4cHIgZGVjbHR5cGUgbnVsbHB0ciBub2V4Y2VwdCB0aHJlYWRfbG9jYWwgZmluYWwgIiArCiAgICAgICAgICAgICAgICAgICAgInN0YXRpY19hc3NlcnQgb3ZlcnJpZGUiKSwKICAgIHR5cGVzOiB3b3JkcyhjVHlwZXMgKyAiIGJvb2wgd2NoYXJfdCIpLAogICAgYmxvY2tLZXl3b3Jkczogd29yZHMoImNhdGNoIGNsYXNzIGRvIGVsc2UgZmluYWxseSBmb3IgaWYgc3RydWN0IHN3aXRjaCB0cnkgd2hpbGUiKSwKICAgIGRlZktleXdvcmRzOiB3b3JkcygiY2xhc3MgbmFtZXNwYWNlIHN0cnVjdCBlbnVtIHVuaW9uIiksCiAgICB0eXBlRmlyc3REZWZpbml0aW9uczogdHJ1ZSwKICAgIGF0b21zOiB3b3JkcygidHJ1ZSBmYWxzZSBudWxsIiksCiAgICBkb250SW5kZW50U3RhdGVtZW50czogL150ZW1wbGF0ZSQvLAogICAgaG9va3M6IHsKICAgICAgIiMiOiBjcHBIb29rLAogICAgICAiKiI6IHBvaW50ZXJIb29rLAogICAgICAidSI6IGNwcDExU3RyaW5nSG9vaywKICAgICAgIlUiOiBjcHAxMVN0cmluZ0hvb2ssCiAgICAgICJMIjogY3BwMTFTdHJpbmdIb29rLAogICAgICAiUiI6IGNwcDExU3RyaW5nSG9vaywKICAgICAgIjAiOiBjcHAxNExpdGVyYWwsCiAgICAgICIxIjogY3BwMTRMaXRlcmFsLAogICAgICAiMiI6IGNwcDE0TGl0ZXJhbCwKICAgICAgIjMiOiBjcHAxNExpdGVyYWwsCiAgICAgICI0IjogY3BwMTRMaXRlcmFsLAogICAgICAiNSI6IGNwcDE0TGl0ZXJhbCwKICAgICAgIjYiOiBjcHAxNExpdGVyYWwsCiAgICAgICI3IjogY3BwMTRMaXRlcmFsLAogICAgICAiOCI6IGNwcDE0TGl0ZXJhbCwKICAgICAgIjkiOiBjcHAxNExpdGVyYWwsCiAgICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlLCBzdHlsZSkgewogICAgICAgIGlmIChzdHlsZSA9PSAidmFyaWFibGUiICYmIHN0cmVhbS5wZWVrKCkgPT0gIigiICYmCiAgICAgICAgICAgIChzdGF0ZS5wcmV2VG9rZW4gPT0gIjsiIHx8IHN0YXRlLnByZXZUb2tlbiA9PSBudWxsIHx8CiAgICAgICAgICAgICBzdGF0ZS5wcmV2VG9rZW4gPT0gIn0iKSAmJgogICAgICAgICAgICBjcHBMb29rc0xpa2VDb25zdHJ1Y3RvcihzdHJlYW0uY3VycmVudCgpKSkKICAgICAgICAgIHJldHVybiAiZGVmIjsKICAgICAgfQogICAgfSwKICAgIG5hbWVzcGFjZVNlcGFyYXRvcjogIjo6IiwKICAgIG1vZGVQcm9wczoge2ZvbGQ6IFsiYnJhY2UiLCAiaW5jbHVkZSJdfQogIH0pOwoKICBkZWYoInRleHQveC1qYXZhIiwgewogICAgbmFtZTogImNsaWtlIiwKICAgIGtleXdvcmRzOiB3b3JkcygiYWJzdHJhY3QgYXNzZXJ0IGJyZWFrIGNhc2UgY2F0Y2ggY2xhc3MgY29uc3QgY29udGludWUgZGVmYXVsdCAiICsKICAgICAgICAgICAgICAgICAgICAiZG8gZWxzZSBlbnVtIGV4dGVuZHMgZmluYWwgZmluYWxseSBmbG9hdCBmb3IgZ290byBpZiBpbXBsZW1lbnRzIGltcG9ydCAiICsKICAgICAgICAgICAgICAgICAgICAiaW5zdGFuY2VvZiBpbnRlcmZhY2UgbmF0aXZlIG5ldyBwYWNrYWdlIHByaXZhdGUgcHJvdGVjdGVkIHB1YmxpYyAiICsKICAgICAgICAgICAgICAgICAgICAicmV0dXJuIHN0YXRpYyBzdHJpY3RmcCBzdXBlciBzd2l0Y2ggc3luY2hyb25pemVkIHRoaXMgdGhyb3cgdGhyb3dzIHRyYW5zaWVudCAiICsKICAgICAgICAgICAgICAgICAgICAidHJ5IHZvbGF0aWxlIHdoaWxlIiksCiAgICB0eXBlczogd29yZHMoImJ5dGUgc2hvcnQgaW50IGxvbmcgZmxvYXQgZG91YmxlIGJvb2xlYW4gY2hhciB2b2lkIEJvb2xlYW4gQnl0ZSBDaGFyYWN0ZXIgRG91YmxlIEZsb2F0ICIgKwogICAgICAgICAgICAgICAgICJJbnRlZ2VyIExvbmcgTnVtYmVyIE9iamVjdCBTaG9ydCBTdHJpbmcgU3RyaW5nQnVmZmVyIFN0cmluZ0J1aWxkZXIgVm9pZCIpLAogICAgYmxvY2tLZXl3b3Jkczogd29yZHMoImNhdGNoIGNsYXNzIGRvIGVsc2UgZmluYWxseSBmb3IgaWYgc3dpdGNoIHRyeSB3aGlsZSIpLAogICAgZGVmS2V5d29yZHM6IHdvcmRzKCJjbGFzcyBpbnRlcmZhY2UgcGFja2FnZSBlbnVtIiksCiAgICB0eXBlRmlyc3REZWZpbml0aW9uczogdHJ1ZSwKICAgIGF0b21zOiB3b3JkcygidHJ1ZSBmYWxzZSBudWxsIiksCiAgICBudW1iZXI6IC9eKD86MHhbYS1mXGRfXSt8MGJbMDFfXSt8KD86W1xkX10rXC4/XGQqfFwuXGQrKSg/OmVbLStdP1tcZF9dKyk/KSh1fGxsP3xsfGYpPy9pLAogICAgaG9va3M6IHsKICAgICAgIkAiOiBmdW5jdGlvbihzdHJlYW0pIHsKICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcd1wkX10vKTsKICAgICAgICByZXR1cm4gIm1ldGEiOwogICAgICB9CiAgICB9LAogICAgbW9kZVByb3BzOiB7Zm9sZDogWyJicmFjZSIsICJpbXBvcnQiXX0KICB9KTsKCiAgZGVmKCJ0ZXh0L3gtY3NoYXJwIiwgewogICAgbmFtZTogImNsaWtlIiwKICAgIGtleXdvcmRzOiB3b3JkcygiYWJzdHJhY3QgYXMgYXN5bmMgYXdhaXQgYmFzZSBicmVhayBjYXNlIGNhdGNoIGNoZWNrZWQgY2xhc3MgY29uc3QgY29udGludWUiICsKICAgICAgICAgICAgICAgICAgICAiIGRlZmF1bHQgZGVsZWdhdGUgZG8gZWxzZSBlbnVtIGV2ZW50IGV4cGxpY2l0IGV4dGVybiBmaW5hbGx5IGZpeGVkIGZvciIgKwogICAgICAgICAgICAgICAgICAgICIgZm9yZWFjaCBnb3RvIGlmIGltcGxpY2l0IGluIGludGVyZmFjZSBpbnRlcm5hbCBpcyBsb2NrIG5hbWVzcGFjZSBuZXciICsKICAgICAgICAgICAgICAgICAgICAiIG9wZXJhdG9yIG91dCBvdmVycmlkZSBwYXJhbXMgcHJpdmF0ZSBwcm90ZWN0ZWQgcHVibGljIHJlYWRvbmx5IHJlZiByZXR1cm4gc2VhbGVkIiArCiAgICAgICAgICAgICAgICAgICAgIiBzaXplb2Ygc3RhY2thbGxvYyBzdGF0aWMgc3RydWN0IHN3aXRjaCB0aGlzIHRocm93IHRyeSB0eXBlb2YgdW5jaGVja2VkIiArCiAgICAgICAgICAgICAgICAgICAgIiB1bnNhZmUgdXNpbmcgdmlydHVhbCB2b2lkIHZvbGF0aWxlIHdoaWxlIGFkZCBhbGlhcyBhc2NlbmRpbmcgZGVzY2VuZGluZyBkeW5hbWljIGZyb20gZ2V0IiArCiAgICAgICAgICAgICAgICAgICAgIiBnbG9iYWwgZ3JvdXAgaW50byBqb2luIGxldCBvcmRlcmJ5IHBhcnRpYWwgcmVtb3ZlIHNlbGVjdCBzZXQgdmFsdWUgdmFyIHlpZWxkIiksCiAgICB0eXBlczogd29yZHMoIkFjdGlvbiBCb29sZWFuIEJ5dGUgQ2hhciBEYXRlVGltZSBEYXRlVGltZU9mZnNldCBEZWNpbWFsIERvdWJsZSBGdW5jIiArCiAgICAgICAgICAgICAgICAgIiBHdWlkIEludDE2IEludDMyIEludDY0IE9iamVjdCBTQnl0ZSBTaW5nbGUgU3RyaW5nIFRhc2sgVGltZVNwYW4gVUludDE2IFVJbnQzMiIgKwogICAgICAgICAgICAgICAgICIgVUludDY0IGJvb2wgYnl0ZSBjaGFyIGRlY2ltYWwgZG91YmxlIHNob3J0IGludCBsb25nIG9iamVjdCIgICsKICAgICAgICAgICAgICAgICAiIHNieXRlIGZsb2F0IHN0cmluZyB1c2hvcnQgdWludCB1bG9uZyIpLAogICAgYmxvY2tLZXl3b3Jkczogd29yZHMoImNhdGNoIGNsYXNzIGRvIGVsc2UgZmluYWxseSBmb3IgZm9yZWFjaCBpZiBzdHJ1Y3Qgc3dpdGNoIHRyeSB3aGlsZSIpLAogICAgZGVmS2V5d29yZHM6IHdvcmRzKCJjbGFzcyBpbnRlcmZhY2UgbmFtZXNwYWNlIHN0cnVjdCB2YXIiKSwKICAgIHR5cGVGaXJzdERlZmluaXRpb25zOiB0cnVlLAogICAgYXRvbXM6IHdvcmRzKCJ0cnVlIGZhbHNlIG51bGwiKSwKICAgIGhvb2tzOiB7CiAgICAgICJAIjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICAgIGlmIChzdHJlYW0uZWF0KCciJykpIHsKICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5BdFN0cmluZzsKICAgICAgICAgIHJldHVybiB0b2tlbkF0U3RyaW5nKHN0cmVhbSwgc3RhdGUpOwogICAgICAgIH0KICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcd1wkX10vKTsKICAgICAgICByZXR1cm4gIm1ldGEiOwogICAgICB9CiAgICB9CiAgfSk7CgogIGZ1bmN0aW9uIHRva2VuVHJpcGxlU3RyaW5nKHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBlc2NhcGVkID0gZmFsc2U7CiAgICB3aGlsZSAoIXN0cmVhbS5lb2woKSkgewogICAgICBpZiAoIWVzY2FwZWQgJiYgc3RyZWFtLm1hdGNoKCciIiInKSkgewogICAgICAgIHN0YXRlLnRva2VuaXplID0gbnVsbDsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBlc2NhcGVkID0gc3RyZWFtLm5leHQoKSA9PSAiXFwiICYmICFlc2NhcGVkOwogICAgfQogICAgcmV0dXJuICJzdHJpbmciOwogIH0KCiAgZGVmKCJ0ZXh0L3gtc2NhbGEiLCB7CiAgICBuYW1lOiAiY2xpa2UiLAogICAga2V5d29yZHM6IHdvcmRzKAoKICAgICAgLyogc2NhbGEgKi8KICAgICAgImFic3RyYWN0IGNhc2UgY2F0Y2ggY2xhc3MgZGVmIGRvIGVsc2UgZXh0ZW5kcyBmaW5hbCBmaW5hbGx5IGZvciBmb3JTb21lIGlmICIgKwogICAgICAiaW1wbGljaXQgaW1wb3J0IGxhenkgbWF0Y2ggbmV3IG51bGwgb2JqZWN0IG92ZXJyaWRlIHBhY2thZ2UgcHJpdmF0ZSBwcm90ZWN0ZWQgcmV0dXJuICIgKwogICAgICAic2VhbGVkIHN1cGVyIHRoaXMgdGhyb3cgdHJhaXQgdHJ5IHR5cGUgdmFsIHZhciB3aGlsZSB3aXRoIHlpZWxkIF8gOiA9ID0+IDwtIDw6ICIgKwogICAgICAiPCUgPjogIyBAICIgKwoKICAgICAgLyogcGFja2FnZSBzY2FsYSAqLwogICAgICAiYXNzZXJ0IGFzc3VtZSByZXF1aXJlIHByaW50IHByaW50bG4gcHJpbnRmIHJlYWRMaW5lIHJlYWRCb29sZWFuIHJlYWRCeXRlIHJlYWRTaG9ydCAiICsKICAgICAgInJlYWRDaGFyIHJlYWRJbnQgcmVhZExvbmcgcmVhZEZsb2F0IHJlYWREb3VibGUgIiArCgogICAgICAiOjogIzo6ICIKICAgICksCiAgICB0eXBlczogd29yZHMoCiAgICAgICJBbnlWYWwgQXBwIEFwcGxpY2F0aW9uIEFycmF5IEJ1ZmZlcmVkSXRlcmF0b3IgQmlnRGVjaW1hbCBCaWdJbnQgQ2hhciBDb25zb2xlIEVpdGhlciAiICsKICAgICAgIkVudW1lcmF0aW9uIEVxdWl2IEVycm9yIEV4Y2VwdGlvbiBGcmFjdGlvbmFsIEZ1bmN0aW9uIEluZGV4ZWRTZXEgSW50IEludGVncmFsIEl0ZXJhYmxlICIgKwogICAgICAiSXRlcmF0b3IgTGlzdCBNYXAgTnVtZXJpYyBOaWwgTm90TnVsbCBPcHRpb24gT3JkZXJlZCBPcmRlcmluZyBQYXJ0aWFsRnVuY3Rpb24gUGFydGlhbE9yZGVyaW5nICIgKwogICAgICAiUHJvZHVjdCBQcm94eSBSYW5nZSBSZXNwb25kZXIgU2VxIFNlcmlhbGl6YWJsZSBTZXQgU3BlY2lhbGl6YWJsZSBTdHJlYW0gU3RyaW5nQnVpbGRlciAiICsKICAgICAgIlN0cmluZ0NvbnRleHQgU3ltYm9sIFRocm93YWJsZSBUcmF2ZXJzYWJsZSBUcmF2ZXJzYWJsZU9uY2UgVHVwbGUgVW5pdCBWZWN0b3IgIiArCgogICAgICAvKiBwYWNrYWdlIGphdmEubGFuZyAqLwogICAgICAiQm9vbGVhbiBCeXRlIENoYXJhY3RlciBDaGFyU2VxdWVuY2UgQ2xhc3MgQ2xhc3NMb2FkZXIgQ2xvbmVhYmxlIENvbXBhcmFibGUgIiArCiAgICAgICJDb21waWxlciBEb3VibGUgRXhjZXB0aW9uIEZsb2F0IEludGVnZXIgTG9uZyBNYXRoIE51bWJlciBPYmplY3QgUGFja2FnZSBQYWlyIFByb2Nlc3MgIiArCiAgICAgICJSdW50aW1lIFJ1bm5hYmxlIFNlY3VyaXR5TWFuYWdlciBTaG9ydCBTdGFja1RyYWNlRWxlbWVudCBTdHJpY3RNYXRoIFN0cmluZyAiICsKICAgICAgIlN0cmluZ0J1ZmZlciBTeXN0ZW0gVGhyZWFkIFRocmVhZEdyb3VwIFRocmVhZExvY2FsIFRocm93YWJsZSBUcmlwbGUgVm9pZCIKICAgICksCiAgICBtdWx0aUxpbmVTdHJpbmdzOiB0cnVlLAogICAgYmxvY2tLZXl3b3Jkczogd29yZHMoImNhdGNoIGNsYXNzIGRvIGVsc2UgZmluYWxseSBmb3IgZm9yU29tZSBpZiBtYXRjaCBzd2l0Y2ggdHJ5IHdoaWxlIiksCiAgICBkZWZLZXl3b3Jkczogd29yZHMoImNsYXNzIGRlZiBvYmplY3QgcGFja2FnZSB0cmFpdCB0eXBlIHZhbCB2YXIiKSwKICAgIGF0b21zOiB3b3JkcygidHJ1ZSBmYWxzZSBudWxsIiksCiAgICBpbmRlbnRTdGF0ZW1lbnRzOiBmYWxzZSwKICAgIGluZGVudFN3aXRjaDogZmFsc2UsCiAgICBob29rczogewogICAgICAiQCI6IGZ1bmN0aW9uKHN0cmVhbSkgewogICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1x3XCRfXS8pOwogICAgICAgIHJldHVybiAibWV0YSI7CiAgICAgIH0sCiAgICAgICciJzogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICAgIGlmICghc3RyZWFtLm1hdGNoKCciIicpKSByZXR1cm4gZmFsc2U7CiAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlblRyaXBsZVN0cmluZzsKICAgICAgICByZXR1cm4gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CiAgICAgIH0sCiAgICAgICInIjogZnVuY3Rpb24oc3RyZWFtKSB7CiAgICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXHdcJF9ceGExLVx1ZmZmZl0vKTsKICAgICAgICByZXR1cm4gImF0b20iOwogICAgICB9LAogICAgICAiPSI6IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgICB2YXIgY3ggPSBzdGF0ZS5jb250ZXh0CiAgICAgICAgaWYgKGN4LnR5cGUgPT0gIn0iICYmIGN4LmFsaWduICYmIHN0cmVhbS5lYXQoIj4iKSkgewogICAgICAgICAgc3RhdGUuY29udGV4dCA9IG5ldyBDb250ZXh0KGN4LmluZGVudGVkLCBjeC5jb2x1bW4sIGN4LnR5cGUsIGN4LmluZm8sIG51bGwsIGN4LnByZXYpCiAgICAgICAgICByZXR1cm4gIm9wZXJhdG9yIgogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gZmFsc2UKICAgICAgICB9CiAgICAgIH0KICAgIH0sCiAgICBtb2RlUHJvcHM6IHtjbG9zZUJyYWNrZXRzOiB7dHJpcGxlczogJyInfX0KICB9KTsKCiAgZnVuY3Rpb24gdG9rZW5Lb3RsaW5TdHJpbmcodHJpcGxlU3RyaW5nKXsKICAgIHJldHVybiBmdW5jdGlvbiAoc3RyZWFtLCBzdGF0ZSkgewogICAgICB2YXIgZXNjYXBlZCA9IGZhbHNlLCBuZXh0LCBlbmQgPSBmYWxzZTsKICAgICAgd2hpbGUgKCFzdHJlYW0uZW9sKCkpIHsKICAgICAgICBpZiAoIXRyaXBsZVN0cmluZyAmJiAhZXNjYXBlZCAmJiBzdHJlYW0ubWF0Y2goJyInKSApIHtlbmQgPSB0cnVlOyBicmVhazt9CiAgICAgICAgaWYgKHRyaXBsZVN0cmluZyAmJiBzdHJlYW0ubWF0Y2goJyIiIicpKSB7ZW5kID0gdHJ1ZTsgYnJlYWs7fQogICAgICAgIG5leHQgPSBzdHJlYW0ubmV4dCgpOwogICAgICAgIGlmKCFlc2NhcGVkICYmIG5leHQgPT0gIiQiICYmIHN0cmVhbS5tYXRjaCgneycpKQogICAgICAgICAgc3RyZWFtLnNraXBUbygifSIpOwogICAgICAgIGVzY2FwZWQgPSAhZXNjYXBlZCAmJiBuZXh0ID09ICJcXCIgJiYgIXRyaXBsZVN0cmluZzsKICAgICAgfQogICAgICBpZiAoZW5kIHx8ICF0cmlwbGVTdHJpbmcpCiAgICAgICAgc3RhdGUudG9rZW5pemUgPSBudWxsOwogICAgICByZXR1cm4gInN0cmluZyI7CiAgICB9CiAgfQoKICBkZWYoInRleHQveC1rb3RsaW4iLCB7CiAgICBuYW1lOiAiY2xpa2UiLAogICAga2V5d29yZHM6IHdvcmRzKAogICAgICAvKmtleXdvcmRzKi8KICAgICAgInBhY2thZ2UgYXMgdHlwZWFsaWFzIGNsYXNzIGludGVyZmFjZSB0aGlzIHN1cGVyIHZhbCAiICsKICAgICAgInZhciBmdW4gZm9yIGlzIGluIFRoaXMgdGhyb3cgcmV0dXJuICIgKwogICAgICAiYnJlYWsgY29udGludWUgb2JqZWN0IGlmIGVsc2Ugd2hpbGUgZG8gdHJ5IHdoZW4gIWluICFpcyBhcz8gIiArCgogICAgICAvKnNvZnQga2V5d29yZHMqLwogICAgICAiZmlsZSBpbXBvcnQgd2hlcmUgYnkgZ2V0IHNldCBhYnN0cmFjdCBlbnVtIG9wZW4gaW5uZXIgb3ZlcnJpZGUgcHJpdmF0ZSBwdWJsaWMgaW50ZXJuYWwgIiArCiAgICAgICJwcm90ZWN0ZWQgY2F0Y2ggZmluYWxseSBvdXQgZmluYWwgdmFyYXJnIHJlaWZpZWQgZHluYW1pYyBjb21wYW5pb24gY29uc3RydWN0b3IgaW5pdCAiICsKICAgICAgInNlYWxlZCBmaWVsZCBwcm9wZXJ0eSByZWNlaXZlciBwYXJhbSBzcGFyYW0gbGF0ZWluaXQgZGF0YSBpbmxpbmUgbm9pbmxpbmUgdGFpbHJlYyAiICsKICAgICAgImV4dGVybmFsIGFubm90YXRpb24gY3Jvc3NpbmxpbmUgY29uc3Qgb3BlcmF0b3IgaW5maXgiCiAgICApLAogICAgdHlwZXM6IHdvcmRzKAogICAgICAvKiBwYWNrYWdlIGphdmEubGFuZyAqLwogICAgICAiQm9vbGVhbiBCeXRlIENoYXJhY3RlciBDaGFyU2VxdWVuY2UgQ2xhc3MgQ2xhc3NMb2FkZXIgQ2xvbmVhYmxlIENvbXBhcmFibGUgIiArCiAgICAgICJDb21waWxlciBEb3VibGUgRXhjZXB0aW9uIEZsb2F0IEludGVnZXIgTG9uZyBNYXRoIE51bWJlciBPYmplY3QgUGFja2FnZSBQYWlyIFByb2Nlc3MgIiArCiAgICAgICJSdW50aW1lIFJ1bm5hYmxlIFNlY3VyaXR5TWFuYWdlciBTaG9ydCBTdGFja1RyYWNlRWxlbWVudCBTdHJpY3RNYXRoIFN0cmluZyAiICsKICAgICAgIlN0cmluZ0J1ZmZlciBTeXN0ZW0gVGhyZWFkIFRocmVhZEdyb3VwIFRocmVhZExvY2FsIFRocm93YWJsZSBUcmlwbGUgVm9pZCIKICAgICksCiAgICBpbnRlbmRTd2l0Y2g6IGZhbHNlLAogICAgaW5kZW50U3RhdGVtZW50czogZmFsc2UsCiAgICBtdWx0aUxpbmVTdHJpbmdzOiB0cnVlLAogICAgYmxvY2tLZXl3b3Jkczogd29yZHMoImNhdGNoIGNsYXNzIGRvIGVsc2UgZmluYWxseSBmb3IgaWYgd2hlcmUgdHJ5IHdoaWxlIGVudW0iKSwKICAgIGRlZktleXdvcmRzOiB3b3JkcygiY2xhc3MgdmFsIHZhciBvYmplY3QgcGFja2FnZSBpbnRlcmZhY2UgZnVuIiksCiAgICBhdG9tczogd29yZHMoInRydWUgZmFsc2UgbnVsbCB0aGlzIiksCiAgICBob29rczogewogICAgICAnIic6IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuS290bGluU3RyaW5nKHN0cmVhbS5tYXRjaCgnIiInKSk7CiAgICAgICAgcmV0dXJuIHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgICB9CiAgICB9LAogICAgbW9kZVByb3BzOiB7Y2xvc2VCcmFja2V0czoge3RyaXBsZXM6ICciJ319CiAgfSk7CgogIGRlZihbIngtc2hhZGVyL3gtdmVydGV4IiwgIngtc2hhZGVyL3gtZnJhZ21lbnQiXSwgewogICAgbmFtZTogImNsaWtlIiwKICAgIGtleXdvcmRzOiB3b3Jkcygic2FtcGxlcjFEIHNhbXBsZXIyRCBzYW1wbGVyM0Qgc2FtcGxlckN1YmUgIiArCiAgICAgICAgICAgICAgICAgICAgInNhbXBsZXIxRFNoYWRvdyBzYW1wbGVyMkRTaGFkb3cgIiArCiAgICAgICAgICAgICAgICAgICAgImNvbnN0IGF0dHJpYnV0ZSB1bmlmb3JtIHZhcnlpbmcgIiArCiAgICAgICAgICAgICAgICAgICAgImJyZWFrIGNvbnRpbnVlIGRpc2NhcmQgcmV0dXJuICIgKwogICAgICAgICAgICAgICAgICAgICJmb3Igd2hpbGUgZG8gaWYgZWxzZSBzdHJ1Y3QgIiArCiAgICAgICAgICAgICAgICAgICAgImluIG91dCBpbm91dCIpLAogICAgdHlwZXM6IHdvcmRzKCJmbG9hdCBpbnQgYm9vbCB2b2lkICIgKwogICAgICAgICAgICAgICAgICJ2ZWMyIHZlYzMgdmVjNCBpdmVjMiBpdmVjMyBpdmVjNCBidmVjMiBidmVjMyBidmVjNCAiICsKICAgICAgICAgICAgICAgICAibWF0MiBtYXQzIG1hdDQiKSwKICAgIGJsb2NrS2V5d29yZHM6IHdvcmRzKCJmb3Igd2hpbGUgZG8gaWYgZWxzZSBzdHJ1Y3QiKSwKICAgIGJ1aWx0aW46IHdvcmRzKCJyYWRpYW5zIGRlZ3JlZXMgc2luIGNvcyB0YW4gYXNpbiBhY29zIGF0YW4gIiArCiAgICAgICAgICAgICAgICAgICAgInBvdyBleHAgbG9nIGV4cDIgc3FydCBpbnZlcnNlc3FydCAiICsKICAgICAgICAgICAgICAgICAgICAiYWJzIHNpZ24gZmxvb3IgY2VpbCBmcmFjdCBtb2QgbWluIG1heCBjbGFtcCBtaXggc3RlcCBzbW9vdGhzdGVwICIgKwogICAgICAgICAgICAgICAgICAgICJsZW5ndGggZGlzdGFuY2UgZG90IGNyb3NzIG5vcm1hbGl6ZSBmdHJhbnNmb3JtIGZhY2Vmb3J3YXJkICIgKwogICAgICAgICAgICAgICAgICAgICJyZWZsZWN0IHJlZnJhY3QgbWF0cml4Q29tcE11bHQgIiArCiAgICAgICAgICAgICAgICAgICAgImxlc3NUaGFuIGxlc3NUaGFuRXF1YWwgZ3JlYXRlclRoYW4gZ3JlYXRlclRoYW5FcXVhbCAiICsKICAgICAgICAgICAgICAgICAgICAiZXF1YWwgbm90RXF1YWwgYW55IGFsbCBub3QgIiArCiAgICAgICAgICAgICAgICAgICAgInRleHR1cmUxRCB0ZXh0dXJlMURQcm9qIHRleHR1cmUxRExvZCB0ZXh0dXJlMURQcm9qTG9kICIgKwogICAgICAgICAgICAgICAgICAgICJ0ZXh0dXJlMkQgdGV4dHVyZTJEUHJvaiB0ZXh0dXJlMkRMb2QgdGV4dHVyZTJEUHJvakxvZCAiICsKICAgICAgICAgICAgICAgICAgICAidGV4dHVyZTNEIHRleHR1cmUzRFByb2ogdGV4dHVyZTNETG9kIHRleHR1cmUzRFByb2pMb2QgIiArCiAgICAgICAgICAgICAgICAgICAgInRleHR1cmVDdWJlIHRleHR1cmVDdWJlTG9kICIgKwogICAgICAgICAgICAgICAgICAgICJzaGFkb3cxRCBzaGFkb3cyRCBzaGFkb3cxRFByb2ogc2hhZG93MkRQcm9qICIgKwogICAgICAgICAgICAgICAgICAgICJzaGFkb3cxRExvZCBzaGFkb3cyRExvZCBzaGFkb3cxRFByb2pMb2Qgc2hhZG93MkRQcm9qTG9kICIgKwogICAgICAgICAgICAgICAgICAgICJkRmR4IGRGZHkgZndpZHRoICIgKwogICAgICAgICAgICAgICAgICAgICJub2lzZTEgbm9pc2UyIG5vaXNlMyBub2lzZTQiKSwKICAgIGF0b21zOiB3b3JkcygidHJ1ZSBmYWxzZSAiICsKICAgICAgICAgICAgICAgICJnbF9GcmFnQ29sb3IgZ2xfU2Vjb25kYXJ5Q29sb3IgZ2xfTm9ybWFsIGdsX1ZlcnRleCAiICsKICAgICAgICAgICAgICAgICJnbF9NdWx0aVRleENvb3JkMCBnbF9NdWx0aVRleENvb3JkMSBnbF9NdWx0aVRleENvb3JkMiBnbF9NdWx0aVRleENvb3JkMyAiICsKICAgICAgICAgICAgICAgICJnbF9NdWx0aVRleENvb3JkNCBnbF9NdWx0aVRleENvb3JkNSBnbF9NdWx0aVRleENvb3JkNiBnbF9NdWx0aVRleENvb3JkNyAiICsKICAgICAgICAgICAgICAgICJnbF9Gb2dDb29yZCBnbF9Qb2ludENvb3JkICIgKwogICAgICAgICAgICAgICAgImdsX1Bvc2l0aW9uIGdsX1BvaW50U2l6ZSBnbF9DbGlwVmVydGV4ICIgKwogICAgICAgICAgICAgICAgImdsX0Zyb250Q29sb3IgZ2xfQmFja0NvbG9yIGdsX0Zyb250U2Vjb25kYXJ5Q29sb3IgZ2xfQmFja1NlY29uZGFyeUNvbG9yICIgKwogICAgICAgICAgICAgICAgImdsX1RleENvb3JkIGdsX0ZvZ0ZyYWdDb29yZCAiICsKICAgICAgICAgICAgICAgICJnbF9GcmFnQ29vcmQgZ2xfRnJvbnRGYWNpbmcgIiArCiAgICAgICAgICAgICAgICAiZ2xfRnJhZ0RhdGEgZ2xfRnJhZ0RlcHRoICIgKwogICAgICAgICAgICAgICAgImdsX01vZGVsVmlld01hdHJpeCBnbF9Qcm9qZWN0aW9uTWF0cml4IGdsX01vZGVsVmlld1Byb2plY3Rpb25NYXRyaXggIiArCiAgICAgICAgICAgICAgICAiZ2xfVGV4dHVyZU1hdHJpeCBnbF9Ob3JtYWxNYXRyaXggZ2xfTW9kZWxWaWV3TWF0cml4SW52ZXJzZSAiICsKICAgICAgICAgICAgICAgICJnbF9Qcm9qZWN0aW9uTWF0cml4SW52ZXJzZSBnbF9Nb2RlbFZpZXdQcm9qZWN0aW9uTWF0cml4SW52ZXJzZSAiICsKICAgICAgICAgICAgICAgICJnbF9UZXh1cmVNYXRyaXhUcmFuc3Bvc2UgZ2xfTW9kZWxWaWV3TWF0cml4SW52ZXJzZVRyYW5zcG9zZSAiICsKICAgICAgICAgICAgICAgICJnbF9Qcm9qZWN0aW9uTWF0cml4SW52ZXJzZVRyYW5zcG9zZSAiICsKICAgICAgICAgICAgICAgICJnbF9Nb2RlbFZpZXdQcm9qZWN0aW9uTWF0cml4SW52ZXJzZVRyYW5zcG9zZSAiICsKICAgICAgICAgICAgICAgICJnbF9UZXh0dXJlTWF0cml4SW52ZXJzZVRyYW5zcG9zZSAiICsKICAgICAgICAgICAgICAgICJnbF9Ob3JtYWxTY2FsZSBnbF9EZXB0aFJhbmdlIGdsX0NsaXBQbGFuZSAiICsKICAgICAgICAgICAgICAgICJnbF9Qb2ludCBnbF9Gcm9udE1hdGVyaWFsIGdsX0JhY2tNYXRlcmlhbCBnbF9MaWdodFNvdXJjZSBnbF9MaWdodE1vZGVsICIgKwogICAgICAgICAgICAgICAgImdsX0Zyb250TGlnaHRNb2RlbFByb2R1Y3QgZ2xfQmFja0xpZ2h0TW9kZWxQcm9kdWN0ICIgKwogICAgICAgICAgICAgICAgImdsX1RleHR1cmVDb2xvciBnbF9FeWVQbGFuZVMgZ2xfRXllUGxhbmVUIGdsX0V5ZVBsYW5lUiBnbF9FeWVQbGFuZVEgIiArCiAgICAgICAgICAgICAgICAiZ2xfRm9nUGFyYW1ldGVycyAiICsKICAgICAgICAgICAgICAgICJnbF9NYXhMaWdodHMgZ2xfTWF4Q2xpcFBsYW5lcyBnbF9NYXhUZXh0dXJlVW5pdHMgZ2xfTWF4VGV4dHVyZUNvb3JkcyAiICsKICAgICAgICAgICAgICAgICJnbF9NYXhWZXJ0ZXhBdHRyaWJzIGdsX01heFZlcnRleFVuaWZvcm1Db21wb25lbnRzIGdsX01heFZhcnlpbmdGbG9hdHMgIiArCiAgICAgICAgICAgICAgICAiZ2xfTWF4VmVydGV4VGV4dHVyZUltYWdlVW5pdHMgZ2xfTWF4VGV4dHVyZUltYWdlVW5pdHMgIiArCiAgICAgICAgICAgICAgICAiZ2xfTWF4RnJhZ21lbnRVbmlmb3JtQ29tcG9uZW50cyBnbF9NYXhDb21iaW5lVGV4dHVyZUltYWdlVW5pdHMgIiArCiAgICAgICAgICAgICAgICAiZ2xfTWF4RHJhd0J1ZmZlcnMiKSwKICAgIGluZGVudFN3aXRjaDogZmFsc2UsCiAgICBob29rczogeyIjIjogY3BwSG9va30sCiAgICBtb2RlUHJvcHM6IHtmb2xkOiBbImJyYWNlIiwgImluY2x1ZGUiXX0KICB9KTsKCiAgZGVmKCJ0ZXh0L3gtbmVzYyIsIHsKICAgIG5hbWU6ICJjbGlrZSIsCiAgICBrZXl3b3Jkczogd29yZHMoY0tleXdvcmRzICsgImFzIGF0b21pYyBhc3luYyBjYWxsIGNvbW1hbmQgY29tcG9uZW50IGNvbXBvbmVudHMgY29uZmlndXJhdGlvbiBldmVudCBnZW5lcmljICIgKwogICAgICAgICAgICAgICAgICAgICJpbXBsZW1lbnRhdGlvbiBpbmNsdWRlcyBpbnRlcmZhY2UgbW9kdWxlIG5ldyBub3JhY2Ugbnhfc3RydWN0IG54X3VuaW9uIHBvc3QgcHJvdmlkZXMgIiArCiAgICAgICAgICAgICAgICAgICAgInNpZ25hbCB0YXNrIHVzZXMgYWJzdHJhY3QgZXh0ZW5kcyIpLAogICAgdHlwZXM6IHdvcmRzKGNUeXBlcyksCiAgICBibG9ja0tleXdvcmRzOiB3b3JkcygiY2FzZSBkbyBlbHNlIGZvciBpZiBzd2l0Y2ggd2hpbGUgc3RydWN0IiksCiAgICBhdG9tczogd29yZHMoIm51bGwgdHJ1ZSBmYWxzZSIpLAogICAgaG9va3M6IHsiIyI6IGNwcEhvb2t9LAogICAgbW9kZVByb3BzOiB7Zm9sZDogWyJicmFjZSIsICJpbmNsdWRlIl19CiAgfSk7CgogIGRlZigidGV4dC94LW9iamVjdGl2ZWMiLCB7CiAgICBuYW1lOiAiY2xpa2UiLAogICAga2V5d29yZHM6IHdvcmRzKGNLZXl3b3JkcyArICJpbmxpbmUgcmVzdHJpY3QgX0Jvb2wgX0NvbXBsZXggX0ltYWdpbmFyeSBCT09MIENsYXNzIGJ5Y29weSBieXJlZiBpZCBJTVAgaW4gIiArCiAgICAgICAgICAgICAgICAgICAgImlub3V0IG5pbCBvbmV3YXkgb3V0IFByb3RvY29sIFNFTCBzZWxmIHN1cGVyIGF0b21pYyBub25hdG9taWMgcmV0YWluIGNvcHkgcmVhZHdyaXRlIHJlYWRvbmx5IiksCiAgICB0eXBlczogd29yZHMoY1R5cGVzKSwKICAgIGF0b21zOiB3b3JkcygiWUVTIE5PIE5VTEwgTklMTCBPTiBPRkYgdHJ1ZSBmYWxzZSIpLAogICAgaG9va3M6IHsKICAgICAgIkAiOiBmdW5jdGlvbihzdHJlYW0pIHsKICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcd1wkXS8pOwogICAgICAgIHJldHVybiAia2V5d29yZCI7CiAgICAgIH0sCiAgICAgICIjIjogY3BwSG9vaywKICAgICAgaW5kZW50OiBmdW5jdGlvbihfc3RhdGUsIGN0eCwgdGV4dEFmdGVyKSB7CiAgICAgICAgaWYgKGN0eC50eXBlID09ICJzdGF0ZW1lbnQiICYmIC9eQFx3Ly50ZXN0KHRleHRBZnRlcikpIHJldHVybiBjdHguaW5kZW50ZWQKICAgICAgfQogICAgfSwKICAgIG1vZGVQcm9wczoge2ZvbGQ6ICJicmFjZSJ9CiAgfSk7CgogIGRlZigidGV4dC94LXNxdWlycmVsIiwgewogICAgbmFtZTogImNsaWtlIiwKICAgIGtleXdvcmRzOiB3b3JkcygiYmFzZSBicmVhayBjbG9uZSBjb250aW51ZSBjb25zdCBkZWZhdWx0IGRlbGV0ZSBlbnVtIGV4dGVuZHMgZnVuY3Rpb24gaW4gY2xhc3MiICsKICAgICAgICAgICAgICAgICAgICAiIGZvcmVhY2ggbG9jYWwgcmVzdW1lIHJldHVybiB0aGlzIHRocm93IHR5cGVvZiB5aWVsZCBjb25zdHJ1Y3RvciBpbnN0YW5jZW9mIHN0YXRpYyIpLAogICAgdHlwZXM6IHdvcmRzKGNUeXBlcyksCiAgICBibG9ja0tleXdvcmRzOiB3b3JkcygiY2FzZSBjYXRjaCBjbGFzcyBlbHNlIGZvciBmb3JlYWNoIGlmIHN3aXRjaCB0cnkgd2hpbGUiKSwKICAgIGRlZktleXdvcmRzOiB3b3JkcygiZnVuY3Rpb24gbG9jYWwgY2xhc3MiKSwKICAgIHR5cGVGaXJzdERlZmluaXRpb25zOiB0cnVlLAogICAgYXRvbXM6IHdvcmRzKCJ0cnVlIGZhbHNlIG51bGwiKSwKICAgIGhvb2tzOiB7IiMiOiBjcHBIb29rfSwKICAgIG1vZGVQcm9wczoge2ZvbGQ6IFsiYnJhY2UiLCAiaW5jbHVkZSJdfQogIH0pOwoKICAvLyBDZXlsb24gU3RyaW5ncyBuZWVkIHRvIGRlYWwgd2l0aCBpbnRlcnBvbGF0aW9uCiAgdmFyIHN0cmluZ1Rva2VuaXplciA9IG51bGw7CiAgZnVuY3Rpb24gdG9rZW5DZXlsb25TdHJpbmcodHlwZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgdmFyIGVzY2FwZWQgPSBmYWxzZSwgbmV4dCwgZW5kID0gZmFsc2U7CiAgICAgIHdoaWxlICghc3RyZWFtLmVvbCgpKSB7CiAgICAgICAgaWYgKCFlc2NhcGVkICYmIHN0cmVhbS5tYXRjaCgnIicpICYmCiAgICAgICAgICAgICAgKHR5cGUgPT0gInNpbmdsZSIgfHwgc3RyZWFtLm1hdGNoKCciIicpKSkgewogICAgICAgICAgZW5kID0gdHJ1ZTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBpZiAoIWVzY2FwZWQgJiYgc3RyZWFtLm1hdGNoKCdgYCcpKSB7CiAgICAgICAgICBzdHJpbmdUb2tlbml6ZXIgPSB0b2tlbkNleWxvblN0cmluZyh0eXBlKTsKICAgICAgICAgIGVuZCA9IHRydWU7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgbmV4dCA9IHN0cmVhbS5uZXh0KCk7CiAgICAgICAgZXNjYXBlZCA9IHR5cGUgPT0gInNpbmdsZSIgJiYgIWVzY2FwZWQgJiYgbmV4dCA9PSAiXFwiOwogICAgICB9CiAgICAgIGlmIChlbmQpCiAgICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IG51bGw7CiAgICAgIHJldHVybiAic3RyaW5nIjsKICAgIH0KICB9CgogIGRlZigidGV4dC94LWNleWxvbiIsIHsKICAgIG5hbWU6ICJjbGlrZSIsCiAgICBrZXl3b3Jkczogd29yZHMoImFic3RyYWN0cyBhbGlhcyBhc3NlbWJseSBhc3NlcnQgYXNzaWduIGJyZWFrIGNhc2UgY2F0Y2ggY2xhc3MgY29udGludWUgZHluYW1pYyBlbHNlIiArCiAgICAgICAgICAgICAgICAgICAgIiBleGlzdHMgZXh0ZW5kcyBmaW5hbGx5IGZvciBmdW5jdGlvbiBnaXZlbiBpZiBpbXBvcnQgaW4gaW50ZXJmYWNlIGlzIGxldCBtb2R1bGUgbmV3IiArCiAgICAgICAgICAgICAgICAgICAgIiBub25lbXB0eSBvYmplY3Qgb2Ygb3V0IG91dGVyIHBhY2thZ2UgcmV0dXJuIHNhdGlzZmllcyBzdXBlciBzd2l0Y2ggdGhlbiB0aGlzIHRocm93IiArCiAgICAgICAgICAgICAgICAgICAgIiB0cnkgdmFsdWUgdm9pZCB3aGlsZSIpLAogICAgdHlwZXM6IGZ1bmN0aW9uKHdvcmQpIHsKICAgICAgICAvLyBJbiBDZXlsb24gYWxsIGlkZW50aWZpZXJzIHRoYXQgc3RhcnQgd2l0aCBhbiB1cHBlcmNhc2UgYXJlIHR5cGVzCiAgICAgICAgdmFyIGZpcnN0ID0gd29yZC5jaGFyQXQoMCk7CiAgICAgICAgcmV0dXJuIChmaXJzdCA9PT0gZmlyc3QudG9VcHBlckNhc2UoKSAmJiBmaXJzdCAhPT0gZmlyc3QudG9Mb3dlckNhc2UoKSk7CiAgICB9LAogICAgYmxvY2tLZXl3b3Jkczogd29yZHMoImNhc2UgY2F0Y2ggY2xhc3MgZHluYW1pYyBlbHNlIGZpbmFsbHkgZm9yIGZ1bmN0aW9uIGlmIGludGVyZmFjZSBtb2R1bGUgbmV3IG9iamVjdCBzd2l0Y2ggdHJ5IHdoaWxlIiksCiAgICBkZWZLZXl3b3Jkczogd29yZHMoImNsYXNzIGR5bmFtaWMgZnVuY3Rpb24gaW50ZXJmYWNlIG1vZHVsZSBvYmplY3QgcGFja2FnZSB2YWx1ZSIpLAogICAgYnVpbHRpbjogd29yZHMoImFic3RyYWN0IGFjdHVhbCBhbGlhc2VkIGFubm90YXRpb24gYnkgZGVmYXVsdCBkZXByZWNhdGVkIGRvYyBmaW5hbCBmb3JtYWwgbGF0ZSBsaWNlbnNlIiArCiAgICAgICAgICAgICAgICAgICAiIG5hdGl2ZSBvcHRpb25hbCBzZWFsZWQgc2VlIHNlcmlhbGl6YWJsZSBzaGFyZWQgc3VwcHJlc3NXYXJuaW5ncyB0YWdnZWQgdGhyb3dzIHZhcmlhYmxlIiksCiAgICBpc1B1bmN0dWF0aW9uQ2hhcjogL1tcW1xde31cKFwpLDtcOlwuYF0vLAogICAgaXNPcGVyYXRvckNoYXI6IC9bK1wtKiYlPTw+IT98Xn46XC9dLywKICAgIG51bWJlclN0YXJ0OiAvW1xkIyRdLywKICAgIG51bWJlcjogL14oPzojW1xkYS1mQS1GX10rfFwkWzAxX10rfFtcZF9dK1trTUdUUG11bnBmXT98W1xkX10rXC5bXGRfXSsoPzpbZUVdWy0rXT9cZCt8W2tNR1RQbXVucGZdfCl8KS9pLAogICAgbXVsdGlMaW5lU3RyaW5nczogdHJ1ZSwKICAgIHR5cGVGaXJzdERlZmluaXRpb25zOiB0cnVlLAogICAgYXRvbXM6IHdvcmRzKCJ0cnVlIGZhbHNlIG51bGwgbGFyZ2VyIHNtYWxsZXIgZXF1YWwgZW1wdHkgZmluaXNoZWQiKSwKICAgIGluZGVudFN3aXRjaDogZmFsc2UsCiAgICBzdHlsZURlZnM6IGZhbHNlLAogICAgaG9va3M6IHsKICAgICAgIkAiOiBmdW5jdGlvbihzdHJlYW0pIHsKICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcd1wkX10vKTsKICAgICAgICByZXR1cm4gIm1ldGEiOwogICAgICB9LAogICAgICAnIic6IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5DZXlsb25TdHJpbmcoc3RyZWFtLm1hdGNoKCciIicpID8gInRyaXBsZSIgOiAic2luZ2xlIik7CiAgICAgICAgICByZXR1cm4gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CiAgICAgICAgfSwKICAgICAgJ2AnOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgICAgICBpZiAoIXN0cmluZ1Rva2VuaXplciB8fCAhc3RyZWFtLm1hdGNoKCdgJykpIHJldHVybiBmYWxzZTsKICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gc3RyaW5nVG9rZW5pemVyOwogICAgICAgICAgc3RyaW5nVG9rZW5pemVyID0gbnVsbDsKICAgICAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgICAgICB9LAogICAgICAiJyI6IGZ1bmN0aW9uKHN0cmVhbSkgewogICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1x3XCRfXHhhMS1cdWZmZmZdLyk7CiAgICAgICAgcmV0dXJuICJhdG9tIjsKICAgICAgfSwKICAgICAgdG9rZW46IGZ1bmN0aW9uKF9zdHJlYW0sIHN0YXRlLCBzdHlsZSkgewogICAgICAgICAgaWYgKChzdHlsZSA9PSAidmFyaWFibGUiIHx8IHN0eWxlID09ICJ2YXJpYWJsZS0zIikgJiYKICAgICAgICAgICAgICBzdGF0ZS5wcmV2VG9rZW4gPT0gIi4iKSB7CiAgICAgICAgICAgIHJldHVybiAidmFyaWFibGUtMiI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgfSwKICAgIG1vZGVQcm9wczogewogICAgICAgIGZvbGQ6IFsiYnJhY2UiLCAiaW1wb3J0Il0sCiAgICAgICAgY2xvc2VCcmFja2V0czoge3RyaXBsZXM6ICciJ30KICAgIH0KICB9KTsKCn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/clike/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogQy1saWtlIG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vLi4vYWRkb24vZWRpdC9tYXRjaGJyYWNrZXRzLmpzIj48L3NjcmlwdD4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9hZGRvbi9oaW50L3Nob3ctaGludC5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vYWRkb24vaGludC9zaG93LWhpbnQuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iY2xpa2UuanMiPjwvc2NyaXB0Pgo8c3R5bGU+LkNvZGVNaXJyb3Ige2JvcmRlcjogMnB4IGluc2V0ICNkZWU7fTwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGgxPkNvZGVNaXJyb3I8L2gxPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5DLWxpa2U8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPkMtbGlrZSBtb2RlPC9oMj4KCjxkaXY+PHRleHRhcmVhIGlkPSJjLWNvZGUiPgovKiBDIGRlbW8gY29kZSAqLwoKI2luY2x1ZGUgPHptcS5oPgojaW5jbHVkZSA8cHRocmVhZC5oPgojaW5jbHVkZSA8c2VtYXBob3JlLmg+CiNpbmNsdWRlIDx0aW1lLmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8ZmNudGwuaD4KI2luY2x1ZGUgPG1hbGxvYy5oPgoKdHlwZWRlZiBzdHJ1Y3QgewogIHZvaWQqIGFyZ19zb2NrZXQ7CiAgem1xX21zZ190KiBhcmdfbXNnOwogIGNoYXIqIGFyZ19zdHJpbmc7CiAgdW5zaWduZWQgbG9uZyBhcmdfbGVuOwogIGludCBhcmdfaW50LCBhcmdfY29tbWFuZDsKCiAgaW50IHNpZ25hbF9mZDsKICBpbnQgcGFkOwogIHZvaWQqIGNvbnRleHQ7CiAgc2VtX3Qgc2VtOwp9IGFjbF96bXFfY29udGV4dDsKCiNkZWZpbmUgcChYKSAoY29udGV4dC0+YXJnXyMjWCkKCnZvaWQqIHptcV90aHJlYWQodm9pZCogY29udGV4dF9wb2ludGVyKSB7CiAgYWNsX3ptcV9jb250ZXh0KiBjb250ZXh0ID0gKGFjbF96bXFfY29udGV4dCopY29udGV4dF9wb2ludGVyOwogIGNoYXIgb2sgPSAnSycsIGVyciA9ICdYJzsKICBpbnQgcmVzOwoKICB3aGlsZSAoMSkgewogICAgd2hpbGUgKChyZXMgPSBzZW1fd2FpdCgmYW1wO2NvbnRleHQtPnNlbSkpID09IEVJTlRSKTsKICAgIGlmIChyZXMpIHt3cml0ZShjb250ZXh0LT5zaWduYWxfZmQsICZhbXA7ZXJyLCAxKTsgZ290byBjbGVhbnVwO30KICAgIHN3aXRjaChwKGNvbW1hbmQpKSB7CiAgICBjYXNlIDA6IGdvdG8gY2xlYW51cDsKICAgIGNhc2UgMTogcChzb2NrZXQpID0gem1xX3NvY2tldChjb250ZXh0LT5jb250ZXh0LCBwKGludCkpOyBicmVhazsKICAgIGNhc2UgMjogcChpbnQpID0gem1xX2Nsb3NlKHAoc29ja2V0KSk7IGJyZWFrOwogICAgY2FzZSAzOiBwKGludCkgPSB6bXFfYmluZChwKHNvY2tldCksIHAoc3RyaW5nKSk7IGJyZWFrOwogICAgY2FzZSA0OiBwKGludCkgPSB6bXFfY29ubmVjdChwKHNvY2tldCksIHAoc3RyaW5nKSk7IGJyZWFrOwogICAgY2FzZSA1OiBwKGludCkgPSB6bXFfZ2V0c29ja29wdChwKHNvY2tldCksIHAoaW50KSwgKHZvaWQqKXAoc3RyaW5nKSwgJmFtcDtwKGxlbikpOyBicmVhazsKICAgIGNhc2UgNjogcChpbnQpID0gem1xX3NldHNvY2tvcHQocChzb2NrZXQpLCBwKGludCksICh2b2lkKilwKHN0cmluZyksIHAobGVuKSk7IGJyZWFrOwogICAgY2FzZSA3OiBwKGludCkgPSB6bXFfc2VuZChwKHNvY2tldCksIHAobXNnKSwgcChpbnQpKTsgYnJlYWs7CiAgICBjYXNlIDg6IHAoaW50KSA9IHptcV9yZWN2KHAoc29ja2V0KSwgcChtc2cpLCBwKGludCkpOyBicmVhazsKICAgIGNhc2UgOTogcChpbnQpID0gem1xX3BvbGwocChzb2NrZXQpLCBwKGludCksIHAobGVuKSk7IGJyZWFrOwogICAgfQogICAgcChjb21tYW5kKSA9IGVycm5vOwogICAgd3JpdGUoY29udGV4dC0+c2lnbmFsX2ZkLCAmYW1wO29rLCAxKTsKICB9CiBjbGVhbnVwOgogIGNsb3NlKGNvbnRleHQtPnNpZ25hbF9mZCk7CiAgZnJlZShjb250ZXh0X3BvaW50ZXIpOwogIHJldHVybiAwOwp9Cgp2b2lkKiB6bXFfdGhyZWFkX2luaXQodm9pZCogem1xX2NvbnRleHQsIGludCBzaWduYWxfZmQpIHsKICBhY2xfem1xX2NvbnRleHQqIGNvbnRleHQgPSBtYWxsb2Moc2l6ZW9mKGFjbF96bXFfY29udGV4dCkpOwogIHB0aHJlYWRfdCB0aHJlYWQ7CgogIGNvbnRleHQtPmNvbnRleHQgPSB6bXFfY29udGV4dDsKICBjb250ZXh0LT5zaWduYWxfZmQgPSBzaWduYWxfZmQ7CiAgc2VtX2luaXQoJmFtcDtjb250ZXh0LT5zZW0sIDEsIDApOwogIHB0aHJlYWRfY3JlYXRlKCZhbXA7dGhyZWFkLCAwLCAmYW1wO3ptcV90aHJlYWQsIGNvbnRleHQpOwogIHB0aHJlYWRfZGV0YWNoKHRocmVhZCk7CiAgcmV0dXJuIGNvbnRleHQ7Cn0KPC90ZXh0YXJlYT48L2Rpdj4KCjxoMj5DKysgZXhhbXBsZTwvaDI+Cgo8ZGl2Pjx0ZXh0YXJlYSBpZD0iY3BwLWNvZGUiPgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlICJteXN0dWZmL3V0aWwuaCIKCm5hbWVzcGFjZSB7CmVudW0gRW51bSB7CiAgVkFMMSwgVkFMMiwgVkFMMwp9OwoKY2hhcjMyX3QgdW5pY29kZV9zdHJpbmcgPSBVIlxVMDAxMEZGRkYiOwpzdHJpbmcgcmF3X3N0cmluZyA9IFIiZGVsaW0oYW55dGhpbmcKeW91CndhbnQpZGVsaW0iOwoKaW50IEhlbHBlcihjb25zdCBNeVR5cGUmIHBhcmFtKSB7CiAgcmV0dXJuIDA7Cn0KfSAvLyBuYW1lc3BhY2UKCmNsYXNzIEZvcndhcmREZWM7Cgp0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVj4KY2xhc3MgQ2xhc3MgOiBwdWJsaWMgQmFzZUNsYXNzIHsKICBjb25zdCBNeVR5cGU8VCwgVj4gbWVtYmVyXzsKCiBwdWJsaWM6CiAgY29uc3QgTXlUeXBlPFQsIFY+JiBNZXRob2QoKSBjb25zdCB7CiAgICByZXR1cm4gbWVtYmVyXzsKICB9CgogIHZvaWQgTWV0aG9kMihNeVR5cGU8VCwgVj4qIHZhbHVlKTsKfQoKdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFY+CnZvaWQgQ2xhc3M6Ok1ldGhvZDIoTXlUeXBlPFQsIFY+KiB2YWx1ZSkgewogIHN0ZDo6b3V0IDw8IDEgPj4gbWV0aG9kKCk7CiAgdmFsdWUtPk1ldGhvZDMobWVtYmVyXyk7CiAgbWVtYmVyXyA9IHZhbHVlOwp9CjwvdGV4dGFyZWE+PC9kaXY+Cgo8aDI+T2JqZWN0aXZlLUMgZXhhbXBsZTwvaDI+Cgo8ZGl2Pjx0ZXh0YXJlYSBpZD0ib2JqZWN0aXZlYy1jb2RlIj4KLyoKVGhpcyBpcyBhIGxvbmdlciBjb21tZW50ClRoYXQgc3BhbnMgdHdvIGxpbmVzCiovCgojaW1wb3J0IDxUZXN0L1Rlc3QuaD4KQGltcGxlbWVudGF0aW9uIFlvdXJBcHBEZWxlZ2F0ZQoKLy8gVGhpcyBpcyBhIG9uZS1saW5lIGNvbW1lbnQKCi0gKEJPT0wpYXBwbGljYXRpb246KFVJQXBwbGljYXRpb24gKilhcHBsaWNhdGlvbiBkaWRGaW5pc2hMYXVuY2hpbmdXaXRoT3B0aW9uczooTlNEaWN0aW9uYXJ5ICopbGF1bmNoT3B0aW9uc3sKICBjaGFyIG15U3RyaW5nW10gPSAiVGhpcyBpcyBhIEMgY2hhcmFjdGVyIGFycmF5IjsKICBpbnQgdGVzdCA9IDU7CiAgcmV0dXJuIFlFUzsKfQo8L3RleHRhcmVhPjwvZGl2PgoKPGgyPkphdmEgZXhhbXBsZTwvaDI+Cgo8ZGl2Pjx0ZXh0YXJlYSBpZD0iamF2YS1jb2RlIj4KaW1wb3J0IGNvbS5kZW1vLnV0aWwuTXlUeXBlOwppbXBvcnQgY29tLmRlbW8udXRpbC5NeUludGVyZmFjZTsKCnB1YmxpYyBlbnVtIEVudW0gewogIFZBTDEsIFZBTDIsIFZBTDMKfQoKcHVibGljIGNsYXNzIENsYXNzPFQsIFY+IGltcGxlbWVudHMgTXlJbnRlcmZhY2UgewogIHB1YmxpYyBzdGF0aWMgZmluYWwgTXlUeXBlPFQsIFY+IG1lbWJlcjsKICAKICBwcml2YXRlIGNsYXNzIElubmVyQ2xhc3MgewogICAgcHVibGljIGludCB6ZXJvKCkgewogICAgICByZXR1cm4gMDsKICAgIH0KICB9CgogIEBPdmVycmlkZQogIHB1YmxpYyBNeVR5cGUgbWV0aG9kKCkgewogICAgcmV0dXJuIG1lbWJlcjsKICB9CgogIHB1YmxpYyB2b2lkIG1ldGhvZDIoTXlUeXBlPFQsIFY+IHZhbHVlKSB7CiAgICBtZXRob2QoKTsKICAgIHZhbHVlLm1ldGhvZDMoKTsKICAgIG1lbWJlciA9IHZhbHVlOwogIH0KfQo8L3RleHRhcmVhPjwvZGl2PgoKPGgyPlNjYWxhIGV4YW1wbGU8L2gyPgoKPGRpdj48dGV4dGFyZWEgaWQ9InNjYWxhLWNvZGUiPgpvYmplY3QgRmlsdGVyVGVzdCBleHRlbmRzIEFwcCB7CiAgZGVmIGZpbHRlcih4czogTGlzdFtJbnRdLCB0aHJlc2hvbGQ6IEludCkgPSB7CiAgICBkZWYgcHJvY2Vzcyh5czogTGlzdFtJbnRdKTogTGlzdFtJbnRdID0KICAgICAgaWYgKHlzLmlzRW1wdHkpIHlzCiAgICAgIGVsc2UgaWYgKHlzLmhlYWQgPCB0aHJlc2hvbGQpIHlzLmhlYWQgOjogcHJvY2Vzcyh5cy50YWlsKQogICAgICBlbHNlIHByb2Nlc3MoeXMudGFpbCkKICAgIHByb2Nlc3MoeHMpCiAgfQogIHByaW50bG4oZmlsdGVyKExpc3QoMSwgOSwgMiwgOCwgMywgNywgNCksIDUpKQp9CjwvdGV4dGFyZWE+PC9kaXY+Cgo8aDI+S290bGluIG1vZGU8L2gyPgoKPGRpdj48dGV4dGFyZWEgaWQ9ImtvdGxpbi1jb2RlIj4KcGFja2FnZSBvcmcud2FzYWJpLmh0dHAKCmltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5FeGVjdXRvcnMKaW1wb3J0IGphdmEubmV0LkluZXRTb2NrZXRBZGRyZXNzCmltcG9ydCBvcmcud2FzYWJpLmFwcC5BcHBDb25maWd1cmF0aW9uCmltcG9ydCBpby5uZXR0eS5ib290c3RyYXAuU2VydmVyQm9vdHN0cmFwCmltcG9ydCBpby5uZXR0eS5jaGFubmVsLm5pby5OaW9FdmVudExvb3BHcm91cAppbXBvcnQgaW8ubmV0dHkuY2hhbm5lbC5zb2NrZXQubmlvLk5pb1NlcnZlclNvY2tldENoYW5uZWwKaW1wb3J0IG9yZy53YXNhYmkuYXBwLkFwcFNlcnZlcgoKcHVibGljIGNsYXNzIEh0dHBTZXJ2ZXIocHJpdmF0ZSB2YWwgYXBwU2VydmVyOiBBcHBTZXJ2ZXIpIHsKCiAgICB2YWwgYm9vdHN0cmFwOiBTZXJ2ZXJCb290c3RyYXAKICAgIHZhbCBwcmltYXJ5R3JvdXA6IE5pb0V2ZW50TG9vcEdyb3VwCiAgICB2YWwgd29ya2VyR3JvdXA6ICBOaW9FdmVudExvb3BHcm91cAoKICAgIGluaXQgewogICAgICAgIC8vIERlZmluZSB3b3JrZXIgZ3JvdXBzCiAgICAgICAgcHJpbWFyeUdyb3VwID0gTmlvRXZlbnRMb29wR3JvdXAoKQogICAgICAgIHdvcmtlckdyb3VwID0gTmlvRXZlbnRMb29wR3JvdXAoKQoKICAgICAgICAvLyBJbml0aWFsaXplIGJvb3RzdHJhcCBvZiBzZXJ2ZXIKICAgICAgICBib290c3RyYXAgPSBTZXJ2ZXJCb290c3RyYXAoKQoKICAgICAgICBib290c3RyYXAuZ3JvdXAocHJpbWFyeUdyb3VwLCB3b3JrZXJHcm91cCkKICAgICAgICBib290c3RyYXAuY2hhbm5lbChqYXZhQ2xhc3M8TmlvU2VydmVyU29ja2V0Q2hhbm5lbD4oKSkKICAgICAgICBib290c3RyYXAuY2hpbGRIYW5kbGVyKE5ldHR5UGlwZWxpbmVJbml0aWFsaXplcihhcHBTZXJ2ZXIpKQogICAgfQoKICAgIHB1YmxpYyBmdW4gc3RhcnQod2FpdDogQm9vbGVhbiA9IHRydWUpIHsKICAgICAgICB2YWwgY2hhbm5lbCA9IGJvb3RzdHJhcC5iaW5kKGFwcFNlcnZlci5jb25maWd1cmF0aW9uLnBvcnQpPy5zeW5jKCk/LmNoYW5uZWwoKQoKICAgICAgICBpZiAod2FpdCkgewogICAgICAgICAgICBjaGFubmVsPy5jbG9zZUZ1dHVyZSgpPy5zeW5jKCkKICAgICAgICB9CiAgICB9CgogICAgcHVibGljIGZ1biBzdG9wKCkgewogICAgICAgIC8vIFNodXRkb3duIGFsbCBldmVudCBsb29wcwogICAgICAgIHByaW1hcnlHcm91cC5zaHV0ZG93bkdyYWNlZnVsbHkoKQogICAgICAgIHdvcmtlckdyb3VwLnNodXRkb3duR3JhY2VmdWxseSgpCgogICAgICAgIC8vIFdhaXQgdGlsbCBhbGwgdGhyZWFkcyBhcmUgdGVybWluYXRlZAogICAgICAgIHByaW1hcnlHcm91cC50ZXJtaW5hdGlvbkZ1dHVyZSgpLnN5bmMoKQogICAgICAgIHdvcmtlckdyb3VwLnRlcm1pbmF0aW9uRnV0dXJlKCkuc3luYygpCiAgICB9Cn0KPC90ZXh0YXJlYT48L2Rpdj4KCjxoMj5DZXlsb24gbW9kZTwvaDI+Cgo8ZGl2Pjx0ZXh0YXJlYSBpZD0iY2V5bG9uLWNvZGUiPgoiUHJvZHVjZXMgdGhlIFtbc3RyZWFtfEl0ZXJhYmxlXV0gdGhhdCByZXN1bHRzIGZyb20gcmVwZWF0ZWQKIGFwcGxpY2F0aW9uIG9mIHRoZSBnaXZlbiBbW2Z1bmN0aW9ufG5leHRdXSB0byB0aGUgZ2l2ZW4KIFtbZmlyc3RdXSBlbGVtZW50IG9mIHRoZSBzdHJlYW0sIHVudGlsIHRoZSBmdW5jdGlvbiBmaXJzdAogcmV0dXJucyBbW2ZpbmlzaGVkXV0uIElmIHRoZSBnaXZlbiBmdW5jdGlvbiBuZXZlciByZXR1cm5zIAogYGZpbmlzaGVkYCwgdGhlIHJlc3VsdGluZyBzdHJlYW0gaXMgaW5maW5pdGUuCgogRm9yIGV4YW1wbGU6CgogICAgIGxvb3AoMCkoMi5wbHVzKS50YWtlV2hpbGUoMTAubGFyZ2VyVGhhbikKCiBwcm9kdWNlcyB0aGUgc3RyZWFtIGB7IDAsIDIsIDQsIDYsIDggfWAuIgp0YWdnZWQoIlN0cmVhbXMiKQpzaGFyZWQge0VsZW1lbnQrfSBsb29wJmx0O0VsZW1lbnQmZ3Q7KAogICAgICAgICJUaGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgcmVzdWx0aW5nIHN0cmVhbS4iCiAgICAgICAgRWxlbWVudCBmaXJzdCkoCiAgICAgICAgIlRoZSBmdW5jdGlvbiB0aGF0IHByb2R1Y2VzIHRoZSBuZXh0IGVsZW1lbnQgb2YgdGhlCiAgICAgICAgIHN0cmVhbSwgZ2l2ZW4gdGhlIGN1cnJlbnQgZWxlbWVudC4gVGhlIGZ1bmN0aW9uIG1heQogICAgICAgICByZXR1cm4gW1tmaW5pc2hlZF1dIHRvIGluZGljYXRlIHRoZSBlbmQgb2YgdGhlIAogICAgICAgICBzdHJlYW0uIgogICAgICAgIEVsZW1lbnR8RmluaXNoZWQgbmV4dChFbGVtZW50IGVsZW1lbnQpKQogICAgPSZndDsgbGV0IChzdGFydCA9IGZpcnN0KQogICAgb2JqZWN0IHNhdGlzZmllcyB7RWxlbWVudCt9IHsKICAgICAgICBmaXJzdCA9Jmd0OyBzdGFydDsKICAgICAgICBlbXB0eSA9Jmd0OyBmYWxzZTsKICAgICAgICBmdW5jdGlvbiBuZXh0RWxlbWVudChFbGVtZW50IGVsZW1lbnQpCiAgICAgICAgICAgICAgICA9Jmd0OyBuZXh0KGVsZW1lbnQpOwogICAgICAgIGl0ZXJhdG9yKCkKICAgICAgICAgICAgICAgID0mZ3Q7IG9iamVjdCBzYXRpc2ZpZXMgSXRlcmF0b3ImbHQ7RWxlbWVudCZndDsgewogICAgICAgICAgICB2YXJpYWJsZSBFbGVtZW50fEZpbmlzaGVkIGN1cnJlbnQgPSBzdGFydDsKICAgICAgICAgICAgc2hhcmVkIGFjdHVhbCBFbGVtZW50fEZpbmlzaGVkIG5leHQoKSB7CiAgICAgICAgICAgICAgICBpZiAoIWlzIEZpbmlzaGVkIHJlc3VsdCA9IGN1cnJlbnQpIHsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gbmV4dEVsZW1lbnQocmVzdWx0KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbmlzaGVkOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgIH07CjwvdGV4dGFyZWE+PC9kaXY+CgogICAgPHNjcmlwdD4KICAgICAgdmFyIGNFZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYy1jb2RlIiksIHsKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgICAgICBtYXRjaEJyYWNrZXRzOiB0cnVlLAogICAgICAgIG1vZGU6ICJ0ZXh0L3gtY3NyYyIKICAgICAgfSk7CiAgICAgIHZhciBjcHBFZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY3BwLWNvZGUiKSwgewogICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgICAgIG1hdGNoQnJhY2tldHM6IHRydWUsCiAgICAgICAgbW9kZTogInRleHQveC1jKytzcmMiCiAgICAgIH0pOwogICAgICB2YXIgamF2YUVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJqYXZhLWNvZGUiKSwgewogICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgICAgIG1hdGNoQnJhY2tldHM6IHRydWUsCiAgICAgICAgbW9kZTogInRleHQveC1qYXZhIgogICAgICB9KTsKICAgICAgdmFyIG9iamVjdGl2ZWNFZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgib2JqZWN0aXZlYy1jb2RlIiksIHsKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgICAgICBtYXRjaEJyYWNrZXRzOiB0cnVlLAogICAgICAgIG1vZGU6ICJ0ZXh0L3gtb2JqZWN0aXZlYyIKICAgICAgfSk7CiAgICAgIHZhciBzY2FsYUVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzY2FsYS1jb2RlIiksIHsKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgICAgICBtYXRjaEJyYWNrZXRzOiB0cnVlLAogICAgICAgIG1vZGU6ICJ0ZXh0L3gtc2NhbGEiCiAgICAgIH0pOwogICAgICB2YXIga290bGluRWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImtvdGxpbi1jb2RlIiksIHsKICAgICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgICAgICAgbWF0Y2hCcmFja2V0czogdHJ1ZSwKICAgICAgICAgIG1vZGU6ICJ0ZXh0L3gta290bGluIgogICAgICB9KTsKICAgICAgdmFyIGNleWxvbkVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjZXlsb24tY29kZSIpLCB7CiAgICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgICAgICAgIG1hdGNoQnJhY2tldHM6IHRydWUsCiAgICAgICAgICBtb2RlOiAidGV4dC94LWNleWxvbiIKICAgICAgfSk7CiAgICAgIHZhciBtYWMgPSBDb2RlTWlycm9yLmtleU1hcC5kZWZhdWx0ID09IENvZGVNaXJyb3Iua2V5TWFwLm1hY0RlZmF1bHQ7CiAgICAgIENvZGVNaXJyb3Iua2V5TWFwLmRlZmF1bHRbKG1hYyA/ICJDbWQiIDogIkN0cmwiKSArICItU3BhY2UiXSA9ICJhdXRvY29tcGxldGUiOwogICAgPC9zY3JpcHQ+CgogICAgPHA+U2ltcGxlIG1vZGUgdGhhdCB0cmllcyB0byBoYW5kbGUgQy1saWtlIGxhbmd1YWdlcyBhcyB3ZWxsIGFzIGl0CiAgICBjYW4uIFRha2VzIHR3byBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnM6IDxjb2RlPmtleXdvcmRzPC9jb2RlPiwgYW4KICAgIG9iamVjdCB3aG9zZSBwcm9wZXJ0eSBuYW1lcyBhcmUgdGhlIGtleXdvcmRzIGluIHRoZSBsYW5ndWFnZSwKICAgIGFuZCA8Y29kZT51c2VDUFA8L2NvZGU+LCB3aGljaCBkZXRlcm1pbmVzIHdoZXRoZXIgQyBwcmVwcm9jZXNzb3IKICAgIGRpcmVjdGl2ZXMgYXJlIHJlY29nbml6ZWQuPC9wPgoKICAgIDxwPjxzdHJvbmc+TUlNRSB0eXBlcyBkZWZpbmVkOjwvc3Ryb25nPiA8Y29kZT50ZXh0L3gtY3NyYzwvY29kZT4KICAgIChDKSwgPGNvZGU+dGV4dC94LWMrK3NyYzwvY29kZT4gKEMrKyksIDxjb2RlPnRleHQveC1qYXZhPC9jb2RlPgogICAgKEphdmEpLCA8Y29kZT50ZXh0L3gtY3NoYXJwPC9jb2RlPiAoQyMpLAogICAgPGNvZGU+dGV4dC94LW9iamVjdGl2ZWM8L2NvZGU+IChPYmplY3RpdmUtQyksCiAgICA8Y29kZT50ZXh0L3gtc2NhbGE8L2NvZGU+IChTY2FsYSksIDxjb2RlPnRleHQveC12ZXJ0ZXg8L2NvZGU+CiAgICA8Y29kZT54LXNoYWRlci94LWZyYWdtZW50PC9jb2RlPiAoc2hhZGVyIHByb2dyYW1zKSwKICAgIDxjb2RlPnRleHQveC1zcXVpcnJlbDwvY29kZT4gKFNxdWlycmVsKSBhbmQKICAgIDxjb2RlPnRleHQveC1jZXlsb248L2NvZGU+IChDZXlsb24pPC9wPgo8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/clike/scala.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogU2NhbGEgbW9kZTwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uLy4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vdGhlbWUvYW1iaWFuY2UuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uLy4uL2FkZG9uL2VkaXQvbWF0Y2hicmFja2V0cy5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJjbGlrZS5qcyI+PC9zY3JpcHQ+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGgxPkNvZGVNaXJyb3I8L2gxPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5TY2FsYTwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+U2NhbGEgbW9kZTwvaDI+Cjxmb3JtPgo8dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgoKICAvKiAgICAgICAgICAgICAgICAgICAgIF9fICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXAogICoqICAgICBfX19fX19fXyBfX18gICAvIC8gIF9fXyAgICAgU2NhbGEgQVBJICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqCiAgKiogICAgLyBfXy8gX18vLyBfIHwgLyAvICAvIF8gfCAgICAoYykgMjAwMy0yMDExLCBMQU1QL0VQRkwgICAgICAgICAgICAgKioKICAqKiAgX19cIFwvIC9fXy8gX18gfC8gL19fLyBfXyB8ICAgIGh0dHA6Ly9zY2FsYS1sYW5nLm9yZy8gICAgICAgICAgICAgICAqKgogICoqIC9fX19fL1xfX18vXy8gfF8vX19fXy9fLyB8IHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqCiAgKiogICAgICAgICAgICAgICAgICAgICAgICAgIHwvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKioKICBcKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKICBwYWNrYWdlIHNjYWxhLmNvbGxlY3Rpb24KCiAgaW1wb3J0IGdlbmVyaWMuXwogIGltcG9ydCBtdXRhYmxlLnsgQnVpbGRlciwgTGlzdEJ1ZmZlciB9CiAgaW1wb3J0IGFubm90YXRpb24ue3RhaWxyZWMsIG1pZ3JhdGlvbiwgYnJpZGdlfQogIGltcG9ydCBhbm5vdGF0aW9uLnVuY2hlY2tlZC57IHVuY2hlY2tlZFZhcmlhbmNlID0+IHVWIH0KICBpbXBvcnQgcGFyYWxsZWwuUGFySXRlcmFibGUKCiAgLyoqIEEgdGVtcGxhdGUgdHJhaXQgZm9yIHRyYXZlcnNhYmxlIGNvbGxlY3Rpb25zIG9mIHR5cGUgYFRyYXZlcnNhYmxlW0FdYC4KICAgKiAgCiAgICogICR0cmF2ZXJzYWJsZUluZm8KICAgKiAgQGRlZmluZSBtdXRhYmlsaXR5CiAgICogIEBkZWZpbmUgdHJhdmVyc2FibGVJbmZvCiAgICogIFRoaXMgaXMgYSBiYXNlIHRyYWl0IG9mIGFsbCBraW5kcyBvZiAkbXV0YWJpbGl0eSBTY2FsYSBjb2xsZWN0aW9ucy4gSXQKICAgKiAgaW1wbGVtZW50cyB0aGUgYmVoYXZpb3IgY29tbW9uIHRvIGFsbCBjb2xsZWN0aW9ucywgaW4gdGVybXMgb2YgYSBtZXRob2QKICAgKiAgYGZvcmVhY2hgIHdpdGggc2lnbmF0dXJlOgogICAqIHt7ewogICAqICAgICBkZWYgZm9yZWFjaFtVXShmOiBFbGVtID0+IFUpOiBVbml0CiAgICogfX19CiAgICogIENvbGxlY3Rpb24gY2xhc3NlcyBtaXhpbmcgaW4gdGhpcyB0cmFpdCBwcm92aWRlIGEgY29uY3JldGUgCiAgICogIGBmb3JlYWNoYCBtZXRob2Qgd2hpY2ggdHJhdmVyc2VzIGFsbCB0aGUKICAgKiAgZWxlbWVudHMgY29udGFpbmVkIGluIHRoZSBjb2xsZWN0aW9uLCBhcHBseWluZyBhIGdpdmVuIGZ1bmN0aW9uIHRvIGVhY2guCiAgICogIFRoZXkgYWxzbyBuZWVkIHRvIHByb3ZpZGUgYSBtZXRob2QgYG5ld0J1aWxkZXJgCiAgICogIHdoaWNoIGNyZWF0ZXMgYSBidWlsZGVyIGZvciBjb2xsZWN0aW9ucyBvZiB0aGUgc2FtZSBraW5kLgogICAqICAKICAgKiAgQSB0cmF2ZXJzYWJsZSBjbGFzcyBtaWdodCBvciBtaWdodCBub3QgaGF2ZSB0d28gcHJvcGVydGllczogc3RyaWN0bmVzcwogICAqICBhbmQgb3JkZXJlZG5lc3MuIE5laXRoZXIgaXMgcmVwcmVzZW50ZWQgYXMgYSB0eXBlLgogICAqICAKICAgKiAgVGhlIGluc3RhbmNlcyBvZiBhIHN0cmljdCBjb2xsZWN0aW9uIGNsYXNzIGhhdmUgYWxsIHRoZWlyIGVsZW1lbnRzCiAgICogIGNvbXB1dGVkIGJlZm9yZSB0aGV5IGNhbiBiZSB1c2VkIGFzIHZhbHVlcy4gQnkgY29udHJhc3QsIGluc3RhbmNlcyBvZgogICAqICBhIG5vbi1zdHJpY3QgY29sbGVjdGlvbiBjbGFzcyBtYXkgZGVmZXIgY29tcHV0YXRpb24gb2Ygc29tZSBvZiB0aGVpcgogICAqICBlbGVtZW50cyB1bnRpbCBhZnRlciB0aGUgaW5zdGFuY2UgaXMgYXZhaWxhYmxlIGFzIGEgdmFsdWUuCiAgICogIEEgdHlwaWNhbCBleGFtcGxlIG9mIGEgbm9uLXN0cmljdCBjb2xsZWN0aW9uIGNsYXNzIGlzIGEKICAgKiAgPGEgaHJlZj0iLi4vaW1tdXRhYmxlL1N0cmVhbS5odG1sIiB0YXJnZXQ9IkNvbnRlbnRGcmFtZSI+CiAgICogIGBzY2FsYS5jb2xsZWN0aW9uLmltbXV0YWJsZS5TdHJlYW1gPC9hPi4KICAgKiAgQSBtb3JlIGdlbmVyYWwgY2xhc3Mgb2YgZXhhbXBsZXMgYXJlIGBUcmF2ZXJzYWJsZVZpZXdzYC4KICAgKiAgCiAgICogIElmIGEgY29sbGVjdGlvbiBpcyBhbiBpbnN0YW5jZSBvZiBhbiBvcmRlcmVkIGNvbGxlY3Rpb24gY2xhc3MsIHRyYXZlcnNpbmcKICAgKiAgaXRzIGVsZW1lbnRzIHdpdGggYGZvcmVhY2hgIHdpbGwgYWx3YXlzIHZpc2l0IGVsZW1lbnRzIGluIHRoZQogICAqICBzYW1lIG9yZGVyLCBldmVuIGZvciBkaWZmZXJlbnQgcnVucyBvZiB0aGUgcHJvZ3JhbS4gSWYgdGhlIGNsYXNzIGlzIG5vdAogICAqICBvcmRlcmVkLCBgZm9yZWFjaGAgY2FuIHZpc2l0IGVsZW1lbnRzIGluIGRpZmZlcmVudCBvcmRlcnMgZm9yCiAgICogIGRpZmZlcmVudCBydW5zIChidXQgaXQgd2lsbCBrZWVwIHRoZSBzYW1lIG9yZGVyIGluIHRoZSBzYW1lIHJ1bikuJwogICAqIAogICAqICBBIHR5cGljYWwgZXhhbXBsZSBvZiBhIGNvbGxlY3Rpb24gY2xhc3Mgd2hpY2ggaXMgbm90IG9yZGVyZWQgaXMgYQogICAqICBgSGFzaE1hcGAgb2Ygb2JqZWN0cy4gVGhlIHRyYXZlcnNhbCBvcmRlciBmb3IgaGFzaCBtYXBzIHdpbGwKICAgKiAgZGVwZW5kIG9uIHRoZSBoYXNoIGNvZGVzIG9mIGl0cyBlbGVtZW50cywgYW5kIHRoZXNlIGhhc2ggY29kZXMgbWlnaHQKICAgKiAgZGlmZmVyIGZyb20gb25lIHJ1biB0byB0aGUgbmV4dC4gQnkgY29udHJhc3QsIGEgYExpbmtlZEhhc2hNYXBgCiAgICogIGlzIG9yZGVyZWQgYmVjYXVzZSBpdCdzIGBmb3JlYWNoYCBtZXRob2QgdmlzaXRzIGVsZW1lbnRzIGluIHRoZQogICAqICBvcmRlciB0aGV5IHdlcmUgaW5zZXJ0ZWQgaW50byB0aGUgYEhhc2hNYXBgLgogICAqCiAgICogIEBhdXRob3IgTWFydGluIE9kZXJza3kKICAgKiAgQHZlcnNpb24gMi44CiAgICogIEBzaW5jZSAgIDIuOAogICAqICBAdHBhcmFtIEEgICAgdGhlIGVsZW1lbnQgdHlwZSBvZiB0aGUgY29sbGVjdGlvbgogICAqICBAdHBhcmFtIFJlcHIgdGhlIHR5cGUgb2YgdGhlIGFjdHVhbCBjb2xsZWN0aW9uIGNvbnRhaW5pbmcgdGhlIGVsZW1lbnRzLgogICAqCiAgICogIEBkZWZpbmUgQ29sbCBUcmF2ZXJzYWJsZQogICAqICBAZGVmaW5lIGNvbGwgdHJhdmVyc2FibGUgY29sbGVjdGlvbgogICAqLwogIHRyYWl0IFRyYXZlcnNhYmxlTGlrZVsrQSwgK1JlcHJdIGV4dGVuZHMgSGFzTmV3QnVpbGRlcltBLCBSZXByXSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIEZpbHRlck1vbmFkaWNbQSwgUmVwcl0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoIFRyYXZlcnNhYmxlT25jZVtBXQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGggR2VuVHJhdmVyc2FibGVMaWtlW0EsIFJlcHJdCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aCBQYXJhbGxlbGl6YWJsZVtBLCBQYXJJdGVyYWJsZVtBXV0KICB7CiAgICBzZWxmID0+CgogICAgaW1wb3J0IFRyYXZlcnNhYmxlLmJyZWFrcy5fCgogICAgLyoqIFRoZSB0eXBlIGltcGxlbWVudGluZyB0aGlzIHRyYXZlcnNhYmxlICovCiAgICBwcm90ZWN0ZWQgdHlwZSBTZWxmID0gUmVwcgoKICAgIC8qKiBUaGUgY29sbGVjdGlvbiBvZiB0eXBlICRjb2xsIHVuZGVybHlpbmcgdGhpcyBgVHJhdmVyc2FibGVMaWtlYCBvYmplY3QuCiAgICAgKiAgQnkgZGVmYXVsdCB0aGlzIGlzIGltcGxlbWVudGVkIGFzIHRoZSBgVHJhdmVyc2FibGVMaWtlYCBvYmplY3QgaXRzZWxmLAogICAgICogIGJ1dCB0aGlzIGNhbiBiZSBvdmVycmlkZGVuLgogICAgICovCiAgICBkZWYgcmVwcjogUmVwciA9IHRoaXMuYXNJbnN0YW5jZU9mW1JlcHJdCgogICAgLyoqIFRoZSB1bmRlcmx5aW5nIGNvbGxlY3Rpb24gc2VlbiBhcyBhbiBpbnN0YW5jZSBvZiBgJENvbGxgLgogICAgICogIEJ5IGRlZmF1bHQgdGhpcyBpcyBpbXBsZW1lbnRlZCBhcyB0aGUgY3VycmVudCBjb2xsZWN0aW9uIG9iamVjdCBpdHNlbGYsCiAgICAgKiAgYnV0IHRoaXMgY2FuIGJlIG92ZXJyaWRkZW4uCiAgICAgKi8KICAgIHByb3RlY3RlZFt0aGlzXSBkZWYgdGhpc0NvbGxlY3Rpb246IFRyYXZlcnNhYmxlW0FdID0gdGhpcy5hc0luc3RhbmNlT2ZbVHJhdmVyc2FibGVbQV1dCgogICAgLyoqIEEgY29udmVyc2lvbiBmcm9tIGNvbGxlY3Rpb25zIG9mIHR5cGUgYFJlcHJgIHRvIGAkQ29sbGAgb2JqZWN0cy4KICAgICAqICBCeSBkZWZhdWx0IHRoaXMgaXMgaW1wbGVtZW50ZWQgYXMganVzdCBhIGNhc3QsIGJ1dCB0aGlzIGNhbiBiZSBvdmVycmlkZGVuLgogICAgICovCiAgICBwcm90ZWN0ZWRbdGhpc10gZGVmIHRvQ29sbGVjdGlvbihyZXByOiBSZXByKTogVHJhdmVyc2FibGVbQV0gPSByZXByLmFzSW5zdGFuY2VPZltUcmF2ZXJzYWJsZVtBXV0KCiAgICAvKiogQ3JlYXRlcyBhIG5ldyBidWlsZGVyIGZvciB0aGlzIGNvbGxlY3Rpb24gdHlwZS4KICAgICAqLwogICAgcHJvdGVjdGVkW3RoaXNdIGRlZiBuZXdCdWlsZGVyOiBCdWlsZGVyW0EsIFJlcHJdCgogICAgcHJvdGVjdGVkW3RoaXNdIGRlZiBwYXJDb21iaW5lciA9IFBhckl0ZXJhYmxlLm5ld0NvbWJpbmVyW0FdCgogICAgLyoqIEFwcGxpZXMgYSBmdW5jdGlvbiBgZmAgdG8gYWxsIGVsZW1lbnRzIG9mIHRoaXMgJGNvbGwuCiAgICAgKiAgCiAgICAgKiAgICBOb3RlOiB0aGlzIG1ldGhvZCB1bmRlcmxpZXMgdGhlIGltcGxlbWVudGF0aW9uIG9mIG1vc3Qgb3RoZXIgYnVsayBvcGVyYXRpb25zLgogICAgICogICAgSXQncyBpbXBvcnRhbnQgdG8gaW1wbGVtZW50IHRoaXMgbWV0aG9kIGluIGFuIGVmZmljaWVudCB3YXkuCiAgICAgKiAgCiAgICAgKgogICAgICogIEBwYXJhbSAgZiAgIHRoZSBmdW5jdGlvbiB0aGF0IGlzIGFwcGxpZWQgZm9yIGl0cyBzaWRlLWVmZmVjdCB0byBldmVyeSBlbGVtZW50LgogICAgICogICAgICAgICAgICAgIFRoZSByZXN1bHQgb2YgZnVuY3Rpb24gYGZgIGlzIGRpc2NhcmRlZC4KICAgICAqICAgICAgICAgICAgICAKICAgICAqICBAdHBhcmFtICBVICB0aGUgdHlwZSBwYXJhbWV0ZXIgZGVzY3JpYmluZyB0aGUgcmVzdWx0IG9mIGZ1bmN0aW9uIGBmYC4gCiAgICAgKiAgICAgICAgICAgICAgVGhpcyByZXN1bHQgd2lsbCBhbHdheXMgYmUgaWdub3JlZC4gVHlwaWNhbGx5IGBVYCBpcyBgVW5pdGAsCiAgICAgKiAgICAgICAgICAgICAgYnV0IHRoaXMgaXMgbm90IG5lY2Vzc2FyeS4KICAgICAqCiAgICAgKiAgQHVzZWNhc2UgZGVmIGZvcmVhY2goZjogQSA9PiBVbml0KTogVW5pdAogICAgICovCiAgICBkZWYgZm9yZWFjaFtVXShmOiBBID0+IFUpOiBVbml0CgogICAgLyoqIFRlc3RzIHdoZXRoZXIgdGhpcyAkY29sbCBpcyBlbXB0eS4KICAgICAqCiAgICAgKiAgQHJldHVybiAgICBgdHJ1ZWAgaWYgdGhlICRjb2xsIGNvbnRhaW4gbm8gZWxlbWVudHMsIGBmYWxzZWAgb3RoZXJ3aXNlLgogICAgICovCiAgICBkZWYgaXNFbXB0eTogQm9vbGVhbiA9IHsKICAgICAgdmFyIHJlc3VsdCA9IHRydWUKICAgICAgYnJlYWthYmxlIHsKICAgICAgICBmb3IgKHggPC0gdGhpcykgewogICAgICAgICAgcmVzdWx0ID0gZmFsc2UKICAgICAgICAgIGJyZWFrCiAgICAgICAgfQogICAgICB9CiAgICAgIHJlc3VsdAogICAgfQoKICAgIC8qKiBUZXN0cyB3aGV0aGVyIHRoaXMgJGNvbGwgaXMga25vd24gdG8gaGF2ZSBhIGZpbml0ZSBzaXplLgogICAgICogIEFsbCBzdHJpY3QgY29sbGVjdGlvbnMgYXJlIGtub3duIHRvIGhhdmUgZmluaXRlIHNpemUuIEZvciBhIG5vbi1zdHJpY3QgY29sbGVjdGlvbgogICAgICogIHN1Y2ggYXMgYFN0cmVhbWAsIHRoZSBwcmVkaWNhdGUgcmV0dXJucyBgdHJ1ZWAgaWYgYWxsIGVsZW1lbnRzIGhhdmUgYmVlbiBjb21wdXRlZC4KICAgICAqICBJdCByZXR1cm5zIGBmYWxzZWAgaWYgdGhlIHN0cmVhbSBpcyBub3QgeWV0IGV2YWx1YXRlZCB0byB0aGUgZW5kLgogICAgICoKICAgICAqICBOb3RlOiBtYW55IGNvbGxlY3Rpb24gbWV0aG9kcyB3aWxsIG5vdCB3b3JrIG9uIGNvbGxlY3Rpb25zIG9mIGluZmluaXRlIHNpemVzLiAKICAgICAqCiAgICAgKiAgQHJldHVybiAgYHRydWVgIGlmIHRoaXMgY29sbGVjdGlvbiBpcyBrbm93biB0byBoYXZlIGZpbml0ZSBzaXplLCBgZmFsc2VgIG90aGVyd2lzZS4KICAgICAqLwogICAgZGVmIGhhc0RlZmluaXRlU2l6ZSA9IHRydWUKCiAgICBkZWYgKytbQiA+OiBBLCBUaGF0XSh0aGF0OiBHZW5UcmF2ZXJzYWJsZU9uY2VbQl0pKGltcGxpY2l0IGJmOiBDYW5CdWlsZEZyb21bUmVwciwgQiwgVGhhdF0pOiBUaGF0ID0gewogICAgICB2YWwgYiA9IGJmKHJlcHIpCiAgICAgIGlmICh0aGF0LmlzSW5zdGFuY2VPZltJbmRleGVkU2VxTGlrZVtfLCBfXV0pIGIuc2l6ZUhpbnQodGhpcywgdGhhdC5zZXEuc2l6ZSkKICAgICAgYiArKz0gdGhpc0NvbGxlY3Rpb24KICAgICAgYiArKz0gdGhhdC5zZXEKICAgICAgYi5yZXN1bHQKICAgIH0KCiAgICBAYnJpZGdlCiAgICBkZWYgKytbQiA+OiBBLCBUaGF0XSh0aGF0OiBUcmF2ZXJzYWJsZU9uY2VbQl0pKGltcGxpY2l0IGJmOiBDYW5CdWlsZEZyb21bUmVwciwgQiwgVGhhdF0pOiBUaGF0ID0KICAgICAgKysodGhhdDogR2VuVHJhdmVyc2FibGVPbmNlW0JdKShiZikKCiAgICAvKiogQ29uY2F0ZW5hdGVzIHRoaXMgJGNvbGwgd2l0aCB0aGUgZWxlbWVudHMgb2YgYSB0cmF2ZXJzYWJsZSBjb2xsZWN0aW9uLgogICAgICogIEl0IGRpZmZlcnMgZnJvbSArKyBpbiB0aGF0IHRoZSByaWdodCBvcGVyYW5kIGRldGVybWluZXMgdGhlIHR5cGUgb2YgdGhlCiAgICAgKiAgcmVzdWx0aW5nIGNvbGxlY3Rpb24gcmF0aGVyIHRoYW4gdGhlIGxlZnQgb25lLgogICAgICogCiAgICAgKiAgQHBhcmFtIHRoYXQgICB0aGUgdHJhdmVyc2FibGUgdG8gYXBwZW5kLgogICAgICogIEB0cGFyYW0gQiAgICAgdGhlIGVsZW1lbnQgdHlwZSBvZiB0aGUgcmV0dXJuZWQgY29sbGVjdGlvbi4gCiAgICAgKiAgQHRwYXJhbSBUaGF0ICAkdGhhdGluZm8KICAgICAqICBAcGFyYW0gYmYgICAgICRiZmluZm8KICAgICAqICBAcmV0dXJuICAgICAgIGEgbmV3IGNvbGxlY3Rpb24gb2YgdHlwZSBgVGhhdGAgd2hpY2ggY29udGFpbnMgYWxsIGVsZW1lbnRzCiAgICAgKiAgICAgICAgICAgICAgICBvZiB0aGlzICRjb2xsIGZvbGxvd2VkIGJ5IGFsbCBlbGVtZW50cyBvZiBgdGhhdGAuCiAgICAgKiAKICAgICAqICBAdXNlY2FzZSBkZWYgKys6W0JdKHRoYXQ6IFRyYXZlcnNhYmxlT25jZVtCXSk6ICRDb2xsW0JdCiAgICAgKiAgCiAgICAgKiAgQHJldHVybiAgICAgICBhIG5ldyAkY29sbCB3aGljaCBjb250YWlucyBhbGwgZWxlbWVudHMgb2YgdGhpcyAkY29sbAogICAgICogICAgICAgICAgICAgICAgZm9sbG93ZWQgYnkgYWxsIGVsZW1lbnRzIG9mIGB0aGF0YC4KICAgICAqLwogICAgZGVmICsrOltCID46IEEsIFRoYXRdKHRoYXQ6IFRyYXZlcnNhYmxlT25jZVtCXSkoaW1wbGljaXQgYmY6IENhbkJ1aWxkRnJvbVtSZXByLCBCLCBUaGF0XSk6IFRoYXQgPSB7CiAgICAgIHZhbCBiID0gYmYocmVwcikKICAgICAgaWYgKHRoYXQuaXNJbnN0YW5jZU9mW0luZGV4ZWRTZXFMaWtlW18sIF9dXSkgYi5zaXplSGludCh0aGlzLCB0aGF0LnNpemUpCiAgICAgIGIgKys9IHRoYXQKICAgICAgYiArKz0gdGhpc0NvbGxlY3Rpb24KICAgICAgYi5yZXN1bHQKICAgIH0KCiAgICAvKiogVGhpcyBvdmVybG9hZCBleGlzdHMgYmVjYXVzZTogZm9yIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiArKzogd2Ugc2hvdWxkIHJldXNlCiAgICAgKiAgdGhhdCBvZiArKyBiZWNhdXNlIG1hbnkgY29sbGVjdGlvbnMgb3ZlcnJpZGUgaXQgd2l0aCBtb3JlIGVmZmljaWVudCB2ZXJzaW9ucy4KICAgICAqICBTaW5jZSBUcmF2ZXJzYWJsZU9uY2UgaGFzIG5vICcrKycgbWV0aG9kLCB3ZSBoYXZlIHRvIGltcGxlbWVudCB0aGF0IGRpcmVjdGx5LAogICAgICogIGJ1dCBUcmF2ZXJzYWJsZSBhbmQgZG93biBjYW4gdXNlIHRoZSBvdmVybG9hZC4KICAgICAqLwogICAgZGVmICsrOltCID46IEEsIFRoYXRdKHRoYXQ6IFRyYXZlcnNhYmxlW0JdKShpbXBsaWNpdCBiZjogQ2FuQnVpbGRGcm9tW1JlcHIsIEIsIFRoYXRdKTogVGhhdCA9CiAgICAgICh0aGF0ICsrIHNlcSkoYnJlYWtPdXQpCgogICAgZGVmIG1hcFtCLCBUaGF0XShmOiBBID0+IEIpKGltcGxpY2l0IGJmOiBDYW5CdWlsZEZyb21bUmVwciwgQiwgVGhhdF0pOiBUaGF0ID0gewogICAgICB2YWwgYiA9IGJmKHJlcHIpCiAgICAgIGIuc2l6ZUhpbnQodGhpcykgCiAgICAgIGZvciAoeCA8LSB0aGlzKSBiICs9IGYoeCkKICAgICAgYi5yZXN1bHQKICAgIH0KCiAgICBkZWYgZmxhdE1hcFtCLCBUaGF0XShmOiBBID0+IEdlblRyYXZlcnNhYmxlT25jZVtCXSkoaW1wbGljaXQgYmY6IENhbkJ1aWxkRnJvbVtSZXByLCBCLCBUaGF0XSk6IFRoYXQgPSB7CiAgICAgIHZhbCBiID0gYmYocmVwcikKICAgICAgZm9yICh4IDwtIHRoaXMpIGIgKys9IGYoeCkuc2VxCiAgICAgIGIucmVzdWx0CiAgICB9CgogICAgLyoqIFNlbGVjdHMgYWxsIGVsZW1lbnRzIG9mIHRoaXMgJGNvbGwgd2hpY2ggc2F0aXNmeSBhIHByZWRpY2F0ZS4KICAgICAqCiAgICAgKiAgQHBhcmFtIHAgICAgIHRoZSBwcmVkaWNhdGUgdXNlZCB0byB0ZXN0IGVsZW1lbnRzLgogICAgICogIEByZXR1cm4gICAgICBhIG5ldyAkY29sbCBjb25zaXN0aW5nIG9mIGFsbCBlbGVtZW50cyBvZiB0aGlzICRjb2xsIHRoYXQgc2F0aXNmeSB0aGUgZ2l2ZW4KICAgICAqICAgICAgICAgICAgICAgcHJlZGljYXRlIGBwYC4gVGhlIG9yZGVyIG9mIHRoZSBlbGVtZW50cyBpcyBwcmVzZXJ2ZWQuCiAgICAgKi8KICAgIGRlZiBmaWx0ZXIocDogQSA9PiBCb29sZWFuKTogUmVwciA9IHsKICAgICAgdmFsIGIgPSBuZXdCdWlsZGVyCiAgICAgIGZvciAoeCA8LSB0aGlzKSAKICAgICAgICBpZiAocCh4KSkgYiArPSB4CiAgICAgIGIucmVzdWx0CiAgICB9CgogICAgLyoqIFNlbGVjdHMgYWxsIGVsZW1lbnRzIG9mIHRoaXMgJGNvbGwgd2hpY2ggZG8gbm90IHNhdGlzZnkgYSBwcmVkaWNhdGUuCiAgICAgKgogICAgICogIEBwYXJhbSBwICAgICB0aGUgcHJlZGljYXRlIHVzZWQgdG8gdGVzdCBlbGVtZW50cy4KICAgICAqICBAcmV0dXJuICAgICAgYSBuZXcgJGNvbGwgY29uc2lzdGluZyBvZiBhbGwgZWxlbWVudHMgb2YgdGhpcyAkY29sbCB0aGF0IGRvIG5vdCBzYXRpc2Z5IHRoZSBnaXZlbgogICAgICogICAgICAgICAgICAgICBwcmVkaWNhdGUgYHBgLiBUaGUgb3JkZXIgb2YgdGhlIGVsZW1lbnRzIGlzIHByZXNlcnZlZC4KICAgICAqLwogICAgZGVmIGZpbHRlck5vdChwOiBBID0+IEJvb2xlYW4pOiBSZXByID0gZmlsdGVyKCFwKF8pKQoKICAgIGRlZiBjb2xsZWN0W0IsIFRoYXRdKHBmOiBQYXJ0aWFsRnVuY3Rpb25bQSwgQl0pKGltcGxpY2l0IGJmOiBDYW5CdWlsZEZyb21bUmVwciwgQiwgVGhhdF0pOiBUaGF0ID0gewogICAgICB2YWwgYiA9IGJmKHJlcHIpCiAgICAgIGZvciAoeCA8LSB0aGlzKSBpZiAocGYuaXNEZWZpbmVkQXQoeCkpIGIgKz0gcGYoeCkKICAgICAgYi5yZXN1bHQKICAgIH0KCiAgICAvKiogQnVpbGRzIGEgbmV3IGNvbGxlY3Rpb24gYnkgYXBwbHlpbmcgYW4gb3B0aW9uLXZhbHVlZCBmdW5jdGlvbiB0byBhbGwKICAgICAqICBlbGVtZW50cyBvZiB0aGlzICRjb2xsIG9uIHdoaWNoIHRoZSBmdW5jdGlvbiBpcyBkZWZpbmVkLgogICAgICoKICAgICAqICBAcGFyYW0gZiAgICAgIHRoZSBvcHRpb24tdmFsdWVkIGZ1bmN0aW9uIHdoaWNoIGZpbHRlcnMgYW5kIG1hcHMgdGhlICRjb2xsLgogICAgICogIEB0cGFyYW0gQiAgICAgdGhlIGVsZW1lbnQgdHlwZSBvZiB0aGUgcmV0dXJuZWQgY29sbGVjdGlvbi4KICAgICAqICBAdHBhcmFtIFRoYXQgICR0aGF0aW5mbwogICAgICogIEBwYXJhbSBiZiAgICAgJGJmaW5mbwogICAgICogIEByZXR1cm4gICAgICAgYSBuZXcgY29sbGVjdGlvbiBvZiB0eXBlIGBUaGF0YCByZXN1bHRpbmcgZnJvbSBhcHBseWluZyB0aGUgb3B0aW9uLXZhbHVlZCBmdW5jdGlvbgogICAgICogICAgICAgICAgICAgICAgYGZgIHRvIGVhY2ggZWxlbWVudCBhbmQgY29sbGVjdGluZyBhbGwgZGVmaW5lZCByZXN1bHRzLgogICAgICogICAgICAgICAgICAgICAgVGhlIG9yZGVyIG9mIHRoZSBlbGVtZW50cyBpcyBwcmVzZXJ2ZWQuCiAgICAgKgogICAgICogIEB1c2VjYXNlIGRlZiBmaWx0ZXJNYXBbQl0oZjogQSA9PiBPcHRpb25bQl0pOiAkQ29sbFtCXQogICAgICogIAogICAgICogIEBwYXJhbSBwZiAgICAgdGhlIHBhcnRpYWwgZnVuY3Rpb24gd2hpY2ggZmlsdGVycyBhbmQgbWFwcyB0aGUgJGNvbGwuCiAgICAgKiAgQHJldHVybiAgICAgICBhIG5ldyAkY29sbCByZXN1bHRpbmcgZnJvbSBhcHBseWluZyB0aGUgZ2l2ZW4gb3B0aW9uLXZhbHVlZCBmdW5jdGlvbgogICAgICogICAgICAgICAgICAgICAgYGZgIHRvIGVhY2ggZWxlbWVudCBhbmQgY29sbGVjdGluZyBhbGwgZGVmaW5lZCByZXN1bHRzLgogICAgICogICAgICAgICAgICAgICAgVGhlIG9yZGVyIG9mIHRoZSBlbGVtZW50cyBpcyBwcmVzZXJ2ZWQuCiAgICBkZWYgZmlsdGVyTWFwW0IsIFRoYXRdKGY6IEEgPT4gT3B0aW9uW0JdKShpbXBsaWNpdCBiZjogQ2FuQnVpbGRGcm9tW1JlcHIsIEIsIFRoYXRdKTogVGhhdCA9IHsKICAgICAgdmFsIGIgPSBiZihyZXByKQogICAgICBmb3IgKHggPC0gdGhpcykgCiAgICAgICAgZih4KSBtYXRjaCB7CiAgICAgICAgICBjYXNlIFNvbWUoeSkgPT4gYiArPSB5CiAgICAgICAgICBjYXNlIF8gPT4KICAgICAgICB9CiAgICAgIGIucmVzdWx0CiAgICB9CiAgICAgKi8KCiAgICAvKiogUGFydGl0aW9ucyB0aGlzICRjb2xsIGluIHR3byAke2NvbGx9cyBhY2NvcmRpbmcgdG8gYSBwcmVkaWNhdGUuCiAgICAgKgogICAgICogIEBwYXJhbSBwIHRoZSBwcmVkaWNhdGUgb24gd2hpY2ggdG8gcGFydGl0aW9uLgogICAgICogIEByZXR1cm4gIGEgcGFpciBvZiAke2NvbGx9czogdGhlIGZpcnN0ICRjb2xsIGNvbnNpc3RzIG9mIGFsbCBlbGVtZW50cyB0aGF0IAogICAgICogICAgICAgICAgIHNhdGlzZnkgdGhlIHByZWRpY2F0ZSBgcGAgYW5kIHRoZSBzZWNvbmQgJGNvbGwgY29uc2lzdHMgb2YgYWxsIGVsZW1lbnRzCiAgICAgKiAgICAgICAgICAgdGhhdCBkb24ndC4gVGhlIHJlbGF0aXZlIG9yZGVyIG9mIHRoZSBlbGVtZW50cyBpbiB0aGUgcmVzdWx0aW5nICR7Y29sbH1zCiAgICAgKiAgICAgICAgICAgaXMgdGhlIHNhbWUgYXMgaW4gdGhlIG9yaWdpbmFsICRjb2xsLgogICAgICovCiAgICBkZWYgcGFydGl0aW9uKHA6IEEgPT4gQm9vbGVhbik6IChSZXByLCBSZXByKSA9IHsKICAgICAgdmFsIGwsIHIgPSBuZXdCdWlsZGVyCiAgICAgIGZvciAoeCA8LSB0aGlzKSAoaWYgKHAoeCkpIGwgZWxzZSByKSArPSB4CiAgICAgIChsLnJlc3VsdCwgci5yZXN1bHQpCiAgICB9CgogICAgZGVmIGdyb3VwQnlbS10oZjogQSA9PiBLKTogaW1tdXRhYmxlLk1hcFtLLCBSZXByXSA9IHsKICAgICAgdmFsIG0gPSBtdXRhYmxlLk1hcC5lbXB0eVtLLCBCdWlsZGVyW0EsIFJlcHJdXQogICAgICBmb3IgKGVsZW0gPC0gdGhpcykgewogICAgICAgIHZhbCBrZXkgPSBmKGVsZW0pCiAgICAgICAgdmFsIGJsZHIgPSBtLmdldE9yRWxzZVVwZGF0ZShrZXksIG5ld0J1aWxkZXIpCiAgICAgICAgYmxkciArPSBlbGVtCiAgICAgIH0KICAgICAgdmFsIGIgPSBpbW11dGFibGUuTWFwLm5ld0J1aWxkZXJbSywgUmVwcl0KICAgICAgZm9yICgoaywgdikgPC0gbSkKICAgICAgICBiICs9ICgoaywgdi5yZXN1bHQpKQoKICAgICAgYi5yZXN1bHQKICAgIH0KCiAgICAvKiogVGVzdHMgd2hldGhlciBhIHByZWRpY2F0ZSBob2xkcyBmb3IgYWxsIGVsZW1lbnRzIG9mIHRoaXMgJGNvbGwuCiAgICAgKgogICAgICogICRtYXlOb3RUZXJtaW5hdGVJbmYKICAgICAqCiAgICAgKiAgQHBhcmFtICAgcCAgICAgdGhlIHByZWRpY2F0ZSB1c2VkIHRvIHRlc3QgZWxlbWVudHMuCiAgICAgKiAgQHJldHVybiAgICAgICAgYHRydWVgIGlmIHRoZSBnaXZlbiBwcmVkaWNhdGUgYHBgIGhvbGRzIGZvciBhbGwgZWxlbWVudHMKICAgICAqICAgICAgICAgICAgICAgICBvZiB0aGlzICRjb2xsLCBvdGhlcndpc2UgYGZhbHNlYC4KICAgICAqLwogICAgZGVmIGZvcmFsbChwOiBBID0+IEJvb2xlYW4pOiBCb29sZWFuID0gewogICAgICB2YXIgcmVzdWx0ID0gdHJ1ZQogICAgICBicmVha2FibGUgewogICAgICAgIGZvciAoeCA8LSB0aGlzKQogICAgICAgICAgaWYgKCFwKHgpKSB7IHJlc3VsdCA9IGZhbHNlOyBicmVhayB9CiAgICAgIH0KICAgICAgcmVzdWx0CiAgICB9CgogICAgLyoqIFRlc3RzIHdoZXRoZXIgYSBwcmVkaWNhdGUgaG9sZHMgZm9yIHNvbWUgb2YgdGhlIGVsZW1lbnRzIG9mIHRoaXMgJGNvbGwuCiAgICAgKgogICAgICogICRtYXlOb3RUZXJtaW5hdGVJbmYKICAgICAqCiAgICAgKiAgQHBhcmFtICAgcCAgICAgdGhlIHByZWRpY2F0ZSB1c2VkIHRvIHRlc3QgZWxlbWVudHMuCiAgICAgKiAgQHJldHVybiAgICAgICAgYHRydWVgIGlmIHRoZSBnaXZlbiBwcmVkaWNhdGUgYHBgIGhvbGRzIGZvciBzb21lIG9mIHRoZQogICAgICogICAgICAgICAgICAgICAgIGVsZW1lbnRzIG9mIHRoaXMgJGNvbGwsIG90aGVyd2lzZSBgZmFsc2VgLgogICAgICovCiAgICBkZWYgZXhpc3RzKHA6IEEgPT4gQm9vbGVhbik6IEJvb2xlYW4gPSB7CiAgICAgIHZhciByZXN1bHQgPSBmYWxzZQogICAgICBicmVha2FibGUgewogICAgICAgIGZvciAoeCA8LSB0aGlzKQogICAgICAgICAgaWYgKHAoeCkpIHsgcmVzdWx0ID0gdHJ1ZTsgYnJlYWsgfQogICAgICB9CiAgICAgIHJlc3VsdAogICAgfQoKICAgIC8qKiBGaW5kcyB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgJGNvbGwgc2F0aXNmeWluZyBhIHByZWRpY2F0ZSwgaWYgYW55LgogICAgICogCiAgICAgKiAgJG1heU5vdFRlcm1pbmF0ZUluZgogICAgICogICRvcmRlckRlcGVuZGVudAogICAgICoKICAgICAqICBAcGFyYW0gcCAgICB0aGUgcHJlZGljYXRlIHVzZWQgdG8gdGVzdCBlbGVtZW50cy4KICAgICAqICBAcmV0dXJuICAgICBhbiBvcHRpb24gdmFsdWUgY29udGFpbmluZyB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgJGNvbGwKICAgICAqICAgICAgICAgICAgICB0aGF0IHNhdGlzZmllcyBgcGAsIG9yIGBOb25lYCBpZiBub25lIGV4aXN0cy4KICAgICAqLwogICAgZGVmIGZpbmQocDogQSA9PiBCb29sZWFuKTogT3B0aW9uW0FdID0gewogICAgICB2YXIgcmVzdWx0OiBPcHRpb25bQV0gPSBOb25lCiAgICAgIGJyZWFrYWJsZSB7CiAgICAgICAgZm9yICh4IDwtIHRoaXMpCiAgICAgICAgICBpZiAocCh4KSkgeyByZXN1bHQgPSBTb21lKHgpOyBicmVhayB9CiAgICAgIH0KICAgICAgcmVzdWx0CiAgICB9CgogICAgZGVmIHNjYW5bQiA+OiBBLCBUaGF0XSh6OiBCKShvcDogKEIsIEIpID0+IEIpKGltcGxpY2l0IGNiZjogQ2FuQnVpbGRGcm9tW1JlcHIsIEIsIFRoYXRdKTogVGhhdCA9IHNjYW5MZWZ0KHopKG9wKQoKICAgIGRlZiBzY2FuTGVmdFtCLCBUaGF0XSh6OiBCKShvcDogKEIsIEEpID0+IEIpKGltcGxpY2l0IGJmOiBDYW5CdWlsZEZyb21bUmVwciwgQiwgVGhhdF0pOiBUaGF0ID0gewogICAgICB2YWwgYiA9IGJmKHJlcHIpCiAgICAgIGIuc2l6ZUhpbnQodGhpcywgMSkKICAgICAgdmFyIGFjYyA9IHoKICAgICAgYiArPSBhY2MKICAgICAgZm9yICh4IDwtIHRoaXMpIHsgYWNjID0gb3AoYWNjLCB4KTsgYiArPSBhY2MgfQogICAgICBiLnJlc3VsdAogICAgfQoKICAgIEBtaWdyYXRpb24oMiwgOSwKICAgICAgIlRoaXMgc2NhblJpZ2h0IGRlZmluaXRpb24gaGFzIGNoYW5nZWQgaW4gMi45LlxuIiArCiAgICAgICJUaGUgcHJldmlvdXMgYmVoYXZpb3IgY2FuIGJlIHJlcHJvZHVjZWQgd2l0aCBzY2FuUmlnaHQucmV2ZXJzZS4iCiAgICApCiAgICBkZWYgc2NhblJpZ2h0W0IsIFRoYXRdKHo6IEIpKG9wOiAoQSwgQikgPT4gQikoaW1wbGljaXQgYmY6IENhbkJ1aWxkRnJvbVtSZXByLCBCLCBUaGF0XSk6IFRoYXQgPSB7CiAgICAgIHZhciBzY2FubmVkID0gTGlzdCh6KQogICAgICB2YXIgYWNjID0gegogICAgICBmb3IgKHggPC0gcmV2ZXJzZWQpIHsKICAgICAgICBhY2MgPSBvcCh4LCBhY2MpCiAgICAgICAgc2Nhbm5lZCA6Oj0gYWNjCiAgICAgIH0KICAgICAgdmFsIGIgPSBiZihyZXByKQogICAgICBmb3IgKGVsZW0gPC0gc2Nhbm5lZCkgYiArPSBlbGVtCiAgICAgIGIucmVzdWx0CiAgICB9CgogICAgLyoqIFNlbGVjdHMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhpcyAkY29sbC4KICAgICAqICAkb3JkZXJEZXBlbmRlbnQKICAgICAqICBAcmV0dXJuICB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGlzICRjb2xsLgogICAgICogIEB0aHJvd3MgYE5vU3VjaEVsZW1lbnRFeGNlcHRpb25gIGlmIHRoZSAkY29sbCBpcyBlbXB0eS4KICAgICAqLwogICAgZGVmIGhlYWQ6IEEgPSB7CiAgICAgIHZhciByZXN1bHQ6ICgpID0+IEEgPSAoKSA9PiB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbgogICAgICBicmVha2FibGUgewogICAgICAgIGZvciAoeCA8LSB0aGlzKSB7CiAgICAgICAgICByZXN1bHQgPSAoKSA9PiB4CiAgICAgICAgICBicmVhawogICAgICAgIH0KICAgICAgfQogICAgICByZXN1bHQoKQogICAgfQoKICAgIC8qKiBPcHRpb25hbGx5IHNlbGVjdHMgdGhlIGZpcnN0IGVsZW1lbnQuCiAgICAgKiAgJG9yZGVyRGVwZW5kZW50CiAgICAgKiAgQHJldHVybiAgdGhlIGZpcnN0IGVsZW1lbnQgb2YgdGhpcyAkY29sbCBpZiBpdCBpcyBub25lbXB0eSwgYE5vbmVgIGlmIGl0IGlzIGVtcHR5LgogICAgICovCiAgICBkZWYgaGVhZE9wdGlvbjogT3B0aW9uW0FdID0gaWYgKGlzRW1wdHkpIE5vbmUgZWxzZSBTb21lKGhlYWQpCgogICAgLyoqIFNlbGVjdHMgYWxsIGVsZW1lbnRzIGV4Y2VwdCB0aGUgZmlyc3QuCiAgICAgKiAgJG9yZGVyRGVwZW5kZW50CiAgICAgKiAgQHJldHVybiAgYSAkY29sbCBjb25zaXN0aW5nIG9mIGFsbCBlbGVtZW50cyBvZiB0aGlzICRjb2xsCiAgICAgKiAgICAgICAgICAgZXhjZXB0IHRoZSBmaXJzdCBvbmUuCiAgICAgKiAgQHRocm93cyBgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb25gIGlmIHRoZSAkY29sbCBpcyBlbXB0eS4KICAgICAqLyAKICAgIG92ZXJyaWRlIGRlZiB0YWlsOiBSZXByID0gewogICAgICBpZiAoaXNFbXB0eSkgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJlbXB0eS50YWlsIikKICAgICAgZHJvcCgxKQogICAgfQoKICAgIC8qKiBTZWxlY3RzIHRoZSBsYXN0IGVsZW1lbnQuCiAgICAgICogJG9yZGVyRGVwZW5kZW50CiAgICAgICogQHJldHVybiBUaGUgbGFzdCBlbGVtZW50IG9mIHRoaXMgJGNvbGwuCiAgICAgICogQHRocm93cyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIElmIHRoZSAkY29sbCBpcyBlbXB0eS4KICAgICAgKi8KICAgIGRlZiBsYXN0OiBBID0gewogICAgICB2YXIgbHN0ID0gaGVhZAogICAgICBmb3IgKHggPC0gdGhpcykKICAgICAgICBsc3QgPSB4CiAgICAgIGxzdAogICAgfQoKICAgIC8qKiBPcHRpb25hbGx5IHNlbGVjdHMgdGhlIGxhc3QgZWxlbWVudC4KICAgICAqICAkb3JkZXJEZXBlbmRlbnQKICAgICAqICBAcmV0dXJuICB0aGUgbGFzdCBlbGVtZW50IG9mIHRoaXMgJGNvbGwkIGlmIGl0IGlzIG5vbmVtcHR5LCBgTm9uZWAgaWYgaXQgaXMgZW1wdHkuCiAgICAgKi8KICAgIGRlZiBsYXN0T3B0aW9uOiBPcHRpb25bQV0gPSBpZiAoaXNFbXB0eSkgTm9uZSBlbHNlIFNvbWUobGFzdCkKCiAgICAvKiogU2VsZWN0cyBhbGwgZWxlbWVudHMgZXhjZXB0IHRoZSBsYXN0LgogICAgICogICRvcmRlckRlcGVuZGVudAogICAgICogIEByZXR1cm4gIGEgJGNvbGwgY29uc2lzdGluZyBvZiBhbGwgZWxlbWVudHMgb2YgdGhpcyAkY29sbAogICAgICogICAgICAgICAgIGV4Y2VwdCB0aGUgbGFzdCBvbmUuCiAgICAgKiAgQHRocm93cyBgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb25gIGlmIHRoZSAkY29sbCBpcyBlbXB0eS4KICAgICAqLwogICAgZGVmIGluaXQ6IFJlcHIgPSB7CiAgICAgIGlmIChpc0VtcHR5KSB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImVtcHR5LmluaXQiKQogICAgICB2YXIgbHN0ID0gaGVhZAogICAgICB2YXIgZm9sbG93ID0gZmFsc2UKICAgICAgdmFsIGIgPSBuZXdCdWlsZGVyCiAgICAgIGIuc2l6ZUhpbnQodGhpcywgLTEpCiAgICAgIGZvciAoeCA8LSB0aGlzLnNlcSkgewogICAgICAgIGlmIChmb2xsb3cpIGIgKz0gbHN0CiAgICAgICAgZWxzZSBmb2xsb3cgPSB0cnVlCiAgICAgICAgbHN0ID0geAogICAgICB9CiAgICAgIGIucmVzdWx0CiAgICB9CgogICAgZGVmIHRha2UobjogSW50KTogUmVwciA9IHNsaWNlKDAsIG4pCgogICAgZGVmIGRyb3AobjogSW50KTogUmVwciA9IAogICAgICBpZiAobiA8PSAwKSB7CiAgICAgICAgdmFsIGIgPSBuZXdCdWlsZGVyCiAgICAgICAgYi5zaXplSGludCh0aGlzKQogICAgICAgIGIgKys9IHRoaXNDb2xsZWN0aW9uIHJlc3VsdAogICAgICB9CiAgICAgIGVsc2Ugc2xpY2VXaXRoS25vd25EZWx0YShuLCBJbnQuTWF4VmFsdWUsIC1uKQoKICAgIGRlZiBzbGljZShmcm9tOiBJbnQsIHVudGlsOiBJbnQpOiBSZXByID0gc2xpY2VXaXRoS25vd25Cb3VuZChtYXRoLm1heChmcm9tLCAwKSwgdW50aWwpCgogICAgLy8gUHJlY29uZGl0aW9uOiBmcm9tID49IDAsIHVudGlsID4gMCwgYnVpbGRlciBhbHJlYWR5IGNvbmZpZ3VyZWQgZm9yIGJ1aWxkaW5nLgogICAgcHJpdmF0ZVt0aGlzXSBkZWYgc2xpY2VJbnRlcm5hbChmcm9tOiBJbnQsIHVudGlsOiBJbnQsIGI6IEJ1aWxkZXJbQSwgUmVwcl0pOiBSZXByID0gewogICAgICB2YXIgaSA9IDAKICAgICAgYnJlYWthYmxlIHsKICAgICAgICBmb3IgKHggPC0gdGhpcy5zZXEpIHsKICAgICAgICAgIGlmIChpID49IGZyb20pIGIgKz0geAogICAgICAgICAgaSArPSAxCiAgICAgICAgICBpZiAoaSA+PSB1bnRpbCkgYnJlYWsKICAgICAgICB9CiAgICAgIH0KICAgICAgYi5yZXN1bHQKICAgIH0KICAgIC8vIFByZWNvbmRpdGlvbjogZnJvbSA+PSAwCiAgICBwcml2YXRlW3NjYWxhXSBkZWYgc2xpY2VXaXRoS25vd25EZWx0YShmcm9tOiBJbnQsIHVudGlsOiBJbnQsIGRlbHRhOiBJbnQpOiBSZXByID0gewogICAgICB2YWwgYiA9IG5ld0J1aWxkZXIKICAgICAgaWYgKHVudGlsIDw9IGZyb20pIGIucmVzdWx0CiAgICAgIGVsc2UgewogICAgICAgIGIuc2l6ZUhpbnQodGhpcywgZGVsdGEpCiAgICAgICAgc2xpY2VJbnRlcm5hbChmcm9tLCB1bnRpbCwgYikKICAgICAgfQogICAgfQogICAgLy8gUHJlY29uZGl0aW9uOiBmcm9tID49IDAKICAgIHByaXZhdGVbc2NhbGFdIGRlZiBzbGljZVdpdGhLbm93bkJvdW5kKGZyb206IEludCwgdW50aWw6IEludCk6IFJlcHIgPSB7CiAgICAgIHZhbCBiID0gbmV3QnVpbGRlcgogICAgICBpZiAodW50aWwgPD0gZnJvbSkgYi5yZXN1bHQKICAgICAgZWxzZSB7CiAgICAgICAgYi5zaXplSGludEJvdW5kZWQodW50aWwgLSBmcm9tLCB0aGlzKSAgICAgIAogICAgICAgIHNsaWNlSW50ZXJuYWwoZnJvbSwgdW50aWwsIGIpCiAgICAgIH0KICAgIH0KCiAgICBkZWYgdGFrZVdoaWxlKHA6IEEgPT4gQm9vbGVhbik6IFJlcHIgPSB7CiAgICAgIHZhbCBiID0gbmV3QnVpbGRlcgogICAgICBicmVha2FibGUgewogICAgICAgIGZvciAoeCA8LSB0aGlzKSB7CiAgICAgICAgICBpZiAoIXAoeCkpIGJyZWFrCiAgICAgICAgICBiICs9IHgKICAgICAgICB9CiAgICAgIH0KICAgICAgYi5yZXN1bHQKICAgIH0KCiAgICBkZWYgZHJvcFdoaWxlKHA6IEEgPT4gQm9vbGVhbik6IFJlcHIgPSB7CiAgICAgIHZhbCBiID0gbmV3QnVpbGRlcgogICAgICB2YXIgZ28gPSBmYWxzZQogICAgICBmb3IgKHggPC0gdGhpcykgewogICAgICAgIGlmICghcCh4KSkgZ28gPSB0cnVlCiAgICAgICAgaWYgKGdvKSBiICs9IHgKICAgICAgfQogICAgICBiLnJlc3VsdAogICAgfQoKICAgIGRlZiBzcGFuKHA6IEEgPT4gQm9vbGVhbik6IChSZXByLCBSZXByKSA9IHsKICAgICAgdmFsIGwsIHIgPSBuZXdCdWlsZGVyCiAgICAgIHZhciB0b0xlZnQgPSB0cnVlCiAgICAgIGZvciAoeCA8LSB0aGlzKSB7CiAgICAgICAgdG9MZWZ0ID0gdG9MZWZ0ICYmIHAoeCkKICAgICAgICAoaWYgKHRvTGVmdCkgbCBlbHNlIHIpICs9IHgKICAgICAgfQogICAgICAobC5yZXN1bHQsIHIucmVzdWx0KQogICAgfQoKICAgIGRlZiBzcGxpdEF0KG46IEludCk6IChSZXByLCBSZXByKSA9IHsKICAgICAgdmFsIGwsIHIgPSBuZXdCdWlsZGVyCiAgICAgIGwuc2l6ZUhpbnRCb3VuZGVkKG4sIHRoaXMpCiAgICAgIGlmIChuID49IDApIHIuc2l6ZUhpbnQodGhpcywgLW4pCiAgICAgIHZhciBpID0gMAogICAgICBmb3IgKHggPC0gdGhpcykgewogICAgICAgIChpZiAoaSA8IG4pIGwgZWxzZSByKSArPSB4CiAgICAgICAgaSArPSAxCiAgICAgIH0KICAgICAgKGwucmVzdWx0LCByLnJlc3VsdCkKICAgIH0KCiAgICAvKiogSXRlcmF0ZXMgb3ZlciB0aGUgdGFpbHMgb2YgdGhpcyAkY29sbC4gVGhlIGZpcnN0IHZhbHVlIHdpbGwgYmUgdGhpcwogICAgICogICRjb2xsIGFuZCB0aGUgZmluYWwgb25lIHdpbGwgYmUgYW4gZW1wdHkgJGNvbGwsIHdpdGggdGhlIGludGVydmVuaW5nCiAgICAgKiAgdmFsdWVzIHRoZSByZXN1bHRzIG9mIHN1Y2Nlc3NpdmUgYXBwbGljYXRpb25zIG9mIGB0YWlsYC4KICAgICAqCiAgICAgKiAgQHJldHVybiAgIGFuIGl0ZXJhdG9yIG92ZXIgYWxsIHRoZSB0YWlscyBvZiB0aGlzICRjb2xsCiAgICAgKiAgQGV4YW1wbGUgIGBMaXN0KDEsMiwzKS50YWlscyA9IEl0ZXJhdG9yKExpc3QoMSwyLDMpLCBMaXN0KDIsMyksIExpc3QoMyksIE5pbClgCiAgICAgKi8gIAogICAgZGVmIHRhaWxzOiBJdGVyYXRvcltSZXByXSA9IGl0ZXJhdGVVbnRpbEVtcHR5KF8udGFpbCkKCiAgICAvKiogSXRlcmF0ZXMgb3ZlciB0aGUgaW5pdHMgb2YgdGhpcyAkY29sbC4gVGhlIGZpcnN0IHZhbHVlIHdpbGwgYmUgdGhpcwogICAgICogICRjb2xsIGFuZCB0aGUgZmluYWwgb25lIHdpbGwgYmUgYW4gZW1wdHkgJGNvbGwsIHdpdGggdGhlIGludGVydmVuaW5nCiAgICAgKiAgdmFsdWVzIHRoZSByZXN1bHRzIG9mIHN1Y2Nlc3NpdmUgYXBwbGljYXRpb25zIG9mIGBpbml0YC4KICAgICAqCiAgICAgKiAgQHJldHVybiAgYW4gaXRlcmF0b3Igb3ZlciBhbGwgdGhlIGluaXRzIG9mIHRoaXMgJGNvbGwKICAgICAqICBAZXhhbXBsZSAgYExpc3QoMSwyLDMpLmluaXRzID0gSXRlcmF0b3IoTGlzdCgxLDIsMyksIExpc3QoMSwyKSwgTGlzdCgxKSwgTmlsKWAKICAgICAqLwogICAgZGVmIGluaXRzOiBJdGVyYXRvcltSZXByXSA9IGl0ZXJhdGVVbnRpbEVtcHR5KF8uaW5pdCkKCiAgICAvKiogQ29waWVzIGVsZW1lbnRzIG9mIHRoaXMgJGNvbGwgdG8gYW4gYXJyYXkuCiAgICAgKiAgRmlsbHMgdGhlIGdpdmVuIGFycmF5IGB4c2Agd2l0aCBhdCBtb3N0IGBsZW5gIGVsZW1lbnRzIG9mCiAgICAgKiAgdGhpcyAkY29sbCwgc3RhcnRpbmcgYXQgcG9zaXRpb24gYHN0YXJ0YC4KICAgICAqICBDb3B5aW5nIHdpbGwgc3RvcCBvbmNlIGVpdGhlciB0aGUgZW5kIG9mIHRoZSBjdXJyZW50ICRjb2xsIGlzIHJlYWNoZWQsCiAgICAgKiAgb3IgdGhlIGVuZCBvZiB0aGUgYXJyYXkgaXMgcmVhY2hlZCwgb3IgYGxlbmAgZWxlbWVudHMgaGF2ZSBiZWVuIGNvcGllZC4KICAgICAqCiAgICAgKiAgJHdpbGxOb3RUZXJtaW5hdGVJbmYKICAgICAqIAogICAgICogIEBwYXJhbSAgeHMgICAgIHRoZSBhcnJheSB0byBmaWxsLgogICAgICogIEBwYXJhbSAgc3RhcnQgIHRoZSBzdGFydGluZyBpbmRleC4KICAgICAqICBAcGFyYW0gIGxlbiAgICB0aGUgbWF4aW1hbCBudW1iZXIgb2YgZWxlbWVudHMgdG8gY29weS4KICAgICAqICBAdHBhcmFtIEIgICAgICB0aGUgdHlwZSBvZiB0aGUgZWxlbWVudHMgb2YgdGhlIGFycmF5LiAKICAgICAqIAogICAgICoKICAgICAqICBAdXNlY2FzZSBkZWYgY29weVRvQXJyYXkoeHM6IEFycmF5W0FdLCBzdGFydDogSW50LCBsZW46IEludCk6IFVuaXQKICAgICAqLwogICAgZGVmIGNvcHlUb0FycmF5W0IgPjogQV0oeHM6IEFycmF5W0JdLCBzdGFydDogSW50LCBsZW46IEludCkgewogICAgICB2YXIgaSA9IHN0YXJ0CiAgICAgIHZhbCBlbmQgPSAoc3RhcnQgKyBsZW4pIG1pbiB4cy5sZW5ndGgKICAgICAgYnJlYWthYmxlIHsKICAgICAgICBmb3IgKHggPC0gdGhpcykgewogICAgICAgICAgaWYgKGkgPj0gZW5kKSBicmVhawogICAgICAgICAgeHMoaSkgPSB4CiAgICAgICAgICBpICs9IDEKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBkZWYgdG9UcmF2ZXJzYWJsZTogVHJhdmVyc2FibGVbQV0gPSB0aGlzQ29sbGVjdGlvbgogICAgZGVmIHRvSXRlcmF0b3I6IEl0ZXJhdG9yW0FdID0gdG9TdHJlYW0uaXRlcmF0b3IKICAgIGRlZiB0b1N0cmVhbTogU3RyZWFtW0FdID0gdG9CdWZmZXIudG9TdHJlYW0KCiAgICAvKiogQ29udmVydHMgdGhpcyAkY29sbCB0byBhIHN0cmluZy4KICAgICAqCiAgICAgKiAgQHJldHVybiAgIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgY29sbGVjdGlvbi4gQnkgZGVmYXVsdCB0aGlzCiAgICAgKiAgICAgICAgICAgIHN0cmluZyBjb25zaXN0cyBvZiB0aGUgYHN0cmluZ1ByZWZpeGAgb2YgdGhpcyAkY29sbCwKICAgICAqICAgICAgICAgICAgZm9sbG93ZWQgYnkgYWxsIGVsZW1lbnRzIHNlcGFyYXRlZCBieSBjb21tYXMgYW5kIGVuY2xvc2VkIGluIHBhcmVudGhlc2VzLgogICAgICovCiAgICBvdmVycmlkZSBkZWYgdG9TdHJpbmcgPSBta1N0cmluZyhzdHJpbmdQcmVmaXggKyAiKCIsICIsICIsICIpIikKCiAgICAvKiogRGVmaW5lcyB0aGUgcHJlZml4IG9mIHRoaXMgb2JqZWN0J3MgYHRvU3RyaW5nYCByZXByZXNlbnRhdGlvbi4KICAgICAqCiAgICAgKiAgQHJldHVybiAgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gd2hpY2ggc3RhcnRzIHRoZSByZXN1bHQgb2YgYHRvU3RyaW5nYAogICAgICogICAgICAgICAgIGFwcGxpZWQgdG8gdGhpcyAkY29sbC4gQnkgZGVmYXVsdCB0aGUgc3RyaW5nIHByZWZpeCBpcyB0aGUKICAgICAqICAgICAgICAgICBzaW1wbGUgbmFtZSBvZiB0aGUgY29sbGVjdGlvbiBjbGFzcyAkY29sbC4KICAgICAqLwogICAgZGVmIHN0cmluZ1ByZWZpeCA6IFN0cmluZyA9IHsKICAgICAgdmFyIHN0cmluZyA9IHJlcHIuYXNJbnN0YW5jZU9mW0FueVJlZl0uZ2V0Q2xhc3MuZ2V0TmFtZQogICAgICB2YWwgaWR4MSA9IHN0cmluZy5sYXN0SW5kZXhPZignLicgOiBJbnQpCiAgICAgIGlmIChpZHgxICE9IC0xKSBzdHJpbmcgPSBzdHJpbmcuc3Vic3RyaW5nKGlkeDEgKyAxKQogICAgICB2YWwgaWR4MiA9IHN0cmluZy5pbmRleE9mKCckJykKICAgICAgaWYgKGlkeDIgIT0gLTEpIHN0cmluZyA9IHN0cmluZy5zdWJzdHJpbmcoMCwgaWR4MikKICAgICAgc3RyaW5nCiAgICB9CgogICAgLyoqIENyZWF0ZXMgYSBub24tc3RyaWN0IHZpZXcgb2YgdGhpcyAkY29sbC4KICAgICAqIAogICAgICogIEByZXR1cm4gYSBub24tc3RyaWN0IHZpZXcgb2YgdGhpcyAkY29sbC4KICAgICAqLwogICAgZGVmIHZpZXcgPSBuZXcgVHJhdmVyc2FibGVWaWV3W0EsIFJlcHJdIHsKICAgICAgcHJvdGVjdGVkIGxhenkgdmFsIHVuZGVybHlpbmcgPSBzZWxmLnJlcHIKICAgICAgb3ZlcnJpZGUgZGVmIGZvcmVhY2hbVV0oZjogQSA9PiBVKSA9IHNlbGYgZm9yZWFjaCBmCiAgICB9CgogICAgLyoqIENyZWF0ZXMgYSBub24tc3RyaWN0IHZpZXcgb2YgYSBzbGljZSBvZiB0aGlzICRjb2xsLgogICAgICoKICAgICAqICBOb3RlOiB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGB2aWV3YCBhbmQgYHNsaWNlYCBpcyB0aGF0IGB2aWV3YCBwcm9kdWNlcwogICAgICogICAgICAgIGEgdmlldyBvZiB0aGUgY3VycmVudCAkY29sbCwgd2hlcmVhcyBgc2xpY2VgIHByb2R1Y2VzIGEgbmV3ICRjb2xsLgogICAgICogCiAgICAgKiAgTm90ZTogYHZpZXcoZnJvbSwgdG8pYCBpcyBlcXVpdmFsZW50IHRvIGB2aWV3LnNsaWNlKGZyb20sIHRvKWAKICAgICAqICAkb3JkZXJEZXBlbmRlbnQKICAgICAqIAogICAgICogIEBwYXJhbSBmcm9tICAgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSB2aWV3CiAgICAgKiAgQHBhcmFtIHVudGlsICB0aGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgZm9sbG93aW5nIHRoZSB2aWV3CiAgICAgKiAgQHJldHVybiBhIG5vbi1zdHJpY3QgdmlldyBvZiBhIHNsaWNlIG9mIHRoaXMgJGNvbGwsIHN0YXJ0aW5nIGF0IGluZGV4IGBmcm9tYAogICAgICogIGFuZCBleHRlbmRpbmcgdXAgdG8gKGJ1dCBub3QgaW5jbHVkaW5nKSBpbmRleCBgdW50aWxgLgogICAgICovCiAgICBkZWYgdmlldyhmcm9tOiBJbnQsIHVudGlsOiBJbnQpOiBUcmF2ZXJzYWJsZVZpZXdbQSwgUmVwcl0gPSB2aWV3LnNsaWNlKGZyb20sIHVudGlsKQoKICAgIC8qKiBDcmVhdGVzIGEgbm9uLXN0cmljdCBmaWx0ZXIgb2YgdGhpcyAkY29sbC4KICAgICAqCiAgICAgKiAgTm90ZTogdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBgYyBmaWx0ZXIgcGAgYW5kIGBjIHdpdGhGaWx0ZXIgcGAgaXMgdGhhdAogICAgICogICAgICAgIHRoZSBmb3JtZXIgY3JlYXRlcyBhIG5ldyBjb2xsZWN0aW9uLCB3aGVyZWFzIHRoZSBsYXR0ZXIgb25seQogICAgICogICAgICAgIHJlc3RyaWN0cyB0aGUgZG9tYWluIG9mIHN1YnNlcXVlbnQgYG1hcGAsIGBmbGF0TWFwYCwgYGZvcmVhY2hgLAogICAgICogICAgICAgIGFuZCBgd2l0aEZpbHRlcmAgb3BlcmF0aW9ucy4KICAgICAqICAkb3JkZXJEZXBlbmRlbnQKICAgICAqIAogICAgICogIEBwYXJhbSBwICAgdGhlIHByZWRpY2F0ZSB1c2VkIHRvIHRlc3QgZWxlbWVudHMuCiAgICAgKiAgQHJldHVybiAgICBhbiBvYmplY3Qgb2YgY2xhc3MgYFdpdGhGaWx0ZXJgLCB3aGljaCBzdXBwb3J0cwogICAgICogICAgICAgICAgICAgYG1hcGAsIGBmbGF0TWFwYCwgYGZvcmVhY2hgLCBhbmQgYHdpdGhGaWx0ZXJgIG9wZXJhdGlvbnMuCiAgICAgKiAgICAgICAgICAgICBBbGwgdGhlc2Ugb3BlcmF0aW9ucyBhcHBseSB0byB0aG9zZSBlbGVtZW50cyBvZiB0aGlzICRjb2xsIHdoaWNoCiAgICAgKiAgICAgICAgICAgICBzYXRpc2Z5IHRoZSBwcmVkaWNhdGUgYHBgLgogICAgICovCiAgICBkZWYgd2l0aEZpbHRlcihwOiBBID0+IEJvb2xlYW4pOiBGaWx0ZXJNb25hZGljW0EsIFJlcHJdID0gbmV3IFdpdGhGaWx0ZXIocCkKCiAgICAvKiogQSBjbGFzcyBzdXBwb3J0aW5nIGZpbHRlcmVkIG9wZXJhdGlvbnMuIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIGFyZQogICAgICogIHJldHVybmVkIGJ5IG1ldGhvZCBgd2l0aEZpbHRlcmAuCiAgICAgKi8KICAgIGNsYXNzIFdpdGhGaWx0ZXIocDogQSA9PiBCb29sZWFuKSBleHRlbmRzIEZpbHRlck1vbmFkaWNbQSwgUmVwcl0gewoKICAgICAgLyoqIEJ1aWxkcyBhIG5ldyBjb2xsZWN0aW9uIGJ5IGFwcGx5aW5nIGEgZnVuY3Rpb24gdG8gYWxsIGVsZW1lbnRzIG9mIHRoZQogICAgICAgKiAgb3V0ZXIgJGNvbGwgY29udGFpbmluZyB0aGlzIGBXaXRoRmlsdGVyYCBpbnN0YW5jZSB0aGF0IHNhdGlzZnkgcHJlZGljYXRlIGBwYC4KICAgICAgICoKICAgICAgICogIEBwYXJhbSBmICAgICAgdGhlIGZ1bmN0aW9uIHRvIGFwcGx5IHRvIGVhY2ggZWxlbWVudC4KICAgICAgICogIEB0cGFyYW0gQiAgICAgdGhlIGVsZW1lbnQgdHlwZSBvZiB0aGUgcmV0dXJuZWQgY29sbGVjdGlvbi4KICAgICAgICogIEB0cGFyYW0gVGhhdCAgJHRoYXRpbmZvCiAgICAgICAqICBAcGFyYW0gYmYgICAgICRiZmluZm8KICAgICAgICogIEByZXR1cm4gICAgICAgYSBuZXcgY29sbGVjdGlvbiBvZiB0eXBlIGBUaGF0YCByZXN1bHRpbmcgZnJvbSBhcHBseWluZwogICAgICAgKiAgICAgICAgICAgICAgICB0aGUgZ2l2ZW4gZnVuY3Rpb24gYGZgIHRvIGVhY2ggZWxlbWVudCBvZiB0aGUgb3V0ZXIgJGNvbGwKICAgICAgICogICAgICAgICAgICAgICAgdGhhdCBzYXRpc2ZpZXMgcHJlZGljYXRlIGBwYCBhbmQgY29sbGVjdGluZyB0aGUgcmVzdWx0cy4KICAgICAgICoKICAgICAgICogIEB1c2VjYXNlIGRlZiBtYXBbQl0oZjogQSA9PiBCKTogJENvbGxbQl0gCiAgICAgICAqICAKICAgICAgICogIEByZXR1cm4gICAgICAgYSBuZXcgJGNvbGwgcmVzdWx0aW5nIGZyb20gYXBwbHlpbmcgdGhlIGdpdmVuIGZ1bmN0aW9uCiAgICAgICAqICAgICAgICAgICAgICAgIGBmYCB0byBlYWNoIGVsZW1lbnQgb2YgdGhlIG91dGVyICRjb2xsIHRoYXQgc2F0aXNmaWVzCiAgICAgICAqICAgICAgICAgICAgICAgIHByZWRpY2F0ZSBgcGAgYW5kIGNvbGxlY3RpbmcgdGhlIHJlc3VsdHMuCiAgICAgICAqLwogICAgICBkZWYgbWFwW0IsIFRoYXRdKGY6IEEgPT4gQikoaW1wbGljaXQgYmY6IENhbkJ1aWxkRnJvbVtSZXByLCBCLCBUaGF0XSk6IFRoYXQgPSB7CiAgICAgICAgdmFsIGIgPSBiZihyZXByKQogICAgICAgIGZvciAoeCA8LSBzZWxmKSAKICAgICAgICAgIGlmIChwKHgpKSBiICs9IGYoeCkKICAgICAgICBiLnJlc3VsdAogICAgICB9CgogICAgICAvKiogQnVpbGRzIGEgbmV3IGNvbGxlY3Rpb24gYnkgYXBwbHlpbmcgYSBmdW5jdGlvbiB0byBhbGwgZWxlbWVudHMgb2YgdGhlCiAgICAgICAqICBvdXRlciAkY29sbCBjb250YWluaW5nIHRoaXMgYFdpdGhGaWx0ZXJgIGluc3RhbmNlIHRoYXQgc2F0aXNmeQogICAgICAgKiAgcHJlZGljYXRlIGBwYCBhbmQgY29uY2F0ZW5hdGluZyB0aGUgcmVzdWx0cy4gCiAgICAgICAqCiAgICAgICAqICBAcGFyYW0gZiAgICAgIHRoZSBmdW5jdGlvbiB0byBhcHBseSB0byBlYWNoIGVsZW1lbnQuCiAgICAgICAqICBAdHBhcmFtIEIgICAgIHRoZSBlbGVtZW50IHR5cGUgb2YgdGhlIHJldHVybmVkIGNvbGxlY3Rpb24uCiAgICAgICAqICBAdHBhcmFtIFRoYXQgICR0aGF0aW5mbwogICAgICAgKiAgQHBhcmFtIGJmICAgICAkYmZpbmZvCiAgICAgICAqICBAcmV0dXJuICAgICAgIGEgbmV3IGNvbGxlY3Rpb24gb2YgdHlwZSBgVGhhdGAgcmVzdWx0aW5nIGZyb20gYXBwbHlpbmcKICAgICAgICogICAgICAgICAgICAgICAgdGhlIGdpdmVuIGNvbGxlY3Rpb24tdmFsdWVkIGZ1bmN0aW9uIGBmYCB0byBlYWNoIGVsZW1lbnQKICAgICAgICogICAgICAgICAgICAgICAgb2YgdGhlIG91dGVyICRjb2xsIHRoYXQgc2F0aXNmaWVzIHByZWRpY2F0ZSBgcGAgYW5kCiAgICAgICAqICAgICAgICAgICAgICAgIGNvbmNhdGVuYXRpbmcgdGhlIHJlc3VsdHMuCiAgICAgICAqCiAgICAgICAqICBAdXNlY2FzZSBkZWYgZmxhdE1hcFtCXShmOiBBID0+IFRyYXZlcnNhYmxlT25jZVtCXSk6ICRDb2xsW0JdCiAgICAgICAqIAogICAgICAgKiAgQHJldHVybiAgICAgICBhIG5ldyAkY29sbCByZXN1bHRpbmcgZnJvbSBhcHBseWluZyB0aGUgZ2l2ZW4gY29sbGVjdGlvbi12YWx1ZWQgZnVuY3Rpb24KICAgICAgICogICAgICAgICAgICAgICAgYGZgIHRvIGVhY2ggZWxlbWVudCBvZiB0aGUgb3V0ZXIgJGNvbGwgdGhhdCBzYXRpc2ZpZXMgcHJlZGljYXRlIGBwYCBhbmQgY29uY2F0ZW5hdGluZyB0aGUgcmVzdWx0cy4KICAgICAgICovCiAgICAgIGRlZiBmbGF0TWFwW0IsIFRoYXRdKGY6IEEgPT4gR2VuVHJhdmVyc2FibGVPbmNlW0JdKShpbXBsaWNpdCBiZjogQ2FuQnVpbGRGcm9tW1JlcHIsIEIsIFRoYXRdKTogVGhhdCA9IHsKICAgICAgICB2YWwgYiA9IGJmKHJlcHIpCiAgICAgICAgZm9yICh4IDwtIHNlbGYpIAogICAgICAgICAgaWYgKHAoeCkpIGIgKys9IGYoeCkuc2VxCiAgICAgICAgYi5yZXN1bHQKICAgICAgfQoKICAgICAgLyoqIEFwcGxpZXMgYSBmdW5jdGlvbiBgZmAgdG8gYWxsIGVsZW1lbnRzIG9mIHRoZSBvdXRlciAkY29sbCBjb250YWluaW5nCiAgICAgICAqICB0aGlzIGBXaXRoRmlsdGVyYCBpbnN0YW5jZSB0aGF0IHNhdGlzZnkgcHJlZGljYXRlIGBwYC4KICAgICAgICoKICAgICAgICogIEBwYXJhbSAgZiAgIHRoZSBmdW5jdGlvbiB0aGF0IGlzIGFwcGxpZWQgZm9yIGl0cyBzaWRlLWVmZmVjdCB0byBldmVyeSBlbGVtZW50LgogICAgICAgKiAgICAgICAgICAgICAgVGhlIHJlc3VsdCBvZiBmdW5jdGlvbiBgZmAgaXMgZGlzY2FyZGVkLgogICAgICAgKiAgICAgICAgICAgICAgCiAgICAgICAqICBAdHBhcmFtICBVICB0aGUgdHlwZSBwYXJhbWV0ZXIgZGVzY3JpYmluZyB0aGUgcmVzdWx0IG9mIGZ1bmN0aW9uIGBmYC4gCiAgICAgICAqICAgICAgICAgICAgICBUaGlzIHJlc3VsdCB3aWxsIGFsd2F5cyBiZSBpZ25vcmVkLiBUeXBpY2FsbHkgYFVgIGlzIGBVbml0YCwKICAgICAgICogICAgICAgICAgICAgIGJ1dCB0aGlzIGlzIG5vdCBuZWNlc3NhcnkuCiAgICAgICAqCiAgICAgICAqICBAdXNlY2FzZSBkZWYgZm9yZWFjaChmOiBBID0+IFVuaXQpOiBVbml0CiAgICAgICAqLyAgIAogICAgICBkZWYgZm9yZWFjaFtVXShmOiBBID0+IFUpOiBVbml0ID0gCiAgICAgICAgZm9yICh4IDwtIHNlbGYpIAogICAgICAgICAgaWYgKHAoeCkpIGYoeCkKCiAgICAgIC8qKiBGdXJ0aGVyIHJlZmluZXMgdGhlIGZpbHRlciBmb3IgdGhpcyAkY29sbC4KICAgICAgICoKICAgICAgICogIEBwYXJhbSBxICAgdGhlIHByZWRpY2F0ZSB1c2VkIHRvIHRlc3QgZWxlbWVudHMuCiAgICAgICAqICBAcmV0dXJuICAgIGFuIG9iamVjdCBvZiBjbGFzcyBgV2l0aEZpbHRlcmAsIHdoaWNoIHN1cHBvcnRzCiAgICAgICAqICAgICAgICAgICAgIGBtYXBgLCBgZmxhdE1hcGAsIGBmb3JlYWNoYCwgYW5kIGB3aXRoRmlsdGVyYCBvcGVyYXRpb25zLgogICAgICAgKiAgICAgICAgICAgICBBbGwgdGhlc2Ugb3BlcmF0aW9ucyBhcHBseSB0byB0aG9zZSBlbGVtZW50cyBvZiB0aGlzICRjb2xsIHdoaWNoCiAgICAgICAqICAgICAgICAgICAgIHNhdGlzZnkgdGhlIHByZWRpY2F0ZSBgcWAgaW4gYWRkaXRpb24gdG8gdGhlIHByZWRpY2F0ZSBgcGAuCiAgICAgICAqLwogICAgICBkZWYgd2l0aEZpbHRlcihxOiBBID0+IEJvb2xlYW4pOiBXaXRoRmlsdGVyID0gCiAgICAgICAgbmV3IFdpdGhGaWx0ZXIoeCA9PiBwKHgpICYmIHEoeCkpCiAgICB9CgogICAgLy8gQSBoZWxwZXIgZm9yIHRhaWxzIGFuZCBpbml0cy4KICAgIHByaXZhdGUgZGVmIGl0ZXJhdGVVbnRpbEVtcHR5KGY6IFRyYXZlcnNhYmxlW0EgQHVWXSA9PiBUcmF2ZXJzYWJsZVtBIEB1Vl0pOiBJdGVyYXRvcltSZXByXSA9IHsKICAgICAgdmFsIGl0ID0gSXRlcmF0b3IuaXRlcmF0ZSh0aGlzQ29sbGVjdGlvbikoZikgdGFrZVdoaWxlICh4ID0+ICF4LmlzRW1wdHkpCiAgICAgIGl0ICsrIEl0ZXJhdG9yKE5pbCkgbWFwIChuZXdCdWlsZGVyICsrPSBfIHJlc3VsdCkKICAgIH0KICB9CgoKPC90ZXh0YXJlYT4KPC9mb3JtPgoKICAgIDxzY3JpcHQ+CiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICAgICAgbGluZU51bWJlcnM6IHRydWUsCiAgICAgICAgbWF0Y2hCcmFja2V0czogdHJ1ZSwKICAgICAgICB0aGVtZTogImFtYmlhbmNlIiwKICAgICAgICBtb2RlOiAidGV4dC94LXNjYWxhIgogICAgICB9KTsKICAgIDwvc2NyaXB0PgogIDwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/clike/test.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24oKSB7CiAgdmFyIG1vZGUgPSBDb2RlTWlycm9yLmdldE1vZGUoe2luZGVudFVuaXQ6IDJ9LCAidGV4dC94LWMiKTsKICBmdW5jdGlvbiBNVChuYW1lKSB7IHRlc3QubW9kZShuYW1lLCBtb2RlLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKTsgfQoKICBNVCgiaW5kZW50IiwKICAgICAiW3ZhcmlhYmxlLTMgdm9pZF0gW2RlZiBmb29dKFt2YXJpYWJsZS0zIHZvaWQqXSBbdmFyaWFibGUgYV0sIFt2YXJpYWJsZS0zIGludF0gW3ZhcmlhYmxlIGJdKSB7IiwKICAgICAiICBbdmFyaWFibGUtMyBpbnRdIFt2YXJpYWJsZSBjXSBbb3BlcmF0b3IgPV0gW3ZhcmlhYmxlIGJdIFtvcGVyYXRvciArXSIsCiAgICAgIiAgICBbbnVtYmVyIDFdOyIsCiAgICAgIiAgW2tleXdvcmQgcmV0dXJuXSBbb3BlcmF0b3IgKl1bdmFyaWFibGUgYV07IiwKICAgICAifSIpOwoKICBNVCgiaW5kZW50X3N3aXRjaCIsCiAgICAgIltrZXl3b3JkIHN3aXRjaF0gKFt2YXJpYWJsZSB4XSkgeyIsCiAgICAgIiAgW2tleXdvcmQgY2FzZV0gW251bWJlciAxMF06IiwKICAgICAiICAgIFtrZXl3b3JkIHJldHVybl0gW251bWJlciAyMF07IiwKICAgICAiICBba2V5d29yZCBkZWZhdWx0XToiLAogICAgICIgICAgW3ZhcmlhYmxlIHByaW50Zl0oW3N0cmluZyBcImZvbyAlY1wiXSwgW3ZhcmlhYmxlIHhdKTsiLAogICAgICJ9Iik7CgogIE1UKCJkZWYiLAogICAgICJbdmFyaWFibGUtMyB2b2lkXSBbZGVmIGZvb10oKSB7fSIsCiAgICAgIltrZXl3b3JkIHN0cnVjdF0gW2RlZiBiYXJde30iLAogICAgICJbdmFyaWFibGUtMyBpbnRdIFt2YXJpYWJsZS0zICpdW2RlZiBiYXpdKCkge30iKTsKCiAgTVQoImRlZl9uZXdfbGluZSIsCiAgICAgIjo6W3ZhcmlhYmxlIHN0ZF06Olt2YXJpYWJsZSBTb21lVGVycmlibGVUeXBlXVtvcGVyYXRvciA8XVt2YXJpYWJsZSBUXVtvcGVyYXRvciA+XSIsCiAgICAgIltkZWYgU29tZUxvbmdNZXRob2ROYW1lVGhhdERvZXNudEZpdEludG9PbmVMaW5lXShba2V5d29yZCBjb25zdF0gW3ZhcmlhYmxlIE15VHlwZV1bb3BlcmF0b3IgJl0gW3ZhcmlhYmxlIHBhcmFtXSkge30iKQoKICBNVCgiZG91YmxlX2Jsb2NrIiwKICAgICAiW2tleXdvcmQgZm9yXSAoOzspIiwKICAgICAiICBba2V5d29yZCBmb3JdICg7OykiLAogICAgICIgICAgW3ZhcmlhYmxlIHhdW29wZXJhdG9yICsrXTsiLAogICAgICJba2V5d29yZCByZXR1cm5dOyIpOwoKICBNVCgicHJlcHJvY2Vzc29yIiwKICAgICAiW21ldGEgI2RlZmluZSBGT08gM10iLAogICAgICJbdmFyaWFibGUtMyBpbnRdIFt2YXJpYWJsZSBmb29dOyIsCiAgICAgIlttZXRhICNkZWZpbmUgQkFSXFxdIiwKICAgICAiW21ldGEgNF0iLAogICAgICJbdmFyaWFibGUtMyB1bnNpZ25lZF0gW3ZhcmlhYmxlLTMgaW50XSBbdmFyaWFibGUgYmFyXSBbb3BlcmF0b3IgPV0gW251bWJlciA4XTsiLAogICAgICJbbWV0YSAjaW5jbHVkZSA8YmF6PiBdW2NvbW1lbnQgLy8gY29tbWVudF0iKQoKCiAgdmFyIG1vZGVfY3BwID0gQ29kZU1pcnJvci5nZXRNb2RlKHtpbmRlbnRVbml0OiAyfSwgInRleHQveC1jKytzcmMiKTsKICBmdW5jdGlvbiBNVENQUChuYW1lKSB7IHRlc3QubW9kZShuYW1lLCBtb2RlX2NwcCwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7IH0KCiAgTVRDUFAoImNwcDE0X2xpdGVyYWwiLAogICAgIltudW1iZXIgMTAnMDAwXTsiLAogICAgIltudW1iZXIgMGIxMCcwMDBdOyIsCiAgICAiW251bWJlciAweDEwJzAwMF07IiwKICAgICJbc3RyaW5nICcxMDAwMDAnXTsiKTsKfSkoKTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/clojure/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/clojure/clojure.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovKioKICogQXV0aG9yOiBIYW5zIEVuZ2VsCiAqIEJyYW5jaGVkIGZyb20gQ29kZU1pcnJvcidzIFNjaGVtZSBtb2RlIChieSBLb2ggWmkgSGFuLCBiYXNlZCBvbiBpbXBsZW1lbnRhdGlvbiBieSBLb2ggWmkgQ2h1bikKICovCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJjbG9qdXJlIiwgZnVuY3Rpb24gKG9wdGlvbnMpIHsKICAgIHZhciBCVUlMVElOID0gImJ1aWx0aW4iLCBDT01NRU5UID0gImNvbW1lbnQiLCBTVFJJTkcgPSAic3RyaW5nIiwgQ0hBUkFDVEVSID0gInN0cmluZy0yIiwKICAgICAgICBBVE9NID0gImF0b20iLCBOVU1CRVIgPSAibnVtYmVyIiwgQlJBQ0tFVCA9ICJicmFja2V0IiwgS0VZV09SRCA9ICJrZXl3b3JkIiwgVkFSID0gInZhcmlhYmxlIjsKICAgIHZhciBJTkRFTlRfV09SRF9TS0lQID0gb3B0aW9ucy5pbmRlbnRVbml0IHx8IDI7CiAgICB2YXIgTk9STUFMX0lOREVOVF9VTklUID0gb3B0aW9ucy5pbmRlbnRVbml0IHx8IDI7CgogICAgZnVuY3Rpb24gbWFrZUtleXdvcmRzKHN0cikgewogICAgICAgIHZhciBvYmogPSB7fSwgd29yZHMgPSBzdHIuc3BsaXQoIiAiKTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHdvcmRzLmxlbmd0aDsgKytpKSBvYmpbd29yZHNbaV1dID0gdHJ1ZTsKICAgICAgICByZXR1cm4gb2JqOwogICAgfQoKICAgIHZhciBhdG9tcyA9IG1ha2VLZXl3b3JkcygidHJ1ZSBmYWxzZSBuaWwiKTsKCiAgICB2YXIga2V5d29yZHMgPSBtYWtlS2V5d29yZHMoCiAgICAgICJkZWZuIGRlZm4tIGRlZiBkZWYtIGRlZm9uY2UgZGVmbXVsdGkgZGVmbWV0aG9kIGRlZm1hY3JvIGRlZnN0cnVjdCBkZWZ0eXBlIGRlZnByb3RvY29sIGRlZnJlY29yZCBkZWZwcm9qZWN0IGRlZnRlc3QgIiArCiAgICAgICJzbGljZSBkZWZhbGlhcyBkZWZoaW50ZWQgZGVmbWFjcm8tIGRlZm4tbWVtbyBkZWZuayBkZWZuayBkZWZvbmNlLSBkZWZ1bmJvdW5kIGRlZnVuYm91bmQtIGRlZnZhciBkZWZ2YXItIGxldCBsZXRmbiAiICsKICAgICAgImRvIGNhc2UgY29uZCBjb25kcCBmb3IgbG9vcCByZWN1ciB3aGVuIHdoZW4tbm90IHdoZW4tbGV0IHdoZW4tZmlyc3QgaWYgaWYtbGV0IGlmLW5vdCAuIC4uIC0+IC0+PiBkb3RvIGFuZCBvciBkb3N5bmMgIiArCiAgICAgICJkb3NlcSBkb3RpbWVzIGRvcnVuIGRvYWxsIGxvYWQgaW1wb3J0IHVuaW1wb3J0IG5zIGluLW5zIHJlZmVyIHRyeSBjYXRjaCBmaW5hbGx5IHRocm93IHdpdGgtb3BlbiB3aXRoLWxvY2FsLXZhcnMgIiArCiAgICAgICJiaW5kaW5nIGdlbi1jbGFzcyBnZW4tYW5kLWxvYWQtY2xhc3MgZ2VuLWFuZC1zYXZlLWNsYXNzIGhhbmRsZXItY2FzZSBoYW5kbGUiKTsKCiAgICB2YXIgYnVpbHRpbnMgPSBtYWtlS2V5d29yZHMoCiAgICAgICAgIiogKicgKjEgKjIgKjMgKmFnZW50KiAqYWxsb3ctdW5yZXNvbHZlZC12YXJzKiAqYXNzZXJ0KiAqY2xvanVyZS12ZXJzaW9uKiAqY29tbWFuZC1saW5lLWFyZ3MqICpjb21waWxlLWZpbGVzKiAiICsKICAgICAgICAiKmNvbXBpbGUtcGF0aCogKmNvbXBpbGVyLW9wdGlvbnMqICpkYXRhLXJlYWRlcnMqICplICplcnIqICpmaWxlKiAqZmx1c2gtb24tbmV3bGluZSogKmZuLWxvYWRlciogKmluKiAiICsKICAgICAgICAiKm1hdGgtY29udGV4dCogKm5zKiAqb3V0KiAqcHJpbnQtZHVwKiAqcHJpbnQtbGVuZ3RoKiAqcHJpbnQtbGV2ZWwqICpwcmludC1tZXRhKiAqcHJpbnQtcmVhZGFibHkqICpyZWFkLWV2YWwqICIgKwogICAgICAgICIqc291cmNlLXBhdGgqICp1bmNoZWNrZWQtbWF0aCogKnVzZS1jb250ZXh0LWNsYXNzbG9hZGVyKiAqdmVyYm9zZS1kZWZyZWNvcmRzKiAqd2Fybi1vbi1yZWZsZWN0aW9uKiArICsnIC0gLScgLT4gIiArCiAgICAgICAgIi0+PiAtPkFycmF5Q2h1bmsgLT5WZWMgLT5WZWNOb2RlIC0+VmVjU2VxIC1jYWNoZS1wcm90b2NvbC1mbiAtcmVzZXQtbWV0aG9kcyAuLiAvIDwgPD0gPSA9PSA+ID49IEVNUFRZLU5PREUgYWNjZXNzb3IgIiArCiAgICAgICAgImFjbG9uZSBhZGQtY2xhc3NwYXRoIGFkZC13YXRjaCBhZ2VudCBhZ2VudC1lcnJvciBhZ2VudC1lcnJvcnMgYWdldCBhbGVuZ3RoIGFsaWFzIGFsbC1ucyBhbHRlciBhbHRlci1tZXRhISAiICsKICAgICAgICAiYWx0ZXItdmFyLXJvb3QgYW1hcCBhbmNlc3RvcnMgYW5kIGFwcGx5IGFyZWR1Y2UgYXJyYXktbWFwIGFzZXQgYXNldC1ib29sZWFuIGFzZXQtYnl0ZSBhc2V0LWNoYXIgYXNldC1kb3VibGUgIiArCiAgICAgICAgImFzZXQtZmxvYXQgYXNldC1pbnQgYXNldC1sb25nIGFzZXQtc2hvcnQgYXNzZXJ0IGFzc29jIGFzc29jISBhc3NvYy1pbiBhc3NvY2lhdGl2ZT8gYXRvbSBhd2FpdCBhd2FpdC1mb3IgYXdhaXQxICIgKwogICAgICAgICJiYXNlcyBiZWFuIGJpZ2RlYyBiaWdpbnQgYmlnaW50ZWdlciBiaW5kaW5nIGJpdC1hbmQgYml0LWFuZC1ub3QgYml0LWNsZWFyIGJpdC1mbGlwIGJpdC1ub3QgYml0LW9yIGJpdC1zZXQgIiArCiAgICAgICAgImJpdC1zaGlmdC1sZWZ0IGJpdC1zaGlmdC1yaWdodCBiaXQtdGVzdCBiaXQteG9yIGJvb2xlYW4gYm9vbGVhbi1hcnJheSBib29sZWFucyBib3VuZC1mbiBib3VuZC1mbiogYm91bmQ/IGJ1dGxhc3QgIiArCiAgICAgICAgImJ5dGUgYnl0ZS1hcnJheSBieXRlcyBjYXNlIGNhdCBjYXN0IGNoYXIgY2hhci1hcnJheSBjaGFyLWVzY2FwZS1zdHJpbmcgY2hhci1uYW1lLXN0cmluZyBjaGFyPyBjaGFycyBjaHVuayBjaHVuay1hcHBlbmQgIiArCiAgICAgICAgImNodW5rLWJ1ZmZlciBjaHVuay1jb25zIGNodW5rLWZpcnN0IGNodW5rLW5leHQgY2h1bmstcmVzdCBjaHVua2VkLXNlcT8gY2xhc3MgY2xhc3M/IGNsZWFyLWFnZW50LWVycm9ycyAiICsKICAgICAgICAiY2xvanVyZS12ZXJzaW9uIGNvbGw/IGNvbW1lbnQgY29tbXV0ZSBjb21wIGNvbXBhcmF0b3IgY29tcGFyZSBjb21wYXJlLWFuZC1zZXQhIGNvbXBpbGUgY29tcGxlbWVudCBjb21wbGV0aW5nIGNvbmNhdCBjb25kIGNvbmRwICIgKwogICAgICAgICJjb25qIGNvbmohIGNvbnMgY29uc3RhbnRseSBjb25zdHJ1Y3QtcHJveHkgY29udGFpbnM/IGNvdW50IGNvdW50ZWQ/IGNyZWF0ZS1ucyBjcmVhdGUtc3RydWN0IGN5Y2xlIGRlYyBkZWMnIGRlY2ltYWw/ICIgKwogICAgICAgICJkZWNsYXJlIGRlZHVwZSBkZWZhdWx0LWRhdGEtcmVhZGVycyBkZWZpbmxpbmUgZGVmaW50ZXJmYWNlIGRlZm1hY3JvIGRlZm1ldGhvZCBkZWZtdWx0aSBkZWZuIGRlZm4tIGRlZm9uY2UgZGVmcHJvdG9jb2wgIiArCiAgICAgICAgImRlZnJlY29yZCBkZWZzdHJ1Y3QgZGVmdHlwZSBkZWxheSBkZWxheT8gZGVsaXZlciBkZW5vbWluYXRvciBkZXJlZiBkZXJpdmUgZGVzY2VuZGFudHMgZGVzdHJ1Y3R1cmUgZGlzaiBkaXNqISBkaXNzb2MgIiArCiAgICAgICAgImRpc3NvYyEgZGlzdGluY3QgZGlzdGluY3Q/IGRvYWxsIGRvcnVuIGRvc2VxIGRvc3luYyBkb3RpbWVzIGRvdG8gZG91YmxlIGRvdWJsZS1hcnJheSBkb3VibGVzIGRyb3AgZHJvcC1sYXN0ICIgKwogICAgICAgICJkcm9wLXdoaWxlIGVkdWN0aW9uIGVtcHR5IGVtcHR5PyBlbnN1cmUgZW51bWVyYXRpb24tc2VxIGVycm9yLWhhbmRsZXIgZXJyb3ItbW9kZSBldmFsIGV2ZW4/IGV2ZXJ5LXByZWQgZXZlcnk/IGV4LWRhdGEgZXgtaW5mbyAiICsKICAgICAgICAiZXh0ZW5kIGV4dGVuZC1wcm90b2NvbCBleHRlbmQtdHlwZSBleHRlbmRlcnMgZXh0ZW5kcz8gZmFsc2U/IGZmaXJzdCBmaWxlLXNlcSBmaWx0ZXIgZmlsdGVydiBmaW5kIGZpbmQta2V5d29yZCAiICsKICAgICAgICAiZmluZC1ucyBmaW5kLXByb3RvY29sLWltcGwgZmluZC1wcm90b2NvbC1tZXRob2QgZmluZC12YXIgZmlyc3QgZmxhdHRlbiBmbG9hdCBmbG9hdC1hcnJheSBmbG9hdD8gZmxvYXRzIGZsdXNoIGZuIGZuPyAiICsKICAgICAgICAiZm5leHQgZm5pbCBmb3IgZm9yY2UgZm9ybWF0IGZyZXF1ZW5jaWVzIGZ1dHVyZSBmdXR1cmUtY2FsbCBmdXR1cmUtY2FuY2VsIGZ1dHVyZS1jYW5jZWxsZWQ/IGZ1dHVyZS1kb25lPyBmdXR1cmU/ICIgKwogICAgICAgICJnZW4tY2xhc3MgZ2VuLWludGVyZmFjZSBnZW5zeW0gZ2V0IGdldC1pbiBnZXQtbWV0aG9kIGdldC1wcm94eS1jbGFzcyBnZXQtdGhyZWFkLWJpbmRpbmdzIGdldC12YWxpZGF0b3IgZ3JvdXAtYnkgaGFzaCAiICsKICAgICAgICAiaGFzaC1jb21iaW5lIGhhc2gtbWFwIGhhc2gtc2V0IGlkZW50aWNhbD8gaWRlbnRpdHkgaWYtbGV0IGlmLW5vdCBpZm4/IGltcG9ydCBpbi1ucyBpbmMgaW5jJyBpbml0LXByb3h5IGluc3RhbmNlPyAiICsKICAgICAgICAiaW50IGludC1hcnJheSBpbnRlZ2VyPyBpbnRlcmxlYXZlIGludGVybiBpbnRlcnBvc2UgaW50byBpbnRvLWFycmF5IGludHMgaW8hIGlzYT8gaXRlcmF0ZSBpdGVyYXRvci1zZXEganV4dCBrZWVwICIgKwogICAgICAgICJrZWVwLWluZGV4ZWQga2V5IGtleXMga2V5d29yZCBrZXl3b3JkPyBsYXN0IGxhenktY2F0IGxhenktc2VxIGxldCBsZXRmbiBsaW5lLXNlcSBsaXN0IGxpc3QqIGxpc3Q/IGxvYWQgbG9hZC1maWxlICIgKwogICAgICAgICJsb2FkLXJlYWRlciBsb2FkLXN0cmluZyBsb2FkZWQtbGlicyBsb2NraW5nIGxvbmcgbG9uZy1hcnJheSBsb25ncyBsb29wIG1hY3JvZXhwYW5kIG1hY3JvZXhwYW5kLTEgbWFrZS1hcnJheSAiICsKICAgICAgICAibWFrZS1oaWVyYXJjaHkgbWFwIG1hcC1pbmRleGVkIG1hcD8gbWFwY2F0IG1hcHYgbWF4IG1heC1rZXkgbWVtZm4gbWVtb2l6ZSBtZXJnZSBtZXJnZS13aXRoIG1ldGEgbWV0aG9kLXNpZyBtZXRob2RzICIgKwogICAgICAgICJtaW4gbWluLWtleSBtb2QgbXVuZ2UgbmFtZSBuYW1lc3BhY2UgbmFtZXNwYWNlLW11bmdlIG5lZz8gbmV3bGluZSBuZXh0IG5maXJzdCBuaWw/IG5uZXh0IG5vdCBub3QtYW55PyBub3QtZW1wdHkgIiArCiAgICAgICAgIm5vdC1ldmVyeT8gbm90PSBucyBucy1hbGlhc2VzIG5zLWltcG9ydHMgbnMtaW50ZXJucyBucy1tYXAgbnMtbmFtZSBucy1wdWJsaWNzIG5zLXJlZmVycyBucy1yZXNvbHZlIG5zLXVuYWxpYXMgIiArCiAgICAgICAgIm5zLXVubWFwIG50aCBudGhuZXh0IG50aHJlc3QgbnVtIG51bWJlcj8gbnVtZXJhdG9yIG9iamVjdC1hcnJheSBvZGQ/IG9yIHBhcmVudHMgcGFydGlhbCBwYXJ0aXRpb24gcGFydGl0aW9uLWFsbCAiICsKICAgICAgICAicGFydGl0aW9uLWJ5IHBjYWxscyBwZWVrIHBlcnNpc3RlbnQhIHBtYXAgcG9wIHBvcCEgcG9wLXRocmVhZC1iaW5kaW5ncyBwb3M/IHByIHByLXN0ciBwcmVmZXItbWV0aG9kIHByZWZlcnMgIiArCiAgICAgICAgInByaW1pdGl2ZXMtY2xhc3NuYW1lcyBwcmludCBwcmludC1jdG9yIHByaW50LWR1cCBwcmludC1tZXRob2QgcHJpbnQtc2ltcGxlIHByaW50LXN0ciBwcmludGYgcHJpbnRsbiBwcmludGxuLXN0ciAiICsKICAgICAgICAicHJuIHBybi1zdHIgcHJvbWlzZSBwcm94eSBwcm94eS1jYWxsLXdpdGgtc3VwZXIgcHJveHktbWFwcGluZ3MgcHJveHktbmFtZSBwcm94eS1zdXBlciBwdXNoLXRocmVhZC1iaW5kaW5ncyBwdmFsdWVzICIgKwogICAgICAgICJxdW90IHJhbmQgcmFuZC1pbnQgcmFuZC1udGggcmFuZG9tLXNhbXBsZSByYW5nZSByYXRpbz8gcmF0aW9uYWw/IHJhdGlvbmFsaXplIHJlLWZpbmQgcmUtZ3JvdXBzIHJlLW1hdGNoZXIgcmUtbWF0Y2hlcyByZS1wYXR0ZXJuICIgKwogICAgICAgICJyZS1zZXEgcmVhZCByZWFkLWxpbmUgcmVhZC1zdHJpbmcgcmVhbGl6ZWQ/IHJlZHVjZSByZWR1Y2Uta3YgcmVkdWN0aW9ucyByZWYgcmVmLWhpc3RvcnktY291bnQgcmVmLW1heC1oaXN0b3J5ICIgKwogICAgICAgICJyZWYtbWluLWhpc3RvcnkgcmVmLXNldCByZWZlciByZWZlci1jbG9qdXJlIHJlaWZ5IHJlbGVhc2UtcGVuZGluZy1zZW5kcyByZW0gcmVtb3ZlIHJlbW92ZS1hbGwtbWV0aG9kcyAiICsKICAgICAgICAicmVtb3ZlLW1ldGhvZCByZW1vdmUtbnMgcmVtb3ZlLXdhdGNoIHJlcGVhdCByZXBlYXRlZGx5IHJlcGxhY2UgcmVwbGljYXRlIHJlcXVpcmUgcmVzZXQhIHJlc2V0LW1ldGEhIHJlc29sdmUgcmVzdCAiICsKICAgICAgICAicmVzdGFydC1hZ2VudCByZXN1bHRzZXQtc2VxIHJldmVyc2UgcmV2ZXJzaWJsZT8gcnNlcSByc3Vic2VxIHNhdGlzZmllcz8gc2Vjb25kIHNlbGVjdC1rZXlzIHNlbmQgc2VuZC1vZmYgc2VxIHNlcT8gIiArCiAgICAgICAgInNlcXVlIHNlcXVlbmNlIHNlcXVlbnRpYWw/IHNldCBzZXQtZXJyb3ItaGFuZGxlciEgc2V0LWVycm9yLW1vZGUhIHNldC12YWxpZGF0b3IhIHNldD8gc2hvcnQgc2hvcnQtYXJyYXkgc2hvcnRzICIgKwogICAgICAgICJzaHVmZmxlIHNodXRkb3duLWFnZW50cyBzbHVycCBzb21lIHNvbWUtZm4gc29ydCBzb3J0LWJ5IHNvcnRlZC1tYXAgc29ydGVkLW1hcC1ieSBzb3J0ZWQtc2V0IHNvcnRlZC1zZXQtYnkgc29ydGVkPyAiICsKICAgICAgICAic3BlY2lhbC1zeW1ib2w/IHNwaXQgc3BsaXQtYXQgc3BsaXQtd2l0aCBzdHIgc3RyaW5nPyBzdHJ1Y3Qgc3RydWN0LW1hcCBzdWJzIHN1YnNlcSBzdWJ2ZWMgc3VwZXJzIHN3YXAhIHN5bWJvbCAiICsKICAgICAgICAic3ltYm9sPyBzeW5jIHRha2UgdGFrZS1sYXN0IHRha2UtbnRoIHRha2Utd2hpbGUgdGVzdCB0aGUtbnMgdGhyZWFkLWJvdW5kPyB0aW1lIHRvLWFycmF5IHRvLWFycmF5LTJkIHRyYW1wb2xpbmUgdHJhbnNkdWNlICIgKwogICAgICAgICJ0cmFuc2llbnQgdHJlZS1zZXEgdHJ1ZT8gdHlwZSB1bmNoZWNrZWQtYWRkIHVuY2hlY2tlZC1hZGQtaW50IHVuY2hlY2tlZC1ieXRlIHVuY2hlY2tlZC1jaGFyIHVuY2hlY2tlZC1kZWMgIiArCiAgICAgICAgInVuY2hlY2tlZC1kZWMtaW50IHVuY2hlY2tlZC1kaXZpZGUtaW50IHVuY2hlY2tlZC1kb3VibGUgdW5jaGVja2VkLWZsb2F0IHVuY2hlY2tlZC1pbmMgdW5jaGVja2VkLWluYy1pbnQgIiArCiAgICAgICAgInVuY2hlY2tlZC1pbnQgdW5jaGVja2VkLWxvbmcgdW5jaGVja2VkLW11bHRpcGx5IHVuY2hlY2tlZC1tdWx0aXBseS1pbnQgdW5jaGVja2VkLW5lZ2F0ZSB1bmNoZWNrZWQtbmVnYXRlLWludCAiKwogICAgICAgICJ1bmNoZWNrZWQtcmVtYWluZGVyLWludCB1bmNoZWNrZWQtc2hvcnQgdW5jaGVja2VkLXN1YnRyYWN0IHVuY2hlY2tlZC1zdWJ0cmFjdC1pbnQgdW5kZXJpdmUgdW5xdW90ZSAiICsKICAgICAgICAidW5xdW90ZS1zcGxpY2luZyB1cGRhdGUgdXBkYXRlLWluIHVwZGF0ZS1wcm94eSB1c2UgdmFsIHZhbHMgdmFyLWdldCB2YXItc2V0IHZhcj8gdmFyeS1tZXRhIHZlYyB2ZWN0b3IgdmVjdG9yLW9mICIgKwogICAgICAgICJ2ZWN0b3I/IHZvbGF0aWxlISB2b2xhdGlsZT8gdnJlc2V0ISB2c3dhcCEgd2hlbiB3aGVuLWZpcnN0IHdoZW4tbGV0IHdoZW4tbm90IHdoaWxlIHdpdGgtYmluZGluZ3Mgd2l0aC1iaW5kaW5ncyogd2l0aC1pbi1zdHIgd2l0aC1sb2FkaW5nLWNvbnRleHQgIiArCiAgICAgICAgIndpdGgtbG9jYWwtdmFycyB3aXRoLW1ldGEgd2l0aC1vcGVuIHdpdGgtb3V0LXN0ciB3aXRoLXByZWNpc2lvbiB3aXRoLXJlZGVmcyB3aXRoLXJlZGVmcy1mbiB4bWwtc2VxIHplcm8/IHppcG1hcCAiICsKICAgICAgICAiKmRlZmF1bHQtZGF0YS1yZWFkZXItZm4qIGFzLT4gY29uZC0+IGNvbmQtPj4gcmVkdWNlZCByZWR1Y2VkPyBzZW5kLXZpYSBzZXQtYWdlbnQtc2VuZC1leGVjdXRvciEgIiArCiAgICAgICAgInNldC1hZ2VudC1zZW5kLW9mZi1leGVjdXRvciEgc29tZS0+IHNvbWUtPj4iKTsKCiAgICB2YXIgaW5kZW50S2V5cyA9IG1ha2VLZXl3b3JkcygKICAgICAgICAvLyBCdWlsdC1pbnMKICAgICAgICAibnMgZm4gZGVmIGRlZm4gZGVmbWV0aG9kIGJvdW5kLWZuIGlmIGlmLW5vdCBjYXNlIGNvbmRwIHdoZW4gd2hpbGUgd2hlbi1ub3Qgd2hlbi1maXJzdCBkbyBmdXR1cmUgY29tbWVudCBkb3RvICIgKwogICAgICAgICJsb2NraW5nIHByb3h5IHdpdGgtb3BlbiB3aXRoLXByZWNpc2lvbiByZWlmeSBkZWZ0eXBlIGRlZnJlY29yZCBkZWZwcm90b2NvbCBleHRlbmQgZXh0ZW5kLXByb3RvY29sIGV4dGVuZC10eXBlICIgKwogICAgICAgICJ0cnkgY2F0Y2ggIiArCgogICAgICAgIC8vIEJpbmRpbmcgZm9ybXMKICAgICAgICAibGV0IGxldGZuIGJpbmRpbmcgbG9vcCBmb3IgZG9zZXEgZG90aW1lcyB3aGVuLWxldCBpZi1sZXQgIiArCgogICAgICAgIC8vIERhdGEgc3RydWN0dXJlcwogICAgICAgICJkZWZzdHJ1Y3Qgc3RydWN0LW1hcCBhc3NvYyAiICsKCiAgICAgICAgLy8gY2xvanVyZS50ZXN0CiAgICAgICAgInRlc3RpbmcgZGVmdGVzdCAiICsKCiAgICAgICAgLy8gY29udHJpYgogICAgICAgICJoYW5kbGVyLWNhc2UgaGFuZGxlIGRvdHJhY2UgZGVmdHJhY2UiKTsKCiAgICB2YXIgdGVzdHMgPSB7CiAgICAgICAgZGlnaXQ6IC9cZC8sCiAgICAgICAgZGlnaXRfb3JfY29sb246IC9bXGQ6XS8sCiAgICAgICAgaGV4OiAvWzAtOWEtZl0vaSwKICAgICAgICBzaWduOiAvWystXS8sCiAgICAgICAgZXhwb25lbnQ6IC9lL2ksCiAgICAgICAga2V5d29yZF9jaGFyOiAvW15cc1woXFtcO1wpXF1dLywKICAgICAgICBzeW1ib2w6IC9bXHcqKyFcLVwuXz86PD5cL1x4YTEtXHVmZmZmXS8sCiAgICAgICAgYmxvY2tfaW5kZW50OiAvXig/OmRlZnx3aXRoKVteXC9dKyR8XC8oPzpkZWZ8d2l0aCkvCiAgICB9OwoKICAgIGZ1bmN0aW9uIHN0YXRlU3RhY2soaW5kZW50LCB0eXBlLCBwcmV2KSB7IC8vIHJlcHJlc2VudHMgYSBzdGF0ZSBzdGFjayBvYmplY3QKICAgICAgICB0aGlzLmluZGVudCA9IGluZGVudDsKICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwogICAgICAgIHRoaXMucHJldiA9IHByZXY7CiAgICB9CgogICAgZnVuY3Rpb24gcHVzaFN0YWNrKHN0YXRlLCBpbmRlbnQsIHR5cGUpIHsKICAgICAgICBzdGF0ZS5pbmRlbnRTdGFjayA9IG5ldyBzdGF0ZVN0YWNrKGluZGVudCwgdHlwZSwgc3RhdGUuaW5kZW50U3RhY2spOwogICAgfQoKICAgIGZ1bmN0aW9uIHBvcFN0YWNrKHN0YXRlKSB7CiAgICAgICAgc3RhdGUuaW5kZW50U3RhY2sgPSBzdGF0ZS5pbmRlbnRTdGFjay5wcmV2OwogICAgfQoKICAgIGZ1bmN0aW9uIGlzTnVtYmVyKGNoLCBzdHJlYW0pewogICAgICAgIC8vIGhleAogICAgICAgIGlmICggY2ggPT09ICcwJyAmJiBzdHJlYW0uZWF0KC94L2kpICkgewogICAgICAgICAgICBzdHJlYW0uZWF0V2hpbGUodGVzdHMuaGV4KTsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICAvLyBsZWFkaW5nIHNpZ24KICAgICAgICBpZiAoICggY2ggPT0gJysnIHx8IGNoID09ICctJyApICYmICggdGVzdHMuZGlnaXQudGVzdChzdHJlYW0ucGVlaygpKSApICkgewogICAgICAgICAgc3RyZWFtLmVhdCh0ZXN0cy5zaWduKTsKICAgICAgICAgIGNoID0gc3RyZWFtLm5leHQoKTsKICAgICAgICB9CgogICAgICAgIGlmICggdGVzdHMuZGlnaXQudGVzdChjaCkgKSB7CiAgICAgICAgICAgIHN0cmVhbS5lYXQoY2gpOwogICAgICAgICAgICBzdHJlYW0uZWF0V2hpbGUodGVzdHMuZGlnaXQpOwoKICAgICAgICAgICAgaWYgKCAnLicgPT0gc3RyZWFtLnBlZWsoKSApIHsKICAgICAgICAgICAgICAgIHN0cmVhbS5lYXQoJy4nKTsKICAgICAgICAgICAgICAgIHN0cmVhbS5lYXRXaGlsZSh0ZXN0cy5kaWdpdCk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoJy8nID09IHN0cmVhbS5wZWVrKCkgKSB7CiAgICAgICAgICAgICAgICBzdHJlYW0uZWF0KCcvJyk7CiAgICAgICAgICAgICAgICBzdHJlYW0uZWF0V2hpbGUodGVzdHMuZGlnaXQpOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIHN0cmVhbS5lYXQodGVzdHMuZXhwb25lbnQpICkgewogICAgICAgICAgICAgICAgc3RyZWFtLmVhdCh0ZXN0cy5zaWduKTsKICAgICAgICAgICAgICAgIHN0cmVhbS5lYXRXaGlsZSh0ZXN0cy5kaWdpdCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8vIEVhdCBjaGFyYWN0ZXIgdGhhdCBzdGFydHMgYWZ0ZXIgYmFja3NsYXNoIFwKICAgIGZ1bmN0aW9uIGVhdENoYXJhY3RlcihzdHJlYW0pIHsKICAgICAgICB2YXIgZmlyc3QgPSBzdHJlYW0ubmV4dCgpOwogICAgICAgIC8vIFJlYWQgc3BlY2lhbCBsaXRlcmFsczogYmFja3NwYWNlLCBuZXdsaW5lLCBzcGFjZSwgcmV0dXJuLgogICAgICAgIC8vIEp1c3QgcmVhZCBhbGwgbG93ZXJjYXNlIGxldHRlcnMuCiAgICAgICAgaWYgKGZpcnN0ICYmIGZpcnN0Lm1hdGNoKC9bYS16XS8pICYmIHN0cmVhbS5tYXRjaCgvW2Etel0rLywgdHJ1ZSkpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAvLyBSZWFkIHVuaWNvZGUgY2hhcmFjdGVyOiBcdTEwMDAgXHVBMGExCiAgICAgICAgaWYgKGZpcnN0ID09PSAidSIpIHsKICAgICAgICAgICAgc3RyZWFtLm1hdGNoKC9bMC05YS16XXs0fS9pLCB0cnVlKTsKICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIHsKICAgICAgICBzdGFydFN0YXRlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBpbmRlbnRTdGFjazogbnVsbCwKICAgICAgICAgICAgICAgIGluZGVudGF0aW9uOiAwLAogICAgICAgICAgICAgICAgbW9kZTogZmFsc2UKICAgICAgICAgICAgfTsKICAgICAgICB9LAoKICAgICAgICB0b2tlbjogZnVuY3Rpb24gKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgICAgICAgaWYgKHN0YXRlLmluZGVudFN0YWNrID09IG51bGwgJiYgc3RyZWFtLnNvbCgpKSB7CiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgaW5kZW50YXRpb24sIGJ1dCBvbmx5IGlmIGluZGVudFN0YWNrIGlzIGVtcHR5CiAgICAgICAgICAgICAgICBzdGF0ZS5pbmRlbnRhdGlvbiA9IHN0cmVhbS5pbmRlbnRhdGlvbigpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBza2lwIHNwYWNlcwogICAgICAgICAgICBpZiAoc3RhdGUubW9kZSAhPSAic3RyaW5nIiAmJiBzdHJlYW0uZWF0U3BhY2UoKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHJldHVyblR5cGUgPSBudWxsOwoKICAgICAgICAgICAgc3dpdGNoKHN0YXRlLm1vZGUpewogICAgICAgICAgICAgICAgY2FzZSAic3RyaW5nIjogLy8gbXVsdGktbGluZSBzdHJpbmcgcGFyc2luZyBtb2RlCiAgICAgICAgICAgICAgICAgICAgdmFyIG5leHQsIGVzY2FwZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKG5leHQgPSBzdHJlYW0ubmV4dCgpKSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0ID09ICJcIiIgJiYgIWVzY2FwZWQpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlc2NhcGVkID0gIWVzY2FwZWQgJiYgbmV4dCA9PSAiXFwiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm5UeXBlID0gU1RSSU5HOyAvLyBjb250aW51ZSBvbiBpbiBzdHJpbmcgbW9kZQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgZGVmYXVsdDogLy8gZGVmYXVsdCBwYXJzaW5nIG1vZGUKICAgICAgICAgICAgICAgICAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gIlwiIikgewogICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gInN0cmluZyI7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblR5cGUgPSBTVFJJTkc7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAiXFwiKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVhdENoYXJhY3RlcihzdHJlYW0pOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5UeXBlID0gQ0hBUkFDVEVSOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gIiciICYmICEoIHRlc3RzLmRpZ2l0X29yX2NvbG9uLnRlc3Qoc3RyZWFtLnBlZWsoKSkgKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5UeXBlID0gQVRPTTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICI7IikgeyAvLyBjb21tZW50CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsgLy8gcmVzdCBvZiB0aGUgbGluZSBpcyBhIGNvbW1lbnQKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVHlwZSA9IENPTU1FTlQ7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc051bWJlcihjaCxzdHJlYW0pKXsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVHlwZSA9IE5VTUJFUjsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICIoIiB8fCBjaCA9PSAiWyIgfHwgY2ggPT0gInsiICkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIga2V5V29yZCA9ICcnLCBpbmRlbnRUZW1wID0gc3RyZWFtLmNvbHVtbigpLCBsZXR0ZXI7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICAgICAgICAgICBFaXRoZXIKICAgICAgICAgICAgICAgICAgICAgICAgKGluZGVudC13b3JkIC4uCiAgICAgICAgICAgICAgICAgICAgICAgIChub24taW5kZW50LXdvcmQgLi4KICAgICAgICAgICAgICAgICAgICAgICAgKDtzb21ldGhpbmcgZWxzZSwgYnJhY2tldCwgZXRjLgogICAgICAgICAgICAgICAgICAgICAgICAqLwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNoID09ICIoIikgd2hpbGUgKChsZXR0ZXIgPSBzdHJlYW0uZWF0KHRlc3RzLmtleXdvcmRfY2hhcikpICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleVdvcmQgKz0gbGV0dGVyOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoa2V5V29yZC5sZW5ndGggPiAwICYmIChpbmRlbnRLZXlzLnByb3BlcnR5SXNFbnVtZXJhYmxlKGtleVdvcmQpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3RzLmJsb2NrX2luZGVudC50ZXN0KGtleVdvcmQpKSkgeyAvLyBpbmRlbnQtd29yZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaFN0YWNrKHN0YXRlLCBpbmRlbnRUZW1wICsgSU5ERU5UX1dPUkRfU0tJUCwgY2gpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyBub24taW5kZW50IHdvcmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGNvbnRpbnVlIGVhdGluZyB0aGUgc3BhY2VzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0uZWF0U3BhY2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW0uZW9sKCkgfHwgc3RyZWFtLnBlZWsoKSA9PSAiOyIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub3RoaW5nIHNpZ25pZmljYW50IGFmdGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgcmVzdGFydCBpbmRlbnRhdGlvbiB0aGUgdXNlciBkZWZpbmVkIHNwYWNlcyBhZnRlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2hTdGFjayhzdGF0ZSwgaW5kZW50VGVtcCArIE5PUk1BTF9JTkRFTlRfVU5JVCwgY2gpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoU3RhY2soc3RhdGUsIGluZGVudFRlbXAgKyBzdHJlYW0uY3VycmVudCgpLmxlbmd0aCwgY2gpOyAvLyBlbHNlIHdlIG1hdGNoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLmJhY2tVcChzdHJlYW0uY3VycmVudCgpLmxlbmd0aCAtIDEpOyAvLyB1bmRvIGFsbCB0aGUgZWF0aW5nCgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5UeXBlID0gQlJBQ0tFVDsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICIpIiB8fCBjaCA9PSAiXSIgfHwgY2ggPT0gIn0iKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblR5cGUgPSBCUkFDS0VUOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuaW5kZW50U3RhY2sgIT0gbnVsbCAmJiBzdGF0ZS5pbmRlbnRTdGFjay50eXBlID09IChjaCA9PSAiKSIgPyAiKCIgOiAoY2ggPT0gIl0iID8gIlsiIDoieyIpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9wU3RhY2soc3RhdGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICggY2ggPT0gIjoiICkgewogICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0uZWF0V2hpbGUodGVzdHMuc3ltYm9sKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFUT007CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLmVhdFdoaWxlKHRlc3RzLnN5bWJvbCk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoa2V5d29yZHMgJiYga2V5d29yZHMucHJvcGVydHlJc0VudW1lcmFibGUoc3RyZWFtLmN1cnJlbnQoKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblR5cGUgPSBLRVlXT1JEOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGJ1aWx0aW5zICYmIGJ1aWx0aW5zLnByb3BlcnR5SXNFbnVtZXJhYmxlKHN0cmVhbS5jdXJyZW50KCkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5UeXBlID0gQlVJTFRJTjsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChhdG9tcyAmJiBhdG9tcy5wcm9wZXJ0eUlzRW51bWVyYWJsZShzdHJlYW0uY3VycmVudCgpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVHlwZSA9IEFUT007CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVHlwZSA9IFZBUjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIHJldHVyblR5cGU7CiAgICAgICAgfSwKCiAgICAgICAgaW5kZW50OiBmdW5jdGlvbiAoc3RhdGUpIHsKICAgICAgICAgICAgaWYgKHN0YXRlLmluZGVudFN0YWNrID09IG51bGwpIHJldHVybiBzdGF0ZS5pbmRlbnRhdGlvbjsKICAgICAgICAgICAgcmV0dXJuIHN0YXRlLmluZGVudFN0YWNrLmluZGVudDsKICAgICAgICB9LAoKICAgICAgICBjbG9zZUJyYWNrZXRzOiB7cGFpcnM6ICIoKVtde31cIlwiIn0sCiAgICAgICAgbGluZUNvbW1lbnQ6ICI7OyIKICAgIH07Cn0pOwoKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtY2xvanVyZSIsICJjbG9qdXJlIik7CkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC94LWNsb2p1cmVzY3JpcHQiLCAiY2xvanVyZSIpOwpDb2RlTWlycm9yLmRlZmluZU1JTUUoImFwcGxpY2F0aW9uL2VkbiIsICJjbG9qdXJlIik7Cgp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/clojure/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogQ2xvanVyZSBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9ImNsb2p1cmUuanMiPjwvc2NyaXB0Pgo8c3R5bGU+LkNvZGVNaXJyb3Ige2JhY2tncm91bmQ6ICNmOGY4Zjg7fTwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGgxPkNvZGVNaXJyb3I8L2gxPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5DbG9qdXJlPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5DbG9qdXJlIG1vZGU8L2gyPgo8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgo7IENvbndheSdzIEdhbWUgb2YgTGlmZSwgYmFzZWQgb24gdGhlIHdvcmsgb2Y6Cjs7IExhdXJlbnQgUGV0aXQgaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vMTIwMDM0Mwo7OyBDaHJpc3RvcGhlIEdyYW5kIGh0dHA6Ly9jbGotbWUuY2dyYW5kLm5ldC8yMDExLzA4LzE5L2NvbndheXMtZ2FtZS1vZi1saWZlCgoobnMgXns6ZG9jICJDb253YXkncyBHYW1lIG9mIExpZmUuIn0KIGdhbWUtb2YtbGlmZSkKCjs7IENvcmUgZ2FtZSBvZiBsaWZlJ3MgYWxnb3JpdGhtIGZ1bmN0aW9ucwoKKGRlZm4gbmVpZ2hib3VycwogICJHaXZlbiBhIGNlbGwncyBjb29yZGluYXRlcywgcmV0dXJucyB0aGUgY29vcmRpbmF0ZXMgb2YgaXRzIG5laWdoYm91cnMuIgogIFtbeCB5XV0KICAoZm9yIFtkeCBbLTEgMCAxXSBkeSAoaWYgKHplcm8/IGR4KSBbLTEgMV0gWy0xIDAgMV0pXQogICAgWygrIGR4IHgpICgrIGR5IHkpXSkpCgooZGVmbiBzdGVwCiAgIkdpdmVuIGEgc2V0IG9mIGxpdmluZyBjZWxscywgY29tcHV0ZXMgdGhlIG5ldyBzZXQgb2YgbGl2aW5nIGNlbGxzLiIKICBbY2VsbHNdCiAgKHNldCAoZm9yIFtbY2VsbCBuXSAoZnJlcXVlbmNpZXMgKG1hcGNhdCBuZWlnaGJvdXJzIGNlbGxzKSkKICAgICAgICAgICAgIDp3aGVuIChvciAoPSBuIDMpIChhbmQgKD0gbiAyKSAoY2VsbHMgY2VsbCkpKV0KICAgICAgICAgY2VsbCkpKQoKOzsgVXRpbGl0eSBtZXRob2RzIGZvciBkaXNwbGF5aW5nIGdhbWUgb24gYSB0ZXh0IHRlcm1pbmFsCgooZGVmbiBwcmludC1ib2FyZAogICJQcmludHMgYSBib2FyZCBvbiAqb3V0KiwgcmVwcmVzZW50aW5nIGEgc3RlcCBpbiB0aGUgZ2FtZS4iCiAgW2JvYXJkIHcgaF0KICAoZG9zZXEgW3ggKHJhbmdlIChpbmMgdykpIHkgKHJhbmdlIChpbmMgaCkpXQogICAgKGlmICg9IHkgMCkgKHByaW50ICJcbiIpKQogICAgKHByaW50IChpZiAoYm9hcmQgW3ggeV0pICJbWF0iICIgLiAiKSkpKQoKKGRlZm4gZGlzcGxheS1ncmlkcwogICJQcmludHMgYSBzcXVlbmNlIG9mIGJvYXJkcyBvbiAqb3V0KiwgcmVwcmVzZW50aW5nIHNldmVyYWwgc3RlcHMuIgogIFtncmlkcyB3IGhdCiAgKGRvc2VxIFtib2FyZCBncmlkc10KICAgIChwcmludC1ib2FyZCBib2FyZCB3IGgpCiAgICAocHJpbnQgIlxuIikpKQoKOzsgTGF1bmNoZXMgYW4gZXhhbXBsZSBib2FyZAoKKGRlZgogIF57OmRvYyAiYm9hcmQgcmVwcmVzZW50cyB0aGUgaW5pdGlhbCBzZXQgb2YgbGl2aW5nIGNlbGxzIn0KICAgYm9hcmQgI3tbMiAxXSBbMiAyXSBbMiAzXX0pCgooZGlzcGxheS1ncmlkcyAodGFrZSAzIChpdGVyYXRlIHN0ZXAgYm9hcmQpKSA1IDUpCgo7OyBMZXQncyBwbGF5IHdpdGggY2hhcmFjdGVycwoocHJpbnRsbiBcMSBcYSBcIyBcXAogICAgICAgICBcIiBcKCBcbmV3bGluZQogICAgICAgICBcfSBcIiBcc3BhY2UKICAgICAgICAgXHRhYiBccmV0dXJuIFxiYWNrc3BhY2UKICAgICAgICAgXHUxMDAwIFx1QWFBYSBcdTlGOUYpCgo7OyBMZXQncyBwbGF5IHdpdGggbnVtYmVycwooKyAxIC0xIDEvMiAtMS8yIC0wLjUgMC41KQoKPC90ZXh0YXJlYT48L2Zvcm0+CiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwge30pOwogICAgPC9zY3JpcHQ+CgogICAgPHA+PHN0cm9uZz5NSU1FIHR5cGVzIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPnRleHQveC1jbG9qdXJlPC9jb2RlPi48L3A+CgogIDwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/cmake/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/cmake/cmake.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpCiAgICBkZWZpbmUoWyIuLi8uLi9saWIvY29kZW1pcnJvciJdLCBtb2QpOwogIGVsc2UKICAgIG1vZChDb2RlTWlycm9yKTsKfSkoZnVuY3Rpb24oQ29kZU1pcnJvcikgewoidXNlIHN0cmljdCI7CgpDb2RlTWlycm9yLmRlZmluZU1vZGUoImNtYWtlIiwgZnVuY3Rpb24gKCkgewogIHZhciB2YXJpYWJsZV9yZWdleCA9IC8oeyk/W2EtekEtWjAtOV9dKyh9KT8vOwoKICBmdW5jdGlvbiB0b2tlblN0cmluZyhzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgY3VycmVudCwgcHJldiwgZm91bmRfdmFyID0gZmFsc2U7CiAgICB3aGlsZSAoIXN0cmVhbS5lb2woKSAmJiAoY3VycmVudCA9IHN0cmVhbS5uZXh0KCkpICE9IHN0YXRlLnBlbmRpbmcpIHsKICAgICAgaWYgKGN1cnJlbnQgPT09ICckJyAmJiBwcmV2ICE9ICdcXCcgJiYgc3RhdGUucGVuZGluZyA9PSAnIicpIHsKICAgICAgICBmb3VuZF92YXIgPSB0cnVlOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIHByZXYgPSBjdXJyZW50OwogICAgfQogICAgaWYgKGZvdW5kX3ZhcikgewogICAgICBzdHJlYW0uYmFja1VwKDEpOwogICAgfQogICAgaWYgKGN1cnJlbnQgPT0gc3RhdGUucGVuZGluZykgewogICAgICBzdGF0ZS5jb250aW51ZVN0cmluZyA9IGZhbHNlOwogICAgfSBlbHNlIHsKICAgICAgc3RhdGUuY29udGludWVTdHJpbmcgPSB0cnVlOwogICAgfQogICAgcmV0dXJuICJzdHJpbmciOwogIH0KCiAgZnVuY3Rpb24gdG9rZW5pemUoc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIGNoID0gc3RyZWFtLm5leHQoKTsKCiAgICAvLyBIYXZlIHdlIGZvdW5kIGEgdmFyaWFibGU/CiAgICBpZiAoY2ggPT09ICckJykgewogICAgICBpZiAoc3RyZWFtLm1hdGNoKHZhcmlhYmxlX3JlZ2V4KSkgewogICAgICAgIHJldHVybiAndmFyaWFibGUtMic7CiAgICAgIH0KICAgICAgcmV0dXJuICd2YXJpYWJsZSc7CiAgICB9CiAgICAvLyBTaG91bGQgd2Ugc3RpbGwgYmUgbG9va2luZyBmb3IgdGhlIGVuZCBvZiBhIHN0cmluZz8KICAgIGlmIChzdGF0ZS5jb250aW51ZVN0cmluZykgewogICAgICAvLyBJZiBzbywgZ28gdGhyb3VnaCB0aGUgbG9vcCBhZ2FpbgogICAgICBzdHJlYW0uYmFja1VwKDEpOwogICAgICByZXR1cm4gdG9rZW5TdHJpbmcoc3RyZWFtLCBzdGF0ZSk7CiAgICB9CiAgICAvLyBEbyB3ZSBqdXN0IGhhdmUgYSBmdW5jdGlvbiBvbiBvdXIgaGFuZHM/CiAgICAvLyBJbiAnY21ha2VfbWluaW11bV9yZXF1aXJlZCAoVkVSU0lPTiAyLjguOCknLCAnY21ha2VfbWluaW11bV9yZXF1aXJlZCcgaXMgbWF0Y2hlZAogICAgaWYgKHN0cmVhbS5tYXRjaCgvKFxzKyk/XHcrXCgvKSB8fCBzdHJlYW0ubWF0Y2goLyhccyspP1x3K1wgXCgvKSkgewogICAgICBzdHJlYW0uYmFja1VwKDEpOwogICAgICByZXR1cm4gJ2RlZic7CiAgICB9CiAgICBpZiAoY2ggPT0gIiMiKSB7CiAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgcmV0dXJuICJjb21tZW50IjsKICAgIH0KICAgIC8vIEhhdmUgd2UgZm91bmQgYSBzdHJpbmc/CiAgICBpZiAoY2ggPT0gIiciIHx8IGNoID09ICciJykgewogICAgICAvLyBTdG9yZSB0aGUgdHlwZSAoc2luZ2xlIG9yIGRvdWJsZSkKICAgICAgc3RhdGUucGVuZGluZyA9IGNoOwogICAgICAvLyBQZXJmb3JtIHRoZSBsb29waW5nIGZ1bmN0aW9uIHRvIGZpbmQgdGhlIGVuZAogICAgICByZXR1cm4gdG9rZW5TdHJpbmcoc3RyZWFtLCBzdGF0ZSk7CiAgICB9CiAgICBpZiAoY2ggPT0gJygnIHx8IGNoID09ICcpJykgewogICAgICByZXR1cm4gJ2JyYWNrZXQnOwogICAgfQogICAgaWYgKGNoLm1hdGNoKC9bMC05XS8pKSB7CiAgICAgIHJldHVybiAnbnVtYmVyJzsKICAgIH0KICAgIHN0cmVhbS5lYXRXaGlsZSgvW1x3LV0vKTsKICAgIHJldHVybiBudWxsOwogIH0KICByZXR1cm4gewogICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24gKCkgewogICAgICB2YXIgc3RhdGUgPSB7fTsKICAgICAgc3RhdGUuaW5EZWZpbml0aW9uID0gZmFsc2U7CiAgICAgIHN0YXRlLmluSW5jbHVkZSA9IGZhbHNlOwogICAgICBzdGF0ZS5jb250aW51ZVN0cmluZyA9IGZhbHNlOwogICAgICBzdGF0ZS5wZW5kaW5nID0gZmFsc2U7CiAgICAgIHJldHVybiBzdGF0ZTsKICAgIH0sCiAgICB0b2tlbjogZnVuY3Rpb24gKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgaWYgKHN0cmVhbS5lYXRTcGFjZSgpKSByZXR1cm4gbnVsbDsKICAgICAgcmV0dXJuIHRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgfQogIH07Cn0pOwoKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtY21ha2UiLCAiY21ha2UiKTsKCn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/cmake/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogQ01ha2UgbW9kZTwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uLy4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxzY3JpcHQgc3JjPSIuLi8uLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi8uLi9hZGRvbi9lZGl0L21hdGNoYnJhY2tldHMuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iY21ha2UuanMiPjwvc2NyaXB0Pgo8c3R5bGU+CiAgICAgIC5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazt9CiAgICAgIC5jbS1zLWRlZmF1bHQgc3Bhbi5jbS1hcnJvdyB7IGNvbG9yOiByZWQ7IH0KICAgIDwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGgxPkNvZGVNaXJyb3I8L2gxPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5DTWFrZTwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+Q01ha2UgbW9kZTwvaDI+Cjxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+CiMgdmltOiBzeW50YXg9Y21ha2UKaWYoTk9UIENNQUtFX0JVSUxEX1RZUEUpCiAgICAjIGRlZmF1bHQgdG8gUmVsZWFzZSBidWlsZCBmb3IgR0NDIGJ1aWxkcwogICAgc2V0KENNQUtFX0JVSUxEX1RZUEUgUmVsZWFzZSBDQUNIRSBTVFJJTkcKICAgICAgICAiQ2hvb3NlIHRoZSB0eXBlIG9mIGJ1aWxkLCBvcHRpb25zIGFyZTogTm9uZShDTUFLRV9DWFhfRkxBR1Mgb3IgQ01BS0VfQ19GTEFHUyB1c2VkKSBEZWJ1ZyBSZWxlYXNlIFJlbFdpdGhEZWJJbmZvIE1pblNpemVSZWwuIgogICAgICAgIEZPUkNFKQplbmRpZigpCm1lc3NhZ2UoU1RBVFVTICJjbWFrZSB2ZXJzaW9uICR7Q01BS0VfVkVSU0lPTn0iKQppZihQT0xJQ1kgQ01QMDAyNSkKICAgIGNtYWtlX3BvbGljeShTRVQgQ01QMDAyNSBPTEQpICMgcmVwb3J0IEFwcGxlJ3MgQ2xhbmcgYXMganVzdCBDbGFuZwplbmRpZigpCmlmKFBPTElDWSBDTVAwMDQyKQogICAgY21ha2VfcG9saWN5KFNFVCBDTVAwMDQyIE5FVykgIyBNQUNPU1hfUlBBVEgKZW5kaWYoKQoKcHJvamVjdCAoeDI2NSkKY21ha2VfbWluaW11bV9yZXF1aXJlZCAoVkVSU0lPTiAyLjguOCkgIyBPQkpFQ1QgbGlicmFyaWVzIHJlcXVpcmUgMi44LjgKaW5jbHVkZShDaGVja0luY2x1ZGVGaWxlcykKaW5jbHVkZShDaGVja0Z1bmN0aW9uRXhpc3RzKQppbmNsdWRlKENoZWNrU3ltYm9sRXhpc3RzKQppbmNsdWRlKENoZWNrQ1hYQ29tcGlsZXJGbGFnKQoKIyBYMjY1X0JVSUxEIG11c3QgYmUgaW5jcmVtZW50ZWQgZWFjaCB0aW1lIHRoZSBwdWJsaWMgQVBJIGlzIGNoYW5nZWQKc2V0KFgyNjVfQlVJTEQgNDgpCmNvbmZpZ3VyZV9maWxlKCIke1BST0pFQ1RfU09VUkNFX0RJUn0veDI2NS5kZWYuaW4iCiAgICAgICAgICAgICAgICIke1BST0pFQ1RfQklOQVJZX0RJUn0veDI2NS5kZWYiKQpjb25maWd1cmVfZmlsZSgiJHtQUk9KRUNUX1NPVVJDRV9ESVJ9L3gyNjVfY29uZmlnLmguaW4iCiAgICAgICAgICAgICAgICIke1BST0pFQ1RfQklOQVJZX0RJUn0veDI2NV9jb25maWcuaCIpCgpTRVQoQ01BS0VfTU9EVUxFX1BBVEggIiR7UFJPSkVDVF9TT1VSQ0VfRElSfS9jbWFrZSIgIiR7Q01BS0VfTU9EVUxFX1BBVEh9IikKCiMgU3lzdGVtIGFyY2hpdGVjdHVyZSBkZXRlY3Rpb24Kc3RyaW5nKFRPTE9XRVIgIiR7Q01BS0VfU1lTVEVNX1BST0NFU1NPUn0iIFNZU1BST0MpCnNldChYODZfQUxJQVNFUyB4ODYgaTM4NiBpNjg2IHg4Nl82NCBhbWQ2NCkKbGlzdChGSU5EIFg4Nl9BTElBU0VTICIke1NZU1BST0N9IiBYODZNQVRDSCkKaWYoIiR7U1lTUFJPQ30iIFNUUkVRVUFMICIiIE9SIFg4Nk1BVENIIEdSRUFURVIgIi0xIikKICAgIG1lc3NhZ2UoU1RBVFVTICJEZXRlY3RlZCB4ODYgdGFyZ2V0IHByb2Nlc3NvciIpCiAgICBzZXQoWDg2IDEpCiAgICBhZGRfZGVmaW5pdGlvbnMoLURYMjY1X0FSQ0hfWDg2PTEpCiAgICBpZigiJHtDTUFLRV9TSVpFT0ZfVk9JRF9QfSIgTUFUQ0hFUyA4KQogICAgICAgIHNldChYNjQgMSkKICAgICAgICBhZGRfZGVmaW5pdGlvbnMoLURYODZfNjQ9MSkKICAgIGVuZGlmKCkKZWxzZWlmKCR7U1lTUFJPQ30gU1RSRVFVQUwgImFybXY2bCIpCiAgICBtZXNzYWdlKFNUQVRVUyAiRGV0ZWN0ZWQgQVJNIHRhcmdldCBwcm9jZXNzb3IiKQogICAgc2V0KEFSTSAxKQogICAgYWRkX2RlZmluaXRpb25zKC1EWDI2NV9BUkNIX0FSTT0xIC1ESEFWRV9BUk1WNj0xKQplbHNlKCkKICAgIG1lc3NhZ2UoU1RBVFVTICJDTUFLRV9TWVNURU1fUFJPQ0VTU09SIHZhbHVlIGAke0NNQUtFX1NZU1RFTV9QUk9DRVNTT1J9YCBpcyB1bmtub3duIikKICAgIG1lc3NhZ2UoU1RBVFVTICJQbGVhc2UgYWRkIHRoaXMgdmFsdWUgbmVhciAke0NNQUtFX0NVUlJFTlRfTElTVF9GSUxFfToke0NNQUtFX0NVUlJFTlRfTElTVF9MSU5FfSIpCmVuZGlmKCkKCmlmKFVOSVgpCiAgICBsaXN0KEFQUEVORCBQTEFURk9STV9MSUJTIHB0aHJlYWQpCiAgICBmaW5kX2xpYnJhcnkoTElCUlQgcnQpCiAgICBpZihMSUJSVCkKICAgICAgICBsaXN0KEFQUEVORCBQTEFURk9STV9MSUJTIHJ0KQogICAgZW5kaWYoKQogICAgZmluZF9wYWNrYWdlKE51bWEpCiAgICBpZihOVU1BX0ZPVU5EKQogICAgICAgIGxpc3QoQVBQRU5EIENNQUtFX1JFUVVJUkVEX0xJQlJBUklFUyAke05VTUFfTElCUkFSWX0pCiAgICAgICAgY2hlY2tfc3ltYm9sX2V4aXN0cyhudW1hX25vZGVfb2ZfY3B1IG51bWEuaCBOVU1BX1YyKQogICAgICAgIGlmKE5VTUFfVjIpCiAgICAgICAgICAgIGFkZF9kZWZpbml0aW9ucygtREhBVkVfTElCTlVNQSkKICAgICAgICAgICAgbWVzc2FnZShTVEFUVVMgImxpYm51bWEgZm91bmQsIGJ1aWxkaW5nIHdpdGggc3VwcG9ydCBmb3IgTlVNQSBub2RlcyIpCiAgICAgICAgICAgIGxpc3QoQVBQRU5EIFBMQVRGT1JNX0xJQlMgJHtOVU1BX0xJQlJBUll9KQogICAgICAgICAgICBsaW5rX2RpcmVjdG9yaWVzKCR7TlVNQV9MSUJSQVJZX0RJUn0pCiAgICAgICAgICAgIGluY2x1ZGVfZGlyZWN0b3JpZXMoJHtOVU1BX0lOQ0xVREVfRElSfSkKICAgICAgICBlbmRpZigpCiAgICBlbmRpZigpCiAgICBtYXJrX2FzX2FkdmFuY2VkKExJQlJUIE5VTUFfRk9VTkQpCmVuZGlmKFVOSVgpCgppZihYNjQgQU5EIE5PVCBXSU4zMikKICAgIG9wdGlvbihFTkFCTEVfUElDICJFbmFibGUgUG9zaXRpb24gSW5kZXBlbmRlbnQgQ29kZSIgT04pCmVsc2UoKQogICAgb3B0aW9uKEVOQUJMRV9QSUMgIkVuYWJsZSBQb3NpdGlvbiBJbmRlcGVuZGVudCBDb2RlIiBPRkYpCmVuZGlmKFg2NCBBTkQgTk9UIFdJTjMyKQoKIyBDb21waWxlciBkZXRlY3Rpb24KaWYoQ01BS0VfR0VORVJBVE9SIFNUUkVRVUFMICJYY29kZSIpCiAgc2V0KFhDT0RFIDEpCmVuZGlmKCkKaWYgKEFQUExFKQogIGFkZF9kZWZpbml0aW9ucygtRE1BQ09TKQplbmRpZigpCjwvdGV4dGFyZWE+PC9mb3JtPgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICBtb2RlOiAidGV4dC94LWNtYWtlIiwKICAgICAgICBtYXRjaEJyYWNrZXRzOiB0cnVlLAogICAgICAgIGluZGVudFVuaXQ6IDQKICAgICAgfSk7CiAgICA8L3NjcmlwdD4KCiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC94LWNtYWtlPC9jb2RlPi48L3A+CgogIDwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/cobol/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/cobol/cobol.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovKioKICogQXV0aG9yOiBHYXV0YW0gTWVodGEKICogQnJhbmNoZWQgZnJvbSBDb2RlTWlycm9yJ3MgU2NoZW1lIG1vZGUKICovCihmdW5jdGlvbihtb2QpIHsKICBpZiAodHlwZW9mIGV4cG9ydHMgPT0gIm9iamVjdCIgJiYgdHlwZW9mIG1vZHVsZSA9PSAib2JqZWN0IikgLy8gQ29tbW9uSlMKICAgIG1vZChyZXF1aXJlKCIuLi8uLi9saWIvY29kZW1pcnJvciIpKTsKICBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCkgLy8gQU1ECiAgICBkZWZpbmUoWyIuLi8uLi9saWIvY29kZW1pcnJvciJdLCBtb2QpOwogIGVsc2UgLy8gUGxhaW4gYnJvd3NlciBlbnYKICAgIG1vZChDb2RlTWlycm9yKTsKfSkoZnVuY3Rpb24oQ29kZU1pcnJvcikgewoidXNlIHN0cmljdCI7CgpDb2RlTWlycm9yLmRlZmluZU1vZGUoImNvYm9sIiwgZnVuY3Rpb24gKCkgewogIHZhciBCVUlMVElOID0gImJ1aWx0aW4iLCBDT01NRU5UID0gImNvbW1lbnQiLCBTVFJJTkcgPSAic3RyaW5nIiwKICAgICAgQVRPTSA9ICJhdG9tIiwgTlVNQkVSID0gIm51bWJlciIsIEtFWVdPUkQgPSAia2V5d29yZCIsIE1PRFRBRyA9ICJoZWFkZXIiLAogICAgICBDT0JPTExJTkVOVU0gPSAiZGVmIiwgUEVSSU9EID0gImxpbmsiOwogIGZ1bmN0aW9uIG1ha2VLZXl3b3JkcyhzdHIpIHsKICAgIHZhciBvYmogPSB7fSwgd29yZHMgPSBzdHIuc3BsaXQoIiAiKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgd29yZHMubGVuZ3RoOyArK2kpIG9ialt3b3Jkc1tpXV0gPSB0cnVlOwogICAgcmV0dXJuIG9iajsKICB9CiAgdmFyIGF0b21zID0gbWFrZUtleXdvcmRzKCJUUlVFIEZBTFNFIFpFUk9FUyBaRVJPUyBaRVJPIFNQQUNFUyBTUEFDRSBMT1ctVkFMVUUgTE9XLVZBTFVFUyAiKTsKICB2YXIga2V5d29yZHMgPSBtYWtlS2V5d29yZHMoCiAgICAgICJBQ0NFUFQgQUNDRVNTIEFDUVVJUkUgQUREIEFERFJFU1MgIiArCiAgICAgICJBRFZBTkNJTkcgQUZURVIgQUxJQVMgQUxMIEFMUEhBQkVUICIgKwogICAgICAiQUxQSEFCRVRJQyBBTFBIQUJFVElDLUxPV0VSIEFMUEhBQkVUSUMtVVBQRVIgQUxQSEFOVU1FUklDIEFMUEhBTlVNRVJJQy1FRElURUQgIiArCiAgICAgICJBTFNPIEFMVEVSIEFMVEVSTkFURSBBTkQgQU5ZICIgKwogICAgICAiQVJFIEFSRUEgQVJFQVMgQVJJVEhNRVRJQyBBU0NFTkRJTkcgIiArCiAgICAgICJBU1NJR04gQVQgQVRUUklCVVRFIEFVVEhPUiBBVVRPICIgKwogICAgICAiQVVUTy1TS0lQIEFVVE9NQVRJQyBCLUFORCBCLUVYT1IgQi1MRVNTICIgKwogICAgICAiQi1OT1QgQi1PUiBCQUNLR1JPVU5ELUNPTE9SIEJBQ0tHUk9VTkQtQ09MT1VSIEJFRVAgIiArCiAgICAgICJCRUZPUkUgQkVMTCBCSU5BUlkgQklUIEJJVFMgIiArCiAgICAgICJCTEFOSyBCTElOSyBCTE9DSyBCT09MRUFOIEJPVFRPTSAiICsKICAgICAgIkJZIENBTEwgQ0FOQ0VMIENEIENGICIgKwogICAgICAiQ0ggQ0hBUkFDVEVSIENIQVJBQ1RFUlMgQ0xBU1MgQ0xPQ0stVU5JVFMgIiArCiAgICAgICJDTE9TRSBDT0JPTCBDT0RFIENPREUtU0VUIENPTCAiICsKICAgICAgIkNPTExBVElORyBDT0xVTU4gQ09NTUEgQ09NTUlUIENPTU1JVE1FTlQgIiArCiAgICAgICJDT01NT04gQ09NTVVOSUNBVElPTiBDT01QIENPTVAtMCBDT01QLTEgIiArCiAgICAgICJDT01QLTIgQ09NUC0zIENPTVAtNCBDT01QLTUgQ09NUC02ICIgKwogICAgICAiQ09NUC03IENPTVAtOCBDT01QLTkgQ09NUFVUQVRJT05BTCBDT01QVVRBVElPTkFMLTAgIiArCiAgICAgICJDT01QVVRBVElPTkFMLTEgQ09NUFVUQVRJT05BTC0yIENPTVBVVEFUSU9OQUwtMyBDT01QVVRBVElPTkFMLTQgQ09NUFVUQVRJT05BTC01ICIgKwogICAgICAiQ09NUFVUQVRJT05BTC02IENPTVBVVEFUSU9OQUwtNyBDT01QVVRBVElPTkFMLTggQ09NUFVUQVRJT05BTC05IENPTVBVVEUgIiArCiAgICAgICJDT05GSUdVUkFUSU9OIENPTk5FQ1QgQ09OU09MRSBDT05UQUlORUQgQ09OVEFJTlMgIiArCiAgICAgICJDT05URU5UIENPTlRJTlVFIENPTlRST0wgQ09OVFJPTC1BUkVBIENPTlRST0xTICIgKwogICAgICAiQ09OVkVSVElORyBDT1BZIENPUlIgQ09SUkVTUE9ORElORyBDT1VOVCAiICsKICAgICAgIkNSVCBDUlQtVU5ERVIgQ1VSUkVOQ1kgQ1VSUkVOVCBDVVJTT1IgIiArCiAgICAgICJEQVRBIERBVEUgREFURS1DT01QSUxFRCBEQVRFLVdSSVRURU4gREFZICIgKwogICAgICAiREFZLU9GLVdFRUsgREIgREItQUNDRVNTLUNPTlRST0wtS0VZIERCLURBVEEtTkFNRSBEQi1FWENFUFRJT04gIiArCiAgICAgICJEQi1GT1JNQVQtTkFNRSBEQi1SRUNPUkQtTkFNRSBEQi1TRVQtTkFNRSBEQi1TVEFUVVMgREJDUyAiICsKICAgICAgIkRCQ1MtRURJVEVEIERFIERFQlVHLUNPTlRFTlRTIERFQlVHLUlURU0gREVCVUctTElORSAiICsKICAgICAgIkRFQlVHLU5BTUUgREVCVUctU1VCLTEgREVCVUctU1VCLTIgREVCVUctU1VCLTMgREVCVUdHSU5HICIgKwogICAgICAiREVDSU1BTC1QT0lOVCBERUNMQVJBVElWRVMgREVGQVVMVCBERUxFVEUgREVMSU1JVEVEICIgKwogICAgICAiREVMSU1JVEVSIERFUEVORElORyBERVNDRU5ESU5HIERFU0NSSUJFRCBERVNUSU5BVElPTiAiICsKICAgICAgIkRFVEFJTCBESVNBQkxFIERJU0NPTk5FQ1QgRElTUExBWSBESVNQTEFZLTEgIiArCiAgICAgICJESVNQTEFZLTIgRElTUExBWS0zIERJU1BMQVktNCBESVNQTEFZLTUgRElTUExBWS02ICIgKwogICAgICAiRElTUExBWS03IERJU1BMQVktOCBESVNQTEFZLTkgRElWSURFIERJVklTSU9OICIgKwogICAgICAiRE9XTiBEUk9QIERVUExJQ0FURSBEVVBMSUNBVEVTIERZTkFNSUMgIiArCiAgICAgICJFQkNESUMgRUdJIEVKRUNUIEVMU0UgRU1JICIgKwogICAgICAiRU1QVFkgRU1QVFktQ0hFQ0sgRU5BQkxFIEVORCBFTkQuIEVORC1BQ0NFUFQgRU5ELUFDQ0VQVC4gIiArCiAgICAgICJFTkQtQUREIEVORC1DQUxMIEVORC1DT01QVVRFIEVORC1ERUxFVEUgRU5ELURJU1BMQVkgIiArCiAgICAgICJFTkQtRElWSURFIEVORC1FVkFMVUFURSBFTkQtSUYgRU5ELUlOVk9LRSBFTkQtTVVMVElQTFkgIiArCiAgICAgICJFTkQtT0YtUEFHRSBFTkQtUEVSRk9STSBFTkQtUkVBRCBFTkQtUkVDRUlWRSBFTkQtUkVUVVJOICIgKwogICAgICAiRU5ELVJFV1JJVEUgRU5ELVNFQVJDSCBFTkQtU1RBUlQgRU5ELVNUUklORyBFTkQtU1VCVFJBQ1QgIiArCiAgICAgICJFTkQtVU5TVFJJTkcgRU5ELVdSSVRFIEVORC1YTUwgRU5URVIgRU5UUlkgIiArCiAgICAgICJFTlZJUk9OTUVOVCBFT1AgRVFVQUwgRVFVQUxTIEVSQVNFICIgKwogICAgICAiRVJST1IgRVNJIEVWQUxVQVRFIEVWRVJZIEVYQ0VFRFMgIiArCiAgICAgICJFWENFUFRJT04gRVhDTFVTSVZFIEVYSVQgRVhURU5EIEVYVEVSTkFMICIgKwogICAgICAiRVhURVJOQUxMWS1ERVNDUklCRUQtS0VZIEZEIEZFVENIIEZJTEUgRklMRS1DT05UUk9MICIgKwogICAgICAiRklMRS1TVFJFQU0gRklMRVMgRklMTEVSIEZJTkFMIEZJTkQgIiArCiAgICAgICJGSU5JU0ggRklSU1QgRk9PVElORyBGT1IgRk9SRUdST1VORC1DT0xPUiAiICsKICAgICAgIkZPUkVHUk9VTkQtQ09MT1VSIEZPUk1BVCBGUkVFIEZST00gRlVMTCAiICsKICAgICAgIkZVTkNUSU9OIEdFTkVSQVRFIEdFVCBHSVZJTkcgR0xPQkFMICIgKwogICAgICAiR08gR09CQUNLIEdSRUFURVIgR1JPVVAgSEVBRElORyAiICsKICAgICAgIkhJR0gtVkFMVUUgSElHSC1WQUxVRVMgSElHSExJR0hUIEktTyBJLU8tQ09OVFJPTCAiICsKICAgICAgIklEIElERU5USUZJQ0FUSU9OIElGIElOIElOREVYICIgKwogICAgICAiSU5ERVgtMSBJTkRFWC0yIElOREVYLTMgSU5ERVgtNCBJTkRFWC01ICIgKwogICAgICAiSU5ERVgtNiBJTkRFWC03IElOREVYLTggSU5ERVgtOSBJTkRFWEVEICIgKwogICAgICAiSU5ESUMgSU5ESUNBVEUgSU5ESUNBVE9SIElORElDQVRPUlMgSU5JVElBTCAiICsKICAgICAgIklOSVRJQUxJWkUgSU5JVElBVEUgSU5QVVQgSU5QVVQtT1VUUFVUIElOU1BFQ1QgIiArCiAgICAgICJJTlNUQUxMQVRJT04gSU5UTyBJTlZBTElEIElOVk9LRSBJUyAiICsKICAgICAgIkpVU1QgSlVTVElGSUVEIEtBTkpJIEtFRVAgS0VZICIgKwogICAgICAiTEFCRUwgTEFTVCBMRCBMRUFESU5HIExFRlQgIiArCiAgICAgICJMRUZULUpVU1RJRlkgTEVOR1RIIExFTkdUSC1DSEVDSyBMRVNTIExJQlJBUlkgIiArCiAgICAgICJMSUtFIExJTUlUIExJTUlUUyBMSU5BR0UgTElOQUdFLUNPVU5URVIgIiArCiAgICAgICJMSU5FIExJTkUtQ09VTlRFUiBMSU5FUyBMSU5LQUdFIExPQ0FMLVNUT1JBR0UgIiArCiAgICAgICJMT0NBTEUgTE9DQUxMWSBMT0NLICIgKwogICAgICAiTUVNQkVSIE1FTU9SWSBNRVJHRSBNRVNTQUdFIE1FVEFDTEFTUyAiICsKICAgICAgIk1PREUgTU9ESUZJRUQgTU9ESUZZIE1PRFVMRVMgTU9WRSAiICsKICAgICAgIk1VTFRJUExFIE1VTFRJUExZIE5BVElPTkFMIE5BVElWRSBORUdBVElWRSAiICsKICAgICAgIk5FWFQgTk8gTk8tRUNITyBOT05FIE5PVCAiICsKICAgICAgIk5VTEwgTlVMTC1LRVktTUFQIE5VTEwtTUFQIE5VTExTIE5VTUJFUiAiICsKICAgICAgIk5VTUVSSUMgTlVNRVJJQy1FRElURUQgT0JKRUNUIE9CSkVDVC1DT01QVVRFUiBPQ0NVUlMgIiArCiAgICAgICJPRiBPRkYgT01JVFRFRCBPTiBPTkxZICIgKwogICAgICAiT1BFTiBPUFRJT05BTCBPUiBPUkRFUiBPUkdBTklaQVRJT04gIiArCiAgICAgICJPVEhFUiBPVVRQVVQgT1ZFUkZMT1cgT1dORVIgUEFDS0VELURFQ0lNQUwgIiArCiAgICAgICJQQURESU5HIFBBR0UgUEFHRS1DT1VOVEVSIFBBUlNFIFBFUkZPUk0gIiArCiAgICAgICJQRiBQSCBQSUMgUElDVFVSRSBQTFVTICIgKwogICAgICAiUE9JTlRFUiBQT1NJVElPTiBQT1NJVElWRSBQUkVGSVggUFJFU0VOVCAiICsKICAgICAgIlBSSU5USU5HIFBSSU9SIFBST0NFRFVSRSBQUk9DRURVUkUtUE9JTlRFUiBQUk9DRURVUkVTICIgKwogICAgICAiUFJPQ0VFRCBQUk9DRVNTIFBST0NFU1NJTkcgUFJPR1JBTSBQUk9HUkFNLUlEICIgKwogICAgICAiUFJPTVBUIFBST1RFQ1RFRCBQVVJHRSBRVUVVRSBRVU9URSAiICsKICAgICAgIlFVT1RFUyBSQU5ET00gUkQgUkVBRCBSRUFEWSAiICsKICAgICAgIlJFQUxNIFJFQ0VJVkUgUkVDT05ORUNUIFJFQ09SRCBSRUNPUkQtTkFNRSAiICsKICAgICAgIlJFQ09SRFMgUkVDVVJTSVZFIFJFREVGSU5FUyBSRUVMIFJFRkVSRU5DRSAiICsKICAgICAgIlJFRkVSRU5DRS1NT05JVE9SIFJFRkVSRU5DRVMgUkVMQVRJT04gUkVMQVRJVkUgUkVMRUFTRSAiICsKICAgICAgIlJFTUFJTkRFUiBSRU1PVkFMIFJFTkFNRVMgUkVQRUFURUQgUkVQTEFDRSAiICsKICAgICAgIlJFUExBQ0lORyBSRVBPUlQgUkVQT1JUSU5HIFJFUE9SVFMgUkVQT1NJVE9SWSAiICsKICAgICAgIlJFUVVJUkVEIFJFUlVOIFJFU0VSVkUgUkVTRVQgUkVUQUlOSU5HICIgKwogICAgICAiUkVUUklFVkFMIFJFVFVSTiBSRVRVUk4tQ09ERSBSRVRVUk5JTkcgUkVWRVJTRS1WSURFTyAiICsKICAgICAgIlJFVkVSU0VEIFJFV0lORCBSRVdSSVRFIFJGIFJIICIgKwogICAgICAiUklHSFQgUklHSFQtSlVTVElGWSBST0xMQkFDSyBST0xMSU5HIFJPVU5ERUQgIiArCiAgICAgICJSVU4gU0FNRSBTQ1JFRU4gU0QgU0VBUkNIICIgKwogICAgICAiU0VDVElPTiBTRUNVUkUgU0VDVVJJVFkgU0VHTUVOVCBTRUdNRU5ULUxJTUlUICIgKwogICAgICAiU0VMRUNUIFNFTkQgU0VOVEVOQ0UgU0VQQVJBVEUgU0VRVUVOQ0UgIiArCiAgICAgICJTRVFVRU5USUFMIFNFVCBTSEFSRUQgU0lHTiBTSVpFICIgKwogICAgICAiU0tJUDEgU0tJUDIgU0tJUDMgU09SVCBTT1JULU1FUkdFICIgKwogICAgICAiU09SVC1SRVRVUk4gU09VUkNFIFNPVVJDRS1DT01QVVRFUiBTUEFDRS1GSUxMICIgKwogICAgICAiU1BFQ0lBTC1OQU1FUyBTVEFOREFSRCBTVEFOREFSRC0xIFNUQU5EQVJELTIgIiArCiAgICAgICJTVEFSVCBTVEFSVElORyBTVEFUVVMgU1RPUCBTVE9SRSAiICsKICAgICAgIlNUUklORyBTVUItUVVFVUUtMSBTVUItUVVFVUUtMiBTVUItUVVFVUUtMyBTVUItU0NIRU1BICIgKwogICAgICAiU1VCRklMRSBTVUJTVElUVVRFIFNVQlRSQUNUIFNVTSBTVVBQUkVTUyAiICsKICAgICAgIlNZTUJPTElDIFNZTkMgU1lOQ0hST05JWkVEIFNZU0lOIFNZU09VVCAiICsKICAgICAgIlRBQkxFIFRBTExZSU5HIFRBUEUgVEVOQU5UIFRFUk1JTkFMICIgKwogICAgICAiVEVSTUlOQVRFIFRFU1QgVEVYVCBUSEFOIFRIRU4gIiArCiAgICAgICJUSFJPVUdIIFRIUlUgVElNRSBUSU1FUyBUSVRMRSAiICsKICAgICAgIlRPIFRPUCBUUkFJTElORyBUUkFJTElORy1TSUdOIFRSQU5TQUNUSU9OICIgKwogICAgICAiVFlQRSBUWVBFREVGIFVOREVSTElORSBVTkVRVUFMIFVOSVQgIiArCiAgICAgICJVTlNUUklORyBVTlRJTCBVUCBVUERBVEUgVVBPTiAiICsKICAgICAgIlVTQUdFIFVTQUdFLU1PREUgVVNFIFVTSU5HIFZBTElEICIgKwogICAgICAiVkFMSURBVEUgVkFMVUUgVkFMVUVTIFZBUllJTkcgVkxSICIgKwogICAgICAiV0FJVCBXSEVOIFdIRU4tQ09NUElMRUQgV0lUSCBXSVRISU4gIiArCiAgICAgICJXT1JEUyBXT1JLSU5HLVNUT1JBR0UgV1JJVEUgWE1MIFhNTC1DT0RFICIgKwogICAgICAiWE1MLUVWRU5UIFhNTC1OVEVYVCBYTUwtVEVYVCBaRVJPIFpFUk8tRklMTCAiICk7CgogIHZhciBidWlsdGlucyA9IG1ha2VLZXl3b3JkcygiLSAqICoqIC8gKyA8IDw9ID0gPiA+PSAiKTsKICB2YXIgdGVzdHMgPSB7CiAgICBkaWdpdDogL1xkLywKICAgIGRpZ2l0X29yX2NvbG9uOiAvW1xkOl0vLAogICAgaGV4OiAvWzAtOWEtZl0vaSwKICAgIHNpZ246IC9bKy1dLywKICAgIGV4cG9uZW50OiAvZS9pLAogICAga2V5d29yZF9jaGFyOiAvW15cc1woXFtcO1wpXF1dLywKICAgIHN5bWJvbDogL1tcdyorXC1dLwogIH07CiAgZnVuY3Rpb24gaXNOdW1iZXIoY2gsIHN0cmVhbSl7CiAgICAvLyBoZXgKICAgIGlmICggY2ggPT09ICcwJyAmJiBzdHJlYW0uZWF0KC94L2kpICkgewogICAgICBzdHJlYW0uZWF0V2hpbGUodGVzdHMuaGV4KTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICAvLyBsZWFkaW5nIHNpZ24KICAgIGlmICggKCBjaCA9PSAnKycgfHwgY2ggPT0gJy0nICkgJiYgKCB0ZXN0cy5kaWdpdC50ZXN0KHN0cmVhbS5wZWVrKCkpICkgKSB7CiAgICAgIHN0cmVhbS5lYXQodGVzdHMuc2lnbik7CiAgICAgIGNoID0gc3RyZWFtLm5leHQoKTsKICAgIH0KICAgIGlmICggdGVzdHMuZGlnaXQudGVzdChjaCkgKSB7CiAgICAgIHN0cmVhbS5lYXQoY2gpOwogICAgICBzdHJlYW0uZWF0V2hpbGUodGVzdHMuZGlnaXQpOwogICAgICBpZiAoICcuJyA9PSBzdHJlYW0ucGVlaygpKSB7CiAgICAgICAgc3RyZWFtLmVhdCgnLicpOwogICAgICAgIHN0cmVhbS5lYXRXaGlsZSh0ZXN0cy5kaWdpdCk7CiAgICAgIH0KICAgICAgaWYgKCBzdHJlYW0uZWF0KHRlc3RzLmV4cG9uZW50KSApIHsKICAgICAgICBzdHJlYW0uZWF0KHRlc3RzLnNpZ24pOwogICAgICAgIHN0cmVhbS5lYXRXaGlsZSh0ZXN0cy5kaWdpdCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQogIHJldHVybiB7CiAgICBzdGFydFN0YXRlOiBmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgaW5kZW50U3RhY2s6IG51bGwsCiAgICAgICAgaW5kZW50YXRpb246IDAsCiAgICAgICAgbW9kZTogZmFsc2UKICAgICAgfTsKICAgIH0sCiAgICB0b2tlbjogZnVuY3Rpb24gKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgaWYgKHN0YXRlLmluZGVudFN0YWNrID09IG51bGwgJiYgc3RyZWFtLnNvbCgpKSB7CiAgICAgICAgLy8gdXBkYXRlIGluZGVudGF0aW9uLCBidXQgb25seSBpZiBpbmRlbnRTdGFjayBpcyBlbXB0eQogICAgICAgIHN0YXRlLmluZGVudGF0aW9uID0gNiA7IC8vc3RyZWFtLmluZGVudGF0aW9uKCk7CiAgICAgIH0KICAgICAgLy8gc2tpcCBzcGFjZXMKICAgICAgaWYgKHN0cmVhbS5lYXRTcGFjZSgpKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgdmFyIHJldHVyblR5cGUgPSBudWxsOwogICAgICBzd2l0Y2goc3RhdGUubW9kZSl7CiAgICAgIGNhc2UgInN0cmluZyI6IC8vIG11bHRpLWxpbmUgc3RyaW5nIHBhcnNpbmcgbW9kZQogICAgICAgIHZhciBuZXh0ID0gZmFsc2U7CiAgICAgICAgd2hpbGUgKChuZXh0ID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkgewogICAgICAgICAgaWYgKG5leHQgPT0gIlwiIiB8fCBuZXh0ID09ICJcJyIpIHsKICAgICAgICAgICAgc3RhdGUubW9kZSA9IGZhbHNlOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuVHlwZSA9IFNUUklORzsgLy8gY29udGludWUgb24gaW4gc3RyaW5nIG1vZGUKICAgICAgICBicmVhazsKICAgICAgZGVmYXVsdDogLy8gZGVmYXVsdCBwYXJzaW5nIG1vZGUKICAgICAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpOwogICAgICAgIHZhciBjb2wgPSBzdHJlYW0uY29sdW1uKCk7CiAgICAgICAgaWYgKGNvbCA+PSAwICYmIGNvbCA8PSA1KSB7CiAgICAgICAgICByZXR1cm5UeXBlID0gQ09CT0xMSU5FTlVNOwogICAgICAgIH0gZWxzZSBpZiAoY29sID49IDcyICYmIGNvbCA8PSA3OSkgewogICAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICAgICAgcmV0dXJuVHlwZSA9IE1PRFRBRzsKICAgICAgICB9IGVsc2UgaWYgKGNoID09ICIqIiAmJiBjb2wgPT0gNikgeyAvLyBjb21tZW50CiAgICAgICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7IC8vIHJlc3Qgb2YgdGhlIGxpbmUgaXMgYSBjb21tZW50CiAgICAgICAgICByZXR1cm5UeXBlID0gQ09NTUVOVDsKICAgICAgICB9IGVsc2UgaWYgKGNoID09ICJcIiIgfHwgY2ggPT0gIlwnIikgewogICAgICAgICAgc3RhdGUubW9kZSA9ICJzdHJpbmciOwogICAgICAgICAgcmV0dXJuVHlwZSA9IFNUUklORzsKICAgICAgICB9IGVsc2UgaWYgKGNoID09ICInIiAmJiAhKCB0ZXN0cy5kaWdpdF9vcl9jb2xvbi50ZXN0KHN0cmVhbS5wZWVrKCkpICkpIHsKICAgICAgICAgIHJldHVyblR5cGUgPSBBVE9NOwogICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gIi4iKSB7CiAgICAgICAgICByZXR1cm5UeXBlID0gUEVSSU9EOwogICAgICAgIH0gZWxzZSBpZiAoaXNOdW1iZXIoY2gsc3RyZWFtKSl7CiAgICAgICAgICByZXR1cm5UeXBlID0gTlVNQkVSOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoc3RyZWFtLmN1cnJlbnQoKS5tYXRjaCh0ZXN0cy5zeW1ib2wpKSB7CiAgICAgICAgICAgIHdoaWxlIChjb2wgPCA3MSkgewogICAgICAgICAgICAgIGlmIChzdHJlYW0uZWF0KHRlc3RzLnN5bWJvbCkgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGNvbCsrOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKGtleXdvcmRzICYmIGtleXdvcmRzLnByb3BlcnR5SXNFbnVtZXJhYmxlKHN0cmVhbS5jdXJyZW50KCkudG9VcHBlckNhc2UoKSkpIHsKICAgICAgICAgICAgcmV0dXJuVHlwZSA9IEtFWVdPUkQ7CiAgICAgICAgICB9IGVsc2UgaWYgKGJ1aWx0aW5zICYmIGJ1aWx0aW5zLnByb3BlcnR5SXNFbnVtZXJhYmxlKHN0cmVhbS5jdXJyZW50KCkudG9VcHBlckNhc2UoKSkpIHsKICAgICAgICAgICAgcmV0dXJuVHlwZSA9IEJVSUxUSU47CiAgICAgICAgICB9IGVsc2UgaWYgKGF0b21zICYmIGF0b21zLnByb3BlcnR5SXNFbnVtZXJhYmxlKHN0cmVhbS5jdXJyZW50KCkudG9VcHBlckNhc2UoKSkpIHsKICAgICAgICAgICAgcmV0dXJuVHlwZSA9IEFUT007CiAgICAgICAgICB9IGVsc2UgcmV0dXJuVHlwZSA9IG51bGw7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiByZXR1cm5UeXBlOwogICAgfSwKICAgIGluZGVudDogZnVuY3Rpb24gKHN0YXRlKSB7CiAgICAgIGlmIChzdGF0ZS5pbmRlbnRTdGFjayA9PSBudWxsKSByZXR1cm4gc3RhdGUuaW5kZW50YXRpb247CiAgICAgIHJldHVybiBzdGF0ZS5pbmRlbnRTdGFjay5pbmRlbnQ7CiAgICB9CiAgfTsKfSk7CgpDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveC1jb2JvbCIsICJjb2JvbCIpOwoKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/cobol/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogQ09CT0wgbW9kZTwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uLy4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vdGhlbWUvbmVhdC5jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL3RoZW1lL2VsZWdhbnQuY3NzIj4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi90aGVtZS9lcmxhbmctZGFyay5jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL3RoZW1lL25pZ2h0LmNzcyI+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vdGhlbWUvbW9ub2thaS5jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL3RoZW1lL2NvYmFsdC5jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL3RoZW1lL2VjbGlwc2UuY3NzIj4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi90aGVtZS9ydWJ5Ymx1ZS5jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL3RoZW1lL2xlc3Nlci1kYXJrLmNzcyI+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vdGhlbWUveHEtZGFyay5jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL3RoZW1lL3hxLWxpZ2h0LmNzcyI+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vdGhlbWUvYW1iaWFuY2UuY3NzIj4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi90aGVtZS9ibGFja2JvYXJkLmNzcyI+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vdGhlbWUvdmlicmFudC1pbmsuY3NzIj4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi90aGVtZS9zb2xhcml6ZWQuY3NzIj4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi90aGVtZS90d2lsaWdodC5jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL3RoZW1lL21pZG5pZ2h0LmNzcyI+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vYWRkb24vZGlhbG9nL2RpYWxvZy5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vLi4vYWRkb24vZWRpdC9tYXRjaGJyYWNrZXRzLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9ImNvYm9sLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uLy4uL2FkZG9uL3NlbGVjdGlvbi9hY3RpdmUtbGluZS5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi8uLi9hZGRvbi9zZWFyY2gvc2VhcmNoLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uLy4uL2FkZG9uL2RpYWxvZy9kaWFsb2cuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vLi4vYWRkb24vc2VhcmNoL3NlYXJjaGN1cnNvci5qcyI+PC9zY3JpcHQ+CjxzdHlsZT4KICAgICAgICAuQ29kZU1pcnJvciB7CiAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZWVlOwogICAgICAgICAgZm9udC1zaXplIDogMjBweDsKICAgICAgICAgIGhlaWdodCA6IGF1dG8gIWltcG9ydGFudDsKICAgICAgICB9CiAgICAgICAgLkNvZGVNaXJyb3ItYWN0aXZlbGluZS1iYWNrZ3JvdW5kIHtiYWNrZ3JvdW5kOiAjNTU1NTU1ICFpbXBvcnRhbnQ7fQogICAgPC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aDE+Q29kZU1pcnJvcjwvaDE+PGltZyBpZD1sb2dvIHNyYz0iLi4vLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+TGFuZ3VhZ2UgbW9kZXM8L2E+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPkNPQk9MPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5DT0JPTCBtb2RlPC9oMj4KCiAgICA8cD4gU2VsZWN0IFRoZW1lIDxzZWxlY3Qgb25jaGFuZ2U9InNlbGVjdFRoZW1lKCkiIGlkPSJzZWxlY3RUaGVtZSI+CiAgICAgICAgPG9wdGlvbj5kZWZhdWx0PC9vcHRpb24+CiAgICAgICAgPG9wdGlvbj5hbWJpYW5jZTwvb3B0aW9uPgogICAgICAgIDxvcHRpb24+YmxhY2tib2FyZDwvb3B0aW9uPgogICAgICAgIDxvcHRpb24+Y29iYWx0PC9vcHRpb24+CiAgICAgICAgPG9wdGlvbj5lY2xpcHNlPC9vcHRpb24+CiAgICAgICAgPG9wdGlvbj5lbGVnYW50PC9vcHRpb24+CiAgICAgICAgPG9wdGlvbj5lcmxhbmctZGFyazwvb3B0aW9uPgogICAgICAgIDxvcHRpb24+bGVzc2VyLWRhcms8L29wdGlvbj4KICAgICAgICA8b3B0aW9uPm1pZG5pZ2h0PC9vcHRpb24+CiAgICAgICAgPG9wdGlvbj5tb25va2FpPC9vcHRpb24+CiAgICAgICAgPG9wdGlvbj5uZWF0PC9vcHRpb24+CiAgICAgICAgPG9wdGlvbj5uaWdodDwvb3B0aW9uPgogICAgICAgIDxvcHRpb24+cnVieWJsdWU8L29wdGlvbj4KICAgICAgICA8b3B0aW9uPnNvbGFyaXplZCBkYXJrPC9vcHRpb24+CiAgICAgICAgPG9wdGlvbj5zb2xhcml6ZWQgbGlnaHQ8L29wdGlvbj4KICAgICAgICA8b3B0aW9uIHNlbGVjdGVkPnR3aWxpZ2h0PC9vcHRpb24+CiAgICAgICAgPG9wdGlvbj52aWJyYW50LWluazwvb3B0aW9uPgogICAgICAgIDxvcHRpb24+eHEtZGFyazwvb3B0aW9uPgogICAgICAgIDxvcHRpb24+eHEtbGlnaHQ8L29wdGlvbj4KICAgIDwvc2VsZWN0PiAgICBTZWxlY3QgRm9udCBTaXplIDxzZWxlY3Qgb25jaGFuZ2U9InNlbGVjdEZvbnRzaXplKCkiIGlkPSJzZWxlY3RGb250U2l6ZSI+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIxM3B4Ij4xM3B4PC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIxNHB4Ij4xNHB4PC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIxNnB4Ij4xNnB4PC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIxOHB4Ij4xOHB4PC9vcHRpb24+CiAgICAgICAgICA8b3B0aW9uIHZhbHVlPSIyMHB4IiBzZWxlY3RlZD0ic2VsZWN0ZWQiPjIwcHg8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjI0cHgiPjI0cHg8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjI2cHgiPjI2cHg8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjI4cHgiPjI4cHg8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjMwcHgiPjMwcHg8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjMycHgiPjMycHg8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjM0cHgiPjM0cHg8L29wdGlvbj4KICAgICAgICAgIDxvcHRpb24gdmFsdWU9IjM2cHgiPjM2cHg8L29wdGlvbj4KICAgICAgICA8L3NlbGVjdD4KPGxhYmVsIGZvcj0iY2hlY2tCb3hSZWFkT25seSI+UmVhZC1vbmx5PC9sYWJlbD4KPGlucHV0IHR5cGU9ImNoZWNrYm94IiBpZD0iY2hlY2tCb3hSZWFkT25seSIgb25jaGFuZ2U9InNlbGVjdFJlYWRPbmx5KCkiPgo8bGFiZWwgZm9yPSJpZF90YWJUb0luZGVudFNwYWNlIj5JbnNlcnQgU3BhY2VzIG9uIFRhYjwvbGFiZWw+CjxpbnB1dCB0eXBlPSJjaGVja2JveCIgaWQ9ImlkX3RhYlRvSW5kZW50U3BhY2UiIG9uY2hhbmdlPSJ0YWJUb0luZGVudFNwYWNlKCkiPgo8L3A+Cjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+Ci0tLS0tLS0tLTEtLS0tLS0tLS0yLS0tLS0tLS0tMy0tLS0tLS0tLTQtLS0tLS0tLS01LS0tLS0tLS0tNi0tLS0tLS0tLTctLS0tLS0tLS04CjEyMzQ1Njc4OTExMjM0NTY3ODkyMTIzNDU2Nzg5MzEyMzQ1Njc4OTQxMjM0NTY3ODk1MTIzNDU2Nzg5NjEyMzQ1Njc4OTcxMjM0NTY3ODk4CjAwMDAxMCBJREVOVElGSUNBVElPTiBESVZJU0lPTi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU9EVEdIRVJFCjAwMDAyMCBQUk9HUkFNLUlELiAgICAgICBTQU1QTEUuCjAwMDAzMCBBVVRIT1IuICAgICAgICAgICBURVNUIFNBTS4gCjAwMDA0MCBEQVRFLVdSSVRURU4uICAgICA1IEZlYnJ1YXJ5IDIwMTMKMDAwMDQxCjAwMDA0MiogQSBzYW1wbGUgcHJvZ3JhbSBqdXN0IHRvIHNob3cgdGhlIGZvcm0uCjAwMDA0MyogVGhlIHByb2dyYW0gY29waWVzIGl0cyBpbnB1dCB0byB0aGUgb3V0cHV0LAowMDAwNDQqIGFuZCBjb3VudHMgdGhlIG51bWJlciBvZiByZWNvcmRzLgowMDAwNDUqIEF0IHRoZSBlbmQgdGhpcyBudW1iZXIgaXMgcHJpbnRlZC4KMDAwMDQ2CjAwMDA1MCBFTlZJUk9OTUVOVCBESVZJU0lPTi4KMDAwMDYwIElOUFVULU9VVFBVVCBTRUNUSU9OLgowMDAwNzAgRklMRS1DT05UUk9MLgowMDAwODAgICAgIFNFTEVDVCBTVFVERU5ULUZJTEUgICAgIEFTU0lHTiBUTyBTWVNJTgowMDAwOTAgICAgICAgICBPUkdBTklaQVRJT04gSVMgTElORSBTRVFVRU5USUFMLgowMDAxMDAgICAgIFNFTEVDVCBQUklOVC1GSUxFICAgICAgIEFTU0lHTiBUTyBTWVNPVVQKMDAwMTEwICAgICAgICAgT1JHQU5JWkFUSU9OIElTIExJTkUgU0VRVUVOVElBTC4KMDAwMTIwCjAwMDEzMCBEQVRBIERJVklTSU9OLgowMDAxNDAgRklMRSBTRUNUSU9OLgowMDAxNTAgRkQgIFNUVURFTlQtRklMRQowMDAxNjAgICAgIFJFQ09SRCBDT05UQUlOUyA0MyBDSEFSQUNURVJTCjAwMDE3MCAgICAgREFUQSBSRUNPUkQgSVMgU1RVREVOVC1JTi4KMDAwMTgwIDAxICBTVFVERU5ULUlOICAgICAgICAgICAgICBQSUMgWCg0MykuCjAwMDE5MAowMDAyMDAgRkQgIFBSSU5ULUZJTEUKMDAwMjEwICAgICBSRUNPUkQgQ09OVEFJTlMgODAgQ0hBUkFDVEVSUwowMDAyMjAgICAgIERBVEEgUkVDT1JEIElTIFBSSU5ULUxJTkUuCjAwMDIzMCAwMSAgUFJJTlQtTElORSAgICAgICAgICAgICAgUElDIFgoODApLgowMDAyNDAKMDAwMjUwIFdPUktJTkctU1RPUkFHRSBTRUNUSU9OLgowMDAyNjAgMDEgIERBVEEtUkVNQUlOUy1TV0lUQ0ggICAgIFBJQyBYKDIpICAgICAgVkFMVUUgU1BBQ0VTLgowMDAyNjEgMDEgIFJFQ09SRFMtV1JJVFRFTiAgICAgICAgIFBJQyA5OS4KMDAwMjcwCjAwMDI4MCAwMSAgREVUQUlMLUxJTkUuCjAwMDI5MCAgICAgMDUgIEZJTExFUiAgICAgICAgICAgICAgUElDIFgoNykgICAgICBWQUxVRSBTUEFDRVMuCjAwMDMwMCAgICAgMDUgIFJFQ09SRC1JTUFHRSAgICAgICAgUElDIFgoNDMpLgowMDAzMTAgICAgIDA1ICBGSUxMRVIgICAgICAgICAgICAgIFBJQyBYKDMwKSAgICAgVkFMVUUgU1BBQ0VTLgowMDAzMTEgCjAwMDMxMiAwMSAgU1VNTUFSWS1MSU5FLgowMDAzMTMgICAgIDA1ICBGSUxMRVIgICAgICAgICAgICAgIFBJQyBYKDcpICAgICAgVkFMVUUgU1BBQ0VTLgowMDAzMTQgICAgIDA1ICBUT1RBTC1SRUFEICAgICAgICAgIFBJQyA5OS4KMDAwMzE1ICAgICAwNSAgRklMTEVSICAgICAgICAgICAgICBQSUMgWCAgICAgICAgIFZBTFVFIFNQQUNFLgowMDAzMTYgICAgIDA1ICBGSUxMRVIgICAgICAgICAgICAgIFBJQyBYKDE3KSAgICAgCjAwMDMxNyAgICAgICAgICAgICAgICAgVkFMVUUgICdSZWNvcmRzIHdlcmUgcmVhZCcuCjAwMDMxOCAgICAgMDUgIEZJTExFUiAgICAgICAgICAgICAgUElDIFgoNTMpICAgICBWQUxVRSBTUEFDRVMuCjAwMDMxOQowMDAzMjAgUFJPQ0VEVVJFIERJVklTSU9OLgowMDAzMjEKMDAwMzMwIFBSRVBBUkUtU0VOSU9SLVJFUE9SVC4KMDAwMzQwICAgICBPUEVOIElOUFVUICBTVFVERU5ULUZJTEUKMDAwMzUwICAgICAgICAgIE9VVFBVVCBQUklOVC1GSUxFLgowMDAzNTEgICAgIE1PVkUgWkVSTyBUTyBSRUNPUkRTLVdSSVRURU4uCjAwMDM2MCAgICAgUkVBRCBTVFVERU5ULUZJTEUKMDAwMzcwICAgICAgICAgQVQgRU5EIE1PVkUgJ05PJyBUTyBEQVRBLVJFTUFJTlMtU1dJVENICjAwMDM4MCAgICAgRU5ELVJFQUQuCjAwMDM5MCAgICAgUEVSRk9STSBQUk9DRVNTLVJFQ09SRFMKMDAwNDEwICAgICAgICAgVU5USUwgREFUQS1SRU1BSU5TLVNXSVRDSCA9ICdOTycuCjAwMDQxMSAgICAgUEVSRk9STSBQUklOVC1TVU1NQVJZLgowMDA0MjAgICAgIENMT1NFIFNUVURFTlQtRklMRQowMDA0MzAgICAgICAgICAgIFBSSU5ULUZJTEUuCjAwMDQ0MCAgICAgU1RPUCBSVU4uCjAwMDQ1MAowMDA0NjAgUFJPQ0VTUy1SRUNPUkRTLgowMDA0NzAgICAgIE1PVkUgU1RVREVOVC1JTiBUTyBSRUNPUkQtSU1BR0UuCjAwMDQ4MCAgICAgTU9WRSBERVRBSUwtTElORSBUTyBQUklOVC1MSU5FLgowMDA0OTAgICAgIFdSSVRFIFBSSU5ULUxJTkUuCjAwMDUwMCAgICAgQUREIDEgVE8gUkVDT1JEUy1XUklUVEVOLgowMDA1MTAgICAgIFJFQUQgU1RVREVOVC1GSUxFCjAwMDUyMCAgICAgICAgIEFUIEVORCBNT1ZFICdOTycgVE8gREFUQS1SRU1BSU5TLVNXSVRDSAowMDA1MzAgICAgIEVORC1SRUFELiAKMDAwNTQwCjAwMDU1MCBQUklOVC1TVU1NQVJZLgowMDA1NjAgICAgIE1PVkUgUkVDT1JEUy1XUklUVEVOIFRPIFRPVEFMLVJFQUQuCjAwMDU3MCAgICAgTU9WRSBTVU1NQVJZLUxJTkUgVE8gUFJJTlQtTElORS4KMDAwNTcxICAgICBXUklURSBQUklOVC1MSU5FLiAKMDAwNTcyCjAwMDU4MAo8L3RleHRhcmVhPgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgICAgICBtYXRjaEJyYWNrZXRzOiB0cnVlLAogICAgICAgIG1vZGU6ICJ0ZXh0L3gtY29ib2wiLAogICAgICAgIHRoZW1lIDogInR3aWxpZ2h0IiwKICAgICAgICBzdHlsZUFjdGl2ZUxpbmU6IHRydWUsCiAgICAgICAgc2hvd0N1cnNvcldoZW5TZWxlY3RpbmcgOiB0cnVlLCAgCiAgICAgIH0pOwogICAgICBmdW5jdGlvbiBzZWxlY3RUaGVtZSgpIHsKICAgICAgICB2YXIgdGhlbWVJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZWxlY3RUaGVtZSIpOwogICAgICAgIHZhciB0aGVtZSA9IHRoZW1lSW5wdXQub3B0aW9uc1t0aGVtZUlucHV0LnNlbGVjdGVkSW5kZXhdLmlubmVySFRNTDsKICAgICAgICBlZGl0b3Iuc2V0T3B0aW9uKCJ0aGVtZSIsIHRoZW1lKTsKICAgICAgfQogICAgICBmdW5jdGlvbiBzZWxlY3RGb250c2l6ZSgpIHsKICAgICAgICB2YXIgZm9udFNpemVJbnB1dCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzZWxlY3RGb250U2l6ZSIpOwogICAgICAgIHZhciBmb250U2l6ZSA9IGZvbnRTaXplSW5wdXQub3B0aW9uc1tmb250U2l6ZUlucHV0LnNlbGVjdGVkSW5kZXhdLmlubmVySFRNTDsKICAgICAgICBlZGl0b3IuZ2V0V3JhcHBlckVsZW1lbnQoKS5zdHlsZS5mb250U2l6ZSA9IGZvbnRTaXplOwogICAgICAgIGVkaXRvci5yZWZyZXNoKCk7CiAgICAgIH0KICAgICAgZnVuY3Rpb24gc2VsZWN0UmVhZE9ubHkoKSB7CiAgICAgICAgZWRpdG9yLnNldE9wdGlvbigicmVhZE9ubHkiLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY2hlY2tCb3hSZWFkT25seSIpLmNoZWNrZWQpOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIHRhYlRvSW5kZW50U3BhY2UoKSB7CiAgICAgICAgaWYgKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJpZF90YWJUb0luZGVudFNwYWNlIikuY2hlY2tlZCkgewogICAgICAgICAgICBlZGl0b3Iuc2V0T3B0aW9uKCJleHRyYUtleXMiLCB7VGFiOiBmdW5jdGlvbihjbSkgeyBjbS5yZXBsYWNlU2VsZWN0aW9uKCIgICAgIiwgImVuZCIpOyB9fSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZWRpdG9yLnNldE9wdGlvbigiZXh0cmFLZXlzIiwge1RhYjogZnVuY3Rpb24oY20pIHsgY20ucmVwbGFjZVNlbGVjdGlvbigiICAgICIsICJlbmQiKTsgfX0pOwogICAgICAgIH0KICAgICAgfQogICAgPC9zY3JpcHQ+CiAgPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/coffeescript/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/coffeescript/coffeescript.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovKioKICogTGluayB0byB0aGUgcHJvamVjdCdzIEdpdEh1YiBwYWdlOgogKiBodHRwczovL2dpdGh1Yi5jb20vcGlja2hhcmR0L2NvZmZlZXNjcmlwdC1jb2RlbWlycm9yLW1vZGUKICovCihmdW5jdGlvbihtb2QpIHsKICBpZiAodHlwZW9mIGV4cG9ydHMgPT0gIm9iamVjdCIgJiYgdHlwZW9mIG1vZHVsZSA9PSAib2JqZWN0IikgLy8gQ29tbW9uSlMKICAgIG1vZChyZXF1aXJlKCIuLi8uLi9saWIvY29kZW1pcnJvciIpKTsKICBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCkgLy8gQU1ECiAgICBkZWZpbmUoWyIuLi8uLi9saWIvY29kZW1pcnJvciJdLCBtb2QpOwogIGVsc2UgLy8gUGxhaW4gYnJvd3NlciBlbnYKICAgIG1vZChDb2RlTWlycm9yKTsKfSkoZnVuY3Rpb24oQ29kZU1pcnJvcikgewoidXNlIHN0cmljdCI7CgpDb2RlTWlycm9yLmRlZmluZU1vZGUoImNvZmZlZXNjcmlwdCIsIGZ1bmN0aW9uKGNvbmYsIHBhcnNlckNvbmYpIHsKICB2YXIgRVJST1JDTEFTUyA9ICJlcnJvciI7CgogIGZ1bmN0aW9uIHdvcmRSZWdleHAod29yZHMpIHsKICAgIHJldHVybiBuZXcgUmVnRXhwKCJeKCgiICsgd29yZHMuam9pbigiKXwoIikgKyAiKSlcXGIiKTsKICB9CgogIHZhciBvcGVyYXRvcnMgPSAvXig/Oi0+fD0+fFwrWys9XT98LVtcLT1dP3xcKltcKj1dP3xcL1tcLz1dP3xbPSFdPXw8Wz48XT89P3w+Pj89P3wlPT98Jj0/fFx8PT98XF49P3xcfnwhfFw/fChvcnxhbmR8XHxcfHwmJnxcPyk9KS87CiAgdmFyIGRlbGltaXRlcnMgPSAvXig/OlsoKVxbXF17fSw6YD07XXxcLlwuP1wuPykvOwogIHZhciBpZGVudGlmaWVycyA9IC9eW19BLVphLXokXVtfQS1aYS16JDAtOV0qLzsKICB2YXIgYXRQcm9wID0gL15AW19BLVphLXokXVtfQS1aYS16JDAtOV0qLzsKCiAgdmFyIHdvcmRPcGVyYXRvcnMgPSB3b3JkUmVnZXhwKFsiYW5kIiwgIm9yIiwgIm5vdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaXMiLCAiaXNudCIsICJpbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5zdGFuY2VvZiIsICJ0eXBlb2YiXSk7CiAgdmFyIGluZGVudEtleXdvcmRzID0gWyJmb3IiLCAid2hpbGUiLCAibG9vcCIsICJpZiIsICJ1bmxlc3MiLCAiZWxzZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJzd2l0Y2giLCAidHJ5IiwgImNhdGNoIiwgImZpbmFsbHkiLCAiY2xhc3MiXTsKICB2YXIgY29tbW9uS2V5d29yZHMgPSBbImJyZWFrIiwgImJ5IiwgImNvbnRpbnVlIiwgImRlYnVnZ2VyIiwgImRlbGV0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJkbyIsICJpbiIsICJvZiIsICJuZXciLCAicmV0dXJuIiwgInRoZW4iLAogICAgICAgICAgICAgICAgICAgICAgICAidGhpcyIsICJAIiwgInRocm93IiwgIndoZW4iLCAidW50aWwiLCAiZXh0ZW5kcyJdOwoKICB2YXIga2V5d29yZHMgPSB3b3JkUmVnZXhwKGluZGVudEtleXdvcmRzLmNvbmNhdChjb21tb25LZXl3b3JkcykpOwoKICBpbmRlbnRLZXl3b3JkcyA9IHdvcmRSZWdleHAoaW5kZW50S2V5d29yZHMpOwoKCiAgdmFyIHN0cmluZ1ByZWZpeGVzID0gL14oJ3szfXxcInszfXxbJ1wiXSkvOwogIHZhciByZWdleFByZWZpeGVzID0gL14oXC97M318XC8pLzsKICB2YXIgY29tbW9uQ29uc3RhbnRzID0gWyJJbmZpbml0eSIsICJOYU4iLCAidW5kZWZpbmVkIiwgIm51bGwiLCAidHJ1ZSIsICJmYWxzZSIsICJvbiIsICJvZmYiLCAieWVzIiwgIm5vIl07CiAgdmFyIGNvbnN0YW50cyA9IHdvcmRSZWdleHAoY29tbW9uQ29uc3RhbnRzKTsKCiAgLy8gVG9rZW5pemVycwogIGZ1bmN0aW9uIHRva2VuQmFzZShzdHJlYW0sIHN0YXRlKSB7CiAgICAvLyBIYW5kbGUgc2NvcGUgY2hhbmdlcwogICAgaWYgKHN0cmVhbS5zb2woKSkgewogICAgICBpZiAoc3RhdGUuc2NvcGUuYWxpZ24gPT09IG51bGwpIHN0YXRlLnNjb3BlLmFsaWduID0gZmFsc2U7CiAgICAgIHZhciBzY29wZU9mZnNldCA9IHN0YXRlLnNjb3BlLm9mZnNldDsKICAgICAgaWYgKHN0cmVhbS5lYXRTcGFjZSgpKSB7CiAgICAgICAgdmFyIGxpbmVPZmZzZXQgPSBzdHJlYW0uaW5kZW50YXRpb24oKTsKICAgICAgICBpZiAobGluZU9mZnNldCA+IHNjb3BlT2Zmc2V0ICYmIHN0YXRlLnNjb3BlLnR5cGUgPT0gImNvZmZlZSIpIHsKICAgICAgICAgIHJldHVybiAiaW5kZW50IjsKICAgICAgICB9IGVsc2UgaWYgKGxpbmVPZmZzZXQgPCBzY29wZU9mZnNldCkgewogICAgICAgICAgcmV0dXJuICJkZWRlbnQiOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoc2NvcGVPZmZzZXQgPiAwKSB7CiAgICAgICAgICBkZWRlbnQoc3RyZWFtLCBzdGF0ZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBpZiAoc3RyZWFtLmVhdFNwYWNlKCkpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgdmFyIGNoID0gc3RyZWFtLnBlZWsoKTsKCiAgICAvLyBIYW5kbGUgZG9jY28gdGl0bGUgY29tbWVudCAoc2luZ2xlIGxpbmUpCiAgICBpZiAoc3RyZWFtLm1hdGNoKCIjIyMjIikpIHsKICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICByZXR1cm4gImNvbW1lbnQiOwogICAgfQoKICAgIC8vIEhhbmRsZSBtdWx0aSBsaW5lIGNvbW1lbnRzCiAgICBpZiAoc3RyZWFtLm1hdGNoKCIjIyMiKSkgewogICAgICBzdGF0ZS50b2tlbml6ZSA9IGxvbmdDb21tZW50OwogICAgICByZXR1cm4gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CiAgICB9CgogICAgLy8gU2luZ2xlIGxpbmUgY29tbWVudAogICAgaWYgKGNoID09PSAiIyIpIHsKICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICByZXR1cm4gImNvbW1lbnQiOwogICAgfQoKICAgIC8vIEhhbmRsZSBudW1iZXIgbGl0ZXJhbHMKICAgIGlmIChzdHJlYW0ubWF0Y2goL14tP1swLTlcLl0vLCBmYWxzZSkpIHsKICAgICAgdmFyIGZsb2F0TGl0ZXJhbCA9IGZhbHNlOwogICAgICAvLyBGbG9hdHMKICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXi0/XGQqXC5cZCsoZVtcK1wtXT9cZCspPy9pKSkgewogICAgICAgIGZsb2F0TGl0ZXJhbCA9IHRydWU7CiAgICAgIH0KICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXi0/XGQrXC5cZCovKSkgewogICAgICAgIGZsb2F0TGl0ZXJhbCA9IHRydWU7CiAgICAgIH0KICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXi0/XC5cZCsvKSkgewogICAgICAgIGZsb2F0TGl0ZXJhbCA9IHRydWU7CiAgICAgIH0KCiAgICAgIGlmIChmbG9hdExpdGVyYWwpIHsKICAgICAgICAvLyBwcmV2ZW50IGZyb20gZ2V0dGluZyBleHRyYSAuIG9uIDEuLgogICAgICAgIGlmIChzdHJlYW0ucGVlaygpID09ICIuIil7CiAgICAgICAgICBzdHJlYW0uYmFja1VwKDEpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gIm51bWJlciI7CiAgICAgIH0KICAgICAgLy8gSW50ZWdlcnMKICAgICAgdmFyIGludExpdGVyYWwgPSBmYWxzZTsKICAgICAgLy8gSGV4CiAgICAgIGlmIChzdHJlYW0ubWF0Y2goL14tPzB4WzAtOWEtZl0rL2kpKSB7CiAgICAgICAgaW50TGl0ZXJhbCA9IHRydWU7CiAgICAgIH0KICAgICAgLy8gRGVjaW1hbAogICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eLT9bMS05XVxkKihlW1wrXC1dP1xkKyk/LykpIHsKICAgICAgICBpbnRMaXRlcmFsID0gdHJ1ZTsKICAgICAgfQogICAgICAvLyBaZXJvIGJ5IGl0c2VsZiB3aXRoIG5vIG90aGVyIHBpZWNlIG9mIG51bWJlci4KICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXi0/MCg/IVtcZHhdKS9pKSkgewogICAgICAgIGludExpdGVyYWwgPSB0cnVlOwogICAgICB9CiAgICAgIGlmIChpbnRMaXRlcmFsKSB7CiAgICAgICAgcmV0dXJuICJudW1iZXIiOwogICAgICB9CiAgICB9CgogICAgLy8gSGFuZGxlIHN0cmluZ3MKICAgIGlmIChzdHJlYW0ubWF0Y2goc3RyaW5nUHJlZml4ZXMpKSB7CiAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5GYWN0b3J5KHN0cmVhbS5jdXJyZW50KCksIGZhbHNlLCAic3RyaW5nIik7CiAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgIH0KICAgIC8vIEhhbmRsZSByZWdleCBsaXRlcmFscwogICAgaWYgKHN0cmVhbS5tYXRjaChyZWdleFByZWZpeGVzKSkgewogICAgICBpZiAoc3RyZWFtLmN1cnJlbnQoKSAhPSAiLyIgfHwgc3RyZWFtLm1hdGNoKC9eLipcLy8sIGZhbHNlKSkgeyAvLyBwcmV2ZW50IGhpZ2hsaWdodCBvZiBkaXZpc2lvbgogICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5GYWN0b3J5KHN0cmVhbS5jdXJyZW50KCksIHRydWUsICJzdHJpbmctMiIpOwogICAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzdHJlYW0uYmFja1VwKDEpOwogICAgICB9CiAgICB9CgoKCiAgICAvLyBIYW5kbGUgb3BlcmF0b3JzIGFuZCBkZWxpbWl0ZXJzCiAgICBpZiAoc3RyZWFtLm1hdGNoKG9wZXJhdG9ycykgfHwgc3RyZWFtLm1hdGNoKHdvcmRPcGVyYXRvcnMpKSB7CiAgICAgIHJldHVybiAib3BlcmF0b3IiOwogICAgfQogICAgaWYgKHN0cmVhbS5tYXRjaChkZWxpbWl0ZXJzKSkgewogICAgICByZXR1cm4gInB1bmN0dWF0aW9uIjsKICAgIH0KCiAgICBpZiAoc3RyZWFtLm1hdGNoKGNvbnN0YW50cykpIHsKICAgICAgcmV0dXJuICJhdG9tIjsKICAgIH0KCiAgICBpZiAoc3RyZWFtLm1hdGNoKGF0UHJvcCkgfHwgc3RhdGUucHJvcCAmJiBzdHJlYW0ubWF0Y2goaWRlbnRpZmllcnMpKSB7CiAgICAgIHJldHVybiAicHJvcGVydHkiOwogICAgfQoKICAgIGlmIChzdHJlYW0ubWF0Y2goa2V5d29yZHMpKSB7CiAgICAgIHJldHVybiAia2V5d29yZCI7CiAgICB9CgogICAgaWYgKHN0cmVhbS5tYXRjaChpZGVudGlmaWVycykpIHsKICAgICAgcmV0dXJuICJ2YXJpYWJsZSI7CiAgICB9CgogICAgLy8gSGFuZGxlIG5vbi1kZXRlY3RlZCBpdGVtcwogICAgc3RyZWFtLm5leHQoKTsKICAgIHJldHVybiBFUlJPUkNMQVNTOwogIH0KCiAgZnVuY3Rpb24gdG9rZW5GYWN0b3J5KGRlbGltaXRlciwgc2luZ2xlbGluZSwgb3V0Y2xhc3MpIHsKICAgIHJldHVybiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHdoaWxlICghc3RyZWFtLmVvbCgpKSB7CiAgICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXiciXC9cXF0vKTsKICAgICAgICBpZiAoc3RyZWFtLmVhdCgiXFwiKSkgewogICAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgICAgIGlmIChzaW5nbGVsaW5lICYmIHN0cmVhbS5lb2woKSkgewogICAgICAgICAgICByZXR1cm4gb3V0Y2xhc3M7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChzdHJlYW0ubWF0Y2goZGVsaW1pdGVyKSkgewogICAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICAgICAgICByZXR1cm4gb3V0Y2xhc3M7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHN0cmVhbS5lYXQoL1snIlwvXS8pOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoc2luZ2xlbGluZSkgewogICAgICAgIGlmIChwYXJzZXJDb25mLnNpbmdsZUxpbmVTdHJpbmdFcnJvcnMpIHsKICAgICAgICAgIG91dGNsYXNzID0gRVJST1JDTEFTUzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBvdXRjbGFzczsKICAgIH07CiAgfQoKICBmdW5jdGlvbiBsb25nQ29tbWVudChzdHJlYW0sIHN0YXRlKSB7CiAgICB3aGlsZSAoIXN0cmVhbS5lb2woKSkgewogICAgICBzdHJlYW0uZWF0V2hpbGUoL1teI10vKTsKICAgICAgaWYgKHN0cmVhbS5tYXRjaCgiIyMjIikpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBzdHJlYW0uZWF0V2hpbGUoIiMiKTsKICAgIH0KICAgIHJldHVybiAiY29tbWVudCI7CiAgfQoKICBmdW5jdGlvbiBpbmRlbnQoc3RyZWFtLCBzdGF0ZSwgdHlwZSkgewogICAgdHlwZSA9IHR5cGUgfHwgImNvZmZlZSI7CiAgICB2YXIgb2Zmc2V0ID0gMCwgYWxpZ24gPSBmYWxzZSwgYWxpZ25PZmZzZXQgPSBudWxsOwogICAgZm9yICh2YXIgc2NvcGUgPSBzdGF0ZS5zY29wZTsgc2NvcGU7IHNjb3BlID0gc2NvcGUucHJldikgewogICAgICBpZiAoc2NvcGUudHlwZSA9PT0gImNvZmZlZSIgfHwgc2NvcGUudHlwZSA9PSAifSIpIHsKICAgICAgICBvZmZzZXQgPSBzY29wZS5vZmZzZXQgKyBjb25mLmluZGVudFVuaXQ7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIGlmICh0eXBlICE9PSAiY29mZmVlIikgewogICAgICBhbGlnbiA9IG51bGw7CiAgICAgIGFsaWduT2Zmc2V0ID0gc3RyZWFtLmNvbHVtbigpICsgc3RyZWFtLmN1cnJlbnQoKS5sZW5ndGg7CiAgICB9IGVsc2UgaWYgKHN0YXRlLnNjb3BlLmFsaWduKSB7CiAgICAgIHN0YXRlLnNjb3BlLmFsaWduID0gZmFsc2U7CiAgICB9CiAgICBzdGF0ZS5zY29wZSA9IHsKICAgICAgb2Zmc2V0OiBvZmZzZXQsCiAgICAgIHR5cGU6IHR5cGUsCiAgICAgIHByZXY6IHN0YXRlLnNjb3BlLAogICAgICBhbGlnbjogYWxpZ24sCiAgICAgIGFsaWduT2Zmc2V0OiBhbGlnbk9mZnNldAogICAgfTsKICB9CgogIGZ1bmN0aW9uIGRlZGVudChzdHJlYW0sIHN0YXRlKSB7CiAgICBpZiAoIXN0YXRlLnNjb3BlLnByZXYpIHJldHVybjsKICAgIGlmIChzdGF0ZS5zY29wZS50eXBlID09PSAiY29mZmVlIikgewogICAgICB2YXIgX2luZGVudCA9IHN0cmVhbS5pbmRlbnRhdGlvbigpOwogICAgICB2YXIgbWF0Y2hlZCA9IGZhbHNlOwogICAgICBmb3IgKHZhciBzY29wZSA9IHN0YXRlLnNjb3BlOyBzY29wZTsgc2NvcGUgPSBzY29wZS5wcmV2KSB7CiAgICAgICAgaWYgKF9pbmRlbnQgPT09IHNjb3BlLm9mZnNldCkgewogICAgICAgICAgbWF0Y2hlZCA9IHRydWU7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKCFtYXRjaGVkKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgd2hpbGUgKHN0YXRlLnNjb3BlLnByZXYgJiYgc3RhdGUuc2NvcGUub2Zmc2V0ICE9PSBfaW5kZW50KSB7CiAgICAgICAgc3RhdGUuc2NvcGUgPSBzdGF0ZS5zY29wZS5wcmV2OwogICAgICB9CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0gZWxzZSB7CiAgICAgIHN0YXRlLnNjb3BlID0gc3RhdGUuc2NvcGUucHJldjsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogIH0KCiAgZnVuY3Rpb24gdG9rZW5MZXhlcihzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgc3R5bGUgPSBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgIHZhciBjdXJyZW50ID0gc3RyZWFtLmN1cnJlbnQoKTsKCiAgICAvLyBIYW5kbGUgc2NvcGUgY2hhbmdlcy4KICAgIGlmIChjdXJyZW50ID09PSAicmV0dXJuIikgewogICAgICBzdGF0ZS5kZWRlbnQgPSB0cnVlOwogICAgfQogICAgaWYgKCgoY3VycmVudCA9PT0gIi0+IiB8fCBjdXJyZW50ID09PSAiPT4iKSAmJiBzdHJlYW0uZW9sKCkpCiAgICAgICAgfHwgc3R5bGUgPT09ICJpbmRlbnQiKSB7CiAgICAgIGluZGVudChzdHJlYW0sIHN0YXRlKTsKICAgIH0KICAgIHZhciBkZWxpbWl0ZXJfaW5kZXggPSAiWyh7Ii5pbmRleE9mKGN1cnJlbnQpOwogICAgaWYgKGRlbGltaXRlcl9pbmRleCAhPT0gLTEpIHsKICAgICAgaW5kZW50KHN0cmVhbSwgc3RhdGUsICJdKX0iLnNsaWNlKGRlbGltaXRlcl9pbmRleCwgZGVsaW1pdGVyX2luZGV4KzEpKTsKICAgIH0KICAgIGlmIChpbmRlbnRLZXl3b3Jkcy5leGVjKGN1cnJlbnQpKXsKICAgICAgaW5kZW50KHN0cmVhbSwgc3RhdGUpOwogICAgfQogICAgaWYgKGN1cnJlbnQgPT0gInRoZW4iKXsKICAgICAgZGVkZW50KHN0cmVhbSwgc3RhdGUpOwogICAgfQoKCiAgICBpZiAoc3R5bGUgPT09ICJkZWRlbnQiKSB7CiAgICAgIGlmIChkZWRlbnQoc3RyZWFtLCBzdGF0ZSkpIHsKICAgICAgICByZXR1cm4gRVJST1JDTEFTUzsKICAgICAgfQogICAgfQogICAgZGVsaW1pdGVyX2luZGV4ID0gIl0pfSIuaW5kZXhPZihjdXJyZW50KTsKICAgIGlmIChkZWxpbWl0ZXJfaW5kZXggIT09IC0xKSB7CiAgICAgIHdoaWxlIChzdGF0ZS5zY29wZS50eXBlID09ICJjb2ZmZWUiICYmIHN0YXRlLnNjb3BlLnByZXYpCiAgICAgICAgc3RhdGUuc2NvcGUgPSBzdGF0ZS5zY29wZS5wcmV2OwogICAgICBpZiAoc3RhdGUuc2NvcGUudHlwZSA9PSBjdXJyZW50KQogICAgICAgIHN0YXRlLnNjb3BlID0gc3RhdGUuc2NvcGUucHJldjsKICAgIH0KICAgIGlmIChzdGF0ZS5kZWRlbnQgJiYgc3RyZWFtLmVvbCgpKSB7CiAgICAgIGlmIChzdGF0ZS5zY29wZS50eXBlID09ICJjb2ZmZWUiICYmIHN0YXRlLnNjb3BlLnByZXYpCiAgICAgICAgc3RhdGUuc2NvcGUgPSBzdGF0ZS5zY29wZS5wcmV2OwogICAgICBzdGF0ZS5kZWRlbnQgPSBmYWxzZTsKICAgIH0KCiAgICByZXR1cm4gc3R5bGU7CiAgfQoKICB2YXIgZXh0ZXJuYWwgPSB7CiAgICBzdGFydFN0YXRlOiBmdW5jdGlvbihiYXNlY29sdW1uKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgdG9rZW5pemU6IHRva2VuQmFzZSwKICAgICAgICBzY29wZToge29mZnNldDpiYXNlY29sdW1uIHx8IDAsIHR5cGU6ImNvZmZlZSIsIHByZXY6IG51bGwsIGFsaWduOiBmYWxzZX0sCiAgICAgICAgcHJvcDogZmFsc2UsCiAgICAgICAgZGVkZW50OiAwCiAgICAgIH07CiAgICB9LAoKICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHZhciBmaWxsQWxpZ24gPSBzdGF0ZS5zY29wZS5hbGlnbiA9PT0gbnVsbCAmJiBzdGF0ZS5zY29wZTsKICAgICAgaWYgKGZpbGxBbGlnbiAmJiBzdHJlYW0uc29sKCkpIGZpbGxBbGlnbi5hbGlnbiA9IGZhbHNlOwoKICAgICAgdmFyIHN0eWxlID0gdG9rZW5MZXhlcihzdHJlYW0sIHN0YXRlKTsKICAgICAgaWYgKHN0eWxlICYmIHN0eWxlICE9ICJjb21tZW50IikgewogICAgICAgIGlmIChmaWxsQWxpZ24pIGZpbGxBbGlnbi5hbGlnbiA9IHRydWU7CiAgICAgICAgc3RhdGUucHJvcCA9IHN0eWxlID09ICJwdW5jdHVhdGlvbiIgJiYgc3RyZWFtLmN1cnJlbnQoKSA9PSAiLiIKICAgICAgfQoKICAgICAgcmV0dXJuIHN0eWxlOwogICAgfSwKCiAgICBpbmRlbnQ6IGZ1bmN0aW9uKHN0YXRlLCB0ZXh0KSB7CiAgICAgIGlmIChzdGF0ZS50b2tlbml6ZSAhPSB0b2tlbkJhc2UpIHJldHVybiAwOwogICAgICB2YXIgc2NvcGUgPSBzdGF0ZS5zY29wZTsKICAgICAgdmFyIGNsb3NlciA9IHRleHQgJiYgIl0pfSIuaW5kZXhPZih0ZXh0LmNoYXJBdCgwKSkgPiAtMTsKICAgICAgaWYgKGNsb3Nlcikgd2hpbGUgKHNjb3BlLnR5cGUgPT0gImNvZmZlZSIgJiYgc2NvcGUucHJldikgc2NvcGUgPSBzY29wZS5wcmV2OwogICAgICB2YXIgY2xvc2VzID0gY2xvc2VyICYmIHNjb3BlLnR5cGUgPT09IHRleHQuY2hhckF0KDApOwogICAgICBpZiAoc2NvcGUuYWxpZ24pCiAgICAgICAgcmV0dXJuIHNjb3BlLmFsaWduT2Zmc2V0IC0gKGNsb3NlcyA/IDEgOiAwKTsKICAgICAgZWxzZQogICAgICAgIHJldHVybiAoY2xvc2VzID8gc2NvcGUucHJldiA6IHNjb3BlKS5vZmZzZXQ7CiAgICB9LAoKICAgIGxpbmVDb21tZW50OiAiIyIsCiAgICBmb2xkOiAiaW5kZW50IgogIH07CiAgcmV0dXJuIGV4dGVybmFsOwp9KTsKCkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC94LWNvZmZlZXNjcmlwdCIsICJjb2ZmZWVzY3JpcHQiKTsKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L2NvZmZlZXNjcmlwdCIsICJjb2ZmZWVzY3JpcHQiKTsKCn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/coffeescript/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogQ29mZmVlU2NyaXB0IG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iY29mZmVlc2NyaXB0LmpzIj48L3NjcmlwdD4KPHN0eWxlPi5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgc2lsdmVyOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgc2lsdmVyO308L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxoMT5Db2RlTWlycm9yPC9oMT48aW1nIGlkPWxvZ28gc3JjPSIuLi8uLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5MYW5ndWFnZSBtb2RlczwvYT4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+Q29mZmVlU2NyaXB0PC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5Db2ZmZWVTY3JpcHQgbW9kZTwvaDI+Cjxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+CiMgQ29mZmVlU2NyaXB0IG1vZGUgZm9yIENvZGVNaXJyb3IKIyBDb3B5cmlnaHQgKGMpIDIwMTEgSmVmZiBQaWNraGFyZHQsIHJlbGVhc2VkIHVuZGVyCiMgdGhlIE1JVCBMaWNlbnNlLgojCiMgTW9kaWZpZWQgZnJvbSB0aGUgUHl0aG9uIENvZGVNaXJyb3IgbW9kZSwgd2hpY2ggYWxzbyBpcyAKIyB1bmRlciB0aGUgTUlUIExpY2Vuc2UgQ29weXJpZ2h0IChjKSAyMDEwIFRpbW90aHkgRmFycmVsbC4KIwojIFRoZSBmb2xsb3dpbmcgc2NyaXB0LCBVbmRlcnNjb3JlLmNvZmZlZSwgaXMgdXNlZCB0byAKIyBkZW1vbnN0cmF0ZSBDb2ZmZWVTY3JpcHQgbW9kZSBmb3IgQ29kZU1pcnJvci4KIwojIFRvIGRvd25sb2FkIENvZmZlZVNjcmlwdCBtb2RlIGZvciBDb2RlTWlycm9yLCBnbyB0bzoKIyBodHRwczovL2dpdGh1Yi5jb20vcGlja2hhcmR0L2NvZmZlZXNjcmlwdC1jb2RlbWlycm9yLW1vZGUKCiMgKipVbmRlcnNjb3JlLmNvZmZlZQojIChjKSAyMDExIEplcmVteSBBc2hrZW5hcywgRG9jdW1lbnRDbG91ZCBJbmMuKioKIyBVbmRlcnNjb3JlIGlzIGZyZWVseSBkaXN0cmlidXRhYmxlIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUKIyBbTUlUIGxpY2Vuc2VdKGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTUlUX0xpY2Vuc2UpLgojIFBvcnRpb25zIG9mIFVuZGVyc2NvcmUgYXJlIGluc3BpcmVkIGJ5IG9yIGJvcnJvd2VkIGZyb20KIyBbUHJvdG90eXBlLmpzXShodHRwOi8vcHJvdG90eXBlanMub3JnL2FwaSksIE9saXZlciBTdGVlbGUncwojIFtGdW5jdGlvbmFsXShodHRwOi8vb3N0ZWVsZS5jb20pLCBhbmQgSm9obiBSZXNpZydzCiMgW01pY3JvLVRlbXBsYXRpbmddKGh0dHA6Ly9lam9obi5vcmcpLgojIEZvciBhbGwgZGV0YWlscyBhbmQgZG9jdW1lbnRhdGlvbjoKIyBodHRwOi8vZG9jdW1lbnRjbG91ZC5naXRodWIuY29tL3VuZGVyc2NvcmUvCgoKIyBCYXNlbGluZSBzZXR1cAojIC0tLS0tLS0tLS0tLS0tCgojIEVzdGFibGlzaCB0aGUgcm9vdCBvYmplY3QsIGB3aW5kb3dgIGluIHRoZSBicm93c2VyLCBvciBgZ2xvYmFsYCBvbiB0aGUgc2VydmVyLgpyb290ID0gdGhpcwoKCiMgU2F2ZSB0aGUgcHJldmlvdXMgdmFsdWUgb2YgdGhlIGBfYCB2YXJpYWJsZS4KcHJldmlvdXNVbmRlcnNjb3JlID0gcm9vdC5fCgojIyMgTXVsdGlsaW5lCiAgICBjb21tZW50CiMjIwoKIyBFc3RhYmxpc2ggdGhlIG9iamVjdCB0aGF0IGdldHMgdGhyb3duIHRvIGJyZWFrIG91dCBvZiBhIGxvb3AgaXRlcmF0aW9uLgojIGBTdG9wSXRlcmF0aW9uYCBpcyBTT1Agb24gTW96aWxsYS4KYnJlYWtlciA9IGlmIHR5cGVvZihTdG9wSXRlcmF0aW9uKSBpcyAndW5kZWZpbmVkJyB0aGVuICdfX2JyZWFrX18nIGVsc2UgU3RvcEl0ZXJhdGlvbgoKCiMjIyMgRG9jY28gc3R5bGUgc2luZ2xlIGxpbmUgY29tbWVudCAodGl0bGUpCgoKIyBIZWxwZXIgZnVuY3Rpb24gdG8gZXNjYXBlICoqUmVnRXhwKiogY29udGVudHMsIGJlY2F1c2UgSlMgZG9lc24ndCBoYXZlIG9uZS4KZXNjYXBlUmVnRXhwID0gKHN0cmluZykgLT4gc3RyaW5nLnJlcGxhY2UoLyhbLiorP14ke30oKXxbXF1cL1xcXSkvZywgJ1xcJDEnKQoKCiMgU2F2ZSBieXRlcyBpbiB0aGUgbWluaWZpZWQgKGJ1dCBub3QgZ3ppcHBlZCkgdmVyc2lvbjoKQXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZQpPYmpQcm90byA9IE9iamVjdC5wcm90b3R5cGUKCgojIENyZWF0ZSBxdWljayByZWZlcmVuY2UgdmFyaWFibGVzIGZvciBzcGVlZCBhY2Nlc3MgdG8gY29yZSBwcm90b3R5cGVzLgpzbGljZSA9IEFycmF5UHJvdG8uc2xpY2UKdW5zaGlmdCA9IEFycmF5UHJvdG8udW5zaGlmdAp0b1N0cmluZyA9IE9ialByb3RvLnRvU3RyaW5nCmhhc093blByb3BlcnR5ID0gT2JqUHJvdG8uaGFzT3duUHJvcGVydHkKcHJvcGVydHlJc0VudW1lcmFibGUgPSBPYmpQcm90by5wcm9wZXJ0eUlzRW51bWVyYWJsZQoKCiMgQWxsICoqRUNNQTUqKiBuYXRpdmUgaW1wbGVtZW50YXRpb25zIHdlIGhvcGUgdG8gdXNlIGFyZSBkZWNsYXJlZCBoZXJlLgpuYXRpdmVGb3JFYWNoID0gQXJyYXlQcm90by5mb3JFYWNoCm5hdGl2ZU1hcCA9IEFycmF5UHJvdG8ubWFwCm5hdGl2ZVJlZHVjZSA9IEFycmF5UHJvdG8ucmVkdWNlCm5hdGl2ZVJlZHVjZVJpZ2h0ID0gQXJyYXlQcm90by5yZWR1Y2VSaWdodApuYXRpdmVGaWx0ZXIgPSBBcnJheVByb3RvLmZpbHRlcgpuYXRpdmVFdmVyeSA9IEFycmF5UHJvdG8uZXZlcnkKbmF0aXZlU29tZSA9IEFycmF5UHJvdG8uc29tZQpuYXRpdmVJbmRleE9mID0gQXJyYXlQcm90by5pbmRleE9mCm5hdGl2ZUxhc3RJbmRleE9mID0gQXJyYXlQcm90by5sYXN0SW5kZXhPZgpuYXRpdmVJc0FycmF5ID0gQXJyYXkuaXNBcnJheQpuYXRpdmVLZXlzID0gT2JqZWN0LmtleXMKCgojIENyZWF0ZSBhIHNhZmUgcmVmZXJlbmNlIHRvIHRoZSBVbmRlcnNjb3JlIG9iamVjdCBmb3IgdXNlIGJlbG93LgpfID0gKG9iaikgLT4gbmV3IHdyYXBwZXIob2JqKQoKCiMgRXhwb3J0IHRoZSBVbmRlcnNjb3JlIG9iamVjdCBmb3IgKipDb21tb25KUyoqLgppZiB0eXBlb2YoZXhwb3J0cykgIT0gJ3VuZGVmaW5lZCcgdGhlbiBleHBvcnRzLl8gPSBfCgoKIyBFeHBvcnQgVW5kZXJzY29yZSB0byBnbG9iYWwgc2NvcGUuCnJvb3QuXyA9IF8KCgojIEN1cnJlbnQgdmVyc2lvbi4KXy5WRVJTSU9OID0gJzEuMS4wJwoKCiMgQ29sbGVjdGlvbiBGdW5jdGlvbnMKIyAtLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyBUaGUgY29ybmVyc3RvbmUsIGFuICoqZWFjaCoqIGltcGxlbWVudGF0aW9uLgojIEhhbmRsZXMgb2JqZWN0cyBpbXBsZW1lbnRpbmcgKipmb3JFYWNoKiosIGFycmF5cywgYW5kIHJhdyBvYmplY3RzLgpfLmVhY2ggPSAob2JqLCBpdGVyYXRvciwgY29udGV4dCkgLT4KICB0cnkKICAgIGlmIG5hdGl2ZUZvckVhY2ggYW5kIG9iai5mb3JFYWNoIGlzIG5hdGl2ZUZvckVhY2gKICAgICAgb2JqLmZvckVhY2ggaXRlcmF0b3IsIGNvbnRleHQKICAgIGVsc2UgaWYgXy5pc051bWJlciBvYmoubGVuZ3RoCiAgICAgIGl0ZXJhdG9yLmNhbGwgY29udGV4dCwgb2JqW2ldLCBpLCBvYmogZm9yIGkgaW4gWzAuLi5vYmoubGVuZ3RoXQogICAgZWxzZQogICAgICBpdGVyYXRvci5jYWxsIGNvbnRleHQsIHZhbCwga2V5LCBvYmogZm9yIG93biBrZXksIHZhbCBvZiBvYmoKICBjYXRjaCBlCiAgICB0aHJvdyBlIGlmIGUgaXNudCBicmVha2VyCiAgb2JqCgoKIyBSZXR1cm4gdGhlIHJlc3VsdHMgb2YgYXBwbHlpbmcgdGhlIGl0ZXJhdG9yIHRvIGVhY2ggZWxlbWVudC4gVXNlIEphdmFTY3JpcHQKIyAxLjYncyB2ZXJzaW9uIG9mICoqbWFwKiosIGlmIHBvc3NpYmxlLgpfLm1hcCA9IChvYmosIGl0ZXJhdG9yLCBjb250ZXh0KSAtPgogIHJldHVybiBvYmoubWFwKGl0ZXJhdG9yLCBjb250ZXh0KSBpZiBuYXRpdmVNYXAgYW5kIG9iai5tYXAgaXMgbmF0aXZlTWFwCiAgcmVzdWx0cyA9IFtdCiAgXy5lYWNoIG9iaiwgKHZhbHVlLCBpbmRleCwgbGlzdCkgLT4KICAgIHJlc3VsdHMucHVzaCBpdGVyYXRvci5jYWxsIGNvbnRleHQsIHZhbHVlLCBpbmRleCwgbGlzdAogIHJlc3VsdHMKCgojICoqUmVkdWNlKiogYnVpbGRzIHVwIGEgc2luZ2xlIHJlc3VsdCBmcm9tIGEgbGlzdCBvZiB2YWx1ZXMuIEFsc28ga25vd24gYXMKIyAqKmluamVjdCoqLCBvciAqKmZvbGRsKiouIFVzZXMgSmF2YVNjcmlwdCAxLjgncyB2ZXJzaW9uIG9mICoqcmVkdWNlKiosIGlmIHBvc3NpYmxlLgpfLnJlZHVjZSA9IChvYmosIGl0ZXJhdG9yLCBtZW1vLCBjb250ZXh0KSAtPgogIGlmIG5hdGl2ZVJlZHVjZSBhbmQgb2JqLnJlZHVjZSBpcyBuYXRpdmVSZWR1Y2UKICAgIGl0ZXJhdG9yID0gXy5iaW5kIGl0ZXJhdG9yLCBjb250ZXh0IGlmIGNvbnRleHQKICAgIHJldHVybiBvYmoucmVkdWNlIGl0ZXJhdG9yLCBtZW1vCiAgXy5lYWNoIG9iaiwgKHZhbHVlLCBpbmRleCwgbGlzdCkgLT4KICAgIG1lbW8gPSBpdGVyYXRvci5jYWxsIGNvbnRleHQsIG1lbW8sIHZhbHVlLCBpbmRleCwgbGlzdAogIG1lbW8KCgojIFRoZSByaWdodC1hc3NvY2lhdGl2ZSB2ZXJzaW9uIG9mICoqcmVkdWNlKiosIGFsc28ga25vd24gYXMgKipmb2xkcioqLiBVc2VzCiMgSmF2YVNjcmlwdCAxLjgncyB2ZXJzaW9uIG9mICoqcmVkdWNlUmlnaHQqKiwgaWYgYXZhaWxhYmxlLgpfLnJlZHVjZVJpZ2h0ID0gKG9iaiwgaXRlcmF0b3IsIG1lbW8sIGNvbnRleHQpIC0+CiAgaWYgbmF0aXZlUmVkdWNlUmlnaHQgYW5kIG9iai5yZWR1Y2VSaWdodCBpcyBuYXRpdmVSZWR1Y2VSaWdodAogICAgaXRlcmF0b3IgPSBfLmJpbmQgaXRlcmF0b3IsIGNvbnRleHQgaWYgY29udGV4dAogICAgcmV0dXJuIG9iai5yZWR1Y2VSaWdodCBpdGVyYXRvciwgbWVtbwogIHJldmVyc2VkID0gXy5jbG9uZShfLnRvQXJyYXkob2JqKSkucmV2ZXJzZSgpCiAgXy5yZWR1Y2UgcmV2ZXJzZWQsIGl0ZXJhdG9yLCBtZW1vLCBjb250ZXh0CgoKIyBSZXR1cm4gdGhlIGZpcnN0IHZhbHVlIHdoaWNoIHBhc3NlcyBhIHRydXRoIHRlc3QuCl8uZGV0ZWN0ID0gKG9iaiwgaXRlcmF0b3IsIGNvbnRleHQpIC0+CiAgcmVzdWx0ID0gbnVsbAogIF8uZWFjaCBvYmosICh2YWx1ZSwgaW5kZXgsIGxpc3QpIC0+CiAgICBpZiBpdGVyYXRvci5jYWxsIGNvbnRleHQsIHZhbHVlLCBpbmRleCwgbGlzdAogICAgICByZXN1bHQgPSB2YWx1ZQogICAgICBfLmJyZWFrTG9vcCgpCiAgcmVzdWx0CgoKIyBSZXR1cm4gYWxsIHRoZSBlbGVtZW50cyB0aGF0IHBhc3MgYSB0cnV0aCB0ZXN0LiBVc2UgSmF2YVNjcmlwdCAxLjYncwojICoqZmlsdGVyKiosIGlmIGl0IGV4aXN0cy4KXy5maWx0ZXIgPSAob2JqLCBpdGVyYXRvciwgY29udGV4dCkgLT4KICByZXR1cm4gb2JqLmZpbHRlciBpdGVyYXRvciwgY29udGV4dCBpZiBuYXRpdmVGaWx0ZXIgYW5kIG9iai5maWx0ZXIgaXMgbmF0aXZlRmlsdGVyCiAgcmVzdWx0cyA9IFtdCiAgXy5lYWNoIG9iaiwgKHZhbHVlLCBpbmRleCwgbGlzdCkgLT4KICAgIHJlc3VsdHMucHVzaCB2YWx1ZSBpZiBpdGVyYXRvci5jYWxsIGNvbnRleHQsIHZhbHVlLCBpbmRleCwgbGlzdAogIHJlc3VsdHMKCgojIFJldHVybiBhbGwgdGhlIGVsZW1lbnRzIGZvciB3aGljaCBhIHRydXRoIHRlc3QgZmFpbHMuCl8ucmVqZWN0ID0gKG9iaiwgaXRlcmF0b3IsIGNvbnRleHQpIC0+CiAgcmVzdWx0cyA9IFtdCiAgXy5lYWNoIG9iaiwgKHZhbHVlLCBpbmRleCwgbGlzdCkgLT4KICAgIHJlc3VsdHMucHVzaCB2YWx1ZSBpZiBub3QgaXRlcmF0b3IuY2FsbCBjb250ZXh0LCB2YWx1ZSwgaW5kZXgsIGxpc3QKICByZXN1bHRzCgoKIyBEZXRlcm1pbmUgd2hldGhlciBhbGwgb2YgdGhlIGVsZW1lbnRzIG1hdGNoIGEgdHJ1dGggdGVzdC4gRGVsZWdhdGUgdG8KIyBKYXZhU2NyaXB0IDEuNidzICoqZXZlcnkqKiwgaWYgaXQgaXMgcHJlc2VudC4KXy5ldmVyeSA9IChvYmosIGl0ZXJhdG9yLCBjb250ZXh0KSAtPgogIGl0ZXJhdG9yIHx8PSBfLmlkZW50aXR5CiAgcmV0dXJuIG9iai5ldmVyeSBpdGVyYXRvciwgY29udGV4dCBpZiBuYXRpdmVFdmVyeSBhbmQgb2JqLmV2ZXJ5IGlzIG5hdGl2ZUV2ZXJ5CiAgcmVzdWx0ID0gdHJ1ZQogIF8uZWFjaCBvYmosICh2YWx1ZSwgaW5kZXgsIGxpc3QpIC0+CiAgICBfLmJyZWFrTG9vcCgpIHVubGVzcyAocmVzdWx0ID0gcmVzdWx0IGFuZCBpdGVyYXRvci5jYWxsKGNvbnRleHQsIHZhbHVlLCBpbmRleCwgbGlzdCkpCiAgcmVzdWx0CgoKIyBEZXRlcm1pbmUgaWYgYXQgbGVhc3Qgb25lIGVsZW1lbnQgaW4gdGhlIG9iamVjdCBtYXRjaGVzIGEgdHJ1dGggdGVzdC4gVXNlCiMgSmF2YVNjcmlwdCAxLjYncyAqKnNvbWUqKiwgaWYgaXQgZXhpc3RzLgpfLnNvbWUgPSAob2JqLCBpdGVyYXRvciwgY29udGV4dCkgLT4KICBpdGVyYXRvciB8fD0gXy5pZGVudGl0eQogIHJldHVybiBvYmouc29tZSBpdGVyYXRvciwgY29udGV4dCBpZiBuYXRpdmVTb21lIGFuZCBvYmouc29tZSBpcyBuYXRpdmVTb21lCiAgcmVzdWx0ID0gZmFsc2UKICBfLmVhY2ggb2JqLCAodmFsdWUsIGluZGV4LCBsaXN0KSAtPgogICAgXy5icmVha0xvb3AoKSBpZiAocmVzdWx0ID0gaXRlcmF0b3IuY2FsbChjb250ZXh0LCB2YWx1ZSwgaW5kZXgsIGxpc3QpKQogIHJlc3VsdAoKCiMgRGV0ZXJtaW5lIGlmIGEgZ2l2ZW4gdmFsdWUgaXMgaW5jbHVkZWQgaW4gdGhlIGFycmF5IG9yIG9iamVjdCwKIyBiYXNlZCBvbiBgPT09YC4KXy5pbmNsdWRlID0gKG9iaiwgdGFyZ2V0KSAtPgogIHJldHVybiBfLmluZGV4T2Yob2JqLCB0YXJnZXQpIGlzbnQgLTEgaWYgbmF0aXZlSW5kZXhPZiBhbmQgb2JqLmluZGV4T2YgaXMgbmF0aXZlSW5kZXhPZgogIHJldHVybiB0cnVlIGZvciBvd24ga2V5LCB2YWwgb2Ygb2JqIHdoZW4gdmFsIGlzIHRhcmdldAogIGZhbHNlCgoKIyBJbnZva2UgYSBtZXRob2Qgd2l0aCBhcmd1bWVudHMgb24gZXZlcnkgaXRlbSBpbiBhIGNvbGxlY3Rpb24uCl8uaW52b2tlID0gKG9iaiwgbWV0aG9kKSAtPgogIGFyZ3MgPSBfLnJlc3QgYXJndW1lbnRzLCAyCiAgKGlmIG1ldGhvZCB0aGVuIHZhbFttZXRob2RdIGVsc2UgdmFsKS5hcHBseSh2YWwsIGFyZ3MpIGZvciB2YWwgaW4gb2JqCgoKIyBDb252ZW5pZW5jZSB2ZXJzaW9uIG9mIGEgY29tbW9uIHVzZSBjYXNlIG9mICoqbWFwKio6IGZldGNoaW5nIGEgcHJvcGVydHkuCl8ucGx1Y2sgPSAob2JqLCBrZXkpIC0+CiAgXy5tYXAob2JqLCAodmFsKSAtPiB2YWxba2V5XSkKCgojIFJldHVybiB0aGUgbWF4aW11bSBpdGVtIG9yIChpdGVtLWJhc2VkIGNvbXB1dGF0aW9uKS4KXy5tYXggPSAob2JqLCBpdGVyYXRvciwgY29udGV4dCkgLT4KICByZXR1cm4gTWF0aC5tYXguYXBwbHkoTWF0aCwgb2JqKSBpZiBub3QgaXRlcmF0b3IgYW5kIF8uaXNBcnJheShvYmopCiAgcmVzdWx0ID0gY29tcHV0ZWQ6IC1JbmZpbml0eQogIF8uZWFjaCBvYmosICh2YWx1ZSwgaW5kZXgsIGxpc3QpIC0+CiAgICBjb21wdXRlZCA9IGlmIGl0ZXJhdG9yIHRoZW4gaXRlcmF0b3IuY2FsbChjb250ZXh0LCB2YWx1ZSwgaW5kZXgsIGxpc3QpIGVsc2UgdmFsdWUKICAgIGNvbXB1dGVkID49IHJlc3VsdC5jb21wdXRlZCBhbmQgKHJlc3VsdCA9IHt2YWx1ZTogdmFsdWUsIGNvbXB1dGVkOiBjb21wdXRlZH0pCiAgcmVzdWx0LnZhbHVlCgoKIyBSZXR1cm4gdGhlIG1pbmltdW0gZWxlbWVudCAob3IgZWxlbWVudC1iYXNlZCBjb21wdXRhdGlvbikuCl8ubWluID0gKG9iaiwgaXRlcmF0b3IsIGNvbnRleHQpIC0+CiAgcmV0dXJuIE1hdGgubWluLmFwcGx5KE1hdGgsIG9iaikgaWYgbm90IGl0ZXJhdG9yIGFuZCBfLmlzQXJyYXkob2JqKQogIHJlc3VsdCA9IGNvbXB1dGVkOiBJbmZpbml0eQogIF8uZWFjaCBvYmosICh2YWx1ZSwgaW5kZXgsIGxpc3QpIC0+CiAgICBjb21wdXRlZCA9IGlmIGl0ZXJhdG9yIHRoZW4gaXRlcmF0b3IuY2FsbChjb250ZXh0LCB2YWx1ZSwgaW5kZXgsIGxpc3QpIGVsc2UgdmFsdWUKICAgIGNvbXB1dGVkIDwgcmVzdWx0LmNvbXB1dGVkIGFuZCAocmVzdWx0ID0ge3ZhbHVlOiB2YWx1ZSwgY29tcHV0ZWQ6IGNvbXB1dGVkfSkKICByZXN1bHQudmFsdWUKCgojIFNvcnQgdGhlIG9iamVjdCdzIHZhbHVlcyBieSBhIGNyaXRlcmlvbiBwcm9kdWNlZCBieSBhbiBpdGVyYXRvci4KXy5zb3J0QnkgPSAob2JqLCBpdGVyYXRvciwgY29udGV4dCkgLT4KICBfLnBsdWNrKCgoXy5tYXAgb2JqLCAodmFsdWUsIGluZGV4LCBsaXN0KSAtPgogICAge3ZhbHVlOiB2YWx1ZSwgY3JpdGVyaWE6IGl0ZXJhdG9yLmNhbGwoY29udGV4dCwgdmFsdWUsIGluZGV4LCBsaXN0KX0KICApLnNvcnQoKGxlZnQsIHJpZ2h0KSAtPgogICAgYSA9IGxlZnQuY3JpdGVyaWE7IGIgPSByaWdodC5jcml0ZXJpYQogICAgaWYgYSA8IGIgdGhlbiAtMSBlbHNlIGlmIGEgPiBiIHRoZW4gMSBlbHNlIDAKICApKSwgJ3ZhbHVlJykKCgojIFVzZSBhIGNvbXBhcmF0b3IgZnVuY3Rpb24gdG8gZmlndXJlIG91dCBhdCB3aGF0IGluZGV4IGFuIG9iamVjdCBzaG91bGQKIyBiZSBpbnNlcnRlZCBzbyBhcyB0byBtYWludGFpbiBvcmRlci4gVXNlcyBiaW5hcnkgc2VhcmNoLgpfLnNvcnRlZEluZGV4ID0gKGFycmF5LCBvYmosIGl0ZXJhdG9yKSAtPgogIGl0ZXJhdG9yIHx8PSBfLmlkZW50aXR5CiAgbG93ID0gMAogIGhpZ2ggPSBhcnJheS5sZW5ndGgKICB3aGlsZSBsb3cgPCBoaWdoCiAgICBtaWQgPSAobG93ICsgaGlnaCkgPj4gMQogICAgaWYgaXRlcmF0b3IoYXJyYXlbbWlkXSkgPCBpdGVyYXRvcihvYmopIHRoZW4gbG93ID0gbWlkICsgMSBlbHNlIGhpZ2ggPSBtaWQKICBsb3cKCgojIENvbnZlcnQgYW55dGhpbmcgaXRlcmFibGUgaW50byBhIHJlYWwsIGxpdmUgYXJyYXkuCl8udG9BcnJheSA9IChpdGVyYWJsZSkgLT4KICByZXR1cm4gW10gaWYgKCFpdGVyYWJsZSkKICByZXR1cm4gaXRlcmFibGUudG9BcnJheSgpIGlmIChpdGVyYWJsZS50b0FycmF5KQogIHJldHVybiBpdGVyYWJsZSBpZiAoXy5pc0FycmF5KGl0ZXJhYmxlKSkKICByZXR1cm4gc2xpY2UuY2FsbChpdGVyYWJsZSkgaWYgKF8uaXNBcmd1bWVudHMoaXRlcmFibGUpKQogIF8udmFsdWVzKGl0ZXJhYmxlKQoKCiMgUmV0dXJuIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gYW4gb2JqZWN0LgpfLnNpemUgPSAob2JqKSAtPiBfLnRvQXJyYXkob2JqKS5sZW5ndGgKCgojIEFycmF5IEZ1bmN0aW9ucwojIC0tLS0tLS0tLS0tLS0tLQoKIyBHZXQgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYW4gYXJyYXkuIFBhc3NpbmcgYG5gIHdpbGwgcmV0dXJuIHRoZSBmaXJzdCBOCiMgdmFsdWVzIGluIHRoZSBhcnJheS4gQWxpYXNlZCBhcyAqKmhlYWQqKi4gVGhlIGBndWFyZGAgY2hlY2sgYWxsb3dzIGl0IHRvIHdvcmsKIyB3aXRoICoqbWFwKiouCl8uZmlyc3QgPSAoYXJyYXksIG4sIGd1YXJkKSAtPgogIGlmIG4gYW5kIG5vdCBndWFyZCB0aGVuIHNsaWNlLmNhbGwoYXJyYXksIDAsIG4pIGVsc2UgYXJyYXlbMF0KCgojIFJldHVybnMgZXZlcnl0aGluZyBidXQgdGhlIGZpcnN0IGVudHJ5IG9mIHRoZSBhcnJheS4gQWxpYXNlZCBhcyAqKnRhaWwqKi4KIyBFc3BlY2lhbGx5IHVzZWZ1bCBvbiB0aGUgYXJndW1lbnRzIG9iamVjdC4gUGFzc2luZyBhbiBgaW5kZXhgIHdpbGwgcmV0dXJuCiMgdGhlIHJlc3Qgb2YgdGhlIHZhbHVlcyBpbiB0aGUgYXJyYXkgZnJvbSB0aGF0IGluZGV4IG9ud2FyZC4gVGhlIGBndWFyZGAKIyBjaGVjayBhbGxvd3MgaXQgdG8gd29yayB3aXRoICoqbWFwKiouCl8ucmVzdCA9IChhcnJheSwgaW5kZXgsIGd1YXJkKSAtPgogIHNsaWNlLmNhbGwoYXJyYXksIGlmIF8uaXNVbmRlZmluZWQoaW5kZXgpIG9yIGd1YXJkIHRoZW4gMSBlbHNlIGluZGV4KQoKCiMgR2V0IHRoZSBsYXN0IGVsZW1lbnQgb2YgYW4gYXJyYXkuCl8ubGFzdCA9IChhcnJheSkgLT4gYXJyYXlbYXJyYXkubGVuZ3RoIC0gMV0KCgojIFRyaW0gb3V0IGFsbCBmYWxzeSB2YWx1ZXMgZnJvbSBhbiBhcnJheS4KXy5jb21wYWN0ID0gKGFycmF5KSAtPiBpdGVtIGZvciBpdGVtIGluIGFycmF5IHdoZW4gaXRlbQoKCiMgUmV0dXJuIGEgY29tcGxldGVseSBmbGF0dGVuZWQgdmVyc2lvbiBvZiBhbiBhcnJheS4KXy5mbGF0dGVuID0gKGFycmF5KSAtPgogIF8ucmVkdWNlIGFycmF5LCAobWVtbywgdmFsdWUpIC0+CiAgICByZXR1cm4gbWVtby5jb25jYXQoXy5mbGF0dGVuKHZhbHVlKSkgaWYgXy5pc0FycmF5IHZhbHVlCiAgICBtZW1vLnB1c2ggdmFsdWUKICAgIG1lbW8KICAsIFtdCgoKIyBSZXR1cm4gYSB2ZXJzaW9uIG9mIHRoZSBhcnJheSB0aGF0IGRvZXMgbm90IGNvbnRhaW4gdGhlIHNwZWNpZmllZCB2YWx1ZShzKS4KXy53aXRob3V0ID0gKGFycmF5KSAtPgogIHZhbHVlcyA9IF8ucmVzdCBhcmd1bWVudHMKICB2YWwgZm9yIHZhbCBpbiBfLnRvQXJyYXkoYXJyYXkpIHdoZW4gbm90IF8uaW5jbHVkZSB2YWx1ZXMsIHZhbAoKCiMgUHJvZHVjZSBhIGR1cGxpY2F0ZS1mcmVlIHZlcnNpb24gb2YgdGhlIGFycmF5LiBJZiB0aGUgYXJyYXkgaGFzIGFscmVhZHkKIyBiZWVuIHNvcnRlZCwgeW91IGhhdmUgdGhlIG9wdGlvbiBvZiB1c2luZyBhIGZhc3RlciBhbGdvcml0aG0uCl8udW5pcSA9IChhcnJheSwgaXNTb3J0ZWQpIC0+CiAgbWVtbyA9IFtdCiAgZm9yIGVsLCBpIGluIF8udG9BcnJheSBhcnJheQogICAgbWVtby5wdXNoIGVsIGlmIGkgaXMgMCB8fCAoaWYgaXNTb3J0ZWQgaXMgdHJ1ZSB0aGVuIF8ubGFzdChtZW1vKSBpc250IGVsIGVsc2Ugbm90IF8uaW5jbHVkZShtZW1vLCBlbCkpCiAgbWVtbwoKCiMgUHJvZHVjZSBhbiBhcnJheSB0aGF0IGNvbnRhaW5zIGV2ZXJ5IGl0ZW0gc2hhcmVkIGJldHdlZW4gYWxsIHRoZQojIHBhc3NlZC1pbiBhcnJheXMuCl8uaW50ZXJzZWN0ID0gKGFycmF5KSAtPgogIHJlc3QgPSBfLnJlc3QgYXJndW1lbnRzCiAgXy5zZWxlY3QgXy51bmlxKGFycmF5KSwgKGl0ZW0pIC0+CiAgICBfLmFsbCByZXN0LCAob3RoZXIpIC0+CiAgICAgIF8uaW5kZXhPZihvdGhlciwgaXRlbSkgPj0gMAoKCiMgWmlwIHRvZ2V0aGVyIG11bHRpcGxlIGxpc3RzIGludG8gYSBzaW5nbGUgYXJyYXkgLS0gZWxlbWVudHMgdGhhdCBzaGFyZQojIGFuIGluZGV4IGdvIHRvZ2V0aGVyLgpfLnppcCA9IC0+CiAgbGVuZ3RoID0gXy5tYXggXy5wbHVjayBhcmd1bWVudHMsICdsZW5ndGgnCiAgcmVzdWx0cyA9IG5ldyBBcnJheSBsZW5ndGgKICBmb3IgaSBpbiBbMC4uLmxlbmd0aF0KICAgIHJlc3VsdHNbaV0gPSBfLnBsdWNrIGFyZ3VtZW50cywgU3RyaW5nIGkKICByZXN1bHRzCgoKIyBJZiB0aGUgYnJvd3NlciBkb2Vzbid0IHN1cHBseSB1cyB3aXRoICoqaW5kZXhPZioqIChJJ20gbG9va2luZyBhdCB5b3UsIE1TSUUpLAojIHdlIG5lZWQgdGhpcyBmdW5jdGlvbi4gUmV0dXJuIHRoZSBwb3NpdGlvbiBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBhbgojIGl0ZW0gaW4gYW4gYXJyYXksIG9yIC0xIGlmIHRoZSBpdGVtIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgYXJyYXkuCl8uaW5kZXhPZiA9IChhcnJheSwgaXRlbSkgLT4KICByZXR1cm4gYXJyYXkuaW5kZXhPZiBpdGVtIGlmIG5hdGl2ZUluZGV4T2YgYW5kIGFycmF5LmluZGV4T2YgaXMgbmF0aXZlSW5kZXhPZgogIGkgPSAwOyBsID0gYXJyYXkubGVuZ3RoCiAgd2hpbGUgbCAtIGkKICAgIGlmIGFycmF5W2ldIGlzIGl0ZW0gdGhlbiByZXR1cm4gaSBlbHNlIGkrKwogIC0xCgoKIyBQcm92aWRlIEphdmFTY3JpcHQgMS42J3MgKipsYXN0SW5kZXhPZioqLCBkZWxlZ2F0aW5nIHRvIHRoZSBuYXRpdmUgZnVuY3Rpb24sCiMgaWYgcG9zc2libGUuCl8ubGFzdEluZGV4T2YgPSAoYXJyYXksIGl0ZW0pIC0+CiAgcmV0dXJuIGFycmF5Lmxhc3RJbmRleE9mKGl0ZW0pIGlmIG5hdGl2ZUxhc3RJbmRleE9mIGFuZCBhcnJheS5sYXN0SW5kZXhPZiBpcyBuYXRpdmVMYXN0SW5kZXhPZgogIGkgPSBhcnJheS5sZW5ndGgKICB3aGlsZSBpCiAgICBpZiBhcnJheVtpXSBpcyBpdGVtIHRoZW4gcmV0dXJuIGkgZWxzZSBpLS0KICAtMQoKCiMgR2VuZXJhdGUgYW4gaW50ZWdlciBBcnJheSBjb250YWluaW5nIGFuIGFyaXRobWV0aWMgcHJvZ3Jlc3Npb24uIEEgcG9ydCBvZgojIFt0aGUgbmF0aXZlIFB5dGhvbiAqKnJhbmdlKiogZnVuY3Rpb25dKGh0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvbGlicmFyeS9mdW5jdGlvbnMuaHRtbCNyYW5nZSkuCl8ucmFuZ2UgPSAoc3RhcnQsIHN0b3AsIHN0ZXApIC0+CiAgYSA9IGFyZ3VtZW50cwogIHNvbG8gPSBhLmxlbmd0aCA8PSAxCiAgaSA9IHN0YXJ0ID0gaWYgc29sbyB0aGVuIDAgZWxzZSBhWzBdCiAgc3RvcCA9IGlmIHNvbG8gdGhlbiBhWzBdIGVsc2UgYVsxXQogIHN0ZXAgPSBhWzJdIG9yIDEKICBsZW4gPSBNYXRoLmNlaWwoKHN0b3AgLSBzdGFydCkgLyBzdGVwKQogIHJldHVybiBbXSBpZiBsZW4gPD0gMAogIHJhbmdlID0gbmV3IEFycmF5IGxlbgogIGlkeCA9IDAKICBsb29wCiAgICByZXR1cm4gcmFuZ2UgaWYgKGlmIHN0ZXAgPiAwIHRoZW4gaSAtIHN0b3AgZWxzZSBzdG9wIC0gaSkgPj0gMAogICAgcmFuZ2VbaWR4XSA9IGkKICAgIGlkeCsrCiAgICBpKz0gc3RlcAoKCiMgRnVuY3Rpb24gRnVuY3Rpb25zCiMgLS0tLS0tLS0tLS0tLS0tLS0tCgojIENyZWF0ZSBhIGZ1bmN0aW9uIGJvdW5kIHRvIGEgZ2l2ZW4gb2JqZWN0IChhc3NpZ25pbmcgYHRoaXNgLCBhbmQgYXJndW1lbnRzLAojIG9wdGlvbmFsbHkpLiBCaW5kaW5nIHdpdGggYXJndW1lbnRzIGlzIGFsc28ga25vd24gYXMgKipjdXJyeSoqLgpfLmJpbmQgPSAoZnVuYywgb2JqKSAtPgogIGFyZ3MgPSBfLnJlc3QgYXJndW1lbnRzLCAyCiAgLT4gZnVuYy5hcHBseSBvYmogb3Igcm9vdCwgYXJncy5jb25jYXQgYXJndW1lbnRzCgoKIyBCaW5kIGFsbCBvZiBhbiBvYmplY3QncyBtZXRob2RzIHRvIHRoYXQgb2JqZWN0LiBVc2VmdWwgZm9yIGVuc3VyaW5nIHRoYXQKIyBhbGwgY2FsbGJhY2tzIGRlZmluZWQgb24gYW4gb2JqZWN0IGJlbG9uZyB0byBpdC4KXy5iaW5kQWxsID0gKG9iaikgLT4KICBmdW5jcyA9IGlmIGFyZ3VtZW50cy5sZW5ndGggPiAxIHRoZW4gXy5yZXN0KGFyZ3VtZW50cykgZWxzZSBfLmZ1bmN0aW9ucyhvYmopCiAgXy5lYWNoIGZ1bmNzLCAoZikgLT4gb2JqW2ZdID0gXy5iaW5kIG9ialtmXSwgb2JqCiAgb2JqCgoKIyBEZWxheXMgYSBmdW5jdGlvbiBmb3IgdGhlIGdpdmVuIG51bWJlciBvZiBtaWxsaXNlY29uZHMsIGFuZCB0aGVuIGNhbGxzCiMgaXQgd2l0aCB0aGUgYXJndW1lbnRzIHN1cHBsaWVkLgpfLmRlbGF5ID0gKGZ1bmMsIHdhaXQpIC0+CiAgYXJncyA9IF8ucmVzdCBhcmd1bWVudHMsIDIKICBzZXRUaW1lb3V0KCgtPiBmdW5jLmFwcGx5KGZ1bmMsIGFyZ3MpKSwgd2FpdCkKCgojIE1lbW9pemUgYW4gZXhwZW5zaXZlIGZ1bmN0aW9uIGJ5IHN0b3JpbmcgaXRzIHJlc3VsdHMuCl8ubWVtb2l6ZSA9IChmdW5jLCBoYXNoZXIpIC0+CiAgbWVtbyA9IHt9CiAgaGFzaGVyIG9yPSBfLmlkZW50aXR5CiAgLT4KICAgIGtleSA9IGhhc2hlci5hcHBseSB0aGlzLCBhcmd1bWVudHMKICAgIHJldHVybiBtZW1vW2tleV0gaWYga2V5IG9mIG1lbW8KICAgIG1lbW9ba2V5XSA9IGZ1bmMuYXBwbHkgdGhpcywgYXJndW1lbnRzCgoKIyBEZWZlcnMgYSBmdW5jdGlvbiwgc2NoZWR1bGluZyBpdCB0byBydW4gYWZ0ZXIgdGhlIGN1cnJlbnQgY2FsbCBzdGFjayBoYXMKIyBjbGVhcmVkLgpfLmRlZmVyID0gKGZ1bmMpIC0+CiAgXy5kZWxheS5hcHBseSBfLCBbZnVuYywgMV0uY29uY2F0IF8ucmVzdCBhcmd1bWVudHMKCgojIFJldHVybnMgdGhlIGZpcnN0IGZ1bmN0aW9uIHBhc3NlZCBhcyBhbiBhcmd1bWVudCB0byB0aGUgc2Vjb25kLAojIGFsbG93aW5nIHlvdSB0byBhZGp1c3QgYXJndW1lbnRzLCBydW4gY29kZSBiZWZvcmUgYW5kIGFmdGVyLCBhbmQKIyBjb25kaXRpb25hbGx5IGV4ZWN1dGUgdGhlIG9yaWdpbmFsIGZ1bmN0aW9uLgpfLndyYXAgPSAoZnVuYywgd3JhcHBlcikgLT4KICAtPiB3cmFwcGVyLmFwcGx5IHdyYXBwZXIsIFtmdW5jXS5jb25jYXQgYXJndW1lbnRzCgoKIyBSZXR1cm5zIGEgZnVuY3Rpb24gdGhhdCBpcyB0aGUgY29tcG9zaXRpb24gb2YgYSBsaXN0IG9mIGZ1bmN0aW9ucywgZWFjaAojIGNvbnN1bWluZyB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBmdW5jdGlvbiB0aGF0IGZvbGxvd3MuCl8uY29tcG9zZSA9IC0+CiAgZnVuY3MgPSBhcmd1bWVudHMKICAtPgogICAgYXJncyA9IGFyZ3VtZW50cwogICAgZm9yIGkgaW4gW2Z1bmNzLmxlbmd0aCAtIDEuLjBdIGJ5IC0xCiAgICAgIGFyZ3MgPSBbZnVuY3NbaV0uYXBwbHkodGhpcywgYXJncyldCiAgICBhcmdzWzBdCgoKIyBPYmplY3QgRnVuY3Rpb25zCiMgLS0tLS0tLS0tLS0tLS0tLQoKIyBSZXRyaWV2ZSB0aGUgbmFtZXMgb2YgYW4gb2JqZWN0J3MgcHJvcGVydGllcy4KXy5rZXlzID0gbmF0aXZlS2V5cyBvciAob2JqKSAtPgogIHJldHVybiBfLnJhbmdlIDAsIG9iai5sZW5ndGggaWYgXy5pc0FycmF5KG9iaikKICBrZXkgZm9yIGtleSwgdmFsIG9mIG9iagoKCiMgUmV0cmlldmUgdGhlIHZhbHVlcyBvZiBhbiBvYmplY3QncyBwcm9wZXJ0aWVzLgpfLnZhbHVlcyA9IChvYmopIC0+CiAgXy5tYXAgb2JqLCBfLmlkZW50aXR5CgoKIyBSZXR1cm4gYSBzb3J0ZWQgbGlzdCBvZiB0aGUgZnVuY3Rpb24gbmFtZXMgYXZhaWxhYmxlIGluIFVuZGVyc2NvcmUuCl8uZnVuY3Rpb25zID0gKG9iaikgLT4KICBfLmZpbHRlcihfLmtleXMob2JqKSwgKGtleSkgLT4gXy5pc0Z1bmN0aW9uKG9ialtrZXldKSkuc29ydCgpCgoKIyBFeHRlbmQgYSBnaXZlbiBvYmplY3Qgd2l0aCBhbGwgb2YgdGhlIHByb3BlcnRpZXMgaW4gYSBzb3VyY2Ugb2JqZWN0LgpfLmV4dGVuZCA9IChvYmopIC0+CiAgZm9yIHNvdXJjZSBpbiBfLnJlc3QoYXJndW1lbnRzKQogICAgb2JqW2tleV0gPSB2YWwgZm9yIGtleSwgdmFsIG9mIHNvdXJjZQogIG9iagoKCiMgQ3JlYXRlIGEgKHNoYWxsb3ctY2xvbmVkKSBkdXBsaWNhdGUgb2YgYW4gb2JqZWN0LgpfLmNsb25lID0gKG9iaikgLT4KICByZXR1cm4gb2JqLnNsaWNlIDAgaWYgXy5pc0FycmF5IG9iagogIF8uZXh0ZW5kIHt9LCBvYmoKCgojIEludm9rZXMgaW50ZXJjZXB0b3Igd2l0aCB0aGUgb2JqLCBhbmQgdGhlbiByZXR1cm5zIG9iai4KIyBUaGUgcHJpbWFyeSBwdXJwb3NlIG9mIHRoaXMgbWV0aG9kIGlzIHRvICJ0YXAgaW50byIgYSBtZXRob2QgY2hhaW4sCiMgaW4gb3JkZXIgdG8gcGVyZm9ybSBvcGVyYXRpb25zIG9uIGludGVybWVkaWF0ZSByZXN1bHRzIHdpdGhpbgogdGhlIGNoYWluLgpfLnRhcCA9IChvYmosIGludGVyY2VwdG9yKSAtPgogIGludGVyY2VwdG9yIG9iagogIG9iagoKCiMgUGVyZm9ybSBhIGRlZXAgY29tcGFyaXNvbiB0byBjaGVjayBpZiB0d28gb2JqZWN0cyBhcmUgZXF1YWwuCl8uaXNFcXVhbCA9IChhLCBiKSAtPgogICMgQ2hlY2sgb2JqZWN0IGlkZW50aXR5LgogIHJldHVybiB0cnVlIGlmIGEgaXMgYgogICMgRGlmZmVyZW50IHR5cGVzPwogIGF0eXBlID0gdHlwZW9mKGEpOyBidHlwZSA9IHR5cGVvZihiKQogIHJldHVybiBmYWxzZSBpZiBhdHlwZSBpc250IGJ0eXBlCiAgIyBCYXNpYyBlcXVhbGl0eSB0ZXN0ICh3YXRjaCBvdXQgZm9yIGNvZXJjaW9ucykuCiAgcmV0dXJuIHRydWUgaWYgYGEgPT0gYmAKICAjIE9uZSBpcyBmYWxzeSBhbmQgdGhlIG90aGVyIHRydXRoeS4KICByZXR1cm4gZmFsc2UgaWYgKCFhIGFuZCBiKSBvciAoYSBhbmQgIWIpCiAgIyBPbmUgb2YgdGhlbSBpbXBsZW1lbnRzIGFuIGBpc0VxdWFsKClgPwogIHJldHVybiBhLmlzRXF1YWwoYikgaWYgYS5pc0VxdWFsCiAgIyBDaGVjayBkYXRlcycgaW50ZWdlciB2YWx1ZXMuCiAgcmV0dXJuIGEuZ2V0VGltZSgpIGlzIGIuZ2V0VGltZSgpIGlmIF8uaXNEYXRlKGEpIGFuZCBfLmlzRGF0ZShiKQogICMgQm90aCBhcmUgTmFOPwogIHJldHVybiBmYWxzZSBpZiBfLmlzTmFOKGEpIGFuZCBfLmlzTmFOKGIpCiAgIyBDb21wYXJlIHJlZ3VsYXIgZXhwcmVzc2lvbnMuCiAgaWYgXy5pc1JlZ0V4cChhKSBhbmQgXy5pc1JlZ0V4cChiKQogICAgcmV0dXJuIGEuc291cmNlIGlzIGIuc291cmNlIGFuZAogICAgICAgICAgIGEuZ2xvYmFsIGlzIGIuZ2xvYmFsIGFuZAogICAgICAgICAgIGEuaWdub3JlQ2FzZSBpcyBiLmlnbm9yZUNhc2UgYW5kCiAgICAgICAgICAgYS5tdWx0aWxpbmUgaXMgYi5tdWx0aWxpbmUKICAjIElmIGEgaXMgbm90IGFuIG9iamVjdCBieSB0aGlzIHBvaW50LCB3ZSBjYW4ndCBoYW5kbGUgaXQuCiAgcmV0dXJuIGZhbHNlIGlmIGF0eXBlIGlzbnQgJ29iamVjdCcKICAjIENoZWNrIGZvciBkaWZmZXJlbnQgYXJyYXkgbGVuZ3RocyBiZWZvcmUgY29tcGFyaW5nIGNvbnRlbnRzLgogIHJldHVybiBmYWxzZSBpZiBhLmxlbmd0aCBhbmQgKGEubGVuZ3RoIGlzbnQgYi5sZW5ndGgpCiAgIyBOb3RoaW5nIGVsc2Ugd29ya2VkLCBkZWVwIGNvbXBhcmUgdGhlIGNvbnRlbnRzLgogIGFLZXlzID0gXy5rZXlzKGEpOyBiS2V5cyA9IF8ua2V5cyhiKQogICMgRGlmZmVyZW50IG9iamVjdCBzaXplcz8KICByZXR1cm4gZmFsc2UgaWYgYUtleXMubGVuZ3RoIGlzbnQgYktleXMubGVuZ3RoCiAgIyBSZWN1cnNpdmUgY29tcGFyaXNvbiBvZiBjb250ZW50cy4KICByZXR1cm4gZmFsc2UgZm9yIGtleSwgdmFsIG9mIGEgd2hlbiAhKGtleSBvZiBiKSBvciAhXy5pc0VxdWFsKHZhbCwgYltrZXldKQogIHRydWUKCgojIElzIGEgZ2l2ZW4gYXJyYXkgb3Igb2JqZWN0IGVtcHR5PwpfLmlzRW1wdHkgPSAob2JqKSAtPgogIHJldHVybiBvYmoubGVuZ3RoIGlzIDAgaWYgXy5pc0FycmF5KG9iaikgb3IgXy5pc1N0cmluZyhvYmopCiAgcmV0dXJuIGZhbHNlIGZvciBvd24ga2V5IG9mIG9iagogIHRydWUKCgojIElzIGEgZ2l2ZW4gdmFsdWUgYSBET00gZWxlbWVudD8KXy5pc0VsZW1lbnQgPSAob2JqKSAtPiBvYmogYW5kIG9iai5ub2RlVHlwZSBpcyAxCgoKIyBJcyBhIGdpdmVuIHZhbHVlIGFuIGFycmF5PwpfLmlzQXJyYXkgPSBuYXRpdmVJc0FycmF5IG9yIChvYmopIC0+ICEhKG9iaiBhbmQgb2JqLmNvbmNhdCBhbmQgb2JqLnVuc2hpZnQgYW5kIG5vdCBvYmouY2FsbGVlKQoKCiMgSXMgYSBnaXZlbiB2YXJpYWJsZSBhbiBhcmd1bWVudHMgb2JqZWN0PwpfLmlzQXJndW1lbnRzID0gKG9iaikgLT4gb2JqIGFuZCBvYmouY2FsbGVlCgoKIyBJcyB0aGUgZ2l2ZW4gdmFsdWUgYSBmdW5jdGlvbj8KXy5pc0Z1bmN0aW9uID0gKG9iaikgLT4gISEob2JqIGFuZCBvYmouY29uc3RydWN0b3IgYW5kIG9iai5jYWxsIGFuZCBvYmouYXBwbHkpCgoKIyBJcyB0aGUgZ2l2ZW4gdmFsdWUgYSBzdHJpbmc/Cl8uaXNTdHJpbmcgPSAob2JqKSAtPiAhIShvYmogaXMgJycgb3IgKG9iaiBhbmQgb2JqLmNoYXJDb2RlQXQgYW5kIG9iai5zdWJzdHIpKQoKCiMgSXMgYSBnaXZlbiB2YWx1ZSBhIG51bWJlcj8KXy5pc051bWJlciA9IChvYmopIC0+IChvYmogaXMgK29iaikgb3IgdG9TdHJpbmcuY2FsbChvYmopIGlzICdbb2JqZWN0IE51bWJlcl0nCgoKIyBJcyBhIGdpdmVuIHZhbHVlIGEgYm9vbGVhbj8KXy5pc0Jvb2xlYW4gPSAob2JqKSAtPiBvYmogaXMgdHJ1ZSBvciBvYmogaXMgZmFsc2UKCgojIElzIGEgZ2l2ZW4gdmFsdWUgYSBEYXRlPwpfLmlzRGF0ZSA9IChvYmopIC0+ICEhKG9iaiBhbmQgb2JqLmdldFRpbWV6b25lT2Zmc2V0IGFuZCBvYmouc2V0VVRDRnVsbFllYXIpCgoKIyBJcyB0aGUgZ2l2ZW4gdmFsdWUgYSByZWd1bGFyIGV4cHJlc3Npb24/Cl8uaXNSZWdFeHAgPSAob2JqKSAtPiAhIShvYmogYW5kIG9iai5leGVjIGFuZCAob2JqLmlnbm9yZUNhc2Ugb3Igb2JqLmlnbm9yZUNhc2UgaXMgZmFsc2UpKQoKCiMgSXMgdGhlIGdpdmVuIHZhbHVlIE5hTiAtLSB0aGlzIG9uZSBpcyBpbnRlcmVzdGluZy4gYE5hTiAhPSBOYU5gLCBhbmQKIyBgaXNOYU4odW5kZWZpbmVkKSA9PSB0cnVlYCwgc28gd2UgbWFrZSBzdXJlIGl0J3MgYSBudW1iZXIgZmlyc3QuCl8uaXNOYU4gPSAob2JqKSAtPiBfLmlzTnVtYmVyKG9iaikgYW5kIHdpbmRvdy5pc05hTihvYmopCgoKIyBJcyBhIGdpdmVuIHZhbHVlIGVxdWFsIHRvIG51bGw/Cl8uaXNOdWxsID0gKG9iaikgLT4gb2JqIGlzIG51bGwKCgojIElzIGEgZ2l2ZW4gdmFyaWFibGUgdW5kZWZpbmVkPwpfLmlzVW5kZWZpbmVkID0gKG9iaikgLT4gdHlwZW9mIG9iaiBpcyAndW5kZWZpbmVkJwoKCiMgVXRpbGl0eSBGdW5jdGlvbnMKIyAtLS0tLS0tLS0tLS0tLS0tLQoKIyBSdW4gVW5kZXJzY29yZS5qcyBpbiBub0NvbmZsaWN0IG1vZGUsIHJldHVybmluZyB0aGUgYF9gIHZhcmlhYmxlIHRvIGl0cwojIHByZXZpb3VzIG93bmVyLiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBVbmRlcnNjb3JlIG9iamVjdC4KXy5ub0NvbmZsaWN0ID0gLT4KICByb290Ll8gPSBwcmV2aW91c1VuZGVyc2NvcmUKICB0aGlzCgoKIyBLZWVwIHRoZSBpZGVudGl0eSBmdW5jdGlvbiBhcm91bmQgZm9yIGRlZmF1bHQgaXRlcmF0b3JzLgpfLmlkZW50aXR5ID0gKHZhbHVlKSAtPiB2YWx1ZQoKCiMgUnVuIGEgZnVuY3Rpb24gYG5gIHRpbWVzLgpfLnRpbWVzID0gKG4sIGl0ZXJhdG9yLCBjb250ZXh0KSAtPgogIGl0ZXJhdG9yLmNhbGwgY29udGV4dCwgaSBmb3IgaSBpbiBbMC4uLm5dCgoKIyBCcmVhayBvdXQgb2YgdGhlIG1pZGRsZSBvZiBhbiBpdGVyYXRpb24uCl8uYnJlYWtMb29wID0gLT4gdGhyb3cgYnJlYWtlcgoKCiMgQWRkIHlvdXIgb3duIGN1c3RvbSBmdW5jdGlvbnMgdG8gdGhlIFVuZGVyc2NvcmUgb2JqZWN0LCBlbnN1cmluZyB0aGF0CiMgdGhleSdyZSBjb3JyZWN0bHkgYWRkZWQgdG8gdGhlIE9PUCB3cmFwcGVyIGFzIHdlbGwuCl8ubWl4aW4gPSAob2JqKSAtPgogIGZvciBuYW1lIGluIF8uZnVuY3Rpb25zKG9iaikKICAgIGFkZFRvV3JhcHBlciBuYW1lLCBfW25hbWVdID0gb2JqW25hbWVdCgoKIyBHZW5lcmF0ZSBhIHVuaXF1ZSBpbnRlZ2VyIGlkICh1bmlxdWUgd2l0aGluIHRoZSBlbnRpcmUgY2xpZW50IHNlc3Npb24pLgojIFVzZWZ1bCBmb3IgdGVtcG9yYXJ5IERPTSBpZHMuCmlkQ291bnRlciA9IDAKXy51bmlxdWVJZCA9IChwcmVmaXgpIC0+CiAgKHByZWZpeCBvciAnJykgKyBpZENvdW50ZXIrKwoKCiMgQnkgZGVmYXVsdCwgVW5kZXJzY29yZSB1c2VzICoqRVJCKiotc3R5bGUgdGVtcGxhdGUgZGVsaW1pdGVycywgY2hhbmdlIHRoZQojIGZvbGxvd2luZyB0ZW1wbGF0ZSBzZXR0aW5ncyB0byB1c2UgYWx0ZXJuYXRpdmUgZGVsaW1pdGVycy4KXy50ZW1wbGF0ZVNldHRpbmdzID0gewogIHN0YXJ0OiAnPCUnCiAgZW5kOiAnJT4nCiAgaW50ZXJwb2xhdGU6IC88JT0oLis/KSU+L2cKfQoKCiMgSmF2YVNjcmlwdCB0ZW1wbGF0aW5nIGEtbGEgKipFUkIqKiwgcGlsZmVyZWQgZnJvbSBKb2huIFJlc2lnJ3MKIyAqU2VjcmV0cyBvZiB0aGUgSmF2YVNjcmlwdCBOaW5qYSosIHBhZ2UgODMuCiMgU2luZ2xlLXF1b3RlIGZpeCBmcm9tIFJpY2sgU3RyYWhsLgojIFdpdGggYWx0ZXJhdGlvbnMgZm9yIGFyYml0cmFyeSBkZWxpbWl0ZXJzLCBhbmQgdG8gcHJlc2VydmUgd2hpdGVzcGFjZS4KXy50ZW1wbGF0ZSA9IChzdHIsIGRhdGEpIC0+CiAgYyA9IF8udGVtcGxhdGVTZXR0aW5ncwogIGVuZE1hdGNoID0gbmV3IFJlZ0V4cCgiJyg/PVteIitjLmVuZC5zdWJzdHIoMCwgMSkrIl0qIitlc2NhcGVSZWdFeHAoYy5lbmQpKyIpIiwiZyIpCiAgZm4gPSBuZXcgRnVuY3Rpb24gJ29iaicsCiAgICAndmFyIHA9W10scHJpbnQ9ZnVuY3Rpb24oKXtwLnB1c2guYXBwbHkocCxhcmd1bWVudHMpO307JyArCiAgICAnd2l0aChvYmp8fHt9KXtwLnB1c2goXCcnICsKICAgIHN0ci5yZXBsYWNlKC9cci9nLCAnXFxyJykKICAgICAgIC5yZXBsYWNlKC9cbi9nLCAnXFxuJykKICAgICAgIC5yZXBsYWNlKC9cdC9nLCAnXFx0JykKICAgICAgIC5yZXBsYWNlKGVuZE1hdGNoLCLvv73vv73vv70iKQogICAgICAgLnNwbGl0KCInIikuam9pbigiXFwnIikKICAgICAgIC5zcGxpdCgi77+977+977+9Iikuam9pbigiJyIpCiAgICAgICAucmVwbGFjZShjLmludGVycG9sYXRlLCAiJywkMSwnIikKICAgICAgIC5zcGxpdChjLnN0YXJ0KS5qb2luKCInKTsiKQogICAgICAgLnNwbGl0KGMuZW5kKS5qb2luKCJwLnB1c2goJyIpICsKICAgICAgICInKTt9cmV0dXJuIHAuam9pbignJyk7IgogIGlmIGRhdGEgdGhlbiBmbihkYXRhKSBlbHNlIGZuCgoKIyBBbGlhc2VzCiMgLS0tLS0tLQoKXy5mb3JFYWNoID0gXy5lYWNoCl8uZm9sZGwgPSBfLmluamVjdCA9IF8ucmVkdWNlCl8uZm9sZHIgPSBfLnJlZHVjZVJpZ2h0Cl8uc2VsZWN0ID0gXy5maWx0ZXIKXy5hbGwgPSBfLmV2ZXJ5Cl8uYW55ID0gXy5zb21lCl8uY29udGFpbnMgPSBfLmluY2x1ZGUKXy5oZWFkID0gXy5maXJzdApfLnRhaWwgPSBfLnJlc3QKXy5tZXRob2RzID0gXy5mdW5jdGlvbnMKCgojIFNldHVwIHRoZSBPT1AgV3JhcHBlcgojIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyBJZiBVbmRlcnNjb3JlIGlzIGNhbGxlZCBhcyBhIGZ1bmN0aW9uLCBpdCByZXR1cm5zIGEgd3JhcHBlZCBvYmplY3QgdGhhdAojIGNhbiBiZSB1c2VkIE9PLXN0eWxlLiBUaGlzIHdyYXBwZXIgaG9sZHMgYWx0ZXJlZCB2ZXJzaW9ucyBvZiBhbGwgdGhlCiMgdW5kZXJzY29yZSBmdW5jdGlvbnMuIFdyYXBwZWQgb2JqZWN0cyBtYXkgYmUgY2hhaW5lZC4Kd3JhcHBlciA9IChvYmopIC0+CiAgdGhpcy5fd3JhcHBlZCA9IG9iagogIHRoaXMKCgojIEhlbHBlciBmdW5jdGlvbiB0byBjb250aW51ZSBjaGFpbmluZyBpbnRlcm1lZGlhdGUgcmVzdWx0cy4KcmVzdWx0ID0gKG9iaiwgY2hhaW4pIC0+CiAgaWYgY2hhaW4gdGhlbiBfKG9iaikuY2hhaW4oKSBlbHNlIG9iagoKCiMgQSBtZXRob2QgdG8gZWFzaWx5IGFkZCBmdW5jdGlvbnMgdG8gdGhlIE9PUCB3cmFwcGVyLgphZGRUb1dyYXBwZXIgPSAobmFtZSwgZnVuYykgLT4KICB3cmFwcGVyLnByb3RvdHlwZVtuYW1lXSA9IC0+CiAgICBhcmdzID0gXy50b0FycmF5IGFyZ3VtZW50cwogICAgdW5zaGlmdC5jYWxsIGFyZ3MsIHRoaXMuX3dyYXBwZWQKICAgIHJlc3VsdCBmdW5jLmFwcGx5KF8sIGFyZ3MpLCB0aGlzLl9jaGFpbgoKCiMgQWRkIGFsbCBvZnRoZSBVbmRlcnNjb3JlIGZ1bmN0aW9ucyB0byB0aGUgd3JhcHBlciBvYmplY3QuCl8ubWl4aW4gXwoKCiMgQWRkIGFsbCBtdXRhdG9yIEFycmF5IGZ1bmN0aW9ucyB0byB0aGUgd3JhcHBlci4KXy5lYWNoIFsncG9wJywgJ3B1c2gnLCAncmV2ZXJzZScsICdzaGlmdCcsICdzb3J0JywgJ3NwbGljZScsICd1bnNoaWZ0J10sIChuYW1lKSAtPgogIG1ldGhvZCA9IEFycmF5LnByb3RvdHlwZVtuYW1lXQogIHdyYXBwZXIucHJvdG90eXBlW25hbWVdID0gLT4KICAgIG1ldGhvZC5hcHBseSh0aGlzLl93cmFwcGVkLCBhcmd1bWVudHMpCiAgICByZXN1bHQodGhpcy5fd3JhcHBlZCwgdGhpcy5fY2hhaW4pCgoKIyBBZGQgYWxsIGFjY2Vzc29yIEFycmF5IGZ1bmN0aW9ucyB0byB0aGUgd3JhcHBlci4KXy5lYWNoIFsnY29uY2F0JywgJ2pvaW4nLCAnc2xpY2UnXSwgKG5hbWUpIC0+CiAgbWV0aG9kID0gQXJyYXkucHJvdG90eXBlW25hbWVdCiAgd3JhcHBlci5wcm90b3R5cGVbbmFtZV0gPSAtPgogICAgcmVzdWx0KG1ldGhvZC5hcHBseSh0aGlzLl93cmFwcGVkLCBhcmd1bWVudHMpLCB0aGlzLl9jaGFpbikKCgojIFN0YXJ0IGNoYWluaW5nIGEgd3JhcHBlZCBVbmRlcnNjb3JlIG9iamVjdC4Kd3JhcHBlcjo6Y2hhaW4gPSAtPgogIHRoaXMuX2NoYWluID0gdHJ1ZQogIHRoaXMKCgojIEV4dHJhY3RzIHRoZSByZXN1bHQgZnJvbSBhIHdyYXBwZWQgYW5kIGNoYWluZWQgb2JqZWN0Lgp3cmFwcGVyOjp2YWx1ZSA9IC0+IHRoaXMuX3dyYXBwZWQKPC90ZXh0YXJlYT48L2Zvcm0+CiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwge30pOwogICAgPC9zY3JpcHQ+CgogICAgPHA+PHN0cm9uZz5NSU1FIHR5cGVzIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPnRleHQveC1jb2ZmZWVzY3JpcHQ8L2NvZGU+LjwvcD4KCiAgICA8cD5UaGUgQ29mZmVlU2NyaXB0IG1vZGUgd2FzIHdyaXR0ZW4gYnkgSmVmZiBQaWNraGFyZHQuPC9wPgoKICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/commonlisp/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/commonlisp/commonlisp.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJjb21tb25saXNwIiwgZnVuY3Rpb24gKGNvbmZpZykgewogIHZhciBzcGVjaWFsRm9ybSA9IC9eKGJsb2NrfGxldCp8cmV0dXJuLWZyb218Y2F0Y2h8bG9hZC10aW1lLXZhbHVlfHNldHF8ZXZhbC13aGVufGxvY2FsbHl8c3ltYm9sLW1hY3JvbGV0fGZsZXR8bWFjcm9sZXR8dGFnYm9keXxmdW5jdGlvbnxtdWx0aXBsZS12YWx1ZS1jYWxsfHRoZXxnb3xtdWx0aXBsZS12YWx1ZS1wcm9nMXx0aHJvd3xpZnxwcm9nbnx1bndpbmQtcHJvdGVjdHxsYWJlbHN8cHJvZ3Z8bGV0fHF1b3RlKSQvOwogIHZhciBhc3N1bWVCb2R5ID0gL153aXRofF5kZWZ8XmRvfF5wcm9nfGNhc2UkfF5jb25kJHxiaW5kJHx3aGVuJHx1bmxlc3MkLzsKICB2YXIgbnVtTGl0ZXJhbCA9IC9eKD86WytcLV0/KD86XGQrfFxkKlwuXGQrKSg/OltlZmRdWytcLV0/XGQrKT98WytcLV0/XGQrKD86XC9bK1wtXT9cZCspP3wjYlsrXC1dP1swMV0rfCNvWytcLV0/WzAtN10rfCN4WytcLV0/W1xkYS1mXSspLzsKICB2YXIgc3ltYm9sID0gL1teXHMnYCxAKClcW1xdIjtdLzsKICB2YXIgdHlwZTsKCiAgZnVuY3Rpb24gcmVhZFN5bShzdHJlYW0pIHsKICAgIHZhciBjaDsKICAgIHdoaWxlIChjaCA9IHN0cmVhbS5uZXh0KCkpIHsKICAgICAgaWYgKGNoID09ICJcXCIpIHN0cmVhbS5uZXh0KCk7CiAgICAgIGVsc2UgaWYgKCFzeW1ib2wudGVzdChjaCkpIHsgc3RyZWFtLmJhY2tVcCgxKTsgYnJlYWs7IH0KICAgIH0KICAgIHJldHVybiBzdHJlYW0uY3VycmVudCgpOwogIH0KCiAgZnVuY3Rpb24gYmFzZShzdHJlYW0sIHN0YXRlKSB7CiAgICBpZiAoc3RyZWFtLmVhdFNwYWNlKCkpIHt0eXBlID0gIndzIjsgcmV0dXJuIG51bGw7fQogICAgaWYgKHN0cmVhbS5tYXRjaChudW1MaXRlcmFsKSkgcmV0dXJuICJudW1iZXIiOwogICAgdmFyIGNoID0gc3RyZWFtLm5leHQoKTsKICAgIGlmIChjaCA9PSAiXFwiKSBjaCA9IHN0cmVhbS5uZXh0KCk7CgogICAgaWYgKGNoID09ICciJykgcmV0dXJuIChzdGF0ZS50b2tlbml6ZSA9IGluU3RyaW5nKShzdHJlYW0sIHN0YXRlKTsKICAgIGVsc2UgaWYgKGNoID09ICIoIikgeyB0eXBlID0gIm9wZW4iOyByZXR1cm4gImJyYWNrZXQiOyB9CiAgICBlbHNlIGlmIChjaCA9PSAiKSIgfHwgY2ggPT0gIl0iKSB7IHR5cGUgPSAiY2xvc2UiOyByZXR1cm4gImJyYWNrZXQiOyB9CiAgICBlbHNlIGlmIChjaCA9PSAiOyIpIHsgc3RyZWFtLnNraXBUb0VuZCgpOyB0eXBlID0gIndzIjsgcmV0dXJuICJjb21tZW50IjsgfQogICAgZWxzZSBpZiAoL1snYCxAXS8udGVzdChjaCkpIHJldHVybiBudWxsOwogICAgZWxzZSBpZiAoY2ggPT0gInwiKSB7CiAgICAgIGlmIChzdHJlYW0uc2tpcFRvKCJ8IikpIHsgc3RyZWFtLm5leHQoKTsgcmV0dXJuICJzeW1ib2wiOyB9CiAgICAgIGVsc2UgeyBzdHJlYW0uc2tpcFRvRW5kKCk7IHJldHVybiAiZXJyb3IiOyB9CiAgICB9IGVsc2UgaWYgKGNoID09ICIjIikgewogICAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpOwogICAgICBpZiAoY2ggPT0gIlsiKSB7IHR5cGUgPSAib3BlbiI7IHJldHVybiAiYnJhY2tldCI7IH0KICAgICAgZWxzZSBpZiAoL1srXC09XC4nXS8udGVzdChjaCkpIHJldHVybiBudWxsOwogICAgICBlbHNlIGlmICgvXGQvLnRlc3QoY2gpICYmIHN0cmVhbS5tYXRjaCgvXlxkKiMvKSkgcmV0dXJuIG51bGw7CiAgICAgIGVsc2UgaWYgKGNoID09ICJ8IikgcmV0dXJuIChzdGF0ZS50b2tlbml6ZSA9IGluQ29tbWVudCkoc3RyZWFtLCBzdGF0ZSk7CiAgICAgIGVsc2UgaWYgKGNoID09ICI6IikgeyByZWFkU3ltKHN0cmVhbSk7IHJldHVybiAibWV0YSI7IH0KICAgICAgZWxzZSByZXR1cm4gImVycm9yIjsKICAgIH0gZWxzZSB7CiAgICAgIHZhciBuYW1lID0gcmVhZFN5bShzdHJlYW0pOwogICAgICBpZiAobmFtZSA9PSAiLiIpIHJldHVybiBudWxsOwogICAgICB0eXBlID0gInN5bWJvbCI7CiAgICAgIGlmIChuYW1lID09ICJuaWwiIHx8IG5hbWUgPT0gInQiIHx8IG5hbWUuY2hhckF0KDApID09ICI6IikgcmV0dXJuICJhdG9tIjsKICAgICAgaWYgKHN0YXRlLmxhc3RUeXBlID09ICJvcGVuIiAmJiAoc3BlY2lhbEZvcm0udGVzdChuYW1lKSB8fCBhc3N1bWVCb2R5LnRlc3QobmFtZSkpKSByZXR1cm4gImtleXdvcmQiOwogICAgICBpZiAobmFtZS5jaGFyQXQoMCkgPT0gIiYiKSByZXR1cm4gInZhcmlhYmxlLTIiOwogICAgICByZXR1cm4gInZhcmlhYmxlIjsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGluU3RyaW5nKHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBlc2NhcGVkID0gZmFsc2UsIG5leHQ7CiAgICB3aGlsZSAobmV4dCA9IHN0cmVhbS5uZXh0KCkpIHsKICAgICAgaWYgKG5leHQgPT0gJyInICYmICFlc2NhcGVkKSB7IHN0YXRlLnRva2VuaXplID0gYmFzZTsgYnJlYWs7IH0KICAgICAgZXNjYXBlZCA9ICFlc2NhcGVkICYmIG5leHQgPT0gIlxcIjsKICAgIH0KICAgIHJldHVybiAic3RyaW5nIjsKICB9CgogIGZ1bmN0aW9uIGluQ29tbWVudChzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgbmV4dCwgbGFzdDsKICAgIHdoaWxlIChuZXh0ID0gc3RyZWFtLm5leHQoKSkgewogICAgICBpZiAobmV4dCA9PSAiIyIgJiYgbGFzdCA9PSAifCIpIHsgc3RhdGUudG9rZW5pemUgPSBiYXNlOyBicmVhazsgfQogICAgICBsYXN0ID0gbmV4dDsKICAgIH0KICAgIHR5cGUgPSAid3MiOwogICAgcmV0dXJuICJjb21tZW50IjsKICB9CgogIHJldHVybiB7CiAgICBzdGFydFN0YXRlOiBmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiB7Y3R4OiB7cHJldjogbnVsbCwgc3RhcnQ6IDAsIGluZGVudFRvOiAwfSwgbGFzdFR5cGU6IG51bGwsIHRva2VuaXplOiBiYXNlfTsKICAgIH0sCgogICAgdG9rZW46IGZ1bmN0aW9uIChzdHJlYW0sIHN0YXRlKSB7CiAgICAgIGlmIChzdHJlYW0uc29sKCkgJiYgdHlwZW9mIHN0YXRlLmN0eC5pbmRlbnRUbyAhPSAibnVtYmVyIikKICAgICAgICBzdGF0ZS5jdHguaW5kZW50VG8gPSBzdGF0ZS5jdHguc3RhcnQgKyAxOwoKICAgICAgdHlwZSA9IG51bGw7CiAgICAgIHZhciBzdHlsZSA9IHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgICBpZiAodHlwZSAhPSAid3MiKSB7CiAgICAgICAgaWYgKHN0YXRlLmN0eC5pbmRlbnRUbyA9PSBudWxsKSB7CiAgICAgICAgICBpZiAodHlwZSA9PSAic3ltYm9sIiAmJiBhc3N1bWVCb2R5LnRlc3Qoc3RyZWFtLmN1cnJlbnQoKSkpCiAgICAgICAgICAgIHN0YXRlLmN0eC5pbmRlbnRUbyA9IHN0YXRlLmN0eC5zdGFydCArIGNvbmZpZy5pbmRlbnRVbml0OwogICAgICAgICAgZWxzZQogICAgICAgICAgICBzdGF0ZS5jdHguaW5kZW50VG8gPSAibmV4dCI7CiAgICAgICAgfSBlbHNlIGlmIChzdGF0ZS5jdHguaW5kZW50VG8gPT0gIm5leHQiKSB7CiAgICAgICAgICBzdGF0ZS5jdHguaW5kZW50VG8gPSBzdHJlYW0uY29sdW1uKCk7CiAgICAgICAgfQogICAgICAgIHN0YXRlLmxhc3RUeXBlID0gdHlwZTsKICAgICAgfQogICAgICBpZiAodHlwZSA9PSAib3BlbiIpIHN0YXRlLmN0eCA9IHtwcmV2OiBzdGF0ZS5jdHgsIHN0YXJ0OiBzdHJlYW0uY29sdW1uKCksIGluZGVudFRvOiBudWxsfTsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAiY2xvc2UiKSBzdGF0ZS5jdHggPSBzdGF0ZS5jdHgucHJldiB8fCBzdGF0ZS5jdHg7CiAgICAgIHJldHVybiBzdHlsZTsKICAgIH0sCgogICAgaW5kZW50OiBmdW5jdGlvbiAoc3RhdGUsIF90ZXh0QWZ0ZXIpIHsKICAgICAgdmFyIGkgPSBzdGF0ZS5jdHguaW5kZW50VG87CiAgICAgIHJldHVybiB0eXBlb2YgaSA9PSAibnVtYmVyIiA/IGkgOiBzdGF0ZS5jdHguc3RhcnQgKyAxOwogICAgfSwKCiAgICBjbG9zZUJyYWNrZXRzOiB7cGFpcnM6ICIoKVtde31cIlwiIn0sCiAgICBsaW5lQ29tbWVudDogIjs7IiwKICAgIGJsb2NrQ29tbWVudFN0YXJ0OiAiI3wiLAogICAgYmxvY2tDb21tZW50RW5kOiAifCMiCiAgfTsKfSk7CgpDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveC1jb21tb24tbGlzcCIsICJjb21tb25saXNwIik7Cgp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/commonlisp/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogQ29tbW9uIExpc3AgbW9kZTwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uLy4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxzY3JpcHQgc3JjPSIuLi8uLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJjb21tb25saXNwLmpzIj48L3NjcmlwdD4KPHN0eWxlPi5Db2RlTWlycm9yIHtiYWNrZ3JvdW5kOiAjZjhmOGY4O308L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxoMT5Db2RlTWlycm9yPC9oMT48aW1nIGlkPWxvZ28gc3JjPSIuLi8uLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5MYW5ndWFnZSBtb2RlczwvYT4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+Q29tbW9uIExpc3A8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPkNvbW1vbiBMaXNwIG1vZGU8L2gyPgo8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPihpbi1wYWNrYWdlIDpjbC1wb3N0Z3JlcykKCjs7IFRoZXNlIGFyZSB1c2VkIHRvIHN5bnRoZXNpemUgcmVhZGVyIGFuZCB3cml0ZXIgbmFtZXMgZm9yIGludGVnZXIKOzsgcmVhZGluZy93cml0aW5nIGZ1bmN0aW9ucyB3aGVuIHRoZSBhbW91bnQgb2YgYnl0ZXMgYW5kIHRoZQo7OyBzaWduZWRuZXNzIGlzIGtub3duLiBCb3RoIHRoZSBtYWNybyB0aGF0IGNyZWF0ZXMgdGhlIGZ1bmN0aW9ucyBhbmQKOzsgc29tZSBtYWNyb3MgdGhhdCB1c2UgdGhlbSBjcmVhdGUgbmFtZXMgdGhpcyB3YXkuCihldmFsLXdoZW4gKDpjb21waWxlLXRvcGxldmVsIDpsb2FkLXRvcGxldmVsIDpleGVjdXRlKQogIChkZWZ1biBpbnRlZ2VyLXJlYWRlci1uYW1lIChieXRlcyBzaWduZWQpCiAgICAoaW50ZXJuICh3aXRoLXN0YW5kYXJkLWlvLXN5bnRheAogICAgICAgICAgICAgIChmb3JtYXQgbmlsICJ+YX5hfmF+YSIgJyM6cmVhZC0gKGlmIHNpZ25lZCAiIiAnIzp1KSAnIzppbnQgYnl0ZXMpKSkpCiAgKGRlZnVuIGludGVnZXItd3JpdGVyLW5hbWUgKGJ5dGVzIHNpZ25lZCkKICAgIChpbnRlcm4gKHdpdGgtc3RhbmRhcmQtaW8tc3ludGF4CiAgICAgICAgICAgICAgKGZvcm1hdCBuaWwgIn5hfmF+YX5hIiAnIzp3cml0ZS0gKGlmIHNpZ25lZCAiIiAnIzp1KSAnIzppbnQgYnl0ZXMpKSkpKQoKKGRlZm1hY3JvIGludGVnZXItcmVhZGVyIChieXRlcykKICAiQ3JlYXRlIGEgZnVuY3Rpb24gdG8gcmVhZCBpbnRlZ2VycyBmcm9tIGEgYmluYXJ5IHN0cmVhbS4iCiAgKGxldCAoKGJpdHMgKCogYnl0ZXMgOCkpKQogICAgKGxhYmVscyAoKHJldHVybi1mb3JtIChzaWduZWQpCiAgICAgICAgICAgICAgIChpZiBzaWduZWQKICAgICAgICAgICAgICAgICAgIGAoaWYgKGxvZ2JpdHAgLCgxLSBiaXRzKSByZXN1bHQpCiAgICAgICAgICAgICAgICAgICAgICAgIChkcGIgcmVzdWx0IChieXRlICwoMS0gYml0cykgMCkgLTEpCiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCkKICAgICAgICAgICAgICAgICAgIGByZXN1bHQpKQogICAgICAgICAgICAgKGdlbmVyYXRlLXJlYWRlciAoc2lnbmVkKQogICAgICAgICAgICAgICBgKGRlZnVuICwoaW50ZWdlci1yZWFkZXItbmFtZSBieXRlcyBzaWduZWQpIChzb2NrZXQpCiAgICAgICAgICAgICAgICAgIChkZWNsYXJlICh0eXBlIHN0cmVhbSBzb2NrZXQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICMuKm9wdGltaXplKikKICAgICAgICAgICAgICAgICAgLChpZiAoPSBieXRlcyAxKQogICAgICAgICAgICAgICAgICAgICAgIGAobGV0ICgocmVzdWx0ICh0aGUgKHVuc2lnbmVkLWJ5dGUgOCkgKHJlYWQtYnl0ZSBzb2NrZXQpKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlY2xhcmUgKHR5cGUgKHVuc2lnbmVkLWJ5dGUgOCkgcmVzdWx0KSkKICAgICAgICAgICAgICAgICAgICAgICAgICAsKHJldHVybi1mb3JtIHNpZ25lZCkpCiAgICAgICAgICAgICAgICAgICAgICAgYChsZXQgKChyZXN1bHQgMCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlY2xhcmUgKHR5cGUgKHVuc2lnbmVkLWJ5dGUgLGJpdHMpIHJlc3VsdCkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgLEAobG9vcCA6Zm9yIGJ5dGUgOmZyb20gKDEtIGJ5dGVzKSA6ZG93bnRvIDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6Y29sbGVjdCBgKHNldGYgKGxkYiAoYnl0ZSA4ICwoKiA4IGJ5dGUpKSByZXN1bHQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aGUgKHVuc2lnbmVkLWJ5dGUgOCkgKHJlYWQtYnl0ZSBzb2NrZXQpKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgLChyZXR1cm4tZm9ybSBzaWduZWQpKSkpKSkKICAgICAgYChwcm9nbgo7OyBUaGlzIGNhdXNlcyB3ZWlyZCBlcnJvcnMgb24gU0JDTCBpbiBzb21lIGNpcmN1bXN0YW5jZXMuIERpc2FibGVkIGZvciBub3cuCjs7ICAgICAgICAgKGRlY2xhaW0gKGlubGluZSAsKGludGVnZXItcmVhZGVyLW5hbWUgYnl0ZXMgdCkKOzsgICAgICAgICAgICAgICAgICAgICAgICAgICwoaW50ZWdlci1yZWFkZXItbmFtZSBieXRlcyBuaWwpKSkKICAgICAgICAgKGRlY2xhaW0gKGZ0eXBlIChmdW5jdGlvbiAodCkgKHNpZ25lZC1ieXRlICxiaXRzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICwoaW50ZWdlci1yZWFkZXItbmFtZSBieXRlcyB0KSkpCiAgICAgICAgICwoZ2VuZXJhdGUtcmVhZGVyIHQpCiAgICAgICAgIChkZWNsYWltIChmdHlwZSAoZnVuY3Rpb24gKHQpICh1bnNpZ25lZC1ieXRlICxiaXRzKSkKICAgICAgICAgICAgICAgICAgICAgICAgICwoaW50ZWdlci1yZWFkZXItbmFtZSBieXRlcyBuaWwpKSkKICAgICAgICAgLChnZW5lcmF0ZS1yZWFkZXIgbmlsKSkpKSkKCihkZWZtYWNybyBpbnRlZ2VyLXdyaXRlciAoYnl0ZXMpCiAgIkNyZWF0ZSBhIGZ1bmN0aW9uIHRvIHdyaXRlIGludGVnZXJzIHRvIGEgYmluYXJ5IHN0cmVhbS4iCiAgKGxldCAoKGJpdHMgKCogOCBieXRlcykpKQogICAgYChwcm9nbgogICAgICAoZGVjbGFpbSAoaW5saW5lICwoaW50ZWdlci13cml0ZXItbmFtZSBieXRlcyB0KQogICAgICAgICAgICAgICAgICAgICAgICwoaW50ZWdlci13cml0ZXItbmFtZSBieXRlcyBuaWwpKSkKICAgICAgKGRlZnVuICwoaW50ZWdlci13cml0ZXItbmFtZSBieXRlcyBuaWwpIChzb2NrZXQgdmFsdWUpCiAgICAgICAgKGRlY2xhcmUgKHR5cGUgc3RyZWFtIHNvY2tldCkKICAgICAgICAgICAgICAgICAodHlwZSAodW5zaWduZWQtYnl0ZSAsYml0cykgdmFsdWUpCiAgICAgICAgICAgICAgICAgIy4qb3B0aW1pemUqKQogICAgICAgICxAKGlmICg9IGJ5dGVzIDEpCiAgICAgICAgICAgICAgYCgod3JpdGUtYnl0ZSB2YWx1ZSBzb2NrZXQpKQogICAgICAgICAgICAgIChsb29wIDpmb3IgYnl0ZSA6ZnJvbSAoMS0gYnl0ZXMpIDpkb3dudG8gMAogICAgICAgICAgICAgICAgICAgIDpjb2xsZWN0IGAod3JpdGUtYnl0ZSAobGRiIChieXRlIDggLCgqIGJ5dGUgOCkpIHZhbHVlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ja2V0KSkpCiAgICAgICAgKHZhbHVlcykpCiAgICAgIChkZWZ1biAsKGludGVnZXItd3JpdGVyLW5hbWUgYnl0ZXMgdCkgKHNvY2tldCB2YWx1ZSkKICAgICAgICAoZGVjbGFyZSAodHlwZSBzdHJlYW0gc29ja2V0KQogICAgICAgICAgICAgICAgICh0eXBlIChzaWduZWQtYnl0ZSAsYml0cykgdmFsdWUpCiAgICAgICAgICAgICAgICAgIy4qb3B0aW1pemUqKQogICAgICAgICxAKGlmICg9IGJ5dGVzIDEpCiAgICAgICAgICAgICAgYCgod3JpdGUtYnl0ZSAobGRiIChieXRlIDggMCkgdmFsdWUpIHNvY2tldCkpCiAgICAgICAgICAgICAgKGxvb3AgOmZvciBieXRlIDpmcm9tICgxLSBieXRlcykgOmRvd250byAwCiAgICAgICAgICAgICAgICAgICAgOmNvbGxlY3QgYCh3cml0ZS1ieXRlIChsZGIgKGJ5dGUgOCAsKCogYnl0ZSA4KSkgdmFsdWUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXQpKSkKICAgICAgICAodmFsdWVzKSkpKSkKCjs7IEFsbCB0aGUgaW5zdGFuY2VzIG9mIHRoZSBhYm92ZSB0aGF0IHdlIG5lZWQuCgooaW50ZWdlci1yZWFkZXIgMSkKKGludGVnZXItcmVhZGVyIDIpCihpbnRlZ2VyLXJlYWRlciA0KQooaW50ZWdlci1yZWFkZXIgOCkKCihpbnRlZ2VyLXdyaXRlciAxKQooaW50ZWdlci13cml0ZXIgMikKKGludGVnZXItd3JpdGVyIDQpCgooZGVmdW4gd3JpdGUtYnl0ZXMgKHNvY2tldCBieXRlcykKICAiV3JpdGUgYSBieXRlLWFycmF5IHRvIGEgc3RyZWFtLiIKICAoZGVjbGFyZSAodHlwZSBzdHJlYW0gc29ja2V0KQogICAgICAgICAgICh0eXBlIChzaW1wbGUtYXJyYXkgKHVuc2lnbmVkLWJ5dGUgOCkpIGJ5dGVzKQogICAgICAgICAgICMuKm9wdGltaXplKikKICAod3JpdGUtc2VxdWVuY2UgYnl0ZXMgc29ja2V0KSkKCihkZWZ1biB3cml0ZS1zdHIgKHNvY2tldCBzdHJpbmcpCiAgIldyaXRlIGEgbnVsbC10ZXJtaW5hdGVkIHN0cmluZyB0byBhIHN0cmVhbSBcKGVuY29kaW5nIGl0IHdoZW4gVVRGLTgKc3VwcG9ydCBpcyBlbmFibGVkLikuIgogIChkZWNsYXJlICh0eXBlIHN0cmVhbSBzb2NrZXQpCiAgICAgICAgICAgKHR5cGUgc3RyaW5nIHN0cmluZykKICAgICAgICAgICAjLipvcHRpbWl6ZSopCiAgKGVuYy13cml0ZS1zdHJpbmcgc3RyaW5nIHNvY2tldCkKICAod3JpdGUtdWludDEgc29ja2V0IDApKQoKKGRlY2xhaW0gKGZ0eXBlIChmdW5jdGlvbiAodCB1bnNpZ25lZC1ieXRlKQogICAgICAgICAgICAgICAgICAgICAgICAgIChzaW1wbGUtYXJyYXkgKHVuc2lnbmVkLWJ5dGUgOCkgKCopKSkKICAgICAgICAgICAgICAgIHJlYWQtYnl0ZXMpKQooZGVmdW4gcmVhZC1ieXRlcyAoc29ja2V0IGxlbmd0aCkKICAiUmVhZCBhIGJ5dGUgYXJyYXkgb2YgdGhlIGdpdmVuIGxlbmd0aCBmcm9tIGEgc3RyZWFtLiIKICAoZGVjbGFyZSAodHlwZSBzdHJlYW0gc29ja2V0KQogICAgICAgICAgICh0eXBlIGZpeG51bSBsZW5ndGgpCiAgICAgICAgICAgIy4qb3B0aW1pemUqKQogIChsZXQgKChyZXN1bHQgKG1ha2UtYXJyYXkgbGVuZ3RoIDplbGVtZW50LXR5cGUgJyh1bnNpZ25lZC1ieXRlIDgpKSkpCiAgICAocmVhZC1zZXF1ZW5jZSByZXN1bHQgc29ja2V0KQogICAgcmVzdWx0KSkKCihkZWNsYWltIChmdHlwZSAoZnVuY3Rpb24gKHQpIHN0cmluZykgcmVhZC1zdHIpKQooZGVmdW4gcmVhZC1zdHIgKHNvY2tldCkKICAiUmVhZCBhIG51bGwtdGVybWluYXRlZCBzdHJpbmcgZnJvbSBhIHN0cmVhbS4gVGFrZXMgY2FyZSBvZiBlbmNvZGluZwp3aGVuIFVURi04IHN1cHBvcnQgaXMgZW5hYmxlZC4iCiAgKGRlY2xhcmUgKHR5cGUgc3RyZWFtIHNvY2tldCkKICAgICAgICAgICAjLipvcHRpbWl6ZSopCiAgKGVuYy1yZWFkLXN0cmluZyBzb2NrZXQgOm51bGwtdGVybWluYXRlZCB0KSkKCihkZWZ1biBza2lwLWJ5dGVzIChzb2NrZXQgbGVuZ3RoKQogICJTa2lwIGEgZ2l2ZW4gbnVtYmVyIG9mIGJ5dGVzIGluIGEgYmluYXJ5IHN0cmVhbS4iCiAgKGRlY2xhcmUgKHR5cGUgc3RyZWFtIHNvY2tldCkKICAgICAgICAgICAodHlwZSAodW5zaWduZWQtYnl0ZSAzMikgbGVuZ3RoKQogICAgICAgICAgICMuKm9wdGltaXplKikKICAoZG90aW1lcyAoaSBsZW5ndGgpCiAgICAocmVhZC1ieXRlIHNvY2tldCkpKQoKKGRlZnVuIHNraXAtc3RyIChzb2NrZXQpCiAgIlNraXAgYSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nLiIKICAoZGVjbGFyZSAodHlwZSBzdHJlYW0gc29ja2V0KQogICAgICAgICAgICMuKm9wdGltaXplKikKICAobG9vcCA6Zm9yIGNoYXIgOm9mLXR5cGUgZml4bnVtID0gKHJlYWQtYnl0ZSBzb2NrZXQpCiAgICAgICAgOnVudGlsICh6ZXJvcCBjaGFyKSkpCgooZGVmdW4gZW5zdXJlLXNvY2tldC1pcy1jbG9zZWQgKHNvY2tldCAmYW1wO2tleSBhYm9ydCkKICAod2hlbiAob3Blbi1zdHJlYW0tcCBzb2NrZXQpCiAgICAoaGFuZGxlci1jYXNlCiAgICAgICAgKGNsb3NlIHNvY2tldCA6YWJvcnQgYWJvcnQpCiAgICAgIChlcnJvciAoZXJyb3IpCiAgICAgICAgKHdhcm4gIklnbm9yaW5nIHRoZSBlcnJvciB3aGljaCBoYXBwZW5lZCB3aGlsZSB0cnlpbmcgdG8gY2xvc2UgUG9zdGdyZVNRTCBzb2NrZXQ6IH5BIiBlcnJvcikpKSkpCjwvdGV4dGFyZWE+PC9mb3JtPgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHtsaW5lTnVtYmVyczogdHJ1ZX0pOwogICAgPC9zY3JpcHQ+CgogICAgPHA+PHN0cm9uZz5NSU1FIHR5cGVzIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPnRleHQveC1jb21tb24tbGlzcDwvY29kZT4uPC9wPgoKICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/crystal/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/crystal/crystal.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CgogIENvZGVNaXJyb3IuZGVmaW5lTW9kZSgiY3J5c3RhbCIsIGZ1bmN0aW9uKGNvbmZpZykgewogICAgZnVuY3Rpb24gd29yZFJlZ0V4cCh3b3JkcywgZW5kKSB7CiAgICAgIHJldHVybiBuZXcgUmVnRXhwKChlbmQgPyAiIiA6ICJeIikgKyAiKD86IiArIHdvcmRzLmpvaW4oInwiKSArICIpIiArIChlbmQgPyAiJCIgOiAiXFxiIikpOwogICAgfQoKICAgIGZ1bmN0aW9uIGNoYWluKHRva2VuaXplLCBzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHN0YXRlLnRva2VuaXplLnB1c2godG9rZW5pemUpOwogICAgICByZXR1cm4gdG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CiAgICB9CgogICAgdmFyIG9wZXJhdG9ycyA9IC9eKD86Wy0rLyV8Jl5dfFwqXCo/fFs8Pl17Mn0pLzsKICAgIHZhciBjb25kaXRpb25hbE9wZXJhdG9ycyA9IC9eKD86Wz0hXX58PT09fDw9PnxbPD49IV09P3xbfCZdezJ9fH4pLzsKICAgIHZhciBpbmRleGluZ09wZXJhdG9ycyA9IC9eKD86XFtcXVs/PV0/KS87CiAgICB2YXIgYW5vdGhlck9wZXJhdG9ycyA9IC9eKD86XC4oPzpcLnsyfSk/fC0+fFs/Ol0pLzsKICAgIHZhciBpZGVudHMgPSAvXlthLXpfXHUwMDlGLVx1RkZGRl1bYS16QS1aMC05X1x1MDA5Ri1cdUZGRkZdKi87CiAgICB2YXIgdHlwZXMgPSAvXltBLVpfXHUwMDlGLVx1RkZGRl1bYS16QS1aMC05X1x1MDA5Ri1cdUZGRkZdKi87CiAgICB2YXIga2V5d29yZHMgPSB3b3JkUmVnRXhwKFsKICAgICAgImFic3RyYWN0IiwgImFsaWFzIiwgImFzIiwgImFzbSIsICJiZWdpbiIsICJicmVhayIsICJjYXNlIiwgImNsYXNzIiwgImRlZiIsICJkbyIsCiAgICAgICJlbHNlIiwgImVsc2lmIiwgImVuZCIsICJlbnN1cmUiLCAiZW51bSIsICJleHRlbmQiLCAiZm9yIiwgImZ1biIsICJpZiIsICJpZmRlZiIsCiAgICAgICJpbmNsdWRlIiwgImluc3RhbmNlX3NpemVvZiIsICJsaWIiLCAibWFjcm8iLCAibW9kdWxlIiwgIm5leHQiLCAib2YiLCAib3V0IiwgInBvaW50ZXJvZiIsCiAgICAgICJwcml2YXRlIiwgInByb3RlY3RlZCIsICJyZXNjdWUiLCAicmV0dXJuIiwgInJlcXVpcmUiLCAic2l6ZW9mIiwgInN0cnVjdCIsCiAgICAgICJzdXBlciIsICJ0aGVuIiwgInR5cGUiLCAidHlwZW9mIiwgInVuaW9uIiwgInVubGVzcyIsICJ1bnRpbCIsICJ3aGVuIiwgIndoaWxlIiwgIndpdGgiLAogICAgICAieWllbGQiLCAiX19ESVJfXyIsICJfX0ZJTEVfXyIsICJfX0xJTkVfXyIKICAgIF0pOwogICAgdmFyIGF0b21Xb3JkcyA9IHdvcmRSZWdFeHAoWyJ0cnVlIiwgImZhbHNlIiwgIm5pbCIsICJzZWxmIl0pOwogICAgdmFyIGluZGVudEtleXdvcmRzQXJyYXkgPSBbCiAgICAgICJkZWYiLCAiZnVuIiwgIm1hY3JvIiwKICAgICAgImNsYXNzIiwgIm1vZHVsZSIsICJzdHJ1Y3QiLCAibGliIiwgImVudW0iLCAidW5pb24iLAogICAgICAiaWYiLCAidW5sZXNzIiwgImNhc2UiLCAid2hpbGUiLCAidW50aWwiLCAiYmVnaW4iLCAidGhlbiIsCiAgICAgICJkbyIsCiAgICAgICJmb3IiLCAiaWZkZWYiCiAgICBdOwogICAgdmFyIGluZGVudEtleXdvcmRzID0gd29yZFJlZ0V4cChpbmRlbnRLZXl3b3Jkc0FycmF5KTsKICAgIHZhciBkZWRlbnRLZXl3b3Jkc0FycmF5ID0gWwogICAgICAiZW5kIiwKICAgICAgImVsc2UiLCAiZWxzaWYiLAogICAgICAicmVzY3VlIiwgImVuc3VyZSIKICAgIF07CiAgICB2YXIgZGVkZW50S2V5d29yZHMgPSB3b3JkUmVnRXhwKGRlZGVudEtleXdvcmRzQXJyYXkpOwogICAgdmFyIGRlZGVudFB1bmN0dWFsc0FycmF5ID0gWyJcXCkiLCAiXFx9IiwgIlxcXSJdOwogICAgdmFyIGRlZGVudFB1bmN0dWFscyA9IG5ldyBSZWdFeHAoIl4oPzoiICsgZGVkZW50UHVuY3R1YWxzQXJyYXkuam9pbigifCIpICsgIikkIik7CiAgICB2YXIgbmV4dFRva2VuaXplciA9IHsKICAgICAgImRlZiI6IHRva2VuRm9sbG93SWRlbnQsICJmdW4iOiB0b2tlbkZvbGxvd0lkZW50LCAibWFjcm8iOiB0b2tlbk1hY3JvRGVmLAogICAgICAiY2xhc3MiOiB0b2tlbkZvbGxvd1R5cGUsICJtb2R1bGUiOiB0b2tlbkZvbGxvd1R5cGUsICJzdHJ1Y3QiOiB0b2tlbkZvbGxvd1R5cGUsCiAgICAgICJsaWIiOiB0b2tlbkZvbGxvd1R5cGUsICJlbnVtIjogdG9rZW5Gb2xsb3dUeXBlLCAidW5pb24iOiB0b2tlbkZvbGxvd1R5cGUKICAgIH07CiAgICB2YXIgbWF0Y2hpbmcgPSB7IlsiOiAiXSIsICJ7IjogIn0iLCAiKCI6ICIpIiwgIjwiOiAiPiJ9OwoKICAgIGZ1bmN0aW9uIHRva2VuQmFzZShzdHJlYW0sIHN0YXRlKSB7CiAgICAgIGlmIChzdHJlYW0uZWF0U3BhY2UoKSkgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CgogICAgICAvLyBNYWNyb3MKICAgICAgaWYgKHN0YXRlLmxhc3RUb2tlbiAhPSAiXFwiICYmIHN0cmVhbS5tYXRjaCgieyUiLCBmYWxzZSkpIHsKICAgICAgICByZXR1cm4gY2hhaW4odG9rZW5NYWNybygiJSIsICIlIiksIHN0cmVhbSwgc3RhdGUpOwogICAgICB9CgogICAgICBpZiAoc3RhdGUubGFzdFRva2VuICE9ICJcXCIgJiYgc3RyZWFtLm1hdGNoKCJ7eyIsIGZhbHNlKSkgewogICAgICAgIHJldHVybiBjaGFpbih0b2tlbk1hY3JvKCJ7IiwgIn0iKSwgc3RyZWFtLCBzdGF0ZSk7CiAgICAgIH0KCiAgICAgIC8vIENvbW1lbnRzCiAgICAgIGlmIChzdHJlYW0ucGVlaygpID09ICIjIikgewogICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgICByZXR1cm4gImNvbW1lbnQiOwogICAgICB9CgogICAgICAvLyBWYXJpYWJsZXMgYW5kIGtleXdvcmRzCiAgICAgIHZhciBtYXRjaGVkOwogICAgICBpZiAoc3RyZWFtLm1hdGNoKGlkZW50cykpIHsKICAgICAgICBzdHJlYW0uZWF0KC9bPyFdLyk7CgogICAgICAgIG1hdGNoZWQgPSBzdHJlYW0uY3VycmVudCgpOwogICAgICAgIGlmIChzdHJlYW0uZWF0KCI6IikpIHsKICAgICAgICAgIHJldHVybiAiYXRvbSI7CiAgICAgICAgfSBlbHNlIGlmIChzdGF0ZS5sYXN0VG9rZW4gPT0gIi4iKSB7CiAgICAgICAgICByZXR1cm4gInByb3BlcnR5IjsKICAgICAgICB9IGVsc2UgaWYgKGtleXdvcmRzLnRlc3QobWF0Y2hlZCkpIHsKICAgICAgICAgIGlmIChzdGF0ZS5sYXN0VG9rZW4gIT0gImFic3RyYWN0IiAmJiBpbmRlbnRLZXl3b3Jkcy50ZXN0KG1hdGNoZWQpKSB7CiAgICAgICAgICAgIGlmICghKG1hdGNoZWQgPT0gImZ1biIgJiYgc3RhdGUuYmxvY2tzLmluZGV4T2YoImxpYiIpID49IDApKSB7CiAgICAgICAgICAgICAgc3RhdGUuYmxvY2tzLnB1c2gobWF0Y2hlZCk7CiAgICAgICAgICAgICAgc3RhdGUuY3VycmVudEluZGVudCArPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgaWYgKGRlZGVudEtleXdvcmRzLnRlc3QobWF0Y2hlZCkpIHsKICAgICAgICAgICAgc3RhdGUuYmxvY2tzLnBvcCgpOwogICAgICAgICAgICBzdGF0ZS5jdXJyZW50SW5kZW50IC09IDE7CiAgICAgICAgICB9CgogICAgICAgICAgaWYgKG5leHRUb2tlbml6ZXIuaGFzT3duUHJvcGVydHkobWF0Y2hlZCkpIHsKICAgICAgICAgICAgc3RhdGUudG9rZW5pemUucHVzaChuZXh0VG9rZW5pemVyW21hdGNoZWRdKTsKICAgICAgICAgIH0KCiAgICAgICAgICByZXR1cm4gImtleXdvcmQiOwogICAgICAgIH0gZWxzZSBpZiAoYXRvbVdvcmRzLnRlc3QobWF0Y2hlZCkpIHsKICAgICAgICAgIHJldHVybiAiYXRvbSI7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gInZhcmlhYmxlIjsKICAgICAgfQoKICAgICAgLy8gQ2xhc3MgdmFyaWFibGVzIGFuZCBpbnN0YW5jZSB2YXJpYWJsZXMKICAgICAgLy8gb3IgYXR0cmlidXRlcwogICAgICBpZiAoc3RyZWFtLmVhdCgiQCIpKSB7CiAgICAgICAgaWYgKHN0cmVhbS5wZWVrKCkgPT0gIlsiKSB7CiAgICAgICAgICByZXR1cm4gY2hhaW4odG9rZW5OZXN0KCJbIiwgIl0iLCAibWV0YSIpLCBzdHJlYW0sIHN0YXRlKTsKICAgICAgICB9CgogICAgICAgIHN0cmVhbS5lYXQoIkAiKTsKICAgICAgICBzdHJlYW0ubWF0Y2goaWRlbnRzKSB8fCBzdHJlYW0ubWF0Y2godHlwZXMpOwogICAgICAgIHJldHVybiAidmFyaWFibGUtMiI7CiAgICAgIH0KCiAgICAgIC8vIEdsb2JhbCB2YXJpYWJsZXMKICAgICAgaWYgKHN0cmVhbS5lYXQoIiQiKSkgewogICAgICAgIHN0cmVhbS5lYXQoL1swLTldK3xcPy8pIHx8IHN0cmVhbS5tYXRjaChpZGVudHMpIHx8IHN0cmVhbS5tYXRjaCh0eXBlcyk7CiAgICAgICAgcmV0dXJuICJ2YXJpYWJsZS0zIjsKICAgICAgfQoKICAgICAgLy8gQ29uc3RhbnRzIGFuZCB0eXBlcwogICAgICBpZiAoc3RyZWFtLm1hdGNoKHR5cGVzKSkgewogICAgICAgIHJldHVybiAidGFnIjsKICAgICAgfQoKICAgICAgLy8gU3ltYm9scyBvciAnOicgb3BlcmF0b3IKICAgICAgaWYgKHN0cmVhbS5lYXQoIjoiKSkgewogICAgICAgIGlmIChzdHJlYW0uZWF0KCJcIiIpKSB7CiAgICAgICAgICByZXR1cm4gY2hhaW4odG9rZW5RdW90ZSgiXCIiLCAiYXRvbSIsIGZhbHNlKSwgc3RyZWFtLCBzdGF0ZSk7CiAgICAgICAgfSBlbHNlIGlmIChzdHJlYW0ubWF0Y2goaWRlbnRzKSB8fCBzdHJlYW0ubWF0Y2godHlwZXMpIHx8CiAgICAgICAgICAgICAgICAgICBzdHJlYW0ubWF0Y2gob3BlcmF0b3JzKSB8fCBzdHJlYW0ubWF0Y2goY29uZGl0aW9uYWxPcGVyYXRvcnMpIHx8IHN0cmVhbS5tYXRjaChpbmRleGluZ09wZXJhdG9ycykpIHsKICAgICAgICAgIHJldHVybiAiYXRvbSI7CiAgICAgICAgfQogICAgICAgIHN0cmVhbS5lYXQoIjoiKTsKICAgICAgICByZXR1cm4gIm9wZXJhdG9yIjsKICAgICAgfQoKICAgICAgLy8gU3RyaW5ncwogICAgICBpZiAoc3RyZWFtLmVhdCgiXCIiKSkgewogICAgICAgIHJldHVybiBjaGFpbih0b2tlblF1b3RlKCJcIiIsICJzdHJpbmciLCB0cnVlKSwgc3RyZWFtLCBzdGF0ZSk7CiAgICAgIH0KCiAgICAgIC8vIFN0cmluZ3Mgb3IgcmVnZXhwcyBvciBtYWNybyB2YXJpYWJsZXMgb3IgJyUnIG9wZXJhdG9yCiAgICAgIGlmIChzdHJlYW0ucGVlaygpID09ICIlIikgewogICAgICAgIHZhciBzdHlsZSA9ICJzdHJpbmciOwogICAgICAgIHZhciBlbWJlZCA9IHRydWU7CiAgICAgICAgdmFyIGRlbGltOwoKICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKCIlciIpKSB7CiAgICAgICAgICAvLyBSZWdleHBzCiAgICAgICAgICBzdHlsZSA9ICJzdHJpbmctMiI7CiAgICAgICAgICBkZWxpbSA9IHN0cmVhbS5uZXh0KCk7CiAgICAgICAgfSBlbHNlIGlmIChzdHJlYW0ubWF0Y2goIiV3IikpIHsKICAgICAgICAgIGVtYmVkID0gZmFsc2U7CiAgICAgICAgICBkZWxpbSA9IHN0cmVhbS5uZXh0KCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmKGRlbGltID0gc3RyZWFtLm1hdGNoKC9eJShbXlx3XHM9XSkvKSkgewogICAgICAgICAgICBkZWxpbSA9IGRlbGltWzFdOwogICAgICAgICAgfSBlbHNlIGlmIChzdHJlYW0ubWF0Y2goL14lW2EtekEtWjAtOV9cdTAwOUYtXHVGRkZGXSovKSkgewogICAgICAgICAgICAvLyBNYWNybyB2YXJpYWJsZXMKICAgICAgICAgICAgcmV0dXJuICJtZXRhIjsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vICclJyBvcGVyYXRvcgogICAgICAgICAgICByZXR1cm4gIm9wZXJhdG9yIjsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChtYXRjaGluZy5oYXNPd25Qcm9wZXJ0eShkZWxpbSkpIHsKICAgICAgICAgIGRlbGltID0gbWF0Y2hpbmdbZGVsaW1dOwogICAgICAgIH0KICAgICAgICByZXR1cm4gY2hhaW4odG9rZW5RdW90ZShkZWxpbSwgc3R5bGUsIGVtYmVkKSwgc3RyZWFtLCBzdGF0ZSk7CiAgICAgIH0KCiAgICAgIC8vIENoYXJhY3RlcnMKICAgICAgaWYgKHN0cmVhbS5lYXQoIiciKSkgewogICAgICAgIHN0cmVhbS5tYXRjaCgvXig/OlteJ118XFwoPzpbYmVmbnJ0djAnIl18WzAtN117M318dSg/OlswLTlhLWZBLUZdezR9fFx7WzAtOWEtZkEtRl17MSw2fVx9KSkpLyk7CiAgICAgICAgc3RyZWFtLmVhdCgiJyIpOwogICAgICAgIHJldHVybiAiYXRvbSI7CiAgICAgIH0KCiAgICAgIC8vIE51bWJlcnMKICAgICAgaWYgKHN0cmVhbS5lYXQoIjAiKSkgewogICAgICAgIGlmIChzdHJlYW0uZWF0KCJ4IikpIHsKICAgICAgICAgIHN0cmVhbS5tYXRjaCgvXlswLTlhLWZBLUZdKy8pOwogICAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLmVhdCgibyIpKSB7CiAgICAgICAgICBzdHJlYW0ubWF0Y2goL15bMC03XSsvKTsKICAgICAgICB9IGVsc2UgaWYgKHN0cmVhbS5lYXQoImIiKSkgewogICAgICAgICAgc3RyZWFtLm1hdGNoKC9eWzAxXSsvKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICJudW1iZXIiOwogICAgICB9CgogICAgICBpZiAoc3RyZWFtLmVhdCgvXGQvKSkgewogICAgICAgIHN0cmVhbS5tYXRjaCgvXlxkKig/OlwuXGQrKT8oPzpbZUVdWystXT9cZCspPy8pOwogICAgICAgIHJldHVybiAibnVtYmVyIjsKICAgICAgfQoKICAgICAgLy8gT3BlcmF0b3JzCiAgICAgIGlmIChzdHJlYW0ubWF0Y2gob3BlcmF0b3JzKSkgewogICAgICAgIHN0cmVhbS5lYXQoIj0iKTsgLy8gT3BlcmF0b3JzIGNhbiBmb2xsb3cgYXNzaWduIHN5bWJvbC4KICAgICAgICByZXR1cm4gIm9wZXJhdG9yIjsKICAgICAgfQoKICAgICAgaWYgKHN0cmVhbS5tYXRjaChjb25kaXRpb25hbE9wZXJhdG9ycykgfHwgc3RyZWFtLm1hdGNoKGFub3RoZXJPcGVyYXRvcnMpKSB7CiAgICAgICAgcmV0dXJuICJvcGVyYXRvciI7CiAgICAgIH0KCiAgICAgIC8vIFBhcmVucyBhbmQgYnJhY2VzCiAgICAgIGlmIChtYXRjaGVkID0gc3RyZWFtLm1hdGNoKC9bKHtbXS8sIGZhbHNlKSkgewogICAgICAgIG1hdGNoZWQgPSBtYXRjaGVkWzBdOwogICAgICAgIHJldHVybiBjaGFpbih0b2tlbk5lc3QobWF0Y2hlZCwgbWF0Y2hpbmdbbWF0Y2hlZF0sIG51bGwpLCBzdHJlYW0sIHN0YXRlKTsKICAgICAgfQoKICAgICAgLy8gRXNjYXBlcwogICAgICBpZiAoc3RyZWFtLmVhdCgiXFwiKSkgewogICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgcmV0dXJuICJtZXRhIjsKICAgICAgfQoKICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgZnVuY3Rpb24gdG9rZW5OZXN0KGJlZ2luLCBlbmQsIHN0eWxlLCBzdGFydGVkKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbiAoc3RyZWFtLCBzdGF0ZSkgewogICAgICAgIGlmICghc3RhcnRlZCAmJiBzdHJlYW0ubWF0Y2goYmVnaW4pKSB7CiAgICAgICAgICBzdGF0ZS50b2tlbml6ZVtzdGF0ZS50b2tlbml6ZS5sZW5ndGggLSAxXSA9IHRva2VuTmVzdChiZWdpbiwgZW5kLCBzdHlsZSwgdHJ1ZSk7CiAgICAgICAgICBzdGF0ZS5jdXJyZW50SW5kZW50ICs9IDE7CiAgICAgICAgICByZXR1cm4gc3R5bGU7CiAgICAgICAgfQoKICAgICAgICB2YXIgbmV4dFN0eWxlID0gdG9rZW5CYXNlKHN0cmVhbSwgc3RhdGUpOwogICAgICAgIGlmIChzdHJlYW0uY3VycmVudCgpID09PSBlbmQpIHsKICAgICAgICAgIHN0YXRlLnRva2VuaXplLnBvcCgpOwogICAgICAgICAgc3RhdGUuY3VycmVudEluZGVudCAtPSAxOwogICAgICAgICAgbmV4dFN0eWxlID0gc3R5bGU7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gbmV4dFN0eWxlOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHRva2VuTWFjcm8oYmVnaW4sIGVuZCwgc3RhcnRlZCkgewogICAgICByZXR1cm4gZnVuY3Rpb24gKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgICBpZiAoIXN0YXJ0ZWQgJiYgc3RyZWFtLm1hdGNoKCJ7IiArIGJlZ2luKSkgewogICAgICAgICAgc3RhdGUuY3VycmVudEluZGVudCArPSAxOwogICAgICAgICAgc3RhdGUudG9rZW5pemVbc3RhdGUudG9rZW5pemUubGVuZ3RoIC0gMV0gPSB0b2tlbk1hY3JvKGJlZ2luLCBlbmQsIHRydWUpOwogICAgICAgICAgcmV0dXJuICJtZXRhIjsKICAgICAgICB9CgogICAgICAgIGlmIChzdHJlYW0ubWF0Y2goZW5kICsgIn0iKSkgewogICAgICAgICAgc3RhdGUuY3VycmVudEluZGVudCAtPSAxOwogICAgICAgICAgc3RhdGUudG9rZW5pemUucG9wKCk7CiAgICAgICAgICByZXR1cm4gIm1ldGEiOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRva2VuQmFzZShzdHJlYW0sIHN0YXRlKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiB0b2tlbk1hY3JvRGVmKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgaWYgKHN0cmVhbS5lYXRTcGFjZSgpKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KCiAgICAgIHZhciBtYXRjaGVkOwogICAgICBpZiAobWF0Y2hlZCA9IHN0cmVhbS5tYXRjaChpZGVudHMpKSB7CiAgICAgICAgaWYgKG1hdGNoZWQgPT0gImRlZiIpIHsKICAgICAgICAgIHJldHVybiAia2V5d29yZCI7CiAgICAgICAgfQogICAgICAgIHN0cmVhbS5lYXQoL1s/IV0vKTsKICAgICAgfQoKICAgICAgc3RhdGUudG9rZW5pemUucG9wKCk7CiAgICAgIHJldHVybiAiZGVmIjsKICAgIH0KCiAgICBmdW5jdGlvbiB0b2tlbkZvbGxvd0lkZW50KHN0cmVhbSwgc3RhdGUpIHsKICAgICAgaWYgKHN0cmVhbS5lYXRTcGFjZSgpKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KCiAgICAgIGlmIChzdHJlYW0ubWF0Y2goaWRlbnRzKSkgewogICAgICAgIHN0cmVhbS5lYXQoL1shP10vKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzdHJlYW0ubWF0Y2gob3BlcmF0b3JzKSB8fCBzdHJlYW0ubWF0Y2goY29uZGl0aW9uYWxPcGVyYXRvcnMpIHx8IHN0cmVhbS5tYXRjaChpbmRleGluZ09wZXJhdG9ycyk7CiAgICAgIH0KICAgICAgc3RhdGUudG9rZW5pemUucG9wKCk7CiAgICAgIHJldHVybiAiZGVmIjsKICAgIH0KCiAgICBmdW5jdGlvbiB0b2tlbkZvbGxvd1R5cGUoc3RyZWFtLCBzdGF0ZSkgewogICAgICBpZiAoc3RyZWFtLmVhdFNwYWNlKCkpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQoKICAgICAgc3RyZWFtLm1hdGNoKHR5cGVzKTsKICAgICAgc3RhdGUudG9rZW5pemUucG9wKCk7CiAgICAgIHJldHVybiAiZGVmIjsKICAgIH0KCiAgICBmdW5jdGlvbiB0b2tlblF1b3RlKGVuZCwgc3R5bGUsIGVtYmVkKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbiAoc3RyZWFtLCBzdGF0ZSkgewogICAgICAgIHZhciBlc2NhcGVkID0gZmFsc2U7CgogICAgICAgIHdoaWxlIChzdHJlYW0ucGVlaygpKSB7CiAgICAgICAgICBpZiAoIWVzY2FwZWQpIHsKICAgICAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgieyUiLCBmYWxzZSkpIHsKICAgICAgICAgICAgICBzdGF0ZS50b2tlbml6ZS5wdXNoKHRva2VuTWFjcm8oIiUiLCAiJSIpKTsKICAgICAgICAgICAgICByZXR1cm4gc3R5bGU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzdHJlYW0ubWF0Y2goInt7IiwgZmFsc2UpKSB7CiAgICAgICAgICAgICAgc3RhdGUudG9rZW5pemUucHVzaCh0b2tlbk1hY3JvKCJ7IiwgIn0iKSk7CiAgICAgICAgICAgICAgcmV0dXJuIHN0eWxlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoZW1iZWQgJiYgc3RyZWFtLm1hdGNoKCIjeyIsIGZhbHNlKSkgewogICAgICAgICAgICAgIHN0YXRlLnRva2VuaXplLnB1c2godG9rZW5OZXN0KCIjeyIsICJ9IiwgIm1ldGEiKSk7CiAgICAgICAgICAgICAgcmV0dXJuIHN0eWxlOwogICAgICAgICAgICB9CgogICAgICAgICAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpOwoKICAgICAgICAgICAgaWYgKGNoID09IGVuZCkgewogICAgICAgICAgICAgIHN0YXRlLnRva2VuaXplLnBvcCgpOwogICAgICAgICAgICAgIHJldHVybiBzdHlsZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgZXNjYXBlZCA9IGNoID09ICJcXCI7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgICAgICBlc2NhcGVkID0gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gc3R5bGU7CiAgICAgIH07CiAgICB9CgogICAgcmV0dXJuIHsKICAgICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24gKCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICB0b2tlbml6ZTogW3Rva2VuQmFzZV0sCiAgICAgICAgICBjdXJyZW50SW5kZW50OiAwLAogICAgICAgICAgbGFzdFRva2VuOiBudWxsLAogICAgICAgICAgYmxvY2tzOiBbXQogICAgICAgIH07CiAgICAgIH0sCgogICAgICB0b2tlbjogZnVuY3Rpb24gKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgICB2YXIgc3R5bGUgPSBzdGF0ZS50b2tlbml6ZVtzdGF0ZS50b2tlbml6ZS5sZW5ndGggLSAxXShzdHJlYW0sIHN0YXRlKTsKICAgICAgICB2YXIgdG9rZW4gPSBzdHJlYW0uY3VycmVudCgpOwoKICAgICAgICBpZiAoc3R5bGUgJiYgc3R5bGUgIT0gImNvbW1lbnQiKSB7CiAgICAgICAgICBzdGF0ZS5sYXN0VG9rZW4gPSB0b2tlbjsKICAgICAgICB9CgogICAgICAgIHJldHVybiBzdHlsZTsKICAgICAgfSwKCiAgICAgIGluZGVudDogZnVuY3Rpb24gKHN0YXRlLCB0ZXh0QWZ0ZXIpIHsKICAgICAgICB0ZXh0QWZ0ZXIgPSB0ZXh0QWZ0ZXIucmVwbGFjZSgvXlxzKig/Olx7JSk/XHMqfFxzKig/OiVcfSk/XHMqJC9nLCAiIik7CgogICAgICAgIGlmIChkZWRlbnRLZXl3b3Jkcy50ZXN0KHRleHRBZnRlcikgfHwgZGVkZW50UHVuY3R1YWxzLnRlc3QodGV4dEFmdGVyKSkgewogICAgICAgICAgcmV0dXJuIGNvbmZpZy5pbmRlbnRVbml0ICogKHN0YXRlLmN1cnJlbnRJbmRlbnQgLSAxKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBjb25maWcuaW5kZW50VW5pdCAqIHN0YXRlLmN1cnJlbnRJbmRlbnQ7CiAgICAgIH0sCgogICAgICBmb2xkOiAiaW5kZW50IiwKICAgICAgZWxlY3RyaWNJbnB1dDogd29yZFJlZ0V4cChkZWRlbnRQdW5jdHVhbHNBcnJheS5jb25jYXQoZGVkZW50S2V5d29yZHNBcnJheSksIHRydWUpLAogICAgICBsaW5lQ29tbWVudDogJyMnCiAgICB9OwogIH0pOwoKICBDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveC1jcnlzdGFsIiwgImNyeXN0YWwiKTsKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/crystal/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogQ3J5c3RhbCBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uLy4uL2FkZG9uL2VkaXQvbWF0Y2hicmFja2V0cy5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJjcnlzdGFsLmpzIj48L3NjcmlwdD4KPHN0eWxlPgogIC5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazt9CiAgLmNtLXMtZGVmYXVsdCBzcGFuLmNtLWFycm93IHsgY29sb3I6IHJlZDsgfQo8L3N0eWxlPgoKPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aDE+Q29kZU1pcnJvcjwvaDE+PGltZyBpZD1sb2dvIHNyYz0iLi4vLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+TGFuZ3VhZ2UgbW9kZXM8L2E+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPkNyeXN0YWw8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPkNyeXN0YWwgbW9kZTwvaDI+Cjxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+CiMgRmVhdHVyZXMgb2YgQ3J5c3RhbAojIC0gUnVieS1pbnNwaXJlZCBzeW50YXguCiMgLSBTdGF0aWNhbGx5IHR5cGUtY2hlY2tlZCBidXQgd2l0aG91dCBoYXZpbmcgdG8gc3BlY2lmeSB0aGUgdHlwZSBvZiB2YXJpYWJsZXMgb3IgbWV0aG9kIGFyZ3VtZW50cy4KIyAtIEJlIGFibGUgdG8gY2FsbCBDIGNvZGUgYnkgd3JpdGluZyBiaW5kaW5ncyB0byBpdCBpbiBDcnlzdGFsLgojIC0gSGF2ZSBjb21waWxlLXRpbWUgZXZhbHVhdGlvbiBhbmQgZ2VuZXJhdGlvbiBvZiBjb2RlLCB0byBhdm9pZCBib2lsZXJwbGF0ZSBjb2RlLgojIC0gQ29tcGlsZSB0byBlZmZpY2llbnQgbmF0aXZlIGNvZGUuCgojIEEgdmVyeSBiYXNpYyBIVFRQIHNlcnZlcgpyZXF1aXJlICJodHRwL3NlcnZlciIKCnNlcnZlciA9IEhUVFA6OlNlcnZlci5uZXcoODA4MCkgZG8gfHJlcXVlc3R8CiAgSFRUUDo6UmVzcG9uc2Uub2sgInRleHQvcGxhaW4iLCAiSGVsbG8gd29ybGQsIGdvdCAje3JlcXVlc3QucGF0aH0hIgplbmQKCnB1dHMgIkxpc3RlbmluZyBvbiBodHRwOi8vMC4wLjAuMDo4MDgwIgpzZXJ2ZXIubGlzdGVuCgptb2R1bGUgRm9vCiAgZGVmIGluaXRpYWxpemUoQGZvbyk7IGVuZAoKICBhYnN0cmFjdCBkZWYgYWJzdHJhY3RfbWV0aG9kIDogU3RyaW5nCgogIEBbQWx3YXlzSW5saW5lXQogIGRlZiB3aXRoX2Zvb2ZvbwogICAgd2l0aCBGb28ubmV3KHNlbGYpIHlpZWxkCiAgZW5kCgogIHN0cnVjdCBGb28KICAgIGRlZiBpbml0aWFsaXplKEBmb28pOyBlbmQKCiAgICBkZWYgaGVsbG9fd29ybGQKICAgICAgQGZvby5hYnN0cmFjdF9tZXRob2QKICAgIGVuZAogIGVuZAplbmQKCmNsYXNzIEJhcgogIGluY2x1ZGUgRm9vCgogIEBAZm9vYmFyID0gMTIzNDUKCiAgZGVmIGluaXRpYWxpemUoQGJhcikKICAgIHN1cGVyKEBiYXIubm90X25pbCEgKyAxMDApCiAgZW5kCgogIG1hY3JvIGFsaWFzX21ldGhvZChuYW1lLCBtZXRob2QpCiAgICBkZWYge3sgbmFtZSB9fSgqYXJncykKICAgICAge3sgbWV0aG9kIH19KCphcmdzKQogICAgZW5kCiAgZW5kCgogIGRlZiBhX21ldGhvZAogICAgIkhlbGxvLCBXb3JsZCIKICBlbmQKCiAgYWxpYXNfbWV0aG9kIGFic3RyYWN0X21ldGhvZCwgYV9tZXRob2QKCiAgbWFjcm8gZGVmIHNob3dfaW5zdGFuY2VfdmFycyA6IE5pbAogICAgeyUgZm9yIHZhciBpbiBAdHlwZS5pbnN0YW5jZV92YXJzICV9CiAgICAgIHB1dHMgIkB7eyB2YXIgfX0gPSAjeyBAe3sgdmFyIH19IH0iCiAgICB7JSBlbmQgJX0KICAgIG5pbAogIGVuZAplbmQKCmNsYXNzIEJheiAmbHQ7IEJhcjsgZW5kCgpsaWIgTGliQwogIGZ1biBjX3B1dHMgPSAicHV0cyIoc3RyIDogQ2hhciopIDogSW50CmVuZAoKJGJheiA9IEJhei5uZXcoMTAwKQokYmF6LnNob3dfaW5zdGFuY2VfdmFycwokYmF6LndpdGhfZm9vZm9vIGRvCiAgTGliQy5jX3B1dHMgaGVsbG9fd29ybGQKZW5kCjwvdGV4dGFyZWE+PC9mb3JtPgo8c2NyaXB0PgogIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICBtb2RlOiAidGV4dC94LWNyeXN0YWwiLAogICAgbWF0Y2hCcmFja2V0czogdHJ1ZSwKICAgIGluZGVudFVuaXQ6IDIKICB9KTsKPC9zY3JpcHQ+Cgo8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC94LWNyeXN0YWw8L2NvZGU+LjwvcD4KPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/css/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/css/css.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJjc3MiLCBmdW5jdGlvbihjb25maWcsIHBhcnNlckNvbmZpZykgewogIHZhciBpbmxpbmUgPSBwYXJzZXJDb25maWcuaW5saW5lCiAgaWYgKCFwYXJzZXJDb25maWcucHJvcGVydHlLZXl3b3JkcykgcGFyc2VyQ29uZmlnID0gQ29kZU1pcnJvci5yZXNvbHZlTW9kZSgidGV4dC9jc3MiKTsKCiAgdmFyIGluZGVudFVuaXQgPSBjb25maWcuaW5kZW50VW5pdCwKICAgICAgdG9rZW5Ib29rcyA9IHBhcnNlckNvbmZpZy50b2tlbkhvb2tzLAogICAgICBkb2N1bWVudFR5cGVzID0gcGFyc2VyQ29uZmlnLmRvY3VtZW50VHlwZXMgfHwge30sCiAgICAgIG1lZGlhVHlwZXMgPSBwYXJzZXJDb25maWcubWVkaWFUeXBlcyB8fCB7fSwKICAgICAgbWVkaWFGZWF0dXJlcyA9IHBhcnNlckNvbmZpZy5tZWRpYUZlYXR1cmVzIHx8IHt9LAogICAgICBtZWRpYVZhbHVlS2V5d29yZHMgPSBwYXJzZXJDb25maWcubWVkaWFWYWx1ZUtleXdvcmRzIHx8IHt9LAogICAgICBwcm9wZXJ0eUtleXdvcmRzID0gcGFyc2VyQ29uZmlnLnByb3BlcnR5S2V5d29yZHMgfHwge30sCiAgICAgIG5vblN0YW5kYXJkUHJvcGVydHlLZXl3b3JkcyA9IHBhcnNlckNvbmZpZy5ub25TdGFuZGFyZFByb3BlcnR5S2V5d29yZHMgfHwge30sCiAgICAgIGZvbnRQcm9wZXJ0aWVzID0gcGFyc2VyQ29uZmlnLmZvbnRQcm9wZXJ0aWVzIHx8IHt9LAogICAgICBjb3VudGVyRGVzY3JpcHRvcnMgPSBwYXJzZXJDb25maWcuY291bnRlckRlc2NyaXB0b3JzIHx8IHt9LAogICAgICBjb2xvcktleXdvcmRzID0gcGFyc2VyQ29uZmlnLmNvbG9yS2V5d29yZHMgfHwge30sCiAgICAgIHZhbHVlS2V5d29yZHMgPSBwYXJzZXJDb25maWcudmFsdWVLZXl3b3JkcyB8fCB7fSwKICAgICAgYWxsb3dOZXN0ZWQgPSBwYXJzZXJDb25maWcuYWxsb3dOZXN0ZWQsCiAgICAgIHN1cHBvcnRzQXRDb21wb25lbnQgPSBwYXJzZXJDb25maWcuc3VwcG9ydHNBdENvbXBvbmVudCA9PT0gdHJ1ZTsKCiAgdmFyIHR5cGUsIG92ZXJyaWRlOwogIGZ1bmN0aW9uIHJldChzdHlsZSwgdHApIHsgdHlwZSA9IHRwOyByZXR1cm4gc3R5bGU7IH0KCiAgLy8gVG9rZW5pemVycwoKICBmdW5jdGlvbiB0b2tlbkJhc2Uoc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIGNoID0gc3RyZWFtLm5leHQoKTsKICAgIGlmICh0b2tlbkhvb2tzW2NoXSkgewogICAgICB2YXIgcmVzdWx0ID0gdG9rZW5Ib29rc1tjaF0oc3RyZWFtLCBzdGF0ZSk7CiAgICAgIGlmIChyZXN1bHQgIT09IGZhbHNlKSByZXR1cm4gcmVzdWx0OwogICAgfQogICAgaWYgKGNoID09ICJAIikgewogICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcd1xcXC1dLyk7CiAgICAgIHJldHVybiByZXQoImRlZiIsIHN0cmVhbS5jdXJyZW50KCkpOwogICAgfSBlbHNlIGlmIChjaCA9PSAiPSIgfHwgKGNoID09ICJ+IiB8fCBjaCA9PSAifCIpICYmIHN0cmVhbS5lYXQoIj0iKSkgewogICAgICByZXR1cm4gcmV0KG51bGwsICJjb21wYXJlIik7CiAgICB9IGVsc2UgaWYgKGNoID09ICJcIiIgfHwgY2ggPT0gIiciKSB7CiAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5TdHJpbmcoY2gpOwogICAgICByZXR1cm4gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CiAgICB9IGVsc2UgaWYgKGNoID09ICIjIikgewogICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcd1xcXC1dLyk7CiAgICAgIHJldHVybiByZXQoImF0b20iLCAiaGFzaCIpOwogICAgfSBlbHNlIGlmIChjaCA9PSAiISIpIHsKICAgICAgc3RyZWFtLm1hdGNoKC9eXHMqXHcqLyk7CiAgICAgIHJldHVybiByZXQoImtleXdvcmQiLCAiaW1wb3J0YW50Iik7CiAgICB9IGVsc2UgaWYgKC9cZC8udGVzdChjaCkgfHwgY2ggPT0gIi4iICYmIHN0cmVhbS5lYXQoL1xkLykpIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXHcuJV0vKTsKICAgICAgcmV0dXJuIHJldCgibnVtYmVyIiwgInVuaXQiKTsKICAgIH0gZWxzZSBpZiAoY2ggPT09ICItIikgewogICAgICBpZiAoL1tcZC5dLy50ZXN0KHN0cmVhbS5wZWVrKCkpKSB7CiAgICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXHcuJV0vKTsKICAgICAgICByZXR1cm4gcmV0KCJudW1iZXIiLCAidW5pdCIpOwogICAgICB9IGVsc2UgaWYgKHN0cmVhbS5tYXRjaCgvXi1bXHdcXFwtXSsvKSkgewogICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1x3XFxcLV0vKTsKICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eXHMqOi8sIGZhbHNlKSkKICAgICAgICAgIHJldHVybiByZXQoInZhcmlhYmxlLTIiLCAidmFyaWFibGUtZGVmaW5pdGlvbiIpOwogICAgICAgIHJldHVybiByZXQoInZhcmlhYmxlLTIiLCAidmFyaWFibGUiKTsKICAgICAgfSBlbHNlIGlmIChzdHJlYW0ubWF0Y2goL15cdystLykpIHsKICAgICAgICByZXR1cm4gcmV0KCJtZXRhIiwgIm1ldGEiKTsKICAgICAgfQogICAgfSBlbHNlIGlmICgvWywrPipcL10vLnRlc3QoY2gpKSB7CiAgICAgIHJldHVybiByZXQobnVsbCwgInNlbGVjdC1vcCIpOwogICAgfSBlbHNlIGlmIChjaCA9PSAiLiIgJiYgc3RyZWFtLm1hdGNoKC9eLT9bX2Etel1bX2EtejAtOS1dKi9pKSkgewogICAgICByZXR1cm4gcmV0KCJxdWFsaWZpZXIiLCAicXVhbGlmaWVyIik7CiAgICB9IGVsc2UgaWYgKC9bOjt7fVxbXF1cKFwpXS8udGVzdChjaCkpIHsKICAgICAgcmV0dXJuIHJldChudWxsLCBjaCk7CiAgICB9IGVsc2UgaWYgKChjaCA9PSAidSIgJiYgc3RyZWFtLm1hdGNoKC9ybCgtcHJlZml4KT9cKC8pKSB8fAogICAgICAgICAgICAgICAoY2ggPT0gImQiICYmIHN0cmVhbS5tYXRjaCgib21haW4oIikpIHx8CiAgICAgICAgICAgICAgIChjaCA9PSAiciIgJiYgc3RyZWFtLm1hdGNoKCJlZ2V4cCgiKSkpIHsKICAgICAgc3RyZWFtLmJhY2tVcCgxKTsKICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlblBhcmVudGhlc2l6ZWQ7CiAgICAgIHJldHVybiByZXQoInByb3BlcnR5IiwgIndvcmQiKTsKICAgIH0gZWxzZSBpZiAoL1tcd1xcXC1dLy50ZXN0KGNoKSkgewogICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcd1xcXC1dLyk7CiAgICAgIHJldHVybiByZXQoInByb3BlcnR5IiwgIndvcmQiKTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiByZXQobnVsbCwgbnVsbCk7CiAgICB9CiAgfQoKICBmdW5jdGlvbiB0b2tlblN0cmluZyhxdW90ZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgdmFyIGVzY2FwZWQgPSBmYWxzZSwgY2g7CiAgICAgIHdoaWxlICgoY2ggPSBzdHJlYW0ubmV4dCgpKSAhPSBudWxsKSB7CiAgICAgICAgaWYgKGNoID09IHF1b3RlICYmICFlc2NhcGVkKSB7CiAgICAgICAgICBpZiAocXVvdGUgPT0gIikiKSBzdHJlYW0uYmFja1VwKDEpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGVzY2FwZWQgPSAhZXNjYXBlZCAmJiBjaCA9PSAiXFwiOwogICAgICB9CiAgICAgIGlmIChjaCA9PSBxdW90ZSB8fCAhZXNjYXBlZCAmJiBxdW90ZSAhPSAiKSIpIHN0YXRlLnRva2VuaXplID0gbnVsbDsKICAgICAgcmV0dXJuIHJldCgic3RyaW5nIiwgInN0cmluZyIpOwogICAgfTsKICB9CgogIGZ1bmN0aW9uIHRva2VuUGFyZW50aGVzaXplZChzdHJlYW0sIHN0YXRlKSB7CiAgICBzdHJlYW0ubmV4dCgpOyAvLyBNdXN0IGJlICcoJwogICAgaWYgKCFzdHJlYW0ubWF0Y2goL1xzKltcIlwnKV0vLCBmYWxzZSkpCiAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5TdHJpbmcoIikiKTsKICAgIGVsc2UKICAgICAgc3RhdGUudG9rZW5pemUgPSBudWxsOwogICAgcmV0dXJuIHJldChudWxsLCAiKCIpOwogIH0KCiAgLy8gQ29udGV4dCBtYW5hZ2VtZW50CgogIGZ1bmN0aW9uIENvbnRleHQodHlwZSwgaW5kZW50LCBwcmV2KSB7CiAgICB0aGlzLnR5cGUgPSB0eXBlOwogICAgdGhpcy5pbmRlbnQgPSBpbmRlbnQ7CiAgICB0aGlzLnByZXYgPSBwcmV2OwogIH0KCiAgZnVuY3Rpb24gcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbSwgdHlwZSwgaW5kZW50KSB7CiAgICBzdGF0ZS5jb250ZXh0ID0gbmV3IENvbnRleHQodHlwZSwgc3RyZWFtLmluZGVudGF0aW9uKCkgKyAoaW5kZW50ID09PSBmYWxzZSA/IDAgOiBpbmRlbnRVbml0KSwgc3RhdGUuY29udGV4dCk7CiAgICByZXR1cm4gdHlwZTsKICB9CgogIGZ1bmN0aW9uIHBvcENvbnRleHQoc3RhdGUpIHsKICAgIGlmIChzdGF0ZS5jb250ZXh0LnByZXYpCiAgICAgIHN0YXRlLmNvbnRleHQgPSBzdGF0ZS5jb250ZXh0LnByZXY7CiAgICByZXR1cm4gc3RhdGUuY29udGV4dC50eXBlOwogIH0KCiAgZnVuY3Rpb24gcGFzcyh0eXBlLCBzdHJlYW0sIHN0YXRlKSB7CiAgICByZXR1cm4gc3RhdGVzW3N0YXRlLmNvbnRleHQudHlwZV0odHlwZSwgc3RyZWFtLCBzdGF0ZSk7CiAgfQogIGZ1bmN0aW9uIHBvcEFuZFBhc3ModHlwZSwgc3RyZWFtLCBzdGF0ZSwgbikgewogICAgZm9yICh2YXIgaSA9IG4gfHwgMTsgaSA+IDA7IGktLSkKICAgICAgc3RhdGUuY29udGV4dCA9IHN0YXRlLmNvbnRleHQucHJldjsKICAgIHJldHVybiBwYXNzKHR5cGUsIHN0cmVhbSwgc3RhdGUpOwogIH0KCiAgLy8gUGFyc2VyCgogIGZ1bmN0aW9uIHdvcmRBc1ZhbHVlKHN0cmVhbSkgewogICAgdmFyIHdvcmQgPSBzdHJlYW0uY3VycmVudCgpLnRvTG93ZXJDYXNlKCk7CiAgICBpZiAodmFsdWVLZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eSh3b3JkKSkKICAgICAgb3ZlcnJpZGUgPSAiYXRvbSI7CiAgICBlbHNlIGlmIChjb2xvcktleXdvcmRzLmhhc093blByb3BlcnR5KHdvcmQpKQogICAgICBvdmVycmlkZSA9ICJrZXl3b3JkIjsKICAgIGVsc2UKICAgICAgb3ZlcnJpZGUgPSAidmFyaWFibGUiOwogIH0KCiAgdmFyIHN0YXRlcyA9IHt9OwoKICBzdGF0ZXMudG9wID0gZnVuY3Rpb24odHlwZSwgc3RyZWFtLCBzdGF0ZSkgewogICAgaWYgKHR5cGUgPT0gInsiKSB7CiAgICAgIHJldHVybiBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLCAiYmxvY2siKTsKICAgIH0gZWxzZSBpZiAodHlwZSA9PSAifSIgJiYgc3RhdGUuY29udGV4dC5wcmV2KSB7CiAgICAgIHJldHVybiBwb3BDb250ZXh0KHN0YXRlKTsKICAgIH0gZWxzZSBpZiAoc3VwcG9ydHNBdENvbXBvbmVudCAmJiAvQGNvbXBvbmVudC8udGVzdCh0eXBlKSkgewogICAgICByZXR1cm4gcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbSwgImF0Q29tcG9uZW50QmxvY2siKTsKICAgIH0gZWxzZSBpZiAoL15AKC1tb3otKT9kb2N1bWVudCQvLnRlc3QodHlwZSkpIHsKICAgICAgcmV0dXJuIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0sICJkb2N1bWVudFR5cGVzIik7CiAgICB9IGVsc2UgaWYgKC9eQChtZWRpYXxzdXBwb3J0c3woLW1vei0pP2RvY3VtZW50fGltcG9ydCkkLy50ZXN0KHR5cGUpKSB7CiAgICAgIHJldHVybiBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLCAiYXRCbG9jayIpOwogICAgfSBlbHNlIGlmICgvXkAoZm9udC1mYWNlfGNvdW50ZXItc3R5bGUpLy50ZXN0KHR5cGUpKSB7CiAgICAgIHN0YXRlLnN0YXRlQXJnID0gdHlwZTsKICAgICAgcmV0dXJuICJyZXN0cmljdGVkX2F0QmxvY2tfYmVmb3JlIjsKICAgIH0gZWxzZSBpZiAoL15AKC0obW96fG1zfG98d2Via2l0KS0pP2tleWZyYW1lcyQvLnRlc3QodHlwZSkpIHsKICAgICAgcmV0dXJuICJrZXlmcmFtZXMiOwogICAgfSBlbHNlIGlmICh0eXBlICYmIHR5cGUuY2hhckF0KDApID09ICJAIikgewogICAgICByZXR1cm4gcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbSwgImF0Iik7CiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gImhhc2giKSB7CiAgICAgIG92ZXJyaWRlID0gImJ1aWx0aW4iOwogICAgfSBlbHNlIGlmICh0eXBlID09ICJ3b3JkIikgewogICAgICBvdmVycmlkZSA9ICJ0YWciOwogICAgfSBlbHNlIGlmICh0eXBlID09ICJ2YXJpYWJsZS1kZWZpbml0aW9uIikgewogICAgICByZXR1cm4gIm1heWJlcHJvcCI7CiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gImludGVycG9sYXRpb24iKSB7CiAgICAgIHJldHVybiBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLCAiaW50ZXJwb2xhdGlvbiIpOwogICAgfSBlbHNlIGlmICh0eXBlID09ICI6IikgewogICAgICByZXR1cm4gInBzZXVkbyI7CiAgICB9IGVsc2UgaWYgKGFsbG93TmVzdGVkICYmIHR5cGUgPT0gIigiKSB7CiAgICAgIHJldHVybiBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLCAicGFyZW5zIik7CiAgICB9CiAgICByZXR1cm4gc3RhdGUuY29udGV4dC50eXBlOwogIH07CgogIHN0YXRlcy5ibG9jayA9IGZ1bmN0aW9uKHR5cGUsIHN0cmVhbSwgc3RhdGUpIHsKICAgIGlmICh0eXBlID09ICJ3b3JkIikgewogICAgICB2YXIgd29yZCA9IHN0cmVhbS5jdXJyZW50KCkudG9Mb3dlckNhc2UoKTsKICAgICAgaWYgKHByb3BlcnR5S2V5d29yZHMuaGFzT3duUHJvcGVydHkod29yZCkpIHsKICAgICAgICBvdmVycmlkZSA9ICJwcm9wZXJ0eSI7CiAgICAgICAgcmV0dXJuICJtYXliZXByb3AiOwogICAgICB9IGVsc2UgaWYgKG5vblN0YW5kYXJkUHJvcGVydHlLZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eSh3b3JkKSkgewogICAgICAgIG92ZXJyaWRlID0gInN0cmluZy0yIjsKICAgICAgICByZXR1cm4gIm1heWJlcHJvcCI7CiAgICAgIH0gZWxzZSBpZiAoYWxsb3dOZXN0ZWQpIHsKICAgICAgICBvdmVycmlkZSA9IHN0cmVhbS5tYXRjaCgvXlxzKjooPzpcc3wkKS8sIGZhbHNlKSA/ICJwcm9wZXJ0eSIgOiAidGFnIjsKICAgICAgICByZXR1cm4gImJsb2NrIjsKICAgICAgfSBlbHNlIHsKICAgICAgICBvdmVycmlkZSArPSAiIGVycm9yIjsKICAgICAgICByZXR1cm4gIm1heWJlcHJvcCI7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAodHlwZSA9PSAibWV0YSIpIHsKICAgICAgcmV0dXJuICJibG9jayI7CiAgICB9IGVsc2UgaWYgKCFhbGxvd05lc3RlZCAmJiAodHlwZSA9PSAiaGFzaCIgfHwgdHlwZSA9PSAicXVhbGlmaWVyIikpIHsKICAgICAgb3ZlcnJpZGUgPSAiZXJyb3IiOwogICAgICByZXR1cm4gImJsb2NrIjsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBzdGF0ZXMudG9wKHR5cGUsIHN0cmVhbSwgc3RhdGUpOwogICAgfQogIH07CgogIHN0YXRlcy5tYXliZXByb3AgPSBmdW5jdGlvbih0eXBlLCBzdHJlYW0sIHN0YXRlKSB7CiAgICBpZiAodHlwZSA9PSAiOiIpIHJldHVybiBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLCAicHJvcCIpOwogICAgcmV0dXJuIHBhc3ModHlwZSwgc3RyZWFtLCBzdGF0ZSk7CiAgfTsKCiAgc3RhdGVzLnByb3AgPSBmdW5jdGlvbih0eXBlLCBzdHJlYW0sIHN0YXRlKSB7CiAgICBpZiAodHlwZSA9PSAiOyIpIHJldHVybiBwb3BDb250ZXh0KHN0YXRlKTsKICAgIGlmICh0eXBlID09ICJ7IiAmJiBhbGxvd05lc3RlZCkgcmV0dXJuIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0sICJwcm9wQmxvY2siKTsKICAgIGlmICh0eXBlID09ICJ9IiB8fCB0eXBlID09ICJ7IikgcmV0dXJuIHBvcEFuZFBhc3ModHlwZSwgc3RyZWFtLCBzdGF0ZSk7CiAgICBpZiAodHlwZSA9PSAiKCIpIHJldHVybiBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLCAicGFyZW5zIik7CgogICAgaWYgKHR5cGUgPT0gImhhc2giICYmICEvXiMoWzAtOWEtZkEtZl17Myw0fXxbMC05YS1mQS1mXXs2fXxbMC05YS1mQS1mXXs4fSkkLy50ZXN0KHN0cmVhbS5jdXJyZW50KCkpKSB7CiAgICAgIG92ZXJyaWRlICs9ICIgZXJyb3IiOwogICAgfSBlbHNlIGlmICh0eXBlID09ICJ3b3JkIikgewogICAgICB3b3JkQXNWYWx1ZShzdHJlYW0pOwogICAgfSBlbHNlIGlmICh0eXBlID09ICJpbnRlcnBvbGF0aW9uIikgewogICAgICByZXR1cm4gcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbSwgImludGVycG9sYXRpb24iKTsKICAgIH0KICAgIHJldHVybiAicHJvcCI7CiAgfTsKCiAgc3RhdGVzLnByb3BCbG9jayA9IGZ1bmN0aW9uKHR5cGUsIF9zdHJlYW0sIHN0YXRlKSB7CiAgICBpZiAodHlwZSA9PSAifSIpIHJldHVybiBwb3BDb250ZXh0KHN0YXRlKTsKICAgIGlmICh0eXBlID09ICJ3b3JkIikgeyBvdmVycmlkZSA9ICJwcm9wZXJ0eSI7IHJldHVybiAibWF5YmVwcm9wIjsgfQogICAgcmV0dXJuIHN0YXRlLmNvbnRleHQudHlwZTsKICB9OwoKICBzdGF0ZXMucGFyZW5zID0gZnVuY3Rpb24odHlwZSwgc3RyZWFtLCBzdGF0ZSkgewogICAgaWYgKHR5cGUgPT0gInsiIHx8IHR5cGUgPT0gIn0iKSByZXR1cm4gcG9wQW5kUGFzcyh0eXBlLCBzdHJlYW0sIHN0YXRlKTsKICAgIGlmICh0eXBlID09ICIpIikgcmV0dXJuIHBvcENvbnRleHQoc3RhdGUpOwogICAgaWYgKHR5cGUgPT0gIigiKSByZXR1cm4gcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbSwgInBhcmVucyIpOwogICAgaWYgKHR5cGUgPT0gImludGVycG9sYXRpb24iKSByZXR1cm4gcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbSwgImludGVycG9sYXRpb24iKTsKICAgIGlmICh0eXBlID09ICJ3b3JkIikgd29yZEFzVmFsdWUoc3RyZWFtKTsKICAgIHJldHVybiAicGFyZW5zIjsKICB9OwoKICBzdGF0ZXMucHNldWRvID0gZnVuY3Rpb24odHlwZSwgc3RyZWFtLCBzdGF0ZSkgewogICAgaWYgKHR5cGUgPT0gIndvcmQiKSB7CiAgICAgIG92ZXJyaWRlID0gInZhcmlhYmxlLTMiOwogICAgICByZXR1cm4gc3RhdGUuY29udGV4dC50eXBlOwogICAgfQogICAgcmV0dXJuIHBhc3ModHlwZSwgc3RyZWFtLCBzdGF0ZSk7CiAgfTsKCiAgc3RhdGVzLmRvY3VtZW50VHlwZXMgPSBmdW5jdGlvbih0eXBlLCBzdHJlYW0sIHN0YXRlKSB7CiAgICBpZiAodHlwZSA9PSAid29yZCIgJiYgZG9jdW1lbnRUeXBlcy5oYXNPd25Qcm9wZXJ0eShzdHJlYW0uY3VycmVudCgpKSkgewogICAgICBvdmVycmlkZSA9ICJ0YWciOwogICAgICByZXR1cm4gc3RhdGUuY29udGV4dC50eXBlOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHN0YXRlcy5hdEJsb2NrKHR5cGUsIHN0cmVhbSwgc3RhdGUpOwogICAgfQogIH07CgogIHN0YXRlcy5hdEJsb2NrID0gZnVuY3Rpb24odHlwZSwgc3RyZWFtLCBzdGF0ZSkgewogICAgaWYgKHR5cGUgPT0gIigiKSByZXR1cm4gcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbSwgImF0QmxvY2tfcGFyZW5zIik7CiAgICBpZiAodHlwZSA9PSAifSIgfHwgdHlwZSA9PSAiOyIpIHJldHVybiBwb3BBbmRQYXNzKHR5cGUsIHN0cmVhbSwgc3RhdGUpOwogICAgaWYgKHR5cGUgPT0gInsiKSByZXR1cm4gcG9wQ29udGV4dChzdGF0ZSkgJiYgcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbSwgYWxsb3dOZXN0ZWQgPyAiYmxvY2siIDogInRvcCIpOwoKICAgIGlmICh0eXBlID09ICJpbnRlcnBvbGF0aW9uIikgcmV0dXJuIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0sICJpbnRlcnBvbGF0aW9uIik7CgogICAgaWYgKHR5cGUgPT0gIndvcmQiKSB7CiAgICAgIHZhciB3b3JkID0gc3RyZWFtLmN1cnJlbnQoKS50b0xvd2VyQ2FzZSgpOwogICAgICBpZiAod29yZCA9PSAib25seSIgfHwgd29yZCA9PSAibm90IiB8fCB3b3JkID09ICJhbmQiIHx8IHdvcmQgPT0gIm9yIikKICAgICAgICBvdmVycmlkZSA9ICJrZXl3b3JkIjsKICAgICAgZWxzZSBpZiAobWVkaWFUeXBlcy5oYXNPd25Qcm9wZXJ0eSh3b3JkKSkKICAgICAgICBvdmVycmlkZSA9ICJhdHRyaWJ1dGUiOwogICAgICBlbHNlIGlmIChtZWRpYUZlYXR1cmVzLmhhc093blByb3BlcnR5KHdvcmQpKQogICAgICAgIG92ZXJyaWRlID0gInByb3BlcnR5IjsKICAgICAgZWxzZSBpZiAobWVkaWFWYWx1ZUtleXdvcmRzLmhhc093blByb3BlcnR5KHdvcmQpKQogICAgICAgIG92ZXJyaWRlID0gImtleXdvcmQiOwogICAgICBlbHNlIGlmIChwcm9wZXJ0eUtleXdvcmRzLmhhc093blByb3BlcnR5KHdvcmQpKQogICAgICAgIG92ZXJyaWRlID0gInByb3BlcnR5IjsKICAgICAgZWxzZSBpZiAobm9uU3RhbmRhcmRQcm9wZXJ0eUtleXdvcmRzLmhhc093blByb3BlcnR5KHdvcmQpKQogICAgICAgIG92ZXJyaWRlID0gInN0cmluZy0yIjsKICAgICAgZWxzZSBpZiAodmFsdWVLZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eSh3b3JkKSkKICAgICAgICBvdmVycmlkZSA9ICJhdG9tIjsKICAgICAgZWxzZSBpZiAoY29sb3JLZXl3b3Jkcy5oYXNPd25Qcm9wZXJ0eSh3b3JkKSkKICAgICAgICBvdmVycmlkZSA9ICJrZXl3b3JkIjsKICAgICAgZWxzZQogICAgICAgIG92ZXJyaWRlID0gImVycm9yIjsKICAgIH0KICAgIHJldHVybiBzdGF0ZS5jb250ZXh0LnR5cGU7CiAgfTsKCiAgc3RhdGVzLmF0Q29tcG9uZW50QmxvY2sgPSBmdW5jdGlvbih0eXBlLCBzdHJlYW0sIHN0YXRlKSB7CiAgICBpZiAodHlwZSA9PSAifSIpCiAgICAgIHJldHVybiBwb3BBbmRQYXNzKHR5cGUsIHN0cmVhbSwgc3RhdGUpOwogICAgaWYgKHR5cGUgPT0gInsiKQogICAgICByZXR1cm4gcG9wQ29udGV4dChzdGF0ZSkgJiYgcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbSwgYWxsb3dOZXN0ZWQgPyAiYmxvY2siIDogInRvcCIsIGZhbHNlKTsKICAgIGlmICh0eXBlID09ICJ3b3JkIikKICAgICAgb3ZlcnJpZGUgPSAiZXJyb3IiOwogICAgcmV0dXJuIHN0YXRlLmNvbnRleHQudHlwZTsKICB9OwoKICBzdGF0ZXMuYXRCbG9ja19wYXJlbnMgPSBmdW5jdGlvbih0eXBlLCBzdHJlYW0sIHN0YXRlKSB7CiAgICBpZiAodHlwZSA9PSAiKSIpIHJldHVybiBwb3BDb250ZXh0KHN0YXRlKTsKICAgIGlmICh0eXBlID09ICJ7IiB8fCB0eXBlID09ICJ9IikgcmV0dXJuIHBvcEFuZFBhc3ModHlwZSwgc3RyZWFtLCBzdGF0ZSwgMik7CiAgICByZXR1cm4gc3RhdGVzLmF0QmxvY2sodHlwZSwgc3RyZWFtLCBzdGF0ZSk7CiAgfTsKCiAgc3RhdGVzLnJlc3RyaWN0ZWRfYXRCbG9ja19iZWZvcmUgPSBmdW5jdGlvbih0eXBlLCBzdHJlYW0sIHN0YXRlKSB7CiAgICBpZiAodHlwZSA9PSAieyIpCiAgICAgIHJldHVybiBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLCAicmVzdHJpY3RlZF9hdEJsb2NrIik7CiAgICBpZiAodHlwZSA9PSAid29yZCIgJiYgc3RhdGUuc3RhdGVBcmcgPT0gIkBjb3VudGVyLXN0eWxlIikgewogICAgICBvdmVycmlkZSA9ICJ2YXJpYWJsZSI7CiAgICAgIHJldHVybiAicmVzdHJpY3RlZF9hdEJsb2NrX2JlZm9yZSI7CiAgICB9CiAgICByZXR1cm4gcGFzcyh0eXBlLCBzdHJlYW0sIHN0YXRlKTsKICB9OwoKICBzdGF0ZXMucmVzdHJpY3RlZF9hdEJsb2NrID0gZnVuY3Rpb24odHlwZSwgc3RyZWFtLCBzdGF0ZSkgewogICAgaWYgKHR5cGUgPT0gIn0iKSB7CiAgICAgIHN0YXRlLnN0YXRlQXJnID0gbnVsbDsKICAgICAgcmV0dXJuIHBvcENvbnRleHQoc3RhdGUpOwogICAgfQogICAgaWYgKHR5cGUgPT0gIndvcmQiKSB7CiAgICAgIGlmICgoc3RhdGUuc3RhdGVBcmcgPT0gIkBmb250LWZhY2UiICYmICFmb250UHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShzdHJlYW0uY3VycmVudCgpLnRvTG93ZXJDYXNlKCkpKSB8fAogICAgICAgICAgKHN0YXRlLnN0YXRlQXJnID09ICJAY291bnRlci1zdHlsZSIgJiYgIWNvdW50ZXJEZXNjcmlwdG9ycy5oYXNPd25Qcm9wZXJ0eShzdHJlYW0uY3VycmVudCgpLnRvTG93ZXJDYXNlKCkpKSkKICAgICAgICBvdmVycmlkZSA9ICJlcnJvciI7CiAgICAgIGVsc2UKICAgICAgICBvdmVycmlkZSA9ICJwcm9wZXJ0eSI7CiAgICAgIHJldHVybiAibWF5YmVwcm9wIjsKICAgIH0KICAgIHJldHVybiAicmVzdHJpY3RlZF9hdEJsb2NrIjsKICB9OwoKICBzdGF0ZXMua2V5ZnJhbWVzID0gZnVuY3Rpb24odHlwZSwgc3RyZWFtLCBzdGF0ZSkgewogICAgaWYgKHR5cGUgPT0gIndvcmQiKSB7IG92ZXJyaWRlID0gInZhcmlhYmxlIjsgcmV0dXJuICJrZXlmcmFtZXMiOyB9CiAgICBpZiAodHlwZSA9PSAieyIpIHJldHVybiBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLCAidG9wIik7CiAgICByZXR1cm4gcGFzcyh0eXBlLCBzdHJlYW0sIHN0YXRlKTsKICB9OwoKICBzdGF0ZXMuYXQgPSBmdW5jdGlvbih0eXBlLCBzdHJlYW0sIHN0YXRlKSB7CiAgICBpZiAodHlwZSA9PSAiOyIpIHJldHVybiBwb3BDb250ZXh0KHN0YXRlKTsKICAgIGlmICh0eXBlID09ICJ7IiB8fCB0eXBlID09ICJ9IikgcmV0dXJuIHBvcEFuZFBhc3ModHlwZSwgc3RyZWFtLCBzdGF0ZSk7CiAgICBpZiAodHlwZSA9PSAid29yZCIpIG92ZXJyaWRlID0gInRhZyI7CiAgICBlbHNlIGlmICh0eXBlID09ICJoYXNoIikgb3ZlcnJpZGUgPSAiYnVpbHRpbiI7CiAgICByZXR1cm4gImF0IjsKICB9OwoKICBzdGF0ZXMuaW50ZXJwb2xhdGlvbiA9IGZ1bmN0aW9uKHR5cGUsIHN0cmVhbSwgc3RhdGUpIHsKICAgIGlmICh0eXBlID09ICJ9IikgcmV0dXJuIHBvcENvbnRleHQoc3RhdGUpOwogICAgaWYgKHR5cGUgPT0gInsiIHx8IHR5cGUgPT0gIjsiKSByZXR1cm4gcG9wQW5kUGFzcyh0eXBlLCBzdHJlYW0sIHN0YXRlKTsKICAgIGlmICh0eXBlID09ICJ3b3JkIikgb3ZlcnJpZGUgPSAidmFyaWFibGUiOwogICAgZWxzZSBpZiAodHlwZSAhPSAidmFyaWFibGUiICYmIHR5cGUgIT0gIigiICYmIHR5cGUgIT0gIikiKSBvdmVycmlkZSA9ICJlcnJvciI7CiAgICByZXR1cm4gImludGVycG9sYXRpb24iOwogIH07CgogIHJldHVybiB7CiAgICBzdGFydFN0YXRlOiBmdW5jdGlvbihiYXNlKSB7CiAgICAgIHJldHVybiB7dG9rZW5pemU6IG51bGwsCiAgICAgICAgICAgICAgc3RhdGU6IGlubGluZSA/ICJibG9jayIgOiAidG9wIiwKICAgICAgICAgICAgICBzdGF0ZUFyZzogbnVsbCwKICAgICAgICAgICAgICBjb250ZXh0OiBuZXcgQ29udGV4dChpbmxpbmUgPyAiYmxvY2siIDogInRvcCIsIGJhc2UgfHwgMCwgbnVsbCl9OwogICAgfSwKCiAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICBpZiAoIXN0YXRlLnRva2VuaXplICYmIHN0cmVhbS5lYXRTcGFjZSgpKSByZXR1cm4gbnVsbDsKICAgICAgdmFyIHN0eWxlID0gKHN0YXRlLnRva2VuaXplIHx8IHRva2VuQmFzZSkoc3RyZWFtLCBzdGF0ZSk7CiAgICAgIGlmIChzdHlsZSAmJiB0eXBlb2Ygc3R5bGUgPT0gIm9iamVjdCIpIHsKICAgICAgICB0eXBlID0gc3R5bGVbMV07CiAgICAgICAgc3R5bGUgPSBzdHlsZVswXTsKICAgICAgfQogICAgICBvdmVycmlkZSA9IHN0eWxlOwogICAgICBzdGF0ZS5zdGF0ZSA9IHN0YXRlc1tzdGF0ZS5zdGF0ZV0odHlwZSwgc3RyZWFtLCBzdGF0ZSk7CiAgICAgIHJldHVybiBvdmVycmlkZTsKICAgIH0sCgogICAgaW5kZW50OiBmdW5jdGlvbihzdGF0ZSwgdGV4dEFmdGVyKSB7CiAgICAgIHZhciBjeCA9IHN0YXRlLmNvbnRleHQsIGNoID0gdGV4dEFmdGVyICYmIHRleHRBZnRlci5jaGFyQXQoMCk7CiAgICAgIHZhciBpbmRlbnQgPSBjeC5pbmRlbnQ7CiAgICAgIGlmIChjeC50eXBlID09ICJwcm9wIiAmJiAoY2ggPT0gIn0iIHx8IGNoID09ICIpIikpIGN4ID0gY3gucHJldjsKICAgICAgaWYgKGN4LnByZXYpIHsKICAgICAgICBpZiAoY2ggPT0gIn0iICYmIChjeC50eXBlID09ICJibG9jayIgfHwgY3gudHlwZSA9PSAidG9wIiB8fAogICAgICAgICAgICAgICAgICAgICAgICAgIGN4LnR5cGUgPT0gImludGVycG9sYXRpb24iIHx8IGN4LnR5cGUgPT0gInJlc3RyaWN0ZWRfYXRCbG9jayIpKSB7CiAgICAgICAgICAvLyBSZXN1bWUgaW5kZW50YXRpb24gZnJvbSBwYXJlbnQgY29udGV4dC4KICAgICAgICAgIGN4ID0gY3gucHJldjsKICAgICAgICAgIGluZGVudCA9IGN4LmluZGVudDsKICAgICAgICB9IGVsc2UgaWYgKGNoID09ICIpIiAmJiAoY3gudHlwZSA9PSAicGFyZW5zIiB8fCBjeC50eXBlID09ICJhdEJsb2NrX3BhcmVucyIpIHx8CiAgICAgICAgICAgIGNoID09ICJ7IiAmJiAoY3gudHlwZSA9PSAiYXQiIHx8IGN4LnR5cGUgPT0gImF0QmxvY2siKSkgewogICAgICAgICAgLy8gRGVkZW50IHJlbGF0aXZlIHRvIGN1cnJlbnQgY29udGV4dC4KICAgICAgICAgIGluZGVudCA9IE1hdGgubWF4KDAsIGN4LmluZGVudCAtIGluZGVudFVuaXQpOwogICAgICAgICAgY3ggPSBjeC5wcmV2OwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gaW5kZW50OwogICAgfSwKCiAgICBlbGVjdHJpY0NoYXJzOiAifSIsCiAgICBibG9ja0NvbW1lbnRTdGFydDogIi8qIiwKICAgIGJsb2NrQ29tbWVudEVuZDogIiovIiwKICAgIGZvbGQ6ICJicmFjZSIKICB9Owp9KTsKCiAgZnVuY3Rpb24ga2V5U2V0KGFycmF5KSB7CiAgICB2YXIga2V5cyA9IHt9OwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7ICsraSkgewogICAgICBrZXlzW2FycmF5W2ldLnRvTG93ZXJDYXNlKCldID0gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBrZXlzOwogIH0KCiAgdmFyIGRvY3VtZW50VHlwZXNfID0gWwogICAgImRvbWFpbiIsICJyZWdleHAiLCAidXJsIiwgInVybC1wcmVmaXgiCiAgXSwgZG9jdW1lbnRUeXBlcyA9IGtleVNldChkb2N1bWVudFR5cGVzXyk7CgogIHZhciBtZWRpYVR5cGVzXyA9IFsKICAgICJhbGwiLCAiYXVyYWwiLCAiYnJhaWxsZSIsICJoYW5kaGVsZCIsICJwcmludCIsICJwcm9qZWN0aW9uIiwgInNjcmVlbiIsCiAgICAidHR5IiwgInR2IiwgImVtYm9zc2VkIgogIF0sIG1lZGlhVHlwZXMgPSBrZXlTZXQobWVkaWFUeXBlc18pOwoKICB2YXIgbWVkaWFGZWF0dXJlc18gPSBbCiAgICAid2lkdGgiLCAibWluLXdpZHRoIiwgIm1heC13aWR0aCIsICJoZWlnaHQiLCAibWluLWhlaWdodCIsICJtYXgtaGVpZ2h0IiwKICAgICJkZXZpY2Utd2lkdGgiLCAibWluLWRldmljZS13aWR0aCIsICJtYXgtZGV2aWNlLXdpZHRoIiwgImRldmljZS1oZWlnaHQiLAogICAgIm1pbi1kZXZpY2UtaGVpZ2h0IiwgIm1heC1kZXZpY2UtaGVpZ2h0IiwgImFzcGVjdC1yYXRpbyIsCiAgICAibWluLWFzcGVjdC1yYXRpbyIsICJtYXgtYXNwZWN0LXJhdGlvIiwgImRldmljZS1hc3BlY3QtcmF0aW8iLAogICAgIm1pbi1kZXZpY2UtYXNwZWN0LXJhdGlvIiwgIm1heC1kZXZpY2UtYXNwZWN0LXJhdGlvIiwgImNvbG9yIiwgIm1pbi1jb2xvciIsCiAgICAibWF4LWNvbG9yIiwgImNvbG9yLWluZGV4IiwgIm1pbi1jb2xvci1pbmRleCIsICJtYXgtY29sb3ItaW5kZXgiLAogICAgIm1vbm9jaHJvbWUiLCAibWluLW1vbm9jaHJvbWUiLCAibWF4LW1vbm9jaHJvbWUiLCAicmVzb2x1dGlvbiIsCiAgICAibWluLXJlc29sdXRpb24iLCAibWF4LXJlc29sdXRpb24iLCAic2NhbiIsICJncmlkIiwgIm9yaWVudGF0aW9uIiwKICAgICJkZXZpY2UtcGl4ZWwtcmF0aW8iLCAibWluLWRldmljZS1waXhlbC1yYXRpbyIsICJtYXgtZGV2aWNlLXBpeGVsLXJhdGlvIiwKICAgICJwb2ludGVyIiwgImFueS1wb2ludGVyIiwgImhvdmVyIiwgImFueS1ob3ZlciIKICBdLCBtZWRpYUZlYXR1cmVzID0ga2V5U2V0KG1lZGlhRmVhdHVyZXNfKTsKCiAgdmFyIG1lZGlhVmFsdWVLZXl3b3Jkc18gPSBbCiAgICAibGFuZHNjYXBlIiwgInBvcnRyYWl0IiwgIm5vbmUiLCAiY29hcnNlIiwgImZpbmUiLCAib24tZGVtYW5kIiwgImhvdmVyIiwKICAgICJpbnRlcmxhY2UiLCAicHJvZ3Jlc3NpdmUiCiAgXSwgbWVkaWFWYWx1ZUtleXdvcmRzID0ga2V5U2V0KG1lZGlhVmFsdWVLZXl3b3Jkc18pOwoKICB2YXIgcHJvcGVydHlLZXl3b3Jkc18gPSBbCiAgICAiYWxpZ24tY29udGVudCIsICJhbGlnbi1pdGVtcyIsICJhbGlnbi1zZWxmIiwgImFsaWdubWVudC1hZGp1c3QiLAogICAgImFsaWdubWVudC1iYXNlbGluZSIsICJhbmNob3ItcG9pbnQiLCAiYW5pbWF0aW9uIiwgImFuaW1hdGlvbi1kZWxheSIsCiAgICAiYW5pbWF0aW9uLWRpcmVjdGlvbiIsICJhbmltYXRpb24tZHVyYXRpb24iLCAiYW5pbWF0aW9uLWZpbGwtbW9kZSIsCiAgICAiYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudCIsICJhbmltYXRpb24tbmFtZSIsICJhbmltYXRpb24tcGxheS1zdGF0ZSIsCiAgICAiYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbiIsICJhcHBlYXJhbmNlIiwgImF6aW11dGgiLCAiYmFja2ZhY2UtdmlzaWJpbGl0eSIsCiAgICAiYmFja2dyb3VuZCIsICJiYWNrZ3JvdW5kLWF0dGFjaG1lbnQiLCAiYmFja2dyb3VuZC1ibGVuZC1tb2RlIiwgImJhY2tncm91bmQtY2xpcCIsCiAgICAiYmFja2dyb3VuZC1jb2xvciIsICJiYWNrZ3JvdW5kLWltYWdlIiwgImJhY2tncm91bmQtb3JpZ2luIiwgImJhY2tncm91bmQtcG9zaXRpb24iLAogICAgImJhY2tncm91bmQtcmVwZWF0IiwgImJhY2tncm91bmQtc2l6ZSIsICJiYXNlbGluZS1zaGlmdCIsICJiaW5kaW5nIiwKICAgICJibGVlZCIsICJib29rbWFyay1sYWJlbCIsICJib29rbWFyay1sZXZlbCIsICJib29rbWFyay1zdGF0ZSIsCiAgICAiYm9va21hcmstdGFyZ2V0IiwgImJvcmRlciIsICJib3JkZXItYm90dG9tIiwgImJvcmRlci1ib3R0b20tY29sb3IiLAogICAgImJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXMiLCAiYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXMiLAogICAgImJvcmRlci1ib3R0b20tc3R5bGUiLCAiYm9yZGVyLWJvdHRvbS13aWR0aCIsICJib3JkZXItY29sbGFwc2UiLAogICAgImJvcmRlci1jb2xvciIsICJib3JkZXItaW1hZ2UiLCAiYm9yZGVyLWltYWdlLW91dHNldCIsCiAgICAiYm9yZGVyLWltYWdlLXJlcGVhdCIsICJib3JkZXItaW1hZ2Utc2xpY2UiLCAiYm9yZGVyLWltYWdlLXNvdXJjZSIsCiAgICAiYm9yZGVyLWltYWdlLXdpZHRoIiwgImJvcmRlci1sZWZ0IiwgImJvcmRlci1sZWZ0LWNvbG9yIiwKICAgICJib3JkZXItbGVmdC1zdHlsZSIsICJib3JkZXItbGVmdC13aWR0aCIsICJib3JkZXItcmFkaXVzIiwgImJvcmRlci1yaWdodCIsCiAgICAiYm9yZGVyLXJpZ2h0LWNvbG9yIiwgImJvcmRlci1yaWdodC1zdHlsZSIsICJib3JkZXItcmlnaHQtd2lkdGgiLAogICAgImJvcmRlci1zcGFjaW5nIiwgImJvcmRlci1zdHlsZSIsICJib3JkZXItdG9wIiwgImJvcmRlci10b3AtY29sb3IiLAogICAgImJvcmRlci10b3AtbGVmdC1yYWRpdXMiLCAiYm9yZGVyLXRvcC1yaWdodC1yYWRpdXMiLCAiYm9yZGVyLXRvcC1zdHlsZSIsCiAgICAiYm9yZGVyLXRvcC13aWR0aCIsICJib3JkZXItd2lkdGgiLCAiYm90dG9tIiwgImJveC1kZWNvcmF0aW9uLWJyZWFrIiwKICAgICJib3gtc2hhZG93IiwgImJveC1zaXppbmciLCAiYnJlYWstYWZ0ZXIiLCAiYnJlYWstYmVmb3JlIiwgImJyZWFrLWluc2lkZSIsCiAgICAiY2FwdGlvbi1zaWRlIiwgImNsZWFyIiwgImNsaXAiLCAiY29sb3IiLCAiY29sb3ItcHJvZmlsZSIsICJjb2x1bW4tY291bnQiLAogICAgImNvbHVtbi1maWxsIiwgImNvbHVtbi1nYXAiLCAiY29sdW1uLXJ1bGUiLCAiY29sdW1uLXJ1bGUtY29sb3IiLAogICAgImNvbHVtbi1ydWxlLXN0eWxlIiwgImNvbHVtbi1ydWxlLXdpZHRoIiwgImNvbHVtbi1zcGFuIiwgImNvbHVtbi13aWR0aCIsCiAgICAiY29sdW1ucyIsICJjb250ZW50IiwgImNvdW50ZXItaW5jcmVtZW50IiwgImNvdW50ZXItcmVzZXQiLCAiY3JvcCIsICJjdWUiLAogICAgImN1ZS1hZnRlciIsICJjdWUtYmVmb3JlIiwgImN1cnNvciIsICJkaXJlY3Rpb24iLCAiZGlzcGxheSIsCiAgICAiZG9taW5hbnQtYmFzZWxpbmUiLCAiZHJvcC1pbml0aWFsLWFmdGVyLWFkanVzdCIsCiAgICAiZHJvcC1pbml0aWFsLWFmdGVyLWFsaWduIiwgImRyb3AtaW5pdGlhbC1iZWZvcmUtYWRqdXN0IiwKICAgICJkcm9wLWluaXRpYWwtYmVmb3JlLWFsaWduIiwgImRyb3AtaW5pdGlhbC1zaXplIiwgImRyb3AtaW5pdGlhbC12YWx1ZSIsCiAgICAiZWxldmF0aW9uIiwgImVtcHR5LWNlbGxzIiwgImZpdCIsICJmaXQtcG9zaXRpb24iLCAiZmxleCIsICJmbGV4LWJhc2lzIiwKICAgICJmbGV4LWRpcmVjdGlvbiIsICJmbGV4LWZsb3ciLCAiZmxleC1ncm93IiwgImZsZXgtc2hyaW5rIiwgImZsZXgtd3JhcCIsCiAgICAiZmxvYXQiLCAiZmxvYXQtb2Zmc2V0IiwgImZsb3ctZnJvbSIsICJmbG93LWludG8iLCAiZm9udCIsICJmb250LWZlYXR1cmUtc2V0dGluZ3MiLAogICAgImZvbnQtZmFtaWx5IiwgImZvbnQta2VybmluZyIsICJmb250LWxhbmd1YWdlLW92ZXJyaWRlIiwgImZvbnQtc2l6ZSIsICJmb250LXNpemUtYWRqdXN0IiwKICAgICJmb250LXN0cmV0Y2giLCAiZm9udC1zdHlsZSIsICJmb250LXN5bnRoZXNpcyIsICJmb250LXZhcmlhbnQiLAogICAgImZvbnQtdmFyaWFudC1hbHRlcm5hdGVzIiwgImZvbnQtdmFyaWFudC1jYXBzIiwgImZvbnQtdmFyaWFudC1lYXN0LWFzaWFuIiwKICAgICJmb250LXZhcmlhbnQtbGlnYXR1cmVzIiwgImZvbnQtdmFyaWFudC1udW1lcmljIiwgImZvbnQtdmFyaWFudC1wb3NpdGlvbiIsCiAgICAiZm9udC13ZWlnaHQiLCAiZ3JpZCIsICJncmlkLWFyZWEiLCAiZ3JpZC1hdXRvLWNvbHVtbnMiLCAiZ3JpZC1hdXRvLWZsb3ciLAogICAgImdyaWQtYXV0by1yb3dzIiwgImdyaWQtY29sdW1uIiwgImdyaWQtY29sdW1uLWVuZCIsICJncmlkLWNvbHVtbi1nYXAiLAogICAgImdyaWQtY29sdW1uLXN0YXJ0IiwgImdyaWQtZ2FwIiwgImdyaWQtcm93IiwgImdyaWQtcm93LWVuZCIsICJncmlkLXJvdy1nYXAiLAogICAgImdyaWQtcm93LXN0YXJ0IiwgImdyaWQtdGVtcGxhdGUiLCAiZ3JpZC10ZW1wbGF0ZS1hcmVhcyIsICJncmlkLXRlbXBsYXRlLWNvbHVtbnMiLAogICAgImdyaWQtdGVtcGxhdGUtcm93cyIsICJoYW5naW5nLXB1bmN0dWF0aW9uIiwgImhlaWdodCIsICJoeXBoZW5zIiwKICAgICJpY29uIiwgImltYWdlLW9yaWVudGF0aW9uIiwgImltYWdlLXJlbmRlcmluZyIsICJpbWFnZS1yZXNvbHV0aW9uIiwKICAgICJpbmxpbmUtYm94LWFsaWduIiwgImp1c3RpZnktY29udGVudCIsICJsZWZ0IiwgImxldHRlci1zcGFjaW5nIiwKICAgICJsaW5lLWJyZWFrIiwgImxpbmUtaGVpZ2h0IiwgImxpbmUtc3RhY2tpbmciLCAibGluZS1zdGFja2luZy1ydWJ5IiwKICAgICJsaW5lLXN0YWNraW5nLXNoaWZ0IiwgImxpbmUtc3RhY2tpbmctc3RyYXRlZ3kiLCAibGlzdC1zdHlsZSIsCiAgICAibGlzdC1zdHlsZS1pbWFnZSIsICJsaXN0LXN0eWxlLXBvc2l0aW9uIiwgImxpc3Qtc3R5bGUtdHlwZSIsICJtYXJnaW4iLAogICAgIm1hcmdpbi1ib3R0b20iLCAibWFyZ2luLWxlZnQiLCAibWFyZ2luLXJpZ2h0IiwgIm1hcmdpbi10b3AiLAogICAgIm1hcmtlci1vZmZzZXQiLCAibWFya3MiLCAibWFycXVlZS1kaXJlY3Rpb24iLCAibWFycXVlZS1sb29wIiwKICAgICJtYXJxdWVlLXBsYXktY291bnQiLCAibWFycXVlZS1zcGVlZCIsICJtYXJxdWVlLXN0eWxlIiwgIm1heC1oZWlnaHQiLAogICAgIm1heC13aWR0aCIsICJtaW4taGVpZ2h0IiwgIm1pbi13aWR0aCIsICJtb3ZlLXRvIiwgIm5hdi1kb3duIiwgIm5hdi1pbmRleCIsCiAgICAibmF2LWxlZnQiLCAibmF2LXJpZ2h0IiwgIm5hdi11cCIsICJvYmplY3QtZml0IiwgIm9iamVjdC1wb3NpdGlvbiIsCiAgICAib3BhY2l0eSIsICJvcmRlciIsICJvcnBoYW5zIiwgIm91dGxpbmUiLAogICAgIm91dGxpbmUtY29sb3IiLCAib3V0bGluZS1vZmZzZXQiLCAib3V0bGluZS1zdHlsZSIsICJvdXRsaW5lLXdpZHRoIiwKICAgICJvdmVyZmxvdyIsICJvdmVyZmxvdy1zdHlsZSIsICJvdmVyZmxvdy13cmFwIiwgIm92ZXJmbG93LXgiLCAib3ZlcmZsb3cteSIsCiAgICAicGFkZGluZyIsICJwYWRkaW5nLWJvdHRvbSIsICJwYWRkaW5nLWxlZnQiLCAicGFkZGluZy1yaWdodCIsICJwYWRkaW5nLXRvcCIsCiAgICAicGFnZSIsICJwYWdlLWJyZWFrLWFmdGVyIiwgInBhZ2UtYnJlYWstYmVmb3JlIiwgInBhZ2UtYnJlYWstaW5zaWRlIiwKICAgICJwYWdlLXBvbGljeSIsICJwYXVzZSIsICJwYXVzZS1hZnRlciIsICJwYXVzZS1iZWZvcmUiLCAicGVyc3BlY3RpdmUiLAogICAgInBlcnNwZWN0aXZlLW9yaWdpbiIsICJwaXRjaCIsICJwaXRjaC1yYW5nZSIsICJwbGF5LWR1cmluZyIsICJwb3NpdGlvbiIsCiAgICAicHJlc2VudGF0aW9uLWxldmVsIiwgInB1bmN0dWF0aW9uLXRyaW0iLCAicXVvdGVzIiwgInJlZ2lvbi1icmVhay1hZnRlciIsCiAgICAicmVnaW9uLWJyZWFrLWJlZm9yZSIsICJyZWdpb24tYnJlYWstaW5zaWRlIiwgInJlZ2lvbi1mcmFnbWVudCIsCiAgICAicmVuZGVyaW5nLWludGVudCIsICJyZXNpemUiLCAicmVzdCIsICJyZXN0LWFmdGVyIiwgInJlc3QtYmVmb3JlIiwgInJpY2huZXNzIiwKICAgICJyaWdodCIsICJyb3RhdGlvbiIsICJyb3RhdGlvbi1wb2ludCIsICJydWJ5LWFsaWduIiwgInJ1Ynktb3ZlcmhhbmciLAogICAgInJ1YnktcG9zaXRpb24iLCAicnVieS1zcGFuIiwgInNoYXBlLWltYWdlLXRocmVzaG9sZCIsICJzaGFwZS1pbnNpZGUiLCAic2hhcGUtbWFyZ2luIiwKICAgICJzaGFwZS1vdXRzaWRlIiwgInNpemUiLCAic3BlYWsiLCAic3BlYWstYXMiLCAic3BlYWstaGVhZGVyIiwKICAgICJzcGVhay1udW1lcmFsIiwgInNwZWFrLXB1bmN0dWF0aW9uIiwgInNwZWVjaC1yYXRlIiwgInN0cmVzcyIsICJzdHJpbmctc2V0IiwKICAgICJ0YWItc2l6ZSIsICJ0YWJsZS1sYXlvdXQiLCAidGFyZ2V0IiwgInRhcmdldC1uYW1lIiwgInRhcmdldC1uZXciLAogICAgInRhcmdldC1wb3NpdGlvbiIsICJ0ZXh0LWFsaWduIiwgInRleHQtYWxpZ24tbGFzdCIsICJ0ZXh0LWRlY29yYXRpb24iLAogICAgInRleHQtZGVjb3JhdGlvbi1jb2xvciIsICJ0ZXh0LWRlY29yYXRpb24tbGluZSIsICJ0ZXh0LWRlY29yYXRpb24tc2tpcCIsCiAgICAidGV4dC1kZWNvcmF0aW9uLXN0eWxlIiwgInRleHQtZW1waGFzaXMiLCAidGV4dC1lbXBoYXNpcy1jb2xvciIsCiAgICAidGV4dC1lbXBoYXNpcy1wb3NpdGlvbiIsICJ0ZXh0LWVtcGhhc2lzLXN0eWxlIiwgInRleHQtaGVpZ2h0IiwKICAgICJ0ZXh0LWluZGVudCIsICJ0ZXh0LWp1c3RpZnkiLCAidGV4dC1vdXRsaW5lIiwgInRleHQtb3ZlcmZsb3ciLCAidGV4dC1zaGFkb3ciLAogICAgInRleHQtc2l6ZS1hZGp1c3QiLCAidGV4dC1zcGFjZS1jb2xsYXBzZSIsICJ0ZXh0LXRyYW5zZm9ybSIsICJ0ZXh0LXVuZGVybGluZS1wb3NpdGlvbiIsCiAgICAidGV4dC13cmFwIiwgInRvcCIsICJ0cmFuc2Zvcm0iLCAidHJhbnNmb3JtLW9yaWdpbiIsICJ0cmFuc2Zvcm0tc3R5bGUiLAogICAgInRyYW5zaXRpb24iLCAidHJhbnNpdGlvbi1kZWxheSIsICJ0cmFuc2l0aW9uLWR1cmF0aW9uIiwKICAgICJ0cmFuc2l0aW9uLXByb3BlcnR5IiwgInRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uIiwgInVuaWNvZGUtYmlkaSIsCiAgICAidmVydGljYWwtYWxpZ24iLCAidmlzaWJpbGl0eSIsICJ2b2ljZS1iYWxhbmNlIiwgInZvaWNlLWR1cmF0aW9uIiwKICAgICJ2b2ljZS1mYW1pbHkiLCAidm9pY2UtcGl0Y2giLCAidm9pY2UtcmFuZ2UiLCAidm9pY2UtcmF0ZSIsICJ2b2ljZS1zdHJlc3MiLAogICAgInZvaWNlLXZvbHVtZSIsICJ2b2x1bWUiLCAid2hpdGUtc3BhY2UiLCAid2lkb3dzIiwgIndpZHRoIiwgIndvcmQtYnJlYWsiLAogICAgIndvcmQtc3BhY2luZyIsICJ3b3JkLXdyYXAiLCAiei1pbmRleCIsCiAgICAvLyBTVkctc3BlY2lmaWMKICAgICJjbGlwLXBhdGgiLCAiY2xpcC1ydWxlIiwgIm1hc2siLCAiZW5hYmxlLWJhY2tncm91bmQiLCAiZmlsdGVyIiwgImZsb29kLWNvbG9yIiwKICAgICJmbG9vZC1vcGFjaXR5IiwgImxpZ2h0aW5nLWNvbG9yIiwgInN0b3AtY29sb3IiLCAic3RvcC1vcGFjaXR5IiwgInBvaW50ZXItZXZlbnRzIiwKICAgICJjb2xvci1pbnRlcnBvbGF0aW9uIiwgImNvbG9yLWludGVycG9sYXRpb24tZmlsdGVycyIsCiAgICAiY29sb3ItcmVuZGVyaW5nIiwgImZpbGwiLCAiZmlsbC1vcGFjaXR5IiwgImZpbGwtcnVsZSIsICJpbWFnZS1yZW5kZXJpbmciLAogICAgIm1hcmtlciIsICJtYXJrZXItZW5kIiwgIm1hcmtlci1taWQiLCAibWFya2VyLXN0YXJ0IiwgInNoYXBlLXJlbmRlcmluZyIsICJzdHJva2UiLAogICAgInN0cm9rZS1kYXNoYXJyYXkiLCAic3Ryb2tlLWRhc2hvZmZzZXQiLCAic3Ryb2tlLWxpbmVjYXAiLCAic3Ryb2tlLWxpbmVqb2luIiwKICAgICJzdHJva2UtbWl0ZXJsaW1pdCIsICJzdHJva2Utb3BhY2l0eSIsICJzdHJva2Utd2lkdGgiLCAidGV4dC1yZW5kZXJpbmciLAogICAgImJhc2VsaW5lLXNoaWZ0IiwgImRvbWluYW50LWJhc2VsaW5lIiwgImdseXBoLW9yaWVudGF0aW9uLWhvcml6b250YWwiLAogICAgImdseXBoLW9yaWVudGF0aW9uLXZlcnRpY2FsIiwgInRleHQtYW5jaG9yIiwgIndyaXRpbmctbW9kZSIKICBdLCBwcm9wZXJ0eUtleXdvcmRzID0ga2V5U2V0KHByb3BlcnR5S2V5d29yZHNfKTsKCiAgdmFyIG5vblN0YW5kYXJkUHJvcGVydHlLZXl3b3Jkc18gPSBbCiAgICAic2Nyb2xsYmFyLWFycm93LWNvbG9yIiwgInNjcm9sbGJhci1iYXNlLWNvbG9yIiwgInNjcm9sbGJhci1kYXJrLXNoYWRvdy1jb2xvciIsCiAgICAic2Nyb2xsYmFyLWZhY2UtY29sb3IiLCAic2Nyb2xsYmFyLWhpZ2hsaWdodC1jb2xvciIsICJzY3JvbGxiYXItc2hhZG93LWNvbG9yIiwKICAgICJzY3JvbGxiYXItM2QtbGlnaHQtY29sb3IiLCAic2Nyb2xsYmFyLXRyYWNrLWNvbG9yIiwgInNoYXBlLWluc2lkZSIsCiAgICAic2VhcmNoZmllbGQtY2FuY2VsLWJ1dHRvbiIsICJzZWFyY2hmaWVsZC1kZWNvcmF0aW9uIiwgInNlYXJjaGZpZWxkLXJlc3VsdHMtYnV0dG9uIiwKICAgICJzZWFyY2hmaWVsZC1yZXN1bHRzLWRlY29yYXRpb24iLCAiem9vbSIKICBdLCBub25TdGFuZGFyZFByb3BlcnR5S2V5d29yZHMgPSBrZXlTZXQobm9uU3RhbmRhcmRQcm9wZXJ0eUtleXdvcmRzXyk7CgogIHZhciBmb250UHJvcGVydGllc18gPSBbCiAgICAiZm9udC1mYW1pbHkiLCAic3JjIiwgInVuaWNvZGUtcmFuZ2UiLCAiZm9udC12YXJpYW50IiwgImZvbnQtZmVhdHVyZS1zZXR0aW5ncyIsCiAgICAiZm9udC1zdHJldGNoIiwgImZvbnQtd2VpZ2h0IiwgImZvbnQtc3R5bGUiCiAgXSwgZm9udFByb3BlcnRpZXMgPSBrZXlTZXQoZm9udFByb3BlcnRpZXNfKTsKCiAgdmFyIGNvdW50ZXJEZXNjcmlwdG9yc18gPSBbCiAgICAiYWRkaXRpdmUtc3ltYm9scyIsICJmYWxsYmFjayIsICJuZWdhdGl2ZSIsICJwYWQiLCAicHJlZml4IiwgInJhbmdlIiwKICAgICJzcGVhay1hcyIsICJzdWZmaXgiLCAic3ltYm9scyIsICJzeXN0ZW0iCiAgXSwgY291bnRlckRlc2NyaXB0b3JzID0ga2V5U2V0KGNvdW50ZXJEZXNjcmlwdG9yc18pOwoKICB2YXIgY29sb3JLZXl3b3Jkc18gPSBbCiAgICAiYWxpY2VibHVlIiwgImFudGlxdWV3aGl0ZSIsICJhcXVhIiwgImFxdWFtYXJpbmUiLCAiYXp1cmUiLCAiYmVpZ2UiLAogICAgImJpc3F1ZSIsICJibGFjayIsICJibGFuY2hlZGFsbW9uZCIsICJibHVlIiwgImJsdWV2aW9sZXQiLCAiYnJvd24iLAogICAgImJ1cmx5d29vZCIsICJjYWRldGJsdWUiLCAiY2hhcnRyZXVzZSIsICJjaG9jb2xhdGUiLCAiY29yYWwiLCAiY29ybmZsb3dlcmJsdWUiLAogICAgImNvcm5zaWxrIiwgImNyaW1zb24iLCAiY3lhbiIsICJkYXJrYmx1ZSIsICJkYXJrY3lhbiIsICJkYXJrZ29sZGVucm9kIiwKICAgICJkYXJrZ3JheSIsICJkYXJrZ3JlZW4iLCAiZGFya2toYWtpIiwgImRhcmttYWdlbnRhIiwgImRhcmtvbGl2ZWdyZWVuIiwKICAgICJkYXJrb3JhbmdlIiwgImRhcmtvcmNoaWQiLCAiZGFya3JlZCIsICJkYXJrc2FsbW9uIiwgImRhcmtzZWFncmVlbiIsCiAgICAiZGFya3NsYXRlYmx1ZSIsICJkYXJrc2xhdGVncmF5IiwgImRhcmt0dXJxdW9pc2UiLCAiZGFya3Zpb2xldCIsCiAgICAiZGVlcHBpbmsiLCAiZGVlcHNreWJsdWUiLCAiZGltZ3JheSIsICJkb2RnZXJibHVlIiwgImZpcmVicmljayIsCiAgICAiZmxvcmFsd2hpdGUiLCAiZm9yZXN0Z3JlZW4iLCAiZnVjaHNpYSIsICJnYWluc2Jvcm8iLCAiZ2hvc3R3aGl0ZSIsCiAgICAiZ29sZCIsICJnb2xkZW5yb2QiLCAiZ3JheSIsICJncmV5IiwgImdyZWVuIiwgImdyZWVueWVsbG93IiwgImhvbmV5ZGV3IiwKICAgICJob3RwaW5rIiwgImluZGlhbnJlZCIsICJpbmRpZ28iLCAiaXZvcnkiLCAia2hha2kiLCAibGF2ZW5kZXIiLAogICAgImxhdmVuZGVyYmx1c2giLCAibGF3bmdyZWVuIiwgImxlbW9uY2hpZmZvbiIsICJsaWdodGJsdWUiLCAibGlnaHRjb3JhbCIsCiAgICAibGlnaHRjeWFuIiwgImxpZ2h0Z29sZGVucm9keWVsbG93IiwgImxpZ2h0Z3JheSIsICJsaWdodGdyZWVuIiwgImxpZ2h0cGluayIsCiAgICAibGlnaHRzYWxtb24iLCAibGlnaHRzZWFncmVlbiIsICJsaWdodHNreWJsdWUiLCAibGlnaHRzbGF0ZWdyYXkiLAogICAgImxpZ2h0c3RlZWxibHVlIiwgImxpZ2h0eWVsbG93IiwgImxpbWUiLCAibGltZWdyZWVuIiwgImxpbmVuIiwgIm1hZ2VudGEiLAogICAgIm1hcm9vbiIsICJtZWRpdW1hcXVhbWFyaW5lIiwgIm1lZGl1bWJsdWUiLCAibWVkaXVtb3JjaGlkIiwgIm1lZGl1bXB1cnBsZSIsCiAgICAibWVkaXVtc2VhZ3JlZW4iLCAibWVkaXVtc2xhdGVibHVlIiwgIm1lZGl1bXNwcmluZ2dyZWVuIiwgIm1lZGl1bXR1cnF1b2lzZSIsCiAgICAibWVkaXVtdmlvbGV0cmVkIiwgIm1pZG5pZ2h0Ymx1ZSIsICJtaW50Y3JlYW0iLCAibWlzdHlyb3NlIiwgIm1vY2Nhc2luIiwKICAgICJuYXZham93aGl0ZSIsICJuYXZ5IiwgIm9sZGxhY2UiLCAib2xpdmUiLCAib2xpdmVkcmFiIiwgIm9yYW5nZSIsICJvcmFuZ2VyZWQiLAogICAgIm9yY2hpZCIsICJwYWxlZ29sZGVucm9kIiwgInBhbGVncmVlbiIsICJwYWxldHVycXVvaXNlIiwgInBhbGV2aW9sZXRyZWQiLAogICAgInBhcGF5YXdoaXAiLCAicGVhY2hwdWZmIiwgInBlcnUiLCAicGluayIsICJwbHVtIiwgInBvd2RlcmJsdWUiLAogICAgInB1cnBsZSIsICJyZWJlY2NhcHVycGxlIiwgInJlZCIsICJyb3N5YnJvd24iLCAicm95YWxibHVlIiwgInNhZGRsZWJyb3duIiwKICAgICJzYWxtb24iLCAic2FuZHlicm93biIsICJzZWFncmVlbiIsICJzZWFzaGVsbCIsICJzaWVubmEiLCAic2lsdmVyIiwgInNreWJsdWUiLAogICAgInNsYXRlYmx1ZSIsICJzbGF0ZWdyYXkiLCAic25vdyIsICJzcHJpbmdncmVlbiIsICJzdGVlbGJsdWUiLCAidGFuIiwKICAgICJ0ZWFsIiwgInRoaXN0bGUiLCAidG9tYXRvIiwgInR1cnF1b2lzZSIsICJ2aW9sZXQiLCAid2hlYXQiLCAid2hpdGUiLAogICAgIndoaXRlc21va2UiLCAieWVsbG93IiwgInllbGxvd2dyZWVuIgogIF0sIGNvbG9yS2V5d29yZHMgPSBrZXlTZXQoY29sb3JLZXl3b3Jkc18pOwoKICB2YXIgdmFsdWVLZXl3b3Jkc18gPSBbCiAgICAiYWJvdmUiLCAiYWJzb2x1dGUiLCAiYWN0aXZlYm9yZGVyIiwgImFkZGl0aXZlIiwgImFjdGl2ZWNhcHRpb24iLCAiYWZhciIsCiAgICAiYWZ0ZXItd2hpdGUtc3BhY2UiLCAiYWhlYWQiLCAiYWxpYXMiLCAiYWxsIiwgImFsbC1zY3JvbGwiLCAiYWxwaGFiZXRpYyIsICJhbHRlcm5hdGUiLAogICAgImFsd2F5cyIsICJhbWhhcmljIiwgImFtaGFyaWMtYWJlZ2VkZSIsICJhbnRpYWxpYXNlZCIsICJhcHB3b3Jrc3BhY2UiLAogICAgImFyYWJpYy1pbmRpYyIsICJhcm1lbmlhbiIsICJhc3Rlcmlza3MiLCAiYXR0ciIsICJhdXRvIiwgImF2b2lkIiwgImF2b2lkLWNvbHVtbiIsICJhdm9pZC1wYWdlIiwKICAgICJhdm9pZC1yZWdpb24iLCAiYmFja2dyb3VuZCIsICJiYWNrd2FyZHMiLCAiYmFzZWxpbmUiLCAiYmVsb3ciLCAiYmlkaS1vdmVycmlkZSIsICJiaW5hcnkiLAogICAgImJlbmdhbGkiLCAiYmxpbmsiLCAiYmxvY2siLCAiYmxvY2stYXhpcyIsICJib2xkIiwgImJvbGRlciIsICJib3JkZXIiLCAiYm9yZGVyLWJveCIsCiAgICAiYm90aCIsICJib3R0b20iLCAiYnJlYWsiLCAiYnJlYWstYWxsIiwgImJyZWFrLXdvcmQiLCAiYnVsbGV0cyIsICJidXR0b24iLCAiYnV0dG9uLWJldmVsIiwKICAgICJidXR0b25mYWNlIiwgImJ1dHRvbmhpZ2hsaWdodCIsICJidXR0b25zaGFkb3ciLCAiYnV0dG9udGV4dCIsICJjYWxjIiwgImNhbWJvZGlhbiIsCiAgICAiY2FwaXRhbGl6ZSIsICJjYXBzLWxvY2staW5kaWNhdG9yIiwgImNhcHRpb24iLCAiY2FwdGlvbnRleHQiLCAiY2FyZXQiLAogICAgImNlbGwiLCAiY2VudGVyIiwgImNoZWNrYm94IiwgImNpcmNsZSIsICJjamstZGVjaW1hbCIsICJjamstZWFydGhseS1icmFuY2giLAogICAgImNqay1oZWF2ZW5seS1zdGVtIiwgImNqay1pZGVvZ3JhcGhpYyIsICJjbGVhciIsICJjbGlwIiwgImNsb3NlLXF1b3RlIiwKICAgICJjb2wtcmVzaXplIiwgImNvbGxhcHNlIiwgImNvbG9yIiwgImNvbG9yLWJ1cm4iLCAiY29sb3ItZG9kZ2UiLCAiY29sdW1uIiwgImNvbHVtbi1yZXZlcnNlIiwKICAgICJjb21wYWN0IiwgImNvbmRlbnNlZCIsICJjb250YWluIiwgImNvbnRlbnQiLAogICAgImNvbnRlbnQtYm94IiwgImNvbnRleHQtbWVudSIsICJjb250aW51b3VzIiwgImNvcHkiLCAiY291bnRlciIsICJjb3VudGVycyIsICJjb3ZlciIsICJjcm9wIiwKICAgICJjcm9zcyIsICJjcm9zc2hhaXIiLCAiY3VycmVudGNvbG9yIiwgImN1cnNpdmUiLCAiY3ljbGljIiwgImRhcmtlbiIsICJkYXNoZWQiLCAiZGVjaW1hbCIsCiAgICAiZGVjaW1hbC1sZWFkaW5nLXplcm8iLCAiZGVmYXVsdCIsICJkZWZhdWx0LWJ1dHRvbiIsICJkZW5zZSIsICJkZXN0aW5hdGlvbi1hdG9wIiwKICAgICJkZXN0aW5hdGlvbi1pbiIsICJkZXN0aW5hdGlvbi1vdXQiLCAiZGVzdGluYXRpb24tb3ZlciIsICJkZXZhbmFnYXJpIiwgImRpZmZlcmVuY2UiLAogICAgImRpc2MiLCAiZGlzY2FyZCIsICJkaXNjbG9zdXJlLWNsb3NlZCIsICJkaXNjbG9zdXJlLW9wZW4iLCAiZG9jdW1lbnQiLAogICAgImRvdC1kYXNoIiwgImRvdC1kb3QtZGFzaCIsCiAgICAiZG90dGVkIiwgImRvdWJsZSIsICJkb3duIiwgImUtcmVzaXplIiwgImVhc2UiLCAiZWFzZS1pbiIsICJlYXNlLWluLW91dCIsICJlYXNlLW91dCIsCiAgICAiZWxlbWVudCIsICJlbGxpcHNlIiwgImVsbGlwc2lzIiwgImVtYmVkIiwgImVuZCIsICJldGhpb3BpYyIsICJldGhpb3BpYy1hYmVnZWRlIiwKICAgICJldGhpb3BpYy1hYmVnZWRlLWFtLWV0IiwgImV0aGlvcGljLWFiZWdlZGUtZ2V6IiwgImV0aGlvcGljLWFiZWdlZGUtdGktZXIiLAogICAgImV0aGlvcGljLWFiZWdlZGUtdGktZXQiLCAiZXRoaW9waWMtaGFsZWhhbWUtYWEtZXIiLAogICAgImV0aGlvcGljLWhhbGVoYW1lLWFhLWV0IiwgImV0aGlvcGljLWhhbGVoYW1lLWFtLWV0IiwKICAgICJldGhpb3BpYy1oYWxlaGFtZS1nZXoiLCAiZXRoaW9waWMtaGFsZWhhbWUtb20tZXQiLAogICAgImV0aGlvcGljLWhhbGVoYW1lLXNpZC1ldCIsICJldGhpb3BpYy1oYWxlaGFtZS1zby1ldCIsCiAgICAiZXRoaW9waWMtaGFsZWhhbWUtdGktZXIiLCAiZXRoaW9waWMtaGFsZWhhbWUtdGktZXQiLCAiZXRoaW9waWMtaGFsZWhhbWUtdGlnIiwKICAgICJldGhpb3BpYy1udW1lcmljIiwgImV3LXJlc2l6ZSIsICJleGNsdXNpb24iLCAiZXhwYW5kZWQiLCAiZXh0ZW5kcyIsICJleHRyYS1jb25kZW5zZWQiLAogICAgImV4dHJhLWV4cGFuZGVkIiwgImZhbnRhc3kiLCAiZmFzdCIsICJmaWxsIiwgImZpeGVkIiwgImZsYXQiLCAiZmxleCIsICJmbGV4LWVuZCIsICJmbGV4LXN0YXJ0IiwgImZvb3Rub3RlcyIsCiAgICAiZm9yd2FyZHMiLCAiZnJvbSIsICJnZW9tZXRyaWNQcmVjaXNpb24iLCAiZ2VvcmdpYW4iLCAiZ3JheXRleHQiLCAiZ3JpZCIsICJncm9vdmUiLAogICAgImd1amFyYXRpIiwgImd1cm11a2hpIiwgImhhbmQiLCAiaGFuZ3VsIiwgImhhbmd1bC1jb25zb25hbnQiLCAiaGFyZC1saWdodCIsICJoZWJyZXciLAogICAgImhlbHAiLCAiaGlkZGVuIiwgImhpZGUiLCAiaGlnaGVyIiwgImhpZ2hsaWdodCIsICJoaWdobGlnaHR0ZXh0IiwKICAgICJoaXJhZ2FuYSIsICJoaXJhZ2FuYS1pcm9oYSIsICJob3Jpem9udGFsIiwgImhzbCIsICJoc2xhIiwgImh1ZSIsICJpY29uIiwgImlnbm9yZSIsCiAgICAiaW5hY3RpdmVib3JkZXIiLCAiaW5hY3RpdmVjYXB0aW9uIiwgImluYWN0aXZlY2FwdGlvbnRleHQiLCAiaW5maW5pdGUiLAogICAgImluZm9iYWNrZ3JvdW5kIiwgImluZm90ZXh0IiwgImluaGVyaXQiLCAiaW5pdGlhbCIsICJpbmxpbmUiLCAiaW5saW5lLWF4aXMiLAogICAgImlubGluZS1ibG9jayIsICJpbmxpbmUtZmxleCIsICJpbmxpbmUtZ3JpZCIsICJpbmxpbmUtdGFibGUiLCAiaW5zZXQiLCAiaW5zaWRlIiwgImludHJpbnNpYyIsICJpbnZlcnQiLAogICAgIml0YWxpYyIsICJqYXBhbmVzZS1mb3JtYWwiLCAiamFwYW5lc2UtaW5mb3JtYWwiLCAianVzdGlmeSIsICJrYW5uYWRhIiwKICAgICJrYXRha2FuYSIsICJrYXRha2FuYS1pcm9oYSIsICJrZWVwLWFsbCIsICJraG1lciIsCiAgICAia29yZWFuLWhhbmd1bC1mb3JtYWwiLCAia29yZWFuLWhhbmphLWZvcm1hbCIsICJrb3JlYW4taGFuamEtaW5mb3JtYWwiLAogICAgImxhbmRzY2FwZSIsICJsYW8iLCAibGFyZ2UiLCAibGFyZ2VyIiwgImxlZnQiLCAibGV2ZWwiLCAibGlnaHRlciIsICJsaWdodGVuIiwKICAgICJsaW5lLXRocm91Z2giLCAibGluZWFyIiwgImxpbmVhci1ncmFkaWVudCIsICJsaW5lcyIsICJsaXN0LWl0ZW0iLCAibGlzdGJveCIsICJsaXN0aXRlbSIsCiAgICAibG9jYWwiLCAibG9naWNhbCIsICJsb3VkIiwgImxvd2VyIiwgImxvd2VyLWFscGhhIiwgImxvd2VyLWFybWVuaWFuIiwKICAgICJsb3dlci1ncmVlayIsICJsb3dlci1oZXhhZGVjaW1hbCIsICJsb3dlci1sYXRpbiIsICJsb3dlci1ub3J3ZWdpYW4iLAogICAgImxvd2VyLXJvbWFuIiwgImxvd2VyY2FzZSIsICJsdHIiLCAibHVtaW5vc2l0eSIsICJtYWxheWFsYW0iLCAibWF0Y2giLCAibWF0cml4IiwgIm1hdHJpeDNkIiwKICAgICJtZWRpYS1jb250cm9scy1iYWNrZ3JvdW5kIiwgIm1lZGlhLWN1cnJlbnQtdGltZS1kaXNwbGF5IiwKICAgICJtZWRpYS1mdWxsc2NyZWVuLWJ1dHRvbiIsICJtZWRpYS1tdXRlLWJ1dHRvbiIsICJtZWRpYS1wbGF5LWJ1dHRvbiIsCiAgICAibWVkaWEtcmV0dXJuLXRvLXJlYWx0aW1lLWJ1dHRvbiIsICJtZWRpYS1yZXdpbmQtYnV0dG9uIiwKICAgICJtZWRpYS1zZWVrLWJhY2stYnV0dG9uIiwgIm1lZGlhLXNlZWstZm9yd2FyZC1idXR0b24iLCAibWVkaWEtc2xpZGVyIiwKICAgICJtZWRpYS1zbGlkZXJ0aHVtYiIsICJtZWRpYS10aW1lLXJlbWFpbmluZy1kaXNwbGF5IiwgIm1lZGlhLXZvbHVtZS1zbGlkZXIiLAogICAgIm1lZGlhLXZvbHVtZS1zbGlkZXItY29udGFpbmVyIiwgIm1lZGlhLXZvbHVtZS1zbGlkZXJ0aHVtYiIsICJtZWRpdW0iLAogICAgIm1lbnUiLCAibWVudWxpc3QiLCAibWVudWxpc3QtYnV0dG9uIiwgIm1lbnVsaXN0LXRleHQiLAogICAgIm1lbnVsaXN0LXRleHRmaWVsZCIsICJtZW51dGV4dCIsICJtZXNzYWdlLWJveCIsICJtaWRkbGUiLCAibWluLWludHJpbnNpYyIsCiAgICAibWl4IiwgIm1vbmdvbGlhbiIsICJtb25vc3BhY2UiLCAibW92ZSIsICJtdWx0aXBsZSIsICJtdWx0aXBseSIsICJteWFubWFyIiwgIm4tcmVzaXplIiwKICAgICJuYXJyb3dlciIsICJuZS1yZXNpemUiLCAibmVzdy1yZXNpemUiLCAibm8tY2xvc2UtcXVvdGUiLCAibm8tZHJvcCIsCiAgICAibm8tb3Blbi1xdW90ZSIsICJuby1yZXBlYXQiLCAibm9uZSIsICJub3JtYWwiLCAibm90LWFsbG93ZWQiLCAibm93cmFwIiwKICAgICJucy1yZXNpemUiLCAibnVtYmVycyIsICJudW1lcmljIiwgIm53LXJlc2l6ZSIsICJud3NlLXJlc2l6ZSIsICJvYmxpcXVlIiwgIm9jdGFsIiwgIm9wZW4tcXVvdGUiLAogICAgIm9wdGltaXplTGVnaWJpbGl0eSIsICJvcHRpbWl6ZVNwZWVkIiwgIm9yaXlhIiwgIm9yb21vIiwgIm91dHNldCIsCiAgICAib3V0c2lkZSIsICJvdXRzaWRlLXNoYXBlIiwgIm92ZXJsYXkiLCAib3ZlcmxpbmUiLCAicGFkZGluZyIsICJwYWRkaW5nLWJveCIsCiAgICAicGFpbnRlZCIsICJwYWdlIiwgInBhdXNlZCIsICJwZXJzaWFuIiwgInBlcnNwZWN0aXZlIiwgInBsdXMtZGFya2VyIiwgInBsdXMtbGlnaHRlciIsCiAgICAicG9pbnRlciIsICJwb2x5Z29uIiwgInBvcnRyYWl0IiwgInByZSIsICJwcmUtbGluZSIsICJwcmUtd3JhcCIsICJwcmVzZXJ2ZS0zZCIsCiAgICAicHJvZ3Jlc3MiLCAicHVzaC1idXR0b24iLCAicmFkaWFsLWdyYWRpZW50IiwgInJhZGlvIiwgInJlYWQtb25seSIsCiAgICAicmVhZC13cml0ZSIsICJyZWFkLXdyaXRlLXBsYWludGV4dC1vbmx5IiwgInJlY3RhbmdsZSIsICJyZWdpb24iLAogICAgInJlbGF0aXZlIiwgInJlcGVhdCIsICJyZXBlYXRpbmctbGluZWFyLWdyYWRpZW50IiwKICAgICJyZXBlYXRpbmctcmFkaWFsLWdyYWRpZW50IiwgInJlcGVhdC14IiwgInJlcGVhdC15IiwgInJlc2V0IiwgInJldmVyc2UiLAogICAgInJnYiIsICJyZ2JhIiwgInJpZGdlIiwgInJpZ2h0IiwgInJvdGF0ZSIsICJyb3RhdGUzZCIsICJyb3RhdGVYIiwgInJvdGF0ZVkiLAogICAgInJvdGF0ZVoiLCAicm91bmQiLCAicm93IiwgInJvdy1yZXNpemUiLCAicm93LXJldmVyc2UiLCAicnRsIiwgInJ1bi1pbiIsICJydW5uaW5nIiwKICAgICJzLXJlc2l6ZSIsICJzYW5zLXNlcmlmIiwgInNhdHVyYXRpb24iLCAic2NhbGUiLCAic2NhbGUzZCIsICJzY2FsZVgiLCAic2NhbGVZIiwgInNjYWxlWiIsICJzY3JlZW4iLAogICAgInNjcm9sbCIsICJzY3JvbGxiYXIiLCAic2UtcmVzaXplIiwgInNlYXJjaGZpZWxkIiwKICAgICJzZWFyY2hmaWVsZC1jYW5jZWwtYnV0dG9uIiwgInNlYXJjaGZpZWxkLWRlY29yYXRpb24iLAogICAgInNlYXJjaGZpZWxkLXJlc3VsdHMtYnV0dG9uIiwgInNlYXJjaGZpZWxkLXJlc3VsdHMtZGVjb3JhdGlvbiIsCiAgICAic2VtaS1jb25kZW5zZWQiLCAic2VtaS1leHBhbmRlZCIsICJzZXBhcmF0ZSIsICJzZXJpZiIsICJzaG93IiwgInNpZGFtYSIsCiAgICAic2ltcC1jaGluZXNlLWZvcm1hbCIsICJzaW1wLWNoaW5lc2UtaW5mb3JtYWwiLCAic2luZ2xlIiwKICAgICJza2V3IiwgInNrZXdYIiwgInNrZXdZIiwgInNraXAtd2hpdGUtc3BhY2UiLCAic2xpZGUiLCAic2xpZGVyLWhvcml6b250YWwiLAogICAgInNsaWRlci12ZXJ0aWNhbCIsICJzbGlkZXJ0aHVtYi1ob3Jpem9udGFsIiwgInNsaWRlcnRodW1iLXZlcnRpY2FsIiwgInNsb3ciLAogICAgInNtYWxsIiwgInNtYWxsLWNhcHMiLCAic21hbGwtY2FwdGlvbiIsICJzbWFsbGVyIiwgInNvZnQtbGlnaHQiLCAic29saWQiLCAic29tYWxpIiwKICAgICJzb3VyY2UtYXRvcCIsICJzb3VyY2UtaW4iLCAic291cmNlLW91dCIsICJzb3VyY2Utb3ZlciIsICJzcGFjZSIsICJzcGFjZS1hcm91bmQiLCAic3BhY2UtYmV0d2VlbiIsICJzcGVsbC1vdXQiLCAic3F1YXJlIiwKICAgICJzcXVhcmUtYnV0dG9uIiwgInN0YXJ0IiwgInN0YXRpYyIsICJzdGF0dXMtYmFyIiwgInN0cmV0Y2giLCAic3Ryb2tlIiwgInN1YiIsCiAgICAic3VicGl4ZWwtYW50aWFsaWFzZWQiLCAic3VwZXIiLCAic3ctcmVzaXplIiwgInN5bWJvbGljIiwgInN5bWJvbHMiLCAidGFibGUiLAogICAgInRhYmxlLWNhcHRpb24iLCAidGFibGUtY2VsbCIsICJ0YWJsZS1jb2x1bW4iLCAidGFibGUtY29sdW1uLWdyb3VwIiwKICAgICJ0YWJsZS1mb290ZXItZ3JvdXAiLCAidGFibGUtaGVhZGVyLWdyb3VwIiwgInRhYmxlLXJvdyIsICJ0YWJsZS1yb3ctZ3JvdXAiLAogICAgInRhbWlsIiwKICAgICJ0ZWx1Z3UiLCAidGV4dCIsICJ0ZXh0LWJvdHRvbSIsICJ0ZXh0LXRvcCIsICJ0ZXh0YXJlYSIsICJ0ZXh0ZmllbGQiLCAidGhhaSIsCiAgICAidGhpY2siLCAidGhpbiIsICJ0aHJlZWRkYXJrc2hhZG93IiwgInRocmVlZGZhY2UiLCAidGhyZWVkaGlnaGxpZ2h0IiwKICAgICJ0aHJlZWRsaWdodHNoYWRvdyIsICJ0aHJlZWRzaGFkb3ciLCAidGliZXRhbiIsICJ0aWdyZSIsICJ0aWdyaW55YS1lciIsCiAgICAidGlncmlueWEtZXItYWJlZ2VkZSIsICJ0aWdyaW55YS1ldCIsICJ0aWdyaW55YS1ldC1hYmVnZWRlIiwgInRvIiwgInRvcCIsCiAgICAidHJhZC1jaGluZXNlLWZvcm1hbCIsICJ0cmFkLWNoaW5lc2UtaW5mb3JtYWwiLAogICAgInRyYW5zbGF0ZSIsICJ0cmFuc2xhdGUzZCIsICJ0cmFuc2xhdGVYIiwgInRyYW5zbGF0ZVkiLCAidHJhbnNsYXRlWiIsCiAgICAidHJhbnNwYXJlbnQiLCAidWx0cmEtY29uZGVuc2VkIiwgInVsdHJhLWV4cGFuZGVkIiwgInVuZGVybGluZSIsICJ1cCIsCiAgICAidXBwZXItYWxwaGEiLCAidXBwZXItYXJtZW5pYW4iLCAidXBwZXItZ3JlZWsiLCAidXBwZXItaGV4YWRlY2ltYWwiLAogICAgInVwcGVyLWxhdGluIiwgInVwcGVyLW5vcndlZ2lhbiIsICJ1cHBlci1yb21hbiIsICJ1cHBlcmNhc2UiLCAidXJkdSIsICJ1cmwiLAogICAgInZhciIsICJ2ZXJ0aWNhbCIsICJ2ZXJ0aWNhbC10ZXh0IiwgInZpc2libGUiLCAidmlzaWJsZUZpbGwiLCAidmlzaWJsZVBhaW50ZWQiLAogICAgInZpc2libGVTdHJva2UiLCAidmlzdWFsIiwgInctcmVzaXplIiwgIndhaXQiLCAid2F2ZSIsICJ3aWRlciIsCiAgICAid2luZG93IiwgIndpbmRvd2ZyYW1lIiwgIndpbmRvd3RleHQiLCAid29yZHMiLCAid3JhcCIsICJ3cmFwLXJldmVyc2UiLCAieC1sYXJnZSIsICJ4LXNtYWxsIiwgInhvciIsCiAgICAieHgtbGFyZ2UiLCAieHgtc21hbGwiCiAgXSwgdmFsdWVLZXl3b3JkcyA9IGtleVNldCh2YWx1ZUtleXdvcmRzXyk7CgogIHZhciBhbGxXb3JkcyA9IGRvY3VtZW50VHlwZXNfLmNvbmNhdChtZWRpYVR5cGVzXykuY29uY2F0KG1lZGlhRmVhdHVyZXNfKS5jb25jYXQobWVkaWFWYWx1ZUtleXdvcmRzXykKICAgIC5jb25jYXQocHJvcGVydHlLZXl3b3Jkc18pLmNvbmNhdChub25TdGFuZGFyZFByb3BlcnR5S2V5d29yZHNfKS5jb25jYXQoY29sb3JLZXl3b3Jkc18pCiAgICAuY29uY2F0KHZhbHVlS2V5d29yZHNfKTsKICBDb2RlTWlycm9yLnJlZ2lzdGVySGVscGVyKCJoaW50V29yZHMiLCAiY3NzIiwgYWxsV29yZHMpOwoKICBmdW5jdGlvbiB0b2tlbkNDb21tZW50KHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBtYXliZUVuZCA9IGZhbHNlLCBjaDsKICAgIHdoaWxlICgoY2ggPSBzdHJlYW0ubmV4dCgpKSAhPSBudWxsKSB7CiAgICAgIGlmIChtYXliZUVuZCAmJiBjaCA9PSAiLyIpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IG51bGw7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgbWF5YmVFbmQgPSAoY2ggPT0gIioiKTsKICAgIH0KICAgIHJldHVybiBbImNvbW1lbnQiLCAiY29tbWVudCJdOwogIH0KCiAgQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L2NzcyIsIHsKICAgIGRvY3VtZW50VHlwZXM6IGRvY3VtZW50VHlwZXMsCiAgICBtZWRpYVR5cGVzOiBtZWRpYVR5cGVzLAogICAgbWVkaWFGZWF0dXJlczogbWVkaWFGZWF0dXJlcywKICAgIG1lZGlhVmFsdWVLZXl3b3JkczogbWVkaWFWYWx1ZUtleXdvcmRzLAogICAgcHJvcGVydHlLZXl3b3JkczogcHJvcGVydHlLZXl3b3JkcywKICAgIG5vblN0YW5kYXJkUHJvcGVydHlLZXl3b3Jkczogbm9uU3RhbmRhcmRQcm9wZXJ0eUtleXdvcmRzLAogICAgZm9udFByb3BlcnRpZXM6IGZvbnRQcm9wZXJ0aWVzLAogICAgY291bnRlckRlc2NyaXB0b3JzOiBjb3VudGVyRGVzY3JpcHRvcnMsCiAgICBjb2xvcktleXdvcmRzOiBjb2xvcktleXdvcmRzLAogICAgdmFsdWVLZXl3b3JkczogdmFsdWVLZXl3b3JkcywKICAgIHRva2VuSG9va3M6IHsKICAgICAgIi8iOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgICAgaWYgKCFzdHJlYW0uZWF0KCIqIikpIHJldHVybiBmYWxzZTsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQ0NvbW1lbnQ7CiAgICAgICAgcmV0dXJuIHRva2VuQ0NvbW1lbnQoc3RyZWFtLCBzdGF0ZSk7CiAgICAgIH0KICAgIH0sCiAgICBuYW1lOiAiY3NzIgogIH0pOwoKICBDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveC1zY3NzIiwgewogICAgbWVkaWFUeXBlczogbWVkaWFUeXBlcywKICAgIG1lZGlhRmVhdHVyZXM6IG1lZGlhRmVhdHVyZXMsCiAgICBtZWRpYVZhbHVlS2V5d29yZHM6IG1lZGlhVmFsdWVLZXl3b3JkcywKICAgIHByb3BlcnR5S2V5d29yZHM6IHByb3BlcnR5S2V5d29yZHMsCiAgICBub25TdGFuZGFyZFByb3BlcnR5S2V5d29yZHM6IG5vblN0YW5kYXJkUHJvcGVydHlLZXl3b3JkcywKICAgIGNvbG9yS2V5d29yZHM6IGNvbG9yS2V5d29yZHMsCiAgICB2YWx1ZUtleXdvcmRzOiB2YWx1ZUtleXdvcmRzLAogICAgZm9udFByb3BlcnRpZXM6IGZvbnRQcm9wZXJ0aWVzLAogICAgYWxsb3dOZXN0ZWQ6IHRydWUsCiAgICB0b2tlbkhvb2tzOiB7CiAgICAgICIvIjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICAgIGlmIChzdHJlYW0uZWF0KCIvIikpIHsKICAgICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgICAgIHJldHVybiBbImNvbW1lbnQiLCAiY29tbWVudCJdOwogICAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLmVhdCgiKiIpKSB7CiAgICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQ0NvbW1lbnQ7CiAgICAgICAgICByZXR1cm4gdG9rZW5DQ29tbWVudChzdHJlYW0sIHN0YXRlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIFsib3BlcmF0b3IiLCAib3BlcmF0b3IiXTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgICI6IjogZnVuY3Rpb24oc3RyZWFtKSB7CiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXHMqXHsvKSkKICAgICAgICAgIHJldHVybiBbbnVsbCwgInsiXTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0sCiAgICAgICIkIjogZnVuY3Rpb24oc3RyZWFtKSB7CiAgICAgICAgc3RyZWFtLm1hdGNoKC9eW1x3LV0rLyk7CiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXlxzKjovLCBmYWxzZSkpCiAgICAgICAgICByZXR1cm4gWyJ2YXJpYWJsZS0yIiwgInZhcmlhYmxlLWRlZmluaXRpb24iXTsKICAgICAgICByZXR1cm4gWyJ2YXJpYWJsZS0yIiwgInZhcmlhYmxlIl07CiAgICAgIH0sCiAgICAgICIjIjogZnVuY3Rpb24oc3RyZWFtKSB7CiAgICAgICAgaWYgKCFzdHJlYW0uZWF0KCJ7IikpIHJldHVybiBmYWxzZTsKICAgICAgICByZXR1cm4gW251bGwsICJpbnRlcnBvbGF0aW9uIl07CiAgICAgIH0KICAgIH0sCiAgICBuYW1lOiAiY3NzIiwKICAgIGhlbHBlclR5cGU6ICJzY3NzIgogIH0pOwoKICBDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveC1sZXNzIiwgewogICAgbWVkaWFUeXBlczogbWVkaWFUeXBlcywKICAgIG1lZGlhRmVhdHVyZXM6IG1lZGlhRmVhdHVyZXMsCiAgICBtZWRpYVZhbHVlS2V5d29yZHM6IG1lZGlhVmFsdWVLZXl3b3JkcywKICAgIHByb3BlcnR5S2V5d29yZHM6IHByb3BlcnR5S2V5d29yZHMsCiAgICBub25TdGFuZGFyZFByb3BlcnR5S2V5d29yZHM6IG5vblN0YW5kYXJkUHJvcGVydHlLZXl3b3JkcywKICAgIGNvbG9yS2V5d29yZHM6IGNvbG9yS2V5d29yZHMsCiAgICB2YWx1ZUtleXdvcmRzOiB2YWx1ZUtleXdvcmRzLAogICAgZm9udFByb3BlcnRpZXM6IGZvbnRQcm9wZXJ0aWVzLAogICAgYWxsb3dOZXN0ZWQ6IHRydWUsCiAgICB0b2tlbkhvb2tzOiB7CiAgICAgICIvIjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICAgIGlmIChzdHJlYW0uZWF0KCIvIikpIHsKICAgICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgICAgIHJldHVybiBbImNvbW1lbnQiLCAiY29tbWVudCJdOwogICAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLmVhdCgiKiIpKSB7CiAgICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQ0NvbW1lbnQ7CiAgICAgICAgICByZXR1cm4gdG9rZW5DQ29tbWVudChzdHJlYW0sIHN0YXRlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIFsib3BlcmF0b3IiLCAib3BlcmF0b3IiXTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgICJAIjogZnVuY3Rpb24oc3RyZWFtKSB7CiAgICAgICAgaWYgKHN0cmVhbS5lYXQoInsiKSkgcmV0dXJuIFtudWxsLCAiaW50ZXJwb2xhdGlvbiJdOwogICAgICAgIGlmIChzdHJlYW0ubWF0Y2goL14oY2hhcnNldHxkb2N1bWVudHxmb250LWZhY2V8aW1wb3J0fCgtKG1venxtc3xvfHdlYmtpdCktKT9rZXlmcmFtZXN8bWVkaWF8bmFtZXNwYWNlfHBhZ2V8c3VwcG9ydHMpXGIvLCBmYWxzZSkpIHJldHVybiBmYWxzZTsKICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcd1xcXC1dLyk7CiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXlxzKjovLCBmYWxzZSkpCiAgICAgICAgICByZXR1cm4gWyJ2YXJpYWJsZS0yIiwgInZhcmlhYmxlLWRlZmluaXRpb24iXTsKICAgICAgICByZXR1cm4gWyJ2YXJpYWJsZS0yIiwgInZhcmlhYmxlIl07CiAgICAgIH0sCiAgICAgICImIjogZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIFsiYXRvbSIsICJhdG9tIl07CiAgICAgIH0KICAgIH0sCiAgICBuYW1lOiAiY3NzIiwKICAgIGhlbHBlclR5cGU6ICJsZXNzIgogIH0pOwoKICBDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveC1nc3MiLCB7CiAgICBkb2N1bWVudFR5cGVzOiBkb2N1bWVudFR5cGVzLAogICAgbWVkaWFUeXBlczogbWVkaWFUeXBlcywKICAgIG1lZGlhRmVhdHVyZXM6IG1lZGlhRmVhdHVyZXMsCiAgICBwcm9wZXJ0eUtleXdvcmRzOiBwcm9wZXJ0eUtleXdvcmRzLAogICAgbm9uU3RhbmRhcmRQcm9wZXJ0eUtleXdvcmRzOiBub25TdGFuZGFyZFByb3BlcnR5S2V5d29yZHMsCiAgICBmb250UHJvcGVydGllczogZm9udFByb3BlcnRpZXMsCiAgICBjb3VudGVyRGVzY3JpcHRvcnM6IGNvdW50ZXJEZXNjcmlwdG9ycywKICAgIGNvbG9yS2V5d29yZHM6IGNvbG9yS2V5d29yZHMsCiAgICB2YWx1ZUtleXdvcmRzOiB2YWx1ZUtleXdvcmRzLAogICAgc3VwcG9ydHNBdENvbXBvbmVudDogdHJ1ZSwKICAgIHRva2VuSG9va3M6IHsKICAgICAgIi8iOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgICAgaWYgKCFzdHJlYW0uZWF0KCIqIikpIHJldHVybiBmYWxzZTsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQ0NvbW1lbnQ7CiAgICAgICAgcmV0dXJuIHRva2VuQ0NvbW1lbnQoc3RyZWFtLCBzdGF0ZSk7CiAgICAgIH0KICAgIH0sCiAgICBuYW1lOiAiY3NzIiwKICAgIGhlbHBlclR5cGU6ICJnc3MiCiAgfSk7Cgp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/css/gss.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogQ2xvc3VyZSBTdHlsZXNoZWV0cyAoR1NTKSBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9hZGRvbi9oaW50L3Nob3ctaGludC5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iY3NzLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uLy4uL2FkZG9uL2hpbnQvc2hvdy1oaW50LmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uLy4uL2FkZG9uL2hpbnQvY3NzLWhpbnQuanMiPjwvc2NyaXB0Pgo8c3R5bGU+LkNvZGVNaXJyb3Ige2JhY2tncm91bmQ6ICNmOGY4Zjg7fTwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGgxPkNvZGVNaXJyb3I8L2gxPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5DbG9zdXJlIFN0eWxlc2hlZXRzIChHU1MpPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5DbG9zdXJlIFN0eWxlc2hlZXRzIChHU1MpIG1vZGU8L2gyPgo8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgovKiBTb21lIGV4YW1wbGUgQ2xvc3VyZSBTdHlsZXNoZWV0cyAqLwoKQHByb3ZpZGUgJ3NvbWUuc3R5bGVzJzsKCkByZXF1aXJlICdvdGhlci5zdHlsZXMnOwoKQGNvbXBvbmVudCB7CgpAZGVmIEZPTlRfRkFNSUxZICAgICAgICAgICAiVGltZXMgTmV3IFJvbWFuIiwgR2VvcmdpYSwgU2VyaWY7CkBkZWYgRk9OVF9TSVpFX05PUk1BTCAgICAgIDE1cHg7CkBkZWYgRk9OVF9OT1JNQUwgICAgICAgICAgIG5vcm1hbCBGT05UX1NJWkVfTk9STUFMIEZPTlRfRkFNSUxZOwoKQGRlZiBCR19DT0xPUiAgICAgICAgICAgICAgcmdiKDIzNSwgMjM5LCAyNDkpOwoKQGRlZiBESUFMT0dfQk9SREVSX0NPTE9SICAgcmdiKDEwNywgMTQ0LCAyMTgpOwpAZGVmIERJQUxPR19CR19DT0xPUiAgICAgICBCR19DT0xPUjsKCkBkZWYgTEVGVF9IQU5EX05BVl9XSURUSCAgICAxODBweDsKQGRlZiBMRUZUX0hBTkRfTkFWX1BBRERJTkcgIDNweDsKCkBkZWZtaXhpbiBzaXplKFdJRFRILCBIRUlHSFQpIHsKICB3aWR0aDogV0lEVEg7CiAgaGVpZ2h0OiBIRUlHSFQ7Cn0KCmJvZHkgewogIGJhY2tncm91bmQtY29sb3I6IEJHX0NPTE9SOwogIG1hcmdpbjogMDsKICBwYWRkaW5nOiAzZW0gNmVtOwogIGZvbnQ6IEZPTlRfTk9STUFMOwogIGNvbG9yOiAjMDAwOwp9CgojbmF2aWdhdGlvbiBhIHsKICBmb250LXdlaWdodDogYm9sZDsKICB0ZXh0LWRlY29yYXRpb246IG5vbmUgIWltcG9ydGFudDsKfQoKLmRpYWxvZyB7CiAgYmFja2dyb3VuZC1jb2xvcjogRElBTE9HX0JHX0NPTE9SOwogIGJvcmRlcjogMXB4IHNvbGlkIERJQUxPR19CT1JERVJfQ09MT1I7Cn0KCi5jb250ZW50IHsKICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgbWFyZ2luLWxlZnQ6IGFkZChMRUZUX0hBTkRfTkFWX1BBRERJTkcsICAvKiBwYWRkaW5nIGxlZnQgKi8KICAgICAgICAgICAgICAgICAgIExFRlRfSEFORF9OQVZfV0lEVEgsCiAgICAgICAgICAgICAgICAgICBMRUZUX0hBTkRfTkFWX1BBRERJTkcpOyAvKiBwYWRkaW5nIHJpZ2h0ICovCgp9CgoubG9nbyB7CiAgQG1peGluIHNpemUoMTUwcHgsIDU1cHgpOwogIGJhY2tncm91bmQtaW1hZ2U6IHVybCgnaHR0cDovL3d3dy5nb29nbGUuY29tL2ltYWdlcy9sb2dvX3NtLmdpZicpOwp9Cgp9CjwvdGV4dGFyZWE+PC9mb3JtPgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICBleHRyYUtleXM6IHsiQ3RybC1TcGFjZSI6ICJhdXRvY29tcGxldGUifSwKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgICAgICBtYXRjaEJyYWNrZXRzOiAidGV4dC94LWxlc3MiLAogICAgICAgIG1vZGU6ICJ0ZXh0L3gtZ3NzIgogICAgICB9KTsKICAgIDwvc2NyaXB0PgoKICAgIDxwPkEgbW9kZSBmb3IgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9jbG9zdXJlLXN0eWxlc2hlZXRzIj5DbG9zdXJlIFN0eWxlc2hlZXRzPC9hPiAoR1NTKS48L3A+CiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZSBkZWZpbmVkOjwvc3Ryb25nPiA8Y29kZT50ZXh0L3gtZ3NzPC9jb2RlPi48L3A+CgogICAgPHA+PHN0cm9uZz5QYXJzaW5nL0hpZ2hsaWdodGluZyBUZXN0czo8L3N0cm9uZz4gPGEgaHJlZj0iLi4vLi4vdGVzdC9pbmRleC5odG1sI2dzc18qIj5ub3JtYWw8L2E+LCAgPGEgaHJlZj0iLi4vLi4vdGVzdC9pbmRleC5odG1sI3ZlcmJvc2UsZ3NzXyoiPnZlcmJvc2U8L2E+LjwvcD4KCiAgPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/css/gss_test.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24oKSB7CiAgInVzZSBzdHJpY3QiOwoKICB2YXIgbW9kZSA9IENvZGVNaXJyb3IuZ2V0TW9kZSh7aW5kZW50VW5pdDogMn0sICJ0ZXh0L3gtZ3NzIik7CiAgZnVuY3Rpb24gTVQobmFtZSkgeyB0ZXN0Lm1vZGUobmFtZSwgbW9kZSwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSwgImdzcyIpOyB9CgogIE1UKCJhdENvbXBvbmVudCIsCiAgICAgIltkZWYgQGNvbXBvbmVudF0geyIsCiAgICAgIlt0YWcgZm9vXSB7IiwKICAgICAiICBbcHJvcGVydHkgY29sb3JdOiBba2V5d29yZCBibGFja107IiwKICAgICAifSIsCiAgICAgIn0iKTsKCn0pKCk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/css/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogQ1NTIG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2FkZG9uL2hpbnQvc2hvdy1oaW50LmNzcyI+CjxzY3JpcHQgc3JjPSIuLi8uLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJjc3MuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vLi4vYWRkb24vaGludC9zaG93LWhpbnQuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vLi4vYWRkb24vaGludC9jc3MtaGludC5qcyI+PC9zY3JpcHQ+CjxzdHlsZT4uQ29kZU1pcnJvciB7YmFja2dyb3VuZDogI2Y4ZjhmODt9PC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aDE+Q29kZU1pcnJvcjwvaDE+PGltZyBpZD1sb2dvIHNyYz0iLi4vLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+TGFuZ3VhZ2UgbW9kZXM8L2E+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPkNTUzwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+Q1NTIG1vZGU8L2gyPgo8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgovKiBTb21lIGV4YW1wbGUgQ1NTICovCgpAaW1wb3J0IHVybCgic29tZXRoaW5nLmNzcyIpOwoKYm9keSB7CiAgbWFyZ2luOiAwOwogIHBhZGRpbmc6IDNlbSA2ZW07CiAgZm9udC1mYW1pbHk6IHRhaG9tYSwgYXJpYWwsIHNhbnMtc2VyaWY7CiAgY29sb3I6ICMwMDA7Cn0KCiNuYXZpZ2F0aW9uIGEgewogIGZvbnQtd2VpZ2h0OiBib2xkOwogIHRleHQtZGVjb3JhdGlvbjogbm9uZSAhaW1wb3J0YW50Owp9CgpoMSB7CiAgZm9udC1zaXplOiAyLjVlbTsKfQoKaDIgewogIGZvbnQtc2l6ZTogMS43ZW07Cn0KCmgxOmJlZm9yZSwgaDI6YmVmb3JlIHsKICBjb250ZW50OiAiOjoiOwp9Cgpjb2RlIHsKICBmb250LWZhbWlseTogY291cmllciwgbW9ub3NwYWNlOwogIGZvbnQtc2l6ZTogODAlOwogIGNvbG9yOiAjNDE4QThBOwp9CjwvdGV4dGFyZWE+PC9mb3JtPgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICBleHRyYUtleXM6IHsiQ3RybC1TcGFjZSI6ICJhdXRvY29tcGxldGUifSwKICAgICAgfSk7CiAgICA8L3NjcmlwdD4KCiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC9jc3M8L2NvZGU+LCA8Y29kZT50ZXh0L3gtc2NzczwvY29kZT4gKDxhIGhyZWY9InNjc3MuaHRtbCI+ZGVtbzwvYT4pLCA8Y29kZT50ZXh0L3gtbGVzczwvY29kZT4gKDxhIGhyZWY9Imxlc3MuaHRtbCI+ZGVtbzwvYT4pLjwvcD4KCiAgICA8cD48c3Ryb25nPlBhcnNpbmcvSGlnaGxpZ2h0aW5nIFRlc3RzOjwvc3Ryb25nPiA8YSBocmVmPSIuLi8uLi90ZXN0L2luZGV4Lmh0bWwjY3NzXyoiPm5vcm1hbDwvYT4sICA8YSBocmVmPSIuLi8uLi90ZXN0L2luZGV4Lmh0bWwjdmVyYm9zZSxjc3NfKiI+dmVyYm9zZTwvYT4uPC9wPgoKICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/css/less.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogTEVTUyBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uLy4uL2FkZG9uL2VkaXQvbWF0Y2hicmFja2V0cy5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJjc3MuanMiPjwvc2NyaXB0Pgo8c3R5bGU+LkNvZGVNaXJyb3Ige2JvcmRlcjogMXB4IHNvbGlkICNkZGQ7IGxpbmUtaGVpZ2h0OiAxLjI7fTwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGgxPkNvZGVNaXJyb3I8L2gxPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5MRVNTPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5MRVNTIG1vZGU8L2gyPgo8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPkBtZWRpYSBzY3JlZW4gYW5kIChkZXZpY2UtYXNwZWN0LXJhdGlvOiAxNi85KSB7IOKApiB9CkBtZWRpYSBzY3JlZW4gYW5kIChkZXZpY2UtYXNwZWN0LXJhdGlvOiAxMjgwLzcyMCkgeyDigKYgfQpAbWVkaWEgc2NyZWVuIGFuZCAoZGV2aWNlLWFzcGVjdC1yYXRpbzogMjU2MC8xNDQwKSB7IOKApiB9CgpodG1sOmxhbmcoZnItYmUpCgp0cjpudGgtY2hpbGQoMm4rMSkgLyogcmVwcmVzZW50cyBldmVyeSBvZGQgcm93IG9mIGFuIEhUTUwgdGFibGUgKi8KCmltZzpudGgtb2YtdHlwZSgybisxKSB7IGZsb2F0OiByaWdodDsgfQppbWc6bnRoLW9mLXR5cGUoMm4pIHsgZmxvYXQ6IGxlZnQ7IH0KCmJvZHkgPiBoMjpub3QoOmZpcnN0LW9mLXR5cGUpOm5vdCg6bGFzdC1vZi10eXBlKQoKaHRtbHwqOm5vdCg6bGluayk6bm90KDp2aXNpdGVkKQoqfCo6bm90KDpob3ZlcikKcDo6Zmlyc3QtbGluZSB7IHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2UgfQoKQG5hbWVzcGFjZSBmb28gdXJsKGh0dHA6Ly93d3cuZXhhbXBsZS5jb20pOwpmb298aDEgeyBjb2xvcjogYmx1ZSB9ICAvKiBmaXJzdCBydWxlICovCgpzcGFuW2hlbGxvPSJPY2VhbiJdW2dvb2RieWU9IkxhbmQiXQoKRVtmb29dewogIHBhZGRpbmc6NjVweDsKfQoKaW5wdXRbdHlwZT0ic2VhcmNoIl06Oi13ZWJraXQtc2VhcmNoLWRlY29yYXRpb24sCmlucHV0W3R5cGU9InNlYXJjaCJdOjotd2Via2l0LXNlYXJjaC1jYW5jZWwtYnV0dG9uIHsKICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7IC8vIElubmVyLXBhZGRpbmcgaXNzdWVzIGluIENocm9tZSBPU1gsIFNhZmFyaSA1Cn0KYnV0dG9uOjotbW96LWZvY3VzLWlubmVyLAppbnB1dDo6LW1vei1mb2N1cy1pbm5lciB7IC8vIElubmVyIHBhZGRpbmcgYW5kIGJvcmRlciBvZGRpdGllcyBpbiBGRjMvNAogIHBhZGRpbmc6IDA7CiAgYm9yZGVyOiAwOwp9Ci5idG4gewogIC8vIHJlc2V0IGhlcmUgYXMgb2YgMi4wLjMgZHVlIHRvIFJlY2VzcyBwcm9wZXJ0eSBvcmRlcgogIGJvcmRlci1jb2xvcjogI2NjYzsKICBib3JkZXItY29sb3I6IHJnYmEoMCwwLDAsLjEpIHJnYmEoMCwwLDAsLjEpIHJnYmEoMCwwLDAsLjI1KTsKfQpmaWVsZHNldCBzcGFuIGJ1dHRvbiwgZmllbGRzZXQgc3BhbiBpbnB1dFt0eXBlPSJmaWxlIl0gewogIGZvbnQtc2l6ZToxMnB4OwoJZm9udC1mYW1pbHk6QXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsKfQoKLnJvdW5kZWQtY29ybmVycyAoQHJhZGl1czogNXB4KSB7CiAgYm9yZGVyLXJhZGl1czogQHJhZGl1czsKICAtd2Via2l0LWJvcmRlci1yYWRpdXM6IEByYWRpdXM7CiAgLW1vei1ib3JkZXItcmFkaXVzOiBAcmFkaXVzOwp9CgpAaW1wb3J0IHVybCgic29tZXRoaW5nLmNzcyIpOwoKQGxpZ2h0LWJsdWU6ICAgaHNsKDE5MCwgNTAlLCA2NSUpOwoKI21lbnUgewogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICB3aWR0aDogMTAwJTsKICB6LWluZGV4OiAzOwogIGNsZWFyOiBib3RoOwogIGRpc3BsYXk6IGJsb2NrOwogIGJhY2tncm91bmQtY29sb3I6IEBibHVlOwogIGhlaWdodDogNDJweDsKICBib3JkZXItdG9wOiAycHggc29saWQgbGlnaHRlbihAYWxwaGEtYmx1ZSwgMjAlKTsKICBib3JkZXItYm90dG9tOiAycHggc29saWQgZGFya2VuKEBhbHBoYS1ibHVlLCAyNSUpOwogIC5ib3gtc2hhZG93KDAsIDFweCwgOHB4LCAwLjYpOwogIC1tb3otYm94LXNoYWRvdzogMCAwIDAgIzAwMDsgLy8gQmVjYXVzZSBmaXJlZm94IHN1Y2tzLgoKICAmLmRvY2tlZCB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiBoc2xhKDIxMCwgNjAlLCA0MCUsIDAuNCk7CiAgfQogICY6aG92ZXIgewogICAgYmFja2dyb3VuZC1jb2xvcjogQGJsdWU7CiAgfQoKICAjZHJvcGRvd24gewogICAgbWFyZ2luOiAwIDAgMCAxMTdweDsKICAgIHBhZGRpbmc6IDA7CiAgICBwYWRkaW5nLXRvcDogNXB4OwogICAgZGlzcGxheTogbm9uZTsKICAgIHdpZHRoOiAxOTBweDsKICAgIGJvcmRlci10b3A6IDJweCBzb2xpZCBAbWVkaXVtOwogICAgY29sb3I6IEBoaWdobGlnaHQ7CiAgICBib3JkZXI6IDJweCBzb2xpZCBkYXJrZW4oQG1lZGl1bSwgMjUlKTsKICAgIGJvcmRlci1sZWZ0LWNvbG9yOiBkYXJrZW4oQG1lZGl1bSwgMTUlKTsKICAgIGJvcmRlci1yaWdodC1jb2xvcjogZGFya2VuKEBtZWRpdW0sIDE1JSk7CiAgICBib3JkZXItdG9wLXdpZHRoOiAwOwogICAgYmFja2dyb3VuZC1jb2xvcjogZGFya2VuKEBtZWRpdW0sIDEwJSk7CiAgICB1bCB7CiAgICAgIHBhZGRpbmc6IDBweDsgIAogICAgfQogICAgbGkgewogICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgICBwYWRkaW5nOiAwOwogICAgICBib3JkZXI6IDA7CiAgICAgIGEgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBhZGRpbmc6IDBweCAxNXB4OyAgCiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgICAgIGNvbG9yOiB3aGl0ZTsgIAogICAgICAgICY6aG92ZXIgewogICAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogZGFya2VuKEBtZWRpdW0sIDE1JSk7CiAgICAgICAgICB0ZXh0LWRlY29yYXRpb246IG5vbmU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICAuYm9yZGVyLXJhZGl1cyg1cHgsIGJvdHRvbSk7CiAgICAuYm94LXNoYWRvdygwLCA2cHgsIDhweCwgMC41KTsKICB9Cn0KPC90ZXh0YXJlYT48L2Zvcm0+CiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgICAgIGxpbmVOdW1iZXJzIDogdHJ1ZSwKICAgICAgICBtYXRjaEJyYWNrZXRzIDogdHJ1ZSwKICAgICAgICBtb2RlOiAidGV4dC94LWxlc3MiCiAgICAgIH0pOwogICAgPC9zY3JpcHQ+CgogICAgPHA+VGhlIExFU1MgbW9kZSBpcyBhIHN1Yi1tb2RlIG9mIHRoZSA8YSBocmVmPSJpbmRleC5odG1sIj5DU1MgbW9kZTwvYT4gKGRlZmluZWQgaW4gPGNvZGU+Y3NzLmpzPC9jb2RlPikuPC9wPgoKICAgIDxwPjxzdHJvbmc+UGFyc2luZy9IaWdobGlnaHRpbmcgVGVzdHM6PC9zdHJvbmc+IDxhIGhyZWY9Ii4uLy4uL3Rlc3QvaW5kZXguaHRtbCNsZXNzXyoiPm5vcm1hbDwvYT4sICA8YSBocmVmPSIuLi8uLi90ZXN0L2luZGV4Lmh0bWwjdmVyYm9zZSxsZXNzXyoiPnZlcmJvc2U8L2E+LjwvcD4KICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/css/less_test.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24oKSB7CiAgInVzZSBzdHJpY3QiOwoKICB2YXIgbW9kZSA9IENvZGVNaXJyb3IuZ2V0TW9kZSh7aW5kZW50VW5pdDogMn0sICJ0ZXh0L3gtbGVzcyIpOwogIGZ1bmN0aW9uIE1UKG5hbWUpIHsgdGVzdC5tb2RlKG5hbWUsIG1vZGUsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSksICJsZXNzIik7IH0KCiAgTVQoInZhcmlhYmxlIiwKICAgICAiW3ZhcmlhYmxlLTIgQGJhc2VdOiBbYXRvbSAjZjA0NjE1XTsiLAogICAgICJbcXVhbGlmaWVyIC5jbGFzc10geyIsCiAgICAgIiAgW3Byb3BlcnR5IHdpZHRoXTogW3ZhcmlhYmxlIHBlcmNlbnRhZ2VdKFtudW1iZXIgMC41XSk7IFtjb21tZW50IC8vIHJldHVybnMgYDUwJWBdIiwKICAgICAiICBbcHJvcGVydHkgY29sb3JdOiBbdmFyaWFibGUgc2F0dXJhdGVdKFt2YXJpYWJsZS0yIEBiYXNlXSwgW251bWJlciA1JV0pOyIsCiAgICAgIn0iKTsKCiAgTVQoImFtcCIsCiAgICAgIltxdWFsaWZpZXIgLmNoaWxkXSwgW3F1YWxpZmllciAuc2libGluZ10geyIsCiAgICAgIiAgW3F1YWxpZmllciAucGFyZW50XSBbYXRvbSAmXSB7IiwKICAgICAiICAgIFtwcm9wZXJ0eSBjb2xvcl06IFtrZXl3b3JkIGJsYWNrXTsiLAogICAgICIgIH0iLAogICAgICIgIFthdG9tICZdICsgW2F0b20gJl0geyIsCiAgICAgIiAgICBbcHJvcGVydHkgY29sb3JdOiBba2V5d29yZCByZWRdOyIsCiAgICAgIiAgfSIsCiAgICAgIn0iKTsKCiAgTVQoIm1peGluIiwKICAgICAiW3F1YWxpZmllciAubWl4aW5dIChbdmFyaWFibGUgZGFya107IFt2YXJpYWJsZS0yIEBjb2xvcl0pIHsiLAogICAgICIgIFtwcm9wZXJ0eSBjb2xvcl06IFthdG9tIGRhcmtlbl0oW3ZhcmlhYmxlLTIgQGNvbG9yXSwgW251bWJlciAxMCVdKTsiLAogICAgICJ9IiwKICAgICAiW3F1YWxpZmllciAubWl4aW5dIChbdmFyaWFibGUgbGlnaHRdOyBbdmFyaWFibGUtMiBAY29sb3JdKSB7IiwKICAgICAiICBbcHJvcGVydHkgY29sb3JdOiBbYXRvbSBsaWdodGVuXShbdmFyaWFibGUtMiBAY29sb3JdLCBbbnVtYmVyIDEwJV0pOyIsCiAgICAgIn0iLAogICAgICJbcXVhbGlmaWVyIC5taXhpbl0gKFt2YXJpYWJsZS0yIEBfXTsgW3ZhcmlhYmxlLTIgQGNvbG9yXSkgeyIsCiAgICAgIiAgW3Byb3BlcnR5IGRpc3BsYXldOiBbYXRvbSBibG9ja107IiwKICAgICAifSIsCiAgICAgIlt2YXJpYWJsZS0yIEBzd2l0Y2hdOiBbdmFyaWFibGUgbGlnaHRdOyIsCiAgICAgIltxdWFsaWZpZXIgLmNsYXNzXSB7IiwKICAgICAiICBbcXVhbGlmaWVyIC5taXhpbl0oW3ZhcmlhYmxlLTIgQHN3aXRjaF07IFthdG9tICM4ODhdKTsiLAogICAgICJ9Iik7CgogIE1UKCJuZXN0IiwKICAgICAiW3F1YWxpZmllciAub25lXSB7IiwKICAgICAiICBbZGVmIEBtZWRpYV0gKFtwcm9wZXJ0eSB3aWR0aF06IFtudW1iZXIgNDAwcHhdKSB7IiwKICAgICAiICAgIFtwcm9wZXJ0eSBmb250LXNpemVdOiBbbnVtYmVyIDEuMmVtXTsiLAogICAgICIgICAgW2RlZiBAbWVkaWFdIFthdHRyaWJ1dGUgcHJpbnRdIFtrZXl3b3JkIGFuZF0gW3Byb3BlcnR5IGNvbG9yXSB7IiwKICAgICAiICAgICAgW3Byb3BlcnR5IGNvbG9yXTogW2tleXdvcmQgYmx1ZV07IiwKICAgICAiICAgIH0iLAogICAgICIgIH0iLAogICAgICJ9Iik7CgoKICBNVCgiaW50ZXJwb2xhdGlvbiIsICIuQHtbdmFyaWFibGUgZm9vXX0geyBbcHJvcGVydHkgZm9udC13ZWlnaHRdOiBbYXRvbSBib2xkXTsgfSIpOwp9KSgpOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/css/scss.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogU0NTUyBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9ImNzcy5qcyI+PC9zY3JpcHQ+CjxzdHlsZT4uQ29kZU1pcnJvciB7YmFja2dyb3VuZDogI2Y4ZjhmODt9PC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aDE+Q29kZU1pcnJvcjwvaDE+PGltZyBpZD1sb2dvIHNyYz0iLi4vLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+TGFuZ3VhZ2UgbW9kZXM8L2E+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPlNDU1M8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPlNDU1MgbW9kZTwvaDI+Cjxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+Ci8qIFNvbWUgZXhhbXBsZSBTQ1NTICovCgpAaW1wb3J0ICJjb21wYXNzL2NzczMiOwokdmFyaWFibGU6ICMzMzM7CgokYmx1ZTogIzNiYmZjZTsKJG1hcmdpbjogMTZweDsKCi5jb250ZW50LW5hdmlnYXRpb24gewogICNuZXN0ZWQgewogICAgYmFja2dyb3VuZC1jb2xvcjogYmxhY2s7CiAgfQogIGJvcmRlci1jb2xvcjogJGJsdWU7CiAgY29sb3I6CiAgICBkYXJrZW4oJGJsdWUsIDklKTsKfQoKLmJvcmRlciB7CiAgcGFkZGluZzogJG1hcmdpbiAvIDI7CiAgbWFyZ2luOiAkbWFyZ2luIC8gMjsKICBib3JkZXItY29sb3I6ICRibHVlOwp9CgpAbWl4aW4gdGFibGUtYmFzZSB7CiAgdGggewogICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgfQogIHRkLCB0aCB7cGFkZGluZzogMnB4fQp9Cgp0YWJsZS5obCB7CiAgbWFyZ2luOiAyZW0gMDsKICB0ZC5sbiB7CiAgICB0ZXh0LWFsaWduOiByaWdodDsKICB9Cn0KCmxpIHsKICBmb250OiB7CiAgICBmYW1pbHk6IHNlcmlmOwogICAgd2VpZ2h0OiBib2xkOwogICAgc2l6ZTogMS4yZW07CiAgfQp9CgpAbWl4aW4gbGVmdCgkZGlzdCkgewogIGZsb2F0OiBsZWZ0OwogIG1hcmdpbi1sZWZ0OiAkZGlzdDsKfQoKI2RhdGEgewogIEBpbmNsdWRlIGxlZnQoMTBweCk7CiAgQGluY2x1ZGUgdGFibGUtYmFzZTsKfQoKLnNvdXJjZSB7CiAgQGluY2x1ZGUgZmxvdy1pbnRvKHRhcmdldCk7CiAgYm9yZGVyOiAxMHB4IHNvbGlkIGdyZWVuOwogIG1hcmdpbjogMjBweDsKICB3aWR0aDogMjAwcHg7IH0KCi5uZXctY29udGFpbmVyIHsKICBAaW5jbHVkZSBmbG93LWZyb20odGFyZ2V0KTsKICBib3JkZXI6IDEwcHggc29saWQgcmVkOwogIG1hcmdpbjogMjBweDsKICB3aWR0aDogMjAwcHg7IH0KCmJvZHkgewogIG1hcmdpbjogMDsKICBwYWRkaW5nOiAzZW0gNmVtOwogIGZvbnQtZmFtaWx5OiB0YWhvbWEsIGFyaWFsLCBzYW5zLXNlcmlmOwogIGNvbG9yOiAjMDAwOwp9CgpAbWl4aW4geWVsbG93KCkgewogIGJhY2tncm91bmQ6IHllbGxvdzsKfQoKLmJpZyB7CiAgZm9udC1zaXplOiAxNHB4Owp9CgoubmVzdGVkIHsKICBAaW5jbHVkZSBib3JkZXItcmFkaXVzKDNweCk7CiAgQGV4dGVuZCAuYmlnOwogIHAgewogICAgYmFja2dyb3VuZDogd2hpdGVzbW9rZTsKICAgIGEgewogICAgICBjb2xvcjogcmVkOwogICAgfQogIH0KfQoKI25hdmlnYXRpb24gYSB7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgdGV4dC1kZWNvcmF0aW9uOiBub25lICFpbXBvcnRhbnQ7Cn0KCmgxIHsKICBmb250LXNpemU6IDIuNWVtOwp9CgpoMiB7CiAgZm9udC1zaXplOiAxLjdlbTsKfQoKaDE6YmVmb3JlLCBoMjpiZWZvcmUgewogIGNvbnRlbnQ6ICI6OiI7Cn0KCmNvZGUgewogIGZvbnQtZmFtaWx5OiBjb3VyaWVyLCBtb25vc3BhY2U7CiAgZm9udC1zaXplOiA4MCU7CiAgY29sb3I6ICM0MThBOEE7Cn0KPC90ZXh0YXJlYT48L2Zvcm0+CiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgICAgIG1hdGNoQnJhY2tldHM6IHRydWUsCiAgICAgICAgbW9kZTogInRleHQveC1zY3NzIgogICAgICB9KTsKICAgIDwvc2NyaXB0PgoKICAgIDxwPlRoZSBTQ1NTIG1vZGUgaXMgYSBzdWItbW9kZSBvZiB0aGUgPGEgaHJlZj0iaW5kZXguaHRtbCI+Q1NTIG1vZGU8L2E+IChkZWZpbmVkIGluIDxjb2RlPmNzcy5qczwvY29kZT4pLjwvcD4KCiAgICA8cD48c3Ryb25nPlBhcnNpbmcvSGlnaGxpZ2h0aW5nIFRlc3RzOjwvc3Ryb25nPiA8YSBocmVmPSIuLi8uLi90ZXN0L2luZGV4Lmh0bWwjc2Nzc18qIj5ub3JtYWw8L2E+LCAgPGEgaHJlZj0iLi4vLi4vdGVzdC9pbmRleC5odG1sI3ZlcmJvc2Usc2Nzc18qIj52ZXJib3NlPC9hPi48L3A+CgogIDwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/css/scss_test.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24oKSB7CiAgdmFyIG1vZGUgPSBDb2RlTWlycm9yLmdldE1vZGUoe2luZGVudFVuaXQ6IDJ9LCAidGV4dC94LXNjc3MiKTsKICBmdW5jdGlvbiBNVChuYW1lKSB7IHRlc3QubW9kZShuYW1lLCBtb2RlLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpLCAic2NzcyIpOyB9CgogIE1UKCd1cmxfd2l0aF9xdW90YXRpb24nLAogICAgIlt0YWcgZm9vXSB7IFtwcm9wZXJ0eSBiYWNrZ3JvdW5kXTpbYXRvbSB1cmxdKFtzdHJpbmcgdGVzdC5qcGddKSB9Iik7CgogIE1UKCd1cmxfd2l0aF9kb3VibGVfcXVvdGVzJywKICAgICJbdGFnIGZvb10geyBbcHJvcGVydHkgYmFja2dyb3VuZF06W2F0b20gdXJsXShbc3RyaW5nIFwidGVzdC5qcGdcIl0pIH0iKTsKCiAgTVQoJ3VybF93aXRoX3NpbmdsZV9xdW90ZXMnLAogICAgIlt0YWcgZm9vXSB7IFtwcm9wZXJ0eSBiYWNrZ3JvdW5kXTpbYXRvbSB1cmxdKFtzdHJpbmcgXCd0ZXN0LmpwZ1wnXSkgfSIpOwoKICBNVCgnc3RyaW5nJywKICAgICJbZGVmIEBpbXBvcnRdIFtzdHJpbmcgXCJjb21wYXNzL2NzczNcIl0iKTsKCiAgTVQoJ2ltcG9ydGFudF9rZXl3b3JkJywKICAgICJbdGFnIGZvb10geyBbcHJvcGVydHkgYmFja2dyb3VuZF06W2F0b20gdXJsXShbc3RyaW5nIFwndGVzdC5qcGdcJ10pIFtrZXl3b3JkICFpbXBvcnRhbnRdIH0iKTsKCiAgTVQoJ3ZhcmlhYmxlJywKICAgICJbdmFyaWFibGUtMiAkYmx1ZV06W2F0b20gIzMzM10iKTsKCiAgTVQoJ3ZhcmlhYmxlX2FzX2F0dHJpYnV0ZScsCiAgICAiW3RhZyBmb29dIHsgW3Byb3BlcnR5IGNvbG9yXTpbdmFyaWFibGUtMiAkYmx1ZV0gfSIpOwoKICBNVCgnbnVtYmVycycsCiAgICAiW3RhZyBmb29dIHsgW3Byb3BlcnR5IHBhZGRpbmddOltudW1iZXIgMTBweF0gW251bWJlciAxMF0gW251bWJlciAxMGVtXSBbbnVtYmVyIDhpbl0gfSIpOwoKICBNVCgnbnVtYmVyX3BlcmNlbnRhZ2UnLAogICAgIlt0YWcgZm9vXSB7IFtwcm9wZXJ0eSB3aWR0aF06W251bWJlciA4MCVdIH0iKTsKCiAgTVQoJ3NlbGVjdG9yJywKICAgICJbYnVpbHRpbiAjaGVsbG9dW3F1YWxpZmllciAud29ybGRde30iKTsKCiAgTVQoJ3NpbmdsZWxpbmVfY29tbWVudCcsCiAgICAiW2NvbW1lbnQgLy8gdGhpcyBpcyBhIGNvbW1lbnRdIik7CgogIE1UKCdtdWx0aWxpbmVfY29tbWVudCcsCiAgICAiW2NvbW1lbnQgLypmb29iYXIqL10iKTsKCiAgTVQoJ2F0dHJpYnV0ZV93aXRoX2h5cGhlbicsCiAgICAiW3RhZyBmb29dIHsgW3Byb3BlcnR5IGZvbnQtc2l6ZV06W251bWJlciAxMHB4XSB9Iik7CgogIE1UKCdzdHJpbmdfYWZ0ZXJfYXR0cmlidXRlJywKICAgICJbdGFnIGZvb10geyBbcHJvcGVydHkgY29udGVudF06W3N0cmluZyBcIjo6XCJdIH0iKTsKCiAgTVQoJ2RpcmVjdGl2ZXMnLAogICAgIltkZWYgQGluY2x1ZGVdIFtxdWFsaWZpZXIgLm1peGluXSIpOwoKICBNVCgnYmFzaWNfc3RydWN0dXJlJywKICAgICJbdGFnIHBdIHsgW3Byb3BlcnR5IGJhY2tncm91bmRdOltrZXl3b3JkIHJlZF07IH0iKTsKCiAgTVQoJ25lc3RlZF9zdHJ1Y3R1cmUnLAogICAgIlt0YWcgcF0geyBbdGFnIGFdIHsgW3Byb3BlcnR5IGNvbG9yXTpba2V5d29yZCByZWRdOyB9IH0iKTsKCiAgTVQoJ21peGluJywKICAgICJbZGVmIEBtaXhpbl0gW3RhZyB0YWJsZS1iYXNlXSB7fSIpOwoKICBNVCgnbnVtYmVyX3dpdGhvdXRfc2VtaWNvbG9uJywKICAgICJbdGFnIHBdIHtbcHJvcGVydHkgd2lkdGhdOltudW1iZXIgMTJdfSIsCiAgICAiW3RhZyBhXSB7W3Byb3BlcnR5IGNvbG9yXTpba2V5d29yZCByZWRdO30iKTsKCiAgTVQoJ2F0b21faW5fbmVzdGVkX2Jsb2NrJywKICAgICJbdGFnIHBdIHsgW3RhZyBhXSB7IFtwcm9wZXJ0eSBjb2xvcl06W2F0b20gIzAwMF07IH0gfSIpOwoKICBNVCgnaW50ZXJwb2xhdGlvbl9pbl9wcm9wZXJ0eScsCiAgICAiW3RhZyBmb29dIHsgI3tbdmFyaWFibGUtMiAkaGVsbG9dfTpbbnVtYmVyIDJdOyB9Iik7CgogIE1UKCdpbnRlcnBvbGF0aW9uX2luX3NlbGVjdG9yJywKICAgICJbdGFnIGZvb10je1t2YXJpYWJsZS0yICRoZWxsb119IHsgW3Byb3BlcnR5IGNvbG9yXTpbYXRvbSAjMDAwXTsgfSIpOwoKICBNVCgnaW50ZXJwb2xhdGlvbl9lcnJvcicsCiAgICAiW3RhZyBmb29dI3tbdmFyaWFibGUgZm9vXX0geyBbcHJvcGVydHkgY29sb3JdOlthdG9tICMwMDBdOyB9Iik7CgogIE1UKCJkaXZpZGVfb3BlcmF0b3IiLAogICAgIlt0YWcgZm9vXSB7IFtwcm9wZXJ0eSB3aWR0aF06W251bWJlciA0XSBbb3BlcmF0b3IgL10gW251bWJlciAyXSB9Iik7CgogIE1UKCduZXN0ZWRfc3RydWN0dXJlX3dpdGhfaWRfc2VsZWN0b3InLAogICAgIlt0YWcgcF0geyBbYnVpbHRpbiAjaGVsbG9dIHsgW3Byb3BlcnR5IGNvbG9yXTpba2V5d29yZCByZWRdOyB9IH0iKTsKCiAgTVQoJ2luZGVudF9taXhpbicsCiAgICAgIltkZWYgQG1peGluXSBbdGFnIGNvbnRhaW5lcl0gKCIsCiAgICAgIiAgW3ZhcmlhYmxlLTIgJGFdOiBbbnVtYmVyIDEwXSwiLAogICAgICIgIFt2YXJpYWJsZS0yICRiXTogW251bWJlciAxMF0pIiwKICAgICAie30iKTsKCiAgTVQoJ2luZGVudF9uZXN0ZWQnLAogICAgICJbdGFnIGZvb10geyIsCiAgICAgIiAgW3RhZyBiYXJdIHsiLAogICAgICIgIH0iLAogICAgICJ9Iik7CgogIE1UKCdpbmRlbnRfcGFyZW50aGVzZXMnLAogICAgICJbdGFnIGZvb10geyIsCiAgICAgIiAgW3Byb3BlcnR5IGNvbG9yXTogW2F0b20gZGFya2VuXShbdmFyaWFibGUtMiAkYmx1ZV0sIiwKICAgICAiICAgIFtudW1iZXIgOSVdKTsiLAogICAgICJ9Iik7CgogIE1UKCdpbmRlbnRfdmFyZGVmJywKICAgICAiW3ZhcmlhYmxlLTIgJG5hbWVdOiIsCiAgICAgIiAgW3N0cmluZyAndmFsJ107IiwKICAgICAiW3RhZyB0YWddIHsiLAogICAgICIgIFt0YWcgaW5uZXJdIHsiLAogICAgICIgICAgW3Byb3BlcnR5IG1hcmdpbl06IFtudW1iZXIgM3B4XTsiLAogICAgICIgIH0iLAogICAgICJ9Iik7Cn0pKCk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/css/test.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24oKSB7CiAgdmFyIG1vZGUgPSBDb2RlTWlycm9yLmdldE1vZGUoe2luZGVudFVuaXQ6IDJ9LCAiY3NzIik7CiAgZnVuY3Rpb24gTVQobmFtZSkgeyB0ZXN0Lm1vZGUobmFtZSwgbW9kZSwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7IH0KCiAgLy8gRXJyb3IsIGJlY2F1c2UgImZvb2JhcmhlbGxvIiBpcyBuZWl0aGVyIGEga25vd24gdHlwZSBvciBwcm9wZXJ0eSwgYnV0CiAgLy8gcHJvcGVydHkgd2FzIGV4cGVjdGVkIChhZnRlciAiYW5kIiksIGFuZCBpdCBzaG91bGQgYmUgaW4gcGFyZW50aGVzZXMuCiAgTVQoImF0TWVkaWFVbmtub3duVHlwZSIsCiAgICAgIltkZWYgQG1lZGlhXSBbYXR0cmlidXRlIHNjcmVlbl0gW2tleXdvcmQgYW5kXSBbZXJyb3IgZm9vYmFyaGVsbG9dIHsgfSIpOwoKICAvLyBTb2Z0IGVycm9yLCBiZWNhdXNlICJmb29iYXJoZWxsbyIgaXMgbm90IGEga25vd24gcHJvcGVydHkgb3IgdHlwZS4KICBNVCgiYXRNZWRpYVVua25vd25Qcm9wZXJ0eSIsCiAgICAgIltkZWYgQG1lZGlhXSBbYXR0cmlidXRlIHNjcmVlbl0gW2tleXdvcmQgYW5kXSAoW2Vycm9yIGZvb2JhcmhlbGxvXSkgeyB9Iik7CgogIC8vIE1ha2Ugc3VyZSBuZXN0aW5nIHdvcmtzIHdpdGggbWVkaWEgcXVlcmllcwogIE1UKCJhdE1lZGlhTWF4V2lkdGhOZXN0ZWQiLAogICAgICJbZGVmIEBtZWRpYV0gW2F0dHJpYnV0ZSBzY3JlZW5dIFtrZXl3b3JkIGFuZF0gKFtwcm9wZXJ0eSBtYXgtd2lkdGhdOiBbbnVtYmVyIDI1cHhdKSB7IFt0YWcgZm9vXSB7IH0gfSIpOwoKICBNVCgiYXRNZWRpYUZlYXR1cmVWYWx1ZUtleXdvcmQiLAogICAgICJbZGVmIEBtZWRpYV0gKFtwcm9wZXJ0eSBvcmllbnRhdGlvbl06IFtrZXl3b3JkIGxhbmRzY2FwZV0pIHsgfSIpOwoKICBNVCgiYXRNZWRpYVVua25vd25GZWF0dXJlVmFsdWVLZXl3b3JkIiwKICAgICAiW2RlZiBAbWVkaWFdIChbcHJvcGVydHkgb3JpZW50YXRpb25dOiBbZXJyb3IgdXBzaWRlZG93bl0pIHsgfSIpOwoKICBNVCgidGFnU2VsZWN0b3IiLAogICAgICJbdGFnIGZvb10geyB9Iik7CgogIE1UKCJjbGFzc1NlbGVjdG9yIiwKICAgICAiW3F1YWxpZmllciAuZm9vLWJhcl9oZWxsb10geyB9Iik7CgogIE1UKCJpZFNlbGVjdG9yIiwKICAgICAiW2J1aWx0aW4gI2Zvb10geyBbZXJyb3IgI2Zvb10gfSIpOwoKICBNVCgidGFnU2VsZWN0b3JVbmNsb3NlZCIsCiAgICAgIlt0YWcgZm9vXSB7IFtwcm9wZXJ0eSBtYXJnaW5dOiBbbnVtYmVyIDBdIH0gW3RhZyBiYXJdIHsgfSIpOwoKICBNVCgidGFnU3RyaW5nTm9RdW90ZXMiLAogICAgICJbdGFnIGZvb10geyBbcHJvcGVydHkgZm9udC1mYW1pbHldOiBbdmFyaWFibGUgaGVsbG9dIFt2YXJpYWJsZSB3b3JsZF07IH0iKTsKCiAgTVQoInRhZ1N0cmluZ0RvdWJsZSIsCiAgICAgIlt0YWcgZm9vXSB7IFtwcm9wZXJ0eSBmb250LWZhbWlseV06IFtzdHJpbmcgXCJoZWxsbyB3b3JsZFwiXTsgfSIpOwoKICBNVCgidGFnU3RyaW5nU2luZ2xlIiwKICAgICAiW3RhZyBmb29dIHsgW3Byb3BlcnR5IGZvbnQtZmFtaWx5XTogW3N0cmluZyAnaGVsbG8gd29ybGQnXTsgfSIpOwoKICBNVCgidGFnQ29sb3JLZXl3b3JkIiwKICAgICAiW3RhZyBmb29dIHsiLAogICAgICIgIFtwcm9wZXJ0eSBjb2xvcl06IFtrZXl3b3JkIGJsYWNrXTsiLAogICAgICIgIFtwcm9wZXJ0eSBjb2xvcl06IFtrZXl3b3JkIG5hdnldOyIsCiAgICAgIiAgW3Byb3BlcnR5IGNvbG9yXTogW2tleXdvcmQgeWVsbG93XTsiLAogICAgICJ9Iik7CgogIE1UKCJ0YWdDb2xvckhleDMiLAogICAgICJbdGFnIGZvb10geyBbcHJvcGVydHkgYmFja2dyb3VuZF06IFthdG9tICNmZmZdOyB9Iik7CgogIE1UKCJ0YWdDb2xvckhleDQiLAogICAgICJbdGFnIGZvb10geyBbcHJvcGVydHkgYmFja2dyb3VuZF06IFthdG9tICNmZmZmXTsgfSIpOwoKICBNVCgidGFnQ29sb3JIZXg2IiwKICAgICAiW3RhZyBmb29dIHsgW3Byb3BlcnR5IGJhY2tncm91bmRdOiBbYXRvbSAjZmZmZmZmXTsgfSIpOwoKICBNVCgidGFnQ29sb3JIZXg4IiwKICAgICAiW3RhZyBmb29dIHsgW3Byb3BlcnR5IGJhY2tncm91bmRdOiBbYXRvbSAjZmZmZmZmZmZdOyB9Iik7CgogIE1UKCJ0YWdDb2xvckhleDVJbnZhbGlkIiwKICAgICAiW3RhZyBmb29dIHsgW3Byb3BlcnR5IGJhY2tncm91bmRdOiBbYXRvbSZlcnJvciAjZmZmZmZdOyB9Iik7CgogIE1UKCJ0YWdDb2xvckhleEludmFsaWQiLAogICAgICJbdGFnIGZvb10geyBbcHJvcGVydHkgYmFja2dyb3VuZF06IFthdG9tJmVycm9yICNmZmddOyB9Iik7CgogIE1UKCJ0YWdOZWdhdGl2ZU51bWJlciIsCiAgICAgIlt0YWcgZm9vXSB7IFtwcm9wZXJ0eSBtYXJnaW5dOiBbbnVtYmVyIC01cHhdOyB9Iik7CgogIE1UKCJ0YWdQb3NpdGl2ZU51bWJlciIsCiAgICAgIlt0YWcgZm9vXSB7IFtwcm9wZXJ0eSBwYWRkaW5nXTogW251bWJlciA1cHhdOyB9Iik7CgogIE1UKCJ0YWdWZW5kb3IiLAogICAgICJbdGFnIGZvb10geyBbbWV0YSAtZm9vLV1bcHJvcGVydHkgYm94LXNpemluZ106IFttZXRhIC1mb28tXVthdG9tIGJvcmRlci1ib3hdOyB9Iik7CgogIE1UKCJ0YWdCb2d1c1Byb3BlcnR5IiwKICAgICAiW3RhZyBmb29dIHsgW3Byb3BlcnR5JmVycm9yIGJhcmhlbGxvd29ybGRdOiBbbnVtYmVyIDBdOyB9Iik7CgogIE1UKCJ0YWdUd29Qcm9wZXJ0aWVzIiwKICAgICAiW3RhZyBmb29dIHsgW3Byb3BlcnR5IG1hcmdpbl06IFtudW1iZXIgMF07IFtwcm9wZXJ0eSBwYWRkaW5nXTogW251bWJlciAwXTsgfSIpOwoKICBNVCgidGFnVHdvUHJvcGVydGllc1VSTCIsCiAgICAgIlt0YWcgZm9vXSB7IFtwcm9wZXJ0eSBiYWNrZ3JvdW5kXTogW2F0b20gdXJsXShbc3RyaW5nIC8vZXhhbXBsZS5jb20vZm9vLnBuZ10pOyBbcHJvcGVydHkgcGFkZGluZ106IFtudW1iZXIgMF07IH0iKTsKCiAgTVQoImluZGVudF90YWdTZWxlY3RvciIsCiAgICAgIlt0YWcgc3Ryb25nXSwgW3RhZyBlbV0geyIsCiAgICAgIiAgW3Byb3BlcnR5IGJhY2tncm91bmRdOiBbYXRvbSByZ2JhXSgiLAogICAgICIgICAgW251bWJlciAyNTVdLCBbbnVtYmVyIDI1NV0sIFtudW1iZXIgMF0sIFtudW1iZXIgLjJdIiwKICAgICAiICApOyIsCiAgICAgIn0iKTsKCiAgTVQoImluZGVudF9hdE1lZGlhIiwKICAgICAiW2RlZiBAbWVkaWFdIHsiLAogICAgICIgIFt0YWcgZm9vXSB7IiwKICAgICAiICAgIFtwcm9wZXJ0eSBjb2xvcl06IiwKICAgICAiICAgICAgW2tleXdvcmQgeWVsbG93XTsiLAogICAgICIgIH0iLAogICAgICJ9Iik7CgogIE1UKCJpbmRlbnRfY29tbWEiLAogICAgICJbdGFnIGZvb10geyIsCiAgICAgIiAgW3Byb3BlcnR5IGZvbnQtZmFtaWx5XTogW3ZhcmlhYmxlIHZlcmRhbmFdLCIsCiAgICAgIiAgICBbYXRvbSBzYW5zLXNlcmlmXTsiLAogICAgICJ9Iik7CgogIE1UKCJpbmRlbnRfcGFyZW50aGVzZXMiLAogICAgICJbdGFnIGZvb106W3ZhcmlhYmxlLTMgYmVmb3JlXSB7IiwKICAgICAiICBbcHJvcGVydHkgYmFja2dyb3VuZF06IFthdG9tIHVybF0oIiwKICAgICAiW3N0cmluZyAgICAgYmxhaGJsYWhdIiwKICAgICAiW3N0cmluZyAgICAgZXRjXSIsCiAgICAgIltzdHJpbmcgICBdKSBba2V5d29yZCAhaW1wb3J0YW50XTsiLAogICAgICJ9Iik7CgogIE1UKCJmb250X2ZhY2UiLAogICAgICJbZGVmIEBmb250LWZhY2VdIHsiLAogICAgICIgIFtwcm9wZXJ0eSBmb250LWZhbWlseV06IFtzdHJpbmcgJ215Zm9udCddOyIsCiAgICAgIiAgW2Vycm9yIG5vbnNlbnNlXTogW3N0cmluZyAnYWJjJ107IiwKICAgICAiICBbcHJvcGVydHkgc3JjXTogW2F0b20gdXJsXShbc3RyaW5nIGh0dHA6Ly9ibGFoXSksIiwKICAgICAiICAgIFthdG9tIHVybF0oW3N0cmluZyBodHRwOi8vZm9vXSk7IiwKICAgICAifSIpOwoKICBNVCgiZW1wdHlfdXJsIiwKICAgICAiW2RlZiBAaW1wb3J0XSBbYXRvbSB1cmxdKCkgW2F0dHJpYnV0ZSBzY3JlZW5dOyIpOwoKICBNVCgicGFyZW5zIiwKICAgICAiW3F1YWxpZmllciAuZm9vXSB7IiwKICAgICAiICBbcHJvcGVydHkgYmFja2dyb3VuZC1pbWFnZV06IFt2YXJpYWJsZSBmYWRlXShbYXRvbSAjMDAwXSwgW251bWJlciAyMCVdKTsiLAogICAgICIgIFtwcm9wZXJ0eSBib3JkZXItaW1hZ2VdOiBbYXRvbSBsaW5lYXItZ3JhZGllbnRdKCIsCiAgICAgIiAgICBbYXRvbSB0b10gW2F0b20gYm90dG9tXSwiLAogICAgICIgICAgW3ZhcmlhYmxlIGZhZGVdKFthdG9tICMwMDBdLCBbbnVtYmVyIDIwJV0pIFtudW1iZXIgMCVdLCIsCiAgICAgIiAgICBbdmFyaWFibGUgZmFkZV0oW2F0b20gIzAwMF0sIFtudW1iZXIgMjAlXSkgW251bWJlciAxMDAlXSIsCiAgICAgIiAgKTsiLAogICAgICJ9Iik7CgogIE1UKCJjc3NfdmFyaWFibGUiLAogICAgICI6W3ZhcmlhYmxlLTMgcm9vdF0geyIsCiAgICAgIiAgW3ZhcmlhYmxlLTIgLS1tYWluLWNvbG9yXTogW2F0b20gIzA2Y107IiwKICAgICAifSIsCiAgICAgIlt0YWcgaDFdW2J1aWx0aW4gI2Zvb10geyIsCiAgICAgIiAgW3Byb3BlcnR5IGNvbG9yXTogW2F0b20gdmFyXShbdmFyaWFibGUtMiAtLW1haW4tY29sb3JdKTsiLAogICAgICJ9Iik7CgogIE1UKCJzdXBwb3J0cyIsCiAgICAgIltkZWYgQHN1cHBvcnRzXSAoW2tleXdvcmQgbm90XSAoKFtwcm9wZXJ0eSB0ZXh0LWFsaWduLWxhc3RdOiBbYXRvbSBqdXN0aWZ5XSkgW2tleXdvcmQgb3JdIChbbWV0YSAtbW96LV1bcHJvcGVydHkgdGV4dC1hbGlnbi1sYXN0XTogW2F0b20ganVzdGlmeV0pKSB7IiwKICAgICAiICBbcHJvcGVydHkgdGV4dC1hbGlnbi1sYXN0XTogW2F0b20ganVzdGlmeV07IiwKICAgICAifSIpOwoKICAgTVQoImRvY3VtZW50IiwKICAgICAgIltkZWYgQGRvY3VtZW50XSBbdGFnIHVybF0oW3N0cmluZyBodHRwOi8vYmxhaF0pLCIsCiAgICAgICIgIFt0YWcgdXJsLXByZWZpeF0oW3N0cmluZyBodHRwczovL10pLCIsCiAgICAgICIgIFt0YWcgZG9tYWluXShbc3RyaW5nIGJsYWguY29tXSksIiwKICAgICAgIiAgW3RhZyByZWdleHBdKFtzdHJpbmcgXCIuKmJsYWguK1wiXSkgeyIsCiAgICAgICIgICAgW2J1aWx0aW4gI2lkXSB7IiwKICAgICAgIiAgICAgIFtwcm9wZXJ0eSBiYWNrZ3JvdW5kLWNvbG9yXTogW2tleXdvcmQgd2hpdGVdOyIsCiAgICAgICIgICAgfSIsCiAgICAgICIgICAgW3RhZyBmb29dIHsiLAogICAgICAiICAgICAgW3Byb3BlcnR5IGZvbnQtZmFtaWx5XTogW3ZhcmlhYmxlIFZlcmRhbmFdLCBbYXRvbSBzYW5zLXNlcmlmXTsiLAogICAgICAiICAgIH0iLAogICAgICAifSIpOwoKICAgTVQoImRvY3VtZW50X3VybCIsCiAgICAgICJbZGVmIEBkb2N1bWVudF0gW3RhZyB1cmxdKFtzdHJpbmcgaHR0cDovL2JsYWhdKSB7IFtxdWFsaWZpZXIgLmNsYXNzXSB7IH0gfSIpOwoKICAgTVQoImRvY3VtZW50X3VybFByZWZpeCIsCiAgICAgICJbZGVmIEBkb2N1bWVudF0gW3RhZyB1cmwtcHJlZml4XShbc3RyaW5nIGh0dHBzOi8vXSkgeyBbYnVpbHRpbiAjaWRdIHsgfSB9Iik7CgogICBNVCgiZG9jdW1lbnRfZG9tYWluIiwKICAgICAgIltkZWYgQGRvY3VtZW50XSBbdGFnIGRvbWFpbl0oW3N0cmluZyBibGFoLmNvbV0pIHsgW3RhZyBmb29dIHsgfSB9Iik7CgogICBNVCgiZG9jdW1lbnRfcmVnZXhwIiwKICAgICAgIltkZWYgQGRvY3VtZW50XSBbdGFnIHJlZ2V4cF0oW3N0cmluZyBcIi4qYmxhaC4rXCJdKSB7IFtidWlsdGluICNpZF0geyB9IH0iKTsKCiAgIE1UKCJjb3VudGVyLXN0eWxlIiwKICAgICAgIltkZWYgQGNvdW50ZXItc3R5bGVdIFt2YXJpYWJsZSBiaW5hcnldIHsiLAogICAgICAiICBbcHJvcGVydHkgc3lzdGVtXTogW2F0b20gbnVtZXJpY107IiwKICAgICAgIiAgW3Byb3BlcnR5IHN5bWJvbHNdOiBbbnVtYmVyIDBdIFtudW1iZXIgMV07IiwKICAgICAgIiAgW3Byb3BlcnR5IHN1ZmZpeF06IFtzdHJpbmcgXCIuXCJdOyIsCiAgICAgICIgIFtwcm9wZXJ0eSByYW5nZV06IFthdG9tIGluZmluaXRlXTsiLAogICAgICAiICBbcHJvcGVydHkgc3BlYWstYXNdOiBbYXRvbSBudW1lcmljXTsiLAogICAgICAifSIpOwoKICAgTVQoImNvdW50ZXItc3R5bGUtYWRkaXRpdmUtc3ltYm9scyIsCiAgICAgICJbZGVmIEBjb3VudGVyLXN0eWxlXSBbdmFyaWFibGUgc2ltcGxlLXJvbWFuXSB7IiwKICAgICAgIiAgW3Byb3BlcnR5IHN5c3RlbV06IFthdG9tIGFkZGl0aXZlXTsiLAogICAgICAiICBbcHJvcGVydHkgYWRkaXRpdmUtc3ltYm9sc106IFtudW1iZXIgMTBdIFt2YXJpYWJsZSBYXSwgW251bWJlciA1XSBbdmFyaWFibGUgVl0sIFtudW1iZXIgMV0gW3ZhcmlhYmxlIEldOyIsCiAgICAgICIgIFtwcm9wZXJ0eSByYW5nZV06IFtudW1iZXIgMV0gW251bWJlciA0OV07IiwKICAgICAgIn0iKTsKCiAgIE1UKCJjb3VudGVyLXN0eWxlLXVzZSIsCiAgICAgICJbdGFnIG9sXVtxdWFsaWZpZXIgLnJvbWFuXSB7IFtwcm9wZXJ0eSBsaXN0LXN0eWxlXTogW3ZhcmlhYmxlIHNpbXBsZS1yb21hbl07IH0iKTsKCiAgIE1UKCJjb3VudGVyLXN0eWxlLXN5bWJvbHMiLAogICAgICAiW3RhZyBvbF0geyBbcHJvcGVydHkgbGlzdC1zdHlsZV06IFthdG9tIHN5bWJvbHNdKFthdG9tIGN5Y2xpY10gW3N0cmluZyBcIipcIl0gW3N0cmluZyBcIlxcMjAyMFwiXSBbc3RyaW5nIFwiXFwyMDIxXCJdIFtzdHJpbmcgXCJcXEE3XCJdKTsgfSIpOwp9KSgpOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/cypher/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/cypher/cypher.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovLyBCeSB0aGUgTmVvNGogVGVhbSBhbmQgY29udHJpYnV0b3JzLgovLyBodHRwczovL2dpdGh1Yi5jb20vbmVvNGotY29udHJpYi9Db2RlTWlycm9yCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CiAgdmFyIHdvcmRSZWdleHAgPSBmdW5jdGlvbih3b3JkcykgewogICAgcmV0dXJuIG5ldyBSZWdFeHAoIl4oPzoiICsgd29yZHMuam9pbigifCIpICsgIikkIiwgImkiKTsKICB9OwoKICBDb2RlTWlycm9yLmRlZmluZU1vZGUoImN5cGhlciIsIGZ1bmN0aW9uKGNvbmZpZykgewogICAgdmFyIHRva2VuQmFzZSA9IGZ1bmN0aW9uKHN0cmVhbS8qLCBzdGF0ZSovKSB7CiAgICAgIHZhciBjaCA9IHN0cmVhbS5uZXh0KCk7CiAgICAgIGlmIChjaCA9PT0gIlwiIikgewogICAgICAgIHN0cmVhbS5tYXRjaCgvLis/WyJdLyk7CiAgICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgICB9CiAgICAgIGlmIChjaCA9PT0gIiciKSB7CiAgICAgICAgc3RyZWFtLm1hdGNoKC8uKz9bJ10vKTsKICAgICAgICByZXR1cm4gInN0cmluZyI7CiAgICAgIH0KICAgICAgaWYgKC9be31cKFwpLFwuO1xbXF1dLy50ZXN0KGNoKSkgewogICAgICAgIGN1clB1bmMgPSBjaDsKICAgICAgICByZXR1cm4gIm5vZGUiOwogICAgICB9IGVsc2UgaWYgKGNoID09PSAiLyIgJiYgc3RyZWFtLmVhdCgiLyIpKSB7CiAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICAgIHJldHVybiAiY29tbWVudCI7CiAgICAgIH0gZWxzZSBpZiAob3BlcmF0b3JDaGFycy50ZXN0KGNoKSkgewogICAgICAgIHN0cmVhbS5lYXRXaGlsZShvcGVyYXRvckNoYXJzKTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfSBlbHNlIHsKICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1tfXHdcZF0vKTsKICAgICAgICBpZiAoc3RyZWFtLmVhdCgiOiIpKSB7CiAgICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcd1xkX1wtXS8pOwogICAgICAgICAgcmV0dXJuICJhdG9tIjsKICAgICAgICB9CiAgICAgICAgdmFyIHdvcmQgPSBzdHJlYW0uY3VycmVudCgpOwogICAgICAgIGlmIChmdW5jcy50ZXN0KHdvcmQpKSByZXR1cm4gImJ1aWx0aW4iOwogICAgICAgIGlmIChwcmVkcy50ZXN0KHdvcmQpKSByZXR1cm4gImRlZiI7CiAgICAgICAgaWYgKGtleXdvcmRzLnRlc3Qod29yZCkpIHJldHVybiAia2V5d29yZCI7CiAgICAgICAgcmV0dXJuICJ2YXJpYWJsZSI7CiAgICAgIH0KICAgIH07CiAgICB2YXIgcHVzaENvbnRleHQgPSBmdW5jdGlvbihzdGF0ZSwgdHlwZSwgY29sKSB7CiAgICAgIHJldHVybiBzdGF0ZS5jb250ZXh0ID0gewogICAgICAgIHByZXY6IHN0YXRlLmNvbnRleHQsCiAgICAgICAgaW5kZW50OiBzdGF0ZS5pbmRlbnQsCiAgICAgICAgY29sOiBjb2wsCiAgICAgICAgdHlwZTogdHlwZQogICAgICB9OwogICAgfTsKICAgIHZhciBwb3BDb250ZXh0ID0gZnVuY3Rpb24oc3RhdGUpIHsKICAgICAgc3RhdGUuaW5kZW50ID0gc3RhdGUuY29udGV4dC5pbmRlbnQ7CiAgICAgIHJldHVybiBzdGF0ZS5jb250ZXh0ID0gc3RhdGUuY29udGV4dC5wcmV2OwogICAgfTsKICAgIHZhciBpbmRlbnRVbml0ID0gY29uZmlnLmluZGVudFVuaXQ7CiAgICB2YXIgY3VyUHVuYzsKICAgIHZhciBmdW5jcyA9IHdvcmRSZWdleHAoWyJhYnMiLCAiYWNvcyIsICJhbGxTaG9ydGVzdFBhdGhzIiwgImFzaW4iLCAiYXRhbiIsICJhdGFuMiIsICJhdmciLCAiY2VpbCIsICJjb2FsZXNjZSIsICJjb2xsZWN0IiwgImNvcyIsICJjb3QiLCAiY291bnQiLCAiZGVncmVlcyIsICJlIiwgImVuZG5vZGUiLCAiZXhwIiwgImV4dHJhY3QiLCAiZmlsdGVyIiwgImZsb29yIiwgImhhdmVyc2luIiwgImhlYWQiLCAiaWQiLCAia2V5cyIsICJsYWJlbHMiLCAibGFzdCIsICJsZWZ0IiwgImxlbmd0aCIsICJsb2ciLCAibG9nMTAiLCAibG93ZXIiLCAibHRyaW0iLCAibWF4IiwgIm1pbiIsICJub2RlIiwgIm5vZGVzIiwgInBlcmNlbnRpbGVDb250IiwgInBlcmNlbnRpbGVEaXNjIiwgInBpIiwgInJhZGlhbnMiLCAicmFuZCIsICJyYW5nZSIsICJyZWR1Y2UiLCAicmVsIiwgInJlbGF0aW9uc2hpcCIsICJyZWxhdGlvbnNoaXBzIiwgInJlcGxhY2UiLCAicmV2ZXJzZSIsICJyaWdodCIsICJyb3VuZCIsICJydHJpbSIsICJzaG9ydGVzdFBhdGgiLCAic2lnbiIsICJzaW4iLCAic2l6ZSIsICJzcGxpdCIsICJzcXJ0IiwgInN0YXJ0bm9kZSIsICJzdGRldiIsICJzdGRldnAiLCAic3RyIiwgInN1YnN0cmluZyIsICJzdW0iLCAidGFpbCIsICJ0YW4iLCAidGltZXN0YW1wIiwgInRvRmxvYXQiLCAidG9JbnQiLCAidG9TdHJpbmciLCAidHJpbSIsICJ0eXBlIiwgInVwcGVyIl0pOwogICAgdmFyIHByZWRzID0gd29yZFJlZ2V4cChbImFsbCIsICJhbmQiLCAiYW55IiwgImNvbnRhaW5zIiwgImV4aXN0cyIsICJoYXMiLCAiaW4iLCAibm9uZSIsICJub3QiLCAib3IiLCAic2luZ2xlIiwgInhvciJdKTsKICAgIHZhciBrZXl3b3JkcyA9IHdvcmRSZWdleHAoWyJhcyIsICJhc2MiLCAiYXNjZW5kaW5nIiwgImFzc2VydCIsICJieSIsICJjYXNlIiwgImNvbW1pdCIsICJjb25zdHJhaW50IiwgImNyZWF0ZSIsICJjc3YiLCAiY3lwaGVyIiwgImRlbGV0ZSIsICJkZXNjIiwgImRlc2NlbmRpbmciLCAiZGV0YWNoIiwgImRpc3RpbmN0IiwgImRyb3AiLCAiZWxzZSIsICJlbmQiLCAiZW5kcyIsICJleHBsYWluIiwgImZhbHNlIiwgImZpZWxkdGVybWluYXRvciIsICJmb3JlYWNoIiwgImZyb20iLCAiaGVhZGVycyIsICJpbiIsICJpbmRleCIsICJpcyIsICJqb2luIiwgImxpbWl0IiwgImxvYWQiLCAibWF0Y2giLCAibWVyZ2UiLCAibnVsbCIsICJvbiIsICJvcHRpb25hbCIsICJvcmRlciIsICJwZXJpb2RpYyIsICJwcm9maWxlIiwgInJlbW92ZSIsICJyZXR1cm4iLCAic2NhbiIsICJzZXQiLCAic2tpcCIsICJzdGFydCIsICJzdGFydHMiLCAidGhlbiIsICJ0cnVlIiwgInVuaW9uIiwgInVuaXF1ZSIsICJ1bndpbmQiLCAidXNpbmciLCAid2hlbiIsICJ3aGVyZSIsICJ3aXRoIiwgImNhbGwiLCAieWllbGQiXSk7CiAgICB2YXIgb3BlcmF0b3JDaGFycyA9IC9bKitcLTw+PSZ8fiVeXS87CgogICAgcmV0dXJuIHsKICAgICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24oLypiYXNlKi8pIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgdG9rZW5pemU6IHRva2VuQmFzZSwKICAgICAgICAgIGNvbnRleHQ6IG51bGwsCiAgICAgICAgICBpbmRlbnQ6IDAsCiAgICAgICAgICBjb2w6IDAKICAgICAgICB9OwogICAgICB9LAogICAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICAgIGlmIChzdHJlYW0uc29sKCkpIHsKICAgICAgICAgIGlmIChzdGF0ZS5jb250ZXh0ICYmIChzdGF0ZS5jb250ZXh0LmFsaWduID09IG51bGwpKSB7CiAgICAgICAgICAgIHN0YXRlLmNvbnRleHQuYWxpZ24gPSBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICAgIHN0YXRlLmluZGVudCA9IHN0cmVhbS5pbmRlbnRhdGlvbigpOwogICAgICAgIH0KICAgICAgICBpZiAoc3RyZWFtLmVhdFNwYWNlKCkpIHsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICB2YXIgc3R5bGUgPSBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgICAgICBpZiAoc3R5bGUgIT09ICJjb21tZW50IiAmJiBzdGF0ZS5jb250ZXh0ICYmIChzdGF0ZS5jb250ZXh0LmFsaWduID09IG51bGwpICYmIHN0YXRlLmNvbnRleHQudHlwZSAhPT0gInBhdHRlcm4iKSB7CiAgICAgICAgICBzdGF0ZS5jb250ZXh0LmFsaWduID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgaWYgKGN1clB1bmMgPT09ICIoIikgewogICAgICAgICAgcHVzaENvbnRleHQoc3RhdGUsICIpIiwgc3RyZWFtLmNvbHVtbigpKTsKICAgICAgICB9IGVsc2UgaWYgKGN1clB1bmMgPT09ICJbIikgewogICAgICAgICAgcHVzaENvbnRleHQoc3RhdGUsICJdIiwgc3RyZWFtLmNvbHVtbigpKTsKICAgICAgICB9IGVsc2UgaWYgKGN1clB1bmMgPT09ICJ7IikgewogICAgICAgICAgcHVzaENvbnRleHQoc3RhdGUsICJ9Iiwgc3RyZWFtLmNvbHVtbigpKTsKICAgICAgICB9IGVsc2UgaWYgKC9bXF1cfVwpXS8udGVzdChjdXJQdW5jKSkgewogICAgICAgICAgd2hpbGUgKHN0YXRlLmNvbnRleHQgJiYgc3RhdGUuY29udGV4dC50eXBlID09PSAicGF0dGVybiIpIHsKICAgICAgICAgICAgcG9wQ29udGV4dChzdGF0ZSk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoc3RhdGUuY29udGV4dCAmJiBjdXJQdW5jID09PSBzdGF0ZS5jb250ZXh0LnR5cGUpIHsKICAgICAgICAgICAgcG9wQ29udGV4dChzdGF0ZSk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChjdXJQdW5jID09PSAiLiIgJiYgc3RhdGUuY29udGV4dCAmJiBzdGF0ZS5jb250ZXh0LnR5cGUgPT09ICJwYXR0ZXJuIikgewogICAgICAgICAgcG9wQ29udGV4dChzdGF0ZSk7CiAgICAgICAgfSBlbHNlIGlmICgvYXRvbXxzdHJpbmd8dmFyaWFibGUvLnRlc3Qoc3R5bGUpICYmIHN0YXRlLmNvbnRleHQpIHsKICAgICAgICAgIGlmICgvW1x9XF1dLy50ZXN0KHN0YXRlLmNvbnRleHQudHlwZSkpIHsKICAgICAgICAgICAgcHVzaENvbnRleHQoc3RhdGUsICJwYXR0ZXJuIiwgc3RyZWFtLmNvbHVtbigpKTsKICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUuY29udGV4dC50eXBlID09PSAicGF0dGVybiIgJiYgIXN0YXRlLmNvbnRleHQuYWxpZ24pIHsKICAgICAgICAgICAgc3RhdGUuY29udGV4dC5hbGlnbiA9IHRydWU7CiAgICAgICAgICAgIHN0YXRlLmNvbnRleHQuY29sID0gc3RyZWFtLmNvbHVtbigpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gc3R5bGU7CiAgICAgIH0sCiAgICAgIGluZGVudDogZnVuY3Rpb24oc3RhdGUsIHRleHRBZnRlcikgewogICAgICAgIHZhciBmaXJzdENoYXIgPSB0ZXh0QWZ0ZXIgJiYgdGV4dEFmdGVyLmNoYXJBdCgwKTsKICAgICAgICB2YXIgY29udGV4dCA9IHN0YXRlLmNvbnRleHQ7CiAgICAgICAgaWYgKC9bXF1cfV0vLnRlc3QoZmlyc3RDaGFyKSkgewogICAgICAgICAgd2hpbGUgKGNvbnRleHQgJiYgY29udGV4dC50eXBlID09PSAicGF0dGVybiIpIHsKICAgICAgICAgICAgY29udGV4dCA9IGNvbnRleHQucHJldjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdmFyIGNsb3NpbmcgPSBjb250ZXh0ICYmIGZpcnN0Q2hhciA9PT0gY29udGV4dC50eXBlOwogICAgICAgIGlmICghY29udGV4dCkgcmV0dXJuIDA7CiAgICAgICAgaWYgKGNvbnRleHQudHlwZSA9PT0gImtleXdvcmRzIikgcmV0dXJuIENvZGVNaXJyb3IuY29tbWFuZHMubmV3bGluZUFuZEluZGVudDsKICAgICAgICBpZiAoY29udGV4dC5hbGlnbikgcmV0dXJuIGNvbnRleHQuY29sICsgKGNsb3NpbmcgPyAwIDogMSk7CiAgICAgICAgcmV0dXJuIGNvbnRleHQuaW5kZW50ICsgKGNsb3NpbmcgPyAwIDogaW5kZW50VW5pdCk7CiAgICAgIH0KICAgIH07CiAgfSk7CgogIENvZGVNaXJyb3IubW9kZUV4dGVuc2lvbnNbImN5cGhlciJdID0gewogICAgYXV0b0Zvcm1hdExpbmVCcmVha3M6IGZ1bmN0aW9uKHRleHQpIHsKICAgICAgdmFyIGksIGxpbmVzLCByZVByb2Nlc3NlZFBvcnRpb247CiAgICAgIHZhciBsaW5lcyA9IHRleHQuc3BsaXQoIlxuIik7CiAgICAgIHZhciByZVByb2Nlc3NlZFBvcnRpb24gPSAvXHMrXGIocmV0dXJufHdoZXJlfG9yZGVyIGJ5fG1hdGNofHdpdGh8c2tpcHxsaW1pdHxjcmVhdGV8ZGVsZXRlfHNldClcYlxzL2c7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyBpKyspCiAgICAgICAgbGluZXNbaV0gPSBsaW5lc1tpXS5yZXBsYWNlKHJlUHJvY2Vzc2VkUG9ydGlvbiwgIiBcbiQxICIpLnRyaW0oKTsKICAgICAgcmV0dXJuIGxpbmVzLmpvaW4oIlxuIik7CiAgICB9CiAgfTsKCiAgQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJhcHBsaWNhdGlvbi94LWN5cGhlci1xdWVyeSIsICJjeXBoZXIiKTsKCn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/cypher/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogQ3lwaGVyIE1vZGUgZm9yIENvZGVNaXJyb3I8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiIC8+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vdGhlbWUvbmVvLmNzcyIgLz4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9ImN5cGhlci5qcyI+PC9zY3JpcHQ+CjxzdHlsZT4KLkNvZGVNaXJyb3IgewogICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIGJsYWNrOwogICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrOwp9CiAgICAgICAgPC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aDE+Q29kZU1pcnJvcjwvaDE+PGltZyBpZD1sb2dvIHNyYz0iLi4vLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+TGFuZ3VhZ2UgbW9kZXM8L2E+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPkN5cGhlciBNb2RlIGZvciBDb2RlTWlycm9yPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5DeXBoZXIgTW9kZSBmb3IgQ29kZU1pcnJvcjwvaDI+Cjxmb3JtPgogICAgICAgICAgICA8dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPi8vIEN5cGhlciBNb2RlIGZvciBDb2RlTWlycm9yLCB1c2luZyB0aGUgbmVvIHRoZW1lCk1BVENIIChqb2UgeyBuYW1lOiAnSm9lJyB9KS1bOmtub3dzKjIuLjJdLShmcmllbmRfb2ZfZnJpZW5kKQpXSEVSRSBOT1QgKGpvZSktWzprbm93c10tKGZyaWVuZF9vZl9mcmllbmQpClJFVFVSTiBmcmllbmRfb2ZfZnJpZW5kLm5hbWUsIENPVU5UKCopCk9SREVSIEJZIENPVU5UKCopIERFU0MgLCBmcmllbmRfb2ZfZnJpZW5kLm5hbWUKPC90ZXh0YXJlYT4KICAgICAgICAgICAgPC9mb3JtPgogICAgICAgICAgICA8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gCiAgICAgICAgICAgIDxjb2RlPjxhIGhyZWY9Ij9taW1lPWFwcGxpY2F0aW9uL3gtY3lwaGVyLXF1ZXJ5Ij5hcHBsaWNhdGlvbi94LWN5cGhlci1xdWVyeTwvYT48L2NvZGU+CiAgICAgICAgPC9wPgo8c2NyaXB0Pgp3aW5kb3cub25sb2FkID0gZnVuY3Rpb24oKSB7CiAgdmFyIG1pbWUgPSAnYXBwbGljYXRpb24veC1jeXBoZXItcXVlcnknOwogIC8vIGdldCBtaW1lIHR5cGUKICBpZiAod2luZG93LmxvY2F0aW9uLmhyZWYuaW5kZXhPZignbWltZT0nKSA+IC0xKSB7CiAgICBtaW1lID0gd2luZG93LmxvY2F0aW9uLmhyZWYuc3Vic3RyKHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluZGV4T2YoJ21pbWU9JykgKyA1KTsKICB9CiAgd2luZG93LmVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjb2RlJyksIHsKICAgIG1vZGU6IG1pbWUsCiAgICBpbmRlbnRXaXRoVGFiczogdHJ1ZSwKICAgIHNtYXJ0SW5kZW50OiB0cnVlLAogICAgbGluZU51bWJlcnM6IHRydWUsCiAgICBtYXRjaEJyYWNrZXRzIDogdHJ1ZSwKICAgIGF1dG9mb2N1czogdHJ1ZSwKICAgIHRoZW1lOiAnbmVvJwogIH0pOwp9Owo8L3NjcmlwdD4KCjwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/cypher/test.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24oKSB7CiAgdmFyIG1vZGUgPSBDb2RlTWlycm9yLmdldE1vZGUoe3RhYlNpemU6IDQsIGluZGVudFVuaXQ6IDJ9LCAiY3lwaGVyIik7CiAgZnVuY3Rpb24gTVQobmFtZSkgeyB0ZXN0Lm1vZGUobmFtZSwgbW9kZSwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7IH0KCiAgTVQoInVuYmFsYW5jZWREb3VibGVkUXVvdGVkU3RyaW5nIiwKICAgICAgIltzdHJpbmcgXCJhJ2JcIl1bdmFyaWFibGUgY10iKTsKCiAgTVQoInVuYmFsYW5jZWRTaW5nbGVRdW90ZWRTdHJpbmciLAogICAgICAiW3N0cmluZyAnYVwiYiddW3ZhcmlhYmxlIGNdIik7CgogIE1UKCJkb3VibGVRdW90ZWRTdHJpbmciLAogICAgICAiW3N0cmluZyBcImFcIl1bdmFyaWFibGUgYl0iKTsKCiAgTVQoInNpbmdsZVF1b3RlZFN0cmluZyIsCiAgICAgICJbc3RyaW5nICdhJ11bdmFyaWFibGUgYl0iKTsKIH0pKCk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/d/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/d/d.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJkIiwgZnVuY3Rpb24oY29uZmlnLCBwYXJzZXJDb25maWcpIHsKICB2YXIgaW5kZW50VW5pdCA9IGNvbmZpZy5pbmRlbnRVbml0LAogICAgICBzdGF0ZW1lbnRJbmRlbnRVbml0ID0gcGFyc2VyQ29uZmlnLnN0YXRlbWVudEluZGVudFVuaXQgfHwgaW5kZW50VW5pdCwKICAgICAga2V5d29yZHMgPSBwYXJzZXJDb25maWcua2V5d29yZHMgfHwge30sCiAgICAgIGJ1aWx0aW4gPSBwYXJzZXJDb25maWcuYnVpbHRpbiB8fCB7fSwKICAgICAgYmxvY2tLZXl3b3JkcyA9IHBhcnNlckNvbmZpZy5ibG9ja0tleXdvcmRzIHx8IHt9LAogICAgICBhdG9tcyA9IHBhcnNlckNvbmZpZy5hdG9tcyB8fCB7fSwKICAgICAgaG9va3MgPSBwYXJzZXJDb25maWcuaG9va3MgfHwge30sCiAgICAgIG11bHRpTGluZVN0cmluZ3MgPSBwYXJzZXJDb25maWcubXVsdGlMaW5lU3RyaW5nczsKICB2YXIgaXNPcGVyYXRvckNoYXIgPSAvWytcLSomJT08PiE/fFwvXS87CgogIHZhciBjdXJQdW5jOwoKICBmdW5jdGlvbiB0b2tlbkJhc2Uoc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIGNoID0gc3RyZWFtLm5leHQoKTsKICAgIGlmIChob29rc1tjaF0pIHsKICAgICAgdmFyIHJlc3VsdCA9IGhvb2tzW2NoXShzdHJlYW0sIHN0YXRlKTsKICAgICAgaWYgKHJlc3VsdCAhPT0gZmFsc2UpIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBpZiAoY2ggPT0gJyInIHx8IGNoID09ICInIiB8fCBjaCA9PSAiYCIpIHsKICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlblN0cmluZyhjaCk7CiAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgIH0KICAgIGlmICgvW1xbXF17fVwoXCksO1w6XC5dLy50ZXN0KGNoKSkgewogICAgICBjdXJQdW5jID0gY2g7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgaWYgKC9cZC8udGVzdChjaCkpIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXHdcLl0vKTsKICAgICAgcmV0dXJuICJudW1iZXIiOwogICAgfQogICAgaWYgKGNoID09ICIvIikgewogICAgICBpZiAoc3RyZWFtLmVhdCgiKyIpKSB7CiAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkNvbW1lbnQ7CiAgICAgICAgcmV0dXJuIHRva2VuTmVzdGVkQ29tbWVudChzdHJlYW0sIHN0YXRlKTsKICAgICAgfQogICAgICBpZiAoc3RyZWFtLmVhdCgiKiIpKSB7CiAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkNvbW1lbnQ7CiAgICAgICAgcmV0dXJuIHRva2VuQ29tbWVudChzdHJlYW0sIHN0YXRlKTsKICAgICAgfQogICAgICBpZiAoc3RyZWFtLmVhdCgiLyIpKSB7CiAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICAgIHJldHVybiAiY29tbWVudCI7CiAgICAgIH0KICAgIH0KICAgIGlmIChpc09wZXJhdG9yQ2hhci50ZXN0KGNoKSkgewogICAgICBzdHJlYW0uZWF0V2hpbGUoaXNPcGVyYXRvckNoYXIpOwogICAgICByZXR1cm4gIm9wZXJhdG9yIjsKICAgIH0KICAgIHN0cmVhbS5lYXRXaGlsZSgvW1x3XCRfXHhhMS1cdWZmZmZdLyk7CiAgICB2YXIgY3VyID0gc3RyZWFtLmN1cnJlbnQoKTsKICAgIGlmIChrZXl3b3Jkcy5wcm9wZXJ0eUlzRW51bWVyYWJsZShjdXIpKSB7CiAgICAgIGlmIChibG9ja0tleXdvcmRzLnByb3BlcnR5SXNFbnVtZXJhYmxlKGN1cikpIGN1clB1bmMgPSAibmV3c3RhdGVtZW50IjsKICAgICAgcmV0dXJuICJrZXl3b3JkIjsKICAgIH0KICAgIGlmIChidWlsdGluLnByb3BlcnR5SXNFbnVtZXJhYmxlKGN1cikpIHsKICAgICAgaWYgKGJsb2NrS2V5d29yZHMucHJvcGVydHlJc0VudW1lcmFibGUoY3VyKSkgY3VyUHVuYyA9ICJuZXdzdGF0ZW1lbnQiOwogICAgICByZXR1cm4gImJ1aWx0aW4iOwogICAgfQogICAgaWYgKGF0b21zLnByb3BlcnR5SXNFbnVtZXJhYmxlKGN1cikpIHJldHVybiAiYXRvbSI7CiAgICByZXR1cm4gInZhcmlhYmxlIjsKICB9CgogIGZ1bmN0aW9uIHRva2VuU3RyaW5nKHF1b3RlKSB7CiAgICByZXR1cm4gZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICB2YXIgZXNjYXBlZCA9IGZhbHNlLCBuZXh0LCBlbmQgPSBmYWxzZTsKICAgICAgd2hpbGUgKChuZXh0ID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkgewogICAgICAgIGlmIChuZXh0ID09IHF1b3RlICYmICFlc2NhcGVkKSB7ZW5kID0gdHJ1ZTsgYnJlYWs7fQogICAgICAgIGVzY2FwZWQgPSAhZXNjYXBlZCAmJiBuZXh0ID09ICJcXCI7CiAgICAgIH0KICAgICAgaWYgKGVuZCB8fCAhKGVzY2FwZWQgfHwgbXVsdGlMaW5lU3RyaW5ncykpCiAgICAgICAgc3RhdGUudG9rZW5pemUgPSBudWxsOwogICAgICByZXR1cm4gInN0cmluZyI7CiAgICB9OwogIH0KCiAgZnVuY3Rpb24gdG9rZW5Db21tZW50KHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBtYXliZUVuZCA9IGZhbHNlLCBjaDsKICAgIHdoaWxlIChjaCA9IHN0cmVhbS5uZXh0KCkpIHsKICAgICAgaWYgKGNoID09ICIvIiAmJiBtYXliZUVuZCkgewogICAgICAgIHN0YXRlLnRva2VuaXplID0gbnVsbDsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBtYXliZUVuZCA9IChjaCA9PSAiKiIpOwogICAgfQogICAgcmV0dXJuICJjb21tZW50IjsKICB9CgogIGZ1bmN0aW9uIHRva2VuTmVzdGVkQ29tbWVudChzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgbWF5YmVFbmQgPSBmYWxzZSwgY2g7CiAgICB3aGlsZSAoY2ggPSBzdHJlYW0ubmV4dCgpKSB7CiAgICAgIGlmIChjaCA9PSAiLyIgJiYgbWF5YmVFbmQpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IG51bGw7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgbWF5YmVFbmQgPSAoY2ggPT0gIisiKTsKICAgIH0KICAgIHJldHVybiAiY29tbWVudCI7CiAgfQoKICBmdW5jdGlvbiBDb250ZXh0KGluZGVudGVkLCBjb2x1bW4sIHR5cGUsIGFsaWduLCBwcmV2KSB7CiAgICB0aGlzLmluZGVudGVkID0gaW5kZW50ZWQ7CiAgICB0aGlzLmNvbHVtbiA9IGNvbHVtbjsKICAgIHRoaXMudHlwZSA9IHR5cGU7CiAgICB0aGlzLmFsaWduID0gYWxpZ247CiAgICB0aGlzLnByZXYgPSBwcmV2OwogIH0KICBmdW5jdGlvbiBwdXNoQ29udGV4dChzdGF0ZSwgY29sLCB0eXBlKSB7CiAgICB2YXIgaW5kZW50ID0gc3RhdGUuaW5kZW50ZWQ7CiAgICBpZiAoc3RhdGUuY29udGV4dCAmJiBzdGF0ZS5jb250ZXh0LnR5cGUgPT0gInN0YXRlbWVudCIpCiAgICAgIGluZGVudCA9IHN0YXRlLmNvbnRleHQuaW5kZW50ZWQ7CiAgICByZXR1cm4gc3RhdGUuY29udGV4dCA9IG5ldyBDb250ZXh0KGluZGVudCwgY29sLCB0eXBlLCBudWxsLCBzdGF0ZS5jb250ZXh0KTsKICB9CiAgZnVuY3Rpb24gcG9wQ29udGV4dChzdGF0ZSkgewogICAgdmFyIHQgPSBzdGF0ZS5jb250ZXh0LnR5cGU7CiAgICBpZiAodCA9PSAiKSIgfHwgdCA9PSAiXSIgfHwgdCA9PSAifSIpCiAgICAgIHN0YXRlLmluZGVudGVkID0gc3RhdGUuY29udGV4dC5pbmRlbnRlZDsKICAgIHJldHVybiBzdGF0ZS5jb250ZXh0ID0gc3RhdGUuY29udGV4dC5wcmV2OwogIH0KCiAgLy8gSW50ZXJmYWNlCgogIHJldHVybiB7CiAgICBzdGFydFN0YXRlOiBmdW5jdGlvbihiYXNlY29sdW1uKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgdG9rZW5pemU6IG51bGwsCiAgICAgICAgY29udGV4dDogbmV3IENvbnRleHQoKGJhc2Vjb2x1bW4gfHwgMCkgLSBpbmRlbnRVbml0LCAwLCAidG9wIiwgZmFsc2UpLAogICAgICAgIGluZGVudGVkOiAwLAogICAgICAgIHN0YXJ0T2ZMaW5lOiB0cnVlCiAgICAgIH07CiAgICB9LAoKICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHZhciBjdHggPSBzdGF0ZS5jb250ZXh0OwogICAgICBpZiAoc3RyZWFtLnNvbCgpKSB7CiAgICAgICAgaWYgKGN0eC5hbGlnbiA9PSBudWxsKSBjdHguYWxpZ24gPSBmYWxzZTsKICAgICAgICBzdGF0ZS5pbmRlbnRlZCA9IHN0cmVhbS5pbmRlbnRhdGlvbigpOwogICAgICAgIHN0YXRlLnN0YXJ0T2ZMaW5lID0gdHJ1ZTsKICAgICAgfQogICAgICBpZiAoc3RyZWFtLmVhdFNwYWNlKCkpIHJldHVybiBudWxsOwogICAgICBjdXJQdW5jID0gbnVsbDsKICAgICAgdmFyIHN0eWxlID0gKHN0YXRlLnRva2VuaXplIHx8IHRva2VuQmFzZSkoc3RyZWFtLCBzdGF0ZSk7CiAgICAgIGlmIChzdHlsZSA9PSAiY29tbWVudCIgfHwgc3R5bGUgPT0gIm1ldGEiKSByZXR1cm4gc3R5bGU7CiAgICAgIGlmIChjdHguYWxpZ24gPT0gbnVsbCkgY3R4LmFsaWduID0gdHJ1ZTsKCiAgICAgIGlmICgoY3VyUHVuYyA9PSAiOyIgfHwgY3VyUHVuYyA9PSAiOiIgfHwgY3VyUHVuYyA9PSAiLCIpICYmIGN0eC50eXBlID09ICJzdGF0ZW1lbnQiKSBwb3BDb250ZXh0KHN0YXRlKTsKICAgICAgZWxzZSBpZiAoY3VyUHVuYyA9PSAieyIpIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0uY29sdW1uKCksICJ9Iik7CiAgICAgIGVsc2UgaWYgKGN1clB1bmMgPT0gIlsiKSBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLmNvbHVtbigpLCAiXSIpOwogICAgICBlbHNlIGlmIChjdXJQdW5jID09ICIoIikgcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbS5jb2x1bW4oKSwgIikiKTsKICAgICAgZWxzZSBpZiAoY3VyUHVuYyA9PSAifSIpIHsKICAgICAgICB3aGlsZSAoY3R4LnR5cGUgPT0gInN0YXRlbWVudCIpIGN0eCA9IHBvcENvbnRleHQoc3RhdGUpOwogICAgICAgIGlmIChjdHgudHlwZSA9PSAifSIpIGN0eCA9IHBvcENvbnRleHQoc3RhdGUpOwogICAgICAgIHdoaWxlIChjdHgudHlwZSA9PSAic3RhdGVtZW50IikgY3R4ID0gcG9wQ29udGV4dChzdGF0ZSk7CiAgICAgIH0KICAgICAgZWxzZSBpZiAoY3VyUHVuYyA9PSBjdHgudHlwZSkgcG9wQ29udGV4dChzdGF0ZSk7CiAgICAgIGVsc2UgaWYgKCgoY3R4LnR5cGUgPT0gIn0iIHx8IGN0eC50eXBlID09ICJ0b3AiKSAmJiBjdXJQdW5jICE9ICc7JykgfHwgKGN0eC50eXBlID09ICJzdGF0ZW1lbnQiICYmIGN1clB1bmMgPT0gIm5ld3N0YXRlbWVudCIpKQogICAgICAgIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0uY29sdW1uKCksICJzdGF0ZW1lbnQiKTsKICAgICAgc3RhdGUuc3RhcnRPZkxpbmUgPSBmYWxzZTsKICAgICAgcmV0dXJuIHN0eWxlOwogICAgfSwKCiAgICBpbmRlbnQ6IGZ1bmN0aW9uKHN0YXRlLCB0ZXh0QWZ0ZXIpIHsKICAgICAgaWYgKHN0YXRlLnRva2VuaXplICE9IHRva2VuQmFzZSAmJiBzdGF0ZS50b2tlbml6ZSAhPSBudWxsKSByZXR1cm4gQ29kZU1pcnJvci5QYXNzOwogICAgICB2YXIgY3R4ID0gc3RhdGUuY29udGV4dCwgZmlyc3RDaGFyID0gdGV4dEFmdGVyICYmIHRleHRBZnRlci5jaGFyQXQoMCk7CiAgICAgIGlmIChjdHgudHlwZSA9PSAic3RhdGVtZW50IiAmJiBmaXJzdENoYXIgPT0gIn0iKSBjdHggPSBjdHgucHJldjsKICAgICAgdmFyIGNsb3NpbmcgPSBmaXJzdENoYXIgPT0gY3R4LnR5cGU7CiAgICAgIGlmIChjdHgudHlwZSA9PSAic3RhdGVtZW50IikgcmV0dXJuIGN0eC5pbmRlbnRlZCArIChmaXJzdENoYXIgPT0gInsiID8gMCA6IHN0YXRlbWVudEluZGVudFVuaXQpOwogICAgICBlbHNlIGlmIChjdHguYWxpZ24pIHJldHVybiBjdHguY29sdW1uICsgKGNsb3NpbmcgPyAwIDogMSk7CiAgICAgIGVsc2UgcmV0dXJuIGN0eC5pbmRlbnRlZCArIChjbG9zaW5nID8gMCA6IGluZGVudFVuaXQpOwogICAgfSwKCiAgICBlbGVjdHJpY0NoYXJzOiAie30iCiAgfTsKfSk7CgogIGZ1bmN0aW9uIHdvcmRzKHN0cikgewogICAgdmFyIG9iaiA9IHt9LCB3b3JkcyA9IHN0ci5zcGxpdCgiICIpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB3b3Jkcy5sZW5ndGg7ICsraSkgb2JqW3dvcmRzW2ldXSA9IHRydWU7CiAgICByZXR1cm4gb2JqOwogIH0KCiAgdmFyIGJsb2NrS2V5d29yZHMgPSAiYm9keSBjYXRjaCBjbGFzcyBkbyBlbHNlIGVudW0gZm9yIGZvcmVhY2ggZm9yZWFjaF9yZXZlcnNlIGlmIGluIGludGVyZmFjZSBtaXhpbiAiICsKICAgICAgICAgICAgICAgICAgICAgICJvdXQgc2NvcGUgc3RydWN0IHN3aXRjaCB0cnkgdW5pb24gdW5pdHRlc3QgdmVyc2lvbiB3aGlsZSB3aXRoIjsKCiAgQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtZCIsIHsKICAgIG5hbWU6ICJkIiwKICAgIGtleXdvcmRzOiB3b3JkcygiYWJzdHJhY3QgYWxpYXMgYWxpZ24gYXNtIGFzc2VydCBhdXRvIGJyZWFrIGNhc2UgY2FzdCBjZG91YmxlIGNlbnQgY2Zsb2F0IGNvbnN0IGNvbnRpbnVlICIgKwogICAgICAgICAgICAgICAgICAgICJkZWJ1ZyBkZWZhdWx0IGRlbGVnYXRlIGRlbGV0ZSBkZXByZWNhdGVkIGV4cG9ydCBleHRlcm4gZmluYWwgZmluYWxseSBmdW5jdGlvbiBnb3RvIGltbXV0YWJsZSAiICsKICAgICAgICAgICAgICAgICAgICAiaW1wb3J0IGlub3V0IGludmFyaWFudCBpcyBsYXp5IG1hY3JvIG1vZHVsZSBuZXcgbm90aHJvdyBvdmVycmlkZSBwYWNrYWdlIHByYWdtYSBwcml2YXRlICIgKwogICAgICAgICAgICAgICAgICAgICJwcm90ZWN0ZWQgcHVibGljIHB1cmUgcmVmIHJldHVybiBzaGFyZWQgc2hvcnQgc3RhdGljIHN1cGVyIHN5bmNocm9uaXplZCB0ZW1wbGF0ZSB0aGlzICIgKwogICAgICAgICAgICAgICAgICAgICJ0aHJvdyB0eXBlZGVmIHR5cGVpZCB0eXBlb2Ygdm9sYXRpbGUgX19GSUxFX18gX19MSU5FX18gX19nc2hhcmVkIF9fdHJhaXRzIF9fdmVjdG9yIF9fcGFyYW1ldGVycyAiICsKICAgICAgICAgICAgICAgICAgICBibG9ja0tleXdvcmRzKSwKICAgIGJsb2NrS2V5d29yZHM6IHdvcmRzKGJsb2NrS2V5d29yZHMpLAogICAgYnVpbHRpbjogd29yZHMoImJvb2wgYnl0ZSBjaGFyIGNyZWFsIGRjaGFyIGRvdWJsZSBmbG9hdCBpZG91YmxlIGlmbG9hdCBpbnQgaXJlYWwgbG9uZyByZWFsIHNob3J0IHVieXRlICIgKwogICAgICAgICAgICAgICAgICAgInVjZW50IHVpbnQgdWxvbmcgdXNob3J0IHdjaGFyIHdzdHJpbmcgdm9pZCBzaXplX3Qgc2l6ZWRpZmZfdCIpLAogICAgYXRvbXM6IHdvcmRzKCJleGl0IGZhaWx1cmUgc3VjY2VzcyB0cnVlIGZhbHNlIG51bGwiKSwKICAgIGhvb2tzOiB7CiAgICAgICJAIjogZnVuY3Rpb24oc3RyZWFtLCBfc3RhdGUpIHsKICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcd1wkX10vKTsKICAgICAgICByZXR1cm4gIm1ldGEiOwogICAgICB9CiAgICB9CiAgfSk7Cgp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/d/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogRCBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uLy4uL2FkZG9uL2VkaXQvbWF0Y2hicmFja2V0cy5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJkLmpzIj48L3NjcmlwdD4KPHN0eWxlPi5Db2RlTWlycm9yIHtib3JkZXI6IDJweCBpbnNldCAjZGVlO308L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxoMT5Db2RlTWlycm9yPC9oMT48aW1nIGlkPWxvZ28gc3JjPSIuLi8uLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5MYW5ndWFnZSBtb2RlczwvYT4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+RDwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+RCBtb2RlPC9oMj4KPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KLyogRCBkZW1vIGNvZGUgLy8gY29waWVkIGZyb20gcGhvYm9zL3NkL21ldGFzdHJpbmdzLmQgKi8KLy8gV3JpdHRlbiBpbiB0aGUgRCBwcm9ncmFtbWluZyBsYW5ndWFnZS4KCi8qKgpUZW1wbGF0ZXMgd2l0aCB3aGljaCB0byBkbyBjb21waWxlLXRpbWUgbWFuaXB1bGF0aW9uIG9mIHN0cmluZ3MuCgpNYWNyb3M6CiBXSUtJID0gUGhvYm9zL1N0ZE1ldGFzdHJpbmdzCgpDb3B5cmlnaHQ6IENvcHlyaWdodCBEaWdpdGFsIE1hcnMgMjAwNyAtIDIwMDkuCkxpY2Vuc2U6ICAgPGEgaHJlZj0iaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0Ij5Cb29zdCBMaWNlbnNlIDEuMDwvYT4uCkF1dGhvcnM6ICAgJChXRUIgZGlnaXRhbG1hcnMuY29tLCBXYWx0ZXIgQnJpZ2h0KSwKICAgICAgICAgICBEb24gQ2x1Z3N0b24KU291cmNlOiAgICAkKFBIT0JPU1NSQyBzdGQvX21ldGFzdHJpbmdzLmQpCiovCi8qCiAgICAgICAgIENvcHlyaWdodCBEaWdpdGFsIE1hcnMgMjAwNyAtIDIwMDkuCkRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBCb29zdCBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMC4KICAgKFNlZSBhY2NvbXBhbnlpbmcgZmlsZSBMSUNFTlNFXzFfMC50eHQgb3IgY29weSBhdAogICAgICAgICBodHRwOi8vd3d3LmJvb3N0Lm9yZy9MSUNFTlNFXzFfMC50eHQpCiAqLwptb2R1bGUgc3RkLm1ldGFzdHJpbmdzOwoKLyoqCkZvcm1hdHMgY29uc3RhbnRzIGludG8gYSBzdHJpbmcgYXQgY29tcGlsZSB0aW1lLiAgQW5hbG9nb3VzIHRvICQoWFJFRgpzdHJpbmcsZm9ybWF0KS4KClBhcmFtZXRlcnM6CgpBID0gdHVwbGUgb2YgY29uc3RhbnRzLCB3aGljaCBjYW4gYmUgc3RyaW5ncywgY2hhcmFjdGVycywgb3IgaW50ZWdyYWwKICAgIHZhbHVlcy4KCkZvcm1hdHM6CiAqICAgIFRoZSBmb3JtYXRzIHN1cHBvcnRlZCBhcmUgJXMgZm9yIHN0cmluZ3MsIGFuZCAlJQogKiAgICBmb3IgdGhlICUgY2hhcmFjdGVyLgpFeGFtcGxlOgotLS0KaW1wb3J0IHN0ZC5tZXRhc3RyaW5nczsKaW1wb3J0IHN0ZC5zdGRpbzsKCnZvaWQgbWFpbigpCnsKICBzdHJpbmcgcyA9IEZvcm1hdCEoIkFyZyAlcyA9ICVzIiwgImZvbyIsIDI3KTsKICB3cml0ZWZsbihzKTsgLy8gIkFyZyBmb28gPSAyNyIKfQogKiAtLS0KICovCgp0ZW1wbGF0ZSBGb3JtYXQoQS4uLikKewogICAgc3RhdGljIGlmIChBLmxlbmd0aCA9PSAwKQogICAgICAgIGVudW0gRm9ybWF0ID0gIiI7CiAgICBlbHNlIHN0YXRpYyBpZiAoaXModHlwZW9mKEFbMF0pIDogY29uc3QoY2hhcilbXSkpCiAgICAgICAgZW51bSBGb3JtYXQgPSBGb3JtYXRTdHJpbmchKEFbMF0sIEFbMS4uJF0pOwogICAgZWxzZQogICAgICAgIGVudW0gRm9ybWF0ID0gdG9TdHJpbmdOb3chKEFbMF0pIH4gRm9ybWF0IShBWzEuLiRdKTsKfQoKdGVtcGxhdGUgRm9ybWF0U3RyaW5nKGNvbnN0KGNoYXIpW10gRiwgQS4uLikKewogICAgc3RhdGljIGlmIChGLmxlbmd0aCA9PSAwKQogICAgICAgIGVudW0gRm9ybWF0U3RyaW5nID0gRm9ybWF0IShBKTsKICAgIGVsc2Ugc3RhdGljIGlmIChGLmxlbmd0aCA9PSAxKQogICAgICAgIGVudW0gRm9ybWF0U3RyaW5nID0gRlswXSB+IEZvcm1hdCEoQSk7CiAgICBlbHNlIHN0YXRpYyBpZiAoRlswLi4yXSA9PSAiJXMiKQogICAgICAgIGVudW0gRm9ybWF0U3RyaW5nCiAgICAgICAgICAgID0gdG9TdHJpbmdOb3chKEFbMF0pIH4gRm9ybWF0U3RyaW5nIShGWzIuLiRdLEFbMS4uJF0pOwogICAgZWxzZSBzdGF0aWMgaWYgKEZbMC4uMl0gPT0gIiUlIikKICAgICAgICBlbnVtIEZvcm1hdFN0cmluZyA9ICIlIiB+IEZvcm1hdFN0cmluZyEoRlsyLi4kXSxBKTsKICAgIGVsc2UKICAgIHsKICAgICAgICBzdGF0aWMgYXNzZXJ0KEZbMF0gIT0gJyUnLCAidW5yZWNvZ25pemVkIGZvcm1hdCAlIiB+IEZbMV0pOwogICAgICAgIGVudW0gRm9ybWF0U3RyaW5nID0gRlswXSB+IEZvcm1hdFN0cmluZyEoRlsxLi4kXSxBKTsKICAgIH0KfQoKdW5pdHRlc3QKewogICAgYXV0byBzID0gRm9ybWF0ISgiaGVsJXNsbyIsICJ3b3JsZCIsIC0xMzgsICdjJywgdHJ1ZSk7CiAgICBhc3NlcnQocyA9PSAiaGVsd29ybGRsby0xMzhjdHJ1ZSIsICJbIiB+IHMgfiAiXSIpOwp9CgovKioKICogQ29udmVydCBjb25zdGFudCBhcmd1bWVudCB0byBhIHN0cmluZy4KICovCgp0ZW1wbGF0ZSB0b1N0cmluZ05vdyh1bG9uZyB2KQp7CiAgICBzdGF0aWMgaWYgKHYgPCAxMCkKICAgICAgICBlbnVtIHRvU3RyaW5nTm93ID0gIiIgfiBjYXN0KGNoYXIpKHYgKyAnMCcpOwogICAgZWxzZQogICAgICAgIGVudW0gdG9TdHJpbmdOb3cgPSB0b1N0cmluZ05vdyEodiAvIDEwKSB+IHRvU3RyaW5nTm93ISh2ICUgMTApOwp9Cgp1bml0dGVzdAp7CiAgICBzdGF0aWMgYXNzZXJ0KHRvU3RyaW5nTm93ISgxdUwgPDwgNjIpID09ICI0NjExNjg2MDE4NDI3Mzg3OTA0Iik7Cn0KCi8vLyBkaXR0bwp0ZW1wbGF0ZSB0b1N0cmluZ05vdyhsb25nIHYpCnsKICAgIHN0YXRpYyBpZiAodiA8IDApCiAgICAgICAgZW51bSB0b1N0cmluZ05vdyA9ICItIiB+IHRvU3RyaW5nTm93IShjYXN0KHVsb25nKSAtdik7CiAgICBlbHNlCiAgICAgICAgZW51bSB0b1N0cmluZ05vdyA9IHRvU3RyaW5nTm93IShjYXN0KHVsb25nKSB2KTsKfQoKdW5pdHRlc3QKewogICAgc3RhdGljIGFzc2VydCh0b1N0cmluZ05vdyEoMHgxMDAwMDAwMDApID09ICI0Mjk0OTY3Mjk2Iik7CiAgICBzdGF0aWMgYXNzZXJ0KHRvU3RyaW5nTm93ISgtMTM4TCkgPT0gIi0xMzgiKTsKfQoKLy8vIGRpdHRvCnRlbXBsYXRlIHRvU3RyaW5nTm93KHVpbnQgVSkKewogICAgZW51bSB0b1N0cmluZ05vdyA9IHRvU3RyaW5nTm93IShjYXN0KHVsb25nKVUpOwp9CgovLy8gZGl0dG8KdGVtcGxhdGUgdG9TdHJpbmdOb3coaW50IEkpCnsKICAgIGVudW0gdG9TdHJpbmdOb3cgPSB0b1N0cmluZ05vdyEoY2FzdChsb25nKUkpOwp9CgovLy8gZGl0dG8KdGVtcGxhdGUgdG9TdHJpbmdOb3coYm9vbCBCKQp7CiAgICBlbnVtIHRvU3RyaW5nTm93ID0gQiA/ICJ0cnVlIiA6ICJmYWxzZSI7Cn0KCi8vLyBkaXR0bwp0ZW1wbGF0ZSB0b1N0cmluZ05vdyhzdHJpbmcgUykKewogICAgZW51bSB0b1N0cmluZ05vdyA9IFM7Cn0KCi8vLyBkaXR0bwp0ZW1wbGF0ZSB0b1N0cmluZ05vdyhjaGFyIEMpCnsKICAgIGVudW0gdG9TdHJpbmdOb3cgPSAiIiB+IEM7Cn0KCgovKioqKioqKioKICogUGFyc2UgdW5zaWduZWQgaW50ZWdlciBsaXRlcmFsIGZyb20gdGhlIHN0YXJ0IG9mIHN0cmluZyBzLgogKiByZXR1cm5zOgogKiAgICAudmFsdWUgPSB0aGUgaW50ZWdlciBsaXRlcmFsIGFzIGEgc3RyaW5nLAogKiAgICAucmVzdCA9IHRoZSBzdHJpbmcgZm9sbG93aW5nIHRoZSBpbnRlZ2VyIGxpdGVyYWwKICogT3RoZXJ3aXNlOgogKiAgICAudmFsdWUgPSBudWxsLAogKiAgICAucmVzdCA9IHMKICovCgp0ZW1wbGF0ZSBwYXJzZVVpbnRlZ2VyKGNvbnN0KGNoYXIpW10gcykKewogICAgc3RhdGljIGlmIChzLmxlbmd0aCA9PSAwKQogICAgewogICAgICAgIGVudW0gdmFsdWUgPSAiIjsKICAgICAgICBlbnVtIHJlc3QgPSAiIjsKICAgIH0KICAgIGVsc2Ugc3RhdGljIGlmIChzWzBdID49ICcwJyAmJiBzWzBdIDw9ICc5JykKICAgIHsKICAgICAgICBlbnVtIHZhbHVlID0gc1swXSB+IHBhcnNlVWludGVnZXIhKHNbMS4uJF0pLnZhbHVlOwogICAgICAgIGVudW0gcmVzdCA9IHBhcnNlVWludGVnZXIhKHNbMS4uJF0pLnJlc3Q7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgZW51bSB2YWx1ZSA9ICIiOwogICAgICAgIGVudW0gcmVzdCA9IHM7CiAgICB9Cn0KCi8qKioqKioqKgpQYXJzZSBpbnRlZ2VyIGxpdGVyYWwgb3B0aW9uYWxseSBwcmVjZWRlZCBieSAkKEQgJy0nKSBmcm9tIHRoZSBzdGFydApvZiBzdHJpbmcgJChEIHMpLgoKUmV0dXJuczoKICAgLnZhbHVlID0gdGhlIGludGVnZXIgbGl0ZXJhbCBhcyBhIHN0cmluZywKICAgLnJlc3QgPSB0aGUgc3RyaW5nIGZvbGxvd2luZyB0aGUgaW50ZWdlciBsaXRlcmFsCgpPdGhlcndpc2U6CiAgIC52YWx1ZSA9IG51bGwsCiAgIC5yZXN0ID0gcwoqLwoKdGVtcGxhdGUgcGFyc2VJbnRlZ2VyKGNvbnN0KGNoYXIpW10gcykKewogICAgc3RhdGljIGlmIChzLmxlbmd0aCA9PSAwKQogICAgewogICAgICAgIGVudW0gdmFsdWUgPSAiIjsKICAgICAgICBlbnVtIHJlc3QgPSAiIjsKICAgIH0KICAgIGVsc2Ugc3RhdGljIGlmIChzWzBdID49ICcwJyAmJiBzWzBdIDw9ICc5JykKICAgIHsKICAgICAgICBlbnVtIHZhbHVlID0gc1swXSB+IHBhcnNlVWludGVnZXIhKHNbMS4uJF0pLnZhbHVlOwogICAgICAgIGVudW0gcmVzdCA9IHBhcnNlVWludGVnZXIhKHNbMS4uJF0pLnJlc3Q7CiAgICB9CiAgICBlbHNlIHN0YXRpYyBpZiAocy5sZW5ndGggPj0gMiAmJgogICAgICAgICAgICBzWzBdID09ICctJyAmJiBzWzFdID49ICcwJyAmJiBzWzFdIDw9ICc5JykKICAgIHsKICAgICAgICBlbnVtIHZhbHVlID0gc1swLi4yXSB+IHBhcnNlVWludGVnZXIhKHNbMi4uJF0pLnZhbHVlOwogICAgICAgIGVudW0gcmVzdCA9IHBhcnNlVWludGVnZXIhKHNbMi4uJF0pLnJlc3Q7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgZW51bSB2YWx1ZSA9ICIiOwogICAgICAgIGVudW0gcmVzdCA9IHM7CiAgICB9Cn0KCnVuaXR0ZXN0CnsKICAgIGFzc2VydChwYXJzZVVpbnRlZ2VyISgiMTIzNGFiYyIpLnZhbHVlID09ICIxMjM0Iik7CiAgICBhc3NlcnQocGFyc2VVaW50ZWdlciEoIjEyMzRhYmMiKS5yZXN0ID09ICJhYmMiKTsKICAgIGFzc2VydChwYXJzZUludGVnZXIhKCItMTIzNGFiYyIpLnZhbHVlID09ICItMTIzNCIpOwogICAgYXNzZXJ0KHBhcnNlSW50ZWdlciEoIi0xMjM0YWJjIikucmVzdCA9PSAiYWJjIik7Cn0KCi8qKgpEZXByZWNhdGVkIGFsaWFzZXMgaGVsZCBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KKi8KZGVwcmVjYXRlZCBhbGlhcyB0b1N0cmluZ05vdyBUb1N0cmluZzsKLy8vIERpdHRvCmRlcHJlY2F0ZWQgYWxpYXMgcGFyc2VVaW50ZWdlciBQYXJzZVVpbnRlZ2VyOwovLy8gRGl0dG8KZGVwcmVjYXRlZCBhbGlhcyBwYXJzZVVpbnRlZ2VyIFBhcnNlSW50ZWdlcjsKCjwvdGV4dGFyZWE+PC9mb3JtPgoKICAgIDxzY3JpcHQ+CiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICAgICAgbGluZU51bWJlcnM6IHRydWUsCiAgICAgICAgbWF0Y2hCcmFja2V0czogdHJ1ZSwKICAgICAgICBpbmRlbnRVbml0OiA0LAogICAgICAgIG1vZGU6ICJ0ZXh0L3gtZCIKICAgICAgfSk7CiAgICA8L3NjcmlwdD4KCiAgICA8cD5TaW1wbGUgbW9kZSB0aGF0IGhhbmRsZSBELVN5bnRheCAoPGEgaHJlZj0iaHR0cDovL3d3dy5kbGFuZy5vcmciPkRMYW5nIEhvbWVwYWdlPC9hPikuPC9wPgoKICAgIDxwPjxzdHJvbmc+TUlNRSB0eXBlcyBkZWZpbmVkOjwvc3Ryb25nPiA8Y29kZT50ZXh0L3gtZDwvY29kZT4KICAgIC48L3A+CiAgPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/dart/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/dart/dart.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSwgcmVxdWlyZSgiLi4vY2xpa2UvY2xpa2UiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiLCAiLi4vY2xpa2UvY2xpa2UiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CgogIHZhciBrZXl3b3JkcyA9ICgidGhpcyBzdXBlciBzdGF0aWMgZmluYWwgY29uc3QgYWJzdHJhY3QgY2xhc3MgZXh0ZW5kcyBleHRlcm5hbCBmYWN0b3J5ICIgKwogICAgImltcGxlbWVudHMgZ2V0IG5hdGl2ZSBvcGVyYXRvciBzZXQgdHlwZWRlZiB3aXRoIGVudW0gdGhyb3cgcmV0aHJvdyAiICsKICAgICJhc3NlcnQgYnJlYWsgY2FzZSBjb250aW51ZSBkZWZhdWx0IGluIHJldHVybiBuZXcgZGVmZXJyZWQgYXN5bmMgYXdhaXQgIiArCiAgICAidHJ5IGNhdGNoIGZpbmFsbHkgZG8gZWxzZSBmb3IgaWYgc3dpdGNoIHdoaWxlIGltcG9ydCBsaWJyYXJ5IGV4cG9ydCAiICsKICAgICJwYXJ0IG9mIHNob3cgaGlkZSBpcyBhcyIpLnNwbGl0KCIgIik7CiAgdmFyIGJsb2NrS2V5d29yZHMgPSAidHJ5IGNhdGNoIGZpbmFsbHkgZG8gZWxzZSBmb3IgaWYgc3dpdGNoIHdoaWxlIi5zcGxpdCgiICIpOwogIHZhciBhdG9tcyA9ICJ0cnVlIGZhbHNlIG51bGwiLnNwbGl0KCIgIik7CiAgdmFyIGJ1aWx0aW5zID0gInZvaWQgYm9vbCBudW0gaW50IGRvdWJsZSBkeW5hbWljIHZhciBTdHJpbmciLnNwbGl0KCIgIik7CgogIGZ1bmN0aW9uIHNldCh3b3JkcykgewogICAgdmFyIG9iaiA9IHt9OwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB3b3Jkcy5sZW5ndGg7ICsraSkgb2JqW3dvcmRzW2ldXSA9IHRydWU7CiAgICByZXR1cm4gb2JqOwogIH0KCiAgZnVuY3Rpb24gcHVzaEludGVycG9sYXRpb25TdGFjayhzdGF0ZSkgewogICAgKHN0YXRlLmludGVycG9sYXRpb25TdGFjayB8fCAoc3RhdGUuaW50ZXJwb2xhdGlvblN0YWNrID0gW10pKS5wdXNoKHN0YXRlLnRva2VuaXplKTsKICB9CgogIGZ1bmN0aW9uIHBvcEludGVycG9sYXRpb25TdGFjayhzdGF0ZSkgewogICAgcmV0dXJuIChzdGF0ZS5pbnRlcnBvbGF0aW9uU3RhY2sgfHwgKHN0YXRlLmludGVycG9sYXRpb25TdGFjayA9IFtdKSkucG9wKCk7CiAgfQoKICBmdW5jdGlvbiBzaXplSW50ZXJwb2xhdGlvblN0YWNrKHN0YXRlKSB7CiAgICByZXR1cm4gc3RhdGUuaW50ZXJwb2xhdGlvblN0YWNrID8gc3RhdGUuaW50ZXJwb2xhdGlvblN0YWNrLmxlbmd0aCA6IDA7CiAgfQoKICBDb2RlTWlycm9yLmRlZmluZU1JTUUoImFwcGxpY2F0aW9uL2RhcnQiLCB7CiAgICBuYW1lOiAiY2xpa2UiLAogICAga2V5d29yZHM6IHNldChrZXl3b3JkcyksCiAgICBibG9ja0tleXdvcmRzOiBzZXQoYmxvY2tLZXl3b3JkcyksCiAgICBidWlsdGluOiBzZXQoYnVpbHRpbnMpLAogICAgYXRvbXM6IHNldChhdG9tcyksCiAgICBob29rczogewogICAgICAiQCI6IGZ1bmN0aW9uKHN0cmVhbSkgewogICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1x3XCRfXC5dLyk7CiAgICAgICAgcmV0dXJuICJtZXRhIjsKICAgICAgfSwKCiAgICAgIC8vIGN1c3RvbSBzdHJpbmcgaGFuZGxpbmcgdG8gZGVhbCB3aXRoIHRyaXBsZS1xdW90ZWQgc3RyaW5ncyBhbmQgc3RyaW5nIGludGVycG9sYXRpb24KICAgICAgIiciOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgICAgcmV0dXJuIHRva2VuU3RyaW5nKCInIiwgc3RyZWFtLCBzdGF0ZSwgZmFsc2UpOwogICAgICB9LAogICAgICAiXCIiOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgICAgcmV0dXJuIHRva2VuU3RyaW5nKCJcIiIsIHN0cmVhbSwgc3RhdGUsIGZhbHNlKTsKICAgICAgfSwKICAgICAgInIiOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgICAgdmFyIHBlZWsgPSBzdHJlYW0ucGVlaygpOwogICAgICAgIGlmIChwZWVrID09ICInIiB8fCBwZWVrID09ICJcIiIpIHsKICAgICAgICAgIHJldHVybiB0b2tlblN0cmluZyhzdHJlYW0ubmV4dCgpLCBzdHJlYW0sIHN0YXRlLCB0cnVlKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9LAoKICAgICAgIn0iOiBmdW5jdGlvbihfc3RyZWFtLCBzdGF0ZSkgewogICAgICAgIC8vICJ9IiBpcyBlbmQgb2YgaW50ZXJwb2xhdGlvbiwgaWYgaW50ZXJwb2xhdGlvbiBzdGFjayBpcyBub24tZW1wdHkKICAgICAgICBpZiAoc2l6ZUludGVycG9sYXRpb25TdGFjayhzdGF0ZSkgPiAwKSB7CiAgICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHBvcEludGVycG9sYXRpb25TdGFjayhzdGF0ZSk7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9LAoKICAgICAgIi8iOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgICAgaWYgKCFzdHJlYW0uZWF0KCIqIikpIHJldHVybiBmYWxzZQogICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5OZXN0ZWRDb21tZW50KDEpCiAgICAgICAgcmV0dXJuIHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpCiAgICAgIH0KICAgIH0KICB9KTsKCiAgZnVuY3Rpb24gdG9rZW5TdHJpbmcocXVvdGUsIHN0cmVhbSwgc3RhdGUsIHJhdykgewogICAgdmFyIHRyaXBsZVF1b3RlZCA9IGZhbHNlOwogICAgaWYgKHN0cmVhbS5lYXQocXVvdGUpKSB7CiAgICAgIGlmIChzdHJlYW0uZWF0KHF1b3RlKSkgdHJpcGxlUXVvdGVkID0gdHJ1ZTsKICAgICAgZWxzZSByZXR1cm4gInN0cmluZyI7IC8vZW1wdHkgc3RyaW5nCiAgICB9CiAgICBmdW5jdGlvbiB0b2tlblN0cmluZ0hlbHBlcihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHZhciBlc2NhcGVkID0gZmFsc2U7CiAgICAgIHdoaWxlICghc3RyZWFtLmVvbCgpKSB7CiAgICAgICAgaWYgKCFyYXcgJiYgIWVzY2FwZWQgJiYgc3RyZWFtLnBlZWsoKSA9PSAiJCIpIHsKICAgICAgICAgIHB1c2hJbnRlcnBvbGF0aW9uU3RhY2soc3RhdGUpOwogICAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkludGVycG9sYXRpb247CiAgICAgICAgICByZXR1cm4gInN0cmluZyI7CiAgICAgICAgfQogICAgICAgIHZhciBuZXh0ID0gc3RyZWFtLm5leHQoKTsKICAgICAgICBpZiAobmV4dCA9PSBxdW90ZSAmJiAhZXNjYXBlZCAmJiAoIXRyaXBsZVF1b3RlZCB8fCBzdHJlYW0ubWF0Y2gocXVvdGUgKyBxdW90ZSkpKSB7CiAgICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IG51bGw7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgZXNjYXBlZCA9ICFyYXcgJiYgIWVzY2FwZWQgJiYgbmV4dCA9PSAiXFwiOwogICAgICB9CiAgICAgIHJldHVybiAic3RyaW5nIjsKICAgIH0KICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5TdHJpbmdIZWxwZXI7CiAgICByZXR1cm4gdG9rZW5TdHJpbmdIZWxwZXIoc3RyZWFtLCBzdGF0ZSk7CiAgfQoKICBmdW5jdGlvbiB0b2tlbkludGVycG9sYXRpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgc3RyZWFtLmVhdCgiJCIpOwogICAgaWYgKHN0cmVhbS5lYXQoInsiKSkgewogICAgICAvLyBsZXQgY2xpa2UgaGFuZGxlIHRoZSBjb250ZW50IG9mICR7Li4ufSwKICAgICAgLy8gd2UgdGFrZSBvdmVyIGFnYWluIHdoZW4gIn0iIGFwcGVhcnMgKHNlZSBob29rcykuCiAgICAgIHN0YXRlLnRva2VuaXplID0gbnVsbDsKICAgIH0gZWxzZSB7CiAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5JbnRlcnBvbGF0aW9uSWRlbnRpZmllcjsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH0KCiAgZnVuY3Rpb24gdG9rZW5JbnRlcnBvbGF0aW9uSWRlbnRpZmllcihzdHJlYW0sIHN0YXRlKSB7CiAgICBzdHJlYW0uZWF0V2hpbGUoL1tcd19dLyk7CiAgICBzdGF0ZS50b2tlbml6ZSA9IHBvcEludGVycG9sYXRpb25TdGFjayhzdGF0ZSk7CiAgICByZXR1cm4gInZhcmlhYmxlIjsKICB9CgogIGZ1bmN0aW9uIHRva2VuTmVzdGVkQ29tbWVudChkZXB0aCkgewogICAgcmV0dXJuIGZ1bmN0aW9uIChzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHZhciBjaAogICAgICB3aGlsZSAoY2ggPSBzdHJlYW0ubmV4dCgpKSB7CiAgICAgICAgaWYgKGNoID09ICIqIiAmJiBzdHJlYW0uZWF0KCIvIikpIHsKICAgICAgICAgIGlmIChkZXB0aCA9PSAxKSB7CiAgICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gbnVsbAogICAgICAgICAgICBicmVhawogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbk5lc3RlZENvbW1lbnQoZGVwdGggLSAxKQogICAgICAgICAgICByZXR1cm4gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSkKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKGNoID09ICIvIiAmJiBzdHJlYW0uZWF0KCIqIikpIHsKICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5OZXN0ZWRDb21tZW50KGRlcHRoICsgMSkKICAgICAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKQogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gImNvbW1lbnQiCiAgICB9CiAgfQoKICBDb2RlTWlycm9yLnJlZ2lzdGVySGVscGVyKCJoaW50V29yZHMiLCAiYXBwbGljYXRpb24vZGFydCIsIGtleXdvcmRzLmNvbmNhdChhdG9tcykuY29uY2F0KGJ1aWx0aW5zKSk7CgogIC8vIFRoaXMgaXMgbmVlZGVkIHRvIG1ha2UgbG9hZGluZyB0aHJvdWdoIG1ldGEuanMgd29yay4KICBDb2RlTWlycm9yLmRlZmluZU1vZGUoImRhcnQiLCBmdW5jdGlvbihjb25mKSB7CiAgICByZXR1cm4gQ29kZU1pcnJvci5nZXRNb2RlKGNvbmYsICJhcHBsaWNhdGlvbi9kYXJ0Iik7CiAgfSwgImNsaWtlIik7Cn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/dart/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogRGFydCBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vY2xpa2UvY2xpa2UuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iZGFydC5qcyI+PC9zY3JpcHQ+CjxzdHlsZT4uQ29kZU1pcnJvciB7Ym9yZGVyOiAxcHggc29saWQgI2RlZTt9PC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aDE+Q29kZU1pcnJvcjwvaDE+PGltZyBpZD1sb2dvIHNyYz0iLi4vLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+TGFuZ3VhZ2UgbW9kZXM8L2E+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPkRhcnQ8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPkRhcnQgbW9kZTwvaDI+Cjxmb3JtPgo8dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgppbXBvcnQgJ2RhcnQ6bWF0aCcgc2hvdyBSYW5kb207Cgp2b2lkIG1haW4oKSB7CiAgcHJpbnQobmV3IERpZShuOiAxMikucm9sbCgpKTsKfQoKLy8gRGVmaW5lIGEgY2xhc3MuCmNsYXNzIERpZSB7CiAgLy8gRGVmaW5lIGEgY2xhc3MgdmFyaWFibGUuCiAgc3RhdGljIFJhbmRvbSBzaGFrZXIgPSBuZXcgUmFuZG9tKCk7CgogIC8vIERlZmluZSBpbnN0YW5jZSB2YXJpYWJsZXMuCiAgaW50IHNpZGVzLCB2YWx1ZTsKCiAgLy8gRGVmaW5lIGEgbWV0aG9kIHVzaW5nIHNob3J0aGFuZCBzeW50YXguCiAgU3RyaW5nIHRvU3RyaW5nKCkgPT4gJyR2YWx1ZSc7CgogIC8vIERlZmluZSBhIGNvbnN0cnVjdG9yLgogIERpZSh7aW50IG46IDZ9KSB7CiAgICBpZiAoNCA8PSBuICYmIG4gPD0gMjApIHsKICAgICAgc2lkZXMgPSBuOwogICAgfSBlbHNlIHsKICAgICAgLy8gU3VwcG9ydCBmb3IgZXJyb3JzIGFuZCBleGNlcHRpb25zLgogICAgICB0aHJvdyBuZXcgQXJndW1lbnRFcnJvcigvKiAqLyk7CiAgICB9CiAgfQoKICAvLyBEZWZpbmUgYW4gaW5zdGFuY2UgbWV0aG9kLgogIGludCByb2xsKCkgewogICAgcmV0dXJuIHZhbHVlID0gc2hha2VyLm5leHRJbnQoc2lkZXMpICsgMTsKICB9Cn0KPC90ZXh0YXJlYT4KPC9mb3JtPgoKPHNjcmlwdD4KICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgbGluZU51bWJlcnM6IHRydWUsCiAgICBtb2RlOiAiYXBwbGljYXRpb24vZGFydCIKICB9KTsKPC9zY3JpcHQ+Cgo8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/diff/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/diff/diff.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJkaWZmIiwgZnVuY3Rpb24oKSB7CgogIHZhciBUT0tFTl9OQU1FUyA9IHsKICAgICcrJzogJ3Bvc2l0aXZlJywKICAgICctJzogJ25lZ2F0aXZlJywKICAgICdAJzogJ21ldGEnCiAgfTsKCiAgcmV0dXJuIHsKICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0pIHsKICAgICAgdmFyIHR3X3BvcyA9IHN0cmVhbS5zdHJpbmcuc2VhcmNoKC9bXHQgXSs/JC8pOwoKICAgICAgaWYgKCFzdHJlYW0uc29sKCkgfHwgdHdfcG9zID09PSAwKSB7CiAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICAgIHJldHVybiAoImVycm9yICIgKyAoCiAgICAgICAgICBUT0tFTl9OQU1FU1tzdHJlYW0uc3RyaW5nLmNoYXJBdCgwKV0gfHwgJycpKS5yZXBsYWNlKC8gJC8sICcnKTsKICAgICAgfQoKICAgICAgdmFyIHRva2VuX25hbWUgPSBUT0tFTl9OQU1FU1tzdHJlYW0ucGVlaygpXSB8fCBzdHJlYW0uc2tpcFRvRW5kKCk7CgogICAgICBpZiAodHdfcG9zID09PSAtMSkgewogICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzdHJlYW0ucG9zID0gdHdfcG9zOwogICAgICB9CgogICAgICByZXR1cm4gdG9rZW5fbmFtZTsKICAgIH0KICB9Owp9KTsKCkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC94LWRpZmYiLCAiZGlmZiIpOwoKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/diff/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogRGlmZiBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9ImRpZmYuanMiPjwvc2NyaXB0Pgo8c3R5bGU+CiAgICAgIC5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgI2RkZDsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkZGQ7fQogICAgICBzcGFuLmNtLW1ldGEge2NvbG9yOiAjYTBiICFpbXBvcnRhbnQ7fQogICAgICBzcGFuLmNtLWVycm9yIHsgYmFja2dyb3VuZC1jb2xvcjogYmxhY2s7IG9wYWNpdHk6IDAuNDt9CiAgICAgIHNwYW4uY20tZXJyb3IuY20tc3RyaW5nIHsgYmFja2dyb3VuZC1jb2xvcjogcmVkOyB9CiAgICAgIHNwYW4uY20tZXJyb3IuY20tdGFnIHsgYmFja2dyb3VuZC1jb2xvcjogIzJiMjsgfQogICAgPC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aDE+Q29kZU1pcnJvcjwvaDE+PGltZyBpZD1sb2dvIHNyYz0iLi4vLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+TGFuZ3VhZ2UgbW9kZXM8L2E+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPkRpZmY8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPkRpZmYgbW9kZTwvaDI+Cjxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+CmRpZmYgLS1naXQgYS9pbmRleC5odG1sIGIvaW5kZXguaHRtbAppbmRleCBjMWQ5MTU2Li43NzY0NzQ0IDEwMDY0NAotLS0gYS9pbmRleC5odG1sCisrKyBiL2luZGV4Lmh0bWwKQEAgLTk1LDcgKzk1LDggQEAgU3RyaW5nU3RyZWFtLnByb3RvdHlwZSA9IHsKICAgICA8c2NyaXB0PgogICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICAgbGluZU51bWJlcnM6IHRydWUsCi0gICAgICAgIGF1dG9NYXRjaEJyYWNrZXRzOiB0cnVlCisgICAgICAgIGF1dG9NYXRjaEJyYWNrZXRzOiB0cnVlLAorICAgICAgb25HdXR0ZXJDbGljazogZnVuY3Rpb24oeCl7Y29uc29sZS5sb2coeCk7fQogICAgICAgfSk7CiAgICAgPC9zY3JpcHQ+CiAgIDwvYm9keT4KZGlmZiAtLWdpdCBhL2xpYi9jb2RlbWlycm9yLmpzIGIvbGliL2NvZGVtaXJyb3IuanMKaW5kZXggMDQ2NDZhOS4uOWEzOWNjNyAxMDA2NDQKLS0tIGEvbGliL2NvZGVtaXJyb3IuanMKKysrIGIvbGliL2NvZGVtaXJyb3IuanMKQEAgLTM5OSwxMCArMzk5LDE2IEBAIHZhciBDb2RlTWlycm9yID0gKGZ1bmN0aW9uKCkgewogICAgIH0KIAogICAgIGZ1bmN0aW9uIG9uTW91c2VEb3duKGUpIHsKLSAgICAgIHZhciBzdGFydCA9IHBvc0Zyb21Nb3VzZShlKSwgbGFzdCA9IHN0YXJ0OyAgICAKKyAgICAgIHZhciBzdGFydCA9IHBvc0Zyb21Nb3VzZShlKSwgbGFzdCA9IHN0YXJ0LCB0YXJnZXQgPSBlLnRhcmdldCgpOwogICAgICAgaWYgKCFzdGFydCkgcmV0dXJuOwogICAgICAgc2V0Q3Vyc29yKHN0YXJ0LmxpbmUsIHN0YXJ0LmNoLCBmYWxzZSk7CiAgICAgICBpZiAoZS5idXR0b24oKSAhPSAxKSByZXR1cm47CisgICAgICBpZiAodGFyZ2V0LnBhcmVudE5vZGUgPT0gZ3V0dGVyKSB7ICAgIAorICAgICAgICBpZiAob3B0aW9ucy5vbkd1dHRlckNsaWNrKQorICAgICAgICAgIG9wdGlvbnMub25HdXR0ZXJDbGljayhpbmRleE9mKGd1dHRlci5jaGlsZE5vZGVzLCB0YXJnZXQpICsgc2hvd2luZ0Zyb20pOworICAgICAgICByZXR1cm47CisgICAgICB9CisKICAgICAgIGlmICghZm9jdXNlZCkgb25Gb2N1cygpOwogCiAgICAgICBlLnN0b3AoKTsKQEAgLTgwOCw3ICs4MTQsNyBAQCB2YXIgQ29kZU1pcnJvciA9IChmdW5jdGlvbigpIHsKICAgICAgIGZvciAodmFyIGkgPSBzaG93aW5nRnJvbTsgaSA8IHNob3dpbmdUbzsgKytpKSB7CiAgICAgICAgIHZhciBtYXJrZXIgPSBsaW5lc1tpXS5ndXR0ZXJNYXJrZXI7CiAgICAgICAgIGlmIChtYXJrZXIpIGh0bWwucHVzaCgnPGRpdiBjbGFzcz0iJyArIG1hcmtlci5zdHlsZSArICciPicgKyBodG1sRXNjYXBlKG1hcmtlci50ZXh0KSArICc8L2Rpdj4nKTsKLSAgICAgICAgZWxzZSBodG1sLnB1c2goIjxkaXY+IiArIChvcHRpb25zLmxpbmVOdW1iZXJzID8gaSArIDEgOiAiXHUwMGEwIikgKyAiPC9kaXY+Iik7CisgICAgICAgIGVsc2UgaHRtbC5wdXNoKCI8ZGl2PiIgKyAob3B0aW9ucy5saW5lTnVtYmVycyA/IGkgKyBvcHRpb25zLmZpcnN0TGluZU51bWJlciA6ICJcdTAwYTAiKSArICI8L2Rpdj4iKTsKICAgICAgIH0KICAgICAgIGd1dHRlci5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiOyAvLyBUT0RPIHRlc3Qgd2hldGhlciB0aGlzIGFjdHVhbGx5IGhlbHBzCiAgICAgICBndXR0ZXIuaW5uZXJIVE1MID0gaHRtbC5qb2luKCIiKTsKQEAgLTEzNzEsMTAgKzEzNzcsOCBAQCB2YXIgQ29kZU1pcnJvciA9IChmdW5jdGlvbigpIHsKICAgICAgICAgaWYgKG9wdGlvbiA9PSAicGFyc2VyIikgc2V0UGFyc2VyKHZhbHVlKTsKICAgICAgICAgZWxzZSBpZiAob3B0aW9uID09PSAibGluZU51bWJlcnMiKSBzZXRMaW5lTnVtYmVycyh2YWx1ZSk7CiAgICAgICAgIGVsc2UgaWYgKG9wdGlvbiA9PT0gImd1dHRlciIpIHNldEd1dHRlcih2YWx1ZSk7Ci0gICAgICAgIGVsc2UgaWYgKG9wdGlvbiA9PT0gInJlYWRPbmx5Iikgb3B0aW9ucy5yZWFkT25seSA9IHZhbHVlOwotICAgICAgICBlbHNlIGlmIChvcHRpb24gPT09ICJpbmRlbnRVbml0Iikge29wdGlvbnMuaW5kZW50VW5pdCA9IGluZGVudFVuaXQgPSB2YWx1ZTsgc2V0UGFyc2VyKG9wdGlvbnMucGFyc2VyKTt9Ci0gICAgICAgIGVsc2UgaWYgKC9eKD86ZW50ZXJNb2RlfHRhYk1vZGV8aW5kZW50V2l0aFRhYnN8cmVhZE9ubHl8YXV0b01hdGNoQnJhY2tldHN8dW5kb0RlcHRoKSQvLnRlc3Qob3B0aW9uKSkgb3B0aW9uc1tvcHRpb25dID0gdmFsdWU7Ci0gICAgICAgIGVsc2UgdGhyb3cgbmV3IEVycm9yKCJDYW4ndCBzZXQgb3B0aW9uICIgKyBvcHRpb24pOworICAgICAgICBlbHNlIGlmIChvcHRpb24gPT09ICJpbmRlbnRVbml0Iikge29wdGlvbnMuaW5kZW50VW5pdCA9IHZhbHVlOyBzZXRQYXJzZXIob3B0aW9ucy5wYXJzZXIpO30KKyAgICAgICAgZWxzZSBvcHRpb25zW29wdGlvbl0gPSB2YWx1ZTsKICAgICAgIH0sCiAgICAgICBjdXJzb3JDb29yZHM6IGN1cnNvckNvb3JkcywKICAgICAgIHVuZG86IG9wZXJhdGlvbih1bmRvKSwKQEAgLTE0MDIsNyArMTQwNiw4IEBAIHZhciBDb2RlTWlycm9yID0gKGZ1bmN0aW9uKCkgewogICAgICAgcmVwbGFjZVJhbmdlOiBvcGVyYXRpb24ocmVwbGFjZVJhbmdlKSwKIAogICAgICAgb3BlcmF0aW9uOiBmdW5jdGlvbihmKXtyZXR1cm4gb3BlcmF0aW9uKGYpKCk7fSwKLSAgICAgIHJlZnJlc2g6IGZ1bmN0aW9uKCl7dXBkYXRlRGlzcGxheShbe2Zyb206IDAsIHRvOiBsaW5lcy5sZW5ndGh9XSk7fQorICAgICAgcmVmcmVzaDogZnVuY3Rpb24oKXt1cGRhdGVEaXNwbGF5KFt7ZnJvbTogMCwgdG86IGxpbmVzLmxlbmd0aH1dKTt9LAorICAgICAgZ2V0SW5wdXRGaWVsZDogZnVuY3Rpb24oKXtyZXR1cm4gaW5wdXQ7fQogICAgIH07CiAgICAgcmV0dXJuIGluc3RhbmNlOwogICB9CkBAIC0xNDIwLDYgKzE0MjUsNyBAQCB2YXIgQ29kZU1pcnJvciA9IChmdW5jdGlvbigpIHsKICAgICByZWFkT25seTogZmFsc2UsCiAgICAgb25DaGFuZ2U6IG51bGwsCiAgICAgb25DdXJzb3JBY3Rpdml0eTogbnVsbCwKKyAgICBvbkd1dHRlckNsaWNrOiBudWxsLAogICAgIGF1dG9NYXRjaEJyYWNrZXRzOiBmYWxzZSwKICAgICB3b3JrVGltZTogMjAwLAogICAgIHdvcmtEZWxheTogMzAwLAo8L3RleHRhcmVhPjwvZm9ybT4KICAgIDxzY3JpcHQ+CiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7fSk7CiAgICA8L3NjcmlwdD4KCiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC94LWRpZmY8L2NvZGU+LjwvcD4KCiAgPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/django/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/django/django.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSwgcmVxdWlyZSgiLi4vaHRtbG1peGVkL2h0bWxtaXhlZCIpLAogICAgICAgIHJlcXVpcmUoIi4uLy4uL2FkZG9uL21vZGUvb3ZlcmxheSIpKTsKICBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCkgLy8gQU1ECiAgICBkZWZpbmUoWyIuLi8uLi9saWIvY29kZW1pcnJvciIsICIuLi9odG1sbWl4ZWQvaHRtbG1peGVkIiwKICAgICAgICAgICAgIi4uLy4uL2FkZG9uL21vZGUvb3ZlcmxheSJdLCBtb2QpOwogIGVsc2UgLy8gUGxhaW4gYnJvd3NlciBlbnYKICAgIG1vZChDb2RlTWlycm9yKTsKfSkoZnVuY3Rpb24oQ29kZU1pcnJvcikgewogICJ1c2Ugc3RyaWN0IjsKCiAgQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJkamFuZ286aW5uZXIiLCBmdW5jdGlvbigpIHsKICAgIHZhciBrZXl3b3JkcyA9IFsiYmxvY2siLCAiZW5kYmxvY2siLCAiZm9yIiwgImVuZGZvciIsICJ0cnVlIiwgImZhbHNlIiwgImZpbHRlciIsICJlbmRmaWx0ZXIiLAogICAgICAgICAgICAgICAgICAgICJsb29wIiwgIm5vbmUiLCAic2VsZiIsICJzdXBlciIsICJpZiIsICJlbGlmIiwgImVuZGlmIiwgImFzIiwgImVsc2UiLCAiaW1wb3J0IiwKICAgICAgICAgICAgICAgICAgICAid2l0aCIsICJlbmR3aXRoIiwgIndpdGhvdXQiLCAiY29udGV4dCIsICJpZmVxdWFsIiwgImVuZGlmZXF1YWwiLCAiaWZub3RlcXVhbCIsCiAgICAgICAgICAgICAgICAgICAgImVuZGlmbm90ZXF1YWwiLCAiZXh0ZW5kcyIsICJpbmNsdWRlIiwgImxvYWQiLCAiY29tbWVudCIsICJlbmRjb21tZW50IiwKICAgICAgICAgICAgICAgICAgICAiZW1wdHkiLCAidXJsIiwgInN0YXRpYyIsICJ0cmFucyIsICJibG9ja3RyYW5zIiwgImVuZGJsb2NrdHJhbnMiLCAibm93IiwKICAgICAgICAgICAgICAgICAgICAicmVncm91cCIsICJsb3JlbSIsICJpZmNoYW5nZWQiLCAiZW5kaWZjaGFuZ2VkIiwgImZpcnN0b2YiLCAiZGVidWciLCAiY3ljbGUiLAogICAgICAgICAgICAgICAgICAgICJjc3JmX3Rva2VuIiwgImF1dG9lc2NhcGUiLCAiZW5kYXV0b2VzY2FwZSIsICJzcGFjZWxlc3MiLCAiZW5kc3BhY2VsZXNzIiwKICAgICAgICAgICAgICAgICAgICAic3NpIiwgInRlbXBsYXRldGFnIiwgInZlcmJhdGltIiwgImVuZHZlcmJhdGltIiwgIndpZHRocmF0aW8iXSwKICAgICAgICBmaWx0ZXJzID0gWyJhZGQiLCAiYWRkc2xhc2hlcyIsICJjYXBmaXJzdCIsICJjZW50ZXIiLCAiY3V0IiwgImRhdGUiLAogICAgICAgICAgICAgICAgICAgImRlZmF1bHQiLCAiZGVmYXVsdF9pZl9ub25lIiwgImRpY3Rzb3J0IiwKICAgICAgICAgICAgICAgICAgICJkaWN0c29ydHJldmVyc2VkIiwgImRpdmlzaWJsZWJ5IiwgImVzY2FwZSIsICJlc2NhcGVqcyIsCiAgICAgICAgICAgICAgICAgICAiZmlsZXNpemVmb3JtYXQiLCAiZmlyc3QiLCAiZmxvYXRmb3JtYXQiLCAiZm9yY2VfZXNjYXBlIiwKICAgICAgICAgICAgICAgICAgICJnZXRfZGlnaXQiLCAiaXJpZW5jb2RlIiwgImpvaW4iLCAibGFzdCIsICJsZW5ndGgiLAogICAgICAgICAgICAgICAgICAgImxlbmd0aF9pcyIsICJsaW5lYnJlYWtzIiwgImxpbmVicmVha3NiciIsICJsaW5lbnVtYmVycyIsCiAgICAgICAgICAgICAgICAgICAibGp1c3QiLCAibG93ZXIiLCAibWFrZV9saXN0IiwgInBob25lMm51bWVyaWMiLCAicGx1cmFsaXplIiwKICAgICAgICAgICAgICAgICAgICJwcHJpbnQiLCAicmFuZG9tIiwgInJlbW92ZXRhZ3MiLCAicmp1c3QiLCAic2FmZSIsCiAgICAgICAgICAgICAgICAgICAic2FmZXNlcSIsICJzbGljZSIsICJzbHVnaWZ5IiwgInN0cmluZ2Zvcm1hdCIsICJzdHJpcHRhZ3MiLAogICAgICAgICAgICAgICAgICAgInRpbWUiLCAidGltZXNpbmNlIiwgInRpbWV1bnRpbCIsICJ0aXRsZSIsICJ0cnVuY2F0ZWNoYXJzIiwKICAgICAgICAgICAgICAgICAgICJ0cnVuY2F0ZWNoYXJzX2h0bWwiLCAidHJ1bmNhdGV3b3JkcyIsICJ0cnVuY2F0ZXdvcmRzX2h0bWwiLAogICAgICAgICAgICAgICAgICAgInVub3JkZXJlZF9saXN0IiwgInVwcGVyIiwgInVybGVuY29kZSIsICJ1cmxpemUiLAogICAgICAgICAgICAgICAgICAgInVybGl6ZXRydW5jIiwgIndvcmRjb3VudCIsICJ3b3Jkd3JhcCIsICJ5ZXNubyJdLAogICAgICAgIG9wZXJhdG9ycyA9IFsiPT0iLCAiIT0iLCAiPCIsICI+IiwgIjw9IiwgIj49Il0sCiAgICAgICAgd29yZE9wZXJhdG9ycyA9IFsiaW4iLCAibm90IiwgIm9yIiwgImFuZCJdOwoKICAgIGtleXdvcmRzID0gbmV3IFJlZ0V4cCgiXlxcYigiICsga2V5d29yZHMuam9pbigifCIpICsgIilcXGIiKTsKICAgIGZpbHRlcnMgPSBuZXcgUmVnRXhwKCJeXFxiKCIgKyBmaWx0ZXJzLmpvaW4oInwiKSArICIpXFxiIik7CiAgICBvcGVyYXRvcnMgPSBuZXcgUmVnRXhwKCJeXFxiKCIgKyBvcGVyYXRvcnMuam9pbigifCIpICsgIilcXGIiKTsKICAgIHdvcmRPcGVyYXRvcnMgPSBuZXcgUmVnRXhwKCJeXFxiKCIgKyB3b3JkT3BlcmF0b3JzLmpvaW4oInwiKSArICIpXFxiIik7CgogICAgLy8gV2UgaGF2ZSB0byByZXR1cm4gIm51bGwiIGluc3RlYWQgb2YgbnVsbCwgaW4gb3JkZXIgdG8gYXZvaWQgc3RyaW5nCiAgICAvLyBzdHlsaW5nIGFzIHRoZSBkZWZhdWx0LCB3aGVuIHVzaW5nIERqYW5nbyB0ZW1wbGF0ZXMgaW5zaWRlIEhUTUwKICAgIC8vIGVsZW1lbnQgYXR0cmlidXRlcwogICAgZnVuY3Rpb24gdG9rZW5CYXNlIChzdHJlYW0sIHN0YXRlKSB7CiAgICAgIC8vIEF0dGVtcHQgdG8gaWRlbnRpZnkgYSB2YXJpYWJsZSwgdGVtcGxhdGUgb3IgY29tbWVudCB0YWcgcmVzcGVjdGl2ZWx5CiAgICAgIGlmIChzdHJlYW0ubWF0Y2goInt7IikpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IGluVmFyaWFibGU7CiAgICAgICAgcmV0dXJuICJ0YWciOwogICAgICB9IGVsc2UgaWYgKHN0cmVhbS5tYXRjaCgieyUiKSkgewogICAgICAgIHN0YXRlLnRva2VuaXplID0gaW5UYWc7CiAgICAgICAgcmV0dXJuICJ0YWciOwogICAgICB9IGVsc2UgaWYgKHN0cmVhbS5tYXRjaCgieyMiKSkgewogICAgICAgIHN0YXRlLnRva2VuaXplID0gaW5Db21tZW50OwogICAgICAgIHJldHVybiAiY29tbWVudCI7CiAgICAgIH0KCiAgICAgIC8vIElnbm9yZSBjb21wbGV0ZWx5IGFueSBzdHJlYW0gc2VyaWVzIHRoYXQgZG8gbm90IG1hdGNoIHRoZQogICAgICAvLyBEamFuZ28gdGVtcGxhdGUgb3BlbmluZyB0YWdzLgogICAgICB3aGlsZSAoc3RyZWFtLm5leHQoKSAhPSBudWxsICYmICFzdHJlYW0ubWF0Y2goL1x7W3slI10vLCBmYWxzZSkpIHt9CiAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIC8vIEEgc3RyaW5nIGNhbiBiZSBpbmNsdWRlZCBpbiBlaXRoZXIgc2luZ2xlIG9yIGRvdWJsZSBxdW90ZXMgKHRoaXMgaXMKICAgIC8vIHRoZSBkZWxpbWl0ZXIpLiBNYXJrIGV2ZXJ5dGhpbmcgYXMgYSBzdHJpbmcgdW50aWwgdGhlIHN0YXJ0IGRlbGltaXRlcgogICAgLy8gb2NjdXJzIGFnYWluLgogICAgZnVuY3Rpb24gaW5TdHJpbmcgKGRlbGltaXRlciwgcHJldmlvdXNUb2tlbml6ZXIpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uIChzdHJlYW0sIHN0YXRlKSB7CiAgICAgICAgaWYgKCFzdGF0ZS5lc2NhcGVOZXh0ICYmIHN0cmVhbS5lYXQoZGVsaW1pdGVyKSkgewogICAgICAgICAgc3RhdGUudG9rZW5pemUgPSBwcmV2aW91c1Rva2VuaXplcjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKHN0YXRlLmVzY2FwZU5leHQpIHsKICAgICAgICAgICAgc3RhdGUuZXNjYXBlTmV4dCA9IGZhbHNlOwogICAgICAgICAgfQoKICAgICAgICAgIHZhciBjaCA9IHN0cmVhbS5uZXh0KCk7CgogICAgICAgICAgLy8gVGFrZSBpbnRvIGFjY291bnQgdGhlIGJhY2tzbGFzaCBmb3IgZXNjYXBpbmcgY2hhcmFjdGVycywgc3VjaCBhcwogICAgICAgICAgLy8gdGhlIHN0cmluZyBkZWxpbWl0ZXIuCiAgICAgICAgICBpZiAoY2ggPT0gIlxcIikgewogICAgICAgICAgICBzdGF0ZS5lc2NhcGVOZXh0ID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiAic3RyaW5nIjsKICAgICAgfTsKICAgIH0KCiAgICAvLyBBcHBseSBEamFuZ28gdGVtcGxhdGUgdmFyaWFibGUgc3ludGF4IGhpZ2hsaWdodGluZwogICAgZnVuY3Rpb24gaW5WYXJpYWJsZSAoc3RyZWFtLCBzdGF0ZSkgewogICAgICAvLyBBdHRlbXB0IHRvIG1hdGNoIGEgZG90IHRoYXQgcHJlY2VkZXMgYSBwcm9wZXJ0eQogICAgICBpZiAoc3RhdGUud2FpdERvdCkgewogICAgICAgIHN0YXRlLndhaXREb3QgPSBmYWxzZTsKCiAgICAgICAgaWYgKHN0cmVhbS5wZWVrKCkgIT0gIi4iKSB7CiAgICAgICAgICByZXR1cm4gIm51bGwiOwogICAgICAgIH0KCiAgICAgICAgLy8gRG90IGZvbGxvd2VkIGJ5IGEgbm9uLXdvcmQgY2hhcmFjdGVyIHNob3VsZCBiZSBjb25zaWRlcmVkIGFuIGVycm9yLgogICAgICAgIGlmIChzdHJlYW0ubWF0Y2goL1wuXFcrLykpIHsKICAgICAgICAgIHJldHVybiAiZXJyb3IiOwogICAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLmVhdCgiLiIpKSB7CiAgICAgICAgICBzdGF0ZS53YWl0UHJvcGVydHkgPSB0cnVlOwogICAgICAgICAgcmV0dXJuICJudWxsIjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhyb3cgRXJyb3IgKCJVbmV4cGVjdGVkIGVycm9yIHdoaWxlIHdhaXRpbmcgZm9yIHByb3BlcnR5LiIpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gQXR0ZW1wdCB0byBtYXRjaCBhIHBpcGUgdGhhdCBwcmVjZWRlcyBhIGZpbHRlcgogICAgICBpZiAoc3RhdGUud2FpdFBpcGUpIHsKICAgICAgICBzdGF0ZS53YWl0UGlwZSA9IGZhbHNlOwoKICAgICAgICBpZiAoc3RyZWFtLnBlZWsoKSAhPSAifCIpIHsKICAgICAgICAgIHJldHVybiAibnVsbCI7CiAgICAgICAgfQoKICAgICAgICAvLyBQaXBlIGZvbGxvd2VkIGJ5IGEgbm9uLXdvcmQgY2hhcmFjdGVyIHNob3VsZCBiZSBjb25zaWRlcmVkIGFuIGVycm9yLgogICAgICAgIGlmIChzdHJlYW0ubWF0Y2goL1wuXFcrLykpIHsKICAgICAgICAgIHJldHVybiAiZXJyb3IiOwogICAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLmVhdCgifCIpKSB7CiAgICAgICAgICBzdGF0ZS53YWl0RmlsdGVyID0gdHJ1ZTsKICAgICAgICAgIHJldHVybiAibnVsbCI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRocm93IEVycm9yICgiVW5leHBlY3RlZCBlcnJvciB3aGlsZSB3YWl0aW5nIGZvciBmaWx0ZXIuIik7CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyBIaWdobGlnaHQgcHJvcGVydGllcwogICAgICBpZiAoc3RhdGUud2FpdFByb3BlcnR5KSB7CiAgICAgICAgc3RhdGUud2FpdFByb3BlcnR5ID0gZmFsc2U7CiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXGIoXHcrKVxiLykpIHsKICAgICAgICAgIHN0YXRlLndhaXREb3QgPSB0cnVlOyAgLy8gQSBwcm9wZXJ0eSBjYW4gYmUgZm9sbG93ZWQgYnkgYW5vdGhlciBwcm9wZXJ0eQogICAgICAgICAgc3RhdGUud2FpdFBpcGUgPSB0cnVlOyAgLy8gQSBwcm9wZXJ0eSBjYW4gYmUgZm9sbG93ZWQgYnkgYSBmaWx0ZXIKICAgICAgICAgIHJldHVybiAicHJvcGVydHkiOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gSGlnaGxpZ2h0IGZpbHRlcnMKICAgICAgaWYgKHN0YXRlLndhaXRGaWx0ZXIpIHsKICAgICAgICAgIHN0YXRlLndhaXRGaWx0ZXIgPSBmYWxzZTsKICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKGZpbHRlcnMpKSB7CiAgICAgICAgICByZXR1cm4gInZhcmlhYmxlLTIiOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gSWdub3JlIGFsbCB3aGl0ZSBzcGFjZXMKICAgICAgaWYgKHN0cmVhbS5lYXRTcGFjZSgpKSB7CiAgICAgICAgc3RhdGUud2FpdFByb3BlcnR5ID0gZmFsc2U7CiAgICAgICAgcmV0dXJuICJudWxsIjsKICAgICAgfQoKICAgICAgLy8gSWRlbnRpZnkgbnVtYmVycwogICAgICBpZiAoc3RyZWFtLm1hdGNoKC9cYlxkKyhcLlxkKyk/XGIvKSkgewogICAgICAgIHJldHVybiAibnVtYmVyIjsKICAgICAgfQoKICAgICAgLy8gSWRlbnRpZnkgc3RyaW5ncwogICAgICBpZiAoc3RyZWFtLm1hdGNoKCInIikpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IGluU3RyaW5nKCInIiwgc3RhdGUudG9rZW5pemUpOwogICAgICAgIHJldHVybiAic3RyaW5nIjsKICAgICAgfSBlbHNlIGlmIChzdHJlYW0ubWF0Y2goJyInKSkgewogICAgICAgIHN0YXRlLnRva2VuaXplID0gaW5TdHJpbmcoJyInLCBzdGF0ZS50b2tlbml6ZSk7CiAgICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgICB9CgogICAgICAvLyBBdHRlbXB0IHRvIGZpbmQgdGhlIHZhcmlhYmxlCiAgICAgIGlmIChzdHJlYW0ubWF0Y2goL1xiKFx3KylcYi8pICYmICFzdGF0ZS5mb3VuZFZhcmlhYmxlKSB7CiAgICAgICAgc3RhdGUud2FpdERvdCA9IHRydWU7CiAgICAgICAgc3RhdGUud2FpdFBpcGUgPSB0cnVlOyAgLy8gQSBwcm9wZXJ0eSBjYW4gYmUgZm9sbG93ZWQgYnkgYSBmaWx0ZXIKICAgICAgICByZXR1cm4gInZhcmlhYmxlIjsKICAgICAgfQoKICAgICAgLy8gSWYgZm91bmQgY2xvc2luZyB0YWcgcmVzZXQKICAgICAgaWYgKHN0cmVhbS5tYXRjaCgifX0iKSkgewogICAgICAgIHN0YXRlLndhaXRQcm9wZXJ0eSA9IG51bGw7CiAgICAgICAgc3RhdGUud2FpdEZpbHRlciA9IG51bGw7CiAgICAgICAgc3RhdGUud2FpdERvdCA9IG51bGw7CiAgICAgICAgc3RhdGUud2FpdFBpcGUgPSBudWxsOwogICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlOwogICAgICAgIHJldHVybiAidGFnIjsKICAgICAgfQoKICAgICAgLy8gSWYgbm90aGluZyB3YXMgZm91bmQsIGFkdmFuY2UgdG8gdGhlIG5leHQgY2hhcmFjdGVyCiAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgIHJldHVybiAibnVsbCI7CiAgICB9CgogICAgZnVuY3Rpb24gaW5UYWcgKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgLy8gQXR0ZW1wdCB0byBtYXRjaCBhIGRvdCB0aGF0IHByZWNlZGVzIGEgcHJvcGVydHkKICAgICAgaWYgKHN0YXRlLndhaXREb3QpIHsKICAgICAgICBzdGF0ZS53YWl0RG90ID0gZmFsc2U7CgogICAgICAgIGlmIChzdHJlYW0ucGVlaygpICE9ICIuIikgewogICAgICAgICAgcmV0dXJuICJudWxsIjsKICAgICAgICB9CgogICAgICAgIC8vIERvdCBmb2xsb3dlZCBieSBhIG5vbi13b3JkIGNoYXJhY3RlciBzaG91bGQgYmUgY29uc2lkZXJlZCBhbiBlcnJvci4KICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKC9cLlxXKy8pKSB7CiAgICAgICAgICByZXR1cm4gImVycm9yIjsKICAgICAgICB9IGVsc2UgaWYgKHN0cmVhbS5lYXQoIi4iKSkgewogICAgICAgICAgc3RhdGUud2FpdFByb3BlcnR5ID0gdHJ1ZTsKICAgICAgICAgIHJldHVybiAibnVsbCI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRocm93IEVycm9yICgiVW5leHBlY3RlZCBlcnJvciB3aGlsZSB3YWl0aW5nIGZvciBwcm9wZXJ0eS4iKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIEF0dGVtcHQgdG8gbWF0Y2ggYSBwaXBlIHRoYXQgcHJlY2VkZXMgYSBmaWx0ZXIKICAgICAgaWYgKHN0YXRlLndhaXRQaXBlKSB7CiAgICAgICAgc3RhdGUud2FpdFBpcGUgPSBmYWxzZTsKCiAgICAgICAgaWYgKHN0cmVhbS5wZWVrKCkgIT0gInwiKSB7CiAgICAgICAgICByZXR1cm4gIm51bGwiOwogICAgICAgIH0KCiAgICAgICAgLy8gUGlwZSBmb2xsb3dlZCBieSBhIG5vbi13b3JkIGNoYXJhY3RlciBzaG91bGQgYmUgY29uc2lkZXJlZCBhbiBlcnJvci4KICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKC9cLlxXKy8pKSB7CiAgICAgICAgICByZXR1cm4gImVycm9yIjsKICAgICAgICB9IGVsc2UgaWYgKHN0cmVhbS5lYXQoInwiKSkgewogICAgICAgICAgc3RhdGUud2FpdEZpbHRlciA9IHRydWU7CiAgICAgICAgICByZXR1cm4gIm51bGwiOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aHJvdyBFcnJvciAoIlVuZXhwZWN0ZWQgZXJyb3Igd2hpbGUgd2FpdGluZyBmb3IgZmlsdGVyLiIpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gSGlnaGxpZ2h0IHByb3BlcnRpZXMKICAgICAgaWYgKHN0YXRlLndhaXRQcm9wZXJ0eSkgewogICAgICAgIHN0YXRlLndhaXRQcm9wZXJ0eSA9IGZhbHNlOwogICAgICAgIGlmIChzdHJlYW0ubWF0Y2goL1xiKFx3KylcYi8pKSB7CiAgICAgICAgICBzdGF0ZS53YWl0RG90ID0gdHJ1ZTsgIC8vIEEgcHJvcGVydHkgY2FuIGJlIGZvbGxvd2VkIGJ5IGFub3RoZXIgcHJvcGVydHkKICAgICAgICAgIHN0YXRlLndhaXRQaXBlID0gdHJ1ZTsgIC8vIEEgcHJvcGVydHkgY2FuIGJlIGZvbGxvd2VkIGJ5IGEgZmlsdGVyCiAgICAgICAgICByZXR1cm4gInByb3BlcnR5IjsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIEhpZ2hsaWdodCBmaWx0ZXJzCiAgICAgIGlmIChzdGF0ZS53YWl0RmlsdGVyKSB7CiAgICAgICAgICBzdGF0ZS53YWl0RmlsdGVyID0gZmFsc2U7CiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaChmaWx0ZXJzKSkgewogICAgICAgICAgcmV0dXJuICJ2YXJpYWJsZS0yIjsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIElnbm9yZSBhbGwgd2hpdGUgc3BhY2VzCiAgICAgIGlmIChzdHJlYW0uZWF0U3BhY2UoKSkgewogICAgICAgIHN0YXRlLndhaXRQcm9wZXJ0eSA9IGZhbHNlOwogICAgICAgIHJldHVybiAibnVsbCI7CiAgICAgIH0KCiAgICAgIC8vIElkZW50aWZ5IG51bWJlcnMKICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXGJcZCsoXC5cZCspP1xiLykpIHsKICAgICAgICByZXR1cm4gIm51bWJlciI7CiAgICAgIH0KCiAgICAgIC8vIElkZW50aWZ5IHN0cmluZ3MKICAgICAgaWYgKHN0cmVhbS5tYXRjaCgiJyIpKSB7CiAgICAgICAgc3RhdGUudG9rZW5pemUgPSBpblN0cmluZygiJyIsIHN0YXRlLnRva2VuaXplKTsKICAgICAgICByZXR1cm4gInN0cmluZyI7CiAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLm1hdGNoKCciJykpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IGluU3RyaW5nKCciJywgc3RhdGUudG9rZW5pemUpOwogICAgICAgIHJldHVybiAic3RyaW5nIjsKICAgICAgfQoKICAgICAgLy8gQXR0ZW1wdCB0byBtYXRjaCBhbiBvcGVyYXRvcgogICAgICBpZiAoc3RyZWFtLm1hdGNoKG9wZXJhdG9ycykpIHsKICAgICAgICByZXR1cm4gIm9wZXJhdG9yIjsKICAgICAgfQoKICAgICAgLy8gQXR0ZW1wdCB0byBtYXRjaCBhIHdvcmQgb3BlcmF0b3IKICAgICAgaWYgKHN0cmVhbS5tYXRjaCh3b3JkT3BlcmF0b3JzKSkgewogICAgICAgIHJldHVybiAia2V5d29yZCI7CiAgICAgIH0KCiAgICAgIC8vIEF0dGVtcHQgdG8gbWF0Y2ggYSBrZXl3b3JkCiAgICAgIHZhciBrZXl3b3JkTWF0Y2ggPSBzdHJlYW0ubWF0Y2goa2V5d29yZHMpOwogICAgICBpZiAoa2V5d29yZE1hdGNoKSB7CiAgICAgICAgaWYgKGtleXdvcmRNYXRjaFswXSA9PSAiY29tbWVudCIpIHsKICAgICAgICAgIHN0YXRlLmJsb2NrQ29tbWVudFRhZyA9IHRydWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiAia2V5d29yZCI7CiAgICAgIH0KCiAgICAgIC8vIEF0dGVtcHQgdG8gbWF0Y2ggYSB2YXJpYWJsZQogICAgICBpZiAoc3RyZWFtLm1hdGNoKC9cYihcdyspXGIvKSkgewogICAgICAgIHN0YXRlLndhaXREb3QgPSB0cnVlOwogICAgICAgIHN0YXRlLndhaXRQaXBlID0gdHJ1ZTsgIC8vIEEgcHJvcGVydHkgY2FuIGJlIGZvbGxvd2VkIGJ5IGEgZmlsdGVyCiAgICAgICAgcmV0dXJuICJ2YXJpYWJsZSI7CiAgICAgIH0KCiAgICAgIC8vIElmIGZvdW5kIGNsb3NpbmcgdGFnIHJlc2V0CiAgICAgIGlmIChzdHJlYW0ubWF0Y2goIiV9IikpIHsKICAgICAgICBzdGF0ZS53YWl0UHJvcGVydHkgPSBudWxsOwogICAgICAgIHN0YXRlLndhaXRGaWx0ZXIgPSBudWxsOwogICAgICAgIHN0YXRlLndhaXREb3QgPSBudWxsOwogICAgICAgIHN0YXRlLndhaXRQaXBlID0gbnVsbDsKICAgICAgICAvLyBJZiB0aGUgdGFnIHRoYXQgY2xvc2VzIGlzIGEgYmxvY2sgY29tbWVudCB0YWcsIHdlIHdhbnQgdG8gbWFyayB0aGUKICAgICAgICAvLyBmb2xsb3dpbmcgY29kZSBhcyBjb21tZW50LCB1bnRpbCB0aGUgdGFnIGNsb3Nlcy4KICAgICAgICBpZiAoc3RhdGUuYmxvY2tDb21tZW50VGFnKSB7CiAgICAgICAgICBzdGF0ZS5ibG9ja0NvbW1lbnRUYWcgPSBmYWxzZTsgIC8vIFJlbGVhc2UgdGhlICJsb2NrIgogICAgICAgICAgc3RhdGUudG9rZW5pemUgPSBpbkJsb2NrQ29tbWVudDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICAgICAgfQogICAgICAgIHJldHVybiAidGFnIjsKICAgICAgfQoKICAgICAgLy8gSWYgbm90aGluZyB3YXMgZm91bmQsIGFkdmFuY2UgdG8gdGhlIG5leHQgY2hhcmFjdGVyCiAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgIHJldHVybiAibnVsbCI7CiAgICB9CgogICAgLy8gTWFyayBldmVyeXRoaW5nIGFzIGNvbW1lbnQgaW5zaWRlIHRoZSB0YWcgYW5kIHRoZSB0YWcgaXRzZWxmLgogICAgZnVuY3Rpb24gaW5Db21tZW50IChzdHJlYW0sIHN0YXRlKSB7CiAgICAgIGlmIChzdHJlYW0ubWF0Y2goL14uKj8jXH0vKSkgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2UKICAgICAgZWxzZSBzdHJlYW0uc2tpcFRvRW5kKCkKICAgICAgcmV0dXJuICJjb21tZW50IjsKICAgIH0KCiAgICAvLyBNYXJrIGV2ZXJ5dGhpbmcgYXMgYSBjb21tZW50IHVudGlsIHRoZSBgYmxvY2tjb21tZW50YCB0YWcgY2xvc2VzLgogICAgZnVuY3Rpb24gaW5CbG9ja0NvbW1lbnQgKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXHslXHMqZW5kY29tbWVudFxzKiVcfS8sIGZhbHNlKSkgewogICAgICAgIHN0YXRlLnRva2VuaXplID0gaW5UYWc7CiAgICAgICAgc3RyZWFtLm1hdGNoKCJ7JSIpOwogICAgICAgIHJldHVybiAidGFnIjsKICAgICAgfSBlbHNlIHsKICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgIHJldHVybiAiY29tbWVudCI7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gewogICAgICBzdGFydFN0YXRlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIHt0b2tlbml6ZTogdG9rZW5CYXNlfTsKICAgICAgfSwKICAgICAgdG9rZW46IGZ1bmN0aW9uIChzdHJlYW0sIHN0YXRlKSB7CiAgICAgICAgcmV0dXJuIHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgICB9LAogICAgICBibG9ja0NvbW1lbnRTdGFydDogInslIGNvbW1lbnQgJX0iLAogICAgICBibG9ja0NvbW1lbnRFbmQ6ICJ7JSBlbmRjb21tZW50ICV9IgogICAgfTsKICB9KTsKCiAgQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJkamFuZ28iLCBmdW5jdGlvbihjb25maWcpIHsKICAgIHZhciBodG1sQmFzZSA9IENvZGVNaXJyb3IuZ2V0TW9kZShjb25maWcsICJ0ZXh0L2h0bWwiKTsKICAgIHZhciBkamFuZ29Jbm5lciA9IENvZGVNaXJyb3IuZ2V0TW9kZShjb25maWcsICJkamFuZ286aW5uZXIiKTsKICAgIHJldHVybiBDb2RlTWlycm9yLm92ZXJsYXlNb2RlKGh0bWxCYXNlLCBkamFuZ29Jbm5lcik7CiAgfSk7CgogIENvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC94LWRqYW5nbyIsICJkamFuZ28iKTsKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/django/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogRGphbmdvIHRlbXBsYXRlIG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL3RoZW1lL21kbi1saWtlLmNzcyI+CjxzY3JpcHQgc3JjPSIuLi8uLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi8uLi9hZGRvbi9tb2RlL292ZXJsYXkuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4veG1sL3htbC5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9odG1sbWl4ZWQvaHRtbG1peGVkLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9ImRqYW5nby5qcyI+PC9zY3JpcHQ+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+LkNvZGVNaXJyb3Ige2JvcmRlci10b3A6IDFweCBzb2xpZCBibGFjazsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO308L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxoMT5Db2RlTWlycm9yPC9oMT48aW1nIGlkPWxvZ28gc3JjPSIuLi8uLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5MYW5ndWFnZSBtb2RlczwvYT4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+RGphbmdvPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5EamFuZ28gdGVtcGxhdGUgbW9kZTwvaDI+Cjxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+CjwhZG9jdHlwZSBodG1sPgo8aHRtbD4KICA8aGVhZD4KICAgIDx0aXRsZT5NeSBEamFuZ28gd2ViIGFwcGxpY2F0aW9uPC90aXRsZT4KICA8L2hlYWQ+CiAgPGJvZHk+CiAgICA8aDE+CiAgICAgIHt7IHBhZ2UudGl0bGV8Y2FwZmlyc3QgfX0KICAgIDwvaDE+CiAgICA8dWwgY2xhc3M9Im15LWxpc3QiPgogICAgICB7IyB0cmF2ZXJzZSBhIGxpc3Qgb2YgaXRlbXMgYW5kIHByb2R1Y2UgbGlua3MgdG8gdGhlaXIgdmlld3MuICN9CiAgICAgIHslIGZvciBpdGVtIGluIGl0ZW1zICV9CiAgICAgIDxsaT4KICAgICAgICA8YSBocmVmPSJ7JSB1cmwgJ2l0ZW1fdmlldycgaXRlbS5uYW1lfHNsdWdpZnkgJX0iPgogICAgICAgICAge3sgaXRlbS5uYW1lIH19CiAgICAgICAgPC9hPgogICAgICA8L2xpPgogICAgICB7JSBlbXB0eSAlfQogICAgICA8bGk+WW91IGhhdmUgbm8gaXRlbXMgaW4geW91ciBsaXN0LjwvbGk+CiAgICAgIHslIGVuZGZvciAlfQogICAgPC91bD4KICAgIHslIGNvbW1lbnQgInRoaXMgaXMgYSBmb3Jnb3R0ZW4gZm9vdGVyIiAlfQogICAgPGZvb3Rlcj48L2Zvb3Rlcj4KICAgIHslIGVuZGNvbW1lbnQgJX0KICA8L2JvZHk+CjwvaHRtbD4KPC90ZXh0YXJlYT48L2Zvcm0+CgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgICAgICBtb2RlOiAiZGphbmdvIiwKICAgICAgICBpbmRlbnRVbml0OiAyLAogICAgICAgIGluZGVudFdpdGhUYWJzOiB0cnVlLAogICAgICAgIHRoZW1lOiAibWRuLWxpa2UiCiAgICAgIH0pOwogICAgPC9zY3JpcHQ+CgogICAgPHA+TW9kZSBmb3IgSFRNTCB3aXRoIGVtYmVkZGVkIERqYW5nbyB0ZW1wbGF0ZSBtYXJrdXAuPC9wPgoKICAgIDxwPjxzdHJvbmc+TUlNRSB0eXBlcyBkZWZpbmVkOjwvc3Ryb25nPiA8Y29kZT50ZXh0L3gtZGphbmdvPC9jb2RlPjwvcD4KICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/dockerfile/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/dockerfile/dockerfile.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSwgcmVxdWlyZSgiLi4vLi4vYWRkb24vbW9kZS9zaW1wbGUiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiLCAiLi4vLi4vYWRkb24vbW9kZS9zaW1wbGUiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CgogIC8vIENvbGxlY3QgYWxsIERvY2tlcmZpbGUgZGlyZWN0aXZlcwogIHZhciBpbnN0cnVjdGlvbnMgPSBbImZyb20iLCAibWFpbnRhaW5lciIsICJydW4iLCAiY21kIiwgImV4cG9zZSIsICJlbnYiLAogICAgICAgICAgICAgICAgICAgICAgImFkZCIsICJjb3B5IiwgImVudHJ5cG9pbnQiLCAidm9sdW1lIiwgInVzZXIiLAogICAgICAgICAgICAgICAgICAgICAgIndvcmtkaXIiLCAib25idWlsZCJdLAogICAgICBpbnN0cnVjdGlvblJlZ2V4ID0gIigiICsgaW5zdHJ1Y3Rpb25zLmpvaW4oJ3wnKSArICIpIiwKICAgICAgaW5zdHJ1Y3Rpb25Pbmx5TGluZSA9IG5ldyBSZWdFeHAoaW5zdHJ1Y3Rpb25SZWdleCArICJcXHMqJCIsICJpIiksCiAgICAgIGluc3RydWN0aW9uV2l0aEFyZ3VtZW50cyA9IG5ldyBSZWdFeHAoaW5zdHJ1Y3Rpb25SZWdleCArICIoXFxzKykiLCAiaSIpOwoKICBDb2RlTWlycm9yLmRlZmluZVNpbXBsZU1vZGUoImRvY2tlcmZpbGUiLCB7CiAgICBzdGFydDogWwogICAgICAvLyBCbG9jayBjb21tZW50OiBUaGlzIGlzIGEgbGluZSBzdGFydGluZyB3aXRoIGEgY29tbWVudAogICAgICB7CiAgICAgICAgcmVnZXg6IC8jLiokLywKICAgICAgICB0b2tlbjogImNvbW1lbnQiCiAgICAgIH0sCiAgICAgIC8vIEhpZ2hsaWdodCBhbiBpbnN0cnVjdGlvbiB3aXRob3V0IGFueSBhcmd1bWVudHMgKGZvciBjb252ZW5pZW5jZSkKICAgICAgewogICAgICAgIHJlZ2V4OiBpbnN0cnVjdGlvbk9ubHlMaW5lLAogICAgICAgIHRva2VuOiAidmFyaWFibGUtMiIKICAgICAgfSwKICAgICAgLy8gSGlnaGxpZ2h0IGFuIGluc3RydWN0aW9uIGZvbGxvd2VkIGJ5IGFyZ3VtZW50cwogICAgICB7CiAgICAgICAgcmVnZXg6IGluc3RydWN0aW9uV2l0aEFyZ3VtZW50cywKICAgICAgICB0b2tlbjogWyJ2YXJpYWJsZS0yIiwgbnVsbF0sCiAgICAgICAgbmV4dDogImFyZ3VtZW50cyIKICAgICAgfSwKICAgICAgewogICAgICAgIHJlZ2V4OiAvLi8sCiAgICAgICAgdG9rZW46IG51bGwKICAgICAgfQogICAgXSwKICAgIGFyZ3VtZW50czogWwogICAgICB7CiAgICAgICAgLy8gTGluZSBjb21tZW50IHdpdGhvdXQgaW5zdHJ1Y3Rpb24gYXJndW1lbnRzIGlzIGFuIGVycm9yCiAgICAgICAgcmVnZXg6IC8jLiokLywKICAgICAgICB0b2tlbjogImVycm9yIiwKICAgICAgICBuZXh0OiAic3RhcnQiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICByZWdleDogL1teI10rXFwkLywKICAgICAgICB0b2tlbjogbnVsbAogICAgICB9LAogICAgICB7CiAgICAgICAgLy8gTWF0Y2ggZXZlcnl0aGluZyBleGNlcHQgZm9yIHRoZSBpbmxpbmUgY29tbWVudAogICAgICAgIHJlZ2V4OiAvW14jXSsvLAogICAgICAgIHRva2VuOiBudWxsLAogICAgICAgIG5leHQ6ICJzdGFydCIKICAgICAgfSwKICAgICAgewogICAgICAgIHJlZ2V4OiAvJC8sCiAgICAgICAgdG9rZW46IG51bGwsCiAgICAgICAgbmV4dDogInN0YXJ0IgogICAgICB9LAogICAgICAvLyBGYWlsIHNhZmUgcmV0dXJuIHRvIHN0YXJ0CiAgICAgIHsKICAgICAgICB0b2tlbjogbnVsbCwKICAgICAgICBuZXh0OiAic3RhcnQiCiAgICAgIH0KICAgIF0sCiAgICAgIG1ldGE6IHsKICAgICAgICAgIGxpbmVDb21tZW50OiAiIyIKICAgICAgfQogIH0pOwoKICBDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveC1kb2NrZXJmaWxlIiwgImRvY2tlcmZpbGUiKTsKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/dockerfile/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogRG9ja2VyZmlsZSBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uLy4uL2FkZG9uL21vZGUvc2ltcGxlLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9ImRvY2tlcmZpbGUuanMiPjwvc2NyaXB0Pgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPi5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazt9PC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aDE+Q29kZU1pcnJvcjwvaDE+PGltZyBpZD1sb2dvIHNyYz0iLi4vLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+TGFuZ3VhZ2UgbW9kZXM8L2E+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPkRvY2tlcmZpbGU8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPkRvY2tlcmZpbGUgbW9kZTwvaDI+Cjxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+IyBJbnN0YWxsIEdob3N0IGJsb2dnaW5nIHBsYXRmb3JtIGFuZCBydW4gZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQKIwojIFZFUlNJT04gMS4wLjAKCkZST00gdWJ1bnR1OjEyLjEwCk1BSU5UQUlORVIgQW1lciBHcmdpYyAiYW1lckBsaXZlYnl0LmVzIgpXT1JLRElSIC9kYXRhL2dob3N0CgojIEluc3RhbGwgZGVwZW5kZW5jaWVzIGZvciBuZ2lueCBpbnN0YWxsYXRpb24KUlVOIGFwdC1nZXQgdXBkYXRlClJVTiBhcHQtZ2V0IGluc3RhbGwgLXkgcHl0aG9uIGcrKyBtYWtlIHNvZnR3YXJlLXByb3BlcnRpZXMtY29tbW9uIC0tZm9yY2UteWVzClJVTiBhZGQtYXB0LXJlcG9zaXRvcnkgcHBhOmNocmlzLWxlYS9ub2RlLmpzClJVTiBhcHQtZ2V0IHVwZGF0ZQojIEluc3RhbGwgdW56aXAKUlVOIGFwdC1nZXQgaW5zdGFsbCAteSB1bnppcAojIEluc3RhbGwgY3VybApSVU4gYXB0LWdldCBpbnN0YWxsIC15IGN1cmwKIyBJbnN0YWxsIG5vZGVqcyAmIG5wbQpSVU4gYXB0LWdldCBpbnN0YWxsIC15IHJsd3JhcApSVU4gYXB0LWdldCBpbnN0YWxsIC15IG5vZGVqcyAKIyBEb3dubG9hZCBHaG9zdCB2MC40LjEKUlVOIGN1cmwgLUwgaHR0cHM6Ly9naG9zdC5vcmcvemlwL2dob3N0LWxhdGVzdC56aXAgLW8gL3RtcC9naG9zdC56aXAKIyBVbnppcCBHaG9zdCB6aXAgdG8gL2RhdGEvZ2hvc3QKUlVOIHVuemlwIC11byAvdG1wL2dob3N0LnppcCAtZCAvZGF0YS9naG9zdAojIEFkZCBjdXN0b20gY29uZmlnIGpzIHRvIC9kYXRhL2dob3N0CkFERCAuL2NvbmZpZy5leGFtcGxlLmpzIC9kYXRhL2dob3N0L2NvbmZpZy5qcwojIEluc3RhbGwgR2hvc3Qgd2l0aCBOUE0KUlVOIGNkIC9kYXRhL2dob3N0LyAmJiBucG0gaW5zdGFsbCAtLXByb2R1Y3Rpb24KIyBFeHBvc2UgcG9ydCAyMzY4CkVYUE9TRSAyMzY4CiMgUnVuIEdob3N0CkNNRCBbIm5wbSIsInN0YXJ0Il0KPC90ZXh0YXJlYT48L2Zvcm0+CgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgICAgICBtb2RlOiAiZG9ja2VyZmlsZSIKICAgICAgfSk7CiAgICA8L3NjcmlwdD4KCiAgICA8cD5Eb2NrZXJmaWxlIHN5bnRheCBoaWdobGlnaHRpbmcgZm9yIENvZGVNaXJyb3IuIERlcGVuZHMgb24KICAgIHRoZSA8YSBocmVmPSIuLi8uLi9kZW1vL3NpbXBsZW1vZGUuaHRtbCI+c2ltcGxlbW9kZTwvYT4gYWRkb24uPC9wPgoKICAgIDxwPjxzdHJvbmc+TUlNRSB0eXBlcyBkZWZpbmVkOjwvc3Ryb25nPiA8Y29kZT50ZXh0L3gtZG9ja2VyZmlsZTwvY29kZT48L3A+CiAgPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/dtd/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/dtd/dtd.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovKgogIERURCBtb2RlCiAgUG9ydGVkIHRvIENvZGVNaXJyb3IgYnkgUGV0ZXIgS3Jvb24gPHBsYWtyb29uQGdtYWlsLmNvbT4KICBSZXBvcnQgYnVncy9pc3N1ZXMgaGVyZTogaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvQ29kZU1pcnJvci9pc3N1ZXMKICBHaXRIdWI6IEBwZXRlcmtyb29uCiovCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJkdGQiLCBmdW5jdGlvbihjb25maWcpIHsKICB2YXIgaW5kZW50VW5pdCA9IGNvbmZpZy5pbmRlbnRVbml0LCB0eXBlOwogIGZ1bmN0aW9uIHJldChzdHlsZSwgdHApIHt0eXBlID0gdHA7IHJldHVybiBzdHlsZTt9CgogIGZ1bmN0aW9uIHRva2VuQmFzZShzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpOwoKICAgIGlmIChjaCA9PSAiPCIgJiYgc3RyZWFtLmVhdCgiISIpICkgewogICAgICBpZiAoc3RyZWFtLmVhdFdoaWxlKC9bXC1dLykpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuU0dNTENvbW1lbnQ7CiAgICAgICAgcmV0dXJuIHRva2VuU0dNTENvbW1lbnQoc3RyZWFtLCBzdGF0ZSk7CiAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLmVhdFdoaWxlKC9bXHddLykpIHJldHVybiByZXQoImtleXdvcmQiLCAiZG9pbmRlbnQiKTsKICAgIH0gZWxzZSBpZiAoY2ggPT0gIjwiICYmIHN0cmVhbS5lYXQoIj8iKSkgeyAvL3htbCBkZWNsYXJhdGlvbgogICAgICBzdGF0ZS50b2tlbml6ZSA9IGluQmxvY2soIm1ldGEiLCAiPz4iKTsKICAgICAgcmV0dXJuIHJldCgibWV0YSIsIGNoKTsKICAgIH0gZWxzZSBpZiAoY2ggPT0gIiMiICYmIHN0cmVhbS5lYXRXaGlsZSgvW1x3XS8pKSByZXR1cm4gcmV0KCJhdG9tIiwgInRhZyIpOwogICAgZWxzZSBpZiAoY2ggPT0gInwiKSByZXR1cm4gcmV0KCJrZXl3b3JkIiwgInNlcGVyYXRvciIpOwogICAgZWxzZSBpZiAoY2gubWF0Y2goL1tcKFwpXFtcXVwtXC4sXCtcPz5dLykpIHJldHVybiByZXQobnVsbCwgY2gpOy8vaWYoY2ggPT09ICI+IikgcmV0dXJuIHJldChudWxsLCAiZW5kdGFnIik7IGVsc2UKICAgIGVsc2UgaWYgKGNoLm1hdGNoKC9bXFtcXV0vKSkgcmV0dXJuIHJldCgicnVsZSIsIGNoKTsKICAgIGVsc2UgaWYgKGNoID09ICJcIiIgfHwgY2ggPT0gIiciKSB7CiAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5TdHJpbmcoY2gpOwogICAgICByZXR1cm4gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CiAgICB9IGVsc2UgaWYgKHN0cmVhbS5lYXRXaGlsZSgvW2EtekEtWlw/XCtcZF0vKSkgewogICAgICB2YXIgc2MgPSBzdHJlYW0uY3VycmVudCgpOwogICAgICBpZiggc2Muc3Vic3RyKHNjLmxlbmd0aC0xLHNjLmxlbmd0aCkubWF0Y2goL1w/fFwrLykgIT09IG51bGwgKXN0cmVhbS5iYWNrVXAoMSk7CiAgICAgIHJldHVybiByZXQoInRhZyIsICJ0YWciKTsKICAgIH0gZWxzZSBpZiAoY2ggPT0gIiUiIHx8IGNoID09ICIqIiApIHJldHVybiByZXQoIm51bWJlciIsICJudW1iZXIiKTsKICAgIGVsc2UgewogICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcd1xcXC1fJS57LF0vKTsKICAgICAgcmV0dXJuIHJldChudWxsLCBudWxsKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHRva2VuU0dNTENvbW1lbnQoc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIGRhc2hlcyA9IDAsIGNoOwogICAgd2hpbGUgKChjaCA9IHN0cmVhbS5uZXh0KCkpICE9IG51bGwpIHsKICAgICAgaWYgKGRhc2hlcyA+PSAyICYmIGNoID09ICI+IikgewogICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGRhc2hlcyA9IChjaCA9PSAiLSIpID8gZGFzaGVzICsgMSA6IDA7CiAgICB9CiAgICByZXR1cm4gcmV0KCJjb21tZW50IiwgImNvbW1lbnQiKTsKICB9CgogIGZ1bmN0aW9uIHRva2VuU3RyaW5nKHF1b3RlKSB7CiAgICByZXR1cm4gZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICB2YXIgZXNjYXBlZCA9IGZhbHNlLCBjaDsKICAgICAgd2hpbGUgKChjaCA9IHN0cmVhbS5uZXh0KCkpICE9IG51bGwpIHsKICAgICAgICBpZiAoY2ggPT0gcXVvdGUgJiYgIWVzY2FwZWQpIHsKICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGVzY2FwZWQgPSAhZXNjYXBlZCAmJiBjaCA9PSAiXFwiOwogICAgICB9CiAgICAgIHJldHVybiByZXQoInN0cmluZyIsICJ0YWciKTsKICAgIH07CiAgfQoKICBmdW5jdGlvbiBpbkJsb2NrKHN0eWxlLCB0ZXJtaW5hdG9yKSB7CiAgICByZXR1cm4gZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICB3aGlsZSAoIXN0cmVhbS5lb2woKSkgewogICAgICAgIGlmIChzdHJlYW0ubWF0Y2godGVybWluYXRvcikpIHsKICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHN0eWxlOwogICAgfTsKICB9CgogIHJldHVybiB7CiAgICBzdGFydFN0YXRlOiBmdW5jdGlvbihiYXNlKSB7CiAgICAgIHJldHVybiB7dG9rZW5pemU6IHRva2VuQmFzZSwKICAgICAgICAgICAgICBiYXNlSW5kZW50OiBiYXNlIHx8IDAsCiAgICAgICAgICAgICAgc3RhY2s6IFtdfTsKICAgIH0sCgogICAgdG9rZW46IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgaWYgKHN0cmVhbS5lYXRTcGFjZSgpKSByZXR1cm4gbnVsbDsKICAgICAgdmFyIHN0eWxlID0gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CgogICAgICB2YXIgY29udGV4dCA9IHN0YXRlLnN0YWNrW3N0YXRlLnN0YWNrLmxlbmd0aC0xXTsKICAgICAgaWYgKHN0cmVhbS5jdXJyZW50KCkgPT0gIlsiIHx8IHR5cGUgPT09ICJkb2luZGVudCIgfHwgdHlwZSA9PSAiWyIpIHN0YXRlLnN0YWNrLnB1c2goInJ1bGUiKTsKICAgICAgZWxzZSBpZiAodHlwZSA9PT0gImVuZHRhZyIpIHN0YXRlLnN0YWNrW3N0YXRlLnN0YWNrLmxlbmd0aC0xXSA9ICJlbmR0YWciOwogICAgICBlbHNlIGlmIChzdHJlYW0uY3VycmVudCgpID09ICJdIiB8fCB0eXBlID09ICJdIiB8fCAodHlwZSA9PSAiPiIgJiYgY29udGV4dCA9PSAicnVsZSIpKSBzdGF0ZS5zdGFjay5wb3AoKTsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAiWyIpIHN0YXRlLnN0YWNrLnB1c2goIlsiKTsKICAgICAgcmV0dXJuIHN0eWxlOwogICAgfSwKCiAgICBpbmRlbnQ6IGZ1bmN0aW9uKHN0YXRlLCB0ZXh0QWZ0ZXIpIHsKICAgICAgdmFyIG4gPSBzdGF0ZS5zdGFjay5sZW5ndGg7CgogICAgICBpZiggdGV4dEFmdGVyLm1hdGNoKC9cXVxzK3xcXS8pICluPW4tMTsKICAgICAgZWxzZSBpZih0ZXh0QWZ0ZXIuc3Vic3RyKHRleHRBZnRlci5sZW5ndGgtMSwgdGV4dEFmdGVyLmxlbmd0aCkgPT09ICI+Iil7CiAgICAgICAgaWYodGV4dEFmdGVyLnN1YnN0cigwLDEpID09PSAiPCIpIHt9CiAgICAgICAgZWxzZSBpZiggdHlwZSA9PSAiZG9pbmRlbnQiICYmIHRleHRBZnRlci5sZW5ndGggPiAxICkge30KICAgICAgICBlbHNlIGlmKCB0eXBlID09ICJkb2luZGVudCIpbi0tOwogICAgICAgIGVsc2UgaWYoIHR5cGUgPT0gIj4iICYmIHRleHRBZnRlci5sZW5ndGggPiAxKSB7fQogICAgICAgIGVsc2UgaWYoIHR5cGUgPT0gInRhZyIgJiYgdGV4dEFmdGVyICE9PSAiPiIpIHt9CiAgICAgICAgZWxzZSBpZiggdHlwZSA9PSAidGFnIiAmJiBzdGF0ZS5zdGFja1tzdGF0ZS5zdGFjay5sZW5ndGgtMV0gPT0gInJ1bGUiKW4tLTsKICAgICAgICBlbHNlIGlmKCB0eXBlID09ICJ0YWciKW4rKzsKICAgICAgICBlbHNlIGlmKCB0ZXh0QWZ0ZXIgPT09ICI+IiAmJiBzdGF0ZS5zdGFja1tzdGF0ZS5zdGFjay5sZW5ndGgtMV0gPT0gInJ1bGUiICYmIHR5cGUgPT09ICI+IiluLS07CiAgICAgICAgZWxzZSBpZiggdGV4dEFmdGVyID09PSAiPiIgJiYgc3RhdGUuc3RhY2tbc3RhdGUuc3RhY2subGVuZ3RoLTFdID09ICJydWxlIikge30KICAgICAgICBlbHNlIGlmKCB0ZXh0QWZ0ZXIuc3Vic3RyKDAsMSkgIT09ICI8IiAmJiB0ZXh0QWZ0ZXIuc3Vic3RyKDAsMSkgPT09ICI+IiApbj1uLTE7CiAgICAgICAgZWxzZSBpZiggdGV4dEFmdGVyID09PSAiPiIpIHt9CiAgICAgICAgZWxzZSBuPW4tMTsKICAgICAgICAvL292ZXIgcnVsZSB0aGVtIGFsbAogICAgICAgIGlmKHR5cGUgPT0gbnVsbCB8fCB0eXBlID09ICJdIiluLS07CiAgICAgIH0KCiAgICAgIHJldHVybiBzdGF0ZS5iYXNlSW5kZW50ICsgbiAqIGluZGVudFVuaXQ7CiAgICB9LAoKICAgIGVsZWN0cmljQ2hhcnM6ICJdPiIKICB9Owp9KTsKCkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgiYXBwbGljYXRpb24veG1sLWR0ZCIsICJkdGQiKTsKCn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/dtd/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogRFREIG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iZHRkLmpzIj48L3NjcmlwdD4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4uQ29kZU1pcnJvciB7Ym9yZGVyLXRvcDogMXB4IHNvbGlkIGJsYWNrOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGgxPkNvZGVNaXJyb3I8L2gxPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5EVEQ8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPkRURCBtb2RlPC9oMj4KPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj48P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgoKPCFBVFRMSVNUIHRpdGxlCiAgeG1sbnMJQ0RBVEEJI0ZJWEVECSJodHRwOi8vZG9jYm9vay5vcmcvbnMvZG9jYm9vayIKICByb2xlCUNEQVRBCSNJTVBMSUVECiAgJWRiLmNvbW1vbi5hdHRyaWJ1dGVzOwogICVkYi5jb21tb24ubGlua2luZy5hdHRyaWJ1dGVzOwo+Cgo8IS0tCiAgVHJ5OiBodHRwOi8vZG9jYm9vay5vcmcveG1sLzUuMC9kdGQvZG9jYm9vay5kdGQKLS0+Cgo8IURPQ1RZUEUgeHNsOnN0eWxlc2hlZXQKICBbCiAgICA8IUVOVElUWSBuYnNwICAgIiZhbXA7IzE2MDsiPgogICAgPCFFTlRJVFkgY29weSAgICImYW1wOyMxNjk7Ij4KICAgIDwhRU5USVRZIHJlZyAgICAiJmFtcDsjMTc0OyI+CiAgICA8IUVOVElUWSB0cmFkZSAgIiZhbXA7Izg0ODI7Ij4KICAgIDwhRU5USVRZIG1kYXNoICAiJmFtcDsjODIxMjsiPgogICAgPCFFTlRJVFkgbGRxdW8gICImYW1wOyM4MjIwOyI+CiAgICA8IUVOVElUWSByZHF1byAgIiZhbXA7IzgyMjE7Ij4KICAgIDwhRU5USVRZIHBvdW5kICAiJmFtcDsjMTYzOyI+CiAgICA8IUVOVElUWSB5ZW4gICAgIiZhbXA7IzE2NTsiPgogICAgPCFFTlRJVFkgZXVybyAgICImYW1wOyM4MzY0OyI+CiAgICA8IUVOVElUWSBtYXRobWwgImh0dHA6Ly93d3cudzMub3JnLzE5OTgvTWF0aC9NYXRoTUwiPgogIF0KPgoKPCFFTEVNRU5UIHRpdGxlICgjUENEQVRBfGlubGluZW1lZGlhb2JqZWN0fHJlbWFya3xzdXBlcnNjcmlwdHxzdWJzY3JpcHR8eHJlZnxsaW5rfG9saW5rfGFuY2hvcnxiaWJsaW9yZWZ8YWx0fGFubm90YXRpb258aW5kZXh0ZXJtfGFiYnJldnxhY3JvbnltfGRhdGV8ZW1waGFzaXN8Zm9vdG5vdGV8Zm9vdG5vdGVyZWZ8Zm9yZWlnbnBocmFzZXxwaHJhc2V8cXVvdGV8d29yZGFzd29yZHxmaXJzdHRlcm18Z2xvc3N0ZXJtfGNvcmVmfHRyYWRlbWFya3xwcm9kdWN0bnVtYmVyfHByb2R1Y3RuYW1lfGRhdGFiYXNlfGFwcGxpY2F0aW9ufGhhcmR3YXJlfGNpdGF0aW9ufGNpdGVyZWZlbnRyeXxjaXRldGl0bGV8Y2l0ZWJpYmxpb2lkfGF1dGhvcnxwZXJzb258cGVyc29ubmFtZXxvcmd8b3JnbmFtZXxlZGl0b3J8am9idGl0bGV8cmVwbGFjZWFibGV8cGFja2FnZXxwYXJhbWV0ZXJ8dGVybWRlZnxub250ZXJtaW5hbHxzeXN0ZW1pdGVtfG9wdGlvbnxvcHRpb25hbHxwcm9wZXJ0eXxpbmxpbmVlcXVhdGlvbnx0YWd8bWFya3VwfHRva2VufHN5bWJvbHxsaXRlcmFsfGNvZGV8Y29uc3RhbnR8ZW1haWx8dXJpfGd1aWljb258Z3VpYnV0dG9ufGd1aW1lbnVpdGVtfGd1aW1lbnV8Z3Vpc3VibWVudXxndWlsYWJlbHxtZW51Y2hvaWNlfG1vdXNlYnV0dG9ufGtleWNvbWJvfGtleWNhcHxrZXljb2RlfGtleXN5bXxzaG9ydGN1dHxhY2NlbHxwcm9tcHR8ZW52YXJ8ZmlsZW5hbWV8Y29tbWFuZHxjb21wdXRlcm91dHB1dHx1c2VyaW5wdXR8ZnVuY3Rpb258dmFybmFtZXxyZXR1cm52YWx1ZXx0eXBlfGNsYXNzbmFtZXxleGNlcHRpb25uYW1lfGludGVyZmFjZW5hbWV8bWV0aG9kbmFtZXxtb2RpZmllcnxpbml0aWFsaXplcnxvb2NsYXNzfG9vZXhjZXB0aW9ufG9vaW50ZXJmYWNlfGVycm9yY29kZXxlcnJvcnRleHR8ZXJyb3JuYW1lfGVycm9ydHlwZSkqPgoKPCFFTlRJVFkgJSBkYi5jb21tb24uYXR0cmlidXRlcyAiCiAgeG1sOmlkCUlECSNJTVBMSUVECiAgdmVyc2lvbglDREFUQQkjSU1QTElFRAogIHhtbDpsYW5nCUNEQVRBCSNJTVBMSUVECiAgeG1sOmJhc2UJQ0RBVEEJI0lNUExJRUQKICByZW1hcAlDREFUQQkjSU1QTElFRAogIHhyZWZsYWJlbAlDREFUQQkjSU1QTElFRAogIHJldmlzaW9uZmxhZwkoY2hhbmdlZHxhZGRlZHxkZWxldGVkfG9mZikJI0lNUExJRUQKICBkaXIJKGx0cnxydGx8bHJvfHJsbykJI0lNUExJRUQKICBhcmNoCUNEQVRBCSNJTVBMSUVECiAgYXVkaWVuY2UJQ0RBVEEJI0lNUExJRUQKICBjb25kaXRpb24JQ0RBVEEJI0lNUExJRUQKICBjb25mb3JtYW5jZQlDREFUQQkjSU1QTElFRAogIG9zCUNEQVRBCSNJTVBMSUVECiAgcmV2aXNpb24JQ0RBVEEJI0lNUExJRUQKICBzZWN1cml0eQlDREFUQQkjSU1QTElFRAogIHVzZXJsZXZlbAlDREFUQQkjSU1QTElFRAogIHZlbmRvcglDREFUQQkjSU1QTElFRAogIHdvcmRzaXplCUNEQVRBCSNJTVBMSUVECiAgYW5ub3RhdGlvbnMJQ0RBVEEJI0lNUExJRUQKCiI+PC90ZXh0YXJlYT48L2Zvcm0+CiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgICAgIG1vZGU6IHtuYW1lOiAiZHRkIiwgYWxpZ25DREFUQTogdHJ1ZX0sCiAgICAgICAgbGluZU51bWJlcnM6IHRydWUsCiAgICAgICAgbGluZVdyYXBwaW5nOiB0cnVlCiAgICAgIH0pOwogICAgPC9zY3JpcHQ+CgogICAgPHA+PHN0cm9uZz5NSU1FIHR5cGVzIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPmFwcGxpY2F0aW9uL3htbC1kdGQ8L2NvZGU+LjwvcD4KICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/dylan/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/dylan/dylan.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJkeWxhbiIsIGZ1bmN0aW9uKF9jb25maWcpIHsKICAvLyBXb3JkcwogIHZhciB3b3JkcyA9IHsKICAgIC8vIFdvcmRzIHRoYXQgaW50cm9kdWNlIHVubmFtZWQgZGVmaW5pdGlvbnMgbGlrZSAiZGVmaW5lIGludGVyZmFjZSIKICAgIHVubmFtZWREZWZpbml0aW9uOiBbImludGVyZmFjZSJdLAoKICAgIC8vIFdvcmRzIHRoYXQgaW50cm9kdWNlIHNpbXBsZSBuYW1lZCBkZWZpbml0aW9ucyBsaWtlICJkZWZpbmUgbGlicmFyeSIKICAgIG5hbWVkRGVmaW5pdGlvbjogWyJtb2R1bGUiLCAibGlicmFyeSIsICJtYWNybyIsCiAgICAgICAgICAgICAgICAgICAgICAiQy1zdHJ1Y3QiLCAiQy11bmlvbiIsCiAgICAgICAgICAgICAgICAgICAgICAiQy1mdW5jdGlvbiIsICJDLWNhbGxhYmxlLXdyYXBwZXIiCiAgICAgICAgICAgICAgICAgICAgIF0sCgogICAgLy8gV29yZHMgdGhhdCBpbnRyb2R1Y2UgdHlwZSBkZWZpbml0aW9ucyBsaWtlICJkZWZpbmUgY2xhc3MiLgogICAgLy8gVGhlc2UgYXJlIGFsc28gcGFyYW1ldGVyaXplZCBsaWtlICJkZWZpbmUgbWV0aG9kIiBhbmQgYXJlCiAgICAvLyBhcHBlbmRlZCB0byBvdGhlclBhcmFtZXRlcml6ZWREZWZpbml0aW9uV29yZHMKICAgIHR5cGVQYXJhbWV0ZXJpemVkRGVmaW5pdGlvbjogWyJjbGFzcyIsICJDLXN1YnR5cGUiLCAiQy1tYXBwZWQtc3VidHlwZSJdLAoKICAgIC8vIFdvcmRzIHRoYXQgaW50cm9kdWNlIHRyaWNraWVyIGRlZmluaXRpb25zIGxpa2UgImRlZmluZSBtZXRob2QiLgogICAgLy8gVGhlc2UgcmVxdWlyZSBzcGVjaWFsIGRlZmluaXRpb25zIHRvIGJlIGFkZGVkIHRvIHN0YXJ0RXhwcmVzc2lvbnMKICAgIG90aGVyUGFyYW1ldGVyaXplZERlZmluaXRpb246IFsibWV0aG9kIiwgImZ1bmN0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQy12YXJpYWJsZSIsICJDLWFkZHJlc3MiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLAoKICAgIC8vIFdvcmRzIHRoYXQgaW50cm9kdWNlIG1vZHVsZSBjb25zdGFudCBkZWZpbml0aW9ucy4KICAgIC8vIFRoZXNlIG11c3QgYWxzbyBiZSBzaW1wbGUgZGVmaW5pdGlvbnMgYW5kIGFyZQogICAgLy8gYXBwZW5kZWQgdG8gb3RoZXJTaW1wbGVEZWZpbml0aW9uV29yZHMKICAgIGNvbnN0YW50U2ltcGxlRGVmaW5pdGlvbjogWyJjb25zdGFudCJdLAoKICAgIC8vIFdvcmRzIHRoYXQgaW50cm9kdWNlIG1vZHVsZSB2YXJpYWJsZSBkZWZpbml0aW9ucy4KICAgIC8vIFRoZXNlIG11c3QgYWxzbyBiZSBzaW1wbGUgZGVmaW5pdGlvbnMgYW5kIGFyZQogICAgLy8gYXBwZW5kZWQgdG8gb3RoZXJTaW1wbGVEZWZpbml0aW9uV29yZHMKICAgIHZhcmlhYmxlU2ltcGxlRGVmaW5pdGlvbjogWyJ2YXJpYWJsZSJdLAoKICAgIC8vIE90aGVyIHdvcmRzIHRoYXQgaW50cm9kdWNlIHNpbXBsZSBkZWZpbml0aW9ucwogICAgLy8gKHdpdGhvdXQgaW1wbGljaXQgYm9kaWVzKS4KICAgIG90aGVyU2ltcGxlRGVmaW5pdGlvbjogWyJnZW5lcmljIiwgImRvbWFpbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQy1wb2ludGVyLXR5cGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgInRhYmxlIgogICAgICAgICAgICAgICAgICAgICAgICAgICBdLAoKICAgIC8vIFdvcmRzIHRoYXQgYmVnaW4gc3RhdGVtZW50cyB3aXRoIGltcGxpY2l0IGJvZGllcy4KICAgIHN0YXRlbWVudDogWyJpZiIsICJibG9jayIsICJiZWdpbiIsICJtZXRob2QiLCAiY2FzZSIsCiAgICAgICAgICAgICAgICAiZm9yIiwgInNlbGVjdCIsICJ3aGVuIiwgInVubGVzcyIsICJ1bnRpbCIsCiAgICAgICAgICAgICAgICAid2hpbGUiLCAiaXRlcmF0ZSIsICJwcm9maWxpbmciLCAiZHluYW1pYy1iaW5kIgogICAgICAgICAgICAgICBdLAoKICAgIC8vIFBhdHRlcm5zIHRoYXQgYWN0IGFzIHNlcGFyYXRvcnMgaW4gY29tcG91bmQgc3RhdGVtZW50cy4KICAgIC8vIFRoaXMgbWF5IGluY2x1ZGUgYW55IGdlbmVyYWwgcGF0dGVybiB0aGF0IG11c3QgYmUgaW5kZW50ZWQKICAgIC8vIHNwZWNpYWxseS4KICAgIHNlcGFyYXRvcjogWyJmaW5hbGx5IiwgImV4Y2VwdGlvbiIsICJjbGVhbnVwIiwgImVsc2UiLAogICAgICAgICAgICAgICAgImVsc2VpZiIsICJhZnRlcndhcmRzIgogICAgICAgICAgICAgICBdLAoKICAgIC8vIEtleXdvcmRzIHRoYXQgZG8gbm90IHJlcXVpcmUgc3BlY2lhbCBpbmRlbnRhdGlvbiBoYW5kbGluZywKICAgIC8vIGJ1dCB3aGljaCBzaG91bGQgYmUgaGlnaGxpZ2h0ZWQKICAgIG90aGVyOiBbImFib3ZlIiwgImJlbG93IiwgImJ5IiwgImZyb20iLCAiaGFuZGxlciIsICJpbiIsCiAgICAgICAgICAgICJpbnN0YW5jZSIsICJsZXQiLCAibG9jYWwiLCAib3RoZXJ3aXNlIiwgInNsb3QiLAogICAgICAgICAgICAic3ViY2xhc3MiLCAidGhlbiIsICJ0byIsICJrZXllZC1ieSIsICJ2aXJ0dWFsIgogICAgICAgICAgIF0sCgogICAgLy8gQ29uZGl0aW9uIHNpZ25hbGluZyBmdW5jdGlvbiBjYWxscwogICAgc2lnbmFsaW5nQ2FsbHM6IFsic2lnbmFsIiwgImVycm9yIiwgImNlcnJvciIsCiAgICAgICAgICAgICAgICAgICAgICJicmVhayIsICJjaGVjay10eXBlIiwgImFib3J0IgogICAgICAgICAgICAgICAgICAgIF0KICB9OwoKICB3b3Jkc1sib3RoZXJEZWZpbml0aW9uIl0gPQogICAgd29yZHNbInVubmFtZWREZWZpbml0aW9uIl0KICAgIC5jb25jYXQod29yZHNbIm5hbWVkRGVmaW5pdGlvbiJdKQogICAgLmNvbmNhdCh3b3Jkc1sib3RoZXJQYXJhbWV0ZXJpemVkRGVmaW5pdGlvbiJdKTsKCiAgd29yZHNbImRlZmluaXRpb24iXSA9CiAgICB3b3Jkc1sidHlwZVBhcmFtZXRlcml6ZWREZWZpbml0aW9uIl0KICAgIC5jb25jYXQod29yZHNbIm90aGVyRGVmaW5pdGlvbiJdKTsKCiAgd29yZHNbInBhcmFtZXRlcml6ZWREZWZpbml0aW9uIl0gPQogICAgd29yZHNbInR5cGVQYXJhbWV0ZXJpemVkRGVmaW5pdGlvbiJdCiAgICAuY29uY2F0KHdvcmRzWyJvdGhlclBhcmFtZXRlcml6ZWREZWZpbml0aW9uIl0pOwoKICB3b3Jkc1sic2ltcGxlRGVmaW5pdGlvbiJdID0KICAgIHdvcmRzWyJjb25zdGFudFNpbXBsZURlZmluaXRpb24iXQogICAgLmNvbmNhdCh3b3Jkc1sidmFyaWFibGVTaW1wbGVEZWZpbml0aW9uIl0pCiAgICAuY29uY2F0KHdvcmRzWyJvdGhlclNpbXBsZURlZmluaXRpb24iXSk7CgogIHdvcmRzWyJrZXl3b3JkIl0gPQogICAgd29yZHNbInN0YXRlbWVudCJdCiAgICAuY29uY2F0KHdvcmRzWyJzZXBhcmF0b3IiXSkKICAgIC5jb25jYXQod29yZHNbIm90aGVyIl0pOwoKICAvLyBQYXR0ZXJucwogIHZhciBzeW1ib2xQYXR0ZXJuID0gIlstX2EtekEtWj8hKkA8PiQlXSsiOwogIHZhciBzeW1ib2wgPSBuZXcgUmVnRXhwKCJeIiArIHN5bWJvbFBhdHRlcm4pOwogIHZhciBwYXR0ZXJucyA9IHsKICAgIC8vIFN5bWJvbHMgd2l0aCBzcGVjaWFsIHN5bnRheAogICAgc3ltYm9sS2V5d29yZDogc3ltYm9sUGF0dGVybiArICI6IiwKICAgIHN5bWJvbENsYXNzOiAiPCIgKyBzeW1ib2xQYXR0ZXJuICsgIj4iLAogICAgc3ltYm9sR2xvYmFsOiAiXFwqIiArIHN5bWJvbFBhdHRlcm4gKyAiXFwqIiwKICAgIHN5bWJvbENvbnN0YW50OiAiXFwkIiArIHN5bWJvbFBhdHRlcm4KICB9OwogIHZhciBwYXR0ZXJuU3R5bGVzID0gewogICAgc3ltYm9sS2V5d29yZDogImF0b20iLAogICAgc3ltYm9sQ2xhc3M6ICJ0YWciLAogICAgc3ltYm9sR2xvYmFsOiAidmFyaWFibGUtMiIsCiAgICBzeW1ib2xDb25zdGFudDogInZhcmlhYmxlLTMiCiAgfTsKCiAgLy8gQ29tcGlsZSBhbGwgcGF0dGVybnMgdG8gcmVndWxhciBleHByZXNzaW9ucwogIGZvciAodmFyIHBhdHRlcm5OYW1lIGluIHBhdHRlcm5zKQogICAgaWYgKHBhdHRlcm5zLmhhc093blByb3BlcnR5KHBhdHRlcm5OYW1lKSkKICAgICAgcGF0dGVybnNbcGF0dGVybk5hbWVdID0gbmV3IFJlZ0V4cCgiXiIgKyBwYXR0ZXJuc1twYXR0ZXJuTmFtZV0pOwoKICAvLyBOYW1lcyBiZWdpbm5pbmcgIndpdGgtIiBhbmQgIndpdGhvdXQtIiBhcmUgY29tbW9ubHkKICAvLyB1c2VkIGFzIHN0YXRlbWVudCBtYWNybwogIHBhdHRlcm5zWyJrZXl3b3JkIl0gPSBbL153aXRoKD86b3V0KT8tWy1fYS16QS1aPyEqQDw+JCVdKy9dOwoKICB2YXIgc3R5bGVzID0ge307CiAgc3R5bGVzWyJrZXl3b3JkIl0gPSAia2V5d29yZCI7CiAgc3R5bGVzWyJkZWZpbml0aW9uIl0gPSAiZGVmIjsKICBzdHlsZXNbInNpbXBsZURlZmluaXRpb24iXSA9ICJkZWYiOwogIHN0eWxlc1sic2lnbmFsaW5nQ2FsbHMiXSA9ICJidWlsdGluIjsKCiAgLy8gcHJvdGVjdGVkIHdvcmRzIGxvb2t1cCB0YWJsZQogIHZhciB3b3JkTG9va3VwID0ge307CiAgdmFyIHN0eWxlTG9va3VwID0ge307CgogIFsKICAgICJrZXl3b3JkIiwKICAgICJkZWZpbml0aW9uIiwKICAgICJzaW1wbGVEZWZpbml0aW9uIiwKICAgICJzaWduYWxpbmdDYWxscyIKICBdLmZvckVhY2goZnVuY3Rpb24odHlwZSkgewogICAgd29yZHNbdHlwZV0uZm9yRWFjaChmdW5jdGlvbih3b3JkKSB7CiAgICAgIHdvcmRMb29rdXBbd29yZF0gPSB0eXBlOwogICAgICBzdHlsZUxvb2t1cFt3b3JkXSA9IHN0eWxlc1t0eXBlXTsKICAgIH0pOwogIH0pOwoKCiAgZnVuY3Rpb24gY2hhaW4oc3RyZWFtLCBzdGF0ZSwgZikgewogICAgc3RhdGUudG9rZW5pemUgPSBmOwogICAgcmV0dXJuIGYoc3RyZWFtLCBzdGF0ZSk7CiAgfQoKICBmdW5jdGlvbiB0b2tlbkJhc2Uoc3RyZWFtLCBzdGF0ZSkgewogICAgLy8gU3RyaW5nCiAgICB2YXIgY2ggPSBzdHJlYW0ucGVlaygpOwogICAgaWYgKGNoID09ICInIiB8fCBjaCA9PSAnIicpIHsKICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgcmV0dXJuIGNoYWluKHN0cmVhbSwgc3RhdGUsIHRva2VuU3RyaW5nKGNoLCAic3RyaW5nIikpOwogICAgfQogICAgLy8gQ29tbWVudAogICAgZWxzZSBpZiAoY2ggPT0gIi8iKSB7CiAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgIGlmIChzdHJlYW0uZWF0KCIqIikpIHsKICAgICAgICByZXR1cm4gY2hhaW4oc3RyZWFtLCBzdGF0ZSwgdG9rZW5Db21tZW50KTsKICAgICAgfSBlbHNlIGlmIChzdHJlYW0uZWF0KCIvIikpIHsKICAgICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICAgICAgcmV0dXJuICJjb21tZW50IjsKICAgICAgfQogICAgICBzdHJlYW0uYmFja1VwKDEpOwogICAgfQogICAgLy8gRGVjaW1hbAogICAgZWxzZSBpZiAoL1srXC1cZFwuXS8udGVzdChjaCkpIHsKICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXlsrLV0/WzAtOV0qXC5bMC05XSooW2VzZHhdWystXT9bMC05XSspPy9pKSB8fAogICAgICAgICAgc3RyZWFtLm1hdGNoKC9eWystXT9bMC05XSsoW2VzZHhdWystXT9bMC05XSspL2kpIHx8CiAgICAgICAgICBzdHJlYW0ubWF0Y2goL15bKy1dP1xkKy8pKSB7CiAgICAgICAgcmV0dXJuICJudW1iZXIiOwogICAgICB9CiAgICB9CiAgICAvLyBIYXNoCiAgICBlbHNlIGlmIChjaCA9PSAiIyIpIHsKICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgLy8gU3ltYm9sIHdpdGggc3RyaW5nIHN5bnRheAogICAgICBjaCA9IHN0cmVhbS5wZWVrKCk7CiAgICAgIGlmIChjaCA9PSAnIicpIHsKICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgIHJldHVybiBjaGFpbihzdHJlYW0sIHN0YXRlLCB0b2tlblN0cmluZygnIicsICJzdHJpbmciKSk7CiAgICAgIH0KICAgICAgLy8gQmluYXJ5IG51bWJlcgogICAgICBlbHNlIGlmIChjaCA9PSAiYiIpIHsKICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvWzAxXS8pOwogICAgICAgIHJldHVybiAibnVtYmVyIjsKICAgICAgfQogICAgICAvLyBIZXggbnVtYmVyCiAgICAgIGVsc2UgaWYgKGNoID09ICJ4IikgewogICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXGRhLWZdL2kpOwogICAgICAgIHJldHVybiAibnVtYmVyIjsKICAgICAgfQogICAgICAvLyBPY3RhbCBudW1iZXIKICAgICAgZWxzZSBpZiAoY2ggPT0gIm8iKSB7CiAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1swLTddLyk7CiAgICAgICAgcmV0dXJuICJudW1iZXIiOwogICAgICB9CiAgICAgIC8vIFRva2VuIGNvbmNhdGVuYXRpb24gaW4gbWFjcm9zCiAgICAgIGVsc2UgaWYgKGNoID09ICcjJykgewogICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgcmV0dXJuICJwdW5jdHVhdGlvbiI7CiAgICAgIH0KICAgICAgLy8gU2VxdWVuY2UgbGl0ZXJhbHMKICAgICAgZWxzZSBpZiAoKGNoID09ICdbJykgfHwgKGNoID09ICcoJykpIHsKICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgIHJldHVybiAiYnJhY2tldCI7CiAgICAgIC8vIEhhc2ggc3ltYm9sCiAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLm1hdGNoKC9mfHR8YWxsLWtleXN8aW5jbHVkZXxrZXl8bmV4dHxyZXN0L2kpKSB7CiAgICAgICAgcmV0dXJuICJhdG9tIjsKICAgICAgfSBlbHNlIHsKICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1stYS16QS1aXS8pOwogICAgICAgIHJldHVybiAiZXJyb3IiOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGNoID09ICJ+IikgewogICAgICBzdHJlYW0ubmV4dCgpOwogICAgICBjaCA9IHN0cmVhbS5wZWVrKCk7CiAgICAgIGlmIChjaCA9PSAiPSIpIHsKICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgIGNoID0gc3RyZWFtLnBlZWsoKTsKICAgICAgICBpZiAoY2ggPT0gIj0iKSB7CiAgICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgICAgcmV0dXJuICJvcGVyYXRvciI7CiAgICAgICAgfQogICAgICAgIHJldHVybiAib3BlcmF0b3IiOwogICAgICB9CiAgICAgIHJldHVybiAib3BlcmF0b3IiOwogICAgfSBlbHNlIGlmIChjaCA9PSAiOiIpIHsKICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgY2ggPSBzdHJlYW0ucGVlaygpOwogICAgICBpZiAoY2ggPT0gIj0iKSB7CiAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgICByZXR1cm4gIm9wZXJhdG9yIjsKICAgICAgfSBlbHNlIGlmIChjaCA9PSAiOiIpIHsKICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgIHJldHVybiAicHVuY3R1YXRpb24iOwogICAgICB9CiAgICB9IGVsc2UgaWYgKCJbXSgpe30iLmluZGV4T2YoY2gpICE9IC0xKSB7CiAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgIHJldHVybiAiYnJhY2tldCI7CiAgICB9IGVsc2UgaWYgKCIuLCIuaW5kZXhPZihjaCkgIT0gLTEpIHsKICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgcmV0dXJuICJwdW5jdHVhdGlvbiI7CiAgICB9IGVsc2UgaWYgKHN0cmVhbS5tYXRjaCgiZW5kIikpIHsKICAgICAgcmV0dXJuICJrZXl3b3JkIjsKICAgIH0KICAgIGZvciAodmFyIG5hbWUgaW4gcGF0dGVybnMpIHsKICAgICAgaWYgKHBhdHRlcm5zLmhhc093blByb3BlcnR5KG5hbWUpKSB7CiAgICAgICAgdmFyIHBhdHRlcm4gPSBwYXR0ZXJuc1tuYW1lXTsKICAgICAgICBpZiAoKHBhdHRlcm4gaW5zdGFuY2VvZiBBcnJheSAmJiBwYXR0ZXJuLnNvbWUoZnVuY3Rpb24ocCkgewogICAgICAgICAgcmV0dXJuIHN0cmVhbS5tYXRjaChwKTsKICAgICAgICB9KSkgfHwgc3RyZWFtLm1hdGNoKHBhdHRlcm4pKQogICAgICAgICAgcmV0dXJuIHBhdHRlcm5TdHlsZXNbbmFtZV07CiAgICAgIH0KICAgIH0KICAgIGlmICgvWytcLSpcL149PD4mfF0vLnRlc3QoY2gpKSB7CiAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgIHJldHVybiAib3BlcmF0b3IiOwogICAgfQogICAgaWYgKHN0cmVhbS5tYXRjaCgiZGVmaW5lIikpIHsKICAgICAgcmV0dXJuICJkZWYiOwogICAgfSBlbHNlIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXHdcLV0vKTsKICAgICAgLy8gS2V5d29yZAogICAgICBpZiAod29yZExvb2t1cFtzdHJlYW0uY3VycmVudCgpXSkgewogICAgICAgIHJldHVybiBzdHlsZUxvb2t1cFtzdHJlYW0uY3VycmVudCgpXTsKICAgICAgfSBlbHNlIGlmIChzdHJlYW0uY3VycmVudCgpLm1hdGNoKHN5bWJvbCkpIHsKICAgICAgICByZXR1cm4gInZhcmlhYmxlIjsKICAgICAgfSBlbHNlIHsKICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgIHJldHVybiAidmFyaWFibGUtMiI7CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIHRva2VuQ29tbWVudChzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgbWF5YmVFbmQgPSBmYWxzZSwgbWF5YmVOZXN0ZWQgPSBmYWxzZSwgbmVzdGVkQ291bnQgPSAwLCBjaDsKICAgIHdoaWxlICgoY2ggPSBzdHJlYW0ubmV4dCgpKSkgewogICAgICBpZiAoY2ggPT0gIi8iICYmIG1heWJlRW5kKSB7CiAgICAgICAgaWYgKG5lc3RlZENvdW50ID4gMCkgewogICAgICAgICAgbmVzdGVkQ291bnQtLTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoY2ggPT0gIioiICYmIG1heWJlTmVzdGVkKSB7CiAgICAgICAgbmVzdGVkQ291bnQrKzsKICAgICAgfQogICAgICBtYXliZUVuZCA9IChjaCA9PSAiKiIpOwogICAgICBtYXliZU5lc3RlZCA9IChjaCA9PSAiLyIpOwogICAgfQogICAgcmV0dXJuICJjb21tZW50IjsKICB9CgogIGZ1bmN0aW9uIHRva2VuU3RyaW5nKHF1b3RlLCBzdHlsZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgdmFyIGVzY2FwZWQgPSBmYWxzZSwgbmV4dCwgZW5kID0gZmFsc2U7CiAgICAgIHdoaWxlICgobmV4dCA9IHN0cmVhbS5uZXh0KCkpICE9IG51bGwpIHsKICAgICAgICBpZiAobmV4dCA9PSBxdW90ZSAmJiAhZXNjYXBlZCkgewogICAgICAgICAgZW5kID0gdHJ1ZTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBlc2NhcGVkID0gIWVzY2FwZWQgJiYgbmV4dCA9PSAiXFwiOwogICAgICB9CiAgICAgIGlmIChlbmQgfHwgIWVzY2FwZWQpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTsKICAgICAgfQogICAgICByZXR1cm4gc3R5bGU7CiAgICB9OwogIH0KCiAgLy8gSW50ZXJmYWNlCiAgcmV0dXJuIHsKICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gewogICAgICAgIHRva2VuaXplOiB0b2tlbkJhc2UsCiAgICAgICAgY3VycmVudEluZGVudDogMAogICAgICB9OwogICAgfSwKICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIGlmIChzdHJlYW0uZWF0U3BhY2UoKSkKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgdmFyIHN0eWxlID0gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CiAgICAgIHJldHVybiBzdHlsZTsKICAgIH0sCiAgICBibG9ja0NvbW1lbnRTdGFydDogIi8qIiwKICAgIGJsb2NrQ29tbWVudEVuZDogIiovIgogIH07Cn0pOwoKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtZHlsYW4iLCAiZHlsYW4iKTsKCn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/dylan/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogRHlsYW4gbW9kZTwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uLy4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxzY3JpcHQgc3JjPSIuLi8uLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi8uLi9hZGRvbi9lZGl0L21hdGNoYnJhY2tldHMuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vLi4vYWRkb24vY29tbWVudC9jb250aW51ZWNvbW1lbnQuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vLi4vYWRkb24vY29tbWVudC9jb21tZW50LmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9ImR5bGFuLmpzIj48L3NjcmlwdD4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4uQ29kZU1pcnJvciB7Ym9yZGVyLXRvcDogMXB4IHNvbGlkIGJsYWNrOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGgxPkNvZGVNaXJyb3I8L2gxPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5EeWxhbjwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+RHlsYW4gbW9kZTwvaDI+CgoKPGRpdj48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgpNb2R1bGU6ICAgICAgIGxvY2F0b3JzLWludGVybmFscwpTeW5vcHNpczogICAgIEFic3RyYWN0IG1vZGVsaW5nIG9mIGxvY2F0aW9ucwpBdXRob3I6ICAgICAgIEFuZHkgQXJtc3Ryb25nCkNvcHlyaWdodDogICAgT3JpZ2luYWwgQ29kZSBpcyBDb3B5cmlnaHQgKGMpIDE5OTUtMjAwNCBGdW5jdGlvbmFsIE9iamVjdHMsIEluYy4KICAgICAgICAgICAgICBBbGwgcmlnaHRzIHJlc2VydmVkLgpMaWNlbnNlOiAgICAgIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGlzIGRpc3RyaWJ1dGlvbiBmb3IgZGV0YWlscy4KV2FycmFudHk6ICAgICBEaXN0cmlidXRlZCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ECgpkZWZpbmUgb3BlbiBnZW5lcmljIGxvY2F0b3Itc2VydmVyCiAgICAobG9jYXRvciA6OiA8bG9jYXRvcj4pID0+IChzZXJ2ZXIgOjogZmFsc2Utb3IoPHNlcnZlci1sb2NhdG9yPikpOwpkZWZpbmUgb3BlbiBnZW5lcmljIGxvY2F0b3ItaG9zdAogICAgKGxvY2F0b3IgOjogPGxvY2F0b3I+KSA9PiAoaG9zdCA6OiBmYWxzZS1vcig8c3RyaW5nPikpOwpkZWZpbmUgb3BlbiBnZW5lcmljIGxvY2F0b3Itdm9sdW1lCiAgICAobG9jYXRvciA6OiA8bG9jYXRvcj4pID0+ICh2b2x1bWUgOjogZmFsc2Utb3IoPHN0cmluZz4pKTsKZGVmaW5lIG9wZW4gZ2VuZXJpYyBsb2NhdG9yLWRpcmVjdG9yeQogICAgKGxvY2F0b3IgOjogPGxvY2F0b3I+KSA9PiAoZGlyZWN0b3J5IDo6IGZhbHNlLW9yKDxkaXJlY3RvcnktbG9jYXRvcj4pKTsKZGVmaW5lIG9wZW4gZ2VuZXJpYyBsb2NhdG9yLXJlbGF0aXZlPwogICAgKGxvY2F0b3IgOjogPGxvY2F0b3I+KSA9PiAocmVsYXRpdmU/IDo6IDxib29sZWFuPik7CmRlZmluZSBvcGVuIGdlbmVyaWMgbG9jYXRvci1wYXRoCiAgICAobG9jYXRvciA6OiA8bG9jYXRvcj4pID0+IChwYXRoIDo6IDxzZXF1ZW5jZT4pOwpkZWZpbmUgb3BlbiBnZW5lcmljIGxvY2F0b3ItYmFzZQogICAgKGxvY2F0b3IgOjogPGxvY2F0b3I+KSA9PiAoYmFzZSA6OiBmYWxzZS1vcig8c3RyaW5nPikpOwpkZWZpbmUgb3BlbiBnZW5lcmljIGxvY2F0b3ItZXh0ZW5zaW9uCiAgICAobG9jYXRvciA6OiA8bG9jYXRvcj4pID0+IChleHRlbnNpb24gOjogZmFsc2Utb3IoPHN0cmluZz4pKTsKCi8vLyBMb2NhdG9yIGNsYXNzZXMKCmRlZmluZSBvcGVuIGFic3RyYWN0IGNsYXNzIDxkaXJlY3RvcnktbG9jYXRvcj4gKDxwaHlzaWNhbC1sb2NhdG9yPikKZW5kIGNsYXNzIDxkaXJlY3RvcnktbG9jYXRvcj47CgpkZWZpbmUgb3BlbiBhYnN0cmFjdCBjbGFzcyA8ZmlsZS1sb2NhdG9yPiAoPHBoeXNpY2FsLWxvY2F0b3I+KQplbmQgY2xhc3MgPGZpbGUtbG9jYXRvcj47CgpkZWZpbmUgbWV0aG9kIGFzCiAgICAoY2xhc3MgPT0gPGRpcmVjdG9yeS1sb2NhdG9yPiwgc3RyaW5nIDo6IDxzdHJpbmc+KQogPT4gKGxvY2F0b3IgOjogPGRpcmVjdG9yeS1sb2NhdG9yPikKICBhcyg8bmF0aXZlLWRpcmVjdG9yeS1sb2NhdG9yPiwgc3RyaW5nKQplbmQgbWV0aG9kIGFzOwoKZGVmaW5lIG1ldGhvZCBtYWtlCiAgICAoY2xhc3MgPT0gPGRpcmVjdG9yeS1sb2NhdG9yPiwKICAgICAja2V5IHNlcnZlciA6OiBmYWxzZS1vcig8c2VydmVyLWxvY2F0b3I+KSA9ICNmLAogICAgICAgICAgcGF0aCA6OiA8c2VxdWVuY2U+ID0gI1tdLAogICAgICAgICAgcmVsYXRpdmU/IDo6IDxib29sZWFuPiA9ICNmLAogICAgICAgICAgbmFtZSA6OiBmYWxzZS1vcig8c3RyaW5nPikgPSAjZikKID0+IChsb2NhdG9yIDo6IDxkaXJlY3RvcnktbG9jYXRvcj4pCiAgbWFrZSg8bmF0aXZlLWRpcmVjdG9yeS1sb2NhdG9yPiwKICAgICAgIHNlcnZlcjogICAgc2VydmVyLAogICAgICAgcGF0aDogICAgICBwYXRoLAogICAgICAgcmVsYXRpdmU/OiByZWxhdGl2ZT8sCiAgICAgICBuYW1lOiAgICAgIG5hbWUpCmVuZCBtZXRob2QgbWFrZTsKCmRlZmluZSBtZXRob2QgYXMKICAgIChjbGFzcyA9PSA8ZmlsZS1sb2NhdG9yPiwgc3RyaW5nIDo6IDxzdHJpbmc+KQogPT4gKGxvY2F0b3IgOjogPGZpbGUtbG9jYXRvcj4pCiAgYXMoPG5hdGl2ZS1maWxlLWxvY2F0b3I+LCBzdHJpbmcpCmVuZCBtZXRob2QgYXM7CgpkZWZpbmUgbWV0aG9kIG1ha2UKICAgIChjbGFzcyA9PSA8ZmlsZS1sb2NhdG9yPiwKICAgICAja2V5IGRpcmVjdG9yeSA6OiBmYWxzZS1vcig8ZGlyZWN0b3J5LWxvY2F0b3I+KSA9ICNmLAogICAgICAgICAgYmFzZSA6OiBmYWxzZS1vcig8c3RyaW5nPikgPSAjZiwKICAgICAgICAgIGV4dGVuc2lvbiA6OiBmYWxzZS1vcig8c3RyaW5nPikgPSAjZiwKICAgICAgICAgIG5hbWUgOjogZmFsc2Utb3IoPHN0cmluZz4pID0gI2YpCiA9PiAobG9jYXRvciA6OiA8ZmlsZS1sb2NhdG9yPikKICBtYWtlKDxuYXRpdmUtZmlsZS1sb2NhdG9yPiwKICAgICAgIGRpcmVjdG9yeTogZGlyZWN0b3J5LAogICAgICAgYmFzZTogICAgICBiYXNlLAogICAgICAgZXh0ZW5zaW9uOiBleHRlbnNpb24sCiAgICAgICBuYW1lOiAgICAgIG5hbWUpCmVuZCBtZXRob2QgbWFrZTsKCi8vLyBMb2NhdG9yIGNvZXJjaW9uCgovLy0tLSoqKiBhbmRyZXdhOiBUaGlzIGNhY2hpbmcgc2NoZW1lIGRvZXNuJ3Qgd29yayB5ZXQsIHNvIGRpc2FibGUgaXQuCmRlZmluZSBjb25zdGFudCAkY2FjaGUtbG9jYXRvcnM/ICAgICAgICA9ICNmOwpkZWZpbmUgY29uc3RhbnQgJGNhY2hlLWxvY2F0b3Itc3RyaW5ncz8gPSAjZjsKCmRlZmluZSBjb25zdGFudCAkbG9jYXRvci10by1zdHJpbmctY2FjaGUgPSBtYWtlKDxvYmplY3QtdGFibGU+LCB3ZWFrOiAjImtleSIpOwpkZWZpbmUgY29uc3RhbnQgJHN0cmluZy10by1sb2NhdG9yLWNhY2hlID0gbWFrZSg8c3RyaW5nLXRhYmxlPiwgd2VhazogIyJ2YWx1ZSIpOwoKZGVmaW5lIG9wZW4gZ2VuZXJpYyBsb2NhdG9yLWFzLXN0cmluZwogICAgKGNsYXNzIDo6IHN1YmNsYXNzKDxzdHJpbmc+KSwgbG9jYXRvciA6OiA8bG9jYXRvcj4pCiA9PiAoc3RyaW5nIDo6IDxzdHJpbmc+KTsKCmRlZmluZSBvcGVuIGdlbmVyaWMgc3RyaW5nLWFzLWxvY2F0b3IKICAgIChjbGFzcyA6OiBzdWJjbGFzcyg8bG9jYXRvcj4pLCBzdHJpbmcgOjogPHN0cmluZz4pCiA9PiAobG9jYXRvciA6OiA8bG9jYXRvcj4pOwoKZGVmaW5lIHNlYWxlZCBzaWRld2F5cyBtZXRob2QgYXMKICAgIChjbGFzcyA6OiBzdWJjbGFzcyg8c3RyaW5nPiksIGxvY2F0b3IgOjogPGxvY2F0b3I+KQogPT4gKHN0cmluZyA6OiA8c3RyaW5nPikKICBsZXQgc3RyaW5nID0gZWxlbWVudCgkbG9jYXRvci10by1zdHJpbmctY2FjaGUsIGxvY2F0b3IsIGRlZmF1bHQ6ICNmKTsKICBpZiAoc3RyaW5nKQogICAgYXMoY2xhc3MsIHN0cmluZykKICBlbHNlCiAgICBsZXQgc3RyaW5nID0gbG9jYXRvci1hcy1zdHJpbmcoY2xhc3MsIGxvY2F0b3IpOwogICAgaWYgKCRjYWNoZS1sb2NhdG9yLXN0cmluZ3M/KQogICAgICBlbGVtZW50KCRsb2NhdG9yLXRvLXN0cmluZy1jYWNoZSwgbG9jYXRvcikgOj0gc3RyaW5nOwogICAgZWxzZQogICAgICBzdHJpbmcKICAgIGVuZAogIGVuZAplbmQgbWV0aG9kIGFzOwoKZGVmaW5lIHNlYWxlZCBzaWRld2F5cyBtZXRob2QgYXMKICAgIChjbGFzcyA6OiBzdWJjbGFzcyg8bG9jYXRvcj4pLCBzdHJpbmcgOjogPHN0cmluZz4pCiA9PiAobG9jYXRvciA6OiA8bG9jYXRvcj4pCiAgbGV0IGxvY2F0b3IgPSBlbGVtZW50KCRzdHJpbmctdG8tbG9jYXRvci1jYWNoZSwgc3RyaW5nLCBkZWZhdWx0OiAjZik7CiAgaWYgKGluc3RhbmNlPyhsb2NhdG9yLCBjbGFzcykpCiAgICBsb2NhdG9yCiAgZWxzZQogICAgbGV0IGxvY2F0b3IgPSBzdHJpbmctYXMtbG9jYXRvcihjbGFzcywgc3RyaW5nKTsKICAgIGlmICgkY2FjaGUtbG9jYXRvcnM/KQogICAgICBlbGVtZW50KCRzdHJpbmctdG8tbG9jYXRvci1jYWNoZSwgc3RyaW5nKSA6PSBsb2NhdG9yOwogICAgZWxzZQogICAgICBsb2NhdG9yCiAgICBlbmQKICBlbmQKZW5kIG1ldGhvZCBhczsKCi8vLyBMb2NhdG9yIGNvbmRpdGlvbnMKCmRlZmluZSBjbGFzcyA8bG9jYXRvci1lcnJvcj4gKDxmb3JtYXQtc3RyaW5nLWNvbmRpdGlvbj4sIDxlcnJvcj4pCmVuZCBjbGFzcyA8bG9jYXRvci1lcnJvcj47CgpkZWZpbmUgZnVuY3Rpb24gbG9jYXRvci1lcnJvcgogICAgKGZvcm1hdC1zdHJpbmcgOjogPHN0cmluZz4sICNyZXN0IGZvcm1hdC1hcmd1bWVudHMpCiAgZXJyb3IobWFrZSg8bG9jYXRvci1lcnJvcj4sIAogICAgICAgICAgICAgZm9ybWF0LXN0cmluZzogICAgZm9ybWF0LXN0cmluZywKICAgICAgICAgICAgIGZvcm1hdC1hcmd1bWVudHM6IGZvcm1hdC1hcmd1bWVudHMpKQplbmQgZnVuY3Rpb24gbG9jYXRvci1lcnJvcjsKCi8vLyBVc2VmdWwgbG9jYXRvciBwcm90b2NvbHMKCmRlZmluZSBvcGVuIGdlbmVyaWMgbG9jYXRvci10ZXN0CiAgICAobG9jYXRvciA6OiA8ZGlyZWN0b3J5LWxvY2F0b3I+KSA9PiAodGVzdCA6OiA8ZnVuY3Rpb24+KTsKCmRlZmluZSBtZXRob2QgbG9jYXRvci10ZXN0CiAgICAobG9jYXRvciA6OiA8ZGlyZWN0b3J5LWxvY2F0b3I+KSA9PiAodGVzdCA6OiA8ZnVuY3Rpb24+KQogIFw9CmVuZCBtZXRob2QgbG9jYXRvci10ZXN0OwoKZGVmaW5lIG9wZW4gZ2VuZXJpYyBsb2NhdG9yLW1pZ2h0LWhhdmUtbGlua3M/CiAgICAobG9jYXRvciA6OiA8ZGlyZWN0b3J5LWxvY2F0b3I+KSA9PiAobGlua3M/IDo6IDxib29sZWFuPik7CgpkZWZpbmUgbWV0aG9kIGxvY2F0b3ItbWlnaHQtaGF2ZS1saW5rcz8KICAgIChsb2NhdG9yIDo6IDxkaXJlY3RvcnktbG9jYXRvcj4pID0+IChsaW5rcz8gOjogc2luZ2xldG9uKCNmKSkKICAjZgplbmQgbWV0aG9kIGxvY2F0b3ItbWlnaHQtaGF2ZS1saW5rcz87CgpkZWZpbmUgbWV0aG9kIGxvY2F0b3ItcmVsYXRpdmU/CiAgICAobG9jYXRvciA6OiA8ZmlsZS1sb2NhdG9yPikgPT4gKHJlbGF0aXZlPyA6OiA8Ym9vbGVhbj4pCiAgbGV0IGRpcmVjdG9yeSA9IGxvY2F0b3IubG9jYXRvci1kaXJlY3Rvcnk7CiAgfmRpcmVjdG9yeSB8IGRpcmVjdG9yeS5sb2NhdG9yLXJlbGF0aXZlPwplbmQgbWV0aG9kIGxvY2F0b3ItcmVsYXRpdmU/OwoKZGVmaW5lIG1ldGhvZCBjdXJyZW50LWRpcmVjdG9yeS1sb2NhdG9yPwogICAgKGxvY2F0b3IgOjogPGRpcmVjdG9yeS1sb2NhdG9yPikgPT4gKGN1cnJlbnQtZGlyZWN0b3J5PyA6OiA8Ym9vbGVhbj4pCiAgbG9jYXRvci5sb2NhdG9yLXJlbGF0aXZlPwogICAgJiBsb2NhdG9yLmxvY2F0b3ItcGF0aCA9ICNbIyJzZWxmIl0KZW5kIG1ldGhvZCBjdXJyZW50LWRpcmVjdG9yeS1sb2NhdG9yPzsKCmRlZmluZSBtZXRob2QgbG9jYXRvci1kaXJlY3RvcnkKICAgIChsb2NhdG9yIDo6IDxkaXJlY3RvcnktbG9jYXRvcj4pID0+IChwYXJlbnQgOjogZmFsc2Utb3IoPGRpcmVjdG9yeS1sb2NhdG9yPikpCiAgbGV0IHBhdGggPSBsb2NhdG9yLmxvY2F0b3ItcGF0aDsKICB1bmxlc3MgKGVtcHR5PyhwYXRoKSkKICAgIG1ha2Uob2JqZWN0LWNsYXNzKGxvY2F0b3IpLAogICAgICAgICBzZXJ2ZXI6ICAgIGxvY2F0b3IubG9jYXRvci1zZXJ2ZXIsCiAgICAgICAgIHBhdGg6ICAgICAgY29weS1zZXF1ZW5jZShwYXRoLCBlbmQ6IHBhdGguc2l6ZSAtIDEpLAogICAgICAgICByZWxhdGl2ZT86IGxvY2F0b3IubG9jYXRvci1yZWxhdGl2ZT8pCiAgZW5kCmVuZCBtZXRob2QgbG9jYXRvci1kaXJlY3Rvcnk7CgovLy8gU2ltcGxpZnkgbG9jYXRvcgoKZGVmaW5lIG9wZW4gZ2VuZXJpYyBzaW1wbGlmeS1sb2NhdG9yCiAgICAobG9jYXRvciA6OiA8cGh5c2ljYWwtbG9jYXRvcj4pCiA9PiAoc2ltcGxpZmllZC1sb2NhdG9yIDo6IDxwaHlzaWNhbC1sb2NhdG9yPik7CgpkZWZpbmUgbWV0aG9kIHNpbXBsaWZ5LWxvY2F0b3IKICAgIChsb2NhdG9yIDo6IDxkaXJlY3RvcnktbG9jYXRvcj4pCiA9PiAoc2ltcGxpZmllZC1sb2NhdG9yIDo6IDxkaXJlY3RvcnktbG9jYXRvcj4pCiAgbGV0IHBhdGggPSBsb2NhdG9yLmxvY2F0b3ItcGF0aDsKICBsZXQgcmVsYXRpdmU/ID0gbG9jYXRvci5sb2NhdG9yLXJlbGF0aXZlPzsKICBsZXQgcmVzb2x2ZS1wYXJlbnQ/ID0gfmxvY2F0b3IubG9jYXRvci1taWdodC1oYXZlLWxpbmtzPzsKICBsZXQgc2ltcGxpZmllZC1wYXRoCiAgICA9IHNpbXBsaWZ5LXBhdGgocGF0aCwgCiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZS1wYXJlbnQ/OiByZXNvbHZlLXBhcmVudD8sCiAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmU/OiByZWxhdGl2ZT8pOwogIGlmIChwYXRoIH49IHNpbXBsaWZpZWQtcGF0aCkKICAgIG1ha2Uob2JqZWN0LWNsYXNzKGxvY2F0b3IpLAogICAgICAgICBzZXJ2ZXI6ICAgIGxvY2F0b3IubG9jYXRvci1zZXJ2ZXIsCiAgICAgICAgIHBhdGg6ICAgICAgc2ltcGxpZmllZC1wYXRoLAogICAgICAgICByZWxhdGl2ZT86IGxvY2F0b3IubG9jYXRvci1yZWxhdGl2ZT8pCiAgZWxzZQogICAgbG9jYXRvcgogIGVuZAplbmQgbWV0aG9kIHNpbXBsaWZ5LWxvY2F0b3I7CgpkZWZpbmUgbWV0aG9kIHNpbXBsaWZ5LWxvY2F0b3IKICAgIChsb2NhdG9yIDo6IDxmaWxlLWxvY2F0b3I+KSA9PiAoc2ltcGxpZmllZC1sb2NhdG9yIDo6IDxmaWxlLWxvY2F0b3I+KQogIGxldCBkaXJlY3RvcnkgPSBsb2NhdG9yLmxvY2F0b3ItZGlyZWN0b3J5OwogIGxldCBzaW1wbGlmaWVkLWRpcmVjdG9yeSA9IGRpcmVjdG9yeSAmIHNpbXBsaWZ5LWxvY2F0b3IoZGlyZWN0b3J5KTsKICBpZiAoZGlyZWN0b3J5IH49IHNpbXBsaWZpZWQtZGlyZWN0b3J5KQogICAgbWFrZShvYmplY3QtY2xhc3MobG9jYXRvciksCiAgICAgICAgIGRpcmVjdG9yeTogc2ltcGxpZmllZC1kaXJlY3RvcnksCiAgICAgICAgIGJhc2U6ICAgICAgbG9jYXRvci5sb2NhdG9yLWJhc2UsCiAgICAgICAgIGV4dGVuc2lvbjogbG9jYXRvci5sb2NhdG9yLWV4dGVuc2lvbikKICBlbHNlCiAgICBsb2NhdG9yCiAgZW5kCmVuZCBtZXRob2Qgc2ltcGxpZnktbG9jYXRvcjsKCi8vLyBTdWJkaXJlY3RvcnkgbG9jYXRvcgoKZGVmaW5lIG9wZW4gZ2VuZXJpYyBzdWJkaXJlY3RvcnktbG9jYXRvcgogICAgKGxvY2F0b3IgOjogPGRpcmVjdG9yeS1sb2NhdG9yPiwgI3Jlc3Qgc3ViLXBhdGgpCiA9PiAoc3ViZGlyZWN0b3J5IDo6IDxkaXJlY3RvcnktbG9jYXRvcj4pOwoKZGVmaW5lIG1ldGhvZCBzdWJkaXJlY3RvcnktbG9jYXRvcgogICAgKGxvY2F0b3IgOjogPGRpcmVjdG9yeS1sb2NhdG9yPiwgI3Jlc3Qgc3ViLXBhdGgpCiA9PiAoc3ViZGlyZWN0b3J5IDo6IDxkaXJlY3RvcnktbG9jYXRvcj4pCiAgbGV0IG9sZC1wYXRoID0gbG9jYXRvci5sb2NhdG9yLXBhdGg7CiAgbGV0IG5ldy1wYXRoID0gY29uY2F0ZW5hdGUtYXMoPHNpbXBsZS1vYmplY3QtdmVjdG9yPiwgb2xkLXBhdGgsIHN1Yi1wYXRoKTsKICBtYWtlKG9iamVjdC1jbGFzcyhsb2NhdG9yKSwKICAgICAgIHNlcnZlcjogICAgbG9jYXRvci5sb2NhdG9yLXNlcnZlciwKICAgICAgIHBhdGg6ICAgICAgbmV3LXBhdGgsCiAgICAgICByZWxhdGl2ZT86IGxvY2F0b3IubG9jYXRvci1yZWxhdGl2ZT8pCmVuZCBtZXRob2Qgc3ViZGlyZWN0b3J5LWxvY2F0b3I7CgovLy8gUmVsYXRpdmUgbG9jYXRvcgoKZGVmaW5lIG9wZW4gZ2VuZXJpYyByZWxhdGl2ZS1sb2NhdG9yCiAgICAobG9jYXRvciA6OiA8cGh5c2ljYWwtbG9jYXRvcj4sIGZyb20tbG9jYXRvciA6OiA8cGh5c2ljYWwtbG9jYXRvcj4pCiA9PiAocmVsYXRpdmUtbG9jYXRvciA6OiA8cGh5c2ljYWwtbG9jYXRvcj4pOwoKZGVmaW5lIG1ldGhvZCByZWxhdGl2ZS1sb2NhdG9yCiAgICAobG9jYXRvciA6OiA8ZGlyZWN0b3J5LWxvY2F0b3I+LCBmcm9tLWxvY2F0b3IgOjogPGRpcmVjdG9yeS1sb2NhdG9yPikKID0+IChyZWxhdGl2ZS1sb2NhdG9yIDo6IDxkaXJlY3RvcnktbG9jYXRvcj4pCiAgbGV0IHBhdGggPSBsb2NhdG9yLmxvY2F0b3ItcGF0aDsKICBsZXQgZnJvbS1wYXRoID0gZnJvbS1sb2NhdG9yLmxvY2F0b3ItcGF0aDsKICBjYXNlCiAgICB+bG9jYXRvci5sb2NhdG9yLXJlbGF0aXZlPyAmIGZyb20tbG9jYXRvci5sb2NhdG9yLXJlbGF0aXZlPyA9PgogICAgICBsb2NhdG9yLWVycm9yCiAgICAgICAgKCJDYW5ub3QgZmluZCByZWxhdGl2ZSBwYXRoIG9mIGFic29sdXRlIGxvY2F0b3IgJT0gZnJvbSByZWxhdGl2ZSBsb2NhdG9yICU9IiwKICAgICAgICAgbG9jYXRvciwgZnJvbS1sb2NhdG9yKTsKICAgIGxvY2F0b3IubG9jYXRvci1zZXJ2ZXIgfj0gZnJvbS1sb2NhdG9yLmxvY2F0b3Itc2VydmVyID0+CiAgICAgIGxvY2F0b3I7CiAgICBwYXRoID0gZnJvbS1wYXRoID0+CiAgICAgIG1ha2Uob2JqZWN0LWNsYXNzKGxvY2F0b3IpLAogICAgICAgICAgIHBhdGg6IHZlY3RvcigjInNlbGYiKSwKICAgICAgICAgICByZWxhdGl2ZT86ICN0KTsKICAgIG90aGVyd2lzZSA9PgogICAgICBtYWtlKG9iamVjdC1jbGFzcyhsb2NhdG9yKSwKICAgICAgICAgICBwYXRoOiByZWxhdGl2ZS1wYXRoKHBhdGgsIGZyb20tcGF0aCwgdGVzdDogbG9jYXRvci5sb2NhdG9yLXRlc3QpLAogICAgICAgICAgIHJlbGF0aXZlPzogI3QpOwogIGVuZAplbmQgbWV0aG9kIHJlbGF0aXZlLWxvY2F0b3I7CgpkZWZpbmUgbWV0aG9kIHJlbGF0aXZlLWxvY2F0b3IKICAgIChsb2NhdG9yIDo6IDxmaWxlLWxvY2F0b3I+LCBmcm9tLWRpcmVjdG9yeSA6OiA8ZGlyZWN0b3J5LWxvY2F0b3I+KQogPT4gKHJlbGF0aXZlLWxvY2F0b3IgOjogPGZpbGUtbG9jYXRvcj4pCiAgbGV0IGRpcmVjdG9yeSA9IGxvY2F0b3IubG9jYXRvci1kaXJlY3Rvcnk7CiAgbGV0IHJlbGF0aXZlLWRpcmVjdG9yeSA9IGRpcmVjdG9yeSAmIHJlbGF0aXZlLWxvY2F0b3IoZGlyZWN0b3J5LCBmcm9tLWRpcmVjdG9yeSk7CiAgaWYgKHJlbGF0aXZlLWRpcmVjdG9yeSB+PSBkaXJlY3RvcnkpCiAgICBzaW1wbGlmeS1sb2NhdG9yCiAgICAgIChtYWtlKG9iamVjdC1jbGFzcyhsb2NhdG9yKSwKICAgICAgICAgICAgZGlyZWN0b3J5OiByZWxhdGl2ZS1kaXJlY3RvcnksCiAgICAgICAgICAgIGJhc2U6ICAgICAgbG9jYXRvci5sb2NhdG9yLWJhc2UsCiAgICAgICAgICAgIGV4dGVuc2lvbjogbG9jYXRvci5sb2NhdG9yLWV4dGVuc2lvbikpCiAgZWxzZQogICAgbG9jYXRvcgogIGVuZAplbmQgbWV0aG9kIHJlbGF0aXZlLWxvY2F0b3I7CgpkZWZpbmUgbWV0aG9kIHJlbGF0aXZlLWxvY2F0b3IKICAgIChsb2NhdG9yIDo6IDxwaHlzaWNhbC1sb2NhdG9yPiwgZnJvbS1sb2NhdG9yIDo6IDxmaWxlLWxvY2F0b3I+KQogPT4gKHJlbGF0aXZlLWxvY2F0b3IgOjogPHBoeXNpY2FsLWxvY2F0b3I+KQogIGxldCBmcm9tLWRpcmVjdG9yeSA9IGZyb20tbG9jYXRvci5sb2NhdG9yLWRpcmVjdG9yeTsKICBjYXNlCiAgICBmcm9tLWRpcmVjdG9yeSA9PgogICAgICByZWxhdGl2ZS1sb2NhdG9yKGxvY2F0b3IsIGZyb20tZGlyZWN0b3J5KTsKICAgIH5sb2NhdG9yLmxvY2F0b3ItcmVsYXRpdmU/ID0+CiAgICAgIGxvY2F0b3ItZXJyb3IKICAgICAgICAoIkNhbm5vdCBmaW5kIHJlbGF0aXZlIHBhdGggb2YgYWJzb2x1dGUgbG9jYXRvciAlPSBmcm9tIHJlbGF0aXZlIGxvY2F0b3IgJT0iLAogICAgICAgICBsb2NhdG9yLCBmcm9tLWxvY2F0b3IpOwogICAgb3RoZXJ3aXNlID0+CiAgICAgIGxvY2F0b3I7CiAgZW5kCmVuZCBtZXRob2QgcmVsYXRpdmUtbG9jYXRvcjsKCi8vLyBNZXJnZSBsb2NhdG9ycwoKZGVmaW5lIG9wZW4gZ2VuZXJpYyBtZXJnZS1sb2NhdG9ycwogICAgKGxvY2F0b3IgOjogPHBoeXNpY2FsLWxvY2F0b3I+LCBmcm9tLWxvY2F0b3IgOjogPHBoeXNpY2FsLWxvY2F0b3I+KQogPT4gKG1lcmdlZC1sb2NhdG9yIDo6IDxwaHlzaWNhbC1sb2NhdG9yPik7CgovLy8gTWVyZ2UgbG9jYXRvcnMKCmRlZmluZSBtZXRob2QgbWVyZ2UtbG9jYXRvcnMKICAgIChsb2NhdG9yIDo6IDxkaXJlY3RvcnktbG9jYXRvcj4sIGZyb20tbG9jYXRvciA6OiA8ZGlyZWN0b3J5LWxvY2F0b3I+KQogPT4gKG1lcmdlZC1sb2NhdG9yIDo6IDxkaXJlY3RvcnktbG9jYXRvcj4pCiAgaWYgKGxvY2F0b3IubG9jYXRvci1yZWxhdGl2ZT8pCiAgICBsZXQgcGF0aCA9IGNvbmNhdGVuYXRlKGZyb20tbG9jYXRvci5sb2NhdG9yLXBhdGgsIGxvY2F0b3IubG9jYXRvci1wYXRoKTsKICAgIHNpbXBsaWZ5LWxvY2F0b3IKICAgICAgKG1ha2Uob2JqZWN0LWNsYXNzKGxvY2F0b3IpLAogICAgICAgICAgICBzZXJ2ZXI6ICAgIGZyb20tbG9jYXRvci5sb2NhdG9yLXNlcnZlciwKICAgICAgICAgICAgcGF0aDogICAgICBwYXRoLAogICAgICAgICAgICByZWxhdGl2ZT86IGZyb20tbG9jYXRvci5sb2NhdG9yLXJlbGF0aXZlPykpCiAgZWxzZQogICAgbG9jYXRvcgogIGVuZAplbmQgbWV0aG9kIG1lcmdlLWxvY2F0b3JzOwoKZGVmaW5lIG1ldGhvZCBtZXJnZS1sb2NhdG9ycwogICAgKGxvY2F0b3IgOjogPGZpbGUtbG9jYXRvcj4sIGZyb20tbG9jYXRvciA6OiA8ZGlyZWN0b3J5LWxvY2F0b3I+KQogPT4gKG1lcmdlZC1sb2NhdG9yIDo6IDxmaWxlLWxvY2F0b3I+KQogIGxldCBkaXJlY3RvcnkgPSBsb2NhdG9yLmxvY2F0b3ItZGlyZWN0b3J5OwogIGxldCBtZXJnZWQtZGlyZWN0b3J5IAogICAgPSBpZiAoZGlyZWN0b3J5KQogICAgICAgIG1lcmdlLWxvY2F0b3JzKGRpcmVjdG9yeSwgZnJvbS1sb2NhdG9yKQogICAgICBlbHNlCiAgICAgICAgc2ltcGxpZnktbG9jYXRvcihmcm9tLWxvY2F0b3IpCiAgICAgIGVuZDsKICBpZiAobWVyZ2VkLWRpcmVjdG9yeSB+PSBkaXJlY3RvcnkpCiAgICBtYWtlKG9iamVjdC1jbGFzcyhsb2NhdG9yKSwKICAgICAgICAgZGlyZWN0b3J5OiBtZXJnZWQtZGlyZWN0b3J5LAogICAgICAgICBiYXNlOiAgICAgIGxvY2F0b3IubG9jYXRvci1iYXNlLAogICAgICAgICBleHRlbnNpb246IGxvY2F0b3IubG9jYXRvci1leHRlbnNpb24pCiAgZWxzZQogICAgbG9jYXRvcgogIGVuZAplbmQgbWV0aG9kIG1lcmdlLWxvY2F0b3JzOwoKZGVmaW5lIG1ldGhvZCBtZXJnZS1sb2NhdG9ycwogICAgKGxvY2F0b3IgOjogPHBoeXNpY2FsLWxvY2F0b3I+LCBmcm9tLWxvY2F0b3IgOjogPGZpbGUtbG9jYXRvcj4pCiA9PiAobWVyZ2VkLWxvY2F0b3IgOjogPHBoeXNpY2FsLWxvY2F0b3I+KQogIGxldCBmcm9tLWRpcmVjdG9yeSA9IGZyb20tbG9jYXRvci5sb2NhdG9yLWRpcmVjdG9yeTsKICBpZiAoZnJvbS1kaXJlY3RvcnkpCiAgICBtZXJnZS1sb2NhdG9ycyhsb2NhdG9yLCBmcm9tLWRpcmVjdG9yeSkKICBlbHNlCiAgICBsb2NhdG9yCiAgZW5kCmVuZCBtZXRob2QgbWVyZ2UtbG9jYXRvcnM7CgovLy8gTG9jYXRvciBwcm90b2NvbHMKCmRlZmluZSBzaWRld2F5cyBtZXRob2Qgc3VwcG9ydHMtb3Blbi1sb2NhdG9yPwogICAgKGxvY2F0b3IgOjogPGZpbGUtbG9jYXRvcj4pID0+IChvcGVuYWJsZT8gOjogPGJvb2xlYW4+KQogIH5sb2NhdG9yLmxvY2F0b3ItcmVsYXRpdmU/CmVuZCBtZXRob2Qgc3VwcG9ydHMtb3Blbi1sb2NhdG9yPzsKCmRlZmluZSBzaWRld2F5cyBtZXRob2Qgb3Blbi1sb2NhdG9yCiAgICAobG9jYXRvciA6OiA8ZmlsZS1sb2NhdG9yPiwgI3Jlc3Qga2V5d29yZHMsICNrZXksICNhbGwta2V5cykKID0+IChzdHJlYW0gOjogPHN0cmVhbT4pCiAgYXBwbHkob3Blbi1maWxlLXN0cmVhbSwgbG9jYXRvciwga2V5d29yZHMpCmVuZCBtZXRob2Qgb3Blbi1sb2NhdG9yOwo8L3RleHRhcmVhPjwvZGl2PgoKICAgIDxzY3JpcHQ+CiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICAgICAgbW9kZTogInRleHQveC1keWxhbiIsCiAgICAgICAgbGluZU51bWJlcnM6IHRydWUsCiAgICAgICAgbWF0Y2hCcmFja2V0czogdHJ1ZSwKICAgICAgICBjb250aW51ZUNvbW1lbnRzOiAiRW50ZXIiLAogICAgICAgIGV4dHJhS2V5czogeyJDdHJsLVEiOiAidG9nZ2xlQ29tbWVudCJ9LAogICAgICAgIHRhYk1vZGU6ICJpbmRlbnQiLAogICAgICAgIGluZGVudFVuaXQ6IDIKICAgICAgfSk7CiAgICA8L3NjcmlwdD4KCiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC94LWR5bGFuPC9jb2RlPi48L3A+CjwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/dylan/test.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24oKSB7CiAgdmFyIG1vZGUgPSBDb2RlTWlycm9yLmdldE1vZGUoe2luZGVudFVuaXQ6IDJ9LCAiZHlsYW4iKTsKICBmdW5jdGlvbiBNVChuYW1lKSB7IHRlc3QubW9kZShuYW1lLCBtb2RlLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKTsgfQoKICBNVCgnY29tbWVudHMnLAogICAgICdbY29tbWVudCAvLyBUaGlzIGlzIGEgbGluZSBjb21tZW50XScsCiAgICAgJ1tjb21tZW50IC8qIFRoaXMgaXMgYSBibG9jayBjb21tZW50ICovXScsCiAgICAgJ1tjb21tZW50IC8qIFRoaXMgaXMgYSBtdWx0aV0nLAogICAgICdbY29tbWVudCBsaW5lIGNvbW1lbnRdJywKICAgICAnW2NvbW1lbnQgKi9dJywKICAgICAnW2NvbW1lbnQgLyogQW5kIHRoaXMgaXMgYSAvKl0nLAogICAgICdbY29tbWVudCAvKiBuZXN0ZWQgKi8gY29tbWVudCAqL10nKTsKCiAgTVQoJ3VuYXJ5X29wZXJhdG9ycycsCiAgICAgJ1tvcGVyYXRvciAtXVt2YXJpYWJsZSBhXScsCiAgICAgJ1tvcGVyYXRvciAtXSBbdmFyaWFibGUgYV0nLAogICAgICdbb3BlcmF0b3Igfl1bdmFyaWFibGUgYV0nLAogICAgICdbb3BlcmF0b3Igfl0gW3ZhcmlhYmxlIGFdJyk7CgogIE1UKCdiaW5hcnlfb3BlcmF0b3JzJywKICAgICAnW3ZhcmlhYmxlIGFdIFtvcGVyYXRvciArXSBbdmFyaWFibGUgYl0nLAogICAgICdbdmFyaWFibGUgYV0gW29wZXJhdG9yIC1dIFt2YXJpYWJsZSBiXScsCiAgICAgJ1t2YXJpYWJsZSBhXSBbb3BlcmF0b3IgKl0gW3ZhcmlhYmxlIGJdJywKICAgICAnW3ZhcmlhYmxlIGFdIFtvcGVyYXRvciAvXSBbdmFyaWFibGUgYl0nLAogICAgICdbdmFyaWFibGUgYV0gW29wZXJhdG9yIF5dIFt2YXJpYWJsZSBiXScsCiAgICAgJ1t2YXJpYWJsZSBhXSBbb3BlcmF0b3IgPV0gW3ZhcmlhYmxlIGJdJywKICAgICAnW3ZhcmlhYmxlIGFdIFtvcGVyYXRvciA9PV0gW3ZhcmlhYmxlIGJdJywKICAgICAnW3ZhcmlhYmxlIGFdIFtvcGVyYXRvciB+PV0gW3ZhcmlhYmxlIGJdJywKICAgICAnW3ZhcmlhYmxlIGFdIFtvcGVyYXRvciB+PT1dIFt2YXJpYWJsZSBiXScsCiAgICAgJ1t2YXJpYWJsZSBhXSBbb3BlcmF0b3IgPF0gW3ZhcmlhYmxlIGJdJywKICAgICAnW3ZhcmlhYmxlIGFdIFtvcGVyYXRvciA8PV0gW3ZhcmlhYmxlIGJdJywKICAgICAnW3ZhcmlhYmxlIGFdIFtvcGVyYXRvciA+XSBbdmFyaWFibGUgYl0nLAogICAgICdbdmFyaWFibGUgYV0gW29wZXJhdG9yID49XSBbdmFyaWFibGUgYl0nLAogICAgICdbdmFyaWFibGUgYV0gW29wZXJhdG9yICZdIFt2YXJpYWJsZSBiXScsCiAgICAgJ1t2YXJpYWJsZSBhXSBbb3BlcmF0b3IgfF0gW3ZhcmlhYmxlIGJdJywKICAgICAnW3ZhcmlhYmxlIGFdIFtvcGVyYXRvciA6PV0gW3ZhcmlhYmxlIGJdJyk7CgogIE1UKCdpbnRlZ2VycycsCiAgICAgJ1tudW1iZXIgMV0nLAogICAgICdbbnVtYmVyIDEyM10nLAogICAgICdbbnVtYmVyIC0xMjNdJywKICAgICAnW251bWJlciArNDU2XScsCiAgICAgJ1tudW1iZXIgI2IwMTBdJywKICAgICAnW251bWJlciAjbzA3M10nLAogICAgICdbbnVtYmVyICN4YWJjREVGMTIzXScpOwoKICBNVCgnZmxvYXRzJywKICAgICAnW251bWJlciAuM10nLAogICAgICdbbnVtYmVyIC0xLl0nLAogICAgICdbbnVtYmVyIC0yLjMzNV0nLAogICAgICdbbnVtYmVyICszLjc4ZDFdJywKICAgICAnW251bWJlciAzLjc4cy0xXScsCiAgICAgJ1tudW1iZXIgLTMuMzJlKzVdJyk7CgogIE1UKCdjaGFyYWN0ZXJzX2FuZF9zdHJpbmdzJywKICAgICAiW3N0cmluZyAnYSddIiwKICAgICAiW3N0cmluZyAnXFxcXCcnXSIsCiAgICAgJ1tzdHJpbmcgIiJdJywKICAgICAnW3N0cmluZyAiYSJdJywKICAgICAnW3N0cmluZyAiYWJjIGRlZiJdJywKICAgICAnW3N0cmluZyAiTW9yZSBlc2NhcGVkIGNoYXJhY3RlcnM6IFxcXFxcXFxcIFxcXFxhIFxcXFxiIFxcXFxlIFxcXFxmIFxcXFxuIFxcXFxyIFxcXFx0IFxcXFwwIC4uLiJdJyk7CgogIE1UKCdicmFja2V0cycsCiAgICAgJ1ticmFja2V0ICNbW11dXScsCiAgICAgJ1ticmFja2V0ICMoKV0nLAogICAgICdbYnJhY2tldCAjKF1bbnVtYmVyIDFdW2JyYWNrZXQgKV0nLAogICAgICdbYnJhY2tldCBbW11bbnVtYmVyIDFdW3B1bmN0dWF0aW9uICxdIFtudW1iZXIgM11bYnJhY2tldCBdXV0nLAogICAgICdbYnJhY2tldCAoKV0nLAogICAgICdbYnJhY2tldCB7fV0nLAogICAgICdba2V5d29yZCBpZl0gW2JyYWNrZXQgKF1bdmFyaWFibGUgZm9vXVticmFja2V0ICldJywKICAgICAnW2JyYWNrZXQgKF1bbnVtYmVyIDFdW2JyYWNrZXQgKV0nLAogICAgICdbYnJhY2tldCBbW11bbnVtYmVyIDFdW2JyYWNrZXQgXV1dJyk7CgogIE1UKCdoYXNoX3dvcmRzJywKICAgICAnW3B1bmN0dWF0aW9uICMjXScsCiAgICAgJ1thdG9tICNmXScsICdbYXRvbSAjRl0nLAogICAgICdbYXRvbSAjdF0nLCAnW2F0b20gI1RdJywKICAgICAnW2F0b20gI2FsbC1rZXlzXScsCiAgICAgJ1thdG9tICNpbmNsdWRlXScsCiAgICAgJ1thdG9tICNrZXldJywKICAgICAnW2F0b20gI25leHRdJywKICAgICAnW2F0b20gI3Jlc3RdJywKICAgICAnW3N0cmluZyAjImZvbyJdJywKICAgICAnW2Vycm9yICNpbnZhbGlkXScpOwp9KSgpOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/ebnf/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/ebnf/ebnf.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CgogIENvZGVNaXJyb3IuZGVmaW5lTW9kZSgiZWJuZiIsIGZ1bmN0aW9uIChjb25maWcpIHsKICAgIHZhciBjb21tZW50VHlwZSA9IHtzbGFzaDogMCwgcGFyZW50aGVzaXM6IDF9OwogICAgdmFyIHN0YXRlVHlwZSA9IHtjb21tZW50OiAwLCBfc3RyaW5nOiAxLCBjaGFyYWN0ZXJDbGFzczogMn07CiAgICB2YXIgYnJhY2VzTW9kZSA9IG51bGw7CgogICAgaWYgKGNvbmZpZy5icmFjZXNNb2RlKQogICAgICBicmFjZXNNb2RlID0gQ29kZU1pcnJvci5nZXRNb2RlKGNvbmZpZywgY29uZmlnLmJyYWNlc01vZGUpOwoKICAgIHJldHVybiB7CiAgICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgc3RyaW5nVHlwZTogbnVsbCwKICAgICAgICAgIGNvbW1lbnRUeXBlOiBudWxsLAogICAgICAgICAgYnJhY2VkOiAwLAogICAgICAgICAgbGhzOiB0cnVlLAogICAgICAgICAgbG9jYWxTdGF0ZTogbnVsbCwKICAgICAgICAgIHN0YWNrOiBbXSwKICAgICAgICAgIGluRGVmaW5pdGlvbjogZmFsc2UKICAgICAgICB9OwogICAgICB9LAogICAgICB0b2tlbjogZnVuY3Rpb24gKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgICBpZiAoIXN0cmVhbSkgcmV0dXJuOwoKICAgICAgICAvL2NoZWNrIGZvciBzdGF0ZSBjaGFuZ2VzCiAgICAgICAgaWYgKHN0YXRlLnN0YWNrLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgLy9zdHJpbmdzCiAgICAgICAgICBpZiAoKHN0cmVhbS5wZWVrKCkgPT0gJyInKSB8fCAoc3RyZWFtLnBlZWsoKSA9PSAiJyIpKSB7CiAgICAgICAgICAgIHN0YXRlLnN0cmluZ1R5cGUgPSBzdHJlYW0ucGVlaygpOwogICAgICAgICAgICBzdHJlYW0ubmV4dCgpOyAvLyBTa2lwIHF1b3RlCiAgICAgICAgICAgIHN0YXRlLnN0YWNrLnVuc2hpZnQoc3RhdGVUeXBlLl9zdHJpbmcpOwogICAgICAgICAgfSBlbHNlIGlmIChzdHJlYW0ubWF0Y2goL15cL1wqLykpIHsgLy9jb21tZW50cyBzdGFydGluZyB3aXRoIC8qCiAgICAgICAgICAgIHN0YXRlLnN0YWNrLnVuc2hpZnQoc3RhdGVUeXBlLmNvbW1lbnQpOwogICAgICAgICAgICBzdGF0ZS5jb21tZW50VHlwZSA9IGNvbW1lbnRUeXBlLnNsYXNoOwogICAgICAgICAgfSBlbHNlIGlmIChzdHJlYW0ubWF0Y2goL15cKFwqLykpIHsgLy9jb21tZW50cyBzdGFydGluZyB3aXRoICgqCiAgICAgICAgICAgIHN0YXRlLnN0YWNrLnVuc2hpZnQoc3RhdGVUeXBlLmNvbW1lbnQpOwogICAgICAgICAgICBzdGF0ZS5jb21tZW50VHlwZSA9IGNvbW1lbnRUeXBlLnBhcmVudGhlc2lzOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy9yZXR1cm4gc3RhdGUKICAgICAgICAvL3N0YWNrIGhhcwogICAgICAgIHN3aXRjaCAoc3RhdGUuc3RhY2tbMF0pIHsKICAgICAgICBjYXNlIHN0YXRlVHlwZS5fc3RyaW5nOgogICAgICAgICAgd2hpbGUgKHN0YXRlLnN0YWNrWzBdID09PSBzdGF0ZVR5cGUuX3N0cmluZyAmJiAhc3RyZWFtLmVvbCgpKSB7CiAgICAgICAgICAgIGlmIChzdHJlYW0ucGVlaygpID09PSBzdGF0ZS5zdHJpbmdUeXBlKSB7CiAgICAgICAgICAgICAgc3RyZWFtLm5leHQoKTsgLy8gU2tpcCBxdW90ZQogICAgICAgICAgICAgIHN0YXRlLnN0YWNrLnNoaWZ0KCk7IC8vIENsZWFyIGZsYWcKICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJlYW0ucGVlaygpID09PSAiXFwiKSB7CiAgICAgICAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHN0cmVhbS5tYXRjaCgvXi5bXlxcXCJcJ10qLyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBzdGF0ZS5saHMgPyAicHJvcGVydHkgc3RyaW5nIiA6ICJzdHJpbmciOyAvLyBUb2tlbiBzdHlsZQoKICAgICAgICBjYXNlIHN0YXRlVHlwZS5jb21tZW50OgogICAgICAgICAgd2hpbGUgKHN0YXRlLnN0YWNrWzBdID09PSBzdGF0ZVR5cGUuY29tbWVudCAmJiAhc3RyZWFtLmVvbCgpKSB7CiAgICAgICAgICAgIGlmIChzdGF0ZS5jb21tZW50VHlwZSA9PT0gY29tbWVudFR5cGUuc2xhc2ggJiYgc3RyZWFtLm1hdGNoKC9cKlwvLykpIHsKICAgICAgICAgICAgICBzdGF0ZS5zdGFjay5zaGlmdCgpOyAvLyBDbGVhciBmbGFnCiAgICAgICAgICAgICAgc3RhdGUuY29tbWVudFR5cGUgPSBudWxsOwogICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXRlLmNvbW1lbnRUeXBlID09PSBjb21tZW50VHlwZS5wYXJlbnRoZXNpcyAmJiBzdHJlYW0ubWF0Y2goL1wqXCkvKSkgewogICAgICAgICAgICAgIHN0YXRlLnN0YWNrLnNoaWZ0KCk7IC8vIENsZWFyIGZsYWcKICAgICAgICAgICAgICBzdGF0ZS5jb21tZW50VHlwZSA9IG51bGw7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgc3RyZWFtLm1hdGNoKC9eLlteXCpdKi8pOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gImNvbW1lbnQiOwoKICAgICAgICBjYXNlIHN0YXRlVHlwZS5jaGFyYWN0ZXJDbGFzczoKICAgICAgICAgIHdoaWxlIChzdGF0ZS5zdGFja1swXSA9PT0gc3RhdGVUeXBlLmNoYXJhY3RlckNsYXNzICYmICFzdHJlYW0uZW9sKCkpIHsKICAgICAgICAgICAgaWYgKCEoc3RyZWFtLm1hdGNoKC9eW15cXVxcXSsvKSB8fCBzdHJlYW0ubWF0Y2goL15cXC4vKSkpIHsKICAgICAgICAgICAgICBzdGF0ZS5zdGFjay5zaGlmdCgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gIm9wZXJhdG9yIjsKICAgICAgICB9CgogICAgICAgIHZhciBwZWVrID0gc3RyZWFtLnBlZWsoKTsKCiAgICAgICAgaWYgKGJyYWNlc01vZGUgIT09IG51bGwgJiYgKHN0YXRlLmJyYWNlZCB8fCBwZWVrID09PSAieyIpKSB7CiAgICAgICAgICBpZiAoc3RhdGUubG9jYWxTdGF0ZSA9PT0gbnVsbCkKICAgICAgICAgICAgc3RhdGUubG9jYWxTdGF0ZSA9IENvZGVNaXJyb3Iuc3RhcnRTdGF0ZShicmFjZXNNb2RlKTsKCiAgICAgICAgICB2YXIgdG9rZW4gPSBicmFjZXNNb2RlLnRva2VuKHN0cmVhbSwgc3RhdGUubG9jYWxTdGF0ZSksCiAgICAgICAgICB0ZXh0ID0gc3RyZWFtLmN1cnJlbnQoKTsKCiAgICAgICAgICBpZiAoIXRva2VuKSB7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGV4dC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgIGlmICh0ZXh0W2ldID09PSAieyIpIHsKICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5icmFjZWQgPT09IDApIHsKICAgICAgICAgICAgICAgICAgdG9rZW4gPSAibWF0Y2hpbmdicmFja2V0IjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHN0YXRlLmJyYWNlZCsrOwogICAgICAgICAgICAgIH0gZWxzZSBpZiAodGV4dFtpXSA9PT0gIn0iKSB7CiAgICAgICAgICAgICAgICBzdGF0ZS5icmFjZWQtLTsKICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5icmFjZWQgPT09IDApIHsKICAgICAgICAgICAgICAgICAgdG9rZW4gPSAibWF0Y2hpbmdicmFja2V0IjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiB0b2tlbjsKICAgICAgICB9CgogICAgICAgIC8vbm8gc3RhY2sKICAgICAgICBzd2l0Y2ggKHBlZWspIHsKICAgICAgICBjYXNlICJbIjoKICAgICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgICBzdGF0ZS5zdGFjay51bnNoaWZ0KHN0YXRlVHlwZS5jaGFyYWN0ZXJDbGFzcyk7CiAgICAgICAgICByZXR1cm4gImJyYWNrZXQiOwogICAgICAgIGNhc2UgIjoiOgogICAgICAgIGNhc2UgInwiOgogICAgICAgIGNhc2UgIjsiOgogICAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgICAgIHJldHVybiAib3BlcmF0b3IiOwogICAgICAgIGNhc2UgIiUiOgogICAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgiJSUiKSkgewogICAgICAgICAgICByZXR1cm4gImhlYWRlciI7CiAgICAgICAgICB9IGVsc2UgaWYgKHN0cmVhbS5tYXRjaCgvWyVdW0EtWmEtel0rLykpIHsKICAgICAgICAgICAgcmV0dXJuICJrZXl3b3JkIjsKICAgICAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLm1hdGNoKC9bJV1bfV0vKSkgewogICAgICAgICAgICByZXR1cm4gIm1hdGNoaW5nYnJhY2tldCI7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlICIvIjoKICAgICAgICAgIGlmIChzdHJlYW0ubWF0Y2goL1tcL11bQS1aYS16XSsvKSkgewogICAgICAgICAgcmV0dXJuICJrZXl3b3JkIjsKICAgICAgICB9CiAgICAgICAgY2FzZSAiXFwiOgogICAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvW1xdW2Etel0rLykpIHsKICAgICAgICAgICAgcmV0dXJuICJzdHJpbmctMiI7CiAgICAgICAgICB9CiAgICAgICAgY2FzZSAiLiI6CiAgICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKCIuIikpIHsKICAgICAgICAgICAgcmV0dXJuICJhdG9tIjsKICAgICAgICAgIH0KICAgICAgICBjYXNlICIqIjoKICAgICAgICBjYXNlICItIjoKICAgICAgICBjYXNlICIrIjoKICAgICAgICBjYXNlICJeIjoKICAgICAgICAgIGlmIChzdHJlYW0ubWF0Y2gocGVlaykpIHsKICAgICAgICAgICAgcmV0dXJuICJhdG9tIjsKICAgICAgICAgIH0KICAgICAgICBjYXNlICIkIjoKICAgICAgICAgIGlmIChzdHJlYW0ubWF0Y2goIiQkIikpIHsKICAgICAgICAgICAgcmV0dXJuICJidWlsdGluIjsKICAgICAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLm1hdGNoKC9bJF1bMC05XSsvKSkgewogICAgICAgICAgICByZXR1cm4gInZhcmlhYmxlLTMiOwogICAgICAgICAgfQogICAgICAgIGNhc2UgIjwiOgogICAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvPDxbYS16QS1aX10rPj4vKSkgewogICAgICAgICAgICByZXR1cm4gImJ1aWx0aW4iOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXlwvXC8vKSkgewogICAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICAgICAgcmV0dXJuICJjb21tZW50IjsKICAgICAgICB9IGVsc2UgaWYgKHN0cmVhbS5tYXRjaCgvcmV0dXJuLykpIHsKICAgICAgICAgIHJldHVybiAib3BlcmF0b3IiOwogICAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLm1hdGNoKC9eW2EtekEtWl9dW2EtekEtWjAtOV9dKi8pKSB7CiAgICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKC8oPz1bXCguXSkvKSkgewogICAgICAgICAgICByZXR1cm4gInZhcmlhYmxlIjsKICAgICAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLm1hdGNoKC8oPz1bXHNcbl0qWzo9XSkvKSkgewogICAgICAgICAgICByZXR1cm4gImRlZiI7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gInZhcmlhYmxlLTIiOwogICAgICAgIH0gZWxzZSBpZiAoWyJbIiwgIl0iLCAiKCIsICIpIl0uaW5kZXhPZihzdHJlYW0ucGVlaygpKSAhPSAtMSkgewogICAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgICAgIHJldHVybiAiYnJhY2tldCI7CiAgICAgICAgfSBlbHNlIGlmICghc3RyZWFtLmVhdFNwYWNlKCkpIHsKICAgICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICB9OwogIH0pOwoKICBDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveC1lYm5mIiwgImVibmYiKTsKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/ebnf/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IEVCTkYgTW9kZTwvdGl0bGU+CiAgICA8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgogICAgPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CiAgICA8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Ii4uL2phdmFzY3JpcHQvamF2YXNjcmlwdC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iZWJuZi5qcyI+PC9zY3JpcHQ+CiAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPi5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazt9PC9zdHlsZT4KICA8L2hlYWQ+CiAgPGJvZHk+CiAgICA8ZGl2IGlkPW5hdj4KICAgICAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aDE+Q29kZU1pcnJvcjwvaDE+PGltZyBpZD1sb2dvIHNyYz0iLi4vLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogICAgICA8dWw+CiAgICAgICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICAgICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9jb2RlbWlycm9yIj5Db2RlPC9hPgogICAgICA8L3VsPgogICAgICA8dWw+CiAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+RUJORiBNb2RlPC9hPgogICAgICA8L3VsPgogICAgPC9kaXY+CgogICAgPGFydGljbGU+CiAgICAgIDxoMj5FQk5GIE1vZGUgKGJyYWNlc01vZGUgc2V0dGluZyA9ICJqYXZhc2NyaXB0Iik8L2gyPgogICAgICA8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgovKiBkZXNjcmlwdGlvbjogUGFyc2VzIGVuZCBleGVjdXRlcyBtYXRoZW1hdGljYWwgZXhwcmVzc2lvbnMuICovCgovKiBsZXhpY2FsIGdyYW1tYXIgKi8KJWxleAoKJSUKXHMrICAgICAgICAgICAgICAgICAgIC8qIHNraXAgd2hpdGVzcGFjZSAqLwpbMC05XSsoIi4iWzAtOV0rKT9cYiAgcmV0dXJuICdOVU1CRVInOwoiKiIgICAgICAgICAgICAgICAgICAgcmV0dXJuICcqJzsKIi8iICAgICAgICAgICAgICAgICAgIHJldHVybiAnLyc7CiItIiAgICAgICAgICAgICAgICAgICByZXR1cm4gJy0nOwoiKyIgICAgICAgICAgICAgICAgICAgcmV0dXJuICcrJzsKIl4iICAgICAgICAgICAgICAgICAgIHJldHVybiAnXic7CiIoIiAgICAgICAgICAgICAgICAgICByZXR1cm4gJygnOwoiKSIgICAgICAgICAgICAgICAgICAgcmV0dXJuICcpJzsKIlBJIiAgICAgICAgICAgICAgICAgIHJldHVybiAnUEknOwoiRSIgICAgICAgICAgICAgICAgICAgcmV0dXJuICdFJzsKJmx0OyZsdDtFT0YmZ3Q7Jmd0OyAgICAgICAgICAgICAgIHJldHVybiAnRU9GJzsKCi9sZXgKCi8qIG9wZXJhdG9yIGFzc29jaWF0aW9ucyBhbmQgcHJlY2VkZW5jZSAqLwoKJWxlZnQgJysnICctJwolbGVmdCAnKicgJy8nCiVsZWZ0ICdeJwolbGVmdCBVTUlOVVMKCiVzdGFydCBleHByZXNzaW9ucwoKJSUgLyogbGFuZ3VhZ2UgZ3JhbW1hciAqLwoKZXhwcmVzc2lvbnMKOiBlIEVPRgp7cHJpbnQoJDEpOyByZXR1cm4gJDE7fQo7CgplCjogZSAnKycgZQp7JCQgPSAkMSskMzt9CnwgZSAnLScgZQp7JCQgPSAkMS0kMzt9CnwgZSAnKicgZQp7JCQgPSAkMSokMzt9CnwgZSAnLycgZQp7JCQgPSAkMS8kMzt9CnwgZSAnXicgZQp7JCQgPSBNYXRoLnBvdygkMSwgJDMpO30KfCAnLScgZSAlcHJlYyBVTUlOVVMKeyQkID0gLSQyO30KfCAnKCcgZSAnKScKeyQkID0gJDI7fQp8IE5VTUJFUgp7JCQgPSBOdW1iZXIoeXl0ZXh0KTt9CnwgRQp7JCQgPSBNYXRoLkU7fQp8IFBJCnskJCA9IE1hdGguUEk7fQo7PC90ZXh0YXJlYT48L2Zvcm0+CiAgICAgIDxzY3JpcHQ+CiAgICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICAgIG1vZGU6IHtuYW1lOiAiZWJuZiJ9LAogICAgICAgICAgbGluZU51bWJlcnM6IHRydWUsCiAgICAgICAgICBicmFjZXNNb2RlOiAnamF2YXNjcmlwdCcKICAgICAgICB9KTsKICAgICAgPC9zY3JpcHQ+CiAgICAgIDxoMz5UaGUgRUJORiBNb2RlPC9oMz4KICAgICAgPHA+IENyZWF0ZWQgYnkgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3JvYmVydGxlZXBsdW1tZXJqciI+Um9iZXJ0IFBsdW1tZXI8L2E+PC9wPgogICAgPC9hcnRpY2xlPgogIDwvYm9keT4KPC9odG1sPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/ecl/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/ecl/ecl.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJlY2wiLCBmdW5jdGlvbihjb25maWcpIHsKCiAgZnVuY3Rpb24gd29yZHMoc3RyKSB7CiAgICB2YXIgb2JqID0ge30sIHdvcmRzID0gc3RyLnNwbGl0KCIgIik7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHdvcmRzLmxlbmd0aDsgKytpKSBvYmpbd29yZHNbaV1dID0gdHJ1ZTsKICAgIHJldHVybiBvYmo7CiAgfQoKICBmdW5jdGlvbiBtZXRhSG9vayhzdHJlYW0sIHN0YXRlKSB7CiAgICBpZiAoIXN0YXRlLnN0YXJ0T2ZMaW5lKSByZXR1cm4gZmFsc2U7CiAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICByZXR1cm4gIm1ldGEiOwogIH0KCiAgdmFyIGluZGVudFVuaXQgPSBjb25maWcuaW5kZW50VW5pdDsKICB2YXIga2V5d29yZCA9IHdvcmRzKCJhYnMgYWNvcyBhbGxub2RlcyBhc2NpaSBhc2luIGFzc3RyaW5nIGF0YW4gYXRhbjIgYXZlIGNhc2UgY2hvb3NlIGNob29zZW4gY2hvb3Nlc2V0cyBjbHVzdGVyc2l6ZSBjb21iaW5lIGNvcnJlbGF0aW9uIGNvcyBjb3NoIGNvdW50IGNvdmFyaWFuY2UgY3JvbiBkYXRhc2V0IGRlZHVwIGRlZmluZSBkZW5vcm1hbGl6ZSBkaXN0cmlidXRlIGRpc3RyaWJ1dGVkIGRpc3RyaWJ1dGlvbiBlYmNkaWMgZW50aCBlcnJvciBldmFsdWF0ZSBldmVudCBldmVudGV4dHJhIGV2ZW50bmFtZSBleGlzdHMgZXhwIGZhaWxjb2RlIGZhaWxtZXNzYWdlIGZldGNoIGZyb211bmljb2RlIGdldGlzdmFsaWQgZ2xvYmFsIGdyYXBoIGdyb3VwIGhhc2ggaGFzaDMyIGhhc2g2NCBoYXNoY3JjIGhhc2htZDUgaGF2aW5nIGlmIGluZGV4IGludGZvcm1hdCBpc3ZhbGlkIGl0ZXJhdGUgam9pbiBrZXl1bmljb2RlIGxlbmd0aCBsaWJyYXJ5IGxpbWl0IGxuIGxvY2FsIGxvZyBsb29wIG1hcCBtYXRjaGVkIG1hdGNobGVuZ3RoIG1hdGNocG9zaXRpb24gbWF0Y2h0ZXh0IG1hdGNodW5pY29kZSBtYXggbWVyZ2UgbWVyZ2Vqb2luIG1pbiBub2xvY2FsIG5vbmVtcHR5IG5vcm1hbGl6ZSBwYXJzZSBwaXBlIHBvd2VyIHByZWxvYWQgcHJvY2VzcyBwcm9qZWN0IHB1bGwgcmFuZG9tIHJhbmdlIHJhbmsgcmFua2VkIHJlYWxmb3JtYXQgcmVjb3Jkb2YgcmVnZXhmaW5kIHJlZ2V4cmVwbGFjZSByZWdyb3VwIHJlamVjdGVkIHJvbGx1cCByb3VuZCByb3VuZHVwIHJvdyByb3dkaWZmIHNhbXBsZSBzZXQgc2luIHNpbmggc2l6ZW9mIHNvYXBjYWxsIHNvcnQgc29ydGVkIHNxcnQgc3RlcHBlZCBzdG9yZWQgc3VtIHRhYmxlIHRhbiB0YW5oIHRoaXNub2RlIHRvcG4gdG91bmljb2RlIHRyYW5zZmVyIHRyaW0gdHJ1bmNhdGUgdHlwZW9mIHVuZ3JvdXAgdW5pY29kZW9yZGVyIHZhcmlhbmNlIHdoaWNoIHdvcmt1bml0IHhtbGRlY29kZSB4bWxlbmNvZGUgeG1sdGV4dCB4bWx1bmljb2RlIik7CiAgdmFyIHZhcmlhYmxlID0gd29yZHMoImFwcGx5IGFzc2VydCBidWlsZCBidWlsZGluZGV4IGV2YWx1YXRlIGZhaWwga2V5ZGlmZiBrZXlwYXRjaCBsb2FkeG1sIG5vdGhvciBub3RpZnkgb3V0cHV0IHBhcmFsbGVsIHNlcXVlbnRpYWwgc29hcGNhbGwgd2FpdCIpOwogIHZhciB2YXJpYWJsZV8yID0gd29yZHMoIl9fY29tcHJlc3NlZF9fIGFsbCBhbmQgYW55IGFzIGF0bW9zdCBiZWZvcmUgYmVnaW5jKysgYmVzdCBiZXR3ZWVuIGNhc2UgY29uc3QgY291bnRlciBjc3YgZGVzY2VuZCBlbmNyeXB0IGVuZCBlbmRjKysgZW5kbWFjcm8gZXhjZXB0IGV4Y2x1c2l2ZSBleHBpcmUgZXhwb3J0IGV4dGVuZCBmYWxzZSBmZXcgZmlyc3QgZmxhdCBmcm9tIGZ1bGwgZnVuY3Rpb24gZ3JvdXAgaGVhZGVyIGhlYWRpbmcgaG9sZSBpZmJsb2NrIGltcG9ydCBpbiBpbnRlcmZhY2Ugam9pbmVkIGtlZXAga2V5ZWQgbGFzdCBsZWZ0IGxpbWl0IGxvYWQgbG9jYWwgbG9jYWxlIGxvb2t1cCBtYWNybyBtYW55IG1heGNvdW50IG1heGxlbmd0aCBtaW4gc2tldyBtb2R1bGUgbmFtZWQgbm9jYXNlIG5vcm9vdCBub3NjYW4gbm9zb3J0IG5vdCBvZiBvbmx5IG9wdCBvciBvdXRlciBvdmVyd3JpdGUgcGFja2VkIHBhcnRpdGlvbiBwZW5hbHR5IHBoeXNpY2FsbGVuZ3RoIHBpcGUgcXVvdGUgcmVjb3JkIHJlbGF0aW9uc2hpcCByZXBlYXQgcmV0dXJuIHJpZ2h0IHNjYW4gc2VsZiBzZXBhcmF0b3Igc2VydmljZSBzaGFyZWQgc2tldyBza2lwIHNxbCBzdG9yZSB0ZXJtaW5hdG9yIHRob3IgdGhyZXNob2xkIHRva2VuIHRyYW5zZm9ybSB0cmltIHRydWUgdHlwZSB1bmljb2Rlb3JkZXIgdW5zb3J0ZWQgdmFsaWRhdGUgdmlydHVhbCB3aG9sZSB3aWxkIHdpdGhpbiB4bWwgeHBhdGgiKTsKICB2YXIgdmFyaWFibGVfMyA9IHdvcmRzKCJhc2NpaSBiaWdfZW5kaWFuIGJvb2xlYW4gZGF0YSBkZWNpbWFsIGViY2RpYyBpbnRlZ2VyIHBhdHRlcm4gcXN0cmluZyByZWFsIHJlY29yZCBydWxlIHNldCBvZiBzdHJpbmcgdG9rZW4gdWRlY2ltYWwgdW5pY29kZSB1bnNpZ25lZCB2YXJzdHJpbmcgdmFydW5pY29kZSIpOwogIHZhciBidWlsdGluID0gd29yZHMoImNoZWNrcG9pbnQgZGVwcmVjYXRlZCBmYWlsY29kZSBmYWlsbWVzc2FnZSBmYWlsdXJlIGdsb2JhbCBpbmRlcGVuZGVudCBvbndhcm5pbmcgcGVyc2lzdCBwcmlvcml0eSByZWNvdmVyeSBzdG9yZWQgc3VjY2VzcyB3YWl0IHdoZW4iKTsKICB2YXIgYmxvY2tLZXl3b3JkcyA9IHdvcmRzKCJjYXRjaCBjbGFzcyBkbyBlbHNlIGZpbmFsbHkgZm9yIGlmIHN3aXRjaCB0cnkgd2hpbGUiKTsKICB2YXIgYXRvbXMgPSB3b3JkcygidHJ1ZSBmYWxzZSBudWxsIik7CiAgdmFyIGhvb2tzID0geyIjIjogbWV0YUhvb2t9OwogIHZhciBpc09wZXJhdG9yQ2hhciA9IC9bK1wtKiYlPTw+IT98XC9dLzsKCiAgdmFyIGN1clB1bmM7CgogIGZ1bmN0aW9uIHRva2VuQmFzZShzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpOwogICAgaWYgKGhvb2tzW2NoXSkgewogICAgICB2YXIgcmVzdWx0ID0gaG9va3NbY2hdKHN0cmVhbSwgc3RhdGUpOwogICAgICBpZiAocmVzdWx0ICE9PSBmYWxzZSkgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIGlmIChjaCA9PSAnIicgfHwgY2ggPT0gIiciKSB7CiAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5TdHJpbmcoY2gpOwogICAgICByZXR1cm4gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CiAgICB9CiAgICBpZiAoL1tcW1xde31cKFwpLDtcOlwuXS8udGVzdChjaCkpIHsKICAgICAgY3VyUHVuYyA9IGNoOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGlmICgvXGQvLnRlc3QoY2gpKSB7CiAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1x3XC5dLyk7CiAgICAgIHJldHVybiAibnVtYmVyIjsKICAgIH0KICAgIGlmIChjaCA9PSAiLyIpIHsKICAgICAgaWYgKHN0cmVhbS5lYXQoIioiKSkgewogICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5Db21tZW50OwogICAgICAgIHJldHVybiB0b2tlbkNvbW1lbnQoc3RyZWFtLCBzdGF0ZSk7CiAgICAgIH0KICAgICAgaWYgKHN0cmVhbS5lYXQoIi8iKSkgewogICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgICByZXR1cm4gImNvbW1lbnQiOwogICAgICB9CiAgICB9CiAgICBpZiAoaXNPcGVyYXRvckNoYXIudGVzdChjaCkpIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKGlzT3BlcmF0b3JDaGFyKTsKICAgICAgcmV0dXJuICJvcGVyYXRvciI7CiAgICB9CiAgICBzdHJlYW0uZWF0V2hpbGUoL1tcd1wkX10vKTsKICAgIHZhciBjdXIgPSBzdHJlYW0uY3VycmVudCgpLnRvTG93ZXJDYXNlKCk7CiAgICBpZiAoa2V5d29yZC5wcm9wZXJ0eUlzRW51bWVyYWJsZShjdXIpKSB7CiAgICAgIGlmIChibG9ja0tleXdvcmRzLnByb3BlcnR5SXNFbnVtZXJhYmxlKGN1cikpIGN1clB1bmMgPSAibmV3c3RhdGVtZW50IjsKICAgICAgcmV0dXJuICJrZXl3b3JkIjsKICAgIH0gZWxzZSBpZiAodmFyaWFibGUucHJvcGVydHlJc0VudW1lcmFibGUoY3VyKSkgewogICAgICBpZiAoYmxvY2tLZXl3b3Jkcy5wcm9wZXJ0eUlzRW51bWVyYWJsZShjdXIpKSBjdXJQdW5jID0gIm5ld3N0YXRlbWVudCI7CiAgICAgIHJldHVybiAidmFyaWFibGUiOwogICAgfSBlbHNlIGlmICh2YXJpYWJsZV8yLnByb3BlcnR5SXNFbnVtZXJhYmxlKGN1cikpIHsKICAgICAgaWYgKGJsb2NrS2V5d29yZHMucHJvcGVydHlJc0VudW1lcmFibGUoY3VyKSkgY3VyUHVuYyA9ICJuZXdzdGF0ZW1lbnQiOwogICAgICByZXR1cm4gInZhcmlhYmxlLTIiOwogICAgfSBlbHNlIGlmICh2YXJpYWJsZV8zLnByb3BlcnR5SXNFbnVtZXJhYmxlKGN1cikpIHsKICAgICAgaWYgKGJsb2NrS2V5d29yZHMucHJvcGVydHlJc0VudW1lcmFibGUoY3VyKSkgY3VyUHVuYyA9ICJuZXdzdGF0ZW1lbnQiOwogICAgICByZXR1cm4gInZhcmlhYmxlLTMiOwogICAgfSBlbHNlIGlmIChidWlsdGluLnByb3BlcnR5SXNFbnVtZXJhYmxlKGN1cikpIHsKICAgICAgaWYgKGJsb2NrS2V5d29yZHMucHJvcGVydHlJc0VudW1lcmFibGUoY3VyKSkgY3VyUHVuYyA9ICJuZXdzdGF0ZW1lbnQiOwogICAgICByZXR1cm4gImJ1aWx0aW4iOwogICAgfSBlbHNlIHsgLy9EYXRhIHR5cGVzIGFyZSBvZiBmcm9tIEtFWVdPUkQjIwogICAgICAgICAgICAgICAgdmFyIGkgPSBjdXIubGVuZ3RoIC0gMTsKICAgICAgICAgICAgICAgIHdoaWxlKGkgPj0gMCAmJiAoIWlzTmFOKGN1cltpXSkgfHwgY3VyW2ldID09ICdfJykpCiAgICAgICAgICAgICAgICAgICAgICAgIC0taTsKCiAgICAgICAgICAgICAgICBpZiAoaSA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGN1cjIgPSBjdXIuc3Vic3RyKDAsIGkgKyAxKTsKICAgICAgICAgICAgICAgIGlmICh2YXJpYWJsZV8zLnByb3BlcnR5SXNFbnVtZXJhYmxlKGN1cjIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChibG9ja0tleXdvcmRzLnByb3BlcnR5SXNFbnVtZXJhYmxlKGN1cjIpKSBjdXJQdW5jID0gIm5ld3N0YXRlbWVudCI7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAidmFyaWFibGUtMyI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgIH0KICAgIGlmIChhdG9tcy5wcm9wZXJ0eUlzRW51bWVyYWJsZShjdXIpKSByZXR1cm4gImF0b20iOwogICAgcmV0dXJuIG51bGw7CiAgfQoKICBmdW5jdGlvbiB0b2tlblN0cmluZyhxdW90ZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgdmFyIGVzY2FwZWQgPSBmYWxzZSwgbmV4dCwgZW5kID0gZmFsc2U7CiAgICAgIHdoaWxlICgobmV4dCA9IHN0cmVhbS5uZXh0KCkpICE9IG51bGwpIHsKICAgICAgICBpZiAobmV4dCA9PSBxdW90ZSAmJiAhZXNjYXBlZCkge2VuZCA9IHRydWU7IGJyZWFrO30KICAgICAgICBlc2NhcGVkID0gIWVzY2FwZWQgJiYgbmV4dCA9PSAiXFwiOwogICAgICB9CiAgICAgIGlmIChlbmQgfHwgIWVzY2FwZWQpCiAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICAgIHJldHVybiAic3RyaW5nIjsKICAgIH07CiAgfQoKICBmdW5jdGlvbiB0b2tlbkNvbW1lbnQoc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIG1heWJlRW5kID0gZmFsc2UsIGNoOwogICAgd2hpbGUgKGNoID0gc3RyZWFtLm5leHQoKSkgewogICAgICBpZiAoY2ggPT0gIi8iICYmIG1heWJlRW5kKSB7CiAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgbWF5YmVFbmQgPSAoY2ggPT0gIioiKTsKICAgIH0KICAgIHJldHVybiAiY29tbWVudCI7CiAgfQoKICBmdW5jdGlvbiBDb250ZXh0KGluZGVudGVkLCBjb2x1bW4sIHR5cGUsIGFsaWduLCBwcmV2KSB7CiAgICB0aGlzLmluZGVudGVkID0gaW5kZW50ZWQ7CiAgICB0aGlzLmNvbHVtbiA9IGNvbHVtbjsKICAgIHRoaXMudHlwZSA9IHR5cGU7CiAgICB0aGlzLmFsaWduID0gYWxpZ247CiAgICB0aGlzLnByZXYgPSBwcmV2OwogIH0KICBmdW5jdGlvbiBwdXNoQ29udGV4dChzdGF0ZSwgY29sLCB0eXBlKSB7CiAgICByZXR1cm4gc3RhdGUuY29udGV4dCA9IG5ldyBDb250ZXh0KHN0YXRlLmluZGVudGVkLCBjb2wsIHR5cGUsIG51bGwsIHN0YXRlLmNvbnRleHQpOwogIH0KICBmdW5jdGlvbiBwb3BDb250ZXh0KHN0YXRlKSB7CiAgICB2YXIgdCA9IHN0YXRlLmNvbnRleHQudHlwZTsKICAgIGlmICh0ID09ICIpIiB8fCB0ID09ICJdIiB8fCB0ID09ICJ9IikKICAgICAgc3RhdGUuaW5kZW50ZWQgPSBzdGF0ZS5jb250ZXh0LmluZGVudGVkOwogICAgcmV0dXJuIHN0YXRlLmNvbnRleHQgPSBzdGF0ZS5jb250ZXh0LnByZXY7CiAgfQoKICAvLyBJbnRlcmZhY2UKCiAgcmV0dXJuIHsKICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKGJhc2Vjb2x1bW4pIHsKICAgICAgcmV0dXJuIHsKICAgICAgICB0b2tlbml6ZTogbnVsbCwKICAgICAgICBjb250ZXh0OiBuZXcgQ29udGV4dCgoYmFzZWNvbHVtbiB8fCAwKSAtIGluZGVudFVuaXQsIDAsICJ0b3AiLCBmYWxzZSksCiAgICAgICAgaW5kZW50ZWQ6IDAsCiAgICAgICAgc3RhcnRPZkxpbmU6IHRydWUKICAgICAgfTsKICAgIH0sCgogICAgdG9rZW46IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgdmFyIGN0eCA9IHN0YXRlLmNvbnRleHQ7CiAgICAgIGlmIChzdHJlYW0uc29sKCkpIHsKICAgICAgICBpZiAoY3R4LmFsaWduID09IG51bGwpIGN0eC5hbGlnbiA9IGZhbHNlOwogICAgICAgIHN0YXRlLmluZGVudGVkID0gc3RyZWFtLmluZGVudGF0aW9uKCk7CiAgICAgICAgc3RhdGUuc3RhcnRPZkxpbmUgPSB0cnVlOwogICAgICB9CiAgICAgIGlmIChzdHJlYW0uZWF0U3BhY2UoKSkgcmV0dXJuIG51bGw7CiAgICAgIGN1clB1bmMgPSBudWxsOwogICAgICB2YXIgc3R5bGUgPSAoc3RhdGUudG9rZW5pemUgfHwgdG9rZW5CYXNlKShzdHJlYW0sIHN0YXRlKTsKICAgICAgaWYgKHN0eWxlID09ICJjb21tZW50IiB8fCBzdHlsZSA9PSAibWV0YSIpIHJldHVybiBzdHlsZTsKICAgICAgaWYgKGN0eC5hbGlnbiA9PSBudWxsKSBjdHguYWxpZ24gPSB0cnVlOwoKICAgICAgaWYgKChjdXJQdW5jID09ICI7IiB8fCBjdXJQdW5jID09ICI6IikgJiYgY3R4LnR5cGUgPT0gInN0YXRlbWVudCIpIHBvcENvbnRleHQoc3RhdGUpOwogICAgICBlbHNlIGlmIChjdXJQdW5jID09ICJ7IikgcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbS5jb2x1bW4oKSwgIn0iKTsKICAgICAgZWxzZSBpZiAoY3VyUHVuYyA9PSAiWyIpIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0uY29sdW1uKCksICJdIik7CiAgICAgIGVsc2UgaWYgKGN1clB1bmMgPT0gIigiKSBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLmNvbHVtbigpLCAiKSIpOwogICAgICBlbHNlIGlmIChjdXJQdW5jID09ICJ9IikgewogICAgICAgIHdoaWxlIChjdHgudHlwZSA9PSAic3RhdGVtZW50IikgY3R4ID0gcG9wQ29udGV4dChzdGF0ZSk7CiAgICAgICAgaWYgKGN0eC50eXBlID09ICJ9IikgY3R4ID0gcG9wQ29udGV4dChzdGF0ZSk7CiAgICAgICAgd2hpbGUgKGN0eC50eXBlID09ICJzdGF0ZW1lbnQiKSBjdHggPSBwb3BDb250ZXh0KHN0YXRlKTsKICAgICAgfQogICAgICBlbHNlIGlmIChjdXJQdW5jID09IGN0eC50eXBlKSBwb3BDb250ZXh0KHN0YXRlKTsKICAgICAgZWxzZSBpZiAoY3R4LnR5cGUgPT0gIn0iIHx8IGN0eC50eXBlID09ICJ0b3AiIHx8IChjdHgudHlwZSA9PSAic3RhdGVtZW50IiAmJiBjdXJQdW5jID09ICJuZXdzdGF0ZW1lbnQiKSkKICAgICAgICBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLmNvbHVtbigpLCAic3RhdGVtZW50Iik7CiAgICAgIHN0YXRlLnN0YXJ0T2ZMaW5lID0gZmFsc2U7CiAgICAgIHJldHVybiBzdHlsZTsKICAgIH0sCgogICAgaW5kZW50OiBmdW5jdGlvbihzdGF0ZSwgdGV4dEFmdGVyKSB7CiAgICAgIGlmIChzdGF0ZS50b2tlbml6ZSAhPSB0b2tlbkJhc2UgJiYgc3RhdGUudG9rZW5pemUgIT0gbnVsbCkgcmV0dXJuIDA7CiAgICAgIHZhciBjdHggPSBzdGF0ZS5jb250ZXh0LCBmaXJzdENoYXIgPSB0ZXh0QWZ0ZXIgJiYgdGV4dEFmdGVyLmNoYXJBdCgwKTsKICAgICAgaWYgKGN0eC50eXBlID09ICJzdGF0ZW1lbnQiICYmIGZpcnN0Q2hhciA9PSAifSIpIGN0eCA9IGN0eC5wcmV2OwogICAgICB2YXIgY2xvc2luZyA9IGZpcnN0Q2hhciA9PSBjdHgudHlwZTsKICAgICAgaWYgKGN0eC50eXBlID09ICJzdGF0ZW1lbnQiKSByZXR1cm4gY3R4LmluZGVudGVkICsgKGZpcnN0Q2hhciA9PSAieyIgPyAwIDogaW5kZW50VW5pdCk7CiAgICAgIGVsc2UgaWYgKGN0eC5hbGlnbikgcmV0dXJuIGN0eC5jb2x1bW4gKyAoY2xvc2luZyA/IDAgOiAxKTsKICAgICAgZWxzZSByZXR1cm4gY3R4LmluZGVudGVkICsgKGNsb3NpbmcgPyAwIDogaW5kZW50VW5pdCk7CiAgICB9LAoKICAgIGVsZWN0cmljQ2hhcnM6ICJ7fSIKICB9Owp9KTsKCkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC94LWVjbCIsICJlY2wiKTsKCn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/ecl/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogRUNMIG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iZWNsLmpzIj48L3NjcmlwdD4KPHN0eWxlPi5Db2RlTWlycm9yIHtib3JkZXI6IDFweCBzb2xpZCBibGFjazt9PC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aDE+Q29kZU1pcnJvcjwvaDE+PGltZyBpZD1sb2dvIHNyYz0iLi4vLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+TGFuZ3VhZ2UgbW9kZXM8L2E+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPkVDTDwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+RUNMIG1vZGU8L2gyPgo8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgovKgpzYW1wbGUgdXNlbGVzcyBjb2RlIHRvIGRlbW9uc3RyYXRlIGVjbCBzeW50YXggaGlnaGxpZ2h0aW5nCnRoaXMgaXMgYSBtdWx0aWxpbmUgY29tbWVudCEKKi8KCi8vICB0aGlzIGlzIGEgc2luZ2xlbGluZSBjb21tZW50IQoKaW1wb3J0IHV0OwpyIDo9IAogIHJlY29yZAogICBzdHJpbmcyMiBzMSA6PSAnMTIzJzsKICAgaW50ZWdlcjQgaTEgOj0gMTIzOwogIGVuZDsKI29wdGlvbigndG1wJywgdHJ1ZSk7CmQgOj0gZGF0YXNldCgndG1wOjpxYicsIHIsIHRob3IpOwpvdXRwdXQoZCk7CjwvdGV4dGFyZWE+PC9mb3JtPgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHt9KTsKICAgIDwvc2NyaXB0PgoKICAgIDxwPkJhc2VkIG9uIENvZGVNaXJyb3IncyBjbGlrZSBtb2RlLiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlIDxhIGhyZWY9Imh0dHA6Ly9ocGNjc3lzdGVtcy5jb20iPkhQQ0MgU3lzdGVtczwvYT4gd2ViIHNpdGUuPC9wPgogICAgPHA+PHN0cm9uZz5NSU1FIHR5cGVzIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPnRleHQveC1lY2w8L2NvZGU+LjwvcD4KCiAgPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/eiffel/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/eiffel/eiffel.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJlaWZmZWwiLCBmdW5jdGlvbigpIHsKICBmdW5jdGlvbiB3b3JkT2JqKHdvcmRzKSB7CiAgICB2YXIgbyA9IHt9OwogICAgZm9yICh2YXIgaSA9IDAsIGUgPSB3b3Jkcy5sZW5ndGg7IGkgPCBlOyArK2kpIG9bd29yZHNbaV1dID0gdHJ1ZTsKICAgIHJldHVybiBvOwogIH0KICB2YXIga2V5d29yZHMgPSB3b3JkT2JqKFsKICAgICdub3RlJywKICAgICdhY3Jvc3MnLAogICAgJ3doZW4nLAogICAgJ3ZhcmlhbnQnLAogICAgJ3VudGlsJywKICAgICd1bmlxdWUnLAogICAgJ3VuZGVmaW5lJywKICAgICd0aGVuJywKICAgICdzdHJpcCcsCiAgICAnc2VsZWN0JywKICAgICdyZXRyeScsCiAgICAncmVzY3VlJywKICAgICdyZXF1aXJlJywKICAgICdyZW5hbWUnLAogICAgJ3JlZmVyZW5jZScsCiAgICAncmVkZWZpbmUnLAogICAgJ3ByZWZpeCcsCiAgICAnb25jZScsCiAgICAnb2xkJywKICAgICdvYnNvbGV0ZScsCiAgICAnbG9vcCcsCiAgICAnbG9jYWwnLAogICAgJ2xpa2UnLAogICAgJ2lzJywKICAgICdpbnNwZWN0JywKICAgICdpbmZpeCcsCiAgICAnaW5jbHVkZScsCiAgICAnaWYnLAogICAgJ2Zyb3plbicsCiAgICAnZnJvbScsCiAgICAnZXh0ZXJuYWwnLAogICAgJ2V4cG9ydCcsCiAgICAnZW5zdXJlJywKICAgICdlbmQnLAogICAgJ2Vsc2VpZicsCiAgICAnZWxzZScsCiAgICAnZG8nLAogICAgJ2NyZWF0aW9uJywKICAgICdjcmVhdGUnLAogICAgJ2NoZWNrJywKICAgICdhbGlhcycsCiAgICAnYWdlbnQnLAogICAgJ3NlcGFyYXRlJywKICAgICdpbnZhcmlhbnQnLAogICAgJ2luaGVyaXQnLAogICAgJ2luZGV4aW5nJywKICAgICdmZWF0dXJlJywKICAgICdleHBhbmRlZCcsCiAgICAnZGVmZXJyZWQnLAogICAgJ2NsYXNzJywKICAgICdWb2lkJywKICAgICdUcnVlJywKICAgICdSZXN1bHQnLAogICAgJ1ByZWN1cnNvcicsCiAgICAnRmFsc2UnLAogICAgJ0N1cnJlbnQnLAogICAgJ2NyZWF0ZScsCiAgICAnYXR0YWNoZWQnLAogICAgJ2RldGFjaGFibGUnLAogICAgJ2FzJywKICAgICdhbmQnLAogICAgJ2ltcGxpZXMnLAogICAgJ25vdCcsCiAgICAnb3InCiAgXSk7CiAgdmFyIG9wZXJhdG9ycyA9IHdvcmRPYmooWyI6PSIsICJhbmQgdGhlbiIsImFuZCIsICJvciIsIjw8IiwiPj4iXSk7CgogIGZ1bmN0aW9uIGNoYWluKG5ld3Rvaywgc3RyZWFtLCBzdGF0ZSkgewogICAgc3RhdGUudG9rZW5pemUucHVzaChuZXd0b2spOwogICAgcmV0dXJuIG5ld3RvayhzdHJlYW0sIHN0YXRlKTsKICB9CgogIGZ1bmN0aW9uIHRva2VuQmFzZShzdHJlYW0sIHN0YXRlKSB7CiAgICBpZiAoc3RyZWFtLmVhdFNwYWNlKCkpIHJldHVybiBudWxsOwogICAgdmFyIGNoID0gc3RyZWFtLm5leHQoKTsKICAgIGlmIChjaCA9PSAnIid8fGNoID09ICInIikgewogICAgICByZXR1cm4gY2hhaW4ocmVhZFF1b3RlZChjaCwgInN0cmluZyIpLCBzdHJlYW0sIHN0YXRlKTsKICAgIH0gZWxzZSBpZiAoY2ggPT0gIi0iJiZzdHJlYW0uZWF0KCItIikpIHsKICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICByZXR1cm4gImNvbW1lbnQiOwogICAgfSBlbHNlIGlmIChjaCA9PSAiOiImJnN0cmVhbS5lYXQoIj0iKSkgewogICAgICByZXR1cm4gIm9wZXJhdG9yIjsKICAgIH0gZWxzZSBpZiAoL1swLTldLy50ZXN0KGNoKSkgewogICAgICBzdHJlYW0uZWF0V2hpbGUoL1t4WGJCQ2MwLTlcLl0vKTsKICAgICAgc3RyZWFtLmVhdCgvW1w/XCFdLyk7CiAgICAgIHJldHVybiAiaWRlbnQiOwogICAgfSBlbHNlIGlmICgvW2EtekEtWl8wLTldLy50ZXN0KGNoKSkgewogICAgICBzdHJlYW0uZWF0V2hpbGUoL1thLXpBLVpfMC05XS8pOwogICAgICBzdHJlYW0uZWF0KC9bXD9cIV0vKTsKICAgICAgcmV0dXJuICJpZGVudCI7CiAgICB9IGVsc2UgaWYgKC9bPStcLVwvKl4lPD5+XS8udGVzdChjaCkpIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bPStcLVwvKl4lPD5+XS8pOwogICAgICByZXR1cm4gIm9wZXJhdG9yIjsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogIH0KCiAgZnVuY3Rpb24gcmVhZFF1b3RlZChxdW90ZSwgc3R5bGUsICB1bmVzY2FwZWQpIHsKICAgIHJldHVybiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHZhciBlc2NhcGVkID0gZmFsc2UsIGNoOwogICAgICB3aGlsZSAoKGNoID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkgewogICAgICAgIGlmIChjaCA9PSBxdW90ZSAmJiAodW5lc2NhcGVkIHx8ICFlc2NhcGVkKSkgewogICAgICAgICAgc3RhdGUudG9rZW5pemUucG9wKCk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgZXNjYXBlZCA9ICFlc2NhcGVkICYmIGNoID09ICIlIjsKICAgICAgfQogICAgICByZXR1cm4gc3R5bGU7CiAgICB9OwogIH0KCiAgcmV0dXJuIHsKICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4ge3Rva2VuaXplOiBbdG9rZW5CYXNlXX07CiAgICB9LAoKICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHZhciBzdHlsZSA9IHN0YXRlLnRva2VuaXplW3N0YXRlLnRva2VuaXplLmxlbmd0aC0xXShzdHJlYW0sIHN0YXRlKTsKICAgICAgaWYgKHN0eWxlID09ICJpZGVudCIpIHsKICAgICAgICB2YXIgd29yZCA9IHN0cmVhbS5jdXJyZW50KCk7CiAgICAgICAgc3R5bGUgPSBrZXl3b3Jkcy5wcm9wZXJ0eUlzRW51bWVyYWJsZShzdHJlYW0uY3VycmVudCgpKSA/ICJrZXl3b3JkIgogICAgICAgICAgOiBvcGVyYXRvcnMucHJvcGVydHlJc0VudW1lcmFibGUoc3RyZWFtLmN1cnJlbnQoKSkgPyAib3BlcmF0b3IiCiAgICAgICAgICA6IC9eW0EtWl1bQS1aXzAtOV0qJC9nLnRlc3Qod29yZCkgPyAidGFnIgogICAgICAgICAgOiAvXjBbYkJdWzAtMV0rJC9nLnRlc3Qod29yZCkgPyAibnVtYmVyIgogICAgICAgICAgOiAvXjBbY0NdWzAtN10rJC9nLnRlc3Qod29yZCkgPyAibnVtYmVyIgogICAgICAgICAgOiAvXjBbeFhdW2EtZkEtRjAtOV0rJC9nLnRlc3Qod29yZCkgPyAibnVtYmVyIgogICAgICAgICAgOiAvXihbMC05XStcLlswLTldKil8KFswLTldKlwuWzAtOV0rKSQvZy50ZXN0KHdvcmQpID8gIm51bWJlciIKICAgICAgICAgIDogL15bMC05XSskL2cudGVzdCh3b3JkKSA/ICJudW1iZXIiCiAgICAgICAgICA6ICJ2YXJpYWJsZSI7CiAgICAgIH0KICAgICAgcmV0dXJuIHN0eWxlOwogICAgfSwKICAgIGxpbmVDb21tZW50OiAiLS0iCiAgfTsKfSk7CgpDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveC1laWZmZWwiLCAiZWlmZmVsIik7Cgp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/eiffel/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogRWlmZmVsIG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL3RoZW1lL25lYXQuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9ImVpZmZlbC5qcyI+PC9zY3JpcHQ+CjxzdHlsZT4KICAgICAgLkNvZGVNaXJyb3Ige2JvcmRlci10b3A6IDFweCBzb2xpZCBibGFjazsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO30KICAgICAgLmNtLXMtZGVmYXVsdCBzcGFuLmNtLWFycm93IHsgY29sb3I6IHJlZDsgfQogICAgPC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aDE+Q29kZU1pcnJvcjwvaDE+PGltZyBpZD1sb2dvIHNyYz0iLi4vLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+TGFuZ3VhZ2UgbW9kZXM8L2E+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPkVpZmZlbDwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+RWlmZmVsIG1vZGU8L2gyPgo8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgpub3RlCiAgICBkZXNjcmlwdGlvbjogIlsKICAgICAgICBQcm9qZWN0LXdpZGUgdW5pdmVyc2FsIHByb3BlcnRpZXMuCiAgICAgICAgVGhpcyBjbGFzcyBpcyBhbiBhbmNlc3RvciB0byBhbGwgZGV2ZWxvcGVyLXdyaXR0ZW4gY2xhc3Nlcy4KICAgICAgICBBTlkgbWF5IGJlIGN1c3RvbWl6ZWQgZm9yIGluZGl2aWR1YWwgcHJvamVjdHMgb3IgdGVhbXMuCiAgICAgICAgXSIKCiAgICBsaWJyYXJ5OiAiRnJlZSBpbXBsZW1lbnRhdGlvbiBvZiBFTEtTIGxpYnJhcnkiCiAgICBzdGF0dXM6ICJTZWUgbm90aWNlIGF0IGVuZCBvZiBjbGFzcy4iCiAgICBsZWdhbDogIlNlZSBub3RpY2UgYXQgZW5kIG9mIGNsYXNzLiIKICAgIGRhdGU6ICIkRGF0ZTogMjAxMy0wMS0yNSAxMTo0OTowMCAtMDgwMCAoRnJpLCAyNSBKYW4gMjAxMykgJCIKICAgIHJldmlzaW9uOiAiJFJldmlzaW9uOiA3MTIgJCIKCmNsYXNzCiAgICBBTlkKCmZlYXR1cmUgLS0gQ3VzdG9taXphdGlvbgoKZmVhdHVyZSAtLSBBY2Nlc3MKCiAgICBnZW5lcmF0b3I6IFNUUklORwogICAgICAgICAgICAtLSBOYW1lIG9mIGN1cnJlbnQgb2JqZWN0J3MgZ2VuZXJhdGluZyBjbGFzcwogICAgICAgICAgICAtLSAoYmFzZSBjbGFzcyBvZiB0aGUgdHlwZSBvZiB3aGljaCBpdCBpcyBhIGRpcmVjdCBpbnN0YW5jZSkKICAgICAgICBleHRlcm5hbAogICAgICAgICAgICAiYnVpbHRfaW4iCiAgICAgICAgZW5zdXJlCiAgICAgICAgICAgIGdlbmVyYXRvcl9ub3Rfdm9pZDogUmVzdWx0IC89IFZvaWQKICAgICAgICAgICAgZ2VuZXJhdG9yX25vdF9lbXB0eTogbm90IFJlc3VsdC5pc19lbXB0eQogICAgICAgIGVuZAoKICAgIGdlbmVyYXRpbmdfdHlwZTogVFlQRSBbZGV0YWNoYWJsZSBsaWtlIEN1cnJlbnRdCiAgICAgICAgICAgIC0tIFR5cGUgb2YgY3VycmVudCBvYmplY3QKICAgICAgICAgICAgLS0gKHR5cGUgb2Ygd2hpY2ggaXQgaXMgYSBkaXJlY3QgaW5zdGFuY2UpCiAgICAgICAgZG8KICAgICAgICAgICAgUmVzdWx0IDo9IHtkZXRhY2hhYmxlIGxpa2UgQ3VycmVudH0KICAgICAgICBlbnN1cmUKICAgICAgICAgICAgZ2VuZXJhdGluZ190eXBlX25vdF92b2lkOiBSZXN1bHQgLz0gVm9pZAogICAgICAgIGVuZAoKZmVhdHVyZSAtLSBTdGF0dXMgcmVwb3J0CgogICAgY29uZm9ybXNfdG8gKG90aGVyOiBBTlkpOiBCT09MRUFOCiAgICAgICAgICAgIC0tIERvZXMgdHlwZSBvZiBjdXJyZW50IG9iamVjdCBjb25mb3JtIHRvIHR5cGUKICAgICAgICAgICAgLS0gb2YgYG90aGVyJyAoYXMgcGVyIEVpZmZlbDogVGhlIExhbmd1YWdlLCBjaGFwdGVyIDEzKT8KICAgICAgICByZXF1aXJlCiAgICAgICAgICAgIG90aGVyX25vdF92b2lkOiBvdGhlciAvPSBWb2lkCiAgICAgICAgZXh0ZXJuYWwKICAgICAgICAgICAgImJ1aWx0X2luIgogICAgICAgIGVuZAoKICAgIHNhbWVfdHlwZSAob3RoZXI6IEFOWSk6IEJPT0xFQU4KICAgICAgICAgICAgLS0gSXMgdHlwZSBvZiBjdXJyZW50IG9iamVjdCBpZGVudGljYWwgdG8gdHlwZSBvZiBgb3RoZXInPwogICAgICAgIHJlcXVpcmUKICAgICAgICAgICAgb3RoZXJfbm90X3ZvaWQ6IG90aGVyIC89IFZvaWQKICAgICAgICBleHRlcm5hbAogICAgICAgICAgICAiYnVpbHRfaW4iCiAgICAgICAgZW5zdXJlCiAgICAgICAgICAgIGRlZmluaXRpb246IFJlc3VsdCA9IChjb25mb3Jtc190byAob3RoZXIpIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXIuY29uZm9ybXNfdG8gKEN1cnJlbnQpKQogICAgICAgIGVuZAoKZmVhdHVyZSAtLSBDb21wYXJpc29uCgogICAgaXNfZXF1YWwgKG90aGVyOiBsaWtlIEN1cnJlbnQpOiBCT09MRUFOCiAgICAgICAgICAgIC0tIElzIGBvdGhlcicgYXR0YWNoZWQgdG8gYW4gb2JqZWN0IGNvbnNpZGVyZWQKICAgICAgICAgICAgLS0gZXF1YWwgdG8gY3VycmVudCBvYmplY3Q/CiAgICAgICAgcmVxdWlyZQogICAgICAgICAgICBvdGhlcl9ub3Rfdm9pZDogb3RoZXIgLz0gVm9pZAogICAgICAgIGV4dGVybmFsCiAgICAgICAgICAgICJidWlsdF9pbiIKICAgICAgICBlbnN1cmUKICAgICAgICAgICAgc3ltbWV0cmljOiBSZXN1bHQgaW1wbGllcyBvdGhlciB+IEN1cnJlbnQKICAgICAgICAgICAgY29uc2lzdGVudDogc3RhbmRhcmRfaXNfZXF1YWwgKG90aGVyKSBpbXBsaWVzIFJlc3VsdAogICAgICAgIGVuZAoKICAgIGZyb3plbiBzdGFuZGFyZF9pc19lcXVhbCAob3RoZXI6IGxpa2UgQ3VycmVudCk6IEJPT0xFQU4KICAgICAgICAgICAgLS0gSXMgYG90aGVyJyBhdHRhY2hlZCB0byBhbiBvYmplY3Qgb2YgdGhlIHNhbWUgdHlwZQogICAgICAgICAgICAtLSBhcyBjdXJyZW50IG9iamVjdCwgYW5kIGZpZWxkLWJ5LWZpZWxkIGlkZW50aWNhbCB0byBpdD8KICAgICAgICByZXF1aXJlCiAgICAgICAgICAgIG90aGVyX25vdF92b2lkOiBvdGhlciAvPSBWb2lkCiAgICAgICAgZXh0ZXJuYWwKICAgICAgICAgICAgImJ1aWx0X2luIgogICAgICAgIGVuc3VyZQogICAgICAgICAgICBzYW1lX3R5cGU6IFJlc3VsdCBpbXBsaWVzIHNhbWVfdHlwZSAob3RoZXIpCiAgICAgICAgICAgIHN5bW1ldHJpYzogUmVzdWx0IGltcGxpZXMgb3RoZXIuc3RhbmRhcmRfaXNfZXF1YWwgKEN1cnJlbnQpCiAgICAgICAgZW5kCgogICAgZnJvemVuIGVxdWFsIChhOiBkZXRhY2hhYmxlIEFOWTsgYjogbGlrZSBhKTogQk9PTEVBTgogICAgICAgICAgICAtLSBBcmUgYGEnIGFuZCBgYicgZWl0aGVyIGJvdGggdm9pZCBvciBhdHRhY2hlZAogICAgICAgICAgICAtLSB0byBvYmplY3RzIGNvbnNpZGVyZWQgZXF1YWw/CiAgICAgICAgZG8KICAgICAgICAgICAgaWYgYSA9IFZvaWQgdGhlbgogICAgICAgICAgICAgICAgUmVzdWx0IDo9IGIgPSBWb2lkCiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIFJlc3VsdCA6PSBiIC89IFZvaWQgYW5kIHRoZW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuaXNfZXF1YWwgKGIpCiAgICAgICAgICAgIGVuZAogICAgICAgIGVuc3VyZQogICAgICAgICAgICBkZWZpbml0aW9uOiBSZXN1bHQgPSAoYSA9IFZvaWQgYW5kIGIgPSBWb2lkKSBvciBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICgoYSAvPSBWb2lkIGFuZCBiIC89IFZvaWQpIGFuZCB0aGVuCiAgICAgICAgICAgICAgICAgICAgICAgIGEuaXNfZXF1YWwgKGIpKQogICAgICAgIGVuZAoKICAgIGZyb3plbiBzdGFuZGFyZF9lcXVhbCAoYTogZGV0YWNoYWJsZSBBTlk7IGI6IGxpa2UgYSk6IEJPT0xFQU4KICAgICAgICAgICAgLS0gQXJlIGBhJyBhbmQgYGInIGVpdGhlciBib3RoIHZvaWQgb3IgYXR0YWNoZWQgdG8KICAgICAgICAgICAgLS0gZmllbGQtYnktZmllbGQgaWRlbnRpY2FsIG9iamVjdHMgb2YgdGhlIHNhbWUgdHlwZT8KICAgICAgICAgICAgLS0gQWx3YXlzIHVzZXMgZGVmYXVsdCBvYmplY3QgY29tcGFyaXNvbiBjcml0ZXJpb24uCiAgICAgICAgZG8KICAgICAgICAgICAgaWYgYSA9IFZvaWQgdGhlbgogICAgICAgICAgICAgICAgUmVzdWx0IDo9IGIgPSBWb2lkCiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIFJlc3VsdCA6PSBiIC89IFZvaWQgYW5kIHRoZW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGEuc3RhbmRhcmRfaXNfZXF1YWwgKGIpCiAgICAgICAgICAgIGVuZAogICAgICAgIGVuc3VyZQogICAgICAgICAgICBkZWZpbml0aW9uOiBSZXN1bHQgPSAoYSA9IFZvaWQgYW5kIGIgPSBWb2lkKSBvciBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICgoYSAvPSBWb2lkIGFuZCBiIC89IFZvaWQpIGFuZCB0aGVuCiAgICAgICAgICAgICAgICAgICAgICAgIGEuc3RhbmRhcmRfaXNfZXF1YWwgKGIpKQogICAgICAgIGVuZAoKICAgIGZyb3plbiBpc19kZWVwX2VxdWFsIChvdGhlcjogbGlrZSBDdXJyZW50KTogQk9PTEVBTgogICAgICAgICAgICAtLSBBcmUgYEN1cnJlbnQnIGFuZCBgb3RoZXInIGF0dGFjaGVkIHRvIGlzb21vcnBoaWMgb2JqZWN0IHN0cnVjdHVyZXM/CiAgICAgICAgcmVxdWlyZQogICAgICAgICAgICBvdGhlcl9ub3Rfdm9pZDogb3RoZXIgLz0gVm9pZAogICAgICAgIGV4dGVybmFsCiAgICAgICAgICAgICJidWlsdF9pbiIKICAgICAgICBlbnN1cmUKICAgICAgICAgICAgc2hhbGxvd19pbXBsaWVzX2RlZXA6IHN0YW5kYXJkX2lzX2VxdWFsIChvdGhlcikgaW1wbGllcyBSZXN1bHQKICAgICAgICAgICAgc2FtZV90eXBlOiBSZXN1bHQgaW1wbGllcyBzYW1lX3R5cGUgKG90aGVyKQogICAgICAgICAgICBzeW1tZXRyaWM6IFJlc3VsdCBpbXBsaWVzIG90aGVyLmlzX2RlZXBfZXF1YWwgKEN1cnJlbnQpCiAgICAgICAgZW5kCgogICAgZnJvemVuIGRlZXBfZXF1YWwgKGE6IGRldGFjaGFibGUgQU5ZOyBiOiBsaWtlIGEpOiBCT09MRUFOCiAgICAgICAgICAgIC0tIEFyZSBgYScgYW5kIGBiJyBlaXRoZXIgYm90aCB2b2lkCiAgICAgICAgICAgIC0tIG9yIGF0dGFjaGVkIHRvIGlzb21vcnBoaWMgb2JqZWN0IHN0cnVjdHVyZXM/CiAgICAgICAgZG8KICAgICAgICAgICAgaWYgYSA9IFZvaWQgdGhlbgogICAgICAgICAgICAgICAgUmVzdWx0IDo9IGIgPSBWb2lkCiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIFJlc3VsdCA6PSBiIC89IFZvaWQgYW5kIHRoZW4gYS5pc19kZWVwX2VxdWFsIChiKQogICAgICAgICAgICBlbmQKICAgICAgICBlbnN1cmUKICAgICAgICAgICAgc2hhbGxvd19pbXBsaWVzX2RlZXA6IHN0YW5kYXJkX2VxdWFsIChhLCBiKSBpbXBsaWVzIFJlc3VsdAogICAgICAgICAgICBib3RoX29yX25vbmVfdm9pZDogKGEgPSBWb2lkKSBpbXBsaWVzIChSZXN1bHQgPSAoYiA9IFZvaWQpKQogICAgICAgICAgICBzYW1lX3R5cGU6IChSZXN1bHQgYW5kIChhIC89IFZvaWQpKSBpbXBsaWVzIChiIC89IFZvaWQgYW5kIHRoZW4gYS5zYW1lX3R5cGUgKGIpKQogICAgICAgICAgICBzeW1tZXRyaWM6IFJlc3VsdCBpbXBsaWVzIGRlZXBfZXF1YWwgKGIsIGEpCiAgICAgICAgZW5kCgpmZWF0dXJlIC0tIER1cGxpY2F0aW9uCgogICAgZnJvemVuIHR3aW46IGxpa2UgQ3VycmVudAogICAgICAgICAgICAtLSBOZXcgb2JqZWN0IGVxdWFsIHRvIGBDdXJyZW50JwogICAgICAgICAgICAtLSBgdHdpbicgY2FsbHMgYGNvcHknOyB0byBjaGFuZ2UgY29weWluZy90d2lubmluZyBzZW1hbnRpY3MsIHJlZGVmaW5lIGBjb3B5Jy4KICAgICAgICBleHRlcm5hbAogICAgICAgICAgICAiYnVpbHRfaW4iCiAgICAgICAgZW5zdXJlCiAgICAgICAgICAgIHR3aW5fbm90X3ZvaWQ6IFJlc3VsdCAvPSBWb2lkCiAgICAgICAgICAgIGlzX2VxdWFsOiBSZXN1bHQgfiBDdXJyZW50CiAgICAgICAgZW5kCgogICAgY29weSAob3RoZXI6IGxpa2UgQ3VycmVudCkKICAgICAgICAgICAgLS0gVXBkYXRlIGN1cnJlbnQgb2JqZWN0IHVzaW5nIGZpZWxkcyBvZiBvYmplY3QgYXR0YWNoZWQKICAgICAgICAgICAgLS0gdG8gYG90aGVyJywgc28gYXMgdG8geWllbGQgZXF1YWwgb2JqZWN0cy4KICAgICAgICByZXF1aXJlCiAgICAgICAgICAgIG90aGVyX25vdF92b2lkOiBvdGhlciAvPSBWb2lkCiAgICAgICAgICAgIHR5cGVfaWRlbnRpdHk6IHNhbWVfdHlwZSAob3RoZXIpCiAgICAgICAgZXh0ZXJuYWwKICAgICAgICAgICAgImJ1aWx0X2luIgogICAgICAgIGVuc3VyZQogICAgICAgICAgICBpc19lcXVhbDogQ3VycmVudCB+IG90aGVyCiAgICAgICAgZW5kCgogICAgZnJvemVuIHN0YW5kYXJkX2NvcHkgKG90aGVyOiBsaWtlIEN1cnJlbnQpCiAgICAgICAgICAgIC0tIENvcHkgZXZlcnkgZmllbGQgb2YgYG90aGVyJyBvbnRvIGNvcnJlc3BvbmRpbmcgZmllbGQKICAgICAgICAgICAgLS0gb2YgY3VycmVudCBvYmplY3QuCiAgICAgICAgcmVxdWlyZQogICAgICAgICAgICBvdGhlcl9ub3Rfdm9pZDogb3RoZXIgLz0gVm9pZAogICAgICAgICAgICB0eXBlX2lkZW50aXR5OiBzYW1lX3R5cGUgKG90aGVyKQogICAgICAgIGV4dGVybmFsCiAgICAgICAgICAgICJidWlsdF9pbiIKICAgICAgICBlbnN1cmUKICAgICAgICAgICAgaXNfc3RhbmRhcmRfZXF1YWw6IHN0YW5kYXJkX2lzX2VxdWFsIChvdGhlcikKICAgICAgICBlbmQKCiAgICBmcm96ZW4gY2xvbmUgKG90aGVyOiBkZXRhY2hhYmxlIEFOWSk6IGxpa2Ugb3RoZXIKICAgICAgICAgICAgLS0gVm9pZCBpZiBgb3RoZXInIGlzIHZvaWQ7IG90aGVyd2lzZSBuZXcgb2JqZWN0CiAgICAgICAgICAgIC0tIGVxdWFsIHRvIGBvdGhlcicKICAgICAgICAgICAgLS0KICAgICAgICAgICAgLS0gRm9yIG5vbi12b2lkIGBvdGhlcicsIGBjbG9uZScgY2FsbHMgYGNvcHknOwogICAgICAgICAgICAtLSB0byBjaGFuZ2UgY29weWluZy9jbG9uaW5nIHNlbWFudGljcywgcmVkZWZpbmUgYGNvcHknLgogICAgICAgIG9ic29sZXRlCiAgICAgICAgICAgICJVc2UgYHR3aW4nIGluc3RlYWQuIgogICAgICAgIGRvCiAgICAgICAgICAgIGlmIG90aGVyIC89IFZvaWQgdGhlbgogICAgICAgICAgICAgICAgUmVzdWx0IDo9IG90aGVyLnR3aW4KICAgICAgICAgICAgZW5kCiAgICAgICAgZW5zdXJlCiAgICAgICAgICAgIGVxdWFsOiBSZXN1bHQgfiBvdGhlcgogICAgICAgIGVuZAoKICAgIGZyb3plbiBzdGFuZGFyZF9jbG9uZSAob3RoZXI6IGRldGFjaGFibGUgQU5ZKTogbGlrZSBvdGhlcgogICAgICAgICAgICAtLSBWb2lkIGlmIGBvdGhlcicgaXMgdm9pZDsgb3RoZXJ3aXNlIG5ldyBvYmplY3QKICAgICAgICAgICAgLS0gZmllbGQtYnktZmllbGQgaWRlbnRpY2FsIHRvIGBvdGhlcicuCiAgICAgICAgICAgIC0tIEFsd2F5cyB1c2VzIGRlZmF1bHQgY29weWluZyBzZW1hbnRpY3MuCiAgICAgICAgb2Jzb2xldGUKICAgICAgICAgICAgIlVzZSBgc3RhbmRhcmRfdHdpbicgaW5zdGVhZC4iCiAgICAgICAgZG8KICAgICAgICAgICAgaWYgb3RoZXIgLz0gVm9pZCB0aGVuCiAgICAgICAgICAgICAgICBSZXN1bHQgOj0gb3RoZXIuc3RhbmRhcmRfdHdpbgogICAgICAgICAgICBlbmQKICAgICAgICBlbnN1cmUKICAgICAgICAgICAgZXF1YWw6IHN0YW5kYXJkX2VxdWFsIChSZXN1bHQsIG90aGVyKQogICAgICAgIGVuZAoKICAgIGZyb3plbiBzdGFuZGFyZF90d2luOiBsaWtlIEN1cnJlbnQKICAgICAgICAgICAgLS0gTmV3IG9iamVjdCBmaWVsZC1ieS1maWVsZCBpZGVudGljYWwgdG8gYG90aGVyJy4KICAgICAgICAgICAgLS0gQWx3YXlzIHVzZXMgZGVmYXVsdCBjb3B5aW5nIHNlbWFudGljcy4KICAgICAgICBleHRlcm5hbAogICAgICAgICAgICAiYnVpbHRfaW4iCiAgICAgICAgZW5zdXJlCiAgICAgICAgICAgIHN0YW5kYXJkX3R3aW5fbm90X3ZvaWQ6IFJlc3VsdCAvPSBWb2lkCiAgICAgICAgICAgIGVxdWFsOiBzdGFuZGFyZF9lcXVhbCAoUmVzdWx0LCBDdXJyZW50KQogICAgICAgIGVuZAoKICAgIGZyb3plbiBkZWVwX3R3aW46IGxpa2UgQ3VycmVudAogICAgICAgICAgICAtLSBOZXcgb2JqZWN0IHN0cnVjdHVyZSByZWN1cnNpdmVseSBkdXBsaWNhdGVkIGZyb20gQ3VycmVudC4KICAgICAgICBleHRlcm5hbAogICAgICAgICAgICAiYnVpbHRfaW4iCiAgICAgICAgZW5zdXJlCiAgICAgICAgICAgIGRlZXBfdHdpbl9ub3Rfdm9pZDogUmVzdWx0IC89IFZvaWQKICAgICAgICAgICAgZGVlcF9lcXVhbDogZGVlcF9lcXVhbCAoQ3VycmVudCwgUmVzdWx0KQogICAgICAgIGVuZAoKICAgIGZyb3plbiBkZWVwX2Nsb25lIChvdGhlcjogZGV0YWNoYWJsZSBBTlkpOiBsaWtlIG90aGVyCiAgICAgICAgICAgIC0tIFZvaWQgaWYgYG90aGVyJyBpcyB2b2lkOiBvdGhlcndpc2UsIG5ldyBvYmplY3Qgc3RydWN0dXJlCiAgICAgICAgICAgIC0tIHJlY3Vyc2l2ZWx5IGR1cGxpY2F0ZWQgZnJvbSB0aGUgb25lIGF0dGFjaGVkIHRvIGBvdGhlcicKICAgICAgICBvYnNvbGV0ZQogICAgICAgICAgICAiVXNlIGBkZWVwX3R3aW4nIGluc3RlYWQuIgogICAgICAgIGRvCiAgICAgICAgICAgIGlmIG90aGVyIC89IFZvaWQgdGhlbgogICAgICAgICAgICAgICAgUmVzdWx0IDo9IG90aGVyLmRlZXBfdHdpbgogICAgICAgICAgICBlbmQKICAgICAgICBlbnN1cmUKICAgICAgICAgICAgZGVlcF9lcXVhbDogZGVlcF9lcXVhbCAob3RoZXIsIFJlc3VsdCkKICAgICAgICBlbmQKCiAgICBmcm96ZW4gZGVlcF9jb3B5IChvdGhlcjogbGlrZSBDdXJyZW50KQogICAgICAgICAgICAtLSBFZmZlY3QgZXF1aXZhbGVudCB0byB0aGF0IG9mOgogICAgICAgICAgICAtLSAgICAgIGBjb3B5JyAoYG90aGVyJyAuIGBkZWVwX3R3aW4nKQogICAgICAgIHJlcXVpcmUKICAgICAgICAgICAgb3RoZXJfbm90X3ZvaWQ6IG90aGVyIC89IFZvaWQKICAgICAgICBkbwogICAgICAgICAgICBjb3B5IChvdGhlci5kZWVwX3R3aW4pCiAgICAgICAgZW5zdXJlCiAgICAgICAgICAgIGRlZXBfZXF1YWw6IGRlZXBfZXF1YWwgKEN1cnJlbnQsIG90aGVyKQogICAgICAgIGVuZAoKZmVhdHVyZSB7Tk9ORX0gLS0gUmV0cmlldmFsCgogICAgZnJvemVuIGludGVybmFsX2NvcnJlY3RfbWlzbWF0Y2gKICAgICAgICAgICAgLS0gQ2FsbGVkIGZyb20gcnVudGltZSB0byBwZXJmb3JtIGEgcHJvcGVyIGR5bmFtaWMgZGlzcGF0Y2ggb24gYGNvcnJlY3RfbWlzbWF0Y2gnCiAgICAgICAgICAgIC0tIGZyb20gTUlTTUFUQ0hfQ09SUkVDVE9SLgogICAgICAgIGxvY2FsCiAgICAgICAgICAgIGxfbXNnOiBTVFJJTkcKICAgICAgICAgICAgbF9leGM6IEVYQ0VQVElPTlMKICAgICAgICBkbwogICAgICAgICAgICBpZiBhdHRhY2hlZCB7TUlTTUFUQ0hfQ09SUkVDVE9SfSBDdXJyZW50IGFzIGxfY29ycmVjdG9yIHRoZW4KICAgICAgICAgICAgICAgIGxfY29ycmVjdG9yLmNvcnJlY3RfbWlzbWF0Y2gKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgY3JlYXRlIGxfbXNnLm1ha2VfZnJvbV9zdHJpbmcgKCJNaXNtYXRjaDogIikKICAgICAgICAgICAgICAgIGNyZWF0ZSBsX2V4YwogICAgICAgICAgICAgICAgbF9tc2cuYXBwZW5kIChnZW5lcmF0aW5nX3R5cGUubmFtZSkKICAgICAgICAgICAgICAgIGxfZXhjLnJhaXNlX3JldHJpZXZhbF9leGNlcHRpb24gKGxfbXNnKQogICAgICAgICAgICBlbmQKICAgICAgICBlbmQKCmZlYXR1cmUgLS0gT3V0cHV0CgogICAgaW86IFNURF9GSUxFUwogICAgICAgICAgICAtLSBIYW5kbGUgdG8gc3RhbmRhcmQgZmlsZSBzZXR1cAogICAgICAgIG9uY2UKICAgICAgICAgICAgY3JlYXRlIFJlc3VsdAogICAgICAgICAgICBSZXN1bHQuc2V0X291dHB1dF9kZWZhdWx0CiAgICAgICAgZW5zdXJlCiAgICAgICAgICAgIGlvX25vdF92b2lkOiBSZXN1bHQgLz0gVm9pZAogICAgICAgIGVuZAoKICAgIG91dDogU1RSSU5HCiAgICAgICAgICAgIC0tIE5ldyBzdHJpbmcgY29udGFpbmluZyB0ZXJzZSBwcmludGFibGUgcmVwcmVzZW50YXRpb24KICAgICAgICAgICAgLS0gb2YgY3VycmVudCBvYmplY3QKICAgICAgICBkbwogICAgICAgICAgICBSZXN1bHQgOj0gdGFnZ2VkX291dAogICAgICAgIGVuc3VyZQogICAgICAgICAgICBvdXRfbm90X3ZvaWQ6IFJlc3VsdCAvPSBWb2lkCiAgICAgICAgZW5kCgogICAgZnJvemVuIHRhZ2dlZF9vdXQ6IFNUUklORwogICAgICAgICAgICAtLSBOZXcgc3RyaW5nIGNvbnRhaW5pbmcgdGVyc2UgcHJpbnRhYmxlIHJlcHJlc2VudGF0aW9uCiAgICAgICAgICAgIC0tIG9mIGN1cnJlbnQgb2JqZWN0CiAgICAgICAgZXh0ZXJuYWwKICAgICAgICAgICAgImJ1aWx0X2luIgogICAgICAgIGVuc3VyZQogICAgICAgICAgICB0YWdnZWRfb3V0X25vdF92b2lkOiBSZXN1bHQgLz0gVm9pZAogICAgICAgIGVuZAoKICAgIHByaW50IChvOiBkZXRhY2hhYmxlIEFOWSkKICAgICAgICAgICAgLS0gV3JpdGUgdGVyc2UgZXh0ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgYG8nCiAgICAgICAgICAgIC0tIG9uIHN0YW5kYXJkIG91dHB1dC4KICAgICAgICBkbwogICAgICAgICAgICBpZiBvIC89IFZvaWQgdGhlbgogICAgICAgICAgICAgICAgaW8ucHV0X3N0cmluZyAoby5vdXQpCiAgICAgICAgICAgIGVuZAogICAgICAgIGVuZAoKZmVhdHVyZSAtLSBQbGF0Zm9ybQoKICAgIE9wZXJhdGluZ19lbnZpcm9ubWVudDogT1BFUkFUSU5HX0VOVklST05NRU5UCiAgICAgICAgICAgIC0tIE9iamVjdHMgYXZhaWxhYmxlIGZyb20gdGhlIG9wZXJhdGluZyBzeXN0ZW0KICAgICAgICBvbmNlCiAgICAgICAgICAgIGNyZWF0ZSBSZXN1bHQKICAgICAgICBlbnN1cmUKICAgICAgICAgICAgb3BlcmF0aW5nX2Vudmlyb25tZW50X25vdF92b2lkOiBSZXN1bHQgLz0gVm9pZAogICAgICAgIGVuZAoKZmVhdHVyZSB7Tk9ORX0gLS0gSW5pdGlhbGl6YXRpb24KCiAgICBkZWZhdWx0X2NyZWF0ZQogICAgICAgICAgICAtLSBQcm9jZXNzIGluc3RhbmNlcyBvZiBjbGFzc2VzIHdpdGggbm8gY3JlYXRpb24gY2xhdXNlLgogICAgICAgICAgICAtLSAoRGVmYXVsdDogZG8gbm90aGluZy4pCiAgICAgICAgZG8KICAgICAgICBlbmQKCmZlYXR1cmUgLS0gQmFzaWMgb3BlcmF0aW9ucwoKICAgIGRlZmF1bHRfcmVzY3VlCiAgICAgICAgICAgIC0tIFByb2Nlc3MgZXhjZXB0aW9uIGZvciByb3V0aW5lcyB3aXRoIG5vIFJlc2N1ZSBjbGF1c2UuCiAgICAgICAgICAgIC0tIChEZWZhdWx0OiBkbyBub3RoaW5nLikKICAgICAgICBkbwogICAgICAgIGVuZAoKICAgIGZyb3plbiBkb19ub3RoaW5nCiAgICAgICAgICAgIC0tIEV4ZWN1dGUgYSBudWxsIGFjdGlvbi4KICAgICAgICBkbwogICAgICAgIGVuZAoKICAgIGZyb3plbiBkZWZhdWx0OiBkZXRhY2hhYmxlIGxpa2UgQ3VycmVudAogICAgICAgICAgICAtLSBEZWZhdWx0IHZhbHVlIG9mIG9iamVjdCdzIHR5cGUKICAgICAgICBkbwogICAgICAgIGVuZAoKICAgIGZyb3plbiBkZWZhdWx0X3BvaW50ZXI6IFBPSU5URVIKICAgICAgICAgICAgLS0gRGVmYXVsdCB2YWx1ZSBvZiB0eXBlIGBQT0lOVEVSJwogICAgICAgICAgICAtLSAoQXZvaWQgdGhlIG5lZWQgdG8gd3JpdGUgYHAnLmBkZWZhdWx0JyBmb3IKICAgICAgICAgICAgLS0gc29tZSBgcCcgb2YgdHlwZSBgUE9JTlRFUicuKQogICAgICAgIGRvCiAgICAgICAgZW5zdXJlCiAgICAgICAgICAgIC0tIFJlc3VsdCA9IFJlc3VsdC5kZWZhdWx0CiAgICAgICAgZW5kCgogICAgZnJvemVuIGFzX2F0dGFjaGVkOiBhdHRhY2hlZCBsaWtlIEN1cnJlbnQKICAgICAgICAgICAgLS0gQXR0YWNoZWQgdmVyc2lvbiBvZiBDdXJyZW50CiAgICAgICAgICAgIC0tIChDYW4gYmUgdXNlZCBkdXJpbmcgdHJhbnNpdGlvbmFsIHBlcmlvZCB0byBjb252ZXJ0CiAgICAgICAgICAgIC0tIG5vbi12b2lkLXNhZmUgY2xhc3NlcyB0byB2b2lkLXNhZmUgb25lcy4pCiAgICAgICAgZG8KICAgICAgICAgICAgUmVzdWx0IDo9IEN1cnJlbnQKICAgICAgICBlbmQKCmludmFyaWFudAogICAgcmVmbGV4aXZlX2VxdWFsaXR5OiBzdGFuZGFyZF9pc19lcXVhbCAoQ3VycmVudCkKICAgIHJlZmxleGl2ZV9jb25mb3JtYW5jZTogY29uZm9ybXNfdG8gKEN1cnJlbnQpCgpub3RlCiAgICBjb3B5cmlnaHQ6ICJDb3B5cmlnaHQgKGMpIDE5ODQtMjAxMiwgRWlmZmVsIFNvZnR3YXJlIGFuZCBvdGhlcnMiCiAgICBsaWNlbnNlOiAgICJFaWZmZWwgRm9ydW0gTGljZW5zZSB2MiAoc2VlIGh0dHA6Ly93d3cuZWlmZmVsLmNvbS9saWNlbnNpbmcvZm9ydW0udHh0KSIKICAgIHNvdXJjZTogIlsKICAgICAgICAgICAgRWlmZmVsIFNvZnR3YXJlCiAgICAgICAgICAgIDU5NDkgSG9sbGlzdGVyIEF2ZS4sIEdvbGV0YSwgQ0EgOTMxMTcgVVNBCiAgICAgICAgICAgIFRlbGVwaG9uZSA4MDUtNjg1LTEwMDYsIEZheCA4MDUtNjg1LTY4NjkKICAgICAgICAgICAgV2Vic2l0ZSBodHRwOi8vd3d3LmVpZmZlbC5jb20KICAgICAgICAgICAgQ3VzdG9tZXIgc3VwcG9ydCBodHRwOi8vc3VwcG9ydC5laWZmZWwuY29tCiAgICAgICAgXSIKCmVuZAoKPC90ZXh0YXJlYT48L2Zvcm0+CiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgICAgIG1vZGU6ICJ0ZXh0L3gtZWlmZmVsIiwKICAgICAgICBpbmRlbnRVbml0OiA0LAogICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgICAgIHRoZW1lOiAibmVhdCIKICAgICAgfSk7CiAgICA8L3NjcmlwdD4KCiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC94LWVpZmZlbDwvY29kZT4uPC9wPgogCiA8cD4gQ3JlYXRlZCBieSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20veW5oIj5ZTkg8L2E+LjwvcD4KICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/elm/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/elm/elm.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CgogIENvZGVNaXJyb3IuZGVmaW5lTW9kZSgiZWxtIiwgZnVuY3Rpb24oKSB7CgogICAgZnVuY3Rpb24gc3dpdGNoU3RhdGUoc291cmNlLCBzZXRTdGF0ZSwgZikgewogICAgICBzZXRTdGF0ZShmKTsKICAgICAgcmV0dXJuIGYoc291cmNlLCBzZXRTdGF0ZSk7CiAgICB9CgogICAgLy8gVGhlc2Ugc2hvdWxkIGFsbCBiZSBVbmljb2RlIGV4dGVuZGVkLCBhcyBwZXIgdGhlIEhhc2tlbGwgMjAxMCByZXBvcnQKICAgIHZhciBzbWFsbFJFID0gL1thLXpfXS87CiAgICB2YXIgbGFyZ2VSRSA9IC9bQS1aXS87CiAgICB2YXIgZGlnaXRSRSA9IC9bMC05XS87CiAgICB2YXIgaGV4aXRSRSA9IC9bMC05QS1GYS1mXS87CiAgICB2YXIgb2N0aXRSRSA9IC9bMC03XS87CiAgICB2YXIgaWRSRSA9IC9bYS16X0EtWjAtOVwnXS87CiAgICB2YXIgc3ltYm9sUkUgPSAvWy0hIyQlJiorLlwvPD0+P0BcXF58fjpcdTAzQkJcdTIxOTJdLzsKICAgIHZhciBzcGVjaWFsUkUgPSAvWygpLDtbXF1ge31dLzsKICAgIHZhciB3aGl0ZUNoYXJSRSA9IC9bIFx0XHZcZl0vOyAvLyBuZXdsaW5lcyBhcmUgaGFuZGxlZCBpbiB0b2tlbml6ZXIKCiAgICBmdW5jdGlvbiBub3JtYWwoKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbiAoc291cmNlLCBzZXRTdGF0ZSkgewogICAgICAgIGlmIChzb3VyY2UuZWF0V2hpbGUod2hpdGVDaGFyUkUpKSB7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgIHZhciBjaCA9IHNvdXJjZS5uZXh0KCk7CiAgICAgICAgaWYgKHNwZWNpYWxSRS50ZXN0KGNoKSkgewogICAgICAgICAgaWYgKGNoID09ICd7JyAmJiBzb3VyY2UuZWF0KCctJykpIHsKICAgICAgICAgICAgdmFyIHQgPSAiY29tbWVudCI7CiAgICAgICAgICAgIGlmIChzb3VyY2UuZWF0KCcjJykpIHQgPSAibWV0YSI7CiAgICAgICAgICAgIHJldHVybiBzd2l0Y2hTdGF0ZShzb3VyY2UsIHNldFN0YXRlLCBuY29tbWVudCh0LCAxKSk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgIGlmIChjaCA9PSAnXCcnKSB7CiAgICAgICAgICBpZiAoc291cmNlLmVhdCgnXFwnKSkKICAgICAgICAgICAgc291cmNlLm5leHQoKTsgIC8vIHNob3VsZCBoYW5kbGUgb3RoZXIgZXNjYXBlcyBoZXJlCiAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHNvdXJjZS5uZXh0KCk7CgogICAgICAgICAgaWYgKHNvdXJjZS5lYXQoJ1wnJykpCiAgICAgICAgICAgIHJldHVybiAic3RyaW5nIjsKICAgICAgICAgIHJldHVybiAiZXJyb3IiOwogICAgICAgIH0KCiAgICAgICAgaWYgKGNoID09ICciJykgewogICAgICAgICAgcmV0dXJuIHN3aXRjaFN0YXRlKHNvdXJjZSwgc2V0U3RhdGUsIHN0cmluZ0xpdGVyYWwpOwogICAgICAgIH0KCiAgICAgICAgaWYgKGxhcmdlUkUudGVzdChjaCkpIHsKICAgICAgICAgIHNvdXJjZS5lYXRXaGlsZShpZFJFKTsKICAgICAgICAgIGlmIChzb3VyY2UuZWF0KCcuJykpCiAgICAgICAgICAgIHJldHVybiAicXVhbGlmaWVyIjsKICAgICAgICAgIHJldHVybiAidmFyaWFibGUtMiI7CiAgICAgICAgfQoKICAgICAgICBpZiAoc21hbGxSRS50ZXN0KGNoKSkgewogICAgICAgICAgdmFyIGlzRGVmID0gc291cmNlLnBvcyA9PT0gMTsKICAgICAgICAgIHNvdXJjZS5lYXRXaGlsZShpZFJFKTsKICAgICAgICAgIHJldHVybiBpc0RlZiA/ICJ2YXJpYWJsZS0zIiA6ICJ2YXJpYWJsZSI7CiAgICAgICAgfQoKICAgICAgICBpZiAoZGlnaXRSRS50ZXN0KGNoKSkgewogICAgICAgICAgaWYgKGNoID09ICcwJykgewogICAgICAgICAgICBpZiAoc291cmNlLmVhdCgvW3hYXS8pKSB7CiAgICAgICAgICAgICAgc291cmNlLmVhdFdoaWxlKGhleGl0UkUpOyAvLyBzaG91bGQgcmVxdWlyZSBhdCBsZWFzdCAxCiAgICAgICAgICAgICAgcmV0dXJuICJpbnRlZ2VyIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoc291cmNlLmVhdCgvW29PXS8pKSB7CiAgICAgICAgICAgICAgc291cmNlLmVhdFdoaWxlKG9jdGl0UkUpOyAvLyBzaG91bGQgcmVxdWlyZSBhdCBsZWFzdCAxCiAgICAgICAgICAgICAgcmV0dXJuICJudW1iZXIiOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBzb3VyY2UuZWF0V2hpbGUoZGlnaXRSRSk7CiAgICAgICAgICB2YXIgdCA9ICJudW1iZXIiOwogICAgICAgICAgaWYgKHNvdXJjZS5lYXQoJy4nKSkgewogICAgICAgICAgICB0ID0gIm51bWJlciI7CiAgICAgICAgICAgIHNvdXJjZS5lYXRXaGlsZShkaWdpdFJFKTsgLy8gc2hvdWxkIHJlcXVpcmUgYXQgbGVhc3QgMQogICAgICAgICAgfQogICAgICAgICAgaWYgKHNvdXJjZS5lYXQoL1tlRV0vKSkgewogICAgICAgICAgICB0ID0gIm51bWJlciI7CiAgICAgICAgICAgIHNvdXJjZS5lYXQoL1stK10vKTsKICAgICAgICAgICAgc291cmNlLmVhdFdoaWxlKGRpZ2l0UkUpOyAvLyBzaG91bGQgcmVxdWlyZSBhdCBsZWFzdCAxCiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gdDsKICAgICAgICB9CgogICAgICAgIGlmIChzeW1ib2xSRS50ZXN0KGNoKSkgewogICAgICAgICAgaWYgKGNoID09ICctJyAmJiBzb3VyY2UuZWF0KC8tLykpIHsKICAgICAgICAgICAgc291cmNlLmVhdFdoaWxlKC8tLyk7CiAgICAgICAgICAgIGlmICghc291cmNlLmVhdChzeW1ib2xSRSkpIHsKICAgICAgICAgICAgICBzb3VyY2Uuc2tpcFRvRW5kKCk7CiAgICAgICAgICAgICAgcmV0dXJuICJjb21tZW50IjsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgc291cmNlLmVhdFdoaWxlKHN5bWJvbFJFKTsKICAgICAgICAgIHJldHVybiAiYnVpbHRpbiI7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gImVycm9yIjsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIG5jb21tZW50KHR5cGUsIG5lc3QpIHsKICAgICAgaWYgKG5lc3QgPT0gMCkgewogICAgICAgIHJldHVybiBub3JtYWwoKTsKICAgICAgfQogICAgICByZXR1cm4gZnVuY3Rpb24oc291cmNlLCBzZXRTdGF0ZSkgewogICAgICAgIHZhciBjdXJyTmVzdCA9IG5lc3Q7CiAgICAgICAgd2hpbGUgKCFzb3VyY2UuZW9sKCkpIHsKICAgICAgICAgIHZhciBjaCA9IHNvdXJjZS5uZXh0KCk7CiAgICAgICAgICBpZiAoY2ggPT0gJ3snICYmIHNvdXJjZS5lYXQoJy0nKSkgewogICAgICAgICAgICArK2N1cnJOZXN0OwogICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAnLScgJiYgc291cmNlLmVhdCgnfScpKSB7CiAgICAgICAgICAgIC0tY3Vyck5lc3Q7CiAgICAgICAgICAgIGlmIChjdXJyTmVzdCA9PSAwKSB7CiAgICAgICAgICAgICAgc2V0U3RhdGUobm9ybWFsKCkpOwogICAgICAgICAgICAgIHJldHVybiB0eXBlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHNldFN0YXRlKG5jb21tZW50KHR5cGUsIGN1cnJOZXN0KSk7CiAgICAgICAgcmV0dXJuIHR5cGU7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBzdHJpbmdMaXRlcmFsKHNvdXJjZSwgc2V0U3RhdGUpIHsKICAgICAgd2hpbGUgKCFzb3VyY2UuZW9sKCkpIHsKICAgICAgICB2YXIgY2ggPSBzb3VyY2UubmV4dCgpOwogICAgICAgIGlmIChjaCA9PSAnIicpIHsKICAgICAgICAgIHNldFN0YXRlKG5vcm1hbCgpKTsKICAgICAgICAgIHJldHVybiAic3RyaW5nIjsKICAgICAgICB9CiAgICAgICAgaWYgKGNoID09ICdcXCcpIHsKICAgICAgICAgIGlmIChzb3VyY2UuZW9sKCkgfHwgc291cmNlLmVhdCh3aGl0ZUNoYXJSRSkpIHsKICAgICAgICAgICAgc2V0U3RhdGUoc3RyaW5nR2FwKTsKICAgICAgICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgICAgICAgfQogICAgICAgICAgaWYgKCFzb3VyY2UuZWF0KCcmJykpIHNvdXJjZS5uZXh0KCk7IC8vIHNob3VsZCBoYW5kbGUgb3RoZXIgZXNjYXBlcyBoZXJlCiAgICAgICAgfQogICAgICB9CiAgICAgIHNldFN0YXRlKG5vcm1hbCgpKTsKICAgICAgcmV0dXJuICJlcnJvciI7CiAgICB9CgogICAgZnVuY3Rpb24gc3RyaW5nR2FwKHNvdXJjZSwgc2V0U3RhdGUpIHsKICAgICAgaWYgKHNvdXJjZS5lYXQoJ1xcJykpIHsKICAgICAgICByZXR1cm4gc3dpdGNoU3RhdGUoc291cmNlLCBzZXRTdGF0ZSwgc3RyaW5nTGl0ZXJhbCk7CiAgICAgIH0KICAgICAgc291cmNlLm5leHQoKTsKICAgICAgc2V0U3RhdGUobm9ybWFsKCkpOwogICAgICByZXR1cm4gImVycm9yIjsKICAgIH0KCgogICAgdmFyIHdlbGxLbm93bldvcmRzID0gKGZ1bmN0aW9uKCkgewogICAgICB2YXIgd2t3ID0ge307CgogICAgICB2YXIga2V5d29yZHMgPSBbCiAgICAgICAgImNhc2UiLCAib2YiLCAiYXMiLAogICAgICAgICJpZiIsICJ0aGVuIiwgImVsc2UiLAogICAgICAgICJsZXQiLCAiaW4iLAogICAgICAgICJpbmZpeCIsICJpbmZpeGwiLCAiaW5maXhyIiwKICAgICAgICAidHlwZSIsICJhbGlhcyIsCiAgICAgICAgImlucHV0IiwgIm91dHB1dCIsICJmb3JlaWduIiwgImxvb3BiYWNrIiwKICAgICAgICAibW9kdWxlIiwgIndoZXJlIiwgImltcG9ydCIsICJleHBvc2luZyIsCiAgICAgICAgIl8iLCAiLi4iLCAifCIsICI6IiwgIj0iLCAiXFwiLCAiXCIiLCAiLT4iLCAiPC0iCiAgICAgIF07CgogICAgICBmb3IgKHZhciBpID0ga2V5d29yZHMubGVuZ3RoOyBpLS07KQogICAgICAgIHdrd1trZXl3b3Jkc1tpXV0gPSAia2V5d29yZCI7CgogICAgICByZXR1cm4gd2t3OwogICAgfSkoKTsKCgoKICAgIHJldHVybiB7CiAgICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uICgpICB7IHJldHVybiB7IGY6IG5vcm1hbCgpIH07IH0sCiAgICAgIGNvcHlTdGF0ZTogIGZ1bmN0aW9uIChzKSB7IHJldHVybiB7IGY6IHMuZiB9OyB9LAoKICAgICAgdG9rZW46IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgICB2YXIgdCA9IHN0YXRlLmYoc3RyZWFtLCBmdW5jdGlvbihzKSB7IHN0YXRlLmYgPSBzOyB9KTsKICAgICAgICB2YXIgdyA9IHN0cmVhbS5jdXJyZW50KCk7CiAgICAgICAgcmV0dXJuICh3ZWxsS25vd25Xb3Jkcy5oYXNPd25Qcm9wZXJ0eSh3KSkgPyB3ZWxsS25vd25Xb3Jkc1t3XSA6IHQ7CiAgICAgIH0KICAgIH07CgogIH0pOwoKICBDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveC1lbG0iLCAiZWxtIik7Cn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/elm/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogRWxtIG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iZWxtLmpzIj48L3NjcmlwdD4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4uQ29kZU1pcnJvciB7Ym9yZGVyLXRvcDogMXB4IHNvbGlkIGJsYWNrOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGgxPkNvZGVNaXJyb3I8L2gxPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5FbG08L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPkVsbSBtb2RlPC9oMj4KCjxkaXY+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KaW1wb3J0IENvbG9yIGV4cG9zaW5nICguLikKaW1wb3J0IEdyYXBoaWNzLkNvbGxhZ2UgZXhwb3NpbmcgKC4uKQppbXBvcnQgR3JhcGhpY3MuRWxlbWVudCBleHBvc2luZyAoLi4pCmltcG9ydCBUaW1lIGV4cG9zaW5nICguLikKCm1haW4gPQogIFNpZ25hbC5tYXAgY2xvY2sgKGV2ZXJ5IHNlY29uZCkKCmNsb2NrIHQgPQogIGNvbGxhZ2UgNDAwIDQwMAogICAgWyBmaWxsZWQgICAgbGlnaHRHcmV5ICAgKG5nb24gMTIgMTEwKQogICAgLCBvdXRsaW5lZCAoc29saWQgZ3JleSkgKG5nb24gMTIgMTEwKQogICAgLCBoYW5kIG9yYW5nZSAgIDEwMCAgdAogICAgLCBoYW5kIGNoYXJjb2FsIDEwMCAodC82MCkKICAgICwgaGFuZCBjaGFyY29hbCA2MCAgKHQvNzIwKQogICAgXQoKaGFuZCBjbHIgbGVuIHRpbWUgPQogIGxldCBhbmdsZSA9IGRlZ3JlZXMgKDkwIC0gNiAqIGluU2Vjb25kcyB0aW1lKQogIGluCiAgICAgIHNlZ21lbnQgKDAsMCkgKGZyb21Qb2xhciAobGVuLGFuZ2xlKSkKICAgICAgICB8PiB0cmFjZWQgKHNvbGlkIGNscikKPC90ZXh0YXJlYT48L2Rpdj4KCiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgICAgIG1vZGU6ICJ0ZXh0L3gtZWxtIgogICAgICB9KTsKICAgIDwvc2NyaXB0PgoKICAgIDxwPjxzdHJvbmc+TUlNRSB0eXBlcyBkZWZpbmVkOjwvc3Ryb25nPiA8Y29kZT50ZXh0L3gtZWxtPC9jb2RlPi48L3A+CiAgPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/erlang/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/erlang/erlang.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovKmpzaGludCB1bnVzZWQ6dHJ1ZSwgZXFudWxsOnRydWUsIGN1cmx5OnRydWUsIGJpdHdpc2U6dHJ1ZSAqLwovKmpzaGludCB1bmRlZjp0cnVlLCBsYXRlZGVmOnRydWUsIHRyYWlsaW5nOnRydWUgKi8KLypnbG9iYWwgQ29kZU1pcnJvcjp0cnVlICovCgovLyBlcmxhbmcgbW9kZS4KLy8gdG9rZW5pemVyIC0+IHRva2VuIHR5cGVzIC0+IENvZGVNaXJyb3Igc3R5bGVzCi8vIHRva2VuaXplciBtYWludGFpbnMgYSBwYXJzZSBzdGFjawovLyBpbmRlbnRlciB1c2VzIHRoZSBwYXJzZSBzdGFjawoKLy8gVE9ETyBpbmRlbnRlcjoKLy8gICBiaXQgc3ludGF4Ci8vICAgb2xkIGd1YXJkL2JpZi9jb252ZXJzaW9uIGNsYXNoZXMgKGUuZy4gImZsb2F0LzEiKQovLyAgIHR5cGUvc3BlYy9vcGFxdWUKCihmdW5jdGlvbihtb2QpIHsKICBpZiAodHlwZW9mIGV4cG9ydHMgPT0gIm9iamVjdCIgJiYgdHlwZW9mIG1vZHVsZSA9PSAib2JqZWN0IikgLy8gQ29tbW9uSlMKICAgIG1vZChyZXF1aXJlKCIuLi8uLi9saWIvY29kZW1pcnJvciIpKTsKICBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCkgLy8gQU1ECiAgICBkZWZpbmUoWyIuLi8uLi9saWIvY29kZW1pcnJvciJdLCBtb2QpOwogIGVsc2UgLy8gUGxhaW4gYnJvd3NlciBlbnYKICAgIG1vZChDb2RlTWlycm9yKTsKfSkoZnVuY3Rpb24oQ29kZU1pcnJvcikgewoidXNlIHN0cmljdCI7CgpDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveC1lcmxhbmciLCAiZXJsYW5nIik7CgpDb2RlTWlycm9yLmRlZmluZU1vZGUoImVybGFuZyIsIGZ1bmN0aW9uKGNtQ2ZnKSB7CiAgInVzZSBzdHJpY3QiOwoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8gY29uc3RhbnRzCgogIHZhciB0eXBlV29yZHMgPSBbCiAgICAiLXR5cGUiLCAiLXNwZWMiLCAiLWV4cG9ydF90eXBlIiwgIi1vcGFxdWUiXTsKCiAgdmFyIGtleXdvcmRXb3JkcyA9IFsKICAgICJhZnRlciIsImJlZ2luIiwiY2F0Y2giLCJjYXNlIiwiY29uZCIsImVuZCIsImZ1biIsImlmIiwKICAgICJsZXQiLCJvZiIsInF1ZXJ5IiwicmVjZWl2ZSIsInRyeSIsIndoZW4iXTsKCiAgdmFyIHNlcGFyYXRvclJFICAgID0gL1tcLT4sO10vOwogIHZhciBzZXBhcmF0b3JXb3JkcyA9IFsKICAgICItPiIsIjsiLCIsIl07CgogIHZhciBvcGVyYXRvckF0b21Xb3JkcyA9IFsKICAgICJhbmQiLCJhbmRhbHNvIiwiYmFuZCIsImJub3QiLCJib3IiLCJic2wiLCJic3IiLCJieG9yIiwKICAgICJkaXYiLCJub3QiLCJvciIsIm9yZWxzZSIsInJlbSIsInhvciJdOwoKICB2YXIgb3BlcmF0b3JTeW1ib2xSRSAgICA9IC9bXCtcLVwqXC88Pj1cfDohXS87CiAgdmFyIG9wZXJhdG9yU3ltYm9sV29yZHMgPSBbCiAgICAiPSIsIisiLCItIiwiKiIsIi8iLCI+IiwiPj0iLCI8IiwiPTwiLCI9Oj0iLCI9PSIsIj0vPSIsIi89IiwifHwiLCI8LSIsIiEiXTsKCiAgdmFyIG9wZW5QYXJlblJFICAgID0gL1s8XChcW1x7XS87CiAgdmFyIG9wZW5QYXJlbldvcmRzID0gWwogICAgIjw8IiwiKCIsIlsiLCJ7Il07CgogIHZhciBjbG9zZVBhcmVuUkUgICAgPSAvWz5cKVxdXH1dLzsKICB2YXIgY2xvc2VQYXJlbldvcmRzID0gWwogICAgIn0iLCJdIiwiKSIsIj4+Il07CgogIHZhciBndWFyZFdvcmRzID0gWwogICAgImlzX2F0b20iLCJpc19iaW5hcnkiLCJpc19iaXRzdHJpbmciLCJpc19ib29sZWFuIiwiaXNfZmxvYXQiLAogICAgImlzX2Z1bmN0aW9uIiwiaXNfaW50ZWdlciIsImlzX2xpc3QiLCJpc19udW1iZXIiLCJpc19waWQiLAogICAgImlzX3BvcnQiLCJpc19yZWNvcmQiLCJpc19yZWZlcmVuY2UiLCJpc190dXBsZSIsCiAgICAiYXRvbSIsImJpbmFyeSIsImJpdHN0cmluZyIsImJvb2xlYW4iLCJmdW5jdGlvbiIsImludGVnZXIiLCJsaXN0IiwKICAgICJudW1iZXIiLCJwaWQiLCJwb3J0IiwicmVjb3JkIiwicmVmZXJlbmNlIiwidHVwbGUiXTsKCiAgdmFyIGJpZldvcmRzID0gWwogICAgImFicyIsImFkbGVyMzIiLCJhZGxlcjMyX2NvbWJpbmUiLCJhbGl2ZSIsImFwcGx5IiwiYXRvbV90b19iaW5hcnkiLAogICAgImF0b21fdG9fbGlzdCIsImJpbmFyeV90b19hdG9tIiwiYmluYXJ5X3RvX2V4aXN0aW5nX2F0b20iLAogICAgImJpbmFyeV90b19saXN0IiwiYmluYXJ5X3RvX3Rlcm0iLCJiaXRfc2l6ZSIsImJpdHN0cmluZ190b19saXN0IiwKICAgICJieXRlX3NpemUiLCJjaGVja19wcm9jZXNzX2NvZGUiLCJjb250YWN0X2JpbmFyeSIsImNyYzMyIiwKICAgICJjcmMzMl9jb21iaW5lIiwiZGF0ZSIsImRlY29kZV9wYWNrZXQiLCJkZWxldGVfbW9kdWxlIiwKICAgICJkaXNjb25uZWN0X25vZGUiLCJlbGVtZW50IiwiZXJhc2UiLCJleGl0IiwiZmxvYXQiLCJmbG9hdF90b19saXN0IiwKICAgICJnYXJiYWdlX2NvbGxlY3QiLCJnZXQiLCJnZXRfa2V5cyIsImdyb3VwX2xlYWRlciIsImhhbHQiLCJoZCIsCiAgICAiaW50ZWdlcl90b19saXN0IiwiaW50ZXJuYWxfYmlmIiwiaW9saXN0X3NpemUiLCJpb2xpc3RfdG9fYmluYXJ5IiwKICAgICJpc19hbGl2ZSIsImlzX2F0b20iLCJpc19iaW5hcnkiLCJpc19iaXRzdHJpbmciLCJpc19ib29sZWFuIiwKICAgICJpc19mbG9hdCIsImlzX2Z1bmN0aW9uIiwiaXNfaW50ZWdlciIsImlzX2xpc3QiLCJpc19udW1iZXIiLCJpc19waWQiLAogICAgImlzX3BvcnQiLCJpc19wcm9jZXNzX2FsaXZlIiwiaXNfcmVjb3JkIiwiaXNfcmVmZXJlbmNlIiwiaXNfdHVwbGUiLAogICAgImxlbmd0aCIsImxpbmsiLCJsaXN0X3RvX2F0b20iLCJsaXN0X3RvX2JpbmFyeSIsImxpc3RfdG9fYml0c3RyaW5nIiwKICAgICJsaXN0X3RvX2V4aXN0aW5nX2F0b20iLCJsaXN0X3RvX2Zsb2F0IiwibGlzdF90b19pbnRlZ2VyIiwKICAgICJsaXN0X3RvX3BpZCIsImxpc3RfdG9fdHVwbGUiLCJsb2FkX21vZHVsZSIsIm1ha2VfcmVmIiwibW9kdWxlX2xvYWRlZCIsCiAgICAibW9uaXRvcl9ub2RlIiwibm9kZSIsIm5vZGVfbGluayIsIm5vZGVfdW5saW5rIiwibm9kZXMiLCJub3RhbGl2ZSIsCiAgICAibm93Iiwib3Blbl9wb3J0IiwicGlkX3RvX2xpc3QiLCJwb3J0X2Nsb3NlIiwicG9ydF9jb21tYW5kIiwKICAgICJwb3J0X2Nvbm5lY3QiLCJwb3J0X2NvbnRyb2wiLCJwcmVfbG9hZGVkIiwicHJvY2Vzc19mbGFnIiwKICAgICJwcm9jZXNzX2luZm8iLCJwcm9jZXNzZXMiLCJwdXJnZV9tb2R1bGUiLCJwdXQiLCJyZWdpc3RlciIsCiAgICAicmVnaXN0ZXJlZCIsInJvdW5kIiwic2VsZiIsInNldGVsZW1lbnQiLCJzaXplIiwic3Bhd24iLCJzcGF3bl9saW5rIiwKICAgICJzcGF3bl9tb25pdG9yIiwic3Bhd25fb3B0Iiwic3BsaXRfYmluYXJ5Iiwic3RhdGlzdGljcyIsCiAgICAidGVybV90b19iaW5hcnkiLCJ0aW1lIiwidGhyb3ciLCJ0bCIsInRydW5jIiwidHVwbGVfc2l6ZSIsCiAgICAidHVwbGVfdG9fbGlzdCIsInVubGluayIsInVucmVnaXN0ZXIiLCJ3aGVyZWlzIl07CgovLyB1cHBlciBjYXNlOiBbQS1aXSBbw5gtw55dIFvDgC3Dll0KLy8gbG93ZXIgY2FzZTogW2Etel0gW8OfLcO2XSBbw7gtw79dCiAgdmFyIGFudW1SRSAgICAgICA9IC9bXHdAw5gtw57DgC3DlsOfLcO2w7gtw79dLzsKICB2YXIgZXNjYXBlc1JFICAgID0KICAgIC9bMC03XXsxLDN9fFtiZGVmbnJzdHZcXCInXXxcXlthLXpBLVpdfHhbMC05YS16QS1aXXsyfXx4e1swLTlhLXpBLVpdK30vOwoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8gdG9rZW5pemVyCgogIGZ1bmN0aW9uIHRva2VuaXplcihzdHJlYW0sc3RhdGUpIHsKICAgIC8vIGluIG11bHRpLWxpbmUgc3RyaW5nCiAgICBpZiAoc3RhdGUuaW5fc3RyaW5nKSB7CiAgICAgIHN0YXRlLmluX3N0cmluZyA9ICghZG91YmxlUXVvdGUoc3RyZWFtKSk7CiAgICAgIHJldHVybiBydmFsKHN0YXRlLHN0cmVhbSwic3RyaW5nIik7CiAgICB9CgogICAgLy8gaW4gbXVsdGktbGluZSBhdG9tCiAgICBpZiAoc3RhdGUuaW5fYXRvbSkgewogICAgICBzdGF0ZS5pbl9hdG9tID0gKCFzaW5nbGVRdW90ZShzdHJlYW0pKTsKICAgICAgcmV0dXJuIHJ2YWwoc3RhdGUsc3RyZWFtLCJhdG9tIik7CiAgICB9CgogICAgLy8gd2hpdGVzcGFjZQogICAgaWYgKHN0cmVhbS5lYXRTcGFjZSgpKSB7CiAgICAgIHJldHVybiBydmFsKHN0YXRlLHN0cmVhbSwid2hpdGVzcGFjZSIpOwogICAgfQoKICAgIC8vIGF0dHJpYnV0ZXMgYW5kIHR5cGUgc3BlY3MKICAgIGlmICghcGVla1Rva2VuKHN0YXRlKSAmJgogICAgICAgIHN0cmVhbS5tYXRjaCgvLVxzKlthLXrDny3DtsO4LcO/XVtcd8OYLcOew4Atw5bDny3DtsO4LcO/XSovKSkgewogICAgICBpZiAoaXNfbWVtYmVyKHN0cmVhbS5jdXJyZW50KCksdHlwZVdvcmRzKSkgewogICAgICAgIHJldHVybiBydmFsKHN0YXRlLHN0cmVhbSwidHlwZSIpOwogICAgICB9ZWxzZXsKICAgICAgICByZXR1cm4gcnZhbChzdGF0ZSxzdHJlYW0sImF0dHJpYnV0ZSIpOwogICAgICB9CiAgICB9CgogICAgdmFyIGNoID0gc3RyZWFtLm5leHQoKTsKCiAgICAvLyBjb21tZW50CiAgICBpZiAoY2ggPT0gJyUnKSB7CiAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgcmV0dXJuIHJ2YWwoc3RhdGUsc3RyZWFtLCJjb21tZW50Iik7CiAgICB9CgogICAgLy8gY29sb24KICAgIGlmIChjaCA9PSAiOiIpIHsKICAgICAgcmV0dXJuIHJ2YWwoc3RhdGUsc3RyZWFtLCJjb2xvbiIpOwogICAgfQoKICAgIC8vIG1hY3JvCiAgICBpZiAoY2ggPT0gJz8nKSB7CiAgICAgIHN0cmVhbS5lYXRTcGFjZSgpOwogICAgICBzdHJlYW0uZWF0V2hpbGUoYW51bVJFKTsKICAgICAgcmV0dXJuIHJ2YWwoc3RhdGUsc3RyZWFtLCJtYWNybyIpOwogICAgfQoKICAgIC8vIHJlY29yZAogICAgaWYgKGNoID09ICIjIikgewogICAgICBzdHJlYW0uZWF0U3BhY2UoKTsKICAgICAgc3RyZWFtLmVhdFdoaWxlKGFudW1SRSk7CiAgICAgIHJldHVybiBydmFsKHN0YXRlLHN0cmVhbSwicmVjb3JkIik7CiAgICB9CgogICAgLy8gZG9sbGFyIGVzY2FwZQogICAgaWYgKGNoID09ICIkIikgewogICAgICBpZiAoc3RyZWFtLm5leHQoKSA9PSAiXFwiICYmICFzdHJlYW0ubWF0Y2goZXNjYXBlc1JFKSkgewogICAgICAgIHJldHVybiBydmFsKHN0YXRlLHN0cmVhbSwiZXJyb3IiKTsKICAgICAgfQogICAgICByZXR1cm4gcnZhbChzdGF0ZSxzdHJlYW0sIm51bWJlciIpOwogICAgfQoKICAgIC8vIGRvdAogICAgaWYgKGNoID09ICIuIikgewogICAgICByZXR1cm4gcnZhbChzdGF0ZSxzdHJlYW0sImRvdCIpOwogICAgfQoKICAgIC8vIHF1b3RlZCBhdG9tCiAgICBpZiAoY2ggPT0gJ1wnJykgewogICAgICBpZiAoIShzdGF0ZS5pbl9hdG9tID0gKCFzaW5nbGVRdW90ZShzdHJlYW0pKSkpIHsKICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKC9ccypcL1xzKlswLTldLyxmYWxzZSkpIHsKICAgICAgICAgIHN0cmVhbS5tYXRjaCgvXHMqXC9ccypbMC05XS8sdHJ1ZSk7CiAgICAgICAgICByZXR1cm4gcnZhbChzdGF0ZSxzdHJlYW0sImZ1biIpOyAgICAgIC8vICdmJy8wIHN0eWxlIGZ1bgogICAgICAgIH0KICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKC9ccypcKC8sZmFsc2UpIHx8IHN0cmVhbS5tYXRjaCgvXHMqOi8sZmFsc2UpKSB7CiAgICAgICAgICByZXR1cm4gcnZhbChzdGF0ZSxzdHJlYW0sImZ1bmN0aW9uIik7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBydmFsKHN0YXRlLHN0cmVhbSwiYXRvbSIpOwogICAgfQoKICAgIC8vIHN0cmluZwogICAgaWYgKGNoID09ICciJykgewogICAgICBzdGF0ZS5pbl9zdHJpbmcgPSAoIWRvdWJsZVF1b3RlKHN0cmVhbSkpOwogICAgICByZXR1cm4gcnZhbChzdGF0ZSxzdHJlYW0sInN0cmluZyIpOwogICAgfQoKICAgIC8vIHZhcmlhYmxlCiAgICBpZiAoL1tBLVpfw5gtw57DgC3Dll0vLnRlc3QoY2gpKSB7CiAgICAgIHN0cmVhbS5lYXRXaGlsZShhbnVtUkUpOwogICAgICByZXR1cm4gcnZhbChzdGF0ZSxzdHJlYW0sInZhcmlhYmxlIik7CiAgICB9CgogICAgLy8gYXRvbS9rZXl3b3JkL0JJRi9mdW5jdGlvbgogICAgaWYgKC9bYS16X8OfLcO2w7gtw79dLy50ZXN0KGNoKSkgewogICAgICBzdHJlYW0uZWF0V2hpbGUoYW51bVJFKTsKCiAgICAgIGlmIChzdHJlYW0ubWF0Y2goL1xzKlwvXHMqWzAtOV0vLGZhbHNlKSkgewogICAgICAgIHN0cmVhbS5tYXRjaCgvXHMqXC9ccypbMC05XS8sdHJ1ZSk7CiAgICAgICAgcmV0dXJuIHJ2YWwoc3RhdGUsc3RyZWFtLCJmdW4iKTsgICAgICAvLyBmLzAgc3R5bGUgZnVuCiAgICAgIH0KCiAgICAgIHZhciB3ID0gc3RyZWFtLmN1cnJlbnQoKTsKCiAgICAgIGlmIChpc19tZW1iZXIodyxrZXl3b3JkV29yZHMpKSB7CiAgICAgICAgcmV0dXJuIHJ2YWwoc3RhdGUsc3RyZWFtLCJrZXl3b3JkIik7CiAgICAgIH1lbHNlIGlmIChpc19tZW1iZXIodyxvcGVyYXRvckF0b21Xb3JkcykpIHsKICAgICAgICByZXR1cm4gcnZhbChzdGF0ZSxzdHJlYW0sIm9wZXJhdG9yIik7CiAgICAgIH1lbHNlIGlmIChzdHJlYW0ubWF0Y2goL1xzKlwoLyxmYWxzZSkpIHsKICAgICAgICAvLyAncHV0JyBhbmQgJ2VybGFuZzpwdXQnIGFyZSBiaWZzLCAnZm9vOnB1dCcgaXMgbm90CiAgICAgICAgaWYgKGlzX21lbWJlcih3LGJpZldvcmRzKSAmJgogICAgICAgICAgICAoKHBlZWtUb2tlbihzdGF0ZSkudG9rZW4gIT0gIjoiKSB8fAogICAgICAgICAgICAgKHBlZWtUb2tlbihzdGF0ZSwyKS50b2tlbiA9PSAiZXJsYW5nIikpKSB7CiAgICAgICAgICByZXR1cm4gcnZhbChzdGF0ZSxzdHJlYW0sImJ1aWx0aW4iKTsKICAgICAgICB9ZWxzZSBpZiAoaXNfbWVtYmVyKHcsZ3VhcmRXb3JkcykpIHsKICAgICAgICAgIHJldHVybiBydmFsKHN0YXRlLHN0cmVhbSwiZ3VhcmQiKTsKICAgICAgICB9ZWxzZXsKICAgICAgICAgIHJldHVybiBydmFsKHN0YXRlLHN0cmVhbSwiZnVuY3Rpb24iKTsKICAgICAgICB9CiAgICAgIH1lbHNlIGlmIChsb29rYWhlYWQoc3RyZWFtKSA9PSAiOiIpIHsKICAgICAgICBpZiAodyA9PSAiZXJsYW5nIikgewogICAgICAgICAgcmV0dXJuIHJ2YWwoc3RhdGUsc3RyZWFtLCJidWlsdGluIik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBydmFsKHN0YXRlLHN0cmVhbSwiZnVuY3Rpb24iKTsKICAgICAgICB9CiAgICAgIH1lbHNlIGlmIChpc19tZW1iZXIodyxbInRydWUiLCJmYWxzZSJdKSkgewogICAgICAgIHJldHVybiBydmFsKHN0YXRlLHN0cmVhbSwiYm9vbGVhbiIpOwogICAgICB9ZWxzZXsKICAgICAgICByZXR1cm4gcnZhbChzdGF0ZSxzdHJlYW0sImF0b20iKTsKICAgICAgfQogICAgfQoKICAgIC8vIG51bWJlcgogICAgdmFyIGRpZ2l0UkUgICAgICA9IC9bMC05XS87CiAgICB2YXIgcmFkaXhSRSAgICAgID0gL1swLTlhLXpBLVpdLzsgICAgICAgICAvLyAzNiN6WiBzdHlsZSBpbnQKICAgIGlmIChkaWdpdFJFLnRlc3QoY2gpKSB7CiAgICAgIHN0cmVhbS5lYXRXaGlsZShkaWdpdFJFKTsKICAgICAgaWYgKHN0cmVhbS5lYXQoJyMnKSkgeyAgICAgICAgICAgICAgICAvLyAzNiNhWiAgc3R5bGUgaW50ZWdlcgogICAgICAgIGlmICghc3RyZWFtLmVhdFdoaWxlKHJhZGl4UkUpKSB7CiAgICAgICAgICBzdHJlYW0uYmFja1VwKDEpOyAgICAgICAgICAgICAgICAgLy8iMzYjIiAtIHN5bnRheCBlcnJvcgogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChzdHJlYW0uZWF0KCcuJykpIHsgICAgICAgLy8gZmxvYXQKICAgICAgICBpZiAoIXN0cmVhbS5lYXRXaGlsZShkaWdpdFJFKSkgewogICAgICAgICAgc3RyZWFtLmJhY2tVcCgxKTsgICAgICAgIC8vICIzLiIgLSBwcm9iYWJseSBlbmQgb2YgZnVuY3Rpb24KICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKHN0cmVhbS5lYXQoL1tlRV0vKSkgeyAgICAgICAgLy8gZmxvYXQgd2l0aCBleHBvbmVudAogICAgICAgICAgICBpZiAoc3RyZWFtLmVhdCgvWy0rXS8pKSB7CiAgICAgICAgICAgICAgaWYgKCFzdHJlYW0uZWF0V2hpbGUoZGlnaXRSRSkpIHsKICAgICAgICAgICAgICAgIHN0cmVhbS5iYWNrVXAoMik7ICAgICAgICAgICAgLy8gIjJlLSIgLSBzeW50YXggZXJyb3IKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgaWYgKCFzdHJlYW0uZWF0V2hpbGUoZGlnaXRSRSkpIHsKICAgICAgICAgICAgICAgIHN0cmVhbS5iYWNrVXAoMSk7ICAgICAgICAgICAgLy8gIjJlIiAtIHN5bnRheCBlcnJvcgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gcnZhbChzdGF0ZSxzdHJlYW0sIm51bWJlciIpOyAgIC8vIG5vcm1hbCBpbnRlZ2VyCiAgICB9CgogICAgLy8gb3BlbiBwYXJlbnMKICAgIGlmIChub25ncmVlZHkoc3RyZWFtLG9wZW5QYXJlblJFLG9wZW5QYXJlbldvcmRzKSkgewogICAgICByZXR1cm4gcnZhbChzdGF0ZSxzdHJlYW0sIm9wZW5fcGFyZW4iKTsKICAgIH0KCiAgICAvLyBjbG9zZSBwYXJlbnMKICAgIGlmIChub25ncmVlZHkoc3RyZWFtLGNsb3NlUGFyZW5SRSxjbG9zZVBhcmVuV29yZHMpKSB7CiAgICAgIHJldHVybiBydmFsKHN0YXRlLHN0cmVhbSwiY2xvc2VfcGFyZW4iKTsKICAgIH0KCiAgICAvLyBzZXBhcmF0b3JzCiAgICBpZiAoZ3JlZWR5KHN0cmVhbSxzZXBhcmF0b3JSRSxzZXBhcmF0b3JXb3JkcykpIHsKICAgICAgcmV0dXJuIHJ2YWwoc3RhdGUsc3RyZWFtLCJzZXBhcmF0b3IiKTsKICAgIH0KCiAgICAvLyBvcGVyYXRvcnMKICAgIGlmIChncmVlZHkoc3RyZWFtLG9wZXJhdG9yU3ltYm9sUkUsb3BlcmF0b3JTeW1ib2xXb3JkcykpIHsKICAgICAgcmV0dXJuIHJ2YWwoc3RhdGUsc3RyZWFtLCJvcGVyYXRvciIpOwogICAgfQoKICAgIHJldHVybiBydmFsKHN0YXRlLHN0cmVhbSxudWxsKTsKICB9CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLyB1dGlsaXRpZXMKICBmdW5jdGlvbiBub25ncmVlZHkoc3RyZWFtLHJlLHdvcmRzKSB7CiAgICBpZiAoc3RyZWFtLmN1cnJlbnQoKS5sZW5ndGggPT0gMSAmJiByZS50ZXN0KHN0cmVhbS5jdXJyZW50KCkpKSB7CiAgICAgIHN0cmVhbS5iYWNrVXAoMSk7CiAgICAgIHdoaWxlIChyZS50ZXN0KHN0cmVhbS5wZWVrKCkpKSB7CiAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgICBpZiAoaXNfbWVtYmVyKHN0cmVhbS5jdXJyZW50KCksd29yZHMpKSB7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgc3RyZWFtLmJhY2tVcChzdHJlYW0uY3VycmVudCgpLmxlbmd0aC0xKTsKICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIGZ1bmN0aW9uIGdyZWVkeShzdHJlYW0scmUsd29yZHMpIHsKICAgIGlmIChzdHJlYW0uY3VycmVudCgpLmxlbmd0aCA9PSAxICYmIHJlLnRlc3Qoc3RyZWFtLmN1cnJlbnQoKSkpIHsKICAgICAgd2hpbGUgKHJlLnRlc3Qoc3RyZWFtLnBlZWsoKSkpIHsKICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICB9CiAgICAgIHdoaWxlICgwIDwgc3RyZWFtLmN1cnJlbnQoKS5sZW5ndGgpIHsKICAgICAgICBpZiAoaXNfbWVtYmVyKHN0cmVhbS5jdXJyZW50KCksd29yZHMpKSB7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9ZWxzZXsKICAgICAgICAgIHN0cmVhbS5iYWNrVXAoMSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICB9CiAgICByZXR1cm4gZmFsc2U7CiAgfQoKICBmdW5jdGlvbiBkb3VibGVRdW90ZShzdHJlYW0pIHsKICAgIHJldHVybiBxdW90ZShzdHJlYW0sICciJywgJ1xcJyk7CiAgfQoKICBmdW5jdGlvbiBzaW5nbGVRdW90ZShzdHJlYW0pIHsKICAgIHJldHVybiBxdW90ZShzdHJlYW0sJ1wnJywnXFwnKTsKICB9CgogIGZ1bmN0aW9uIHF1b3RlKHN0cmVhbSxxdW90ZUNoYXIsZXNjYXBlQ2hhcikgewogICAgd2hpbGUgKCFzdHJlYW0uZW9sKCkpIHsKICAgICAgdmFyIGNoID0gc3RyZWFtLm5leHQoKTsKICAgICAgaWYgKGNoID09IHF1b3RlQ2hhcikgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9ZWxzZSBpZiAoY2ggPT0gZXNjYXBlQ2hhcikgewogICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIGZ1bmN0aW9uIGxvb2thaGVhZChzdHJlYW0pIHsKICAgIHZhciBtID0gc3RyZWFtLm1hdGNoKC8oW1xuXHNdK3wlW15cbl0qXG4pKiguKS8sZmFsc2UpOwogICAgcmV0dXJuIG0gPyBtLnBvcCgpIDogIiI7CiAgfQoKICBmdW5jdGlvbiBpc19tZW1iZXIoZWxlbWVudCxsaXN0KSB7CiAgICByZXR1cm4gKC0xIDwgbGlzdC5pbmRleE9mKGVsZW1lbnQpKTsKICB9CgogIGZ1bmN0aW9uIHJ2YWwoc3RhdGUsc3RyZWFtLHR5cGUpIHsKCiAgICAvLyBwYXJzZSBzdGFjawogICAgcHVzaFRva2VuKHN0YXRlLHJlYWxUb2tlbih0eXBlLHN0cmVhbSkpOwoKICAgIC8vIG1hcCBlcmxhbmcgdG9rZW4gdHlwZSB0byBDb2RlTWlycm9yIHN0eWxlIGNsYXNzCiAgICAvLyAgICAgZXJsYW5nICAgICAgICAgICAgIC0+IENvZGVNaXJyb3IgdGFnCiAgICBzd2l0Y2ggKHR5cGUpIHsKICAgICAgY2FzZSAiYXRvbSI6ICAgICAgICByZXR1cm4gImF0b20iOwogICAgICBjYXNlICJhdHRyaWJ1dGUiOiAgIHJldHVybiAiYXR0cmlidXRlIjsKICAgICAgY2FzZSAiYm9vbGVhbiI6ICAgICByZXR1cm4gImF0b20iOwogICAgICBjYXNlICJidWlsdGluIjogICAgIHJldHVybiAiYnVpbHRpbiI7CiAgICAgIGNhc2UgImNsb3NlX3BhcmVuIjogcmV0dXJuIG51bGw7CiAgICAgIGNhc2UgImNvbG9uIjogICAgICAgcmV0dXJuIG51bGw7CiAgICAgIGNhc2UgImNvbW1lbnQiOiAgICAgcmV0dXJuICJjb21tZW50IjsKICAgICAgY2FzZSAiZG90IjogICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgY2FzZSAiZXJyb3IiOiAgICAgICByZXR1cm4gImVycm9yIjsKICAgICAgY2FzZSAiZnVuIjogICAgICAgICByZXR1cm4gIm1ldGEiOwogICAgICBjYXNlICJmdW5jdGlvbiI6ICAgIHJldHVybiAidGFnIjsKICAgICAgY2FzZSAiZ3VhcmQiOiAgICAgICByZXR1cm4gInByb3BlcnR5IjsKICAgICAgY2FzZSAia2V5d29yZCI6ICAgICByZXR1cm4gImtleXdvcmQiOwogICAgICBjYXNlICJtYWNybyI6ICAgICAgIHJldHVybiAidmFyaWFibGUtMiI7CiAgICAgIGNhc2UgIm51bWJlciI6ICAgICAgcmV0dXJuICJudW1iZXIiOwogICAgICBjYXNlICJvcGVuX3BhcmVuIjogIHJldHVybiBudWxsOwogICAgICBjYXNlICJvcGVyYXRvciI6ICAgIHJldHVybiAib3BlcmF0b3IiOwogICAgICBjYXNlICJyZWNvcmQiOiAgICAgIHJldHVybiAiYnJhY2tldCI7CiAgICAgIGNhc2UgInNlcGFyYXRvciI6ICAgcmV0dXJuIG51bGw7CiAgICAgIGNhc2UgInN0cmluZyI6ICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgICBjYXNlICJ0eXBlIjogICAgICAgIHJldHVybiAiZGVmIjsKICAgICAgY2FzZSAidmFyaWFibGUiOiAgICByZXR1cm4gInZhcmlhYmxlIjsKICAgICAgZGVmYXVsdDogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGFUb2tlbih0b2ssY29sLGluZCx0eXApIHsKICAgIHJldHVybiB7dG9rZW46ICB0b2ssCiAgICAgICAgICAgIGNvbHVtbjogY29sLAogICAgICAgICAgICBpbmRlbnQ6IGluZCwKICAgICAgICAgICAgdHlwZTogICB0eXB9OwogIH0KCiAgZnVuY3Rpb24gcmVhbFRva2VuKHR5cGUsc3RyZWFtKSB7CiAgICByZXR1cm4gYVRva2VuKHN0cmVhbS5jdXJyZW50KCksCiAgICAgICAgICAgICAgICAgc3RyZWFtLmNvbHVtbigpLAogICAgICAgICAgICAgICAgIHN0cmVhbS5pbmRlbnRhdGlvbigpLAogICAgICAgICAgICAgICAgIHR5cGUpOwogIH0KCiAgZnVuY3Rpb24gZmFrZVRva2VuKHR5cGUpIHsKICAgIHJldHVybiBhVG9rZW4odHlwZSwwLDAsdHlwZSk7CiAgfQoKICBmdW5jdGlvbiBwZWVrVG9rZW4oc3RhdGUsZGVwdGgpIHsKICAgIHZhciBsZW4gPSBzdGF0ZS50b2tlblN0YWNrLmxlbmd0aDsKICAgIHZhciBkZXAgPSAoZGVwdGggPyBkZXB0aCA6IDEpOwoKICAgIGlmIChsZW4gPCBkZXApIHsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfWVsc2V7CiAgICAgIHJldHVybiBzdGF0ZS50b2tlblN0YWNrW2xlbi1kZXBdOwogICAgfQogIH0KCiAgZnVuY3Rpb24gcHVzaFRva2VuKHN0YXRlLHRva2VuKSB7CgogICAgaWYgKCEodG9rZW4udHlwZSA9PSAiY29tbWVudCIgfHwgdG9rZW4udHlwZSA9PSAid2hpdGVzcGFjZSIpKSB7CiAgICAgIHN0YXRlLnRva2VuU3RhY2sgPSBtYXliZV9kcm9wX3ByZShzdGF0ZS50b2tlblN0YWNrLHRva2VuKTsKICAgICAgc3RhdGUudG9rZW5TdGFjayA9IG1heWJlX2Ryb3BfcG9zdChzdGF0ZS50b2tlblN0YWNrKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIG1heWJlX2Ryb3BfcHJlKHMsdG9rZW4pIHsKICAgIHZhciBsYXN0ID0gcy5sZW5ndGgtMTsKCiAgICBpZiAoMCA8IGxhc3QgJiYgc1tsYXN0XS50eXBlID09PSAicmVjb3JkIiAmJiB0b2tlbi50eXBlID09PSAiZG90IikgewogICAgICBzLnBvcCgpOwogICAgfWVsc2UgaWYgKDAgPCBsYXN0ICYmIHNbbGFzdF0udHlwZSA9PT0gImdyb3VwIikgewogICAgICBzLnBvcCgpOwogICAgICBzLnB1c2godG9rZW4pOwogICAgfWVsc2V7CiAgICAgIHMucHVzaCh0b2tlbik7CiAgICB9CiAgICByZXR1cm4gczsKICB9CgogIGZ1bmN0aW9uIG1heWJlX2Ryb3BfcG9zdChzKSB7CiAgICBpZiAoIXMubGVuZ3RoKSByZXR1cm4gcwogICAgdmFyIGxhc3QgPSBzLmxlbmd0aC0xOwoKICAgIGlmIChzW2xhc3RdLnR5cGUgPT09ICJkb3QiKSB7CiAgICAgIHJldHVybiBbXTsKICAgIH0KICAgIGlmIChsYXN0ID4gMSAmJiBzW2xhc3RdLnR5cGUgPT09ICJmdW4iICYmIHNbbGFzdC0xXS50b2tlbiA9PT0gImZ1biIpIHsKICAgICAgcmV0dXJuIHMuc2xpY2UoMCxsYXN0LTEpOwogICAgfQogICAgc3dpdGNoIChzW2xhc3RdLnRva2VuKSB7CiAgICAgIGNhc2UgIn0iOiAgICByZXR1cm4gZChzLHtnOlsieyJdfSk7CiAgICAgIGNhc2UgIl0iOiAgICByZXR1cm4gZChzLHtpOlsiWyJdfSk7CiAgICAgIGNhc2UgIikiOiAgICByZXR1cm4gZChzLHtpOlsiKCJdfSk7CiAgICAgIGNhc2UgIj4+IjogICByZXR1cm4gZChzLHtpOlsiPDwiXX0pOwogICAgICBjYXNlICJlbmQiOiAgcmV0dXJuIGQocyx7aTpbImJlZ2luIiwiY2FzZSIsImZ1biIsImlmIiwicmVjZWl2ZSIsInRyeSJdfSk7CiAgICAgIGNhc2UgIiwiOiAgICByZXR1cm4gZChzLHtlOlsiYmVnaW4iLCJ0cnkiLCJ3aGVuIiwiLT4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwiLCIoIiwiWyIsInsiLCI8PCJdfSk7CiAgICAgIGNhc2UgIi0+IjogICByZXR1cm4gZChzLHtyOlsid2hlbiJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbTpbInRyeSIsImlmIiwiY2FzZSIsInJlY2VpdmUiXX0pOwogICAgICBjYXNlICI7IjogICAgcmV0dXJuIGQocyx7RTpbImNhc2UiLCJmdW4iLCJpZiIsInJlY2VpdmUiLCJ0cnkiLCJ3aGVuIl19KTsKICAgICAgY2FzZSAiY2F0Y2giOnJldHVybiBkKHMse2U6WyJ0cnkiXX0pOwogICAgICBjYXNlICJvZiI6ICAgcmV0dXJuIGQocyx7ZTpbImNhc2UiXX0pOwogICAgICBjYXNlICJhZnRlciI6cmV0dXJuIGQocyx7ZTpbInJlY2VpdmUiLCJ0cnkiXX0pOwogICAgICBkZWZhdWx0OiAgICAgcmV0dXJuIHM7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBkKHN0YWNrLHR0KSB7CiAgICAvLyBzdGFjayBpcyBhIHN0YWNrIG9mIFRva2VuIG9iamVjdHMuCiAgICAvLyB0dCBpcyBhbiBvYmplY3Q7IHt0eXBlOnRva2Vuc30KICAgIC8vIHR5cGUgaXMgYSBjaGFyLCB0b2tlbnMgaXMgYSBsaXN0IG9mIHRva2VuIHN0cmluZ3MuCiAgICAvLyBUaGUgZnVuY3Rpb24gcmV0dXJucyAocG9zc2libHkgdHJ1bmNhdGVkKSBzdGFjay4KICAgIC8vIEl0IHdpbGwgZGVzY2VuZCB0aGUgc3RhY2ssIGxvb2tpbmcgZm9yIGEgVG9rZW4gc3VjaCB0aGF0IFRva2VuLnRva2VuCiAgICAvLyAgaXMgYSBtZW1iZXIgb2YgdG9rZW5zLiBJZiBpdCBkb2VzIG5vdCBmaW5kIHRoYXQsIGl0IHdpbGwgbm9ybWFsbHkgKGJ1dAogICAgLy8gIHNlZSAiRSIgYmVsb3cpIHJldHVybiBzdGFjay4gSWYgaXQgZG9lcyBmaW5kIGEgbWF0Y2gsIGl0IHdpbGwgcmVtb3ZlCiAgICAvLyAgYWxsIHRoZSBUb2tlbnMgYmV0d2VlbiB0aGUgdG9wIGFuZCB0aGUgbWF0Y2hlZCBUb2tlbi4KICAgIC8vIElmIHR5cGUgaXMgIm0iLCB0aGF0IGlzIGFsbCBpdCBkb2VzLgogICAgLy8gSWYgdHlwZSBpcyAiaSIsIGl0IHdpbGwgYWxzbyByZW1vdmUgdGhlIG1hdGNoZWQgVG9rZW4gYW5kIHRoZSB0b3AgVG9rZW4uCiAgICAvLyBJZiB0eXBlIGlzICJnIiwgbGlrZSAiaSIsIGJ1dCBhZGQgYSBmYWtlICJncm91cCIgdG9rZW4gYXQgdGhlIHRvcC4KICAgIC8vIElmIHR5cGUgaXMgInIiLCBpdCB3aWxsIHJlbW92ZSB0aGUgbWF0Y2hlZCBUb2tlbiwgYnV0IG5vdCB0aGUgdG9wIFRva2VuLgogICAgLy8gSWYgdHlwZSBpcyAiZSIsIGl0IHdpbGwga2VlcCB0aGUgbWF0Y2hlZCBUb2tlbiBidXQgbm90IHRoZSB0b3AgVG9rZW4uCiAgICAvLyBJZiB0eXBlIGlzICJFIiwgaXQgYmVoYXZlcyBhcyBmb3IgdHlwZSAiZSIsIGV4Y2VwdCBpZiB0aGVyZSBpcyBubyBtYXRjaCwKICAgIC8vICBpbiB3aGljaCBjYXNlIGl0IHdpbGwgcmV0dXJuIGFuIGVtcHR5IHN0YWNrLgoKICAgIGZvciAodmFyIHR5cGUgaW4gdHQpIHsKICAgICAgdmFyIGxlbiA9IHN0YWNrLmxlbmd0aC0xOwogICAgICB2YXIgdG9rZW5zID0gdHRbdHlwZV07CiAgICAgIGZvciAodmFyIGkgPSBsZW4tMTsgLTEgPCBpIDsgaS0tKSB7CiAgICAgICAgaWYgKGlzX21lbWJlcihzdGFja1tpXS50b2tlbix0b2tlbnMpKSB7CiAgICAgICAgICB2YXIgc3MgPSBzdGFjay5zbGljZSgwLGkpOwogICAgICAgICAgc3dpdGNoICh0eXBlKSB7CiAgICAgICAgICAgICAgY2FzZSAibSI6IHJldHVybiBzcy5jb25jYXQoc3RhY2tbaV0pLmNvbmNhdChzdGFja1tsZW5dKTsKICAgICAgICAgICAgICBjYXNlICJyIjogcmV0dXJuIHNzLmNvbmNhdChzdGFja1tsZW5dKTsKICAgICAgICAgICAgICBjYXNlICJpIjogcmV0dXJuIHNzOwogICAgICAgICAgICAgIGNhc2UgImciOiByZXR1cm4gc3MuY29uY2F0KGZha2VUb2tlbigiZ3JvdXAiKSk7CiAgICAgICAgICAgICAgY2FzZSAiRSI6IHJldHVybiBzcy5jb25jYXQoc3RhY2tbaV0pOwogICAgICAgICAgICAgIGNhc2UgImUiOiByZXR1cm4gc3MuY29uY2F0KHN0YWNrW2ldKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHJldHVybiAodHlwZSA9PSAiRSIgPyBbXSA6IHN0YWNrKTsKICB9CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLyBpbmRlbnRlcgoKICBmdW5jdGlvbiBpbmRlbnRlcihzdGF0ZSx0ZXh0QWZ0ZXIpIHsKICAgIHZhciB0OwogICAgdmFyIHVuaXQgPSBjbUNmZy5pbmRlbnRVbml0OwogICAgdmFyIHdvcmRBZnRlciA9IHdvcmRhZnRlcih0ZXh0QWZ0ZXIpOwogICAgdmFyIGN1cnJUID0gcGVla1Rva2VuKHN0YXRlLDEpOwogICAgdmFyIHByZXZUID0gcGVla1Rva2VuKHN0YXRlLDIpOwoKICAgIGlmIChzdGF0ZS5pbl9zdHJpbmcgfHwgc3RhdGUuaW5fYXRvbSkgewogICAgICByZXR1cm4gQ29kZU1pcnJvci5QYXNzOwogICAgfWVsc2UgaWYgKCFwcmV2VCkgewogICAgICByZXR1cm4gMDsKICAgIH1lbHNlIGlmIChjdXJyVC50b2tlbiA9PSAid2hlbiIpIHsKICAgICAgcmV0dXJuIGN1cnJULmNvbHVtbit1bml0OwogICAgfWVsc2UgaWYgKHdvcmRBZnRlciA9PT0gIndoZW4iICYmIHByZXZULnR5cGUgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgcmV0dXJuIHByZXZULmluZGVudCt1bml0OwogICAgfWVsc2UgaWYgKHdvcmRBZnRlciA9PT0gIigiICYmIGN1cnJULnRva2VuID09PSAiZnVuIikgewogICAgICByZXR1cm4gIGN1cnJULmNvbHVtbiszOwogICAgfWVsc2UgaWYgKHdvcmRBZnRlciA9PT0gImNhdGNoIiAmJiAodCA9IGdldFRva2VuKHN0YXRlLFsidHJ5Il0pKSkgewogICAgICByZXR1cm4gdC5jb2x1bW47CiAgICB9ZWxzZSBpZiAoaXNfbWVtYmVyKHdvcmRBZnRlcixbImVuZCIsImFmdGVyIiwib2YiXSkpIHsKICAgICAgdCA9IGdldFRva2VuKHN0YXRlLFsiYmVnaW4iLCJjYXNlIiwiZnVuIiwiaWYiLCJyZWNlaXZlIiwidHJ5Il0pOwogICAgICByZXR1cm4gdCA/IHQuY29sdW1uIDogQ29kZU1pcnJvci5QYXNzOwogICAgfWVsc2UgaWYgKGlzX21lbWJlcih3b3JkQWZ0ZXIsY2xvc2VQYXJlbldvcmRzKSkgewogICAgICB0ID0gZ2V0VG9rZW4oc3RhdGUsb3BlblBhcmVuV29yZHMpOwogICAgICByZXR1cm4gdCA/IHQuY29sdW1uIDogQ29kZU1pcnJvci5QYXNzOwogICAgfWVsc2UgaWYgKGlzX21lbWJlcihjdXJyVC50b2tlbixbIiwiLCJ8IiwifHwiXSkgfHwKICAgICAgICAgICAgICBpc19tZW1iZXIod29yZEFmdGVyLFsiLCIsInwiLCJ8fCJdKSkgewogICAgICB0ID0gcG9zdGNvbW1hVG9rZW4oc3RhdGUpOwogICAgICByZXR1cm4gdCA/IHQuY29sdW1uK3QudG9rZW4ubGVuZ3RoIDogdW5pdDsKICAgIH1lbHNlIGlmIChjdXJyVC50b2tlbiA9PSAiLT4iKSB7CiAgICAgIGlmIChpc19tZW1iZXIocHJldlQudG9rZW4sIFsicmVjZWl2ZSIsImNhc2UiLCJpZiIsInRyeSJdKSkgewogICAgICAgIHJldHVybiBwcmV2VC5jb2x1bW4rdW5pdCt1bml0OwogICAgICB9ZWxzZXsKICAgICAgICByZXR1cm4gcHJldlQuY29sdW1uK3VuaXQ7CiAgICAgIH0KICAgIH1lbHNlIGlmIChpc19tZW1iZXIoY3VyclQudG9rZW4sb3BlblBhcmVuV29yZHMpKSB7CiAgICAgIHJldHVybiBjdXJyVC5jb2x1bW4rY3VyclQudG9rZW4ubGVuZ3RoOwogICAgfWVsc2V7CiAgICAgIHQgPSBkZWZhdWx0VG9rZW4oc3RhdGUpOwogICAgICByZXR1cm4gdHJ1dGh5KHQpID8gdC5jb2x1bW4rdW5pdCA6IDA7CiAgICB9CiAgfQoKICBmdW5jdGlvbiB3b3JkYWZ0ZXIoc3RyKSB7CiAgICB2YXIgbSA9IHN0ci5tYXRjaCgvLHxbYS16XSt8XH18XF18XCl8Pj58XHwrfFwoLyk7CgogICAgcmV0dXJuIHRydXRoeShtKSAmJiAobS5pbmRleCA9PT0gMCkgPyBtWzBdIDogIiI7CiAgfQoKICBmdW5jdGlvbiBwb3N0Y29tbWFUb2tlbihzdGF0ZSkgewogICAgdmFyIG9ianMgPSBzdGF0ZS50b2tlblN0YWNrLnNsaWNlKDAsLTEpOwogICAgdmFyIGkgPSBnZXRUb2tlbkluZGV4KG9ianMsInR5cGUiLFsib3Blbl9wYXJlbiJdKTsKCiAgICByZXR1cm4gdHJ1dGh5KG9ianNbaV0pID8gb2Jqc1tpXSA6IGZhbHNlOwogIH0KCiAgZnVuY3Rpb24gZGVmYXVsdFRva2VuKHN0YXRlKSB7CiAgICB2YXIgb2JqcyA9IHN0YXRlLnRva2VuU3RhY2s7CiAgICB2YXIgc3RvcCA9IGdldFRva2VuSW5kZXgob2JqcywidHlwZSIsWyJvcGVuX3BhcmVuIiwic2VwYXJhdG9yIiwia2V5d29yZCJdKTsKICAgIHZhciBvcGVyID0gZ2V0VG9rZW5JbmRleChvYmpzLCJ0eXBlIixbIm9wZXJhdG9yIl0pOwoKICAgIGlmICh0cnV0aHkoc3RvcCkgJiYgdHJ1dGh5KG9wZXIpICYmIHN0b3AgPCBvcGVyKSB7CiAgICAgIHJldHVybiBvYmpzW3N0b3ArMV07CiAgICB9IGVsc2UgaWYgKHRydXRoeShzdG9wKSkgewogICAgICByZXR1cm4gb2Jqc1tzdG9wXTsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGdldFRva2VuKHN0YXRlLHRva2VucykgewogICAgdmFyIG9ianMgPSBzdGF0ZS50b2tlblN0YWNrOwogICAgdmFyIGkgPSBnZXRUb2tlbkluZGV4KG9ianMsInRva2VuIix0b2tlbnMpOwoKICAgIHJldHVybiB0cnV0aHkob2Jqc1tpXSkgPyBvYmpzW2ldIDogZmFsc2U7CiAgfQoKICBmdW5jdGlvbiBnZXRUb2tlbkluZGV4KG9ianMscHJvcG5hbWUscHJvcHZhbHMpIHsKCiAgICBmb3IgKHZhciBpID0gb2Jqcy5sZW5ndGgtMTsgLTEgPCBpIDsgaS0tKSB7CiAgICAgIGlmIChpc19tZW1iZXIob2Jqc1tpXVtwcm9wbmFtZV0scHJvcHZhbHMpKSB7CiAgICAgICAgcmV0dXJuIGk7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBmYWxzZTsKICB9CgogIGZ1bmN0aW9uIHRydXRoeSh4KSB7CiAgICByZXR1cm4gKHggIT09IGZhbHNlKSAmJiAoeCAhPSBudWxsKTsKICB9CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLyB0aGlzIG9iamVjdCBkZWZpbmVzIHRoZSBtb2RlCgogIHJldHVybiB7CiAgICBzdGFydFN0YXRlOgogICAgICBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4ge3Rva2VuU3RhY2s6IFtdLAogICAgICAgICAgICAgICAgaW5fc3RyaW5nOiAgZmFsc2UsCiAgICAgICAgICAgICAgICBpbl9hdG9tOiAgICBmYWxzZX07CiAgICAgIH0sCgogICAgdG9rZW46CiAgICAgIGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgICByZXR1cm4gdG9rZW5pemVyKHN0cmVhbSwgc3RhdGUpOwogICAgICB9LAoKICAgIGluZGVudDoKICAgICAgZnVuY3Rpb24oc3RhdGUsIHRleHRBZnRlcikgewogICAgICAgIHJldHVybiBpbmRlbnRlcihzdGF0ZSx0ZXh0QWZ0ZXIpOwogICAgICB9LAoKICAgIGxpbmVDb21tZW50OiAiJSIKICB9Owp9KTsKCn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/erlang/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogRXJsYW5nIG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL3RoZW1lL2VybGFuZy1kYXJrLmNzcyI+CjxzY3JpcHQgc3JjPSIuLi8uLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi8uLi9hZGRvbi9lZGl0L21hdGNoYnJhY2tldHMuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iZXJsYW5nLmpzIj48L3NjcmlwdD4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4uQ29kZU1pcnJvciB7Ym9yZGVyLXRvcDogMXB4IHNvbGlkIGJsYWNrOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGgxPkNvZGVNaXJyb3I8L2gxPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5Fcmxhbmc8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPkVybGFuZyBtb2RlPC9oMj4KPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KJSUgLSotIG1vZGU6IGVybGFuZzsgZXJsYW5nLWluZGVudC1sZXZlbDogMiAtKi0KJSUlIENyZWF0ZWQgOiAgNyBNYXkgMjAxMiBieSBtYXRzIGNyb25xdmlzdCA8bWFzc2VAa2xhcm5hLmNvbT4KCiUlIEBkb2MKJSUgRGVtb25zdHJhdGVzIGhvdyB0byBwcmludCBhIHJlY29yZC4KJSUgQGVuZAoKLW1vZHVsZSgnZXgnKS4KLWF1dGhvcignbWF0cyBjcm9ucXZpc3QnKS4KLWV4cG9ydChbZGVtby8wLAogICAgICAgICByZWNfaW5mby8xXSkuCgotcmVjb3JkKGRlbW8se2E9Ik9uZSIsYj0iVHdvIixjPSJUaHJlZSIsZD0iRm91ciJ9KS4KCnJlY19pbmZvKGRlbW8pIC0+IHJlY29yZF9pbmZvKGZpZWxkcyxkZW1vKS4KCmRlbW8oKSAtPiBleHBhbmRfcmVjcyg/TU9EVUxFLCNkZW1ve2E9IkEiLGI9IkJCIn0pLgoKZXhwYW5kX3JlY3MoTSxMaXN0KSB3aGVuIGlzX2xpc3QoTGlzdCkgLT4KICBbZXhwYW5kX3JlY3MoTSxMKXx8TDwtTGlzdF07CmV4cGFuZF9yZWNzKE0sVHVwKSB3aGVuIGlzX3R1cGxlKFR1cCkgLT4KICBjYXNlIHR1cGxlX3NpemUoVHVwKSBvZgogICAgTCB3aGVuIEwgPCAxIC0+IFR1cDsKICAgIEwgLT4KICAgICAgdHJ5CiAgICAgICAgRmllbGRzID0gTTpyZWNfaW5mbyhlbGVtZW50KDEsVHVwKSksCiAgICAgICAgTCA9IGxlbmd0aChGaWVsZHMpKzEsCiAgICAgICAgbGlzdHM6emlwKEZpZWxkcyxleHBhbmRfcmVjcyhNLHRsKHR1cGxlX3RvX2xpc3QoVHVwKSkpKQogICAgICBjYXRjaAogICAgICAgIF86XyAtPiBsaXN0X3RvX3R1cGxlKGV4cGFuZF9yZWNzKE0sdHVwbGVfdG9fbGlzdChUdXApKSkKICAgICAgZW5kCiAgZW5kOwpleHBhbmRfcmVjcyhfLFRlcm0pIC0+CiAgVGVybS4KPC90ZXh0YXJlYT48L2Zvcm0+CgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgICAgICBtYXRjaEJyYWNrZXRzOiB0cnVlLAogICAgICAgIGV4dHJhS2V5czogeyJUYWIiOiAgImluZGVudEF1dG8ifSwKICAgICAgICB0aGVtZTogImVybGFuZy1kYXJrIgogICAgICB9KTsKICAgIDwvc2NyaXB0PgoKICAgIDxwPjxzdHJvbmc+TUlNRSB0eXBlcyBkZWZpbmVkOjwvc3Ryb25nPiA8Y29kZT50ZXh0L3gtZXJsYW5nPC9jb2RlPi48L3A+CiAgPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/factor/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/factor/factor.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovLyBGYWN0b3Igc3ludGF4IGhpZ2hsaWdodCAtIHNpbXBsZSBtb2RlCi8vCi8vIGJ5IERpbWFnZSBTYXBlbGtpbiAoaHR0cHM6Ly9naXRodWIuY29tL2tlcmFicm9tc211KQoKKGZ1bmN0aW9uKG1vZCkgewogIGlmICh0eXBlb2YgZXhwb3J0cyA9PSAib2JqZWN0IiAmJiB0eXBlb2YgbW9kdWxlID09ICJvYmplY3QiKSAvLyBDb21tb25KUwogICAgbW9kKHJlcXVpcmUoIi4uLy4uL2xpYi9jb2RlbWlycm9yIiksIHJlcXVpcmUoIi4uLy4uL2FkZG9uL21vZGUvc2ltcGxlIikpOwogIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kKSAvLyBBTUQKICAgIGRlZmluZShbIi4uLy4uL2xpYi9jb2RlbWlycm9yIiwgIi4uLy4uL2FkZG9uL21vZGUvc2ltcGxlIl0sIG1vZCk7CiAgZWxzZSAvLyBQbGFpbiBicm93c2VyIGVudgogICAgbW9kKENvZGVNaXJyb3IpOwp9KShmdW5jdGlvbihDb2RlTWlycm9yKSB7CiAgInVzZSBzdHJpY3QiOwoKICBDb2RlTWlycm9yLmRlZmluZVNpbXBsZU1vZGUoImZhY3RvciIsIHsKICAgIC8vIFRoZSBzdGFydCBzdGF0ZSBjb250YWlucyB0aGUgcnVsZXMgdGhhdCBhcmUgaW50aWFsbHkgdXNlZAogICAgc3RhcnQ6IFsKICAgICAgLy8gY29tbWVudHMKICAgICAge3JlZ2V4OiAvIz8hLiovLCB0b2tlbjogImNvbW1lbnQifSwKICAgICAgLy8gc3RyaW5ncyAiIiIsIG11bHRpbGluZSAtLT4gc3RhdGUKICAgICAge3JlZ2V4OiAvIiIiLywgdG9rZW46ICJzdHJpbmciLCBuZXh0OiAic3RyaW5nMyJ9LAogICAgICB7cmVnZXg6IC8iLywgdG9rZW46ICJzdHJpbmciLCBuZXh0OiAic3RyaW5nIn0sCiAgICAgIC8vIG51bWJlcnM6IGRlYywgaGV4LCB1bmljb2RlLCBiaW4sIGZyYWN0aW9uYWwsIGNvbXBsZXgKICAgICAge3JlZ2V4OiAvKD86WystXT8pKD86MHhbXGQsYS1mXSspfCg/OjBvWzAtN10rKXwoPzowYlswLDFdKyl8KD86XGQrLj9cZCopLywgdG9rZW46ICJudW1iZXIifSwKICAgICAgLy97cmVnZXg6IC9bKy1dPy99IC8vZnJhY3Rpb25hbAogICAgICAvLyBkZWZpbml0aW9uOiBkZWZpbmluZyB3b3JkLCBkZWZpbmVkIHdvcmQsIGV0YwogICAgICB7cmVnZXg6IC8oXDopKFxzKykoXFMrKShccyspKFwoKS8sIHRva2VuOiBbImtleXdvcmQiLCBudWxsLCAiZGVmIiwgbnVsbCwgImtleXdvcmQiXSwgbmV4dDogInN0YWNrIn0sCiAgICAgIC8vIHZvY2FidWxhcnkgdXNpbmcgLS0+IHN0YXRlCiAgICAgIHtyZWdleDogL1VTSU5HXDovLCB0b2tlbjogImtleXdvcmQiLCBuZXh0OiAidm9jYWJ1bGFyeSJ9LAogICAgICAvLyB2b2NhYnVsYXJ5IGRlZmluaXRpb24vdXNlCiAgICAgIHtyZWdleDogLyhVU0VcOnxJTlw6KShccyspKFxTKykvLCB0b2tlbjogWyJrZXl3b3JkIiwgbnVsbCwgInZhcmlhYmxlLTIiXX0sCiAgICAgIC8vIDxjb25zdHJ1Y3RvcnM+CiAgICAgIHtyZWdleDogLzxcUys+LywgdG9rZW46ICJidWlsdGluIn0sCiAgICAgIC8vICJrZXl3b3JkcyIsIGluY2wuIDsgdCBmIC4gWyBdIHsgfSBkZWZpbmluZyB3b3JkcwogICAgICB7cmVnZXg6IC87fHR8ZnxpZnxcLnxcW3xcXXxce3xcfXxNQUlOOi8sIHRva2VuOiAia2V5d29yZCJ9LAogICAgICAvLyBhbnkgaWQgKD8pCiAgICAgIHtyZWdleDogL1xTKy8sIHRva2VuOiAidmFyaWFibGUifSwKCiAgICAgIHsKICAgICAgICByZWdleDogLy4vLAogICAgICAgIHRva2VuOiBudWxsCiAgICAgIH0KICAgIF0sCiAgICB2b2NhYnVsYXJ5OiBbCiAgICAgIHtyZWdleDogLzsvLCB0b2tlbjogImtleXdvcmQiLCBuZXh0OiAic3RhcnQifSwKICAgICAge3JlZ2V4OiAvXFMrLywgdG9rZW46ICJ2YXJpYWJsZS0yIn0sCiAgICAgIHsKICAgICAgICByZWdleDogLy4vLAogICAgICAgIHRva2VuOiBudWxsCiAgICAgIH0KICAgIF0sCiAgICBzdHJpbmc6IFsKICAgICAge3JlZ2V4OiAvKD86W15cXF18XFwuKSo/Ii8sIHRva2VuOiAic3RyaW5nIiwgbmV4dDogInN0YXJ0In0sCiAgICAgIHtyZWdleDogLy4qLywgdG9rZW46ICJzdHJpbmcifQogICAgXSwKICAgIHN0cmluZzM6IFsKICAgICAge3JlZ2V4OiAvKD86W15cXF18XFwuKSo/IiIiLywgdG9rZW46ICJzdHJpbmciLCBuZXh0OiAic3RhcnQifSwKICAgICAge3JlZ2V4OiAvLiovLCB0b2tlbjogInN0cmluZyJ9CiAgICBdLAogICAgc3RhY2s6IFsKICAgICAge3JlZ2V4OiAvXCkvLCB0b2tlbjogIm1ldGEiLCBuZXh0OiAic3RhcnQifSwKICAgICAge3JlZ2V4OiAvLS0vLCB0b2tlbjogIm1ldGEifSwKICAgICAge3JlZ2V4OiAvXFMrLywgdG9rZW46ICJ2YXJpYWJsZS0zIn0sCiAgICAgIHsKICAgICAgICByZWdleDogLy4vLAogICAgICAgIHRva2VuOiBudWxsCiAgICAgIH0KICAgIF0sCiAgICAvLyBUaGUgbWV0YSBwcm9wZXJ0eSBjb250YWlucyBnbG9iYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG1vZGUuIEl0CiAgICAvLyBjYW4gY29udGFpbiBwcm9wZXJ0aWVzIGxpa2UgbGluZUNvbW1lbnQsIHdoaWNoIGFyZSBzdXBwb3J0ZWQgYnkKICAgIC8vIGFsbCBtb2RlcywgYW5kIGFsc28gZGlyZWN0aXZlcyBsaWtlIGRvbnRJbmRlbnRTdGF0ZXMsIHdoaWNoIGFyZQogICAgLy8gc3BlY2lmaWMgdG8gc2ltcGxlIG1vZGVzLgogICAgbWV0YTogewogICAgICBkb250SW5kZW50U3RhdGVzOiBbInN0YXJ0IiwgInZvY2FidWxhcnkiLCAic3RyaW5nIiwgInN0cmluZzMiLCAic3RhY2siXSwKICAgICAgbGluZUNvbW1lbnQ6IFsgIiEiLCAiIyEiIF0KICAgIH0KICB9KTsKCiAgQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtZmFjdG9yIiwgImZhY3RvciIpOwp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/factor/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogRmFjdG9yIG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgaHJlZj0naHR0cDovL2ZvbnRzLmdvb2dsZWFwaXMuY29tL2Nzcz9mYW1pbHk9RHJvaWQrU2FucytNb25vJyByZWw9J3N0eWxlc2hlZXQnIHR5cGU9J3RleHQvY3NzJz4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vLi4vYWRkb24vbW9kZS9zaW1wbGUuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iZmFjdG9yLmpzIj48L3NjcmlwdD4KPHN0eWxlPgouQ29kZU1pcnJvciB7CiAgICBmb250LWZhbWlseTogJ0Ryb2lkIFNhbnMgTW9ubycsIG1vbm9zcGFjZTsKICAgIGZvbnQtc2l6ZTogMTRweDsKfQo8L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxoMT5Db2RlTWlycm9yPC9oMT48aW1nIGlkPWxvZ28gc3JjPSIuLi8uLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5MYW5ndWFnZSBtb2RlczwvYT4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+RmFjdG9yPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+Cgo8aDI+RmFjdG9yIG1vZGU8L2gyPgoKPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KISBDb3B5cmlnaHQgKEMpIDIwMDggU2xhdmEgUGVzdG92LgohIFNlZSBodHRwOi8vZmFjdG9yY29kZS5vcmcvbGljZW5zZS50eHQgZm9yIEJTRCBsaWNlbnNlLgoKISBBIHNpbXBsZSB0aW1lIHNlcnZlcgoKVVNJTkc6IGFjY2Vzc29ycyBjYWxlbmRhciBjYWxlbmRhci5mb3JtYXQgaW8gaW8uZW5jb2RpbmdzLmFzY2lpCmlvLnNlcnZlcnMga2VybmVsIHRocmVhZHMgOwpJTjogdGltZS1zZXJ2ZXIKCjogaGFuZGxlLXRpbWUtY2xpZW50ICggLS0gKQogICAgbm93IHRpbWVzdGFtcD5yZmM4MjIgcHJpbnQgOwoKOiA8dGltZS1zZXJ2ZXI+ICggLS0gdGhyZWFkZWQtc2VydmVyICkKICAgIGFzY2lpIDx0aHJlYWRlZC1zZXJ2ZXI+CiAgICAgICAgInRpbWUtc2VydmVyIiA+Pm5hbWUKICAgICAgICAxMjM0ID4+aW5zZWN1cmUKICAgICAgICBbIGhhbmRsZS10aW1lLWNsaWVudCBdID4+aGFuZGxlciA7Cgo6IHN0YXJ0LXRpbWUtc2VydmVyICggLS0gKQogICAgPHRpbWUtc2VydmVyPiBzdGFydC1zZXJ2ZXIgZHJvcCA7CgpNQUlOOiBzdGFydC10aW1lLXNlcnZlcgo8L3RleHRhcmVhPgogIDwvZm9ybT4KCjxzY3JpcHQ+CiAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgbGluZVdyYXBwaW5nOiB0cnVlLAogICAgaW5kZW50VW5pdDogMiwKICAgIHRhYlNpemU6IDIsCiAgICBhdXRvZm9jdXM6IHRydWUsCiAgICBtb2RlOiAidGV4dC94LWZhY3RvciIKICB9KTsKPC9zY3JpcHQ+CjxwLz4KPHA+U2ltcGxlIG1vZGUgdGhhdCBoYW5kbGVzIEZhY3RvciBTeW50YXggKDxhIGhyZWY9Imh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRmFjdG9yXyhwcm9ncmFtbWluZ19sYW5ndWFnZSkiPkZhY3RvciBvbiBXaWtpUGVkaWE8L2E+KS48L3A+Cgo8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC94LWZhY3RvcjwvY29kZT4uPC9wPgoKPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/fcl/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/fcl/fcl.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJmY2wiLCBmdW5jdGlvbihjb25maWcpIHsKICB2YXIgaW5kZW50VW5pdCA9IGNvbmZpZy5pbmRlbnRVbml0OwoKICB2YXIga2V5d29yZHMgPSB7CiAgICAgICJ0ZXJtIjogdHJ1ZSwKICAgICAgIm1ldGhvZCI6IHRydWUsICJhY2N1IjogdHJ1ZSwKICAgICAgInJ1bGUiOiB0cnVlLCAidGhlbiI6IHRydWUsICJpcyI6IHRydWUsICJhbmQiOiB0cnVlLCAib3IiOiB0cnVlLAogICAgICAiaWYiOiB0cnVlLCAiZGVmYXVsdCI6IHRydWUKICB9OwoKICB2YXIgc3RhcnRfYmxvY2tzID0gewogICAgICAidmFyX2lucHV0IjogdHJ1ZSwKICAgICAgInZhcl9vdXRwdXQiOiB0cnVlLAogICAgICAiZnV6emlmeSI6IHRydWUsCiAgICAgICJkZWZ1enppZnkiOiB0cnVlLAogICAgICAiZnVuY3Rpb25fYmxvY2siOiB0cnVlLAogICAgICAicnVsZWJsb2NrIjogdHJ1ZQogIH07CgogIHZhciBlbmRfYmxvY2tzID0gewogICAgICAiZW5kX3J1bGVibG9jayI6IHRydWUsCiAgICAgICJlbmRfZGVmdXp6aWZ5IjogdHJ1ZSwKICAgICAgImVuZF9mdW5jdGlvbl9ibG9jayI6IHRydWUsCiAgICAgICJlbmRfZnV6emlmeSI6IHRydWUsCiAgICAgICJlbmRfdmFyIjogdHJ1ZQogIH07CgogIHZhciBhdG9tcyA9IHsKICAgICAgInRydWUiOiB0cnVlLCAiZmFsc2UiOiB0cnVlLCAibmFuIjogdHJ1ZSwKICAgICAgInJlYWwiOiB0cnVlLCAibWluIjogdHJ1ZSwgIm1heCI6IHRydWUsICJjb2ciOiB0cnVlLCAiY29ncyI6IHRydWUKICB9OwoKICB2YXIgaXNPcGVyYXRvckNoYXIgPSAvWytcLSomXiU6PTw+IXxcL10vOwoKICBmdW5jdGlvbiB0b2tlbkJhc2Uoc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIGNoID0gc3RyZWFtLm5leHQoKTsKCiAgICBpZiAoL1tcZFwuXS8udGVzdChjaCkpIHsKICAgICAgaWYgKGNoID09ICIuIikgewogICAgICAgIHN0cmVhbS5tYXRjaCgvXlswLTldKyhbZUVdW1wtK10/WzAtOV0rKT8vKTsKICAgICAgfSBlbHNlIGlmIChjaCA9PSAiMCIpIHsKICAgICAgICBzdHJlYW0ubWF0Y2goL15beFhdWzAtOWEtZkEtRl0rLykgfHwgc3RyZWFtLm1hdGNoKC9eMFswLTddKy8pOwogICAgICB9IGVsc2UgewogICAgICAgIHN0cmVhbS5tYXRjaCgvXlswLTldKlwuP1swLTldKihbZUVdW1wtK10/WzAtOV0rKT8vKTsKICAgICAgfQogICAgICByZXR1cm4gIm51bWJlciI7CiAgICB9CgogICAgaWYgKGNoID09ICIvIiB8fCBjaCA9PSAiKCIpIHsKICAgICAgaWYgKHN0cmVhbS5lYXQoIioiKSkgewogICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5Db21tZW50OwogICAgICAgIHJldHVybiB0b2tlbkNvbW1lbnQoc3RyZWFtLCBzdGF0ZSk7CiAgICAgIH0KICAgICAgaWYgKHN0cmVhbS5lYXQoIi8iKSkgewogICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgICByZXR1cm4gImNvbW1lbnQiOwogICAgICB9CiAgICB9CiAgICBpZiAoaXNPcGVyYXRvckNoYXIudGVzdChjaCkpIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKGlzT3BlcmF0b3JDaGFyKTsKICAgICAgcmV0dXJuICJvcGVyYXRvciI7CiAgICB9CiAgICBzdHJlYW0uZWF0V2hpbGUoL1tcd1wkX1x4YTEtXHVmZmZmXS8pOwoKICAgIHZhciBjdXIgPSBzdHJlYW0uY3VycmVudCgpLnRvTG93ZXJDYXNlKCk7CiAgICBpZiAoa2V5d29yZHMucHJvcGVydHlJc0VudW1lcmFibGUoY3VyKSB8fAogICAgICAgIHN0YXJ0X2Jsb2Nrcy5wcm9wZXJ0eUlzRW51bWVyYWJsZShjdXIpIHx8CiAgICAgICAgZW5kX2Jsb2Nrcy5wcm9wZXJ0eUlzRW51bWVyYWJsZShjdXIpKSB7CiAgICAgIHJldHVybiAia2V5d29yZCI7CiAgICB9CiAgICBpZiAoYXRvbXMucHJvcGVydHlJc0VudW1lcmFibGUoY3VyKSkgcmV0dXJuICJhdG9tIjsKICAgIHJldHVybiAidmFyaWFibGUiOwogIH0KCgogIGZ1bmN0aW9uIHRva2VuQ29tbWVudChzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgbWF5YmVFbmQgPSBmYWxzZSwgY2g7CiAgICB3aGlsZSAoY2ggPSBzdHJlYW0ubmV4dCgpKSB7CiAgICAgIGlmICgoY2ggPT0gIi8iIHx8IGNoID09ICIpIikgJiYgbWF5YmVFbmQpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBtYXliZUVuZCA9IChjaCA9PSAiKiIpOwogICAgfQogICAgcmV0dXJuICJjb21tZW50IjsKICB9CgogIGZ1bmN0aW9uIENvbnRleHQoaW5kZW50ZWQsIGNvbHVtbiwgdHlwZSwgYWxpZ24sIHByZXYpIHsKICAgIHRoaXMuaW5kZW50ZWQgPSBpbmRlbnRlZDsKICAgIHRoaXMuY29sdW1uID0gY29sdW1uOwogICAgdGhpcy50eXBlID0gdHlwZTsKICAgIHRoaXMuYWxpZ24gPSBhbGlnbjsKICAgIHRoaXMucHJldiA9IHByZXY7CiAgfQoKICBmdW5jdGlvbiBwdXNoQ29udGV4dChzdGF0ZSwgY29sLCB0eXBlKSB7CiAgICByZXR1cm4gc3RhdGUuY29udGV4dCA9IG5ldyBDb250ZXh0KHN0YXRlLmluZGVudGVkLCBjb2wsIHR5cGUsIG51bGwsIHN0YXRlLmNvbnRleHQpOwogIH0KCiAgZnVuY3Rpb24gcG9wQ29udGV4dChzdGF0ZSkgewogICAgaWYgKCFzdGF0ZS5jb250ZXh0LnByZXYpIHJldHVybjsKICAgIHZhciB0ID0gc3RhdGUuY29udGV4dC50eXBlOwogICAgaWYgKHQgPT0gImVuZF9ibG9jayIpCiAgICAgIHN0YXRlLmluZGVudGVkID0gc3RhdGUuY29udGV4dC5pbmRlbnRlZDsKICAgIHJldHVybiBzdGF0ZS5jb250ZXh0ID0gc3RhdGUuY29udGV4dC5wcmV2OwogIH0KCiAgLy8gSW50ZXJmYWNlCgogIHJldHVybiB7CiAgICBzdGFydFN0YXRlOiBmdW5jdGlvbihiYXNlY29sdW1uKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgdG9rZW5pemU6IG51bGwsCiAgICAgICAgY29udGV4dDogbmV3IENvbnRleHQoKGJhc2Vjb2x1bW4gfHwgMCkgLSBpbmRlbnRVbml0LCAwLCAidG9wIiwgZmFsc2UpLAogICAgICAgIGluZGVudGVkOiAwLAogICAgICAgIHN0YXJ0T2ZMaW5lOiB0cnVlCiAgICAgIH07CiAgICB9LAoKICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgICAgdmFyIGN0eCA9IHN0YXRlLmNvbnRleHQ7CiAgICAgICAgaWYgKHN0cmVhbS5zb2woKSkgewogICAgICAgICAgICBpZiAoY3R4LmFsaWduID09IG51bGwpIGN0eC5hbGlnbiA9IGZhbHNlOwogICAgICAgICAgICBzdGF0ZS5pbmRlbnRlZCA9IHN0cmVhbS5pbmRlbnRhdGlvbigpOwogICAgICAgICAgICBzdGF0ZS5zdGFydE9mTGluZSA9IHRydWU7CiAgICAgICAgfQogICAgICAgIGlmIChzdHJlYW0uZWF0U3BhY2UoKSkgcmV0dXJuIG51bGw7CgogICAgICAgIHZhciBzdHlsZSA9IChzdGF0ZS50b2tlbml6ZSB8fCB0b2tlbkJhc2UpKHN0cmVhbSwgc3RhdGUpOwogICAgICAgIGlmIChzdHlsZSA9PSAiY29tbWVudCIpIHJldHVybiBzdHlsZTsKICAgICAgICBpZiAoY3R4LmFsaWduID09IG51bGwpIGN0eC5hbGlnbiA9IHRydWU7CgogICAgICAgIHZhciBjdXIgPSBzdHJlYW0uY3VycmVudCgpLnRvTG93ZXJDYXNlKCk7CgogICAgICAgIGlmIChzdGFydF9ibG9ja3MucHJvcGVydHlJc0VudW1lcmFibGUoY3VyKSkgcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbS5jb2x1bW4oKSwgImVuZF9ibG9jayIpOwogICAgICAgIGVsc2UgaWYgKGVuZF9ibG9ja3MucHJvcGVydHlJc0VudW1lcmFibGUoY3VyKSkgIHBvcENvbnRleHQoc3RhdGUpOwoKICAgICAgICBzdGF0ZS5zdGFydE9mTGluZSA9IGZhbHNlOwogICAgICAgIHJldHVybiBzdHlsZTsKICAgIH0sCgogICAgaW5kZW50OiBmdW5jdGlvbihzdGF0ZSwgdGV4dEFmdGVyKSB7CiAgICAgIGlmIChzdGF0ZS50b2tlbml6ZSAhPSB0b2tlbkJhc2UgJiYgc3RhdGUudG9rZW5pemUgIT0gbnVsbCkgcmV0dXJuIDA7CiAgICAgIHZhciBjdHggPSBzdGF0ZS5jb250ZXh0OwoKICAgICAgdmFyIGNsb3NpbmcgPSBlbmRfYmxvY2tzLnByb3BlcnR5SXNFbnVtZXJhYmxlKHRleHRBZnRlcik7CiAgICAgIGlmIChjdHguYWxpZ24pIHJldHVybiBjdHguY29sdW1uICsgKGNsb3NpbmcgPyAwIDogMSk7CiAgICAgIGVsc2UgcmV0dXJuIGN0eC5pbmRlbnRlZCArIChjbG9zaW5nID8gMCA6IGluZGVudFVuaXQpOwogICAgfSwKCiAgICBlbGVjdHJpY0NoYXJzOiAicnlrIiwKICAgIGZvbGQ6ICJicmFjZSIsCiAgICBibG9ja0NvbW1lbnRTdGFydDogIigqIiwKICAgIGJsb2NrQ29tbWVudEVuZDogIiopIiwKICAgIGxpbmVDb21tZW50OiAiLy8iCiAgfTsKfSk7CgpDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveC1mY2wiLCAiZmNsIik7Cn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/fcl/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogRkNMIG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL3RoZW1lL2VsZWdhbnQuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uLy4uL2FkZG9uL2VkaXQvbWF0Y2hicmFja2V0cy5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJmY2wuanMiPjwvc2NyaXB0Pgo8c3R5bGU+LkNvZGVNaXJyb3Ige2JvcmRlcjoxcHggc29saWQgIzk5OTsgYmFja2dyb3VuZDojZmZjfTwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGgxPkNvZGVNaXJyb3I8L2gxPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5GQ0w8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPkZDTCBtb2RlPC9oMj4KPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KICBGVU5DVElPTl9CTE9DSyBGdXp6eV9GQgogICAgICBWQVJfSU5QVVQKICAgICAgICAgIFRpbWVEYXkgOiBSRUFMOyAoKiBSQU5HRSgwIC4uIDIzKSAqKQogICAgICAgICAgQXBwbGljYXRlSG9zdDogUkVBTDsKICAgICAgICAgIFRpbWVDb25maWd1cmF0aW9uOiBSRUFMOwogICAgICAgICAgVGltZVJlcXVpcmVtZW50czogUkVBTDsKICAgICAgRU5EX1ZBUgoKICAgICAgVkFSX09VVFBVVAogICAgICAgICAgUHJvYmFiaWxpdHlEaXN0cmlidXRpb246IFJFQUw7CiAgICAgICAgICBQcm9iYWJpbGl0eUFjY2VzczogUkVBTDsKICAgICAgRU5EX1ZBUgoKICAgICAgRlVaWklGWSBUaW1lRGF5CiAgICAgICAgICBURVJNIGluc2lkZSA6PSAoMCwgMCkgKDgsIDEpICgyMiwwKTsKICAgICAgICAgIFRFUk0gb3V0c2lkZSA6PSAoMCwgMSkgKDgsIDApICgyMiwgMSk7CiAgICAgIEVORF9GVVpaSUZZCgogICAgICBGVVpaSUZZIEFwcGxpY2F0ZUhvc3QKICAgICAgICAgIFRFUk0gZmV3IDo9ICgwLCAxKSAoMTAwLCAwKSAoMjAwLCAwKTsKICAgICAgICAgIFRFUk0gbWFueSA6PSAoMCwgMCkgKDEwMCwgMCkgKDIwMCwgMSk7CiAgICAgIEVORF9GVVpaSUZZCgogICAgICBGVVpaSUZZIFRpbWVDb25maWd1cmF0aW9uCiAgICAgICAgICBURVJNIHJlY2VudGx5IDo9ICgwLCAxKSAoMzAsIDEpICgxMjAsIDApOwogICAgICAgICAgVEVSTSBsb25nIDo9ICgwLCAwKSAoMzAsIDApICgxMjAsIDEpOwogICAgICBFTkRfRlVaWklGWQoKICAgICAgRlVaWklGWSBUaW1lUmVxdWlyZW1lbnRzCiAgICAgICAgICBURVJNIHJlY2VudGx5IDo9ICgwLCAxKSAoMzAsIDEpICgzNjUsIDApOwogICAgICAgICAgVEVSTSBsb25nIDo9ICgwLCAwKSAoMzAsIDApICgzNjUsIDEpOwogICAgICBFTkRfRlVaWklGWQoKICAgICAgREVGVVpaSUZZIFByb2JhYmlsaXR5QWNjZXNzCiAgICAgICAgICBURVJNIGhpZ2h0IDo9IDE7CiAgICAgICAgICBURVJNIG1lZGl1bSA6PSAwLjU7CiAgICAgICAgICBURVJNIGxvdyA6PSAwOwogICAgICAgICAgQUNDVTogTUFYOwogICAgICAgICAgTUVUSE9EOiBDT0dTOwogICAgICAgICAgREVGQVVMVCA6PSAwOwogICAgICBFTkRfREVGVVpaSUZZCgogICAgICBERUZVWlpJRlkgUHJvYmFiaWxpdHlEaXN0cmlidXRpb24KICAgICAgICAgIFRFUk0gaGlnaHQgOj0gMTsKICAgICAgICAgIFRFUk0gbWVkaXVtIDo9IDAuNTsKICAgICAgICAgIFRFUk0gbG93IDo9IDA7CiAgICAgICAgICBBQ0NVOiBNQVg7CiAgICAgICAgICBNRVRIT0Q6IENPR1M7CiAgICAgICAgICBERUZBVUxUIDo9IDA7CiAgICAgIEVORF9ERUZVWlpJRlkKCiAgICAgIFJVTEVCTE9DSyBObzEKICAgICAgICAgIEFORCA6IE1JTjsKICAgICAgICAgIFJVTEUgMSA6IElGIFRpbWVEYXkgSVMgb3V0c2lkZSBBTkQgQXBwbGljYXRlSG9zdCBJUyBmZXcgVEhFTiBQcm9iYWJpbGl0eUFjY2VzcyBJUyBoaWdodDsKICAgICAgICAgIFJVTEUgMiA6IElGIEFwcGxpY2F0ZUhvc3QgSVMgbWFueSBUSEVOIFByb2JhYmlsaXR5QWNjZXNzIElTIGhpZ2h0OwogICAgICAgICAgUlVMRSAzIDogSUYgVGltZURheSBJUyBpbnNpZGUgQU5EIEFwcGxpY2F0ZUhvc3QgSVMgZmV3IFRIRU4gUHJvYmFiaWxpdHlBY2Nlc3MgSVMgbG93OwogICAgICBFTkRfUlVMRUJMT0NLCgogICAgICBSVUxFQkxPQ0sgTm8yCiAgICAgICAgICBBTkQgOiBNSU47CiAgICAgICAgICBSVUxFIDEgOiBJRiBBcHBsaWNhdGVIb3N0IElTIG1hbnkgVEhFTiBQcm9iYWJpbGl0eURpc3RyaWJ1dGlvbiBJUyBoaWdodDsKICAgICAgRU5EX1JVTEVCTE9DSwoKICBFTkRfRlVOQ1RJT05fQkxPQ0sKPC90ZXh0YXJlYT48L2Zvcm0+CgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICB0aGVtZTogImVsZWdhbnQiLAogICAgICAgIG1hdGNoQnJhY2tldHM6IHRydWUsCiAgICAgICAgaW5kZW50VW5pdDogOCwKICAgICAgICB0YWJTaXplOiA4LAogICAgICAgIGluZGVudFdpdGhUYWJzOiB0cnVlLAogICAgICAgIG1vZGU6ICJ0ZXh0L3gtZmNsIgogICAgICB9KTsKICAgIDwvc2NyaXB0PgoKICAgIDxwPjxzdHJvbmc+TUlNRSB0eXBlOjwvc3Ryb25nPiA8Y29kZT50ZXh0L3gtZmNsPC9jb2RlPjwvcD4KICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/forth/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/forth/forth.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovLyBBdXRob3I6IEFsaWFrc2VpIENoYXB5emhlbmthCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CgogIGZ1bmN0aW9uIHRvV29yZExpc3Qod29yZHMpIHsKICAgIHZhciByZXQgPSBbXTsKICAgIHdvcmRzLnNwbGl0KCcgJykuZm9yRWFjaChmdW5jdGlvbihlKXsKICAgICAgcmV0LnB1c2goe25hbWU6IGV9KTsKICAgIH0pOwogICAgcmV0dXJuIHJldDsKICB9CgogIHZhciBjb3JlV29yZExpc3QgPSB0b1dvcmRMaXN0KAonSU5WRVJUIEFORCBPUiBYT1JcCiAyKiAyLyBMU0hJRlQgUlNISUZUXAogMD0gPSAwPCA8ID4gVTwgTUlOIE1BWFwKIDJEUk9QIDJEVVAgMk9WRVIgMlNXQVAgP0RVUCBERVBUSCBEUk9QIERVUCBPVkVSIFJPVCBTV0FQXAogPlIgUj4gUkBcCiArIC0gMSsgMS0gQUJTIE5FR0FURVwKIFM+RCAqIE0qIFVNKlwKIEZNL01PRCBTTS9SRU0gVU0vTU9EICovICovTU9EIC8gL01PRCBNT0RcCiBIRVJFICwgQCAhIENFTEwrIENFTExTIEMsIENAIEMhIENIQVJTIDJAIDIhXAogQUxJR04gQUxJR05FRCArISBBTExPVFwKIENIQVIgW0NIQVJdIFsgXSBCTFwKIEZJTkQgRVhFQ1VURSBJTU1FRElBVEUgQ09VTlQgTElURVJBTCBTVEFURVwKIDsgRE9FUz4gPkJPRFlcCiBFVkFMVUFURVwKIFNPVVJDRSA+SU5cCiA8IyAjICNTICM+IEhPTEQgU0lHTiBCQVNFID5OVU1CRVIgSEVYIERFQ0lNQUxcCiBGSUxMIE1PVkVcCiAuIENSIEVNSVQgU1BBQ0UgU1BBQ0VTIFRZUEUgVS4gLlIgVS5SXAogQUNDRVBUXAogVFJVRSBGQUxTRVwKIDw+IFU+IDA8PiAwPlwKIE5JUCBUVUNLIFJPTEwgUElDS1wKIDI+UiAyUkAgMlI+XAogV0lUSElOIFVOVVNFRCBNQVJLRVJcCiBJIEpcCiBUT1wKIENPTVBJTEUsIFtDT01QSUxFXVwKIFNBVkUtSU5QVVQgUkVTVE9SRS1JTlBVVFwKIFBBRCBFUkFTRVwKIDJMSVRFUkFMIERORUdBVEVcCiBELSBEKyBEMDwgRDA9IEQyKiBEMi8gRDwgRD0gRE1BWCBETUlOIEQ+UyBEQUJTXAogTSsgTSovIEQuIEQuUiAyUk9UIERVPFwKIENBVENIIFRIUk9XXAogRlJFRSBSRVNJWkUgQUxMT0NBVEVcCiBDUy1QSUNLIENTLVJPTExcCiBHRVQtQ1VSUkVOVCBTRVQtQ1VSUkVOVCBGT1JUSC1XT1JETElTVCBHRVQtT1JERVIgU0VULU9SREVSXAogUFJFVklPVVMgU0VBUkNILVdPUkRMSVNUIFdPUkRMSVNUIEZJTkQgQUxTTyBPTkxZIEZPUlRIIERFRklOSVRJT05TIE9SREVSXAogLVRSQUlMSU5HIC9TVFJJTkcgU0VBUkNIIENPTVBBUkUgQ01PVkUgQ01PVkU+IEJMQU5LIFNMSVRFUkFMJyk7CgogIHZhciBpbW1lZGlhdGVXb3JkTGlzdCA9IHRvV29yZExpc3QoJ0lGIEVMU0UgVEhFTiBCRUdJTiBXSElMRSBSRVBFQVQgVU5USUwgUkVDVVJTRSBbSUZdIFtFTFNFXSBbVEhFTl0gP0RPIERPIExPT1AgK0xPT1AgVU5MT09QIExFQVZFIEVYSVQgQUdBSU4gQ0FTRSBPRiBFTkRPRiBFTkRDQVNFJyk7CgogIENvZGVNaXJyb3IuZGVmaW5lTW9kZSgnZm9ydGgnLCBmdW5jdGlvbigpIHsKICAgIGZ1bmN0aW9uIHNlYXJjaFdvcmRMaXN0ICh3b3JkTGlzdCwgd29yZCkgewogICAgICB2YXIgaTsKICAgICAgZm9yIChpID0gd29yZExpc3QubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICBpZiAod29yZExpc3RbaV0ubmFtZSA9PT0gd29yZC50b1VwcGVyQ2FzZSgpKSB7CiAgICAgICAgICByZXR1cm4gd29yZExpc3RbaV07CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICB9CiAgcmV0dXJuIHsKICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gewogICAgICAgIHN0YXRlOiAnJywKICAgICAgICBiYXNlOiAxMCwKICAgICAgICBjb3JlV29yZExpc3Q6IGNvcmVXb3JkTGlzdCwKICAgICAgICBpbW1lZGlhdGVXb3JkTGlzdDogaW1tZWRpYXRlV29yZExpc3QsCiAgICAgICAgd29yZExpc3Q6IFtdCiAgICAgIH07CiAgICB9LAogICAgdG9rZW46IGZ1bmN0aW9uIChzdHJlYW0sIHN0dCkgewogICAgICB2YXIgbWF0OwogICAgICBpZiAoc3RyZWFtLmVhdFNwYWNlKCkpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBpZiAoc3R0LnN0YXRlID09PSAnJykgeyAvLyBpbnRlcnByZXRhdGlvbgogICAgICAgIGlmIChzdHJlYW0ubWF0Y2goL14oXF18Ok5PTkFNRSkoXHN8JCkvaSkpIHsKICAgICAgICAgIHN0dC5zdGF0ZSA9ICcgY29tcGlsYXRpb24nOwogICAgICAgICAgcmV0dXJuICdidWlsdGluIGNvbXBpbGF0aW9uJzsKICAgICAgICB9CiAgICAgICAgbWF0ID0gc3RyZWFtLm1hdGNoKC9eKFw6KVxzKyhcUyspKFxzfCQpKy8pOwogICAgICAgIGlmIChtYXQpIHsKICAgICAgICAgIHN0dC53b3JkTGlzdC5wdXNoKHtuYW1lOiBtYXRbMl0udG9VcHBlckNhc2UoKX0pOwogICAgICAgICAgc3R0LnN0YXRlID0gJyBjb21waWxhdGlvbic7CiAgICAgICAgICByZXR1cm4gJ2RlZicgKyBzdHQuc3RhdGU7CiAgICAgICAgfQogICAgICAgIG1hdCA9IHN0cmVhbS5tYXRjaCgvXihWQVJJQUJMRXwyVkFSSUFCTEV8Q09OU1RBTlR8MkNPTlNUQU5UfENSRUFURXxQT1NUUE9ORXxWQUxVRXxXT1JEKVxzKyhcUyspKFxzfCQpKy9pKTsKICAgICAgICBpZiAobWF0KSB7CiAgICAgICAgICBzdHQud29yZExpc3QucHVzaCh7bmFtZTogbWF0WzJdLnRvVXBwZXJDYXNlKCl9KTsKICAgICAgICAgIHJldHVybiAnZGVmJyArIHN0dC5zdGF0ZTsKICAgICAgICB9CiAgICAgICAgbWF0ID0gc3RyZWFtLm1hdGNoKC9eKFwnfFxbXCdcXSlccysoXFMrKShcc3wkKSsvKTsKICAgICAgICBpZiAobWF0KSB7CiAgICAgICAgICByZXR1cm4gJ2J1aWx0aW4nICsgc3R0LnN0YXRlOwogICAgICAgIH0KICAgICAgICB9IGVsc2UgeyAvLyBjb21waWxhdGlvbgogICAgICAgIC8vIDsgWwogICAgICAgIGlmIChzdHJlYW0ubWF0Y2goL14oXDt8XFspKFxzKS8pKSB7CiAgICAgICAgICBzdHQuc3RhdGUgPSAnJzsKICAgICAgICAgIHN0cmVhbS5iYWNrVXAoMSk7CiAgICAgICAgICByZXR1cm4gJ2J1aWx0aW4gY29tcGlsYXRpb24nOwogICAgICAgIH0KICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eKFw7fFxbKSgkKS8pKSB7CiAgICAgICAgICBzdHQuc3RhdGUgPSAnJzsKICAgICAgICAgIHJldHVybiAnYnVpbHRpbiBjb21waWxhdGlvbic7CiAgICAgICAgfQogICAgICAgIGlmIChzdHJlYW0ubWF0Y2goL14oUE9TVFBPTkUpXHMrXFMrKFxzfCQpKy8pKSB7CiAgICAgICAgICByZXR1cm4gJ2J1aWx0aW4nOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gZHluYW1pYyB3b3JkbGlzdAogICAgICBtYXQgPSBzdHJlYW0ubWF0Y2goL14oXFMrKShccyt8JCkvKTsKICAgICAgaWYgKG1hdCkgewogICAgICAgIGlmIChzZWFyY2hXb3JkTGlzdChzdHQud29yZExpc3QsIG1hdFsxXSkgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgcmV0dXJuICd2YXJpYWJsZScgKyBzdHQuc3RhdGU7CiAgICAgICAgfQoKICAgICAgICAvLyBjb21tZW50cwogICAgICAgIGlmIChtYXRbMV0gPT09ICdcXCcpIHsKICAgICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgICAgICAgcmV0dXJuICdjb21tZW50JyArIHN0dC5zdGF0ZTsKICAgICAgICAgIH0KCiAgICAgICAgICAvLyBjb3JlIHdvcmRzCiAgICAgICAgICBpZiAoc2VhcmNoV29yZExpc3Qoc3R0LmNvcmVXb3JkTGlzdCwgbWF0WzFdKSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIHJldHVybiAnYnVpbHRpbicgKyBzdHQuc3RhdGU7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoc2VhcmNoV29yZExpc3Qoc3R0LmltbWVkaWF0ZVdvcmRMaXN0LCBtYXRbMV0pICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgcmV0dXJuICdrZXl3b3JkJyArIHN0dC5zdGF0ZTsKICAgICAgICAgIH0KCiAgICAgICAgICBpZiAobWF0WzFdID09PSAnKCcpIHsKICAgICAgICAgICAgc3RyZWFtLmVhdFdoaWxlKGZ1bmN0aW9uIChzKSB7IHJldHVybiBzICE9PSAnKSc7IH0pOwogICAgICAgICAgICBzdHJlYW0uZWF0KCcpJyk7CiAgICAgICAgICAgIHJldHVybiAnY29tbWVudCcgKyBzdHQuc3RhdGU7CiAgICAgICAgICB9CgogICAgICAgICAgLy8gLy8gc3RyaW5ncwogICAgICAgICAgaWYgKG1hdFsxXSA9PT0gJy4oJykgewogICAgICAgICAgICBzdHJlYW0uZWF0V2hpbGUoZnVuY3Rpb24gKHMpIHsgcmV0dXJuIHMgIT09ICcpJzsgfSk7CiAgICAgICAgICAgIHN0cmVhbS5lYXQoJyknKTsKICAgICAgICAgICAgcmV0dXJuICdzdHJpbmcnICsgc3R0LnN0YXRlOwogICAgICAgICAgfQogICAgICAgICAgaWYgKG1hdFsxXSA9PT0gJ1MiJyB8fCBtYXRbMV0gPT09ICcuIicgfHwgbWF0WzFdID09PSAnQyInKSB7CiAgICAgICAgICAgIHN0cmVhbS5lYXRXaGlsZShmdW5jdGlvbiAocykgeyByZXR1cm4gcyAhPT0gJyInOyB9KTsKICAgICAgICAgICAgc3RyZWFtLmVhdCgnIicpOwogICAgICAgICAgICByZXR1cm4gJ3N0cmluZycgKyBzdHQuc3RhdGU7CiAgICAgICAgICB9CgogICAgICAgICAgLy8gbnVtYmVycwogICAgICAgICAgaWYgKG1hdFsxXSAtIDB4ZmZmZmZmZmZmKSB7CiAgICAgICAgICAgIHJldHVybiAnbnVtYmVyJyArIHN0dC5zdGF0ZTsKICAgICAgICAgIH0KICAgICAgICAgIC8vIGlmIChtYXRbMV0ubWF0Y2goL15bLStdP1swLTldK1wuWzAtOV0qLykpIHsKICAgICAgICAgIC8vICAgICByZXR1cm4gJ251bWJlcicgKyBzdHQuc3RhdGU7CiAgICAgICAgICAvLyB9CgogICAgICAgICAgcmV0dXJuICdhdG9tJyArIHN0dC5zdGF0ZTsKICAgICAgICB9CiAgICAgIH0KICAgIH07CiAgfSk7CiAgQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtZm9ydGgiLCAiZm9ydGgiKTsKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/forth/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogRm9ydGggbW9kZTwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uLy4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayBocmVmPSdodHRwOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzP2ZhbWlseT1Ecm9pZCtTYW5zK01vbm8nIHJlbD0nc3R5bGVzaGVldCcgdHlwZT0ndGV4dC9jc3MnPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uLy4uL3RoZW1lL2NvbG9yZm9ydGguY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9ImZvcnRoLmpzIj48L3NjcmlwdD4KPHN0eWxlPgouQ29kZU1pcnJvciB7CiAgICBmb250LWZhbWlseTogJ0Ryb2lkIFNhbnMgTW9ubycsIG1vbm9zcGFjZTsKICAgIGZvbnQtc2l6ZTogMTRweDsKfQo8L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxoMT5Db2RlTWlycm9yPC9oMT48aW1nIGlkPWxvZ28gc3JjPSIuLi8uLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5MYW5ndWFnZSBtb2RlczwvYT4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+Rm9ydGg8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KCjxoMj5Gb3J0aCBtb2RlPC9oMj4KCjxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+ClwgSW5zZXJ0aW9uIHNvcnQKCjogY2VsbC0gIDEgY2VsbHMgLSA7Cgo6IGluc2VydCAoIHN0YXJ0IGVuZCAtLSBzdGFydCApCiAgZHVwIEAgPnIgKCByOiB2ICkKICBiZWdpbgogICAgMmR1cCA8CiAgd2hpbGUKICAgIHJAIG92ZXIgY2VsbC0gQCA8CiAgd2hpbGUKICAgIGNlbGwtCiAgICBkdXAgQCBvdmVyIGNlbGwrICEKICByZXBlYXQgdGhlbgogIHI+IHN3YXAgISA7Cgo6IHNvcnQgKCBhcnJheSBsZW4gLS0gKQogIDEgP2RvCiAgICBkdXAgaSBjZWxscyArIGluc2VydAogIGxvb3AgZHJvcCA7PC90ZXh0YXJlYT4KICA8L2Zvcm0+Cgo8c2NyaXB0PgogIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgIGxpbmVXcmFwcGluZzogdHJ1ZSwKICAgIGluZGVudFVuaXQ6IDIsCiAgICB0YWJTaXplOiAyLAogICAgYXV0b2ZvY3VzOiB0cnVlLAogICAgdGhlbWU6ICJjb2xvcmZvcnRoIiwKICAgIG1vZGU6ICJ0ZXh0L3gtZm9ydGgiCiAgfSk7Cjwvc2NyaXB0PgoKPHA+U2ltcGxlIG1vZGUgdGhhdCBoYW5kbGUgRm9ydGgtU3ludGF4ICg8YSBocmVmPSJodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0ZvcnRoXyUyOHByb2dyYW1taW5nX2xhbmd1YWdlJTI5Ij5Gb3J0aCBvbiBXaWtpUGVkaWE8L2E+KS48L3A+Cgo8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC94LWZvcnRoPC9jb2RlPi48L3A+Cgo8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/fortran/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/fortran/fortran.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJmb3J0cmFuIiwgZnVuY3Rpb24oKSB7CiAgZnVuY3Rpb24gd29yZHMoYXJyYXkpIHsKICAgIHZhciBrZXlzID0ge307CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFycmF5Lmxlbmd0aDsgKytpKSB7CiAgICAgIGtleXNbYXJyYXlbaV1dID0gdHJ1ZTsKICAgIH0KICAgIHJldHVybiBrZXlzOwogIH0KCiAgdmFyIGtleXdvcmRzID0gd29yZHMoWwogICAgICAgICAgICAgICAgICAiYWJzdHJhY3QiLCAiYWNjZXB0IiwgImFsbG9jYXRhYmxlIiwgImFsbG9jYXRlIiwKICAgICAgICAgICAgICAgICAgImFycmF5IiwgImFzc2lnbiIsICJhc3luY2hyb25vdXMiLCAiYmFja3NwYWNlIiwKICAgICAgICAgICAgICAgICAgImJpbmQiLCAiYmxvY2siLCAiYnl0ZSIsICJjYWxsIiwgImNhc2UiLAogICAgICAgICAgICAgICAgICAiY2xhc3MiLCAiY2xvc2UiLCAiY29tbW9uIiwgImNvbnRhaW5zIiwKICAgICAgICAgICAgICAgICAgImNvbnRpbnVlIiwgImN5Y2xlIiwgImRhdGEiLCAiZGVhbGxvY2F0ZSIsCiAgICAgICAgICAgICAgICAgICJkZWNvZGUiLCAiZGVmZXJyZWQiLCAiZGltZW5zaW9uIiwgImRvIiwKICAgICAgICAgICAgICAgICAgImVsZW1lbnRhbCIsICJlbHNlIiwgImVuY29kZSIsICJlbmQiLAogICAgICAgICAgICAgICAgICAiZW5kaWYiLCAiZW50cnkiLCAiZW51bWVyYXRvciIsICJlcXVpdmFsZW5jZSIsCiAgICAgICAgICAgICAgICAgICJleGl0IiwgImV4dGVybmFsIiwgImV4dHJpbnNpYyIsICJmaW5hbCIsCiAgICAgICAgICAgICAgICAgICJmb3JhbGwiLCAiZm9ybWF0IiwgImZ1bmN0aW9uIiwgImdlbmVyaWMiLAogICAgICAgICAgICAgICAgICAiZ28iLCAiZ290byIsICJpZiIsICJpbXBsaWNpdCIsICJpbXBvcnQiLCAiaW5jbHVkZSIsCiAgICAgICAgICAgICAgICAgICJpbnF1aXJlIiwgImludGVudCIsICJpbnRlcmZhY2UiLCAiaW50cmluc2ljIiwKICAgICAgICAgICAgICAgICAgIm1vZHVsZSIsICJuYW1lbGlzdCIsICJub25faW50cmluc2ljIiwKICAgICAgICAgICAgICAgICAgIm5vbl9vdmVycmlkYWJsZSIsICJub25lIiwgIm5vcGFzcyIsCiAgICAgICAgICAgICAgICAgICJudWxsaWZ5IiwgIm9wZW4iLCAib3B0aW9uYWwiLCAib3B0aW9ucyIsCiAgICAgICAgICAgICAgICAgICJwYXJhbWV0ZXIiLCAicGFzcyIsICJwYXVzZSIsICJwb2ludGVyIiwKICAgICAgICAgICAgICAgICAgInByaW50IiwgInByaXZhdGUiLCAicHJvZ3JhbSIsICJwcm90ZWN0ZWQiLAogICAgICAgICAgICAgICAgICAicHVibGljIiwgInB1cmUiLCAicmVhZCIsICJyZWN1cnNpdmUiLCAicmVzdWx0IiwKICAgICAgICAgICAgICAgICAgInJldHVybiIsICJyZXdpbmQiLCAic2F2ZSIsICJzZWxlY3QiLCAic2VxdWVuY2UiLAogICAgICAgICAgICAgICAgICAic3RvcCIsICJzdWJyb3V0aW5lIiwgInRhcmdldCIsICJ0aGVuIiwgInRvIiwgInR5cGUiLAogICAgICAgICAgICAgICAgICAidXNlIiwgInZhbHVlIiwgInZvbGF0aWxlIiwgIndoZXJlIiwgIndoaWxlIiwKICAgICAgICAgICAgICAgICAgIndyaXRlIl0pOwogIHZhciBidWlsdGlucyA9IHdvcmRzKFsiYWJvcnQiLCAiYWJzIiwgImFjY2VzcyIsICJhY2hhciIsICJhY29zIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRqdXN0bCIsICJhZGp1c3RyIiwgImFpbWFnIiwgImFpbnQiLCAiYWxhcm0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICJhbGwiLCAiYWxsb2NhdGVkIiwgImFsb2ciLCAiYW1heCIsICJhbWluIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAiYW1vZCIsICJhbmQiLCAiYW5pbnQiLCAiYW55IiwgImFzaW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICJhc3NvY2lhdGVkIiwgImF0YW4iLCAiYmVzaiIsICJiZXNqbiIsICJiZXN5IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAiYmVzeW4iLCAiYml0X3NpemUiLCAiYnRlc3QiLCAiY2FicyIsICJjY29zIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAiY2VpbGluZyIsICJjZXhwIiwgImNoYXIiLCAiY2hkaXIiLCAiY2htb2QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJjbG9nIiwgImNtcGx4IiwgImNvbW1hbmRfYXJndW1lbnRfY291bnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJjb21wbGV4IiwgImNvbmpnIiwgImNvcyIsICJjb3NoIiwgImNvdW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAiY3B1X3RpbWUiLCAiY3NoaWZ0IiwgImNzaW4iLCAiY3NxcnQiLCAiY3RpbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJjX2Z1bmxvYyIsICJjX2xvYyIsICJjX2Fzc29jaWF0ZWQiLCAiY19udWxsX3B0ciIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgImNfbnVsbF9mdW5wdHIiLCAiY19mX3BvaW50ZXIiLCAiY19udWxsX2NoYXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJjX2FsZXJ0IiwgImNfYmFja3NwYWNlIiwgImNfZm9ybV9mZWVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAiY19uZXdfbGluZSIsICJjX2NhcnJpYWdlX3JldHVybiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgImNfaG9yaXpvbnRhbF90YWIiLCAiY192ZXJ0aWNhbF90YWIiLCAiZGFicyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgImRhY29zIiwgImRhc2luIiwgImRhdGFuIiwgImRhdGVfYW5kX3RpbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJkYmVzaiIsICJkYmVzaiIsICJkYmVzam4iLCAiZGJlc3kiLCAiZGJlc3kiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJkYmVzeW4iLCAiZGJsZSIsICJkY29zIiwgImRjb3NoIiwgImRkaW0iLCAiZGVyZiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgImRlcmZjIiwgImRleHAiLCAiZGlnaXRzIiwgImRpbSIsICJkaW50IiwgImRsb2ciLAogICAgICAgICAgICAgICAgICAgICAgICAgICJkbG9nIiwgImRtYXgiLCAiZG1pbiIsICJkbW9kIiwgImRuaW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAiZG90X3Byb2R1Y3QiLCAiZHByb2QiLCAiZHNpZ24iLCAiZHNpbmgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJkc2luIiwgImRzcXJ0IiwgImR0YW5oIiwgImR0YW4iLCAiZHRpbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJlb3NoaWZ0IiwgImVwc2lsb24iLCAiZXJmIiwgImVyZmMiLCAiZXRpbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJleGl0IiwgImV4cCIsICJleHBvbmVudCIsICJleHRlbmRzX3R5cGVfb2YiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJmZGF0ZSIsICJmZ2V0IiwgImZnZXRjIiwgImZsb2F0IiwgImZsb29yIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAiZmx1c2giLCAiZm51bSIsICJmcHV0YyIsICJmcHV0IiwgImZyYWN0aW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAiZnNlZWsiLCAiZnN0YXQiLCAiZnRlbGwiLCAiZ2Vycm9yIiwgImdldGFyZyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgImdldF9jb21tYW5kIiwgImdldF9jb21tYW5kX2FyZ3VtZW50IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAiZ2V0X2Vudmlyb25tZW50X3ZhcmlhYmxlIiwgImdldGN3ZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgImdldGVudiIsICJnZXRnaWQiLCAiZ2V0bG9nIiwgImdldHBpZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgImdldHVpZCIsICJnbXRpbWUiLCAiaG9zdG5tIiwgImh1Z2UiLCAiaWFicyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgImlhY2hhciIsICJpYW5kIiwgImlhcmdjIiwgImliY2xyIiwgImliaXRzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAiaWJzZXQiLCAiaWNoYXIiLCAiaWRhdGUiLCAiaWRpbSIsICJpZGludCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgImlkbmludCIsICJpZW9yIiwgImllcnJubyIsICJpZml4IiwgImltYWciLAogICAgICAgICAgICAgICAgICAgICAgICAgICJpbWFncGFydCIsICJpbmRleCIsICJpbnQiLCAiaW9yIiwgImlyYW5kIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAiaXNhdHR5IiwgImlzaGZ0IiwgImlzaGZ0YyIsICJpc2lnbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgImlzb19jX2JpbmRpbmciLCAiaXNfaW9zdGF0X2VuZCIsICJpc19pb3N0YXRfZW9yIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAiaXRpbWUiLCAia2lsbCIsICJraW5kIiwgImxib3VuZCIsICJsZW4iLCAibGVuX3RyaW0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICJsZ2UiLCAibGd0IiwgImxpbmsiLCAibGxlIiwgImxsdCIsICJsbmJsbmsiLCAibG9jIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAibG9nIiwgImxvZ2ljYWwiLCAibG9uZyIsICJsc2hpZnQiLCAibHN0YXQiLCAibHRpbWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJtYXRtdWwiLCAibWF4IiwgIm1heGV4cG9uZW50IiwgIm1heGxvYyIsICJtYXh2YWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJtY2xvY2siLCAibWVyZ2UiLCAibW92ZV9hbGxvYyIsICJtaW4iLCAibWluZXhwb25lbnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJtaW5sb2MiLCAibWludmFsIiwgIm1vZCIsICJtb2R1bG8iLCAibXZiaXRzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAibmVhcmVzdCIsICJuZXdfbGluZSIsICJuaW50IiwgIm5vdCIsICJvciIsICJwYWNrIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAicGVycm9yIiwgInByZWNpc2lvbiIsICJwcmVzZW50IiwgInByb2R1Y3QiLCAicmFkaXgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJyYW5kIiwgInJhbmRvbV9udW1iZXIiLCAicmFuZG9tX3NlZWQiLCAicmFuZ2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJyZWFsIiwgInJlYWxwYXJ0IiwgInJlbmFtZSIsICJyZXBlYXQiLCAicmVzaGFwZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgInJyc3BhY2luZyIsICJyc2hpZnQiLCAic2FtZV90eXBlX2FzIiwgInNjYWxlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAic2NhbiIsICJzZWNvbmQiLCAic2VsZWN0ZWRfaW50X2tpbmQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJzZWxlY3RlZF9yZWFsX2tpbmQiLCAic2V0X2V4cG9uZW50IiwgInNoYXBlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAic2hvcnQiLCAic2lnbiIsICJzaWduYWwiLCAic2luaCIsICJzaW4iLCAic2xlZXAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJzbmdsIiwgInNwYWNpbmciLCAic3ByZWFkIiwgInNxcnQiLCAic3JhbmQiLCAic3RhdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgInN1bSIsICJzeW1sbmsiLCAic3lzdGVtIiwgInN5c3RlbV9jbG9jayIsICJ0YW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICJ0YW5oIiwgInRpbWUiLCAidGlueSIsICJ0cmFuc2ZlciIsICJ0cmFuc3Bvc2UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJ0cmltIiwgInR0eW5hbSIsICJ1Ym91bmQiLCAidW1hc2siLCAidW5saW5rIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAidW5wYWNrIiwgInZlcmlmeSIsICJ4b3IiLCAiemFicyIsICJ6Y29zIiwgInpleHAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJ6bG9nIiwgInpzaW4iLCAienNxcnQiXSk7CgogICAgdmFyIGRhdGFUeXBlcyA9ICB3b3JkcyhbImNfYm9vbCIsICJjX2NoYXIiLCAiY19kb3VibGUiLCAiY19kb3VibGVfY29tcGxleCIsCiAgICAgICAgICAgICAgICAgICAgICJjX2Zsb2F0IiwgImNfZmxvYXRfY29tcGxleCIsICJjX2Z1bnB0ciIsICJjX2ludCIsCiAgICAgICAgICAgICAgICAgICAgICJjX2ludDE2X3QiLCAiY19pbnQzMl90IiwgImNfaW50NjRfdCIsICJjX2ludDhfdCIsCiAgICAgICAgICAgICAgICAgICAgICJjX2ludF9mYXN0MTZfdCIsICJjX2ludF9mYXN0MzJfdCIsICJjX2ludF9mYXN0NjRfdCIsCiAgICAgICAgICAgICAgICAgICAgICJjX2ludF9mYXN0OF90IiwgImNfaW50X2xlYXN0MTZfdCIsICJjX2ludF9sZWFzdDMyX3QiLAogICAgICAgICAgICAgICAgICAgICAiY19pbnRfbGVhc3Q2NF90IiwgImNfaW50X2xlYXN0OF90IiwgImNfaW50bWF4X3QiLAogICAgICAgICAgICAgICAgICAgICAiY19pbnRwdHJfdCIsICJjX2xvbmciLCAiY19sb25nX2RvdWJsZSIsCiAgICAgICAgICAgICAgICAgICAgICJjX2xvbmdfZG91YmxlX2NvbXBsZXgiLCAiY19sb25nX2xvbmciLCAiY19wdHIiLAogICAgICAgICAgICAgICAgICAgICAiY19zaG9ydCIsICJjX3NpZ25lZF9jaGFyIiwgImNfc2l6ZV90IiwgImNoYXJhY3RlciIsCiAgICAgICAgICAgICAgICAgICAgICJjb21wbGV4IiwgImRvdWJsZSIsICJpbnRlZ2VyIiwgImxvZ2ljYWwiLCAicmVhbCJdKTsKICB2YXIgaXNPcGVyYXRvckNoYXIgPSAvWytcLSomPTw+XC9cOl0vOwogIHZhciBsaXRPcGVyYXRvciA9IG5ldyBSZWdFeHAoIihcLmFuZFwufFwub3JcLnxcLmVxXC58XC5sdFwufFwubGVcLnxcLmd0XC58XC5nZVwufFwubmVcLnxcLm5vdFwufFwuZXF2XC58XC5uZXF2XC4pIiwgImkiKTsKCiAgZnVuY3Rpb24gdG9rZW5CYXNlKHN0cmVhbSwgc3RhdGUpIHsKCiAgICBpZiAoc3RyZWFtLm1hdGNoKGxpdE9wZXJhdG9yKSl7CiAgICAgICAgcmV0dXJuICdvcGVyYXRvcic7CiAgICB9CgogICAgdmFyIGNoID0gc3RyZWFtLm5leHQoKTsKICAgIGlmIChjaCA9PSAiISIpIHsKICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICByZXR1cm4gImNvbW1lbnQiOwogICAgfQogICAgaWYgKGNoID09ICciJyB8fCBjaCA9PSAiJyIpIHsKICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlblN0cmluZyhjaCk7CiAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgIH0KICAgIGlmICgvW1xbXF1cKFwpLF0vLnRlc3QoY2gpKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgaWYgKC9cZC8udGVzdChjaCkpIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXHdcLl0vKTsKICAgICAgcmV0dXJuICJudW1iZXIiOwogICAgfQogICAgaWYgKGlzT3BlcmF0b3JDaGFyLnRlc3QoY2gpKSB7CiAgICAgIHN0cmVhbS5lYXRXaGlsZShpc09wZXJhdG9yQ2hhcik7CiAgICAgIHJldHVybiAib3BlcmF0b3IiOwogICAgfQogICAgc3RyZWFtLmVhdFdoaWxlKC9bXHdcJF9dLyk7CiAgICB2YXIgd29yZCA9IHN0cmVhbS5jdXJyZW50KCkudG9Mb3dlckNhc2UoKTsKCiAgICBpZiAoa2V5d29yZHMuaGFzT3duUHJvcGVydHkod29yZCkpewogICAgICAgICAgICByZXR1cm4gJ2tleXdvcmQnOwogICAgfQogICAgaWYgKGJ1aWx0aW5zLmhhc093blByb3BlcnR5KHdvcmQpIHx8IGRhdGFUeXBlcy5oYXNPd25Qcm9wZXJ0eSh3b3JkKSkgewogICAgICAgICAgICByZXR1cm4gJ2J1aWx0aW4nOwogICAgfQogICAgcmV0dXJuICJ2YXJpYWJsZSI7CiAgfQoKICBmdW5jdGlvbiB0b2tlblN0cmluZyhxdW90ZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgdmFyIGVzY2FwZWQgPSBmYWxzZSwgbmV4dCwgZW5kID0gZmFsc2U7CiAgICAgIHdoaWxlICgobmV4dCA9IHN0cmVhbS5uZXh0KCkpICE9IG51bGwpIHsKICAgICAgICBpZiAobmV4dCA9PSBxdW90ZSAmJiAhZXNjYXBlZCkgewogICAgICAgICAgICBlbmQgPSB0cnVlOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgZXNjYXBlZCA9ICFlc2NhcGVkICYmIG5leHQgPT0gIlxcIjsKICAgICAgfQogICAgICBpZiAoZW5kIHx8ICFlc2NhcGVkKSBzdGF0ZS50b2tlbml6ZSA9IG51bGw7CiAgICAgIHJldHVybiAic3RyaW5nIjsKICAgIH07CiAgfQoKICAvLyBJbnRlcmZhY2UKCiAgcmV0dXJuIHsKICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4ge3Rva2VuaXplOiBudWxsfTsKICAgIH0sCgogICAgdG9rZW46IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgaWYgKHN0cmVhbS5lYXRTcGFjZSgpKSByZXR1cm4gbnVsbDsKICAgICAgdmFyIHN0eWxlID0gKHN0YXRlLnRva2VuaXplIHx8IHRva2VuQmFzZSkoc3RyZWFtLCBzdGF0ZSk7CiAgICAgIGlmIChzdHlsZSA9PSAiY29tbWVudCIgfHwgc3R5bGUgPT0gIm1ldGEiKSByZXR1cm4gc3R5bGU7CiAgICAgIHJldHVybiBzdHlsZTsKICAgIH0KICB9Owp9KTsKCkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC94LWZvcnRyYW4iLCAiZm9ydHJhbiIpOwoKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/fortran/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogRm9ydHJhbiBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9ImZvcnRyYW4uanMiPjwvc2NyaXB0Pgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPi5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazt9PC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aDE+Q29kZU1pcnJvcjwvaDE+PGltZyBpZD1sb2dvIHNyYz0iLi4vLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+TGFuZ3VhZ2UgbW9kZXM8L2E+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPkZvcnRyYW48L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPkZvcnRyYW4gbW9kZTwvaDI+CgoKPGRpdj48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgohIEV4YW1wbGUgRm9ydHJhbiBjb2RlCiAgcHJvZ3JhbSBhdmVyYWdlCgogICEgUmVhZCBpbiBzb21lIG51bWJlcnMgYW5kIHRha2UgdGhlIGF2ZXJhZ2UKICAhIEFzIHdyaXR0ZW4sIGlmIHRoZXJlIGFyZSBubyBkYXRhIHBvaW50cywgYW4gYXZlcmFnZSBvZiB6ZXJvIGlzIHJldHVybmVkCiAgISBXaGlsZSB0aGlzIG1heSBub3QgYmUgZGVzaXJlZCBiZWhhdmlvciwgaXQga2VlcHMgdGhpcyBleGFtcGxlIHNpbXBsZQoKICBpbXBsaWNpdCBub25lCgogIHJlYWwsIGRpbWVuc2lvbig6KSwgYWxsb2NhdGFibGUgOjogcG9pbnRzCiAgaW50ZWdlciAgICAgICAgICAgICAgICAgICAgICAgICA6OiBudW1iZXJfb2ZfcG9pbnRzCiAgcmVhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OiBhdmVyYWdlX3BvaW50cz0wLiwgcG9zaXRpdmVfYXZlcmFnZT0wLiwgbmVnYXRpdmVfYXZlcmFnZT0wLgoKICB3cml0ZSAoKiwqKSAiSW5wdXQgbnVtYmVyIG9mIHBvaW50cyB0byBhdmVyYWdlOiIKICByZWFkICAoKiwqKSBudW1iZXJfb2ZfcG9pbnRzCgogIGFsbG9jYXRlIChwb2ludHMobnVtYmVyX29mX3BvaW50cykpCgogIHdyaXRlICgqLCopICJFbnRlciB0aGUgcG9pbnRzIHRvIGF2ZXJhZ2U6IgogIHJlYWQgICgqLCopIHBvaW50cwoKICAhIFRha2UgdGhlIGF2ZXJhZ2UgYnkgc3VtbWluZyBwb2ludHMgYW5kIGRpdmlkaW5nIGJ5IG51bWJlcl9vZl9wb2ludHMKICBpZiAobnVtYmVyX29mX3BvaW50cyA+IDApIGF2ZXJhZ2VfcG9pbnRzID0gc3VtKHBvaW50cykgLyBudW1iZXJfb2ZfcG9pbnRzCgogICEgTm93IGZvcm0gYXZlcmFnZSBvdmVyIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBwb2ludHMgb25seQogIGlmIChjb3VudChwb2ludHMgPiAwLikgPiAwKSB0aGVuCiAgICAgcG9zaXRpdmVfYXZlcmFnZSA9IHN1bShwb2ludHMsIHBvaW50cyA+IDAuKSAvIGNvdW50KHBvaW50cyA+IDAuKQogIGVuZCBpZgoKICBpZiAoY291bnQocG9pbnRzIDwgMC4pID4gMCkgdGhlbgogICAgIG5lZ2F0aXZlX2F2ZXJhZ2UgPSBzdW0ocG9pbnRzLCBwb2ludHMgPCAwLikgLyBjb3VudChwb2ludHMgPCAwLikKICBlbmQgaWYKCiAgZGVhbGxvY2F0ZSAocG9pbnRzKQoKICAhIFByaW50IHJlc3VsdCB0byB0ZXJtaW5hbAogIHdyaXRlICgqLCcoYSxnMTIuNCknKSAnQXZlcmFnZSA9ICcsIGF2ZXJhZ2VfcG9pbnRzCiAgd3JpdGUgKCosJyhhLGcxMi40KScpICdBdmVyYWdlIG9mIHBvc2l0aXZlIHBvaW50cyA9ICcsIHBvc2l0aXZlX2F2ZXJhZ2UKICB3cml0ZSAoKiwnKGEsZzEyLjQpJykgJ0F2ZXJhZ2Ugb2YgbmVnYXRpdmUgcG9pbnRzID0gJywgbmVnYXRpdmVfYXZlcmFnZQoKICBlbmQgcHJvZ3JhbSBhdmVyYWdlCjwvdGV4dGFyZWE+PC9kaXY+CgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgICAgICBtb2RlOiAidGV4dC94LWZvcnRyYW4iCiAgICAgIH0pOwogICAgPC9zY3JpcHQ+CgogICAgPHA+PHN0cm9uZz5NSU1FIHR5cGVzIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPnRleHQveC1mb3J0cmFuPC9jb2RlPi48L3A+CiAgPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/gas/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/gas/gas.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJnYXMiLCBmdW5jdGlvbihfY29uZmlnLCBwYXJzZXJDb25maWcpIHsKICAndXNlIHN0cmljdCc7CgogIC8vIElmIGFuIGFyY2hpdGVjdHVyZSBpcyBzcGVjaWZpZWQsIGl0cyBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiBtYXkKICAvLyBwb3B1bGF0ZSB0aGlzIGFycmF5IHdpdGggY3VzdG9tIHBhcnNpbmcgZnVuY3Rpb25zIHdoaWNoIHdpbGwgYmUKICAvLyB0cmllZCBpbiB0aGUgZXZlbnQgdGhhdCB0aGUgc3RhbmRhcmQgZnVuY3Rpb25zIGRvIG5vdCBmaW5kIGEgbWF0Y2guCiAgdmFyIGN1c3RvbSA9IFtdOwoKICAvLyBUaGUgc3ltYm9sIHVzZWQgdG8gc3RhcnQgYSBsaW5lIGNvbW1lbnQgY2hhbmdlcyBiYXNlZCBvbiB0aGUgdGFyZ2V0CiAgLy8gYXJjaGl0ZWN0dXJlLgogIC8vIElmIG5vIGFyY2hpdGVjdHVyZSBpcyBwYXNlZCBpbiAicGFyc2VyQ29uZmlnIiB0aGVuIG9ubHkgbXVsdGlsaW5lCiAgLy8gY29tbWVudHMgd2lsbCBoYXZlIHN5bnRheCBzdXBwb3J0LgogIHZhciBsaW5lQ29tbWVudFN0YXJ0U3ltYm9sID0gIiI7CgogIC8vIFRoZXNlIGRpcmVjdGl2ZXMgYXJlIGFyY2hpdGVjdHVyZSBpbmRlcGVuZGVudC4KICAvLyBNYWNoaW5lIHNwZWNpZmljIGRpcmVjdGl2ZXMgc2hvdWxkIGdvIGluIHRoZWlyIHJlc3BlY3RpdmUKICAvLyBhcmNoaXRlY3R1cmUgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24uCiAgLy8gUmVmZXJlbmNlOgogIC8vIGh0dHA6Ly9zb3VyY2V3YXJlLm9yZy9iaW51dGlscy9kb2NzL2FzL1BzZXVkby1PcHMuaHRtbCNQc2V1ZG8tT3BzCiAgdmFyIGRpcmVjdGl2ZXMgPSB7CiAgICAiLmFib3J0IiA6ICJidWlsdGluIiwKICAgICIuYWxpZ24iIDogImJ1aWx0aW4iLAogICAgIi5hbHRtYWNybyIgOiAiYnVpbHRpbiIsCiAgICAiLmFzY2lpIiA6ICJidWlsdGluIiwKICAgICIuYXNjaXoiIDogImJ1aWx0aW4iLAogICAgIi5iYWxpZ24iIDogImJ1aWx0aW4iLAogICAgIi5iYWxpZ253IiA6ICJidWlsdGluIiwKICAgICIuYmFsaWdubCIgOiAiYnVpbHRpbiIsCiAgICAiLmJ1bmRsZV9hbGlnbl9tb2RlIiA6ICJidWlsdGluIiwKICAgICIuYnVuZGxlX2xvY2siIDogImJ1aWx0aW4iLAogICAgIi5idW5kbGVfdW5sb2NrIiA6ICJidWlsdGluIiwKICAgICIuYnl0ZSIgOiAiYnVpbHRpbiIsCiAgICAiLmNmaV9zdGFydHByb2MiIDogImJ1aWx0aW4iLAogICAgIi5jb21tIiA6ICJidWlsdGluIiwKICAgICIuZGF0YSIgOiAiYnVpbHRpbiIsCiAgICAiLmRlZiIgOiAiYnVpbHRpbiIsCiAgICAiLmRlc2MiIDogImJ1aWx0aW4iLAogICAgIi5kaW0iIDogImJ1aWx0aW4iLAogICAgIi5kb3VibGUiIDogImJ1aWx0aW4iLAogICAgIi5lamVjdCIgOiAiYnVpbHRpbiIsCiAgICAiLmVsc2UiIDogImJ1aWx0aW4iLAogICAgIi5lbHNlaWYiIDogImJ1aWx0aW4iLAogICAgIi5lbmQiIDogImJ1aWx0aW4iLAogICAgIi5lbmRlZiIgOiAiYnVpbHRpbiIsCiAgICAiLmVuZGZ1bmMiIDogImJ1aWx0aW4iLAogICAgIi5lbmRpZiIgOiAiYnVpbHRpbiIsCiAgICAiLmVxdSIgOiAiYnVpbHRpbiIsCiAgICAiLmVxdWl2IiA6ICJidWlsdGluIiwKICAgICIuZXF2IiA6ICJidWlsdGluIiwKICAgICIuZXJyIiA6ICJidWlsdGluIiwKICAgICIuZXJyb3IiIDogImJ1aWx0aW4iLAogICAgIi5leGl0bSIgOiAiYnVpbHRpbiIsCiAgICAiLmV4dGVybiIgOiAiYnVpbHRpbiIsCiAgICAiLmZhaWwiIDogImJ1aWx0aW4iLAogICAgIi5maWxlIiA6ICJidWlsdGluIiwKICAgICIuZmlsbCIgOiAiYnVpbHRpbiIsCiAgICAiLmZsb2F0IiA6ICJidWlsdGluIiwKICAgICIuZnVuYyIgOiAiYnVpbHRpbiIsCiAgICAiLmdsb2JhbCIgOiAiYnVpbHRpbiIsCiAgICAiLmdudV9hdHRyaWJ1dGUiIDogImJ1aWx0aW4iLAogICAgIi5oaWRkZW4iIDogImJ1aWx0aW4iLAogICAgIi5od29yZCIgOiAiYnVpbHRpbiIsCiAgICAiLmlkZW50IiA6ICJidWlsdGluIiwKICAgICIuaWYiIDogImJ1aWx0aW4iLAogICAgIi5pbmNiaW4iIDogImJ1aWx0aW4iLAogICAgIi5pbmNsdWRlIiA6ICJidWlsdGluIiwKICAgICIuaW50IiA6ICJidWlsdGluIiwKICAgICIuaW50ZXJuYWwiIDogImJ1aWx0aW4iLAogICAgIi5pcnAiIDogImJ1aWx0aW4iLAogICAgIi5pcnBjIiA6ICJidWlsdGluIiwKICAgICIubGNvbW0iIDogImJ1aWx0aW4iLAogICAgIi5sZmxhZ3MiIDogImJ1aWx0aW4iLAogICAgIi5saW5lIiA6ICJidWlsdGluIiwKICAgICIubGlua29uY2UiIDogImJ1aWx0aW4iLAogICAgIi5saXN0IiA6ICJidWlsdGluIiwKICAgICIubG4iIDogImJ1aWx0aW4iLAogICAgIi5sb2MiIDogImJ1aWx0aW4iLAogICAgIi5sb2NfbWFya19sYWJlbHMiIDogImJ1aWx0aW4iLAogICAgIi5sb2NhbCIgOiAiYnVpbHRpbiIsCiAgICAiLmxvbmciIDogImJ1aWx0aW4iLAogICAgIi5tYWNybyIgOiAiYnVpbHRpbiIsCiAgICAiLm1yaSIgOiAiYnVpbHRpbiIsCiAgICAiLm5vYWx0bWFjcm8iIDogImJ1aWx0aW4iLAogICAgIi5ub2xpc3QiIDogImJ1aWx0aW4iLAogICAgIi5vY3RhIiA6ICJidWlsdGluIiwKICAgICIub2Zmc2V0IiA6ICJidWlsdGluIiwKICAgICIub3JnIiA6ICJidWlsdGluIiwKICAgICIucDJhbGlnbiIgOiAiYnVpbHRpbiIsCiAgICAiLnBvcHNlY3Rpb24iIDogImJ1aWx0aW4iLAogICAgIi5wcmV2aW91cyIgOiAiYnVpbHRpbiIsCiAgICAiLnByaW50IiA6ICJidWlsdGluIiwKICAgICIucHJvdGVjdGVkIiA6ICJidWlsdGluIiwKICAgICIucHNpemUiIDogImJ1aWx0aW4iLAogICAgIi5wdXJnZW0iIDogImJ1aWx0aW4iLAogICAgIi5wdXNoc2VjdGlvbiIgOiAiYnVpbHRpbiIsCiAgICAiLnF1YWQiIDogImJ1aWx0aW4iLAogICAgIi5yZWxvYyIgOiAiYnVpbHRpbiIsCiAgICAiLnJlcHQiIDogImJ1aWx0aW4iLAogICAgIi5zYnR0bCIgOiAiYnVpbHRpbiIsCiAgICAiLnNjbCIgOiAiYnVpbHRpbiIsCiAgICAiLnNlY3Rpb24iIDogImJ1aWx0aW4iLAogICAgIi5zZXQiIDogImJ1aWx0aW4iLAogICAgIi5zaG9ydCIgOiAiYnVpbHRpbiIsCiAgICAiLnNpbmdsZSIgOiAiYnVpbHRpbiIsCiAgICAiLnNpemUiIDogImJ1aWx0aW4iLAogICAgIi5za2lwIiA6ICJidWlsdGluIiwKICAgICIuc2xlYjEyOCIgOiAiYnVpbHRpbiIsCiAgICAiLnNwYWNlIiA6ICJidWlsdGluIiwKICAgICIuc3RhYiIgOiAiYnVpbHRpbiIsCiAgICAiLnN0cmluZyIgOiAiYnVpbHRpbiIsCiAgICAiLnN0cnVjdCIgOiAiYnVpbHRpbiIsCiAgICAiLnN1YnNlY3Rpb24iIDogImJ1aWx0aW4iLAogICAgIi5zeW12ZXIiIDogImJ1aWx0aW4iLAogICAgIi50YWciIDogImJ1aWx0aW4iLAogICAgIi50ZXh0IiA6ICJidWlsdGluIiwKICAgICIudGl0bGUiIDogImJ1aWx0aW4iLAogICAgIi50eXBlIiA6ICJidWlsdGluIiwKICAgICIudWxlYjEyOCIgOiAiYnVpbHRpbiIsCiAgICAiLnZhbCIgOiAiYnVpbHRpbiIsCiAgICAiLnZlcnNpb24iIDogImJ1aWx0aW4iLAogICAgIi52dGFibGVfZW50cnkiIDogImJ1aWx0aW4iLAogICAgIi52dGFibGVfaW5oZXJpdCIgOiAiYnVpbHRpbiIsCiAgICAiLndhcm5pbmciIDogImJ1aWx0aW4iLAogICAgIi53ZWFrIiA6ICJidWlsdGluIiwKICAgICIud2Vha3JlZiIgOiAiYnVpbHRpbiIsCiAgICAiLndvcmQiIDogImJ1aWx0aW4iCiAgfTsKCiAgdmFyIHJlZ2lzdGVycyA9IHt9OwoKICBmdW5jdGlvbiB4ODYoX3BhcnNlckNvbmZpZykgewogICAgbGluZUNvbW1lbnRTdGFydFN5bWJvbCA9ICIjIjsKCiAgICByZWdpc3RlcnMuYXggID0gInZhcmlhYmxlIjsKICAgIHJlZ2lzdGVycy5lYXggPSAidmFyaWFibGUtMiI7CiAgICByZWdpc3RlcnMucmF4ID0gInZhcmlhYmxlLTMiOwoKICAgIHJlZ2lzdGVycy5ieCAgPSAidmFyaWFibGUiOwogICAgcmVnaXN0ZXJzLmVieCA9ICJ2YXJpYWJsZS0yIjsKICAgIHJlZ2lzdGVycy5yYnggPSAidmFyaWFibGUtMyI7CgogICAgcmVnaXN0ZXJzLmN4ICA9ICJ2YXJpYWJsZSI7CiAgICByZWdpc3RlcnMuZWN4ID0gInZhcmlhYmxlLTIiOwogICAgcmVnaXN0ZXJzLnJjeCA9ICJ2YXJpYWJsZS0zIjsKCiAgICByZWdpc3RlcnMuZHggID0gInZhcmlhYmxlIjsKICAgIHJlZ2lzdGVycy5lZHggPSAidmFyaWFibGUtMiI7CiAgICByZWdpc3RlcnMucmR4ID0gInZhcmlhYmxlLTMiOwoKICAgIHJlZ2lzdGVycy5zaSAgPSAidmFyaWFibGUiOwogICAgcmVnaXN0ZXJzLmVzaSA9ICJ2YXJpYWJsZS0yIjsKICAgIHJlZ2lzdGVycy5yc2kgPSAidmFyaWFibGUtMyI7CgogICAgcmVnaXN0ZXJzLmRpICA9ICJ2YXJpYWJsZSI7CiAgICByZWdpc3RlcnMuZWRpID0gInZhcmlhYmxlLTIiOwogICAgcmVnaXN0ZXJzLnJkaSA9ICJ2YXJpYWJsZS0zIjsKCiAgICByZWdpc3RlcnMuc3AgID0gInZhcmlhYmxlIjsKICAgIHJlZ2lzdGVycy5lc3AgPSAidmFyaWFibGUtMiI7CiAgICByZWdpc3RlcnMucnNwID0gInZhcmlhYmxlLTMiOwoKICAgIHJlZ2lzdGVycy5icCAgPSAidmFyaWFibGUiOwogICAgcmVnaXN0ZXJzLmVicCA9ICJ2YXJpYWJsZS0yIjsKICAgIHJlZ2lzdGVycy5yYnAgPSAidmFyaWFibGUtMyI7CgogICAgcmVnaXN0ZXJzLmlwICA9ICJ2YXJpYWJsZSI7CiAgICByZWdpc3RlcnMuZWlwID0gInZhcmlhYmxlLTIiOwogICAgcmVnaXN0ZXJzLnJpcCA9ICJ2YXJpYWJsZS0zIjsKCiAgICByZWdpc3RlcnMuY3MgID0gImtleXdvcmQiOwogICAgcmVnaXN0ZXJzLmRzICA9ICJrZXl3b3JkIjsKICAgIHJlZ2lzdGVycy5zcyAgPSAia2V5d29yZCI7CiAgICByZWdpc3RlcnMuZXMgID0gImtleXdvcmQiOwogICAgcmVnaXN0ZXJzLmZzICA9ICJrZXl3b3JkIjsKICAgIHJlZ2lzdGVycy5ncyAgPSAia2V5d29yZCI7CiAgfQoKICBmdW5jdGlvbiBhcm12NihfcGFyc2VyQ29uZmlnKSB7CiAgICAvLyBSZWZlcmVuY2U6CiAgICAvLyBodHRwOi8vaW5mb2NlbnRlci5hcm0uY29tL2hlbHAvdG9waWMvY29tLmFybS5kb2MucXJjMDAwMWwvUVJDMDAwMV9VQUwucGRmCiAgICAvLyBodHRwOi8vaW5mb2NlbnRlci5hcm0uY29tL2hlbHAvdG9waWMvY29tLmFybS5kb2MuZGRpMDMwMWgvRERJMDMwMUhfYXJtMTE3Nmp6ZnNfcjBwN190cm0ucGRmCiAgICBsaW5lQ29tbWVudFN0YXJ0U3ltYm9sID0gIkAiOwogICAgZGlyZWN0aXZlcy5zeW50YXggPSAiYnVpbHRpbiI7CgogICAgcmVnaXN0ZXJzLnIwICA9ICJ2YXJpYWJsZSI7CiAgICByZWdpc3RlcnMucjEgID0gInZhcmlhYmxlIjsKICAgIHJlZ2lzdGVycy5yMiAgPSAidmFyaWFibGUiOwogICAgcmVnaXN0ZXJzLnIzICA9ICJ2YXJpYWJsZSI7CiAgICByZWdpc3RlcnMucjQgID0gInZhcmlhYmxlIjsKICAgIHJlZ2lzdGVycy5yNSAgPSAidmFyaWFibGUiOwogICAgcmVnaXN0ZXJzLnI2ICA9ICJ2YXJpYWJsZSI7CiAgICByZWdpc3RlcnMucjcgID0gInZhcmlhYmxlIjsKICAgIHJlZ2lzdGVycy5yOCAgPSAidmFyaWFibGUiOwogICAgcmVnaXN0ZXJzLnI5ICA9ICJ2YXJpYWJsZSI7CiAgICByZWdpc3RlcnMucjEwID0gInZhcmlhYmxlIjsKICAgIHJlZ2lzdGVycy5yMTEgPSAidmFyaWFibGUiOwogICAgcmVnaXN0ZXJzLnIxMiA9ICJ2YXJpYWJsZSI7CgogICAgcmVnaXN0ZXJzLnNwICA9ICJ2YXJpYWJsZS0yIjsKICAgIHJlZ2lzdGVycy5sciAgPSAidmFyaWFibGUtMiI7CiAgICByZWdpc3RlcnMucGMgID0gInZhcmlhYmxlLTIiOwogICAgcmVnaXN0ZXJzLnIxMyA9IHJlZ2lzdGVycy5zcDsKICAgIHJlZ2lzdGVycy5yMTQgPSByZWdpc3RlcnMubHI7CiAgICByZWdpc3RlcnMucjE1ID0gcmVnaXN0ZXJzLnBjOwoKICAgIGN1c3RvbS5wdXNoKGZ1bmN0aW9uKGNoLCBzdHJlYW0pIHsKICAgICAgaWYgKGNoID09PSAnIycpIHsKICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1x3Lyk7CiAgICAgICAgcmV0dXJuICJudW1iZXIiOwogICAgICB9CiAgICB9KTsKICB9CgogIHZhciBhcmNoID0gKHBhcnNlckNvbmZpZy5hcmNoaXRlY3R1cmUgfHwgIng4NiIpLnRvTG93ZXJDYXNlKCk7CiAgaWYgKGFyY2ggPT09ICJ4ODYiKSB7CiAgICB4ODYocGFyc2VyQ29uZmlnKTsKICB9IGVsc2UgaWYgKGFyY2ggPT09ICJhcm0iIHx8IGFyY2ggPT09ICJhcm12NiIpIHsKICAgIGFybXY2KHBhcnNlckNvbmZpZyk7CiAgfQoKICBmdW5jdGlvbiBuZXh0VW50aWxVbmVzY2FwZWQoc3RyZWFtLCBlbmQpIHsKICAgIHZhciBlc2NhcGVkID0gZmFsc2UsIG5leHQ7CiAgICB3aGlsZSAoKG5leHQgPSBzdHJlYW0ubmV4dCgpKSAhPSBudWxsKSB7CiAgICAgIGlmIChuZXh0ID09PSBlbmQgJiYgIWVzY2FwZWQpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgZXNjYXBlZCA9ICFlc2NhcGVkICYmIG5leHQgPT09ICJcXCI7CiAgICB9CiAgICByZXR1cm4gZXNjYXBlZDsKICB9CgogIGZ1bmN0aW9uIGNsaWtlQ29tbWVudChzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgbWF5YmVFbmQgPSBmYWxzZSwgY2g7CiAgICB3aGlsZSAoKGNoID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkgewogICAgICBpZiAoY2ggPT09ICIvIiAmJiBtYXliZUVuZCkgewogICAgICAgIHN0YXRlLnRva2VuaXplID0gbnVsbDsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBtYXliZUVuZCA9IChjaCA9PT0gIioiKTsKICAgIH0KICAgIHJldHVybiAiY29tbWVudCI7CiAgfQoKICByZXR1cm4gewogICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgdG9rZW5pemU6IG51bGwKICAgICAgfTsKICAgIH0sCgogICAgdG9rZW46IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgaWYgKHN0YXRlLnRva2VuaXplKSB7CiAgICAgICAgcmV0dXJuIHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgICB9CgogICAgICBpZiAoc3RyZWFtLmVhdFNwYWNlKCkpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQoKICAgICAgdmFyIHN0eWxlLCBjdXIsIGNoID0gc3RyZWFtLm5leHQoKTsKCiAgICAgIGlmIChjaCA9PT0gIi8iKSB7CiAgICAgICAgaWYgKHN0cmVhbS5lYXQoIioiKSkgewogICAgICAgICAgc3RhdGUudG9rZW5pemUgPSBjbGlrZUNvbW1lbnQ7CiAgICAgICAgICByZXR1cm4gY2xpa2VDb21tZW50KHN0cmVhbSwgc3RhdGUpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgKGNoID09PSBsaW5lQ29tbWVudFN0YXJ0U3ltYm9sKSB7CiAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICAgIHJldHVybiAiY29tbWVudCI7CiAgICAgIH0KCiAgICAgIGlmIChjaCA9PT0gJyInKSB7CiAgICAgICAgbmV4dFVudGlsVW5lc2NhcGVkKHN0cmVhbSwgJyInKTsKICAgICAgICByZXR1cm4gInN0cmluZyI7CiAgICAgIH0KCiAgICAgIGlmIChjaCA9PT0gJy4nKSB7CiAgICAgICAgc3RyZWFtLmVhdFdoaWxlKC9cdy8pOwogICAgICAgIGN1ciA9IHN0cmVhbS5jdXJyZW50KCkudG9Mb3dlckNhc2UoKTsKICAgICAgICBzdHlsZSA9IGRpcmVjdGl2ZXNbY3VyXTsKICAgICAgICByZXR1cm4gc3R5bGUgfHwgbnVsbDsKICAgICAgfQoKICAgICAgaWYgKGNoID09PSAnPScpIHsKICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1x3Lyk7CiAgICAgICAgcmV0dXJuICJ0YWciOwogICAgICB9CgogICAgICBpZiAoY2ggPT09ICd7JykgewogICAgICAgIHJldHVybiAiYnJha2V0IjsKICAgICAgfQoKICAgICAgaWYgKGNoID09PSAnfScpIHsKICAgICAgICByZXR1cm4gImJyYWtldCI7CiAgICAgIH0KCiAgICAgIGlmICgvXGQvLnRlc3QoY2gpKSB7CiAgICAgICAgaWYgKGNoID09PSAiMCIgJiYgc3RyZWFtLmVhdCgieCIpKSB7CiAgICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1swLTlhLWZBLUZdLyk7CiAgICAgICAgICByZXR1cm4gIm51bWJlciI7CiAgICAgICAgfQogICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvXGQvKTsKICAgICAgICByZXR1cm4gIm51bWJlciI7CiAgICAgIH0KCiAgICAgIGlmICgvXHcvLnRlc3QoY2gpKSB7CiAgICAgICAgc3RyZWFtLmVhdFdoaWxlKC9cdy8pOwogICAgICAgIGlmIChzdHJlYW0uZWF0KCI6IikpIHsKICAgICAgICAgIHJldHVybiAndGFnJzsKICAgICAgICB9CiAgICAgICAgY3VyID0gc3RyZWFtLmN1cnJlbnQoKS50b0xvd2VyQ2FzZSgpOwogICAgICAgIHN0eWxlID0gcmVnaXN0ZXJzW2N1cl07CiAgICAgICAgcmV0dXJuIHN0eWxlIHx8IG51bGw7CiAgICAgIH0KCiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY3VzdG9tLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgc3R5bGUgPSBjdXN0b21baV0oY2gsIHN0cmVhbSwgc3RhdGUpOwogICAgICAgIGlmIChzdHlsZSkgewogICAgICAgICAgcmV0dXJuIHN0eWxlOwogICAgICAgIH0KICAgICAgfQogICAgfSwKCiAgICBsaW5lQ29tbWVudDogbGluZUNvbW1lbnRTdGFydFN5bWJvbCwKICAgIGJsb2NrQ29tbWVudFN0YXJ0OiAiLyoiLAogICAgYmxvY2tDb21tZW50RW5kOiAiKi8iCiAgfTsKfSk7Cgp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/gas/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogR2FzIG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iZ2FzLmpzIj48L3NjcmlwdD4KPHN0eWxlPi5Db2RlTWlycm9yIHtib3JkZXI6IDJweCBpbnNldCAjZGVlO308L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxoMT5Db2RlTWlycm9yPC9oMT48aW1nIGlkPWxvZ28gc3JjPSIuLi8uLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5MYW5ndWFnZSBtb2RlczwvYT4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+R2FzPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5HYXMgbW9kZTwvaDI+Cjxmb3JtPgo8dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgouc3ludGF4IHVuaWZpZWQKLmdsb2JhbCBtYWluCgovKiAKICogIEEKICogIG11bHRpLWxpbmUKICogIGNvbW1lbnQuCiAqLwoKQCBBIHNpbmdsZSBsaW5lIGNvbW1lbnQuCgptYWluOgogICAgICAgIHB1c2ggICAge3NwLCBscn0KICAgICAgICBsZHIgICAgIHIwLCA9bWVzc2FnZQogICAgICAgIGJsICAgICAgcHV0cwogICAgICAgIG1vdiAgICAgcjAsICMwCiAgICAgICAgcG9wICAgICB7c3AsIHBjfQoKbWVzc2FnZToKICAgICAgICAuYXNjaXogIkhlbGxvIHdvcmxkITxiciAvPiIKPC90ZXh0YXJlYT4KICAgICAgICA8L2Zvcm0+CgogICAgICAgIDxzY3JpcHQ+CiAgICAgICAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICAgICAgICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgICAgICAgICAgICAgIG1vZGU6IHtuYW1lOiAiZ2FzIiwgYXJjaGl0ZWN0dXJlOiAiQVJNdjYifSwKICAgICAgICAgICAgfSk7CiAgICAgICAgPC9zY3JpcHQ+CgogICAgICAgIDxwPkhhbmRsZXMgQVQmYW1wO1QgYXNzZW1ibGVyIHN5bnRheCAobW9yZSBzcGVjaWZpY2FsbHkgdGhpcyBoYW5kbGVzCiAgICAgICAgdGhlIEdOVSBBc3NlbWJsZXIgKGdhcykgc3ludGF4LikKICAgICAgICBJdCB0YWtlcyBhIHNpbmdsZSBvcHRpb25hbCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcjoKICAgICAgICA8Y29kZT5hcmNoaXRlY3R1cmU8L2NvZGU+LCB3aGljaCBjYW4gYmUgb25lIG9mIDxjb2RlPiJBUk0iPC9jb2RlPiwKICAgICAgICA8Y29kZT4iQVJNdjYiPC9jb2RlPiBvciA8Y29kZT4ieDg2IjwvY29kZT4uCiAgICAgICAgSW5jbHVkaW5nIHRoZSBwYXJhbWV0ZXIgYWRkcyBzeW50YXggZm9yIHRoZSByZWdpc3RlcnMgYW5kIHNwZWNpYWwKICAgICAgICBkaXJlY3RpdmVzIGZvciB0aGUgc3VwcGxpZWQgYXJjaGl0ZWN0dXJlLgoKICAgICAgICA8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC94LWdhczwvY29kZT48L3A+CiAgICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/gfm/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/gfm/gfm.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSwgcmVxdWlyZSgiLi4vbWFya2Rvd24vbWFya2Rvd24iKSwgcmVxdWlyZSgiLi4vLi4vYWRkb24vbW9kZS9vdmVybGF5IikpOwogIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kKSAvLyBBTUQKICAgIGRlZmluZShbIi4uLy4uL2xpYi9jb2RlbWlycm9yIiwgIi4uL21hcmtkb3duL21hcmtkb3duIiwgIi4uLy4uL2FkZG9uL21vZGUvb3ZlcmxheSJdLCBtb2QpOwogIGVsc2UgLy8gUGxhaW4gYnJvd3NlciBlbnYKICAgIG1vZChDb2RlTWlycm9yKTsKfSkoZnVuY3Rpb24oQ29kZU1pcnJvcikgewoidXNlIHN0cmljdCI7Cgp2YXIgdXJsUkUgPSAvXigoPzooPzphYWFzP3xhYm91dHxhY2FwfGFkaXVteHRyYXxhZltwc118YWltfGFwdHxhdHRhY2htZW50fGF3fGJlc2hhcmV8Yml0Y29pbnxib2xvfGNhbGx0b3xjYXB8Y2hyb21lKD86LWV4dGVuc2lvbik/fGNpZHxjb2FwfGNvbS1ldmVudGJyaXRlLWF0dGVuZGVlfGNvbnRlbnR8Y3JpZHxjdnN8ZGF0YXxkYXZ8ZGljdHxkbG5hLSg/OnBsYXljb250YWluZXJ8cGxheXNpbmdsZSl8ZG5zfGRvaXxkdG58ZHZifGVkMmt8ZmFjZXRpbWV8ZmVlZHxmaWxlfGZpbmdlcnxmaXNofGZ0cHxnZW98Z2d8Z2l0fGdpem1vcHJvamVjdHxnb3xnb3BoZXJ8Z3RhbGt8aDMyM3xoY3B8aHR0cHM/fGlheHxpY2FwfGljb258aW18aW1hcHxpbmZvfGlwbnxpcHB8aXJjWzZzXT98aXJpcyg/OlwuYmVlcHxcLmx3enxcLnhwY3xcLnhwY3MpP3xpdG1zfGphcnxqYXZhc2NyaXB0fGptc3xrZXlwYXJjfGxhc3RmbXxsZGFwcz98bWFnbmV0fG1haWx0b3xtYXBzfG1hcmtldHxtZXNzYWdlfG1pZHxtbXN8bXMtaGVscHxtc25pbXxtc3Jwcz98bXRxcHxtdW1ibGV8bXVwZGF0ZXxtdm58bmV3c3xuZnN8bmloP3xubnRwfG5vdGVzfG9pZHxvcGFxdWVsb2NrdG9rZW58cGFsbXxwYXBhcmF6eml8cGxhdGZvcm18cG9wfHByZXN8cHJveHl8cHN5Y3xxdWVyeXxyZXMoPzpvdXJjZSk/fHJtaXxyc3luY3xydG1wfHJ0c3B8c2Vjb25kbGlmZXxzZXJ2aWNlfHNlc3Npb258c2Z0cHxzZ258c2h0dHB8c2lldmV8c2lwcz98c2t5cGV8c21bYnNdfHNubXB8c29hcFwuYmVlcHM/fHNvbGRhdHxzcG90aWZ5fHNzaHxzdGVhbXxzdm58dGFnfHRlYW1zcGVha3x0ZWwoPzpuZXQpP3x0ZnRwfHRoaW5nc3x0aGlzbWVzc2FnZXx0aXB8dG4zMjcwfHR2fHVkcHx1bnJlYWx8dXJufHV0MjAwNHx2ZW1taXx2ZW50cmlsb3x2aWV3LXNvdXJjZXx3ZWJjYWx8d3NzP3x3dGFpfHd5Y2l3eWd8eGNvbig/Oi11c2VyaWQpP3x4ZmlyZXx4bWxycGNcLmJlZXBzP3x4bXBwfHhyaXx5bXNncnx6MzlcLjUwW3JzXT8pOig/OlwvezEsM318W2EtejAtOSVdKXx3d3dcZHswLDN9Wy5dfFthLXowLTkuXC1dK1suXVthLXpdezIsNH1cLykoPzpbXlxzKCk8Pl18XChbXlxzKCk8Pl0qXCkpKyg/OlwoW15ccygpPD5dKlwpfFteXHNgKiEoKVxbXF17fTs6JyIuLDw+P8KrwrvigJzigJ3igJjigJldKSkvaQoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJnZm0iLCBmdW5jdGlvbihjb25maWcsIG1vZGVDb25maWcpIHsKICB2YXIgY29kZURlcHRoID0gMDsKICBmdW5jdGlvbiBibGFua0xpbmUoc3RhdGUpIHsKICAgIHN0YXRlLmNvZGUgPSBmYWxzZTsKICAgIHJldHVybiBudWxsOwogIH0KICB2YXIgZ2ZtT3ZlcmxheSA9IHsKICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gewogICAgICAgIGNvZGU6IGZhbHNlLAogICAgICAgIGNvZGVCbG9jazogZmFsc2UsCiAgICAgICAgYXRlU3BhY2U6IGZhbHNlCiAgICAgIH07CiAgICB9LAogICAgY29weVN0YXRlOiBmdW5jdGlvbihzKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgY29kZTogcy5jb2RlLAogICAgICAgIGNvZGVCbG9jazogcy5jb2RlQmxvY2ssCiAgICAgICAgYXRlU3BhY2U6IHMuYXRlU3BhY2UKICAgICAgfTsKICAgIH0sCiAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICBzdGF0ZS5jb21iaW5lVG9rZW5zID0gbnVsbDsKCiAgICAgIC8vIEhhY2sgdG8gcHJldmVudCBmb3JtYXR0aW5nIG92ZXJyaWRlIGluc2lkZSBjb2RlIGJsb2NrcyAoYmxvY2sgYW5kIGlubGluZSkKICAgICAgaWYgKHN0YXRlLmNvZGVCbG9jaykgewogICAgICAgIGlmIChzdHJlYW0ubWF0Y2goL15gYGArLykpIHsKICAgICAgICAgIHN0YXRlLmNvZGVCbG9jayA9IGZhbHNlOwogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBpZiAoc3RyZWFtLnNvbCgpKSB7CiAgICAgICAgc3RhdGUuY29kZSA9IGZhbHNlOwogICAgICB9CiAgICAgIGlmIChzdHJlYW0uc29sKCkgJiYgc3RyZWFtLm1hdGNoKC9eYGBgKy8pKSB7CiAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICAgIHN0YXRlLmNvZGVCbG9jayA9IHRydWU7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgLy8gSWYgdGhpcyBibG9jayBpcyBjaGFuZ2VkLCBpdCBtYXkgbmVlZCB0byBiZSB1cGRhdGVkIGluIE1hcmtkb3duIG1vZGUKICAgICAgaWYgKHN0cmVhbS5wZWVrKCkgPT09ICdgJykgewogICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgdmFyIGJlZm9yZSA9IHN0cmVhbS5wb3M7CiAgICAgICAgc3RyZWFtLmVhdFdoaWxlKCdgJyk7CiAgICAgICAgdmFyIGRpZmZlcmVuY2UgPSAxICsgc3RyZWFtLnBvcyAtIGJlZm9yZTsKICAgICAgICBpZiAoIXN0YXRlLmNvZGUpIHsKICAgICAgICAgIGNvZGVEZXB0aCA9IGRpZmZlcmVuY2U7CiAgICAgICAgICBzdGF0ZS5jb2RlID0gdHJ1ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKGRpZmZlcmVuY2UgPT09IGNvZGVEZXB0aCkgeyAvLyBNdXN0IGJlIGV4YWN0CiAgICAgICAgICAgIHN0YXRlLmNvZGUgPSBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0gZWxzZSBpZiAoc3RhdGUuY29kZSkgewogICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgLy8gQ2hlY2sgaWYgc3BhY2UuIElmIHNvLCBsaW5rcyBjYW4gYmUgZm9ybWF0dGVkIGxhdGVyIG9uCiAgICAgIGlmIChzdHJlYW0uZWF0U3BhY2UoKSkgewogICAgICAgIHN0YXRlLmF0ZVNwYWNlID0gdHJ1ZTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBpZiAoc3RyZWFtLnNvbCgpIHx8IHN0YXRlLmF0ZVNwYWNlKSB7CiAgICAgICAgc3RhdGUuYXRlU3BhY2UgPSBmYWxzZTsKICAgICAgICBpZiAobW9kZUNvbmZpZy5naXRIdWJTcGljZSAhPT0gZmFsc2UpIHsKICAgICAgICAgIGlmKHN0cmVhbS5tYXRjaCgvXig/OlthLXpBLVowLTlcLV9dK1wvKT8oPzpbYS16QS1aMC05XC1fXStAKT8oPzpbYS1mMC05XXs3LDQwfVxiKS8pKSB7CiAgICAgICAgICAgIC8vIFVzZXIvUHJvamVjdEBTSEEKICAgICAgICAgICAgLy8gVXNlckBTSEEKICAgICAgICAgICAgLy8gU0hBCiAgICAgICAgICAgIHN0YXRlLmNvbWJpbmVUb2tlbnMgPSB0cnVlOwogICAgICAgICAgICByZXR1cm4gImxpbmsiOwogICAgICAgICAgfSBlbHNlIGlmIChzdHJlYW0ubWF0Y2goL14oPzpbYS16QS1aMC05XC1fXStcLyk/KD86W2EtekEtWjAtOVwtX10rKT8jWzAtOV0rXGIvKSkgewogICAgICAgICAgICAvLyBVc2VyL1Byb2plY3QjTnVtCiAgICAgICAgICAgIC8vIFVzZXIjTnVtCiAgICAgICAgICAgIC8vICNOdW0KICAgICAgICAgICAgc3RhdGUuY29tYmluZVRva2VucyA9IHRydWU7CiAgICAgICAgICAgIHJldHVybiAibGluayI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChzdHJlYW0ubWF0Y2godXJsUkUpICYmCiAgICAgICAgICBzdHJlYW0uc3RyaW5nLnNsaWNlKHN0cmVhbS5zdGFydCAtIDIsIHN0cmVhbS5zdGFydCkgIT0gIl0oIiAmJgogICAgICAgICAgKHN0cmVhbS5zdGFydCA9PSAwIHx8IC9cVy8udGVzdChzdHJlYW0uc3RyaW5nLmNoYXJBdChzdHJlYW0uc3RhcnQgLSAxKSkpKSB7CiAgICAgICAgLy8gVVJMcwogICAgICAgIC8vIFRha2VuIGZyb20gaHR0cDovL2RhcmluZ2ZpcmViYWxsLm5ldC8yMDEwLzA3L2ltcHJvdmVkX3JlZ2V4X2Zvcl9tYXRjaGluZ191cmxzCiAgICAgICAgLy8gQW5kIHRoZW4gKGlzc3VlICMxMTYwKSBzaW1wbGlmaWVkIHRvIG1ha2UgaXQgbm90IGNyYXNoIHRoZSBDaHJvbWUgUmVnZXhwIGVuZ2luZQogICAgICAgIC8vIEFuZCB0aGVuIGxpbWl0ZWQgdXJsIHNjaGVtZXMgdG8gdGhlIENvbW1vbk1hcmsgbGlzdCwgc28gZm9vOmJhciBpc24ndCBtYXRjaGVkIGFzIGEgVVJMCiAgICAgICAgc3RhdGUuY29tYmluZVRva2VucyA9IHRydWU7CiAgICAgICAgcmV0dXJuICJsaW5rIjsKICAgICAgfQogICAgICBzdHJlYW0ubmV4dCgpOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0sCiAgICBibGFua0xpbmU6IGJsYW5rTGluZQogIH07CgogIHZhciBtYXJrZG93bkNvbmZpZyA9IHsKICAgIHVuZGVyc2NvcmVzQnJlYWtXb3JkczogZmFsc2UsCiAgICB0YXNrTGlzdHM6IHRydWUsCiAgICBmZW5jZWRDb2RlQmxvY2tzOiAnYGBgJywKICAgIHN0cmlrZXRocm91Z2g6IHRydWUKICB9OwogIGZvciAodmFyIGF0dHIgaW4gbW9kZUNvbmZpZykgewogICAgbWFya2Rvd25Db25maWdbYXR0cl0gPSBtb2RlQ29uZmlnW2F0dHJdOwogIH0KICBtYXJrZG93bkNvbmZpZy5uYW1lID0gIm1hcmtkb3duIjsKICByZXR1cm4gQ29kZU1pcnJvci5vdmVybGF5TW9kZShDb2RlTWlycm9yLmdldE1vZGUoY29uZmlnLCBtYXJrZG93bkNvbmZpZyksIGdmbU92ZXJsYXkpOwoKfSwgIm1hcmtkb3duIik7CgogIENvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC94LWdmbSIsICJnZm0iKTsKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/gfm/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogR0ZNIG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vLi4vYWRkb24vbW9kZS9vdmVybGF5LmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL3htbC94bWwuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vbWFya2Rvd24vbWFya2Rvd24uanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iZ2ZtLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL2phdmFzY3JpcHQvamF2YXNjcmlwdC5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9jc3MvY3NzLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL2h0bWxtaXhlZC9odG1sbWl4ZWQuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vY2xpa2UvY2xpa2UuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vbWV0YS5qcyI+PC9zY3JpcHQ+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+LkNvZGVNaXJyb3Ige2JvcmRlci10b3A6IDFweCBzb2xpZCBibGFjazsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO308L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxoMT5Db2RlTWlycm9yPC9oMT48aW1nIGlkPWxvZ28gc3JjPSIuLi8uLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5MYW5ndWFnZSBtb2RlczwvYT4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+R0ZNPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5HRk0gbW9kZTwvaDI+Cjxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+CkdpdEh1YiBGbGF2b3JlZCBNYXJrZG93bgo9PT09PT09PT09PT09PT09PT09PT09PT0KCkV2ZXJ5dGhpbmcgZnJvbSBtYXJrZG93biBwbHVzIEdGTSBmZWF0dXJlczoKCiMjIFVSTCBhdXRvbGlua2luZwoKVW5kZXJzY29yZXNfYXJlX2FsbG93ZWRfYmV0d2Vlbl93b3Jkcy4KCiMjIFN0cmlrZXRocm91Z2ggdGV4dAoKR0ZNIGFkZHMgc3ludGF4IHRvIHN0cmlrZXRocm91Z2ggdGV4dCwgd2hpY2ggaXMgbWlzc2luZyBmcm9tIHN0YW5kYXJkIE1hcmtkb3duLgoKfn5NaXN0YWtlbiB0ZXh0Ln5+Cn5+Kip3b3JrcyB3aXRoIG90aGVyIGZvcm1hdHRpbmcqKn5+Cgp+fnNwYW5zIGFjcm9zcwpsaW5lc35+CgojIyBGZW5jZWQgY29kZSBibG9ja3MgKGFuZCBzeW50YXggaGlnaGxpZ2h0aW5nKQoKYGBgamF2YXNjcmlwdApmb3IgKHZhciBpID0gMDsgaSAmbHQ7IGl0ZW1zLmxlbmd0aDsgaSsrKSB7CiAgICBjb25zb2xlLmxvZyhpdGVtc1tpXSwgaSk7IC8vIGxvZyB0aGVtCn0KYGBgCgojIyBUYXNrIExpc3RzCgotIFsgXSBJbmNvbXBsZXRlIHRhc2sgbGlzdCBpdGVtCi0gW3hdICoqQ29tcGxldGVkKiogdGFzayBsaXN0IGl0ZW0KCiMjIEEgYml0IG9mIEdpdEh1YiBzcGljZQoKKiBTSEE6IGJlNmE4Y2MxYzFlY2ZlOTQ4OWZiNTFlNDg2OWFmMTVhMTNmYzJjZDIKKiBVc2VyQFNIQSByZWY6IG1vam9tYm9AYmU2YThjYzFjMWVjZmU5NDg5ZmI1MWU0ODY5YWYxNWExM2ZjMmNkMgoqIFVzZXIvUHJvamVjdEBTSEE6IG1vam9tYm8vZ29kQGJlNmE4Y2MxYzFlY2ZlOTQ4OWZiNTFlNDg2OWFmMTVhMTNmYzJjZDIKKiBcI051bTogIzEKKiBVc2VyLyNOdW06IG1vam9tYm8jMQoqIFVzZXIvUHJvamVjdCNOdW06IG1vam9tYm8vZ29kIzEKClNlZSBodHRwOi8vZ2l0aHViLmdpdGh1Yi5jb20vZ2l0aHViLWZsYXZvcmVkLW1hcmtkb3duLy4KCjwvdGV4dGFyZWE+PC9mb3JtPgoKICAgIDxzY3JpcHQ+CiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICAgICAgbW9kZTogJ2dmbScsCiAgICAgICAgbGluZU51bWJlcnM6IHRydWUsCiAgICAgICAgdGhlbWU6ICJkZWZhdWx0IgogICAgICB9KTsKICAgIDwvc2NyaXB0PgoKICAgIDxwPk9wdGlvbmFsbHkgZGVwZW5kcyBvbiBvdGhlciBtb2RlcyBmb3IgcHJvcGVybHkgaGlnaGxpZ2h0ZWQgY29kZSBibG9ja3MuPC9wPgoKICAgIDxwPjxzdHJvbmc+UGFyc2luZy9IaWdobGlnaHRpbmcgVGVzdHM6PC9zdHJvbmc+IDxhIGhyZWY9Ii4uLy4uL3Rlc3QvaW5kZXguaHRtbCNnZm1fKiI+bm9ybWFsPC9hPiwgIDxhIGhyZWY9Ii4uLy4uL3Rlc3QvaW5kZXguaHRtbCN2ZXJib3NlLGdmbV8qIj52ZXJib3NlPC9hPi48L3A+CgogIDwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/gfm/test.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24oKSB7CiAgdmFyIG1vZGUgPSBDb2RlTWlycm9yLmdldE1vZGUoe3RhYlNpemU6IDR9LCAiZ2ZtIik7CiAgZnVuY3Rpb24gTVQobmFtZSkgeyB0ZXN0Lm1vZGUobmFtZSwgbW9kZSwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7IH0KICB2YXIgbW9kZUhpZ2hsaWdodEZvcm1hdHRpbmcgPSBDb2RlTWlycm9yLmdldE1vZGUoe3RhYlNpemU6IDR9LCB7bmFtZTogImdmbSIsIGhpZ2hsaWdodEZvcm1hdHRpbmc6IHRydWV9KTsKICBmdW5jdGlvbiBGVChuYW1lKSB7IHRlc3QubW9kZShuYW1lLCBtb2RlSGlnaGxpZ2h0Rm9ybWF0dGluZywgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7IH0KCiAgRlQoImNvZGVCYWNrdGlja3MiLAogICAgICJbY29tbWVudCZmb3JtYXR0aW5nJmZvcm1hdHRpbmctY29kZSBgXVtjb21tZW50IGZvb11bY29tbWVudCZmb3JtYXR0aW5nJmZvcm1hdHRpbmctY29kZSBgXSIpOwoKICBGVCgiZG91YmxlQmFja3RpY2tzIiwKICAgICAiW2NvbW1lbnQmZm9ybWF0dGluZyZmb3JtYXR0aW5nLWNvZGUgYGBdW2NvbW1lbnQgZm9vIGAgYmFyXVtjb21tZW50JmZvcm1hdHRpbmcmZm9ybWF0dGluZy1jb2RlIGBgXSIpOwoKICBGVCgiY29kZUJsb2NrIiwKICAgICAiW2NvbW1lbnQmZm9ybWF0dGluZyZmb3JtYXR0aW5nLWNvZGUtYmxvY2sgYGBgY3NzXSIsCiAgICAgIlt0YWcgZm9vXSIsCiAgICAgIltjb21tZW50JmZvcm1hdHRpbmcmZm9ybWF0dGluZy1jb2RlLWJsb2NrIGBgYF0iKTsKCiAgRlQoInRhc2tMaXN0IiwKICAgICAiW3ZhcmlhYmxlLTImZm9ybWF0dGluZyZmb3JtYXR0aW5nLWxpc3QmZm9ybWF0dGluZy1saXN0LXVsIC0gXVttZXRhJmZvcm1hdHRpbmcmZm9ybWF0dGluZy10YXNrIFsgXV1dW3ZhcmlhYmxlLTIgIGZvb10iLAogICAgICJbdmFyaWFibGUtMiZmb3JtYXR0aW5nJmZvcm1hdHRpbmctbGlzdCZmb3JtYXR0aW5nLWxpc3QtdWwgLSBdW3Byb3BlcnR5JmZvcm1hdHRpbmcmZm9ybWF0dGluZy10YXNrIFt4XV1dW3ZhcmlhYmxlLTIgIGZvb10iKTsKCiAgRlQoImZvcm1hdHRpbmdfc3RyaWtldGhyb3VnaCIsCiAgICAgIltzdHJpa2V0aHJvdWdoJmZvcm1hdHRpbmcmZm9ybWF0dGluZy1zdHJpa2V0aHJvdWdoIH5+XVtzdHJpa2V0aHJvdWdoIGZvb11bc3RyaWtldGhyb3VnaCZmb3JtYXR0aW5nJmZvcm1hdHRpbmctc3RyaWtldGhyb3VnaCB+fl0iKTsKCiAgRlQoImZvcm1hdHRpbmdfc3RyaWtldGhyb3VnaCIsCiAgICAgImZvbyBbc3RyaWtldGhyb3VnaCZmb3JtYXR0aW5nJmZvcm1hdHRpbmctc3RyaWtldGhyb3VnaCB+fl1bc3RyaWtldGhyb3VnaCBiYXJdW3N0cmlrZXRocm91Z2gmZm9ybWF0dGluZyZmb3JtYXR0aW5nLXN0cmlrZXRocm91Z2ggfn5dIik7CgogIE1UKCJlbUluV29yZEFzdGVyaXNrIiwKICAgICAiZm9vW2VtICpiYXIqXWhlbGxvIik7CgogIE1UKCJlbUluV29yZFVuZGVyc2NvcmUiLAogICAgICJmb29fYmFyX2hlbGxvIik7CgogIE1UKCJlbVN0cm9uZ1VuZGVyc2NvcmUiLAogICAgICJbc3Ryb25nIF9fXVtlbSZzdHJvbmcgX2Zvb19fXVtlbSBfXSBiYXIiKTsKCiAgTVQoImZlbmNlZENvZGVCbG9ja3MiLAogICAgICJbY29tbWVudCBgYGBdIiwKICAgICAiW2NvbW1lbnQgZm9vXSIsCiAgICAgIiIsCiAgICAgIltjb21tZW50IGBgYF0iLAogICAgICJiYXIiKTsKCiAgTVQoImZlbmNlZENvZGVCbG9ja01vZGVTd2l0Y2hpbmciLAogICAgICJbY29tbWVudCBgYGBqYXZhc2NyaXB0XSIsCiAgICAgIlt2YXJpYWJsZSBmb29dIiwKICAgICAiIiwKICAgICAiW2NvbW1lbnQgYGBgXSIsCiAgICAgImJhciIpOwoKICBNVCgiZmVuY2VkQ29kZUJsb2NrTW9kZVN3aXRjaGluZ09iamMiLAogICAgICJbY29tbWVudCBgYGBvYmplY3RpdmUtY10iLAogICAgICJba2V5d29yZCBAcHJvcGVydHldIFt2YXJpYWJsZSBOU1N0cmluZ10gW29wZXJhdG9yICpdIFt2YXJpYWJsZSBmb29dOyIsCiAgICAgIltjb21tZW50IGBgYF0iLAogICAgICJiYXIiKTsKCiAgTVQoImZlbmNlZENvZGVCbG9ja3NOb1RpbGRlcyIsCiAgICAgIn5+fiIsCiAgICAgImZvbyIsCiAgICAgIn5+fiIpOwoKICBNVCgidGFza0xpc3RBc3RlcmlzayIsCiAgICAgIlt2YXJpYWJsZS0yICogW11dIGZvb10iLCAvLyBJbnZhbGlkOyBtdXN0IGhhdmUgc3BhY2Ugb3IgeCBiZXR3ZWVuIFtdCiAgICAgIlt2YXJpYWJsZS0yICogWyBdXWJhcl0iLCAvLyBJbnZhbGlkOyBtdXN0IGhhdmUgc3BhY2UgYWZ0ZXIgXQogICAgICJbdmFyaWFibGUtMiAqIFt4XV1oZWxsb10iLCAvLyBJbnZhbGlkOyBtdXN0IGhhdmUgc3BhY2UgYWZ0ZXIgXQogICAgICJbdmFyaWFibGUtMiAqIF1bbWV0YSBbIF1dXVt2YXJpYWJsZS0yICBbd29ybGRdXV0iLCAvLyBWYWxpZDsgdGVzdHMgcmVmZXJlbmNlIHN0eWxlIGxpbmtzCiAgICAgIiAgICBbdmFyaWFibGUtMyAqIF1bcHJvcGVydHkgW3hdXV1bdmFyaWFibGUtMyAgZm9vXSIpOyAvLyBWYWxpZDsgY2FuIGJlIG5lc3RlZAoKICBNVCgidGFza0xpc3RQbHVzIiwKICAgICAiW3ZhcmlhYmxlLTIgKyBbXV0gZm9vXSIsIC8vIEludmFsaWQ7IG11c3QgaGF2ZSBzcGFjZSBvciB4IGJldHdlZW4gW10KICAgICAiW3ZhcmlhYmxlLTIgKyBbIF1dYmFyXSIsIC8vIEludmFsaWQ7IG11c3QgaGF2ZSBzcGFjZSBhZnRlciBdCiAgICAgIlt2YXJpYWJsZS0yICsgW3hdXWhlbGxvXSIsIC8vIEludmFsaWQ7IG11c3QgaGF2ZSBzcGFjZSBhZnRlciBdCiAgICAgIlt2YXJpYWJsZS0yICsgXVttZXRhIFsgXV1dW3ZhcmlhYmxlLTIgIFt3b3JsZF1dXSIsIC8vIFZhbGlkOyB0ZXN0cyByZWZlcmVuY2Ugc3R5bGUgbGlua3MKICAgICAiICAgIFt2YXJpYWJsZS0zICsgXVtwcm9wZXJ0eSBbeF1dXVt2YXJpYWJsZS0zICBmb29dIik7IC8vIFZhbGlkOyBjYW4gYmUgbmVzdGVkCgogIE1UKCJ0YXNrTGlzdERhc2giLAogICAgICJbdmFyaWFibGUtMiAtIFtdXSBmb29dIiwgLy8gSW52YWxpZDsgbXVzdCBoYXZlIHNwYWNlIG9yIHggYmV0d2VlbiBbXQogICAgICJbdmFyaWFibGUtMiAtIFsgXV1iYXJdIiwgLy8gSW52YWxpZDsgbXVzdCBoYXZlIHNwYWNlIGFmdGVyIF0KICAgICAiW3ZhcmlhYmxlLTIgLSBbeF1daGVsbG9dIiwgLy8gSW52YWxpZDsgbXVzdCBoYXZlIHNwYWNlIGFmdGVyIF0KICAgICAiW3ZhcmlhYmxlLTIgLSBdW21ldGEgWyBdXV1bdmFyaWFibGUtMiAgW3dvcmxkXV1dIiwgLy8gVmFsaWQ7IHRlc3RzIHJlZmVyZW5jZSBzdHlsZSBsaW5rcwogICAgICIgICAgW3ZhcmlhYmxlLTMgLSBdW3Byb3BlcnR5IFt4XV1dW3ZhcmlhYmxlLTMgIGZvb10iKTsgLy8gVmFsaWQ7IGNhbiBiZSBuZXN0ZWQKCiAgTVQoInRhc2tMaXN0TnVtYmVyIiwKICAgICAiW3ZhcmlhYmxlLTIgMS4gW11dIGZvb10iLCAvLyBJbnZhbGlkOyBtdXN0IGhhdmUgc3BhY2Ugb3IgeCBiZXR3ZWVuIFtdCiAgICAgIlt2YXJpYWJsZS0yIDIuIFsgXV1iYXJdIiwgLy8gSW52YWxpZDsgbXVzdCBoYXZlIHNwYWNlIGFmdGVyIF0KICAgICAiW3ZhcmlhYmxlLTIgMy4gW3hdXWhlbGxvXSIsIC8vIEludmFsaWQ7IG11c3QgaGF2ZSBzcGFjZSBhZnRlciBdCiAgICAgIlt2YXJpYWJsZS0yIDQuIF1bbWV0YSBbIF1dXVt2YXJpYWJsZS0yICBbd29ybGRdXV0iLCAvLyBWYWxpZDsgdGVzdHMgcmVmZXJlbmNlIHN0eWxlIGxpbmtzCiAgICAgIiAgICBbdmFyaWFibGUtMyAxLiBdW3Byb3BlcnR5IFt4XV1dW3ZhcmlhYmxlLTMgIGZvb10iKTsgLy8gVmFsaWQ7IGNhbiBiZSBuZXN0ZWQKCiAgTVQoIlNIQSIsCiAgICAgImZvbyBbbGluayBiZTZhOGNjMWMxZWNmZTk0ODlmYjUxZTQ4NjlhZjE1YTEzZmMyY2QyXSBiYXIiKTsKCiAgTVQoIlNIQUVtcGhhc2lzIiwKICAgICAiW2VtICpmb28gXVtlbSZsaW5rIGJlNmE4Y2MxYzFlY2ZlOTQ4OWZiNTFlNDg2OWFmMTVhMTNmYzJjZDJdW2VtICpdIik7CgogIE1UKCJzaG9ydFNIQSIsCiAgICAgImZvbyBbbGluayBiZTZhOGNjXSBiYXIiKTsKCiAgTVQoInRvb1Nob3J0U0hBIiwKICAgICAiZm9vIGJlNmE4YyBiYXIiKTsKCiAgTVQoImxvbmdTSEEiLAogICAgICJmb28gYmU2YThjYzFjMWVjZmU5NDg5ZmI1MWU0ODY5YWYxNWExM2ZjMmNkMjIgYmFyIik7CgogIE1UKCJiYWRTSEEiLAogICAgICJmb28gYmU2YThjYzFjMWVjZmU5NDg5ZmI1MWU0ODY5YWYxNWExM2ZjMmNnMiBiYXIiKTsKCiAgTVQoInVzZXJTSEEiLAogICAgICJmb28gW2xpbmsgYmFyQGJlNmE4Y2MxYzFlY2ZlOTQ4OWZiNTFlNDg2OWFmMTVhMTNmYzJjZDJdIGhlbGxvIik7CgogIE1UKCJ1c2VyU0hBRW1waGFzaXMiLAogICAgICJbZW0gKmZvbyBdW2VtJmxpbmsgYmFyQGJlNmE4Y2MxYzFlY2ZlOTQ4OWZiNTFlNDg2OWFmMTVhMTNmYzJjZDJdW2VtICpdIik7CgogIE1UKCJ1c2VyUHJvamVjdFNIQSIsCiAgICAgImZvbyBbbGluayBiYXIvaGVsbG9AYmU2YThjYzFjMWVjZmU5NDg5ZmI1MWU0ODY5YWYxNWExM2ZjMmNkMl0gd29ybGQiKTsKCiAgTVQoInVzZXJQcm9qZWN0U0hBRW1waGFzaXMiLAogICAgICJbZW0gKmZvbyBdW2VtJmxpbmsgYmFyL2hlbGxvQGJlNmE4Y2MxYzFlY2ZlOTQ4OWZiNTFlNDg2OWFmMTVhMTNmYzJjZDJdW2VtICpdIik7CgogIE1UKCJudW0iLAogICAgICJmb28gW2xpbmsgIzFdIGJhciIpOwoKICBNVCgibnVtRW1waGFzaXMiLAogICAgICJbZW0gKmZvbyBdW2VtJmxpbmsgIzFdW2VtICpdIik7CgogIE1UKCJiYWROdW0iLAogICAgICJmb28gIzFiYXIgaGVsbG8iKTsKCiAgTVQoInVzZXJOdW0iLAogICAgICJmb28gW2xpbmsgYmFyIzFdIGhlbGxvIik7CgogIE1UKCJ1c2VyTnVtRW1waGFzaXMiLAogICAgICJbZW0gKmZvbyBdW2VtJmxpbmsgYmFyIzFdW2VtICpdIik7CgogIE1UKCJ1c2VyUHJvamVjdE51bSIsCiAgICAgImZvbyBbbGluayBiYXIvaGVsbG8jMV0gd29ybGQiKTsKCiAgTVQoInVzZXJQcm9qZWN0TnVtRW1waGFzaXMiLAogICAgICJbZW0gKmZvbyBdW2VtJmxpbmsgYmFyL2hlbGxvIzFdW2VtICpdIik7CgogIE1UKCJ2YW5pbGxhTGluayIsCiAgICAgImZvbyBbbGluayBodHRwOi8vd3d3LmV4YW1wbGUuY29tL10gYmFyIik7CgogIE1UKCJ2YW5pbGxhTGlua05vU2NoZW1lIiwKICAgICAiZm9vIFtsaW5rIHd3dy5leGFtcGxlLmNvbV0gYmFyIik7CgogIE1UKCJ2YW5pbGxhTGlua0h0dHBzIiwKICAgICAiZm9vIFtsaW5rIGh0dHBzOi8vd3d3LmV4YW1wbGUuY29tL10gYmFyIik7CgogIE1UKCJ2YW5pbGxhTGlua0RhdGFTY2hlbWEiLAogICAgICJmb28gW2xpbmsgZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFBVUFBQUFGQ0FZQUFBQ05ieWJsQUFBQUhFbEVRVlFJMTJQNC8vOC93MzhHSUFYRElCS0UwREh4Z2xqTkJBQU85VFhMMFk0T0h3QUFBQUJKUlU1RXJrSmdnZz09XSBiYXIiKTsKCiAgTVQoInZhbmlsbGFMaW5rUHVuY3R1YXRpb24iLAogICAgICJmb28gW2xpbmsgaHR0cDovL3d3dy5leGFtcGxlLmNvbS9dLiBiYXIiKTsKCiAgTVQoInZhbmlsbGFMaW5rRXh0ZW5zaW9uIiwKICAgICAiZm9vIFtsaW5rIGh0dHA6Ly93d3cuZXhhbXBsZS5jb20vaW5kZXguaHRtbF0gYmFyIik7CgogIE1UKCJ2YW5pbGxhTGlua0VtcGhhc2lzIiwKICAgICAiZm9vIFtlbSAqXVtlbSZsaW5rIGh0dHA6Ly93d3cuZXhhbXBsZS5jb20vaW5kZXguaHRtbF1bZW0gKl0gYmFyIik7CgogIE1UKCJub3RBTGluayIsCiAgICAgImZvbyBhc2ZkOmFzZGYgYmFyIik7CgogIE1UKCJub3RBTGluayIsCiAgICAgIltjb21tZW50IGBgYGNzc10iLAogICAgICJbdGFnIGZvb10ge1twcm9wZXJ0eSBjb2xvcl06W2tleXdvcmQgYmxhY2tdO30iLAogICAgICJbY29tbWVudCBgYGBdW2xpbmsgaHR0cDovL3d3dy5leGFtcGxlLmNvbS9dIik7CgogIE1UKCJub3RBTGluayIsCiAgICAgIltjb21tZW50IGBgZm9vIGBiYXJgIGh0dHA6Ly93d3cuZXhhbXBsZS5jb20vYGBdIGhlbGxvIik7CgogIE1UKCJub3RBTGluayIsCiAgICAgIltjb21tZW50IGBmb29dIiwKICAgICAiW2NvbW1lbnQmbGluayBodHRwOi8vd3d3LmV4YW1wbGUuY29tL10iLAogICAgICJbY29tbWVudCBgXSBmb28iLAogICAgICIiLAogICAgICJbbGluayBodHRwOi8vd3d3LmV4YW1wbGUuY29tL10iKTsKCiAgTVQoImhlYWRlckNvZGVCbG9ja0dpdGh1YiIsCiAgICAgIltoZWFkZXImaGVhZGVyLTEgIyBoZWFkaW5nXSIsCiAgICAgIiIsCiAgICAgIltjb21tZW50IGBgYF0iLAogICAgICJbY29tbWVudCBjb2RlXSIsCiAgICAgIltjb21tZW50IGBgYF0iLAogICAgICIiLAogICAgICJDb21taXQ6IFtsaW5rIGJlNmE4Y2MxYzFlY2ZlOTQ4OWZiNTFlNDg2OWFmMTVhMTNmYzJjZDJdIiwKICAgICAiSXNzdWU6IFtsaW5rICMxXSIsCiAgICAgIkxpbms6IFtsaW5rIGh0dHA6Ly93d3cuZXhhbXBsZS5jb20vXSIpOwoKICBNVCgic3RyaWtldGhyb3VnaCIsCiAgICAgIltzdHJpa2V0aHJvdWdoIH5+Zm9vfn5dIik7CgogIE1UKCJzdHJpa2V0aHJvdWdoV2l0aFN0YXJ0aW5nU3BhY2UiLAogICAgICJ+fiBmb29+fiIpOwoKICBNVCgic3RyaWtldGhyb3VnaFVuY2xvc2VkU3RyYXlUaWxkZXMiLAogICAgIltzdHJpa2V0aHJvdWdoIH5+Zm9vfn5+XSIpOwoKICBNVCgic3RyaWtldGhyb3VnaFVuY2xvc2VkU3RyYXlUaWxkZXMiLAogICAgICJbc3RyaWtldGhyb3VnaCB+fmZvbyB+fl0iKTsKCiAgTVQoInN0cmlrZXRocm91Z2hVbmNsb3NlZFN0cmF5VGlsZGVzIiwKICAgICJbc3RyaWtldGhyb3VnaCB+fmZvbyB+fiBiYXJdIik7CgogIE1UKCJzdHJpa2V0aHJvdWdoVW5jbG9zZWRTdHJheVRpbGRlcyIsCiAgICAiW3N0cmlrZXRocm91Z2ggfn5mb28gfn4gYmFyfn5daGVsbG8iKTsKCiAgTVQoInN0cmlrZXRocm91Z2hPbmVMZXR0ZXIiLAogICAgICJbc3RyaWtldGhyb3VnaCB+fmF+fl0iKTsKCiAgTVQoInN0cmlrZXRocm91Z2hXcmFwcGVkIiwKICAgICAiW3N0cmlrZXRocm91Z2ggfn5mb29dIiwKICAgICAiW3N0cmlrZXRocm91Z2ggZm9vfn5dIik7CgogIE1UKCJzdHJpa2V0aHJvdWdoUGFyYWdyYXBoIiwKICAgICAiW3N0cmlrZXRocm91Z2ggfn5mb29dIiwKICAgICAiIiwKICAgICAiZm9vW3N0cmlrZXRocm91Z2ggfn5iYXJdIik7CgogIE1UKCJzdHJpa2V0aHJvdWdoRW0iLAogICAgICJbc3RyaWtldGhyb3VnaCB+fmZvb11bZW0mc3RyaWtldGhyb3VnaCAqYmFyKl1bc3RyaWtldGhyb3VnaCB+fl0iKTsKCiAgTVQoInN0cmlrZXRocm91Z2hFbSIsCiAgICAgIltlbSAqXVtlbSZzdHJpa2V0aHJvdWdoIH5+Zm9vfn5dW2VtICpdIik7CgogIE1UKCJzdHJpa2V0aHJvdWdoU3Ryb25nIiwKICAgICAiW3N0cmlrZXRocm91Z2ggfn5dW3N0cm9uZyZzdHJpa2V0aHJvdWdoICoqZm9vKipdW3N0cmlrZXRocm91Z2ggfn5dIik7CgogIE1UKCJzdHJpa2V0aHJvdWdoU3Ryb25nIiwKICAgICAiW3N0cm9uZyAqKl1bc3Ryb25nJnN0cmlrZXRocm91Z2ggfn5mb29+fl1bc3Ryb25nICoqXSIpOwoKfSkoKTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/gherkin/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/gherkin/gherkin.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovKgpHaGVya2luIG1vZGUgLSBodHRwOi8vd3d3LmN1a2VzLmluZm8vClJlcG9ydCBidWdzL2lzc3VlcyBoZXJlOiBodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9Db2RlTWlycm9yL2lzc3VlcwoqLwoKLy8gRm9sbG93aW5nIE9ianMgZnJvbSBCcmFja2V0cyBpbXBsZW1lbnRhdGlvbjogaHR0cHM6Ly9naXRodWIuY29tL3RyZWd1c3RpL2JyYWNrZXRzLWdoZXJraW4vYmxvYi9tYXN0ZXIvbWFpbi5qcwovL3ZhciBRdW90ZXMgPSB7Ci8vICBTSU5HTEU6IDEsCi8vICBET1VCTEU6IDIKLy99OwoKLy92YXIgcmVnZXggPSB7Ci8vICBrZXl3b3JkczogLyhGZWF0dXJlfCB7Mn0oU2NlbmFyaW98SW4gb3JkZXIgdG98QXN8SSl8IHs0fShHaXZlbnxXaGVufFRoZW58QW5kKSkvCi8vfTsKCihmdW5jdGlvbihtb2QpIHsKICBpZiAodHlwZW9mIGV4cG9ydHMgPT0gIm9iamVjdCIgJiYgdHlwZW9mIG1vZHVsZSA9PSAib2JqZWN0IikgLy8gQ29tbW9uSlMKICAgIG1vZChyZXF1aXJlKCIuLi8uLi9saWIvY29kZW1pcnJvciIpKTsKICBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCkgLy8gQU1ECiAgICBkZWZpbmUoWyIuLi8uLi9saWIvY29kZW1pcnJvciJdLCBtb2QpOwogIGVsc2UgLy8gUGxhaW4gYnJvd3NlciBlbnYKICAgIG1vZChDb2RlTWlycm9yKTsKfSkoZnVuY3Rpb24oQ29kZU1pcnJvcikgewoidXNlIHN0cmljdCI7CgpDb2RlTWlycm9yLmRlZmluZU1vZGUoImdoZXJraW4iLCBmdW5jdGlvbiAoKSB7CiAgcmV0dXJuIHsKICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uICgpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBsaW5lTnVtYmVyOiAwLAogICAgICAgIHRhYmxlSGVhZGVyTGluZTogZmFsc2UsCiAgICAgICAgYWxsb3dGZWF0dXJlOiB0cnVlLAogICAgICAgIGFsbG93QmFja2dyb3VuZDogZmFsc2UsCiAgICAgICAgYWxsb3dTY2VuYXJpbzogZmFsc2UsCiAgICAgICAgYWxsb3dTdGVwczogZmFsc2UsCiAgICAgICAgYWxsb3dQbGFjZWhvbGRlcnM6IGZhbHNlLAogICAgICAgIGFsbG93TXVsdGlsaW5lQXJndW1lbnQ6IGZhbHNlLAogICAgICAgIGluTXVsdGlsaW5lU3RyaW5nOiBmYWxzZSwKICAgICAgICBpbk11bHRpbGluZVRhYmxlOiBmYWxzZSwKICAgICAgICBpbktleXdvcmRMaW5lOiBmYWxzZQogICAgICB9OwogICAgfSwKICAgIHRva2VuOiBmdW5jdGlvbiAoc3RyZWFtLCBzdGF0ZSkgewogICAgICBpZiAoc3RyZWFtLnNvbCgpKSB7CiAgICAgICAgc3RhdGUubGluZU51bWJlcisrOwogICAgICAgIHN0YXRlLmluS2V5d29yZExpbmUgPSBmYWxzZTsKICAgICAgICBpZiAoc3RhdGUuaW5NdWx0aWxpbmVUYWJsZSkgewogICAgICAgICAgICBzdGF0ZS50YWJsZUhlYWRlckxpbmUgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKCFzdHJlYW0ubWF0Y2goL1xzKlx8LywgZmFsc2UpKSB7CiAgICAgICAgICAgICAgc3RhdGUuYWxsb3dNdWx0aWxpbmVBcmd1bWVudCA9IGZhbHNlOwogICAgICAgICAgICAgIHN0YXRlLmluTXVsdGlsaW5lVGFibGUgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgc3RyZWFtLmVhdFNwYWNlKCk7CgogICAgICBpZiAoc3RhdGUuYWxsb3dNdWx0aWxpbmVBcmd1bWVudCkgewoKICAgICAgICAvLyBTVFJJTkcKICAgICAgICBpZiAoc3RhdGUuaW5NdWx0aWxpbmVTdHJpbmcpIHsKICAgICAgICAgIGlmIChzdHJlYW0ubWF0Y2goJyIiIicpKSB7CiAgICAgICAgICAgIHN0YXRlLmluTXVsdGlsaW5lU3RyaW5nID0gZmFsc2U7CiAgICAgICAgICAgIHN0YXRlLmFsbG93TXVsdGlsaW5lQXJndW1lbnQgPSBmYWxzZTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHN0cmVhbS5tYXRjaCgvLiovKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiAic3RyaW5nIjsKICAgICAgICB9CgogICAgICAgIC8vIFRBQkxFCiAgICAgICAgaWYgKHN0YXRlLmluTXVsdGlsaW5lVGFibGUpIHsKICAgICAgICAgIGlmIChzdHJlYW0ubWF0Y2goL1x8XHMqLykpIHsKICAgICAgICAgICAgcmV0dXJuICJicmFja2V0IjsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHN0cmVhbS5tYXRjaCgvW15cfF0qLyk7CiAgICAgICAgICAgIHJldHVybiBzdGF0ZS50YWJsZUhlYWRlckxpbmUgPyAiaGVhZGVyIiA6ICJzdHJpbmciOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gREVURUNUIFNUQVJUCiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgnIiIiJykpIHsKICAgICAgICAgIC8vIFN0cmluZwogICAgICAgICAgc3RhdGUuaW5NdWx0aWxpbmVTdHJpbmcgPSB0cnVlOwogICAgICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLm1hdGNoKCJ8IikpIHsKICAgICAgICAgIC8vIFRhYmxlCiAgICAgICAgICBzdGF0ZS5pbk11bHRpbGluZVRhYmxlID0gdHJ1ZTsKICAgICAgICAgIHN0YXRlLnRhYmxlSGVhZGVyTGluZSA9IHRydWU7CiAgICAgICAgICByZXR1cm4gImJyYWNrZXQiOwogICAgICAgIH0KCiAgICAgIH0KCiAgICAgIC8vIExJTkUgQ09NTUVOVAogICAgICBpZiAoc3RyZWFtLm1hdGNoKC8jLiovKSkgewogICAgICAgIHJldHVybiAiY29tbWVudCI7CgogICAgICAvLyBUQUcKICAgICAgfSBlbHNlIGlmICghc3RhdGUuaW5LZXl3b3JkTGluZSAmJiBzdHJlYW0ubWF0Y2goL0BcUysvKSkgewogICAgICAgIHJldHVybiAidGFnIjsKCiAgICAgIC8vIEZFQVRVUkUKICAgICAgfSBlbHNlIGlmICghc3RhdGUuaW5LZXl3b3JkTGluZSAmJiBzdGF0ZS5hbGxvd0ZlYXR1cmUgJiYgc3RyZWFtLm1hdGNoKC8o5qmf6IO9fOWKn+iDvXzjg5XjgqPjg7zjg4Hjg6N86riw64qlfOC5guC4hOC4o+C4h+C4q+C4peC4seC4gXzguITguKfguLLguKHguKrguLLguKHguLLguKPguJZ84LiE4Lin4Liy4Lih4LiV4LmJ4Lit4LiH4LiB4Liy4Lij4LiX4Liy4LiH4LiY4Li44Lij4LiB4Li04LiIfOCyueCzhuCymuCzjeCymuCys3zgsJfgsYHgsKPgsK7gsYF84Kiu4KmB4Ki54Ki+4KiC4Kim4Kiw4Ki+fOCoqOColeCotiDgqKjgqYHgqLngqL7gqLB84KiW4Ki+4Ki44KmA4KiF4KikfOCksOClguCkqiDgpLLgpYfgpJZ82YjZkNuM2pjar9uMfNiu2KfYtdmK2Kl816rXm9eV16DXlHzQpNGD0L3QutGG0ZbQvtC90LDQu3zQpNGD0L3QutGG0LjRj3zQpNGD0L3QutGG0LjQvtC90LDQu9C90L7RgdGCfNCk0YPQvdC60YbQuNC+0L3QsNC7fNKu0LfQtdC90YfTmdC70LXQutC70LXQu9C10Lp80KHQstC+0LnRgdGC0LLQvnzQntGB0L7QsdC40L3QsHzQnNOp0LzQutC40L3Qu9C10Lp80JzQvtCz0YPRm9C90L7RgdGCfM6bzrXOuc+Ezr/Phc+BzrPOr86xfM6Uz4XOvc6xz4TPjM+EzrfPhM6xfFfFgmHFm2Npd2/Fm8SHfFZsYXN0bm9zxaV8VHJhanRvfFTDrW5oIG7Eg25nfFNhdnlixJd8UHJldHR5IG11Y2h8UG/FvmlhZGF2a2F8UG/FvmFkYXZla3xQb3RyemViYSBiaXpuZXNvd2F8w5Z6ZWxsaWt8T3NvYmluYXxPbWluYWlzdXVzfE9tYWR1c3xPSCBIQUl8TW9ndcSHbm9zdHxNb2d1Y25vc3R8SmVsbGVtesWRfEh3w6Z0fEh3YWV0fEZ1bnppb25hbGl0w6B8RnVua3Rpb25hbGl0w6lpdHxGdW5rdGlvbmFsaXTDpHR8RnVua2NqYXxGdW5rY2lvbmFsbm9zdHxGdW5rY2lvbmFsaXTEgXRlfEZ1bmtjaWF8RnVuZ3NpfEZ1bmN0aW9uYWxpdGVpdHxGdW5jyJtpb25hbGl0YXRlfEZ1bmPFo2lvbmFsaXRhdGV8RnVuY3Rpb25hbGl0YXRlfEZ1bmNpb25hbGl0YXR8RnVuY2lvbmFsaWRhZGV8Rm9uY3Rpb25uYWxpdMOpfEZpdHVyfEbEq8SNYXxGZWF0dXJlfEVpZ2lubGVpa2l8RWdlbnNrYXB8RWdlbnNrYWJ8Q2FyYWN0ZXLDrXN0aWNhfENhcmFjdGVyaXN0aWNhfEJ1c2luZXNzIE5lZWR8QXNwZWt0fEFyd2VkZHxBaG95IG1hdGV5IXxBYmlsaXR5KTovKSkgewogICAgICAgIHN0YXRlLmFsbG93U2NlbmFyaW8gPSB0cnVlOwogICAgICAgIHN0YXRlLmFsbG93QmFja2dyb3VuZCA9IHRydWU7CiAgICAgICAgc3RhdGUuYWxsb3dQbGFjZWhvbGRlcnMgPSBmYWxzZTsKICAgICAgICBzdGF0ZS5hbGxvd1N0ZXBzID0gZmFsc2U7CiAgICAgICAgc3RhdGUuYWxsb3dNdWx0aWxpbmVBcmd1bWVudCA9IGZhbHNlOwogICAgICAgIHN0YXRlLmluS2V5d29yZExpbmUgPSB0cnVlOwogICAgICAgIHJldHVybiAia2V5d29yZCI7CgogICAgICAvLyBCQUNLR1JPVU5ECiAgICAgIH0gZWxzZSBpZiAoIXN0YXRlLmluS2V5d29yZExpbmUgJiYgc3RhdGUuYWxsb3dCYWNrZ3JvdW5kICYmIHN0cmVhbS5tYXRjaCgvKOiDjOaZr3zrsLDqsr184LmB4LiZ4Lin4LiE4Li04LiUfOCyueCyv+CyqOCzjeCyqOCzhuCysuCzhnzgsKjgsYfgsKrgsKXgsY3gsK/gsIJ84Kiq4Ki/4Kib4KmL4KiV4KmcfOCkquClg+Ckt+CljeCkoOCkreClguCkruCkv3zYstmF24zZhtmHfNin2YTYrtmE2YHZitipfNeo16fXonzQotCw0YDQuNGFfNCf0YDQtdC00YvRgdGC0L7RgNC40Y980J/RgNC10LTQuNGB0YLQvtGA0LjRj3zQn9C+0LfQsNC00LjQvdCwfNCf0LXRgNC10LTRg9C80L7QstCwfNCe0YHQvdC+0LLQsHzQmtC+0L3RgtC10LrRgdGCfNCa0LXRgNC10Yh8zqXPgM+MzrLOsc64z4HOv3xaYcWCb8W8ZW5pYXxZb1wtaG9cLWhvfFRhdXN0YXxUYXVzdHxTaXR1xIFjaWphfFJlcmVmb25zfFBvemFkaW5hfFBvemFkaWV8UG96YWTDrXxPc25vdmF8TGF0YXIgQmVsYWthbmd8S29udGV4dHxLb250ZWtzdHN8S29udGVrc3Rhc3xLb250ZWtzdHxIw6F0dMOpcnxIYW5uZXJncm9uZHxHcnVuZGxhZ2V8R2XDp21pxZ98RnVuZG98Rm9ub3xGaXJzdCBvZmZ8RGlzIGlzIHdoYXQgd2VudCBkb3dufERhc2FyfENvbnRleHRvfENvbnRleHRlfENvbnRleHR8Q29udGVzdG98Q2Vuw6FyaW8gZGUgRnVuZG98Q2VuYXJpbyBkZSBGdW5kb3xDZWZuZGlyfELhu5FpIGPhuqNuaHxCYWtncnVubnVyfEJha2dydW5ufEJha2dydW5kfEJhZ2dydW5kfEJhY2tncm91bmR8QjR8QW50ZWNlZGVudHN8QW50ZWNlZGVudGVzfMOGcnxBZXJ8QWNodGVyZ3JvbmQpOi8pKSB7CiAgICAgICAgc3RhdGUuYWxsb3dQbGFjZWhvbGRlcnMgPSBmYWxzZTsKICAgICAgICBzdGF0ZS5hbGxvd1N0ZXBzID0gdHJ1ZTsKICAgICAgICBzdGF0ZS5hbGxvd0JhY2tncm91bmQgPSBmYWxzZTsKICAgICAgICBzdGF0ZS5hbGxvd011bHRpbGluZUFyZ3VtZW50ID0gZmFsc2U7CiAgICAgICAgc3RhdGUuaW5LZXl3b3JkTGluZSA9IHRydWU7CiAgICAgICAgcmV0dXJuICJrZXl3b3JkIjsKCiAgICAgIC8vIFNDRU5BUklPIE9VVExJTkUKICAgICAgfSBlbHNlIGlmICghc3RhdGUuaW5LZXl3b3JkTGluZSAmJiBzdGF0ZS5hbGxvd1NjZW5hcmlvICYmIHN0cmVhbS5tYXRjaCgvKOWgtOaZr+Wkp+e2sXzlnLrmma/lpKfnurJ85YqH5pys5aSn57axfOWJp+acrOWkp+e6snzjg4bjg7Pjg5fjg6x844K344OK44Oq44Kq44OG44Oz44OX44Os44O844OIfOOCt+ODiuODquOCquODhuODs+ODl+ODrHzjgrfjg4rjg6rjgqrjgqLjgqbjg4jjg6njgqTjg7N87Iuc64KY66as7JikIOqwnOyalHzguKrguKPguLjguJvguYDguKvguJXguLjguIHguLLguKPguJPguYx84LmC4LiE4Lij4LiH4Liq4Lij4LmJ4Liy4LiH4LiC4Lit4LiH4LmA4Lir4LiV4Li44LiB4Liy4Lij4LiT4LmMfOCyteCyv+CyteCysOCyo+CzhnzgsJXgsKXgsKjgsIJ84Kiq4Kif4KiV4Kil4Ki+IOCosOCpguCoqiDgqLDgqYfgqJbgqL584Kiq4Kif4KiV4Kil4Ki+IOCoouCovuCoguComuCovnzgpKrgpLDgpL/gpKbgpYPgpLbgpY3gpK8g4KSw4KWC4KSq4KSw4KWH4KSW4KS+fNiz2YrZhtin2LHZitmIINmF2K7Yt9i3fNin2YTar9mI24wg2LPZhtin2LHbjNmIfNeq15HXoNeZ16og16rXqNeX15nXqXzQodGG0LXQvdCw0YDQuNC50L3Ri9KjINGC06nQt9C10LvQtdGI0LV80KHRhtC10L3QsNGA0LjQuSDRgdGC0YDRg9C60YLRg9GA0LDRgdC4fNCh0YLRgNGD0LrRgtGD0YDQsCDRgdGG0LXQvdCw0YDRltGOfNCh0YLRgNGD0LrRgtGD0YDQsCDRgdGG0LXQvdCw0YDQuNGPfNCh0YLRgNGD0LrRgtGD0YDQsCDRgdGG0LXQvdCw0YDQuNGY0LB80KHQutC40YbQsHzQoNCw0LzQutCwINC90LAg0YHRhtC10L3QsNGA0LjQuXzQmtC+0L3RhtC10L/RgnzOoM61z4HOuc6zz4HOsc+Gzq4gzqPOtc69zrHPgc6vzr/PhXxXaGFycmltZWFuIGlzfFRlbXBsYXRlIFNpdHVhaXxUZW1wbGF0ZSBTZW5hcmlvfFRlbXBsYXRlIEtlYWRhYW58VGFwYXVzYWloaW98U3plbmFyaW9ncnVuZHJpc3N8U3phYmxvbiBzY2VuYXJpdXN6YXxTd2EgaHfDpnIgc3dhfFN3YSBod2FlciBzd2F8U3RydWt0dXJhIHNjZW5hcmlqYXxTdHJ1Y3R1csSDIHNjZW5hcml1fFN0cnVjdHVyYSBzY2VuYXJpdXxTa2ljYXxTa2VuYXJpbyBrb25zZXB8U2hpdmVyIG1lIHRpbWJlcnN8U2VuYXJ5byB0YXNsYcSfxLF8U2NoZW1hIGRlbGxvIHNjZW5hcmlvfFNjZW5hcmlvbWFsbHxTY2VuYXJpb21hbHxTY2VuYXJpbyBUZW1wbGF0ZXxTY2VuYXJpbyBPdXRsaW5lfFNjZW5hcmlvIEFtbGluZWxsb2x8U2NlbsSBcmlqcyBwxJNjIHBhcmF1Z2F8U2NlbmFyaWphdXMgxaFhYmxvbmFzfFJlY2tvbiBpdCdzIGxpa2V8UmFhbXN0c2VuYWFyaXVtfFBsYW5nIHZ1bSBTemVuYXJpb3xQbGFuIGR1IFNjw6luYXJpb3xQbGFuIGR1IHNjw6luYXJpb3xPc25vdmEgc2PDqW7DocWZZXxPc25vdmEgU2NlbsOhcmF8TsOhxI1ydCBTY2Vuw6FydXxOw6HEjXJ0IFNjw6luw6HFmWV8TsOhxI1ydCBTY2Vuw6FyYXxNSVNIVU4gU1JTTFl8TWVuZ2dhcmlza2FuIFNlbmFyaW98TMO9c2luZyBEw6ZtYXxMw71zaW5nIEF0YnVyw7BhcsOhc2FyfEtvbnR1cm8gZGUgbGEgc2NlbmFyb3xLb25jZXB0fEtodW5nIHTDrG5oIGh14buRbmd8S2h1bmcga+G7i2NoIGLhuqNufEZvcmdhdMOza8O2bnl2IHbDoXpsYXR8RXNxdWVtYSBkbyBDZW7DoXJpb3xFc3F1ZW1hIGRvIENlbmFyaW98RXNxdWVtYSBkZWwgZXNjZW5hcmlvfEVzcXVlbWEgZGUgbCdlc2NlbmFyaXxFc2Jvem8gZG8gZXNjZW5hcmlvfERlbGluZWHDp8OjbyBkbyBDZW7DoXJpb3xEZWxpbmVhY2FvIGRvIENlbmFyaW98QWxsIHknYWxsfEFic3RyYWt0IFNjZW5hcmlvfEFic3RyYWN0IFNjZW5hcmlvKTovKSkgewogICAgICAgIHN0YXRlLmFsbG93UGxhY2Vob2xkZXJzID0gdHJ1ZTsKICAgICAgICBzdGF0ZS5hbGxvd1N0ZXBzID0gdHJ1ZTsKICAgICAgICBzdGF0ZS5hbGxvd011bHRpbGluZUFyZ3VtZW50ID0gZmFsc2U7CiAgICAgICAgc3RhdGUuaW5LZXl3b3JkTGluZSA9IHRydWU7CiAgICAgICAgcmV0dXJuICJrZXl3b3JkIjsKCiAgICAgIC8vIEVYQU1QTEVTCiAgICAgIH0gZWxzZSBpZiAoc3RhdGUuYWxsb3dTY2VuYXJpbyAmJiBzdHJlYW0ubWF0Y2goLyjkvovlrZB85L6LfOOCteODs+ODl+ODq3zsmIh84LiK4Li44LiU4LiC4Lit4LiH4LmA4Lir4LiV4Li44LiB4Liy4Lij4LiT4LmMfOC4iuC4uOC4lOC4guC4reC4h+C4leC4seC4p+C4reC4ouC5iOC4suC4h3zgsongsqbgsr7gsrngsrDgsqPgs4bgspfgsrPgs4F84LCJ4LCm4LC+4LC54LCw4LCj4LCy4LGBfOCoieCopuCovuCoueCosOCoqOCovuCognzgpIngpKbgpL7gpLngpLDgpKN82YbZhdmI2YbZhyDZh9infNin2YXYq9mE2Kl815PXldeS157XkNeV16p80q7RgNC905nQutC705nRgHzQodGG0LXQvdCw0YDQuNGY0Lh80J/RgNC40LzQtdGA0Yt80J/RgNC40LzQtdGA0Lh80J/RgNC40LrQu9Cw0LTQuHzQnNC40YHQvtC70LvQsNGAfNCc0LjRgdCw0LvQu9Cw0YB8zqPOtc69zqzPgc65zrF8zqDOsc+BzrHOtM61zq/Os868zrHPhM6xfFlvdSdsbCB3YW5uYXxWb29yYmVlbGRlbnxWYXJpYW50YWl8VGFwYXVrc2V0fFNlIMO+ZXxTZSB0aGV8U2Ugw7BlfFNjZW5hcmlvc3xTY2VuYXJpaml8U2NlbmFyaWphaXxQcnp5a8WCYWR5fFByaW1qZXJpfFByaW1lcml8UMWZw61rbGFkeXxQcsOta2xhZHl8UGllbcSTcml8UMOpbGTDoWt8UGF2eXpkxb5pYWl8UGFyYXVnc3zDlnJuZWtsZXJ8SnVodHVtaWR8RXhlbXBsb3N8RXhlbXBsZXN8RXhlbXBsZXxFeGVtcGVsfEVYQU1QTFp8RXhhbXBsZXN8RXNlbXBpfEVuZ2hyZWlmZnRpYXV8RWt6ZW1wbG9qfEVrc2VtcGxlcnxFamVtcGxvc3xE4buvIGxp4buHdXxEZWFkIG1lbiB0ZWxsIG5vIHRhbGVzfETDpm1pfENvbnRvaHxDZW7DoXJpb3N8Q2VuYXJpb3N8QmVpc3BpbGxlcnxCZWlzcGllbGV8QXRidXLDsGFyw6FzaXIpOi8pKSB7CiAgICAgICAgc3RhdGUuYWxsb3dQbGFjZWhvbGRlcnMgPSBmYWxzZTsKICAgICAgICBzdGF0ZS5hbGxvd1N0ZXBzID0gdHJ1ZTsKICAgICAgICBzdGF0ZS5hbGxvd0JhY2tncm91bmQgPSBmYWxzZTsKICAgICAgICBzdGF0ZS5hbGxvd011bHRpbGluZUFyZ3VtZW50ID0gdHJ1ZTsKICAgICAgICByZXR1cm4gImtleXdvcmQiOwoKICAgICAgLy8gU0NFTkFSSU8KICAgICAgfSBlbHNlIGlmICghc3RhdGUuaW5LZXl3b3JkTGluZSAmJiBzdGF0ZS5hbGxvd1NjZW5hcmlvICYmIHN0cmVhbS5tYXRjaCgvKOWgtOaZr3zlnLrmma985YqH5pysfOWJp+acrHzjgrfjg4rjg6rjgqp87Iuc64KY66as7JikfOC5gOC4q+C4leC4uOC4geC4suC4o+C4k+C5jHzgspXgsqXgsr7gsrjgsr7gsrDgsr7gsoLgsrZ84LC44LCo4LGN4LCo4LC/4LC14LGH4LC24LCCfOCoquCon+ColeCopeCovnzgpKrgpLDgpL/gpKbgpYPgpLbgpY3gpK982LPZitmG2KfYsdmK2Yh82LPZhtin2LHbjNmIfNeq16jXl9eZ16l80KHRhtC10L3QsNGA0ZbQuXzQodGG0LXQvdCw0YDQuNC+fNCh0YbQtdC90LDRgNC40Ll80J/RgNC40LzQtdGAfM6jzrXOvc6sz4HOuc6/fFTDrG5oIGh14buRbmd8VGhlIHRoaW5nIG9mIGl0IGlzfFRhcGF1c3xTemVuYXJpb3xTd2F8U3RzZW5hYXJpdW18U2tlbmFyaW98U2l0dWFpfFNlbmFyeW98U2VuYXJpb3xTY2VuYXJvfFNjZW5hcml1c3p8U2NlbmFyaXV8U2PDqW5hcmlvfFNjZW5hcmlvfFNjZW5hcmlqdXN8U2NlbsSBcmlqc3xTY2VuYXJpanxTY2VuYXJpZXxTY8OpbsOhxZl8U2NlbsOhcnxQcmltZXJ8TUlTSFVOfEvhu4tjaCBi4bqjbnxLZWFkYWFufEhlYXZlIHRvfEZvcmdhdMOza8O2bnl2fEVzY2VuYXJpb3xFc2NlbmFyaXxDZW7DoXJpb3xDZW5hcmlvfEF3d3csIGxvb2sgbWF0ZXxBdGJ1csOwYXLDoXMpOi8pKSB7CiAgICAgICAgc3RhdGUuYWxsb3dQbGFjZWhvbGRlcnMgPSBmYWxzZTsKICAgICAgICBzdGF0ZS5hbGxvd1N0ZXBzID0gdHJ1ZTsKICAgICAgICBzdGF0ZS5hbGxvd0JhY2tncm91bmQgPSBmYWxzZTsKICAgICAgICBzdGF0ZS5hbGxvd011bHRpbGluZUFyZ3VtZW50ID0gZmFsc2U7CiAgICAgICAgc3RhdGUuaW5LZXl3b3JkTGluZSA9IHRydWU7CiAgICAgICAgcmV0dXJuICJrZXl3b3JkIjsKCiAgICAgIC8vIFNURVBTCiAgICAgIH0gZWxzZSBpZiAoIXN0YXRlLmluS2V5d29yZExpbmUgJiYgc3RhdGUuYWxsb3dTdGVwcyAmJiBzdHJlYW0ubWF0Y2goLyjpgqPpurx86YKj5LmIfOiAjOS4lHznlbZ85b2TfOW5tuS4lHzlkIzmmYJ85ZCM5pe2fOWJjeaPkHzlgYforr585YGH6KitfOWBh+WumnzlgYflpoJ85L2G5pivfOS9huOBl3zkuKbkuJR844KC44GXfOOBquOCieOBsHzjgZ/jgaDjgZd844GX44GL44GXfOOBi+OBpHztlZjsp4Drp4x87KGw6rG0fOuovOyggHzrp4zsnbx866eM7JW9fOuLqHzqt7jrpqzqs6B86re465+s66m0fOC5geC4peC4sCB84LmA4Lih4Li34LmI4LitIHzguYHguJXguYggfOC4lOC4seC4h+C4meC4seC5ieC4mSB84LiB4Liz4Lir4LiZ4LiU4LmD4Lir4LmJIHzgsrjgs43gsqXgsr/gsqTgsr/gsq/gsqjgs43gsqjgs4EgfOCyruCypOCzjeCypOCzgSB84LKo4LK/4LOV4LKh4LK/4LKmIHzgsqjgsoLgsqTgsrAgfOCyhuCypuCysOCzhiB84LCu4LCw4LC/4LCv4LGBIHzgsJrgsYbgsKrgsY3gsKrgsKzgsKHgsL/gsKjgsKbgsL8gfOCwleCwvuCwqOCwvyB84LCIIOCwquCwsOCwv+CwuOCxjeCwpeCwv+CwpOCwv+CwsuCxiyB84LCF4LCq4LGN4LCq4LGB4LCh4LGBIHzgqKrgqLAgfOCopOCopiB84Kic4KmH4KiV4KiwIHzgqJzgqL/gqLXgqYfgqIIg4KiV4Ki/IHzgqJzgqKbgqYvgqIIgfOCoheCopOCphyB84KSv4KSm4KS/IHzgpKrgpLDgpKjgpY3gpKTgpYEgfOCkquCksCB84KSk4KSsIHzgpKTgpKbgpL4gfOCkpOCkpeCkviB84KSc4KSsIHzgpJrgpYLgpILgpJXgpL8gfOCkleCkv+CkqOCljeCkpOClgSB84KSV4KSm4KS+IHzgpJTgpLAgfOCkheCkl+CksCB82YggfNmH2Ybar9in2YXbjCB82YXYqtmJIHzZhNmD2YYgfNi52YbYr9mF2KcgfNir2YUgfNio2YHYsdi2IHzYqNinINmB2LHYtiB82KfZhdinIHzYp9iw2KfZiyB82KLZhtqv2KfZhyB815vXkNep16ggfNeV15LXnSB815HXlNeZ16DXqtefIHzXkNeW15kgfNeQ15YgfNeQ15HXnCB80K/QutGJ0L4gfNK605nQvCB80KPQvdC00LAgfNCi0L7QtNGWIHzQotC+0LPQtNCwIHzQotC+IHzQotCw0LrQttC1IHzQotCwIHzQn9GD0YHRgtGMIHzQn9GA0LjQv9GD0YHRgtC40LzQviwg0YnQviB80J/RgNC40L/Rg9GB0YLQuNC80L4gfNCe0L3QtNCwIHzQndC+IHzQndC10YXQsNC5IHzQndOZ0YLQuNKX05nQtNOZIHzQm9C10LrQuNC9IHzQm9OZ0LrQuNC9IHzQmtC+0LvQuCB80JrQvtCz0LTQsCB80JrQvtCz0LDRgtC+IHzQmtCw0LTQsCB80JrQsNC0IHzQmiDRgtC+0LzRgyDQttC1IHzQhiB80JggfNCX0LDQtNCw0YLQviB80JfQsNC00LDRgtC4IHzQl9Cw0LTQsNGC0LUgfNCV0YHQu9C4IHzQlNC+0L/Rg9GB0YLQuNC8IHzQlNCw0L3QviB80JTQsNC00LXQvdC+IHzQktOZIHzQktCwIHzQkdC40YDQvtC6IHzTmNC80LzQsCB805jQudGC0LjQuiB805jQs9OZ0YAgfNCQ0LzQvNC+IHzQkNC70LggfNCQ0LvQtSB80JDQs9Cw0YAgfNCQINGC0LDQutC+0LYgfNCQIHzOpM+Mz4TOtSB8zozPhM6xzr0gfM6azrHOuSB8zpTOtc60zr/OvM6tzr3Ov8+FIHzOkc67zrvOrCB8w551cmggfMOeZWdhciB8w55hIMO+ZSB8w57DoSB8w55hIHxaYXRhdGkgfFpha8WCYWRhasSFYyB8WmFkYXRvIHxaYWRhdGUgfFphZGFubyB8WmFkYW5pIHxaYWRhbiB8WmEgcMWZZWRwb2tsYWR1IHxaYSBwcmVkcG9rbGFkdSB8WW91c2Uga25vdyB3aGVuIHlvdXNlIGdvdCB8WW91c2Uga25vdyBsaWtlIHdoZW4gfFluYSB8WWVhaCBuYWggfFkna25vdyB8WSB8V3VuIHxXdGVkeSB8V2hlbiB5J2FsbCB8V2hlbiB8V2VubiB8V0VOIHx3YW5uIHxWZSB8VsOgIHxVbmQgfFVuIHx1Z2Vob2xsIHxUb28gcmlnaHQgfFRodXJoIHxUaMOsIHxUaGVuIHknYWxsIHxUaGVuIHxUaGEgdGhlIHxUaGEgfFRldGFwaSB8VGFwaSB8VGFrIHxUYWRhIHxUYWQgfFN0ZWwgfFNvaXQgfFNpaXMgfMiYaSB8xZ5pIHxTaSB8U2VkIHxTZSB8U8OlIHxRdWFuZG8gfFF1YW5kIHxRdWFuIHxQcnlkIHxQb3RvbSB8UG9rdWQgfFBva2lhxL4gfFBlcsOyIHxQZXJvIHxQYWsgfE9yYXogfE9uZGEgfE9uZCB8T2xldGV0YWFuIHxPZyB8T2NoIHxPIHphbWFuIHxOaWluIHxOaMawbmcgfE7DpHIgfE7DpXIgfE11dHRhIHxNZW4gfE1hcyB8TWFrYSB8TWFqZCB8TWFqxIVjIHxNYWlzIHxNYWFyIHxtw6QgfE1hIHxMb3JzcXVlIHxMb3JzcXUnfExvZ28gfExldCBnbyBhbmQgaGF1bCB8S3VuIHxLdWlkIHxLdWkgfEtpZWR5IHxLaGkgfEtldGlrYSB8S2VtdWRpYW4gfEtlxI8gfEtkecW+IHxLYWogfEthaSB8S2FkYSB8S2FkIHxKZcW8ZWxpIHxKZcWbbGkgfEphIHxJdCdzIGp1c3QgdW5iZWxpZXZhYmxlIHxJciB8SSBDQU4gSEFaIHxJIHxIYSB8R2l2dW4gfEdpdmV0IHxHaXZlbiB5J2FsbCB8R2l2ZW4gfEdpdHQgfEdlZ2V2ZW4gfEdlZ2ViZW4gc2VpZW4gfEdlZ2ViZW4gc2VpIHxHZHkgfEdhbmd3YXkhIHxGYWthdCB8w4l0YW50IGRvbm7DqXMgfEV0YW50IGRvbm7DqXMgfMOJdGFudCBkb25uw6llcyB8RXRhbnQgZG9ubsOpZXMgfMOJdGFudCBkb25uw6llIHxFdGFudCBkb25uw6llIHzDiXRhbnQgZG9ubsOpIHxFdGFudCBkb25uw6kgfEV0IHzDiXMgfEVudG9uY2VzIHxFbnTDs24gfEVudMOjbyB8RW50YW8gfEVuIHxFxJ9lciBraSB8RWYgfEVlbGRhZGVzIHxFIHzDkHVyaCB8RHVvdGEgfER1biB8RG9uaXRhxLVvIHxEb25hdCB8RG9uYWRhIHxEbyB8RGl5ZWxpbSBraSB8RGliZXJpIHxEZW5nYW4gfERlbiB5b3VzZSBnb3R0YSB8REVOIHxEZSB8RGF0byB8RGHIm2kgZmlpbmQgfERhxaNpIGZpaW5kIHxEYXRpIGZpaW5kIHxEYXRpIHxEYXRlIGZpaW5kIHxEYXRlIHxEYXRhIHxEYXQgZmlpbmQgfERhciB8RGFubiB8ZGFubiB8RGFuIHxEYWRvcyB8RGFkbyB8RGFkYXMgfERhZGEgfMOQYSDDsGUgfMOQYSB8Q3VhbmRvIHxDaG8gfENhbmRvIHxDw6JuZCB8Q2FuZCB8Q2FsIHxCdXQgeSdhbGwgfEJ1dCBhdCB0aGUgZW5kIG9mIHRoZSBkYXkgSSByZWNrb24gfEJVVCB8QnV0IHxCdWggfEJsaW1leSEgfEJp4bq/dCB8QmV0IHxCYWdpIHxBeWUgfGF3ZXIgfEF2YXN0ISB8QXR1bmNpIHxBdGVzYSB8QXTDqHMgfEFwYWJpbGEgfEFucmhlZ2VkaWcgYSB8QW5nZW5vbW1lbiB8QW5kIHknYWxsIHxBbmQgfEFOIHxBbiB8YW4gfEFtaWtvciB8QW1lbm55aWJlbiB8QW1hIHxBbHMgfEFsb3JzIHxBbGxvcmEgfEFsaSB8QWxlc2hvcmVzIHxBbGUgfEFra29yIHxBayB8QWRvdHQgfEFjIHxBYmVyIHxBIHrDoXJvdmXFiCB8QSB0aWXFviB8QSB0YWt0aWXFviB8QSB0YWvDqSB8QSB8YSB8NyB8XCogKS8pKSB7CiAgICAgICAgc3RhdGUuaW5TdGVwID0gdHJ1ZTsKICAgICAgICBzdGF0ZS5hbGxvd1BsYWNlaG9sZGVycyA9IHRydWU7CiAgICAgICAgc3RhdGUuYWxsb3dNdWx0aWxpbmVBcmd1bWVudCA9IHRydWU7CiAgICAgICAgc3RhdGUuaW5LZXl3b3JkTGluZSA9IHRydWU7CiAgICAgICAgcmV0dXJuICJrZXl3b3JkIjsKCiAgICAgIC8vIElOTElORSBTVFJJTkcKICAgICAgfSBlbHNlIGlmIChzdHJlYW0ubWF0Y2goLyJbXiJdKiI/LykpIHsKICAgICAgICByZXR1cm4gInN0cmluZyI7CgogICAgICAvLyBQTEFDRUhPTERFUgogICAgICB9IGVsc2UgaWYgKHN0YXRlLmFsbG93UGxhY2Vob2xkZXJzICYmIHN0cmVhbS5tYXRjaCgvPFtePl0qPj8vKSkgewogICAgICAgIHJldHVybiAidmFyaWFibGUiOwoKICAgICAgLy8gRmFsbCB0aHJvdWdoCiAgICAgIH0gZWxzZSB7CiAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1teQCI8I10vKTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgfQogIH07Cn0pOwoKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtZmVhdHVyZSIsICJnaGVya2luIik7Cgp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/gherkin/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogR2hlcmtpbiBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9ImdoZXJraW4uanMiPjwvc2NyaXB0Pgo8c3R5bGU+LkNvZGVNaXJyb3IgeyBib3JkZXItdG9wOiAxcHggc29saWQgI2RkZDsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkZGQ7IH08L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxoMT5Db2RlTWlycm9yPC9oMT48aW1nIGlkPWxvZ28gc3JjPSIuLi8uLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5MYW5ndWFnZSBtb2RlczwvYT4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+R2hlcmtpbjwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+R2hlcmtpbiBtb2RlPC9oMj4KPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KRmVhdHVyZTogVXNpbmcgR29vZ2xlCiAgQmFja2dyb3VuZDogCiAgICBTb21ldGhpbmcgc29tZXRoaW5nCiAgICBTb21ldGhpbmcgZWxzZQogIFNjZW5hcmlvOiBIYXMgYSBob21lcGFnZQogICAgV2hlbiBJIG5hdmlnYXRlIHRvIHRoZSBnb29nbGUgaG9tZSBwYWdlCiAgICBUaGVuIHRoZSBob21lIHBhZ2Ugc2hvdWxkIGNvbnRhaW4gdGhlIG1lbnUgYW5kIHRoZSBzZWFyY2ggZm9ybQogIFNjZW5hcmlvOiBTZWFyY2hpbmcgZm9yIGEgdGVybSAKICAgIFdoZW4gSSBuYXZpZ2F0ZSB0byB0aGUgZ29vZ2xlIGhvbWUgcGFnZQogICAgV2hlbiBJIHNlYXJjaCBmb3IgVG9mdQogICAgVGhlbiB0aGUgc2VhcmNoIHJlc3VsdHMgcGFnZSBpcyBkaXNwbGF5ZWQKICAgIFRoZW4gdGhlIHNlYXJjaCByZXN1bHRzIHBhZ2UgY29udGFpbnMgMTAgaW5kaXZpZHVhbCBzZWFyY2ggcmVzdWx0cwogICAgVGhlbiB0aGUgc2VhcmNoIHJlc3VsdHMgY29udGFpbiBhIGxpbmsgdG8gdGhlIHdpa2lwZWRpYSB0b2Z1IHBhZ2UKPC90ZXh0YXJlYT48L2Zvcm0+CiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwge30pOwogICAgPC9zY3JpcHQ+CgogICAgPHA+PHN0cm9uZz5NSU1FIHR5cGVzIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPnRleHQveC1mZWF0dXJlPC9jb2RlPi48L3A+CgogIDwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/go/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/go/go.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJnbyIsIGZ1bmN0aW9uKGNvbmZpZykgewogIHZhciBpbmRlbnRVbml0ID0gY29uZmlnLmluZGVudFVuaXQ7CgogIHZhciBrZXl3b3JkcyA9IHsKICAgICJicmVhayI6dHJ1ZSwgImNhc2UiOnRydWUsICJjaGFuIjp0cnVlLCAiY29uc3QiOnRydWUsICJjb250aW51ZSI6dHJ1ZSwKICAgICJkZWZhdWx0Ijp0cnVlLCAiZGVmZXIiOnRydWUsICJlbHNlIjp0cnVlLCAiZmFsbHRocm91Z2giOnRydWUsICJmb3IiOnRydWUsCiAgICAiZnVuYyI6dHJ1ZSwgImdvIjp0cnVlLCAiZ290byI6dHJ1ZSwgImlmIjp0cnVlLCAiaW1wb3J0Ijp0cnVlLAogICAgImludGVyZmFjZSI6dHJ1ZSwgIm1hcCI6dHJ1ZSwgInBhY2thZ2UiOnRydWUsICJyYW5nZSI6dHJ1ZSwgInJldHVybiI6dHJ1ZSwKICAgICJzZWxlY3QiOnRydWUsICJzdHJ1Y3QiOnRydWUsICJzd2l0Y2giOnRydWUsICJ0eXBlIjp0cnVlLCAidmFyIjp0cnVlLAogICAgImJvb2wiOnRydWUsICJieXRlIjp0cnVlLCAiY29tcGxleDY0Ijp0cnVlLCAiY29tcGxleDEyOCI6dHJ1ZSwKICAgICJmbG9hdDMyIjp0cnVlLCAiZmxvYXQ2NCI6dHJ1ZSwgImludDgiOnRydWUsICJpbnQxNiI6dHJ1ZSwgImludDMyIjp0cnVlLAogICAgImludDY0Ijp0cnVlLCAic3RyaW5nIjp0cnVlLCAidWludDgiOnRydWUsICJ1aW50MTYiOnRydWUsICJ1aW50MzIiOnRydWUsCiAgICAidWludDY0Ijp0cnVlLCAiaW50Ijp0cnVlLCAidWludCI6dHJ1ZSwgInVpbnRwdHIiOnRydWUsICJlcnJvciI6IHRydWUKICB9OwoKICB2YXIgYXRvbXMgPSB7CiAgICAidHJ1ZSI6dHJ1ZSwgImZhbHNlIjp0cnVlLCAiaW90YSI6dHJ1ZSwgIm5pbCI6dHJ1ZSwgImFwcGVuZCI6dHJ1ZSwKICAgICJjYXAiOnRydWUsICJjbG9zZSI6dHJ1ZSwgImNvbXBsZXgiOnRydWUsICJjb3B5Ijp0cnVlLCAiaW1hZyI6dHJ1ZSwKICAgICJsZW4iOnRydWUsICJtYWtlIjp0cnVlLCAibmV3Ijp0cnVlLCAicGFuaWMiOnRydWUsICJwcmludCI6dHJ1ZSwKICAgICJwcmludGxuIjp0cnVlLCAicmVhbCI6dHJ1ZSwgInJlY292ZXIiOnRydWUKICB9OwoKICB2YXIgaXNPcGVyYXRvckNoYXIgPSAvWytcLSomXiU6PTw+IXxcL10vOwoKICB2YXIgY3VyUHVuYzsKCiAgZnVuY3Rpb24gdG9rZW5CYXNlKHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBjaCA9IHN0cmVhbS5uZXh0KCk7CiAgICBpZiAoY2ggPT0gJyInIHx8IGNoID09ICInIiB8fCBjaCA9PSAiYCIpIHsKICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlblN0cmluZyhjaCk7CiAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgIH0KICAgIGlmICgvW1xkXC5dLy50ZXN0KGNoKSkgewogICAgICBpZiAoY2ggPT0gIi4iKSB7CiAgICAgICAgc3RyZWFtLm1hdGNoKC9eWzAtOV0rKFtlRV1bXC0rXT9bMC05XSspPy8pOwogICAgICB9IGVsc2UgaWYgKGNoID09ICIwIikgewogICAgICAgIHN0cmVhbS5tYXRjaCgvXlt4WF1bMC05YS1mQS1GXSsvKSB8fCBzdHJlYW0ubWF0Y2goL14wWzAtN10rLyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc3RyZWFtLm1hdGNoKC9eWzAtOV0qXC4/WzAtOV0qKFtlRV1bXC0rXT9bMC05XSspPy8pOwogICAgICB9CiAgICAgIHJldHVybiAibnVtYmVyIjsKICAgIH0KICAgIGlmICgvW1xbXF17fVwoXCksO1w6XC5dLy50ZXN0KGNoKSkgewogICAgICBjdXJQdW5jID0gY2g7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgaWYgKGNoID09ICIvIikgewogICAgICBpZiAoc3RyZWFtLmVhdCgiKiIpKSB7CiAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkNvbW1lbnQ7CiAgICAgICAgcmV0dXJuIHRva2VuQ29tbWVudChzdHJlYW0sIHN0YXRlKTsKICAgICAgfQogICAgICBpZiAoc3RyZWFtLmVhdCgiLyIpKSB7CiAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICAgIHJldHVybiAiY29tbWVudCI7CiAgICAgIH0KICAgIH0KICAgIGlmIChpc09wZXJhdG9yQ2hhci50ZXN0KGNoKSkgewogICAgICBzdHJlYW0uZWF0V2hpbGUoaXNPcGVyYXRvckNoYXIpOwogICAgICByZXR1cm4gIm9wZXJhdG9yIjsKICAgIH0KICAgIHN0cmVhbS5lYXRXaGlsZSgvW1x3XCRfXHhhMS1cdWZmZmZdLyk7CiAgICB2YXIgY3VyID0gc3RyZWFtLmN1cnJlbnQoKTsKICAgIGlmIChrZXl3b3Jkcy5wcm9wZXJ0eUlzRW51bWVyYWJsZShjdXIpKSB7CiAgICAgIGlmIChjdXIgPT0gImNhc2UiIHx8IGN1ciA9PSAiZGVmYXVsdCIpIGN1clB1bmMgPSAiY2FzZSI7CiAgICAgIHJldHVybiAia2V5d29yZCI7CiAgICB9CiAgICBpZiAoYXRvbXMucHJvcGVydHlJc0VudW1lcmFibGUoY3VyKSkgcmV0dXJuICJhdG9tIjsKICAgIHJldHVybiAidmFyaWFibGUiOwogIH0KCiAgZnVuY3Rpb24gdG9rZW5TdHJpbmcocXVvdGUpIHsKICAgIHJldHVybiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHZhciBlc2NhcGVkID0gZmFsc2UsIG5leHQsIGVuZCA9IGZhbHNlOwogICAgICB3aGlsZSAoKG5leHQgPSBzdHJlYW0ubmV4dCgpKSAhPSBudWxsKSB7CiAgICAgICAgaWYgKG5leHQgPT0gcXVvdGUgJiYgIWVzY2FwZWQpIHtlbmQgPSB0cnVlOyBicmVhazt9CiAgICAgICAgZXNjYXBlZCA9ICFlc2NhcGVkICYmIHF1b3RlICE9ICJgIiAmJiBuZXh0ID09ICJcXCI7CiAgICAgIH0KICAgICAgaWYgKGVuZCB8fCAhKGVzY2FwZWQgfHwgcXVvdGUgPT0gImAiKSkKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTsKICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgfTsKICB9CgogIGZ1bmN0aW9uIHRva2VuQ29tbWVudChzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgbWF5YmVFbmQgPSBmYWxzZSwgY2g7CiAgICB3aGlsZSAoY2ggPSBzdHJlYW0ubmV4dCgpKSB7CiAgICAgIGlmIChjaCA9PSAiLyIgJiYgbWF5YmVFbmQpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBtYXliZUVuZCA9IChjaCA9PSAiKiIpOwogICAgfQogICAgcmV0dXJuICJjb21tZW50IjsKICB9CgogIGZ1bmN0aW9uIENvbnRleHQoaW5kZW50ZWQsIGNvbHVtbiwgdHlwZSwgYWxpZ24sIHByZXYpIHsKICAgIHRoaXMuaW5kZW50ZWQgPSBpbmRlbnRlZDsKICAgIHRoaXMuY29sdW1uID0gY29sdW1uOwogICAgdGhpcy50eXBlID0gdHlwZTsKICAgIHRoaXMuYWxpZ24gPSBhbGlnbjsKICAgIHRoaXMucHJldiA9IHByZXY7CiAgfQogIGZ1bmN0aW9uIHB1c2hDb250ZXh0KHN0YXRlLCBjb2wsIHR5cGUpIHsKICAgIHJldHVybiBzdGF0ZS5jb250ZXh0ID0gbmV3IENvbnRleHQoc3RhdGUuaW5kZW50ZWQsIGNvbCwgdHlwZSwgbnVsbCwgc3RhdGUuY29udGV4dCk7CiAgfQogIGZ1bmN0aW9uIHBvcENvbnRleHQoc3RhdGUpIHsKICAgIGlmICghc3RhdGUuY29udGV4dC5wcmV2KSByZXR1cm47CiAgICB2YXIgdCA9IHN0YXRlLmNvbnRleHQudHlwZTsKICAgIGlmICh0ID09ICIpIiB8fCB0ID09ICJdIiB8fCB0ID09ICJ9IikKICAgICAgc3RhdGUuaW5kZW50ZWQgPSBzdGF0ZS5jb250ZXh0LmluZGVudGVkOwogICAgcmV0dXJuIHN0YXRlLmNvbnRleHQgPSBzdGF0ZS5jb250ZXh0LnByZXY7CiAgfQoKICAvLyBJbnRlcmZhY2UKCiAgcmV0dXJuIHsKICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKGJhc2Vjb2x1bW4pIHsKICAgICAgcmV0dXJuIHsKICAgICAgICB0b2tlbml6ZTogbnVsbCwKICAgICAgICBjb250ZXh0OiBuZXcgQ29udGV4dCgoYmFzZWNvbHVtbiB8fCAwKSAtIGluZGVudFVuaXQsIDAsICJ0b3AiLCBmYWxzZSksCiAgICAgICAgaW5kZW50ZWQ6IDAsCiAgICAgICAgc3RhcnRPZkxpbmU6IHRydWUKICAgICAgfTsKICAgIH0sCgogICAgdG9rZW46IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgdmFyIGN0eCA9IHN0YXRlLmNvbnRleHQ7CiAgICAgIGlmIChzdHJlYW0uc29sKCkpIHsKICAgICAgICBpZiAoY3R4LmFsaWduID09IG51bGwpIGN0eC5hbGlnbiA9IGZhbHNlOwogICAgICAgIHN0YXRlLmluZGVudGVkID0gc3RyZWFtLmluZGVudGF0aW9uKCk7CiAgICAgICAgc3RhdGUuc3RhcnRPZkxpbmUgPSB0cnVlOwogICAgICAgIGlmIChjdHgudHlwZSA9PSAiY2FzZSIpIGN0eC50eXBlID0gIn0iOwogICAgICB9CiAgICAgIGlmIChzdHJlYW0uZWF0U3BhY2UoKSkgcmV0dXJuIG51bGw7CiAgICAgIGN1clB1bmMgPSBudWxsOwogICAgICB2YXIgc3R5bGUgPSAoc3RhdGUudG9rZW5pemUgfHwgdG9rZW5CYXNlKShzdHJlYW0sIHN0YXRlKTsKICAgICAgaWYgKHN0eWxlID09ICJjb21tZW50IikgcmV0dXJuIHN0eWxlOwogICAgICBpZiAoY3R4LmFsaWduID09IG51bGwpIGN0eC5hbGlnbiA9IHRydWU7CgogICAgICBpZiAoY3VyUHVuYyA9PSAieyIpIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0uY29sdW1uKCksICJ9Iik7CiAgICAgIGVsc2UgaWYgKGN1clB1bmMgPT0gIlsiKSBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLmNvbHVtbigpLCAiXSIpOwogICAgICBlbHNlIGlmIChjdXJQdW5jID09ICIoIikgcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbS5jb2x1bW4oKSwgIikiKTsKICAgICAgZWxzZSBpZiAoY3VyUHVuYyA9PSAiY2FzZSIpIGN0eC50eXBlID0gImNhc2UiOwogICAgICBlbHNlIGlmIChjdXJQdW5jID09ICJ9IiAmJiBjdHgudHlwZSA9PSAifSIpIGN0eCA9IHBvcENvbnRleHQoc3RhdGUpOwogICAgICBlbHNlIGlmIChjdXJQdW5jID09IGN0eC50eXBlKSBwb3BDb250ZXh0KHN0YXRlKTsKICAgICAgc3RhdGUuc3RhcnRPZkxpbmUgPSBmYWxzZTsKICAgICAgcmV0dXJuIHN0eWxlOwogICAgfSwKCiAgICBpbmRlbnQ6IGZ1bmN0aW9uKHN0YXRlLCB0ZXh0QWZ0ZXIpIHsKICAgICAgaWYgKHN0YXRlLnRva2VuaXplICE9IHRva2VuQmFzZSAmJiBzdGF0ZS50b2tlbml6ZSAhPSBudWxsKSByZXR1cm4gMDsKICAgICAgdmFyIGN0eCA9IHN0YXRlLmNvbnRleHQsIGZpcnN0Q2hhciA9IHRleHRBZnRlciAmJiB0ZXh0QWZ0ZXIuY2hhckF0KDApOwogICAgICBpZiAoY3R4LnR5cGUgPT0gImNhc2UiICYmIC9eKD86Y2FzZXxkZWZhdWx0KVxiLy50ZXN0KHRleHRBZnRlcikpIHsKICAgICAgICBzdGF0ZS5jb250ZXh0LnR5cGUgPSAifSI7CiAgICAgICAgcmV0dXJuIGN0eC5pbmRlbnRlZDsKICAgICAgfQogICAgICB2YXIgY2xvc2luZyA9IGZpcnN0Q2hhciA9PSBjdHgudHlwZTsKICAgICAgaWYgKGN0eC5hbGlnbikgcmV0dXJuIGN0eC5jb2x1bW4gKyAoY2xvc2luZyA/IDAgOiAxKTsKICAgICAgZWxzZSByZXR1cm4gY3R4LmluZGVudGVkICsgKGNsb3NpbmcgPyAwIDogaW5kZW50VW5pdCk7CiAgICB9LAoKICAgIGVsZWN0cmljQ2hhcnM6ICJ7fSk6IiwKICAgIGNsb3NlQnJhY2tldHM6ICIoKVtde30nJ1wiXCJgYCIsCiAgICBmb2xkOiAiYnJhY2UiLAogICAgYmxvY2tDb21tZW50U3RhcnQ6ICIvKiIsCiAgICBibG9ja0NvbW1lbnRFbmQ6ICIqLyIsCiAgICBsaW5lQ29tbWVudDogIi8vIgogIH07Cn0pOwoKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtZ28iLCAiZ28iKTsKCn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/go/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogR28gbW9kZTwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uLy4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vdGhlbWUvZWxlZ2FudC5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vLi4vYWRkb24vZWRpdC9tYXRjaGJyYWNrZXRzLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9ImdvLmpzIj48L3NjcmlwdD4KPHN0eWxlPi5Db2RlTWlycm9yIHtib3JkZXI6MXB4IHNvbGlkICM5OTk7IGJhY2tncm91bmQ6I2ZmY308L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxoMT5Db2RlTWlycm9yPC9oMT48aW1nIGlkPWxvZ28gc3JjPSIuLi8uLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5MYW5ndWFnZSBtb2RlczwvYT4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+R288L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPkdvIG1vZGU8L2gyPgo8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgovLyBQcmltZSBTaWV2ZSBpbiBHby4KLy8gVGFrZW4gZnJvbSB0aGUgR28gc3BlY2lmaWNhdGlvbi4KLy8gQ29weXJpZ2h0IMKpIFRoZSBHbyBBdXRob3JzLgoKcGFja2FnZSBtYWluCgppbXBvcnQgImZtdCIKCi8vIFNlbmQgdGhlIHNlcXVlbmNlIDIsIDMsIDQsIC4uLiB0byBjaGFubmVsICdjaCcuCmZ1bmMgZ2VuZXJhdGUoY2ggY2hhbiZsdDstIGludCkgewoJZm9yIGkgOj0gMjsgOyBpKysgewoJCWNoICZsdDstIGkgIC8vIFNlbmQgJ2knIHRvIGNoYW5uZWwgJ2NoJwoJfQp9CgovLyBDb3B5IHRoZSB2YWx1ZXMgZnJvbSBjaGFubmVsICdzcmMnIHRvIGNoYW5uZWwgJ2RzdCcsCi8vIHJlbW92aW5nIHRob3NlIGRpdmlzaWJsZSBieSAncHJpbWUnLgpmdW5jIGZpbHRlcihzcmMgJmx0Oy1jaGFuIGludCwgZHN0IGNoYW4mbHQ7LSBpbnQsIHByaW1lIGludCkgewoJZm9yIGkgOj0gcmFuZ2Ugc3JjIHsgICAgLy8gTG9vcCBvdmVyIHZhbHVlcyByZWNlaXZlZCBmcm9tICdzcmMnLgoJCWlmIGklcHJpbWUgIT0gMCB7CgkJCWRzdCAmbHQ7LSBpICAvLyBTZW5kICdpJyB0byBjaGFubmVsICdkc3QnLgoJCX0KCX0KfQoKLy8gVGhlIHByaW1lIHNpZXZlOiBEYWlzeS1jaGFpbiBmaWx0ZXIgcHJvY2Vzc2VzIHRvZ2V0aGVyLgpmdW5jIHNpZXZlKCkgewoJY2ggOj0gbWFrZShjaGFuIGludCkgIC8vIENyZWF0ZSBhIG5ldyBjaGFubmVsLgoJZ28gZ2VuZXJhdGUoY2gpICAgICAgIC8vIFN0YXJ0IGdlbmVyYXRlKCkgYXMgYSBzdWJwcm9jZXNzLgoJZm9yIHsKCQlwcmltZSA6PSAmbHQ7LWNoCgkJZm10LlByaW50KHByaW1lLCAiXG4iKQoJCWNoMSA6PSBtYWtlKGNoYW4gaW50KQoJCWdvIGZpbHRlcihjaCwgY2gxLCBwcmltZSkKCQljaCA9IGNoMQoJfQp9CgpmdW5jIG1haW4oKSB7CglzaWV2ZSgpCn0KPC90ZXh0YXJlYT48L2Zvcm0+CgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICB0aGVtZTogImVsZWdhbnQiLAogICAgICAgIG1hdGNoQnJhY2tldHM6IHRydWUsCiAgICAgICAgaW5kZW50VW5pdDogOCwKICAgICAgICB0YWJTaXplOiA4LAogICAgICAgIGluZGVudFdpdGhUYWJzOiB0cnVlLAogICAgICAgIG1vZGU6ICJ0ZXh0L3gtZ28iCiAgICAgIH0pOwogICAgPC9zY3JpcHQ+CgogICAgPHA+PHN0cm9uZz5NSU1FIHR5cGU6PC9zdHJvbmc+IDxjb2RlPnRleHQveC1nbzwvY29kZT48L3A+CiAgPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/groovy/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/groovy/groovy.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJncm9vdnkiLCBmdW5jdGlvbihjb25maWcpIHsKICBmdW5jdGlvbiB3b3JkcyhzdHIpIHsKICAgIHZhciBvYmogPSB7fSwgd29yZHMgPSBzdHIuc3BsaXQoIiAiKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgd29yZHMubGVuZ3RoOyArK2kpIG9ialt3b3Jkc1tpXV0gPSB0cnVlOwogICAgcmV0dXJuIG9iajsKICB9CiAgdmFyIGtleXdvcmRzID0gd29yZHMoCiAgICAiYWJzdHJhY3QgYXMgYXNzZXJ0IGJvb2xlYW4gYnJlYWsgYnl0ZSBjYXNlIGNhdGNoIGNoYXIgY2xhc3MgY29uc3QgY29udGludWUgZGVmIGRlZmF1bHQgIiArCiAgICAiZG8gZG91YmxlIGVsc2UgZW51bSBleHRlbmRzIGZpbmFsIGZpbmFsbHkgZmxvYXQgZm9yIGdvdG8gaWYgaW1wbGVtZW50cyBpbXBvcnQgaW4gIiArCiAgICAiaW5zdGFuY2VvZiBpbnQgaW50ZXJmYWNlIGxvbmcgbmF0aXZlIG5ldyBwYWNrYWdlIHByaXZhdGUgcHJvdGVjdGVkIHB1YmxpYyByZXR1cm4gIiArCiAgICAic2hvcnQgc3RhdGljIHN0cmljdGZwIHN1cGVyIHN3aXRjaCBzeW5jaHJvbml6ZWQgdGhyZWFkc2FmZSB0aHJvdyB0aHJvd3MgdHJhbnNpZW50ICIgKwogICAgInRyeSB2b2lkIHZvbGF0aWxlIHdoaWxlIik7CiAgdmFyIGJsb2NrS2V5d29yZHMgPSB3b3JkcygiY2F0Y2ggY2xhc3MgZG8gZWxzZSBmaW5hbGx5IGZvciBpZiBzd2l0Y2ggdHJ5IHdoaWxlIGVudW0gaW50ZXJmYWNlIGRlZiIpOwogIHZhciBzdGFuZGFsb25lS2V5d29yZHMgPSB3b3JkcygicmV0dXJuIGJyZWFrIGNvbnRpbnVlIik7CiAgdmFyIGF0b21zID0gd29yZHMoIm51bGwgdHJ1ZSBmYWxzZSB0aGlzIik7CgogIHZhciBjdXJQdW5jOwogIGZ1bmN0aW9uIHRva2VuQmFzZShzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpOwogICAgaWYgKGNoID09ICciJyB8fCBjaCA9PSAiJyIpIHsKICAgICAgcmV0dXJuIHN0YXJ0U3RyaW5nKGNoLCBzdHJlYW0sIHN0YXRlKTsKICAgIH0KICAgIGlmICgvW1xbXF17fVwoXCksO1w6XC5dLy50ZXN0KGNoKSkgewogICAgICBjdXJQdW5jID0gY2g7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgaWYgKC9cZC8udGVzdChjaCkpIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXHdcLl0vKTsKICAgICAgaWYgKHN0cmVhbS5lYXQoL2VFLykpIHsgc3RyZWFtLmVhdCgvXCtcLS8pOyBzdHJlYW0uZWF0V2hpbGUoL1xkLyk7IH0KICAgICAgcmV0dXJuICJudW1iZXIiOwogICAgfQogICAgaWYgKGNoID09ICIvIikgewogICAgICBpZiAoc3RyZWFtLmVhdCgiKiIpKSB7CiAgICAgICAgc3RhdGUudG9rZW5pemUucHVzaCh0b2tlbkNvbW1lbnQpOwogICAgICAgIHJldHVybiB0b2tlbkNvbW1lbnQoc3RyZWFtLCBzdGF0ZSk7CiAgICAgIH0KICAgICAgaWYgKHN0cmVhbS5lYXQoIi8iKSkgewogICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgICByZXR1cm4gImNvbW1lbnQiOwogICAgICB9CiAgICAgIGlmIChleHBlY3RFeHByZXNzaW9uKHN0YXRlLmxhc3RUb2tlbiwgZmFsc2UpKSB7CiAgICAgICAgcmV0dXJuIHN0YXJ0U3RyaW5nKGNoLCBzdHJlYW0sIHN0YXRlKTsKICAgICAgfQogICAgfQogICAgaWYgKGNoID09ICItIiAmJiBzdHJlYW0uZWF0KCI+IikpIHsKICAgICAgY3VyUHVuYyA9ICItPiI7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgaWYgKC9bK1wtKiYlPTw+IT98XC9+XS8udGVzdChjaCkpIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bK1wtKiYlPTw+fH5dLyk7CiAgICAgIHJldHVybiAib3BlcmF0b3IiOwogICAgfQogICAgc3RyZWFtLmVhdFdoaWxlKC9bXHdcJF9dLyk7CiAgICBpZiAoY2ggPT0gIkAiKSB7IHN0cmVhbS5lYXRXaGlsZSgvW1x3XCRfXC5dLyk7IHJldHVybiAibWV0YSI7IH0KICAgIGlmIChzdGF0ZS5sYXN0VG9rZW4gPT0gIi4iKSByZXR1cm4gInByb3BlcnR5IjsKICAgIGlmIChzdHJlYW0uZWF0KCI6IikpIHsgY3VyUHVuYyA9ICJwcm9wbGFiZWwiOyByZXR1cm4gInByb3BlcnR5IjsgfQogICAgdmFyIGN1ciA9IHN0cmVhbS5jdXJyZW50KCk7CiAgICBpZiAoYXRvbXMucHJvcGVydHlJc0VudW1lcmFibGUoY3VyKSkgeyByZXR1cm4gImF0b20iOyB9CiAgICBpZiAoa2V5d29yZHMucHJvcGVydHlJc0VudW1lcmFibGUoY3VyKSkgewogICAgICBpZiAoYmxvY2tLZXl3b3Jkcy5wcm9wZXJ0eUlzRW51bWVyYWJsZShjdXIpKSBjdXJQdW5jID0gIm5ld3N0YXRlbWVudCI7CiAgICAgIGVsc2UgaWYgKHN0YW5kYWxvbmVLZXl3b3Jkcy5wcm9wZXJ0eUlzRW51bWVyYWJsZShjdXIpKSBjdXJQdW5jID0gInN0YW5kYWxvbmUiOwogICAgICByZXR1cm4gImtleXdvcmQiOwogICAgfQogICAgcmV0dXJuICJ2YXJpYWJsZSI7CiAgfQogIHRva2VuQmFzZS5pc0Jhc2UgPSB0cnVlOwoKICBmdW5jdGlvbiBzdGFydFN0cmluZyhxdW90ZSwgc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIHRyaXBsZVF1b3RlZCA9IGZhbHNlOwogICAgaWYgKHF1b3RlICE9ICIvIiAmJiBzdHJlYW0uZWF0KHF1b3RlKSkgewogICAgICBpZiAoc3RyZWFtLmVhdChxdW90ZSkpIHRyaXBsZVF1b3RlZCA9IHRydWU7CiAgICAgIGVsc2UgcmV0dXJuICJzdHJpbmciOwogICAgfQogICAgZnVuY3Rpb24gdChzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHZhciBlc2NhcGVkID0gZmFsc2UsIG5leHQsIGVuZCA9ICF0cmlwbGVRdW90ZWQ7CiAgICAgIHdoaWxlICgobmV4dCA9IHN0cmVhbS5uZXh0KCkpICE9IG51bGwpIHsKICAgICAgICBpZiAobmV4dCA9PSBxdW90ZSAmJiAhZXNjYXBlZCkgewogICAgICAgICAgaWYgKCF0cmlwbGVRdW90ZWQpIHsgYnJlYWs7IH0KICAgICAgICAgIGlmIChzdHJlYW0ubWF0Y2gocXVvdGUgKyBxdW90ZSkpIHsgZW5kID0gdHJ1ZTsgYnJlYWs7IH0KICAgICAgICB9CiAgICAgICAgaWYgKHF1b3RlID09ICciJyAmJiBuZXh0ID09ICIkIiAmJiAhZXNjYXBlZCAmJiBzdHJlYW0uZWF0KCJ7IikpIHsKICAgICAgICAgIHN0YXRlLnRva2VuaXplLnB1c2godG9rZW5CYXNlVW50aWxCcmFjZSgpKTsKICAgICAgICAgIHJldHVybiAic3RyaW5nIjsKICAgICAgICB9CiAgICAgICAgZXNjYXBlZCA9ICFlc2NhcGVkICYmIG5leHQgPT0gIlxcIjsKICAgICAgfQogICAgICBpZiAoZW5kKSBzdGF0ZS50b2tlbml6ZS5wb3AoKTsKICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgfQogICAgc3RhdGUudG9rZW5pemUucHVzaCh0KTsKICAgIHJldHVybiB0KHN0cmVhbSwgc3RhdGUpOwogIH0KCiAgZnVuY3Rpb24gdG9rZW5CYXNlVW50aWxCcmFjZSgpIHsKICAgIHZhciBkZXB0aCA9IDE7CiAgICBmdW5jdGlvbiB0KHN0cmVhbSwgc3RhdGUpIHsKICAgICAgaWYgKHN0cmVhbS5wZWVrKCkgPT0gIn0iKSB7CiAgICAgICAgZGVwdGgtLTsKICAgICAgICBpZiAoZGVwdGggPT0gMCkgewogICAgICAgICAgc3RhdGUudG9rZW5pemUucG9wKCk7CiAgICAgICAgICByZXR1cm4gc3RhdGUudG9rZW5pemVbc3RhdGUudG9rZW5pemUubGVuZ3RoLTFdKHN0cmVhbSwgc3RhdGUpOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmIChzdHJlYW0ucGVlaygpID09ICJ7IikgewogICAgICAgIGRlcHRoKys7CiAgICAgIH0KICAgICAgcmV0dXJuIHRva2VuQmFzZShzdHJlYW0sIHN0YXRlKTsKICAgIH0KICAgIHQuaXNCYXNlID0gdHJ1ZTsKICAgIHJldHVybiB0OwogIH0KCiAgZnVuY3Rpb24gdG9rZW5Db21tZW50KHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBtYXliZUVuZCA9IGZhbHNlLCBjaDsKICAgIHdoaWxlIChjaCA9IHN0cmVhbS5uZXh0KCkpIHsKICAgICAgaWYgKGNoID09ICIvIiAmJiBtYXliZUVuZCkgewogICAgICAgIHN0YXRlLnRva2VuaXplLnBvcCgpOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIG1heWJlRW5kID0gKGNoID09ICIqIik7CiAgICB9CiAgICByZXR1cm4gImNvbW1lbnQiOwogIH0KCiAgZnVuY3Rpb24gZXhwZWN0RXhwcmVzc2lvbihsYXN0LCBuZXdsaW5lKSB7CiAgICByZXR1cm4gIWxhc3QgfHwgbGFzdCA9PSAib3BlcmF0b3IiIHx8IGxhc3QgPT0gIi0+IiB8fCAvW1wuXFtce1woLDs6XS8udGVzdChsYXN0KSB8fAogICAgICBsYXN0ID09ICJuZXdzdGF0ZW1lbnQiIHx8IGxhc3QgPT0gImtleXdvcmQiIHx8IGxhc3QgPT0gInByb3BsYWJlbCIgfHwKICAgICAgKGxhc3QgPT0gInN0YW5kYWxvbmUiICYmICFuZXdsaW5lKTsKICB9CgogIGZ1bmN0aW9uIENvbnRleHQoaW5kZW50ZWQsIGNvbHVtbiwgdHlwZSwgYWxpZ24sIHByZXYpIHsKICAgIHRoaXMuaW5kZW50ZWQgPSBpbmRlbnRlZDsKICAgIHRoaXMuY29sdW1uID0gY29sdW1uOwogICAgdGhpcy50eXBlID0gdHlwZTsKICAgIHRoaXMuYWxpZ24gPSBhbGlnbjsKICAgIHRoaXMucHJldiA9IHByZXY7CiAgfQogIGZ1bmN0aW9uIHB1c2hDb250ZXh0KHN0YXRlLCBjb2wsIHR5cGUpIHsKICAgIHJldHVybiBzdGF0ZS5jb250ZXh0ID0gbmV3IENvbnRleHQoc3RhdGUuaW5kZW50ZWQsIGNvbCwgdHlwZSwgbnVsbCwgc3RhdGUuY29udGV4dCk7CiAgfQogIGZ1bmN0aW9uIHBvcENvbnRleHQoc3RhdGUpIHsKICAgIHZhciB0ID0gc3RhdGUuY29udGV4dC50eXBlOwogICAgaWYgKHQgPT0gIikiIHx8IHQgPT0gIl0iIHx8IHQgPT0gIn0iKQogICAgICBzdGF0ZS5pbmRlbnRlZCA9IHN0YXRlLmNvbnRleHQuaW5kZW50ZWQ7CiAgICByZXR1cm4gc3RhdGUuY29udGV4dCA9IHN0YXRlLmNvbnRleHQucHJldjsKICB9CgogIC8vIEludGVyZmFjZQoKICByZXR1cm4gewogICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24oYmFzZWNvbHVtbikgewogICAgICByZXR1cm4gewogICAgICAgIHRva2VuaXplOiBbdG9rZW5CYXNlXSwKICAgICAgICBjb250ZXh0OiBuZXcgQ29udGV4dCgoYmFzZWNvbHVtbiB8fCAwKSAtIGNvbmZpZy5pbmRlbnRVbml0LCAwLCAidG9wIiwgZmFsc2UpLAogICAgICAgIGluZGVudGVkOiAwLAogICAgICAgIHN0YXJ0T2ZMaW5lOiB0cnVlLAogICAgICAgIGxhc3RUb2tlbjogbnVsbAogICAgICB9OwogICAgfSwKCiAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICB2YXIgY3R4ID0gc3RhdGUuY29udGV4dDsKICAgICAgaWYgKHN0cmVhbS5zb2woKSkgewogICAgICAgIGlmIChjdHguYWxpZ24gPT0gbnVsbCkgY3R4LmFsaWduID0gZmFsc2U7CiAgICAgICAgc3RhdGUuaW5kZW50ZWQgPSBzdHJlYW0uaW5kZW50YXRpb24oKTsKICAgICAgICBzdGF0ZS5zdGFydE9mTGluZSA9IHRydWU7CiAgICAgICAgLy8gQXV0b21hdGljIHNlbWljb2xvbiBpbnNlcnRpb24KICAgICAgICBpZiAoY3R4LnR5cGUgPT0gInN0YXRlbWVudCIgJiYgIWV4cGVjdEV4cHJlc3Npb24oc3RhdGUubGFzdFRva2VuLCB0cnVlKSkgewogICAgICAgICAgcG9wQ29udGV4dChzdGF0ZSk7IGN0eCA9IHN0YXRlLmNvbnRleHQ7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChzdHJlYW0uZWF0U3BhY2UoKSkgcmV0dXJuIG51bGw7CiAgICAgIGN1clB1bmMgPSBudWxsOwogICAgICB2YXIgc3R5bGUgPSBzdGF0ZS50b2tlbml6ZVtzdGF0ZS50b2tlbml6ZS5sZW5ndGgtMV0oc3RyZWFtLCBzdGF0ZSk7CiAgICAgIGlmIChzdHlsZSA9PSAiY29tbWVudCIpIHJldHVybiBzdHlsZTsKICAgICAgaWYgKGN0eC5hbGlnbiA9PSBudWxsKSBjdHguYWxpZ24gPSB0cnVlOwoKICAgICAgaWYgKChjdXJQdW5jID09ICI7IiB8fCBjdXJQdW5jID09ICI6IikgJiYgY3R4LnR5cGUgPT0gInN0YXRlbWVudCIpIHBvcENvbnRleHQoc3RhdGUpOwogICAgICAvLyBIYW5kbGUgaW5kZW50YXRpb24gZm9yIHt4IC0+IFxuIC4uLiB9CiAgICAgIGVsc2UgaWYgKGN1clB1bmMgPT0gIi0+IiAmJiBjdHgudHlwZSA9PSAic3RhdGVtZW50IiAmJiBjdHgucHJldi50eXBlID09ICJ9IikgewogICAgICAgIHBvcENvbnRleHQoc3RhdGUpOwogICAgICAgIHN0YXRlLmNvbnRleHQuYWxpZ24gPSBmYWxzZTsKICAgICAgfQogICAgICBlbHNlIGlmIChjdXJQdW5jID09ICJ7IikgcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbS5jb2x1bW4oKSwgIn0iKTsKICAgICAgZWxzZSBpZiAoY3VyUHVuYyA9PSAiWyIpIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0uY29sdW1uKCksICJdIik7CiAgICAgIGVsc2UgaWYgKGN1clB1bmMgPT0gIigiKSBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLmNvbHVtbigpLCAiKSIpOwogICAgICBlbHNlIGlmIChjdXJQdW5jID09ICJ9IikgewogICAgICAgIHdoaWxlIChjdHgudHlwZSA9PSAic3RhdGVtZW50IikgY3R4ID0gcG9wQ29udGV4dChzdGF0ZSk7CiAgICAgICAgaWYgKGN0eC50eXBlID09ICJ9IikgY3R4ID0gcG9wQ29udGV4dChzdGF0ZSk7CiAgICAgICAgd2hpbGUgKGN0eC50eXBlID09ICJzdGF0ZW1lbnQiKSBjdHggPSBwb3BDb250ZXh0KHN0YXRlKTsKICAgICAgfQogICAgICBlbHNlIGlmIChjdXJQdW5jID09IGN0eC50eXBlKSBwb3BDb250ZXh0KHN0YXRlKTsKICAgICAgZWxzZSBpZiAoY3R4LnR5cGUgPT0gIn0iIHx8IGN0eC50eXBlID09ICJ0b3AiIHx8IChjdHgudHlwZSA9PSAic3RhdGVtZW50IiAmJiBjdXJQdW5jID09ICJuZXdzdGF0ZW1lbnQiKSkKICAgICAgICBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLmNvbHVtbigpLCAic3RhdGVtZW50Iik7CiAgICAgIHN0YXRlLnN0YXJ0T2ZMaW5lID0gZmFsc2U7CiAgICAgIHN0YXRlLmxhc3RUb2tlbiA9IGN1clB1bmMgfHwgc3R5bGU7CiAgICAgIHJldHVybiBzdHlsZTsKICAgIH0sCgogICAgaW5kZW50OiBmdW5jdGlvbihzdGF0ZSwgdGV4dEFmdGVyKSB7CiAgICAgIGlmICghc3RhdGUudG9rZW5pemVbc3RhdGUudG9rZW5pemUubGVuZ3RoLTFdLmlzQmFzZSkgcmV0dXJuIDA7CiAgICAgIHZhciBmaXJzdENoYXIgPSB0ZXh0QWZ0ZXIgJiYgdGV4dEFmdGVyLmNoYXJBdCgwKSwgY3R4ID0gc3RhdGUuY29udGV4dDsKICAgICAgaWYgKGN0eC50eXBlID09ICJzdGF0ZW1lbnQiICYmICFleHBlY3RFeHByZXNzaW9uKHN0YXRlLmxhc3RUb2tlbiwgdHJ1ZSkpIGN0eCA9IGN0eC5wcmV2OwogICAgICB2YXIgY2xvc2luZyA9IGZpcnN0Q2hhciA9PSBjdHgudHlwZTsKICAgICAgaWYgKGN0eC50eXBlID09ICJzdGF0ZW1lbnQiKSByZXR1cm4gY3R4LmluZGVudGVkICsgKGZpcnN0Q2hhciA9PSAieyIgPyAwIDogY29uZmlnLmluZGVudFVuaXQpOwogICAgICBlbHNlIGlmIChjdHguYWxpZ24pIHJldHVybiBjdHguY29sdW1uICsgKGNsb3NpbmcgPyAwIDogMSk7CiAgICAgIGVsc2UgcmV0dXJuIGN0eC5pbmRlbnRlZCArIChjbG9zaW5nID8gMCA6IGNvbmZpZy5pbmRlbnRVbml0KTsKICAgIH0sCgogICAgZWxlY3RyaWNDaGFyczogInt9IiwKICAgIGNsb3NlQnJhY2tldHM6IHt0cmlwbGVzOiAiJ1wiIn0sCiAgICBmb2xkOiAiYnJhY2UiCiAgfTsKfSk7CgpDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveC1ncm9vdnkiLCAiZ3Jvb3Z5Iik7Cgp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/groovy/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogR3Jvb3Z5IG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vLi4vYWRkb24vZWRpdC9tYXRjaGJyYWNrZXRzLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Imdyb292eS5qcyI+PC9zY3JpcHQ+CjxzdHlsZT4uQ29kZU1pcnJvciB7Ym9yZGVyLXRvcDogMXB4IHNvbGlkICM1MDA7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjNTAwO308L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxoMT5Db2RlTWlycm9yPC9oMT48aW1nIGlkPWxvZ28gc3JjPSIuLi8uLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5MYW5ndWFnZSBtb2RlczwvYT4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+R3Jvb3Z5PC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5Hcm9vdnkgbW9kZTwvaDI+Cjxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+Ci8vUGF0dGVybiBmb3IgZ3Jvb3Z5IHNjcmlwdApkZWYgcCA9IH4vLipcLmdyb292eS8KbmV3IEZpbGUoICdkOlxcc2NyaXB0cycgKS5lYWNoRmlsZU1hdGNoKHApIHtmIC0+CiAgLy8gaW1wb3J0cyBsaXN0CiAgZGVmIGltcG9ydHMgPSBbXQogIGYuZWFjaExpbmUgewogICAgLy8gY29uZGl0aW9uIHRvIGRldGVjdCBhbiBpbXBvcnQgaW5zdHJ1Y3Rpb24KICAgIGxuIC0+IGlmICggbG4gPX4gJ15pbXBvcnQgLionICkgewogICAgICBpbXBvcnRzIDw8ICIke2xuIC0gJ2ltcG9ydCAnfSIKICAgIH0KICB9CiAgLy8gcHJpbnQgdGhtZW4KICBpZiAoICEgaW1wb3J0cy5lbXB0eSApIHsKICAgIHByaW50bG4gZgogICAgaW1wb3J0cy5lYWNoeyBwcmludGxuICIgICAkaXQiIH0KICB9Cn0KCi8qIENvaW4gY2hhbmdlciBkZW1vIGNvZGUgZnJvbSBodHRwOi8vZ3Jvb3Z5LmNvZGVoYXVzLm9yZyAqLwoKZW51bSBVc0NvaW4gewogIHF1YXJ0ZXIoMjUpLCBkaW1lKDEwKSwgbmlja2VsKDUpLCBwZW5ueSgxKQogIFVzQ29pbih2KSB7IHZhbHVlID0gdiB9CiAgZmluYWwgdmFsdWUKfQoKZW51bSBPenppZUNvaW4gewogIGZpZnR5KDUwKSwgdHdlbnR5KDIwKSwgdGVuKDEwKSwgZml2ZSg1KQogIE96emllQ29pbih2KSB7IHZhbHVlID0gdiB9CiAgZmluYWwgdmFsdWUKfQoKZGVmIHBsdXJhbCh3b3JkLCBjb3VudCkgewogIGlmIChjb3VudCA9PSAxKSByZXR1cm4gd29yZAogIHdvcmRbLTFdID09ICd5JyA/IHdvcmRbMC4uLTJdICsgImllcyIgOiB3b3JkICsgInMiCn0KCmRlZiBjaGFuZ2UoY3VycmVuY3ksIGFtb3VudCkgewogIGN1cnJlbmN5LnZhbHVlcygpLmluamVjdChbXSl7IGxpc3QsIGNvaW4gLT4KICAgICBpbnQgY291bnQgPSBhbW91bnQgLyBjb2luLnZhbHVlCiAgICAgYW1vdW50ID0gYW1vdW50ICUgY29pbi52YWx1ZQogICAgIGxpc3QgKz0gIiRjb3VudCAke3BsdXJhbChjb2luLnRvU3RyaW5nKCksIGNvdW50KX0iCiAgfQp9CjwvdGV4dGFyZWE+PC9mb3JtPgoKICAgIDxzY3JpcHQ+CiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICAgICAgbGluZU51bWJlcnM6IHRydWUsCiAgICAgICAgbWF0Y2hCcmFja2V0czogdHJ1ZSwKICAgICAgICBtb2RlOiAidGV4dC94LWdyb292eSIKICAgICAgfSk7CiAgICA8L3NjcmlwdD4KCiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC94LWdyb292eTwvY29kZT48L3A+CiAgPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/haml/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/haml/haml.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSwgcmVxdWlyZSgiLi4vaHRtbG1peGVkL2h0bWxtaXhlZCIpLCByZXF1aXJlKCIuLi9ydWJ5L3J1YnkiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiLCAiLi4vaHRtbG1peGVkL2h0bWxtaXhlZCIsICIuLi9ydWJ5L3J1YnkiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKICAvLyBmdWxsIGhhbWwgbW9kZS4gVGhpcyBoYW5kbGVkIGVtYmVkZGVkIHJ1YnkgYW5kIGh0bWwgZnJhZ21lbnRzIHRvbwogIENvZGVNaXJyb3IuZGVmaW5lTW9kZSgiaGFtbCIsIGZ1bmN0aW9uKGNvbmZpZykgewogICAgdmFyIGh0bWxNb2RlID0gQ29kZU1pcnJvci5nZXRNb2RlKGNvbmZpZywge25hbWU6ICJodG1sbWl4ZWQifSk7CiAgICB2YXIgcnVieU1vZGUgPSBDb2RlTWlycm9yLmdldE1vZGUoY29uZmlnLCAicnVieSIpOwoKICAgIGZ1bmN0aW9uIHJ1YnlJblF1b3RlKGVuZFF1b3RlKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgICAgdmFyIGNoID0gc3RyZWFtLnBlZWsoKTsKICAgICAgICBpZiAoY2ggPT0gZW5kUXVvdGUgJiYgc3RhdGUucnVieVN0YXRlLnRva2VuaXplLmxlbmd0aCA9PSAxKSB7CiAgICAgICAgICAvLyBzdGVwIG91dCBvZiBydWJ5IGNvbnRleHQgYXMgaXQgc2VlbXMgdG8gY29tcGxldGUgcHJvY2Vzc2luZyBhbGwgdGhlIGJyYWNlcwogICAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gaHRtbDsKICAgICAgICAgIHJldHVybiAiY2xvc2VBdHRyaWJ1dGVUYWciOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gcnVieShzdHJlYW0sIHN0YXRlKTsKICAgICAgICB9CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gcnVieShzdHJlYW0sIHN0YXRlKSB7CiAgICAgIGlmIChzdHJlYW0ubWF0Y2goIi0jIikpIHsKICAgICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICAgICAgcmV0dXJuICJjb21tZW50IjsKICAgICAgfQogICAgICByZXR1cm4gcnVieU1vZGUudG9rZW4oc3RyZWFtLCBzdGF0ZS5ydWJ5U3RhdGUpOwogICAgfQoKICAgIGZ1bmN0aW9uIGh0bWwoc3RyZWFtLCBzdGF0ZSkgewogICAgICB2YXIgY2ggPSBzdHJlYW0ucGVlaygpOwoKICAgICAgLy8gaGFuZGxlIGhhbWwgZGVjbGFyYXRpb25zLiBBbGwgZGVjbGFyYXRpb25zIHRoYXQgY2FudCBiZSBoYW5kbGVkIGhlcmUKICAgICAgLy8gd2lsbCBiZSBwYXNzZWQgdG8gaHRtbCBtb2RlCiAgICAgIGlmIChzdGF0ZS5wcmV2aW91c1Rva2VuLnN0eWxlID09ICJjb21tZW50IiApIHsKICAgICAgICBpZiAoc3RhdGUuaW5kZW50ZWQgPiBzdGF0ZS5wcmV2aW91c1Rva2VuLmluZGVudGVkKSB7CiAgICAgICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICAgICAgICByZXR1cm4gImNvbW1lbnRMaW5lIjsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGlmIChzdGF0ZS5zdGFydE9mTGluZSkgewogICAgICAgIGlmIChjaCA9PSAiISIgJiYgc3RyZWFtLm1hdGNoKCIhISIpKSB7CiAgICAgICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICAgICAgICByZXR1cm4gInRhZyI7CiAgICAgICAgfSBlbHNlIGlmIChzdHJlYW0ubWF0Y2goL14lW1x3OiNcLl0rPS8pKSB7CiAgICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHJ1Ynk7CiAgICAgICAgICByZXR1cm4gImhhbWxUYWciOwogICAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLm1hdGNoKC9eJVtcdzpdKy8pKSB7CiAgICAgICAgICByZXR1cm4gImhhbWxUYWciOwogICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gIi8iICkgewogICAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICAgICAgcmV0dXJuICJjb21tZW50IjsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGlmIChzdGF0ZS5zdGFydE9mTGluZSB8fCBzdGF0ZS5wcmV2aW91c1Rva2VuLnN0eWxlID09ICJoYW1sVGFnIikgewogICAgICAgIGlmICggY2ggPT0gIiMiIHx8IGNoID09ICIuIikgewogICAgICAgICAgc3RyZWFtLm1hdGNoKC9bXHctI1wuXSovKTsKICAgICAgICAgIHJldHVybiAiaGFtbEF0dHJpYnV0ZSI7CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyBkb25vdCBoYW5kbGUgLS0+IGFzIHZhbGlkIHJ1YnksIG1ha2UgaXQgSFRNTCBjbG9zZSBjb21tZW50IGluc3RlYWQKICAgICAgaWYgKHN0YXRlLnN0YXJ0T2ZMaW5lICYmICFzdHJlYW0ubWF0Y2goIi0tPiIsIGZhbHNlKSAmJiAoY2ggPT0gIj0iIHx8IGNoID09ICItIiApKSB7CiAgICAgICAgc3RhdGUudG9rZW5pemUgPSBydWJ5OwogICAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgICAgfQoKICAgICAgaWYgKHN0YXRlLnByZXZpb3VzVG9rZW4uc3R5bGUgPT0gImhhbWxUYWciIHx8CiAgICAgICAgICBzdGF0ZS5wcmV2aW91c1Rva2VuLnN0eWxlID09ICJjbG9zZUF0dHJpYnV0ZVRhZyIgfHwKICAgICAgICAgIHN0YXRlLnByZXZpb3VzVG9rZW4uc3R5bGUgPT0gImhhbWxBdHRyaWJ1dGUiKSB7CiAgICAgICAgaWYgKGNoID09ICIoIikgewogICAgICAgICAgc3RhdGUudG9rZW5pemUgPSBydWJ5SW5RdW90ZSgiKSIpOwogICAgICAgICAgcmV0dXJuIHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gInsiKSB7CiAgICAgICAgICBpZiAoIXN0cmVhbS5tYXRjaCgvXlx7JS4qLykpIHsKICAgICAgICAgICAgc3RhdGUudG9rZW5pemUgPSBydWJ5SW5RdW90ZSgifSIpOwogICAgICAgICAgICByZXR1cm4gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gaHRtbE1vZGUudG9rZW4oc3RyZWFtLCBzdGF0ZS5odG1sU3RhdGUpOwogICAgfQoKICAgIHJldHVybiB7CiAgICAgIC8vIGRlZmF1bHQgdG8gaHRtbCBtb2RlCiAgICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBodG1sU3RhdGUgPSBDb2RlTWlycm9yLnN0YXJ0U3RhdGUoaHRtbE1vZGUpOwogICAgICAgIHZhciBydWJ5U3RhdGUgPSBDb2RlTWlycm9yLnN0YXJ0U3RhdGUocnVieU1vZGUpOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICBodG1sU3RhdGU6IGh0bWxTdGF0ZSwKICAgICAgICAgIHJ1YnlTdGF0ZTogcnVieVN0YXRlLAogICAgICAgICAgaW5kZW50ZWQ6IDAsCiAgICAgICAgICBwcmV2aW91c1Rva2VuOiB7IHN0eWxlOiBudWxsLCBpbmRlbnRlZDogMH0sCiAgICAgICAgICB0b2tlbml6ZTogaHRtbAogICAgICAgIH07CiAgICAgIH0sCgogICAgICBjb3B5U3RhdGU6IGZ1bmN0aW9uKHN0YXRlKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIGh0bWxTdGF0ZSA6IENvZGVNaXJyb3IuY29weVN0YXRlKGh0bWxNb2RlLCBzdGF0ZS5odG1sU3RhdGUpLAogICAgICAgICAgcnVieVN0YXRlOiBDb2RlTWlycm9yLmNvcHlTdGF0ZShydWJ5TW9kZSwgc3RhdGUucnVieVN0YXRlKSwKICAgICAgICAgIGluZGVudGVkOiBzdGF0ZS5pbmRlbnRlZCwKICAgICAgICAgIHByZXZpb3VzVG9rZW46IHN0YXRlLnByZXZpb3VzVG9rZW4sCiAgICAgICAgICB0b2tlbml6ZTogc3RhdGUudG9rZW5pemUKICAgICAgICB9OwogICAgICB9LAoKICAgICAgdG9rZW46IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgICBpZiAoc3RyZWFtLnNvbCgpKSB7CiAgICAgICAgICBzdGF0ZS5pbmRlbnRlZCA9IHN0cmVhbS5pbmRlbnRhdGlvbigpOwogICAgICAgICAgc3RhdGUuc3RhcnRPZkxpbmUgPSB0cnVlOwogICAgICAgIH0KICAgICAgICBpZiAoc3RyZWFtLmVhdFNwYWNlKCkpIHJldHVybiBudWxsOwogICAgICAgIHZhciBzdHlsZSA9IHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgICAgIHN0YXRlLnN0YXJ0T2ZMaW5lID0gZmFsc2U7CiAgICAgICAgLy8gZG9udCByZWNvcmQgY29tbWVudCBsaW5lIGFzIHdlIG9ubHkgd2FudCB0byBtZWFzdXJlIGNvbW1lbnQgbGluZSB3aXRoCiAgICAgICAgLy8gdGhlIG9wZW5pbmcgY29tbWVudCBibG9jawogICAgICAgIGlmIChzdHlsZSAmJiBzdHlsZSAhPSAiY29tbWVudExpbmUiKSB7CiAgICAgICAgICBzdGF0ZS5wcmV2aW91c1Rva2VuID0geyBzdHlsZTogc3R5bGUsIGluZGVudGVkOiBzdGF0ZS5pbmRlbnRlZCB9OwogICAgICAgIH0KICAgICAgICAvLyBpZiBjdXJyZW50IHN0YXRlIGlzIHJ1YnkgYW5kIHRoZSBwcmV2aW91cyB0b2tlbiBpcyBub3QgYCxgIHJlc2V0IHRoZQogICAgICAgIC8vIHRva2VuaXplIHRvIGh0bWwKICAgICAgICBpZiAoc3RyZWFtLmVvbCgpICYmIHN0YXRlLnRva2VuaXplID09IHJ1YnkpIHsKICAgICAgICAgIHN0cmVhbS5iYWNrVXAoMSk7CiAgICAgICAgICB2YXIgY2ggPSBzdHJlYW0ucGVlaygpOwogICAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgICAgIGlmIChjaCAmJiBjaCAhPSAiLCIpIHsKICAgICAgICAgICAgc3RhdGUudG9rZW5pemUgPSBodG1sOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyByZXByb2Nlc3Mgc29tZSBvZiB0aGUgc3BlY2lmaWMgc3R5bGUgdGFnIHdoZW4gZmluaXNoIHNldHRpbmcgcHJldmlvdXNUb2tlbgogICAgICAgIGlmIChzdHlsZSA9PSAiaGFtbFRhZyIpIHsKICAgICAgICAgIHN0eWxlID0gInRhZyI7CiAgICAgICAgfSBlbHNlIGlmIChzdHlsZSA9PSAiY29tbWVudExpbmUiKSB7CiAgICAgICAgICBzdHlsZSA9ICJjb21tZW50IjsKICAgICAgICB9IGVsc2UgaWYgKHN0eWxlID09ICJoYW1sQXR0cmlidXRlIikgewogICAgICAgICAgc3R5bGUgPSAiYXR0cmlidXRlIjsKICAgICAgICB9IGVsc2UgaWYgKHN0eWxlID09ICJjbG9zZUF0dHJpYnV0ZVRhZyIpIHsKICAgICAgICAgIHN0eWxlID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHN0eWxlOwogICAgICB9CiAgICB9OwogIH0sICJodG1sbWl4ZWQiLCAicnVieSIpOwoKICBDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveC1oYW1sIiwgImhhbWwiKTsKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/haml/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogSEFNTCBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL3htbC94bWwuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vaHRtbG1peGVkL2h0bWxtaXhlZC5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9qYXZhc2NyaXB0L2phdmFzY3JpcHQuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vcnVieS9ydWJ5LmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9ImhhbWwuanMiPjwvc2NyaXB0Pgo8c3R5bGU+LkNvZGVNaXJyb3Ige2JhY2tncm91bmQ6ICNmOGY4Zjg7fTwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGgxPkNvZGVNaXJyb3I8L2gxPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5IQU1MPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5IQU1MIG1vZGU8L2gyPgo8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgohISEKI2NvbnRlbnQKLmxlZnQuY29sdW1uKHRpdGxlPSJ0aXRsZSIpezpocmVmID0+ICIvaGVsbG8iLCA6dGVzdCA9PiAiI3toZWxsb31fI3t3b3JsZH0ifQogICAgPCEtLSBUaGlzIGlzIGEgY29tbWVudCAtLT4KICAgICVoMiBXZWxjb21lIHRvIG91ciBzaXRlIQogICAgJXA9IHB1dHMgIkhBTUwgTU9ERSIKICAucmlnaHQuY29sdW1uCiAgICA9IHJlbmRlciA6cGFydGlhbCA9PiAic2lkZWJhciIKCi5jb250YWluZXIKICAucm93CiAgICAuc3BhbjgKICAgICAgJWgxLnRpdGxlPSBAcGFnZV90aXRsZQolcC50aXRsZT0gQHBhZ2VfdGl0bGUKJXAKICAvCiAgICBUaGUgc2FtZSBhcyBIVE1MIGNvbW1lbnQKICAgIEhlbGxvIG11bHRpbGluZSBjb21tZW50CgogIC0jIGhhbWwgY29tbWVudAogICAgICBUaGlzIHdvbnQgYmUgZGlzcGxheWVkCiAgICAgIG5vciB3aWxsIHRoaXMKICBEYXRlL1RpbWU6CiAgLSBub3cgPSBEYXRlVGltZS5ub3cKICAlc3Ryb25nPSBub3cKICAtIGlmIG5vdyA+IERhdGVUaW1lLnBhcnNlKCJEZWNlbWJlciAzMSwgMjAwNiIpCiAgICA9ICJIYXBweSBuZXcgIiArICJ5ZWFyISIKCiV0aXRsZQogID0gQHRpdGxlCiAgXD0gQHRpdGxlCiAgPGgxPlRpdGxlPC9oMT4KICA8aDEgdGl0bGU9IkhFTExPIj4KICAgIFRpdGxlCiAgPC9oMT4KICAgIDwvdGV4dGFyZWE+PC9mb3JtPgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgICAgICBtb2RlOiAidGV4dC94LWhhbWwiCiAgICAgIH0pOwogICAgPC9zY3JpcHQ+CgogICAgPHA+PHN0cm9uZz5NSU1FIHR5cGVzIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPnRleHQveC1oYW1sPC9jb2RlPi48L3A+CgogICAgPHA+PHN0cm9uZz5QYXJzaW5nL0hpZ2hsaWdodGluZyBUZXN0czo8L3N0cm9uZz4gPGEgaHJlZj0iLi4vLi4vdGVzdC9pbmRleC5odG1sI2hhbWxfKiI+bm9ybWFsPC9hPiwgIDxhIGhyZWY9Ii4uLy4uL3Rlc3QvaW5kZXguaHRtbCN2ZXJib3NlLGhhbWxfKiI+dmVyYm9zZTwvYT4uPC9wPgoKICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/haml/test.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24oKSB7CiAgdmFyIG1vZGUgPSBDb2RlTWlycm9yLmdldE1vZGUoe3RhYlNpemU6IDQsIGluZGVudFVuaXQ6IDJ9LCAiaGFtbCIpOwogIGZ1bmN0aW9uIE1UKG5hbWUpIHsgdGVzdC5tb2RlKG5hbWUsIG1vZGUsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpOyB9CgogIC8vIFJlcXVpcmVzIGF0IGxlYXN0IG9uZSBtZWRpYSBxdWVyeQogIE1UKCJlbGVtZW50TmFtZSIsCiAgICAgIlt0YWcgJWgxXSBIZXkgVGhlcmUiKTsKCiAgTVQoIm9uZUVsZW1lbnRQZXJMaW5lIiwKICAgICAiW3RhZyAlaDFdIEhleSBUaGVyZSAlaDIiKTsKCiAgTVQoImlkU2VsZWN0b3IiLAogICAgICJbdGFnICVoMV1bYXR0cmlidXRlICN0ZXN0XSBIZXkgVGhlcmUiKTsKCiAgTVQoImNsYXNzU2VsZWN0b3IiLAogICAgICJbdGFnICVoMV1bYXR0cmlidXRlIC5oZWxsb10gSGV5IFRoZXJlIik7CgogIE1UKCJkb2NUeXBlIiwKICAgICAiW3RhZyAhISEgWE1MXSIpOwoKICBNVCgiY29tbWVudCIsCiAgICAgIltjb21tZW50IC8gSGVsbG8gV09STERdIik7CgogIE1UKCJub3RDb21tZW50IiwKICAgICAiW3RhZyAlaDFdIFRoaXMgaXMgbm90IGEgLyBjb21tZW50ICIpOwoKICBNVCgiYXR0cmlidXRlcyIsCiAgICAgIlt0YWcgJWFdKFt2YXJpYWJsZSB0aXRsZV1bb3BlcmF0b3IgPV1bc3RyaW5nIFwidGVzdFwiXSl7W2F0b20gOnRpdGxlXSBbb3BlcmF0b3IgPT5dIFtzdHJpbmcgXCJ0ZXN0XCJdfSIpOwoKICBNVCgiaHRtbENvZGUiLAogICAgICJbdGFnJmJyYWNrZXQgPF1bdGFnIGgxXVt0YWcmYnJhY2tldCA+XVRpdGxlW3RhZyZicmFja2V0IDwvXVt0YWcgaDFdW3RhZyZicmFja2V0ID5dIik7CgogIE1UKCJydWJ5QmxvY2siLAogICAgICJbb3BlcmF0b3IgPV1bdmFyaWFibGUtMiBAaXRlbV0iKTsKCiAgTVQoInNlbGVjdG9yUnVieUJsb2NrIiwKICAgICAiW3RhZyAlYS5zZWxlY3Rvcj1dIFt2YXJpYWJsZS0yIEBpdGVtXSIpOwoKICBNVCgibmVzdGVkUnVieUJsb2NrIiwKICAgICAgIlt0YWcgJWFdIiwKICAgICAgIiAgIFtvcGVyYXRvciA9XVt2YXJpYWJsZSBwdXRzXSBbc3RyaW5nIFwidGVzdFwiXSIpOwoKICBNVCgibXVsdGlsaW5lUGxhaW50ZXh0IiwKICAgICAgIlt0YWcgJXBdIiwKICAgICAgIiAgSGVsbG8sIiwKICAgICAgIiAgV29ybGQiKTsKCiAgTVQoIm11bHRpbGluZVJ1YnkiLAogICAgICAiW3RhZyAlcF0iLAogICAgICAiICBbY29tbWVudCAtIyB0aGlzIGlzIGEgY29tbWVudF0iLAogICAgICAiICAgICBbY29tbWVudCBhbmQgdGhpcyBpcyBhIGNvbW1lbnQgdG9vXSIsCiAgICAgICIgIERhdGUvVGltZSIsCiAgICAgICIgIFtvcGVyYXRvciAtXSBbdmFyaWFibGUgbm93XSBbb3BlcmF0b3IgPV0gW3RhZyBEYXRlVGltZV1bb3BlcmF0b3IgLl1bcHJvcGVydHkgbm93XSIsCiAgICAgICIgIFt0YWcgJXN0cm9uZz1dIFt2YXJpYWJsZSBub3ddIiwKICAgICAgIiAgW29wZXJhdG9yIC1dIFtrZXl3b3JkIGlmXSBbdmFyaWFibGUgbm93XSBbb3BlcmF0b3IgPl0gW3RhZyBEYXRlVGltZV1bb3BlcmF0b3IgLl1bcHJvcGVydHkgcGFyc2VdKFtzdHJpbmcgXCJEZWNlbWJlciAzMSwgMjAwNlwiXSkiLAogICAgICAiICAgICBbb3BlcmF0b3IgPV1bc3RyaW5nIFwiSGFwcHlcIl0iLAogICAgICAiICAgICBbb3BlcmF0b3IgPV1bc3RyaW5nIFwiQmVsYXRlZFwiXSIsCiAgICAgICIgICAgIFtvcGVyYXRvciA9XVtzdHJpbmcgXCJCaXJ0aGRheVwiXSIpOwoKICBNVCgibXVsdGlsaW5lQ29tbWVudCIsCiAgICAgICJbY29tbWVudCAvXSIsCiAgICAgICIgIFtjb21tZW50IE11bHRpbGluZV0iLAogICAgICAiICBbY29tbWVudCBDb21tZW50XSIpOwoKICBNVCgiaGFtbENvbW1lbnQiLAogICAgICJbY29tbWVudCAtIyB0aGlzIGlzIGEgY29tbWVudF0iKTsKCiAgTVQoIm11bHRpbGluZUhhbWxDb21tZW50IiwKICAgICAiW2NvbW1lbnQgLSMgdGhpcyBpcyBhIGNvbW1lbnRdIiwKICAgICAiICAgW2NvbW1lbnQgYW5kIHRoaXMgaXMgYSBjb21tZW50IHRvb10iKTsKCiAgTVQoIm11bHRpbGluZUhUTUxDb21tZW50IiwKICAgICJbY29tbWVudCA8IS0tXSIsCiAgICAiICBbY29tbWVudCB3aGF0IGEgY29tbWVudF0iLAogICAgIiAgW2NvbW1lbnQgLS0+XSIpOwoKICBNVCgiaGFtbEFmdGVyUnVieVRhZyIsCiAgICAiW2F0dHJpYnV0ZSAuYmxvY2tdIiwKICAgICIgIFt0YWcgJXN0cm9uZz1dIFt2YXJpYWJsZSBub3ddIiwKICAgICIgIFthdHRyaWJ1dGUgLnRlc3RdIiwKICAgICIgICAgIFtvcGVyYXRvciA9XVt2YXJpYWJsZSBub3ddIiwKICAgICIgIFthdHRyaWJ1dGUgLnJpZ2h0XSIpOwoKICBNVCgic3RyZXRjaGVkUnVieSIsCiAgICAgIltvcGVyYXRvciA9XSBbdmFyaWFibGUgcHV0c10gW3N0cmluZyBcIkhlbGxvXCJdLCIsCiAgICAgIiAgIFtzdHJpbmcgXCJXb3JsZFwiXSIpOwoKICBNVCgiaW50ZXJwb2xhdGlvbkluSGFzaEF0dHJpYnV0ZSIsCiAgICAgLy8iW3RhZyAlZGl2XXtbYXRvbSA6aWRdIFtvcGVyYXRvciA9Pl0gW3N0cmluZyBcIiN7XVt2YXJpYWJsZSB0ZXN0XVtzdHJpbmcgfV8je11bdmFyaWFibGUgdGluZ11bc3RyaW5nIH1cIl19IHRlc3QiKTsKICAgICAiW3RhZyAlZGl2XXtbYXRvbSA6aWRdIFtvcGVyYXRvciA9Pl0gW3N0cmluZyBcIiN7XVt2YXJpYWJsZSB0ZXN0XVtzdHJpbmcgfV8je11bdmFyaWFibGUgdGluZ11bc3RyaW5nIH1cIl19IHRlc3QiKTsKCiAgTVQoImludGVycG9sYXRpb25JbkhUTUxBdHRyaWJ1dGUiLAogICAgICJbdGFnICVkaXZdKFt2YXJpYWJsZSB0aXRsZV1bb3BlcmF0b3IgPV1bc3RyaW5nIFwiI3tdW3ZhcmlhYmxlIHRlc3RdW3N0cmluZyB9XyN7XVt2YXJpYWJsZSB0aW5nXSgpW3N0cmluZyB9XCJdKSBUZXN0Iik7Cn0pKCk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/handlebars/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/handlebars/handlebars.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSwgcmVxdWlyZSgiLi4vLi4vYWRkb24vbW9kZS9zaW1wbGUiKSwgcmVxdWlyZSgiLi4vLi4vYWRkb24vbW9kZS9tdWx0aXBsZXgiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiLCAiLi4vLi4vYWRkb24vbW9kZS9zaW1wbGUiLCAiLi4vLi4vYWRkb24vbW9kZS9tdWx0aXBsZXgiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CgogIENvZGVNaXJyb3IuZGVmaW5lU2ltcGxlTW9kZSgiaGFuZGxlYmFycy10YWdzIiwgewogICAgc3RhcnQ6IFsKICAgICAgeyByZWdleDogL1x7XHshLS0vLCBwdXNoOiAiZGFzaF9jb21tZW50IiwgdG9rZW46ICJjb21tZW50IiB9LAogICAgICB7IHJlZ2V4OiAvXHtceyEvLCAgIHB1c2g6ICJjb21tZW50IiwgdG9rZW46ICJjb21tZW50IiB9LAogICAgICB7IHJlZ2V4OiAvXHtcey8sICAgIHB1c2g6ICJoYW5kbGViYXJzIiwgdG9rZW46ICJ0YWciIH0KICAgIF0sCiAgICBoYW5kbGViYXJzOiBbCiAgICAgIHsgcmVnZXg6IC9cfVx9LywgcG9wOiB0cnVlLCB0b2tlbjogInRhZyIgfSwKCiAgICAgIC8vIERvdWJsZSBhbmQgc2luZ2xlIHF1b3RlcwogICAgICB7IHJlZ2V4OiAvIig/OlteXFwiXXxcXC4pKiI/LywgdG9rZW46ICJzdHJpbmciIH0sCiAgICAgIHsgcmVnZXg6IC8nKD86W15cXCddfFxcLikqJz8vLCB0b2tlbjogInN0cmluZyIgfSwKCiAgICAgIC8vIEhhbmRsZWJhcnMga2V5d29yZHMKICAgICAgeyByZWdleDogLz58WyNcL10oW0EtWmEtel9dXHcqKS8sIHRva2VuOiAia2V5d29yZCIgfSwKICAgICAgeyByZWdleDogLyg/OmVsc2V8dGhpcylcYi8sIHRva2VuOiAia2V5d29yZCIgfSwKCiAgICAgIC8vIE51bWVyYWwKICAgICAgeyByZWdleDogL1xkKy9pLCB0b2tlbjogIm51bWJlciIgfSwKCiAgICAgIC8vIEF0b21zIGxpa2UgPSBhbmQgLgogICAgICB7IHJlZ2V4OiAvPXx+fEB8dHJ1ZXxmYWxzZS8sIHRva2VuOiAiYXRvbSIgfSwKCiAgICAgIC8vIFBhdGhzCiAgICAgIHsgcmVnZXg6IC8oPzpcLlwuXC8pKig/OltBLVphLXpfXVtcd1wuXSopKy8sIHRva2VuOiAidmFyaWFibGUtMiIgfQogICAgXSwKICAgIGRhc2hfY29tbWVudDogWwogICAgICB7IHJlZ2V4OiAvLS1cfVx9LywgcG9wOiB0cnVlLCB0b2tlbjogImNvbW1lbnQiIH0sCgogICAgICAvLyBDb21tZW50ZWQgY29kZQogICAgICB7IHJlZ2V4OiAvLi8sIHRva2VuOiAiY29tbWVudCJ9CiAgICBdLAogICAgY29tbWVudDogWwogICAgICB7IHJlZ2V4OiAvXH1cfS8sIHBvcDogdHJ1ZSwgdG9rZW46ICJjb21tZW50IiB9LAogICAgICB7IHJlZ2V4OiAvLi8sIHRva2VuOiAiY29tbWVudCIgfQogICAgXQogIH0pOwoKICBDb2RlTWlycm9yLmRlZmluZU1vZGUoImhhbmRsZWJhcnMiLCBmdW5jdGlvbihjb25maWcsIHBhcnNlckNvbmZpZykgewogICAgdmFyIGhhbmRsZWJhcnMgPSBDb2RlTWlycm9yLmdldE1vZGUoY29uZmlnLCAiaGFuZGxlYmFycy10YWdzIik7CiAgICBpZiAoIXBhcnNlckNvbmZpZyB8fCAhcGFyc2VyQ29uZmlnLmJhc2UpIHJldHVybiBoYW5kbGViYXJzOwogICAgcmV0dXJuIENvZGVNaXJyb3IubXVsdGlwbGV4aW5nTW9kZSgKICAgICAgQ29kZU1pcnJvci5nZXRNb2RlKGNvbmZpZywgcGFyc2VyQ29uZmlnLmJhc2UpLAogICAgICB7b3BlbjogInt7IiwgY2xvc2U6ICJ9fSIsIG1vZGU6IGhhbmRsZWJhcnMsIHBhcnNlRGVsaW1pdGVyczogdHJ1ZX0KICAgICk7CiAgfSk7CgogIENvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC94LWhhbmRsZWJhcnMtdGVtcGxhdGUiLCAiaGFuZGxlYmFycyIpOwp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/handlebars/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogSGFuZGxlYmFycyBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uLy4uL2FkZG9uL21vZGUvc2ltcGxlLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uLy4uL2FkZG9uL21vZGUvbXVsdGlwbGV4LmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL3htbC94bWwuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iaGFuZGxlYmFycy5qcyI+PC9zY3JpcHQ+CjxzdHlsZT4uQ29kZU1pcnJvciB7Ym9yZGVyLXRvcDogMXB4IHNvbGlkIGJsYWNrOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGgxPkNvZGVNaXJyb3I8L2gxPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5IVE1MIG1peGVkPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5IYW5kbGViYXJzPC9oMj4KPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4Ke3s+IGJyZWFkY3J1bWJzfX0KCnt7IS0tCiAgWW91IGNhbiB1c2UgdGhlIHQgZnVuY3Rpb24gdG8gZ2V0CiAgY29udGVudCB0cmFuc2xhdGVkIHRvIHRoZSBjdXJyZW50IGxvY2FsZSwgZXM6CiAge3t0ICdhcnRpY2xlX2xpc3QnfX0KLS19fQoKPGgxPnt7dCAnYXJ0aWNsZV9saXN0J319PC9oMT4KCnt7ISBvbmUgbGluZSBjb21tZW50IH19Cgp7eyNlYWNoIGFydGljbGVzfX0KICB7e350aXRsZX19CiAgPHA+e3tleGNlcnB0IGJvZHkgc2l6ZT0xMjAgZWxsaXBzaXM9dHJ1ZX19PC9wPgoKICB7eyN3aXRoIGF1dGhvcn19CiAgICB3cml0dGVuIGJ5IHt7Zmlyc3RfbmFtZX19IHt7bGFzdF9uYW1lfX0KICAgIGZyb20gY2F0ZWdvcnk6IHt7Li4vY2F0ZWdvcnkudGl0bGV9fQogICAge3sjaWYgQC4uL2xhc3R9fWZvb2JhciF7ey9pZn19CiAge3svd2l0aH59fQoKICB7eyNpZiBwcm9tb3RlZC5sYXRlc3R9fVJlYWQgdGhpcyBvbmUhIHt7ZWxzZX19IFRoaXMgaXMgb2shIHt7L2lmfX0KCiAge3sjaWYgQGxhc3R9fTxocj57ey9pZn19Cnt7L2VhY2h9fQoKe3sjZm9ybSBuZXdfY29tbWVudH19CiAgPGlucHV0IHR5cGU9InRleHQiIG5hbWU9ImJvZHkiPgp7ey9mb3JtfX0KCjwvdGV4dGFyZWE+PC9mb3JtPgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgICAgICBtYXRjaEJyYWNrZXRzOiB0cnVlLAogICAgICAgIG1vZGU6IHtuYW1lOiAiaGFuZGxlYmFycyIsIGJhc2U6ICJ0ZXh0L2h0bWwifQogICAgICB9KTsKICAgIDwvc2NyaXB0PgogICAgCiAgICA8cD5IYW5kbGViYXJzIHN5bnRheCBoaWdobGlnaHRpbmcgZm9yIENvZGVNaXJyb3IuPC9wPgoKICAgIDxwPjxzdHJvbmc+TUlNRSB0eXBlcyBkZWZpbmVkOjwvc3Ryb25nPiA8Y29kZT50ZXh0L3gtaGFuZGxlYmFycy10ZW1wbGF0ZTwvY29kZT48L3A+CgogICAgPHA+U3VwcG9ydGVkIG9wdGlvbnM6IDxjb2RlPmJhc2U8L2NvZGU+IHRvIHNldCB0aGUgbW9kZSB0bwogICAgd3JhcC4gRm9yIGV4YW1wbGUsIHVzZTwvcD4KICAgIDxwcmU+bW9kZToge25hbWU6ICJoYW5kbGViYXJzIiwgYmFzZTogInRleHQvaHRtbCJ9PC9wcmU+CiAgICA8cD50byBoaWdobGlnaHQgYW4gSFRNTCB0ZW1wbGF0ZS48L3A+CjwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/haskell-literate/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/haskell-literate/haskell-literate.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24gKG1vZCkgewogIGlmICh0eXBlb2YgZXhwb3J0cyA9PSAib2JqZWN0IiAmJiB0eXBlb2YgbW9kdWxlID09ICJvYmplY3QiKSAvLyBDb21tb25KUwogICAgbW9kKHJlcXVpcmUoIi4uLy4uL2xpYi9jb2RlbWlycm9yIiksIHJlcXVpcmUoIi4uL2hhc2tlbGwvaGFza2VsbCIpKQogIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kKSAvLyBBTUQKICAgIGRlZmluZShbIi4uLy4uL2xpYi9jb2RlbWlycm9yIiwgIi4uL2hhc2tlbGwvaGFza2VsbCJdLCBtb2QpCiAgZWxzZSAvLyBQbGFpbiBicm93c2VyIGVudgogICAgbW9kKENvZGVNaXJyb3IpCn0pKGZ1bmN0aW9uIChDb2RlTWlycm9yKSB7CiAgInVzZSBzdHJpY3QiCgogIENvZGVNaXJyb3IuZGVmaW5lTW9kZSgiaGFza2VsbC1saXRlcmF0ZSIsIGZ1bmN0aW9uIChjb25maWcsIHBhcnNlckNvbmZpZykgewogICAgdmFyIGJhc2VNb2RlID0gQ29kZU1pcnJvci5nZXRNb2RlKGNvbmZpZywgKHBhcnNlckNvbmZpZyAmJiBwYXJzZXJDb25maWcuYmFzZSkgfHwgImhhc2tlbGwiKQoKICAgIHJldHVybiB7CiAgICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgaW5Db2RlOiBmYWxzZSwKICAgICAgICAgIGJhc2VTdGF0ZTogQ29kZU1pcnJvci5zdGFydFN0YXRlKGJhc2VNb2RlKQogICAgICAgIH0KICAgICAgfSwKICAgICAgdG9rZW46IGZ1bmN0aW9uIChzdHJlYW0sIHN0YXRlKSB7CiAgICAgICAgaWYgKHN0cmVhbS5zb2woKSkgewogICAgICAgICAgaWYgKHN0YXRlLmluQ29kZSA9IHN0cmVhbS5lYXQoIj4iKSkKICAgICAgICAgICAgcmV0dXJuICJtZXRhIgogICAgICAgIH0KICAgICAgICBpZiAoc3RhdGUuaW5Db2RlKSB7CiAgICAgICAgICByZXR1cm4gYmFzZU1vZGUudG9rZW4oc3RyZWFtLCBzdGF0ZS5iYXNlU3RhdGUpCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKQogICAgICAgICAgcmV0dXJuICJjb21tZW50IgogICAgICAgIH0KICAgICAgfSwKICAgICAgaW5uZXJNb2RlOiBmdW5jdGlvbiAoc3RhdGUpIHsKICAgICAgICByZXR1cm4gc3RhdGUuaW5Db2RlID8ge3N0YXRlOiBzdGF0ZS5iYXNlU3RhdGUsIG1vZGU6IGJhc2VNb2RlfSA6IG51bGwKICAgICAgfQogICAgfQogIH0sICJoYXNrZWxsIikKCiAgQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtbGl0ZXJhdGUtaGFza2VsbCIsICJoYXNrZWxsLWxpdGVyYXRlIikKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/haskell-literate/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogSGFza2VsbC1saXRlcmF0ZSBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Imhhc2tlbGwtbGl0ZXJhdGUuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vaGFza2VsbC9oYXNrZWxsLmpzIj48L3NjcmlwdD4KPHN0eWxlPi5Db2RlTWlycm9yIHsKICBib3JkZXItdG9wICAgIDogMXB4IHNvbGlkICNEREREREQ7CiAgYm9yZGVyLWJvdHRvbSA6IDFweCBzb2xpZCAjREREREREOwp9PC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aDE+Q29kZU1pcnJvcjwvaDE+PGltZyBpZD1sb2dvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5IYXNrZWxsLWxpdGVyYXRlPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CiAgPGgyPkhhc2tlbGwgbGl0ZXJhdGUgbW9kZTwvaDI+CiAgPGZvcm0+CiAgICA8dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgo+IHstIyBMQU5HVUFHRSBPdmVybG9hZGVkU3RyaW5ncyAjLX0KPiB7LSMgT1BUSU9OU19HSEMgLWZuby13YXJuLXVudXNlZC1kby1iaW5kICMtfQo+IGltcG9ydCBDb250cm9sLkFwcGxpY2F0aXZlICgoPCQ+KSwgKDwqPikpCj4gaW1wb3J0IERhdGEuTWF5YmUgKGlzSnVzdCkKCj4gaW1wb3J0IERhdGEuVGV4dCAoVGV4dCkKPiBpbXBvcnQgVGV4dC5CbGF6ZSAoKCEpKQo+IGltcG9ydCBxdWFsaWZpZWQgRGF0YS5UZXh0IGFzIFQKPiBpbXBvcnQgcXVhbGlmaWVkIEhhcHBzdGFjay5TZXJ2ZXIgYXMgSGFwcHN0YWNrCj4gaW1wb3J0IHF1YWxpZmllZCBUZXh0LkJsYXplLkh0bWw1IGFzIEgKPiBpbXBvcnQgcXVhbGlmaWVkIFRleHQuQmxhemUuSHRtbDUuQXR0cmlidXRlcyBhcyBBCgo+IGltcG9ydCBUZXh0LkRpZ2VzdGl2ZQo+IGltcG9ydCBUZXh0LkRpZ2VzdGl2ZS5CbGF6ZS5IdG1sNQo+IGltcG9ydCBUZXh0LkRpZ2VzdGl2ZS5IYXBwc3RhY2sKPiBpbXBvcnQgVGV4dC5EaWdlc3RpdmUuVXRpbAoKU2ltcGxlIGZvcm1zIGFuZCB2YWxpZGF0aW9uCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKTGV0J3Mgc3RhcnQgYnkgY3JlYXRpbmcgYSB2ZXJ5IHNpbXBsZSBkYXRhdHlwZSB0byByZXByZXNlbnQgYSB1c2VyOgoKPiBkYXRhIFVzZXIgPSBVc2VyCj4gICAgIHsgdXNlck5hbWUgOjogVGV4dAo+ICAgICAsIHVzZXJNYWlsIDo6IFRleHQKPiAgICAgfSBkZXJpdmluZyAoU2hvdykKCkFuZCBkaXZlIGluIGltbWVkaWF0ZWx5IHRvIGNyZWF0ZSBhIGBGb3JtYCBmb3IgYSB1c2VyLiBUaGUgYEZvcm0gdiBtIGFgIHR5cGUKaGFzIHRocmVlIHBhcmFtZXRlcnM6CgotIGB2YDogdGhlIHR5cGUgZm9yIG1lc3NhZ2VzIGFuZCBlcnJvcnMgKHVzdWFsbHkgYSBgU3RyaW5nYC1saWtlIHR5cGUsIGBUZXh0YCBpbgogIHRoaXMgY2FzZSk7Ci0gYG1gOiB0aGUgbW9uYWQgd2UgYXJlIG9wZXJhdGluZyBpbiwgbm90IHNwZWNpZmllZCBoZXJlOwotIGBhYDogdGhlIHJldHVybiB0eXBlIG9mIHRoZSBgRm9ybWAsIGluIHRoaXMgY2FzZSwgdGhpcyBpcyBvYnZpb3VzbHkgYFVzZXJgLgoKPiB1c2VyRm9ybSA6OiBNb25hZCBtID0+IEZvcm0gVGV4dCBtIFVzZXIKCldlIGNyZWF0ZSBmb3JtcyBieSB1c2luZyB0aGUgYEFwcGxpY2F0aXZlYCBpbnRlcmZhY2UuIEEgZmV3IGZvcm0gdHlwZXMgYXJlCnByb3ZpZGVkIGluIHRoZSBgVGV4dC5EaWdlc3RpdmUuRm9ybWAgbW9kdWxlLCBzdWNoIGFzIGB0ZXh0YCwgYHN0cmluZ2AsCmBib29sYC4uLgoKSW4gdGhlIGBkaWdlc3RpdmUtZnVuY3RvcnNgIGxpYnJhcnksIHRoZSBkZXZlbG9wZXIgaXMgcmVxdWlyZWQgdG8gbGFiZWwgZWFjaApmaWVsZCB1c2luZyB0aGUgYC46YCBvcGVyYXRvci4gVGhpcyBtaWdodCBsb29rIGxpa2UgYSBiaXQgb2YgYSBidXJkZW4sIGJ1dCBpdAphbGxvd3MgeW91IHRvIGRvIHNvbWUgcmVhbGx5IHVzZWZ1bCBzdHVmZiwgbGlrZSBzZXBhcmF0aW5nIHRoZSBgRm9ybWAgZnJvbSB0aGUKYWN0dWFsIEhUTUwgbGF5b3V0LgoKPiB1c2VyRm9ybSA9IFVzZXIKPiAgICAgPCQ+ICJuYW1lIiAuOiB0ZXh0IE5vdGhpbmcKPiAgICAgPCo+ICJtYWlsIiAuOiBjaGVjayAiTm90IGEgdmFsaWQgZW1haWwgYWRkcmVzcyIgY2hlY2tFbWFpbCAodGV4dCBOb3RoaW5nKQoKVGhlIGBjaGVja2AgZnVuY3Rpb24gZW5hYmxlcyB5b3UgdG8gdmFsaWRhdGUgdGhlIHJlc3VsdCBvZiBhIGZvcm0uIEZvciBleGFtcGxlLAp3ZSBjYW4gdmFsaWRhdGUgdGhlIGVtYWlsIGFkZHJlc3Mgd2l0aCBhIHJlYWxseSBuYWl2ZSBgY2hlY2tFbWFpbGAgZnVuY3Rpb24uCgo+IGNoZWNrRW1haWwgOjogVGV4dCAtPiBCb29sCj4gY2hlY2tFbWFpbCA9IGlzSnVzdCAuIFQuZmluZCAoPT0gJ0AnKQoKTW9yZSB2YWxpZGF0aW9uCi0tLS0tLS0tLS0tLS0tLQoKRm9yIG91ciBleGFtcGxlLCB3ZSBhbHNvIHdhbnQgZGVzY3JpcHRpb25zIG9mIEhhc2tlbGwgbGlicmFyaWVzLCBhbmQgaW4gb3JkZXIgdG8KZG8gdGhhdCwgd2UgbmVlZCBwYWNrYWdlIHZlcnNpb25zLi4uCgo+IHR5cGUgVmVyc2lvbiA9IFtJbnRdCgpXZSB3YW50IHRvIGxldCB0aGUgdXNlciBpbnB1dCBhIHZlcnNpb24gbnVtYmVyIHN1Y2ggYXMgYDAuMS4wLjBgLiBUaGlzIG1lYW5zIHdlCm5lZWQgdG8gdmFsaWRhdGUgaWYgdGhlIGlucHV0IGBUZXh0YCBpcyBvZiB0aGlzIGZvcm0sIGFuZCB0aGVuIHdlIG5lZWQgdG8gcGFyc2UKaXQgdG8gYSBgVmVyc2lvbmAgdHlwZS4gRm9ydHVuYXRlbHksIHdlIGNhbiBkbyB0aGlzIGluIGEgc2luZ2xlIGZ1bmN0aW9uOgpgdmFsaWRhdGVgIGFsbG93cyBjb252ZXJzaW9uIGJldHdlZW4gdmFsdWVzLCB3aGljaCBjYW4gb3B0aW9uYWxseSBmYWlsLgoKYHJlYWRNYXliZSA6OiBSZWFkIGEgPT4gU3RyaW5nIC0+IE1heWJlIGFgIGlzIGEgdXRpbGl0eSBmdW5jdGlvbiBpbXBvcnRlZCBmcm9tCmBUZXh0LkRpZ2VzdGl2ZS5VdGlsYC4KCj4gdmFsaWRhdGVWZXJzaW9uIDo6IFRleHQgLT4gUmVzdWx0IFRleHQgVmVyc2lvbgo+IHZhbGlkYXRlVmVyc2lvbiA9IG1heWJlIChFcnJvciAiQ2Fubm90IHBhcnNlIHZlcnNpb24iKSBTdWNjZXNzIC4KPiAgICAgbWFwTSAocmVhZE1heWJlIC4gVC51bnBhY2spIC4gVC5zcGxpdCAoPT0gJy4nKQoKQSBxdWljayB0ZXN0IGluIEdIQ2k6CgogICAgZ2hjaT4gdmFsaWRhdGVWZXJzaW9uIChULnBhY2sgIjAuMy4yLjEiKQogICAgU3VjY2VzcyBbMCwzLDIsMV0KICAgIGdoY2k+IHZhbGlkYXRlVmVyc2lvbiAoVC5wYWNrICIwLm9vcHMiKQogICAgRXJyb3IgIkNhbm5vdCBwYXJzZSB2ZXJzaW9uIgoKSXQgd29ya3MhIFRoaXMgbWVhbnMgd2UgY2FuIG5vdyBlYXNpbHkgYWRkIGEgYFBhY2thZ2VgIHR5cGUgYW5kIGEgYEZvcm1gIGZvciBpdDoKCj4gZGF0YSBDYXRlZ29yeSA9IFdlYiB8IFRleHQgfCBNYXRoCj4gICAgIGRlcml2aW5nIChCb3VuZGVkLCBFbnVtLCBFcSwgU2hvdykKCj4gZGF0YSBQYWNrYWdlID0gUGFja2FnZSBUZXh0IFZlcnNpb24gQ2F0ZWdvcnkKPiAgICAgZGVyaXZpbmcgKFNob3cpCgo+IHBhY2thZ2VGb3JtIDo6IE1vbmFkIG0gPT4gRm9ybSBUZXh0IG0gUGFja2FnZQo+IHBhY2thZ2VGb3JtID0gUGFja2FnZQo+ICAgICA8JD4gIm5hbWUiICAgICAuOiB0ZXh0IE5vdGhpbmcKPiAgICAgPCo+ICJ2ZXJzaW9uIiAgLjogdmFsaWRhdGUgdmFsaWRhdGVWZXJzaW9uICh0ZXh0IChKdXN0ICIwLjAuMC4xIikpCj4gICAgIDwqPiAiY2F0ZWdvcnkiIC46IGNob2ljZSBjYXRlZ29yaWVzIE5vdGhpbmcKPiAgIHdoZXJlCj4gICAgIGNhdGVnb3JpZXMgPSBbKHgsIFQucGFjayAoc2hvdyB4KSkgfCB4IDwtIFttaW5Cb3VuZCAuLiBtYXhCb3VuZF1dCgpDb21wb3NpbmcgZm9ybXMKLS0tLS0tLS0tLS0tLS0tCgpBIHJlbGVhc2UgaGFzIGFuIGF1dGhvciBhbmQgYSBwYWNrYWdlLiBMZXQncyB1c2UgdGhpcyB0byBpbGx1c3RyYXRlIHRoZQpjb21wb3NhYmlsaXR5IG9mIHRoZSBkaWdlc3RpdmUtZnVuY3RvcnMgbGlicmFyeTogd2UgY2FuIHJldXNlIHRoZSBmb3JtcyB3ZSBoYXZlCndyaXR0ZW4gZWFybGllciBvbi4KCj4gZGF0YSBSZWxlYXNlID0gUmVsZWFzZSBVc2VyIFBhY2thZ2UKPiAgICAgZGVyaXZpbmcgKFNob3cpCgo+IHJlbGVhc2VGb3JtIDo6IE1vbmFkIG0gPT4gRm9ybSBUZXh0IG0gUmVsZWFzZQo+IHJlbGVhc2VGb3JtID0gUmVsZWFzZQo+ICAgICA8JD4gImF1dGhvciIgIC46IHVzZXJGb3JtCj4gICAgIDwqPiAicGFja2FnZSIgLjogcGFja2FnZUZvcm0KClZpZXdzCi0tLS0tCgpBcyBtZW50aW9uZWQgYmVmb3JlLCBvbmUgb2YgdGhlIGFkdmFudGFnZXMgb2YgdXNpbmcgZGlnZXN0aXZlLWZ1bmN0b3JzIGlzCnNlcGFyYXRpb24gb2YgZm9ybXMgYW5kIHRoZWlyIGFjdHVhbCBIVE1MIGxheW91dC4gSW4gb3JkZXIgdG8gZG8gdGhpcywgd2UgaGF2ZQphbm90aGVyIHR5cGUsIGBWaWV3YC4KCldlIGNhbiBnZXQgYSBgVmlld2AgZnJvbSBhIGBGb3JtYCBieSBzdXBwbHlpbmcgaW5wdXQuIEEgYFZpZXdgIGNvbnRhaW5zIG1vcmUKaW5mb3JtYXRpb24gdGhhbiBhIGBGb3JtYCwgaXQgaGFzOgoKLSB0aGUgb3JpZ2luYWwgZm9ybTsKLSB0aGUgaW5wdXQgZ2l2ZW4gYnkgdGhlIHVzZXI7Ci0gYW55IGVycm9ycyB0aGF0IGhhdmUgb2NjdXJyZWQuCgpJdCBpcyB0aGlzIHZpZXcgdGhhdCB3ZSBjb252ZXJ0IHRvIEhUTUwuIEZvciB0aGlzIHR1dG9yaWFsLCB3ZSB1c2UgdGhlCltibGF6ZS1odG1sXSBsaWJyYXJ5LCBhbmQgc29tZSBoZWxwZXJzIGZyb20gdGhlIGBkaWdlc3RpdmUtZnVuY3RvcnMtYmxhemVgCmxpYnJhcnkuCgpbYmxhemUtaHRtbF06IGh0dHA6Ly9qYXNwZXJ2ZGouYmUvYmxhemUvCgpMZXQncyB3cml0ZSBhIHZpZXcgZm9yIHRoZSBgVXNlcmAgZm9ybS4gQXMgeW91IGNhbiBzZWUsIHdlIGhlcmUgcmVmZXIgdG8gdGhlCmRpZmZlcmVudCBmaWVsZHMgaW4gdGhlIGB1c2VyRm9ybWAuIFRoZSBgZXJyb3JMaXN0YCB3aWxsIGdlbmVyYXRlIGEgbGlzdCBvZgplcnJvcnMgZm9yIHRoZSBgIm1haWwiYCBmaWVsZC4KCj4gdXNlclZpZXcgOjogVmlldyBILkh0bWwgLT4gSC5IdG1sCj4gdXNlclZpZXcgdmlldyA9IGRvCj4gICAgIGxhYmVsICAgICAibmFtZSIgdmlldyAiTmFtZTogIgo+ICAgICBpbnB1dFRleHQgIm5hbWUiIHZpZXcKPiAgICAgSC5icgo+Cj4gICAgIGVycm9yTGlzdCAibWFpbCIgdmlldwo+ICAgICBsYWJlbCAgICAgIm1haWwiIHZpZXcgIkVtYWlsIGFkZHJlc3M6ICIKPiAgICAgaW5wdXRUZXh0ICJtYWlsIiB2aWV3Cj4gICAgIEguYnIKCkxpa2UgZm9ybXMsIHZpZXdzIGFyZSBhbHNvIGNvbXBvc2FibGU6IGxldCdzIGlsbHVzdHJhdGUgdGhhdCBieSBhZGRpbmcgYSB2aWV3CmZvciB0aGUgYHJlbGVhc2VGb3JtYCwgaW4gd2hpY2ggd2UgcmV1c2UgYHVzZXJWaWV3YC4gSW4gb3JkZXIgdG8gZG8gdGhpcywgd2UKdGFrZSBvbmx5IHRoZSBwYXJ0cyByZWxldmFudCB0byB0aGUgYXV0aG9yIGZyb20gdGhlIHZpZXcgYnkgdXNpbmcgYHN1YlZpZXdgLiBXZQpjYW4gdGhlbiBwYXNzIHRoZSByZXN1bHRpbmcgdmlldyB0byBvdXIgb3duIGB1c2VyVmlld2AuCldlIGhhdmUgbm8gc3BlY2lhbCB2aWV3IGNvZGUgZm9yIGBQYWNrYWdlYCwgc28gd2UgY2FuIGp1c3QgYWRkIHRoYXQgdG8KYHJlbGVhc2VWaWV3YCBhcyB3ZWxsLiBgY2hpbGRFcnJvckxpc3RgIHdpbGwgZ2VuZXJhdGUgYSBsaXN0IG9mIGVycm9ycyBmb3IgZWFjaApjaGlsZCBvZiB0aGUgc3BlY2lmaWVkIGZvcm0uIEluIHRoaXMgY2FzZSwgdGhpcyBtZWFucyBhIGxpc3Qgb2YgZXJyb3JzIGZyb20KYCJwYWNrYWdlLm5hbWUiYCBhbmQgYCJwYWNrYWdlLnZlcnNpb24iYC4gTm90ZSBob3cgd2UgdXNlIGBmb28uYmFyYCB0byByZWZlciB0bwpuZXN0ZWQgZm9ybXMuCgo+IHJlbGVhc2VWaWV3IDo6IFZpZXcgSC5IdG1sIC0+IEguSHRtbAo+IHJlbGVhc2VWaWV3IHZpZXcgPSBkbwo+ICAgICBILmgyICJBdXRob3IiCj4gICAgIHVzZXJWaWV3ICQgc3ViVmlldyAiYXV0aG9yIiB2aWV3Cj4KPiAgICAgSC5oMiAiUGFja2FnZSIKPiAgICAgY2hpbGRFcnJvckxpc3QgInBhY2thZ2UiIHZpZXcKPgo+ICAgICBsYWJlbCAgICAgInBhY2thZ2UubmFtZSIgdmlldyAiTmFtZTogIgo+ICAgICBpbnB1dFRleHQgInBhY2thZ2UubmFtZSIgdmlldwo+ICAgICBILmJyCj4KPiAgICAgbGFiZWwgICAgICJwYWNrYWdlLnZlcnNpb24iIHZpZXcgIlZlcnNpb246ICIKPiAgICAgaW5wdXRUZXh0ICJwYWNrYWdlLnZlcnNpb24iIHZpZXcKPiAgICAgSC5icgo+Cj4gICAgIGxhYmVsICAgICAgICJwYWNrYWdlLmNhdGVnb3J5IiB2aWV3ICJDYXRlZ29yeTogIgo+ICAgICBpbnB1dFNlbGVjdCAicGFja2FnZS5jYXRlZ29yeSIgdmlldwo+ICAgICBILmJyCgpUaGUgYXR0ZW50aXZlIHJlYWRlciBtaWdodCBoYXZlIHdvbmRlcmVkIHdoYXQgdGhlIHR5cGUgcGFyYW1ldGVyIGZvciBgVmlld2AgaXM6Cml0IGlzIHRoZSBgU3RyaW5nYC1saWtlIHR5cGUgdXNlZCBmb3IgZS5nLiBlcnJvciBtZXNzYWdlcy4KQnV0IHdhaXQhIFdlIGhhdmUKICAgIHJlbGVhc2VGb3JtIDo6IE1vbmFkIG0gPT4gRm9ybSBUZXh0IG0gUmVsZWFzZQogICAgcmVsZWFzZVZpZXcgOjogVmlldyBILkh0bWwgLT4gSC5IdG1sCi4uLiBkb2Vzbid0IHRoaXMgbWVhbiB0aGF0IHdlIG5lZWQgYSBgVmlldyBUZXh0YCByYXRoZXIgdGhhbiBhIGBWaWV3IEh0bWxgPyAgVGhlCmFuc3dlciBpcyB5ZXMgLS0gYnV0IGhhdmluZyBgVmlldyBIdG1sYCBhbGxvd3MgdXMgdG8gd3JpdGUgdGhlc2Ugdmlld3MgbW9yZQplYXNpbHkgd2l0aCB0aGUgYGRpZ2VzdGl2ZS1mdW5jdG9ycy1ibGF6ZWAgbGlicmFyeS4gRm9ydHVuYXRlbHksIHdlIHdpbGwgYmUgYWJsZQp0byBmaXggdGhpcyB1c2luZyB0aGUgYEZ1bmN0b3JgIGluc3RhbmNlIG9mIGBWaWV3YC4KICAgIGZtYXAgOjogTW9uYWQgbSA9PiAodiAtPiB3KSAtPiBWaWV3IHYgLT4gVmlldyB3CkEgYmFja2VuZAotLS0tLS0tLS0KVG8gZmluaXNoIHRoaXMgdHV0b3JpYWwsIHdlIG5lZWQgdG8gYmUgYWJsZSB0byBhY3R1YWxseSBydW4gdGhpcyBjb2RlLiBXZSBuZWVkCmFuIEhUVFAgc2VydmVyIGZvciB0aGF0LCBhbmQgd2UgdXNlIFtIYXBwc3RhY2tdIGZvciB0aGlzIHR1dG9yaWFsLiBUaGUKYGRpZ2VzdGl2ZS1mdW5jdG9ycy1oYXBwc3RhY2tgIGxpYnJhcnkgZ2l2ZXMgYWJvdXQgZXZlcnl0aGluZyB3ZSBuZWVkIGZvciB0aGlzLgpbSGFwcHN0YWNrXTogaHR0cDovL2hhcHBzdGFjay5jb20vCgo+IHNpdGUgOjogSGFwcHN0YWNrLlNlcnZlclBhcnQgSGFwcHN0YWNrLlJlc3BvbnNlCj4gc2l0ZSA9IGRvCj4gICAgIEhhcHBzdGFjay5kZWNvZGVCb2R5ICQgSGFwcHN0YWNrLmRlZmF1bHRCb2R5UG9saWN5ICIvdG1wIiA0MDk2IDQwOTYgNDA5Ngo+ICAgICByIDwtIHJ1bkZvcm0gInRlc3QiIHJlbGVhc2VGb3JtCj4gICAgIGNhc2UgciBvZgo+ICAgICAgICAgKHZpZXcsIE5vdGhpbmcpIC0+IGRvCj4gICAgICAgICAgICAgbGV0IHZpZXcnID0gZm1hcCBILnRvSHRtbCB2aWV3Cj4gICAgICAgICAgICAgSGFwcHN0YWNrLm9rICQgSGFwcHN0YWNrLnRvUmVzcG9uc2UgJAo+ICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSAkCj4gICAgICAgICAgICAgICAgICAgICBmb3JtIHZpZXcnICIvIiAkIGRvCj4gICAgICAgICAgICAgICAgICAgICAgICAgcmVsZWFzZVZpZXcgdmlldycKPiAgICAgICAgICAgICAgICAgICAgICAgICBILmJyCj4gICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRTdWJtaXQgIlN1Ym1pdCIKPiAgICAgICAgIChfLCBKdXN0IHJlbGVhc2UpIC0+IEhhcHBzdGFjay5vayAkIEhhcHBzdGFjay50b1Jlc3BvbnNlICQKPiAgICAgICAgICAgICB0ZW1wbGF0ZSAkIGRvCj4gICAgICAgICAgICAgICAgIGNzcwo+ICAgICAgICAgICAgICAgICBILmgxICJSZWxlYXNlIHJlY2VpdmVkIgo+ICAgICAgICAgICAgICAgICBILnAgJCBILnRvSHRtbCAkIHNob3cgcmVsZWFzZQo+Cj4gbWFpbiA6OiBJTyAoKQo+IG1haW4gPSBIYXBwc3RhY2suc2ltcGxlSFRUUCBIYXBwc3RhY2subnVsbENvbmYgc2l0ZQoKVXRpbGl0aWVzCi0tLS0tLS0tLQoKPiB0ZW1wbGF0ZSA6OiBILkh0bWwgLT4gSC5IdG1sCj4gdGVtcGxhdGUgYm9keSA9IEguZG9jVHlwZUh0bWwgJCBkbwo+ICAgICBILmhlYWQgJCBkbwo+ICAgICAgICAgSC50aXRsZSAiZGlnZXN0aXZlLWZ1bmN0b3JzIHR1dG9yaWFsIgo+ICAgICAgICAgY3NzCj4gICAgIEguYm9keSBib2R5Cj4gY3NzIDo6IEguSHRtbAo+IGNzcyA9IEguc3R5bGUgISBBLnR5cGVfICJ0ZXh0L2NzcyIgJCBkbwo+ICAgICAibGFiZWwge3dpZHRoOiAxMzBweDsgZmxvYXQ6IGxlZnQ7IGNsZWFyOiBib3RofSIKPiAgICAgInVsLmRpZ2VzdGl2ZS1mdW5jdG9ycy1lcnJvci1saXN0IHsiCj4gICAgICIgICAgY29sb3I6IHJlZDsiCj4gICAgICIgICAgbGlzdC1zdHlsZS10eXBlOiBub25lOyIKPiAgICAgIiAgICBwYWRkaW5nLWxlZnQ6IDBweDsiCj4gICAgICJ9IgogICAgPC90ZXh0YXJlYT4KICA8L2Zvcm0+CgogIDxwPjxzdHJvbmc+TUlNRSB0eXBlcwogIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPnRleHQveC1saXRlcmF0ZS1oYXNrZWxsPC9jb2RlPi48L3A+CgogIDxwPlBhcnNlciBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgcmVjb2duaXplZDogPGNvZGU+YmFzZTwvY29kZT4gdG8KICBzZXQgdGhlIGJhc2UgbW9kZSAoZGVmYXVsdHMgdG8gPGNvZGU+Imhhc2tlbGwiPC9jb2RlPikuPC9wPgoKICA8c2NyaXB0PgogICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHttb2RlOiAiaGFza2VsbC1saXRlcmF0ZSJ9KTsKICA8L3NjcmlwdD4KCjwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/haskell/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/haskell/haskell.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJoYXNrZWxsIiwgZnVuY3Rpb24oX2NvbmZpZywgbW9kZUNvbmZpZykgewoKICBmdW5jdGlvbiBzd2l0Y2hTdGF0ZShzb3VyY2UsIHNldFN0YXRlLCBmKSB7CiAgICBzZXRTdGF0ZShmKTsKICAgIHJldHVybiBmKHNvdXJjZSwgc2V0U3RhdGUpOwogIH0KCiAgLy8gVGhlc2Ugc2hvdWxkIGFsbCBiZSBVbmljb2RlIGV4dGVuZGVkLCBhcyBwZXIgdGhlIEhhc2tlbGwgMjAxMCByZXBvcnQKICB2YXIgc21hbGxSRSA9IC9bYS16X10vOwogIHZhciBsYXJnZVJFID0gL1tBLVpdLzsKICB2YXIgZGlnaXRSRSA9IC9cZC87CiAgdmFyIGhleGl0UkUgPSAvWzAtOUEtRmEtZl0vOwogIHZhciBvY3RpdFJFID0gL1swLTddLzsKICB2YXIgaWRSRSA9IC9bYS16X0EtWjAtOSdceGExLVx1ZmZmZl0vOwogIHZhciBzeW1ib2xSRSA9IC9bLSEjJCUmKisuXC88PT4/QFxcXnx+Ol0vOwogIHZhciBzcGVjaWFsUkUgPSAvWygpLDtbXF1ge31dLzsKICB2YXIgd2hpdGVDaGFyUkUgPSAvWyBcdFx2XGZdLzsgLy8gbmV3bGluZXMgYXJlIGhhbmRsZWQgaW4gdG9rZW5pemVyCgogIGZ1bmN0aW9uIG5vcm1hbChzb3VyY2UsIHNldFN0YXRlKSB7CiAgICBpZiAoc291cmNlLmVhdFdoaWxlKHdoaXRlQ2hhclJFKSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICB2YXIgY2ggPSBzb3VyY2UubmV4dCgpOwogICAgaWYgKHNwZWNpYWxSRS50ZXN0KGNoKSkgewogICAgICBpZiAoY2ggPT0gJ3snICYmIHNvdXJjZS5lYXQoJy0nKSkgewogICAgICAgIHZhciB0ID0gImNvbW1lbnQiOwogICAgICAgIGlmIChzb3VyY2UuZWF0KCcjJykpIHsKICAgICAgICAgIHQgPSAibWV0YSI7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzd2l0Y2hTdGF0ZShzb3VyY2UsIHNldFN0YXRlLCBuY29tbWVudCh0LCAxKSk7CiAgICAgIH0KICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgaWYgKGNoID09ICdcJycpIHsKICAgICAgaWYgKHNvdXJjZS5lYXQoJ1xcJykpIHsKICAgICAgICBzb3VyY2UubmV4dCgpOyAgLy8gc2hvdWxkIGhhbmRsZSBvdGhlciBlc2NhcGVzIGhlcmUKICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICBzb3VyY2UubmV4dCgpOwogICAgICB9CiAgICAgIGlmIChzb3VyY2UuZWF0KCdcJycpKSB7CiAgICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgICB9CiAgICAgIHJldHVybiAic3RyaW5nIGVycm9yIjsKICAgIH0KCiAgICBpZiAoY2ggPT0gJyInKSB7CiAgICAgIHJldHVybiBzd2l0Y2hTdGF0ZShzb3VyY2UsIHNldFN0YXRlLCBzdHJpbmdMaXRlcmFsKTsKICAgIH0KCiAgICBpZiAobGFyZ2VSRS50ZXN0KGNoKSkgewogICAgICBzb3VyY2UuZWF0V2hpbGUoaWRSRSk7CiAgICAgIGlmIChzb3VyY2UuZWF0KCcuJykpIHsKICAgICAgICByZXR1cm4gInF1YWxpZmllciI7CiAgICAgIH0KICAgICAgcmV0dXJuICJ2YXJpYWJsZS0yIjsKICAgIH0KCiAgICBpZiAoc21hbGxSRS50ZXN0KGNoKSkgewogICAgICBzb3VyY2UuZWF0V2hpbGUoaWRSRSk7CiAgICAgIHJldHVybiAidmFyaWFibGUiOwogICAgfQoKICAgIGlmIChkaWdpdFJFLnRlc3QoY2gpKSB7CiAgICAgIGlmIChjaCA9PSAnMCcpIHsKICAgICAgICBpZiAoc291cmNlLmVhdCgvW3hYXS8pKSB7CiAgICAgICAgICBzb3VyY2UuZWF0V2hpbGUoaGV4aXRSRSk7IC8vIHNob3VsZCByZXF1aXJlIGF0IGxlYXN0IDEKICAgICAgICAgIHJldHVybiAiaW50ZWdlciI7CiAgICAgICAgfQogICAgICAgIGlmIChzb3VyY2UuZWF0KC9bb09dLykpIHsKICAgICAgICAgIHNvdXJjZS5lYXRXaGlsZShvY3RpdFJFKTsgLy8gc2hvdWxkIHJlcXVpcmUgYXQgbGVhc3QgMQogICAgICAgICAgcmV0dXJuICJudW1iZXIiOwogICAgICAgIH0KICAgICAgfQogICAgICBzb3VyY2UuZWF0V2hpbGUoZGlnaXRSRSk7CiAgICAgIHZhciB0ID0gIm51bWJlciI7CiAgICAgIGlmIChzb3VyY2UubWF0Y2goL15cLlxkKy8pKSB7CiAgICAgICAgdCA9ICJudW1iZXIiOwogICAgICB9CiAgICAgIGlmIChzb3VyY2UuZWF0KC9bZUVdLykpIHsKICAgICAgICB0ID0gIm51bWJlciI7CiAgICAgICAgc291cmNlLmVhdCgvWy0rXS8pOwogICAgICAgIHNvdXJjZS5lYXRXaGlsZShkaWdpdFJFKTsgLy8gc2hvdWxkIHJlcXVpcmUgYXQgbGVhc3QgMQogICAgICB9CiAgICAgIHJldHVybiB0OwogICAgfQoKICAgIGlmIChjaCA9PSAiLiIgJiYgc291cmNlLmVhdCgiLiIpKQogICAgICByZXR1cm4gImtleXdvcmQiOwoKICAgIGlmIChzeW1ib2xSRS50ZXN0KGNoKSkgewogICAgICBpZiAoY2ggPT0gJy0nICYmIHNvdXJjZS5lYXQoLy0vKSkgewogICAgICAgIHNvdXJjZS5lYXRXaGlsZSgvLS8pOwogICAgICAgIGlmICghc291cmNlLmVhdChzeW1ib2xSRSkpIHsKICAgICAgICAgIHNvdXJjZS5za2lwVG9FbmQoKTsKICAgICAgICAgIHJldHVybiAiY29tbWVudCI7CiAgICAgICAgfQogICAgICB9CiAgICAgIHZhciB0ID0gInZhcmlhYmxlIjsKICAgICAgaWYgKGNoID09ICc6JykgewogICAgICAgIHQgPSAidmFyaWFibGUtMiI7CiAgICAgIH0KICAgICAgc291cmNlLmVhdFdoaWxlKHN5bWJvbFJFKTsKICAgICAgcmV0dXJuIHQ7CiAgICB9CgogICAgcmV0dXJuICJlcnJvciI7CiAgfQoKICBmdW5jdGlvbiBuY29tbWVudCh0eXBlLCBuZXN0KSB7CiAgICBpZiAobmVzdCA9PSAwKSB7CiAgICAgIHJldHVybiBub3JtYWw7CiAgICB9CiAgICByZXR1cm4gZnVuY3Rpb24oc291cmNlLCBzZXRTdGF0ZSkgewogICAgICB2YXIgY3Vyck5lc3QgPSBuZXN0OwogICAgICB3aGlsZSAoIXNvdXJjZS5lb2woKSkgewogICAgICAgIHZhciBjaCA9IHNvdXJjZS5uZXh0KCk7CiAgICAgICAgaWYgKGNoID09ICd7JyAmJiBzb3VyY2UuZWF0KCctJykpIHsKICAgICAgICAgICsrY3Vyck5lc3Q7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGNoID09ICctJyAmJiBzb3VyY2UuZWF0KCd9JykpIHsKICAgICAgICAgIC0tY3Vyck5lc3Q7CiAgICAgICAgICBpZiAoY3Vyck5lc3QgPT0gMCkgewogICAgICAgICAgICBzZXRTdGF0ZShub3JtYWwpOwogICAgICAgICAgICByZXR1cm4gdHlwZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgc2V0U3RhdGUobmNvbW1lbnQodHlwZSwgY3Vyck5lc3QpKTsKICAgICAgcmV0dXJuIHR5cGU7CiAgICB9OwogIH0KCiAgZnVuY3Rpb24gc3RyaW5nTGl0ZXJhbChzb3VyY2UsIHNldFN0YXRlKSB7CiAgICB3aGlsZSAoIXNvdXJjZS5lb2woKSkgewogICAgICB2YXIgY2ggPSBzb3VyY2UubmV4dCgpOwogICAgICBpZiAoY2ggPT0gJyInKSB7CiAgICAgICAgc2V0U3RhdGUobm9ybWFsKTsKICAgICAgICByZXR1cm4gInN0cmluZyI7CiAgICAgIH0KICAgICAgaWYgKGNoID09ICdcXCcpIHsKICAgICAgICBpZiAoc291cmNlLmVvbCgpIHx8IHNvdXJjZS5lYXQod2hpdGVDaGFyUkUpKSB7CiAgICAgICAgICBzZXRTdGF0ZShzdHJpbmdHYXApOwogICAgICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgICAgIH0KICAgICAgICBpZiAoc291cmNlLmVhdCgnJicpKSB7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgc291cmNlLm5leHQoKTsgLy8gc2hvdWxkIGhhbmRsZSBvdGhlciBlc2NhcGVzIGhlcmUKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHNldFN0YXRlKG5vcm1hbCk7CiAgICByZXR1cm4gInN0cmluZyBlcnJvciI7CiAgfQoKICBmdW5jdGlvbiBzdHJpbmdHYXAoc291cmNlLCBzZXRTdGF0ZSkgewogICAgaWYgKHNvdXJjZS5lYXQoJ1xcJykpIHsKICAgICAgcmV0dXJuIHN3aXRjaFN0YXRlKHNvdXJjZSwgc2V0U3RhdGUsIHN0cmluZ0xpdGVyYWwpOwogICAgfQogICAgc291cmNlLm5leHQoKTsKICAgIHNldFN0YXRlKG5vcm1hbCk7CiAgICByZXR1cm4gImVycm9yIjsKICB9CgoKICB2YXIgd2VsbEtub3duV29yZHMgPSAoZnVuY3Rpb24oKSB7CiAgICB2YXIgd2t3ID0ge307CiAgICBmdW5jdGlvbiBzZXRUeXBlKHQpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykKICAgICAgICAgIHdrd1thcmd1bWVudHNbaV1dID0gdDsKICAgICAgfTsKICAgIH0KCiAgICBzZXRUeXBlKCJrZXl3b3JkIikoCiAgICAgICJjYXNlIiwgImNsYXNzIiwgImRhdGEiLCAiZGVmYXVsdCIsICJkZXJpdmluZyIsICJkbyIsICJlbHNlIiwgImZvcmVpZ24iLAogICAgICAiaWYiLCAiaW1wb3J0IiwgImluIiwgImluZml4IiwgImluZml4bCIsICJpbmZpeHIiLCAiaW5zdGFuY2UiLCAibGV0IiwKICAgICAgIm1vZHVsZSIsICJuZXd0eXBlIiwgIm9mIiwgInRoZW4iLCAidHlwZSIsICJ3aGVyZSIsICJfIik7CgogICAgc2V0VHlwZSgia2V5d29yZCIpKAogICAgICAiXC5cLiIsICI6IiwgIjo6IiwgIj0iLCAiXFwiLCAiPC0iLCAiLT4iLCAiQCIsICJ+IiwgIj0+Iik7CgogICAgc2V0VHlwZSgiYnVpbHRpbiIpKAogICAgICAiISEiLCAiJCEiLCAiJCIsICImJiIsICIrIiwgIisrIiwgIi0iLCAiLiIsICIvIiwgIi89IiwgIjwiLCAiPD0iLCAiPTw8IiwKICAgICAgIj09IiwgIj4iLCAiPj0iLCAiPj4iLCAiPj49IiwgIl4iLCAiXl4iLCAifHwiLCAiKiIsICIqKiIpOwoKICAgIHNldFR5cGUoImJ1aWx0aW4iKSgKICAgICAgIkJvb2wiLCAiQm91bmRlZCIsICJDaGFyIiwgIkRvdWJsZSIsICJFUSIsICJFaXRoZXIiLCAiRW51bSIsICJFcSIsCiAgICAgICJGYWxzZSIsICJGaWxlUGF0aCIsICJGbG9hdCIsICJGbG9hdGluZyIsICJGcmFjdGlvbmFsIiwgIkZ1bmN0b3IiLCAiR1QiLAogICAgICAiSU8iLCAiSU9FcnJvciIsICJJbnQiLCAiSW50ZWdlciIsICJJbnRlZ3JhbCIsICJKdXN0IiwgIkxUIiwgIkxlZnQiLAogICAgICAiTWF5YmUiLCAiTW9uYWQiLCAiTm90aGluZyIsICJOdW0iLCAiT3JkIiwgIk9yZGVyaW5nIiwgIlJhdGlvbmFsIiwgIlJlYWQiLAogICAgICAiUmVhZFMiLCAiUmVhbCIsICJSZWFsRmxvYXQiLCAiUmVhbEZyYWMiLCAiUmlnaHQiLCAiU2hvdyIsICJTaG93UyIsCiAgICAgICJTdHJpbmciLCAiVHJ1ZSIpOwoKICAgIHNldFR5cGUoImJ1aWx0aW4iKSgKICAgICAgImFicyIsICJhY29zIiwgImFjb3NoIiwgImFsbCIsICJhbmQiLCAiYW55IiwgImFwcGVuZEZpbGUiLCAiYXNUeXBlT2YiLAogICAgICAiYXNpbiIsICJhc2luaCIsICJhdGFuIiwgImF0YW4yIiwgImF0YW5oIiwgImJyZWFrIiwgImNhdGNoIiwgImNlaWxpbmciLAogICAgICAiY29tcGFyZSIsICJjb25jYXQiLCAiY29uY2F0TWFwIiwgImNvbnN0IiwgImNvcyIsICJjb3NoIiwgImN1cnJ5IiwKICAgICAgImN5Y2xlIiwgImRlY29kZUZsb2F0IiwgImRpdiIsICJkaXZNb2QiLCAiZHJvcCIsICJkcm9wV2hpbGUiLCAiZWl0aGVyIiwKICAgICAgImVsZW0iLCAiZW5jb2RlRmxvYXQiLCAiZW51bUZyb20iLCAiZW51bUZyb21UaGVuIiwgImVudW1Gcm9tVGhlblRvIiwKICAgICAgImVudW1Gcm9tVG8iLCAiZXJyb3IiLCAiZXZlbiIsICJleHAiLCAiZXhwb25lbnQiLCAiZmFpbCIsICJmaWx0ZXIiLAogICAgICAiZmxpcCIsICJmbG9hdERpZ2l0cyIsICJmbG9hdFJhZGl4IiwgImZsb2F0UmFuZ2UiLCAiZmxvb3IiLCAiZm1hcCIsCiAgICAgICJmb2xkbCIsICJmb2xkbDEiLCAiZm9sZHIiLCAiZm9sZHIxIiwgImZyb21FbnVtIiwgImZyb21JbnRlZ2VyIiwKICAgICAgImZyb21JbnRlZ3JhbCIsICJmcm9tUmF0aW9uYWwiLCAiZnN0IiwgImdjZCIsICJnZXRDaGFyIiwgImdldENvbnRlbnRzIiwKICAgICAgImdldExpbmUiLCAiaGVhZCIsICJpZCIsICJpbml0IiwgImludGVyYWN0IiwgImlvRXJyb3IiLCAiaXNEZW5vcm1hbGl6ZWQiLAogICAgICAiaXNJRUVFIiwgImlzSW5maW5pdGUiLCAiaXNOYU4iLCAiaXNOZWdhdGl2ZVplcm8iLCAiaXRlcmF0ZSIsICJsYXN0IiwKICAgICAgImxjbSIsICJsZW5ndGgiLCAibGV4IiwgImxpbmVzIiwgImxvZyIsICJsb2dCYXNlIiwgImxvb2t1cCIsICJtYXAiLAogICAgICAibWFwTSIsICJtYXBNXyIsICJtYXgiLCAibWF4Qm91bmQiLCAibWF4aW11bSIsICJtYXliZSIsICJtaW4iLCAibWluQm91bmQiLAogICAgICAibWluaW11bSIsICJtb2QiLCAibmVnYXRlIiwgIm5vdCIsICJub3RFbGVtIiwgIm51bGwiLCAib2RkIiwgIm9yIiwKICAgICAgIm90aGVyd2lzZSIsICJwaSIsICJwcmVkIiwgInByaW50IiwgInByb2R1Y3QiLCAicHJvcGVyRnJhY3Rpb24iLAogICAgICAicHV0Q2hhciIsICJwdXRTdHIiLCAicHV0U3RyTG4iLCAicXVvdCIsICJxdW90UmVtIiwgInJlYWQiLCAicmVhZEZpbGUiLAogICAgICAicmVhZElPIiwgInJlYWRMaXN0IiwgInJlYWRMbiIsICJyZWFkUGFyZW4iLCAicmVhZHMiLCAicmVhZHNQcmVjIiwKICAgICAgInJlYWxUb0ZyYWMiLCAicmVjaXAiLCAicmVtIiwgInJlcGVhdCIsICJyZXBsaWNhdGUiLCAicmV0dXJuIiwgInJldmVyc2UiLAogICAgICAicm91bmQiLCAic2NhbGVGbG9hdCIsICJzY2FubCIsICJzY2FubDEiLCAic2NhbnIiLCAic2NhbnIxIiwgInNlcSIsCiAgICAgICJzZXF1ZW5jZSIsICJzZXF1ZW5jZV8iLCAic2hvdyIsICJzaG93Q2hhciIsICJzaG93TGlzdCIsICJzaG93UGFyZW4iLAogICAgICAic2hvd1N0cmluZyIsICJzaG93cyIsICJzaG93c1ByZWMiLCAic2lnbmlmaWNhbmQiLCAic2lnbnVtIiwgInNpbiIsCiAgICAgICJzaW5oIiwgInNuZCIsICJzcGFuIiwgInNwbGl0QXQiLCAic3FydCIsICJzdWJ0cmFjdCIsICJzdWNjIiwgInN1bSIsCiAgICAgICJ0YWlsIiwgInRha2UiLCAidGFrZVdoaWxlIiwgInRhbiIsICJ0YW5oIiwgInRvRW51bSIsICJ0b0ludGVnZXIiLAogICAgICAidG9SYXRpb25hbCIsICJ0cnVuY2F0ZSIsICJ1bmN1cnJ5IiwgInVuZGVmaW5lZCIsICJ1bmxpbmVzIiwgInVudGlsIiwKICAgICAgInVud29yZHMiLCAidW56aXAiLCAidW56aXAzIiwgInVzZXJFcnJvciIsICJ3b3JkcyIsICJ3cml0ZUZpbGUiLCAiemlwIiwKICAgICAgInppcDMiLCAiemlwV2l0aCIsICJ6aXBXaXRoMyIpOwoKICAgIHZhciBvdmVycmlkZSA9IG1vZGVDb25maWcub3ZlcnJpZGVLZXl3b3JkczsKICAgIGlmIChvdmVycmlkZSkgZm9yICh2YXIgd29yZCBpbiBvdmVycmlkZSkgaWYgKG92ZXJyaWRlLmhhc093blByb3BlcnR5KHdvcmQpKQogICAgICB3a3dbd29yZF0gPSBvdmVycmlkZVt3b3JkXTsKCiAgICByZXR1cm4gd2t3OwogIH0pKCk7CgoKCiAgcmV0dXJuIHsKICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uICgpICB7IHJldHVybiB7IGY6IG5vcm1hbCB9OyB9LAogICAgY29weVN0YXRlOiAgZnVuY3Rpb24gKHMpIHsgcmV0dXJuIHsgZjogcy5mIH07IH0sCgogICAgdG9rZW46IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgdmFyIHQgPSBzdGF0ZS5mKHN0cmVhbSwgZnVuY3Rpb24ocykgeyBzdGF0ZS5mID0gczsgfSk7CiAgICAgIHZhciB3ID0gc3RyZWFtLmN1cnJlbnQoKTsKICAgICAgcmV0dXJuIHdlbGxLbm93bldvcmRzLmhhc093blByb3BlcnR5KHcpID8gd2VsbEtub3duV29yZHNbd10gOiB0OwogICAgfSwKCiAgICBibG9ja0NvbW1lbnRTdGFydDogInstIiwKICAgIGJsb2NrQ29tbWVudEVuZDogIi19IiwKICAgIGxpbmVDb21tZW50OiAiLS0iCiAgfTsKCn0pOwoKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtaGFza2VsbCIsICJoYXNrZWxsIik7Cgp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/haskell/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogSGFza2VsbCBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi90aGVtZS9lbGVnYW50LmNzcyI+CjxzY3JpcHQgc3JjPSIuLi8uLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi8uLi9hZGRvbi9lZGl0L21hdGNoYnJhY2tldHMuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iaGFza2VsbC5qcyI+PC9zY3JpcHQ+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+LkNvZGVNaXJyb3Ige2JvcmRlci10b3A6IDFweCBzb2xpZCBibGFjazsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO308L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxoMT5Db2RlTWlycm9yPC9oMT48aW1nIGlkPWxvZ28gc3JjPSIuLi8uLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5MYW5ndWFnZSBtb2RlczwvYT4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+SGFza2VsbDwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+SGFza2VsbCBtb2RlPC9oMj4KPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KbW9kdWxlIFVuaXF1ZVBlcm1zICgKICAgIHVuaXF1ZVBlcm1zCiAgICApCndoZXJlCgotLSB8IEZpbmQgYWxsIHVuaXF1ZSBwZXJtdXRhdGlvbnMgb2YgYSBsaXN0IHdoZXJlIHRoZXJlIG1pZ2h0IGJlIGR1cGxpY2F0ZXMuCnVuaXF1ZVBlcm1zIDo6IChFcSBhKSA9PiBbYV0gLT4gW1thXV0KdW5pcXVlUGVybXMgPSBwZXJtQmFnIC4gbWFrZUJhZwoKLS0gfCBBbiB1bm9yZGVyZWQgY29sbGVjdGlvbiB3aGVyZSBkdXBsaWNhdGUgdmFsdWVzIGFyZSBhbGxvd2VkLAotLSBidXQgcmVwcmVzZW50ZWQgd2l0aCBhIHNpbmdsZSB2YWx1ZSBhbmQgYSBjb3VudC4KdHlwZSBCYWcgYSA9IFsoYSwgSW50KV0KCm1ha2VCYWcgOjogKEVxIGEpID0+IFthXSAtPiBCYWcgYQptYWtlQmFnIFtdID0gW10KbWFrZUJhZyAoYTphcykgPSBtaXggYSAkIG1ha2VCYWcgYXMKICB3aGVyZQogICAgbWl4IGEgW10gICAgICAgICAgICAgICAgICAgICAgICA9IFsoYSwxKV0KICAgIG1peCBhIChibkAoYixuKTpicykgfCBhID09IGIgICAgPSAoYixuKzEpOmJzCiAgICAgICAgICAgICAgICAgICAgICAgIHwgb3RoZXJ3aXNlID0gYm4gOiBtaXggYSBicwoKcGVybUJhZyA6OiBCYWcgYSAtPiBbW2FdXQpwZXJtQmFnIFtdID0gW1tdXQpwZXJtQmFnIGJzID0gY29uY2F0TWFwIChcKGYsY3MpIC0+IG1hcCAoZjopICQgcGVybUJhZyBjcykgLiBvbmVPZkVhY2ggJCBicwogIHdoZXJlCiAgICBvbmVPZkVhY2ggW10gPSBbXQogICAgb25lT2ZFYWNoIChhbkAoYSxuKTpicykgPQogICAgICAgIGxldCBicycgPSBpZiBuID09IDEgdGhlbiBicyBlbHNlIChhLG4tMSk6YnMKICAgICAgICBpbiAoYSxicycpIDogbWFwU25kIChhbjopIChvbmVPZkVhY2ggYnMpCiAgICAKICAgIGFwU25kIGYgKGEsYikgPSAoYSwgZiBiKQogICAgbWFwU25kID0gbWFwIC4gYXBTbmQKPC90ZXh0YXJlYT48L2Zvcm0+CgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgICAgICBtYXRjaEJyYWNrZXRzOiB0cnVlLAogICAgICAgIHRoZW1lOiAiZWxlZ2FudCIKICAgICAgfSk7CiAgICA8L3NjcmlwdD4KCiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC94LWhhc2tlbGw8L2NvZGU+LjwvcD4KICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/haxe/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/haxe/haxe.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJoYXhlIiwgZnVuY3Rpb24oY29uZmlnLCBwYXJzZXJDb25maWcpIHsKICB2YXIgaW5kZW50VW5pdCA9IGNvbmZpZy5pbmRlbnRVbml0OwoKICAvLyBUb2tlbml6ZXIKCiAgZnVuY3Rpb24ga3codHlwZSkge3JldHVybiB7dHlwZTogdHlwZSwgc3R5bGU6ICJrZXl3b3JkIn07fQogIHZhciBBID0ga3coImtleXdvcmQgYSIpLCBCID0ga3coImtleXdvcmQgYiIpLCBDID0ga3coImtleXdvcmQgYyIpOwogIHZhciBvcGVyYXRvciA9IGt3KCJvcGVyYXRvciIpLCBhdG9tID0ge3R5cGU6ICJhdG9tIiwgc3R5bGU6ICJhdG9tIn0sIGF0dHJpYnV0ZSA9IHt0eXBlOiJhdHRyaWJ1dGUiLCBzdHlsZTogImF0dHJpYnV0ZSJ9OwogIHZhciB0eXBlID0ga3coInR5cGVkZWYiKTsKICB2YXIga2V5d29yZHMgPSB7CiAgICAiaWYiOiBBLCAid2hpbGUiOiBBLCAiZWxzZSI6IEIsICJkbyI6IEIsICJ0cnkiOiBCLAogICAgInJldHVybiI6IEMsICJicmVhayI6IEMsICJjb250aW51ZSI6IEMsICJuZXciOiBDLCAidGhyb3ciOiBDLAogICAgInZhciI6IGt3KCJ2YXIiKSwgImlubGluZSI6YXR0cmlidXRlLCAic3RhdGljIjogYXR0cmlidXRlLCAidXNpbmciOmt3KCJpbXBvcnQiKSwKICAgICJwdWJsaWMiOiBhdHRyaWJ1dGUsICJwcml2YXRlIjogYXR0cmlidXRlLCAiY2FzdCI6IGt3KCJjYXN0IiksICJpbXBvcnQiOiBrdygiaW1wb3J0IiksICJtYWNybyI6IGt3KCJtYWNybyIpLAogICAgImZ1bmN0aW9uIjoga3coImZ1bmN0aW9uIiksICJjYXRjaCI6IGt3KCJjYXRjaCIpLCAidW50eXBlZCI6IGt3KCJ1bnR5cGVkIiksICJjYWxsYmFjayI6IGt3KCJjYiIpLAogICAgImZvciI6IGt3KCJmb3IiKSwgInN3aXRjaCI6IGt3KCJzd2l0Y2giKSwgImNhc2UiOiBrdygiY2FzZSIpLCAiZGVmYXVsdCI6IGt3KCJkZWZhdWx0IiksCiAgICAiaW4iOiBvcGVyYXRvciwgIm5ldmVyIjoga3coInByb3BlcnR5X2FjY2VzcyIpLCAidHJhY2UiOmt3KCJ0cmFjZSIpLAogICAgImNsYXNzIjogdHlwZSwgImFic3RyYWN0Ijp0eXBlLCAiZW51bSI6dHlwZSwgImludGVyZmFjZSI6dHlwZSwgInR5cGVkZWYiOnR5cGUsICJleHRlbmRzIjp0eXBlLCAiaW1wbGVtZW50cyI6dHlwZSwgImR5bmFtaWMiOnR5cGUsCiAgICAidHJ1ZSI6IGF0b20sICJmYWxzZSI6IGF0b20sICJudWxsIjogYXRvbQogIH07CgogIHZhciBpc09wZXJhdG9yQ2hhciA9IC9bK1wtKiYlPTw+IT98XS87CgogIGZ1bmN0aW9uIGNoYWluKHN0cmVhbSwgc3RhdGUsIGYpIHsKICAgIHN0YXRlLnRva2VuaXplID0gZjsKICAgIHJldHVybiBmKHN0cmVhbSwgc3RhdGUpOwogIH0KCiAgZnVuY3Rpb24gdG9VbmVzY2FwZWQoc3RyZWFtLCBlbmQpIHsKICAgIHZhciBlc2NhcGVkID0gZmFsc2UsIG5leHQ7CiAgICB3aGlsZSAoKG5leHQgPSBzdHJlYW0ubmV4dCgpKSAhPSBudWxsKSB7CiAgICAgIGlmIChuZXh0ID09IGVuZCAmJiAhZXNjYXBlZCkKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgZXNjYXBlZCA9ICFlc2NhcGVkICYmIG5leHQgPT0gIlxcIjsKICAgIH0KICB9CgogIC8vIFVzZWQgYXMgc2NyYXRjaCB2YXJpYWJsZXMgdG8gY29tbXVuaWNhdGUgbXVsdGlwbGUgdmFsdWVzIHdpdGhvdXQKICAvLyBjb25zaW5nIHVwIHRvbnMgb2Ygb2JqZWN0cy4KICB2YXIgdHlwZSwgY29udGVudDsKICBmdW5jdGlvbiByZXQodHAsIHN0eWxlLCBjb250KSB7CiAgICB0eXBlID0gdHA7IGNvbnRlbnQgPSBjb250OwogICAgcmV0dXJuIHN0eWxlOwogIH0KCiAgZnVuY3Rpb24gaGF4ZVRva2VuQmFzZShzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpOwogICAgaWYgKGNoID09ICciJyB8fCBjaCA9PSAiJyIpIHsKICAgICAgcmV0dXJuIGNoYWluKHN0cmVhbSwgc3RhdGUsIGhheGVUb2tlblN0cmluZyhjaCkpOwogICAgfSBlbHNlIGlmICgvW1xbXF17fVwoXCksO1w6XC5dLy50ZXN0KGNoKSkgewogICAgICByZXR1cm4gcmV0KGNoKTsKICAgIH0gZWxzZSBpZiAoY2ggPT0gIjAiICYmIHN0cmVhbS5lYXQoL3gvaSkpIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXGRhLWZdL2kpOwogICAgICByZXR1cm4gcmV0KCJudW1iZXIiLCAibnVtYmVyIik7CiAgICB9IGVsc2UgaWYgKC9cZC8udGVzdChjaCkgfHwgY2ggPT0gIi0iICYmIHN0cmVhbS5lYXQoL1xkLykpIHsKICAgICAgc3RyZWFtLm1hdGNoKC9eXGQqKD86XC5cZCooPyFcLikpPyg/OltlRV1bK1wtXT9cZCspPy8pOwogICAgICByZXR1cm4gcmV0KCJudW1iZXIiLCAibnVtYmVyIik7CiAgICB9IGVsc2UgaWYgKHN0YXRlLnJlQWxsb3dlZCAmJiAoY2ggPT0gIn4iICYmIHN0cmVhbS5lYXQoL1wvLykpKSB7CiAgICAgIHRvVW5lc2NhcGVkKHN0cmVhbSwgIi8iKTsKICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bZ2ltc3VdLyk7CiAgICAgIHJldHVybiByZXQoInJlZ2V4cCIsICJzdHJpbmctMiIpOwogICAgfSBlbHNlIGlmIChjaCA9PSAiLyIpIHsKICAgICAgaWYgKHN0cmVhbS5lYXQoIioiKSkgewogICAgICAgIHJldHVybiBjaGFpbihzdHJlYW0sIHN0YXRlLCBoYXhlVG9rZW5Db21tZW50KTsKICAgICAgfSBlbHNlIGlmIChzdHJlYW0uZWF0KCIvIikpIHsKICAgICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICAgICAgcmV0dXJuIHJldCgiY29tbWVudCIsICJjb21tZW50Iik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc3RyZWFtLmVhdFdoaWxlKGlzT3BlcmF0b3JDaGFyKTsKICAgICAgICByZXR1cm4gcmV0KCJvcGVyYXRvciIsIG51bGwsIHN0cmVhbS5jdXJyZW50KCkpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGNoID09ICIjIikgewogICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgICByZXR1cm4gcmV0KCJjb25kaXRpb25hbCIsICJtZXRhIik7CiAgICB9IGVsc2UgaWYgKGNoID09ICJAIikgewogICAgICBzdHJlYW0uZWF0KC86Lyk7CiAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1x3X10vKTsKICAgICAgcmV0dXJuIHJldCAoIm1ldGFkYXRhIiwgIm1ldGEiKTsKICAgIH0gZWxzZSBpZiAoaXNPcGVyYXRvckNoYXIudGVzdChjaCkpIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKGlzT3BlcmF0b3JDaGFyKTsKICAgICAgcmV0dXJuIHJldCgib3BlcmF0b3IiLCBudWxsLCBzdHJlYW0uY3VycmVudCgpKTsKICAgIH0gZWxzZSB7CiAgICAgIHZhciB3b3JkOwogICAgICBpZigvW0EtWl0vLnRlc3QoY2gpKSB7CiAgICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXHdfPD5dLyk7CiAgICAgICAgd29yZCA9IHN0cmVhbS5jdXJyZW50KCk7CiAgICAgICAgcmV0dXJuIHJldCgidHlwZSIsICJ2YXJpYWJsZS0zIiwgd29yZCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXHdfXS8pOwogICAgICAgIHZhciB3b3JkID0gc3RyZWFtLmN1cnJlbnQoKSwga25vd24gPSBrZXl3b3Jkcy5wcm9wZXJ0eUlzRW51bWVyYWJsZSh3b3JkKSAmJiBrZXl3b3Jkc1t3b3JkXTsKICAgICAgICByZXR1cm4gKGtub3duICYmIHN0YXRlLmt3QWxsb3dlZCkgPyByZXQoa25vd24udHlwZSwga25vd24uc3R5bGUsIHdvcmQpIDoKICAgICAgICAgICAgICAgICAgICAgICByZXQoInZhcmlhYmxlIiwgInZhcmlhYmxlIiwgd29yZCk7CiAgICAgIH0KICAgIH0KICB9CgogIGZ1bmN0aW9uIGhheGVUb2tlblN0cmluZyhxdW90ZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgaWYgKHRvVW5lc2NhcGVkKHN0cmVhbSwgcXVvdGUpKQogICAgICAgIHN0YXRlLnRva2VuaXplID0gaGF4ZVRva2VuQmFzZTsKICAgICAgcmV0dXJuIHJldCgic3RyaW5nIiwgInN0cmluZyIpOwogICAgfTsKICB9CgogIGZ1bmN0aW9uIGhheGVUb2tlbkNvbW1lbnQoc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIG1heWJlRW5kID0gZmFsc2UsIGNoOwogICAgd2hpbGUgKGNoID0gc3RyZWFtLm5leHQoKSkgewogICAgICBpZiAoY2ggPT0gIi8iICYmIG1heWJlRW5kKSB7CiAgICAgICAgc3RhdGUudG9rZW5pemUgPSBoYXhlVG9rZW5CYXNlOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIG1heWJlRW5kID0gKGNoID09ICIqIik7CiAgICB9CiAgICByZXR1cm4gcmV0KCJjb21tZW50IiwgImNvbW1lbnQiKTsKICB9CgogIC8vIFBhcnNlcgoKICB2YXIgYXRvbWljVHlwZXMgPSB7ImF0b20iOiB0cnVlLCAibnVtYmVyIjogdHJ1ZSwgInZhcmlhYmxlIjogdHJ1ZSwgInN0cmluZyI6IHRydWUsICJyZWdleHAiOiB0cnVlfTsKCiAgZnVuY3Rpb24gSGF4ZUxleGljYWwoaW5kZW50ZWQsIGNvbHVtbiwgdHlwZSwgYWxpZ24sIHByZXYsIGluZm8pIHsKICAgIHRoaXMuaW5kZW50ZWQgPSBpbmRlbnRlZDsKICAgIHRoaXMuY29sdW1uID0gY29sdW1uOwogICAgdGhpcy50eXBlID0gdHlwZTsKICAgIHRoaXMucHJldiA9IHByZXY7CiAgICB0aGlzLmluZm8gPSBpbmZvOwogICAgaWYgKGFsaWduICE9IG51bGwpIHRoaXMuYWxpZ24gPSBhbGlnbjsKICB9CgogIGZ1bmN0aW9uIGluU2NvcGUoc3RhdGUsIHZhcm5hbWUpIHsKICAgIGZvciAodmFyIHYgPSBzdGF0ZS5sb2NhbFZhcnM7IHY7IHYgPSB2Lm5leHQpCiAgICAgIGlmICh2Lm5hbWUgPT0gdmFybmFtZSkgcmV0dXJuIHRydWU7CiAgfQoKICBmdW5jdGlvbiBwYXJzZUhheGUoc3RhdGUsIHN0eWxlLCB0eXBlLCBjb250ZW50LCBzdHJlYW0pIHsKICAgIHZhciBjYyA9IHN0YXRlLmNjOwogICAgLy8gQ29tbXVuaWNhdGUgb3VyIGNvbnRleHQgdG8gdGhlIGNvbWJpbmF0b3JzLgogICAgLy8gKExlc3Mgd2FzdGVmdWwgdGhhbiBjb25zaW5nIHVwIGEgaHVuZHJlZCBjbG9zdXJlcyBvbiBldmVyeSBjYWxsLikKICAgIGN4LnN0YXRlID0gc3RhdGU7IGN4LnN0cmVhbSA9IHN0cmVhbTsgY3gubWFya2VkID0gbnVsbCwgY3guY2MgPSBjYzsKCiAgICBpZiAoIXN0YXRlLmxleGljYWwuaGFzT3duUHJvcGVydHkoImFsaWduIikpCiAgICAgIHN0YXRlLmxleGljYWwuYWxpZ24gPSB0cnVlOwoKICAgIHdoaWxlKHRydWUpIHsKICAgICAgdmFyIGNvbWJpbmF0b3IgPSBjYy5sZW5ndGggPyBjYy5wb3AoKSA6IHN0YXRlbWVudDsKICAgICAgaWYgKGNvbWJpbmF0b3IodHlwZSwgY29udGVudCkpIHsKICAgICAgICB3aGlsZShjYy5sZW5ndGggJiYgY2NbY2MubGVuZ3RoIC0gMV0ubGV4KQogICAgICAgICAgY2MucG9wKCkoKTsKICAgICAgICBpZiAoY3gubWFya2VkKSByZXR1cm4gY3gubWFya2VkOwogICAgICAgIGlmICh0eXBlID09ICJ2YXJpYWJsZSIgJiYgaW5TY29wZShzdGF0ZSwgY29udGVudCkpIHJldHVybiAidmFyaWFibGUtMiI7CiAgICAgICAgaWYgKHR5cGUgPT0gInZhcmlhYmxlIiAmJiBpbXBvcnRlZChzdGF0ZSwgY29udGVudCkpIHJldHVybiAidmFyaWFibGUtMyI7CiAgICAgICAgcmV0dXJuIHN0eWxlOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiBpbXBvcnRlZChzdGF0ZSwgdHlwZW5hbWUpIHsKICAgIGlmICgvW2Etel0vLnRlc3QodHlwZW5hbWUuY2hhckF0KDApKSkKICAgICAgcmV0dXJuIGZhbHNlOwogICAgdmFyIGxlbiA9IHN0YXRlLmltcG9ydGVkdHlwZXMubGVuZ3RoOwogICAgZm9yICh2YXIgaSA9IDA7IGk8bGVuOyBpKyspCiAgICAgIGlmKHN0YXRlLmltcG9ydGVkdHlwZXNbaV09PXR5cGVuYW1lKSByZXR1cm4gdHJ1ZTsKICB9CgogIGZ1bmN0aW9uIHJlZ2lzdGVyaW1wb3J0KGltcG9ydG5hbWUpIHsKICAgIHZhciBzdGF0ZSA9IGN4LnN0YXRlOwogICAgZm9yICh2YXIgdCA9IHN0YXRlLmltcG9ydGVkdHlwZXM7IHQ7IHQgPSB0Lm5leHQpCiAgICAgIGlmKHQubmFtZSA9PSBpbXBvcnRuYW1lKSByZXR1cm47CiAgICBzdGF0ZS5pbXBvcnRlZHR5cGVzID0geyBuYW1lOiBpbXBvcnRuYW1lLCBuZXh0OiBzdGF0ZS5pbXBvcnRlZHR5cGVzIH07CiAgfQogIC8vIENvbWJpbmF0b3IgdXRpbHMKCiAgdmFyIGN4ID0ge3N0YXRlOiBudWxsLCBjb2x1bW46IG51bGwsIG1hcmtlZDogbnVsbCwgY2M6IG51bGx9OwogIGZ1bmN0aW9uIHBhc3MoKSB7CiAgICBmb3IgKHZhciBpID0gYXJndW1lbnRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBjeC5jYy5wdXNoKGFyZ3VtZW50c1tpXSk7CiAgfQogIGZ1bmN0aW9uIGNvbnQoKSB7CiAgICBwYXNzLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgZnVuY3Rpb24gaW5MaXN0KG5hbWUsIGxpc3QpIHsKICAgIGZvciAodmFyIHYgPSBsaXN0OyB2OyB2ID0gdi5uZXh0KQogICAgICBpZiAodi5uYW1lID09IG5hbWUpIHJldHVybiB0cnVlOwogICAgcmV0dXJuIGZhbHNlOwogIH0KICBmdW5jdGlvbiByZWdpc3Rlcih2YXJuYW1lKSB7CiAgICB2YXIgc3RhdGUgPSBjeC5zdGF0ZTsKICAgIGlmIChzdGF0ZS5jb250ZXh0KSB7CiAgICAgIGN4Lm1hcmtlZCA9ICJkZWYiOwogICAgICBpZiAoaW5MaXN0KHZhcm5hbWUsIHN0YXRlLmxvY2FsVmFycykpIHJldHVybjsKICAgICAgc3RhdGUubG9jYWxWYXJzID0ge25hbWU6IHZhcm5hbWUsIG5leHQ6IHN0YXRlLmxvY2FsVmFyc307CiAgICB9IGVsc2UgaWYgKHN0YXRlLmdsb2JhbFZhcnMpIHsKICAgICAgaWYgKGluTGlzdCh2YXJuYW1lLCBzdGF0ZS5nbG9iYWxWYXJzKSkgcmV0dXJuOwogICAgICBzdGF0ZS5nbG9iYWxWYXJzID0ge25hbWU6IHZhcm5hbWUsIG5leHQ6IHN0YXRlLmdsb2JhbFZhcnN9OwogICAgfQogIH0KCiAgLy8gQ29tYmluYXRvcnMKCiAgdmFyIGRlZmF1bHRWYXJzID0ge25hbWU6ICJ0aGlzIiwgbmV4dDogbnVsbH07CiAgZnVuY3Rpb24gcHVzaGNvbnRleHQoKSB7CiAgICBpZiAoIWN4LnN0YXRlLmNvbnRleHQpIGN4LnN0YXRlLmxvY2FsVmFycyA9IGRlZmF1bHRWYXJzOwogICAgY3guc3RhdGUuY29udGV4dCA9IHtwcmV2OiBjeC5zdGF0ZS5jb250ZXh0LCB2YXJzOiBjeC5zdGF0ZS5sb2NhbFZhcnN9OwogIH0KICBmdW5jdGlvbiBwb3Bjb250ZXh0KCkgewogICAgY3guc3RhdGUubG9jYWxWYXJzID0gY3guc3RhdGUuY29udGV4dC52YXJzOwogICAgY3guc3RhdGUuY29udGV4dCA9IGN4LnN0YXRlLmNvbnRleHQucHJldjsKICB9CiAgcG9wY29udGV4dC5sZXggPSB0cnVlOwogIGZ1bmN0aW9uIHB1c2hsZXgodHlwZSwgaW5mbykgewogICAgdmFyIHJlc3VsdCA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgc3RhdGUgPSBjeC5zdGF0ZTsKICAgICAgc3RhdGUubGV4aWNhbCA9IG5ldyBIYXhlTGV4aWNhbChzdGF0ZS5pbmRlbnRlZCwgY3guc3RyZWFtLmNvbHVtbigpLCB0eXBlLCBudWxsLCBzdGF0ZS5sZXhpY2FsLCBpbmZvKTsKICAgIH07CiAgICByZXN1bHQubGV4ID0gdHJ1ZTsKICAgIHJldHVybiByZXN1bHQ7CiAgfQogIGZ1bmN0aW9uIHBvcGxleCgpIHsKICAgIHZhciBzdGF0ZSA9IGN4LnN0YXRlOwogICAgaWYgKHN0YXRlLmxleGljYWwucHJldikgewogICAgICBpZiAoc3RhdGUubGV4aWNhbC50eXBlID09ICIpIikKICAgICAgICBzdGF0ZS5pbmRlbnRlZCA9IHN0YXRlLmxleGljYWwuaW5kZW50ZWQ7CiAgICAgIHN0YXRlLmxleGljYWwgPSBzdGF0ZS5sZXhpY2FsLnByZXY7CiAgICB9CiAgfQogIHBvcGxleC5sZXggPSB0cnVlOwoKICBmdW5jdGlvbiBleHBlY3Qod2FudGVkKSB7CiAgICBmdW5jdGlvbiBmKHR5cGUpIHsKICAgICAgaWYgKHR5cGUgPT0gd2FudGVkKSByZXR1cm4gY29udCgpOwogICAgICBlbHNlIGlmICh3YW50ZWQgPT0gIjsiKSByZXR1cm4gcGFzcygpOwogICAgICBlbHNlIHJldHVybiBjb250KGYpOwogICAgfQogICAgcmV0dXJuIGY7CiAgfQoKICBmdW5jdGlvbiBzdGF0ZW1lbnQodHlwZSkgewogICAgaWYgKHR5cGUgPT0gIkAiKSByZXR1cm4gY29udChtZXRhZGVmKTsKICAgIGlmICh0eXBlID09ICJ2YXIiKSByZXR1cm4gY29udChwdXNobGV4KCJ2YXJkZWYiKSwgdmFyZGVmMSwgZXhwZWN0KCI7IiksIHBvcGxleCk7CiAgICBpZiAodHlwZSA9PSAia2V5d29yZCBhIikgcmV0dXJuIGNvbnQocHVzaGxleCgiZm9ybSIpLCBleHByZXNzaW9uLCBzdGF0ZW1lbnQsIHBvcGxleCk7CiAgICBpZiAodHlwZSA9PSAia2V5d29yZCBiIikgcmV0dXJuIGNvbnQocHVzaGxleCgiZm9ybSIpLCBzdGF0ZW1lbnQsIHBvcGxleCk7CiAgICBpZiAodHlwZSA9PSAieyIpIHJldHVybiBjb250KHB1c2hsZXgoIn0iKSwgcHVzaGNvbnRleHQsIGJsb2NrLCBwb3BsZXgsIHBvcGNvbnRleHQpOwogICAgaWYgKHR5cGUgPT0gIjsiKSByZXR1cm4gY29udCgpOwogICAgaWYgKHR5cGUgPT0gImF0dHJpYnV0ZSIpIHJldHVybiBjb250KG1heWJlYXR0cmlidXRlKTsKICAgIGlmICh0eXBlID09ICJmdW5jdGlvbiIpIHJldHVybiBjb250KGZ1bmN0aW9uZGVmKTsKICAgIGlmICh0eXBlID09ICJmb3IiKSByZXR1cm4gY29udChwdXNobGV4KCJmb3JtIiksIGV4cGVjdCgiKCIpLCBwdXNobGV4KCIpIiksIGZvcnNwZWMxLCBleHBlY3QoIikiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3BsZXgsIHN0YXRlbWVudCwgcG9wbGV4KTsKICAgIGlmICh0eXBlID09ICJ2YXJpYWJsZSIpIHJldHVybiBjb250KHB1c2hsZXgoInN0YXQiKSwgbWF5YmVsYWJlbCk7CiAgICBpZiAodHlwZSA9PSAic3dpdGNoIikgcmV0dXJuIGNvbnQocHVzaGxleCgiZm9ybSIpLCBleHByZXNzaW9uLCBwdXNobGV4KCJ9IiwgInN3aXRjaCIpLCBleHBlY3QoInsiKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBibG9jaywgcG9wbGV4LCBwb3BsZXgpOwogICAgaWYgKHR5cGUgPT0gImNhc2UiKSByZXR1cm4gY29udChleHByZXNzaW9uLCBleHBlY3QoIjoiKSk7CiAgICBpZiAodHlwZSA9PSAiZGVmYXVsdCIpIHJldHVybiBjb250KGV4cGVjdCgiOiIpKTsKICAgIGlmICh0eXBlID09ICJjYXRjaCIpIHJldHVybiBjb250KHB1c2hsZXgoImZvcm0iKSwgcHVzaGNvbnRleHQsIGV4cGVjdCgiKCIpLCBmdW5hcmcsIGV4cGVjdCgiKSIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVtZW50LCBwb3BsZXgsIHBvcGNvbnRleHQpOwogICAgaWYgKHR5cGUgPT0gImltcG9ydCIpIHJldHVybiBjb250KGltcG9ydGRlZiwgZXhwZWN0KCI7IikpOwogICAgaWYgKHR5cGUgPT0gInR5cGVkZWYiKSByZXR1cm4gY29udCh0eXBlZGVmKTsKICAgIHJldHVybiBwYXNzKHB1c2hsZXgoInN0YXQiKSwgZXhwcmVzc2lvbiwgZXhwZWN0KCI7IiksIHBvcGxleCk7CiAgfQogIGZ1bmN0aW9uIGV4cHJlc3Npb24odHlwZSkgewogICAgaWYgKGF0b21pY1R5cGVzLmhhc093blByb3BlcnR5KHR5cGUpKSByZXR1cm4gY29udChtYXliZW9wZXJhdG9yKTsKICAgIGlmICh0eXBlID09ICJ0eXBlIiApIHJldHVybiBjb250KG1heWJlb3BlcmF0b3IpOwogICAgaWYgKHR5cGUgPT0gImZ1bmN0aW9uIikgcmV0dXJuIGNvbnQoZnVuY3Rpb25kZWYpOwogICAgaWYgKHR5cGUgPT0gImtleXdvcmQgYyIpIHJldHVybiBjb250KG1heWJlZXhwcmVzc2lvbik7CiAgICBpZiAodHlwZSA9PSAiKCIpIHJldHVybiBjb250KHB1c2hsZXgoIikiKSwgbWF5YmVleHByZXNzaW9uLCBleHBlY3QoIikiKSwgcG9wbGV4LCBtYXliZW9wZXJhdG9yKTsKICAgIGlmICh0eXBlID09ICJvcGVyYXRvciIpIHJldHVybiBjb250KGV4cHJlc3Npb24pOwogICAgaWYgKHR5cGUgPT0gIlsiKSByZXR1cm4gY29udChwdXNobGV4KCJdIiksIGNvbW1hc2VwKG1heWJlZXhwcmVzc2lvbiwgIl0iKSwgcG9wbGV4LCBtYXliZW9wZXJhdG9yKTsKICAgIGlmICh0eXBlID09ICJ7IikgcmV0dXJuIGNvbnQocHVzaGxleCgifSIpLCBjb21tYXNlcChvYmpwcm9wLCAifSIpLCBwb3BsZXgsIG1heWJlb3BlcmF0b3IpOwogICAgcmV0dXJuIGNvbnQoKTsKICB9CiAgZnVuY3Rpb24gbWF5YmVleHByZXNzaW9uKHR5cGUpIHsKICAgIGlmICh0eXBlLm1hdGNoKC9bO1x9XClcXSxdLykpIHJldHVybiBwYXNzKCk7CiAgICByZXR1cm4gcGFzcyhleHByZXNzaW9uKTsKICB9CgogIGZ1bmN0aW9uIG1heWJlb3BlcmF0b3IodHlwZSwgdmFsdWUpIHsKICAgIGlmICh0eXBlID09ICJvcGVyYXRvciIgJiYgL1wrXCt8LS0vLnRlc3QodmFsdWUpKSByZXR1cm4gY29udChtYXliZW9wZXJhdG9yKTsKICAgIGlmICh0eXBlID09ICJvcGVyYXRvciIgfHwgdHlwZSA9PSAiOiIpIHJldHVybiBjb250KGV4cHJlc3Npb24pOwogICAgaWYgKHR5cGUgPT0gIjsiKSByZXR1cm47CiAgICBpZiAodHlwZSA9PSAiKCIpIHJldHVybiBjb250KHB1c2hsZXgoIikiKSwgY29tbWFzZXAoZXhwcmVzc2lvbiwgIikiKSwgcG9wbGV4LCBtYXliZW9wZXJhdG9yKTsKICAgIGlmICh0eXBlID09ICIuIikgcmV0dXJuIGNvbnQocHJvcGVydHksIG1heWJlb3BlcmF0b3IpOwogICAgaWYgKHR5cGUgPT0gIlsiKSByZXR1cm4gY29udChwdXNobGV4KCJdIiksIGV4cHJlc3Npb24sIGV4cGVjdCgiXSIpLCBwb3BsZXgsIG1heWJlb3BlcmF0b3IpOwogIH0KCiAgZnVuY3Rpb24gbWF5YmVhdHRyaWJ1dGUodHlwZSkgewogICAgaWYgKHR5cGUgPT0gImF0dHJpYnV0ZSIpIHJldHVybiBjb250KG1heWJlYXR0cmlidXRlKTsKICAgIGlmICh0eXBlID09ICJmdW5jdGlvbiIpIHJldHVybiBjb250KGZ1bmN0aW9uZGVmKTsKICAgIGlmICh0eXBlID09ICJ2YXIiKSByZXR1cm4gY29udCh2YXJkZWYxKTsKICB9CgogIGZ1bmN0aW9uIG1ldGFkZWYodHlwZSkgewogICAgaWYodHlwZSA9PSAiOiIpIHJldHVybiBjb250KG1ldGFkZWYpOwogICAgaWYodHlwZSA9PSAidmFyaWFibGUiKSByZXR1cm4gY29udChtZXRhZGVmKTsKICAgIGlmKHR5cGUgPT0gIigiKSByZXR1cm4gY29udChwdXNobGV4KCIpIiksIGNvbW1hc2VwKG1ldGFhcmdzLCAiKSIpLCBwb3BsZXgsIHN0YXRlbWVudCk7CiAgfQogIGZ1bmN0aW9uIG1ldGFhcmdzKHR5cGUpIHsKICAgIGlmKHR5cGUgPT0gInZhcmlhYmxlIikgcmV0dXJuIGNvbnQoKTsKICB9CgogIGZ1bmN0aW9uIGltcG9ydGRlZiAodHlwZSwgdmFsdWUpIHsKICAgIGlmKHR5cGUgPT0gInZhcmlhYmxlIiAmJiAvW0EtWl0vLnRlc3QodmFsdWUuY2hhckF0KDApKSkgeyByZWdpc3RlcmltcG9ydCh2YWx1ZSk7IHJldHVybiBjb250KCk7IH0KICAgIGVsc2UgaWYodHlwZSA9PSAidmFyaWFibGUiIHx8IHR5cGUgPT0gInByb3BlcnR5IiB8fCB0eXBlID09ICIuIiB8fCB2YWx1ZSA9PSAiKiIpIHJldHVybiBjb250KGltcG9ydGRlZik7CiAgfQoKICBmdW5jdGlvbiB0eXBlZGVmICh0eXBlLCB2YWx1ZSkKICB7CiAgICBpZih0eXBlID09ICJ2YXJpYWJsZSIgJiYgL1tBLVpdLy50ZXN0KHZhbHVlLmNoYXJBdCgwKSkpIHsgcmVnaXN0ZXJpbXBvcnQodmFsdWUpOyByZXR1cm4gY29udCgpOyB9CiAgICBlbHNlIGlmICh0eXBlID09ICJ0eXBlIiAmJiAvW0EtWl0vLnRlc3QodmFsdWUuY2hhckF0KDApKSkgeyByZXR1cm4gY29udCgpOyB9CiAgfQoKICBmdW5jdGlvbiBtYXliZWxhYmVsKHR5cGUpIHsKICAgIGlmICh0eXBlID09ICI6IikgcmV0dXJuIGNvbnQocG9wbGV4LCBzdGF0ZW1lbnQpOwogICAgcmV0dXJuIHBhc3MobWF5YmVvcGVyYXRvciwgZXhwZWN0KCI7IiksIHBvcGxleCk7CiAgfQogIGZ1bmN0aW9uIHByb3BlcnR5KHR5cGUpIHsKICAgIGlmICh0eXBlID09ICJ2YXJpYWJsZSIpIHtjeC5tYXJrZWQgPSAicHJvcGVydHkiOyByZXR1cm4gY29udCgpO30KICB9CiAgZnVuY3Rpb24gb2JqcHJvcCh0eXBlKSB7CiAgICBpZiAodHlwZSA9PSAidmFyaWFibGUiKSBjeC5tYXJrZWQgPSAicHJvcGVydHkiOwogICAgaWYgKGF0b21pY1R5cGVzLmhhc093blByb3BlcnR5KHR5cGUpKSByZXR1cm4gY29udChleHBlY3QoIjoiKSwgZXhwcmVzc2lvbik7CiAgfQogIGZ1bmN0aW9uIGNvbW1hc2VwKHdoYXQsIGVuZCkgewogICAgZnVuY3Rpb24gcHJvY2VlZCh0eXBlKSB7CiAgICAgIGlmICh0eXBlID09ICIsIikgcmV0dXJuIGNvbnQod2hhdCwgcHJvY2VlZCk7CiAgICAgIGlmICh0eXBlID09IGVuZCkgcmV0dXJuIGNvbnQoKTsKICAgICAgcmV0dXJuIGNvbnQoZXhwZWN0KGVuZCkpOwogICAgfQogICAgcmV0dXJuIGZ1bmN0aW9uKHR5cGUpIHsKICAgICAgaWYgKHR5cGUgPT0gZW5kKSByZXR1cm4gY29udCgpOwogICAgICBlbHNlIHJldHVybiBwYXNzKHdoYXQsIHByb2NlZWQpOwogICAgfTsKICB9CiAgZnVuY3Rpb24gYmxvY2sodHlwZSkgewogICAgaWYgKHR5cGUgPT0gIn0iKSByZXR1cm4gY29udCgpOwogICAgcmV0dXJuIHBhc3Moc3RhdGVtZW50LCBibG9jayk7CiAgfQogIGZ1bmN0aW9uIHZhcmRlZjEodHlwZSwgdmFsdWUpIHsKICAgIGlmICh0eXBlID09ICJ2YXJpYWJsZSIpe3JlZ2lzdGVyKHZhbHVlKTsgcmV0dXJuIGNvbnQodHlwZXVzZSwgdmFyZGVmMik7fQogICAgcmV0dXJuIGNvbnQoKTsKICB9CiAgZnVuY3Rpb24gdmFyZGVmMih0eXBlLCB2YWx1ZSkgewogICAgaWYgKHZhbHVlID09ICI9IikgcmV0dXJuIGNvbnQoZXhwcmVzc2lvbiwgdmFyZGVmMik7CiAgICBpZiAodHlwZSA9PSAiLCIpIHJldHVybiBjb250KHZhcmRlZjEpOwogIH0KICBmdW5jdGlvbiBmb3JzcGVjMSh0eXBlLCB2YWx1ZSkgewogICAgaWYgKHR5cGUgPT0gInZhcmlhYmxlIikgewogICAgICByZWdpc3Rlcih2YWx1ZSk7CiAgICAgIHJldHVybiBjb250KGZvcmluLCBleHByZXNzaW9uKQogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIHBhc3MoKQogICAgfQogIH0KICBmdW5jdGlvbiBmb3JpbihfdHlwZSwgdmFsdWUpIHsKICAgIGlmICh2YWx1ZSA9PSAiaW4iKSByZXR1cm4gY29udCgpOwogIH0KICBmdW5jdGlvbiBmdW5jdGlvbmRlZih0eXBlLCB2YWx1ZSkgewogICAgLy9mdW5jdGlvbiBuYW1lcyBzdGFydGluZyB3aXRoIHVwcGVyLWNhc2UgbGV0dGVycyBhcmUgcmVjb2duaXNlZCBhcyB0eXBlcywgc28gY2x1ZGdpbmcgdGhlbSB0b2dldGhlciBoZXJlLgogICAgaWYgKHR5cGUgPT0gInZhcmlhYmxlIiB8fCB0eXBlID09ICJ0eXBlIikge3JlZ2lzdGVyKHZhbHVlKTsgcmV0dXJuIGNvbnQoZnVuY3Rpb25kZWYpO30KICAgIGlmICh2YWx1ZSA9PSAibmV3IikgcmV0dXJuIGNvbnQoZnVuY3Rpb25kZWYpOwogICAgaWYgKHR5cGUgPT0gIigiKSByZXR1cm4gY29udChwdXNobGV4KCIpIiksIHB1c2hjb250ZXh0LCBjb21tYXNlcChmdW5hcmcsICIpIiksIHBvcGxleCwgdHlwZXVzZSwgc3RhdGVtZW50LCBwb3Bjb250ZXh0KTsKICB9CiAgZnVuY3Rpb24gdHlwZXVzZSh0eXBlKSB7CiAgICBpZih0eXBlID09ICI6IikgcmV0dXJuIGNvbnQodHlwZXN0cmluZyk7CiAgfQogIGZ1bmN0aW9uIHR5cGVzdHJpbmcodHlwZSkgewogICAgaWYodHlwZSA9PSAidHlwZSIpIHJldHVybiBjb250KCk7CiAgICBpZih0eXBlID09ICJ2YXJpYWJsZSIpIHJldHVybiBjb250KCk7CiAgICBpZih0eXBlID09ICJ7IikgcmV0dXJuIGNvbnQocHVzaGxleCgifSIpLCBjb21tYXNlcCh0eXBlcHJvcCwgIn0iKSwgcG9wbGV4KTsKICB9CiAgZnVuY3Rpb24gdHlwZXByb3AodHlwZSkgewogICAgaWYodHlwZSA9PSAidmFyaWFibGUiKSByZXR1cm4gY29udCh0eXBldXNlKTsKICB9CiAgZnVuY3Rpb24gZnVuYXJnKHR5cGUsIHZhbHVlKSB7CiAgICBpZiAodHlwZSA9PSAidmFyaWFibGUiKSB7cmVnaXN0ZXIodmFsdWUpOyByZXR1cm4gY29udCh0eXBldXNlKTt9CiAgfQoKICAvLyBJbnRlcmZhY2UKICByZXR1cm4gewogICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24oYmFzZWNvbHVtbikgewogICAgICB2YXIgZGVmYXVsdHR5cGVzID0gWyJJbnQiLCAiRmxvYXQiLCAiU3RyaW5nIiwgIlZvaWQiLCAiU3RkIiwgIkJvb2wiLCAiRHluYW1pYyIsICJBcnJheSJdOwogICAgICB2YXIgc3RhdGUgPSB7CiAgICAgICAgdG9rZW5pemU6IGhheGVUb2tlbkJhc2UsCiAgICAgICAgcmVBbGxvd2VkOiB0cnVlLAogICAgICAgIGt3QWxsb3dlZDogdHJ1ZSwKICAgICAgICBjYzogW10sCiAgICAgICAgbGV4aWNhbDogbmV3IEhheGVMZXhpY2FsKChiYXNlY29sdW1uIHx8IDApIC0gaW5kZW50VW5pdCwgMCwgImJsb2NrIiwgZmFsc2UpLAogICAgICAgIGxvY2FsVmFyczogcGFyc2VyQ29uZmlnLmxvY2FsVmFycywKICAgICAgICBpbXBvcnRlZHR5cGVzOiBkZWZhdWx0dHlwZXMsCiAgICAgICAgY29udGV4dDogcGFyc2VyQ29uZmlnLmxvY2FsVmFycyAmJiB7dmFyczogcGFyc2VyQ29uZmlnLmxvY2FsVmFyc30sCiAgICAgICAgaW5kZW50ZWQ6IDAKICAgICAgfTsKICAgICAgaWYgKHBhcnNlckNvbmZpZy5nbG9iYWxWYXJzICYmIHR5cGVvZiBwYXJzZXJDb25maWcuZ2xvYmFsVmFycyA9PSAib2JqZWN0IikKICAgICAgICBzdGF0ZS5nbG9iYWxWYXJzID0gcGFyc2VyQ29uZmlnLmdsb2JhbFZhcnM7CiAgICAgIHJldHVybiBzdGF0ZTsKICAgIH0sCgogICAgdG9rZW46IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgaWYgKHN0cmVhbS5zb2woKSkgewogICAgICAgIGlmICghc3RhdGUubGV4aWNhbC5oYXNPd25Qcm9wZXJ0eSgiYWxpZ24iKSkKICAgICAgICAgIHN0YXRlLmxleGljYWwuYWxpZ24gPSBmYWxzZTsKICAgICAgICBzdGF0ZS5pbmRlbnRlZCA9IHN0cmVhbS5pbmRlbnRhdGlvbigpOwogICAgICB9CiAgICAgIGlmIChzdHJlYW0uZWF0U3BhY2UoKSkgcmV0dXJuIG51bGw7CiAgICAgIHZhciBzdHlsZSA9IHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgICBpZiAodHlwZSA9PSAiY29tbWVudCIpIHJldHVybiBzdHlsZTsKICAgICAgc3RhdGUucmVBbGxvd2VkID0gISEodHlwZSA9PSAib3BlcmF0b3IiIHx8IHR5cGUgPT0gImtleXdvcmQgYyIgfHwgdHlwZS5tYXRjaCgvXltcW3t9XCgsOzpdJC8pKTsKICAgICAgc3RhdGUua3dBbGxvd2VkID0gdHlwZSAhPSAnLic7CiAgICAgIHJldHVybiBwYXJzZUhheGUoc3RhdGUsIHN0eWxlLCB0eXBlLCBjb250ZW50LCBzdHJlYW0pOwogICAgfSwKCiAgICBpbmRlbnQ6IGZ1bmN0aW9uKHN0YXRlLCB0ZXh0QWZ0ZXIpIHsKICAgICAgaWYgKHN0YXRlLnRva2VuaXplICE9IGhheGVUb2tlbkJhc2UpIHJldHVybiAwOwogICAgICB2YXIgZmlyc3RDaGFyID0gdGV4dEFmdGVyICYmIHRleHRBZnRlci5jaGFyQXQoMCksIGxleGljYWwgPSBzdGF0ZS5sZXhpY2FsOwogICAgICBpZiAobGV4aWNhbC50eXBlID09ICJzdGF0IiAmJiBmaXJzdENoYXIgPT0gIn0iKSBsZXhpY2FsID0gbGV4aWNhbC5wcmV2OwogICAgICB2YXIgdHlwZSA9IGxleGljYWwudHlwZSwgY2xvc2luZyA9IGZpcnN0Q2hhciA9PSB0eXBlOwogICAgICBpZiAodHlwZSA9PSAidmFyZGVmIikgcmV0dXJuIGxleGljYWwuaW5kZW50ZWQgKyA0OwogICAgICBlbHNlIGlmICh0eXBlID09ICJmb3JtIiAmJiBmaXJzdENoYXIgPT0gInsiKSByZXR1cm4gbGV4aWNhbC5pbmRlbnRlZDsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAic3RhdCIgfHwgdHlwZSA9PSAiZm9ybSIpIHJldHVybiBsZXhpY2FsLmluZGVudGVkICsgaW5kZW50VW5pdDsKICAgICAgZWxzZSBpZiAobGV4aWNhbC5pbmZvID09ICJzd2l0Y2giICYmICFjbG9zaW5nKQogICAgICAgIHJldHVybiBsZXhpY2FsLmluZGVudGVkICsgKC9eKD86Y2FzZXxkZWZhdWx0KVxiLy50ZXN0KHRleHRBZnRlcikgPyBpbmRlbnRVbml0IDogMiAqIGluZGVudFVuaXQpOwogICAgICBlbHNlIGlmIChsZXhpY2FsLmFsaWduKSByZXR1cm4gbGV4aWNhbC5jb2x1bW4gKyAoY2xvc2luZyA/IDAgOiAxKTsKICAgICAgZWxzZSByZXR1cm4gbGV4aWNhbC5pbmRlbnRlZCArIChjbG9zaW5nID8gMCA6IGluZGVudFVuaXQpOwogICAgfSwKCiAgICBlbGVjdHJpY0NoYXJzOiAie30iLAogICAgYmxvY2tDb21tZW50U3RhcnQ6ICIvKiIsCiAgICBibG9ja0NvbW1lbnRFbmQ6ICIqLyIsCiAgICBsaW5lQ29tbWVudDogIi8vIgogIH07Cn0pOwoKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtaGF4ZSIsICJoYXhlIik7CgpDb2RlTWlycm9yLmRlZmluZU1vZGUoImh4bWwiLCBmdW5jdGlvbiAoKSB7CgogIHJldHVybiB7CiAgICBzdGFydFN0YXRlOiBmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgZGVmaW5lOiBmYWxzZSwKICAgICAgICBpblN0cmluZzogZmFsc2UKICAgICAgfTsKICAgIH0sCiAgICB0b2tlbjogZnVuY3Rpb24gKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgdmFyIGNoID0gc3RyZWFtLnBlZWsoKTsKICAgICAgdmFyIHNvbCA9IHN0cmVhbS5zb2woKTsKCiAgICAgIC8vLyogY29tbWVudHMgKi8KICAgICAgaWYgKGNoID09ICIjIikgewogICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgICByZXR1cm4gImNvbW1lbnQiOwogICAgICB9CiAgICAgIGlmIChzb2wgJiYgY2ggPT0gIi0iKSB7CiAgICAgICAgdmFyIHN0eWxlID0gInZhcmlhYmxlLTIiOwoKICAgICAgICBzdHJlYW0uZWF0KC8tLyk7CgogICAgICAgIGlmIChzdHJlYW0ucGVlaygpID09ICItIikgewogICAgICAgICAgc3RyZWFtLmVhdCgvLS8pOwogICAgICAgICAgc3R5bGUgPSAia2V5d29yZCBhIjsKICAgICAgICB9CgogICAgICAgIGlmIChzdHJlYW0ucGVlaygpID09ICJEIikgewogICAgICAgICAgc3RyZWFtLmVhdCgvW0RdLyk7CiAgICAgICAgICBzdHlsZSA9ICJrZXl3b3JkIGMiOwogICAgICAgICAgc3RhdGUuZGVmaW5lID0gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW0EtWl0vaSk7CiAgICAgICAgcmV0dXJuIHN0eWxlOwogICAgICB9CgogICAgICB2YXIgY2ggPSBzdHJlYW0ucGVlaygpOwoKICAgICAgaWYgKHN0YXRlLmluU3RyaW5nID09IGZhbHNlICYmIGNoID09ICInIikgewogICAgICAgIHN0YXRlLmluU3RyaW5nID0gdHJ1ZTsKICAgICAgICBjaCA9IHN0cmVhbS5uZXh0KCk7CiAgICAgIH0KCiAgICAgIGlmIChzdGF0ZS5pblN0cmluZyA9PSB0cnVlKSB7CiAgICAgICAgaWYgKHN0cmVhbS5za2lwVG8oIiciKSkgewoKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICAgIH0KCiAgICAgICAgaWYgKHN0cmVhbS5wZWVrKCkgPT0gIiciKSB7CiAgICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgICAgc3RhdGUuaW5TdHJpbmcgPSBmYWxzZTsKICAgICAgICB9CgogICAgICAgIHJldHVybiAic3RyaW5nIjsKICAgICAgfQoKICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9LAogICAgbGluZUNvbW1lbnQ6ICIjIgogIH07Cn0pOwoKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtaHhtbCIsICJoeG1sIik7Cgp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/haxe/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogSGF4ZSBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9ImhheGUuanMiPjwvc2NyaXB0Pgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPi5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazt9PC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aDE+Q29kZU1pcnJvcjwvaDE+PGltZyBpZD1sb2dvIHNyYz0iLi4vLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+TGFuZ3VhZ2UgbW9kZXM8L2E+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPkhheGU8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPkhheGUgbW9kZTwvaDI+CgoKPGRpdj48cD48dGV4dGFyZWEgaWQ9ImNvZGUtaGF4ZSIgbmFtZT0iY29kZSI+CmltcG9ydCBvbmUudHdvLlRocmVlOwoKQGF0dHIoInRlc3QiKQpjbGFzcyBGb28mbHQ7VCZndDsgZXh0ZW5kcyBUaHJlZQp7CglwdWJsaWMgZnVuY3Rpb24gbmV3KCkKCXsKCQlub0ZvbyA9IDEyOwoJfQoJCglwdWJsaWMgc3RhdGljIGlubGluZSBmdW5jdGlvbiBkb0ZvbyhvYmo6e2s6SW50LCBsOkZsb2F0fSk6SW50Cgl7CgkJZm9yKGkgaW4gMC4uLjEwKQoJCXsKCQkJb2JqLmsrKzsKCQkJdHJhY2UoaSk7CgkJCXZhciB2YXIxID0gbmV3IEFycmF5KCk7CgkJCWlmKHZhcjEubGVuZ3RoID4gMSkKCQkJCXRocm93ICJFcnJvciI7CgkJfQoJCS8vIFRoZSBmb2xsb3dpbmcgbGluZSBzaG91bGQgbm90IGJlIGNvbG9yZWQsIHRoZSB2YXJpYWJsZSBpcyBzY29wZWQgb3V0CgkJdmFyMTsKCQkvKiBNdWx0aSBsaW5lCgkJICogQ29tbWVudCB0ZXN0CgkJICovCgkJcmV0dXJuIG9iai5rOwoJfQoJcHJpdmF0ZSBmdW5jdGlvbiBiYXIoKTpWb2lkCgl7CgkJI2lmIGZsYXNoCgkJdmFyIHQxOlN0cmluZyA9ICIxLjIxIjsKCQkjZW5kCgkJdHJ5IHsKCQkJZG9Gb28oe2s6MywgbDoxLjJ9KTsKCQl9CgkJY2F0Y2ggKGUgOiBTdHJpbmcpIHsKCQkJdHJhY2UoZSk7CgkJfQoJCXZhciB0MjpGbG9hdCA9IGNhc3QoMy4yKTsKCQl2YXIgdDM6aGF4ZS5UaW1lciA9IG5ldyBoYXhlLlRpbWVyKCk7CgkJdmFyIHQ0ID0ge2s6U3RkLmludCh0MiksIGw6U3RkLnBhcnNlRmxvYXQodDEpfTsKCQl2YXIgdDUgPSB+LzEyMysuKiQvaTsKCQlkb0Zvbyh0NCk7CgkJdW50eXBlZCB0MSA9IDQ7CgkJYm9iID0gbmV3IEZvbyZsdDtJbnQmZ3Q7Cgl9CglwdWJsaWMgdmFyIG9rRm9vKGRlZmF1bHQsIG5ldmVyKTpGbG9hdDsKCXZhciBub0ZvbyhnZXRGb28sIG51bGwpOkludDsKCWZ1bmN0aW9uIGdldEZvbygpOkludCB7CgkJcmV0dXJuIG5vRm9vOwoJfQoJCglwdWJsaWMgdmFyIHRocmVlOkludDsKfQplbnVtIENvbG9yCnsKCXJlZDsKCWdyZWVuOwoJYmx1ZTsKCWdyZXkoIHYgOiBJbnQgKTsKCXJnYiAocjpJbnQsZzpJbnQsYjpJbnQpOwp9CjwvdGV4dGFyZWE+PC9wPgoKPHA+SHhtbCBtb2RlOjwvcD4KCjxwPjx0ZXh0YXJlYSBpZD0iY29kZS1oeG1sIj4KLWNwIHRlc3QKLWpzIHBhdGgvdG8vZmlsZS5qcwojLXJlbWFwIG5tZTpmbGFzaAotLW5leHQKLUQgc291cmNlLW1hcC1jb250ZW50Ci1jbWQgJ3Rlc3QnCi1saWIgbGltZQo8L3RleHRhcmVhPjwvcD4KPC9kaXY+CgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlLWhheGUiKSwgewogICAgICAJbW9kZTogImhheGUiLAogICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgICAgIGluZGVudFVuaXQ6IDQsCiAgICAgICAgaW5kZW50V2l0aFRhYnM6IHRydWUKICAgICAgfSk7CiAgICAgIAogICAgICBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZS1oeG1sIiksIHsKICAgICAgCW1vZGU6ICJoeG1sIiwKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgICAgICBpbmRlbnRVbml0OiA0LAogICAgICAgIGluZGVudFdpdGhUYWJzOiB0cnVlCiAgICAgIH0pOwogICAgPC9zY3JpcHQ+CgogICAgPHA+PHN0cm9uZz5NSU1FIHR5cGVzIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPnRleHQveC1oYXhlLCB0ZXh0L3gtaHhtbDwvY29kZT4uPC9wPgogIDwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/htmlembedded/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/htmlembedded/htmlembedded.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSwgcmVxdWlyZSgiLi4vaHRtbG1peGVkL2h0bWxtaXhlZCIpLAogICAgICAgIHJlcXVpcmUoIi4uLy4uL2FkZG9uL21vZGUvbXVsdGlwbGV4IikpOwogIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kKSAvLyBBTUQKICAgIGRlZmluZShbIi4uLy4uL2xpYi9jb2RlbWlycm9yIiwgIi4uL2h0bWxtaXhlZC9odG1sbWl4ZWQiLAogICAgICAgICAgICAiLi4vLi4vYWRkb24vbW9kZS9tdWx0aXBsZXgiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CgogIENvZGVNaXJyb3IuZGVmaW5lTW9kZSgiaHRtbGVtYmVkZGVkIiwgZnVuY3Rpb24oY29uZmlnLCBwYXJzZXJDb25maWcpIHsKICAgIHJldHVybiBDb2RlTWlycm9yLm11bHRpcGxleGluZ01vZGUoQ29kZU1pcnJvci5nZXRNb2RlKGNvbmZpZywgImh0bWxtaXhlZCIpLCB7CiAgICAgIG9wZW46IHBhcnNlckNvbmZpZy5vcGVuIHx8IHBhcnNlckNvbmZpZy5zY3JpcHRTdGFydFJlZ2V4IHx8ICI8JSIsCiAgICAgIGNsb3NlOiBwYXJzZXJDb25maWcuY2xvc2UgfHwgcGFyc2VyQ29uZmlnLnNjcmlwdEVuZFJlZ2V4IHx8ICIlPiIsCiAgICAgIG1vZGU6IENvZGVNaXJyb3IuZ2V0TW9kZShjb25maWcsIHBhcnNlckNvbmZpZy5zY3JpcHRpbmdNb2RlU3BlYykKICAgIH0pOwogIH0sICJodG1sbWl4ZWQiKTsKCiAgQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJhcHBsaWNhdGlvbi94LWVqcyIsIHtuYW1lOiAiaHRtbGVtYmVkZGVkIiwgc2NyaXB0aW5nTW9kZVNwZWM6ImphdmFzY3JpcHQifSk7CiAgQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJhcHBsaWNhdGlvbi94LWFzcHgiLCB7bmFtZTogImh0bWxlbWJlZGRlZCIsIHNjcmlwdGluZ01vZGVTcGVjOiJ0ZXh0L3gtY3NoYXJwIn0pOwogIENvZGVNaXJyb3IuZGVmaW5lTUlNRSgiYXBwbGljYXRpb24veC1qc3AiLCB7bmFtZTogImh0bWxlbWJlZGRlZCIsIHNjcmlwdGluZ01vZGVTcGVjOiJ0ZXh0L3gtamF2YSJ9KTsKICBDb2RlTWlycm9yLmRlZmluZU1JTUUoImFwcGxpY2F0aW9uL3gtZXJiIiwge25hbWU6ICJodG1sZW1iZWRkZWQiLCBzY3JpcHRpbmdNb2RlU3BlYzoicnVieSJ9KTsKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/htmlembedded/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogSHRtbCBFbWJlZGRlZCBTY3JpcHRzIG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4veG1sL3htbC5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9qYXZhc2NyaXB0L2phdmFzY3JpcHQuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vY3NzL2Nzcy5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9odG1sbWl4ZWQvaHRtbG1peGVkLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uLy4uL2FkZG9uL21vZGUvbXVsdGlwbGV4LmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Imh0bWxlbWJlZGRlZC5qcyI+PC9zY3JpcHQ+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+LkNvZGVNaXJyb3Ige2JvcmRlci10b3A6IDFweCBzb2xpZCBibGFjazsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO308L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxoMT5Db2RlTWlycm9yPC9oMT48aW1nIGlkPWxvZ28gc3JjPSIuLi8uLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5MYW5ndWFnZSBtb2RlczwvYT4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+SHRtbCBFbWJlZGRlZCBTY3JpcHRzPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5IdG1sIEVtYmVkZGVkIFNjcmlwdHMgbW9kZTwvaDI+Cjxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+CjwlCmZ1bmN0aW9uIGhlbGxvKHdobykgewoJcmV0dXJuICJIZWxsbyAiICsgd2hvOwp9CiU+ClRoaXMgaXMgYW4gZXhhbXBsZSBvZiBFSlMgKGVtYmVkZGVkIGphdmFzY3JpcHQpCjxwPlRoZSBwcm9ncmFtIHNheXMgPCU9IGhlbGxvKCJ3b3JsZCIpICU+LjwvcD4KPHNjcmlwdD4KCWFsZXJ0KCJBbmQgaGVyZSBpcyBzb21lIG5vcm1hbCBKUyBjb2RlIik7IC8vIGFsc28gY29sb3JlZAo8L3NjcmlwdD4KPC90ZXh0YXJlYT48L2Zvcm0+CgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgICAgICBtb2RlOiAiYXBwbGljYXRpb24veC1lanMiLAogICAgICAgIGluZGVudFVuaXQ6IDQsCiAgICAgICAgaW5kZW50V2l0aFRhYnM6IHRydWUKICAgICAgfSk7CiAgICA8L3NjcmlwdD4KCiAgICA8cD5Nb2RlIGZvciBodG1sIGVtYmVkZGVkIHNjcmlwdHMgbGlrZSBKU1AgYW5kIEFTUC5ORVQuIERlcGVuZHMgb24gbXVsdGlwbGV4IGFuZCBIdG1sTWl4ZWQgd2hpY2ggaW4gdHVybiBkZXBlbmRzIG9uCiAgICBKYXZhU2NyaXB0LCBDU1MgYW5kIFhNTC48YnIgLz5PdGhlciBkZXBlbmRlbmNpZXMgaW5jbHVkZSB0aG9zZSBvZiB0aGUgc2NyaXB0aW5nIGxhbmd1YWdlIGNob3Nlbi48L3A+CgogICAgPHA+PHN0cm9uZz5NSU1FIHR5cGVzIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPmFwcGxpY2F0aW9uL3gtYXNweDwvY29kZT4gKEFTUC5ORVQpLAogICAgPGNvZGU+YXBwbGljYXRpb24veC1lanM8L2NvZGU+IChFbWJlZGRlZCBKYXZhc2NyaXB0KSwgPGNvZGU+YXBwbGljYXRpb24veC1qc3A8L2NvZGU+IChKYXZhU2VydmVyIFBhZ2VzKQogICAgYW5kIDxjb2RlPmFwcGxpY2F0aW9uL3gtZXJiPC9jb2RlPjwvcD4KICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/htmlmixed/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/htmlmixed/htmlmixed.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSwgcmVxdWlyZSgiLi4veG1sL3htbCIpLCByZXF1aXJlKCIuLi9qYXZhc2NyaXB0L2phdmFzY3JpcHQiKSwgcmVxdWlyZSgiLi4vY3NzL2NzcyIpKTsKICBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCkgLy8gQU1ECiAgICBkZWZpbmUoWyIuLi8uLi9saWIvY29kZW1pcnJvciIsICIuLi94bWwveG1sIiwgIi4uL2phdmFzY3JpcHQvamF2YXNjcmlwdCIsICIuLi9jc3MvY3NzIl0sIG1vZCk7CiAgZWxzZSAvLyBQbGFpbiBicm93c2VyIGVudgogICAgbW9kKENvZGVNaXJyb3IpOwp9KShmdW5jdGlvbihDb2RlTWlycm9yKSB7CiAgInVzZSBzdHJpY3QiOwoKICB2YXIgZGVmYXVsdFRhZ3MgPSB7CiAgICBzY3JpcHQ6IFsKICAgICAgWyJsYW5nIiwgLyhqYXZhc2NyaXB0fGJhYmVsKS9pLCAiamF2YXNjcmlwdCJdLAogICAgICBbInR5cGUiLCAvXig/OnRleHR8YXBwbGljYXRpb24pXC8oPzp4LSk/KD86amF2YXxlY21hKXNjcmlwdCR8XiQvaSwgImphdmFzY3JpcHQiXSwKICAgICAgWyJ0eXBlIiwgLy4vLCAidGV4dC9wbGFpbiJdLAogICAgICBbbnVsbCwgbnVsbCwgImphdmFzY3JpcHQiXQogICAgXSwKICAgIHN0eWxlOiAgWwogICAgICBbImxhbmciLCAvXmNzcyQvaSwgImNzcyJdLAogICAgICBbInR5cGUiLCAvXih0ZXh0XC8pPyh4LSk/KHN0eWxlc2hlZXR8Y3NzKSQvaSwgImNzcyJdLAogICAgICBbInR5cGUiLCAvLi8sICJ0ZXh0L3BsYWluIl0sCiAgICAgIFtudWxsLCBudWxsLCAiY3NzIl0KICAgIF0KICB9OwoKICBmdW5jdGlvbiBtYXliZUJhY2t1cChzdHJlYW0sIHBhdCwgc3R5bGUpIHsKICAgIHZhciBjdXIgPSBzdHJlYW0uY3VycmVudCgpLCBjbG9zZSA9IGN1ci5zZWFyY2gocGF0KTsKICAgIGlmIChjbG9zZSA+IC0xKSB7CiAgICAgIHN0cmVhbS5iYWNrVXAoY3VyLmxlbmd0aCAtIGNsb3NlKTsKICAgIH0gZWxzZSBpZiAoY3VyLm1hdGNoKC88XC8/JC8pKSB7CiAgICAgIHN0cmVhbS5iYWNrVXAoY3VyLmxlbmd0aCk7CiAgICAgIGlmICghc3RyZWFtLm1hdGNoKHBhdCwgZmFsc2UpKSBzdHJlYW0ubWF0Y2goY3VyKTsKICAgIH0KICAgIHJldHVybiBzdHlsZTsKICB9CgogIHZhciBhdHRyUmVnZXhwQ2FjaGUgPSB7fTsKICBmdW5jdGlvbiBnZXRBdHRyUmVnZXhwKGF0dHIpIHsKICAgIHZhciByZWdleHAgPSBhdHRyUmVnZXhwQ2FjaGVbYXR0cl07CiAgICBpZiAocmVnZXhwKSByZXR1cm4gcmVnZXhwOwogICAgcmV0dXJuIGF0dHJSZWdleHBDYWNoZVthdHRyXSA9IG5ldyBSZWdFeHAoIlxccysiICsgYXR0ciArICJcXHMqPVxccyooJ3xcIik/KFteJ1wiXSspKCd8XCIpP1xccyoiKTsKICB9CgogIGZ1bmN0aW9uIGdldEF0dHJWYWx1ZSh0ZXh0LCBhdHRyKSB7CiAgICB2YXIgbWF0Y2ggPSB0ZXh0Lm1hdGNoKGdldEF0dHJSZWdleHAoYXR0cikpCiAgICByZXR1cm4gbWF0Y2ggPyAvXlxzKiguKj8pXHMqJC8uZXhlYyhtYXRjaFsyXSlbMV0gOiAiIgogIH0KCiAgZnVuY3Rpb24gZ2V0VGFnUmVnZXhwKHRhZ05hbWUsIGFuY2hvcmVkKSB7CiAgICByZXR1cm4gbmV3IFJlZ0V4cCgoYW5jaG9yZWQgPyAiXiIgOiAiIikgKyAiPFwvXHMqIiArIHRhZ05hbWUgKyAiXHMqPiIsICJpIik7CiAgfQoKICBmdW5jdGlvbiBhZGRUYWdzKGZyb20sIHRvKSB7CiAgICBmb3IgKHZhciB0YWcgaW4gZnJvbSkgewogICAgICB2YXIgZGVzdCA9IHRvW3RhZ10gfHwgKHRvW3RhZ10gPSBbXSk7CiAgICAgIHZhciBzb3VyY2UgPSBmcm9tW3RhZ107CiAgICAgIGZvciAodmFyIGkgPSBzb3VyY2UubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pCiAgICAgICAgZGVzdC51bnNoaWZ0KHNvdXJjZVtpXSkKICAgIH0KICB9CgogIGZ1bmN0aW9uIGZpbmRNYXRjaGluZ01vZGUodGFnSW5mbywgdGFnVGV4dCkgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0YWdJbmZvLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBzcGVjID0gdGFnSW5mb1tpXTsKICAgICAgaWYgKCFzcGVjWzBdIHx8IHNwZWNbMV0udGVzdChnZXRBdHRyVmFsdWUodGFnVGV4dCwgc3BlY1swXSkpKSByZXR1cm4gc3BlY1syXTsKICAgIH0KICB9CgogIENvZGVNaXJyb3IuZGVmaW5lTW9kZSgiaHRtbG1peGVkIiwgZnVuY3Rpb24gKGNvbmZpZywgcGFyc2VyQ29uZmlnKSB7CiAgICB2YXIgaHRtbE1vZGUgPSBDb2RlTWlycm9yLmdldE1vZGUoY29uZmlnLCB7CiAgICAgIG5hbWU6ICJ4bWwiLAogICAgICBodG1sTW9kZTogdHJ1ZSwKICAgICAgbXVsdGlsaW5lVGFnSW5kZW50RmFjdG9yOiBwYXJzZXJDb25maWcubXVsdGlsaW5lVGFnSW5kZW50RmFjdG9yLAogICAgICBtdWx0aWxpbmVUYWdJbmRlbnRQYXN0VGFnOiBwYXJzZXJDb25maWcubXVsdGlsaW5lVGFnSW5kZW50UGFzdFRhZwogICAgfSk7CgogICAgdmFyIHRhZ3MgPSB7fTsKICAgIHZhciBjb25maWdUYWdzID0gcGFyc2VyQ29uZmlnICYmIHBhcnNlckNvbmZpZy50YWdzLCBjb25maWdTY3JpcHQgPSBwYXJzZXJDb25maWcgJiYgcGFyc2VyQ29uZmlnLnNjcmlwdFR5cGVzOwogICAgYWRkVGFncyhkZWZhdWx0VGFncywgdGFncyk7CiAgICBpZiAoY29uZmlnVGFncykgYWRkVGFncyhjb25maWdUYWdzLCB0YWdzKTsKICAgIGlmIChjb25maWdTY3JpcHQpIGZvciAodmFyIGkgPSBjb25maWdTY3JpcHQubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pCiAgICAgIHRhZ3Muc2NyaXB0LnVuc2hpZnQoWyJ0eXBlIiwgY29uZmlnU2NyaXB0W2ldLm1hdGNoZXMsIGNvbmZpZ1NjcmlwdFtpXS5tb2RlXSkKCiAgICBmdW5jdGlvbiBodG1sKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgdmFyIHN0eWxlID0gaHRtbE1vZGUudG9rZW4oc3RyZWFtLCBzdGF0ZS5odG1sU3RhdGUpLCB0YWcgPSAvXGJ0YWdcYi8udGVzdChzdHlsZSksIHRhZ05hbWUKICAgICAgaWYgKHRhZyAmJiAhL1s8PlxzXC9dLy50ZXN0KHN0cmVhbS5jdXJyZW50KCkpICYmCiAgICAgICAgICAodGFnTmFtZSA9IHN0YXRlLmh0bWxTdGF0ZS50YWdOYW1lICYmIHN0YXRlLmh0bWxTdGF0ZS50YWdOYW1lLnRvTG93ZXJDYXNlKCkpICYmCiAgICAgICAgICB0YWdzLmhhc093blByb3BlcnR5KHRhZ05hbWUpKSB7CiAgICAgICAgc3RhdGUuaW5UYWcgPSB0YWdOYW1lICsgIiAiCiAgICAgIH0gZWxzZSBpZiAoc3RhdGUuaW5UYWcgJiYgdGFnICYmIC8+JC8udGVzdChzdHJlYW0uY3VycmVudCgpKSkgewogICAgICAgIHZhciBpblRhZyA9IC9eKFtcU10rKSAoLiopLy5leGVjKHN0YXRlLmluVGFnKQogICAgICAgIHN0YXRlLmluVGFnID0gbnVsbAogICAgICAgIHZhciBtb2RlU3BlYyA9IHN0cmVhbS5jdXJyZW50KCkgPT0gIj4iICYmIGZpbmRNYXRjaGluZ01vZGUodGFnc1tpblRhZ1sxXV0sIGluVGFnWzJdKQogICAgICAgIHZhciBtb2RlID0gQ29kZU1pcnJvci5nZXRNb2RlKGNvbmZpZywgbW9kZVNwZWMpCiAgICAgICAgdmFyIGVuZFRhZ0EgPSBnZXRUYWdSZWdleHAoaW5UYWdbMV0sIHRydWUpLCBlbmRUYWcgPSBnZXRUYWdSZWdleHAoaW5UYWdbMV0sIGZhbHNlKTsKICAgICAgICBzdGF0ZS50b2tlbiA9IGZ1bmN0aW9uIChzdHJlYW0sIHN0YXRlKSB7CiAgICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKGVuZFRhZ0EsIGZhbHNlKSkgewogICAgICAgICAgICBzdGF0ZS50b2tlbiA9IGh0bWw7CiAgICAgICAgICAgIHN0YXRlLmxvY2FsU3RhdGUgPSBzdGF0ZS5sb2NhbE1vZGUgPSBudWxsOwogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBtYXliZUJhY2t1cChzdHJlYW0sIGVuZFRhZywgc3RhdGUubG9jYWxNb2RlLnRva2VuKHN0cmVhbSwgc3RhdGUubG9jYWxTdGF0ZSkpOwogICAgICAgIH07CiAgICAgICAgc3RhdGUubG9jYWxNb2RlID0gbW9kZTsKICAgICAgICBzdGF0ZS5sb2NhbFN0YXRlID0gQ29kZU1pcnJvci5zdGFydFN0YXRlKG1vZGUsIGh0bWxNb2RlLmluZGVudChzdGF0ZS5odG1sU3RhdGUsICIiKSk7CiAgICAgIH0gZWxzZSBpZiAoc3RhdGUuaW5UYWcpIHsKICAgICAgICBzdGF0ZS5pblRhZyArPSBzdHJlYW0uY3VycmVudCgpCiAgICAgICAgaWYgKHN0cmVhbS5lb2woKSkgc3RhdGUuaW5UYWcgKz0gIiAiCiAgICAgIH0KICAgICAgcmV0dXJuIHN0eWxlOwogICAgfTsKCiAgICByZXR1cm4gewogICAgICBzdGFydFN0YXRlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIHN0YXRlID0gQ29kZU1pcnJvci5zdGFydFN0YXRlKGh0bWxNb2RlKTsKICAgICAgICByZXR1cm4ge3Rva2VuOiBodG1sLCBpblRhZzogbnVsbCwgbG9jYWxNb2RlOiBudWxsLCBsb2NhbFN0YXRlOiBudWxsLCBodG1sU3RhdGU6IHN0YXRlfTsKICAgICAgfSwKCiAgICAgIGNvcHlTdGF0ZTogZnVuY3Rpb24gKHN0YXRlKSB7CiAgICAgICAgdmFyIGxvY2FsOwogICAgICAgIGlmIChzdGF0ZS5sb2NhbFN0YXRlKSB7CiAgICAgICAgICBsb2NhbCA9IENvZGVNaXJyb3IuY29weVN0YXRlKHN0YXRlLmxvY2FsTW9kZSwgc3RhdGUubG9jYWxTdGF0ZSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB7dG9rZW46IHN0YXRlLnRva2VuLCBpblRhZzogc3RhdGUuaW5UYWcsCiAgICAgICAgICAgICAgICBsb2NhbE1vZGU6IHN0YXRlLmxvY2FsTW9kZSwgbG9jYWxTdGF0ZTogbG9jYWwsCiAgICAgICAgICAgICAgICBodG1sU3RhdGU6IENvZGVNaXJyb3IuY29weVN0YXRlKGh0bWxNb2RlLCBzdGF0ZS5odG1sU3RhdGUpfTsKICAgICAgfSwKCiAgICAgIHRva2VuOiBmdW5jdGlvbiAoc3RyZWFtLCBzdGF0ZSkgewogICAgICAgIHJldHVybiBzdGF0ZS50b2tlbihzdHJlYW0sIHN0YXRlKTsKICAgICAgfSwKCiAgICAgIGluZGVudDogZnVuY3Rpb24gKHN0YXRlLCB0ZXh0QWZ0ZXIpIHsKICAgICAgICBpZiAoIXN0YXRlLmxvY2FsTW9kZSB8fCAvXlxzKjxcLy8udGVzdCh0ZXh0QWZ0ZXIpKQogICAgICAgICAgcmV0dXJuIGh0bWxNb2RlLmluZGVudChzdGF0ZS5odG1sU3RhdGUsIHRleHRBZnRlcik7CiAgICAgICAgZWxzZSBpZiAoc3RhdGUubG9jYWxNb2RlLmluZGVudCkKICAgICAgICAgIHJldHVybiBzdGF0ZS5sb2NhbE1vZGUuaW5kZW50KHN0YXRlLmxvY2FsU3RhdGUsIHRleHRBZnRlcik7CiAgICAgICAgZWxzZQogICAgICAgICAgcmV0dXJuIENvZGVNaXJyb3IuUGFzczsKICAgICAgfSwKCiAgICAgIGlubmVyTW9kZTogZnVuY3Rpb24gKHN0YXRlKSB7CiAgICAgICAgcmV0dXJuIHtzdGF0ZTogc3RhdGUubG9jYWxTdGF0ZSB8fCBzdGF0ZS5odG1sU3RhdGUsIG1vZGU6IHN0YXRlLmxvY2FsTW9kZSB8fCBodG1sTW9kZX07CiAgICAgIH0KICAgIH07CiAgfSwgInhtbCIsICJqYXZhc2NyaXB0IiwgImNzcyIpOwoKICBDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQvaHRtbCIsICJodG1sbWl4ZWQiKTsKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/htmlmixed/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogSFRNTCBtaXhlZCBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uLy4uL2FkZG9uL3NlbGVjdGlvbi9zZWxlY3Rpb24tcG9pbnRlci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi94bWwveG1sLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL2phdmFzY3JpcHQvamF2YXNjcmlwdC5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9jc3MvY3NzLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL3Zic2NyaXB0L3Zic2NyaXB0LmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Imh0bWxtaXhlZC5qcyI+PC9zY3JpcHQ+CjxzdHlsZT4uQ29kZU1pcnJvciB7Ym9yZGVyLXRvcDogMXB4IHNvbGlkIGJsYWNrOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGgxPkNvZGVNaXJyb3I8L2gxPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5IVE1MIG1peGVkPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5IVE1MIG1peGVkIG1vZGU8L2gyPgo8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgo8aHRtbCBzdHlsZT0iY29sb3I6IGdyZWVuIj4KICA8IS0tIHRoaXMgaXMgYSBjb21tZW50IC0tPgogIDxoZWFkPgogICAgPHRpdGxlPk1peGVkIEhUTUwgRXhhbXBsZTwvdGl0bGU+CiAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgogICAgICBoMSB7Zm9udC1mYW1pbHk6IGNvbWljIHNhbnM7IGNvbG9yOiAjZjBmO30KICAgICAgZGl2IHtiYWNrZ3JvdW5kOiB5ZWxsb3cgIWltcG9ydGFudDt9CiAgICAgIGJvZHkgewogICAgICAgIG1heC13aWR0aDogNTBlbTsKICAgICAgICBtYXJnaW46IDFlbSAyZW0gMWVtIDVlbTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L2hlYWQ+CiAgPGJvZHk+CiAgICA8aDE+TWl4ZWQgSFRNTCBFeGFtcGxlPC9oMT4KICAgIDxzY3JpcHQ+CiAgICAgIGZ1bmN0aW9uIGpzRnVuYyhhcmcxLCBhcmcyKSB7CiAgICAgICAgaWYgKGFyZzEgJiYgYXJnMikgZG9jdW1lbnQuYm9keS5pbm5lckhUTUwgPSAiYWNob28iOwogICAgICB9CiAgICA8L3NjcmlwdD4KICA8L2JvZHk+CjwvaHRtbD4KPC90ZXh0YXJlYT48L2Zvcm0+CiAgICA8c2NyaXB0PgogICAgICAvLyBEZWZpbmUgYW4gZXh0ZW5kZWQgbWl4ZWQtbW9kZSB0aGF0IHVuZGVyc3RhbmRzIHZic2NyaXB0IGFuZAogICAgICAvLyBsZWF2ZXMgbXVzdGFjaGUvaGFuZGxlYmFycyBlbWJlZGRlZCB0ZW1wbGF0ZXMgaW4gaHRtbCBtb2RlCiAgICAgIHZhciBtaXhlZE1vZGUgPSB7CiAgICAgICAgbmFtZTogImh0bWxtaXhlZCIsCiAgICAgICAgc2NyaXB0VHlwZXM6IFt7bWF0Y2hlczogL1wveC1oYW5kbGViYXJzLXRlbXBsYXRlfFwveC1tdXN0YWNoZS9pLAogICAgICAgICAgICAgICAgICAgICAgIG1vZGU6IG51bGx9LAogICAgICAgICAgICAgICAgICAgICAge21hdGNoZXM6IC8odGV4dHxhcHBsaWNhdGlvbilcLyh4LSk/dmIoYXxzY3JpcHQpL2ksCiAgICAgICAgICAgICAgICAgICAgICAgbW9kZTogInZic2NyaXB0In1dCiAgICAgIH07CiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICAgICAgbW9kZTogbWl4ZWRNb2RlLAogICAgICAgIHNlbGVjdGlvblBvaW50ZXI6IHRydWUKICAgICAgfSk7CiAgICA8L3NjcmlwdD4KCiAgICA8cD5UaGUgSFRNTCBtaXhlZCBtb2RlIGRlcGVuZHMgb24gdGhlIFhNTCwgSmF2YVNjcmlwdCwgYW5kIENTUyBtb2Rlcy48L3A+CgogICAgPHA+SXQgdGFrZXMgYW4gb3B0aW9uYWwgbW9kZSBjb25maWd1cmF0aW9uCiAgICBvcHRpb24sIDxjb2RlPnNjcmlwdFR5cGVzPC9jb2RlPiwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gYWRkIGN1c3RvbQogICAgYmVoYXZpb3IgZm9yIHNwZWNpZmljIDxjb2RlPiZsdDtzY3JpcHQgdHlwZT0iLi4uIj48L2NvZGU+IHRhZ3MuIElmCiAgICBnaXZlbiwgaXQgc2hvdWxkIGhvbGQgYW4gYXJyYXkgb2YgPGNvZGU+e21hdGNoZXMsIG1vZGV9PC9jb2RlPgogICAgb2JqZWN0cywgd2hlcmUgPGNvZGU+bWF0Y2hlczwvY29kZT4gaXMgYSBzdHJpbmcgb3IgcmVnZXhwIHRoYXQKICAgIG1hdGNoZXMgdGhlIHNjcmlwdCB0eXBlLCBhbmQgPGNvZGU+bW9kZTwvY29kZT4gaXMKICAgIGVpdGhlciA8Y29kZT5udWxsPC9jb2RlPiwgZm9yIHNjcmlwdCB0eXBlcyB0aGF0IHNob3VsZCBzdGF5IGluCiAgICBIVE1MIG1vZGUsIG9yIGEgPGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sI29wdGlvbl9tb2RlIj5tb2RlCiAgICBzcGVjPC9hPiBjb3JyZXNwb25kaW5nIHRvIHRoZSBtb2RlIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZQogICAgc2NyaXB0LjwvcD4KCiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC9odG1sPC9jb2RlPgogICAgKHJlZGVmaW5lZCwgb25seSB0YWtlcyBlZmZlY3QgaWYgeW91IGxvYWQgdGhpcyBwYXJzZXIgYWZ0ZXIgdGhlCiAgICBYTUwgcGFyc2VyKS48L3A+CgogIDwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/http/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/http/http.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJodHRwIiwgZnVuY3Rpb24oKSB7CiAgZnVuY3Rpb24gZmFpbEZpcnN0TGluZShzdHJlYW0sIHN0YXRlKSB7CiAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICBzdGF0ZS5jdXIgPSBoZWFkZXI7CiAgICByZXR1cm4gImVycm9yIjsKICB9CgogIGZ1bmN0aW9uIHN0YXJ0KHN0cmVhbSwgc3RhdGUpIHsKICAgIGlmIChzdHJlYW0ubWF0Y2goL15IVFRQXC9cZFwuXGQvKSkgewogICAgICBzdGF0ZS5jdXIgPSByZXNwb25zZVN0YXR1c0NvZGU7CiAgICAgIHJldHVybiAia2V5d29yZCI7CiAgICB9IGVsc2UgaWYgKHN0cmVhbS5tYXRjaCgvXltBLVpdKy8pICYmIC9bIFx0XS8udGVzdChzdHJlYW0ucGVlaygpKSkgewogICAgICBzdGF0ZS5jdXIgPSByZXF1ZXN0UGF0aDsKICAgICAgcmV0dXJuICJrZXl3b3JkIjsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBmYWlsRmlyc3RMaW5lKHN0cmVhbSwgc3RhdGUpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gcmVzcG9uc2VTdGF0dXNDb2RlKHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBjb2RlID0gc3RyZWFtLm1hdGNoKC9eXGQrLyk7CiAgICBpZiAoIWNvZGUpIHJldHVybiBmYWlsRmlyc3RMaW5lKHN0cmVhbSwgc3RhdGUpOwoKICAgIHN0YXRlLmN1ciA9IHJlc3BvbnNlU3RhdHVzVGV4dDsKICAgIHZhciBzdGF0dXMgPSBOdW1iZXIoY29kZVswXSk7CiAgICBpZiAoc3RhdHVzID49IDEwMCAmJiBzdGF0dXMgPCAyMDApIHsKICAgICAgcmV0dXJuICJwb3NpdGl2ZSBpbmZvcm1hdGlvbmFsIjsKICAgIH0gZWxzZSBpZiAoc3RhdHVzID49IDIwMCAmJiBzdGF0dXMgPCAzMDApIHsKICAgICAgcmV0dXJuICJwb3NpdGl2ZSBzdWNjZXNzIjsKICAgIH0gZWxzZSBpZiAoc3RhdHVzID49IDMwMCAmJiBzdGF0dXMgPCA0MDApIHsKICAgICAgcmV0dXJuICJwb3NpdGl2ZSByZWRpcmVjdCI7CiAgICB9IGVsc2UgaWYgKHN0YXR1cyA+PSA0MDAgJiYgc3RhdHVzIDwgNTAwKSB7CiAgICAgIHJldHVybiAibmVnYXRpdmUgY2xpZW50LWVycm9yIjsKICAgIH0gZWxzZSBpZiAoc3RhdHVzID49IDUwMCAmJiBzdGF0dXMgPCA2MDApIHsKICAgICAgcmV0dXJuICJuZWdhdGl2ZSBzZXJ2ZXItZXJyb3IiOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuICJlcnJvciI7CiAgICB9CiAgfQoKICBmdW5jdGlvbiByZXNwb25zZVN0YXR1c1RleHQoc3RyZWFtLCBzdGF0ZSkgewogICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgc3RhdGUuY3VyID0gaGVhZGVyOwogICAgcmV0dXJuIG51bGw7CiAgfQoKICBmdW5jdGlvbiByZXF1ZXN0UGF0aChzdHJlYW0sIHN0YXRlKSB7CiAgICBzdHJlYW0uZWF0V2hpbGUoL1xTLyk7CiAgICBzdGF0ZS5jdXIgPSByZXF1ZXN0UHJvdG9jb2w7CiAgICByZXR1cm4gInN0cmluZy0yIjsKICB9CgogIGZ1bmN0aW9uIHJlcXVlc3RQcm90b2NvbChzdHJlYW0sIHN0YXRlKSB7CiAgICBpZiAoc3RyZWFtLm1hdGNoKC9eSFRUUFwvXGRcLlxkJC8pKSB7CiAgICAgIHN0YXRlLmN1ciA9IGhlYWRlcjsKICAgICAgcmV0dXJuICJrZXl3b3JkIjsKICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiBmYWlsRmlyc3RMaW5lKHN0cmVhbSwgc3RhdGUpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gaGVhZGVyKHN0cmVhbSkgewogICAgaWYgKHN0cmVhbS5zb2woKSAmJiAhc3RyZWFtLmVhdCgvWyBcdF0vKSkgewogICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eLio/Oi8pKSB7CiAgICAgICAgcmV0dXJuICJhdG9tIjsKICAgICAgfSBlbHNlIHsKICAgICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICAgICAgcmV0dXJuICJlcnJvciI7CiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgfQogIH0KCiAgZnVuY3Rpb24gYm9keShzdHJlYW0pIHsKICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgIHJldHVybiBudWxsOwogIH0KCiAgcmV0dXJuIHsKICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHZhciBjdXIgPSBzdGF0ZS5jdXI7CiAgICAgIGlmIChjdXIgIT0gaGVhZGVyICYmIGN1ciAhPSBib2R5ICYmIHN0cmVhbS5lYXRTcGFjZSgpKSByZXR1cm4gbnVsbDsKICAgICAgcmV0dXJuIGN1cihzdHJlYW0sIHN0YXRlKTsKICAgIH0sCgogICAgYmxhbmtMaW5lOiBmdW5jdGlvbihzdGF0ZSkgewogICAgICBzdGF0ZS5jdXIgPSBib2R5OwogICAgfSwKCiAgICBzdGFydFN0YXRlOiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHtjdXI6IHN0YXJ0fTsKICAgIH0KICB9Owp9KTsKCkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgibWVzc2FnZS9odHRwIiwgImh0dHAiKTsKCn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/http/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogSFRUUCBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Imh0dHAuanMiPjwvc2NyaXB0Pgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPi5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazt9PC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aDE+Q29kZU1pcnJvcjwvaDE+PGltZyBpZD1sb2dvIHNyYz0iLi4vLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+TGFuZ3VhZ2UgbW9kZXM8L2E+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPkhUVFA8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPkhUVFAgbW9kZTwvaDI+CgoKPGRpdj48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgpQT1NUIC9zb21ld2hlcmUgSFRUUC8xLjEKSG9zdDogZXhhbXBsZS5jb20KSWYtTW9kaWZpZWQtU2luY2U6IFNhdCwgMjkgT2N0IDE5OTQgMTk6NDM6MzEgR01UCkNvbnRlbnQtVHlwZTogYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOwoJY2hhcnNldD11dGYtOApVc2VyLUFnZW50OiBNb3ppbGxhLzUuMCAoWDExOyBMaW51eCB4ODZfNjQpIEFwcGxlV2ViS2l0LzUzNi4xMSAoS0hUTUwsIGxpa2UgR2Vja28pIFVidW50dS8xMi4wNCBDaHJvbWl1bS8yMC4wLjExMzIuNDcgQ2hyb21lLzIwLjAuMTEzMi40NyBTYWZhcmkvNTM2LjExCgpUaGlzIGlzIHRoZSByZXF1ZXN0IGJvZHkhCjwvdGV4dGFyZWE+PC9kaXY+CgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHt9KTsKICAgIDwvc2NyaXB0PgoKICAgIDxwPjxzdHJvbmc+TUlNRSB0eXBlcyBkZWZpbmVkOjwvc3Ryb25nPiA8Y29kZT5tZXNzYWdlL2h0dHA8L2NvZGU+LjwvcD4KICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/idl/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/idl/idl.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CgogIGZ1bmN0aW9uIHdvcmRSZWdleHAod29yZHMpIHsKICAgIHJldHVybiBuZXcgUmVnRXhwKCdeKCgnICsgd29yZHMuam9pbignKXwoJykgKyAnKSlcXGInLCAnaScpOwogIH07CgogIHZhciBidWlsdGluQXJyYXkgPSBbCiAgICAnYV9jb3JyZWxhdGUnLCAnYWJzJywgJ2Fjb3MnLCAnYWRhcHRfaGlzdF9lcXVhbCcsICdhbG9nJywKICAgICdhbG9nMicsICdhbG9nMTAnLCAnYW1vZWJhJywgJ2Fubm90YXRlJywgJ2FwcF91c2VyX2RpcicsCiAgICAnYXBwX3VzZXJfZGlyX3F1ZXJ5JywgJ2FyZ19wcmVzZW50JywgJ2FycmF5X2VxdWFsJywgJ2FycmF5X2luZGljZXMnLAogICAgJ2Fycm93JywgJ2FzY2lpX3RlbXBsYXRlJywgJ2FzaW4nLCAnYXNzb2MnLCAnYXRhbicsCiAgICAnYXhpcycsICdheGlzJywgJ2JhbmRwYXNzX2ZpbHRlcicsICdiYW5kcmVqZWN0X2ZpbHRlcicsICdiYXJwbG90JywKICAgICdiYXJfcGxvdCcsICdiZXNlbGknLCAnYmVzZWxqJywgJ2Jlc2VsaycsICdiZXNlbHknLAogICAgJ2JldGEnLCAnYmlnaW50ZWdlcicsICdiaWxpbmVhcicsICdiaW5fZGF0ZScsICdiaW5hcnlfdGVtcGxhdGUnLAogICAgJ2JpbmRnZW4nLCAnYmlub21pYWwnLCAnYml0X2ZmcycsICdiaXRfcG9wdWxhdGlvbicsICdibGFzX2F4cHknLAogICAgJ2Jsa19jb24nLCAnYm9vbGFycicsICdib29sZWFuJywgJ2JveHBsb3QnLCAnYm94X2N1cnNvcicsCiAgICAnYnJlYWtwb2ludCcsICdicm95ZGVuJywgJ2J1YmJsZXBsb3QnLCAnYnV0dGVyd29ydGgnLCAnYnl0YXJyJywKICAgICdieXRlJywgJ2J5dGVvcmRlcicsICdieXRzY2wnLCAnY19jb3JyZWxhdGUnLCAnY2FsZW5kYXInLAogICAgJ2NhbGRhdCcsICdjYWxsX2V4dGVybmFsJywgJ2NhbGxfZnVuY3Rpb24nLCAnY2FsbF9tZXRob2QnLAogICAgJ2NhbGxfcHJvY2VkdXJlJywgJ2Nhbm55JywgJ2NhdGNoJywgJ2NkJywgJ2NkZicsICdjZWlsJywKICAgICdjaGVieXNoZXYnLCAnY2hlY2tfbWF0aCcsICdjaGlzcXJfY3ZmJywgJ2NoaXNxcl9wZGYnLCAnY2hvbGRjJywKICAgICdjaG9sc29sJywgJ2NpbmRnZW4nLCAnY2lyXzNwbnQnLCAnY2xpcGJvYXJkJywgJ2Nsb3NlJywKICAgICdjbHVzdF93dHMnLCAnY2x1c3RlcicsICdjbHVzdGVyX3RyZWUnLCAnY215a19jb252ZXJ0JywgJ2NvZGVfY292ZXJhZ2UnLAogICAgJ2NvbG9yX2NvbnZlcnQnLCAnY29sb3JfZXhjaGFuZ2UnLCAnY29sb3JfcXVhbicsICdjb2xvcl9yYW5nZV9tYXAnLAogICAgJ2NvbG9yYmFyJywgJ2NvbG9yaXplX3NhbXBsZScsICdjb2xvcm1hcF9hcHBsaWNhYmxlJywKICAgICdjb2xvcm1hcF9ncmFkaWVudCcsICdjb2xvcm1hcF9yb3RhdGlvbicsICdjb2xvcnRhYmxlJywKICAgICdjb21maXQnLCAnY29tbWFuZF9saW5lX2FyZ3MnLCAnY29tbW9uJywgJ2NvbXBpbGVfb3B0JywgJ2NvbXBsZXgnLAogICAgJ2NvbXBsZXhhcnInLCAnY29tcGxleHJvdW5kJywgJ2NvbXB1dGVfbWVzaF9ub3JtYWxzJywgJ2NvbmQnLCAnY29uZ3JpZCcsCiAgICAnY29uaicsICdjb25zdHJhaW5lZF9taW4nLCAnY29udG91cicsICdjb250b3VyJywgJ2NvbnZlcnRfY29vcmQnLAogICAgJ2NvbnZvbCcsICdjb252b2xfZmZ0JywgJ2Nvb3JkMnRvMycsICdjb3B5X2x1bicsICdjb3JyZWxhdGUnLAogICAgJ2NvcycsICdjb3NoJywgJ2NwdScsICdjcmFtZXInLCAnY3JlYXRlYm94cGxvdGRhdGEnLAogICAgJ2NyZWF0ZV9jdXJzb3InLCAnY3JlYXRlX3N0cnVjdCcsICdjcmVhdGVfdmlldycsICdjcm9zc3AnLCAnY3J2bGVuZ3RoJywKICAgICdjdF9sdW1pbmFuY2UnLCAnY3RpX3Rlc3QnLCAnY3Vyc29yJywgJ2N1cnZlZml0JywgJ2N2X2Nvb3JkJywKICAgICdjdnR0b2JtJywgJ2N3X2FuaW1hdGUnLCAnY3dfYW5pbWF0ZV9nZXRwJywgJ2N3X2FuaW1hdGVfbG9hZCcsCiAgICAnY3dfYW5pbWF0ZV9ydW4nLCAnY3dfYXJjYmFsbCcsICdjd19iZ3JvdXAnLCAnY3dfY2xyX2luZGV4JywKICAgICdjd19jb2xvcnNlbCcsICdjd19kZWZyb2knLCAnY3dfZmllbGQnLCAnY3dfZmlsZXNlbCcsICdjd19mb3JtJywKICAgICdjd19mc2xpZGVyJywgJ2N3X2xpZ2h0X2VkaXRvcicsICdjd19saWdodF9lZGl0b3JfZ2V0JywKICAgICdjd19saWdodF9lZGl0b3Jfc2V0JywgJ2N3X29yaWVudCcsICdjd19wYWxldHRlX2VkaXRvcicsCiAgICAnY3dfcGFsZXR0ZV9lZGl0b3JfZ2V0JywgJ2N3X3BhbGV0dGVfZWRpdG9yX3NldCcsICdjd19wZG1lbnUnLAogICAgJ2N3X3JnYnNsaWRlcicsICdjd190bXBsJywgJ2N3X3pvb20nLCAnZGJfZXhpc3RzJywKICAgICdkYmxhcnInLCAnZGNpbmRnZW4nLCAnZGNvbXBsZXgnLCAnZGNvbXBsZXhhcnInLCAnZGVmaW5lX2tleScsCiAgICAnZGVmaW5lX21zZ2JsaycsICdkZWZpbmVfbXNnYmxrX2Zyb21fZmlsZScsICdkZWZyb2knLCAnZGVmc3lzdicsCiAgICAnZGVsdmFyJywgJ2RlbmRyb19wbG90JywgJ2RlbmRyb2dyYW0nLCAnZGVyaXYnLCAnZGVyaXZzaWcnLAogICAgJ2RldGVybScsICdkZXZpY2UnLCAnZGZwbWluJywgJ2RpYWdfbWF0cml4JywgJ2RpYWxvZ19kYmNvbm5lY3QnLAogICAgJ2RpYWxvZ19tZXNzYWdlJywgJ2RpYWxvZ19waWNrZmlsZScsICdkaWFsb2dfcHJpbnRlcnNldHVwJywKICAgICdkaWFsb2dfcHJpbnRqb2InLCAnZGlhbG9nX3JlYWRfaW1hZ2UnLAogICAgJ2RpYWxvZ193cml0ZV9pbWFnZScsICdkaWN0aW9uYXJ5JywgJ2RpZ2l0YWxfZmlsdGVyJywgJ2RpbGF0ZScsICdkaW5kZ2VuJywKICAgICdkaXNzb2x2ZScsICdkaXN0JywgJ2Rpc3RhbmNlX21lYXN1cmUnLCAnZGxtX2xvYWQnLCAnZGxtX3JlZ2lzdGVyJywKICAgICdkb2NfbGlicmFyeScsICdkb3VibGUnLCAnZHJhd19yb2knLCAnZWRnZV9kb2cnLCAnZWZvbnQnLAogICAgJ2VpZ2VucWwnLCAnZWlnZW52ZWMnLCAnZWxsaXBzZScsICdlbG1oZXMnLCAnZW1ib3NzJywKICAgICdlbXB0eScsICdlbmFibGVfc3lzcnRuJywgJ2VvZicsICdlb3MnLCAnZXJhc2UnLAogICAgJ2VyZicsICdlcmZjJywgJ2VyZmN4JywgJ2Vyb2RlJywgJ2Vycm9ycGxvdCcsCiAgICAnZXJycGxvdCcsICdlc3RpbWF0b3JfZmlsdGVyJywgJ2V4ZWN1dGUnLCAnZXhpdCcsICdleHAnLAogICAgJ2V4cGFuZCcsICdleHBhbmRfcGF0aCcsICdleHBpbnQnLCAnZXh0cmFjJywgJ2V4dHJhY3Rfc2xpY2UnLAogICAgJ2ZfY3ZmJywgJ2ZfcGRmJywgJ2ZhY3RvcmlhbCcsICdmZnQnLCAnZmlsZV9iYXNlbmFtZScsCiAgICAnZmlsZV9jaG1vZCcsICdmaWxlX2NvcHknLCAnZmlsZV9kZWxldGUnLCAnZmlsZV9kaXJuYW1lJywKICAgICdmaWxlX2V4cGFuZF9wYXRoJywgJ2ZpbGVfZ3VuemlwJywgJ2ZpbGVfZ3ppcCcsICdmaWxlX2luZm8nLAogICAgJ2ZpbGVfbGluZXMnLCAnZmlsZV9saW5rJywgJ2ZpbGVfbWtkaXInLCAnZmlsZV9tb3ZlJywKICAgICdmaWxlX3BvbGxfaW5wdXQnLCAnZmlsZV9yZWFkbGluaycsICdmaWxlX3NhbWUnLAogICAgJ2ZpbGVfc2VhcmNoJywgJ2ZpbGVfdGFyJywgJ2ZpbGVfdGVzdCcsICdmaWxlX3VudGFyJywgJ2ZpbGVfdW56aXAnLAogICAgJ2ZpbGVfd2hpY2gnLCAnZmlsZV96aXAnLCAnZmlsZXBhdGgnLCAnZmluZGdlbicsICdmaW5pdGUnLAogICAgJ2ZpeCcsICdmbGljaycsICdmbG9hdCcsICdmbG9vcicsICdmbG93MycsCiAgICAnZmx0YXJyJywgJ2ZsdXNoJywgJ2Zvcm1hdF9heGlzX3ZhbHVlcycsICdmb3J3YXJkX2Z1bmN0aW9uJywgJ2ZyZWVfbHVuJywKICAgICdmc3RhdCcsICdmdWxzdHInLCAnZnVuY3QnLCAnZnVuY3Rpb24nLCAnZnZfdGVzdCcsCiAgICAnZnhfcm9vdCcsICdmel9yb290cycsICdnYW1tYScsICdnYW1tYV9jdCcsICdnYXVzc19jdmYnLAogICAgJ2dhdXNzX3BkZicsICdnYXVzc19zbW9vdGgnLCAnZ2F1c3MyZGZpdCcsICdnYXVzc2ZpdCcsCiAgICAnZ2F1c3NpYW5fZnVuY3Rpb24nLCAnZ2F1c3NpbnQnLCAnZ2V0X2RyaXZlX2xpc3QnLCAnZ2V0X2R4Zl9vYmplY3RzJywKICAgICdnZXRfa2JyZCcsICdnZXRfbG9naW5faW5mbycsCiAgICAnZ2V0X2x1bicsICdnZXRfc2NyZWVuX3NpemUnLCAnZ2V0ZW52JywgJ2dldHdpbmRvd3MnLCAnZ3JlZzJqdWwnLAogICAgJ2dyaWInLCAnZ3JpZF9pbnB1dCcsICdncmlkX3RwcycsICdncmlkMycsICdncmlkZGF0YScsCiAgICAnZ3NfaXRlcicsICdoX2VxX2N0JywgJ2hfZXFfaW50JywgJ2hhbm5pbmcnLCAnaGFzaCcsCiAgICAnaGRmJywgJ2hkZjUnLCAnaGVhcF9mcmVlJywgJ2hlYXBfZ2MnLCAnaGVhcF9ub3NhdmUnLAogICAgJ2hlYXBfcmVmY291bnQnLCAnaGVhcF9zYXZlJywgJ2hlbHAnLCAnaGlsYmVydCcsICdoaXN0XzJkJywKICAgICdoaXN0X2VxdWFsJywgJ2hpc3RvZ3JhbScsICdobHMnLCAnaG91Z2gnLCAnaHFyJywKICAgICdoc3YnLCAnaTE4bl9tdWx0aWJ5dGV0b3V0ZjgnLAogICAgJ2kxOG5fbXVsdGlieXRldG93aWRlY2hhcicsICdpMThuX3V0Zjh0b211bHRpYnl0ZScsCiAgICAnaTE4bl93aWRlY2hhcnRvbXVsdGlieXRlJywKICAgICdpYmV0YScsICdpY29udG91cicsICdpY29udmVydGNvb3JkJywgJ2lkZWxldGUnLCAnaWRlbnRpdHknLAogICAgJ2lkbF9iYXNlNjQnLCAnaWRsX2NvbnRhaW5lcicsICdpZGxfdmFsaWRuYW1lJywKICAgICdpZGxleGJyX2Fzc2lzdGFudCcsICdpZGxpdHN5c19jcmVhdGV0b29sJywKICAgICdpZGx1bml0JywgJ2llbGxpcHNlJywgJ2lnYW1tYScsICdpZ2V0Y3VycmVudCcsICdpZ2V0ZGF0YScsCiAgICAnaWdldGlkJywgJ2lnZXRwcm9wZXJ0eScsICdpaW1hZ2UnLCAnaW1hZ2UnLCAnaW1hZ2VfY29udCcsCiAgICAnaW1hZ2Vfc3RhdGlzdGljcycsICdpbWFnZV90aHJlc2hvbGQnLCAnaW1hZ2luYXJ5JywgJ2ltYXAnLCAnaW5kZ2VuJywKICAgICdpbnRfMmQnLCAnaW50XzNkJywgJ2ludF90YWJ1bGF0ZWQnLCAnaW50YXJyJywgJ2ludGVycG9sJywKICAgICdpbnRlcnBvbGF0ZScsICdpbnRlcnZhbF92b2x1bWUnLCAnaW52ZXJ0JywgJ2lvY3RsJywgJ2lvcGVuJywKICAgICdpcl9maWx0ZXInLCAnaXBsb3QnLCAnaXBvbHlnb24nLCAnaXBvbHlsaW5lJywgJ2lwdXRkYXRhJywKICAgICdpcmVnaXN0ZXInLCAnaXJlc2V0JywgJ2lyZXNvbHZlJywgJ2lyb3RhdGUnLCAnaXNhJywKICAgICdpc2F2ZScsICdpc2NhbGUnLCAnaXNldGN1cnJlbnQnLCAnaXNldHByb3BlcnR5JywgJ2lzaGZ0JywKICAgICdpc29jb250b3VyJywgJ2lzb3N1cmZhY2UnLCAnaXN1cmZhY2UnLCAnaXRleHQnLCAnaXRyYW5zbGF0ZScsCiAgICAnaXZlY3RvcicsICdpdm9sdW1lJywgJ2l6b29tJywgJ2pvdXJuYWwnLCAnanNvbl9wYXJzZScsCiAgICAnanNvbl9zZXJpYWxpemUnLCAnanVsMmdyZWcnLCAnanVsZGF5JywgJ2tleXdvcmRfc2V0JywgJ2tyaWcyZCcsCiAgICAna3VydG9zaXMnLCAna3dfdGVzdCcsICdsNjRpbmRnZW4nLCAnbGFfY2hvbGRjJywgJ2xhX2Nob2xtcHJvdmUnLAogICAgJ2xhX2Nob2xzb2wnLCAnbGFfZGV0ZXJtJywgJ2xhX2VpZ2VucHJvYmxlbScsICdsYV9laWdlbnFsJywgJ2xhX2VpZ2VudmVjJywKICAgICdsYV9lbG1oZXMnLCAnbGFfZ21fbGluZWFyX21vZGVsJywgJ2xhX2hxcicsICdsYV9pbnZlcnQnLAogICAgJ2xhX2xlYXN0X3NxdWFyZV9lcXVhbGl0eScsICdsYV9sZWFzdF9zcXVhcmVzJywgJ2xhX2xpbmVhcl9lcXVhdGlvbicsCiAgICAnbGFfbHVkYycsICdsYV9sdW1wcm92ZScsICdsYV9sdXNvbCcsCiAgICAnbGFfc3ZkJywgJ2xhX3RyaWRjJywgJ2xhX3RyaW1wcm92ZScsICdsYV90cmlxbCcsICdsYV90cmlyZWQnLAogICAgJ2xhX3RyaXNvbCcsICdsYWJlbF9kYXRlJywgJ2xhYmVsX3JlZ2lvbicsICdsYWRmaXQnLCAnbGFndWVycmUnLAogICAgJ2xhbWJkYScsICdsYW1iZGFwJywgJ2xhbWJlcnR3JywgJ2xhcGxhY2lhbicsICdsZWFzdF9zcXVhcmVzX2ZpbHRlcicsCiAgICAnbGVlZmlsdCcsICdsZWdlbmQnLCAnbGVnZW5kcmUnLCAnbGluYmNnJywgJ2xpbmRnZW4nLAogICAgJ2xpbmZpdCcsICdsaW5raW1hZ2UnLCAnbGlzdCcsICdsbF9hcmNfZGlzdGFuY2UnLCAnbG1maXQnLAogICAgJ2xtZ3InLCAnbG5nYW1tYScsICdsbnBfdGVzdCcsICdsb2FkY3QnLCAnbG9jYWxlX2dldCcsCiAgICAnbG9naWNhbF9hbmQnLCAnbG9naWNhbF9vcicsICdsb2dpY2FsX3RydWUnLCAnbG9uNjRhcnInLCAnbG9uYXJyJywKICAgICdsb25nJywgJ2xvbmc2NCcsICdsc29kZScsICdsdV9jb21wbGV4JywgJ2x1ZGMnLAogICAgJ2x1bXByb3ZlJywgJ2x1c29sJywgJ21fY29ycmVsYXRlJywgJ21hY2hhcicsICdtYWtlX2FycmF5JywKICAgICdtYWtlX2RsbCcsICdtYWtlX3J0JywgJ21hcCcsICdtYXBjb250aW5lbnRzJywgJ21hcGdyaWQnLAogICAgJ21hcF8ycG9pbnRzJywgJ21hcF9jb250aW5lbnRzJywgJ21hcF9ncmlkJywgJ21hcF9pbWFnZScsICdtYXBfcGF0Y2gnLAogICAgJ21hcF9wcm9qX2ZvcndhcmQnLCAnbWFwX3Byb2pfaW1hZ2UnLCAnbWFwX3Byb2pfaW5mbycsCiAgICAnbWFwX3Byb2pfaW5pdCcsICdtYXBfcHJval9pbnZlcnNlJywKICAgICdtYXBfc2V0JywgJ21hdHJpeF9tdWx0aXBseScsICdtYXRyaXhfcG93ZXInLCAnbWF4JywgJ21kX3Rlc3QnLAogICAgJ21lYW4nLCAnbWVhbmFic2RldicsICdtZWFuX2ZpbHRlcicsICdtZWRpYW4nLCAnbWVtb3J5JywKICAgICdtZXNoX2NsaXAnLCAnbWVzaF9kZWNpbWF0ZScsICdtZXNoX2lzc29saWQnLAogICAgJ21lc2hfbWVyZ2UnLCAnbWVzaF9udW10cmlhbmdsZXMnLAogICAgJ21lc2hfb2JqJywgJ21lc2hfc21vb3RoJywgJ21lc2hfc3VyZmFjZWFyZWEnLAogICAgJ21lc2hfdmFsaWRhdGUnLCAnbWVzaF92b2x1bWUnLAogICAgJ21lc3NhZ2UnLCAnbWluJywgJ21pbl9jdXJ2ZV9zdXJmJywgJ21rX2h0bWxfaGVscCcsICdtb2RpZnljdCcsCiAgICAnbW9tZW50JywgJ21vcnBoX2Nsb3NlJywgJ21vcnBoX2Rpc3RhbmNlJywKICAgICdtb3JwaF9ncmFkaWVudCcsICdtb3JwaF9oaXRvcm1pc3MnLAogICAgJ21vcnBoX29wZW4nLCAnbW9ycGhfdGhpbicsICdtb3JwaF90b3BoYXQnLCAnbXVsdGknLCAnbl9lbGVtZW50cycsCiAgICAnbl9wYXJhbXMnLCAnbl90YWdzJywgJ25jZGYnLCAnbmV3dG9uJywgJ25vaXNlX2h1cmwnLAogICAgJ25vaXNlX3BpY2snLCAnbm9pc2Vfc2NhdHRlcicsICdub2lzZV9zbHVyJywgJ25vcm0nLCAnb2JqX2NsYXNzJywKICAgICdvYmpfZGVzdHJveScsICdvYmpfaGFzbWV0aG9kJywgJ29ial9pc2EnLCAnb2JqX25ldycsICdvYmpfdmFsaWQnLAogICAgJ29iamFycicsICdvbl9lcnJvcicsICdvbl9pb2Vycm9yJywgJ29ubGluZV9oZWxwJywgJ29wZW5yJywKICAgICdvcGVudScsICdvcGVudycsICdvcGxvdCcsICdvcGxvdGVycicsICdvcmRlcmVkaGFzaCcsCiAgICAncF9jb3JyZWxhdGUnLCAncGFyc2VfdXJsJywgJ3BhcnRpY2xlX3RyYWNlJywgJ3BhdGhfY2FjaGUnLCAncGF0aF9zZXAnLAogICAgJ3Bjb21wJywgJ3Bsb3QnLCAncGxvdDNkJywgJ3Bsb3QnLCAncGxvdF8zZGJveCcsCiAgICAncGxvdF9maWVsZCcsICdwbG90ZXJyJywgJ3Bsb3RzJywgJ3BvbGFyX2NvbnRvdXInLCAncG9sYXJfc3VyZmFjZScsCiAgICAncG9seWZpbGwnLCAncG9seXNoYWRlJywgJ3BudF9saW5lJywgJ3BvaW50X2x1bicsICdwb2xhcnBsb3QnLAogICAgJ3BvbHknLCAncG9seV8yZCcsICdwb2x5X2FyZWEnLCAncG9seV9maXQnLCAncG9seWZpbGx2JywKICAgICdwb2x5Z29uJywgJ3BvbHlsaW5lJywgJ3BvbHl3YXJwJywgJ3BvcGQnLCAncG93ZWxsJywKICAgICdwcmVmX2NvbW1pdCcsICdwcmVmX2dldCcsICdwcmVmX3NldCcsICdwcmV3aXR0JywgJ3ByaW1lcycsCiAgICAncHJpbnQnLCAncHJpbnRmJywgJ3ByaW50ZCcsICdwcm8nLCAncHJvZHVjdCcsCiAgICAncHJvZmlsZScsICdwcm9maWxlcicsICdwcm9maWxlcycsICdwcm9qZWN0X3ZvbCcsICdwc19zaG93X2ZvbnRzJywKICAgICdwc2FmbScsICdwc2V1ZG8nLCAncHRyX2ZyZWUnLCAncHRyX25ldycsICdwdHJfdmFsaWQnLAogICAgJ3B0cmFycicsICdwdXNoZCcsICdxZ3JpZDMnLCAncWh1bGwnLCAncXJvbWInLAogICAgJ3Fyb21vJywgJ3FzaW1wJywgJ3F1ZXJ5XyonLCAncXVlcnlfYXNjaWknLCAncXVlcnlfYm1wJywKICAgICdxdWVyeV9jc3YnLCAncXVlcnlfZGljb20nLCAncXVlcnlfZ2lmJywgJ3F1ZXJ5X2ltYWdlJywgJ3F1ZXJ5X2pwZWcnLAogICAgJ3F1ZXJ5X2pwZWcyMDAwJywgJ3F1ZXJ5X21yc2lkJywgJ3F1ZXJ5X3BpY3QnLCAncXVlcnlfcG5nJywgJ3F1ZXJ5X3BwbScsCiAgICAncXVlcnlfc3JmJywgJ3F1ZXJ5X3RpZmYnLCAncXVlcnlfdmlkZW8nLCAncXVlcnlfd2F2JywgJ3JfY29ycmVsYXRlJywKICAgICdyX3Rlc3QnLCAncmFkb24nLCAncmFuZG9tbicsICdyYW5kb211JywgJ3JhbmtzJywKICAgICdyZHBpeCcsICdyZWFkJywgJ3JlYWRmJywgJ3JlYWRfYXNjaWknLCAncmVhZF9iaW5hcnknLAogICAgJ3JlYWRfYm1wJywgJ3JlYWRfY3N2JywgJ3JlYWRfZGljb20nLCAncmVhZF9naWYnLCAncmVhZF9pbWFnZScsCiAgICAncmVhZF9pbnRlcmZpbGUnLCAncmVhZF9qcGVnJywgJ3JlYWRfanBlZzIwMDAnLCAncmVhZF9tcnNpZCcsICdyZWFkX3BpY3QnLAogICAgJ3JlYWRfcG5nJywgJ3JlYWRfcHBtJywgJ3JlYWRfc3ByJywgJ3JlYWRfc3JmJywgJ3JlYWRfc3lsaycsCiAgICAncmVhZF90aWZmJywgJ3JlYWRfdmlkZW8nLCAncmVhZF93YXYnLCAncmVhZF93YXZlJywgJ3JlYWRfeDExX2JpdG1hcCcsCiAgICAncmVhZF94d2QnLCAncmVhZHMnLCAncmVhZHUnLCAncmVhbF9wYXJ0JywgJ3JlYmluJywKICAgICdyZWNhbGxfY29tbWFuZHMnLCAncmVjb24zJywgJ3JlZHVjZV9jb2xvcnMnLCAncmVmb3JtJywgJ3JlZ2lvbl9ncm93JywKICAgICdyZWdpc3Rlcl9jdXJzb3InLCAncmVncmVzcycsICdyZXBsaWNhdGUnLAogICAgJ3JlcGxpY2F0ZV9pbnBsYWNlJywgJ3Jlc29sdmVfYWxsJywKICAgICdyZXNvbHZlX3JvdXRpbmUnLCAncmVzdG9yZScsICdyZXRhbGwnLCAncmV0dXJuJywgJ3JldmVyc2UnLAogICAgJ3JrNCcsICdyb2JlcnRzJywgJ3JvdCcsICdyb3RhdGUnLCAncm91bmQnLAogICAgJ3JvdXRpbmVfZmlsZXBhdGgnLCAncm91dGluZV9pbmZvJywgJ3JzX3Rlc3QnLCAnc190ZXN0JywgJ3NhdmUnLAogICAgJ3NhdmdvbCcsICdzY2FsZTMnLCAnc2NhbGUzZCcsICdzY2F0dGVycGxvdCcsICdzY2F0dGVycGxvdDNkJywKICAgICdzY29wZV9sZXZlbCcsICdzY29wZV90cmFjZWJhY2snLCAnc2NvcGVfdmFyZmV0Y2gnLAogICAgJ3Njb3BlX3Zhcm5hbWUnLCAnc2VhcmNoMmQnLAogICAgJ3NlYXJjaDNkJywgJ3NlbV9jcmVhdGUnLCAnc2VtX2RlbGV0ZScsICdzZW1fbG9jaycsICdzZW1fcmVsZWFzZScsCiAgICAnc2V0X3Bsb3QnLCAnc2V0X3NoYWRpbmcnLCAnc2V0ZW52JywgJ3NmaXQnLCAnc2hhZGVfc3VyZicsCiAgICAnc2hhZGVfc3VyZl9pcnInLCAnc2hhZGVfdm9sdW1lJywgJ3NoaWZ0JywgJ3NoaWZ0X2RpZmYnLCAnc2htZGVidWcnLAogICAgJ3NobW1hcCcsICdzaG11bm1hcCcsICdzaG12YXInLCAnc2hvdzMnLCAnc2hvd2ZvbnQnLAogICAgJ3NpZ251bScsICdzaW1wbGV4JywgJ3NpbicsICdzaW5kZ2VuJywgJ3NpbmgnLAogICAgJ3NpemUnLCAnc2tld25lc3MnLCAnc2tpcF9sdW4nLCAnc2xpY2VyMycsICdzbGlkZV9pbWFnZScsCiAgICAnc21vb3RoJywgJ3NvYmVsJywgJ3NvY2tldCcsICdzb3J0JywgJ3NwYXduJywKICAgICdzcGhfNHBudCcsICdzcGhfc2NhdCcsICdzcGhlcl9oYXJtJywgJ3NwbF9pbml0JywgJ3NwbF9pbnRlcnAnLAogICAgJ3NwbGluZScsICdzcGxpbmVfcCcsICdzcHJzYWInLCAnc3Byc2F4JywgJ3NwcnNpbicsCiAgICAnc3Byc3RwJywgJ3NxcnQnLCAnc3RhbmRhcmRpemUnLCAnc3RkZGV2JywgJ3N0b3AnLAogICAgJ3N0cmFycicsICdzdHJjbXAnLCAnc3RyY29tcHJlc3MnLCAnc3RyZWFtbGluZScsICdzdHJlYW1saW5lJywKICAgICdzdHJlZ2V4JywgJ3N0cmV0Y2gnLCAnc3RyaW5nJywgJ3N0cmpvaW4nLCAnc3RybGVuJywKICAgICdzdHJsb3djYXNlJywgJ3N0cm1hdGNoJywgJ3N0cm1lc3NhZ2UnLCAnc3RybWlkJywgJ3N0cnBvcycsCiAgICAnc3RycHV0JywgJ3N0cnNwbGl0JywgJ3N0cnRyaW0nLCAnc3RydWN0X2Fzc2lnbicsICdzdHJ1Y3RfaGlkZScsCiAgICAnc3RydXBjYXNlJywgJ3N1cmZhY2UnLCAnc3VyZmFjZScsICdzdXJmcicsICdzdmRjJywKICAgICdzdmRmaXQnLCAnc3Zzb2wnLCAnc3dhcF9lbmRpYW4nLCAnc3dhcF9lbmRpYW5faW5wbGFjZScsICdzeW1ib2wnLAogICAgJ3N5c3RpbWUnLCAndF9jdmYnLCAndF9wZGYnLCAndDNkJywgJ3RhZ19uYW1lcycsCiAgICAndGFuJywgJ3RhbmgnLCAndGVrX2NvbG9yJywgJ3RlbXBvcmFyeScsICd0ZXJtaW5hbF9zaXplJywKICAgICd0ZXRyYV9jbGlwJywgJ3RldHJhX3N1cmZhY2UnLCAndGV0cmFfdm9sdW1lJywgJ3RleHQnLCAndGhpbicsCiAgICAndGhyZWFkJywgJ3RocmVlZCcsICd0aWMnLCAndGltZV90ZXN0MicsICd0aW1lZ2VuJywKICAgICd0aW1lcicsICd0aW1lc3RhbXAnLCAndGltZXN0YW1wdG92YWx1ZXMnLCAndG1fdGVzdCcsICd0b2MnLAogICAgJ3RvdGFsJywgJ3RyYWNlJywgJ3RyYW5zcG9zZScsICd0cmlfc3VyZicsICd0cmlhbmd1bGF0ZScsCiAgICAndHJpZ3JpZCcsICd0cmlxbCcsICd0cmlyZWQnLCAndHJpc29sJywgJ3RydW5jYXRlX2x1bicsCiAgICAndHNfY29lZicsICd0c19kaWZmJywgJ3RzX2ZjYXN0JywgJ3RzX3Ntb290aCcsICd0dicsCiAgICAndHZjcnMnLCAndHZsY3QnLCAndHZyZCcsICd0dnNjbCcsICd0eXBlbmFtZScsCiAgICAndWluZGdlbicsICd1aW50JywgJ3VpbnRhcnInLCAndWw2NGluZGdlbicsICd1bGluZGdlbicsCiAgICAndWxvbjY0YXJyJywgJ3Vsb25hcnInLCAndWxvbmcnLCAndWxvbmc2NCcsICd1bmlxJywKICAgICd1bnNoYXJwX21hc2snLCAndXNlcnN5bScsICd2YWx1ZV9sb2NhdGUnLCAndmFyaWFuY2UnLCAndmVjdG9yJywKICAgICd2ZWN0b3JfZmllbGQnLCAndmVsJywgJ3ZlbG92ZWN0JywgJ3ZlcnRfdDNkJywgJ3ZvaWd0JywKICAgICd2b2x1bWUnLCAndm9yb25vaScsICd2b3hlbF9wcm9qJywgJ3dhaXQnLCAnd2FycF90cmknLAogICAgJ3dhdGVyc2hlZCcsICd3ZGVsZXRlJywgJ3dmX2RyYXcnLCAnd2hlcmUnLCAnd2lkZ2V0X2Jhc2UnLAogICAgJ3dpZGdldF9idXR0b24nLCAnd2lkZ2V0X2NvbWJvYm94JywgJ3dpZGdldF9jb250cm9sJywKICAgICd3aWRnZXRfZGlzcGxheWNvbnRleHRtZW51JywgJ3dpZGdldF9kcmF3JywKICAgICd3aWRnZXRfZHJvcGxpc3QnLCAnd2lkZ2V0X2V2ZW50JywgJ3dpZGdldF9pbmZvJywKICAgICd3aWRnZXRfbGFiZWwnLCAnd2lkZ2V0X2xpc3QnLAogICAgJ3dpZGdldF9wcm9wZXJ0eXNoZWV0JywgJ3dpZGdldF9zbGlkZXInLCAnd2lkZ2V0X3RhYicsCiAgICAnd2lkZ2V0X3RhYmxlJywgJ3dpZGdldF90ZXh0JywKICAgICd3aWRnZXRfdHJlZScsICd3aWRnZXRfdHJlZV9tb3ZlJywgJ3dpZGdldF93aW5kb3cnLAogICAgJ3dpZW5lcl9maWx0ZXInLCAnd2luZG93JywKICAgICd3aW5kb3cnLCAnd3JpdGVfYm1wJywgJ3dyaXRlX2NzdicsICd3cml0ZV9naWYnLCAnd3JpdGVfaW1hZ2UnLAogICAgJ3dyaXRlX2pwZWcnLCAnd3JpdGVfanBlZzIwMDAnLCAnd3JpdGVfbnJpZicsICd3cml0ZV9waWN0JywgJ3dyaXRlX3BuZycsCiAgICAnd3JpdGVfcHBtJywgJ3dyaXRlX3NwcicsICd3cml0ZV9zcmYnLCAnd3JpdGVfc3lsaycsICd3cml0ZV90aWZmJywKICAgICd3cml0ZV92aWRlbycsICd3cml0ZV93YXYnLCAnd3JpdGVfd2F2ZScsICd3cml0ZXUnLCAnd3NldCcsCiAgICAnd3Nob3cnLCAnd3RuJywgJ3d2X2FwcGxldCcsICd3dl9jd3QnLCAnd3ZfY3dfd2F2ZWxldCcsCiAgICAnd3ZfZGVub2lzZScsICd3dl9kd3QnLCAnd3ZfZm5fY29pZmxldCcsCiAgICAnd3ZfZm5fZGF1YmVjaGllcycsICd3dl9mbl9nYXVzc2lhbicsCiAgICAnd3ZfZm5faGFhcicsICd3dl9mbl9tb3JsZXQnLCAnd3ZfZm5fcGF1bCcsCiAgICAnd3ZfZm5fc3ltbGV0JywgJ3d2X2ltcG9ydF9kYXRhJywKICAgICd3dl9pbXBvcnRfd2F2ZWxldCcsICd3dl9wbG90M2Rfd3BzJywgJ3d2X3Bsb3RfbXVsdGlyZXMnLAogICAgJ3d2X3B3dCcsICd3dl90b29sX2Rlbm9pc2UnLAogICAgJ3hibV9lZGl0JywgJ3hkaXNwbGF5ZmlsZScsICd4ZHhmJywgJ3hmb250JywgJ3hpbnRlcmFuaW1hdGUnLAogICAgJ3hsb2FkY3QnLCAneG1hbmFnZXInLCAneG1uZ190bXBsJywgJ3htdG9vbCcsICd4b2JqdmlldycsCiAgICAneG9ianZpZXdfcm90YXRlJywgJ3hvYmp2aWV3X3dyaXRlX2ltYWdlJywKICAgICd4cGFsZXR0ZScsICd4cGNvbG9yJywgJ3hwbG90M2QnLAogICAgJ3hyZWdpc3RlcmVkJywgJ3hyb2knLCAneHNxX3Rlc3QnLCAneHN1cmZhY2UnLCAneHZhcmVkaXQnLAogICAgJ3h2b2x1bWUnLCAneHZvbHVtZV9yb3RhdGUnLCAneHZvbHVtZV93cml0ZV9pbWFnZScsCiAgICAneHlvdXRzJywgJ3psaWJfY29tcHJlc3MnLCAnemxpYl91bmNvbXByZXNzJywgJ3pvb20nLCAnem9vbV8yNCcKICBdOwogIHZhciBidWlsdGlucyA9IHdvcmRSZWdleHAoYnVpbHRpbkFycmF5KTsKCiAgdmFyIGtleXdvcmRBcnJheSA9IFsKICAgICdiZWdpbicsICdlbmQnLCAnZW5kY2FzZScsICdlbmRmb3InLAogICAgJ2VuZHdoaWxlJywgJ2VuZGlmJywgJ2VuZHJlcCcsICdlbmRmb3JlYWNoJywKICAgICdicmVhaycsICdjYXNlJywgJ2NvbnRpbnVlJywgJ2ZvcicsCiAgICAnZm9yZWFjaCcsICdnb3RvJywgJ2lmJywgJ3RoZW4nLCAnZWxzZScsCiAgICAncmVwZWF0JywgJ3VudGlsJywgJ3N3aXRjaCcsICd3aGlsZScsCiAgICAnZG8nLCAncHJvJywgJ2Z1bmN0aW9uJwogIF07CiAgdmFyIGtleXdvcmRzID0gd29yZFJlZ2V4cChrZXl3b3JkQXJyYXkpOwoKICBDb2RlTWlycm9yLnJlZ2lzdGVySGVscGVyKCJoaW50V29yZHMiLCAiaWRsIiwgYnVpbHRpbkFycmF5LmNvbmNhdChrZXl3b3JkQXJyYXkpKTsKCiAgdmFyIGlkZW50aWZpZXJzID0gbmV3IFJlZ0V4cCgnXltfYS16XHhhMS1cdWZmZmZdW19hLXowLTlceGExLVx1ZmZmZl0qJywgJ2knKTsKCiAgdmFyIHNpbmdsZU9wZXJhdG9ycyA9IC9bK1wtKiY9PD5cL0AjfiRdLzsKICB2YXIgYm9vbE9wZXJhdG9ycyA9IG5ldyBSZWdFeHAoJyhhbmR8b3J8ZXF8bHR8bGV8Z3R8Z2V8bmV8bm90KScsICdpJyk7CgogIGZ1bmN0aW9uIHRva2VuQmFzZShzdHJlYW0pIHsKICAgIC8vIHdoaXRlc3BhY2VzCiAgICBpZiAoc3RyZWFtLmVhdFNwYWNlKCkpIHJldHVybiBudWxsOwoKICAgIC8vIEhhbmRsZSBvbmUgbGluZSBDb21tZW50cwogICAgaWYgKHN0cmVhbS5tYXRjaCgnOycpKSB7CiAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgcmV0dXJuICdjb21tZW50JzsKICAgIH0KCiAgICAvLyBIYW5kbGUgTnVtYmVyIExpdGVyYWxzCiAgICBpZiAoc3RyZWFtLm1hdGNoKC9eWzAtOVwuKy1dLywgZmFsc2UpKSB7CiAgICAgIGlmIChzdHJlYW0ubWF0Y2goL15bKy1dPzB4WzAtOWEtZkEtRl0rLykpCiAgICAgICAgcmV0dXJuICdudW1iZXInOwogICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eWystXT9cZCpcLlxkKyhbRWVEZF1bKy1dP1xkKyk/LykpCiAgICAgICAgcmV0dXJuICdudW1iZXInOwogICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eWystXT9cZCsoW0VlRGRdWystXT9cZCspPy8pKQogICAgICAgIHJldHVybiAnbnVtYmVyJzsKICAgIH0KCiAgICAvLyBIYW5kbGUgU3RyaW5ncwogICAgaWYgKHN0cmVhbS5tYXRjaCgvXiIoW14iXXwoIiIpKSoiLykpIHsgcmV0dXJuICdzdHJpbmcnOyB9CiAgICBpZiAoc3RyZWFtLm1hdGNoKC9eJyhbXiddfCgnJykpKicvKSkgeyByZXR1cm4gJ3N0cmluZyc7IH0KCiAgICAvLyBIYW5kbGUgd29yZHMKICAgIGlmIChzdHJlYW0ubWF0Y2goa2V5d29yZHMpKSB7IHJldHVybiAna2V5d29yZCc7IH0KICAgIGlmIChzdHJlYW0ubWF0Y2goYnVpbHRpbnMpKSB7IHJldHVybiAnYnVpbHRpbic7IH0KICAgIGlmIChzdHJlYW0ubWF0Y2goaWRlbnRpZmllcnMpKSB7IHJldHVybiAndmFyaWFibGUnOyB9CgogICAgaWYgKHN0cmVhbS5tYXRjaChzaW5nbGVPcGVyYXRvcnMpIHx8IHN0cmVhbS5tYXRjaChib29sT3BlcmF0b3JzKSkgewogICAgICByZXR1cm4gJ29wZXJhdG9yJzsgfQoKICAgIC8vIEhhbmRsZSBub24tZGV0ZWN0ZWQgaXRlbXMKICAgIHN0cmVhbS5uZXh0KCk7CiAgICByZXR1cm4gbnVsbDsKICB9OwoKICBDb2RlTWlycm9yLmRlZmluZU1vZGUoJ2lkbCcsIGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHsKICAgICAgdG9rZW46IGZ1bmN0aW9uKHN0cmVhbSkgewogICAgICAgIHJldHVybiB0b2tlbkJhc2Uoc3RyZWFtKTsKICAgICAgfQogICAgfTsKICB9KTsKCiAgQ29kZU1pcnJvci5kZWZpbmVNSU1FKCd0ZXh0L3gtaWRsJywgJ2lkbCcpOwp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/idl/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogSURMIG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iaWRsLmpzIj48L3NjcmlwdD4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4uQ29kZU1pcnJvciB7Ym9yZGVyLXRvcDogMXB4IHNvbGlkIGJsYWNrOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGgxPkNvZGVNaXJyb3I8L2gxPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5JREw8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPklETCBtb2RlPC9oMj4KCiAgICA8ZGl2Pjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+Cjs7IEV4YW1wbGUgSURMIGNvZGUKRlVOQ1RJT04gbWVhbl9hbmRfc3RkZGV2LGFycmF5CiAgOzsgVGhpcyBwcm9ncmFtIHJlYWRzIGluIGFuIGFycmF5IG9mIG51bWJlcnMKICA7OyBhbmQgcmV0dXJucyBhIHN0cnVjdHVyZSBjb250YWluaW5nIHRoZQogIDs7IGF2ZXJhZ2UgYW5kIHN0YW5kYXJkIGRldmlhdGlvbgoKICBhdmUgPSAwLjAKICBjb3VudCA9IDAuMAoKICBmb3IgaT0wLE5fRUxFTUVOVFMoYXJyYXkpLTEgZG8gYmVnaW4KICAgICAgYXZlID0gYXZlICsgYXJyYXlbaV0KICAgICAgY291bnQgPSBjb3VudCArIDEKICBlbmRmb3IKICAKICBhdmUgPSBhdmUvY291bnQKCiAgc3RkID0gc3RkZGV2KGFycmF5KSAgCgogIHJldHVybiwge2F2ZXJhZ2U6YXZlLHN0ZDpzdGR9CgpFTkQKCiAgICA8L3RleHRhcmVhPjwvZGl2PgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICBtb2RlOiB7bmFtZTogImlkbCIsCiAgICAgICAgICAgICAgIHZlcnNpb246IDEsCiAgICAgICAgICAgICAgIHNpbmdsZUxpbmVTdHJpbmdFcnJvcnM6IGZhbHNlfSwKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgICAgICBpbmRlbnRVbml0OiA0LAogICAgICAgIG1hdGNoQnJhY2tldHM6IHRydWUKICAgICAgfSk7CiAgICA8L3NjcmlwdD4KCiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC94LWlkbDwvY29kZT4uPC9wPgo8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogTGFuZ3VhZ2UgTW9kZXM8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi9kb2MvZG9jcy5jc3MiPgoKPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aDE+Q29kZU1pcnJvcjwvaDE+PGltZyBpZD1sb2dvIHNyYz0iLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPkxhbmd1YWdlIG1vZGVzPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CgogIDxoMj5MYW5ndWFnZSBtb2RlczwvaDI+CgogIDxwPlRoaXMgaXMgYSBsaXN0IG9mIGV2ZXJ5IG1vZGUgaW4gdGhlIGRpc3RyaWJ1dGlvbi4gRWFjaCBtb2RlIGxpdmVzCmluIGEgc3ViZGlyZWN0b3J5IG9mIHRoZSA8Y29kZT5tb2RlLzwvY29kZT4gZGlyZWN0b3J5LCBhbmQgdHlwaWNhbGx5CmRlZmluZXMgYSBzaW5nbGUgSmF2YVNjcmlwdCBmaWxlIHRoYXQgaW1wbGVtZW50cyB0aGUgbW9kZS4gTG9hZGluZwpzdWNoIGZpbGUgd2lsbCBtYWtlIHRoZSBsYW5ndWFnZSBhdmFpbGFibGUgdG8gQ29kZU1pcnJvciwgdGhyb3VnaAp0aGUgPGEgaHJlZj0iLi4vZG9jL21hbnVhbC5odG1sI29wdGlvbl9tb2RlIj48Y29kZT5tb2RlPC9jb2RlPjwvYT4Kb3B0aW9uLjwvcD4KCiAgPGRpdiBzdHlsZT0iLXdlYmtpdC1jb2x1bW5zOiAxMDBweCAyOyAtbW96LWNvbHVtbnM6IDEwMHB4IDI7IGNvbHVtbnM6IDEwMHB4IDI7Ij4KICAgIDx1bCBzdHlsZT0ibWFyZ2luLXRvcDogMCI+CiAgICAgIDxsaT48YSBocmVmPSJhcGwvaW5kZXguaHRtbCI+QVBMPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJhc24uMS9pbmRleC5odG1sIj5BU04uMTwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0iYXN0ZXJpc2svaW5kZXguaHRtbCI+QXN0ZXJpc2sgZGlhbHBsYW48L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9ImJyYWluZnVjay9pbmRleC5odG1sIj5CcmFpbmZ1Y2s8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9ImNsaWtlL2luZGV4Lmh0bWwiPkMsIEMrKywgQyM8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9ImNsaWtlL2luZGV4Lmh0bWwiPkNleWxvbjwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0iY2xvanVyZS9pbmRleC5odG1sIj5DbG9qdXJlPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJjc3MvZ3NzLmh0bWwiPkNsb3N1cmUgU3R5bGVzaGVldHMgKEdTUyk8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9ImNtYWtlL2luZGV4Lmh0bWwiPkNNYWtlPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJjb2JvbC9pbmRleC5odG1sIj5DT0JPTDwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0iY29mZmVlc2NyaXB0L2luZGV4Lmh0bWwiPkNvZmZlZVNjcmlwdDwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0iY29tbW9ubGlzcC9pbmRleC5odG1sIj5Db21tb24gTGlzcDwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0iY3J5c3RhbC9pbmRleC5odG1sIj5DcnlzdGFsPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJjc3MvaW5kZXguaHRtbCI+Q1NTPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJjeXBoZXIvaW5kZXguaHRtbCI+Q3lwaGVyPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJweXRob24vaW5kZXguaHRtbCI+Q3l0aG9uPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJkL2luZGV4Lmh0bWwiPkQ8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9ImRhcnQvaW5kZXguaHRtbCI+RGFydDwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0iZGphbmdvL2luZGV4Lmh0bWwiPkRqYW5nbzwvYT4gKHRlbXBsYXRpbmcgbGFuZ3VhZ2UpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9ImRvY2tlcmZpbGUvaW5kZXguaHRtbCI+RG9ja2VyZmlsZTwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0iZGlmZi9pbmRleC5odG1sIj5kaWZmPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJkdGQvaW5kZXguaHRtbCI+RFREPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJkeWxhbi9pbmRleC5odG1sIj5EeWxhbjwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0iZWJuZi9pbmRleC5odG1sIj5FQk5GPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJlY2wvaW5kZXguaHRtbCI+RUNMPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJlaWZmZWwvaW5kZXguaHRtbCI+RWlmZmVsPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJlbG0vaW5kZXguaHRtbCI+RWxtPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJlcmxhbmcvaW5kZXguaHRtbCI+RXJsYW5nPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJmYWN0b3IvaW5kZXguaHRtbCI+RmFjdG9yPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJmY2wvaW5kZXguaHRtbCI+RkNMPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJmb3J0aC9pbmRleC5odG1sIj5Gb3J0aDwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0iZm9ydHJhbi9pbmRleC5odG1sIj5Gb3J0cmFuPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJtbGxpa2UvaW5kZXguaHRtbCI+RiM8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imdhcy9pbmRleC5odG1sIj5HYXM8L2E+IChBVCZhbXA7VC1zdHlsZSBhc3NlbWJseSk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0iZ2hlcmtpbi9pbmRleC5odG1sIj5HaGVya2luPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJnby9pbmRleC5odG1sIj5HbzwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0iZ3Jvb3Z5L2luZGV4Lmh0bWwiPkdyb292eTwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0iaGFtbC9pbmRleC5odG1sIj5IQU1MPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJoYW5kbGViYXJzL2luZGV4Lmh0bWwiPkhhbmRsZWJhcnM8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imhhc2tlbGwvaW5kZXguaHRtbCI+SGFza2VsbDwvYT4gKDxhIGhyZWY9Imhhc2tlbGwtbGl0ZXJhdGUvaW5kZXguaHRtbCI+TGl0ZXJhdGU8L2E+KTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJoYXhlL2luZGV4Lmh0bWwiPkhheGU8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9Imh0bWxlbWJlZGRlZC9pbmRleC5odG1sIj5IVE1MIGVtYmVkZGVkPC9hPiAoSlNQLCBBU1AuTkVUKTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodG1sbWl4ZWQvaW5kZXguaHRtbCI+SFRNTCBtaXhlZC1tb2RlPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJodHRwL2luZGV4Lmh0bWwiPkhUVFA8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9ImlkbC9pbmRleC5odG1sIj5JREw8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9ImNsaWtlL2luZGV4Lmh0bWwiPkphdmE8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9ImphdmFzY3JpcHQvaW5kZXguaHRtbCI+SmF2YVNjcmlwdDwvYT4gKDxhIGhyZWY9ImpzeC9pbmRleC5odG1sIj5KU1g8L2E+KTwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJqaW5qYTIvaW5kZXguaHRtbCI+SmluamEyPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJqdWxpYS9pbmRleC5odG1sIj5KdWxpYTwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0ia290bGluL2luZGV4Lmh0bWwiPktvdGxpbjwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0iY3NzL2xlc3MuaHRtbCI+TEVTUzwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0ibGl2ZXNjcmlwdC9pbmRleC5odG1sIj5MaXZlU2NyaXB0PC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJsdWEvaW5kZXguaHRtbCI+THVhPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJtYXJrZG93bi9pbmRleC5odG1sIj5NYXJrZG93bjwvYT4gKDxhIGhyZWY9ImdmbS9pbmRleC5odG1sIj5HaXRIdWItZmxhdm91cjwvYT4pPC9saT4KICAgICAgPGxpPjxhIGhyZWY9Im1hdGhlbWF0aWNhL2luZGV4Lmh0bWwiPk1hdGhlbWF0aWNhPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJtYm94L2luZGV4Lmh0bWwiPm1ib3g8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9Im1pcmMvaW5kZXguaHRtbCI+bUlSQzwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0ibW9kZWxpY2EvaW5kZXguaHRtbCI+TW9kZWxpY2E8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9Im1zY2dlbi9pbmRleC5odG1sIj5Nc2NHZW48L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9Im11bXBzL2luZGV4Lmh0bWwiPk1VTVBTPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJuZ2lueC9pbmRleC5odG1sIj5OZ2lueDwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0ibnNpcy9pbmRleC5odG1sIj5OU0lTPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJudHJpcGxlcy9pbmRleC5odG1sIj5OVHJpcGxlczwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0iY2xpa2UvaW5kZXguaHRtbCI+T2JqZWN0aXZlIEM8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9Im1sbGlrZS9pbmRleC5odG1sIj5PQ2FtbDwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0ib2N0YXZlL2luZGV4Lmh0bWwiPk9jdGF2ZTwvYT4gKE1BVExBQik8L2xpPgogICAgICA8bGk+PGEgaHJlZj0ib3ovaW5kZXguaHRtbCI+T3o8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9InBhc2NhbC9pbmRleC5odG1sIj5QYXNjYWw8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9InBlZ2pzL2luZGV4Lmh0bWwiPlBFRy5qczwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0icGVybC9pbmRleC5odG1sIj5QZXJsPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJhc2NpaWFybW9yL2luZGV4Lmh0bWwiPlBHUCAoQVNDSUkgYXJtb3IpPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJwaHAvaW5kZXguaHRtbCI+UEhQPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJwaWcvaW5kZXguaHRtbCI+UGlnIExhdGluPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJwb3dlcnNoZWxsL2luZGV4Lmh0bWwiPlBvd2VyU2hlbGw8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9InByb3BlcnRpZXMvaW5kZXguaHRtbCI+UHJvcGVydGllcyBmaWxlczwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0icHJvdG9idWYvaW5kZXguaHRtbCI+UHJvdG9CdWY8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9InB1Zy9pbmRleC5odG1sIj5QdWc8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9InB1cHBldC9pbmRleC5odG1sIj5QdXBwZXQ8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9InB5dGhvbi9pbmRleC5odG1sIj5QeXRob248L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9InEvaW5kZXguaHRtbCI+UTwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0ici9pbmRleC5odG1sIj5SPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJycG0vaW5kZXguaHRtbCI+UlBNPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJyc3QvaW5kZXguaHRtbCI+cmVTdHJ1Y3R1cmVkVGV4dDwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0icnVieS9pbmRleC5odG1sIj5SdWJ5PC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJydXN0L2luZGV4Lmh0bWwiPlJ1c3Q8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9InNhcy9pbmRleC5odG1sIj5TQVM8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9InNhc3MvaW5kZXguaHRtbCI+U2FzczwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0ic3ByZWFkc2hlZXQvaW5kZXguaHRtbCI+U3ByZWFkc2hlZXQ8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9ImNsaWtlL3NjYWxhLmh0bWwiPlNjYWxhPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJzY2hlbWUvaW5kZXguaHRtbCI+U2NoZW1lPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJjc3Mvc2Nzcy5odG1sIj5TQ1NTPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJzaGVsbC9pbmRleC5odG1sIj5TaGVsbDwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0ic2lldmUvaW5kZXguaHRtbCI+U2lldmU8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9InNsaW0vaW5kZXguaHRtbCI+U2xpbTwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0ic21hbGx0YWxrL2luZGV4Lmh0bWwiPlNtYWxsdGFsazwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0ic21hcnR5L2luZGV4Lmh0bWwiPlNtYXJ0eTwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0ic29sci9pbmRleC5odG1sIj5Tb2xyPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJzb3kvaW5kZXguaHRtbCI+U295PC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJzdHlsdXMvaW5kZXguaHRtbCI+U3R5bHVzPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJzcWwvaW5kZXguaHRtbCI+U1FMPC9hPiAoc2V2ZXJhbCBkaWFsZWN0cyk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0ic3BhcnFsL2luZGV4Lmh0bWwiPlNQQVJRTDwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0iY2xpa2UvaW5kZXguaHRtbCI+U3F1aXJyZWw8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9InN3aWZ0L2luZGV4Lmh0bWwiPlN3aWZ0PC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJzdGV4L2luZGV4Lmh0bWwiPnNUZVgsIExhVGVYPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJ0Y2wvaW5kZXguaHRtbCI+VGNsPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJ0ZXh0aWxlL2luZGV4Lmh0bWwiPlRleHRpbGU8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9InRpZGRseXdpa2kvaW5kZXguaHRtbCI+VGlkZGx5d2lraTwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0idGlraS9pbmRleC5odG1sIj5UaWtpIHdpa2k8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9InRvbWwvaW5kZXguaHRtbCI+VE9NTDwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0idG9ybmFkby9pbmRleC5odG1sIj5Ub3JuYWRvPC9hPiAodGVtcGxhdGluZyBsYW5ndWFnZSk8L2xpPgogICAgICA8bGk+PGEgaHJlZj0idHJvZmYvaW5kZXguaHRtbCI+dHJvZmY8L2E+IChmb3IgbWFucGFnZXMpPC9saT4KICAgICAgPGxpPjxhIGhyZWY9InR0Y24vaW5kZXguaHRtbCI+VFRDTjwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0idHRjbi1jZmcvaW5kZXguaHRtbCI+VFRDTiBDb25maWd1cmF0aW9uPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJ0dXJ0bGUvaW5kZXguaHRtbCI+VHVydGxlPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJ0d2lnL2luZGV4Lmh0bWwiPlR3aWc8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9InZiL2luZGV4Lmh0bWwiPlZCLk5FVDwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0idmJzY3JpcHQvaW5kZXguaHRtbCI+VkJTY3JpcHQ8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9InZlbG9jaXR5L2luZGV4Lmh0bWwiPlZlbG9jaXR5PC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJ2ZXJpbG9nL2luZGV4Lmh0bWwiPlZlcmlsb2cvU3lzdGVtVmVyaWxvZzwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0idmhkbC9pbmRleC5odG1sIj5WSERMPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJ2dWUvaW5kZXguaHRtbCI+VnVlLmpzIGFwcDwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0id2ViaWRsL2luZGV4Lmh0bWwiPldlYiBJREw8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9InhtbC9pbmRleC5odG1sIj5YTUwvSFRNTDwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0ieHF1ZXJ5L2luZGV4Lmh0bWwiPlhRdWVyeTwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0ieWFjYXMvaW5kZXguaHRtbCI+WWFjYXM8L2E+PC9saT4KICAgICAgPGxpPjxhIGhyZWY9InlhbWwvaW5kZXguaHRtbCI+WUFNTDwvYT48L2xpPgogICAgICA8bGk+PGEgaHJlZj0ieWFtbC1mcm9udG1hdHRlci9pbmRleC5odG1sIj5ZQU1MIGZyb250bWF0dGVyPC9hPjwvbGk+CiAgICAgIDxsaT48YSBocmVmPSJ6ODAvaW5kZXguaHRtbCI+WjgwPC9hPjwvbGk+CiAgICA8L3VsPgogIDwvZGl2PgoKPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/javascript/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/javascript/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogSmF2YVNjcmlwdCBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uLy4uL2FkZG9uL2VkaXQvbWF0Y2hicmFja2V0cy5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi8uLi9hZGRvbi9jb21tZW50L2NvbnRpbnVlY29tbWVudC5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi8uLi9hZGRvbi9jb21tZW50L2NvbW1lbnQuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iamF2YXNjcmlwdC5qcyI+PC9zY3JpcHQ+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+LkNvZGVNaXJyb3Ige2JvcmRlci10b3A6IDFweCBzb2xpZCBibGFjazsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO308L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxoMT5Db2RlTWlycm9yPC9oMT48aW1nIGlkPWxvZ28gc3JjPSIuLi8uLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5MYW5ndWFnZSBtb2RlczwvYT4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+SmF2YVNjcmlwdDwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+SmF2YVNjcmlwdCBtb2RlPC9oMj4KCgo8ZGl2Pjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+Ci8vIERlbW8gY29kZSAodGhlIGFjdHVhbCBuZXcgcGFyc2VyIGNoYXJhY3RlciBzdHJlYW0gaW1wbGVtZW50YXRpb24pCgpmdW5jdGlvbiBTdHJpbmdTdHJlYW0oc3RyaW5nKSB7CiAgdGhpcy5wb3MgPSAwOwogIHRoaXMuc3RyaW5nID0gc3RyaW5nOwp9CgpTdHJpbmdTdHJlYW0ucHJvdG90eXBlID0gewogIGRvbmU6IGZ1bmN0aW9uKCkge3JldHVybiB0aGlzLnBvcyA+PSB0aGlzLnN0cmluZy5sZW5ndGg7fSwKICBwZWVrOiBmdW5jdGlvbigpIHtyZXR1cm4gdGhpcy5zdHJpbmcuY2hhckF0KHRoaXMucG9zKTt9LAogIG5leHQ6IGZ1bmN0aW9uKCkgewogICAgaWYgKHRoaXMucG9zICZsdDsgdGhpcy5zdHJpbmcubGVuZ3RoKQogICAgICByZXR1cm4gdGhpcy5zdHJpbmcuY2hhckF0KHRoaXMucG9zKyspOwogIH0sCiAgZWF0OiBmdW5jdGlvbihtYXRjaCkgewogICAgdmFyIGNoID0gdGhpcy5zdHJpbmcuY2hhckF0KHRoaXMucG9zKTsKICAgIGlmICh0eXBlb2YgbWF0Y2ggPT0gInN0cmluZyIpIHZhciBvayA9IGNoID09IG1hdGNoOwogICAgZWxzZSB2YXIgb2sgPSBjaCAmYW1wOyZhbXA7IG1hdGNoLnRlc3QgPyBtYXRjaC50ZXN0KGNoKSA6IG1hdGNoKGNoKTsKICAgIGlmIChvaykge3RoaXMucG9zKys7IHJldHVybiBjaDt9CiAgfSwKICBlYXRXaGlsZTogZnVuY3Rpb24obWF0Y2gpIHsKICAgIHZhciBzdGFydCA9IHRoaXMucG9zOwogICAgd2hpbGUgKHRoaXMuZWF0KG1hdGNoKSk7CiAgICBpZiAodGhpcy5wb3MgPiBzdGFydCkgcmV0dXJuIHRoaXMuc3RyaW5nLnNsaWNlKHN0YXJ0LCB0aGlzLnBvcyk7CiAgfSwKICBiYWNrVXA6IGZ1bmN0aW9uKG4pIHt0aGlzLnBvcyAtPSBuO30sCiAgY29sdW1uOiBmdW5jdGlvbigpIHtyZXR1cm4gdGhpcy5wb3M7fSwKICBlYXRTcGFjZTogZnVuY3Rpb24oKSB7CiAgICB2YXIgc3RhcnQgPSB0aGlzLnBvczsKICAgIHdoaWxlICgvXHMvLnRlc3QodGhpcy5zdHJpbmcuY2hhckF0KHRoaXMucG9zKSkpIHRoaXMucG9zKys7CiAgICByZXR1cm4gdGhpcy5wb3MgLSBzdGFydDsKICB9LAogIG1hdGNoOiBmdW5jdGlvbihwYXR0ZXJuLCBjb25zdW1lLCBjYXNlSW5zZW5zaXRpdmUpIHsKICAgIGlmICh0eXBlb2YgcGF0dGVybiA9PSAic3RyaW5nIikgewogICAgICBmdW5jdGlvbiBjYXNlZChzdHIpIHtyZXR1cm4gY2FzZUluc2Vuc2l0aXZlID8gc3RyLnRvTG93ZXJDYXNlKCkgOiBzdHI7fQogICAgICBpZiAoY2FzZWQodGhpcy5zdHJpbmcpLmluZGV4T2YoY2FzZWQocGF0dGVybiksIHRoaXMucG9zKSA9PSB0aGlzLnBvcykgewogICAgICAgIGlmIChjb25zdW1lICE9PSBmYWxzZSkgdGhpcy5wb3MgKz0gc3RyLmxlbmd0aDsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgIHZhciBtYXRjaCA9IHRoaXMuc3RyaW5nLnNsaWNlKHRoaXMucG9zKS5tYXRjaChwYXR0ZXJuKTsKICAgICAgaWYgKG1hdGNoICZhbXA7JmFtcDsgY29uc3VtZSAhPT0gZmFsc2UpIHRoaXMucG9zICs9IG1hdGNoWzBdLmxlbmd0aDsKICAgICAgcmV0dXJuIG1hdGNoOwogICAgfQogIH0KfTsKPC90ZXh0YXJlYT48L2Rpdj4KCiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgICAgIG1hdGNoQnJhY2tldHM6IHRydWUsCiAgICAgICAgY29udGludWVDb21tZW50czogIkVudGVyIiwKICAgICAgICBleHRyYUtleXM6IHsiQ3RybC1RIjogInRvZ2dsZUNvbW1lbnQifQogICAgICB9KTsKICAgIDwvc2NyaXB0PgoKICAgIDxwPgogICAgICBKYXZhU2NyaXB0IG1vZGUgc3VwcG9ydHMgc2V2ZXJhbCBjb25maWd1cmF0aW9uIG9wdGlvbnM6CiAgICAgIDx1bD4KICAgICAgICA8bGk+PGNvZGU+anNvbjwvY29kZT4gd2hpY2ggd2lsbCBzZXQgdGhlIG1vZGUgdG8gZXhwZWN0IEpTT04KICAgICAgICBkYXRhIHJhdGhlciB0aGFuIGEgSmF2YVNjcmlwdCBwcm9ncmFtLjwvbGk+CiAgICAgICAgPGxpPjxjb2RlPmpzb25sZDwvY29kZT4gd2hpY2ggd2lsbCBzZXQgdGhlIG1vZGUgdG8gZXhwZWN0CiAgICAgICAgPGEgaHJlZj0iaHR0cDovL2pzb24tbGQub3JnIj5KU09OLUxEPC9hPiBsaW5rZWQgZGF0YSByYXRoZXIKICAgICAgICB0aGFuIGEgSmF2YVNjcmlwdCBwcm9ncmFtICg8YSBocmVmPSJqc29uLWxkLmh0bWwiPmRlbW88L2E+KS48L2xpPgogICAgICAgIDxsaT48Y29kZT50eXBlc2NyaXB0PC9jb2RlPiB3aGljaCB3aWxsIGFjdGl2YXRlIGFkZGl0aW9uYWwKICAgICAgICBzeW50YXggaGlnaGxpZ2h0aW5nIGFuZCBzb21lIG90aGVyIHRoaW5ncyBmb3IgVHlwZVNjcmlwdCBjb2RlCiAgICAgICAgKDxhIGhyZWY9InR5cGVzY3JpcHQuaHRtbCI+ZGVtbzwvYT4pLjwvbGk+CiAgICAgICAgPGxpPjxjb2RlPnN0YXRlbWVudEluZGVudDwvY29kZT4gd2hpY2ggKGdpdmVuIGEgbnVtYmVyKSB3aWxsCiAgICAgICAgZGV0ZXJtaW5lIHRoZSBhbW91bnQgb2YgaW5kZW50YXRpb24gdG8gdXNlIGZvciBzdGF0ZW1lbnRzCiAgICAgICAgY29udGludWVkIG9uIGEgbmV3IGxpbmUuPC9saT4KICAgICAgICA8bGk+PGNvZGU+d29yZENoYXJhY3RlcnM8L2NvZGU+LCBhIHJlZ2V4cCB0aGF0IGluZGljYXRlcyB3aGljaAogICAgICAgIGNoYXJhY3RlcnMgc2hvdWxkIGJlIGNvbnNpZGVyZWQgcGFydCBvZiBhbiBpZGVudGlmaWVyLgogICAgICAgIERlZmF1bHRzIHRvIDxjb2RlPi9bXHckXS88L2NvZGU+LCB3aGljaCBkb2VzIG5vdCBoYW5kbGUKICAgICAgICBub24tQVNDSUkgaWRlbnRpZmllcnMuIENhbiBiZSBzZXQgdG8gc29tZXRoaW5nIG1vcmUgZWxhYm9yYXRlCiAgICAgICAgdG8gaW1wcm92ZSBVbmljb2RlIHN1cHBvcnQuPC9saT4KICAgICAgPC91bD4KICAgIDwvcD4KCiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC9qYXZhc2NyaXB0PC9jb2RlPiwgPGNvZGU+YXBwbGljYXRpb24vanNvbjwvY29kZT4sIDxjb2RlPmFwcGxpY2F0aW9uL2xkK2pzb248L2NvZGU+LCA8Y29kZT50ZXh0L3R5cGVzY3JpcHQ8L2NvZGU+LCA8Y29kZT5hcHBsaWNhdGlvbi90eXBlc2NyaXB0PC9jb2RlPi48L3A+CiAgPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/javascript/javascript.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKZnVuY3Rpb24gZXhwcmVzc2lvbkFsbG93ZWQoc3RyZWFtLCBzdGF0ZSwgYmFja1VwKSB7CiAgcmV0dXJuIC9eKD86b3BlcmF0b3J8c29mfGtleXdvcmQgY3xjYXNlfG5ld3xbXFt7fVwoLDs6XXw9PikkLy50ZXN0KHN0YXRlLmxhc3RUeXBlKSB8fAogICAgKHN0YXRlLmxhc3RUeXBlID09ICJxdWFzaSIgJiYgL1x7XHMqJC8udGVzdChzdHJlYW0uc3RyaW5nLnNsaWNlKDAsIHN0cmVhbS5wb3MgLSAoYmFja1VwIHx8IDApKSkpCn0KCkNvZGVNaXJyb3IuZGVmaW5lTW9kZSgiamF2YXNjcmlwdCIsIGZ1bmN0aW9uKGNvbmZpZywgcGFyc2VyQ29uZmlnKSB7CiAgdmFyIGluZGVudFVuaXQgPSBjb25maWcuaW5kZW50VW5pdDsKICB2YXIgc3RhdGVtZW50SW5kZW50ID0gcGFyc2VyQ29uZmlnLnN0YXRlbWVudEluZGVudDsKICB2YXIganNvbmxkTW9kZSA9IHBhcnNlckNvbmZpZy5qc29ubGQ7CiAgdmFyIGpzb25Nb2RlID0gcGFyc2VyQ29uZmlnLmpzb24gfHwganNvbmxkTW9kZTsKICB2YXIgaXNUUyA9IHBhcnNlckNvbmZpZy50eXBlc2NyaXB0OwogIHZhciB3b3JkUkUgPSBwYXJzZXJDb25maWcud29yZENoYXJhY3RlcnMgfHwgL1tcdyRceGExLVx1ZmZmZl0vOwoKICAvLyBUb2tlbml6ZXIKCiAgdmFyIGtleXdvcmRzID0gZnVuY3Rpb24oKXsKICAgIGZ1bmN0aW9uIGt3KHR5cGUpIHtyZXR1cm4ge3R5cGU6IHR5cGUsIHN0eWxlOiAia2V5d29yZCJ9O30KICAgIHZhciBBID0ga3coImtleXdvcmQgYSIpLCBCID0ga3coImtleXdvcmQgYiIpLCBDID0ga3coImtleXdvcmQgYyIpOwogICAgdmFyIG9wZXJhdG9yID0ga3coIm9wZXJhdG9yIiksIGF0b20gPSB7dHlwZTogImF0b20iLCBzdHlsZTogImF0b20ifTsKCiAgICB2YXIganNLZXl3b3JkcyA9IHsKICAgICAgImlmIjoga3coImlmIiksICJ3aGlsZSI6IEEsICJ3aXRoIjogQSwgImVsc2UiOiBCLCAiZG8iOiBCLCAidHJ5IjogQiwgImZpbmFsbHkiOiBCLAogICAgICAicmV0dXJuIjogQywgImJyZWFrIjogQywgImNvbnRpbnVlIjogQywgIm5ldyI6IGt3KCJuZXciKSwgImRlbGV0ZSI6IEMsICJ0aHJvdyI6IEMsICJkZWJ1Z2dlciI6IEMsCiAgICAgICJ2YXIiOiBrdygidmFyIiksICJjb25zdCI6IGt3KCJ2YXIiKSwgImxldCI6IGt3KCJ2YXIiKSwKICAgICAgImZ1bmN0aW9uIjoga3coImZ1bmN0aW9uIiksICJjYXRjaCI6IGt3KCJjYXRjaCIpLAogICAgICAiZm9yIjoga3coImZvciIpLCAic3dpdGNoIjoga3coInN3aXRjaCIpLCAiY2FzZSI6IGt3KCJjYXNlIiksICJkZWZhdWx0Ijoga3coImRlZmF1bHQiKSwKICAgICAgImluIjogb3BlcmF0b3IsICJ0eXBlb2YiOiBvcGVyYXRvciwgImluc3RhbmNlb2YiOiBvcGVyYXRvciwKICAgICAgInRydWUiOiBhdG9tLCAiZmFsc2UiOiBhdG9tLCAibnVsbCI6IGF0b20sICJ1bmRlZmluZWQiOiBhdG9tLCAiTmFOIjogYXRvbSwgIkluZmluaXR5IjogYXRvbSwKICAgICAgInRoaXMiOiBrdygidGhpcyIpLCAiY2xhc3MiOiBrdygiY2xhc3MiKSwgInN1cGVyIjoga3coImF0b20iKSwKICAgICAgInlpZWxkIjogQywgImV4cG9ydCI6IGt3KCJleHBvcnQiKSwgImltcG9ydCI6IGt3KCJpbXBvcnQiKSwgImV4dGVuZHMiOiBDLAogICAgICAiYXdhaXQiOiBDLCAiYXN5bmMiOiBrdygiYXN5bmMiKQogICAgfTsKCiAgICAvLyBFeHRlbmQgdGhlICdub3JtYWwnIGtleXdvcmRzIHdpdGggdGhlIFR5cGVTY3JpcHQgbGFuZ3VhZ2UgZXh0ZW5zaW9ucwogICAgaWYgKGlzVFMpIHsKICAgICAgdmFyIHR5cGUgPSB7dHlwZTogInZhcmlhYmxlIiwgc3R5bGU6ICJ2YXJpYWJsZS0zIn07CiAgICAgIHZhciB0c0tleXdvcmRzID0gewogICAgICAgIC8vIG9iamVjdC1saWtlIHRoaW5ncwogICAgICAgICJpbnRlcmZhY2UiOiBrdygiY2xhc3MiKSwKICAgICAgICAiaW1wbGVtZW50cyI6IEMsCiAgICAgICAgIm5hbWVzcGFjZSI6IEMsCiAgICAgICAgIm1vZHVsZSI6IGt3KCJtb2R1bGUiKSwKICAgICAgICAiZW51bSI6IGt3KCJtb2R1bGUiKSwKICAgICAgICAidHlwZSI6IGt3KCJ0eXBlIiksCgogICAgICAgIC8vIHNjb3BlIG1vZGlmaWVycwogICAgICAgICJwdWJsaWMiOiBrdygibW9kaWZpZXIiKSwKICAgICAgICAicHJpdmF0ZSI6IGt3KCJtb2RpZmllciIpLAogICAgICAgICJwcm90ZWN0ZWQiOiBrdygibW9kaWZpZXIiKSwKICAgICAgICAiYWJzdHJhY3QiOiBrdygibW9kaWZpZXIiKSwKCiAgICAgICAgLy8gb3BlcmF0b3JzCiAgICAgICAgImFzIjogb3BlcmF0b3IsCgogICAgICAgIC8vIHR5cGVzCiAgICAgICAgInN0cmluZyI6IHR5cGUsICJudW1iZXIiOiB0eXBlLCAiYm9vbGVhbiI6IHR5cGUsICJhbnkiOiB0eXBlCiAgICAgIH07CgogICAgICBmb3IgKHZhciBhdHRyIGluIHRzS2V5d29yZHMpIHsKICAgICAgICBqc0tleXdvcmRzW2F0dHJdID0gdHNLZXl3b3Jkc1thdHRyXTsKICAgICAgfQogICAgfQoKICAgIHJldHVybiBqc0tleXdvcmRzOwogIH0oKTsKCiAgdmFyIGlzT3BlcmF0b3JDaGFyID0gL1srXC0qJiU9PD4hP3x+Xl0vOwogIHZhciBpc0pzb25sZEtleXdvcmQgPSAvXkAoY29udGV4dHxpZHx2YWx1ZXxsYW5ndWFnZXx0eXBlfGNvbnRhaW5lcnxsaXN0fHNldHxyZXZlcnNlfGluZGV4fGJhc2V8dm9jYWJ8Z3JhcGgpIi87CgogIGZ1bmN0aW9uIHJlYWRSZWdleHAoc3RyZWFtKSB7CiAgICB2YXIgZXNjYXBlZCA9IGZhbHNlLCBuZXh0LCBpblNldCA9IGZhbHNlOwogICAgd2hpbGUgKChuZXh0ID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkgewogICAgICBpZiAoIWVzY2FwZWQpIHsKICAgICAgICBpZiAobmV4dCA9PSAiLyIgJiYgIWluU2V0KSByZXR1cm47CiAgICAgICAgaWYgKG5leHQgPT0gIlsiKSBpblNldCA9IHRydWU7CiAgICAgICAgZWxzZSBpZiAoaW5TZXQgJiYgbmV4dCA9PSAiXSIpIGluU2V0ID0gZmFsc2U7CiAgICAgIH0KICAgICAgZXNjYXBlZCA9ICFlc2NhcGVkICYmIG5leHQgPT0gIlxcIjsKICAgIH0KICB9CgogIC8vIFVzZWQgYXMgc2NyYXRjaCB2YXJpYWJsZXMgdG8gY29tbXVuaWNhdGUgbXVsdGlwbGUgdmFsdWVzIHdpdGhvdXQKICAvLyBjb25zaW5nIHVwIHRvbnMgb2Ygb2JqZWN0cy4KICB2YXIgdHlwZSwgY29udGVudDsKICBmdW5jdGlvbiByZXQodHAsIHN0eWxlLCBjb250KSB7CiAgICB0eXBlID0gdHA7IGNvbnRlbnQgPSBjb250OwogICAgcmV0dXJuIHN0eWxlOwogIH0KICBmdW5jdGlvbiB0b2tlbkJhc2Uoc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIGNoID0gc3RyZWFtLm5leHQoKTsKICAgIGlmIChjaCA9PSAnIicgfHwgY2ggPT0gIiciKSB7CiAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5TdHJpbmcoY2gpOwogICAgICByZXR1cm4gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CiAgICB9IGVsc2UgaWYgKGNoID09ICIuIiAmJiBzdHJlYW0ubWF0Y2goL15cZCsoPzpbZUVdWytcLV0/XGQrKT8vKSkgewogICAgICByZXR1cm4gcmV0KCJudW1iZXIiLCAibnVtYmVyIik7CiAgICB9IGVsc2UgaWYgKGNoID09ICIuIiAmJiBzdHJlYW0ubWF0Y2goIi4uIikpIHsKICAgICAgcmV0dXJuIHJldCgic3ByZWFkIiwgIm1ldGEiKTsKICAgIH0gZWxzZSBpZiAoL1tcW1xde31cKFwpLDtcOlwuXS8udGVzdChjaCkpIHsKICAgICAgcmV0dXJuIHJldChjaCk7CiAgICB9IGVsc2UgaWYgKGNoID09ICI9IiAmJiBzdHJlYW0uZWF0KCI+IikpIHsKICAgICAgcmV0dXJuIHJldCgiPT4iLCAib3BlcmF0b3IiKTsKICAgIH0gZWxzZSBpZiAoY2ggPT0gIjAiICYmIHN0cmVhbS5lYXQoL3gvaSkpIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXGRhLWZdL2kpOwogICAgICByZXR1cm4gcmV0KCJudW1iZXIiLCAibnVtYmVyIik7CiAgICB9IGVsc2UgaWYgKGNoID09ICIwIiAmJiBzdHJlYW0uZWF0KC9vL2kpKSB7CiAgICAgIHN0cmVhbS5lYXRXaGlsZSgvWzAtN10vaSk7CiAgICAgIHJldHVybiByZXQoIm51bWJlciIsICJudW1iZXIiKTsKICAgIH0gZWxzZSBpZiAoY2ggPT0gIjAiICYmIHN0cmVhbS5lYXQoL2IvaSkpIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bMDFdL2kpOwogICAgICByZXR1cm4gcmV0KCJudW1iZXIiLCAibnVtYmVyIik7CiAgICB9IGVsc2UgaWYgKC9cZC8udGVzdChjaCkpIHsKICAgICAgc3RyZWFtLm1hdGNoKC9eXGQqKD86XC5cZCopPyg/OltlRV1bK1wtXT9cZCspPy8pOwogICAgICByZXR1cm4gcmV0KCJudW1iZXIiLCAibnVtYmVyIik7CiAgICB9IGVsc2UgaWYgKGNoID09ICIvIikgewogICAgICBpZiAoc3RyZWFtLmVhdCgiKiIpKSB7CiAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkNvbW1lbnQ7CiAgICAgICAgcmV0dXJuIHRva2VuQ29tbWVudChzdHJlYW0sIHN0YXRlKTsKICAgICAgfSBlbHNlIGlmIChzdHJlYW0uZWF0KCIvIikpIHsKICAgICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICAgICAgcmV0dXJuIHJldCgiY29tbWVudCIsICJjb21tZW50Iik7CiAgICAgIH0gZWxzZSBpZiAoZXhwcmVzc2lvbkFsbG93ZWQoc3RyZWFtLCBzdGF0ZSwgMSkpIHsKICAgICAgICByZWFkUmVnZXhwKHN0cmVhbSk7CiAgICAgICAgc3RyZWFtLm1hdGNoKC9eXGIoKFtnaW15dV0pKD8hW2dpbXl1XSpcMikpK1xiLyk7CiAgICAgICAgcmV0dXJuIHJldCgicmVnZXhwIiwgInN0cmluZy0yIik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc3RyZWFtLmVhdFdoaWxlKGlzT3BlcmF0b3JDaGFyKTsKICAgICAgICByZXR1cm4gcmV0KCJvcGVyYXRvciIsICJvcGVyYXRvciIsIHN0cmVhbS5jdXJyZW50KCkpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKGNoID09ICJgIikgewogICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuUXVhc2k7CiAgICAgIHJldHVybiB0b2tlblF1YXNpKHN0cmVhbSwgc3RhdGUpOwogICAgfSBlbHNlIGlmIChjaCA9PSAiIyIpIHsKICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICByZXR1cm4gcmV0KCJlcnJvciIsICJlcnJvciIpOwogICAgfSBlbHNlIGlmIChpc09wZXJhdG9yQ2hhci50ZXN0KGNoKSkgewogICAgICBzdHJlYW0uZWF0V2hpbGUoaXNPcGVyYXRvckNoYXIpOwogICAgICByZXR1cm4gcmV0KCJvcGVyYXRvciIsICJvcGVyYXRvciIsIHN0cmVhbS5jdXJyZW50KCkpOwogICAgfSBlbHNlIGlmICh3b3JkUkUudGVzdChjaCkpIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKHdvcmRSRSk7CiAgICAgIHZhciB3b3JkID0gc3RyZWFtLmN1cnJlbnQoKSwga25vd24gPSBrZXl3b3Jkcy5wcm9wZXJ0eUlzRW51bWVyYWJsZSh3b3JkKSAmJiBrZXl3b3Jkc1t3b3JkXTsKICAgICAgcmV0dXJuIChrbm93biAmJiBzdGF0ZS5sYXN0VHlwZSAhPSAiLiIpID8gcmV0KGtub3duLnR5cGUsIGtub3duLnN0eWxlLCB3b3JkKSA6CiAgICAgICAgICAgICAgICAgICAgIHJldCgidmFyaWFibGUiLCAidmFyaWFibGUiLCB3b3JkKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHRva2VuU3RyaW5nKHF1b3RlKSB7CiAgICByZXR1cm4gZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICB2YXIgZXNjYXBlZCA9IGZhbHNlLCBuZXh0OwogICAgICBpZiAoanNvbmxkTW9kZSAmJiBzdHJlYW0ucGVlaygpID09ICJAIiAmJiBzdHJlYW0ubWF0Y2goaXNKc29ubGRLZXl3b3JkKSl7CiAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICAgICAgcmV0dXJuIHJldCgianNvbmxkLWtleXdvcmQiLCAibWV0YSIpOwogICAgICB9CiAgICAgIHdoaWxlICgobmV4dCA9IHN0cmVhbS5uZXh0KCkpICE9IG51bGwpIHsKICAgICAgICBpZiAobmV4dCA9PSBxdW90ZSAmJiAhZXNjYXBlZCkgYnJlYWs7CiAgICAgICAgZXNjYXBlZCA9ICFlc2NhcGVkICYmIG5leHQgPT0gIlxcIjsKICAgICAgfQogICAgICBpZiAoIWVzY2FwZWQpIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlOwogICAgICByZXR1cm4gcmV0KCJzdHJpbmciLCAic3RyaW5nIik7CiAgICB9OwogIH0KCiAgZnVuY3Rpb24gdG9rZW5Db21tZW50KHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBtYXliZUVuZCA9IGZhbHNlLCBjaDsKICAgIHdoaWxlIChjaCA9IHN0cmVhbS5uZXh0KCkpIHsKICAgICAgaWYgKGNoID09ICIvIiAmJiBtYXliZUVuZCkgewogICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIG1heWJlRW5kID0gKGNoID09ICIqIik7CiAgICB9CiAgICByZXR1cm4gcmV0KCJjb21tZW50IiwgImNvbW1lbnQiKTsKICB9CgogIGZ1bmN0aW9uIHRva2VuUXVhc2koc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIGVzY2FwZWQgPSBmYWxzZSwgbmV4dDsKICAgIHdoaWxlICgobmV4dCA9IHN0cmVhbS5uZXh0KCkpICE9IG51bGwpIHsKICAgICAgaWYgKCFlc2NhcGVkICYmIChuZXh0ID09ICJgIiB8fCBuZXh0ID09ICIkIiAmJiBzdHJlYW0uZWF0KCJ7IikpKSB7CiAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgZXNjYXBlZCA9ICFlc2NhcGVkICYmIG5leHQgPT0gIlxcIjsKICAgIH0KICAgIHJldHVybiByZXQoInF1YXNpIiwgInN0cmluZy0yIiwgc3RyZWFtLmN1cnJlbnQoKSk7CiAgfQoKICB2YXIgYnJhY2tldHMgPSAiKFt7fV0pIjsKICAvLyBUaGlzIGlzIGEgY3J1ZGUgbG9va2FoZWFkIHRyaWNrIHRvIHRyeSBhbmQgbm90aWNlIHRoYXQgd2UncmUKICAvLyBwYXJzaW5nIHRoZSBhcmd1bWVudCBwYXR0ZXJucyBmb3IgYSBmYXQtYXJyb3cgZnVuY3Rpb24gYmVmb3JlIHdlCiAgLy8gYWN0dWFsbHkgaGl0IHRoZSBhcnJvdyB0b2tlbi4gSXQgb25seSB3b3JrcyBpZiB0aGUgYXJyb3cgaXMgb24KICAvLyB0aGUgc2FtZSBsaW5lIGFzIHRoZSBhcmd1bWVudHMgYW5kIHRoZXJlJ3Mgbm8gc3RyYW5nZSBub2lzZQogIC8vIChjb21tZW50cykgaW4gYmV0d2Vlbi4gRmFsbGJhY2sgaXMgdG8gb25seSBub3RpY2Ugd2hlbiB3ZSBoaXQgdGhlCiAgLy8gYXJyb3csIGFuZCBub3QgZGVjbGFyZSB0aGUgYXJndW1lbnRzIGFzIGxvY2FscyBmb3IgdGhlIGFycm93CiAgLy8gYm9keS4KICBmdW5jdGlvbiBmaW5kRmF0QXJyb3coc3RyZWFtLCBzdGF0ZSkgewogICAgaWYgKHN0YXRlLmZhdEFycm93QXQpIHN0YXRlLmZhdEFycm93QXQgPSBudWxsOwogICAgdmFyIGFycm93ID0gc3RyZWFtLnN0cmluZy5pbmRleE9mKCI9PiIsIHN0cmVhbS5zdGFydCk7CiAgICBpZiAoYXJyb3cgPCAwKSByZXR1cm47CgogICAgaWYgKGlzVFMpIHsgLy8gVHJ5IHRvIHNraXAgVHlwZVNjcmlwdCByZXR1cm4gdHlwZSBkZWNsYXJhdGlvbnMgYWZ0ZXIgdGhlIGFyZ3VtZW50cwogICAgICB2YXIgbSA9IC86XHMqKD86XHcrKD86PFtePl0qPnxcW1xdKT98XHtbXn1dKlx9KVxzKiQvLmV4ZWMoc3RyZWFtLnN0cmluZy5zbGljZShzdHJlYW0uc3RhcnQsIGFycm93KSkKICAgICAgaWYgKG0pIGFycm93ID0gbS5pbmRleAogICAgfQoKICAgIHZhciBkZXB0aCA9IDAsIHNhd1NvbWV0aGluZyA9IGZhbHNlOwogICAgZm9yICh2YXIgcG9zID0gYXJyb3cgLSAxOyBwb3MgPj0gMDsgLS1wb3MpIHsKICAgICAgdmFyIGNoID0gc3RyZWFtLnN0cmluZy5jaGFyQXQocG9zKTsKICAgICAgdmFyIGJyYWNrZXQgPSBicmFja2V0cy5pbmRleE9mKGNoKTsKICAgICAgaWYgKGJyYWNrZXQgPj0gMCAmJiBicmFja2V0IDwgMykgewogICAgICAgIGlmICghZGVwdGgpIHsgKytwb3M7IGJyZWFrOyB9CiAgICAgICAgaWYgKC0tZGVwdGggPT0gMCkgeyBpZiAoY2ggPT0gIigiKSBzYXdTb21ldGhpbmcgPSB0cnVlOyBicmVhazsgfQogICAgICB9IGVsc2UgaWYgKGJyYWNrZXQgPj0gMyAmJiBicmFja2V0IDwgNikgewogICAgICAgICsrZGVwdGg7CiAgICAgIH0gZWxzZSBpZiAod29yZFJFLnRlc3QoY2gpKSB7CiAgICAgICAgc2F3U29tZXRoaW5nID0gdHJ1ZTsKICAgICAgfSBlbHNlIGlmICgvWyInXC9dLy50ZXN0KGNoKSkgewogICAgICAgIHJldHVybjsKICAgICAgfSBlbHNlIGlmIChzYXdTb21ldGhpbmcgJiYgIWRlcHRoKSB7CiAgICAgICAgKytwb3M7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIGlmIChzYXdTb21ldGhpbmcgJiYgIWRlcHRoKSBzdGF0ZS5mYXRBcnJvd0F0ID0gcG9zOwogIH0KCiAgLy8gUGFyc2VyCgogIHZhciBhdG9taWNUeXBlcyA9IHsiYXRvbSI6IHRydWUsICJudW1iZXIiOiB0cnVlLCAidmFyaWFibGUiOiB0cnVlLCAic3RyaW5nIjogdHJ1ZSwgInJlZ2V4cCI6IHRydWUsICJ0aGlzIjogdHJ1ZSwgImpzb25sZC1rZXl3b3JkIjogdHJ1ZX07CgogIGZ1bmN0aW9uIEpTTGV4aWNhbChpbmRlbnRlZCwgY29sdW1uLCB0eXBlLCBhbGlnbiwgcHJldiwgaW5mbykgewogICAgdGhpcy5pbmRlbnRlZCA9IGluZGVudGVkOwogICAgdGhpcy5jb2x1bW4gPSBjb2x1bW47CiAgICB0aGlzLnR5cGUgPSB0eXBlOwogICAgdGhpcy5wcmV2ID0gcHJldjsKICAgIHRoaXMuaW5mbyA9IGluZm87CiAgICBpZiAoYWxpZ24gIT0gbnVsbCkgdGhpcy5hbGlnbiA9IGFsaWduOwogIH0KCiAgZnVuY3Rpb24gaW5TY29wZShzdGF0ZSwgdmFybmFtZSkgewogICAgZm9yICh2YXIgdiA9IHN0YXRlLmxvY2FsVmFyczsgdjsgdiA9IHYubmV4dCkKICAgICAgaWYgKHYubmFtZSA9PSB2YXJuYW1lKSByZXR1cm4gdHJ1ZTsKICAgIGZvciAodmFyIGN4ID0gc3RhdGUuY29udGV4dDsgY3g7IGN4ID0gY3gucHJldikgewogICAgICBmb3IgKHZhciB2ID0gY3gudmFyczsgdjsgdiA9IHYubmV4dCkKICAgICAgICBpZiAodi5uYW1lID09IHZhcm5hbWUpIHJldHVybiB0cnVlOwogICAgfQogIH0KCiAgZnVuY3Rpb24gcGFyc2VKUyhzdGF0ZSwgc3R5bGUsIHR5cGUsIGNvbnRlbnQsIHN0cmVhbSkgewogICAgdmFyIGNjID0gc3RhdGUuY2M7CiAgICAvLyBDb21tdW5pY2F0ZSBvdXIgY29udGV4dCB0byB0aGUgY29tYmluYXRvcnMuCiAgICAvLyAoTGVzcyB3YXN0ZWZ1bCB0aGFuIGNvbnNpbmcgdXAgYSBodW5kcmVkIGNsb3N1cmVzIG9uIGV2ZXJ5IGNhbGwuKQogICAgY3guc3RhdGUgPSBzdGF0ZTsgY3guc3RyZWFtID0gc3RyZWFtOyBjeC5tYXJrZWQgPSBudWxsLCBjeC5jYyA9IGNjOyBjeC5zdHlsZSA9IHN0eWxlOwoKICAgIGlmICghc3RhdGUubGV4aWNhbC5oYXNPd25Qcm9wZXJ0eSgiYWxpZ24iKSkKICAgICAgc3RhdGUubGV4aWNhbC5hbGlnbiA9IHRydWU7CgogICAgd2hpbGUodHJ1ZSkgewogICAgICB2YXIgY29tYmluYXRvciA9IGNjLmxlbmd0aCA/IGNjLnBvcCgpIDoganNvbk1vZGUgPyBleHByZXNzaW9uIDogc3RhdGVtZW50OwogICAgICBpZiAoY29tYmluYXRvcih0eXBlLCBjb250ZW50KSkgewogICAgICAgIHdoaWxlKGNjLmxlbmd0aCAmJiBjY1tjYy5sZW5ndGggLSAxXS5sZXgpCiAgICAgICAgICBjYy5wb3AoKSgpOwogICAgICAgIGlmIChjeC5tYXJrZWQpIHJldHVybiBjeC5tYXJrZWQ7CiAgICAgICAgaWYgKHR5cGUgPT0gInZhcmlhYmxlIiAmJiBpblNjb3BlKHN0YXRlLCBjb250ZW50KSkgcmV0dXJuICJ2YXJpYWJsZS0yIjsKICAgICAgICByZXR1cm4gc3R5bGU7CiAgICAgIH0KICAgIH0KICB9CgogIC8vIENvbWJpbmF0b3IgdXRpbHMKCiAgdmFyIGN4ID0ge3N0YXRlOiBudWxsLCBjb2x1bW46IG51bGwsIG1hcmtlZDogbnVsbCwgY2M6IG51bGx9OwogIGZ1bmN0aW9uIHBhc3MoKSB7CiAgICBmb3IgKHZhciBpID0gYXJndW1lbnRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBjeC5jYy5wdXNoKGFyZ3VtZW50c1tpXSk7CiAgfQogIGZ1bmN0aW9uIGNvbnQoKSB7CiAgICBwYXNzLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICByZXR1cm4gdHJ1ZTsKICB9CiAgZnVuY3Rpb24gcmVnaXN0ZXIodmFybmFtZSkgewogICAgZnVuY3Rpb24gaW5MaXN0KGxpc3QpIHsKICAgICAgZm9yICh2YXIgdiA9IGxpc3Q7IHY7IHYgPSB2Lm5leHQpCiAgICAgICAgaWYgKHYubmFtZSA9PSB2YXJuYW1lKSByZXR1cm4gdHJ1ZTsKICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgdmFyIHN0YXRlID0gY3guc3RhdGU7CiAgICBjeC5tYXJrZWQgPSAiZGVmIjsKICAgIGlmIChzdGF0ZS5jb250ZXh0KSB7CiAgICAgIGlmIChpbkxpc3Qoc3RhdGUubG9jYWxWYXJzKSkgcmV0dXJuOwogICAgICBzdGF0ZS5sb2NhbFZhcnMgPSB7bmFtZTogdmFybmFtZSwgbmV4dDogc3RhdGUubG9jYWxWYXJzfTsKICAgIH0gZWxzZSB7CiAgICAgIGlmIChpbkxpc3Qoc3RhdGUuZ2xvYmFsVmFycykpIHJldHVybjsKICAgICAgaWYgKHBhcnNlckNvbmZpZy5nbG9iYWxWYXJzKQogICAgICAgIHN0YXRlLmdsb2JhbFZhcnMgPSB7bmFtZTogdmFybmFtZSwgbmV4dDogc3RhdGUuZ2xvYmFsVmFyc307CiAgICB9CiAgfQoKICAvLyBDb21iaW5hdG9ycwoKICB2YXIgZGVmYXVsdFZhcnMgPSB7bmFtZTogInRoaXMiLCBuZXh0OiB7bmFtZTogImFyZ3VtZW50cyJ9fTsKICBmdW5jdGlvbiBwdXNoY29udGV4dCgpIHsKICAgIGN4LnN0YXRlLmNvbnRleHQgPSB7cHJldjogY3guc3RhdGUuY29udGV4dCwgdmFyczogY3guc3RhdGUubG9jYWxWYXJzfTsKICAgIGN4LnN0YXRlLmxvY2FsVmFycyA9IGRlZmF1bHRWYXJzOwogIH0KICBmdW5jdGlvbiBwb3Bjb250ZXh0KCkgewogICAgY3guc3RhdGUubG9jYWxWYXJzID0gY3guc3RhdGUuY29udGV4dC52YXJzOwogICAgY3guc3RhdGUuY29udGV4dCA9IGN4LnN0YXRlLmNvbnRleHQucHJldjsKICB9CiAgZnVuY3Rpb24gcHVzaGxleCh0eXBlLCBpbmZvKSB7CiAgICB2YXIgcmVzdWx0ID0gZnVuY3Rpb24oKSB7CiAgICAgIHZhciBzdGF0ZSA9IGN4LnN0YXRlLCBpbmRlbnQgPSBzdGF0ZS5pbmRlbnRlZDsKICAgICAgaWYgKHN0YXRlLmxleGljYWwudHlwZSA9PSAic3RhdCIpIGluZGVudCA9IHN0YXRlLmxleGljYWwuaW5kZW50ZWQ7CiAgICAgIGVsc2UgZm9yICh2YXIgb3V0ZXIgPSBzdGF0ZS5sZXhpY2FsOyBvdXRlciAmJiBvdXRlci50eXBlID09ICIpIiAmJiBvdXRlci5hbGlnbjsgb3V0ZXIgPSBvdXRlci5wcmV2KQogICAgICAgIGluZGVudCA9IG91dGVyLmluZGVudGVkOwogICAgICBzdGF0ZS5sZXhpY2FsID0gbmV3IEpTTGV4aWNhbChpbmRlbnQsIGN4LnN0cmVhbS5jb2x1bW4oKSwgdHlwZSwgbnVsbCwgc3RhdGUubGV4aWNhbCwgaW5mbyk7CiAgICB9OwogICAgcmVzdWx0LmxleCA9IHRydWU7CiAgICByZXR1cm4gcmVzdWx0OwogIH0KICBmdW5jdGlvbiBwb3BsZXgoKSB7CiAgICB2YXIgc3RhdGUgPSBjeC5zdGF0ZTsKICAgIGlmIChzdGF0ZS5sZXhpY2FsLnByZXYpIHsKICAgICAgaWYgKHN0YXRlLmxleGljYWwudHlwZSA9PSAiKSIpCiAgICAgICAgc3RhdGUuaW5kZW50ZWQgPSBzdGF0ZS5sZXhpY2FsLmluZGVudGVkOwogICAgICBzdGF0ZS5sZXhpY2FsID0gc3RhdGUubGV4aWNhbC5wcmV2OwogICAgfQogIH0KICBwb3BsZXgubGV4ID0gdHJ1ZTsKCiAgZnVuY3Rpb24gZXhwZWN0KHdhbnRlZCkgewogICAgZnVuY3Rpb24gZXhwKHR5cGUpIHsKICAgICAgaWYgKHR5cGUgPT0gd2FudGVkKSByZXR1cm4gY29udCgpOwogICAgICBlbHNlIGlmICh3YW50ZWQgPT0gIjsiKSByZXR1cm4gcGFzcygpOwogICAgICBlbHNlIHJldHVybiBjb250KGV4cCk7CiAgICB9OwogICAgcmV0dXJuIGV4cDsKICB9CgogIGZ1bmN0aW9uIHN0YXRlbWVudCh0eXBlLCB2YWx1ZSkgewogICAgaWYgKHR5cGUgPT0gInZhciIpIHJldHVybiBjb250KHB1c2hsZXgoInZhcmRlZiIsIHZhbHVlLmxlbmd0aCksIHZhcmRlZiwgZXhwZWN0KCI7IiksIHBvcGxleCk7CiAgICBpZiAodHlwZSA9PSAia2V5d29yZCBhIikgcmV0dXJuIGNvbnQocHVzaGxleCgiZm9ybSIpLCBwYXJlbkV4cHIsIHN0YXRlbWVudCwgcG9wbGV4KTsKICAgIGlmICh0eXBlID09ICJrZXl3b3JkIGIiKSByZXR1cm4gY29udChwdXNobGV4KCJmb3JtIiksIHN0YXRlbWVudCwgcG9wbGV4KTsKICAgIGlmICh0eXBlID09ICJ7IikgcmV0dXJuIGNvbnQocHVzaGxleCgifSIpLCBibG9jaywgcG9wbGV4KTsKICAgIGlmICh0eXBlID09ICI7IikgcmV0dXJuIGNvbnQoKTsKICAgIGlmICh0eXBlID09ICJpZiIpIHsKICAgICAgaWYgKGN4LnN0YXRlLmxleGljYWwuaW5mbyA9PSAiZWxzZSIgJiYgY3guc3RhdGUuY2NbY3guc3RhdGUuY2MubGVuZ3RoIC0gMV0gPT0gcG9wbGV4KQogICAgICAgIGN4LnN0YXRlLmNjLnBvcCgpKCk7CiAgICAgIHJldHVybiBjb250KHB1c2hsZXgoImZvcm0iKSwgcGFyZW5FeHByLCBzdGF0ZW1lbnQsIHBvcGxleCwgbWF5YmVlbHNlKTsKICAgIH0KICAgIGlmICh0eXBlID09ICJmdW5jdGlvbiIpIHJldHVybiBjb250KGZ1bmN0aW9uZGVmKTsKICAgIGlmICh0eXBlID09ICJmb3IiKSByZXR1cm4gY29udChwdXNobGV4KCJmb3JtIiksIGZvcnNwZWMsIHN0YXRlbWVudCwgcG9wbGV4KTsKICAgIGlmICh0eXBlID09ICJ2YXJpYWJsZSIpIHJldHVybiBjb250KHB1c2hsZXgoInN0YXQiKSwgbWF5YmVsYWJlbCk7CiAgICBpZiAodHlwZSA9PSAic3dpdGNoIikgcmV0dXJuIGNvbnQocHVzaGxleCgiZm9ybSIpLCBwYXJlbkV4cHIsIHB1c2hsZXgoIn0iLCAic3dpdGNoIiksIGV4cGVjdCgieyIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrLCBwb3BsZXgsIHBvcGxleCk7CiAgICBpZiAodHlwZSA9PSAiY2FzZSIpIHJldHVybiBjb250KGV4cHJlc3Npb24sIGV4cGVjdCgiOiIpKTsKICAgIGlmICh0eXBlID09ICJkZWZhdWx0IikgcmV0dXJuIGNvbnQoZXhwZWN0KCI6IikpOwogICAgaWYgKHR5cGUgPT0gImNhdGNoIikgcmV0dXJuIGNvbnQocHVzaGxleCgiZm9ybSIpLCBwdXNoY29udGV4dCwgZXhwZWN0KCIoIiksIGZ1bmFyZywgZXhwZWN0KCIpIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZW1lbnQsIHBvcGxleCwgcG9wY29udGV4dCk7CiAgICBpZiAodHlwZSA9PSAiY2xhc3MiKSByZXR1cm4gY29udChwdXNobGV4KCJmb3JtIiksIGNsYXNzTmFtZSwgcG9wbGV4KTsKICAgIGlmICh0eXBlID09ICJleHBvcnQiKSByZXR1cm4gY29udChwdXNobGV4KCJzdGF0IiksIGFmdGVyRXhwb3J0LCBwb3BsZXgpOwogICAgaWYgKHR5cGUgPT0gImltcG9ydCIpIHJldHVybiBjb250KHB1c2hsZXgoInN0YXQiKSwgYWZ0ZXJJbXBvcnQsIHBvcGxleCk7CiAgICBpZiAodHlwZSA9PSAibW9kdWxlIikgcmV0dXJuIGNvbnQocHVzaGxleCgiZm9ybSIpLCBwYXR0ZXJuLCBwdXNobGV4KCJ9IiksIGV4cGVjdCgieyIpLCBibG9jaywgcG9wbGV4LCBwb3BsZXgpCiAgICBpZiAodHlwZSA9PSAidHlwZSIpIHJldHVybiBjb250KHR5cGVleHByLCBleHBlY3QoIm9wZXJhdG9yIiksIHR5cGVleHByLCBleHBlY3QoIjsiKSk7CiAgICBpZiAodHlwZSA9PSAiYXN5bmMiKSByZXR1cm4gY29udChzdGF0ZW1lbnQpCiAgICByZXR1cm4gcGFzcyhwdXNobGV4KCJzdGF0IiksIGV4cHJlc3Npb24sIGV4cGVjdCgiOyIpLCBwb3BsZXgpOwogIH0KICBmdW5jdGlvbiBleHByZXNzaW9uKHR5cGUpIHsKICAgIHJldHVybiBleHByZXNzaW9uSW5uZXIodHlwZSwgZmFsc2UpOwogIH0KICBmdW5jdGlvbiBleHByZXNzaW9uTm9Db21tYSh0eXBlKSB7CiAgICByZXR1cm4gZXhwcmVzc2lvbklubmVyKHR5cGUsIHRydWUpOwogIH0KICBmdW5jdGlvbiBwYXJlbkV4cHIodHlwZSkgewogICAgaWYgKHR5cGUgIT0gIigiKSByZXR1cm4gcGFzcygpCiAgICByZXR1cm4gY29udChwdXNobGV4KCIpIiksIGV4cHJlc3Npb24sIGV4cGVjdCgiKSIpLCBwb3BsZXgpCiAgfQogIGZ1bmN0aW9uIGV4cHJlc3Npb25Jbm5lcih0eXBlLCBub0NvbW1hKSB7CiAgICBpZiAoY3guc3RhdGUuZmF0QXJyb3dBdCA9PSBjeC5zdHJlYW0uc3RhcnQpIHsKICAgICAgdmFyIGJvZHkgPSBub0NvbW1hID8gYXJyb3dCb2R5Tm9Db21tYSA6IGFycm93Qm9keTsKICAgICAgaWYgKHR5cGUgPT0gIigiKSByZXR1cm4gY29udChwdXNoY29udGV4dCwgcHVzaGxleCgiKSIpLCBjb21tYXNlcChwYXR0ZXJuLCAiKSIpLCBwb3BsZXgsIGV4cGVjdCgiPT4iKSwgYm9keSwgcG9wY29udGV4dCk7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gInZhcmlhYmxlIikgcmV0dXJuIHBhc3MocHVzaGNvbnRleHQsIHBhdHRlcm4sIGV4cGVjdCgiPT4iKSwgYm9keSwgcG9wY29udGV4dCk7CiAgICB9CgogICAgdmFyIG1heWJlb3AgPSBub0NvbW1hID8gbWF5YmVvcGVyYXRvck5vQ29tbWEgOiBtYXliZW9wZXJhdG9yQ29tbWE7CiAgICBpZiAoYXRvbWljVHlwZXMuaGFzT3duUHJvcGVydHkodHlwZSkpIHJldHVybiBjb250KG1heWJlb3ApOwogICAgaWYgKHR5cGUgPT0gImZ1bmN0aW9uIikgcmV0dXJuIGNvbnQoZnVuY3Rpb25kZWYsIG1heWJlb3ApOwogICAgaWYgKHR5cGUgPT0gImNsYXNzIikgcmV0dXJuIGNvbnQocHVzaGxleCgiZm9ybSIpLCBjbGFzc0V4cHJlc3Npb24sIHBvcGxleCk7CiAgICBpZiAodHlwZSA9PSAia2V5d29yZCBjIiB8fCB0eXBlID09ICJhc3luYyIpIHJldHVybiBjb250KG5vQ29tbWEgPyBtYXliZWV4cHJlc3Npb25Ob0NvbW1hIDogbWF5YmVleHByZXNzaW9uKTsKICAgIGlmICh0eXBlID09ICIoIikgcmV0dXJuIGNvbnQocHVzaGxleCgiKSIpLCBtYXliZWV4cHJlc3Npb24sIGV4cGVjdCgiKSIpLCBwb3BsZXgsIG1heWJlb3ApOwogICAgaWYgKHR5cGUgPT0gIm9wZXJhdG9yIiB8fCB0eXBlID09ICJzcHJlYWQiKSByZXR1cm4gY29udChub0NvbW1hID8gZXhwcmVzc2lvbk5vQ29tbWEgOiBleHByZXNzaW9uKTsKICAgIGlmICh0eXBlID09ICJbIikgcmV0dXJuIGNvbnQocHVzaGxleCgiXSIpLCBhcnJheUxpdGVyYWwsIHBvcGxleCwgbWF5YmVvcCk7CiAgICBpZiAodHlwZSA9PSAieyIpIHJldHVybiBjb250Q29tbWFzZXAob2JqcHJvcCwgIn0iLCBudWxsLCBtYXliZW9wKTsKICAgIGlmICh0eXBlID09ICJxdWFzaSIpIHJldHVybiBwYXNzKHF1YXNpLCBtYXliZW9wKTsKICAgIGlmICh0eXBlID09ICJuZXciKSByZXR1cm4gY29udChtYXliZVRhcmdldChub0NvbW1hKSk7CiAgICByZXR1cm4gY29udCgpOwogIH0KICBmdW5jdGlvbiBtYXliZWV4cHJlc3Npb24odHlwZSkgewogICAgaWYgKHR5cGUubWF0Y2goL1s7XH1cKVxdLF0vKSkgcmV0dXJuIHBhc3MoKTsKICAgIHJldHVybiBwYXNzKGV4cHJlc3Npb24pOwogIH0KICBmdW5jdGlvbiBtYXliZWV4cHJlc3Npb25Ob0NvbW1hKHR5cGUpIHsKICAgIGlmICh0eXBlLm1hdGNoKC9bO1x9XClcXSxdLykpIHJldHVybiBwYXNzKCk7CiAgICByZXR1cm4gcGFzcyhleHByZXNzaW9uTm9Db21tYSk7CiAgfQoKICBmdW5jdGlvbiBtYXliZW9wZXJhdG9yQ29tbWEodHlwZSwgdmFsdWUpIHsKICAgIGlmICh0eXBlID09ICIsIikgcmV0dXJuIGNvbnQoZXhwcmVzc2lvbik7CiAgICByZXR1cm4gbWF5YmVvcGVyYXRvck5vQ29tbWEodHlwZSwgdmFsdWUsIGZhbHNlKTsKICB9CiAgZnVuY3Rpb24gbWF5YmVvcGVyYXRvck5vQ29tbWEodHlwZSwgdmFsdWUsIG5vQ29tbWEpIHsKICAgIHZhciBtZSA9IG5vQ29tbWEgPT0gZmFsc2UgPyBtYXliZW9wZXJhdG9yQ29tbWEgOiBtYXliZW9wZXJhdG9yTm9Db21tYTsKICAgIHZhciBleHByID0gbm9Db21tYSA9PSBmYWxzZSA/IGV4cHJlc3Npb24gOiBleHByZXNzaW9uTm9Db21tYTsKICAgIGlmICh0eXBlID09ICI9PiIpIHJldHVybiBjb250KHB1c2hjb250ZXh0LCBub0NvbW1hID8gYXJyb3dCb2R5Tm9Db21tYSA6IGFycm93Qm9keSwgcG9wY29udGV4dCk7CiAgICBpZiAodHlwZSA9PSAib3BlcmF0b3IiKSB7CiAgICAgIGlmICgvXCtcK3wtLS8udGVzdCh2YWx1ZSkpIHJldHVybiBjb250KG1lKTsKICAgICAgaWYgKHZhbHVlID09ICI/IikgcmV0dXJuIGNvbnQoZXhwcmVzc2lvbiwgZXhwZWN0KCI6IiksIGV4cHIpOwogICAgICByZXR1cm4gY29udChleHByKTsKICAgIH0KICAgIGlmICh0eXBlID09ICJxdWFzaSIpIHsgcmV0dXJuIHBhc3MocXVhc2ksIG1lKTsgfQogICAgaWYgKHR5cGUgPT0gIjsiKSByZXR1cm47CiAgICBpZiAodHlwZSA9PSAiKCIpIHJldHVybiBjb250Q29tbWFzZXAoZXhwcmVzc2lvbk5vQ29tbWEsICIpIiwgImNhbGwiLCBtZSk7CiAgICBpZiAodHlwZSA9PSAiLiIpIHJldHVybiBjb250KHByb3BlcnR5LCBtZSk7CiAgICBpZiAodHlwZSA9PSAiWyIpIHJldHVybiBjb250KHB1c2hsZXgoIl0iKSwgbWF5YmVleHByZXNzaW9uLCBleHBlY3QoIl0iKSwgcG9wbGV4LCBtZSk7CiAgfQogIGZ1bmN0aW9uIHF1YXNpKHR5cGUsIHZhbHVlKSB7CiAgICBpZiAodHlwZSAhPSAicXVhc2kiKSByZXR1cm4gcGFzcygpOwogICAgaWYgKHZhbHVlLnNsaWNlKHZhbHVlLmxlbmd0aCAtIDIpICE9ICIkeyIpIHJldHVybiBjb250KHF1YXNpKTsKICAgIHJldHVybiBjb250KGV4cHJlc3Npb24sIGNvbnRpbnVlUXVhc2kpOwogIH0KICBmdW5jdGlvbiBjb250aW51ZVF1YXNpKHR5cGUpIHsKICAgIGlmICh0eXBlID09ICJ9IikgewogICAgICBjeC5tYXJrZWQgPSAic3RyaW5nLTIiOwogICAgICBjeC5zdGF0ZS50b2tlbml6ZSA9IHRva2VuUXVhc2k7CiAgICAgIHJldHVybiBjb250KHF1YXNpKTsKICAgIH0KICB9CiAgZnVuY3Rpb24gYXJyb3dCb2R5KHR5cGUpIHsKICAgIGZpbmRGYXRBcnJvdyhjeC5zdHJlYW0sIGN4LnN0YXRlKTsKICAgIHJldHVybiBwYXNzKHR5cGUgPT0gInsiID8gc3RhdGVtZW50IDogZXhwcmVzc2lvbik7CiAgfQogIGZ1bmN0aW9uIGFycm93Qm9keU5vQ29tbWEodHlwZSkgewogICAgZmluZEZhdEFycm93KGN4LnN0cmVhbSwgY3guc3RhdGUpOwogICAgcmV0dXJuIHBhc3ModHlwZSA9PSAieyIgPyBzdGF0ZW1lbnQgOiBleHByZXNzaW9uTm9Db21tYSk7CiAgfQogIGZ1bmN0aW9uIG1heWJlVGFyZ2V0KG5vQ29tbWEpIHsKICAgIHJldHVybiBmdW5jdGlvbih0eXBlKSB7CiAgICAgIGlmICh0eXBlID09ICIuIikgcmV0dXJuIGNvbnQobm9Db21tYSA/IHRhcmdldE5vQ29tbWEgOiB0YXJnZXQpOwogICAgICBlbHNlIHJldHVybiBwYXNzKG5vQ29tbWEgPyBleHByZXNzaW9uTm9Db21tYSA6IGV4cHJlc3Npb24pOwogICAgfTsKICB9CiAgZnVuY3Rpb24gdGFyZ2V0KF8sIHZhbHVlKSB7CiAgICBpZiAodmFsdWUgPT0gInRhcmdldCIpIHsgY3gubWFya2VkID0gImtleXdvcmQiOyByZXR1cm4gY29udChtYXliZW9wZXJhdG9yQ29tbWEpOyB9CiAgfQogIGZ1bmN0aW9uIHRhcmdldE5vQ29tbWEoXywgdmFsdWUpIHsKICAgIGlmICh2YWx1ZSA9PSAidGFyZ2V0IikgeyBjeC5tYXJrZWQgPSAia2V5d29yZCI7IHJldHVybiBjb250KG1heWJlb3BlcmF0b3JOb0NvbW1hKTsgfQogIH0KICBmdW5jdGlvbiBtYXliZWxhYmVsKHR5cGUpIHsKICAgIGlmICh0eXBlID09ICI6IikgcmV0dXJuIGNvbnQocG9wbGV4LCBzdGF0ZW1lbnQpOwogICAgcmV0dXJuIHBhc3MobWF5YmVvcGVyYXRvckNvbW1hLCBleHBlY3QoIjsiKSwgcG9wbGV4KTsKICB9CiAgZnVuY3Rpb24gcHJvcGVydHkodHlwZSkgewogICAgaWYgKHR5cGUgPT0gInZhcmlhYmxlIikge2N4Lm1hcmtlZCA9ICJwcm9wZXJ0eSI7IHJldHVybiBjb250KCk7fQogIH0KICBmdW5jdGlvbiBvYmpwcm9wKHR5cGUsIHZhbHVlKSB7CiAgICBpZiAodHlwZSA9PSAiYXN5bmMiKSB7CiAgICAgIGN4Lm1hcmtlZCA9ICJwcm9wZXJ0eSI7CiAgICAgIHJldHVybiBjb250KG9ianByb3ApOwogICAgfSBlbHNlIGlmICh0eXBlID09ICJ2YXJpYWJsZSIgfHwgY3guc3R5bGUgPT0gImtleXdvcmQiKSB7CiAgICAgIGN4Lm1hcmtlZCA9ICJwcm9wZXJ0eSI7CiAgICAgIGlmICh2YWx1ZSA9PSAiZ2V0IiB8fCB2YWx1ZSA9PSAic2V0IikgcmV0dXJuIGNvbnQoZ2V0dGVyU2V0dGVyKTsKICAgICAgcmV0dXJuIGNvbnQoYWZ0ZXJwcm9wKTsKICAgIH0gZWxzZSBpZiAodHlwZSA9PSAibnVtYmVyIiB8fCB0eXBlID09ICJzdHJpbmciKSB7CiAgICAgIGN4Lm1hcmtlZCA9IGpzb25sZE1vZGUgPyAicHJvcGVydHkiIDogKGN4LnN0eWxlICsgIiBwcm9wZXJ0eSIpOwogICAgICByZXR1cm4gY29udChhZnRlcnByb3ApOwogICAgfSBlbHNlIGlmICh0eXBlID09ICJqc29ubGQta2V5d29yZCIpIHsKICAgICAgcmV0dXJuIGNvbnQoYWZ0ZXJwcm9wKTsKICAgIH0gZWxzZSBpZiAodHlwZSA9PSAibW9kaWZpZXIiKSB7CiAgICAgIHJldHVybiBjb250KG9ianByb3ApCiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gIlsiKSB7CiAgICAgIHJldHVybiBjb250KGV4cHJlc3Npb24sIGV4cGVjdCgiXSIpLCBhZnRlcnByb3ApOwogICAgfSBlbHNlIGlmICh0eXBlID09ICJzcHJlYWQiKSB7CiAgICAgIHJldHVybiBjb250KGV4cHJlc3Npb24pOwogICAgfSBlbHNlIGlmICh0eXBlID09ICI6IikgewogICAgICByZXR1cm4gcGFzcyhhZnRlcnByb3ApCiAgICB9CiAgfQogIGZ1bmN0aW9uIGdldHRlclNldHRlcih0eXBlKSB7CiAgICBpZiAodHlwZSAhPSAidmFyaWFibGUiKSByZXR1cm4gcGFzcyhhZnRlcnByb3ApOwogICAgY3gubWFya2VkID0gInByb3BlcnR5IjsKICAgIHJldHVybiBjb250KGZ1bmN0aW9uZGVmKTsKICB9CiAgZnVuY3Rpb24gYWZ0ZXJwcm9wKHR5cGUpIHsKICAgIGlmICh0eXBlID09ICI6IikgcmV0dXJuIGNvbnQoZXhwcmVzc2lvbk5vQ29tbWEpOwogICAgaWYgKHR5cGUgPT0gIigiKSByZXR1cm4gcGFzcyhmdW5jdGlvbmRlZik7CiAgfQogIGZ1bmN0aW9uIGNvbW1hc2VwKHdoYXQsIGVuZCkgewogICAgZnVuY3Rpb24gcHJvY2VlZCh0eXBlLCB2YWx1ZSkgewogICAgICBpZiAodHlwZSA9PSAiLCIpIHsKICAgICAgICB2YXIgbGV4ID0gY3guc3RhdGUubGV4aWNhbDsKICAgICAgICBpZiAobGV4LmluZm8gPT0gImNhbGwiKSBsZXgucG9zID0gKGxleC5wb3MgfHwgMCkgKyAxOwogICAgICAgIHJldHVybiBjb250KGZ1bmN0aW9uKHR5cGUsIHZhbHVlKSB7CiAgICAgICAgICBpZiAodHlwZSA9PSBlbmQgfHwgdmFsdWUgPT0gZW5kKSByZXR1cm4gcGFzcygpCiAgICAgICAgICByZXR1cm4gcGFzcyh3aGF0KQogICAgICAgIH0sIHByb2NlZWQpOwogICAgICB9CiAgICAgIGlmICh0eXBlID09IGVuZCB8fCB2YWx1ZSA9PSBlbmQpIHJldHVybiBjb250KCk7CiAgICAgIHJldHVybiBjb250KGV4cGVjdChlbmQpKTsKICAgIH0KICAgIHJldHVybiBmdW5jdGlvbih0eXBlLCB2YWx1ZSkgewogICAgICBpZiAodHlwZSA9PSBlbmQgfHwgdmFsdWUgPT0gZW5kKSByZXR1cm4gY29udCgpOwogICAgICByZXR1cm4gcGFzcyh3aGF0LCBwcm9jZWVkKTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIGNvbnRDb21tYXNlcCh3aGF0LCBlbmQsIGluZm8pIHsKICAgIGZvciAodmFyIGkgPSAzOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKQogICAgICBjeC5jYy5wdXNoKGFyZ3VtZW50c1tpXSk7CiAgICByZXR1cm4gY29udChwdXNobGV4KGVuZCwgaW5mbyksIGNvbW1hc2VwKHdoYXQsIGVuZCksIHBvcGxleCk7CiAgfQogIGZ1bmN0aW9uIGJsb2NrKHR5cGUpIHsKICAgIGlmICh0eXBlID09ICJ9IikgcmV0dXJuIGNvbnQoKTsKICAgIHJldHVybiBwYXNzKHN0YXRlbWVudCwgYmxvY2spOwogIH0KICBmdW5jdGlvbiBtYXliZXR5cGUodHlwZSwgdmFsdWUpIHsKICAgIGlmIChpc1RTKSB7CiAgICAgIGlmICh0eXBlID09ICI6IikgcmV0dXJuIGNvbnQodHlwZWV4cHIpOwogICAgICBpZiAodmFsdWUgPT0gIj8iKSByZXR1cm4gY29udChtYXliZXR5cGUpOwogICAgfQogIH0KICBmdW5jdGlvbiB0eXBlZXhwcih0eXBlKSB7CiAgICBpZiAodHlwZSA9PSAidmFyaWFibGUiKSB7Y3gubWFya2VkID0gInZhcmlhYmxlLTMiOyByZXR1cm4gY29udChhZnRlclR5cGUpO30KICAgIGlmICh0eXBlID09ICJ7IikgcmV0dXJuIGNvbnQoY29tbWFzZXAodHlwZXByb3AsICJ9IikpCiAgICBpZiAodHlwZSA9PSAiKCIpIHJldHVybiBjb250KGNvbW1hc2VwKHR5cGVhcmcsICIpIiksIG1heWJlUmV0dXJuVHlwZSkKICB9CiAgZnVuY3Rpb24gbWF5YmVSZXR1cm5UeXBlKHR5cGUpIHsKICAgIGlmICh0eXBlID09ICI9PiIpIHJldHVybiBjb250KHR5cGVleHByKQogIH0KICBmdW5jdGlvbiB0eXBlcHJvcCh0eXBlKSB7CiAgICBpZiAodHlwZSA9PSAidmFyaWFibGUiIHx8IGN4LnN0eWxlID09ICJrZXl3b3JkIikgewogICAgICBjeC5tYXJrZWQgPSAicHJvcGVydHkiCiAgICAgIHJldHVybiBjb250KHR5cGVwcm9wKQogICAgfSBlbHNlIGlmICh0eXBlID09ICI6IikgewogICAgICByZXR1cm4gY29udCh0eXBlZXhwcikKICAgIH0KICB9CiAgZnVuY3Rpb24gdHlwZWFyZyh0eXBlKSB7CiAgICBpZiAodHlwZSA9PSAidmFyaWFibGUiKSByZXR1cm4gY29udCh0eXBlYXJnKQogICAgZWxzZSBpZiAodHlwZSA9PSAiOiIpIHJldHVybiBjb250KHR5cGVleHByKQogIH0KICBmdW5jdGlvbiBhZnRlclR5cGUodHlwZSwgdmFsdWUpIHsKICAgIGlmICh2YWx1ZSA9PSAiPCIpIHJldHVybiBjb250KGNvbW1hc2VwKHR5cGVleHByLCAiPiIpLCBhZnRlclR5cGUpCiAgICBpZiAodHlwZSA9PSAiWyIpIHJldHVybiBjb250KGV4cGVjdCgiXSIpLCBhZnRlclR5cGUpCiAgfQogIGZ1bmN0aW9uIHZhcmRlZigpIHsKICAgIHJldHVybiBwYXNzKHBhdHRlcm4sIG1heWJldHlwZSwgbWF5YmVBc3NpZ24sIHZhcmRlZkNvbnQpOwogIH0KICBmdW5jdGlvbiBwYXR0ZXJuKHR5cGUsIHZhbHVlKSB7CiAgICBpZiAodHlwZSA9PSAibW9kaWZpZXIiKSByZXR1cm4gY29udChwYXR0ZXJuKQogICAgaWYgKHR5cGUgPT0gInZhcmlhYmxlIikgeyByZWdpc3Rlcih2YWx1ZSk7IHJldHVybiBjb250KCk7IH0KICAgIGlmICh0eXBlID09ICJzcHJlYWQiKSByZXR1cm4gY29udChwYXR0ZXJuKTsKICAgIGlmICh0eXBlID09ICJbIikgcmV0dXJuIGNvbnRDb21tYXNlcChwYXR0ZXJuLCAiXSIpOwogICAgaWYgKHR5cGUgPT0gInsiKSByZXR1cm4gY29udENvbW1hc2VwKHByb3BwYXR0ZXJuLCAifSIpOwogIH0KICBmdW5jdGlvbiBwcm9wcGF0dGVybih0eXBlLCB2YWx1ZSkgewogICAgaWYgKHR5cGUgPT0gInZhcmlhYmxlIiAmJiAhY3guc3RyZWFtLm1hdGNoKC9eXHMqOi8sIGZhbHNlKSkgewogICAgICByZWdpc3Rlcih2YWx1ZSk7CiAgICAgIHJldHVybiBjb250KG1heWJlQXNzaWduKTsKICAgIH0KICAgIGlmICh0eXBlID09ICJ2YXJpYWJsZSIpIGN4Lm1hcmtlZCA9ICJwcm9wZXJ0eSI7CiAgICBpZiAodHlwZSA9PSAic3ByZWFkIikgcmV0dXJuIGNvbnQocGF0dGVybik7CiAgICBpZiAodHlwZSA9PSAifSIpIHJldHVybiBwYXNzKCk7CiAgICByZXR1cm4gY29udChleHBlY3QoIjoiKSwgcGF0dGVybiwgbWF5YmVBc3NpZ24pOwogIH0KICBmdW5jdGlvbiBtYXliZUFzc2lnbihfdHlwZSwgdmFsdWUpIHsKICAgIGlmICh2YWx1ZSA9PSAiPSIpIHJldHVybiBjb250KGV4cHJlc3Npb25Ob0NvbW1hKTsKICB9CiAgZnVuY3Rpb24gdmFyZGVmQ29udCh0eXBlKSB7CiAgICBpZiAodHlwZSA9PSAiLCIpIHJldHVybiBjb250KHZhcmRlZik7CiAgfQogIGZ1bmN0aW9uIG1heWJlZWxzZSh0eXBlLCB2YWx1ZSkgewogICAgaWYgKHR5cGUgPT0gImtleXdvcmQgYiIgJiYgdmFsdWUgPT0gImVsc2UiKSByZXR1cm4gY29udChwdXNobGV4KCJmb3JtIiwgImVsc2UiKSwgc3RhdGVtZW50LCBwb3BsZXgpOwogIH0KICBmdW5jdGlvbiBmb3JzcGVjKHR5cGUpIHsKICAgIGlmICh0eXBlID09ICIoIikgcmV0dXJuIGNvbnQocHVzaGxleCgiKSIpLCBmb3JzcGVjMSwgZXhwZWN0KCIpIiksIHBvcGxleCk7CiAgfQogIGZ1bmN0aW9uIGZvcnNwZWMxKHR5cGUpIHsKICAgIGlmICh0eXBlID09ICJ2YXIiKSByZXR1cm4gY29udCh2YXJkZWYsIGV4cGVjdCgiOyIpLCBmb3JzcGVjMik7CiAgICBpZiAodHlwZSA9PSAiOyIpIHJldHVybiBjb250KGZvcnNwZWMyKTsKICAgIGlmICh0eXBlID09ICJ2YXJpYWJsZSIpIHJldHVybiBjb250KGZvcm1heWJlaW5vZik7CiAgICByZXR1cm4gcGFzcyhleHByZXNzaW9uLCBleHBlY3QoIjsiKSwgZm9yc3BlYzIpOwogIH0KICBmdW5jdGlvbiBmb3JtYXliZWlub2YoX3R5cGUsIHZhbHVlKSB7CiAgICBpZiAodmFsdWUgPT0gImluIiB8fCB2YWx1ZSA9PSAib2YiKSB7IGN4Lm1hcmtlZCA9ICJrZXl3b3JkIjsgcmV0dXJuIGNvbnQoZXhwcmVzc2lvbik7IH0KICAgIHJldHVybiBjb250KG1heWJlb3BlcmF0b3JDb21tYSwgZm9yc3BlYzIpOwogIH0KICBmdW5jdGlvbiBmb3JzcGVjMih0eXBlLCB2YWx1ZSkgewogICAgaWYgKHR5cGUgPT0gIjsiKSByZXR1cm4gY29udChmb3JzcGVjMyk7CiAgICBpZiAodmFsdWUgPT0gImluIiB8fCB2YWx1ZSA9PSAib2YiKSB7IGN4Lm1hcmtlZCA9ICJrZXl3b3JkIjsgcmV0dXJuIGNvbnQoZXhwcmVzc2lvbik7IH0KICAgIHJldHVybiBwYXNzKGV4cHJlc3Npb24sIGV4cGVjdCgiOyIpLCBmb3JzcGVjMyk7CiAgfQogIGZ1bmN0aW9uIGZvcnNwZWMzKHR5cGUpIHsKICAgIGlmICh0eXBlICE9ICIpIikgY29udChleHByZXNzaW9uKTsKICB9CiAgZnVuY3Rpb24gZnVuY3Rpb25kZWYodHlwZSwgdmFsdWUpIHsKICAgIGlmICh2YWx1ZSA9PSAiKiIpIHtjeC5tYXJrZWQgPSAia2V5d29yZCI7IHJldHVybiBjb250KGZ1bmN0aW9uZGVmKTt9CiAgICBpZiAodHlwZSA9PSAidmFyaWFibGUiKSB7cmVnaXN0ZXIodmFsdWUpOyByZXR1cm4gY29udChmdW5jdGlvbmRlZik7fQogICAgaWYgKHR5cGUgPT0gIigiKSByZXR1cm4gY29udChwdXNoY29udGV4dCwgcHVzaGxleCgiKSIpLCBjb21tYXNlcChmdW5hcmcsICIpIiksIHBvcGxleCwgbWF5YmV0eXBlLCBzdGF0ZW1lbnQsIHBvcGNvbnRleHQpOwogIH0KICBmdW5jdGlvbiBmdW5hcmcodHlwZSkgewogICAgaWYgKHR5cGUgPT0gInNwcmVhZCIpIHJldHVybiBjb250KGZ1bmFyZyk7CiAgICByZXR1cm4gcGFzcyhwYXR0ZXJuLCBtYXliZXR5cGUsIG1heWJlQXNzaWduKTsKICB9CiAgZnVuY3Rpb24gY2xhc3NFeHByZXNzaW9uKHR5cGUsIHZhbHVlKSB7CiAgICAvLyBDbGFzcyBleHByZXNzaW9ucyBtYXkgaGF2ZSBhbiBvcHRpb25hbCBuYW1lLgogICAgaWYgKHR5cGUgPT0gInZhcmlhYmxlIikgcmV0dXJuIGNsYXNzTmFtZSh0eXBlLCB2YWx1ZSk7CiAgICByZXR1cm4gY2xhc3NOYW1lQWZ0ZXIodHlwZSwgdmFsdWUpOwogIH0KICBmdW5jdGlvbiBjbGFzc05hbWUodHlwZSwgdmFsdWUpIHsKICAgIGlmICh0eXBlID09ICJ2YXJpYWJsZSIpIHtyZWdpc3Rlcih2YWx1ZSk7IHJldHVybiBjb250KGNsYXNzTmFtZUFmdGVyKTt9CiAgfQogIGZ1bmN0aW9uIGNsYXNzTmFtZUFmdGVyKHR5cGUsIHZhbHVlKSB7CiAgICBpZiAodmFsdWUgPT0gImV4dGVuZHMiIHx8IHZhbHVlID09ICJpbXBsZW1lbnRzIikgcmV0dXJuIGNvbnQoaXNUUyA/IHR5cGVleHByIDogZXhwcmVzc2lvbiwgY2xhc3NOYW1lQWZ0ZXIpOwogICAgaWYgKHR5cGUgPT0gInsiKSByZXR1cm4gY29udChwdXNobGV4KCJ9IiksIGNsYXNzQm9keSwgcG9wbGV4KTsKICB9CiAgZnVuY3Rpb24gY2xhc3NCb2R5KHR5cGUsIHZhbHVlKSB7CiAgICBpZiAodHlwZSA9PSAidmFyaWFibGUiIHx8IGN4LnN0eWxlID09ICJrZXl3b3JkIikgewogICAgICBpZiAoKHZhbHVlID09ICJzdGF0aWMiIHx8IHZhbHVlID09ICJnZXQiIHx8IHZhbHVlID09ICJzZXQiIHx8CiAgICAgICAgICAgKGlzVFMgJiYgKHZhbHVlID09ICJwdWJsaWMiIHx8IHZhbHVlID09ICJwcml2YXRlIiB8fCB2YWx1ZSA9PSAicHJvdGVjdGVkIiB8fCB2YWx1ZSA9PSAicmVhZG9ubHkiIHx8IHZhbHVlID09ICJhYnN0cmFjdCIpKSkgJiYKICAgICAgICAgIGN4LnN0cmVhbS5tYXRjaCgvXlxzK1tcdyRceGExLVx1ZmZmZl0vLCBmYWxzZSkpIHsKICAgICAgICBjeC5tYXJrZWQgPSAia2V5d29yZCI7CiAgICAgICAgcmV0dXJuIGNvbnQoY2xhc3NCb2R5KTsKICAgICAgfQogICAgICBjeC5tYXJrZWQgPSAicHJvcGVydHkiOwogICAgICByZXR1cm4gY29udChpc1RTID8gY2xhc3NmaWVsZCA6IGZ1bmN0aW9uZGVmLCBjbGFzc0JvZHkpOwogICAgfQogICAgaWYgKHZhbHVlID09ICIqIikgewogICAgICBjeC5tYXJrZWQgPSAia2V5d29yZCI7CiAgICAgIHJldHVybiBjb250KGNsYXNzQm9keSk7CiAgICB9CiAgICBpZiAodHlwZSA9PSAiOyIpIHJldHVybiBjb250KGNsYXNzQm9keSk7CiAgICBpZiAodHlwZSA9PSAifSIpIHJldHVybiBjb250KCk7CiAgfQogIGZ1bmN0aW9uIGNsYXNzZmllbGQodHlwZSwgdmFsdWUpIHsKICAgIGlmICh2YWx1ZSA9PSAiPyIpIHJldHVybiBjb250KGNsYXNzZmllbGQpCiAgICBpZiAodHlwZSA9PSAiOiIpIHJldHVybiBjb250KHR5cGVleHByLCBtYXliZUFzc2lnbikKICAgIHJldHVybiBwYXNzKGZ1bmN0aW9uZGVmKQogIH0KICBmdW5jdGlvbiBhZnRlckV4cG9ydChfdHlwZSwgdmFsdWUpIHsKICAgIGlmICh2YWx1ZSA9PSAiKiIpIHsgY3gubWFya2VkID0gImtleXdvcmQiOyByZXR1cm4gY29udChtYXliZUZyb20sIGV4cGVjdCgiOyIpKTsgfQogICAgaWYgKHZhbHVlID09ICJkZWZhdWx0IikgeyBjeC5tYXJrZWQgPSAia2V5d29yZCI7IHJldHVybiBjb250KGV4cHJlc3Npb24sIGV4cGVjdCgiOyIpKTsgfQogICAgcmV0dXJuIHBhc3Moc3RhdGVtZW50KTsKICB9CiAgZnVuY3Rpb24gYWZ0ZXJJbXBvcnQodHlwZSkgewogICAgaWYgKHR5cGUgPT0gInN0cmluZyIpIHJldHVybiBjb250KCk7CiAgICByZXR1cm4gcGFzcyhpbXBvcnRTcGVjLCBtYXliZUZyb20pOwogIH0KICBmdW5jdGlvbiBpbXBvcnRTcGVjKHR5cGUsIHZhbHVlKSB7CiAgICBpZiAodHlwZSA9PSAieyIpIHJldHVybiBjb250Q29tbWFzZXAoaW1wb3J0U3BlYywgIn0iKTsKICAgIGlmICh0eXBlID09ICJ2YXJpYWJsZSIpIHJlZ2lzdGVyKHZhbHVlKTsKICAgIGlmICh2YWx1ZSA9PSAiKiIpIGN4Lm1hcmtlZCA9ICJrZXl3b3JkIjsKICAgIHJldHVybiBjb250KG1heWJlQXMpOwogIH0KICBmdW5jdGlvbiBtYXliZUFzKF90eXBlLCB2YWx1ZSkgewogICAgaWYgKHZhbHVlID09ICJhcyIpIHsgY3gubWFya2VkID0gImtleXdvcmQiOyByZXR1cm4gY29udChpbXBvcnRTcGVjKTsgfQogIH0KICBmdW5jdGlvbiBtYXliZUZyb20oX3R5cGUsIHZhbHVlKSB7CiAgICBpZiAodmFsdWUgPT0gImZyb20iKSB7IGN4Lm1hcmtlZCA9ICJrZXl3b3JkIjsgcmV0dXJuIGNvbnQoZXhwcmVzc2lvbik7IH0KICB9CiAgZnVuY3Rpb24gYXJyYXlMaXRlcmFsKHR5cGUpIHsKICAgIGlmICh0eXBlID09ICJdIikgcmV0dXJuIGNvbnQoKTsKICAgIHJldHVybiBwYXNzKGNvbW1hc2VwKGV4cHJlc3Npb25Ob0NvbW1hLCAiXSIpKTsKICB9CgogIGZ1bmN0aW9uIGlzQ29udGludWVkU3RhdGVtZW50KHN0YXRlLCB0ZXh0QWZ0ZXIpIHsKICAgIHJldHVybiBzdGF0ZS5sYXN0VHlwZSA9PSAib3BlcmF0b3IiIHx8IHN0YXRlLmxhc3RUeXBlID09ICIsIiB8fAogICAgICBpc09wZXJhdG9yQ2hhci50ZXN0KHRleHRBZnRlci5jaGFyQXQoMCkpIHx8CiAgICAgIC9bLC5dLy50ZXN0KHRleHRBZnRlci5jaGFyQXQoMCkpOwogIH0KCiAgLy8gSW50ZXJmYWNlCgogIHJldHVybiB7CiAgICBzdGFydFN0YXRlOiBmdW5jdGlvbihiYXNlY29sdW1uKSB7CiAgICAgIHZhciBzdGF0ZSA9IHsKICAgICAgICB0b2tlbml6ZTogdG9rZW5CYXNlLAogICAgICAgIGxhc3RUeXBlOiAic29mIiwKICAgICAgICBjYzogW10sCiAgICAgICAgbGV4aWNhbDogbmV3IEpTTGV4aWNhbCgoYmFzZWNvbHVtbiB8fCAwKSAtIGluZGVudFVuaXQsIDAsICJibG9jayIsIGZhbHNlKSwKICAgICAgICBsb2NhbFZhcnM6IHBhcnNlckNvbmZpZy5sb2NhbFZhcnMsCiAgICAgICAgY29udGV4dDogcGFyc2VyQ29uZmlnLmxvY2FsVmFycyAmJiB7dmFyczogcGFyc2VyQ29uZmlnLmxvY2FsVmFyc30sCiAgICAgICAgaW5kZW50ZWQ6IGJhc2Vjb2x1bW4gfHwgMAogICAgICB9OwogICAgICBpZiAocGFyc2VyQ29uZmlnLmdsb2JhbFZhcnMgJiYgdHlwZW9mIHBhcnNlckNvbmZpZy5nbG9iYWxWYXJzID09ICJvYmplY3QiKQogICAgICAgIHN0YXRlLmdsb2JhbFZhcnMgPSBwYXJzZXJDb25maWcuZ2xvYmFsVmFyczsKICAgICAgcmV0dXJuIHN0YXRlOwogICAgfSwKCiAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICBpZiAoc3RyZWFtLnNvbCgpKSB7CiAgICAgICAgaWYgKCFzdGF0ZS5sZXhpY2FsLmhhc093blByb3BlcnR5KCJhbGlnbiIpKQogICAgICAgICAgc3RhdGUubGV4aWNhbC5hbGlnbiA9IGZhbHNlOwogICAgICAgIHN0YXRlLmluZGVudGVkID0gc3RyZWFtLmluZGVudGF0aW9uKCk7CiAgICAgICAgZmluZEZhdEFycm93KHN0cmVhbSwgc3RhdGUpOwogICAgICB9CiAgICAgIGlmIChzdGF0ZS50b2tlbml6ZSAhPSB0b2tlbkNvbW1lbnQgJiYgc3RyZWFtLmVhdFNwYWNlKCkpIHJldHVybiBudWxsOwogICAgICB2YXIgc3R5bGUgPSBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgICAgaWYgKHR5cGUgPT0gImNvbW1lbnQiKSByZXR1cm4gc3R5bGU7CiAgICAgIHN0YXRlLmxhc3RUeXBlID0gdHlwZSA9PSAib3BlcmF0b3IiICYmIChjb250ZW50ID09ICIrKyIgfHwgY29udGVudCA9PSAiLS0iKSA/ICJpbmNkZWMiIDogdHlwZTsKICAgICAgcmV0dXJuIHBhcnNlSlMoc3RhdGUsIHN0eWxlLCB0eXBlLCBjb250ZW50LCBzdHJlYW0pOwogICAgfSwKCiAgICBpbmRlbnQ6IGZ1bmN0aW9uKHN0YXRlLCB0ZXh0QWZ0ZXIpIHsKICAgICAgaWYgKHN0YXRlLnRva2VuaXplID09IHRva2VuQ29tbWVudCkgcmV0dXJuIENvZGVNaXJyb3IuUGFzczsKICAgICAgaWYgKHN0YXRlLnRva2VuaXplICE9IHRva2VuQmFzZSkgcmV0dXJuIDA7CiAgICAgIHZhciBmaXJzdENoYXIgPSB0ZXh0QWZ0ZXIgJiYgdGV4dEFmdGVyLmNoYXJBdCgwKSwgbGV4aWNhbCA9IHN0YXRlLmxleGljYWwsIHRvcAogICAgICAvLyBLbHVkZ2UgdG8gcHJldmVudCAnbWF5YmVsc2UnIGZyb20gYmxvY2tpbmcgbGV4aWNhbCBzY29wZSBwb3BzCiAgICAgIGlmICghL15ccyplbHNlXGIvLnRlc3QodGV4dEFmdGVyKSkgZm9yICh2YXIgaSA9IHN0YXRlLmNjLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7CiAgICAgICAgdmFyIGMgPSBzdGF0ZS5jY1tpXTsKICAgICAgICBpZiAoYyA9PSBwb3BsZXgpIGxleGljYWwgPSBsZXhpY2FsLnByZXY7CiAgICAgICAgZWxzZSBpZiAoYyAhPSBtYXliZWVsc2UpIGJyZWFrOwogICAgICB9CiAgICAgIHdoaWxlICgobGV4aWNhbC50eXBlID09ICJzdGF0IiB8fCBsZXhpY2FsLnR5cGUgPT0gImZvcm0iKSAmJgogICAgICAgICAgICAgKGZpcnN0Q2hhciA9PSAifSIgfHwgKCh0b3AgPSBzdGF0ZS5jY1tzdGF0ZS5jYy5sZW5ndGggLSAxXSkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodG9wID09IG1heWJlb3BlcmF0b3JDb21tYSB8fCB0b3AgPT0gbWF5YmVvcGVyYXRvck5vQ29tbWEpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIS9eWyxcLj0rXC0qOj9bXChdLy50ZXN0KHRleHRBZnRlcikpKSkKICAgICAgICBsZXhpY2FsID0gbGV4aWNhbC5wcmV2OwogICAgICBpZiAoc3RhdGVtZW50SW5kZW50ICYmIGxleGljYWwudHlwZSA9PSAiKSIgJiYgbGV4aWNhbC5wcmV2LnR5cGUgPT0gInN0YXQiKQogICAgICAgIGxleGljYWwgPSBsZXhpY2FsLnByZXY7CiAgICAgIHZhciB0eXBlID0gbGV4aWNhbC50eXBlLCBjbG9zaW5nID0gZmlyc3RDaGFyID09IHR5cGU7CgogICAgICBpZiAodHlwZSA9PSAidmFyZGVmIikgcmV0dXJuIGxleGljYWwuaW5kZW50ZWQgKyAoc3RhdGUubGFzdFR5cGUgPT0gIm9wZXJhdG9yIiB8fCBzdGF0ZS5sYXN0VHlwZSA9PSAiLCIgPyBsZXhpY2FsLmluZm8gKyAxIDogMCk7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gImZvcm0iICYmIGZpcnN0Q2hhciA9PSAieyIpIHJldHVybiBsZXhpY2FsLmluZGVudGVkOwogICAgICBlbHNlIGlmICh0eXBlID09ICJmb3JtIikgcmV0dXJuIGxleGljYWwuaW5kZW50ZWQgKyBpbmRlbnRVbml0OwogICAgICBlbHNlIGlmICh0eXBlID09ICJzdGF0IikKICAgICAgICByZXR1cm4gbGV4aWNhbC5pbmRlbnRlZCArIChpc0NvbnRpbnVlZFN0YXRlbWVudChzdGF0ZSwgdGV4dEFmdGVyKSA/IHN0YXRlbWVudEluZGVudCB8fCBpbmRlbnRVbml0IDogMCk7CiAgICAgIGVsc2UgaWYgKGxleGljYWwuaW5mbyA9PSAic3dpdGNoIiAmJiAhY2xvc2luZyAmJiBwYXJzZXJDb25maWcuZG91YmxlSW5kZW50U3dpdGNoICE9IGZhbHNlKQogICAgICAgIHJldHVybiBsZXhpY2FsLmluZGVudGVkICsgKC9eKD86Y2FzZXxkZWZhdWx0KVxiLy50ZXN0KHRleHRBZnRlcikgPyBpbmRlbnRVbml0IDogMiAqIGluZGVudFVuaXQpOwogICAgICBlbHNlIGlmIChsZXhpY2FsLmFsaWduKSByZXR1cm4gbGV4aWNhbC5jb2x1bW4gKyAoY2xvc2luZyA/IDAgOiAxKTsKICAgICAgZWxzZSByZXR1cm4gbGV4aWNhbC5pbmRlbnRlZCArIChjbG9zaW5nID8gMCA6IGluZGVudFVuaXQpOwogICAgfSwKCiAgICBlbGVjdHJpY0lucHV0OiAvXlxzKig/OmNhc2UgLio/OnxkZWZhdWx0Onxce3xcfSkkLywKICAgIGJsb2NrQ29tbWVudFN0YXJ0OiBqc29uTW9kZSA/IG51bGwgOiAiLyoiLAogICAgYmxvY2tDb21tZW50RW5kOiBqc29uTW9kZSA/IG51bGwgOiAiKi8iLAogICAgbGluZUNvbW1lbnQ6IGpzb25Nb2RlID8gbnVsbCA6ICIvLyIsCiAgICBmb2xkOiAiYnJhY2UiLAogICAgY2xvc2VCcmFja2V0czogIigpW117fScnXCJcImBgIiwKCiAgICBoZWxwZXJUeXBlOiBqc29uTW9kZSA/ICJqc29uIiA6ICJqYXZhc2NyaXB0IiwKICAgIGpzb25sZE1vZGU6IGpzb25sZE1vZGUsCiAgICBqc29uTW9kZToganNvbk1vZGUsCgogICAgZXhwcmVzc2lvbkFsbG93ZWQ6IGV4cHJlc3Npb25BbGxvd2VkLAogICAgc2tpcEV4cHJlc3Npb246IGZ1bmN0aW9uKHN0YXRlKSB7CiAgICAgIHZhciB0b3AgPSBzdGF0ZS5jY1tzdGF0ZS5jYy5sZW5ndGggLSAxXQogICAgICBpZiAodG9wID09IGV4cHJlc3Npb24gfHwgdG9wID09IGV4cHJlc3Npb25Ob0NvbW1hKSBzdGF0ZS5jYy5wb3AoKQogICAgfQogIH07Cn0pOwoKQ29kZU1pcnJvci5yZWdpc3RlckhlbHBlcigid29yZENoYXJzIiwgImphdmFzY3JpcHQiLCAvW1x3JF0vKTsKCkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC9qYXZhc2NyaXB0IiwgImphdmFzY3JpcHQiKTsKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L2VjbWFzY3JpcHQiLCAiamF2YXNjcmlwdCIpOwpDb2RlTWlycm9yLmRlZmluZU1JTUUoImFwcGxpY2F0aW9uL2phdmFzY3JpcHQiLCAiamF2YXNjcmlwdCIpOwpDb2RlTWlycm9yLmRlZmluZU1JTUUoImFwcGxpY2F0aW9uL3gtamF2YXNjcmlwdCIsICJqYXZhc2NyaXB0Iik7CkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgiYXBwbGljYXRpb24vZWNtYXNjcmlwdCIsICJqYXZhc2NyaXB0Iik7CkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgiYXBwbGljYXRpb24vanNvbiIsIHtuYW1lOiAiamF2YXNjcmlwdCIsIGpzb246IHRydWV9KTsKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJhcHBsaWNhdGlvbi94LWpzb24iLCB7bmFtZTogImphdmFzY3JpcHQiLCBqc29uOiB0cnVlfSk7CkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgiYXBwbGljYXRpb24vbGQranNvbiIsIHtuYW1lOiAiamF2YXNjcmlwdCIsIGpzb25sZDogdHJ1ZX0pOwpDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQvdHlwZXNjcmlwdCIsIHsgbmFtZTogImphdmFzY3JpcHQiLCB0eXBlc2NyaXB0OiB0cnVlIH0pOwpDb2RlTWlycm9yLmRlZmluZU1JTUUoImFwcGxpY2F0aW9uL3R5cGVzY3JpcHQiLCB7IG5hbWU6ICJqYXZhc2NyaXB0IiwgdHlwZXNjcmlwdDogdHJ1ZSB9KTsKCn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/javascript/json-ld.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogSlNPTi1MRCBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uLy4uL2FkZG9uL2VkaXQvbWF0Y2hicmFja2V0cy5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi8uLi9hZGRvbi9jb21tZW50L2NvbnRpbnVlY29tbWVudC5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi8uLi9hZGRvbi9jb21tZW50L2NvbW1lbnQuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iamF2YXNjcmlwdC5qcyI+PC9zY3JpcHQ+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+LkNvZGVNaXJyb3Ige2JvcmRlci10b3A6IDFweCBzb2xpZCBibGFjazsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO308L3N0eWxlPgo8ZGl2IGlkPSJuYXYiPgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGgxPkNvZGVNaXJyb3I8L2gxPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyIvPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5MYW5ndWFnZSBtb2RlczwvYT4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+SlNPTi1MRDwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+SlNPTi1MRCBtb2RlPC9oMj4KCgo8ZGl2Pjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+CnsKICAiQGNvbnRleHQiOiB7CiAgICAibmFtZSI6ICJodHRwOi8vc2NoZW1hLm9yZy9uYW1lIiwKICAgICJkZXNjcmlwdGlvbiI6ICJodHRwOi8vc2NoZW1hLm9yZy9kZXNjcmlwdGlvbiIsCiAgICAiaW1hZ2UiOiB7CiAgICAgICJAaWQiOiAiaHR0cDovL3NjaGVtYS5vcmcvaW1hZ2UiLAogICAgICAiQHR5cGUiOiAiQGlkIgogICAgfSwKICAgICJnZW8iOiAiaHR0cDovL3NjaGVtYS5vcmcvZ2VvIiwKICAgICJsYXRpdHVkZSI6IHsKICAgICAgIkBpZCI6ICJodHRwOi8vc2NoZW1hLm9yZy9sYXRpdHVkZSIsCiAgICAgICJAdHlwZSI6ICJ4c2Q6ZmxvYXQiCiAgICB9LAogICAgImxvbmdpdHVkZSI6IHsKICAgICAgIkBpZCI6ICJodHRwOi8vc2NoZW1hLm9yZy9sb25naXR1ZGUiLAogICAgICAiQHR5cGUiOiAieHNkOmZsb2F0IgogICAgfSwKICAgICJ4c2QiOiAiaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEjIgogIH0sCiAgIm5hbWUiOiAiVGhlIEVtcGlyZSBTdGF0ZSBCdWlsZGluZyIsCiAgImRlc2NyaXB0aW9uIjogIlRoZSBFbXBpcmUgU3RhdGUgQnVpbGRpbmcgaXMgYSAxMDItc3RvcnkgbGFuZG1hcmsgaW4gTmV3IFlvcmsgQ2l0eS4iLAogICJpbWFnZSI6ICJodHRwOi8vd3d3LmNpdmlsLnVzaGVyYnJvb2tlLmNhL2NvdXJzL2djaTIxNWEvZW1waXJlLXN0YXRlLWJ1aWxkaW5nLmpwZyIsCiAgImdlbyI6IHsKICAgICJsYXRpdHVkZSI6ICI0MC43NSIsCiAgICAibG9uZ2l0dWRlIjogIjczLjk4IgogIH0KfQo8L3RleHRhcmVhPjwvZGl2PgoKICAgIDxzY3JpcHQ+CiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICAgICAgbWF0Y2hCcmFja2V0czogdHJ1ZSwKICAgICAgICBhdXRvQ2xvc2VCcmFja2V0czogdHJ1ZSwKICAgICAgICBtb2RlOiAiYXBwbGljYXRpb24vbGQranNvbiIsCiAgICAgICAgbGluZVdyYXBwaW5nOiB0cnVlCiAgICAgIH0pOwogICAgPC9zY3JpcHQ+CiAgICAKICAgIDxwPlRoaXMgaXMgYSBzcGVjaWFsaXphdGlvbiBvZiB0aGUgPGEgaHJlZj0iaW5kZXguaHRtbCI+SmF2YVNjcmlwdCBtb2RlPC9hPi48L3A+CiAgPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/javascript/test.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24oKSB7CiAgdmFyIG1vZGUgPSBDb2RlTWlycm9yLmdldE1vZGUoe2luZGVudFVuaXQ6IDJ9LCAiamF2YXNjcmlwdCIpOwogIGZ1bmN0aW9uIE1UKG5hbWUpIHsgdGVzdC5tb2RlKG5hbWUsIG1vZGUsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpOyB9CgogIE1UKCJsb2NhbHMiLAogICAgICJba2V5d29yZCBmdW5jdGlvbl0gW2RlZiBmb29dKFtkZWYgYV0sIFtkZWYgYl0pIHsgW2tleXdvcmQgdmFyXSBbZGVmIGNdIFtvcGVyYXRvciA9XSBbbnVtYmVyIDEwXTsgW2tleXdvcmQgcmV0dXJuXSBbdmFyaWFibGUtMiBhXSBbb3BlcmF0b3IgK10gW3ZhcmlhYmxlLTIgY10gW29wZXJhdG9yICtdIFt2YXJpYWJsZSBkXTsgfSIpOwoKICBNVCgiY29tbWEtYW5kLWJpbm9wIiwKICAgICAiW2tleXdvcmQgZnVuY3Rpb25dKCl7IFtrZXl3b3JkIHZhcl0gW2RlZiB4XSBbb3BlcmF0b3IgPV0gW251bWJlciAxXSBbb3BlcmF0b3IgK10gW251bWJlciAyXSwgW2RlZiB5XTsgfSIpOwoKICBNVCgiZGVzdHJ1Y3R1cmluZyIsCiAgICAgIihba2V5d29yZCBmdW5jdGlvbl0oW2RlZiBhXSwgW1tbZGVmIGJdLCBbZGVmIGNdIF1dKSB7IiwKICAgICAiICBba2V5d29yZCBsZXRdIHtbZGVmIGRdLCBbcHJvcGVydHkgZm9vXTogW2RlZiBjXVtvcGVyYXRvciA9XVtudW1iZXIgMTBdLCBbZGVmIHhdfSBbb3BlcmF0b3IgPV0gW3ZhcmlhYmxlIGZvb10oW3ZhcmlhYmxlLTIgYV0pOyIsCiAgICAgIiAgW1tbdmFyaWFibGUtMiBjXSwgW3ZhcmlhYmxlIHldIF1dIFtvcGVyYXRvciA9XSBbdmFyaWFibGUtMiBjXTsiLAogICAgICJ9KSgpOyIpOwoKICBNVCgiZGVzdHJ1Y3R1cmVfdHJhaWxpbmdfY29tbWEiLAogICAgIltrZXl3b3JkIGxldF0ge1tkZWYgYV0sIFtkZWYgYl0sfSBbb3BlcmF0b3IgPV0gW3ZhcmlhYmxlIGZvb107IiwKICAgICJba2V5d29yZCBsZXRdIFtkZWYgY107Iik7IC8vIFBhcnNlciBzdGlsbCBpbiBnb29kIHN0YXRlPwoKICBNVCgiY2xhc3NfYm9keSIsCiAgICAgIltrZXl3b3JkIGNsYXNzXSBbZGVmIEZvb10geyIsCiAgICAgIiAgW3Byb3BlcnR5IGNvbnN0cnVjdG9yXSgpIHt9IiwKICAgICAiICBbcHJvcGVydHkgc2F5TmFtZV0oKSB7IiwKICAgICAiICAgIFtrZXl3b3JkIHJldHVybl0gW3N0cmluZy0yIGBmb28ke11bdmFyaWFibGUgZm9vXVtzdHJpbmctMiB9b29gXTsiLAogICAgICIgIH0iLAogICAgICJ9Iik7CgogIE1UKCJjbGFzcyIsCiAgICAgIltrZXl3b3JkIGNsYXNzXSBbZGVmIFBvaW50XSBba2V5d29yZCBleHRlbmRzXSBbdmFyaWFibGUgU3VwZXJUaGluZ10geyIsCiAgICAgIiAgW2tleXdvcmQgZ2V0XSBbcHJvcGVydHkgcHJvcF0oKSB7IFtrZXl3b3JkIHJldHVybl0gW251bWJlciAyNF07IH0iLAogICAgICIgIFtwcm9wZXJ0eSBjb25zdHJ1Y3Rvcl0oW2RlZiB4XSwgW2RlZiB5XSkgeyIsCiAgICAgIiAgICBba2V5d29yZCBzdXBlcl0oW3N0cmluZyAnc29tZXRoaW5nJ10pOyIsCiAgICAgIiAgICBba2V5d29yZCB0aGlzXS5bcHJvcGVydHkgeF0gW29wZXJhdG9yID1dIFt2YXJpYWJsZS0yIHhdOyIsCiAgICAgIiAgfSIsCiAgICAgIn0iKTsKCiAgTVQoImFub255bW91c19jbGFzc19leHByZXNzaW9uIiwKICAgICAiW2tleXdvcmQgY29uc3RdIFtkZWYgQWRkZXJdIFtvcGVyYXRvciA9XSBba2V5d29yZCBjbGFzc10gW2tleXdvcmQgZXh0ZW5kc10gW3ZhcmlhYmxlIEFyaXRobWV0aWNdIHsiLAogICAgICIgIFtwcm9wZXJ0eSBhZGRdKFtkZWYgYV0sIFtkZWYgYl0pIHt9IiwKICAgICAifTsiKTsKCiAgTVQoIm5hbWVkX2NsYXNzX2V4cHJlc3Npb24iLAogICAgICJba2V5d29yZCBjb25zdF0gW2RlZiBTdWJiZXJdIFtvcGVyYXRvciA9XSBba2V5d29yZCBjbGFzc10gW2RlZiBTdWJ0cmFjdF0geyIsCiAgICAgIiAgW3Byb3BlcnR5IHN1Yl0oW2RlZiBhXSwgW2RlZiBiXSkge30iLAogICAgICJ9OyIpOwoKICBNVCgiaW1wb3J0IiwKICAgICAiW2tleXdvcmQgZnVuY3Rpb25dIFtkZWYgZm9vXSgpIHsiLAogICAgICIgIFtrZXl3b3JkIGltcG9ydF0gW2RlZiAkXSBba2V5d29yZCBmcm9tXSBbc3RyaW5nICdqcXVlcnknXTsiLAogICAgICIgIFtrZXl3b3JkIGltcG9ydF0geyBbZGVmIGVuY3J5cHRdLCBbZGVmIGRlY3J5cHRdIH0gW2tleXdvcmQgZnJvbV0gW3N0cmluZyAnY3J5cHRvJ107IiwKICAgICAifSIpOwoKICBNVCgiaW1wb3J0X3RyYWlsaW5nX2NvbW1hIiwKICAgICAiW2tleXdvcmQgaW1wb3J0XSB7W2RlZiBmb29dLCBbZGVmIGJhcl0sfSBba2V5d29yZCBmcm9tXSBbc3RyaW5nICdiYXonXSIpCgogIE1UKCJjb25zdCIsCiAgICAgIltrZXl3b3JkIGZ1bmN0aW9uXSBbZGVmIGZdKCkgeyIsCiAgICAgIiAgW2tleXdvcmQgY29uc3RdIFtbIFtkZWYgYV0sIFtkZWYgYl0gXV0gW29wZXJhdG9yID1dIFtbIFtudW1iZXIgMV0sIFtudW1iZXIgMl0gXV07IiwKICAgICAifSIpOwoKICBNVCgiZm9yL29mIiwKICAgICAiW2tleXdvcmQgZm9yXShba2V5d29yZCBsZXRdIFtkZWYgb2ZdIFtrZXl3b3JkIG9mXSBbdmFyaWFibGUgc29tZXRoaW5nXSkge30iKTsKCiAgTVQoImdlbmVyYXRvciIsCiAgICAgIltrZXl3b3JkIGZ1bmN0aW9uKl0gW2RlZiByZXBlYXRdKFtkZWYgbl0pIHsiLAogICAgICIgIFtrZXl3b3JkIGZvcl0oW2tleXdvcmQgdmFyXSBbZGVmIGldIFtvcGVyYXRvciA9XSBbbnVtYmVyIDBdOyBbdmFyaWFibGUtMiBpXSBbb3BlcmF0b3IgPF0gW3ZhcmlhYmxlLTIgbl07IFtvcGVyYXRvciArK11bdmFyaWFibGUtMiBpXSkiLAogICAgICIgICAgW2tleXdvcmQgeWllbGRdIFt2YXJpYWJsZS0yIGldOyIsCiAgICAgIn0iKTsKCiAgTVQoInF1b3RlZFN0cmluZ0FkZGl0aW9uIiwKICAgICAiW2tleXdvcmQgbGV0XSBbZGVmIGZdIFtvcGVyYXRvciA9XSBbdmFyaWFibGUgYV0gW29wZXJhdG9yICtdIFtzdHJpbmcgJ2ZhdGFycm93J10gW29wZXJhdG9yICtdIFt2YXJpYWJsZSBjXTsiKTsKCiAgTVQoInF1b3RlZEZhdEFycm93IiwKICAgICAiW2tleXdvcmQgbGV0XSBbZGVmIGZdIFtvcGVyYXRvciA9XSBbdmFyaWFibGUgYV0gW29wZXJhdG9yICtdIFtzdHJpbmcgJz0+J10gW29wZXJhdG9yICtdIFt2YXJpYWJsZSBjXTsiKTsKCiAgTVQoImZhdEFycm93IiwKICAgICAiW3ZhcmlhYmxlIGFycmF5XS5bcHJvcGVydHkgZmlsdGVyXShbZGVmIGFdIFtvcGVyYXRvciA9Pl0gW3ZhcmlhYmxlLTIgYV0gW29wZXJhdG9yICtdIFtudW1iZXIgMV0pOyIsCiAgICAgIlt2YXJpYWJsZSBhXTsiLCAvLyBObyBsb25nZXIgaW4gc2NvcGUKICAgICAiW2tleXdvcmQgbGV0XSBbZGVmIGZdIFtvcGVyYXRvciA9XSAoW1sgW2RlZiBhXSwgW2RlZiBiXSBdXSwgW2RlZiBjXSkgW29wZXJhdG9yID0+XSBbdmFyaWFibGUtMiBhXSBbb3BlcmF0b3IgK10gW3ZhcmlhYmxlLTIgY107IiwKICAgICAiW3ZhcmlhYmxlIGNdOyIpOwoKICBNVCgic3ByZWFkIiwKICAgICAiW2tleXdvcmQgZnVuY3Rpb25dIFtkZWYgZl0oW2RlZiBhXSwgW21ldGEgLi4uXVtkZWYgYl0pIHsiLAogICAgICIgIFt2YXJpYWJsZSBzb21ldGhpbmddKFt2YXJpYWJsZS0yIGFdLCBbbWV0YSAuLi5dW3ZhcmlhYmxlLTIgYl0pOyIsCiAgICAgIn0iKTsKCiAgTVQoInF1YXNpIiwKICAgICAiW3ZhcmlhYmxlIHJlXVtzdHJpbmctMiBgZm9mZGxha2oke11bdmFyaWFibGUgeF0gW29wZXJhdG9yICtdIChbdmFyaWFibGUgcmVdW3N0cmluZy0yIGBmb29gXSkgW29wZXJhdG9yICtdIFtudW1iZXIgMV1bc3RyaW5nLTIgfWZkc2FgXSBbb3BlcmF0b3IgK10gW251bWJlciAyXSIpOwoKICBNVCgicXVhc2lfbm9fZnVuY3Rpb24iLAogICAgICJbdmFyaWFibGUgeF0gW29wZXJhdG9yID1dIFtzdHJpbmctMiBgZm9mZGxha2oke11bdmFyaWFibGUgeF0gW29wZXJhdG9yICtdIFtzdHJpbmctMiBgZm9vYF0gW29wZXJhdG9yICtdIFtudW1iZXIgMV1bc3RyaW5nLTIgfWZkc2FgXSBbb3BlcmF0b3IgK10gW251bWJlciAyXSIpOwoKICBNVCgiaW5kZW50X3N0YXRlbWVudCIsCiAgICAgIltrZXl3b3JkIHZhcl0gW2RlZiB4XSBbb3BlcmF0b3IgPV0gW251bWJlciAxMF0iLAogICAgICJbdmFyaWFibGUgeF0gW29wZXJhdG9yICs9XSBbdmFyaWFibGUgeV0gW29wZXJhdG9yICtdIiwKICAgICAiICBbYXRvbSBJbmZpbml0eV0iLAogICAgICJba2V5d29yZCBkZWJ1Z2dlcl07Iik7CgogIE1UKCJpbmRlbnRfaWYiLAogICAgICJba2V5d29yZCBpZl0gKFtudW1iZXIgMV0pIiwKICAgICAiICBba2V5d29yZCBicmVha107IiwKICAgICAiW2tleXdvcmQgZWxzZV0gW2tleXdvcmQgaWZdIChbbnVtYmVyIDJdKSIsCiAgICAgIiAgW2tleXdvcmQgY29udGludWVdOyIsCiAgICAgIltrZXl3b3JkIGVsc2VdIiwKICAgICAiICBbbnVtYmVyIDEwXTsiLAogICAgICJba2V5d29yZCBpZl0gKFtudW1iZXIgMV0pIHsiLAogICAgICIgIFtrZXl3b3JkIGJyZWFrXTsiLAogICAgICJ9IFtrZXl3b3JkIGVsc2VdIFtrZXl3b3JkIGlmXSAoW251bWJlciAyXSkgeyIsCiAgICAgIiAgW2tleXdvcmQgY29udGludWVdOyIsCiAgICAgIn0gW2tleXdvcmQgZWxzZV0geyIsCiAgICAgIiAgW251bWJlciAxMF07IiwKICAgICAifSIpOwoKICBNVCgiaW5kZW50X2ZvciIsCiAgICAgIltrZXl3b3JkIGZvcl0gKFtrZXl3b3JkIHZhcl0gW2RlZiBpXSBbb3BlcmF0b3IgPV0gW251bWJlciAwXTsiLAogICAgICIgICAgIFt2YXJpYWJsZSBpXSBbb3BlcmF0b3IgPF0gW251bWJlciAxMDBdOyIsCiAgICAgIiAgICAgW3ZhcmlhYmxlIGldW29wZXJhdG9yICsrXSkiLAogICAgICIgIFt2YXJpYWJsZSBkb1NvbWV0aGluZ10oW3ZhcmlhYmxlIGldKTsiLAogICAgICJba2V5d29yZCBkZWJ1Z2dlcl07Iik7CgogIE1UKCJpbmRlbnRfY19zdHlsZSIsCiAgICAgIltrZXl3b3JkIGZ1bmN0aW9uXSBbZGVmIGZvb10oKSIsCiAgICAgInsiLAogICAgICIgIFtrZXl3b3JkIGRlYnVnZ2VyXTsiLAogICAgICJ9Iik7CgogIE1UKCJpbmRlbnRfZWxzZSIsCiAgICAgIltrZXl3b3JkIGZvcl0gKDs7KSIsCiAgICAgIiAgW2tleXdvcmQgaWZdIChbdmFyaWFibGUgZm9vXSkiLAogICAgICIgICAgW2tleXdvcmQgaWZdIChbdmFyaWFibGUgYmFyXSkiLAogICAgICIgICAgICBbbnVtYmVyIDFdOyIsCiAgICAgIiAgICBba2V5d29yZCBlbHNlXSIsCiAgICAgIiAgICAgIFtudW1iZXIgMl07IiwKICAgICAiICBba2V5d29yZCBlbHNlXSIsCiAgICAgIiAgICBbbnVtYmVyIDNdOyIpOwoKICBNVCgiaW5kZW50X2Z1bmFyZyIsCiAgICAgIlt2YXJpYWJsZSBmb29dKFtudW1iZXIgMTAwMDBdLCIsCiAgICAgIiAgICBba2V5d29yZCBmdW5jdGlvbl0oW2RlZiBhXSkgeyIsCiAgICAgIiAgW2tleXdvcmQgZGVidWdnZXJdOyIsCiAgICAgIn07Iik7CgogIE1UKCJpbmRlbnRfYmVsb3dfaWYiLAogICAgICJba2V5d29yZCBmb3JdICg7OykiLAogICAgICIgIFtrZXl3b3JkIGlmXSAoW3ZhcmlhYmxlIGZvb10pIiwKICAgICAiICAgIFtudW1iZXIgMV07IiwKICAgICAiW251bWJlciAyXTsiKTsKCiAgTVQoImluZGVudF9zZW1pY29sb25sZXNzX2lmIiwKICAgICAiW2tleXdvcmQgZnVuY3Rpb25dIFtkZWYgZm9vXSgpIHsiLAogICAgICIgIFtrZXl3b3JkIGlmXSAoW3ZhcmlhYmxlIHhdKSIsCiAgICAgIiAgICBbdmFyaWFibGUgZm9vXSgpIiwKICAgICAifSIpCgogIE1UKCJpbmRlbnRfc2VtaWNvbG9ubGVzc19pZl93aXRoX3N0YXRlbWVudCIsCiAgICAgIltrZXl3b3JkIGZ1bmN0aW9uXSBbZGVmIGZvb10oKSB7IiwKICAgICAiICBba2V5d29yZCBpZl0gKFt2YXJpYWJsZSB4XSkiLAogICAgICIgICAgW3ZhcmlhYmxlIGZvb10oKSIsCiAgICAgIiAgW3ZhcmlhYmxlIGJhcl0oKSIsCiAgICAgIn0iKQoKICBNVCgibXVsdGlsaW5lc3RyaW5nIiwKICAgICAiW2tleXdvcmQgdmFyXSBbZGVmIHhdIFtvcGVyYXRvciA9XSBbc3RyaW5nICdmb29cXF0iLAogICAgICJbc3RyaW5nIGJhciddOyIpOwoKICBNVCgic2NhcnlfcmVnZXhwIiwKICAgICAiW3N0cmluZy0yIC9mb29bWy9dXWJhci9dOyIpOwoKICBNVCgiaW5kZW50X3N0cmFuZ2VfYXJyYXkiLAogICAgICJba2V5d29yZCB2YXJdIFtkZWYgeF0gW29wZXJhdG9yID1dIFtbIiwKICAgICAiICBbbnVtYmVyIDFdLCwiLAogICAgICIgIFtudW1iZXIgMl0sIiwKICAgICAiXV07IiwKICAgICAiW251bWJlciAxMF07Iik7CgogIE1UKCJwYXJhbV9kZWZhdWx0IiwKICAgICAiW2tleXdvcmQgZnVuY3Rpb25dIFtkZWYgZm9vXShbZGVmIHhdIFtvcGVyYXRvciA9XSBbc3RyaW5nLTIgYGZvbyR7XVtudW1iZXIgMTBdW3N0cmluZy0yIH1iYXJgXSkgeyIsCiAgICAgIiAgW2tleXdvcmQgcmV0dXJuXSBbdmFyaWFibGUtMiB4XTsiLAogICAgICJ9Iik7CgogIE1UKCJuZXdfdGFyZ2V0IiwKICAgICAiW2tleXdvcmQgZnVuY3Rpb25dIFtkZWYgRl0oW2RlZiB0YXJnZXRdKSB7IiwKICAgICAiICBba2V5d29yZCBpZl0gKFt2YXJpYWJsZS0yIHRhcmdldF0gW29wZXJhdG9yICYmXSBba2V5d29yZCBuZXddLltrZXl3b3JkIHRhcmdldF0uW3Byb3BlcnR5IG5hbWVdKSB7IiwKICAgICAiICAgIFtrZXl3b3JkIHJldHVybl0gW2tleXdvcmQgbmV3XSIsCiAgICAgIiAgICAgIC5ba2V5d29yZCB0YXJnZXRdOyIsCiAgICAgIiAgfSIsCiAgICAgIn0iKTsKCiAgdmFyIHRzX21vZGUgPSBDb2RlTWlycm9yLmdldE1vZGUoe2luZGVudFVuaXQ6IDJ9LCAiYXBwbGljYXRpb24vdHlwZXNjcmlwdCIpCiAgZnVuY3Rpb24gVFMobmFtZSkgewogICAgdGVzdC5tb2RlKG5hbWUsIHRzX21vZGUsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpCiAgfQoKICBUUygiZXh0ZW5kX3R5cGUiLAogICAgICJba2V5d29yZCBjbGFzc10gW2RlZiBGb29dIFtrZXl3b3JkIGV4dGVuZHNdIFt2YXJpYWJsZS0zIFNvbWVdW29wZXJhdG9yIDxdW3ZhcmlhYmxlLTMgVHlwZV1bb3BlcmF0b3IgPl0ge30iKQoKICBUUygiYXJyb3dfdHlwZSIsCiAgICAgIltrZXl3b3JkIGxldF0gW2RlZiB4XTogKFt2YXJpYWJsZSBhcmddOiBbdmFyaWFibGUtMyBUeXBlXSkgW29wZXJhdG9yID0+XSBbdmFyaWFibGUtMyBSZXR1cm5UeXBlXSIpCgogIFRTKCJ0eXBlc2NyaXB0X2NsYXNzIiwKICAgICAiW2tleXdvcmQgY2xhc3NdIFtkZWYgRm9vXSB7IiwKICAgICAiICBba2V5d29yZCBwdWJsaWNdIFtrZXl3b3JkIHN0YXRpY10gW3Byb3BlcnR5IG1haW5dKCkge30iLAogICAgICIgIFtrZXl3b3JkIHByaXZhdGVdIFtwcm9wZXJ0eSBfZm9vXTogW3ZhcmlhYmxlLTMgc3RyaW5nXTsiLAogICAgICJ9IikKCiAgdmFyIGpzb25sZF9tb2RlID0gQ29kZU1pcnJvci5nZXRNb2RlKAogICAge2luZGVudFVuaXQ6IDJ9LAogICAge25hbWU6ICJqYXZhc2NyaXB0IiwganNvbmxkOiB0cnVlfQogICk7CiAgZnVuY3Rpb24gTEQobmFtZSkgewogICAgdGVzdC5tb2RlKG5hbWUsIGpzb25sZF9tb2RlLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKTsKICB9CgogIExEKCJqc29uX2xkX2tleXdvcmRzIiwKICAgICd7JywKICAgICcgIFttZXRhICJAY29udGV4dCJdOiB7JywKICAgICcgICAgW21ldGEgIkBiYXNlIl06IFtzdHJpbmcgImh0dHA6Ly9leGFtcGxlLmNvbSJdLCcsCiAgICAnICAgIFttZXRhICJAdm9jYWIiXTogW3N0cmluZyAiaHR0cDovL3htbG5zLmNvbS9mb2FmLzAuMS8iXSwnLAogICAgJyAgICBbcHJvcGVydHkgImxpa2VzRmxhdm9yIl06IHsnLAogICAgJyAgICAgIFttZXRhICJAY29udGFpbmVyIl06IFttZXRhICJAbGlzdCJdJywKICAgICcgICAgICBbbWV0YSAiQHJldmVyc2UiXTogW3N0cmluZyAiQGJlRmF2b3JpdGVPZiJdJywKICAgICcgICAgfSwnLAogICAgJyAgICBbcHJvcGVydHkgIm5pY2siXTogeyBbbWV0YSAiQGNvbnRhaW5lciJdOiBbbWV0YSAiQHNldCJdIH0sJywKICAgICcgICAgW3Byb3BlcnR5ICJuaWNrIl06IHsgW21ldGEgIkBjb250YWluZXIiXTogW21ldGEgIkBpbmRleCJdIH0nLAogICAgJyAgfSwnLAogICAgJyAgW21ldGEgIkBncmFwaCJdOiBbWyB7JywKICAgICcgICAgW21ldGEgIkBpZCJdOiBbc3RyaW5nICJodHRwOi8vZGJwZWRpYS5vcmcvcmVzb3VyY2UvSm9obl9MZW5ub24iXSwnLAogICAgJyAgICBbcHJvcGVydHkgIm5hbWUiXTogW3N0cmluZyAiSm9obiBMZW5ub24iXSwnLAogICAgJyAgICBbcHJvcGVydHkgIm1vZGlmaWVkIl06IHsnLAogICAgJyAgICAgIFttZXRhICJAdmFsdWUiXTogW3N0cmluZyAiMjAxMC0wNS0yOVQxNDoxNzozOSswMjowMCJdLCcsCiAgICAnICAgICAgW21ldGEgIkB0eXBlIl06IFtzdHJpbmcgImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hI2RhdGVUaW1lIl0nLAogICAgJyAgICB9JywKICAgICcgIH0gXV0nLAogICAgJ30nKTsKCiAgTEQoImpzb25fbGRfZmFrZSIsCiAgICAneycsCiAgICAnICBbcHJvcGVydHkgIkBmYWtlIl06IFtzdHJpbmcgIkBmYWtlIl0sJywKICAgICcgIFtwcm9wZXJ0eSAiQGNvbnRleHR1YWwiXTogW3N0cmluZyAiQGlkZW50aWZpZXIiXSwnLAogICAgJyAgW3Byb3BlcnR5ICJ1c2VyQGRvbWFpbi5jb20iXTogW3N0cmluZyAiQGdyYXBoaWNhbCJdLCcsCiAgICAnICBbcHJvcGVydHkgIkBJRCJdOiBbc3RyaW5nICJAQElEIl0nLAogICAgJ30nKTsKfSkoKTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/javascript/typescript.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogVHlwZVNjcmlwdCBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9ImphdmFzY3JpcHQuanMiPjwvc2NyaXB0Pgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPi5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazt9PC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aDE+Q29kZU1pcnJvcjwvaDE+PGltZyBpZD1sb2dvIHNyYz0iLi4vLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+TGFuZ3VhZ2UgbW9kZXM8L2E+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPlR5cGVTY3JpcHQ8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPlR5cGVTY3JpcHQgbW9kZTwvaDI+CgoKPGRpdj48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgpjbGFzcyBHcmVldGVyIHsKICBncmVldGluZzogc3RyaW5nOwogIGNvbnN0cnVjdG9yIChtZXNzYWdlOiBzdHJpbmcpIHsKICAgIHRoaXMuZ3JlZXRpbmcgPSBtZXNzYWdlOwogIH0KICBncmVldCgpIHsKICAgIHJldHVybiAiSGVsbG8sICIgKyB0aGlzLmdyZWV0aW5nOwogIH0KfSAgIAoKdmFyIGdyZWV0ZXIgPSBuZXcgR3JlZXRlcigid29ybGQiKTsKCnZhciBidXR0b24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdidXR0b24nKQpidXR0b24uaW5uZXJUZXh0ID0gIlNheSBIZWxsbyIKYnV0dG9uLm9uY2xpY2sgPSBmdW5jdGlvbigpIHsKICBhbGVydChncmVldGVyLmdyZWV0KCkpCn0KCmRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoYnV0dG9uKQoKPC90ZXh0YXJlYT48L2Rpdj4KCiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgICAgIG1hdGNoQnJhY2tldHM6IHRydWUsCiAgICAgICAgbW9kZTogInRleHQvdHlwZXNjcmlwdCIKICAgICAgfSk7CiAgICA8L3NjcmlwdD4KCiAgICA8cD5UaGlzIGlzIGEgc3BlY2lhbGl6YXRpb24gb2YgdGhlIDxhIGhyZWY9ImluZGV4Lmh0bWwiPkphdmFTY3JpcHQgbW9kZTwvYT4uPC9wPgogIDwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/jinja2/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/jinja2/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogSmluamEyIG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iamluamEyLmpzIj48L3NjcmlwdD4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4uQ29kZU1pcnJvciB7Ym9yZGVyLXRvcDogMXB4IHNvbGlkIGJsYWNrOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGgxPkNvZGVNaXJyb3I8L2gxPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5KaW5qYTI8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPkppbmphMiBtb2RlPC9oMj4KPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KeyMgdGhpcyBpcyBhIGNvbW1lbnQgI30KeyUtIGZvciBpdGVtIGluIGxpIC0lfQogICZsdDtsaSZndDt7eyBpdGVtLmxhYmVsIH19Jmx0Oy9saSZndDsKeyUgZW5kZm9yIC0lfQp7eyBpdGVtLnNhbmQgPT0gdHJ1ZSBhbmQgaXRlbS5rZXl3b3JkID09IGZhbHNlID8gMSA6IDAgfX0Ke3sgYXBwLmdldCg1NSwgMS4yLCB0cnVlKSB9fQp7JSBpZiBhcHAuZ2V0KCYjMzk7X3JvdXRlJiMzOTspID09ICgmIzM5O19ob21lJiMzOTspICV9aG9tZXslIGVuZGlmICV9CnslIGlmIGFwcC5zZXNzaW9uLmZsYXNoYmFnLmhhcygmIzM5O21lc3NhZ2UmIzM5OykgJX0KICB7JSBmb3IgbWVzc2FnZSBpbiBhcHAuc2Vzc2lvbi5mbGFzaGJhZy5nZXQoJiMzOTttZXNzYWdlJiMzOTspICV9CiAgICB7eyBtZXNzYWdlLmNvbnRlbnQgfX0KICB7JSBlbmRmb3IgJX0KeyUgZW5kaWYgJX0Ke3sgcGF0aCgmIzM5O19ob21lJiMzOTssIHsmIzM5O3NlY3Rpb24mIzM5OzogYXBwLnJlcXVlc3QuZ2V0KCYjMzk7c2VjdGlvbiYjMzk7KX0pIH19Cnt7IHBhdGgoJiMzOTtfaG9tZSYjMzk7LCB7CiAgICAmIzM5O3NlY3Rpb24mIzM5OzogYXBwLnJlcXVlc3QuZ2V0KCYjMzk7c2VjdGlvbiYjMzk7KSwKICAgICYjMzk7Ym9vbGVhbiYjMzk7OiB0cnVlLAogICAgJiMzOTtudW1iZXImIzM5OzogNTUuMzMKICB9KQp9fQp7JSBpbmNsdWRlICgmIzM5O3Rlc3QuaW5jbC5odG1sLnR3aWcmIzM5OykgJX0KPC90ZXh0YXJlYT48L2Zvcm0+CiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0KICAgICAgQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwge21vZGU6CiAgICAgICAge25hbWU6ICJqaW5qYTIiLCBodG1sTW9kZTogdHJ1ZX19KTsKICAgIDwvc2NyaXB0PgogIDwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/jinja2/jinja2.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CgogIENvZGVNaXJyb3IuZGVmaW5lTW9kZSgiamluamEyIiwgZnVuY3Rpb24oKSB7CiAgICB2YXIga2V5d29yZHMgPSBbImFuZCIsICJhcyIsICJibG9jayIsICJlbmRibG9jayIsICJieSIsICJjeWNsZSIsICJkZWJ1ZyIsICJlbHNlIiwgImVsaWYiLAogICAgICAiZXh0ZW5kcyIsICJmaWx0ZXIiLCAiZW5kZmlsdGVyIiwgImZpcnN0b2YiLCAiZm9yIiwKICAgICAgImVuZGZvciIsICJpZiIsICJlbmRpZiIsICJpZmNoYW5nZWQiLCAiZW5kaWZjaGFuZ2VkIiwKICAgICAgImlmZXF1YWwiLCAiZW5kaWZlcXVhbCIsICJpZm5vdGVxdWFsIiwKICAgICAgImVuZGlmbm90ZXF1YWwiLCAiaW4iLCAiaW5jbHVkZSIsICJsb2FkIiwgIm5vdCIsICJub3ciLCAib3IiLAogICAgICAicGFyc2VkIiwgInJlZ3JvdXAiLCAicmV2ZXJzZWQiLCAic3BhY2VsZXNzIiwKICAgICAgImVuZHNwYWNlbGVzcyIsICJzc2kiLCAidGVtcGxhdGV0YWciLCAib3BlbmJsb2NrIiwKICAgICAgImNsb3NlYmxvY2siLCAib3BlbnZhcmlhYmxlIiwgImNsb3NldmFyaWFibGUiLAogICAgICAib3BlbmJyYWNlIiwgImNsb3NlYnJhY2UiLCAib3BlbmNvbW1lbnQiLAogICAgICAiY2xvc2Vjb21tZW50IiwgIndpZHRocmF0aW8iLCAidXJsIiwgIndpdGgiLCAiZW5kd2l0aCIsCiAgICAgICJnZXRfY3VycmVudF9sYW5ndWFnZSIsICJ0cmFucyIsICJlbmR0cmFucyIsICJub29wIiwgImJsb2NrdHJhbnMiLAogICAgICAiZW5kYmxvY2t0cmFucyIsICJnZXRfYXZhaWxhYmxlX2xhbmd1YWdlcyIsCiAgICAgICJnZXRfY3VycmVudF9sYW5ndWFnZV9iaWRpIiwgInBsdXJhbCJdLAogICAgb3BlcmF0b3IgPSAvXlsrXC0qJiU9PD4hP3x+Xl0vLAogICAgc2lnbiA9IC9eWzpcW1woXHtdLywKICAgIGF0b20gPSBbInRydWUiLCAiZmFsc2UiXSwKICAgIG51bWJlciA9IC9eKFxkWytcLVwqXC9dKT9cZCsoXC5cZCspPy87CgogICAga2V5d29yZHMgPSBuZXcgUmVnRXhwKCIoKCIgKyBrZXl3b3Jkcy5qb2luKCIpfCgiKSArICIpKVxcYiIpOwogICAgYXRvbSA9IG5ldyBSZWdFeHAoIigoIiArIGF0b20uam9pbigiKXwoIikgKyAiKSlcXGIiKTsKCiAgICBmdW5jdGlvbiB0b2tlbkJhc2UgKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgdmFyIGNoID0gc3RyZWFtLnBlZWsoKTsKCiAgICAgIC8vQ29tbWVudAogICAgICBpZiAoc3RhdGUuaW5jb21tZW50KSB7CiAgICAgICAgaWYoIXN0cmVhbS5za2lwVG8oIiN9IikpIHsKICAgICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc3RyZWFtLmVhdFdoaWxlKC9cI3x9Lyk7CiAgICAgICAgICBzdGF0ZS5pbmNvbW1lbnQgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICJjb21tZW50IjsKICAgICAgLy9UYWcKICAgICAgfSBlbHNlIGlmIChzdGF0ZS5pbnRhZykgewogICAgICAgIC8vQWZ0ZXIgb3BlcmF0b3IKICAgICAgICBpZihzdGF0ZS5vcGVyYXRvcikgewogICAgICAgICAgc3RhdGUub3BlcmF0b3IgPSBmYWxzZTsKICAgICAgICAgIGlmKHN0cmVhbS5tYXRjaChhdG9tKSkgewogICAgICAgICAgICByZXR1cm4gImF0b20iOwogICAgICAgICAgfQogICAgICAgICAgaWYoc3RyZWFtLm1hdGNoKG51bWJlcikpIHsKICAgICAgICAgICAgcmV0dXJuICJudW1iZXIiOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvL0FmdGVyIHNpZ24KICAgICAgICBpZihzdGF0ZS5zaWduKSB7CiAgICAgICAgICBzdGF0ZS5zaWduID0gZmFsc2U7CiAgICAgICAgICBpZihzdHJlYW0ubWF0Y2goYXRvbSkpIHsKICAgICAgICAgICAgcmV0dXJuICJhdG9tIjsKICAgICAgICAgIH0KICAgICAgICAgIGlmKHN0cmVhbS5tYXRjaChudW1iZXIpKSB7CiAgICAgICAgICAgIHJldHVybiAibnVtYmVyIjsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmKHN0YXRlLmluc3RyaW5nKSB7CiAgICAgICAgICBpZihjaCA9PSBzdGF0ZS5pbnN0cmluZykgewogICAgICAgICAgICBzdGF0ZS5pbnN0cmluZyA9IGZhbHNlOwogICAgICAgICAgfQogICAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgICAgIHJldHVybiAic3RyaW5nIjsKICAgICAgICB9IGVsc2UgaWYoY2ggPT0gIiciIHx8IGNoID09ICciJykgewogICAgICAgICAgc3RhdGUuaW5zdHJpbmcgPSBjaDsKICAgICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgICByZXR1cm4gInN0cmluZyI7CiAgICAgICAgfSBlbHNlIGlmKHN0cmVhbS5tYXRjaChzdGF0ZS5pbnRhZyArICJ9IikgfHwgc3RyZWFtLmVhdCgiLSIpICYmIHN0cmVhbS5tYXRjaChzdGF0ZS5pbnRhZyArICJ9IikpIHsKICAgICAgICAgIHN0YXRlLmludGFnID0gZmFsc2U7CiAgICAgICAgICByZXR1cm4gInRhZyI7CiAgICAgICAgfSBlbHNlIGlmKHN0cmVhbS5tYXRjaChvcGVyYXRvcikpIHsKICAgICAgICAgIHN0YXRlLm9wZXJhdG9yID0gdHJ1ZTsKICAgICAgICAgIHJldHVybiAib3BlcmF0b3IiOwogICAgICAgIH0gZWxzZSBpZihzdHJlYW0ubWF0Y2goc2lnbikpIHsKICAgICAgICAgIHN0YXRlLnNpZ24gPSB0cnVlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZihzdHJlYW0uZWF0KCIgIikgfHwgc3RyZWFtLnNvbCgpKSB7CiAgICAgICAgICAgIGlmKHN0cmVhbS5tYXRjaChrZXl3b3JkcykpIHsKICAgICAgICAgICAgICByZXR1cm4gImtleXdvcmQiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmKHN0cmVhbS5tYXRjaChhdG9tKSkgewogICAgICAgICAgICAgIHJldHVybiAiYXRvbSI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYoc3RyZWFtLm1hdGNoKG51bWJlcikpIHsKICAgICAgICAgICAgICByZXR1cm4gIm51bWJlciI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYoc3RyZWFtLnNvbCgpKSB7CiAgICAgICAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgICAgIH0KCiAgICAgICAgfQogICAgICAgIHJldHVybiAidmFyaWFibGUiOwogICAgICB9IGVsc2UgaWYgKHN0cmVhbS5lYXQoInsiKSkgewogICAgICAgIGlmIChjaCA9IHN0cmVhbS5lYXQoIiMiKSkgewogICAgICAgICAgc3RhdGUuaW5jb21tZW50ID0gdHJ1ZTsKICAgICAgICAgIGlmKCFzdHJlYW0uc2tpcFRvKCIjfSIpKSB7CiAgICAgICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvXCN8fS8pOwogICAgICAgICAgICBzdGF0ZS5pbmNvbW1lbnQgPSBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiAiY29tbWVudCI7CiAgICAgICAgLy9PcGVuIHRhZwogICAgICAgIH0gZWxzZSBpZiAoY2ggPSBzdHJlYW0uZWF0KC9ce3wlLykpIHsKICAgICAgICAgIC8vQ2FjaGUgY2xvc2UgdGFnCiAgICAgICAgICBzdGF0ZS5pbnRhZyA9IGNoOwogICAgICAgICAgaWYoY2ggPT0gInsiKSB7CiAgICAgICAgICAgIHN0YXRlLmludGFnID0gIn0iOwogICAgICAgICAgfQogICAgICAgICAgc3RyZWFtLmVhdCgiLSIpOwogICAgICAgICAgcmV0dXJuICJ0YWciOwogICAgICAgIH0KICAgICAgfQogICAgICBzdHJlYW0ubmV4dCgpOwogICAgfTsKCiAgICByZXR1cm4gewogICAgICBzdGFydFN0YXRlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIHt0b2tlbml6ZTogdG9rZW5CYXNlfTsKICAgICAgfSwKICAgICAgdG9rZW46IGZ1bmN0aW9uIChzdHJlYW0sIHN0YXRlKSB7CiAgICAgICAgcmV0dXJuIHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgICB9CiAgICB9OwogIH0pOwp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/jsx/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/jsx/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogSlNYIG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vamF2YXNjcmlwdC9qYXZhc2NyaXB0LmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL3htbC94bWwuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0ianN4LmpzIj48L3NjcmlwdD4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4uQ29kZU1pcnJvciB7Ym9yZGVyLXRvcDogMXB4IHNvbGlkIGJsYWNrOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGgxPkNvZGVNaXJyb3I8L2gxPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5KU1g8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPkpTWCBtb2RlPC9oMj4KCjxkaXY+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4vLyBDb2RlIHNuaXBwZXRzIGZyb20gaHR0cDovL2ZhY2Vib29rLmdpdGh1Yi5pby9yZWFjdC9kb2NzL2pzeC1pbi1kZXB0aC5odG1sCgovLyBSZW5kZXJpbmcgSFRNTCB0YWdzCnZhciBteURpdkVsZW1lbnQgPSA8ZGl2IGNsYXNzTmFtZT0iZm9vIiAvPjsKUmVhY3RET00ucmVuZGVyKG15RGl2RWxlbWVudCwgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2V4YW1wbGUnKSk7CgovLyBSZW5kZXJpbmcgUmVhY3QgY29tcG9uZW50cwp2YXIgTXlDb21wb25lbnQgPSBSZWFjdC5jcmVhdGVDbGFzcyh7LyouLi4qL30pOwp2YXIgbXlFbGVtZW50ID0gPE15Q29tcG9uZW50IHNvbWVQcm9wZXJ0eT17dHJ1ZX0gLz47ClJlYWN0RE9NLnJlbmRlcihteUVsZW1lbnQsIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdleGFtcGxlJykpOwoKLy8gTmFtZXNwYWNlZCBjb21wb25lbnRzCnZhciBGb3JtID0gTXlGb3JtQ29tcG9uZW50OwoKdmFyIEFwcCA9ICgKICA8Rm9ybT4KICAgIDxGb3JtLlJvdz4KICAgICAgPEZvcm0uTGFiZWwgLz4KICAgICAgPEZvcm0uSW5wdXQgLz4KICAgIDwvRm9ybS5Sb3c+CiAgPC9Gb3JtPgopOwoKLy8gQXR0cmlidXRlIEphdmFTY3JpcHQgZXhwcmVzc2lvbnMKdmFyIHBlcnNvbiA9IDxQZXJzb24gbmFtZT17d2luZG93LmlzTG9nZ2VkSW4gPyB3aW5kb3cubmFtZSA6ICcnfSAvPjsKCi8vIEJvb2xlYW4gYXR0cmlidXRlcwo8aW5wdXQgdHlwZT0iYnV0dG9uIiBkaXNhYmxlZCAvPjsKPGlucHV0IHR5cGU9ImJ1dHRvbiIgZGlzYWJsZWQ9e3RydWV9IC8+OwoKLy8gQ2hpbGQgSmF2YVNjcmlwdCBleHByZXNzaW9ucwp2YXIgY29udGVudCA9IDxDb250YWluZXI+e3dpbmRvdy5pc0xvZ2dlZEluID8gPE5hdiAvPiA6IDxMb2dpbiAvPn08L0NvbnRhaW5lcj47CgovLyBDb21tZW50cwp2YXIgY29udGVudCA9ICgKICA8TmF2PgogICAgey8qIGNoaWxkIGNvbW1lbnQsIHB1dCB7fSBhcm91bmQgKi99CiAgICA8UGVyc29uCiAgICAgIC8qIG11bHRpCiAgICAgICAgIGxpbmUKICAgICAgICAgY29tbWVudCAqLwogICAgICBuYW1lPXt3aW5kb3cuaXNMb2dnZWRJbiA/IHdpbmRvdy5uYW1lIDogJyd9IC8vIGVuZCBvZiBsaW5lIGNvbW1lbnQKICAgIC8+CiAgPC9OYXY+Cik7CjwvdGV4dGFyZWE+PC9kaXY+Cgo8c2NyaXB0Pgp2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogIGxpbmVOdW1iZXJzOiB0cnVlLAogIG1vZGU6ICJqc3giCn0pCjwvc2NyaXB0PgoKPHA+SlNYIE1vZGUgZm9yIDxhIGhyZWY9Imh0dHA6Ly9mYWNlYm9vay5naXRodWIuaW8vcmVhY3QiPlJlYWN0PC9hPidzCkphdmFTY3JpcHQgc3ludGF4IGV4dGVuc2lvbi48L3A+Cgo8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC9qc3g8L2NvZGU+LCA8Y29kZT50ZXh0L3R5cGVzY3JpcHQtanN4PC9jb2RlPi48L3A+Cgo8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/jsx/jsx.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSwgcmVxdWlyZSgiLi4veG1sL3htbCIpLCByZXF1aXJlKCIuLi9qYXZhc2NyaXB0L2phdmFzY3JpcHQiKSkKICBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCkgLy8gQU1ECiAgICBkZWZpbmUoWyIuLi8uLi9saWIvY29kZW1pcnJvciIsICIuLi94bWwveG1sIiwgIi4uL2phdmFzY3JpcHQvamF2YXNjcmlwdCJdLCBtb2QpCiAgZWxzZSAvLyBQbGFpbiBicm93c2VyIGVudgogICAgbW9kKENvZGVNaXJyb3IpCn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCIKCiAgLy8gRGVwdGggbWVhbnMgdGhlIGFtb3VudCBvZiBvcGVuIGJyYWNlcyBpbiBKUyBjb250ZXh0LCBpbiBYTUwKICAvLyBjb250ZXh0IDAgbWVhbnMgbm90IGluIHRhZywgMSBtZWFucyBpbiB0YWcsIGFuZCAyIG1lYW5zIGluIHRhZwogIC8vIGFuZCBqcyBibG9jayBjb21tZW50LgogIGZ1bmN0aW9uIENvbnRleHQoc3RhdGUsIG1vZGUsIGRlcHRoLCBwcmV2KSB7CiAgICB0aGlzLnN0YXRlID0gc3RhdGU7IHRoaXMubW9kZSA9IG1vZGU7IHRoaXMuZGVwdGggPSBkZXB0aDsgdGhpcy5wcmV2ID0gcHJldgogIH0KCiAgZnVuY3Rpb24gY29weUNvbnRleHQoY29udGV4dCkgewogICAgcmV0dXJuIG5ldyBDb250ZXh0KENvZGVNaXJyb3IuY29weVN0YXRlKGNvbnRleHQubW9kZSwgY29udGV4dC5zdGF0ZSksCiAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5tb2RlLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZGVwdGgsCiAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5wcmV2ICYmIGNvcHlDb250ZXh0KGNvbnRleHQucHJldikpCiAgfQoKICBDb2RlTWlycm9yLmRlZmluZU1vZGUoImpzeCIsIGZ1bmN0aW9uKGNvbmZpZywgbW9kZUNvbmZpZykgewogICAgdmFyIHhtbE1vZGUgPSBDb2RlTWlycm9yLmdldE1vZGUoY29uZmlnLCB7bmFtZTogInhtbCIsIGFsbG93TWlzc2luZzogdHJ1ZSwgbXVsdGlsaW5lVGFnSW5kZW50UGFzdFRhZzogZmFsc2V9KQogICAgdmFyIGpzTW9kZSA9IENvZGVNaXJyb3IuZ2V0TW9kZShjb25maWcsIG1vZGVDb25maWcgJiYgbW9kZUNvbmZpZy5iYXNlIHx8ICJqYXZhc2NyaXB0IikKCiAgICBmdW5jdGlvbiBmbGF0WE1MSW5kZW50KHN0YXRlKSB7CiAgICAgIHZhciB0YWdOYW1lID0gc3RhdGUudGFnTmFtZQogICAgICBzdGF0ZS50YWdOYW1lID0gbnVsbAogICAgICB2YXIgcmVzdWx0ID0geG1sTW9kZS5pbmRlbnQoc3RhdGUsICIiKQogICAgICBzdGF0ZS50YWdOYW1lID0gdGFnTmFtZQogICAgICByZXR1cm4gcmVzdWx0CiAgICB9CgogICAgZnVuY3Rpb24gdG9rZW4oc3RyZWFtLCBzdGF0ZSkgewogICAgICBpZiAoc3RhdGUuY29udGV4dC5tb2RlID09IHhtbE1vZGUpCiAgICAgICAgcmV0dXJuIHhtbFRva2VuKHN0cmVhbSwgc3RhdGUsIHN0YXRlLmNvbnRleHQpCiAgICAgIGVsc2UKICAgICAgICByZXR1cm4ganNUb2tlbihzdHJlYW0sIHN0YXRlLCBzdGF0ZS5jb250ZXh0KQogICAgfQoKICAgIGZ1bmN0aW9uIHhtbFRva2VuKHN0cmVhbSwgc3RhdGUsIGN4KSB7CiAgICAgIGlmIChjeC5kZXB0aCA9PSAyKSB7IC8vIEluc2lkZSBhIEpTIC8qICovIGNvbW1lbnQKICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eLio/XCpcLy8pKSBjeC5kZXB0aCA9IDEKICAgICAgICBlbHNlIHN0cmVhbS5za2lwVG9FbmQoKQogICAgICAgIHJldHVybiAiY29tbWVudCIKICAgICAgfQoKICAgICAgaWYgKHN0cmVhbS5wZWVrKCkgPT0gInsiKSB7CiAgICAgICAgeG1sTW9kZS5za2lwQXR0cmlidXRlKGN4LnN0YXRlKQoKICAgICAgICB2YXIgaW5kZW50ID0gZmxhdFhNTEluZGVudChjeC5zdGF0ZSksIHhtbENvbnRleHQgPSBjeC5zdGF0ZS5jb250ZXh0CiAgICAgICAgLy8gSWYgSlMgc3RhcnRzIG9uIHNhbWUgbGluZSBhcyB0YWcKICAgICAgICBpZiAoeG1sQ29udGV4dCAmJiBzdHJlYW0ubWF0Y2goL15bXj5dKj5ccyokLywgZmFsc2UpKSB7CiAgICAgICAgICB3aGlsZSAoeG1sQ29udGV4dC5wcmV2ICYmICF4bWxDb250ZXh0LnN0YXJ0T2ZMaW5lKQogICAgICAgICAgICB4bWxDb250ZXh0ID0geG1sQ29udGV4dC5wcmV2CiAgICAgICAgICAvLyBJZiB0YWcgc3RhcnRzIHRoZSBsaW5lLCB1c2UgWE1MIGluZGVudGF0aW9uIGxldmVsCiAgICAgICAgICBpZiAoeG1sQ29udGV4dC5zdGFydE9mTGluZSkgaW5kZW50IC09IGNvbmZpZy5pbmRlbnRVbml0CiAgICAgICAgICAvLyBFbHNlIHVzZSBKUyBpbmRlbnRhdGlvbiBsZXZlbAogICAgICAgICAgZWxzZSBpZiAoY3gucHJldi5zdGF0ZS5sZXhpY2FsKSBpbmRlbnQgPSBjeC5wcmV2LnN0YXRlLmxleGljYWwuaW5kZW50ZWQKICAgICAgICAvLyBFbHNlIGlmIGluc2lkZSBvZiB0YWcKICAgICAgICB9IGVsc2UgaWYgKGN4LmRlcHRoID09IDEpIHsKICAgICAgICAgIGluZGVudCArPSBjb25maWcuaW5kZW50VW5pdAogICAgICAgIH0KCiAgICAgICAgc3RhdGUuY29udGV4dCA9IG5ldyBDb250ZXh0KENvZGVNaXJyb3Iuc3RhcnRTdGF0ZShqc01vZGUsIGluZGVudCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzTW9kZSwgMCwgc3RhdGUuY29udGV4dCkKICAgICAgICByZXR1cm4gbnVsbAogICAgICB9CgogICAgICBpZiAoY3guZGVwdGggPT0gMSkgeyAvLyBJbnNpZGUgb2YgdGFnCiAgICAgICAgaWYgKHN0cmVhbS5wZWVrKCkgPT0gIjwiKSB7IC8vIFRhZyBpbnNpZGUgb2YgdGFnCiAgICAgICAgICB4bWxNb2RlLnNraXBBdHRyaWJ1dGUoY3guc3RhdGUpCiAgICAgICAgICBzdGF0ZS5jb250ZXh0ID0gbmV3IENvbnRleHQoQ29kZU1pcnJvci5zdGFydFN0YXRlKHhtbE1vZGUsIGZsYXRYTUxJbmRlbnQoY3guc3RhdGUpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxNb2RlLCAwLCBzdGF0ZS5jb250ZXh0KQogICAgICAgICAgcmV0dXJuIG51bGwKICAgICAgICB9IGVsc2UgaWYgKHN0cmVhbS5tYXRjaCgiLy8iKSkgewogICAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpCiAgICAgICAgICByZXR1cm4gImNvbW1lbnQiCiAgICAgICAgfSBlbHNlIGlmIChzdHJlYW0ubWF0Y2goIi8qIikpIHsKICAgICAgICAgIGN4LmRlcHRoID0gMgogICAgICAgICAgcmV0dXJuIHRva2VuKHN0cmVhbSwgc3RhdGUpCiAgICAgICAgfQogICAgICB9CgogICAgICB2YXIgc3R5bGUgPSB4bWxNb2RlLnRva2VuKHN0cmVhbSwgY3guc3RhdGUpLCBjdXIgPSBzdHJlYW0uY3VycmVudCgpLCBzdG9wCiAgICAgIGlmICgvXGJ0YWdcYi8udGVzdChzdHlsZSkpIHsKICAgICAgICBpZiAoLz4kLy50ZXN0KGN1cikpIHsKICAgICAgICAgIGlmIChjeC5zdGF0ZS5jb250ZXh0KSBjeC5kZXB0aCA9IDAKICAgICAgICAgIGVsc2Ugc3RhdGUuY29udGV4dCA9IHN0YXRlLmNvbnRleHQucHJldgogICAgICAgIH0gZWxzZSBpZiAoL148Ly50ZXN0KGN1cikpIHsKICAgICAgICAgIGN4LmRlcHRoID0gMQogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICghc3R5bGUgJiYgKHN0b3AgPSBjdXIuaW5kZXhPZigieyIpKSA+IC0xKSB7CiAgICAgICAgc3RyZWFtLmJhY2tVcChjdXIubGVuZ3RoIC0gc3RvcCkKICAgICAgfQogICAgICByZXR1cm4gc3R5bGUKICAgIH0KCiAgICBmdW5jdGlvbiBqc1Rva2VuKHN0cmVhbSwgc3RhdGUsIGN4KSB7CiAgICAgIGlmIChzdHJlYW0ucGVlaygpID09ICI8IiAmJiBqc01vZGUuZXhwcmVzc2lvbkFsbG93ZWQoc3RyZWFtLCBjeC5zdGF0ZSkpIHsKICAgICAgICBqc01vZGUuc2tpcEV4cHJlc3Npb24oY3guc3RhdGUpCiAgICAgICAgc3RhdGUuY29udGV4dCA9IG5ldyBDb250ZXh0KENvZGVNaXJyb3Iuc3RhcnRTdGF0ZSh4bWxNb2RlLCBqc01vZGUuaW5kZW50KGN4LnN0YXRlLCAiIikpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bWxNb2RlLCAwLCBzdGF0ZS5jb250ZXh0KQogICAgICAgIHJldHVybiBudWxsCiAgICAgIH0KCiAgICAgIHZhciBzdHlsZSA9IGpzTW9kZS50b2tlbihzdHJlYW0sIGN4LnN0YXRlKQogICAgICBpZiAoIXN0eWxlICYmIGN4LmRlcHRoICE9IG51bGwpIHsKICAgICAgICB2YXIgY3VyID0gc3RyZWFtLmN1cnJlbnQoKQogICAgICAgIGlmIChjdXIgPT0gInsiKSB7CiAgICAgICAgICBjeC5kZXB0aCsrCiAgICAgICAgfSBlbHNlIGlmIChjdXIgPT0gIn0iKSB7CiAgICAgICAgICBpZiAoLS1jeC5kZXB0aCA9PSAwKSBzdGF0ZS5jb250ZXh0ID0gc3RhdGUuY29udGV4dC5wcmV2CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBzdHlsZQogICAgfQoKICAgIHJldHVybiB7CiAgICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB7Y29udGV4dDogbmV3IENvbnRleHQoQ29kZU1pcnJvci5zdGFydFN0YXRlKGpzTW9kZSksIGpzTW9kZSl9CiAgICAgIH0sCgogICAgICBjb3B5U3RhdGU6IGZ1bmN0aW9uKHN0YXRlKSB7CiAgICAgICAgcmV0dXJuIHtjb250ZXh0OiBjb3B5Q29udGV4dChzdGF0ZS5jb250ZXh0KX0KICAgICAgfSwKCiAgICAgIHRva2VuOiB0b2tlbiwKCiAgICAgIGluZGVudDogZnVuY3Rpb24oc3RhdGUsIHRleHRBZnRlciwgZnVsbExpbmUpIHsKICAgICAgICByZXR1cm4gc3RhdGUuY29udGV4dC5tb2RlLmluZGVudChzdGF0ZS5jb250ZXh0LnN0YXRlLCB0ZXh0QWZ0ZXIsIGZ1bGxMaW5lKQogICAgICB9LAoKICAgICAgaW5uZXJNb2RlOiBmdW5jdGlvbihzdGF0ZSkgewogICAgICAgIHJldHVybiBzdGF0ZS5jb250ZXh0CiAgICAgIH0KICAgIH0KICB9LCAieG1sIiwgImphdmFzY3JpcHQiKQoKICBDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQvanN4IiwgImpzeCIpCiAgQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3R5cGVzY3JpcHQtanN4Iiwge25hbWU6ICJqc3giLCBiYXNlOiB7bmFtZTogImphdmFzY3JpcHQiLCB0eXBlc2NyaXB0OiB0cnVlfX0pCn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/jsx/test.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24oKSB7CiAgdmFyIG1vZGUgPSBDb2RlTWlycm9yLmdldE1vZGUoe2luZGVudFVuaXQ6IDJ9LCAianN4IikKICBmdW5jdGlvbiBNVChuYW1lKSB7IHRlc3QubW9kZShuYW1lLCBtb2RlLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKSB9CgogIE1UKCJzZWxmY2xvc2UiLAogICAgICJba2V5d29yZCB2YXJdIFtkZWYgeF0gW29wZXJhdG9yID1dIFticmFja2V0JnRhZyA8XSBbdGFnIGZvb10gW2JyYWNrZXQmdGFnIC8+XSBbb3BlcmF0b3IgK10gW251bWJlciAxXTsiKQoKICBNVCgib3BlbmNsb3NlIiwKICAgICAiKFticmFja2V0JnRhZyA8XVt0YWcgZm9vXVticmFja2V0JnRhZyA+XWhlbGxvIFthdG9tICZhbXA7XVticmFja2V0JnRhZyA8L11bdGFnIGZvb11bYnJhY2tldCZ0YWcgPl1bb3BlcmF0b3IgKytdKSIpCgogIE1UKCJhdHRyIiwKICAgICAiKFticmFja2V0JnRhZyA8XVt0YWcgZm9vXSBbYXR0cmlidXRlIGFiY109W3N0cmluZyAndmFsdWUnXVticmFja2V0JnRhZyA+XWhlbGxvIFthdG9tICZhbXA7XVticmFja2V0JnRhZyA8L11bdGFnIGZvb11bYnJhY2tldCZ0YWcgPl1bb3BlcmF0b3IgKytdKSIpCgogIE1UKCJicmFjZWRfYXR0ciIsCiAgICAgIihbYnJhY2tldCZ0YWcgPF1bdGFnIGZvb10gW2F0dHJpYnV0ZSBhYmNdPXtbbnVtYmVyIDEwXX1bYnJhY2tldCZ0YWcgPl1oZWxsbyBbYXRvbSAmYW1wO11bYnJhY2tldCZ0YWcgPC9dW3RhZyBmb29dW2JyYWNrZXQmdGFnID5dW29wZXJhdG9yICsrXSkiKQoKICBNVCgiYnJhY2VkX3RleHQiLAogICAgICIoW2JyYWNrZXQmdGFnIDxdW3RhZyBmb29dW2JyYWNrZXQmdGFnID5daGVsbG8ge1tudW1iZXIgMTBdfSBbYXRvbSAmYW1wO11bYnJhY2tldCZ0YWcgPC9dW3RhZyBmb29dW2JyYWNrZXQmdGFnID5dW29wZXJhdG9yICsrXSkiKQoKICBNVCgibmVzdGVkX3RhZyIsCiAgICAgIihbYnJhY2tldCZ0YWcgPF1bdGFnIGZvb11bYnJhY2tldCZ0YWcgPjxdW3RhZyBiYXJdW2JyYWNrZXQmdGFnID48L11bdGFnIGJhcl1bYnJhY2tldCZ0YWcgPjwvXVt0YWcgZm9vXVticmFja2V0JnRhZyA+XVtvcGVyYXRvciArK10pIikKCiAgTVQoIm5lc3RlZF9qc3giLAogICAgICJba2V5d29yZCByZXR1cm5dICgiLAogICAgICIgIFticmFja2V0JnRhZyA8XVt0YWcgZm9vXVticmFja2V0JnRhZyA+XSIsCiAgICAgIiAgICBzYXkge1tudW1iZXIgMV0gW29wZXJhdG9yICtdIFticmFja2V0JnRhZyA8XVt0YWcgYmFyXSBbYXR0cmlidXRlIGF0dHJdPXtbbnVtYmVyIDEwXX1bYnJhY2tldCZ0YWcgLz5dfSEiLAogICAgICIgIFticmFja2V0JnRhZyA8L11bdGFnIGZvb11bYnJhY2tldCZ0YWcgPl1bb3BlcmF0b3IgKytdIiwKICAgICAiKSIpCgogIE1UKCJwcmVzZXJ2ZV9qc19jb250ZXh0IiwKICAgICAiW3ZhcmlhYmxlIHhdIFtvcGVyYXRvciA9XSBbc3RyaW5nLTIgYHF1YXNpJHtdW2JyYWNrZXQmdGFnIDxdW3RhZyBmb29dW2JyYWNrZXQmdGFnIC8+XVtzdHJpbmctMiB9cXVvdGVkYF0iKQoKICBNVCgibGluZV9jb21tZW50IiwKICAgICAiKFticmFja2V0JnRhZyA8XVt0YWcgZm9vXSBbY29tbWVudCAvLyBoZWxsb10iLAogICAgICIgICBbYnJhY2tldCZ0YWcgPjwvXVt0YWcgZm9vXVticmFja2V0JnRhZyA+XVtvcGVyYXRvciArK10pIikKCiAgTVQoImxpbmVfY29tbWVudF9ub3RfaW5fdGFnIiwKICAgICAiKFticmFja2V0JnRhZyA8XVt0YWcgZm9vXVticmFja2V0JnRhZyA+XSAvLyBoZWxsbyIsCiAgICAgIiAgW2JyYWNrZXQmdGFnIDwvXVt0YWcgZm9vXVticmFja2V0JnRhZyA+XVtvcGVyYXRvciArK10pIikKCiAgTVQoImJsb2NrX2NvbW1lbnQiLAogICAgICIoW2JyYWNrZXQmdGFnIDxdW3RhZyBmb29dIFtjb21tZW50IC8qIGhlbGxvXSIsCiAgICAgIltjb21tZW50ICAgIGxpbmUgMl0iLAogICAgICJbY29tbWVudCAgICBsaW5lIDMgKi9dIFticmFja2V0JnRhZyA+PC9dW3RhZyBmb29dW2JyYWNrZXQmdGFnID5dW29wZXJhdG9yICsrXSkiKQoKICBNVCgiYmxvY2tfY29tbWVudF9ub3RfaW5fdGFnIiwKICAgICAiKFticmFja2V0JnRhZyA8XVt0YWcgZm9vXVticmFja2V0JnRhZyA+XS8qIGhlbGxvIiwKICAgICAiICAgIGxpbmUgMiIsCiAgICAgIiAgICBsaW5lIDMgKi8gW2JyYWNrZXQmdGFnIDwvXVt0YWcgZm9vXVticmFja2V0JnRhZyA+XVtvcGVyYXRvciArK10pIikKCiAgTVQoIm1pc3NpbmdfYXR0ciIsCiAgICAgIihbYnJhY2tldCZ0YWcgPF1bdGFnIGZvb10gW2F0dHJpYnV0ZSBzZWxlY3RlZF1bYnJhY2tldCZ0YWcgLz5dW29wZXJhdG9yICsrXSkiKQoKICBNVCgiaW5kZW50X2pzIiwKICAgICAiKFticmFja2V0JnRhZyA8XVt0YWcgZm9vXVticmFja2V0JnRhZyA+XSIsCiAgICAgIiAgICBbYnJhY2tldCZ0YWcgPF1bdGFnIGJhcl0gW2F0dHJpYnV0ZSBiYXpdPXtba2V5d29yZCBmdW5jdGlvbl0oKSB7IiwKICAgICAiICAgICAgICBba2V5d29yZCByZXR1cm5dIFtudW1iZXIgMTBdIiwKICAgICAiICAgICAgfX1bYnJhY2tldCZ0YWcgLz5dIiwKICAgICAiICBbYnJhY2tldCZ0YWcgPC9dW3RhZyBmb29dW2JyYWNrZXQmdGFnID5dKSIpCgogIE1UKCJzcHJlYWQiLAogICAgICIoW2JyYWNrZXQmdGFnIDxdW3RhZyBmb29dIFthdHRyaWJ1dGUgYmFyXT17W21ldGEgLi4uXVt2YXJpYWJsZSBiYXpdIFtvcGVyYXRvciAvXVtudW1iZXIgMl19W2JyYWNrZXQmdGFnIC8+XSkiKQoKICBNVCgidGFnX2F0dHJpYnV0ZSIsCiAgICAgIihbYnJhY2tldCZ0YWcgPF1bdGFnIGZvb10gW2F0dHJpYnV0ZSBiYXJdPVticmFja2V0JnRhZyA8XVt0YWcgZm9vXVticmFja2V0JnRhZyAvPi8+XVtvcGVyYXRvciArK10pIikKfSkoKQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/julia/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/julia/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogSnVsaWEgbW9kZTwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uLy4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxzY3JpcHQgc3JjPSIuLi8uLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJqdWxpYS5qcyI+PC9zY3JpcHQ+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+LkNvZGVNaXJyb3Ige2JvcmRlci10b3A6IDFweCBzb2xpZCBibGFjazsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO308L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxoMT5Db2RlTWlycm9yPC9oMT48aW1nIGlkPWxvZ28gc3JjPSIuLi8uLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5MYW5ndWFnZSBtb2RlczwvYT4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+SnVsaWE8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPkp1bGlhIG1vZGU8L2gyPgoKICAgIDxkaXY+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KI251bWJlcnMKMTIzNAoxMjM0aW0KLjIzNAouMjM0aW0KMi4yM2ltCjIuM2YzCjIzZTIKMHgyMzQKCiNzdHJpbmdzCidhJwoiYXNkZiIKciJyZWdleCIKYiJieXRlc3RyaW5nIgoKIiIiCm11bHRpbGluZSBzdHJpbmcKIiIiCgojaWRlbnRpZmllcnMKYQphczEyMwpmdW5jdGlvbl9uYW1lIQoKI3VuaWNvZGUgaWRlbnRpZmllcnMKIyBhID0geFxkZG90CmHig5cgPSB4zIgKIyBhID0gdlxkb3QKYeKDlyA9IHbMhwojRlx2ZWMgPSBtIFxjZG90cCBhXHZlYwpG4oOXID0gbcK3YeKDlwoKI2xpdGVyYWwgaWRlbnRpZmllciBtdWx0aXBsZXMKM3gKNFsxLCAyLCAzXQoKI2RpY3RzIGFuZCBpbmRleGluZwp4PVsxLCAyLCAzXQp4W2VuZC0xXQp4PXsianVsaWEiPT4ibGFuZ3VhZ2Ugb2YgdGVjaG5pY2FsIGNvbXB1dGluZyJ9CgoKI2V4Y2VwdGlvbiBoYW5kbGluZwp0cnkKICBmKCkKY2F0Y2gKICBAcHJpbnRmICJFcnJvciIKZmluYWxseQogIGcoKQplbmQKCiN0eXBlcwppbW11dGFibGUgQ29sb3J7VDw6TnVtYmVyfQogIHI6OlQKICBnOjpUCiAgYjo6VAplbmQKCiNmdW5jdGlvbnMKZnVuY3Rpb24gY2hhbmdlISh4OjpWZWN0b3J7RmxvYXQ2NH0pCiAgZm9yIGkgPSAxOmxlbmd0aCh4KQogICAgeFtpXSAqPSAyCiAgZW5kCmVuZAoKI2Z1bmN0aW9uIGludm9jYXRpb24KZignYicsICgyLCAzKS4uLikKCiNvcGVyYXRvcnMKfD0KJj0KXj0KXC0KJT0KKj0KKz0KLT0KPD0KPj0KIT0KPT0KJQoqCisKLQo8Cj4KIQo9CnwKJgpeClwKPwp+CjoKJAo8OgouPAouPgo8PAo8PD0KPj4KPj4+Pgo+Pj0KPj4+PQo8PD0KPDw8PQouPD0KLj49Ci49PQotPgovLwppbgouLi4KLy8KOj0KLi8vPQouKj0KLi89Ci5ePQouJT0KLis9Ci4tPQpcPQpcXD0KfHwKPT09CiYmCnw9Ci58PQo8Ogo+Ogp8Pgo8fAo6Ogp4ID8geSA6IHoKCiNtYWNyb3MKQHNwYXduYXQgMiAxKzEKQGV2YWwoOngpCgoja2V5d29yZHMgYW5kIG9wZXJhdG9ycwppZiBlbHNlIGVsc2VpZiB3aGlsZSBmb3IKIGJlZ2luIGxldCBlbmQgZG8KdHJ5IGNhdGNoIGZpbmFsbHkgcmV0dXJuIGJyZWFrIGNvbnRpbnVlCmdsb2JhbCBsb2NhbCBjb25zdCAKZXhwb3J0IGltcG9ydCBpbXBvcnRhbGwgdXNpbmcKZnVuY3Rpb24gbWFjcm8gbW9kdWxlIGJhcmVtb2R1bGUgCnR5cGUgaW1tdXRhYmxlIHF1b3RlCnRydWUgZmFsc2UgZW51bWVyYXRlCgoKICAgIDwvdGV4dGFyZWE+PC9kaXY+CiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgICAgIG1vZGU6IHtuYW1lOiAianVsaWEiLAogICAgICAgICAgICAgICB9LAogICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgICAgIGluZGVudFVuaXQ6IDQsCiAgICAgICAgbWF0Y2hCcmFja2V0czogdHJ1ZQogICAgICB9KTsKICAgIDwvc2NyaXB0PgoKICAgIDxwPjxzdHJvbmc+TUlNRSB0eXBlcyBkZWZpbmVkOjwvc3Ryb25nPiA8Y29kZT50ZXh0L3gtanVsaWE8L2NvZGU+LjwvcD4KPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/julia/julia.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJqdWxpYSIsIGZ1bmN0aW9uKF9jb25mLCBwYXJzZXJDb25mKSB7CiAgdmFyIEVSUk9SQ0xBU1MgPSAnZXJyb3InOwoKICBmdW5jdGlvbiB3b3JkUmVnZXhwKHdvcmRzLCBlbmQpIHsKICAgIGlmICh0eXBlb2YgZW5kID09PSAndW5kZWZpbmVkJykgeyBlbmQgPSAiXFxiIjsgfQogICAgcmV0dXJuIG5ldyBSZWdFeHAoIl4oKCIgKyB3b3Jkcy5qb2luKCIpfCgiKSArICIpKSIgKyBlbmQpOwogIH0KCiAgdmFyIG9jdENoYXIgPSAiXFxcXFswLTddezEsM30iOwogIHZhciBoZXhDaGFyID0gIlxcXFx4W0EtRmEtZjAtOV17MSwyfSI7CiAgdmFyIHNwZWNpYWxDaGFyID0gIlxcXFxbYWJmbnJ0djAlPydcIlxcXFxdIjsKICB2YXIgc2luZ2xlQ2hhciA9ICIoW15cXHUwMDI3XFx1MDA1Q1xcdUQ4MDAtXFx1REZGRl18W1xcdUQ4MDAtXFx1REZGRl1bXFx1REMwMC1cXHVERkZGXSkiOwogIHZhciBvcGVyYXRvcnMgPSBwYXJzZXJDb25mLm9wZXJhdG9ycyB8fCAvXlwuP1t8Jl5cXCUqK1wtPD4hPVwvXT0/fFw/fH58OnxcJHxcLls8Pl18PDw9P3w+Pj4/PT98XC5bPD49XT18LT4/fFwvXC98XGJpblxiKD8hXCgpfFtcdTIyMDhcdTIyMDldKD8hXCgpLzsKICB2YXIgZGVsaW1pdGVycyA9IHBhcnNlckNvbmYuZGVsaW1pdGVycyB8fCAvXls7LCgpW1xde31dLzsKICB2YXIgaWRlbnRpZmllcnMgPSBwYXJzZXJDb25mLmlkZW50aWZpZXJzIHx8IC9eW19BLVphLXpcdTAwQTEtXHVGRkZGXVtcd1x1MDBBMS1cdUZGRkZdKiEqLzsKICB2YXIgY2hhcnNMaXN0ID0gW29jdENoYXIsIGhleENoYXIsIHNwZWNpYWxDaGFyLCBzaW5nbGVDaGFyXTsKICB2YXIgYmxvY2tPcGVuZXJzID0gWyJiZWdpbiIsICJmdW5jdGlvbiIsICJ0eXBlIiwgImltbXV0YWJsZSIsICJsZXQiLCAibWFjcm8iLCAiZm9yIiwgIndoaWxlIiwgInF1b3RlIiwgImlmIiwgImVsc2UiLCAiZWxzZWlmIiwgInRyeSIsICJmaW5hbGx5IiwgImNhdGNoIiwgImRvIl07CiAgdmFyIGJsb2NrQ2xvc2VycyA9IFsiZW5kIiwgImVsc2UiLCAiZWxzZWlmIiwgImNhdGNoIiwgImZpbmFsbHkiXTsKICB2YXIga2V5d29yZExpc3QgPSBbJ2lmJywgJ2Vsc2UnLCAnZWxzZWlmJywgJ3doaWxlJywgJ2ZvcicsICdiZWdpbicsICdsZXQnLCAnZW5kJywgJ2RvJywgJ3RyeScsICdjYXRjaCcsICdmaW5hbGx5JywgJ3JldHVybicsICdicmVhaycsICdjb250aW51ZScsICdnbG9iYWwnLCAnbG9jYWwnLCAnY29uc3QnLCAnZXhwb3J0JywgJ2ltcG9ydCcsICdpbXBvcnRhbGwnLCAndXNpbmcnLCAnZnVuY3Rpb24nLCAnbWFjcm8nLCAnbW9kdWxlJywgJ2JhcmVtb2R1bGUnLCAndHlwZScsICdpbW11dGFibGUnLCAncXVvdGUnLCAndHlwZWFsaWFzJywgJ2Fic3RyYWN0JywgJ2JpdHN0eXBlJ107CiAgdmFyIGJ1aWx0aW5MaXN0ID0gWyd0cnVlJywgJ2ZhbHNlJywgJ25vdGhpbmcnLCAnTmFOJywgJ0luZiddOwoKICAvL3ZhciBzdHJpbmdQcmVmaXhlcyA9IG5ldyBSZWdFeHAoIl5bYnJdPygnfFwiKSIpCiAgdmFyIHN0cmluZ1ByZWZpeGVzID0gL14oYHwiezN9fChbYnJ2XT8iKSkvOwogIHZhciBjaGFycyA9IHdvcmRSZWdleHAoY2hhcnNMaXN0LCAiJyIpOwogIHZhciBrZXl3b3JkcyA9IHdvcmRSZWdleHAoa2V5d29yZExpc3QpOwogIHZhciBidWlsdGlucyA9IHdvcmRSZWdleHAoYnVpbHRpbkxpc3QpOwogIHZhciBvcGVuZXJzID0gd29yZFJlZ2V4cChibG9ja09wZW5lcnMpOwogIHZhciBjbG9zZXJzID0gd29yZFJlZ2V4cChibG9ja0Nsb3NlcnMpOwogIHZhciBtYWNybyA9IC9eQFtfQS1aYS16XVtcd10qLzsKICB2YXIgc3ltYm9sID0gL146W19BLVphLXpcdTAwQTEtXHVGRkZGXVtcd1x1MDBBMS1cdUZGRkZdKiEqLzsKICB2YXIgdHlwZUFubm90YXRpb24gPSAvXjo6W14sOyJ7KCk9JFxzXSsoe1tefV0qfSspKi87CgogIGZ1bmN0aW9uIGluQXJyYXkoc3RhdGUpIHsKICAgIHZhciBjaCA9IGN1cnJlbnRTY29wZShzdGF0ZSk7CiAgICBpZiAoY2ggPT0gJ1snKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgcmV0dXJuIGZhbHNlOwogIH0KCiAgZnVuY3Rpb24gY3VycmVudFNjb3BlKHN0YXRlKSB7CiAgICBpZiAoc3RhdGUuc2NvcGVzLmxlbmd0aCA9PSAwKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgcmV0dXJuIHN0YXRlLnNjb3Blc1tzdGF0ZS5zY29wZXMubGVuZ3RoIC0gMV07CiAgfQoKICAvLyB0b2tlbml6ZXJzCiAgZnVuY3Rpb24gdG9rZW5CYXNlKHN0cmVhbSwgc3RhdGUpIHsKICAgIC8vIEhhbmRsZSBtdWx0aWxpbmUgY29tbWVudHMKICAgIGlmIChzdHJlYW0ubWF0Y2goL14jPS8sIGZhbHNlKSkgewogICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQ29tbWVudDsKICAgICAgcmV0dXJuIHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgfQoKICAgIC8vIEhhbmRsZSBzY29wZSBjaGFuZ2VzCiAgICB2YXIgbGVhdmluZ0V4cHIgPSBzdGF0ZS5sZWF2aW5nRXhwcjsKICAgIGlmIChzdHJlYW0uc29sKCkpIHsKICAgICAgbGVhdmluZ0V4cHIgPSBmYWxzZTsKICAgIH0KICAgIHN0YXRlLmxlYXZpbmdFeHByID0gZmFsc2U7CiAgICBpZiAobGVhdmluZ0V4cHIpIHsKICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXicrLykpIHsKICAgICAgICByZXR1cm4gJ29wZXJhdG9yJzsKICAgICAgfQogICAgfQoKICAgIGlmIChzdHJlYW0ubWF0Y2goL15cLnsyLDN9LykpIHsKICAgICAgcmV0dXJuICdvcGVyYXRvcic7CiAgICB9CgogICAgaWYgKHN0cmVhbS5lYXRTcGFjZSgpKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIHZhciBjaCA9IHN0cmVhbS5wZWVrKCk7CgogICAgLy8gSGFuZGxlIHNpbmdsZSBsaW5lIGNvbW1lbnRzCiAgICBpZiAoY2ggPT09ICcjJykgewogICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICAgIHJldHVybiAnY29tbWVudCc7CiAgICB9CgogICAgaWYgKGNoID09PSAnWycpIHsKICAgICAgc3RhdGUuc2NvcGVzLnB1c2goJ1snKTsKICAgIH0KCiAgICBpZiAoY2ggPT09ICcoJykgewogICAgICBzdGF0ZS5zY29wZXMucHVzaCgnKCcpOwogICAgfQoKICAgIHZhciBzY29wZSA9IGN1cnJlbnRTY29wZShzdGF0ZSk7CgogICAgaWYgKHNjb3BlID09ICdbJyAmJiBjaCA9PT0gJ10nKSB7CiAgICAgIHN0YXRlLnNjb3Blcy5wb3AoKTsKICAgICAgc3RhdGUubGVhdmluZ0V4cHIgPSB0cnVlOwogICAgfQoKICAgIGlmIChzY29wZSA9PSAnKCcgJiYgY2ggPT09ICcpJykgewogICAgICBzdGF0ZS5zY29wZXMucG9wKCk7CiAgICAgIHN0YXRlLmxlYXZpbmdFeHByID0gdHJ1ZTsKICAgIH0KCiAgICB2YXIgbWF0Y2g7CiAgICBpZiAoIWluQXJyYXkoc3RhdGUpICYmIChtYXRjaD1zdHJlYW0ubWF0Y2gob3BlbmVycywgZmFsc2UpKSkgewogICAgICBzdGF0ZS5zY29wZXMucHVzaChtYXRjaCk7CiAgICB9CgogICAgaWYgKCFpbkFycmF5KHN0YXRlKSAmJiBzdHJlYW0ubWF0Y2goY2xvc2VycywgZmFsc2UpKSB7CiAgICAgIHN0YXRlLnNjb3Blcy5wb3AoKTsKICAgIH0KCiAgICBpZiAoaW5BcnJheShzdGF0ZSkpIHsKICAgICAgaWYgKHN0YXRlLmxhc3RUb2tlbiA9PSAnZW5kJyAmJiBzdHJlYW0ubWF0Y2goL146LykpIHsKICAgICAgICByZXR1cm4gJ29wZXJhdG9yJzsKICAgICAgfQogICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eZW5kLykpIHsKICAgICAgICByZXR1cm4gJ251bWJlcic7CiAgICAgIH0KICAgIH0KCiAgICBpZiAoc3RyZWFtLm1hdGNoKC9ePT4vKSkgewogICAgICByZXR1cm4gJ29wZXJhdG9yJzsKICAgIH0KCiAgICAvLyBIYW5kbGUgTnVtYmVyIExpdGVyYWxzCiAgICBpZiAoc3RyZWFtLm1hdGNoKC9eWzAtOVwuXS8sIGZhbHNlKSkgewogICAgICB2YXIgaW1NYXRjaGVyID0gUmVnRXhwKC9eaW1cYi8pOwogICAgICB2YXIgbnVtYmVyTGl0ZXJhbCA9IGZhbHNlOwogICAgICAvLyBGbG9hdHMKICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXlxkKlwuKD8hXC4pXGQqKFtFZWZdW1wrXC1dP1xkKyk/L2kpKSB7IG51bWJlckxpdGVyYWwgPSB0cnVlOyB9CiAgICAgIGlmIChzdHJlYW0ubWF0Y2goL15cZCtcLig/IVwuKVxkKi8pKSB7IG51bWJlckxpdGVyYWwgPSB0cnVlOyB9CiAgICAgIGlmIChzdHJlYW0ubWF0Y2goL15cLlxkKy8pKSB7IG51bWJlckxpdGVyYWwgPSB0cnVlOyB9CiAgICAgIGlmIChzdHJlYW0ubWF0Y2goL14weFwuWzAtOWEtZl0rcFtcK1wtXT9cZCsvaSkpIHsgbnVtYmVyTGl0ZXJhbCA9IHRydWU7IH0KICAgICAgLy8gSW50ZWdlcnMKICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXjB4WzAtOWEtZl0rL2kpKSB7IG51bWJlckxpdGVyYWwgPSB0cnVlOyB9IC8vIEhleAogICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eMGJbMDFdKy9pKSkgeyBudW1iZXJMaXRlcmFsID0gdHJ1ZTsgfSAvLyBCaW5hcnkKICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXjBvWzAtN10rL2kpKSB7IG51bWJlckxpdGVyYWwgPSB0cnVlOyB9IC8vIE9jdGFsCiAgICAgIGlmIChzdHJlYW0ubWF0Y2goL15bMS05XVxkKihlW1wrXC1dP1xkKyk/LykpIHsgbnVtYmVyTGl0ZXJhbCA9IHRydWU7IH0gLy8gRGVjaW1hbAogICAgICAvLyBaZXJvIGJ5IGl0c2VsZiB3aXRoIG5vIG90aGVyIHBpZWNlIG9mIG51bWJlci4KICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXjAoPyFbXGR4XSkvaSkpIHsgbnVtYmVyTGl0ZXJhbCA9IHRydWU7IH0KICAgICAgaWYgKG51bWJlckxpdGVyYWwpIHsKICAgICAgICAgIC8vIEludGVnZXIgbGl0ZXJhbHMgbWF5IGJlICJsb25nIgogICAgICAgICAgc3RyZWFtLm1hdGNoKGltTWF0Y2hlcik7CiAgICAgICAgICBzdGF0ZS5sZWF2aW5nRXhwciA9IHRydWU7CiAgICAgICAgICByZXR1cm4gJ251bWJlcic7CiAgICAgIH0KICAgIH0KCiAgICBpZiAoc3RyZWFtLm1hdGNoKC9ePDovKSkgewogICAgICByZXR1cm4gJ29wZXJhdG9yJzsKICAgIH0KCiAgICBpZiAoc3RyZWFtLm1hdGNoKHR5cGVBbm5vdGF0aW9uKSkgewogICAgICByZXR1cm4gJ2J1aWx0aW4nOwogICAgfQoKICAgIC8vIEhhbmRsZSBzeW1ib2xzCiAgICBpZiAoIWxlYXZpbmdFeHByICYmIHN0cmVhbS5tYXRjaChzeW1ib2wpIHx8IHN0cmVhbS5tYXRjaCgvOlwuLykpIHsKICAgICAgcmV0dXJuICdidWlsdGluJzsKICAgIH0KCiAgICAvLyBIYW5kbGUgcGFyYW1ldHJpYyB0eXBlcwogICAgaWYgKHN0cmVhbS5tYXRjaCgvXntbXn1dKn0oPz1cKCkvKSkgewogICAgICByZXR1cm4gJ2J1aWx0aW4nOwogICAgfQoKICAgIC8vIEhhbmRsZSBvcGVyYXRvcnMgYW5kIERlbGltaXRlcnMKICAgIGlmIChzdHJlYW0ubWF0Y2gob3BlcmF0b3JzKSkgewogICAgICByZXR1cm4gJ29wZXJhdG9yJzsKICAgIH0KCiAgICAvLyBIYW5kbGUgQ2hhcnMKICAgIGlmIChzdHJlYW0ubWF0Y2goL14nLykpIHsKICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkNoYXI7CiAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgIH0KCiAgICAvLyBIYW5kbGUgU3RyaW5ncwogICAgaWYgKHN0cmVhbS5tYXRjaChzdHJpbmdQcmVmaXhlcykpIHsKICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlblN0cmluZ0ZhY3Rvcnkoc3RyZWFtLmN1cnJlbnQoKSk7CiAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgIH0KCiAgICBpZiAoc3RyZWFtLm1hdGNoKG1hY3JvKSkgewogICAgICByZXR1cm4gJ21ldGEnOwogICAgfQoKICAgIGlmIChzdHJlYW0ubWF0Y2goZGVsaW1pdGVycykpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgaWYgKHN0cmVhbS5tYXRjaChrZXl3b3JkcykpIHsKICAgICAgcmV0dXJuICdrZXl3b3JkJzsKICAgIH0KCiAgICBpZiAoc3RyZWFtLm1hdGNoKGJ1aWx0aW5zKSkgewogICAgICByZXR1cm4gJ2J1aWx0aW4nOwogICAgfQoKICAgIHZhciBpc0RlZmluaXRpb24gPSBzdGF0ZS5pc0RlZmluaXRpb24gfHwKICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5sYXN0VG9rZW4gPT0gJ2Z1bmN0aW9uJyB8fAogICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmxhc3RUb2tlbiA9PSAnbWFjcm8nIHx8CiAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUubGFzdFRva2VuID09ICd0eXBlJyB8fAogICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmxhc3RUb2tlbiA9PSAnaW1tdXRhYmxlJzsKCiAgICBpZiAoc3RyZWFtLm1hdGNoKGlkZW50aWZpZXJzKSkgewogICAgICBpZiAoaXNEZWZpbml0aW9uKSB7CiAgICAgICAgaWYgKHN0cmVhbS5wZWVrKCkgPT09ICcuJykgewogICAgICAgICAgc3RhdGUuaXNEZWZpbml0aW9uID0gdHJ1ZTsKICAgICAgICAgIHJldHVybiAndmFyaWFibGUnOwogICAgICAgIH0KICAgICAgICBzdGF0ZS5pc0RlZmluaXRpb24gPSBmYWxzZTsKICAgICAgICByZXR1cm4gJ2RlZic7CiAgICAgIH0KICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXih7W159XSp9KSpcKC8sIGZhbHNlKSkgewogICAgICAgIHJldHVybiBjYWxsT3JEZWYoc3RyZWFtLCBzdGF0ZSk7CiAgICAgIH0KICAgICAgc3RhdGUubGVhdmluZ0V4cHIgPSB0cnVlOwogICAgICByZXR1cm4gJ3ZhcmlhYmxlJzsKICAgIH0KCiAgICAvLyBIYW5kbGUgbm9uLWRldGVjdGVkIGl0ZW1zCiAgICBzdHJlYW0ubmV4dCgpOwogICAgcmV0dXJuIEVSUk9SQ0xBU1M7CiAgfQoKICBmdW5jdGlvbiBjYWxsT3JEZWYoc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIG1hdGNoID0gc3RyZWFtLm1hdGNoKC9eKFwoXHMqKS8pOwogICAgaWYgKG1hdGNoKSB7CiAgICAgIGlmIChzdGF0ZS5maXJzdFBhcmVuUG9zIDwgMCkKICAgICAgICBzdGF0ZS5maXJzdFBhcmVuUG9zID0gc3RhdGUuc2NvcGVzLmxlbmd0aDsKICAgICAgc3RhdGUuc2NvcGVzLnB1c2goJygnKTsKICAgICAgc3RhdGUuY2hhcnNBZHZhbmNlZCArPSBtYXRjaFsxXS5sZW5ndGg7CiAgICB9CiAgICBpZiAoY3VycmVudFNjb3BlKHN0YXRlKSA9PSAnKCcgJiYgc3RyZWFtLm1hdGNoKC9eXCkvKSkgewogICAgICBzdGF0ZS5zY29wZXMucG9wKCk7CiAgICAgIHN0YXRlLmNoYXJzQWR2YW5jZWQgKz0gMTsKICAgICAgaWYgKHN0YXRlLnNjb3Blcy5sZW5ndGggPD0gc3RhdGUuZmlyc3RQYXJlblBvcykgewogICAgICAgIHZhciBpc0RlZmluaXRpb24gPSBzdHJlYW0ubWF0Y2goL15ccyo/PSg/IT0pLywgZmFsc2UpOwogICAgICAgIHN0cmVhbS5iYWNrVXAoc3RhdGUuY2hhcnNBZHZhbmNlZCk7CiAgICAgICAgc3RhdGUuZmlyc3RQYXJlblBvcyA9IC0xOwogICAgICAgIHN0YXRlLmNoYXJzQWR2YW5jZWQgPSAwOwogICAgICAgIGlmIChpc0RlZmluaXRpb24pCiAgICAgICAgICByZXR1cm4gJ2RlZic7CiAgICAgICAgcmV0dXJuICdidWlsdGluJzsKICAgICAgfQogICAgfQogICAgLy8gVW5mb3J0dW5hdGVseSBqYXZhc2NyaXB0IGRvZXMgbm90IHN1cHBvcnQgbXVsdGlsaW5lIHN0cmluZ3MsIHNvIHdlIGhhdmUKICAgIC8vIHRvIHVuZG8gYW55dGhpbmcgZG9uZSB1cHRvIGhlcmUgaWYgYSBmdW5jdGlvbiBjYWxsIG9yIGRlZmluaXRpb24gc3BsaXRzCiAgICAvLyBvdmVyIHR3byBvciBtb3JlIGxpbmVzLgogICAgaWYgKHN0cmVhbS5tYXRjaCgvXiQvZywgZmFsc2UpKSB7CiAgICAgIHN0cmVhbS5iYWNrVXAoc3RhdGUuY2hhcnNBZHZhbmNlZCk7CiAgICAgIHdoaWxlIChzdGF0ZS5zY29wZXMubGVuZ3RoID4gc3RhdGUuZmlyc3RQYXJlblBvcykKICAgICAgICBzdGF0ZS5zY29wZXMucG9wKCk7CiAgICAgIHN0YXRlLmZpcnN0UGFyZW5Qb3MgPSAtMTsKICAgICAgc3RhdGUuY2hhcnNBZHZhbmNlZCA9IDA7CiAgICAgIHJldHVybiAnYnVpbHRpbic7CiAgICB9CiAgICBzdGF0ZS5jaGFyc0FkdmFuY2VkICs9IHN0cmVhbS5tYXRjaCgvXihbXigpXSopLylbMV0ubGVuZ3RoOwogICAgcmV0dXJuIGNhbGxPckRlZihzdHJlYW0sIHN0YXRlKTsKICB9CgogIGZ1bmN0aW9uIHRva2VuQ29tbWVudChzdHJlYW0sIHN0YXRlKSB7CiAgICBpZiAoc3RyZWFtLm1hdGNoKC9eIz0vKSkgewogICAgICBzdGF0ZS53ZWFrU2NvcGVzKys7CiAgICB9CiAgICBpZiAoIXN0cmVhbS5tYXRjaCgvLio/KD89KCM9fD0jKSkvKSkgewogICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICB9CiAgICBpZiAoc3RyZWFtLm1hdGNoKC9ePSMvKSkgewogICAgICBzdGF0ZS53ZWFrU2NvcGVzLS07CiAgICAgIGlmIChzdGF0ZS53ZWFrU2NvcGVzID09IDApCiAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICB9CiAgICByZXR1cm4gJ2NvbW1lbnQnOwogIH0KCiAgZnVuY3Rpb24gdG9rZW5DaGFyKHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBpc0NoYXIgPSBmYWxzZSwgbWF0Y2g7CiAgICBpZiAoc3RyZWFtLm1hdGNoKGNoYXJzKSkgewogICAgICBpc0NoYXIgPSB0cnVlOwogICAgfSBlbHNlIGlmIChtYXRjaCA9IHN0cmVhbS5tYXRjaCgvXFx1KFthLWYwLTldezEsNH0pKD89JykvaSkpIHsKICAgICAgdmFyIHZhbHVlID0gcGFyc2VJbnQobWF0Y2hbMV0sIDE2KTsKICAgICAgaWYgKHZhbHVlIDw9IDU1Mjk1IHx8IHZhbHVlID49IDU3MzQ0KSB7IC8vIChVKzAsVStEN0ZGKSwgKFUrRTAwMCxVK0ZGRkYpCiAgICAgICAgaXNDaGFyID0gdHJ1ZTsKICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKG1hdGNoID0gc3RyZWFtLm1hdGNoKC9cXFUoW0EtRmEtZjAtOV17NSw4fSkoPz0nKS8pKSB7CiAgICAgIHZhciB2YWx1ZSA9IHBhcnNlSW50KG1hdGNoWzFdLCAxNik7CiAgICAgIGlmICh2YWx1ZSA8PSAxMTE0MTExKSB7IC8vIFUrMTBGRkZGCiAgICAgICAgaXNDaGFyID0gdHJ1ZTsKICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICB9CiAgICB9CiAgICBpZiAoaXNDaGFyKSB7CiAgICAgIHN0YXRlLmxlYXZpbmdFeHByID0gdHJ1ZTsKICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICAgIHJldHVybiAnc3RyaW5nJzsKICAgIH0KICAgIGlmICghc3RyZWFtLm1hdGNoKC9eW14nXSsoPz0nKS8pKSB7IHN0cmVhbS5za2lwVG9FbmQoKTsgfQogICAgaWYgKHN0cmVhbS5tYXRjaCgvXicvKSkgeyBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTsgfQogICAgcmV0dXJuIEVSUk9SQ0xBU1M7CiAgfQoKICBmdW5jdGlvbiB0b2tlblN0cmluZ0ZhY3RvcnkoZGVsaW1pdGVyKSB7CiAgICB3aGlsZSAoJ2JydXYnLmluZGV4T2YoZGVsaW1pdGVyLmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpKSA+PSAwKSB7CiAgICAgIGRlbGltaXRlciA9IGRlbGltaXRlci5zdWJzdHIoMSk7CiAgICB9CiAgICB2YXIgT1VUQ0xBU1MgPSAnc3RyaW5nJzsKCiAgICBmdW5jdGlvbiB0b2tlblN0cmluZyhzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHdoaWxlICghc3RyZWFtLmVvbCgpKSB7CiAgICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXiJcXF0vKTsKICAgICAgICBpZiAoc3RyZWFtLmVhdCgnXFwnKSkgewogICAgICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLm1hdGNoKGRlbGltaXRlcikpIHsKICAgICAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICAgICAgICAgIHN0YXRlLmxlYXZpbmdFeHByID0gdHJ1ZTsKICAgICAgICAgICAgcmV0dXJuIE9VVENMQVNTOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHN0cmVhbS5lYXQoL1siXS8pOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gT1VUQ0xBU1M7CiAgICB9CiAgICB0b2tlblN0cmluZy5pc1N0cmluZyA9IHRydWU7CiAgICByZXR1cm4gdG9rZW5TdHJpbmc7CiAgfQoKICB2YXIgZXh0ZXJuYWwgPSB7CiAgICBzdGFydFN0YXRlOiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICB0b2tlbml6ZTogdG9rZW5CYXNlLAogICAgICAgIHNjb3BlczogW10sCiAgICAgICAgd2Vha1Njb3BlczogMCwKICAgICAgICBsYXN0VG9rZW46IG51bGwsCiAgICAgICAgbGVhdmluZ0V4cHI6IGZhbHNlLAogICAgICAgIGlzRGVmaW5pdGlvbjogZmFsc2UsCiAgICAgICAgY2hhcnNBZHZhbmNlZDogMCwKICAgICAgICBmaXJzdFBhcmVuUG9zOiAtMQogICAgICB9OwogICAgfSwKCiAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICB2YXIgc3R5bGUgPSBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgICAgdmFyIGN1cnJlbnQgPSBzdHJlYW0uY3VycmVudCgpOwoKICAgICAgaWYgKGN1cnJlbnQgJiYgc3R5bGUpIHsKICAgICAgICBzdGF0ZS5sYXN0VG9rZW4gPSBjdXJyZW50OwogICAgICB9CgogICAgICAvLyBIYW5kbGUgJy4nIGNvbm5lY3RlZCBpZGVudGlmaWVycwogICAgICBpZiAoY3VycmVudCA9PT0gJy4nKSB7CiAgICAgICAgc3R5bGUgPSBzdHJlYW0ubWF0Y2goaWRlbnRpZmllcnMsIGZhbHNlKSB8fCBzdHJlYW0ubWF0Y2gobWFjcm8sIGZhbHNlKSB8fAogICAgICAgICAgICAgICAgc3RyZWFtLm1hdGNoKC9cKC8sIGZhbHNlKSA/ICdvcGVyYXRvcicgOiBFUlJPUkNMQVNTOwogICAgICB9CiAgICAgIHJldHVybiBzdHlsZTsKICAgIH0sCgogICAgaW5kZW50OiBmdW5jdGlvbihzdGF0ZSwgdGV4dEFmdGVyKSB7CiAgICAgIHZhciBkZWx0YSA9IDA7CiAgICAgIGlmICh0ZXh0QWZ0ZXIgPT0gIl0iIHx8IHRleHRBZnRlciA9PSAiKSIgfHwgdGV4dEFmdGVyID09ICJlbmQiIHx8IHRleHRBZnRlciA9PSAiZWxzZSIgfHwgdGV4dEFmdGVyID09ICJlbHNlaWYiIHx8IHRleHRBZnRlciA9PSAiY2F0Y2giIHx8IHRleHRBZnRlciA9PSAiZmluYWxseSIpIHsKICAgICAgICBkZWx0YSA9IC0xOwogICAgICB9CiAgICAgIHJldHVybiAoc3RhdGUuc2NvcGVzLmxlbmd0aCArIGRlbHRhKSAqIF9jb25mLmluZGVudFVuaXQ7CiAgICB9LAoKICAgIGVsZWN0cmljSW5wdXQ6IC8oZW5kfGVsc2UoaWYpP3xjYXRjaHxmaW5hbGx5KSQvLAogICAgbGluZUNvbW1lbnQ6ICIjIiwKICAgIGZvbGQ6ICJpbmRlbnQiCiAgfTsKICByZXR1cm4gZXh0ZXJuYWw7Cn0pOwoKCkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC94LWp1bGlhIiwgImp1bGlhIik7Cgp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/livescript/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/livescript/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogTGl2ZVNjcmlwdCBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi90aGVtZS9zb2xhcml6ZWQuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9ImxpdmVzY3JpcHQuanMiPjwvc2NyaXB0Pgo8c3R5bGU+LkNvZGVNaXJyb3Ige2ZvbnQtc2l6ZTogODAlO2JvcmRlci10b3A6IDFweCBzb2xpZCBzaWx2ZXI7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBzaWx2ZXI7fTwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGgxPkNvZGVNaXJyb3I8L2gxPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5MaXZlU2NyaXB0PC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5MaXZlU2NyaXB0IG1vZGU8L2gyPgo8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgojIExpdmVTY3JpcHQgbW9kZSBmb3IgQ29kZU1pcnJvcgojIFRoZSBmb2xsb3dpbmcgc2NyaXB0LCBwcmVsdWRlLmxzLCBpcyB1c2VkIHRvCiMgZGVtb25zdHJhdGUgTGl2ZVNjcmlwdCBtb2RlIGZvciBDb2RlTWlycm9yLgojICAgaHR0cHM6Ly9naXRodWIuY29tL2drei9wcmVsdWRlLWxzCgpleHBvcnQgb2JqVG9GdW5jID0gb2JqVG9GdW5jID0gKG9iaikgLT4KICAoa2V5KSAtPiBvYmpba2V5XQoKZXhwb3J0IGVhY2ggPSAoZiwgeHMpIC0tPgogIGlmIHR5cGVvZiEgeHMgaXMgXE9iamVjdAogICAgZm9yICwgeCBvZiB4cyB0aGVuIGYgeAogIGVsc2UKICAgIGZvciB4IGluIHhzIHRoZW4gZiB4CiAgeHMKCmV4cG9ydCBtYXAgPSAoZiwgeHMpIC0tPgogIGYgPSBvYmpUb0Z1bmMgZiBpZiB0eXBlb2YhIGYgaXNudCBcRnVuY3Rpb24KICB0eXBlID0gdHlwZW9mISB4cwogIGlmIHR5cGUgaXMgXE9iamVjdAogICAge1trZXksIGYgeF0gZm9yIGtleSwgeCBvZiB4c30KICBlbHNlCiAgICByZXN1bHQgPSBbZiB4IGZvciB4IGluIHhzXQogICAgaWYgdHlwZSBpcyBcU3RyaW5nIHRoZW4gcmVzdWx0ICogJycgZWxzZSByZXN1bHQKCmV4cG9ydCBmaWx0ZXIgPSAoZiwgeHMpIC0tPgogIGYgPSBvYmpUb0Z1bmMgZiBpZiB0eXBlb2YhIGYgaXNudCBcRnVuY3Rpb24KICB0eXBlID0gdHlwZW9mISB4cwogIGlmIHR5cGUgaXMgXE9iamVjdAogICAge1trZXksIHhdIGZvciBrZXksIHggb2YgeHMgd2hlbiBmIHh9CiAgZWxzZQogICAgcmVzdWx0ID0gW3ggZm9yIHggaW4geHMgd2hlbiBmIHhdCiAgICBpZiB0eXBlIGlzIFxTdHJpbmcgdGhlbiByZXN1bHQgKiAnJyBlbHNlIHJlc3VsdAoKZXhwb3J0IHJlamVjdCA9IChmLCB4cykgLS0+CiAgZiA9IG9ialRvRnVuYyBmIGlmIHR5cGVvZiEgZiBpc250IFxGdW5jdGlvbgogIHR5cGUgPSB0eXBlb2YhIHhzCiAgaWYgdHlwZSBpcyBcT2JqZWN0CiAgICB7W2tleSwgeF0gZm9yIGtleSwgeCBvZiB4cyB3aGVuIG5vdCBmIHh9CiAgZWxzZQogICAgcmVzdWx0ID0gW3ggZm9yIHggaW4geHMgd2hlbiBub3QgZiB4XQogICAgaWYgdHlwZSBpcyBcU3RyaW5nIHRoZW4gcmVzdWx0ICogJycgZWxzZSByZXN1bHQKCmV4cG9ydCBwYXJ0aXRpb24gPSAoZiwgeHMpIC0tPgogIGYgPSBvYmpUb0Z1bmMgZiBpZiB0eXBlb2YhIGYgaXNudCBcRnVuY3Rpb24KICB0eXBlID0gdHlwZW9mISB4cwogIGlmIHR5cGUgaXMgXE9iamVjdAogICAgcGFzc2VkID0ge30KICAgIGZhaWxlZCA9IHt9CiAgICBmb3Iga2V5LCB4IG9mIHhzCiAgICAgIChpZiBmIHggdGhlbiBwYXNzZWQgZWxzZSBmYWlsZWQpW2tleV0gPSB4CiAgZWxzZQogICAgcGFzc2VkID0gW10KICAgIGZhaWxlZCA9IFtdCiAgICBmb3IgeCBpbiB4cwogICAgICAoaWYgZiB4IHRoZW4gcGFzc2VkIGVsc2UgZmFpbGVkKXB1c2ggeAogICAgaWYgdHlwZSBpcyBcU3RyaW5nCiAgICAgIHBhc3NlZCAqPSAnJwogICAgICBmYWlsZWQgKj0gJycKICBbcGFzc2VkLCBmYWlsZWRdCgpleHBvcnQgZmluZCA9IChmLCB4cykgLS0+CiAgZiA9IG9ialRvRnVuYyBmIGlmIHR5cGVvZiEgZiBpc250IFxGdW5jdGlvbgogIGlmIHR5cGVvZiEgeHMgaXMgXE9iamVjdAogICAgZm9yICwgeCBvZiB4cyB3aGVuIGYgeCB0aGVuIHJldHVybiB4CiAgZWxzZQogICAgZm9yIHggaW4geHMgd2hlbiBmIHggdGhlbiByZXR1cm4geAogIHZvaWQKCmV4cG9ydCBoZWFkID0gZXhwb3J0IGZpcnN0ID0gKHhzKSAtPgogIHJldHVybiB2b2lkIGlmIG5vdCB4cy5sZW5ndGgKICB4cy4wCgpleHBvcnQgdGFpbCA9ICh4cykgLT4KICByZXR1cm4gdm9pZCBpZiBub3QgeHMubGVuZ3RoCiAgeHMuc2xpY2UgMQoKZXhwb3J0IGxhc3QgPSAoeHMpIC0+CiAgcmV0dXJuIHZvaWQgaWYgbm90IHhzLmxlbmd0aAogIHhzWyotMV0KCmV4cG9ydCBpbml0aWFsID0gKHhzKSAtPgogIHJldHVybiB2b2lkIGlmIG5vdCB4cy5sZW5ndGgKICB4cy5zbGljZSAwIHhzLmxlbmd0aCAtIDEKCmV4cG9ydCBlbXB0eSA9ICh4cykgLT4KICBpZiB0eXBlb2YhIHhzIGlzIFxPYmplY3QKICAgIGZvciB4IG9mIHhzIHRoZW4gcmV0dXJuIGZhbHNlCiAgICByZXR1cm4geWVzCiAgbm90IHhzLmxlbmd0aAoKZXhwb3J0IHZhbHVlcyA9IChvYmopIC0+CiAgW3ggZm9yICwgeCBvZiBvYmpdCgpleHBvcnQga2V5cyA9IChvYmopIC0+CiAgW3ggZm9yIHggb2Ygb2JqXQoKZXhwb3J0IGxlbiA9ICh4cykgLT4KICB4cyA9IHZhbHVlcyB4cyBpZiB0eXBlb2YhIHhzIGlzIFxPYmplY3QKICB4cy5sZW5ndGgKCmV4cG9ydCBjb25zID0gKHgsIHhzKSAtLT4KICBpZiB0eXBlb2YhIHhzIGlzIFxTdHJpbmcgdGhlbiB4ICsgeHMgZWxzZSBbeF0gKysgeHMKCmV4cG9ydCBhcHBlbmQgPSAoeHMsIHlzKSAtLT4KICBpZiB0eXBlb2YhIHlzIGlzIFxTdHJpbmcgdGhlbiB4cyArIHlzIGVsc2UgeHMgKysgeXMKCmV4cG9ydCBqb2luID0gKHNlcCwgeHMpIC0tPgogIHhzID0gdmFsdWVzIHhzIGlmIHR5cGVvZiEgeHMgaXMgXE9iamVjdAogIHhzLmpvaW4gc2VwCgpleHBvcnQgcmV2ZXJzZSA9ICh4cykgLT4KICBpZiB0eXBlb2YhIHhzIGlzIFxTdHJpbmcKICB0aGVuICh4cyAvICcnKXJldmVyc2UhICogJycKICBlbHNlIHhzLnNsaWNlIXJldmVyc2UhCgpleHBvcnQgZm9sZCA9IGV4cG9ydCBmb2xkbCA9IChmLCBtZW1vLCB4cykgLS0+CiAgaWYgdHlwZW9mISB4cyBpcyBcT2JqZWN0CiAgICBmb3IgLCB4IG9mIHhzIHRoZW4gbWVtbyA9IGYgbWVtbywgeAogIGVsc2UKICAgIGZvciB4IGluIHhzIHRoZW4gbWVtbyA9IGYgbWVtbywgeAogIG1lbW8KCmV4cG9ydCBmb2xkMSA9IGV4cG9ydCBmb2xkbDEgPSAoZiwgeHMpIC0tPiBmb2xkIGYsIHhzLjAsIHhzLnNsaWNlIDEKCmV4cG9ydCBmb2xkciA9IChmLCBtZW1vLCB4cykgLS0+IGZvbGQgZiwgbWVtbywgeHMuc2xpY2UhcmV2ZXJzZSEKCmV4cG9ydCBmb2xkcjEgPSAoZiwgeHMpIC0tPgogIHhzLj1zbGljZSFyZXZlcnNlIQogIGZvbGQgZiwgeHMuMCwgeHMuc2xpY2UgMQoKZXhwb3J0IHVuZm9sZHIgPSBleHBvcnQgdW5mb2xkID0gKGYsIGIpIC0tPgogIGlmIChmIGIpPwogICAgW3RoYXQuMF0gKysgdW5mb2xkciBmLCB0aGF0LjEKICBlbHNlCiAgICBbXQoKZXhwb3J0IGFuZExpc3QgPSAoeHMpIC0+CiAgZm9yIHggaW4geHMgd2hlbiBub3QgeAogICAgcmV0dXJuIGZhbHNlCiAgdHJ1ZQoKZXhwb3J0IG9yTGlzdCA9ICh4cykgLT4KICBmb3IgeCBpbiB4cyB3aGVuIHgKICAgIHJldHVybiB0cnVlCiAgZmFsc2UKCmV4cG9ydCBhbnkgPSAoZiwgeHMpIC0tPgogIGYgPSBvYmpUb0Z1bmMgZiBpZiB0eXBlb2YhIGYgaXNudCBcRnVuY3Rpb24KICBmb3IgeCBpbiB4cyB3aGVuIGYgeAogICAgcmV0dXJuIHllcwogIG5vCgpleHBvcnQgYWxsID0gKGYsIHhzKSAtLT4KICBmID0gb2JqVG9GdW5jIGYgaWYgdHlwZW9mISBmIGlzbnQgXEZ1bmN0aW9uCiAgZm9yIHggaW4geHMgd2hlbiBub3QgZiB4CiAgICByZXR1cm4gbm8KICB5ZXMKCmV4cG9ydCB1bmlxdWUgPSAoeHMpIC0+CiAgcmVzdWx0ID0gW10KICBpZiB0eXBlb2YhIHhzIGlzIFxPYmplY3QKICAgIGZvciAsIHggb2YgeHMgd2hlbiB4IG5vdCBpbiByZXN1bHQgdGhlbiByZXN1bHQucHVzaCB4CiAgZWxzZQogICAgZm9yIHggICBpbiB4cyB3aGVuIHggbm90IGluIHJlc3VsdCB0aGVuIHJlc3VsdC5wdXNoIHgKICBpZiB0eXBlb2YhIHhzIGlzIFxTdHJpbmcgdGhlbiByZXN1bHQgKiAnJyBlbHNlIHJlc3VsdAoKZXhwb3J0IHNvcnQgPSAoeHMpIC0+CiAgeHMuY29uY2F0IXNvcnQgKHgsIHkpIC0+CiAgICB8IHggPiB5ID0+ICAxCiAgICB8IHggPCB5ID0+IC0xCiAgICB8IF8gICAgID0+ICAwCgpleHBvcnQgc29ydEJ5ID0gKGYsIHhzKSAtLT4KICByZXR1cm4gW10gdW5sZXNzIHhzLmxlbmd0aAogIHhzLmNvbmNhdCFzb3J0IGYKCmV4cG9ydCBjb21wYXJlID0gKGYsIHgsIHkpIC0tPgogIHwgKGYgeCkgPiAoZiB5KSA9PiAgMQogIHwgKGYgeCkgPCAoZiB5KSA9PiAtMQogIHwgb3RoZXJ3aXNlICAgICA9PiAgMAoKZXhwb3J0IHN1bSA9ICh4cykgLT4KICByZXN1bHQgPSAwCiAgaWYgdHlwZW9mISB4cyBpcyBcT2JqZWN0CiAgICBmb3IgLCB4IG9mIHhzIHRoZW4gcmVzdWx0ICs9IHgKICBlbHNlCiAgICBmb3IgeCAgIGluIHhzIHRoZW4gcmVzdWx0ICs9IHgKICByZXN1bHQKCmV4cG9ydCBwcm9kdWN0ID0gKHhzKSAtPgogIHJlc3VsdCA9IDEKICBpZiB0eXBlb2YhIHhzIGlzIFxPYmplY3QKICAgIGZvciAsIHggb2YgeHMgdGhlbiByZXN1bHQgKj0geAogIGVsc2UKICAgIGZvciB4ICAgaW4geHMgdGhlbiByZXN1bHQgKj0geAogIHJlc3VsdAoKZXhwb3J0IG1lYW4gPSBleHBvcnQgYXZlcmFnZSA9ICh4cykgLT4gKHN1bSB4cykgLyBsZW4geHMKCmV4cG9ydCBjb25jYXQgPSAoeHNzKSAtPiBmb2xkIGFwcGVuZCwgW10sIHhzcwoKZXhwb3J0IGNvbmNhdE1hcCA9IChmLCB4cykgLS0+IGZvbGQgKChtZW1vLCB4KSAtPiBhcHBlbmQgbWVtbywgZiB4KSwgW10sIHhzCgpleHBvcnQgbGlzdFRvT2JqID0gKHhzKSAtPgogIHtbeC4wLCB4LjFdIGZvciB4IGluIHhzfQoKZXhwb3J0IG1heGltdW0gPSAoeHMpIC0+IGZvbGQxICg+PyksIHhzCgpleHBvcnQgbWluaW11bSA9ICh4cykgLT4gZm9sZDEgKDw/KSwgeHMKCmV4cG9ydCBzY2FuID0gZXhwb3J0IHNjYW5sID0gKGYsIG1lbW8sIHhzKSAtLT4KICBsYXN0ID0gbWVtbwogIGlmIHR5cGVvZiEgeHMgaXMgXE9iamVjdAogIHRoZW4gW21lbW9dICsrIFtsYXN0ID0gZiBsYXN0LCB4IGZvciAsIHggb2YgeHNdCiAgZWxzZSBbbWVtb10gKysgW2xhc3QgPSBmIGxhc3QsIHggZm9yIHggaW4geHNdCgpleHBvcnQgc2NhbjEgPSBleHBvcnQgc2NhbmwxID0gKGYsIHhzKSAtLT4gc2NhbiBmLCB4cy4wLCB4cy5zbGljZSAxCgpleHBvcnQgc2NhbnIgPSAoZiwgbWVtbywgeHMpIC0tPgogIHhzLj1zbGljZSFyZXZlcnNlIQogIHNjYW4gZiwgbWVtbywgeHMgLnJldmVyc2UhCgpleHBvcnQgc2NhbnIxID0gKGYsIHhzKSAtLT4KICB4cy49c2xpY2UhcmV2ZXJzZSEKICBzY2FuIGYsIHhzLjAsIHhzLnNsaWNlIDEgLnJldmVyc2UhCgpleHBvcnQgcmVwbGljYXRlID0gKG4sIHgpIC0tPgogIHJlc3VsdCA9IFtdCiAgaSA9IDAKICB3aGlsZSBpIDwgbiwgKytpIHRoZW4gcmVzdWx0LnB1c2ggeAogIHJlc3VsdAoKZXhwb3J0IHRha2UgPSAobiwgeHMpIC0tPgogIHwgbiA8PSAwCiAgICBpZiB0eXBlb2YhIHhzIGlzIFxTdHJpbmcgdGhlbiAnJyBlbHNlIFtdCiAgfCBub3QgeHMubGVuZ3RoID0+IHhzCiAgfCBvdGhlcndpc2UgICAgID0+IHhzLnNsaWNlIDAsIG4KCmV4cG9ydCBkcm9wID0gKG4sIHhzKSAtLT4KICB8IG4gPD0gMCAgICAgICAgPT4geHMKICB8IG5vdCB4cy5sZW5ndGggPT4geHMKICB8IG90aGVyd2lzZSAgICAgPT4geHMuc2xpY2UgbgoKZXhwb3J0IHNwbGl0QXQgPSAobiwgeHMpIC0tPiBbKHRha2UgbiwgeHMpLCAoZHJvcCBuLCB4cyldCgpleHBvcnQgdGFrZVdoaWxlID0gKHAsIHhzKSAtLT4KICByZXR1cm4geHMgaWYgbm90IHhzLmxlbmd0aAogIHAgPSBvYmpUb0Z1bmMgcCBpZiB0eXBlb2YhIHAgaXNudCBcRnVuY3Rpb24KICByZXN1bHQgPSBbXQogIGZvciB4IGluIHhzCiAgICBicmVhayBpZiBub3QgcCB4CiAgICByZXN1bHQucHVzaCB4CiAgaWYgdHlwZW9mISB4cyBpcyBcU3RyaW5nIHRoZW4gcmVzdWx0ICogJycgZWxzZSByZXN1bHQKCmV4cG9ydCBkcm9wV2hpbGUgPSAocCwgeHMpIC0tPgogIHJldHVybiB4cyBpZiBub3QgeHMubGVuZ3RoCiAgcCA9IG9ialRvRnVuYyBwIGlmIHR5cGVvZiEgcCBpc250IFxGdW5jdGlvbgogIGkgPSAwCiAgZm9yIHggaW4geHMKICAgIGJyZWFrIGlmIG5vdCBwIHgKICAgICsraQogIGRyb3AgaSwgeHMKCmV4cG9ydCBzcGFuID0gKHAsIHhzKSAtLT4gWyh0YWtlV2hpbGUgcCwgeHMpLCAoZHJvcFdoaWxlIHAsIHhzKV0KCmV4cG9ydCBicmVha0l0ID0gKHAsIHhzKSAtLT4gc3BhbiAobm90KSA8PCBwLCB4cwoKZXhwb3J0IHppcCA9ICh4cywgeXMpIC0tPgogIHJlc3VsdCA9IFtdCiAgZm9yIHpzLCBpIGluIFt4cywgeXNdCiAgICBmb3IgeiwgaiBpbiB6cwogICAgICByZXN1bHQucHVzaCBbXSBpZiBpIGlzIDAKICAgICAgcmVzdWx0W2pdP3B1c2ggegogIHJlc3VsdAoKZXhwb3J0IHppcFdpdGggPSAoZix4cywgeXMpIC0tPgogIGYgPSBvYmpUb0Z1bmMgZiBpZiB0eXBlb2YhIGYgaXNudCBcRnVuY3Rpb24KICBpZiBub3QgeHMubGVuZ3RoIG9yIG5vdCB5cy5sZW5ndGgKICAgIFtdCiAgZWxzZQogICAgW2YuYXBwbHkgdGhpcywgenMgZm9yIHpzIGluIHppcC5jYWxsIHRoaXMsIHhzLCB5c10KCmV4cG9ydCB6aXBBbGwgPSAoLi4ueHNzKSAtPgogIHJlc3VsdCA9IFtdCiAgZm9yIHhzLCBpIGluIHhzcwogICAgZm9yIHgsIGogaW4geHMKICAgICAgcmVzdWx0LnB1c2ggW10gaWYgaSBpcyAwCiAgICAgIHJlc3VsdFtqXT9wdXNoIHgKICByZXN1bHQKCmV4cG9ydCB6aXBBbGxXaXRoID0gKGYsIC4uLnhzcykgLT4KICBmID0gb2JqVG9GdW5jIGYgaWYgdHlwZW9mISBmIGlzbnQgXEZ1bmN0aW9uCiAgaWYgbm90IHhzcy4wLmxlbmd0aCBvciBub3QgeHNzLjEubGVuZ3RoCiAgICBbXQogIGVsc2UKICAgIFtmLmFwcGx5IHRoaXMsIHhzIGZvciB4cyBpbiB6aXBBbGwuYXBwbHkgdGhpcywgeHNzXQoKZXhwb3J0IGNvbXBvc2UgPSAoLi4uZnVuY3MpIC0+CiAgLT4KICAgIGFyZ3MgPSBhcmd1bWVudHMKICAgIGZvciBmIGluIGZ1bmNzCiAgICAgIGFyZ3MgPSBbZi5hcHBseSB0aGlzLCBhcmdzXQogICAgYXJncy4wCgpleHBvcnQgY3VycnkgPSAoZikgLT4KICBjdXJyeSQgZiAjIHVzaW5nIHV0aWwgbWV0aG9kIGN1cnJ5JCBmcm9tIGxpdmVzY3JpcHQKCmV4cG9ydCBpZCA9ICh4KSAtPiB4CgpleHBvcnQgZmxpcCA9IChmLCB4LCB5KSAtLT4gZiB5LCB4CgpleHBvcnQgZml4ID0gKGYpIC0+CiAgKCAoZywgeCkgLT4gLT4gZihnIGcpIC4uLmFyZ3VtZW50cyApIGRvCiAgICAoZywgeCkgLT4gLT4gZihnIGcpIC4uLmFyZ3VtZW50cwoKZXhwb3J0IGxpbmVzID0gKHN0cikgLT4KICByZXR1cm4gW10gaWYgbm90IHN0ci5sZW5ndGgKICBzdHIgLyBcXG4KCmV4cG9ydCB1bmxpbmVzID0gKHN0cnMpIC0+IHN0cnMgKiBcXG4KCmV4cG9ydCB3b3JkcyA9IChzdHIpIC0+CiAgcmV0dXJuIFtdIGlmIG5vdCBzdHIubGVuZ3RoCiAgc3RyIC8gL1sgXSsvCgpleHBvcnQgdW53b3JkcyA9IChzdHJzKSAtPiBzdHJzICogJyAnCgpleHBvcnQgbWF4ID0gKD4/KQoKZXhwb3J0IG1pbiA9ICg8PykKCmV4cG9ydCBuZWdhdGUgPSAoeCkgLT4gLXgKCmV4cG9ydCBhYnMgPSBNYXRoLmFicwoKZXhwb3J0IHNpZ251bSA9ICh4KSAtPgogIHwgeCA8IDAgICAgID0+IC0xCiAgfCB4ID4gMCAgICAgPT4gIDEKICB8IG90aGVyd2lzZSA9PiAgMAoKZXhwb3J0IHF1b3QgPSAoeCwgeSkgLS0+IH5+KHggLyB5KQoKZXhwb3J0IHJlbSA9ICglKQoKZXhwb3J0IGRpdiA9ICh4LCB5KSAtLT4gTWF0aC5mbG9vciB4IC8geQoKZXhwb3J0IG1vZCA9ICglJSkKCmV4cG9ydCByZWNpcCA9ICgxIC8pCgpleHBvcnQgcGkgPSBNYXRoLlBJCgpleHBvcnQgdGF1ID0gcGkgKiAyCgpleHBvcnQgZXhwID0gTWF0aC5leHAKCmV4cG9ydCBzcXJ0ID0gTWF0aC5zcXJ0CgojIGNoYW5nZWQgZnJvbSBsb2cgYXMgbG9nIGlzIGEKIyBjb21tb24gZnVuY3Rpb24gZm9yIGxvZ2dpbmcgdGhpbmdzCmV4cG9ydCBsbiA9IE1hdGgubG9nCgpleHBvcnQgcG93ID0gKF4pCgpleHBvcnQgc2luID0gTWF0aC5zaW4KCmV4cG9ydCB0YW4gPSBNYXRoLnRhbgoKZXhwb3J0IGNvcyA9IE1hdGguY29zCgpleHBvcnQgYXNpbiA9IE1hdGguYXNpbgoKZXhwb3J0IGFjb3MgPSBNYXRoLmFjb3MKCmV4cG9ydCBhdGFuID0gTWF0aC5hdGFuCgpleHBvcnQgYXRhbjIgPSAoeCwgeSkgLS0+IE1hdGguYXRhbjIgeCwgeQoKIyBzaW5oCiMgdGFuaAojIGNvc2gKIyBhc2luaAojIGF0YW5oCiMgYWNvc2gKCmV4cG9ydCB0cnVuY2F0ZSA9ICh4KSAtPiB+fngKCmV4cG9ydCByb3VuZCA9IE1hdGgucm91bmQKCmV4cG9ydCBjZWlsaW5nID0gTWF0aC5jZWlsCgpleHBvcnQgZmxvb3IgPSBNYXRoLmZsb29yCgpleHBvcnQgaXNJdE5hTiA9ICh4KSAtPiB4IGlzbnQgeAoKZXhwb3J0IGV2ZW4gPSAoeCkgLT4geCAlIDIgPT0gMAoKZXhwb3J0IG9kZCA9ICh4KSAtPiB4ICUgMiAhPSAwCgpleHBvcnQgZ2NkID0gKHgsIHkpIC0tPgogIHggPSBNYXRoLmFicyB4CiAgeSA9IE1hdGguYWJzIHkKICB1bnRpbCB5IGlzIDAKICAgIHogPSB4ICUgeQogICAgeCA9IHkKICAgIHkgPSB6CiAgeAoKZXhwb3J0IGxjbSA9ICh4LCB5KSAtLT4KICBNYXRoLmFicyBNYXRoLmZsb29yICh4IC8gKGdjZCB4LCB5KSAqIHkpCgojIG1ldGEKZXhwb3J0IGluc3RhbGxQcmVsdWRlID0gISh0YXJnZXQpIC0+CiAgdW5sZXNzIHRhcmdldC5wcmVsdWRlP2lzSW5zdGFsbGVkCiAgICB0YXJnZXQgPDw8IG91dCQgIyB1c2luZyBvdXQkIGdlbmVyYXRlZCBieSBsaXZlc2NyaXB0CiAgICB0YXJnZXQgPDw8IHRhcmdldC5wcmVsdWRlLmlzSW5zdGFsbGVkID0gdHJ1ZQoKZXhwb3J0IHByZWx1ZGUgPSBvdXQkCjwvdGV4dGFyZWE+PC9mb3JtPgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICB0aGVtZTogInNvbGFyaXplZCBsaWdodCIsCiAgICAgICAgbGluZU51bWJlcnM6IHRydWUKICAgICAgfSk7CiAgICA8L3NjcmlwdD4KCiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC94LWxpdmVzY3JpcHQ8L2NvZGU+LjwvcD4KCiAgICA8cD5UaGUgTGl2ZVNjcmlwdCBtb2RlIHdhcyB3cml0dGVuIGJ5IEtlbm5ldGggQmVudGxleS48L3A+CgogIDwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/livescript/livescript.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovKioKICogTGluayB0byB0aGUgcHJvamVjdCdzIEdpdEh1YiBwYWdlOgogKiBodHRwczovL2dpdGh1Yi5jb20vZHVyYWxvZy9Db2RlTWlycm9yCiAqLwoKKGZ1bmN0aW9uKG1vZCkgewogIGlmICh0eXBlb2YgZXhwb3J0cyA9PSAib2JqZWN0IiAmJiB0eXBlb2YgbW9kdWxlID09ICJvYmplY3QiKSAvLyBDb21tb25KUwogICAgbW9kKHJlcXVpcmUoIi4uLy4uL2xpYi9jb2RlbWlycm9yIikpOwogIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kKSAvLyBBTUQKICAgIGRlZmluZShbIi4uLy4uL2xpYi9jb2RlbWlycm9yIl0sIG1vZCk7CiAgZWxzZSAvLyBQbGFpbiBicm93c2VyIGVudgogICAgbW9kKENvZGVNaXJyb3IpOwp9KShmdW5jdGlvbihDb2RlTWlycm9yKSB7CiAgInVzZSBzdHJpY3QiOwoKICBDb2RlTWlycm9yLmRlZmluZU1vZGUoJ2xpdmVzY3JpcHQnLCBmdW5jdGlvbigpewogICAgdmFyIHRva2VuQmFzZSA9IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgdmFyIG5leHRfcnVsZSA9IHN0YXRlLm5leHQgfHwgInN0YXJ0IjsKICAgICAgaWYgKG5leHRfcnVsZSkgewogICAgICAgIHN0YXRlLm5leHQgPSBzdGF0ZS5uZXh0OwogICAgICAgIHZhciBuciA9IFJ1bGVzW25leHRfcnVsZV07CiAgICAgICAgaWYgKG5yLnNwbGljZSkgewogICAgICAgICAgZm9yICh2YXIgaSQgPSAwOyBpJCA8IG5yLmxlbmd0aDsgKytpJCkgewogICAgICAgICAgICB2YXIgciA9IG5yW2kkXTsKICAgICAgICAgICAgaWYgKHIucmVnZXggJiYgc3RyZWFtLm1hdGNoKHIucmVnZXgpKSB7CiAgICAgICAgICAgICAgc3RhdGUubmV4dCA9IHIubmV4dCB8fCBzdGF0ZS5uZXh0OwogICAgICAgICAgICAgIHJldHVybiByLnRva2VuOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgICAgcmV0dXJuICdlcnJvcic7CiAgICAgICAgfQogICAgICAgIGlmIChzdHJlYW0ubWF0Y2gociA9IFJ1bGVzW25leHRfcnVsZV0pKSB7CiAgICAgICAgICBpZiAoci5yZWdleCAmJiBzdHJlYW0ubWF0Y2goci5yZWdleCkpIHsKICAgICAgICAgICAgc3RhdGUubmV4dCA9IHIubmV4dDsKICAgICAgICAgICAgcmV0dXJuIHIudG9rZW47CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgICAgICByZXR1cm4gJ2Vycm9yJzsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgcmV0dXJuICdlcnJvcic7CiAgICB9OwogICAgdmFyIGV4dGVybmFsID0gewogICAgICBzdGFydFN0YXRlOiBmdW5jdGlvbigpewogICAgICAgIHJldHVybiB7CiAgICAgICAgICBuZXh0OiAnc3RhcnQnLAogICAgICAgICAgbGFzdFRva2VuOiB7c3R5bGU6IG51bGwsIGluZGVudDogMCwgY29udGVudDogIiJ9CiAgICAgICAgfTsKICAgICAgfSwKICAgICAgdG9rZW46IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpewogICAgICAgIHdoaWxlIChzdHJlYW0ucG9zID09IHN0cmVhbS5zdGFydCkKICAgICAgICAgIHZhciBzdHlsZSA9IHRva2VuQmFzZShzdHJlYW0sIHN0YXRlKTsKICAgICAgICBzdGF0ZS5sYXN0VG9rZW4gPSB7CiAgICAgICAgICBzdHlsZTogc3R5bGUsCiAgICAgICAgICBpbmRlbnQ6IHN0cmVhbS5pbmRlbnRhdGlvbigpLAogICAgICAgICAgY29udGVudDogc3RyZWFtLmN1cnJlbnQoKQogICAgICAgIH07CiAgICAgICAgcmV0dXJuIHN0eWxlLnJlcGxhY2UoL1wuL2csICcgJyk7CiAgICAgIH0sCiAgICAgIGluZGVudDogZnVuY3Rpb24oc3RhdGUpewogICAgICAgIHZhciBpbmRlbnRhdGlvbiA9IHN0YXRlLmxhc3RUb2tlbi5pbmRlbnQ7CiAgICAgICAgaWYgKHN0YXRlLmxhc3RUb2tlbi5jb250ZW50Lm1hdGNoKGluZGVudGVyKSkgewogICAgICAgICAgaW5kZW50YXRpb24gKz0gMjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGluZGVudGF0aW9uOwogICAgICB9CiAgICB9OwogICAgcmV0dXJuIGV4dGVybmFsOwogIH0pOwoKICB2YXIgaWRlbnRpZmllciA9ICcoPyFbXFxkXFxzXSlbJFxcd1xceEFBLVxcdUZGRENdKD86KD8hXFxzKVskXFx3XFx4QUEtXFx1RkZEQ118LVtBLVphLXpdKSonOwogIHZhciBpbmRlbnRlciA9IFJlZ0V4cCgnKD86Wyh7Wz06XXxbLX5dPnxcXGIoPzplKD86bHNlfHhwb3J0KXxkKD86b3xlZmF1bHQpfHQoPzpyeXxoZW4pfGZpbmFsbHl8aW1wb3J0KD86XFxzKmFsbCk/fGNvbnN0fHZhcnxsZXR8bmV3fGNhdGNoKD86XFxzKicgKyBpZGVudGlmaWVyICsgJyk/KSlcXHMqJCcpOwogIHZhciBrZXl3b3JkZW5kID0gJyg/IVskXFx3XXwtW0EtWmEtel18XFxzKjooPyFbOj1dKSknOwogIHZhciBzdHJpbmdmaWxsID0gewogICAgdG9rZW46ICdzdHJpbmcnLAogICAgcmVnZXg6ICcuKycKICB9OwogIHZhciBSdWxlcyA9IHsKICAgIHN0YXJ0OiBbCiAgICAgIHsKICAgICAgICB0b2tlbjogJ2NvbW1lbnQuZG9jJywKICAgICAgICByZWdleDogJy9cXConLAogICAgICAgIG5leHQ6ICdjb21tZW50JwogICAgICB9LCB7CiAgICAgICAgdG9rZW46ICdjb21tZW50JywKICAgICAgICByZWdleDogJyMuKicKICAgICAgfSwgewogICAgICAgIHRva2VuOiAna2V5d29yZCcsCiAgICAgICAgcmVnZXg6ICcoPzp0KD86aCg/OmlzfHJvd3xlbil8cnl8eXBlb2YhPyl8Yyg/Om9uKD86dGludWV8c3QpfGEoPzpzZXx0Y2gpfGxhc3MpfGkoPzpuKD86c3RhbmNlb2YpP3xtcCg/Om9ydCg/OlxccythbGwpP3xsZW1lbnRzKXxbZnNdKXxkKD86ZSg/OmZhdWx0fGxldGV8YnVnZ2VyKXxvKXxmKD86b3IoPzpcXHMrb3duKT98aW5hbGx5fHVuY3Rpb24pfHMoPzp1cGVyfHdpdGNoKXxlKD86bHNlfHgoPzp0ZW5kc3xwb3J0KXx2YWwpfGEoPzpuZHxyZ3VtZW50cyl8big/OmV3fG90KXx1big/Omxlc3N8dGlsKXx3KD86aGlsZXxpdGgpfG9bZnJdfHJldHVybnxicmVha3xsZXR8dmFyfGxvb3ApJyArIGtleXdvcmRlbmQKICAgICAgfSwgewogICAgICAgIHRva2VuOiAnY29uc3RhbnQubGFuZ3VhZ2UnLAogICAgICAgIHJlZ2V4OiAnKD86dHJ1ZXxmYWxzZXx5ZXN8bm98b258b2ZmfG51bGx8dm9pZHx1bmRlZmluZWQpJyArIGtleXdvcmRlbmQKICAgICAgfSwgewogICAgICAgIHRva2VuOiAnaW52YWxpZC5pbGxlZ2FsJywKICAgICAgICByZWdleDogJyg/OnAoPzphY2thZ2V8cig/Oml2YXRlfG90ZWN0ZWQpfHVibGljKXxpKD86bXBsZW1lbnRzfG50ZXJmYWNlKXxlbnVtfHN0YXRpY3x5aWVsZCknICsga2V5d29yZGVuZAogICAgICB9LCB7CiAgICAgICAgdG9rZW46ICdsYW5ndWFnZS5zdXBwb3J0LmNsYXNzJywKICAgICAgICByZWdleDogJyg/OlIoPzplKD86Z0V4cHxmZXJlbmNlRXJyb3IpfGFuZ2VFcnJvcil8Uyg/OnRyaW5nfHludGF4RXJyb3IpfEUoPzpycm9yfHZhbEVycm9yKXxBcnJheXxCb29sZWFufERhdGV8RnVuY3Rpb258TnVtYmVyfE9iamVjdHxUeXBlRXJyb3J8VVJJRXJyb3IpJyArIGtleXdvcmRlbmQKICAgICAgfSwgewogICAgICAgIHRva2VuOiAnbGFuZ3VhZ2Uuc3VwcG9ydC5mdW5jdGlvbicsCiAgICAgICAgcmVnZXg6ICcoPzppcyg/Ok5hTnxGaW5pdGUpfHBhcnNlKD86SW50fEZsb2F0KXxNYXRofEpTT058KD86ZW58ZGUpY29kZVVSSSg/OkNvbXBvbmVudCk/KScgKyBrZXl3b3JkZW5kCiAgICAgIH0sIHsKICAgICAgICB0b2tlbjogJ3ZhcmlhYmxlLmxhbmd1YWdlJywKICAgICAgICByZWdleDogJyg/OnQoPzpoYXR8aWx8byl8Zig/OnJvbXxhbGx0aHJvdWdoKXxpdHxieXxlKScgKyBrZXl3b3JkZW5kCiAgICAgIH0sIHsKICAgICAgICB0b2tlbjogJ2lkZW50aWZpZXInLAogICAgICAgIHJlZ2V4OiBpZGVudGlmaWVyICsgJ1xccyo6KD8hWzo9XSknCiAgICAgIH0sIHsKICAgICAgICB0b2tlbjogJ3ZhcmlhYmxlJywKICAgICAgICByZWdleDogaWRlbnRpZmllcgogICAgICB9LCB7CiAgICAgICAgdG9rZW46ICdrZXl3b3JkLm9wZXJhdG9yJywKICAgICAgICByZWdleDogJyg/OlxcLnszfXxcXHMrXFw/KScKICAgICAgfSwgewogICAgICAgIHRva2VuOiAna2V5d29yZC52YXJpYWJsZScsCiAgICAgICAgcmVnZXg6ICcoPzpAK3w6OnxcXC5cXC4pJywKICAgICAgICBuZXh0OiAna2V5JwogICAgICB9LCB7CiAgICAgICAgdG9rZW46ICdrZXl3b3JkLm9wZXJhdG9yJywKICAgICAgICByZWdleDogJ1xcLlxccyonLAogICAgICAgIG5leHQ6ICdrZXknCiAgICAgIH0sIHsKICAgICAgICB0b2tlbjogJ3N0cmluZycsCiAgICAgICAgcmVnZXg6ICdcXFxcXFxTW15cXHMsOyl9XFxdXSonCiAgICAgIH0sIHsKICAgICAgICB0b2tlbjogJ3N0cmluZy5kb2MnLAogICAgICAgIHJlZ2V4OiAnXCdcJ1wnJywKICAgICAgICBuZXh0OiAncWRvYycKICAgICAgfSwgewogICAgICAgIHRva2VuOiAnc3RyaW5nLmRvYycsCiAgICAgICAgcmVnZXg6ICciIiInLAogICAgICAgIG5leHQ6ICdxcWRvYycKICAgICAgfSwgewogICAgICAgIHRva2VuOiAnc3RyaW5nJywKICAgICAgICByZWdleDogJ1wnJywKICAgICAgICBuZXh0OiAncXN0cmluZycKICAgICAgfSwgewogICAgICAgIHRva2VuOiAnc3RyaW5nJywKICAgICAgICByZWdleDogJyInLAogICAgICAgIG5leHQ6ICdxcXN0cmluZycKICAgICAgfSwgewogICAgICAgIHRva2VuOiAnc3RyaW5nJywKICAgICAgICByZWdleDogJ2AnLAogICAgICAgIG5leHQ6ICdqcycKICAgICAgfSwgewogICAgICAgIHRva2VuOiAnc3RyaW5nJywKICAgICAgICByZWdleDogJzxcXFsnLAogICAgICAgIG5leHQ6ICd3b3JkcycKICAgICAgfSwgewogICAgICAgIHRva2VuOiAnc3RyaW5nLnJlZ2V4JywKICAgICAgICByZWdleDogJy8vJywKICAgICAgICBuZXh0OiAnaGVyZWdleCcKICAgICAgfSwgewogICAgICAgIHRva2VuOiAnc3RyaW5nLnJlZ2V4JywKICAgICAgICByZWdleDogJ1xcLyg/OlteW1xcL1xcblxcXFxdKig/Oig/OlxcXFwufFxcW1teXFxdXFxuXFxcXF0qKD86XFxcXC5bXlxcXVxcblxcXFxdKikqXFxdKVteW1xcL1xcblxcXFxdKikqKVxcL1tnaW15JF17MCw0fScsCiAgICAgICAgbmV4dDogJ2tleScKICAgICAgfSwgewogICAgICAgIHRva2VuOiAnY29uc3RhbnQubnVtZXJpYycsCiAgICAgICAgcmVnZXg6ICcoPzoweFtcXGRhLWZBLUZdW1xcZGEtZkEtRl9dKnwoPzpbMi05XXxbMTJdXFxkfDNbMC02XSlyW1xcZGEtekEtWl1bXFxkYS16QS1aX10qfCg/OlxcZFtcXGRfXSooPzpcXC5cXGRbXFxkX10qKT98XFwuXFxkW1xcZF9dKikoPzplWystXT9cXGRbXFxkX10qKT9bXFx3JF0qKScKICAgICAgfSwgewogICAgICAgIHRva2VuOiAnbHBhcmVuJywKICAgICAgICByZWdleDogJ1soe1tdJwogICAgICB9LCB7CiAgICAgICAgdG9rZW46ICdycGFyZW4nLAogICAgICAgIHJlZ2V4OiAnWyl9XFxdXScsCiAgICAgICAgbmV4dDogJ2tleScKICAgICAgfSwgewogICAgICAgIHRva2VuOiAna2V5d29yZC5vcGVyYXRvcicsCiAgICAgICAgcmVnZXg6ICdcXFMrJwogICAgICB9LCB7CiAgICAgICAgdG9rZW46ICd0ZXh0JywKICAgICAgICByZWdleDogJ1xccysnCiAgICAgIH0KICAgIF0sCiAgICBoZXJlZ2V4OiBbCiAgICAgIHsKICAgICAgICB0b2tlbjogJ3N0cmluZy5yZWdleCcsCiAgICAgICAgcmVnZXg6ICcuKj8vL1tnaW15JD9dezAsNH0nLAogICAgICAgIG5leHQ6ICdzdGFydCcKICAgICAgfSwgewogICAgICAgIHRva2VuOiAnc3RyaW5nLnJlZ2V4JywKICAgICAgICByZWdleDogJ1xccyojeycKICAgICAgfSwgewogICAgICAgIHRva2VuOiAnY29tbWVudC5yZWdleCcsCiAgICAgICAgcmVnZXg6ICdcXHMrKD86Iy4qKT8nCiAgICAgIH0sIHsKICAgICAgICB0b2tlbjogJ3N0cmluZy5yZWdleCcsCiAgICAgICAgcmVnZXg6ICdcXFMrJwogICAgICB9CiAgICBdLAogICAga2V5OiBbCiAgICAgIHsKICAgICAgICB0b2tlbjogJ2tleXdvcmQub3BlcmF0b3InLAogICAgICAgIHJlZ2V4OiAnWy4/QCFdKycKICAgICAgfSwgewogICAgICAgIHRva2VuOiAnaWRlbnRpZmllcicsCiAgICAgICAgcmVnZXg6IGlkZW50aWZpZXIsCiAgICAgICAgbmV4dDogJ3N0YXJ0JwogICAgICB9LCB7CiAgICAgICAgdG9rZW46ICd0ZXh0JywKICAgICAgICByZWdleDogJycsCiAgICAgICAgbmV4dDogJ3N0YXJ0JwogICAgICB9CiAgICBdLAogICAgY29tbWVudDogWwogICAgICB7CiAgICAgICAgdG9rZW46ICdjb21tZW50LmRvYycsCiAgICAgICAgcmVnZXg6ICcuKj9cXCovJywKICAgICAgICBuZXh0OiAnc3RhcnQnCiAgICAgIH0sIHsKICAgICAgICB0b2tlbjogJ2NvbW1lbnQuZG9jJywKICAgICAgICByZWdleDogJy4rJwogICAgICB9CiAgICBdLAogICAgcWRvYzogWwogICAgICB7CiAgICAgICAgdG9rZW46ICdzdHJpbmcnLAogICAgICAgIHJlZ2V4OiAiLio/JycnIiwKICAgICAgICBuZXh0OiAna2V5JwogICAgICB9LCBzdHJpbmdmaWxsCiAgICBdLAogICAgcXFkb2M6IFsKICAgICAgewogICAgICAgIHRva2VuOiAnc3RyaW5nJywKICAgICAgICByZWdleDogJy4qPyIiIicsCiAgICAgICAgbmV4dDogJ2tleScKICAgICAgfSwgc3RyaW5nZmlsbAogICAgXSwKICAgIHFzdHJpbmc6IFsKICAgICAgewogICAgICAgIHRva2VuOiAnc3RyaW5nJywKICAgICAgICByZWdleDogJ1teXFxcXFwnXSooPzpcXFxcLlteXFxcXFwnXSopKlwnJywKICAgICAgICBuZXh0OiAna2V5JwogICAgICB9LCBzdHJpbmdmaWxsCiAgICBdLAogICAgcXFzdHJpbmc6IFsKICAgICAgewogICAgICAgIHRva2VuOiAnc3RyaW5nJywKICAgICAgICByZWdleDogJ1teXFxcXCJdKig/OlxcXFwuW15cXFxcIl0qKSoiJywKICAgICAgICBuZXh0OiAna2V5JwogICAgICB9LCBzdHJpbmdmaWxsCiAgICBdLAogICAganM6IFsKICAgICAgewogICAgICAgIHRva2VuOiAnc3RyaW5nJywKICAgICAgICByZWdleDogJ1teXFxcXGBdKig/OlxcXFwuW15cXFxcYF0qKSpgJywKICAgICAgICBuZXh0OiAna2V5JwogICAgICB9LCBzdHJpbmdmaWxsCiAgICBdLAogICAgd29yZHM6IFsKICAgICAgewogICAgICAgIHRva2VuOiAnc3RyaW5nJywKICAgICAgICByZWdleDogJy4qP1xcXT4nLAogICAgICAgIG5leHQ6ICdrZXknCiAgICAgIH0sIHN0cmluZ2ZpbGwKICAgIF0KICB9OwogIGZvciAodmFyIGlkeCBpbiBSdWxlcykgewogICAgdmFyIHIgPSBSdWxlc1tpZHhdOwogICAgaWYgKHIuc3BsaWNlKSB7CiAgICAgIGZvciAodmFyIGkgPSAwLCBsZW4gPSByLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7CiAgICAgICAgdmFyIHJyID0gcltpXTsKICAgICAgICBpZiAodHlwZW9mIHJyLnJlZ2V4ID09PSAnc3RyaW5nJykgewogICAgICAgICAgUnVsZXNbaWR4XVtpXS5yZWdleCA9IG5ldyBSZWdFeHAoJ14nICsgcnIucmVnZXgpOwogICAgICAgIH0KICAgICAgfQogICAgfSBlbHNlIGlmICh0eXBlb2YgcnIucmVnZXggPT09ICdzdHJpbmcnKSB7CiAgICAgIFJ1bGVzW2lkeF0ucmVnZXggPSBuZXcgUmVnRXhwKCdeJyArIHIucmVnZXgpOwogICAgfQogIH0KCiAgQ29kZU1pcnJvci5kZWZpbmVNSU1FKCd0ZXh0L3gtbGl2ZXNjcmlwdCcsICdsaXZlc2NyaXB0Jyk7Cgp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/lua/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/lua/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogTHVhIG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL3RoZW1lL25lYXQuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2FkZG9uL2VkaXQvbWF0Y2hicmFja2V0cy5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi8uLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJsdWEuanMiPjwvc2NyaXB0Pgo8c3R5bGU+LkNvZGVNaXJyb3Ige2JvcmRlcjogMXB4IHNvbGlkIGJsYWNrO308L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxoMT5Db2RlTWlycm9yPC9oMT48aW1nIGlkPWxvZ28gc3JjPSIuLi8uLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5MYW5ndWFnZSBtb2RlczwvYT4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+THVhPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5MdWEgbW9kZTwvaDI+Cjxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+Ci0tW1sKZXhhbXBsZSB1c2VsZXNzIGNvZGUgdG8gc2hvdyBsdWEgc3ludGF4IGhpZ2hsaWdodGluZwp0aGlzIGlzIG11bHRpbGluZSBjb21tZW50Cl1dCgpmdW5jdGlvbiBibGFoYmxhaGJsYWgoeCkKCiAgbG9jYWwgdGFibGUgPSB7CiAgICAiYXNkIiA9IDEyMywKICAgICJ4IiA9IDAuMzQsICAKICB9CiAgaWYgeCB+PSAzIHRoZW4KICAgIHByaW50KCB4ICkKICBlbHNlaWYgeCA9PSAic3RyaW5nIgogICAgbXlfY3VzdG9tX2Z1bmN0aW9uKCAweDM0ICkKICBlbHNlCiAgICB1bmtub3duX2Z1bmN0aW9uKCAic29tZSBzdHJpbmciICkKICBlbmQKCiAgLS1zaW5nbGUgbGluZSBjb21tZW50CiAgCmVuZAoKZnVuY3Rpb24gYmxhYmxhYmxhMygpCgogIGZvciBrLHYgaW4gaXBhaXJzKCB0YWJsZSApIGRvCiAgICAtLWFiY2RlLi4KICAgIHk9Wz1bCiAgeD1bWwogICAgICB4IGlzIGEgbXVsdGkgbGluZSBzdHJpbmcKICAgXV0KICBidXQgaXRzIGRlZmluaXRpb24gaXMgaXNpZGUgYSBoaWdoZXN0IGxldmVsIHN0cmluZyEKICBdPV0KICAgIHByaW50KCIgXCJcIiAiKQoKICAgIHMgPSBtYXRoLnNpbiggeCApCiAgZW5kCgplbmQKPC90ZXh0YXJlYT48L2Zvcm0+CiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgICAgIG1hdGNoQnJhY2tldHM6IHRydWUsCiAgICAgICAgdGhlbWU6ICJuZWF0IgogICAgICB9KTsKICAgIDwvc2NyaXB0PgoKICAgIDxwPkxvb3NlbHkgYmFzZWQgb24gRnJhbmNpc3plawogICAgV2F3cnphaydzIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldC8xL2NvbnRyaWIvbHVhIj5Db2RlTWlycm9yCiAgICAxIG1vZGU8L2E+LiBPbmUgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIgaXMKICAgIHN1cHBvcnRlZCwgPGNvZGU+c3BlY2lhbHM8L2NvZGU+LCB0byB3aGljaCB5b3UgY2FuIHByb3ZpZGUgYW4KICAgIGFycmF5IG9mIHN0cmluZ3MgdG8gaGF2ZSB0aG9zZSBpZGVudGlmaWVycyBoaWdobGlnaHRlZCB3aXRoCiAgICB0aGUgPGNvZGU+bHVhLXNwZWNpYWw8L2NvZGU+IHN0eWxlLjwvcD4KICAgIDxwPjxzdHJvbmc+TUlNRSB0eXBlcyBkZWZpbmVkOjwvc3Ryb25nPiA8Y29kZT50ZXh0L3gtbHVhPC9jb2RlPi48L3A+CgogIDwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/lua/lua.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovLyBMVUEgbW9kZS4gUG9ydGVkIHRvIENvZGVNaXJyb3IgMiBmcm9tIEZyYW5jaXN6ZWsgV2F3cnphaydzCi8vIENvZGVNaXJyb3IgMSBtb2RlLgovLyBoaWdobGlnaHRzIGtleXdvcmRzLCBzdHJpbmdzLCBjb21tZW50cyAobm8gbGV2ZWxpbmcgc3VwcG9ydGVkISAoIls9PVsiKSksIHRva2VucywgYmFzaWMgaW5kZW50aW5nCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJsdWEiLCBmdW5jdGlvbihjb25maWcsIHBhcnNlckNvbmZpZykgewogIHZhciBpbmRlbnRVbml0ID0gY29uZmlnLmluZGVudFVuaXQ7CgogIGZ1bmN0aW9uIHByZWZpeFJFKHdvcmRzKSB7CiAgICByZXR1cm4gbmV3IFJlZ0V4cCgiXig/OiIgKyB3b3Jkcy5qb2luKCJ8IikgKyAiKSIsICJpIik7CiAgfQogIGZ1bmN0aW9uIHdvcmRSRSh3b3JkcykgewogICAgcmV0dXJuIG5ldyBSZWdFeHAoIl4oPzoiICsgd29yZHMuam9pbigifCIpICsgIikkIiwgImkiKTsKICB9CiAgdmFyIHNwZWNpYWxzID0gd29yZFJFKHBhcnNlckNvbmZpZy5zcGVjaWFscyB8fCBbXSk7CgogIC8vIGxvbmcgbGlzdCBvZiBzdGFuZGFyZCBmdW5jdGlvbnMgZnJvbSBsdWEgbWFudWFsCiAgdmFyIGJ1aWx0aW5zID0gd29yZFJFKFsKICAgICJfRyIsIl9WRVJTSU9OIiwiYXNzZXJ0IiwiY29sbGVjdGdhcmJhZ2UiLCJkb2ZpbGUiLCJlcnJvciIsImdldGZlbnYiLCJnZXRtZXRhdGFibGUiLCJpcGFpcnMiLCJsb2FkIiwKICAgICJsb2FkZmlsZSIsImxvYWRzdHJpbmciLCJtb2R1bGUiLCJuZXh0IiwicGFpcnMiLCJwY2FsbCIsInByaW50IiwicmF3ZXF1YWwiLCJyYXdnZXQiLCJyYXdzZXQiLCJyZXF1aXJlIiwKICAgICJzZWxlY3QiLCJzZXRmZW52Iiwic2V0bWV0YXRhYmxlIiwidG9udW1iZXIiLCJ0b3N0cmluZyIsInR5cGUiLCJ1bnBhY2siLCJ4cGNhbGwiLAoKICAgICJjb3JvdXRpbmUuY3JlYXRlIiwiY29yb3V0aW5lLnJlc3VtZSIsImNvcm91dGluZS5ydW5uaW5nIiwiY29yb3V0aW5lLnN0YXR1cyIsImNvcm91dGluZS53cmFwIiwiY29yb3V0aW5lLnlpZWxkIiwKCiAgICAiZGVidWcuZGVidWciLCJkZWJ1Zy5nZXRmZW52IiwiZGVidWcuZ2V0aG9vayIsImRlYnVnLmdldGluZm8iLCJkZWJ1Zy5nZXRsb2NhbCIsImRlYnVnLmdldG1ldGF0YWJsZSIsCiAgICAiZGVidWcuZ2V0cmVnaXN0cnkiLCJkZWJ1Zy5nZXR1cHZhbHVlIiwiZGVidWcuc2V0ZmVudiIsImRlYnVnLnNldGhvb2siLCJkZWJ1Zy5zZXRsb2NhbCIsImRlYnVnLnNldG1ldGF0YWJsZSIsCiAgICAiZGVidWcuc2V0dXB2YWx1ZSIsImRlYnVnLnRyYWNlYmFjayIsCgogICAgImNsb3NlIiwiZmx1c2giLCJsaW5lcyIsInJlYWQiLCJzZWVrIiwic2V0dmJ1ZiIsIndyaXRlIiwKCiAgICAiaW8uY2xvc2UiLCJpby5mbHVzaCIsImlvLmlucHV0IiwiaW8ubGluZXMiLCJpby5vcGVuIiwiaW8ub3V0cHV0IiwiaW8ucG9wZW4iLCJpby5yZWFkIiwiaW8uc3RkZXJyIiwiaW8uc3RkaW4iLAogICAgImlvLnN0ZG91dCIsImlvLnRtcGZpbGUiLCJpby50eXBlIiwiaW8ud3JpdGUiLAoKICAgICJtYXRoLmFicyIsIm1hdGguYWNvcyIsIm1hdGguYXNpbiIsIm1hdGguYXRhbiIsIm1hdGguYXRhbjIiLCJtYXRoLmNlaWwiLCJtYXRoLmNvcyIsIm1hdGguY29zaCIsIm1hdGguZGVnIiwKICAgICJtYXRoLmV4cCIsIm1hdGguZmxvb3IiLCJtYXRoLmZtb2QiLCJtYXRoLmZyZXhwIiwibWF0aC5odWdlIiwibWF0aC5sZGV4cCIsIm1hdGgubG9nIiwibWF0aC5sb2cxMCIsIm1hdGgubWF4IiwKICAgICJtYXRoLm1pbiIsIm1hdGgubW9kZiIsIm1hdGgucGkiLCJtYXRoLnBvdyIsIm1hdGgucmFkIiwibWF0aC5yYW5kb20iLCJtYXRoLnJhbmRvbXNlZWQiLCJtYXRoLnNpbiIsIm1hdGguc2luaCIsCiAgICAibWF0aC5zcXJ0IiwibWF0aC50YW4iLCJtYXRoLnRhbmgiLAoKICAgICJvcy5jbG9jayIsIm9zLmRhdGUiLCJvcy5kaWZmdGltZSIsIm9zLmV4ZWN1dGUiLCJvcy5leGl0Iiwib3MuZ2V0ZW52Iiwib3MucmVtb3ZlIiwib3MucmVuYW1lIiwib3Muc2V0bG9jYWxlIiwKICAgICJvcy50aW1lIiwib3MudG1wbmFtZSIsCgogICAgInBhY2thZ2UuY3BhdGgiLCJwYWNrYWdlLmxvYWRlZCIsInBhY2thZ2UubG9hZGVycyIsInBhY2thZ2UubG9hZGxpYiIsInBhY2thZ2UucGF0aCIsInBhY2thZ2UucHJlbG9hZCIsCiAgICAicGFja2FnZS5zZWVhbGwiLAoKICAgICJzdHJpbmcuYnl0ZSIsInN0cmluZy5jaGFyIiwic3RyaW5nLmR1bXAiLCJzdHJpbmcuZmluZCIsInN0cmluZy5mb3JtYXQiLCJzdHJpbmcuZ21hdGNoIiwic3RyaW5nLmdzdWIiLAogICAgInN0cmluZy5sZW4iLCJzdHJpbmcubG93ZXIiLCJzdHJpbmcubWF0Y2giLCJzdHJpbmcucmVwIiwic3RyaW5nLnJldmVyc2UiLCJzdHJpbmcuc3ViIiwic3RyaW5nLnVwcGVyIiwKCiAgICAidGFibGUuY29uY2F0IiwidGFibGUuaW5zZXJ0IiwidGFibGUubWF4biIsInRhYmxlLnJlbW92ZSIsInRhYmxlLnNvcnQiCiAgXSk7CiAgdmFyIGtleXdvcmRzID0gd29yZFJFKFsiYW5kIiwiYnJlYWsiLCJlbHNlaWYiLCJmYWxzZSIsIm5pbCIsIm5vdCIsIm9yIiwicmV0dXJuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICJ0cnVlIiwiZnVuY3Rpb24iLCAiZW5kIiwgImlmIiwgInRoZW4iLCAiZWxzZSIsICJkbyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAid2hpbGUiLCAicmVwZWF0IiwgInVudGlsIiwgImZvciIsICJpbiIsICJsb2NhbCIgXSk7CgogIHZhciBpbmRlbnRUb2tlbnMgPSB3b3JkUkUoWyJmdW5jdGlvbiIsICJpZiIsInJlcGVhdCIsImRvIiwgIlxcKCIsICJ7Il0pOwogIHZhciBkZWRlbnRUb2tlbnMgPSB3b3JkUkUoWyJlbmQiLCAidW50aWwiLCAiXFwpIiwgIn0iXSk7CiAgdmFyIGRlZGVudFBhcnRpYWwgPSBwcmVmaXhSRShbImVuZCIsICJ1bnRpbCIsICJcXCkiLCAifSIsICJlbHNlIiwgImVsc2VpZiJdKTsKCiAgZnVuY3Rpb24gcmVhZEJyYWNrZXQoc3RyZWFtKSB7CiAgICB2YXIgbGV2ZWwgPSAwOwogICAgd2hpbGUgKHN0cmVhbS5lYXQoIj0iKSkgKytsZXZlbDsKICAgIHN0cmVhbS5lYXQoIlsiKTsKICAgIHJldHVybiBsZXZlbDsKICB9CgogIGZ1bmN0aW9uIG5vcm1hbChzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpOwogICAgaWYgKGNoID09ICItIiAmJiBzdHJlYW0uZWF0KCItIikpIHsKICAgICAgaWYgKHN0cmVhbS5lYXQoIlsiKSAmJiBzdHJlYW0uZWF0KCJbIikpCiAgICAgICAgcmV0dXJuIChzdGF0ZS5jdXIgPSBicmFja2V0ZWQocmVhZEJyYWNrZXQoc3RyZWFtKSwgImNvbW1lbnQiKSkoc3RyZWFtLCBzdGF0ZSk7CiAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgcmV0dXJuICJjb21tZW50IjsKICAgIH0KICAgIGlmIChjaCA9PSAiXCIiIHx8IGNoID09ICInIikKICAgICAgcmV0dXJuIChzdGF0ZS5jdXIgPSBzdHJpbmcoY2gpKShzdHJlYW0sIHN0YXRlKTsKICAgIGlmIChjaCA9PSAiWyIgJiYgL1tcWz1dLy50ZXN0KHN0cmVhbS5wZWVrKCkpKQogICAgICByZXR1cm4gKHN0YXRlLmN1ciA9IGJyYWNrZXRlZChyZWFkQnJhY2tldChzdHJlYW0pLCAic3RyaW5nIikpKHN0cmVhbSwgc3RhdGUpOwogICAgaWYgKC9cZC8udGVzdChjaCkpIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXHcuJV0vKTsKICAgICAgcmV0dXJuICJudW1iZXIiOwogICAgfQogICAgaWYgKC9bXHdfXS8udGVzdChjaCkpIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXHdcXFwtXy5dLyk7CiAgICAgIHJldHVybiAidmFyaWFibGUiOwogICAgfQogICAgcmV0dXJuIG51bGw7CiAgfQoKICBmdW5jdGlvbiBicmFja2V0ZWQobGV2ZWwsIHN0eWxlKSB7CiAgICByZXR1cm4gZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICB2YXIgY3VybGV2ID0gbnVsbCwgY2g7CiAgICAgIHdoaWxlICgoY2ggPSBzdHJlYW0ubmV4dCgpKSAhPSBudWxsKSB7CiAgICAgICAgaWYgKGN1cmxldiA9PSBudWxsKSB7aWYgKGNoID09ICJdIikgY3VybGV2ID0gMDt9CiAgICAgICAgZWxzZSBpZiAoY2ggPT0gIj0iKSArK2N1cmxldjsKICAgICAgICBlbHNlIGlmIChjaCA9PSAiXSIgJiYgY3VybGV2ID09IGxldmVsKSB7IHN0YXRlLmN1ciA9IG5vcm1hbDsgYnJlYWs7IH0KICAgICAgICBlbHNlIGN1cmxldiA9IG51bGw7CiAgICAgIH0KICAgICAgcmV0dXJuIHN0eWxlOwogICAgfTsKICB9CgogIGZ1bmN0aW9uIHN0cmluZyhxdW90ZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgdmFyIGVzY2FwZWQgPSBmYWxzZSwgY2g7CiAgICAgIHdoaWxlICgoY2ggPSBzdHJlYW0ubmV4dCgpKSAhPSBudWxsKSB7CiAgICAgICAgaWYgKGNoID09IHF1b3RlICYmICFlc2NhcGVkKSBicmVhazsKICAgICAgICBlc2NhcGVkID0gIWVzY2FwZWQgJiYgY2ggPT0gIlxcIjsKICAgICAgfQogICAgICBpZiAoIWVzY2FwZWQpIHN0YXRlLmN1ciA9IG5vcm1hbDsKICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgfTsKICB9CgogIHJldHVybiB7CiAgICBzdGFydFN0YXRlOiBmdW5jdGlvbihiYXNlY29sKSB7CiAgICAgIHJldHVybiB7YmFzZWNvbDogYmFzZWNvbCB8fCAwLCBpbmRlbnREZXB0aDogMCwgY3VyOiBub3JtYWx9OwogICAgfSwKCiAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICBpZiAoc3RyZWFtLmVhdFNwYWNlKCkpIHJldHVybiBudWxsOwogICAgICB2YXIgc3R5bGUgPSBzdGF0ZS5jdXIoc3RyZWFtLCBzdGF0ZSk7CiAgICAgIHZhciB3b3JkID0gc3RyZWFtLmN1cnJlbnQoKTsKICAgICAgaWYgKHN0eWxlID09ICJ2YXJpYWJsZSIpIHsKICAgICAgICBpZiAoa2V5d29yZHMudGVzdCh3b3JkKSkgc3R5bGUgPSAia2V5d29yZCI7CiAgICAgICAgZWxzZSBpZiAoYnVpbHRpbnMudGVzdCh3b3JkKSkgc3R5bGUgPSAiYnVpbHRpbiI7CiAgICAgICAgZWxzZSBpZiAoc3BlY2lhbHMudGVzdCh3b3JkKSkgc3R5bGUgPSAidmFyaWFibGUtMiI7CiAgICAgIH0KICAgICAgaWYgKChzdHlsZSAhPSAiY29tbWVudCIpICYmIChzdHlsZSAhPSAic3RyaW5nIikpewogICAgICAgIGlmIChpbmRlbnRUb2tlbnMudGVzdCh3b3JkKSkgKytzdGF0ZS5pbmRlbnREZXB0aDsKICAgICAgICBlbHNlIGlmIChkZWRlbnRUb2tlbnMudGVzdCh3b3JkKSkgLS1zdGF0ZS5pbmRlbnREZXB0aDsKICAgICAgfQogICAgICByZXR1cm4gc3R5bGU7CiAgICB9LAoKICAgIGluZGVudDogZnVuY3Rpb24oc3RhdGUsIHRleHRBZnRlcikgewogICAgICB2YXIgY2xvc2luZyA9IGRlZGVudFBhcnRpYWwudGVzdCh0ZXh0QWZ0ZXIpOwogICAgICByZXR1cm4gc3RhdGUuYmFzZWNvbCArIGluZGVudFVuaXQgKiAoc3RhdGUuaW5kZW50RGVwdGggLSAoY2xvc2luZyA/IDEgOiAwKSk7CiAgICB9LAoKICAgIGxpbmVDb21tZW50OiAiLS0iLAogICAgYmxvY2tDb21tZW50U3RhcnQ6ICItLVtbIiwKICAgIGJsb2NrQ29tbWVudEVuZDogIl1dIgogIH07Cn0pOwoKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtbHVhIiwgImx1YSIpOwoKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/markdown/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/markdown/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogTWFya2Rvd24gbW9kZTwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uLy4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxzY3JpcHQgc3JjPSIuLi8uLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi8uLi9hZGRvbi9lZGl0L2NvbnRpbnVlbGlzdC5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi94bWwveG1sLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Im1hcmtkb3duLmpzIj48L3NjcmlwdD4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KICAgICAgLkNvZGVNaXJyb3Ige2JvcmRlci10b3A6IDFweCBzb2xpZCBibGFjazsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO30KICAgICAgLmNtLXMtZGVmYXVsdCAuY20tdHJhaWxpbmctc3BhY2UtYTpiZWZvcmUsCiAgICAgIC5jbS1zLWRlZmF1bHQgLmNtLXRyYWlsaW5nLXNwYWNlLWI6YmVmb3JlIHtwb3NpdGlvbjogYWJzb2x1dGU7IGNvbnRlbnQ6ICJcMDBCNyI7IGNvbG9yOiAjNzc3O30KICAgICAgLmNtLXMtZGVmYXVsdCAuY20tdHJhaWxpbmctc3BhY2UtbmV3LWxpbmU6YmVmb3JlIHtwb3NpdGlvbjogYWJzb2x1dGU7IGNvbnRlbnQ6ICJcMjFCNSI7IGNvbG9yOiAjNzc3O30KICAgIDwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGgxPkNvZGVNaXJyb3I8L2gxPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5NYXJrZG93bjwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+TWFya2Rvd24gbW9kZTwvaDI+Cjxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+Ck1hcmtkb3duOiBCYXNpY3MKPT09PT09PT09PT09PT09PQoKJmx0O3VsIGlkPSJQcm9qZWN0U3VibWVudSImZ3Q7CiAgICAmbHQ7bGkmZ3Q7Jmx0O2EgaHJlZj0iL3Byb2plY3RzL21hcmtkb3duLyIgdGl0bGU9Ik1hcmtkb3duIFByb2plY3QgUGFnZSImZ3Q7TWFpbiZsdDsvYSZndDsmbHQ7L2xpJmd0OwogICAgJmx0O2xpJmd0OyZsdDthIGNsYXNzPSJzZWxlY3RlZCIgdGl0bGU9Ik1hcmtkb3duIEJhc2ljcyImZ3Q7QmFzaWNzJmx0Oy9hJmd0OyZsdDsvbGkmZ3Q7CiAgICAmbHQ7bGkmZ3Q7Jmx0O2EgaHJlZj0iL3Byb2plY3RzL21hcmtkb3duL3N5bnRheCIgdGl0bGU9Ik1hcmtkb3duIFN5bnRheCBEb2N1bWVudGF0aW9uIiZndDtTeW50YXgmbHQ7L2EmZ3Q7Jmx0Oy9saSZndDsKICAgICZsdDtsaSZndDsmbHQ7YSBocmVmPSIvcHJvamVjdHMvbWFya2Rvd24vbGljZW5zZSIgdGl0bGU9IlByaWNpbmcgYW5kIExpY2Vuc2UgSW5mb3JtYXRpb24iJmd0O0xpY2Vuc2UmbHQ7L2EmZ3Q7Jmx0Oy9saSZndDsKICAgICZsdDtsaSZndDsmbHQ7YSBocmVmPSIvcHJvamVjdHMvbWFya2Rvd24vZGluZ3VzIiB0aXRsZT0iT25saW5lIE1hcmtkb3duIFdlYiBGb3JtIiZndDtEaW5ndXMmbHQ7L2EmZ3Q7Jmx0Oy9saSZndDsKJmx0Oy91bCZndDsKCgpHZXR0aW5nIHRoZSBHaXN0IG9mIE1hcmtkb3duJ3MgRm9ybWF0dGluZyBTeW50YXgKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpUaGlzIHBhZ2Ugb2ZmZXJzIGEgYnJpZWYgb3ZlcnZpZXcgb2Ygd2hhdCBpdCdzIGxpa2UgdG8gdXNlIE1hcmtkb3duLgpUaGUgW3N5bnRheCBwYWdlXSBbc10gcHJvdmlkZXMgY29tcGxldGUsIGRldGFpbGVkIGRvY3VtZW50YXRpb24gZm9yCmV2ZXJ5IGZlYXR1cmUsIGJ1dCBNYXJrZG93biBzaG91bGQgYmUgdmVyeSBlYXN5IHRvIHBpY2sgdXAgc2ltcGx5IGJ5Cmxvb2tpbmcgYXQgYSBmZXcgZXhhbXBsZXMgb2YgaXQgaW4gYWN0aW9uLiBUaGUgZXhhbXBsZXMgb24gdGhpcyBwYWdlCmFyZSB3cml0dGVuIGluIGEgYmVmb3JlL2FmdGVyIHN0eWxlLCBzaG93aW5nIGV4YW1wbGUgc3ludGF4IGFuZCB0aGUKSFRNTCBvdXRwdXQgcHJvZHVjZWQgYnkgTWFya2Rvd24uCgpJdCdzIGFsc28gaGVscGZ1bCB0byBzaW1wbHkgdHJ5IE1hcmtkb3duIG91dDsgdGhlIFtEaW5ndXNdIFtkXSBpcyBhCndlYiBhcHBsaWNhdGlvbiB0aGF0IGFsbG93cyB5b3UgdHlwZSB5b3VyIG93biBNYXJrZG93bi1mb3JtYXR0ZWQgdGV4dAphbmQgdHJhbnNsYXRlIGl0IHRvIFhIVE1MLgoKKipOb3RlOioqIFRoaXMgZG9jdW1lbnQgaXMgaXRzZWxmIHdyaXR0ZW4gdXNpbmcgTWFya2Rvd247IHlvdQpjYW4gW3NlZSB0aGUgc291cmNlIGZvciBpdCBieSBhZGRpbmcgJy50ZXh0JyB0byB0aGUgVVJMXSBbc3JjXS4KCiAgW3NdOiAvcHJvamVjdHMvbWFya2Rvd24vc3ludGF4ICAiTWFya2Rvd24gU3ludGF4IgogIFtkXTogL3Byb2plY3RzL21hcmtkb3duL2Rpbmd1cyAgIk1hcmtkb3duIERpbmd1cyIKICBbc3JjXTogL3Byb2plY3RzL21hcmtkb3duL2Jhc2ljcy50ZXh0CgoKIyMgUGFyYWdyYXBocywgSGVhZGVycywgQmxvY2txdW90ZXMgIyMKCkEgcGFyYWdyYXBoIGlzIHNpbXBseSBvbmUgb3IgbW9yZSBjb25zZWN1dGl2ZSBsaW5lcyBvZiB0ZXh0LCBzZXBhcmF0ZWQKYnkgb25lIG9yIG1vcmUgYmxhbmsgbGluZXMuIChBIGJsYW5rIGxpbmUgaXMgYW55IGxpbmUgdGhhdCBsb29rcyBsaWtlCmEgYmxhbmsgbGluZSAtLSBhIGxpbmUgY29udGFpbmluZyBub3RoaW5nIGJ1dCBzcGFjZXMgb3IgdGFicyBpcwpjb25zaWRlcmVkIGJsYW5rLikgTm9ybWFsIHBhcmFncmFwaHMgc2hvdWxkIG5vdCBiZSBpbmRlbnRlZCB3aXRoCnNwYWNlcyBvciB0YWJzLgoKTWFya2Rvd24gb2ZmZXJzIHR3byBzdHlsZXMgb2YgaGVhZGVyczogKlNldGV4dCogYW5kICphdHgqLgpTZXRleHQtc3R5bGUgaGVhZGVycyBmb3IgYCZsdDtoMSZndDtgIGFuZCBgJmx0O2gyJmd0O2AgYXJlIGNyZWF0ZWQgYnkKInVuZGVybGluaW5nIiB3aXRoIGVxdWFsIHNpZ25zIChgPWApIGFuZCBoeXBoZW5zIChgLWApLCByZXNwZWN0aXZlbHkuClRvIGNyZWF0ZSBhbiBhdHgtc3R5bGUgaGVhZGVyLCB5b3UgcHV0IDEtNiBoYXNoIG1hcmtzIChgI2ApIGF0IHRoZQpiZWdpbm5pbmcgb2YgdGhlIGxpbmUgLS0gdGhlIG51bWJlciBvZiBoYXNoZXMgZXF1YWxzIHRoZSByZXN1bHRpbmcKSFRNTCBoZWFkZXIgbGV2ZWwuCgpCbG9ja3F1b3RlcyBhcmUgaW5kaWNhdGVkIHVzaW5nIGVtYWlsLXN0eWxlICdgJmd0O2AnIGFuZ2xlIGJyYWNrZXRzLgoKTWFya2Rvd246CgogICAgQSBGaXJzdCBMZXZlbCBIZWFkZXIKICAgID09PT09PT09PT09PT09PT09PT09CiAgICAKICAgIEEgU2Vjb25kIExldmVsIEhlYWRlcgogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgTm93IGlzIHRoZSB0aW1lIGZvciBhbGwgZ29vZCBtZW4gdG8gY29tZSB0bwogICAgdGhlIGFpZCBvZiB0aGVpciBjb3VudHJ5LiBUaGlzIGlzIGp1c3QgYQogICAgcmVndWxhciBwYXJhZ3JhcGguCgogICAgVGhlIHF1aWNrIGJyb3duIGZveCBqdW1wZWQgb3ZlciB0aGUgbGF6eQogICAgZG9nJ3MgYmFjay4KICAgIAogICAgIyMjIEhlYWRlciAzCgogICAgJmd0OyBUaGlzIGlzIGEgYmxvY2txdW90ZS4KICAgICZndDsgCiAgICAmZ3Q7IFRoaXMgaXMgdGhlIHNlY29uZCBwYXJhZ3JhcGggaW4gdGhlIGJsb2NrcXVvdGUuCiAgICAmZ3Q7CiAgICAmZ3Q7ICMjIFRoaXMgaXMgYW4gSDIgaW4gYSBibG9ja3F1b3RlCgoKT3V0cHV0OgoKICAgICZsdDtoMSZndDtBIEZpcnN0IExldmVsIEhlYWRlciZsdDsvaDEmZ3Q7CiAgICAKICAgICZsdDtoMiZndDtBIFNlY29uZCBMZXZlbCBIZWFkZXImbHQ7L2gyJmd0OwogICAgCiAgICAmbHQ7cCZndDtOb3cgaXMgdGhlIHRpbWUgZm9yIGFsbCBnb29kIG1lbiB0byBjb21lIHRvCiAgICB0aGUgYWlkIG9mIHRoZWlyIGNvdW50cnkuIFRoaXMgaXMganVzdCBhCiAgICByZWd1bGFyIHBhcmFncmFwaC4mbHQ7L3AmZ3Q7CiAgICAKICAgICZsdDtwJmd0O1RoZSBxdWljayBicm93biBmb3gganVtcGVkIG92ZXIgdGhlIGxhenkKICAgIGRvZydzIGJhY2suJmx0Oy9wJmd0OwogICAgCiAgICAmbHQ7aDMmZ3Q7SGVhZGVyIDMmbHQ7L2gzJmd0OwogICAgCiAgICAmbHQ7YmxvY2txdW90ZSZndDsKICAgICAgICAmbHQ7cCZndDtUaGlzIGlzIGEgYmxvY2txdW90ZS4mbHQ7L3AmZ3Q7CiAgICAgICAgCiAgICAgICAgJmx0O3AmZ3Q7VGhpcyBpcyB0aGUgc2Vjb25kIHBhcmFncmFwaCBpbiB0aGUgYmxvY2txdW90ZS4mbHQ7L3AmZ3Q7CiAgICAgICAgCiAgICAgICAgJmx0O2gyJmd0O1RoaXMgaXMgYW4gSDIgaW4gYSBibG9ja3F1b3RlJmx0Oy9oMiZndDsKICAgICZsdDsvYmxvY2txdW90ZSZndDsKCgoKIyMjIFBocmFzZSBFbXBoYXNpcyAjIyMKCk1hcmtkb3duIHVzZXMgYXN0ZXJpc2tzIGFuZCB1bmRlcnNjb3JlcyB0byBpbmRpY2F0ZSBzcGFucyBvZiBlbXBoYXNpcy4KCk1hcmtkb3duOgoKICAgIFNvbWUgb2YgdGhlc2Ugd29yZHMgKmFyZSBlbXBoYXNpemVkKi4KICAgIFNvbWUgb2YgdGhlc2Ugd29yZHMgX2FyZSBlbXBoYXNpemVkIGFsc29fLgogICAgCiAgICBVc2UgdHdvIGFzdGVyaXNrcyBmb3IgKipzdHJvbmcgZW1waGFzaXMqKi4KICAgIE9yLCBpZiB5b3UgcHJlZmVyLCBfX3VzZSB0d28gdW5kZXJzY29yZXMgaW5zdGVhZF9fLgoKT3V0cHV0OgoKICAgICZsdDtwJmd0O1NvbWUgb2YgdGhlc2Ugd29yZHMgJmx0O2VtJmd0O2FyZSBlbXBoYXNpemVkJmx0Oy9lbSZndDsuCiAgICBTb21lIG9mIHRoZXNlIHdvcmRzICZsdDtlbSZndDthcmUgZW1waGFzaXplZCBhbHNvJmx0Oy9lbSZndDsuJmx0Oy9wJmd0OwogICAgCiAgICAmbHQ7cCZndDtVc2UgdHdvIGFzdGVyaXNrcyBmb3IgJmx0O3N0cm9uZyZndDtzdHJvbmcgZW1waGFzaXMmbHQ7L3N0cm9uZyZndDsuCiAgICBPciwgaWYgeW91IHByZWZlciwgJmx0O3N0cm9uZyZndDt1c2UgdHdvIHVuZGVyc2NvcmVzIGluc3RlYWQmbHQ7L3N0cm9uZyZndDsuJmx0Oy9wJmd0OwogICAKCgojIyBMaXN0cyAjIwoKVW5vcmRlcmVkIChidWxsZXRlZCkgbGlzdHMgdXNlIGFzdGVyaXNrcywgcGx1c2VzLCBhbmQgaHlwaGVucyAoYCpgLApgK2AsIGFuZCBgLWApIGFzIGxpc3QgbWFya2Vycy4gVGhlc2UgdGhyZWUgbWFya2VycyBhcmUKaW50ZXJjaGFuZ2FibGU7IHRoaXM6CgogICAgKiAgIENhbmR5LgogICAgKiAgIEd1bS4KICAgICogICBCb296ZS4KCnRoaXM6CgogICAgKyAgIENhbmR5LgogICAgKyAgIEd1bS4KICAgICsgICBCb296ZS4KCmFuZCB0aGlzOgoKICAgIC0gICBDYW5keS4KICAgIC0gICBHdW0uCiAgICAtICAgQm9vemUuCgphbGwgcHJvZHVjZSB0aGUgc2FtZSBvdXRwdXQ6CgogICAgJmx0O3VsJmd0OwogICAgJmx0O2xpJmd0O0NhbmR5LiZsdDsvbGkmZ3Q7CiAgICAmbHQ7bGkmZ3Q7R3VtLiZsdDsvbGkmZ3Q7CiAgICAmbHQ7bGkmZ3Q7Qm9vemUuJmx0Oy9saSZndDsKICAgICZsdDsvdWwmZ3Q7CgpPcmRlcmVkIChudW1iZXJlZCkgbGlzdHMgdXNlIHJlZ3VsYXIgbnVtYmVycywgZm9sbG93ZWQgYnkgcGVyaW9kcywgYXMKbGlzdCBtYXJrZXJzOgoKICAgIDEuICBSZWQKICAgIDIuICBHcmVlbgogICAgMy4gIEJsdWUKCk91dHB1dDoKCiAgICAmbHQ7b2wmZ3Q7CiAgICAmbHQ7bGkmZ3Q7UmVkJmx0Oy9saSZndDsKICAgICZsdDtsaSZndDtHcmVlbiZsdDsvbGkmZ3Q7CiAgICAmbHQ7bGkmZ3Q7Qmx1ZSZsdDsvbGkmZ3Q7CiAgICAmbHQ7L29sJmd0OwoKSWYgeW91IHB1dCBibGFuayBsaW5lcyBiZXR3ZWVuIGl0ZW1zLCB5b3UnbGwgZ2V0IGAmbHQ7cCZndDtgIHRhZ3MgZm9yIHRoZQpsaXN0IGl0ZW0gdGV4dC4gWW91IGNhbiBjcmVhdGUgbXVsdGktcGFyYWdyYXBoIGxpc3QgaXRlbXMgYnkgaW5kZW50aW5nCnRoZSBwYXJhZ3JhcGhzIGJ5IDQgc3BhY2VzIG9yIDEgdGFiOgoKICAgICogICBBIGxpc3QgaXRlbS4KICAgIAogICAgICAgIFdpdGggbXVsdGlwbGUgcGFyYWdyYXBocy4KCiAgICAqICAgQW5vdGhlciBpdGVtIGluIHRoZSBsaXN0LgoKT3V0cHV0OgoKICAgICZsdDt1bCZndDsKICAgICZsdDtsaSZndDsmbHQ7cCZndDtBIGxpc3QgaXRlbS4mbHQ7L3AmZ3Q7CiAgICAmbHQ7cCZndDtXaXRoIG11bHRpcGxlIHBhcmFncmFwaHMuJmx0Oy9wJmd0OyZsdDsvbGkmZ3Q7CiAgICAmbHQ7bGkmZ3Q7Jmx0O3AmZ3Q7QW5vdGhlciBpdGVtIGluIHRoZSBsaXN0LiZsdDsvcCZndDsmbHQ7L2xpJmd0OwogICAgJmx0Oy91bCZndDsKICAgIAoKCiMjIyBMaW5rcyAjIyMKCk1hcmtkb3duIHN1cHBvcnRzIHR3byBzdHlsZXMgZm9yIGNyZWF0aW5nIGxpbmtzOiAqaW5saW5lKiBhbmQKKnJlZmVyZW5jZSouIFdpdGggYm90aCBzdHlsZXMsIHlvdSB1c2Ugc3F1YXJlIGJyYWNrZXRzIHRvIGRlbGltaXQgdGhlCnRleHQgeW91IHdhbnQgdG8gdHVybiBpbnRvIGEgbGluay4KCklubGluZS1zdHlsZSBsaW5rcyB1c2UgcGFyZW50aGVzZXMgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGxpbmsgdGV4dC4KRm9yIGV4YW1wbGU6CgogICAgVGhpcyBpcyBhbiBbZXhhbXBsZSBsaW5rXShodHRwOi8vZXhhbXBsZS5jb20vKS4KCk91dHB1dDoKCiAgICAmbHQ7cCZndDtUaGlzIGlzIGFuICZsdDthIGhyZWY9Imh0dHA6Ly9leGFtcGxlLmNvbS8iJmd0OwogICAgZXhhbXBsZSBsaW5rJmx0Oy9hJmd0Oy4mbHQ7L3AmZ3Q7CgpPcHRpb25hbGx5LCB5b3UgbWF5IGluY2x1ZGUgYSB0aXRsZSBhdHRyaWJ1dGUgaW4gdGhlIHBhcmVudGhlc2VzOgoKICAgIFRoaXMgaXMgYW4gW2V4YW1wbGUgbGlua10oaHR0cDovL2V4YW1wbGUuY29tLyAiV2l0aCBhIFRpdGxlIikuCgpPdXRwdXQ6CgogICAgJmx0O3AmZ3Q7VGhpcyBpcyBhbiAmbHQ7YSBocmVmPSJodHRwOi8vZXhhbXBsZS5jb20vIiB0aXRsZT0iV2l0aCBhIFRpdGxlIiZndDsKICAgIGV4YW1wbGUgbGluayZsdDsvYSZndDsuJmx0Oy9wJmd0OwoKUmVmZXJlbmNlLXN0eWxlIGxpbmtzIGFsbG93IHlvdSB0byByZWZlciB0byB5b3VyIGxpbmtzIGJ5IG5hbWVzLCB3aGljaAp5b3UgZGVmaW5lIGVsc2V3aGVyZSBpbiB5b3VyIGRvY3VtZW50OgoKICAgIEkgZ2V0IDEwIHRpbWVzIG1vcmUgdHJhZmZpYyBmcm9tIFtHb29nbGVdWzFdIHRoYW4gZnJvbQogICAgW1lhaG9vXVsyXSBvciBbTVNOXVszXS4KCiAgICBbMV06IGh0dHA6Ly9nb29nbGUuY29tLyAgICAgICAgIkdvb2dsZSIKICAgIFsyXTogaHR0cDovL3NlYXJjaC55YWhvby5jb20vICAiWWFob28gU2VhcmNoIgogICAgWzNdOiBodHRwOi8vc2VhcmNoLm1zbi5jb20vICAgICJNU04gU2VhcmNoIgoKT3V0cHV0OgoKICAgICZsdDtwJmd0O0kgZ2V0IDEwIHRpbWVzIG1vcmUgdHJhZmZpYyBmcm9tICZsdDthIGhyZWY9Imh0dHA6Ly9nb29nbGUuY29tLyIKICAgIHRpdGxlPSJHb29nbGUiJmd0O0dvb2dsZSZsdDsvYSZndDsgdGhhbiBmcm9tICZsdDthIGhyZWY9Imh0dHA6Ly9zZWFyY2gueWFob28uY29tLyIKICAgIHRpdGxlPSJZYWhvbyBTZWFyY2giJmd0O1lhaG9vJmx0Oy9hJmd0OyBvciAmbHQ7YSBocmVmPSJodHRwOi8vc2VhcmNoLm1zbi5jb20vIgogICAgdGl0bGU9Ik1TTiBTZWFyY2giJmd0O01TTiZsdDsvYSZndDsuJmx0Oy9wJmd0OwoKVGhlIHRpdGxlIGF0dHJpYnV0ZSBpcyBvcHRpb25hbC4gTGluayBuYW1lcyBtYXkgY29udGFpbiBsZXR0ZXJzLApudW1iZXJzIGFuZCBzcGFjZXMsIGJ1dCBhcmUgKm5vdCogY2FzZSBzZW5zaXRpdmU6CgogICAgSSBzdGFydCBteSBtb3JuaW5nIHdpdGggYSBjdXAgb2YgY29mZmVlIGFuZAogICAgW1RoZSBOZXcgWW9yayBUaW1lc11bTlkgVGltZXNdLgoKICAgIFtueSB0aW1lc106IGh0dHA6Ly93d3cubnl0aW1lcy5jb20vCgpPdXRwdXQ6CgogICAgJmx0O3AmZ3Q7SSBzdGFydCBteSBtb3JuaW5nIHdpdGggYSBjdXAgb2YgY29mZmVlIGFuZAogICAgJmx0O2EgaHJlZj0iaHR0cDovL3d3dy5ueXRpbWVzLmNvbS8iJmd0O1RoZSBOZXcgWW9yayBUaW1lcyZsdDsvYSZndDsuJmx0Oy9wJmd0OwoKCiMjIyBJbWFnZXMgIyMjCgpJbWFnZSBzeW50YXggaXMgdmVyeSBtdWNoIGxpa2UgbGluayBzeW50YXguCgpJbmxpbmUgKHRpdGxlcyBhcmUgb3B0aW9uYWwpOgoKICAgICFbYWx0IHRleHRdKC9wYXRoL3RvL2ltZy5qcGcgIlRpdGxlIikKClJlZmVyZW5jZS1zdHlsZToKCiAgICAhW2FsdCB0ZXh0XVtpZF0KCiAgICBbaWRdOiAvcGF0aC90by9pbWcuanBnICJUaXRsZSIKCkJvdGggb2YgdGhlIGFib3ZlIGV4YW1wbGVzIHByb2R1Y2UgdGhlIHNhbWUgb3V0cHV0OgoKICAgICZsdDtpbWcgc3JjPSIvcGF0aC90by9pbWcuanBnIiBhbHQ9ImFsdCB0ZXh0IiB0aXRsZT0iVGl0bGUiIC8mZ3Q7CgoKCiMjIyBDb2RlICMjIwoKSW4gYSByZWd1bGFyIHBhcmFncmFwaCwgeW91IGNhbiBjcmVhdGUgY29kZSBzcGFuIGJ5IHdyYXBwaW5nIHRleHQgaW4KYmFja3RpY2sgcXVvdGVzLiBBbnkgYW1wZXJzYW5kcyAoYCZhbXA7YCkgYW5kIGFuZ2xlIGJyYWNrZXRzIChgJmx0O2Agb3IKYCZndDtgKSB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgdHJhbnNsYXRlZCBpbnRvIEhUTUwgZW50aXRpZXMuIFRoaXMgbWFrZXMKaXQgZWFzeSB0byB1c2UgTWFya2Rvd24gdG8gd3JpdGUgYWJvdXQgSFRNTCBleGFtcGxlIGNvZGU6CgogICAgSSBzdHJvbmdseSByZWNvbW1lbmQgYWdhaW5zdCB1c2luZyBhbnkgYCZsdDtibGluayZndDtgIHRhZ3MuCgogICAgSSB3aXNoIFNtYXJ0eVBhbnRzIHVzZWQgbmFtZWQgZW50aXRpZXMgbGlrZSBgJmFtcDttZGFzaDtgCiAgICBpbnN0ZWFkIG9mIGRlY2ltYWwtZW5jb2RlZCBlbnRpdGVzIGxpa2UgYCZhbXA7IzgyMTI7YC4KCk91dHB1dDoKCiAgICAmbHQ7cCZndDtJIHN0cm9uZ2x5IHJlY29tbWVuZCBhZ2FpbnN0IHVzaW5nIGFueQogICAgJmx0O2NvZGUmZ3Q7JmFtcDtsdDtibGluayZhbXA7Z3Q7Jmx0Oy9jb2RlJmd0OyB0YWdzLiZsdDsvcCZndDsKICAgIAogICAgJmx0O3AmZ3Q7SSB3aXNoIFNtYXJ0eVBhbnRzIHVzZWQgbmFtZWQgZW50aXRpZXMgbGlrZQogICAgJmx0O2NvZGUmZ3Q7JmFtcDthbXA7bWRhc2g7Jmx0Oy9jb2RlJmd0OyBpbnN0ZWFkIG9mIGRlY2ltYWwtZW5jb2RlZAogICAgZW50aXRlcyBsaWtlICZsdDtjb2RlJmd0OyZhbXA7YW1wOyM4MjEyOyZsdDsvY29kZSZndDsuJmx0Oy9wJmd0OwoKClRvIHNwZWNpZnkgYW4gZW50aXJlIGJsb2NrIG9mIHByZS1mb3JtYXR0ZWQgY29kZSwgaW5kZW50IGV2ZXJ5IGxpbmUgb2YKdGhlIGJsb2NrIGJ5IDQgc3BhY2VzIG9yIDEgdGFiLiBKdXN0IGxpa2Ugd2l0aCBjb2RlIHNwYW5zLCBgJmFtcDtgLCBgJmx0O2AsCmFuZCBgJmd0O2AgY2hhcmFjdGVycyB3aWxsIGJlIGVzY2FwZWQgYXV0b21hdGljYWxseS4KCk1hcmtkb3duOgoKICAgIElmIHlvdSB3YW50IHlvdXIgcGFnZSB0byB2YWxpZGF0ZSB1bmRlciBYSFRNTCAxLjAgU3RyaWN0LAogICAgeW91J3ZlIGdvdCB0byBwdXQgcGFyYWdyYXBoIHRhZ3MgaW4geW91ciBibG9ja3F1b3RlczoKCiAgICAgICAgJmx0O2Jsb2NrcXVvdGUmZ3Q7CiAgICAgICAgICAgICZsdDtwJmd0O0ZvciBleGFtcGxlLiZsdDsvcCZndDsKICAgICAgICAmbHQ7L2Jsb2NrcXVvdGUmZ3Q7CgpPdXRwdXQ6CgogICAgJmx0O3AmZ3Q7SWYgeW91IHdhbnQgeW91ciBwYWdlIHRvIHZhbGlkYXRlIHVuZGVyIFhIVE1MIDEuMCBTdHJpY3QsCiAgICB5b3UndmUgZ290IHRvIHB1dCBwYXJhZ3JhcGggdGFncyBpbiB5b3VyIGJsb2NrcXVvdGVzOiZsdDsvcCZndDsKICAgIAogICAgJmx0O3ByZSZndDsmbHQ7Y29kZSZndDsmYW1wO2x0O2Jsb2NrcXVvdGUmYW1wO2d0OwogICAgICAgICZhbXA7bHQ7cCZhbXA7Z3Q7Rm9yIGV4YW1wbGUuJmFtcDtsdDsvcCZhbXA7Z3Q7CiAgICAmYW1wO2x0Oy9ibG9ja3F1b3RlJmFtcDtndDsKICAgICZsdDsvY29kZSZndDsmbHQ7L3ByZSZndDsKPC90ZXh0YXJlYT48L2Zvcm0+CgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICBtb2RlOiAnbWFya2Rvd24nLAogICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgICAgIHRoZW1lOiAiZGVmYXVsdCIsCiAgICAgICAgZXh0cmFLZXlzOiB7IkVudGVyIjogIm5ld2xpbmVBbmRJbmRlbnRDb250aW51ZU1hcmtkb3duTGlzdCJ9CiAgICAgIH0pOwogICAgPC9zY3JpcHQ+CgogICAgPHA+WW91IG1pZ2h0IHdhbnQgdG8gdXNlIHRoZSA8YSBocmVmPSIuLi9nZm0vaW5kZXguaHRtbCI+R2l0aHViLUZsYXZvcmVkIE1hcmtkb3duIG1vZGU8L2E+IGluc3RlYWQsIHdoaWNoIGFkZHMgc3VwcG9ydCBmb3IgZmVuY2VkIGNvZGUgYmxvY2tzIGFuZCBhIGZldyBvdGhlciB0aGluZ3MuPC9wPgoKICAgIDxwPk9wdGlvbmFsbHkgZGVwZW5kcyBvbiB0aGUgWE1MIG1vZGUgZm9yIHByb3Blcmx5IGhpZ2hsaWdodGVkIGlubGluZSBYTUwgYmxvY2tzLjwvcD4KICAgIAogICAgPHA+PHN0cm9uZz5NSU1FIHR5cGVzIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPnRleHQveC1tYXJrZG93bjwvY29kZT4uPC9wPgoKICAgIDxwPjxzdHJvbmc+UGFyc2luZy9IaWdobGlnaHRpbmcgVGVzdHM6PC9zdHJvbmc+IDxhIGhyZWY9Ii4uLy4uL3Rlc3QvaW5kZXguaHRtbCNtYXJrZG93bl8qIj5ub3JtYWw8L2E+LCAgPGEgaHJlZj0iLi4vLi4vdGVzdC9pbmRleC5odG1sI3ZlcmJvc2UsbWFya2Rvd25fKiI+dmVyYm9zZTwvYT4uPC9wPgoKICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/markdown/markdown.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSwgcmVxdWlyZSgiLi4veG1sL3htbCIpLCByZXF1aXJlKCIuLi9tZXRhIikpOwogIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kKSAvLyBBTUQKICAgIGRlZmluZShbIi4uLy4uL2xpYi9jb2RlbWlycm9yIiwgIi4uL3htbC94bWwiLCAiLi4vbWV0YSJdLCBtb2QpOwogIGVsc2UgLy8gUGxhaW4gYnJvd3NlciBlbnYKICAgIG1vZChDb2RlTWlycm9yKTsKfSkoZnVuY3Rpb24oQ29kZU1pcnJvcikgewoidXNlIHN0cmljdCI7CgpDb2RlTWlycm9yLmRlZmluZU1vZGUoIm1hcmtkb3duIiwgZnVuY3Rpb24oY21DZmcsIG1vZGVDZmcpIHsKCiAgdmFyIGh0bWxNb2RlID0gQ29kZU1pcnJvci5nZXRNb2RlKGNtQ2ZnLCAidGV4dC9odG1sIik7CiAgdmFyIGh0bWxNb2RlTWlzc2luZyA9IGh0bWxNb2RlLm5hbWUgPT0gIm51bGwiCgogIGZ1bmN0aW9uIGdldE1vZGUobmFtZSkgewogICAgaWYgKENvZGVNaXJyb3IuZmluZE1vZGVCeU5hbWUpIHsKICAgICAgdmFyIGZvdW5kID0gQ29kZU1pcnJvci5maW5kTW9kZUJ5TmFtZShuYW1lKTsKICAgICAgaWYgKGZvdW5kKSBuYW1lID0gZm91bmQubWltZSB8fCBmb3VuZC5taW1lc1swXTsKICAgIH0KICAgIHZhciBtb2RlID0gQ29kZU1pcnJvci5nZXRNb2RlKGNtQ2ZnLCBuYW1lKTsKICAgIHJldHVybiBtb2RlLm5hbWUgPT0gIm51bGwiID8gbnVsbCA6IG1vZGU7CiAgfQoKICAvLyBTaG91bGQgY2hhcmFjdGVycyB0aGF0IGFmZmVjdCBoaWdobGlnaHRpbmcgYmUgaGlnaGxpZ2h0ZWQgc2VwYXJhdGU/CiAgLy8gRG9lcyBub3QgaW5jbHVkZSBjaGFyYWN0ZXJzIHRoYXQgd2lsbCBiZSBvdXRwdXQgKHN1Y2ggYXMgYDEuYCBhbmQgYC1gIGZvciBsaXN0cykKICBpZiAobW9kZUNmZy5oaWdobGlnaHRGb3JtYXR0aW5nID09PSB1bmRlZmluZWQpCiAgICBtb2RlQ2ZnLmhpZ2hsaWdodEZvcm1hdHRpbmcgPSBmYWxzZTsKCiAgLy8gTWF4aW11bSBudW1iZXIgb2YgbmVzdGVkIGJsb2NrcXVvdGVzLiBTZXQgdG8gMCBmb3IgaW5maW5pdGUgbmVzdGluZy4KICAvLyBFeGNlc3MgYD5gIHdpbGwgZW1pdCBgZXJyb3JgIHRva2VuLgogIGlmIChtb2RlQ2ZnLm1heEJsb2NrcXVvdGVEZXB0aCA9PT0gdW5kZWZpbmVkKQogICAgbW9kZUNmZy5tYXhCbG9ja3F1b3RlRGVwdGggPSAwOwoKICAvLyBTaG91bGQgdW5kZXJzY29yZXMgaW4gd29yZHMgb3Blbi9jbG9zZSBlbS9zdHJvbmc/CiAgaWYgKG1vZGVDZmcudW5kZXJzY29yZXNCcmVha1dvcmRzID09PSB1bmRlZmluZWQpCiAgICBtb2RlQ2ZnLnVuZGVyc2NvcmVzQnJlYWtXb3JkcyA9IHRydWU7CgogIC8vIFVzZSBgZmVuY2VkQ29kZUJsb2Nrc2AgdG8gY29uZmlndXJlIGZlbmNlZCBjb2RlIGJsb2Nrcy4gZmFsc2UgdG8KICAvLyBkaXNhYmxlLCBzdHJpbmcgdG8gc3BlY2lmeSBhIHByZWNpc2UgcmVnZXhwIHRoYXQgdGhlIGZlbmNlIHNob3VsZAogIC8vIG1hdGNoLCBhbmQgdHJ1ZSB0byBhbGxvdyB0aHJlZSBvciBtb3JlIGJhY2t0aWNrcyBvciB0aWxkZXMgKGFzCiAgLy8gcGVyIENvbW1vbk1hcmspLgoKICAvLyBUdXJuIG9uIHRhc2sgbGlzdHM/ICgiLSBbIF0gIiBhbmQgIi0gW3hdICIpCiAgaWYgKG1vZGVDZmcudGFza0xpc3RzID09PSB1bmRlZmluZWQpIG1vZGVDZmcudGFza0xpc3RzID0gZmFsc2U7CgogIC8vIFR1cm4gb24gc3RyaWtldGhyb3VnaCBzeW50YXgKICBpZiAobW9kZUNmZy5zdHJpa2V0aHJvdWdoID09PSB1bmRlZmluZWQpCiAgICBtb2RlQ2ZnLnN0cmlrZXRocm91Z2ggPSBmYWxzZTsKCiAgLy8gQWxsb3cgdG9rZW4gdHlwZXMgdG8gYmUgb3ZlcnJpZGRlbiBieSB1c2VyLXByb3ZpZGVkIHRva2VuIHR5cGVzLgogIGlmIChtb2RlQ2ZnLnRva2VuVHlwZU92ZXJyaWRlcyA9PT0gdW5kZWZpbmVkKQogICAgbW9kZUNmZy50b2tlblR5cGVPdmVycmlkZXMgPSB7fTsKCiAgdmFyIHRva2VuVHlwZXMgPSB7CiAgICBoZWFkZXI6ICJoZWFkZXIiLAogICAgY29kZTogImNvbW1lbnQiLAogICAgcXVvdGU6ICJxdW90ZSIsCiAgICBsaXN0MTogInZhcmlhYmxlLTIiLAogICAgbGlzdDI6ICJ2YXJpYWJsZS0zIiwKICAgIGxpc3QzOiAia2V5d29yZCIsCiAgICBocjogImhyIiwKICAgIGltYWdlOiAiaW1hZ2UiLAogICAgaW1hZ2VBbHRUZXh0OiAiaW1hZ2UtYWx0LXRleHQiLAogICAgaW1hZ2VNYXJrZXI6ICJpbWFnZS1tYXJrZXIiLAogICAgZm9ybWF0dGluZzogImZvcm1hdHRpbmciLAogICAgbGlua0lubGluZTogImxpbmsiLAogICAgbGlua0VtYWlsOiAibGluayIsCiAgICBsaW5rVGV4dDogImxpbmsiLAogICAgbGlua0hyZWY6ICJzdHJpbmciLAogICAgZW06ICJlbSIsCiAgICBzdHJvbmc6ICJzdHJvbmciLAogICAgc3RyaWtldGhyb3VnaDogInN0cmlrZXRocm91Z2giCiAgfTsKCiAgZm9yICh2YXIgdG9rZW5UeXBlIGluIHRva2VuVHlwZXMpIHsKICAgIGlmICh0b2tlblR5cGVzLmhhc093blByb3BlcnR5KHRva2VuVHlwZSkgJiYgbW9kZUNmZy50b2tlblR5cGVPdmVycmlkZXNbdG9rZW5UeXBlXSkgewogICAgICB0b2tlblR5cGVzW3Rva2VuVHlwZV0gPSBtb2RlQ2ZnLnRva2VuVHlwZU92ZXJyaWRlc1t0b2tlblR5cGVdOwogICAgfQogIH0KCiAgdmFyIGhyUkUgPSAvXihbKlwtX10pKD86XHMqXDEpezIsfVxzKiQvCiAgLCAgIHVsUkUgPSAvXlsqXC0rXVxzKy8KICAsICAgb2xSRSA9IC9eWzAtOV0rKFsuKV0pXHMrLwogICwgICB0YXNrTGlzdFJFID0gL15cWyh4fCApXF0oPz1ccykvIC8vIE11c3QgZm9sbG93IHVsUkUgb3Igb2xSRQogICwgICBhdHhIZWFkZXJSRSA9IG1vZGVDZmcuYWxsb3dBdHhIZWFkZXJXaXRob3V0U3BhY2UgPyAvXigjKykvIDogL14oIyspKD86IHwkKS8KICAsICAgc2V0ZXh0SGVhZGVyUkUgPSAvXiAqKD86XD17MSx9fC17MSx9KVxzKiQvCiAgLCAgIHRleHRSRSA9IC9eW14jIVxbXF0qX1xcPD5gICInKH5dKy8KICAsICAgZmVuY2VkQ29kZVJFID0gbmV3IFJlZ0V4cCgiXigiICsgKG1vZGVDZmcuZmVuY2VkQ29kZUJsb2NrcyA9PT0gdHJ1ZSA/ICJ+fn4rfGBgYCsiIDogbW9kZUNmZy5mZW5jZWRDb2RlQmxvY2tzKSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIilbIFxcdF0qKFtcXHcrI1wtXSopIik7CgogIGZ1bmN0aW9uIHN3aXRjaElubGluZShzdHJlYW0sIHN0YXRlLCBmKSB7CiAgICBzdGF0ZS5mID0gc3RhdGUuaW5saW5lID0gZjsKICAgIHJldHVybiBmKHN0cmVhbSwgc3RhdGUpOwogIH0KCiAgZnVuY3Rpb24gc3dpdGNoQmxvY2soc3RyZWFtLCBzdGF0ZSwgZikgewogICAgc3RhdGUuZiA9IHN0YXRlLmJsb2NrID0gZjsKICAgIHJldHVybiBmKHN0cmVhbSwgc3RhdGUpOwogIH0KCiAgZnVuY3Rpb24gbGluZUlzRW1wdHkobGluZSkgewogICAgcmV0dXJuICFsaW5lIHx8ICEvXFMvLnRlc3QobGluZS5zdHJpbmcpCiAgfQoKICAvLyBCbG9ja3MKCiAgZnVuY3Rpb24gYmxhbmtMaW5lKHN0YXRlKSB7CiAgICAvLyBSZXNldCBsaW5rVGl0bGUgc3RhdGUKICAgIHN0YXRlLmxpbmtUaXRsZSA9IGZhbHNlOwogICAgLy8gUmVzZXQgRU0gc3RhdGUKICAgIHN0YXRlLmVtID0gZmFsc2U7CiAgICAvLyBSZXNldCBTVFJPTkcgc3RhdGUKICAgIHN0YXRlLnN0cm9uZyA9IGZhbHNlOwogICAgLy8gUmVzZXQgc3RyaWtldGhyb3VnaCBzdGF0ZQogICAgc3RhdGUuc3RyaWtldGhyb3VnaCA9IGZhbHNlOwogICAgLy8gUmVzZXQgc3RhdGUucXVvdGUKICAgIHN0YXRlLnF1b3RlID0gMDsKICAgIC8vIFJlc2V0IHN0YXRlLmluZGVudGVkQ29kZQogICAgc3RhdGUuaW5kZW50ZWRDb2RlID0gZmFsc2U7CiAgICBpZiAoaHRtbE1vZGVNaXNzaW5nICYmIHN0YXRlLmYgPT0gaHRtbEJsb2NrKSB7CiAgICAgIHN0YXRlLmYgPSBpbmxpbmVOb3JtYWw7CiAgICAgIHN0YXRlLmJsb2NrID0gYmxvY2tOb3JtYWw7CiAgICB9CiAgICAvLyBSZXNldCBzdGF0ZS50cmFpbGluZ1NwYWNlCiAgICBzdGF0ZS50cmFpbGluZ1NwYWNlID0gMDsKICAgIHN0YXRlLnRyYWlsaW5nU3BhY2VOZXdMaW5lID0gZmFsc2U7CiAgICAvLyBNYXJrIHRoaXMgbGluZSBhcyBibGFuawogICAgc3RhdGUucHJldkxpbmUgPSBzdGF0ZS50aGlzTGluZQogICAgc3RhdGUudGhpc0xpbmUgPSBudWxsCiAgICByZXR1cm4gbnVsbDsKICB9CgogIGZ1bmN0aW9uIGJsb2NrTm9ybWFsKHN0cmVhbSwgc3RhdGUpIHsKCiAgICB2YXIgc29sID0gc3RyZWFtLnNvbCgpOwoKICAgIHZhciBwcmV2TGluZUlzTGlzdCA9IHN0YXRlLmxpc3QgIT09IGZhbHNlLAogICAgICAgIHByZXZMaW5lSXNJbmRlbnRlZENvZGUgPSBzdGF0ZS5pbmRlbnRlZENvZGU7CgogICAgc3RhdGUuaW5kZW50ZWRDb2RlID0gZmFsc2U7CgogICAgaWYgKHByZXZMaW5lSXNMaXN0KSB7CiAgICAgIGlmIChzdGF0ZS5pbmRlbnRhdGlvbkRpZmYgPj0gMCkgeyAvLyBDb250aW51ZWQgbGlzdAogICAgICAgIGlmIChzdGF0ZS5pbmRlbnRhdGlvbkRpZmYgPCA0KSB7IC8vIE9ubHkgYWRqdXN0IGluZGVudGF0aW9uIGlmICpub3QqIGEgY29kZSBibG9jawogICAgICAgICAgc3RhdGUuaW5kZW50YXRpb24gLT0gc3RhdGUuaW5kZW50YXRpb25EaWZmOwogICAgICAgIH0KICAgICAgICBzdGF0ZS5saXN0ID0gbnVsbDsKICAgICAgfSBlbHNlIGlmIChzdGF0ZS5pbmRlbnRhdGlvbiA+IDApIHsKICAgICAgICBzdGF0ZS5saXN0ID0gbnVsbDsKICAgICAgfSBlbHNlIHsgLy8gTm8gbG9uZ2VyIGEgbGlzdAogICAgICAgIHN0YXRlLmxpc3QgPSBmYWxzZTsKICAgICAgfQogICAgfQoKICAgIHZhciBtYXRjaCA9IG51bGw7CiAgICBpZiAoc3RhdGUuaW5kZW50YXRpb25EaWZmID49IDQpIHsKICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICBpZiAocHJldkxpbmVJc0luZGVudGVkQ29kZSB8fCBsaW5lSXNFbXB0eShzdGF0ZS5wcmV2TGluZSkpIHsKICAgICAgICBzdGF0ZS5pbmRlbnRhdGlvbiAtPSA0OwogICAgICAgIHN0YXRlLmluZGVudGVkQ29kZSA9IHRydWU7CiAgICAgICAgcmV0dXJuIHRva2VuVHlwZXMuY29kZTsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgfSBlbHNlIGlmIChzdHJlYW0uZWF0U3BhY2UoKSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0gZWxzZSBpZiAoKG1hdGNoID0gc3RyZWFtLm1hdGNoKGF0eEhlYWRlclJFKSkgJiYgbWF0Y2hbMV0ubGVuZ3RoIDw9IDYpIHsKICAgICAgc3RhdGUuaGVhZGVyID0gbWF0Y2hbMV0ubGVuZ3RoOwogICAgICBpZiAobW9kZUNmZy5oaWdobGlnaHRGb3JtYXR0aW5nKSBzdGF0ZS5mb3JtYXR0aW5nID0gImhlYWRlciI7CiAgICAgIHN0YXRlLmYgPSBzdGF0ZS5pbmxpbmU7CiAgICAgIHJldHVybiBnZXRUeXBlKHN0YXRlKTsKICAgIH0gZWxzZSBpZiAoIWxpbmVJc0VtcHR5KHN0YXRlLnByZXZMaW5lKSAmJiAhc3RhdGUucXVvdGUgJiYgIXByZXZMaW5lSXNMaXN0ICYmCiAgICAgICAgICAgICAgICFwcmV2TGluZUlzSW5kZW50ZWRDb2RlICYmIChtYXRjaCA9IHN0cmVhbS5tYXRjaChzZXRleHRIZWFkZXJSRSkpKSB7CiAgICAgIHN0YXRlLmhlYWRlciA9IG1hdGNoWzBdLmNoYXJBdCgwKSA9PSAnPScgPyAxIDogMjsKICAgICAgaWYgKG1vZGVDZmcuaGlnaGxpZ2h0Rm9ybWF0dGluZykgc3RhdGUuZm9ybWF0dGluZyA9ICJoZWFkZXIiOwogICAgICBzdGF0ZS5mID0gc3RhdGUuaW5saW5lOwogICAgICByZXR1cm4gZ2V0VHlwZShzdGF0ZSk7CiAgICB9IGVsc2UgaWYgKHN0cmVhbS5lYXQoJz4nKSkgewogICAgICBzdGF0ZS5xdW90ZSA9IHNvbCA/IDEgOiBzdGF0ZS5xdW90ZSArIDE7CiAgICAgIGlmIChtb2RlQ2ZnLmhpZ2hsaWdodEZvcm1hdHRpbmcpIHN0YXRlLmZvcm1hdHRpbmcgPSAicXVvdGUiOwogICAgICBzdHJlYW0uZWF0U3BhY2UoKTsKICAgICAgcmV0dXJuIGdldFR5cGUoc3RhdGUpOwogICAgfSBlbHNlIGlmIChzdHJlYW0ucGVlaygpID09PSAnWycpIHsKICAgICAgcmV0dXJuIHN3aXRjaElubGluZShzdHJlYW0sIHN0YXRlLCBmb290bm90ZUxpbmspOwogICAgfSBlbHNlIGlmIChzdHJlYW0ubWF0Y2goaHJSRSwgdHJ1ZSkpIHsKICAgICAgc3RhdGUuaHIgPSB0cnVlOwogICAgICByZXR1cm4gdG9rZW5UeXBlcy5ocjsKICAgIH0gZWxzZSBpZiAoKGxpbmVJc0VtcHR5KHN0YXRlLnByZXZMaW5lKSB8fCBwcmV2TGluZUlzTGlzdCkgJiYgKHN0cmVhbS5tYXRjaCh1bFJFLCBmYWxzZSkgfHwgc3RyZWFtLm1hdGNoKG9sUkUsIGZhbHNlKSkpIHsKICAgICAgdmFyIGxpc3RUeXBlID0gbnVsbDsKICAgICAgaWYgKHN0cmVhbS5tYXRjaCh1bFJFLCB0cnVlKSkgewogICAgICAgIGxpc3RUeXBlID0gJ3VsJzsKICAgICAgfSBlbHNlIHsKICAgICAgICBzdHJlYW0ubWF0Y2gob2xSRSwgdHJ1ZSk7CiAgICAgICAgbGlzdFR5cGUgPSAnb2wnOwogICAgICB9CiAgICAgIHN0YXRlLmluZGVudGF0aW9uID0gc3RyZWFtLmNvbHVtbigpICsgc3RyZWFtLmN1cnJlbnQoKS5sZW5ndGg7CiAgICAgIHN0YXRlLmxpc3QgPSB0cnVlOwoKICAgICAgLy8gV2hpbGUgdGhpcyBsaXN0IGl0ZW0ncyBtYXJrZXIncyBpbmRlbnRhdGlvbgogICAgICAvLyBpcyBsZXNzIHRoYW4gdGhlIGRlZXBlc3QgbGlzdCBpdGVtJ3MgY29udGVudCdzIGluZGVudGF0aW9uLAogICAgICAvLyBwb3AgdGhlIGRlZXBlc3QgbGlzdCBpdGVtIGluZGVudGF0aW9uIG9mZiB0aGUgc3RhY2suCiAgICAgIHdoaWxlIChzdGF0ZS5saXN0U3RhY2sgJiYgc3RyZWFtLmNvbHVtbigpIDwgc3RhdGUubGlzdFN0YWNrW3N0YXRlLmxpc3RTdGFjay5sZW5ndGggLSAxXSkgewogICAgICAgIHN0YXRlLmxpc3RTdGFjay5wb3AoKTsKICAgICAgfQoKICAgICAgLy8gQWRkIHRoaXMgbGlzdCBpdGVtJ3MgY29udGVudCdzIGluZGVudGF0aW9uIHRvIHRoZSBzdGFjawogICAgICBzdGF0ZS5saXN0U3RhY2sucHVzaChzdGF0ZS5pbmRlbnRhdGlvbik7CgogICAgICBpZiAobW9kZUNmZy50YXNrTGlzdHMgJiYgc3RyZWFtLm1hdGNoKHRhc2tMaXN0UkUsIGZhbHNlKSkgewogICAgICAgIHN0YXRlLnRhc2tMaXN0ID0gdHJ1ZTsKICAgICAgfQogICAgICBzdGF0ZS5mID0gc3RhdGUuaW5saW5lOwogICAgICBpZiAobW9kZUNmZy5oaWdobGlnaHRGb3JtYXR0aW5nKSBzdGF0ZS5mb3JtYXR0aW5nID0gWyJsaXN0IiwgImxpc3QtIiArIGxpc3RUeXBlXTsKICAgICAgcmV0dXJuIGdldFR5cGUoc3RhdGUpOwogICAgfSBlbHNlIGlmIChtb2RlQ2ZnLmZlbmNlZENvZGVCbG9ja3MgJiYgKG1hdGNoID0gc3RyZWFtLm1hdGNoKGZlbmNlZENvZGVSRSwgdHJ1ZSkpKSB7CiAgICAgIHN0YXRlLmZlbmNlZENoYXJzID0gbWF0Y2hbMV0KICAgICAgLy8gdHJ5IHN3aXRjaGluZyBtb2RlCiAgICAgIHN0YXRlLmxvY2FsTW9kZSA9IGdldE1vZGUobWF0Y2hbMl0pOwogICAgICBpZiAoc3RhdGUubG9jYWxNb2RlKSBzdGF0ZS5sb2NhbFN0YXRlID0gQ29kZU1pcnJvci5zdGFydFN0YXRlKHN0YXRlLmxvY2FsTW9kZSk7CiAgICAgIHN0YXRlLmYgPSBzdGF0ZS5ibG9jayA9IGxvY2FsOwogICAgICBpZiAobW9kZUNmZy5oaWdobGlnaHRGb3JtYXR0aW5nKSBzdGF0ZS5mb3JtYXR0aW5nID0gImNvZGUtYmxvY2siOwogICAgICBzdGF0ZS5jb2RlID0gLTEKICAgICAgcmV0dXJuIGdldFR5cGUoc3RhdGUpOwogICAgfQoKICAgIHJldHVybiBzd2l0Y2hJbmxpbmUoc3RyZWFtLCBzdGF0ZSwgc3RhdGUuaW5saW5lKTsKICB9CgogIGZ1bmN0aW9uIGh0bWxCbG9jayhzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgc3R5bGUgPSBodG1sTW9kZS50b2tlbihzdHJlYW0sIHN0YXRlLmh0bWxTdGF0ZSk7CiAgICBpZiAoIWh0bWxNb2RlTWlzc2luZykgewogICAgICB2YXIgaW5uZXIgPSBDb2RlTWlycm9yLmlubmVyTW9kZShodG1sTW9kZSwgc3RhdGUuaHRtbFN0YXRlKQogICAgICBpZiAoKGlubmVyLm1vZGUubmFtZSA9PSAieG1sIiAmJiBpbm5lci5zdGF0ZS50YWdTdGFydCA9PT0gbnVsbCAmJgogICAgICAgICAgICghaW5uZXIuc3RhdGUuY29udGV4dCAmJiBpbm5lci5zdGF0ZS50b2tlbml6ZS5pc0luVGV4dCkpIHx8CiAgICAgICAgICAoc3RhdGUubWRfaW5zaWRlICYmIHN0cmVhbS5jdXJyZW50KCkuaW5kZXhPZigiPiIpID4gLTEpKSB7CiAgICAgICAgc3RhdGUuZiA9IGlubGluZU5vcm1hbDsKICAgICAgICBzdGF0ZS5ibG9jayA9IGJsb2NrTm9ybWFsOwogICAgICAgIHN0YXRlLmh0bWxTdGF0ZSA9IG51bGw7CiAgICAgIH0KICAgIH0KICAgIHJldHVybiBzdHlsZTsKICB9CgogIGZ1bmN0aW9uIGxvY2FsKHN0cmVhbSwgc3RhdGUpIHsKICAgIGlmIChzdGF0ZS5mZW5jZWRDaGFycyAmJiBzdHJlYW0ubWF0Y2goc3RhdGUuZmVuY2VkQ2hhcnMsIGZhbHNlKSkgewogICAgICBzdGF0ZS5sb2NhbE1vZGUgPSBzdGF0ZS5sb2NhbFN0YXRlID0gbnVsbDsKICAgICAgc3RhdGUuZiA9IHN0YXRlLmJsb2NrID0gbGVhdmluZ0xvY2FsOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0gZWxzZSBpZiAoc3RhdGUubG9jYWxNb2RlKSB7CiAgICAgIHJldHVybiBzdGF0ZS5sb2NhbE1vZGUudG9rZW4oc3RyZWFtLCBzdGF0ZS5sb2NhbFN0YXRlKTsKICAgIH0gZWxzZSB7CiAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgcmV0dXJuIHRva2VuVHlwZXMuY29kZTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGxlYXZpbmdMb2NhbChzdHJlYW0sIHN0YXRlKSB7CiAgICBzdHJlYW0ubWF0Y2goc3RhdGUuZmVuY2VkQ2hhcnMpOwogICAgc3RhdGUuYmxvY2sgPSBibG9ja05vcm1hbDsKICAgIHN0YXRlLmYgPSBpbmxpbmVOb3JtYWw7CiAgICBzdGF0ZS5mZW5jZWRDaGFycyA9IG51bGw7CiAgICBpZiAobW9kZUNmZy5oaWdobGlnaHRGb3JtYXR0aW5nKSBzdGF0ZS5mb3JtYXR0aW5nID0gImNvZGUtYmxvY2siOwogICAgc3RhdGUuY29kZSA9IDEKICAgIHZhciByZXR1cm5UeXBlID0gZ2V0VHlwZShzdGF0ZSk7CiAgICBzdGF0ZS5jb2RlID0gMAogICAgcmV0dXJuIHJldHVyblR5cGU7CiAgfQoKICAvLyBJbmxpbmUKICBmdW5jdGlvbiBnZXRUeXBlKHN0YXRlKSB7CiAgICB2YXIgc3R5bGVzID0gW107CgogICAgaWYgKHN0YXRlLmZvcm1hdHRpbmcpIHsKICAgICAgc3R5bGVzLnB1c2godG9rZW5UeXBlcy5mb3JtYXR0aW5nKTsKCiAgICAgIGlmICh0eXBlb2Ygc3RhdGUuZm9ybWF0dGluZyA9PT0gInN0cmluZyIpIHN0YXRlLmZvcm1hdHRpbmcgPSBbc3RhdGUuZm9ybWF0dGluZ107CgogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHN0YXRlLmZvcm1hdHRpbmcubGVuZ3RoOyBpKyspIHsKICAgICAgICBzdHlsZXMucHVzaCh0b2tlblR5cGVzLmZvcm1hdHRpbmcgKyAiLSIgKyBzdGF0ZS5mb3JtYXR0aW5nW2ldKTsKCiAgICAgICAgaWYgKHN0YXRlLmZvcm1hdHRpbmdbaV0gPT09ICJoZWFkZXIiKSB7CiAgICAgICAgICBzdHlsZXMucHVzaCh0b2tlblR5cGVzLmZvcm1hdHRpbmcgKyAiLSIgKyBzdGF0ZS5mb3JtYXR0aW5nW2ldICsgIi0iICsgc3RhdGUuaGVhZGVyKTsKICAgICAgICB9CgogICAgICAgIC8vIEFkZCBgZm9ybWF0dGluZy1xdW90ZWAgYW5kIGBmb3JtYXR0aW5nLXF1b3RlLSNgIGZvciBibG9ja3F1b3RlcwogICAgICAgIC8vIEFkZCBgZXJyb3JgIGluc3RlYWQgaWYgdGhlIG1heGltdW0gYmxvY2txdW90ZSBuZXN0aW5nIGRlcHRoIGlzIHBhc3NlZAogICAgICAgIGlmIChzdGF0ZS5mb3JtYXR0aW5nW2ldID09PSAicXVvdGUiKSB7CiAgICAgICAgICBpZiAoIW1vZGVDZmcubWF4QmxvY2txdW90ZURlcHRoIHx8IG1vZGVDZmcubWF4QmxvY2txdW90ZURlcHRoID49IHN0YXRlLnF1b3RlKSB7CiAgICAgICAgICAgIHN0eWxlcy5wdXNoKHRva2VuVHlwZXMuZm9ybWF0dGluZyArICItIiArIHN0YXRlLmZvcm1hdHRpbmdbaV0gKyAiLSIgKyBzdGF0ZS5xdW90ZSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdHlsZXMucHVzaCgiZXJyb3IiKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBpZiAoc3RhdGUudGFza09wZW4pIHsKICAgICAgc3R5bGVzLnB1c2goIm1ldGEiKTsKICAgICAgcmV0dXJuIHN0eWxlcy5sZW5ndGggPyBzdHlsZXMuam9pbignICcpIDogbnVsbDsKICAgIH0KICAgIGlmIChzdGF0ZS50YXNrQ2xvc2VkKSB7CiAgICAgIHN0eWxlcy5wdXNoKCJwcm9wZXJ0eSIpOwogICAgICByZXR1cm4gc3R5bGVzLmxlbmd0aCA/IHN0eWxlcy5qb2luKCcgJykgOiBudWxsOwogICAgfQoKICAgIGlmIChzdGF0ZS5saW5rSHJlZikgewogICAgICBzdHlsZXMucHVzaCh0b2tlblR5cGVzLmxpbmtIcmVmLCAidXJsIik7CiAgICB9IGVsc2UgeyAvLyBPbmx5IGFwcGx5IGlubGluZSBzdHlsZXMgdG8gbm9uLXVybCB0ZXh0CiAgICAgIGlmIChzdGF0ZS5zdHJvbmcpIHsgc3R5bGVzLnB1c2godG9rZW5UeXBlcy5zdHJvbmcpOyB9CiAgICAgIGlmIChzdGF0ZS5lbSkgeyBzdHlsZXMucHVzaCh0b2tlblR5cGVzLmVtKTsgfQogICAgICBpZiAoc3RhdGUuc3RyaWtldGhyb3VnaCkgeyBzdHlsZXMucHVzaCh0b2tlblR5cGVzLnN0cmlrZXRocm91Z2gpOyB9CiAgICAgIGlmIChzdGF0ZS5saW5rVGV4dCkgeyBzdHlsZXMucHVzaCh0b2tlblR5cGVzLmxpbmtUZXh0KTsgfQogICAgICBpZiAoc3RhdGUuY29kZSkgeyBzdHlsZXMucHVzaCh0b2tlblR5cGVzLmNvZGUpOyB9CiAgICAgIGlmIChzdGF0ZS5pbWFnZSkgeyBzdHlsZXMucHVzaCh0b2tlblR5cGVzLmltYWdlKTsgfQogICAgICBpZiAoc3RhdGUuaW1hZ2VBbHRUZXh0KSB7IHN0eWxlcy5wdXNoKHRva2VuVHlwZXMuaW1hZ2VBbHRUZXh0LCAibGluayIpOyB9CiAgICAgIGlmIChzdGF0ZS5pbWFnZU1hcmtlcikgeyBzdHlsZXMucHVzaCh0b2tlblR5cGVzLmltYWdlTWFya2VyKTsgfQogICAgfQoKICAgIGlmIChzdGF0ZS5oZWFkZXIpIHsgc3R5bGVzLnB1c2godG9rZW5UeXBlcy5oZWFkZXIsIHRva2VuVHlwZXMuaGVhZGVyICsgIi0iICsgc3RhdGUuaGVhZGVyKTsgfQoKICAgIGlmIChzdGF0ZS5xdW90ZSkgewogICAgICBzdHlsZXMucHVzaCh0b2tlblR5cGVzLnF1b3RlKTsKCiAgICAgIC8vIEFkZCBgcXVvdGUtI2Agd2hlcmUgdGhlIG1heGltdW0gZm9yIGAjYCBpcyBtb2RlQ2ZnLm1heEJsb2NrcXVvdGVEZXB0aAogICAgICBpZiAoIW1vZGVDZmcubWF4QmxvY2txdW90ZURlcHRoIHx8IG1vZGVDZmcubWF4QmxvY2txdW90ZURlcHRoID49IHN0YXRlLnF1b3RlKSB7CiAgICAgICAgc3R5bGVzLnB1c2godG9rZW5UeXBlcy5xdW90ZSArICItIiArIHN0YXRlLnF1b3RlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzdHlsZXMucHVzaCh0b2tlblR5cGVzLnF1b3RlICsgIi0iICsgbW9kZUNmZy5tYXhCbG9ja3F1b3RlRGVwdGgpOwogICAgICB9CiAgICB9CgogICAgaWYgKHN0YXRlLmxpc3QgIT09IGZhbHNlKSB7CiAgICAgIHZhciBsaXN0TW9kID0gKHN0YXRlLmxpc3RTdGFjay5sZW5ndGggLSAxKSAlIDM7CiAgICAgIGlmICghbGlzdE1vZCkgewogICAgICAgIHN0eWxlcy5wdXNoKHRva2VuVHlwZXMubGlzdDEpOwogICAgICB9IGVsc2UgaWYgKGxpc3RNb2QgPT09IDEpIHsKICAgICAgICBzdHlsZXMucHVzaCh0b2tlblR5cGVzLmxpc3QyKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzdHlsZXMucHVzaCh0b2tlblR5cGVzLmxpc3QzKTsKICAgICAgfQogICAgfQoKICAgIGlmIChzdGF0ZS50cmFpbGluZ1NwYWNlTmV3TGluZSkgewogICAgICBzdHlsZXMucHVzaCgidHJhaWxpbmctc3BhY2UtbmV3LWxpbmUiKTsKICAgIH0gZWxzZSBpZiAoc3RhdGUudHJhaWxpbmdTcGFjZSkgewogICAgICBzdHlsZXMucHVzaCgidHJhaWxpbmctc3BhY2UtIiArIChzdGF0ZS50cmFpbGluZ1NwYWNlICUgMiA/ICJhIiA6ICJiIikpOwogICAgfQoKICAgIHJldHVybiBzdHlsZXMubGVuZ3RoID8gc3R5bGVzLmpvaW4oJyAnKSA6IG51bGw7CiAgfQoKICBmdW5jdGlvbiBoYW5kbGVUZXh0KHN0cmVhbSwgc3RhdGUpIHsKICAgIGlmIChzdHJlYW0ubWF0Y2godGV4dFJFLCB0cnVlKSkgewogICAgICByZXR1cm4gZ2V0VHlwZShzdGF0ZSk7CiAgICB9CiAgICByZXR1cm4gdW5kZWZpbmVkOwogIH0KCiAgZnVuY3Rpb24gaW5saW5lTm9ybWFsKHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBzdHlsZSA9IHN0YXRlLnRleHQoc3RyZWFtLCBzdGF0ZSk7CiAgICBpZiAodHlwZW9mIHN0eWxlICE9PSAndW5kZWZpbmVkJykKICAgICAgcmV0dXJuIHN0eWxlOwoKICAgIGlmIChzdGF0ZS5saXN0KSB7IC8vIExpc3QgbWFya2VyICgqLCArLCAtLCAxLiwgZXRjKQogICAgICBzdGF0ZS5saXN0ID0gbnVsbDsKICAgICAgcmV0dXJuIGdldFR5cGUoc3RhdGUpOwogICAgfQoKICAgIGlmIChzdGF0ZS50YXNrTGlzdCkgewogICAgICB2YXIgdGFza09wZW4gPSBzdHJlYW0ubWF0Y2godGFza0xpc3RSRSwgdHJ1ZSlbMV0gIT09ICJ4IjsKICAgICAgaWYgKHRhc2tPcGVuKSBzdGF0ZS50YXNrT3BlbiA9IHRydWU7CiAgICAgIGVsc2Ugc3RhdGUudGFza0Nsb3NlZCA9IHRydWU7CiAgICAgIGlmIChtb2RlQ2ZnLmhpZ2hsaWdodEZvcm1hdHRpbmcpIHN0YXRlLmZvcm1hdHRpbmcgPSAidGFzayI7CiAgICAgIHN0YXRlLnRhc2tMaXN0ID0gZmFsc2U7CiAgICAgIHJldHVybiBnZXRUeXBlKHN0YXRlKTsKICAgIH0KCiAgICBzdGF0ZS50YXNrT3BlbiA9IGZhbHNlOwogICAgc3RhdGUudGFza0Nsb3NlZCA9IGZhbHNlOwoKICAgIGlmIChzdGF0ZS5oZWFkZXIgJiYgc3RyZWFtLm1hdGNoKC9eIyskLywgdHJ1ZSkpIHsKICAgICAgaWYgKG1vZGVDZmcuaGlnaGxpZ2h0Rm9ybWF0dGluZykgc3RhdGUuZm9ybWF0dGluZyA9ICJoZWFkZXIiOwogICAgICByZXR1cm4gZ2V0VHlwZShzdGF0ZSk7CiAgICB9CgogICAgLy8gR2V0IHNvbCgpIHZhbHVlIG5vdywgYmVmb3JlIGNoYXJhY3RlciBpcyBjb25zdW1lZAogICAgdmFyIHNvbCA9IHN0cmVhbS5zb2woKTsKCiAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpOwoKICAgIC8vIE1hdGNoZXMgbGluayB0aXRsZXMgcHJlc2VudCBvbiBuZXh0IGxpbmUKICAgIGlmIChzdGF0ZS5saW5rVGl0bGUpIHsKICAgICAgc3RhdGUubGlua1RpdGxlID0gZmFsc2U7CiAgICAgIHZhciBtYXRjaENoID0gY2g7CiAgICAgIGlmIChjaCA9PT0gJygnKSB7CiAgICAgICAgbWF0Y2hDaCA9ICcpJzsKICAgICAgfQogICAgICBtYXRjaENoID0gKG1hdGNoQ2grJycpLnJlcGxhY2UoLyhbLj8qK14kW1xdXFwoKXt9fC1dKS9nLCAiXFwkMSIpOwogICAgICB2YXIgcmVnZXggPSAnXlxccyooPzpbXicgKyBtYXRjaENoICsgJ1xcXFxdK3xcXFxcXFxcXHxcXFxcLiknICsgbWF0Y2hDaDsKICAgICAgaWYgKHN0cmVhbS5tYXRjaChuZXcgUmVnRXhwKHJlZ2V4KSwgdHJ1ZSkpIHsKICAgICAgICByZXR1cm4gdG9rZW5UeXBlcy5saW5rSHJlZjsKICAgICAgfQogICAgfQoKICAgIC8vIElmIHRoaXMgYmxvY2sgaXMgY2hhbmdlZCwgaXQgbWF5IG5lZWQgdG8gYmUgdXBkYXRlZCBpbiBHRk0gbW9kZQogICAgaWYgKGNoID09PSAnYCcpIHsKICAgICAgdmFyIHByZXZpb3VzRm9ybWF0dGluZyA9IHN0YXRlLmZvcm1hdHRpbmc7CiAgICAgIGlmIChtb2RlQ2ZnLmhpZ2hsaWdodEZvcm1hdHRpbmcpIHN0YXRlLmZvcm1hdHRpbmcgPSAiY29kZSI7CiAgICAgIHN0cmVhbS5lYXRXaGlsZSgnYCcpOwogICAgICB2YXIgY291bnQgPSBzdHJlYW0uY3VycmVudCgpLmxlbmd0aAogICAgICBpZiAoc3RhdGUuY29kZSA9PSAwKSB7CiAgICAgICAgc3RhdGUuY29kZSA9IGNvdW50CiAgICAgICAgcmV0dXJuIGdldFR5cGUoc3RhdGUpCiAgICAgIH0gZWxzZSBpZiAoY291bnQgPT0gc3RhdGUuY29kZSkgeyAvLyBNdXN0IGJlIGV4YWN0CiAgICAgICAgdmFyIHQgPSBnZXRUeXBlKHN0YXRlKQogICAgICAgIHN0YXRlLmNvZGUgPSAwCiAgICAgICAgcmV0dXJuIHQKICAgICAgfSBlbHNlIHsKICAgICAgICBzdGF0ZS5mb3JtYXR0aW5nID0gcHJldmlvdXNGb3JtYXR0aW5nCiAgICAgICAgcmV0dXJuIGdldFR5cGUoc3RhdGUpCiAgICAgIH0KICAgIH0gZWxzZSBpZiAoc3RhdGUuY29kZSkgewogICAgICByZXR1cm4gZ2V0VHlwZShzdGF0ZSk7CiAgICB9CgogICAgaWYgKGNoID09PSAnXFwnKSB7CiAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgIGlmIChtb2RlQ2ZnLmhpZ2hsaWdodEZvcm1hdHRpbmcpIHsKICAgICAgICB2YXIgdHlwZSA9IGdldFR5cGUoc3RhdGUpOwogICAgICAgIHZhciBmb3JtYXR0aW5nRXNjYXBlID0gdG9rZW5UeXBlcy5mb3JtYXR0aW5nICsgIi1lc2NhcGUiOwogICAgICAgIHJldHVybiB0eXBlID8gdHlwZSArICIgIiArIGZvcm1hdHRpbmdFc2NhcGUgOiBmb3JtYXR0aW5nRXNjYXBlOwogICAgICB9CiAgICB9CgogICAgaWYgKGNoID09PSAnIScgJiYgc3RyZWFtLm1hdGNoKC9cW1teXF1dKlxdID8oPzpcKHxcWykvLCBmYWxzZSkpIHsKICAgICAgc3RhdGUuaW1hZ2VNYXJrZXIgPSB0cnVlOwogICAgICBzdGF0ZS5pbWFnZSA9IHRydWU7CiAgICAgIGlmIChtb2RlQ2ZnLmhpZ2hsaWdodEZvcm1hdHRpbmcpIHN0YXRlLmZvcm1hdHRpbmcgPSAiaW1hZ2UiOwogICAgICByZXR1cm4gZ2V0VHlwZShzdGF0ZSk7CiAgICB9CgogICAgaWYgKGNoID09PSAnWycgJiYgc3RhdGUuaW1hZ2VNYXJrZXIpIHsKICAgICAgc3RhdGUuaW1hZ2VNYXJrZXIgPSBmYWxzZTsKICAgICAgc3RhdGUuaW1hZ2VBbHRUZXh0ID0gdHJ1ZQogICAgICBpZiAobW9kZUNmZy5oaWdobGlnaHRGb3JtYXR0aW5nKSBzdGF0ZS5mb3JtYXR0aW5nID0gImltYWdlIjsKICAgICAgcmV0dXJuIGdldFR5cGUoc3RhdGUpOwogICAgfQoKICAgIGlmIChjaCA9PT0gJ10nICYmIHN0YXRlLmltYWdlQWx0VGV4dCkgewogICAgICBpZiAobW9kZUNmZy5oaWdobGlnaHRGb3JtYXR0aW5nKSBzdGF0ZS5mb3JtYXR0aW5nID0gImltYWdlIjsKICAgICAgdmFyIHR5cGUgPSBnZXRUeXBlKHN0YXRlKTsKICAgICAgc3RhdGUuaW1hZ2VBbHRUZXh0ID0gZmFsc2U7CiAgICAgIHN0YXRlLmltYWdlID0gZmFsc2U7CiAgICAgIHN0YXRlLmlubGluZSA9IHN0YXRlLmYgPSBsaW5rSHJlZjsKICAgICAgcmV0dXJuIHR5cGU7CiAgICB9CgogICAgaWYgKGNoID09PSAnWycgJiYgc3RyZWFtLm1hdGNoKC9bXlxdXSpcXShcKC4qXCl8ID9cWy4qP1xdKS8sIGZhbHNlKSAmJiAhc3RhdGUuaW1hZ2UpIHsKICAgICAgc3RhdGUubGlua1RleHQgPSB0cnVlOwogICAgICBpZiAobW9kZUNmZy5oaWdobGlnaHRGb3JtYXR0aW5nKSBzdGF0ZS5mb3JtYXR0aW5nID0gImxpbmsiOwogICAgICByZXR1cm4gZ2V0VHlwZShzdGF0ZSk7CiAgICB9CgogICAgaWYgKGNoID09PSAnXScgJiYgc3RhdGUubGlua1RleHQgJiYgc3RyZWFtLm1hdGNoKC9cKC4qP1wpfCA/XFsuKj9cXS8sIGZhbHNlKSkgewogICAgICBpZiAobW9kZUNmZy5oaWdobGlnaHRGb3JtYXR0aW5nKSBzdGF0ZS5mb3JtYXR0aW5nID0gImxpbmsiOwogICAgICB2YXIgdHlwZSA9IGdldFR5cGUoc3RhdGUpOwogICAgICBzdGF0ZS5saW5rVGV4dCA9IGZhbHNlOwogICAgICBzdGF0ZS5pbmxpbmUgPSBzdGF0ZS5mID0gbGlua0hyZWY7CiAgICAgIHJldHVybiB0eXBlOwogICAgfQoKICAgIGlmIChjaCA9PT0gJzwnICYmIHN0cmVhbS5tYXRjaCgvXihodHRwcz98ZnRwcz8pOlwvXC8oPzpbXlxcPl18XFwuKSs+LywgZmFsc2UpKSB7CiAgICAgIHN0YXRlLmYgPSBzdGF0ZS5pbmxpbmUgPSBsaW5rSW5saW5lOwogICAgICBpZiAobW9kZUNmZy5oaWdobGlnaHRGb3JtYXR0aW5nKSBzdGF0ZS5mb3JtYXR0aW5nID0gImxpbmsiOwogICAgICB2YXIgdHlwZSA9IGdldFR5cGUoc3RhdGUpOwogICAgICBpZiAodHlwZSl7CiAgICAgICAgdHlwZSArPSAiICI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdHlwZSA9ICIiOwogICAgICB9CiAgICAgIHJldHVybiB0eXBlICsgdG9rZW5UeXBlcy5saW5rSW5saW5lOwogICAgfQoKICAgIGlmIChjaCA9PT0gJzwnICYmIHN0cmVhbS5tYXRjaCgvXltePiBcXF0rQCg/OlteXFw+XXxcXC4pKz4vLCBmYWxzZSkpIHsKICAgICAgc3RhdGUuZiA9IHN0YXRlLmlubGluZSA9IGxpbmtJbmxpbmU7CiAgICAgIGlmIChtb2RlQ2ZnLmhpZ2hsaWdodEZvcm1hdHRpbmcpIHN0YXRlLmZvcm1hdHRpbmcgPSAibGluayI7CiAgICAgIHZhciB0eXBlID0gZ2V0VHlwZShzdGF0ZSk7CiAgICAgIGlmICh0eXBlKXsKICAgICAgICB0eXBlICs9ICIgIjsKICAgICAgfSBlbHNlIHsKICAgICAgICB0eXBlID0gIiI7CiAgICAgIH0KICAgICAgcmV0dXJuIHR5cGUgKyB0b2tlblR5cGVzLmxpbmtFbWFpbDsKICAgIH0KCiAgICBpZiAoY2ggPT09ICc8JyAmJiBzdHJlYW0ubWF0Y2goL14oIS0tfFx3KS8sIGZhbHNlKSkgewogICAgICB2YXIgZW5kID0gc3RyZWFtLnN0cmluZy5pbmRleE9mKCI+Iiwgc3RyZWFtLnBvcyk7CiAgICAgIGlmIChlbmQgIT0gLTEpIHsKICAgICAgICB2YXIgYXR0cyA9IHN0cmVhbS5zdHJpbmcuc3Vic3RyaW5nKHN0cmVhbS5zdGFydCwgZW5kKTsKICAgICAgICBpZiAoL21hcmtkb3duXHMqPVxzKignfCIpezAsMX0xKCd8Iil7MCwxfS8udGVzdChhdHRzKSkgc3RhdGUubWRfaW5zaWRlID0gdHJ1ZTsKICAgICAgfQogICAgICBzdHJlYW0uYmFja1VwKDEpOwogICAgICBzdGF0ZS5odG1sU3RhdGUgPSBDb2RlTWlycm9yLnN0YXJ0U3RhdGUoaHRtbE1vZGUpOwogICAgICByZXR1cm4gc3dpdGNoQmxvY2soc3RyZWFtLCBzdGF0ZSwgaHRtbEJsb2NrKTsKICAgIH0KCiAgICBpZiAoY2ggPT09ICc8JyAmJiBzdHJlYW0ubWF0Y2goL15cL1x3Kj8+LykpIHsKICAgICAgc3RhdGUubWRfaW5zaWRlID0gZmFsc2U7CiAgICAgIHJldHVybiAidGFnIjsKICAgIH0KCiAgICB2YXIgaWdub3JlVW5kZXJzY29yZSA9IGZhbHNlOwogICAgaWYgKCFtb2RlQ2ZnLnVuZGVyc2NvcmVzQnJlYWtXb3JkcykgewogICAgICBpZiAoY2ggPT09ICdfJyAmJiBzdHJlYW0ucGVlaygpICE9PSAnXycgJiYgc3RyZWFtLm1hdGNoKC8oXHcpLywgZmFsc2UpKSB7CiAgICAgICAgdmFyIHByZXZQb3MgPSBzdHJlYW0ucG9zIC0gMjsKICAgICAgICBpZiAocHJldlBvcyA+PSAwKSB7CiAgICAgICAgICB2YXIgcHJldkNoID0gc3RyZWFtLnN0cmluZy5jaGFyQXQocHJldlBvcyk7CiAgICAgICAgICBpZiAocHJldkNoICE9PSAnXycgJiYgcHJldkNoLm1hdGNoKC8oXHcpLywgZmFsc2UpKSB7CiAgICAgICAgICAgIGlnbm9yZVVuZGVyc2NvcmUgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgaWYgKGNoID09PSAnKicgfHwgKGNoID09PSAnXycgJiYgIWlnbm9yZVVuZGVyc2NvcmUpKSB7CiAgICAgIGlmIChzb2wgJiYgc3RyZWFtLnBlZWsoKSA9PT0gJyAnKSB7CiAgICAgICAgLy8gRG8gbm90aGluZywgc3Vycm91bmRlZCBieSBuZXdsaW5lIGFuZCBzcGFjZQogICAgICB9IGVsc2UgaWYgKHN0YXRlLnN0cm9uZyA9PT0gY2ggJiYgc3RyZWFtLmVhdChjaCkpIHsgLy8gUmVtb3ZlIFNUUk9ORwogICAgICAgIGlmIChtb2RlQ2ZnLmhpZ2hsaWdodEZvcm1hdHRpbmcpIHN0YXRlLmZvcm1hdHRpbmcgPSAic3Ryb25nIjsKICAgICAgICB2YXIgdCA9IGdldFR5cGUoc3RhdGUpOwogICAgICAgIHN0YXRlLnN0cm9uZyA9IGZhbHNlOwogICAgICAgIHJldHVybiB0OwogICAgICB9IGVsc2UgaWYgKCFzdGF0ZS5zdHJvbmcgJiYgc3RyZWFtLmVhdChjaCkpIHsgLy8gQWRkIFNUUk9ORwogICAgICAgIHN0YXRlLnN0cm9uZyA9IGNoOwogICAgICAgIGlmIChtb2RlQ2ZnLmhpZ2hsaWdodEZvcm1hdHRpbmcpIHN0YXRlLmZvcm1hdHRpbmcgPSAic3Ryb25nIjsKICAgICAgICByZXR1cm4gZ2V0VHlwZShzdGF0ZSk7CiAgICAgIH0gZWxzZSBpZiAoc3RhdGUuZW0gPT09IGNoKSB7IC8vIFJlbW92ZSBFTQogICAgICAgIGlmIChtb2RlQ2ZnLmhpZ2hsaWdodEZvcm1hdHRpbmcpIHN0YXRlLmZvcm1hdHRpbmcgPSAiZW0iOwogICAgICAgIHZhciB0ID0gZ2V0VHlwZShzdGF0ZSk7CiAgICAgICAgc3RhdGUuZW0gPSBmYWxzZTsKICAgICAgICByZXR1cm4gdDsKICAgICAgfSBlbHNlIGlmICghc3RhdGUuZW0pIHsgLy8gQWRkIEVNCiAgICAgICAgc3RhdGUuZW0gPSBjaDsKICAgICAgICBpZiAobW9kZUNmZy5oaWdobGlnaHRGb3JtYXR0aW5nKSBzdGF0ZS5mb3JtYXR0aW5nID0gImVtIjsKICAgICAgICByZXR1cm4gZ2V0VHlwZShzdGF0ZSk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoY2ggPT09ICcgJykgewogICAgICBpZiAoc3RyZWFtLmVhdCgnKicpIHx8IHN0cmVhbS5lYXQoJ18nKSkgeyAvLyBQcm9iYWJseSBzdXJyb3VuZGVkIGJ5IHNwYWNlcwogICAgICAgIGlmIChzdHJlYW0ucGVlaygpID09PSAnICcpIHsgLy8gU3Vycm91bmRlZCBieSBzcGFjZXMsIGlnbm9yZQogICAgICAgICAgcmV0dXJuIGdldFR5cGUoc3RhdGUpOwogICAgICAgIH0gZWxzZSB7IC8vIE5vdCBzdXJyb3VuZGVkIGJ5IHNwYWNlcywgYmFjayB1cCBwb2ludGVyCiAgICAgICAgICBzdHJlYW0uYmFja1VwKDEpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGlmIChtb2RlQ2ZnLnN0cmlrZXRocm91Z2gpIHsKICAgICAgaWYgKGNoID09PSAnficgJiYgc3RyZWFtLmVhdFdoaWxlKGNoKSkgewogICAgICAgIGlmIChzdGF0ZS5zdHJpa2V0aHJvdWdoKSB7Ly8gUmVtb3ZlIHN0cmlrZXRocm91Z2gKICAgICAgICAgIGlmIChtb2RlQ2ZnLmhpZ2hsaWdodEZvcm1hdHRpbmcpIHN0YXRlLmZvcm1hdHRpbmcgPSAic3RyaWtldGhyb3VnaCI7CiAgICAgICAgICB2YXIgdCA9IGdldFR5cGUoc3RhdGUpOwogICAgICAgICAgc3RhdGUuc3RyaWtldGhyb3VnaCA9IGZhbHNlOwogICAgICAgICAgcmV0dXJuIHQ7CiAgICAgICAgfSBlbHNlIGlmIChzdHJlYW0ubWF0Y2goL15bXlxzXS8sIGZhbHNlKSkgey8vIEFkZCBzdHJpa2V0aHJvdWdoCiAgICAgICAgICBzdGF0ZS5zdHJpa2V0aHJvdWdoID0gdHJ1ZTsKICAgICAgICAgIGlmIChtb2RlQ2ZnLmhpZ2hsaWdodEZvcm1hdHRpbmcpIHN0YXRlLmZvcm1hdHRpbmcgPSAic3RyaWtldGhyb3VnaCI7CiAgICAgICAgICByZXR1cm4gZ2V0VHlwZShzdGF0ZSk7CiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKGNoID09PSAnICcpIHsKICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKC9efn4vLCB0cnVlKSkgeyAvLyBQcm9iYWJseSBzdXJyb3VuZGVkIGJ5IHNwYWNlCiAgICAgICAgICBpZiAoc3RyZWFtLnBlZWsoKSA9PT0gJyAnKSB7IC8vIFN1cnJvdW5kZWQgYnkgc3BhY2VzLCBpZ25vcmUKICAgICAgICAgICAgcmV0dXJuIGdldFR5cGUoc3RhdGUpOwogICAgICAgICAgfSBlbHNlIHsgLy8gTm90IHN1cnJvdW5kZWQgYnkgc3BhY2VzLCBiYWNrIHVwIHBvaW50ZXIKICAgICAgICAgICAgc3RyZWFtLmJhY2tVcCgyKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBpZiAoY2ggPT09ICcgJykgewogICAgICBpZiAoc3RyZWFtLm1hdGNoKC8gKyQvLCBmYWxzZSkpIHsKICAgICAgICBzdGF0ZS50cmFpbGluZ1NwYWNlKys7CiAgICAgIH0gZWxzZSBpZiAoc3RhdGUudHJhaWxpbmdTcGFjZSkgewogICAgICAgIHN0YXRlLnRyYWlsaW5nU3BhY2VOZXdMaW5lID0gdHJ1ZTsKICAgICAgfQogICAgfQoKICAgIHJldHVybiBnZXRUeXBlKHN0YXRlKTsKICB9CgogIGZ1bmN0aW9uIGxpbmtJbmxpbmUoc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIGNoID0gc3RyZWFtLm5leHQoKTsKCiAgICBpZiAoY2ggPT09ICI+IikgewogICAgICBzdGF0ZS5mID0gc3RhdGUuaW5saW5lID0gaW5saW5lTm9ybWFsOwogICAgICBpZiAobW9kZUNmZy5oaWdobGlnaHRGb3JtYXR0aW5nKSBzdGF0ZS5mb3JtYXR0aW5nID0gImxpbmsiOwogICAgICB2YXIgdHlwZSA9IGdldFR5cGUoc3RhdGUpOwogICAgICBpZiAodHlwZSl7CiAgICAgICAgdHlwZSArPSAiICI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdHlwZSA9ICIiOwogICAgICB9CiAgICAgIHJldHVybiB0eXBlICsgdG9rZW5UeXBlcy5saW5rSW5saW5lOwogICAgfQoKICAgIHN0cmVhbS5tYXRjaCgvXltePl0rLywgdHJ1ZSk7CgogICAgcmV0dXJuIHRva2VuVHlwZXMubGlua0lubGluZTsKICB9CgogIGZ1bmN0aW9uIGxpbmtIcmVmKHN0cmVhbSwgc3RhdGUpIHsKICAgIC8vIENoZWNrIGlmIHNwYWNlLCBhbmQgcmV0dXJuIE5VTEwgaWYgc28gKHRvIGF2b2lkIG1hcmtpbmcgdGhlIHNwYWNlKQogICAgaWYoc3RyZWFtLmVhdFNwYWNlKCkpewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHZhciBjaCA9IHN0cmVhbS5uZXh0KCk7CiAgICBpZiAoY2ggPT09ICcoJyB8fCBjaCA9PT0gJ1snKSB7CiAgICAgIHN0YXRlLmYgPSBzdGF0ZS5pbmxpbmUgPSBnZXRMaW5rSHJlZkluc2lkZShjaCA9PT0gIigiID8gIikiIDogIl0iLCAwKTsKICAgICAgaWYgKG1vZGVDZmcuaGlnaGxpZ2h0Rm9ybWF0dGluZykgc3RhdGUuZm9ybWF0dGluZyA9ICJsaW5rLXN0cmluZyI7CiAgICAgIHN0YXRlLmxpbmtIcmVmID0gdHJ1ZTsKICAgICAgcmV0dXJuIGdldFR5cGUoc3RhdGUpOwogICAgfQogICAgcmV0dXJuICdlcnJvcic7CiAgfQoKICB2YXIgbGlua1JFID0gewogICAgIikiOiAvXig/OlteXFxcKFwpXXxcXC58XCgoPzpbXlxcXChcKV18XFwuKSpcKSkqPyg/PVwpKS8sCiAgICAiXSI6IC9eKD86W15cXFxbXF1dfFxcLnxcWyg/OlteXFxcW1xcXV18XFwuKSpcXSkqPyg/PVxdKS8KICB9CgogIGZ1bmN0aW9uIGdldExpbmtIcmVmSW5zaWRlKGVuZENoYXIpIHsKICAgIHJldHVybiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHZhciBjaCA9IHN0cmVhbS5uZXh0KCk7CgogICAgICBpZiAoY2ggPT09IGVuZENoYXIpIHsKICAgICAgICBzdGF0ZS5mID0gc3RhdGUuaW5saW5lID0gaW5saW5lTm9ybWFsOwogICAgICAgIGlmIChtb2RlQ2ZnLmhpZ2hsaWdodEZvcm1hdHRpbmcpIHN0YXRlLmZvcm1hdHRpbmcgPSAibGluay1zdHJpbmciOwogICAgICAgIHZhciByZXR1cm5TdGF0ZSA9IGdldFR5cGUoc3RhdGUpOwogICAgICAgIHN0YXRlLmxpbmtIcmVmID0gZmFsc2U7CiAgICAgICAgcmV0dXJuIHJldHVyblN0YXRlOwogICAgICB9CgogICAgICBzdHJlYW0ubWF0Y2gobGlua1JFW2VuZENoYXJdKQogICAgICBzdGF0ZS5saW5rSHJlZiA9IHRydWU7CiAgICAgIHJldHVybiBnZXRUeXBlKHN0YXRlKTsKICAgIH07CiAgfQoKICBmdW5jdGlvbiBmb290bm90ZUxpbmsoc3RyZWFtLCBzdGF0ZSkgewogICAgaWYgKHN0cmVhbS5tYXRjaCgvXihbXlxdXFxdfFxcLikqXF06LywgZmFsc2UpKSB7CiAgICAgIHN0YXRlLmYgPSBmb290bm90ZUxpbmtJbnNpZGU7CiAgICAgIHN0cmVhbS5uZXh0KCk7IC8vIENvbnN1bWUgWwogICAgICBpZiAobW9kZUNmZy5oaWdobGlnaHRGb3JtYXR0aW5nKSBzdGF0ZS5mb3JtYXR0aW5nID0gImxpbmsiOwogICAgICBzdGF0ZS5saW5rVGV4dCA9IHRydWU7CiAgICAgIHJldHVybiBnZXRUeXBlKHN0YXRlKTsKICAgIH0KICAgIHJldHVybiBzd2l0Y2hJbmxpbmUoc3RyZWFtLCBzdGF0ZSwgaW5saW5lTm9ybWFsKTsKICB9CgogIGZ1bmN0aW9uIGZvb3Rub3RlTGlua0luc2lkZShzdHJlYW0sIHN0YXRlKSB7CiAgICBpZiAoc3RyZWFtLm1hdGNoKC9eXF06LywgdHJ1ZSkpIHsKICAgICAgc3RhdGUuZiA9IHN0YXRlLmlubGluZSA9IGZvb3Rub3RlVXJsOwogICAgICBpZiAobW9kZUNmZy5oaWdobGlnaHRGb3JtYXR0aW5nKSBzdGF0ZS5mb3JtYXR0aW5nID0gImxpbmsiOwogICAgICB2YXIgcmV0dXJuVHlwZSA9IGdldFR5cGUoc3RhdGUpOwogICAgICBzdGF0ZS5saW5rVGV4dCA9IGZhbHNlOwogICAgICByZXR1cm4gcmV0dXJuVHlwZTsKICAgIH0KCiAgICBzdHJlYW0ubWF0Y2goL14oW15cXVxcXXxcXC4pKy8sIHRydWUpOwoKICAgIHJldHVybiB0b2tlblR5cGVzLmxpbmtUZXh0OwogIH0KCiAgZnVuY3Rpb24gZm9vdG5vdGVVcmwoc3RyZWFtLCBzdGF0ZSkgewogICAgLy8gQ2hlY2sgaWYgc3BhY2UsIGFuZCByZXR1cm4gTlVMTCBpZiBzbyAodG8gYXZvaWQgbWFya2luZyB0aGUgc3BhY2UpCiAgICBpZihzdHJlYW0uZWF0U3BhY2UoKSl7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgLy8gTWF0Y2ggVVJMCiAgICBzdHJlYW0ubWF0Y2goL15bXlxzXSsvLCB0cnVlKTsKICAgIC8vIENoZWNrIGZvciBsaW5rIHRpdGxlCiAgICBpZiAoc3RyZWFtLnBlZWsoKSA9PT0gdW5kZWZpbmVkKSB7IC8vIEVuZCBvZiBsaW5lLCBzZXQgZmxhZyB0byBjaGVjayBuZXh0IGxpbmUKICAgICAgc3RhdGUubGlua1RpdGxlID0gdHJ1ZTsKICAgIH0gZWxzZSB7IC8vIE1vcmUgY29udGVudCBvbiBsaW5lLCBjaGVjayBpZiBsaW5rIHRpdGxlCiAgICAgIHN0cmVhbS5tYXRjaCgvXig/OlxzKyg/OiIoPzpbXiJcXF18XFxcXHxcXC4pKyJ8Jyg/OlteJ1xcXXxcXFxcfFxcLikrJ3xcKCg/OlteKVxcXXxcXFxcfFxcLikrXCkpKT8vLCB0cnVlKTsKICAgIH0KICAgIHN0YXRlLmYgPSBzdGF0ZS5pbmxpbmUgPSBpbmxpbmVOb3JtYWw7CiAgICByZXR1cm4gdG9rZW5UeXBlcy5saW5rSHJlZiArICIgdXJsIjsKICB9CgogIHZhciBtb2RlID0gewogICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgZjogYmxvY2tOb3JtYWwsCgogICAgICAgIHByZXZMaW5lOiBudWxsLAogICAgICAgIHRoaXNMaW5lOiBudWxsLAoKICAgICAgICBibG9jazogYmxvY2tOb3JtYWwsCiAgICAgICAgaHRtbFN0YXRlOiBudWxsLAogICAgICAgIGluZGVudGF0aW9uOiAwLAoKICAgICAgICBpbmxpbmU6IGlubGluZU5vcm1hbCwKICAgICAgICB0ZXh0OiBoYW5kbGVUZXh0LAoKICAgICAgICBmb3JtYXR0aW5nOiBmYWxzZSwKICAgICAgICBsaW5rVGV4dDogZmFsc2UsCiAgICAgICAgbGlua0hyZWY6IGZhbHNlLAogICAgICAgIGxpbmtUaXRsZTogZmFsc2UsCiAgICAgICAgY29kZTogMCwKICAgICAgICBlbTogZmFsc2UsCiAgICAgICAgc3Ryb25nOiBmYWxzZSwKICAgICAgICBoZWFkZXI6IDAsCiAgICAgICAgaHI6IGZhbHNlLAogICAgICAgIHRhc2tMaXN0OiBmYWxzZSwKICAgICAgICBsaXN0OiBmYWxzZSwKICAgICAgICBsaXN0U3RhY2s6IFtdLAogICAgICAgIHF1b3RlOiAwLAogICAgICAgIHRyYWlsaW5nU3BhY2U6IDAsCiAgICAgICAgdHJhaWxpbmdTcGFjZU5ld0xpbmU6IGZhbHNlLAogICAgICAgIHN0cmlrZXRocm91Z2g6IGZhbHNlLAogICAgICAgIGZlbmNlZENoYXJzOiBudWxsCiAgICAgIH07CiAgICB9LAoKICAgIGNvcHlTdGF0ZTogZnVuY3Rpb24ocykgewogICAgICByZXR1cm4gewogICAgICAgIGY6IHMuZiwKCiAgICAgICAgcHJldkxpbmU6IHMucHJldkxpbmUsCiAgICAgICAgdGhpc0xpbmU6IHMudGhpc0xpbmUsCgogICAgICAgIGJsb2NrOiBzLmJsb2NrLAogICAgICAgIGh0bWxTdGF0ZTogcy5odG1sU3RhdGUgJiYgQ29kZU1pcnJvci5jb3B5U3RhdGUoaHRtbE1vZGUsIHMuaHRtbFN0YXRlKSwKICAgICAgICBpbmRlbnRhdGlvbjogcy5pbmRlbnRhdGlvbiwKCiAgICAgICAgbG9jYWxNb2RlOiBzLmxvY2FsTW9kZSwKICAgICAgICBsb2NhbFN0YXRlOiBzLmxvY2FsTW9kZSA/IENvZGVNaXJyb3IuY29weVN0YXRlKHMubG9jYWxNb2RlLCBzLmxvY2FsU3RhdGUpIDogbnVsbCwKCiAgICAgICAgaW5saW5lOiBzLmlubGluZSwKICAgICAgICB0ZXh0OiBzLnRleHQsCiAgICAgICAgZm9ybWF0dGluZzogZmFsc2UsCiAgICAgICAgbGlua1RpdGxlOiBzLmxpbmtUaXRsZSwKICAgICAgICBjb2RlOiBzLmNvZGUsCiAgICAgICAgZW06IHMuZW0sCiAgICAgICAgc3Ryb25nOiBzLnN0cm9uZywKICAgICAgICBzdHJpa2V0aHJvdWdoOiBzLnN0cmlrZXRocm91Z2gsCiAgICAgICAgaGVhZGVyOiBzLmhlYWRlciwKICAgICAgICBocjogcy5ociwKICAgICAgICB0YXNrTGlzdDogcy50YXNrTGlzdCwKICAgICAgICBsaXN0OiBzLmxpc3QsCiAgICAgICAgbGlzdFN0YWNrOiBzLmxpc3RTdGFjay5zbGljZSgwKSwKICAgICAgICBxdW90ZTogcy5xdW90ZSwKICAgICAgICBpbmRlbnRlZENvZGU6IHMuaW5kZW50ZWRDb2RlLAogICAgICAgIHRyYWlsaW5nU3BhY2U6IHMudHJhaWxpbmdTcGFjZSwKICAgICAgICB0cmFpbGluZ1NwYWNlTmV3TGluZTogcy50cmFpbGluZ1NwYWNlTmV3TGluZSwKICAgICAgICBtZF9pbnNpZGU6IHMubWRfaW5zaWRlLAogICAgICAgIGZlbmNlZENoYXJzOiBzLmZlbmNlZENoYXJzCiAgICAgIH07CiAgICB9LAoKICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CgogICAgICAvLyBSZXNldCBzdGF0ZS5mb3JtYXR0aW5nCiAgICAgIHN0YXRlLmZvcm1hdHRpbmcgPSBmYWxzZTsKCiAgICAgIGlmIChzdHJlYW0gIT0gc3RhdGUudGhpc0xpbmUpIHsKICAgICAgICB2YXIgZm9yY2VCbGFua0xpbmUgPSBzdGF0ZS5oZWFkZXIgfHwgc3RhdGUuaHI7CgogICAgICAgIC8vIFJlc2V0IHN0YXRlLmhlYWRlciBhbmQgc3RhdGUuaHIKICAgICAgICBzdGF0ZS5oZWFkZXIgPSAwOwogICAgICAgIHN0YXRlLmhyID0gZmFsc2U7CgogICAgICAgIGlmIChzdHJlYW0ubWF0Y2goL15ccyokLywgdHJ1ZSkgfHwgZm9yY2VCbGFua0xpbmUpIHsKICAgICAgICAgIGJsYW5rTGluZShzdGF0ZSk7CiAgICAgICAgICBpZiAoIWZvcmNlQmxhbmtMaW5lKSByZXR1cm4gbnVsbAogICAgICAgICAgc3RhdGUucHJldkxpbmUgPSBudWxsCiAgICAgICAgfQoKICAgICAgICBzdGF0ZS5wcmV2TGluZSA9IHN0YXRlLnRoaXNMaW5lCiAgICAgICAgc3RhdGUudGhpc0xpbmUgPSBzdHJlYW0KCiAgICAgICAgLy8gUmVzZXQgc3RhdGUudGFza0xpc3QKICAgICAgICBzdGF0ZS50YXNrTGlzdCA9IGZhbHNlOwoKICAgICAgICAvLyBSZXNldCBzdGF0ZS50cmFpbGluZ1NwYWNlCiAgICAgICAgc3RhdGUudHJhaWxpbmdTcGFjZSA9IDA7CiAgICAgICAgc3RhdGUudHJhaWxpbmdTcGFjZU5ld0xpbmUgPSBmYWxzZTsKCiAgICAgICAgc3RhdGUuZiA9IHN0YXRlLmJsb2NrOwogICAgICAgIHZhciBpbmRlbnRhdGlvbiA9IHN0cmVhbS5tYXRjaCgvXlxzKi8sIHRydWUpWzBdLnJlcGxhY2UoL1x0L2csICcgICAgJykubGVuZ3RoOwogICAgICAgIHN0YXRlLmluZGVudGF0aW9uRGlmZiA9IE1hdGgubWluKGluZGVudGF0aW9uIC0gc3RhdGUuaW5kZW50YXRpb24sIDQpOwogICAgICAgIHN0YXRlLmluZGVudGF0aW9uID0gc3RhdGUuaW5kZW50YXRpb24gKyBzdGF0ZS5pbmRlbnRhdGlvbkRpZmY7CiAgICAgICAgaWYgKGluZGVudGF0aW9uID4gMCkgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgcmV0dXJuIHN0YXRlLmYoc3RyZWFtLCBzdGF0ZSk7CiAgICB9LAoKICAgIGlubmVyTW9kZTogZnVuY3Rpb24oc3RhdGUpIHsKICAgICAgaWYgKHN0YXRlLmJsb2NrID09IGh0bWxCbG9jaykgcmV0dXJuIHtzdGF0ZTogc3RhdGUuaHRtbFN0YXRlLCBtb2RlOiBodG1sTW9kZX07CiAgICAgIGlmIChzdGF0ZS5sb2NhbFN0YXRlKSByZXR1cm4ge3N0YXRlOiBzdGF0ZS5sb2NhbFN0YXRlLCBtb2RlOiBzdGF0ZS5sb2NhbE1vZGV9OwogICAgICByZXR1cm4ge3N0YXRlOiBzdGF0ZSwgbW9kZTogbW9kZX07CiAgICB9LAoKICAgIGJsYW5rTGluZTogYmxhbmtMaW5lLAoKICAgIGdldFR5cGU6IGdldFR5cGUsCgogICAgY2xvc2VCcmFja2V0czogIigpW117fScnXCJcImBgIiwKICAgIGZvbGQ6ICJtYXJrZG93biIKICB9OwogIHJldHVybiBtb2RlOwp9LCAieG1sIik7CgpDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveC1tYXJrZG93biIsICJtYXJrZG93biIpOwoKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/markdown/test.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24oKSB7CiAgdmFyIG1vZGUgPSBDb2RlTWlycm9yLmdldE1vZGUoe3RhYlNpemU6IDR9LCAibWFya2Rvd24iKTsKICBmdW5jdGlvbiBNVChuYW1lKSB7IHRlc3QubW9kZShuYW1lLCBtb2RlLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKTsgfQogIHZhciBtb2RlSGlnaGxpZ2h0Rm9ybWF0dGluZyA9IENvZGVNaXJyb3IuZ2V0TW9kZSh7dGFiU2l6ZTogNH0sIHtuYW1lOiAibWFya2Rvd24iLCBoaWdobGlnaHRGb3JtYXR0aW5nOiB0cnVlfSk7CiAgZnVuY3Rpb24gRlQobmFtZSkgeyB0ZXN0Lm1vZGUobmFtZSwgbW9kZUhpZ2hsaWdodEZvcm1hdHRpbmcsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpOyB9CiAgdmFyIG1vZGVBdHhOb1NwYWNlID0gQ29kZU1pcnJvci5nZXRNb2RlKHt0YWJTaXplOiA0fSwge25hbWU6ICJtYXJrZG93biIsIGFsbG93QXR4SGVhZGVyV2l0aG91dFNwYWNlOiB0cnVlfSk7CiAgZnVuY3Rpb24gQXR4Tm9TcGFjZVRlc3QobmFtZSkgeyB0ZXN0Lm1vZGUobmFtZSwgbW9kZUF0eE5vU3BhY2UsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpOyB9CiAgdmFyIG1vZGVGZW5jZWQgPSBDb2RlTWlycm9yLmdldE1vZGUoe3RhYlNpemU6IDR9LCB7bmFtZTogIm1hcmtkb3duIiwgZmVuY2VkQ29kZUJsb2NrczogdHJ1ZX0pOwogIGZ1bmN0aW9uIEZlbmNlZFRlc3QobmFtZSkgeyB0ZXN0Lm1vZGUobmFtZSwgbW9kZUZlbmNlZCwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7IH0KICB2YXIgbW9kZU92ZXJyaWRlQ2xhc3NlcyA9IENvZGVNaXJyb3IuZ2V0TW9kZSh7dGFic2l6ZTogNH0sIHsKICAgIG5hbWU6ICJtYXJrZG93biIsCiAgICBzdHJpa2V0aHJvdWdoOiB0cnVlLAogICAgdG9rZW5UeXBlT3ZlcnJpZGVzOiB7CiAgICAgICJoZWFkZXIiIDogIm92ZXJyaWRlLWhlYWRlciIsCiAgICAgICJjb2RlIiA6ICJvdmVycmlkZS1jb2RlIiwKICAgICAgInF1b3RlIiA6ICJvdmVycmlkZS1xdW90ZSIsCiAgICAgICJsaXN0MSIgOiAib3ZlcnJpZGUtbGlzdDEiLAogICAgICAibGlzdDIiIDogIm92ZXJyaWRlLWxpc3QyIiwKICAgICAgImxpc3QzIiA6ICJvdmVycmlkZS1saXN0MyIsCiAgICAgICJociIgOiAib3ZlcnJpZGUtaHIiLAogICAgICAiaW1hZ2UiIDogIm92ZXJyaWRlLWltYWdlIiwKICAgICAgImltYWdlQWx0VGV4dCI6ICJvdmVycmlkZS1pbWFnZS1hbHQtdGV4dCIsCiAgICAgICJpbWFnZU1hcmtlciI6ICJvdmVycmlkZS1pbWFnZS1tYXJrZXIiLAogICAgICAibGlua0lubGluZSIgOiAib3ZlcnJpZGUtbGluay1pbmxpbmUiLAogICAgICAibGlua0VtYWlsIiA6ICJvdmVycmlkZS1saW5rLWVtYWlsIiwKICAgICAgImxpbmtUZXh0IiA6ICJvdmVycmlkZS1saW5rLXRleHQiLAogICAgICAibGlua0hyZWYiIDogIm92ZXJyaWRlLWxpbmstaHJlZiIsCiAgICAgICJlbSIgOiAib3ZlcnJpZGUtZW0iLAogICAgICAic3Ryb25nIiA6ICJvdmVycmlkZS1zdHJvbmciLAogICAgICAic3RyaWtldGhyb3VnaCIgOiAib3ZlcnJpZGUtc3RyaWtldGhyb3VnaCIKICB9fSk7CiAgZnVuY3Rpb24gVG9rZW5UeXBlT3ZlcnJpZGVUZXN0KG5hbWUpIHsgdGVzdC5tb2RlKG5hbWUsIG1vZGVPdmVycmlkZUNsYXNzZXMsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpOyB9CiAgdmFyIG1vZGVGb3JtYXR0aW5nT3ZlcnJpZGUgPSBDb2RlTWlycm9yLmdldE1vZGUoe3RhYnNpemU6IDR9LCB7CiAgICBuYW1lOiAibWFya2Rvd24iLAogICAgaGlnaGxpZ2h0Rm9ybWF0dGluZzogdHJ1ZSwKICAgIHRva2VuVHlwZU92ZXJyaWRlczogewogICAgICAiZm9ybWF0dGluZyIgOiAib3ZlcnJpZGUtZm9ybWF0dGluZyIKICB9fSk7CiAgZnVuY3Rpb24gRm9ybWF0VG9rZW5UeXBlT3ZlcnJpZGVUZXN0KG5hbWUpIHsgdGVzdC5tb2RlKG5hbWUsIG1vZGVGb3JtYXR0aW5nT3ZlcnJpZGUsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpOyB9CgoKICBGVCgiZm9ybWF0dGluZ19lbUFzdGVyaXNrIiwKICAgICAiW2VtJmZvcm1hdHRpbmcmZm9ybWF0dGluZy1lbSAqXVtlbSBmb29dW2VtJmZvcm1hdHRpbmcmZm9ybWF0dGluZy1lbSAqXSIpOwoKICBGVCgiZm9ybWF0dGluZ19lbVVuZGVyc2NvcmUiLAogICAgICJbZW0mZm9ybWF0dGluZyZmb3JtYXR0aW5nLWVtIF9dW2VtIGZvb11bZW0mZm9ybWF0dGluZyZmb3JtYXR0aW5nLWVtIF9dIik7CgogIEZUKCJmb3JtYXR0aW5nX3N0cm9uZ0FzdGVyaXNrIiwKICAgICAiW3N0cm9uZyZmb3JtYXR0aW5nJmZvcm1hdHRpbmctc3Ryb25nICoqXVtzdHJvbmcgZm9vXVtzdHJvbmcmZm9ybWF0dGluZyZmb3JtYXR0aW5nLXN0cm9uZyAqKl0iKTsKCiAgRlQoImZvcm1hdHRpbmdfc3Ryb25nVW5kZXJzY29yZSIsCiAgICAgIltzdHJvbmcmZm9ybWF0dGluZyZmb3JtYXR0aW5nLXN0cm9uZyBfX11bc3Ryb25nIGZvb11bc3Ryb25nJmZvcm1hdHRpbmcmZm9ybWF0dGluZy1zdHJvbmcgX19dIik7CgogIEZUKCJmb3JtYXR0aW5nX2NvZGVCYWNrdGlja3MiLAogICAgICJbY29tbWVudCZmb3JtYXR0aW5nJmZvcm1hdHRpbmctY29kZSBgXVtjb21tZW50IGZvb11bY29tbWVudCZmb3JtYXR0aW5nJmZvcm1hdHRpbmctY29kZSBgXSIpOwoKICBGVCgiZm9ybWF0dGluZ19kb3VibGVCYWNrdGlja3MiLAogICAgICJbY29tbWVudCZmb3JtYXR0aW5nJmZvcm1hdHRpbmctY29kZSBgYF1bY29tbWVudCBmb28gYCBiYXJdW2NvbW1lbnQmZm9ybWF0dGluZyZmb3JtYXR0aW5nLWNvZGUgYGBdIik7CgogIEZUKCJmb3JtYXR0aW5nX2F0eEhlYWRlciIsCiAgICAgIltoZWFkZXImaGVhZGVyLTEmZm9ybWF0dGluZyZmb3JtYXR0aW5nLWhlYWRlciZmb3JtYXR0aW5nLWhlYWRlci0xICMgXVtoZWFkZXImaGVhZGVyLTEgZm9vICMgYmFyIF1baGVhZGVyJmhlYWRlci0xJmZvcm1hdHRpbmcmZm9ybWF0dGluZy1oZWFkZXImZm9ybWF0dGluZy1oZWFkZXItMSAjXSIpOwoKICBGVCgiZm9ybWF0dGluZ19zZXRleHRIZWFkZXIiLAogICAgICJmb28iLAogICAgICJbaGVhZGVyJmhlYWRlci0xJmZvcm1hdHRpbmcmZm9ybWF0dGluZy1oZWFkZXImZm9ybWF0dGluZy1oZWFkZXItMSA9XSIpOwoKICBGVCgiZm9ybWF0dGluZ19ibG9ja3F1b3RlIiwKICAgICAiW3F1b3RlJnF1b3RlLTEmZm9ybWF0dGluZyZmb3JtYXR0aW5nLXF1b3RlJmZvcm1hdHRpbmctcXVvdGUtMSA+IF1bcXVvdGUmcXVvdGUtMSBmb29dIik7CgogIEZUKCJmb3JtYXR0aW5nX2xpc3QiLAogICAgICJbdmFyaWFibGUtMiZmb3JtYXR0aW5nJmZvcm1hdHRpbmctbGlzdCZmb3JtYXR0aW5nLWxpc3QtdWwgLSBdW3ZhcmlhYmxlLTIgZm9vXSIpOwogIEZUKCJmb3JtYXR0aW5nX2xpc3QiLAogICAgICJbdmFyaWFibGUtMiZmb3JtYXR0aW5nJmZvcm1hdHRpbmctbGlzdCZmb3JtYXR0aW5nLWxpc3Qtb2wgMS4gXVt2YXJpYWJsZS0yIGZvb10iKTsKCiAgRlQoImZvcm1hdHRpbmdfbGluayIsCiAgICAgIltsaW5rJmZvcm1hdHRpbmcmZm9ybWF0dGluZy1saW5rIFtdW2xpbmsgZm9vXVtsaW5rJmZvcm1hdHRpbmcmZm9ybWF0dGluZy1saW5rIF1dXVtzdHJpbmcmZm9ybWF0dGluZyZmb3JtYXR0aW5nLWxpbmstc3RyaW5nJnVybCAoXVtzdHJpbmcmdXJsIGh0dHA6Ly9leGFtcGxlLmNvbS9dW3N0cmluZyZmb3JtYXR0aW5nJmZvcm1hdHRpbmctbGluay1zdHJpbmcmdXJsICldIik7CgogIEZUKCJmb3JtYXR0aW5nX2xpbmtSZWZlcmVuY2UiLAogICAgICJbbGluayZmb3JtYXR0aW5nJmZvcm1hdHRpbmctbGluayBbXVtsaW5rIGZvb11bbGluayZmb3JtYXR0aW5nJmZvcm1hdHRpbmctbGluayBdXV1bc3RyaW5nJmZvcm1hdHRpbmcmZm9ybWF0dGluZy1saW5rLXN0cmluZyZ1cmwgW11bc3RyaW5nJnVybCBiYXJdW3N0cmluZyZmb3JtYXR0aW5nJmZvcm1hdHRpbmctbGluay1zdHJpbmcmdXJsIF1dXSIsCiAgICAgIltsaW5rJmZvcm1hdHRpbmcmZm9ybWF0dGluZy1saW5rIFtdW2xpbmsgYmFyXVtsaW5rJmZvcm1hdHRpbmcmZm9ybWF0dGluZy1saW5rIF1dOl0gW3N0cmluZyZ1cmwgaHR0cDovL2V4YW1wbGUuY29tL10iKTsKCiAgRlQoImZvcm1hdHRpbmdfbGlua1dlYiIsCiAgICAgIltsaW5rJmZvcm1hdHRpbmcmZm9ybWF0dGluZy1saW5rIDxdW2xpbmsgaHR0cDovL2V4YW1wbGUuY29tL11bbGluayZmb3JtYXR0aW5nJmZvcm1hdHRpbmctbGluayA+XSIpOwoKICBGVCgiZm9ybWF0dGluZ19saW5rRW1haWwiLAogICAgICJbbGluayZmb3JtYXR0aW5nJmZvcm1hdHRpbmctbGluayA8XVtsaW5rIHVzZXJAZXhhbXBsZS5jb21dW2xpbmsmZm9ybWF0dGluZyZmb3JtYXR0aW5nLWxpbmsgPl0iKTsKCiAgRlQoImZvcm1hdHRpbmdfZXNjYXBlIiwKICAgICAiW2Zvcm1hdHRpbmctZXNjYXBlIFxcKl0iKTsKCiAgRlQoImZvcm1hdHRpbmdfaW1hZ2UiLAogICAgICJbZm9ybWF0dGluZyZmb3JtYXR0aW5nLWltYWdlJmltYWdlJmltYWdlLW1hcmtlciAhXVtmb3JtYXR0aW5nJmZvcm1hdHRpbmctaW1hZ2UmaW1hZ2UmaW1hZ2UtYWx0LXRleHQmbGluayBbW11baW1hZ2UmaW1hZ2UtYWx0LXRleHQmbGluayBhbHQgdGV4dF1bZm9ybWF0dGluZyZmb3JtYXR0aW5nLWltYWdlJmltYWdlJmltYWdlLWFsdC10ZXh0JmxpbmsgXV1dW2Zvcm1hdHRpbmcmZm9ybWF0dGluZy1saW5rLXN0cmluZyZzdHJpbmcmdXJsIChdW3VybCZzdHJpbmcgaHR0cDovL2xpbmsudG8vaW1hZ2UuanBnXVtmb3JtYXR0aW5nJmZvcm1hdHRpbmctbGluay1zdHJpbmcmc3RyaW5nJnVybCApXSIpOwoKICBNVCgicGxhaW5UZXh0IiwKICAgICAiZm9vIik7CgogIC8vIERvbid0IHN0eWxlIHNpbmdsZSB0cmFpbGluZyBzcGFjZQogIE1UKCJ0cmFpbGluZ1NwYWNlMSIsCiAgICAgImZvbyAiKTsKCiAgLy8gVHdvIG9yIG1vcmUgdHJhaWxpbmcgc3BhY2VzIHNob3VsZCBiZSBzdHlsZWQgd2l0aCBsaW5lIGJyZWFrIGNoYXJhY3RlcgogIE1UKCJ0cmFpbGluZ1NwYWNlMiIsCiAgICAgImZvb1t0cmFpbGluZy1zcGFjZS1hICBdW3RyYWlsaW5nLXNwYWNlLW5ldy1saW5lICBdIik7CgogIE1UKCJ0cmFpbGluZ1NwYWNlMyIsCiAgICAgImZvb1t0cmFpbGluZy1zcGFjZS1hICBdW3RyYWlsaW5nLXNwYWNlLWIgIF1bdHJhaWxpbmctc3BhY2UtbmV3LWxpbmUgIF0iKTsKCiAgTVQoInRyYWlsaW5nU3BhY2U0IiwKICAgICAiZm9vW3RyYWlsaW5nLXNwYWNlLWEgIF1bdHJhaWxpbmctc3BhY2UtYiAgXVt0cmFpbGluZy1zcGFjZS1hICBdW3RyYWlsaW5nLXNwYWNlLW5ldy1saW5lICBdIik7CgogIC8vIENvZGUgYmxvY2tzIHVzaW5nIDQgc3BhY2VzIChyZWdhcmRsZXNzIG9mIENvZGVNaXJyb3IudGFiU2l6ZSB2YWx1ZSkKICBNVCgiY29kZUJsb2Nrc1VzaW5nNFNwYWNlcyIsCiAgICAgIiAgICBbY29tbWVudCBmb29dIik7CgogIC8vIENvZGUgYmxvY2tzIHVzaW5nIDQgc3BhY2VzIHdpdGggaW50ZXJuYWwgaW5kZW50YXRpb24KICBNVCgiY29kZUJsb2Nrc1VzaW5nNFNwYWNlc0luZGVudGF0aW9uIiwKICAgICAiICAgIFtjb21tZW50IGJhcl0iLAogICAgICIgICAgICAgIFtjb21tZW50IGhlbGxvXSIsCiAgICAgIiAgICAgICAgICAgIFtjb21tZW50IHdvcmxkXSIsCiAgICAgIiAgICBbY29tbWVudCBmb29dIiwKICAgICAiYmFyIik7CgogIC8vIENvZGUgYmxvY2tzIHNob3VsZCBlbmQgZXZlbiBhZnRlciBleHRyYSBpbmRlbnRlZCBsaW5lcwogIE1UKCJjb2RlQmxvY2tzV2l0aFRyYWlsaW5nSW5kZW50ZWRMaW5lIiwKICAgICAiICAgIFtjb21tZW50IGZvb10iLAogICAgICIgICAgICAgIFtjb21tZW50IGJhcl0iLAogICAgICIgICAgW2NvbW1lbnQgYmF6XSIsCiAgICAgIiAgICAiLAogICAgICJoZWxsbyIpOwoKICAvLyBDb2RlIGJsb2NrcyB1c2luZyAxIHRhYiAocmVnYXJkbGVzcyBvZiBDb2RlTWlycm9yLmluZGVudFdpdGhUYWJzIHZhbHVlKQogIE1UKCJjb2RlQmxvY2tzVXNpbmcxVGFiIiwKICAgICAiXHRbY29tbWVudCBmb29dIik7CgogIC8vIE5vIGNvZGUgYmxvY2tzIGRpcmVjdGx5IGFmdGVyIHBhcmFncmFwaAogIC8vIGh0dHA6Ly9zcGVjLmNvbW1vbm1hcmsub3JnLzAuMTkvI2V4YW1wbGUtNjUKICBNVCgibm9Db2RlQmxvY2tzQWZ0ZXJQYXJhZ3JhcGgiLAogICAgICJGb28iLAogICAgICIgICAgQmFyIik7CgogIC8vIElubGluZSBjb2RlIHVzaW5nIGJhY2t0aWNrcwogIE1UKCJpbmxpbmVDb2RlVXNpbmdCYWNrdGlja3MiLAogICAgICJmb28gW2NvbW1lbnQgYGJhcmBdIik7CgogIC8vIEJsb2NrIGNvZGUgdXNpbmcgc2luZ2xlIGJhY2t0aWNrIChzaG91bGRuJ3Qgd29yaykKICBNVCgiYmxvY2tDb2RlU2luZ2xlQmFja3RpY2siLAogICAgICJbY29tbWVudCBgXSIsCiAgICAgIltjb21tZW50IGZvb10iLAogICAgICJbY29tbWVudCBgXSIpOwoKICAvLyBVbmNsb3NlZCBiYWNrdGlja3MKICAvLyBJbnN0ZWFkIG9mIHNpbXBseSBtYXJraW5nIGFzIENPREUsIGl0IHdvdWxkIGJlIG5pY2UgdG8gaGF2ZSBhbgogIC8vIGluY29tcGxldGUgZmxhZyBmb3IgQ09ERSwgdGhhdCBpcyBzdHlsZWQgc2xpZ2h0bHkgZGlmZmVyZW50LgogIE1UKCJ1bmNsb3NlZEJhY2t0aWNrcyIsCiAgICAgImZvbyBbY29tbWVudCBgYmFyXSIpOwoKICAvLyBQZXIgZG9jdW1lbnRhdGlvbjogIlRvIGluY2x1ZGUgYSBsaXRlcmFsIGJhY2t0aWNrIGNoYXJhY3RlciB3aXRoaW4gYQogIC8vIGNvZGUgc3BhbiwgeW91IGNhbiB1c2UgbXVsdGlwbGUgYmFja3RpY2tzIGFzIHRoZSBvcGVuaW5nIGFuZCBjbG9zaW5nCiAgLy8gZGVsaW1pdGVycyIKICBNVCgiZG91YmxlQmFja3RpY2tzIiwKICAgICAiW2NvbW1lbnQgYGBmb28gYCBiYXJgYF0iKTsKCiAgLy8gVGVzdHMgYmFzZWQgb24gRGluZ3VzCiAgLy8gaHR0cDovL2RhcmluZ2ZpcmViYWxsLm5ldC9wcm9qZWN0cy9tYXJrZG93bi9kaW5ndXMKICAvLwogIC8vIE11bHRpcGxlIGJhY2t0aWNrcyB3aXRoaW4gYW4gaW5saW5lIGNvZGUgYmxvY2sKICBNVCgiY29uc2VjdXRpdmVCYWNrdGlja3MiLAogICAgICJbY29tbWVudCBgZm9vYGBgYmFyYF0iKTsKCiAgLy8gTXVsdGlwbGUgYmFja3RpY2tzIHdpdGhpbiBhbiBpbmxpbmUgY29kZSBibG9jayB3aXRoIGEgc2Vjb25kIGNvZGUgYmxvY2sKICBNVCgiY29uc2VjdXRpdmVCYWNrdGlja3MiLAogICAgICJbY29tbWVudCBgZm9vYGBgYmFyYF0gaGVsbG8gW2NvbW1lbnQgYHdvcmxkYF0iKTsKCiAgLy8gVW5jbG9zZWQgd2l0aCBzZXZlcmFsIGRpZmZlcmVudCBncm91cHMgb2YgYmFja3RpY2tzCiAgTVQoInVuY2xvc2VkQmFja3RpY2tzIiwKICAgICAiW2NvbW1lbnQgYGBmb28gYGBgIGJhcmAgaGVsbG9dIik7CgogIC8vIENsb3NlZCB3aXRoIHNldmVyYWwgZGlmZmVyZW50IGdyb3VwcyBvZiBiYWNrdGlja3MKICBNVCgiY2xvc2VkQmFja3RpY2tzIiwKICAgICAiW2NvbW1lbnQgYGBmb28gYGBgIGJhcmAgaGVsbG9gYF0gd29ybGQiKTsKCiAgLy8gYXR4IGhlYWRlcnMKICAvLyBodHRwOi8vZGFyaW5nZmlyZWJhbGwubmV0L3Byb2plY3RzL21hcmtkb3duL3N5bnRheCNoZWFkZXIKCiAgTVQoImF0eEgxIiwKICAgICAiW2hlYWRlciZoZWFkZXItMSAjIGZvb10iKTsKCiAgTVQoImF0eEgyIiwKICAgICAiW2hlYWRlciZoZWFkZXItMiAjIyBmb29dIik7CgogIE1UKCJhdHhIMyIsCiAgICAgIltoZWFkZXImaGVhZGVyLTMgIyMjIGZvb10iKTsKCiAgTVQoImF0eEg0IiwKICAgICAiW2hlYWRlciZoZWFkZXItNCAjIyMjIGZvb10iKTsKCiAgTVQoImF0eEg1IiwKICAgICAiW2hlYWRlciZoZWFkZXItNSAjIyMjIyBmb29dIik7CgogIE1UKCJhdHhINiIsCiAgICAgIltoZWFkZXImaGVhZGVyLTYgIyMjIyMjIGZvb10iKTsKCiAgLy8gaHR0cDovL3NwZWMuY29tbW9ubWFyay5vcmcvMC4xOS8jZXhhbXBsZS0yNAogIE1UKCJub0F0eEg3IiwKICAgICAiIyMjIyMjIyBmb28iKTsKCiAgLy8gaHR0cDovL3NwZWMuY29tbW9ubWFyay5vcmcvMC4xOS8jZXhhbXBsZS0yNQogIE1UKCJub0F0eEgxV2l0aG91dFNwYWNlIiwKICAgICAiIzUgYm9sdCIpOwoKICAvLyBDb21tb25NYXJrIHJlcXVpcmVzIGEgc3BhY2UgYWZ0ZXIgIyBidXQgbW9zdCBwYXJzZXJzIGRvbid0CiAgQXR4Tm9TcGFjZVRlc3QoImF0eE5vU3BhY2VBbGxvd2VkX0gxTm9TcGFjZSIsCiAgICAgIltoZWFkZXImaGVhZGVyLTEgI2Zvb10iKTsKCiAgQXR4Tm9TcGFjZVRlc3QoImF0eE5vU3BhY2VBbGxvd2VkX0g0Tm9TcGFjZSIsCiAgICAgIltoZWFkZXImaGVhZGVyLTQgIyMjI2Zvb10iKTsKCiAgQXR4Tm9TcGFjZVRlc3QoImF0eE5vU3BhY2VBbGxvd2VkX0gxU3BhY2UiLAogICAgICJbaGVhZGVyJmhlYWRlci0xICMgZm9vXSIpOwoKICAvLyBJbmxpbmUgc3R5bGVzIHNob3VsZCBiZSBwYXJzZWQgaW5zaWRlIGhlYWRlcnMKICBNVCgiYXR4SDFpbmxpbmUiLAogICAgICJbaGVhZGVyJmhlYWRlci0xICMgZm9vIF1baGVhZGVyJmhlYWRlci0xJmVtICpiYXIqXSIpOwoKICAvLyBTZXRleHQgaGVhZGVycyAtIEgxLCBIMgogIC8vIFBlciBkb2N1bWVudGF0aW9uLCAiQW55IG51bWJlciBvZiB1bmRlcmxpbmluZyA94oCZcyBvciAt4oCZcyB3aWxsIHdvcmsuIgogIC8vIGh0dHA6Ly9kYXJpbmdmaXJlYmFsbC5uZXQvcHJvamVjdHMvbWFya2Rvd24vc3ludGF4I2hlYWRlcgogIC8vIElkZWFsbHksIHRoZSB0ZXh0IHdvdWxkIGJlIG1hcmtlZCBhcyBgaGVhZGVyYCBhcyB3ZWxsLCBidXQgdGhpcyBpcwogIC8vIG5vdCByZWFsbHkgZmVhc2libGUgYXQgdGhlIG1vbWVudC4gU28sIGluc3RlYWQsIHdlJ3JlIHRlc3RpbmcgYWdhaW5zdAogIC8vIHdoYXQgd29ya3MgdG9kYXksIHRvIGF2b2lkIGFueSByZWdyZXNzaW9ucy4KICAvLwogIC8vIENoZWNrIGlmIHNpbmdsZSB1bmRlcmxpbmluZyA9IHdvcmtzCiAgTVQoInNldGV4dEgxIiwKICAgICAiZm9vIiwKICAgICAiW2hlYWRlciZoZWFkZXItMSA9XSIpOwoKICAvLyBDaGVjayBpZiAzKyA9J3Mgd29yawogIE1UKCJzZXRleHRIMSIsCiAgICAgImZvbyIsCiAgICAgIltoZWFkZXImaGVhZGVyLTEgPT09XSIpOwoKICAvLyBDaGVjayBpZiBzaW5nbGUgdW5kZXJsaW5pbmcgLSB3b3JrcwogIE1UKCJzZXRleHRIMiIsCiAgICAgImZvbyIsCiAgICAgIltoZWFkZXImaGVhZGVyLTIgLV0iKTsKCiAgLy8gQ2hlY2sgaWYgMysgLSdzIHdvcmsKICBNVCgic2V0ZXh0SDIiLAogICAgICJmb28iLAogICAgICJbaGVhZGVyJmhlYWRlci0yIC0tLV0iKTsKCiAgLy8gaHR0cDovL3NwZWMuY29tbW9ubWFyay5vcmcvMC4xOS8jZXhhbXBsZS00NQogIE1UKCJzZXRleHRIMkFsbG93U3BhY2VzIiwKICAgICAiZm9vIiwKICAgICAiICAgW2hlYWRlciZoZWFkZXItMiAtLS0tICAgICAgXSIpOwoKICAvLyBodHRwOi8vc3BlYy5jb21tb25tYXJrLm9yZy8wLjE5LyNleGFtcGxlLTQ0CiAgTVQoIm5vU2V0ZXh0QWZ0ZXJJbmRlbnRlZENvZGVCbG9jayIsCiAgICAgIiAgICAgW2NvbW1lbnQgZm9vXSIsCiAgICAgIltociAtLS1dIik7CgogIC8vIGh0dHA6Ly9zcGVjLmNvbW1vbm1hcmsub3JnLzAuMTkvI2V4YW1wbGUtNTEKICBNVCgibm9TZXRleHRBZnRlclF1b3RlIiwKICAgICAiW3F1b3RlJnF1b3RlLTEgPiBmb29dIiwKICAgICAiW2hyIC0tLV0iKTsKCiAgTVQoIm5vU2V0ZXh0QWZ0ZXJMaXN0IiwKICAgICAiW3ZhcmlhYmxlLTIgLSBmb29dIiwKICAgICAiW2hyIC0tLV0iKTsKCiAgLy8gU2luZ2xlLWxpbmUgYmxvY2txdW90ZSB3aXRoIHRyYWlsaW5nIHNwYWNlCiAgTVQoImJsb2NrcXVvdGVTcGFjZSIsCiAgICAgIltxdW90ZSZxdW90ZS0xID4gZm9vXSIpOwoKICAvLyBTaW5nbGUtbGluZSBibG9ja3F1b3RlCiAgTVQoImJsb2NrcXVvdGVOb1NwYWNlIiwKICAgICAiW3F1b3RlJnF1b3RlLTEgPmZvb10iKTsKCiAgLy8gTm8gYmxhbmsgbGluZSBiZWZvcmUgYmxvY2txdW90ZQogIE1UKCJibG9ja3F1b3RlTm9CbGFua0xpbmUiLAogICAgICJmb28iLAogICAgICJbcXVvdGUmcXVvdGUtMSA+IGJhcl0iKTsKCiAgLy8gTmVzdGVkIGJsb2NrcXVvdGUKICBNVCgiYmxvY2txdW90ZVNwYWNlIiwKICAgICAiW3F1b3RlJnF1b3RlLTEgPiBmb29dIiwKICAgICAiW3F1b3RlJnF1b3RlLTEgPl1bcXVvdGUmcXVvdGUtMiA+IGZvb10iLAogICAgICJbcXVvdGUmcXVvdGUtMSA+XVtxdW90ZSZxdW90ZS0yID5dW3F1b3RlJnF1b3RlLTMgPiBmb29dIik7CgogIC8vIFNpbmdsZS1saW5lIGJsb2NrcXVvdGUgZm9sbG93ZWQgYnkgbm9ybWFsIHBhcmFncmFwaAogIE1UKCJibG9ja3F1b3RlVGhlblBhcmFncmFwaCIsCiAgICAgIltxdW90ZSZxdW90ZS0xID5mb29dIiwKICAgICAiIiwKICAgICAiYmFyIik7CgogIC8vIE11bHRpLWxpbmUgYmxvY2txdW90ZSAobGF6eSBtb2RlKQogIE1UKCJtdWx0aUJsb2NrcXVvdGVMYXp5IiwKICAgICAiW3F1b3RlJnF1b3RlLTEgPmZvb10iLAogICAgICJbcXVvdGUmcXVvdGUtMSBiYXJdIik7CgogIC8vIE11bHRpLWxpbmUgYmxvY2txdW90ZSBmb2xsb3dlZCBieSBub3JtYWwgcGFyYWdyYXBoIChsYXp5IG1vZGUpCiAgTVQoIm11bHRpQmxvY2txdW90ZUxhenlUaGVuUGFyYWdyYXBoIiwKICAgICAiW3F1b3RlJnF1b3RlLTEgPmZvb10iLAogICAgICJbcXVvdGUmcXVvdGUtMSBiYXJdIiwKICAgICAiIiwKICAgICAiaGVsbG8iKTsKCiAgLy8gTXVsdGktbGluZSBibG9ja3F1b3RlIChub24tbGF6eSBtb2RlKQogIE1UKCJtdWx0aUJsb2NrcXVvdGUiLAogICAgICJbcXVvdGUmcXVvdGUtMSA+Zm9vXSIsCiAgICAgIltxdW90ZSZxdW90ZS0xID5iYXJdIik7CgogIC8vIE11bHRpLWxpbmUgYmxvY2txdW90ZSBmb2xsb3dlZCBieSBub3JtYWwgcGFyYWdyYXBoIChub24tbGF6eSBtb2RlKQogIE1UKCJtdWx0aUJsb2NrcXVvdGVUaGVuUGFyYWdyYXBoIiwKICAgICAiW3F1b3RlJnF1b3RlLTEgPmZvb10iLAogICAgICJbcXVvdGUmcXVvdGUtMSA+YmFyXSIsCiAgICAgIiIsCiAgICAgImhlbGxvIik7CgogIC8vIEhlYWRlciB3aXRoIGxlYWRpbmcgc3BhY2UgYWZ0ZXIgY29udGludWVkIGJsb2NrcXVvdGUgKCMzMjg3LCBuZWdhdGl2ZSBpbmRlbnRhdGlvbikKICBNVCgiaGVhZGVyQWZ0ZXJDb250aW51ZWRCbG9ja3F1b3RlIiwKICAgICAiW3F1b3RlJnF1b3RlLTEgPiBmb29dIiwKICAgICAiW3F1b3RlJnF1b3RlLTEgYmFyXSIsCiAgICAgIiIsCiAgICAgIiBbaGVhZGVyJmhlYWRlci0xICMgaGVsbG9dIik7CgogIC8vIENoZWNrIGxpc3QgdHlwZXMKCiAgTVQoImxpc3RBc3RlcmlzayIsCiAgICAgImZvbyIsCiAgICAgImJhciIsCiAgICAgIiIsCiAgICAgIlt2YXJpYWJsZS0yICogZm9vXSIsCiAgICAgIlt2YXJpYWJsZS0yICogYmFyXSIpOwoKICBNVCgibGlzdFBsdXMiLAogICAgICJmb28iLAogICAgICJiYXIiLAogICAgICIiLAogICAgICJbdmFyaWFibGUtMiArIGZvb10iLAogICAgICJbdmFyaWFibGUtMiArIGJhcl0iKTsKCiAgTVQoImxpc3REYXNoIiwKICAgICAiZm9vIiwKICAgICAiYmFyIiwKICAgICAiIiwKICAgICAiW3ZhcmlhYmxlLTIgLSBmb29dIiwKICAgICAiW3ZhcmlhYmxlLTIgLSBiYXJdIik7CgogIE1UKCJsaXN0TnVtYmVyIiwKICAgICAiZm9vIiwKICAgICAiYmFyIiwKICAgICAiIiwKICAgICAiW3ZhcmlhYmxlLTIgMS4gZm9vXSIsCiAgICAgIlt2YXJpYWJsZS0yIDIuIGJhcl0iKTsKCiAgLy8gTGlzdHMgcmVxdWlyZSBhIHByZWNlZGluZyBibGFuayBsaW5lIChwZXIgRGluZ3VzKQogIE1UKCJsaXN0Qm9ndXMiLAogICAgICJmb28iLAogICAgICIxLiBiYXIiLAogICAgICIyLiBoZWxsbyIpOwoKICAvLyBMaXN0IGFmdGVyIGhyCiAgTVQoImxpc3RBZnRlckhyIiwKICAgICAiW2hyIC0tLV0iLAogICAgICJbdmFyaWFibGUtMiAtIGJhcl0iKTsKCiAgLy8gTGlzdCBhZnRlciBoZWFkZXIKICBNVCgibGlzdEFmdGVySGVhZGVyIiwKICAgICAiW2hlYWRlciZoZWFkZXItMSAjIGZvb10iLAogICAgICJbdmFyaWFibGUtMiAtIGJhcl0iKTsKCiAgLy8gaHIgYWZ0ZXIgbGlzdAogIE1UKCJockFmdGVyTGlzdCIsCiAgICAgIlt2YXJpYWJsZS0yIC0gZm9vXSIsCiAgICAgIltociAtLS0tLV0iKTsKCiAgLy8gRm9ybWF0dGluZyBpbiBsaXN0cyAoKikKICBNVCgibGlzdEFzdGVyaXNrRm9ybWF0dGluZyIsCiAgICAgIlt2YXJpYWJsZS0yICogXVt2YXJpYWJsZS0yJmVtICpmb28qXVt2YXJpYWJsZS0yICBiYXJdIiwKICAgICAiW3ZhcmlhYmxlLTIgKiBdW3ZhcmlhYmxlLTImc3Ryb25nICoqZm9vKipdW3ZhcmlhYmxlLTIgIGJhcl0iLAogICAgICJbdmFyaWFibGUtMiAqIF1bdmFyaWFibGUtMiZzdHJvbmcgKipdW3ZhcmlhYmxlLTImZW0mc3Ryb25nICpmb28qKl1bdmFyaWFibGUtMiZlbSAqXVt2YXJpYWJsZS0yICBiYXJdIiwKICAgICAiW3ZhcmlhYmxlLTIgKiBdW3ZhcmlhYmxlLTImY29tbWVudCBgZm9vYF1bdmFyaWFibGUtMiAgYmFyXSIpOwoKICAvLyBGb3JtYXR0aW5nIGluIGxpc3RzICgrKQogIE1UKCJsaXN0UGx1c0Zvcm1hdHRpbmciLAogICAgICJbdmFyaWFibGUtMiArIF1bdmFyaWFibGUtMiZlbSAqZm9vKl1bdmFyaWFibGUtMiAgYmFyXSIsCiAgICAgIlt2YXJpYWJsZS0yICsgXVt2YXJpYWJsZS0yJnN0cm9uZyAqKmZvbyoqXVt2YXJpYWJsZS0yICBiYXJdIiwKICAgICAiW3ZhcmlhYmxlLTIgKyBdW3ZhcmlhYmxlLTImc3Ryb25nICoqXVt2YXJpYWJsZS0yJmVtJnN0cm9uZyAqZm9vKipdW3ZhcmlhYmxlLTImZW0gKl1bdmFyaWFibGUtMiAgYmFyXSIsCiAgICAgIlt2YXJpYWJsZS0yICsgXVt2YXJpYWJsZS0yJmNvbW1lbnQgYGZvb2BdW3ZhcmlhYmxlLTIgIGJhcl0iKTsKCiAgLy8gRm9ybWF0dGluZyBpbiBsaXN0cyAoLSkKICBNVCgibGlzdERhc2hGb3JtYXR0aW5nIiwKICAgICAiW3ZhcmlhYmxlLTIgLSBdW3ZhcmlhYmxlLTImZW0gKmZvbypdW3ZhcmlhYmxlLTIgIGJhcl0iLAogICAgICJbdmFyaWFibGUtMiAtIF1bdmFyaWFibGUtMiZzdHJvbmcgKipmb28qKl1bdmFyaWFibGUtMiAgYmFyXSIsCiAgICAgIlt2YXJpYWJsZS0yIC0gXVt2YXJpYWJsZS0yJnN0cm9uZyAqKl1bdmFyaWFibGUtMiZlbSZzdHJvbmcgKmZvbyoqXVt2YXJpYWJsZS0yJmVtICpdW3ZhcmlhYmxlLTIgIGJhcl0iLAogICAgICJbdmFyaWFibGUtMiAtIF1bdmFyaWFibGUtMiZjb21tZW50IGBmb29gXVt2YXJpYWJsZS0yICBiYXJdIik7CgogIC8vIEZvcm1hdHRpbmcgaW4gbGlzdHMgKDEuKQogIE1UKCJsaXN0TnVtYmVyRm9ybWF0dGluZyIsCiAgICAgIlt2YXJpYWJsZS0yIDEuIF1bdmFyaWFibGUtMiZlbSAqZm9vKl1bdmFyaWFibGUtMiAgYmFyXSIsCiAgICAgIlt2YXJpYWJsZS0yIDIuIF1bdmFyaWFibGUtMiZzdHJvbmcgKipmb28qKl1bdmFyaWFibGUtMiAgYmFyXSIsCiAgICAgIlt2YXJpYWJsZS0yIDMuIF1bdmFyaWFibGUtMiZzdHJvbmcgKipdW3ZhcmlhYmxlLTImZW0mc3Ryb25nICpmb28qKl1bdmFyaWFibGUtMiZlbSAqXVt2YXJpYWJsZS0yICBiYXJdIiwKICAgICAiW3ZhcmlhYmxlLTIgNC4gXVt2YXJpYWJsZS0yJmNvbW1lbnQgYGZvb2BdW3ZhcmlhYmxlLTIgIGJhcl0iKTsKCiAgLy8gUGFyYWdyYXBoIGxpc3RzCiAgTVQoImxpc3RQYXJhZ3JhcGgiLAogICAgICJbdmFyaWFibGUtMiAqIGZvb10iLAogICAgICIiLAogICAgICJbdmFyaWFibGUtMiAqIGJhcl0iKTsKCiAgLy8gTXVsdGktcGFyYWdyYXBoIGxpc3RzCiAgLy8KICAvLyA0IHNwYWNlcwogIE1UKCJsaXN0TXVsdGlQYXJhZ3JhcGgiLAogICAgICJbdmFyaWFibGUtMiAqIGZvb10iLAogICAgICIiLAogICAgICJbdmFyaWFibGUtMiAqIGJhcl0iLAogICAgICIiLAogICAgICIgICAgW3ZhcmlhYmxlLTIgaGVsbG9dIik7CgogIC8vIDQgc3BhY2VzLCBleHRyYSBibGFuayBsaW5lcyAoc2hvdWxkIHN0aWxsIGJlIGxpc3QsIHBlciBEaW5ndXMpCiAgTVQoImxpc3RNdWx0aVBhcmFncmFwaEV4dHJhIiwKICAgICAiW3ZhcmlhYmxlLTIgKiBmb29dIiwKICAgICAiIiwKICAgICAiW3ZhcmlhYmxlLTIgKiBiYXJdIiwKICAgICAiIiwKICAgICAiIiwKICAgICAiICAgIFt2YXJpYWJsZS0yIGhlbGxvXSIpOwoKICAvLyA0IHNwYWNlcywgcGx1cyAxIHNwYWNlIChzaG91bGQgc3RpbGwgYmUgbGlzdCwgcGVyIERpbmd1cykKICBNVCgibGlzdE11bHRpUGFyYWdyYXBoRXh0cmFTcGFjZSIsCiAgICAgIlt2YXJpYWJsZS0yICogZm9vXSIsCiAgICAgIiIsCiAgICAgIlt2YXJpYWJsZS0yICogYmFyXSIsCiAgICAgIiIsCiAgICAgIiAgICAgW3ZhcmlhYmxlLTIgaGVsbG9dIiwKICAgICAiIiwKICAgICAiICAgIFt2YXJpYWJsZS0yIHdvcmxkXSIpOwoKICAvLyAxIHRhYgogIE1UKCJsaXN0VGFiIiwKICAgICAiW3ZhcmlhYmxlLTIgKiBmb29dIiwKICAgICAiIiwKICAgICAiW3ZhcmlhYmxlLTIgKiBiYXJdIiwKICAgICAiIiwKICAgICAiXHRbdmFyaWFibGUtMiBoZWxsb10iKTsKCiAgLy8gTm8gaW5kZW50CiAgTVQoImxpc3ROb0luZGVudCIsCiAgICAgIlt2YXJpYWJsZS0yICogZm9vXSIsCiAgICAgIiIsCiAgICAgIlt2YXJpYWJsZS0yICogYmFyXSIsCiAgICAgIiIsCiAgICAgImhlbGxvIik7CgogIE1UKCJsaXN0Q29tbW9uTWFya0luZGVudGF0aW9uQ29kZSIsCiAgICAgIlt2YXJpYWJsZS0yICogQ29kZSBibG9ja3MgYWxzbyBhZmZlY3RdIiwKICAgICAiICBbdmFyaWFibGUtMyAqIFRoZSBuZXh0IGxldmVsIHN0YXJ0cyB3aGVyZSB0aGUgY29udGVudHMgc3RhcnQuXSIsCiAgICAgIiAgIFt2YXJpYWJsZS0zICogICAgQW55dGhpbmcgbGVzcyB0aGFuIHRoYXQgd2lsbCBrZWVwIHRoZSBpdGVtIG9uIHRoZSBzYW1lIGxldmVsLl0iLAogICAgICIgICAgICAgW3ZhcmlhYmxlLTMgKiBFYWNoIGxpc3QgaXRlbSBjYW4gaW5kZW50IHRoZSBmaXJzdCBsZXZlbCBmdXJ0aGVyIGFuZCBmdXJ0aGVyLl0iLAogICAgICIgIFt2YXJpYWJsZS0zICogRm9yIHRoZSBtb3N0IHBhcnQsIHRoaXMgbWFrZXMgc2Vuc2Ugd2hpbGUgd3JpdGluZyBhIGxpc3QuXSIsCiAgICAgIiAgICBba2V5d29yZCAqIFRoaXMgbWVhbnMgdHdvIGl0ZW1zIHdpdGggc2FtZSBpbmRlbnRhdGlvbiBjYW4gYmUgZGlmZmVyZW50IGxldmVscy5dIiwKICAgICAiICAgICBba2V5d29yZCAqICBFYWNoIGxldmVsIGhhcyBhbiBpbmRlbnQgcmVxdWlyZW1lbnQgdGhhdCBjYW4gY2hhbmdlIGJldHdlZW4gaXRlbXMuXSIsCiAgICAgIiAgICAgICBba2V5d29yZCAqIEEgbGlzdCBpdGVtIHRoYXQgbWVldHMgdGhpcyB3aWxsIGJlIHBhcnQgb2YgdGhlIG5leHQgbGV2ZWwuXSIsCiAgICAgIiAgIFt2YXJpYWJsZS0zICogT3RoZXJ3aXNlLCBpdCB3aWxsIGJlIHBhcnQgb2YgdGhlIGxldmVsIHdoZXJlIGl0IGRvZXMgbWVldCB0aGlzLl0iLAogICAgICIgW3ZhcmlhYmxlLTIgKiBXb3JsZF0iKTsKCiAgLy8gQmxvY2txdW90ZQogIE1UKCJibG9ja3F1b3RlIiwKICAgICAiW3ZhcmlhYmxlLTIgKiBmb29dIiwKICAgICAiIiwKICAgICAiW3ZhcmlhYmxlLTIgKiBiYXJdIiwKICAgICAiIiwKICAgICAiICAgIFt2YXJpYWJsZS0yJnF1b3RlJnF1b3RlLTEgPiBoZWxsb10iKTsKCiAgLy8gQ29kZSBibG9jawogIE1UKCJibG9ja3F1b3RlQ29kZSIsCiAgICAgIlt2YXJpYWJsZS0yICogZm9vXSIsCiAgICAgIiIsCiAgICAgIlt2YXJpYWJsZS0yICogYmFyXSIsCiAgICAgIiIsCiAgICAgIiAgICAgICAgW2NvbW1lbnQgPiBoZWxsb10iLAogICAgICIiLAogICAgICIgICAgW3ZhcmlhYmxlLTIgd29ybGRdIik7CgogIC8vIENvZGUgYmxvY2sgZm9sbG93ZWQgYnkgdGV4dAogIE1UKCJibG9ja3F1b3RlQ29kZVRleHQiLAogICAgICJbdmFyaWFibGUtMiAqIGZvb10iLAogICAgICIiLAogICAgICIgICAgW3ZhcmlhYmxlLTIgYmFyXSIsCiAgICAgIiIsCiAgICAgIiAgICAgICAgW2NvbW1lbnQgaGVsbG9dIiwKICAgICAiIiwKICAgICAiICAgIFt2YXJpYWJsZS0yIHdvcmxkXSIpOwoKICAvLyBOZXN0ZWQgbGlzdAoKICBNVCgibGlzdEFzdGVyaXNrTmVzdGVkIiwKICAgICAiW3ZhcmlhYmxlLTIgKiBmb29dIiwKICAgICAiIiwKICAgICAiICAgIFt2YXJpYWJsZS0zICogYmFyXSIpOwoKICBNVCgibGlzdFBsdXNOZXN0ZWQiLAogICAgICJbdmFyaWFibGUtMiArIGZvb10iLAogICAgICIiLAogICAgICIgICAgW3ZhcmlhYmxlLTMgKyBiYXJdIik7CgogIE1UKCJsaXN0RGFzaE5lc3RlZCIsCiAgICAgIlt2YXJpYWJsZS0yIC0gZm9vXSIsCiAgICAgIiIsCiAgICAgIiAgICBbdmFyaWFibGUtMyAtIGJhcl0iKTsKCiAgTVQoImxpc3ROdW1iZXJOZXN0ZWQiLAogICAgICJbdmFyaWFibGUtMiAxLiBmb29dIiwKICAgICAiIiwKICAgICAiICAgIFt2YXJpYWJsZS0zIDIuIGJhcl0iKTsKCiAgTVQoImxpc3RNaXhlZCIsCiAgICAgIlt2YXJpYWJsZS0yICogZm9vXSIsCiAgICAgIiIsCiAgICAgIiAgICBbdmFyaWFibGUtMyArIGJhcl0iLAogICAgICIiLAogICAgICIgICAgICAgIFtrZXl3b3JkIC0gaGVsbG9dIiwKICAgICAiIiwKICAgICAiICAgICAgICAgICAgW3ZhcmlhYmxlLTIgMS4gd29ybGRdIik7CgogIE1UKCJsaXN0QmxvY2txdW90ZSIsCiAgICAgIlt2YXJpYWJsZS0yICogZm9vXSIsCiAgICAgIiIsCiAgICAgIiAgICBbdmFyaWFibGUtMyArIGJhcl0iLAogICAgICIiLAogICAgICIgICAgICAgIFtxdW90ZSZxdW90ZS0xJnZhcmlhYmxlLTMgPiBoZWxsb10iKTsKCiAgTVQoImxpc3RDb2RlIiwKICAgICAiW3ZhcmlhYmxlLTIgKiBmb29dIiwKICAgICAiIiwKICAgICAiICAgIFt2YXJpYWJsZS0zICsgYmFyXSIsCiAgICAgIiIsCiAgICAgIiAgICAgICAgICAgIFtjb21tZW50IGhlbGxvXSIpOwoKICAvLyBDb2RlIHdpdGggaW50ZXJuYWwgaW5kZW50YXRpb24KICBNVCgibGlzdENvZGVJbmRlbnRhdGlvbiIsCiAgICAgIlt2YXJpYWJsZS0yICogZm9vXSIsCiAgICAgIiIsCiAgICAgIiAgICAgICAgW2NvbW1lbnQgYmFyXSIsCiAgICAgIiAgICAgICAgICAgIFtjb21tZW50IGhlbGxvXSIsCiAgICAgIiAgICAgICAgICAgICAgICBbY29tbWVudCB3b3JsZF0iLAogICAgICIgICAgICAgIFtjb21tZW50IGZvb10iLAogICAgICIgICAgW3ZhcmlhYmxlLTIgYmFyXSIpOwoKICAvLyBMaXN0IG5lc3RpbmcgZWRnZSBjYXNlcwogIE1UKCJsaXN0TmVzdGVkIiwKICAgICJbdmFyaWFibGUtMiAqIGZvb10iLAogICAgIiIsCiAgICAiICAgIFt2YXJpYWJsZS0zICogYmFyXSIsCiAgICAiIiwKICAgICIgICAgICAgW3ZhcmlhYmxlLTMgaGVsbG9dIgogICk7CiAgTVQoImxpc3ROZXN0ZWQiLAogICAgIlt2YXJpYWJsZS0yICogZm9vXSIsCiAgICAiIiwKICAgICIgICAgW3ZhcmlhYmxlLTMgKiBiYXJdIiwKICAgICIiLAogICAgIiAgICAgIFtrZXl3b3JkICogZm9vXSIKICApOwoKICAvLyBDb2RlIGZvbGxvd2VkIGJ5IHRleHQKICBNVCgibGlzdENvZGVUZXh0IiwKICAgICAiW3ZhcmlhYmxlLTIgKiBmb29dIiwKICAgICAiIiwKICAgICAiICAgICAgICBbY29tbWVudCBiYXJdIiwKICAgICAiIiwKICAgICAiaGVsbG8iKTsKCiAgLy8gRm9sbG93aW5nIHRlc3RzIGRpcmVjdGx5IGZyb20gb2ZmaWNpYWwgTWFya2Rvd24gZG9jdW1lbnRhdGlvbgogIC8vIGh0dHA6Ly9kYXJpbmdmaXJlYmFsbC5uZXQvcHJvamVjdHMvbWFya2Rvd24vc3ludGF4I2hyCgogIE1UKCJoclNwYWNlIiwKICAgICAiW2hyICogKiAqXSIpOwoKICBNVCgiaHIiLAogICAgICJbaHIgKioqXSIpOwoKICBNVCgiaHJMb25nIiwKICAgICAiW2hyICoqKioqXSIpOwoKICBNVCgiaHJTcGFjZURhc2giLAogICAgICJbaHIgLSAtIC1dIik7CgogIE1UKCJockRhc2hMb25nIiwKICAgICAiW2hyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLV0iKTsKCiAgLy9JbWFnZXMKICBNVCgiSW1hZ2VzIiwKICAgICAiW2ltYWdlJmltYWdlLW1hcmtlciAhXVtpbWFnZSZpbWFnZS1hbHQtdGV4dCZsaW5rIFtbYWx0IHRleHRdXV1bc3RyaW5nJnVybCAoaHR0cDovL2xpbmsudG8vaW1hZ2UuanBnKV0iKQoKICAvL0ltYWdlcyB3aXRoIGhpZ2hsaWdodCBhbHQgdGV4dAogIE1UKCJpbWFnZUVtIiwKICAgICAiW2ltYWdlJmltYWdlLW1hcmtlciAhXVtpbWFnZSZpbWFnZS1hbHQtdGV4dCZsaW5rIFtbXVtpbWFnZS1hbHQtdGV4dCZlbSZpbWFnZSZsaW5rICphbHQgdGV4dCpdW2ltYWdlJmltYWdlLWFsdC10ZXh0JmxpbmsgXV1dW3N0cmluZyZ1cmwgKGh0dHA6Ly9saW5rLnRvL2ltYWdlLmpwZyldIik7CgogIE1UKCJpbWFnZVN0cm9uZyIsCiAgICAgIltpbWFnZSZpbWFnZS1tYXJrZXIgIV1baW1hZ2UmaW1hZ2UtYWx0LXRleHQmbGluayBbW11baW1hZ2UtYWx0LXRleHQmc3Ryb25nJmltYWdlJmxpbmsgKiphbHQgdGV4dCoqXVtpbWFnZSZpbWFnZS1hbHQtdGV4dCZsaW5rIF1dXVtzdHJpbmcmdXJsIChodHRwOi8vbGluay50by9pbWFnZS5qcGcpXSIpOwoKICBNVCgiaW1hZ2VFbVN0cm9uZyIsCiAgICAgIltpbWFnZSZpbWFnZS1tYXJrZXIgIV1baW1hZ2UmaW1hZ2UtYWx0LXRleHQmbGluayBbW11baW1hZ2UtYWx0LXRleHQmaW1hZ2Umc3Ryb25nJmxpbmsgKipdW2ltYWdlJmltYWdlLWFsdC10ZXh0JmVtJnN0cm9uZyZsaW5rICphbHQgdGV4dCoqXVtpbWFnZSZpbWFnZS1hbHQtdGV4dCZlbSZsaW5rICpdW2ltYWdlJmltYWdlLWFsdC10ZXh0JmxpbmsgXV1dW3N0cmluZyZ1cmwgKGh0dHA6Ly9saW5rLnRvL2ltYWdlLmpwZyldIik7CgogIC8vIElubGluZSBsaW5rIHdpdGggdGl0bGUKICBNVCgibGlua1RpdGxlIiwKICAgICAiW2xpbmsgW1tmb29dXV1bc3RyaW5nJnVybCAoaHR0cDovL2V4YW1wbGUuY29tLyBcImJhclwiKV0gaGVsbG8iKTsKCiAgLy8gSW5saW5lIGxpbmsgd2l0aG91dCB0aXRsZQogIE1UKCJsaW5rTm9UaXRsZSIsCiAgICAgIltsaW5rIFtbZm9vXV1dW3N0cmluZyZ1cmwgKGh0dHA6Ly9leGFtcGxlLmNvbS8pXSBiYXIiKTsKCiAgLy8gSW5saW5lIGxpbmsgd2l0aCBpbWFnZQogIE1UKCJsaW5rSW1hZ2UiLAogICAgICJbbGluayBbW11bbGluayZpbWFnZSZpbWFnZS1tYXJrZXIgIV1bbGluayZpbWFnZSZpbWFnZS1hbHQtdGV4dCZsaW5rIFtbYWx0IHRleHRdXV1bc3RyaW5nJnVybCAoaHR0cDovL2xpbmsudG8vaW1hZ2UuanBnKV1bbGluayBdXV1bc3RyaW5nJnVybCAoaHR0cDovL2V4YW1wbGUuY29tLyldIGJhciIpOwoKICAvLyBJbmxpbmUgbGluayB3aXRoIEVtCiAgTVQoImxpbmtFbSIsCiAgICAgIltsaW5rIFtbXVtsaW5rJmVtICpmb28qXVtsaW5rIF1dXVtzdHJpbmcmdXJsIChodHRwOi8vZXhhbXBsZS5jb20vKV0gYmFyIik7CgogIC8vIElubGluZSBsaW5rIHdpdGggU3Ryb25nCiAgTVQoImxpbmtTdHJvbmciLAogICAgICJbbGluayBbW11bbGluayZzdHJvbmcgKipmb28qKl1bbGluayBdXV1bc3RyaW5nJnVybCAoaHR0cDovL2V4YW1wbGUuY29tLyldIGJhciIpOwoKICAvLyBJbmxpbmUgbGluayB3aXRoIEVtU3Ryb25nCiAgTVQoImxpbmtFbVN0cm9uZyIsCiAgICAgIltsaW5rIFtbXVtsaW5rJnN0cm9uZyAqKl1bbGluayZlbSZzdHJvbmcgKmZvbyoqXVtsaW5rJmVtICpdW2xpbmsgXV1dW3N0cmluZyZ1cmwgKGh0dHA6Ly9leGFtcGxlLmNvbS8pXSBiYXIiKTsKCiAgLy8gSW1hZ2Ugd2l0aCB0aXRsZQogIE1UKCJpbWFnZVRpdGxlIiwKICAgICAiW2ltYWdlJmltYWdlLW1hcmtlciAhXVtpbWFnZSZpbWFnZS1hbHQtdGV4dCZsaW5rIFtbYWx0IHRleHRdXV1bc3RyaW5nJnVybCAoaHR0cDovL2V4YW1wbGUuY29tLyBcImJhclwiKV0gaGVsbG8iKTsKCiAgLy8gSW1hZ2Ugd2l0aG91dCB0aXRsZQogIE1UKCJpbWFnZU5vVGl0bGUiLAogICAgICJbaW1hZ2UmaW1hZ2UtbWFya2VyICFdW2ltYWdlJmltYWdlLWFsdC10ZXh0JmxpbmsgW1thbHQgdGV4dF1dXVtzdHJpbmcmdXJsIChodHRwOi8vZXhhbXBsZS5jb20vKV0gYmFyIik7CgogIC8vIEltYWdlIHdpdGggYXN0ZXJpc2tzCiAgTVQoImltYWdlQXN0ZXJpc2tzIiwKICAgICAiW2ltYWdlJmltYWdlLW1hcmtlciAhXVtpbWFnZSZpbWFnZS1hbHQtdGV4dCZsaW5rIFtbIF1baW1hZ2UmaW1hZ2UtYWx0LXRleHQmZW0mbGluayAqYWx0IHRleHQqXVtpbWFnZSZpbWFnZS1hbHQtdGV4dCZsaW5rIF1dXVtzdHJpbmcmdXJsIChodHRwOi8vbGluay50by9pbWFnZS5qcGcpXSBiYXIiKTsKCiAgLy8gTm90IGEgbGluay4gU2hvdWxkIGJlIG5vcm1hbCB0ZXh0IGR1ZSB0byBzcXVhcmUgYnJhY2tldHMgYmVpbmcgdXNlZAogIC8vIHJlZ3VsYXJseSBpbiB0ZXh0LCBlc3BlY2lhbGx5IGluIHF1b3RlZCBtYXRlcmlhbCwgYW5kIG5vIHNwYWNlIGlzIGFsbG93ZWQKICAvLyBiZXR3ZWVuIHNxdWFyZSBicmFja2V0cyBhbmQgcGFyZW50aGVzZXMgKHBlciBEaW5ndXMpLgogIE1UKCJub3RBTGluayIsCiAgICAgIltbZm9vXV0gKGJhcikiKTsKCiAgLy8gUmVmZXJlbmNlLXN0eWxlIGxpbmtzCiAgTVQoImxpbmtSZWZlcmVuY2UiLAogICAgICJbbGluayBbW2Zvb11dXVtzdHJpbmcmdXJsIFtbYmFyXV1dIGhlbGxvIik7CgogIC8vIFJlZmVyZW5jZS1zdHlsZSBsaW5rcyB3aXRoIEVtCiAgTVQoImxpbmtSZWZlcmVuY2VFbSIsCiAgICAgIltsaW5rIFtbXVtsaW5rJmVtICpmb28qXVtsaW5rIF1dXVtzdHJpbmcmdXJsIFtbYmFyXV1dIGhlbGxvIik7CgogIC8vIFJlZmVyZW5jZS1zdHlsZSBsaW5rcyB3aXRoIFN0cm9uZwogIE1UKCJsaW5rUmVmZXJlbmNlU3Ryb25nIiwKICAgICAiW2xpbmsgW1tdW2xpbmsmc3Ryb25nICoqZm9vKipdW2xpbmsgXV1dW3N0cmluZyZ1cmwgW1tiYXJdXV0gaGVsbG8iKTsKCiAgLy8gUmVmZXJlbmNlLXN0eWxlIGxpbmtzIHdpdGggRW1TdHJvbmcKICBNVCgibGlua1JlZmVyZW5jZUVtU3Ryb25nIiwKICAgICAiW2xpbmsgW1tdW2xpbmsmc3Ryb25nICoqXVtsaW5rJmVtJnN0cm9uZyAqZm9vKipdW2xpbmsmZW0gKl1bbGluayBdXV1bc3RyaW5nJnVybCBbW2Jhcl1dXSBoZWxsbyIpOwoKICAvLyBSZWZlcmVuY2Utc3R5bGUgbGlua3Mgd2l0aCBvcHRpb25hbCBzcGFjZSBzZXBhcmF0b3IgKHBlciBkb2N1bWVudGF0aW9uKQogIC8vICJZb3UgY2FuIG9wdGlvbmFsbHkgdXNlIGEgc3BhY2UgdG8gc2VwYXJhdGUgdGhlIHNldHMgb2YgYnJhY2tldHMiCiAgTVQoImxpbmtSZWZlcmVuY2VTcGFjZSIsCiAgICAgIltsaW5rIFtbZm9vXV1dIFtzdHJpbmcmdXJsIFtbYmFyXV1dIGhlbGxvIik7CgogIC8vIFNob3VsZCBvbmx5IGFsbG93IGEgc2luZ2xlIHNwYWNlICgiLi4udXNlICphKiBzcGFjZS4uLiIpCiAgTVQoImxpbmtSZWZlcmVuY2VEb3VibGVTcGFjZSIsCiAgICAgIltbZm9vXV0gIFtbYmFyXV0gaGVsbG8iKTsKCiAgLy8gUmVmZXJlbmNlLXN0eWxlIGxpbmtzIHdpdGggaW1wbGljaXQgbGluayBuYW1lCiAgTVQoImxpbmtJbXBsaWNpdCIsCiAgICAgIltsaW5rIFtbZm9vXV1dW3N0cmluZyZ1cmwgW1tdXV0gaGVsbG8iKTsKCiAgLy8gQHRvZG8gSXQgd291bGQgYmUgbmljZSBpZiwgYXQgc29tZSBwb2ludCwgdGhlIGRvY3VtZW50IHdhcyBhY3R1YWxseQogIC8vIGNoZWNrZWQgdG8gc2VlIGlmIHRoZSByZWZlcmVuY2VkIGxpbmsgZXhpc3RzCgogIC8vIExpbmsgbGFiZWwsIGZvciByZWZlcmVuY2Utc3R5bGUgbGlua3MgKHRha2VuIGZyb20gZG9jdW1lbnRhdGlvbikKCiAgTVQoImxhYmVsTm9UaXRsZSIsCiAgICAgIltsaW5rIFtbZm9vXV06XSBbc3RyaW5nJnVybCBodHRwOi8vZXhhbXBsZS5jb20vXSIpOwoKICBNVCgibGFiZWxJbmRlbnRlZCIsCiAgICAgIiAgIFtsaW5rIFtbZm9vXV06XSBbc3RyaW5nJnVybCBodHRwOi8vZXhhbXBsZS5jb20vXSIpOwoKICBNVCgibGFiZWxTcGFjZVRpdGxlIiwKICAgICAiW2xpbmsgW1tmb28gYmFyXV06XSBbc3RyaW5nJnVybCBodHRwOi8vZXhhbXBsZS5jb20vIFwiaGVsbG9cIl0iKTsKCiAgTVQoImxhYmVsRG91YmxlVGl0bGUiLAogICAgICJbbGluayBbW2ZvbyBiYXJdXTpdIFtzdHJpbmcmdXJsIGh0dHA6Ly9leGFtcGxlLmNvbS8gXCJoZWxsb1wiXSBcIndvcmxkXCIiKTsKCiAgTVQoImxhYmVsVGl0bGVEb3VibGVRdW90ZXMiLAogICAgICJbbGluayBbW2Zvb11dOl0gW3N0cmluZyZ1cmwgaHR0cDovL2V4YW1wbGUuY29tLyAgXCJiYXJcIl0iKTsKCiAgTVQoImxhYmVsVGl0bGVTaW5nbGVRdW90ZXMiLAogICAgICJbbGluayBbW2Zvb11dOl0gW3N0cmluZyZ1cmwgaHR0cDovL2V4YW1wbGUuY29tLyAgJ2JhciddIik7CgogIE1UKCJsYWJlbFRpdGxlUGFyZW50aGVzZXMiLAogICAgICJbbGluayBbW2Zvb11dOl0gW3N0cmluZyZ1cmwgaHR0cDovL2V4YW1wbGUuY29tLyAgKGJhcildIik7CgogIE1UKCJsYWJlbFRpdGxlSW52YWxpZCIsCiAgICAgIltsaW5rIFtbZm9vXV06XSBbc3RyaW5nJnVybCBodHRwOi8vZXhhbXBsZS5jb20vXSBiYXIiKTsKCiAgTVQoImxhYmVsTGlua0FuZ2xlQnJhY2tldHMiLAogICAgICJbbGluayBbW2Zvb11dOl0gW3N0cmluZyZ1cmwgPGh0dHA6Ly9leGFtcGxlLmNvbS8+ICBcImJhclwiXSIpOwoKICBNVCgibGFiZWxUaXRsZU5leHREb3VibGVRdW90ZXMiLAogICAgICJbbGluayBbW2Zvb11dOl0gW3N0cmluZyZ1cmwgaHR0cDovL2V4YW1wbGUuY29tL10iLAogICAgICJbc3RyaW5nIFwiYmFyXCJdIGhlbGxvIik7CgogIE1UKCJsYWJlbFRpdGxlTmV4dFNpbmdsZVF1b3RlcyIsCiAgICAgIltsaW5rIFtbZm9vXV06XSBbc3RyaW5nJnVybCBodHRwOi8vZXhhbXBsZS5jb20vXSIsCiAgICAgIltzdHJpbmcgJ2JhciddIGhlbGxvIik7CgogIE1UKCJsYWJlbFRpdGxlTmV4dFBhcmVudGhlc2VzIiwKICAgICAiW2xpbmsgW1tmb29dXTpdIFtzdHJpbmcmdXJsIGh0dHA6Ly9leGFtcGxlLmNvbS9dIiwKICAgICAiW3N0cmluZyAoYmFyKV0gaGVsbG8iKTsKCiAgTVQoImxhYmVsVGl0bGVOZXh0TWl4ZWQiLAogICAgICJbbGluayBbW2Zvb11dOl0gW3N0cmluZyZ1cmwgaHR0cDovL2V4YW1wbGUuY29tL10iLAogICAgICIoYmFyXCIgaGVsbG8iKTsKCiAgTVQoImxhYmVsRXNjYXBlIiwKICAgICAiW2xpbmsgW1tmb28gXFxdXSBdXTpdIFtzdHJpbmcmdXJsIGh0dHA6Ly9leGFtcGxlLmNvbS9dIik7CgogIE1UKCJsYWJlbEVzY2FwZUNvbG9uIiwKICAgICAiW2xpbmsgW1tmb28gXFxdXTogYmFyXV06XSBbc3RyaW5nJnVybCBodHRwOi8vZXhhbXBsZS5jb20vXSIpOwoKICBNVCgibGFiZWxFc2NhcGVFbmQiLAogICAgICJbW2Zvb1xcXV06IGh0dHA6Ly9leGFtcGxlLmNvbS8iKTsKCiAgTVQoImxpbmtXZWIiLAogICAgICJbbGluayA8aHR0cDovL2V4YW1wbGUuY29tLz5dIGZvbyIpOwoKICBNVCgibGlua1dlYkRvdWJsZSIsCiAgICAgIltsaW5rIDxodHRwOi8vZXhhbXBsZS5jb20vPl0gZm9vIFtsaW5rIDxodHRwOi8vZXhhbXBsZS5jb20vPl0iKTsKCiAgTVQoImxpbmtFbWFpbCIsCiAgICAgIltsaW5rIDx1c2VyQGV4YW1wbGUuY29tPl0gZm9vIik7CgogIE1UKCJsaW5rRW1haWxEb3VibGUiLAogICAgICJbbGluayA8dXNlckBleGFtcGxlLmNvbT5dIGZvbyBbbGluayA8dXNlckBleGFtcGxlLmNvbT5dIik7CgogIE1UKCJlbUFzdGVyaXNrIiwKICAgICAiW2VtICpmb28qXSBiYXIiKTsKCiAgTVQoImVtVW5kZXJzY29yZSIsCiAgICAgIltlbSBfZm9vX10gYmFyIik7CgogIE1UKCJlbUluV29yZEFzdGVyaXNrIiwKICAgICAiZm9vW2VtICpiYXIqXWhlbGxvIik7CgogIE1UKCJlbUluV29yZFVuZGVyc2NvcmUiLAogICAgICJmb29bZW0gX2Jhcl9daGVsbG8iKTsKCiAgLy8gUGVyIGRvY3VtZW50YXRpb246ICIuLi5zdXJyb3VuZCBhbiAqIG9yIF8gd2l0aCBzcGFjZXMsIGl04oCZbGwgYmUKICAvLyB0cmVhdGVkIGFzIGEgbGl0ZXJhbCBhc3RlcmlzayBvciB1bmRlcnNjb3JlLiIKCiAgTVQoImVtRXNjYXBlZEJ5U3BhY2VJbiIsCiAgICAgImZvbyBbZW0gX2JhciBfIGhlbGxvX10gd29ybGQiKTsKCiAgTVQoImVtRXNjYXBlZEJ5U3BhY2VPdXQiLAogICAgICJmb28gXyBiYXJbZW0gX2hlbGxvX113b3JsZCIpOwoKICBNVCgiZW1Fc2NhcGVkQnlOZXdsaW5lIiwKICAgICAiZm9vIiwKICAgICAiXyBiYXJbZW0gX2hlbGxvX113b3JsZCIpOwoKICAvLyBVbmNsb3NlZCBlbXBoYXNpcyBjaGFyYWN0ZXJzCiAgLy8gSW5zdGVhZCBvZiBzaW1wbHkgbWFya2luZyBhcyBFTSAvIFNUUk9ORywgaXQgd291bGQgYmUgbmljZSB0byBoYXZlIGFuCiAgLy8gaW5jb21wbGV0ZSBmbGFnIGZvciBFTSBhbmQgU1RST05HLCB0aGF0IGlzIHN0eWxlZCBzbGlnaHRseSBkaWZmZXJlbnQuCiAgTVQoImVtSW5jb21wbGV0ZUFzdGVyaXNrIiwKICAgICAiZm9vIFtlbSAqYmFyXSIpOwoKICBNVCgiZW1JbmNvbXBsZXRlVW5kZXJzY29yZSIsCiAgICAgImZvbyBbZW0gX2Jhcl0iKTsKCiAgTVQoInN0cm9uZ0FzdGVyaXNrIiwKICAgICAiW3N0cm9uZyAqKmZvbyoqXSBiYXIiKTsKCiAgTVQoInN0cm9uZ1VuZGVyc2NvcmUiLAogICAgICJbc3Ryb25nIF9fZm9vX19dIGJhciIpOwoKICBNVCgiZW1TdHJvbmdBc3RlcmlzayIsCiAgICAgIltlbSAqZm9vXVtlbSZzdHJvbmcgKipiYXIqXVtzdHJvbmcgaGVsbG8qKl0gd29ybGQiKTsKCiAgTVQoImVtU3Ryb25nVW5kZXJzY29yZSIsCiAgICAgIltlbSBfZm9vXVtlbSZzdHJvbmcgX19iYXJfXVtzdHJvbmcgaGVsbG9fX10gd29ybGQiKTsKCiAgLy8gIi4uLnNhbWUgY2hhcmFjdGVyIG11c3QgYmUgdXNlZCB0byBvcGVuIGFuZCBjbG9zZSBhbiBlbXBoYXNpcyBzcGFuLiIiCiAgTVQoImVtU3Ryb25nTWl4ZWQiLAogICAgICJbZW0gX2Zvb11bZW0mc3Ryb25nICoqYmFyKmhlbGxvX18gd29ybGRdIik7CgogIE1UKCJlbVN0cm9uZ01peGVkIiwKICAgICAiW2VtICpmb29dW2VtJnN0cm9uZyBfX2Jhcl9oZWxsbyoqIHdvcmxkXSIpOwoKICBNVCgibGlua1dpdGhOZXN0ZWRQYXJlbnMiLAogICAgICJbbGluayBbW2Zvb11dXVtzdHJpbmcmdXJsIChiYXIoYmF6KSldIikKCiAgLy8gVGhlc2UgY2hhcmFjdGVycyBzaG91bGQgYmUgZXNjYXBlZDoKICAvLyBcICAgYmFja3NsYXNoCiAgLy8gYCAgIGJhY2t0aWNrCiAgLy8gKiAgIGFzdGVyaXNrCiAgLy8gXyAgIHVuZGVyc2NvcmUKICAvLyB7fSAgY3VybHkgYnJhY2VzCiAgLy8gW10gIHNxdWFyZSBicmFja2V0cwogIC8vICgpICBwYXJlbnRoZXNlcwogIC8vICMgICBoYXNoIG1hcmsKICAvLyArICAgcGx1cyBzaWduCiAgLy8gLSAgIG1pbnVzIHNpZ24gKGh5cGhlbikKICAvLyAuICAgZG90CiAgLy8gISAgIGV4Y2xhbWF0aW9uIG1hcmsKCiAgTVQoImVzY2FwZUJhY2t0aWNrIiwKICAgICAiZm9vIFxcYGJhclxcYCIpOwoKICBNVCgiZG91YmxlRXNjYXBlQmFja3RpY2siLAogICAgICJmb28gXFxcXFtjb21tZW50IGBiYXJcXFxcYF0iKTsKCiAgTVQoImVzY2FwZUFzdGVyaXNrIiwKICAgICAiZm9vIFxcKmJhclxcKiIpOwoKICBNVCgiZG91YmxlRXNjYXBlQXN0ZXJpc2siLAogICAgICJmb28gXFxcXFtlbSAqYmFyXFxcXCpdIik7CgogIE1UKCJlc2NhcGVVbmRlcnNjb3JlIiwKICAgICAiZm9vIFxcX2JhclxcXyIpOwoKICBNVCgiZG91YmxlRXNjYXBlVW5kZXJzY29yZSIsCiAgICAgImZvbyBcXFxcW2VtIF9iYXJcXFxcX10iKTsKCiAgTVQoImVzY2FwZUhhc2giLAogICAgICJcXCMgZm9vIik7CgogIE1UKCJkb3VibGVFc2NhcGVIYXNoIiwKICAgICAiXFxcXCMgZm9vIik7CgogIE1UKCJlc2NhcGVOZXdsaW5lIiwKICAgICAiXFwiLAogICAgICJbZW0gKmZvbypdIik7CgogIC8vIENsYXNzIG92ZXJyaWRlIHRlc3RzCiAgVG9rZW5UeXBlT3ZlcnJpZGVUZXN0KCJvdmVycmlkZUhlYWRlcjEiLAogICAgIltvdmVycmlkZS1oZWFkZXImb3ZlcnJpZGUtaGVhZGVyLTEgIyBGb29dIik7CgogIFRva2VuVHlwZU92ZXJyaWRlVGVzdCgib3ZlcnJpZGVIZWFkZXIyIiwKICAgICJbb3ZlcnJpZGUtaGVhZGVyJm92ZXJyaWRlLWhlYWRlci0yICMjIEZvb10iKTsKCiAgVG9rZW5UeXBlT3ZlcnJpZGVUZXN0KCJvdmVycmlkZUhlYWRlcjMiLAogICAgIltvdmVycmlkZS1oZWFkZXImb3ZlcnJpZGUtaGVhZGVyLTMgIyMjIEZvb10iKTsKCiAgVG9rZW5UeXBlT3ZlcnJpZGVUZXN0KCJvdmVycmlkZUhlYWRlcjQiLAogICAgIltvdmVycmlkZS1oZWFkZXImb3ZlcnJpZGUtaGVhZGVyLTQgIyMjIyBGb29dIik7CgogIFRva2VuVHlwZU92ZXJyaWRlVGVzdCgib3ZlcnJpZGVIZWFkZXI1IiwKICAgICJbb3ZlcnJpZGUtaGVhZGVyJm92ZXJyaWRlLWhlYWRlci01ICMjIyMjIEZvb10iKTsKCiAgVG9rZW5UeXBlT3ZlcnJpZGVUZXN0KCJvdmVycmlkZUhlYWRlcjYiLAogICAgIltvdmVycmlkZS1oZWFkZXImb3ZlcnJpZGUtaGVhZGVyLTYgIyMjIyMjIEZvb10iKTsKCiAgVG9rZW5UeXBlT3ZlcnJpZGVUZXN0KCJvdmVycmlkZUNvZGUiLAogICAgIltvdmVycmlkZS1jb2RlIGBmb29gXSIpOwoKICBUb2tlblR5cGVPdmVycmlkZVRlc3QoIm92ZXJyaWRlQ29kZUJsb2NrIiwKICAgICJbb3ZlcnJpZGUtY29kZSBgYGBdIiwKICAgICJbb3ZlcnJpZGUtY29kZSBmb29dIiwKICAgICJbb3ZlcnJpZGUtY29kZSBgYGBdIik7CgogIFRva2VuVHlwZU92ZXJyaWRlVGVzdCgib3ZlcnJpZGVRdW90ZSIsCiAgICAiW292ZXJyaWRlLXF1b3RlJm92ZXJyaWRlLXF1b3RlLTEgPiBmb29dIiwKICAgICJbb3ZlcnJpZGUtcXVvdGUmb3ZlcnJpZGUtcXVvdGUtMSA+IGJhcl0iKTsKCiAgVG9rZW5UeXBlT3ZlcnJpZGVUZXN0KCJvdmVycmlkZVF1b3RlTmVzdGVkIiwKICAgICJbb3ZlcnJpZGUtcXVvdGUmb3ZlcnJpZGUtcXVvdGUtMSA+IGZvb10iLAogICAgIltvdmVycmlkZS1xdW90ZSZvdmVycmlkZS1xdW90ZS0xID5dW292ZXJyaWRlLXF1b3RlJm92ZXJyaWRlLXF1b3RlLTIgPiBiYXJdIiwKICAgICJbb3ZlcnJpZGUtcXVvdGUmb3ZlcnJpZGUtcXVvdGUtMSA+XVtvdmVycmlkZS1xdW90ZSZvdmVycmlkZS1xdW90ZS0yID5dW292ZXJyaWRlLXF1b3RlJm92ZXJyaWRlLXF1b3RlLTMgPiBiYXpdIik7CgogIFRva2VuVHlwZU92ZXJyaWRlVGVzdCgib3ZlcnJpZGVMaXN0cyIsCiAgICAiW292ZXJyaWRlLWxpc3QxIC0gZm9vXSIsCiAgICAiIiwKICAgICIgICAgW292ZXJyaWRlLWxpc3QyICsgYmFyXSIsCiAgICAiIiwKICAgICIgICAgICAgIFtvdmVycmlkZS1saXN0MyAqIGJhel0iLAogICAgIiIsCiAgICAiICAgICAgICAgICAgW292ZXJyaWRlLWxpc3QxIDEuIHF1eF0iLAogICAgIiIsCiAgICAiICAgICAgICAgICAgICAgIFtvdmVycmlkZS1saXN0MiAtIHF1dXhdIik7CgogIFRva2VuVHlwZU92ZXJyaWRlVGVzdCgib3ZlcnJpZGVIciIsCiAgICAiW292ZXJyaWRlLWhyICogKiAqXSIpOwoKICBUb2tlblR5cGVPdmVycmlkZVRlc3QoIm92ZXJyaWRlSW1hZ2UiLAogICAgIltvdmVycmlkZS1pbWFnZSZvdmVycmlkZS1pbWFnZS1tYXJrZXIgIV1bb3ZlcnJpZGUtaW1hZ2Umb3ZlcnJpZGUtaW1hZ2UtYWx0LXRleHQmbGluayBbW2FsdCB0ZXh0XV1dW292ZXJyaWRlLWxpbmstaHJlZiZ1cmwgKGh0dHA6Ly9saW5rLnRvL2ltYWdlLmpwZyldIik7CgogIFRva2VuVHlwZU92ZXJyaWRlVGVzdCgib3ZlcnJpZGVMaW5rVGV4dCIsCiAgICAiW292ZXJyaWRlLWxpbmstdGV4dCBbW2Zvb11dXVtvdmVycmlkZS1saW5rLWhyZWYmdXJsIChodHRwOi8vZXhhbXBsZS5jb20pXSIpOwoKICBUb2tlblR5cGVPdmVycmlkZVRlc3QoIm92ZXJyaWRlTGlua0VtYWlsQW5kSW5saW5lIiwKICAgICJbb3ZlcnJpZGUtbGluay1lbWFpbCA8XVtvdmVycmlkZS1saW5rLWlubGluZSBmb29AZXhhbXBsZS5jb20+XSIpOwoKICBUb2tlblR5cGVPdmVycmlkZVRlc3QoIm92ZXJyaWRlRW0iLAogICAgIltvdmVycmlkZS1lbSAqZm9vKl0iKTsKCiAgVG9rZW5UeXBlT3ZlcnJpZGVUZXN0KCJvdmVycmlkZVN0cm9uZyIsCiAgICAiW292ZXJyaWRlLXN0cm9uZyAqKmZvbyoqXSIpOwoKICBUb2tlblR5cGVPdmVycmlkZVRlc3QoIm92ZXJyaWRlU3RyaWtldGhyb3VnaCIsCiAgICAiW292ZXJyaWRlLXN0cmlrZXRocm91Z2ggfn5mb29+fl0iKTsKCiAgRm9ybWF0VG9rZW5UeXBlT3ZlcnJpZGVUZXN0KCJvdmVycmlkZUZvcm1hdHRpbmciLAogICAgIltvdmVycmlkZS1mb3JtYXR0aW5nLWVzY2FwZSBcXCpdIik7CgogIC8vIFRlc3RzIHRvIG1ha2Ugc3VyZSBHRk0tc3BlY2lmaWMgdGhpbmdzIGFyZW4ndCBnZXR0aW5nIHRocm91Z2gKCiAgTVQoInRhc2tMaXN0IiwKICAgICAiW3ZhcmlhYmxlLTIgKiBbIF1dIGJhcl0iKTsKCiAgTVQoIm5vRmVuY2VkQ29kZUJsb2NrcyIsCiAgICAgIn5+fiIsCiAgICAgImZvbyIsCiAgICAgIn5+fiIpOwoKICBGZW5jZWRUZXN0KCJmZW5jZWRDb2RlQmxvY2tzIiwKICAgICAiW2NvbW1lbnQgYGBgXSIsCiAgICAgIltjb21tZW50IGZvb10iLAogICAgICJbY29tbWVudCBgYGBdIiwKICAgICAiYmFyIik7CgogIEZlbmNlZFRlc3QoImZlbmNlZENvZGVCbG9ja3NNdWx0aXBsZUNoYXJzIiwKICAgICAiW2NvbW1lbnQgYGBgYGBdIiwKICAgICAiW2NvbW1lbnQgZm9vXSIsCiAgICAgIltjb21tZW50IGBgYF0iLAogICAgICJbY29tbWVudCBmb29dIiwKICAgICAiW2NvbW1lbnQgYGBgYGBdIiwKICAgICAiYmFyIik7CgogIEZlbmNlZFRlc3QoImZlbmNlZENvZGVCbG9ja3NUaWxkZXMiLAogICAgICJbY29tbWVudCB+fn5dIiwKICAgICAiW2NvbW1lbnQgZm9vXSIsCiAgICAgIltjb21tZW50IH5+fl0iLAogICAgICJiYXIiKTsKCiAgRmVuY2VkVGVzdCgiZmVuY2VkQ29kZUJsb2Nrc1RpbGRlc011bHRpcGxlQ2hhcnMiLAogICAgICJbY29tbWVudCB+fn5+fl0iLAogICAgICJbY29tbWVudCB+fn5dIiwKICAgICAiW2NvbW1lbnQgZm9vXSIsCiAgICAgIltjb21tZW50IH5+fn5+XSIsCiAgICAgImJhciIpOwoKICBGZW5jZWRUZXN0KCJmZW5jZWRDb2RlQmxvY2tzTXVsdGlwbGVDaGFycyIsCiAgICAgIltjb21tZW50IGBgYGBgXSIsCiAgICAgIltjb21tZW50IGZvb10iLAogICAgICJbY29tbWVudCBgYGBdIiwKICAgICAiW2NvbW1lbnQgZm9vXSIsCiAgICAgIltjb21tZW50IGBgYGBgXSIsCiAgICAgImJhciIpOwoKICBGZW5jZWRUZXN0KCJmZW5jZWRDb2RlQmxvY2tzTWl4ZWQiLAogICAgICJbY29tbWVudCB+fn5dIiwKICAgICAiW2NvbW1lbnQgYGBgXSIsCiAgICAgIltjb21tZW50IGZvb10iLAogICAgICJbY29tbWVudCB+fn5dIiwKICAgICAiYmFyIik7CgogIC8vIFRlc3RzIHRoYXQgcmVxdWlyZSBYTUwgbW9kZQoKICBNVCgieG1sTW9kZSIsCiAgICAgIlt0YWcmYnJhY2tldCA8XVt0YWcgZGl2XVt0YWcmYnJhY2tldCA+XSIsCiAgICAgIipmb28qIiwKICAgICAiW3RhZyZicmFja2V0IDxdW3RhZyBodHRwOi8vZ2l0aHViLmNvbV1bdGFnJmJyYWNrZXQgLz5dIiwKICAgICAiW3RhZyZicmFja2V0IDwvXVt0YWcgZGl2XVt0YWcmYnJhY2tldCA+XSIsCiAgICAgIltsaW5rIDxodHRwOi8vZ2l0aHViLmNvbS8+XSIpOwoKICBNVCgieG1sTW9kZVdpdGhNYXJrZG93bkluc2lkZSIsCiAgICAgIlt0YWcmYnJhY2tldCA8XVt0YWcgZGl2XSBbYXR0cmlidXRlIG1hcmtkb3duXT1bc3RyaW5nIDFdW3RhZyZicmFja2V0ID5dIiwKICAgICAiW2VtICpmb28qXSIsCiAgICAgIltsaW5rIDxodHRwOi8vZ2l0aHViLmNvbS8+XSIsCiAgICAgIlt0YWcgPC9kaXY+XSIsCiAgICAgIltsaW5rIDxodHRwOi8vZ2l0aHViLmNvbS8+XSIsCiAgICAgIlt0YWcmYnJhY2tldCA8XVt0YWcgZGl2XVt0YWcmYnJhY2tldCA+XSIsCiAgICAgIlt0YWcmYnJhY2tldCA8L11bdGFnIGRpdl1bdGFnJmJyYWNrZXQgPl0iKTsKCn0pKCk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/mathematica/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/mathematica/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogTWF0aGVtYXRpY2EgbW9kZTwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uLy4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPS4uLy4uL2xpYi9jb2RlbWlycm9yLmNzcz4KPHNjcmlwdCBzcmM9Li4vLi4vbGliL2NvZGVtaXJyb3IuanM+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPS4uLy4uL2FkZG9uL2VkaXQvbWF0Y2hicmFja2V0cy5qcz48L3NjcmlwdD4KPHNjcmlwdCBzcmM9bWF0aGVtYXRpY2EuanM+PC9zY3JpcHQ+CjxzdHlsZSB0eXBlPXRleHQvY3NzPgogIC5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazt9Cjwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGgxPkNvZGVNaXJyb3I8L2gxPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5NYXRoZW1hdGljYTwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+TWF0aGVtYXRpY2EgbW9kZTwvaDI+CgoKPHRleHRhcmVhIGlkPSJtYXRoZW1hdGljYUNvZGUiPgooKiBleGFtcGxlIE1hdGhlbWF0aWNhIGNvZGUgKikKKCogRHVhbGlzaWVydCB3aXJkIGFuaGFuZCBlaW5lciBQb2xhcml0w6R0IGFuIGVpbmVyCiAgIFF1YWRyaWsgJHhedCBRIHggPSAwJCBtaXQgcmVndWzDpHJlciBNYXRyaXggJFEkIChhbHNvCiAgIG1pdCAkZGV0KFEpIFxuZXEgMCQpLCB6LkIuIGRpZSBJZGVudGl0w6R0c21hdHJpeC4KICAgJHAkIGlzdCBlaW5lIExpc3RlIHZvbiBQb2x5bm9tZW4gLSBlaW4gSWRlYWwuICopCmR1YWxpemU6OiJzaW5ndWxhciIgPSAiUSBtdXN0IGJlIHJlZ3VsYXI6IGZvdW5kIERldFtRXT09MC4iOwpkdWFsaXplWyBRXywgcF8gXSA6PSBCbG9ja1sKICAgIHsgbSwgbiwgeHYsIGx2LCB1diwgdmFycywgcG9seXMsIGR1YWwgfSwKICAgIElmW0RldFtRXSA9PSAwLAogICAgICBNZXNzYWdlW2R1YWxpemU6OiJzaW5ndWxhciJdLAogICAgICBtID0gTGVuZ3RoW3BdOwogICAgICBuID0gTGVuZ3RoW1FdIC0gMTsKICAgICAgeHYgPSBUYWJsZVtTdWJzY3JpcHRbeCwgaV0sIHtpLCAwLCBufV07CiAgICAgIGx2ID0gVGFibGVbU3Vic2NyaXB0W2wsIGldLCB7aSwgMSwgbX1dOwogICAgICB1diA9IFRhYmxlW1N1YnNjcmlwdFt1LCBpXSwge2ksIDAsIG59XTsKICAgICAgKCogS29uc3RydWllcmUgSWRlYWwgcG9seXMuICopCiAgICAgIElmW20gPT0gMCwKICAgICAgICBwb2x5cyA9IFEudXYsCiAgICAgICAgcG9seXMgPSBKb2luW3AsIFEudXYgLSBUcmFuc3Bvc2VbT3V0ZXJbRCwgcCwgeHZdXS5sdl0KICAgICAgICBdOwogICAgICAoKiBFbGltaW5pZXJlIGRpZSBlcnN0ZW4gbiArIDEgKyBtIFZhcmlhYmxlbiB4diB1bmQgbHYKICAgICAgICAgYXVzIGRlbSBJZGVhbCBwb2x5cy4gKikKICAgICAgdmFycyA9IEpvaW5beHYsIGx2XTsKICAgICAgZHVhbCA9IEdyb2VibmVyQmFzaXNbcG9seXMsIHV2LCB2YXJzXTsKICAgICAgKCogRXJzZXR6ZSB1IG1pdCB4IGltIEVyZ2VibmlzLiAqKQogICAgICBSZXBsYWNlQWxsW2R1YWwsIFJ1bGVbdSwgeF1dCiAgICAgIF0KICAgIF0KPC90ZXh0YXJlYT4KCjxzY3JpcHQ+CiAgdmFyIG1hdGhlbWF0aWNhRWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ21hdGhlbWF0aWNhQ29kZScpLCB7CiAgICBtb2RlOiAndGV4dC94LW1hdGhlbWF0aWNhJywKICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgbWF0Y2hCcmFja2V0czogdHJ1ZQogIH0pOwo8L3NjcmlwdD4KCjxwPjxzdHJvbmc+TUlNRSB0eXBlcyBkZWZpbmVkOjwvc3Ryb25nPiA8Y29kZT50ZXh0L3gtbWF0aGVtYXRpY2E8L2NvZGU+IChNYXRoZW1hdGljYSkuPC9wPgo8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/mathematica/mathematica.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovLyBNYXRoZW1hdGljYSBtb2RlIGNvcHlyaWdodCAoYykgMjAxNSBieSBDYWxpbiBCYXJiYXQKLy8gQmFzZWQgb24gY29kZSBieSBQYXRyaWNrIFNjaGVpYmUgKGhhbGlydXRhbikKLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vaGFsaXJ1dGFuL01hdGhlbWF0aWNhLVNvdXJjZS1IaWdobGlnaHRpbmcvdHJlZS9tYXN0ZXIvc3JjL2xhbmctbW1hLmpzCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCdtYXRoZW1hdGljYScsIGZ1bmN0aW9uKF9jb25maWcsIF9wYXJzZXJDb25maWcpIHsKCiAgLy8gdXNlZCBwYXR0ZXJuIGJ1aWxkaW5nIGJsb2NrcwogIHZhciBJZGVudGlmaWVyID0gJ1thLXpBLVpcXCRdW2EtekEtWjAtOVxcJF0qJzsKICB2YXIgcEJhc2UgICAgICA9ICIoPzpcXGQrKSI7CiAgdmFyIHBGbG9hdCAgICAgPSAiKD86XFwuXFxkK3xcXGQrXFwuXFxkKnxcXGQrKSI7CiAgdmFyIHBGbG9hdEJhc2UgPSAiKD86XFwuXFx3K3xcXHcrXFwuXFx3KnxcXHcrKSI7CiAgdmFyIHBQcmVjaXNpb24gPSAiKD86YCg/OmA/IitwRmxvYXQrIik/KSI7CgogIC8vIHJlZ3VsYXIgZXhwcmVzc2lvbnMKICB2YXIgcmVCYXNlRm9ybSAgICAgICAgPSBuZXcgUmVnRXhwKCcoPzonK3BCYXNlKycoPzpcXF5cXF4nK3BGbG9hdEJhc2UrcFByZWNpc2lvbisnPyg/OlxcKlxcXlsrLV0/XFxkKyk/KSknKTsKICB2YXIgcmVGbG9hdEZvcm0gICAgICAgPSBuZXcgUmVnRXhwKCcoPzonICsgcEZsb2F0ICsgcFByZWNpc2lvbiArICc/KD86XFwqXFxeWystXT9cXGQrKT8pJyk7CiAgdmFyIHJlSWRJbkNvbnRleHQgICAgID0gbmV3IFJlZ0V4cCgnKD86YD8pKD86JyArIElkZW50aWZpZXIgKyAnKSg/OmAoPzonICsgSWRlbnRpZmllciArICcpKSooPzpgPyknKTsKCiAgZnVuY3Rpb24gdG9rZW5CYXNlKHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBjaDsKCiAgICAvLyBnZXQgbmV4dCBjaGFyYWN0ZXIKICAgIGNoID0gc3RyZWFtLm5leHQoKTsKCiAgICAvLyBzdHJpbmcKICAgIGlmIChjaCA9PT0gJyInKSB7CiAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5TdHJpbmc7CiAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgIH0KCiAgICAvLyBjb21tZW50CiAgICBpZiAoY2ggPT09ICcoJykgewogICAgICBpZiAoc3RyZWFtLmVhdCgnKicpKSB7CiAgICAgICAgc3RhdGUuY29tbWVudExldmVsKys7CiAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkNvbW1lbnQ7CiAgICAgICAgcmV0dXJuIHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgICB9CiAgICB9CgogICAgLy8gZ28gYmFjayBvbmUgY2hhcmFjdGVyCiAgICBzdHJlYW0uYmFja1VwKDEpOwoKICAgIC8vIGxvb2sgZm9yIG51bWJlcnMKICAgIC8vIE51bWJlcnMgaW4gYSBiYXNlZm9ybQogICAgaWYgKHN0cmVhbS5tYXRjaChyZUJhc2VGb3JtLCB0cnVlLCBmYWxzZSkpIHsKICAgICAgcmV0dXJuICdudW1iZXInOwogICAgfQoKICAgIC8vIE1hdGhlbWF0aWNhIG51bWJlcnMuIEZsb2F0cyAoMS4yLCAuMiwgMS4pIGNhbiBoYXZlIG9wdGlvbmFsbHkgYSBwcmVjaXNpb24gKGBmbG9hdCkgb3IgYW4gYWNjdXJhY3kgZGVmaW5pdGlvbgogICAgLy8gKGBgZmxvYXQpLiBOb3RlOiB3aGlsZSAxLjJgIGlzIHBvc3NpYmxlIDEuMmBgIGlzIG5vdC4gQXQgdGhlIGVuZCBhbiBleHBvbmVudCAoZmxvYXQqXisxMikgY2FuIGZvbGxvdy4KICAgIGlmIChzdHJlYW0ubWF0Y2gocmVGbG9hdEZvcm0sIHRydWUsIGZhbHNlKSkgewogICAgICByZXR1cm4gJ251bWJlcic7CiAgICB9CgogICAgLyogSW5bMjNdIGFuZCBPdXRbMzRdICovCiAgICBpZiAoc3RyZWFtLm1hdGNoKC8oPzpJbnxPdXQpXFtbMC05XSpcXS8sIHRydWUsIGZhbHNlKSkgewogICAgICByZXR1cm4gJ2F0b20nOwogICAgfQoKICAgIC8vIHVzYWdlCiAgICBpZiAoc3RyZWFtLm1hdGNoKC8oW2EtekEtWlwkXSsoPzpgP1thLXpBLVowLTlcJF0pKjo6dXNhZ2UpLywgdHJ1ZSwgZmFsc2UpKSB7CiAgICAgIHJldHVybiAnbWV0YSc7CiAgICB9CgogICAgLy8gbWVzc2FnZQogICAgaWYgKHN0cmVhbS5tYXRjaCgvKFthLXpBLVpcJF0rKD86YD9bYS16QS1aMC05XCRdKSo6OlthLXpBLVpcJF1bYS16QS1aMC05XCRdKik6Py8sIHRydWUsIGZhbHNlKSkgewogICAgICByZXR1cm4gJ3N0cmluZy0yJzsKICAgIH0KCiAgICAvLyB0aGlzIG1ha2VzIGEgbG9vay1haGVhZCBtYXRjaCBmb3Igc29tZXRoaW5nIGxpa2UgdmFyaWFibGU6e19JbnRlZ2VyfQogICAgLy8gdGhlIG1hdGNoIGlzIHRoZW4gZm9yd2FyZGVkIHRvIHRoZSBtbWEtcGF0dGVybnMgdG9rZW5pemVyLgogICAgaWYgKHN0cmVhbS5tYXRjaCgvKFthLXpBLVpcJF1bYS16QS1aMC05XCRdKlxzKjopKD86KD86W2EtekEtWlwkXVthLXpBLVowLTlcJF0qKXwoPzpbXjo9Pn5AXF5cJlwqXClcW1xdJ1w/LFx8XSkpLiovLCB0cnVlLCBmYWxzZSkpIHsKICAgICAgcmV0dXJuICd2YXJpYWJsZS0yJzsKICAgIH0KCiAgICAvLyBjYXRjaCB2YXJpYWJsZXMgd2hpY2ggYXJlIHVzZWQgdG9nZXRoZXIgd2l0aCBCbGFuayAoXyksIEJsYW5rU2VxdWVuY2UgKF9fKSBvciBCbGFua051bGxTZXF1ZW5jZSAoX19fKQogICAgLy8gQ2Fubm90IHN0YXJ0IHdpdGggYSBudW1iZXIsIGJ1dCBjYW4gaGF2ZSBudW1iZXJzIGF0IGFueSBvdGhlciBwb3NpdGlvbi4gRXhhbXBsZXMKICAgIC8vIGJsdWJfX0ludGVnZXIsIGExXywgYjM0X0ludGVnZXIzMgogICAgaWYgKHN0cmVhbS5tYXRjaCgvW2EtekEtWlwkXVthLXpBLVowLTlcJF0qXytbYS16QS1aXCRdW2EtekEtWjAtOVwkXSovLCB0cnVlLCBmYWxzZSkpIHsKICAgICAgcmV0dXJuICd2YXJpYWJsZS0yJzsKICAgIH0KICAgIGlmIChzdHJlYW0ubWF0Y2goL1thLXpBLVpcJF1bYS16QS1aMC05XCRdKl8rLywgdHJ1ZSwgZmFsc2UpKSB7CiAgICAgIHJldHVybiAndmFyaWFibGUtMic7CiAgICB9CiAgICBpZiAoc3RyZWFtLm1hdGNoKC9fK1thLXpBLVpcJF1bYS16QS1aMC05XCRdKi8sIHRydWUsIGZhbHNlKSkgewogICAgICByZXR1cm4gJ3ZhcmlhYmxlLTInOwogICAgfQoKICAgIC8vIE5hbWVkIGNoYXJhY3RlcnMgaW4gTWF0aGVtYXRpY2EsIGxpa2UgXFtHYW1tYV0uCiAgICBpZiAoc3RyZWFtLm1hdGNoKC9cXFxbW2EtekEtWlwkXVthLXpBLVowLTlcJF0qXF0vLCB0cnVlLCBmYWxzZSkpIHsKICAgICAgcmV0dXJuICd2YXJpYWJsZS0zJzsKICAgIH0KCiAgICAvLyBNYXRjaCBhbGwgYnJhY2VzIHNlcGFyYXRlbHkKICAgIGlmIChzdHJlYW0ubWF0Y2goLyg/OlxbfFxdfHt8fXxcKHxcKSkvLCB0cnVlLCBmYWxzZSkpIHsKICAgICAgcmV0dXJuICdicmFja2V0JzsKICAgIH0KCiAgICAvLyBDYXRjaCBTbG90cyAoIywgIyMsICMzLCAjIzkgYW5kIHRoZSBWMTAgbmFtZWQgc2xvdHMgI25hbWUpLiBJIGhhdmUgbmV2ZXIgc2VlbiBzb21lb25lIHVzaW5nIG1vcmUgdGhhbiBvbmUgZGlnaXQgYWZ0ZXIgIywgc28gd2UgbWF0Y2gKICAgIC8vIG9ubHkgb25lLgogICAgaWYgKHN0cmVhbS5tYXRjaCgvKD86I1thLXpBLVpcJF1bYS16QS1aMC05XCRdKnwjK1swLTldPykvLCB0cnVlLCBmYWxzZSkpIHsKICAgICAgcmV0dXJuICd2YXJpYWJsZS0yJzsKICAgIH0KCiAgICAvLyBMaXRlcmFscyBsaWtlIHZhcmlhYmxlcywga2V5d29yZHMsIGZ1bmN0aW9ucwogICAgaWYgKHN0cmVhbS5tYXRjaChyZUlkSW5Db250ZXh0LCB0cnVlLCBmYWxzZSkpIHsKICAgICAgcmV0dXJuICdrZXl3b3JkJzsKICAgIH0KCiAgICAvLyBvcGVyYXRvcnMuIE5vdGUgdGhhdCBvcGVyYXRvcnMgbGlrZSBAQCBvciAvOyBhcmUgbWF0Y2hlZCBzZXBhcmF0ZWx5IGZvciBlYWNoIHN5bWJvbC4KICAgIGlmIChzdHJlYW0ubWF0Y2goLyg/OlxcfFwrfFwtfFwqfFwvfCx8O3xcLnw6fEB8fnw9fD58PHwmfFx8fF98YHwnfFxefFw/fCF8JSkvLCB0cnVlLCBmYWxzZSkpIHsKICAgICAgcmV0dXJuICdvcGVyYXRvcic7CiAgICB9CgogICAgLy8gZXZlcnl0aGluZyBlbHNlIGlzIGFuIGVycm9yCiAgICBzdHJlYW0ubmV4dCgpOyAvLyBhZHZhbmNlIHRoZSBzdHJlYW0uCiAgICByZXR1cm4gJ2Vycm9yJzsKICB9CgogIGZ1bmN0aW9uIHRva2VuU3RyaW5nKHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBuZXh0LCBlbmQgPSBmYWxzZSwgZXNjYXBlZCA9IGZhbHNlOwogICAgd2hpbGUgKChuZXh0ID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkgewogICAgICBpZiAobmV4dCA9PT0gJyInICYmICFlc2NhcGVkKSB7CiAgICAgICAgZW5kID0gdHJ1ZTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBlc2NhcGVkID0gIWVzY2FwZWQgJiYgbmV4dCA9PT0gJ1xcJzsKICAgIH0KICAgIGlmIChlbmQgJiYgIWVzY2FwZWQpIHsKICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICB9CiAgICByZXR1cm4gJ3N0cmluZyc7CiAgfTsKCiAgZnVuY3Rpb24gdG9rZW5Db21tZW50KHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBwcmV2LCBuZXh0OwogICAgd2hpbGUoc3RhdGUuY29tbWVudExldmVsID4gMCAmJiAobmV4dCA9IHN0cmVhbS5uZXh0KCkpICE9IG51bGwpIHsKICAgICAgaWYgKHByZXYgPT09ICcoJyAmJiBuZXh0ID09PSAnKicpIHN0YXRlLmNvbW1lbnRMZXZlbCsrOwogICAgICBpZiAocHJldiA9PT0gJyonICYmIG5leHQgPT09ICcpJykgc3RhdGUuY29tbWVudExldmVsLS07CiAgICAgIHByZXYgPSBuZXh0OwogICAgfQogICAgaWYgKHN0YXRlLmNvbW1lbnRMZXZlbCA8PSAwKSB7CiAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlOwogICAgfQogICAgcmV0dXJuICdjb21tZW50JzsKICB9CgogIHJldHVybiB7CiAgICBzdGFydFN0YXRlOiBmdW5jdGlvbigpIHtyZXR1cm4ge3Rva2VuaXplOiB0b2tlbkJhc2UsIGNvbW1lbnRMZXZlbDogMH07fSwKICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIGlmIChzdHJlYW0uZWF0U3BhY2UoKSkgcmV0dXJuIG51bGw7CiAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgIH0sCiAgICBibG9ja0NvbW1lbnRTdGFydDogIigqIiwKICAgIGJsb2NrQ29tbWVudEVuZDogIiopIgogIH07Cn0pOwoKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCd0ZXh0L3gtbWF0aGVtYXRpY2EnLCB7CiAgbmFtZTogJ21hdGhlbWF0aWNhJwp9KTsKCn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/mbox/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/mbox/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogbWJveCBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Im1ib3guanMiPjwvc2NyaXB0Pgo8c3R5bGU+LkNvZGVNaXJyb3IgeyBib3JkZXItdG9wOiAxcHggc29saWQgI2RkZDsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkZGQ7IH08L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxoMT5Db2RlTWlycm9yPC9oMT48aW1nIGlkPWxvZ28gc3JjPSIuLi8uLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5MYW5ndWFnZSBtb2RlczwvYT4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+bWJveDwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+bWJveCBtb2RlPC9oMj4KPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KRnJvbSB0aW1vdGh5Z3U5OUBnbWFpbC5jb20gU3VuIEFwciAxNyAwMTo0MDo0MyAyMDE2CkZyb206IFRpbW90aHkgR3UgJmx0O3RpbW90aHlndTk5QGdtYWlsLmNvbSZndDsKRGF0ZTogU2F0LCAxNiBBcHIgMjAxNiAxODo0MDo0MyAtMDcwMApTdWJqZWN0OiBtYm94IG1vZGUKTWVzc2FnZS1JRDogJmx0O1o4ZCtiVFQ1MFUvYXo5NEZabnlQa0RqWm1XMD1AZ21haWwuY29tJmd0OwoKbWJveCBtb2RlIGlzIHdvcmtpbmchCgpUaW1vdGh5CjwvdGV4dGFyZWE+PC9mb3JtPgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHt9KTsKICAgIDwvc2NyaXB0PgoKICAgIDxwPjxzdHJvbmc+TUlNRSB0eXBlcyBkZWZpbmVkOjwvc3Ryb25nPiA8Y29kZT5hcHBsaWNhdGlvbi9tYm94PC9jb2RlPi48L3A+CgogIDwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/mbox/mbox.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKdmFyIHJmYzI4MjIgPSBbCiAgIkZyb20iLCAiU2VuZGVyIiwgIlJlcGx5LVRvIiwgIlRvIiwgIkNjIiwgIkJjYyIsICJNZXNzYWdlLUlEIiwKICAiSW4tUmVwbHktVG8iLCAiUmVmZXJlbmNlcyIsICJSZXNlbnQtRnJvbSIsICJSZXNlbnQtU2VuZGVyIiwgIlJlc2VudC1UbyIsCiAgIlJlc2VudC1DYyIsICJSZXNlbnQtQmNjIiwgIlJlc2VudC1NZXNzYWdlLUlEIiwgIlJldHVybi1QYXRoIiwgIlJlY2VpdmVkIgpdOwp2YXIgcmZjMjgyMk5vRW1haWwgPSBbCiAgIkRhdGUiLCAiU3ViamVjdCIsICJDb21tZW50cyIsICJLZXl3b3JkcyIsICJSZXNlbnQtRGF0ZSIKXTsKCkNvZGVNaXJyb3IucmVnaXN0ZXJIZWxwZXIoImhpbnRXb3JkcyIsICJtYm94IiwgcmZjMjgyMi5jb25jYXQocmZjMjgyMk5vRW1haWwpKTsKCnZhciB3aGl0ZXNwYWNlID0gL15bIFx0XS87CnZhciBzZXBhcmF0b3IgPSAvXkZyb20gLzsgLy8gU2VlIFJGQyA0MTU1CnZhciByZmMyODIySGVhZGVyID0gbmV3IFJlZ0V4cCgiXigiICsgcmZjMjgyMi5qb2luKCJ8IikgKyAiKTogIik7CnZhciByZmMyODIySGVhZGVyTm9FbWFpbCA9IG5ldyBSZWdFeHAoIl4oIiArIHJmYzI4MjJOb0VtYWlsLmpvaW4oInwiKSArICIpOiAiKTsKdmFyIGhlYWRlciA9IC9eW146XSs6LzsgLy8gT3B0aW9uYWwgZmllbGRzIGRlZmluZWQgaW4gUkZDIDI4MjIKdmFyIGVtYWlsID0gL15bXiBdK0BbXiBdKy87CnZhciB1bnRpbEVtYWlsID0gL14uKj8oPz1bXiBdKz9AW14gXSspLzsKdmFyIGJyYWNrZXRlZEVtYWlsID0gL148Lio/Pi87CnZhciB1bnRpbEJyYWNrZXRlZEVtYWlsID0gL14uKj8oPz08Lio+KS87CgpmdW5jdGlvbiBzdHlsZUZvckhlYWRlcihoZWFkZXIpIHsKICBpZiAoaGVhZGVyID09PSAiU3ViamVjdCIpIHJldHVybiAiaGVhZGVyIjsKICByZXR1cm4gInN0cmluZyI7Cn0KCmZ1bmN0aW9uIHJlYWRUb2tlbihzdHJlYW0sIHN0YXRlKSB7CiAgaWYgKHN0cmVhbS5zb2woKSkgewogICAgLy8gRnJvbSBsYXN0IGxpbmUKICAgIHN0YXRlLmluU2VwYXJhdG9yID0gZmFsc2U7CiAgICBpZiAoc3RhdGUuaW5IZWFkZXIgJiYgc3RyZWFtLm1hdGNoKHdoaXRlc3BhY2UpKSB7CiAgICAgIC8vIEhlYWRlciBmb2xkaW5nCiAgICAgIHJldHVybiBudWxsOwogICAgfSBlbHNlIHsKICAgICAgc3RhdGUuaW5IZWFkZXIgPSBmYWxzZTsKICAgICAgc3RhdGUuaGVhZGVyID0gbnVsbDsKICAgIH0KCiAgICBpZiAoc3RyZWFtLm1hdGNoKHNlcGFyYXRvcikpIHsKICAgICAgc3RhdGUuaW5IZWFkZXJzID0gdHJ1ZTsKICAgICAgc3RhdGUuaW5TZXBhcmF0b3IgPSB0cnVlOwogICAgICByZXR1cm4gImF0b20iOwogICAgfQoKICAgIHZhciBtYXRjaDsKICAgIHZhciBlbWFpbFBlcm1pdHRlZCA9IGZhbHNlOwogICAgaWYgKChtYXRjaCA9IHN0cmVhbS5tYXRjaChyZmMyODIySGVhZGVyTm9FbWFpbCkpIHx8CiAgICAgICAgKGVtYWlsUGVybWl0dGVkID0gdHJ1ZSkgJiYgKG1hdGNoID0gc3RyZWFtLm1hdGNoKHJmYzI4MjJIZWFkZXIpKSkgewogICAgICBzdGF0ZS5pbkhlYWRlcnMgPSB0cnVlOwogICAgICBzdGF0ZS5pbkhlYWRlciA9IHRydWU7CiAgICAgIHN0YXRlLmVtYWlsUGVybWl0dGVkID0gZW1haWxQZXJtaXR0ZWQ7CiAgICAgIHN0YXRlLmhlYWRlciA9IG1hdGNoWzFdOwogICAgICByZXR1cm4gImF0b20iOwogICAgfQoKICAgIC8vIFVzZSB2aW0ncyBoZXVyaXN0aWNzOiByZWNvZ25pemUgY3VzdG9tIGhlYWRlcnMgb25seSBpZiB0aGUgbGluZSBpcyBpbiBhCiAgICAvLyBibG9jayBvZiBsZWdpdGltYXRlIGhlYWRlcnMuCiAgICBpZiAoc3RhdGUuaW5IZWFkZXJzICYmIChtYXRjaCA9IHN0cmVhbS5tYXRjaChoZWFkZXIpKSkgewogICAgICBzdGF0ZS5pbkhlYWRlciA9IHRydWU7CiAgICAgIHN0YXRlLmVtYWlsUGVybWl0dGVkID0gdHJ1ZTsKICAgICAgc3RhdGUuaGVhZGVyID0gbWF0Y2hbMV07CiAgICAgIHJldHVybiAiYXRvbSI7CiAgICB9CgogICAgc3RhdGUuaW5IZWFkZXJzID0gZmFsc2U7CiAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICByZXR1cm4gbnVsbDsKICB9CgogIGlmIChzdGF0ZS5pblNlcGFyYXRvcikgewogICAgaWYgKHN0cmVhbS5tYXRjaChlbWFpbCkpIHJldHVybiAibGluayI7CiAgICBpZiAoc3RyZWFtLm1hdGNoKHVudGlsRW1haWwpKSByZXR1cm4gImF0b20iOwogICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgcmV0dXJuICJhdG9tIjsKICB9CgogIGlmIChzdGF0ZS5pbkhlYWRlcikgewogICAgdmFyIHN0eWxlID0gc3R5bGVGb3JIZWFkZXIoc3RhdGUuaGVhZGVyKTsKCiAgICBpZiAoc3RhdGUuZW1haWxQZXJtaXR0ZWQpIHsKICAgICAgaWYgKHN0cmVhbS5tYXRjaChicmFja2V0ZWRFbWFpbCkpIHJldHVybiBzdHlsZSArICIgbGluayI7CiAgICAgIGlmIChzdHJlYW0ubWF0Y2godW50aWxCcmFja2V0ZWRFbWFpbCkpIHJldHVybiBzdHlsZTsKICAgIH0KICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgIHJldHVybiBzdHlsZTsKICB9CgogIHN0cmVhbS5za2lwVG9FbmQoKTsKICByZXR1cm4gbnVsbDsKfTsKCkNvZGVNaXJyb3IuZGVmaW5lTW9kZSgibWJveCIsIGZ1bmN0aW9uKCkgewogIHJldHVybiB7CiAgICBzdGFydFN0YXRlOiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICAvLyBJcyBpbiBhIG1ib3ggc2VwYXJhdG9yCiAgICAgICAgaW5TZXBhcmF0b3I6IGZhbHNlLAogICAgICAgIC8vIElzIGluIGEgbWFpbCBoZWFkZXIKICAgICAgICBpbkhlYWRlcjogZmFsc2UsCiAgICAgICAgLy8gSWYgYnJhY2tldGVkIGVtYWlsIGlzIHBlcm1pdHRlZC4gT25seSBhcHBsaWNhYmxlIHdoZW4gaW5IZWFkZXIKICAgICAgICBlbWFpbFBlcm1pdHRlZDogZmFsc2UsCiAgICAgICAgLy8gTmFtZSBvZiBjdXJyZW50IGhlYWRlcgogICAgICAgIGhlYWRlcjogbnVsbCwKICAgICAgICAvLyBJcyBpbiBhIHJlZ2lvbiBvZiBtYWlsIGhlYWRlcnMKICAgICAgICBpbkhlYWRlcnM6IGZhbHNlCiAgICAgIH07CiAgICB9LAogICAgdG9rZW46IHJlYWRUb2tlbiwKICAgIGJsYW5rTGluZTogZnVuY3Rpb24oc3RhdGUpIHsKICAgICAgc3RhdGUuaW5IZWFkZXJzID0gc3RhdGUuaW5TZXBhcmF0b3IgPSBzdGF0ZS5pbkhlYWRlciA9IGZhbHNlOwogICAgfQogIH07Cn0pOwoKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJhcHBsaWNhdGlvbi9tYm94IiwgIm1ib3giKTsKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/meta.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CgogIENvZGVNaXJyb3IubW9kZUluZm8gPSBbCiAgICB7bmFtZTogIkFQTCIsIG1pbWU6ICJ0ZXh0L2FwbCIsIG1vZGU6ICJhcGwiLCBleHQ6IFsiZHlhbG9nIiwgImFwbCJdfSwKICAgIHtuYW1lOiAiUEdQIiwgbWltZXM6IFsiYXBwbGljYXRpb24vcGdwIiwgImFwcGxpY2F0aW9uL3BncC1rZXlzIiwgImFwcGxpY2F0aW9uL3BncC1zaWduYXR1cmUiXSwgbW9kZTogImFzY2lpYXJtb3IiLCBleHQ6IFsicGdwIl19LAogICAge25hbWU6ICJBU04uMSIsIG1pbWU6ICJ0ZXh0L3gtdHRjbi1hc24iLCBtb2RlOiAiYXNuLjEiLCBleHQ6IFsiYXNuIiwgImFzbjEiXX0sCiAgICB7bmFtZTogIkFzdGVyaXNrIiwgbWltZTogInRleHQveC1hc3RlcmlzayIsIG1vZGU6ICJhc3RlcmlzayIsIGZpbGU6IC9eZXh0ZW5zaW9uc1wuY29uZiQvaX0sCiAgICB7bmFtZTogIkJyYWluZnVjayIsIG1pbWU6ICJ0ZXh0L3gtYnJhaW5mdWNrIiwgbW9kZTogImJyYWluZnVjayIsIGV4dDogWyJiIiwgImJmIl19LAogICAge25hbWU6ICJDIiwgbWltZTogInRleHQveC1jc3JjIiwgbW9kZTogImNsaWtlIiwgZXh0OiBbImMiLCAiaCJdfSwKICAgIHtuYW1lOiAiQysrIiwgbWltZTogInRleHQveC1jKytzcmMiLCBtb2RlOiAiY2xpa2UiLCBleHQ6IFsiY3BwIiwgImMrKyIsICJjYyIsICJjeHgiLCAiaHBwIiwgImgrKyIsICJoaCIsICJoeHgiXSwgYWxpYXM6IFsiY3BwIl19LAogICAge25hbWU6ICJDb2JvbCIsIG1pbWU6ICJ0ZXh0L3gtY29ib2wiLCBtb2RlOiAiY29ib2wiLCBleHQ6IFsiY29iIiwgImNweSJdfSwKICAgIHtuYW1lOiAiQyMiLCBtaW1lOiAidGV4dC94LWNzaGFycCIsIG1vZGU6ICJjbGlrZSIsIGV4dDogWyJjcyJdLCBhbGlhczogWyJjc2hhcnAiXX0sCiAgICB7bmFtZTogIkNsb2p1cmUiLCBtaW1lOiAidGV4dC94LWNsb2p1cmUiLCBtb2RlOiAiY2xvanVyZSIsIGV4dDogWyJjbGoiLCAiY2xqYyIsICJjbGp4Il19LAogICAge25hbWU6ICJDbG9qdXJlU2NyaXB0IiwgbWltZTogInRleHQveC1jbG9qdXJlc2NyaXB0IiwgbW9kZTogImNsb2p1cmUiLCBleHQ6IFsiY2xqcyJdfSwKICAgIHtuYW1lOiAiQ2xvc3VyZSBTdHlsZXNoZWV0cyAoR1NTKSIsIG1pbWU6ICJ0ZXh0L3gtZ3NzIiwgbW9kZTogImNzcyIsIGV4dDogWyJnc3MiXX0sCiAgICB7bmFtZTogIkNNYWtlIiwgbWltZTogInRleHQveC1jbWFrZSIsIG1vZGU6ICJjbWFrZSIsIGV4dDogWyJjbWFrZSIsICJjbWFrZS5pbiJdLCBmaWxlOiAvXkNNYWtlTGlzdHMudHh0JC99LAogICAge25hbWU6ICJDb2ZmZWVTY3JpcHQiLCBtaW1lOiAidGV4dC94LWNvZmZlZXNjcmlwdCIsIG1vZGU6ICJjb2ZmZWVzY3JpcHQiLCBleHQ6IFsiY29mZmVlIl0sIGFsaWFzOiBbImNvZmZlZSIsICJjb2ZmZWUtc2NyaXB0Il19LAogICAge25hbWU6ICJDb21tb24gTGlzcCIsIG1pbWU6ICJ0ZXh0L3gtY29tbW9uLWxpc3AiLCBtb2RlOiAiY29tbW9ubGlzcCIsIGV4dDogWyJjbCIsICJsaXNwIiwgImVsIl0sIGFsaWFzOiBbImxpc3AiXX0sCiAgICB7bmFtZTogIkN5cGhlciIsIG1pbWU6ICJhcHBsaWNhdGlvbi94LWN5cGhlci1xdWVyeSIsIG1vZGU6ICJjeXBoZXIiLCBleHQ6IFsiY3lwIiwgImN5cGhlciJdfSwKICAgIHtuYW1lOiAiQ3l0aG9uIiwgbWltZTogInRleHQveC1jeXRob24iLCBtb2RlOiAicHl0aG9uIiwgZXh0OiBbInB5eCIsICJweGQiLCAicHhpIl19LAogICAge25hbWU6ICJDcnlzdGFsIiwgbWltZTogInRleHQveC1jcnlzdGFsIiwgbW9kZTogImNyeXN0YWwiLCBleHQ6IFsiY3IiXX0sCiAgICB7bmFtZTogIkNTUyIsIG1pbWU6ICJ0ZXh0L2NzcyIsIG1vZGU6ICJjc3MiLCBleHQ6IFsiY3NzIl19LAogICAge25hbWU6ICJDUUwiLCBtaW1lOiAidGV4dC94LWNhc3NhbmRyYSIsIG1vZGU6ICJzcWwiLCBleHQ6IFsiY3FsIl19LAogICAge25hbWU6ICJEIiwgbWltZTogInRleHQveC1kIiwgbW9kZTogImQiLCBleHQ6IFsiZCJdfSwKICAgIHtuYW1lOiAiRGFydCIsIG1pbWVzOiBbImFwcGxpY2F0aW9uL2RhcnQiLCAidGV4dC94LWRhcnQiXSwgbW9kZTogImRhcnQiLCBleHQ6IFsiZGFydCJdfSwKICAgIHtuYW1lOiAiZGlmZiIsIG1pbWU6ICJ0ZXh0L3gtZGlmZiIsIG1vZGU6ICJkaWZmIiwgZXh0OiBbImRpZmYiLCAicGF0Y2giXX0sCiAgICB7bmFtZTogIkRqYW5nbyIsIG1pbWU6ICJ0ZXh0L3gtZGphbmdvIiwgbW9kZTogImRqYW5nbyJ9LAogICAge25hbWU6ICJEb2NrZXJmaWxlIiwgbWltZTogInRleHQveC1kb2NrZXJmaWxlIiwgbW9kZTogImRvY2tlcmZpbGUiLCBmaWxlOiAvXkRvY2tlcmZpbGUkL30sCiAgICB7bmFtZTogIkRURCIsIG1pbWU6ICJhcHBsaWNhdGlvbi94bWwtZHRkIiwgbW9kZTogImR0ZCIsIGV4dDogWyJkdGQiXX0sCiAgICB7bmFtZTogIkR5bGFuIiwgbWltZTogInRleHQveC1keWxhbiIsIG1vZGU6ICJkeWxhbiIsIGV4dDogWyJkeWxhbiIsICJkeWwiLCAiaW50ciJdfSwKICAgIHtuYW1lOiAiRUJORiIsIG1pbWU6ICJ0ZXh0L3gtZWJuZiIsIG1vZGU6ICJlYm5mIn0sCiAgICB7bmFtZTogIkVDTCIsIG1pbWU6ICJ0ZXh0L3gtZWNsIiwgbW9kZTogImVjbCIsIGV4dDogWyJlY2wiXX0sCiAgICB7bmFtZTogImVkbiIsIG1pbWU6ICJhcHBsaWNhdGlvbi9lZG4iLCBtb2RlOiAiY2xvanVyZSIsIGV4dDogWyJlZG4iXX0sCiAgICB7bmFtZTogIkVpZmZlbCIsIG1pbWU6ICJ0ZXh0L3gtZWlmZmVsIiwgbW9kZTogImVpZmZlbCIsIGV4dDogWyJlIl19LAogICAge25hbWU6ICJFbG0iLCBtaW1lOiAidGV4dC94LWVsbSIsIG1vZGU6ICJlbG0iLCBleHQ6IFsiZWxtIl19LAogICAge25hbWU6ICJFbWJlZGRlZCBKYXZhc2NyaXB0IiwgbWltZTogImFwcGxpY2F0aW9uL3gtZWpzIiwgbW9kZTogImh0bWxlbWJlZGRlZCIsIGV4dDogWyJlanMiXX0sCiAgICB7bmFtZTogIkVtYmVkZGVkIFJ1YnkiLCBtaW1lOiAiYXBwbGljYXRpb24veC1lcmIiLCBtb2RlOiAiaHRtbGVtYmVkZGVkIiwgZXh0OiBbImVyYiJdfSwKICAgIHtuYW1lOiAiRXJsYW5nIiwgbWltZTogInRleHQveC1lcmxhbmciLCBtb2RlOiAiZXJsYW5nIiwgZXh0OiBbImVybCJdfSwKICAgIHtuYW1lOiAiRmFjdG9yIiwgbWltZTogInRleHQveC1mYWN0b3IiLCBtb2RlOiAiZmFjdG9yIiwgZXh0OiBbImZhY3RvciJdfSwKICAgIHtuYW1lOiAiRkNMIiwgbWltZTogInRleHQveC1mY2wiLCBtb2RlOiAiZmNsIn0sCiAgICB7bmFtZTogIkZvcnRoIiwgbWltZTogInRleHQveC1mb3J0aCIsIG1vZGU6ICJmb3J0aCIsIGV4dDogWyJmb3J0aCIsICJmdGgiLCAiNHRoIl19LAogICAge25hbWU6ICJGb3J0cmFuIiwgbWltZTogInRleHQveC1mb3J0cmFuIiwgbW9kZTogImZvcnRyYW4iLCBleHQ6IFsiZiIsICJmb3IiLCAiZjc3IiwgImY5MCJdfSwKICAgIHtuYW1lOiAiRiMiLCBtaW1lOiAidGV4dC94LWZzaGFycCIsIG1vZGU6ICJtbGxpa2UiLCBleHQ6IFsiZnMiXSwgYWxpYXM6IFsiZnNoYXJwIl19LAogICAge25hbWU6ICJHYXMiLCBtaW1lOiAidGV4dC94LWdhcyIsIG1vZGU6ICJnYXMiLCBleHQ6IFsicyJdfSwKICAgIHtuYW1lOiAiR2hlcmtpbiIsIG1pbWU6ICJ0ZXh0L3gtZmVhdHVyZSIsIG1vZGU6ICJnaGVya2luIiwgZXh0OiBbImZlYXR1cmUiXX0sCiAgICB7bmFtZTogIkdpdEh1YiBGbGF2b3JlZCBNYXJrZG93biIsIG1pbWU6ICJ0ZXh0L3gtZ2ZtIiwgbW9kZTogImdmbSIsIGZpbGU6IC9eKHJlYWRtZXxjb250cmlidXRpbmd8aGlzdG9yeSkubWQkL2l9LAogICAge25hbWU6ICJHbyIsIG1pbWU6ICJ0ZXh0L3gtZ28iLCBtb2RlOiAiZ28iLCBleHQ6IFsiZ28iXX0sCiAgICB7bmFtZTogIkdyb292eSIsIG1pbWU6ICJ0ZXh0L3gtZ3Jvb3Z5IiwgbW9kZTogImdyb292eSIsIGV4dDogWyJncm9vdnkiLCAiZ3JhZGxlIl0sIGZpbGU6IC9eSmVua2luc2ZpbGUkL30sCiAgICB7bmFtZTogIkhBTUwiLCBtaW1lOiAidGV4dC94LWhhbWwiLCBtb2RlOiAiaGFtbCIsIGV4dDogWyJoYW1sIl19LAogICAge25hbWU6ICJIYXNrZWxsIiwgbWltZTogInRleHQveC1oYXNrZWxsIiwgbW9kZTogImhhc2tlbGwiLCBleHQ6IFsiaHMiXX0sCiAgICB7bmFtZTogIkhhc2tlbGwgKExpdGVyYXRlKSIsIG1pbWU6ICJ0ZXh0L3gtbGl0ZXJhdGUtaGFza2VsbCIsIG1vZGU6ICJoYXNrZWxsLWxpdGVyYXRlIiwgZXh0OiBbImxocyJdfSwKICAgIHtuYW1lOiAiSGF4ZSIsIG1pbWU6ICJ0ZXh0L3gtaGF4ZSIsIG1vZGU6ICJoYXhlIiwgZXh0OiBbImh4Il19LAogICAge25hbWU6ICJIWE1MIiwgbWltZTogInRleHQveC1oeG1sIiwgbW9kZTogImhheGUiLCBleHQ6IFsiaHhtbCJdfSwKICAgIHtuYW1lOiAiQVNQLk5FVCIsIG1pbWU6ICJhcHBsaWNhdGlvbi94LWFzcHgiLCBtb2RlOiAiaHRtbGVtYmVkZGVkIiwgZXh0OiBbImFzcHgiXSwgYWxpYXM6IFsiYXNwIiwgImFzcHgiXX0sCiAgICB7bmFtZTogIkhUTUwiLCBtaW1lOiAidGV4dC9odG1sIiwgbW9kZTogImh0bWxtaXhlZCIsIGV4dDogWyJodG1sIiwgImh0bSJdLCBhbGlhczogWyJ4aHRtbCJdfSwKICAgIHtuYW1lOiAiSFRUUCIsIG1pbWU6ICJtZXNzYWdlL2h0dHAiLCBtb2RlOiAiaHR0cCJ9LAogICAge25hbWU6ICJJREwiLCBtaW1lOiAidGV4dC94LWlkbCIsIG1vZGU6ICJpZGwiLCBleHQ6IFsicHJvIl19LAogICAge25hbWU6ICJQdWciLCBtaW1lOiAidGV4dC94LXB1ZyIsIG1vZGU6ICJwdWciLCBleHQ6IFsiamFkZSIsICJwdWciXSwgYWxpYXM6IFsiamFkZSJdfSwKICAgIHtuYW1lOiAiSmF2YSIsIG1pbWU6ICJ0ZXh0L3gtamF2YSIsIG1vZGU6ICJjbGlrZSIsIGV4dDogWyJqYXZhIl19LAogICAge25hbWU6ICJKYXZhIFNlcnZlciBQYWdlcyIsIG1pbWU6ICJhcHBsaWNhdGlvbi94LWpzcCIsIG1vZGU6ICJodG1sZW1iZWRkZWQiLCBleHQ6IFsianNwIl0sIGFsaWFzOiBbImpzcCJdfSwKICAgIHtuYW1lOiAiSmF2YVNjcmlwdCIsIG1pbWVzOiBbInRleHQvamF2YXNjcmlwdCIsICJ0ZXh0L2VjbWFzY3JpcHQiLCAiYXBwbGljYXRpb24vamF2YXNjcmlwdCIsICJhcHBsaWNhdGlvbi94LWphdmFzY3JpcHQiLCAiYXBwbGljYXRpb24vZWNtYXNjcmlwdCJdLAogICAgIG1vZGU6ICJqYXZhc2NyaXB0IiwgZXh0OiBbImpzIl0sIGFsaWFzOiBbImVjbWFzY3JpcHQiLCAianMiLCAibm9kZSJdfSwKICAgIHtuYW1lOiAiSlNPTiIsIG1pbWVzOiBbImFwcGxpY2F0aW9uL2pzb24iLCAiYXBwbGljYXRpb24veC1qc29uIl0sIG1vZGU6ICJqYXZhc2NyaXB0IiwgZXh0OiBbImpzb24iLCAibWFwIl0sIGFsaWFzOiBbImpzb241Il19LAogICAge25hbWU6ICJKU09OLUxEIiwgbWltZTogImFwcGxpY2F0aW9uL2xkK2pzb24iLCBtb2RlOiAiamF2YXNjcmlwdCIsIGV4dDogWyJqc29ubGQiXSwgYWxpYXM6IFsianNvbmxkIl19LAogICAge25hbWU6ICJKU1giLCBtaW1lOiAidGV4dC9qc3giLCBtb2RlOiAianN4IiwgZXh0OiBbImpzeCJdfSwKICAgIHtuYW1lOiAiSmluamEyIiwgbWltZTogIm51bGwiLCBtb2RlOiAiamluamEyIn0sCiAgICB7bmFtZTogIkp1bGlhIiwgbWltZTogInRleHQveC1qdWxpYSIsIG1vZGU6ICJqdWxpYSIsIGV4dDogWyJqbCJdfSwKICAgIHtuYW1lOiAiS290bGluIiwgbWltZTogInRleHQveC1rb3RsaW4iLCBtb2RlOiAiY2xpa2UiLCBleHQ6IFsia3QiXX0sCiAgICB7bmFtZTogIkxFU1MiLCBtaW1lOiAidGV4dC94LWxlc3MiLCBtb2RlOiAiY3NzIiwgZXh0OiBbImxlc3MiXX0sCiAgICB7bmFtZTogIkxpdmVTY3JpcHQiLCBtaW1lOiAidGV4dC94LWxpdmVzY3JpcHQiLCBtb2RlOiAibGl2ZXNjcmlwdCIsIGV4dDogWyJscyJdLCBhbGlhczogWyJscyJdfSwKICAgIHtuYW1lOiAiTHVhIiwgbWltZTogInRleHQveC1sdWEiLCBtb2RlOiAibHVhIiwgZXh0OiBbImx1YSJdfSwKICAgIHtuYW1lOiAiTWFya2Rvd24iLCBtaW1lOiAidGV4dC94LW1hcmtkb3duIiwgbW9kZTogIm1hcmtkb3duIiwgZXh0OiBbIm1hcmtkb3duIiwgIm1kIiwgIm1rZCJdfSwKICAgIHtuYW1lOiAibUlSQyIsIG1pbWU6ICJ0ZXh0L21pcmMiLCBtb2RlOiAibWlyYyJ9LAogICAge25hbWU6ICJNYXJpYURCIFNRTCIsIG1pbWU6ICJ0ZXh0L3gtbWFyaWFkYiIsIG1vZGU6ICJzcWwifSwKICAgIHtuYW1lOiAiTWF0aGVtYXRpY2EiLCBtaW1lOiAidGV4dC94LW1hdGhlbWF0aWNhIiwgbW9kZTogIm1hdGhlbWF0aWNhIiwgZXh0OiBbIm0iLCAibmIiXX0sCiAgICB7bmFtZTogIk1vZGVsaWNhIiwgbWltZTogInRleHQveC1tb2RlbGljYSIsIG1vZGU6ICJtb2RlbGljYSIsIGV4dDogWyJtbyJdfSwKICAgIHtuYW1lOiAiTVVNUFMiLCBtaW1lOiAidGV4dC94LW11bXBzIiwgbW9kZTogIm11bXBzIiwgZXh0OiBbIm1wcyJdfSwKICAgIHtuYW1lOiAiTVMgU1FMIiwgbWltZTogInRleHQveC1tc3NxbCIsIG1vZGU6ICJzcWwifSwKICAgIHtuYW1lOiAibWJveCIsIG1pbWU6ICJhcHBsaWNhdGlvbi9tYm94IiwgbW9kZTogIm1ib3giLCBleHQ6IFsibWJveCJdfSwKICAgIHtuYW1lOiAiTXlTUUwiLCBtaW1lOiAidGV4dC94LW15c3FsIiwgbW9kZTogInNxbCJ9LAogICAge25hbWU6ICJOZ2lueCIsIG1pbWU6ICJ0ZXh0L3gtbmdpbngtY29uZiIsIG1vZGU6ICJuZ2lueCIsIGZpbGU6IC9uZ2lueC4qXC5jb25mJC9pfSwKICAgIHtuYW1lOiAiTlNJUyIsIG1pbWU6ICJ0ZXh0L3gtbnNpcyIsIG1vZGU6ICJuc2lzIiwgZXh0OiBbIm5zaCIsICJuc2kiXX0sCiAgICB7bmFtZTogIk5UcmlwbGVzIiwgbWltZTogInRleHQvbi10cmlwbGVzIiwgbW9kZTogIm50cmlwbGVzIiwgZXh0OiBbIm50Il19LAogICAge25hbWU6ICJPYmplY3RpdmUgQyIsIG1pbWU6ICJ0ZXh0L3gtb2JqZWN0aXZlYyIsIG1vZGU6ICJjbGlrZSIsIGV4dDogWyJtIiwgIm1tIl0sIGFsaWFzOiBbIm9iamVjdGl2ZS1jIiwgIm9iamMiXX0sCiAgICB7bmFtZTogIk9DYW1sIiwgbWltZTogInRleHQveC1vY2FtbCIsIG1vZGU6ICJtbGxpa2UiLCBleHQ6IFsibWwiLCAibWxpIiwgIm1sbCIsICJtbHkiXX0sCiAgICB7bmFtZTogIk9jdGF2ZSIsIG1pbWU6ICJ0ZXh0L3gtb2N0YXZlIiwgbW9kZTogIm9jdGF2ZSIsIGV4dDogWyJtIl19LAogICAge25hbWU6ICJPeiIsIG1pbWU6ICJ0ZXh0L3gtb3oiLCBtb2RlOiAib3oiLCBleHQ6IFsib3oiXX0sCiAgICB7bmFtZTogIlBhc2NhbCIsIG1pbWU6ICJ0ZXh0L3gtcGFzY2FsIiwgbW9kZTogInBhc2NhbCIsIGV4dDogWyJwIiwgInBhcyJdfSwKICAgIHtuYW1lOiAiUEVHLmpzIiwgbWltZTogIm51bGwiLCBtb2RlOiAicGVnanMiLCBleHQ6IFsianNvbmxkIl19LAogICAge25hbWU6ICJQZXJsIiwgbWltZTogInRleHQveC1wZXJsIiwgbW9kZTogInBlcmwiLCBleHQ6IFsicGwiLCAicG0iXX0sCiAgICB7bmFtZTogIlBIUCIsIG1pbWU6ICJhcHBsaWNhdGlvbi94LWh0dHBkLXBocCIsIG1vZGU6ICJwaHAiLCBleHQ6IFsicGhwIiwgInBocDMiLCAicGhwNCIsICJwaHA1IiwgInBodG1sIl19LAogICAge25hbWU6ICJQaWciLCBtaW1lOiAidGV4dC94LXBpZyIsIG1vZGU6ICJwaWciLCBleHQ6IFsicGlnIl19LAogICAge25hbWU6ICJQbGFpbiBUZXh0IiwgbWltZTogInRleHQvcGxhaW4iLCBtb2RlOiAibnVsbCIsIGV4dDogWyJ0eHQiLCAidGV4dCIsICJjb25mIiwgImRlZiIsICJsaXN0IiwgImxvZyJdfSwKICAgIHtuYW1lOiAiUExTUUwiLCBtaW1lOiAidGV4dC94LXBsc3FsIiwgbW9kZTogInNxbCIsIGV4dDogWyJwbHMiXX0sCiAgICB7bmFtZTogIlBvd2VyU2hlbGwiLCBtaW1lOiAiYXBwbGljYXRpb24veC1wb3dlcnNoZWxsIiwgbW9kZTogInBvd2Vyc2hlbGwiLCBleHQ6IFsicHMxIiwgInBzZDEiLCAicHNtMSJdfSwKICAgIHtuYW1lOiAiUHJvcGVydGllcyBmaWxlcyIsIG1pbWU6ICJ0ZXh0L3gtcHJvcGVydGllcyIsIG1vZGU6ICJwcm9wZXJ0aWVzIiwgZXh0OiBbInByb3BlcnRpZXMiLCAiaW5pIiwgImluIl0sIGFsaWFzOiBbImluaSIsICJwcm9wZXJ0aWVzIl19LAogICAge25hbWU6ICJQcm90b0J1ZiIsIG1pbWU6ICJ0ZXh0L3gtcHJvdG9idWYiLCBtb2RlOiAicHJvdG9idWYiLCBleHQ6IFsicHJvdG8iXX0sCiAgICB7bmFtZTogIlB5dGhvbiIsIG1pbWU6ICJ0ZXh0L3gtcHl0aG9uIiwgbW9kZTogInB5dGhvbiIsIGV4dDogWyJCVUlMRCIsICJiemwiLCAicHkiLCAicHl3Il0sIGZpbGU6IC9eKEJVQ0t8QlVJTEQpJC99LAogICAge25hbWU6ICJQdXBwZXQiLCBtaW1lOiAidGV4dC94LXB1cHBldCIsIG1vZGU6ICJwdXBwZXQiLCBleHQ6IFsicHAiXX0sCiAgICB7bmFtZTogIlEiLCBtaW1lOiAidGV4dC94LXEiLCBtb2RlOiAicSIsIGV4dDogWyJxIl19LAogICAge25hbWU6ICJSIiwgbWltZTogInRleHQveC1yc3JjIiwgbW9kZTogInIiLCBleHQ6IFsiciJdLCBhbGlhczogWyJyc2NyaXB0Il19LAogICAge25hbWU6ICJyZVN0cnVjdHVyZWRUZXh0IiwgbWltZTogInRleHQveC1yc3QiLCBtb2RlOiAicnN0IiwgZXh0OiBbInJzdCJdLCBhbGlhczogWyJyc3QiXX0sCiAgICB7bmFtZTogIlJQTSBDaGFuZ2VzIiwgbWltZTogInRleHQveC1ycG0tY2hhbmdlcyIsIG1vZGU6ICJycG0ifSwKICAgIHtuYW1lOiAiUlBNIFNwZWMiLCBtaW1lOiAidGV4dC94LXJwbS1zcGVjIiwgbW9kZTogInJwbSIsIGV4dDogWyJzcGVjIl19LAogICAge25hbWU6ICJSdWJ5IiwgbWltZTogInRleHQveC1ydWJ5IiwgbW9kZTogInJ1YnkiLCBleHQ6IFsicmIiXSwgYWxpYXM6IFsianJ1YnkiLCAibWFjcnVieSIsICJyYWtlIiwgInJiIiwgInJieCJdfSwKICAgIHtuYW1lOiAiUnVzdCIsIG1pbWU6ICJ0ZXh0L3gtcnVzdHNyYyIsIG1vZGU6ICJydXN0IiwgZXh0OiBbInJzIl19LAogICAge25hbWU6ICJTQVMiLCBtaW1lOiAidGV4dC94LXNhcyIsIG1vZGU6ICJzYXMiLCBleHQ6IFsic2FzIl19LAogICAge25hbWU6ICJTYXNzIiwgbWltZTogInRleHQveC1zYXNzIiwgbW9kZTogInNhc3MiLCBleHQ6IFsic2FzcyJdfSwKICAgIHtuYW1lOiAiU2NhbGEiLCBtaW1lOiAidGV4dC94LXNjYWxhIiwgbW9kZTogImNsaWtlIiwgZXh0OiBbInNjYWxhIl19LAogICAge25hbWU6ICJTY2hlbWUiLCBtaW1lOiAidGV4dC94LXNjaGVtZSIsIG1vZGU6ICJzY2hlbWUiLCBleHQ6IFsic2NtIiwgInNzIl19LAogICAge25hbWU6ICJTQ1NTIiwgbWltZTogInRleHQveC1zY3NzIiwgbW9kZTogImNzcyIsIGV4dDogWyJzY3NzIl19LAogICAge25hbWU6ICJTaGVsbCIsIG1pbWU6ICJ0ZXh0L3gtc2giLCBtb2RlOiAic2hlbGwiLCBleHQ6IFsic2giLCAia3NoIiwgImJhc2giXSwgYWxpYXM6IFsiYmFzaCIsICJzaCIsICJ6c2giXSwgZmlsZTogL15QS0dCVUlMRCQvfSwKICAgIHtuYW1lOiAiU2lldmUiLCBtaW1lOiAiYXBwbGljYXRpb24vc2lldmUiLCBtb2RlOiAic2lldmUiLCBleHQ6IFsic2l2IiwgInNpZXZlIl19LAogICAge25hbWU6ICJTbGltIiwgbWltZXM6IFsidGV4dC94LXNsaW0iLCAiYXBwbGljYXRpb24veC1zbGltIl0sIG1vZGU6ICJzbGltIiwgZXh0OiBbInNsaW0iXX0sCiAgICB7bmFtZTogIlNtYWxsdGFsayIsIG1pbWU6ICJ0ZXh0L3gtc3RzcmMiLCBtb2RlOiAic21hbGx0YWxrIiwgZXh0OiBbInN0Il19LAogICAge25hbWU6ICJTbWFydHkiLCBtaW1lOiAidGV4dC94LXNtYXJ0eSIsIG1vZGU6ICJzbWFydHkiLCBleHQ6IFsidHBsIl19LAogICAge25hbWU6ICJTb2xyIiwgbWltZTogInRleHQveC1zb2xyIiwgbW9kZTogInNvbHIifSwKICAgIHtuYW1lOiAiU295IiwgbWltZTogInRleHQveC1zb3kiLCBtb2RlOiAic295IiwgZXh0OiBbInNveSJdLCBhbGlhczogWyJjbG9zdXJlIHRlbXBsYXRlIl19LAogICAge25hbWU6ICJTUEFSUUwiLCBtaW1lOiAiYXBwbGljYXRpb24vc3BhcnFsLXF1ZXJ5IiwgbW9kZTogInNwYXJxbCIsIGV4dDogWyJycSIsICJzcGFycWwiXSwgYWxpYXM6IFsic3BhcnVsIl19LAogICAge25hbWU6ICJTcHJlYWRzaGVldCIsIG1pbWU6ICJ0ZXh0L3gtc3ByZWFkc2hlZXQiLCBtb2RlOiAic3ByZWFkc2hlZXQiLCBhbGlhczogWyJleGNlbCIsICJmb3JtdWxhIl19LAogICAge25hbWU6ICJTUUwiLCBtaW1lOiAidGV4dC94LXNxbCIsIG1vZGU6ICJzcWwiLCBleHQ6IFsic3FsIl19LAogICAge25hbWU6ICJTcXVpcnJlbCIsIG1pbWU6ICJ0ZXh0L3gtc3F1aXJyZWwiLCBtb2RlOiAiY2xpa2UiLCBleHQ6IFsibnV0Il19LAogICAge25hbWU6ICJTdHlsdXMiLCBtaW1lOiAidGV4dC94LXN0eWwiLCBtb2RlOiAic3R5bHVzIiwgZXh0OiBbInN0eWwiXX0sCiAgICB7bmFtZTogIlN3aWZ0IiwgbWltZTogInRleHQveC1zd2lmdCIsIG1vZGU6ICJzd2lmdCIsIGV4dDogWyJzd2lmdCJdfSwKICAgIHtuYW1lOiAic1RlWCIsIG1pbWU6ICJ0ZXh0L3gtc3RleCIsIG1vZGU6ICJzdGV4In0sCiAgICB7bmFtZTogIkxhVGVYIiwgbWltZTogInRleHQveC1sYXRleCIsIG1vZGU6ICJzdGV4IiwgZXh0OiBbInRleHQiLCAibHR4Il0sIGFsaWFzOiBbInRleCJdfSwKICAgIHtuYW1lOiAiU3lzdGVtVmVyaWxvZyIsIG1pbWU6ICJ0ZXh0L3gtc3lzdGVtdmVyaWxvZyIsIG1vZGU6ICJ2ZXJpbG9nIiwgZXh0OiBbInYiXX0sCiAgICB7bmFtZTogIlRjbCIsIG1pbWU6ICJ0ZXh0L3gtdGNsIiwgbW9kZTogInRjbCIsIGV4dDogWyJ0Y2wiXX0sCiAgICB7bmFtZTogIlRleHRpbGUiLCBtaW1lOiAidGV4dC94LXRleHRpbGUiLCBtb2RlOiAidGV4dGlsZSIsIGV4dDogWyJ0ZXh0aWxlIl19LAogICAge25hbWU6ICJUaWRkbHlXaWtpICIsIG1pbWU6ICJ0ZXh0L3gtdGlkZGx5d2lraSIsIG1vZGU6ICJ0aWRkbHl3aWtpIn0sCiAgICB7bmFtZTogIlRpa2kgd2lraSIsIG1pbWU6ICJ0ZXh0L3Rpa2kiLCBtb2RlOiAidGlraSJ9LAogICAge25hbWU6ICJUT01MIiwgbWltZTogInRleHQveC10b21sIiwgbW9kZTogInRvbWwiLCBleHQ6IFsidG9tbCJdfSwKICAgIHtuYW1lOiAiVG9ybmFkbyIsIG1pbWU6ICJ0ZXh0L3gtdG9ybmFkbyIsIG1vZGU6ICJ0b3JuYWRvIn0sCiAgICB7bmFtZTogInRyb2ZmIiwgbWltZTogInRleHQvdHJvZmYiLCBtb2RlOiAidHJvZmYiLCBleHQ6IFsiMSIsICIyIiwgIjMiLCAiNCIsICI1IiwgIjYiLCAiNyIsICI4IiwgIjkiXX0sCiAgICB7bmFtZTogIlRUQ04iLCBtaW1lOiAidGV4dC94LXR0Y24iLCBtb2RlOiAidHRjbiIsIGV4dDogWyJ0dGNuIiwgInR0Y24zIiwgInR0Y25wcCJdfSwKICAgIHtuYW1lOiAiVFRDTl9DRkciLCBtaW1lOiAidGV4dC94LXR0Y24tY2ZnIiwgbW9kZTogInR0Y24tY2ZnIiwgZXh0OiBbImNmZyJdfSwKICAgIHtuYW1lOiAiVHVydGxlIiwgbWltZTogInRleHQvdHVydGxlIiwgbW9kZTogInR1cnRsZSIsIGV4dDogWyJ0dGwiXX0sCiAgICB7bmFtZTogIlR5cGVTY3JpcHQiLCBtaW1lOiAiYXBwbGljYXRpb24vdHlwZXNjcmlwdCIsIG1vZGU6ICJqYXZhc2NyaXB0IiwgZXh0OiBbInRzIl0sIGFsaWFzOiBbInRzIl19LAogICAge25hbWU6ICJUd2lnIiwgbWltZTogInRleHQveC10d2lnIiwgbW9kZTogInR3aWcifSwKICAgIHtuYW1lOiAiV2ViIElETCIsIG1pbWU6ICJ0ZXh0L3gtd2ViaWRsIiwgbW9kZTogIndlYmlkbCIsIGV4dDogWyJ3ZWJpZGwiXX0sCiAgICB7bmFtZTogIlZCLk5FVCIsIG1pbWU6ICJ0ZXh0L3gtdmIiLCBtb2RlOiAidmIiLCBleHQ6IFsidmIiXX0sCiAgICB7bmFtZTogIlZCU2NyaXB0IiwgbWltZTogInRleHQvdmJzY3JpcHQiLCBtb2RlOiAidmJzY3JpcHQiLCBleHQ6IFsidmJzIl19LAogICAge25hbWU6ICJWZWxvY2l0eSIsIG1pbWU6ICJ0ZXh0L3ZlbG9jaXR5IiwgbW9kZTogInZlbG9jaXR5IiwgZXh0OiBbInZ0bCJdfSwKICAgIHtuYW1lOiAiVmVyaWxvZyIsIG1pbWU6ICJ0ZXh0L3gtdmVyaWxvZyIsIG1vZGU6ICJ2ZXJpbG9nIiwgZXh0OiBbInYiXX0sCiAgICB7bmFtZTogIlZIREwiLCBtaW1lOiAidGV4dC94LXZoZGwiLCBtb2RlOiAidmhkbCIsIGV4dDogWyJ2aGQiLCAidmhkbCJdfSwKICAgIHtuYW1lOiAiWE1MIiwgbWltZXM6IFsiYXBwbGljYXRpb24veG1sIiwgInRleHQveG1sIl0sIG1vZGU6ICJ4bWwiLCBleHQ6IFsieG1sIiwgInhzbCIsICJ4c2QiXSwgYWxpYXM6IFsicnNzIiwgIndzZGwiLCAieHNkIl19LAogICAge25hbWU6ICJYUXVlcnkiLCBtaW1lOiAiYXBwbGljYXRpb24veHF1ZXJ5IiwgbW9kZTogInhxdWVyeSIsIGV4dDogWyJ4eSIsICJ4cXVlcnkiXX0sCiAgICB7bmFtZTogIllhY2FzIiwgbWltZTogInRleHQveC15YWNhcyIsIG1vZGU6ICJ5YWNhcyIsIGV4dDogWyJ5cyJdfSwKICAgIHtuYW1lOiAiWUFNTCIsIG1pbWU6ICJ0ZXh0L3gteWFtbCIsIG1vZGU6ICJ5YW1sIiwgZXh0OiBbInlhbWwiLCAieW1sIl0sIGFsaWFzOiBbInltbCJdfSwKICAgIHtuYW1lOiAiWjgwIiwgbWltZTogInRleHQveC16ODAiLCBtb2RlOiAiejgwIiwgZXh0OiBbIno4MCJdfSwKICAgIHtuYW1lOiAibXNjZ2VuIiwgbWltZTogInRleHQveC1tc2NnZW4iLCBtb2RlOiAibXNjZ2VuIiwgZXh0OiBbIm1zY2dlbiIsICJtc2NpbiIsICJtc2MiXX0sCiAgICB7bmFtZTogInh1IiwgbWltZTogInRleHQveC14dSIsIG1vZGU6ICJtc2NnZW4iLCBleHQ6IFsieHUiXX0sCiAgICB7bmFtZTogIm1zZ2VubnkiLCBtaW1lOiAidGV4dC94LW1zZ2VubnkiLCBtb2RlOiAibXNjZ2VuIiwgZXh0OiBbIm1zZ2VubnkiXX0KICBdOwogIC8vIEVuc3VyZSBhbGwgbW9kZXMgaGF2ZSBhIG1pbWUgcHJvcGVydHkgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBDb2RlTWlycm9yLm1vZGVJbmZvLmxlbmd0aDsgaSsrKSB7CiAgICB2YXIgaW5mbyA9IENvZGVNaXJyb3IubW9kZUluZm9baV07CiAgICBpZiAoaW5mby5taW1lcykgaW5mby5taW1lID0gaW5mby5taW1lc1swXTsKICB9CgogIENvZGVNaXJyb3IuZmluZE1vZGVCeU1JTUUgPSBmdW5jdGlvbihtaW1lKSB7CiAgICBtaW1lID0gbWltZS50b0xvd2VyQ2FzZSgpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBDb2RlTWlycm9yLm1vZGVJbmZvLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBpbmZvID0gQ29kZU1pcnJvci5tb2RlSW5mb1tpXTsKICAgICAgaWYgKGluZm8ubWltZSA9PSBtaW1lKSByZXR1cm4gaW5mbzsKICAgICAgaWYgKGluZm8ubWltZXMpIGZvciAodmFyIGogPSAwOyBqIDwgaW5mby5taW1lcy5sZW5ndGg7IGorKykKICAgICAgICBpZiAoaW5mby5taW1lc1tqXSA9PSBtaW1lKSByZXR1cm4gaW5mbzsKICAgIH0KICB9OwoKICBDb2RlTWlycm9yLmZpbmRNb2RlQnlFeHRlbnNpb24gPSBmdW5jdGlvbihleHQpIHsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgQ29kZU1pcnJvci5tb2RlSW5mby5sZW5ndGg7IGkrKykgewogICAgICB2YXIgaW5mbyA9IENvZGVNaXJyb3IubW9kZUluZm9baV07CiAgICAgIGlmIChpbmZvLmV4dCkgZm9yICh2YXIgaiA9IDA7IGogPCBpbmZvLmV4dC5sZW5ndGg7IGorKykKICAgICAgICBpZiAoaW5mby5leHRbal0gPT0gZXh0KSByZXR1cm4gaW5mbzsKICAgIH0KICB9OwoKICBDb2RlTWlycm9yLmZpbmRNb2RlQnlGaWxlTmFtZSA9IGZ1bmN0aW9uKGZpbGVuYW1lKSB7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IENvZGVNaXJyb3IubW9kZUluZm8ubGVuZ3RoOyBpKyspIHsKICAgICAgdmFyIGluZm8gPSBDb2RlTWlycm9yLm1vZGVJbmZvW2ldOwogICAgICBpZiAoaW5mby5maWxlICYmIGluZm8uZmlsZS50ZXN0KGZpbGVuYW1lKSkgcmV0dXJuIGluZm87CiAgICB9CiAgICB2YXIgZG90ID0gZmlsZW5hbWUubGFzdEluZGV4T2YoIi4iKTsKICAgIHZhciBleHQgPSBkb3QgPiAtMSAmJiBmaWxlbmFtZS5zdWJzdHJpbmcoZG90ICsgMSwgZmlsZW5hbWUubGVuZ3RoKTsKICAgIGlmIChleHQpIHJldHVybiBDb2RlTWlycm9yLmZpbmRNb2RlQnlFeHRlbnNpb24oZXh0KTsKICB9OwoKICBDb2RlTWlycm9yLmZpbmRNb2RlQnlOYW1lID0gZnVuY3Rpb24obmFtZSkgewogICAgbmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgQ29kZU1pcnJvci5tb2RlSW5mby5sZW5ndGg7IGkrKykgewogICAgICB2YXIgaW5mbyA9IENvZGVNaXJyb3IubW9kZUluZm9baV07CiAgICAgIGlmIChpbmZvLm5hbWUudG9Mb3dlckNhc2UoKSA9PSBuYW1lKSByZXR1cm4gaW5mbzsKICAgICAgaWYgKGluZm8uYWxpYXMpIGZvciAodmFyIGogPSAwOyBqIDwgaW5mby5hbGlhcy5sZW5ndGg7IGorKykKICAgICAgICBpZiAoaW5mby5hbGlhc1tqXS50b0xvd2VyQ2FzZSgpID09IG5hbWUpIHJldHVybiBpbmZvOwogICAgfQogIH07Cn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/mirc/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/mirc/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogbUlSQyBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi90aGVtZS90d2lsaWdodC5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0ibWlyYy5qcyI+PC9zY3JpcHQ+CjxzdHlsZT4uQ29kZU1pcnJvciB7Ym9yZGVyOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGgxPkNvZGVNaXJyb3I8L2gxPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5tSVJDPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5tSVJDIG1vZGU8L2gyPgo8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgo7QUtBIE5pY2sgVHJhY2tlciBieSBGb3JkX0xhd25tb3dlciBpcmMuR2Vla1NoZWQubmV0ICNTY3JpcHQtSGVscAo7KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKio7CjsqKlN0YXJ0IFNldHVwCjtDaGFuZ2UgSm9pbkRpc3BsYXksIGJlbG93LCBmb3IgT24gSm9pbiBBS0EgRGlzcGxheS4gT24gPSAxIC0gT2ZmID0gMAphbGlhcyAtbCBKb2luRGlzcGxheSB7IHJldHVybiAxIH0KO0NoYW5nZSBNYXhOaWNrcywgYmVsb3csIHRvIHRoZSBudW1iZXIgb2Ygbmlja25hbWVzIHlvdSB3YW50IHRvIHN0b3JlIGZvciBlYWNoIGhvc3RtYXNrLiBJIHdvdWxkbid0IGdvIG92ZXIgNDAwIHdpdGggdGhpcyA7LwphbGlhcyAtbCBNYXhOaWNrcyB7IHJldHVybiAyMCB9CjtDaGFuZ2UgQUtBTG9nbywgYmVsb3csIFRvIHRoZSB0ZXh0IHlvdSB3YW50IGRpc3BsYXllZCBiZWZvcmUgZWFjaCBBS0EgcmVzdWx0LgphbGlhcyAtbCBBS0FMb2dvIHsgcmV0dXJuIAMwNgcgAzA1QQMwNksDMDdBIAMwNgcgfQo7KipFbmQgU2V0dXAKOyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqOwpPbiAqOkpvaW46IzogewogIGlmICgkbmljayA9PSAkbWUpIHsgLnRpbWVyIDEgMSBpYWx1cGRhdGVDaGVjayAkY2hhbiB9CiAgTmlja05hbWVzQWRkICRuaWNrICQrKCRuZXR3b3JrLCR3aWxkc2l0ZSkKICBpZiAoJEpvaW5EaXNwbGF5KSB7IC50aW1lck5pY2tOYW1lcyAkKyAkbmljayAxIDIgTmlja05hbWVzLmRpc3BsYXkgJG5pY2sgJGNoYW4gJG5ldHdvcmsgJHdpbGRzaXRlIH0KfQpvbiAqOk5pY2s6IHsgTmlja05hbWVzQWRkICRuZXduaWNrICQrKCRuZXR3b3JrLCR3aWxkc2l0ZSkgJG5pY2sgfQphbGlhcyAtbCBOaWNrTmFtZXMuZGlzcGxheSB7CiAgaWYgKCRnZXR0b2soJGhnZXQoTmlja05hbWVzLCQrKCQzLCQ0KSksMCwxMjYpID4gMSkgewogICAgZWNobyAtZyAkMiAkQUtBTG9nbyAkKygDMDksJDEpICRBS0FMb2dvIAMwNyAkbWlkKCRyZXBsYWNlKCRoZ2V0KE5pY2tOYW1lcywkKygkMywkNCkpLCRjaHIoMTI2KSwkY2hyKDQ0KSksMiwtMSkKICB9Cn0KYWxpYXMgLWwgTmlja05hbWVzQWRkIHsKICBpZiAoJGhnZXQoTmlja05hbWVzLCQyKSkgewogICAgaWYgKCEkcmVnZXgoJGhnZXQoTmlja05hbWVzLCQyKSwvflxRICQrICRyZXBsYWNlY3MoJDEsXEUsXEVcXEVcUSkgJCsgXEV+L2kpKSB7CiAgICAgIGlmICgkZ2V0dG9rKCRoZ2V0KE5pY2tOYW1lcywkMiksMCwxMjYpIDw9ICRNYXhOaWNrcykgewogICAgICAgIGhhZGQgTmlja05hbWVzICQyICQrKCRoZ2V0KE5pY2tOYW1lcywkMiksJDEsfikKICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICBoYWRkIE5pY2tOYW1lcyAkMiAkKygkbWlkKCRoZ2V0KE5pY2tOYW1lcywkMiksJHBvcygkaGdldChOaWNrTmFtZXMsJDIpLH4sMikpLCQxLH4pCiAgICAgIH0KICAgIH0KICB9CiAgZWxzZSB7CiAgICBoYWRkIC1tIE5pY2tOYW1lcyAkMiAkKyh+LCQxLH4sJGlpZigkMywkKygkMyx+KSkpCiAgfQp9CmFsaWFzIC1sIEZpeC5BbGwuTWluZFVzZXIgewogIHZhciAlRml4LkNvdW50ID0gJGhmaW5kKE5pY2tOYW1lcywvW15+XStbMC05XXs0fX4vLDAscikuZGF0YQogIHdoaWxlICglRml4LkNvdW50KSB7CiAgICBpZiAoJEZpeC5NaW5kVXNlcigkaGdldChOaWNrTmFtZXMsJGhmaW5kKE5pY2tOYW1lcywvW15+XStbMC05XXs0fX4vLCVGaXguQ291bnQscikuZGF0YSkpKSB7CiAgICAgIGVjaG8gLWFnIFJlY29yZCAlRml4LkNvdW50IC0gJHYxIC0gV2FzIENsZWFuZWQKICAgICAgaGFkZCBOaWNrTmFtZXMgJGhmaW5kKE5pY2tOYW1lcywvW15+XStbMC05XXs0fX4vLCVGaXguQ291bnQscikuZGF0YSAkdjEKICAgIH0KICAgIGRlYyAlRml4LkNvdW50CiAgfQp9CmFsaWFzIC1sIEZpeC5NaW5kVXNlciB7IHJldHVybiAkcmVnc3ViZXgoJDEsL1tefl0rWzAtOV17NH1+L2csJG51bGwpIH0KbWVudSBuaWNrbGlzdCxxdWVyeSB7CiAgLQogIC5BS0EKICAuLkNoZWNrICQkMTogewogICAgaWYgKCRnZXR0b2soJGhnZXQoTmlja05hbWVzLCQrKCRuZXR3b3JrLCRhZGRyZXNzKCQxLDIpKSksMCwxMjYpID4gMSkgewogICAgICBOaWNrTmFtZXMuZGlzcGxheSAkMSAkYWN0aXZlICRuZXR3b3JrICRhZGRyZXNzKCQxLDIpCiAgICB9CiAgICBlbHNlIHsgZWNobyAtYWcgJEFLQUxvZ28gJCsoAzA5LCQxKSADMDdoYXMgbm90IGJlZW4ga25vd24gYnkgYW55IG90aGVyIG5pY2tuYW1lcyB3aGlsZSBJIGhhdmUgYmVlbiB3YXRjaGluZy4gfQogIH0KICAuLkNsZWFudXAgJCQxOmhhZGQgTmlja05hbWVzICQrKCRuZXR3b3JrLCRhZGRyZXNzKCQxLDIpKSAkZml4Lm1pbmR1c2VyKCRoZ2V0KE5pY2tOYW1lcywkKygkbmV0d29yaywkYWRkcmVzcygkMSwyKSkpKQogIC4uQ2xlYXIgJCQxOmhhZGQgTmlja05hbWVzICQrKCRuZXR3b3JrLCRhZGRyZXNzKCQxLDIpKSAkKyh+LCQxLH4pCiAgLi5BS0EgU2VhcmNoIERpYWxvZzpkaWFsb2cgJGlpZigkZGlhbG9nKEFLQV9TZWFyY2gpLC12LC1tKSBBS0FfU2VhcmNoIEFLQV9TZWFyY2gKICAtCn0KbWVudSBzdGF0dXMsY2hhbm5lbCB7CiAgLQogIC5BS0EKICAuLkFLQSBTZWFyY2ggRGlhbG9nOmRpYWxvZyAkaWlmKCRkaWFsb2coQUtBX1NlYXJjaCksLXYsLW0pIEFLQV9TZWFyY2ggQUtBX1NlYXJjaAogIC4uQ2xlYW4gQWxsIFJlY29yZHM6Rml4LkFsbC5NaW5kdXNlcgogIC0KfQpkaWFsb2cgQUtBX1NlYXJjaCB7CiAgdGl0bGUgIkFLQSBTZWFyY2ggRW5naW5lIgogIHNpemUgLTEgLTEgMjA2IDIyMQogIG9wdGlvbiBkYnUKICBlZGl0ICIiLCAxLCA4IDUgMTQ5IDEwLCBhdXRvaHMKICBidXR0b24gIlNlYXJjaCIsIDIsIDE2MyA0IDMyIDEyCiAgcmFkaW8gIlNlYXJjaCBIb3N0TWFzayIsIDQsIDYxIDIyIDU1IDEwCiAgcmFkaW8gIlNlYXJjaCBOaWNrbmFtZXMiLCA1LCAxMjMgMjIgNTYgMTAKICBsaXN0IDYsIDggMzggMTkwIDE2OSwgc29ydCBleHRzZWwgdnNiYXIKICBidXR0b24gIkNoZWNrIFNlbGVjdGVkIiwgNywgNjcgMjA2IDQwIDEyCiAgYnV0dG9uICJDbG9zZSIsIDgsIDE2MCAyMDYgMzggMTIsIGNhbmNlbAogIGJveCAiU2VhcmNoIFR5cGUiLCAzLCAxMSAxNyAxODMgMTgKICBidXR0b24gIkNvcHkgdG8gQ2xpcGJvYXJkIiwgOSwgMTExIDIwNiA0NiAxMgp9Ck9uICo6RGlhbG9nOkFrYV9TZWFyY2g6aW5pdDoqOiB7IGRpZCAtYyAkZG5hbWUgNSB9Ck9uICo6RGlhbG9nOkFrYV9TZWFyY2g6U2NsaWNrOjIsNyw5OiB7CiAgaWYgKCRkaWQgPT0gMikgJiYgKCRkaWQoJGRuYW1lLDEpKSB7CiAgICBkaWQgLXIgJGRuYW1lIDYKICAgIHZhciAlc2VhcmNoICQrKCosJHYxLCopLCAldHlwZSAkaWlmKCRkaWQoJGRuYW1lLDUpLnN0YXRlLGRhdGEsaXRlbSksICVtYXRjaGVzID0gJGhmaW5kKE5pY2tOYW1lcywlc2VhcmNoLDAsdykuIFsgJCsgWyAldHlwZSBdIF0KICAgIHdoaWxlICglbWF0Y2hlcykgewogICAgICBkaWQgLWEgJGRuYW1lIDYgJGhmaW5kKE5pY2tOYW1lcywlc2VhcmNoLCVtYXRjaGVzLHcpLiBbICQrIFsgJXR5cGUgXSBdCiAgICAgIGRlYyAlbWF0Y2hlcwogICAgfQogICAgZGlkIC1jICRkbmFtZSA2IDEKICB9CiAgZWxzZWlmICgkZGlkID09IDcpICYmICgkZGlkKCRkbmFtZSw2KS5zZWx0ZXh0KSB7IGVjaG8gLWdhICRBS0FMb2dvIAMwNyAkbWlkKCRyZXBsYWNlKCRoZ2V0KE5pY2tOYW1lcywkdjEpLCRjaHIoMTI2KSwkY2hyKDQ0KSksMiwtMSkgfQogIGVsc2VpZiAoJGRpZCA9PSA5KSAmJiAoJGRpZCgkZG5hbWUsNikuc2VsdGV4dCkgeyBjbGlwYm9hcmQgJG1pZCgkdjEsJHBvcygkdjEsKiwxKSkgfQp9Ck9uICo6U3RhcnQ6ewogIGlmICghJGhnZXQoTmlja05hbWVzKSkgeyBobWFrZSBOaWNrTmFtZXMgMTAgfQogIGlmICgkaXNmaWxlKE5pY2tOYW1lcy5oc2gpKSB7IGhsb2FkICBOaWNrTmFtZXMgTmlja05hbWVzLmhzaCB9Cn0KT24gKjpFeGl0OiB7IGlmICgkaGdldChOaWNrTmFtZXMpKSB7IGhzYXZlIE5pY2tOYW1lcyBOaWNrTmFtZXMuaHNoIH0gfQpPbiAqOkRpc2Nvbm5lY3Q6IHsgaWYgKCRoZ2V0KE5pY2tOYW1lcykpIHsgaHNhdmUgTmlja05hbWVzIE5pY2tOYW1lcy5oc2ggfSB9Ck9uICo6VW5sb2FkOiB7IGhmcmVlIE5pY2tOYW1lcyB9CmFsaWFzIC1sIGlhbHVwZGF0ZUNoZWNrIHsKICBpbmMgLXogJCsoJSxpYWx1cGRhdGVDaGVjaywkbmV0d29yaykgJGNhbGMoJG5pY2soJDEsMCkgLyA0KQogIDtJZiB5b3VyIGlhbCBpcyBhbHJlYWR5IGJlaW5nIHVwZGF0ZWQgb24gam9pbiAud2hvICQxIG91dC4KICA7SWYgeW91IGFyZSB1c2luZyAvbmFtZXMgdG8gdXBkYXRlIGlhbCB5b3Ugd2lsbCBzdGlsbCBuZWVkIHRoaXMgbGluZS4KICAud2hvICQxCn0KUmF3IDM1MjoqOiB7CiAgaWYgKCQoJCsoJSxpYWx1cGRhdGVDaGVjaywkbmV0d29yayksMikpIGhhbHRkZWYKICBOaWNrTmFtZXNBZGQgJDYgJCsoJG5ldHdvcmssJGFkZHJlc3MoJDYsMikpCn0KUmF3IDMxNToqOiB7CiAgaWYgKCQoJCsoJSxpYWx1cGRhdGVDaGVjaywkbmV0d29yayksMikpIGhhbHRkZWYKfQoKPC90ZXh0YXJlYT48L2Zvcm0+CiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgICAgIHRoZW1lOiAidHdpbGlnaHQiLAogICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgICAgIG1hdGNoQnJhY2tldHM6IHRydWUsCiAgICAgICAgaW5kZW50VW5pdDogNCwKICAgICAgICBtb2RlOiAidGV4dC9taXJjIgogICAgICB9KTsKICAgIDwvc2NyaXB0PgoKICAgIDxwPjxzdHJvbmc+TUlNRSB0eXBlcyBkZWZpbmVkOjwvc3Ryb25nPiA8Y29kZT50ZXh0L21pcmM8L2NvZGU+LjwvcD4KCiAgPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/mirc/mirc.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovL21JUkMgbW9kZSBieSBGb3JkX0xhd25tb3dlciA6OiBCYXNlZCBvbiBWZWxvY2l0eSBtb2RlIGJ5IFN0ZXZlIE8nSGFyYQoKKGZ1bmN0aW9uKG1vZCkgewogIGlmICh0eXBlb2YgZXhwb3J0cyA9PSAib2JqZWN0IiAmJiB0eXBlb2YgbW9kdWxlID09ICJvYmplY3QiKSAvLyBDb21tb25KUwogICAgbW9kKHJlcXVpcmUoIi4uLy4uL2xpYi9jb2RlbWlycm9yIikpOwogIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kKSAvLyBBTUQKICAgIGRlZmluZShbIi4uLy4uL2xpYi9jb2RlbWlycm9yIl0sIG1vZCk7CiAgZWxzZSAvLyBQbGFpbiBicm93c2VyIGVudgogICAgbW9kKENvZGVNaXJyb3IpOwp9KShmdW5jdGlvbihDb2RlTWlycm9yKSB7CiJ1c2Ugc3RyaWN0IjsKCkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC9taXJjIiwgIm1pcmMiKTsKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJtaXJjIiwgZnVuY3Rpb24oKSB7CiAgZnVuY3Rpb24gcGFyc2VXb3JkcyhzdHIpIHsKICAgIHZhciBvYmogPSB7fSwgd29yZHMgPSBzdHIuc3BsaXQoIiAiKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgd29yZHMubGVuZ3RoOyArK2kpIG9ialt3b3Jkc1tpXV0gPSB0cnVlOwogICAgcmV0dXJuIG9iajsKICB9CiAgdmFyIHNwZWNpYWxzID0gcGFyc2VXb3JkcygiJCEgJCQgJCYgJD8gJCsgJGFib29rICRhYnMgJGFjdGl2ZSAkYWN0aXZlY2lkICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIiRhY3RpdmV3aWQgJGFkZHJlc3MgJGFkZHRvayAkYWdlbnQgJGFnZW50bmFtZSAkYWdlbnRzdGF0ICRhZ2VudHZlciAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICIkYWxpYXMgJGFuZCAkYW5pY2sgJGFuc2kybWlyYyAkYW9wICRhcHBhY3RpdmUgJGFwcHN0YXRlICRhc2MgJGFzY3RpbWUgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJGFzaW4gJGF0YW4gJGF2b2ljZSAkYXdheSAkYXdheW1zZyAkYXdheXRpbWUgJGJhbm1hc2sgJGJhc2UgJGJmaW5kICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIiRiaW5vZmYgJGJpdG9uICRibmljayAkYnZhciAkYnl0ZXMgJGNhbGMgJGNiICRjZCAkY2VpbCAkY2hhbiAkY2hhbm1vZGVzICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIiRjaGFudHlwZXMgJGNoYXQgJGNociAkY2lkICRjbGV2ZWwgJGNsaWNrICRjbWRib3ggJGNtZGxpbmUgJGNuaWNrICRjb2xvciAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICIkY29tICRjb21jYWxsICRjb21jaGFuICRjb21lcnIgJGNvbXBhY3QgJGNvbXByZXNzICRjb212YWwgJGNvcyAkY291bnQgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJGNyICRjcmMgJGNyZXEgJGNybGYgJGN0aW1lICRjdGltZXIgJGN0cmxlbnRlciAkZGF0ZSAkZGF5ICRkYXlsaWdodCAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICIkZGJ1aCAkZGJ1dyAkZGNjaWdub3JlICRkY2Nwb3J0ICRkZGUgJGRkZW5hbWUgJGRlYnVnICRkZWNvZGUgJGRlY29tcHJlc3MgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJGRlbHRvayAkZGV2ZW50ICRkaWFsb2cgJGRpZCAkZGlkcmVnICRkaWR0b2sgJGRpZHdtICRkaXNrICRkbGV2ZWwgJGRsbCAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICIkZGxsY2FsbCAkZG5hbWUgJGRucyAkZHVyYXRpb24gJGViZWVwcyAkZWRpdGJveCAkZW1haWxhZGRyICRlbmNvZGUgJGVycm9yICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIiRldmFsICRldmVudCAkZXhpc3QgJGZlb2YgJGZlcnIgJGZnZXRjICRmaWxlICRmaWxlbmFtZSAkZmlsdGVyZWQgJGZpbmRkaXIgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJGZpbmRkaXJuICRmaW5kZmlsZSAkZmluZGZpbGVuICRmaW5kdG9rICRmbGluZSAkZmxvb3IgJGZvcGVuICRmcmVhZCAkZnNlcnZlICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIiRmdWxsYWRkcmVzcyAkZnVsbGRhdGUgJGZ1bGxuYW1lICRmdWxsc2NyZWVuICRnZXQgJGdldGRpciAkZ2V0ZG90ICRnZXR0b2sgJGdtdCAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICIkZ3JvdXAgJGhhbHRlZCAkaGFzaCAkaGVpZ2h0ICRoZmluZCAkaGdldCAkaGlnaGxpZ2h0ICRobmljayAkaG90bGluZSAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICIkaG90bGluZXBvcyAkaWFsICRpYWxjaGFuICRpYmwgJGlkbGUgJGllbCAkaWZtYXRjaCAkaWdub3JlICRpaWYgJGlpbCAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICIkaW5lbGlwc2UgJGluaSAkaW5taWRpICRpbnBhc3RlICRpbnBvbHkgJGlucHV0ICRpbnJlY3QgJGlucm91bmRyZWN0ICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIiRpbnNvbmcgJGluc3RvayAkaW50ICRpbndhdmUgJGlwICRpc2FsaWFzICRpc2JpdCAkaXNkZGUgJGlzZGlyICRpc2ZpbGUgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJGlzaWQgJGlzbG93ZXIgJGlzdG9rICRpc3VwcGVyICRrZXljaGFyICRrZXlycHQgJGtleXZhbCAka25pY2sgJGxhY3RpdmUgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJGxhY3RpdmVjaWQgJGxhY3RpdmV3aWQgJGxlZnQgJGxlbiAkbGV2ZWwgJGxmICRsaW5lICRsaW5lcyAkbGluayAkbG9jayAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICIkbG9jayAkbG9ja2VkICRsb2cgJGxvZ3N0YW1wICRsb2dzdGFtcGZtdCAkbG9uZ2ZuICRsb25naXAgJGxvd2VyICRsdGltZXIgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJG1hZGRyZXNzICRtYXNrICRtYXRjaGtleSAkbWF0Y2h0b2sgJG1kNSAkbWUgJG1lbnUgJG1lbnViYXIgJG1lbnVjb250ZXh0ICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIiRtZW51dHlwZSAkbWlkICRtaWRkaXIgJG1pcmNkaXIgJG1pcmNleGUgJG1pcmNpbmkgJG1rbG9nZm4gJG1uaWNrICRtb2RlICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIiRtb2RlZmlyc3QgJG1vZGVsYXN0ICRtb2Rlc3BsICRtb3VzZSAkbXNmaWxlICRuZXR3b3JrICRuZXduaWNrICRuaWNrICRub2ZpbGUgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJG5vcGF0aCAkbm9xdCAkbm90ICRub3RhZ3MgJG5vdGlmeSAkbnVsbCAkbnVtZXJpYyAkbnVtb2sgJG9saW5lICRvbnBvbHkgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJG9wbmljayAkb3IgJG9yZCAkb3MgJHBhc3NpdmVkY2MgJHBpYyAkcGxheSAkcG5pY2sgJHBvcnQgJHBvcnRhYmxlICRwb3J0ZnJlZSAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICIkcG9zICRwcmVmaXggJHByb3AgJHByb3RlY3QgJHB1dHRvayAkcXQgJHF1ZXJ5ICRyYW5kICRyICRyYXdtc2cgJHJlYWQgJHJlYWRvbW8gIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJHJlYWRuICRyZWdleCAkcmVnbWwgJHJlZ3N1YiAkcmVnc3ViZXggJHJlbW92ZSAkcmVtdG9rICRyZXBsYWNlICRyZXBsYWNleCAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICIkcmVwdG9rICRyZXN1bHQgJHJnYiAkcmlnaHQgJHJvdW5kICRzY2lkICRzY29uICRzY3JpcHQgJHNjcmlwdGRpciAkc2NyaXB0bGluZSAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICIkc2RpciAkc2VuZCAkc2VydmVyICRzZXJ2ZXJpcCAkc2ZpbGUgJHNoYTEgJHNob3J0Zm4gJHNob3cgJHNpZ25hbCAkc2luICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIiRzaXRlICRzbGluZSAkc25pY2sgJHNuaWNrcyAkc25vdGlmeSAkc29jayAkc29ja2JyICRzb2NrZXJyICRzb2NrbmFtZSAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICIkc29ydHRvayAkc291bmQgJHNxcnQgJHNzbCAkc3JlcSAkc3NscmVhZHkgJHN0YXR1cyAkc3RyaXAgJHN0ciAkc3RyaXBwZWQgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJHN5bGUgJHN1Ym1lbnUgJHN3aXRjaGJhciAkdGFuICR0YXJnZXQgJHRpY2tzICR0aW1lICR0aW1lciAkdGltZXN0YW1wICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIiR0aW1lc3RhbXBmbXQgJHRpbWV6b25lICR0aXAgJHRpdGxlYmFyICR0b29sYmFyICR0cmVlYmFyICR0cnVzdCAkdWxldmVsICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIiR1bGlzdCAkdXBwZXIgJHVwdGltZSAkdXJsICR1c2VybW9kZSAkdjEgJHYyICR2YXIgJHZjbWQgJHZjbWRzdGF0ICR2Y21kdmVyICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIiR2ZXJzaW9uICR2bmljayAkdm9sICR3aWQgJHdpZHRoICR3aWxkc2l0ZSAkd2lsZHRvayAkd2luZG93ICR3cmFwICR4b3IiKTsKICB2YXIga2V5d29yZHMgPSBwYXJzZVdvcmRzKCJhYm9vayBhamludml0ZSBhbGlhcyBhbGluZSBhbWUgYW1zZyBhbmljayBhb3AgYXVzZXIgYXV0b2pvaW4gYXZvaWNlICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgImF3YXkgYmFja2dyb3VuZCBiYW4gYmNvcHkgYmVlcCBicmVhZCBicmVhayBicmVwbGFjZSBic2V0IGJ0cnVuYyBidW5zZXQgYndyaXRlICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgImNoYW5uZWwgY2xlYXIgY2xlYXJhbGwgY2xpbmUgY2xpcGJvYXJkIGNsb3NlIGNuaWNrIGNvbG9yIGNvbWNsb3NlIGNvbW9wZW4gIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tcmVnIGNvbnRpbnVlIGNvcHkgY3JlcSBjdGNwcmVwbHkgY3RjcHMgZGNjIGRjY3NlcnZlciBkZGUgZGRlc2VydmVyICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlYnVnIGRlYyBkZXNjcmliZSBkaWFsb2cgZGlkIGRpZHRvayBkaXNhYmxlIGRpc2Nvbm5lY3QgZGxldmVsIGRsaW5lIGRsbCAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkbnMgZHF3aW5kb3cgZHJhd2NvcHkgZHJhd2RvdCBkcmF3ZmlsbCBkcmF3bGluZSBkcmF3cGljIGRyYXdyZWN0IGRyYXdyZXBsYWNlICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgImRyYXdyb3QgZHJhd3NhdmUgZHJhd3Njcm9sbCBkcmF3dGV4dCBlYmVlcHMgZWNobyBlZGl0Ym94IGVtYWlsYWRkciBlbmFibGUgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXZlbnRzIGV4aXQgZmNsb3NlIGZpbHRlciBmaW5kdGV4dCBmaW5nZXIgZmlyZXdhbGwgZmxhc2ggZmxpc3QgZmxvb2QgZmx1c2ggIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmx1c2hpbmkgZm9udCBmb3BlbiBmc2VlayBmc2VuZCBmc2VydmUgZnVsbG5hbWUgZndyaXRlIGdoaWRlIGdsb2FkIGdtb3ZlICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgImdvcHRzIGdvdG8gZ3BsYXkgZ3BvaW50IGdxcmVxIGdyb3VwcyBnc2hvdyBnc2l6ZSBnc3RvcCBndGFsayBndW5sb2FkIGhhZGQgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaGFsdCBoYWx0ZGVmIGhkZWMgaGRlbCBoZWxwIGhmcmVlIGhpbmMgaGxvYWQgaG1ha2UgaG9wIGhzYXZlIGlhbCBpYWxjbGVhciAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpYWxtYXJrIGlkZW50ZCBpZiBpZ25vcmUgaWxpbmUgaW5jIGludml0ZSBpdXNlciBqb2luIGtpY2sgbGluZXNlcCBsaW5rcyBsaXN0ICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvYWQgbG9hZGJ1ZiBsb2NhbGluZm8gbG9nIG1kaSBtZSBtZW51YmFyIG1rZGlyIG1uaWNrIG1vZGUgbXNnIG5pY2sgbm9vcCBub3RpY2UgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm90aWZ5IG9tc2cgb25vdGljZSBwYXJ0IHBhcnRhbGwgcGRjYyBwZXJmb3JtIHBsYXkgcGxheWN0cmwgcG9wIHByb3RlY3QgcHZvaWNlICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgInFtZSBxbXNnIHF1ZXJ5IHF1ZXJ5biBxdWl0IHJhdyByZWxvYWQgcmVtaW5pIHJlbW90ZSByZW1vdmUgcmVuYW1lIHJlbndpbiAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXNldGVycm9yIHJlc2V0aWRsZSByZXR1cm4gcmxldmVsIHJsaW5lIHJtZGlyIHJ1biBydXNlciBzYXZlIHNhdmVidWYgc2F2ZWluaSAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzYXkgc2NpZCBzY29uIHNlcnZlciBzZXQgc2hvd21pcmMgc2lnbmFtIHNsaW5lIHNvY2thY2NlcHQgc29ja2Nsb3NlIHNvY2tsaXN0ICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgInNvY2tsaXN0ZW4gc29ja21hcmsgc29ja29wZW4gc29ja3BhdXNlIHNvY2tyZWFkIHNvY2tyZW5hbWUgc29ja3VkcCBzb2Nrd3JpdGUgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAic291bmQgc3BlYWsgc3BsYXkgc3JlcSBzdHJpcCBzd2l0Y2hiYXIgdGltZXIgdGltZXN0YW1wIHRpdGxlYmFyIHRuaWNrIHRva2VuaXplICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgInRvb2xiYXIgdG9waWMgdHJheSB0cmVlYmFyIHVsaXN0IHVubG9hZCB1bnNldCB1bnNldGFsbCB1cGRhdGVubCB1cmwgdXdobyAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YXIgdmNhZGQgdmNtZCB2Y3JlbSB2b2wgd2hpbGUgd2hvaXMgd2luZG93IHdpbmhlbHAgd3JpdGUgd3JpdGVpbnQgaWYgaXNhbG51bSAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpc2FscGhhIGlzYW9wIGlzYXZvaWNlIGlzYmFuIGlzY2hhbiBpc2hvcCBpc2lnbm9yZSBpc2luIGlzaW5jcyBpc2xldHRlciBpc2xvd2VyICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgImlzbm90aWZ5IGlzbnVtIGlzb24gaXNvcCBpc3Byb3RlY3QgaXNyZWcgaXN1cHBlciBpc3ZvaWNlIGlzd20gaXN3bWNzICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgImVsc2VpZiBlbHNlIGdvdG8gbWVudSBuaWNrbGlzdCBzdGF0dXMgdGl0bGUgaWNvbiBzaXplIG9wdGlvbiB0ZXh0IGVkaXQgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnV0dG9uIGNoZWNrIHJhZGlvIGJveCBzY3JvbGwgbGlzdCBjb21ibyBsaW5rIHRhYiBpdGVtIik7CiAgdmFyIGZ1bmN0aW9ucyA9IHBhcnNlV29yZHMoImlmIGVsc2VpZiBlbHNlIGFuZCBub3Qgb3IgZXEgbmUgaW4gbmkgZm9yIGZvcmVhY2ggd2hpbGUgc3dpdGNoIik7CiAgdmFyIGlzT3BlcmF0b3JDaGFyID0gL1srXC0qJiU9PD4hP15cL1x8XS87CiAgZnVuY3Rpb24gY2hhaW4oc3RyZWFtLCBzdGF0ZSwgZikgewogICAgc3RhdGUudG9rZW5pemUgPSBmOwogICAgcmV0dXJuIGYoc3RyZWFtLCBzdGF0ZSk7CiAgfQogIGZ1bmN0aW9uIHRva2VuQmFzZShzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgYmVmb3JlUGFyYW1zID0gc3RhdGUuYmVmb3JlUGFyYW1zOwogICAgc3RhdGUuYmVmb3JlUGFyYW1zID0gZmFsc2U7CiAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpOwogICAgaWYgKC9bXFtcXXt9XChcKSxcLl0vLnRlc3QoY2gpKSB7CiAgICAgIGlmIChjaCA9PSAiKCIgJiYgYmVmb3JlUGFyYW1zKSBzdGF0ZS5pblBhcmFtcyA9IHRydWU7CiAgICAgIGVsc2UgaWYgKGNoID09ICIpIikgc3RhdGUuaW5QYXJhbXMgPSBmYWxzZTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBlbHNlIGlmICgvXGQvLnRlc3QoY2gpKSB7CiAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1x3XC5dLyk7CiAgICAgIHJldHVybiAibnVtYmVyIjsKICAgIH0KICAgIGVsc2UgaWYgKGNoID09ICJcXCIpIHsKICAgICAgc3RyZWFtLmVhdCgiXFwiKTsKICAgICAgc3RyZWFtLmVhdCgvLi8pOwogICAgICByZXR1cm4gIm51bWJlciI7CiAgICB9CiAgICBlbHNlIGlmIChjaCA9PSAiLyIgJiYgc3RyZWFtLmVhdCgiKiIpKSB7CiAgICAgIHJldHVybiBjaGFpbihzdHJlYW0sIHN0YXRlLCB0b2tlbkNvbW1lbnQpOwogICAgfQogICAgZWxzZSBpZiAoY2ggPT0gIjsiICYmIHN0cmVhbS5tYXRjaCgvICpcKCAqXCgvKSkgewogICAgICByZXR1cm4gY2hhaW4oc3RyZWFtLCBzdGF0ZSwgdG9rZW5VbnBhcnNlZCk7CiAgICB9CiAgICBlbHNlIGlmIChjaCA9PSAiOyIgJiYgIXN0YXRlLmluUGFyYW1zKSB7CiAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgcmV0dXJuICJjb21tZW50IjsKICAgIH0KICAgIGVsc2UgaWYgKGNoID09ICciJykgewogICAgICBzdHJlYW0uZWF0KC8iLyk7CiAgICAgIHJldHVybiAia2V5d29yZCI7CiAgICB9CiAgICBlbHNlIGlmIChjaCA9PSAiJCIpIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bJF9hLXowLTlBLVpcLjpdLyk7CiAgICAgIGlmIChzcGVjaWFscyAmJiBzcGVjaWFscy5wcm9wZXJ0eUlzRW51bWVyYWJsZShzdHJlYW0uY3VycmVudCgpLnRvTG93ZXJDYXNlKCkpKSB7CiAgICAgICAgcmV0dXJuICJrZXl3b3JkIjsKICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICBzdGF0ZS5iZWZvcmVQYXJhbXMgPSB0cnVlOwogICAgICAgIHJldHVybiAiYnVpbHRpbiI7CiAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYgKGNoID09ICIlIikgewogICAgICBzdHJlYW0uZWF0V2hpbGUoL1teLF5cc15cKF5cKV0vKTsKICAgICAgc3RhdGUuYmVmb3JlUGFyYW1zID0gdHJ1ZTsKICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgfQogICAgZWxzZSBpZiAoaXNPcGVyYXRvckNoYXIudGVzdChjaCkpIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKGlzT3BlcmF0b3JDaGFyKTsKICAgICAgcmV0dXJuICJvcGVyYXRvciI7CiAgICB9CiAgICBlbHNlIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXHdcJF97fV0vKTsKICAgICAgdmFyIHdvcmQgPSBzdHJlYW0uY3VycmVudCgpLnRvTG93ZXJDYXNlKCk7CiAgICAgIGlmIChrZXl3b3JkcyAmJiBrZXl3b3Jkcy5wcm9wZXJ0eUlzRW51bWVyYWJsZSh3b3JkKSkKICAgICAgICByZXR1cm4gImtleXdvcmQiOwogICAgICBpZiAoZnVuY3Rpb25zICYmIGZ1bmN0aW9ucy5wcm9wZXJ0eUlzRW51bWVyYWJsZSh3b3JkKSkgewogICAgICAgIHN0YXRlLmJlZm9yZVBhcmFtcyA9IHRydWU7CiAgICAgICAgcmV0dXJuICJrZXl3b3JkIjsKICAgICAgfQogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICB9CiAgZnVuY3Rpb24gdG9rZW5Db21tZW50KHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBtYXliZUVuZCA9IGZhbHNlLCBjaDsKICAgIHdoaWxlIChjaCA9IHN0cmVhbS5uZXh0KCkpIHsKICAgICAgaWYgKGNoID09ICIvIiAmJiBtYXliZUVuZCkgewogICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIG1heWJlRW5kID0gKGNoID09ICIqIik7CiAgICB9CiAgICByZXR1cm4gImNvbW1lbnQiOwogIH0KICBmdW5jdGlvbiB0b2tlblVucGFyc2VkKHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBtYXliZUVuZCA9IDAsIGNoOwogICAgd2hpbGUgKGNoID0gc3RyZWFtLm5leHQoKSkgewogICAgICBpZiAoY2ggPT0gIjsiICYmIG1heWJlRW5kID09IDIpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBpZiAoY2ggPT0gIikiKQogICAgICAgIG1heWJlRW5kKys7CiAgICAgIGVsc2UgaWYgKGNoICE9ICIgIikKICAgICAgICBtYXliZUVuZCA9IDA7CiAgICB9CiAgICByZXR1cm4gIm1ldGEiOwogIH0KICByZXR1cm4gewogICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgdG9rZW5pemU6IHRva2VuQmFzZSwKICAgICAgICBiZWZvcmVQYXJhbXM6IGZhbHNlLAogICAgICAgIGluUGFyYW1zOiBmYWxzZQogICAgICB9OwogICAgfSwKICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIGlmIChzdHJlYW0uZWF0U3BhY2UoKSkgcmV0dXJuIG51bGw7CiAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgIH0KICB9Owp9KTsKCn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/mllike/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/mllike/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogTUwtbGlrZSBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Li4vLi4vbGliL2NvZGVtaXJyb3IuY3NzPgo8c2NyaXB0IHNyYz0uLi8uLi9saWIvY29kZW1pcnJvci5qcz48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Li4vLi4vYWRkb24vZWRpdC9tYXRjaGJyYWNrZXRzLmpzPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz1tbGxpa2UuanM+PC9zY3JpcHQ+CjxzdHlsZSB0eXBlPXRleHQvY3NzPgogIC5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazt9Cjwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGgxPkNvZGVNaXJyb3I8L2gxPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5NTC1saWtlPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5PQ2FtbCBtb2RlPC9oMj4KCgo8dGV4dGFyZWEgaWQ9Im9jYW1sQ29kZSI+CigqIFN1bW1pbmcgYSBsaXN0IG9mIGludGVnZXJzICopCmxldCByZWMgc3VtIHhzID0KICBtYXRjaCB4cyB3aXRoCiAgICB8IFtdICAgICAgIC0mZ3Q7IDAKICAgIHwgeCA6OiB4cycgLSZndDsgeCArIHN1bSB4cycKCigqIFF1aWNrc29ydCAqKQpsZXQgcmVjIHFzb3J0ID0gZnVuY3Rpb24KICAgfCBbXSAtJmd0OyBbXQogICB8IHBpdm90IDo6IHJlc3QgLSZndDsKICAgICAgIGxldCBpc19sZXNzIHggPSB4ICZsdDsgcGl2b3QgaW4KICAgICAgIGxldCBsZWZ0LCByaWdodCA9IExpc3QucGFydGl0aW9uIGlzX2xlc3MgcmVzdCBpbgogICAgICAgcXNvcnQgbGVmdCBAIFtwaXZvdF0gQCBxc29ydCByaWdodAoKKCogRmlib25hY2NpIFNlcXVlbmNlICopCmxldCByZWMgZmliX2F1eCBuIGEgYiA9CiAgbWF0Y2ggbiB3aXRoCiAgfCAwIC0mZ3Q7IGEKICB8IF8gLSZndDsgZmliX2F1eCAobiAtIDEpIChhICsgYikgYQpsZXQgZmliIG4gPSBmaWJfYXV4IG4gMCAxCgooKiBCaXJ0aGRheSBwYXJhZG94ICopCmxldCB5ZWFyX3NpemUgPSAzNjUuCgpsZXQgcmVjIGJpcnRoZGF5X3BhcmFkb3ggcHJvYiBwZW9wbGUgPQogICAgbGV0IHByb2InID0gKHllYXJfc2l6ZSAtLiBmbG9hdCBwZW9wbGUpIC8uIHllYXJfc2l6ZSAqLiBwcm9iICBpbgogICAgaWYgcHJvYicgJmx0OyAwLjUgdGhlbgogICAgICAgIFByaW50Zi5wcmludGYgImFuc3dlciA9ICVkXG4iIChwZW9wbGUrMSkKICAgIGVsc2UKICAgICAgICBiaXJ0aGRheV9wYXJhZG94IHByb2InIChwZW9wbGUrMSkgOzsKCmJpcnRoZGF5X3BhcmFkb3ggMS4wIDEKCigqIENodXJjaCBudW1lcmFscyAqKQpsZXQgemVybyBmIHggPSB4CmxldCBzdWNjIG4gZiB4ID0gZiAobiBmIHgpCmxldCBvbmUgPSBzdWNjIHplcm8KbGV0IHR3byA9IHN1Y2MgKHN1Y2MgemVybykKbGV0IGFkZCBuMSBuMiBmIHggPSBuMSBmIChuMiBmIHgpCmxldCB0b19zdHJpbmcgbiA9IG4gKGZ1biBrIC0mZ3Q7ICJTIiBeIGspICIwIgpsZXQgXyA9IHRvX3N0cmluZyAoYWRkIChzdWNjIHR3bykgdHdvKQoKKCogRWxlbWVudGFyeSBmdW5jdGlvbnMgKikKbGV0IHNxdWFyZSB4ID0geCAqIHg7OwpsZXQgcmVjIGZhY3QgeCA9CiAgaWYgeCAmbHQ7PSAxIHRoZW4gMSBlbHNlIHggKiBmYWN0ICh4IC0gMSk7OwoKKCogQXV0b21hdGljIG1lbW9yeSBtYW5hZ2VtZW50ICopCmxldCBsID0gMSA6OiAyIDo6IDMgOjogW107OwpbMTsgMjsgM107Owo1IDo6IGw7OwoKKCogUG9seW1vcnBoaXNtOiBzb3J0aW5nIGxpc3RzICopCmxldCByZWMgc29ydCA9IGZ1bmN0aW9uCiAgfCBbXSAtJmd0OyBbXQogIHwgeCA6OiBsIC0mZ3Q7IGluc2VydCB4IChzb3J0IGwpCgphbmQgaW5zZXJ0IGVsZW0gPSBmdW5jdGlvbgogIHwgW10gLSZndDsgW2VsZW1dCiAgfCB4IDo6IGwgLSZndDsKICAgICAgaWYgZWxlbSAmbHQ7IHggdGhlbiBlbGVtIDo6IHggOjogbCBlbHNlIHggOjogaW5zZXJ0IGVsZW0gbDs7CgooKiBJbXBlcmF0aXZlIGZlYXR1cmVzICopCmxldCBhZGRfcG9seW5vbSBwMSBwMiA9CiAgbGV0IG4xID0gQXJyYXkubGVuZ3RoIHAxCiAgYW5kIG4yID0gQXJyYXkubGVuZ3RoIHAyIGluCiAgbGV0IHJlc3VsdCA9IEFycmF5LmNyZWF0ZSAobWF4IG4xIG4yKSAwIGluCiAgZm9yIGkgPSAwIHRvIG4xIC0gMSBkbyByZXN1bHQuKGkpICZsdDstIHAxLihpKSBkb25lOwogIGZvciBpID0gMCB0byBuMiAtIDEgZG8gcmVzdWx0LihpKSAmbHQ7LSByZXN1bHQuKGkpICsgcDIuKGkpIGRvbmU7CiAgcmVzdWx0OzsKYWRkX3BvbHlub20gW3wgMTsgMiB8XSBbfCAxOyAyOyAzIHxdOzsKCigqIFdlIG1heSByZWRlZmluZSBmYWN0IHVzaW5nIGEgcmVmZXJlbmNlIGNlbGwgYW5kIGEgZm9yIGxvb3AgKikKbGV0IGZhY3QgbiA9CiAgbGV0IHJlc3VsdCA9IHJlZiAxIGluCiAgZm9yIGkgPSAyIHRvIG4gZG8KICAgIHJlc3VsdCA6PSBpICogIXJlc3VsdAogICBkb25lOwogICAhcmVzdWx0OzsKZmFjdCA1OzsKCigqIFRyaWFuZ2xlIChncmFwaGljcykgKikKbGV0ICgpID0KICBpZ25vcmUoIEdsdXQuaW5pdCBTeXMuYXJndiApOwogIEdsdXQuaW5pdERpc3BsYXlNb2RlIH5kb3VibGVfYnVmZmVyOnRydWUgKCk7CiAgaWdub3JlIChHbHV0LmNyZWF0ZVdpbmRvdyB+dGl0bGU6Ik9wZW5HTCBEZW1vIik7CiAgbGV0IGFuZ2xlIHQgPSAxMC4gKi4gdCAqLiB0IGluCiAgbGV0IHJlbmRlciAoKSA9CiAgICBHbENsZWFyLmNsZWFyIFsgYGNvbG9yIF07CiAgICBHbE1hdC5sb2FkX2lkZW50aXR5ICgpOwogICAgR2xNYXQucm90YXRlIH5hbmdsZTogKGFuZ2xlIChTeXMudGltZSAoKSkpIH56OjEuICgpOwogICAgR2xEcmF3LmJlZ2lucyBgdHJpYW5nbGVzOwogICAgTGlzdC5pdGVyIEdsRHJhdy52ZXJ0ZXgyIFstMS4sIC0xLjsgMC4sIDEuOyAxLiwgLTEuXTsKICAgIEdsRHJhdy5lbmRzICgpOwogICAgR2x1dC5zd2FwQnVmZmVycyAoKSBpbgogIEdsTWF0Lm1vZGUgYG1vZGVsdmlldzsKICBHbHV0LmRpc3BsYXlGdW5jIH5jYjpyZW5kZXI7CiAgR2x1dC5pZGxlRnVuYyB+Y2I6KFNvbWUgR2x1dC5wb3N0UmVkaXNwbGF5KTsKICBHbHV0Lm1haW5Mb29wICgpCgooKiBBIEh1bmRyZWQgTGluZXMgb2YgQ2FtbCAtIGh0dHA6Ly9jYW1sLmlucmlhLmZyL2Fib3V0L3Rhc3RlLmVuLmh0bWwgKikKKCogT0NhbWwgcGFnZSBvbiBXaWtpcGVkaWEgLSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL09DYW1sICopCjwvdGV4dGFyZWE+Cgo8aDI+RiMgbW9kZTwvaDI+Cjx0ZXh0YXJlYSBpZD0iZnNoYXJwQ29kZSI+Cm1vZHVsZSBDb2RlTWlycm9yLkZTaGFycAoKbGV0IHJlYyBmaWIgPSBmdW5jdGlvbgogICAgfCAwIC0+IDAKICAgIHwgMSAtPiAxCiAgICB8IG4gLT4gZmliIChuIC0gMSkgKyBmaWIgKG4gLSAyKQoKdHlwZSBQb2ludCA9CiAgICB7CiAgICAgICAgeCA6IGludAogICAgICAgIHkgOiBpbnQKICAgIH0KCnR5cGUgQ29sb3IgPQogICAgfCBSZWQKICAgIHwgR3JlZW4KICAgIHwgQmx1ZQoKWzAgLi4gMTBdCnw+IExpc3QubWFwICgoKykgMikKfD4gTGlzdC5mb2xkIChmdW4geCB5IC0+IHggKyB5KSAwCnw+IHByaW50ZiAiJWkiCjwvdGV4dGFyZWE+CgoKPHNjcmlwdD4KICB2YXIgb2NhbWxFZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnb2NhbWxDb2RlJyksIHsKICAgIG1vZGU6ICd0ZXh0L3gtb2NhbWwnLAogICAgbGluZU51bWJlcnM6IHRydWUsCiAgICBtYXRjaEJyYWNrZXRzOiB0cnVlCiAgfSk7CgogIHZhciBmc2hhcnBFZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnZnNoYXJwQ29kZScpLCB7CiAgICBtb2RlOiAndGV4dC94LWZzaGFycCcsCiAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgIG1hdGNoQnJhY2tldHM6IHRydWUKICB9KTsKPC9zY3JpcHQ+Cgo8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC94LW9jYW1sPC9jb2RlPiAoT0NhbWwpIGFuZCA8Y29kZT50ZXh0L3gtZnNoYXJwPC9jb2RlPiAoRiMpLjwvcD4KPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/mllike/mllike.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCdtbGxpa2UnLCBmdW5jdGlvbihfY29uZmlnLCBwYXJzZXJDb25maWcpIHsKICB2YXIgd29yZHMgPSB7CiAgICAnbGV0JzogJ2tleXdvcmQnLAogICAgJ3JlYyc6ICdrZXl3b3JkJywKICAgICdpbic6ICdrZXl3b3JkJywKICAgICdvZic6ICdrZXl3b3JkJywKICAgICdhbmQnOiAna2V5d29yZCcsCiAgICAnaWYnOiAna2V5d29yZCcsCiAgICAndGhlbic6ICdrZXl3b3JkJywKICAgICdlbHNlJzogJ2tleXdvcmQnLAogICAgJ2Zvcic6ICdrZXl3b3JkJywKICAgICd0byc6ICdrZXl3b3JkJywKICAgICd3aGlsZSc6ICdrZXl3b3JkJywKICAgICdkbyc6ICdrZXl3b3JkJywKICAgICdkb25lJzogJ2tleXdvcmQnLAogICAgJ2Z1bic6ICdrZXl3b3JkJywKICAgICdmdW5jdGlvbic6ICdrZXl3b3JkJywKICAgICd2YWwnOiAna2V5d29yZCcsCiAgICAndHlwZSc6ICdrZXl3b3JkJywKICAgICdtdXRhYmxlJzogJ2tleXdvcmQnLAogICAgJ21hdGNoJzogJ2tleXdvcmQnLAogICAgJ3dpdGgnOiAna2V5d29yZCcsCiAgICAndHJ5JzogJ2tleXdvcmQnLAogICAgJ29wZW4nOiAnYnVpbHRpbicsCiAgICAnaWdub3JlJzogJ2J1aWx0aW4nLAogICAgJ2JlZ2luJzogJ2tleXdvcmQnLAogICAgJ2VuZCc6ICdrZXl3b3JkJwogIH07CgogIHZhciBleHRyYVdvcmRzID0gcGFyc2VyQ29uZmlnLmV4dHJhV29yZHMgfHwge307CiAgZm9yICh2YXIgcHJvcCBpbiBleHRyYVdvcmRzKSB7CiAgICBpZiAoZXh0cmFXb3Jkcy5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgewogICAgICB3b3Jkc1twcm9wXSA9IHBhcnNlckNvbmZpZy5leHRyYVdvcmRzW3Byb3BdOwogICAgfQogIH0KCiAgZnVuY3Rpb24gdG9rZW5CYXNlKHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBjaCA9IHN0cmVhbS5uZXh0KCk7CgogICAgaWYgKGNoID09PSAnIicpIHsKICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlblN0cmluZzsKICAgICAgcmV0dXJuIHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgfQogICAgaWYgKGNoID09PSAnKCcpIHsKICAgICAgaWYgKHN0cmVhbS5lYXQoJyonKSkgewogICAgICAgIHN0YXRlLmNvbW1lbnRMZXZlbCsrOwogICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5Db21tZW50OwogICAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgICAgfQogICAgfQogICAgaWYgKGNoID09PSAnficpIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKC9cdy8pOwogICAgICByZXR1cm4gJ3ZhcmlhYmxlLTInOwogICAgfQogICAgaWYgKGNoID09PSAnYCcpIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKC9cdy8pOwogICAgICByZXR1cm4gJ3F1b3RlJzsKICAgIH0KICAgIGlmIChjaCA9PT0gJy8nICYmIHBhcnNlckNvbmZpZy5zbGFzaENvbW1lbnRzICYmIHN0cmVhbS5lYXQoJy8nKSkgewogICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICAgIHJldHVybiAnY29tbWVudCc7CiAgICB9CiAgICBpZiAoL1xkLy50ZXN0KGNoKSkgewogICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcZF0vKTsKICAgICAgaWYgKHN0cmVhbS5lYXQoJy4nKSkgewogICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1xkXS8pOwogICAgICB9CiAgICAgIHJldHVybiAnbnVtYmVyJzsKICAgIH0KICAgIGlmICggL1srXC0qJiU9PD4hP3xdLy50ZXN0KGNoKSkgewogICAgICByZXR1cm4gJ29wZXJhdG9yJzsKICAgIH0KICAgIHN0cmVhbS5lYXRXaGlsZSgvXHcvKTsKICAgIHZhciBjdXIgPSBzdHJlYW0uY3VycmVudCgpOwogICAgcmV0dXJuIHdvcmRzLmhhc093blByb3BlcnR5KGN1cikgPyB3b3Jkc1tjdXJdIDogJ3ZhcmlhYmxlJzsKICB9CgogIGZ1bmN0aW9uIHRva2VuU3RyaW5nKHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBuZXh0LCBlbmQgPSBmYWxzZSwgZXNjYXBlZCA9IGZhbHNlOwogICAgd2hpbGUgKChuZXh0ID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkgewogICAgICBpZiAobmV4dCA9PT0gJyInICYmICFlc2NhcGVkKSB7CiAgICAgICAgZW5kID0gdHJ1ZTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBlc2NhcGVkID0gIWVzY2FwZWQgJiYgbmV4dCA9PT0gJ1xcJzsKICAgIH0KICAgIGlmIChlbmQgJiYgIWVzY2FwZWQpIHsKICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICB9CiAgICByZXR1cm4gJ3N0cmluZyc7CiAgfTsKCiAgZnVuY3Rpb24gdG9rZW5Db21tZW50KHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBwcmV2LCBuZXh0OwogICAgd2hpbGUoc3RhdGUuY29tbWVudExldmVsID4gMCAmJiAobmV4dCA9IHN0cmVhbS5uZXh0KCkpICE9IG51bGwpIHsKICAgICAgaWYgKHByZXYgPT09ICcoJyAmJiBuZXh0ID09PSAnKicpIHN0YXRlLmNvbW1lbnRMZXZlbCsrOwogICAgICBpZiAocHJldiA9PT0gJyonICYmIG5leHQgPT09ICcpJykgc3RhdGUuY29tbWVudExldmVsLS07CiAgICAgIHByZXYgPSBuZXh0OwogICAgfQogICAgaWYgKHN0YXRlLmNvbW1lbnRMZXZlbCA8PSAwKSB7CiAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlOwogICAgfQogICAgcmV0dXJuICdjb21tZW50JzsKICB9CgogIHJldHVybiB7CiAgICBzdGFydFN0YXRlOiBmdW5jdGlvbigpIHtyZXR1cm4ge3Rva2VuaXplOiB0b2tlbkJhc2UsIGNvbW1lbnRMZXZlbDogMH07fSwKICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIGlmIChzdHJlYW0uZWF0U3BhY2UoKSkgcmV0dXJuIG51bGw7CiAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgIH0sCgogICAgYmxvY2tDb21tZW50U3RhcnQ6ICIoKiIsCiAgICBibG9ja0NvbW1lbnRFbmQ6ICIqKSIsCiAgICBsaW5lQ29tbWVudDogcGFyc2VyQ29uZmlnLnNsYXNoQ29tbWVudHMgPyAiLy8iIDogbnVsbAogIH07Cn0pOwoKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCd0ZXh0L3gtb2NhbWwnLCB7CiAgbmFtZTogJ21sbGlrZScsCiAgZXh0cmFXb3JkczogewogICAgJ3N1Y2MnOiAna2V5d29yZCcsCiAgICAndHJhY2UnOiAnYnVpbHRpbicsCiAgICAnZXhpdCc6ICdidWlsdGluJywKICAgICdwcmludF9zdHJpbmcnOiAnYnVpbHRpbicsCiAgICAncHJpbnRfZW5kbGluZSc6ICdidWlsdGluJywKICAgICd0cnVlJzogJ2F0b20nLAogICAgJ2ZhbHNlJzogJ2F0b20nLAogICAgJ3JhaXNlJzogJ2tleXdvcmQnCiAgfQp9KTsKCkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgndGV4dC94LWZzaGFycCcsIHsKICBuYW1lOiAnbWxsaWtlJywKICBleHRyYVdvcmRzOiB7CiAgICAnYWJzdHJhY3QnOiAna2V5d29yZCcsCiAgICAnYXMnOiAna2V5d29yZCcsCiAgICAnYXNzZXJ0JzogJ2tleXdvcmQnLAogICAgJ2Jhc2UnOiAna2V5d29yZCcsCiAgICAnY2xhc3MnOiAna2V5d29yZCcsCiAgICAnZGVmYXVsdCc6ICdrZXl3b3JkJywKICAgICdkZWxlZ2F0ZSc6ICdrZXl3b3JkJywKICAgICdkb3duY2FzdCc6ICdrZXl3b3JkJywKICAgICdkb3dudG8nOiAna2V5d29yZCcsCiAgICAnZWxpZic6ICdrZXl3b3JkJywKICAgICdleGNlcHRpb24nOiAna2V5d29yZCcsCiAgICAnZXh0ZXJuJzogJ2tleXdvcmQnLAogICAgJ2ZpbmFsbHknOiAna2V5d29yZCcsCiAgICAnZ2xvYmFsJzogJ2tleXdvcmQnLAogICAgJ2luaGVyaXQnOiAna2V5d29yZCcsCiAgICAnaW5saW5lJzogJ2tleXdvcmQnLAogICAgJ2ludGVyZmFjZSc6ICdrZXl3b3JkJywKICAgICdpbnRlcm5hbCc6ICdrZXl3b3JkJywKICAgICdsYXp5JzogJ2tleXdvcmQnLAogICAgJ2xldCEnOiAna2V5d29yZCcsCiAgICAnbWVtYmVyJyA6ICdrZXl3b3JkJywKICAgICdtb2R1bGUnOiAna2V5d29yZCcsCiAgICAnbmFtZXNwYWNlJzogJ2tleXdvcmQnLAogICAgJ25ldyc6ICdrZXl3b3JkJywKICAgICdudWxsJzogJ2tleXdvcmQnLAogICAgJ292ZXJyaWRlJzogJ2tleXdvcmQnLAogICAgJ3ByaXZhdGUnOiAna2V5d29yZCcsCiAgICAncHVibGljJzogJ2tleXdvcmQnLAogICAgJ3JldHVybic6ICdrZXl3b3JkJywKICAgICdyZXR1cm4hJzogJ2tleXdvcmQnLAogICAgJ3NlbGVjdCc6ICdrZXl3b3JkJywKICAgICdzdGF0aWMnOiAna2V5d29yZCcsCiAgICAnc3RydWN0JzogJ2tleXdvcmQnLAogICAgJ3VwY2FzdCc6ICdrZXl3b3JkJywKICAgICd1c2UnOiAna2V5d29yZCcsCiAgICAndXNlISc6ICdrZXl3b3JkJywKICAgICd2YWwnOiAna2V5d29yZCcsCiAgICAnd2hlbic6ICdrZXl3b3JkJywKICAgICd5aWVsZCc6ICdrZXl3b3JkJywKICAgICd5aWVsZCEnOiAna2V5d29yZCcsCgogICAgJ0xpc3QnOiAnYnVpbHRpbicsCiAgICAnU2VxJzogJ2J1aWx0aW4nLAogICAgJ01hcCc6ICdidWlsdGluJywKICAgICdTZXQnOiAnYnVpbHRpbicsCiAgICAnaW50JzogJ2J1aWx0aW4nLAogICAgJ3N0cmluZyc6ICdidWlsdGluJywKICAgICdyYWlzZSc6ICdidWlsdGluJywKICAgICdmYWlsd2l0aCc6ICdidWlsdGluJywKICAgICdub3QnOiAnYnVpbHRpbicsCiAgICAndHJ1ZSc6ICdidWlsdGluJywKICAgICdmYWxzZSc6ICdidWlsdGluJwogIH0sCiAgc2xhc2hDb21tZW50czogdHJ1ZQp9KTsKCn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/modelica/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/modelica/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogTW9kZWxpY2EgbW9kZTwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uLy4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxzY3JpcHQgc3JjPSIuLi8uLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi8uLi9hZGRvbi9lZGl0L21hdGNoYnJhY2tldHMuanMiPjwvc2NyaXB0Pgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2FkZG9uL2hpbnQvc2hvdy1oaW50LmNzcyI+CjxzY3JpcHQgc3JjPSIuLi8uLi9hZGRvbi9oaW50L3Nob3ctaGludC5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJtb2RlbGljYS5qcyI+PC9zY3JpcHQ+CjxzdHlsZT4uQ29kZU1pcnJvciB7Ym9yZGVyOiAycHggaW5zZXQgI2RlZTt9PC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aDE+Q29kZU1pcnJvcjwvaDE+PGltZyBpZD1sb2dvIHNyYz0iLi4vLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+TGFuZ3VhZ2UgbW9kZXM8L2E+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPk1vZGVsaWNhPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5Nb2RlbGljYSBtb2RlPC9oMj4KCjxkaXY+PHRleHRhcmVhIGlkPSJtb2RlbGljYSI+Cm1vZGVsIEJvdW5jaW5nQmFsbAogIHBhcmFtZXRlciBSZWFsIGUgPSAwLjc7CiAgcGFyYW1ldGVyIFJlYWwgZyA9IDkuODE7CiAgUmVhbCBoKHN0YXJ0PTEpOwogIFJlYWwgdjsKICBCb29sZWFuIGZseWluZyhzdGFydD10cnVlKTsKICBCb29sZWFuIGltcGFjdDsKICBSZWFsIHZfbmV3OwplcXVhdGlvbgogIGltcGFjdCA9IGggPD0gMC4wOwogIGRlcih2KSA9IGlmIGZseWluZyB0aGVuIC1nIGVsc2UgMDsKICBkZXIoaCkgPSB2OwogIHdoZW4ge2ggPD0gMC4wIGFuZCB2IDw9IDAuMCwgaW1wYWN0fSB0aGVuCiAgICB2X25ldyA9IGlmIGVkZ2UoaW1wYWN0KSB0aGVuIC1lKnByZSh2KSBlbHNlIDA7CiAgICBmbHlpbmcgPSB2X25ldyA+IDA7CiAgICByZWluaXQodiwgdl9uZXcpOwogIGVuZCB3aGVuOwogIGFubm90YXRpb24gKHVzZXMoTW9kZWxpY2EodmVyc2lvbj0iMy4yIikpKTsKZW5kIEJvdW5jaW5nQmFsbDsKPC90ZXh0YXJlYT48L2Rpdj4KCiAgICA8c2NyaXB0PgogICAgICB2YXIgbW9kZWxpY2FFZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibW9kZWxpY2EiKSwgewogICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgICAgIG1hdGNoQnJhY2tldHM6IHRydWUsCiAgICAgICAgbW9kZTogInRleHQveC1tb2RlbGljYSIKICAgICAgfSk7CiAgICAgIHZhciBtYWMgPSBDb2RlTWlycm9yLmtleU1hcC5kZWZhdWx0ID09IENvZGVNaXJyb3Iua2V5TWFwLm1hY0RlZmF1bHQ7CiAgICAgIENvZGVNaXJyb3Iua2V5TWFwLmRlZmF1bHRbKG1hYyA/ICJDbWQiIDogIkN0cmwiKSArICItU3BhY2UiXSA9ICJhdXRvY29tcGxldGUiOwogICAgPC9zY3JpcHQ+CgogICAgPHA+U2ltcGxlIG1vZGUgdGhhdCB0cmllcyB0byBoYW5kbGUgTW9kZWxpY2EgYXMgd2VsbCBhcyBpdCBjYW4uPC9wPgoKICAgIDxwPjxzdHJvbmc+TUlNRSB0eXBlcyBkZWZpbmVkOjwvc3Ryb25nPiA8Y29kZT50ZXh0L3gtbW9kZWxpY2E8L2NvZGU+CiAgICAoTW9kbGljYSBjb2RlKS48L3A+CjwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/modelica/modelica.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovLyBNb2RlbGljYSBzdXBwb3J0IGZvciBDb2RlTWlycm9yLCBjb3B5cmlnaHQgKGMpIGJ5IExlbm5hcnQgT2NoZWwKCihmdW5jdGlvbihtb2QpIHsKICBpZiAodHlwZW9mIGV4cG9ydHMgPT0gIm9iamVjdCIgJiYgdHlwZW9mIG1vZHVsZSA9PSAib2JqZWN0IikgLy8gQ29tbW9uSlMKICAgIG1vZChyZXF1aXJlKCIuLi8uLi9saWIvY29kZW1pcnJvciIpKTsKICBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCkgLy8gQU1ECiAgICBkZWZpbmUoWyIuLi8uLi9saWIvY29kZW1pcnJvciJdLCBtb2QpOwogIGVsc2UgLy8gUGxhaW4gYnJvd3NlciBlbnYKICAgIG1vZChDb2RlTWlycm9yKTsKfSkKCihmdW5jdGlvbihDb2RlTWlycm9yKSB7CiAgInVzZSBzdHJpY3QiOwoKICBDb2RlTWlycm9yLmRlZmluZU1vZGUoIm1vZGVsaWNhIiwgZnVuY3Rpb24oY29uZmlnLCBwYXJzZXJDb25maWcpIHsKCiAgICB2YXIgaW5kZW50VW5pdCA9IGNvbmZpZy5pbmRlbnRVbml0OwogICAgdmFyIGtleXdvcmRzID0gcGFyc2VyQ29uZmlnLmtleXdvcmRzIHx8IHt9OwogICAgdmFyIGJ1aWx0aW4gPSBwYXJzZXJDb25maWcuYnVpbHRpbiB8fCB7fTsKICAgIHZhciBhdG9tcyA9IHBhcnNlckNvbmZpZy5hdG9tcyB8fCB7fTsKCiAgICB2YXIgaXNTaW5nbGVPcGVyYXRvckNoYXIgPSAvWzs9XCg6XCkse30uKjw+K1wtXC9eXFtcXV0vOwogICAgdmFyIGlzRG91YmxlT3BlcmF0b3JDaGFyID0gLyg6PXw8PXw+PXw9PXw8PnxcLlwrfFwuXC18XC5cKnxcLlwvfFwuXF4pLzsKICAgIHZhciBpc0RpZ2l0ID0gL1swLTldLzsKICAgIHZhciBpc05vbkRpZ2l0ID0gL1tfYS16QS1aXS87CgogICAgZnVuY3Rpb24gdG9rZW5MaW5lQ29tbWVudChzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgc3RhdGUudG9rZW5pemUgPSBudWxsOwogICAgICByZXR1cm4gImNvbW1lbnQiOwogICAgfQoKICAgIGZ1bmN0aW9uIHRva2VuQmxvY2tDb21tZW50KHN0cmVhbSwgc3RhdGUpIHsKICAgICAgdmFyIG1heWJlRW5kID0gZmFsc2UsIGNoOwogICAgICB3aGlsZSAoY2ggPSBzdHJlYW0ubmV4dCgpKSB7CiAgICAgICAgaWYgKG1heWJlRW5kICYmIGNoID09ICIvIikgewogICAgICAgICAgc3RhdGUudG9rZW5pemUgPSBudWxsOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIG1heWJlRW5kID0gKGNoID09ICIqIik7CiAgICAgIH0KICAgICAgcmV0dXJuICJjb21tZW50IjsKICAgIH0KCiAgICBmdW5jdGlvbiB0b2tlblN0cmluZyhzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHZhciBlc2NhcGVkID0gZmFsc2UsIGNoOwogICAgICB3aGlsZSAoKGNoID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkgewogICAgICAgIGlmIChjaCA9PSAnIicgJiYgIWVzY2FwZWQpIHsKICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gbnVsbDsKICAgICAgICAgIHN0YXRlLnNvbCA9IGZhbHNlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGVzY2FwZWQgPSAhZXNjYXBlZCAmJiBjaCA9PSAiXFwiOwogICAgICB9CgogICAgICByZXR1cm4gInN0cmluZyI7CiAgICB9CgogICAgZnVuY3Rpb24gdG9rZW5JZGVudChzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHN0cmVhbS5lYXRXaGlsZShpc0RpZ2l0KTsKICAgICAgd2hpbGUgKHN0cmVhbS5lYXQoaXNEaWdpdCkgfHwgc3RyZWFtLmVhdChpc05vbkRpZ2l0KSkgeyB9CgoKICAgICAgdmFyIGN1ciA9IHN0cmVhbS5jdXJyZW50KCk7CgogICAgICBpZihzdGF0ZS5zb2wgJiYgKGN1ciA9PSAicGFja2FnZSIgfHwgY3VyID09ICJtb2RlbCIgfHwgY3VyID09ICJ3aGVuIiB8fCBjdXIgPT0gImNvbm5lY3RvciIpKSBzdGF0ZS5sZXZlbCsrOwogICAgICBlbHNlIGlmKHN0YXRlLnNvbCAmJiBjdXIgPT0gImVuZCIgJiYgc3RhdGUubGV2ZWwgPiAwKSBzdGF0ZS5sZXZlbC0tOwoKICAgICAgc3RhdGUudG9rZW5pemUgPSBudWxsOwogICAgICBzdGF0ZS5zb2wgPSBmYWxzZTsKCiAgICAgIGlmIChrZXl3b3Jkcy5wcm9wZXJ0eUlzRW51bWVyYWJsZShjdXIpKSByZXR1cm4gImtleXdvcmQiOwogICAgICBlbHNlIGlmIChidWlsdGluLnByb3BlcnR5SXNFbnVtZXJhYmxlKGN1cikpIHJldHVybiAiYnVpbHRpbiI7CiAgICAgIGVsc2UgaWYgKGF0b21zLnByb3BlcnR5SXNFbnVtZXJhYmxlKGN1cikpIHJldHVybiAiYXRvbSI7CiAgICAgIGVsc2UgcmV0dXJuICJ2YXJpYWJsZSI7CiAgICB9CgogICAgZnVuY3Rpb24gdG9rZW5RSWRlbnQoc3RyZWFtLCBzdGF0ZSkgewogICAgICB3aGlsZSAoc3RyZWFtLmVhdCgvW14nXS8pKSB7IH0KCiAgICAgIHN0YXRlLnRva2VuaXplID0gbnVsbDsKICAgICAgc3RhdGUuc29sID0gZmFsc2U7CgogICAgICBpZihzdHJlYW0uZWF0KCInIikpCiAgICAgICAgcmV0dXJuICJ2YXJpYWJsZSI7CiAgICAgIGVsc2UKICAgICAgICByZXR1cm4gImVycm9yIjsKICAgIH0KCiAgICBmdW5jdGlvbiB0b2tlblVuc2lnbmVkTnViZXIoc3RyZWFtLCBzdGF0ZSkgewogICAgICBzdHJlYW0uZWF0V2hpbGUoaXNEaWdpdCk7CiAgICAgIGlmIChzdHJlYW0uZWF0KCcuJykpIHsKICAgICAgICBzdHJlYW0uZWF0V2hpbGUoaXNEaWdpdCk7CiAgICAgIH0KICAgICAgaWYgKHN0cmVhbS5lYXQoJ2UnKSB8fCBzdHJlYW0uZWF0KCdFJykpIHsKICAgICAgICBpZiAoIXN0cmVhbS5lYXQoJy0nKSkKICAgICAgICAgIHN0cmVhbS5lYXQoJysnKTsKICAgICAgICBzdHJlYW0uZWF0V2hpbGUoaXNEaWdpdCk7CiAgICAgIH0KCiAgICAgIHN0YXRlLnRva2VuaXplID0gbnVsbDsKICAgICAgc3RhdGUuc29sID0gZmFsc2U7CiAgICAgIHJldHVybiAibnVtYmVyIjsKICAgIH0KCiAgICAvLyBJbnRlcmZhY2UKICAgIHJldHVybiB7CiAgICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICB0b2tlbml6ZTogbnVsbCwKICAgICAgICAgIGxldmVsOiAwLAogICAgICAgICAgc29sOiB0cnVlCiAgICAgICAgfTsKICAgICAgfSwKCiAgICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgICAgaWYoc3RhdGUudG9rZW5pemUgIT0gbnVsbCkgewogICAgICAgICAgcmV0dXJuIHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgICAgIH0KCiAgICAgICAgaWYoc3RyZWFtLnNvbCgpKSB7CiAgICAgICAgICBzdGF0ZS5zb2wgPSB0cnVlOwogICAgICAgIH0KCiAgICAgICAgLy8gV0hJVEVTUEFDRQogICAgICAgIGlmKHN0cmVhbS5lYXRTcGFjZSgpKSB7CiAgICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IG51bGw7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgIHZhciBjaCA9IHN0cmVhbS5uZXh0KCk7CgogICAgICAgIC8vIExJTkVDT01NRU5UCiAgICAgICAgaWYoY2ggPT0gJy8nICYmIHN0cmVhbS5lYXQoJy8nKSkgewogICAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkxpbmVDb21tZW50OwogICAgICAgIH0KICAgICAgICAvLyBCTE9DS0NPTU1FTlQKICAgICAgICBlbHNlIGlmKGNoID09ICcvJyAmJiBzdHJlYW0uZWF0KCcqJykpIHsKICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5CbG9ja0NvbW1lbnQ7CiAgICAgICAgfQogICAgICAgIC8vIFRXTyBTWU1CT0wgVE9LRU5TCiAgICAgICAgZWxzZSBpZihpc0RvdWJsZU9wZXJhdG9yQ2hhci50ZXN0KGNoK3N0cmVhbS5wZWVrKCkpKSB7CiAgICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgICAgc3RhdGUudG9rZW5pemUgPSBudWxsOwogICAgICAgICAgcmV0dXJuICJvcGVyYXRvciI7CiAgICAgICAgfQogICAgICAgIC8vIFNJTkdMRSBTWU1CT0wgVE9LRU5TCiAgICAgICAgZWxzZSBpZihpc1NpbmdsZU9wZXJhdG9yQ2hhci50ZXN0KGNoKSkgewogICAgICAgICAgc3RhdGUudG9rZW5pemUgPSBudWxsOwogICAgICAgICAgcmV0dXJuICJvcGVyYXRvciI7CiAgICAgICAgfQogICAgICAgIC8vIElERU5UCiAgICAgICAgZWxzZSBpZihpc05vbkRpZ2l0LnRlc3QoY2gpKSB7CiAgICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuSWRlbnQ7CiAgICAgICAgfQogICAgICAgIC8vIFEtSURFTlQKICAgICAgICBlbHNlIGlmKGNoID09ICInIiAmJiBzdHJlYW0ucGVlaygpICYmIHN0cmVhbS5wZWVrKCkgIT0gIiciKSB7CiAgICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuUUlkZW50OwogICAgICAgIH0KICAgICAgICAvLyBTVFJJTkcKICAgICAgICBlbHNlIGlmKGNoID09ICciJykgewogICAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlblN0cmluZzsKICAgICAgICB9CiAgICAgICAgLy8gVU5TSUdORURfTlVCRVIKICAgICAgICBlbHNlIGlmKGlzRGlnaXQudGVzdChjaCkpIHsKICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5VbnNpZ25lZE51YmVyOwogICAgICAgIH0KICAgICAgICAvLyBFUlJPUgogICAgICAgIGVsc2UgewogICAgICAgICAgc3RhdGUudG9rZW5pemUgPSBudWxsOwogICAgICAgICAgcmV0dXJuICJlcnJvciI7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CiAgICAgIH0sCgogICAgICBpbmRlbnQ6IGZ1bmN0aW9uKHN0YXRlLCB0ZXh0QWZ0ZXIpIHsKICAgICAgICBpZiAoc3RhdGUudG9rZW5pemUgIT0gbnVsbCkgcmV0dXJuIENvZGVNaXJyb3IuUGFzczsKCiAgICAgICAgdmFyIGxldmVsID0gc3RhdGUubGV2ZWw7CiAgICAgICAgaWYoLyhhbGdvcml0aG0pLy50ZXN0KHRleHRBZnRlcikpIGxldmVsLS07CiAgICAgICAgaWYoLyhlcXVhdGlvbikvLnRlc3QodGV4dEFmdGVyKSkgbGV2ZWwtLTsKICAgICAgICBpZigvKGluaXRpYWwgYWxnb3JpdGhtKS8udGVzdCh0ZXh0QWZ0ZXIpKSBsZXZlbC0tOwogICAgICAgIGlmKC8oaW5pdGlhbCBlcXVhdGlvbikvLnRlc3QodGV4dEFmdGVyKSkgbGV2ZWwtLTsKICAgICAgICBpZigvKGVuZCkvLnRlc3QodGV4dEFmdGVyKSkgbGV2ZWwtLTsKCiAgICAgICAgaWYobGV2ZWwgPiAwKQogICAgICAgICAgcmV0dXJuIGluZGVudFVuaXQqbGV2ZWw7CiAgICAgICAgZWxzZQogICAgICAgICAgcmV0dXJuIDA7CiAgICAgIH0sCgogICAgICBibG9ja0NvbW1lbnRTdGFydDogIi8qIiwKICAgICAgYmxvY2tDb21tZW50RW5kOiAiKi8iLAogICAgICBsaW5lQ29tbWVudDogIi8vIgogICAgfTsKICB9KTsKCiAgZnVuY3Rpb24gd29yZHMoc3RyKSB7CiAgICB2YXIgb2JqID0ge30sIHdvcmRzID0gc3RyLnNwbGl0KCIgIik7CiAgICBmb3IgKHZhciBpPTA7IGk8d29yZHMubGVuZ3RoOyArK2kpCiAgICAgIG9ialt3b3Jkc1tpXV0gPSB0cnVlOwogICAgcmV0dXJuIG9iajsKICB9CgogIHZhciBtb2RlbGljYUtleXdvcmRzID0gImFsZ29yaXRobSBhbmQgYW5ub3RhdGlvbiBhc3NlcnQgYmxvY2sgYnJlYWsgY2xhc3MgY29ubmVjdCBjb25uZWN0b3IgY29uc3RhbnQgY29uc3RyYWluZWRieSBkZXIgZGlzY3JldGUgZWFjaCBlbHNlIGVsc2VpZiBlbHNld2hlbiBlbmNhcHN1bGF0ZWQgZW5kIGVudW1lcmF0aW9uIGVxdWF0aW9uIGV4cGFuZGFibGUgZXh0ZW5kcyBleHRlcm5hbCBmYWxzZSBmaW5hbCBmbG93IGZvciBmdW5jdGlvbiBpZiBpbXBvcnQgaW1wdXJlIGluIGluaXRpYWwgaW5uZXIgaW5wdXQgbG9vcCBtb2RlbCBub3Qgb3BlcmF0b3Igb3Igb3V0ZXIgb3V0cHV0IHBhY2thZ2UgcGFyYW1ldGVyIHBhcnRpYWwgcHJvdGVjdGVkIHB1YmxpYyBwdXJlIHJlY29yZCByZWRlY2xhcmUgcmVwbGFjZWFibGUgcmV0dXJuIHN0cmVhbSB0aGVuIHRydWUgdHlwZSB3aGVuIHdoaWxlIHdpdGhpbiI7CiAgdmFyIG1vZGVsaWNhQnVpbHRpbiA9ICJhYnMgYWNvcyBhY3R1YWxTdHJlYW0gYXNpbiBhdGFuIGF0YW4yIGNhcmRpbmFsaXR5IGNlaWwgY29zIGNvc2ggZGVsYXkgZGl2IGVkZ2UgZXhwIGZsb29yIGdldEluc3RhbmNlTmFtZSBob21vdG9weSBpblN0cmVhbSBpbnRlZ2VyIGxvZyBsb2cxMCBtb2QgcHJlIHJlaW5pdCByZW0gc2VtaUxpbmVhciBzaWduIHNpbiBzaW5oIHNwYXRpYWxEaXN0cmlidXRpb24gc3FydCB0YW4gdGFuaCI7CiAgdmFyIG1vZGVsaWNhQXRvbXMgPSAiUmVhbCBCb29sZWFuIEludGVnZXIgU3RyaW5nIjsKCiAgZnVuY3Rpb24gZGVmKG1pbWVzLCBtb2RlKSB7CiAgICBpZiAodHlwZW9mIG1pbWVzID09ICJzdHJpbmciKQogICAgICBtaW1lcyA9IFttaW1lc107CgogICAgdmFyIHdvcmRzID0gW107CgogICAgZnVuY3Rpb24gYWRkKG9iaikgewogICAgICBpZiAob2JqKQogICAgICAgIGZvciAodmFyIHByb3AgaW4gb2JqKQogICAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShwcm9wKSkKICAgICAgICAgICAgd29yZHMucHVzaChwcm9wKTsKICAgIH0KCiAgICBhZGQobW9kZS5rZXl3b3Jkcyk7CiAgICBhZGQobW9kZS5idWlsdGluKTsKICAgIGFkZChtb2RlLmF0b21zKTsKCiAgICBpZiAod29yZHMubGVuZ3RoKSB7CiAgICAgIG1vZGUuaGVscGVyVHlwZSA9IG1pbWVzWzBdOwogICAgICBDb2RlTWlycm9yLnJlZ2lzdGVySGVscGVyKCJoaW50V29yZHMiLCBtaW1lc1swXSwgd29yZHMpOwogICAgfQoKICAgIGZvciAodmFyIGk9MDsgaTxtaW1lcy5sZW5ndGg7ICsraSkKICAgICAgQ29kZU1pcnJvci5kZWZpbmVNSU1FKG1pbWVzW2ldLCBtb2RlKTsKICB9CgogIGRlZihbInRleHQveC1tb2RlbGljYSJdLCB7CiAgICBuYW1lOiAibW9kZWxpY2EiLAogICAga2V5d29yZHM6IHdvcmRzKG1vZGVsaWNhS2V5d29yZHMpLAogICAgYnVpbHRpbjogd29yZHMobW9kZWxpY2FCdWlsdGluKSwKICAgIGF0b21zOiB3b3Jkcyhtb2RlbGljYUF0b21zKQogIH0pOwp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/mscgen/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/mscgen/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogTXNjR2VuIG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0ibXNjZ2VuLmpzIj48L3NjcmlwdD4KPHN0eWxlPi5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazt9PC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aDE+Q29kZU1pcnJvcjwvaDE+PGltZyBpZD1sb2dvIHNyYz0iLi4vLi4vZG9jL2xvZ28ucG5nIj48L2E+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5MYW5ndWFnZSBtb2RlczwvYT4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+TXNjR2VuPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5Nc2NHZW4gbW9kZTwvaDI+Cgo8ZGl2Pjx0ZXh0YXJlYSBpZD0ibXNjZ2VuLWNvZGUiPgojIFNhbXBsZSBtc2NnZW4gcHJvZ3JhbQojIFNlZSBodHRwOi8vd3d3Lm1jdGVybmFuLm1lLnVrL21zY2dlbiBvcgojIGh0dHBzOi8vc3ZlcndlaWouZ2l0aHViLmlvL21zY2dlbl9qcyBmb3IgbW9yZSBzYW1wbGVzCm1zYyB7CiAgIyBvcHRpb25zCiAgaHNjYWxlPSIxLjIiOwoKICAjIGVudGl0aWVzLyBsaWZlbGluZXMKICBhIFtsYWJlbD0iRW50aXR5IEEiXSwKICBiIFtsYWJlbD0iRW50aXR5IEIiLCBsaW5lY29sb3I9InJlZCIsIGFyY2xpbmVjb2xvcj0icmVkIiwgdGV4dGJnY29sb3I9InBpbmsiXSwKICBjIFtsYWJlbD0iRW50aXR5IEMiXTsKCiAgIyBhcmNzLyBtZXNzYWdlcwogIGEgPT4gYyBbbGFiZWw9ImRvU29tZXRoaW5nKGFyZ3MpIl07CiAgYiA9PiBjIFtsYWJlbD0iZG9Tb21ldGhpbmcoYXJncykiXTsKICBjID4+ICogW2xhYmVsPSJldmVyeW9uZSBhc2tlZCBtZSIsIGFyY3NraXA9IjEiXTsKICBjID0+PiBjIFtsYWJlbD0iZG9pbmcgc29tZXRoaW5nIl07CiAgYyAteCAqIFtsYWJlbD0icmVwb3J0IGJhY2siLCBhcmNza2lwPSIxIl07CiAgfHx8OwogIC0tLSBbbGFiZWw9InNob3dzJ3Mgb3ZlciwgaG93ZXZlciAuLi4iXTsKICBiID0+IGEgW2xhYmVsPSJkaWQgeW91IHNlZSBjIGRvaW5nIHNvbWV0aGluZz8iXTsKICBhIC0+IGIgW2xhYmVsPSJub3BlIl07CiAgYiA6PiBhIFtsYWJlbD0ic2hhbGwgd2UgYXNrIGFnYWluPyJdOwogIGEgPT4gYiBbbGFiZWw9Im5hYWgiXTsKICAuLi47Cn0KPC90ZXh0YXJlYT48L2Rpdj4KCjxoMj5Yw7kgbW9kZTwvaDI+Cgo8ZGl2Pjx0ZXh0YXJlYSBpZD0ieHUtY29kZSI+CiMgWMO5IC0gZXhwYW5zaW9ucyB0byBNc2NHZW4gdG8gc3VwcG9ydCBpbmxpbmUgZXhwcmVzc2lvbnMKIyAgICAgIGh0dHBzOi8vZ2l0aHViLmNvbS9zdmVyd2Vpai9tc2NnZW5fanMvYmxvYi9tYXN0ZXIvd2lrdW0veHUubWQKIyBNb3JlIHNhbXBsZXM6IGh0dHBzOi8vc3ZlcndlaWouZ2l0aHViLmlvL21zY2dlbl9qcwptc2MgewogIGhzY2FsZT0iMC44IiwKICB3aWR0aD0iNzAwIjsKCiAgYSwKICBiIFtsYWJlbD0iY2hhbmdlIHN0b3JlIl0sCiAgYywKICBkIFtsYWJlbD0ibmVjcm8gcXVldWUiXSwKICBlIFtsYWJlbD0ibmF0YWxpcyBxdWV1ZSJdLAogIGY7CgogIGEgPT4+IGIgW2xhYmVsPSJnZXQgY2hhbmdlIGxpc3QoKSJdOwogIGEgYWx0IGYgW2xhYmVsPSJjaGFuZ2VzIGZvdW5kIl0geyAvKiBhbHQgaXMgYSB4dSBzcGVjaWZpYyBrZXl3b3JkKi8KICAgIGIgPj4gYSBbbGFiZWw9Imxpc3Qgb2YgY2hhbmdlcyJdOwogICAgYSA9Pj4gYyBbbGFiZWw9ImN1bGwgb2xkIHN0dWZmIChsaXN0IG9mIGNoYW5nZXMpIl07CiAgICBiIGxvb3AgZSBbbGFiZWw9ImZvciBlYWNoIGNoYW5nZSJdIHsgLy8gbG9vcCBpcyB4dSBzcGVjaWZpYyBhcyB3ZWxsLi4uCiAgICAgIC8qCiAgICAgICAqIEludGVyZXN0aW5nIHN0dWZmIGhhcHBlbnMuCiAgICAgICAqLwogICAgICBjID0+PiBiIFtsYWJlbD0iZ2V0IGNoYW5nZSgpIl07CiAgICAgIGIgPj4gYyBbbGFiZWw9ImNoYW5nZSJdOwogICAgICBjIGFsdCBlIFtsYWJlbD0iY2hhbmdlIHRvbyBvbGQiXSB7CiAgICAgICAgYyA9Pj4gZCBbbGFiZWw9InF1ZXVlKGNoYW5nZSkiXTsKICAgICAgICAtLS0gW2xhYmVsPSJjaGFuZ2UgbmV3ZXIgdGhhbiBsYXRlc3QgcnVuIl07CiAgICAgICAgYyA9Pj4gZSBbbGFiZWw9InF1ZXVlKGNoYW5nZSkiXTsKICAgICAgICAtLS0gW2xhYmVsPSJhbGwgb3RoZXIgY2FzZXMiXTsKICAgICAgICB8fHwgW2xhYmVsPSJsZWF2ZSB3ZWxsIGFsb25lIl07CiAgICAgIH07CiAgICB9OwoKICAgIGMgPj4gYSBbbGFiZWw9ImRvbmUKICAgIHByb2Nlc3NpbmciXTsKCiAgICAvKiBzaHVja3MhIG5vdGhpbmcgZm91bmQgLi4uKi8KICAgIC0tLSBbbGFiZWw9Im5vdGhpbmcgZm91bmQiXTsKICAgIGIgPj4gYSBbbGFiZWw9Im5vdGhpbmciXTsKICAgIGEgbm90ZSBhIFtsYWJlbD0ic2lsZW50IGV4aXQiXTsKICB9Owp9CjwvdGV4dGFyZWE+PC9kaXY+Cgo8aDI+TXNHZW5ueSBtb2RlPC9oMj4KPGRpdj48dGV4dGFyZWEgaWQ9Im1zZ2VubnktY29kZSI+CiMgTXNHZW5ueSAtIHNpbXBsaWZpZWQgdmVyc2lvbiBvZiBNc2NHZW4gLyBYw7kKIyAgICAgICAgICAgaHR0cHM6Ly9naXRodWIuY29tL3N2ZXJ3ZWlqL21zY2dlbl9qcy9ibG9iL21hc3Rlci93aWt1bS9tc2dlbm55Lm1kCiMgTW9yZSBzYW1wbGVzOiBodHRwczovL3N2ZXJ3ZWlqLmdpdGh1Yi5pby9tc2NnZW5fanMKYSAtPiBiICAgOiBhIC0+IGIgIChzaWduYWwpOwphID0+IGIgICA6IGEgPT4gYiAgKG1ldGhvZCk7CmIgPj4gYSAgIDogYiA+PiBhICAocmV0dXJuIHZhbHVlKTsKYSA9Pj4gYiAgOiBhID0+PiBiIChjYWxsYmFjayk7CmEgLXggYiAgIDogYSAteCBiICAobG9zdCk7CmEgOj4gYiAgIDogYSA6PiBiICAoZW1waGFzaXMpOwphIC4uIGIgICA6IGEgLi4gYiAgKGRvdHRlZCk7CmEgLS0gYiAgIDogImEgLS0gYiBzdHJhaWdodCBsaW5lIjsKYSBub3RlIGEgOiBhIG5vdGUgYVxuKG5vdGUpLApiIGJveCBiICA6IGIgYm94IGJcbihhY3Rpb24pOwphIHJib3ggYSA6IGEgcmJveCBhXG4ocmVmZXJlbmNlKSwKYiBhYm94IGIgOiBiIGFib3ggYlxuKHN0YXRlLyBjb25kaXRpb24pOwp8fHwgICAgICA6IHx8fCAoZW1wdHkgcm93KTsKLi4uICAgICAgOiAuLi4gKG9taXR0ZWQgcm93KTsKLS0tICAgICAgOiAtLS0gKGNvbW1lbnQpOwo8L3RleHRhcmVhPjwvZGl2PgoKICAgIDxwPgogICAgICBTaW1wbGUgbW9kZSBmb3IgaGlnaGxpZ2h0aW5nIE1zY0dlbiBhbmQgdHdvIGRlcml2ZWQgc2VxdWVuY2UKICAgICAgY2hhcnQgbGFuZ3VhZ2VzLgogICAgPC9wPgoKICAgIDxzY3JpcHQ+CiAgICAgIHZhciBtc2NnZW5FZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibXNjZ2VuLWNvZGUiKSwgewogICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgICAgIG1vZGU6ICJ0ZXh0L3gtbXNjZ2VuIiwKICAgICAgfSk7CiAgICAgIHZhciB4dUVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ4dS1jb2RlIiksIHsKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgICAgICBtb2RlOiAidGV4dC94LXh1IiwKICAgICAgfSk7CiAgICAgIHZhciBtc2dlbm55RWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm1zZ2VubnktY29kZSIpLCB7CiAgICAgICAgbGluZU51bWJlcnM6IHRydWUsCiAgICAgICAgbW9kZTogInRleHQveC1tc2dlbm55IiwKICAgICAgfSk7CiAgICA8L3NjcmlwdD4KCiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4KICAgICAgPGNvZGU+dGV4dC94LW1zY2dlbjwvY29kZT4KICAgICAgPGNvZGU+dGV4dC94LXh1PC9jb2RlPgogICAgICA8Y29kZT50ZXh0L3gtbXNnZW5ueTwvY29kZT4KICAgIDwvcD4KCjwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/mscgen/mscgen.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovLyBtb2RlKHMpIGZvciB0aGUgc2VxdWVuY2UgY2hhcnQgZHNsJ3MgbXNjZ2VuLCB4w7kgYW5kIG1zZ2VubnkKLy8gRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gbXNjZ2VuLCBzZWUgdGhlIHNpdGUgb2YgdGhlIG9yaWdpbmFsIGF1dGhvcjoKLy8gaHR0cDovL3d3dy5tY3Rlcm5hbi5tZS51ay9tc2NnZW4KLy8KLy8gVGhpcyBtb2RlIGZvciBtc2NnZW4gYW5kIHRoZSB0d28gZGVyaXZhdGl2ZSBsYW5ndWFnZXMgd2VyZQovLyBvcmlnaW5hbGx5IG1hZGUgZm9yIHVzZSBpbiB0aGUgbXNjZ2VuX2pzIGludGVycHJldGVyCi8vIChodHRwczovL3N2ZXJ3ZWlqLmdpdGh1Yi5pby9tc2NnZW5fanMpCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKCB0eXBlb2YgZXhwb3J0cyA9PSAib2JqZWN0IiAmJiB0eXBlb2YgbW9kdWxlID09ICJvYmplY3QiKS8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAoIHR5cGVvZiBkZWZpbmUgPT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kKS8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlLy8gUGxhaW4gYnJvd3NlciBlbnYKICAgIG1vZChDb2RlTWlycm9yKTsKfSkoZnVuY3Rpb24oQ29kZU1pcnJvcikgewogICJ1c2Ugc3RyaWN0IjsKCiAgdmFyIGxhbmd1YWdlcyA9IHsKICAgIG1zY2dlbjogewogICAgICAia2V5d29yZHMiIDogWyJtc2MiXSwKICAgICAgIm9wdGlvbnMiIDogWyJoc2NhbGUiLCAid2lkdGgiLCAiYXJjZ3JhZGllbnQiLCAid29yZHdyYXBhcmNzIl0sCiAgICAgICJhdHRyaWJ1dGVzIiA6IFsibGFiZWwiLCAiaWR1cmwiLCAiaWQiLCAidXJsIiwgImxpbmVjb2xvciIsICJsaW5lY29sb3VyIiwgInRleHRjb2xvciIsICJ0ZXh0Y29sb3VyIiwgInRleHRiZ2NvbG9yIiwgInRleHRiZ2NvbG91ciIsICJhcmNsaW5lY29sb3IiLCAiYXJjbGluZWNvbG91ciIsICJhcmN0ZXh0Y29sb3IiLCAiYXJjdGV4dGNvbG91ciIsICJhcmN0ZXh0Ymdjb2xvciIsICJhcmN0ZXh0Ymdjb2xvdXIiLCAiYXJjc2tpcCJdLAogICAgICAiYnJhY2tldHMiIDogWyJcXHsiLCAiXFx9Il0sIC8vIFsgYW5kICBdIGFyZSBicmFja2V0cyB0b28sIGJ1dCB0aGVzZSBnZXQgaGFuZGxlZCBpbiB3aXRoIGxpc3RzCiAgICAgICJhcmNzV29yZHMiIDogWyJub3RlIiwgImFib3giLCAicmJveCIsICJib3giXSwKICAgICAgImFyY3NPdGhlcnMiIDogWyJcXHxcXHxcXHwiLCAiXFwuXFwuXFwuIiwgIi0tLSIsICItLSIsICI8LT4iLCAiPT0iLCAiPDw9Pj4iLCAiPD0+IiwgIlxcLlxcLiIsICI8PD4+IiwgIjo6IiwgIjw6PiIsICItPiIsICI9Pj4iLCAiPT4iLCAiPj4iLCAiOj4iLCAiPC0iLCAiPDw9IiwgIjw9IiwgIjw8IiwgIjw6IiwgIngtIiwgIi14Il0sCiAgICAgICJzaW5nbGVjb21tZW50IiA6IFsiLy8iLCAiIyJdLAogICAgICAib3BlcmF0b3JzIiA6IFsiPSJdCiAgICB9LAogICAgeHU6IHsKICAgICAgImtleXdvcmRzIiA6IFsibXNjIl0sCiAgICAgICJvcHRpb25zIiA6IFsiaHNjYWxlIiwgIndpZHRoIiwgImFyY2dyYWRpZW50IiwgIndvcmR3cmFwYXJjcyIsICJ3YXRlcm1hcmsiXSwKICAgICAgImF0dHJpYnV0ZXMiIDogWyJsYWJlbCIsICJpZHVybCIsICJpZCIsICJ1cmwiLCAibGluZWNvbG9yIiwgImxpbmVjb2xvdXIiLCAidGV4dGNvbG9yIiwgInRleHRjb2xvdXIiLCAidGV4dGJnY29sb3IiLCAidGV4dGJnY29sb3VyIiwgImFyY2xpbmVjb2xvciIsICJhcmNsaW5lY29sb3VyIiwgImFyY3RleHRjb2xvciIsICJhcmN0ZXh0Y29sb3VyIiwgImFyY3RleHRiZ2NvbG9yIiwgImFyY3RleHRiZ2NvbG91ciIsICJhcmNza2lwIl0sCiAgICAgICJicmFja2V0cyIgOiBbIlxceyIsICJcXH0iXSwgIC8vIFsgYW5kICBdIGFyZSBicmFja2V0cyB0b28sIGJ1dCB0aGVzZSBnZXQgaGFuZGxlZCBpbiB3aXRoIGxpc3RzCiAgICAgICJhcmNzV29yZHMiIDogWyJub3RlIiwgImFib3giLCAicmJveCIsICJib3giLCAiYWx0IiwgImVsc2UiLCAib3B0IiwgImJyZWFrIiwgInBhciIsICJzZXEiLCAic3RyaWN0IiwgIm5lZyIsICJjcml0aWNhbCIsICJpZ25vcmUiLCAiY29uc2lkZXIiLCAiYXNzZXJ0IiwgImxvb3AiLCAicmVmIiwgImV4YyJdLAogICAgICAiYXJjc090aGVycyIgOiBbIlxcfFxcfFxcfCIsICJcXC5cXC5cXC4iLCAiLS0tIiwgIi0tIiwgIjwtPiIsICI9PSIsICI8PD0+PiIsICI8PT4iLCAiXFwuXFwuIiwgIjw8Pj4iLCAiOjoiLCAiPDo+IiwgIi0+IiwgIj0+PiIsICI9PiIsICI+PiIsICI6PiIsICI8LSIsICI8PD0iLCAiPD0iLCAiPDwiLCAiPDoiLCAieC0iLCAiLXgiXSwKICAgICAgInNpbmdsZWNvbW1lbnQiIDogWyIvLyIsICIjIl0sCiAgICAgICJvcGVyYXRvcnMiIDogWyI9Il0KICAgIH0sCiAgICBtc2dlbm55OiB7CiAgICAgICJrZXl3b3JkcyIgOiBudWxsLAogICAgICAib3B0aW9ucyIgOiBbImhzY2FsZSIsICJ3aWR0aCIsICJhcmNncmFkaWVudCIsICJ3b3Jkd3JhcGFyY3MiLCAid2F0ZXJtYXJrIl0sCiAgICAgICJhdHRyaWJ1dGVzIiA6IG51bGwsCiAgICAgICJicmFja2V0cyIgOiBbIlxceyIsICJcXH0iXSwKICAgICAgImFyY3NXb3JkcyIgOiBbIm5vdGUiLCAiYWJveCIsICJyYm94IiwgImJveCIsICJhbHQiLCAiZWxzZSIsICJvcHQiLCAiYnJlYWsiLCAicGFyIiwgInNlcSIsICJzdHJpY3QiLCAibmVnIiwgImNyaXRpY2FsIiwgImlnbm9yZSIsICJjb25zaWRlciIsICJhc3NlcnQiLCAibG9vcCIsICJyZWYiLCAiZXhjIl0sCiAgICAgICJhcmNzT3RoZXJzIiA6IFsiXFx8XFx8XFx8IiwgIlxcLlxcLlxcLiIsICItLS0iLCAiLS0iLCAiPC0+IiwgIj09IiwgIjw8PT4+IiwgIjw9PiIsICJcXC5cXC4iLCAiPDw+PiIsICI6OiIsICI8Oj4iLCAiLT4iLCAiPT4+IiwgIj0+IiwgIj4+IiwgIjo+IiwgIjwtIiwgIjw8PSIsICI8PSIsICI8PCIsICI8OiIsICJ4LSIsICIteCJdLAogICAgICAic2luZ2xlY29tbWVudCIgOiBbIi8vIiwgIiMiXSwKICAgICAgIm9wZXJhdG9ycyIgOiBbIj0iXQogICAgfQogIH0KCiAgQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJtc2NnZW4iLCBmdW5jdGlvbihfLCBtb2RlQ29uZmlnKSB7CiAgICB2YXIgbGFuZ3VhZ2UgPSBsYW5ndWFnZXNbbW9kZUNvbmZpZyAmJiBtb2RlQ29uZmlnLmxhbmd1YWdlIHx8ICJtc2NnZW4iXQogICAgcmV0dXJuIHsKICAgICAgc3RhcnRTdGF0ZTogc3RhcnRTdGF0ZUZuLAogICAgICBjb3B5U3RhdGU6IGNvcHlTdGF0ZUZuLAogICAgICB0b2tlbjogcHJvZHVjZVRva2VuRnVuY3Rpb24obGFuZ3VhZ2UpLAogICAgICBsaW5lQ29tbWVudCA6ICIjIiwKICAgICAgYmxvY2tDb21tZW50U3RhcnQgOiAiLyoiLAogICAgICBibG9ja0NvbW1lbnRFbmQgOiAiKi8iCiAgICB9OwogIH0pOwoKICBDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveC1tc2NnZW4iLCAibXNjZ2VuIik7CiAgQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gteHUiLCB7bmFtZTogIm1zY2dlbiIsIGxhbmd1YWdlOiAieHUifSk7CiAgQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtbXNnZW5ueSIsIHtuYW1lOiAibXNjZ2VuIiwgbGFuZ3VhZ2U6ICJtc2dlbm55In0pOwoKICBmdW5jdGlvbiB3b3JkUmVnZXhwQm91bmRhcnkocFdvcmRzKSB7CiAgICByZXR1cm4gbmV3IFJlZ0V4cCgiXFxiKCIgKyBwV29yZHMuam9pbigifCIpICsgIilcXGIiLCAiaSIpOwogIH0KCiAgZnVuY3Rpb24gd29yZFJlZ2V4cChwV29yZHMpIHsKICAgIHJldHVybiBuZXcgUmVnRXhwKCIoIiArIHBXb3Jkcy5qb2luKCJ8IikgKyAiKSIsICJpIik7CiAgfQoKICBmdW5jdGlvbiBzdGFydFN0YXRlRm4oKSB7CiAgICByZXR1cm4gewogICAgICBpbkNvbW1lbnQgOiBmYWxzZSwKICAgICAgaW5TdHJpbmcgOiBmYWxzZSwKICAgICAgaW5BdHRyaWJ1dGVMaXN0IDogZmFsc2UsCiAgICAgIGluU2NyaXB0IDogZmFsc2UKICAgIH07CiAgfQoKICBmdW5jdGlvbiBjb3B5U3RhdGVGbihwU3RhdGUpIHsKICAgIHJldHVybiB7CiAgICAgIGluQ29tbWVudCA6IHBTdGF0ZS5pbkNvbW1lbnQsCiAgICAgIGluU3RyaW5nIDogcFN0YXRlLmluU3RyaW5nLAogICAgICBpbkF0dHJpYnV0ZUxpc3QgOiBwU3RhdGUuaW5BdHRyaWJ1dGVMaXN0LAogICAgICBpblNjcmlwdCA6IHBTdGF0ZS5pblNjcmlwdAogICAgfTsKICB9CgogIGZ1bmN0aW9uIHByb2R1Y2VUb2tlbkZ1bmN0aW9uKHBDb25maWcpIHsKCiAgICByZXR1cm4gZnVuY3Rpb24ocFN0cmVhbSwgcFN0YXRlKSB7CiAgICAgIGlmIChwU3RyZWFtLm1hdGNoKHdvcmRSZWdleHAocENvbmZpZy5icmFja2V0cyksIHRydWUsIHRydWUpKSB7CiAgICAgICAgcmV0dXJuICJicmFja2V0IjsKICAgICAgfQogICAgICAvKiBjb21tZW50cyAqLwogICAgICBpZiAoIXBTdGF0ZS5pbkNvbW1lbnQpIHsKICAgICAgICBpZiAocFN0cmVhbS5tYXRjaCgvXC9cKlteXCpcL10qLywgdHJ1ZSwgdHJ1ZSkpIHsKICAgICAgICAgIHBTdGF0ZS5pbkNvbW1lbnQgPSB0cnVlOwogICAgICAgICAgcmV0dXJuICJjb21tZW50IjsKICAgICAgICB9CiAgICAgICAgaWYgKHBTdHJlYW0ubWF0Y2god29yZFJlZ2V4cChwQ29uZmlnLnNpbmdsZWNvbW1lbnQpLCB0cnVlLCB0cnVlKSkgewogICAgICAgICAgcFN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgICAgIHJldHVybiAiY29tbWVudCI7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChwU3RhdGUuaW5Db21tZW50KSB7CiAgICAgICAgaWYgKHBTdHJlYW0ubWF0Y2goL1teXCpcL10qXCpcLy8sIHRydWUsIHRydWUpKQogICAgICAgICAgcFN0YXRlLmluQ29tbWVudCA9IGZhbHNlOwogICAgICAgIGVsc2UKICAgICAgICAgIHBTdHJlYW0uc2tpcFRvRW5kKCk7CiAgICAgICAgcmV0dXJuICJjb21tZW50IjsKICAgICAgfQogICAgICAvKiBzdHJpbmdzICovCiAgICAgIGlmICghcFN0YXRlLmluU3RyaW5nICYmIHBTdHJlYW0ubWF0Y2goL1wiKFxcXCJ8W15cIl0pKi8sIHRydWUsIHRydWUpKSB7CiAgICAgICAgcFN0YXRlLmluU3RyaW5nID0gdHJ1ZTsKICAgICAgICByZXR1cm4gInN0cmluZyI7CiAgICAgIH0KICAgICAgaWYgKHBTdGF0ZS5pblN0cmluZykgewogICAgICAgIGlmIChwU3RyZWFtLm1hdGNoKC9bXlwiXSpcIi8sIHRydWUsIHRydWUpKQogICAgICAgICAgcFN0YXRlLmluU3RyaW5nID0gZmFsc2U7CiAgICAgICAgZWxzZQogICAgICAgICAgcFN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgICByZXR1cm4gInN0cmluZyI7CiAgICAgIH0KICAgICAgLyoga2V5d29yZHMgJiBvcGVyYXRvcnMgKi8KICAgICAgaWYgKCEhcENvbmZpZy5rZXl3b3JkcyAmJiBwU3RyZWFtLm1hdGNoKHdvcmRSZWdleHBCb3VuZGFyeShwQ29uZmlnLmtleXdvcmRzKSwgdHJ1ZSwgdHJ1ZSkpCiAgICAgICAgcmV0dXJuICJrZXl3b3JkIjsKCiAgICAgIGlmIChwU3RyZWFtLm1hdGNoKHdvcmRSZWdleHBCb3VuZGFyeShwQ29uZmlnLm9wdGlvbnMpLCB0cnVlLCB0cnVlKSkKICAgICAgICByZXR1cm4gImtleXdvcmQiOwoKICAgICAgaWYgKHBTdHJlYW0ubWF0Y2god29yZFJlZ2V4cEJvdW5kYXJ5KHBDb25maWcuYXJjc1dvcmRzKSwgdHJ1ZSwgdHJ1ZSkpCiAgICAgICAgcmV0dXJuICJrZXl3b3JkIjsKCiAgICAgIGlmIChwU3RyZWFtLm1hdGNoKHdvcmRSZWdleHAocENvbmZpZy5hcmNzT3RoZXJzKSwgdHJ1ZSwgdHJ1ZSkpCiAgICAgICAgcmV0dXJuICJrZXl3b3JkIjsKCiAgICAgIGlmICghIXBDb25maWcub3BlcmF0b3JzICYmIHBTdHJlYW0ubWF0Y2god29yZFJlZ2V4cChwQ29uZmlnLm9wZXJhdG9ycyksIHRydWUsIHRydWUpKQogICAgICAgIHJldHVybiAib3BlcmF0b3IiOwoKICAgICAgLyogYXR0cmlidXRlIGxpc3RzICovCiAgICAgIGlmICghcENvbmZpZy5pbkF0dHJpYnV0ZUxpc3QgJiYgISFwQ29uZmlnLmF0dHJpYnV0ZXMgJiYgcFN0cmVhbS5tYXRjaCgvXFsvLCB0cnVlLCB0cnVlKSkgewogICAgICAgIHBDb25maWcuaW5BdHRyaWJ1dGVMaXN0ID0gdHJ1ZTsKICAgICAgICByZXR1cm4gImJyYWNrZXQiOwogICAgICB9CiAgICAgIGlmIChwQ29uZmlnLmluQXR0cmlidXRlTGlzdCkgewogICAgICAgIGlmIChwQ29uZmlnLmF0dHJpYnV0ZXMgIT09IG51bGwgJiYgcFN0cmVhbS5tYXRjaCh3b3JkUmVnZXhwQm91bmRhcnkocENvbmZpZy5hdHRyaWJ1dGVzKSwgdHJ1ZSwgdHJ1ZSkpIHsKICAgICAgICAgIHJldHVybiAiYXR0cmlidXRlIjsKICAgICAgICB9CiAgICAgICAgaWYgKHBTdHJlYW0ubWF0Y2goL10vLCB0cnVlLCB0cnVlKSkgewogICAgICAgICAgcENvbmZpZy5pbkF0dHJpYnV0ZUxpc3QgPSBmYWxzZTsKICAgICAgICAgIHJldHVybiAiYnJhY2tldCI7CiAgICAgICAgfQogICAgICB9CgogICAgICBwU3RyZWFtLm5leHQoKTsKICAgICAgcmV0dXJuICJiYXNlIjsKICAgIH07CiAgfQoKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/mscgen/mscgen_test.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24oKSB7CiAgdmFyIG1vZGUgPSBDb2RlTWlycm9yLmdldE1vZGUoe2luZGVudFVuaXQ6IDJ9LCAibXNjZ2VuIik7CiAgZnVuY3Rpb24gTVQobmFtZSkgeyB0ZXN0Lm1vZGUobmFtZSwgbW9kZSwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7IH0KCiAgTVQoImVtcHR5IGNoYXJ0IiwKICAgICAiW2tleXdvcmQgbXNjXVticmFja2V0IHtdIiwKICAgICAiW2Jhc2UgICBdIiwKICAgICAiW2JyYWNrZXQgfV0iCiAgICk7CgogIE1UKCJjb21tZW50cyIsCiAgICAiW2NvbW1lbnQgLy8gYSBzaW5nbGUgbGluZSBjb21tZW50XSIsCiAgICAiW2NvbW1lbnQgIyBhbm90aGVyICBzaW5nbGUgbGluZSBjb21tZW50IC8qIGFuZCAqLyBpZ25vcmVkIGhlcmVdIiwKICAgICJbY29tbWVudCAvKiBBIG11bHRpLWxpbmUgY29tbWVudCBldmVuIHRob3VnaCBpdCBjb250YWluc10iLAogICAgIltjb21tZW50IG1zYyBrZXl3b3JkcyBhbmQgXCJxdW90ZWQgdGV4dFwiKi9dIik7CgogIE1UKCJzdHJpbmdzIiwKICAgICJbc3RyaW5nIFwiLy8gYSBzdHJpbmdcIl0iLAogICAgIltzdHJpbmcgXCJhIHN0cmluZyBydW5uaW5nIG92ZXJdIiwKICAgICJbc3RyaW5nIHR3byBsaW5lc1wiXSIsCiAgICAiW3N0cmluZyBcIndpdGggXFxcImVzY2FwZWQgcXVvdGVcIl0iCiAgKTsKCiAgTVQoInjDuS8gbXNnZW5ueSBrZXl3b3JkcyBjbGFzc2lmeSBhcyAnYmFzZSciLAogICAgIltiYXNlIHdhdGVybWFya10iLAogICAgIltiYXNlIGFsdCBsb29wIG9wdCByZWYgZWxzZSBicmVhayBwYXIgc2VxIGFzc2VydF0iCiAgKTsKCiAgTVQoIm1zY2dlbiBvcHRpb25zIGNsYXNzaWZ5IGFzIGtleXdvcmQiLAogICAgIltrZXl3b3JkIGhzY2FsZV0iLCAiW2tleXdvcmQgd2lkdGhdIiwgIltrZXl3b3JkIGFyY2dyYWRpZW50XSIsICJba2V5d29yZCB3b3Jkd3JhcGFyY3NdIgogICk7CgogIE1UKCJtc2NnZW4gYXJjcyBjbGFzc2lmeSBhcyBrZXl3b3JkIiwKICAgICJba2V5d29yZCBub3RlXSIsIltrZXl3b3JkIGFib3hdIiwiW2tleXdvcmQgcmJveF0iLCJba2V5d29yZCBib3hdIiwKICAgICJba2V5d29yZCB8fHwuLi4tLS1dIiwgIltrZXl3b3JkIC4uLS09PTo6XSIsCiAgICAiW2tleXdvcmQgLT5dIiwgIltrZXl3b3JkIDwtXSIsICJba2V5d29yZCA8LT5dIiwKICAgICJba2V5d29yZCA9Pl0iLCAiW2tleXdvcmQgPD1dIiwgIltrZXl3b3JkIDw9Pl0iLAogICAgIltrZXl3b3JkID0+Pl0iLCAiW2tleXdvcmQgPDw9XSIsICJba2V5d29yZCA8PD0+Pl0iLAogICAgIltrZXl3b3JkID4+XSIsICJba2V5d29yZCA8PF0iLCAiW2tleXdvcmQgPDw+Pl0iLAogICAgIltrZXl3b3JkIC14XSIsICJba2V5d29yZCB4LV0iLCAiW2tleXdvcmQgLVhdIiwgIltrZXl3b3JkIFgtXSIsCiAgICAiW2tleXdvcmQgOj5dIiwgIltrZXl3b3JkIDw6XSIsICJba2V5d29yZCA8Oj5dIgogICk7CgogIE1UKCJ3aXRoaW4gYW4gYXR0cmlidXRlIGxpc3QsIGF0dHJpYnV0ZXMgY2xhc3NpZnkgYXMgYXR0cmlidXRlIiwKICAgICJbYnJhY2tldCBbW11bYXR0cmlidXRlIGxhYmVsXSIsCiAgICAiW2F0dHJpYnV0ZSBpZF0iLCJbYXR0cmlidXRlIHVybF0iLCJbYXR0cmlidXRlIGlkdXJsXSIsCiAgICAiW2F0dHJpYnV0ZSBsaW5lY29sb3JdIiwiW2F0dHJpYnV0ZSBsaW5lY29sb3VyXSIsIlthdHRyaWJ1dGUgdGV4dGNvbG9yXSIsIlthdHRyaWJ1dGUgdGV4dGNvbG91cl0iLCJbYXR0cmlidXRlIHRleHRiZ2NvbG9yXSIsIlthdHRyaWJ1dGUgdGV4dGJnY29sb3VyXSIsCiAgICAiW2F0dHJpYnV0ZSBhcmNsaW5lY29sb3JdIiwiW2F0dHJpYnV0ZSBhcmNsaW5lY29sb3VyXSIsIlthdHRyaWJ1dGUgYXJjdGV4dGNvbG9yXSIsIlthdHRyaWJ1dGUgYXJjdGV4dGNvbG91cl0iLCJbYXR0cmlidXRlIGFyY3RleHRiZ2NvbG9yXSIsIlthdHRyaWJ1dGUgYXJjdGV4dGJnY29sb3VyXSIsCiAgICAiW2F0dHJpYnV0ZSBhcmNza2lwXVticmFja2V0IF1dXSIKICApOwoKICBNVCgib3V0c2lkZSBhbiBhdHRyaWJ1dGUgbGlzdCwgYXR0cmlidXRlcyBjbGFzc2lmeSBhcyBiYXNlIiwKICAgICJbYmFzZSBsYWJlbF0iLAogICAgIltiYXNlIGlkXSIsIltiYXNlIHVybF0iLCJbYmFzZSBpZHVybF0iLAogICAgIltiYXNlIGxpbmVjb2xvcl0iLCJbYmFzZSBsaW5lY29sb3VyXSIsIltiYXNlIHRleHRjb2xvcl0iLCJbYmFzZSB0ZXh0Y29sb3VyXSIsIltiYXNlIHRleHRiZ2NvbG9yXSIsIltiYXNlIHRleHRiZ2NvbG91cl0iLAogICAgIltiYXNlIGFyY2xpbmVjb2xvcl0iLCJbYmFzZSBhcmNsaW5lY29sb3VyXSIsIltiYXNlIGFyY3RleHRjb2xvcl0iLCJbYmFzZSBhcmN0ZXh0Y29sb3VyXSIsIltiYXNlIGFyY3RleHRiZ2NvbG9yXSIsIltiYXNlIGFyY3RleHRiZ2NvbG91cl0iLAogICAgIltiYXNlIGFyY3NraXBdIgogICk7CgogIE1UKCJhIHR5cGljYWwgcHJvZ3JhbSIsCiAgICAiW2NvbW1lbnQgIyB0eXBpY2FsIG1zY2dlbiBwcm9ncmFtXSIsCiAgICAiW2tleXdvcmQgbXNjXVtiYXNlICBdW2JyYWNrZXQge10iLAogICAgIltrZXl3b3JkIHdvcmR3cmFwYXJjc11bb3BlcmF0b3IgPV1bc3RyaW5nIFwidHJ1ZVwiXVtiYXNlICwgXVtrZXl3b3JkIGhzY2FsZV1bb3BlcmF0b3IgPV1bc3RyaW5nIFwiMC44XCJdW2tleXdvcmQgYXJjZ3JhZGllbnRdW29wZXJhdG9yID1dW2Jhc2UgMzA7XSIsCiAgICAiW2Jhc2UgICBhXVticmFja2V0IFtbXVthdHRyaWJ1dGUgbGFiZWxdW29wZXJhdG9yID1dW3N0cmluZyBcIkVudGl0eSBBXCJdW2JyYWNrZXQgXV1dW2Jhc2UgLF0iLAogICAgIltiYXNlICAgYl1bYnJhY2tldCBbW11bYXR0cmlidXRlIGxhYmVsXVtvcGVyYXRvciA9XVtzdHJpbmcgXCJFbnRpdHkgQlwiXVticmFja2V0IF1dXVtiYXNlICxdIiwKICAgICJbYmFzZSAgIGNdW2JyYWNrZXQgW1tdW2F0dHJpYnV0ZSBsYWJlbF1bb3BlcmF0b3IgPV1bc3RyaW5nIFwiRW50aXR5IENcIl1bYnJhY2tldCBdXV1bYmFzZSA7XSIsCiAgICAiW2Jhc2UgICBhIF1ba2V5d29yZCA9Pj5dW2Jhc2UgIGJdW2JyYWNrZXQgW1tdW2F0dHJpYnV0ZSBsYWJlbF1bb3BlcmF0b3IgPV1bc3RyaW5nIFwiSGVsbG8gZW50aXR5IEJcIl1bYnJhY2tldCBdXV1bYmFzZSA7XSIsCiAgICAiW2Jhc2UgICBhIF1ba2V5d29yZCA8PF1bYmFzZSAgYl1bYnJhY2tldCBbW11bYXR0cmlidXRlIGxhYmVsXVtvcGVyYXRvciA9XVtzdHJpbmcgXCJIZXJlJ3MgYW4gYW5zd2VyIGR1ZGUhXCJdW2JyYWNrZXQgXV1dW2Jhc2UgO10iLAogICAgIltiYXNlICAgYyBdW2tleXdvcmQgOj5dW2Jhc2UgICpdW2JyYWNrZXQgW1tdW2F0dHJpYnV0ZSBsYWJlbF1bb3BlcmF0b3IgPV1bc3RyaW5nIFwiV2hhdCBhYm91dCBtZT9cIl1bYmFzZSAsIF1bYXR0cmlidXRlIHRleHRjb2xvcl1bb3BlcmF0b3IgPV1bYmFzZSByZWRdW2JyYWNrZXQgXV1dW2Jhc2UgO10iLAogICAgIlticmFja2V0IH1dIgogICk7Cn0pKCk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/mscgen/msgenny_test.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24oKSB7CiAgdmFyIG1vZGUgPSBDb2RlTWlycm9yLmdldE1vZGUoe2luZGVudFVuaXQ6IDJ9LCAidGV4dC94LW1zZ2VubnkiKTsKICBmdW5jdGlvbiBNVChuYW1lKSB7IHRlc3QubW9kZShuYW1lLCBtb2RlLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpLCAibXNnZW5ueSIpOyB9CgogIE1UKCJjb21tZW50cyIsCiAgICAiW2NvbW1lbnQgLy8gYSBzaW5nbGUgbGluZSBjb21tZW50XSIsCiAgICAiW2NvbW1lbnQgIyBhbm90aGVyICBzaW5nbGUgbGluZSBjb21tZW50IC8qIGFuZCAqLyBpZ25vcmVkIGhlcmVdIiwKICAgICJbY29tbWVudCAvKiBBIG11bHRpLWxpbmUgY29tbWVudCBldmVuIHRob3VnaCBpdCBjb250YWluc10iLAogICAgIltjb21tZW50IG1zYyBrZXl3b3JkcyBhbmQgXCJxdW90ZWQgdGV4dFwiKi9dIik7CgogIE1UKCJzdHJpbmdzIiwKICAgICJbc3RyaW5nIFwiLy8gYSBzdHJpbmdcIl0iLAogICAgIltzdHJpbmcgXCJhIHN0cmluZyBydW5uaW5nIG92ZXJdIiwKICAgICJbc3RyaW5nIHR3byBsaW5lc1wiXSIsCiAgICAiW3N0cmluZyBcIndpdGggXFxcImVzY2FwZWQgcXVvdGVcIl0iCiAgKTsKCiAgTVQoInjDuS8gbXNnZW5ueSBrZXl3b3JkcyBjbGFzc2lmeSBhcyAna2V5d29yZCciLAogICAgIltrZXl3b3JkIHdhdGVybWFya10iLAogICAgIltrZXl3b3JkIGFsdF0iLCJba2V5d29yZCBsb29wXSIsIltrZXl3b3JkIG9wdF0iLCJba2V5d29yZCByZWZdIiwiW2tleXdvcmQgZWxzZV0iLCJba2V5d29yZCBicmVha10iLCJba2V5d29yZCBwYXJdIiwiW2tleXdvcmQgc2VxXSIsIltrZXl3b3JkIGFzc2VydF0iCiAgKTsKCiAgTVQoIm1zY2dlbiBvcHRpb25zIGNsYXNzaWZ5IGFzIGtleXdvcmQiLAogICAgIltrZXl3b3JkIGhzY2FsZV0iLCAiW2tleXdvcmQgd2lkdGhdIiwgIltrZXl3b3JkIGFyY2dyYWRpZW50XSIsICJba2V5d29yZCB3b3Jkd3JhcGFyY3NdIgogICk7CgogIE1UKCJtc2NnZW4gYXJjcyBjbGFzc2lmeSBhcyBrZXl3b3JkIiwKICAgICJba2V5d29yZCBub3RlXSIsIltrZXl3b3JkIGFib3hdIiwiW2tleXdvcmQgcmJveF0iLCJba2V5d29yZCBib3hdIiwKICAgICJba2V5d29yZCB8fHwuLi4tLS1dIiwgIltrZXl3b3JkIC4uLS09PTo6XSIsCiAgICAiW2tleXdvcmQgLT5dIiwgIltrZXl3b3JkIDwtXSIsICJba2V5d29yZCA8LT5dIiwKICAgICJba2V5d29yZCA9Pl0iLCAiW2tleXdvcmQgPD1dIiwgIltrZXl3b3JkIDw9Pl0iLAogICAgIltrZXl3b3JkID0+Pl0iLCAiW2tleXdvcmQgPDw9XSIsICJba2V5d29yZCA8PD0+Pl0iLAogICAgIltrZXl3b3JkID4+XSIsICJba2V5d29yZCA8PF0iLCAiW2tleXdvcmQgPDw+Pl0iLAogICAgIltrZXl3b3JkIC14XSIsICJba2V5d29yZCB4LV0iLCAiW2tleXdvcmQgLVhdIiwgIltrZXl3b3JkIFgtXSIsCiAgICAiW2tleXdvcmQgOj5dIiwgIltrZXl3b3JkIDw6XSIsICJba2V5d29yZCA8Oj5dIgogICk7CgogIE1UKCJ3aXRoaW4gYW4gYXR0cmlidXRlIGxpc3QsIG1zY2dlbi8geMO5IGF0dHJpYnV0ZXMgY2xhc3NpZnkgYXMgYmFzZSIsCiAgICAiW2Jhc2UgW1tsYWJlbF0iLAogICAgIltiYXNlIGlkdXJsIGlkIHVybF0iLAogICAgIltiYXNlIGxpbmVjb2xvciBsaW5lY29sb3VyIHRleHRjb2xvciB0ZXh0Y29sb3VyIHRleHRiZ2NvbG9yIHRleHRiZ2NvbG91cl0iLAogICAgIltiYXNlIGFyY2xpbmVjb2xvciBhcmNsaW5lY29sb3VyIGFyY3RleHRjb2xvciBhcmN0ZXh0Y29sb3VyIGFyY3RleHRiZ2NvbG9yIGFyY3RleHRiZ2NvbG91cl0iLAogICAgIltiYXNlIGFyY3NraXBdXV0iCiAgKTsKCiAgTVQoIm91dHNpZGUgYW4gYXR0cmlidXRlIGxpc3QsIG1zY2dlbi8geMO5IGF0dHJpYnV0ZXMgY2xhc3NpZnkgYXMgYmFzZSIsCiAgICAiW2Jhc2UgbGFiZWxdIiwKICAgICJbYmFzZSBpZHVybCBpZCB1cmxdIiwKICAgICJbYmFzZSBsaW5lY29sb3IgbGluZWNvbG91ciB0ZXh0Y29sb3IgdGV4dGNvbG91ciB0ZXh0Ymdjb2xvciB0ZXh0Ymdjb2xvdXJdIiwKICAgICJbYmFzZSBhcmNsaW5lY29sb3IgYXJjbGluZWNvbG91ciBhcmN0ZXh0Y29sb3IgYXJjdGV4dGNvbG91ciBhcmN0ZXh0Ymdjb2xvciBhcmN0ZXh0Ymdjb2xvdXJdIiwKICAgICJbYmFzZSBhcmNza2lwXSIKICApOwoKICBNVCgiYSB0eXBpY2FsIHByb2dyYW0iLAogICAgIltjb21tZW50ICMgdHlwaWNhbCBtc2dlbm55IHByb2dyYW1dIiwKICAgICJba2V5d29yZCB3b3Jkd3JhcGFyY3NdW29wZXJhdG9yID1dW3N0cmluZyBcInRydWVcIl1bYmFzZSAsIF1ba2V5d29yZCBoc2NhbGVdW29wZXJhdG9yID1dW3N0cmluZyBcIjAuOFwiXVtiYXNlICwgXVtrZXl3b3JkIGFyY2dyYWRpZW50XVtvcGVyYXRvciA9XVtiYXNlIDMwO10iLAogICAgIltiYXNlICAgYSA6IF1bc3RyaW5nIFwiRW50aXR5IEFcIl1bYmFzZSAsXSIsCiAgICAiW2Jhc2UgICBiIDogRW50aXR5IEIsXSIsCiAgICAiW2Jhc2UgICBjIDogRW50aXR5IEM7XSIsCiAgICAiW2Jhc2UgICBhIF1ba2V5d29yZCA9Pj5dW2Jhc2UgIGI6IF1bc3RyaW5nIFwiSGVsbG8gZW50aXR5IEJcIl1bYmFzZSA7XSIsCiAgICAiW2Jhc2UgICBhIF1ba2V5d29yZCBhbHRdW2Jhc2UgIGNdW2JyYWNrZXQge10iLAogICAgIltiYXNlICAgICBhIF1ba2V5d29yZCA8PF1bYmFzZSAgYjogXVtzdHJpbmcgXCJIZXJlJ3MgYW4gYW5zd2VyIGR1ZGUhXCJdW2Jhc2UgO10iLAogICAgIltrZXl3b3JkIC0tLV1bYmFzZSA6IF1bc3RyaW5nIFwic29ycnksIHdvbid0IG1hcmNoIC0gY29tbSBnbGl0Y2hcIl0iLAogICAgIltiYXNlICAgICBhIF1ba2V5d29yZCB4LV1bYmFzZSAgYjogXVtzdHJpbmcgXCJIZXJlJ3MgYW4gYW5zd2VyIGR1ZGUhICh3b24ndCBhcnJpdmUuLi4pXCJdW2Jhc2UgO10iLAogICAgIlticmFja2V0IH1dIiwKICAgICJbYmFzZSAgIGMgXVtrZXl3b3JkIDo+XVtiYXNlICAqOiBXaGF0IGFib3V0IG1lPztdIgogICk7Cn0pKCk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/mscgen/xu_test.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24oKSB7CiAgdmFyIG1vZGUgPSBDb2RlTWlycm9yLmdldE1vZGUoe2luZGVudFVuaXQ6IDJ9LCAidGV4dC94LXh1Iik7CiAgZnVuY3Rpb24gTVQobmFtZSkgeyB0ZXN0Lm1vZGUobmFtZSwgbW9kZSwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSwgInh1Iik7IH0KCiAgTVQoImVtcHR5IGNoYXJ0IiwKICAgICAiW2tleXdvcmQgbXNjXVticmFja2V0IHtdIiwKICAgICAiW2Jhc2UgICBdIiwKICAgICAiW2JyYWNrZXQgfV0iCiAgICk7CgogIE1UKCJjb21tZW50cyIsCiAgICAiW2NvbW1lbnQgLy8gYSBzaW5nbGUgbGluZSBjb21tZW50XSIsCiAgICAiW2NvbW1lbnQgIyBhbm90aGVyICBzaW5nbGUgbGluZSBjb21tZW50IC8qIGFuZCAqLyBpZ25vcmVkIGhlcmVdIiwKICAgICJbY29tbWVudCAvKiBBIG11bHRpLWxpbmUgY29tbWVudCBldmVuIHRob3VnaCBpdCBjb250YWluc10iLAogICAgIltjb21tZW50IG1zYyBrZXl3b3JkcyBhbmQgXCJxdW90ZWQgdGV4dFwiKi9dIik7CgogIE1UKCJzdHJpbmdzIiwKICAgICJbc3RyaW5nIFwiLy8gYSBzdHJpbmdcIl0iLAogICAgIltzdHJpbmcgXCJhIHN0cmluZyBydW5uaW5nIG92ZXJdIiwKICAgICJbc3RyaW5nIHR3byBsaW5lc1wiXSIsCiAgICAiW3N0cmluZyBcIndpdGggXFxcImVzY2FwZWQgcXVvdGVcIl0iCiAgKTsKCiAgTVQoInjDuS8gbXNnZW5ueSBrZXl3b3JkcyBjbGFzc2lmeSBhcyAna2V5d29yZCciLAogICAgIltrZXl3b3JkIHdhdGVybWFya10iLAogICAgIltrZXl3b3JkIGFsdF0iLCJba2V5d29yZCBsb29wXSIsIltrZXl3b3JkIG9wdF0iLCJba2V5d29yZCByZWZdIiwiW2tleXdvcmQgZWxzZV0iLCJba2V5d29yZCBicmVha10iLCJba2V5d29yZCBwYXJdIiwiW2tleXdvcmQgc2VxXSIsIltrZXl3b3JkIGFzc2VydF0iCiAgKTsKCiAgTVQoIm1zY2dlbiBvcHRpb25zIGNsYXNzaWZ5IGFzIGtleXdvcmQiLAogICAgIltrZXl3b3JkIGhzY2FsZV0iLCAiW2tleXdvcmQgd2lkdGhdIiwgIltrZXl3b3JkIGFyY2dyYWRpZW50XSIsICJba2V5d29yZCB3b3Jkd3JhcGFyY3NdIgogICk7CgogIE1UKCJtc2NnZW4gYXJjcyBjbGFzc2lmeSBhcyBrZXl3b3JkIiwKICAgICJba2V5d29yZCBub3RlXSIsIltrZXl3b3JkIGFib3hdIiwiW2tleXdvcmQgcmJveF0iLCJba2V5d29yZCBib3hdIiwKICAgICJba2V5d29yZCB8fHwuLi4tLS1dIiwgIltrZXl3b3JkIC4uLS09PTo6XSIsCiAgICAiW2tleXdvcmQgLT5dIiwgIltrZXl3b3JkIDwtXSIsICJba2V5d29yZCA8LT5dIiwKICAgICJba2V5d29yZCA9Pl0iLCAiW2tleXdvcmQgPD1dIiwgIltrZXl3b3JkIDw9Pl0iLAogICAgIltrZXl3b3JkID0+Pl0iLCAiW2tleXdvcmQgPDw9XSIsICJba2V5d29yZCA8PD0+Pl0iLAogICAgIltrZXl3b3JkID4+XSIsICJba2V5d29yZCA8PF0iLCAiW2tleXdvcmQgPDw+Pl0iLAogICAgIltrZXl3b3JkIC14XSIsICJba2V5d29yZCB4LV0iLCAiW2tleXdvcmQgLVhdIiwgIltrZXl3b3JkIFgtXSIsCiAgICAiW2tleXdvcmQgOj5dIiwgIltrZXl3b3JkIDw6XSIsICJba2V5d29yZCA8Oj5dIgogICk7CgogIE1UKCJ3aXRoaW4gYW4gYXR0cmlidXRlIGxpc3QsIGF0dHJpYnV0ZXMgY2xhc3NpZnkgYXMgYXR0cmlidXRlIiwKICAgICJbYnJhY2tldCBbW11bYXR0cmlidXRlIGxhYmVsXSIsCiAgICAiW2F0dHJpYnV0ZSBpZF0iLCJbYXR0cmlidXRlIHVybF0iLCJbYXR0cmlidXRlIGlkdXJsXSIsCiAgICAiW2F0dHJpYnV0ZSBsaW5lY29sb3JdIiwiW2F0dHJpYnV0ZSBsaW5lY29sb3VyXSIsIlthdHRyaWJ1dGUgdGV4dGNvbG9yXSIsIlthdHRyaWJ1dGUgdGV4dGNvbG91cl0iLCJbYXR0cmlidXRlIHRleHRiZ2NvbG9yXSIsIlthdHRyaWJ1dGUgdGV4dGJnY29sb3VyXSIsCiAgICAiW2F0dHJpYnV0ZSBhcmNsaW5lY29sb3JdIiwiW2F0dHJpYnV0ZSBhcmNsaW5lY29sb3VyXSIsIlthdHRyaWJ1dGUgYXJjdGV4dGNvbG9yXSIsIlthdHRyaWJ1dGUgYXJjdGV4dGNvbG91cl0iLCJbYXR0cmlidXRlIGFyY3RleHRiZ2NvbG9yXSIsIlthdHRyaWJ1dGUgYXJjdGV4dGJnY29sb3VyXSIsCiAgICAiW2F0dHJpYnV0ZSBhcmNza2lwXVticmFja2V0IF1dXSIKICApOwoKICBNVCgib3V0c2lkZSBhbiBhdHRyaWJ1dGUgbGlzdCwgYXR0cmlidXRlcyBjbGFzc2lmeSBhcyBiYXNlIiwKICAgICJbYmFzZSBsYWJlbF0iLAogICAgIltiYXNlIGlkXSIsIltiYXNlIHVybF0iLCJbYmFzZSBpZHVybF0iLAogICAgIltiYXNlIGxpbmVjb2xvcl0iLCJbYmFzZSBsaW5lY29sb3VyXSIsIltiYXNlIHRleHRjb2xvcl0iLCJbYmFzZSB0ZXh0Y29sb3VyXSIsIltiYXNlIHRleHRiZ2NvbG9yXSIsIltiYXNlIHRleHRiZ2NvbG91cl0iLAogICAgIltiYXNlIGFyY2xpbmVjb2xvcl0iLCJbYmFzZSBhcmNsaW5lY29sb3VyXSIsIltiYXNlIGFyY3RleHRjb2xvcl0iLCJbYmFzZSBhcmN0ZXh0Y29sb3VyXSIsIltiYXNlIGFyY3RleHRiZ2NvbG9yXSIsIltiYXNlIGFyY3RleHRiZ2NvbG91cl0iLAogICAgIltiYXNlIGFyY3NraXBdIgogICk7CgogIE1UKCJhIHR5cGljYWwgcHJvZ3JhbSIsCiAgICAiW2NvbW1lbnQgIyB0eXBpY2FsIG1zY2dlbiBwcm9ncmFtXSIsCiAgICAiW2tleXdvcmQgbXNjXVtiYXNlICBdW2JyYWNrZXQge10iLAogICAgIltrZXl3b3JkIHdvcmR3cmFwYXJjc11bb3BlcmF0b3IgPV1bc3RyaW5nIFwidHJ1ZVwiXVtrZXl3b3JkIGhzY2FsZV1bb3BlcmF0b3IgPV1bc3RyaW5nIFwiMC44XCJdW2tleXdvcmQgYXJjZ3JhZGllbnRdW29wZXJhdG9yID1dW2Jhc2UgMzA7XSIsCiAgICAiW2Jhc2UgICBhXVticmFja2V0IFtbXVthdHRyaWJ1dGUgbGFiZWxdW29wZXJhdG9yID1dW3N0cmluZyBcIkVudGl0eSBBXCJdW2JyYWNrZXQgXV1dW2Jhc2UgLF0iLAogICAgIltiYXNlICAgYl1bYnJhY2tldCBbW11bYXR0cmlidXRlIGxhYmVsXVtvcGVyYXRvciA9XVtzdHJpbmcgXCJFbnRpdHkgQlwiXVticmFja2V0IF1dXVtiYXNlICxdIiwKICAgICJbYmFzZSAgIGNdW2JyYWNrZXQgW1tdW2F0dHJpYnV0ZSBsYWJlbF1bb3BlcmF0b3IgPV1bc3RyaW5nIFwiRW50aXR5IENcIl1bYnJhY2tldCBdXV1bYmFzZSA7XSIsCiAgICAiW2Jhc2UgICBhIF1ba2V5d29yZCA9Pj5dW2Jhc2UgIGJdW2JyYWNrZXQgW1tdW2F0dHJpYnV0ZSBsYWJlbF1bb3BlcmF0b3IgPV1bc3RyaW5nIFwiSGVsbG8gZW50aXR5IEJcIl1bYnJhY2tldCBdXV1bYmFzZSA7XSIsCiAgICAiW2Jhc2UgICBhIF1ba2V5d29yZCA8PF1bYmFzZSAgYl1bYnJhY2tldCBbW11bYXR0cmlidXRlIGxhYmVsXVtvcGVyYXRvciA9XVtzdHJpbmcgXCJIZXJlJ3MgYW4gYW5zd2VyIGR1ZGUhXCJdW2JyYWNrZXQgXV1dW2Jhc2UgO10iLAogICAgIltiYXNlICAgYyBdW2tleXdvcmQgOj5dW2Jhc2UgICpdW2JyYWNrZXQgW1tdW2F0dHJpYnV0ZSBsYWJlbF1bb3BlcmF0b3IgPV1bc3RyaW5nIFwiV2hhdCBhYm91dCBtZT9cIl1bYmFzZSAsIF1bYXR0cmlidXRlIHRleHRjb2xvcl1bb3BlcmF0b3IgPV1bYmFzZSByZWRdW2JyYWNrZXQgXV1dW2Jhc2UgO10iLAogICAgIlticmFja2V0IH1dIgogICk7Cn0pKCk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/mumps/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/mumps/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[77u/PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogTVVNUFMgbW9kZTwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uLy4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxzY3JpcHQgc3JjPSIuLi8uLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJtdW1wcy5qcyI+PC9zY3JpcHQ+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+LkNvZGVNaXJyb3Ige2JvcmRlci10b3A6IDFweCBzb2xpZCBibGFjazsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO308L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxoMT5Db2RlTWlycm9yPC9oMT48aW1nIGlkPWxvZ28gc3JjPSIuLi8uLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5MYW5ndWFnZSBtb2RlczwvYT4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+TVVNUFM8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPk1VTVBTIG1vZGU8L2gyPgoKCjxkaXY+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KIDsgTGxveWQgTWlsbGlnYW4KIDsgMDMtMzAtMjAxNQogOwogOyBNVU1QUyBzdXBwb3J0IGZvciBDb2RlIE1pcnJvciAtIEV4Y2VycHRzIGJlbG93IGZyb20gcm91dGluZSBeWFVTCiA7CkNIRUNLQVYoWDEpIDtDaGVjayBBL1YgY29kZSByZXR1cm4gRFVaIG9yIFplcm8uIChDYWxsZWQgZnJvbSBYVVNSQikKIE4gJSwlMSxYLFksSUVOLERBLERJSwogUyBJRU49MAogO1N0YXJ0IENDT1cKIEkgJEUoWDEsMSw3KT0ifn5UT0t+fiIgRCAgUTpJRU4+MCBJRU4KIC4gSSAkRShYMSw4LDkpPSJ+MSIgUyBJRU49JCRDSEtBU0heWFVTUkI0KCRFKFgxLDgsMjU1KSkKIC4gSSAkRShYMSw4LDkpPSJ+MiIgUyBJRU49JCRDSEtDQ09XXlhVU1JCNCgkRShYMSw4LDI1NSkpCiAuIFEKIDtFbmQgQ0NPVwogUyBYMT0kJFVQKFgxKSBTOlgxWyI6IiBYVVRUPTEsWDE9JFRSKFgxLCI6IikKIFMgWD0kUChYMSwiOyIpIFE6WD0iXiIgLTEgUzpYVUYgJTE9IkFjY2VzczogIl9YCiBROlgnPzEuMjBBTlAgMAogUyBYPSQkRU5eWFVTSFNIKFgpIEkgJyREKF5WQSgyMDAsIkEiLFgpKSBEIExCQVYgUSAwCiBTICUxPSIiLElFTj0kTyheVkEoMjAwLCJBIixYLDApKSxYVUYoLjMpPUlFTiBEIFVTRVIoSUVOKQogUyBYPSRQKFgxLCI7IiwyKSBTOlhVRiAlMT0iVmVyaWZ5OiAiX1ggUyBYPSQkRU5eWFVTSFNIKFgpCiBJICRQKFhVU0VSKDEpLCJeIiwyKSc9WCBEIExCQVYgUSAwCiBJICRHKFhVRkFDKDEpKSBTIERJSz0iXlhVU0VDKDQsIixEQT1YVUZBQygxKSBEIF5ESUsKIFEgSUVOCiA7CiA7IFNwZWxsIG91dCBjb21tYW5kcwogOwpTRVQyKCkgO0VGLiBSZXR1cm4gZXJyb3IgY29kZSAoYWxzbyBjYWxsZWQgZnJvbSBYVVNSQikKIE5FVyAlLFgKIFNFVCBYVU5PVz0kJEhURk1eWExGRFQoJEgpLERUPSRQKFhVTk9XLCIuIikKIEtJTEwgRFVaLFhVU0VSCiBTRVQgKERVWixEVVooMikpPTAsKERVWigwKSxEVVooIkFHIiksWFVTRVIoMCksWFVTRVIoMSksWFVUVCwlVUNJKT0iIgogU0VUICU9JCRJTkhJQklUXlhVU1JCKCkgSUYgJT4wIFFVSVQgJQogU0VUIFg9JEcoXiVaSVMoMSxYVURFViwiWFVTIikpLFhVMT0kRyheKDEpKQogSUYgJEwoWCkgRk9SIEk9MToxOjE1IElGICRMKCRQKFgsVSxJKSkgU0VUICRQKFhPUFQsVSxJKT0kUChYLFUsSSkKIFNFVCBEVElNRT02MDAKIElGICckUChYT1BULFUsMTEpLCREKF4lWklTKDEsWFVERVYsOTApKSxeKDkwKT4yODAwMDAwLF4oOTApJz5EVCBRVUlUIDgKIFFVSVQgMAogOwogOyBTcGVsbCBvdXQgY29tbWFuZHMgYW5kIGZ1bmN0aW9ucwogOwogSUYgJFBJRUNFKFhVU0VSKDApLFUsMTEpLCRQSUVDRShYVVNFUigwKSxVLDExKSc+RFQgUVVJVCAxMSA7VGVybWluYXRlZAogSUYgJERBVEEoRFVaKCJBU0giKSkgUVVJVCAwIDtJZiBhdXRvIGhhbmRsZSwgQWxsb3cgdG8gc2lnbi1vbiBwNDM0CiBJRiAkUElFQ0UoWFVTRVIoMCksVSw3KSBRVUlUIDUgO0Rpc3VzZXIgZmxhZyBzZXQKIElGICckTEVOR1RIKCRQSUVDRShYVVNFUigxKSxVLDIpKSBRVUlUIDIxIDtwNDE5LCBwNDM0CiBRIDAKIDsKICA8L3RleHRhcmVhPjwvZGl2PgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICAgbW9kZTogIm11bXBzIiwKICAgICAgICAgbGluZU51bWJlcnM6IHRydWUsCiAgICAgICAgIGxpbmVXcmFwcGluZzogdHJ1ZQogICAgICB9KTsKICAgIDwvc2NyaXB0PgoKICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/mumps/mumps.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovKgogIFRoaXMgTVVNUFMgTGFuZ3VhZ2Ugc2NyaXB0IHdhcyBjb25zdHJ1Y3RlZCB1c2luZyB2YnNjcmlwdC5qcyBhcyBhIHRlbXBsYXRlLgoqLwoKKGZ1bmN0aW9uKG1vZCkgewogIGlmICh0eXBlb2YgZXhwb3J0cyA9PSAib2JqZWN0IiAmJiB0eXBlb2YgbW9kdWxlID09ICJvYmplY3QiKSAvLyBDb21tb25KUwogICAgbW9kKHJlcXVpcmUoIi4uLy4uL2xpYi9jb2RlbWlycm9yIikpOwogIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kKSAvLyBBTUQKICAgIGRlZmluZShbIi4uLy4uL2xpYi9jb2RlbWlycm9yIl0sIG1vZCk7CiAgZWxzZSAvLyBQbGFpbiBicm93c2VyIGVudgogICAgbW9kKENvZGVNaXJyb3IpOwp9KShmdW5jdGlvbihDb2RlTWlycm9yKSB7CiAgInVzZSBzdHJpY3QiOwoKICBDb2RlTWlycm9yLmRlZmluZU1vZGUoIm11bXBzIiwgZnVuY3Rpb24oKSB7CiAgICBmdW5jdGlvbiB3b3JkUmVnZXhwKHdvcmRzKSB7CiAgICAgIHJldHVybiBuZXcgUmVnRXhwKCJeKCgiICsgd29yZHMuam9pbigiKXwoIikgKyAiKSlcXGIiLCAiaSIpOwogICAgfQoKICAgIHZhciBzaW5nbGVPcGVyYXRvcnMgPSBuZXcgUmVnRXhwKCJeW1xcK1xcLVxcKi8mIyFfP1xcXFw8Pj1cXCdcXFtcXF1dIik7CiAgICB2YXIgZG91YmxlT3BlcmF0b3JzID0gbmV3IFJlZ0V4cCgiXigoJz0pfCg8PSl8KD49KXwoJz4pfCgnPCl8KFtbKXwoXV0pfCheJCkpIik7CiAgICB2YXIgc2luZ2xlRGVsaW1pdGVycyA9IG5ldyBSZWdFeHAoIl5bXFwuLDpdIik7CiAgICB2YXIgYnJhY2tldHMgPSBuZXcgUmVnRXhwKCJbKCldIik7CiAgICB2YXIgaWRlbnRpZmllcnMgPSBuZXcgUmVnRXhwKCJeWyVBLVphLXpdW0EtWmEtejAtOV0qIik7CiAgICB2YXIgY29tbWFuZEtleXdvcmRzID0gWyJicmVhayIsImNsb3NlIiwiZG8iLCJlbHNlIiwiZm9yIiwiZ290byIsICJoYWx0IiwgImhhbmciLCAiaWYiLCAiam9iIiwia2lsbCIsImxvY2siLCJtZXJnZSIsIm5ldyIsIm9wZW4iLCAicXVpdCIsICJyZWFkIiwgInNldCIsICJ0Y29tbWl0IiwgInRyb2xsYmFjayIsICJ0c3RhcnQiLCAidXNlIiwgInZpZXciLCAid3JpdGUiLCAieGVjdXRlIiwgImIiLCJjIiwiZCIsImUiLCJmIiwiZyIsICJoIiwgImkiLCAiaiIsImsiLCJsIiwibSIsIm4iLCJvIiwgInEiLCAiciIsICJzIiwgInRjIiwgInRybyIsICJ0cyIsICJ1IiwgInYiLCAidyIsICJ4Il07CiAgICAvLyBUaGUgZm9sbG93aW5nIGxpc3QgaW5jbHVkZXMgaW5zdHJpbnNpYyBmdW5jdGlvbnMgX2FuZF8gc3BlY2lhbCB2YXJpYWJsZXMKICAgIHZhciBpbnRyaW5zaWNGdW5jc1dvcmRzID0gWyJcXCRhc2NpaSIsICJcXCRjaGFyIiwgIlxcJGRhdGEiLCAiXFwkZWNvZGUiLCAiXFwkZXN0YWNrIiwgIlxcJGV0cmFwIiwgIlxcJGV4dHJhY3QiLCAiXFwkZmluZCIsICJcXCRmbnVtYmVyIiwgIlxcJGdldCIsICJcXCRob3JvbG9nIiwgIlxcJGlvIiwgIlxcJGluY3JlbWVudCIsICJcXCRqb2IiLCAiXFwkanVzdGlmeSIsICJcXCRsZW5ndGgiLCAiXFwkbmFtZSIsICJcXCRuZXh0IiwgIlxcJG9yZGVyIiwgIlxcJHBpZWNlIiwgIlxcJHFsZW5ndGgiLCAiXFwkcXN1YnNjcmlwdCIsICJcXCRxdWVyeSIsICJcXCRxdWl0IiwgIlxcJHJhbmRvbSIsICJcXCRyZXZlcnNlIiwgIlxcJHNlbGVjdCIsICJcXCRzdGFjayIsICJcXCR0ZXN0IiwgIlxcJHRleHQiLCAiXFwkdHJhbnNsYXRlIiwgIlxcJHZpZXciLCAiXFwkeCIsICJcXCR5IiwgIlxcJGEiLCAiXFwkYyIsICJcXCRkIiwgIlxcJGUiLCAiXFwkZWMiLCAiXFwkZXMiLCAiXFwkZXQiLCAiXFwkZiIsICJcXCRmbiIsICJcXCRnIiwgIlxcJGgiLCAiXFwkaSIsICJcXCRqIiwgIlxcJGwiLCAiXFwkbiIsICJcXCRuYSIsICJcXCRvIiwgIlxcJHAiLCAiXFwkcSIsICJcXCRxbCIsICJcXCRxcyIsICJcXCRyIiwgIlxcJHJlIiwgIlxcJHMiLCAiXFwkc3QiLCAiXFwkdCIsICJcXCR0ciIsICJcXCR2IiwgIlxcJHoiXTsKICAgIHZhciBpbnRyaW5zaWNGdW5jcyA9IHdvcmRSZWdleHAoaW50cmluc2ljRnVuY3NXb3Jkcyk7CiAgICB2YXIgY29tbWFuZCA9IHdvcmRSZWdleHAoY29tbWFuZEtleXdvcmRzKTsKCiAgICBmdW5jdGlvbiB0b2tlbkJhc2Uoc3RyZWFtLCBzdGF0ZSkgewogICAgICBpZiAoc3RyZWFtLnNvbCgpKSB7CiAgICAgICAgc3RhdGUubGFiZWwgPSB0cnVlOwogICAgICAgIHN0YXRlLmNvbW1hbmRNb2RlID0gMDsKICAgICAgfQoKICAgICAgLy8gVGhlIDxzcGFjZT4gY2hhcmFjdGVyIGhhcyBtZWFuaW5nIGluIE1VTVBTLiBJZ25vcmluZyBjb25zZWN1dGl2ZQogICAgICAvLyBzcGFjZXMgd291bGQgaW50ZXJmZXJlIHdpdGggaW50ZXJwcmV0aW5nIHdoZXRoZXIgdGhlIG5leHQgbm9uLXNwYWNlCiAgICAgIC8vIGNoYXJhY3RlciBiZWxvbmdzIHRvIHRoZSBjb21tYW5kIG9yIGFyZ3VtZW50IGNvbnRleHQuCgogICAgICAvLyBFeGFtaW5lIGVhY2ggY2hhcmFjdGVyIGFuZCB1cGRhdGUgYSBtb2RlIHZhcmlhYmxlIHdob3NlIGludGVycHJldGF0aW9uIGlzOgogICAgICAvLyAgID4wID0+IGNvbW1hbmQgICAgMCA9PiBhcmd1bWVudCAgICA8MCA9PiBjb21tYW5kIHBvc3QtY29uZGl0aW9uYWwKICAgICAgdmFyIGNoID0gc3RyZWFtLnBlZWsoKTsKCiAgICAgIGlmIChjaCA9PSAiICIgfHwgY2ggPT0gIlx0IikgeyAvLyBQcmUtcHJvY2VzcyA8c3BhY2U+CiAgICAgICAgc3RhdGUubGFiZWwgPSBmYWxzZTsKICAgICAgICBpZiAoc3RhdGUuY29tbWFuZE1vZGUgPT0gMCkKICAgICAgICAgIHN0YXRlLmNvbW1hbmRNb2RlID0gMTsKICAgICAgICBlbHNlIGlmICgoc3RhdGUuY29tbWFuZE1vZGUgPCAwKSB8fCAoc3RhdGUuY29tbWFuZE1vZGUgPT0gMikpCiAgICAgICAgICBzdGF0ZS5jb21tYW5kTW9kZSA9IDA7CiAgICAgIH0gZWxzZSBpZiAoKGNoICE9ICIuIikgJiYgKHN0YXRlLmNvbW1hbmRNb2RlID4gMCkpIHsKICAgICAgICBpZiAoY2ggPT0gIjoiKQogICAgICAgICAgc3RhdGUuY29tbWFuZE1vZGUgPSAtMTsgICAvLyBTSVMgLSBDb21tYW5kIHBvc3QtY29uZGl0aW9uYWwKICAgICAgICBlbHNlCiAgICAgICAgICBzdGF0ZS5jb21tYW5kTW9kZSA9IDI7CiAgICAgIH0KCiAgICAgIC8vIERvIG5vdCBjb2xvciBwYXJhbWV0ZXIgbGlzdCBhcyBsaW5lIHRhZwogICAgICBpZiAoKGNoID09PSAiKCIpIHx8IChjaCA9PT0gIlx1MDAwOSIpKQogICAgICAgIHN0YXRlLmxhYmVsID0gZmFsc2U7CgogICAgICAvLyBNVU1QUyBjb21tZW50IHN0YXJ0cyB3aXRoICI7IgogICAgICBpZiAoY2ggPT09ICI7IikgewogICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgICByZXR1cm4gImNvbW1lbnQiOwogICAgICB9CgogICAgICAvLyBOdW1iZXIgTGl0ZXJhbHMgLy8gU0lTL1JMTSAtIE1VTVBTIHBlcm1pdHMgY2Fub25pYyBudW1iZXIgZm9sbG93ZWQgYnkgY29uY2F0ZW5hdGUgb3BlcmF0b3IKICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXlstK10/XGQrKFwuXGQrKT8oW2VFXVstK10/XGQrKT8vKSkKICAgICAgICByZXR1cm4gIm51bWJlciI7CgogICAgICAvLyBIYW5kbGUgU3RyaW5ncwogICAgICBpZiAoY2ggPT0gJyInKSB7CiAgICAgICAgaWYgKHN0cmVhbS5za2lwVG8oJyInKSkgewogICAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgICAgIHJldHVybiAic3RyaW5nIjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICAgICAgcmV0dXJuICJlcnJvciI7CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyBIYW5kbGUgb3BlcmF0b3JzIGFuZCBEZWxpbWl0ZXJzCiAgICAgIGlmIChzdHJlYW0ubWF0Y2goZG91YmxlT3BlcmF0b3JzKSB8fCBzdHJlYW0ubWF0Y2goc2luZ2xlT3BlcmF0b3JzKSkKICAgICAgICByZXR1cm4gIm9wZXJhdG9yIjsKCiAgICAgIC8vIFByZXZlbnRzIGxlYWRpbmcgIi4iIGluIERPIGJsb2NrIGZyb20gZmFsbGluZyB0aHJvdWdoIHRvIGVycm9yCiAgICAgIGlmIChzdHJlYW0ubWF0Y2goc2luZ2xlRGVsaW1pdGVycykpCiAgICAgICAgcmV0dXJuIG51bGw7CgogICAgICBpZiAoYnJhY2tldHMudGVzdChjaCkpIHsKICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgIHJldHVybiAiYnJhY2tldCI7CiAgICAgIH0KCiAgICAgIGlmIChzdGF0ZS5jb21tYW5kTW9kZSA+IDAgJiYgc3RyZWFtLm1hdGNoKGNvbW1hbmQpKQogICAgICAgIHJldHVybiAidmFyaWFibGUtMiI7CgogICAgICBpZiAoc3RyZWFtLm1hdGNoKGludHJpbnNpY0Z1bmNzKSkKICAgICAgICByZXR1cm4gImJ1aWx0aW4iOwoKICAgICAgaWYgKHN0cmVhbS5tYXRjaChpZGVudGlmaWVycykpCiAgICAgICAgcmV0dXJuICJ2YXJpYWJsZSI7CgogICAgICAvLyBEZXRlY3QgZG9sbGFyLXNpZ24gd2hlbiBub3QgYSBkb2N1bWVudGVkIGludHJpbnNpYyBmdW5jdGlvbgogICAgICAvLyAiXiIgbWF5IGludHJvZHVjZSBhIEdWTiBvciBTU1ZOIC0gQ29sb3Igc2FtZSBhcyBmdW5jdGlvbgogICAgICBpZiAoY2ggPT09ICIkIiB8fCBjaCA9PT0gIl4iKSB7CiAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgICByZXR1cm4gImJ1aWx0aW4iOwogICAgICB9CgogICAgICAvLyBNVU1QUyBJbmRpcmVjdGlvbgogICAgICBpZiAoY2ggPT09ICJAIikgewogICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgcmV0dXJuICJzdHJpbmctMiI7CiAgICAgIH0KCiAgICAgIGlmICgvW1x3JV0vLnRlc3QoY2gpKSB7CiAgICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXHclXS8pOwogICAgICAgIHJldHVybiAidmFyaWFibGUiOwogICAgICB9CgogICAgICAvLyBIYW5kbGUgbm9uLWRldGVjdGVkIGl0ZW1zCiAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgIHJldHVybiAiZXJyb3IiOwogICAgfQoKICAgIHJldHVybiB7CiAgICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICBsYWJlbDogZmFsc2UsCiAgICAgICAgICBjb21tYW5kTW9kZTogMAogICAgICAgIH07CiAgICAgIH0sCgogICAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICAgIHZhciBzdHlsZSA9IHRva2VuQmFzZShzdHJlYW0sIHN0YXRlKTsKICAgICAgICBpZiAoc3RhdGUubGFiZWwpIHJldHVybiAidGFnIjsKICAgICAgICByZXR1cm4gc3R5bGU7CiAgICAgIH0KICAgIH07CiAgfSk7CgogIENvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC94LW11bXBzIiwgIm11bXBzIik7Cn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/nginx/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/nginx/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[77u/PCFkb2N0eXBlIGh0bWw+CjxoZWFkPgo8dGl0bGU+Q29kZU1pcnJvcjogTkdJTlggbW9kZTwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uLy4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxzY3JpcHQgc3JjPSIuLi8uLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJuZ2lueC5qcyI+PC9zY3JpcHQ+CjxzdHlsZT4uQ29kZU1pcnJvciB7YmFja2dyb3VuZDogI2Y4ZjhmODt9PC9zdHlsZT4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KICA8L2hlYWQ+CgogIDxzdHlsZT4KICAgIGJvZHkgewogICAgICBtYXJnaW46IDBlbSBhdXRvOwogICAgfQoKICAgIC5Db2RlTWlycm9yLCAuQ29kZU1pcnJvci1zY3JvbGwgewogICAgICBoZWlnaHQ6IDYwMHB4OwogICAgfQogIDwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGgxPkNvZGVNaXJyb3I8L2gxPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5OR0lOWDwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+TkdJTlggbW9kZTwvaDI+Cjxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSIgc3R5bGU9ImhlaWdodDogODAwcHg7Ij4Kc2VydmVyIHsKICBsaXN0ZW4gMTczLjI1NS4yMTkuMjM1OjgwOwogIHNlcnZlcl9uYW1lIHdlYnNpdGUuY29tLmF1OwogIHJld3JpdGUgLyAkc2NoZW1lOi8vd3d3LiRob3N0JHJlcXVlc3RfdXJpIHBlcm1hbmVudDsgIyMgRm9yY2libHkgcHJlcGVuZCBhIHd3dwp9CgpzZXJ2ZXIgewogIGxpc3RlbiAxNzMuMjU1LjIxOS4yMzU6NDQzOwogIHNlcnZlcl9uYW1lIHdlYnNpdGUuY29tLmF1OwogIHJld3JpdGUgLyAkc2NoZW1lOi8vd3d3LiRob3N0JHJlcXVlc3RfdXJpIHBlcm1hbmVudDsgIyMgRm9yY2libHkgcHJlcGVuZCBhIHd3dwp9CgpzZXJ2ZXIgewoKICBsaXN0ZW4gICAgICAxNzMuMjU1LjIxOS4yMzU6ODA7CiAgc2VydmVyX25hbWUgd3d3LndlYnNpdGUuY29tLmF1OwoKCgogIHJvb3QgICAgICAgIC9kYXRhL3d3dzsKICBpbmRleCAgICAgICBpbmRleC5odG1sIGluZGV4LnBocDsKCiAgbG9jYXRpb24gLyB7CiAgICBpbmRleCBpbmRleC5odG1sIGluZGV4LnBocDsgICAgICMjIEFsbG93IGEgc3RhdGljIGh0bWwgZmlsZSB0byBiZSBzaG93biBmaXJzdAogICAgdHJ5X2ZpbGVzICR1cmkgJHVyaS8gQGhhbmRsZXI7ICAjIyBJZiBtaXNzaW5nIHBhc3MgdGhlIFVSSSB0byBNYWdlbnRvJ3MgZnJvbnQgaGFuZGxlcgogICAgZXhwaXJlcyAzMGQ7ICAgICAgICAgICAgICAgICAgICAjIyBBc3N1bWUgYWxsIGZpbGVzIGFyZSBjYWNoYWJsZQogIH0KCiAgIyMgVGhlc2UgbG9jYXRpb25zIHdvdWxkIGJlIGhpZGRlbiBieSAuaHRhY2Nlc3Mgbm9ybWFsbHkKICBsb2NhdGlvbiAvYXBwLyAgICAgICAgICAgICAgICB7IGRlbnkgYWxsOyB9CiAgbG9jYXRpb24gL2luY2x1ZGVzLyAgICAgICAgICAgeyBkZW55IGFsbDsgfQogIGxvY2F0aW9uIC9saWIvICAgICAgICAgICAgICAgIHsgZGVueSBhbGw7IH0KICBsb2NhdGlvbiAvbWVkaWEvZG93bmxvYWRhYmxlLyB7IGRlbnkgYWxsOyB9CiAgbG9jYXRpb24gL3BrZ2luZm8vICAgICAgICAgICAgeyBkZW55IGFsbDsgfQogIGxvY2F0aW9uIC9yZXBvcnQvY29uZmlnLnhtbCAgIHsgZGVueSBhbGw7IH0KICBsb2NhdGlvbiAvdmFyLyAgICAgICAgICAgICAgICB7IGRlbnkgYWxsOyB9CgogIGxvY2F0aW9uIC92YXIvZXhwb3J0LyB7ICMjIEFsbG93IGFkbWlucyBvbmx5IHRvIHZpZXcgZXhwb3J0IGZvbGRlcgogICAgYXV0aF9iYXNpYyAgICAgICAgICAgIlJlc3RyaWN0ZWQiOyAjIyBNZXNzYWdlIHNob3duIGluIGxvZ2luIHdpbmRvdwogICAgYXV0aF9iYXNpY191c2VyX2ZpbGUgL3JzL3Bhc3N3b3Jkcy90ZXN0ZmlsZTsgIyMgU2VlIC9ldGMvbmdpbngvaHRwYXNzd29yZAogICAgYXV0b2luZGV4ICAgICAgICAgICAgb247CiAgfQoKICBsb2NhdGlvbiAgLy4geyAjIyBEaXNhYmxlIC5odGFjY2VzcyBhbmQgb3RoZXIgaGlkZGVuIGZpbGVzCiAgICByZXR1cm4gNDA0OwogIH0KCiAgbG9jYXRpb24gQGhhbmRsZXIgeyAjIyBNYWdlbnRvIHVzZXMgYSBjb21tb24gZnJvbnQgaGFuZGxlcgogICAgcmV3cml0ZSAvIC9pbmRleC5waHA7CiAgfQoKICBsb2NhdGlvbiB+IC5waHAvIHsgIyMgRm9yd2FyZCBwYXRocyBsaWtlIC9qcy9pbmRleC5waHAveC5qcyB0byByZWxldmFudCBoYW5kbGVyCiAgICByZXdyaXRlIF4vKC4qLnBocCkvIC8kMSBsYXN0OwogIH0KCiAgbG9jYXRpb24gfiBcLnBocCQgewogICAgaWYgKCEtZSAkcmVxdWVzdF9maWxlbmFtZSkgeyByZXdyaXRlIC8gL2luZGV4LnBocCBsYXN0OyB9ICMjIENhdGNoIDQwNHMgdGhhdCB0cnlfZmlsZXMgbWlzcwoKICAgIGZhc3RjZ2lfcGFzcyAgIDEyNy4wLjAuMTo5MDAwOwogICAgZmFzdGNnaV9pbmRleCAgaW5kZXgucGhwOwogICAgZmFzdGNnaV9wYXJhbSBQQVRIX0lORk8gJGZhc3RjZ2lfc2NyaXB0X25hbWU7CiAgICBmYXN0Y2dpX3BhcmFtICBTQ1JJUFRfRklMRU5BTUUgJGRvY3VtZW50X3Jvb3QkZmFzdGNnaV9zY3JpcHRfbmFtZTsKICAgIGluY2x1ZGUgICAgICAgIC9ycy9jb25mcy9uZ2lueC9mYXN0Y2dpX3BhcmFtczsKICB9Cgp9CgoKc2VydmVyIHsKCiAgbGlzdGVuICAgICAgICAgICAgICAxNzMuMjU1LjIxOS4yMzU6NDQzOwogIHNlcnZlcl9uYW1lICAgICAgICAgd2Vic2l0ZS5jb20uYXUgd3d3LndlYnNpdGUuY29tLmF1OwoKICByb290ICAgL2RhdGEvd3d3OwogIGluZGV4IGluZGV4Lmh0bWwgaW5kZXgucGhwOwoKICBzc2wgICAgICAgICAgICAgICAgIG9uOwogIHNzbF9jZXJ0aWZpY2F0ZSAgICAgL3JzL3NzbC9zc2wuY3J0OwogIHNzbF9jZXJ0aWZpY2F0ZV9rZXkgL3JzL3NzbC9zc2wua2V5OwoKICBzc2xfc2Vzc2lvbl90aW1lb3V0ICA1bTsKCiAgc3NsX3Byb3RvY29scyAgU1NMdjIgU1NMdjMgVExTdjE7CiAgc3NsX2NpcGhlcnMgIEFMTDohQURIOiFFWFBPUlQ1NjpSQzQrUlNBOitISUdIOitNRURJVU06K0xPVzorU1NMdjI6K0VYUDsKICBzc2xfcHJlZmVyX3NlcnZlcl9jaXBoZXJzICAgb247CgoKCiAgbG9jYXRpb24gLyB7CiAgICBpbmRleCBpbmRleC5odG1sIGluZGV4LnBocDsgIyMgQWxsb3cgYSBzdGF0aWMgaHRtbCBmaWxlIHRvIGJlIHNob3duIGZpcnN0CiAgICB0cnlfZmlsZXMgJHVyaSAkdXJpLyBAaGFuZGxlcjsgIyMgSWYgbWlzc2luZyBwYXNzIHRoZSBVUkkgdG8gTWFnZW50bydzIGZyb250IGhhbmRsZXIKICAgIGV4cGlyZXMgMzBkOyAjIyBBc3N1bWUgYWxsIGZpbGVzIGFyZSBjYWNoYWJsZQogIH0KCiAgIyMgVGhlc2UgbG9jYXRpb25zIHdvdWxkIGJlIGhpZGRlbiBieSAuaHRhY2Nlc3Mgbm9ybWFsbHkKICBsb2NhdGlvbiAvYXBwLyAgICAgICAgICAgICAgICB7IGRlbnkgYWxsOyB9CiAgbG9jYXRpb24gL2luY2x1ZGVzLyAgICAgICAgICAgeyBkZW55IGFsbDsgfQogIGxvY2F0aW9uIC9saWIvICAgICAgICAgICAgICAgIHsgZGVueSBhbGw7IH0KICBsb2NhdGlvbiAvbWVkaWEvZG93bmxvYWRhYmxlLyB7IGRlbnkgYWxsOyB9CiAgbG9jYXRpb24gL3BrZ2luZm8vICAgICAgICAgICAgeyBkZW55IGFsbDsgfQogIGxvY2F0aW9uIC9yZXBvcnQvY29uZmlnLnhtbCAgIHsgZGVueSBhbGw7IH0KICBsb2NhdGlvbiAvdmFyLyAgICAgICAgICAgICAgICB7IGRlbnkgYWxsOyB9CgogIGxvY2F0aW9uIC92YXIvZXhwb3J0LyB7ICMjIEFsbG93IGFkbWlucyBvbmx5IHRvIHZpZXcgZXhwb3J0IGZvbGRlcgogICAgYXV0aF9iYXNpYyAgICAgICAgICAgIlJlc3RyaWN0ZWQiOyAjIyBNZXNzYWdlIHNob3duIGluIGxvZ2luIHdpbmRvdwogICAgYXV0aF9iYXNpY191c2VyX2ZpbGUgaHRwYXNzd2Q7ICMjIFNlZSAvZXRjL25naW54L2h0cGFzc3dvcmQKICAgIGF1dG9pbmRleCAgICAgICAgICAgIG9uOwogIH0KCiAgbG9jYXRpb24gIC8uIHsgIyMgRGlzYWJsZSAuaHRhY2Nlc3MgYW5kIG90aGVyIGhpZGRlbiBmaWxlcwogICAgcmV0dXJuIDQwNDsKICB9CgogIGxvY2F0aW9uIEBoYW5kbGVyIHsgIyMgTWFnZW50byB1c2VzIGEgY29tbW9uIGZyb250IGhhbmRsZXIKICAgIHJld3JpdGUgLyAvaW5kZXgucGhwOwogIH0KCiAgbG9jYXRpb24gfiAucGhwLyB7ICMjIEZvcndhcmQgcGF0aHMgbGlrZSAvanMvaW5kZXgucGhwL3guanMgdG8gcmVsZXZhbnQgaGFuZGxlcgogICAgcmV3cml0ZSBeLyguKi5waHApLyAvJDEgbGFzdDsKICB9CgogIGxvY2F0aW9uIH4gLnBocCQgeyAjIyBFeGVjdXRlIFBIUCBzY3JpcHRzCiAgICBpZiAoIS1lICRyZXF1ZXN0X2ZpbGVuYW1lKSB7IHJld3JpdGUgIC9pbmRleC5waHAgbGFzdDsgfSAjIyBDYXRjaCA0MDRzIHRoYXQgdHJ5X2ZpbGVzIG1pc3MKCiAgICBmYXN0Y2dpX3Bhc3MgMTI3LjAuMC4xOjkwMDA7CiAgICBmYXN0Y2dpX2luZGV4ICBpbmRleC5waHA7CiAgICBmYXN0Y2dpX3BhcmFtIFBBVEhfSU5GTyAkZmFzdGNnaV9zY3JpcHRfbmFtZTsKICAgIGZhc3RjZ2lfcGFyYW0gIFNDUklQVF9GSUxFTkFNRSAkZG9jdW1lbnRfcm9vdCRmYXN0Y2dpX3NjcmlwdF9uYW1lOwogICAgaW5jbHVkZSAgICAgICAgL3JzL2NvbmZzL25naW54L2Zhc3RjZ2lfcGFyYW1zOwoKICAgIGZhc3RjZ2lfcGFyYW0gSFRUUFMgb247CiAgfQoKfQo8L3RleHRhcmVhPjwvZm9ybT4KICAgIDxzY3JpcHQ+CiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7fSk7CiAgICA8L3NjcmlwdD4KCiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC9uZ2lueDwvY29kZT4uPC9wPgoKICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/nginx/nginx.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJuZ2lueCIsIGZ1bmN0aW9uKGNvbmZpZykgewoKICBmdW5jdGlvbiB3b3JkcyhzdHIpIHsKICAgIHZhciBvYmogPSB7fSwgd29yZHMgPSBzdHIuc3BsaXQoIiAiKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgd29yZHMubGVuZ3RoOyArK2kpIG9ialt3b3Jkc1tpXV0gPSB0cnVlOwogICAgcmV0dXJuIG9iajsKICB9CgogIHZhciBrZXl3b3JkcyA9IHdvcmRzKAogICAgLyogbmd4RGlyZWN0aXZlQ29udHJvbCAqLyAiYnJlYWsgcmV0dXJuIHJld3JpdGUgc2V0IiArCiAgICAvKiBuZ3hEaXJlY3RpdmUgKi8gIiBhY2NlcHRfbXV0ZXggYWNjZXB0X211dGV4X2RlbGF5IGFjY2Vzc19sb2cgYWRkX2FmdGVyX2JvZHkgYWRkX2JlZm9yZV9ib2R5IGFkZF9oZWFkZXIgYWRkaXRpb25fdHlwZXMgYWlvIGFsaWFzIGFsbG93IGFuY2llbnRfYnJvd3NlciBhbmNpZW50X2Jyb3dzZXJfdmFsdWUgYXV0aF9iYXNpYyBhdXRoX2Jhc2ljX3VzZXJfZmlsZSBhdXRoX2h0dHAgYXV0aF9odHRwX2hlYWRlciBhdXRoX2h0dHBfdGltZW91dCBhdXRvaW5kZXggYXV0b2luZGV4X2V4YWN0X3NpemUgYXV0b2luZGV4X2xvY2FsdGltZSBjaGFyc2V0IGNoYXJzZXRfdHlwZXMgY2xpZW50X2JvZHlfYnVmZmVyX3NpemUgY2xpZW50X2JvZHlfaW5fZmlsZV9vbmx5IGNsaWVudF9ib2R5X2luX3NpbmdsZV9idWZmZXIgY2xpZW50X2JvZHlfdGVtcF9wYXRoIGNsaWVudF9ib2R5X3RpbWVvdXQgY2xpZW50X2hlYWRlcl9idWZmZXJfc2l6ZSBjbGllbnRfaGVhZGVyX3RpbWVvdXQgY2xpZW50X21heF9ib2R5X3NpemUgY29ubmVjdGlvbl9wb29sX3NpemUgY3JlYXRlX2Z1bGxfcHV0X3BhdGggZGFlbW9uIGRhdl9hY2Nlc3MgZGF2X21ldGhvZHMgZGVidWdfY29ubmVjdGlvbiBkZWJ1Z19wb2ludHMgZGVmYXVsdF90eXBlIGRlZ3JhZGF0aW9uIGRlZ3JhZGUgZGVueSBkZXZwb2xsX2NoYW5nZXMgZGV2cG9sbF9ldmVudHMgZGlyZWN0aW8gZGlyZWN0aW9fYWxpZ25tZW50IGVtcHR5X2dpZiBlbnYgZXBvbGxfZXZlbnRzIGVycm9yX2xvZyBldmVudHBvcnRfZXZlbnRzIGV4cGlyZXMgZmFzdGNnaV9iaW5kIGZhc3RjZ2lfYnVmZmVyX3NpemUgZmFzdGNnaV9idWZmZXJzIGZhc3RjZ2lfYnVzeV9idWZmZXJzX3NpemUgZmFzdGNnaV9jYWNoZSBmYXN0Y2dpX2NhY2hlX2tleSBmYXN0Y2dpX2NhY2hlX21ldGhvZHMgZmFzdGNnaV9jYWNoZV9taW5fdXNlcyBmYXN0Y2dpX2NhY2hlX3BhdGggZmFzdGNnaV9jYWNoZV91c2Vfc3RhbGUgZmFzdGNnaV9jYWNoZV92YWxpZCBmYXN0Y2dpX2NhdGNoX3N0ZGVyciBmYXN0Y2dpX2Nvbm5lY3RfdGltZW91dCBmYXN0Y2dpX2hpZGVfaGVhZGVyIGZhc3RjZ2lfaWdub3JlX2NsaWVudF9hYm9ydCBmYXN0Y2dpX2lnbm9yZV9oZWFkZXJzIGZhc3RjZ2lfaW5kZXggZmFzdGNnaV9pbnRlcmNlcHRfZXJyb3JzIGZhc3RjZ2lfbWF4X3RlbXBfZmlsZV9zaXplIGZhc3RjZ2lfbmV4dF91cHN0cmVhbSBmYXN0Y2dpX3BhcmFtIGZhc3RjZ2lfcGFzc19oZWFkZXIgZmFzdGNnaV9wYXNzX3JlcXVlc3RfYm9keSBmYXN0Y2dpX3Bhc3NfcmVxdWVzdF9oZWFkZXJzIGZhc3RjZ2lfcmVhZF90aW1lb3V0IGZhc3RjZ2lfc2VuZF9sb3dhdCBmYXN0Y2dpX3NlbmRfdGltZW91dCBmYXN0Y2dpX3NwbGl0X3BhdGhfaW5mbyBmYXN0Y2dpX3N0b3JlIGZhc3RjZ2lfc3RvcmVfYWNjZXNzIGZhc3RjZ2lfdGVtcF9maWxlX3dyaXRlX3NpemUgZmFzdGNnaV90ZW1wX3BhdGggZmFzdGNnaV91cHN0cmVhbV9mYWlsX3RpbWVvdXQgZmFzdGNnaV91cHN0cmVhbV9tYXhfZmFpbHMgZmx2IGdlb2lwX2NpdHkgZ2VvaXBfY291bnRyeSBnb29nbGVfcGVyZnRvb2xzX3Byb2ZpbGVzIGd6aXAgZ3ppcF9idWZmZXJzIGd6aXBfY29tcF9sZXZlbCBnemlwX2Rpc2FibGUgZ3ppcF9oYXNoIGd6aXBfaHR0cF92ZXJzaW9uIGd6aXBfbWluX2xlbmd0aCBnemlwX25vX2J1ZmZlciBnemlwX3Byb3hpZWQgZ3ppcF9zdGF0aWMgZ3ppcF90eXBlcyBnemlwX3ZhcnkgZ3ppcF93aW5kb3cgaWZfbW9kaWZpZWRfc2luY2UgaWdub3JlX2ludmFsaWRfaGVhZGVycyBpbWFnZV9maWx0ZXIgaW1hZ2VfZmlsdGVyX2J1ZmZlciBpbWFnZV9maWx0ZXJfanBlZ19xdWFsaXR5IGltYWdlX2ZpbHRlcl90cmFuc3BhcmVuY3kgaW1hcF9hdXRoIGltYXBfY2FwYWJpbGl0aWVzIGltYXBfY2xpZW50X2J1ZmZlciBpbmRleCBpcF9oYXNoIGtlZXBhbGl2ZV9yZXF1ZXN0cyBrZWVwYWxpdmVfdGltZW91dCBrcXVldWVfY2hhbmdlcyBrcXVldWVfZXZlbnRzIGxhcmdlX2NsaWVudF9oZWFkZXJfYnVmZmVycyBsaW1pdF9jb25uIGxpbWl0X2Nvbm5fbG9nX2xldmVsIGxpbWl0X3JhdGUgbGltaXRfcmF0ZV9hZnRlciBsaW1pdF9yZXEgbGltaXRfcmVxX2xvZ19sZXZlbCBsaW1pdF9yZXFfem9uZSBsaW1pdF96b25lIGxpbmdlcmluZ190aW1lIGxpbmdlcmluZ190aW1lb3V0IGxvY2tfZmlsZSBsb2dfZm9ybWF0IGxvZ19ub3RfZm91bmQgbG9nX3N1YnJlcXVlc3QgbWFwX2hhc2hfYnVja2V0X3NpemUgbWFwX2hhc2hfbWF4X3NpemUgbWFzdGVyX3Byb2Nlc3MgbWVtY2FjaGVkX2JpbmQgbWVtY2FjaGVkX2J1ZmZlcl9zaXplIG1lbWNhY2hlZF9jb25uZWN0X3RpbWVvdXQgbWVtY2FjaGVkX25leHRfdXBzdHJlYW0gbWVtY2FjaGVkX3JlYWRfdGltZW91dCBtZW1jYWNoZWRfc2VuZF90aW1lb3V0IG1lbWNhY2hlZF91cHN0cmVhbV9mYWlsX3RpbWVvdXQgbWVtY2FjaGVkX3Vwc3RyZWFtX21heF9mYWlscyBtZXJnZV9zbGFzaGVzIG1pbl9kZWxldGVfZGVwdGggbW9kZXJuX2Jyb3dzZXIgbW9kZXJuX2Jyb3dzZXJfdmFsdWUgbXNpZV9wYWRkaW5nIG1zaWVfcmVmcmVzaCBtdWx0aV9hY2NlcHQgb3Blbl9maWxlX2NhY2hlIG9wZW5fZmlsZV9jYWNoZV9lcnJvcnMgb3Blbl9maWxlX2NhY2hlX2V2ZW50cyBvcGVuX2ZpbGVfY2FjaGVfbWluX3VzZXMgb3Blbl9maWxlX2NhY2hlX3ZhbGlkIG9wZW5fbG9nX2ZpbGVfY2FjaGUgb3V0cHV0X2J1ZmZlcnMgb3ZlcnJpZGVfY2hhcnNldCBwZXJsIHBlcmxfbW9kdWxlcyBwZXJsX3JlcXVpcmUgcGVybF9zZXQgcGlkIHBvcDNfYXV0aCBwb3AzX2NhcGFiaWxpdGllcyBwb3J0X2luX3JlZGlyZWN0IHBvc3Rwb25lX2d6aXBwaW5nIHBvc3Rwb25lX291dHB1dCBwcm90b2NvbCBwcm94eSBwcm94eV9iaW5kIHByb3h5X2J1ZmZlciBwcm94eV9idWZmZXJfc2l6ZSBwcm94eV9idWZmZXJpbmcgcHJveHlfYnVmZmVycyBwcm94eV9idXN5X2J1ZmZlcnNfc2l6ZSBwcm94eV9jYWNoZSBwcm94eV9jYWNoZV9rZXkgcHJveHlfY2FjaGVfbWV0aG9kcyBwcm94eV9jYWNoZV9taW5fdXNlcyBwcm94eV9jYWNoZV9wYXRoIHByb3h5X2NhY2hlX3VzZV9zdGFsZSBwcm94eV9jYWNoZV92YWxpZCBwcm94eV9jb25uZWN0X3RpbWVvdXQgcHJveHlfaGVhZGVyc19oYXNoX2J1Y2tldF9zaXplIHByb3h5X2hlYWRlcnNfaGFzaF9tYXhfc2l6ZSBwcm94eV9oaWRlX2hlYWRlciBwcm94eV9pZ25vcmVfY2xpZW50X2Fib3J0IHByb3h5X2lnbm9yZV9oZWFkZXJzIHByb3h5X2ludGVyY2VwdF9lcnJvcnMgcHJveHlfbWF4X3RlbXBfZmlsZV9zaXplIHByb3h5X21ldGhvZCBwcm94eV9uZXh0X3Vwc3RyZWFtIHByb3h5X3Bhc3NfZXJyb3JfbWVzc2FnZSBwcm94eV9wYXNzX2hlYWRlciBwcm94eV9wYXNzX3JlcXVlc3RfYm9keSBwcm94eV9wYXNzX3JlcXVlc3RfaGVhZGVycyBwcm94eV9yZWFkX3RpbWVvdXQgcHJveHlfcmVkaXJlY3QgcHJveHlfc2VuZF9sb3dhdCBwcm94eV9zZW5kX3RpbWVvdXQgcHJveHlfc2V0X2JvZHkgcHJveHlfc2V0X2hlYWRlciBwcm94eV9zc2xfc2Vzc2lvbl9yZXVzZSBwcm94eV9zdG9yZSBwcm94eV9zdG9yZV9hY2Nlc3MgcHJveHlfdGVtcF9maWxlX3dyaXRlX3NpemUgcHJveHlfdGVtcF9wYXRoIHByb3h5X3RpbWVvdXQgcHJveHlfdXBzdHJlYW1fZmFpbF90aW1lb3V0IHByb3h5X3Vwc3RyZWFtX21heF9mYWlscyByYW5kb21faW5kZXggcmVhZF9haGVhZCByZWFsX2lwX2hlYWRlciByZWN1cnNpdmVfZXJyb3JfcGFnZXMgcmVxdWVzdF9wb29sX3NpemUgcmVzZXRfdGltZWRvdXRfY29ubmVjdGlvbiByZXNvbHZlciByZXNvbHZlcl90aW1lb3V0IHJld3JpdGVfbG9nIHJ0c2lnX292ZXJmbG93X2V2ZW50cyBydHNpZ19vdmVyZmxvd190ZXN0IHJ0c2lnX292ZXJmbG93X3RocmVzaG9sZCBydHNpZ19zaWdubyBzYXRpc2Z5IHNlY3VyZV9saW5rX3NlY3JldCBzZW5kX2xvd2F0IHNlbmRfdGltZW91dCBzZW5kZmlsZSBzZW5kZmlsZV9tYXhfY2h1bmsgc2VydmVyX25hbWVfaW5fcmVkaXJlY3Qgc2VydmVyX25hbWVzX2hhc2hfYnVja2V0X3NpemUgc2VydmVyX25hbWVzX2hhc2hfbWF4X3NpemUgc2VydmVyX3Rva2VucyBzZXRfcmVhbF9pcF9mcm9tIHNtdHBfYXV0aCBzbXRwX2NhcGFiaWxpdGllcyBzbXRwX2NsaWVudF9idWZmZXIgc210cF9ncmVldGluZ19kZWxheSBzb19rZWVwYWxpdmUgc291cmNlX2NoYXJzZXQgc3NpIHNzaV9pZ25vcmVfcmVjeWNsZWRfYnVmZmVycyBzc2lfbWluX2ZpbGVfY2h1bmsgc3NpX3NpbGVudF9lcnJvcnMgc3NpX3R5cGVzIHNzaV92YWx1ZV9sZW5ndGggc3NsIHNzbF9jZXJ0aWZpY2F0ZSBzc2xfY2VydGlmaWNhdGVfa2V5IHNzbF9jaXBoZXJzIHNzbF9jbGllbnRfY2VydGlmaWNhdGUgc3NsX2NybCBzc2xfZGhwYXJhbSBzc2xfZW5naW5lIHNzbF9wcmVmZXJfc2VydmVyX2NpcGhlcnMgc3NsX3Byb3RvY29scyBzc2xfc2Vzc2lvbl9jYWNoZSBzc2xfc2Vzc2lvbl90aW1lb3V0IHNzbF92ZXJpZnlfY2xpZW50IHNzbF92ZXJpZnlfZGVwdGggc3RhcnR0bHMgc3R1Yl9zdGF0dXMgc3ViX2ZpbHRlciBzdWJfZmlsdGVyX29uY2Ugc3ViX2ZpbHRlcl90eXBlcyB0Y3Bfbm9kZWxheSB0Y3Bfbm9wdXNoIHRocmVhZF9zdGFja19zaXplIHRpbWVvdXQgdGltZXJfcmVzb2x1dGlvbiB0eXBlc19oYXNoX2J1Y2tldF9zaXplIHR5cGVzX2hhc2hfbWF4X3NpemUgdW5kZXJzY29yZXNfaW5faGVhZGVycyB1bmluaXRpYWxpemVkX3ZhcmlhYmxlX3dhcm4gdXNlIHVzZXIgdXNlcmlkIHVzZXJpZF9kb21haW4gdXNlcmlkX2V4cGlyZXMgdXNlcmlkX21hcmsgdXNlcmlkX25hbWUgdXNlcmlkX3AzcCB1c2VyaWRfcGF0aCB1c2VyaWRfc2VydmljZSB2YWxpZF9yZWZlcmVycyB2YXJpYWJsZXNfaGFzaF9idWNrZXRfc2l6ZSB2YXJpYWJsZXNfaGFzaF9tYXhfc2l6ZSB3b3JrZXJfY29ubmVjdGlvbnMgd29ya2VyX2NwdV9hZmZpbml0eSB3b3JrZXJfcHJpb3JpdHkgd29ya2VyX3Byb2Nlc3NlcyB3b3JrZXJfcmxpbWl0X2NvcmUgd29ya2VyX3JsaW1pdF9ub2ZpbGUgd29ya2VyX3JsaW1pdF9zaWdwZW5kaW5nIHdvcmtlcl90aHJlYWRzIHdvcmtpbmdfZGlyZWN0b3J5IHhjbGllbnQgeG1sX2VudGl0aWVzIHhzbHRfc3R5bGVzaGVldCB4c2x0X3R5cGVzZHJld0BsaTIyOS0yMyIKICAgICk7CgogIHZhciBrZXl3b3Jkc19ibG9jayA9IHdvcmRzKAogICAgLyogbmd4RGlyZWN0aXZlQmxvY2sgKi8gImh0dHAgbWFpbCBldmVudHMgc2VydmVyIHR5cGVzIGxvY2F0aW9uIHVwc3RyZWFtIGNoYXJzZXRfbWFwIGxpbWl0X2V4Y2VwdCBpZiBnZW8gbWFwIgogICAgKTsKCiAgdmFyIGtleXdvcmRzX2ltcG9ydGFudCA9IHdvcmRzKAogICAgLyogbmd4RGlyZWN0aXZlSW1wb3J0YW50ICovICJpbmNsdWRlIHJvb3Qgc2VydmVyIHNlcnZlcl9uYW1lIGxpc3RlbiBpbnRlcm5hbCBwcm94eV9wYXNzIG1lbWNhY2hlZF9wYXNzIGZhc3RjZ2lfcGFzcyB0cnlfZmlsZXMiCiAgICApOwoKICB2YXIgaW5kZW50VW5pdCA9IGNvbmZpZy5pbmRlbnRVbml0LCB0eXBlOwogIGZ1bmN0aW9uIHJldChzdHlsZSwgdHApIHt0eXBlID0gdHA7IHJldHVybiBzdHlsZTt9CgogIGZ1bmN0aW9uIHRva2VuQmFzZShzdHJlYW0sIHN0YXRlKSB7CgoKICAgIHN0cmVhbS5lYXRXaGlsZSgvW1x3XCRfXS8pOwoKICAgIHZhciBjdXIgPSBzdHJlYW0uY3VycmVudCgpOwoKCiAgICBpZiAoa2V5d29yZHMucHJvcGVydHlJc0VudW1lcmFibGUoY3VyKSkgewogICAgICByZXR1cm4gImtleXdvcmQiOwogICAgfQogICAgZWxzZSBpZiAoa2V5d29yZHNfYmxvY2sucHJvcGVydHlJc0VudW1lcmFibGUoY3VyKSkgewogICAgICByZXR1cm4gInZhcmlhYmxlLTIiOwogICAgfQogICAgZWxzZSBpZiAoa2V5d29yZHNfaW1wb3J0YW50LnByb3BlcnR5SXNFbnVtZXJhYmxlKGN1cikpIHsKICAgICAgcmV0dXJuICJzdHJpbmctMiI7CiAgICB9CiAgICAvKiovCgogICAgdmFyIGNoID0gc3RyZWFtLm5leHQoKTsKICAgIGlmIChjaCA9PSAiQCIpIHtzdHJlYW0uZWF0V2hpbGUoL1tcd1xcXC1dLyk7IHJldHVybiByZXQoIm1ldGEiLCBzdHJlYW0uY3VycmVudCgpKTt9CiAgICBlbHNlIGlmIChjaCA9PSAiLyIgJiYgc3RyZWFtLmVhdCgiKiIpKSB7CiAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5DQ29tbWVudDsKICAgICAgcmV0dXJuIHRva2VuQ0NvbW1lbnQoc3RyZWFtLCBzdGF0ZSk7CiAgICB9CiAgICBlbHNlIGlmIChjaCA9PSAiPCIgJiYgc3RyZWFtLmVhdCgiISIpKSB7CiAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5TR01MQ29tbWVudDsKICAgICAgcmV0dXJuIHRva2VuU0dNTENvbW1lbnQoc3RyZWFtLCBzdGF0ZSk7CiAgICB9CiAgICBlbHNlIGlmIChjaCA9PSAiPSIpIHJldChudWxsLCAiY29tcGFyZSIpOwogICAgZWxzZSBpZiAoKGNoID09ICJ+IiB8fCBjaCA9PSAifCIpICYmIHN0cmVhbS5lYXQoIj0iKSkgcmV0dXJuIHJldChudWxsLCAiY29tcGFyZSIpOwogICAgZWxzZSBpZiAoY2ggPT0gIlwiIiB8fCBjaCA9PSAiJyIpIHsKICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlblN0cmluZyhjaCk7CiAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgIH0KICAgIGVsc2UgaWYgKGNoID09ICIjIikgewogICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICAgIHJldHVybiByZXQoImNvbW1lbnQiLCAiY29tbWVudCIpOwogICAgfQogICAgZWxzZSBpZiAoY2ggPT0gIiEiKSB7CiAgICAgIHN0cmVhbS5tYXRjaCgvXlxzKlx3Ki8pOwogICAgICByZXR1cm4gcmV0KCJrZXl3b3JkIiwgImltcG9ydGFudCIpOwogICAgfQogICAgZWxzZSBpZiAoL1xkLy50ZXN0KGNoKSkgewogICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcdy4lXS8pOwogICAgICByZXR1cm4gcmV0KCJudW1iZXIiLCAidW5pdCIpOwogICAgfQogICAgZWxzZSBpZiAoL1ssLis+KlwvXS8udGVzdChjaCkpIHsKICAgICAgcmV0dXJuIHJldChudWxsLCAic2VsZWN0LW9wIik7CiAgICB9CiAgICBlbHNlIGlmICgvWzt7fTpcW1xdXS8udGVzdChjaCkpIHsKICAgICAgcmV0dXJuIHJldChudWxsLCBjaCk7CiAgICB9CiAgICBlbHNlIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXHdcXFwtXS8pOwogICAgICByZXR1cm4gcmV0KCJ2YXJpYWJsZSIsICJ2YXJpYWJsZSIpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gdG9rZW5DQ29tbWVudChzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgbWF5YmVFbmQgPSBmYWxzZSwgY2g7CiAgICB3aGlsZSAoKGNoID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkgewogICAgICBpZiAobWF5YmVFbmQgJiYgY2ggPT0gIi8iKSB7CiAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgbWF5YmVFbmQgPSAoY2ggPT0gIioiKTsKICAgIH0KICAgIHJldHVybiByZXQoImNvbW1lbnQiLCAiY29tbWVudCIpOwogIH0KCiAgZnVuY3Rpb24gdG9rZW5TR01MQ29tbWVudChzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgZGFzaGVzID0gMCwgY2g7CiAgICB3aGlsZSAoKGNoID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkgewogICAgICBpZiAoZGFzaGVzID49IDIgJiYgY2ggPT0gIj4iKSB7CiAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgZGFzaGVzID0gKGNoID09ICItIikgPyBkYXNoZXMgKyAxIDogMDsKICAgIH0KICAgIHJldHVybiByZXQoImNvbW1lbnQiLCAiY29tbWVudCIpOwogIH0KCiAgZnVuY3Rpb24gdG9rZW5TdHJpbmcocXVvdGUpIHsKICAgIHJldHVybiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHZhciBlc2NhcGVkID0gZmFsc2UsIGNoOwogICAgICB3aGlsZSAoKGNoID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkgewogICAgICAgIGlmIChjaCA9PSBxdW90ZSAmJiAhZXNjYXBlZCkKICAgICAgICAgIGJyZWFrOwogICAgICAgIGVzY2FwZWQgPSAhZXNjYXBlZCAmJiBjaCA9PSAiXFwiOwogICAgICB9CiAgICAgIGlmICghZXNjYXBlZCkgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICAgIHJldHVybiByZXQoInN0cmluZyIsICJzdHJpbmciKTsKICAgIH07CiAgfQoKICByZXR1cm4gewogICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24oYmFzZSkgewogICAgICByZXR1cm4ge3Rva2VuaXplOiB0b2tlbkJhc2UsCiAgICAgICAgICAgICAgYmFzZUluZGVudDogYmFzZSB8fCAwLAogICAgICAgICAgICAgIHN0YWNrOiBbXX07CiAgICB9LAoKICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIGlmIChzdHJlYW0uZWF0U3BhY2UoKSkgcmV0dXJuIG51bGw7CiAgICAgIHR5cGUgPSBudWxsOwogICAgICB2YXIgc3R5bGUgPSBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKCiAgICAgIHZhciBjb250ZXh0ID0gc3RhdGUuc3RhY2tbc3RhdGUuc3RhY2subGVuZ3RoLTFdOwogICAgICBpZiAodHlwZSA9PSAiaGFzaCIgJiYgY29udGV4dCA9PSAicnVsZSIpIHN0eWxlID0gImF0b20iOwogICAgICBlbHNlIGlmIChzdHlsZSA9PSAidmFyaWFibGUiKSB7CiAgICAgICAgaWYgKGNvbnRleHQgPT0gInJ1bGUiKSBzdHlsZSA9ICJudW1iZXIiOwogICAgICAgIGVsc2UgaWYgKCFjb250ZXh0IHx8IGNvbnRleHQgPT0gIkBtZWRpYXsiKSBzdHlsZSA9ICJ0YWciOwogICAgICB9CgogICAgICBpZiAoY29udGV4dCA9PSAicnVsZSIgJiYgL15bXHtcfTtdJC8udGVzdCh0eXBlKSkKICAgICAgICBzdGF0ZS5zdGFjay5wb3AoKTsKICAgICAgaWYgKHR5cGUgPT0gInsiKSB7CiAgICAgICAgaWYgKGNvbnRleHQgPT0gIkBtZWRpYSIpIHN0YXRlLnN0YWNrW3N0YXRlLnN0YWNrLmxlbmd0aC0xXSA9ICJAbWVkaWF7IjsKICAgICAgICBlbHNlIHN0YXRlLnN0YWNrLnB1c2goInsiKTsKICAgICAgfQogICAgICBlbHNlIGlmICh0eXBlID09ICJ9Iikgc3RhdGUuc3RhY2sucG9wKCk7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gIkBtZWRpYSIpIHN0YXRlLnN0YWNrLnB1c2goIkBtZWRpYSIpOwogICAgICBlbHNlIGlmIChjb250ZXh0ID09ICJ7IiAmJiB0eXBlICE9ICJjb21tZW50Iikgc3RhdGUuc3RhY2sucHVzaCgicnVsZSIpOwogICAgICByZXR1cm4gc3R5bGU7CiAgICB9LAoKICAgIGluZGVudDogZnVuY3Rpb24oc3RhdGUsIHRleHRBZnRlcikgewogICAgICB2YXIgbiA9IHN0YXRlLnN0YWNrLmxlbmd0aDsKICAgICAgaWYgKC9eXH0vLnRlc3QodGV4dEFmdGVyKSkKICAgICAgICBuIC09IHN0YXRlLnN0YWNrW3N0YXRlLnN0YWNrLmxlbmd0aC0xXSA9PSAicnVsZSIgPyAyIDogMTsKICAgICAgcmV0dXJuIHN0YXRlLmJhc2VJbmRlbnQgKyBuICogaW5kZW50VW5pdDsKICAgIH0sCgogICAgZWxlY3RyaWNDaGFyczogIn0iCiAgfTsKfSk7CgpDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveC1uZ2lueC1jb25mIiwgIm5naW54Iik7Cgp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/nsis/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/nsis/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogTlNJUyBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Li4vLi4vbGliL2NvZGVtaXJyb3IuY3NzPgo8c2NyaXB0IHNyYz0uLi8uLi9saWIvY29kZW1pcnJvci5qcz48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uLy4uL2FkZG9uL21vZGUvc2ltcGxlLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uLy4uL2FkZG9uL2VkaXQvbWF0Y2hicmFja2V0cy5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPW5zaXMuanM+PC9zY3JpcHQ+CjxzdHlsZSB0eXBlPXRleHQvY3NzPgogIC5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazt9Cjwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGgxPkNvZGVNaXJyb3I8L2gxPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5OU0lTPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5OU0lTIG1vZGU8L2gyPgoKCjx0ZXh0YXJlYSBpZD1jb2RlPgo7IFRoaXMgaXMgYSBjb21tZW50CiFpZmRlZiBFUlJPUgogICAgIWVycm9yICJTb21ldGhpbmcgd2VudCB3cm9uZyIKIWVuZGlmCgpPdXRGaWxlICJkZW1vLmV4ZSIKUmVxdWVzdEV4ZWN1dGlvbkxldmVsIHVzZXIKU2V0RGV0YWlsc1ByaW50IGxpc3Rvbmx5CgohaW5jbHVkZSAiTG9naWNMaWIubnNoIgohaW5jbHVkZSAiV2luVmVyLm5zaCIKClNlY3Rpb24gLW1hbmRhdG9yeQoKICAgIENhbGwgbG9nV2luVmVyCgogICAgJHtJZn0gMSA+IDAKICAgICAgTWVzc2FnZUJveCBNQl9PSyAiSGVsbG8gd29ybGQiCiAgICAke0VuZElmfQoKU2VjdGlvbkVuZAoKRnVuY3Rpb24gbG9nV2luVmVyCgogICAgJHtJZn0gJHtJc1dpbjEwfQogICAgICAgIERldGFpbFByaW50ICJXaW5kb3dzIDEwISIKICAgICR7RWxzZUlmfSAke0F0TGVhc3RXaW5WaXN0YX0KICAgICAgICBEZXRhaWxQcmludCAiV2UncmUgcG9zdC1YUCIKICAgICR7RWxzZX0KICAgICAgICBEZXRhaWxQcmludCAiTGVnYWN5IHN5c3RlbSIKICAgICR7RW5kSWZ9CgpGdW5jdGlvbkVuZAo8L3RleHRhcmVhPgoKPHNjcmlwdD4KICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvZGUnKSwgewogICAgbW9kZTogJ25zaXMnLAogICAgaW5kZW50V2l0aFRhYnM6IHRydWUsCiAgICBzbWFydEluZGVudDogdHJ1ZSwKICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgbWF0Y2hCcmFja2V0czogdHJ1ZQogIH0pOwo8L3NjcmlwdD4KCjxwPjxzdHJvbmc+TUlNRSB0eXBlcyBkZWZpbmVkOjwvc3Ryb25nPiA8Y29kZT50ZXh0L3gtbnNpczwvY29kZT4uPC9wPgo8L2FydGljbGU+]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/nsis/nsis.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovLyBBdXRob3I6IEphbiBULiBTb3R0IChodHRwOi8vZ2l0aHViLmNvbS9pZGxlYmVyZykKCihmdW5jdGlvbihtb2QpIHsKICBpZiAodHlwZW9mIGV4cG9ydHMgPT0gIm9iamVjdCIgJiYgdHlwZW9mIG1vZHVsZSA9PSAib2JqZWN0IikgLy8gQ29tbW9uSlMKICAgIG1vZChyZXF1aXJlKCIuLi8uLi9saWIvY29kZW1pcnJvciIpLCByZXF1aXJlKCIuLi8uLi9hZGRvbi9tb2RlL3NpbXBsZSIpKTsKICBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCkgLy8gQU1ECiAgICBkZWZpbmUoWyIuLi8uLi9saWIvY29kZW1pcnJvciIsICIuLi8uLi9hZGRvbi9tb2RlL3NpbXBsZSJdLCBtb2QpOwogIGVsc2UgLy8gUGxhaW4gYnJvd3NlciBlbnYKICAgIG1vZChDb2RlTWlycm9yKTsKfSkoZnVuY3Rpb24oQ29kZU1pcnJvcikgewoidXNlIHN0cmljdCI7CgpDb2RlTWlycm9yLmRlZmluZVNpbXBsZU1vZGUoIm5zaXMiLHsKICBzdGFydDpbCiAgICAvLyBOdW1iZXJzCiAgICB7cmVnZXg6IC8oPzpbKy1dPykoPzoweFtcZCxhLWZdKyl8KD86MG9bMC03XSspfCg/OjBiWzAsMV0rKXwoPzpcZCsuP1xkKikvLCB0b2tlbjogIm51bWJlciJ9LAoKICAgIC8vIFN0cmluZ3MKICAgIHsgcmVnZXg6IC8iKD86W15cXCJdfFxcLikqIj8vLCB0b2tlbjogInN0cmluZyIgfSwKICAgIHsgcmVnZXg6IC8nKD86W15cXCddfFxcLikqJz8vLCB0b2tlbjogInN0cmluZyIgfSwKICAgIHsgcmVnZXg6IC9gKD86W15cXGBdfFxcLikqYD8vLCB0b2tlbjogInN0cmluZyIgfSwKCiAgICAvLyBDb21waWxlIFRpbWUgQ29tbWFuZHMKICAgIHtyZWdleDogL15ccyooPzpcIShpbmNsdWRlfGFkZGluY2x1ZGVkaXJ8YWRkcGx1Z2luZGlyfGFwcGVuZGZpbGV8Y2R8ZGVsZmlsZXxlY2hvfGVycm9yfGV4ZWN1dGV8cGFja2hkcnxmaW5hbGl6ZXxnZXRkbGx2ZXJzaW9ufHN5c3RlbXx0ZW1wZmlsZXx3YXJuaW5nfHZlcmJvc2V8ZGVmaW5lfHVuZGVmfGluc2VydG1hY3JvfG1ha2Vuc2lzfHNlYXJjaHBhcnNlfHNlYXJjaHJlcGxhY2UpKVxiLywgdG9rZW46ICJrZXl3b3JkIn0sCgogICAgLy8gQ29uZGl0aW9uYWwgQ29tcGlsYXRpb24KICAgIHtyZWdleDogL15ccyooPzpcIShpZig/Om4/ZGVmKT98aWZtYWNyb24/ZGVmfG1hY3JvKSlcYi8sIHRva2VuOiAia2V5d29yZCIsIGluZGVudDogdHJ1ZX0sCiAgICB7cmVnZXg6IC9eXHMqKD86XCEoZWxzZXxlbmRpZnxtYWNyb2VuZCkpXGIvLCB0b2tlbjogImtleXdvcmQiLCBkZWRlbnQ6IHRydWV9LAoKICAgIC8vIFJ1bnRpbWUgQ29tbWFuZHMKICAgIHtyZWdleDogL15ccyooPzpBYm9ydHxBZGRCcmFuZGluZ0ltYWdlfEFkZFNpemV8QWxsb3dSb290RGlySW5zdGFsbHxBbGxvd1NraXBGaWxlc3xBdXRvQ2xvc2VXaW5kb3d8QkdGb250fEJHR3JhZGllbnR8QnJhbmRpbmdUZXh0fEJyaW5nVG9Gcm9udHxDYWxsfENhbGxJbnN0RExMfENhcHRpb258Q2hhbmdlVUl8Q2hlY2tCaXRtYXB8Q2xlYXJFcnJvcnN8Q29tcGxldGVkVGV4dHxDb21wb25lbnRUZXh0fENvcHlGaWxlc3xDUkNDaGVja3xDcmVhdGVEaXJlY3Rvcnl8Q3JlYXRlRm9udHxDcmVhdGVTaG9ydEN1dHxEZWxldGV8RGVsZXRlSU5JU2VjfERlbGV0ZUlOSVN0cnxEZWxldGVSZWdLZXl8RGVsZXRlUmVnVmFsdWV8RGV0YWlsUHJpbnR8RGV0YWlsc0J1dHRvblRleHR8RGlyVGV4dHxEaXJWYXJ8RGlyVmVyaWZ5fEVuYWJsZVdpbmRvd3xFbnVtUmVnS2V5fEVudW1SZWdWYWx1ZXxFeGNofEV4ZWN8RXhlY1NoZWxsfEV4ZWNXYWl0fEV4cGFuZEVudlN0cmluZ3N8RmlsZXxGaWxlQnVmU2l6ZXxGaWxlQ2xvc2V8RmlsZUVycm9yVGV4dHxGaWxlT3BlbnxGaWxlUmVhZHxGaWxlUmVhZEJ5dGV8RmlsZVJlYWRVVEYxNkxFfEZpbGVSZWFkV29yZHxGaWxlV3JpdGVVVEYxNkxFfEZpbGVTZWVrfEZpbGVXcml0ZXxGaWxlV3JpdGVCeXRlfEZpbGVXcml0ZVdvcmR8RmluZENsb3NlfEZpbmRGaXJzdHxGaW5kTmV4dHxGaW5kV2luZG93fEZsdXNoSU5JfEdldEN1ckluc3RUeXBlfEdldEN1cnJlbnRBZGRyZXNzfEdldERsZ0l0ZW18R2V0RExMVmVyc2lvbnxHZXRETExWZXJzaW9uTG9jYWx8R2V0RXJyb3JMZXZlbHxHZXRGaWxlVGltZXxHZXRGaWxlVGltZUxvY2FsfEdldEZ1bGxQYXRoTmFtZXxHZXRGdW5jdGlvbkFkZHJlc3N8R2V0SW5zdERpckVycm9yfEdldExhYmVsQWRkcmVzc3xHZXRUZW1wRmlsZU5hbWV8R290b3xIaWRlV2luZG93fEljb258SWZBYm9ydHxJZkVycm9yc3xJZkZpbGVFeGlzdHN8SWZSZWJvb3RGbGFnfElmU2lsZW50fEluaXRQbHVnaW5zRGlyfEluc3RhbGxCdXR0b25UZXh0fEluc3RhbGxDb2xvcnN8SW5zdGFsbERpcnxJbnN0YWxsRGlyUmVnS2V5fEluc3RQcm9ncmVzc0ZsYWdzfEluc3RUeXBlfEluc3RUeXBlR2V0VGV4dHxJbnN0VHlwZVNldFRleHR8SW50Q21wfEludENtcFV8SW50Rm10fEludE9wfElzV2luZG93fExhbmdTdHJpbmd8TGljZW5zZUJrQ29sb3J8TGljZW5zZURhdGF8TGljZW5zZUZvcmNlU2VsZWN0aW9ufExpY2Vuc2VMYW5nU3RyaW5nfExpY2Vuc2VUZXh0fExvYWRMYW5ndWFnZUZpbGV8TG9ja1dpbmRvd3xMb2dTZXR8TG9nVGV4dHxNYW5pZmVzdERQSUF3YXJlfE1hbmlmZXN0U3VwcG9ydGVkT1N8TWVzc2FnZUJveHxNaXNjQnV0dG9uVGV4dHxOYW1lfE5vcHxPdXRGaWxlfFBhZ2V8UGFnZUNhbGxiYWNrc3xQb3B8UHVzaHxRdWl0fFJlYWRFbnZTdHJ8UmVhZElOSVN0cnxSZWFkUmVnRFdPUkR8UmVhZFJlZ1N0cnxSZWJvb3R8UmVnRExMfFJlbmFtZXxSZXF1ZXN0RXhlY3V0aW9uTGV2ZWx8UmVzZXJ2ZUZpbGV8UmV0dXJufFJNRGlyfFNlYXJjaFBhdGh8U2VjdGlvbkdldEZsYWdzfFNlY3Rpb25HZXRJbnN0VHlwZXN8U2VjdGlvbkdldFNpemV8U2VjdGlvbkdldFRleHR8U2VjdGlvbklufFNlY3Rpb25TZXRGbGFnc3xTZWN0aW9uU2V0SW5zdFR5cGVzfFNlY3Rpb25TZXRTaXplfFNlY3Rpb25TZXRUZXh0fFNlbmRNZXNzYWdlfFNldEF1dG9DbG9zZXxTZXRCcmFuZGluZ0ltYWdlfFNldENvbXByZXNzfFNldENvbXByZXNzb3J8U2V0Q29tcHJlc3NvckRpY3RTaXplfFNldEN0bENvbG9yc3xTZXRDdXJJbnN0VHlwZXxTZXREYXRhYmxvY2tPcHRpbWl6ZXxTZXREYXRlU2F2ZXxTZXREZXRhaWxzUHJpbnR8U2V0RGV0YWlsc1ZpZXd8U2V0RXJyb3JMZXZlbHxTZXRFcnJvcnN8U2V0RmlsZUF0dHJpYnV0ZXN8U2V0Rm9udHxTZXRPdXRQYXRofFNldE92ZXJ3cml0ZXxTZXRSZWJvb3RGbGFnfFNldFJlZ1ZpZXd8U2V0U2hlbGxWYXJDb250ZXh0fFNldFNpbGVudHxTaG93SW5zdERldGFpbHN8U2hvd1VuaW5zdERldGFpbHN8U2hvd1dpbmRvd3xTaWxlbnRJbnN0YWxsfFNpbGVudFVuSW5zdGFsbHxTbGVlcHxTcGFjZVRleHRzfFN0ckNtcHxTdHJDbXBTfFN0ckNweXxTdHJMZW58U3ViQ2FwdGlvbnxVbmljb2RlfFVuaW5zdGFsbEJ1dHRvblRleHR8VW5pbnN0YWxsQ2FwdGlvbnxVbmluc3RhbGxJY29ufFVuaW5zdGFsbFN1YkNhcHRpb258VW5pbnN0YWxsVGV4dHxVbmluc3RQYWdlfFVuUmVnRExMfFZhcnxWSUFkZFZlcnNpb25LZXl8VklGaWxlVmVyc2lvbnxWSVByb2R1Y3RWZXJzaW9ufFdpbmRvd0ljb258V3JpdGVJTklTdHJ8V3JpdGVSZWdCaW58V3JpdGVSZWdEV09SRHxXcml0ZVJlZ0V4cGFuZFN0cnxXcml0ZVJlZ1N0cnxXcml0ZVVuaW5zdGFsbGVyfFhQU3R5bGUpXGIvLCB0b2tlbjogImtleXdvcmQifSwKICAgIHtyZWdleDogL15ccyooPzpGdW5jdGlvbnxQYWdlRXh8U2VjdGlvbig/Okdyb3VwKT8pXGIvLCB0b2tlbjogImtleXdvcmQiLCBpbmRlbnQ6IHRydWV9LAogICAge3JlZ2V4OiAvXlxzKig/OihGdW5jdGlvbnxQYWdlRXh8U2VjdGlvbig/Okdyb3VwKT8pRW5kKVxiLywgdG9rZW46ICJrZXl3b3JkIiwgZGVkZW50OiB0cnVlfSwKCiAgICAvLyBDb21tYW5kIE9wdGlvbnMKICAgIHtyZWdleDogL1xiKD86QVJDSElWRXxGSUxFX0FUVFJJQlVURV9BUkNISVZFfEZJTEVfQVRUUklCVVRFX0hJRERFTnxGSUxFX0FUVFJJQlVURV9OT1JNQUx8RklMRV9BVFRSSUJVVEVfT0ZGTElORXxGSUxFX0FUVFJJQlVURV9SRUFET05MWXxGSUxFX0FUVFJJQlVURV9TWVNURU18RklMRV9BVFRSSUJVVEVfVEVNUE9SQVJZfEhJRERFTnxIS0NDfEhLQ1J8SEtDVXxIS0REfEhLRVlfQ0xBU1NFU19ST09UfEhLRVlfQ1VSUkVOVF9DT05GSUd8SEtFWV9DVVJSRU5UX1VTRVJ8SEtFWV9EWU5fREFUQXxIS0VZX0xPQ0FMX01BQ0hJTkV8SEtFWV9QRVJGT1JNQU5DRV9EQVRBfEhLRVlfVVNFUlN8SEtMTXxIS1BEfEhLVXxJREFCT1JUfElEQ0FOQ0VMfElERF9ESVJ8SUREX0lOU1R8SUREX0lOU1RGSUxFU3xJRERfTElDRU5TRXxJRERfU0VMQ09NfElERF9VTklOU1R8SUREX1ZFUklGWXxJRElHTk9SRXxJRE5PfElET0t8SURSRVRSWXxJRFlFU3xNQl9BQk9SVFJFVFJZSUdOT1JFfE1CX0RFRkJVVFRPTjF8TUJfREVGQlVUVE9OMnxNQl9ERUZCVVRUT04zfE1CX0RFRkJVVFRPTjR8TUJfSUNPTkVYQ0xBTUFUSU9OfE1CX0lDT05JTkZPUk1BVElPTnxNQl9JQ09OUVVFU1RJT058TUJfSUNPTlNUT1B8TUJfT0t8TUJfT0tDQU5DRUx8TUJfUkVUUllDQU5DRUx8TUJfUklHSFR8TUJfUlRMUkVBRElOR3xNQl9TRVRGT1JFR1JPVU5EfE1CX1RPUE1PU1R8TUJfVVNFUklDT058TUJfWUVTTk98TUJfWUVTTk9DQU5DRUx8Tk9STUFMfE9GRkxJTkV8UkVBRE9OTFl8U0hDVFh8U0hFTExfQ09OVEVYVHxTV19ISURFfFNXX1NIT1dERUZBVUxUfFNXX1NIT1dNQVhJTUlaRUR8U1dfU0hPV01JTklNSVpFRHxTV19TSE9XTk9STUFMfFNZU1RFTXxURU1QT1JBUlkpXGIvLCB0b2tlbjogImF0b20ifSwKICAgIHtyZWdleDogL1xiKD86YWRtaW58YWxsfGF1dG98Ym90aHxib3R0b218YnppcDJ8Y29tcG9uZW50c3xjdXJyZW50fGN1c3RvbXxkaXJlY3Rvcnl8Zm9yY2V8aGlkZXxoaWdoZXN0fGlmZGlmZnxpZm5ld2VyfGluc3RmaWxlc3xsYXN0dXNlZHxsZWF2ZXxsZWZ0fGxpY2Vuc2V8bGlzdG9ubHl8bHptYXxuZXZlcnNob3d8bm9uZXxub3JtYWx8bm90c2V0fHJpZ2h0fHNob3d8c2lsZW50fHNpbGVudGxvZ3x0ZXh0b25seXx0b3B8dHJ5fHVuXC5jb21wb25lbnRzfHVuXC5jdXN0b218dW5cLmRpcmVjdG9yeXx1blwuaW5zdGZpbGVzfHVuXC5saWNlbnNlfHVuaW5zdENvbmZpcm18dXNlcnxXaW4xMHxXaW43fFdpbjh8V2luVmlzdGF8emxpYilcYi8sIHRva2VuOiAiYnVpbHRpbiJ9LAoKICAgIC8vIExvZ2ljTGliLm5zaAogICAge3JlZ2V4OiAvXCRceyg/OkFuZCg/OklmKD86Tm90KT98VW5sZXNzKXxCcmVha3xDYXNlKD86RWxzZSk/fENvbnRpbnVlfERlZmF1bHR8RG8oPzpVbnRpbHxXaGlsZSk/fEVsc2UoPzpJZig/Ok5vdCk/fFVubGVzcyk/fEVuZCg/OklmfFNlbGVjdHxTd2l0Y2gpfEV4aXQoPzpEb3xGb3J8V2hpbGUpfEZvcig/OkVhY2gpP3xJZig/OkNtZHxOb3QoPzpUaGVuKT98VGhlbik/fExvb3AoPzpVbnRpbHxXaGlsZSk/fE9yKD86SWYoPzpOb3QpP3xVbmxlc3MpfFNlbGVjdHxTd2l0Y2h8VW5sZXNzfFdoaWxlKVx9LywgdG9rZW46ICJ2YXJpYWJsZS0yIiwgaW5kZW50OiB0cnVlfSwKCiAgICAvLyBGaWxlRnVuYy5uc2gKICAgIHtyZWdleDogL1wkXHsoPzpCYW5uZXJUcmltUGF0aHxEaXJTdGF0ZXxEcml2ZVNwYWNlfEdldChCYXNlTmFtZXxEcml2ZXN8RXhlTmFtZXxFeGVQYXRofEZpbGVBdHRyaWJ1dGVzfEZpbGVFeHR8RmlsZU5hbWV8RmlsZVZlcnNpb258T3B0aW9uc3xPcHRpb25zU3xQYXJhbWV0ZXJzfFBhcmVudHxSb290fFNpemV8VGltZSl8TG9jYXRlfFJlZnJlc2hTaGVsbEljb25zKVx9LywgdG9rZW46ICJ2YXJpYWJsZS0yIiwgZGVkZW50OiB0cnVlfSwKCiAgICAvLyBNZW1lbnRvLm5zaAogICAge3JlZ2V4OiAvXCRceyg/Ok1lbWVudG8oPzpTZWN0aW9uKD86RG9uZXxFbmR8UmVzdG9yZXxTYXZlKT98VW5zZWxlY3RlZFNlY3Rpb24pKVx9LywgdG9rZW46ICJ2YXJpYWJsZS0yIiwgZGVkZW50OiB0cnVlfSwKCiAgICAvLyBUZXh0RnVuYy5uc2gKICAgIHtyZWdleDogL1wkXHsoPzpDb25maWcoPzpSZWFkfFJlYWRTfFdyaXRlfFdyaXRlUyl8RmlsZSg/OkpvaW58UmVhZEZyb21FbmR8UmVjb2RlKXxMaW5lKD86RmluZHxSZWFkfFN1bSl8VGV4dCg/OkNvbXBhcmV8Q29tcGFyZVMpfFRyaW1OZXdMaW5lcylcfS8sIHRva2VuOiAidmFyaWFibGUtMiIsIGRlZGVudDogdHJ1ZX0sCgogICAgLy8gV2luVmVyLm5zaAogICAge3JlZ2V4OiAvXCRceyg/Oig/OkF0KD86TGVhc3R8TW9zdCl8SXMpKD86U2VydmljZVBhY2t8V2luKD86N3w4fDEwfDk1fDk4fDIwMCg/OjB8M3w4KD86UjIpPyl8TUV8TlQ0fFZpc3RhfFhQKSl8SXMoPzpOVHxTZXJ2ZXIpKVx9LywgdG9rZW46ICJ2YXJpYWJsZSIsIGRlZGVudDogdHJ1ZX0sCgogICAgLy8gV29yZEZ1bmMubnNoCiAgICB7cmVnZXg6IC9cJFx7KD86U3RyRmlsdGVyUz98VmVyc2lvbig/OkNvbXBhcmV8Q29udmVydCl8V29yZCg/OkFkZFM/fEZpbmQoPzooPzoyfDMpWCk/Uz98SW5zZXJ0Uz98UmVwbGFjZVM/KSlcfS8sIHRva2VuOiAidmFyaWFibGUtMiIsIGRlZGVudDogdHJ1ZX0sCgogICAgLy8geDY0Lm5zaAogICAge3JlZ2V4OiAvXCRceyg/OlJ1bm5pbmdYNjQpXH0vLCB0b2tlbjogInZhcmlhYmxlIiwgZGVkZW50OiB0cnVlfSwKICAgIHtyZWdleDogL1wkXHsoPzpEaXNhYmxlfEVuYWJsZSlYNjRGU1JlZGlyZWN0aW9uXH0vLCB0b2tlbjogInZhcmlhYmxlLTIiLCBkZWRlbnQ6IHRydWV9LAoKICAgIC8vIExpbmUgQ29tbWVudAogICAge3JlZ2V4OiAvKCN8OykuKi8sIHRva2VuOiAiY29tbWVudCJ9LAoKICAgIC8vIEJsb2NrIENvbW1lbnQKICAgIHtyZWdleDogL1wvXCovLCB0b2tlbjogImNvbW1lbnQiLCBuZXh0OiAiY29tbWVudCJ9LAoKICAgIC8vIE9wZXJhdG9yCiAgICB7cmVnZXg6IC9bLStcLyo9PD4hXSsvLCB0b2tlbjogIm9wZXJhdG9yIn0sCgogICAgLy8gVmFyaWFibGUKICAgIHtyZWdleDogL1wkXHcrLywgdG9rZW46ICJ2YXJpYWJsZSJ9LAoKICAgIC8vIENvbnN0YW50CiAgICB7cmVnZXg6IC9cJHtbXHdcLjotXSt9LywgdG9rZW46ICJ2YXJpYWJsZS0yIn0sCgogICAgLy8gTGFuZ3VhZ2UgU3RyaW5nCiAgICB7cmVnZXg6IC9cJFwoW1x3XC46LV0rXCkvLCB0b2tlbjogInZhcmlhYmxlLTMifQogIF0sCiAgY29tbWVudDogWwogICAge3JlZ2V4OiAvLio/XCpcLy8sIHRva2VuOiAiY29tbWVudCIsIG5leHQ6ICJzdGFydCJ9LAogICAge3JlZ2V4OiAvLiovLCB0b2tlbjogImNvbW1lbnQifQogIF0sCiAgbWV0YTogewogICAgZWxlY3RyaWNJbnB1dDogL15ccyooKEZ1bmN0aW9ufFBhZ2VFeHxTZWN0aW9ufFNlY3Rpb24oR3JvdXApPylFbmR8KFwhKGVuZGlmfG1hY3JvZW5kKSl8XCRceyhFbmQoSWZ8VW5sZXNzfFdoaWxlKXxMb29wKFVudGlsKXxOZXh0KVx9KSQvLAogICAgYmxvY2tDb21tZW50U3RhcnQ6ICIvKiIsCiAgICBibG9ja0NvbW1lbnRFbmQ6ICIqLyIsCiAgICBsaW5lQ29tbWVudDogWyIjIiwgIjsiXQogIH0KfSk7CgpDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveC1uc2lzIiwgIm5zaXMiKTsKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/ntriples/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/ntriples/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogTlRyaXBsZXMgbW9kZTwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uLy4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxzY3JpcHQgc3JjPSIuLi8uLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJudHJpcGxlcy5qcyI+PC9zY3JpcHQ+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICAgIC5Db2RlTWlycm9yIHsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZWVlOwogICAgICB9CiAgICA8L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxoMT5Db2RlTWlycm9yPC9oMT48aW1nIGlkPWxvZ28gc3JjPSIuLi8uLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5MYW5ndWFnZSBtb2RlczwvYT4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+TlRyaXBsZXM8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPk5UcmlwbGVzIG1vZGU8L2gyPgo8Zm9ybT4KPHRleHRhcmVhIGlkPSJudHJpcGxlcyIgbmFtZT0ibnRyaXBsZXMiPiAgICAKPGh0dHA6Ly9TdWIxPiAgICAgPGh0dHA6Ly9wcmVkMT4gICAgIDxodHRwOi8vb2JqPiAuCjxodHRwOi8vU3ViMj4gICAgIDxodHRwOi8vcHJlZDIjYW4yPiAibGl0ZXJhbCAxIiAuCjxodHRwOi8vU3ViMyNhbjM+IDxodHRwOi8vcHJlZDM+ICAgICBfOmJub2RlMyAuCl86Ym5vZGU0ICAgICAgICAgIDxodHRwOi8vcHJlZDQ+ICAgICAibGl0ZXJhbCAyIkBsYW5nIC4KXzpibm9kZTUgICAgICAgICAgPGh0dHA6Ly9wcmVkNT4gICAgICJsaXRlcmFsIDMiXl48aHR0cDovL3R5cGU+IC4KPC90ZXh0YXJlYT4KPC9mb3JtPgoKICAgIDxzY3JpcHQ+CiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgibnRyaXBsZXMiKSwge30pOwogICAgPC9zY3JpcHQ+CiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC9uLXRyaXBsZXM8L2NvZGU+LjwvcD4KICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/ntriples/ntriples.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIFRoaXMgc2NyaXB0IHByb3ZpZGVzIHN5bnRheCBoaWdobGlnaHRpbmcgc3VwcG9ydCBmb3IKKiB0aGUgTnRyaXBsZXMgZm9ybWF0LgoqIE50cmlwbGVzIGZvcm1hdCBzcGVjaWZpY2F0aW9uOgoqICAgICBodHRwOi8vd3d3LnczLm9yZy9UUi9yZGYtdGVzdGNhc2VzLyNudHJpcGxlcwoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qCiAgICBUaGUgZm9sbG93aW5nIGV4cHJlc3Npb24gZGVmaW5lcyB0aGUgZGVmaW5lZCBBU0YgZ3JhbW1hciB0cmFuc2l0aW9ucy4KCiAgICBwcmVfc3ViamVjdCAtPgogICAgICAgIHsKICAgICAgICAoIHdyaXRpbmdfc3ViamVjdF91cmkgfCB3cml0aW5nX2Jub2RlX3VyaSApCiAgICAgICAgICAgIC0+IHByZV9wcmVkaWNhdGUKICAgICAgICAgICAgICAgIC0+IHdyaXRpbmdfcHJlZGljYXRlX3VyaQogICAgICAgICAgICAgICAgICAgIC0+IHByZV9vYmplY3QKICAgICAgICAgICAgICAgICAgICAgICAgLT4gd3JpdGluZ19vYmplY3RfdXJpIHwgd3JpdGluZ19vYmplY3RfYm5vZGUgfAogICAgICAgICAgICAgICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRpbmdfb2JqZWN0X2xpdGVyYWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiB3cml0aW5nX2xpdGVyYWxfbGFuZyB8IHdyaXRpbmdfbGl0ZXJhbF90eXBlCiAgICAgICAgICAgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLT4gcG9zdF9vYmplY3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPiBCRUdJTgogICAgICAgICB9IG90aGVyd2lzZSB7CiAgICAgICAgICAgICAtPiBFUlJPUgogICAgICAgICB9CiovCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJudHJpcGxlcyIsIGZ1bmN0aW9uKCkgewoKICB2YXIgTG9jYXRpb24gPSB7CiAgICBQUkVfU1VCSkVDVCAgICAgICAgIDogMCwKICAgIFdSSVRJTkdfU1VCX1VSSSAgICAgOiAxLAogICAgV1JJVElOR19CTk9ERV9VUkkgICA6IDIsCiAgICBQUkVfUFJFRCAgICAgICAgICAgIDogMywKICAgIFdSSVRJTkdfUFJFRF9VUkkgICAgOiA0LAogICAgUFJFX09CSiAgICAgICAgICAgICA6IDUsCiAgICBXUklUSU5HX09CSl9VUkkgICAgIDogNiwKICAgIFdSSVRJTkdfT0JKX0JOT0RFICAgOiA3LAogICAgV1JJVElOR19PQkpfTElURVJBTCA6IDgsCiAgICBXUklUSU5HX0xJVF9MQU5HICAgIDogOSwKICAgIFdSSVRJTkdfTElUX1RZUEUgICAgOiAxMCwKICAgIFBPU1RfT0JKICAgICAgICAgICAgOiAxMSwKICAgIEVSUk9SICAgICAgICAgICAgICAgOiAxMgogIH07CiAgZnVuY3Rpb24gdHJhbnNpdFN0YXRlKGN1cnJTdGF0ZSwgYykgewogICAgdmFyIGN1cnJMb2NhdGlvbiA9IGN1cnJTdGF0ZS5sb2NhdGlvbjsKICAgIHZhciByZXQ7CgogICAgLy8gT3BlbmluZy4KICAgIGlmICAgICAoY3VyckxvY2F0aW9uID09IExvY2F0aW9uLlBSRV9TVUJKRUNUICYmIGMgPT0gJzwnKSByZXQgPSBMb2NhdGlvbi5XUklUSU5HX1NVQl9VUkk7CiAgICBlbHNlIGlmKGN1cnJMb2NhdGlvbiA9PSBMb2NhdGlvbi5QUkVfU1VCSkVDVCAmJiBjID09ICdfJykgcmV0ID0gTG9jYXRpb24uV1JJVElOR19CTk9ERV9VUkk7CiAgICBlbHNlIGlmKGN1cnJMb2NhdGlvbiA9PSBMb2NhdGlvbi5QUkVfUFJFRCAgICAmJiBjID09ICc8JykgcmV0ID0gTG9jYXRpb24uV1JJVElOR19QUkVEX1VSSTsKICAgIGVsc2UgaWYoY3VyckxvY2F0aW9uID09IExvY2F0aW9uLlBSRV9PQkogICAgICYmIGMgPT0gJzwnKSByZXQgPSBMb2NhdGlvbi5XUklUSU5HX09CSl9VUkk7CiAgICBlbHNlIGlmKGN1cnJMb2NhdGlvbiA9PSBMb2NhdGlvbi5QUkVfT0JKICAgICAmJiBjID09ICdfJykgcmV0ID0gTG9jYXRpb24uV1JJVElOR19PQkpfQk5PREU7CiAgICBlbHNlIGlmKGN1cnJMb2NhdGlvbiA9PSBMb2NhdGlvbi5QUkVfT0JKICAgICAmJiBjID09ICciJykgcmV0ID0gTG9jYXRpb24uV1JJVElOR19PQkpfTElURVJBTDsKCiAgICAvLyBDbG9zaW5nLgogICAgZWxzZSBpZihjdXJyTG9jYXRpb24gPT0gTG9jYXRpb24uV1JJVElOR19TVUJfVVJJICAgICAmJiBjID09ICc+JykgcmV0ID0gTG9jYXRpb24uUFJFX1BSRUQ7CiAgICBlbHNlIGlmKGN1cnJMb2NhdGlvbiA9PSBMb2NhdGlvbi5XUklUSU5HX0JOT0RFX1VSSSAgICYmIGMgPT0gJyAnKSByZXQgPSBMb2NhdGlvbi5QUkVfUFJFRDsKICAgIGVsc2UgaWYoY3VyckxvY2F0aW9uID09IExvY2F0aW9uLldSSVRJTkdfUFJFRF9VUkkgICAgJiYgYyA9PSAnPicpIHJldCA9IExvY2F0aW9uLlBSRV9PQko7CiAgICBlbHNlIGlmKGN1cnJMb2NhdGlvbiA9PSBMb2NhdGlvbi5XUklUSU5HX09CSl9VUkkgICAgICYmIGMgPT0gJz4nKSByZXQgPSBMb2NhdGlvbi5QT1NUX09CSjsKICAgIGVsc2UgaWYoY3VyckxvY2F0aW9uID09IExvY2F0aW9uLldSSVRJTkdfT0JKX0JOT0RFICAgJiYgYyA9PSAnICcpIHJldCA9IExvY2F0aW9uLlBPU1RfT0JKOwogICAgZWxzZSBpZihjdXJyTG9jYXRpb24gPT0gTG9jYXRpb24uV1JJVElOR19PQkpfTElURVJBTCAmJiBjID09ICciJykgcmV0ID0gTG9jYXRpb24uUE9TVF9PQko7CiAgICBlbHNlIGlmKGN1cnJMb2NhdGlvbiA9PSBMb2NhdGlvbi5XUklUSU5HX0xJVF9MQU5HICYmIGMgPT0gJyAnKSByZXQgPSBMb2NhdGlvbi5QT1NUX09CSjsKICAgIGVsc2UgaWYoY3VyckxvY2F0aW9uID09IExvY2F0aW9uLldSSVRJTkdfTElUX1RZUEUgJiYgYyA9PSAnPicpIHJldCA9IExvY2F0aW9uLlBPU1RfT0JKOwoKICAgIC8vIENsb3NpbmcgdHlwZWQgYW5kIGxhbmd1YWdlIGxpdGVyYWwuCiAgICBlbHNlIGlmKGN1cnJMb2NhdGlvbiA9PSBMb2NhdGlvbi5XUklUSU5HX09CSl9MSVRFUkFMICYmIGMgPT0gJ0AnKSByZXQgPSBMb2NhdGlvbi5XUklUSU5HX0xJVF9MQU5HOwogICAgZWxzZSBpZihjdXJyTG9jYXRpb24gPT0gTG9jYXRpb24uV1JJVElOR19PQkpfTElURVJBTCAmJiBjID09ICdeJykgcmV0ID0gTG9jYXRpb24uV1JJVElOR19MSVRfVFlQRTsKCiAgICAvLyBTcGFjZXMuCiAgICBlbHNlIGlmKCBjID09ICcgJyAmJgogICAgICAgICAgICAgKAogICAgICAgICAgICAgICBjdXJyTG9jYXRpb24gPT0gTG9jYXRpb24uUFJFX1NVQkpFQ1QgfHwKICAgICAgICAgICAgICAgY3VyckxvY2F0aW9uID09IExvY2F0aW9uLlBSRV9QUkVEICAgIHx8CiAgICAgICAgICAgICAgIGN1cnJMb2NhdGlvbiA9PSBMb2NhdGlvbi5QUkVfT0JKICAgICB8fAogICAgICAgICAgICAgICBjdXJyTG9jYXRpb24gPT0gTG9jYXRpb24uUE9TVF9PQkoKICAgICAgICAgICAgICkKICAgICAgICAgICApIHJldCA9IGN1cnJMb2NhdGlvbjsKCiAgICAvLyBSZXNldC4KICAgIGVsc2UgaWYoY3VyckxvY2F0aW9uID09IExvY2F0aW9uLlBPU1RfT0JKICYmIGMgPT0gJy4nKSByZXQgPSBMb2NhdGlvbi5QUkVfU1VCSkVDVDsKCiAgICAvLyBFcnJvcgogICAgZWxzZSByZXQgPSBMb2NhdGlvbi5FUlJPUjsKCiAgICBjdXJyU3RhdGUubG9jYXRpb249cmV0OwogIH0KCiAgcmV0dXJuIHsKICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKCkgewogICAgICAgcmV0dXJuIHsKICAgICAgICAgICBsb2NhdGlvbiA6IExvY2F0aW9uLlBSRV9TVUJKRUNULAogICAgICAgICAgIHVyaXMgICAgIDogW10sCiAgICAgICAgICAgYW5jaG9ycyAgOiBbXSwKICAgICAgICAgICBibm9kZXMgICA6IFtdLAogICAgICAgICAgIGxhbmdzICAgIDogW10sCiAgICAgICAgICAgdHlwZXMgICAgOiBbXQogICAgICAgfTsKICAgIH0sCiAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpOwogICAgICBpZihjaCA9PSAnPCcpIHsKICAgICAgICAgdHJhbnNpdFN0YXRlKHN0YXRlLCBjaCk7CiAgICAgICAgIHZhciBwYXJzZWRVUkkgPSAnJzsKICAgICAgICAgc3RyZWFtLmVhdFdoaWxlKCBmdW5jdGlvbihjKSB7IGlmKCBjICE9ICcjJyAmJiBjICE9ICc+JyApIHsgcGFyc2VkVVJJICs9IGM7IHJldHVybiB0cnVlOyB9IHJldHVybiBmYWxzZTt9ICk7CiAgICAgICAgIHN0YXRlLnVyaXMucHVzaChwYXJzZWRVUkkpOwogICAgICAgICBpZiggc3RyZWFtLm1hdGNoKCcjJywgZmFsc2UpICkgcmV0dXJuICd2YXJpYWJsZSc7CiAgICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgIHRyYW5zaXRTdGF0ZShzdGF0ZSwgJz4nKTsKICAgICAgICAgcmV0dXJuICd2YXJpYWJsZSc7CiAgICAgIH0KICAgICAgaWYoY2ggPT0gJyMnKSB7CiAgICAgICAgdmFyIHBhcnNlZEFuY2hvciA9ICcnOwogICAgICAgIHN0cmVhbS5lYXRXaGlsZShmdW5jdGlvbihjKSB7IGlmKGMgIT0gJz4nICYmIGMgIT0gJyAnKSB7IHBhcnNlZEFuY2hvcis9IGM7IHJldHVybiB0cnVlOyB9IHJldHVybiBmYWxzZTt9KTsKICAgICAgICBzdGF0ZS5hbmNob3JzLnB1c2gocGFyc2VkQW5jaG9yKTsKICAgICAgICByZXR1cm4gJ3ZhcmlhYmxlLTInOwogICAgICB9CiAgICAgIGlmKGNoID09ICc+JykgewogICAgICAgICAgdHJhbnNpdFN0YXRlKHN0YXRlLCAnPicpOwogICAgICAgICAgcmV0dXJuICd2YXJpYWJsZSc7CiAgICAgIH0KICAgICAgaWYoY2ggPT0gJ18nKSB7CiAgICAgICAgICB0cmFuc2l0U3RhdGUoc3RhdGUsIGNoKTsKICAgICAgICAgIHZhciBwYXJzZWRCTm9kZSA9ICcnOwogICAgICAgICAgc3RyZWFtLmVhdFdoaWxlKGZ1bmN0aW9uKGMpIHsgaWYoIGMgIT0gJyAnICkgeyBwYXJzZWRCTm9kZSArPSBjOyByZXR1cm4gdHJ1ZTsgfSByZXR1cm4gZmFsc2U7fSk7CiAgICAgICAgICBzdGF0ZS5ibm9kZXMucHVzaChwYXJzZWRCTm9kZSk7CiAgICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgICAgdHJhbnNpdFN0YXRlKHN0YXRlLCAnICcpOwogICAgICAgICAgcmV0dXJuICdidWlsdGluJzsKICAgICAgfQogICAgICBpZihjaCA9PSAnIicpIHsKICAgICAgICAgIHRyYW5zaXRTdGF0ZShzdGF0ZSwgY2gpOwogICAgICAgICAgc3RyZWFtLmVhdFdoaWxlKCBmdW5jdGlvbihjKSB7IHJldHVybiBjICE9ICciJzsgfSApOwogICAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgICAgIGlmKCBzdHJlYW0ucGVlaygpICE9ICdAJyAmJiBzdHJlYW0ucGVlaygpICE9ICdeJyApIHsKICAgICAgICAgICAgICB0cmFuc2l0U3RhdGUoc3RhdGUsICciJyk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gJ3N0cmluZyc7CiAgICAgIH0KICAgICAgaWYoIGNoID09ICdAJyApIHsKICAgICAgICAgIHRyYW5zaXRTdGF0ZShzdGF0ZSwgJ0AnKTsKICAgICAgICAgIHZhciBwYXJzZWRMYW5nID0gJyc7CiAgICAgICAgICBzdHJlYW0uZWF0V2hpbGUoZnVuY3Rpb24oYykgeyBpZiggYyAhPSAnICcgKSB7IHBhcnNlZExhbmcgKz0gYzsgcmV0dXJuIHRydWU7IH0gcmV0dXJuIGZhbHNlO30pOwogICAgICAgICAgc3RhdGUubGFuZ3MucHVzaChwYXJzZWRMYW5nKTsKICAgICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgICB0cmFuc2l0U3RhdGUoc3RhdGUsICcgJyk7CiAgICAgICAgICByZXR1cm4gJ3N0cmluZy0yJzsKICAgICAgfQogICAgICBpZiggY2ggPT0gJ14nICkgewogICAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgICAgIHRyYW5zaXRTdGF0ZShzdGF0ZSwgJ14nKTsKICAgICAgICAgIHZhciBwYXJzZWRUeXBlID0gJyc7CiAgICAgICAgICBzdHJlYW0uZWF0V2hpbGUoZnVuY3Rpb24oYykgeyBpZiggYyAhPSAnPicgKSB7IHBhcnNlZFR5cGUgKz0gYzsgcmV0dXJuIHRydWU7IH0gcmV0dXJuIGZhbHNlO30gKTsKICAgICAgICAgIHN0YXRlLnR5cGVzLnB1c2gocGFyc2VkVHlwZSk7CiAgICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgICAgdHJhbnNpdFN0YXRlKHN0YXRlLCAnPicpOwogICAgICAgICAgcmV0dXJuICd2YXJpYWJsZSc7CiAgICAgIH0KICAgICAgaWYoIGNoID09ICcgJyApIHsKICAgICAgICAgIHRyYW5zaXRTdGF0ZShzdGF0ZSwgY2gpOwogICAgICB9CiAgICAgIGlmKCBjaCA9PSAnLicgKSB7CiAgICAgICAgICB0cmFuc2l0U3RhdGUoc3RhdGUsIGNoKTsKICAgICAgfQogICAgfQogIH07Cn0pOwoKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L24tdHJpcGxlcyIsICJudHJpcGxlcyIpOwoKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/octave/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/octave/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogT2N0YXZlIG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0ib2N0YXZlLmpzIj48L3NjcmlwdD4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4uQ29kZU1pcnJvciB7Ym9yZGVyLXRvcDogMXB4IHNvbGlkIGJsYWNrOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGgxPkNvZGVNaXJyb3I8L2gxPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5PY3RhdmU8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPk9jdGF2ZSBtb2RlPC9oMj4KCiAgICA8ZGl2Pjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+CiVudW1iZXJzClsxMjM0IDEyMzRpIDEyMzRqXQpbLjIzNCAuMjM0aiAyLjIzaV0KWzIzZTIgMTJFMWogMTIzRC00IDB4MjM0XQoKJXN0cmluZ3MKJ2FzZGEnJ2EnCiJhc2RhIiJhIgoKJWlkZW50aWZpZXJzCmEgKyBhczEyMyAtIF9fYXNkX18KCiVvcGVyYXRvcnMKLQorCj0KPT0KPgo8Cj49Cjw9CiYKfgouLi4KYnJlYWsgemVyb3MgZGVmYXVsdCBtYXJnaW4gcm91bmQgb25lcyByYW5kCmNlaWwgZmxvb3Igc2l6ZSBjbGVhciB6ZXJvcyBleWUgbWVhbiBzdGQgY292CmVycm9yIGV2YWwgZnVuY3Rpb24KYWJzIGFjb3MgYXRhbiBhc2luIGNvcyBjb3NoIGV4cCBsb2cgcHJvZCBzdW0KbG9nMTAgbWF4IG1pbiBzaWduIHNpbiBzaW5oIHNxcnQgdGFuIHJlc2hhcGUKcmV0dXJuCmNhc2Ugc3dpdGNoCmVsc2UgZWxzZWlmIGVuZCBpZiBvdGhlcndpc2UKZG8gZm9yIHdoaWxlCnRyeSBjYXRjaApjbGFzc2RlZiBwcm9wZXJ0aWVzIGV2ZW50cyBtZXRob2RzCmdsb2JhbCBwZXJzaXN0ZW50Cgolb25lIGxpbmUgY29tbWVudAoleyBtdWx0aSAKbGluZSBjb21tZW50ICV9CgogICAgPC90ZXh0YXJlYT48L2Rpdj4KICAgIDxzY3JpcHQ+CiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICAgICAgbW9kZToge25hbWU6ICJvY3RhdmUiLAogICAgICAgICAgICAgICB2ZXJzaW9uOiAyLAogICAgICAgICAgICAgICBzaW5nbGVMaW5lU3RyaW5nRXJyb3JzOiBmYWxzZX0sCiAgICAgICAgbGluZU51bWJlcnM6IHRydWUsCiAgICAgICAgaW5kZW50VW5pdDogNCwKICAgICAgICBtYXRjaEJyYWNrZXRzOiB0cnVlCiAgICAgIH0pOwogICAgPC9zY3JpcHQ+CgogICAgPHA+PHN0cm9uZz5NSU1FIHR5cGVzIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPnRleHQveC1vY3RhdmU8L2NvZGU+LjwvcD4KPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/octave/octave.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJvY3RhdmUiLCBmdW5jdGlvbigpIHsKICBmdW5jdGlvbiB3b3JkUmVnZXhwKHdvcmRzKSB7CiAgICByZXR1cm4gbmV3IFJlZ0V4cCgiXigoIiArIHdvcmRzLmpvaW4oIil8KCIpICsgIikpXFxiIik7CiAgfQoKICB2YXIgc2luZ2xlT3BlcmF0b3JzID0gbmV3IFJlZ0V4cCgiXltcXCtcXC1cXCovJnxcXF5+PD4hQCdcXFxcXSIpOwogIHZhciBzaW5nbGVEZWxpbWl0ZXJzID0gbmV3IFJlZ0V4cCgnXltcXChcXFtcXHtcXH0sOj07XScpOwogIHZhciBkb3VibGVPcGVyYXRvcnMgPSBuZXcgUmVnRXhwKCJeKCg9PSl8KH49KXwoPD0pfCg+PSl8KDw8KXwoPj4pfChcXC5bXFwrXFwtXFwqL1xcXlxcXFxdKSkiKTsKICB2YXIgZG91YmxlRGVsaW1pdGVycyA9IG5ldyBSZWdFeHAoIl4oKCE9KXwoXFwrPSl8KFxcLT0pfChcXCo9KXwoLz0pfCgmPSl8KFxcfD0pfChcXF49KSkiKTsKICB2YXIgdHJpcGxlRGVsaW1pdGVycyA9IG5ldyBSZWdFeHAoIl4oKD4+PSl8KDw8PSkpIik7CiAgdmFyIGV4cHJlc3Npb25FbmQgPSBuZXcgUmVnRXhwKCJeW1xcXVxcKV0iKTsKICB2YXIgaWRlbnRpZmllcnMgPSBuZXcgUmVnRXhwKCJeW19BLVphLXpceGExLVx1ZmZmZl1bX0EtWmEtejAtOVx4YTEtXHVmZmZmXSoiKTsKCiAgdmFyIGJ1aWx0aW5zID0gd29yZFJlZ2V4cChbCiAgICAnZXJyb3InLCAnZXZhbCcsICdmdW5jdGlvbicsICdhYnMnLCAnYWNvcycsICdhdGFuJywgJ2FzaW4nLCAnY29zJywKICAgICdjb3NoJywgJ2V4cCcsICdsb2cnLCAncHJvZCcsICdzdW0nLCAnbG9nMTAnLCAnbWF4JywgJ21pbicsICdzaWduJywgJ3NpbicsICdzaW5oJywKICAgICdzcXJ0JywgJ3RhbicsICdyZXNoYXBlJywgJ2JyZWFrJywgJ3plcm9zJywgJ2RlZmF1bHQnLCAnbWFyZ2luJywgJ3JvdW5kJywgJ29uZXMnLAogICAgJ3JhbmQnLCAnc3luJywgJ2NlaWwnLCAnZmxvb3InLCAnc2l6ZScsICdjbGVhcicsICd6ZXJvcycsICdleWUnLCAnbWVhbicsICdzdGQnLCAnY292JywKICAgICdkZXQnLCAnZWlnJywgJ2ludicsICdub3JtJywgJ3JhbmsnLCAndHJhY2UnLCAnZXhwbScsICdsb2dtJywgJ3NxcnRtJywgJ2xpbnNwYWNlJywgJ3Bsb3QnLAogICAgJ3RpdGxlJywgJ3hsYWJlbCcsICd5bGFiZWwnLCAnbGVnZW5kJywgJ3RleHQnLCAnZ3JpZCcsICdtZXNoZ3JpZCcsICdtZXNoJywgJ251bTJzdHInLAogICAgJ2ZmdCcsICdpZmZ0JywgJ2FycmF5ZnVuJywgJ2NlbGxmdW4nLCAnaW5wdXQnLCAnZmxpcGxyJywgJ2ZsaXB1ZCcsICdpc21lbWJlcicKICBdKTsKCiAgdmFyIGtleXdvcmRzID0gd29yZFJlZ2V4cChbCiAgICAncmV0dXJuJywgJ2Nhc2UnLCAnc3dpdGNoJywgJ2Vsc2UnLCAnZWxzZWlmJywgJ2VuZCcsICdlbmRpZicsICdlbmRmdW5jdGlvbicsCiAgICAnaWYnLCAnb3RoZXJ3aXNlJywgJ2RvJywgJ2ZvcicsICd3aGlsZScsICd0cnknLCAnY2F0Y2gnLCAnY2xhc3NkZWYnLCAncHJvcGVydGllcycsICdldmVudHMnLAogICAgJ21ldGhvZHMnLCAnZ2xvYmFsJywgJ3BlcnNpc3RlbnQnLCAnZW5kZm9yJywgJ2VuZHdoaWxlJywgJ3ByaW50ZicsICdzcHJpbnRmJywgJ2Rpc3AnLCAndW50aWwnLAogICAgJ2NvbnRpbnVlJywgJ3BrZycKICBdKTsKCgogIC8vIHRva2VuaXplcnMKICBmdW5jdGlvbiB0b2tlblRyYW5zcG9zZShzdHJlYW0sIHN0YXRlKSB7CiAgICBpZiAoIXN0cmVhbS5zb2woKSAmJiBzdHJlYW0ucGVlaygpID09PSAnXCcnKSB7CiAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlOwogICAgICByZXR1cm4gJ29wZXJhdG9yJzsKICAgIH0KICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlOwogICAgcmV0dXJuIHRva2VuQmFzZShzdHJlYW0sIHN0YXRlKTsKICB9CgoKICBmdW5jdGlvbiB0b2tlbkNvbW1lbnQoc3RyZWFtLCBzdGF0ZSkgewogICAgaWYgKHN0cmVhbS5tYXRjaCgvXi4qJX0vKSkgewogICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTsKICAgICAgcmV0dXJuICdjb21tZW50JzsKICAgIH07CiAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICByZXR1cm4gJ2NvbW1lbnQnOwogIH0KCiAgZnVuY3Rpb24gdG9rZW5CYXNlKHN0cmVhbSwgc3RhdGUpIHsKICAgIC8vIHdoaXRlc3BhY2VzCiAgICBpZiAoc3RyZWFtLmVhdFNwYWNlKCkpIHJldHVybiBudWxsOwoKICAgIC8vIEhhbmRsZSBvbmUgbGluZSBDb21tZW50cwogICAgaWYgKHN0cmVhbS5tYXRjaCgnJXsnKSl7CiAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5Db21tZW50OwogICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICAgIHJldHVybiAnY29tbWVudCc7CiAgICB9CgogICAgaWYgKHN0cmVhbS5tYXRjaCgvXlslI10vKSl7CiAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgcmV0dXJuICdjb21tZW50JzsKICAgIH0KCiAgICAvLyBIYW5kbGUgTnVtYmVyIExpdGVyYWxzCiAgICBpZiAoc3RyZWFtLm1hdGNoKC9eWzAtOVwuKy1dLywgZmFsc2UpKSB7CiAgICAgIGlmIChzdHJlYW0ubWF0Y2goL15bKy1dPzB4WzAtOWEtZkEtRl0rW2lqXT8vKSkgewogICAgICAgIHN0cmVhbS50b2tlbml6ZSA9IHRva2VuQmFzZTsKICAgICAgICByZXR1cm4gJ251bWJlcic7IH07CiAgICAgIGlmIChzdHJlYW0ubWF0Y2goL15bKy1dP1xkKlwuXGQrKFtFZURkXVsrLV0/XGQrKT9baWpdPy8pKSB7IHJldHVybiAnbnVtYmVyJzsgfTsKICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXlsrLV0/XGQrKFtFZURkXVsrLV0/XGQrKT9baWpdPy8pKSB7IHJldHVybiAnbnVtYmVyJzsgfTsKICAgIH0KICAgIGlmIChzdHJlYW0ubWF0Y2god29yZFJlZ2V4cChbJ25hbicsJ05hTicsJ2luZicsJ0luZiddKSkpIHsgcmV0dXJuICdudW1iZXInOyB9OwoKICAgIC8vIEhhbmRsZSBTdHJpbmdzCiAgICBpZiAoc3RyZWFtLm1hdGNoKC9eIihbXiJdfCgiIikpKiIvKSkgeyByZXR1cm4gJ3N0cmluZyc7IH0gOwogICAgaWYgKHN0cmVhbS5tYXRjaCgvXicoW14nXXwoJycpKSonLykpIHsgcmV0dXJuICdzdHJpbmcnOyB9IDsKCiAgICAvLyBIYW5kbGUgd29yZHMKICAgIGlmIChzdHJlYW0ubWF0Y2goa2V5d29yZHMpKSB7IHJldHVybiAna2V5d29yZCc7IH0gOwogICAgaWYgKHN0cmVhbS5tYXRjaChidWlsdGlucykpIHsgcmV0dXJuICdidWlsdGluJzsgfSA7CiAgICBpZiAoc3RyZWFtLm1hdGNoKGlkZW50aWZpZXJzKSkgeyByZXR1cm4gJ3ZhcmlhYmxlJzsgfSA7CgogICAgaWYgKHN0cmVhbS5tYXRjaChzaW5nbGVPcGVyYXRvcnMpIHx8IHN0cmVhbS5tYXRjaChkb3VibGVPcGVyYXRvcnMpKSB7IHJldHVybiAnb3BlcmF0b3InOyB9OwogICAgaWYgKHN0cmVhbS5tYXRjaChzaW5nbGVEZWxpbWl0ZXJzKSB8fCBzdHJlYW0ubWF0Y2goZG91YmxlRGVsaW1pdGVycykgfHwgc3RyZWFtLm1hdGNoKHRyaXBsZURlbGltaXRlcnMpKSB7IHJldHVybiBudWxsOyB9OwoKICAgIGlmIChzdHJlYW0ubWF0Y2goZXhwcmVzc2lvbkVuZCkpIHsKICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlblRyYW5zcG9zZTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9OwoKCiAgICAvLyBIYW5kbGUgbm9uLWRldGVjdGVkIGl0ZW1zCiAgICBzdHJlYW0ubmV4dCgpOwogICAgcmV0dXJuICdlcnJvcic7CiAgfTsKCgogIHJldHVybiB7CiAgICBzdGFydFN0YXRlOiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICB0b2tlbml6ZTogdG9rZW5CYXNlCiAgICAgIH07CiAgICB9LAoKICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHZhciBzdHlsZSA9IHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgICBpZiAoc3R5bGUgPT09ICdudW1iZXInIHx8IHN0eWxlID09PSAndmFyaWFibGUnKXsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuVHJhbnNwb3NlOwogICAgICB9CiAgICAgIHJldHVybiBzdHlsZTsKICAgIH0KICB9Owp9KTsKCkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC94LW9jdGF2ZSIsICJvY3RhdmUiKTsKCn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/oz/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/oz/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogT3ogbW9kZTwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uLy4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxzY3JpcHQgc3JjPSIuLi8uLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJvei5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii4uLy4uL2FkZG9uL3J1bm1vZGUvcnVubW9kZS5qcyI+PC9zY3JpcHQ+CjxzdHlsZT4KICAuQ29kZU1pcnJvciB7Ym9yZGVyOiAxcHggc29saWQgI2FhYTt9Cjwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGgxPkNvZGVNaXJyb3I8L2gxPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+TGFuZ3VhZ2UgbW9kZXM8L2E+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPk96PC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5PeiBtb2RlPC9oMj4KPHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KZGVjbGFyZQpmdW4ge0ludHMgTiBNYXh9CiAgaWYgTiA9PSBNYXggdGhlbiBuaWwKICBlbHNlCiAgICB7RGVsYXkgMTAwMH0KICAgIE58e0ludHMgTisxIE1heH0KICBlbmQKZW5kCgpmdW4ge1N1bSBTIFN0cmVhbX0KICBjYXNlIFN0cmVhbSBvZiBuaWwgdGhlbiBTCiAgW10gSHxUIHRoZW4gU3x7U3VtIEgrUyBUfSBlbmQKZW5kCgpsb2NhbCBYIFkgaW4KICB0aHJlYWQgWCA9IHtJbnRzIDAgMTAwMH0gZW5kCiAgdGhyZWFkIFkgPSB7U3VtIDAgWH0gZW5kCiAge0Jyb3dzZSBZfQplbmQKPC90ZXh0YXJlYT4KPHA+TUlNRSB0eXBlIGRlZmluZWQ6IDxjb2RlPnRleHQveC1vejwvY29kZT4uPC9wPgoKPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgp2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgbGluZU51bWJlcnM6IHRydWUsCiAgICBtb2RlOiAidGV4dC94LW96IiwKICAgIHJlYWRPbmx5OiBmYWxzZQp9KTsKPC9zY3JpcHQ+CjwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/oz/oz.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJveiIsIGZ1bmN0aW9uIChjb25mKSB7CgogIGZ1bmN0aW9uIHdvcmRSZWdleHAod29yZHMpIHsKICAgIHJldHVybiBuZXcgUmVnRXhwKCJeKCgiICsgd29yZHMuam9pbigiKXwoIikgKyAiKSlcXGIiKTsKICB9CgogIHZhciBzaW5nbGVPcGVyYXRvcnMgPSAvW1xeQCFcfDw+I35cLlwqXC1cK1xcLyw9XS87CiAgdmFyIGRvdWJsZU9wZXJhdG9ycyA9IC8oPC0pfCg6PSl8KD08KXwoPj0pfCg8PSl8KDw6KXwoPjopfCg9Oil8KFxcPSl8KFxcPTopfCghISl8KD09KXwoOjopLzsKICB2YXIgdHJpcGxlT3BlcmF0b3JzID0gLyg6OjopfChcLlwuXC4pfCg9PDopfCg+PTopLzsKCiAgdmFyIG1pZGRsZSA9IFsiaW4iLCAidGhlbiIsICJlbHNlIiwgIm9mIiwgImVsc2VvZiIsICJlbHNlY2FzZSIsICJlbHNlaWYiLCAiY2F0Y2giLAogICAgImZpbmFsbHkiLCAid2l0aCIsICJyZXF1aXJlIiwgInByZXBhcmUiLCAiaW1wb3J0IiwgImV4cG9ydCIsICJkZWZpbmUiLCAiZG8iXTsKICB2YXIgZW5kID0gWyJlbmQiXTsKCiAgdmFyIGF0b21zID0gd29yZFJlZ2V4cChbInRydWUiLCAiZmFsc2UiLCAibmlsIiwgInVuaXQiXSk7CiAgdmFyIGNvbW1vbktleXdvcmRzID0gd29yZFJlZ2V4cChbImFuZHRoZW4iLCAiYXQiLCAiYXR0ciIsICJkZWNsYXJlIiwgImZlYXQiLCAiZnJvbSIsICJsZXgiLAogICAgIm1vZCIsICJtb2RlIiwgIm9yZWxzZSIsICJwYXJzZXIiLCAicHJvZCIsICJwcm9wIiwgInNjYW5uZXIiLCAic2VsZiIsICJzeW4iLCAidG9rZW4iXSk7CiAgdmFyIG9wZW5pbmdLZXl3b3JkcyA9IHdvcmRSZWdleHAoWyJsb2NhbCIsICJwcm9jIiwgImZ1biIsICJjYXNlIiwgImNsYXNzIiwgImlmIiwgImNvbmQiLCAib3IiLCAiZGlzIiwKICAgICJjaG9pY2UiLCAibm90IiwgInRocmVhZCIsICJ0cnkiLCAicmFpc2UiLCAibG9jayIsICJmb3IiLCAic3VjaHRoYXQiLCAibWV0aCIsICJmdW5jdG9yIl0pOwogIHZhciBtaWRkbGVLZXl3b3JkcyA9IHdvcmRSZWdleHAobWlkZGxlKTsKICB2YXIgZW5kS2V5d29yZHMgPSB3b3JkUmVnZXhwKGVuZCk7CgogIC8vIFRva2VuaXplcnMKICBmdW5jdGlvbiB0b2tlbkJhc2Uoc3RyZWFtLCBzdGF0ZSkgewogICAgaWYgKHN0cmVhbS5lYXRTcGFjZSgpKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIC8vIEJyYWNrZXRzCiAgICBpZihzdHJlYW0ubWF0Y2goL1t7fV0vKSkgewogICAgICByZXR1cm4gImJyYWNrZXQiOwogICAgfQoKICAgIC8vIFNwZWNpYWwgW10ga2V5d29yZAogICAgaWYgKHN0cmVhbS5tYXRjaCgvKFxbXSkvKSkgewogICAgICAgIHJldHVybiAia2V5d29yZCIKICAgIH0KCiAgICAvLyBPcGVyYXRvcnMKICAgIGlmIChzdHJlYW0ubWF0Y2godHJpcGxlT3BlcmF0b3JzKSB8fCBzdHJlYW0ubWF0Y2goZG91YmxlT3BlcmF0b3JzKSkgewogICAgICByZXR1cm4gIm9wZXJhdG9yIjsKICAgIH0KCiAgICAvLyBBdG9tcwogICAgaWYoc3RyZWFtLm1hdGNoKGF0b21zKSkgewogICAgICByZXR1cm4gJ2F0b20nOwogICAgfQoKICAgIC8vIE9wZW5pbmcga2V5d29yZHMKICAgIHZhciBtYXRjaGVkID0gc3RyZWFtLm1hdGNoKG9wZW5pbmdLZXl3b3Jkcyk7CiAgICBpZiAobWF0Y2hlZCkgewogICAgICBpZiAoIXN0YXRlLmRvSW5DdXJyZW50TGluZSkKICAgICAgICBzdGF0ZS5jdXJyZW50SW5kZW50Kys7CiAgICAgIGVsc2UKICAgICAgICBzdGF0ZS5kb0luQ3VycmVudExpbmUgPSBmYWxzZTsKCiAgICAgIC8vIFNwZWNpYWwgbWF0Y2hpbmcgZm9yIHNpZ25hdHVyZXMKICAgICAgaWYobWF0Y2hlZFswXSA9PSAicHJvYyIgfHwgbWF0Y2hlZFswXSA9PSAiZnVuIikKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuRnVuUHJvYzsKICAgICAgZWxzZSBpZihtYXRjaGVkWzBdID09ICJjbGFzcyIpCiAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkNsYXNzOwogICAgICBlbHNlIGlmKG1hdGNoZWRbMF0gPT0gIm1ldGgiKQogICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5NZXRoOwoKICAgICAgcmV0dXJuICdrZXl3b3JkJzsKICAgIH0KCiAgICAvLyBNaWRkbGUgYW5kIG90aGVyIGtleXdvcmRzCiAgICBpZiAoc3RyZWFtLm1hdGNoKG1pZGRsZUtleXdvcmRzKSB8fCBzdHJlYW0ubWF0Y2goY29tbW9uS2V5d29yZHMpKSB7CiAgICAgIHJldHVybiAia2V5d29yZCIKICAgIH0KCiAgICAvLyBFbmQga2V5d29yZHMKICAgIGlmIChzdHJlYW0ubWF0Y2goZW5kS2V5d29yZHMpKSB7CiAgICAgIHN0YXRlLmN1cnJlbnRJbmRlbnQtLTsKICAgICAgcmV0dXJuICdrZXl3b3JkJzsKICAgIH0KCiAgICAvLyBFYXQgdGhlIG5leHQgY2hhciBmb3IgbmV4dCBjb21wYXJpc29ucwogICAgdmFyIGNoID0gc3RyZWFtLm5leHQoKTsKCiAgICAvLyBTdHJpbmdzCiAgICBpZiAoY2ggPT0gJyInIHx8IGNoID09ICInIikgewogICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuU3RyaW5nKGNoKTsKICAgICAgcmV0dXJuIHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgfQoKICAgIC8vIE51bWJlcnMKICAgIGlmICgvW35cZF0vLnRlc3QoY2gpKSB7CiAgICAgIGlmIChjaCA9PSAifiIpIHsKICAgICAgICBpZighIC9eWzAtOV0vLnRlc3Qoc3RyZWFtLnBlZWsoKSkpCiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICBlbHNlIGlmICgoIHN0cmVhbS5uZXh0KCkgPT0gIjAiICYmIHN0cmVhbS5tYXRjaCgvXlt4WF1bMC05YS1mQS1GXSsvKSkgfHwgc3RyZWFtLm1hdGNoKC9eWzAtOV0qKFwuWzAtOV0rKT8oW2VFXVt+K10/WzAtOV0rKT8vKSkKICAgICAgICAgIHJldHVybiAibnVtYmVyIjsKICAgICAgfQoKICAgICAgaWYgKChjaCA9PSAiMCIgJiYgc3RyZWFtLm1hdGNoKC9eW3hYXVswLTlhLWZBLUZdKy8pKSB8fCBzdHJlYW0ubWF0Y2goL15bMC05XSooXC5bMC05XSspPyhbZUVdW34rXT9bMC05XSspPy8pKQogICAgICAgIHJldHVybiAibnVtYmVyIjsKCiAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIC8vIENvbW1lbnRzCiAgICBpZiAoY2ggPT0gIiUiKSB7CiAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgcmV0dXJuICdjb21tZW50JzsKICAgIH0KICAgIGVsc2UgaWYgKGNoID09ICIvIikgewogICAgICBpZiAoc3RyZWFtLmVhdCgiKiIpKSB7CiAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkNvbW1lbnQ7CiAgICAgICAgcmV0dXJuIHRva2VuQ29tbWVudChzdHJlYW0sIHN0YXRlKTsKICAgICAgfQogICAgfQoKICAgIC8vIFNpbmdsZSBvcGVyYXRvcnMKICAgIGlmKHNpbmdsZU9wZXJhdG9ycy50ZXN0KGNoKSkgewogICAgICByZXR1cm4gIm9wZXJhdG9yIjsKICAgIH0KCiAgICAvLyBJZiBub3RoaW5nIG1hdGNoLCB3ZSBza2lwIHRoZSBlbnRpcmUgYWxwaGFudW1lcmljYWwgYmxvY2sKICAgIHN0cmVhbS5lYXRXaGlsZSgvXHcvKTsKCiAgICByZXR1cm4gInZhcmlhYmxlIjsKICB9CgogIGZ1bmN0aW9uIHRva2VuQ2xhc3Moc3RyZWFtLCBzdGF0ZSkgewogICAgaWYgKHN0cmVhbS5lYXRTcGFjZSgpKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgc3RyZWFtLm1hdGNoKC8oW0EtWl1bQS1aYS16MC05X10qKXwoYC4rYCkvKTsKICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlOwogICAgcmV0dXJuICJ2YXJpYWJsZS0zIgogIH0KCiAgZnVuY3Rpb24gdG9rZW5NZXRoKHN0cmVhbSwgc3RhdGUpIHsKICAgIGlmIChzdHJlYW0uZWF0U3BhY2UoKSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIHN0cmVhbS5tYXRjaCgvKFthLXpBLVpdW0EtWmEtejAtOV9dKil8KGAuK2ApLyk7CiAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTsKICAgIHJldHVybiAiZGVmIgogIH0KCiAgZnVuY3Rpb24gdG9rZW5GdW5Qcm9jKHN0cmVhbSwgc3RhdGUpIHsKICAgIGlmIChzdHJlYW0uZWF0U3BhY2UoKSkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICBpZighc3RhdGUuaGFzUGFzc2VkRmlyc3RTdGFnZSAmJiBzdHJlYW0uZWF0KCJ7IikpIHsKICAgICAgc3RhdGUuaGFzUGFzc2VkRmlyc3RTdGFnZSA9IHRydWU7CiAgICAgIHJldHVybiAiYnJhY2tldCI7CiAgICB9CiAgICBlbHNlIGlmKHN0YXRlLmhhc1Bhc3NlZEZpcnN0U3RhZ2UpIHsKICAgICAgc3RyZWFtLm1hdGNoKC8oW0EtWl1bQS1aYS16MC05X10qKXwoYC4rYCl8XCQvKTsKICAgICAgc3RhdGUuaGFzUGFzc2VkRmlyc3RTdGFnZSA9IGZhbHNlOwogICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTsKICAgICAgcmV0dXJuICJkZWYiCiAgICB9CiAgICBlbHNlIHsKICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogIH0KCiAgZnVuY3Rpb24gdG9rZW5Db21tZW50KHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBtYXliZUVuZCA9IGZhbHNlLCBjaDsKICAgIHdoaWxlIChjaCA9IHN0cmVhbS5uZXh0KCkpIHsKICAgICAgaWYgKGNoID09ICIvIiAmJiBtYXliZUVuZCkgewogICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIG1heWJlRW5kID0gKGNoID09ICIqIik7CiAgICB9CiAgICByZXR1cm4gImNvbW1lbnQiOwogIH0KCiAgZnVuY3Rpb24gdG9rZW5TdHJpbmcocXVvdGUpIHsKICAgIHJldHVybiBmdW5jdGlvbiAoc3RyZWFtLCBzdGF0ZSkgewogICAgICB2YXIgZXNjYXBlZCA9IGZhbHNlLCBuZXh0LCBlbmQgPSBmYWxzZTsKICAgICAgd2hpbGUgKChuZXh0ID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkgewogICAgICAgIGlmIChuZXh0ID09IHF1b3RlICYmICFlc2NhcGVkKSB7CiAgICAgICAgICBlbmQgPSB0cnVlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGVzY2FwZWQgPSAhZXNjYXBlZCAmJiBuZXh0ID09ICJcXCI7CiAgICAgIH0KICAgICAgaWYgKGVuZCB8fCAhZXNjYXBlZCkKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTsKICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgfTsKICB9CgogIGZ1bmN0aW9uIGJ1aWxkRWxlY3RyaWNJbnB1dFJlZ0V4KCkgewogICAgLy8gUmVpbmRlbnRhdGlvbiBzaG91bGQgb2NjdXIgb24gW10gb3Igb24gYSBtYXRjaCBvZiBhbnkgb2YKICAgIC8vIHRoZSBibG9jayBjbG9zaW5nIGtleXdvcmRzLCBhdCB0aGUgZW5kIG9mIGEgbGluZS4KICAgIHZhciBhbGxDbG9zaW5ncyA9IG1pZGRsZS5jb25jYXQoZW5kKTsKICAgIHJldHVybiBuZXcgUmVnRXhwKCJbXFxbXFxdXXwoIiArIGFsbENsb3NpbmdzLmpvaW4oInwiKSArICIpJCIpOwogIH0KCiAgcmV0dXJuIHsKCiAgICBzdGFydFN0YXRlOiBmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgdG9rZW5pemU6IHRva2VuQmFzZSwKICAgICAgICBjdXJyZW50SW5kZW50OiAwLAogICAgICAgIGRvSW5DdXJyZW50TGluZTogZmFsc2UsCiAgICAgICAgaGFzUGFzc2VkRmlyc3RTdGFnZTogZmFsc2UKICAgICAgfTsKICAgIH0sCgogICAgdG9rZW46IGZ1bmN0aW9uIChzdHJlYW0sIHN0YXRlKSB7CiAgICAgIGlmIChzdHJlYW0uc29sKCkpCiAgICAgICAgc3RhdGUuZG9JbkN1cnJlbnRMaW5lID0gMDsKCiAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgIH0sCgogICAgaW5kZW50OiBmdW5jdGlvbiAoc3RhdGUsIHRleHRBZnRlcikgewogICAgICB2YXIgdHJ1ZVRleHQgPSB0ZXh0QWZ0ZXIucmVwbGFjZSgvXlxzK3xccyskL2csICcnKTsKCiAgICAgIGlmICh0cnVlVGV4dC5tYXRjaChlbmRLZXl3b3JkcykgfHwgdHJ1ZVRleHQubWF0Y2gobWlkZGxlS2V5d29yZHMpIHx8IHRydWVUZXh0Lm1hdGNoKC8oXFtdKS8pKQogICAgICAgIHJldHVybiBjb25mLmluZGVudFVuaXQgKiAoc3RhdGUuY3VycmVudEluZGVudCAtIDEpOwoKICAgICAgaWYgKHN0YXRlLmN1cnJlbnRJbmRlbnQgPCAwKQogICAgICAgIHJldHVybiAwOwoKICAgICAgcmV0dXJuIHN0YXRlLmN1cnJlbnRJbmRlbnQgKiBjb25mLmluZGVudFVuaXQ7CiAgICB9LAogICAgZm9sZDogImluZGVudCIsCiAgICBlbGVjdHJpY0lucHV0OiBidWlsZEVsZWN0cmljSW5wdXRSZWdFeCgpLAogICAgbGluZUNvbW1lbnQ6ICIlIiwKICAgIGJsb2NrQ29tbWVudFN0YXJ0OiAiLyoiLAogICAgYmxvY2tDb21tZW50RW5kOiAiKi8iCiAgfTsKfSk7CgpDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveC1veiIsICJveiIpOwoKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/pascal/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/pascal/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogUGFzY2FsIG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0icGFzY2FsLmpzIj48L3NjcmlwdD4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4uQ29kZU1pcnJvciB7Ym9yZGVyLXRvcDogMXB4IHNvbGlkIGJsYWNrOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGgxPkNvZGVNaXJyb3I8L2gxPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5QYXNjYWw8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPlBhc2NhbCBtb2RlPC9oMj4KCgo8ZGl2Pjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+CigqIEV4YW1wbGUgUGFzY2FsIGNvZGUgKikKCndoaWxlIGEgPD4gYiBkbyB3cml0ZWxuKCdXYWl0aW5nJyk7CiAKaWYgYSA+IGIgdGhlbiAKICB3cml0ZWxuKCdDb25kaXRpb24gbWV0JykKZWxzZSAKICB3cml0ZWxuKCdDb25kaXRpb24gbm90IG1ldCcpOwogCmZvciBpIDo9IDEgdG8gMTAgZG8gCiAgd3JpdGVsbignSXRlcmF0aW9uOiAnLCBpOjEpOwogCnJlcGVhdAogIGEgOj0gYSArIDEKdW50aWwgYSA9IDEwOwogCmNhc2UgaSBvZgogIDA6IHdyaXRlKCd6ZXJvJyk7CiAgMTogd3JpdGUoJ29uZScpOwogIDI6IHdyaXRlKCd0d28nKQplbmQ7CjwvdGV4dGFyZWE+PC9kaXY+CgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgICAgICBtb2RlOiAidGV4dC94LXBhc2NhbCIKICAgICAgfSk7CiAgICA8L3NjcmlwdD4KCiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC94LXBhc2NhbDwvY29kZT4uPC9wPgogIDwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/pascal/pascal.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJwYXNjYWwiLCBmdW5jdGlvbigpIHsKICBmdW5jdGlvbiB3b3JkcyhzdHIpIHsKICAgIHZhciBvYmogPSB7fSwgd29yZHMgPSBzdHIuc3BsaXQoIiAiKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgd29yZHMubGVuZ3RoOyArK2kpIG9ialt3b3Jkc1tpXV0gPSB0cnVlOwogICAgcmV0dXJuIG9iajsKICB9CiAgdmFyIGtleXdvcmRzID0gd29yZHMoImFuZCBhcnJheSBiZWdpbiBjYXNlIGNvbnN0IGRpdiBkbyBkb3dudG8gZWxzZSBlbmQgZmlsZSBmb3IgZm9yd2FyZCBpbnRlZ2VyICIgKwogICAgICAgICAgICAgICAgICAgICAgICJib29sZWFuIGNoYXIgZnVuY3Rpb24gZ290byBpZiBpbiBsYWJlbCBtb2QgbmlsIG5vdCBvZiBvciBwYWNrZWQgcHJvY2VkdXJlICIgKwogICAgICAgICAgICAgICAgICAgICAgICJwcm9ncmFtIHJlY29yZCByZXBlYXQgc2V0IHN0cmluZyB0aGVuIHRvIHR5cGUgdW50aWwgdmFyIHdoaWxlIHdpdGgiKTsKICB2YXIgYXRvbXMgPSB7Im51bGwiOiB0cnVlfTsKCiAgdmFyIGlzT3BlcmF0b3JDaGFyID0gL1srXC0qJiU9PD4hP3xcL10vOwoKICBmdW5jdGlvbiB0b2tlbkJhc2Uoc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIGNoID0gc3RyZWFtLm5leHQoKTsKICAgIGlmIChjaCA9PSAiIyIgJiYgc3RhdGUuc3RhcnRPZkxpbmUpIHsKICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICByZXR1cm4gIm1ldGEiOwogICAgfQogICAgaWYgKGNoID09ICciJyB8fCBjaCA9PSAiJyIpIHsKICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlblN0cmluZyhjaCk7CiAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgIH0KICAgIGlmIChjaCA9PSAiKCIgJiYgc3RyZWFtLmVhdCgiKiIpKSB7CiAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5Db21tZW50OwogICAgICByZXR1cm4gdG9rZW5Db21tZW50KHN0cmVhbSwgc3RhdGUpOwogICAgfQogICAgaWYgKC9bXFtcXXt9XChcKSw7XDpcLl0vLnRlc3QoY2gpKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgaWYgKC9cZC8udGVzdChjaCkpIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXHdcLl0vKTsKICAgICAgcmV0dXJuICJudW1iZXIiOwogICAgfQogICAgaWYgKGNoID09ICIvIikgewogICAgICBpZiAoc3RyZWFtLmVhdCgiLyIpKSB7CiAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICAgIHJldHVybiAiY29tbWVudCI7CiAgICAgIH0KICAgIH0KICAgIGlmIChpc09wZXJhdG9yQ2hhci50ZXN0KGNoKSkgewogICAgICBzdHJlYW0uZWF0V2hpbGUoaXNPcGVyYXRvckNoYXIpOwogICAgICByZXR1cm4gIm9wZXJhdG9yIjsKICAgIH0KICAgIHN0cmVhbS5lYXRXaGlsZSgvW1x3XCRfXS8pOwogICAgdmFyIGN1ciA9IHN0cmVhbS5jdXJyZW50KCk7CiAgICBpZiAoa2V5d29yZHMucHJvcGVydHlJc0VudW1lcmFibGUoY3VyKSkgcmV0dXJuICJrZXl3b3JkIjsKICAgIGlmIChhdG9tcy5wcm9wZXJ0eUlzRW51bWVyYWJsZShjdXIpKSByZXR1cm4gImF0b20iOwogICAgcmV0dXJuICJ2YXJpYWJsZSI7CiAgfQoKICBmdW5jdGlvbiB0b2tlblN0cmluZyhxdW90ZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgdmFyIGVzY2FwZWQgPSBmYWxzZSwgbmV4dCwgZW5kID0gZmFsc2U7CiAgICAgIHdoaWxlICgobmV4dCA9IHN0cmVhbS5uZXh0KCkpICE9IG51bGwpIHsKICAgICAgICBpZiAobmV4dCA9PSBxdW90ZSAmJiAhZXNjYXBlZCkge2VuZCA9IHRydWU7IGJyZWFrO30KICAgICAgICBlc2NhcGVkID0gIWVzY2FwZWQgJiYgbmV4dCA9PSAiXFwiOwogICAgICB9CiAgICAgIGlmIChlbmQgfHwgIWVzY2FwZWQpIHN0YXRlLnRva2VuaXplID0gbnVsbDsKICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgfTsKICB9CgogIGZ1bmN0aW9uIHRva2VuQ29tbWVudChzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgbWF5YmVFbmQgPSBmYWxzZSwgY2g7CiAgICB3aGlsZSAoY2ggPSBzdHJlYW0ubmV4dCgpKSB7CiAgICAgIGlmIChjaCA9PSAiKSIgJiYgbWF5YmVFbmQpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IG51bGw7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgbWF5YmVFbmQgPSAoY2ggPT0gIioiKTsKICAgIH0KICAgIHJldHVybiAiY29tbWVudCI7CiAgfQoKICAvLyBJbnRlcmZhY2UKCiAgcmV0dXJuIHsKICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4ge3Rva2VuaXplOiBudWxsfTsKICAgIH0sCgogICAgdG9rZW46IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgaWYgKHN0cmVhbS5lYXRTcGFjZSgpKSByZXR1cm4gbnVsbDsKICAgICAgdmFyIHN0eWxlID0gKHN0YXRlLnRva2VuaXplIHx8IHRva2VuQmFzZSkoc3RyZWFtLCBzdGF0ZSk7CiAgICAgIGlmIChzdHlsZSA9PSAiY29tbWVudCIgfHwgc3R5bGUgPT0gIm1ldGEiKSByZXR1cm4gc3R5bGU7CiAgICAgIHJldHVybiBzdHlsZTsKICAgIH0sCgogICAgZWxlY3RyaWNDaGFyczogInt9IgogIH07Cn0pOwoKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtcGFzY2FsIiwgInBhc2NhbCIpOwoKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/pegjs/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/pegjs/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IFBFRy5qcyBNb2RlPC90aXRsZT4KICAgIDxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CiAgICA8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KICAgIDxzY3JpcHQgc3JjPSIuLi8uLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iLi4vamF2YXNjcmlwdC9qYXZhc2NyaXB0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJwZWdqcy5qcyI+PC9zY3JpcHQ+CiAgICA8c3R5bGUgdHlwZT0idGV4dC9jc3MiPi5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazt9PC9zdHlsZT4KICA8L2hlYWQ+CiAgPGJvZHk+CiAgICA8ZGl2IGlkPW5hdj4KICAgICAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aDE+Q29kZU1pcnJvcjwvaDE+PGltZyBpZD1sb2dvIHNyYz0iLi4vLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogICAgICA8dWw+CiAgICAgICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICAgICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9jb2RlbWlycm9yIj5Db2RlPC9hPgogICAgICA8L3VsPgogICAgICA8dWw+CiAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+UEVHLmpzIE1vZGU8L2E+CiAgICAgIDwvdWw+CiAgICA8L2Rpdj4KCiAgICA8YXJ0aWNsZT4KICAgICAgPGgyPlBFRy5qcyBNb2RlPC9oMj4KICAgICAgPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KLyoKICogQ2xhc3NpYyBleGFtcGxlIGdyYW1tYXIsIHdoaWNoIHJlY29nbml6ZXMgc2ltcGxlIGFyaXRobWV0aWMgZXhwcmVzc2lvbnMgbGlrZQogKiAiMiooMys0KSIuIFRoZSBwYXJzZXIgZ2VuZXJhdGVkIGZyb20gdGhpcyBncmFtbWFyIHRoZW4gY29tcHV0ZXMgdGhlaXIgdmFsdWUuCiAqLwoKc3RhcnQKICA9IGFkZGl0aXZlCgphZGRpdGl2ZQogID0gbGVmdDptdWx0aXBsaWNhdGl2ZSAiKyIgcmlnaHQ6YWRkaXRpdmUgeyByZXR1cm4gbGVmdCArIHJpZ2h0OyB9CiAgLyBtdWx0aXBsaWNhdGl2ZQoKbXVsdGlwbGljYXRpdmUKICA9IGxlZnQ6cHJpbWFyeSAiKiIgcmlnaHQ6bXVsdGlwbGljYXRpdmUgeyByZXR1cm4gbGVmdCAqIHJpZ2h0OyB9CiAgLyBwcmltYXJ5CgpwcmltYXJ5CiAgPSBpbnRlZ2VyCiAgLyAiKCIgYWRkaXRpdmU6YWRkaXRpdmUgIikiIHsgcmV0dXJuIGFkZGl0aXZlOyB9CgppbnRlZ2VyICJpbnRlZ2VyIgogID0gZGlnaXRzOlswLTldKyB7IHJldHVybiBwYXJzZUludChkaWdpdHMuam9pbigiIiksIDEwKTsgfQoKbGV0dGVyID0gW2Etel0rPC90ZXh0YXJlYT48L2Zvcm0+CiAgICAgIDxzY3JpcHQ+CiAgICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICAgIG1vZGU6IHtuYW1lOiAicGVnanMifSwKICAgICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlCiAgICAgICAgfSk7CiAgICAgIDwvc2NyaXB0PgogICAgICA8aDM+VGhlIFBFRy5qcyBNb2RlPC9oMz4KICAgICAgPHA+IENyZWF0ZWQgYnkgRm9yYmVzIExpbmRlc2F5LjwvcD4KICAgIDwvYXJ0aWNsZT4KICA8L2JvZHk+CjwvaHRtbD4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/pegjs/pegjs.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSwgcmVxdWlyZSgiLi4vamF2YXNjcmlwdC9qYXZhc2NyaXB0IikpOwogIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kKSAvLyBBTUQKICAgIGRlZmluZShbIi4uLy4uL2xpYi9jb2RlbWlycm9yIiwgIi4uL2phdmFzY3JpcHQvamF2YXNjcmlwdCJdLCBtb2QpOwogIGVsc2UgLy8gUGxhaW4gYnJvd3NlciBlbnYKICAgIG1vZChDb2RlTWlycm9yKTsKfSkoZnVuY3Rpb24oQ29kZU1pcnJvcikgewoidXNlIHN0cmljdCI7CgpDb2RlTWlycm9yLmRlZmluZU1vZGUoInBlZ2pzIiwgZnVuY3Rpb24gKGNvbmZpZykgewogIHZhciBqc01vZGUgPSBDb2RlTWlycm9yLmdldE1vZGUoY29uZmlnLCAiamF2YXNjcmlwdCIpOwoKICBmdW5jdGlvbiBpZGVudGlmaWVyKHN0cmVhbSkgewogICAgcmV0dXJuIHN0cmVhbS5tYXRjaCgvXlthLXpBLVpfXVthLXpBLVowLTlfXSovKTsKICB9CgogIHJldHVybiB7CiAgICBzdGFydFN0YXRlOiBmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgaW5TdHJpbmc6IGZhbHNlLAogICAgICAgIHN0cmluZ1R5cGU6IG51bGwsCiAgICAgICAgaW5Db21tZW50OiBmYWxzZSwKICAgICAgICBpbkNoYXJhY3RlckNsYXNzOiBmYWxzZSwKICAgICAgICBicmFjZWQ6IDAsCiAgICAgICAgbGhzOiB0cnVlLAogICAgICAgIGxvY2FsU3RhdGU6IG51bGwKICAgICAgfTsKICAgIH0sCiAgICB0b2tlbjogZnVuY3Rpb24gKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgaWYgKHN0cmVhbSkKCiAgICAgIC8vY2hlY2sgZm9yIHN0YXRlIGNoYW5nZXMKICAgICAgaWYgKCFzdGF0ZS5pblN0cmluZyAmJiAhc3RhdGUuaW5Db21tZW50ICYmICgoc3RyZWFtLnBlZWsoKSA9PSAnIicpIHx8IChzdHJlYW0ucGVlaygpID09ICInIikpKSB7CiAgICAgICAgc3RhdGUuc3RyaW5nVHlwZSA9IHN0cmVhbS5wZWVrKCk7CiAgICAgICAgc3RyZWFtLm5leHQoKTsgLy8gU2tpcCBxdW90ZQogICAgICAgIHN0YXRlLmluU3RyaW5nID0gdHJ1ZTsgLy8gVXBkYXRlIHN0YXRlCiAgICAgIH0KICAgICAgaWYgKCFzdGF0ZS5pblN0cmluZyAmJiAhc3RhdGUuaW5Db21tZW50ICYmIHN0cmVhbS5tYXRjaCgvXlwvXCovKSkgewogICAgICAgIHN0YXRlLmluQ29tbWVudCA9IHRydWU7CiAgICAgIH0KCiAgICAgIC8vcmV0dXJuIHN0YXRlCiAgICAgIGlmIChzdGF0ZS5pblN0cmluZykgewogICAgICAgIHdoaWxlIChzdGF0ZS5pblN0cmluZyAmJiAhc3RyZWFtLmVvbCgpKSB7CiAgICAgICAgICBpZiAoc3RyZWFtLnBlZWsoKSA9PT0gc3RhdGUuc3RyaW5nVHlwZSkgewogICAgICAgICAgICBzdHJlYW0ubmV4dCgpOyAvLyBTa2lwIHF1b3RlCiAgICAgICAgICAgIHN0YXRlLmluU3RyaW5nID0gZmFsc2U7IC8vIENsZWFyIGZsYWcKICAgICAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLnBlZWsoKSA9PT0gJ1xcJykgewogICAgICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3RyZWFtLm1hdGNoKC9eLlteXFxcIlwnXSovKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHN0YXRlLmxocyA/ICJwcm9wZXJ0eSBzdHJpbmciIDogInN0cmluZyI7IC8vIFRva2VuIHN0eWxlCiAgICAgIH0gZWxzZSBpZiAoc3RhdGUuaW5Db21tZW50KSB7CiAgICAgICAgd2hpbGUgKHN0YXRlLmluQ29tbWVudCAmJiAhc3RyZWFtLmVvbCgpKSB7CiAgICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKC9cKlwvLykpIHsKICAgICAgICAgICAgc3RhdGUuaW5Db21tZW50ID0gZmFsc2U7IC8vIENsZWFyIGZsYWcKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHN0cmVhbS5tYXRjaCgvXi5bXlwqXSovKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuICJjb21tZW50IjsKICAgICAgfSBlbHNlIGlmIChzdGF0ZS5pbkNoYXJhY3RlckNsYXNzKSB7CiAgICAgICAgICB3aGlsZSAoc3RhdGUuaW5DaGFyYWN0ZXJDbGFzcyAmJiAhc3RyZWFtLmVvbCgpKSB7CiAgICAgICAgICAgIGlmICghKHN0cmVhbS5tYXRjaCgvXlteXF1cXF0rLykgfHwgc3RyZWFtLm1hdGNoKC9eXFwuLykpKSB7CiAgICAgICAgICAgICAgc3RhdGUuaW5DaGFyYWN0ZXJDbGFzcyA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLnBlZWsoKSA9PT0gJ1snKSB7CiAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgICBzdGF0ZS5pbkNoYXJhY3RlckNsYXNzID0gdHJ1ZTsKICAgICAgICByZXR1cm4gJ2JyYWNrZXQnOwogICAgICB9IGVsc2UgaWYgKHN0cmVhbS5tYXRjaCgvXlwvXC8vKSkgewogICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgICByZXR1cm4gImNvbW1lbnQiOwogICAgICB9IGVsc2UgaWYgKHN0YXRlLmJyYWNlZCB8fCBzdHJlYW0ucGVlaygpID09PSAneycpIHsKICAgICAgICBpZiAoc3RhdGUubG9jYWxTdGF0ZSA9PT0gbnVsbCkgewogICAgICAgICAgc3RhdGUubG9jYWxTdGF0ZSA9IENvZGVNaXJyb3Iuc3RhcnRTdGF0ZShqc01vZGUpOwogICAgICAgIH0KICAgICAgICB2YXIgdG9rZW4gPSBqc01vZGUudG9rZW4oc3RyZWFtLCBzdGF0ZS5sb2NhbFN0YXRlKTsKICAgICAgICB2YXIgdGV4dCA9IHN0cmVhbS5jdXJyZW50KCk7CiAgICAgICAgaWYgKCF0b2tlbikgewogICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGlmICh0ZXh0W2ldID09PSAneycpIHsKICAgICAgICAgICAgICBzdGF0ZS5icmFjZWQrKzsKICAgICAgICAgICAgfSBlbHNlIGlmICh0ZXh0W2ldID09PSAnfScpIHsKICAgICAgICAgICAgICBzdGF0ZS5icmFjZWQtLTsKICAgICAgICAgICAgfQogICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRva2VuOwogICAgICB9IGVsc2UgaWYgKGlkZW50aWZpZXIoc3RyZWFtKSkgewogICAgICAgIGlmIChzdHJlYW0ucGVlaygpID09PSAnOicpIHsKICAgICAgICAgIHJldHVybiAndmFyaWFibGUnOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJ3ZhcmlhYmxlLTInOwogICAgICB9IGVsc2UgaWYgKFsnWycsICddJywgJygnLCAnKSddLmluZGV4T2Yoc3RyZWFtLnBlZWsoKSkgIT0gLTEpIHsKICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgIHJldHVybiAnYnJhY2tldCc7CiAgICAgIH0gZWxzZSBpZiAoIXN0cmVhbS5lYXRTcGFjZSgpKSB7CiAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgfQogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICB9Owp9LCAiamF2YXNjcmlwdCIpOwoKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/perl/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/perl/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogUGVybCBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9InBlcmwuanMiPjwvc2NyaXB0Pgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPi5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazt9PC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aDE+Q29kZU1pcnJvcjwvaDE+PGltZyBpZD1sb2dvIHNyYz0iLi4vLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+TGFuZ3VhZ2UgbW9kZXM8L2E+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPlBlcmw8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPlBlcmwgbW9kZTwvaDI+CgoKPGRpdj48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgojIS91c3IvYmluL3BlcmwKCnVzZSBTb21ldGhpbmcgcXcoZnVuYzEgZnVuYzIpOwoKIyBzdHJpbmdzCm15ICRzMSA9IHFxJ3NpbmdsZSBsaW5lJzsKb3VyICRzMiA9IHEobXVsdGktCiAgICAgICAgICAgICAgbGluZSk7Cgo9aXRlbSBTb21ldGhpbmcKCUV4YW1wbGUuCj1jdXQKCm15ICRodG1sPTw8J0hUTUwnCjxodG1sPgo8dGl0bGU+aGkhPC90aXRsZT4KPC9odG1sPgpIVE1MCgpwcmludCAiZmlyc3QsIi5qb2luKCcsJywgJ3NlY29uZCcsIHFxfnRoaXJkfik7CgppZigkczEgPX4gbVsoPzwhXHMpKGwubmUpXHpdbykgewoJJGgtPnskMX09JCQuJyBwcmVkZWZpbmVkIHZhcmlhYmxlcyc7CgkkczIgPX4gcy9cLWxpbmUvL294OwoJJHMxID1+IHNbCgkJICBsaW5lIF0KCQlbCgkJICBibG9jawoJCV1veDsKfQoKMTsgIyBudW1iZXJzIGFuZCBjb21tZW50cwoKX19FTkRfXwpzb21ldGhpbmcuLi4KCjwvdGV4dGFyZWE+PC9kaXY+CgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZQogICAgICB9KTsKICAgIDwvc2NyaXB0PgoKICAgIDxwPjxzdHJvbmc+TUlNRSB0eXBlcyBkZWZpbmVkOjwvc3Ryb25nPiA8Y29kZT50ZXh0L3gtcGVybDwvY29kZT4uPC9wPgogIDwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/perl/perl.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovLyBDb2RlTWlycm9yMiBtb2RlL3BlcmwvcGVybC5qcyAodGV4dC94LXBlcmwpIGJldGEgMC4xMCAoMjAxMS0xMS0wOCkKLy8gVGhpcyBpcyBhIHBhcnQgb2YgQ29kZU1pcnJvciBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9zYWJhY2EvQ29kZU1pcnJvcl9tb2RlX3BlcmwgKG1haWxAc2FiYWNhLmNvbSkKCihmdW5jdGlvbihtb2QpIHsKICBpZiAodHlwZW9mIGV4cG9ydHMgPT0gIm9iamVjdCIgJiYgdHlwZW9mIG1vZHVsZSA9PSAib2JqZWN0IikgLy8gQ29tbW9uSlMKICAgIG1vZChyZXF1aXJlKCIuLi8uLi9saWIvY29kZW1pcnJvciIpKTsKICBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCkgLy8gQU1ECiAgICBkZWZpbmUoWyIuLi8uLi9saWIvY29kZW1pcnJvciJdLCBtb2QpOwogIGVsc2UgLy8gUGxhaW4gYnJvd3NlciBlbnYKICAgIG1vZChDb2RlTWlycm9yKTsKfSkoZnVuY3Rpb24oQ29kZU1pcnJvcikgewoidXNlIHN0cmljdCI7CgpDb2RlTWlycm9yLmRlZmluZU1vZGUoInBlcmwiLGZ1bmN0aW9uKCl7CiAgICAgICAgLy8gaHR0cDovL3Blcmxkb2MucGVybC5vcmcKICAgICAgICB2YXIgUEVSTD17ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgIG51bGwgLSBtYWdpYyB0b3VjaAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgMSAtIGtleXdvcmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgIDIgLSBkZWYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgIDMgLSBhdG9tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICA0IC0gb3BlcmF0b3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgIDUgLSB2YXJpYWJsZS0yIChwcmVkZWZpbmVkKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgW3gseV0gLSB4PTEsMiwzOyB5PW11c3QgYmUgZGVmaW5lZCBpZiB4ey4uLn0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICBQRVJMIG9wZXJhdG9ycwogICAgICAgICAgICAgICAgJy0+JyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgNCwKICAgICAgICAgICAgICAgICcrKycgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgIDQsCiAgICAgICAgICAgICAgICAnLS0nICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICA0LAogICAgICAgICAgICAgICAgJyoqJyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICEgfiBcIGFuZCB1bmFyeSArIGFuZCAtCiAgICAgICAgICAgICAgICAnPX4nICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICA0LAogICAgICAgICAgICAgICAgJyF+JyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgNCwKICAgICAgICAgICAgICAgICcqJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgIDQsCiAgICAgICAgICAgICAgICAnLycgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICA0LAogICAgICAgICAgICAgICAgJyUnICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgNCwKICAgICAgICAgICAgICAgICd4JyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgIDQsCiAgICAgICAgICAgICAgICAnKycgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICA0LAogICAgICAgICAgICAgICAgJy0nICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgNCwKICAgICAgICAgICAgICAgICcuJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgIDQsCiAgICAgICAgICAgICAgICAnPDwnICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICA0LAogICAgICAgICAgICAgICAgJz4+JyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgIG5hbWVkIHVuYXJ5IG9wZXJhdG9ycwogICAgICAgICAgICAgICAgJzwnICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgNCwKICAgICAgICAgICAgICAgICc+JyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgIDQsCiAgICAgICAgICAgICAgICAnPD0nICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICA0LAogICAgICAgICAgICAgICAgJz49JyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgNCwKICAgICAgICAgICAgICAgICdsdCcgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgIDQsCiAgICAgICAgICAgICAgICAnZ3QnICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICA0LAogICAgICAgICAgICAgICAgJ2xlJyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgNCwKICAgICAgICAgICAgICAgICdnZScgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgIDQsCiAgICAgICAgICAgICAgICAnPT0nICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICA0LAogICAgICAgICAgICAgICAgJyE9JyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgNCwKICAgICAgICAgICAgICAgICc8PT4nICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgIDQsCiAgICAgICAgICAgICAgICAnZXEnICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICA0LAogICAgICAgICAgICAgICAgJ25lJyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgNCwKICAgICAgICAgICAgICAgICdjbXAnICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgIDQsCiAgICAgICAgICAgICAgICAnfn4nICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICA0LAogICAgICAgICAgICAgICAgJyYnICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgNCwKICAgICAgICAgICAgICAgICd8JyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgIDQsCiAgICAgICAgICAgICAgICAnXicgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICA0LAogICAgICAgICAgICAgICAgJyYmJyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgNCwKICAgICAgICAgICAgICAgICd8fCcgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgIDQsCiAgICAgICAgICAgICAgICAnLy8nICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICA0LAogICAgICAgICAgICAgICAgJy4uJyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgNCwKICAgICAgICAgICAgICAgICcuLi4nICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgIDQsCiAgICAgICAgICAgICAgICAnPycgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICA0LAogICAgICAgICAgICAgICAgJzonICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgNCwKICAgICAgICAgICAgICAgICc9JyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgIDQsCiAgICAgICAgICAgICAgICAnKz0nICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICA0LAogICAgICAgICAgICAgICAgJy09JyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgNCwKICAgICAgICAgICAgICAgICcqPScgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgIDQsICAvLyAgIGV0Yy4gPz8/CiAgICAgICAgICAgICAgICAnLCcgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICA0LAogICAgICAgICAgICAgICAgJz0+JyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgNCwKICAgICAgICAgICAgICAgICc6OicgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgIDQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICBsaXN0IG9wZXJhdG9ycyAocmlnaHR3YXJkKQogICAgICAgICAgICAgICAgJ25vdCcgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgNCwKICAgICAgICAgICAgICAgICdhbmQnICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgIDQsCiAgICAgICAgICAgICAgICAnb3InICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICA0LAogICAgICAgICAgICAgICAgJ3hvcicgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICBQRVJMIHByZWRlZmluZWQgdmFyaWFibGVzIChJIGtub3csIHdoYXQgdGhpcyBpcyBhIHBhcmFub2lkIGlkZWEsIGJ1dCBtYXkgYmUgbmVlZGVkIGZvciBwZW9wbGUsIHdobyBsZWFybiBQRVJMLCBhbmQgZm9yIG1lIGFzIHdlbGwsIC4uLmFuZCBtYXkgYmUgZm9yIHlvdT87KQogICAgICAgICAgICAgICAgJ0JFR0lOJyAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgWzUsMV0sCiAgICAgICAgICAgICAgICAnRU5EJyAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICBbNSwxXSwKICAgICAgICAgICAgICAgICdQUklOVCcgICAgICAgICAgICAgICAgICAgICAgICAgOiAgIFs1LDFdLAogICAgICAgICAgICAgICAgJ1BSSU5URicgICAgICAgICAgICAgICAgICAgICAgICA6ICAgWzUsMV0sCiAgICAgICAgICAgICAgICAnR0VUQycgICAgICAgICAgICAgICAgICAgICAgICAgIDogICBbNSwxXSwKICAgICAgICAgICAgICAgICdSRUFEJyAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgIFs1LDFdLAogICAgICAgICAgICAgICAgJ1JFQURMSU5FJyAgICAgICAgICAgICAgICAgICAgICA6ICAgWzUsMV0sCiAgICAgICAgICAgICAgICAnREVTVFJPWScgICAgICAgICAgICAgICAgICAgICAgIDogICBbNSwxXSwKICAgICAgICAgICAgICAgICdUSUUnICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgIFs1LDFdLAogICAgICAgICAgICAgICAgJ1RJRUhBTkRMRScgICAgICAgICAgICAgICAgICAgICA6ICAgWzUsMV0sCiAgICAgICAgICAgICAgICAnVU5USUUnICAgICAgICAgICAgICAgICAgICAgICAgIDogICBbNSwxXSwKICAgICAgICAgICAgICAgICdTVERJTicgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJ1NURElOX1RPUCcgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnU1RET1VUJyAgICAgICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICdTVERPVVRfVE9QJyAgICAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJ1NUREVSUicgICAgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnU1RERVJSX1RPUCcgICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckQVJHJyAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyRfJyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnQEFSRycgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICdAXycgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyRMSVNUX1NFUEFSQVRPUicgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJCInICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckUFJPQ0VTU19JRCcgICAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyRQSUQnICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJCQnICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckUkVBTF9HUk9VUF9JRCcgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyRHSUQnICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJCgnICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckRUZGRUNUSVZFX0dST1VQX0lEJyAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyRFR0lEJyAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJCknICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckUFJPR1JBTV9OQU1FJyAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyQwJyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJFNVQlNDUklQVF9TRVBBUkFUT1InICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckU1VCU0VQJyAgICAgICAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyQ7JyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJFJFQUxfVVNFUl9JRCcgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckVUlEJyAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyQ8JyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJEVGRkVDVElWRV9VU0VSX0lEJyAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckRVVJRCcgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyQ+JyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJGEnICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckYicgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyRDT01QSUxJTkcnICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJF5DJyAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckREVCVUdHSU5HJyAgICAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyReRCcgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJHteRU5DT0RJTkd9JyAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckRU5WJyAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyVFTlYnICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJFNZU1RFTV9GRF9NQVgnICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckXkYnICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJ0BGJyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJHteR0xPQkFMX1BIQVNFfScgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckXkgnICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyVeSCcgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnQElOQycgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICclSU5DJyAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyRJTlBMQUNFX0VESVQnICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJF5JJyAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckXk0nICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyRPU05BTUUnICAgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJF5PJyAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICcke15PUEVOfScgICAgICAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyRQRVJMREInICAgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJF5QJyAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckU0lHJyAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyVTSUcnICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJEJBU0VUSU1FJyAgICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckXlQnICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyR7XlRBSU5UfScgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJHteVU5JQ09ERX0nICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICcke15VVEY4Q0FDSEV9JyAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyR7XlVURjhMT0NBTEV9JyAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJFBFUkxfVkVSU0lPTicgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckXlYnICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyR7XldJTjMyX1NMT1BQWV9TVEFUfScgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJEVYRUNVVEFCTEVfTkFNRScgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckXlgnICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyQxJyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsIC8vIC0gcmVnZXhwICQxLCAkMi4uLgogICAgICAgICAgICAgICAgJyRNQVRDSCcgICAgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJCYnICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICcke15NQVRDSH0nICAgICAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyRQUkVNQVRDSCcgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJGAnICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICcke15QUkVNQVRDSH0nICAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyRQT1NUTUFUQ0gnICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAiJCciICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICcke15QT1NUTUFUQ0h9JyAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyRMQVNUX1BBUkVOX01BVENIJyAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJCsnICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckTEFTVF9TVUJNQVRDSF9SRVNVTFQnICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyReTicgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnQExBU1RfTUFUQ0hfRU5EJyAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICdAKycgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyVMQVNUX1BBUkVOX01BVENIJyAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJSsnICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICdATEFTVF9NQVRDSF9TVEFSVCcgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJ0AtJyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJUxBU1RfTUFUQ0hfU1RBUlQnICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICclLScgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyRMQVNUX1JFR0VYUF9DT0RFX1JFU1VMVCcgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJF5SJyAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICcke15SRV9ERUJVR19GTEFHU30nICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyR7XlJFX1RSSUVfTUFYQlVGfScgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJEFSR1YnICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICdAQVJHVicgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJ0FSR1YnICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnQVJHVk9VVCcgICAgICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckT1VUUFVUX0ZJRUxEX1NFUEFSQVRPUicgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyRPRlMnICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJCwnICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckSU5QVVRfTElORV9OVU1CRVInICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyROUicgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJC4nICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckSU5QVVRfUkVDT1JEX1NFUEFSQVRPUicgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyRSUycgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJC8nICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckT1VUUFVUX1JFQ09SRF9TRVBBUkFUT1InICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyRPUlMnICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJFxcJyAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckT1VUUFVUX0FVVE9GTFVTSCcgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyR8JyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJEFDQ1VNVUxBVE9SJyAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckXkEnICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyRGT1JNQVRfRk9STUZFRUQnICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJF5MJyAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckRk9STUFUX1BBR0VfTlVNQkVSJyAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyQlJyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJEZPUk1BVF9MSU5FU19MRUZUJyAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckLScgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyRGT1JNQVRfTElORV9CUkVBS19DSEFSQUNURVJTJyA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJDonICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckRk9STUFUX0xJTkVTX1BFUl9QQUdFJyAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyQ9JyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJEZPUk1BVF9UT1BfTkFNRScgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckXicgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyRGT1JNQVRfTkFNRScgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJH4nICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICcke15DSElMRF9FUlJPUl9OQVRJVkV9JyAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyRFWFRFTkRFRF9PU19FUlJPUicgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJF5FJyAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckRVhDRVBUSU9OU19CRUlOR19DQVVHSFQnICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyReUycgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJFdBUk5JTkcnICAgICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckXlcnICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyR7XldBUk5JTkdfQklUU30nICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJE9TX0VSUk9SJyAgICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckRVJSTk8nICAgICAgICAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyQhJyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJU9TX0VSUk9SJyAgICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICclRVJSTk8nICAgICAgICAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyUhJyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJENISUxEX0VSUk9SJyAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckPycgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyRFVkFMX0VSUk9SJyAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJEAnICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckT0ZNVCcgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyQjJyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJConICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckQVJSQVlfQkFTRScgICAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgJyRbJyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICAgIDUsCiAgICAgICAgICAgICAgICAnJE9MRF9QRVJMX1ZFUlNJT04nICAgICAgICAgICAgIDogICAgNSwKICAgICAgICAgICAgICAgICckXScgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAgICA1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgIFBFUkwgYmxvY2tzCiAgICAgICAgICAgICAgICAnaWYnICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpbMSwxXSwKICAgICAgICAgICAgICAgIGVsc2lmICAgICAgICAgICAgICAgICAgICAgICAgICAgOlsxLDFdLAogICAgICAgICAgICAgICAgJ2Vsc2UnICAgICAgICAgICAgICAgICAgICAgICAgICA6WzEsMV0sCiAgICAgICAgICAgICAgICAnd2hpbGUnICAgICAgICAgICAgICAgICAgICAgICAgIDpbMSwxXSwKICAgICAgICAgICAgICAgIHVubGVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgOlsxLDFdLAogICAgICAgICAgICAgICAgJ2ZvcicgICAgICAgICAgICAgICAgICAgICAgICAgICA6WzEsMV0sCiAgICAgICAgICAgICAgICBmb3JlYWNoICAgICAgICAgICAgICAgICAgICAgICAgIDpbMSwxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICBQRVJMIGZ1bmN0aW9ucwogICAgICAgICAgICAgICAgJ2FicycgICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gYWJzb2x1dGUgdmFsdWUgZnVuY3Rpb24KICAgICAgICAgICAgICAgIGFjY2VwdCAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGFjY2VwdCBhbiBpbmNvbWluZyBzb2NrZXQgY29ubmVjdAogICAgICAgICAgICAgICAgYWxhcm0gICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gc2NoZWR1bGUgYSBTSUdBTFJNCiAgICAgICAgICAgICAgICAnYXRhbjInICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBhcmN0YW5nZW50IG9mIFkvWCBpbiB0aGUgcmFuZ2UgLVBJIHRvIFBJCiAgICAgICAgICAgICAgICBiaW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBiaW5kcyBhbiBhZGRyZXNzIHRvIGEgc29ja2V0CiAgICAgICAgICAgICAgICBiaW5tb2RlICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBwcmVwYXJlIGJpbmFyeSBmaWxlcyBmb3IgSS9PCiAgICAgICAgICAgICAgICBibGVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBjcmVhdGUgYW4gb2JqZWN0CiAgICAgICAgICAgICAgICBib290c3RyYXAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8KICAgICAgICAgICAgICAgICdicmVhaycgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGJyZWFrIG91dCBvZiBhICJnaXZlbiIgYmxvY2sKICAgICAgICAgICAgICAgIGNhbGxlciAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGdldCBjb250ZXh0IG9mIHRoZSBjdXJyZW50IHN1YnJvdXRpbmUgY2FsbAogICAgICAgICAgICAgICAgY2hkaXIgICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gY2hhbmdlIHlvdXIgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeQogICAgICAgICAgICAgICAgY2htb2QgICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gY2hhbmdlcyB0aGUgcGVybWlzc2lvbnMgb24gYSBsaXN0IG9mIGZpbGVzCiAgICAgICAgICAgICAgICBjaG9tcCAgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSByZW1vdmUgYSB0cmFpbGluZyByZWNvcmQgc2VwYXJhdG9yIGZyb20gYSBzdHJpbmcKICAgICAgICAgICAgICAgIGNob3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIHJlbW92ZSB0aGUgbGFzdCBjaGFyYWN0ZXIgZnJvbSBhIHN0cmluZwogICAgICAgICAgICAgICAgY2hvd24gICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gY2hhbmdlIHRoZSBvd25lcnNoaXAgb24gYSBsaXN0IG9mIGZpbGVzCiAgICAgICAgICAgICAgICBjaHIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBnZXQgY2hhcmFjdGVyIHRoaXMgbnVtYmVyIHJlcHJlc2VudHMKICAgICAgICAgICAgICAgIGNocm9vdCAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIG1ha2UgZGlyZWN0b3J5IG5ldyByb290IGZvciBwYXRoIGxvb2t1cHMKICAgICAgICAgICAgICAgIGNsb3NlICAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGNsb3NlIGZpbGUgKG9yIHBpcGUgb3Igc29ja2V0KSBoYW5kbGUKICAgICAgICAgICAgICAgIGNsb3NlZGlyICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGNsb3NlIGRpcmVjdG9yeSBoYW5kbGUKICAgICAgICAgICAgICAgIGNvbm5lY3QgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGNvbm5lY3QgdG8gYSByZW1vdGUgc29ja2V0CiAgICAgICAgICAgICAgICAnY29udGludWUnICAgICAgICAgICAgICAgICAgICAgIDpbMSwxXSwgLy8gLSBvcHRpb25hbCB0cmFpbGluZyBibG9jayBpbiBhIHdoaWxlIG9yIGZvcmVhY2gKICAgICAgICAgICAgICAgICdjb3MnICAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGNvc2luZSBmdW5jdGlvbgogICAgICAgICAgICAgICAgY3J5cHQgICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gb25lLXdheSBwYXNzd2Qtc3R5bGUgZW5jcnlwdGlvbgogICAgICAgICAgICAgICAgZGJtY2xvc2UgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gYnJlYWtzIGJpbmRpbmcgb24gYSB0aWVkIGRibSBmaWxlCiAgICAgICAgICAgICAgICBkYm1vcGVuICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBjcmVhdGUgYmluZGluZyBvbiBhIHRpZWQgZGJtIGZpbGUKICAgICAgICAgICAgICAgICdkZWZhdWx0JyAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLwogICAgICAgICAgICAgICAgZGVmaW5lZCAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gdGVzdCB3aGV0aGVyIGEgdmFsdWUsIHZhcmlhYmxlLCBvciBmdW5jdGlvbiBpcyBkZWZpbmVkCiAgICAgICAgICAgICAgICAnZGVsZXRlJyAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBkZWxldGVzIGEgdmFsdWUgZnJvbSBhIGhhc2gKICAgICAgICAgICAgICAgIGRpZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIHJhaXNlIGFuIGV4Y2VwdGlvbiBvciBiYWlsIG91dAogICAgICAgICAgICAgICAgJ2RvJyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gdHVybiBhIEJMT0NLIGludG8gYSBURVJNCiAgICAgICAgICAgICAgICBkdW1wICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBjcmVhdGUgYW4gaW1tZWRpYXRlIGNvcmUgZHVtcAogICAgICAgICAgICAgICAgZWFjaCAgICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gcmV0cmlldmUgdGhlIG5leHQga2V5L3ZhbHVlIHBhaXIgZnJvbSBhIGhhc2gKICAgICAgICAgICAgICAgIGVuZGdyZW50ICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGJlIGRvbmUgdXNpbmcgZ3JvdXAgZmlsZQogICAgICAgICAgICAgICAgZW5kaG9zdGVudCAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gYmUgZG9uZSB1c2luZyBob3N0cyBmaWxlCiAgICAgICAgICAgICAgICBlbmRuZXRlbnQgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBiZSBkb25lIHVzaW5nIG5ldHdvcmtzIGZpbGUKICAgICAgICAgICAgICAgIGVuZHByb3RvZW50ICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGJlIGRvbmUgdXNpbmcgcHJvdG9jb2xzIGZpbGUKICAgICAgICAgICAgICAgIGVuZHB3ZW50ICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGJlIGRvbmUgdXNpbmcgcGFzc3dkIGZpbGUKICAgICAgICAgICAgICAgIGVuZHNlcnZlbnQgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGJlIGRvbmUgdXNpbmcgc2VydmljZXMgZmlsZQogICAgICAgICAgICAgICAgZW9mICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gdGVzdCBhIGZpbGVoYW5kbGUgZm9yIGl0cyBlbmQKICAgICAgICAgICAgICAgICdldmFsJyAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGNhdGNoIGV4Y2VwdGlvbnMgb3IgY29tcGlsZSBhbmQgcnVuIGNvZGUKICAgICAgICAgICAgICAgICdleGVjJyAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGFiYW5kb24gdGhpcyBwcm9ncmFtIHRvIHJ1biBhbm90aGVyCiAgICAgICAgICAgICAgICBleGlzdHMgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSB0ZXN0IHdoZXRoZXIgYSBoYXNoIGtleSBpcyBwcmVzZW50CiAgICAgICAgICAgICAgICBleGl0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSB0ZXJtaW5hdGUgdGhpcyBwcm9ncmFtCiAgICAgICAgICAgICAgICAnZXhwJyAgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSByYWlzZSBJIHRvIGEgcG93ZXIKICAgICAgICAgICAgICAgIGZjbnRsICAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGZpbGUgY29udHJvbCBzeXN0ZW0gY2FsbAogICAgICAgICAgICAgICAgZmlsZW5vICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gcmV0dXJuIGZpbGUgZGVzY3JpcHRvciBmcm9tIGZpbGVoYW5kbGUKICAgICAgICAgICAgICAgIGZsb2NrICAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGxvY2sgYW4gZW50aXJlIGZpbGUgd2l0aCBhbiBhZHZpc29yeSBsb2NrCiAgICAgICAgICAgICAgICBmb3JrICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBjcmVhdGUgYSBuZXcgcHJvY2VzcyBqdXN0IGxpa2UgdGhpcyBvbmUKICAgICAgICAgICAgICAgIGZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGRlY2xhcmUgYSBwaWN0dXJlIGZvcm1hdCB3aXRoIHVzZSBieSB0aGUgd3JpdGUoKSBmdW5jdGlvbgogICAgICAgICAgICAgICAgZm9ybWxpbmUgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gaW50ZXJuYWwgZnVuY3Rpb24gdXNlZCBmb3IgZm9ybWF0cwogICAgICAgICAgICAgICAgZ2V0YyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gZ2V0IHRoZSBuZXh0IGNoYXJhY3RlciBmcm9tIHRoZSBmaWxlaGFuZGxlCiAgICAgICAgICAgICAgICBnZXRncmVudCAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBnZXQgbmV4dCBncm91cCByZWNvcmQKICAgICAgICAgICAgICAgIGdldGdyZ2lkICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGdldCBncm91cCByZWNvcmQgZ2l2ZW4gZ3JvdXAgdXNlciBJRAogICAgICAgICAgICAgICAgZ2V0Z3JuYW0gICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gZ2V0IGdyb3VwIHJlY29yZCBnaXZlbiBncm91cCBuYW1lCiAgICAgICAgICAgICAgICBnZXRob3N0YnlhZGRyICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBnZXQgaG9zdCByZWNvcmQgZ2l2ZW4gaXRzIGFkZHJlc3MKICAgICAgICAgICAgICAgIGdldGhvc3RieW5hbWUgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGdldCBob3N0IHJlY29yZCBnaXZlbiBuYW1lCiAgICAgICAgICAgICAgICBnZXRob3N0ZW50ICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBnZXQgbmV4dCBob3N0cyByZWNvcmQKICAgICAgICAgICAgICAgIGdldGxvZ2luICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIHJldHVybiB3aG8gbG9nZ2VkIGluIGF0IHRoaXMgdHR5CiAgICAgICAgICAgICAgICBnZXRuZXRieWFkZHIgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBnZXQgbmV0d29yayByZWNvcmQgZ2l2ZW4gaXRzIGFkZHJlc3MKICAgICAgICAgICAgICAgIGdldG5ldGJ5bmFtZSAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGdldCBuZXR3b3JrcyByZWNvcmQgZ2l2ZW4gbmFtZQogICAgICAgICAgICAgICAgZ2V0bmV0ZW50ICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gZ2V0IG5leHQgbmV0d29ya3MgcmVjb3JkCiAgICAgICAgICAgICAgICBnZXRwZWVybmFtZSAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBmaW5kIHRoZSBvdGhlciBlbmQgb2YgYSBzb2NrZXQgY29ubmVjdGlvbgogICAgICAgICAgICAgICAgZ2V0cGdycCAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gZ2V0IHByb2Nlc3MgZ3JvdXAKICAgICAgICAgICAgICAgIGdldHBwaWQgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGdldCBwYXJlbnQgcHJvY2VzcyBJRAogICAgICAgICAgICAgICAgZ2V0cHJpb3JpdHkgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gZ2V0IGN1cnJlbnQgbmljZSB2YWx1ZQogICAgICAgICAgICAgICAgZ2V0cHJvdG9ieW5hbWUgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gZ2V0IHByb3RvY29sIHJlY29yZCBnaXZlbiBuYW1lCiAgICAgICAgICAgICAgICBnZXRwcm90b2J5bnVtYmVyICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBnZXQgcHJvdG9jb2wgcmVjb3JkIG51bWVyaWMgcHJvdG9jb2wKICAgICAgICAgICAgICAgIGdldHByb3RvZW50ICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGdldCBuZXh0IHByb3RvY29scyByZWNvcmQKICAgICAgICAgICAgICAgIGdldHB3ZW50ICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGdldCBuZXh0IHBhc3N3ZCByZWNvcmQKICAgICAgICAgICAgICAgIGdldHB3bmFtICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGdldCBwYXNzd2QgcmVjb3JkIGdpdmVuIHVzZXIgbG9naW4gbmFtZQogICAgICAgICAgICAgICAgZ2V0cHd1aWQgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gZ2V0IHBhc3N3ZCByZWNvcmQgZ2l2ZW4gdXNlciBJRAogICAgICAgICAgICAgICAgZ2V0c2VydmJ5bmFtZSAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gZ2V0IHNlcnZpY2VzIHJlY29yZCBnaXZlbiBpdHMgbmFtZQogICAgICAgICAgICAgICAgZ2V0c2VydmJ5cG9ydCAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gZ2V0IHNlcnZpY2VzIHJlY29yZCBnaXZlbiBudW1lcmljIHBvcnQKICAgICAgICAgICAgICAgIGdldHNlcnZlbnQgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGdldCBuZXh0IHNlcnZpY2VzIHJlY29yZAogICAgICAgICAgICAgICAgZ2V0c29ja25hbWUgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gcmV0cmlldmUgdGhlIHNvY2thZGRyIGZvciBhIGdpdmVuIHNvY2tldAogICAgICAgICAgICAgICAgZ2V0c29ja29wdCAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gZ2V0IHNvY2tldCBvcHRpb25zIG9uIGEgZ2l2ZW4gc29ja2V0CiAgICAgICAgICAgICAgICBnaXZlbiAgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8KICAgICAgICAgICAgICAgIGdsb2IgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGV4cGFuZCBmaWxlbmFtZXMgdXNpbmcgd2lsZGNhcmRzCiAgICAgICAgICAgICAgICBnbXRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBjb252ZXJ0IFVOSVggdGltZSBpbnRvIHJlY29yZCBvciBzdHJpbmcgdXNpbmcgR3JlZW53aWNoIHRpbWUKICAgICAgICAgICAgICAgICdnb3RvJyAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGNyZWF0ZSBzcGFnaGV0dGkgY29kZQogICAgICAgICAgICAgICAgZ3JlcCAgICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gbG9jYXRlIGVsZW1lbnRzIGluIGEgbGlzdCB0ZXN0IHRydWUgYWdhaW5zdCBhIGdpdmVuIGNyaXRlcmlvbgogICAgICAgICAgICAgICAgaGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gY29udmVydCBhIHN0cmluZyB0byBhIGhleGFkZWNpbWFsIG51bWJlcgogICAgICAgICAgICAgICAgJ2ltcG9ydCcgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gcGF0Y2ggYSBtb2R1bGUncyBuYW1lc3BhY2UgaW50byB5b3VyIG93bgogICAgICAgICAgICAgICAgaW5kZXggICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gZmluZCBhIHN1YnN0cmluZyB3aXRoaW4gYSBzdHJpbmcKICAgICAgICAgICAgICAgICdpbnQnICAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGdldCB0aGUgaW50ZWdlciBwb3J0aW9uIG9mIGEgbnVtYmVyCiAgICAgICAgICAgICAgICBpb2N0bCAgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBzeXN0ZW0tZGVwZW5kZW50IGRldmljZSBjb250cm9sIHN5c3RlbSBjYWxsCiAgICAgICAgICAgICAgICAnam9pbicgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBqb2luIGEgbGlzdCBpbnRvIGEgc3RyaW5nIHVzaW5nIGEgc2VwYXJhdG9yCiAgICAgICAgICAgICAgICBrZXlzICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSByZXRyaWV2ZSBsaXN0IG9mIGluZGljZXMgZnJvbSBhIGhhc2gKICAgICAgICAgICAgICAgIGtpbGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIHNlbmQgYSBzaWduYWwgdG8gYSBwcm9jZXNzIG9yIHByb2Nlc3MgZ3JvdXAKICAgICAgICAgICAgICAgIGxhc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGV4aXQgYSBibG9jayBwcmVtYXR1cmVseQogICAgICAgICAgICAgICAgbGMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gcmV0dXJuIGxvd2VyLWNhc2UgdmVyc2lvbiBvZiBhIHN0cmluZwogICAgICAgICAgICAgICAgbGNmaXJzdCAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gcmV0dXJuIGEgc3RyaW5nIHdpdGgganVzdCB0aGUgbmV4dCBsZXR0ZXIgaW4gbG93ZXIgY2FzZQogICAgICAgICAgICAgICAgbGVuZ3RoICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gYSBzdHJpbmcKICAgICAgICAgICAgICAgICdsaW5rJyAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGNyZWF0ZSBhIGhhcmQgbGluayBpbiB0aGUgZmlsZXN5dGVtCiAgICAgICAgICAgICAgICBsaXN0ZW4gICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSByZWdpc3RlciB5b3VyIHNvY2tldCBhcyBhIHNlcnZlcgogICAgICAgICAgICAgICAgbG9jYWwgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDIsICAgIC8vIC0gY3JlYXRlIGEgdGVtcG9yYXJ5IHZhbHVlIGZvciBhIGdsb2JhbCB2YXJpYWJsZSAoZHluYW1pYyBzY29waW5nKQogICAgICAgICAgICAgICAgbG9jYWx0aW1lICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gY29udmVydCBVTklYIHRpbWUgaW50byByZWNvcmQgb3Igc3RyaW5nIHVzaW5nIGxvY2FsIHRpbWUKICAgICAgICAgICAgICAgIGxvY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGdldCBhIHRocmVhZCBsb2NrIG9uIGEgdmFyaWFibGUsIHN1YnJvdXRpbmUsIG9yIG1ldGhvZAogICAgICAgICAgICAgICAgJ2xvZycgICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gcmV0cmlldmUgdGhlIG5hdHVyYWwgbG9nYXJpdGhtIGZvciBhIG51bWJlcgogICAgICAgICAgICAgICAgbHN0YXQgICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gc3RhdCBhIHN5bWJvbGljIGxpbmsKICAgICAgICAgICAgICAgIG0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOm51bGwsICAvLyAtIG1hdGNoIGEgc3RyaW5nIHdpdGggYSByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybgogICAgICAgICAgICAgICAgbWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gYXBwbHkgYSBjaGFuZ2UgdG8gYSBsaXN0IHRvIGdldCBiYWNrIGEgbmV3IGxpc3Qgd2l0aCB0aGUgY2hhbmdlcwogICAgICAgICAgICAgICAgbWtkaXIgICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gY3JlYXRlIGEgZGlyZWN0b3J5CiAgICAgICAgICAgICAgICBtc2djdGwgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBTeXNWIElQQyBtZXNzYWdlIGNvbnRyb2wgb3BlcmF0aW9ucwogICAgICAgICAgICAgICAgbXNnZ2V0ICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gZ2V0IFN5c1YgSVBDIG1lc3NhZ2UgcXVldWUKICAgICAgICAgICAgICAgIG1zZ3JjdiAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIHJlY2VpdmUgYSBTeXNWIElQQyBtZXNzYWdlIGZyb20gYSBtZXNzYWdlIHF1ZXVlCiAgICAgICAgICAgICAgICBtc2dzbmQgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBzZW5kIGEgU3lzViBJUEMgbWVzc2FnZSB0byBhIG1lc3NhZ2UgcXVldWUKICAgICAgICAgICAgICAgIG15ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAyLCAgICAvLyAtIGRlY2xhcmUgYW5kIGFzc2lnbiBhIGxvY2FsIHZhcmlhYmxlIChsZXhpY2FsIHNjb3BpbmcpCiAgICAgICAgICAgICAgICAnbmV3JyAgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8KICAgICAgICAgICAgICAgIG5leHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGl0ZXJhdGUgYSBibG9jayBwcmVtYXR1cmVseQogICAgICAgICAgICAgICAgbm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gdW5pbXBvcnQgc29tZSBtb2R1bGUgc3ltYm9scyBvciBzZW1hbnRpY3MgYXQgY29tcGlsZSB0aW1lCiAgICAgICAgICAgICAgICBvY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBjb252ZXJ0IGEgc3RyaW5nIHRvIGFuIG9jdGFsIG51bWJlcgogICAgICAgICAgICAgICAgb3BlbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gb3BlbiBhIGZpbGUsIHBpcGUsIG9yIGRlc2NyaXB0b3IKICAgICAgICAgICAgICAgIG9wZW5kaXIgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIG9wZW4gYSBkaXJlY3RvcnkKICAgICAgICAgICAgICAgIG9yZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGZpbmQgYSBjaGFyYWN0ZXIncyBudW1lcmljIHJlcHJlc2VudGF0aW9uCiAgICAgICAgICAgICAgICBvdXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMiwgICAgLy8gLSBkZWNsYXJlIGFuZCBhc3NpZ24gYSBwYWNrYWdlIHZhcmlhYmxlIChsZXhpY2FsIHNjb3BpbmcpCiAgICAgICAgICAgICAgICBwYWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBjb252ZXJ0IGEgbGlzdCBpbnRvIGEgYmluYXJ5IHJlcHJlc2VudGF0aW9uCiAgICAgICAgICAgICAgICAncGFja2FnZScgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBkZWNsYXJlIGEgc2VwYXJhdGUgZ2xvYmFsIG5hbWVzcGFjZQogICAgICAgICAgICAgICAgcGlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gb3BlbiBhIHBhaXIgb2YgY29ubmVjdGVkIGZpbGVoYW5kbGVzCiAgICAgICAgICAgICAgICBwb3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSByZW1vdmUgdGhlIGxhc3QgZWxlbWVudCBmcm9tIGFuIGFycmF5IGFuZCByZXR1cm4gaXQKICAgICAgICAgICAgICAgIHBvcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGZpbmQgb3Igc2V0IHRoZSBvZmZzZXQgZm9yIHRoZSBsYXN0L25leHQgbS8vZyBzZWFyY2gKICAgICAgICAgICAgICAgIHByaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIG91dHB1dCBhIGxpc3QgdG8gYSBmaWxlaGFuZGxlCiAgICAgICAgICAgICAgICBwcmludGYgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBvdXRwdXQgYSBmb3JtYXR0ZWQgbGlzdCB0byBhIGZpbGVoYW5kbGUKICAgICAgICAgICAgICAgIHByb3RvdHlwZSAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGdldCB0aGUgcHJvdG90eXBlIChpZiBhbnkpIG9mIGEgc3Vicm91dGluZQogICAgICAgICAgICAgICAgcHVzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gYXBwZW5kIG9uZSBvciBtb3JlIGVsZW1lbnRzIHRvIGFuIGFycmF5CiAgICAgICAgICAgICAgICBxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpudWxsLCAgLy8gLSBzaW5nbHkgcXVvdGUgYSBzdHJpbmcKICAgICAgICAgICAgICAgIHFxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOm51bGwsICAvLyAtIGRvdWJseSBxdW90ZSBhIHN0cmluZwogICAgICAgICAgICAgICAgcXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6bnVsbCwgIC8vIC0gQ29tcGlsZSBwYXR0ZXJuCiAgICAgICAgICAgICAgICBxdW90ZW1ldGEgICAgICAgICAgICAgICAgICAgICAgIDpudWxsLCAgLy8gLSBxdW90ZSByZWd1bGFyIGV4cHJlc3Npb24gbWFnaWMgY2hhcmFjdGVycwogICAgICAgICAgICAgICAgcXcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6bnVsbCwgIC8vIC0gcXVvdGUgYSBsaXN0IG9mIHdvcmRzCiAgICAgICAgICAgICAgICBxeCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpudWxsLCAgLy8gLSBiYWNrcXVvdGUgcXVvdGUgYSBzdHJpbmcKICAgICAgICAgICAgICAgIHJhbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIHJldHJpZXZlIHRoZSBuZXh0IHBzZXVkb3JhbmRvbSBudW1iZXIKICAgICAgICAgICAgICAgIHJlYWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGZpeGVkLWxlbmd0aCBidWZmZXJlZCBpbnB1dCBmcm9tIGEgZmlsZWhhbmRsZQogICAgICAgICAgICAgICAgcmVhZGRpciAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gZ2V0IGEgZGlyZWN0b3J5IGZyb20gYSBkaXJlY3RvcnkgaGFuZGxlCiAgICAgICAgICAgICAgICByZWFkbGluZSAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBmZXRjaCBhIHJlY29yZCBmcm9tIGEgZmlsZQogICAgICAgICAgICAgICAgcmVhZGxpbmsgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gZGV0ZXJtaW5lIHdoZXJlIGEgc3ltYm9saWMgbGluayBpcyBwb2ludGluZwogICAgICAgICAgICAgICAgcmVhZHBpcGUgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gZXhlY3V0ZSBhIHN5c3RlbSBjb21tYW5kIGFuZCBjb2xsZWN0IHN0YW5kYXJkIG91dHB1dAogICAgICAgICAgICAgICAgcmVjdiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gcmVjZWl2ZSBhIG1lc3NhZ2Ugb3ZlciBhIFNvY2tldAogICAgICAgICAgICAgICAgcmVkbyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gc3RhcnQgdGhpcyBsb29wIGl0ZXJhdGlvbiBvdmVyIGFnYWluCiAgICAgICAgICAgICAgICByZWYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBmaW5kIG91dCB0aGUgdHlwZSBvZiB0aGluZyBiZWluZyByZWZlcmVuY2VkCiAgICAgICAgICAgICAgICByZW5hbWUgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBjaGFuZ2UgYSBmaWxlbmFtZQogICAgICAgICAgICAgICAgcmVxdWlyZSAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gbG9hZCBpbiBleHRlcm5hbCBmdW5jdGlvbnMgZnJvbSBhIGxpYnJhcnkgYXQgcnVudGltZQogICAgICAgICAgICAgICAgcmVzZXQgICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gY2xlYXIgYWxsIHZhcmlhYmxlcyBvZiBhIGdpdmVuIG5hbWUKICAgICAgICAgICAgICAgICdyZXR1cm4nICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGdldCBvdXQgb2YgYSBmdW5jdGlvbiBlYXJseQogICAgICAgICAgICAgICAgcmV2ZXJzZSAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gZmxpcCBhIHN0cmluZyBvciBhIGxpc3QKICAgICAgICAgICAgICAgIHJld2luZGRpciAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIHJlc2V0IGRpcmVjdG9yeSBoYW5kbGUKICAgICAgICAgICAgICAgIHJpbmRleCAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIHJpZ2h0LXRvLWxlZnQgc3Vic3RyaW5nIHNlYXJjaAogICAgICAgICAgICAgICAgcm1kaXIgICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gcmVtb3ZlIGEgZGlyZWN0b3J5CiAgICAgICAgICAgICAgICBzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDpudWxsLCAgLy8gLSByZXBsYWNlIGEgcGF0dGVybiB3aXRoIGEgc3RyaW5nCiAgICAgICAgICAgICAgICBzYXkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBwcmludCB3aXRoIG5ld2xpbmUKICAgICAgICAgICAgICAgIHNjYWxhciAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGZvcmNlIGEgc2NhbGFyIGNvbnRleHQKICAgICAgICAgICAgICAgIHNlZWsgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIHJlcG9zaXRpb24gZmlsZSBwb2ludGVyIGZvciByYW5kb20tYWNjZXNzIEkvTwogICAgICAgICAgICAgICAgc2Vla2RpciAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gcmVwb3NpdGlvbiBkaXJlY3RvcnkgcG9pbnRlcgogICAgICAgICAgICAgICAgc2VsZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gcmVzZXQgZGVmYXVsdCBvdXRwdXQgb3IgZG8gSS9PIG11bHRpcGxleGluZwogICAgICAgICAgICAgICAgc2VtY3RsICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gU3lzViBzZW1hcGhvcmUgY29udHJvbCBvcGVyYXRpb25zCiAgICAgICAgICAgICAgICBzZW1nZXQgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBnZXQgc2V0IG9mIFN5c1Ygc2VtYXBob3JlcwogICAgICAgICAgICAgICAgc2Vtb3AgICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gU3lzViBzZW1hcGhvcmUgb3BlcmF0aW9ucwogICAgICAgICAgICAgICAgc2VuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gc2VuZCBhIG1lc3NhZ2Ugb3ZlciBhIHNvY2tldAogICAgICAgICAgICAgICAgc2V0Z3JlbnQgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gcHJlcGFyZSBncm91cCBmaWxlIGZvciB1c2UKICAgICAgICAgICAgICAgIHNldGhvc3RlbnQgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIHByZXBhcmUgaG9zdHMgZmlsZSBmb3IgdXNlCiAgICAgICAgICAgICAgICBzZXRuZXRlbnQgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBwcmVwYXJlIG5ldHdvcmtzIGZpbGUgZm9yIHVzZQogICAgICAgICAgICAgICAgc2V0cGdycCAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gc2V0IHRoZSBwcm9jZXNzIGdyb3VwIG9mIGEgcHJvY2VzcwogICAgICAgICAgICAgICAgc2V0cHJpb3JpdHkgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gc2V0IGEgcHJvY2VzcydzIG5pY2UgdmFsdWUKICAgICAgICAgICAgICAgIHNldHByb3RvZW50ICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIHByZXBhcmUgcHJvdG9jb2xzIGZpbGUgZm9yIHVzZQogICAgICAgICAgICAgICAgc2V0cHdlbnQgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gcHJlcGFyZSBwYXNzd2QgZmlsZSBmb3IgdXNlCiAgICAgICAgICAgICAgICBzZXRzZXJ2ZW50ICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBwcmVwYXJlIHNlcnZpY2VzIGZpbGUgZm9yIHVzZQogICAgICAgICAgICAgICAgc2V0c29ja29wdCAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gc2V0IHNvbWUgc29ja2V0IG9wdGlvbnMKICAgICAgICAgICAgICAgIHNoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIHJlbW92ZSB0aGUgZmlyc3QgZWxlbWVudCBvZiBhbiBhcnJheSwgYW5kIHJldHVybiBpdAogICAgICAgICAgICAgICAgc2htY3RsICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gU3lzViBzaGFyZWQgbWVtb3J5IG9wZXJhdGlvbnMKICAgICAgICAgICAgICAgIHNobWdldCAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGdldCBTeXNWIHNoYXJlZCBtZW1vcnkgc2VnbWVudCBpZGVudGlmaWVyCiAgICAgICAgICAgICAgICBzaG1yZWFkICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSByZWFkIFN5c1Ygc2hhcmVkIG1lbW9yeQogICAgICAgICAgICAgICAgc2htd3JpdGUgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gd3JpdGUgU3lzViBzaGFyZWQgbWVtb3J5CiAgICAgICAgICAgICAgICBzaHV0ZG93biAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBjbG9zZSBkb3duIGp1c3QgaGFsZiBvZiBhIHNvY2tldCBjb25uZWN0aW9uCiAgICAgICAgICAgICAgICAnc2luJyAgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSByZXR1cm4gdGhlIHNpbmUgb2YgYSBudW1iZXIKICAgICAgICAgICAgICAgIHNsZWVwICAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGJsb2NrIGZvciBzb21lIG51bWJlciBvZiBzZWNvbmRzCiAgICAgICAgICAgICAgICBzb2NrZXQgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBjcmVhdGUgYSBzb2NrZXQKICAgICAgICAgICAgICAgIHNvY2tldHBhaXIgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGNyZWF0ZSBhIHBhaXIgb2Ygc29ja2V0cwogICAgICAgICAgICAgICAgJ3NvcnQnICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gc29ydCBhIGxpc3Qgb2YgdmFsdWVzCiAgICAgICAgICAgICAgICBzcGxpY2UgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBhZGQgb3IgcmVtb3ZlIGVsZW1lbnRzIGFueXdoZXJlIGluIGFuIGFycmF5CiAgICAgICAgICAgICAgICAnc3BsaXQnICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBzcGxpdCB1cCBhIHN0cmluZyB1c2luZyBhIHJlZ2V4cCBkZWxpbWl0ZXIKICAgICAgICAgICAgICAgIHNwcmludGYgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGZvcm1hdHRlZCBwcmludCBpbnRvIGEgc3RyaW5nCiAgICAgICAgICAgICAgICAnc3FydCcgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBzcXVhcmUgcm9vdCBmdW5jdGlvbgogICAgICAgICAgICAgICAgc3JhbmQgICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gc2VlZCB0aGUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKICAgICAgICAgICAgICAgIHN0YXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGdldCBhIGZpbGUncyBzdGF0dXMgaW5mb3JtYXRpb24KICAgICAgICAgICAgICAgIHN0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGRlY2xhcmUgYW5kIGFzc2lnbiBhIHN0YXRlIHZhcmlhYmxlIChwZXJzaXN0ZW50IGxleGljYWwgc2NvcGluZykKICAgICAgICAgICAgICAgIHN0dWR5ICAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIG9wdGltaXplIGlucHV0IGRhdGEgZm9yIHJlcGVhdGVkIHNlYXJjaGVzCiAgICAgICAgICAgICAgICAnc3ViJyAgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBkZWNsYXJlIGEgc3Vicm91dGluZSwgcG9zc2libHkgYW5vbnltb3VzbHkKICAgICAgICAgICAgICAgICdzdWJzdHInICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGdldCBvciBhbHRlciBhIHBvcnRpb24gb2YgYSBzdGlybmcKICAgICAgICAgICAgICAgIHN5bWxpbmsgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGNyZWF0ZSBhIHN5bWJvbGljIGxpbmsgdG8gYSBmaWxlCiAgICAgICAgICAgICAgICBzeXNjYWxsICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBleGVjdXRlIGFuIGFyYml0cmFyeSBzeXN0ZW0gY2FsbAogICAgICAgICAgICAgICAgc3lzb3BlbiAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gb3BlbiBhIGZpbGUsIHBpcGUsIG9yIGRlc2NyaXB0b3IKICAgICAgICAgICAgICAgIHN5c3JlYWQgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGZpeGVkLWxlbmd0aCB1bmJ1ZmZlcmVkIGlucHV0IGZyb20gYSBmaWxlaGFuZGxlCiAgICAgICAgICAgICAgICBzeXNzZWVrICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBwb3NpdGlvbiBJL08gcG9pbnRlciBvbiBoYW5kbGUgdXNlZCB3aXRoIHN5c3JlYWQgYW5kIHN5c3dyaXRlCiAgICAgICAgICAgICAgICBzeXN0ZW0gICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBydW4gYSBzZXBhcmF0ZSBwcm9ncmFtCiAgICAgICAgICAgICAgICBzeXN3cml0ZSAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBmaXhlZC1sZW5ndGggdW5idWZmZXJlZCBvdXRwdXQgdG8gYSBmaWxlaGFuZGxlCiAgICAgICAgICAgICAgICB0ZWxsICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBnZXQgY3VycmVudCBzZWVrcG9pbnRlciBvbiBhIGZpbGVoYW5kbGUKICAgICAgICAgICAgICAgIHRlbGxkaXIgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGdldCBjdXJyZW50IHNlZWtwb2ludGVyIG9uIGEgZGlyZWN0b3J5IGhhbmRsZQogICAgICAgICAgICAgICAgdGllICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gYmluZCBhIHZhcmlhYmxlIHRvIGFuIG9iamVjdCBjbGFzcwogICAgICAgICAgICAgICAgdGllZCAgICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gZ2V0IGEgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3QgdW5kZXJseWluZyBhIHRpZWQgdmFyaWFibGUKICAgICAgICAgICAgICAgIHRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIHJldHVybiBudW1iZXIgb2Ygc2Vjb25kcyBzaW5jZSAxOTcwCiAgICAgICAgICAgICAgICB0aW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSByZXR1cm4gZWxhcHNlZCB0aW1lIGZvciBzZWxmIGFuZCBjaGlsZCBwcm9jZXNzZXMKICAgICAgICAgICAgICAgIHRyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOm51bGwsICAvLyAtIHRyYW5zbGl0ZXJhdGUgYSBzdHJpbmcKICAgICAgICAgICAgICAgIHRydW5jYXRlICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIHNob3J0ZW4gYSBmaWxlCiAgICAgICAgICAgICAgICB1YyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSByZXR1cm4gdXBwZXItY2FzZSB2ZXJzaW9uIG9mIGEgc3RyaW5nCiAgICAgICAgICAgICAgICB1Y2ZpcnN0ICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSByZXR1cm4gYSBzdHJpbmcgd2l0aCBqdXN0IHRoZSBuZXh0IGxldHRlciBpbiB1cHBlciBjYXNlCiAgICAgICAgICAgICAgICB1bWFzayAgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBzZXQgZmlsZSBjcmVhdGlvbiBtb2RlIG1hc2sKICAgICAgICAgICAgICAgIHVuZGVmICAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIHJlbW92ZSBhIHZhcmlhYmxlIG9yIGZ1bmN0aW9uIGRlZmluaXRpb24KICAgICAgICAgICAgICAgIHVubGluayAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIHJlbW92ZSBvbmUgbGluayB0byBhIGZpbGUKICAgICAgICAgICAgICAgIHVucGFjayAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGNvbnZlcnQgYmluYXJ5IHN0cnVjdHVyZSBpbnRvIG5vcm1hbCBwZXJsIHZhcmlhYmxlcwogICAgICAgICAgICAgICAgdW5zaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gcHJlcGVuZCBtb3JlIGVsZW1lbnRzIHRvIHRoZSBiZWdpbm5pbmcgb2YgYSBsaXN0CiAgICAgICAgICAgICAgICB1bnRpZSAgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBicmVhayBhIHRpZSBiaW5kaW5nIHRvIGEgdmFyaWFibGUKICAgICAgICAgICAgICAgIHVzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIGxvYWQgaW4gYSBtb2R1bGUgYXQgY29tcGlsZSB0aW1lCiAgICAgICAgICAgICAgICB1dGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSBzZXQgYSBmaWxlJ3MgbGFzdCBhY2Nlc3MgYW5kIG1vZGlmeSB0aW1lcwogICAgICAgICAgICAgICAgdmFsdWVzICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gcmV0dXJuIGEgbGlzdCBvZiB0aGUgdmFsdWVzIGluIGEgaGFzaAogICAgICAgICAgICAgICAgdmVjICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gdGVzdCBvciBzZXQgcGFydGljdWxhciBiaXRzIGluIGEgc3RyaW5nCiAgICAgICAgICAgICAgICB3YWl0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoxLCAgICAgLy8gLSB3YWl0IGZvciBhbnkgY2hpbGQgcHJvY2VzcyB0byBkaWUKICAgICAgICAgICAgICAgIHdhaXRwaWQgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLyAtIHdhaXQgZm9yIGEgcGFydGljdWxhciBjaGlsZCBwcm9jZXNzIHRvIGRpZQogICAgICAgICAgICAgICAgd2FudGFycmF5ICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gZ2V0IHZvaWQgdnMgc2NhbGFyIHZzIGxpc3QgY29udGV4dCBvZiBjdXJyZW50IHN1YnJvdXRpbmUgY2FsbAogICAgICAgICAgICAgICAgd2FybiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gcHJpbnQgZGVidWdnaW5nIGluZm8KICAgICAgICAgICAgICAgIHdoZW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOjEsICAgICAvLwogICAgICAgICAgICAgICAgd3JpdGUgICAgICAgICAgICAgICAgICAgICAgICAgICA6MSwgICAgIC8vIC0gcHJpbnQgYSBwaWN0dXJlIHJlY29yZAogICAgICAgICAgICAgICAgeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6bnVsbH07IC8vIC0gdHJhbnNsaXRlcmF0ZSBhIHN0cmluZwoKICAgICAgICB2YXIgUlhzdHlsZT0ic3RyaW5nLTIiOwogICAgICAgIHZhciBSWG1vZGlmaWVycz0vW2dvc2V4aW1hY3BsdWRdLzsgICAgICAgICAgICAgIC8vIE5PVEU6ICJtIiwgInMiLCAieSIgYW5kICJ0ciIgbmVlZCB0byBjb3JyZWN0IHJlYWwgbW9kaWZpZXJzIGZvciBlYWNoIHJlZ2V4cCB0eXBlCgogICAgICAgIGZ1bmN0aW9uIHRva2VuQ2hhaW4oc3RyZWFtLHN0YXRlLGNoYWluLHN0eWxlLHRhaWwpeyAgICAgLy8gTk9URTogY2hhaW4ubGVuZ3RoID4gMiBpcyBub3Qgd29ya2luZyBub3cgKGl0J3MgZm9yIHNbLi4uXVsuLi5dZ2VvczspCiAgICAgICAgICAgICAgICBzdGF0ZS5jaGFpbj1udWxsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMiAgIDN0YWlsCiAgICAgICAgICAgICAgICBzdGF0ZS5zdHlsZT1udWxsOwogICAgICAgICAgICAgICAgc3RhdGUudGFpbD1udWxsOwogICAgICAgICAgICAgICAgc3RhdGUudG9rZW5pemU9ZnVuY3Rpb24oc3RyZWFtLHN0YXRlKXsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGU9ZmFsc2UsYyxpPTA7CiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKGM9c3RyZWFtLm5leHQoKSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYz09PWNoYWluW2ldJiYhZSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihjaGFpblsrK2ldIT09dW5kZWZpbmVkKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuY2hhaW49Y2hhaW5baV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLnN0eWxlPXN0eWxlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS50YWlsPXRhaWw7fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZih0YWlsKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0uZWF0V2hpbGUodGFpbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS50b2tlbml6ZT10b2tlblBlcmw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3R5bGU7fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGU9IWUmJmM9PSJcXCI7fQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3R5bGU7fTsKICAgICAgICAgICAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sc3RhdGUpO30KCiAgICAgICAgZnVuY3Rpb24gdG9rZW5TT01FVEhJTkcoc3RyZWFtLHN0YXRlLHN0cmluZyl7CiAgICAgICAgICAgICAgICBzdGF0ZS50b2tlbml6ZT1mdW5jdGlvbihzdHJlYW0sc3RhdGUpewogICAgICAgICAgICAgICAgICAgICAgICBpZihzdHJlYW0uc3RyaW5nPT1zdHJpbmcpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUudG9rZW5pemU9dG9rZW5QZXJsOwogICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAic3RyaW5nIjt9OwogICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRlLnRva2VuaXplKHN0cmVhbSxzdGF0ZSk7fQoKICAgICAgICBmdW5jdGlvbiB0b2tlblBlcmwoc3RyZWFtLHN0YXRlKXsKICAgICAgICAgICAgICAgIGlmKHN0cmVhbS5lYXRTcGFjZSgpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgIGlmKHN0YXRlLmNoYWluKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5DaGFpbihzdHJlYW0sc3RhdGUsc3RhdGUuY2hhaW4sc3RhdGUuc3R5bGUsc3RhdGUudGFpbCk7CiAgICAgICAgICAgICAgICBpZihzdHJlYW0ubWF0Y2goL15cLT9bXGRcLl0vLGZhbHNlKSkKICAgICAgICAgICAgICAgICAgICAgICAgaWYoc3RyZWFtLm1hdGNoKC9eKFwtPyhcZCpcLlxkKyhlWystXT9cZCspP3xcZCtcLlxkKil8MHhbXGRhLWZBLUZdK3wwYlswMV0rfFxkKyhlWystXT9cZCspPykvKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ251bWJlcic7CiAgICAgICAgICAgICAgICBpZihzdHJlYW0ubWF0Y2goL148PCg/PVx3KS8pKXsgICAgICAgICAgICAgICAgICAvLyBOT1RFOiA8PFNPTUVUSElOR1xuLi4uXG5TT01FVEhJTkdcbgogICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1x3Lyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlblNPTUVUSElORyhzdHJlYW0sc3RhdGUsc3RyZWFtLmN1cnJlbnQoKS5zdWJzdHIoMikpO30KICAgICAgICAgICAgICAgIGlmKHN0cmVhbS5zb2woKSYmc3RyZWFtLm1hdGNoKC9eXD1pdGVtKD8hXHcpLykpey8vIE5PVEU6IFxuPWl0ZW0uLi5cbj1jdXRcbgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5TT01FVEhJTkcoc3RyZWFtLHN0YXRlLCc9Y3V0Jyk7fQogICAgICAgICAgICAgICAgdmFyIGNoPXN0cmVhbS5uZXh0KCk7CiAgICAgICAgICAgICAgICBpZihjaD09JyInfHxjaD09IiciKXsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiAnIG9yICIgb3IgPDwnU09NRVRISU5HJ1xuLi4uXG5TT01FVEhJTkdcbiBvciA8PCJTT01FVEhJTkciXG4uLi5cblNPTUVUSElOR1xuCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHByZWZpeChzdHJlYW0sIDMpPT0iPDwiK2NoKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcD1zdHJlYW0ucG9zOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvXHcvKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbj1zdHJlYW0uY3VycmVudCgpLnN1YnN0cigxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihuJiZzdHJlYW0uZWF0KGNoKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlblNPTUVUSElORyhzdHJlYW0sc3RhdGUsbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnBvcz1wO30KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuQ2hhaW4oc3RyZWFtLHN0YXRlLFtjaF0sInN0cmluZyIpO30KICAgICAgICAgICAgICAgIGlmKGNoPT0icSIpewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYz1sb29rKHN0cmVhbSwgLTIpOwogICAgICAgICAgICAgICAgICAgICAgICBpZighKGMmJi9cdy8udGVzdChjKSkpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGM9bG9vayhzdHJlYW0sIDApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGM9PSJ4Iil7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjPWxvb2soc3RyZWFtLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGM9PSIoIil7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhdFN1ZmZpeChzdHJlYW0sIDIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5DaGFpbihzdHJlYW0sc3RhdGUsWyIpIl0sUlhzdHlsZSxSWG1vZGlmaWVycyk7fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYz09IlsiKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWF0U3VmZml4KHN0cmVhbSwgMik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbkNoYWluKHN0cmVhbSxzdGF0ZSxbIl0iXSxSWHN0eWxlLFJYbW9kaWZpZXJzKTt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihjPT0ieyIpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYXRTdWZmaXgoc3RyZWFtLCAyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuQ2hhaW4oc3RyZWFtLHN0YXRlLFsifSJdLFJYc3R5bGUsUlhtb2RpZmllcnMpO30KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGM9PSI8Iil7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhdFN1ZmZpeChzdHJlYW0sIDIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5DaGFpbihzdHJlYW0sc3RhdGUsWyI+Il0sUlhzdHlsZSxSWG1vZGlmaWVycyk7fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoL1tcXiciIX5cL10vLnRlc3QoYykpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYXRTdWZmaXgoc3RyZWFtLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuQ2hhaW4oc3RyZWFtLHN0YXRlLFtzdHJlYW0uZWF0KGMpXSxSWHN0eWxlLFJYbW9kaWZpZXJzKTt9fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoYz09InEiKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGM9bG9vayhzdHJlYW0sIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYz09IigiKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWF0U3VmZml4KHN0cmVhbSwgMik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbkNoYWluKHN0cmVhbSxzdGF0ZSxbIikiXSwic3RyaW5nIik7fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYz09IlsiKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWF0U3VmZml4KHN0cmVhbSwgMik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbkNoYWluKHN0cmVhbSxzdGF0ZSxbIl0iXSwic3RyaW5nIik7fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYz09InsiKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWF0U3VmZml4KHN0cmVhbSwgMik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbkNoYWluKHN0cmVhbSxzdGF0ZSxbIn0iXSwic3RyaW5nIik7fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYz09IjwiKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWF0U3VmZml4KHN0cmVhbSwgMik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbkNoYWluKHN0cmVhbSxzdGF0ZSxbIj4iXSwic3RyaW5nIik7fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoL1tcXiciIX5cL10vLnRlc3QoYykpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYXRTdWZmaXgoc3RyZWFtLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuQ2hhaW4oc3RyZWFtLHN0YXRlLFtzdHJlYW0uZWF0KGMpXSwic3RyaW5nIik7fX0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKGM9PSJ3Iil7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjPWxvb2soc3RyZWFtLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGM9PSIoIil7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhdFN1ZmZpeChzdHJlYW0sIDIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5DaGFpbihzdHJlYW0sc3RhdGUsWyIpIl0sImJyYWNrZXQiKTt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihjPT0iWyIpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYXRTdWZmaXgoc3RyZWFtLCAyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuQ2hhaW4oc3RyZWFtLHN0YXRlLFsiXSJdLCJicmFja2V0Iik7fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYz09InsiKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWF0U3VmZml4KHN0cmVhbSwgMik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbkNoYWluKHN0cmVhbSxzdGF0ZSxbIn0iXSwiYnJhY2tldCIpO30KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGM9PSI8Iil7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhdFN1ZmZpeChzdHJlYW0sIDIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5DaGFpbihzdHJlYW0sc3RhdGUsWyI+Il0sImJyYWNrZXQiKTt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigvW1xeJyIhflwvXS8udGVzdChjKSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhdFN1ZmZpeChzdHJlYW0sIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5DaGFpbihzdHJlYW0sc3RhdGUsW3N0cmVhbS5lYXQoYyldLCJicmFja2V0Iik7fX0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKGM9PSJyIil7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjPWxvb2soc3RyZWFtLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGM9PSIoIil7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhdFN1ZmZpeChzdHJlYW0sIDIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5DaGFpbihzdHJlYW0sc3RhdGUsWyIpIl0sUlhzdHlsZSxSWG1vZGlmaWVycyk7fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYz09IlsiKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWF0U3VmZml4KHN0cmVhbSwgMik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbkNoYWluKHN0cmVhbSxzdGF0ZSxbIl0iXSxSWHN0eWxlLFJYbW9kaWZpZXJzKTt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihjPT0ieyIpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYXRTdWZmaXgoc3RyZWFtLCAyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuQ2hhaW4oc3RyZWFtLHN0YXRlLFsifSJdLFJYc3R5bGUsUlhtb2RpZmllcnMpO30KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGM9PSI8Iil7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVhdFN1ZmZpeChzdHJlYW0sIDIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5DaGFpbihzdHJlYW0sc3RhdGUsWyI+Il0sUlhzdHlsZSxSWG1vZGlmaWVycyk7fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoL1tcXiciIX5cL10vLnRlc3QoYykpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYXRTdWZmaXgoc3RyZWFtLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuQ2hhaW4oc3RyZWFtLHN0YXRlLFtzdHJlYW0uZWF0KGMpXSxSWHN0eWxlLFJYbW9kaWZpZXJzKTt9fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoL1tcXiciIX5cLyhcW3s8XS8udGVzdChjKSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihjPT0iKCIpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYXRTdWZmaXgoc3RyZWFtLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuQ2hhaW4oc3RyZWFtLHN0YXRlLFsiKSJdLCJzdHJpbmciKTt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihjPT0iWyIpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYXRTdWZmaXgoc3RyZWFtLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuQ2hhaW4oc3RyZWFtLHN0YXRlLFsiXSJdLCJzdHJpbmciKTt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihjPT0ieyIpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYXRTdWZmaXgoc3RyZWFtLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuQ2hhaW4oc3RyZWFtLHN0YXRlLFsifSJdLCJzdHJpbmciKTt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihjPT0iPCIpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYXRTdWZmaXgoc3RyZWFtLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuQ2hhaW4oc3RyZWFtLHN0YXRlLFsiPiJdLCJzdHJpbmciKTt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigvW1xeJyIhflwvXS8udGVzdChjKSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbkNoYWluKHN0cmVhbSxzdGF0ZSxbc3RyZWFtLmVhdChjKV0sInN0cmluZyIpO319fX0KICAgICAgICAgICAgICAgIGlmKGNoPT0ibSIpewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYz1sb29rKHN0cmVhbSwgLTIpOwogICAgICAgICAgICAgICAgICAgICAgICBpZighKGMmJi9cdy8udGVzdChjKSkpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGM9c3RyZWFtLmVhdCgvWyhcW3s8XF4nIiF+XC9dLyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYyl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZigvW1xeJyIhflwvXS8udGVzdChjKSl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbkNoYWluKHN0cmVhbSxzdGF0ZSxbY10sUlhzdHlsZSxSWG1vZGlmaWVycyk7fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYz09IigiKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuQ2hhaW4oc3RyZWFtLHN0YXRlLFsiKSJdLFJYc3R5bGUsUlhtb2RpZmllcnMpO30KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGM9PSJbIil7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbkNoYWluKHN0cmVhbSxzdGF0ZSxbIl0iXSxSWHN0eWxlLFJYbW9kaWZpZXJzKTt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihjPT0ieyIpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5DaGFpbihzdHJlYW0sc3RhdGUsWyJ9Il0sUlhzdHlsZSxSWG1vZGlmaWVycyk7fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYz09IjwiKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuQ2hhaW4oc3RyZWFtLHN0YXRlLFsiPiJdLFJYc3R5bGUsUlhtb2RpZmllcnMpO319fX0KICAgICAgICAgICAgICAgIGlmKGNoPT0icyIpewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYz0vW1wvPlxdfSlcd10vLnRlc3QobG9vayhzdHJlYW0sIC0yKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKCFjKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjPXN0cmVhbS5lYXQoL1soXFt7PFxeJyIhflwvXS8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGMpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYz09IlsiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5DaGFpbihzdHJlYW0sc3RhdGUsWyJdIiwiXSJdLFJYc3R5bGUsUlhtb2RpZmllcnMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYz09InsiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5DaGFpbihzdHJlYW0sc3RhdGUsWyJ9IiwifSJdLFJYc3R5bGUsUlhtb2RpZmllcnMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYz09IjwiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5DaGFpbihzdHJlYW0sc3RhdGUsWyI+IiwiPiJdLFJYc3R5bGUsUlhtb2RpZmllcnMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYz09IigiKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5DaGFpbihzdHJlYW0sc3RhdGUsWyIpIiwiKSJdLFJYc3R5bGUsUlhtb2RpZmllcnMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuQ2hhaW4oc3RyZWFtLHN0YXRlLFtjLGNdLFJYc3R5bGUsUlhtb2RpZmllcnMpO319fQogICAgICAgICAgICAgICAgaWYoY2g9PSJ5Iil7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjPS9bXC8+XF19KVx3XS8udGVzdChsb29rKHN0cmVhbSwgLTIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWMpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGM9c3RyZWFtLmVhdCgvWyhcW3s8XF4nIiF+XC9dLyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYyl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihjPT0iWyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbkNoYWluKHN0cmVhbSxzdGF0ZSxbIl0iLCJdIl0sUlhzdHlsZSxSWG1vZGlmaWVycyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihjPT0ieyIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbkNoYWluKHN0cmVhbSxzdGF0ZSxbIn0iLCJ9Il0sUlhzdHlsZSxSWG1vZGlmaWVycyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihjPT0iPCIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbkNoYWluKHN0cmVhbSxzdGF0ZSxbIj4iLCI+Il0sUlhzdHlsZSxSWG1vZGlmaWVycyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihjPT0iKCIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbkNoYWluKHN0cmVhbSxzdGF0ZSxbIikiLCIpIl0sUlhzdHlsZSxSWG1vZGlmaWVycyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5DaGFpbihzdHJlYW0sc3RhdGUsW2MsY10sUlhzdHlsZSxSWG1vZGlmaWVycyk7fX19CiAgICAgICAgICAgICAgICBpZihjaD09InQiKXsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGM9L1tcLz5cXX0pXHddLy50ZXN0KGxvb2soc3RyZWFtLCAtMikpOwogICAgICAgICAgICAgICAgICAgICAgICBpZighYyl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYz1zdHJlYW0uZWF0KCJyIik7aWYoYyl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYz1zdHJlYW0uZWF0KC9bKFxbezxcXiciIX5cL10vKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihjKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGM9PSJbIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuQ2hhaW4oc3RyZWFtLHN0YXRlLFsiXSIsIl0iXSxSWHN0eWxlLFJYbW9kaWZpZXJzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGM9PSJ7IikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuQ2hhaW4oc3RyZWFtLHN0YXRlLFsifSIsIn0iXSxSWHN0eWxlLFJYbW9kaWZpZXJzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGM9PSI8IikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuQ2hhaW4oc3RyZWFtLHN0YXRlLFsiPiIsIj4iXSxSWHN0eWxlLFJYbW9kaWZpZXJzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGM9PSIoIikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuQ2hhaW4oc3RyZWFtLHN0YXRlLFsiKSIsIikiXSxSWHN0eWxlLFJYbW9kaWZpZXJzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbkNoYWluKHN0cmVhbSxzdGF0ZSxbYyxjXSxSWHN0eWxlLFJYbW9kaWZpZXJzKTt9fX19CiAgICAgICAgICAgICAgICBpZihjaD09ImAiKXsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRva2VuQ2hhaW4oc3RyZWFtLHN0YXRlLFtjaF0sInZhcmlhYmxlLTIiKTt9CiAgICAgICAgICAgICAgICBpZihjaD09Ii8iKXsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoIS9+XHMqJC8udGVzdChwcmVmaXgoc3RyZWFtKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJvcGVyYXRvciI7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5DaGFpbihzdHJlYW0sc3RhdGUsW2NoXSxSWHN0eWxlLFJYbW9kaWZpZXJzKTt9CiAgICAgICAgICAgICAgICBpZihjaD09IiQiKXsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHA9c3RyZWFtLnBvczsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoc3RyZWFtLmVhdFdoaWxlKC9cZC8pfHxzdHJlYW0uZWF0KCJ7IikmJnN0cmVhbS5lYXRXaGlsZSgvXGQvKSYmc3RyZWFtLmVhdCgifSIpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAidmFyaWFibGUtMiI7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucG9zPXA7fQogICAgICAgICAgICAgICAgaWYoL1skQCVdLy50ZXN0KGNoKSl7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwPXN0cmVhbS5wb3M7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHN0cmVhbS5lYXQoIl4iKSYmc3RyZWFtLmVhdCgvW0EtWl0vKXx8IS9bQCQlJl0vLnRlc3QobG9vayhzdHJlYW0sIC0yKSkmJnN0cmVhbS5lYXQoL1s9fFxcXC0jP0A7OiZgflxeIVxbXF0qJyIkKy4sXC88PigpXS8pKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYz1zdHJlYW0uY3VycmVudCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKFBFUkxbY10pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gInZhcmlhYmxlLTIiO30KICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnBvcz1wO30KICAgICAgICAgICAgICAgIGlmKC9bJEAlJl0vLnRlc3QoY2gpKXsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoc3RyZWFtLmVhdFdoaWxlKC9bXHckXFtcXV0vKXx8c3RyZWFtLmVhdCgieyIpJiZzdHJlYW0uZWF0V2hpbGUoL1tcdyRcW1xdXS8pJiZzdHJlYW0uZWF0KCJ9IikpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjPXN0cmVhbS5jdXJyZW50KCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoUEVSTFtjXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAidmFyaWFibGUtMiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJ2YXJpYWJsZSI7fX0KICAgICAgICAgICAgICAgIGlmKGNoPT0iIyIpewogICAgICAgICAgICAgICAgICAgICAgICBpZihsb29rKHN0cmVhbSwgLTIpIT0iJCIpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImNvbW1lbnQiO319CiAgICAgICAgICAgICAgICBpZigvWzorXC1cXiokJiVAPTw+IT98XC9+XC5dLy50ZXN0KGNoKSl7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwPXN0cmVhbS5wb3M7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvWzorXC1cXiokJiVAPTw+IT98XC9+XC5dLyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKFBFUkxbc3RyZWFtLmN1cnJlbnQoKV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJvcGVyYXRvciI7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucG9zPXA7fQogICAgICAgICAgICAgICAgaWYoY2g9PSJfIil7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHN0cmVhbS5wb3M9PTEpewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHN1ZmZpeChzdHJlYW0sIDYpPT0iX0VORF9fIil7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5DaGFpbihzdHJlYW0sc3RhdGUsWydcMCddLCJjb21tZW50Iik7fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoc3VmZml4KHN0cmVhbSwgNyk9PSJfREFUQV9fIil7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5DaGFpbihzdHJlYW0sc3RhdGUsWydcMCddLCJ2YXJpYWJsZS0yIik7fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoc3VmZml4KHN0cmVhbSwgNyk9PSJfQ19fIil7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW5DaGFpbihzdHJlYW0sc3RhdGUsWydcMCddLCJzdHJpbmciKTt9fX0KICAgICAgICAgICAgICAgIGlmKC9cdy8udGVzdChjaCkpewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcD1zdHJlYW0ucG9zOwogICAgICAgICAgICAgICAgICAgICAgICBpZihsb29rKHN0cmVhbSwgLTIpPT0ieyImJihsb29rKHN0cmVhbSwgMCk9PSJ9Inx8c3RyZWFtLmVhdFdoaWxlKC9cdy8pJiZsb29rKHN0cmVhbSwgMCk9PSJ9IikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLnBvcz1wO30KICAgICAgICAgICAgICAgIGlmKC9bQS1aXS8udGVzdChjaCkpewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbD1sb29rKHN0cmVhbSwgLTIpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcD1zdHJlYW0ucG9zOwogICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1tBLVpfXS8pOwogICAgICAgICAgICAgICAgICAgICAgICBpZigvW1xkYS16XS8udGVzdChsb29rKHN0cmVhbSwgMCkpKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0ucG9zPXA7fQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjPVBFUkxbc3RyZWFtLmN1cnJlbnQoKV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIWMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIm1ldGEiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGNbMV0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjPWNbMF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobCE9IjoiKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGM9PTEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAia2V5d29yZCI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKGM9PTIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiZGVmIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoYz09MykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJhdG9tIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYoYz09NCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJvcGVyYXRvciI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKGM9PTUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAidmFyaWFibGUtMiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAibWV0YSI7fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAibWV0YSI7fX0KICAgICAgICAgICAgICAgIGlmKC9bYS16QS1aX10vLnRlc3QoY2gpKXsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGw9bG9vayhzdHJlYW0sIC0yKTsKICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLmVhdFdoaWxlKC9cdy8pOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYz1QRVJMW3N0cmVhbS5jdXJyZW50KCldOwogICAgICAgICAgICAgICAgICAgICAgICBpZighYykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIm1ldGEiOwogICAgICAgICAgICAgICAgICAgICAgICBpZihjWzFdKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGM9Y1swXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYobCE9IjoiKXsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihjPT0xKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJrZXl3b3JkIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKGM9PTIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImRlZiI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZihjPT0zKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJhdG9tIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKGM9PTQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIm9wZXJhdG9yIjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmKGM9PTUpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gInZhcmlhYmxlLTIiOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAibWV0YSI7fQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJtZXRhIjt9CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDt9CgogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICB0b2tlbml6ZTogdG9rZW5QZXJsLAogICAgICAgICAgICAgICAgICAgIGNoYWluOiBudWxsLAogICAgICAgICAgICAgICAgICAgIHN0eWxlOiBudWxsLAogICAgICAgICAgICAgICAgICAgIHRhaWw6IG51bGwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKHN0YXRlLnRva2VuaXplIHx8IHRva2VuUGVybCkoc3RyZWFtLCBzdGF0ZSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGxpbmVDb21tZW50OiAnIycKICAgICAgICB9Owp9KTsKCkNvZGVNaXJyb3IucmVnaXN0ZXJIZWxwZXIoIndvcmRDaGFycyIsICJwZXJsIiwgL1tcdyRdLyk7CgpDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveC1wZXJsIiwgInBlcmwiKTsKCi8vIGl0J3MgbGlrZSAicGVlayIsIGJ1dCBuZWVkIGZvciBsb29rLWFoZWFkIG9yIGxvb2stYmVoaW5kIGlmIGluZGV4IDwgMApmdW5jdGlvbiBsb29rKHN0cmVhbSwgYyl7CiAgcmV0dXJuIHN0cmVhbS5zdHJpbmcuY2hhckF0KHN0cmVhbS5wb3MrKGN8fDApKTsKfQoKLy8gcmV0dXJuIGEgcGFydCBvZiBwcmVmaXggb2YgY3VycmVudCBzdHJlYW0gZnJvbSBjdXJyZW50IHBvc2l0aW9uCmZ1bmN0aW9uIHByZWZpeChzdHJlYW0sIGMpewogIGlmKGMpewogICAgdmFyIHg9c3RyZWFtLnBvcy1jOwogICAgcmV0dXJuIHN0cmVhbS5zdHJpbmcuc3Vic3RyKCh4Pj0wP3g6MCksYyk7fQogIGVsc2V7CiAgICByZXR1cm4gc3RyZWFtLnN0cmluZy5zdWJzdHIoMCxzdHJlYW0ucG9zLTEpOwogIH0KfQoKLy8gcmV0dXJuIGEgcGFydCBvZiBzdWZmaXggb2YgY3VycmVudCBzdHJlYW0gZnJvbSBjdXJyZW50IHBvc2l0aW9uCmZ1bmN0aW9uIHN1ZmZpeChzdHJlYW0sIGMpewogIHZhciB5PXN0cmVhbS5zdHJpbmcubGVuZ3RoOwogIHZhciB4PXktc3RyZWFtLnBvcysxOwogIHJldHVybiBzdHJlYW0uc3RyaW5nLnN1YnN0cihzdHJlYW0ucG9zLChjJiZjPHk/Yzp4KSk7Cn0KCi8vIGVhdGluZyBhbmQgdm9taXRpbmcgYSBwYXJ0IG9mIHN0cmVhbSBmcm9tIGN1cnJlbnQgcG9zaXRpb24KZnVuY3Rpb24gZWF0U3VmZml4KHN0cmVhbSwgYyl7CiAgdmFyIHg9c3RyZWFtLnBvcytjOwogIHZhciB5OwogIGlmKHg8PTApCiAgICBzdHJlYW0ucG9zPTA7CiAgZWxzZSBpZih4Pj0oeT1zdHJlYW0uc3RyaW5nLmxlbmd0aC0xKSkKICAgIHN0cmVhbS5wb3M9eTsKICBlbHNlCiAgICBzdHJlYW0ucG9zPXg7Cn0KCn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/php/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/php/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogUEhQIG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vLi4vYWRkb24vZWRpdC9tYXRjaGJyYWNrZXRzLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL2h0bWxtaXhlZC9odG1sbWl4ZWQuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4veG1sL3htbC5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9qYXZhc2NyaXB0L2phdmFzY3JpcHQuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vY3NzL2Nzcy5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9jbGlrZS9jbGlrZS5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJwaHAuanMiPjwvc2NyaXB0Pgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPi5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazt9PC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aDE+Q29kZU1pcnJvcjwvaDE+PGltZyBpZD1sb2dvIHNyYz0iLi4vLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+TGFuZ3VhZ2UgbW9kZXM8L2E+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPlBIUDwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+UEhQIG1vZGU8L2gyPgo8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgo8P3BocAokYSA9IGFycmF5KCdhJyA9PiAxLCAnYicgPT4gMiwgMyA9PiAnYycpOwoKZWNobyAiJGFbYV0gJHthWzNdIC8qIH0gY29tbWVudCAqL30geyRhW2JdfSBcJGFbYV0iOwoKZnVuY3Rpb24gaGVsbG8oJHdobykgewoJcmV0dXJuICJIZWxsbyAkd2hvISI7Cn0KPz4KPHA+VGhlIHByb2dyYW0gc2F5cyA8Pz0gaGVsbG8oIldvcmxkIikgPz4uPC9wPgo8c2NyaXB0PgoJYWxlcnQoIkFuZCBoZXJlIGlzIHNvbWUgSlMgY29kZSIpOyAvLyBhbHNvIGNvbG9yZWQKPC9zY3JpcHQ+CjwvdGV4dGFyZWE+PC9mb3JtPgoKICAgIDxzY3JpcHQ+CiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICAgICAgbGluZU51bWJlcnM6IHRydWUsCiAgICAgICAgbWF0Y2hCcmFja2V0czogdHJ1ZSwKICAgICAgICBtb2RlOiAiYXBwbGljYXRpb24veC1odHRwZC1waHAiLAogICAgICAgIGluZGVudFVuaXQ6IDQsCiAgICAgICAgaW5kZW50V2l0aFRhYnM6IHRydWUKICAgICAgfSk7CiAgICA8L3NjcmlwdD4KCiAgICA8cD5TaW1wbGUgSFRNTC9QSFAgbW9kZSBiYXNlZCBvbgogICAgdGhlIDxhIGhyZWY9Ii4uL2NsaWtlLyI+Qy1saWtlPC9hPiBtb2RlLiBEZXBlbmRzIG9uIFhNTCwKICAgIEphdmFTY3JpcHQsIENTUywgSFRNTE1peGVkLCBhbmQgQy1saWtlIG1vZGVzLjwvcD4KCiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+YXBwbGljYXRpb24veC1odHRwZC1waHA8L2NvZGU+IChIVE1MIHdpdGggUEhQIGNvZGUpLCA8Y29kZT50ZXh0L3gtcGhwPC9jb2RlPiAocGxhaW4sIG5vbi13cmFwcGVkIFBIUCBjb2RlKS48L3A+CiAgPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/php/php.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSwgcmVxdWlyZSgiLi4vaHRtbG1peGVkL2h0bWxtaXhlZCIpLCByZXF1aXJlKCIuLi9jbGlrZS9jbGlrZSIpKTsKICBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCkgLy8gQU1ECiAgICBkZWZpbmUoWyIuLi8uLi9saWIvY29kZW1pcnJvciIsICIuLi9odG1sbWl4ZWQvaHRtbG1peGVkIiwgIi4uL2NsaWtlL2NsaWtlIl0sIG1vZCk7CiAgZWxzZSAvLyBQbGFpbiBicm93c2VyIGVudgogICAgbW9kKENvZGVNaXJyb3IpOwp9KShmdW5jdGlvbihDb2RlTWlycm9yKSB7CiAgInVzZSBzdHJpY3QiOwoKICBmdW5jdGlvbiBrZXl3b3JkcyhzdHIpIHsKICAgIHZhciBvYmogPSB7fSwgd29yZHMgPSBzdHIuc3BsaXQoIiAiKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgd29yZHMubGVuZ3RoOyArK2kpIG9ialt3b3Jkc1tpXV0gPSB0cnVlOwogICAgcmV0dXJuIG9iajsKICB9CgogIC8vIEhlbHBlciBmb3IgcGhwU3RyaW5nCiAgZnVuY3Rpb24gbWF0Y2hTZXF1ZW5jZShsaXN0LCBlbmQsIGVzY2FwZXMpIHsKICAgIGlmIChsaXN0Lmxlbmd0aCA9PSAwKSByZXR1cm4gcGhwU3RyaW5nKGVuZCk7CiAgICByZXR1cm4gZnVuY3Rpb24gKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgdmFyIHBhdHRlcm5zID0gbGlzdFswXTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwYXR0ZXJucy5sZW5ndGg7IGkrKykgaWYgKHN0cmVhbS5tYXRjaChwYXR0ZXJuc1tpXVswXSkpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IG1hdGNoU2VxdWVuY2UobGlzdC5zbGljZSgxKSwgZW5kKTsKICAgICAgICByZXR1cm4gcGF0dGVybnNbaV1bMV07CiAgICAgIH0KICAgICAgc3RhdGUudG9rZW5pemUgPSBwaHBTdHJpbmcoZW5kLCBlc2NhcGVzKTsKICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgfTsKICB9CiAgZnVuY3Rpb24gcGhwU3RyaW5nKGNsb3NpbmcsIGVzY2FwZXMpIHsKICAgIHJldHVybiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7IHJldHVybiBwaHBTdHJpbmdfKHN0cmVhbSwgc3RhdGUsIGNsb3NpbmcsIGVzY2FwZXMpOyB9OwogIH0KICBmdW5jdGlvbiBwaHBTdHJpbmdfKHN0cmVhbSwgc3RhdGUsIGNsb3NpbmcsIGVzY2FwZXMpIHsKICAgIC8vICJDb21wbGV4IiBzeW50YXgKICAgIGlmIChlc2NhcGVzICE9PSBmYWxzZSAmJiBzdHJlYW0ubWF0Y2goIiR7IiwgZmFsc2UpIHx8IHN0cmVhbS5tYXRjaCgieyQiLCBmYWxzZSkpIHsKICAgICAgc3RhdGUudG9rZW5pemUgPSBudWxsOwogICAgICByZXR1cm4gInN0cmluZyI7CiAgICB9CgogICAgLy8gU2ltcGxlIHN5bnRheAogICAgaWYgKGVzY2FwZXMgIT09IGZhbHNlICYmIHN0cmVhbS5tYXRjaCgvXlwkW2EtekEtWl9dW2EtekEtWjAtOV9dKi8pKSB7CiAgICAgIC8vIEFmdGVyIHRoZSB2YXJpYWJsZSBuYW1lIHRoZXJlIG1heSBhcHBlYXIgYXJyYXkgb3Igb2JqZWN0IG9wZXJhdG9yLgogICAgICBpZiAoc3RyZWFtLm1hdGNoKCJbIiwgZmFsc2UpKSB7CiAgICAgICAgLy8gTWF0Y2ggYXJyYXkgb3BlcmF0b3IKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IG1hdGNoU2VxdWVuY2UoWwogICAgICAgICAgW1siWyIsIG51bGxdXSwKICAgICAgICAgIFtbL1xkW1x3XC5dKi8sICJudW1iZXIiXSwKICAgICAgICAgICBbL1wkW2EtekEtWl9dW2EtekEtWjAtOV9dKi8sICJ2YXJpYWJsZS0yIl0sCiAgICAgICAgICAgWy9bXHdcJF0rLywgInZhcmlhYmxlIl1dLAogICAgICAgICAgW1siXSIsIG51bGxdXQogICAgICAgIF0sIGNsb3NpbmcsIGVzY2FwZXMpOwogICAgICB9CiAgICAgIGlmIChzdHJlYW0ubWF0Y2goL1wtXD5cdy8sIGZhbHNlKSkgewogICAgICAgIC8vIE1hdGNoIG9iamVjdCBvcGVyYXRvcgogICAgICAgIHN0YXRlLnRva2VuaXplID0gbWF0Y2hTZXF1ZW5jZShbCiAgICAgICAgICBbWyItPiIsIG51bGxdXSwKICAgICAgICAgIFtbL1tcd10rLywgInZhcmlhYmxlIl1dCiAgICAgICAgXSwgY2xvc2luZywgZXNjYXBlcyk7CiAgICAgIH0KICAgICAgcmV0dXJuICJ2YXJpYWJsZS0yIjsKICAgIH0KCiAgICB2YXIgZXNjYXBlZCA9IGZhbHNlOwogICAgLy8gTm9ybWFsIHN0cmluZwogICAgd2hpbGUgKCFzdHJlYW0uZW9sKCkgJiYKICAgICAgICAgICAoZXNjYXBlZCB8fCBlc2NhcGVzID09PSBmYWxzZSB8fAogICAgICAgICAgICAoIXN0cmVhbS5tYXRjaCgieyQiLCBmYWxzZSkgJiYKICAgICAgICAgICAgICFzdHJlYW0ubWF0Y2goL14oXCRbYS16QS1aX11bYS16QS1aMC05X10qfFwkXHspLywgZmFsc2UpKSkpIHsKICAgICAgaWYgKCFlc2NhcGVkICYmIHN0cmVhbS5tYXRjaChjbG9zaW5nKSkgewogICAgICAgIHN0YXRlLnRva2VuaXplID0gbnVsbDsKICAgICAgICBzdGF0ZS50b2tTdGFjay5wb3AoKTsgc3RhdGUudG9rU3RhY2sucG9wKCk7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgZXNjYXBlZCA9IHN0cmVhbS5uZXh0KCkgPT0gIlxcIiAmJiAhZXNjYXBlZDsKICAgIH0KICAgIHJldHVybiAic3RyaW5nIjsKICB9CgogIHZhciBwaHBLZXl3b3JkcyA9ICJhYnN0cmFjdCBhbmQgYXJyYXkgYXMgYnJlYWsgY2FzZSBjYXRjaCBjbGFzcyBjbG9uZSBjb25zdCBjb250aW51ZSBkZWNsYXJlIGRlZmF1bHQgIiArCiAgICAiZG8gZWxzZSBlbHNlaWYgZW5kZGVjbGFyZSBlbmRmb3IgZW5kZm9yZWFjaCBlbmRpZiBlbmRzd2l0Y2ggZW5kd2hpbGUgZXh0ZW5kcyBmaW5hbCAiICsKICAgICJmb3IgZm9yZWFjaCBmdW5jdGlvbiBnbG9iYWwgZ290byBpZiBpbXBsZW1lbnRzIGludGVyZmFjZSBpbnN0YW5jZW9mIG5hbWVzcGFjZSAiICsKICAgICJuZXcgb3IgcHJpdmF0ZSBwcm90ZWN0ZWQgcHVibGljIHN0YXRpYyBzd2l0Y2ggdGhyb3cgdHJhaXQgdHJ5IHVzZSB2YXIgd2hpbGUgeG9yICIgKwogICAgImRpZSBlY2hvIGVtcHR5IGV4aXQgZXZhbCBpbmNsdWRlIGluY2x1ZGVfb25jZSBpc3NldCBsaXN0IHJlcXVpcmUgcmVxdWlyZV9vbmNlIHJldHVybiAiICsKICAgICJwcmludCB1bnNldCBfX2hhbHRfY29tcGlsZXIgc2VsZiBzdGF0aWMgcGFyZW50IHlpZWxkIGluc3RlYWRvZiBmaW5hbGx5IjsKICB2YXIgcGhwQXRvbXMgPSAidHJ1ZSBmYWxzZSBudWxsIFRSVUUgRkFMU0UgTlVMTCBfX0NMQVNTX18gX19ESVJfXyBfX0ZJTEVfXyBfX0xJTkVfXyBfX01FVEhPRF9fIF9fRlVOQ1RJT05fXyBfX05BTUVTUEFDRV9fIF9fVFJBSVRfXyI7CiAgdmFyIHBocEJ1aWx0aW4gPSAiZnVuY19udW1fYXJncyBmdW5jX2dldF9hcmcgZnVuY19nZXRfYXJncyBzdHJsZW4gc3RyY21wIHN0cm5jbXAgc3RyY2FzZWNtcCBzdHJuY2FzZWNtcCBlYWNoIGVycm9yX3JlcG9ydGluZyBkZWZpbmUgZGVmaW5lZCB0cmlnZ2VyX2Vycm9yIHVzZXJfZXJyb3Igc2V0X2Vycm9yX2hhbmRsZXIgcmVzdG9yZV9lcnJvcl9oYW5kbGVyIGdldF9kZWNsYXJlZF9jbGFzc2VzIGdldF9sb2FkZWRfZXh0ZW5zaW9ucyBleHRlbnNpb25fbG9hZGVkIGdldF9leHRlbnNpb25fZnVuY3MgZGVidWdfYmFja3RyYWNlIGNvbnN0YW50IGJpbjJoZXggaGV4MmJpbiBzbGVlcCB1c2xlZXAgdGltZSBta3RpbWUgZ21ta3RpbWUgc3RyZnRpbWUgZ21zdHJmdGltZSBzdHJ0b3RpbWUgZGF0ZSBnbWRhdGUgZ2V0ZGF0ZSBsb2NhbHRpbWUgY2hlY2tkYXRlIGZsdXNoIHdvcmR3cmFwIGh0bWxzcGVjaWFsY2hhcnMgaHRtbGVudGl0aWVzIGh0bWxfZW50aXR5X2RlY29kZSBtZDUgbWQ1X2ZpbGUgY3JjMzIgZ2V0aW1hZ2VzaXplIGltYWdlX3R5cGVfdG9fbWltZV90eXBlIHBocGluZm8gcGhwdmVyc2lvbiBwaHBjcmVkaXRzIHN0cm5hdGNtcCBzdHJuYXRjYXNlY21wIHN1YnN0cl9jb3VudCBzdHJzcG4gc3RyY3NwbiBzdHJ0b2sgc3RydG91cHBlciBzdHJ0b2xvd2VyIHN0cnBvcyBzdHJycG9zIHN0cnJldiBoZWJyZXYgaGVicmV2YyBubDJiciBiYXNlbmFtZSBkaXJuYW1lIHBhdGhpbmZvIHN0cmlwc2xhc2hlcyBzdHJpcGNzbGFzaGVzIHN0cnN0ciBzdHJpc3RyIHN0cnJjaHIgc3RyX3NodWZmbGUgc3RyX3dvcmRfY291bnQgc3RyY29sbCBzdWJzdHIgc3Vic3RyX3JlcGxhY2UgcXVvdGVtZXRhIHVjZmlyc3QgdWN3b3JkcyBzdHJ0ciBhZGRzbGFzaGVzIGFkZGNzbGFzaGVzIHJ0cmltIHN0cl9yZXBsYWNlIHN0cl9yZXBlYXQgY291bnRfY2hhcnMgY2h1bmtfc3BsaXQgdHJpbSBsdHJpbSBzdHJpcF90YWdzIHNpbWlsYXJfdGV4dCBleHBsb2RlIGltcGxvZGUgc2V0bG9jYWxlIGxvY2FsZWNvbnYgcGFyc2Vfc3RyIHN0cl9wYWQgY2hvcCBzdHJjaHIgc3ByaW50ZiBwcmludGYgdnByaW50ZiB2c3ByaW50ZiBzc2NhbmYgZnNjYW5mIHBhcnNlX3VybCB1cmxlbmNvZGUgdXJsZGVjb2RlIHJhd3VybGVuY29kZSByYXd1cmxkZWNvZGUgcmVhZGxpbmsgbGlua2luZm8gbGluayB1bmxpbmsgZXhlYyBzeXN0ZW0gZXNjYXBlc2hlbGxjbWQgZXNjYXBlc2hlbGxhcmcgcGFzc3RocnUgc2hlbGxfZXhlYyBwcm9jX29wZW4gcHJvY19jbG9zZSByYW5kIHNyYW5kIGdldHJhbmRtYXggbXRfcmFuZCBtdF9zcmFuZCBtdF9nZXRyYW5kbWF4IGJhc2U2NF9kZWNvZGUgYmFzZTY0X2VuY29kZSBhYnMgY2VpbCBmbG9vciByb3VuZCBpc19maW5pdGUgaXNfbmFuIGlzX2luZmluaXRlIGJpbmRlYyBoZXhkZWMgb2N0ZGVjIGRlY2JpbiBkZWNvY3QgZGVjaGV4IGJhc2VfY29udmVydCBudW1iZXJfZm9ybWF0IGZtb2QgaXAybG9uZyBsb25nMmlwIGdldGVudiBwdXRlbnYgZ2V0b3B0IG1pY3JvdGltZSBnZXR0aW1lb2ZkYXkgZ2V0cnVzYWdlIHVuaXFpZCBxdW90ZWRfcHJpbnRhYmxlX2RlY29kZSBzZXRfdGltZV9saW1pdCBnZXRfY2ZnX3ZhciBtYWdpY19xdW90ZXNfcnVudGltZSBzZXRfbWFnaWNfcXVvdGVzX3J1bnRpbWUgZ2V0X21hZ2ljX3F1b3Rlc19ncGMgZ2V0X21hZ2ljX3F1b3Rlc19ydW50aW1lIGltcG9ydF9yZXF1ZXN0X3ZhcmlhYmxlcyBlcnJvcl9sb2cgc2VyaWFsaXplIHVuc2VyaWFsaXplIG1lbW9yeV9nZXRfdXNhZ2UgdmFyX2R1bXAgdmFyX2V4cG9ydCBkZWJ1Z196dmFsX2R1bXAgcHJpbnRfciBoaWdobGlnaHRfZmlsZSBzaG93X3NvdXJjZSBoaWdobGlnaHRfc3RyaW5nIGluaV9nZXQgaW5pX2dldF9hbGwgaW5pX3NldCBpbmlfYWx0ZXIgaW5pX3Jlc3RvcmUgZ2V0X2luY2x1ZGVfcGF0aCBzZXRfaW5jbHVkZV9wYXRoIHJlc3RvcmVfaW5jbHVkZV9wYXRoIHNldGNvb2tpZSBoZWFkZXIgaGVhZGVyc19zZW50IGNvbm5lY3Rpb25fYWJvcnRlZCBjb25uZWN0aW9uX3N0YXR1cyBpZ25vcmVfdXNlcl9hYm9ydCBwYXJzZV9pbmlfZmlsZSBpc191cGxvYWRlZF9maWxlIG1vdmVfdXBsb2FkZWRfZmlsZSBpbnR2YWwgZmxvYXR2YWwgZG91YmxldmFsIHN0cnZhbCBnZXR0eXBlIHNldHR5cGUgaXNfbnVsbCBpc19yZXNvdXJjZSBpc19ib29sIGlzX2xvbmcgaXNfZmxvYXQgaXNfaW50IGlzX2ludGVnZXIgaXNfZG91YmxlIGlzX3JlYWwgaXNfbnVtZXJpYyBpc19zdHJpbmcgaXNfYXJyYXkgaXNfb2JqZWN0IGlzX3NjYWxhciBlcmVnIGVyZWdfcmVwbGFjZSBlcmVnaSBlcmVnaV9yZXBsYWNlIHNwbGl0IHNwbGl0aSBqb2luIHNxbF9yZWdjYXNlIGRsIHBjbG9zZSBwb3BlbiByZWFkZmlsZSByZXdpbmQgcm1kaXIgdW1hc2sgZmNsb3NlIGZlb2YgZmdldGMgZmdldHMgZmdldHNzIGZyZWFkIGZvcGVuIGZwYXNzdGhydSBmdHJ1bmNhdGUgZnN0YXQgZnNlZWsgZnRlbGwgZmZsdXNoIGZ3cml0ZSBmcHV0cyBta2RpciByZW5hbWUgY29weSB0ZW1wbmFtIHRtcGZpbGUgZmlsZSBmaWxlX2dldF9jb250ZW50cyBmaWxlX3B1dF9jb250ZW50cyBzdHJlYW1fc2VsZWN0IHN0cmVhbV9jb250ZXh0X2NyZWF0ZSBzdHJlYW1fY29udGV4dF9zZXRfcGFyYW1zIHN0cmVhbV9jb250ZXh0X3NldF9vcHRpb24gc3RyZWFtX2NvbnRleHRfZ2V0X29wdGlvbnMgc3RyZWFtX2ZpbHRlcl9wcmVwZW5kIHN0cmVhbV9maWx0ZXJfYXBwZW5kIGZnZXRjc3YgZmxvY2sgZ2V0X21ldGFfdGFncyBzdHJlYW1fc2V0X3dyaXRlX2J1ZmZlciBzZXRfZmlsZV9idWZmZXIgc2V0X3NvY2tldF9ibG9ja2luZyBzdHJlYW1fc2V0X2Jsb2NraW5nIHNvY2tldF9zZXRfYmxvY2tpbmcgc3RyZWFtX2dldF9tZXRhX2RhdGEgc3RyZWFtX3JlZ2lzdGVyX3dyYXBwZXIgc3RyZWFtX3dyYXBwZXJfcmVnaXN0ZXIgc3RyZWFtX3NldF90aW1lb3V0IHNvY2tldF9zZXRfdGltZW91dCBzb2NrZXRfZ2V0X3N0YXR1cyByZWFscGF0aCBmbm1hdGNoIGZzb2Nrb3BlbiBwZnNvY2tvcGVuIHBhY2sgdW5wYWNrIGdldF9icm93c2VyIGNyeXB0IG9wZW5kaXIgY2xvc2VkaXIgY2hkaXIgZ2V0Y3dkIHJld2luZGRpciByZWFkZGlyIGRpciBnbG9iIGZpbGVhdGltZSBmaWxlY3RpbWUgZmlsZWdyb3VwIGZpbGVpbm9kZSBmaWxlbXRpbWUgZmlsZW93bmVyIGZpbGVwZXJtcyBmaWxlc2l6ZSBmaWxldHlwZSBmaWxlX2V4aXN0cyBpc193cml0YWJsZSBpc193cml0ZWFibGUgaXNfcmVhZGFibGUgaXNfZXhlY3V0YWJsZSBpc19maWxlIGlzX2RpciBpc19saW5rIHN0YXQgbHN0YXQgY2hvd24gdG91Y2ggY2xlYXJzdGF0Y2FjaGUgbWFpbCBvYl9zdGFydCBvYl9mbHVzaCBvYl9jbGVhbiBvYl9lbmRfZmx1c2ggb2JfZW5kX2NsZWFuIG9iX2dldF9mbHVzaCBvYl9nZXRfY2xlYW4gb2JfZ2V0X2xlbmd0aCBvYl9nZXRfbGV2ZWwgb2JfZ2V0X3N0YXR1cyBvYl9nZXRfY29udGVudHMgb2JfaW1wbGljaXRfZmx1c2ggb2JfbGlzdF9oYW5kbGVycyBrc29ydCBrcnNvcnQgbmF0c29ydCBuYXRjYXNlc29ydCBhc29ydCBhcnNvcnQgc29ydCByc29ydCB1c29ydCB1YXNvcnQgdWtzb3J0IHNodWZmbGUgYXJyYXlfd2FsayBjb3VudCBlbmQgcHJldiBuZXh0IHJlc2V0IGN1cnJlbnQga2V5IG1pbiBtYXggaW5fYXJyYXkgYXJyYXlfc2VhcmNoIGV4dHJhY3QgY29tcGFjdCBhcnJheV9maWxsIHJhbmdlIGFycmF5X211bHRpc29ydCBhcnJheV9wdXNoIGFycmF5X3BvcCBhcnJheV9zaGlmdCBhcnJheV91bnNoaWZ0IGFycmF5X3NwbGljZSBhcnJheV9zbGljZSBhcnJheV9tZXJnZSBhcnJheV9tZXJnZV9yZWN1cnNpdmUgYXJyYXlfa2V5cyBhcnJheV92YWx1ZXMgYXJyYXlfY291bnRfdmFsdWVzIGFycmF5X3JldmVyc2UgYXJyYXlfcmVkdWNlIGFycmF5X3BhZCBhcnJheV9mbGlwIGFycmF5X2NoYW5nZV9rZXlfY2FzZSBhcnJheV9yYW5kIGFycmF5X3VuaXF1ZSBhcnJheV9pbnRlcnNlY3QgYXJyYXlfaW50ZXJzZWN0X2Fzc29jIGFycmF5X2RpZmYgYXJyYXlfZGlmZl9hc3NvYyBhcnJheV9zdW0gYXJyYXlfZmlsdGVyIGFycmF5X21hcCBhcnJheV9jaHVuayBhcnJheV9rZXlfZXhpc3RzIGFycmF5X2ludGVyc2VjdF9rZXkgYXJyYXlfY29tYmluZSBhcnJheV9jb2x1bW4gcG9zIHNpemVvZiBrZXlfZXhpc3RzIGFzc2VydCBhc3NlcnRfb3B0aW9ucyB2ZXJzaW9uX2NvbXBhcmUgZnRvayBzdHJfcm90MTMgYWdncmVnYXRlIHNlc3Npb25fbmFtZSBzZXNzaW9uX21vZHVsZV9uYW1lIHNlc3Npb25fc2F2ZV9wYXRoIHNlc3Npb25faWQgc2Vzc2lvbl9yZWdlbmVyYXRlX2lkIHNlc3Npb25fZGVjb2RlIHNlc3Npb25fcmVnaXN0ZXIgc2Vzc2lvbl91bnJlZ2lzdGVyIHNlc3Npb25faXNfcmVnaXN0ZXJlZCBzZXNzaW9uX2VuY29kZSBzZXNzaW9uX3N0YXJ0IHNlc3Npb25fZGVzdHJveSBzZXNzaW9uX3Vuc2V0IHNlc3Npb25fc2V0X3NhdmVfaGFuZGxlciBzZXNzaW9uX2NhY2hlX2xpbWl0ZXIgc2Vzc2lvbl9jYWNoZV9leHBpcmUgc2Vzc2lvbl9zZXRfY29va2llX3BhcmFtcyBzZXNzaW9uX2dldF9jb29raWVfcGFyYW1zIHNlc3Npb25fd3JpdGVfY2xvc2UgcHJlZ19tYXRjaCBwcmVnX21hdGNoX2FsbCBwcmVnX3JlcGxhY2UgcHJlZ19yZXBsYWNlX2NhbGxiYWNrIHByZWdfc3BsaXQgcHJlZ19xdW90ZSBwcmVnX2dyZXAgb3ZlcmxvYWQgY3R5cGVfYWxudW0gY3R5cGVfYWxwaGEgY3R5cGVfY250cmwgY3R5cGVfZGlnaXQgY3R5cGVfbG93ZXIgY3R5cGVfZ3JhcGggY3R5cGVfcHJpbnQgY3R5cGVfcHVuY3QgY3R5cGVfc3BhY2UgY3R5cGVfdXBwZXIgY3R5cGVfeGRpZ2l0IHZpcnR1YWwgYXBhY2hlX3JlcXVlc3RfaGVhZGVycyBhcGFjaGVfbm90ZSBhcGFjaGVfbG9va3VwX3VyaSBhcGFjaGVfY2hpbGRfdGVybWluYXRlIGFwYWNoZV9zZXRlbnYgYXBhY2hlX3Jlc3BvbnNlX2hlYWRlcnMgYXBhY2hlX2dldF92ZXJzaW9uIGdldGFsbGhlYWRlcnMgbXlzcWxfY29ubmVjdCBteXNxbF9wY29ubmVjdCBteXNxbF9jbG9zZSBteXNxbF9zZWxlY3RfZGIgbXlzcWxfY3JlYXRlX2RiIG15c3FsX2Ryb3BfZGIgbXlzcWxfcXVlcnkgbXlzcWxfdW5idWZmZXJlZF9xdWVyeSBteXNxbF9kYl9xdWVyeSBteXNxbF9saXN0X2RicyBteXNxbF9saXN0X3RhYmxlcyBteXNxbF9saXN0X2ZpZWxkcyBteXNxbF9saXN0X3Byb2Nlc3NlcyBteXNxbF9lcnJvciBteXNxbF9lcnJubyBteXNxbF9hZmZlY3RlZF9yb3dzIG15c3FsX2luc2VydF9pZCBteXNxbF9yZXN1bHQgbXlzcWxfbnVtX3Jvd3MgbXlzcWxfbnVtX2ZpZWxkcyBteXNxbF9mZXRjaF9yb3cgbXlzcWxfZmV0Y2hfYXJyYXkgbXlzcWxfZmV0Y2hfYXNzb2MgbXlzcWxfZmV0Y2hfb2JqZWN0IG15c3FsX2RhdGFfc2VlayBteXNxbF9mZXRjaF9sZW5ndGhzIG15c3FsX2ZldGNoX2ZpZWxkIG15c3FsX2ZpZWxkX3NlZWsgbXlzcWxfZnJlZV9yZXN1bHQgbXlzcWxfZmllbGRfbmFtZSBteXNxbF9maWVsZF90YWJsZSBteXNxbF9maWVsZF9sZW4gbXlzcWxfZmllbGRfdHlwZSBteXNxbF9maWVsZF9mbGFncyBteXNxbF9lc2NhcGVfc3RyaW5nIG15c3FsX3JlYWxfZXNjYXBlX3N0cmluZyBteXNxbF9zdGF0IG15c3FsX3RocmVhZF9pZCBteXNxbF9jbGllbnRfZW5jb2RpbmcgbXlzcWxfZ2V0X2NsaWVudF9pbmZvIG15c3FsX2dldF9ob3N0X2luZm8gbXlzcWxfZ2V0X3Byb3RvX2luZm8gbXlzcWxfZ2V0X3NlcnZlcl9pbmZvIG15c3FsX2luZm8gbXlzcWwgbXlzcWxfZmllbGRuYW1lIG15c3FsX2ZpZWxkdGFibGUgbXlzcWxfZmllbGRsZW4gbXlzcWxfZmllbGR0eXBlIG15c3FsX2ZpZWxkZmxhZ3MgbXlzcWxfc2VsZWN0ZGIgbXlzcWxfY3JlYXRlZGIgbXlzcWxfZHJvcGRiIG15c3FsX2ZyZWVyZXN1bHQgbXlzcWxfbnVtZmllbGRzIG15c3FsX251bXJvd3MgbXlzcWxfbGlzdGRicyBteXNxbF9saXN0dGFibGVzIG15c3FsX2xpc3RmaWVsZHMgbXlzcWxfZGJfbmFtZSBteXNxbF9kYm5hbWUgbXlzcWxfdGFibGVuYW1lIG15c3FsX3RhYmxlX25hbWUgcGdfY29ubmVjdCBwZ19wY29ubmVjdCBwZ19jbG9zZSBwZ19jb25uZWN0aW9uX3N0YXR1cyBwZ19jb25uZWN0aW9uX2J1c3kgcGdfY29ubmVjdGlvbl9yZXNldCBwZ19ob3N0IHBnX2RibmFtZSBwZ19wb3J0IHBnX3R0eSBwZ19vcHRpb25zIHBnX3BpbmcgcGdfcXVlcnkgcGdfc2VuZF9xdWVyeSBwZ19jYW5jZWxfcXVlcnkgcGdfZmV0Y2hfcmVzdWx0IHBnX2ZldGNoX3JvdyBwZ19mZXRjaF9hc3NvYyBwZ19mZXRjaF9hcnJheSBwZ19mZXRjaF9vYmplY3QgcGdfZmV0Y2hfYWxsIHBnX2FmZmVjdGVkX3Jvd3MgcGdfZ2V0X3Jlc3VsdCBwZ19yZXN1bHRfc2VlayBwZ19yZXN1bHRfc3RhdHVzIHBnX2ZyZWVfcmVzdWx0IHBnX2xhc3Rfb2lkIHBnX251bV9yb3dzIHBnX251bV9maWVsZHMgcGdfZmllbGRfbmFtZSBwZ19maWVsZF9udW0gcGdfZmllbGRfc2l6ZSBwZ19maWVsZF90eXBlIHBnX2ZpZWxkX3BydGxlbiBwZ19maWVsZF9pc19udWxsIHBnX2dldF9ub3RpZnkgcGdfZ2V0X3BpZCBwZ19yZXN1bHRfZXJyb3IgcGdfbGFzdF9lcnJvciBwZ19sYXN0X25vdGljZSBwZ19wdXRfbGluZSBwZ19lbmRfY29weSBwZ19jb3B5X3RvIHBnX2NvcHlfZnJvbSBwZ190cmFjZSBwZ191bnRyYWNlIHBnX2xvX2NyZWF0ZSBwZ19sb191bmxpbmsgcGdfbG9fb3BlbiBwZ19sb19jbG9zZSBwZ19sb19yZWFkIHBnX2xvX3dyaXRlIHBnX2xvX3JlYWRfYWxsIHBnX2xvX2ltcG9ydCBwZ19sb19leHBvcnQgcGdfbG9fc2VlayBwZ19sb190ZWxsIHBnX2VzY2FwZV9zdHJpbmcgcGdfZXNjYXBlX2J5dGVhIHBnX3VuZXNjYXBlX2J5dGVhIHBnX2NsaWVudF9lbmNvZGluZyBwZ19zZXRfY2xpZW50X2VuY29kaW5nIHBnX21ldGFfZGF0YSBwZ19jb252ZXJ0IHBnX2luc2VydCBwZ191cGRhdGUgcGdfZGVsZXRlIHBnX3NlbGVjdCBwZ19leGVjIHBnX2dldGxhc3RvaWQgcGdfY21kdHVwbGVzIHBnX2Vycm9ybWVzc2FnZSBwZ19udW1yb3dzIHBnX251bWZpZWxkcyBwZ19maWVsZG5hbWUgcGdfZmllbGRzaXplIHBnX2ZpZWxkdHlwZSBwZ19maWVsZG51bSBwZ19maWVsZHBydGxlbiBwZ19maWVsZGlzbnVsbCBwZ19mcmVlcmVzdWx0IHBnX3Jlc3VsdCBwZ19sb3JlYWRhbGwgcGdfbG9jcmVhdGUgcGdfbG91bmxpbmsgcGdfbG9vcGVuIHBnX2xvY2xvc2UgcGdfbG9yZWFkIHBnX2xvd3JpdGUgcGdfbG9pbXBvcnQgcGdfbG9leHBvcnQgaHR0cF9yZXNwb25zZV9jb2RlIGdldF9kZWNsYXJlZF90cmFpdHMgZ2V0aW1hZ2VzaXplZnJvbXN0cmluZyBzb2NrZXRfaW1wb3J0X3N0cmVhbSBzdHJlYW1fc2V0X2NodW5rX3NpemUgdHJhaXRfZXhpc3RzIGhlYWRlcl9yZWdpc3Rlcl9jYWxsYmFjayBjbGFzc191c2VzIHNlc3Npb25fc3RhdHVzIHNlc3Npb25fcmVnaXN0ZXJfc2h1dGRvd24gZWNobyBwcmludCBnbG9iYWwgc3RhdGljIGV4aXQgYXJyYXkgZW1wdHkgZXZhbCBpc3NldCB1bnNldCBkaWUgaW5jbHVkZSByZXF1aXJlIGluY2x1ZGVfb25jZSByZXF1aXJlX29uY2UganNvbl9kZWNvZGUganNvbl9lbmNvZGUganNvbl9sYXN0X2Vycm9yIGpzb25fbGFzdF9lcnJvcl9tc2cgY3VybF9jbG9zZSBjdXJsX2NvcHlfaGFuZGxlIGN1cmxfZXJybm8gY3VybF9lcnJvciBjdXJsX2VzY2FwZSBjdXJsX2V4ZWMgY3VybF9maWxlX2NyZWF0ZSBjdXJsX2dldGluZm8gY3VybF9pbml0IGN1cmxfbXVsdGlfYWRkX2hhbmRsZSBjdXJsX211bHRpX2Nsb3NlIGN1cmxfbXVsdGlfZXhlYyBjdXJsX211bHRpX2dldGNvbnRlbnQgY3VybF9tdWx0aV9pbmZvX3JlYWQgY3VybF9tdWx0aV9pbml0IGN1cmxfbXVsdGlfcmVtb3ZlX2hhbmRsZSBjdXJsX211bHRpX3NlbGVjdCBjdXJsX211bHRpX3NldG9wdCBjdXJsX211bHRpX3N0cmVycm9yIGN1cmxfcGF1c2UgY3VybF9yZXNldCBjdXJsX3NldG9wdF9hcnJheSBjdXJsX3NldG9wdCBjdXJsX3NoYXJlX2Nsb3NlIGN1cmxfc2hhcmVfaW5pdCBjdXJsX3NoYXJlX3NldG9wdCBjdXJsX3N0cmVycm9yIGN1cmxfdW5lc2NhcGUgY3VybF92ZXJzaW9uIG15c3FsaV9hZmZlY3RlZF9yb3dzIG15c3FsaV9hdXRvY29tbWl0IG15c3FsaV9jaGFuZ2VfdXNlciBteXNxbGlfY2hhcmFjdGVyX3NldF9uYW1lIG15c3FsaV9jbG9zZSBteXNxbGlfY29tbWl0IG15c3FsaV9jb25uZWN0X2Vycm5vIG15c3FsaV9jb25uZWN0X2Vycm9yIG15c3FsaV9jb25uZWN0IG15c3FsaV9kYXRhX3NlZWsgbXlzcWxpX2RlYnVnIG15c3FsaV9kdW1wX2RlYnVnX2luZm8gbXlzcWxpX2Vycm5vIG15c3FsaV9lcnJvcl9saXN0IG15c3FsaV9lcnJvciBteXNxbGlfZmV0Y2hfYWxsIG15c3FsaV9mZXRjaF9hcnJheSBteXNxbGlfZmV0Y2hfYXNzb2MgbXlzcWxpX2ZldGNoX2ZpZWxkX2RpcmVjdCBteXNxbGlfZmV0Y2hfZmllbGQgbXlzcWxpX2ZldGNoX2ZpZWxkcyBteXNxbGlfZmV0Y2hfbGVuZ3RocyBteXNxbGlfZmV0Y2hfb2JqZWN0IG15c3FsaV9mZXRjaF9yb3cgbXlzcWxpX2ZpZWxkX2NvdW50IG15c3FsaV9maWVsZF9zZWVrIG15c3FsaV9maWVsZF90ZWxsIG15c3FsaV9mcmVlX3Jlc3VsdCBteXNxbGlfZ2V0X2NoYXJzZXQgbXlzcWxpX2dldF9jbGllbnRfaW5mbyBteXNxbGlfZ2V0X2NsaWVudF9zdGF0cyBteXNxbGlfZ2V0X2NsaWVudF92ZXJzaW9uIG15c3FsaV9nZXRfY29ubmVjdGlvbl9zdGF0cyBteXNxbGlfZ2V0X2hvc3RfaW5mbyBteXNxbGlfZ2V0X3Byb3RvX2luZm8gbXlzcWxpX2dldF9zZXJ2ZXJfaW5mbyBteXNxbGlfZ2V0X3NlcnZlcl92ZXJzaW9uIG15c3FsaV9pbmZvIG15c3FsaV9pbml0IG15c3FsaV9pbnNlcnRfaWQgbXlzcWxpX2tpbGwgbXlzcWxpX21vcmVfcmVzdWx0cyBteXNxbGlfbXVsdGlfcXVlcnkgbXlzcWxpX25leHRfcmVzdWx0IG15c3FsaV9udW1fZmllbGRzIG15c3FsaV9udW1fcm93cyBteXNxbGlfb3B0aW9ucyBteXNxbGlfcGluZyBteXNxbGlfcHJlcGFyZSBteXNxbGlfcXVlcnkgbXlzcWxpX3JlYWxfY29ubmVjdCBteXNxbGlfcmVhbF9lc2NhcGVfc3RyaW5nIG15c3FsaV9yZWFsX3F1ZXJ5IG15c3FsaV9yZWFwX2FzeW5jX3F1ZXJ5IG15c3FsaV9yZWZyZXNoIG15c3FsaV9yb2xsYmFjayBteXNxbGlfc2VsZWN0X2RiIG15c3FsaV9zZXRfY2hhcnNldCBteXNxbGlfc2V0X2xvY2FsX2luZmlsZV9kZWZhdWx0IG15c3FsaV9zZXRfbG9jYWxfaW5maWxlX2hhbmRsZXIgbXlzcWxpX3NxbHN0YXRlIG15c3FsaV9zc2xfc2V0IG15c3FsaV9zdGF0IG15c3FsaV9zdG10X2luaXQgbXlzcWxpX3N0b3JlX3Jlc3VsdCBteXNxbGlfdGhyZWFkX2lkIG15c3FsaV90aHJlYWRfc2FmZSBteXNxbGlfdXNlX3Jlc3VsdCBteXNxbGlfd2FybmluZ19jb3VudCI7CiAgQ29kZU1pcnJvci5yZWdpc3RlckhlbHBlcigiaGludFdvcmRzIiwgInBocCIsIFtwaHBLZXl3b3JkcywgcGhwQXRvbXMsIHBocEJ1aWx0aW5dLmpvaW4oIiAiKS5zcGxpdCgiICIpKTsKICBDb2RlTWlycm9yLnJlZ2lzdGVySGVscGVyKCJ3b3JkQ2hhcnMiLCAicGhwIiwgL1tcdyRdLyk7CgogIHZhciBwaHBDb25maWcgPSB7CiAgICBuYW1lOiAiY2xpa2UiLAogICAgaGVscGVyVHlwZTogInBocCIsCiAgICBrZXl3b3Jkczoga2V5d29yZHMocGhwS2V5d29yZHMpLAogICAgYmxvY2tLZXl3b3Jkczoga2V5d29yZHMoImNhdGNoIGRvIGVsc2UgZWxzZWlmIGZvciBmb3JlYWNoIGlmIHN3aXRjaCB0cnkgd2hpbGUgZmluYWxseSIpLAogICAgZGVmS2V5d29yZHM6IGtleXdvcmRzKCJjbGFzcyBmdW5jdGlvbiBpbnRlcmZhY2UgbmFtZXNwYWNlIHRyYWl0IiksCiAgICBhdG9tczoga2V5d29yZHMocGhwQXRvbXMpLAogICAgYnVpbHRpbjoga2V5d29yZHMocGhwQnVpbHRpbiksCiAgICBtdWx0aUxpbmVTdHJpbmdzOiB0cnVlLAogICAgaG9va3M6IHsKICAgICAgIiQiOiBmdW5jdGlvbihzdHJlYW0pIHsKICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcd1wkX10vKTsKICAgICAgICByZXR1cm4gInZhcmlhYmxlLTIiOwogICAgICB9LAogICAgICAiPCI6IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgICB2YXIgYmVmb3JlOwogICAgICAgIGlmIChiZWZvcmUgPSBzdHJlYW0ubWF0Y2goLzw8XHMqLykpIHsKICAgICAgICAgIHZhciBxdW90ZWQgPSBzdHJlYW0uZWF0KC9bJyJdLyk7CiAgICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcd1wuXS8pOwogICAgICAgICAgdmFyIGRlbGltID0gc3RyZWFtLmN1cnJlbnQoKS5zbGljZShiZWZvcmVbMF0ubGVuZ3RoICsgKHF1b3RlZCA/IDIgOiAxKSk7CiAgICAgICAgICBpZiAocXVvdGVkKSBzdHJlYW0uZWF0KHF1b3RlZCk7CiAgICAgICAgICBpZiAoZGVsaW0pIHsKICAgICAgICAgICAgKHN0YXRlLnRva1N0YWNrIHx8IChzdGF0ZS50b2tTdGFjayA9IFtdKSkucHVzaChkZWxpbSwgMCk7CiAgICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gcGhwU3RyaW5nKGRlbGltLCBxdW90ZWQgIT0gIiciKTsKICAgICAgICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0sCiAgICAgICIjIjogZnVuY3Rpb24oc3RyZWFtKSB7CiAgICAgICAgd2hpbGUgKCFzdHJlYW0uZW9sKCkgJiYgIXN0cmVhbS5tYXRjaCgiPz4iLCBmYWxzZSkpIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgcmV0dXJuICJjb21tZW50IjsKICAgICAgfSwKICAgICAgIi8iOiBmdW5jdGlvbihzdHJlYW0pIHsKICAgICAgICBpZiAoc3RyZWFtLmVhdCgiLyIpKSB7CiAgICAgICAgICB3aGlsZSAoIXN0cmVhbS5lb2woKSAmJiAhc3RyZWFtLm1hdGNoKCI/PiIsIGZhbHNlKSkgc3RyZWFtLm5leHQoKTsKICAgICAgICAgIHJldHVybiAiY29tbWVudCI7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfSwKICAgICAgJyInOiBmdW5jdGlvbihfc3RyZWFtLCBzdGF0ZSkgewogICAgICAgIChzdGF0ZS50b2tTdGFjayB8fCAoc3RhdGUudG9rU3RhY2sgPSBbXSkpLnB1c2goJyInLCAwKTsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHBocFN0cmluZygnIicpOwogICAgICAgIHJldHVybiAic3RyaW5nIjsKICAgICAgfSwKICAgICAgInsiOiBmdW5jdGlvbihfc3RyZWFtLCBzdGF0ZSkgewogICAgICAgIGlmIChzdGF0ZS50b2tTdGFjayAmJiBzdGF0ZS50b2tTdGFjay5sZW5ndGgpCiAgICAgICAgICBzdGF0ZS50b2tTdGFja1tzdGF0ZS50b2tTdGFjay5sZW5ndGggLSAxXSsrOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfSwKICAgICAgIn0iOiBmdW5jdGlvbihfc3RyZWFtLCBzdGF0ZSkgewogICAgICAgIGlmIChzdGF0ZS50b2tTdGFjayAmJiBzdGF0ZS50b2tTdGFjay5sZW5ndGggPiAwICYmCiAgICAgICAgICAgICEtLXN0YXRlLnRva1N0YWNrW3N0YXRlLnRva1N0YWNrLmxlbmd0aCAtIDFdKSB7CiAgICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHBocFN0cmluZyhzdGF0ZS50b2tTdGFja1tzdGF0ZS50b2tTdGFjay5sZW5ndGggLSAyXSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfQogIH07CgogIENvZGVNaXJyb3IuZGVmaW5lTW9kZSgicGhwIiwgZnVuY3Rpb24oY29uZmlnLCBwYXJzZXJDb25maWcpIHsKICAgIHZhciBodG1sTW9kZSA9IENvZGVNaXJyb3IuZ2V0TW9kZShjb25maWcsICJ0ZXh0L2h0bWwiKTsKICAgIHZhciBwaHBNb2RlID0gQ29kZU1pcnJvci5nZXRNb2RlKGNvbmZpZywgcGhwQ29uZmlnKTsKCiAgICBmdW5jdGlvbiBkaXNwYXRjaChzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHZhciBpc1BIUCA9IHN0YXRlLmN1ck1vZGUgPT0gcGhwTW9kZTsKICAgICAgaWYgKHN0cmVhbS5zb2woKSAmJiBzdGF0ZS5wZW5kaW5nICYmIHN0YXRlLnBlbmRpbmcgIT0gJyInICYmIHN0YXRlLnBlbmRpbmcgIT0gIiciKSBzdGF0ZS5wZW5kaW5nID0gbnVsbDsKICAgICAgaWYgKCFpc1BIUCkgewogICAgICAgIGlmIChzdHJlYW0ubWF0Y2goL148XD9cdyovKSkgewogICAgICAgICAgc3RhdGUuY3VyTW9kZSA9IHBocE1vZGU7CiAgICAgICAgICBpZiAoIXN0YXRlLnBocCkgc3RhdGUucGhwID0gQ29kZU1pcnJvci5zdGFydFN0YXRlKHBocE1vZGUsIGh0bWxNb2RlLmluZGVudChzdGF0ZS5odG1sLCAiIikpCiAgICAgICAgICBzdGF0ZS5jdXJTdGF0ZSA9IHN0YXRlLnBocDsKICAgICAgICAgIHJldHVybiAibWV0YSI7CiAgICAgICAgfQogICAgICAgIGlmIChzdGF0ZS5wZW5kaW5nID09ICciJyB8fCBzdGF0ZS5wZW5kaW5nID09ICInIikgewogICAgICAgICAgd2hpbGUgKCFzdHJlYW0uZW9sKCkgJiYgc3RyZWFtLm5leHQoKSAhPSBzdGF0ZS5wZW5kaW5nKSB7fQogICAgICAgICAgdmFyIHN0eWxlID0gInN0cmluZyI7CiAgICAgICAgfSBlbHNlIGlmIChzdGF0ZS5wZW5kaW5nICYmIHN0cmVhbS5wb3MgPCBzdGF0ZS5wZW5kaW5nLmVuZCkgewogICAgICAgICAgc3RyZWFtLnBvcyA9IHN0YXRlLnBlbmRpbmcuZW5kOwogICAgICAgICAgdmFyIHN0eWxlID0gc3RhdGUucGVuZGluZy5zdHlsZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdmFyIHN0eWxlID0gaHRtbE1vZGUudG9rZW4oc3RyZWFtLCBzdGF0ZS5jdXJTdGF0ZSk7CiAgICAgICAgfQogICAgICAgIGlmIChzdGF0ZS5wZW5kaW5nKSBzdGF0ZS5wZW5kaW5nID0gbnVsbDsKICAgICAgICB2YXIgY3VyID0gc3RyZWFtLmN1cnJlbnQoKSwgb3BlblBIUCA9IGN1ci5zZWFyY2goLzxcPy8pLCBtOwogICAgICAgIGlmIChvcGVuUEhQICE9IC0xKSB7CiAgICAgICAgICBpZiAoc3R5bGUgPT0gInN0cmluZyIgJiYgKG0gPSBjdXIubWF0Y2goL1tcJ1wiXSQvKSkgJiYgIS9cPz4vLnRlc3QoY3VyKSkgc3RhdGUucGVuZGluZyA9IG1bMF07CiAgICAgICAgICBlbHNlIHN0YXRlLnBlbmRpbmcgPSB7ZW5kOiBzdHJlYW0ucG9zLCBzdHlsZTogc3R5bGV9OwogICAgICAgICAgc3RyZWFtLmJhY2tVcChjdXIubGVuZ3RoIC0gb3BlblBIUCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzdHlsZTsKICAgICAgfSBlbHNlIGlmIChpc1BIUCAmJiBzdGF0ZS5waHAudG9rZW5pemUgPT0gbnVsbCAmJiBzdHJlYW0ubWF0Y2goIj8+IikpIHsKICAgICAgICBzdGF0ZS5jdXJNb2RlID0gaHRtbE1vZGU7CiAgICAgICAgc3RhdGUuY3VyU3RhdGUgPSBzdGF0ZS5odG1sOwogICAgICAgIGlmICghc3RhdGUucGhwLmNvbnRleHQucHJldikgc3RhdGUucGhwID0gbnVsbDsKICAgICAgICByZXR1cm4gIm1ldGEiOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBwaHBNb2RlLnRva2VuKHN0cmVhbSwgc3RhdGUuY3VyU3RhdGUpOwogICAgICB9CiAgICB9CgogICAgcmV0dXJuIHsKICAgICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGh0bWwgPSBDb2RlTWlycm9yLnN0YXJ0U3RhdGUoaHRtbE1vZGUpCiAgICAgICAgdmFyIHBocCA9IHBhcnNlckNvbmZpZy5zdGFydE9wZW4gPyBDb2RlTWlycm9yLnN0YXJ0U3RhdGUocGhwTW9kZSkgOiBudWxsCiAgICAgICAgcmV0dXJuIHtodG1sOiBodG1sLAogICAgICAgICAgICAgICAgcGhwOiBwaHAsCiAgICAgICAgICAgICAgICBjdXJNb2RlOiBwYXJzZXJDb25maWcuc3RhcnRPcGVuID8gcGhwTW9kZSA6IGh0bWxNb2RlLAogICAgICAgICAgICAgICAgY3VyU3RhdGU6IHBhcnNlckNvbmZpZy5zdGFydE9wZW4gPyBwaHAgOiBodG1sLAogICAgICAgICAgICAgICAgcGVuZGluZzogbnVsbH07CiAgICAgIH0sCgogICAgICBjb3B5U3RhdGU6IGZ1bmN0aW9uKHN0YXRlKSB7CiAgICAgICAgdmFyIGh0bWwgPSBzdGF0ZS5odG1sLCBodG1sTmV3ID0gQ29kZU1pcnJvci5jb3B5U3RhdGUoaHRtbE1vZGUsIGh0bWwpLAogICAgICAgICAgICBwaHAgPSBzdGF0ZS5waHAsIHBocE5ldyA9IHBocCAmJiBDb2RlTWlycm9yLmNvcHlTdGF0ZShwaHBNb2RlLCBwaHApLCBjdXI7CiAgICAgICAgaWYgKHN0YXRlLmN1ck1vZGUgPT0gaHRtbE1vZGUpIGN1ciA9IGh0bWxOZXc7CiAgICAgICAgZWxzZSBjdXIgPSBwaHBOZXc7CiAgICAgICAgcmV0dXJuIHtodG1sOiBodG1sTmV3LCBwaHA6IHBocE5ldywgY3VyTW9kZTogc3RhdGUuY3VyTW9kZSwgY3VyU3RhdGU6IGN1ciwKICAgICAgICAgICAgICAgIHBlbmRpbmc6IHN0YXRlLnBlbmRpbmd9OwogICAgICB9LAoKICAgICAgdG9rZW46IGRpc3BhdGNoLAoKICAgICAgaW5kZW50OiBmdW5jdGlvbihzdGF0ZSwgdGV4dEFmdGVyKSB7CiAgICAgICAgaWYgKChzdGF0ZS5jdXJNb2RlICE9IHBocE1vZGUgJiYgL15ccyo8XC8vLnRlc3QodGV4dEFmdGVyKSkgfHwKICAgICAgICAgICAgKHN0YXRlLmN1ck1vZGUgPT0gcGhwTW9kZSAmJiAvXlw/Pi8udGVzdCh0ZXh0QWZ0ZXIpKSkKICAgICAgICAgIHJldHVybiBodG1sTW9kZS5pbmRlbnQoc3RhdGUuaHRtbCwgdGV4dEFmdGVyKTsKICAgICAgICByZXR1cm4gc3RhdGUuY3VyTW9kZS5pbmRlbnQoc3RhdGUuY3VyU3RhdGUsIHRleHRBZnRlcik7CiAgICAgIH0sCgogICAgICBibG9ja0NvbW1lbnRTdGFydDogIi8qIiwKICAgICAgYmxvY2tDb21tZW50RW5kOiAiKi8iLAogICAgICBsaW5lQ29tbWVudDogIi8vIiwKCiAgICAgIGlubmVyTW9kZTogZnVuY3Rpb24oc3RhdGUpIHsgcmV0dXJuIHtzdGF0ZTogc3RhdGUuY3VyU3RhdGUsIG1vZGU6IHN0YXRlLmN1ck1vZGV9OyB9CiAgICB9OwogIH0sICJodG1sbWl4ZWQiLCAiY2xpa2UiKTsKCiAgQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJhcHBsaWNhdGlvbi94LWh0dHBkLXBocCIsICJwaHAiKTsKICBDb2RlTWlycm9yLmRlZmluZU1JTUUoImFwcGxpY2F0aW9uL3gtaHR0cGQtcGhwLW9wZW4iLCB7bmFtZTogInBocCIsIHN0YXJ0T3BlbjogdHJ1ZX0pOwogIENvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC94LXBocCIsIHBocENvbmZpZyk7Cn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/php/test.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24oKSB7CiAgdmFyIG1vZGUgPSBDb2RlTWlycm9yLmdldE1vZGUoe2luZGVudFVuaXQ6IDJ9LCAicGhwIik7CiAgZnVuY3Rpb24gTVQobmFtZSkgeyB0ZXN0Lm1vZGUobmFtZSwgbW9kZSwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7IH0KCiAgTVQoJ3NpbXBsZV90ZXN0JywKICAgICAnW21ldGEgPD9waHBdICcgKwogICAgICdba2V5d29yZCBlY2hvXSBbc3RyaW5nICJhYWEiXTsgJyArCiAgICAgJ1ttZXRhID8+XScpOwoKICBNVCgndmFyaWFibGVfaW50ZXJwb2xhdGlvbl9ub25fYWxwaGFudW1lcmljJywKICAgICAnW21ldGEgPD9waHBdJywKICAgICAnW2tleXdvcmQgZWNob10gW3N0cmluZyAiYWFhJH4kISRAJCMkJCQlJF4kJiQqJCgkKSQuJDwkPiQvJFxcJH0kXFxcIiQ6JDskPyR8JFtbJF1dJCskPWFhYSJdJywKICAgICAnW21ldGEgPz5dJyk7CgogIE1UKCd2YXJpYWJsZV9pbnRlcnBvbGF0aW9uX2RpZ2l0cycsCiAgICAgJ1ttZXRhIDw/cGhwXScsCiAgICAgJ1trZXl3b3JkIGVjaG9dIFtzdHJpbmcgImFhYSQxJDIkMyQ0JDUkNiQ3JDgkOSQwYWFhIl0nLAogICAgICdbbWV0YSA/Pl0nKTsKCiAgTVQoJ3ZhcmlhYmxlX2ludGVycG9sYXRpb25fc2ltcGxlX3N5bnRheF8xJywKICAgICAnW21ldGEgPD9waHBdJywKICAgICAnW2tleXdvcmQgZWNob10gW3N0cmluZyAiYWFhXVt2YXJpYWJsZS0yICRhYWFdW3N0cmluZyAuYWFhIl07JywKICAgICAnW21ldGEgPz5dJyk7CgogIE1UKCd2YXJpYWJsZV9pbnRlcnBvbGF0aW9uX3NpbXBsZV9zeW50YXhfMicsCiAgICAgJ1ttZXRhIDw/cGhwXScsCiAgICAgJ1trZXl3b3JkIGVjaG9dIFtzdHJpbmcgIl1bdmFyaWFibGUtMiAkYWFhYV1bWycsJ1tudW1iZXIgMl0nLCAgICAgICAgICddXVtzdHJpbmcgYWEiXTsnLAogICAgICdba2V5d29yZCBlY2hvXSBbc3RyaW5nICJdW3ZhcmlhYmxlLTIgJGFhYWFdW1snLCdbbnVtYmVyIDIzNDVdJywgICAgICAnXV1bc3RyaW5nIGFhIl07JywKICAgICAnW2tleXdvcmQgZWNob10gW3N0cmluZyAiXVt2YXJpYWJsZS0yICRhYWFhXVtbJywnW251bWJlciAyLjNdJywgICAgICAgJ11dW3N0cmluZyBhYSJdOycsCiAgICAgJ1trZXl3b3JkIGVjaG9dIFtzdHJpbmcgIl1bdmFyaWFibGUtMiAkYWFhYV1bWycsJ1t2YXJpYWJsZSBhYWFhYV0nLCAgICddXVtzdHJpbmcgYWEiXTsnLAogICAgICdba2V5d29yZCBlY2hvXSBbc3RyaW5nICJdW3ZhcmlhYmxlLTIgJGFhYWFdW1snLCdbdmFyaWFibGUtMiAkYWFhYWFdJywnXV1bc3RyaW5nIGFhIl07JywKCiAgICAgJ1trZXl3b3JkIGVjaG9dIFtzdHJpbmcgIjFhYWFdW3ZhcmlhYmxlLTIgJGFhYWFdW1snLCdbbnVtYmVyIDJdJywgICAgICAgICAnXV1bc3RyaW5nIGFhIl07JywKICAgICAnW2tleXdvcmQgZWNob10gW3N0cmluZyAiYWFhXVt2YXJpYWJsZS0yICRhYWFhXVtbJywnW251bWJlciAyMzQ1XScsICAgICAgJ11dW3N0cmluZyBhYSJdOycsCiAgICAgJ1trZXl3b3JkIGVjaG9dIFtzdHJpbmcgImFhYV1bdmFyaWFibGUtMiAkYWFhYV1bWycsJ1tudW1iZXIgMi4zXScsICAgICAgICddXVtzdHJpbmcgYWEiXTsnLAogICAgICdba2V5d29yZCBlY2hvXSBbc3RyaW5nICJhYWFdW3ZhcmlhYmxlLTIgJGFhYWFdW1snLCdbdmFyaWFibGUgYWFhYWFdJywgICAnXV1bc3RyaW5nIGFhIl07JywKICAgICAnW2tleXdvcmQgZWNob10gW3N0cmluZyAiYWFhXVt2YXJpYWJsZS0yICRhYWFhXVtbJywnW3ZhcmlhYmxlLTIgJGFhYWFhXScsJ11dW3N0cmluZyBhYSJdOycsCiAgICAgJ1ttZXRhID8+XScpOwoKICBNVCgndmFyaWFibGVfaW50ZXJwb2xhdGlvbl9zaW1wbGVfc3ludGF4XzMnLAogICAgICdbbWV0YSA8P3BocF0nLAogICAgICdba2V5d29yZCBlY2hvXSBbc3RyaW5nICJhYWFdW3ZhcmlhYmxlLTIgJGFhYWFdLT5bdmFyaWFibGUgYWFhYWFdW3N0cmluZyAuYWFhYWFhIl07JywKICAgICAnW2tleXdvcmQgZWNob10gW3N0cmluZyAiYWFhXVt2YXJpYWJsZS0yICRhYWFhXVtzdHJpbmcgLT5dW3ZhcmlhYmxlLTIgJGFhYWFhXVtzdHJpbmcgLmFhYWFhYSJdOycsCiAgICAgJ1trZXl3b3JkIGVjaG9dIFtzdHJpbmcgImFhYV1bdmFyaWFibGUtMiAkYWFhYV0tPlt2YXJpYWJsZSBhYWFhYV1bc3RyaW5nIFtbMl1dLmFhYWFhYSJdOycsCiAgICAgJ1trZXl3b3JkIGVjaG9dIFtzdHJpbmcgImFhYV1bdmFyaWFibGUtMiAkYWFhYV0tPlt2YXJpYWJsZSBhYWFhYV1bc3RyaW5nIC0+YWFhYTIuYWFhYWFhIl07JywKICAgICAnW21ldGEgPz5dJyk7CgogIE1UKCd2YXJpYWJsZV9pbnRlcnBvbGF0aW9uX2VzY2FwaW5nJywKICAgICAnW21ldGEgPD9waHBdIFtjb21tZW50IC8qIEVzY2FwaW5nICovXScsCiAgICAgJ1trZXl3b3JkIGVjaG9dIFtzdHJpbmcgImFhYVxcJGFhYWEtPmFhYS5hYWEiXTsnLAogICAgICdba2V5d29yZCBlY2hvXSBbc3RyaW5nICJhYWFcXCRhYWFhW1syXV1hYWEuYWFhIl07JywKICAgICAnW2tleXdvcmQgZWNob10gW3N0cmluZyAiYWFhXFwkYWFhYVtbYXNkXV1hYWEuYWFhIl07JywKICAgICAnW2tleXdvcmQgZWNob10gW3N0cmluZyAiYWFhe1xcJGFhYWEtPmFhYS5hYWEiXTsnLAogICAgICdba2V5d29yZCBlY2hvXSBbc3RyaW5nICJhYWF7XFwkYWFhYVtbMl1dYWFhLmFhYSJdOycsCiAgICAgJ1trZXl3b3JkIGVjaG9dIFtzdHJpbmcgImFhYXtcXGFhYWFhW1thc2RdXWFhYS5hYWEiXTsnLAogICAgICdba2V5d29yZCBlY2hvXSBbc3RyaW5nICJhYWFcXCR7YWFhYS0+YWFhLmFhYSJdOycsCiAgICAgJ1trZXl3b3JkIGVjaG9dIFtzdHJpbmcgImFhYVxcJHthYWFhW1syXV1hYWEuYWFhIl07JywKICAgICAnW2tleXdvcmQgZWNob10gW3N0cmluZyAiYWFhXFwke2FhYWFbW2FzZF1dYWFhLmFhYSJdOycsCiAgICAgJ1ttZXRhID8+XScpOwoKICBNVCgndmFyaWFibGVfaW50ZXJwb2xhdGlvbl9jb21wbGV4X3N5bnRheF8xJywKICAgICAnW21ldGEgPD9waHBdJywKICAgICAnW2tleXdvcmQgZWNob10gW3N0cmluZyAiYWFhXVt2YXJpYWJsZS0yICRde1t2YXJpYWJsZSBhYWFhXX1bc3RyaW5nIC0+YWFhLmFhYSJdOycsCiAgICAgJ1trZXl3b3JkIGVjaG9dIFtzdHJpbmcgImFhYV1bdmFyaWFibGUtMiAkXXtbdmFyaWFibGUtMiAkYWFhYV19W3N0cmluZyAtPmFhYS5hYWEiXTsnLAogICAgICdba2V5d29yZCBlY2hvXSBbc3RyaW5nICJhYWFdW3ZhcmlhYmxlLTIgJF17W3ZhcmlhYmxlLTIgJGFhYWFdW1snLCcgIFtudW1iZXIgNDJdJywnXV19W3N0cmluZyAtPmFhYS5hYWEiXTsnLAogICAgICdba2V5d29yZCBlY2hvXSBbc3RyaW5nICJhYWFdW3ZhcmlhYmxlLTIgJF17W3ZhcmlhYmxlIGFhYWFdW21ldGEgPz5dYWFhYWFhJyk7CgogIE1UKCd2YXJpYWJsZV9pbnRlcnBvbGF0aW9uX2NvbXBsZXhfc3ludGF4XzInLAogICAgICdbbWV0YSA8P3BocF0gW2NvbW1lbnQgLyogTW9uc3RlcnMgKi9dJywKICAgICAnW2tleXdvcmQgZWNob10gW3N0cmluZyAiXVt2YXJpYWJsZS0yICRde1t2YXJpYWJsZSBhYWFdW2NvbW1lbnQgLyp9Pz59ICRhYWE8P3BocCB9ICovXX1bc3RyaW5nIC0+YWFhLmFhYSJdOycsCiAgICAgJ1trZXl3b3JkIGVjaG9dIFtzdHJpbmcgIl1bdmFyaWFibGUtMiAkXXtbdmFyaWFibGUgYWFhXVtjb21tZW50IC8qfT8+Ki9dW1snLCcgIFtzdHJpbmcgImFhYV1bdmFyaWFibGUtMiAkYWFhXVtzdHJpbmcge31dW3ZhcmlhYmxlLTIgJF17W3ZhcmlhYmxlIGFhYV19W3N0cmluZyAiXScsJ11dfVtzdHJpbmcgLT5hYWEuYWFhIl07JywKICAgICAnW2tleXdvcmQgZWNob10gW3N0cmluZyAiXVt2YXJpYWJsZS0yICRde1t2YXJpYWJsZSBhYWFdW2NvbW1lbnQgLyp9IH0gJGFhYSB9ICovXX1bc3RyaW5nIC0+YWFhLmFhYSJdOycpOwoKCiAgZnVuY3Rpb24gYnVpbGRfcmVjdXJzaXZlX21vbnN0ZXJzKG50LCB0LCBuKXsKICAgIHZhciBtb25zdGVycyA9IFt0XTsKICAgIGZvciAodmFyIGkgPSAxOyBpIDw9IG47ICsraSkKICAgICAgbW9uc3RlcnNbaV0gPSBudC5qb2luKG1vbnN0ZXJzW2kgLSAxXSk7CiAgICByZXR1cm4gbW9uc3RlcnM7CiAgfQoKICB2YXIgbTEgPSBidWlsZF9yZWN1cnNpdmVfbW9uc3RlcnMoCiAgICBbJ1tzdHJpbmcgIl1bdmFyaWFibGUtMiAkXXtbdmFyaWFibGUgYWFhXSBbb3BlcmF0b3IgK10gJywgJ31bc3RyaW5nICJdJ10sCiAgICAnW2NvbW1lbnQgLyogfT8+fSAqL10gW3N0cmluZyAiYWFhXVt2YXJpYWJsZS0yICRhYWFdW3N0cmluZyAuYWFhIl0nLAogICAgMTAKICApOwoKICBNVCgndmFyaWFibGVfaW50ZXJwb2xhdGlvbl9jb21wbGV4X3N5bnRheF8zXzEnLAogICAgICdbbWV0YSA8P3BocF0gW2NvbW1lbnQgLyogUmVjdXJzaXZlIG1vbnN0ZXJzICovXScsCiAgICAgJ1trZXl3b3JkIGVjaG9dICcgKyBtMVs0XSArICc7JywKICAgICAnW2tleXdvcmQgZWNob10gJyArIG0xWzddICsgJzsnLAogICAgICdba2V5d29yZCBlY2hvXSAnICsgbTFbOF0gKyAnOycsCiAgICAgJ1trZXl3b3JkIGVjaG9dICcgKyBtMVs1XSArICc7JywKICAgICAnW2tleXdvcmQgZWNob10gJyArIG0xWzFdICsgJzsnLAogICAgICdba2V5d29yZCBlY2hvXSAnICsgbTFbNl0gKyAnOycsCiAgICAgJ1trZXl3b3JkIGVjaG9dICcgKyBtMVs5XSArICc7JywKICAgICAnW2tleXdvcmQgZWNob10gJyArIG0xWzBdICsgJzsnLAogICAgICdba2V5d29yZCBlY2hvXSAnICsgbTFbMTBdICsgJzsnLAogICAgICdba2V5d29yZCBlY2hvXSAnICsgbTFbMl0gKyAnOycsCiAgICAgJ1trZXl3b3JkIGVjaG9dICcgKyBtMVszXSArICc7JywKICAgICAnW2tleXdvcmQgZWNob10gW3N0cmluZyAiZW5kIl07JywKICAgICAnW21ldGEgPz5dJyk7CgogIHZhciBtMiA9IGJ1aWxkX3JlY3Vyc2l2ZV9tb25zdGVycygKICAgIFsnW3N0cmluZyAiYV1bdmFyaWFibGUtMiAkXXtbdmFyaWFibGUgYWFhXSBbb3BlcmF0b3IgK10gJywgJyBbb3BlcmF0b3IgK10gJywgJ31bc3RyaW5nIC5hIl0nXSwKICAgICdbY29tbWVudCAvKiB9Pz57eyAqL10gW3N0cmluZyAiYT8+fXt7YWFdW3ZhcmlhYmxlLTIgJGFhYV1bc3RyaW5nIC5hfWE/PmEiXScsCiAgICA1CiAgKTsKCiAgTVQoJ3ZhcmlhYmxlX2ludGVycG9sYXRpb25fY29tcGxleF9zeW50YXhfM18yJywKICAgICAnW21ldGEgPD9waHBdIFtjb21tZW50IC8qIFJlY3Vyc2l2ZSBtb25zdGVycyAyICovXScsCiAgICAgJ1trZXl3b3JkIGVjaG9dICcgKyBtMlswXSArICc7JywKICAgICAnW2tleXdvcmQgZWNob10gJyArIG0yWzFdICsgJzsnLAogICAgICdba2V5d29yZCBlY2hvXSAnICsgbTJbNV0gKyAnOycsCiAgICAgJ1trZXl3b3JkIGVjaG9dICcgKyBtMls0XSArICc7JywKICAgICAnW2tleXdvcmQgZWNob10gJyArIG0yWzJdICsgJzsnLAogICAgICdba2V5d29yZCBlY2hvXSAnICsgbTJbM10gKyAnOycsCiAgICAgJ1trZXl3b3JkIGVjaG9dIFtzdHJpbmcgImVuZCJdOycsCiAgICAgJ1ttZXRhID8+XScpOwoKICBmdW5jdGlvbiBidWlsZF9yZWN1cnNpdmVfbW9uc3RlcnNfMihtZjEsIG1mMiwgbnQsIHQsIG4pewogICAgdmFyIG1vbnN0ZXJzID0gW3RdOwogICAgZm9yICh2YXIgaSA9IDE7IGkgPD0gbjsgKytpKQogICAgICBtb25zdGVyc1tpXSA9IG50WzBdICsgbWYxW2kgLSAxXSArIG50WzFdICsgbWYyW2kgLSAxXSArIG50WzJdICsgbW9uc3RlcnNbaSAtIDFdICsgbnRbM107CiAgICByZXR1cm4gbW9uc3RlcnM7CiAgfQoKICB2YXIgbTMgPSBidWlsZF9yZWN1cnNpdmVfbW9uc3RlcnNfMigKICAgIG0xLAogICAgbTIsCiAgICBbJ1tzdHJpbmcgImFdW3ZhcmlhYmxlLTIgJF17W3ZhcmlhYmxlIGFhYV0gW29wZXJhdG9yICtdICcsICcgW29wZXJhdG9yICtdICcsICcgW29wZXJhdG9yICtdICcsICd9W3N0cmluZyAuYSJdJ10sCiAgICAnW2NvbW1lbnQgLyogfT8+e3sgKi9dIFtzdHJpbmcgImE/Pn17e2FhXVt2YXJpYWJsZS0yICRhYWFdW3N0cmluZyAuYX1hPz5hIl0nLAogICAgNAogICk7CgogIE1UKCd2YXJpYWJsZV9pbnRlcnBvbGF0aW9uX2NvbXBsZXhfc3ludGF4XzNfMycsCiAgICAgJ1ttZXRhIDw/cGhwXSBbY29tbWVudCAvKiBSZWN1cnNpdmUgbW9uc3RlcnMgMiAqL10nLAogICAgICdba2V5d29yZCBlY2hvXSAnICsgbTNbNF0gKyAnOycsCiAgICAgJ1trZXl3b3JkIGVjaG9dICcgKyBtM1swXSArICc7JywKICAgICAnW2tleXdvcmQgZWNob10gJyArIG0zWzNdICsgJzsnLAogICAgICdba2V5d29yZCBlY2hvXSAnICsgbTNbMV0gKyAnOycsCiAgICAgJ1trZXl3b3JkIGVjaG9dICcgKyBtM1syXSArICc7JywKICAgICAnW2tleXdvcmQgZWNob10gW3N0cmluZyAiZW5kIl07JywKICAgICAnW21ldGEgPz5dJyk7CgogIE1UKCJ2YXJpYWJsZV9pbnRlcnBvbGF0aW9uX2hlcmVkb2MiLAogICAgICJbbWV0YSA8P3BocF0iLAogICAgICJbc3RyaW5nIDw8PGhlcmVdIiwKICAgICAiW3N0cmluZyBkb2MgXVt2YXJpYWJsZS0yICRde1t2YXJpYWJsZSB5YXldfVtzdHJpbmcgbW9yZV0iLAogICAgICJbc3RyaW5nIGhlcmVdOyBbY29tbWVudCAvLyBub3JtYWxdIik7Cn0pKCk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/pig/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/pig/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[77u/PCFkb2N0eXBlIGh0bWw+Cjx0aXRsZT5Db2RlTWlycm9yOiBQaWcgTGF0aW4gbW9kZTwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uLy4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxzY3JpcHQgc3JjPSIuLi8uLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJwaWcuanMiPjwvc2NyaXB0Pgo8c3R5bGU+LkNvZGVNaXJyb3Ige2JvcmRlcjogMnB4IGluc2V0ICNkZWU7fTwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGgxPkNvZGVNaXJyb3I8L2gxPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5QaWcgTGF0aW48L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPlBpZyBMYXRpbiBtb2RlPC9oMj4KPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KLS0gQXBhY2hlIFBpZyAoUGlnIExhdGluIExhbmd1YWdlKSBEZW1vCi8qIApUaGlzIGlzIGEgbXVsdGlsaW5lIGNvbW1lbnQuCiovCmEgPSBMT0FEICJccGF0aFx0b1xpbnB1dCIgVVNJTkcgUGlnU3RvcmFnZSgnXHQnKSBBUyAoeDpsb25nLCB5OmNoYXJhcnJheSwgejpieXRlYXJyYXkpOwpiID0gR1JPVVAgYSBCWSAoeCx5LDMrNCk7CmMgPSBGT1JFQUNIIGIgR0VORVJBVEUgZmxhdHRlbihncm91cCkgYXMgKHgseSksIFNVTShncm91cC4kMikgYXMgejsKU1RPUkUgYyBJTlRPICJccGF0aFx0b1xvdXRwdXQiOwoKLS0KPC90ZXh0YXJlYT48L2Zvcm0+CgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgICAgICBpbmRlbnRVbml0OiA0LAogICAgICAgIG1vZGU6ICJ0ZXh0L3gtcGlnIgogICAgICB9KTsKICAgIDwvc2NyaXB0PgoKICAgIDxwPgogICAgICAgIFNpbXBsZSBtb2RlIHRoYXQgaGFuZGxlcyBQaWcgTGF0aW4gbGFuZ3VhZ2UuCiAgICA8L3A+CgogICAgPHA+PHN0cm9uZz5NSU1FIHR5cGUgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC94LXBpZzwvY29kZT4KICAgIChQSUcgY29kZSkKPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/pig/pig.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovKgogKiAgICAgIFBpZyBMYXRpbiBNb2RlIGZvciBDb2RlTWlycm9yIDIKICogICAgICBAYXV0aG9yIFByYXNhbnRoIEpheWFjaGFuZHJhbgogKiAgICAgIEBsaW5rICAgaHR0cHM6Ly9naXRodWIuY29tL3ByYXNhbnRoai9waWctY29kZW1pcnJvci0yCiAqICBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGFkYXB0ZWQgZnJvbSBQTC9TUUwgbW9kZSBpbiBDb2RlTWlycm9yIDIuCiAqLwooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJwaWciLCBmdW5jdGlvbihfY29uZmlnLCBwYXJzZXJDb25maWcpIHsKICB2YXIga2V5d29yZHMgPSBwYXJzZXJDb25maWcua2V5d29yZHMsCiAgYnVpbHRpbnMgPSBwYXJzZXJDb25maWcuYnVpbHRpbnMsCiAgdHlwZXMgPSBwYXJzZXJDb25maWcudHlwZXMsCiAgbXVsdGlMaW5lU3RyaW5ncyA9IHBhcnNlckNvbmZpZy5tdWx0aUxpbmVTdHJpbmdzOwoKICB2YXIgaXNPcGVyYXRvckNoYXIgPSAvWyorXC0lPD49Jj86XC8hfF0vOwoKICBmdW5jdGlvbiBjaGFpbihzdHJlYW0sIHN0YXRlLCBmKSB7CiAgICBzdGF0ZS50b2tlbml6ZSA9IGY7CiAgICByZXR1cm4gZihzdHJlYW0sIHN0YXRlKTsKICB9CgogIGZ1bmN0aW9uIHRva2VuQ29tbWVudChzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgaXNFbmQgPSBmYWxzZTsKICAgIHZhciBjaDsKICAgIHdoaWxlKGNoID0gc3RyZWFtLm5leHQoKSkgewogICAgICBpZihjaCA9PSAiLyIgJiYgaXNFbmQpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBpc0VuZCA9IChjaCA9PSAiKiIpOwogICAgfQogICAgcmV0dXJuICJjb21tZW50IjsKICB9CgogIGZ1bmN0aW9uIHRva2VuU3RyaW5nKHF1b3RlKSB7CiAgICByZXR1cm4gZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICB2YXIgZXNjYXBlZCA9IGZhbHNlLCBuZXh0LCBlbmQgPSBmYWxzZTsKICAgICAgd2hpbGUoKG5leHQgPSBzdHJlYW0ubmV4dCgpKSAhPSBudWxsKSB7CiAgICAgICAgaWYgKG5leHQgPT0gcXVvdGUgJiYgIWVzY2FwZWQpIHsKICAgICAgICAgIGVuZCA9IHRydWU7IGJyZWFrOwogICAgICAgIH0KICAgICAgICBlc2NhcGVkID0gIWVzY2FwZWQgJiYgbmV4dCA9PSAiXFwiOwogICAgICB9CiAgICAgIGlmIChlbmQgfHwgIShlc2NhcGVkIHx8IG11bHRpTGluZVN0cmluZ3MpKQogICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlOwogICAgICByZXR1cm4gImVycm9yIjsKICAgIH07CiAgfQoKCiAgZnVuY3Rpb24gdG9rZW5CYXNlKHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBjaCA9IHN0cmVhbS5uZXh0KCk7CgogICAgLy8gaXMgYSBzdGFydCBvZiBzdHJpbmc/CiAgICBpZiAoY2ggPT0gJyInIHx8IGNoID09ICInIikKICAgICAgcmV0dXJuIGNoYWluKHN0cmVhbSwgc3RhdGUsIHRva2VuU3RyaW5nKGNoKSk7CiAgICAvLyBpcyBpdCBvbmUgb2YgdGhlIHNwZWNpYWwgY2hhcnMKICAgIGVsc2UgaWYoL1tcW1xde31cKFwpLDtcLl0vLnRlc3QoY2gpKQogICAgICByZXR1cm4gbnVsbDsKICAgIC8vIGlzIGl0IGEgbnVtYmVyPwogICAgZWxzZSBpZigvXGQvLnRlc3QoY2gpKSB7CiAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1x3XC5dLyk7CiAgICAgIHJldHVybiAibnVtYmVyIjsKICAgIH0KICAgIC8vIG11bHRpIGxpbmUgY29tbWVudCBvciBvcGVyYXRvcgogICAgZWxzZSBpZiAoY2ggPT0gIi8iKSB7CiAgICAgIGlmIChzdHJlYW0uZWF0KCIqIikpIHsKICAgICAgICByZXR1cm4gY2hhaW4oc3RyZWFtLCBzdGF0ZSwgdG9rZW5Db21tZW50KTsKICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICBzdHJlYW0uZWF0V2hpbGUoaXNPcGVyYXRvckNoYXIpOwogICAgICAgIHJldHVybiAib3BlcmF0b3IiOwogICAgICB9CiAgICB9CiAgICAvLyBzaW5nbGUgbGluZSBjb21tZW50IG9yIG9wZXJhdG9yCiAgICBlbHNlIGlmIChjaD09Ii0iKSB7CiAgICAgIGlmKHN0cmVhbS5lYXQoIi0iKSl7CiAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICAgIHJldHVybiAiY29tbWVudCI7CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgc3RyZWFtLmVhdFdoaWxlKGlzT3BlcmF0b3JDaGFyKTsKICAgICAgICByZXR1cm4gIm9wZXJhdG9yIjsKICAgICAgfQogICAgfQogICAgLy8gaXMgaXQgYW4gb3BlcmF0b3IKICAgIGVsc2UgaWYgKGlzT3BlcmF0b3JDaGFyLnRlc3QoY2gpKSB7CiAgICAgIHN0cmVhbS5lYXRXaGlsZShpc09wZXJhdG9yQ2hhcik7CiAgICAgIHJldHVybiAib3BlcmF0b3IiOwogICAgfQogICAgZWxzZSB7CiAgICAgIC8vIGdldCB0aGUgd2hpbGUgd29yZAogICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcd1wkX10vKTsKICAgICAgLy8gaXMgaXQgb25lIG9mIHRoZSBsaXN0ZWQga2V5d29yZHM/CiAgICAgIGlmIChrZXl3b3JkcyAmJiBrZXl3b3Jkcy5wcm9wZXJ0eUlzRW51bWVyYWJsZShzdHJlYW0uY3VycmVudCgpLnRvVXBwZXJDYXNlKCkpKSB7CiAgICAgICAgLy9rZXl3b3JkcyBjYW4gYmUgdXNlZCBhcyB2YXJpYWJsZXMgbGlrZSBmbGF0dGVuKGdyb3VwKSwgZ3JvdXAuJDAgZXRjLi4KICAgICAgICBpZiAoIXN0cmVhbS5lYXQoIikiKSAmJiAhc3RyZWFtLmVhdCgiLiIpKQogICAgICAgICAgcmV0dXJuICJrZXl3b3JkIjsKICAgICAgfQogICAgICAvLyBpcyBpdCBvbmUgb2YgdGhlIGJ1aWx0aW4gZnVuY3Rpb25zPwogICAgICBpZiAoYnVpbHRpbnMgJiYgYnVpbHRpbnMucHJvcGVydHlJc0VudW1lcmFibGUoc3RyZWFtLmN1cnJlbnQoKS50b1VwcGVyQ2FzZSgpKSkKICAgICAgICByZXR1cm4gInZhcmlhYmxlLTIiOwogICAgICAvLyBpcyBpdCBvbmUgb2YgdGhlIGxpc3RlZCB0eXBlcz8KICAgICAgaWYgKHR5cGVzICYmIHR5cGVzLnByb3BlcnR5SXNFbnVtZXJhYmxlKHN0cmVhbS5jdXJyZW50KCkudG9VcHBlckNhc2UoKSkpCiAgICAgICAgcmV0dXJuICJ2YXJpYWJsZS0zIjsKICAgICAgLy8gZGVmYXVsdCBpcyBhICd2YXJpYWJsZScKICAgICAgcmV0dXJuICJ2YXJpYWJsZSI7CiAgICB9CiAgfQoKICAvLyBJbnRlcmZhY2UKICByZXR1cm4gewogICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgdG9rZW5pemU6IHRva2VuQmFzZSwKICAgICAgICBzdGFydE9mTGluZTogdHJ1ZQogICAgICB9OwogICAgfSwKCiAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICBpZihzdHJlYW0uZWF0U3BhY2UoKSkgcmV0dXJuIG51bGw7CiAgICAgIHZhciBzdHlsZSA9IHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgICByZXR1cm4gc3R5bGU7CiAgICB9CiAgfTsKfSk7CgooZnVuY3Rpb24oKSB7CiAgZnVuY3Rpb24ga2V5d29yZHMoc3RyKSB7CiAgICB2YXIgb2JqID0ge30sIHdvcmRzID0gc3RyLnNwbGl0KCIgIik7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHdvcmRzLmxlbmd0aDsgKytpKSBvYmpbd29yZHNbaV1dID0gdHJ1ZTsKICAgIHJldHVybiBvYmo7CiAgfQoKICAvLyBidWlsdGluIGZ1bmNzIHRha2VuIGZyb20gdHJ1bmsgcmV2aXNpb24gMTMwMzIzNwogIHZhciBwQnVpbHRpbnMgPSAiQUJTIEFDT1MgQVJJVFkgQVNJTiBBVEFOIEFWRyBCQUdTSVpFIEJJTlNUT1JBR0UgQkxPT00gQlVJTERCTE9PTSBDQlJUIENFSUwgIgogICAgKyAiQ09OQ0FUIENPUiBDT1MgQ09TSCBDT1VOVCBDT1VOVF9TVEFSIENPViBDT05TVEFOVFNJWkUgQ1VCRURJTUVOU0lPTlMgRElGRiBESVNUSU5DVCBET1VCTEVBQlMgIgogICAgKyAiRE9VQkxFQVZHIERPVUJMRUJBU0UgRE9VQkxFTUFYIERPVUJMRU1JTiBET1VCTEVST1VORCBET1VCTEVTVU0gRVhQIEZMT09SIEZMT0FUQUJTIEZMT0FUQVZHICIKICAgICsgIkZMT0FUTUFYIEZMT0FUTUlOIEZMT0FUUk9VTkQgRkxPQVRTVU0gR0VORVJJQ0lOVk9LRVIgSU5ERVhPRiBJTlRBQlMgSU5UQVZHIElOVE1BWCBJTlRNSU4gIgogICAgKyAiSU5UU1VNIElOVk9LRUZPUkRPVUJMRSBJTlZPS0VGT1JGTE9BVCBJTlZPS0VGT1JJTlQgSU5WT0tFRk9STE9ORyBJTlZPS0VGT1JTVFJJTkcgSU5WT0tFUiAiCiAgICArICJJU0VNUFRZIEpTT05MT0FERVIgSlNPTk1FVEFEQVRBIEpTT05TVE9SQUdFIExBU1RfSU5ERVhfT0YgTENGSVJTVCBMT0cgTE9HMTAgTE9XRVIgTE9OR0FCUyAiCiAgICArICJMT05HQVZHIExPTkdNQVggTE9OR01JTiBMT05HU1VNIE1BWCBNSU4gTUFQU0laRSBNT05JVE9SRURVREYgTk9OREVURVJNSU5JU1RJQyBPVVRQVVRTQ0hFTUEgICIKICAgICsgIlBJR1NUT1JBR0UgUElHU1RSRUFNSU5HIFJBTkRPTSBSRUdFWF9FWFRSQUNUIFJFR0VYX0VYVFJBQ1RfQUxMIFJFUExBQ0UgUk9VTkQgU0lOIFNJTkggU0laRSAiCiAgICArICJTUVJUIFNUUlNQTElUIFNVQlNUUklORyBTVU0gU1RSSU5HQ09OQ0FUIFNUUklOR01BWCBTVFJJTkdNSU4gU1RSSU5HU0laRSBUQU4gVEFOSCBUT0JBRyAiCiAgICArICJUT0tFTklaRSBUT01BUCBUT1AgVE9UVVBMRSBUUklNIFRFWFRMT0FERVIgVFVQTEVTSVpFIFVDRklSU1QgVVBQRVIgVVRGOFNUT1JBR0VDT05WRVJURVIgIjsKCiAgLy8gdGFrZW4gZnJvbSBRdWVyeUxleGVyLmcKICB2YXIgcEtleXdvcmRzID0gIlZPSUQgSU1QT1JUIFJFVFVSTlMgREVGSU5FIExPQUQgRklMVEVSIEZPUkVBQ0ggT1JERVIgQ1VCRSBESVNUSU5DVCBDT0dST1VQICIKICAgICsgIkpPSU4gQ1JPU1MgVU5JT04gU1BMSVQgSU5UTyBJRiBPVEhFUldJU0UgQUxMIEFTIEJZIFVTSU5HIElOTkVSIE9VVEVSIE9OU0NIRU1BIFBBUkFMTEVMICIKICAgICsgIlBBUlRJVElPTiBHUk9VUCBBTkQgT1IgTk9UIEdFTkVSQVRFIEZMQVRURU4gQVNDIERFU0MgSVMgU1RSRUFNIFRIUk9VR0ggU1RPUkUgTUFQUkVEVUNFICIKICAgICsgIlNISVAgQ0FDSEUgSU5QVVQgT1VUUFVUIFNUREVSUk9SIFNURElOIFNURE9VVCBMSU1JVCBTQU1QTEUgTEVGVCBSSUdIVCBGVUxMIEVRIEdUIExUIEdURSBMVEUgIgogICAgKyAiTkVRIE1BVENIRVMgVFJVRSBGQUxTRSBEVU1QIjsKCiAgLy8gZGF0YSB0eXBlcwogIHZhciBwVHlwZXMgPSAiQk9PTEVBTiBJTlQgTE9ORyBGTE9BVCBET1VCTEUgQ0hBUkFSUkFZIEJZVEVBUlJBWSBCQUcgVFVQTEUgTUFQICI7CgogIENvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC94LXBpZyIsIHsKICAgIG5hbWU6ICJwaWciLAogICAgYnVpbHRpbnM6IGtleXdvcmRzKHBCdWlsdGlucyksCiAgICBrZXl3b3Jkczoga2V5d29yZHMocEtleXdvcmRzKSwKICAgIHR5cGVzOiBrZXl3b3JkcyhwVHlwZXMpCiAgfSk7CgogIENvZGVNaXJyb3IucmVnaXN0ZXJIZWxwZXIoImhpbnRXb3JkcyIsICJwaWciLCAocEJ1aWx0aW5zICsgcFR5cGVzICsgcEtleXdvcmRzKS5zcGxpdCgiICIpKTsKfSgpKTsKCn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/powershell/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/powershell/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+CjxodG1sPgogIDxoZWFkPgogICAgPG1ldGEgY2hhcnNldD0idXRmLTgiPgogICAgPHRpdGxlPkNvZGVNaXJyb3I6IFBvd2Vyc2hlbGwgbW9kZTwvdGl0bGU+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2RvYy9kb2NzLmNzcyI+CiAgICA8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CiAgICA8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9InBvd2Vyc2hlbGwuanMiPjwvc2NyaXB0PgogICAgPHN0eWxlPi5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazt9PC9zdHlsZT4KICA8L2hlYWQ+CiAgPGJvZHk+CiAgICA8ZGl2IGlkPW5hdj4KICAgICAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aDE+Q29kZU1pcnJvcjwvaDE+PGltZyBpZD1sb2dvIHNyYz0iLi4vLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogICAgICA8dWw+CiAgICAgICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICAgICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9jb2RlbWlycm9yIj5Db2RlPC9hPgogICAgICA8L3VsPgogICAgICA8dWw+CiAgICAgICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+SmF2YVNjcmlwdDwvYT4KICAgICAgPC91bD4KICAgIDwvZGl2PgogICAgPGFydGljbGU+CiAgICAgIDxoMj5Qb3dlclNoZWxsIG1vZGU8L2gyPgoKICAgICAgPGRpdj48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgojIE51bWJlciBMaXRlcmFscwowIDEyMzQ1CjEya2IgMTJtYiAxMmdCIDEyVGIgMTJQQiAxMkwgMTJEIDEybGtiIDEyZHRiCjEuMjM0IDEuMjM0ZTU2IDEuIDEuZTIgLjIgLjJlMzQKMS4yTUIgMS5rYiAuMWRUYiAxLmUxZ2IKMHgxIDB4YWJjZGVmIDB4M3RiIDB4ZWxtYgoKIyBTdHJpbmcgTGl0ZXJhbHMKJ0xpdGVyYWwgZXNjYXBpbmcnJycKJ0xpdGVyYWwgJHZhcmlhYmxlJwoiRXNjYXBpbmcgMWAiIgoiRXNjYXBpbmcgMiIiIgoiRXNjYXBlZCBgJHZhcmlhYmxlIgoiVGV4dCwgJHZhcmlhYmxlIGFuZCBtb3JlIHRleHQiCiJUZXh0LCAke3ZhcmlhYmxlIHdpdGggc3BhY2VzfSBhbmQgbW9yZSB0ZXh0LiIKIlRleHQsICQoJGV4cHJlc3Npb24gKyAzKSBhbmQgbW9yZSB0ZXh0LiIKIlRleHQsICQoImludGVycG9sYXRpb24gJCgiaW5jZXB0aW9uIikiKSBhbmQgbW9yZSB0ZXh0LiIKCkAiCk11bHRpbGluZQpzdHJpbmcKIkAKIyAtLQpAIgpNdWx0aWxpbmUKc3RyaW5nIHdpdGggcXVvdGVzICInCiJACiMgLS0KQCcKTXVsdGlsaW5lIGxpdGVyYWwKc3RyaW5nIHdpdGggcXVvdGVzICInCidACgojIEFycmF5IGFuZCBIYXNoIGxpdGVyYWxzCkAoICdhJywnYicsJ2MnICkKQHsgJ2tleSc6ICd2YWx1ZScgfQoKIyBWYXJpYWJsZXMKJFZhcmlhYmxlID0gNQokZ2xvYmFsOnZhcmlhYmxlID0gNQoke1ZhcmlhYmxlIHdpdGggc3BhY2VzfSA9IDUKCiMgT3BlcmF0b3JzCj0gKz0gLT0gKj0gLz0gJT0KKysgLS0gLi4gLWYgKiAvICUgKyAtCi1ub3QgISAtYm5vdAotc3BsaXQgLWlzcGxpdCAtY3NwbGl0Ci1qb2luCi1pcyAtaXNub3QgLWFzCi1lcSAtaWVxIC1jZXEgLW5lIC1pbmUgLWNuZQotZ3QgLWlndCAtY2d0IC1nZSAtaWdlIC1jZ2UKLWx0IC1pbHQgLWNsdCAtbGUgLWlsZSAtY2xlCi1saWtlIC1pbGlrZSAtY2xpa2UgLW5vdGxpa2UgLWlub3RsaWtlIC1jbm90bGlrZQotbWF0Y2ggLWltYXRjaCAtY21hdGNoIC1ub3RtYXRjaCAtaW5vdG1hdGNoIC1jbm90bWF0Y2gKLWNvbnRhaW5zIC1pY29udGFpbnMgLWNjb250YWlucyAtbm90Y29udGFpbnMgLWlub3Rjb250YWlucyAtY25vdGNvbnRhaW5zCi1yZXBsYWNlIC1pcmVwbGFjZSAtY3JlcGxhY2UKLWJhbmQJLWJvciAtYnhvcgotYW5kIC1vciAteG9yCgojIFB1bmN0dWF0aW9uCigpIFtdIHt9ICwgOiBgID0gOyAuCgojIEtleXdvcmRzCmVsc2VpZiBiZWdpbiBmdW5jdGlvbiBmb3IgZm9yZWFjaCByZXR1cm4gZWxzZSB0cmFwIHdoaWxlIGRvIGRhdGEgZHluYW1pY3BhcmFtCnVudGlsIGVuZCBicmVhayBpZiB0aHJvdyBwYXJhbSBjb250aW51ZSBmaW5hbGx5IGluIHN3aXRjaCBleGl0IGZpbHRlciBmcm9tIHRyeQpwcm9jZXNzIGNhdGNoCgojIEJ1aWx0LWluIHZhcmlhYmxlcwokJCAkPyAkXiAkXwokYXJncyAkQ29uZmlybVByZWZlcmVuY2UgJENvbnNvbGVGaWxlTmFtZSAkRGVidWdQcmVmZXJlbmNlICRFcnJvcgokRXJyb3JBY3Rpb25QcmVmZXJlbmNlICRFcnJvclZpZXcgJEV4ZWN1dGlvbkNvbnRleHQgJGZhbHNlICRGb3JtYXRFbnVtZXJhdGlvbkxpbWl0CiRIT01FICRIb3N0ICRpbnB1dCAkTWF4aW11bUFsaWFzQ291bnQgJE1heGltdW1Ecml2ZUNvdW50ICRNYXhpbXVtRXJyb3JDb3VudAokTWF4aW11bUZ1bmN0aW9uQ291bnQgJE1heGltdW1IaXN0b3J5Q291bnQgJE1heGltdW1WYXJpYWJsZUNvdW50ICRNeUludm9jYXRpb24KJE5lc3RlZFByb21wdExldmVsICRudWxsICRPdXRwdXRFbmNvZGluZyAkUElEICRQUk9GSUxFICRQcm9ncmVzc1ByZWZlcmVuY2UKJFBTQm91bmRQYXJhbWV0ZXJzICRQU0NvbW1hbmRQYXRoICRQU0N1bHR1cmUgJFBTRGVmYXVsdFBhcmFtZXRlclZhbHVlcwokUFNFbWFpbFNlcnZlciAkUFNIT01FICRQU1NjcmlwdFJvb3QgJFBTU2Vzc2lvbkFwcGxpY2F0aW9uTmFtZQokUFNTZXNzaW9uQ29uZmlndXJhdGlvbk5hbWUgJFBTU2Vzc2lvbk9wdGlvbiAkUFNVSUN1bHR1cmUgJFBTVmVyc2lvblRhYmxlICRQV0QKJFNoZWxsSWQgJFN0YWNrVHJhY2UgJHRydWUgJFZlcmJvc2VQcmVmZXJlbmNlICRXYXJuaW5nUHJlZmVyZW5jZSAkV2hhdElmUHJlZmVyZW5jZQokdHJ1ZSAkZmFsc2UgJG51bGwKCiMgQnVpbHQtaW4gZnVuY3Rpb25zCkE6CkFkZC1Db21wdXRlciBBZGQtQ29udGVudCBBZGQtSGlzdG9yeSBBZGQtTWVtYmVyIEFkZC1QU1NuYXBpbiBBZGQtVHlwZQpCOgpDOgpDaGVja3BvaW50LUNvbXB1dGVyIENsZWFyLUNvbnRlbnQgQ2xlYXItRXZlbnRMb2cgQ2xlYXItSGlzdG9yeSBDbGVhci1Ib3N0IENsZWFyLUl0ZW0KQ2xlYXItSXRlbVByb3BlcnR5IENsZWFyLVZhcmlhYmxlIENvbXBhcmUtT2JqZWN0IENvbXBsZXRlLVRyYW5zYWN0aW9uIENvbm5lY3QtUFNTZXNzaW9uCkNvbnZlcnRGcm9tLUNzdiBDb252ZXJ0RnJvbS1Kc29uIENvbnZlcnRGcm9tLVNlY3VyZVN0cmluZyBDb252ZXJ0RnJvbS1TdHJpbmdEYXRhCkNvbnZlcnQtUGF0aCBDb252ZXJ0VG8tQ3N2IENvbnZlcnRUby1IdG1sIENvbnZlcnRUby1Kc29uIENvbnZlcnRUby1TZWN1cmVTdHJpbmcKQ29udmVydFRvLVhtbCBDb3B5LUl0ZW0gQ29weS1JdGVtUHJvcGVydHkKRDoKRGVidWctUHJvY2VzcyBEaXNhYmxlLUNvbXB1dGVyUmVzdG9yZSBEaXNhYmxlLVBTQnJlYWtwb2ludCBEaXNhYmxlLVBTUmVtb3RpbmcKRGlzYWJsZS1QU1Nlc3Npb25Db25maWd1cmF0aW9uIERpc2Nvbm5lY3QtUFNTZXNzaW9uCkU6CkVuYWJsZS1Db21wdXRlclJlc3RvcmUgRW5hYmxlLVBTQnJlYWtwb2ludCBFbmFibGUtUFNSZW1vdGluZyBFbmFibGUtUFNTZXNzaW9uQ29uZmlndXJhdGlvbgpFbnRlci1QU1Nlc3Npb24gRXhpdC1QU1Nlc3Npb24gRXhwb3J0LUFsaWFzIEV4cG9ydC1DbGl4bWwgRXhwb3J0LUNvbnNvbGUgRXhwb3J0LUNvdW50ZXIKRXhwb3J0LUNzdiBFeHBvcnQtRm9ybWF0RGF0YSBFeHBvcnQtTW9kdWxlTWVtYmVyIEV4cG9ydC1QU1Nlc3Npb24KRjoKRm9yRWFjaC1PYmplY3QgRm9ybWF0LUN1c3RvbSBGb3JtYXQtTGlzdCBGb3JtYXQtVGFibGUgRm9ybWF0LVdpZGUKRzoKR2V0LUFjbCBHZXQtQWxpYXMgR2V0LUF1dGhlbnRpY29kZVNpZ25hdHVyZSBHZXQtQ2hpbGRJdGVtIEdldC1Db21tYW5kIEdldC1Db21wdXRlclJlc3RvcmVQb2ludApHZXQtQ29udGVudCBHZXQtQ29udHJvbFBhbmVsSXRlbSBHZXQtQ291bnRlciBHZXQtQ3JlZGVudGlhbCBHZXQtQ3VsdHVyZSBHZXQtRGF0ZQpHZXQtRXZlbnQgR2V0LUV2ZW50TG9nIEdldC1FdmVudFN1YnNjcmliZXIgR2V0LUV4ZWN1dGlvblBvbGljeSBHZXQtRm9ybWF0RGF0YSBHZXQtSGVscApHZXQtSGlzdG9yeSBHZXQtSG9zdCBHZXQtSG90Rml4IEdldC1JdGVtIEdldC1JdGVtUHJvcGVydHkgR2V0LUpvYiBHZXQtTG9jYXRpb24gR2V0LU1lbWJlcgpHZXQtTW9kdWxlIEdldC1QZnhDZXJ0aWZpY2F0ZSBHZXQtUHJvY2VzcyBHZXQtUFNCcmVha3BvaW50IEdldC1QU0NhbGxTdGFjayBHZXQtUFNEcml2ZQpHZXQtUFNQcm92aWRlciBHZXQtUFNTZXNzaW9uIEdldC1QU1Nlc3Npb25Db25maWd1cmF0aW9uIEdldC1QU1NuYXBpbiBHZXQtUmFuZG9tIEdldC1TZXJ2aWNlCkdldC1UcmFjZVNvdXJjZSBHZXQtVHJhbnNhY3Rpb24gR2V0LVR5cGVEYXRhIEdldC1VSUN1bHR1cmUgIEdldC1VbmlxdWUgR2V0LVZhcmlhYmxlIEdldC1WZXJiCkdldC1XaW5FdmVudCBHZXQtV21pT2JqZWN0IEdyb3VwLU9iamVjdApIOgpoZWxwCkk6CkltcG9ydC1BbGlhcyBJbXBvcnQtQ2xpeG1sIEltcG9ydC1Db3VudGVyIEltcG9ydC1Dc3YgSW1wb3J0LUxvY2FsaXplZERhdGEgSW1wb3J0LU1vZHVsZQpJbXBvcnQtUFNTZXNzaW9uIEltcG9ydFN5c3RlbU1vZHVsZXMgSW52b2tlLUNvbW1hbmQgSW52b2tlLUV4cHJlc3Npb24gSW52b2tlLUhpc3RvcnkKSW52b2tlLUl0ZW0gSW52b2tlLVJlc3RNZXRob2QgSW52b2tlLVdlYlJlcXVlc3QgSW52b2tlLVdtaU1ldGhvZApKOgpKb2luLVBhdGgKSzoKTDoKTGltaXQtRXZlbnRMb2cKTToKTWVhc3VyZS1Db21tYW5kIE1lYXN1cmUtT2JqZWN0IG1rZGlyIG1vcmUgTW92ZS1JdGVtIE1vdmUtSXRlbVByb3BlcnR5Ck46Ck5ldy1BbGlhcyBOZXctRXZlbnQgTmV3LUV2ZW50TG9nIE5ldy1JdGVtIE5ldy1JdGVtUHJvcGVydHkgTmV3LU1vZHVsZSBOZXctTW9kdWxlTWFuaWZlc3QKTmV3LU9iamVjdCBOZXctUFNEcml2ZSBOZXctUFNTZXNzaW9uIE5ldy1QU1Nlc3Npb25Db25maWd1cmF0aW9uRmlsZSBOZXctUFNTZXNzaW9uT3B0aW9uCk5ldy1QU1RyYW5zcG9ydE9wdGlvbiBOZXctU2VydmljZSBOZXctVGltZVNwYW4gTmV3LVZhcmlhYmxlIE5ldy1XZWJTZXJ2aWNlUHJveHkKTmV3LVdpbkV2ZW50Ck86Cm9zcyBPdXQtRGVmYXVsdCBPdXQtRmlsZSBPdXQtR3JpZFZpZXcgT3V0LUhvc3QgT3V0LU51bGwgT3V0LVByaW50ZXIgT3V0LVN0cmluZwpQOgpQYXVzZSBQb3AtTG9jYXRpb24gcHJvbXB0IFB1c2gtTG9jYXRpb24KUToKUjoKUmVhZC1Ib3N0IFJlY2VpdmUtSm9iIFJlY2VpdmUtUFNTZXNzaW9uIFJlZ2lzdGVyLUVuZ2luZUV2ZW50IFJlZ2lzdGVyLU9iamVjdEV2ZW50ClJlZ2lzdGVyLVBTU2Vzc2lvbkNvbmZpZ3VyYXRpb24gUmVnaXN0ZXItV21pRXZlbnQgUmVtb3ZlLUNvbXB1dGVyIFJlbW92ZS1FdmVudApSZW1vdmUtRXZlbnRMb2cgUmVtb3ZlLUl0ZW0gUmVtb3ZlLUl0ZW1Qcm9wZXJ0eSBSZW1vdmUtSm9iIFJlbW92ZS1Nb2R1bGUKUmVtb3ZlLVBTQnJlYWtwb2ludCBSZW1vdmUtUFNEcml2ZSBSZW1vdmUtUFNTZXNzaW9uIFJlbW92ZS1QU1NuYXBpbiBSZW1vdmUtVHlwZURhdGEKUmVtb3ZlLVZhcmlhYmxlIFJlbW92ZS1XbWlPYmplY3QgUmVuYW1lLUNvbXB1dGVyIFJlbmFtZS1JdGVtIFJlbmFtZS1JdGVtUHJvcGVydHkKUmVzZXQtQ29tcHV0ZXJNYWNoaW5lUGFzc3dvcmQgUmVzb2x2ZS1QYXRoIFJlc3RhcnQtQ29tcHV0ZXIgUmVzdGFydC1TZXJ2aWNlClJlc3RvcmUtQ29tcHV0ZXIgUmVzdW1lLUpvYiBSZXN1bWUtU2VydmljZQpTOgpTYXZlLUhlbHAgU2VsZWN0LU9iamVjdCBTZWxlY3QtU3RyaW5nIFNlbGVjdC1YbWwgU2VuZC1NYWlsTWVzc2FnZSBTZXQtQWNsIFNldC1BbGlhcwpTZXQtQXV0aGVudGljb2RlU2lnbmF0dXJlIFNldC1Db250ZW50IFNldC1EYXRlIFNldC1FeGVjdXRpb25Qb2xpY3kgU2V0LUl0ZW0KU2V0LUl0ZW1Qcm9wZXJ0eSBTZXQtTG9jYXRpb24gU2V0LVBTQnJlYWtwb2ludCBTZXQtUFNEZWJ1ZwpTZXQtUFNTZXNzaW9uQ29uZmlndXJhdGlvbiBTZXQtU2VydmljZSBTZXQtU3RyaWN0TW9kZSBTZXQtVHJhY2VTb3VyY2UgU2V0LVZhcmlhYmxlClNldC1XbWlJbnN0YW5jZSBTaG93LUNvbW1hbmQgU2hvdy1Db250cm9sUGFuZWxJdGVtIFNob3ctRXZlbnRMb2cgU29ydC1PYmplY3QKU3BsaXQtUGF0aCBTdGFydC1Kb2IgU3RhcnQtUHJvY2VzcyBTdGFydC1TZXJ2aWNlIFN0YXJ0LVNsZWVwIFN0YXJ0LVRyYW5zYWN0aW9uClN0YXJ0LVRyYW5zY3JpcHQgU3RvcC1Db21wdXRlciBTdG9wLUpvYiBTdG9wLVByb2Nlc3MgU3RvcC1TZXJ2aWNlIFN0b3AtVHJhbnNjcmlwdApTdXNwZW5kLUpvYiBTdXNwZW5kLVNlcnZpY2UKVDoKVGFiRXhwYW5zaW9uMiBUZWUtT2JqZWN0IFRlc3QtQ29tcHV0ZXJTZWN1cmVDaGFubmVsIFRlc3QtQ29ubmVjdGlvbgpUZXN0LU1vZHVsZU1hbmlmZXN0IFRlc3QtUGF0aCBUZXN0LVBTU2Vzc2lvbkNvbmZpZ3VyYXRpb25GaWxlIFRyYWNlLUNvbW1hbmQKVToKVW5ibG9jay1GaWxlIFVuZG8tVHJhbnNhY3Rpb24gVW5yZWdpc3Rlci1FdmVudCBVbnJlZ2lzdGVyLVBTU2Vzc2lvbkNvbmZpZ3VyYXRpb24KVXBkYXRlLUZvcm1hdERhdGEgVXBkYXRlLUhlbHAgVXBkYXRlLUxpc3QgVXBkYXRlLVR5cGVEYXRhIFVzZS1UcmFuc2FjdGlvbgpWOgpXOgpXYWl0LUV2ZW50IFdhaXQtSm9iIFdhaXQtUHJvY2VzcyBXaGVyZS1PYmplY3QgV3JpdGUtRGVidWcgV3JpdGUtRXJyb3IgV3JpdGUtRXZlbnRMb2cKV3JpdGUtSG9zdCBXcml0ZS1PdXRwdXQgV3JpdGUtUHJvZ3Jlc3MgV3JpdGUtVmVyYm9zZSBXcml0ZS1XYXJuaW5nClg6Clk6Clo6PC90ZXh0YXJlYT48L2Rpdj4KICAgICAgPHNjcmlwdD4KICAgICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgICAgICAgbW9kZTogInBvd2Vyc2hlbGwiLAogICAgICAgICAgbGluZU51bWJlcnM6IHRydWUsCiAgICAgICAgICBpbmRlbnRVbml0OiA0LAogICAgICAgICAgdGFiTW9kZTogInNoaWZ0IiwKICAgICAgICAgIG1hdGNoQnJhY2tldHM6IHRydWUKICAgICAgICB9KTsKICAgICAgPC9zY3JpcHQ+CgogICAgICA8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+YXBwbGljYXRpb24veC1wb3dlcnNoZWxsPC9jb2RlPi48L3A+CiAgICA8L2FydGljbGU+CiAgPC9ib2R5Pgo8L2h0bWw+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/powershell/powershell.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgJ3VzZSBzdHJpY3QnOwogIGlmICh0eXBlb2YgZXhwb3J0cyA9PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnKSAvLyBDb21tb25KUwogICAgbW9kKHJlcXVpcmUoJ2NvZGVtaXJyb3InKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsnY29kZW1pcnJvciddLCBtb2QpOwogIGVsc2UgLy8gUGxhaW4gYnJvd3NlciBlbnYKICAgIG1vZCh3aW5kb3cuQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKJ3VzZSBzdHJpY3QnOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCdwb3dlcnNoZWxsJywgZnVuY3Rpb24oKSB7CiAgZnVuY3Rpb24gYnVpbGRSZWdleHAocGF0dGVybnMsIG9wdGlvbnMpIHsKICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwogICAgdmFyIHByZWZpeCA9IG9wdGlvbnMucHJlZml4ICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLnByZWZpeCA6ICdeJzsKICAgIHZhciBzdWZmaXggPSBvcHRpb25zLnN1ZmZpeCAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5zdWZmaXggOiAnXFxiJzsKCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhdHRlcm5zLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmIChwYXR0ZXJuc1tpXSBpbnN0YW5jZW9mIFJlZ0V4cCkgewogICAgICAgIHBhdHRlcm5zW2ldID0gcGF0dGVybnNbaV0uc291cmNlOwogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIHBhdHRlcm5zW2ldID0gcGF0dGVybnNbaV0ucmVwbGFjZSgvWy1cL1xcXiQqKz8uKCl8W1xde31dL2csICdcXCQmJyk7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gbmV3IFJlZ0V4cChwcmVmaXggKyAnKCcgKyBwYXR0ZXJucy5qb2luKCd8JykgKyAnKScgKyBzdWZmaXgsICdpJyk7CiAgfQoKICB2YXIgbm90Q2hhcmFjdGVyT3JEYXNoID0gJyg/PVteQS1aYS16XFxkXFwtX118JCknOwogIHZhciB2YXJOYW1lcyA9IC9bXHdcLTpdLwogIHZhciBrZXl3b3JkcyA9IGJ1aWxkUmVnZXhwKFsKICAgIC9iZWdpbnxicmVha3xjYXRjaHxjb250aW51ZXxkYXRhfGRlZmF1bHR8ZG98ZHluYW1pY3BhcmFtLywKICAgIC9lbHNlfGVsc2VpZnxlbmR8ZXhpdHxmaWx0ZXJ8ZmluYWxseXxmb3J8Zm9yZWFjaHxmcm9tfGZ1bmN0aW9ufGlmfGluLywKICAgIC9wYXJhbXxwcm9jZXNzfHJldHVybnxzd2l0Y2h8dGhyb3d8dHJhcHx0cnl8dW50aWx8d2hlcmV8d2hpbGUvCiAgXSwgeyBzdWZmaXg6IG5vdENoYXJhY3Rlck9yRGFzaCB9KTsKCiAgdmFyIHB1bmN0dWF0aW9uID0gL1tcW1xde30sO2BcLl18QFsoe10vOwogIHZhciB3b3JkT3BlcmF0b3JzID0gYnVpbGRSZWdleHAoWwogICAgJ2YnLAogICAgL2I/bm90LywKICAgIC9baWNdP3NwbGl0LywgJ2pvaW4nLAogICAgL2lzKG5vdCk/LywgJ2FzJywKICAgIC9baWNdPyhlcXxuZXxbZ2xdW3RlXSkvLAogICAgL1tpY10/KG5vdCk/KGxpa2V8bWF0Y2h8Y29udGFpbnMpLywKICAgIC9baWNdP3JlcGxhY2UvLAogICAgL2I/KGFuZHxvcnx4b3IpLwogIF0sIHsgcHJlZml4OiAnLScgfSk7CiAgdmFyIHN5bWJvbE9wZXJhdG9ycyA9IC9bK1wtKlwvJV09fFwrXCt8LS18XC5cLnxbK1wtKiZeJTo9IXxcL118PCg/ISMpfCg/ISMpPi87CiAgdmFyIG9wZXJhdG9ycyA9IGJ1aWxkUmVnZXhwKFt3b3JkT3BlcmF0b3JzLCBzeW1ib2xPcGVyYXRvcnNdLCB7IHN1ZmZpeDogJycgfSk7CgogIHZhciBudW1iZXJzID0gL14oKDB4W1xkYS1mXSspfCgoXGQrXC5cZCt8XGRcLnxcLlxkK3xcZCspKGVbXCtcLV0/XGQrKT8pKVtsZF0/KFtrbWd0cF1iKT8vaTsKCiAgdmFyIGlkZW50aWZpZXJzID0gL15bQS1aYS16XF9dW0EtWmEtelwtXF9cZF0qXGIvOwoKICB2YXIgc3ltYm9sQnVpbHRpbnMgPSAvW0EtWl06fCV8XD8vaTsKICB2YXIgbmFtZWRCdWlsdGlucyA9IGJ1aWxkUmVnZXhwKFsKICAgIC9BZGQtKENvbXB1dGVyfENvbnRlbnR8SGlzdG9yeXxNZW1iZXJ8UFNTbmFwaW58VHlwZSkvLAogICAgL0NoZWNrcG9pbnQtQ29tcHV0ZXIvLAogICAgL0NsZWFyLShDb250ZW50fEV2ZW50TG9nfEhpc3Rvcnl8SG9zdHxJdGVtKFByb3BlcnR5KT98VmFyaWFibGUpLywKICAgIC9Db21wYXJlLU9iamVjdC8sCiAgICAvQ29tcGxldGUtVHJhbnNhY3Rpb24vLAogICAgL0Nvbm5lY3QtUFNTZXNzaW9uLywKICAgIC9Db252ZXJ0RnJvbS0oQ3N2fEpzb258U2VjdXJlU3RyaW5nfFN0cmluZ0RhdGEpLywKICAgIC9Db252ZXJ0LVBhdGgvLAogICAgL0NvbnZlcnRUby0oQ3N2fEh0bWx8SnNvbnxTZWN1cmVTdHJpbmd8WG1sKS8sCiAgICAvQ29weS1JdGVtKFByb3BlcnR5KT8vLAogICAgL0RlYnVnLVByb2Nlc3MvLAogICAgL0Rpc2FibGUtKENvbXB1dGVyUmVzdG9yZXxQU0JyZWFrcG9pbnR8UFNSZW1vdGluZ3xQU1Nlc3Npb25Db25maWd1cmF0aW9uKS8sCiAgICAvRGlzY29ubmVjdC1QU1Nlc3Npb24vLAogICAgL0VuYWJsZS0oQ29tcHV0ZXJSZXN0b3JlfFBTQnJlYWtwb2ludHxQU1JlbW90aW5nfFBTU2Vzc2lvbkNvbmZpZ3VyYXRpb24pLywKICAgIC8oRW50ZXJ8RXhpdCktUFNTZXNzaW9uLywKICAgIC9FeHBvcnQtKEFsaWFzfENsaXhtbHxDb25zb2xlfENvdW50ZXJ8Q3N2fEZvcm1hdERhdGF8TW9kdWxlTWVtYmVyfFBTU2Vzc2lvbikvLAogICAgL0ZvckVhY2gtT2JqZWN0LywKICAgIC9Gb3JtYXQtKEN1c3RvbXxMaXN0fFRhYmxlfFdpZGUpLywKICAgIG5ldyBSZWdFeHAoJ0dldC0oQWNsfEFsaWFzfEF1dGhlbnRpY29kZVNpZ25hdHVyZXxDaGlsZEl0ZW18Q29tbWFuZHxDb21wdXRlclJlc3RvcmVQb2ludHxDb250ZW50fENvbnRyb2xQYW5lbEl0ZW18Q291bnRlcnxDcmVkZW50aWFsJwogICAgICArICd8Q3VsdHVyZXxEYXRlfEV2ZW50fEV2ZW50TG9nfEV2ZW50U3Vic2NyaWJlcnxFeGVjdXRpb25Qb2xpY3l8Rm9ybWF0RGF0YXxIZWxwfEhpc3Rvcnl8SG9zdHxIb3RGaXh8SXRlbXxJdGVtUHJvcGVydHl8Sm9iJwogICAgICArICd8TG9jYXRpb258TWVtYmVyfE1vZHVsZXxQZnhDZXJ0aWZpY2F0ZXxQcm9jZXNzfFBTQnJlYWtwb2ludHxQU0NhbGxTdGFja3xQU0RyaXZlfFBTUHJvdmlkZXJ8UFNTZXNzaW9ufFBTU2Vzc2lvbkNvbmZpZ3VyYXRpb24nCiAgICAgICsgJ3xQU1NuYXBpbnxSYW5kb218U2VydmljZXxUcmFjZVNvdXJjZXxUcmFuc2FjdGlvbnxUeXBlRGF0YXxVSUN1bHR1cmV8VW5pcXVlfFZhcmlhYmxlfFZlcmJ8V2luRXZlbnR8V21pT2JqZWN0KScpLAogICAgL0dyb3VwLU9iamVjdC8sCiAgICAvSW1wb3J0LShBbGlhc3xDbGl4bWx8Q291bnRlcnxDc3Z8TG9jYWxpemVkRGF0YXxNb2R1bGV8UFNTZXNzaW9uKS8sCiAgICAvSW1wb3J0U3lzdGVtTW9kdWxlcy8sCiAgICAvSW52b2tlLShDb21tYW5kfEV4cHJlc3Npb258SGlzdG9yeXxJdGVtfFJlc3RNZXRob2R8V2ViUmVxdWVzdHxXbWlNZXRob2QpLywKICAgIC9Kb2luLVBhdGgvLAogICAgL0xpbWl0LUV2ZW50TG9nLywKICAgIC9NZWFzdXJlLShDb21tYW5kfE9iamVjdCkvLAogICAgL01vdmUtSXRlbShQcm9wZXJ0eSk/LywKICAgIG5ldyBSZWdFeHAoJ05ldy0oQWxpYXN8RXZlbnR8RXZlbnRMb2d8SXRlbShQcm9wZXJ0eSk/fE1vZHVsZXxNb2R1bGVNYW5pZmVzdHxPYmplY3R8UFNEcml2ZXxQU1Nlc3Npb258UFNTZXNzaW9uQ29uZmlndXJhdGlvbkZpbGUnCiAgICAgICsgJ3xQU1Nlc3Npb25PcHRpb258UFNUcmFuc3BvcnRPcHRpb258U2VydmljZXxUaW1lU3BhbnxWYXJpYWJsZXxXZWJTZXJ2aWNlUHJveHl8V2luRXZlbnQpJyksCiAgICAvT3V0LShEZWZhdWx0fEZpbGV8R3JpZFZpZXd8SG9zdHxOdWxsfFByaW50ZXJ8U3RyaW5nKS8sCiAgICAvUGF1c2UvLAogICAgLyhQb3B8UHVzaCktTG9jYXRpb24vLAogICAgL1JlYWQtSG9zdC8sCiAgICAvUmVjZWl2ZS0oSm9ifFBTU2Vzc2lvbikvLAogICAgL1JlZ2lzdGVyLShFbmdpbmVFdmVudHxPYmplY3RFdmVudHxQU1Nlc3Npb25Db25maWd1cmF0aW9ufFdtaUV2ZW50KS8sCiAgICAvUmVtb3ZlLShDb21wdXRlcnxFdmVudHxFdmVudExvZ3xJdGVtKFByb3BlcnR5KT98Sm9ifE1vZHVsZXxQU0JyZWFrcG9pbnR8UFNEcml2ZXxQU1Nlc3Npb258UFNTbmFwaW58VHlwZURhdGF8VmFyaWFibGV8V21pT2JqZWN0KS8sCiAgICAvUmVuYW1lLShDb21wdXRlcnxJdGVtKFByb3BlcnR5KT8pLywKICAgIC9SZXNldC1Db21wdXRlck1hY2hpbmVQYXNzd29yZC8sCiAgICAvUmVzb2x2ZS1QYXRoLywKICAgIC9SZXN0YXJ0LShDb21wdXRlcnxTZXJ2aWNlKS8sCiAgICAvUmVzdG9yZS1Db21wdXRlci8sCiAgICAvUmVzdW1lLShKb2J8U2VydmljZSkvLAogICAgL1NhdmUtSGVscC8sCiAgICAvU2VsZWN0LShPYmplY3R8U3RyaW5nfFhtbCkvLAogICAgL1NlbmQtTWFpbE1lc3NhZ2UvLAogICAgbmV3IFJlZ0V4cCgnU2V0LShBY2x8QWxpYXN8QXV0aGVudGljb2RlU2lnbmF0dXJlfENvbnRlbnR8RGF0ZXxFeGVjdXRpb25Qb2xpY3l8SXRlbShQcm9wZXJ0eSk/fExvY2F0aW9ufFBTQnJlYWtwb2ludHxQU0RlYnVnJyArCiAgICAgICAgICAgICAgICd8UFNTZXNzaW9uQ29uZmlndXJhdGlvbnxTZXJ2aWNlfFN0cmljdE1vZGV8VHJhY2VTb3VyY2V8VmFyaWFibGV8V21pSW5zdGFuY2UpJyksCiAgICAvU2hvdy0oQ29tbWFuZHxDb250cm9sUGFuZWxJdGVtfEV2ZW50TG9nKS8sCiAgICAvU29ydC1PYmplY3QvLAogICAgL1NwbGl0LVBhdGgvLAogICAgL1N0YXJ0LShKb2J8UHJvY2Vzc3xTZXJ2aWNlfFNsZWVwfFRyYW5zYWN0aW9ufFRyYW5zY3JpcHQpLywKICAgIC9TdG9wLShDb21wdXRlcnxKb2J8UHJvY2Vzc3xTZXJ2aWNlfFRyYW5zY3JpcHQpLywKICAgIC9TdXNwZW5kLShKb2J8U2VydmljZSkvLAogICAgL1RhYkV4cGFuc2lvbjIvLAogICAgL1RlZS1PYmplY3QvLAogICAgL1Rlc3QtKENvbXB1dGVyU2VjdXJlQ2hhbm5lbHxDb25uZWN0aW9ufE1vZHVsZU1hbmlmZXN0fFBhdGh8UFNTZXNzaW9uQ29uZmlndXJhdGlvbkZpbGUpLywKICAgIC9UcmFjZS1Db21tYW5kLywKICAgIC9VbmJsb2NrLUZpbGUvLAogICAgL1VuZG8tVHJhbnNhY3Rpb24vLAogICAgL1VucmVnaXN0ZXItKEV2ZW50fFBTU2Vzc2lvbkNvbmZpZ3VyYXRpb24pLywKICAgIC9VcGRhdGUtKEZvcm1hdERhdGF8SGVscHxMaXN0fFR5cGVEYXRhKS8sCiAgICAvVXNlLVRyYW5zYWN0aW9uLywKICAgIC9XYWl0LShFdmVudHxKb2J8UHJvY2VzcykvLAogICAgL1doZXJlLU9iamVjdC8sCiAgICAvV3JpdGUtKERlYnVnfEVycm9yfEV2ZW50TG9nfEhvc3R8T3V0cHV0fFByb2dyZXNzfFZlcmJvc2V8V2FybmluZykvLAogICAgL2NkfGhlbHB8bWtkaXJ8bW9yZXxvc3N8cHJvbXB0LywKICAgIC9hY3xhc25wfGNhdHxjZHxjaGRpcnxjbGN8Y2xlYXJ8Y2xoeXxjbGl8Y2xwfGNsc3xjbHZ8Y25zbnxjb21wYXJlfGNvcHl8Y3B8Y3BpfGNwcHxjdnBhfGRicHxkZWx8ZGlmZnxkaXJ8ZG5zbnxlYnAvLAogICAgL2VjaG98ZXBhbHxlcGNzdnxlcHNufGVyYXNlfGV0c258ZXhzbnxmY3xmbHxmb3JlYWNofGZ0fGZ3fGdhbHxnYnB8Z2N8Z2NpfGdjbXxnY3N8Z2RyfGdoeXxnaXxnamJ8Z2x8Z218Z21vfGdwfGdwcy8sCiAgICAvZ3JvdXB8Z3NufGdzbnB8Z3N2fGd1fGd2fGd3bWl8aHxoaXN0b3J5fGljbXxpZXh8aWh5fGlpfGlwYWx8aXBjc3Z8aXBtb3xpcHNufGlybXxpc2V8aXdtaXxpd3J8a2lsbHxscHxsc3xtYW58bWQvLAogICAgL21lYXN1cmV8bWl8bW91bnR8bW92ZXxtcHxtdnxuYWx8bmRyfG5pfG5tb3xucHNzY3xuc258bnZ8b2d2fG9ofHBvcGR8cHN8cHVzaGR8cHdkfHJ8cmJwfHJjamJ8cmNzbnxyZHxyZHJ8cmVufHJpLywKICAgIC9yamJ8cm18cm1kaXJ8cm1vfHJuaXxybnB8cnB8cnNufHJzbnB8cnVqYnxydnxydnBhfHJ3bWl8c2FqYnxzYWx8c2Fwc3xzYXN2fHNicHxzY3xzZWxlY3R8c2V0fHNoY218c2l8c2x8c2xlZXB8c2xzLywKICAgIC9zb3J0fHNwfHNwamJ8c3Bwc3xzcHN2fHN0YXJ0fHN1amJ8c3Z8c3dtaXx0ZWV8dHJjbXx0eXBlfHdoZXJlfHdqYnx3cml0ZS8KICBdLCB7IHByZWZpeDogJycsIHN1ZmZpeDogJycgfSk7CiAgdmFyIHZhcmlhYmxlQnVpbHRpbnMgPSBidWlsZFJlZ2V4cChbCiAgICAvWyQ/Xl9dfEFyZ3N8Q29uZmlybVByZWZlcmVuY2V8Q29uc29sZUZpbGVOYW1lfERlYnVnUHJlZmVyZW5jZXxFcnJvcnxFcnJvckFjdGlvblByZWZlcmVuY2V8RXJyb3JWaWV3fEV4ZWN1dGlvbkNvbnRleHQvLAogICAgL0Zvcm1hdEVudW1lcmF0aW9uTGltaXR8SG9tZXxIb3N0fElucHV0fE1heGltdW1BbGlhc0NvdW50fE1heGltdW1Ecml2ZUNvdW50fE1heGltdW1FcnJvckNvdW50fE1heGltdW1GdW5jdGlvbkNvdW50LywKICAgIC9NYXhpbXVtSGlzdG9yeUNvdW50fE1heGltdW1WYXJpYWJsZUNvdW50fE15SW52b2NhdGlvbnxOZXN0ZWRQcm9tcHRMZXZlbHxPdXRwdXRFbmNvZGluZ3xQaWR8UHJvZmlsZXxQcm9ncmVzc1ByZWZlcmVuY2UvLAogICAgL1BTQm91bmRQYXJhbWV0ZXJzfFBTQ29tbWFuZFBhdGh8UFNDdWx0dXJlfFBTRGVmYXVsdFBhcmFtZXRlclZhbHVlc3xQU0VtYWlsU2VydmVyfFBTSG9tZXxQU1NjcmlwdFJvb3R8UFNTZXNzaW9uQXBwbGljYXRpb25OYW1lLywKICAgIC9QU1Nlc3Npb25Db25maWd1cmF0aW9uTmFtZXxQU1Nlc3Npb25PcHRpb258UFNVSUN1bHR1cmV8UFNWZXJzaW9uVGFibGV8UHdkfFNoZWxsSWR8U3RhY2tUcmFjZXxWZXJib3NlUHJlZmVyZW5jZS8sCiAgICAvV2FybmluZ1ByZWZlcmVuY2V8V2hhdElmUHJlZmVyZW5jZS8sCgogICAgL0V2ZW50fEV2ZW50QXJnc3xFdmVudFN1YnNjcmliZXJ8U2VuZGVyLywKICAgIC9NYXRjaGVzfE9mc3xGb3JFYWNofExhc3RFeGl0Q29kZXxQU0NtZGxldHxQU0l0ZW18UFNTZW5kZXJJbmZvfFRoaXMvLAogICAgL3RydWV8ZmFsc2V8bnVsbC8KICBdLCB7IHByZWZpeDogJ1xcJCcsIHN1ZmZpeDogJycgfSk7CgogIHZhciBidWlsdGlucyA9IGJ1aWxkUmVnZXhwKFtzeW1ib2xCdWlsdGlucywgbmFtZWRCdWlsdGlucywgdmFyaWFibGVCdWlsdGluc10sIHsgc3VmZml4OiBub3RDaGFyYWN0ZXJPckRhc2ggfSk7CgogIHZhciBncmFtbWFyID0gewogICAga2V5d29yZDoga2V5d29yZHMsCiAgICBudW1iZXI6IG51bWJlcnMsCiAgICBvcGVyYXRvcjogb3BlcmF0b3JzLAogICAgYnVpbHRpbjogYnVpbHRpbnMsCiAgICBwdW5jdHVhdGlvbjogcHVuY3R1YXRpb24sCiAgICBpZGVudGlmaWVyOiBpZGVudGlmaWVycwogIH07CgogIC8vIHRva2VuaXplcnMKICBmdW5jdGlvbiB0b2tlbkJhc2Uoc3RyZWFtLCBzdGF0ZSkgewogICAgLy8gSGFuZGxlIENvbW1lbnRzCiAgICAvL3ZhciBjaCA9IHN0cmVhbS5wZWVrKCk7CgogICAgdmFyIHBhcmVudCA9IHN0YXRlLnJldHVyblN0YWNrW3N0YXRlLnJldHVyblN0YWNrLmxlbmd0aCAtIDFdOwogICAgaWYgKHBhcmVudCAmJiBwYXJlbnQuc2hvdWxkUmV0dXJuRnJvbShzdGF0ZSkpIHsKICAgICAgc3RhdGUudG9rZW5pemUgPSBwYXJlbnQudG9rZW5pemU7CiAgICAgIHN0YXRlLnJldHVyblN0YWNrLnBvcCgpOwogICAgICByZXR1cm4gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CiAgICB9CgogICAgaWYgKHN0cmVhbS5lYXRTcGFjZSgpKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIGlmIChzdHJlYW0uZWF0KCcoJykpIHsKICAgICAgc3RhdGUuYnJhY2tldE5lc3RpbmcgKz0gMTsKICAgICAgcmV0dXJuICdwdW5jdHVhdGlvbic7CiAgICB9CgogICAgaWYgKHN0cmVhbS5lYXQoJyknKSkgewogICAgICBzdGF0ZS5icmFja2V0TmVzdGluZyAtPSAxOwogICAgICByZXR1cm4gJ3B1bmN0dWF0aW9uJzsKICAgIH0KCiAgICBmb3IgKHZhciBrZXkgaW4gZ3JhbW1hcikgewogICAgICBpZiAoc3RyZWFtLm1hdGNoKGdyYW1tYXJba2V5XSkpIHsKICAgICAgICByZXR1cm4ga2V5OwogICAgICB9CiAgICB9CgogICAgdmFyIGNoID0gc3RyZWFtLm5leHQoKTsKCiAgICAvLyBzaW5nbGUtcXVvdGUgc3RyaW5nCiAgICBpZiAoY2ggPT09ICInIikgewogICAgICByZXR1cm4gdG9rZW5TaW5nbGVRdW90ZVN0cmluZyhzdHJlYW0sIHN0YXRlKTsKICAgIH0KCiAgICBpZiAoY2ggPT09ICckJykgewogICAgICByZXR1cm4gdG9rZW5WYXJpYWJsZShzdHJlYW0sIHN0YXRlKTsKICAgIH0KCiAgICAvLyBkb3VibGUtcXVvdGUgc3RyaW5nCiAgICBpZiAoY2ggPT09ICciJykgewogICAgICByZXR1cm4gdG9rZW5Eb3VibGVRdW90ZVN0cmluZyhzdHJlYW0sIHN0YXRlKTsKICAgIH0KCiAgICBpZiAoY2ggPT09ICc8JyAmJiBzdHJlYW0uZWF0KCcjJykpIHsKICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkNvbW1lbnQ7CiAgICAgIHJldHVybiB0b2tlbkNvbW1lbnQoc3RyZWFtLCBzdGF0ZSk7CiAgICB9CgogICAgaWYgKGNoID09PSAnIycpIHsKICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICByZXR1cm4gJ2NvbW1lbnQnOwogICAgfQoKICAgIGlmIChjaCA9PT0gJ0AnKSB7CiAgICAgIHZhciBxdW90ZU1hdGNoID0gc3RyZWFtLmVhdCgvWyInXS8pOwogICAgICBpZiAocXVvdGVNYXRjaCAmJiBzdHJlYW0uZW9sKCkpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuTXVsdGlTdHJpbmc7CiAgICAgICAgc3RhdGUuc3RhcnRRdW90ZSA9IHF1b3RlTWF0Y2hbMF07CiAgICAgICAgcmV0dXJuIHRva2VuTXVsdGlTdHJpbmcoc3RyZWFtLCBzdGF0ZSk7CiAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLnBlZWsoKS5tYXRjaCgvWyh7XS8pKSB7CiAgICAgICAgcmV0dXJuICdwdW5jdHVhdGlvbic7CiAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLnBlZWsoKS5tYXRjaCh2YXJOYW1lcykpIHsKICAgICAgICAvLyBzcGxhdHRlZCB2YXJpYWJsZQogICAgICAgIHJldHVybiB0b2tlblZhcmlhYmxlKHN0cmVhbSwgc3RhdGUpOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gJ2Vycm9yJzsKICB9CgogIGZ1bmN0aW9uIHRva2VuU2luZ2xlUXVvdGVTdHJpbmcoc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIGNoOwogICAgd2hpbGUgKChjaCA9IHN0cmVhbS5wZWVrKCkpICE9IG51bGwpIHsKICAgICAgc3RyZWFtLm5leHQoKTsKCiAgICAgIGlmIChjaCA9PT0gIiciICYmICFzdHJlYW0uZWF0KCInIikpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTsKICAgICAgICByZXR1cm4gJ3N0cmluZyc7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gJ2Vycm9yJzsKICB9CgogIGZ1bmN0aW9uIHRva2VuRG91YmxlUXVvdGVTdHJpbmcoc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIGNoOwogICAgd2hpbGUgKChjaCA9IHN0cmVhbS5wZWVrKCkpICE9IG51bGwpIHsKICAgICAgaWYgKGNoID09PSAnJCcpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuU3RyaW5nSW50ZXJwb2xhdGlvbjsKICAgICAgICByZXR1cm4gJ3N0cmluZyc7CiAgICAgIH0KCiAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgIGlmIChjaCA9PT0gJ2AnKSB7CiAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQoKICAgICAgaWYgKGNoID09PSAnIicgJiYgIXN0cmVhbS5lYXQoJyInKSkgewogICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlOwogICAgICAgIHJldHVybiAnc3RyaW5nJzsKICAgICAgfQogICAgfQoKICAgIHJldHVybiAnZXJyb3InOwogIH0KCiAgZnVuY3Rpb24gdG9rZW5TdHJpbmdJbnRlcnBvbGF0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgIHJldHVybiB0b2tlbkludGVycG9sYXRpb24oc3RyZWFtLCBzdGF0ZSwgdG9rZW5Eb3VibGVRdW90ZVN0cmluZyk7CiAgfQoKICBmdW5jdGlvbiB0b2tlbk11bHRpU3RyaW5nUmV0dXJuKHN0cmVhbSwgc3RhdGUpIHsKICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5NdWx0aVN0cmluZzsKICAgIHN0YXRlLnN0YXJ0UXVvdGUgPSAnIicKICAgIHJldHVybiB0b2tlbk11bHRpU3RyaW5nKHN0cmVhbSwgc3RhdGUpOwogIH0KCiAgZnVuY3Rpb24gdG9rZW5IZXJlU3RyaW5nSW50ZXJwb2xhdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICByZXR1cm4gdG9rZW5JbnRlcnBvbGF0aW9uKHN0cmVhbSwgc3RhdGUsIHRva2VuTXVsdGlTdHJpbmdSZXR1cm4pOwogIH0KCiAgZnVuY3Rpb24gdG9rZW5JbnRlcnBvbGF0aW9uKHN0cmVhbSwgc3RhdGUsIHBhcmVudFRva2VuaXplKSB7CiAgICBpZiAoc3RyZWFtLm1hdGNoKCckKCcpKSB7CiAgICAgIHZhciBzYXZlZEJyYWNrZXROZXN0aW5nID0gc3RhdGUuYnJhY2tldE5lc3Rpbmc7CiAgICAgIHN0YXRlLnJldHVyblN0YWNrLnB1c2goewogICAgICAgIC8qanNoaW50IGxvb3BmdW5jOnRydWUgKi8KICAgICAgICBzaG91bGRSZXR1cm5Gcm9tOiBmdW5jdGlvbihzdGF0ZSkgewogICAgICAgICAgcmV0dXJuIHN0YXRlLmJyYWNrZXROZXN0aW5nID09PSBzYXZlZEJyYWNrZXROZXN0aW5nOwogICAgICAgIH0sCiAgICAgICAgdG9rZW5pemU6IHBhcmVudFRva2VuaXplCiAgICAgIH0pOwogICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTsKICAgICAgc3RhdGUuYnJhY2tldE5lc3RpbmcgKz0gMTsKICAgICAgcmV0dXJuICdwdW5jdHVhdGlvbic7CiAgICB9IGVsc2UgewogICAgICBzdHJlYW0ubmV4dCgpOwogICAgICBzdGF0ZS5yZXR1cm5TdGFjay5wdXNoKHsKICAgICAgICBzaG91bGRSZXR1cm5Gcm9tOiBmdW5jdGlvbigpIHsgcmV0dXJuIHRydWU7IH0sCiAgICAgICAgdG9rZW5pemU6IHBhcmVudFRva2VuaXplCiAgICAgIH0pOwogICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuVmFyaWFibGU7CiAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIHRva2VuQ29tbWVudChzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgbWF5YmVFbmQgPSBmYWxzZSwgY2g7CiAgICB3aGlsZSAoKGNoID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkgewogICAgICBpZiAobWF5YmVFbmQgJiYgY2ggPT0gJz4nKSB7CiAgICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIG1heWJlRW5kID0gKGNoID09PSAnIycpOwogICAgfQogICAgcmV0dXJuICdjb21tZW50JzsKICB9CgogIGZ1bmN0aW9uIHRva2VuVmFyaWFibGUoc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIGNoID0gc3RyZWFtLnBlZWsoKTsKICAgIGlmIChzdHJlYW0uZWF0KCd7JykpIHsKICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlblZhcmlhYmxlV2l0aEJyYWNlczsKICAgICAgcmV0dXJuIHRva2VuVmFyaWFibGVXaXRoQnJhY2VzKHN0cmVhbSwgc3RhdGUpOwogICAgfSBlbHNlIGlmIChjaCAhPSB1bmRlZmluZWQgJiYgY2gubWF0Y2godmFyTmFtZXMpKSB7CiAgICAgIHN0cmVhbS5lYXRXaGlsZSh2YXJOYW1lcyk7CiAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlOwogICAgICByZXR1cm4gJ3ZhcmlhYmxlLTInOwogICAgfSBlbHNlIHsKICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICAgIHJldHVybiAnZXJyb3InOwogICAgfQogIH0KCiAgZnVuY3Rpb24gdG9rZW5WYXJpYWJsZVdpdGhCcmFjZXMoc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIGNoOwogICAgd2hpbGUgKChjaCA9IHN0cmVhbS5uZXh0KCkpICE9IG51bGwpIHsKICAgICAgaWYgKGNoID09PSAnfScpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgcmV0dXJuICd2YXJpYWJsZS0yJzsKICB9CgogIGZ1bmN0aW9uIHRva2VuTXVsdGlTdHJpbmcoc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIHF1b3RlID0gc3RhdGUuc3RhcnRRdW90ZTsKICAgIGlmIChzdHJlYW0uc29sKCkgJiYgc3RyZWFtLm1hdGNoKG5ldyBSZWdFeHAocXVvdGUgKyAnQCcpKSkgewogICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTsKICAgIH0KICAgIGVsc2UgaWYgKHF1b3RlID09PSAnIicpIHsKICAgICAgd2hpbGUgKCFzdHJlYW0uZW9sKCkpIHsKICAgICAgICB2YXIgY2ggPSBzdHJlYW0ucGVlaygpOwogICAgICAgIGlmIChjaCA9PT0gJyQnKSB7CiAgICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuSGVyZVN0cmluZ0ludGVycG9sYXRpb247CiAgICAgICAgICByZXR1cm4gJ3N0cmluZyc7CiAgICAgICAgfQoKICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgIGlmIChjaCA9PT0gJ2AnKSB7CiAgICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgZWxzZSB7CiAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgIH0KCiAgICByZXR1cm4gJ3N0cmluZyc7CiAgfQoKICB2YXIgZXh0ZXJuYWwgPSB7CiAgICBzdGFydFN0YXRlOiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICByZXR1cm5TdGFjazogW10sCiAgICAgICAgYnJhY2tldE5lc3Rpbmc6IDAsCiAgICAgICAgdG9rZW5pemU6IHRva2VuQmFzZQogICAgICB9OwogICAgfSwKCiAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICByZXR1cm4gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CiAgICB9LAoKICAgIGJsb2NrQ29tbWVudFN0YXJ0OiAnPCMnLAogICAgYmxvY2tDb21tZW50RW5kOiAnIz4nLAogICAgbGluZUNvbW1lbnQ6ICcjJywKICAgIGZvbGQ6ICdicmFjZScKICB9OwogIHJldHVybiBleHRlcm5hbDsKfSk7CgpDb2RlTWlycm9yLmRlZmluZU1JTUUoJ2FwcGxpY2F0aW9uL3gtcG93ZXJzaGVsbCcsICdwb3dlcnNoZWxsJyk7Cn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/powershell/test.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24oKSB7CiAgdmFyIG1vZGUgPSBDb2RlTWlycm9yLmdldE1vZGUoe2luZGVudFVuaXQ6IDJ9LCAicG93ZXJzaGVsbCIpOwogIGZ1bmN0aW9uIE1UKG5hbWUpIHsgdGVzdC5tb2RlKG5hbWUsIG1vZGUsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpOyB9CgogIE1UKCdjb21tZW50JywgJ1tudW1iZXIgMV1bY29tbWVudCAjIEFdJyk7CiAgTVQoJ2NvbW1lbnRfbXVsdGlsaW5lJywgJ1tudW1iZXIgMV1bY29tbWVudCA8I10nLAogICAgJ1tjb21tZW50IEFCQ10nLAogICdbY29tbWVudCAjPl1bbnVtYmVyIDJdJyk7CgogIFsKICAgICcwJywgJzEyMzQnLAogICAgJzEya2InLCAnMTJtYicsICcxMkdiJywgJzEyVGInLCAnMTJQQicsICcxMkwnLCAnMTJEJywgJzEybGtiJywgJzEyZHRiJywKICAgICcxLjIzNCcsICcxLjIzNGU1NicsICcxLicsICcxLmUyJywgJy4yJywgJy4yZTM0JywKICAgICcxLjJNQicsICcxLmtiJywgJy4xZFRCJywgJzEuZTFnYicsICcuMicsICcuMmUzNCcsCiAgICAnMHgxJywgJzB4YWJjZGVmJywgJzB4M3RiJywgJzB4ZWxtYicKICBdLmZvckVhY2goZnVuY3Rpb24obnVtYmVyKSB7CiAgICBNVCgibnVtYmVyXyIgKyBudW1iZXIsICJbbnVtYmVyICIgKyBudW1iZXIgKyAiXSIpOwogIH0pOwoKICBNVCgnc3RyaW5nX2xpdGVyYWxfZXNjYXBpbmcnLCAiW3N0cmluZyAnYScnJ10iKTsKICBNVCgnc3RyaW5nX2xpdGVyYWxfdmFyaWFibGUnLCAiW3N0cmluZyAnYSAkeCddIik7CiAgTVQoJ3N0cmluZ19lc2NhcGluZ18xJywgJ1tzdHJpbmcgImEgYCIiXScpOwogIE1UKCdzdHJpbmdfZXNjYXBpbmdfMicsICdbc3RyaW5nICJhICIiIl0nKTsKICBNVCgnc3RyaW5nX3ZhcmlhYmxlX2VzY2FwaW5nJywgJ1tzdHJpbmcgImEgYCR4Il0nKTsKICBNVCgnc3RyaW5nX3ZhcmlhYmxlJywgJ1tzdHJpbmcgImEgXVt2YXJpYWJsZS0yICR4XVtzdHJpbmcgIGIiXScpOwogIE1UKCdzdHJpbmdfdmFyaWFibGVfc3BhY2VzJywgJ1tzdHJpbmcgImEgXVt2YXJpYWJsZS0yICR7eCB5fV1bc3RyaW5nICBiIl0nKTsKICBNVCgnc3RyaW5nX2V4cHJlc3Npb24nLCAnW3N0cmluZyAiYSBdW3B1bmN0dWF0aW9uICQoXVt2YXJpYWJsZS0yICR4XVtvcGVyYXRvciArXVtudW1iZXIgM11bcHVuY3R1YXRpb24gKV1bc3RyaW5nICBiIl0nKTsKICBNVCgnc3RyaW5nX2V4cHJlc3Npb25fbmVzdGVkJywgJ1tzdHJpbmcgIkFdW3B1bmN0dWF0aW9uICQoXVtzdHJpbmcgImFdW3B1bmN0dWF0aW9uICQoXVtzdHJpbmcgInciXVtwdW5jdHVhdGlvbiApXVtzdHJpbmcgYiJdW3B1bmN0dWF0aW9uICldW3N0cmluZyBCIl0nKTsKCiAgTVQoJ3N0cmluZ19oZXJlZG9jJywgJ1tzdHJpbmcgQCJdJywKICAgICdbc3RyaW5nIGFiY10nLAogICdbc3RyaW5nICJAXScpOwogIE1UKCdzdHJpbmdfaGVyZWRvY19xdW90ZXMnLCAnW3N0cmluZyBAIl0nLAogICAgJ1tzdHJpbmcgYWJjICJcJ10nLAogICdbc3RyaW5nICJAXScpOwogIE1UKCdzdHJpbmdfaGVyZWRvY192YXJpYWJsZScsICdbc3RyaW5nIEAiXScsCiAgICAnW3N0cmluZyBhIF1bdmFyaWFibGUtMiAkeF1bc3RyaW5nICBiXScsCiAgJ1tzdHJpbmcgIkBdJyk7CiAgTVQoJ3N0cmluZ19oZXJlZG9jX25lc3RlZF9zdHJpbmcnLCAnW3N0cmluZyBAIl0nLAogICAgJ1tzdHJpbmcgYV1bcHVuY3R1YXRpb24gJChdW3N0cmluZyAidyJdW3B1bmN0dWF0aW9uICldW3N0cmluZyBiXScsCiAgJ1tzdHJpbmcgIkBdJyk7CiAgTVQoJ3N0cmluZ19oZXJlZG9jX2xpdGVyYWxfcXVvdGVzJywgIltzdHJpbmcgQCddIiwKICAgICdbc3RyaW5nIGFiYyAiXCddJywKICAiW3N0cmluZyAnQF0iKTsKCiAgTVQoJ2FycmF5JywgIltwdW5jdHVhdGlvbiBAKF1bc3RyaW5nICdhJ11bcHVuY3R1YXRpb24gLF1bc3RyaW5nICdiJ11bcHVuY3R1YXRpb24gKV0iKTsKICBNVCgnaGFzaCcsICJbcHVuY3R1YXRpb24gQHtdW3N0cmluZyAna2V5J11bb3BlcmF0b3IgOl1bc3RyaW5nICd2YWx1ZSddW3B1bmN0dWF0aW9uIH1dIik7CgogIE1UKCd2YXJpYWJsZScsICJbdmFyaWFibGUtMiAkdGVzdF0iKTsKICBNVCgndmFyaWFibGVfZ2xvYmFsJywgICJbdmFyaWFibGUtMiAkZ2xvYmFsOnRlc3RdIik7CiAgTVQoJ3ZhcmlhYmxlX3NwYWNlcycsICAiW3ZhcmlhYmxlLTIgJHt0ZXN0IHRlc3R9XSIpOwogIE1UKCdvcGVyYXRvcl9zcGxhdCcsICAgIlt2YXJpYWJsZS0yIEB4XSIpOwogIE1UKCd2YXJpYWJsZV9idWlsdGluJywgIltidWlsdGluICRFcnJvckFjdGlvblByZWZlcmVuY2VdIik7CiAgTVQoJ3ZhcmlhYmxlX2J1aWx0aW5fc3ltYm9scycsICJbYnVpbHRpbiAkJF0iKTsKCiAgTVQoJ29wZXJhdG9yJywgIltvcGVyYXRvciArXSIpOwogIE1UKCdvcGVyYXRvcl91bmFyeScsICJbb3BlcmF0b3IgK11bbnVtYmVyIDNdIik7CiAgTVQoJ29wZXJhdG9yX2xvbmcnLCAiW29wZXJhdG9yIC1tYXRjaF0iKTsKCiAgWwogICAgJygnLCAnKScsICdbWycsICddXScsICd7JywgJ30nLCAnLCcsICdgJywgJzsnLCAnLicKICBdLmZvckVhY2goZnVuY3Rpb24ocHVuY3R1YXRpb24pIHsKICAgIE1UKCJwdW5jdHVhdGlvbl8iICsgcHVuY3R1YXRpb24ucmVwbGFjZSgvXltcW1xdXS8sJycpLCAiW3B1bmN0dWF0aW9uICIgKyBwdW5jdHVhdGlvbiArICJdIik7CiAgfSk7CgogIE1UKCdrZXl3b3JkJywgIltrZXl3b3JkIGlmXSIpOwoKICBNVCgnY2FsbF9idWlsdGluJywgIltidWlsdGluIEdldC1DaGlsZEl0ZW1dIik7Cn0pKCk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/properties/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/properties/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogUHJvcGVydGllcyBmaWxlcyBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9InByb3BlcnRpZXMuanMiPjwvc2NyaXB0Pgo8c3R5bGU+LkNvZGVNaXJyb3Ige2JvcmRlci10b3A6IDFweCBzb2xpZCAjZGRkOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2RkZDt9PC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aDE+Q29kZU1pcnJvcjwvaDE+PGltZyBpZD1sb2dvIHNyYz0iLi4vLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+TGFuZ3VhZ2UgbW9kZXM8L2E+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPlByb3BlcnRpZXMgZmlsZXM8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPlByb3BlcnRpZXMgZmlsZXMgbW9kZTwvaDI+Cjxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+CiMgVGhpcyBpcyBhIHByb3BlcnRpZXMgZmlsZQphLmtleSA9IEEgdmFsdWUKYW5vdGhlci5rZXkgPSBodHRwOi8vZXhhbXBsZS5jb20KISBFeGNsYW1hdGlvbiBtYXJrIGFzIGNvbW1lbnQKYnV0Lm5vdD1XaXRoaW4gISBBIHZhbHVlICMgaW5kZWVkCiAgICMgU3BhY2VzIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lCiAgIHNwYWNlcy5iZWZvcmUua2V5PXZhbHVlCmJhY2tzbGFzaD1Vc2VkIGZvciBtdWx0aVwKICAgICAgICAgIGxpbmUgZW50cmllcyxcCiAgICAgICAgICB0aGF0J3MgY29udmVuaWVudC4KIyBVbmljb2RlIHNlcXVlbmNlcwp1bmljb2RlLmtleT1UaGlzIGlzIFx1MDAyMCBVbmljb2RlCm5vLm11bHRpbGluZT1oZXJlCiMgQ29sb25zCmNvbG9ucyA6IGNhbiBiZSB1c2VkIHRvbwojIFNwYWNlcwpzcGFjZXNcIGluXCBrZXlzPU5vdCB2ZXJ5IGNvbW1vbi4uLgo8L3RleHRhcmVhPjwvZm9ybT4KICAgIDxzY3JpcHQ+CiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7fSk7CiAgICA8L3NjcmlwdD4KCiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC94LXByb3BlcnRpZXM8L2NvZGU+LAogICAgPGNvZGU+dGV4dC94LWluaTwvY29kZT4uPC9wPgoKICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/properties/properties.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJwcm9wZXJ0aWVzIiwgZnVuY3Rpb24oKSB7CiAgcmV0dXJuIHsKICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHZhciBzb2wgPSBzdHJlYW0uc29sKCkgfHwgc3RhdGUuYWZ0ZXJTZWN0aW9uOwogICAgICB2YXIgZW9sID0gc3RyZWFtLmVvbCgpOwoKICAgICAgc3RhdGUuYWZ0ZXJTZWN0aW9uID0gZmFsc2U7CgogICAgICBpZiAoc29sKSB7CiAgICAgICAgaWYgKHN0YXRlLm5leHRNdWx0aWxpbmUpIHsKICAgICAgICAgIHN0YXRlLmluTXVsdGlsaW5lID0gdHJ1ZTsKICAgICAgICAgIHN0YXRlLm5leHRNdWx0aWxpbmUgPSBmYWxzZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc3RhdGUucG9zaXRpb24gPSAiZGVmIjsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGlmIChlb2wgJiYgISBzdGF0ZS5uZXh0TXVsdGlsaW5lKSB7CiAgICAgICAgc3RhdGUuaW5NdWx0aWxpbmUgPSBmYWxzZTsKICAgICAgICBzdGF0ZS5wb3NpdGlvbiA9ICJkZWYiOwogICAgICB9CgogICAgICBpZiAoc29sKSB7CiAgICAgICAgd2hpbGUoc3RyZWFtLmVhdFNwYWNlKCkpIHt9CiAgICAgIH0KCiAgICAgIHZhciBjaCA9IHN0cmVhbS5uZXh0KCk7CgogICAgICBpZiAoc29sICYmIChjaCA9PT0gIiMiIHx8IGNoID09PSAiISIgfHwgY2ggPT09ICI7IikpIHsKICAgICAgICBzdGF0ZS5wb3NpdGlvbiA9ICJjb21tZW50IjsKICAgICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICAgICAgcmV0dXJuICJjb21tZW50IjsKICAgICAgfSBlbHNlIGlmIChzb2wgJiYgY2ggPT09ICJbIikgewogICAgICAgIHN0YXRlLmFmdGVyU2VjdGlvbiA9IHRydWU7CiAgICAgICAgc3RyZWFtLnNraXBUbygiXSIpOyBzdHJlYW0uZWF0KCJdIik7CiAgICAgICAgcmV0dXJuICJoZWFkZXIiOwogICAgICB9IGVsc2UgaWYgKGNoID09PSAiPSIgfHwgY2ggPT09ICI6IikgewogICAgICAgIHN0YXRlLnBvc2l0aW9uID0gInF1b3RlIjsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfSBlbHNlIGlmIChjaCA9PT0gIlxcIiAmJiBzdGF0ZS5wb3NpdGlvbiA9PT0gInF1b3RlIikgewogICAgICAgIGlmIChzdHJlYW0uZW9sKCkpIHsgIC8vIGVuZCBvZiBsaW5lPwogICAgICAgICAgLy8gTXVsdGlsaW5lIHZhbHVlCiAgICAgICAgICBzdGF0ZS5uZXh0TXVsdGlsaW5lID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiBzdGF0ZS5wb3NpdGlvbjsKICAgIH0sCgogICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgcG9zaXRpb24gOiAiZGVmIiwgICAgICAgLy8gQ3VycmVudCBwb3NpdGlvbiwgImRlZiIsICJxdW90ZSIgb3IgImNvbW1lbnQiCiAgICAgICAgbmV4dE11bHRpbGluZSA6IGZhbHNlLCAgLy8gSXMgdGhlIG5leHQgbGluZSBtdWx0aWxpbmUgdmFsdWUKICAgICAgICBpbk11bHRpbGluZSA6IGZhbHNlLCAgICAvLyBJcyB0aGUgY3VycmVudCBsaW5lIGEgbXVsdGlsaW5lIHZhbHVlCiAgICAgICAgYWZ0ZXJTZWN0aW9uIDogZmFsc2UgICAgLy8gRGlkIHdlIGp1c3Qgb3BlbiBhIHNlY3Rpb24KICAgICAgfTsKICAgIH0KCiAgfTsKfSk7CgpDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveC1wcm9wZXJ0aWVzIiwgInByb3BlcnRpZXMiKTsKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtaW5pIiwgInByb3BlcnRpZXMiKTsKCn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/protobuf/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/protobuf/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogUHJvdG9CdWYgbW9kZTwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uLy4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxzY3JpcHQgc3JjPSIuLi8uLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJwcm90b2J1Zi5qcyI+PC9zY3JpcHQ+CjxzdHlsZT4uQ29kZU1pcnJvciB7IGJvcmRlci10b3A6IDFweCBzb2xpZCAjZGRkOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2RkZDsgfTwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGgxPkNvZGVNaXJyb3I8L2gxPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5Qcm90b0J1ZjwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+UHJvdG9CdWYgbW9kZTwvaDI+Cjxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+CnBhY2thZ2UgYWRkcmVzc2Jvb2s7CgptZXNzYWdlIEFkZHJlc3MgewogICByZXF1aXJlZCBzdHJpbmcgc3RyZWV0ID0gMTsKICAgcmVxdWlyZWQgc3RyaW5nIHBvc3RDb2RlID0gMjsKfQoKbWVzc2FnZSBQaG9uZU51bWJlciB7CiAgIHJlcXVpcmVkIHN0cmluZyBudW1iZXIgPSAxOwp9CgptZXNzYWdlIFBlcnNvbiB7CiAgIG9wdGlvbmFsIGludDMyIGlkID0gMTsKICAgcmVxdWlyZWQgc3RyaW5nIG5hbWUgPSAyOwogICByZXF1aXJlZCBzdHJpbmcgc3VybmFtZSA9IDM7CiAgIG9wdGlvbmFsIEFkZHJlc3MgYWRkcmVzcyA9IDQ7CiAgIHJlcGVhdGVkIFBob25lTnVtYmVyIHBob25lTnVtYmVycyA9IDU7CiAgIG9wdGlvbmFsIHVpbnQzMiBhZ2UgPSA2OwogICByZXBlYXRlZCB1aW50MzIgZmF2b3VyaXRlTnVtYmVycyA9IDc7CiAgIG9wdGlvbmFsIHN0cmluZyBsaWNlbnNlID0gODsKICAgZW51bSBHZW5kZXIgewogICAgICBNQUxFID0gMDsKICAgICAgRkVNQUxFID0gMTsKICAgfQogICBvcHRpb25hbCBHZW5kZXIgZ2VuZGVyID0gOTsKICAgb3B0aW9uYWwgZml4ZWQ2NCBsYXN0VXBkYXRlID0gMTA7CiAgIHJlcXVpcmVkIGJvb2wgZGVsZXRlZCA9IDExIFtkZWZhdWx0ID0gZmFsc2VdOwp9Cgo8L3RleHRhcmVhPjwvZm9ybT4KICAgIDxzY3JpcHQ+CiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7fSk7CiAgICA8L3NjcmlwdD4KCiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC94LXByb3RvYnVmPC9jb2RlPi48L3A+CgogIDwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/protobuf/protobuf.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CgogIGZ1bmN0aW9uIHdvcmRSZWdleHAod29yZHMpIHsKICAgIHJldHVybiBuZXcgUmVnRXhwKCJeKCgiICsgd29yZHMuam9pbigiKXwoIikgKyAiKSlcXGIiLCAiaSIpOwogIH07CgogIHZhciBrZXl3b3JkQXJyYXkgPSBbCiAgICAicGFja2FnZSIsICJtZXNzYWdlIiwgImltcG9ydCIsICJzeW50YXgiLAogICAgInJlcXVpcmVkIiwgIm9wdGlvbmFsIiwgInJlcGVhdGVkIiwgInJlc2VydmVkIiwgImRlZmF1bHQiLCAiZXh0ZW5zaW9ucyIsICJwYWNrZWQiLAogICAgImJvb2wiLCAiYnl0ZXMiLCAiZG91YmxlIiwgImVudW0iLCAiZmxvYXQiLCAic3RyaW5nIiwKICAgICJpbnQzMiIsICJpbnQ2NCIsICJ1aW50MzIiLCAidWludDY0IiwgInNpbnQzMiIsICJzaW50NjQiLCAiZml4ZWQzMiIsICJmaXhlZDY0IiwgInNmaXhlZDMyIiwgInNmaXhlZDY0IgogIF07CiAgdmFyIGtleXdvcmRzID0gd29yZFJlZ2V4cChrZXl3b3JkQXJyYXkpOwoKICBDb2RlTWlycm9yLnJlZ2lzdGVySGVscGVyKCJoaW50V29yZHMiLCAicHJvdG9idWYiLCBrZXl3b3JkQXJyYXkpOwoKICB2YXIgaWRlbnRpZmllcnMgPSBuZXcgUmVnRXhwKCJeW19BLVphLXpceGExLVx1ZmZmZl1bX0EtWmEtejAtOVx4YTEtXHVmZmZmXSoiKTsKCiAgZnVuY3Rpb24gdG9rZW5CYXNlKHN0cmVhbSkgewogICAgLy8gd2hpdGVzcGFjZXMKICAgIGlmIChzdHJlYW0uZWF0U3BhY2UoKSkgcmV0dXJuIG51bGw7CgogICAgLy8gSGFuZGxlIG9uZSBsaW5lIENvbW1lbnRzCiAgICBpZiAoc3RyZWFtLm1hdGNoKCIvLyIpKSB7CiAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgcmV0dXJuICJjb21tZW50IjsKICAgIH0KCiAgICAvLyBIYW5kbGUgTnVtYmVyIExpdGVyYWxzCiAgICBpZiAoc3RyZWFtLm1hdGNoKC9eWzAtOVwuKy1dLywgZmFsc2UpKSB7CiAgICAgIGlmIChzdHJlYW0ubWF0Y2goL15bKy1dPzB4WzAtOWEtZkEtRl0rLykpCiAgICAgICAgcmV0dXJuICJudW1iZXIiOwogICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eWystXT9cZCpcLlxkKyhbRWVEZF1bKy1dP1xkKyk/LykpCiAgICAgICAgcmV0dXJuICJudW1iZXIiOwogICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eWystXT9cZCsoW0VlRGRdWystXT9cZCspPy8pKQogICAgICAgIHJldHVybiAibnVtYmVyIjsKICAgIH0KCiAgICAvLyBIYW5kbGUgU3RyaW5ncwogICAgaWYgKHN0cmVhbS5tYXRjaCgvXiIoW14iXXwoIiIpKSoiLykpIHsgcmV0dXJuICJzdHJpbmciOyB9CiAgICBpZiAoc3RyZWFtLm1hdGNoKC9eJyhbXiddfCgnJykpKicvKSkgeyByZXR1cm4gInN0cmluZyI7IH0KCiAgICAvLyBIYW5kbGUgd29yZHMKICAgIGlmIChzdHJlYW0ubWF0Y2goa2V5d29yZHMpKSB7IHJldHVybiAia2V5d29yZCI7IH0KICAgIGlmIChzdHJlYW0ubWF0Y2goaWRlbnRpZmllcnMpKSB7IHJldHVybiAidmFyaWFibGUiOyB9IDsKCiAgICAvLyBIYW5kbGUgbm9uLWRldGVjdGVkIGl0ZW1zCiAgICBzdHJlYW0ubmV4dCgpOwogICAgcmV0dXJuIG51bGw7CiAgfTsKCiAgQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJwcm90b2J1ZiIsIGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHt0b2tlbjogdG9rZW5CYXNlfTsKICB9KTsKCiAgQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtcHJvdG9idWYiLCAicHJvdG9idWYiKTsKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/pug/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/pug/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogUHVnIFRlbXBsYXRpbmcgTW9kZTwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uLy4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxzY3JpcHQgc3JjPSIuLi8uLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9qYXZhc2NyaXB0L2phdmFzY3JpcHQuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vY3NzL2Nzcy5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi94bWwveG1sLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL2h0bWxtaXhlZC9odG1sbWl4ZWQuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0icHVnLmpzIj48L3NjcmlwdD4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4uQ29kZU1pcnJvciB7Ym9yZGVyLXRvcDogMXB4IHNvbGlkIGJsYWNrOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGgxPkNvZGVNaXJyb3I8L2gxPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5QdWcgVGVtcGxhdGluZyBNb2RlPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5QdWcgVGVtcGxhdGluZyBNb2RlPC9oMj4KPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KZG9jdHlwZSBodG1sCiAgaHRtbAogICAgaGVhZAogICAgICB0aXRsZT0gIlB1ZyBUZW1wbGF0aW5nIENvZGVNaXJyb3IgTW9kZSBFeGFtcGxlIgogICAgICBsaW5rKHJlbD0nc3R5bGVzaGVldCcsIGhyZWY9Jy9jc3MvYm9vdHN0cmFwLm1pbi5jc3MnKQogICAgICBsaW5rKHJlbD0nc3R5bGVzaGVldCcsIGhyZWY9Jy9jc3MvaW5kZXguY3NzJykKICAgICAgc2NyaXB0KHR5cGU9J3RleHQvamF2YXNjcmlwdCcsIHNyYz0nL2pzL2pxdWVyeS0xLjkuMS5taW4uanMnKQogICAgICBzY3JpcHQodHlwZT0ndGV4dC9qYXZhc2NyaXB0Jywgc3JjPScvanMvYm9vdHN0cmFwLm1pbi5qcycpCiAgICBib2R5CiAgICAgIGRpdi5oZWFkZXIKICAgICAgICBoMSBXZWxjb21lIHRvIHRoaXMgRXhhbXBsZQogICAgICBkaXYuc3BvdHMKICAgICAgICBpZiBsb2NhbHMuc3BvdHMKICAgICAgICAgIGVhY2ggc3BvdCBpbiBzcG90cwogICAgICAgICAgICBkaXYuc3BvdC53ZWxsCiAgICAgICAgIGRpdgogICAgICAgICAgIGlmIHNwb3QubG9nbwogICAgICAgICAgICAgaW1nLmltZy1yb3VuZGVkLmxvZ28oc3JjPXNwb3QubG9nbykKICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICBpbWcuaW1nLXJvdW5kZWQubG9nbyhzcmM9ImltZy9wbGFjZWhvbGRlci5wbmciKQogICAgICAgICBoMwogICAgICAgICAgIGEoaHJlZj1zcG90Lmhhc2gpICMje3Nwb3QuaGFzaH0KICAgICAgICAgICBpZiBzcG90LnRpdGxlCiAgICAgICAgICAgICBzcGFuLnRpdGxlICN7c3BvdC50aXRsZX0KICAgICAgICAgICBpZiBzcG90LmRlc2MKICAgICAgICAgICAgIGRpdiAje3Nwb3QuZGVzY30KICAgICAgICBlbHNlCiAgICAgICAgICBoMyBUaGVyZSBhcmUgbm8gc3BvdHMgY3VycmVudGx5IGF2YWlsYWJsZS4KPC90ZXh0YXJlYT48L2Zvcm0+CiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgICAgIG1vZGU6IHtuYW1lOiAicHVnIiwgYWxpZ25DREFUQTogdHJ1ZX0sCiAgICAgICAgbGluZU51bWJlcnM6IHRydWUKICAgICAgfSk7CiAgICA8L3NjcmlwdD4KICAgIDxoMz5UaGUgUHVnIFRlbXBsYXRpbmcgTW9kZTwvaDM+CiAgICAgIDxwPiBDcmVhdGVkIGJ5IEZvcmJlcyBMaW5kZXNheS4gTWFuYWdlZCBhcyBwYXJ0IG9mIGEgQnJhY2tldHMgZXh0ZW5zaW9uIGF0IDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9Gb3JiZXNMaW5kZXNheS9qYWRlLWJyYWNrZXRzIj5odHRwczovL2dpdGh1Yi5jb20vRm9yYmVzTGluZGVzYXkvamFkZS1icmFja2V0czwvYT4uPC9wPgogICAgPHA+PHN0cm9uZz5NSU1FIHR5cGUgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC94LXB1ZzwvY29kZT4sIDxjb2RlPnRleHQveC1qYWRlPC9jb2RlPi48L3A+CiAgPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/pug/pug.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSwgcmVxdWlyZSgiLi4vamF2YXNjcmlwdC9qYXZhc2NyaXB0IiksIHJlcXVpcmUoIi4uL2Nzcy9jc3MiKSwgcmVxdWlyZSgiLi4vaHRtbG1peGVkL2h0bWxtaXhlZCIpKTsKICBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCkgLy8gQU1ECiAgICBkZWZpbmUoWyIuLi8uLi9saWIvY29kZW1pcnJvciIsICIuLi9qYXZhc2NyaXB0L2phdmFzY3JpcHQiLCAiLi4vY3NzL2NzcyIsICIuLi9odG1sbWl4ZWQvaHRtbG1peGVkIl0sIG1vZCk7CiAgZWxzZSAvLyBQbGFpbiBicm93c2VyIGVudgogICAgbW9kKENvZGVNaXJyb3IpOwp9KShmdW5jdGlvbihDb2RlTWlycm9yKSB7CiJ1c2Ugc3RyaWN0IjsKCkNvZGVNaXJyb3IuZGVmaW5lTW9kZSgicHVnIiwgZnVuY3Rpb24gKGNvbmZpZykgewogIC8vIHRva2VuIHR5cGVzCiAgdmFyIEtFWVdPUkQgPSAna2V5d29yZCc7CiAgdmFyIERPQ1RZUEUgPSAnbWV0YSc7CiAgdmFyIElEID0gJ2J1aWx0aW4nOwogIHZhciBDTEFTUyA9ICdxdWFsaWZpZXInOwoKICB2YXIgQVRUUlNfTkVTVCA9IHsKICAgICd7JzogJ30nLAogICAgJygnOiAnKScsCiAgICAnWyc6ICddJwogIH07CgogIHZhciBqc01vZGUgPSBDb2RlTWlycm9yLmdldE1vZGUoY29uZmlnLCAnamF2YXNjcmlwdCcpOwoKICBmdW5jdGlvbiBTdGF0ZSgpIHsKICAgIHRoaXMuamF2YVNjcmlwdExpbmUgPSBmYWxzZTsKICAgIHRoaXMuamF2YVNjcmlwdExpbmVFeGNsdWRlc0NvbG9uID0gZmFsc2U7CgogICAgdGhpcy5qYXZhU2NyaXB0QXJndW1lbnRzID0gZmFsc2U7CiAgICB0aGlzLmphdmFTY3JpcHRBcmd1bWVudHNEZXB0aCA9IDA7CgogICAgdGhpcy5pc0ludGVycG9sYXRpbmcgPSBmYWxzZTsKICAgIHRoaXMuaW50ZXJwb2xhdGlvbk5lc3RpbmcgPSAwOwoKICAgIHRoaXMuanNTdGF0ZSA9IENvZGVNaXJyb3Iuc3RhcnRTdGF0ZShqc01vZGUpOwoKICAgIHRoaXMucmVzdE9mTGluZSA9ICcnOwoKICAgIHRoaXMuaXNJbmNsdWRlRmlsdGVyZWQgPSBmYWxzZTsKICAgIHRoaXMuaXNFYWNoID0gZmFsc2U7CgogICAgdGhpcy5sYXN0VGFnID0gJyc7CiAgICB0aGlzLnNjcmlwdFR5cGUgPSAnJzsKCiAgICAvLyBBdHRyaWJ1dGVzIE1vZGUKICAgIHRoaXMuaXNBdHRycyA9IGZhbHNlOwogICAgdGhpcy5hdHRyc05lc3QgPSBbXTsKICAgIHRoaXMuaW5BdHRyaWJ1dGVOYW1lID0gdHJ1ZTsKICAgIHRoaXMuYXR0cmlidXRlSXNUeXBlID0gZmFsc2U7CiAgICB0aGlzLmF0dHJWYWx1ZSA9ICcnOwoKICAgIC8vIEluZGVudGVkIE1vZGUKICAgIHRoaXMuaW5kZW50T2YgPSBJbmZpbml0eTsKICAgIHRoaXMuaW5kZW50VG9rZW4gPSAnJzsKCiAgICB0aGlzLmlubmVyTW9kZSA9IG51bGw7CiAgICB0aGlzLmlubmVyU3RhdGUgPSBudWxsOwoKICAgIHRoaXMuaW5uZXJNb2RlRm9yTGluZSA9IGZhbHNlOwogIH0KICAvKioKICAgKiBTYWZlbHkgY29weSBhIHN0YXRlCiAgICoKICAgKiBAcmV0dXJuIHtTdGF0ZX0KICAgKi8KICBTdGF0ZS5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICgpIHsKICAgIHZhciByZXMgPSBuZXcgU3RhdGUoKTsKICAgIHJlcy5qYXZhU2NyaXB0TGluZSA9IHRoaXMuamF2YVNjcmlwdExpbmU7CiAgICByZXMuamF2YVNjcmlwdExpbmVFeGNsdWRlc0NvbG9uID0gdGhpcy5qYXZhU2NyaXB0TGluZUV4Y2x1ZGVzQ29sb247CiAgICByZXMuamF2YVNjcmlwdEFyZ3VtZW50cyA9IHRoaXMuamF2YVNjcmlwdEFyZ3VtZW50czsKICAgIHJlcy5qYXZhU2NyaXB0QXJndW1lbnRzRGVwdGggPSB0aGlzLmphdmFTY3JpcHRBcmd1bWVudHNEZXB0aDsKICAgIHJlcy5pc0ludGVycG9sYXRpbmcgPSB0aGlzLmlzSW50ZXJwb2xhdGluZzsKICAgIHJlcy5pbnRlcnBvbGF0aW9uTmVzdGluZyA9IHRoaXMuaW50ZXJwb2xhdGlvbk5lc3Rpbmc7CgogICAgcmVzLmpzU3RhdGUgPSBDb2RlTWlycm9yLmNvcHlTdGF0ZShqc01vZGUsIHRoaXMuanNTdGF0ZSk7CgogICAgcmVzLmlubmVyTW9kZSA9IHRoaXMuaW5uZXJNb2RlOwogICAgaWYgKHRoaXMuaW5uZXJNb2RlICYmIHRoaXMuaW5uZXJTdGF0ZSkgewogICAgICByZXMuaW5uZXJTdGF0ZSA9IENvZGVNaXJyb3IuY29weVN0YXRlKHRoaXMuaW5uZXJNb2RlLCB0aGlzLmlubmVyU3RhdGUpOwogICAgfQoKICAgIHJlcy5yZXN0T2ZMaW5lID0gdGhpcy5yZXN0T2ZMaW5lOwoKICAgIHJlcy5pc0luY2x1ZGVGaWx0ZXJlZCA9IHRoaXMuaXNJbmNsdWRlRmlsdGVyZWQ7CiAgICByZXMuaXNFYWNoID0gdGhpcy5pc0VhY2g7CiAgICByZXMubGFzdFRhZyA9IHRoaXMubGFzdFRhZzsKICAgIHJlcy5zY3JpcHRUeXBlID0gdGhpcy5zY3JpcHRUeXBlOwogICAgcmVzLmlzQXR0cnMgPSB0aGlzLmlzQXR0cnM7CiAgICByZXMuYXR0cnNOZXN0ID0gdGhpcy5hdHRyc05lc3Quc2xpY2UoKTsKICAgIHJlcy5pbkF0dHJpYnV0ZU5hbWUgPSB0aGlzLmluQXR0cmlidXRlTmFtZTsKICAgIHJlcy5hdHRyaWJ1dGVJc1R5cGUgPSB0aGlzLmF0dHJpYnV0ZUlzVHlwZTsKICAgIHJlcy5hdHRyVmFsdWUgPSB0aGlzLmF0dHJWYWx1ZTsKICAgIHJlcy5pbmRlbnRPZiA9IHRoaXMuaW5kZW50T2Y7CiAgICByZXMuaW5kZW50VG9rZW4gPSB0aGlzLmluZGVudFRva2VuOwoKICAgIHJlcy5pbm5lck1vZGVGb3JMaW5lID0gdGhpcy5pbm5lck1vZGVGb3JMaW5lOwoKICAgIHJldHVybiByZXM7CiAgfTsKCiAgZnVuY3Rpb24gamF2YVNjcmlwdChzdHJlYW0sIHN0YXRlKSB7CiAgICBpZiAoc3RyZWFtLnNvbCgpKSB7CiAgICAgIC8vIGlmIGphdmFTY3JpcHRMaW5lIHdhcyBzZXQgYXQgZW5kIG9mIGxpbmUsIGlnbm9yZSBpdAogICAgICBzdGF0ZS5qYXZhU2NyaXB0TGluZSA9IGZhbHNlOwogICAgICBzdGF0ZS5qYXZhU2NyaXB0TGluZUV4Y2x1ZGVzQ29sb24gPSBmYWxzZTsKICAgIH0KICAgIGlmIChzdGF0ZS5qYXZhU2NyaXB0TGluZSkgewogICAgICBpZiAoc3RhdGUuamF2YVNjcmlwdExpbmVFeGNsdWRlc0NvbG9uICYmIHN0cmVhbS5wZWVrKCkgPT09ICc6JykgewogICAgICAgIHN0YXRlLmphdmFTY3JpcHRMaW5lID0gZmFsc2U7CiAgICAgICAgc3RhdGUuamF2YVNjcmlwdExpbmVFeGNsdWRlc0NvbG9uID0gZmFsc2U7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIHZhciB0b2sgPSBqc01vZGUudG9rZW4oc3RyZWFtLCBzdGF0ZS5qc1N0YXRlKTsKICAgICAgaWYgKHN0cmVhbS5lb2woKSkgc3RhdGUuamF2YVNjcmlwdExpbmUgPSBmYWxzZTsKICAgICAgcmV0dXJuIHRvayB8fCB0cnVlOwogICAgfQogIH0KICBmdW5jdGlvbiBqYXZhU2NyaXB0QXJndW1lbnRzKHN0cmVhbSwgc3RhdGUpIHsKICAgIGlmIChzdGF0ZS5qYXZhU2NyaXB0QXJndW1lbnRzKSB7CiAgICAgIGlmIChzdGF0ZS5qYXZhU2NyaXB0QXJndW1lbnRzRGVwdGggPT09IDAgJiYgc3RyZWFtLnBlZWsoKSAhPT0gJygnKSB7CiAgICAgICAgc3RhdGUuamF2YVNjcmlwdEFyZ3VtZW50cyA9IGZhbHNlOwogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpZiAoc3RyZWFtLnBlZWsoKSA9PT0gJygnKSB7CiAgICAgICAgc3RhdGUuamF2YVNjcmlwdEFyZ3VtZW50c0RlcHRoKys7CiAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLnBlZWsoKSA9PT0gJyknKSB7CiAgICAgICAgc3RhdGUuamF2YVNjcmlwdEFyZ3VtZW50c0RlcHRoLS07CiAgICAgIH0KICAgICAgaWYgKHN0YXRlLmphdmFTY3JpcHRBcmd1bWVudHNEZXB0aCA9PT0gMCkgewogICAgICAgIHN0YXRlLmphdmFTY3JpcHRBcmd1bWVudHMgPSBmYWxzZTsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIHZhciB0b2sgPSBqc01vZGUudG9rZW4oc3RyZWFtLCBzdGF0ZS5qc1N0YXRlKTsKICAgICAgcmV0dXJuIHRvayB8fCB0cnVlOwogICAgfQogIH0KCiAgZnVuY3Rpb24geWllbGRTdGF0ZW1lbnQoc3RyZWFtKSB7CiAgICBpZiAoc3RyZWFtLm1hdGNoKC9eeWllbGRcYi8pKSB7CiAgICAgICAgcmV0dXJuICdrZXl3b3JkJzsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGRvY3R5cGUoc3RyZWFtKSB7CiAgICBpZiAoc3RyZWFtLm1hdGNoKC9eKD86ZG9jdHlwZSkgKihbXlxuXSspPy8pKSB7CiAgICAgICAgcmV0dXJuIERPQ1RZUEU7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBpbnRlcnBvbGF0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgIGlmIChzdHJlYW0ubWF0Y2goJyN7JykpIHsKICAgICAgc3RhdGUuaXNJbnRlcnBvbGF0aW5nID0gdHJ1ZTsKICAgICAgc3RhdGUuaW50ZXJwb2xhdGlvbk5lc3RpbmcgPSAwOwogICAgICByZXR1cm4gJ3B1bmN0dWF0aW9uJzsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGludGVycG9sYXRpb25Db250aW51ZWQoc3RyZWFtLCBzdGF0ZSkgewogICAgaWYgKHN0YXRlLmlzSW50ZXJwb2xhdGluZykgewogICAgICBpZiAoc3RyZWFtLnBlZWsoKSA9PT0gJ30nKSB7CiAgICAgICAgc3RhdGUuaW50ZXJwb2xhdGlvbk5lc3RpbmctLTsKICAgICAgICBpZiAoc3RhdGUuaW50ZXJwb2xhdGlvbk5lc3RpbmcgPCAwKSB7CiAgICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgICAgc3RhdGUuaXNJbnRlcnBvbGF0aW5nID0gZmFsc2U7CiAgICAgICAgICByZXR1cm4gJ3B1bmN0dWF0aW9uJzsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLnBlZWsoKSA9PT0gJ3snKSB7CiAgICAgICAgc3RhdGUuaW50ZXJwb2xhdGlvbk5lc3RpbmcrKzsKICAgICAgfQogICAgICByZXR1cm4ganNNb2RlLnRva2VuKHN0cmVhbSwgc3RhdGUuanNTdGF0ZSkgfHwgdHJ1ZTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGNhc2VTdGF0ZW1lbnQoc3RyZWFtLCBzdGF0ZSkgewogICAgaWYgKHN0cmVhbS5tYXRjaCgvXmNhc2VcYi8pKSB7CiAgICAgIHN0YXRlLmphdmFTY3JpcHRMaW5lID0gdHJ1ZTsKICAgICAgcmV0dXJuIEtFWVdPUkQ7CiAgICB9CiAgfQoKICBmdW5jdGlvbiB3aGVuKHN0cmVhbSwgc3RhdGUpIHsKICAgIGlmIChzdHJlYW0ubWF0Y2goL153aGVuXGIvKSkgewogICAgICBzdGF0ZS5qYXZhU2NyaXB0TGluZSA9IHRydWU7CiAgICAgIHN0YXRlLmphdmFTY3JpcHRMaW5lRXhjbHVkZXNDb2xvbiA9IHRydWU7CiAgICAgIHJldHVybiBLRVlXT1JEOwogICAgfQogIH0KCiAgZnVuY3Rpb24gZGVmYXVsdFN0YXRlbWVudChzdHJlYW0pIHsKICAgIGlmIChzdHJlYW0ubWF0Y2goL15kZWZhdWx0XGIvKSkgewogICAgICByZXR1cm4gS0VZV09SRDsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGV4dGVuZHNTdGF0ZW1lbnQoc3RyZWFtLCBzdGF0ZSkgewogICAgaWYgKHN0cmVhbS5tYXRjaCgvXmV4dGVuZHM/XGIvKSkgewogICAgICBzdGF0ZS5yZXN0T2ZMaW5lID0gJ3N0cmluZyc7CiAgICAgIHJldHVybiBLRVlXT1JEOwogICAgfQogIH0KCiAgZnVuY3Rpb24gYXBwZW5kKHN0cmVhbSwgc3RhdGUpIHsKICAgIGlmIChzdHJlYW0ubWF0Y2goL15hcHBlbmRcYi8pKSB7CiAgICAgIHN0YXRlLnJlc3RPZkxpbmUgPSAndmFyaWFibGUnOwogICAgICByZXR1cm4gS0VZV09SRDsKICAgIH0KICB9CiAgZnVuY3Rpb24gcHJlcGVuZChzdHJlYW0sIHN0YXRlKSB7CiAgICBpZiAoc3RyZWFtLm1hdGNoKC9ecHJlcGVuZFxiLykpIHsKICAgICAgc3RhdGUucmVzdE9mTGluZSA9ICd2YXJpYWJsZSc7CiAgICAgIHJldHVybiBLRVlXT1JEOwogICAgfQogIH0KICBmdW5jdGlvbiBibG9jayhzdHJlYW0sIHN0YXRlKSB7CiAgICBpZiAoc3RyZWFtLm1hdGNoKC9eYmxvY2tcYiAqKD86KHByZXBlbmR8YXBwZW5kKVxiKT8vKSkgewogICAgICBzdGF0ZS5yZXN0T2ZMaW5lID0gJ3ZhcmlhYmxlJzsKICAgICAgcmV0dXJuIEtFWVdPUkQ7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBpbmNsdWRlKHN0cmVhbSwgc3RhdGUpIHsKICAgIGlmIChzdHJlYW0ubWF0Y2goL15pbmNsdWRlXGIvKSkgewogICAgICBzdGF0ZS5yZXN0T2ZMaW5lID0gJ3N0cmluZyc7CiAgICAgIHJldHVybiBLRVlXT1JEOwogICAgfQogIH0KCiAgZnVuY3Rpb24gaW5jbHVkZUZpbHRlcmVkKHN0cmVhbSwgc3RhdGUpIHsKICAgIGlmIChzdHJlYW0ubWF0Y2goL15pbmNsdWRlOihbYS16QS1aMC05XC1dKykvLCBmYWxzZSkgJiYgc3RyZWFtLm1hdGNoKCdpbmNsdWRlJykpIHsKICAgICAgc3RhdGUuaXNJbmNsdWRlRmlsdGVyZWQgPSB0cnVlOwogICAgICByZXR1cm4gS0VZV09SRDsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGluY2x1ZGVGaWx0ZXJlZENvbnRpbnVlZChzdHJlYW0sIHN0YXRlKSB7CiAgICBpZiAoc3RhdGUuaXNJbmNsdWRlRmlsdGVyZWQpIHsKICAgICAgdmFyIHRvayA9IGZpbHRlcihzdHJlYW0sIHN0YXRlKTsKICAgICAgc3RhdGUuaXNJbmNsdWRlRmlsdGVyZWQgPSBmYWxzZTsKICAgICAgc3RhdGUucmVzdE9mTGluZSA9ICdzdHJpbmcnOwogICAgICByZXR1cm4gdG9rOwogICAgfQogIH0KCiAgZnVuY3Rpb24gbWl4aW4oc3RyZWFtLCBzdGF0ZSkgewogICAgaWYgKHN0cmVhbS5tYXRjaCgvXm1peGluXGIvKSkgewogICAgICBzdGF0ZS5qYXZhU2NyaXB0TGluZSA9IHRydWU7CiAgICAgIHJldHVybiBLRVlXT1JEOwogICAgfQogIH0KCiAgZnVuY3Rpb24gY2FsbChzdHJlYW0sIHN0YXRlKSB7CiAgICBpZiAoc3RyZWFtLm1hdGNoKC9eXCsoWy1cd10rKS8pKSB7CiAgICAgIGlmICghc3RyZWFtLm1hdGNoKC9eXCggKlstXHddKyAqPS8sIGZhbHNlKSkgewogICAgICAgIHN0YXRlLmphdmFTY3JpcHRBcmd1bWVudHMgPSB0cnVlOwogICAgICAgIHN0YXRlLmphdmFTY3JpcHRBcmd1bWVudHNEZXB0aCA9IDA7CiAgICAgIH0KICAgICAgcmV0dXJuICd2YXJpYWJsZSc7CiAgICB9CiAgICBpZiAoc3RyZWFtLm1hdGNoKC9eXCsjey8sIGZhbHNlKSkgewogICAgICBzdHJlYW0ubmV4dCgpOwogICAgICBzdGF0ZS5taXhpbkNhbGxBZnRlciA9IHRydWU7CiAgICAgIHJldHVybiBpbnRlcnBvbGF0aW9uKHN0cmVhbSwgc3RhdGUpOwogICAgfQogIH0KICBmdW5jdGlvbiBjYWxsQXJndW1lbnRzKHN0cmVhbSwgc3RhdGUpIHsKICAgIGlmIChzdGF0ZS5taXhpbkNhbGxBZnRlcikgewogICAgICBzdGF0ZS5taXhpbkNhbGxBZnRlciA9IGZhbHNlOwogICAgICBpZiAoIXN0cmVhbS5tYXRjaCgvXlwoICpbLVx3XSsgKj0vLCBmYWxzZSkpIHsKICAgICAgICBzdGF0ZS5qYXZhU2NyaXB0QXJndW1lbnRzID0gdHJ1ZTsKICAgICAgICBzdGF0ZS5qYXZhU2NyaXB0QXJndW1lbnRzRGVwdGggPSAwOwogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfQogIH0KCiAgZnVuY3Rpb24gY29uZGl0aW9uYWwoc3RyZWFtLCBzdGF0ZSkgewogICAgaWYgKHN0cmVhbS5tYXRjaCgvXihpZnx1bmxlc3N8ZWxzZSBpZnxlbHNlKVxiLykpIHsKICAgICAgc3RhdGUuamF2YVNjcmlwdExpbmUgPSB0cnVlOwogICAgICByZXR1cm4gS0VZV09SRDsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGVhY2goc3RyZWFtLCBzdGF0ZSkgewogICAgaWYgKHN0cmVhbS5tYXRjaCgvXigtICopPyhlYWNofGZvcilcYi8pKSB7CiAgICAgIHN0YXRlLmlzRWFjaCA9IHRydWU7CiAgICAgIHJldHVybiBLRVlXT1JEOwogICAgfQogIH0KICBmdW5jdGlvbiBlYWNoQ29udGludWVkKHN0cmVhbSwgc3RhdGUpIHsKICAgIGlmIChzdGF0ZS5pc0VhY2gpIHsKICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXiBpblxiLykpIHsKICAgICAgICBzdGF0ZS5qYXZhU2NyaXB0TGluZSA9IHRydWU7CiAgICAgICAgc3RhdGUuaXNFYWNoID0gZmFsc2U7CiAgICAgICAgcmV0dXJuIEtFWVdPUkQ7CiAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLnNvbCgpIHx8IHN0cmVhbS5lb2woKSkgewogICAgICAgIHN0YXRlLmlzRWFjaCA9IGZhbHNlOwogICAgICB9IGVsc2UgaWYgKHN0cmVhbS5uZXh0KCkpIHsKICAgICAgICB3aGlsZSAoIXN0cmVhbS5tYXRjaCgvXiBpblxiLywgZmFsc2UpICYmIHN0cmVhbS5uZXh0KCkpOwogICAgICAgIHJldHVybiAndmFyaWFibGUnOwogICAgICB9CiAgICB9CiAgfQoKICBmdW5jdGlvbiB3aGlsZVN0YXRlbWVudChzdHJlYW0sIHN0YXRlKSB7CiAgICBpZiAoc3RyZWFtLm1hdGNoKC9ed2hpbGVcYi8pKSB7CiAgICAgIHN0YXRlLmphdmFTY3JpcHRMaW5lID0gdHJ1ZTsKICAgICAgcmV0dXJuIEtFWVdPUkQ7CiAgICB9CiAgfQoKICBmdW5jdGlvbiB0YWcoc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIGNhcHR1cmVzOwogICAgaWYgKGNhcHR1cmVzID0gc3RyZWFtLm1hdGNoKC9eKFx3KD86Wy06XHddKlx3KT8pXC8/LykpIHsKICAgICAgc3RhdGUubGFzdFRhZyA9IGNhcHR1cmVzWzFdLnRvTG93ZXJDYXNlKCk7CiAgICAgIGlmIChzdGF0ZS5sYXN0VGFnID09PSAnc2NyaXB0JykgewogICAgICAgIHN0YXRlLnNjcmlwdFR5cGUgPSAnYXBwbGljYXRpb24vamF2YXNjcmlwdCc7CiAgICAgIH0KICAgICAgcmV0dXJuICd0YWcnOwogICAgfQogIH0KCiAgZnVuY3Rpb24gZmlsdGVyKHN0cmVhbSwgc3RhdGUpIHsKICAgIGlmIChzdHJlYW0ubWF0Y2goL146KFtcd1wtXSspLykpIHsKICAgICAgdmFyIGlubmVyTW9kZTsKICAgICAgaWYgKGNvbmZpZyAmJiBjb25maWcuaW5uZXJNb2RlcykgewogICAgICAgIGlubmVyTW9kZSA9IGNvbmZpZy5pbm5lck1vZGVzKHN0cmVhbS5jdXJyZW50KCkuc3Vic3RyaW5nKDEpKTsKICAgICAgfQogICAgICBpZiAoIWlubmVyTW9kZSkgewogICAgICAgIGlubmVyTW9kZSA9IHN0cmVhbS5jdXJyZW50KCkuc3Vic3RyaW5nKDEpOwogICAgICB9CiAgICAgIGlmICh0eXBlb2YgaW5uZXJNb2RlID09PSAnc3RyaW5nJykgewogICAgICAgIGlubmVyTW9kZSA9IENvZGVNaXJyb3IuZ2V0TW9kZShjb25maWcsIGlubmVyTW9kZSk7CiAgICAgIH0KICAgICAgc2V0SW5uZXJNb2RlKHN0cmVhbSwgc3RhdGUsIGlubmVyTW9kZSk7CiAgICAgIHJldHVybiAnYXRvbSc7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBjb2RlKHN0cmVhbSwgc3RhdGUpIHsKICAgIGlmIChzdHJlYW0ubWF0Y2goL14oIT89fC0pLykpIHsKICAgICAgc3RhdGUuamF2YVNjcmlwdExpbmUgPSB0cnVlOwogICAgICByZXR1cm4gJ3B1bmN0dWF0aW9uJzsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGlkKHN0cmVhbSkgewogICAgaWYgKHN0cmVhbS5tYXRjaCgvXiMoW1x3LV0rKS8pKSB7CiAgICAgIHJldHVybiBJRDsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGNsYXNzTmFtZShzdHJlYW0pIHsKICAgIGlmIChzdHJlYW0ubWF0Y2goL15cLihbXHctXSspLykpIHsKICAgICAgcmV0dXJuIENMQVNTOwogICAgfQogIH0KCiAgZnVuY3Rpb24gYXR0cnMoc3RyZWFtLCBzdGF0ZSkgewogICAgaWYgKHN0cmVhbS5wZWVrKCkgPT0gJygnKSB7CiAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgIHN0YXRlLmlzQXR0cnMgPSB0cnVlOwogICAgICBzdGF0ZS5hdHRyc05lc3QgPSBbXTsKICAgICAgc3RhdGUuaW5BdHRyaWJ1dGVOYW1lID0gdHJ1ZTsKICAgICAgc3RhdGUuYXR0clZhbHVlID0gJyc7CiAgICAgIHN0YXRlLmF0dHJpYnV0ZUlzVHlwZSA9IGZhbHNlOwogICAgICByZXR1cm4gJ3B1bmN0dWF0aW9uJzsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGF0dHJzQ29udGludWVkKHN0cmVhbSwgc3RhdGUpIHsKICAgIGlmIChzdGF0ZS5pc0F0dHJzKSB7CiAgICAgIGlmIChBVFRSU19ORVNUW3N0cmVhbS5wZWVrKCldKSB7CiAgICAgICAgc3RhdGUuYXR0cnNOZXN0LnB1c2goQVRUUlNfTkVTVFtzdHJlYW0ucGVlaygpXSk7CiAgICAgIH0KICAgICAgaWYgKHN0YXRlLmF0dHJzTmVzdFtzdGF0ZS5hdHRyc05lc3QubGVuZ3RoIC0gMV0gPT09IHN0cmVhbS5wZWVrKCkpIHsKICAgICAgICBzdGF0ZS5hdHRyc05lc3QucG9wKCk7CiAgICAgIH0gZWxzZSAgaWYgKHN0cmVhbS5lYXQoJyknKSkgewogICAgICAgIHN0YXRlLmlzQXR0cnMgPSBmYWxzZTsKICAgICAgICByZXR1cm4gJ3B1bmN0dWF0aW9uJzsKICAgICAgfQogICAgICBpZiAoc3RhdGUuaW5BdHRyaWJ1dGVOYW1lICYmIHN0cmVhbS5tYXRjaCgvXltePSxcKSFdKy8pKSB7CiAgICAgICAgaWYgKHN0cmVhbS5wZWVrKCkgPT09ICc9JyB8fCBzdHJlYW0ucGVlaygpID09PSAnIScpIHsKICAgICAgICAgIHN0YXRlLmluQXR0cmlidXRlTmFtZSA9IGZhbHNlOwogICAgICAgICAgc3RhdGUuanNTdGF0ZSA9IENvZGVNaXJyb3Iuc3RhcnRTdGF0ZShqc01vZGUpOwogICAgICAgICAgaWYgKHN0YXRlLmxhc3RUYWcgPT09ICdzY3JpcHQnICYmIHN0cmVhbS5jdXJyZW50KCkudHJpbSgpLnRvTG93ZXJDYXNlKCkgPT09ICd0eXBlJykgewogICAgICAgICAgICBzdGF0ZS5hdHRyaWJ1dGVJc1R5cGUgPSB0cnVlOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3RhdGUuYXR0cmlidXRlSXNUeXBlID0gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAnYXR0cmlidXRlJzsKICAgICAgfQoKICAgICAgdmFyIHRvayA9IGpzTW9kZS50b2tlbihzdHJlYW0sIHN0YXRlLmpzU3RhdGUpOwogICAgICBpZiAoc3RhdGUuYXR0cmlidXRlSXNUeXBlICYmIHRvayA9PT0gJ3N0cmluZycpIHsKICAgICAgICBzdGF0ZS5zY3JpcHRUeXBlID0gc3RyZWFtLmN1cnJlbnQoKS50b1N0cmluZygpOwogICAgICB9CiAgICAgIGlmIChzdGF0ZS5hdHRyc05lc3QubGVuZ3RoID09PSAwICYmICh0b2sgPT09ICdzdHJpbmcnIHx8IHRvayA9PT0gJ3ZhcmlhYmxlJyB8fCB0b2sgPT09ICdrZXl3b3JkJykpIHsKICAgICAgICB0cnkgewogICAgICAgICAgRnVuY3Rpb24oJycsICd2YXIgeCAnICsgc3RhdGUuYXR0clZhbHVlLnJlcGxhY2UoLyxccyokLywgJycpLnJlcGxhY2UoL14hLywgJycpKTsKICAgICAgICAgIHN0YXRlLmluQXR0cmlidXRlTmFtZSA9IHRydWU7CiAgICAgICAgICBzdGF0ZS5hdHRyVmFsdWUgPSAnJzsKICAgICAgICAgIHN0cmVhbS5iYWNrVXAoc3RyZWFtLmN1cnJlbnQoKS5sZW5ndGgpOwogICAgICAgICAgcmV0dXJuIGF0dHJzQ29udGludWVkKHN0cmVhbSwgc3RhdGUpOwogICAgICAgIH0gY2F0Y2ggKGV4KSB7CiAgICAgICAgICAvL25vdCB0aGUgZW5kIG9mIGFuIGF0dHJpYnV0ZQogICAgICAgIH0KICAgICAgfQogICAgICBzdGF0ZS5hdHRyVmFsdWUgKz0gc3RyZWFtLmN1cnJlbnQoKTsKICAgICAgcmV0dXJuIHRvayB8fCB0cnVlOwogICAgfQogIH0KCiAgZnVuY3Rpb24gYXR0cmlidXRlc0Jsb2NrKHN0cmVhbSwgc3RhdGUpIHsKICAgIGlmIChzdHJlYW0ubWF0Y2goL14mYXR0cmlidXRlc1xiLykpIHsKICAgICAgc3RhdGUuamF2YVNjcmlwdEFyZ3VtZW50cyA9IHRydWU7CiAgICAgIHN0YXRlLmphdmFTY3JpcHRBcmd1bWVudHNEZXB0aCA9IDA7CiAgICAgIHJldHVybiAna2V5d29yZCc7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBpbmRlbnQoc3RyZWFtKSB7CiAgICBpZiAoc3RyZWFtLnNvbCgpICYmIHN0cmVhbS5lYXRTcGFjZSgpKSB7CiAgICAgIHJldHVybiAnaW5kZW50JzsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGNvbW1lbnQoc3RyZWFtLCBzdGF0ZSkgewogICAgaWYgKHN0cmVhbS5tYXRjaCgvXiAqXC9cLygtKT8oW15cbl0qKS8pKSB7CiAgICAgIHN0YXRlLmluZGVudE9mID0gc3RyZWFtLmluZGVudGF0aW9uKCk7CiAgICAgIHN0YXRlLmluZGVudFRva2VuID0gJ2NvbW1lbnQnOwogICAgICByZXR1cm4gJ2NvbW1lbnQnOwogICAgfQogIH0KCiAgZnVuY3Rpb24gY29sb24oc3RyZWFtKSB7CiAgICBpZiAoc3RyZWFtLm1hdGNoKC9eOiAqLykpIHsKICAgICAgcmV0dXJuICdjb2xvbic7CiAgICB9CiAgfQoKICBmdW5jdGlvbiB0ZXh0KHN0cmVhbSwgc3RhdGUpIHsKICAgIGlmIChzdHJlYW0ubWF0Y2goL14oPzpcfCA/fCApKFteXG5dKykvKSkgewogICAgICByZXR1cm4gJ3N0cmluZyc7CiAgICB9CiAgICBpZiAoc3RyZWFtLm1hdGNoKC9eKDxbXlxuXSopLywgZmFsc2UpKSB7CiAgICAgIC8vIGh0bWwgc3RyaW5nCiAgICAgIHNldElubmVyTW9kZShzdHJlYW0sIHN0YXRlLCAnaHRtbG1peGVkJyk7CiAgICAgIHN0YXRlLmlubmVyTW9kZUZvckxpbmUgPSB0cnVlOwogICAgICByZXR1cm4gaW5uZXJNb2RlKHN0cmVhbSwgc3RhdGUsIHRydWUpOwogICAgfQogIH0KCiAgZnVuY3Rpb24gZG90KHN0cmVhbSwgc3RhdGUpIHsKICAgIGlmIChzdHJlYW0uZWF0KCcuJykpIHsKICAgICAgdmFyIGlubmVyTW9kZSA9IG51bGw7CiAgICAgIGlmIChzdGF0ZS5sYXN0VGFnID09PSAnc2NyaXB0JyAmJiBzdGF0ZS5zY3JpcHRUeXBlLnRvTG93ZXJDYXNlKCkuaW5kZXhPZignamF2YXNjcmlwdCcpICE9IC0xKSB7CiAgICAgICAgaW5uZXJNb2RlID0gc3RhdGUuc2NyaXB0VHlwZS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoLyJ8Jy9nLCAnJyk7CiAgICAgIH0gZWxzZSBpZiAoc3RhdGUubGFzdFRhZyA9PT0gJ3N0eWxlJykgewogICAgICAgIGlubmVyTW9kZSA9ICdjc3MnOwogICAgICB9CiAgICAgIHNldElubmVyTW9kZShzdHJlYW0sIHN0YXRlLCBpbm5lck1vZGUpOwogICAgICByZXR1cm4gJ2RvdCc7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBmYWlsKHN0cmVhbSkgewogICAgc3RyZWFtLm5leHQoKTsKICAgIHJldHVybiBudWxsOwogIH0KCgogIGZ1bmN0aW9uIHNldElubmVyTW9kZShzdHJlYW0sIHN0YXRlLCBtb2RlKSB7CiAgICBtb2RlID0gQ29kZU1pcnJvci5taW1lTW9kZXNbbW9kZV0gfHwgbW9kZTsKICAgIG1vZGUgPSBjb25maWcuaW5uZXJNb2RlcyA/IGNvbmZpZy5pbm5lck1vZGVzKG1vZGUpIHx8IG1vZGUgOiBtb2RlOwogICAgbW9kZSA9IENvZGVNaXJyb3IubWltZU1vZGVzW21vZGVdIHx8IG1vZGU7CiAgICBtb2RlID0gQ29kZU1pcnJvci5nZXRNb2RlKGNvbmZpZywgbW9kZSk7CiAgICBzdGF0ZS5pbmRlbnRPZiA9IHN0cmVhbS5pbmRlbnRhdGlvbigpOwoKICAgIGlmIChtb2RlICYmIG1vZGUubmFtZSAhPT0gJ251bGwnKSB7CiAgICAgIHN0YXRlLmlubmVyTW9kZSA9IG1vZGU7CiAgICB9IGVsc2UgewogICAgICBzdGF0ZS5pbmRlbnRUb2tlbiA9ICdzdHJpbmcnOwogICAgfQogIH0KICBmdW5jdGlvbiBpbm5lck1vZGUoc3RyZWFtLCBzdGF0ZSwgZm9yY2UpIHsKICAgIGlmIChzdHJlYW0uaW5kZW50YXRpb24oKSA+IHN0YXRlLmluZGVudE9mIHx8IChzdGF0ZS5pbm5lck1vZGVGb3JMaW5lICYmICFzdHJlYW0uc29sKCkpIHx8IGZvcmNlKSB7CiAgICAgIGlmIChzdGF0ZS5pbm5lck1vZGUpIHsKICAgICAgICBpZiAoIXN0YXRlLmlubmVyU3RhdGUpIHsKICAgICAgICAgIHN0YXRlLmlubmVyU3RhdGUgPSBzdGF0ZS5pbm5lck1vZGUuc3RhcnRTdGF0ZSA/IENvZGVNaXJyb3Iuc3RhcnRTdGF0ZShzdGF0ZS5pbm5lck1vZGUsIHN0cmVhbS5pbmRlbnRhdGlvbigpKSA6IHt9OwogICAgICAgIH0KICAgICAgICByZXR1cm4gc3RyZWFtLmhpZGVGaXJzdENoYXJzKHN0YXRlLmluZGVudE9mICsgMiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgcmV0dXJuIHN0YXRlLmlubmVyTW9kZS50b2tlbihzdHJlYW0sIHN0YXRlLmlubmVyU3RhdGUpIHx8IHRydWU7CiAgICAgICAgfSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICAgIHJldHVybiBzdGF0ZS5pbmRlbnRUb2tlbjsKICAgICAgfQogICAgfSBlbHNlIGlmIChzdHJlYW0uc29sKCkpIHsKICAgICAgc3RhdGUuaW5kZW50T2YgPSBJbmZpbml0eTsKICAgICAgc3RhdGUuaW5kZW50VG9rZW4gPSBudWxsOwogICAgICBzdGF0ZS5pbm5lck1vZGUgPSBudWxsOwogICAgICBzdGF0ZS5pbm5lclN0YXRlID0gbnVsbDsKICAgIH0KICB9CiAgZnVuY3Rpb24gcmVzdE9mTGluZShzdHJlYW0sIHN0YXRlKSB7CiAgICBpZiAoc3RyZWFtLnNvbCgpKSB7CiAgICAgIC8vIGlmIHJlc3RPZkxpbmUgd2FzIHNldCBhdCBlbmQgb2YgbGluZSwgaWdub3JlIGl0CiAgICAgIHN0YXRlLnJlc3RPZkxpbmUgPSAnJzsKICAgIH0KICAgIGlmIChzdGF0ZS5yZXN0T2ZMaW5lKSB7CiAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgdmFyIHRvayA9IHN0YXRlLnJlc3RPZkxpbmU7CiAgICAgIHN0YXRlLnJlc3RPZkxpbmUgPSAnJzsKICAgICAgcmV0dXJuIHRvazsKICAgIH0KICB9CgoKICBmdW5jdGlvbiBzdGFydFN0YXRlKCkgewogICAgcmV0dXJuIG5ldyBTdGF0ZSgpOwogIH0KICBmdW5jdGlvbiBjb3B5U3RhdGUoc3RhdGUpIHsKICAgIHJldHVybiBzdGF0ZS5jb3B5KCk7CiAgfQogIC8qKgogICAqIEdldCB0aGUgbmV4dCB0b2tlbiBpbiB0aGUgc3RyZWFtCiAgICoKICAgKiBAcGFyYW0ge1N0cmVhbX0gc3RyZWFtCiAgICogQHBhcmFtIHtTdGF0ZX0gc3RhdGUKICAgKi8KICBmdW5jdGlvbiBuZXh0VG9rZW4oc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIHRvayA9IGlubmVyTW9kZShzdHJlYW0sIHN0YXRlKQogICAgICB8fCByZXN0T2ZMaW5lKHN0cmVhbSwgc3RhdGUpCiAgICAgIHx8IGludGVycG9sYXRpb25Db250aW51ZWQoc3RyZWFtLCBzdGF0ZSkKICAgICAgfHwgaW5jbHVkZUZpbHRlcmVkQ29udGludWVkKHN0cmVhbSwgc3RhdGUpCiAgICAgIHx8IGVhY2hDb250aW51ZWQoc3RyZWFtLCBzdGF0ZSkKICAgICAgfHwgYXR0cnNDb250aW51ZWQoc3RyZWFtLCBzdGF0ZSkKICAgICAgfHwgamF2YVNjcmlwdChzdHJlYW0sIHN0YXRlKQogICAgICB8fCBqYXZhU2NyaXB0QXJndW1lbnRzKHN0cmVhbSwgc3RhdGUpCiAgICAgIHx8IGNhbGxBcmd1bWVudHMoc3RyZWFtLCBzdGF0ZSkKCiAgICAgIHx8IHlpZWxkU3RhdGVtZW50KHN0cmVhbSwgc3RhdGUpCiAgICAgIHx8IGRvY3R5cGUoc3RyZWFtLCBzdGF0ZSkKICAgICAgfHwgaW50ZXJwb2xhdGlvbihzdHJlYW0sIHN0YXRlKQogICAgICB8fCBjYXNlU3RhdGVtZW50KHN0cmVhbSwgc3RhdGUpCiAgICAgIHx8IHdoZW4oc3RyZWFtLCBzdGF0ZSkKICAgICAgfHwgZGVmYXVsdFN0YXRlbWVudChzdHJlYW0sIHN0YXRlKQogICAgICB8fCBleHRlbmRzU3RhdGVtZW50KHN0cmVhbSwgc3RhdGUpCiAgICAgIHx8IGFwcGVuZChzdHJlYW0sIHN0YXRlKQogICAgICB8fCBwcmVwZW5kKHN0cmVhbSwgc3RhdGUpCiAgICAgIHx8IGJsb2NrKHN0cmVhbSwgc3RhdGUpCiAgICAgIHx8IGluY2x1ZGUoc3RyZWFtLCBzdGF0ZSkKICAgICAgfHwgaW5jbHVkZUZpbHRlcmVkKHN0cmVhbSwgc3RhdGUpCiAgICAgIHx8IG1peGluKHN0cmVhbSwgc3RhdGUpCiAgICAgIHx8IGNhbGwoc3RyZWFtLCBzdGF0ZSkKICAgICAgfHwgY29uZGl0aW9uYWwoc3RyZWFtLCBzdGF0ZSkKICAgICAgfHwgZWFjaChzdHJlYW0sIHN0YXRlKQogICAgICB8fCB3aGlsZVN0YXRlbWVudChzdHJlYW0sIHN0YXRlKQogICAgICB8fCB0YWcoc3RyZWFtLCBzdGF0ZSkKICAgICAgfHwgZmlsdGVyKHN0cmVhbSwgc3RhdGUpCiAgICAgIHx8IGNvZGUoc3RyZWFtLCBzdGF0ZSkKICAgICAgfHwgaWQoc3RyZWFtLCBzdGF0ZSkKICAgICAgfHwgY2xhc3NOYW1lKHN0cmVhbSwgc3RhdGUpCiAgICAgIHx8IGF0dHJzKHN0cmVhbSwgc3RhdGUpCiAgICAgIHx8IGF0dHJpYnV0ZXNCbG9jayhzdHJlYW0sIHN0YXRlKQogICAgICB8fCBpbmRlbnQoc3RyZWFtLCBzdGF0ZSkKICAgICAgfHwgdGV4dChzdHJlYW0sIHN0YXRlKQogICAgICB8fCBjb21tZW50KHN0cmVhbSwgc3RhdGUpCiAgICAgIHx8IGNvbG9uKHN0cmVhbSwgc3RhdGUpCiAgICAgIHx8IGRvdChzdHJlYW0sIHN0YXRlKQogICAgICB8fCBmYWlsKHN0cmVhbSwgc3RhdGUpOwoKICAgIHJldHVybiB0b2sgPT09IHRydWUgPyBudWxsIDogdG9rOwogIH0KICByZXR1cm4gewogICAgc3RhcnRTdGF0ZTogc3RhcnRTdGF0ZSwKICAgIGNvcHlTdGF0ZTogY29weVN0YXRlLAogICAgdG9rZW46IG5leHRUb2tlbgogIH07Cn0sICdqYXZhc2NyaXB0JywgJ2NzcycsICdodG1sbWl4ZWQnKTsKCkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgndGV4dC94LXB1ZycsICdwdWcnKTsKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCd0ZXh0L3gtamFkZScsICdwdWcnKTsKCn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/puppet/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/puppet/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogUHVwcGV0IG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vLi4vYWRkb24vZWRpdC9tYXRjaGJyYWNrZXRzLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9InB1cHBldC5qcyI+PC9zY3JpcHQ+CjxzdHlsZT4KICAgICAgLkNvZGVNaXJyb3Ige2JvcmRlci10b3A6IDFweCBzb2xpZCBibGFjazsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO30KICAgICAgLmNtLXMtZGVmYXVsdCBzcGFuLmNtLWFycm93IHsgY29sb3I6IHJlZDsgfQogICAgPC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aDE+Q29kZU1pcnJvcjwvaDE+PGltZyBpZD1sb2dvIHNyYz0iLi4vLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+TGFuZ3VhZ2UgbW9kZXM8L2E+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPlB1cHBldDwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+UHVwcGV0IG1vZGU8L2gyPgo8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgojID09IENsYXNzOiBhdXRvbXlzcWxiYWNrdXAKIwojIFB1cHBldCBtb2R1bGUgdG8gaW5zdGFsbCBBdXRvTXlTUUxCYWNrdXAgZm9yIHBlcmlvZGljIE15U1FMIGJhY2t1cHMuCiMKIyBjbGFzcyB7ICdhdXRvbXlzcWxiYWNrdXAnOgojICAgYmFja3VwX2RpciA9PiAnL21udC9iYWNrdXBzJywKIyB9CiMKCmNsYXNzIGF1dG9teXNxbGJhY2t1cCAoCiAgJGJpbl9kaXIgPSAkYXV0b215c3FsYmFja3VwOjpwYXJhbXM6OmJpbl9kaXIsCiAgJGV0Y19kaXIgPSAkYXV0b215c3FsYmFja3VwOjpwYXJhbXM6OmV0Y19kaXIsCiAgJGJhY2t1cF9kaXIgPSAkYXV0b215c3FsYmFja3VwOjpwYXJhbXM6OmJhY2t1cF9kaXIsCiAgJGluc3RhbGxfbXVsdGljb3JlID0gdW5kZWYsCiAgJGNvbmZpZyA9IHt9LAogICRjb25maWdfZGVmYXVsdHMgPSB7fSwKKSBpbmhlcml0cyBhdXRvbXlzcWxiYWNrdXA6OnBhcmFtcyB7CgojIEVuc3VyZSB2YWxpZCBwYXRocyBhcmUgYXNzaWduZWQKICB2YWxpZGF0ZV9hYnNvbHV0ZV9wYXRoKCRiaW5fZGlyKQogIHZhbGlkYXRlX2Fic29sdXRlX3BhdGgoJGV0Y19kaXIpCiAgdmFsaWRhdGVfYWJzb2x1dGVfcGF0aCgkYmFja3VwX2RpcikKCiMgQ3JlYXRlIGEgc3ViZGlyZWN0b3J5IGluIC9ldGMgZm9yIGNvbmZpZyBmaWxlcwogIGZpbGUgeyAkZXRjX2RpcjoKICAgIGVuc3VyZSA9PiBkaXJlY3RvcnksCiAgICBvd25lciA9PiAncm9vdCcsCiAgICBncm91cCA9PiAncm9vdCcsCiAgICBtb2RlID0+ICcwNzUwJywKICB9CgojIENyZWF0ZSBhbiBleGFtcGxlIGJhY2t1cCBmaWxlLCB1c2VmdWwgZm9yIHJlZmVyZW5jZQogIGZpbGUgeyAiJHtldGNfZGlyfS9hdXRvbXlzcWxiYWNrdXAuY29uZi5leGFtcGxlIjoKICAgIGVuc3VyZSA9PiBmaWxlLAogICAgb3duZXIgPT4gJ3Jvb3QnLAogICAgZ3JvdXAgPT4gJ3Jvb3QnLAogICAgbW9kZSA9PiAnMDY2MCcsCiAgICBzb3VyY2UgPT4gJ3B1cHBldDovLy9tb2R1bGVzL2F1dG9teXNxbGJhY2t1cC9hdXRvbXlzcWxiYWNrdXAuY29uZicsCiAgfQoKIyBBZGQgZmlsZXMgZnJvbSB0aGUgZGV2ZWxvcGVyCiAgZmlsZSB7ICIke2V0Y19kaXJ9L0FNQl9SRUFETUUiOgogICAgZW5zdXJlID0+IGZpbGUsCiAgICBzb3VyY2UgPT4gJ3B1cHBldDovLy9tb2R1bGVzL2F1dG9teXNxbGJhY2t1cC9BTUJfUkVBRE1FJywKICB9CiAgZmlsZSB7ICIke2V0Y19kaXJ9L0FNQl9MSUNFTlNFIjoKICAgIGVuc3VyZSA9PiBmaWxlLAogICAgc291cmNlID0+ICdwdXBwZXQ6Ly8vbW9kdWxlcy9hdXRvbXlzcWxiYWNrdXAvQU1CX0xJQ0VOU0UnLAogIH0KCiMgSW5zdGFsbCB0aGUgYWN0dWFsIGJpbmFyeSBmaWxlCiAgZmlsZSB7ICIke2Jpbl9kaXJ9L2F1dG9teXNxbGJhY2t1cCI6CiAgICBlbnN1cmUgPT4gZmlsZSwKICAgIG93bmVyID0+ICdyb290JywKICAgIGdyb3VwID0+ICdyb290JywKICAgIG1vZGUgPT4gJzA3NTUnLAogICAgc291cmNlID0+ICdwdXBwZXQ6Ly8vbW9kdWxlcy9hdXRvbXlzcWxiYWNrdXAvYXV0b215c3FsYmFja3VwJywKICB9CgojIENyZWF0ZSB0aGUgYmFzZSBiYWNrdXAgZGlyZWN0b3J5CiAgZmlsZSB7ICRiYWNrdXBfZGlyOgogICAgZW5zdXJlID0+IGRpcmVjdG9yeSwKICAgIG93bmVyID0+ICdyb290JywKICAgIGdyb3VwID0+ICdyb290JywKICAgIG1vZGUgPT4gJzA3NTUnLAogIH0KCiMgSWYgeW91J2QgbGlrZSB0byBrZWVwIHlvdXIgY29uZmlnIGluIGhpZXJhIGFuZCBwYXNzIGl0IHRvIHRoaXMgY2xhc3MKICBpZiAhZW1wdHkoJGNvbmZpZykgewogICAgY3JlYXRlX3Jlc291cmNlcygnYXV0b215c3FsYmFja3VwOjpiYWNrdXAnLCAkY29uZmlnLCAkY29uZmlnX2RlZmF1bHRzKQogIH0KCiMgSWYgdXNpbmcgUmVkSGF0IGZhbWlseSwgbXVzdCBoYXZlIHRoZSBSUE1mb3JnZSByZXBvJ3MgZW5hYmxlZAogIGlmICRpbnN0YWxsX211bHRpY29yZSB7CiAgICBwYWNrYWdlIHsgWydwaWd6JywgJ3BiemlwMiddOiBlbnN1cmUgPT4gaW5zdGFsbGVkIH0KICB9Cgp9CjwvdGV4dGFyZWE+PC9mb3JtPgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICBtb2RlOiAidGV4dC94LXB1cHBldCIsCiAgICAgICAgbWF0Y2hCcmFja2V0czogdHJ1ZSwKICAgICAgICBpbmRlbnRVbml0OiA0CiAgICAgIH0pOwogICAgPC9zY3JpcHQ+CgogICAgPHA+PHN0cm9uZz5NSU1FIHR5cGVzIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPnRleHQveC1wdXBwZXQ8L2NvZGU+LjwvcD4KCiAgPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/puppet/puppet.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJwdXBwZXQiLCBmdW5jdGlvbiAoKSB7CiAgLy8gU3RvcmVzIHRoZSB3b3JkcyBmcm9tIHRoZSBkZWZpbmUgbWV0aG9kCiAgdmFyIHdvcmRzID0ge307CiAgLy8gVGFrZW4sIG1vc3RseSwgZnJvbSB0aGUgUHVwcGV0IG9mZmljaWFsIHZhcmlhYmxlIHN0YW5kYXJkcyByZWdleAogIHZhciB2YXJpYWJsZV9yZWdleCA9IC8oeyk/KFthLXpdW2EtejAtOV9dKik/KCg6OlthLXpdW2EtejAtOV9dKikqOjopP1thLXpBLVowLTlfXSsofSk/LzsKCiAgLy8gVGFrZXMgYSBzdHJpbmcgb2Ygd29yZHMgc2VwYXJhdGVkIGJ5IHNwYWNlcyBhbmQgYWRkcyB0aGVtIGFzCiAgLy8ga2V5cyB3aXRoIHRoZSB2YWx1ZSBvZiB0aGUgZmlyc3QgYXJndW1lbnQgJ3N0eWxlJwogIGZ1bmN0aW9uIGRlZmluZShzdHlsZSwgc3RyaW5nKSB7CiAgICB2YXIgc3BsaXQgPSBzdHJpbmcuc3BsaXQoJyAnKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3BsaXQubGVuZ3RoOyBpKyspIHsKICAgICAgd29yZHNbc3BsaXRbaV1dID0gc3R5bGU7CiAgICB9CiAgfQoKICAvLyBUYWtlcyBjb21tb25seSBrbm93biBwdXBwZXQgdHlwZXMvd29yZHMgYW5kIGNsYXNzaWZpZXMgdGhlbSB0byBhIHN0eWxlCiAgZGVmaW5lKCdrZXl3b3JkJywgJ2NsYXNzIGRlZmluZSBzaXRlIG5vZGUgaW5jbHVkZSBpbXBvcnQgaW5oZXJpdHMnKTsKICBkZWZpbmUoJ2tleXdvcmQnLCAnY2FzZSBpZiBlbHNlIGluIGFuZCBlbHNpZiBkZWZhdWx0IG9yJyk7CiAgZGVmaW5lKCdhdG9tJywgJ2ZhbHNlIHRydWUgcnVubmluZyBwcmVzZW50IGFic2VudCBmaWxlIGRpcmVjdG9yeSB1bmRlZicpOwogIGRlZmluZSgnYnVpbHRpbicsICdhY3Rpb24gYXVnZWFzIGJ1cnN0IGNoYWluIGNvbXB1dGVyIGNyb24gZGVzdGluYXRpb24gZHBvcnQgZXhlYyAnICsKICAgICdmaWxlIGZpbGVidWNrZXQgZ3JvdXAgaG9zdCBpY21wIGluaWZhY2UgaW50ZXJmYWNlIGp1bXAgazVsb2dpbiBsaW1pdCBsb2dfbGV2ZWwgJyArCiAgICAnbG9nX3ByZWZpeCBtYWNhdXRob3JpemF0aW9uIG1haWxhbGlhcyBtYWlsbGlzdCBtY3ggbW91bnQgbmFnaW9zX2NvbW1hbmQgJyArCiAgICAnbmFnaW9zX2NvbnRhY3QgbmFnaW9zX2NvbnRhY3Rncm91cCBuYWdpb3NfaG9zdCBuYWdpb3NfaG9zdGRlcGVuZGVuY3kgJyArCiAgICAnbmFnaW9zX2hvc3Rlc2NhbGF0aW9uIG5hZ2lvc19ob3N0ZXh0aW5mbyBuYWdpb3NfaG9zdGdyb3VwIG5hZ2lvc19zZXJ2aWNlICcgKwogICAgJ25hZ2lvc19zZXJ2aWNlZGVwZW5kZW5jeSBuYWdpb3Nfc2VydmljZWVzY2FsYXRpb24gbmFnaW9zX3NlcnZpY2VleHRpbmZvICcgKwogICAgJ25hZ2lvc19zZXJ2aWNlZ3JvdXAgbmFnaW9zX3RpbWVwZXJpb2QgbmFtZSBub3RpZnkgb3V0aWZhY2UgcGFja2FnZSBwcm90byByZWplY3QgJyArCiAgICAncmVzb3VyY2VzIHJvdXRlciBzY2hlZHVsZSBzY2hlZHVsZWRfdGFzayBzZWxib29sZWFuIHNlbG1vZHVsZSBzZXJ2aWNlIHNvdXJjZSAnICsKICAgICdzcG9ydCBzc2hfYXV0aG9yaXplZF9rZXkgc3Noa2V5IHN0YWdlIHN0YXRlIHRhYmxlIHRpZHkgdG9kZXN0IHRvcG9ydHMgdG9zb3VyY2UgJyArCiAgICAndXNlciB2bGFuIHl1bXJlcG8gemZzIHpvbmUgenBvb2wnKTsKCiAgLy8gQWZ0ZXIgZmluZGluZyBhIHN0YXJ0IG9mIGEgc3RyaW5nICgnfCIpIHRoaXMgZnVuY3Rpb24gYXR0ZW1wdHMgdG8gZmluZCB0aGUgZW5kOwogIC8vIElmIGEgdmFyaWFibGUgaXMgZW5jb3VudGVyZWQgYWxvbmcgdGhlIHdheSwgd2UgZGlzcGxheSBpdCBkaWZmZXJlbnRseSB3aGVuIGl0CiAgLy8gaXMgZW5jYXBzdWxhdGVkIGluIGEgZG91YmxlLXF1b3RlZCBzdHJpbmcuCiAgZnVuY3Rpb24gdG9rZW5TdHJpbmcoc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIGN1cnJlbnQsIHByZXYsIGZvdW5kX3ZhciA9IGZhbHNlOwogICAgd2hpbGUgKCFzdHJlYW0uZW9sKCkgJiYgKGN1cnJlbnQgPSBzdHJlYW0ubmV4dCgpKSAhPSBzdGF0ZS5wZW5kaW5nKSB7CiAgICAgIGlmIChjdXJyZW50ID09PSAnJCcgJiYgcHJldiAhPSAnXFwnICYmIHN0YXRlLnBlbmRpbmcgPT0gJyInKSB7CiAgICAgICAgZm91bmRfdmFyID0gdHJ1ZTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBwcmV2ID0gY3VycmVudDsKICAgIH0KICAgIGlmIChmb3VuZF92YXIpIHsKICAgICAgc3RyZWFtLmJhY2tVcCgxKTsKICAgIH0KICAgIGlmIChjdXJyZW50ID09IHN0YXRlLnBlbmRpbmcpIHsKICAgICAgc3RhdGUuY29udGludWVTdHJpbmcgPSBmYWxzZTsKICAgIH0gZWxzZSB7CiAgICAgIHN0YXRlLmNvbnRpbnVlU3RyaW5nID0gdHJ1ZTsKICAgIH0KICAgIHJldHVybiAic3RyaW5nIjsKICB9CgogIC8vIE1haW4gZnVuY3Rpb24KICBmdW5jdGlvbiB0b2tlbml6ZShzdHJlYW0sIHN0YXRlKSB7CiAgICAvLyBNYXRjaGVzIG9uZSB3aG9sZSB3b3JkCiAgICB2YXIgd29yZCA9IHN0cmVhbS5tYXRjaCgvW1x3XSsvLCBmYWxzZSk7CiAgICAvLyBNYXRjaGVzIGF0dHJpYnV0ZXMgKGkuZS4gZW5zdXJlID0+IHByZXNlbnQgOyAnZW5zdXJlJyB3b3VsZCBiZSBtYXRjaGVkKQogICAgdmFyIGF0dHJpYnV0ZSA9IHN0cmVhbS5tYXRjaCgvKFxzKyk/XHcrXHMrPT4uKi8sIGZhbHNlKTsKICAgIC8vIE1hdGNoZXMgbm9uLWJ1aWx0aW4gcmVzb3VyY2UgZGVjbGFyYXRpb25zCiAgICAvLyAoaS5lLiAiYXBhY2hlOjp2aG9zdCB7IiBvciAibXljdXN0b21jbGFzc3MgeyIgd291bGQgYmUgbWF0Y2hlZCkKICAgIHZhciByZXNvdXJjZSA9IHN0cmVhbS5tYXRjaCgvKFxzKyk/W1x3Ol9dKyhccyspP3svLCBmYWxzZSk7CiAgICAvLyBNYXRjaGVzIHZpcnR1YWwgYW5kIGV4cG9ydGVkIHJlc291cmNlcyAoaS5lLiBAQHVzZXIgeyA7IGFuZCB0aGUgbGlrZSkKICAgIHZhciBzcGVjaWFsX3Jlc291cmNlID0gc3RyZWFtLm1hdGNoKC8oXHMrKT9bQF17MSwyfVtcdzpfXSsoXHMrKT97LywgZmFsc2UpOwoKICAgIC8vIEZpbmFsbHkgYWR2YW5jZSB0aGUgc3RyZWFtCiAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpOwoKICAgIC8vIEhhdmUgd2UgZm91bmQgYSB2YXJpYWJsZT8KICAgIGlmIChjaCA9PT0gJyQnKSB7CiAgICAgIGlmIChzdHJlYW0ubWF0Y2godmFyaWFibGVfcmVnZXgpKSB7CiAgICAgICAgLy8gSWYgc28sIGFuZCBpdHMgaW4gYSBzdHJpbmcsIGFzc2lnbiBpdCBhIGRpZmZlcmVudCBjb2xvcgogICAgICAgIHJldHVybiBzdGF0ZS5jb250aW51ZVN0cmluZyA/ICd2YXJpYWJsZS0yJyA6ICd2YXJpYWJsZSc7CiAgICAgIH0KICAgICAgLy8gT3RoZXJ3aXNlIHJldHVybiBhbiBpbnZhbGlkIHZhcmlhYmxlCiAgICAgIHJldHVybiAiZXJyb3IiOwogICAgfQogICAgLy8gU2hvdWxkIHdlIHN0aWxsIGJlIGxvb2tpbmcgZm9yIHRoZSBlbmQgb2YgYSBzdHJpbmc/CiAgICBpZiAoc3RhdGUuY29udGludWVTdHJpbmcpIHsKICAgICAgLy8gSWYgc28sIGdvIHRocm91Z2ggdGhlIGxvb3AgYWdhaW4KICAgICAgc3RyZWFtLmJhY2tVcCgxKTsKICAgICAgcmV0dXJuIHRva2VuU3RyaW5nKHN0cmVhbSwgc3RhdGUpOwogICAgfQogICAgLy8gQXJlIHdlIGluIGEgZGVmaW5pdGlvbiAoY2xhc3MsIG5vZGUsIGRlZmluZSk/CiAgICBpZiAoc3RhdGUuaW5EZWZpbml0aW9uKSB7CiAgICAgIC8vIElmIHNvLCByZXR1cm4gZGVmIChpLmUuIGZvciAnY2xhc3MgbXljbGFzcyB7JyA7ICdteWNsYXNzJyB3b3VsZCBiZSBtYXRjaGVkKQogICAgICBpZiAoc3RyZWFtLm1hdGNoKC8oXHMrKT9bXHc6X10rKFxzKyk/LykpIHsKICAgICAgICByZXR1cm4gJ2RlZic7CiAgICAgIH0KICAgICAgLy8gTWF0Y2ggdGhlIHJlc3QgaXQgdGhlIG5leHQgdGltZSBhcm91bmQKICAgICAgc3RyZWFtLm1hdGNoKC9ccyt7Lyk7CiAgICAgIHN0YXRlLmluRGVmaW5pdGlvbiA9IGZhbHNlOwogICAgfQogICAgLy8gQXJlIHdlIGluIGFuICdpbmNsdWRlJyBzdGF0ZW1lbnQ/CiAgICBpZiAoc3RhdGUuaW5JbmNsdWRlKSB7CiAgICAgIC8vIE1hdGNoIGFuZCByZXR1cm4gdGhlIGluY2x1ZGVkIGNsYXNzCiAgICAgIHN0cmVhbS5tYXRjaCgvKFxzKyk/XFMrKFxzKyk/Lyk7CiAgICAgIHN0YXRlLmluSW5jbHVkZSA9IGZhbHNlOwogICAgICByZXR1cm4gJ2RlZic7CiAgICB9CiAgICAvLyBEbyB3ZSBqdXN0IGhhdmUgYSBmdW5jdGlvbiBvbiBvdXIgaGFuZHM/CiAgICAvLyBJbiAnZW5zdXJlX3Jlc291cmNlKCJteWNsYXNzIiknLCAnZW5zdXJlX3Jlc291cmNlJyBpcyBtYXRjaGVkCiAgICBpZiAoc3RyZWFtLm1hdGNoKC8oXHMrKT9cdytcKC8pKSB7CiAgICAgIHN0cmVhbS5iYWNrVXAoMSk7CiAgICAgIHJldHVybiAnZGVmJzsKICAgIH0KICAgIC8vIEhhdmUgd2UgbWF0Y2hlZCB0aGUgcHJpb3IgYXR0cmlidXRlIHJlZ2V4PwogICAgaWYgKGF0dHJpYnV0ZSkgewogICAgICBzdHJlYW0ubWF0Y2goLyhccyspP1x3Ky8pOwogICAgICByZXR1cm4gJ3RhZyc7CiAgICB9CiAgICAvLyBEbyB3ZSBoYXZlIFB1cHBldCBzcGVjaWZpYyB3b3Jkcz8KICAgIGlmICh3b3JkICYmIHdvcmRzLmhhc093blByb3BlcnR5KHdvcmQpKSB7CiAgICAgIC8vIE5lZ2F0ZXMgdGhlIGluaXRpYWwgbmV4dCgpCiAgICAgIHN0cmVhbS5iYWNrVXAoMSk7CiAgICAgIC8vIHJzIG1vdmUgdGhlIHN0cmVhbQogICAgICBzdHJlYW0ubWF0Y2goL1tcd10rLyk7CiAgICAgIC8vIFdlIHdhbnQgdG8gcHJvY2VzcyB0aGVzZSB3b3JkcyBkaWZmZXJlbnRseQogICAgICAvLyBkbyB0byB0aGUgaW1wb3J0YW5jZSB0aGV5IGhhdmUgaW4gUHVwcGV0CiAgICAgIGlmIChzdHJlYW0ubWF0Y2goL1xzK1xTK1xzK3svLCBmYWxzZSkpIHsKICAgICAgICBzdGF0ZS5pbkRlZmluaXRpb24gPSB0cnVlOwogICAgICB9CiAgICAgIGlmICh3b3JkID09ICdpbmNsdWRlJykgewogICAgICAgIHN0YXRlLmluSW5jbHVkZSA9IHRydWU7CiAgICAgIH0KICAgICAgLy8gUmV0dXJucyB0aGVpciB2YWx1ZSBhcyBzdGF0ZSBpbiB0aGUgcHJpb3IgZGVmaW5lIG1ldGhvZHMKICAgICAgcmV0dXJuIHdvcmRzW3dvcmRdOwogICAgfQogICAgLy8gSXMgdGhlcmUgYSBtYXRjaCBvbiBhIHJlZmVyZW5jZT8KICAgIGlmICgvKF58XHMrKVtBLVpdW1x3Ol9dKy8udGVzdCh3b3JkKSkgewogICAgICAvLyBOZWdhdGUgdGhlIG5leHQoKQogICAgICBzdHJlYW0uYmFja1VwKDEpOwogICAgICAvLyBNYXRjaCB0aGUgZnVsbCByZWZlcmVuY2UKICAgICAgc3RyZWFtLm1hdGNoKC8oXnxccyspW0EtWl1bXHc6X10rLyk7CiAgICAgIHJldHVybiAnZGVmJzsKICAgIH0KICAgIC8vIEhhdmUgd2UgbWF0Y2hlZCB0aGUgcHJpb3IgcmVzb3VyY2UgcmVnZXg/CiAgICBpZiAocmVzb3VyY2UpIHsKICAgICAgc3RyZWFtLm1hdGNoKC8oXHMrKT9bXHc6X10rLyk7CiAgICAgIHJldHVybiAnZGVmJzsKICAgIH0KICAgIC8vIEhhdmUgd2UgbWF0Y2hlZCB0aGUgcHJpb3Igc3BlY2lhbF9yZXNvdXJjZSByZWdleD8KICAgIGlmIChzcGVjaWFsX3Jlc291cmNlKSB7CiAgICAgIHN0cmVhbS5tYXRjaCgvKFxzKyk/W0BdezEsMn0vKTsKICAgICAgcmV0dXJuICdzcGVjaWFsJzsKICAgIH0KICAgIC8vIE1hdGNoIGFsbCB0aGUgY29tbWVudHMuIEFsbCBvZiB0aGVtLgogICAgaWYgKGNoID09ICIjIikgewogICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICAgIHJldHVybiAiY29tbWVudCI7CiAgICB9CiAgICAvLyBIYXZlIHdlIGZvdW5kIGEgc3RyaW5nPwogICAgaWYgKGNoID09ICInIiB8fCBjaCA9PSAnIicpIHsKICAgICAgLy8gU3RvcmUgdGhlIHR5cGUgKHNpbmdsZSBvciBkb3VibGUpCiAgICAgIHN0YXRlLnBlbmRpbmcgPSBjaDsKICAgICAgLy8gUGVyZm9ybSB0aGUgbG9vcGluZyBmdW5jdGlvbiB0byBmaW5kIHRoZSBlbmQKICAgICAgcmV0dXJuIHRva2VuU3RyaW5nKHN0cmVhbSwgc3RhdGUpOwogICAgfQogICAgLy8gTWF0Y2ggYWxsIHRoZSBicmFja2V0cwogICAgaWYgKGNoID09ICd7JyB8fCBjaCA9PSAnfScpIHsKICAgICAgcmV0dXJuICdicmFja2V0JzsKICAgIH0KICAgIC8vIE1hdGNoIGNoYXJhY3RlcnMgdGhhdCB3ZSBhcmUgZ29pbmcgdG8gYXNzdW1lCiAgICAvLyBhcmUgdHJ5aW5nIHRvIGJlIHJlZ2V4CiAgICBpZiAoY2ggPT0gJy8nKSB7CiAgICAgIHN0cmVhbS5tYXRjaCgvLio/XC8vKTsKICAgICAgcmV0dXJuICd2YXJpYWJsZS0zJzsKICAgIH0KICAgIC8vIE1hdGNoIGFsbCB0aGUgbnVtYmVycwogICAgaWYgKGNoLm1hdGNoKC9bMC05XS8pKSB7CiAgICAgIHN0cmVhbS5lYXRXaGlsZSgvWzAtOV0rLyk7CiAgICAgIHJldHVybiAnbnVtYmVyJzsKICAgIH0KICAgIC8vIE1hdGNoIHRoZSAnPScgYW5kICc9Picgb3BlcmF0b3JzCiAgICBpZiAoY2ggPT0gJz0nKSB7CiAgICAgIGlmIChzdHJlYW0ucGVlaygpID09ICc+JykgewogICAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgfQogICAgICByZXR1cm4gIm9wZXJhdG9yIjsKICAgIH0KICAgIC8vIEtlZXAgYWR2YW5jaW5nIHRocm91Z2ggYWxsIHRoZSByZXN0CiAgICBzdHJlYW0uZWF0V2hpbGUoL1tcdy1dLyk7CiAgICAvLyBSZXR1cm4gYSBibGFuayBsaW5lIGZvciBldmVyeXRoaW5nIGVsc2UKICAgIHJldHVybiBudWxsOwogIH0KICAvLyBTdGFydCBpdCBhbGwKICByZXR1cm4gewogICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24gKCkgewogICAgICB2YXIgc3RhdGUgPSB7fTsKICAgICAgc3RhdGUuaW5EZWZpbml0aW9uID0gZmFsc2U7CiAgICAgIHN0YXRlLmluSW5jbHVkZSA9IGZhbHNlOwogICAgICBzdGF0ZS5jb250aW51ZVN0cmluZyA9IGZhbHNlOwogICAgICBzdGF0ZS5wZW5kaW5nID0gZmFsc2U7CiAgICAgIHJldHVybiBzdGF0ZTsKICAgIH0sCiAgICB0b2tlbjogZnVuY3Rpb24gKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgLy8gU3RyaXAgdGhlIHNwYWNlcywgYnV0IHJlZ2V4IHdpbGwgYWNjb3VudCBmb3IgdGhlbSBlaXRoZXJ3YXkKICAgICAgaWYgKHN0cmVhbS5lYXRTcGFjZSgpKSByZXR1cm4gbnVsbDsKICAgICAgLy8gR28gdGhyb3VnaCB0aGUgbWFpbiBwcm9jZXNzCiAgICAgIHJldHVybiB0b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgIH0KICB9Owp9KTsKCkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC94LXB1cHBldCIsICJwdXBwZXQiKTsKCn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/python/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/python/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogUHl0aG9uIG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vLi4vYWRkb24vZWRpdC9tYXRjaGJyYWNrZXRzLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9InB5dGhvbi5qcyI+PC9zY3JpcHQ+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+LkNvZGVNaXJyb3Ige2JvcmRlci10b3A6IDFweCBzb2xpZCBibGFjazsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO308L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxoMT5Db2RlTWlycm9yPC9oMT48aW1nIGlkPWxvZ28gc3JjPSIuLi8uLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5MYW5ndWFnZSBtb2RlczwvYT4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+UHl0aG9uPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5QeXRob24gbW9kZTwvaDI+CgogICAgPGRpdj48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgojIExpdGVyYWxzCjEyMzQKMC4wZTEwMQouMTIzCjBiMDEwMTAwMTExMDAKMG8wMTIzNDU2NwoweDA5ODc2NTQzMjFhYmNkZWYKNwoyMTQ3NDgzNjQ3CjNMCjc5MjI4MTYyNTE0MjY0MzM3NTkzNTQzOTUwMzM2TAoweDEwMDAwMDAwMEwKNzkyMjgxNjI1MTQyNjQzMzc1OTM1NDM5NTAzMzYKMHhkZWFkYmVlZgozLjE0agoxMC5qCjEwagouMDAxagoxZTEwMGoKMy4xNGUtMTBqCgoKIyBTdHJpbmcgTGl0ZXJhbHMKJ0ZvclwnJwoiR29kXCIiCiIiInNvIGxvdmVkCnRoZSB3b3JsZCIiIgonJyd0aGF0IGhlIGdhdmUKaGlzIG9ubHkgYmVnb3R0ZW5cJyAnJycKJ3RoYXQgd2hvc29ldmVyIGJlbGlldmV0aCBcCmluIGhpbScKJycKCiMgSWRlbnRpZmllcnMKX19hX18KYS5iCmEuYi5jCgojVW5pY29kZSBpZGVudGlmaWVycyBvbiBQeXRob24zCiMgYSA9IHhcZGRvdAph4oOXID0geMyICiMgYSA9IHZcZG90CmHig5cgPSB2zIcKCiNGXHZlYyA9IG0gXGNkb3QgYVx2ZWMKRuKDlyA9IG3igKJh4oOXIAoKIyBPcGVyYXRvcnMKKyAtICogLyAlICYgfCBeIH4gPCA+Cj09ICE9IDw9ID49IDw+IDw8ID4+IC8vICoqCmFuZCBvciBub3QgaW4gaXMKCiNpbmZpeCBtYXRyaXggbXVsdGlwbGljYXRpb24gb3BlcmF0b3IgKFBFUCA0NjUpCkEgQCBCCgojIERlbGltaXRlcnMKKCkgW10ge30gLCA6IGAgPSA7IEAgLiAgIyBOb3RlIHRoYXQgQCBhbmQgLiByZXF1aXJlIHRoZSBwcm9wZXIgY29udGV4dCBvbiBQeXRob24gMi4KKz0gLT0gKj0gLz0gJT0gJj0gfD0gXj0KLy89ID4+PSA8PD0gKio9CgojIEtleXdvcmRzCmFzIGFzc2VydCBicmVhayBjbGFzcyBjb250aW51ZSBkZWYgZGVsIGVsaWYgZWxzZSBleGNlcHQKZmluYWxseSBmb3IgZnJvbSBnbG9iYWwgaWYgaW1wb3J0IGxhbWJkYSBwYXNzIHJhaXNlCnJldHVybiB0cnkgd2hpbGUgd2l0aCB5aWVsZAoKIyBQeXRob24gMiBLZXl3b3JkcyAob3RoZXJ3aXNlIElkZW50aWZpZXJzKQpleGVjIHByaW50CgojIFB5dGhvbiAzIEtleXdvcmRzIChvdGhlcndpc2UgSWRlbnRpZmllcnMpCm5vbmxvY2FsCgojIFR5cGVzCmJvb2wgY2xhc3NtZXRob2QgY29tcGxleCBkaWN0IGVudW1lcmF0ZSBmbG9hdCBmcm96ZW5zZXQgaW50IGxpc3Qgb2JqZWN0CnByb3BlcnR5IHJldmVyc2VkIHNldCBzbGljZSBzdGF0aWNtZXRob2Qgc3RyIHN1cGVyIHR1cGxlIHR5cGUKCiMgUHl0aG9uIDIgVHlwZXMgKG90aGVyd2lzZSBJZGVudGlmaWVycykKYmFzZXN0cmluZyBidWZmZXIgZmlsZSBsb25nIHVuaWNvZGUgeHJhbmdlCgojIFB5dGhvbiAzIFR5cGVzIChvdGhlcndpc2UgSWRlbnRpZmllcnMpCmJ5dGVhcnJheSBieXRlcyBmaWx0ZXIgbWFwIG1lbW9yeXZpZXcgb3BlbiByYW5nZSB6aXAKCiMgU29tZSBFeGFtcGxlIGNvZGUKaW1wb3J0IG9zCmZyb20gcGFja2FnZSBpbXBvcnQgUGFyZW50Q2xhc3MKCkBub25zZW5zZURlY29yYXRvcgpkZWYgZG9lc05vdGhpbmcoKToKICAgIHBhc3MKCmNsYXNzIEV4YW1wbGVDbGFzcyhQYXJlbnRDbGFzcyk6CiAgICBAc3RhdGljbWV0aG9kCiAgICBkZWYgZXhhbXBsZShpbnB1dFN0cik6CiAgICAgICAgYSA9IGxpc3QoaW5wdXRTdHIpCiAgICAgICAgYS5yZXZlcnNlKCkKICAgICAgICByZXR1cm4gJycuam9pbihhKQoKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBtaXhpbiA9ICdIZWxsbycpOgogICAgICAgIHNlbGYubWl4aW4gPSBtaXhpbgoKPC90ZXh0YXJlYT48L2Rpdj4KCgo8aDI+Q3l0aG9uIG1vZGU8L2gyPgoKPGRpdj48dGV4dGFyZWEgaWQ9ImNvZGUtY3l0aG9uIiBuYW1lPSJjb2RlLWN5dGhvbiI+CgppbXBvcnQgbnVtcHkgYXMgbnAKY2ltcG9ydCBjeXRob24KZnJvbSBsaWJjLm1hdGggY2ltcG9ydCBzcXJ0CgpAY3l0aG9uLmJvdW5kc2NoZWNrKEZhbHNlKQpAY3l0aG9uLndyYXBhcm91bmQoRmFsc2UpCmRlZiBwYWlyd2lzZV9jeXRob24oZG91YmxlWzosIDo6MV0gWCk6CiAgICBjZGVmIGludCBNID0gWC5zaGFwZVswXQogICAgY2RlZiBpbnQgTiA9IFguc2hhcGVbMV0KICAgIGNkZWYgZG91YmxlIHRtcCwgZAogICAgY2RlZiBkb3VibGVbOiwgOjoxXSBEID0gbnAuZW1wdHkoKE0sIE0pLCBkdHlwZT1ucC5mbG9hdDY0KQogICAgZm9yIGkgaW4gcmFuZ2UoTSk6CiAgICAgICAgZm9yIGogaW4gcmFuZ2UoTSk6CiAgICAgICAgICAgIGQgPSAwLjAKICAgICAgICAgICAgZm9yIGsgaW4gcmFuZ2UoTik6CiAgICAgICAgICAgICAgICB0bXAgPSBYW2ksIGtdIC0gWFtqLCBrXQogICAgICAgICAgICAgICAgZCArPSB0bXAgKiB0bXAKICAgICAgICAgICAgRFtpLCBqXSA9IHNxcnQoZCkKICAgIHJldHVybiBucC5hc2FycmF5KEQpCgo8L3RleHRhcmVhPjwvZGl2PgoKICAgIDxzY3JpcHQ+CiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICAgICAgbW9kZToge25hbWU6ICJweXRob24iLAogICAgICAgICAgICAgICB2ZXJzaW9uOiAzLAogICAgICAgICAgICAgICBzaW5nbGVMaW5lU3RyaW5nRXJyb3JzOiBmYWxzZX0sCiAgICAgICAgbGluZU51bWJlcnM6IHRydWUsCiAgICAgICAgaW5kZW50VW5pdDogNCwKICAgICAgICBtYXRjaEJyYWNrZXRzOiB0cnVlCiAgICB9KTsKCiAgICBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZS1jeXRob24iKSwgewogICAgICAgIG1vZGU6IHtuYW1lOiAidGV4dC94LWN5dGhvbiIsCiAgICAgICAgICAgICAgIHZlcnNpb246IDIsCiAgICAgICAgICAgICAgIHNpbmdsZUxpbmVTdHJpbmdFcnJvcnM6IGZhbHNlfSwKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgICAgICBpbmRlbnRVbml0OiA0LAogICAgICAgIG1hdGNoQnJhY2tldHM6IHRydWUKICAgICAgfSk7CiAgICA8L3NjcmlwdD4KICAgIDxoMj5Db25maWd1cmF0aW9uIE9wdGlvbnMgZm9yIFB5dGhvbiBtb2RlOjwvaDI+CiAgICA8dWw+CiAgICAgIDxsaT52ZXJzaW9uIC0gMi8zIC0gVGhlIHZlcnNpb24gb2YgUHl0aG9uIHRvIHJlY29nbml6ZS4gIERlZmF1bHQgaXMgMy48L2xpPgogICAgICA8bGk+c2luZ2xlTGluZVN0cmluZ0Vycm9ycyAtIHRydWUvZmFsc2UgLSBJZiB5b3UgaGF2ZSBhIHNpbmdsZS1saW5lIHN0cmluZyB0aGF0IGlzIG5vdCB0ZXJtaW5hdGVkIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUsIHRoaXMgd2lsbCBzaG93IHN1YnNlcXVlbnQgbGluZXMgYXMgZXJyb3JzIGlmIHRydWUsIG90aGVyd2lzZSBpdCB3aWxsIGNvbnNpZGVyIHRoZSBuZXdsaW5lIGFzIHRoZSBlbmQgb2YgdGhlIHN0cmluZy4gRGVmYXVsdCBpcyBmYWxzZS48L2xpPgogICAgICA8bGk+aGFuZ2luZ0luZGVudCAtIGludCAtIElmIHlvdSB3YW50IHRvIHdyaXRlIGxvbmcgYXJndW1lbnRzIHRvIGEgZnVuY3Rpb24gc3RhcnRpbmcgb24gYSBuZXcgbGluZSwgaG93IG11Y2ggdGhhdCBsaW5lIHNob3VsZCBiZSBpbmRlbnRlZC4gRGVmYXVsdHMgdG8gb25lIG5vcm1hbCBpbmRlbnRhdGlvbiB1bml0LjwvbGk+CiAgICA8L3VsPgogICAgPGgyPkFkdmFuY2VkIENvbmZpZ3VyYXRpb24gT3B0aW9uczo8L2gyPgogICAgPHA+VXNlZnVsbCBmb3Igc3VwZXJzZXQgb2YgcHl0aG9uIHN5bnRheCBsaWtlIEVudGhvdWdodCBlbmFtbCwgSVB5dGhvbiBtYWdpY3MgYW5kICBxdWVzdGlvbm1hcmsgaGVscDwvcD4KICAgIDx1bD4KICAgICAgPGxpPnNpbmdsZU9wZXJhdG9ycyAtIFJlZ0V4IC0gUmVndWxhciBFeHByZXNzaW9uIGZvciBzaW5nbGUgb3BlcmF0b3IgbWF0Y2hpbmcsICBkZWZhdWx0IDogPHByZT5eW1xcK1xcLVxcKi8lJmFtcDt8XFxefiZsdDsmZ3Q7IV08L3ByZT4gaW5jbHVkaW5nIDxwcmU+QDwvcHJlPiBvbiBQeXRob24gMzwvbGk+CiAgICAgIDxsaT5zaW5nbGVEZWxpbWl0ZXJzIC0gUmVnRXggLSBSZWd1bGFyIEV4cHJlc3Npb24gZm9yIHNpbmdsZSBkZWxpbWl0ZXIgbWF0Y2hpbmcsIGRlZmF1bHQgOiAgPHByZT5eW1xcKFxcKVxcW1xcXVxce1xcfUAsOmA9O1xcLl08L3ByZT48L2xpPgogICAgICA8bGk+ZG91YmxlT3BlcmF0b3JzIC0gUmVnRXggLSBSZWd1bGFyIEV4cHJlc3Npb24gZm9yIGRvdWJsZSBvcGVyYXRvcnMgbWF0Y2hpbmcsIGRlZmF1bHQgOiA8cHJlPl4oKD09KXwoIT0pfCgmbHQ7PSl8KCZndDs9KXwoJmx0OyZndDspfCgmbHQ7Jmx0Oyl8KCZndDsmZ3Q7KXwoLy8pfChcXCpcXCopKTwvcHJlPjwvbGk+CiAgICAgIDxsaT5kb3VibGVEZWxpbWl0ZXJzIC0gUmVnRXggLSBSZWd1bGFyIEV4cHJlc3Npb24gZm9yIGRvdWJsZSBkZWxpbWl0ZXJzIG1hdGNoaW5nLCBkZWZhdWx0IDogPHByZT5eKChcXCs9KXwoXFwtPSl8KFxcKj0pfCglPSl8KC89KXwoJmFtcDs9KXwoXFx8PSl8KFxcXj0pKTwvcHJlPjwvbGk+CiAgICAgIDxsaT50cmlwbGVEZWxpbWl0ZXJzIC0gUmVnRXggLSBSZWd1bGFyIEV4cHJlc3Npb24gZm9yIHRyaXBsZSBkZWxpbWl0ZXJzIG1hdGNoaW5nLCBkZWZhdWx0IDogPHByZT5eKCgvLz0pfCgmZ3Q7Jmd0Oz0pfCgmbHQ7Jmx0Oz0pfChcXCpcXCo9KSk8L3ByZT48L2xpPgogICAgICA8bGk+aWRlbnRpZmllcnMgLSBSZWdFeCAtIFJlZ3VsYXIgRXhwcmVzc2lvbiBmb3IgaWRlbnRpZmllciwgZGVmYXVsdCA6IDxwcmU+XltfQS1aYS16XVtfQS1aYS16MC05XSo8L3ByZT4gb24gUHl0aG9uIDIgYW5kIDxwcmU+XltfQS1aYS16XHUwMEExLVx1RkZGRl1bX0EtWmEtejAtOVx1MDBBMS1cdUZGRkZdKjwvcHJlPiBvbiBQeXRob24gMy48L2xpPgogICAgICA8bGk+ZXh0cmFfa2V5d29yZHMgLSBsaXN0IG9mIHN0cmluZyAtIExpc3Qgb2YgZXh0cmEgd29yZHMgdG9uIGNvbnNpZGVyIGFzIGtleXdvcmRzPC9saT4KICAgICAgPGxpPmV4dHJhX2J1aWx0aW5zIC0gbGlzdCBvZiBzdHJpbmcgLSBMaXN0IG9mIGV4dHJhIHdvcmRzIHRvbiBjb25zaWRlciBhcyBidWlsdGluczwvbGk+CiAgICA8L3VsPgoKCiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC94LXB5dGhvbjwvY29kZT4gYW5kIDxjb2RlPnRleHQveC1jeXRob248L2NvZGU+LjwvcD4KICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/python/python.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CgogIGZ1bmN0aW9uIHdvcmRSZWdleHAod29yZHMpIHsKICAgIHJldHVybiBuZXcgUmVnRXhwKCJeKCgiICsgd29yZHMuam9pbigiKXwoIikgKyAiKSlcXGIiKTsKICB9CgogIHZhciB3b3JkT3BlcmF0b3JzID0gd29yZFJlZ2V4cChbImFuZCIsICJvciIsICJub3QiLCAiaXMiXSk7CiAgdmFyIGNvbW1vbktleXdvcmRzID0gWyJhcyIsICJhc3NlcnQiLCAiYnJlYWsiLCAiY2xhc3MiLCAiY29udGludWUiLAogICAgICAgICAgICAgICAgICAgICAgICAiZGVmIiwgImRlbCIsICJlbGlmIiwgImVsc2UiLCAiZXhjZXB0IiwgImZpbmFsbHkiLAogICAgICAgICAgICAgICAgICAgICAgICAiZm9yIiwgImZyb20iLCAiZ2xvYmFsIiwgImlmIiwgImltcG9ydCIsCiAgICAgICAgICAgICAgICAgICAgICAgICJsYW1iZGEiLCAicGFzcyIsICJyYWlzZSIsICJyZXR1cm4iLAogICAgICAgICAgICAgICAgICAgICAgICAidHJ5IiwgIndoaWxlIiwgIndpdGgiLCAieWllbGQiLCAiaW4iXTsKICB2YXIgY29tbW9uQnVpbHRpbnMgPSBbImFicyIsICJhbGwiLCAiYW55IiwgImJpbiIsICJib29sIiwgImJ5dGVhcnJheSIsICJjYWxsYWJsZSIsICJjaHIiLAogICAgICAgICAgICAgICAgICAgICAgICAiY2xhc3NtZXRob2QiLCAiY29tcGlsZSIsICJjb21wbGV4IiwgImRlbGF0dHIiLCAiZGljdCIsICJkaXIiLCAiZGl2bW9kIiwKICAgICAgICAgICAgICAgICAgICAgICAgImVudW1lcmF0ZSIsICJldmFsIiwgImZpbHRlciIsICJmbG9hdCIsICJmb3JtYXQiLCAiZnJvemVuc2V0IiwKICAgICAgICAgICAgICAgICAgICAgICAgImdldGF0dHIiLCAiZ2xvYmFscyIsICJoYXNhdHRyIiwgImhhc2giLCAiaGVscCIsICJoZXgiLCAiaWQiLAogICAgICAgICAgICAgICAgICAgICAgICAiaW5wdXQiLCAiaW50IiwgImlzaW5zdGFuY2UiLCAiaXNzdWJjbGFzcyIsICJpdGVyIiwgImxlbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJsaXN0IiwgImxvY2FscyIsICJtYXAiLCAibWF4IiwgIm1lbW9yeXZpZXciLCAibWluIiwgIm5leHQiLAogICAgICAgICAgICAgICAgICAgICAgICAib2JqZWN0IiwgIm9jdCIsICJvcGVuIiwgIm9yZCIsICJwb3ciLCAicHJvcGVydHkiLCAicmFuZ2UiLAogICAgICAgICAgICAgICAgICAgICAgICAicmVwciIsICJyZXZlcnNlZCIsICJyb3VuZCIsICJzZXQiLCAic2V0YXR0ciIsICJzbGljZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJzb3J0ZWQiLCAic3RhdGljbWV0aG9kIiwgInN0ciIsICJzdW0iLCAic3VwZXIiLCAidHVwbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAidHlwZSIsICJ2YXJzIiwgInppcCIsICJfX2ltcG9ydF9fIiwgIk5vdEltcGxlbWVudGVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgIkVsbGlwc2lzIiwgIl9fZGVidWdfXyJdOwogIENvZGVNaXJyb3IucmVnaXN0ZXJIZWxwZXIoImhpbnRXb3JkcyIsICJweXRob24iLCBjb21tb25LZXl3b3Jkcy5jb25jYXQoY29tbW9uQnVpbHRpbnMpKTsKCiAgZnVuY3Rpb24gdG9wKHN0YXRlKSB7CiAgICByZXR1cm4gc3RhdGUuc2NvcGVzW3N0YXRlLnNjb3Blcy5sZW5ndGggLSAxXTsKICB9CgogIENvZGVNaXJyb3IuZGVmaW5lTW9kZSgicHl0aG9uIiwgZnVuY3Rpb24oY29uZiwgcGFyc2VyQ29uZikgewogICAgdmFyIEVSUk9SQ0xBU1MgPSAiZXJyb3IiOwoKICAgIHZhciBzaW5nbGVEZWxpbWl0ZXJzID0gcGFyc2VyQ29uZi5zaW5nbGVEZWxpbWl0ZXJzIHx8IC9eW1woXClcW1xdXHtcfUAsOmA9O1wuXS87CiAgICB2YXIgZG91YmxlT3BlcmF0b3JzID0gcGFyc2VyQ29uZi5kb3VibGVPcGVyYXRvcnMgfHwgL14oWyE8Pl09PXw8Pnw8PHw+PnxcL1wvfFwqXCopLzsKICAgIHZhciBkb3VibGVEZWxpbWl0ZXJzID0gcGFyc2VyQ29uZi5kb3VibGVEZWxpbWl0ZXJzIHx8IC9eKFwrPXxcLT18XCo9fCU9fFwvPXwmPXxcfD18XF49KS87CiAgICB2YXIgdHJpcGxlRGVsaW1pdGVycyA9IHBhcnNlckNvbmYudHJpcGxlRGVsaW1pdGVycyB8fCAvXihcL1wvPXw+Pj18PDw9fFwqXCo9KS87CgogICAgdmFyIGhhbmdpbmdJbmRlbnQgPSBwYXJzZXJDb25mLmhhbmdpbmdJbmRlbnQgfHwgY29uZi5pbmRlbnRVbml0OwoKICAgIHZhciBteUtleXdvcmRzID0gY29tbW9uS2V5d29yZHMsIG15QnVpbHRpbnMgPSBjb21tb25CdWlsdGluczsKICAgIGlmIChwYXJzZXJDb25mLmV4dHJhX2tleXdvcmRzICE9IHVuZGVmaW5lZCkKICAgICAgbXlLZXl3b3JkcyA9IG15S2V5d29yZHMuY29uY2F0KHBhcnNlckNvbmYuZXh0cmFfa2V5d29yZHMpOwoKICAgIGlmIChwYXJzZXJDb25mLmV4dHJhX2J1aWx0aW5zICE9IHVuZGVmaW5lZCkKICAgICAgbXlCdWlsdGlucyA9IG15QnVpbHRpbnMuY29uY2F0KHBhcnNlckNvbmYuZXh0cmFfYnVpbHRpbnMpOwoKICAgIHZhciBweTMgPSAhKHBhcnNlckNvbmYudmVyc2lvbiAmJiBOdW1iZXIocGFyc2VyQ29uZi52ZXJzaW9uKSA8IDMpCiAgICBpZiAocHkzKSB7CiAgICAgIC8vIHNpbmNlIGh0dHA6Ly9sZWdhY3kucHl0aG9uLm9yZy9kZXYvcGVwcy9wZXAtMDQ2NS8gQCBpcyBhbHNvIGFuIG9wZXJhdG9yCiAgICAgIHZhciBzaW5nbGVPcGVyYXRvcnMgPSBwYXJzZXJDb25mLnNpbmdsZU9wZXJhdG9ycyB8fCAvXltcK1wtXCpcLyUmfFxefjw+IUBdLzsKICAgICAgdmFyIGlkZW50aWZpZXJzID0gcGFyc2VyQ29uZi5pZGVudGlmaWVyc3x8IC9eW19BLVphLXpcdTAwQTEtXHVGRkZGXVtfQS1aYS16MC05XHUwMEExLVx1RkZGRl0qLzsKICAgICAgbXlLZXl3b3JkcyA9IG15S2V5d29yZHMuY29uY2F0KFsibm9ubG9jYWwiLCAiRmFsc2UiLCAiVHJ1ZSIsICJOb25lIiwgImFzeW5jIiwgImF3YWl0Il0pOwogICAgICBteUJ1aWx0aW5zID0gbXlCdWlsdGlucy5jb25jYXQoWyJhc2NpaSIsICJieXRlcyIsICJleGVjIiwgInByaW50Il0pOwogICAgICB2YXIgc3RyaW5nUHJlZml4ZXMgPSBuZXcgUmVnRXhwKCJeKChbcmJ1Zl18KGJyKSk/KCd7M318XCJ7M318WydcIl0pKSIsICJpIik7CiAgICB9IGVsc2UgewogICAgICB2YXIgc2luZ2xlT3BlcmF0b3JzID0gcGFyc2VyQ29uZi5zaW5nbGVPcGVyYXRvcnMgfHwgL15bXCtcLVwqXC8lJnxcXn48PiFdLzsKICAgICAgdmFyIGlkZW50aWZpZXJzID0gcGFyc2VyQ29uZi5pZGVudGlmaWVyc3x8IC9eW19BLVphLXpdW19BLVphLXowLTldKi87CiAgICAgIG15S2V5d29yZHMgPSBteUtleXdvcmRzLmNvbmNhdChbImV4ZWMiLCAicHJpbnQiXSk7CiAgICAgIG15QnVpbHRpbnMgPSBteUJ1aWx0aW5zLmNvbmNhdChbImFwcGx5IiwgImJhc2VzdHJpbmciLCAiYnVmZmVyIiwgImNtcCIsICJjb2VyY2UiLCAiZXhlY2ZpbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmaWxlIiwgImludGVybiIsICJsb25nIiwgInJhd19pbnB1dCIsICJyZWR1Y2UiLCAicmVsb2FkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidW5pY2hyIiwgInVuaWNvZGUiLCAieHJhbmdlIiwgIkZhbHNlIiwgIlRydWUiLCAiTm9uZSJdKTsKICAgICAgdmFyIHN0cmluZ1ByZWZpeGVzID0gbmV3IFJlZ0V4cCgiXigoW3J1Yl18KHVyKXwoYnIpKT8oJ3szfXxcInszfXxbJ1wiXSkpIiwgImkiKTsKICAgIH0KICAgIHZhciBrZXl3b3JkcyA9IHdvcmRSZWdleHAobXlLZXl3b3Jkcyk7CiAgICB2YXIgYnVpbHRpbnMgPSB3b3JkUmVnZXhwKG15QnVpbHRpbnMpOwoKICAgIC8vIHRva2VuaXplcnMKICAgIGZ1bmN0aW9uIHRva2VuQmFzZShzdHJlYW0sIHN0YXRlKSB7CiAgICAgIGlmIChzdHJlYW0uc29sKCkpIHN0YXRlLmluZGVudCA9IHN0cmVhbS5pbmRlbnRhdGlvbigpCiAgICAgIC8vIEhhbmRsZSBzY29wZSBjaGFuZ2VzCiAgICAgIGlmIChzdHJlYW0uc29sKCkgJiYgdG9wKHN0YXRlKS50eXBlID09ICJweSIpIHsKICAgICAgICB2YXIgc2NvcGVPZmZzZXQgPSB0b3Aoc3RhdGUpLm9mZnNldDsKICAgICAgICBpZiAoc3RyZWFtLmVhdFNwYWNlKCkpIHsKICAgICAgICAgIHZhciBsaW5lT2Zmc2V0ID0gc3RyZWFtLmluZGVudGF0aW9uKCk7CiAgICAgICAgICBpZiAobGluZU9mZnNldCA+IHNjb3BlT2Zmc2V0KQogICAgICAgICAgICBwdXNoUHlTY29wZShzdGF0ZSk7CiAgICAgICAgICBlbHNlIGlmIChsaW5lT2Zmc2V0IDwgc2NvcGVPZmZzZXQgJiYgZGVkZW50KHN0cmVhbSwgc3RhdGUpICYmIHN0cmVhbS5wZWVrKCkgIT0gIiMiKQogICAgICAgICAgICBzdGF0ZS5lcnJvclRva2VuID0gdHJ1ZTsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB2YXIgc3R5bGUgPSB0b2tlbkJhc2VJbm5lcihzdHJlYW0sIHN0YXRlKTsKICAgICAgICAgIGlmIChzY29wZU9mZnNldCA+IDAgJiYgZGVkZW50KHN0cmVhbSwgc3RhdGUpKQogICAgICAgICAgICBzdHlsZSArPSAiICIgKyBFUlJPUkNMQVNTOwogICAgICAgICAgcmV0dXJuIHN0eWxlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gdG9rZW5CYXNlSW5uZXIoc3RyZWFtLCBzdGF0ZSk7CiAgICB9CgogICAgZnVuY3Rpb24gdG9rZW5CYXNlSW5uZXIoc3RyZWFtLCBzdGF0ZSkgewogICAgICBpZiAoc3RyZWFtLmVhdFNwYWNlKCkpIHJldHVybiBudWxsOwoKICAgICAgdmFyIGNoID0gc3RyZWFtLnBlZWsoKTsKCiAgICAgIC8vIEhhbmRsZSBDb21tZW50cwogICAgICBpZiAoY2ggPT0gIiMiKSB7CiAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICAgIHJldHVybiAiY29tbWVudCI7CiAgICAgIH0KCiAgICAgIC8vIEhhbmRsZSBOdW1iZXIgTGl0ZXJhbHMKICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXlswLTlcLl0vLCBmYWxzZSkpIHsKICAgICAgICB2YXIgZmxvYXRMaXRlcmFsID0gZmFsc2U7CiAgICAgICAgLy8gRmxvYXRzCiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXlxkKlwuXGQrKGVbXCtcLV0/XGQrKT8vaSkpIHsgZmxvYXRMaXRlcmFsID0gdHJ1ZTsgfQogICAgICAgIGlmIChzdHJlYW0ubWF0Y2goL15cZCtcLlxkKi8pKSB7IGZsb2F0TGl0ZXJhbCA9IHRydWU7IH0KICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eXC5cZCsvKSkgeyBmbG9hdExpdGVyYWwgPSB0cnVlOyB9CiAgICAgICAgaWYgKGZsb2F0TGl0ZXJhbCkgewogICAgICAgICAgLy8gRmxvYXQgbGl0ZXJhbHMgbWF5IGJlICJpbWFnaW5hcnkiCiAgICAgICAgICBzdHJlYW0uZWF0KC9KL2kpOwogICAgICAgICAgcmV0dXJuICJudW1iZXIiOwogICAgICAgIH0KICAgICAgICAvLyBJbnRlZ2VycwogICAgICAgIHZhciBpbnRMaXRlcmFsID0gZmFsc2U7CiAgICAgICAgLy8gSGV4CiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXjB4WzAtOWEtZl0rL2kpKSBpbnRMaXRlcmFsID0gdHJ1ZTsKICAgICAgICAvLyBCaW5hcnkKICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eMGJbMDFdKy9pKSkgaW50TGl0ZXJhbCA9IHRydWU7CiAgICAgICAgLy8gT2N0YWwKICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eMG9bMC03XSsvaSkpIGludExpdGVyYWwgPSB0cnVlOwogICAgICAgIC8vIERlY2ltYWwKICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eWzEtOV1cZCooZVtcK1wtXT9cZCspPy8pKSB7CiAgICAgICAgICAvLyBEZWNpbWFsIGxpdGVyYWxzIG1heSBiZSAiaW1hZ2luYXJ5IgogICAgICAgICAgc3RyZWFtLmVhdCgvSi9pKTsKICAgICAgICAgIC8vIFRPRE8gLSBDYW4geW91IGhhdmUgaW1hZ2luYXJ5IGxvbmdzPwogICAgICAgICAgaW50TGl0ZXJhbCA9IHRydWU7CiAgICAgICAgfQogICAgICAgIC8vIFplcm8gYnkgaXRzZWxmIHdpdGggbm8gb3RoZXIgcGllY2Ugb2YgbnVtYmVyLgogICAgICAgIGlmIChzdHJlYW0ubWF0Y2goL14wKD8hW1xkeF0pL2kpKSBpbnRMaXRlcmFsID0gdHJ1ZTsKICAgICAgICBpZiAoaW50TGl0ZXJhbCkgewogICAgICAgICAgLy8gSW50ZWdlciBsaXRlcmFscyBtYXkgYmUgImxvbmciCiAgICAgICAgICBzdHJlYW0uZWF0KC9ML2kpOwogICAgICAgICAgcmV0dXJuICJudW1iZXIiOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gSGFuZGxlIFN0cmluZ3MKICAgICAgaWYgKHN0cmVhbS5tYXRjaChzdHJpbmdQcmVmaXhlcykpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuU3RyaW5nRmFjdG9yeShzdHJlYW0uY3VycmVudCgpKTsKICAgICAgICByZXR1cm4gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CiAgICAgIH0KCiAgICAgIC8vIEhhbmRsZSBvcGVyYXRvcnMgYW5kIERlbGltaXRlcnMKICAgICAgaWYgKHN0cmVhbS5tYXRjaCh0cmlwbGVEZWxpbWl0ZXJzKSB8fCBzdHJlYW0ubWF0Y2goZG91YmxlRGVsaW1pdGVycykpCiAgICAgICAgcmV0dXJuICJwdW5jdHVhdGlvbiI7CgogICAgICBpZiAoc3RyZWFtLm1hdGNoKGRvdWJsZU9wZXJhdG9ycykgfHwgc3RyZWFtLm1hdGNoKHNpbmdsZU9wZXJhdG9ycykpCiAgICAgICAgcmV0dXJuICJvcGVyYXRvciI7CgogICAgICBpZiAoc3RyZWFtLm1hdGNoKHNpbmdsZURlbGltaXRlcnMpKQogICAgICAgIHJldHVybiAicHVuY3R1YXRpb24iOwoKICAgICAgaWYgKHN0YXRlLmxhc3RUb2tlbiA9PSAiLiIgJiYgc3RyZWFtLm1hdGNoKGlkZW50aWZpZXJzKSkKICAgICAgICByZXR1cm4gInByb3BlcnR5IjsKCiAgICAgIGlmIChzdHJlYW0ubWF0Y2goa2V5d29yZHMpIHx8IHN0cmVhbS5tYXRjaCh3b3JkT3BlcmF0b3JzKSkKICAgICAgICByZXR1cm4gImtleXdvcmQiOwoKICAgICAgaWYgKHN0cmVhbS5tYXRjaChidWlsdGlucykpCiAgICAgICAgcmV0dXJuICJidWlsdGluIjsKCiAgICAgIGlmIChzdHJlYW0ubWF0Y2goL14oc2VsZnxjbHMpXGIvKSkKICAgICAgICByZXR1cm4gInZhcmlhYmxlLTIiOwoKICAgICAgaWYgKHN0cmVhbS5tYXRjaChpZGVudGlmaWVycykpIHsKICAgICAgICBpZiAoc3RhdGUubGFzdFRva2VuID09ICJkZWYiIHx8IHN0YXRlLmxhc3RUb2tlbiA9PSAiY2xhc3MiKQogICAgICAgICAgcmV0dXJuICJkZWYiOwogICAgICAgIHJldHVybiAidmFyaWFibGUiOwogICAgICB9CgogICAgICAvLyBIYW5kbGUgbm9uLWRldGVjdGVkIGl0ZW1zCiAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgIHJldHVybiBFUlJPUkNMQVNTOwogICAgfQoKICAgIGZ1bmN0aW9uIHRva2VuU3RyaW5nRmFjdG9yeShkZWxpbWl0ZXIpIHsKICAgICAgd2hpbGUgKCJydWJmIi5pbmRleE9mKGRlbGltaXRlci5jaGFyQXQoMCkudG9Mb3dlckNhc2UoKSkgPj0gMCkKICAgICAgICBkZWxpbWl0ZXIgPSBkZWxpbWl0ZXIuc3Vic3RyKDEpOwoKICAgICAgdmFyIHNpbmdsZWxpbmUgPSBkZWxpbWl0ZXIubGVuZ3RoID09IDE7CiAgICAgIHZhciBPVVRDTEFTUyA9ICJzdHJpbmciOwoKICAgICAgZnVuY3Rpb24gdG9rZW5TdHJpbmcoc3RyZWFtLCBzdGF0ZSkgewogICAgICAgIHdoaWxlICghc3RyZWFtLmVvbCgpKSB7CiAgICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1teJyJcXF0vKTsKICAgICAgICAgIGlmIChzdHJlYW0uZWF0KCJcXCIpKSB7CiAgICAgICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgICAgIGlmIChzaW5nbGVsaW5lICYmIHN0cmVhbS5lb2woKSkKICAgICAgICAgICAgICByZXR1cm4gT1VUQ0xBU1M7CiAgICAgICAgICB9IGVsc2UgaWYgKHN0cmVhbS5tYXRjaChkZWxpbWl0ZXIpKSB7CiAgICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlOwogICAgICAgICAgICByZXR1cm4gT1VUQ0xBU1M7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdHJlYW0uZWF0KC9bJyJdLyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChzaW5nbGVsaW5lKSB7CiAgICAgICAgICBpZiAocGFyc2VyQ29uZi5zaW5nbGVMaW5lU3RyaW5nRXJyb3JzKQogICAgICAgICAgICByZXR1cm4gRVJST1JDTEFTUzsKICAgICAgICAgIGVsc2UKICAgICAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICAgICAgfQogICAgICAgIHJldHVybiBPVVRDTEFTUzsKICAgICAgfQogICAgICB0b2tlblN0cmluZy5pc1N0cmluZyA9IHRydWU7CiAgICAgIHJldHVybiB0b2tlblN0cmluZzsKICAgIH0KCiAgICBmdW5jdGlvbiBwdXNoUHlTY29wZShzdGF0ZSkgewogICAgICB3aGlsZSAodG9wKHN0YXRlKS50eXBlICE9ICJweSIpIHN0YXRlLnNjb3Blcy5wb3AoKQogICAgICBzdGF0ZS5zY29wZXMucHVzaCh7b2Zmc2V0OiB0b3Aoc3RhdGUpLm9mZnNldCArIGNvbmYuaW5kZW50VW5pdCwKICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICJweSIsCiAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbjogbnVsbH0pCiAgICB9CgogICAgZnVuY3Rpb24gcHVzaEJyYWNrZXRTY29wZShzdHJlYW0sIHN0YXRlLCB0eXBlKSB7CiAgICAgIHZhciBhbGlnbiA9IHN0cmVhbS5tYXRjaCgvXihbXHNcW1x7XChdfCMuKikqJC8sIGZhbHNlKSA/IG51bGwgOiBzdHJlYW0uY29sdW1uKCkgKyAxCiAgICAgIHN0YXRlLnNjb3Blcy5wdXNoKHtvZmZzZXQ6IHN0YXRlLmluZGVudCArIGhhbmdpbmdJbmRlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ246IGFsaWdufSkKICAgIH0KCiAgICBmdW5jdGlvbiBkZWRlbnQoc3RyZWFtLCBzdGF0ZSkgewogICAgICB2YXIgaW5kZW50ZWQgPSBzdHJlYW0uaW5kZW50YXRpb24oKTsKICAgICAgd2hpbGUgKHN0YXRlLnNjb3Blcy5sZW5ndGggPiAxICYmIHRvcChzdGF0ZSkub2Zmc2V0ID4gaW5kZW50ZWQpIHsKICAgICAgICBpZiAodG9wKHN0YXRlKS50eXBlICE9ICJweSIpIHJldHVybiB0cnVlOwogICAgICAgIHN0YXRlLnNjb3Blcy5wb3AoKTsKICAgICAgfQogICAgICByZXR1cm4gdG9wKHN0YXRlKS5vZmZzZXQgIT0gaW5kZW50ZWQ7CiAgICB9CgogICAgZnVuY3Rpb24gdG9rZW5MZXhlcihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIGlmIChzdHJlYW0uc29sKCkpIHN0YXRlLmJlZ2lubmluZ09mTGluZSA9IHRydWU7CgogICAgICB2YXIgc3R5bGUgPSBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgICAgdmFyIGN1cnJlbnQgPSBzdHJlYW0uY3VycmVudCgpOwoKICAgICAgLy8gSGFuZGxlIGRlY29yYXRvcnMKICAgICAgaWYgKHN0YXRlLmJlZ2lubmluZ09mTGluZSAmJiBjdXJyZW50ID09ICJAIikKICAgICAgICByZXR1cm4gc3RyZWFtLm1hdGNoKGlkZW50aWZpZXJzLCBmYWxzZSkgPyAibWV0YSIgOiBweTMgPyAib3BlcmF0b3IiIDogRVJST1JDTEFTUzsKCiAgICAgIGlmICgvXFMvLnRlc3QoY3VycmVudCkpIHN0YXRlLmJlZ2lubmluZ09mTGluZSA9IGZhbHNlOwoKICAgICAgaWYgKChzdHlsZSA9PSAidmFyaWFibGUiIHx8IHN0eWxlID09ICJidWlsdGluIikKICAgICAgICAgICYmIHN0YXRlLmxhc3RUb2tlbiA9PSAibWV0YSIpCiAgICAgICAgc3R5bGUgPSAibWV0YSI7CgogICAgICAvLyBIYW5kbGUgc2NvcGUgY2hhbmdlcy4KICAgICAgaWYgKGN1cnJlbnQgPT0gInBhc3MiIHx8IGN1cnJlbnQgPT0gInJldHVybiIpCiAgICAgICAgc3RhdGUuZGVkZW50ICs9IDE7CgogICAgICBpZiAoY3VycmVudCA9PSAibGFtYmRhIikgc3RhdGUubGFtYmRhID0gdHJ1ZTsKICAgICAgaWYgKGN1cnJlbnQgPT0gIjoiICYmICFzdGF0ZS5sYW1iZGEgJiYgdG9wKHN0YXRlKS50eXBlID09ICJweSIpCiAgICAgICAgcHVzaFB5U2NvcGUoc3RhdGUpOwoKICAgICAgdmFyIGRlbGltaXRlcl9pbmRleCA9IGN1cnJlbnQubGVuZ3RoID09IDEgPyAiWyh7Ii5pbmRleE9mKGN1cnJlbnQpIDogLTE7CiAgICAgIGlmIChkZWxpbWl0ZXJfaW5kZXggIT0gLTEpCiAgICAgICAgcHVzaEJyYWNrZXRTY29wZShzdHJlYW0sIHN0YXRlLCAiXSl9Ii5zbGljZShkZWxpbWl0ZXJfaW5kZXgsIGRlbGltaXRlcl9pbmRleCsxKSk7CgogICAgICBkZWxpbWl0ZXJfaW5kZXggPSAiXSl9Ii5pbmRleE9mKGN1cnJlbnQpOwogICAgICBpZiAoZGVsaW1pdGVyX2luZGV4ICE9IC0xKSB7CiAgICAgICAgaWYgKHRvcChzdGF0ZSkudHlwZSA9PSBjdXJyZW50KSBzdGF0ZS5pbmRlbnQgPSBzdGF0ZS5zY29wZXMucG9wKCkub2Zmc2V0IC0gaGFuZ2luZ0luZGVudAogICAgICAgIGVsc2UgcmV0dXJuIEVSUk9SQ0xBU1M7CiAgICAgIH0KICAgICAgaWYgKHN0YXRlLmRlZGVudCA+IDAgJiYgc3RyZWFtLmVvbCgpICYmIHRvcChzdGF0ZSkudHlwZSA9PSAicHkiKSB7CiAgICAgICAgaWYgKHN0YXRlLnNjb3Blcy5sZW5ndGggPiAxKSBzdGF0ZS5zY29wZXMucG9wKCk7CiAgICAgICAgc3RhdGUuZGVkZW50IC09IDE7CiAgICAgIH0KCiAgICAgIHJldHVybiBzdHlsZTsKICAgIH0KCiAgICB2YXIgZXh0ZXJuYWwgPSB7CiAgICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKGJhc2Vjb2x1bW4pIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgdG9rZW5pemU6IHRva2VuQmFzZSwKICAgICAgICAgIHNjb3BlczogW3tvZmZzZXQ6IGJhc2Vjb2x1bW4gfHwgMCwgdHlwZTogInB5IiwgYWxpZ246IG51bGx9XSwKICAgICAgICAgIGluZGVudDogYmFzZWNvbHVtbiB8fCAwLAogICAgICAgICAgbGFzdFRva2VuOiBudWxsLAogICAgICAgICAgbGFtYmRhOiBmYWxzZSwKICAgICAgICAgIGRlZGVudDogMAogICAgICAgIH07CiAgICAgIH0sCgogICAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICAgIHZhciBhZGRFcnIgPSBzdGF0ZS5lcnJvclRva2VuOwogICAgICAgIGlmIChhZGRFcnIpIHN0YXRlLmVycm9yVG9rZW4gPSBmYWxzZTsKICAgICAgICB2YXIgc3R5bGUgPSB0b2tlbkxleGVyKHN0cmVhbSwgc3RhdGUpOwoKICAgICAgICBpZiAoc3R5bGUgJiYgc3R5bGUgIT0gImNvbW1lbnQiKQogICAgICAgICAgc3RhdGUubGFzdFRva2VuID0gKHN0eWxlID09ICJrZXl3b3JkIiB8fCBzdHlsZSA9PSAicHVuY3R1YXRpb24iKSA/IHN0cmVhbS5jdXJyZW50KCkgOiBzdHlsZTsKICAgICAgICBpZiAoc3R5bGUgPT0gInB1bmN0dWF0aW9uIikgc3R5bGUgPSBudWxsOwoKICAgICAgICBpZiAoc3RyZWFtLmVvbCgpICYmIHN0YXRlLmxhbWJkYSkKICAgICAgICAgIHN0YXRlLmxhbWJkYSA9IGZhbHNlOwogICAgICAgIHJldHVybiBhZGRFcnIgPyBzdHlsZSArICIgIiArIEVSUk9SQ0xBU1MgOiBzdHlsZTsKICAgICAgfSwKCiAgICAgIGluZGVudDogZnVuY3Rpb24oc3RhdGUsIHRleHRBZnRlcikgewogICAgICAgIGlmIChzdGF0ZS50b2tlbml6ZSAhPSB0b2tlbkJhc2UpCiAgICAgICAgICByZXR1cm4gc3RhdGUudG9rZW5pemUuaXNTdHJpbmcgPyBDb2RlTWlycm9yLlBhc3MgOiAwOwoKICAgICAgICB2YXIgc2NvcGUgPSB0b3Aoc3RhdGUpLCBjbG9zaW5nID0gc2NvcGUudHlwZSA9PSB0ZXh0QWZ0ZXIuY2hhckF0KDApCiAgICAgICAgaWYgKHNjb3BlLmFsaWduICE9IG51bGwpCiAgICAgICAgICByZXR1cm4gc2NvcGUuYWxpZ24gLSAoY2xvc2luZyA/IDEgOiAwKQogICAgICAgIGVsc2UKICAgICAgICAgIHJldHVybiBzY29wZS5vZmZzZXQgLSAoY2xvc2luZyA/IGhhbmdpbmdJbmRlbnQgOiAwKQogICAgICB9LAoKICAgICAgZWxlY3RyaWNJbnB1dDogL15ccypbXH1cXVwpXSQvLAogICAgICBjbG9zZUJyYWNrZXRzOiB7dHJpcGxlczogIidcIiJ9LAogICAgICBsaW5lQ29tbWVudDogIiMiLAogICAgICBmb2xkOiAiaW5kZW50IgogICAgfTsKICAgIHJldHVybiBleHRlcm5hbDsKICB9KTsKCiAgQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtcHl0aG9uIiwgInB5dGhvbiIpOwoKICB2YXIgd29yZHMgPSBmdW5jdGlvbihzdHIpIHsgcmV0dXJuIHN0ci5zcGxpdCgiICIpOyB9OwoKICBDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveC1jeXRob24iLCB7CiAgICBuYW1lOiAicHl0aG9uIiwKICAgIGV4dHJhX2tleXdvcmRzOiB3b3JkcygiYnkgY2RlZiBjaW1wb3J0IGNwZGVmIGN0eXBlZGVmIGVudW0gZXhjZXB0IisKICAgICAgICAgICAgICAgICAgICAgICAgICAiZXh0ZXJuIGdpbCBpbmNsdWRlIG5vZ2lsIHByb3BlcnR5IHB1YmxpYyIrCiAgICAgICAgICAgICAgICAgICAgICAgICAgInJlYWRvbmx5IHN0cnVjdCB1bmlvbiBERUYgSUYgRUxJRiBFTFNFIikKICB9KTsKCn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/python/test.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24oKSB7CiAgdmFyIG1vZGUgPSBDb2RlTWlycm9yLmdldE1vZGUoe2luZGVudFVuaXQ6IDR9LAogICAgICAgICAgICAgIHtuYW1lOiAicHl0aG9uIiwKICAgICAgICAgICAgICAgdmVyc2lvbjogMywKICAgICAgICAgICAgICAgc2luZ2xlTGluZVN0cmluZ0Vycm9yczogZmFsc2V9KTsKICBmdW5jdGlvbiBNVChuYW1lKSB7IHRlc3QubW9kZShuYW1lLCBtb2RlLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpKTsgfQoKICAvLyBFcnJvciwgYmVjYXVzZSAiZm9vYmFyaGVsbG8iIGlzIG5laXRoZXIgYSBrbm93biB0eXBlIG9yIHByb3BlcnR5LCBidXQKICAvLyBwcm9wZXJ0eSB3YXMgZXhwZWN0ZWQgKGFmdGVyICJhbmQiKSwgYW5kIGl0IHNob3VsZCBiZSBpbiBwYXJlbnRoZXNlcy4KICBNVCgiZGVjb3JhdG9yU3RhcnRPZkxpbmUiLAogICAgICJbbWV0YSBAZGVjXSIsCiAgICAgIltrZXl3b3JkIGRlZl0gW2RlZiBmdW5jdGlvbl0oKToiLAogICAgICIgICAgW2tleXdvcmQgcGFzc10iKTsKCiAgTVQoImRlY29yYXRvckluZGVudGVkIiwKICAgICAiW2tleXdvcmQgY2xhc3NdIFtkZWYgRm9vXToiLAogICAgICIgICAgW21ldGEgQGRlY10iLAogICAgICIgICAgW2tleXdvcmQgZGVmXSBbZGVmIGZ1bmN0aW9uXSgpOiIsCiAgICAgIiAgICAgICAgW2tleXdvcmQgcGFzc10iKTsKCiAgTVQoIm1hdG11bFdpdGhTcGFjZToiLCAiW3ZhcmlhYmxlIGFdIFtvcGVyYXRvciBAXSBbdmFyaWFibGUgYl0iKTsKICBNVCgibWF0bXVsV2l0aG91dFNwYWNlOiIsICJbdmFyaWFibGUgYV1bb3BlcmF0b3IgQF1bdmFyaWFibGUgYl0iKTsKICBNVCgibWF0bXVsU3BhY2VCZWZvcmU6IiwgIlt2YXJpYWJsZSBhXSBbb3BlcmF0b3IgQF1bdmFyaWFibGUgYl0iKTsKCiAgTVQoImZWYWxpZFN0cmluZ1ByZWZpeCIsICJbc3RyaW5nIGYndGhpcyBpcyBhIHtmb3JtYXR0ZWR9IHN0cmluZyddIik7CiAgTVQoInVWYWxpZFN0cmluZ1ByZWZpeCIsICJbc3RyaW5nIHUndGhpcyBpcyBhbiB1bmljb2RlIHN0cmluZyddIik7Cn0pKCk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/q/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/q/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogUSBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uLy4uL2FkZG9uL2VkaXQvbWF0Y2hicmFja2V0cy5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJxLmpzIj48L3NjcmlwdD4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4uQ29kZU1pcnJvciB7Ym9yZGVyLXRvcDogMXB4IHNvbGlkIGJsYWNrOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGgxPkNvZGVNaXJyb3I8L2gxPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5RPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5RIG1vZGU8L2gyPgoKCjxkaXY+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KLyB1dGlsaXRpZXMgdG8gcXVpY2tseSBsb2FkIGEgY3N2IGZpbGUgLSBmb3IgbW9yZSBleGhhdXN0aXZlIGFuYWx5c2lzIG9mIHRoZSBjc3YgY29udGVudHMgc2VlIGNzdmd1ZXNzLnEKLyAyMDA5LjA5LjIwIC0gdXBkYXRlZCB0byBtYXRjaCBsYXRlc3QgY3N2Z3Vlc3MucSAKCi8gLmNzdi5jb2xoZHJzW2ZpbGVdIC0gcmV0dXJuIGEgbGlzdCBvZiBjb2xoZHJzIGZyb20gZmlsZQovIGluZm86LmNzdi5pbmZvW2ZpbGVdIC0gcmV0dXJuIGEgdGFibGUgb2YgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGZpbGUKLyBjb2x1bW5zIGFyZTogCi8JYyAtIGNvbHVtbiBuYW1lOyBjaSAtIGNvbHVtbiBpbmRleDsgdCAtIGxvYWQgdHlwZTsgbXcgLSBtYXggd2lkdGg7IAovCWRjaGFyIC0gZGlzdGluY3QgY2hhcmFjdGVycyBpbiB2YWx1ZXM7IHJ1bGUgLSBydWxlIHRoYXQgY2F1Z2h0IHRoZSB0eXBlCi8JbWF5YmUgLSBuZWVkcyBjaGVja2luZywgX2NvdWxkXyBiZSBzYXkgYSBkYXRlLCBidXQgcGVyaGFwcyBqdXN0IGEgZmxvYXQ/Ci8gLmNzdi5pbmZvMFtmaWxlO29ubHljb2xzXSAtIGxpa2UgLmNzdi5pbmZvIGV4Y2VwdCB0aGF0IGl0IG9ubHkgYW5hbHlzZXMgPG9ubHljb2xzPgovIGV4YW1wbGU6Ci8JaW5mbzouY3N2LmluZm8wW2ZpbGU7KC5jc3YuY29saGRycyBmaWxlKWxpa2UiKnByaWNlIl0KLwlpbmZvOi5jc3YuaW5mb2xpa2VbZmlsZTsiKnByaWNlIl0KLwlzaG93IGRlbGV0ZSBmcm9tIGluZm8gd2hlcmUgdD0iICIKLyAuY3N2LmRhdGFbZmlsZTtpbmZvXSAtIHVzZSB0aGUgaW5mbyBmcm9tIC5jc3YuaW5mbyB0byByZWFkIHRoZSBkYXRhCi8gLmNzdi5kYXRhMTBbZmlsZTtpbmZvXSAtIGxpa2UgLmNzdi5kYXRhIGJ1dCBvbmx5IHJldHVybnMgdGhlIGZpcnN0IDEwIHJvd3MKLyBidWxrbG9hZFtmaWxlO2luZm9dIC0gYnVsayBsb2FkcyBmaWxlIGludG8gdGFibGUgREFUQSAod2hpY2ggbXVzdCBiZSBhbHJlYWR5IGRlZmluZWQgOjogREFUQTooKSApCi8gLmNzdi5yZWFkW2ZpbGVdL3JlYWQxMFtmaWxlXSAtIGZvciB3aGVuIHlvdSBkb24ndCBjYXJlIGFib3V0IGNoZWNraW5nL3R3ZWFraW5nIHRoZSA8aW5mbz4gYmVmb3JlIHJlYWRpbmcgCgpcZCAuY3N2CkRFTElNOiIsIgpaQVBIRFJTOjBiIC8gbG93ZXJjYXNlIGFuZCByZW1vdmUgXyBmcm9tIGNvbGhkcnMgKGp1bmsgY2hhcmFjdGVycyBhcmUgYWx3YXlzIHJlbW92ZWQpCldJRFRISERSOjI1MDAwIC8gbnVtYmVyIG9mIGNoYXJhY3RlcnMgcmVhZCB0byBnZXQgdGhlIGhlYWRlcgpSRUFETElORVM6MjIyIC8gbnVtYmVyIG9mIGxpbmVzIHJlYWQgYW5kIHVzZWQgdG8gZ3Vlc3MgdGhlIHR5cGVzClNZTU1BWFdJRFRIOjExIC8gY2hhcmFjdGVyIGNvbHVtbnMgbmFycm93ZXIgdGhhbiB0aGlzIGFyZSBzdG9yZWQgYXMgc3ltYm9scwpTWU1NQVhHUjoxMCAvIG1heCBzeW1ib2wgZ3JhbnVsYXJpdHklIGJlZm9yZSB3ZSBnaXZlIHVwIGFuZCBrZWVwIGFzIGEgKiBzdHJpbmcKRk9SQ0VDSEFSV0lEVEg6MzAgLyBldmVyeSBmaWVsZCAob2YgYW55IHR5cGUpIHdpdGggdmFsdWVzIHRoaXMgd2lkZSBvciBtb3JlIGlzIGZvcmNlZCB0byBjaGFyYWN0ZXIgIioiCkRJU0NBUkRFTVBUWTowYiAvIGNvbXBsZXRlbHkgaWdub3JlIGVtcHR5IGNvbHVtbnMgaWYgdHJ1ZSBlbHNlIHNldCB0aGVtIHRvICJDIgpDSFVOS1NJWkU6NTAwMDAwMDAgLyB1c2VkIGluIGZzMiAobW9kaWZpZWQgLlEuZnMpCgprKW5hbWVsdHJpbTp7JFt+QHg7Lnoucyd4O34oKngpaW4gYUE6LlEuYSwuUS5BOygrLyZcfnggaW4gYUEpX3g7eF19CmspZnMyOntbZjtzXSgoLTchcyk+KXtbZjtzO3hdaToxK2xhc3RAJjB4YT1yOjE6KHM7eDtDSFVOS1NJWkUpO2ZAYFw6aSNyO3graX1bZjtzXS8wan0KY2xlYW5oZHJzOnt7JFtaQVBIRFJTO2xvd2VyIHggZXhjZXB0Il8iO3hdfXggd2hlcmUgeCBpbiBERUxJTSwuUS5hbn0KY2FuY2FzdDp7bnc6eCQiIjtpZltub3QgeCBpbiJCWENTIjtudzoobWluIDAjO21heCAwIzs6OilAXDpud107JFtub3QgYW55IG53IGluIHgkKDExJmNvdW50IHkpI3k7JFsxMTxjb3VudCB5O25vdCBhbnkgbncgaW4geCR5OzFiXTswYl19CgpyZWFkOntbZmlsZV1kYXRhW2ZpbGU7aW5mb1tmaWxlXV19ICAKcmVhZDEwOntbZmlsZV1kYXRhMTBbZmlsZTtpbmZvW2ZpbGVdXX0gIAoKY29saGRyczp7W2ZpbGVdCglgJG5hbWVsdHJpbSBERUxJTSB2cyBjbGVhbmhkcnMgZmlyc3QgcmVhZDAoZmlsZTswOzErZmlyc3Qgd2hlcmUgMHhhPXJlYWQxKGZpbGU7MDtXSURUSEhEUikpfQpkYXRhOntbZmlsZTtpbmZvXQoJKGV4ZWMgYyBmcm9tIGluZm8gd2hlcmUgbm90IHQ9IiAiKXhjb2woZXhlYyB0IGZyb20gaW5mbztlbmxpc3QgREVMSU0pMDpmaWxlfQpkYXRhMTA6e1tmaWxlO2luZm9dCglkYXRhWztpbmZvXShmaWxlOzA7MStsYXN0IDExI3doZXJlIDB4YT1yZWFkMShmaWxlOzA7MTUqV0lEVEhIRFIpKX0KaW5mbzA6e1tmaWxlO29ubHljb2xzXQoJY29saGRyczpgJG5hbWVsdHJpbSBERUxJTSB2cyBjbGVhbmhkcnMgZmlyc3QgaGVhZDpyZWFkMChmaWxlOzA7MStsYXN0IHdoZXJlIDB4YT1yZWFkMShmaWxlOzA7V0lEVEhIRFIpKTsKCWxvYWRmbXRzOihjb3VudCBjb2xoZHJzKSMiUyI7aWZbY291bnQgb25seWNvbHM7bG9hZGZtdHNbd2hlcmUgbm90IGNvbGhkcnMgaW4gb25seWNvbHNdOiJDIl07CglicmVha3M6d2hlcmUgMHhhPXJlYWQxKGZpbGU7MDtmbG9vcigxMCtSRUFETElORVMpKldJRFRISERSJWNvdW50IGhlYWQpOwoJbmFzOmNvdW50IGFzOmNvbGhkcnMgeGNvbChsb2FkZm10cztlbmxpc3QgREVMSU0pMDooZmlsZTswOzErbGFzdCgoMStSRUFETElORVMpJmNvdW50IGJyZWFrcykjYnJlYWtzKTsKCWluZm86KFtdYzprZXkgZmxpcCBhczt2OnZhbHVlIGZsaXAgYXMpO2FzOigpOwoJcmVzZXJ2ZWQ6a2V5YC5xO3Jlc2VydmVkLDouUS5yZXM7cmVzZXJ2ZWQsOmBpOwoJaW5mbzp1cGRhdGUgcmVzOmMgaW4gcmVzZXJ2ZWQgZnJvbSBpbmZvOwoJaW5mbzp1cGRhdGUgY2k6aSx0OiI/IixpcGE6MGIsbWRvdDowLG13OjAscnVsZTowLGdyOjAsbmR2OjAsbWF5YmU6MGIsZW1wdHk6MGIsajEwOjBiLGoxMjowYiBmcm9tIGluZm87CglpbmZvOnVwZGF0ZSBjaTpgcyNjaSBmcm9tIGluZm87CglpZltjb3VudCBvbmx5Y29scztpbmZvOnVwZGF0ZSB0OiIgIixydWxlOjEwIGZyb20gaW5mbyB3aGVyZSBub3QgYyBpbiBvbmx5Y29sc107CglpbmZvOnVwZGF0ZSBzZHY6e3N0cmluZyhkaXN0aW5jdCB4KWV4Y2VwdGB9cGVhY2ggdiBmcm9tIGluZm87IAoJaW5mbzp1cGRhdGUgbmR2OmNvdW50IGVhY2ggc2R2IGZyb20gaW5mbzsKCWluZm86dXBkYXRlIGdyOmZsb29yIDAuNSsxMDAqbmR2JW5hcyxtdzp7bWF4IGNvdW50IGVhY2ggeH1wZWFjaCBzZHYgZnJvbSBpbmZvIHdoZXJlIDA8bmR2OwoJaW5mbzp1cGRhdGUgdDoiKiIscnVsZToyMCBmcm9tIGluZm8gd2hlcmUgbXc+LmNzdi5GT1JDRUNIQVJXSURUSDsgLyBsb25nIHZhbHVlcwoJaW5mbzp1cGRhdGUgdDoiQyAiWy5jc3YuRElTQ0FSREVNUFRZXSxydWxlOjMwLGVtcHR5OjFiIGZyb20gaW5mbyB3aGVyZSB0PSI/Iixtdz0wOyAvIGVtcHR5IGNvbHVtbnMKCWluZm86dXBkYXRlIGRjaGFyOnthc2MgZGlzdGluY3QgcmF6ZSB4fXBlYWNoIHNkdiBmcm9tIGluZm8gd2hlcmUgdD0iPyI7CglpbmZvOnVwZGF0ZSBtZG90OnttYXggc3VtIGVhY2giLiI9eH1wZWFjaCBzZHYgZnJvbSBpbmZvIHdoZXJlIHQ9Ij8iLHsiLiJpbiB4fWVhY2ggZGNoYXI7CglpbmZvOnVwZGF0ZSB0OiJuIixydWxlOjQwIGZyb20gaW5mbyB3aGVyZSB0PSI/Iix7YW55IHggaW4iMDEyMzQ1Njc4OSJ9ZWFjaCBkY2hhcjsgLyB2YWd1ZWx5IG51bWVyaWMuLgoJaW5mbzp1cGRhdGUgdDoiSSIscnVsZTo1MCxpcGE6MWIgZnJvbSBpbmZvIHdoZXJlIHQ9Im4iLG13IHdpdGhpbiA3IDE1LG1kb3Q9Myx7YWxsIHggaW4iLjAxMjM0NTY3ODkifWVhY2ggZGNoYXIsLmNzdi5jYW5jYXN0WyJJIl1wZWFjaCBzZHY7IC8gaXAtYWRkcmVzcwoJaW5mbzp1cGRhdGUgdDoiSiIscnVsZTo2MCBmcm9tIGluZm8gd2hlcmUgdD0ibiIsbWRvdD0wLHthbGwgeCBpbiIrLTAxMjM0NTY3ODkifWVhY2ggZGNoYXIsLmNzdi5jYW5jYXN0WyJKIl1wZWFjaCBzZHY7CglpbmZvOnVwZGF0ZSB0OiJJIixydWxlOjcwIGZyb20gaW5mbyB3aGVyZSB0PSJKIixtdzwxMiwuY3N2LmNhbmNhc3RbIkkiXXBlYWNoIHNkdjsKCWluZm86dXBkYXRlIHQ6IkgiLHJ1bGU6ODAgZnJvbSBpbmZvIHdoZXJlIHQ9IkkiLG13PDcsLmNzdi5jYW5jYXN0WyJIIl1wZWFjaCBzZHY7CglpbmZvOnVwZGF0ZSB0OiJGIixydWxlOjkwIGZyb20gaW5mbyB3aGVyZSB0PSJuIixtZG90PDIsbXc+MSwuY3N2LmNhbmNhc3RbIkYiXXBlYWNoIHNkdjsKCWluZm86dXBkYXRlIHQ6IkUiLHJ1bGU6MTAwLG1heWJlOjFiIGZyb20gaW5mbyB3aGVyZSB0PSJGIixtdzw5OwoJaW5mbzp1cGRhdGUgdDoiTSIscnVsZToxMTAsbWF5YmU6MWIgZnJvbSBpbmZvIHdoZXJlIHQgaW4ibklIRUYiLG1kb3Q8MixtdyB3aXRoaW4gNCA3LC5jc3YuY2FuY2FzdFsiTSJdcGVhY2ggc2R2OyAKCWluZm86dXBkYXRlIHQ6IkQiLHJ1bGU6MTIwLG1heWJlOjFiIGZyb20gaW5mbyB3aGVyZSB0IGluIm5JIixtZG90IGluIDAgMixtdyB3aXRoaW4gNiAxMSwuY3N2LmNhbmNhc3RbIkQiXXBlYWNoIHNkdjsgCglpbmZvOnVwZGF0ZSB0OiJWIixydWxlOjEzMCxtYXliZToxYiBmcm9tIGluZm8gd2hlcmUgdD0iSSIsbXcgaW4gNSA2LDc8Y291bnQgZWFjaCBkY2hhcix7YWxsIHggbGlrZSIqWzAtOV1bMC01XVswLTldWzAtNV1bMC05XSJ9cGVhY2ggc2R2LC5jc3YuY2FuY2FzdFsiViJdcGVhY2ggc2R2OyAvIDIzNTk1OSAxMjM0NSAgICAgICAgCglpbmZvOnVwZGF0ZSB0OiJVIixydWxlOjE0MCxtYXliZToxYiBmcm9tIGluZm8gd2hlcmUgdD0iSCIsbXcgaW4gMyA0LDc8Y291bnQgZWFjaCBkY2hhcix7YWxsIHggbGlrZSIqWzAtOV1bMC01XVswLTldIn1wZWFjaCBzZHYsLmNzdi5jYW5jYXN0WyJVIl1wZWFjaCBzZHY7IC8yMzU5CglpbmZvOnVwZGF0ZSB0OiJVIixydWxlOjE1MCxtYXliZTowYiBmcm9tIGluZm8gd2hlcmUgdD0ibiIsbXcgaW4gNCA1LG1kb3Q9MCx7YWxsIHggbGlrZSIqWzAtOV06WzAtNV1bMC05XSJ9cGVhY2ggc2R2LC5jc3YuY2FuY2FzdFsiVSJdcGVhY2ggc2R2OwoJaW5mbzp1cGRhdGUgdDoiVCIscnVsZToxNjAsbWF5YmU6MGIgZnJvbSBpbmZvIHdoZXJlIHQ9Im4iLG13IHdpdGhpbiA3IDEyLG1kb3Q8Mix7YWxsIHggbGlrZSIqWzAtOV06WzAtNV1bMC05XTpbMC01XVswLTldKiJ9cGVhY2ggc2R2LC5jc3YuY2FuY2FzdFsiVCJdcGVhY2ggc2R2OwoJaW5mbzp1cGRhdGUgdDoiViIscnVsZToxNzAsbWF5YmU6MGIgZnJvbSBpbmZvIHdoZXJlIHQ9IlQiLG13IGluIDcgOCxtZG90PTAsLmNzdi5jYW5jYXN0WyJWIl1wZWFjaCBzZHY7CglpbmZvOnVwZGF0ZSB0OiJUIixydWxlOjE4MCxtYXliZToxYiBmcm9tIGluZm8gd2hlcmUgdCBpbiJFRiIsbXcgd2l0aGluIDcgMTAsbWRvdD0xLHthbGwgeCBsaWtlIipbMC05XVswLTVdWzAtOV1bMC01XVswLTldLioifXBlYWNoIHNkdiwuY3N2LmNhbmNhc3RbIlQiXXBlYWNoIHNkdjsKCWluZm86dXBkYXRlIHQ6IloiLHJ1bGU6MTkwLG1heWJlOjBiIGZyb20gaW5mbyB3aGVyZSB0PSJuIixtdyB3aXRoaW4gMTEgMjQsbWRvdDw0LC5jc3YuY2FuY2FzdFsiWiJdcGVhY2ggc2R2OwoJaW5mbzp1cGRhdGUgdDoiUCIscnVsZToyMDAsbWF5YmU6MWIgZnJvbSBpbmZvIHdoZXJlIHQ9Im4iLG13IHdpdGhpbiAxMiAyOSxtZG90PDQse2FsbCB4IGxpa2UiWzEyXSoifXBlYWNoIHNkdiwuY3N2LmNhbmNhc3RbIlAiXXBlYWNoIHNkdjsKCWluZm86dXBkYXRlIHQ6Ik4iLHJ1bGU6MjEwLG1heWJlOjFiIGZyb20gaW5mbyB3aGVyZSB0PSJuIixtdyB3aXRoaW4gMyAyOCxtZG90PTEsLmNzdi5jYW5jYXN0WyJOIl1wZWFjaCBzZHY7CglpbmZvOnVwZGF0ZSB0OiI/IixydWxlOjIyMCxtYXliZTowYiBmcm9tIGluZm8gd2hlcmUgdD0ibiI7IC8gcmVzZXQgcmVtYWluaW5nIG1heWJlIG51bWVyaWMKCWluZm86dXBkYXRlIHQ6IkMiLHJ1bGU6MjMwLG1heWJlOjBiIGZyb20gaW5mbyB3aGVyZSB0PSI/Iixtdz0xOyAvIGNoYXIKCWluZm86dXBkYXRlIHQ6IkIiLHJ1bGU6MjQwLG1heWJlOjBiIGZyb20gaW5mbyB3aGVyZSB0IGluIkhDIixtdz0xLG1kb3Q9MCx7JFthbGwgeCBpbiIwMXRUZkZ5WW5OIjsoYW55IjBmRm5OImluIHgpYW5kIGFueSIxdFR5WSJpbiB4OzBiXX1lYWNoIGRjaGFyOyAvIGJvb2xlYW4KCWluZm86dXBkYXRlIHQ6IkIiLHJ1bGU6MjUwLG1heWJlOjFiIGZyb20gaW5mbyB3aGVyZSB0IGluIkhDIixtdz0xLG1kb3Q9MCx7YWxsIHggaW4iMDF0VGZGeVluTiJ9ZWFjaCBkY2hhcjsgLyBib29sZWFuCglpbmZvOnVwZGF0ZSB0OiJYIixydWxlOjI2MCxtYXliZTowYiBmcm9tIGluZm8gd2hlcmUgdD0iPyIsbXc9Mix7JFthbGwgeCBpbiIwMTIzNDU2Nzg5YWJjZGVmQUJDREVGIjsoYW55IC5RLm4gaW4geClhbmQgYW55ImFiY2RlZkFCQ0RFRiJpbiB4OzBiXX1lYWNoIGRjaGFyOyAvaGV4CglpbmZvOnVwZGF0ZSB0OiJTIixydWxlOjI3MCxtYXliZToxYiBmcm9tIGluZm8gd2hlcmUgdD0iPyIsbXc8LmNzdi5TWU1NQVhXSURUSCxtdz4xLGdyPC5jc3YuU1lNTUFYR1I7IC8gc3ltYm9scyAobWF4IHdpZHRoIHBlcm1pdHRpbmcpCglpbmZvOnVwZGF0ZSB0OiIqIixydWxlOjI4MCxtYXliZTowYiBmcm9tIGluZm8gd2hlcmUgdD0iPyI7IC8gdGhlIHJlc3QgYXMgc3RyaW5ncwoJLyBmbGFnIHRob3NlIFMvKiBjb2x1bW5zIHdoaWNoIGNvdWxkIGJlIGVuY29kZWQgdG8gaW50ZWdlcnMgKC5RLmoxMC94MTAvajEyL3gxMikgdG8gYXZvaWQgc3ltYm9scwoJaW5mbzp1cGRhdGUgajEyOjFiIGZyb20gaW5mbyB3aGVyZSB0IGluIlMqIixtdzwxMyx7YWxsIHggaW4gLlEubkF9ZWFjaCBkY2hhcjsKCWluZm86dXBkYXRlIGoxMDoxYiBmcm9tIGluZm8gd2hlcmUgdCBpbiJTKiIsbXc8MTEse2FsbCB4IGluIC5RLmI2fWVhY2ggZGNoYXI7IAoJc2VsZWN0IGMsY2ksdCxtYXliZSxlbXB0eSxyZXMsajEwLGoxMixpcGEsbXcsbWRvdCxydWxlLGdyLG5kdixkY2hhciBmcm9tIGluZm99CmluZm86aW5mbzBbOygpXSAvIGJ5IGRlZmF1bHQgZG9uJ3QgcmVzdHJpY3QgY29sdW1ucwppbmZvbGlrZTp7W2ZpbGU7cGF0dGVybl0gaW5mbzBbZmlsZTt7eCB3aGVyZSB4IGxpa2UgeX1bbG93ZXIgY29saGRyc1tmaWxlXTtwYXR0ZXJuXV19IC8gLmNzdi5pbmZvbGlrZVtmaWxlOyIqdGltZSJdCgpcZCAuCi8gREFUQTooKQpidWxrbG9hZDp7W2ZpbGU7aW5mb10KCWlmW25vdGBEQVRBIGluIHN5c3RlbSJ2IjsnYERBVEEubm90LmRlZmluZWRdOwoJaWZbY291bnQgREFUQTsnYERBVEEubm90LmVtcHR5XTsKCWxvYWRoZHJzOmV4ZWMgYyBmcm9tIGluZm8gd2hlcmUgbm90IHQ9IiAiO2xvYWRmbXRzOmV4ZWMgdCBmcm9tIGluZm87CgkuY3N2LmZzMlt7W2ZpbGU7bG9hZGhkcnM7bG9hZGZtdHNdIGBEQVRBIGluc2VydCAkW2NvdW50IERBVEE7ZmxpcCBsb2FkaGRycyEobG9hZGZtdHM7LmNzdi5ERUxJTSkwOmZpbGU7bG9hZGhkcnMgeGNvbChsb2FkZm10cztlbmxpc3QgLmNzdi5ERUxJTSkwOmZpbGVdfVtmaWxlO2xvYWRoZHJzO2xvYWRmbXRzXV07Cgljb3VudCBEQVRBfQpAWy46OyJcXGwgY3N2dXRpbC5jdXN0b20ucSI7OjpdOyAvIHNhdmUgeW91ciBjdXN0b20gc2V0dGluZ3MgaW4gY3N2dXRpbC5jdXN0b20ucSB0byBvdmVycmlkZSB0aG9zZSBzZXQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZSAKPC90ZXh0YXJlYT48L2Rpdj4KCiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgICAgIG1hdGNoQnJhY2tldHM6IHRydWUKICAgICAgfSk7CiAgICA8L3NjcmlwdD4KCiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZSBkZWZpbmVkOjwvc3Ryb25nPiA8Y29kZT50ZXh0L3gtcTwvY29kZT4uPC9wPgogIDwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/q/q.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJxIixmdW5jdGlvbihjb25maWcpewogIHZhciBpbmRlbnRVbml0PWNvbmZpZy5pbmRlbnRVbml0LAogICAgICBjdXJQdW5jLAogICAgICBrZXl3b3Jkcz1idWlsZFJFKFsiYWJzIiwiYWNvcyIsImFqIiwiYWowIiwiYWxsIiwiYW5kIiwiYW55IiwiYXNjIiwiYXNpbiIsImFzb2YiLCJhdGFuIiwiYXR0ciIsImF2ZyIsImF2Z3MiLCJiaW4iLCJieSIsImNlaWxpbmciLCJjb2xzIiwiY29yIiwiY29zIiwiY291bnQiLCJjb3YiLCJjcm9zcyIsImNzdiIsImN1dCIsImRlbGV0ZSIsImRlbHRhcyIsImRlc2MiLCJkZXYiLCJkaWZmZXIiLCJkaXN0aW5jdCIsImRpdiIsImRvIiwiZWFjaCIsImVqIiwiZW5saXN0IiwiZXZhbCIsImV4Y2VwdCIsImV4ZWMiLCJleGl0IiwiZXhwIiwiZmJ5IiwiZmlsbHMiLCJmaXJzdCIsImZrZXlzIiwiZmxpcCIsImZsb29yIiwiZnJvbSIsImdldCIsImdldGVudiIsImdyb3VwIiwiZ3RpbWUiLCJoY2xvc2UiLCJoY291bnQiLCJoZGVsIiwiaG9wZW4iLCJoc3ltIiwiaWFzYyIsImlkZXNjIiwiaWYiLCJpaiIsImluIiwiaW5zZXJ0IiwiaW50ZXIiLCJpbnYiLCJrZXkiLCJrZXlzIiwibGFzdCIsImxpa2UiLCJsaXN0IiwibGoiLCJsb2FkIiwibG9nIiwibG93ZXIiLCJsc3EiLCJsdGltZSIsImx0cmltIiwibWF2ZyIsIm1heCIsIm1heHMiLCJtY291bnQiLCJtZDUiLCJtZGV2IiwibWVkIiwibWV0YSIsIm1pbiIsIm1pbnMiLCJtbWF4IiwibW1pbiIsIm1tdSIsIm1vZCIsIm1zdW0iLCJuZWciLCJuZXh0Iiwibm90IiwibnVsbCIsIm9yIiwib3ZlciIsInBhcnNlIiwicGVhY2giLCJwaiIsInBsaXN0IiwicHJkIiwicHJkcyIsInByZXYiLCJwcmlvciIsInJhbmQiLCJyYW5rIiwicmF0aW9zIiwicmF6ZSIsInJlYWQwIiwicmVhZDEiLCJyZWNpcHJvY2FsIiwicmV2ZXJzZSIsInJsb2FkIiwicm90YXRlIiwicnNhdmUiLCJydHJpbSIsInNhdmUiLCJzY2FuIiwic2VsZWN0Iiwic2V0Iiwic2V0ZW52Iiwic2hvdyIsInNpZ251bSIsInNpbiIsInNxcnQiLCJzcyIsInNzciIsInN0cmluZyIsInN1Ymxpc3QiLCJzdW0iLCJzdW1zIiwic3YiLCJzeXN0ZW0iLCJ0YWJsZXMiLCJ0YW4iLCJ0aWwiLCJ0cmltIiwidHhmIiwidHlwZSIsInVqIiwidW5ncm91cCIsInVuaW9uIiwidXBkYXRlIiwidXBwZXIiLCJ1cHNlcnQiLCJ2YWx1ZSIsInZhciIsInZpZXciLCJ2aWV3cyIsInZzIiwid2F2ZyIsIndoZXJlIiwid2hlcmUiLCJ3aGlsZSIsIndpdGhpbiIsIndqIiwid2oxIiwid3N1bSIsInhhc2MiLCJ4YmFyIiwieGNvbCIsInhjb2xzIiwieGRlc2MiLCJ4ZXhwIiwieGdyb3VwIiwieGtleSIsInhsb2ciLCJ4cHJldiIsInhyYW5rIl0pLAogICAgICBFPS9bfC8mXiErOlxcXC0qJSQ9fiM7QD48LD9fXCdcIlxbXChcXVwpXHN7fV0vOwogIGZ1bmN0aW9uIGJ1aWxkUkUodyl7cmV0dXJuIG5ldyBSZWdFeHAoIl4oIit3LmpvaW4oInwiKSsiKSQiKTt9CiAgZnVuY3Rpb24gdG9rZW5CYXNlKHN0cmVhbSxzdGF0ZSl7CiAgICB2YXIgc29sPXN0cmVhbS5zb2woKSxjPXN0cmVhbS5uZXh0KCk7CiAgICBjdXJQdW5jPW51bGw7CiAgICBpZihzb2wpCiAgICAgIGlmKGM9PSIvIikKICAgICAgICByZXR1cm4oc3RhdGUudG9rZW5pemU9dG9rZW5MaW5lQ29tbWVudCkoc3RyZWFtLHN0YXRlKTsKICAgICAgZWxzZSBpZihjPT0iXFwiKXsKICAgICAgICBpZihzdHJlYW0uZW9sKCl8fC9ccy8udGVzdChzdHJlYW0ucGVlaygpKSkKICAgICAgICAgIHJldHVybiBzdHJlYW0uc2tpcFRvRW5kKCksL15cXFxzKiQvLnRlc3Qoc3RyZWFtLmN1cnJlbnQoKSk/KHN0YXRlLnRva2VuaXplPXRva2VuQ29tbWVudFRvRU9GKShzdHJlYW0sIHN0YXRlKTpzdGF0ZS50b2tlbml6ZT10b2tlbkJhc2UsImNvbW1lbnQiOwogICAgICAgIGVsc2UKICAgICAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZT10b2tlbkJhc2UsImJ1aWx0aW4iOwogICAgICB9CiAgICBpZigvXHMvLnRlc3QoYykpCiAgICAgIHJldHVybiBzdHJlYW0ucGVlaygpPT0iLyI/KHN0cmVhbS5za2lwVG9FbmQoKSwiY29tbWVudCIpOiJ3aGl0ZXNwYWNlIjsKICAgIGlmKGM9PSciJykKICAgICAgcmV0dXJuKHN0YXRlLnRva2VuaXplPXRva2VuU3RyaW5nKShzdHJlYW0sc3RhdGUpOwogICAgaWYoYz09J2AnKQogICAgICByZXR1cm4gc3RyZWFtLmVhdFdoaWxlKC9bQS1afGEtenxcZHxffDp8XC98XC5dLyksInN5bWJvbCI7CiAgICBpZigoIi4iPT1jJiYvXGQvLnRlc3Qoc3RyZWFtLnBlZWsoKSkpfHwvXGQvLnRlc3QoYykpewogICAgICB2YXIgdD1udWxsOwogICAgICBzdHJlYW0uYmFja1VwKDEpOwogICAgICBpZihzdHJlYW0ubWF0Y2goL15cZHs0fVwuXGR7Mn0obXxcLlxkezJ9KFtEfFRdKFxkezJ9KDpcZHsyfSg6XGR7Mn0oXC5cZHsxLDl9KT8pPyk/KT8pPykvKQogICAgICB8fCBzdHJlYW0ubWF0Y2goL15cZCtEKFxkezJ9KDpcZHsyfSg6XGR7Mn0oXC5cZHsxLDl9KT8pPyk/KS8pCiAgICAgIHx8IHN0cmVhbS5tYXRjaCgvXlxkezJ9OlxkezJ9KDpcZHsyfShcLlxkezEsOX0pPyk/LykKICAgICAgfHwgc3RyZWFtLm1hdGNoKC9eXGQrW3B0dXZdezF9LykpCiAgICAgICAgdD0idGVtcG9yYWwiOwogICAgICBlbHNlIGlmKHN0cmVhbS5tYXRjaCgvXjBbTndXXXsxfS8pCiAgICAgIHx8IHN0cmVhbS5tYXRjaCgvXjB4W1xkfGEtZnxBLUZdKi8pCiAgICAgIHx8IHN0cmVhbS5tYXRjaCgvXlswfDFdK1tiXXsxfS8pCiAgICAgIHx8IHN0cmVhbS5tYXRjaCgvXlxkK1tjaGlqbl17MX0vKQogICAgICB8fCBzdHJlYW0ubWF0Y2goLy0/XGQqKFwuXGQqKT8oZVsrXC1dP1xkKyk/KGV8Zik/LykpCiAgICAgICAgdD0ibnVtYmVyIjsKICAgICAgcmV0dXJuKHQmJighKGM9c3RyZWFtLnBlZWsoKSl8fEUudGVzdChjKSkpP3Q6KHN0cmVhbS5uZXh0KCksImVycm9yIik7CiAgICB9CiAgICBpZigvW0EtWnxhLXpdfFwuLy50ZXN0KGMpKQogICAgICByZXR1cm4gc3RyZWFtLmVhdFdoaWxlKC9bQS1afGEtenxcLnxffFxkXS8pLGtleXdvcmRzLnRlc3Qoc3RyZWFtLmN1cnJlbnQoKSk/ImtleXdvcmQiOiJ2YXJpYWJsZSI7CiAgICBpZigvW3wvJl4hKzpcXFwtKiUkPX4jO0A+PFwuLD9fXCddLy50ZXN0KGMpKQogICAgICByZXR1cm4gbnVsbDsKICAgIGlmKC9be31cKFxbXF1cKV0vLnRlc3QoYykpCiAgICAgIHJldHVybiBudWxsOwogICAgcmV0dXJuImVycm9yIjsKICB9CiAgZnVuY3Rpb24gdG9rZW5MaW5lQ29tbWVudChzdHJlYW0sc3RhdGUpewogICAgcmV0dXJuIHN0cmVhbS5za2lwVG9FbmQoKSwvXC9ccyokLy50ZXN0KHN0cmVhbS5jdXJyZW50KCkpPyhzdGF0ZS50b2tlbml6ZT10b2tlbkJsb2NrQ29tbWVudCkoc3RyZWFtLHN0YXRlKTooc3RhdGUudG9rZW5pemU9dG9rZW5CYXNlKSwiY29tbWVudCI7CiAgfQogIGZ1bmN0aW9uIHRva2VuQmxvY2tDb21tZW50KHN0cmVhbSxzdGF0ZSl7CiAgICB2YXIgZj1zdHJlYW0uc29sKCkmJnN0cmVhbS5wZWVrKCk9PSJcXCI7CiAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICBpZihmJiYvXlxcXHMqJC8udGVzdChzdHJlYW0uY3VycmVudCgpKSkKICAgICAgc3RhdGUudG9rZW5pemU9dG9rZW5CYXNlOwogICAgcmV0dXJuImNvbW1lbnQiOwogIH0KICBmdW5jdGlvbiB0b2tlbkNvbW1lbnRUb0VPRihzdHJlYW0pe3JldHVybiBzdHJlYW0uc2tpcFRvRW5kKCksImNvbW1lbnQiO30KICBmdW5jdGlvbiB0b2tlblN0cmluZyhzdHJlYW0sc3RhdGUpewogICAgdmFyIGVzY2FwZWQ9ZmFsc2UsbmV4dCxlbmQ9ZmFsc2U7CiAgICB3aGlsZSgobmV4dD1zdHJlYW0ubmV4dCgpKSl7CiAgICAgIGlmKG5leHQ9PSJcIiImJiFlc2NhcGVkKXtlbmQ9dHJ1ZTticmVhazt9CiAgICAgIGVzY2FwZWQ9IWVzY2FwZWQmJm5leHQ9PSJcXCI7CiAgICB9CiAgICBpZihlbmQpc3RhdGUudG9rZW5pemU9dG9rZW5CYXNlOwogICAgcmV0dXJuInN0cmluZyI7CiAgfQogIGZ1bmN0aW9uIHB1c2hDb250ZXh0KHN0YXRlLHR5cGUsY29sKXtzdGF0ZS5jb250ZXh0PXtwcmV2OnN0YXRlLmNvbnRleHQsaW5kZW50OnN0YXRlLmluZGVudCxjb2w6Y29sLHR5cGU6dHlwZX07fQogIGZ1bmN0aW9uIHBvcENvbnRleHQoc3RhdGUpe3N0YXRlLmluZGVudD1zdGF0ZS5jb250ZXh0LmluZGVudDtzdGF0ZS5jb250ZXh0PXN0YXRlLmNvbnRleHQucHJldjt9CiAgcmV0dXJuewogICAgc3RhcnRTdGF0ZTpmdW5jdGlvbigpewogICAgICByZXR1cm57dG9rZW5pemU6dG9rZW5CYXNlLAogICAgICAgICAgICAgY29udGV4dDpudWxsLAogICAgICAgICAgICAgaW5kZW50OjAsCiAgICAgICAgICAgICBjb2w6MH07CiAgICB9LAogICAgdG9rZW46ZnVuY3Rpb24oc3RyZWFtLHN0YXRlKXsKICAgICAgaWYoc3RyZWFtLnNvbCgpKXsKICAgICAgICBpZihzdGF0ZS5jb250ZXh0JiZzdGF0ZS5jb250ZXh0LmFsaWduPT1udWxsKQogICAgICAgICAgc3RhdGUuY29udGV4dC5hbGlnbj1mYWxzZTsKICAgICAgICBzdGF0ZS5pbmRlbnQ9c3RyZWFtLmluZGVudGF0aW9uKCk7CiAgICAgIH0KICAgICAgLy9pZiAoc3RyZWFtLmVhdFNwYWNlKCkpIHJldHVybiBudWxsOwogICAgICB2YXIgc3R5bGU9c3RhdGUudG9rZW5pemUoc3RyZWFtLHN0YXRlKTsKICAgICAgaWYoc3R5bGUhPSJjb21tZW50IiYmc3RhdGUuY29udGV4dCYmc3RhdGUuY29udGV4dC5hbGlnbj09bnVsbCYmc3RhdGUuY29udGV4dC50eXBlIT0icGF0dGVybiIpewogICAgICAgIHN0YXRlLmNvbnRleHQuYWxpZ249dHJ1ZTsKICAgICAgfQogICAgICBpZihjdXJQdW5jPT0iKCIpcHVzaENvbnRleHQoc3RhdGUsIikiLHN0cmVhbS5jb2x1bW4oKSk7CiAgICAgIGVsc2UgaWYoY3VyUHVuYz09IlsiKXB1c2hDb250ZXh0KHN0YXRlLCJdIixzdHJlYW0uY29sdW1uKCkpOwogICAgICBlbHNlIGlmKGN1clB1bmM9PSJ7IilwdXNoQ29udGV4dChzdGF0ZSwifSIsc3RyZWFtLmNvbHVtbigpKTsKICAgICAgZWxzZSBpZigvW1xdXH1cKV0vLnRlc3QoY3VyUHVuYykpewogICAgICAgIHdoaWxlKHN0YXRlLmNvbnRleHQmJnN0YXRlLmNvbnRleHQudHlwZT09InBhdHRlcm4iKXBvcENvbnRleHQoc3RhdGUpOwogICAgICAgIGlmKHN0YXRlLmNvbnRleHQmJmN1clB1bmM9PXN0YXRlLmNvbnRleHQudHlwZSlwb3BDb250ZXh0KHN0YXRlKTsKICAgICAgfQogICAgICBlbHNlIGlmKGN1clB1bmM9PSIuIiYmc3RhdGUuY29udGV4dCYmc3RhdGUuY29udGV4dC50eXBlPT0icGF0dGVybiIpcG9wQ29udGV4dChzdGF0ZSk7CiAgICAgIGVsc2UgaWYoL2F0b218c3RyaW5nfHZhcmlhYmxlLy50ZXN0KHN0eWxlKSYmc3RhdGUuY29udGV4dCl7CiAgICAgICAgaWYoL1tcfVxdXS8udGVzdChzdGF0ZS5jb250ZXh0LnR5cGUpKQogICAgICAgICAgcHVzaENvbnRleHQoc3RhdGUsInBhdHRlcm4iLHN0cmVhbS5jb2x1bW4oKSk7CiAgICAgICAgZWxzZSBpZihzdGF0ZS5jb250ZXh0LnR5cGU9PSJwYXR0ZXJuIiYmIXN0YXRlLmNvbnRleHQuYWxpZ24pewogICAgICAgICAgc3RhdGUuY29udGV4dC5hbGlnbj10cnVlOwogICAgICAgICAgc3RhdGUuY29udGV4dC5jb2w9c3RyZWFtLmNvbHVtbigpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gc3R5bGU7CiAgICB9LAogICAgaW5kZW50OmZ1bmN0aW9uKHN0YXRlLHRleHRBZnRlcil7CiAgICAgIHZhciBmaXJzdENoYXI9dGV4dEFmdGVyJiZ0ZXh0QWZ0ZXIuY2hhckF0KDApOwogICAgICB2YXIgY29udGV4dD1zdGF0ZS5jb250ZXh0OwogICAgICBpZigvW1xdXH1dLy50ZXN0KGZpcnN0Q2hhcikpCiAgICAgICAgd2hpbGUgKGNvbnRleHQmJmNvbnRleHQudHlwZT09InBhdHRlcm4iKWNvbnRleHQ9Y29udGV4dC5wcmV2OwogICAgICB2YXIgY2xvc2luZz1jb250ZXh0JiZmaXJzdENoYXI9PWNvbnRleHQudHlwZTsKICAgICAgaWYoIWNvbnRleHQpCiAgICAgICAgcmV0dXJuIDA7CiAgICAgIGVsc2UgaWYoY29udGV4dC50eXBlPT0icGF0dGVybiIpCiAgICAgICAgcmV0dXJuIGNvbnRleHQuY29sOwogICAgICBlbHNlIGlmKGNvbnRleHQuYWxpZ24pCiAgICAgICAgcmV0dXJuIGNvbnRleHQuY29sKyhjbG9zaW5nPzA6MSk7CiAgICAgIGVsc2UKICAgICAgICByZXR1cm4gY29udGV4dC5pbmRlbnQrKGNsb3Npbmc/MDppbmRlbnRVbml0KTsKICAgIH0KICB9Owp9KTsKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtcSIsInEiKTsKCn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/r/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/r/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogUiBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9InIuanMiPjwvc2NyaXB0Pgo8c3R5bGU+CiAgICAgIC5Db2RlTWlycm9yIHsgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHNpbHZlcjsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHNpbHZlcjsgfQogICAgICAuY20tcy1kZWZhdWx0IHNwYW4uY20tc2VtaSB7IGNvbG9yOiBibHVlOyBmb250LXdlaWdodDogYm9sZDsgfQogICAgICAuY20tcy1kZWZhdWx0IHNwYW4uY20tZG9sbGFyIHsgY29sb3I6IG9yYW5nZTsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KICAgICAgLmNtLXMtZGVmYXVsdCBzcGFuLmNtLWFycm93IHsgY29sb3I6IGJyb3duOyB9CiAgICAgIC5jbS1zLWRlZmF1bHQgc3Bhbi5jbS1hcmctaXMgeyBjb2xvcjogYnJvd247IH0KICAgIDwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGgxPkNvZGVNaXJyb3I8L2gxPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5SPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5SIG1vZGU8L2gyPgo8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgpYIDwtIGxpc3QoaGVpZ2h0ID0gNS40LCB3ZWlnaHQgPSA1NCkKY2F0KCJQcmludGluZyBvYmplY3RzOiAiKTsgcHJpbnQoWCkKcHJpbnQoIkFjY2Vzc2luZyBpbmRpdmlkdWFsIGVsZW1lbnRzOiIpCmNhdChzcHJpbnRmKCJZb3VyIGhlaWdodCBpcyAlcyBhbmQgeW91ciB3ZWlnaHQgaXMgJXNcbiIsIFgkaGVpZ2h0LCBYJHdlaWdodCkpCgojIEZ1bmN0aW9uczoKc3F1YXJlIDwtIGZ1bmN0aW9uKHgpIHsKICByZXR1cm4oeCAqIHgpCn0KY2F0KHNwcmludGYoIlRoZSBzcXVhcmUgb2YgMyBpcyAlc1xuIiwgc3F1YXJlKDMpKSkKCiMgSW4gUiwgdGhlIGxhc3QgZXhwcmVzc2lvbiBpbiBhIGZ1bmN0aW9uIGlzLCBieSBkZWZhdWx0LCB3aGF0IGlzCiMgcmV0dXJuZWQuIFRoZSBpZGlvbWF0aWMgd2F5IHRvIHdyaXRlIHRoZSBmdW5jdGlvbiBpczoKc3F1YXJlIDwtIGZ1bmN0aW9uKHgpIHsKICB4ICogeAp9CiMgb3IsIGZvciBmdW5jdGlvbnMgd2l0aCBzaG9ydCBjb250ZW50OgpzcXVhcmUgPC0gZnVuY3Rpb24oeCkgeCAqIHgKCiMgRnVuY3Rpb24gYXJndW1lbnRzIHdpdGggZGVmYXVsdCB2YWx1ZXM6CmN1YmUgPC0gZnVuY3Rpb24oeCA9IDUpIHggKiB4ICogeApjYXQoc3ByaW50ZigiQ2FsbGluZyBjdWJlIHdpdGggMiA6ICVzXG4iLCBjdWJlKDIpKSAgIyB3aWxsIGdpdmUgMl4zCmNhdChzcHJpbnRmKCJDYWxsaW5nIGN1YmUgICAgICAgIDogJXNcbiIsIGN1YmUoKSkgICAjIHdpbGwgZGVmYXVsdCB0byA1XjMuCgpwb3dlcnMgPC0gZnVuY3Rpb24oeCkgbGlzdCh4MiA9IHgqeCwgeDMgPSB4KngqeCwgeDQgPSB4KngqeCp4KQoKY2F0KCJQb3dlcnMgb2YgMzogIik7IHByaW50KHBvd2VycygzKSkKCiMgRGF0YSBmcmFtZXMKZGYgPC0gZGF0YS5mcmFtZShsZXR0ZXJzID0gbGV0dGVyc1sxOjVdLCAnI2xldHRlcicgPSAxOjUpCnByaW50KGRmJGxldHRlcnMpCnByaW50KGRmJGAjbGV0dGVyYCkKCiMgT3BlcmF0b3JzOgptMSA8LSBtYXRyaXgoMTo2LCAyLCAzKQptMiA8LSBtMSAlKiUgdChtMSkKY2F0KCJNYXRyaXggcHJvZHVjdDogIik7IHByaW50KG0yKQoKIyBBc3NpZ25tZW50czoKYSA8LSAxCmIgPDwtIDIKYyA9IDMKNCAtPiBkCjUgLT4+IGUKPC90ZXh0YXJlYT48L2Zvcm0+CiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwge30pOwogICAgPC9zY3JpcHQ+CgogICAgPHA+PHN0cm9uZz5NSU1FIHR5cGVzIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPnRleHQveC1yc3JjPC9jb2RlPi48L3A+CgogICAgPHA+RGV2ZWxvcG1lbnQgb2YgdGhlIENvZGVNaXJyb3IgUiBtb2RlIHdhcyBraW5kbHkgc3BvbnNvcmVkCiAgICBieSA8YSBocmVmPSJodHRwczovL3R3aXR0ZXIuY29tL3ViYWxvIj5VYmFsbzwvYT4uPC9wPgoKICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/r/r.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5yZWdpc3RlckhlbHBlcigid29yZENoYXJzIiwgInIiLCAvW1x3Ll0vKTsKCkNvZGVNaXJyb3IuZGVmaW5lTW9kZSgiciIsIGZ1bmN0aW9uKGNvbmZpZykgewogIGZ1bmN0aW9uIHdvcmRPYmooc3RyKSB7CiAgICB2YXIgd29yZHMgPSBzdHIuc3BsaXQoIiAiKSwgcmVzID0ge307CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHdvcmRzLmxlbmd0aDsgKytpKSByZXNbd29yZHNbaV1dID0gdHJ1ZTsKICAgIHJldHVybiByZXM7CiAgfQogIHZhciBhdG9tcyA9IHdvcmRPYmooIk5VTEwgTkEgSW5mIE5hTiBOQV9pbnRlZ2VyXyBOQV9yZWFsXyBOQV9jb21wbGV4XyBOQV9jaGFyYWN0ZXJfIik7CiAgdmFyIGJ1aWx0aW5zID0gd29yZE9iaigibGlzdCBxdW90ZSBicXVvdGUgZXZhbCByZXR1cm4gY2FsbCBwYXJzZSBkZXBhcnNlIik7CiAgdmFyIGtleXdvcmRzID0gd29yZE9iaigiaWYgZWxzZSByZXBlYXQgd2hpbGUgZnVuY3Rpb24gZm9yIGluIG5leHQgYnJlYWsiKTsKICB2YXIgYmxvY2trZXl3b3JkcyA9IHdvcmRPYmooImlmIGVsc2UgcmVwZWF0IHdoaWxlIGZ1bmN0aW9uIGZvciIpOwogIHZhciBvcENoYXJzID0gL1srXC0qXC9ePD49ISZ8fiQ6XS87CiAgdmFyIGN1clB1bmM7CgogIGZ1bmN0aW9uIHRva2VuQmFzZShzdHJlYW0sIHN0YXRlKSB7CiAgICBjdXJQdW5jID0gbnVsbDsKICAgIHZhciBjaCA9IHN0cmVhbS5uZXh0KCk7CiAgICBpZiAoY2ggPT0gIiMiKSB7CiAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgcmV0dXJuICJjb21tZW50IjsKICAgIH0gZWxzZSBpZiAoY2ggPT0gIjAiICYmIHN0cmVhbS5lYXQoIngiKSkgewogICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcZGEtZl0vaSk7CiAgICAgIHJldHVybiAibnVtYmVyIjsKICAgIH0gZWxzZSBpZiAoY2ggPT0gIi4iICYmIHN0cmVhbS5lYXQoL1xkLykpIHsKICAgICAgc3RyZWFtLm1hdGNoKC9cZCooPzplWytcLV0/XGQrKT8vKTsKICAgICAgcmV0dXJuICJudW1iZXIiOwogICAgfSBlbHNlIGlmICgvXGQvLnRlc3QoY2gpKSB7CiAgICAgIHN0cmVhbS5tYXRjaCgvXGQqKD86XC5cZCspPyg/OmVbK1wtXVxkKyk/TD8vKTsKICAgICAgcmV0dXJuICJudW1iZXIiOwogICAgfSBlbHNlIGlmIChjaCA9PSAiJyIgfHwgY2ggPT0gJyInKSB7CiAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5TdHJpbmcoY2gpOwogICAgICByZXR1cm4gInN0cmluZyI7CiAgICB9IGVsc2UgaWYgKGNoID09ICJgIikgewogICAgICBzdHJlYW0ubWF0Y2goL1teYF0rYC8pOwogICAgICByZXR1cm4gInZhcmlhYmxlLTMiOwogICAgfSBlbHNlIGlmIChjaCA9PSAiLiIgJiYgc3RyZWFtLm1hdGNoKC8uWy5cZF0rLykpIHsKICAgICAgcmV0dXJuICJrZXl3b3JkIjsKICAgIH0gZWxzZSBpZiAoL1tcd1wuXS8udGVzdChjaCkgJiYgY2ggIT0gIl8iKSB7CiAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1x3XC5dLyk7CiAgICAgIHZhciB3b3JkID0gc3RyZWFtLmN1cnJlbnQoKTsKICAgICAgaWYgKGF0b21zLnByb3BlcnR5SXNFbnVtZXJhYmxlKHdvcmQpKSByZXR1cm4gImF0b20iOwogICAgICBpZiAoa2V5d29yZHMucHJvcGVydHlJc0VudW1lcmFibGUod29yZCkpIHsKICAgICAgICAvLyBCbG9jayBrZXl3b3JkcyBzdGFydCBuZXcgYmxvY2tzLCBleGNlcHQgJ2Vsc2UgaWYnLCB3aGljaCBvbmx5IHN0YXJ0cwogICAgICAgIC8vIG9uZSBuZXcgYmxvY2sgZm9yIHRoZSAnaWYnLCBubyBibG9jayBmb3IgdGhlICdlbHNlJy4KICAgICAgICBpZiAoYmxvY2trZXl3b3Jkcy5wcm9wZXJ0eUlzRW51bWVyYWJsZSh3b3JkKSAmJgogICAgICAgICAgICAhc3RyZWFtLm1hdGNoKC9ccyppZihccyt8JCkvLCBmYWxzZSkpCiAgICAgICAgICBjdXJQdW5jID0gImJsb2NrIjsKICAgICAgICByZXR1cm4gImtleXdvcmQiOwogICAgICB9CiAgICAgIGlmIChidWlsdGlucy5wcm9wZXJ0eUlzRW51bWVyYWJsZSh3b3JkKSkgcmV0dXJuICJidWlsdGluIjsKICAgICAgcmV0dXJuICJ2YXJpYWJsZSI7CiAgICB9IGVsc2UgaWYgKGNoID09ICIlIikgewogICAgICBpZiAoc3RyZWFtLnNraXBUbygiJSIpKSBzdHJlYW0ubmV4dCgpOwogICAgICByZXR1cm4gIm9wZXJhdG9yIHZhcmlhYmxlLTIiOwogICAgfSBlbHNlIGlmICgKICAgICAgICAoY2ggPT0gIjwiICYmIHN0cmVhbS5lYXQoIi0iKSkgfHwKICAgICAgICAoY2ggPT0gIjwiICYmIHN0cmVhbS5tYXRjaCgiPC0iKSkgfHwKICAgICAgICAoY2ggPT0gIi0iICYmIHN0cmVhbS5tYXRjaCgvPj4/LykpCiAgICAgICkgewogICAgICByZXR1cm4gIm9wZXJhdG9yIGFycm93IjsKICAgIH0gZWxzZSBpZiAoY2ggPT0gIj0iICYmIHN0YXRlLmN0eC5hcmdMaXN0KSB7CiAgICAgIHJldHVybiAiYXJnLWlzIjsKICAgIH0gZWxzZSBpZiAob3BDaGFycy50ZXN0KGNoKSkgewogICAgICBpZiAoY2ggPT0gIiQiKSByZXR1cm4gIm9wZXJhdG9yIGRvbGxhciI7CiAgICAgIHN0cmVhbS5lYXRXaGlsZShvcENoYXJzKTsKICAgICAgcmV0dXJuICJvcGVyYXRvciI7CiAgICB9IGVsc2UgaWYgKC9bXChcKXt9XFtcXTtdLy50ZXN0KGNoKSkgewogICAgICBjdXJQdW5jID0gY2g7CiAgICAgIGlmIChjaCA9PSAiOyIpIHJldHVybiAic2VtaSI7CiAgICAgIHJldHVybiBudWxsOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfQoKICBmdW5jdGlvbiB0b2tlblN0cmluZyhxdW90ZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgaWYgKHN0cmVhbS5lYXQoIlxcIikpIHsKICAgICAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpOwogICAgICAgIGlmIChjaCA9PSAieCIpIHN0cmVhbS5tYXRjaCgvXlthLWYwLTldezJ9L2kpOwogICAgICAgIGVsc2UgaWYgKChjaCA9PSAidSIgfHwgY2ggPT0gIlUiKSAmJiBzdHJlYW0uZWF0KCJ7IikgJiYgc3RyZWFtLnNraXBUbygifSIpKSBzdHJlYW0ubmV4dCgpOwogICAgICAgIGVsc2UgaWYgKGNoID09ICJ1Iikgc3RyZWFtLm1hdGNoKC9eW2EtZjAtOV17NH0vaSk7CiAgICAgICAgZWxzZSBpZiAoY2ggPT0gIlUiKSBzdHJlYW0ubWF0Y2goL15bYS1mMC05XXs4fS9pKTsKICAgICAgICBlbHNlIGlmICgvWzAtN10vLnRlc3QoY2gpKSBzdHJlYW0ubWF0Y2goL15bMC03XXsxLDJ9Lyk7CiAgICAgICAgcmV0dXJuICJzdHJpbmctMiI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdmFyIG5leHQ7CiAgICAgICAgd2hpbGUgKChuZXh0ID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkgewogICAgICAgICAgaWYgKG5leHQgPT0gcXVvdGUpIHsgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7IGJyZWFrOyB9CiAgICAgICAgICBpZiAobmV4dCA9PSAiXFwiKSB7IHN0cmVhbS5iYWNrVXAoMSk7IGJyZWFrOyB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAic3RyaW5nIjsKICAgICAgfQogICAgfTsKICB9CgogIGZ1bmN0aW9uIHB1c2goc3RhdGUsIHR5cGUsIHN0cmVhbSkgewogICAgc3RhdGUuY3R4ID0ge3R5cGU6IHR5cGUsCiAgICAgICAgICAgICAgICAgaW5kZW50OiBzdGF0ZS5pbmRlbnQsCiAgICAgICAgICAgICAgICAgYWxpZ246IG51bGwsCiAgICAgICAgICAgICAgICAgY29sdW1uOiBzdHJlYW0uY29sdW1uKCksCiAgICAgICAgICAgICAgICAgcHJldjogc3RhdGUuY3R4fTsKICB9CiAgZnVuY3Rpb24gcG9wKHN0YXRlKSB7CiAgICBzdGF0ZS5pbmRlbnQgPSBzdGF0ZS5jdHguaW5kZW50OwogICAgc3RhdGUuY3R4ID0gc3RhdGUuY3R4LnByZXY7CiAgfQoKICByZXR1cm4gewogICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB7dG9rZW5pemU6IHRva2VuQmFzZSwKICAgICAgICAgICAgICBjdHg6IHt0eXBlOiAidG9wIiwKICAgICAgICAgICAgICAgICAgICBpbmRlbnQ6IC1jb25maWcuaW5kZW50VW5pdCwKICAgICAgICAgICAgICAgICAgICBhbGlnbjogZmFsc2V9LAogICAgICAgICAgICAgIGluZGVudDogMCwKICAgICAgICAgICAgICBhZnRlcklkZW50OiBmYWxzZX07CiAgICB9LAoKICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIGlmIChzdHJlYW0uc29sKCkpIHsKICAgICAgICBpZiAoc3RhdGUuY3R4LmFsaWduID09IG51bGwpIHN0YXRlLmN0eC5hbGlnbiA9IGZhbHNlOwogICAgICAgIHN0YXRlLmluZGVudCA9IHN0cmVhbS5pbmRlbnRhdGlvbigpOwogICAgICB9CiAgICAgIGlmIChzdHJlYW0uZWF0U3BhY2UoKSkgcmV0dXJuIG51bGw7CiAgICAgIHZhciBzdHlsZSA9IHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgICBpZiAoc3R5bGUgIT0gImNvbW1lbnQiICYmIHN0YXRlLmN0eC5hbGlnbiA9PSBudWxsKSBzdGF0ZS5jdHguYWxpZ24gPSB0cnVlOwoKICAgICAgdmFyIGN0eXBlID0gc3RhdGUuY3R4LnR5cGU7CiAgICAgIGlmICgoY3VyUHVuYyA9PSAiOyIgfHwgY3VyUHVuYyA9PSAieyIgfHwgY3VyUHVuYyA9PSAifSIpICYmIGN0eXBlID09ICJibG9jayIpIHBvcChzdGF0ZSk7CiAgICAgIGlmIChjdXJQdW5jID09ICJ7IikgcHVzaChzdGF0ZSwgIn0iLCBzdHJlYW0pOwogICAgICBlbHNlIGlmIChjdXJQdW5jID09ICIoIikgewogICAgICAgIHB1c2goc3RhdGUsICIpIiwgc3RyZWFtKTsKICAgICAgICBpZiAoc3RhdGUuYWZ0ZXJJZGVudCkgc3RhdGUuY3R4LmFyZ0xpc3QgPSB0cnVlOwogICAgICB9CiAgICAgIGVsc2UgaWYgKGN1clB1bmMgPT0gIlsiKSBwdXNoKHN0YXRlLCAiXSIsIHN0cmVhbSk7CiAgICAgIGVsc2UgaWYgKGN1clB1bmMgPT0gImJsb2NrIikgcHVzaChzdGF0ZSwgImJsb2NrIiwgc3RyZWFtKTsKICAgICAgZWxzZSBpZiAoY3VyUHVuYyA9PSBjdHlwZSkgcG9wKHN0YXRlKTsKICAgICAgc3RhdGUuYWZ0ZXJJZGVudCA9IHN0eWxlID09ICJ2YXJpYWJsZSIgfHwgc3R5bGUgPT0gImtleXdvcmQiOwogICAgICByZXR1cm4gc3R5bGU7CiAgICB9LAoKICAgIGluZGVudDogZnVuY3Rpb24oc3RhdGUsIHRleHRBZnRlcikgewogICAgICBpZiAoc3RhdGUudG9rZW5pemUgIT0gdG9rZW5CYXNlKSByZXR1cm4gMDsKICAgICAgdmFyIGZpcnN0Q2hhciA9IHRleHRBZnRlciAmJiB0ZXh0QWZ0ZXIuY2hhckF0KDApLCBjdHggPSBzdGF0ZS5jdHgsCiAgICAgICAgICBjbG9zaW5nID0gZmlyc3RDaGFyID09IGN0eC50eXBlOwogICAgICBpZiAoY3R4LnR5cGUgPT0gImJsb2NrIikgcmV0dXJuIGN0eC5pbmRlbnQgKyAoZmlyc3RDaGFyID09ICJ7IiA/IDAgOiBjb25maWcuaW5kZW50VW5pdCk7CiAgICAgIGVsc2UgaWYgKGN0eC5hbGlnbikgcmV0dXJuIGN0eC5jb2x1bW4gKyAoY2xvc2luZyA/IDAgOiAxKTsKICAgICAgZWxzZSByZXR1cm4gY3R4LmluZGVudCArIChjbG9zaW5nID8gMCA6IGNvbmZpZy5pbmRlbnRVbml0KTsKICAgIH0sCgogICAgbGluZUNvbW1lbnQ6ICIjIgogIH07Cn0pOwoKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtcnNyYyIsICJyIik7Cgp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/rpm/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/rpm/changes/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/rpm/changes/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogUlBNIGNoYW5nZXMgbW9kZTwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uLy4uL2RvYy9kb2NzLmNzcyI+CgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgogICAgPHNjcmlwdCBzcmM9Ii4uLy4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJjaGFuZ2VzLmpzIj48L3NjcmlwdD4KICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vLi4vZG9jL2RvY3MuY3NzIj4KICAgIDxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+LkNvZGVNaXJyb3Ige2JvcmRlci10b3A6IDFweCBzb2xpZCBibGFjazsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO308L3N0eWxlPgoKPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aDE+Q29kZU1pcnJvcjwvaDE+PGltZyBpZD1sb2dvIHNyYz0iLi4vLi4vLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi8uLi8uLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uLy4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+TGFuZ3VhZ2UgbW9kZXM8L2E+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPlJQTSBjaGFuZ2VzPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5SUE0gY2hhbmdlcyBtb2RlPC9oMj4KCiAgICA8ZGl2Pjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KVHVlIE9jdCAxOCAxMzo1ODo0MCBVVEMgMjAxMSAtIG1pc3RlcnhAZXhhbXBsZS5jb20KCi0gVXBkYXRlIHRvIHI2MC4zCi0gRml4ZXMgYnVnIGluIHRoZSByZWZsZWN0IHBhY2thZ2UKICAqIGRpc2FsbG93IEludGVyZmFjZSBtZXRob2Qgb24gVmFsdWUgb2J0YWluZWQgdmlhIHVuZXhwb3J0ZWQgbmFtZQoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpUaHUgT2N0ICA2IDA4OjE0OjI0IFVUQyAyMDExIC0gbWlzdGVyeEBleGFtcGxlLmNvbQoKLSBVcGRhdGUgdG8gcjYwLjIKLSBGaXhlcyBtZW1vcnkgbGVhayBpbiBjZXJ0YWluIG1hcCB0eXBlcwoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpXZWQgT2N0ICA1IDE0OjM0OjEwIFVUQyAyMDExIC0gbWlzdGVyeEBleGFtcGxlLmNvbQoKLSBUd2Vha3MgZm9yIGdkYiBkZWJ1Z2dpbmcKLSBnby5zcGVjIGNoYW5nZXM6CiAgLSBtb3ZlICVnb19hcmNoIGRlZmluaXRpb24gdG8gJXByZXAgc2VjdGlvbgogIC0gcGFzcyBjb3JyZWN0IGxvY2F0aW9uIG9mIGdvIHNwZWNpZmljIGdkYiBwcmV0dHkgcHJpbnRlciBhbmQKICAgIGZ1bmN0aW9ucyB0byBjcHAgYXMgSE9TVF9FWFRSQV9DRkxBR1MgbWFjcm8KICAtIGluc3RhbGwgZ28gZ2RiIGZ1bmN0aW9ucyAmIHByaW50ZXIKLSBnZGItcHJpbnRlci5wYXRjaAogIC0gcGF0Y2ggbGlua2VyIChzcmMvY21kL2xkL2R3YXJmLmMpIHRvIGVtaXQgY29ycmVjdCBsb2NhdGlvbiBvZiBnbwogICAgZ2RiIGZ1bmN0aW9ucyBhbmQgcHJldHR5IHByaW50ZXIKPC90ZXh0YXJlYT48L2Rpdj4KICAgIDxzY3JpcHQ+CiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICAgICAgbW9kZToge25hbWU6ICJjaGFuZ2VzIn0sCiAgICAgICAgbGluZU51bWJlcnM6IHRydWUsCiAgICAgICAgaW5kZW50VW5pdDogNAogICAgICB9KTsKICAgIDwvc2NyaXB0PgoKICAgIDxwPjxzdHJvbmc+TUlNRSB0eXBlcyBkZWZpbmVkOjwvc3Ryb25nPiA8Y29kZT50ZXh0L3gtcnBtLWNoYW5nZXM8L2NvZGU+LjwvcD4KPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/rpm/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogUlBNIGNoYW5nZXMgbW9kZTwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uLy4uL2RvYy9kb2NzLmNzcyI+CgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgogICAgPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJycG0uanMiPjwvc2NyaXB0PgogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgogICAgPHN0eWxlIHR5cGU9InRleHQvY3NzIj4uQ29kZU1pcnJvciB7Ym9yZGVyLXRvcDogMXB4IHNvbGlkIGJsYWNrOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+Cgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxoMT5Db2RlTWlycm9yPC9oMT48aW1nIGlkPWxvZ28gc3JjPSIuLi8uLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5MYW5ndWFnZSBtb2RlczwvYT4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+UlBNPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5SUE0gY2hhbmdlcyBtb2RlPC9oMj4KCiAgICA8ZGl2Pjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KVHVlIE9jdCAxOCAxMzo1ODo0MCBVVEMgMjAxMSAtIG1pc3RlcnhAZXhhbXBsZS5jb20KCi0gVXBkYXRlIHRvIHI2MC4zCi0gRml4ZXMgYnVnIGluIHRoZSByZWZsZWN0IHBhY2thZ2UKICAqIGRpc2FsbG93IEludGVyZmFjZSBtZXRob2Qgb24gVmFsdWUgb2J0YWluZWQgdmlhIHVuZXhwb3J0ZWQgbmFtZQoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpUaHUgT2N0ICA2IDA4OjE0OjI0IFVUQyAyMDExIC0gbWlzdGVyeEBleGFtcGxlLmNvbQoKLSBVcGRhdGUgdG8gcjYwLjIKLSBGaXhlcyBtZW1vcnkgbGVhayBpbiBjZXJ0YWluIG1hcCB0eXBlcwoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpXZWQgT2N0ICA1IDE0OjM0OjEwIFVUQyAyMDExIC0gbWlzdGVyeEBleGFtcGxlLmNvbQoKLSBUd2Vha3MgZm9yIGdkYiBkZWJ1Z2dpbmcKLSBnby5zcGVjIGNoYW5nZXM6CiAgLSBtb3ZlICVnb19hcmNoIGRlZmluaXRpb24gdG8gJXByZXAgc2VjdGlvbgogIC0gcGFzcyBjb3JyZWN0IGxvY2F0aW9uIG9mIGdvIHNwZWNpZmljIGdkYiBwcmV0dHkgcHJpbnRlciBhbmQKICAgIGZ1bmN0aW9ucyB0byBjcHAgYXMgSE9TVF9FWFRSQV9DRkxBR1MgbWFjcm8KICAtIGluc3RhbGwgZ28gZ2RiIGZ1bmN0aW9ucyAmIHByaW50ZXIKLSBnZGItcHJpbnRlci5wYXRjaAogIC0gcGF0Y2ggbGlua2VyIChzcmMvY21kL2xkL2R3YXJmLmMpIHRvIGVtaXQgY29ycmVjdCBsb2NhdGlvbiBvZiBnbwogICAgZ2RiIGZ1bmN0aW9ucyBhbmQgcHJldHR5IHByaW50ZXIKPC90ZXh0YXJlYT48L2Rpdj4KICAgIDxzY3JpcHQ+CiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICAgICAgbW9kZToge25hbWU6ICJycG0tY2hhbmdlcyJ9LAogICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgICAgIGluZGVudFVuaXQ6IDQKICAgICAgfSk7CiAgICA8L3NjcmlwdD4KCjxoMj5SUE0gc3BlYyBtb2RlPC9oMj4KICAgIAogICAgPGRpdj48dGV4dGFyZWEgaWQ9ImNvZGUyIiBuYW1lPSJjb2RlMiI+CiMKIyBzcGVjIGZpbGUgZm9yIHBhY2thZ2UgbWluaWRsbmEKIwojIENvcHlyaWdodCAoYykgMjAxMSwgU2FzY2hhIFBlaWxpY2tlIDxzYXNjaHBlQGdteC5kZT4KIwojIEFsbCBtb2RpZmljYXRpb25zIGFuZCBhZGRpdGlvbnMgdG8gdGhlIGZpbGUgY29udHJpYnV0ZWQgYnkgdGhpcmQgcGFydGllcwojIHJlbWFpbiB0aGUgcHJvcGVydHkgb2YgdGhlaXIgY29weXJpZ2h0IG93bmVycywgdW5sZXNzIG90aGVyd2lzZSBhZ3JlZWQKIyB1cG9uLiBUaGUgbGljZW5zZSBmb3IgdGhpcyBmaWxlLCBhbmQgbW9kaWZpY2F0aW9ucyBhbmQgYWRkaXRpb25zIHRvIHRoZQojIGZpbGUsIGlzIHRoZSBzYW1lIGxpY2Vuc2UgYXMgZm9yIHRoZSBwcmlzdGluZSBwYWNrYWdlIGl0c2VsZiAodW5sZXNzIHRoZQojIGxpY2Vuc2UgZm9yIHRoZSBwcmlzdGluZSBwYWNrYWdlIGlzIG5vdCBhbiBPcGVuIFNvdXJjZSBMaWNlbnNlLCBpbiB3aGljaAojIGNhc2UgdGhlIGxpY2Vuc2UgaXMgdGhlIE1JVCBMaWNlbnNlKS4gQW4gIk9wZW4gU291cmNlIExpY2Vuc2UiIGlzIGEKIyBsaWNlbnNlIHRoYXQgY29uZm9ybXMgdG8gdGhlIE9wZW4gU291cmNlIERlZmluaXRpb24gKFZlcnNpb24gMS45KQojIHB1Ymxpc2hlZCBieSB0aGUgT3BlbiBTb3VyY2UgSW5pdGlhdGl2ZS4KCgpOYW1lOiAgICAgICAgICAgbGlidXBucDYKVmVyc2lvbjogICAgICAgIDEuNi4xMwpSZWxlYXNlOiAgICAgICAgMApTdW1tYXJ5OiAgICAgICAgUG9ydGFibGUgVW5pdmVyc2FsIFBsdWcgYW5kIFBsYXkgKFVQblApIFNESwpHcm91cDogICAgICAgICAgU3lzdGVtL0xpYnJhcmllcwpMaWNlbnNlOiAgICAgICAgQlNELTMtQ2xhdXNlClVybDogICAgICAgICAgICBodHRwOi8vc291cmNlZm9yZ2UubmV0L3Byb2plY3RzL3B1cG5wLwpTb3VyY2UwOiAgICAgICAgaHR0cDovL2Rvd25sb2Fkcy5zb3VyY2Vmb3JnZS5uZXQvcHVwbnAvbGlidXBucC0le3ZlcnNpb259LnRhci5iejIKQnVpbGRSb290OiAgICAgICV7X3RtcHBhdGh9LyV7bmFtZX0tJXt2ZXJzaW9ufS1idWlsZAoKJWRlc2NyaXB0aW9uClRoZSBwb3J0YWJsZSBVbml2ZXJzYWwgUGx1ZyBhbmQgUGxheSAoVVBuUCkgU0RLIHByb3ZpZGVzIHN1cHBvcnQgZm9yIGJ1aWxkaW5nClVQblAtY29tcGxpYW50IGNvbnRyb2wgcG9pbnRzLCBkZXZpY2VzLCBhbmQgYnJpZGdlcyBvbiBzZXZlcmFsIG9wZXJhdGluZwpzeXN0ZW1zLgoKJXBhY2thZ2UgLW4gbGlidXBucC1kZXZlbApTdW1tYXJ5OiAgICAgICAgUG9ydGFibGUgVW5pdmVyc2FsIFBsdWcgYW5kIFBsYXkgKFVQblApIFNESwpHcm91cDogICAgICAgICAgRGV2ZWxvcG1lbnQvTGlicmFyaWVzL0MgYW5kIEMrKwpQcm92aWRlczogICAgICAgcGtnY29uZmlnKGxpYnVwbnApClJlcXVpcmVzOiAgICAgICAle25hbWV9ID0gJXt2ZXJzaW9ufQoKJWRlc2NyaXB0aW9uIC1uIGxpYnVwbnAtZGV2ZWwKVGhlIHBvcnRhYmxlIFVuaXZlcnNhbCBQbHVnIGFuZCBQbGF5IChVUG5QKSBTREsgcHJvdmlkZXMgc3VwcG9ydCBmb3IgYnVpbGRpbmcKVVBuUC1jb21wbGlhbnQgY29udHJvbCBwb2ludHMsIGRldmljZXMsIGFuZCBicmlkZ2VzIG9uIHNldmVyYWwgb3BlcmF0aW5nCnN5c3RlbXMuCgolcHJlcAolc2V0dXAgLW4gbGlidXBucC0le3ZlcnNpb259CgolYnVpbGQKJWNvbmZpZ3VyZSAtLWRpc2FibGUtc3RhdGljCm1ha2UgJXs/X3NtcF9tZmxhZ3N9CgolaW5zdGFsbAolbWFrZWluc3RhbGwKZmluZCAle2J1aWxkcm9vdH0gLXR5cGUgZiAtbmFtZSAnKi5sYScgLWV4ZWMgcm0gLWYge30gJzsnCgolcG9zdCAtcCAvc2Jpbi9sZGNvbmZpZwoKJXBvc3R1biAtcCAvc2Jpbi9sZGNvbmZpZwoKJWZpbGVzCiVkZWZhdHRyKC0scm9vdCxyb290LC0pCiVkb2MgQ2hhbmdlTG9nIE5FV1MgUkVBRE1FIFRPRE8KJXtfbGliZGlyfS9saWJpeG1sLnNvLioKJXtfbGliZGlyfS9saWJ0aHJlYWR1dGlsLnNvLioKJXtfbGliZGlyfS9saWJ1cG5wLnNvLioKCiVmaWxlcyAtbiBsaWJ1cG5wLWRldmVsCiVkZWZhdHRyKC0scm9vdCxyb290LC0pCiV7X2xpYmRpcn0vcGtnY29uZmlnL2xpYnVwbnAucGMKJXtfbGliZGlyfS9saWJpeG1sLnNvCiV7X2xpYmRpcn0vbGlidGhyZWFkdXRpbC5zbwole19saWJkaXJ9L2xpYnVwbnAuc28KJXtfaW5jbHVkZWRpcn0vdXBucC8KCiVjaGFuZ2Vsb2c8L3RleHRhcmVhPjwvZGl2PgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlMiIpLCB7CiAgICAgICAgbW9kZToge25hbWU6ICJycG0tc3BlYyJ9LAogICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgICAgIGluZGVudFVuaXQ6IDQKICAgICAgfSk7CiAgICA8L3NjcmlwdD4KCiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC94LXJwbS1zcGVjPC9jb2RlPiwgPGNvZGU+dGV4dC94LXJwbS1jaGFuZ2VzPC9jb2RlPi48L3A+CjwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/rpm/rpm.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJycG0tY2hhbmdlcyIsIGZ1bmN0aW9uKCkgewogIHZhciBoZWFkZXJTZXBlcmF0b3IgPSAvXi0rJC87CiAgdmFyIGhlYWRlckxpbmUgPSAvXihNb258VHVlfFdlZHxUaHV8RnJpfFNhdHxTdW4pIChKYW58RmVifE1hcnxBcHJ8TWF5fEp1bnxKdWx8QXVnfFNlcHxPY3R8Tm92fERlYykgID9cZHsxLDJ9IFxkezJ9OlxkezJ9KDpcZHsyfSk/IFtBLVpdezMsNH0gXGR7NH0gLSAvOwogIHZhciBzaW1wbGVFbWFpbCA9IC9eW1x3Ky4tXStAW1x3Li1dKy87CgogIHJldHVybiB7CiAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtKSB7CiAgICAgIGlmIChzdHJlYW0uc29sKCkpIHsKICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKGhlYWRlclNlcGVyYXRvcikpIHsgcmV0dXJuICd0YWcnOyB9CiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaChoZWFkZXJMaW5lKSkgeyByZXR1cm4gJ3RhZyc7IH0KICAgICAgfQogICAgICBpZiAoc3RyZWFtLm1hdGNoKHNpbXBsZUVtYWlsKSkgeyByZXR1cm4gJ3N0cmluZyc7IH0KICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfTsKfSk7CgpDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveC1ycG0tY2hhbmdlcyIsICJycG0tY2hhbmdlcyIpOwoKLy8gUXVpY2sgYW5kIGRpcnR5IHNwZWMgZmlsZSBoaWdobGlnaHRpbmcKCkNvZGVNaXJyb3IuZGVmaW5lTW9kZSgicnBtLXNwZWMiLCBmdW5jdGlvbigpIHsKICB2YXIgYXJjaCA9IC9eKGkzODZ8aTU4NnxpNjg2fHg4Nl82NHxwcGM2NGxlfHBwYzY0fHBwY3xpYTY0fHMzOTB4fHMzOTB8c3BhcmM2NHxzcGFyY3Y5fHNwYXJjfG5vYXJjaHxhbHBoYWV2NnxhbHBoYXxocHBhfG1pcHNlbCkvOwoKICB2YXIgcHJlYW1ibGUgPSAvXlthLXpBLVowLTkoKV0rOi87CiAgdmFyIHNlY3Rpb24gPSAvXiUoZGVidWdfcGFja2FnZXxwYWNrYWdlfGRlc2NyaXB0aW9ufHByZXB8YnVpbGR8aW5zdGFsbHxmaWxlc3xjbGVhbnxjaGFuZ2Vsb2d8cHJlaW5zdGFsbHxwcmV1bnxwb3N0aW5zdGFsbHxwb3N0dW58cHJldHJhbnN8cG9zdHRyYW5zfHByZXxwb3N0fHRyaWdnZXJpbnx0cmlnZ2VydW58dmVyaWZ5c2NyaXB0fGNoZWNrfHRyaWdnZXJwb3N0dW58dHJpZ2dlcnByZWlufHRyaWdnZXIpLzsKICB2YXIgY29udHJvbF9mbG93X2NvbXBsZXggPSAvXiUoaWZuYXJjaHxpZmFyY2h8aWYpLzsgLy8gcnBtIGNvbnRyb2wgZmxvdyBtYWNyb3MKICB2YXIgY29udHJvbF9mbG93X3NpbXBsZSA9IC9eJShlbHNlfGVuZGlmKS87IC8vIHJwbSBjb250cm9sIGZsb3cgbWFjcm9zCiAgdmFyIG9wZXJhdG9ycyA9IC9eKFwhfFw/fFw8XD18XDx8XD5cPXxcPnxcPVw9fFwmXCZ8XHxcfCkvOyAvLyBvcGVyYXRvcnMgaW4gY29udHJvbCBmbG93IG1hY3JvcwoKICByZXR1cm4gewogICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24gKCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICBjb250cm9sRmxvdzogZmFsc2UsCiAgICAgICAgICBtYWNyb1BhcmFtZXRlcnM6IGZhbHNlLAogICAgICAgICAgc2VjdGlvbjogZmFsc2UKICAgICAgICB9OwogICAgfSwKICAgIHRva2VuOiBmdW5jdGlvbiAoc3RyZWFtLCBzdGF0ZSkgewogICAgICB2YXIgY2ggPSBzdHJlYW0ucGVlaygpOwogICAgICBpZiAoY2ggPT0gIiMiKSB7IHN0cmVhbS5za2lwVG9FbmQoKTsgcmV0dXJuICJjb21tZW50IjsgfQoKICAgICAgaWYgKHN0cmVhbS5zb2woKSkgewogICAgICAgIGlmIChzdHJlYW0ubWF0Y2gocHJlYW1ibGUpKSB7IHJldHVybiAiaGVhZGVyIjsgfQogICAgICAgIGlmIChzdHJlYW0ubWF0Y2goc2VjdGlvbikpIHsgcmV0dXJuICJhdG9tIjsgfQogICAgICB9CgogICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eXCRcdysvKSkgeyByZXR1cm4gImRlZiI7IH0gLy8gVmFyaWFibGVzIGxpa2UgJyRSUE1fQlVJTERfUk9PVCcKICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXlwkXHtcdytcfS8pKSB7IHJldHVybiAiZGVmIjsgfSAvLyBWYXJpYWJsZXMgbGlrZSAnJHtSUE1fQlVJTERfUk9PVH0nCgogICAgICBpZiAoc3RyZWFtLm1hdGNoKGNvbnRyb2xfZmxvd19zaW1wbGUpKSB7IHJldHVybiAia2V5d29yZCI7IH0KICAgICAgaWYgKHN0cmVhbS5tYXRjaChjb250cm9sX2Zsb3dfY29tcGxleCkpIHsKICAgICAgICBzdGF0ZS5jb250cm9sRmxvdyA9IHRydWU7CiAgICAgICAgcmV0dXJuICJrZXl3b3JkIjsKICAgICAgfQogICAgICBpZiAoc3RhdGUuY29udHJvbEZsb3cpIHsKICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKG9wZXJhdG9ycykpIHsgcmV0dXJuICJvcGVyYXRvciI7IH0KICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eKFxkKykvKSkgeyByZXR1cm4gIm51bWJlciI7IH0KICAgICAgICBpZiAoc3RyZWFtLmVvbCgpKSB7IHN0YXRlLmNvbnRyb2xGbG93ID0gZmFsc2U7IH0KICAgICAgfQoKICAgICAgaWYgKHN0cmVhbS5tYXRjaChhcmNoKSkgewogICAgICAgIGlmIChzdHJlYW0uZW9sKCkpIHsgc3RhdGUuY29udHJvbEZsb3cgPSBmYWxzZTsgfQogICAgICAgIHJldHVybiAibnVtYmVyIjsKICAgICAgfQoKICAgICAgLy8gTWFjcm9zIGxpa2UgJyVtYWtlX2luc3RhbGwnIG9yICclYXR0cigwNzc1LHJvb3Qscm9vdCknCiAgICAgIGlmIChzdHJlYW0ubWF0Y2goL14lW1x3XSsvKSkgewogICAgICAgIGlmIChzdHJlYW0ubWF0Y2goL15cKC8pKSB7IHN0YXRlLm1hY3JvUGFyYW1ldGVycyA9IHRydWU7IH0KICAgICAgICByZXR1cm4gImtleXdvcmQiOwogICAgICB9CiAgICAgIGlmIChzdGF0ZS5tYWNyb1BhcmFtZXRlcnMpIHsKICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eXGQrLykpIHsgcmV0dXJuICJudW1iZXIiO30KICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eXCkvKSkgewogICAgICAgICAgc3RhdGUubWFjcm9QYXJhbWV0ZXJzID0gZmFsc2U7CiAgICAgICAgICByZXR1cm4gImtleXdvcmQiOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gTWFjcm9zIGxpa2UgJyV7ZGVmaW5lZCBmZWRvcmF9JwogICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eJVx7XD8/W1x3IFwtXDpcIV0rXH0vKSkgewogICAgICAgIGlmIChzdHJlYW0uZW9sKCkpIHsgc3RhdGUuY29udHJvbEZsb3cgPSBmYWxzZTsgfQogICAgICAgIHJldHVybiAiZGVmIjsKICAgICAgfQoKICAgICAgLy9UT0RPOiBJbmNsdWRlIGJhc2ggc2NyaXB0IHN1Yi1wYXJzZXIgKENvZGVNaXJyb3Igc3VwcG9ydHMgdGhhdCkKICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfTsKfSk7CgpDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveC1ycG0tc3BlYyIsICJycG0tc3BlYyIpOwoKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/rst/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/rst/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogcmVTdHJ1Y3R1cmVkVGV4dCBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uLy4uL2FkZG9uL21vZGUvb3ZlcmxheS5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJyc3QuanMiPjwvc2NyaXB0Pgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPi5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazt9PC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aDE+Q29kZU1pcnJvcjwvaDE+PGltZyBpZD1sb2dvIHNyYz0iLi4vLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+TGFuZ3VhZ2UgbW9kZXM8L2E+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPnJlU3RydWN0dXJlZFRleHQ8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPnJlU3RydWN0dXJlZFRleHQgbW9kZTwvaDI+Cjxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+Ci4uIFRoaXMgaXMgYW4gZXhjZXJwdCBmcm9tIFNwaGlueCBkb2N1bWVudGF0aW9uOiBodHRwOi8vc3BoaW54LnBvY29vLm9yZy9fc291cmNlcy9yZXN0LnR4dAoKLi4gaGlnaGxpZ2h0bGFuZzo6IHJlc3QKCi4uIF9yc3QtcHJpbWVyOgoKcmVTdHJ1Y3R1cmVkVGV4dCBQcmltZXIKPT09PT09PT09PT09PT09PT09PT09PT0KClRoaXMgc2VjdGlvbiBpcyBhIGJyaWVmIGludHJvZHVjdGlvbiB0byByZVN0cnVjdHVyZWRUZXh0IChyZVNUKSBjb25jZXB0cyBhbmQKc3ludGF4LCBpbnRlbmRlZCB0byBwcm92aWRlIGF1dGhvcnMgd2l0aCBlbm91Z2ggaW5mb3JtYXRpb24gdG8gYXV0aG9yIGRvY3VtZW50cwpwcm9kdWN0aXZlbHkuICBTaW5jZSByZVNUIHdhcyBkZXNpZ25lZCB0byBiZSBhIHNpbXBsZSwgdW5vYnRydXNpdmUgbWFya3VwCmxhbmd1YWdlLCB0aGlzIHdpbGwgbm90IHRha2UgdG9vIGxvbmcuCgouLiBzZWVhbHNvOjoKCiAgIFRoZSBhdXRob3JpdGF0aXZlIGByZVN0cnVjdHVyZWRUZXh0IFVzZXIgRG9jdW1lbnRhdGlvbgogICAmbHQ7aHR0cDovL2RvY3V0aWxzLnNvdXJjZWZvcmdlLm5ldC9yc3QuaHRtbCZndDtgXy4gIFRoZSAicmVmIiBsaW5rcyBpbiB0aGlzCiAgIGRvY3VtZW50IGxpbmsgdG8gdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBpbmRpdmlkdWFsIGNvbnN0cnVjdHMgaW4gdGhlIHJlU1QKICAgcmVmZXJlbmNlLgoKClBhcmFncmFwaHMKLS0tLS0tLS0tLQoKVGhlIHBhcmFncmFwaCAoOmR1cmVmOmByZWYgJmx0O3BhcmFncmFwaHMmZ3Q7YCkgaXMgdGhlIG1vc3QgYmFzaWMgYmxvY2sgaW4gYSByZVNUCmRvY3VtZW50LiAgUGFyYWdyYXBocyBhcmUgc2ltcGx5IGNodW5rcyBvZiB0ZXh0IHNlcGFyYXRlZCBieSBvbmUgb3IgbW9yZSBibGFuawpsaW5lcy4gIEFzIGluIFB5dGhvbiwgaW5kZW50YXRpb24gaXMgc2lnbmlmaWNhbnQgaW4gcmVTVCwgc28gYWxsIGxpbmVzIG9mIHRoZQpzYW1lIHBhcmFncmFwaCBtdXN0IGJlIGxlZnQtYWxpZ25lZCB0byB0aGUgc2FtZSBsZXZlbCBvZiBpbmRlbnRhdGlvbi4KCgouLiBfaW5saW5lbWFya3VwOgoKSW5saW5lIG1hcmt1cAotLS0tLS0tLS0tLS0tCgpUaGUgc3RhbmRhcmQgcmVTVCBpbmxpbmUgbWFya3VwIGlzIHF1aXRlIHNpbXBsZTogdXNlCgoqIG9uZSBhc3RlcmlzazogYGAqdGV4dCpgYCBmb3IgZW1waGFzaXMgKGl0YWxpY3MpLAoqIHR3byBhc3Rlcmlza3M6IGBgKip0ZXh0KipgYCBmb3Igc3Ryb25nIGVtcGhhc2lzIChib2xkZmFjZSksIGFuZAoqIGJhY2txdW90ZXM6IGBgYGB0ZXh0YGBgYCBmb3IgY29kZSBzYW1wbGVzLgoKSWYgYXN0ZXJpc2tzIG9yIGJhY2txdW90ZXMgYXBwZWFyIGluIHJ1bm5pbmcgdGV4dCBhbmQgY291bGQgYmUgY29uZnVzZWQgd2l0aAppbmxpbmUgbWFya3VwIGRlbGltaXRlcnMsIHRoZXkgaGF2ZSB0byBiZSBlc2NhcGVkIHdpdGggYSBiYWNrc2xhc2guCgpCZSBhd2FyZSBvZiBzb21lIHJlc3RyaWN0aW9ucyBvZiB0aGlzIG1hcmt1cDoKCiogaXQgbWF5IG5vdCBiZSBuZXN0ZWQsCiogY29udGVudCBtYXkgbm90IHN0YXJ0IG9yIGVuZCB3aXRoIHdoaXRlc3BhY2U6IGBgKiB0ZXh0KmBgIGlzIHdyb25nLAoqIGl0IG11c3QgYmUgc2VwYXJhdGVkIGZyb20gc3Vycm91bmRpbmcgdGV4dCBieSBub24td29yZCBjaGFyYWN0ZXJzLiAgVXNlIGEKICBiYWNrc2xhc2ggZXNjYXBlZCBzcGFjZSB0byB3b3JrIGFyb3VuZCB0aGF0OiBgYHRoaXNpc1wgKm9uZSpcIHdvcmRgYC4KClRoZXNlIHJlc3RyaWN0aW9ucyBtYXkgYmUgbGlmdGVkIGluIGZ1dHVyZSB2ZXJzaW9ucyBvZiB0aGUgZG9jdXRpbHMuCgpyZVNUIGFsc28gYWxsb3dzIGZvciBjdXN0b20gImludGVycHJldGVkIHRleHQgcm9sZXMiJywgd2hpY2ggc2lnbmlmeSB0aGF0IHRoZQplbmNsb3NlZCB0ZXh0IHNob3VsZCBiZSBpbnRlcnByZXRlZCBpbiBhIHNwZWNpZmljIHdheS4gIFNwaGlueCB1c2VzIHRoaXMgdG8KcHJvdmlkZSBzZW1hbnRpYyBtYXJrdXAgYW5kIGNyb3NzLXJlZmVyZW5jaW5nIG9mIGlkZW50aWZpZXJzLCBhcyBkZXNjcmliZWQgaW4KdGhlIGFwcHJvcHJpYXRlIHNlY3Rpb24uICBUaGUgZ2VuZXJhbCBzeW50YXggaXMgYGA6cm9sZW5hbWU6YGNvbnRlbnRgYGAuCgpTdGFuZGFyZCByZVNUIHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcgcm9sZXM6CgoqIDpkdXJvbGU6YGVtcGhhc2lzYCAtLSBhbHRlcm5hdGUgc3BlbGxpbmcgZm9yIGBgKmVtcGhhc2lzKmBgCiogOmR1cm9sZTpgc3Ryb25nYCAtLSBhbHRlcm5hdGUgc3BlbGxpbmcgZm9yIGBgKipzdHJvbmcqKmBgCiogOmR1cm9sZTpgbGl0ZXJhbGAgLS0gYWx0ZXJuYXRlIHNwZWxsaW5nIGZvciBgYGBgbGl0ZXJhbGBgYGAKKiA6ZHVyb2xlOmBzdWJzY3JpcHRgIC0tIHN1YnNjcmlwdCB0ZXh0CiogOmR1cm9sZTpgc3VwZXJzY3JpcHRgIC0tIHN1cGVyc2NyaXB0IHRleHQKKiA6ZHVyb2xlOmB0aXRsZS1yZWZlcmVuY2VgIC0tIGZvciB0aXRsZXMgb2YgYm9va3MsIHBlcmlvZGljYWxzLCBhbmQgb3RoZXIKICBtYXRlcmlhbHMKClNlZSA6cmVmOmBpbmxpbmUtbWFya3VwYCBmb3Igcm9sZXMgYWRkZWQgYnkgU3BoaW54LgoKCkxpc3RzIGFuZCBRdW90ZS1saWtlIGJsb2NrcwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCkxpc3QgbWFya3VwICg6ZHVyZWY6YHJlZiAmbHQ7YnVsbGV0LWxpc3RzJmd0O2ApIGlzIG5hdHVyYWw6IGp1c3QgcGxhY2UgYW4gYXN0ZXJpc2sgYXQKdGhlIHN0YXJ0IG9mIGEgcGFyYWdyYXBoIGFuZCBpbmRlbnQgcHJvcGVybHkuICBUaGUgc2FtZSBnb2VzIGZvciBudW1iZXJlZCBsaXN0czsKdGhleSBjYW4gYWxzbyBiZSBhdXRvbnVtYmVyZWQgdXNpbmcgYSBgYCNgYCBzaWduOjoKCiAgICogVGhpcyBpcyBhIGJ1bGxldGVkIGxpc3QuCiAgICogSXQgaGFzIHR3byBpdGVtcywgdGhlIHNlY29uZAogICAgIGl0ZW0gdXNlcyB0d28gbGluZXMuCgogICAxLiBUaGlzIGlzIGEgbnVtYmVyZWQgbGlzdC4KICAgMi4gSXQgaGFzIHR3byBpdGVtcyB0b28uCgogICAjLiBUaGlzIGlzIGEgbnVtYmVyZWQgbGlzdC4KICAgIy4gSXQgaGFzIHR3byBpdGVtcyB0b28uCgoKTmVzdGVkIGxpc3RzIGFyZSBwb3NzaWJsZSwgYnV0IGJlIGF3YXJlIHRoYXQgdGhleSBtdXN0IGJlIHNlcGFyYXRlZCBmcm9tIHRoZQpwYXJlbnQgbGlzdCBpdGVtcyBieSBibGFuayBsaW5lczo6CgogICAqIHRoaXMgaXMKICAgKiBhIGxpc3QKCiAgICAgKiB3aXRoIGEgbmVzdGVkIGxpc3QKICAgICAqIGFuZCBzb21lIHN1Yml0ZW1zCgogICAqIGFuZCBoZXJlIHRoZSBwYXJlbnQgbGlzdCBjb250aW51ZXMKCkRlZmluaXRpb24gbGlzdHMgKDpkdXJlZjpgcmVmICZsdDtkZWZpbml0aW9uLWxpc3RzJmd0O2ApIGFyZSBjcmVhdGVkIGFzIGZvbGxvd3M6OgoKICAgdGVybSAodXAgdG8gYSBsaW5lIG9mIHRleHQpCiAgICAgIERlZmluaXRpb24gb2YgdGhlIHRlcm0sIHdoaWNoIG11c3QgYmUgaW5kZW50ZWQKCiAgICAgIGFuZCBjYW4gZXZlbiBjb25zaXN0IG9mIG11bHRpcGxlIHBhcmFncmFwaHMKCiAgIG5leHQgdGVybQogICAgICBEZXNjcmlwdGlvbi4KCk5vdGUgdGhhdCB0aGUgdGVybSBjYW5ub3QgaGF2ZSBtb3JlIHRoYW4gb25lIGxpbmUgb2YgdGV4dC4KClF1b3RlZCBwYXJhZ3JhcGhzICg6ZHVyZWY6YHJlZiAmbHQ7YmxvY2stcXVvdGVzJmd0O2ApIGFyZSBjcmVhdGVkIGJ5IGp1c3QgaW5kZW50aW5nCnRoZW0gbW9yZSB0aGFuIHRoZSBzdXJyb3VuZGluZyBwYXJhZ3JhcGhzLgoKTGluZSBibG9ja3MgKDpkdXJlZjpgcmVmICZsdDtsaW5lLWJsb2NrcyZndDtgKSBhcmUgYSB3YXkgb2YgcHJlc2VydmluZyBsaW5lIGJyZWFrczo6CgogICB8IFRoZXNlIGxpbmVzIGFyZQogICB8IGJyb2tlbiBleGFjdGx5IGxpa2UgaW4KICAgfCB0aGUgc291cmNlIGZpbGUuCgpUaGVyZSBhcmUgYWxzbyBzZXZlcmFsIG1vcmUgc3BlY2lhbCBibG9ja3MgYXZhaWxhYmxlOgoKKiBmaWVsZCBsaXN0cyAoOmR1cmVmOmByZWYgJmx0O2ZpZWxkLWxpc3RzJmd0O2ApCiogb3B0aW9uIGxpc3RzICg6ZHVyZWY6YHJlZiAmbHQ7b3B0aW9uLWxpc3RzJmd0O2ApCiogcXVvdGVkIGxpdGVyYWwgYmxvY2tzICg6ZHVyZWY6YHJlZiAmbHQ7cXVvdGVkLWxpdGVyYWwtYmxvY2tzJmd0O2ApCiogZG9jdGVzdCBibG9ja3MgKDpkdXJlZjpgcmVmICZsdDtkb2N0ZXN0LWJsb2NrcyZndDtgKQoKClNvdXJjZSBDb2RlCi0tLS0tLS0tLS0tCgpMaXRlcmFsIGNvZGUgYmxvY2tzICg6ZHVyZWY6YHJlZiAmbHQ7bGl0ZXJhbC1ibG9ja3MmZ3Q7YCkgYXJlIGludHJvZHVjZWQgYnkgZW5kaW5nIGEKcGFyYWdyYXBoIHdpdGggdGhlIHNwZWNpYWwgbWFya2VyIGBgOjpgYC4gIFRoZSBsaXRlcmFsIGJsb2NrIG11c3QgYmUgaW5kZW50ZWQKKGFuZCwgbGlrZSBhbGwgcGFyYWdyYXBocywgc2VwYXJhdGVkIGZyb20gdGhlIHN1cnJvdW5kaW5nIG9uZXMgYnkgYmxhbmsgbGluZXMpOjoKCiAgIFRoaXMgaXMgYSBub3JtYWwgdGV4dCBwYXJhZ3JhcGguIFRoZSBuZXh0IHBhcmFncmFwaCBpcyBhIGNvZGUgc2FtcGxlOjoKCiAgICAgIEl0IGlzIG5vdCBwcm9jZXNzZWQgaW4gYW55IHdheSwgZXhjZXB0CiAgICAgIHRoYXQgdGhlIGluZGVudGF0aW9uIGlzIHJlbW92ZWQuCgogICAgICBJdCBjYW4gc3BhbiBtdWx0aXBsZSBsaW5lcy4KCiAgIFRoaXMgaXMgYSBub3JtYWwgdGV4dCBwYXJhZ3JhcGggYWdhaW4uCgpUaGUgaGFuZGxpbmcgb2YgdGhlIGBgOjpgYCBtYXJrZXIgaXMgc21hcnQ6CgoqIElmIGl0IG9jY3VycyBhcyBhIHBhcmFncmFwaCBvZiBpdHMgb3duLCB0aGF0IHBhcmFncmFwaCBpcyBjb21wbGV0ZWx5IGxlZnQKICBvdXQgb2YgdGhlIGRvY3VtZW50LgoqIElmIGl0IGlzIHByZWNlZGVkIGJ5IHdoaXRlc3BhY2UsIHRoZSBtYXJrZXIgaXMgcmVtb3ZlZC4KKiBJZiBpdCBpcyBwcmVjZWRlZCBieSBub24td2hpdGVzcGFjZSwgdGhlIG1hcmtlciBpcyByZXBsYWNlZCBieSBhIHNpbmdsZQogIGNvbG9uLgoKVGhhdCB3YXksIHRoZSBzZWNvbmQgc2VudGVuY2UgaW4gdGhlIGFib3ZlIGV4YW1wbGUncyBmaXJzdCBwYXJhZ3JhcGggd291bGQgYmUKcmVuZGVyZWQgYXMgIlRoZSBuZXh0IHBhcmFncmFwaCBpcyBhIGNvZGUgc2FtcGxlOiIuCgoKLi4gX3JzdC10YWJsZXM6CgpUYWJsZXMKLS0tLS0tCgpUd28gZm9ybXMgb2YgdGFibGVzIGFyZSBzdXBwb3J0ZWQuICBGb3IgKmdyaWQgdGFibGVzKiAoOmR1cmVmOmByZWYKJmx0O2dyaWQtdGFibGVzJmd0O2ApLCB5b3UgaGF2ZSB0byAicGFpbnQiIHRoZSBjZWxsIGdyaWQgeW91cnNlbGYuICBUaGV5IGxvb2sgbGlrZQp0aGlzOjoKCiAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0rLS0tLS0tLS0tLSsKICAgfCBIZWFkZXIgcm93LCBjb2x1bW4gMSAgIHwgSGVhZGVyIDIgICB8IEhlYWRlciAzIHwgSGVhZGVyIDQgfAogICB8IChoZWFkZXIgcm93cyBvcHRpb25hbCkgfCAgICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICAgICB8CiAgICs9PT09PT09PT09PT09PT09PT09PT09PT0rPT09PT09PT09PT09Kz09PT09PT09PT0rPT09PT09PT09PSsKICAgfCBib2R5IHJvdyAxLCBjb2x1bW4gMSAgIHwgY29sdW1uIDIgICB8IGNvbHVtbiAzIHwgY29sdW1uIDQgfAogICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0tLS0rCiAgIHwgYm9keSByb3cgMiAgICAgICAgICAgICB8IC4uLiAgICAgICAgfCAuLi4gICAgICB8ICAgICAgICAgIHwKICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tLS0tKwoKKlNpbXBsZSB0YWJsZXMqICg6ZHVyZWY6YHJlZiAmbHQ7c2ltcGxlLXRhYmxlcyZndDtgKSBhcmUgZWFzaWVyIHRvIHdyaXRlLCBidXQKbGltaXRlZDogdGhleSBtdXN0IGNvbnRhaW4gbW9yZSB0aGFuIG9uZSByb3csIGFuZCB0aGUgZmlyc3QgY29sdW1uIGNhbm5vdApjb250YWluIG11bHRpcGxlIGxpbmVzLiAgVGhleSBsb29rIGxpa2UgdGhpczo6CgogICA9PT09PSAgPT09PT0gID09PT09PT0KICAgQSAgICAgIEIgICAgICBBIGFuZCBCCiAgID09PT09ICA9PT09PSAgPT09PT09PQogICBGYWxzZSAgRmFsc2UgIEZhbHNlCiAgIFRydWUgICBGYWxzZSAgRmFsc2UKICAgRmFsc2UgIFRydWUgICBGYWxzZQogICBUcnVlICAgVHJ1ZSAgIFRydWUKICAgPT09PT0gID09PT09ICA9PT09PT09CgoKSHlwZXJsaW5rcwotLS0tLS0tLS0tCgpFeHRlcm5hbCBsaW5rcwpeXl5eXl5eXl5eXl5eXgoKVXNlIGBgYExpbmsgdGV4dCAmbHQ7aHR0cDovL2V4YW1wbGUuY29tLyZndDtgX2BgIGZvciBpbmxpbmUgd2ViIGxpbmtzLiAgSWYgdGhlIGxpbmsKdGV4dCBzaG91bGQgYmUgdGhlIHdlYiBhZGRyZXNzLCB5b3UgZG9uJ3QgbmVlZCBzcGVjaWFsIG1hcmt1cCBhdCBhbGwsIHRoZSBwYXJzZXIKZmluZHMgbGlua3MgYW5kIG1haWwgYWRkcmVzc2VzIGluIG9yZGluYXJ5IHRleHQuCgpZb3UgY2FuIGFsc28gc2VwYXJhdGUgdGhlIGxpbmsgYW5kIHRoZSB0YXJnZXQgZGVmaW5pdGlvbiAoOmR1cmVmOmByZWYKJmx0O2h5cGVybGluay10YXJnZXRzJmd0O2ApLCBsaWtlIHRoaXM6OgoKICAgVGhpcyBpcyBhIHBhcmFncmFwaCB0aGF0IGNvbnRhaW5zIGBhIGxpbmtgXy4KCiAgIC4uIF9hIGxpbms6IGh0dHA6Ly9leGFtcGxlLmNvbS8KCgpJbnRlcm5hbCBsaW5rcwpeXl5eXl5eXl5eXl5eXgoKSW50ZXJuYWwgbGlua2luZyBpcyBkb25lIHZpYSBhIHNwZWNpYWwgcmVTVCByb2xlIHByb3ZpZGVkIGJ5IFNwaGlueCwgc2VlIHRoZQpzZWN0aW9uIG9uIHNwZWNpZmljIG1hcmt1cCwgOnJlZjpgcmVmLXJvbGVgLgoKClNlY3Rpb25zCi0tLS0tLS0tCgpTZWN0aW9uIGhlYWRlcnMgKDpkdXJlZjpgcmVmICZsdDtzZWN0aW9ucyZndDtgKSBhcmUgY3JlYXRlZCBieSB1bmRlcmxpbmluZyAoYW5kCm9wdGlvbmFsbHkgb3ZlcmxpbmluZykgdGhlIHNlY3Rpb24gdGl0bGUgd2l0aCBhIHB1bmN0dWF0aW9uIGNoYXJhY3RlciwgYXQgbGVhc3QKYXMgbG9uZyBhcyB0aGUgdGV4dDo6CgogICA9PT09PT09PT09PT09PT09PQogICBUaGlzIGlzIGEgaGVhZGluZwogICA9PT09PT09PT09PT09PT09PQoKTm9ybWFsbHksIHRoZXJlIGFyZSBubyBoZWFkaW5nIGxldmVscyBhc3NpZ25lZCB0byBjZXJ0YWluIGNoYXJhY3RlcnMgYXMgdGhlCnN0cnVjdHVyZSBpcyBkZXRlcm1pbmVkIGZyb20gdGhlIHN1Y2Nlc3Npb24gb2YgaGVhZGluZ3MuICBIb3dldmVyLCBmb3IgdGhlClB5dGhvbiBkb2N1bWVudGF0aW9uLCB0aGlzIGNvbnZlbnRpb24gaXMgdXNlZCB3aGljaCB5b3UgbWF5IGZvbGxvdzoKCiogYGAjYGAgd2l0aCBvdmVybGluZSwgZm9yIHBhcnRzCiogYGAqYGAgd2l0aCBvdmVybGluZSwgZm9yIGNoYXB0ZXJzCiogYGA9YGAsIGZvciBzZWN0aW9ucwoqIGBgLWBgLCBmb3Igc3Vic2VjdGlvbnMKKiBgYF5gYCwgZm9yIHN1YnN1YnNlY3Rpb25zCiogYGAiYGAsIGZvciBwYXJhZ3JhcGhzCgpPZiBjb3Vyc2UsIHlvdSBhcmUgZnJlZSB0byB1c2UgeW91ciBvd24gbWFya2VyIGNoYXJhY3RlcnMgKHNlZSB0aGUgcmVTVApkb2N1bWVudGF0aW9uKSwgYW5kIHVzZSBhIGRlZXBlciBuZXN0aW5nIGxldmVsLCBidXQga2VlcCBpbiBtaW5kIHRoYXQgbW9zdAp0YXJnZXQgZm9ybWF0cyAoSFRNTCwgTGFUZVgpIGhhdmUgYSBsaW1pdGVkIHN1cHBvcnRlZCBuZXN0aW5nIGRlcHRoLgoKCkV4cGxpY2l0IE1hcmt1cAotLS0tLS0tLS0tLS0tLS0KCiJFeHBsaWNpdCBtYXJrdXAiICg6ZHVyZWY6YHJlZiAmbHQ7ZXhwbGljaXQtbWFya3VwLWJsb2NrcyZndDtgKSBpcyB1c2VkIGluIHJlU1QgZm9yCm1vc3QgY29uc3RydWN0cyB0aGF0IG5lZWQgc3BlY2lhbCBoYW5kbGluZywgc3VjaCBhcyBmb290bm90ZXMsCnNwZWNpYWxseS1oaWdobGlnaHRlZCBwYXJhZ3JhcGhzLCBjb21tZW50cywgYW5kIGdlbmVyaWMgZGlyZWN0aXZlcy4KCkFuIGV4cGxpY2l0IG1hcmt1cCBibG9jayBiZWdpbnMgd2l0aCBhIGxpbmUgc3RhcnRpbmcgd2l0aCBgYC4uYGAgZm9sbG93ZWQgYnkKd2hpdGVzcGFjZSBhbmQgaXMgdGVybWluYXRlZCBieSB0aGUgbmV4dCBwYXJhZ3JhcGggYXQgdGhlIHNhbWUgbGV2ZWwgb2YKaW5kZW50YXRpb24uICAoVGhlcmUgbmVlZHMgdG8gYmUgYSBibGFuayBsaW5lIGJldHdlZW4gZXhwbGljaXQgbWFya3VwIGFuZCBub3JtYWwKcGFyYWdyYXBocy4gIFRoaXMgbWF5IGFsbCBzb3VuZCBhIGJpdCBjb21wbGljYXRlZCwgYnV0IGl0IGlzIGludHVpdGl2ZSBlbm91Z2gKd2hlbiB5b3Ugd3JpdGUgaXQuKQoKCi4uIF9kaXJlY3RpdmVzOgoKRGlyZWN0aXZlcwotLS0tLS0tLS0tCgpBIGRpcmVjdGl2ZSAoOmR1cmVmOmByZWYgJmx0O2RpcmVjdGl2ZXMmZ3Q7YCkgaXMgYSBnZW5lcmljIGJsb2NrIG9mIGV4cGxpY2l0IG1hcmt1cC4KQmVzaWRlcyByb2xlcywgaXQgaXMgb25lIG9mIHRoZSBleHRlbnNpb24gbWVjaGFuaXNtcyBvZiByZVNULCBhbmQgU3BoaW54IG1ha2VzCmhlYXZ5IHVzZSBvZiBpdC4KCkRvY3V0aWxzIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgZGlyZWN0aXZlczoKCiogQWRtb25pdGlvbnM6IDpkdWRpcjpgYXR0ZW50aW9uYCwgOmR1ZGlyOmBjYXV0aW9uYCwgOmR1ZGlyOmBkYW5nZXJgLAogIDpkdWRpcjpgZXJyb3JgLCA6ZHVkaXI6YGhpbnRgLCA6ZHVkaXI6YGltcG9ydGFudGAsIDpkdWRpcjpgbm90ZWAsCiAgOmR1ZGlyOmB0aXBgLCA6ZHVkaXI6YHdhcm5pbmdgIGFuZCB0aGUgZ2VuZXJpYyA6ZHVkaXI6YGFkbW9uaXRpb25gLgogIChNb3N0IHRoZW1lcyBzdHlsZSBvbmx5ICJub3RlIiBhbmQgIndhcm5pbmciIHNwZWNpYWxseS4pCgoqIEltYWdlczoKCiAgLSA6ZHVkaXI6YGltYWdlYCAoc2VlIGFsc28gSW1hZ2VzXyBiZWxvdykKICAtIDpkdWRpcjpgZmlndXJlYCAoYW4gaW1hZ2Ugd2l0aCBjYXB0aW9uIGFuZCBvcHRpb25hbCBsZWdlbmQpCgoqIEFkZGl0aW9uYWwgYm9keSBlbGVtZW50czoKCiAgLSA6ZHVkaXI6YGNvbnRlbnRzYCAoYSBsb2NhbCwgaS5lLiBmb3IgdGhlIGN1cnJlbnQgZmlsZSBvbmx5LCB0YWJsZSBvZgogICAgY29udGVudHMpCiAgLSA6ZHVkaXI6YGNvbnRhaW5lcmAgKGEgY29udGFpbmVyIHdpdGggYSBjdXN0b20gY2xhc3MsIHVzZWZ1bCB0byBnZW5lcmF0ZSBhbgogICAgb3V0ZXIgYGAmbHQ7ZGl2Jmd0O2BgIGluIEhUTUwpCiAgLSA6ZHVkaXI6YHJ1YnJpY2AgKGEgaGVhZGluZyB3aXRob3V0IHJlbGF0aW9uIHRvIHRoZSBkb2N1bWVudCBzZWN0aW9uaW5nKQogIC0gOmR1ZGlyOmB0b3BpY2AsIDpkdWRpcjpgc2lkZWJhcmAgKHNwZWNpYWwgaGlnaGxpZ2h0ZWQgYm9keSBlbGVtZW50cykKICAtIDpkdWRpcjpgcGFyc2VkLWxpdGVyYWxgIChsaXRlcmFsIGJsb2NrIHRoYXQgc3VwcG9ydHMgaW5saW5lIG1hcmt1cCkKICAtIDpkdWRpcjpgZXBpZ3JhcGhgIChhIGJsb2NrIHF1b3RlIHdpdGggb3B0aW9uYWwgYXR0cmlidXRpb24gbGluZSkKICAtIDpkdWRpcjpgaGlnaGxpZ2h0c2AsIDpkdWRpcjpgcHVsbC1xdW90ZWAgKGJsb2NrIHF1b3RlcyB3aXRoIHRoZWlyIG93bgogICAgY2xhc3MgYXR0cmlidXRlKQogIC0gOmR1ZGlyOmBjb21wb3VuZGAgKGEgY29tcG91bmQgcGFyYWdyYXBoKQoKKiBTcGVjaWFsIHRhYmxlczoKCiAgLSA6ZHVkaXI6YHRhYmxlYCAoYSB0YWJsZSB3aXRoIHRpdGxlKQogIC0gOmR1ZGlyOmBjc3YtdGFibGVgIChhIHRhYmxlIGdlbmVyYXRlZCBmcm9tIGNvbW1hLXNlcGFyYXRlZCB2YWx1ZXMpCiAgLSA6ZHVkaXI6YGxpc3QtdGFibGVgIChhIHRhYmxlIGdlbmVyYXRlZCBmcm9tIGEgbGlzdCBvZiBsaXN0cykKCiogU3BlY2lhbCBkaXJlY3RpdmVzOgoKICAtIDpkdWRpcjpgcmF3YCAoaW5jbHVkZSByYXcgdGFyZ2V0LWZvcm1hdCBtYXJrdXApCiAgLSA6ZHVkaXI6YGluY2x1ZGVgIChpbmNsdWRlIHJlU3RydWN0dXJlZFRleHQgZnJvbSBhbm90aGVyIGZpbGUpCiAgICAtLSBpbiBTcGhpbngsIHdoZW4gZ2l2ZW4gYW4gYWJzb2x1dGUgaW5jbHVkZSBmaWxlIHBhdGgsIHRoaXMgZGlyZWN0aXZlIHRha2VzCiAgICBpdCBhcyByZWxhdGl2ZSB0byB0aGUgc291cmNlIGRpcmVjdG9yeQogIC0gOmR1ZGlyOmBjbGFzc2AgKGFzc2lnbiBhIGNsYXNzIGF0dHJpYnV0ZSB0byB0aGUgbmV4dCBlbGVtZW50KSBbMV1fCgoqIEhUTUwgc3BlY2lmaWNzOgoKICAtIDpkdWRpcjpgbWV0YWAgKGdlbmVyYXRpb24gb2YgSFRNTCBgYCZsdDttZXRhJmd0O2BgIHRhZ3MpCiAgLSA6ZHVkaXI6YHRpdGxlYCAob3ZlcnJpZGUgZG9jdW1lbnQgdGl0bGUpCgoqIEluZmx1ZW5jaW5nIG1hcmt1cDoKCiAgLSA6ZHVkaXI6YGRlZmF1bHQtcm9sZWAgKHNldCBhIG5ldyBkZWZhdWx0IHJvbGUpCiAgLSA6ZHVkaXI6YHJvbGVgIChjcmVhdGUgYSBuZXcgcm9sZSkKCiAgU2luY2UgdGhlc2UgYXJlIG9ubHkgcGVyLWZpbGUsIGJldHRlciB1c2UgU3BoaW54JyBmYWNpbGl0aWVzIGZvciBzZXR0aW5nIHRoZQogIDpjb25mdmFsOmBkZWZhdWx0X3JvbGVgLgoKRG8gKm5vdCogdXNlIHRoZSBkaXJlY3RpdmVzIDpkdWRpcjpgc2VjdG51bWAsIDpkdWRpcjpgaGVhZGVyYCBhbmQKOmR1ZGlyOmBmb290ZXJgLgoKRGlyZWN0aXZlcyBhZGRlZCBieSBTcGhpbnggYXJlIGRlc2NyaWJlZCBpbiA6cmVmOmBzcGhpbnhtYXJrdXBgLgoKQmFzaWNhbGx5LCBhIGRpcmVjdGl2ZSBjb25zaXN0cyBvZiBhIG5hbWUsIGFyZ3VtZW50cywgb3B0aW9ucyBhbmQgY29udGVudC4gKEtlZXAKdGhpcyB0ZXJtaW5vbG9neSBpbiBtaW5kLCBpdCBpcyB1c2VkIGluIHRoZSBuZXh0IGNoYXB0ZXIgZGVzY3JpYmluZyBjdXN0b20KZGlyZWN0aXZlcy4pICBMb29raW5nIGF0IHRoaXMgZXhhbXBsZSwgOjoKCiAgIC4uIGZ1bmN0aW9uOjogZm9vKHgpCiAgICAgICAgICAgICAgICAgZm9vKHksIHopCiAgICAgIDptb2R1bGU6IHNvbWUubW9kdWxlLm5hbWUKCiAgICAgIFJldHVybiBhIGxpbmUgb2YgdGV4dCBpbnB1dCBmcm9tIHRoZSB1c2VyLgoKYGBmdW5jdGlvbmBgIGlzIHRoZSBkaXJlY3RpdmUgbmFtZS4gIEl0IGlzIGdpdmVuIHR3byBhcmd1bWVudHMgaGVyZSwgdGhlCnJlbWFpbmRlciBvZiB0aGUgZmlyc3QgbGluZSBhbmQgdGhlIHNlY29uZCBsaW5lLCBhcyB3ZWxsIGFzIG9uZSBvcHRpb24KYGBtb2R1bGVgYCAoYXMgeW91IGNhbiBzZWUsIG9wdGlvbnMgYXJlIGdpdmVuIGluIHRoZSBsaW5lcyBpbW1lZGlhdGVseSBmb2xsb3dpbmcKdGhlIGFyZ3VtZW50cyBhbmQgaW5kaWNhdGVkIGJ5IHRoZSBjb2xvbnMpLiAgT3B0aW9ucyBtdXN0IGJlIGluZGVudGVkIHRvIHRoZQpzYW1lIGxldmVsIGFzIHRoZSBkaXJlY3RpdmUgY29udGVudC4KClRoZSBkaXJlY3RpdmUgY29udGVudCBmb2xsb3dzIGFmdGVyIGEgYmxhbmsgbGluZSBhbmQgaXMgaW5kZW50ZWQgcmVsYXRpdmUgdG8gdGhlCmRpcmVjdGl2ZSBzdGFydC4KCgpJbWFnZXMKLS0tLS0tCgpyZVNUIHN1cHBvcnRzIGFuIGltYWdlIGRpcmVjdGl2ZSAoOmR1ZGlyOmByZWYgJmx0O2ltYWdlJmd0O2ApLCB1c2VkIGxpa2Ugc286OgoKICAgLi4gaW1hZ2U6OiBnbnUucG5nCiAgICAgIChvcHRpb25zKQoKV2hlbiB1c2VkIHdpdGhpbiBTcGhpbngsIHRoZSBmaWxlIG5hbWUgZ2l2ZW4gKGhlcmUgYGBnbnUucG5nYGApIG11c3QgZWl0aGVyIGJlCnJlbGF0aXZlIHRvIHRoZSBzb3VyY2UgZmlsZSwgb3IgYWJzb2x1dGUgd2hpY2ggbWVhbnMgdGhhdCB0aGV5IGFyZSByZWxhdGl2ZSB0bwp0aGUgdG9wIHNvdXJjZSBkaXJlY3RvcnkuICBGb3IgZXhhbXBsZSwgdGhlIGZpbGUgYGBza2V0Y2gvc3BhbS5yc3RgYCBjb3VsZCByZWZlcgp0byB0aGUgaW1hZ2UgYGBpbWFnZXMvc3BhbS5wbmdgYCBhcyBgYC4uL2ltYWdlcy9zcGFtLnBuZ2BgIG9yCmBgL2ltYWdlcy9zcGFtLnBuZ2BgLgoKU3BoaW54IHdpbGwgYXV0b21hdGljYWxseSBjb3B5IGltYWdlIGZpbGVzIG92ZXIgdG8gYSBzdWJkaXJlY3Rvcnkgb2YgdGhlIG91dHB1dApkaXJlY3Rvcnkgb24gYnVpbGRpbmcgKGUuZy4gdGhlIGBgX3N0YXRpY2BgIGRpcmVjdG9yeSBmb3IgSFRNTCBvdXRwdXQuKQoKSW50ZXJwcmV0YXRpb24gb2YgaW1hZ2Ugc2l6ZSBvcHRpb25zIChgYHdpZHRoYGAgYW5kIGBgaGVpZ2h0YGApIGlzIGFzIGZvbGxvd3M6CmlmIHRoZSBzaXplIGhhcyBubyB1bml0IG9yIHRoZSB1bml0IGlzIHBpeGVscywgdGhlIGdpdmVuIHNpemUgd2lsbCBvbmx5IGJlCnJlc3BlY3RlZCBmb3Igb3V0cHV0IGNoYW5uZWxzIHRoYXQgc3VwcG9ydCBwaXhlbHMgKGkuZS4gbm90IGluIExhVGVYIG91dHB1dCkuCk90aGVyIHVuaXRzIChsaWtlIGBgcHRgYCBmb3IgcG9pbnRzKSB3aWxsIGJlIHVzZWQgZm9yIEhUTUwgYW5kIExhVGVYIG91dHB1dC4KClNwaGlueCBleHRlbmRzIHRoZSBzdGFuZGFyZCBkb2N1dGlscyBiZWhhdmlvciBieSBhbGxvd2luZyBhbiBhc3RlcmlzayBmb3IgdGhlCmV4dGVuc2lvbjo6CgogICAuLiBpbWFnZTo6IGdudS4qCgpTcGhpbnggdGhlbiBzZWFyY2hlcyBmb3IgYWxsIGltYWdlcyBtYXRjaGluZyB0aGUgcHJvdmlkZWQgcGF0dGVybiBhbmQgZGV0ZXJtaW5lcwp0aGVpciB0eXBlLiAgRWFjaCBidWlsZGVyIHRoZW4gY2hvb3NlcyB0aGUgYmVzdCBpbWFnZSBvdXQgb2YgdGhlc2UgY2FuZGlkYXRlcy4KRm9yIGluc3RhbmNlLCBpZiB0aGUgZmlsZSBuYW1lIGBgZ251LipgYCB3YXMgZ2l2ZW4gYW5kIHR3byBmaWxlcyA6ZmlsZTpgZ251LnBkZmAKYW5kIDpmaWxlOmBnbnUucG5nYCBleGlzdGVkIGluIHRoZSBzb3VyY2UgdHJlZSwgdGhlIExhVGVYIGJ1aWxkZXIgd291bGQgY2hvb3NlCnRoZSBmb3JtZXIsIHdoaWxlIHRoZSBIVE1MIGJ1aWxkZXIgd291bGQgcHJlZmVyIHRoZSBsYXR0ZXIuCgouLiB2ZXJzaW9uY2hhbmdlZDo6IDAuNAogICBBZGRlZCB0aGUgc3VwcG9ydCBmb3IgZmlsZSBuYW1lcyBlbmRpbmcgaW4gYW4gYXN0ZXJpc2suCgouLiB2ZXJzaW9uY2hhbmdlZDo6IDAuNgogICBJbWFnZSBwYXRocyBjYW4gbm93IGJlIGFic29sdXRlLgoKCkZvb3Rub3RlcwotLS0tLS0tLS0KCkZvciBmb290bm90ZXMgKDpkdXJlZjpgcmVmICZsdDtmb290bm90ZXMmZ3Q7YCksIHVzZSBgYFsjbmFtZV1fYGAgdG8gbWFyayB0aGUgZm9vdG5vdGUKbG9jYXRpb24sIGFuZCBhZGQgdGhlIGZvb3Rub3RlIGJvZHkgYXQgdGhlIGJvdHRvbSBvZiB0aGUgZG9jdW1lbnQgYWZ0ZXIgYQoiRm9vdG5vdGVzIiBydWJyaWMgaGVhZGluZywgbGlrZSBzbzo6CgogICBMb3JlbSBpcHN1bSBbI2YxXV8gZG9sb3Igc2l0IGFtZXQgLi4uIFsjZjJdXwoKICAgLi4gcnVicmljOjogRm9vdG5vdGVzCgogICAuLiBbI2YxXSBUZXh0IG9mIHRoZSBmaXJzdCBmb290bm90ZS4KICAgLi4gWyNmMl0gVGV4dCBvZiB0aGUgc2Vjb25kIGZvb3Rub3RlLgoKWW91IGNhbiBhbHNvIGV4cGxpY2l0bHkgbnVtYmVyIHRoZSBmb290bm90ZXMgKGBgWzFdX2BgKSBvciB1c2UgYXV0by1udW1iZXJlZApmb290bm90ZXMgd2l0aG91dCBuYW1lcyAoYGBbI11fYGApLgoKCkNpdGF0aW9ucwotLS0tLS0tLS0KClN0YW5kYXJkIHJlU1QgY2l0YXRpb25zICg6ZHVyZWY6YHJlZiAmbHQ7Y2l0YXRpb25zJmd0O2ApIGFyZSBzdXBwb3J0ZWQsIHdpdGggdGhlCmFkZGl0aW9uYWwgZmVhdHVyZSB0aGF0IHRoZXkgYXJlICJnbG9iYWwiLCBpLmUuIGFsbCBjaXRhdGlvbnMgY2FuIGJlIHJlZmVyZW5jZWQKZnJvbSBhbGwgZmlsZXMuICBVc2UgdGhlbSBsaWtlIHNvOjoKCiAgIExvcmVtIGlwc3VtIFtSZWZdXyBkb2xvciBzaXQgYW1ldC4KCiAgIC4uIFtSZWZdIEJvb2sgb3IgYXJ0aWNsZSByZWZlcmVuY2UsIFVSTCBvciB3aGF0ZXZlci4KCkNpdGF0aW9uIHVzYWdlIGlzIHNpbWlsYXIgdG8gZm9vdG5vdGUgdXNhZ2UsIGJ1dCB3aXRoIGEgbGFiZWwgdGhhdCBpcyBub3QKbnVtZXJpYyBvciBiZWdpbnMgd2l0aCBgYCNgYC4KCgpTdWJzdGl0dXRpb25zCi0tLS0tLS0tLS0tLS0KCnJlU1Qgc3VwcG9ydHMgInN1YnN0aXR1dGlvbnMiICg6ZHVyZWY6YHJlZiAmbHQ7c3Vic3RpdHV0aW9uLWRlZmluaXRpb25zJmd0O2ApLCB3aGljaAphcmUgcGllY2VzIG9mIHRleHQgYW5kL29yIG1hcmt1cCByZWZlcnJlZCB0byBpbiB0aGUgdGV4dCBieSBgYHxuYW1lfGBgLiAgVGhleQphcmUgZGVmaW5lZCBsaWtlIGZvb3Rub3RlcyB3aXRoIGV4cGxpY2l0IG1hcmt1cCBibG9ja3MsIGxpa2UgdGhpczo6CgogICAuLiB8bmFtZXwgcmVwbGFjZTo6IHJlcGxhY2VtZW50ICp0ZXh0KgoKb3IgdGhpczo6CgogICAuLiB8Y2F1dGlvbnwgaW1hZ2U6OiB3YXJuaW5nLnBuZwogICAgICAgICAgICAgICAgOmFsdDogV2FybmluZyEKClNlZSB0aGUgOmR1cmVmOmByZVNUIHJlZmVyZW5jZSBmb3Igc3Vic3RpdHV0aW9ucyAmbHQ7c3Vic3RpdHV0aW9uLWRlZmluaXRpb25zJmd0O2AKZm9yIGRldGFpbHMuCgpJZiB5b3Ugd2FudCB0byB1c2Ugc29tZSBzdWJzdGl0dXRpb25zIGZvciBhbGwgZG9jdW1lbnRzLCBwdXQgdGhlbSBpbnRvCjpjb25mdmFsOmByc3RfcHJvbG9nYCBvciBwdXQgdGhlbSBpbnRvIGEgc2VwYXJhdGUgZmlsZSBhbmQgaW5jbHVkZSBpdCBpbnRvIGFsbApkb2N1bWVudHMgeW91IHdhbnQgdG8gdXNlIHRoZW0gaW4sIHVzaW5nIHRoZSA6cnN0OmRpcjpgaW5jbHVkZWAgZGlyZWN0aXZlLiAgKEJlCnN1cmUgdG8gZ2l2ZSB0aGUgaW5jbHVkZSBmaWxlIGEgZmlsZSBuYW1lIGV4dGVuc2lvbiBkaWZmZXJpbmcgZnJvbSB0aGF0IG9mIG90aGVyCnNvdXJjZSBmaWxlcywgdG8gYXZvaWQgU3BoaW54IGZpbmRpbmcgaXQgYXMgYSBzdGFuZGFsb25lIGRvY3VtZW50LikKClNwaGlueCBkZWZpbmVzIHNvbWUgZGVmYXVsdCBzdWJzdGl0dXRpb25zLCBzZWUgOnJlZjpgZGVmYXVsdC1zdWJzdGl0dXRpb25zYC4KCgpDb21tZW50cwotLS0tLS0tLQoKRXZlcnkgZXhwbGljaXQgbWFya3VwIGJsb2NrIHdoaWNoIGlzbid0IGEgdmFsaWQgbWFya3VwIGNvbnN0cnVjdCAobGlrZSB0aGUKZm9vdG5vdGVzIGFib3ZlKSBpcyByZWdhcmRlZCBhcyBhIGNvbW1lbnQgKDpkdXJlZjpgcmVmICZsdDtjb21tZW50cyZndDtgKS4gIEZvcgpleGFtcGxlOjoKCiAgIC4uIFRoaXMgaXMgYSBjb21tZW50LgoKWW91IGNhbiBpbmRlbnQgdGV4dCBhZnRlciBhIGNvbW1lbnQgc3RhcnQgdG8gZm9ybSBtdWx0aWxpbmUgY29tbWVudHM6OgoKICAgLi4KICAgICAgVGhpcyB3aG9sZSBpbmRlbnRlZCBibG9jawogICAgICBpcyBhIGNvbW1lbnQuCgogICAgICBTdGlsbCBpbiB0aGUgY29tbWVudC4KCgpTb3VyY2UgZW5jb2RpbmcKLS0tLS0tLS0tLS0tLS0tCgpTaW5jZSB0aGUgZWFzaWVzdCB3YXkgdG8gaW5jbHVkZSBzcGVjaWFsIGNoYXJhY3RlcnMgbGlrZSBlbSBkYXNoZXMgb3IgY29weXJpZ2h0CnNpZ25zIGluIHJlU1QgaXMgdG8gZGlyZWN0bHkgd3JpdGUgdGhlbSBhcyBVbmljb2RlIGNoYXJhY3RlcnMsIG9uZSBoYXMgdG8Kc3BlY2lmeSBhbiBlbmNvZGluZy4gIFNwaGlueCBhc3N1bWVzIHNvdXJjZSBmaWxlcyB0byBiZSBlbmNvZGVkIGluIFVURi04IGJ5CmRlZmF1bHQ7IHlvdSBjYW4gY2hhbmdlIHRoaXMgd2l0aCB0aGUgOmNvbmZ2YWw6YHNvdXJjZV9lbmNvZGluZ2AgY29uZmlnIHZhbHVlLgoKCkdvdGNoYXMKLS0tLS0tLQoKVGhlcmUgYXJlIHNvbWUgcHJvYmxlbXMgb25lIGNvbW1vbmx5IHJ1bnMgaW50byB3aGlsZSBhdXRob3JpbmcgcmVTVCBkb2N1bWVudHM6CgoqICoqU2VwYXJhdGlvbiBvZiBpbmxpbmUgbWFya3VwOioqIEFzIHNhaWQgYWJvdmUsIGlubGluZSBtYXJrdXAgc3BhbnMgbXVzdCBiZQogIHNlcGFyYXRlZCBmcm9tIHRoZSBzdXJyb3VuZGluZyB0ZXh0IGJ5IG5vbi13b3JkIGNoYXJhY3RlcnMsIHlvdSBoYXZlIHRvIHVzZSBhCiAgYmFja3NsYXNoLWVzY2FwZWQgc3BhY2UgdG8gZ2V0IGFyb3VuZCB0aGF0LiAgU2VlIGB0aGUgcmVmZXJlbmNlCiAgJmx0O2h0dHA6Ly9kb2N1dGlscy5zZi5uZXQvZG9jcy9yZWYvcnN0L3Jlc3RydWN0dXJlZHRleHQuaHRtbCNpbmxpbmUtbWFya3VwJmd0O2BfCiAgZm9yIHRoZSBkZXRhaWxzLgoKKiAqKk5vIG5lc3RlZCBpbmxpbmUgbWFya3VwOioqIFNvbWV0aGluZyBsaWtlIGBgKnNlZSA6ZnVuYzpgZm9vYCpgYCBpcyBub3QKICBwb3NzaWJsZS4KCgouLiBydWJyaWM6OiBGb290bm90ZXMKCi4uIFsxXSBXaGVuIHRoZSBkZWZhdWx0IGRvbWFpbiBjb250YWlucyBhIDpyc3Q6ZGlyOmBjbGFzc2AgZGlyZWN0aXZlLCB0aGlzIGRpcmVjdGl2ZQogICAgICAgd2lsbCBiZSBzaGFkb3dlZC4gIFRoZXJlZm9yZSwgU3BoaW54IHJlLWV4cG9ydHMgaXQgYXMgOnJzdDpkaXI6YHJzdC1jbGFzc2AuCjwvdGV4dGFyZWE+PC9mb3JtPgoKICAgIDxzY3JpcHQ+CiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICAgICAgbGluZU51bWJlcnM6IHRydWUsCiAgICAgIH0pOwogICAgPC9zY3JpcHQ+CiAgICA8cD4KICAgICAgICBUaGUgPGNvZGU+cHl0aG9uPC9jb2RlPiBtb2RlIHdpbGwgYmUgdXNlZCBmb3IgaGlnaGxpZ2h0aW5nIGJsb2NrcwogICAgICAgIGNvbnRhaW5pbmcgUHl0aG9uL0lQeXRob24gdGVybWluYWwgc2Vzc2lvbnM6IGJsb2NrcyBzdGFydGluZyB3aXRoCiAgICAgICAgPGNvZGU+Jmd0OyZndDsmZ3Q7PC9jb2RlPiAoZm9yIFB5dGhvbikgb3IgPGNvZGU+SW4gW251bV06PC9jb2RlPiAoZm9yCiAgICAgICAgSVB5dGhvbikuCgogICAgICAgIEZ1cnRoZXIsIHRoZSA8Y29kZT5zdGV4PC9jb2RlPiBtb2RlIHdpbGwgYmUgdXNlZCBmb3IgaGlnaGxpZ2h0aW5nCiAgICAgICAgYmxvY2tzIGNvbnRhaW5pbmcgTGFUZXggY29kZS4KICAgIDwvcD4KCiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC94LXJzdDwvY29kZT4uPC9wPgogIDwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/rst/rst.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSwgcmVxdWlyZSgiLi4vcHl0aG9uL3B5dGhvbiIpLCByZXF1aXJlKCIuLi9zdGV4L3N0ZXgiKSwgcmVxdWlyZSgiLi4vLi4vYWRkb24vbW9kZS9vdmVybGF5IikpOwogIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kKSAvLyBBTUQKICAgIGRlZmluZShbIi4uLy4uL2xpYi9jb2RlbWlycm9yIiwgIi4uL3B5dGhvbi9weXRob24iLCAiLi4vc3RleC9zdGV4IiwgIi4uLy4uL2FkZG9uL21vZGUvb3ZlcmxheSJdLCBtb2QpOwogIGVsc2UgLy8gUGxhaW4gYnJvd3NlciBlbnYKICAgIG1vZChDb2RlTWlycm9yKTsKfSkoZnVuY3Rpb24oQ29kZU1pcnJvcikgewoidXNlIHN0cmljdCI7CgpDb2RlTWlycm9yLmRlZmluZU1vZGUoJ3JzdCcsIGZ1bmN0aW9uIChjb25maWcsIG9wdGlvbnMpIHsKCiAgdmFyIHJ4X3N0cm9uZyA9IC9eXCpcKlteXCpcc10oPzpbXlwqXSpbXlwqXHNdKT9cKlwqLzsKICB2YXIgcnhfZW1waGFzaXMgPSAvXlwqW15cKlxzXSg/OlteXCpdKlteXCpcc10pP1wqLzsKICB2YXIgcnhfbGl0ZXJhbCA9IC9eYGBbXmBcc10oPzpbXmBdKlteYFxzXSlgYC87CgogIHZhciByeF9udW1iZXIgPSAvXig/OltcZF0rKD86W1wuLF1cZCspKikvOwogIHZhciByeF9wb3NpdGl2ZSA9IC9eKD86XHNcK1tcZF0rKD86W1wuLF1cZCspKikvOwogIHZhciByeF9uZWdhdGl2ZSA9IC9eKD86XHNcLVtcZF0rKD86W1wuLF1cZCspKikvOwoKICB2YXIgcnhfdXJpX3Byb3RvY29sID0gIltIaF1bVHRdW1R0XVtQcF1bU3NdPzovLyI7CiAgdmFyIHJ4X3VyaV9kb21haW4gPSAiKD86W1xcZFxcdy4tXSspXFwuKD86XFx3ezIsNn0pIjsKICB2YXIgcnhfdXJpX3BhdGggPSAiKD86L1tcXGRcXHdcXCNcXCVcXCZcXC1cXC5cXCxcXC9cXDpcXD1cXD9cXH5dKykqIjsKICB2YXIgcnhfdXJpID0gbmV3IFJlZ0V4cCgiXiIgKyByeF91cmlfcHJvdG9jb2wgKyByeF91cmlfZG9tYWluICsgcnhfdXJpX3BhdGgpOwoKICB2YXIgb3ZlcmxheSA9IHsKICAgIHRva2VuOiBmdW5jdGlvbiAoc3RyZWFtKSB7CgogICAgICBpZiAoc3RyZWFtLm1hdGNoKHJ4X3N0cm9uZykgJiYgc3RyZWFtLm1hdGNoICgvXFcrfCQvLCBmYWxzZSkpCiAgICAgICAgcmV0dXJuICdzdHJvbmcnOwogICAgICBpZiAoc3RyZWFtLm1hdGNoKHJ4X2VtcGhhc2lzKSAmJiBzdHJlYW0ubWF0Y2ggKC9cVyt8JC8sIGZhbHNlKSkKICAgICAgICByZXR1cm4gJ2VtJzsKICAgICAgaWYgKHN0cmVhbS5tYXRjaChyeF9saXRlcmFsKSAmJiBzdHJlYW0ubWF0Y2ggKC9cVyt8JC8sIGZhbHNlKSkKICAgICAgICByZXR1cm4gJ3N0cmluZy0yJzsKICAgICAgaWYgKHN0cmVhbS5tYXRjaChyeF9udW1iZXIpKQogICAgICAgIHJldHVybiAnbnVtYmVyJzsKICAgICAgaWYgKHN0cmVhbS5tYXRjaChyeF9wb3NpdGl2ZSkpCiAgICAgICAgcmV0dXJuICdwb3NpdGl2ZSc7CiAgICAgIGlmIChzdHJlYW0ubWF0Y2gocnhfbmVnYXRpdmUpKQogICAgICAgIHJldHVybiAnbmVnYXRpdmUnOwogICAgICBpZiAoc3RyZWFtLm1hdGNoKHJ4X3VyaSkpCiAgICAgICAgcmV0dXJuICdsaW5rJzsKCiAgICAgIHdoaWxlIChzdHJlYW0ubmV4dCgpICE9IG51bGwpIHsKICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKHJ4X3N0cm9uZywgZmFsc2UpKSBicmVhazsKICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKHJ4X2VtcGhhc2lzLCBmYWxzZSkpIGJyZWFrOwogICAgICAgIGlmIChzdHJlYW0ubWF0Y2gocnhfbGl0ZXJhbCwgZmFsc2UpKSBicmVhazsKICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKHJ4X251bWJlciwgZmFsc2UpKSBicmVhazsKICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKHJ4X3Bvc2l0aXZlLCBmYWxzZSkpIGJyZWFrOwogICAgICAgIGlmIChzdHJlYW0ubWF0Y2gocnhfbmVnYXRpdmUsIGZhbHNlKSkgYnJlYWs7CiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaChyeF91cmksIGZhbHNlKSkgYnJlYWs7CiAgICAgIH0KCiAgICAgIHJldHVybiBudWxsOwogICAgfQogIH07CgogIHZhciBtb2RlID0gQ29kZU1pcnJvci5nZXRNb2RlKAogICAgY29uZmlnLCBvcHRpb25zLmJhY2tkcm9wIHx8ICdyc3QtYmFzZScKICApOwoKICByZXR1cm4gQ29kZU1pcnJvci5vdmVybGF5TW9kZShtb2RlLCBvdmVybGF5LCB0cnVlKTsgLy8gY29tYmluZQp9LCAncHl0aG9uJywgJ3N0ZXgnKTsKCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCdyc3QtYmFzZScsIGZ1bmN0aW9uIChjb25maWcpIHsKCiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogIGZ1bmN0aW9uIGZvcm1hdChzdHJpbmcpIHsKICAgIHZhciBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSgveyhcZCspfS9nLCBmdW5jdGlvbiAobWF0Y2gsIG4pIHsKICAgICAgcmV0dXJuIHR5cGVvZiBhcmdzW25dICE9ICd1bmRlZmluZWQnID8gYXJnc1tuXSA6IG1hdGNoOwogICAgfSk7CiAgfQoKICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgdmFyIG1vZGVfcHl0aG9uID0gQ29kZU1pcnJvci5nZXRNb2RlKGNvbmZpZywgJ3B5dGhvbicpOwogIHZhciBtb2RlX3N0ZXggPSBDb2RlTWlycm9yLmdldE1vZGUoY29uZmlnLCAnc3RleCcpOwoKICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgdmFyIFNFUEEgPSAiXFxzKyI7CiAgdmFyIFRBSUwgPSAiKD86XFxzKnxcXFd8JCkiLAogIHJ4X1RBSUwgPSBuZXcgUmVnRXhwKGZvcm1hdCgnXnswfScsIFRBSUwpKTsKCiAgdmFyIE5BTUUgPQogICAgIig/OlteXFxXXFxkX10oPzpbXFx3IVwiIyQlJicoKVxcKlxcKyxcXC1cXC5cLzo7PD0+XFw/XSpbXlxcV19dKT8pIiwKICByeF9OQU1FID0gbmV3IFJlZ0V4cChmb3JtYXQoJ157MH0nLCBOQU1FKSk7CiAgdmFyIE5BTUVfV1dTID0KICAgICIoPzpbXlxcV1xcZF9dKD86W1xcd1xccyFcIiMkJSYnKClcXCpcXCssXFwtXFwuXC86Ozw9PlxcP10qW15cXFdfXSk/KSI7CiAgdmFyIFJFRl9OQU1FID0gZm9ybWF0KCcoPzp7MH18YHsxfWApJywgTkFNRSwgTkFNRV9XV1MpOwoKICB2YXIgVEVYVDEgPSAiKD86W15cXHNcXHxdKD86W15cXHxdKlteXFxzXFx8XSk/KSI7CiAgdmFyIFRFWFQyID0gIig/OlteXFxgXSspIiwKICByeF9URVhUMiA9IG5ldyBSZWdFeHAoZm9ybWF0KCdeezB9JywgVEVYVDIpKTsKCiAgdmFyIHJ4X3NlY3Rpb24gPSBuZXcgUmVnRXhwKAogICAgIl4oWyEnIyQlJlwiKCkqKywtLi86Ozw9Pj9AXFxbXFxcXFxcXV5fYHt8fX5dKVxcMXszLH1cXHMqJCIpOwogIHZhciByeF9leHBsaWNpdCA9IG5ldyBSZWdFeHAoCiAgICBmb3JtYXQoJ15cXC5cXC57MH0nLCBTRVBBKSk7CiAgdmFyIHJ4X2xpbmsgPSBuZXcgUmVnRXhwKAogICAgZm9ybWF0KCdeX3swfTp7MX18Xl9fOnsxfScsIFJFRl9OQU1FLCBUQUlMKSk7CiAgdmFyIHJ4X2RpcmVjdGl2ZSA9IG5ldyBSZWdFeHAoCiAgICBmb3JtYXQoJ157MH06OnsxfScsIFJFRl9OQU1FLCBUQUlMKSk7CiAgdmFyIHJ4X3N1YnN0aXR1dGlvbiA9IG5ldyBSZWdFeHAoCiAgICBmb3JtYXQoJ15cXHx7MH1cXHx7MX17Mn06OnszfScsIFRFWFQxLCBTRVBBLCBSRUZfTkFNRSwgVEFJTCkpOwogIHZhciByeF9mb290bm90ZSA9IG5ldyBSZWdFeHAoCiAgICBmb3JtYXQoJ15cXFsoPzpcXGQrfCN7MH0/fFxcKildezF9JywgUkVGX05BTUUsIFRBSUwpKTsKICB2YXIgcnhfY2l0YXRpb24gPSBuZXcgUmVnRXhwKAogICAgZm9ybWF0KCdeXFxbezB9XFxdezF9JywgUkVGX05BTUUsIFRBSUwpKTsKCiAgdmFyIHJ4X3N1YnN0aXR1dGlvbl9yZWYgPSBuZXcgUmVnRXhwKAogICAgZm9ybWF0KCdeXFx8ezB9XFx8JywgVEVYVDEpKTsKICB2YXIgcnhfZm9vdG5vdGVfcmVmID0gbmV3IFJlZ0V4cCgKICAgIGZvcm1hdCgnXlxcWyg/OlxcZCt8I3swfT98XFwqKV1fJywgUkVGX05BTUUpKTsKICB2YXIgcnhfY2l0YXRpb25fcmVmID0gbmV3IFJlZ0V4cCgKICAgIGZvcm1hdCgnXlxcW3swfVxcXV8nLCBSRUZfTkFNRSkpOwogIHZhciByeF9saW5rX3JlZjEgPSBuZXcgUmVnRXhwKAogICAgZm9ybWF0KCdeezB9X18/JywgUkVGX05BTUUpKTsKICB2YXIgcnhfbGlua19yZWYyID0gbmV3IFJlZ0V4cCgKICAgIGZvcm1hdCgnXmB7MH1gXycsIFRFWFQyKSk7CgogIHZhciByeF9yb2xlX3ByZSA9IG5ldyBSZWdFeHAoCiAgICBmb3JtYXQoJ146ezB9OmB7MX1gezJ9JywgTkFNRSwgVEVYVDIsIFRBSUwpKTsKICB2YXIgcnhfcm9sZV9zdWYgPSBuZXcgUmVnRXhwKAogICAgZm9ybWF0KCdeYHsxfWA6ezB9OnsyfScsIE5BTUUsIFRFWFQyLCBUQUlMKSk7CiAgdmFyIHJ4X3JvbGUgPSBuZXcgUmVnRXhwKAogICAgZm9ybWF0KCdeOnswfTp7MX0nLCBOQU1FLCBUQUlMKSk7CgogIHZhciByeF9kaXJlY3RpdmVfbmFtZSA9IG5ldyBSZWdFeHAoZm9ybWF0KCdeezB9JywgUkVGX05BTUUpKTsKICB2YXIgcnhfZGlyZWN0aXZlX3RhaWwgPSBuZXcgUmVnRXhwKGZvcm1hdCgnXjo6ezB9JywgVEFJTCkpOwogIHZhciByeF9zdWJzdGl0dXRpb25fdGV4dCA9IG5ldyBSZWdFeHAoZm9ybWF0KCdeXFx8ezB9XFx8JywgVEVYVDEpKTsKICB2YXIgcnhfc3Vic3RpdHV0aW9uX3NlcGEgPSBuZXcgUmVnRXhwKGZvcm1hdCgnXnswfScsIFNFUEEpKTsKICB2YXIgcnhfc3Vic3RpdHV0aW9uX25hbWUgPSBuZXcgUmVnRXhwKGZvcm1hdCgnXnswfScsIFJFRl9OQU1FKSk7CiAgdmFyIHJ4X3N1YnN0aXR1dGlvbl90YWlsID0gbmV3IFJlZ0V4cChmb3JtYXQoJ146OnswfScsIFRBSUwpKTsKICB2YXIgcnhfbGlua19oZWFkID0gbmV3IFJlZ0V4cCgiXl8iKTsKICB2YXIgcnhfbGlua19uYW1lID0gbmV3IFJlZ0V4cChmb3JtYXQoJ157MH18XycsIFJFRl9OQU1FKSk7CiAgdmFyIHJ4X2xpbmtfdGFpbCA9IG5ldyBSZWdFeHAoZm9ybWF0KCdeOnswfScsIFRBSUwpKTsKCiAgdmFyIHJ4X3ZlcmJhdGltID0gbmV3IFJlZ0V4cCgnXjo6XFxzKiQnKTsKICB2YXIgcnhfZXhhbXBsZXMgPSBuZXcgUmVnRXhwKCdeXFxzKyg/Oj4+PnxJbiBcXFtcXGQrXFxdOilcXHMnKTsKCiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogIGZ1bmN0aW9uIHRvX25vcm1hbChzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgdG9rZW4gPSBudWxsOwoKICAgIGlmIChzdHJlYW0uc29sKCkgJiYgc3RyZWFtLm1hdGNoKHJ4X2V4YW1wbGVzLCBmYWxzZSkpIHsKICAgICAgY2hhbmdlKHN0YXRlLCB0b19tb2RlLCB7CiAgICAgICAgbW9kZTogbW9kZV9weXRob24sIGxvY2FsOiBDb2RlTWlycm9yLnN0YXJ0U3RhdGUobW9kZV9weXRob24pCiAgICAgIH0pOwogICAgfSBlbHNlIGlmIChzdHJlYW0uc29sKCkgJiYgc3RyZWFtLm1hdGNoKHJ4X2V4cGxpY2l0KSkgewogICAgICBjaGFuZ2Uoc3RhdGUsIHRvX2V4cGxpY2l0KTsKICAgICAgdG9rZW4gPSAnbWV0YSc7CiAgICB9IGVsc2UgaWYgKHN0cmVhbS5zb2woKSAmJiBzdHJlYW0ubWF0Y2gocnhfc2VjdGlvbikpIHsKICAgICAgY2hhbmdlKHN0YXRlLCB0b19ub3JtYWwpOwogICAgICB0b2tlbiA9ICdoZWFkZXInOwogICAgfSBlbHNlIGlmIChwaGFzZShzdGF0ZSkgPT0gcnhfcm9sZV9wcmUgfHwKICAgICAgICAgICAgICAgc3RyZWFtLm1hdGNoKHJ4X3JvbGVfcHJlLCBmYWxzZSkpIHsKCiAgICAgIHN3aXRjaCAoc3RhZ2Uoc3RhdGUpKSB7CiAgICAgIGNhc2UgMDoKICAgICAgICBjaGFuZ2Uoc3RhdGUsIHRvX25vcm1hbCwgY29udGV4dChyeF9yb2xlX3ByZSwgMSkpOwogICAgICAgIHN0cmVhbS5tYXRjaCgvXjovKTsKICAgICAgICB0b2tlbiA9ICdtZXRhJzsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAxOgogICAgICAgIGNoYW5nZShzdGF0ZSwgdG9fbm9ybWFsLCBjb250ZXh0KHJ4X3JvbGVfcHJlLCAyKSk7CiAgICAgICAgc3RyZWFtLm1hdGNoKHJ4X05BTUUpOwogICAgICAgIHRva2VuID0gJ2tleXdvcmQnOwoKICAgICAgICBpZiAoc3RyZWFtLmN1cnJlbnQoKS5tYXRjaCgvXig/Om1hdGh8bGF0ZXgpLykpIHsKICAgICAgICAgIHN0YXRlLnRtcF9zdGV4ID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgMjoKICAgICAgICBjaGFuZ2Uoc3RhdGUsIHRvX25vcm1hbCwgY29udGV4dChyeF9yb2xlX3ByZSwgMykpOwogICAgICAgIHN0cmVhbS5tYXRjaCgvXjpgLyk7CiAgICAgICAgdG9rZW4gPSAnbWV0YSc7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgMzoKICAgICAgICBpZiAoc3RhdGUudG1wX3N0ZXgpIHsKICAgICAgICAgIHN0YXRlLnRtcF9zdGV4ID0gdW5kZWZpbmVkOyBzdGF0ZS50bXAgPSB7CiAgICAgICAgICAgIG1vZGU6IG1vZGVfc3RleCwgbG9jYWw6IENvZGVNaXJyb3Iuc3RhcnRTdGF0ZShtb2RlX3N0ZXgpCiAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgaWYgKHN0YXRlLnRtcCkgewogICAgICAgICAgaWYgKHN0cmVhbS5wZWVrKCkgPT0gJ2AnKSB7CiAgICAgICAgICAgIGNoYW5nZShzdGF0ZSwgdG9fbm9ybWFsLCBjb250ZXh0KHJ4X3JvbGVfcHJlLCA0KSk7CiAgICAgICAgICAgIHN0YXRlLnRtcCA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CgogICAgICAgICAgdG9rZW4gPSBzdGF0ZS50bXAubW9kZS50b2tlbihzdHJlYW0sIHN0YXRlLnRtcC5sb2NhbCk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIGNoYW5nZShzdGF0ZSwgdG9fbm9ybWFsLCBjb250ZXh0KHJ4X3JvbGVfcHJlLCA0KSk7CiAgICAgICAgc3RyZWFtLm1hdGNoKHJ4X1RFWFQyKTsKICAgICAgICB0b2tlbiA9ICdzdHJpbmcnOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDQ6CiAgICAgICAgY2hhbmdlKHN0YXRlLCB0b19ub3JtYWwsIGNvbnRleHQocnhfcm9sZV9wcmUsIDUpKTsKICAgICAgICBzdHJlYW0ubWF0Y2goL15gLyk7CiAgICAgICAgdG9rZW4gPSAnbWV0YSc7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgNToKICAgICAgICBjaGFuZ2Uoc3RhdGUsIHRvX25vcm1hbCwgY29udGV4dChyeF9yb2xlX3ByZSwgNikpOwogICAgICAgIHN0cmVhbS5tYXRjaChyeF9UQUlMKTsKICAgICAgICBicmVhazsKICAgICAgZGVmYXVsdDoKICAgICAgICBjaGFuZ2Uoc3RhdGUsIHRvX25vcm1hbCk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAocGhhc2Uoc3RhdGUpID09IHJ4X3JvbGVfc3VmIHx8CiAgICAgICAgICAgICAgIHN0cmVhbS5tYXRjaChyeF9yb2xlX3N1ZiwgZmFsc2UpKSB7CgogICAgICBzd2l0Y2ggKHN0YWdlKHN0YXRlKSkgewogICAgICBjYXNlIDA6CiAgICAgICAgY2hhbmdlKHN0YXRlLCB0b19ub3JtYWwsIGNvbnRleHQocnhfcm9sZV9zdWYsIDEpKTsKICAgICAgICBzdHJlYW0ubWF0Y2goL15gLyk7CiAgICAgICAgdG9rZW4gPSAnbWV0YSc7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgMToKICAgICAgICBjaGFuZ2Uoc3RhdGUsIHRvX25vcm1hbCwgY29udGV4dChyeF9yb2xlX3N1ZiwgMikpOwogICAgICAgIHN0cmVhbS5tYXRjaChyeF9URVhUMik7CiAgICAgICAgdG9rZW4gPSAnc3RyaW5nJzsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAyOgogICAgICAgIGNoYW5nZShzdGF0ZSwgdG9fbm9ybWFsLCBjb250ZXh0KHJ4X3JvbGVfc3VmLCAzKSk7CiAgICAgICAgc3RyZWFtLm1hdGNoKC9eYDovKTsKICAgICAgICB0b2tlbiA9ICdtZXRhJzsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAzOgogICAgICAgIGNoYW5nZShzdGF0ZSwgdG9fbm9ybWFsLCBjb250ZXh0KHJ4X3JvbGVfc3VmLCA0KSk7CiAgICAgICAgc3RyZWFtLm1hdGNoKHJ4X05BTUUpOwogICAgICAgIHRva2VuID0gJ2tleXdvcmQnOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDQ6CiAgICAgICAgY2hhbmdlKHN0YXRlLCB0b19ub3JtYWwsIGNvbnRleHQocnhfcm9sZV9zdWYsIDUpKTsKICAgICAgICBzdHJlYW0ubWF0Y2goL146Lyk7CiAgICAgICAgdG9rZW4gPSAnbWV0YSc7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgNToKICAgICAgICBjaGFuZ2Uoc3RhdGUsIHRvX25vcm1hbCwgY29udGV4dChyeF9yb2xlX3N1ZiwgNikpOwogICAgICAgIHN0cmVhbS5tYXRjaChyeF9UQUlMKTsKICAgICAgICBicmVhazsKICAgICAgZGVmYXVsdDoKICAgICAgICBjaGFuZ2Uoc3RhdGUsIHRvX25vcm1hbCk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAocGhhc2Uoc3RhdGUpID09IHJ4X3JvbGUgfHwgc3RyZWFtLm1hdGNoKHJ4X3JvbGUsIGZhbHNlKSkgewoKICAgICAgc3dpdGNoIChzdGFnZShzdGF0ZSkpIHsKICAgICAgY2FzZSAwOgogICAgICAgIGNoYW5nZShzdGF0ZSwgdG9fbm9ybWFsLCBjb250ZXh0KHJ4X3JvbGUsIDEpKTsKICAgICAgICBzdHJlYW0ubWF0Y2goL146Lyk7CiAgICAgICAgdG9rZW4gPSAnbWV0YSc7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgMToKICAgICAgICBjaGFuZ2Uoc3RhdGUsIHRvX25vcm1hbCwgY29udGV4dChyeF9yb2xlLCAyKSk7CiAgICAgICAgc3RyZWFtLm1hdGNoKHJ4X05BTUUpOwogICAgICAgIHRva2VuID0gJ2tleXdvcmQnOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDI6CiAgICAgICAgY2hhbmdlKHN0YXRlLCB0b19ub3JtYWwsIGNvbnRleHQocnhfcm9sZSwgMykpOwogICAgICAgIHN0cmVhbS5tYXRjaCgvXjovKTsKICAgICAgICB0b2tlbiA9ICdtZXRhJzsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAzOgogICAgICAgIGNoYW5nZShzdGF0ZSwgdG9fbm9ybWFsLCBjb250ZXh0KHJ4X3JvbGUsIDQpKTsKICAgICAgICBzdHJlYW0ubWF0Y2gocnhfVEFJTCk7CiAgICAgICAgYnJlYWs7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgY2hhbmdlKHN0YXRlLCB0b19ub3JtYWwpOwogICAgICB9CiAgICB9IGVsc2UgaWYgKHBoYXNlKHN0YXRlKSA9PSByeF9zdWJzdGl0dXRpb25fcmVmIHx8CiAgICAgICAgICAgICAgIHN0cmVhbS5tYXRjaChyeF9zdWJzdGl0dXRpb25fcmVmLCBmYWxzZSkpIHsKCiAgICAgIHN3aXRjaCAoc3RhZ2Uoc3RhdGUpKSB7CiAgICAgIGNhc2UgMDoKICAgICAgICBjaGFuZ2Uoc3RhdGUsIHRvX25vcm1hbCwgY29udGV4dChyeF9zdWJzdGl0dXRpb25fcmVmLCAxKSk7CiAgICAgICAgc3RyZWFtLm1hdGNoKHJ4X3N1YnN0aXR1dGlvbl90ZXh0KTsKICAgICAgICB0b2tlbiA9ICd2YXJpYWJsZS0yJzsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAxOgogICAgICAgIGNoYW5nZShzdGF0ZSwgdG9fbm9ybWFsLCBjb250ZXh0KHJ4X3N1YnN0aXR1dGlvbl9yZWYsIDIpKTsKICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eXz9fPy8pKSB0b2tlbiA9ICdsaW5rJzsKICAgICAgICBicmVhazsKICAgICAgZGVmYXVsdDoKICAgICAgICBjaGFuZ2Uoc3RhdGUsIHRvX25vcm1hbCk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoc3RyZWFtLm1hdGNoKHJ4X2Zvb3Rub3RlX3JlZikpIHsKICAgICAgY2hhbmdlKHN0YXRlLCB0b19ub3JtYWwpOwogICAgICB0b2tlbiA9ICdxdW90ZSc7CiAgICB9IGVsc2UgaWYgKHN0cmVhbS5tYXRjaChyeF9jaXRhdGlvbl9yZWYpKSB7CiAgICAgIGNoYW5nZShzdGF0ZSwgdG9fbm9ybWFsKTsKICAgICAgdG9rZW4gPSAncXVvdGUnOwogICAgfSBlbHNlIGlmIChzdHJlYW0ubWF0Y2gocnhfbGlua19yZWYxKSkgewogICAgICBjaGFuZ2Uoc3RhdGUsIHRvX25vcm1hbCk7CiAgICAgIGlmICghc3RyZWFtLnBlZWsoKSB8fCBzdHJlYW0ucGVlaygpLm1hdGNoKC9eXFckLykpIHsKICAgICAgICB0b2tlbiA9ICdsaW5rJzsKICAgICAgfQogICAgfSBlbHNlIGlmIChwaGFzZShzdGF0ZSkgPT0gcnhfbGlua19yZWYyIHx8CiAgICAgICAgICAgICAgIHN0cmVhbS5tYXRjaChyeF9saW5rX3JlZjIsIGZhbHNlKSkgewoKICAgICAgc3dpdGNoIChzdGFnZShzdGF0ZSkpIHsKICAgICAgY2FzZSAwOgogICAgICAgIGlmICghc3RyZWFtLnBlZWsoKSB8fCBzdHJlYW0ucGVlaygpLm1hdGNoKC9eXFckLykpIHsKICAgICAgICAgIGNoYW5nZShzdGF0ZSwgdG9fbm9ybWFsLCBjb250ZXh0KHJ4X2xpbmtfcmVmMiwgMSkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzdHJlYW0ubWF0Y2gocnhfbGlua19yZWYyKTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgMToKICAgICAgICBjaGFuZ2Uoc3RhdGUsIHRvX25vcm1hbCwgY29udGV4dChyeF9saW5rX3JlZjIsIDIpKTsKICAgICAgICBzdHJlYW0ubWF0Y2goL15gLyk7CiAgICAgICAgdG9rZW4gPSAnbGluayc7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgMjoKICAgICAgICBjaGFuZ2Uoc3RhdGUsIHRvX25vcm1hbCwgY29udGV4dChyeF9saW5rX3JlZjIsIDMpKTsKICAgICAgICBzdHJlYW0ubWF0Y2gocnhfVEVYVDIpOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDM6CiAgICAgICAgY2hhbmdlKHN0YXRlLCB0b19ub3JtYWwsIGNvbnRleHQocnhfbGlua19yZWYyLCA0KSk7CiAgICAgICAgc3RyZWFtLm1hdGNoKC9eYF8vKTsKICAgICAgICB0b2tlbiA9ICdsaW5rJzsKICAgICAgICBicmVhazsKICAgICAgZGVmYXVsdDoKICAgICAgICBjaGFuZ2Uoc3RhdGUsIHRvX25vcm1hbCk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoc3RyZWFtLm1hdGNoKHJ4X3ZlcmJhdGltKSkgewogICAgICBjaGFuZ2Uoc3RhdGUsIHRvX3ZlcmJhdGltKTsKICAgIH0KCiAgICBlbHNlIHsKICAgICAgaWYgKHN0cmVhbS5uZXh0KCkpIGNoYW5nZShzdGF0ZSwgdG9fbm9ybWFsKTsKICAgIH0KCiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgZnVuY3Rpb24gdG9fZXhwbGljaXQoc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIHRva2VuID0gbnVsbDsKCiAgICBpZiAocGhhc2Uoc3RhdGUpID09IHJ4X3N1YnN0aXR1dGlvbiB8fAogICAgICAgIHN0cmVhbS5tYXRjaChyeF9zdWJzdGl0dXRpb24sIGZhbHNlKSkgewoKICAgICAgc3dpdGNoIChzdGFnZShzdGF0ZSkpIHsKICAgICAgY2FzZSAwOgogICAgICAgIGNoYW5nZShzdGF0ZSwgdG9fZXhwbGljaXQsIGNvbnRleHQocnhfc3Vic3RpdHV0aW9uLCAxKSk7CiAgICAgICAgc3RyZWFtLm1hdGNoKHJ4X3N1YnN0aXR1dGlvbl90ZXh0KTsKICAgICAgICB0b2tlbiA9ICd2YXJpYWJsZS0yJzsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAxOgogICAgICAgIGNoYW5nZShzdGF0ZSwgdG9fZXhwbGljaXQsIGNvbnRleHQocnhfc3Vic3RpdHV0aW9uLCAyKSk7CiAgICAgICAgc3RyZWFtLm1hdGNoKHJ4X3N1YnN0aXR1dGlvbl9zZXBhKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAyOgogICAgICAgIGNoYW5nZShzdGF0ZSwgdG9fZXhwbGljaXQsIGNvbnRleHQocnhfc3Vic3RpdHV0aW9uLCAzKSk7CiAgICAgICAgc3RyZWFtLm1hdGNoKHJ4X3N1YnN0aXR1dGlvbl9uYW1lKTsKICAgICAgICB0b2tlbiA9ICdrZXl3b3JkJzsKICAgICAgICBicmVhazsKICAgICAgY2FzZSAzOgogICAgICAgIGNoYW5nZShzdGF0ZSwgdG9fZXhwbGljaXQsIGNvbnRleHQocnhfc3Vic3RpdHV0aW9uLCA0KSk7CiAgICAgICAgc3RyZWFtLm1hdGNoKHJ4X3N1YnN0aXR1dGlvbl90YWlsKTsKICAgICAgICB0b2tlbiA9ICdtZXRhJzsKICAgICAgICBicmVhazsKICAgICAgZGVmYXVsdDoKICAgICAgICBjaGFuZ2Uoc3RhdGUsIHRvX25vcm1hbCk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAocGhhc2Uoc3RhdGUpID09IHJ4X2RpcmVjdGl2ZSB8fAogICAgICAgICAgICAgICBzdHJlYW0ubWF0Y2gocnhfZGlyZWN0aXZlLCBmYWxzZSkpIHsKCiAgICAgIHN3aXRjaCAoc3RhZ2Uoc3RhdGUpKSB7CiAgICAgIGNhc2UgMDoKICAgICAgICBjaGFuZ2Uoc3RhdGUsIHRvX2V4cGxpY2l0LCBjb250ZXh0KHJ4X2RpcmVjdGl2ZSwgMSkpOwogICAgICAgIHN0cmVhbS5tYXRjaChyeF9kaXJlY3RpdmVfbmFtZSk7CiAgICAgICAgdG9rZW4gPSAna2V5d29yZCc7CgogICAgICAgIGlmIChzdHJlYW0uY3VycmVudCgpLm1hdGNoKC9eKD86bWF0aHxsYXRleCkvKSkKICAgICAgICAgIHN0YXRlLnRtcF9zdGV4ID0gdHJ1ZTsKICAgICAgICBlbHNlIGlmIChzdHJlYW0uY3VycmVudCgpLm1hdGNoKC9ecHl0aG9uLykpCiAgICAgICAgICBzdGF0ZS50bXBfcHkgPSB0cnVlOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIDE6CiAgICAgICAgY2hhbmdlKHN0YXRlLCB0b19leHBsaWNpdCwgY29udGV4dChyeF9kaXJlY3RpdmUsIDIpKTsKICAgICAgICBzdHJlYW0ubWF0Y2gocnhfZGlyZWN0aXZlX3RhaWwpOwogICAgICAgIHRva2VuID0gJ21ldGEnOwoKICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKC9ebGF0ZXhccyokLykgfHwgc3RhdGUudG1wX3N0ZXgpIHsKICAgICAgICAgIHN0YXRlLnRtcF9zdGV4ID0gdW5kZWZpbmVkOyBjaGFuZ2Uoc3RhdGUsIHRvX21vZGUsIHsKICAgICAgICAgICAgbW9kZTogbW9kZV9zdGV4LCBsb2NhbDogQ29kZU1pcnJvci5zdGFydFN0YXRlKG1vZGVfc3RleCkKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSAyOgogICAgICAgIGNoYW5nZShzdGF0ZSwgdG9fZXhwbGljaXQsIGNvbnRleHQocnhfZGlyZWN0aXZlLCAzKSk7CiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXnB5dGhvblxzKiQvKSB8fCBzdGF0ZS50bXBfcHkpIHsKICAgICAgICAgIHN0YXRlLnRtcF9weSA9IHVuZGVmaW5lZDsgY2hhbmdlKHN0YXRlLCB0b19tb2RlLCB7CiAgICAgICAgICAgIG1vZGU6IG1vZGVfcHl0aG9uLCBsb2NhbDogQ29kZU1pcnJvci5zdGFydFN0YXRlKG1vZGVfcHl0aG9uKQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBkZWZhdWx0OgogICAgICAgIGNoYW5nZShzdGF0ZSwgdG9fbm9ybWFsKTsKICAgICAgfQogICAgfSBlbHNlIGlmIChwaGFzZShzdGF0ZSkgPT0gcnhfbGluayB8fCBzdHJlYW0ubWF0Y2gocnhfbGluaywgZmFsc2UpKSB7CgogICAgICBzd2l0Y2ggKHN0YWdlKHN0YXRlKSkgewogICAgICBjYXNlIDA6CiAgICAgICAgY2hhbmdlKHN0YXRlLCB0b19leHBsaWNpdCwgY29udGV4dChyeF9saW5rLCAxKSk7CiAgICAgICAgc3RyZWFtLm1hdGNoKHJ4X2xpbmtfaGVhZCk7CiAgICAgICAgc3RyZWFtLm1hdGNoKHJ4X2xpbmtfbmFtZSk7CiAgICAgICAgdG9rZW4gPSAnbGluayc7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgMToKICAgICAgICBjaGFuZ2Uoc3RhdGUsIHRvX2V4cGxpY2l0LCBjb250ZXh0KHJ4X2xpbmssIDIpKTsKICAgICAgICBzdHJlYW0ubWF0Y2gocnhfbGlua190YWlsKTsKICAgICAgICB0b2tlbiA9ICdtZXRhJzsKICAgICAgICBicmVhazsKICAgICAgZGVmYXVsdDoKICAgICAgICBjaGFuZ2Uoc3RhdGUsIHRvX25vcm1hbCk7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoc3RyZWFtLm1hdGNoKHJ4X2Zvb3Rub3RlKSkgewogICAgICBjaGFuZ2Uoc3RhdGUsIHRvX25vcm1hbCk7CiAgICAgIHRva2VuID0gJ3F1b3RlJzsKICAgIH0gZWxzZSBpZiAoc3RyZWFtLm1hdGNoKHJ4X2NpdGF0aW9uKSkgewogICAgICBjaGFuZ2Uoc3RhdGUsIHRvX25vcm1hbCk7CiAgICAgIHRva2VuID0gJ3F1b3RlJzsKICAgIH0KCiAgICBlbHNlIHsKICAgICAgc3RyZWFtLmVhdFNwYWNlKCk7CiAgICAgIGlmIChzdHJlYW0uZW9sKCkpIHsKICAgICAgICBjaGFuZ2Uoc3RhdGUsIHRvX25vcm1hbCk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICAgIGNoYW5nZShzdGF0ZSwgdG9fY29tbWVudCk7CiAgICAgICAgdG9rZW4gPSAnY29tbWVudCc7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gdG9rZW47CiAgfQoKICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgZnVuY3Rpb24gdG9fY29tbWVudChzdHJlYW0sIHN0YXRlKSB7CiAgICByZXR1cm4gYXNfYmxvY2soc3RyZWFtLCBzdGF0ZSwgJ2NvbW1lbnQnKTsKICB9CgogIGZ1bmN0aW9uIHRvX3ZlcmJhdGltKHN0cmVhbSwgc3RhdGUpIHsKICAgIHJldHVybiBhc19ibG9jayhzdHJlYW0sIHN0YXRlLCAnbWV0YScpOwogIH0KCiAgZnVuY3Rpb24gYXNfYmxvY2soc3RyZWFtLCBzdGF0ZSwgdG9rZW4pIHsKICAgIGlmIChzdHJlYW0uZW9sKCkgfHwgc3RyZWFtLmVhdFNwYWNlKCkpIHsKICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICByZXR1cm4gdG9rZW47CiAgICB9IGVsc2UgewogICAgICBjaGFuZ2Uoc3RhdGUsIHRvX25vcm1hbCk7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogIH0KCiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogIGZ1bmN0aW9uIHRvX21vZGUoc3RyZWFtLCBzdGF0ZSkgewoKICAgIGlmIChzdGF0ZS5jdHgubW9kZSAmJiBzdGF0ZS5jdHgubG9jYWwpIHsKCiAgICAgIGlmIChzdHJlYW0uc29sKCkpIHsKICAgICAgICBpZiAoIXN0cmVhbS5lYXRTcGFjZSgpKSBjaGFuZ2Uoc3RhdGUsIHRvX25vcm1hbCk7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KCiAgICAgIHJldHVybiBzdGF0ZS5jdHgubW9kZS50b2tlbihzdHJlYW0sIHN0YXRlLmN0eC5sb2NhbCk7CiAgICB9CgogICAgY2hhbmdlKHN0YXRlLCB0b19ub3JtYWwpOwogICAgcmV0dXJuIG51bGw7CiAgfQoKICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCiAgZnVuY3Rpb24gY29udGV4dChwaGFzZSwgc3RhZ2UsIG1vZGUsIGxvY2FsKSB7CiAgICByZXR1cm4ge3BoYXNlOiBwaGFzZSwgc3RhZ2U6IHN0YWdlLCBtb2RlOiBtb2RlLCBsb2NhbDogbG9jYWx9OwogIH0KCiAgZnVuY3Rpb24gY2hhbmdlKHN0YXRlLCB0b2ssIGN0eCkgewogICAgc3RhdGUudG9rID0gdG9rOwogICAgc3RhdGUuY3R4ID0gY3R4IHx8IHt9OwogIH0KCiAgZnVuY3Rpb24gc3RhZ2Uoc3RhdGUpIHsKICAgIHJldHVybiBzdGF0ZS5jdHguc3RhZ2UgfHwgMDsKICB9CgogIGZ1bmN0aW9uIHBoYXNlKHN0YXRlKSB7CiAgICByZXR1cm4gc3RhdGUuY3R4LnBoYXNlOwogIH0KCiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgogIHJldHVybiB7CiAgICBzdGFydFN0YXRlOiBmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiB7dG9rOiB0b19ub3JtYWwsIGN0eDogY29udGV4dCh1bmRlZmluZWQsIDApfTsKICAgIH0sCgogICAgY29weVN0YXRlOiBmdW5jdGlvbiAoc3RhdGUpIHsKICAgICAgdmFyIGN0eCA9IHN0YXRlLmN0eCwgdG1wID0gc3RhdGUudG1wOwogICAgICBpZiAoY3R4LmxvY2FsKQogICAgICAgIGN0eCA9IHttb2RlOiBjdHgubW9kZSwgbG9jYWw6IENvZGVNaXJyb3IuY29weVN0YXRlKGN0eC5tb2RlLCBjdHgubG9jYWwpfTsKICAgICAgaWYgKHRtcCkKICAgICAgICB0bXAgPSB7bW9kZTogdG1wLm1vZGUsIGxvY2FsOiBDb2RlTWlycm9yLmNvcHlTdGF0ZSh0bXAubW9kZSwgdG1wLmxvY2FsKX07CiAgICAgIHJldHVybiB7dG9rOiBzdGF0ZS50b2ssIGN0eDogY3R4LCB0bXA6IHRtcH07CiAgICB9LAoKICAgIGlubmVyTW9kZTogZnVuY3Rpb24gKHN0YXRlKSB7CiAgICAgIHJldHVybiBzdGF0ZS50bXAgICAgICA/IHtzdGF0ZTogc3RhdGUudG1wLmxvY2FsLCBtb2RlOiBzdGF0ZS50bXAubW9kZX0KICAgICAgOiBzdGF0ZS5jdHgubW9kZSA/IHtzdGF0ZTogc3RhdGUuY3R4LmxvY2FsLCBtb2RlOiBzdGF0ZS5jdHgubW9kZX0KICAgICAgOiBudWxsOwogICAgfSwKCiAgICB0b2tlbjogZnVuY3Rpb24gKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgcmV0dXJuIHN0YXRlLnRvayhzdHJlYW0sIHN0YXRlKTsKICAgIH0KICB9Owp9LCAncHl0aG9uJywgJ3N0ZXgnKTsKCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwoKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCd0ZXh0L3gtcnN0JywgJ3JzdCcpOwoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/ruby/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/ruby/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogUnVieSBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uLy4uL2FkZG9uL2VkaXQvbWF0Y2hicmFja2V0cy5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJydWJ5LmpzIj48L3NjcmlwdD4KPHN0eWxlPgogICAgICAuQ29kZU1pcnJvciB7Ym9yZGVyLXRvcDogMXB4IHNvbGlkIGJsYWNrOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7fQogICAgICAuY20tcy1kZWZhdWx0IHNwYW4uY20tYXJyb3cgeyBjb2xvcjogcmVkOyB9CiAgICA8L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxoMT5Db2RlTWlycm9yPC9oMT48aW1nIGlkPWxvZ28gc3JjPSIuLi8uLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5MYW5ndWFnZSBtb2RlczwvYT4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+UnVieTwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+UnVieSBtb2RlPC9oMj4KPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KIyBDb2RlIGZyb20gaHR0cDovL3NhbmRib3gubWMuZWR1L35iZW5uZXQvcnVieS9jb2RlL3BvbHlfcmIuaHRtbAojCiMgVGhpcyBwcm9ncmFtIGV2YWx1YXRlcyBwb2x5bm9taWFscy4gIEl0IGZpcnN0IGFza3MgZm9yIHRoZSBjb2VmZmljaWVudHMKIyBvZiBhIHBvbHlub21pYWwsIHdoaWNoIG11c3QgYmUgZW50ZXJlZCBvbiBvbmUgbGluZSwgaGlnaGVzdC1vcmRlciBmaXJzdC4KIyBJdCB0aGVuIHJlcXVlc3RzIHZhbHVlcyBvZiB4IGFuZCB3aWxsIGNvbXB1dGUgdGhlIHZhbHVlIG9mIHRoZSBwb2x5IGZvcgojIGVhY2ggeC4gIEl0IHdpbGwgcmVwZWF0bHkgYXNrIGZvciB4IHZhbHVlcywgdW5sZXNzIHlvdSB0aGUgdXNlciBlbnRlcnMKIyBhIGJsYW5rIGxpbmUuICBJdCB0aGF0IGNhc2UsIGl0IHdpbGwgYXNrIGZvciBhbm90aGVyIHBvbHlub21pYWwuICBJZiB0aGUKIyB1c2VyIHR5cGVzIHF1aXQgZm9yIGVpdGhlciBpbnB1dCwgdGhlIHByb2dyYW0gaW1tZWRpYXRlbHkgZXhpdHMuCiMKCiMKIyBGdW5jdGlvbiB0byBldmFsdWF0ZSBhIHBvbHlub21pYWwgYXQgeC4gIFRoZSBwb2x5bm9taWFsIGlzIGdpdmVuCiMgYXMgYSBsaXN0IG9mIGNvZWZmaWNpZW50cywgZnJvbSB0aGUgZ3JlYXRlc3QgdG8gdGhlIGxlYXN0LgpkZWYgcG9seXZhbCh4LCBjb2VmKQogICAgc3VtID0gMAogICAgY29lZiA9IGNvZWYuY2xvbmUgICAgICAgICAgICMgRG9uJ3Qgd2FudCB0byBkZXN0cm95IHRoZSBvcmlnaW5hbAogICAgd2hpbGUgdHJ1ZQogICAgICAgIHN1bSArPSBjb2VmLnNoaWZ0ICAgICAgICMgQWRkIGFuZCByZW1vdmUgdGhlIG5leHQgY29lZgogICAgICAgIGJyZWFrIGlmIGNvZWYuZW1wdHk/ICAgICMgSWYgbm8gbW9yZSwgZG9uZSBlbnRpcmVseS4KICAgICAgICBzdW0gKj0geCAgICAgICAgICAgICAgICAjIFRoaXMgaGFwcGVucyB0aGUgcmlnaHQgbnVtYmVyIG9mIHRpbWVzLgogICAgZW5kCiAgICByZXR1cm4gc3VtCmVuZAoKIwojIEZ1bmN0aW9uIHRvIHJlYWQgYSBsaW5lIGNvbnRhaW5pbmcgYSBsaXN0IG9mIGludGVnZXJzIGFuZCByZXR1cm4KIyB0aGVtIGFzIGFuIGFycmF5IG9mIGludGVnZXJzLiAgSWYgdGhlIHN0cmluZyBjb252ZXJzaW9uIGZhaWxzLCBpdAojIHRocm93cyBUeXBlRXJyb3IuICBJZiB0aGUgaW5wdXQgbGluZSBpcyB0aGUgd29yZCAncXVpdCcsIHRoZW4gaXQKIyBjb252ZXJ0cyBpdCB0byBhbiBlbmQtb2YtZmlsZSBleGNlcHRpb24KZGVmIHJlYWRpbnRzKHByb21wdCkKICAgICMgUmVhZCBhIGxpbmUKICAgIHByaW50IHByb21wdAogICAgbGluZSA9IHJlYWRsaW5lLmNob21wCiAgICByYWlzZSBFT0ZFcnJvci5uZXcgaWYgbGluZSA9PSAncXVpdCcgIyBZb3UgY2FuIGFsc28gdXNlIGEgcmVhbCBFT0YuCiAgICAgICAgICAgIAogICAgIyBHbyB0aHJvdWdoIGVhY2ggaXRlbSBvbiB0aGUgbGluZSwgY29udmVydGluZyBlYWNoIG9uZSBhbmQgYWRkaW5nIGl0CiAgICAjIHRvIHJldHZhbC4KICAgIHJldHZhbCA9IFsgXQogICAgZm9yIHN0ciBpbiBsaW5lLnNwbGl0KC9ccysvKQogICAgICAgIGlmIHN0ciA9fiAvXlwtP1xkKyQvCiAgICAgICAgICAgIHJldHZhbC5wdXNoKHN0ci50b19pKQogICAgICAgIGVsc2UKICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yLm5ldwogICAgICAgIGVuZAogICAgZW5kCgogICAgcmV0dXJuIHJldHZhbAplbmQKCiMKIyBUYWtlIGEgY29lZmYgYW5kIGFuIGV4cG9uZW50IGFuZCByZXR1cm4gdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiwgaWdub3JpbmcKIyB0aGUgc2lnbiBvZiB0aGUgY29lZmZpY2llbnQuCmRlZiB0ZXJtX3RvX3N0cihjb2VmLCBleHApCiAgICByZXQgPSAiIgoKICAgICMgU2hvdyBjb2VmZiwgdW5sZXNzIGl0J3MgMSBvciBhdCB0aGUgcmlnaHQKICAgIGNvZWYgPSBjb2VmLmFicwogICAgcmV0ID0gY29lZi50b19zICAgICB1bmxlc3MgY29lZiA9PSAxICYmIGV4cCA+IDAKICAgIHJldCArPSAieCIgaWYgZXhwID4gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIHggaWYgZXhwb25lbnQgbm90IDAKICAgIHJldCArPSAiXiIgKyBleHAudG9fcyBpZiBleHAgPiAxICAgICAgICAgICAgICAgICAgICAjIF5leHBvbmVudCwgaWYgPiAxLgoKICAgIHJldHVybiByZXQKZW5kCgojCiMgQ3JlYXRlIGEgc3RyaW5nIG9mIHRoZSBwb2x5bm9taWFsIGluIHNvcnQtb2YtcmVhZGFibGUgZm9ybS4KZGVmIHBvbHlzdHIocCkKICAgICMgR2V0IHRoZSBleHBvbmVudCBvZiBmaXJzdCBjb2VmZmljaWVudCwgcGx1cyAxLgogICAgZXhwID0gcC5sZW5ndGgKCiAgICAjIEFzc2lnbiBleHBvbmVudHMgdG8gZWFjaCB0ZXJtLCBtYWtpbmcgcGFpcnMgb2YgY29lZmYgYW5kIGV4cG9uZW50LAogICAgIyBUaGVuIGdldCByaWQgb2YgdGhlIHplcm8gdGVybXMuCiAgICBwID0gKHAubWFwIHsgfGN8IGV4cCAtPSAxOyBbIGMsIGV4cCBdIH0pLnNlbGVjdCB7IHxwfCBwWzBdICE9IDAgfQoKICAgICMgSWYgdGhlcmUncyBub3RoaW5nIGxlZnQsIGl0J3MgYSB6ZXJvCiAgICByZXR1cm4gIjAiIGlmIHAuZW1wdHk/CgogICAgIyAqKiogTm93IHAgaXMgYSBub24tZW1wdHkgbGlzdCBvZiBbIGNvZWYsIGV4cG9uZW50IF0gcGFpcnMuICoqKgoKICAgICMgQ29udmVydCB0aGUgZmlyc3QgdGVybSwgcHJlY2VkZWQgYnkgYSAiLSIgaWYgaXQncyBuZWdhdGl2ZS4KICAgIHJlc3VsdCA9IChpZiBwWzBdWzBdIDwgMCB0aGVuICItIiBlbHNlICIiIGVuZCkgKyB0ZXJtX3RvX3N0cigqcFswXSkKCiAgICAjIENvbnZlcnQgdGhlIHJlc3Qgb2YgdGhlIHRlcm1zLCBpbiBlYWNoIGNhc2UgYWRkaW5nIHRoZSBhcHByb3ByaWF0ZQogICAgIyArIG9yIC0gc2VwYXJhdGluZyB0aGVtLiAgCiAgICBmb3IgdGVybSBpbiBwWzEuLi5wLmxlbmd0aF0KICAgICAgICAjIEFkZCB0aGUgc2VwYXJhdG9yIHRoZW4gdGhlIHJlcC4gb2YgdGhlIHRlcm0uCiAgICAgICAgcmVzdWx0ICs9IChpZiB0ZXJtWzBdIDwgMCB0aGVuICIgLSAiIGVsc2UgIiArICIgZW5kKSArIAogICAgICAgICAgICAgICAgdGVybV90b19zdHIoKnRlcm0pCiAgICBlbmQKCiAgICByZXR1cm4gcmVzdWx0CmVuZAogICAgICAgIAojCiMgUnVuIHVudGlsIHNvbWUga2luZCBvZiBlbmRmaWxlLgpiZWdpbgogICAgIyBSZXBlYXQgdW50aWwgYW4gZXhjZXB0aW9uIG9yIHF1aXQgZ2V0cyB1cyBvdXQuCiAgICB3aGlsZSB0cnVlCiAgICAgICAgIyBSZWFkIGEgcG9seSB1bnRpbCBpdCB3b3Jrcy4gIEFuIEVPRiB3aWxsIGV4Y2VwdCBvdXQgb2YgdGhlCiAgICAgICAgIyBwcm9ncmFtLgogICAgICAgIHByaW50ICJcbiIKICAgICAgICBiZWdpbgogICAgICAgICAgICBwb2x5ID0gcmVhZGludHMoIkVudGVyIGEgcG9seW5vbWlhbCBjb2VmZmljaWVudHM6ICIpCiAgICAgICAgcmVzY3VlIFR5cGVFcnJvcgogICAgICAgICAgICBwcmludCAiVHJ5IGFnYWluLlxuIgogICAgICAgICAgICByZXRyeQogICAgICAgIGVuZAogICAgICAgIGJyZWFrIGlmIHBvbHkuZW1wdHk/CgogICAgICAgICMgUmVhZCBhbmQgZXZhbHVhdGUgeCB2YWx1ZXMgdW50aWwgdGhlIHVzZXIgdHlwZXMgYSBibGFuayBsaW5lLgogICAgICAgICMgQWdhaW4sIGFuIEVPRiB3aWxsIGV4Y2VwdCBvdXQgb2YgdGhlIHBnbS4KICAgICAgICB3aGlsZSB0cnVlCiAgICAgICAgICAgICMgUmVxdWVzdCBhbiBpbnRlZ2VyLgogICAgICAgICAgICBwcmludCAiRW50ZXIgeCB2YWx1ZSBvciBibGFuayBsaW5lOiAiCiAgICAgICAgICAgIHggPSByZWFkbGluZS5jaG9tcAogICAgICAgICAgICBicmVhayBpZiB4ID09ICcnCiAgICAgICAgICAgIHJhaXNlIEVPRkVycm9yLm5ldyBpZiB4ID09ICdxdWl0JwoKICAgICAgICAgICAgIyBJZiBpdCBsb29rcyBiYWQsIGxldCdzIHRyeSBhZ2Fpbi4KICAgICAgICAgICAgaWYgeCAhfiAvXlwtP1xkKyQvCiAgICAgICAgICAgICAgICBwcmludCAiVGhhdCBkb2Vzbid0IGxvb2sgbGlrZSBhbiBpbnRlZ2VyLiAgUGxlYXNlIHRyeSBhZ2Fpbi5cbiIKICAgICAgICAgICAgICAgIG5leHQKICAgICAgICAgICAgZW5kCgogICAgICAgICAgICAjIENvbnZlcnQgdG8gYW4gaW50ZWdlciBhbmQgcHJpbnQgdGhlIHJlc3VsdC4KICAgICAgICAgICAgeCA9IHgudG9faQogICAgICAgICAgICBwcmludCAicCh4KSA9ICIsIHBvbHlzdHIocG9seSksICJcbiIKICAgICAgICAgICAgcHJpbnQgInAoIiwgeCwgIikgPSAiLCBwb2x5dmFsKHgsIHBvbHkpLCAiXG4iCiAgICAgICAgZW5kCiAgICBlbmQKcmVzY3VlIEVPRkVycm9yCiAgICBwcmludCAiXG49PT0gRU9GID09PVxuIgpyZXNjdWUgSW50ZXJydXB0LCBTaWduYWxFeGNlcHRpb24KICAgIHByaW50ICJcbj09PSBJbnRlcnJ1cHRlZCA9PT1cbiIKZWxzZQogICAgcHJpbnQgIi0tLSBCeWUgLS0tXG4iCmVuZAo8L3RleHRhcmVhPjwvZm9ybT4KICAgIDxzY3JpcHQ+CiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICAgICAgbW9kZTogInRleHQveC1ydWJ5IiwKICAgICAgICBtYXRjaEJyYWNrZXRzOiB0cnVlLAogICAgICAgIGluZGVudFVuaXQ6IDQKICAgICAgfSk7CiAgICA8L3NjcmlwdD4KCiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC94LXJ1Ynk8L2NvZGU+LjwvcD4KCiAgICA8cD5EZXZlbG9wbWVudCBvZiB0aGUgQ29kZU1pcnJvciBSdWJ5IG1vZGUgd2FzIGtpbmRseSBzcG9uc29yZWQKICAgIGJ5IDxhIGhyZWY9Imh0dHA6Ly91YmFsby5jb20vIj5VYmFsbzwvYT4uPC9wPgoKICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/ruby/ruby.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJydWJ5IiwgZnVuY3Rpb24oY29uZmlnKSB7CiAgZnVuY3Rpb24gd29yZE9iaih3b3JkcykgewogICAgdmFyIG8gPSB7fTsKICAgIGZvciAodmFyIGkgPSAwLCBlID0gd29yZHMubGVuZ3RoOyBpIDwgZTsgKytpKSBvW3dvcmRzW2ldXSA9IHRydWU7CiAgICByZXR1cm4gbzsKICB9CiAgdmFyIGtleXdvcmRzID0gd29yZE9iaihbCiAgICAiYWxpYXMiLCAiYW5kIiwgIkJFR0lOIiwgImJlZ2luIiwgImJyZWFrIiwgImNhc2UiLCAiY2xhc3MiLCAiZGVmIiwgImRlZmluZWQ/IiwgImRvIiwgImVsc2UiLAogICAgImVsc2lmIiwgIkVORCIsICJlbmQiLCAiZW5zdXJlIiwgImZhbHNlIiwgImZvciIsICJpZiIsICJpbiIsICJtb2R1bGUiLCAibmV4dCIsICJub3QiLCAib3IiLAogICAgInJlZG8iLCAicmVzY3VlIiwgInJldHJ5IiwgInJldHVybiIsICJzZWxmIiwgInN1cGVyIiwgInRoZW4iLCAidHJ1ZSIsICJ1bmRlZiIsICJ1bmxlc3MiLAogICAgInVudGlsIiwgIndoZW4iLCAid2hpbGUiLCAieWllbGQiLCAibmlsIiwgInJhaXNlIiwgInRocm93IiwgImNhdGNoIiwgImZhaWwiLCAibG9vcCIsICJjYWxsY2MiLAogICAgImNhbGxlciIsICJsYW1iZGEiLCAicHJvYyIsICJwdWJsaWMiLCAicHJvdGVjdGVkIiwgInByaXZhdGUiLCAicmVxdWlyZSIsICJsb2FkIiwKICAgICJyZXF1aXJlX3JlbGF0aXZlIiwgImV4dGVuZCIsICJhdXRvbG9hZCIsICJfX0VORF9fIiwgIl9fRklMRV9fIiwgIl9fTElORV9fIiwgIl9fZGlyX18iCiAgXSk7CiAgdmFyIGluZGVudFdvcmRzID0gd29yZE9iaihbImRlZiIsICJjbGFzcyIsICJjYXNlIiwgImZvciIsICJ3aGlsZSIsICJ1bnRpbCIsICJtb2R1bGUiLCAidGhlbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhdGNoIiwgImxvb3AiLCAicHJvYyIsICJiZWdpbiJdKTsKICB2YXIgZGVkZW50V29yZHMgPSB3b3JkT2JqKFsiZW5kIiwgInVudGlsIl0pOwogIHZhciBtYXRjaGluZyA9IHsiWyI6ICJdIiwgInsiOiAifSIsICIoIjogIikifTsKICB2YXIgY3VyUHVuYzsKCiAgZnVuY3Rpb24gY2hhaW4obmV3dG9rLCBzdHJlYW0sIHN0YXRlKSB7CiAgICBzdGF0ZS50b2tlbml6ZS5wdXNoKG5ld3Rvayk7CiAgICByZXR1cm4gbmV3dG9rKHN0cmVhbSwgc3RhdGUpOwogIH0KCiAgZnVuY3Rpb24gdG9rZW5CYXNlKHN0cmVhbSwgc3RhdGUpIHsKICAgIGlmIChzdHJlYW0uc29sKCkgJiYgc3RyZWFtLm1hdGNoKCI9YmVnaW4iKSAmJiBzdHJlYW0uZW9sKCkpIHsKICAgICAgc3RhdGUudG9rZW5pemUucHVzaChyZWFkQmxvY2tDb21tZW50KTsKICAgICAgcmV0dXJuICJjb21tZW50IjsKICAgIH0KICAgIGlmIChzdHJlYW0uZWF0U3BhY2UoKSkgcmV0dXJuIG51bGw7CiAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpLCBtOwogICAgaWYgKGNoID09ICJgIiB8fCBjaCA9PSAiJyIgfHwgY2ggPT0gJyInKSB7CiAgICAgIHJldHVybiBjaGFpbihyZWFkUXVvdGVkKGNoLCAic3RyaW5nIiwgY2ggPT0gJyInIHx8IGNoID09ICJgIiksIHN0cmVhbSwgc3RhdGUpOwogICAgfSBlbHNlIGlmIChjaCA9PSAiLyIpIHsKICAgICAgdmFyIGN1cnJlbnRJbmRleCA9IHN0cmVhbS5jdXJyZW50KCkubGVuZ3RoOwogICAgICBpZiAoc3RyZWFtLnNraXBUbygiLyIpKSB7CiAgICAgICAgdmFyIHNlYXJjaF90aWxsID0gc3RyZWFtLmN1cnJlbnQoKS5sZW5ndGg7CiAgICAgICAgc3RyZWFtLmJhY2tVcChzdHJlYW0uY3VycmVudCgpLmxlbmd0aCAtIGN1cnJlbnRJbmRleCk7CiAgICAgICAgdmFyIGJhbGFuY2UgPSAwOyAgLy8gYmFsYW5jZSBicmFja2V0cwogICAgICAgIHdoaWxlIChzdHJlYW0uY3VycmVudCgpLmxlbmd0aCA8IHNlYXJjaF90aWxsKSB7CiAgICAgICAgICB2YXIgY2hjaHIgPSBzdHJlYW0ubmV4dCgpOwogICAgICAgICAgaWYgKGNoY2hyID09ICIoIikgYmFsYW5jZSArPSAxOwogICAgICAgICAgZWxzZSBpZiAoY2hjaHIgPT0gIikiKSBiYWxhbmNlIC09IDE7CiAgICAgICAgICBpZiAoYmFsYW5jZSA8IDApIGJyZWFrOwogICAgICAgIH0KICAgICAgICBzdHJlYW0uYmFja1VwKHN0cmVhbS5jdXJyZW50KCkubGVuZ3RoIC0gY3VycmVudEluZGV4KTsKICAgICAgICBpZiAoYmFsYW5jZSA9PSAwKQogICAgICAgICAgcmV0dXJuIGNoYWluKHJlYWRRdW90ZWQoY2gsICJzdHJpbmctMiIsIHRydWUpLCBzdHJlYW0sIHN0YXRlKTsKICAgICAgfQogICAgICByZXR1cm4gIm9wZXJhdG9yIjsKICAgIH0gZWxzZSBpZiAoY2ggPT0gIiUiKSB7CiAgICAgIHZhciBzdHlsZSA9ICJzdHJpbmciLCBlbWJlZCA9IHRydWU7CiAgICAgIGlmIChzdHJlYW0uZWF0KCJzIikpIHN0eWxlID0gImF0b20iOwogICAgICBlbHNlIGlmIChzdHJlYW0uZWF0KC9bV1FdLykpIHN0eWxlID0gInN0cmluZyI7CiAgICAgIGVsc2UgaWYgKHN0cmVhbS5lYXQoL1tyXS8pKSBzdHlsZSA9ICJzdHJpbmctMiI7CiAgICAgIGVsc2UgaWYgKHN0cmVhbS5lYXQoL1t3eHFdLykpIHsgc3R5bGUgPSAic3RyaW5nIjsgZW1iZWQgPSBmYWxzZTsgfQogICAgICB2YXIgZGVsaW0gPSBzdHJlYW0uZWF0KC9bXlx3XHM9XS8pOwogICAgICBpZiAoIWRlbGltKSByZXR1cm4gIm9wZXJhdG9yIjsKICAgICAgaWYgKG1hdGNoaW5nLnByb3BlcnR5SXNFbnVtZXJhYmxlKGRlbGltKSkgZGVsaW0gPSBtYXRjaGluZ1tkZWxpbV07CiAgICAgIHJldHVybiBjaGFpbihyZWFkUXVvdGVkKGRlbGltLCBzdHlsZSwgZW1iZWQsIHRydWUpLCBzdHJlYW0sIHN0YXRlKTsKICAgIH0gZWxzZSBpZiAoY2ggPT0gIiMiKSB7CiAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgcmV0dXJuICJjb21tZW50IjsKICAgIH0gZWxzZSBpZiAoY2ggPT0gIjwiICYmIChtID0gc3RyZWFtLm1hdGNoKC9ePC0/W1xgXCJcJ10/KFthLXpBLVpfP11cdyopW1xgXCJcJ10/KD86O3wkKS8pKSkgewogICAgICByZXR1cm4gY2hhaW4ocmVhZEhlcmVEb2MobVsxXSksIHN0cmVhbSwgc3RhdGUpOwogICAgfSBlbHNlIGlmIChjaCA9PSAiMCIpIHsKICAgICAgaWYgKHN0cmVhbS5lYXQoIngiKSkgc3RyZWFtLmVhdFdoaWxlKC9bXGRhLWZBLUZdLyk7CiAgICAgIGVsc2UgaWYgKHN0cmVhbS5lYXQoImIiKSkgc3RyZWFtLmVhdFdoaWxlKC9bMDFdLyk7CiAgICAgIGVsc2Ugc3RyZWFtLmVhdFdoaWxlKC9bMC03XS8pOwogICAgICByZXR1cm4gIm51bWJlciI7CiAgICB9IGVsc2UgaWYgKC9cZC8udGVzdChjaCkpIHsKICAgICAgc3RyZWFtLm1hdGNoKC9eW1xkX10qKD86XC5bXGRfXSspPyg/OltlRV1bK1wtXT9bXGRfXSspPy8pOwogICAgICByZXR1cm4gIm51bWJlciI7CiAgICB9IGVsc2UgaWYgKGNoID09ICI/IikgewogICAgICB3aGlsZSAoc3RyZWFtLm1hdGNoKC9eXFxbQ01dLS8pKSB7fQogICAgICBpZiAoc3RyZWFtLmVhdCgiXFwiKSkgc3RyZWFtLmVhdFdoaWxlKC9cdy8pOwogICAgICBlbHNlIHN0cmVhbS5uZXh0KCk7CiAgICAgIHJldHVybiAic3RyaW5nIjsKICAgIH0gZWxzZSBpZiAoY2ggPT0gIjoiKSB7CiAgICAgIGlmIChzdHJlYW0uZWF0KCInIikpIHJldHVybiBjaGFpbihyZWFkUXVvdGVkKCInIiwgImF0b20iLCBmYWxzZSksIHN0cmVhbSwgc3RhdGUpOwogICAgICBpZiAoc3RyZWFtLmVhdCgnIicpKSByZXR1cm4gY2hhaW4ocmVhZFF1b3RlZCgnIicsICJhdG9tIiwgdHJ1ZSksIHN0cmVhbSwgc3RhdGUpOwoKICAgICAgLy8gOj4gOj4+IDo8IDo8PCBhcmUgdmFsaWQgc3ltYm9scwogICAgICBpZiAoc3RyZWFtLmVhdCgvW1w8XD5dLykpIHsKICAgICAgICBzdHJlYW0uZWF0KC9bXDxcPl0vKTsKICAgICAgICByZXR1cm4gImF0b20iOwogICAgICB9CgogICAgICAvLyA6KyA6LSA6LyA6KiA6fCA6JiA6ISBhcmUgdmFsaWQgc3ltYm9scwogICAgICBpZiAoc3RyZWFtLmVhdCgvW1wrXC1cKlwvXCZcfFw6XCFdLykpIHsKICAgICAgICByZXR1cm4gImF0b20iOwogICAgICB9CgogICAgICAvLyBTeW1ib2xzIGNhbid0IHN0YXJ0IGJ5IGEgZGlnaXQKICAgICAgaWYgKHN0cmVhbS5lYXQoL1thLXpBLVokQF9ceGExLVx1ZmZmZl0vKSkgewogICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1x3JFx4YTEtXHVmZmZmXS8pOwogICAgICAgIC8vIE9ubHkgb25lID8gISA9IGlzIGFsbG93ZWQgYW5kIG9ubHkgYXMgdGhlIGxhc3QgY2hhcmFjdGVyCiAgICAgICAgc3RyZWFtLmVhdCgvW1w/XCFcPV0vKTsKICAgICAgICByZXR1cm4gImF0b20iOwogICAgICB9CiAgICAgIHJldHVybiAib3BlcmF0b3IiOwogICAgfSBlbHNlIGlmIChjaCA9PSAiQCIgJiYgc3RyZWFtLm1hdGNoKC9eQD9bYS16QS1aX1x4YTEtXHVmZmZmXS8pKSB7CiAgICAgIHN0cmVhbS5lYXQoIkAiKTsKICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXHdceGExLVx1ZmZmZl0vKTsKICAgICAgcmV0dXJuICJ2YXJpYWJsZS0yIjsKICAgIH0gZWxzZSBpZiAoY2ggPT0gIiQiKSB7CiAgICAgIGlmIChzdHJlYW0uZWF0KC9bYS16QS1aX10vKSkgewogICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1x3XS8pOwogICAgICB9IGVsc2UgaWYgKHN0cmVhbS5lYXQoL1xkLykpIHsKICAgICAgICBzdHJlYW0uZWF0KC9cZC8pOwogICAgICB9IGVsc2UgewogICAgICAgIHN0cmVhbS5uZXh0KCk7IC8vIE11c3QgYmUgYSBzcGVjaWFsIGdsb2JhbCBsaWtlICQ6IG9yICQhCiAgICAgIH0KICAgICAgcmV0dXJuICJ2YXJpYWJsZS0zIjsKICAgIH0gZWxzZSBpZiAoL1thLXpBLVpfXHhhMS1cdWZmZmZdLy50ZXN0KGNoKSkgewogICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcd1x4YTEtXHVmZmZmXS8pOwogICAgICBzdHJlYW0uZWF0KC9bXD9cIV0vKTsKICAgICAgaWYgKHN0cmVhbS5lYXQoIjoiKSkgcmV0dXJuICJhdG9tIjsKICAgICAgcmV0dXJuICJpZGVudCI7CiAgICB9IGVsc2UgaWYgKGNoID09ICJ8IiAmJiAoc3RhdGUudmFyTGlzdCB8fCBzdGF0ZS5sYXN0VG9rID09ICJ7IiB8fCBzdGF0ZS5sYXN0VG9rID09ICJkbyIpKSB7CiAgICAgIGN1clB1bmMgPSAifCI7CiAgICAgIHJldHVybiBudWxsOwogICAgfSBlbHNlIGlmICgvW1woXClcW1xde31cXDtdLy50ZXN0KGNoKSkgewogICAgICBjdXJQdW5jID0gY2g7CiAgICAgIHJldHVybiBudWxsOwogICAgfSBlbHNlIGlmIChjaCA9PSAiLSIgJiYgc3RyZWFtLmVhdCgiPiIpKSB7CiAgICAgIHJldHVybiAiYXJyb3ciOwogICAgfSBlbHNlIGlmICgvWz0rXC1cLyo6XC5eJTw+fnxdLy50ZXN0KGNoKSkgewogICAgICB2YXIgbW9yZSA9IHN0cmVhbS5lYXRXaGlsZSgvWz0rXC1cLyo6XC5eJTw+fnxdLyk7CiAgICAgIGlmIChjaCA9PSAiLiIgJiYgIW1vcmUpIGN1clB1bmMgPSAiLiI7CiAgICAgIHJldHVybiAib3BlcmF0b3IiOwogICAgfSBlbHNlIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfQoKICBmdW5jdGlvbiB0b2tlbkJhc2VVbnRpbEJyYWNlKGRlcHRoKSB7CiAgICBpZiAoIWRlcHRoKSBkZXB0aCA9IDE7CiAgICByZXR1cm4gZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICBpZiAoc3RyZWFtLnBlZWsoKSA9PSAifSIpIHsKICAgICAgICBpZiAoZGVwdGggPT0gMSkgewogICAgICAgICAgc3RhdGUudG9rZW5pemUucG9wKCk7CiAgICAgICAgICByZXR1cm4gc3RhdGUudG9rZW5pemVbc3RhdGUudG9rZW5pemUubGVuZ3RoLTFdKHN0cmVhbSwgc3RhdGUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzdGF0ZS50b2tlbml6ZVtzdGF0ZS50b2tlbml6ZS5sZW5ndGggLSAxXSA9IHRva2VuQmFzZVVudGlsQnJhY2UoZGVwdGggLSAxKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLnBlZWsoKSA9PSAieyIpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZVtzdGF0ZS50b2tlbml6ZS5sZW5ndGggLSAxXSA9IHRva2VuQmFzZVVudGlsQnJhY2UoZGVwdGggKyAxKTsKICAgICAgfQogICAgICByZXR1cm4gdG9rZW5CYXNlKHN0cmVhbSwgc3RhdGUpOwogICAgfTsKICB9CiAgZnVuY3Rpb24gdG9rZW5CYXNlT25jZSgpIHsKICAgIHZhciBhbHJlYWR5Q2FsbGVkID0gZmFsc2U7CiAgICByZXR1cm4gZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICBpZiAoYWxyZWFkeUNhbGxlZCkgewogICAgICAgIHN0YXRlLnRva2VuaXplLnBvcCgpOwogICAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZVtzdGF0ZS50b2tlbml6ZS5sZW5ndGgtMV0oc3RyZWFtLCBzdGF0ZSk7CiAgICAgIH0KICAgICAgYWxyZWFkeUNhbGxlZCA9IHRydWU7CiAgICAgIHJldHVybiB0b2tlbkJhc2Uoc3RyZWFtLCBzdGF0ZSk7CiAgICB9OwogIH0KICBmdW5jdGlvbiByZWFkUXVvdGVkKHF1b3RlLCBzdHlsZSwgZW1iZWQsIHVuZXNjYXBlZCkgewogICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgdmFyIGVzY2FwZWQgPSBmYWxzZSwgY2g7CgogICAgICBpZiAoc3RhdGUuY29udGV4dC50eXBlID09PSAncmVhZC1xdW90ZWQtcGF1c2VkJykgewogICAgICAgIHN0YXRlLmNvbnRleHQgPSBzdGF0ZS5jb250ZXh0LnByZXY7CiAgICAgICAgc3RyZWFtLmVhdCgifSIpOwogICAgICB9CgogICAgICB3aGlsZSAoKGNoID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkgewogICAgICAgIGlmIChjaCA9PSBxdW90ZSAmJiAodW5lc2NhcGVkIHx8ICFlc2NhcGVkKSkgewogICAgICAgICAgc3RhdGUudG9rZW5pemUucG9wKCk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgaWYgKGVtYmVkICYmIGNoID09ICIjIiAmJiAhZXNjYXBlZCkgewogICAgICAgICAgaWYgKHN0cmVhbS5lYXQoInsiKSkgewogICAgICAgICAgICBpZiAocXVvdGUgPT0gIn0iKSB7CiAgICAgICAgICAgICAgc3RhdGUuY29udGV4dCA9IHtwcmV2OiBzdGF0ZS5jb250ZXh0LCB0eXBlOiAncmVhZC1xdW90ZWQtcGF1c2VkJ307CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RhdGUudG9rZW5pemUucHVzaCh0b2tlbkJhc2VVbnRpbEJyYWNlKCkpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0gZWxzZSBpZiAoL1tAXCRdLy50ZXN0KHN0cmVhbS5wZWVrKCkpKSB7CiAgICAgICAgICAgIHN0YXRlLnRva2VuaXplLnB1c2godG9rZW5CYXNlT25jZSgpKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVzY2FwZWQgPSAhZXNjYXBlZCAmJiBjaCA9PSAiXFwiOwogICAgICB9CiAgICAgIHJldHVybiBzdHlsZTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIHJlYWRIZXJlRG9jKHBocmFzZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgaWYgKHN0cmVhbS5tYXRjaChwaHJhc2UpKSBzdGF0ZS50b2tlbml6ZS5wb3AoKTsKICAgICAgZWxzZSBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICAgIHJldHVybiAic3RyaW5nIjsKICAgIH07CiAgfQogIGZ1bmN0aW9uIHJlYWRCbG9ja0NvbW1lbnQoc3RyZWFtLCBzdGF0ZSkgewogICAgaWYgKHN0cmVhbS5zb2woKSAmJiBzdHJlYW0ubWF0Y2goIj1lbmQiKSAmJiBzdHJlYW0uZW9sKCkpCiAgICAgIHN0YXRlLnRva2VuaXplLnBvcCgpOwogICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgcmV0dXJuICJjb21tZW50IjsKICB9CgogIHJldHVybiB7CiAgICBzdGFydFN0YXRlOiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHt0b2tlbml6ZTogW3Rva2VuQmFzZV0sCiAgICAgICAgICAgICAgaW5kZW50ZWQ6IDAsCiAgICAgICAgICAgICAgY29udGV4dDoge3R5cGU6ICJ0b3AiLCBpbmRlbnRlZDogLWNvbmZpZy5pbmRlbnRVbml0fSwKICAgICAgICAgICAgICBjb250aW51ZWRMaW5lOiBmYWxzZSwKICAgICAgICAgICAgICBsYXN0VG9rOiBudWxsLAogICAgICAgICAgICAgIHZhckxpc3Q6IGZhbHNlfTsKICAgIH0sCgogICAgdG9rZW46IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgY3VyUHVuYyA9IG51bGw7CiAgICAgIGlmIChzdHJlYW0uc29sKCkpIHN0YXRlLmluZGVudGVkID0gc3RyZWFtLmluZGVudGF0aW9uKCk7CiAgICAgIHZhciBzdHlsZSA9IHN0YXRlLnRva2VuaXplW3N0YXRlLnRva2VuaXplLmxlbmd0aC0xXShzdHJlYW0sIHN0YXRlKSwga3d0eXBlOwogICAgICB2YXIgdGhpc1RvayA9IGN1clB1bmM7CiAgICAgIGlmIChzdHlsZSA9PSAiaWRlbnQiKSB7CiAgICAgICAgdmFyIHdvcmQgPSBzdHJlYW0uY3VycmVudCgpOwogICAgICAgIHN0eWxlID0gc3RhdGUubGFzdFRvayA9PSAiLiIgPyAicHJvcGVydHkiCiAgICAgICAgICA6IGtleXdvcmRzLnByb3BlcnR5SXNFbnVtZXJhYmxlKHN0cmVhbS5jdXJyZW50KCkpID8gImtleXdvcmQiCiAgICAgICAgICA6IC9eW0EtWl0vLnRlc3Qod29yZCkgPyAidGFnIgogICAgICAgICAgOiAoc3RhdGUubGFzdFRvayA9PSAiZGVmIiB8fCBzdGF0ZS5sYXN0VG9rID09ICJjbGFzcyIgfHwgc3RhdGUudmFyTGlzdCkgPyAiZGVmIgogICAgICAgICAgOiAidmFyaWFibGUiOwogICAgICAgIGlmIChzdHlsZSA9PSAia2V5d29yZCIpIHsKICAgICAgICAgIHRoaXNUb2sgPSB3b3JkOwogICAgICAgICAgaWYgKGluZGVudFdvcmRzLnByb3BlcnR5SXNFbnVtZXJhYmxlKHdvcmQpKSBrd3R5cGUgPSAiaW5kZW50IjsKICAgICAgICAgIGVsc2UgaWYgKGRlZGVudFdvcmRzLnByb3BlcnR5SXNFbnVtZXJhYmxlKHdvcmQpKSBrd3R5cGUgPSAiZGVkZW50IjsKICAgICAgICAgIGVsc2UgaWYgKCh3b3JkID09ICJpZiIgfHwgd29yZCA9PSAidW5sZXNzIikgJiYgc3RyZWFtLmNvbHVtbigpID09IHN0cmVhbS5pbmRlbnRhdGlvbigpKQogICAgICAgICAgICBrd3R5cGUgPSAiaW5kZW50IjsKICAgICAgICAgIGVsc2UgaWYgKHdvcmQgPT0gImRvIiAmJiBzdGF0ZS5jb250ZXh0LmluZGVudGVkIDwgc3RhdGUuaW5kZW50ZWQpCiAgICAgICAgICAgIGt3dHlwZSA9ICJpbmRlbnQiOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoY3VyUHVuYyB8fCAoc3R5bGUgJiYgc3R5bGUgIT0gImNvbW1lbnQiKSkgc3RhdGUubGFzdFRvayA9IHRoaXNUb2s7CiAgICAgIGlmIChjdXJQdW5jID09ICJ8Iikgc3RhdGUudmFyTGlzdCA9ICFzdGF0ZS52YXJMaXN0OwoKICAgICAgaWYgKGt3dHlwZSA9PSAiaW5kZW50IiB8fCAvW1woXFtce10vLnRlc3QoY3VyUHVuYykpCiAgICAgICAgc3RhdGUuY29udGV4dCA9IHtwcmV2OiBzdGF0ZS5jb250ZXh0LCB0eXBlOiBjdXJQdW5jIHx8IHN0eWxlLCBpbmRlbnRlZDogc3RhdGUuaW5kZW50ZWR9OwogICAgICBlbHNlIGlmICgoa3d0eXBlID09ICJkZWRlbnQiIHx8IC9bXClcXVx9XS8udGVzdChjdXJQdW5jKSkgJiYgc3RhdGUuY29udGV4dC5wcmV2KQogICAgICAgIHN0YXRlLmNvbnRleHQgPSBzdGF0ZS5jb250ZXh0LnByZXY7CgogICAgICBpZiAoc3RyZWFtLmVvbCgpKQogICAgICAgIHN0YXRlLmNvbnRpbnVlZExpbmUgPSAoY3VyUHVuYyA9PSAiXFwiIHx8IHN0eWxlID09ICJvcGVyYXRvciIpOwogICAgICByZXR1cm4gc3R5bGU7CiAgICB9LAoKICAgIGluZGVudDogZnVuY3Rpb24oc3RhdGUsIHRleHRBZnRlcikgewogICAgICBpZiAoc3RhdGUudG9rZW5pemVbc3RhdGUudG9rZW5pemUubGVuZ3RoLTFdICE9IHRva2VuQmFzZSkgcmV0dXJuIDA7CiAgICAgIHZhciBmaXJzdENoYXIgPSB0ZXh0QWZ0ZXIgJiYgdGV4dEFmdGVyLmNoYXJBdCgwKTsKICAgICAgdmFyIGN0ID0gc3RhdGUuY29udGV4dDsKICAgICAgdmFyIGNsb3NpbmcgPSBjdC50eXBlID09IG1hdGNoaW5nW2ZpcnN0Q2hhcl0gfHwKICAgICAgICBjdC50eXBlID09ICJrZXl3b3JkIiAmJiAvXig/OmVuZHx1bnRpbHxlbHNlfGVsc2lmfHdoZW58cmVzY3VlKVxiLy50ZXN0KHRleHRBZnRlcik7CiAgICAgIHJldHVybiBjdC5pbmRlbnRlZCArIChjbG9zaW5nID8gMCA6IGNvbmZpZy5pbmRlbnRVbml0KSArCiAgICAgICAgKHN0YXRlLmNvbnRpbnVlZExpbmUgPyBjb25maWcuaW5kZW50VW5pdCA6IDApOwogICAgfSwKCiAgICBlbGVjdHJpY0lucHV0OiAvXlxzKig/OmVuZHxyZXNjdWV8XH0pJC8sCiAgICBsaW5lQ29tbWVudDogIiMiCiAgfTsKfSk7CgpDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveC1ydWJ5IiwgInJ1YnkiKTsKCn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/ruby/test.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24oKSB7CiAgdmFyIG1vZGUgPSBDb2RlTWlycm9yLmdldE1vZGUoe2luZGVudFVuaXQ6IDJ9LCAicnVieSIpOwogIGZ1bmN0aW9uIE1UKG5hbWUpIHsgdGVzdC5tb2RlKG5hbWUsIG1vZGUsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpOyB9CgogIE1UKCJkaXZpZGVfZXF1YWxfb3BlcmF0b3IiLAogICAgICJbdmFyaWFibGUgYmFyXSBbb3BlcmF0b3IgLz1dIFt2YXJpYWJsZSBmb29dIik7CgogIE1UKCJkaXZpZGVfZXF1YWxfb3BlcmF0b3Jfbm9fc3BhY2luZyIsCiAgICAgIlt2YXJpYWJsZSBmb29dW29wZXJhdG9yIC89XVtudW1iZXIgNDJdIik7Cgp9KSgpOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/rust/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/rust/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogUnVzdCBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uLy4uL2FkZG9uL21vZGUvc2ltcGxlLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9InJ1c3QuanMiPjwvc2NyaXB0Pgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPi5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazt9PC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aDE+Q29kZU1pcnJvcjwvaDE+PGltZyBpZD1sb2dvIHNyYz0iLi4vLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+TGFuZ3VhZ2UgbW9kZXM8L2E+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPlJ1c3Q8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPlJ1c3QgbW9kZTwvaDI+CgoKPGRpdj48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgovLyBEZW1vIGNvZGUuCgp0eXBlIGZvbzxUPiA9IGludDsKZW51bSBiYXIgewogICAgc29tZShpbnQsIGZvbzxmbG9hdD4pLAogICAgbm9uZQp9CgpmbiBjaGVja19jcmF0ZSh4OiBpbnQpIHsKICAgIGxldCB2ID0gMTA7CiAgICBtYXRjaCBmb28gewogICAgICAgIDEgLi4uIDMgewogICAgICAgICAgICBwcmludF9mb28oKTsKICAgICAgICAgICAgaWYgeCB7CiAgICAgICAgICAgICAgICBibGFoKCkudG9fc3RyaW5nKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgKHgsIHkpIHsgImJ5ZSIgfQogICAgICAgIF8geyAiaGkiIH0KICAgIH0KfQo8L3RleHRhcmVhPjwvZGl2PgoKICAgIDxzY3JpcHQ+CiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICAgICAgbGluZU51bWJlcnM6IHRydWUsCiAgICAgICAgbGluZVdyYXBwaW5nOiB0cnVlLAogICAgICAgIGluZGVudFVuaXQ6IDQsCiAgICAgICAgbW9kZTogInJ1c3QiCiAgICAgIH0pOwogICAgPC9zY3JpcHQ+CgogICAgPHA+PHN0cm9uZz5NSU1FIHR5cGVzIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPnRleHQveC1ydXN0c3JjPC9jb2RlPi48L3A+CiAgPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/rust/rust.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSwgcmVxdWlyZSgiLi4vLi4vYWRkb24vbW9kZS9zaW1wbGUiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiLCAiLi4vLi4vYWRkb24vbW9kZS9zaW1wbGUiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVTaW1wbGVNb2RlKCJydXN0Iix7CiAgc3RhcnQ6IFsKICAgIC8vIHN0cmluZyBhbmQgYnl0ZSBzdHJpbmcKICAgIHtyZWdleDogL2I/Ii8sIHRva2VuOiAic3RyaW5nIiwgbmV4dDogInN0cmluZyJ9LAogICAgLy8gcmF3IHN0cmluZyBhbmQgcmF3IGJ5dGUgc3RyaW5nCiAgICB7cmVnZXg6IC9iP3IiLywgdG9rZW46ICJzdHJpbmciLCBuZXh0OiAic3RyaW5nX3JhdyJ9LAogICAge3JlZ2V4OiAvYj9yIysiLywgdG9rZW46ICJzdHJpbmciLCBuZXh0OiAic3RyaW5nX3Jhd19oYXNoIn0sCiAgICAvLyBjaGFyYWN0ZXIKICAgIHtyZWdleDogLycoPzpbXidcXF18XFwoPzpbbnJ0MCciXXx4W1xkYS1mQS1GXXsyfXx1XHtbXGRhLWZBLUZdezZ9XH0pKScvLCB0b2tlbjogInN0cmluZy0yIn0sCiAgICAvLyBieXRlCiAgICB7cmVnZXg6IC9iJyg/OlteJ118XFwoPzpbJ1xcbnJ0MF18eFtcZGEtZkEtRl17Mn0pKScvLCB0b2tlbjogInN0cmluZy0yIn0sCgogICAge3JlZ2V4OiAvKD86KD86WzAtOV1bMC05X10qKSg/Oig/OltFZV1bKy1dP1swLTlfXSspfFwuWzAtOV9dKyg/OltFZV1bKy1dP1swLTlfXSspPykoPzpmMzJ8ZjY0KT8pfCg/OjAoPzpiWzAxX10rfCg/Om9bMC03X10rKXwoPzp4WzAtOWEtZkEtRl9dKykpfCg/OlswLTldWzAtOV9dKikpKD86dTh8dTE2fHUzMnx1NjR8aTh8aTE2fGkzMnxpNjR8aXNpemV8dXNpemUpPy8sCiAgICAgdG9rZW46ICJudW1iZXIifSwKICAgIHtyZWdleDogLyhsZXQoPzpccyttdXQpP3xmbnxlbnVtfG1vZHxzdHJ1Y3R8dHlwZSkoXHMrKShbYS16QS1aX11bYS16QS1aMC05X10qKS8sIHRva2VuOiBbImtleXdvcmQiLCBudWxsLCAiZGVmIl19LAogICAge3JlZ2V4OiAvKD86YWJzdHJhY3R8YWxpZ25vZnxhc3xib3h8YnJlYWt8Y29udGludWV8Y29uc3R8Y3JhdGV8ZG98ZWxzZXxlbnVtfGV4dGVybnxmbnxmb3J8ZmluYWx8aWZ8aW1wbHxpbnxsb29wfG1hY3JvfG1hdGNofG1vZHxtb3ZlfG9mZnNldG9mfG92ZXJyaWRlfHByaXZ8cHJvY3xwdWJ8cHVyZXxyZWZ8cmV0dXJufHNlbGZ8c2l6ZW9mfHN0YXRpY3xzdHJ1Y3R8c3VwZXJ8dHJhaXR8dHlwZXx0eXBlb2Z8dW5zYWZlfHVuc2l6ZWR8dXNlfHZpcnR1YWx8d2hlcmV8d2hpbGV8eWllbGQpXGIvLCB0b2tlbjogImtleXdvcmQifSwKICAgIHtyZWdleDogL1xiKD86U2VsZnxpc2l6ZXx1c2l6ZXxjaGFyfGJvb2x8dTh8dTE2fHUzMnx1NjR8ZjE2fGYzMnxmNjR8aTh8aTE2fGkzMnxpNjR8c3RyfE9wdGlvbilcYi8sIHRva2VuOiAiYXRvbSJ9LAogICAge3JlZ2V4OiAvXGIoPzp0cnVlfGZhbHNlfFNvbWV8Tm9uZXxPa3xFcnIpXGIvLCB0b2tlbjogImJ1aWx0aW4ifSwKICAgIHtyZWdleDogL1xiKGZuKShccyspKFthLXpBLVpfXVthLXpBLVowLTlfXSopLywKICAgICB0b2tlbjogWyJrZXl3b3JkIiwgbnVsbCAsImRlZiJdfSwKICAgIHtyZWdleDogLyMhP1xbLipcXS8sIHRva2VuOiAibWV0YSJ9LAogICAge3JlZ2V4OiAvXC9cLy4qLywgdG9rZW46ICJjb21tZW50In0sCiAgICB7cmVnZXg6IC9cL1wqLywgdG9rZW46ICJjb21tZW50IiwgbmV4dDogImNvbW1lbnQifSwKICAgIHtyZWdleDogL1stK1wvKj08PiFdKy8sIHRva2VuOiAib3BlcmF0b3IifSwKICAgIHtyZWdleDogL1thLXpBLVpfXVx3KiEvLHRva2VuOiAidmFyaWFibGUtMyJ9LAogICAge3JlZ2V4OiAvW2EtekEtWl9dXHcqLywgdG9rZW46ICJ2YXJpYWJsZSJ9LAogICAge3JlZ2V4OiAvW1x7XFtcKF0vLCBpbmRlbnQ6IHRydWV9LAogICAge3JlZ2V4OiAvW1x9XF1cKV0vLCBkZWRlbnQ6IHRydWV9CiAgXSwKICBzdHJpbmc6IFsKICAgIHtyZWdleDogLyIvLCB0b2tlbjogInN0cmluZyIsIG5leHQ6ICJzdGFydCJ9LAogICAge3JlZ2V4OiAvKD86W15cXCJdfFxcKD86LnwkKSkqLywgdG9rZW46ICJzdHJpbmcifQogIF0sCiAgc3RyaW5nX3JhdzogWwogICAge3JlZ2V4OiAvIi8sIHRva2VuOiAic3RyaW5nIiwgbmV4dDogInN0YXJ0In0sCiAgICB7cmVnZXg6IC9bXiJdKi8sIHRva2VuOiAic3RyaW5nIn0KICBdLAogIHN0cmluZ19yYXdfaGFzaDogWwogICAge3JlZ2V4OiAvIiMrLywgdG9rZW46ICJzdHJpbmciLCBuZXh0OiAic3RhcnQifSwKICAgIHtyZWdleDogLyg/OlteIl18Iig/ISMpKSovLCB0b2tlbjogInN0cmluZyJ9CiAgXSwKICBjb21tZW50OiBbCiAgICB7cmVnZXg6IC8uKj9cKlwvLywgdG9rZW46ICJjb21tZW50IiwgbmV4dDogInN0YXJ0In0sCiAgICB7cmVnZXg6IC8uKi8sIHRva2VuOiAiY29tbWVudCJ9CiAgXSwKICBtZXRhOiB7CiAgICBkb250SW5kZW50U3RhdGVzOiBbImNvbW1lbnQiXSwKICAgIGVsZWN0cmljSW5wdXQ6IC9eXHMqXH0kLywKICAgIGJsb2NrQ29tbWVudFN0YXJ0OiAiLyoiLAogICAgYmxvY2tDb21tZW50RW5kOiAiKi8iLAogICAgbGluZUNvbW1lbnQ6ICIvLyIsCiAgICBmb2xkOiAiYnJhY2UiCiAgfQp9KTsKCgpDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveC1ydXN0c3JjIiwgInJ1c3QiKTsKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/rust/test.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24oKSB7CiAgdmFyIG1vZGUgPSBDb2RlTWlycm9yLmdldE1vZGUoe2luZGVudFVuaXQ6IDR9LCAicnVzdCIpOwogIGZ1bmN0aW9uIE1UKG5hbWUpIHt0ZXN0Lm1vZGUobmFtZSwgbW9kZSwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7fQoKICBNVCgnaW50ZWdlcl90ZXN0JywKICAgICAnW251bWJlciAxMjNpMzJdJywKICAgICAnW251bWJlciAxMjN1MzJdJywKICAgICAnW251bWJlciAxMjNfdTMyXScsCiAgICAgJ1tudW1iZXIgMHhmZl91OF0nLAogICAgICdbbnVtYmVyIDBvNzBfaTE2XScsCiAgICAgJ1tudW1iZXIgMGIxMTExXzExMTFfMTAwMV8wMDAwX2kzMl0nLAogICAgICdbbnVtYmVyIDB1c2l6ZV0nKTsKCiAgTVQoJ2Zsb2F0X3Rlc3QnLAogICAgICdbbnVtYmVyIDEyMy4wZjY0XScsCiAgICAgJ1tudW1iZXIgMC4xZjY0XScsCiAgICAgJ1tudW1iZXIgMC4xZjMyXScsCiAgICAgJ1tudW1iZXIgMTJFKzk5X2Y2NF0nKTsKCiAgTVQoJ3N0cmluZy1saXRlcmFscy10ZXN0JywKICAgICAnW3N0cmluZyAiZm9vIl0nLAogICAgICdbc3RyaW5nIHIiZm9vIl0nLAogICAgICdbc3RyaW5nICJcXCJmb29cXCIiXScsCiAgICAgJ1tzdHJpbmcgciMiImZvbyIiI10nLAogICAgICdbc3RyaW5nICJmb28gI1xcIiMgYmFyIl0nLAoKICAgICAnW3N0cmluZyBiImZvbyJdJywKICAgICAnW3N0cmluZyBiciJmb28iXScsCiAgICAgJ1tzdHJpbmcgYiJcXCJmb29cXCIiXScsCiAgICAgJ1tzdHJpbmcgYnIjIiJmb28iIiNdJywKICAgICAnW3N0cmluZyBiciMjImZvbyAjIiBiYXIiIyNdJywKCiAgICAgIltzdHJpbmctMiAnaCddIiwKICAgICAiW3N0cmluZy0yIGInaCddIik7Cgp9KSgpOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/sas/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/sas/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogU0FTIG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4veG1sL3htbC5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJzYXMuanMiPjwvc2NyaXB0Pgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgogIC5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazt9CiAgLmNtLXMtZGVmYXVsdCAuY20tdHJhaWxpbmctc3BhY2UtYTpiZWZvcmUsCiAgLmNtLXMtZGVmYXVsdCAuY20tdHJhaWxpbmctc3BhY2UtYjpiZWZvcmUge3Bvc2l0aW9uOiBhYnNvbHV0ZTsgY29udGVudDogIlwwMEI3IjsgY29sb3I6ICM3Nzc7fQogIC5jbS1zLWRlZmF1bHQgLmNtLXRyYWlsaW5nLXNwYWNlLW5ldy1saW5lOmJlZm9yZSB7cG9zaXRpb246IGFic29sdXRlOyBjb250ZW50OiAiXDIxQjUiOyBjb2xvcjogIzc3Nzt9Cjwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGgxPkNvZGVNaXJyb3I8L2gxPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5TQVM8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPlNBUyBtb2RlPC9oMj4KPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KbGlibmFtZSBmb28gIi90bXAvZm9vYmFyIjsKJWxldCBjb3VudD0xOwoKLyogTXVsdGkgbGluZQpDb21tZW50CiovCmRhdGEgX251bGxfOwogICAgeD1yYW51bmkoKTsKICAgICogc2luZ2xlIGNvbW1lbnQ7CiAgICB4Mj14KioyOwogICAgc3g9c3FydCh4KTsKICAgIGlmIHg9eDIgdGhlbiBwdXQgInggbXVzdCBiZSAxIjsKICAgIGVsc2UgZG87CiAgICAgICAgcHV0IHg9OwogICAgZW5kOwpydW47CgovKiBlbWJlZGRlZCBjb21tZW50CiogY29tbWVudDsKKi8KCnByb2MgZ2xtIGRhdGE9c2FzaGVscC5jbGFzczsKICAgIGNsYXNzIHNleDsKICAgIG1vZGVsIHdlaWdodCA9IGhlaWdodCBzZXg7CnJ1bjsKCnByb2Mgc3FsOwogICAgc2VsZWN0IGNvdW50KCopCiAgICBmcm9tIHNhc2hlbHAuY2xhc3M7CgogICAgY3JlYXRlIHRhYmxlIGZvbyBhcwogICAgc2VsZWN0ICogZnJvbSBzYXNoZWxwLmNsYXNzOwoKICAgIHNlbGVjdCAqCiAgICBmcm9tIGZvbzsKcXVpdDsKPC90ZXh0YXJlYT48L2Zvcm0+Cgo8c2NyaXB0PgogIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICBtb2RlOiAnc2FzJywKICAgIGxpbmVOdW1iZXJzOiB0cnVlCiAgfSk7Cjwvc2NyaXB0PgoKPHA+PHN0cm9uZz5NSU1FIHR5cGVzIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPnRleHQveC1zYXM8L2NvZGU+LjwvcD4KCjwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/sas/sas.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgoKLy8gU0FTIG1vZGUgY29weXJpZ2h0IChjKSAyMDE2IEphcmVkIERlYW4sIFNBUyBJbnN0aXR1dGUKLy8gQ3JlYXRlZCBieSBKYXJlZCBEZWFuCgovLyBUT0RPCi8vIGluZGVudCBhbmQgZGUtaW5kZW50Ci8vIGlkZW50aWZ5IG1hY3JvIHZhcmlhYmxlcwoKCi8vRGVmaW5pdGlvbnMKLy8gIGNvbW1lbnQgLS0gdGV4dCB3aXRoaW5nICogOyBvciAvKiAqLwovLyAga2V5d29yZCAtLSBTQVMgbGFuZ3VhZ2UgdmFyaWFibGUKLy8gIHZhcmlhYmxlIC0tIG1hY3JvIHZhcmlhYmxlcyBzdGFydHMgd2l0aCAnJicgb3IgdmFyaWFibGUgZm9ybWF0cwovLyAgdmFyaWFibGUtMiAtLSBEQVRBIFN0ZXAsIHByb2MsIG9yIG1hY3JvIG5hbWVzCi8vICBzdHJpbmcgLS0gdGV4dCB3aXRoaW4gJyAnIG9yICIgIgovLyAgb3BlcmF0b3IgLS0gbnVtZXJpYyBvcGVyYXRvciArIC8gLSAqICoqIGxlIGVxIGdlIC4uLiBhbmQgc28gb24KLy8gIGJ1aWx0aW4gLS0gcHJvYyAlbWFjcm8gZGF0YSBydW4gbWVuZAovLyAgYXRvbQovLyAgZGVmCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CgogIENvZGVNaXJyb3IuZGVmaW5lTW9kZSgic2FzIiwgZnVuY3Rpb24gKCkgewogICAgdmFyIHdvcmRzID0ge307CiAgICB2YXIgaXNEb3VibGVPcGVyYXRvclN5bSA9IHsKICAgICAgZXE6ICdvcGVyYXRvcicsCiAgICAgIGx0OiAnb3BlcmF0b3InLAogICAgICBsZTogJ29wZXJhdG9yJywKICAgICAgZ3Q6ICdvcGVyYXRvcicsCiAgICAgIGdlOiAnb3BlcmF0b3InLAogICAgICAiaW4iOiAnb3BlcmF0b3InLAogICAgICBuZTogJ29wZXJhdG9yJywKICAgICAgb3I6ICdvcGVyYXRvcicKICAgIH07CiAgICB2YXIgaXNEb3VibGVPcGVyYXRvckNoYXIgPSAvKDw9fD49fCE9fDw+KS87CiAgICB2YXIgaXNTaW5nbGVPcGVyYXRvckNoYXIgPSAvWz1cKDpcKSx7fS4qPD4rXC1cL15cW1xdXS87CgogICAgLy8gVGFrZXMgYSBzdHJpbmcgb2Ygd29yZHMgc2VwYXJhdGVkIGJ5IHNwYWNlcyBhbmQgYWRkcyB0aGVtIGFzCiAgICAvLyBrZXlzIHdpdGggdGhlIHZhbHVlIG9mIHRoZSBmaXJzdCBhcmd1bWVudCAnc3R5bGUnCiAgICBmdW5jdGlvbiBkZWZpbmUoc3R5bGUsIHN0cmluZywgY29udGV4dCkgewogICAgICBpZiAoY29udGV4dCkgewogICAgICAgIHZhciBzcGxpdCA9IHN0cmluZy5zcGxpdCgnICcpOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3BsaXQubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHdvcmRzW3NwbGl0W2ldXSA9IHtzdHlsZTogc3R5bGUsIHN0YXRlOiBjb250ZXh0fTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIC8vZGF0YXN0ZXAKICAgIGRlZmluZSgnZGVmJywgJ3N0YWNrIHBnbSB2aWV3IHNvdXJjZSBkZWJ1ZyBuZXN0aW5nIG5vbGlzdCcsIFsnaW5EYXRhU3RlcCddKTsKICAgIGRlZmluZSgnZGVmJywgJ2lmIHdoaWxlIHVudGlsIGZvciBkbyBkbzsgZW5kIGVuZDsgdGhlbiBlbHNlIGNhbmNlbCcsIFsnaW5EYXRhU3RlcCddKTsKICAgIGRlZmluZSgnZGVmJywgJ2xhYmVsIGZvcm1hdCBfbl8gX2Vycm9yXycsIFsnaW5EYXRhU3RlcCddKTsKICAgIGRlZmluZSgnZGVmJywgJ0FMVEVSIEJVRk5PIEJVRlNJWkUgQ05UTExFViBDT01QUkVTUyBETERNR0FDVElPTiBFTkNSWVBUIEVOQ1JZUFRLRVkgRVhURU5ET0JTQ09VTlRFUiBHRU5NQVggR0VOTlVNIElOREVYIExBQkVMIE9CU0JVRiBPVVRSRVAgUFcgUFdSRVEgUkVBRCBSRVBFTVBUWSBSRVBMQUNFIFJFVVNFIFJPTEUgU09SVEVEQlkgU1BJTEwgVE9CU05PIFRZUEUgV1JJVEUgRklMRUNMT1NFIEZJUlNUT0JTIElOIE9CUyBQT0lOVE9CUyBXSEVSRSBXSEVSRVVQIElEWE5BTUUgSURYV0hFUkUgRFJPUCBLRUVQIFJFTkFNRScsIFsnaW5EYXRhU3RlcCddKTsKICAgIGRlZmluZSgnZGVmJywgJ2ZpbGV2YXIgZmluZm8gZmludiBmaXBuYW1lIGZpcG5hbWVsIGZpcHN0YXRlIGZpcnN0IGZpcnN0b2JzIGZsb29yJywgWydpbkRhdGFTdGVwJ10pOwogICAgZGVmaW5lKCdkZWYnLCAndmFyZm10IHZhcmluZm10IHZhcmxhYmVsIHZhcmxlbiB2YXJuYW1lIHZhcm51bSB2YXJyYXkgdmFycmF5eCB2YXJ0eXBlIHZlcmlmeSB2Zm9ybWF0IHZmb3JtYXRkIHZmb3JtYXRkeCB2Zm9ybWF0biB2Zm9ybWF0bnggdmZvcm1hdHcgdmZvcm1hdHd4IHZmb3JtYXR4IHZpbmFycmF5IHZpbmFycmF5eCB2aW5mb3JtYXQgdmluZm9ybWF0ZCB2aW5mb3JtYXRkeCB2aW5mb3JtYXRuIHZpbmZvcm1hdG54IHZpbmZvcm1hdHcgdmluZm9ybWF0d3ggdmluZm9ybWF0eCB2bGFiZWwgdmxhYmVseCB2bGVuZ3RoIHZsZW5ndGh4IHZuYW1lIHZuYW1leCB2bmZlcnIgdnR5cGUgdnR5cGV4IHdlZWtkYXknLCBbJ2luRGF0YVN0ZXAnXSk7CiAgICBkZWZpbmUoJ2RlZicsICd6aXBmaXBzIHppcG5hbWUgemlwbmFtZWwgemlwc3RhdGUnLCBbJ2luRGF0YVN0ZXAnXSk7CiAgICBkZWZpbmUoJ2RlZicsICdwdXQgcHV0YyBwdXRuJywgWydpbkRhdGFTdGVwJ10pOwogICAgZGVmaW5lKCdidWlsdGluJywgJ2RhdGEgcnVuJywgWydpbkRhdGFTdGVwJ10pOwoKCiAgICAvL3Byb2MKICAgIGRlZmluZSgnZGVmJywgJ2RhdGEnLCBbJ2luUHJvYyddKTsKCiAgICAvLyBmbG93IGNvbnRyb2wgZm9yIG1hY3JvcwogICAgZGVmaW5lKCdkZWYnLCAnJWlmICVlbmQgJWVuZDsgJWVsc2UgJWVsc2U7ICVkbyAlZG87ICV0aGVuJywgWydpbk1hY3JvJ10pOwoKICAgIC8vZXZlcnl3aGVyZQogICAgZGVmaW5lKCdidWlsdGluJywgJ3Byb2MgcnVuOyBxdWl0OyBsaWJuYW1lIGZpbGVuYW1lICVtYWNybyAlbWVuZCBvcHRpb24gb3B0aW9ucycsIFsnQUxMJ10pOwoKICAgIGRlZmluZSgnZGVmJywgJ2Zvb3Rub3RlIHRpdGxlIGxpYm5hbWUgb2RzJywgWydBTEwnXSk7CiAgICBkZWZpbmUoJ2RlZicsICclbGV0ICVwdXQgJWdsb2JhbCAlc3lzZnVuYyAlZXZhbCAnLCBbJ0FMTCddKTsKICAgIC8vIGF1dG9tYXRpYyBtYWNybyB2YXJpYWJsZXMgaHR0cDovL3N1cHBvcnQuc2FzLmNvbS9kb2N1bWVudGF0aW9uL2NkbC9lbi9tY3JvbHJlZi82MTg4NS9IVE1ML2RlZmF1bHQvdmlld2VyLmh0bSNhMDAzMTY3MDIzLmh0bQogICAgZGVmaW5lKCd2YXJpYWJsZScsICcmc3lzYnVmZnIgJnN5c2NjICZzeXNjaGFyd2lkdGggJnN5c2NtZCAmc3lzZGF0ZSAmc3lzZGF0ZTkgJnN5c2RheSAmc3lzZGV2aWMgJnN5c2RtZyAmc3lzZHNuICZzeXNlbmNvZGluZyAmc3lzZW52ICZzeXNlcnIgJnN5c2Vycm9ydGV4dCAmc3lzZmlscmMgJnN5c2hvc3RuYW1lICZzeXNpbmRleCAmc3lzaW5mbyAmc3lzam9iaWQgJnN5c2xhc3QgJnN5c2xja3JjICZzeXNsaWJyYyAmc3lzbG9nYXBwbG5hbWUgJnN5c21hY3JvbmFtZSAmc3lzbWVudiAmc3lzbXNnICZzeXNuY3B1ICZzeXNvZHNwYXRoICZzeXNwYXJtICZzeXNwYnVmZiAmc3lzcHJvY2Vzc2lkICZzeXNwcm9jZXNzbmFtZSAmc3lzcHJvY25hbWUgJnN5c3JjICZzeXNzY3AgJnN5c3NjcGwgJnN5c3NjcGwgJnN5c3NpdGUgJnN5c3N0YXJ0aWQgJnN5c3N0YXJ0bmFtZSAmc3lzdGNwaXBob3N0bmFtZSAmc3lzdGltZSAmc3lzdXNlcmlkICZzeXN2ZXIgJnN5c3Zsb25nICZzeXN2bG9uZzQgJnN5c3dhcm5pbmd0ZXh0JywgWydBTEwnXSk7CgogICAgLy9mb290bm90ZVsxLTldPyB0aXRsZVsxLTldPwoKICAgIC8vb3B0aW9ucyBzdGF0ZW1lbnQKICAgIGRlZmluZSgnZGVmJywgJ3NvdXJjZTIgbm9zb3VyY2UyIHBhZ2UgcGFnZW5vIHBhZ2VzaXplJywgWydBTEwnXSk7CgogICAgLy9wcm9jIGFuZCBkYXRhc3RlcAogICAgZGVmaW5lKCdkZWYnLCAnX2FsbF8gX2NoYXJhY3Rlcl8gX2NtZF8gX2ZyZXFfIF9pXyBfaW5maWxlXyBfbGFzdF8gX21zZ18gX251bGxfIF9udW1lcmljXyBfdGVtcG9yYXJ5XyBfdHlwZV8gYWJvcnQgYWJzIGFkZHIgYWRqcnNxIGFpcnkgYWxwaGEgYWx0ZXIgYWx0bG9nIGFsdHByaW50IGFuZCBhcmNvcyBhcnJheSBhcnNpbiBhcyBhdGFuIGF0dHJjIGF0dHJpYiBhdHRybiBhdXRoc2VydmVyIGF1dG9leGVjIGF3c2NvbnRyb2wgYXdzZGVmIGF3c21lbnUgYXdzbWVudW1lcmdlIGF3c3RpdGxlIGJhY2t3YXJkIGJhbmQgYmFzZSBiZXRhaW52IGJldHdlZW4gYmxvY2tzaXplIGJsc2hpZnQgYm5vdCBib3IgYnJzaGlmdCBidWZubyBidWZzaXplIGJ4b3IgYnkgYnllcnIgYnlsaW5lIGJ5dGUgY2FsY3VsYXRlZCBjYWxsIGNhcmRzIGNhcmRzNCBjYXRjYWNoZSBjYnVmbm8gY2RmIGNlaWwgY2VudGVyIGNleGlzdCBjaGFuZ2UgY2hpc3EgY2ludiBjbGFzcyBjbGVhbnVwIGNsb3NlIGNub25jdCBjbnRsbGV2IGNvYWxlc2NlIGNvZGVnZW4gY29sIGNvbGxhdGUgY29sbGluIGNvbHVtbiBjb21hbWlkIGNvbWF1eDEgY29tYXV4MiBjb21kZWYgY29tcGJsIGNvbXBvdW5kIGNvbXByZXNzIGNvbmZpZyBjb250aW51ZSBjb252ZXJ0IGNvcyBjb3NoIGNwdWlkIGNyZWF0ZSBjcm9zcyBjcm9zc3RhYiBjc3MgY3Vyb2JzIGN2IGRhY2NkYiBkYWNjZGJzbCBkYWNjc2wgZGFjY3N5ZCBkYWNjdGFiIGRhaXJ5IGRhdGFsaW5lcyBkYXRhbGluZXM0IGRhdGVqdWwgZGF0ZXBhcnQgZGF0ZXRpbWUgZGF5IGRiY3NsYW5nIGRiY3N0eXBlIGRjbG9zZSBkZG0gZGVsZXRlIGRlbGltaXRlciBkZXBkYiBkZXBkYnNsIGRlcHNsIGRlcHN5ZCBkZXB0YWIgZGVxdW90ZSBkZXNjZW5kaW5nIGRlc2NyaXB0IGRlc2lnbj0gZGV2aWNlIGRmbGFuZyBkaG1zIGRpZiBkaWdhbW1hIGRpbSBkaW5mbyBkaXNwbGF5IGRpc3RpbmN0IGRrcmljb25kIGRrcm9jb25kIGRsbSBkbnVtIGRvIGRvcGVuIGRvcHRuYW1lIGRvcHRudW0gZHJlYWQgZHJvcCBkcm9wbm90ZSBkc25hbWUgZHNuZmVyciBlY2hvIGVsc2UgZW1haWxkbGcgZW1haWxpZCBlbWFpbHB3IGVtYWlsc2VydmVyIGVtYWlsc3lzIGVuY3J5cHQgZW5kIGVuZHNhcyBlbmdpbmUgZW9mIGVvdiBlcmYgZXJmYyBlcnJvciBlcnJvcmNoZWNrIGVycm9ycyBleGlzdCBleHAgZmFwcGVuZCBmY2xvc2UgZmNvbCBmZGVsZXRlIGZlZWRiYWNrIGZldGNoIGZldGNob2JzIGZleGlzdCBmZ2V0IGZpbGUgZmlsZWNsb3NlIGZpbGVleGlzdCBmaWxlZm10IGZpbGVuYW1lIGZpbGVyZWYgIGZtdGVyciBmbXRzZWFyY2ggZm5vbmN0IGZub3RlIGZvbnQgZm9udGFsaWFzICBmb3BlbiBmb3B0bmFtZSBmb3B0bnVtIGZvcmNlIGZvcm1hdHRlZCBmb3JtY2hhciBmb3JtZGVsaW0gZm9ybWRsaW0gZm9yd2FyZCBmcG9pbnQgZnBvcyBmcHV0IGZyZWFkIGZyZXdpbmQgZnJsZW4gZnJvbSBmc2VwIGZ1enogZndyaXRlIGdhbWludiBnYW1tYSBnZXRvcHRpb24gZ2V0dmFyYyBnZXR2YXJuIGdvIGdvdG8gZ3JvdXAgZ3dpbmRvdyBoYmFyIGhib3VuZCBoZWxwZW52IGhlbHBsb2MgaG1zIGhvbm9yYXBwZWFyYW5jZSBob3N0aGVscCBob3N0cHJpbnQgaG91ciBocGN0IGh0bWwgaHZhciBpYmVzc2VsIGliciBpZCBpZiBpbmRleCBpbmRleGMgaW5kZXh3IGluaXRjbWQgaW5pdHN0bXQgaW5uZXIgaW5wdXQgaW5wdXRjIGlucHV0biBpbnIgaW5zZXJ0IGludCBpbnRjayBpbnRueCBpbnRvIGludHJyIGludmFsaWRkYXRhIGlyciBpcyBqYmVzc2VsIGpvaW4ganVsZGF0ZSBrZWVwIGtlbnRiIGt1cnRvc2lzIGxhYmVsIGxhZyBsYXN0IGxib3VuZCBsZWF2ZSBsZWZ0IGxlbmd0aCBsZXZlbHMgbGdhbW1hIGxpYiAgbGlicmFyeSBsaWJyZWYgbGluZSBsaW5lc2l6ZSBsaW5rIGxpc3QgbG9nIGxvZzEwIGxvZzIgbG9ncGRmIGxvZ3BtZiBsb2dzZGYgbG9zdGNhcmQgbG93Y2FzZSBscmVjbCBscyBtYWNybyBtYWNyb2dlbiBtYXBzIG1hdXRvc291cmNlIG1heCBtYXhkZWMgbWF4ciBtZHkgbWVhbiBtZWFzdXJlcyBtZWRpYW4gbWVtdHlwZSBtZXJnZSBtZXJyb3IgbWluIG1pbnV0ZSBtaXNzaW5nIG1pc3NvdmVyIG1sb2dpYyBtb2QgbW9kZSBtb2RlbCBtb2RpZnkgbW9udGggbW9wZW4gbW9ydCBtcHJpbnQgbXJlY2FsbCBtc2dsZXZlbCBtc3ltdGFibWF4IG12YXJzaXplIG15eSBuIG5lc3QgbmV0cHYgbmV3IG5ld3Mgbm1pc3Mgbm8gbm9iYXRjaCBub2JzIG5vY2FwcyBub2NhcmRpbWFnZSBub2NlbnRlciBub2NoYXJjb2RlIG5vY21kbWFjIG5vY29sIG5vY3VtIG5vZGF0ZSBub2RiY3Mgbm9kZXRhaWxzIG5vZG1yIG5vZG1zIG5vZG1zYmF0Y2ggbm9kdXAgbm9kdXBrZXkgbm9kdXBsaWNhdGVzIG5vZWNob2F1dG8gbm9lcXVhbHMgbm9lcnJvcmFiZW5kIG5vZXhpdHdpbmRvd3Mgbm9mdWxsc3RpbWVyIG5vaWNvbiBub2ltcGxtYWMgbm9pbnQgbm9saXN0IG5vbG9hZGxpc3Qgbm9taXNzIG5vbWxvZ2ljIG5vbXByaW50IG5vbXJlY2FsbCBub21zZ2Nhc2Ugbm9tc3RvcmVkIG5vbXVsdGVudmFwcGwgbm9ub3RlcyBub251bWJlciBub29icyBub292cCBub3BhZCBub3BlcmNlbnQgbm9wcmludCBub3ByaW50aW5pdCBub3JtYWwgbm9yb3cgbm9yc2FzdXNlciBub3NldGluaXQgIG5vc3BsYXNoIG5vc3ltYm9sZ2VuIG5vdGUgbm90ZXMgbm90aXRsZSBub3RpdGxlcyBub3Rzb3J0ZWQgbm92ZXJib3NlIG5veHN5bmMgbm94d2FpdCBucHYgbnVsbCBudW1iZXIgbnVta2V5cyBudW1tb3VzZWtleXMgbndheSBvYnMgIG9uIG9wZW4gICAgIG9yZGVyIG9yZGluYWwgb3RoZXJ3aXNlIG91dCBvdXRlciBvdXRwPSBvdXRwdXQgb3ZlciBvdnAgcCgxIDUgMTAgMjUgNTAgNzUgOTAgOTUgOTkpIHBhZCBwYWQyICBwYWlyZWQgcGFybSBwYXJtY2FyZHMgcGF0aCBwYXRoZGxsIHBhdGhuYW1lIHBkZiBwZWVrIHBlZWtjIHBma2V5IHBtZiBwb2ludCBwb2lzc29uIHBva2UgcG9zaXRpb24gcHJpbnRlciBwcm9iYmV0YSBwcm9iYm5tbCBwcm9iY2hpIHByb2JmIHByb2JnYW0gcHJvYmh5cHIgcHJvYml0IHByb2JuZWdiIHByb2Jub3JtIHByb2JzaWcgcHJvYnQgcHJvY2xlYXZlIHBydCBwcyAgcHcgcHdyZXEgcXRyIHF1b3RlIHIgcmFuYmluIHJhbmNhdSByYW5leHAgcmFuZ2FtIHJhbmdlIHJhbmtzIHJhbm5vciByYW5wb2kgcmFudGJsIHJhbnRyaSByYW51bmkgcmVhZCByZWNmbSByZWdpc3RlciByZWdyIHJlbW90ZSByZW1vdmUgcmVuYW1lIHJlcGVhdCByZXBsYWNlIHJlc29sdmUgcmV0YWluIHJldHVybiByZXVzZSByZXZlcnNlIHJld2luZCByaWdodCByb3VuZCByc3F1YXJlIHJ0ZiBydHJhY2UgcnRyYWNlbG9jIHMgczIgc2FtcGxvYyBzYXNhdXRvcyBzYXNjb250cm9sIHNhc2Zyc2NyIHNhc21zZyBzYXNtc3RvcmUgc2Fzc2NyaXB0IHNhc3VzZXIgc2F2aW5nIHNjYW4gc2RmIHNlY29uZCBzZWxlY3Qgc2VsZWN0aW9uIHNlcGFyYXRlZCBzZXEgc2Vycm9yIHNldCBzZXRjb21tIHNldG90IHNpZ24gc2ltcGxlIHNpbiBzaW5oIHNpdGVpbmZvIHNrZXduZXNzIHNraXAgc2xlIHNscyBzb3J0ZWRieSBzb3J0cGdtIHNvcnRzZXEgc29ydHNpemUgc291bmRleCAgc3BlZGlzIHNwbGFzaGxvY2F0aW9uIHNwbGl0IHNwb29sIHNxcnQgc3RhcnQgc3RkIHN0ZGVyciBzdGRpbiBzdGZpcHMgc3RpbWVyIHN0bmFtZSBzdG5hbWVsIHN0b3Agc3RvcG92ZXIgc3ViZ3JvdXAgc3VicG9wbiBzdWJzdHIgc3VtIHN1bXdndCBzeW1ib2wgc3ltYm9sZ2VuIHN5bWdldCBzeW1wdXQgc3lzZ2V0IHN5c2luIHN5c2xlYXZlIHN5c21zZyBzeXNwYXJtIHN5c3ByaW50IHN5c3ByaW50Zm9udCBzeXNwcm9kIHN5c3JjIHN5c3RlbSB0IHRhYmxlIHRhYmxlcyB0YW4gdGFuaCB0YXBlY2xvc2UgdGJ1ZnNpemUgdGVybWluYWwgdGVzdCB0aGVuIHRpbWVwYXJ0IHRpbnYgIHRub25jdCB0byB0b2RheSB0b2wgdG9vbGRlZiB0b3RwZXIgdHJhbnNmb3Jtb3V0IHRyYW5zbGF0ZSB0cmFudGFiIHRyYW53cmQgdHJpZ2FtbWEgdHJpbSB0cmltbiB0cnVuYyB0cnVuY292ZXIgdHlwZSB1bmZvcm1hdHRlZCB1bmlmb3JtIHVuaW9uIHVudGlsIHVwY2FzZSB1cGRhdGUgdXNlciB1c2VyaWNvbiB1c3MgdmFsaWRhdGUgdmFsdWUgdmFyICB3ZWlnaHQgd2hlbiB3aGVyZSB3aGlsZSB3aW5jaGFyc2V0IHdpbmRvdyB3b3JrIHdvcmtpbml0IHdvcmt0ZXJtIHdyaXRlIHdzdW0geHN5bmMgeHdhaXQgeWVhcmN1dG9mZiB5ZXMgeXlxICBtaW4gbWF4JywgWydpbkRhdGFTdGVwJywgJ2luUHJvYyddKTsKICAgIGRlZmluZSgnb3BlcmF0b3InLCAnYW5kIG5vdCAnLCBbJ2luRGF0YVN0ZXAnLCAnaW5Qcm9jJ10pOwoKICAgIC8vIE1haW4gZnVuY3Rpb24KICAgIGZ1bmN0aW9uIHRva2VuaXplKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgLy8gRmluYWxseSBhZHZhbmNlIHRoZSBzdHJlYW0KICAgICAgdmFyIGNoID0gc3RyZWFtLm5leHQoKTsKCiAgICAgIC8vIEJMT0NLQ09NTUVOVAogICAgICBpZiAoY2ggPT09ICcvJyAmJiBzdHJlYW0uZWF0KCcqJykpIHsKICAgICAgICBzdGF0ZS5jb250aW51ZUNvbW1lbnQgPSB0cnVlOwogICAgICAgIHJldHVybiAiY29tbWVudCI7CiAgICAgIH0gZWxzZSBpZiAoc3RhdGUuY29udGludWVDb21tZW50ID09PSB0cnVlKSB7IC8vIGluIGNvbW1lbnQgYmxvY2sKICAgICAgICAvL2NvbW1lbnQgZW5kcyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaW5lCiAgICAgICAgaWYgKGNoID09PSAnKicgJiYgc3RyZWFtLnBlZWsoKSA9PT0gJy8nKSB7CiAgICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgICAgc3RhdGUuY29udGludWVDb21tZW50ID0gZmFsc2U7CiAgICAgICAgfSBlbHNlIGlmIChzdHJlYW0uc2tpcFRvKCcqJykpIHsgLy9jb21tZW50IGlzIHBvdGVudGlhbGx5IGxhdGVyIGluIGxpbmUKICAgICAgICAgIHN0cmVhbS5za2lwVG8oJyonKTsKICAgICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgICBpZiAoc3RyZWFtLmVhdCgnLycpKQogICAgICAgICAgICBzdGF0ZS5jb250aW51ZUNvbW1lbnQgPSBmYWxzZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gImNvbW1lbnQiOwogICAgICB9CgogICAgICAvLyBEb3VibGVPcGVyYXRvciBtYXRjaAogICAgICB2YXIgZG91YmxlT3BlcmF0b3IgPSBjaCArIHN0cmVhbS5wZWVrKCk7CgogICAgICAvLyBNYXRjaCBhbGwgbGluZSBjb21tZW50cy4KICAgICAgdmFyIG15U3RyaW5nID0gc3RyZWFtLnN0cmluZzsKICAgICAgdmFyIG15UmVnZXhwID0gLyg/Ol5ccyp8WztdXHMqKShcKi4qPyk7L2lnOwogICAgICB2YXIgbWF0Y2ggPSBteVJlZ2V4cC5leGVjKG15U3RyaW5nKTsKICAgICAgaWYgKG1hdGNoICE9PSBudWxsKSB7CiAgICAgICAgaWYgKG1hdGNoLmluZGV4ID09PSAwICYmIChzdHJlYW0uY29sdW1uKCkgIT09IChtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aCAtIDEpKSkgewogICAgICAgICAgc3RyZWFtLmJhY2tVcChzdHJlYW0uY29sdW1uKCkpOwogICAgICAgICAgc3RyZWFtLnNraXBUbygnOycpOwogICAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgICAgIHJldHVybiAnY29tbWVudCc7CiAgICAgICAgfSBlbHNlIGlmIChtYXRjaC5pbmRleCArIDEgPCBzdHJlYW0uY29sdW1uKCkgJiYgc3RyZWFtLmNvbHVtbigpIDwgbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGggLSAxKSB7CiAgICAgICAgICAvLyB0aGUgJzsnIHRyaWdnZXJzIHRoZSBtYXRjaCBzbyBtb3ZlIG9uZSBwYXN0IGl0IHRvIHN0YXJ0CiAgICAgICAgICAvLyB0aGUgY29tbWVudCBibG9jayB0aGF0IGlzIHdoeSBtYXRjaC5pbmRleCsxCiAgICAgICAgICBzdHJlYW0uYmFja1VwKHN0cmVhbS5jb2x1bW4oKSAtIG1hdGNoLmluZGV4IC0gMSk7CiAgICAgICAgICBzdHJlYW0uc2tpcFRvKCc7Jyk7CiAgICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgICAgcmV0dXJuICdjb21tZW50JzsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoKGNoID09PSAnIicgfHwgY2ggPT09ICInIikgJiYgIXN0YXRlLmNvbnRpbnVlU3RyaW5nKSB7CiAgICAgICAgc3RhdGUuY29udGludWVTdHJpbmcgPSBjaAogICAgICAgIHJldHVybiAic3RyaW5nIgogICAgICB9IGVsc2UgaWYgKHN0YXRlLmNvbnRpbnVlU3RyaW5nKSB7CiAgICAgICAgaWYgKHN0YXRlLmNvbnRpbnVlU3RyaW5nID09IGNoKSB7CiAgICAgICAgICBzdGF0ZS5jb250aW51ZVN0cmluZyA9IG51bGw7CiAgICAgICAgfSBlbHNlIGlmIChzdHJlYW0uc2tpcFRvKHN0YXRlLmNvbnRpbnVlU3RyaW5nKSkgewogICAgICAgICAgLy8gcXVvdGUgZm91bmQgb24gdGhpcyBsaW5lCiAgICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgICAgc3RhdGUuY29udGludWVTdHJpbmcgPSBudWxsOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAic3RyaW5nIjsKICAgICAgfSBlbHNlIGlmIChzdGF0ZS5jb250aW51ZVN0cmluZyAhPT0gbnVsbCAmJiBzdHJlYW0uZW9sKCkpIHsKICAgICAgICBzdHJlYW0uc2tpcFRvKHN0YXRlLmNvbnRpbnVlU3RyaW5nKSB8fCBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgICB9IGVsc2UgaWYgKC9bXGRcLl0vLnRlc3QoY2gpKSB7IC8vZmluZCBudW1iZXJzCiAgICAgICAgaWYgKGNoID09PSAiLiIpCiAgICAgICAgICBzdHJlYW0ubWF0Y2goL15bMC05XSsoW2VFXVtcLStdP1swLTldKyk/Lyk7CiAgICAgICAgZWxzZSBpZiAoY2ggPT09ICIwIikKICAgICAgICAgIHN0cmVhbS5tYXRjaCgvXlt4WF1bMC05YS1mQS1GXSsvKSB8fCBzdHJlYW0ubWF0Y2goL14wWzAtN10rLyk7CiAgICAgICAgZWxzZQogICAgICAgICAgc3RyZWFtLm1hdGNoKC9eWzAtOV0qXC4/WzAtOV0qKFtlRV1bXC0rXT9bMC05XSspPy8pOwogICAgICAgIHJldHVybiAibnVtYmVyIjsKICAgICAgfSBlbHNlIGlmIChpc0RvdWJsZU9wZXJhdG9yQ2hhci50ZXN0KGNoICsgc3RyZWFtLnBlZWsoKSkpIHsgLy8gVFdPIFNZTUJPTCBUT0tFTlMKICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgIHJldHVybiAib3BlcmF0b3IiOwogICAgICB9IGVsc2UgaWYgKGlzRG91YmxlT3BlcmF0b3JTeW0uaGFzT3duUHJvcGVydHkoZG91YmxlT3BlcmF0b3IpKSB7CiAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgICBpZiAoc3RyZWFtLnBlZWsoKSA9PT0gJyAnKQogICAgICAgICAgcmV0dXJuIGlzRG91YmxlT3BlcmF0b3JTeW1bZG91YmxlT3BlcmF0b3IudG9Mb3dlckNhc2UoKV07CiAgICAgIH0gZWxzZSBpZiAoaXNTaW5nbGVPcGVyYXRvckNoYXIudGVzdChjaCkpIHsgLy8gU0lOR0xFIFNZTUJPTCBUT0tFTlMKICAgICAgICByZXR1cm4gIm9wZXJhdG9yIjsKICAgICAgfQoKICAgICAgLy8gTWF0Y2hlcyBvbmUgd2hvbGUgd29yZCAtLSBldmVuIGlmIHRoZSB3b3JkIGlzIGEgY2hhcmFjdGVyCiAgICAgIHZhciB3b3JkOwogICAgICBpZiAoc3RyZWFtLm1hdGNoKC9bJSY7XHddKy8sIGZhbHNlKSAhPSBudWxsKSB7CiAgICAgICAgd29yZCA9IGNoICsgc3RyZWFtLm1hdGNoKC9bJSY7XHddKy8sIHRydWUpOwogICAgICAgIGlmICgvJi8udGVzdCh3b3JkKSkgcmV0dXJuICd2YXJpYWJsZScKICAgICAgfSBlbHNlIHsKICAgICAgICB3b3JkID0gY2g7CiAgICAgIH0KICAgICAgLy8gdGhlIHdvcmQgYWZ0ZXIgREFUQSBQUk9DIG9yIE1BQ1JPCiAgICAgIGlmIChzdGF0ZS5uZXh0d29yZCkgewogICAgICAgIHN0cmVhbS5tYXRjaCgvW1x3XSsvKTsKICAgICAgICAvLyBtYXRjaCBtZW1uYW1lLmxpYm5hbWUKICAgICAgICBpZiAoc3RyZWFtLnBlZWsoKSA9PT0gJy4nKSBzdHJlYW0uc2tpcFRvKCcgJyk7CiAgICAgICAgc3RhdGUubmV4dHdvcmQgPSBmYWxzZTsKICAgICAgICByZXR1cm4gJ3ZhcmlhYmxlLTInOwogICAgICB9CgogICAgICB3b3JkID0gd29yZC50b0xvd2VyQ2FzZSgpCiAgICAgIC8vIEFyZSB3ZSBpbiBhIERBVEEgU3RlcD8KICAgICAgaWYgKHN0YXRlLmluRGF0YVN0ZXApIHsKICAgICAgICBpZiAod29yZCA9PT0gJ3J1bjsnIHx8IHN0cmVhbS5tYXRjaCgvcnVuXHM7LykpIHsKICAgICAgICAgIHN0YXRlLmluRGF0YVN0ZXAgPSBmYWxzZTsKICAgICAgICAgIHJldHVybiAnYnVpbHRpbic7CiAgICAgICAgfQogICAgICAgIC8vIHZhcmlhYmxlIGZvcm1hdHMKICAgICAgICBpZiAoKHdvcmQpICYmIHN0cmVhbS5uZXh0KCkgPT09ICcuJykgewogICAgICAgICAgLy9laXRoZXIgYSBmb3JtYXQgb3IgbGlibmFtZS5tZW1uYW1lCiAgICAgICAgICBpZiAoL1x3Ly50ZXN0KHN0cmVhbS5wZWVrKCkpKSByZXR1cm4gJ3ZhcmlhYmxlLTInOwogICAgICAgICAgZWxzZSByZXR1cm4gJ3ZhcmlhYmxlJzsKICAgICAgICB9CiAgICAgICAgLy8gZG8gd2UgaGF2ZSBhIERBVEEgU3RlcCBrZXl3b3JkCiAgICAgICAgaWYgKHdvcmQgJiYgd29yZHMuaGFzT3duUHJvcGVydHkod29yZCkgJiYKICAgICAgICAgICAgKHdvcmRzW3dvcmRdLnN0YXRlLmluZGV4T2YoImluRGF0YVN0ZXAiKSAhPT0gLTEgfHwKICAgICAgICAgICAgIHdvcmRzW3dvcmRdLnN0YXRlLmluZGV4T2YoIkFMTCIpICE9PSAtMSkpIHsKICAgICAgICAgIC8vYmFja3VwIHRvIHRoZSBzdGFydCBvZiB0aGUgd29yZAogICAgICAgICAgaWYgKHN0cmVhbS5zdGFydCA8IHN0cmVhbS5wb3MpCiAgICAgICAgICAgIHN0cmVhbS5iYWNrVXAoc3RyZWFtLnBvcyAtIHN0cmVhbS5zdGFydCk7CiAgICAgICAgICAvL2FkdmFuY2UgdGhlIGxlbmd0aCBvZiB0aGUgd29yZCBhbmQgcmV0dXJuCiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHdvcmQubGVuZ3RoOyArK2kpIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgICByZXR1cm4gd29yZHNbd29yZF0uc3R5bGU7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8vIEFyZSB3ZSBpbiBhbiBQcm9jIHN0YXRlbWVudD8KICAgICAgaWYgKHN0YXRlLmluUHJvYykgewogICAgICAgIGlmICh3b3JkID09PSAncnVuOycgfHwgd29yZCA9PT0gJ3F1aXQ7JykgewogICAgICAgICAgc3RhdGUuaW5Qcm9jID0gZmFsc2U7CiAgICAgICAgICByZXR1cm4gJ2J1aWx0aW4nOwogICAgICAgIH0KICAgICAgICAvLyBkbyB3ZSBoYXZlIGEgcHJvYyBrZXl3b3JkCiAgICAgICAgaWYgKHdvcmQgJiYgd29yZHMuaGFzT3duUHJvcGVydHkod29yZCkgJiYKICAgICAgICAgICAgKHdvcmRzW3dvcmRdLnN0YXRlLmluZGV4T2YoImluUHJvYyIpICE9PSAtMSB8fAogICAgICAgICAgICAgd29yZHNbd29yZF0uc3RhdGUuaW5kZXhPZigiQUxMIikgIT09IC0xKSkgewogICAgICAgICAgc3RyZWFtLm1hdGNoKC9bXHddKy8pOwogICAgICAgICAgcmV0dXJuIHdvcmRzW3dvcmRdLnN0eWxlOwogICAgICAgIH0KICAgICAgfQogICAgICAvLyBBcmUgd2UgaW4gYSBNYWNybyBzdGF0ZW1lbnQ/CiAgICAgIGlmIChzdGF0ZS5pbk1hY3JvKSB7CiAgICAgICAgaWYgKHdvcmQgPT09ICclbWVuZCcpIHsKICAgICAgICAgIGlmIChzdHJlYW0ucGVlaygpID09PSAnOycpIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgICBzdGF0ZS5pbk1hY3JvID0gZmFsc2U7CiAgICAgICAgICByZXR1cm4gJ2J1aWx0aW4nOwogICAgICAgIH0KICAgICAgICBpZiAod29yZCAmJiB3b3Jkcy5oYXNPd25Qcm9wZXJ0eSh3b3JkKSAmJgogICAgICAgICAgICAod29yZHNbd29yZF0uc3RhdGUuaW5kZXhPZigiaW5NYWNybyIpICE9PSAtMSB8fAogICAgICAgICAgICAgd29yZHNbd29yZF0uc3RhdGUuaW5kZXhPZigiQUxMIikgIT09IC0xKSkgewogICAgICAgICAgc3RyZWFtLm1hdGNoKC9bXHddKy8pOwogICAgICAgICAgcmV0dXJuIHdvcmRzW3dvcmRdLnN0eWxlOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICdhdG9tJzsKICAgICAgfQogICAgICAvLyBEbyB3ZSBoYXZlIEtleXdvcmRzIHNwZWNpZmljIHdvcmRzPwogICAgICBpZiAod29yZCAmJiB3b3Jkcy5oYXNPd25Qcm9wZXJ0eSh3b3JkKSkgewogICAgICAgIC8vIE5lZ2F0ZXMgdGhlIGluaXRpYWwgbmV4dCgpCiAgICAgICAgc3RyZWFtLmJhY2tVcCgxKTsKICAgICAgICAvLyBBY3R1YWxseSBtb3ZlIHRoZSBzdHJlYW0KICAgICAgICBzdHJlYW0ubWF0Y2goL1tcd10rLyk7CiAgICAgICAgaWYgKHdvcmQgPT09ICdkYXRhJyAmJiAvPS8udGVzdChzdHJlYW0ucGVlaygpKSA9PT0gZmFsc2UpIHsKICAgICAgICAgIHN0YXRlLmluRGF0YVN0ZXAgPSB0cnVlOwogICAgICAgICAgc3RhdGUubmV4dHdvcmQgPSB0cnVlOwogICAgICAgICAgcmV0dXJuICdidWlsdGluJzsKICAgICAgICB9CiAgICAgICAgaWYgKHdvcmQgPT09ICdwcm9jJykgewogICAgICAgICAgc3RhdGUuaW5Qcm9jID0gdHJ1ZTsKICAgICAgICAgIHN0YXRlLm5leHR3b3JkID0gdHJ1ZTsKICAgICAgICAgIHJldHVybiAnYnVpbHRpbic7CiAgICAgICAgfQogICAgICAgIGlmICh3b3JkID09PSAnJW1hY3JvJykgewogICAgICAgICAgc3RhdGUuaW5NYWNybyA9IHRydWU7CiAgICAgICAgICBzdGF0ZS5uZXh0d29yZCA9IHRydWU7CiAgICAgICAgICByZXR1cm4gJ2J1aWx0aW4nOwogICAgICAgIH0KICAgICAgICBpZiAoL3RpdGxlWzEtOV0vLnRlc3Qod29yZCkpIHJldHVybiAnZGVmJzsKCiAgICAgICAgaWYgKHdvcmQgPT09ICdmb290bm90ZScpIHsKICAgICAgICAgIHN0cmVhbS5lYXQoL1sxLTldLyk7CiAgICAgICAgICByZXR1cm4gJ2RlZic7CiAgICAgICAgfQoKICAgICAgICAvLyBSZXR1cm5zIHRoZWlyIHZhbHVlIGFzIHN0YXRlIGluIHRoZSBwcmlvciBkZWZpbmUgbWV0aG9kcwogICAgICAgIGlmIChzdGF0ZS5pbkRhdGFTdGVwID09PSB0cnVlICYmIHdvcmRzW3dvcmRdLnN0YXRlLmluZGV4T2YoImluRGF0YVN0ZXAiKSAhPT0gLTEpCiAgICAgICAgICByZXR1cm4gd29yZHNbd29yZF0uc3R5bGU7CiAgICAgICAgaWYgKHN0YXRlLmluUHJvYyA9PT0gdHJ1ZSAmJiB3b3Jkc1t3b3JkXS5zdGF0ZS5pbmRleE9mKCJpblByb2MiKSAhPT0gLTEpCiAgICAgICAgICByZXR1cm4gd29yZHNbd29yZF0uc3R5bGU7CiAgICAgICAgaWYgKHN0YXRlLmluTWFjcm8gPT09IHRydWUgJiYgd29yZHNbd29yZF0uc3RhdGUuaW5kZXhPZigiaW5NYWNybyIpICE9PSAtMSkKICAgICAgICAgIHJldHVybiB3b3Jkc1t3b3JkXS5zdHlsZTsKICAgICAgICBpZiAod29yZHNbd29yZF0uc3RhdGUuaW5kZXhPZigiQUxMIikgIT09IC0xKQogICAgICAgICAgcmV0dXJuIHdvcmRzW3dvcmRdLnN0eWxlOwogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIC8vIFVucmVjb2duaXplZCBzeW50YXgKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgcmV0dXJuIHsKICAgICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24gKCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICBpbkRhdGFTdGVwOiBmYWxzZSwKICAgICAgICAgIGluUHJvYzogZmFsc2UsCiAgICAgICAgICBpbk1hY3JvOiBmYWxzZSwKICAgICAgICAgIG5leHR3b3JkOiBmYWxzZSwKICAgICAgICAgIGNvbnRpbnVlU3RyaW5nOiBudWxsLAogICAgICAgICAgY29udGludWVDb21tZW50OiBmYWxzZQogICAgICAgIH07CiAgICAgIH0sCiAgICAgIHRva2VuOiBmdW5jdGlvbiAoc3RyZWFtLCBzdGF0ZSkgewogICAgICAgIC8vIFN0cmlwIHRoZSBzcGFjZXMsIGJ1dCByZWdleCB3aWxsIGFjY291bnQgZm9yIHRoZW0gZWl0aGVyIHdheQogICAgICAgIGlmIChzdHJlYW0uZWF0U3BhY2UoKSkgcmV0dXJuIG51bGw7CiAgICAgICAgLy8gR28gdGhyb3VnaCB0aGUgbWFpbiBwcm9jZXNzCiAgICAgICAgcmV0dXJuIHRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgICB9LAoKICAgICAgYmxvY2tDb21tZW50U3RhcnQ6ICIvKiIsCiAgICAgIGJsb2NrQ29tbWVudEVuZDogIiovIgogICAgfTsKCiAgfSk7CgogIENvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC94LXNhcyIsICJzYXMiKTsKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/sass/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/sass/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogU2FzcyBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uLy4uL2FkZG9uL2VkaXQvbWF0Y2hicmFja2V0cy5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJzYXNzLmpzIj48L3NjcmlwdD4KPHN0eWxlPi5Db2RlTWlycm9yIHtib3JkZXI6IDFweCBzb2xpZCAjZGRkOyBmb250LXNpemU6MTJweDsgaGVpZ2h0OiA0MDBweH08L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxoMT5Db2RlTWlycm9yPC9oMT48aW1nIGlkPWxvZ28gc3JjPSIuLi8uLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5MYW5ndWFnZSBtb2RlczwvYT4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+U2FzczwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+U2FzcyBtb2RlPC9oMj4KPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4vLyBWYXJpYWJsZSBEZWZpbml0aW9ucwoKJHBhZ2Utd2lkdGg6ICAgIDgwMHB4CiRzaWRlYmFyLXdpZHRoOiAyMDBweAokcHJpbWFyeS1jb2xvcjogI2VlZWVlZQoKLy8gR2xvYmFsIEF0dHJpYnV0ZXMKCmJvZHkKICBmb250OgogICAgZmFtaWx5OiBzYW5zLXNlcmlmCiAgICBzaXplOiAzMGVtCiAgICB3ZWlnaHQ6IGJvbGQKCi8vIFNjb3BlZCBTdHlsZXMKCiNjb250ZW50cwogIHdpZHRoOiAkcGFnZS13aWR0aAogICNzaWRlYmFyCiAgICBmbG9hdDogcmlnaHQKICAgIHdpZHRoOiAkc2lkZWJhci13aWR0aAogICNtYWluCiAgICB3aWR0aDogJHBhZ2Utd2lkdGggLSAkc2lkZWJhci13aWR0aAogICAgYmFja2dyb3VuZDogJHByaW1hcnktY29sb3IKICAgIGgyCiAgICAgIGNvbG9yOiBibHVlCgojZm9vdGVyCiAgaGVpZ2h0OiAyMDBweAo8L3RleHRhcmVhPjwvZm9ybT4KICAgIDxzY3JpcHQ+CiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICAgICAgbGluZU51bWJlcnMgOiB0cnVlLAogICAgICAgIG1hdGNoQnJhY2tldHMgOiB0cnVlCiAgICAgIH0pOwogICAgPC9zY3JpcHQ+CgogICAgPHA+PHN0cm9uZz5NSU1FIHR5cGVzIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPnRleHQveC1zYXNzPC9jb2RlPi48L3A+CiAgPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/sass/sass.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJzYXNzIiwgZnVuY3Rpb24oY29uZmlnKSB7CiAgZnVuY3Rpb24gdG9rZW5SZWdleHAod29yZHMpIHsKICAgIHJldHVybiBuZXcgUmVnRXhwKCJeIiArIHdvcmRzLmpvaW4oInwiKSk7CiAgfQoKICB2YXIga2V5d29yZHMgPSBbInRydWUiLCAiZmFsc2UiLCAibnVsbCIsICJhdXRvIl07CiAgdmFyIGtleXdvcmRzUmVnZXhwID0gbmV3IFJlZ0V4cCgiXiIgKyBrZXl3b3Jkcy5qb2luKCJ8IikpOwoKICB2YXIgb3BlcmF0b3JzID0gWyJcXCgiLCAiXFwpIiwgIj0iLCAiPiIsICI8IiwgIj09IiwgIj49IiwgIjw9IiwgIlxcKyIsICItIiwKICAgICAgICAgICAgICAgICAgICJcXCE9IiwgIi8iLCAiXFwqIiwgIiUiLCAiYW5kIiwgIm9yIiwgIm5vdCIsICI7IiwiXFx7IiwiXFx9IiwiOiJdOwogIHZhciBvcFJlZ2V4cCA9IHRva2VuUmVnZXhwKG9wZXJhdG9ycyk7CgogIHZhciBwc2V1ZG9FbGVtZW50c1JlZ2V4cCA9IC9eOjo/W2EtekEtWl9dW1x3XC1dKi87CgogIGZ1bmN0aW9uIHVybFRva2VucyhzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgY2ggPSBzdHJlYW0ucGVlaygpOwoKICAgIGlmIChjaCA9PT0gIikiKSB7CiAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgIHN0YXRlLnRva2VuaXplciA9IHRva2VuQmFzZTsKICAgICAgcmV0dXJuICJvcGVyYXRvciI7CiAgICB9IGVsc2UgaWYgKGNoID09PSAiKCIpIHsKICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgc3RyZWFtLmVhdFNwYWNlKCk7CgogICAgICByZXR1cm4gIm9wZXJhdG9yIjsKICAgIH0gZWxzZSBpZiAoY2ggPT09ICInIiB8fCBjaCA9PT0gJyInKSB7CiAgICAgIHN0YXRlLnRva2VuaXplciA9IGJ1aWxkU3RyaW5nVG9rZW5pemVyKHN0cmVhbS5uZXh0KCkpOwogICAgICByZXR1cm4gInN0cmluZyI7CiAgICB9IGVsc2UgewogICAgICBzdGF0ZS50b2tlbml6ZXIgPSBidWlsZFN0cmluZ1Rva2VuaXplcigiKSIsIGZhbHNlKTsKICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgfQogIH0KICBmdW5jdGlvbiBjb21tZW50KGluZGVudGF0aW9uLCBtdWx0aUxpbmUpIHsKICAgIHJldHVybiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIGlmIChzdHJlYW0uc29sKCkgJiYgc3RyZWFtLmluZGVudGF0aW9uKCkgPD0gaW5kZW50YXRpb24pIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZXIgPSB0b2tlbkJhc2U7CiAgICAgICAgcmV0dXJuIHRva2VuQmFzZShzdHJlYW0sIHN0YXRlKTsKICAgICAgfQoKICAgICAgaWYgKG11bHRpTGluZSAmJiBzdHJlYW0uc2tpcFRvKCIqLyIpKSB7CiAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgIHN0YXRlLnRva2VuaXplciA9IHRva2VuQmFzZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICAgIH0KCiAgICAgIHJldHVybiAiY29tbWVudCI7CiAgICB9OwogIH0KCiAgZnVuY3Rpb24gYnVpbGRTdHJpbmdUb2tlbml6ZXIocXVvdGUsIGdyZWVkeSkgewogICAgaWYgKGdyZWVkeSA9PSBudWxsKSB7IGdyZWVkeSA9IHRydWU7IH0KCiAgICBmdW5jdGlvbiBzdHJpbmdUb2tlbml6ZXIoc3RyZWFtLCBzdGF0ZSkgewogICAgICB2YXIgbmV4dENoYXIgPSBzdHJlYW0ubmV4dCgpOwogICAgICB2YXIgcGVla0NoYXIgPSBzdHJlYW0ucGVlaygpOwogICAgICB2YXIgcHJldmlvdXNDaGFyID0gc3RyZWFtLnN0cmluZy5jaGFyQXQoc3RyZWFtLnBvcy0yKTsKCiAgICAgIHZhciBlbmRpbmdTdHJpbmcgPSAoKG5leHRDaGFyICE9PSAiXFwiICYmIHBlZWtDaGFyID09PSBxdW90ZSkgfHwgKG5leHRDaGFyID09PSBxdW90ZSAmJiBwcmV2aW91c0NoYXIgIT09ICJcXCIpKTsKCiAgICAgIGlmIChlbmRpbmdTdHJpbmcpIHsKICAgICAgICBpZiAobmV4dENoYXIgIT09IHF1b3RlICYmIGdyZWVkeSkgeyBzdHJlYW0ubmV4dCgpOyB9CiAgICAgICAgc3RhdGUudG9rZW5pemVyID0gdG9rZW5CYXNlOwogICAgICAgIHJldHVybiAic3RyaW5nIjsKICAgICAgfSBlbHNlIGlmIChuZXh0Q2hhciA9PT0gIiMiICYmIHBlZWtDaGFyID09PSAieyIpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZXIgPSBidWlsZEludGVycG9sYXRpb25Ub2tlbml6ZXIoc3RyaW5nVG9rZW5pemVyKTsKICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgIHJldHVybiAib3BlcmF0b3IiOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiAic3RyaW5nIjsKICAgICAgfQogICAgfQoKICAgIHJldHVybiBzdHJpbmdUb2tlbml6ZXI7CiAgfQoKICBmdW5jdGlvbiBidWlsZEludGVycG9sYXRpb25Ub2tlbml6ZXIoY3VycmVudFRva2VuaXplcikgewogICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgaWYgKHN0cmVhbS5wZWVrKCkgPT09ICJ9IikgewogICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgc3RhdGUudG9rZW5pemVyID0gY3VycmVudFRva2VuaXplcjsKICAgICAgICByZXR1cm4gIm9wZXJhdG9yIjsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gdG9rZW5CYXNlKHN0cmVhbSwgc3RhdGUpOwogICAgICB9CiAgICB9OwogIH0KCiAgZnVuY3Rpb24gaW5kZW50KHN0YXRlKSB7CiAgICBpZiAoc3RhdGUuaW5kZW50Q291bnQgPT0gMCkgewogICAgICBzdGF0ZS5pbmRlbnRDb3VudCsrOwogICAgICB2YXIgbGFzdFNjb3BlT2Zmc2V0ID0gc3RhdGUuc2NvcGVzWzBdLm9mZnNldDsKICAgICAgdmFyIGN1cnJlbnRPZmZzZXQgPSBsYXN0U2NvcGVPZmZzZXQgKyBjb25maWcuaW5kZW50VW5pdDsKICAgICAgc3RhdGUuc2NvcGVzLnVuc2hpZnQoeyBvZmZzZXQ6Y3VycmVudE9mZnNldCB9KTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGRlZGVudChzdGF0ZSkgewogICAgaWYgKHN0YXRlLnNjb3Blcy5sZW5ndGggPT0gMSkgcmV0dXJuOwoKICAgIHN0YXRlLnNjb3Blcy5zaGlmdCgpOwogIH0KCiAgZnVuY3Rpb24gdG9rZW5CYXNlKHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBjaCA9IHN0cmVhbS5wZWVrKCk7CgogICAgLy8gQ29tbWVudAogICAgaWYgKHN0cmVhbS5tYXRjaCgiLyoiKSkgewogICAgICBzdGF0ZS50b2tlbml6ZXIgPSBjb21tZW50KHN0cmVhbS5pbmRlbnRhdGlvbigpLCB0cnVlKTsKICAgICAgcmV0dXJuIHN0YXRlLnRva2VuaXplcihzdHJlYW0sIHN0YXRlKTsKICAgIH0KICAgIGlmIChzdHJlYW0ubWF0Y2goIi8vIikpIHsKICAgICAgc3RhdGUudG9rZW5pemVyID0gY29tbWVudChzdHJlYW0uaW5kZW50YXRpb24oKSwgZmFsc2UpOwogICAgICByZXR1cm4gc3RhdGUudG9rZW5pemVyKHN0cmVhbSwgc3RhdGUpOwogICAgfQoKICAgIC8vIEludGVycG9sYXRpb24KICAgIGlmIChzdHJlYW0ubWF0Y2goIiN7IikpIHsKICAgICAgc3RhdGUudG9rZW5pemVyID0gYnVpbGRJbnRlcnBvbGF0aW9uVG9rZW5pemVyKHRva2VuQmFzZSk7CiAgICAgIHJldHVybiAib3BlcmF0b3IiOwogICAgfQoKICAgIC8vIFN0cmluZ3MKICAgIGlmIChjaCA9PT0gJyInIHx8IGNoID09PSAiJyIpIHsKICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgc3RhdGUudG9rZW5pemVyID0gYnVpbGRTdHJpbmdUb2tlbml6ZXIoY2gpOwogICAgICByZXR1cm4gInN0cmluZyI7CiAgICB9CgogICAgaWYoIXN0YXRlLmN1cnNvckhhbGYpey8vIHN0YXRlLmN1cnNvckhhbGYgPT09IDAKICAgIC8vIGZpcnN0IGhhbGYgaS5lLiBiZWZvcmUgOiBmb3Iga2V5LXZhbHVlIHBhaXJzCiAgICAvLyBpbmNsdWRpbmcgc2VsZWN0b3JzCgogICAgICBpZiAoY2ggPT09ICIuIikgewogICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXltcdy1dKy8pKSB7CiAgICAgICAgICBpbmRlbnQoc3RhdGUpOwogICAgICAgICAgcmV0dXJuICJhdG9tIjsKICAgICAgICB9IGVsc2UgaWYgKHN0cmVhbS5wZWVrKCkgPT09ICIjIikgewogICAgICAgICAgaW5kZW50KHN0YXRlKTsKICAgICAgICAgIHJldHVybiAiYXRvbSI7CiAgICAgICAgfQogICAgICB9CgogICAgICBpZiAoY2ggPT09ICIjIikgewogICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgLy8gSUQgc2VsZWN0b3JzCiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXltcdy1dKy8pKSB7CiAgICAgICAgICBpbmRlbnQoc3RhdGUpOwogICAgICAgICAgcmV0dXJuICJhdG9tIjsKICAgICAgICB9CiAgICAgICAgaWYgKHN0cmVhbS5wZWVrKCkgPT09ICIjIikgewogICAgICAgICAgaW5kZW50KHN0YXRlKTsKICAgICAgICAgIHJldHVybiAiYXRvbSI7CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyBWYXJpYWJsZXMKICAgICAgaWYgKGNoID09PSAiJCIpIHsKICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1x3LV0vKTsKICAgICAgICByZXR1cm4gInZhcmlhYmxlLTIiOwogICAgICB9CgogICAgICAvLyBOdW1iZXJzCiAgICAgIGlmIChzdHJlYW0ubWF0Y2goL14tP1swLTlcLl0rLykpCiAgICAgICAgcmV0dXJuICJudW1iZXIiOwoKICAgICAgLy8gVW5pdHMKICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXihweHxlbXxpbilcYi8pKQogICAgICAgIHJldHVybiAidW5pdCI7CgogICAgICBpZiAoc3RyZWFtLm1hdGNoKGtleXdvcmRzUmVnZXhwKSkKICAgICAgICByZXR1cm4gImtleXdvcmQiOwoKICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXnVybC8pICYmIHN0cmVhbS5wZWVrKCkgPT09ICIoIikgewogICAgICAgIHN0YXRlLnRva2VuaXplciA9IHVybFRva2VuczsKICAgICAgICByZXR1cm4gImF0b20iOwogICAgICB9CgogICAgICBpZiAoY2ggPT09ICI9IikgewogICAgICAgIC8vIE1hdGNoIHNob3J0Y3V0IG1peGluIGRlZmluaXRpb24KICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKC9ePVtcdy1dKy8pKSB7CiAgICAgICAgICBpbmRlbnQoc3RhdGUpOwogICAgICAgICAgcmV0dXJuICJtZXRhIjsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGlmIChjaCA9PT0gIisiKSB7CiAgICAgICAgLy8gTWF0Y2ggc2hvcnRjdXQgbWl4aW4gZGVmaW5pdGlvbgogICAgICAgIGlmIChzdHJlYW0ubWF0Y2goL15cK1tcdy1dKy8pKXsKICAgICAgICAgIHJldHVybiAidmFyaWFibGUtMyI7CiAgICAgICAgfQogICAgICB9CgogICAgICBpZihjaCA9PT0gIkAiKXsKICAgICAgICBpZihzdHJlYW0ubWF0Y2goL0BleHRlbmQvKSl7CiAgICAgICAgICBpZighc3RyZWFtLm1hdGNoKC9ccypbXHddLykpCiAgICAgICAgICAgIGRlZGVudChzdGF0ZSk7CiAgICAgICAgfQogICAgICB9CgoKICAgICAgLy8gSW5kZW50IERpcmVjdGl2ZXMKICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXkAoZWxzZSBpZnxpZnxtZWRpYXxlbHNlfGZvcnxlYWNofHdoaWxlfG1peGlufGZ1bmN0aW9uKS8pKSB7CiAgICAgICAgaW5kZW50KHN0YXRlKTsKICAgICAgICByZXR1cm4gIm1ldGEiOwogICAgICB9CgogICAgICAvLyBPdGhlciBEaXJlY3RpdmVzCiAgICAgIGlmIChjaCA9PT0gIkAiKSB7CiAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcdy1dLyk7CiAgICAgICAgcmV0dXJuICJtZXRhIjsKICAgICAgfQoKICAgICAgaWYgKHN0cmVhbS5lYXRXaGlsZSgvW1x3LV0vKSl7CiAgICAgICAgaWYoc3RyZWFtLm1hdGNoKC8gKjogKltcdy1cK1wkIyFcKCInXS8sZmFsc2UpKXsKICAgICAgICAgIHJldHVybiAicHJvcGVydHkiOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmKHN0cmVhbS5tYXRjaCgvICo6LyxmYWxzZSkpewogICAgICAgICAgaW5kZW50KHN0YXRlKTsKICAgICAgICAgIHN0YXRlLmN1cnNvckhhbGYgPSAxOwogICAgICAgICAgcmV0dXJuICJhdG9tIjsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZihzdHJlYW0ubWF0Y2goLyAqLC8sZmFsc2UpKXsKICAgICAgICAgIHJldHVybiAiYXRvbSI7CiAgICAgICAgfQogICAgICAgIGVsc2V7CiAgICAgICAgICBpbmRlbnQoc3RhdGUpOwogICAgICAgICAgcmV0dXJuICJhdG9tIjsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGlmKGNoID09PSAiOiIpewogICAgICAgIGlmIChzdHJlYW0ubWF0Y2gocHNldWRvRWxlbWVudHNSZWdleHApKXsgLy8gY291bGQgYmUgYSBwc2V1ZG8tZWxlbWVudAogICAgICAgICAgcmV0dXJuICJrZXl3b3JkIjsKICAgICAgICB9CiAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgICBzdGF0ZS5jdXJzb3JIYWxmPTE7CiAgICAgICAgcmV0dXJuICJvcGVyYXRvciI7CiAgICAgIH0KCiAgICB9IC8vIGN1cnNvckhhbGY9PT0wIGVuZHMgaGVyZQogICAgZWxzZXsKCiAgICAgIGlmIChjaCA9PT0gIiMiKSB7CiAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgICAvLyBIZXggbnVtYmVycwogICAgICAgIGlmIChzdHJlYW0ubWF0Y2goL1swLTlhLWZBLUZdezZ9fFswLTlhLWZBLUZdezN9LykpewogICAgICAgICAgaWYoIXN0cmVhbS5wZWVrKCkpewogICAgICAgICAgICBzdGF0ZS5jdXJzb3JIYWxmID0gMDsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiAibnVtYmVyIjsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIE51bWJlcnMKICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXi0/WzAtOVwuXSsvKSl7CiAgICAgICAgaWYoIXN0cmVhbS5wZWVrKCkpewogICAgICAgICAgc3RhdGUuY3Vyc29ySGFsZiA9IDA7CiAgICAgICAgfQogICAgICAgIHJldHVybiAibnVtYmVyIjsKICAgICAgfQoKICAgICAgLy8gVW5pdHMKICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXihweHxlbXxpbilcYi8pKXsKICAgICAgICBpZighc3RyZWFtLnBlZWsoKSl7CiAgICAgICAgICBzdGF0ZS5jdXJzb3JIYWxmID0gMDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICJ1bml0IjsKICAgICAgfQoKICAgICAgaWYgKHN0cmVhbS5tYXRjaChrZXl3b3Jkc1JlZ2V4cCkpewogICAgICAgIGlmKCFzdHJlYW0ucGVlaygpKXsKICAgICAgICAgIHN0YXRlLmN1cnNvckhhbGYgPSAwOwogICAgICAgIH0KICAgICAgICByZXR1cm4gImtleXdvcmQiOwogICAgICB9CgogICAgICBpZiAoc3RyZWFtLm1hdGNoKC9edXJsLykgJiYgc3RyZWFtLnBlZWsoKSA9PT0gIigiKSB7CiAgICAgICAgc3RhdGUudG9rZW5pemVyID0gdXJsVG9rZW5zOwogICAgICAgIGlmKCFzdHJlYW0ucGVlaygpKXsKICAgICAgICAgIHN0YXRlLmN1cnNvckhhbGYgPSAwOwogICAgICAgIH0KICAgICAgICByZXR1cm4gImF0b20iOwogICAgICB9CgogICAgICAvLyBWYXJpYWJsZXMKICAgICAgaWYgKGNoID09PSAiJCIpIHsKICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1x3LV0vKTsKICAgICAgICBpZighc3RyZWFtLnBlZWsoKSl7CiAgICAgICAgICBzdGF0ZS5jdXJzb3JIYWxmID0gMDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICJ2YXJpYWJsZS0zIjsKICAgICAgfQoKICAgICAgLy8gYmFuZyBjaGFyYWN0ZXIgZm9yICFpbXBvcnRhbnQsICFkZWZhdWx0LCBldGMuCiAgICAgIGlmIChjaCA9PT0gIiEiKSB7CiAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgICBpZighc3RyZWFtLnBlZWsoKSl7CiAgICAgICAgICBzdGF0ZS5jdXJzb3JIYWxmID0gMDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHN0cmVhbS5tYXRjaCgvXltcd10rLykgPyAia2V5d29yZCI6ICJvcGVyYXRvciI7CiAgICAgIH0KCiAgICAgIGlmIChzdHJlYW0ubWF0Y2gob3BSZWdleHApKXsKICAgICAgICBpZighc3RyZWFtLnBlZWsoKSl7CiAgICAgICAgICBzdGF0ZS5jdXJzb3JIYWxmID0gMDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICJvcGVyYXRvciI7CiAgICAgIH0KCiAgICAgIC8vIGF0dHJpYnV0ZXMKICAgICAgaWYgKHN0cmVhbS5lYXRXaGlsZSgvW1x3LV0vKSkgewogICAgICAgIGlmKCFzdHJlYW0ucGVlaygpKXsKICAgICAgICAgIHN0YXRlLmN1cnNvckhhbGYgPSAwOwogICAgICAgIH0KICAgICAgICByZXR1cm4gImF0dHJpYnV0ZSI7CiAgICAgIH0KCiAgICAgIC8vc3RyZWFtLmVhdFNwYWNlKCk7CiAgICAgIGlmKCFzdHJlYW0ucGVlaygpKXsKICAgICAgICBzdGF0ZS5jdXJzb3JIYWxmID0gMDsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQoKICAgIH0gLy8gZWxzZSBlbmRzIGhlcmUKCiAgICBpZiAoc3RyZWFtLm1hdGNoKG9wUmVnZXhwKSkKICAgICAgcmV0dXJuICJvcGVyYXRvciI7CgogICAgLy8gSWYgd2UgaGF2ZW4ndCByZXR1cm5lZCBieSBub3csIHdlIG1vdmUgMSBjaGFyYWN0ZXIKICAgIC8vIGFuZCByZXR1cm4gYW4gZXJyb3IKICAgIHN0cmVhbS5uZXh0KCk7CiAgICByZXR1cm4gbnVsbDsKICB9CgogIGZ1bmN0aW9uIHRva2VuTGV4ZXIoc3RyZWFtLCBzdGF0ZSkgewogICAgaWYgKHN0cmVhbS5zb2woKSkgc3RhdGUuaW5kZW50Q291bnQgPSAwOwogICAgdmFyIHN0eWxlID0gc3RhdGUudG9rZW5pemVyKHN0cmVhbSwgc3RhdGUpOwogICAgdmFyIGN1cnJlbnQgPSBzdHJlYW0uY3VycmVudCgpOwoKICAgIGlmIChjdXJyZW50ID09PSAiQHJldHVybiIgfHwgY3VycmVudCA9PT0gIn0iKXsKICAgICAgZGVkZW50KHN0YXRlKTsKICAgIH0KCiAgICBpZiAoc3R5bGUgIT09IG51bGwpIHsKICAgICAgdmFyIHN0YXJ0T2ZUb2tlbiA9IHN0cmVhbS5wb3MgLSBjdXJyZW50Lmxlbmd0aDsKCiAgICAgIHZhciB3aXRoQ3VycmVudEluZGVudCA9IHN0YXJ0T2ZUb2tlbiArIChjb25maWcuaW5kZW50VW5pdCAqIHN0YXRlLmluZGVudENvdW50KTsKCiAgICAgIHZhciBuZXdTY29wZXMgPSBbXTsKCiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RhdGUuc2NvcGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgdmFyIHNjb3BlID0gc3RhdGUuc2NvcGVzW2ldOwoKICAgICAgICBpZiAoc2NvcGUub2Zmc2V0IDw9IHdpdGhDdXJyZW50SW5kZW50KQogICAgICAgICAgbmV3U2NvcGVzLnB1c2goc2NvcGUpOwogICAgICB9CgogICAgICBzdGF0ZS5zY29wZXMgPSBuZXdTY29wZXM7CiAgICB9CgoKICAgIHJldHVybiBzdHlsZTsKICB9CgogIHJldHVybiB7CiAgICBzdGFydFN0YXRlOiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICB0b2tlbml6ZXI6IHRva2VuQmFzZSwKICAgICAgICBzY29wZXM6IFt7b2Zmc2V0OiAwLCB0eXBlOiAic2FzcyJ9XSwKICAgICAgICBpbmRlbnRDb3VudDogMCwKICAgICAgICBjdXJzb3JIYWxmOiAwLCAgLy8gY3Vyc29yIGhhbGYgdGVsbHMgdXMgaWYgY3Vyc29yIGxpZXMgYWZ0ZXIgKDEpCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yIGJlZm9yZSAoMCkgY29sb24gKHdlbGwuLi4gbW9yZSBvciBsZXNzKQogICAgICAgIGRlZmluZWRWYXJzOiBbXSwKICAgICAgICBkZWZpbmVkTWl4aW5zOiBbXQogICAgICB9OwogICAgfSwKICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHZhciBzdHlsZSA9IHRva2VuTGV4ZXIoc3RyZWFtLCBzdGF0ZSk7CgogICAgICBzdGF0ZS5sYXN0VG9rZW4gPSB7IHN0eWxlOiBzdHlsZSwgY29udGVudDogc3RyZWFtLmN1cnJlbnQoKSB9OwoKICAgICAgcmV0dXJuIHN0eWxlOwogICAgfSwKCiAgICBpbmRlbnQ6IGZ1bmN0aW9uKHN0YXRlKSB7CiAgICAgIHJldHVybiBzdGF0ZS5zY29wZXNbMF0ub2Zmc2V0OwogICAgfQogIH07Cn0pOwoKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtc2FzcyIsICJzYXNzIik7Cgp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/scheme/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/scheme/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogU2NoZW1lIG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0ic2NoZW1lLmpzIj48L3NjcmlwdD4KPHN0eWxlPi5Db2RlTWlycm9yIHtiYWNrZ3JvdW5kOiAjZjhmOGY4O308L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxoMT5Db2RlTWlycm9yPC9oMT48aW1nIGlkPWxvZ28gc3JjPSIuLi8uLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5MYW5ndWFnZSBtb2RlczwvYT4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+U2NoZW1lPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5TY2hlbWUgbW9kZTwvaDI+Cjxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+CjsgU2VlIGlmIHRoZSBpbnB1dCBzdGFydHMgd2l0aCBhIGdpdmVuIHN5bWJvbC4KKGRlZmluZSAobWF0Y2gtc3ltYm9sIGlucHV0IHBhdHRlcm4pCiAgKGNvbmQgKChudWxsPyAocmVtYWluIGlucHV0KSkgI2YpCgkoKGVxdj8gKGNhciAocmVtYWluIGlucHV0KSkgcGF0dGVybikgKHItY2RyIGlucHV0KSkKCShlbHNlICNmKSkpCgo7IEFsbG93IHRoZSBpbnB1dCB0byBzdGFydCB3aXRoIG9uZSBvZiBhIGxpc3Qgb2YgcGF0dGVybnMuCihkZWZpbmUgKG1hdGNoLW9yIGlucHV0IHBhdHRlcm4pCiAgKGNvbmQgKChudWxsPyBwYXR0ZXJuKSAjZikKCSgobWF0Y2gtcGF0dGVybiBpbnB1dCAoY2FyIHBhdHRlcm4pKSkKCShlbHNlIChtYXRjaC1vciBpbnB1dCAoY2RyIHBhdHRlcm4pKSkpKQoKOyBBbGxvdyBhIHNlcXVlbmNlIG9mIHBhdHRlcm5zLgooZGVmaW5lIChtYXRjaC1zZXEgaW5wdXQgcGF0dGVybikKICAoaWYgKG51bGw/IHBhdHRlcm4pCiAgICAgIGlucHV0CiAgICAgIChsZXQgKChtYXRjaCAobWF0Y2gtcGF0dGVybiBpbnB1dCAoY2FyIHBhdHRlcm4pKSkpCgkoaWYgbWF0Y2ggKG1hdGNoLXNlcSBtYXRjaCAoY2RyIHBhdHRlcm4pKSAjZikpKSkKCjsgTWF0Y2ggd2l0aCB0aGUgcGF0dGVybiBidXQgbm8gcHJvYmxlbSBpZiBpdCBkb2VzIG5vdCBtYXRjaC4KKGRlZmluZSAobWF0Y2gtb3B0IGlucHV0IHBhdHRlcm4pCiAgKGxldCAoKG1hdGNoIChtYXRjaC1wYXR0ZXJuIGlucHV0IChjYXIgcGF0dGVybikpKSkKICAgIChpZiBtYXRjaCBtYXRjaCBpbnB1dCkpKQoKOyBNYXRjaCBhbnl0aGluZyAob3RoZXIgdGhhbiAnKCkpLCB1bnRpbCBwYXR0ZXJuIGlzIGZvdW5kLiBUaGUgcmF0aGVyCjsgY2x1bXN5IGZvcm0gb2YgcmVxdWlyaW5nIGFuIGVuZGluZyBwYXR0ZXJuIGlzIG5lZWRlZCB0byBkZWNpZGUgd2hlcmUKOyB0aGUgZW5kIG9mIHRoZSBtYXRjaCBpcy4gSWYgbm9uZSBpcyBnaXZlbiwgdGhpcyB3aWxsIG1hdGNoIHRoZSByZXN0Cjsgb2YgdGhlIHNlbnRlbmNlLgooZGVmaW5lIChtYXRjaC1hbnkgaW5wdXQgcGF0dGVybikKICAoY29uZCAoKG51bGw/IChyZW1haW4gaW5wdXQpKSAjZikKCSgobnVsbD8gcGF0dGVybikgKGYtY29ucyAocmVtYWluIGlucHV0KSAoY2xlYXItcmVtYWluIGlucHV0KSkpCgkoZWxzZQoJIChsZXQgKChhY2N1bS1hbnkgKGNvbGxlY3RvcikpKQoJICAgKGRlZmluZSAobWF0Y2gtcGF0dGVybi1hbnkgaW5wdXQgcGF0dGVybikKCSAgICAgKGNvbmQgKChudWxsPyAocmVtYWluIGlucHV0KSkgI2YpCgkJICAgKGVsc2UgKGFjY3VtLWFueSAoY2FyIChyZW1haW4gaW5wdXQpKSkKCQkJIChjb25kICgobWF0Y2gtcGF0dGVybiAoci1jZHIgaW5wdXQpIHBhdHRlcm4pKQoJCQkgICAgICAgKGVsc2UgKG1hdGNoLXBhdHRlcm4tYW55IChyLWNkciBpbnB1dCkgcGF0dGVybikpKSkpKQoJICAgKGxldCAoKHJldHZhbCAobWF0Y2gtcGF0dGVybi1hbnkgaW5wdXQgKGNhciBwYXR0ZXJuKSkpKQoJICAgICAoaWYgcmV0dmFsCgkJIChmLWNvbnMgKGFjY3VtLWFueSkgcmV0dmFsKQoJCSAjZikpKSkpKQo8L3RleHRhcmVhPjwvZm9ybT4KICAgIDxzY3JpcHQ+CiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7fSk7CiAgICA8L3NjcmlwdD4KCiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC94LXNjaGVtZTwvY29kZT4uPC9wPgoKICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/scheme/scheme.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovKioKICogQXV0aG9yOiBLb2ggWmkgSGFuLCBiYXNlZCBvbiBpbXBsZW1lbnRhdGlvbiBieSBLb2ggWmkgQ2h1bgogKi8KCihmdW5jdGlvbihtb2QpIHsKICBpZiAodHlwZW9mIGV4cG9ydHMgPT0gIm9iamVjdCIgJiYgdHlwZW9mIG1vZHVsZSA9PSAib2JqZWN0IikgLy8gQ29tbW9uSlMKICAgIG1vZChyZXF1aXJlKCIuLi8uLi9saWIvY29kZW1pcnJvciIpKTsKICBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCkgLy8gQU1ECiAgICBkZWZpbmUoWyIuLi8uLi9saWIvY29kZW1pcnJvciJdLCBtb2QpOwogIGVsc2UgLy8gUGxhaW4gYnJvd3NlciBlbnYKICAgIG1vZChDb2RlTWlycm9yKTsKfSkoZnVuY3Rpb24oQ29kZU1pcnJvcikgewoidXNlIHN0cmljdCI7CgpDb2RlTWlycm9yLmRlZmluZU1vZGUoInNjaGVtZSIsIGZ1bmN0aW9uICgpIHsKICAgIHZhciBCVUlMVElOID0gImJ1aWx0aW4iLCBDT01NRU5UID0gImNvbW1lbnQiLCBTVFJJTkcgPSAic3RyaW5nIiwKICAgICAgICBBVE9NID0gImF0b20iLCBOVU1CRVIgPSAibnVtYmVyIiwgQlJBQ0tFVCA9ICJicmFja2V0IjsKICAgIHZhciBJTkRFTlRfV09SRF9TS0lQID0gMjsKCiAgICBmdW5jdGlvbiBtYWtlS2V5d29yZHMoc3RyKSB7CiAgICAgICAgdmFyIG9iaiA9IHt9LCB3b3JkcyA9IHN0ci5zcGxpdCgiICIpOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgd29yZHMubGVuZ3RoOyArK2kpIG9ialt3b3Jkc1tpXV0gPSB0cnVlOwogICAgICAgIHJldHVybiBvYmo7CiAgICB9CgogICAgdmFyIGtleXdvcmRzID0gbWFrZUtleXdvcmRzKCLOuyBjYXNlLWxhbWJkYSBjYWxsL2NjIGNsYXNzIGRlZmluZS1jbGFzcyBleGl0LWhhbmRsZXIgZmllbGQgaW1wb3J0IGluaGVyaXQgaW5pdC1maWVsZCBpbnRlcmZhY2UgbGV0Ki12YWx1ZXMgbGV0LXZhbHVlcyBsZXQvZWMgbWl4aW4gb3B0LWxhbWJkYSBvdmVycmlkZSBwcm90ZWN0IHByb3ZpZGUgcHVibGljIHJlbmFtZSByZXF1aXJlIHJlcXVpcmUtZm9yLXN5bnRheCBzeW50YXggc3ludGF4LWNhc2Ugc3ludGF4LWVycm9yIHVuaXQvc2lnIHVubGVzcyB3aGVuIHdpdGgtc3ludGF4IGFuZCBiZWdpbiBjYWxsLXdpdGgtY3VycmVudC1jb250aW51YXRpb24gY2FsbC13aXRoLWlucHV0LWZpbGUgY2FsbC13aXRoLW91dHB1dC1maWxlIGNhc2UgY29uZCBkZWZpbmUgZGVmaW5lLXN5bnRheCBkZWxheSBkbyBkeW5hbWljLXdpbmQgZWxzZSBmb3ItZWFjaCBpZiBsYW1iZGEgbGV0IGxldCogbGV0LXN5bnRheCBsZXRyZWMgbGV0cmVjLXN5bnRheCBtYXAgb3Igc3ludGF4LXJ1bGVzIGFicyBhY29zIGFuZ2xlIGFwcGVuZCBhcHBseSBhc2luIGFzc29jIGFzc3EgYXNzdiBhdGFuIGJvb2xlYW4/IGNhYXIgY2FkciBjYWxsLXdpdGgtaW5wdXQtZmlsZSBjYWxsLXdpdGgtb3V0cHV0LWZpbGUgY2FsbC13aXRoLXZhbHVlcyBjYXIgY2RkZGFyIGNkZGRkciBjZHIgY2VpbGluZyBjaGFyLT5pbnRlZ2VyIGNoYXItYWxwaGFiZXRpYz8gY2hhci1jaTw9PyBjaGFyLWNpPD8gY2hhci1jaT0/IGNoYXItY2k+PT8gY2hhci1jaT4/IGNoYXItZG93bmNhc2UgY2hhci1sb3dlci1jYXNlPyBjaGFyLW51bWVyaWM/IGNoYXItcmVhZHk/IGNoYXItdXBjYXNlIGNoYXItdXBwZXItY2FzZT8gY2hhci13aGl0ZXNwYWNlPyBjaGFyPD0/IGNoYXI8PyBjaGFyPT8gY2hhcj49PyBjaGFyPj8gY2hhcj8gY2xvc2UtaW5wdXQtcG9ydCBjbG9zZS1vdXRwdXQtcG9ydCBjb21wbGV4PyBjb25zIGNvcyBjdXJyZW50LWlucHV0LXBvcnQgY3VycmVudC1vdXRwdXQtcG9ydCBkZW5vbWluYXRvciBkaXNwbGF5IGVvZi1vYmplY3Q/IGVxPyBlcXVhbD8gZXF2PyBldmFsIGV2ZW4/IGV4YWN0LT5pbmV4YWN0IGV4YWN0PyBleHAgZXhwdCAjZiBmbG9vciBmb3JjZSBnY2QgaW1hZy1wYXJ0IGluZXhhY3QtPmV4YWN0IGluZXhhY3Q/IGlucHV0LXBvcnQ/IGludGVnZXItPmNoYXIgaW50ZWdlcj8gaW50ZXJhY3Rpb24tZW52aXJvbm1lbnQgbGNtIGxlbmd0aCBsaXN0IGxpc3QtPnN0cmluZyBsaXN0LT52ZWN0b3IgbGlzdC1yZWYgbGlzdC10YWlsIGxpc3Q/IGxvYWQgbG9nIG1hZ25pdHVkZSBtYWtlLXBvbGFyIG1ha2UtcmVjdGFuZ3VsYXIgbWFrZS1zdHJpbmcgbWFrZS12ZWN0b3IgbWF4IG1lbWJlciBtZW1xIG1lbXYgbWluIG1vZHVsbyBuZWdhdGl2ZT8gbmV3bGluZSBub3QgbnVsbC1lbnZpcm9ubWVudCBudWxsPyBudW1iZXItPnN0cmluZyBudW1iZXI/IG51bWVyYXRvciBvZGQ/IG9wZW4taW5wdXQtZmlsZSBvcGVuLW91dHB1dC1maWxlIG91dHB1dC1wb3J0PyBwYWlyPyBwZWVrLWNoYXIgcG9ydD8gcG9zaXRpdmU/IHByb2NlZHVyZT8gcXVhc2lxdW90ZSBxdW90ZSBxdW90aWVudCByYXRpb25hbD8gcmF0aW9uYWxpemUgcmVhZCByZWFkLWNoYXIgcmVhbC1wYXJ0IHJlYWw/IHJlbWFpbmRlciByZXZlcnNlIHJvdW5kIHNjaGVtZS1yZXBvcnQtZW52aXJvbm1lbnQgc2V0ISBzZXQtY2FyISBzZXQtY2RyISBzaW4gc3FydCBzdHJpbmcgc3RyaW5nLT5saXN0IHN0cmluZy0+bnVtYmVyIHN0cmluZy0+c3ltYm9sIHN0cmluZy1hcHBlbmQgc3RyaW5nLWNpPD0/IHN0cmluZy1jaTw/IHN0cmluZy1jaT0/IHN0cmluZy1jaT49PyBzdHJpbmctY2k+PyBzdHJpbmctY29weSBzdHJpbmctZmlsbCEgc3RyaW5nLWxlbmd0aCBzdHJpbmctcmVmIHN0cmluZy1zZXQhIHN0cmluZzw9PyBzdHJpbmc8PyBzdHJpbmc9PyBzdHJpbmc+PT8gc3RyaW5nPj8gc3RyaW5nPyBzdWJzdHJpbmcgc3ltYm9sLT5zdHJpbmcgc3ltYm9sPyAjdCB0YW4gdHJhbnNjcmlwdC1vZmYgdHJhbnNjcmlwdC1vbiB0cnVuY2F0ZSB2YWx1ZXMgdmVjdG9yIHZlY3Rvci0+bGlzdCB2ZWN0b3ItZmlsbCEgdmVjdG9yLWxlbmd0aCB2ZWN0b3ItcmVmIHZlY3Rvci1zZXQhIHdpdGgtaW5wdXQtZnJvbS1maWxlIHdpdGgtb3V0cHV0LXRvLWZpbGUgd3JpdGUgd3JpdGUtY2hhciB6ZXJvPyIpOwogICAgdmFyIGluZGVudEtleXMgPSBtYWtlS2V5d29yZHMoImRlZmluZSBsZXQgbGV0cmVjIGxldCogbGFtYmRhIik7CgogICAgZnVuY3Rpb24gc3RhdGVTdGFjayhpbmRlbnQsIHR5cGUsIHByZXYpIHsgLy8gcmVwcmVzZW50cyBhIHN0YXRlIHN0YWNrIG9iamVjdAogICAgICAgIHRoaXMuaW5kZW50ID0gaW5kZW50OwogICAgICAgIHRoaXMudHlwZSA9IHR5cGU7CiAgICAgICAgdGhpcy5wcmV2ID0gcHJldjsKICAgIH0KCiAgICBmdW5jdGlvbiBwdXNoU3RhY2soc3RhdGUsIGluZGVudCwgdHlwZSkgewogICAgICAgIHN0YXRlLmluZGVudFN0YWNrID0gbmV3IHN0YXRlU3RhY2soaW5kZW50LCB0eXBlLCBzdGF0ZS5pbmRlbnRTdGFjayk7CiAgICB9CgogICAgZnVuY3Rpb24gcG9wU3RhY2soc3RhdGUpIHsKICAgICAgICBzdGF0ZS5pbmRlbnRTdGFjayA9IHN0YXRlLmluZGVudFN0YWNrLnByZXY7CiAgICB9CgogICAgdmFyIGJpbmFyeU1hdGNoZXIgPSBuZXcgUmVnRXhwKC9eKD86Wy0rXWl8Wy0rXVswMV0rIyooPzpcL1swMV0rIyopP2l8Wy0rXT9bMDFdKyMqKD86XC9bMDFdKyMqKT9AWy0rXT9bMDFdKyMqKD86XC9bMDFdKyMqKT98Wy0rXT9bMDFdKyMqKD86XC9bMDFdKyMqKT9bLStdKD86WzAxXSsjKig/OlwvWzAxXSsjKik/KT9pfFstK10/WzAxXSsjKig/OlwvWzAxXSsjKik/KSg/PVsoKVxzOyJdfCQpL2kpOwogICAgdmFyIG9jdGFsTWF0Y2hlciA9IG5ldyBSZWdFeHAoL14oPzpbLStdaXxbLStdWzAtN10rIyooPzpcL1swLTddKyMqKT9pfFstK10/WzAtN10rIyooPzpcL1swLTddKyMqKT9AWy0rXT9bMC03XSsjKig/OlwvWzAtN10rIyopP3xbLStdP1swLTddKyMqKD86XC9bMC03XSsjKik/Wy0rXSg/OlswLTddKyMqKD86XC9bMC03XSsjKik/KT9pfFstK10/WzAtN10rIyooPzpcL1swLTddKyMqKT8pKD89WygpXHM7Il18JCkvaSk7CiAgICB2YXIgaGV4TWF0Y2hlciA9IG5ldyBSZWdFeHAoL14oPzpbLStdaXxbLStdW1xkYS1mXSsjKig/OlwvW1xkYS1mXSsjKik/aXxbLStdP1tcZGEtZl0rIyooPzpcL1tcZGEtZl0rIyopP0BbLStdP1tcZGEtZl0rIyooPzpcL1tcZGEtZl0rIyopP3xbLStdP1tcZGEtZl0rIyooPzpcL1tcZGEtZl0rIyopP1stK10oPzpbXGRhLWZdKyMqKD86XC9bXGRhLWZdKyMqKT8pP2l8Wy0rXT9bXGRhLWZdKyMqKD86XC9bXGRhLWZdKyMqKT8pKD89WygpXHM7Il18JCkvaSk7CiAgICB2YXIgZGVjaW1hbE1hdGNoZXIgPSBuZXcgUmVnRXhwKC9eKD86Wy0rXWl8Wy0rXSg/Oig/Oig/OlxkKyMrXC4/Iyp8XGQrXC5cZCojKnxcLlxkKyMqfFxkKykoPzpbZXNmZGxdWy0rXT9cZCspPyl8XGQrIypcL1xkKyMqKWl8Wy0rXT8oPzooPzooPzpcZCsjK1wuPyMqfFxkK1wuXGQqIyp8XC5cZCsjKnxcZCspKD86W2VzZmRsXVstK10/XGQrKT8pfFxkKyMqXC9cZCsjKilAWy0rXT8oPzooPzooPzpcZCsjK1wuPyMqfFxkK1wuXGQqIyp8XC5cZCsjKnxcZCspKD86W2VzZmRsXVstK10/XGQrKT8pfFxkKyMqXC9cZCsjKil8Wy0rXT8oPzooPzooPzpcZCsjK1wuPyMqfFxkK1wuXGQqIyp8XC5cZCsjKnxcZCspKD86W2VzZmRsXVstK10/XGQrKT8pfFxkKyMqXC9cZCsjKilbLStdKD86KD86KD86XGQrIytcLj8jKnxcZCtcLlxkKiMqfFwuXGQrIyp8XGQrKSg/Oltlc2ZkbF1bLStdP1xkKyk/KXxcZCsjKlwvXGQrIyopP2l8KD86KD86KD86XGQrIytcLj8jKnxcZCtcLlxkKiMqfFwuXGQrIyp8XGQrKSg/Oltlc2ZkbF1bLStdP1xkKyk/KXxcZCsjKlwvXGQrIyopKSg/PVsoKVxzOyJdfCQpL2kpOwoKICAgIGZ1bmN0aW9uIGlzQmluYXJ5TnVtYmVyIChzdHJlYW0pIHsKICAgICAgICByZXR1cm4gc3RyZWFtLm1hdGNoKGJpbmFyeU1hdGNoZXIpOwogICAgfQoKICAgIGZ1bmN0aW9uIGlzT2N0YWxOdW1iZXIgKHN0cmVhbSkgewogICAgICAgIHJldHVybiBzdHJlYW0ubWF0Y2gob2N0YWxNYXRjaGVyKTsKICAgIH0KCiAgICBmdW5jdGlvbiBpc0RlY2ltYWxOdW1iZXIgKHN0cmVhbSwgYmFja3VwKSB7CiAgICAgICAgaWYgKGJhY2t1cCA9PT0gdHJ1ZSkgewogICAgICAgICAgICBzdHJlYW0uYmFja1VwKDEpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc3RyZWFtLm1hdGNoKGRlY2ltYWxNYXRjaGVyKTsKICAgIH0KCiAgICBmdW5jdGlvbiBpc0hleE51bWJlciAoc3RyZWFtKSB7CiAgICAgICAgcmV0dXJuIHN0cmVhbS5tYXRjaChoZXhNYXRjaGVyKTsKICAgIH0KCiAgICByZXR1cm4gewogICAgICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGluZGVudFN0YWNrOiBudWxsLAogICAgICAgICAgICAgICAgaW5kZW50YXRpb246IDAsCiAgICAgICAgICAgICAgICBtb2RlOiBmYWxzZSwKICAgICAgICAgICAgICAgIHNFeHByQ29tbWVudDogZmFsc2UKICAgICAgICAgICAgfTsKICAgICAgICB9LAoKICAgICAgICB0b2tlbjogZnVuY3Rpb24gKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgICAgICAgaWYgKHN0YXRlLmluZGVudFN0YWNrID09IG51bGwgJiYgc3RyZWFtLnNvbCgpKSB7CiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgaW5kZW50YXRpb24sIGJ1dCBvbmx5IGlmIGluZGVudFN0YWNrIGlzIGVtcHR5CiAgICAgICAgICAgICAgICBzdGF0ZS5pbmRlbnRhdGlvbiA9IHN0cmVhbS5pbmRlbnRhdGlvbigpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBza2lwIHNwYWNlcwogICAgICAgICAgICBpZiAoc3RyZWFtLmVhdFNwYWNlKCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciByZXR1cm5UeXBlID0gbnVsbDsKCiAgICAgICAgICAgIHN3aXRjaChzdGF0ZS5tb2RlKXsKICAgICAgICAgICAgICAgIGNhc2UgInN0cmluZyI6IC8vIG11bHRpLWxpbmUgc3RyaW5nIHBhcnNpbmcgbW9kZQogICAgICAgICAgICAgICAgICAgIHZhciBuZXh0LCBlc2NhcGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKChuZXh0ID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV4dCA9PSAiXCIiICYmICFlc2NhcGVkKSB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZXNjYXBlZCA9ICFlc2NhcGVkICYmIG5leHQgPT0gIlxcIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuVHlwZSA9IFNUUklORzsgLy8gY29udGludWUgb24gaW4gc2NoZW1lLXN0cmluZyBtb2RlCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICJjb21tZW50IjogLy8gY29tbWVudCBwYXJzaW5nIG1vZGUKICAgICAgICAgICAgICAgICAgICB2YXIgbmV4dCwgbWF5YmVFbmQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKG5leHQgPSBzdHJlYW0ubmV4dCgpKSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXh0ID09ICIjIiAmJiBtYXliZUVuZCkgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIG1heWJlRW5kID0gKG5leHQgPT0gInwiKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuVHlwZSA9IENPTU1FTlQ7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICJzLWV4cHItY29tbWVudCI6IC8vIHMtZXhwciBjb21tZW50aW5nIG1vZGUKICAgICAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgaWYoc3RyZWFtLnBlZWsoKSA9PSAiKCIgfHwgc3RyZWFtLnBlZWsoKSA9PSAiWyIpewogICAgICAgICAgICAgICAgICAgICAgICAvLyBhY3R1YWxseSBzdGFydCBzY2hlbWUgcy1leHByIGNvbW1lbnRpbmcgbW9kZQogICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5zRXhwckNvbW1lbnQgPSAwOwogICAgICAgICAgICAgICAgICAgIH1lbHNlewogICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBub3Qgd2UganVzdCBjb21tZW50IHRoZSBlbnRpcmUgb2YgdGhlIG5leHQgdG9rZW4KICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXi9zXS8pOyAvLyBlYXQgbm9uIHNwYWNlcwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5UeXBlID0gQ09NTUVOVDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZGVmYXVsdDogLy8gZGVmYXVsdCBwYXJzaW5nIG1vZGUKICAgICAgICAgICAgICAgICAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpOwoKICAgICAgICAgICAgICAgICAgICBpZiAoY2ggPT0gIlwiIikgewogICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gInN0cmluZyI7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblR5cGUgPSBTVFJJTkc7CgogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gIiciKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblR5cGUgPSBBVE9NOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJyMnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW0uZWF0KCJ8IikpIHsgICAgICAgICAgICAgICAgICAgIC8vIE11bHRpLWxpbmUgY29tbWVudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUubW9kZSA9ICJjb21tZW50IjsgLy8gdG9nZ2xlIHRvIGNvbW1lbnQgbW9kZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVHlwZSA9IENPTU1FTlQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLmVhdCgvW3RmXS9pKSkgeyAgICAgICAgICAgIC8vICN0LyNmIChhdG9tKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVHlwZSA9IEFUT007CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLmVhdCgnOycpKSB7ICAgICAgICAgICAgICAgIC8vIFMtRXhwciBjb21tZW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gInMtZXhwci1jb21tZW50IjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblR5cGUgPSBDT01NRU5UOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG51bVRlc3QgPSBudWxsLCBoYXNFeGFjdG5lc3MgPSBmYWxzZSwgaGFzUmFkaXggPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbS5lYXQoL1tlaV0vaSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNFeGFjdG5lc3MgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0uYmFja1VwKDEpOyAgICAgICAvLyBtdXN0IGJlIHJhZGl4IHNwZWNpZmllcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXiNiL2kpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtVGVzdCA9IGlzQmluYXJ5TnVtYmVyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJlYW0ubWF0Y2goL14jby9pKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bVRlc3QgPSBpc09jdGFsTnVtYmVyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJlYW0ubWF0Y2goL14jeC9pKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bVRlc3QgPSBpc0hleE51bWJlcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLm1hdGNoKC9eI2QvaSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1UZXN0ID0gaXNEZWNpbWFsTnVtYmVyOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJlYW0ubWF0Y2goL15bLSswLTkuXS8sIGZhbHNlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1JhZGl4ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtVGVzdCA9IGlzRGVjaW1hbE51bWJlcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlLWNvbnN1bWUgdGhlIGludGlhbCAjIGlmIGFsbCBtYXRjaGVzIGZhaWxlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghaGFzRXhhY3RuZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLmVhdCgnIycpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bVRlc3QgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYXNSYWRpeCAmJiAhaGFzRXhhY3RuZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnN1bWUgb3B0aW9uYWwgZXhhY3RuZXNzIGFmdGVyIHJhZGl4CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5tYXRjaCgvXiNbZWldL2kpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobnVtVGVzdChzdHJlYW0pKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5UeXBlID0gTlVNQkVSOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgvXlstKzAtOS5dLy50ZXN0KGNoKSAmJiBpc0RlY2ltYWxOdW1iZXIoc3RyZWFtLCB0cnVlKSkgeyAvLyBtYXRjaCBub24tcHJlZml4ZWQgbnVtYmVyLCBtdXN0IGJlIGRlY2ltYWwKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVHlwZSA9IE5VTUJFUjsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICI7IikgeyAvLyBjb21tZW50CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsgLy8gcmVzdCBvZiB0aGUgbGluZSBpcyBhIGNvbW1lbnQKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVHlwZSA9IENPTU1FTlQ7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAiKCIgfHwgY2ggPT0gIlsiKSB7CiAgICAgICAgICAgICAgICAgICAgICB2YXIga2V5V29yZCA9ICcnOyB2YXIgaW5kZW50VGVtcCA9IHN0cmVhbS5jb2x1bW4oKSwgbGV0dGVyOwogICAgICAgICAgICAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAgICAgICAgICAgRWl0aGVyCiAgICAgICAgICAgICAgICAgICAgICAgIChpbmRlbnQtd29yZCAuLgogICAgICAgICAgICAgICAgICAgICAgICAobm9uLWluZGVudC13b3JkIC4uCiAgICAgICAgICAgICAgICAgICAgICAgICg7c29tZXRoaW5nIGVsc2UsIGJyYWNrZXQsIGV0Yy4KICAgICAgICAgICAgICAgICAgICAgICAgKi8KCiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICgobGV0dGVyID0gc3RyZWFtLmVhdCgvW15cc1woXFtcO1wpXF1dLykpICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleVdvcmQgKz0gbGV0dGVyOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoa2V5V29yZC5sZW5ndGggPiAwICYmIGluZGVudEtleXMucHJvcGVydHlJc0VudW1lcmFibGUoa2V5V29yZCkpIHsgLy8gaW5kZW50LXdvcmQKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoU3RhY2soc3RhdGUsIGluZGVudFRlbXAgKyBJTkRFTlRfV09SRF9TS0lQLCBjaCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIG5vbi1pbmRlbnQgd29yZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgY29udGludWUgZWF0aW5nIHRoZSBzcGFjZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5lYXRTcGFjZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbS5lb2woKSB8fCBzdHJlYW0ucGVlaygpID09ICI7IikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcgc2lnbmlmaWNhbnQgYWZ0ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSByZXN0YXJ0IGluZGVudGF0aW9uIDEgc3BhY2UgYWZ0ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoU3RhY2soc3RhdGUsIGluZGVudFRlbXAgKyAxLCBjaCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2hTdGFjayhzdGF0ZSwgaW5kZW50VGVtcCArIHN0cmVhbS5jdXJyZW50KCkubGVuZ3RoLCBjaCk7IC8vIGVsc2Ugd2UgbWF0Y2gKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0uYmFja1VwKHN0cmVhbS5jdXJyZW50KCkubGVuZ3RoIC0gMSk7IC8vIHVuZG8gYWxsIHRoZSBlYXRpbmcKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmKHR5cGVvZiBzdGF0ZS5zRXhwckNvbW1lbnQgPT0gIm51bWJlciIpIHN0YXRlLnNFeHByQ29tbWVudCsrOwoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVHlwZSA9IEJSQUNLRVQ7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAiKSIgfHwgY2ggPT0gIl0iKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblR5cGUgPSBCUkFDS0VUOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuaW5kZW50U3RhY2sgIT0gbnVsbCAmJiBzdGF0ZS5pbmRlbnRTdGFjay50eXBlID09IChjaCA9PSAiKSIgPyAiKCIgOiAiWyIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3BTdGFjayhzdGF0ZSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYodHlwZW9mIHN0YXRlLnNFeHByQ29tbWVudCA9PSAibnVtYmVyIil7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoLS1zdGF0ZS5zRXhwckNvbW1lbnQgPT0gMCl7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVyblR5cGUgPSBDT01NRU5UOyAvLyBmaW5hbCBjbG9zaW5nIGJyYWNrZXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuc0V4cHJDb21tZW50ID0gZmFsc2U7IC8vIHR1cm4gb2ZmIHMtZXhwciBjb21tZW50aW5nIG1vZGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcd1wkX1wtISQlJiorXC5cLzo8PT4/QFxefl0vKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChrZXl3b3JkcyAmJiBrZXl3b3Jkcy5wcm9wZXJ0eUlzRW51bWVyYWJsZShzdHJlYW0uY3VycmVudCgpKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVHlwZSA9IEJVSUxUSU47CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSByZXR1cm5UeXBlID0gInZhcmlhYmxlIjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICh0eXBlb2Ygc3RhdGUuc0V4cHJDb21tZW50ID09ICJudW1iZXIiKSA/IENPTU1FTlQgOiByZXR1cm5UeXBlOwogICAgICAgIH0sCgogICAgICAgIGluZGVudDogZnVuY3Rpb24gKHN0YXRlKSB7CiAgICAgICAgICAgIGlmIChzdGF0ZS5pbmRlbnRTdGFjayA9PSBudWxsKSByZXR1cm4gc3RhdGUuaW5kZW50YXRpb247CiAgICAgICAgICAgIHJldHVybiBzdGF0ZS5pbmRlbnRTdGFjay5pbmRlbnQ7CiAgICAgICAgfSwKCiAgICAgICAgY2xvc2VCcmFja2V0czoge3BhaXJzOiAiKClbXXt9XCJcIiJ9LAogICAgICAgIGxpbmVDb21tZW50OiAiOzsiCiAgICB9Owp9KTsKCkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC94LXNjaGVtZSIsICJzY2hlbWUiKTsKCn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/shell/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/shell/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogU2hlbGwgbW9kZTwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uLy4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPS4uLy4uL2xpYi9jb2RlbWlycm9yLmNzcz4KPHNjcmlwdCBzcmM9Li4vLi4vbGliL2NvZGVtaXJyb3IuanM+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi8uLi9hZGRvbi9lZGl0L21hdGNoYnJhY2tldHMuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz1zaGVsbC5qcz48L3NjcmlwdD4KPHN0eWxlIHR5cGU9dGV4dC9jc3M+CiAgLkNvZGVNaXJyb3Ige2JvcmRlci10b3A6IDFweCBzb2xpZCBibGFjazsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO30KPC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aDE+Q29kZU1pcnJvcjwvaDE+PGltZyBpZD1sb2dvIHNyYz0iLi4vLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+TGFuZ3VhZ2UgbW9kZXM8L2E+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPlNoZWxsPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5TaGVsbCBtb2RlPC9oMj4KCgo8dGV4dGFyZWEgaWQ9Y29kZT4KIyEvYmluL2Jhc2gKCiMgY2xvbmUgdGhlIHJlcG9zaXRvcnkKZ2l0IGNsb25lIGh0dHA6Ly9naXRodWIuY29tL2dhcmRlbi90cmVlCgojIGdlbmVyYXRlIEhUVFBTIGNyZWRlbnRpYWxzCmNkIHRyZWUKb3BlbnNzbCBnZW5yc2EgLWFlczI1NiAtb3V0IGh0dHBzLmtleSAxMDI0Cm9wZW5zc2wgcmVxIC1uZXcgLW5vZGVzIC1rZXkgaHR0cHMua2V5IC1vdXQgaHR0cHMuY3NyCm9wZW5zc2wgeDUwOSAtcmVxIC1kYXlzIDM2NSAtaW4gaHR0cHMuY3NyIC1zaWdua2V5IGh0dHBzLmtleSAtb3V0IGh0dHBzLmNydApjcCBodHRwcy5rZXl7LC5vcmlnfQpvcGVuc3NsIHJzYSAtaW4gaHR0cHMua2V5Lm9yaWcgLW91dCBodHRwcy5rZXkKCiMgc3RhcnQgdGhlIHNlcnZlciBpbiBIVFRQUyBtb2RlCmNkIHdlYgpzdWRvIG5vZGUgLi4vc2VydmVyLmpzIDQ0MyAneWVzJyAmZ3Q7Jmd0OyAuLi9ub2RlLmxvZyAmYW1wOwoKIyBoZXJlIGlzIGhvdyB0byBzdG9wIHRoZSBzZXJ2ZXIKZm9yIHBpZCBpbiBgcHMgYXV4IHwgZ3JlcCAnbm9kZSAuLi9zZXJ2ZXIuanMnIHwgYXdrICd7cHJpbnQgJDJ9J2AgOyBkbwogIHN1ZG8ga2lsbCAtOSAkcGlkIDImZ3Q7IC9kZXYvbnVsbApkb25lCgpleGl0IDA8L3RleHRhcmVhPgoKPHNjcmlwdD4KICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NvZGUnKSwgewogICAgbW9kZTogJ3NoZWxsJywKICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgbWF0Y2hCcmFja2V0czogdHJ1ZQogIH0pOwo8L3NjcmlwdD4KCjxwPjxzdHJvbmc+TUlNRSB0eXBlcyBkZWZpbmVkOjwvc3Ryb25nPiA8Y29kZT50ZXh0L3gtc2g8L2NvZGU+LjwvcD4KPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/shell/shell.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCdzaGVsbCcsIGZ1bmN0aW9uKCkgewoKICB2YXIgd29yZHMgPSB7fTsKICBmdW5jdGlvbiBkZWZpbmUoc3R5bGUsIHN0cmluZykgewogICAgdmFyIHNwbGl0ID0gc3RyaW5nLnNwbGl0KCcgJyk7CiAgICBmb3IodmFyIGkgPSAwOyBpIDwgc3BsaXQubGVuZ3RoOyBpKyspIHsKICAgICAgd29yZHNbc3BsaXRbaV1dID0gc3R5bGU7CiAgICB9CiAgfTsKCiAgLy8gQXRvbXMKICBkZWZpbmUoJ2F0b20nLCAndHJ1ZSBmYWxzZScpOwoKICAvLyBLZXl3b3JkcwogIGRlZmluZSgna2V5d29yZCcsICdpZiB0aGVuIGRvIGVsc2UgZWxpZiB3aGlsZSB1bnRpbCBmb3IgaW4gZXNhYyBmaSBmaW4gJyArCiAgICAnZmlsIGRvbmUgZXhpdCBzZXQgdW5zZXQgZXhwb3J0IGZ1bmN0aW9uJyk7CgogIC8vIENvbW1hbmRzCiAgZGVmaW5lKCdidWlsdGluJywgJ2FiIGF3ayBiYXNoIGJlZXAgY2F0IGNjIGNkIGNob3duIGNobW9kIGNocm9vdCBjbGVhciBjcCAnICsKICAgICdjdXJsIGN1dCBkaWZmIGVjaG8gZmluZCBnYXdrIGdjYyBnZXQgZ2l0IGdyZXAga2lsbCBraWxsYWxsIGxuIGxzIG1ha2UgJyArCiAgICAnbWtkaXIgb3BlbnNzbCBtdiBuYyBub2RlIG5wbSBwaW5nIHBzIHJlc3RhcnQgcm0gcm1kaXIgc2VkIHNlcnZpY2Ugc2ggJyArCiAgICAnc2hvcHQgc2hyZWQgc291cmNlIHNvcnQgc2xlZXAgc3NoIHN0YXJ0IHN0b3Agc3Ugc3VkbyB0ZWUgdGVsbmV0IHRvcCAnICsKICAgICd0b3VjaCB2aSB2aW0gd2FsbCB3YyB3Z2V0IHdobyB3cml0ZSB5ZXMgenNoJyk7CgogIGZ1bmN0aW9uIHRva2VuQmFzZShzdHJlYW0sIHN0YXRlKSB7CiAgICBpZiAoc3RyZWFtLmVhdFNwYWNlKCkpIHJldHVybiBudWxsOwoKICAgIHZhciBzb2wgPSBzdHJlYW0uc29sKCk7CiAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpOwoKICAgIGlmIChjaCA9PT0gJ1xcJykgewogICAgICBzdHJlYW0ubmV4dCgpOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGlmIChjaCA9PT0gJ1wnJyB8fCBjaCA9PT0gJyInIHx8IGNoID09PSAnYCcpIHsKICAgICAgc3RhdGUudG9rZW5zLnVuc2hpZnQodG9rZW5TdHJpbmcoY2gpKTsKICAgICAgcmV0dXJuIHRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgfQogICAgaWYgKGNoID09PSAnIycpIHsKICAgICAgaWYgKHNvbCAmJiBzdHJlYW0uZWF0KCchJykpIHsKICAgICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICAgICAgcmV0dXJuICdtZXRhJzsgLy8gJ2NvbW1lbnQnPwogICAgICB9CiAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgcmV0dXJuICdjb21tZW50JzsKICAgIH0KICAgIGlmIChjaCA9PT0gJyQnKSB7CiAgICAgIHN0YXRlLnRva2Vucy51bnNoaWZ0KHRva2VuRG9sbGFyKTsKICAgICAgcmV0dXJuIHRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgfQogICAgaWYgKGNoID09PSAnKycgfHwgY2ggPT09ICc9JykgewogICAgICByZXR1cm4gJ29wZXJhdG9yJzsKICAgIH0KICAgIGlmIChjaCA9PT0gJy0nKSB7CiAgICAgIHN0cmVhbS5lYXQoJy0nKTsKICAgICAgc3RyZWFtLmVhdFdoaWxlKC9cdy8pOwogICAgICByZXR1cm4gJ2F0dHJpYnV0ZSc7CiAgICB9CiAgICBpZiAoL1xkLy50ZXN0KGNoKSkgewogICAgICBzdHJlYW0uZWF0V2hpbGUoL1xkLyk7CiAgICAgIGlmKHN0cmVhbS5lb2woKSB8fCAhL1x3Ly50ZXN0KHN0cmVhbS5wZWVrKCkpKSB7CiAgICAgICAgcmV0dXJuICdudW1iZXInOwogICAgICB9CiAgICB9CiAgICBzdHJlYW0uZWF0V2hpbGUoL1tcdy1dLyk7CiAgICB2YXIgY3VyID0gc3RyZWFtLmN1cnJlbnQoKTsKICAgIGlmIChzdHJlYW0ucGVlaygpID09PSAnPScgJiYgL1x3Ky8udGVzdChjdXIpKSByZXR1cm4gJ2RlZic7CiAgICByZXR1cm4gd29yZHMuaGFzT3duUHJvcGVydHkoY3VyKSA/IHdvcmRzW2N1cl0gOiBudWxsOwogIH0KCiAgZnVuY3Rpb24gdG9rZW5TdHJpbmcocXVvdGUpIHsKICAgIHJldHVybiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHZhciBuZXh0LCBlbmQgPSBmYWxzZSwgZXNjYXBlZCA9IGZhbHNlOwogICAgICB3aGlsZSAoKG5leHQgPSBzdHJlYW0ubmV4dCgpKSAhPSBudWxsKSB7CiAgICAgICAgaWYgKG5leHQgPT09IHF1b3RlICYmICFlc2NhcGVkKSB7CiAgICAgICAgICBlbmQgPSB0cnVlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmIChuZXh0ID09PSAnJCcgJiYgIWVzY2FwZWQgJiYgcXVvdGUgIT09ICdcJycpIHsKICAgICAgICAgIGVzY2FwZWQgPSB0cnVlOwogICAgICAgICAgc3RyZWFtLmJhY2tVcCgxKTsKICAgICAgICAgIHN0YXRlLnRva2Vucy51bnNoaWZ0KHRva2VuRG9sbGFyKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBlc2NhcGVkID0gIWVzY2FwZWQgJiYgbmV4dCA9PT0gJ1xcJzsKICAgICAgfQogICAgICBpZiAoZW5kIHx8ICFlc2NhcGVkKSB7CiAgICAgICAgc3RhdGUudG9rZW5zLnNoaWZ0KCk7CiAgICAgIH0KICAgICAgcmV0dXJuIChxdW90ZSA9PT0gJ2AnIHx8IHF1b3RlID09PSAnKScgPyAncXVvdGUnIDogJ3N0cmluZycpOwogICAgfTsKICB9OwoKICB2YXIgdG9rZW5Eb2xsYXIgPSBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICBpZiAoc3RhdGUudG9rZW5zLmxlbmd0aCA+IDEpIHN0cmVhbS5lYXQoJyQnKTsKICAgIHZhciBjaCA9IHN0cmVhbS5uZXh0KCksIGh1bmdyeSA9IC9cdy87CiAgICBpZiAoY2ggPT09ICd7JykgaHVuZ3J5ID0gL1tefV0vOwogICAgaWYgKGNoID09PSAnKCcpIHsKICAgICAgc3RhdGUudG9rZW5zWzBdID0gdG9rZW5TdHJpbmcoJyknKTsKICAgICAgcmV0dXJuIHRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgfQogICAgaWYgKCEvXGQvLnRlc3QoY2gpKSB7CiAgICAgIHN0cmVhbS5lYXRXaGlsZShodW5ncnkpOwogICAgICBzdHJlYW0uZWF0KCd9Jyk7CiAgICB9CiAgICBzdGF0ZS50b2tlbnMuc2hpZnQoKTsKICAgIHJldHVybiAnZGVmJzsKICB9OwoKICBmdW5jdGlvbiB0b2tlbml6ZShzdHJlYW0sIHN0YXRlKSB7CiAgICByZXR1cm4gKHN0YXRlLnRva2Vuc1swXSB8fCB0b2tlbkJhc2UpIChzdHJlYW0sIHN0YXRlKTsKICB9OwoKICByZXR1cm4gewogICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24oKSB7cmV0dXJuIHt0b2tlbnM6W119O30sCiAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICByZXR1cm4gdG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CiAgICB9LAogICAgY2xvc2VCcmFja2V0czogIigpW117fScnXCJcImBgIiwKICAgIGxpbmVDb21tZW50OiAnIycsCiAgICBmb2xkOiAiYnJhY2UiCiAgfTsKfSk7CgpDb2RlTWlycm9yLmRlZmluZU1JTUUoJ3RleHQveC1zaCcsICdzaGVsbCcpOwoKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/shell/test.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24oKSB7CiAgdmFyIG1vZGUgPSBDb2RlTWlycm9yLmdldE1vZGUoe30sICJzaGVsbCIpOwogIGZ1bmN0aW9uIE1UKG5hbWUpIHsgdGVzdC5tb2RlKG5hbWUsIG1vZGUsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpOyB9CgogIE1UKCJ2YXIiLAogICAgICJ0ZXh0IFtkZWYgJHZhcl0gdGV4dCIpOwogIE1UKCJ2YXJCcmFjZXMiLAogICAgICJ0ZXh0W2RlZiAke3Zhcn1ddGV4dCIpOwogIE1UKCJ2YXJWYXIiLAogICAgICJ0ZXh0IFtkZWYgJGEkYl0gdGV4dCIpOwogIE1UKCJ2YXJCcmFjZXNWYXJCcmFjZXMiLAogICAgICJ0ZXh0W2RlZiAke2F9JHtifV10ZXh0Iik7CgogIE1UKCJzaW5nbGVRdW90ZWRWYXIiLAogICAgICJbc3RyaW5nICd0ZXh0ICR2YXIgdGV4dCddIik7CiAgTVQoInNpbmdsZVF1b3RlZFZhckJyYWNlcyIsCiAgICAgIltzdHJpbmcgJ3RleHQgJHt2YXJ9IHRleHQnXSIpOwoKICBNVCgiZG91YmxlUXVvdGVkVmFyIiwKICAgICAnW3N0cmluZyAidGV4dCBdW2RlZiAkdmFyXVtzdHJpbmcgIHRleHQiXScpOwogIE1UKCJkb3VibGVRdW90ZWRWYXJCcmFjZXMiLAogICAgICdbc3RyaW5nICJ0ZXh0XVtkZWYgJHt2YXJ9XVtzdHJpbmcgdGV4dCJdJyk7CiAgTVQoImRvdWJsZVF1b3RlZFZhclB1bmN0IiwKICAgICAnW3N0cmluZyAidGV4dCBdW2RlZiAkQF1bc3RyaW5nICB0ZXh0Il0nKTsKICBNVCgiZG91YmxlUXVvdGVkVmFyVmFyIiwKICAgICAnW3N0cmluZyAiXVtkZWYgJGEkYl1bc3RyaW5nICJdJyk7CiAgTVQoImRvdWJsZVF1b3RlZFZhckJyYWNlc1ZhckJyYWNlcyIsCiAgICAgJ1tzdHJpbmcgIl1bZGVmICR7YX0ke2J9XVtzdHJpbmcgIl0nKTsKCiAgTVQoIm5vdEFTdHJpbmciLAogICAgICJ0ZXh0XFwndGV4dCIpOwogIE1UKCJlc2NhcGVzIiwKICAgICAib3V0c2lkZVxcJ1xcXCJcXGBcXFxcW3N0cmluZyBcImluc2lkZVxcYFxcJ1xcXCJcXFxcYFxcJG5vdEFWYXJcIl1vdXRzaWRlXFwkXFwobm90QVN1YlNoZWxsXFwpIik7CgogIE1UKCJzdWJzaGVsbCIsCiAgICAgIltidWlsdGluIGVjaG9dIFtxdW90ZSAkKHdob2FtaSldIHMgbG9nLCBzdGFyZGF0ZSBbcXVvdGUgYGRhdGVgXS4iKTsKICBNVCgiZG91YmxlUXVvdGVkU3Vic2hlbGwiLAogICAgICJbYnVpbHRpbiBlY2hvXSBbc3RyaW5nIFwiXVtxdW90ZSAkKHdob2FtaSldW3N0cmluZyAncyBsb2csIHN0YXJkYXRlIGBkYXRlYC5cIl0iKTsKCiAgTVQoImhhc2hiYW5nIiwKICAgICAiW21ldGEgIyEvYmluL2Jhc2hdIik7CiAgTVQoImNvbW1lbnQiLAogICAgICJ0ZXh0IFtjb21tZW50ICMgQmx1cmJdIik7CgogIE1UKCJudW1iZXJzIiwKICAgICAiW251bWJlciAwXSBbbnVtYmVyIDFdIFtudW1iZXIgMl0iKTsKICBNVCgia2V5d29yZHMiLAogICAgICJba2V5d29yZCB3aGlsZV0gW2F0b20gdHJ1ZV07IFtrZXl3b3JkIGRvXSIsCiAgICAgIiAgW2J1aWx0aW4gc2xlZXBdIFtudW1iZXIgM10iLAogICAgICJba2V5d29yZCBkb25lXSIpOwogIE1UKCJvcHRpb25zIiwKICAgICAiW2J1aWx0aW4gbHNdIFthdHRyaWJ1dGUgLWxdIFthdHRyaWJ1dGUgLS1odW1hbi1yZWFkYWJsZV0iKTsKICBNVCgib3BlcmF0b3IiLAogICAgICJbZGVmIHZhcl1bb3BlcmF0b3IgPV12YWx1ZSIpOwp9KSgpOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/sieve/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/sieve/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogU2lldmUgKFJGQzUyMjgpIG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0ic2lldmUuanMiPjwvc2NyaXB0Pgo8c3R5bGU+LkNvZGVNaXJyb3Ige2JhY2tncm91bmQ6ICNmOGY4Zjg7fTwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGgxPkNvZGVNaXJyb3I8L2gxPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5TaWV2ZSAoUkZDNTIyOCk8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPlNpZXZlIChSRkM1MjI4KSBtb2RlPC9oMj4KPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KIwojIEV4YW1wbGUgU2lldmUgRmlsdGVyCiMgRGVjbGFyZSBhbnkgb3B0aW9uYWwgZmVhdHVyZXMgb3IgZXh0ZW5zaW9uIHVzZWQgYnkgdGhlIHNjcmlwdAojCgpyZXF1aXJlIFsiZmlsZWludG8iLCAicmVqZWN0Il07CgojCiMgUmVqZWN0IGFueSBsYXJnZSBtZXNzYWdlcyAobm90ZSB0aGF0IHRoZSBmb3VyIGxlYWRpbmcgZG90cyBnZXQKIyAic3R1ZmZlZCIgdG8gdGhyZWUpCiMKaWYgc2l6ZSA6b3ZlciAxTQp7CiAgcmVqZWN0IHRleHQ6ClBsZWFzZSBkbyBub3Qgc2VuZCBtZSBsYXJnZSBhdHRhY2htZW50cy4KUHV0IHlvdXIgZmlsZSBvbiBhIHNlcnZlciBhbmQgc2VuZCBtZSB0aGUgVVJMLgpUaGFuayB5b3UuCi4uLi4gRnJlZAouCjsKICBzdG9wOwp9CgojCiMgSGFuZGxlIG1lc3NhZ2VzIGZyb20ga25vd24gbWFpbGluZyBsaXN0cwojIE1vdmUgbWVzc2FnZXMgZnJvbSBJRVRGIGZpbHRlciBkaXNjdXNzaW9uIGxpc3QgdG8gZmlsdGVyIGZvbGRlcgojCmlmIGhlYWRlciA6aXMgIlNlbmRlciIgIm93bmVyLWlldGYtbXRhLWZpbHRlcnNAaW1jLm9yZyIKewogIGZpbGVpbnRvICJmaWx0ZXIiOyAgIyBtb3ZlIHRvICJmaWx0ZXIiIGZvbGRlcgp9CiMKIyBLZWVwIGFsbCBtZXNzYWdlcyB0byBvciBmcm9tIHBlb3BsZSBpbiBteSBjb21wYW55CiMKZWxzaWYgYWRkcmVzcyA6ZG9tYWluIDppcyBbIkZyb20iLCAiVG8iXSAiZXhhbXBsZS5jb20iCnsKICBrZWVwOyAgICAgICAgICAgICAgICMga2VlcCBpbiAiSW4iIGZvbGRlcgp9CgojCiMgVHJ5IGFuZCBjYXRjaCB1bnNvbGljaXRlZCBlbWFpbC4gIElmIGEgbWVzc2FnZSBpcyBub3QgdG8gbWUsCiMgb3IgaXQgY29udGFpbnMgYSBzdWJqZWN0IGtub3duIHRvIGJlIHNwYW0sIGZpbGUgaXQgYXdheS4KIwplbHNpZiBhbnlvZiAobm90IGFkZHJlc3MgOmFsbCA6Y29udGFpbnMKICAgICAgICAgICAgICAgWyJUbyIsICJDYyIsICJCY2MiXSAibWVAZXhhbXBsZS5jb20iLAogICAgICAgICAgICAgaGVhZGVyIDptYXRjaGVzICJzdWJqZWN0IgogICAgICAgICAgICAgICBbIiptYWtlKm1vbmV5KmZhc3QqIiwgIip1bml2ZXJzaXR5KmRpcGwqbWFzKiJdKQp7CiAgIyBJZiBtZXNzYWdlIGhlYWRlciBkb2VzIG5vdCBjb250YWluIG15IGFkZHJlc3MsCiAgIyBpdCdzIGZyb20gYSBsaXN0LgogIGZpbGVpbnRvICJzcGFtIjsgICAjIG1vdmUgdG8gInNwYW0iIGZvbGRlcgp9CmVsc2UKewogICMgTW92ZSBhbGwgb3RoZXIgKG5vbi1jb21wYW55KSBtYWlsIHRvICJwZXJzb25hbCIKICAjIGZvbGRlci4KICBmaWxlaW50byAicGVyc29uYWwiOwp9CjwvdGV4dGFyZWE+PC9mb3JtPgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHt9KTsKICAgIDwvc2NyaXB0PgoKICAgIDxwPjxzdHJvbmc+TUlNRSB0eXBlcyBkZWZpbmVkOjwvc3Ryb25nPiA8Y29kZT5hcHBsaWNhdGlvbi9zaWV2ZTwvY29kZT4uPC9wPgoKICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/sieve/sieve.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJzaWV2ZSIsIGZ1bmN0aW9uKGNvbmZpZykgewogIGZ1bmN0aW9uIHdvcmRzKHN0cikgewogICAgdmFyIG9iaiA9IHt9LCB3b3JkcyA9IHN0ci5zcGxpdCgiICIpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB3b3Jkcy5sZW5ndGg7ICsraSkgb2JqW3dvcmRzW2ldXSA9IHRydWU7CiAgICByZXR1cm4gb2JqOwogIH0KCiAgdmFyIGtleXdvcmRzID0gd29yZHMoImlmIGVsc2lmIGVsc2Ugc3RvcCByZXF1aXJlIik7CiAgdmFyIGF0b21zID0gd29yZHMoInRydWUgZmFsc2Ugbm90Iik7CiAgdmFyIGluZGVudFVuaXQgPSBjb25maWcuaW5kZW50VW5pdDsKCiAgZnVuY3Rpb24gdG9rZW5CYXNlKHN0cmVhbSwgc3RhdGUpIHsKCiAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpOwogICAgaWYgKGNoID09ICIvIiAmJiBzdHJlYW0uZWF0KCIqIikpIHsKICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkNDb21tZW50OwogICAgICByZXR1cm4gdG9rZW5DQ29tbWVudChzdHJlYW0sIHN0YXRlKTsKICAgIH0KCiAgICBpZiAoY2ggPT09ICcjJykgewogICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICAgIHJldHVybiAiY29tbWVudCI7CiAgICB9CgogICAgaWYgKGNoID09ICJcIiIpIHsKICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlblN0cmluZyhjaCk7CiAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgIH0KCiAgICBpZiAoY2ggPT0gIigiKSB7CiAgICAgIHN0YXRlLl9pbmRlbnQucHVzaCgiKCIpOwogICAgICAvLyBhZGQgdmlydHVhbCBhbmdlbCB3aW5ncyBzbyB0aGF0IGVkaXRvciBiZWhhdmVzLi4uCiAgICAgIC8vIC4uLm1vcmUgc2FuZSBpbmNhc2Ugb2YgYnJva2VuIGJyYWNrZXRzCiAgICAgIHN0YXRlLl9pbmRlbnQucHVzaCgieyIpOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICBpZiAoY2ggPT09ICJ7IikgewogICAgICBzdGF0ZS5faW5kZW50LnB1c2goInsiKTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgaWYgKGNoID09ICIpIikgIHsKICAgICAgc3RhdGUuX2luZGVudC5wb3AoKTsKICAgICAgc3RhdGUuX2luZGVudC5wb3AoKTsKICAgIH0KCiAgICBpZiAoY2ggPT09ICJ9IikgewogICAgICBzdGF0ZS5faW5kZW50LnBvcCgpOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICBpZiAoY2ggPT0gIiwiKQogICAgICByZXR1cm4gbnVsbDsKCiAgICBpZiAoY2ggPT0gIjsiKQogICAgICByZXR1cm4gbnVsbDsKCgogICAgaWYgKC9be31cKFwpLDtdLy50ZXN0KGNoKSkKICAgICAgcmV0dXJuIG51bGw7CgogICAgLy8gMSpESUdJVCAiSyIgLyAiTSIgLyAiRyIKICAgIGlmICgvXGQvLnRlc3QoY2gpKSB7CiAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1xkXS8pOwogICAgICBzdHJlYW0uZWF0KC9bS2tNbUdnXS8pOwogICAgICByZXR1cm4gIm51bWJlciI7CiAgICB9CgogICAgLy8gIjoiIChBTFBIQSAvICJfIikgKihBTFBIQSAvIERJR0lUIC8gIl8iKQogICAgaWYgKGNoID09ICI6IikgewogICAgICBzdHJlYW0uZWF0V2hpbGUoL1thLXpBLVpfXS8pOwogICAgICBzdHJlYW0uZWF0V2hpbGUoL1thLXpBLVowLTlfXS8pOwoKICAgICAgcmV0dXJuICJvcGVyYXRvciI7CiAgICB9CgogICAgc3RyZWFtLmVhdFdoaWxlKC9cdy8pOwogICAgdmFyIGN1ciA9IHN0cmVhbS5jdXJyZW50KCk7CgogICAgLy8gInRleHQ6IiAqKFNQIC8gSFRBQikgKGhhc2gtY29tbWVudCAvIENSTEYpCiAgICAvLyAqKG11bHRpbGluZS1saXRlcmFsIC8gbXVsdGlsaW5lLWRvdHN0YXJ0KQogICAgLy8gIi4iIENSTEYKICAgIGlmICgoY3VyID09ICJ0ZXh0IikgJiYgc3RyZWFtLmVhdCgiOiIpKQogICAgewogICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuTXVsdGlMaW5lU3RyaW5nOwogICAgICByZXR1cm4gInN0cmluZyI7CiAgICB9CgogICAgaWYgKGtleXdvcmRzLnByb3BlcnR5SXNFbnVtZXJhYmxlKGN1cikpCiAgICAgIHJldHVybiAia2V5d29yZCI7CgogICAgaWYgKGF0b21zLnByb3BlcnR5SXNFbnVtZXJhYmxlKGN1cikpCiAgICAgIHJldHVybiAiYXRvbSI7CgogICAgcmV0dXJuIG51bGw7CiAgfQoKICBmdW5jdGlvbiB0b2tlbk11bHRpTGluZVN0cmluZyhzdHJlYW0sIHN0YXRlKQogIHsKICAgIHN0YXRlLl9tdWx0aUxpbmVTdHJpbmcgPSB0cnVlOwogICAgLy8gdGhlIGZpcnN0IGxpbmUgaXMgc3BlY2lhbCBpdCBtYXkgY29udGFpbiBhIGNvbW1lbnQKICAgIGlmICghc3RyZWFtLnNvbCgpKSB7CiAgICAgIHN0cmVhbS5lYXRTcGFjZSgpOwoKICAgICAgaWYgKHN0cmVhbS5wZWVrKCkgPT0gIiMiKSB7CiAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICAgIHJldHVybiAiY29tbWVudCI7CiAgICAgIH0KCiAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgfQoKICAgIGlmICgoc3RyZWFtLm5leHQoKSA9PSAiLiIpICAmJiAoc3RyZWFtLmVvbCgpKSkKICAgIHsKICAgICAgc3RhdGUuX211bHRpTGluZVN0cmluZyA9IGZhbHNlOwogICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTsKICAgIH0KCiAgICByZXR1cm4gInN0cmluZyI7CiAgfQoKICBmdW5jdGlvbiB0b2tlbkNDb21tZW50KHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBtYXliZUVuZCA9IGZhbHNlLCBjaDsKICAgIHdoaWxlICgoY2ggPSBzdHJlYW0ubmV4dCgpKSAhPSBudWxsKSB7CiAgICAgIGlmIChtYXliZUVuZCAmJiBjaCA9PSAiLyIpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBtYXliZUVuZCA9IChjaCA9PSAiKiIpOwogICAgfQogICAgcmV0dXJuICJjb21tZW50IjsKICB9CgogIGZ1bmN0aW9uIHRva2VuU3RyaW5nKHF1b3RlKSB7CiAgICByZXR1cm4gZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICB2YXIgZXNjYXBlZCA9IGZhbHNlLCBjaDsKICAgICAgd2hpbGUgKChjaCA9IHN0cmVhbS5uZXh0KCkpICE9IG51bGwpIHsKICAgICAgICBpZiAoY2ggPT0gcXVvdGUgJiYgIWVzY2FwZWQpCiAgICAgICAgICBicmVhazsKICAgICAgICBlc2NhcGVkID0gIWVzY2FwZWQgJiYgY2ggPT0gIlxcIjsKICAgICAgfQogICAgICBpZiAoIWVzY2FwZWQpIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlOwogICAgICByZXR1cm4gInN0cmluZyI7CiAgICB9OwogIH0KCiAgcmV0dXJuIHsKICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKGJhc2UpIHsKICAgICAgcmV0dXJuIHt0b2tlbml6ZTogdG9rZW5CYXNlLAogICAgICAgICAgICAgIGJhc2VJbmRlbnQ6IGJhc2UgfHwgMCwKICAgICAgICAgICAgICBfaW5kZW50OiBbXX07CiAgICB9LAoKICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIGlmIChzdHJlYW0uZWF0U3BhY2UoKSkKICAgICAgICByZXR1cm4gbnVsbDsKCiAgICAgIHJldHVybiAoc3RhdGUudG9rZW5pemUgfHwgdG9rZW5CYXNlKShzdHJlYW0sIHN0YXRlKTs7CiAgICB9LAoKICAgIGluZGVudDogZnVuY3Rpb24oc3RhdGUsIF90ZXh0QWZ0ZXIpIHsKICAgICAgdmFyIGxlbmd0aCA9IHN0YXRlLl9pbmRlbnQubGVuZ3RoOwogICAgICBpZiAoX3RleHRBZnRlciAmJiAoX3RleHRBZnRlclswXSA9PSAifSIpKQogICAgICAgIGxlbmd0aC0tOwoKICAgICAgaWYgKGxlbmd0aCA8MCkKICAgICAgICBsZW5ndGggPSAwOwoKICAgICAgcmV0dXJuIGxlbmd0aCAqIGluZGVudFVuaXQ7CiAgICB9LAoKICAgIGVsZWN0cmljQ2hhcnM6ICJ9IgogIH07Cn0pOwoKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJhcHBsaWNhdGlvbi9zaWV2ZSIsICJzaWV2ZSIpOwoKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/slim/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/slim/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogU0xJTSBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi90aGVtZS9hbWJpYW5jZS5jc3MiPgo8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jb2RlLmpxdWVyeS5jb20vanF1ZXJ5LTEuMTEuMS5taW4uanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iaHR0cHM6Ly9jb2RlLmpxdWVyeS5jb20vdWkvMS4xMS4wL2pxdWVyeS11aS5taW4uanMiPjwvc2NyaXB0Pgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Imh0dHBzOi8vY29kZS5qcXVlcnkuY29tL3VpLzEuMTEuMC90aGVtZXMvc21vb3RobmVzcy9qcXVlcnktdWkuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL3htbC94bWwuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vaHRtbGVtYmVkZGVkL2h0bWxlbWJlZGRlZC5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9odG1sbWl4ZWQvaHRtbG1peGVkLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL2NvZmZlZXNjcmlwdC9jb2ZmZWVzY3JpcHQuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vamF2YXNjcmlwdC9qYXZhc2NyaXB0LmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL3J1YnkvcnVieS5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9tYXJrZG93bi9tYXJrZG93bi5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJzbGltLmpzIj48L3NjcmlwdD4KPHN0eWxlPi5Db2RlTWlycm9yIHtiYWNrZ3JvdW5kOiAjZjhmOGY4O308L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxoMT5Db2RlTWlycm9yPC9oMT48aW1nIGlkPWxvZ28gc3JjPSIuLi8uLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5MYW5ndWFnZSBtb2RlczwvYT4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+U0xJTTwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgogIDxoMj5TTElNIG1vZGU8L2gyPgogIDxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+CmJvZHkKICB0YWJsZQogICAgLSBmb3IgdXNlciBpbiB1c2VycwogICAgICB0ZCBpZD0idXNlcl8je3VzZXIuaWR9IiBjbGFzcz11c2VyLnJvbGUKICAgICAgICBhIGhyZWY9dXNlcl9hY3Rpb24odXNlciwgOmVkaXQpIEVkaXQgI3t1c2VyLm5hbWV9CiAgICAgICAgYSBocmVmPShwYXRoX3RvX3VzZXIgdXNlcikgPSB1c2VyLm5hbWUKYm9keQogIGgxKGlkPSJsb2dvIikgPSBwYWdlX2xvZ28KICBoMltpZD0idGFnbGluZSIgY2xhc3M9InNtYWxsIHRhZ2xpbmUiXSA9IHBhZ2VfdGFnbGluZQoKaDJbaWQ9InRhZ2xpbmUiCiAgIGNsYXNzPSJzbWFsbCB0YWdsaW5lIl0gPSBwYWdlX3RhZ2xpbmUKCmgxIGlkID0gImxvZ28iID0gcGFnZV9sb2dvCmgyIFsgaWQgPSAidGFnbGluZSIgXSA9IHBhZ2VfdGFnbGluZQoKLyBjb21tZW50CiAgc2Vjb25kIGxpbmUKLyEgaHRtbCBjb21tZW50CiAgIHNlY29uZCBsaW5lCjwhLS0gaHRtbCBjb21tZW50IC0tPgo8YSBocmVmPSIjeydoZWxsbycgaWYgc2V0fSI+bGluazwvYT4KYS5zbGltIGhyZWY9IndvcmsiIGRpc2FibGVkPWZhbHNlIHJ1bm5pbmc9PTphdG9tIFRleHQgPGI+Ym9sZDwvYj4KLmNsYXp6IGRhdGEtaWQ9InRlc3QiID09ICdoZWxsbycgdW5sZXNzIHF1YXJrCiB8IFRleHQgbW9kZSAjezEyfQogICBTZWNvbmQgbGluZQo9IHggfHw9IDpydWJ5X2F0b20KI21lbnUubGVmdAogIC0gQGVudi5lYWNoIGRvIHx4fAogICAgbGk6IGEgPSB4CipAZHludGFnIGF0dHI9InZhbCIKLmZpcnN0ICp7OmNsYXNzID0+IFs6c2Vjb25kLCA6dGhpcmRdfSBUZXh0Ci5zZWNvbmQgY2xhc3M9WyJ0ZXh0IiwibW9yZSJdCi50aGlyZCBjbGFzcz06dGV4dCw6c3ltYm9sCgogIDwvdGV4dGFyZWE+PC9mb3JtPgogIDxzY3JpcHQ+CiAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgICAgdGhlbWU6ICJhbWJpYW5jZSIsCiAgICAgIG1vZGU6ICJhcHBsaWNhdGlvbi94LXNsaW0iCiAgICB9KTsKICAgICQoJy5Db2RlTWlycm9yJykucmVzaXphYmxlKHsKICAgICAgcmVzaXplOiBmdW5jdGlvbigpIHsKICAgICAgICBlZGl0b3Iuc2V0U2l6ZSgkKHRoaXMpLndpZHRoKCksICQodGhpcykuaGVpZ2h0KCkpOwogICAgICAgIC8vZWRpdG9yLnJlZnJlc2goKTsKICAgICAgfQogICAgfSk7CiAgPC9zY3JpcHQ+CgogIDxwPjxzdHJvbmc+TUlNRSB0eXBlcyBkZWZpbmVkOjwvc3Ryb25nPiA8Y29kZT5hcHBsaWNhdGlvbi94LXNsaW08L2NvZGU+LjwvcD4KCiAgPHA+CiAgICA8c3Ryb25nPlBhcnNpbmcvSGlnaGxpZ2h0aW5nIFRlc3RzOjwvc3Ryb25nPgogICAgPGEgaHJlZj0iLi4vLi4vdGVzdC9pbmRleC5odG1sI3NsaW1fKiI+bm9ybWFsPC9hPiwKICAgIDxhIGhyZWY9Ii4uLy4uL3Rlc3QvaW5kZXguaHRtbCN2ZXJib3NlLHNsaW1fKiI+dmVyYm9zZTwvYT4uCiAgPC9wPgo8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/slim/slim.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovLyBTbGltIEhpZ2hsaWdodGluZyBmb3IgQ29kZU1pcnJvciBjb3B5cmlnaHQgKGMpIEhpY2tuSGFjayBTb2Z0d2FyZSBHbWJoCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSwgcmVxdWlyZSgiLi4vaHRtbG1peGVkL2h0bWxtaXhlZCIpLCByZXF1aXJlKCIuLi9ydWJ5L3J1YnkiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiLCAiLi4vaHRtbG1peGVkL2h0bWxtaXhlZCIsICIuLi9ydWJ5L3J1YnkiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKICBDb2RlTWlycm9yLmRlZmluZU1vZGUoInNsaW0iLCBmdW5jdGlvbihjb25maWcpIHsKICAgIHZhciBodG1sTW9kZSA9IENvZGVNaXJyb3IuZ2V0TW9kZShjb25maWcsIHtuYW1lOiAiaHRtbG1peGVkIn0pOwogICAgdmFyIHJ1YnlNb2RlID0gQ29kZU1pcnJvci5nZXRNb2RlKGNvbmZpZywgInJ1YnkiKTsKICAgIHZhciBtb2RlcyA9IHsgaHRtbDogaHRtbE1vZGUsIHJ1Ynk6IHJ1YnlNb2RlIH07CiAgICB2YXIgZW1iZWRkZWQgPSB7CiAgICAgIHJ1Ynk6ICJydWJ5IiwKICAgICAgamF2YXNjcmlwdDogImphdmFzY3JpcHQiLAogICAgICBjc3M6ICJ0ZXh0L2NzcyIsCiAgICAgIHNhc3M6ICJ0ZXh0L3gtc2FzcyIsCiAgICAgIHNjc3M6ICJ0ZXh0L3gtc2NzcyIsCiAgICAgIGxlc3M6ICJ0ZXh0L3gtbGVzcyIsCiAgICAgIHN0eWw6ICJ0ZXh0L3gtc3R5bCIsIC8vIG5vIGhpZ2hsaWdodGluZyBzbyBmYXIKICAgICAgY29mZmVlOiAiY29mZmVlc2NyaXB0IiwKICAgICAgYXNjaWlkb2M6ICJ0ZXh0L3gtYXNjaWlkb2MiLAogICAgICBtYXJrZG93bjogInRleHQveC1tYXJrZG93biIsCiAgICAgIHRleHRpbGU6ICJ0ZXh0L3gtdGV4dGlsZSIsIC8vIG5vIGhpZ2hsaWdodGluZyBzbyBmYXIKICAgICAgY3Jlb2xlOiAidGV4dC94LWNyZW9sZSIsIC8vIG5vIGhpZ2hsaWdodGluZyBzbyBmYXIKICAgICAgd2lraTogInRleHQveC13aWtpIiwgLy8gbm8gaGlnaGxpZ2h0aW5nIHNvIGZhcgogICAgICBtZWRpYXdpa2k6ICJ0ZXh0L3gtbWVkaWF3aWtpIiwgLy8gbm8gaGlnaGxpZ2h0aW5nIHNvIGZhcgogICAgICByZG9jOiAidGV4dC94LXJkb2MiLCAvLyBubyBoaWdobGlnaHRpbmcgc28gZmFyCiAgICAgIGJ1aWxkZXI6ICJ0ZXh0L3gtYnVpbGRlciIsIC8vIG5vIGhpZ2hsaWdodGluZyBzbyBmYXIKICAgICAgbm9rb2dpcmk6ICJ0ZXh0L3gtbm9rb2dpcmkiLCAvLyBubyBoaWdobGlnaHRpbmcgc28gZmFyCiAgICAgIGVyYjogImFwcGxpY2F0aW9uL3gtZXJiIgogICAgfTsKICAgIHZhciBlbWJlZGRlZFJlZ2V4cCA9IGZ1bmN0aW9uKG1hcCl7CiAgICAgIHZhciBhcnIgPSBbXTsKICAgICAgZm9yKHZhciBrZXkgaW4gbWFwKSBhcnIucHVzaChrZXkpOwogICAgICByZXR1cm4gbmV3IFJlZ0V4cCgiXigiK2Fyci5qb2luKCd8JykrIik6Iik7CiAgICB9KGVtYmVkZGVkKTsKCiAgICB2YXIgc3R5bGVNYXAgPSB7CiAgICAgICJjb21tZW50TGluZSI6ICJjb21tZW50IiwKICAgICAgInNsaW1Td2l0Y2giOiAib3BlcmF0b3Igc3BlY2lhbCIsCiAgICAgICJzbGltVGFnIjogInRhZyIsCiAgICAgICJzbGltSWQiOiAiYXR0cmlidXRlIGRlZiIsCiAgICAgICJzbGltQ2xhc3MiOiAiYXR0cmlidXRlIHF1YWxpZmllciIsCiAgICAgICJzbGltQXR0cmlidXRlIjogImF0dHJpYnV0ZSIsCiAgICAgICJzbGltU3VibW9kZSI6ICJrZXl3b3JkIHNwZWNpYWwiLAogICAgICAiY2xvc2VBdHRyaWJ1dGVUYWciOiBudWxsLAogICAgICAic2xpbURvY3R5cGUiOiBudWxsLAogICAgICAibGluZUNvbnRpbnVhdGlvbiI6IG51bGwKICAgIH07CiAgICB2YXIgY2xvc2luZyA9IHsKICAgICAgInsiOiAifSIsCiAgICAgICJbIjogIl0iLAogICAgICAiKCI6ICIpIgogICAgfTsKCiAgICB2YXIgbmFtZVN0YXJ0Q2hhciA9ICJfYS16QS1aXHhDMC1ceEQ2XHhEOC1ceEY2XHhGOC1cdTAyRkZcdTAzNzAtXHUwMzdEXHUwMzdGLVx1MUZGRlx1MjAwQy1cdTIwMERcdTIwNzAtXHUyMThGXHUyQzAwLVx1MkZFRlx1MzAwMS1cdUQ3RkZcdUY5MDAtXHVGRENGXHVGREYwLVx1RkZGRCI7CiAgICB2YXIgbmFtZUNoYXIgPSBuYW1lU3RhcnRDaGFyICsgIlxcLTAtOVx4QjdcdTAzMDAtXHUwMzZGXHUyMDNGLVx1MjA0MCI7CiAgICB2YXIgbmFtZVJlZ2V4cCA9IG5ldyBSZWdFeHAoIl5bOiIrbmFtZVN0YXJ0Q2hhcisiXSg/OjpbIituYW1lQ2hhcisiXXxbIituYW1lQ2hhcisiXSopIik7CiAgICB2YXIgYXR0cmlidXRlTmFtZVJlZ2V4cCA9IG5ldyBSZWdFeHAoIl5bOiIrbmFtZVN0YXJ0Q2hhcisiXVs6XFwuIituYW1lQ2hhcisiXSooPz1cXHMqPSkiKTsKICAgIHZhciB3cmFwcGVkQXR0cmlidXRlTmFtZVJlZ2V4cCA9IG5ldyBSZWdFeHAoIl5bOiIrbmFtZVN0YXJ0Q2hhcisiXVs6XFwuIituYW1lQ2hhcisiXSoiKTsKICAgIHZhciBjbGFzc05hbWVSZWdleHAgPSAvXlwuLT9bX2EtekEtWl0rW1x3XC1dKi87CiAgICB2YXIgY2xhc3NJZFJlZ2V4cCA9IC9eI1tfYS16QS1aXStbXHdcLV0qLzsKCiAgICBmdW5jdGlvbiBiYWNrdXAocG9zLCB0b2tlbml6ZSwgc3R5bGUpIHsKICAgICAgdmFyIHJlc3RvcmUgPSBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbml6ZTsKICAgICAgICBpZiAoc3RyZWFtLnBvcyA8IHBvcykgewogICAgICAgICAgc3RyZWFtLnBvcyA9IHBvczsKICAgICAgICAgIHJldHVybiBzdHlsZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgICB9OwogICAgICByZXR1cm4gZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICAgIHN0YXRlLnRva2VuaXplID0gcmVzdG9yZTsKICAgICAgICByZXR1cm4gdG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gbWF5YmVCYWNrdXAoc3RyZWFtLCBzdGF0ZSwgcGF0LCBvZmZzZXQsIHN0eWxlKSB7CiAgICAgIHZhciBjdXIgPSBzdHJlYW0uY3VycmVudCgpOwogICAgICB2YXIgaWR4ID0gY3VyLnNlYXJjaChwYXQpOwogICAgICBpZiAoaWR4ID4gLTEpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IGJhY2t1cChzdHJlYW0ucG9zLCBzdGF0ZS50b2tlbml6ZSwgc3R5bGUpOwogICAgICAgIHN0cmVhbS5iYWNrVXAoY3VyLmxlbmd0aCAtIGlkeCAtIG9mZnNldCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHN0eWxlOwogICAgfQoKICAgIGZ1bmN0aW9uIGNvbnRpbnVlTGluZShzdGF0ZSwgY29sdW1uKSB7CiAgICAgIHN0YXRlLnN0YWNrID0gewogICAgICAgIHBhcmVudDogc3RhdGUuc3RhY2ssCiAgICAgICAgc3R5bGU6ICJjb250aW51YXRpb24iLAogICAgICAgIGluZGVudGVkOiBjb2x1bW4sCiAgICAgICAgdG9rZW5pemU6IHN0YXRlLmxpbmUKICAgICAgfTsKICAgICAgc3RhdGUubGluZSA9IHN0YXRlLnRva2VuaXplOwogICAgfQogICAgZnVuY3Rpb24gZmluaXNoQ29udGludWUoc3RhdGUpIHsKICAgICAgaWYgKHN0YXRlLmxpbmUgPT0gc3RhdGUudG9rZW5pemUpIHsKICAgICAgICBzdGF0ZS5saW5lID0gc3RhdGUuc3RhY2sudG9rZW5pemU7CiAgICAgICAgc3RhdGUuc3RhY2sgPSBzdGF0ZS5zdGFjay5wYXJlbnQ7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBsaW5lQ29udGludWFibGUoY29sdW1uLCB0b2tlbml6ZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICAgIGZpbmlzaENvbnRpbnVlKHN0YXRlKTsKICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eXFwkLykpIHsKICAgICAgICAgIGNvbnRpbnVlTGluZShzdGF0ZSwgY29sdW1uKTsKICAgICAgICAgIHJldHVybiAibGluZUNvbnRpbnVhdGlvbiI7CiAgICAgICAgfQogICAgICAgIHZhciBzdHlsZSA9IHRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgICAgIGlmIChzdHJlYW0uZW9sKCkgJiYgc3RyZWFtLmN1cnJlbnQoKS5tYXRjaCgvKD86XnxbXlxcXSkoPzpcXFxcKSpcXCQvKSkgewogICAgICAgICAgc3RyZWFtLmJhY2tVcCgxKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHN0eWxlOwogICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gY29tbWFDb250aW51YWJsZShjb2x1bW4sIHRva2VuaXplKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgICAgZmluaXNoQ29udGludWUoc3RhdGUpOwogICAgICAgIHZhciBzdHlsZSA9IHRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgICAgIGlmIChzdHJlYW0uZW9sKCkgJiYgc3RyZWFtLmN1cnJlbnQoKS5tYXRjaCgvLCQvKSkgewogICAgICAgICAgY29udGludWVMaW5lKHN0YXRlLCBjb2x1bW4pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc3R5bGU7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gcnVieUluUXVvdGUoZW5kUXVvdGUsIHRva2VuaXplKSB7CiAgICAgIC8vIFRPRE86IGFkZCBtdWx0aSBsaW5lIHN1cHBvcnQKICAgICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgICB2YXIgY2ggPSBzdHJlYW0ucGVlaygpOwogICAgICAgIGlmIChjaCA9PSBlbmRRdW90ZSAmJiBzdGF0ZS5ydWJ5U3RhdGUudG9rZW5pemUubGVuZ3RoID09IDEpIHsKICAgICAgICAgIC8vIHN0ZXAgb3V0IG9mIHJ1YnkgY29udGV4dCBhcyBpdCBzZWVtcyB0byBjb21wbGV0ZSBwcm9jZXNzaW5nIGFsbCB0aGUgYnJhY2VzCiAgICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbml6ZTsKICAgICAgICAgIHJldHVybiAiY2xvc2VBdHRyaWJ1dGVUYWciOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gcnVieShzdHJlYW0sIHN0YXRlKTsKICAgICAgICB9CiAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBzdGFydFJ1YnlTcGxhdCh0b2tlbml6ZSkgewogICAgICB2YXIgcnVieVN0YXRlOwogICAgICB2YXIgcnVuU3BsYXQgPSBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgICAgaWYgKHN0YXRlLnJ1YnlTdGF0ZS50b2tlbml6ZS5sZW5ndGggPT0gMSAmJiAhc3RhdGUucnVieVN0YXRlLmNvbnRleHQucHJldikgewogICAgICAgICAgc3RyZWFtLmJhY2tVcCgxKTsKICAgICAgICAgIGlmIChzdHJlYW0uZWF0U3BhY2UoKSkgewogICAgICAgICAgICBzdGF0ZS5ydWJ5U3RhdGUgPSBydWJ5U3RhdGU7CiAgICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5pemU7CiAgICAgICAgICAgIHJldHVybiB0b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgICAgICAgIH0KICAgICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBydWJ5KHN0cmVhbSwgc3RhdGUpOwogICAgICB9OwogICAgICByZXR1cm4gZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICAgIHJ1YnlTdGF0ZSA9IHN0YXRlLnJ1YnlTdGF0ZTsKICAgICAgICBzdGF0ZS5ydWJ5U3RhdGUgPSBDb2RlTWlycm9yLnN0YXJ0U3RhdGUocnVieU1vZGUpOwogICAgICAgIHN0YXRlLnRva2VuaXplID0gcnVuU3BsYXQ7CiAgICAgICAgcmV0dXJuIHJ1Ynkoc3RyZWFtLCBzdGF0ZSk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gcnVieShzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHJldHVybiBydWJ5TW9kZS50b2tlbihzdHJlYW0sIHN0YXRlLnJ1YnlTdGF0ZSk7CiAgICB9CgogICAgZnVuY3Rpb24gaHRtbExpbmUoc3RyZWFtLCBzdGF0ZSkgewogICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eXFwkLykpIHsKICAgICAgICByZXR1cm4gImxpbmVDb250aW51YXRpb24iOwogICAgICB9CiAgICAgIHJldHVybiBodG1sKHN0cmVhbSwgc3RhdGUpOwogICAgfQogICAgZnVuY3Rpb24gaHRtbChzdHJlYW0sIHN0YXRlKSB7CiAgICAgIGlmIChzdHJlYW0ubWF0Y2goL14jXHsvKSkgewogICAgICAgIHN0YXRlLnRva2VuaXplID0gcnVieUluUXVvdGUoIn0iLCBzdGF0ZS50b2tlbml6ZSk7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgcmV0dXJuIG1heWJlQmFja3VwKHN0cmVhbSwgc3RhdGUsIC9bXlxcXSNcey8sIDEsIGh0bWxNb2RlLnRva2VuKHN0cmVhbSwgc3RhdGUuaHRtbFN0YXRlKSk7CiAgICB9CgogICAgZnVuY3Rpb24gc3RhcnRIdG1sTGluZShsYXN0VG9rZW5pemUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgICB2YXIgc3R5bGUgPSBodG1sTGluZShzdHJlYW0sIHN0YXRlKTsKICAgICAgICBpZiAoc3RyZWFtLmVvbCgpKSBzdGF0ZS50b2tlbml6ZSA9IGxhc3RUb2tlbml6ZTsKICAgICAgICByZXR1cm4gc3R5bGU7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gc3RhcnRIdG1sTW9kZShzdHJlYW0sIHN0YXRlLCBvZmZzZXQpIHsKICAgICAgc3RhdGUuc3RhY2sgPSB7CiAgICAgICAgcGFyZW50OiBzdGF0ZS5zdGFjaywKICAgICAgICBzdHlsZTogImh0bWwiLAogICAgICAgIGluZGVudGVkOiBzdHJlYW0uY29sdW1uKCkgKyBvZmZzZXQsIC8vIHBpcGUgKyBzcGFjZQogICAgICAgIHRva2VuaXplOiBzdGF0ZS5saW5lCiAgICAgIH07CiAgICAgIHN0YXRlLmxpbmUgPSBzdGF0ZS50b2tlbml6ZSA9IGh0bWw7CiAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIGZ1bmN0aW9uIGNvbW1lbnQoc3RyZWFtLCBzdGF0ZSkgewogICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICAgIHJldHVybiBzdGF0ZS5zdGFjay5zdHlsZTsKICAgIH0KCiAgICBmdW5jdGlvbiBjb21tZW50TW9kZShzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHN0YXRlLnN0YWNrID0gewogICAgICAgIHBhcmVudDogc3RhdGUuc3RhY2ssCiAgICAgICAgc3R5bGU6ICJjb21tZW50IiwKICAgICAgICBpbmRlbnRlZDogc3RhdGUuaW5kZW50ZWQgKyAxLAogICAgICAgIHRva2VuaXplOiBzdGF0ZS5saW5lCiAgICAgIH07CiAgICAgIHN0YXRlLmxpbmUgPSBjb21tZW50OwogICAgICByZXR1cm4gY29tbWVudChzdHJlYW0sIHN0YXRlKTsKICAgIH0KCiAgICBmdW5jdGlvbiBhdHRyaWJ1dGVXcmFwcGVyKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgaWYgKHN0cmVhbS5lYXQoc3RhdGUuc3RhY2suZW5kUXVvdGUpKSB7CiAgICAgICAgc3RhdGUubGluZSA9IHN0YXRlLnN0YWNrLmxpbmU7CiAgICAgICAgc3RhdGUudG9rZW5pemUgPSBzdGF0ZS5zdGFjay50b2tlbml6ZTsKICAgICAgICBzdGF0ZS5zdGFjayA9IHN0YXRlLnN0YWNrLnBhcmVudDsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBpZiAoc3RyZWFtLm1hdGNoKHdyYXBwZWRBdHRyaWJ1dGVOYW1lUmVnZXhwKSkgewogICAgICAgIHN0YXRlLnRva2VuaXplID0gYXR0cmlidXRlV3JhcHBlckFzc2lnbjsKICAgICAgICByZXR1cm4gInNsaW1BdHRyaWJ1dGUiOwogICAgICB9CiAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgZnVuY3Rpb24gYXR0cmlidXRlV3JhcHBlckFzc2lnbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIGlmIChzdHJlYW0ubWF0Y2goL149PT8vKSkgewogICAgICAgIHN0YXRlLnRva2VuaXplID0gYXR0cmlidXRlV3JhcHBlclZhbHVlOwogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIHJldHVybiBhdHRyaWJ1dGVXcmFwcGVyKHN0cmVhbSwgc3RhdGUpOwogICAgfQogICAgZnVuY3Rpb24gYXR0cmlidXRlV3JhcHBlclZhbHVlKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgdmFyIGNoID0gc3RyZWFtLnBlZWsoKTsKICAgICAgaWYgKGNoID09ICciJyB8fCBjaCA9PSAiXCciKSB7CiAgICAgICAgc3RhdGUudG9rZW5pemUgPSByZWFkUXVvdGVkKGNoLCAic3RyaW5nIiwgdHJ1ZSwgZmFsc2UsIGF0dHJpYnV0ZVdyYXBwZXIpOwogICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgcmV0dXJuIHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgICB9CiAgICAgIGlmIChjaCA9PSAnWycpIHsKICAgICAgICByZXR1cm4gc3RhcnRSdWJ5U3BsYXQoYXR0cmlidXRlV3JhcHBlcikoc3RyZWFtLCBzdGF0ZSk7CiAgICAgIH0KICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXih0cnVlfGZhbHNlfG5pbClcYi8pKSB7CiAgICAgICAgc3RhdGUudG9rZW5pemUgPSBhdHRyaWJ1dGVXcmFwcGVyOwogICAgICAgIHJldHVybiAia2V5d29yZCI7CiAgICAgIH0KICAgICAgcmV0dXJuIHN0YXJ0UnVieVNwbGF0KGF0dHJpYnV0ZVdyYXBwZXIpKHN0cmVhbSwgc3RhdGUpOwogICAgfQoKICAgIGZ1bmN0aW9uIHN0YXJ0QXR0cmlidXRlV3JhcHBlck1vZGUoc3RhdGUsIGVuZFF1b3RlLCB0b2tlbml6ZSkgewogICAgICBzdGF0ZS5zdGFjayA9IHsKICAgICAgICBwYXJlbnQ6IHN0YXRlLnN0YWNrLAogICAgICAgIHN0eWxlOiAid3JhcHBlciIsCiAgICAgICAgaW5kZW50ZWQ6IHN0YXRlLmluZGVudGVkICsgMSwKICAgICAgICB0b2tlbml6ZTogdG9rZW5pemUsCiAgICAgICAgbGluZTogc3RhdGUubGluZSwKICAgICAgICBlbmRRdW90ZTogZW5kUXVvdGUKICAgICAgfTsKICAgICAgc3RhdGUubGluZSA9IHN0YXRlLnRva2VuaXplID0gYXR0cmlidXRlV3JhcHBlcjsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgZnVuY3Rpb24gc3ViKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXiNcey8pKSB7CiAgICAgICAgc3RhdGUudG9rZW5pemUgPSBydWJ5SW5RdW90ZSgifSIsIHN0YXRlLnRva2VuaXplKTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICB2YXIgc3ViU3RyZWFtID0gbmV3IENvZGVNaXJyb3IuU3RyaW5nU3RyZWFtKHN0cmVhbS5zdHJpbmcuc2xpY2Uoc3RhdGUuc3RhY2suaW5kZW50ZWQpLCBzdHJlYW0udGFiU2l6ZSk7CiAgICAgIHN1YlN0cmVhbS5wb3MgPSBzdHJlYW0ucG9zIC0gc3RhdGUuc3RhY2suaW5kZW50ZWQ7CiAgICAgIHN1YlN0cmVhbS5zdGFydCA9IHN0cmVhbS5zdGFydCAtIHN0YXRlLnN0YWNrLmluZGVudGVkOwogICAgICBzdWJTdHJlYW0ubGFzdENvbHVtblBvcyA9IHN0cmVhbS5sYXN0Q29sdW1uUG9zIC0gc3RhdGUuc3RhY2suaW5kZW50ZWQ7CiAgICAgIHN1YlN0cmVhbS5sYXN0Q29sdW1uVmFsdWUgPSBzdHJlYW0ubGFzdENvbHVtblZhbHVlIC0gc3RhdGUuc3RhY2suaW5kZW50ZWQ7CiAgICAgIHZhciBzdHlsZSA9IHN0YXRlLnN1Yk1vZGUudG9rZW4oc3ViU3RyZWFtLCBzdGF0ZS5zdWJTdGF0ZSk7CiAgICAgIHN0cmVhbS5wb3MgPSBzdWJTdHJlYW0ucG9zICsgc3RhdGUuc3RhY2suaW5kZW50ZWQ7CiAgICAgIHJldHVybiBzdHlsZTsKICAgIH0KICAgIGZ1bmN0aW9uIGZpcnN0U3ViKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgc3RhdGUuc3RhY2suaW5kZW50ZWQgPSBzdHJlYW0uY29sdW1uKCk7CiAgICAgIHN0YXRlLmxpbmUgPSBzdGF0ZS50b2tlbml6ZSA9IHN1YjsKICAgICAgcmV0dXJuIHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgfQoKICAgIGZ1bmN0aW9uIGNyZWF0ZU1vZGUobW9kZSkgewogICAgICB2YXIgcXVlcnkgPSBlbWJlZGRlZFttb2RlXTsKICAgICAgdmFyIHNwZWMgPSBDb2RlTWlycm9yLm1pbWVNb2Rlc1txdWVyeV07CiAgICAgIGlmIChzcGVjKSB7CiAgICAgICAgcmV0dXJuIENvZGVNaXJyb3IuZ2V0TW9kZShjb25maWcsIHNwZWMpOwogICAgICB9CiAgICAgIHZhciBmYWN0b3J5ID0gQ29kZU1pcnJvci5tb2Rlc1txdWVyeV07CiAgICAgIGlmIChmYWN0b3J5KSB7CiAgICAgICAgcmV0dXJuIGZhY3RvcnkoY29uZmlnLCB7bmFtZTogcXVlcnl9KTsKICAgICAgfQogICAgICByZXR1cm4gQ29kZU1pcnJvci5nZXRNb2RlKGNvbmZpZywgIm51bGwiKTsKICAgIH0KCiAgICBmdW5jdGlvbiBnZXRNb2RlKG1vZGUpIHsKICAgICAgaWYgKCFtb2Rlcy5oYXNPd25Qcm9wZXJ0eShtb2RlKSkgewogICAgICAgIHJldHVybiBtb2Rlc1ttb2RlXSA9IGNyZWF0ZU1vZGUobW9kZSk7CiAgICAgIH0KICAgICAgcmV0dXJuIG1vZGVzW21vZGVdOwogICAgfQoKICAgIGZ1bmN0aW9uIHN0YXJ0U3ViTW9kZShtb2RlLCBzdGF0ZSkgewogICAgICB2YXIgc3ViTW9kZSA9IGdldE1vZGUobW9kZSk7CiAgICAgIHZhciBzdWJTdGF0ZSA9IENvZGVNaXJyb3Iuc3RhcnRTdGF0ZShzdWJNb2RlKTsKCiAgICAgIHN0YXRlLnN1Yk1vZGUgPSBzdWJNb2RlOwogICAgICBzdGF0ZS5zdWJTdGF0ZSA9IHN1YlN0YXRlOwoKICAgICAgc3RhdGUuc3RhY2sgPSB7CiAgICAgICAgcGFyZW50OiBzdGF0ZS5zdGFjaywKICAgICAgICBzdHlsZTogInN1YiIsCiAgICAgICAgaW5kZW50ZWQ6IHN0YXRlLmluZGVudGVkICsgMSwKICAgICAgICB0b2tlbml6ZTogc3RhdGUubGluZQogICAgICB9OwogICAgICBzdGF0ZS5saW5lID0gc3RhdGUudG9rZW5pemUgPSBmaXJzdFN1YjsKICAgICAgcmV0dXJuICJzbGltU3VibW9kZSI7CiAgICB9CgogICAgZnVuY3Rpb24gZG9jdHlwZUxpbmUoc3RyZWFtLCBfc3RhdGUpIHsKICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICByZXR1cm4gInNsaW1Eb2N0eXBlIjsKICAgIH0KCiAgICBmdW5jdGlvbiBzdGFydExpbmUoc3RyZWFtLCBzdGF0ZSkgewogICAgICB2YXIgY2ggPSBzdHJlYW0ucGVlaygpOwogICAgICBpZiAoY2ggPT0gJzwnKSB7CiAgICAgICAgcmV0dXJuIChzdGF0ZS50b2tlbml6ZSA9IHN0YXJ0SHRtbExpbmUoc3RhdGUudG9rZW5pemUpKShzdHJlYW0sIHN0YXRlKTsKICAgICAgfQogICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eW3wnXS8pKSB7CiAgICAgICAgcmV0dXJuIHN0YXJ0SHRtbE1vZGUoc3RyZWFtLCBzdGF0ZSwgMSk7CiAgICAgIH0KICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXlwvKCF8XFtcdytdKT8vKSkgewogICAgICAgIHJldHVybiBjb21tZW50TW9kZShzdHJlYW0sIHN0YXRlKTsKICAgICAgfQogICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eKC18PT0/Wzw+XT8pLykpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IGxpbmVDb250aW51YWJsZShzdHJlYW0uY29sdW1uKCksIGNvbW1hQ29udGludWFibGUoc3RyZWFtLmNvbHVtbigpLCBydWJ5KSk7CiAgICAgICAgcmV0dXJuICJzbGltU3dpdGNoIjsKICAgICAgfQogICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eZG9jdHlwZVxiLykpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IGRvY3R5cGVMaW5lOwogICAgICAgIHJldHVybiAia2V5d29yZCI7CiAgICAgIH0KCiAgICAgIHZhciBtID0gc3RyZWFtLm1hdGNoKGVtYmVkZGVkUmVnZXhwKTsKICAgICAgaWYgKG0pIHsKICAgICAgICByZXR1cm4gc3RhcnRTdWJNb2RlKG1bMV0sIHN0YXRlKTsKICAgICAgfQoKICAgICAgcmV0dXJuIHNsaW1UYWcoc3RyZWFtLCBzdGF0ZSk7CiAgICB9CgogICAgZnVuY3Rpb24gc2xpbShzdHJlYW0sIHN0YXRlKSB7CiAgICAgIGlmIChzdGF0ZS5zdGFydE9mTGluZSkgewogICAgICAgIHJldHVybiBzdGFydExpbmUoc3RyZWFtLCBzdGF0ZSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHNsaW1UYWcoc3RyZWFtLCBzdGF0ZSk7CiAgICB9CgogICAgZnVuY3Rpb24gc2xpbVRhZyhzdHJlYW0sIHN0YXRlKSB7CiAgICAgIGlmIChzdHJlYW0uZWF0KCcqJykpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHN0YXJ0UnVieVNwbGF0KHNsaW1UYWdFeHRyYXMpOwogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGlmIChzdHJlYW0ubWF0Y2gobmFtZVJlZ2V4cCkpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHNsaW1UYWdFeHRyYXM7CiAgICAgICAgcmV0dXJuICJzbGltVGFnIjsKICAgICAgfQogICAgICByZXR1cm4gc2xpbUNsYXNzKHN0cmVhbSwgc3RhdGUpOwogICAgfQogICAgZnVuY3Rpb24gc2xpbVRhZ0V4dHJhcyhzdHJlYW0sIHN0YXRlKSB7CiAgICAgIGlmIChzdHJlYW0ubWF0Y2goL14oPD4/fD48PykvKSkgewogICAgICAgIHN0YXRlLnRva2VuaXplID0gc2xpbUNsYXNzOwogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIHJldHVybiBzbGltQ2xhc3Moc3RyZWFtLCBzdGF0ZSk7CiAgICB9CiAgICBmdW5jdGlvbiBzbGltQ2xhc3Moc3RyZWFtLCBzdGF0ZSkgewogICAgICBpZiAoc3RyZWFtLm1hdGNoKGNsYXNzSWRSZWdleHApKSB7CiAgICAgICAgc3RhdGUudG9rZW5pemUgPSBzbGltQ2xhc3M7CiAgICAgICAgcmV0dXJuICJzbGltSWQiOwogICAgICB9CiAgICAgIGlmIChzdHJlYW0ubWF0Y2goY2xhc3NOYW1lUmVnZXhwKSkgewogICAgICAgIHN0YXRlLnRva2VuaXplID0gc2xpbUNsYXNzOwogICAgICAgIHJldHVybiAic2xpbUNsYXNzIjsKICAgICAgfQogICAgICByZXR1cm4gc2xpbUF0dHJpYnV0ZShzdHJlYW0sIHN0YXRlKTsKICAgIH0KICAgIGZ1bmN0aW9uIHNsaW1BdHRyaWJ1dGUoc3RyZWFtLCBzdGF0ZSkgewogICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eKFtcW1x7XChdKS8pKSB7CiAgICAgICAgcmV0dXJuIHN0YXJ0QXR0cmlidXRlV3JhcHBlck1vZGUoc3RhdGUsIGNsb3NpbmdbUmVnRXhwLiQxXSwgc2xpbUF0dHJpYnV0ZSk7CiAgICAgIH0KICAgICAgaWYgKHN0cmVhbS5tYXRjaChhdHRyaWJ1dGVOYW1lUmVnZXhwKSkgewogICAgICAgIHN0YXRlLnRva2VuaXplID0gc2xpbUF0dHJpYnV0ZUFzc2lnbjsKICAgICAgICByZXR1cm4gInNsaW1BdHRyaWJ1dGUiOwogICAgICB9CiAgICAgIGlmIChzdHJlYW0ucGVlaygpID09ICcqJykgewogICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgc3RhdGUudG9rZW5pemUgPSBzdGFydFJ1YnlTcGxhdChzbGltQ29udGVudCk7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgcmV0dXJuIHNsaW1Db250ZW50KHN0cmVhbSwgc3RhdGUpOwogICAgfQogICAgZnVuY3Rpb24gc2xpbUF0dHJpYnV0ZUFzc2lnbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIGlmIChzdHJlYW0ubWF0Y2goL149PT8vKSkgewogICAgICAgIHN0YXRlLnRva2VuaXplID0gc2xpbUF0dHJpYnV0ZVZhbHVlOwogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIC8vIHNob3VsZCBuZXZlciBoYXBwZW4sIGJlY2F1c2Ugb2YgZm9yd2FyZCBsb29rdXAKICAgICAgcmV0dXJuIHNsaW1BdHRyaWJ1dGUoc3RyZWFtLCBzdGF0ZSk7CiAgICB9CgogICAgZnVuY3Rpb24gc2xpbUF0dHJpYnV0ZVZhbHVlKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgdmFyIGNoID0gc3RyZWFtLnBlZWsoKTsKICAgICAgaWYgKGNoID09ICciJyB8fCBjaCA9PSAiXCciKSB7CiAgICAgICAgc3RhdGUudG9rZW5pemUgPSByZWFkUXVvdGVkKGNoLCAic3RyaW5nIiwgdHJ1ZSwgZmFsc2UsIHNsaW1BdHRyaWJ1dGUpOwogICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgcmV0dXJuIHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgICB9CiAgICAgIGlmIChjaCA9PSAnWycpIHsKICAgICAgICByZXR1cm4gc3RhcnRSdWJ5U3BsYXQoc2xpbUF0dHJpYnV0ZSkoc3RyZWFtLCBzdGF0ZSk7CiAgICAgIH0KICAgICAgaWYgKGNoID09ICc6JykgewogICAgICAgIHJldHVybiBzdGFydFJ1YnlTcGxhdChzbGltQXR0cmlidXRlU3ltYm9scykoc3RyZWFtLCBzdGF0ZSk7CiAgICAgIH0KICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXih0cnVlfGZhbHNlfG5pbClcYi8pKSB7CiAgICAgICAgc3RhdGUudG9rZW5pemUgPSBzbGltQXR0cmlidXRlOwogICAgICAgIHJldHVybiAia2V5d29yZCI7CiAgICAgIH0KICAgICAgcmV0dXJuIHN0YXJ0UnVieVNwbGF0KHNsaW1BdHRyaWJ1dGUpKHN0cmVhbSwgc3RhdGUpOwogICAgfQogICAgZnVuY3Rpb24gc2xpbUF0dHJpYnV0ZVN5bWJvbHMoc3RyZWFtLCBzdGF0ZSkgewogICAgICBzdHJlYW0uYmFja1VwKDEpOwogICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eW15cc10sKD89OikvKSkgewogICAgICAgIHN0YXRlLnRva2VuaXplID0gc3RhcnRSdWJ5U3BsYXQoc2xpbUF0dHJpYnV0ZVN5bWJvbHMpOwogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgIHJldHVybiBzbGltQXR0cmlidXRlKHN0cmVhbSwgc3RhdGUpOwogICAgfQogICAgZnVuY3Rpb24gcmVhZFF1b3RlZChxdW90ZSwgc3R5bGUsIGVtYmVkLCB1bmVzY2FwZWQsIG5leHRUb2tlbml6ZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICAgIGZpbmlzaENvbnRpbnVlKHN0YXRlKTsKICAgICAgICB2YXIgZnJlc2ggPSBzdHJlYW0uY3VycmVudCgpLmxlbmd0aCA9PSAwOwogICAgICAgIGlmIChzdHJlYW0ubWF0Y2goL15cXCQvLCBmcmVzaCkpIHsKICAgICAgICAgIGlmICghZnJlc2gpIHJldHVybiBzdHlsZTsKICAgICAgICAgIGNvbnRpbnVlTGluZShzdGF0ZSwgc3RhdGUuaW5kZW50ZWQpOwogICAgICAgICAgcmV0dXJuICJsaW5lQ29udGludWF0aW9uIjsKICAgICAgICB9CiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXiNcey8sIGZyZXNoKSkgewogICAgICAgICAgaWYgKCFmcmVzaCkgcmV0dXJuIHN0eWxlOwogICAgICAgICAgc3RhdGUudG9rZW5pemUgPSBydWJ5SW5RdW90ZSgifSIsIHN0YXRlLnRva2VuaXplKTsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICB2YXIgZXNjYXBlZCA9IGZhbHNlLCBjaDsKICAgICAgICB3aGlsZSAoKGNoID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkgewogICAgICAgICAgaWYgKGNoID09IHF1b3RlICYmICh1bmVzY2FwZWQgfHwgIWVzY2FwZWQpKSB7CiAgICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gbmV4dFRva2VuaXplOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChlbWJlZCAmJiBjaCA9PSAiIyIgJiYgIWVzY2FwZWQpIHsKICAgICAgICAgICAgaWYgKHN0cmVhbS5lYXQoInsiKSkgewogICAgICAgICAgICAgIHN0cmVhbS5iYWNrVXAoMik7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGVzY2FwZWQgPSAhZXNjYXBlZCAmJiBjaCA9PSAiXFwiOwogICAgICAgIH0KICAgICAgICBpZiAoc3RyZWFtLmVvbCgpICYmIGVzY2FwZWQpIHsKICAgICAgICAgIHN0cmVhbS5iYWNrVXAoMSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzdHlsZTsKICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIHNsaW1Db250ZW50KHN0cmVhbSwgc3RhdGUpIHsKICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXj09Py8pKSB7CiAgICAgICAgc3RhdGUudG9rZW5pemUgPSBydWJ5OwogICAgICAgIHJldHVybiAic2xpbVN3aXRjaCI7CiAgICAgIH0KICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXlwvJC8pKSB7IC8vIHRhZyBjbG9zZSBoaW50CiAgICAgICAgc3RhdGUudG9rZW5pemUgPSBzbGltOwogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGlmIChzdHJlYW0ubWF0Y2goL146LykpIHsgLy8gaW5saW5lIHRhZwogICAgICAgIHN0YXRlLnRva2VuaXplID0gc2xpbVRhZzsKICAgICAgICByZXR1cm4gInNsaW1Td2l0Y2giOwogICAgICB9CiAgICAgIHN0YXJ0SHRtbE1vZGUoc3RyZWFtLCBzdGF0ZSwgMCk7CiAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgIH0KCiAgICB2YXIgbW9kZSA9IHsKICAgICAgLy8gZGVmYXVsdCB0byBodG1sIG1vZGUKICAgICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGh0bWxTdGF0ZSA9IENvZGVNaXJyb3Iuc3RhcnRTdGF0ZShodG1sTW9kZSk7CiAgICAgICAgdmFyIHJ1YnlTdGF0ZSA9IENvZGVNaXJyb3Iuc3RhcnRTdGF0ZShydWJ5TW9kZSk7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIGh0bWxTdGF0ZTogaHRtbFN0YXRlLAogICAgICAgICAgcnVieVN0YXRlOiBydWJ5U3RhdGUsCiAgICAgICAgICBzdGFjazogbnVsbCwKICAgICAgICAgIGxhc3Q6IG51bGwsCiAgICAgICAgICB0b2tlbml6ZTogc2xpbSwKICAgICAgICAgIGxpbmU6IHNsaW0sCiAgICAgICAgICBpbmRlbnRlZDogMAogICAgICAgIH07CiAgICAgIH0sCgogICAgICBjb3B5U3RhdGU6IGZ1bmN0aW9uKHN0YXRlKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIGh0bWxTdGF0ZSA6IENvZGVNaXJyb3IuY29weVN0YXRlKGh0bWxNb2RlLCBzdGF0ZS5odG1sU3RhdGUpLAogICAgICAgICAgcnVieVN0YXRlOiBDb2RlTWlycm9yLmNvcHlTdGF0ZShydWJ5TW9kZSwgc3RhdGUucnVieVN0YXRlKSwKICAgICAgICAgIHN1Yk1vZGU6IHN0YXRlLnN1Yk1vZGUsCiAgICAgICAgICBzdWJTdGF0ZTogc3RhdGUuc3ViTW9kZSAmJiBDb2RlTWlycm9yLmNvcHlTdGF0ZShzdGF0ZS5zdWJNb2RlLCBzdGF0ZS5zdWJTdGF0ZSksCiAgICAgICAgICBzdGFjazogc3RhdGUuc3RhY2ssCiAgICAgICAgICBsYXN0OiBzdGF0ZS5sYXN0LAogICAgICAgICAgdG9rZW5pemU6IHN0YXRlLnRva2VuaXplLAogICAgICAgICAgbGluZTogc3RhdGUubGluZQogICAgICAgIH07CiAgICAgIH0sCgogICAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICAgIGlmIChzdHJlYW0uc29sKCkpIHsKICAgICAgICAgIHN0YXRlLmluZGVudGVkID0gc3RyZWFtLmluZGVudGF0aW9uKCk7CiAgICAgICAgICBzdGF0ZS5zdGFydE9mTGluZSA9IHRydWU7CiAgICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHN0YXRlLmxpbmU7CiAgICAgICAgICB3aGlsZSAoc3RhdGUuc3RhY2sgJiYgc3RhdGUuc3RhY2suaW5kZW50ZWQgPiBzdGF0ZS5pbmRlbnRlZCAmJiBzdGF0ZS5sYXN0ICE9ICJzbGltU3VibW9kZSIpIHsKICAgICAgICAgICAgc3RhdGUubGluZSA9IHN0YXRlLnRva2VuaXplID0gc3RhdGUuc3RhY2sudG9rZW5pemU7CiAgICAgICAgICAgIHN0YXRlLnN0YWNrID0gc3RhdGUuc3RhY2sucGFyZW50OwogICAgICAgICAgICBzdGF0ZS5zdWJNb2RlID0gbnVsbDsKICAgICAgICAgICAgc3RhdGUuc3ViU3RhdGUgPSBudWxsOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoc3RyZWFtLmVhdFNwYWNlKCkpIHJldHVybiBudWxsOwogICAgICAgIHZhciBzdHlsZSA9IHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgICAgIHN0YXRlLnN0YXJ0T2ZMaW5lID0gZmFsc2U7CiAgICAgICAgaWYgKHN0eWxlKSBzdGF0ZS5sYXN0ID0gc3R5bGU7CiAgICAgICAgcmV0dXJuIHN0eWxlTWFwLmhhc093blByb3BlcnR5KHN0eWxlKSA/IHN0eWxlTWFwW3N0eWxlXSA6IHN0eWxlOwogICAgICB9LAoKICAgICAgYmxhbmtMaW5lOiBmdW5jdGlvbihzdGF0ZSkgewogICAgICAgIGlmIChzdGF0ZS5zdWJNb2RlICYmIHN0YXRlLnN1Yk1vZGUuYmxhbmtMaW5lKSB7CiAgICAgICAgICByZXR1cm4gc3RhdGUuc3ViTW9kZS5ibGFua0xpbmUoc3RhdGUuc3ViU3RhdGUpOwogICAgICAgIH0KICAgICAgfSwKCiAgICAgIGlubmVyTW9kZTogZnVuY3Rpb24oc3RhdGUpIHsKICAgICAgICBpZiAoc3RhdGUuc3ViTW9kZSkgcmV0dXJuIHtzdGF0ZTogc3RhdGUuc3ViU3RhdGUsIG1vZGU6IHN0YXRlLnN1Yk1vZGV9OwogICAgICAgIHJldHVybiB7c3RhdGU6IHN0YXRlLCBtb2RlOiBtb2RlfTsKICAgICAgfQoKICAgICAgLy9pbmRlbnQ6IGZ1bmN0aW9uKHN0YXRlKSB7CiAgICAgIC8vICByZXR1cm4gc3RhdGUuaW5kZW50ZWQ7CiAgICAgIC8vfQogICAgfTsKICAgIHJldHVybiBtb2RlOwogIH0sICJodG1sbWl4ZWQiLCAicnVieSIpOwoKICBDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveC1zbGltIiwgInNsaW0iKTsKICBDb2RlTWlycm9yLmRlZmluZU1JTUUoImFwcGxpY2F0aW9uL3gtc2xpbSIsICJzbGltIik7Cn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/slim/test.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovLyBTbGltIEhpZ2hsaWdodGluZyBmb3IgQ29kZU1pcnJvciBjb3B5cmlnaHQgKGMpIEhpY2tuSGFjayBTb2Z0d2FyZSBHbWJoCgooZnVuY3Rpb24oKSB7CiAgdmFyIG1vZGUgPSBDb2RlTWlycm9yLmdldE1vZGUoe3RhYlNpemU6IDQsIGluZGVudFVuaXQ6IDJ9LCAic2xpbSIpOwogIGZ1bmN0aW9uIE1UKG5hbWUpIHsgdGVzdC5tb2RlKG5hbWUsIG1vZGUsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpOyB9CgogIC8vIFJlcXVpcmVzIGF0IGxlYXN0IG9uZSBtZWRpYSBxdWVyeQogIE1UKCJlbGVtZW50TmFtZSIsCiAgICAgIlt0YWcgaDFdIEhleSBUaGVyZSIpOwoKICBNVCgib25lRWxlbWVudFBlckxpbmUiLAogICAgICJbdGFnIGgxXSBIZXkgVGhlcmUgLmgyIik7CgogIE1UKCJpZFNob3J0Y3V0IiwKICAgICAiW2F0dHJpYnV0ZSZkZWYgI3Rlc3RdIEhleSBUaGVyZSIpOwoKICBNVCgidGFnV2l0aElkU2hvcnRjdXRzIiwKICAgICAiW3RhZyBoMV1bYXR0cmlidXRlJmRlZiAjdGVzdF0gSGV5IFRoZXJlIik7CgogIE1UKCJjbGFzc1Nob3J0Y3V0IiwKICAgICAiW2F0dHJpYnV0ZSZxdWFsaWZpZXIgLmhlbGxvXSBIZXkgVGhlcmUiKTsKCiAgTVQoInRhZ1dpdGhJZEFuZENsYXNzU2hvcnRjdXRzIiwKICAgICAiW3RhZyBoMV1bYXR0cmlidXRlJmRlZiAjdGVzdF1bYXR0cmlidXRlJnF1YWxpZmllciAuaGVsbG9dIEhleSBUaGVyZSIpOwoKICBNVCgiZG9jVHlwZSIsCiAgICAgIltrZXl3b3JkIGRvY3R5cGVdIHhtbCIpOwoKICBNVCgiY29tbWVudCIsCiAgICAgIltjb21tZW50IC8gSGVsbG8gV09STERdIik7CgogIE1UKCJub3RDb21tZW50IiwKICAgICAiW3RhZyBoMV0gVGhpcyBpcyBub3QgYSAvIGNvbW1lbnQgIik7CgogIE1UKCJhdHRyaWJ1dGVzIiwKICAgICAiW3RhZyBhXShbYXR0cmlidXRlIHRpdGxlXT1bc3RyaW5nIFwidGVzdFwiXSkgW2F0dHJpYnV0ZSBocmVmXT1bc3RyaW5nIFwibGlua1wiXX0iKTsKCiAgTVQoIm11bHRpTGluZUF0dHJpYnV0ZXMiLAogICAgICJbdGFnIGFdKFthdHRyaWJ1dGUgdGl0bGVdPVtzdHJpbmcgXCJ0ZXN0XCJdIiwKICAgICAiICApIFthdHRyaWJ1dGUgaHJlZl09W3N0cmluZyBcImxpbmtcIl19Iik7CgogIE1UKCJodG1sQ29kZSIsCiAgICAgIlt0YWcmYnJhY2tldCA8XVt0YWcgaDFdW3RhZyZicmFja2V0ID5dVGl0bGVbdGFnJmJyYWNrZXQgPC9dW3RhZyBoMV1bdGFnJmJyYWNrZXQgPl0iKTsKCiAgTVQoInJ1YnlCbG9jayIsCiAgICAgIltvcGVyYXRvciZzcGVjaWFsID1dW3ZhcmlhYmxlLTIgQGl0ZW1dIik7CgogIE1UKCJzZWxlY3RvclJ1YnlCbG9jayIsCiAgICAgIlt0YWcgYV1bYXR0cmlidXRlJnF1YWxpZmllciAudGVzdF1bb3BlcmF0b3Imc3BlY2lhbCA9XSBbdmFyaWFibGUtMiBAaXRlbV0iKTsKCiAgTVQoIm5lc3RlZFJ1YnlCbG9jayIsCiAgICAgICJbdGFnIGFdIiwKICAgICAgIiAgW29wZXJhdG9yJnNwZWNpYWwgPV1bdmFyaWFibGUgcHV0c10gW3N0cmluZyBcInRlc3RcIl0iKTsKCiAgTVQoIm11bHRpbGluZVBsYWludGV4dCIsCiAgICAgICJbdGFnIHBdIiwKICAgICAgIiAgfCBIZWxsbywiLAogICAgICAiICAgIFdvcmxkIik7CgogIE1UKCJtdWx0aWxpbmVSdWJ5IiwKICAgICAgIlt0YWcgcF0iLAogICAgICAiICBbY29tbWVudCAvIyB0aGlzIGlzIGEgY29tbWVudF0iLAogICAgICAiICAgICBbY29tbWVudCBhbmQgdGhpcyBpcyBhIGNvbW1lbnQgdG9vXSIsCiAgICAgICIgIHwgRGF0ZS9UaW1lIiwKICAgICAgIiAgW29wZXJhdG9yJnNwZWNpYWwgLV0gW3ZhcmlhYmxlIG5vd10gW29wZXJhdG9yID1dIFt0YWcgRGF0ZVRpbWVdW29wZXJhdG9yIC5dW3Byb3BlcnR5IG5vd10iLAogICAgICAiICBbdGFnIHN0cm9uZ11bb3BlcmF0b3Imc3BlY2lhbCA9XSBbdmFyaWFibGUgbm93XSIsCiAgICAgICIgIFtvcGVyYXRvciZzcGVjaWFsIC1dIFtrZXl3b3JkIGlmXSBbdmFyaWFibGUgbm93XSBbb3BlcmF0b3IgPl0gW3RhZyBEYXRlVGltZV1bb3BlcmF0b3IgLl1bcHJvcGVydHkgcGFyc2VdKFtzdHJpbmcgXCJEZWNlbWJlciAzMSwgMjAwNlwiXSkiLAogICAgICAiICAgICBbb3BlcmF0b3Imc3BlY2lhbCA9XVtzdHJpbmcgXCJIYXBweVwiXSIsCiAgICAgICIgICAgIFtvcGVyYXRvciZzcGVjaWFsID1dW3N0cmluZyBcIkJlbGF0ZWRcIl0iLAogICAgICAiICAgICBbb3BlcmF0b3Imc3BlY2lhbCA9XVtzdHJpbmcgXCJCaXJ0aGRheVwiXSIpOwoKICBNVCgibXVsdGlsaW5lQ29tbWVudCIsCiAgICAgICJbY29tbWVudCAvXSIsCiAgICAgICIgIFtjb21tZW50IE11bHRpbGluZV0iLAogICAgICAiICBbY29tbWVudCBDb21tZW50XSIpOwoKICBNVCgiaGFtbEFmdGVyUnVieVRhZyIsCiAgICAiW2F0dHJpYnV0ZSZxdWFsaWZpZXIgLmJsb2NrXSIsCiAgICAiICBbdGFnIHN0cm9uZ11bb3BlcmF0b3Imc3BlY2lhbCA9XSBbdmFyaWFibGUgbm93XSIsCiAgICAiICBbYXR0cmlidXRlJnF1YWxpZmllciAudGVzdF0iLAogICAgIiAgICAgW29wZXJhdG9yJnNwZWNpYWwgPV1bdmFyaWFibGUgbm93XSIsCiAgICAiICBbYXR0cmlidXRlJnF1YWxpZmllciAucmlnaHRdIik7CgogIE1UKCJzdHJldGNoZWRSdWJ5IiwKICAgICAiW29wZXJhdG9yJnNwZWNpYWwgPV0gW3ZhcmlhYmxlIHB1dHNdIFtzdHJpbmcgXCJIZWxsb1wiXSwiLAogICAgICIgICBbc3RyaW5nIFwiV29ybGRcIl0iKTsKCiAgTVQoImludGVycG9sYXRpb25Jbkhhc2hBdHRyaWJ1dGUiLAogICAgICJbdGFnIGRpdl17W2F0dHJpYnV0ZSBpZF0gPSBbc3RyaW5nIFwiXSN7W3ZhcmlhYmxlIHRlc3RdfVtzdHJpbmcgX10je1t2YXJpYWJsZSB0aW5nXX1bc3RyaW5nIFwiXX0gdGVzdCIpOwoKICBNVCgiaW50ZXJwb2xhdGlvbkluSFRNTEF0dHJpYnV0ZSIsCiAgICAgIlt0YWcgZGl2XShbYXR0cmlidXRlIHRpdGxlXT1bc3RyaW5nIFwiXSN7W3ZhcmlhYmxlIHRlc3RdfVtzdHJpbmcgX10je1t2YXJpYWJsZSB0aW5nXSgpfVtzdHJpbmcgXCJdKSBUZXN0Iik7Cn0pKCk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/smalltalk/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/smalltalk/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogU21hbGx0YWxrIG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vLi4vYWRkb24vZWRpdC9tYXRjaGJyYWNrZXRzLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9InNtYWxsdGFsay5qcyI+PC9zY3JpcHQ+CjxzdHlsZT4KICAgICAgLkNvZGVNaXJyb3Ige2JvcmRlcjogMnB4IHNvbGlkICNkZWU7IGJvcmRlci1yaWdodC13aWR0aDogMTBweDt9CiAgICAgIC5Db2RlTWlycm9yLWd1dHRlciB7Ym9yZGVyOiBub25lOyBiYWNrZ3JvdW5kOiAjZGVlO30KICAgICAgLkNvZGVNaXJyb3ItZ3V0dGVyIHByZSB7Y29sb3I6IHdoaXRlOyBmb250LXdlaWdodDogYm9sZDt9CiAgICA8L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxoMT5Db2RlTWlycm9yPC9oMT48aW1nIGlkPWxvZ28gc3JjPSIuLi8uLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5MYW5ndWFnZSBtb2RlczwvYT4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+U21hbGx0YWxrPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5TbWFsbHRhbGsgbW9kZTwvaDI+Cjxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+CiIgCiAgICBUaGlzIGlzIGEgdGVzdCBvZiB0aGUgU21hbGx0YWxrIGNvZGUKIgpTZWFzaWRlLldBQ29tcG9uZW50IHN1YmNsYXNzOiAjTXlDb3VudGVyIFsKICAgIHwgY291bnQgfAogICAgTXlDb3VudGVyIGNsYXNzICZndDsmZ3Q7IGNhbkJlUm9vdCBbIF50cnVlIF0KCiAgICBpbml0aWFsaXplIFsKICAgICAgICBzdXBlciBpbml0aWFsaXplLgogICAgICAgIGNvdW50IDo9IDAuCiAgICBdCiAgICBzdGF0ZXMgWyBeeyBzZWxmIH0gXQogICAgcmVuZGVyQ29udGVudE9uOiBodG1sIFsKICAgICAgICBodG1sIGhlYWRpbmc6IGNvdW50LgogICAgICAgIGh0bWwgYW5jaG9yIGNhbGxiYWNrOiBbIGNvdW50IDo9IGNvdW50ICsgMSBdOyB3aXRoOiAnKysnLgogICAgICAgIGh0bWwgc3BhY2UuCiAgICAgICAgaHRtbCBhbmNob3IgY2FsbGJhY2s6IFsgY291bnQgOj0gY291bnQgLSAxIF07IHdpdGg6ICctLScuCiAgICBdCl0KCk15Q291bnRlciByZWdpc3RlckFzQXBwbGljYXRpb246ICdteWNvdW50ZXInCjwvdGV4dGFyZWE+PC9mb3JtPgoKICAgIDxzY3JpcHQ+CiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICAgICAgbGluZU51bWJlcnM6IHRydWUsCiAgICAgICAgbWF0Y2hCcmFja2V0czogdHJ1ZSwKICAgICAgICBtb2RlOiAidGV4dC94LXN0c3JjIiwKICAgICAgICBpbmRlbnRVbml0OiA0CiAgICAgIH0pOwogICAgPC9zY3JpcHQ+CgogICAgPHA+U2ltcGxlIFNtYWxsdGFsayBtb2RlLjwvcD4KCiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC94LXN0c3JjPC9jb2RlPi48L3A+CiAgPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/smalltalk/smalltalk.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCdzbWFsbHRhbGsnLCBmdW5jdGlvbihjb25maWcpIHsKCiAgdmFyIHNwZWNpYWxDaGFycyA9IC9bK1wtXC9cXCp+PD49QCV8Jj8hLiw6O15dLzsKICB2YXIga2V5d29yZHMgPSAvdHJ1ZXxmYWxzZXxuaWx8c2VsZnxzdXBlcnx0aGlzQ29udGV4dC87CgogIHZhciBDb250ZXh0ID0gZnVuY3Rpb24odG9rZW5pemVyLCBwYXJlbnQpIHsKICAgIHRoaXMubmV4dCA9IHRva2VuaXplcjsKICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwogIH07CgogIHZhciBUb2tlbiA9IGZ1bmN0aW9uKG5hbWUsIGNvbnRleHQsIGVvcykgewogICAgdGhpcy5uYW1lID0gbmFtZTsKICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7CiAgICB0aGlzLmVvcyA9IGVvczsKICB9OwoKICB2YXIgU3RhdGUgPSBmdW5jdGlvbigpIHsKICAgIHRoaXMuY29udGV4dCA9IG5ldyBDb250ZXh0KG5leHQsIG51bGwpOwogICAgdGhpcy5leHBlY3RWYXJpYWJsZSA9IHRydWU7CiAgICB0aGlzLmluZGVudGF0aW9uID0gMDsKICAgIHRoaXMudXNlckluZGVudGF0aW9uRGVsdGEgPSAwOwogIH07CgogIFN0YXRlLnByb3RvdHlwZS51c2VySW5kZW50ID0gZnVuY3Rpb24oaW5kZW50YXRpb24pIHsKICAgIHRoaXMudXNlckluZGVudGF0aW9uRGVsdGEgPSBpbmRlbnRhdGlvbiA+IDAgPyAoaW5kZW50YXRpb24gLyBjb25maWcuaW5kZW50VW5pdCAtIHRoaXMuaW5kZW50YXRpb24pIDogMDsKICB9OwoKICB2YXIgbmV4dCA9IGZ1bmN0aW9uKHN0cmVhbSwgY29udGV4dCwgc3RhdGUpIHsKICAgIHZhciB0b2tlbiA9IG5ldyBUb2tlbihudWxsLCBjb250ZXh0LCBmYWxzZSk7CiAgICB2YXIgYUNoYXIgPSBzdHJlYW0ubmV4dCgpOwoKICAgIGlmIChhQ2hhciA9PT0gJyInKSB7CiAgICAgIHRva2VuID0gbmV4dENvbW1lbnQoc3RyZWFtLCBuZXcgQ29udGV4dChuZXh0Q29tbWVudCwgY29udGV4dCkpOwoKICAgIH0gZWxzZSBpZiAoYUNoYXIgPT09ICdcJycpIHsKICAgICAgdG9rZW4gPSBuZXh0U3RyaW5nKHN0cmVhbSwgbmV3IENvbnRleHQobmV4dFN0cmluZywgY29udGV4dCkpOwoKICAgIH0gZWxzZSBpZiAoYUNoYXIgPT09ICcjJykgewogICAgICBpZiAoc3RyZWFtLnBlZWsoKSA9PT0gJ1wnJykgewogICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgdG9rZW4gPSBuZXh0U3ltYm9sKHN0cmVhbSwgbmV3IENvbnRleHQobmV4dFN5bWJvbCwgY29udGV4dCkpOwogICAgICB9IGVsc2UgewogICAgICAgIGlmIChzdHJlYW0uZWF0V2hpbGUoL1teXHMue31cW1xdKCldLykpCiAgICAgICAgICB0b2tlbi5uYW1lID0gJ3N0cmluZy0yJzsKICAgICAgICBlbHNlCiAgICAgICAgICB0b2tlbi5uYW1lID0gJ21ldGEnOwogICAgICB9CgogICAgfSBlbHNlIGlmIChhQ2hhciA9PT0gJyQnKSB7CiAgICAgIGlmIChzdHJlYW0ubmV4dCgpID09PSAnPCcpIHsKICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1teXHM+XS8pOwogICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgIH0KICAgICAgdG9rZW4ubmFtZSA9ICdzdHJpbmctMic7CgogICAgfSBlbHNlIGlmIChhQ2hhciA9PT0gJ3wnICYmIHN0YXRlLmV4cGVjdFZhcmlhYmxlKSB7CiAgICAgIHRva2VuLmNvbnRleHQgPSBuZXcgQ29udGV4dChuZXh0VGVtcG9yYXJpZXMsIGNvbnRleHQpOwoKICAgIH0gZWxzZSBpZiAoL1tcW1xde30oKV0vLnRlc3QoYUNoYXIpKSB7CiAgICAgIHRva2VuLm5hbWUgPSAnYnJhY2tldCc7CiAgICAgIHRva2VuLmVvcyA9IC9bXFt7KF0vLnRlc3QoYUNoYXIpOwoKICAgICAgaWYgKGFDaGFyID09PSAnWycpIHsKICAgICAgICBzdGF0ZS5pbmRlbnRhdGlvbisrOwogICAgICB9IGVsc2UgaWYgKGFDaGFyID09PSAnXScpIHsKICAgICAgICBzdGF0ZS5pbmRlbnRhdGlvbiA9IE1hdGgubWF4KDAsIHN0YXRlLmluZGVudGF0aW9uIC0gMSk7CiAgICAgIH0KCiAgICB9IGVsc2UgaWYgKHNwZWNpYWxDaGFycy50ZXN0KGFDaGFyKSkgewogICAgICBzdHJlYW0uZWF0V2hpbGUoc3BlY2lhbENoYXJzKTsKICAgICAgdG9rZW4ubmFtZSA9ICdvcGVyYXRvcic7CiAgICAgIHRva2VuLmVvcyA9IGFDaGFyICE9PSAnOyc7IC8vIDsgY2FzY2FkZWQgbWVzc2FnZSBleHByZXNzaW9uCgogICAgfSBlbHNlIGlmICgvXGQvLnRlc3QoYUNoYXIpKSB7CiAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1x3XGRdLyk7CiAgICAgIHRva2VuLm5hbWUgPSAnbnVtYmVyJzsKCiAgICB9IGVsc2UgaWYgKC9bXHdfXS8udGVzdChhQ2hhcikpIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXHdcZF9dLyk7CiAgICAgIHRva2VuLm5hbWUgPSBzdGF0ZS5leHBlY3RWYXJpYWJsZSA/IChrZXl3b3Jkcy50ZXN0KHN0cmVhbS5jdXJyZW50KCkpID8gJ2tleXdvcmQnIDogJ3ZhcmlhYmxlJykgOiBudWxsOwoKICAgIH0gZWxzZSB7CiAgICAgIHRva2VuLmVvcyA9IHN0YXRlLmV4cGVjdFZhcmlhYmxlOwogICAgfQoKICAgIHJldHVybiB0b2tlbjsKICB9OwoKICB2YXIgbmV4dENvbW1lbnQgPSBmdW5jdGlvbihzdHJlYW0sIGNvbnRleHQpIHsKICAgIHN0cmVhbS5lYXRXaGlsZSgvW14iXS8pOwogICAgcmV0dXJuIG5ldyBUb2tlbignY29tbWVudCcsIHN0cmVhbS5lYXQoJyInKSA/IGNvbnRleHQucGFyZW50IDogY29udGV4dCwgdHJ1ZSk7CiAgfTsKCiAgdmFyIG5leHRTdHJpbmcgPSBmdW5jdGlvbihzdHJlYW0sIGNvbnRleHQpIHsKICAgIHN0cmVhbS5lYXRXaGlsZSgvW14nXS8pOwogICAgcmV0dXJuIG5ldyBUb2tlbignc3RyaW5nJywgc3RyZWFtLmVhdCgnXCcnKSA/IGNvbnRleHQucGFyZW50IDogY29udGV4dCwgZmFsc2UpOwogIH07CgogIHZhciBuZXh0U3ltYm9sID0gZnVuY3Rpb24oc3RyZWFtLCBjb250ZXh0KSB7CiAgICBzdHJlYW0uZWF0V2hpbGUoL1teJ10vKTsKICAgIHJldHVybiBuZXcgVG9rZW4oJ3N0cmluZy0yJywgc3RyZWFtLmVhdCgnXCcnKSA/IGNvbnRleHQucGFyZW50IDogY29udGV4dCwgZmFsc2UpOwogIH07CgogIHZhciBuZXh0VGVtcG9yYXJpZXMgPSBmdW5jdGlvbihzdHJlYW0sIGNvbnRleHQpIHsKICAgIHZhciB0b2tlbiA9IG5ldyBUb2tlbihudWxsLCBjb250ZXh0LCBmYWxzZSk7CiAgICB2YXIgYUNoYXIgPSBzdHJlYW0ubmV4dCgpOwoKICAgIGlmIChhQ2hhciA9PT0gJ3wnKSB7CiAgICAgIHRva2VuLmNvbnRleHQgPSBjb250ZXh0LnBhcmVudDsKICAgICAgdG9rZW4uZW9zID0gdHJ1ZTsKCiAgICB9IGVsc2UgewogICAgICBzdHJlYW0uZWF0V2hpbGUoL1tefF0vKTsKICAgICAgdG9rZW4ubmFtZSA9ICd2YXJpYWJsZSc7CiAgICB9CgogICAgcmV0dXJuIHRva2VuOwogIH07CgogIHJldHVybiB7CiAgICBzdGFydFN0YXRlOiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIG5ldyBTdGF0ZTsKICAgIH0sCgogICAgdG9rZW46IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgc3RhdGUudXNlckluZGVudChzdHJlYW0uaW5kZW50YXRpb24oKSk7CgogICAgICBpZiAoc3RyZWFtLmVhdFNwYWNlKCkpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQoKICAgICAgdmFyIHRva2VuID0gc3RhdGUuY29udGV4dC5uZXh0KHN0cmVhbSwgc3RhdGUuY29udGV4dCwgc3RhdGUpOwogICAgICBzdGF0ZS5jb250ZXh0ID0gdG9rZW4uY29udGV4dDsKICAgICAgc3RhdGUuZXhwZWN0VmFyaWFibGUgPSB0b2tlbi5lb3M7CgogICAgICByZXR1cm4gdG9rZW4ubmFtZTsKICAgIH0sCgogICAgYmxhbmtMaW5lOiBmdW5jdGlvbihzdGF0ZSkgewogICAgICBzdGF0ZS51c2VySW5kZW50KDApOwogICAgfSwKCiAgICBpbmRlbnQ6IGZ1bmN0aW9uKHN0YXRlLCB0ZXh0QWZ0ZXIpIHsKICAgICAgdmFyIGkgPSBzdGF0ZS5jb250ZXh0Lm5leHQgPT09IG5leHQgJiYgdGV4dEFmdGVyICYmIHRleHRBZnRlci5jaGFyQXQoMCkgPT09ICddJyA/IC0xIDogc3RhdGUudXNlckluZGVudGF0aW9uRGVsdGE7CiAgICAgIHJldHVybiAoc3RhdGUuaW5kZW50YXRpb24gKyBpKSAqIGNvbmZpZy5pbmRlbnRVbml0OwogICAgfSwKCiAgICBlbGVjdHJpY0NoYXJzOiAnXScKICB9OwoKfSk7CgpDb2RlTWlycm9yLmRlZmluZU1JTUUoJ3RleHQveC1zdHNyYycsIHtuYW1lOiAnc21hbGx0YWxrJ30pOwoKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/smarty/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/smarty/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogU21hcnR5IG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4veG1sL3htbC5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJzbWFydHkuanMiPjwvc2NyaXB0Pgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPi5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazt9PC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aDE+Q29kZU1pcnJvcjwvaDE+PGltZyBpZD1sb2dvIHNyYz0iLi4vLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+TGFuZ3VhZ2UgbW9kZXM8L2E+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPlNtYXJ0eTwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+U21hcnR5IG1vZGU8L2gyPgo8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgp7ZXh0ZW5kcyBmaWxlPSJwYXJlbnQudHBsIn0Ke2luY2x1ZGUgZmlsZT0idGVtcGxhdGUudHBsIn0KCnsqIHNvbWUgZXhhbXBsZSBTbWFydHkgY29udGVudCAqfQp7aWYgaXNzZXQoJG5hbWUpICYmICRuYW1lID09ICdCbG9nJ30KICBUaGlzIGlzIGEgeyR2YXJ9LgogIHskaW50ZWdlciA9IDQ1MX0sIHskYXJyYXlbXSA9ICJhIn0sIHskc3RyaW5ndmFyID0gInN0cmluZyJ9CiAge2Fzc2lnbiB2YXI9J2JvYicgdmFsdWU9JHZhci5wcm9wfQp7ZWxzZWlmICRuYW1lID09ICRmb299CiAge2Z1bmN0aW9uIG5hbWU9bWVudSBsZXZlbD0wfQogICAge2ZvcmVhY2ggJGRhdGEgYXMgJGVudHJ5fQogICAgICB7aWYgaXNfYXJyYXkoJGVudHJ5KX0KICAgICAgICAtIHskZW50cnlAa2V5fQogICAgICAgIHttZW51IGRhdGE9JGVudHJ5IGxldmVsPSRsZXZlbCsxfQogICAgICB7ZWxzZX0KICAgICAgICB7JGVudHJ5fQogICAgICB7L2lmfQogICAgey9mb3JlYWNofQogIHsvZnVuY3Rpb259CnsvaWZ9PC90ZXh0YXJlYT48L2Zvcm0+Cgo8cD5Nb2RlIGZvciBTbWFydHkgdmVyc2lvbiAyIG9yIDMsIHdoaWNoIGFsbG93cyBmb3IgY3VzdG9tIGRlbGltaXRlciB0YWdzLjwvcD4KCjxwPlNldmVyYWwgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGFyZSBzdXBwb3J0ZWQ6PC9wPgoKPHVsPgogIDxsaT48Y29kZT5sZWZ0RGVsaW1pdGVyPC9jb2RlPiBhbmQgPGNvZGU+cmlnaHREZWxpbWl0ZXI8L2NvZGU+LAogIHdoaWNoIHNob3VsZCBiZSBzdHJpbmdzIHRoYXQgZGV0ZXJtaW5lIHdoZXJlIHRoZSBTbWFydHkgc3ludGF4CiAgc3RhcnRzIGFuZCBlbmRzLjwvbGk+CiAgPGxpPjxjb2RlPnZlcnNpb248L2NvZGU+LCB3aGljaCBzaG91bGQgYmUgMiBvciAzLjwvbGk+CiAgPGxpPjxjb2RlPmJhc2VNb2RlPC9jb2RlPiwgd2hpY2ggY2FuIGJlIGEgbW9kZSBzcGVjCiAgbGlrZSA8Y29kZT4idGV4dC9odG1sIjwvY29kZT4gdG8gc2V0IGEgZGlmZmVyZW50IGJhY2tncm91bmQgbW9kZS48L2xpPgo8L3VsPgoKPHA+PHN0cm9uZz5NSU1FIHR5cGVzIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPnRleHQveC1zbWFydHk8L2NvZGU+PC9wPgoKPGgzPlNtYXJ0eSAyLCBjdXN0b20gZGVsaW1pdGVyczwvaDM+Cgo8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUyIiBuYW1lPSJjb2RlMiI+CnstLWV4dGVuZHMgZmlsZT0icGFyZW50LnRwbCItLX0Key0taW5jbHVkZSBmaWxlPSJ0ZW1wbGF0ZS50cGwiLS19Cgp7LS0qIHNvbWUgZXhhbXBsZSBTbWFydHkgY29udGVudCAqLS19CnstLWlmIGlzc2V0KCRuYW1lKSAmJiAkbmFtZSA9PSAnQmxvZyctLX0KICBUaGlzIGlzIGEgey0tJHZhci0tfS4KICB7LS0kaW50ZWdlciA9IDQ1MS0tfSwgey0tJGFycmF5W10gPSAiYSItLX0sIHstLSRzdHJpbmd2YXIgPSAic3RyaW5nIi0tfQogIHstLWFzc2lnbiB2YXI9J2JvYicgdmFsdWU9JHZhci5wcm9wLS19CnstLWVsc2VpZiAkbmFtZSA9PSAkZm9vLS19CiAgey0tZnVuY3Rpb24gbmFtZT1tZW51IGxldmVsPTAtLX0KICAgIHstLWZvcmVhY2ggJGRhdGEgYXMgJGVudHJ5LS19CiAgICAgIHstLWlmIGlzX2FycmF5KCRlbnRyeSktLX0KICAgICAgICAtIHstLSRlbnRyeUBrZXktLX0KICAgICAgICB7LS1tZW51IGRhdGE9JGVudHJ5IGxldmVsPSRsZXZlbCsxLS19CiAgICAgIHstLWVsc2UtLX0KICAgICAgICB7LS0kZW50cnktLX0KICAgICAgey0tL2lmLS19CiAgICB7LS0vZm9yZWFjaC0tfQogIHstLS9mdW5jdGlvbi0tfQp7LS0vaWYtLX08L3RleHRhcmVhPjwvZm9ybT4KCjxoMz5TbWFydHkgMzwvaDM+Cgo8dGV4dGFyZWEgaWQ9ImNvZGUzIiBuYW1lPSJjb2RlMyI+Ck5lc3RlZCB0YWdzIHskZm9vPXtjb3VudGVyIG9uZT0xIHR3bz17aW5jZXB0aW9ufX0rM30gYXJlIG5vdyB2YWxpZCBpbiBTbWFydHkgMy4KCjxzY3JpcHQ+CmZ1bmN0aW9uIHRlc3QoKSB7CiAgY29uc29sZS5sb2coIlNtYXJ0eSAzIHBlcm1pdHMgc2luZ2xlIGN1cmx5IGJyYWNlcyBmb2xsb3dlZCBieSB3aGl0ZXNwYWNlIHRvIE5PVCBzbGlwIGludG8gU21hcnR5IG1vZGUuIik7Cn0KPC9zY3JpcHQ+Cgp7YXNzaWduIHZhcj1mb28gdmFsdWU9WzEsMiwzXX0Ke2Fzc2lnbiB2YXI9Zm9vIHZhbHVlPVsneSc9Pid5ZWxsb3cnLCdiJz0+J2JsdWUnXX0Ke2Fzc2lnbiB2YXI9Zm9vIHZhbHVlPVsxLFs5LDhdLDNdfQoKeyRmb289JGJhcisyfSB7KiBhIGNvbW1lbnQgKn0KeyRmb28uYmFyPTF9ICB7KiBhbm90aGVyIGNvbW1lbnQgKn0KeyRmb28gPSBteWZ1bmN0KCgkeCskeSkqMyl9CnskZm9vID0gc3RybGVuKCRiYXIpfQp7JGZvby5iYXIuYmF6PTF9LCB7JGZvb1tdPTF9CgpTbWFydHkgImRvdCIgc3ludGF4IChub3RlOiBlbWJlZGRlZCB7fSBhcmUgdXNlZCB0byBhZGRyZXNzIGFtYmlndWl0aWVzKToKCnskZm9vLmEuYi5jfSAgICAgID0+ICRmb29bJ2EnXVsnYiddWydjJ10KeyRmb28uYS4kYi5jfSAgICAgPT4gJGZvb1snYSddWyRiXVsnYyddCnskZm9vLmEueyRiKzR9LmN9ID0+ICRmb29bJ2EnXVskYis0XVsnYyddCnskZm9vLmEueyRiLmN9fSAgID0+ICRmb29bJ2EnXVskYlsnYyddXQoKeyRvYmplY3QtPm1ldGhvZDEoJHgpLT5tZXRob2QyKCR5KX08L3RleHRhcmVhPgoKPHNjcmlwdD4KdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICBsaW5lTnVtYmVyczogdHJ1ZSwKICBtb2RlOiAic21hcnR5Igp9KTsKdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlMiIpLCB7CiAgbGluZU51bWJlcnM6IHRydWUsCiAgbW9kZTogewogICAgbmFtZTogInNtYXJ0eSIsCiAgICBsZWZ0RGVsaW1pdGVyOiAiey0tIiwKICAgIHJpZ2h0RGVsaW1pdGVyOiAiLS19IgogIH0KfSk7CnZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZTMiKSwgewogIGxpbmVOdW1iZXJzOiB0cnVlLAogIG1vZGU6IHtuYW1lOiAic21hcnR5IiwgdmVyc2lvbjogMywgYmFzZU1vZGU6ICJ0ZXh0L2h0bWwifQp9KTsKPC9zY3JpcHQ+Cgo8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/smarty/smarty.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovKioKICogU21hcnR5IDIgYW5kIDMgbW9kZS4KICovCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CgogIENvZGVNaXJyb3IuZGVmaW5lTW9kZSgic21hcnR5IiwgZnVuY3Rpb24oY29uZmlnLCBwYXJzZXJDb25mKSB7CiAgICB2YXIgcmlnaHREZWxpbWl0ZXIgPSBwYXJzZXJDb25mLnJpZ2h0RGVsaW1pdGVyIHx8ICJ9IjsKICAgIHZhciBsZWZ0RGVsaW1pdGVyID0gcGFyc2VyQ29uZi5sZWZ0RGVsaW1pdGVyIHx8ICJ7IjsKICAgIHZhciB2ZXJzaW9uID0gcGFyc2VyQ29uZi52ZXJzaW9uIHx8IDI7CiAgICB2YXIgYmFzZU1vZGUgPSBDb2RlTWlycm9yLmdldE1vZGUoY29uZmlnLCBwYXJzZXJDb25mLmJhc2VNb2RlIHx8ICJudWxsIik7CgogICAgdmFyIGtleUZ1bmN0aW9ucyA9IFsiZGVidWciLCAiZXh0ZW5kcyIsICJmdW5jdGlvbiIsICJpbmNsdWRlIiwgImxpdGVyYWwiXTsKICAgIHZhciByZWdzID0gewogICAgICBvcGVyYXRvckNoYXJzOiAvWytcLSomJT08PiE/XS8sCiAgICAgIHZhbGlkSWRlbnRpZmllcjogL1thLXpBLVowLTlfXS8sCiAgICAgIHN0cmluZ0NoYXI6IC9bJyJdLwogICAgfTsKCiAgICB2YXIgbGFzdDsKICAgIGZ1bmN0aW9uIGNvbnQoc3R5bGUsIGxhc3RUeXBlKSB7CiAgICAgIGxhc3QgPSBsYXN0VHlwZTsKICAgICAgcmV0dXJuIHN0eWxlOwogICAgfQoKICAgIGZ1bmN0aW9uIGNoYWluKHN0cmVhbSwgc3RhdGUsIHBhcnNlcikgewogICAgICBzdGF0ZS50b2tlbml6ZSA9IHBhcnNlcjsKICAgICAgcmV0dXJuIHBhcnNlcihzdHJlYW0sIHN0YXRlKTsKICAgIH0KCiAgICAvLyBTbWFydHkgMyBhbGxvd3MgeyBhbmQgfSBzdXJyb3VuZGVkIGJ5IHdoaXRlc3BhY2UgdG8gTk9UIHNsaXAgaW50byBTbWFydHkgbW9kZQogICAgZnVuY3Rpb24gZG9lc05vdENvdW50KHN0cmVhbSwgcG9zKSB7CiAgICAgIGlmIChwb3MgPT0gbnVsbCkgcG9zID0gc3RyZWFtLnBvczsKICAgICAgcmV0dXJuIHZlcnNpb24gPT09IDMgJiYgbGVmdERlbGltaXRlciA9PSAieyIgJiYKICAgICAgICAocG9zID09IHN0cmVhbS5zdHJpbmcubGVuZ3RoIHx8IC9ccy8udGVzdChzdHJlYW0uc3RyaW5nLmNoYXJBdChwb3MpKSk7CiAgICB9CgogICAgZnVuY3Rpb24gdG9rZW5Ub3Aoc3RyZWFtLCBzdGF0ZSkgewogICAgICB2YXIgc3RyaW5nID0gc3RyZWFtLnN0cmluZzsKICAgICAgZm9yICh2YXIgc2NhbiA9IHN0cmVhbS5wb3M7OykgewogICAgICAgIHZhciBuZXh0TWF0Y2ggPSBzdHJpbmcuaW5kZXhPZihsZWZ0RGVsaW1pdGVyLCBzY2FuKTsKICAgICAgICBzY2FuID0gbmV4dE1hdGNoICsgbGVmdERlbGltaXRlci5sZW5ndGg7CiAgICAgICAgaWYgKG5leHRNYXRjaCA9PSAtMSB8fCAhZG9lc05vdENvdW50KHN0cmVhbSwgbmV4dE1hdGNoICsgbGVmdERlbGltaXRlci5sZW5ndGgpKSBicmVhazsKICAgICAgfQogICAgICBpZiAobmV4dE1hdGNoID09IHN0cmVhbS5wb3MpIHsKICAgICAgICBzdHJlYW0ubWF0Y2gobGVmdERlbGltaXRlcik7CiAgICAgICAgaWYgKHN0cmVhbS5lYXQoIioiKSkgewogICAgICAgICAgcmV0dXJuIGNoYWluKHN0cmVhbSwgc3RhdGUsIHRva2VuQmxvY2soImNvbW1lbnQiLCAiKiIgKyByaWdodERlbGltaXRlcikpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzdGF0ZS5kZXB0aCsrOwogICAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlblNtYXJ0eTsKICAgICAgICAgIGxhc3QgPSAic3RhcnRUYWciOwogICAgICAgICAgcmV0dXJuICJ0YWciOwogICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgKG5leHRNYXRjaCA+IC0xKSBzdHJlYW0uc3RyaW5nID0gc3RyaW5nLnNsaWNlKDAsIG5leHRNYXRjaCk7CiAgICAgIHZhciB0b2tlbiA9IGJhc2VNb2RlLnRva2VuKHN0cmVhbSwgc3RhdGUuYmFzZSk7CiAgICAgIGlmIChuZXh0TWF0Y2ggPiAtMSkgc3RyZWFtLnN0cmluZyA9IHN0cmluZzsKICAgICAgcmV0dXJuIHRva2VuOwogICAgfQoKICAgIC8vIHBhcnNpbmcgU21hcnR5IGNvbnRlbnQKICAgIGZ1bmN0aW9uIHRva2VuU21hcnR5KHN0cmVhbSwgc3RhdGUpIHsKICAgICAgaWYgKHN0cmVhbS5tYXRjaChyaWdodERlbGltaXRlciwgdHJ1ZSkpIHsKICAgICAgICBpZiAodmVyc2lvbiA9PT0gMykgewogICAgICAgICAgc3RhdGUuZGVwdGgtLTsKICAgICAgICAgIGlmIChzdGF0ZS5kZXB0aCA8PSAwKSB7CiAgICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5Ub3A7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5Ub3A7CiAgICAgICAgfQogICAgICAgIHJldHVybiBjb250KCJ0YWciLCBudWxsKTsKICAgICAgfQoKICAgICAgaWYgKHN0cmVhbS5tYXRjaChsZWZ0RGVsaW1pdGVyLCB0cnVlKSkgewogICAgICAgIHN0YXRlLmRlcHRoKys7CiAgICAgICAgcmV0dXJuIGNvbnQoInRhZyIsICJzdGFydFRhZyIpOwogICAgICB9CgogICAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpOwogICAgICBpZiAoY2ggPT0gIiQiKSB7CiAgICAgICAgc3RyZWFtLmVhdFdoaWxlKHJlZ3MudmFsaWRJZGVudGlmaWVyKTsKICAgICAgICByZXR1cm4gY29udCgidmFyaWFibGUtMiIsICJ2YXJpYWJsZSIpOwogICAgICB9IGVsc2UgaWYgKGNoID09ICJ8IikgewogICAgICAgIHJldHVybiBjb250KCJvcGVyYXRvciIsICJwaXBlIik7CiAgICAgIH0gZWxzZSBpZiAoY2ggPT0gIi4iKSB7CiAgICAgICAgcmV0dXJuIGNvbnQoIm9wZXJhdG9yIiwgInByb3BlcnR5Iik7CiAgICAgIH0gZWxzZSBpZiAocmVncy5zdHJpbmdDaGFyLnRlc3QoY2gpKSB7CiAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkF0dHJpYnV0ZShjaCk7CiAgICAgICAgcmV0dXJuIGNvbnQoInN0cmluZyIsICJzdHJpbmciKTsKICAgICAgfSBlbHNlIGlmIChyZWdzLm9wZXJhdG9yQ2hhcnMudGVzdChjaCkpIHsKICAgICAgICBzdHJlYW0uZWF0V2hpbGUocmVncy5vcGVyYXRvckNoYXJzKTsKICAgICAgICByZXR1cm4gY29udCgib3BlcmF0b3IiLCAib3BlcmF0b3IiKTsKICAgICAgfSBlbHNlIGlmIChjaCA9PSAiWyIgfHwgY2ggPT0gIl0iKSB7CiAgICAgICAgcmV0dXJuIGNvbnQoImJyYWNrZXQiLCAiYnJhY2tldCIpOwogICAgICB9IGVsc2UgaWYgKGNoID09ICIoIiB8fCBjaCA9PSAiKSIpIHsKICAgICAgICByZXR1cm4gY29udCgiYnJhY2tldCIsICJvcGVyYXRvciIpOwogICAgICB9IGVsc2UgaWYgKC9cZC8udGVzdChjaCkpIHsKICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1xkLyk7CiAgICAgICAgcmV0dXJuIGNvbnQoIm51bWJlciIsICJudW1iZXIiKTsKICAgICAgfSBlbHNlIHsKCiAgICAgICAgaWYgKHN0YXRlLmxhc3QgPT0gInZhcmlhYmxlIikgewogICAgICAgICAgaWYgKGNoID09ICJAIikgewogICAgICAgICAgICBzdHJlYW0uZWF0V2hpbGUocmVncy52YWxpZElkZW50aWZpZXIpOwogICAgICAgICAgICByZXR1cm4gY29udCgicHJvcGVydHkiLCAicHJvcGVydHkiKTsKICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gInwiKSB7CiAgICAgICAgICAgIHN0cmVhbS5lYXRXaGlsZShyZWdzLnZhbGlkSWRlbnRpZmllcik7CiAgICAgICAgICAgIHJldHVybiBjb250KCJxdWFsaWZpZXIiLCAibW9kaWZpZXIiKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHN0YXRlLmxhc3QgPT0gInBpcGUiKSB7CiAgICAgICAgICBzdHJlYW0uZWF0V2hpbGUocmVncy52YWxpZElkZW50aWZpZXIpOwogICAgICAgICAgcmV0dXJuIGNvbnQoInF1YWxpZmllciIsICJtb2RpZmllciIpOwogICAgICAgIH0gZWxzZSBpZiAoc3RhdGUubGFzdCA9PSAid2hpdGVzcGFjZSIpIHsKICAgICAgICAgIHN0cmVhbS5lYXRXaGlsZShyZWdzLnZhbGlkSWRlbnRpZmllcik7CiAgICAgICAgICByZXR1cm4gY29udCgiYXR0cmlidXRlIiwgIm1vZGlmaWVyIik7CiAgICAgICAgfSBpZiAoc3RhdGUubGFzdCA9PSAicHJvcGVydHkiKSB7CiAgICAgICAgICBzdHJlYW0uZWF0V2hpbGUocmVncy52YWxpZElkZW50aWZpZXIpOwogICAgICAgICAgcmV0dXJuIGNvbnQoInByb3BlcnR5IiwgbnVsbCk7CiAgICAgICAgfSBlbHNlIGlmICgvXHMvLnRlc3QoY2gpKSB7CiAgICAgICAgICBsYXN0ID0gIndoaXRlc3BhY2UiOwogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICB2YXIgc3RyID0gIiI7CiAgICAgICAgaWYgKGNoICE9ICIvIikgewogICAgICAgICAgc3RyICs9IGNoOwogICAgICAgIH0KICAgICAgICB2YXIgYyA9IG51bGw7CiAgICAgICAgd2hpbGUgKGMgPSBzdHJlYW0uZWF0KHJlZ3MudmFsaWRJZGVudGlmaWVyKSkgewogICAgICAgICAgc3RyICs9IGM7CiAgICAgICAgfQogICAgICAgIGZvciAodmFyIGk9MCwgaj1rZXlGdW5jdGlvbnMubGVuZ3RoOyBpPGo7IGkrKykgewogICAgICAgICAgaWYgKGtleUZ1bmN0aW9uc1tpXSA9PSBzdHIpIHsKICAgICAgICAgICAgcmV0dXJuIGNvbnQoImtleXdvcmQiLCAia2V5d29yZCIpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoL1xzLy50ZXN0KGNoKSkgewogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIHJldHVybiBjb250KCJ0YWciLCAidGFnIik7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiB0b2tlbkF0dHJpYnV0ZShxdW90ZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICAgIHZhciBwcmV2Q2hhciA9IG51bGw7CiAgICAgICAgdmFyIGN1cnJDaGFyID0gbnVsbDsKICAgICAgICB3aGlsZSAoIXN0cmVhbS5lb2woKSkgewogICAgICAgICAgY3VyckNoYXIgPSBzdHJlYW0ucGVlaygpOwogICAgICAgICAgaWYgKHN0cmVhbS5uZXh0KCkgPT0gcXVvdGUgJiYgcHJldkNoYXIgIT09ICdcXCcpIHsKICAgICAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlblNtYXJ0eTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBwcmV2Q2hhciA9IGN1cnJDaGFyOwogICAgICAgIH0KICAgICAgICByZXR1cm4gInN0cmluZyI7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gdG9rZW5CbG9jayhzdHlsZSwgdGVybWluYXRvcikgewogICAgICByZXR1cm4gZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICAgIHdoaWxlICghc3RyZWFtLmVvbCgpKSB7CiAgICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKHRlcm1pbmF0b3IpKSB7CiAgICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5Ub3A7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHN0eWxlOwogICAgICB9OwogICAgfQoKICAgIHJldHVybiB7CiAgICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICBiYXNlOiBDb2RlTWlycm9yLnN0YXJ0U3RhdGUoYmFzZU1vZGUpLAogICAgICAgICAgdG9rZW5pemU6IHRva2VuVG9wLAogICAgICAgICAgbGFzdDogbnVsbCwKICAgICAgICAgIGRlcHRoOiAwCiAgICAgICAgfTsKICAgICAgfSwKICAgICAgY29weVN0YXRlOiBmdW5jdGlvbihzdGF0ZSkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICBiYXNlOiBDb2RlTWlycm9yLmNvcHlTdGF0ZShiYXNlTW9kZSwgc3RhdGUuYmFzZSksCiAgICAgICAgICB0b2tlbml6ZTogc3RhdGUudG9rZW5pemUsCiAgICAgICAgICBsYXN0OiBzdGF0ZS5sYXN0LAogICAgICAgICAgZGVwdGg6IHN0YXRlLmRlcHRoCiAgICAgICAgfTsKICAgICAgfSwKICAgICAgaW5uZXJNb2RlOiBmdW5jdGlvbihzdGF0ZSkgewogICAgICAgIGlmIChzdGF0ZS50b2tlbml6ZSA9PSB0b2tlblRvcCkKICAgICAgICAgIHJldHVybiB7bW9kZTogYmFzZU1vZGUsIHN0YXRlOiBzdGF0ZS5iYXNlfTsKICAgICAgfSwKICAgICAgdG9rZW46IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgICB2YXIgc3R5bGUgPSBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgICAgICBzdGF0ZS5sYXN0ID0gbGFzdDsKICAgICAgICByZXR1cm4gc3R5bGU7CiAgICAgIH0sCiAgICAgIGluZGVudDogZnVuY3Rpb24oc3RhdGUsIHRleHQpIHsKICAgICAgICBpZiAoc3RhdGUudG9rZW5pemUgPT0gdG9rZW5Ub3AgJiYgYmFzZU1vZGUuaW5kZW50KQogICAgICAgICAgcmV0dXJuIGJhc2VNb2RlLmluZGVudChzdGF0ZS5iYXNlLCB0ZXh0KTsKICAgICAgICBlbHNlCiAgICAgICAgICByZXR1cm4gQ29kZU1pcnJvci5QYXNzOwogICAgICB9LAogICAgICBibG9ja0NvbW1lbnRTdGFydDogbGVmdERlbGltaXRlciArICIqIiwKICAgICAgYmxvY2tDb21tZW50RW5kOiAiKiIgKyByaWdodERlbGltaXRlcgogICAgfTsKICB9KTsKCiAgQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtc21hcnR5IiwgInNtYXJ0eSIpOwp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/solr/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/solr/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogU29sciBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9InNvbHIuanMiPjwvc2NyaXB0Pgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgogIC5Db2RlTWlycm9yIHsKICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCBibGFjazsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazsKICB9CgogIC5Db2RlTWlycm9yIC5jbS1vcGVyYXRvciB7CiAgICBjb2xvcjogb3JhbmdlOwogIH0KPC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aDE+Q29kZU1pcnJvcjwvaDE+PGltZyBpZD1sb2dvIHNyYz0iLi4vLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+TGFuZ3VhZ2UgbW9kZXM8L2E+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPlNvbHI8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KICA8aDI+U29sciBtb2RlPC9oMj4KCiAgPGRpdj4KICAgIDx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+YXV0aG9yOkNhbXVzCgp0aXRsZToiVGhlIFJlYmVsIiBhbmQgYXV0aG9yOkNhbXVzCgpwaGlsb3NvcGh5OkV4aXN0ZW50aWFsaXNtIC1hdXRob3I6S2llcmtlZ2FhcmQKCmhhcmRUb1NwZWxsOkRvc3RvZXZza3l+CgpwdWJsaXNoZWQ6WzE5NCogVE8gMTk2MF0gYW5kIGF1dGhvcjooU2FydHJlIG9yICJTaW1vbmUgZGUgQmVhdXZvaXIiKTwvdGV4dGFyZWE+CiAgPC9kaXY+CgogIDxzY3JpcHQ+CiAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgICBtb2RlOiAnc29scicsCiAgICAgIGxpbmVOdW1iZXJzOiB0cnVlCiAgICB9KTsKICA8L3NjcmlwdD4KCiAgPHA+PHN0cm9uZz5NSU1FIHR5cGVzIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPnRleHQveC1zb2xyPC9jb2RlPi48L3A+CjwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/solr/solr.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJzb2xyIiwgZnVuY3Rpb24oKSB7CiAgInVzZSBzdHJpY3QiOwoKICB2YXIgaXNTdHJpbmdDaGFyID0gL1teXHNcfFwhXCtcLVwqXD9cflxeXCZcOlwoXClcW1xdXHtcfVxeXCJcXF0vOwogIHZhciBpc09wZXJhdG9yQ2hhciA9IC9bXHxcIVwrXC1cKlw/XH5cXlwmXS87CiAgdmFyIGlzT3BlcmF0b3JTdHJpbmcgPSAvXihPUnxBTkR8Tk9UfFRPKSQvaTsKCiAgZnVuY3Rpb24gaXNOdW1iZXIod29yZCkgewogICAgcmV0dXJuIHBhcnNlRmxvYXQod29yZCwgMTApLnRvU3RyaW5nKCkgPT09IHdvcmQ7CiAgfQoKICBmdW5jdGlvbiB0b2tlblN0cmluZyhxdW90ZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgdmFyIGVzY2FwZWQgPSBmYWxzZSwgbmV4dDsKICAgICAgd2hpbGUgKChuZXh0ID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkgewogICAgICAgIGlmIChuZXh0ID09IHF1b3RlICYmICFlc2NhcGVkKSBicmVhazsKICAgICAgICBlc2NhcGVkID0gIWVzY2FwZWQgJiYgbmV4dCA9PSAiXFwiOwogICAgICB9CgogICAgICBpZiAoIWVzY2FwZWQpIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlOwogICAgICByZXR1cm4gInN0cmluZyI7CiAgICB9OwogIH0KCiAgZnVuY3Rpb24gdG9rZW5PcGVyYXRvcihvcGVyYXRvcikgewogICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgdmFyIHN0eWxlID0gIm9wZXJhdG9yIjsKICAgICAgaWYgKG9wZXJhdG9yID09ICIrIikKICAgICAgICBzdHlsZSArPSAiIHBvc2l0aXZlIjsKICAgICAgZWxzZSBpZiAob3BlcmF0b3IgPT0gIi0iKQogICAgICAgIHN0eWxlICs9ICIgbmVnYXRpdmUiOwogICAgICBlbHNlIGlmIChvcGVyYXRvciA9PSAifCIpCiAgICAgICAgc3RyZWFtLmVhdCgvXHwvKTsKICAgICAgZWxzZSBpZiAob3BlcmF0b3IgPT0gIiYiKQogICAgICAgIHN0cmVhbS5lYXQoL1wmLyk7CiAgICAgIGVsc2UgaWYgKG9wZXJhdG9yID09ICJeIikKICAgICAgICBzdHlsZSArPSAiIGJvb3N0IjsKCiAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlOwogICAgICByZXR1cm4gc3R5bGU7CiAgICB9OwogIH0KCiAgZnVuY3Rpb24gdG9rZW5Xb3JkKGNoKSB7CiAgICByZXR1cm4gZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICB2YXIgd29yZCA9IGNoOwogICAgICB3aGlsZSAoKGNoID0gc3RyZWFtLnBlZWsoKSkgJiYgY2gubWF0Y2goaXNTdHJpbmdDaGFyKSAhPSBudWxsKSB7CiAgICAgICAgd29yZCArPSBzdHJlYW0ubmV4dCgpOwogICAgICB9CgogICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTsKICAgICAgaWYgKGlzT3BlcmF0b3JTdHJpbmcudGVzdCh3b3JkKSkKICAgICAgICByZXR1cm4gIm9wZXJhdG9yIjsKICAgICAgZWxzZSBpZiAoaXNOdW1iZXIod29yZCkpCiAgICAgICAgcmV0dXJuICJudW1iZXIiOwogICAgICBlbHNlIGlmIChzdHJlYW0ucGVlaygpID09ICI6IikKICAgICAgICByZXR1cm4gImZpZWxkIjsKICAgICAgZWxzZQogICAgICAgIHJldHVybiAic3RyaW5nIjsKICAgIH07CiAgfQoKICBmdW5jdGlvbiB0b2tlbkJhc2Uoc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIGNoID0gc3RyZWFtLm5leHQoKTsKICAgIGlmIChjaCA9PSAnIicpCiAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5TdHJpbmcoY2gpOwogICAgZWxzZSBpZiAoaXNPcGVyYXRvckNoYXIudGVzdChjaCkpCiAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5PcGVyYXRvcihjaCk7CiAgICBlbHNlIGlmIChpc1N0cmluZ0NoYXIudGVzdChjaCkpCiAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5Xb3JkKGNoKTsKCiAgICByZXR1cm4gKHN0YXRlLnRva2VuaXplICE9IHRva2VuQmFzZSkgPyBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKSA6IG51bGw7CiAgfQoKICByZXR1cm4gewogICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgdG9rZW5pemU6IHRva2VuQmFzZQogICAgICB9OwogICAgfSwKCiAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICBpZiAoc3RyZWFtLmVhdFNwYWNlKCkpIHJldHVybiBudWxsOwogICAgICByZXR1cm4gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CiAgICB9CiAgfTsKfSk7CgpDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveC1zb2xyIiwgInNvbHIiKTsKCn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/soy/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/soy/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogU295IChDbG9zdXJlIFRlbXBsYXRlKSBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uLy4uL2FkZG9uL2VkaXQvbWF0Y2hicmFja2V0cy5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9odG1sbWl4ZWQvaHRtbG1peGVkLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL3htbC94bWwuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vamF2YXNjcmlwdC9qYXZhc2NyaXB0LmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL2Nzcy9jc3MuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0ic295LmpzIj48L3NjcmlwdD4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4uQ29kZU1pcnJvciB7Ym9yZGVyLXRvcDogMXB4IHNvbGlkIGJsYWNrOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGgxPkNvZGVNaXJyb3I8L2gxPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5Tb3kgKENsb3N1cmUgVGVtcGxhdGUpPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5Tb3kgKENsb3N1cmUgVGVtcGxhdGUpIG1vZGU8L2gyPgo8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgp7bmFtZXNwYWNlIGV4YW1wbGV9CgovKioKICogU2F5cyBoZWxsbyB0byB0aGUgd29ybGQuCiAqLwp7dGVtcGxhdGUgLmhlbGxvV29ybGR9CiAge0BwYXJhbSBuYW1lOiBzdHJpbmd9CiAge0BwYXJhbT8gc2NvcmU6IG51bWJlcn0KICBIZWxsbyA8Yj57JG5hbWV9PC9iPiEKICA8ZGl2PgogICAge2lmICRzY29yZX0KICAgICAgPGVtPnskc2NvcmV9IHBvaW50czwvZW0+CiAgICB7ZWxzZX0KICAgICAgbm8gc2NvcmUKICAgIHsvaWZ9CiAgPC9kaXY+CnsvdGVtcGxhdGV9Cgp7dGVtcGxhdGUgLmFsZXJ0SGVsbG9Xb3JsZCBraW5kPSJqcyJ9CiAgYWxlcnQoJ0hlbGxvIFdvcmxkJyk7CnsvdGVtcGxhdGV9CjwvdGV4dGFyZWE+PC9mb3JtPgoKICAgIDxzY3JpcHQ+CiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICAgICAgbGluZU51bWJlcnM6IHRydWUsCiAgICAgICAgbWF0Y2hCcmFja2V0czogdHJ1ZSwKICAgICAgICBtb2RlOiAidGV4dC94LXNveSIsCiAgICAgICAgaW5kZW50VW5pdDogMiwKICAgICAgICBpbmRlbnRXaXRoVGFiczogZmFsc2UKICAgICAgfSk7CiAgICA8L3NjcmlwdD4KCiAgICA8cD5BIG1vZGUgZm9yIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL2Nsb3N1cmUvdGVtcGxhdGVzLyI+Q2xvc3VyZSBUZW1wbGF0ZXM8L2E+IChTb3kpLjwvcD4KICAgIDxwPjxzdHJvbmc+TUlNRSB0eXBlIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPnRleHQveC1zb3k8L2NvZGU+LjwvcD4KICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/soy/soy.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSwgcmVxdWlyZSgiLi4vaHRtbG1peGVkL2h0bWxtaXhlZCIpKTsKICBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCkgLy8gQU1ECiAgICBkZWZpbmUoWyIuLi8uLi9saWIvY29kZW1pcnJvciIsICIuLi9odG1sbWl4ZWQvaHRtbG1peGVkIl0sIG1vZCk7CiAgZWxzZSAvLyBQbGFpbiBicm93c2VyIGVudgogICAgbW9kKENvZGVNaXJyb3IpOwp9KShmdW5jdGlvbihDb2RlTWlycm9yKSB7CiAgInVzZSBzdHJpY3QiOwoKICB2YXIgaW5kZW50aW5nVGFncyA9IFsidGVtcGxhdGUiLCAibGl0ZXJhbCIsICJtc2ciLCAiZmFsbGJhY2ttc2ciLCAibGV0IiwgImlmIiwgImVsc2VpZiIsCiAgICAgICAgICAgICAgICAgICAgICAgImVsc2UiLCAic3dpdGNoIiwgImNhc2UiLCAiZGVmYXVsdCIsICJmb3JlYWNoIiwgImlmZW1wdHkiLCAiZm9yIiwKICAgICAgICAgICAgICAgICAgICAgICAiY2FsbCIsICJwYXJhbSIsICJkZWx0ZW1wbGF0ZSIsICJkZWxjYWxsIiwgImxvZyJdOwoKICBDb2RlTWlycm9yLmRlZmluZU1vZGUoInNveSIsIGZ1bmN0aW9uKGNvbmZpZykgewogICAgdmFyIHRleHRNb2RlID0gQ29kZU1pcnJvci5nZXRNb2RlKGNvbmZpZywgInRleHQvcGxhaW4iKTsKICAgIHZhciBtb2RlcyA9IHsKICAgICAgaHRtbDogQ29kZU1pcnJvci5nZXRNb2RlKGNvbmZpZywge25hbWU6ICJ0ZXh0L2h0bWwiLCBtdWx0aWxpbmVUYWdJbmRlbnRGYWN0b3I6IDIsIG11bHRpbGluZVRhZ0luZGVudFBhc3RUYWc6IGZhbHNlfSksCiAgICAgIGF0dHJpYnV0ZXM6IHRleHRNb2RlLAogICAgICB0ZXh0OiB0ZXh0TW9kZSwKICAgICAgdXJpOiB0ZXh0TW9kZSwKICAgICAgY3NzOiBDb2RlTWlycm9yLmdldE1vZGUoY29uZmlnLCAidGV4dC9jc3MiKSwKICAgICAganM6IENvZGVNaXJyb3IuZ2V0TW9kZShjb25maWcsIHtuYW1lOiAidGV4dC9qYXZhc2NyaXB0Iiwgc3RhdGVtZW50SW5kZW50OiAyICogY29uZmlnLmluZGVudFVuaXR9KQogICAgfTsKCiAgICBmdW5jdGlvbiBsYXN0KGFycmF5KSB7CiAgICAgIHJldHVybiBhcnJheVthcnJheS5sZW5ndGggLSAxXTsKICAgIH0KCiAgICBmdW5jdGlvbiB0b2tlblVudGlsKHN0cmVhbSwgc3RhdGUsIHVudGlsUmVnRXhwKSB7CiAgICAgIHZhciBvbGRTdHJpbmcgPSBzdHJlYW0uc3RyaW5nOwogICAgICB2YXIgbWF0Y2ggPSB1bnRpbFJlZ0V4cC5leGVjKG9sZFN0cmluZy5zdWJzdHIoc3RyZWFtLnBvcykpOwogICAgICBpZiAobWF0Y2gpIHsKICAgICAgICAvLyBXZSBkb24ndCB1c2UgYmFja1VwIGJlY2F1c2UgaXQgYmFja3MgdXAganVzdCB0aGUgcG9zaXRpb24sIG5vdCB0aGUgc3RhdGUuCiAgICAgICAgLy8gVGhpcyB1c2VzIGFuIHVuZG9jdW1lbnRlZCBBUEkuCiAgICAgICAgc3RyZWFtLnN0cmluZyA9IG9sZFN0cmluZy5zdWJzdHIoMCwgc3RyZWFtLnBvcyArIG1hdGNoLmluZGV4KTsKICAgICAgfQogICAgICB2YXIgcmVzdWx0ID0gc3RyZWFtLmhpZGVGaXJzdENoYXJzKHN0YXRlLmluZGVudCwgZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHN0YXRlLmxvY2FsTW9kZS50b2tlbihzdHJlYW0sIHN0YXRlLmxvY2FsU3RhdGUpOwogICAgICB9KTsKICAgICAgc3RyZWFtLnN0cmluZyA9IG9sZFN0cmluZzsKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KCiAgICByZXR1cm4gewogICAgICBzdGFydFN0YXRlOiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAga2luZDogW10sCiAgICAgICAgICBraW5kVGFnOiBbXSwKICAgICAgICAgIHNveVN0YXRlOiBbXSwKICAgICAgICAgIGluZGVudDogMCwKICAgICAgICAgIGxvY2FsTW9kZTogbW9kZXMuaHRtbCwKICAgICAgICAgIGxvY2FsU3RhdGU6IENvZGVNaXJyb3Iuc3RhcnRTdGF0ZShtb2Rlcy5odG1sKQogICAgICAgIH07CiAgICAgIH0sCgogICAgICBjb3B5U3RhdGU6IGZ1bmN0aW9uKHN0YXRlKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHRhZzogc3RhdGUudGFnLCAvLyBMYXN0IHNlZW4gU295IHRhZy4KICAgICAgICAgIGtpbmQ6IHN0YXRlLmtpbmQuY29uY2F0KFtdKSwgLy8gVmFsdWVzIG9mIGtpbmQ9IiIgYXR0cmlidXRlcy4KICAgICAgICAgIGtpbmRUYWc6IHN0YXRlLmtpbmRUYWcuY29uY2F0KFtdKSwgLy8gT3BlbmVkIHRhZ3Mgd2l0aCBraW5kPSIiIGF0dHJpYnV0ZXMuCiAgICAgICAgICBzb3lTdGF0ZTogc3RhdGUuc295U3RhdGUuY29uY2F0KFtdKSwKICAgICAgICAgIGluZGVudDogc3RhdGUuaW5kZW50LCAvLyBJbmRlbnRhdGlvbiBvZiB0aGUgZm9sbG93aW5nIGxpbmUuCiAgICAgICAgICBsb2NhbE1vZGU6IHN0YXRlLmxvY2FsTW9kZSwKICAgICAgICAgIGxvY2FsU3RhdGU6IENvZGVNaXJyb3IuY29weVN0YXRlKHN0YXRlLmxvY2FsTW9kZSwgc3RhdGUubG9jYWxTdGF0ZSkKICAgICAgICB9OwogICAgICB9LAoKICAgICAgdG9rZW46IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgICB2YXIgbWF0Y2g7CgogICAgICAgIHN3aXRjaCAobGFzdChzdGF0ZS5zb3lTdGF0ZSkpIHsKICAgICAgICAgIGNhc2UgImNvbW1lbnQiOgogICAgICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eLio/XCpcLy8pKSB7CiAgICAgICAgICAgICAgc3RhdGUuc295U3RhdGUucG9wKCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAiY29tbWVudCI7CgogICAgICAgICAgY2FzZSAidmFyaWFibGUiOgogICAgICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKC9efS8pKSB7CiAgICAgICAgICAgICAgc3RhdGUuaW5kZW50IC09IDIgKiBjb25maWcuaW5kZW50VW5pdDsKICAgICAgICAgICAgICBzdGF0ZS5zb3lTdGF0ZS5wb3AoKTsKICAgICAgICAgICAgICByZXR1cm4gInZhcmlhYmxlLTIiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgICAgIHJldHVybiBudWxsOwoKICAgICAgICAgIGNhc2UgInRhZyI6CiAgICAgICAgICAgIGlmIChzdHJlYW0ubWF0Y2goL15cLz99LykpIHsKICAgICAgICAgICAgICBpZiAoc3RhdGUudGFnID09ICIvdGVtcGxhdGUiIHx8IHN0YXRlLnRhZyA9PSAiL2RlbHRlbXBsYXRlIikgc3RhdGUuaW5kZW50ID0gMDsKICAgICAgICAgICAgICBlbHNlIHN0YXRlLmluZGVudCAtPSAoc3RyZWFtLmN1cnJlbnQoKSA9PSAiL30iIHx8IGluZGVudGluZ1RhZ3MuaW5kZXhPZihzdGF0ZS50YWcpID09IC0xID8gMiA6IDEpICogY29uZmlnLmluZGVudFVuaXQ7CiAgICAgICAgICAgICAgc3RhdGUuc295U3RhdGUucG9wKCk7CiAgICAgICAgICAgICAgcmV0dXJuICJrZXl3b3JkIjsKICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJlYW0ubWF0Y2goL14oW1x3P10rKSg/PT0pLykpIHsKICAgICAgICAgICAgICBpZiAoc3RyZWFtLmN1cnJlbnQoKSA9PSAia2luZCIgJiYgKG1hdGNoID0gc3RyZWFtLm1hdGNoKC9ePSIoW14iXSspLywgZmFsc2UpKSkgewogICAgICAgICAgICAgICAgdmFyIGtpbmQgPSBtYXRjaFsxXTsKICAgICAgICAgICAgICAgIHN0YXRlLmtpbmQucHVzaChraW5kKTsKICAgICAgICAgICAgICAgIHN0YXRlLmtpbmRUYWcucHVzaChzdGF0ZS50YWcpOwogICAgICAgICAgICAgICAgc3RhdGUubG9jYWxNb2RlID0gbW9kZXNba2luZF0gfHwgbW9kZXMuaHRtbDsKICAgICAgICAgICAgICAgIHN0YXRlLmxvY2FsU3RhdGUgPSBDb2RlTWlycm9yLnN0YXJ0U3RhdGUoc3RhdGUubG9jYWxNb2RlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmV0dXJuICJhdHRyaWJ1dGUiOwogICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmVhbS5tYXRjaCgvXiIvKSkgewogICAgICAgICAgICAgIHN0YXRlLnNveVN0YXRlLnB1c2goInN0cmluZyIpOwogICAgICAgICAgICAgIHJldHVybiAic3RyaW5nIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgICAgICByZXR1cm4gbnVsbDsKCiAgICAgICAgICBjYXNlICJsaXRlcmFsIjoKICAgICAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXig/PVx7XC9saXRlcmFsfSkvKSkgewogICAgICAgICAgICAgIHN0YXRlLmluZGVudCAtPSBjb25maWcuaW5kZW50VW5pdDsKICAgICAgICAgICAgICBzdGF0ZS5zb3lTdGF0ZS5wb3AoKTsKICAgICAgICAgICAgICByZXR1cm4gdGhpcy50b2tlbihzdHJlYW0sIHN0YXRlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdG9rZW5VbnRpbChzdHJlYW0sIHN0YXRlLCAvXHtcL2xpdGVyYWx9Lyk7CgogICAgICAgICAgY2FzZSAic3RyaW5nIjoKICAgICAgICAgICAgdmFyIG1hdGNoID0gc3RyZWFtLm1hdGNoKC9eLio/KCJ8XFxbXHNcU10pLyk7CiAgICAgICAgICAgIGlmICghbWF0Y2gpIHsKICAgICAgICAgICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAobWF0Y2hbMV0gPT0gIlwiIikgewogICAgICAgICAgICAgIHN0YXRlLnNveVN0YXRlLnBvcCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAic3RyaW5nIjsKICAgICAgICB9CgogICAgICAgIGlmIChzdHJlYW0ubWF0Y2goL15cL1wqLykpIHsKICAgICAgICAgIHN0YXRlLnNveVN0YXRlLnB1c2goImNvbW1lbnQiKTsKICAgICAgICAgIHJldHVybiAiY29tbWVudCI7CiAgICAgICAgfSBlbHNlIGlmIChzdHJlYW0ubWF0Y2goc3RyZWFtLnNvbCgpID8gL15ccypcL1wvLiovIDogL15ccytcL1wvLiovKSkgewogICAgICAgICAgcmV0dXJuICJjb21tZW50IjsKICAgICAgICB9IGVsc2UgaWYgKHN0cmVhbS5tYXRjaCgvXlx7XCRbXHc/XSovKSkgewogICAgICAgICAgc3RhdGUuaW5kZW50ICs9IDIgKiBjb25maWcuaW5kZW50VW5pdDsKICAgICAgICAgIHN0YXRlLnNveVN0YXRlLnB1c2goInZhcmlhYmxlIik7CiAgICAgICAgICByZXR1cm4gInZhcmlhYmxlLTIiOwogICAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLm1hdGNoKC9eXHtsaXRlcmFsfS8pKSB7CiAgICAgICAgICBzdGF0ZS5pbmRlbnQgKz0gY29uZmlnLmluZGVudFVuaXQ7CiAgICAgICAgICBzdGF0ZS5zb3lTdGF0ZS5wdXNoKCJsaXRlcmFsIik7CiAgICAgICAgICByZXR1cm4gImtleXdvcmQiOwogICAgICAgIH0gZWxzZSBpZiAobWF0Y2ggPSBzdHJlYW0ubWF0Y2goL15ceyhbXC9AXFxdP1tcdz9dKikvKSkgewogICAgICAgICAgaWYgKG1hdGNoWzFdICE9ICIvc3dpdGNoIikKICAgICAgICAgICAgc3RhdGUuaW5kZW50ICs9ICgvXihcL3woZWxzZXxlbHNlaWZ8Y2FzZXxkZWZhdWx0KSQpLy50ZXN0KG1hdGNoWzFdKSAmJiBzdGF0ZS50YWcgIT0gInN3aXRjaCIgPyAxIDogMikgKiBjb25maWcuaW5kZW50VW5pdDsKICAgICAgICAgIHN0YXRlLnRhZyA9IG1hdGNoWzFdOwogICAgICAgICAgaWYgKHN0YXRlLnRhZyA9PSAiLyIgKyBsYXN0KHN0YXRlLmtpbmRUYWcpKSB7CiAgICAgICAgICAgIC8vIFdlIGZvdW5kIHRoZSB0YWcgdGhhdCBvcGVuZWQgdGhlIGN1cnJlbnQga2luZD0iIi4KICAgICAgICAgICAgc3RhdGUua2luZC5wb3AoKTsKICAgICAgICAgICAgc3RhdGUua2luZFRhZy5wb3AoKTsKICAgICAgICAgICAgc3RhdGUubG9jYWxNb2RlID0gbW9kZXNbbGFzdChzdGF0ZS5raW5kKV0gfHwgbW9kZXMuaHRtbDsKICAgICAgICAgICAgc3RhdGUubG9jYWxTdGF0ZSA9IENvZGVNaXJyb3Iuc3RhcnRTdGF0ZShzdGF0ZS5sb2NhbE1vZGUpOwogICAgICAgICAgfQogICAgICAgICAgc3RhdGUuc295U3RhdGUucHVzaCgidGFnIik7CiAgICAgICAgICByZXR1cm4gImtleXdvcmQiOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRva2VuVW50aWwoc3RyZWFtLCBzdGF0ZSwgL1x7fFxzK1wvXC98XC9cKi8pOwogICAgICB9LAoKICAgICAgaW5kZW50OiBmdW5jdGlvbihzdGF0ZSwgdGV4dEFmdGVyKSB7CiAgICAgICAgdmFyIGluZGVudCA9IHN0YXRlLmluZGVudCwgdG9wID0gbGFzdChzdGF0ZS5zb3lTdGF0ZSk7CiAgICAgICAgaWYgKHRvcCA9PSAiY29tbWVudCIpIHJldHVybiBDb2RlTWlycm9yLlBhc3M7CgogICAgICAgIGlmICh0b3AgPT0gImxpdGVyYWwiKSB7CiAgICAgICAgICBpZiAoL15ce1wvbGl0ZXJhbH0vLnRlc3QodGV4dEFmdGVyKSkgaW5kZW50IC09IGNvbmZpZy5pbmRlbnRVbml0OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoL15ccypce1wvKHRlbXBsYXRlfGRlbHRlbXBsYXRlKVxiLy50ZXN0KHRleHRBZnRlcikpIHJldHVybiAwOwogICAgICAgICAgaWYgKC9eXHsoXC98KGZhbGxiYWNrbXNnfGVsc2VpZnxlbHNlfGlmZW1wdHkpXGIpLy50ZXN0KHRleHRBZnRlcikpIGluZGVudCAtPSBjb25maWcuaW5kZW50VW5pdDsKICAgICAgICAgIGlmIChzdGF0ZS50YWcgIT0gInN3aXRjaCIgJiYgL15ceyhjYXNlfGRlZmF1bHQpXGIvLnRlc3QodGV4dEFmdGVyKSkgaW5kZW50IC09IGNvbmZpZy5pbmRlbnRVbml0OwogICAgICAgICAgaWYgKC9eXHtcL3N3aXRjaFxiLy50ZXN0KHRleHRBZnRlcikpIGluZGVudCAtPSBjb25maWcuaW5kZW50VW5pdDsKICAgICAgICB9CiAgICAgICAgaWYgKGluZGVudCAmJiBzdGF0ZS5sb2NhbE1vZGUuaW5kZW50KQogICAgICAgICAgaW5kZW50ICs9IHN0YXRlLmxvY2FsTW9kZS5pbmRlbnQoc3RhdGUubG9jYWxTdGF0ZSwgdGV4dEFmdGVyKTsKICAgICAgICByZXR1cm4gaW5kZW50OwogICAgICB9LAoKICAgICAgaW5uZXJNb2RlOiBmdW5jdGlvbihzdGF0ZSkgewogICAgICAgIGlmIChzdGF0ZS5zb3lTdGF0ZS5sZW5ndGggJiYgbGFzdChzdGF0ZS5zb3lTdGF0ZSkgIT0gImxpdGVyYWwiKSByZXR1cm4gbnVsbDsKICAgICAgICBlbHNlIHJldHVybiB7c3RhdGU6IHN0YXRlLmxvY2FsU3RhdGUsIG1vZGU6IHN0YXRlLmxvY2FsTW9kZX07CiAgICAgIH0sCgogICAgICBlbGVjdHJpY0lucHV0OiAvXlxzKlx7KFwvfFwvdGVtcGxhdGV8XC9kZWx0ZW1wbGF0ZXxcL3N3aXRjaHxmYWxsYmFja21zZ3xlbHNlaWZ8ZWxzZXxjYXNlfGRlZmF1bHR8aWZlbXB0eXxcL2xpdGVyYWxcfSkkLywKICAgICAgbGluZUNvbW1lbnQ6ICIvLyIsCiAgICAgIGJsb2NrQ29tbWVudFN0YXJ0OiAiLyoiLAogICAgICBibG9ja0NvbW1lbnRFbmQ6ICIqLyIsCiAgICAgIGJsb2NrQ29tbWVudENvbnRpbnVlOiAiICogIiwKICAgICAgZm9sZDogImluZGVudCIKICAgIH07CiAgfSwgImh0bWxtaXhlZCIpOwoKICBDb2RlTWlycm9yLnJlZ2lzdGVySGVscGVyKCJoaW50V29yZHMiLCAic295IiwgaW5kZW50aW5nVGFncy5jb25jYXQoCiAgICAgIFsiZGVscGFja2FnZSIsICJuYW1lc3BhY2UiLCAiYWxpYXMiLCAicHJpbnQiLCAiY3NzIiwgImRlYnVnZ2VyIl0pKTsKCiAgQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtc295IiwgInNveSIpOwp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/sparql/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/sparql/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogU1BBUlFMIG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vLi4vYWRkb24vZWRpdC9tYXRjaGJyYWNrZXRzLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9InNwYXJxbC5qcyI+PC9zY3JpcHQ+CjxzdHlsZT4uQ29kZU1pcnJvciB7Ym9yZGVyLXRvcDogMXB4IHNvbGlkIGJsYWNrOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGgxPkNvZGVNaXJyb3I8L2gxPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5TUEFSUUw8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPlNQQVJRTCBtb2RlPC9oMj4KPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KUFJFRklYIGE6ICZsdDtodHRwOi8vd3d3LnczLm9yZy8yMDAwLzEwL2Fubm90YXRpb24tbnMjPgpQUkVGSVggZGM6ICZsdDtodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLz4KUFJFRklYIGZvYWY6ICZsdDtodHRwOi8veG1sbnMuY29tL2ZvYWYvMC4xLz4KUFJFRklYIHJkZnM6ICZsdDtodHRwOi8vd3d3LnczLm9yZy8yMDAwLzAxL3JkZi1zY2hlbWEjPgoKIyBDb21tZW50IQoKU0VMRUNUID9naXZlbiA/ZmFtaWx5CldIRVJFIHsKICB7CiAgICA/YW5ub3QgYTphbm5vdGF0ZXMgJmx0O2h0dHA6Ly93d3cudzMub3JnL1RSL3JkZi1zcGFycWwtcXVlcnkvPiAuCiAgICA/YW5ub3QgZGM6Y3JlYXRvciA/YyAuCiAgICBPUFRJT05BTCB7P2MgZm9hZjpnaXZlbk5hbWUgP2dpdmVuIDsKICAgICAgICAgICAgICAgICBmb2FmOmZhbWlseU5hbWUgP2ZhbWlseSB9CiAgfSBVTklPTiB7CiAgICA/YyAhZm9hZjprbm93cy9mb2FmOmtub3dzPyA/dGhpbmcuCiAgICA/dGhpbmcgcmRmcwogIH0gTUlOVVMgewogICAgP3RoaW5nIHJkZnM6bGFiZWwgIuWJm+aflOa1gSJAanAKICB9CiAgRklMVEVSIGlzQmxhbmsoP2MpCn0KPC90ZXh0YXJlYT48L2Zvcm0+CiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgICAgIG1vZGU6ICJhcHBsaWNhdGlvbi9zcGFycWwtcXVlcnkiLAogICAgICAgIG1hdGNoQnJhY2tldHM6IHRydWUKICAgICAgfSk7CiAgICA8L3NjcmlwdD4KCiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+YXBwbGljYXRpb24vc3BhcnFsLXF1ZXJ5PC9jb2RlPi48L3A+CgogIDwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/sparql/sparql.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJzcGFycWwiLCBmdW5jdGlvbihjb25maWcpIHsKICB2YXIgaW5kZW50VW5pdCA9IGNvbmZpZy5pbmRlbnRVbml0OwogIHZhciBjdXJQdW5jOwoKICBmdW5jdGlvbiB3b3JkUmVnZXhwKHdvcmRzKSB7CiAgICByZXR1cm4gbmV3IFJlZ0V4cCgiXig/OiIgKyB3b3Jkcy5qb2luKCJ8IikgKyAiKSQiLCAiaSIpOwogIH0KICB2YXIgb3BzID0gd29yZFJlZ2V4cChbInN0ciIsICJsYW5nIiwgImxhbmdtYXRjaGVzIiwgImRhdGF0eXBlIiwgImJvdW5kIiwgInNhbWV0ZXJtIiwgImlzaXJpIiwgImlzdXJpIiwKICAgICAgICAgICAgICAgICAgICAgICAgImlyaSIsICJ1cmkiLCAiYm5vZGUiLCAiY291bnQiLCAic3VtIiwgIm1pbiIsICJtYXgiLCAiYXZnIiwgInNhbXBsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICJncm91cF9jb25jYXQiLCAicmFuZCIsICJhYnMiLCAiY2VpbCIsICJmbG9vciIsICJyb3VuZCIsICJjb25jYXQiLCAic3Vic3RyIiwgInN0cmxlbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICJyZXBsYWNlIiwgInVjYXNlIiwgImxjYXNlIiwgImVuY29kZV9mb3JfdXJpIiwgImNvbnRhaW5zIiwgInN0cnN0YXJ0cyIsICJzdHJlbmRzIiwKICAgICAgICAgICAgICAgICAgICAgICAgInN0cmJlZm9yZSIsICJzdHJhZnRlciIsICJ5ZWFyIiwgIm1vbnRoIiwgImRheSIsICJob3VycyIsICJtaW51dGVzIiwgInNlY29uZHMiLAogICAgICAgICAgICAgICAgICAgICAgICAidGltZXpvbmUiLCAidHoiLCAibm93IiwgInV1aWQiLCAic3RydXVpZCIsICJtZDUiLCAic2hhMSIsICJzaGEyNTYiLCAic2hhMzg0IiwKICAgICAgICAgICAgICAgICAgICAgICAgInNoYTUxMiIsICJjb2FsZXNjZSIsICJpZiIsICJzdHJsYW5nIiwgInN0cmR0IiwgImlzbnVtZXJpYyIsICJyZWdleCIsICJleGlzdHMiLAogICAgICAgICAgICAgICAgICAgICAgICAiaXNibGFuayIsICJpc2xpdGVyYWwiLCAiYSIsICJiaW5kIl0pOwogIHZhciBrZXl3b3JkcyA9IHdvcmRSZWdleHAoWyJiYXNlIiwgInByZWZpeCIsICJzZWxlY3QiLCAiZGlzdGluY3QiLCAicmVkdWNlZCIsICJjb25zdHJ1Y3QiLCAiZGVzY3JpYmUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhc2siLCAiZnJvbSIsICJuYW1lZCIsICJ3aGVyZSIsICJvcmRlciIsICJsaW1pdCIsICJvZmZzZXQiLCAiZmlsdGVyIiwgIm9wdGlvbmFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3JhcGgiLCAiYnkiLCAiYXNjIiwgImRlc2MiLCAiYXMiLCAiaGF2aW5nIiwgInVuZGVmIiwgInZhbHVlcyIsICJncm91cCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1pbnVzIiwgImluIiwgIm5vdCIsICJzZXJ2aWNlIiwgInNpbGVudCIsICJ1c2luZyIsICJpbnNlcnQiLCAiZGVsZXRlIiwgInVuaW9uIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJ1ZSIsICJmYWxzZSIsICJ3aXRoIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGF0YSIsICJjb3B5IiwgInRvIiwgIm1vdmUiLCAiYWRkIiwgImNyZWF0ZSIsICJkcm9wIiwgImNsZWFyIiwgImxvYWQiXSk7CiAgdmFyIG9wZXJhdG9yQ2hhcnMgPSAvWyorXC08Pj0mfFxeXC8hXD9dLzsKCiAgZnVuY3Rpb24gdG9rZW5CYXNlKHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBjaCA9IHN0cmVhbS5uZXh0KCk7CiAgICBjdXJQdW5jID0gbnVsbDsKICAgIGlmIChjaCA9PSAiJCIgfHwgY2ggPT0gIj8iKSB7CiAgICAgIGlmKGNoID09ICI/IiAmJiBzdHJlYW0ubWF0Y2goL1xzLywgZmFsc2UpKXsKICAgICAgICByZXR1cm4gIm9wZXJhdG9yIjsKICAgICAgfQogICAgICBzdHJlYW0ubWF0Y2goL15bXHdcZF0qLyk7CiAgICAgIHJldHVybiAidmFyaWFibGUtMiI7CiAgICB9CiAgICBlbHNlIGlmIChjaCA9PSAiPCIgJiYgIXN0cmVhbS5tYXRjaCgvXltcc1x1MDBhMD1dLywgZmFsc2UpKSB7CiAgICAgIHN0cmVhbS5tYXRjaCgvXlteXHNcdTAwYTA+XSo+Py8pOwogICAgICByZXR1cm4gImF0b20iOwogICAgfQogICAgZWxzZSBpZiAoY2ggPT0gIlwiIiB8fCBjaCA9PSAiJyIpIHsKICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkxpdGVyYWwoY2gpOwogICAgICByZXR1cm4gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CiAgICB9CiAgICBlbHNlIGlmICgvW3t9XChcKSxcLjtcW1xdXS8udGVzdChjaCkpIHsKICAgICAgY3VyUHVuYyA9IGNoOwogICAgICByZXR1cm4gImJyYWNrZXQiOwogICAgfQogICAgZWxzZSBpZiAoY2ggPT0gIiMiKSB7CiAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgcmV0dXJuICJjb21tZW50IjsKICAgIH0KICAgIGVsc2UgaWYgKG9wZXJhdG9yQ2hhcnMudGVzdChjaCkpIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKG9wZXJhdG9yQ2hhcnMpOwogICAgICByZXR1cm4gIm9wZXJhdG9yIjsKICAgIH0KICAgIGVsc2UgaWYgKGNoID09ICI6IikgewogICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcd1xkXC5fXC1dLyk7CiAgICAgIHJldHVybiAiYXRvbSI7CiAgICB9CiAgICBlbHNlIGlmIChjaCA9PSAiQCIpIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bYS16XGRcLV0vaSk7CiAgICAgIHJldHVybiAibWV0YSI7CiAgICB9CiAgICBlbHNlIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bX1x3XGRdLyk7CiAgICAgIGlmIChzdHJlYW0uZWF0KCI6IikpIHsKICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcd1xkX1wtXS8pOwogICAgICAgIHJldHVybiAiYXRvbSI7CiAgICAgIH0KICAgICAgdmFyIHdvcmQgPSBzdHJlYW0uY3VycmVudCgpOwogICAgICBpZiAob3BzLnRlc3Qod29yZCkpCiAgICAgICAgcmV0dXJuICJidWlsdGluIjsKICAgICAgZWxzZSBpZiAoa2V5d29yZHMudGVzdCh3b3JkKSkKICAgICAgICByZXR1cm4gImtleXdvcmQiOwogICAgICBlbHNlCiAgICAgICAgcmV0dXJuICJ2YXJpYWJsZSI7CiAgICB9CiAgfQoKICBmdW5jdGlvbiB0b2tlbkxpdGVyYWwocXVvdGUpIHsKICAgIHJldHVybiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHZhciBlc2NhcGVkID0gZmFsc2UsIGNoOwogICAgICB3aGlsZSAoKGNoID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkgewogICAgICAgIGlmIChjaCA9PSBxdW90ZSAmJiAhZXNjYXBlZCkgewogICAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgZXNjYXBlZCA9ICFlc2NhcGVkICYmIGNoID09ICJcXCI7CiAgICAgIH0KICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgfTsKICB9CgogIGZ1bmN0aW9uIHB1c2hDb250ZXh0KHN0YXRlLCB0eXBlLCBjb2wpIHsKICAgIHN0YXRlLmNvbnRleHQgPSB7cHJldjogc3RhdGUuY29udGV4dCwgaW5kZW50OiBzdGF0ZS5pbmRlbnQsIGNvbDogY29sLCB0eXBlOiB0eXBlfTsKICB9CiAgZnVuY3Rpb24gcG9wQ29udGV4dChzdGF0ZSkgewogICAgc3RhdGUuaW5kZW50ID0gc3RhdGUuY29udGV4dC5pbmRlbnQ7CiAgICBzdGF0ZS5jb250ZXh0ID0gc3RhdGUuY29udGV4dC5wcmV2OwogIH0KCiAgcmV0dXJuIHsKICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4ge3Rva2VuaXplOiB0b2tlbkJhc2UsCiAgICAgICAgICAgICAgY29udGV4dDogbnVsbCwKICAgICAgICAgICAgICBpbmRlbnQ6IDAsCiAgICAgICAgICAgICAgY29sOiAwfTsKICAgIH0sCgogICAgdG9rZW46IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgaWYgKHN0cmVhbS5zb2woKSkgewogICAgICAgIGlmIChzdGF0ZS5jb250ZXh0ICYmIHN0YXRlLmNvbnRleHQuYWxpZ24gPT0gbnVsbCkgc3RhdGUuY29udGV4dC5hbGlnbiA9IGZhbHNlOwogICAgICAgIHN0YXRlLmluZGVudCA9IHN0cmVhbS5pbmRlbnRhdGlvbigpOwogICAgICB9CiAgICAgIGlmIChzdHJlYW0uZWF0U3BhY2UoKSkgcmV0dXJuIG51bGw7CiAgICAgIHZhciBzdHlsZSA9IHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwoKICAgICAgaWYgKHN0eWxlICE9ICJjb21tZW50IiAmJiBzdGF0ZS5jb250ZXh0ICYmIHN0YXRlLmNvbnRleHQuYWxpZ24gPT0gbnVsbCAmJiBzdGF0ZS5jb250ZXh0LnR5cGUgIT0gInBhdHRlcm4iKSB7CiAgICAgICAgc3RhdGUuY29udGV4dC5hbGlnbiA9IHRydWU7CiAgICAgIH0KCiAgICAgIGlmIChjdXJQdW5jID09ICIoIikgcHVzaENvbnRleHQoc3RhdGUsICIpIiwgc3RyZWFtLmNvbHVtbigpKTsKICAgICAgZWxzZSBpZiAoY3VyUHVuYyA9PSAiWyIpIHB1c2hDb250ZXh0KHN0YXRlLCAiXSIsIHN0cmVhbS5jb2x1bW4oKSk7CiAgICAgIGVsc2UgaWYgKGN1clB1bmMgPT0gInsiKSBwdXNoQ29udGV4dChzdGF0ZSwgIn0iLCBzdHJlYW0uY29sdW1uKCkpOwogICAgICBlbHNlIGlmICgvW1xdXH1cKV0vLnRlc3QoY3VyUHVuYykpIHsKICAgICAgICB3aGlsZSAoc3RhdGUuY29udGV4dCAmJiBzdGF0ZS5jb250ZXh0LnR5cGUgPT0gInBhdHRlcm4iKSBwb3BDb250ZXh0KHN0YXRlKTsKICAgICAgICBpZiAoc3RhdGUuY29udGV4dCAmJiBjdXJQdW5jID09IHN0YXRlLmNvbnRleHQudHlwZSkgewogICAgICAgICAgcG9wQ29udGV4dChzdGF0ZSk7CiAgICAgICAgICBpZiAoY3VyUHVuYyA9PSAifSIgJiYgc3RhdGUuY29udGV4dCAmJiBzdGF0ZS5jb250ZXh0LnR5cGUgPT0gInBhdHRlcm4iKQogICAgICAgICAgICBwb3BDb250ZXh0KHN0YXRlKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgZWxzZSBpZiAoY3VyUHVuYyA9PSAiLiIgJiYgc3RhdGUuY29udGV4dCAmJiBzdGF0ZS5jb250ZXh0LnR5cGUgPT0gInBhdHRlcm4iKSBwb3BDb250ZXh0KHN0YXRlKTsKICAgICAgZWxzZSBpZiAoL2F0b218c3RyaW5nfHZhcmlhYmxlLy50ZXN0KHN0eWxlKSAmJiBzdGF0ZS5jb250ZXh0KSB7CiAgICAgICAgaWYgKC9bXH1cXV0vLnRlc3Qoc3RhdGUuY29udGV4dC50eXBlKSkKICAgICAgICAgIHB1c2hDb250ZXh0KHN0YXRlLCAicGF0dGVybiIsIHN0cmVhbS5jb2x1bW4oKSk7CiAgICAgICAgZWxzZSBpZiAoc3RhdGUuY29udGV4dC50eXBlID09ICJwYXR0ZXJuIiAmJiAhc3RhdGUuY29udGV4dC5hbGlnbikgewogICAgICAgICAgc3RhdGUuY29udGV4dC5hbGlnbiA9IHRydWU7CiAgICAgICAgICBzdGF0ZS5jb250ZXh0LmNvbCA9IHN0cmVhbS5jb2x1bW4oKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiBzdHlsZTsKICAgIH0sCgogICAgaW5kZW50OiBmdW5jdGlvbihzdGF0ZSwgdGV4dEFmdGVyKSB7CiAgICAgIHZhciBmaXJzdENoYXIgPSB0ZXh0QWZ0ZXIgJiYgdGV4dEFmdGVyLmNoYXJBdCgwKTsKICAgICAgdmFyIGNvbnRleHQgPSBzdGF0ZS5jb250ZXh0OwogICAgICBpZiAoL1tcXVx9XS8udGVzdChmaXJzdENoYXIpKQogICAgICAgIHdoaWxlIChjb250ZXh0ICYmIGNvbnRleHQudHlwZSA9PSAicGF0dGVybiIpIGNvbnRleHQgPSBjb250ZXh0LnByZXY7CgogICAgICB2YXIgY2xvc2luZyA9IGNvbnRleHQgJiYgZmlyc3RDaGFyID09IGNvbnRleHQudHlwZTsKICAgICAgaWYgKCFjb250ZXh0KQogICAgICAgIHJldHVybiAwOwogICAgICBlbHNlIGlmIChjb250ZXh0LnR5cGUgPT0gInBhdHRlcm4iKQogICAgICAgIHJldHVybiBjb250ZXh0LmNvbDsKICAgICAgZWxzZSBpZiAoY29udGV4dC5hbGlnbikKICAgICAgICByZXR1cm4gY29udGV4dC5jb2wgKyAoY2xvc2luZyA/IDAgOiAxKTsKICAgICAgZWxzZQogICAgICAgIHJldHVybiBjb250ZXh0LmluZGVudCArIChjbG9zaW5nID8gMCA6IGluZGVudFVuaXQpOwogICAgfSwKCiAgICBsaW5lQ29tbWVudDogIiMiCiAgfTsKfSk7CgpDb2RlTWlycm9yLmRlZmluZU1JTUUoImFwcGxpY2F0aW9uL3NwYXJxbC1xdWVyeSIsICJzcGFycWwiKTsKCn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/spreadsheet/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/spreadsheet/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogU3ByZWFkc2hlZXQgbW9kZTwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uLy4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxzY3JpcHQgc3JjPSIuLi8uLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi8uLi9hZGRvbi9lZGl0L21hdGNoYnJhY2tldHMuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0ic3ByZWFkc2hlZXQuanMiPjwvc2NyaXB0Pgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPi5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazt9PC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aDE+Q29kZU1pcnJvcjwvaDE+PGltZyBpZD1sb2dvIHNyYz0iLi4vLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+TGFuZ3VhZ2UgbW9kZXM8L2E+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPlNwcmVhZHNoZWV0PC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CiAgPGgyPlNwcmVhZHNoZWV0IG1vZGU8L2gyPgogIDxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+PUlGKEExOkIyLCBUUlVFLCBGQUxTRSkgLyAxMDA8L3RleHRhcmVhPjwvZm9ybT4KCiAgPHNjcmlwdD4KICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgICBtYXRjaEJyYWNrZXRzOiB0cnVlLAogICAgICBleHRyYUtleXM6IHsiVGFiIjogICJpbmRlbnRBdXRvIn0KICAgIH0pOwogIDwvc2NyaXB0PgoKICA8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC94LXNwcmVhZHNoZWV0PC9jb2RlPi48L3A+CiAgCiAgPGgzPlRoZSBTcHJlYWRzaGVldCBNb2RlPC9oMz4KICA8cD4gQ3JlYXRlZCBieSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vcm9iZXJ0bGVlcGx1bW1lcmpyIj5Sb2JlcnQgUGx1bW1lcjwvYT48L3A+CjwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/spreadsheet/spreadsheet.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CgogIENvZGVNaXJyb3IuZGVmaW5lTW9kZSgic3ByZWFkc2hlZXQiLCBmdW5jdGlvbiAoKSB7CiAgICByZXR1cm4gewogICAgICBzdGFydFN0YXRlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHN0cmluZ1R5cGU6IG51bGwsCiAgICAgICAgICBzdGFjazogW10KICAgICAgICB9OwogICAgICB9LAogICAgICB0b2tlbjogZnVuY3Rpb24gKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgICBpZiAoIXN0cmVhbSkgcmV0dXJuOwoKICAgICAgICAvL2NoZWNrIGZvciBzdGF0ZSBjaGFuZ2VzCiAgICAgICAgaWYgKHN0YXRlLnN0YWNrLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgLy9zdHJpbmdzCiAgICAgICAgICBpZiAoKHN0cmVhbS5wZWVrKCkgPT0gJyInKSB8fCAoc3RyZWFtLnBlZWsoKSA9PSAiJyIpKSB7CiAgICAgICAgICAgIHN0YXRlLnN0cmluZ1R5cGUgPSBzdHJlYW0ucGVlaygpOwogICAgICAgICAgICBzdHJlYW0ubmV4dCgpOyAvLyBTa2lwIHF1b3RlCiAgICAgICAgICAgIHN0YXRlLnN0YWNrLnVuc2hpZnQoInN0cmluZyIpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy9yZXR1cm4gc3RhdGUKICAgICAgICAvL3N0YWNrIGhhcwogICAgICAgIHN3aXRjaCAoc3RhdGUuc3RhY2tbMF0pIHsKICAgICAgICBjYXNlICJzdHJpbmciOgogICAgICAgICAgd2hpbGUgKHN0YXRlLnN0YWNrWzBdID09PSAic3RyaW5nIiAmJiAhc3RyZWFtLmVvbCgpKSB7CiAgICAgICAgICAgIGlmIChzdHJlYW0ucGVlaygpID09PSBzdGF0ZS5zdHJpbmdUeXBlKSB7CiAgICAgICAgICAgICAgc3RyZWFtLm5leHQoKTsgLy8gU2tpcCBxdW90ZQogICAgICAgICAgICAgIHN0YXRlLnN0YWNrLnNoaWZ0KCk7IC8vIENsZWFyIGZsYWcKICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJlYW0ucGVlaygpID09PSAiXFwiKSB7CiAgICAgICAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHN0cmVhbS5tYXRjaCgvXi5bXlxcXCJcJ10qLyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiAic3RyaW5nIjsKCiAgICAgICAgY2FzZSAiY2hhcmFjdGVyQ2xhc3MiOgogICAgICAgICAgd2hpbGUgKHN0YXRlLnN0YWNrWzBdID09PSAiY2hhcmFjdGVyQ2xhc3MiICYmICFzdHJlYW0uZW9sKCkpIHsKICAgICAgICAgICAgaWYgKCEoc3RyZWFtLm1hdGNoKC9eW15cXVxcXSsvKSB8fCBzdHJlYW0ubWF0Y2goL15cXC4vKSkpCiAgICAgICAgICAgICAgc3RhdGUuc3RhY2suc2hpZnQoKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiAib3BlcmF0b3IiOwogICAgICAgIH0KCiAgICAgICAgdmFyIHBlZWsgPSBzdHJlYW0ucGVlaygpOwoKICAgICAgICAvL25vIHN0YWNrCiAgICAgICAgc3dpdGNoIChwZWVrKSB7CiAgICAgICAgY2FzZSAiWyI6CiAgICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgICAgc3RhdGUuc3RhY2sudW5zaGlmdCgiY2hhcmFjdGVyQ2xhc3MiKTsKICAgICAgICAgIHJldHVybiAiYnJhY2tldCI7CiAgICAgICAgY2FzZSAiOiI6CiAgICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgICAgcmV0dXJuICJvcGVyYXRvciI7CiAgICAgICAgY2FzZSAiXFwiOgogICAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXFxbYS16XSsvKSkgcmV0dXJuICJzdHJpbmctMiI7CiAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgICAgICAgcmV0dXJuICJhdG9tIjsKICAgICAgICAgIH0KICAgICAgICBjYXNlICIuIjoKICAgICAgICBjYXNlICIsIjoKICAgICAgICBjYXNlICI7IjoKICAgICAgICBjYXNlICIqIjoKICAgICAgICBjYXNlICItIjoKICAgICAgICBjYXNlICIrIjoKICAgICAgICBjYXNlICJeIjoKICAgICAgICBjYXNlICI8IjoKICAgICAgICBjYXNlICIvIjoKICAgICAgICBjYXNlICI9IjoKICAgICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgICByZXR1cm4gImF0b20iOwogICAgICAgIGNhc2UgIiQiOgogICAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgICAgIHJldHVybiAiYnVpbHRpbiI7CiAgICAgICAgfQoKICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKC9cZCsvKSkgewogICAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXlx3Ky8pKSByZXR1cm4gImVycm9yIjsKICAgICAgICAgIHJldHVybiAibnVtYmVyIjsKICAgICAgICB9IGVsc2UgaWYgKHN0cmVhbS5tYXRjaCgvXlthLXpBLVpfXVx3Ki8pKSB7CiAgICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKC8oPz1bXCguXSkvLCBmYWxzZSkpIHJldHVybiAia2V5d29yZCI7CiAgICAgICAgICByZXR1cm4gInZhcmlhYmxlLTIiOwogICAgICAgIH0gZWxzZSBpZiAoWyJbIiwgIl0iLCAiKCIsICIpIiwgInsiLCAifSJdLmluZGV4T2YocGVlaykgIT0gLTEpIHsKICAgICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgICByZXR1cm4gImJyYWNrZXQiOwogICAgICAgIH0gZWxzZSBpZiAoIXN0cmVhbS5lYXRTcGFjZSgpKSB7CiAgICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgfTsKICB9KTsKCiAgQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtc3ByZWFkc2hlZXQiLCAic3ByZWFkc2hlZXQiKTsKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/sql/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/sql/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogU1FMIE1vZGUgZm9yIENvZGVNaXJyb3I8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiIC8+CjxzY3JpcHQgc3JjPSIuLi8uLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJzcWwuanMiPjwvc2NyaXB0Pgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2FkZG9uL2hpbnQvc2hvdy1oaW50LmNzcyIgLz4KPHNjcmlwdCBzcmM9Ii4uLy4uL2FkZG9uL2hpbnQvc2hvdy1oaW50LmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uLy4uL2FkZG9uL2hpbnQvc3FsLWhpbnQuanMiPjwvc2NyaXB0Pgo8c3R5bGU+Ci5Db2RlTWlycm9yIHsKICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCBibGFjazsKICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazsKfQogICAgICAgIDwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGgxPkNvZGVNaXJyb3I8L2gxPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5TUUwgTW9kZSBmb3IgQ29kZU1pcnJvcjwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+U1FMIE1vZGUgZm9yIENvZGVNaXJyb3I8L2gyPgo8Zm9ybT4KICAgICAgICAgICAgPHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4tLSBTUUwgTW9kZSBmb3IgQ29kZU1pcnJvcgpTRUxFQ1QgU1FMX05PX0NBQ0hFIERJU1RJTkNUCgkJQHZhcjEgQVMgYHZhbDFgLCBAJ3ZhbDInLCBAZ2xvYmFsLidzcWxfbW9kZScsCgkJMS4xIEFTIGBmbG9hdF92YWxgLCAuMTQgQVMgYGFub3RoZXJfZmxvYXRgLCAwLjA5ZTMgQVMgYGludF93aXRoX2VzcGAsCgkJMHhGQTUgQVMgYGhleGAsIHgnZmE1JyBBUyBgaGV4MmAsIDBiMTAxIEFTIGBiaW5gLCBiJzEwMScgQVMgYGJpbjJgLAoJCURBVEUgJzE5OTQtMDEtMDEnIEFTIGBzcWxfZGF0ZWAsIHsgVCAiMTk5NC0wMS0wMSIgfSBBUyBgb2RiY19kYXRlYCwKCQknbXkgc3RyaW5nJywgX3V0ZjgneW91ciBzdHJpbmcnLCBOJ2hlciBzdHJpbmcnLAogICAgICAgIFRSVUUsIEZBTFNFLCBVTktOT1dOCglGUk9NIERVQUwKCS0tIHNwYWNlIG5lZWRlZCBhZnRlciAnLS0nCgkjIDEgbGluZSBjb21tZW50CgkvKiBtdWx0aWxpbmUKCWNvbW1lbnQhICovCglMSU1JVCAxIE9GRlNFVCAwOwo8L3RleHRhcmVhPgogICAgICAgICAgICA8L2Zvcm0+CiAgICAgICAgICAgIDxwPjxzdHJvbmc+TUlNRSB0eXBlcyBkZWZpbmVkOjwvc3Ryb25nPiAKICAgICAgICAgICAgPGNvZGU+PGEgaHJlZj0iP21pbWU9dGV4dC94LXNxbCI+dGV4dC94LXNxbDwvYT48L2NvZGU+LAogICAgICAgICAgICA8Y29kZT48YSBocmVmPSI/bWltZT10ZXh0L3gtbXlzcWwiPnRleHQveC1teXNxbDwvYT48L2NvZGU+LAogICAgICAgICAgICA8Y29kZT48YSBocmVmPSI/bWltZT10ZXh0L3gtbWFyaWFkYiI+dGV4dC94LW1hcmlhZGI8L2E+PC9jb2RlPiwKICAgICAgICAgICAgPGNvZGU+PGEgaHJlZj0iP21pbWU9dGV4dC94LWNhc3NhbmRyYSI+dGV4dC94LWNhc3NhbmRyYTwvYT48L2NvZGU+LAogICAgICAgICAgICA8Y29kZT48YSBocmVmPSI/bWltZT10ZXh0L3gtcGxzcWwiPnRleHQveC1wbHNxbDwvYT48L2NvZGU+LAogICAgICAgICAgICA8Y29kZT48YSBocmVmPSI/bWltZT10ZXh0L3gtbXNzcWwiPnRleHQveC1tc3NxbDwvYT48L2NvZGU+LAogICAgICAgICAgICA8Y29kZT48YSBocmVmPSI/bWltZT10ZXh0L3gtaGl2ZSI+dGV4dC94LWhpdmU8L2E+PC9jb2RlPiwKICAgICAgICAgICAgPGNvZGU+PGEgaHJlZj0iP21pbWU9dGV4dC94LXBnc3FsIj50ZXh0L3gtcGdzcWw8L2E+PC9jb2RlPiwKICAgICAgICAgICAgPGNvZGU+PGEgaHJlZj0iP21pbWU9dGV4dC94LWdxbCI+dGV4dC94LWdxbDwvYT48L2NvZGU+LgogICAgICAgIDwvcD4KPHNjcmlwdD4Kd2luZG93Lm9ubG9hZCA9IGZ1bmN0aW9uKCkgewogIHZhciBtaW1lID0gJ3RleHQveC1tYXJpYWRiJzsKICAvLyBnZXQgbWltZSB0eXBlCiAgaWYgKHdpbmRvdy5sb2NhdGlvbi5ocmVmLmluZGV4T2YoJ21pbWU9JykgPiAtMSkgewogICAgbWltZSA9IHdpbmRvdy5sb2NhdGlvbi5ocmVmLnN1YnN0cih3aW5kb3cubG9jYXRpb24uaHJlZi5pbmRleE9mKCdtaW1lPScpICsgNSk7CiAgfQogIHdpbmRvdy5lZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29kZScpLCB7CiAgICBtb2RlOiBtaW1lLAogICAgaW5kZW50V2l0aFRhYnM6IHRydWUsCiAgICBzbWFydEluZGVudDogdHJ1ZSwKICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgbWF0Y2hCcmFja2V0cyA6IHRydWUsCiAgICBhdXRvZm9jdXM6IHRydWUsCiAgICBleHRyYUtleXM6IHsiQ3RybC1TcGFjZSI6ICJhdXRvY29tcGxldGUifSwKICAgIGhpbnRPcHRpb25zOiB7dGFibGVzOiB7CiAgICAgIHVzZXJzOiB7bmFtZTogbnVsbCwgc2NvcmU6IG51bGwsIGJpcnRoRGF0ZTogbnVsbH0sCiAgICAgIGNvdW50cmllczoge25hbWU6IG51bGwsIHBvcHVsYXRpb246IG51bGwsIHNpemU6IG51bGx9CiAgICB9fQogIH0pOwp9Owo8L3NjcmlwdD4KCjwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/sql/sql.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJzcWwiLCBmdW5jdGlvbihjb25maWcsIHBhcnNlckNvbmZpZykgewogICJ1c2Ugc3RyaWN0IjsKCiAgdmFyIGNsaWVudCAgICAgICAgID0gcGFyc2VyQ29uZmlnLmNsaWVudCB8fCB7fSwKICAgICAgYXRvbXMgICAgICAgICAgPSBwYXJzZXJDb25maWcuYXRvbXMgfHwgeyJmYWxzZSI6IHRydWUsICJ0cnVlIjogdHJ1ZSwgIm51bGwiOiB0cnVlfSwKICAgICAgYnVpbHRpbiAgICAgICAgPSBwYXJzZXJDb25maWcuYnVpbHRpbiB8fCB7fSwKICAgICAga2V5d29yZHMgICAgICAgPSBwYXJzZXJDb25maWcua2V5d29yZHMgfHwge30sCiAgICAgIG9wZXJhdG9yQ2hhcnMgID0gcGFyc2VyQ29uZmlnLm9wZXJhdG9yQ2hhcnMgfHwgL15bKitcLSU8PiE9Jnx+Xl0vLAogICAgICBzdXBwb3J0ICAgICAgICA9IHBhcnNlckNvbmZpZy5zdXBwb3J0IHx8IHt9LAogICAgICBob29rcyAgICAgICAgICA9IHBhcnNlckNvbmZpZy5ob29rcyB8fCB7fSwKICAgICAgZGF0ZVNRTCAgICAgICAgPSBwYXJzZXJDb25maWcuZGF0ZVNRTCB8fCB7ImRhdGUiIDogdHJ1ZSwgInRpbWUiIDogdHJ1ZSwgInRpbWVzdGFtcCIgOiB0cnVlfTsKCiAgZnVuY3Rpb24gdG9rZW5CYXNlKHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBjaCA9IHN0cmVhbS5uZXh0KCk7CgogICAgLy8gY2FsbCBob29rcyBmcm9tIHRoZSBtaW1lIHR5cGUKICAgIGlmIChob29rc1tjaF0pIHsKICAgICAgdmFyIHJlc3VsdCA9IGhvb2tzW2NoXShzdHJlYW0sIHN0YXRlKTsKICAgICAgaWYgKHJlc3VsdCAhPT0gZmFsc2UpIHJldHVybiByZXN1bHQ7CiAgICB9CgogICAgaWYgKHN1cHBvcnQuaGV4TnVtYmVyID09IHRydWUgJiYKICAgICAgKChjaCA9PSAiMCIgJiYgc3RyZWFtLm1hdGNoKC9eW3hYXVswLTlhLWZBLUZdKy8pKQogICAgICB8fCAoY2ggPT0gIngiIHx8IGNoID09ICJYIikgJiYgc3RyZWFtLm1hdGNoKC9eJ1swLTlhLWZBLUZdKycvKSkpIHsKICAgICAgLy8gaGV4CiAgICAgIC8vIHJlZjogaHR0cDovL2Rldi5teXNxbC5jb20vZG9jL3JlZm1hbi81LjUvZW4vaGV4YWRlY2ltYWwtbGl0ZXJhbHMuaHRtbAogICAgICByZXR1cm4gIm51bWJlciI7CiAgICB9IGVsc2UgaWYgKHN1cHBvcnQuYmluYXJ5TnVtYmVyID09IHRydWUgJiYKICAgICAgKCgoY2ggPT0gImIiIHx8IGNoID09ICJCIikgJiYgc3RyZWFtLm1hdGNoKC9eJ1swMV0rJy8pKQogICAgICB8fCAoY2ggPT0gIjAiICYmIHN0cmVhbS5tYXRjaCgvXmJbMDFdKy8pKSkpIHsKICAgICAgLy8gYml0c3RyaW5nCiAgICAgIC8vIHJlZjogaHR0cDovL2Rldi5teXNxbC5jb20vZG9jL3JlZm1hbi81LjUvZW4vYml0LWZpZWxkLWxpdGVyYWxzLmh0bWwKICAgICAgcmV0dXJuICJudW1iZXIiOwogICAgfSBlbHNlIGlmIChjaC5jaGFyQ29kZUF0KDApID4gNDcgJiYgY2guY2hhckNvZGVBdCgwKSA8IDU4KSB7CiAgICAgIC8vIG51bWJlcnMKICAgICAgLy8gcmVmOiBodHRwOi8vZGV2Lm15c3FsLmNvbS9kb2MvcmVmbWFuLzUuNS9lbi9udW1iZXItbGl0ZXJhbHMuaHRtbAogICAgICAgICAgc3RyZWFtLm1hdGNoKC9eWzAtOV0qXC4/WzAtOV0rKFtlRV1bLStdP1swLTldKyk/Lyk7CiAgICAgIHN1cHBvcnQuZGVjaW1hbGxlc3NGbG9hdCA9PSB0cnVlICYmIHN0cmVhbS5lYXQoJy4nKTsKICAgICAgcmV0dXJuICJudW1iZXIiOwogICAgfSBlbHNlIGlmIChjaCA9PSAiPyIgJiYgKHN0cmVhbS5lYXRTcGFjZSgpIHx8IHN0cmVhbS5lb2woKSB8fCBzdHJlYW0uZWF0KCI7IikpKSB7CiAgICAgIC8vIHBsYWNlaG9sZGVycwogICAgICByZXR1cm4gInZhcmlhYmxlLTMiOwogICAgfSBlbHNlIGlmIChjaCA9PSAiJyIgfHwgKGNoID09ICciJyAmJiBzdXBwb3J0LmRvdWJsZVF1b3RlKSkgewogICAgICAvLyBzdHJpbmdzCiAgICAgIC8vIHJlZjogaHR0cDovL2Rldi5teXNxbC5jb20vZG9jL3JlZm1hbi81LjUvZW4vc3RyaW5nLWxpdGVyYWxzLmh0bWwKICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkxpdGVyYWwoY2gpOwogICAgICByZXR1cm4gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CiAgICB9IGVsc2UgaWYgKCgoKHN1cHBvcnQubkNoYXJDYXN0ID09IHRydWUgJiYgKGNoID09ICJuIiB8fCBjaCA9PSAiTiIpKQogICAgICAgIHx8IChzdXBwb3J0LmNoYXJzZXRDYXN0ID09IHRydWUgJiYgY2ggPT0gIl8iICYmIHN0cmVhbS5tYXRjaCgvW2Etel1bYS16MC05XSovaSkpKQogICAgICAgICYmIChzdHJlYW0ucGVlaygpID09ICInIiB8fCBzdHJlYW0ucGVlaygpID09ICciJykpKSB7CiAgICAgIC8vIGNoYXJzZXQgY2FzdGluZzogX3V0Zjgnc3RyJywgTidzdHInLCBuJ3N0cicKICAgICAgLy8gcmVmOiBodHRwOi8vZGV2Lm15c3FsLmNvbS9kb2MvcmVmbWFuLzUuNS9lbi9zdHJpbmctbGl0ZXJhbHMuaHRtbAogICAgICByZXR1cm4gImtleXdvcmQiOwogICAgfSBlbHNlIGlmICgvXltcKFwpLFw7XFtcXV0vLnRlc3QoY2gpKSB7CiAgICAgIC8vIG5vIGhpZ2hsaWdodGluZwogICAgICByZXR1cm4gbnVsbDsKICAgIH0gZWxzZSBpZiAoc3VwcG9ydC5jb21tZW50U2xhc2hTbGFzaCAmJiBjaCA9PSAiLyIgJiYgc3RyZWFtLmVhdCgiLyIpKSB7CiAgICAgIC8vIDEtbGluZSBjb21tZW50CiAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgcmV0dXJuICJjb21tZW50IjsKICAgIH0gZWxzZSBpZiAoKHN1cHBvcnQuY29tbWVudEhhc2ggJiYgY2ggPT0gIiMiKQogICAgICAgIHx8IChjaCA9PSAiLSIgJiYgc3RyZWFtLmVhdCgiLSIpICYmICghc3VwcG9ydC5jb21tZW50U3BhY2VSZXF1aXJlZCB8fCBzdHJlYW0uZWF0KCIgIikpKSkgewogICAgICAvLyAxLWxpbmUgY29tbWVudHMKICAgICAgLy8gcmVmOiBodHRwczovL2tiLmFza21vbnR5Lm9yZy9lbi9jb21tZW50LXN5bnRheC8KICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICByZXR1cm4gImNvbW1lbnQiOwogICAgfSBlbHNlIGlmIChjaCA9PSAiLyIgJiYgc3RyZWFtLmVhdCgiKiIpKSB7CiAgICAgIC8vIG11bHRpLWxpbmUgY29tbWVudHMKICAgICAgLy8gcmVmOiBodHRwczovL2tiLmFza21vbnR5Lm9yZy9lbi9jb21tZW50LXN5bnRheC8KICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkNvbW1lbnQ7CiAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgIH0gZWxzZSBpZiAoY2ggPT0gIi4iKSB7CiAgICAgIC8vIC4xIGZvciAwLjEKICAgICAgaWYgKHN1cHBvcnQuemVyb2xlc3NGbG9hdCA9PSB0cnVlICYmIHN0cmVhbS5tYXRjaCgvXig/OlxkKyg/OmVbKy1dP1xkKyk/KS9pKSkgewogICAgICAgIHJldHVybiAibnVtYmVyIjsKICAgICAgfQogICAgICAvLyAudGFibGVfbmFtZSAoT0RCQykKICAgICAgLy8gLy8gcmVmOiBodHRwOi8vZGV2Lm15c3FsLmNvbS9kb2MvcmVmbWFuLzUuNi9lbi9pZGVudGlmaWVyLXF1YWxpZmllcnMuaHRtbAogICAgICBpZiAoc3VwcG9ydC5PREJDZG90VGFibGUgPT0gdHJ1ZSAmJiBzdHJlYW0ubWF0Y2goL15bYS16QS1aX10rLykpIHsKICAgICAgICByZXR1cm4gInZhcmlhYmxlLTIiOwogICAgICB9CiAgICB9IGVsc2UgaWYgKG9wZXJhdG9yQ2hhcnMudGVzdChjaCkpIHsKICAgICAgLy8gb3BlcmF0b3JzCiAgICAgIHN0cmVhbS5lYXRXaGlsZShvcGVyYXRvckNoYXJzKTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9IGVsc2UgaWYgKGNoID09ICd7JyAmJgogICAgICAgIChzdHJlYW0ubWF0Y2goL14oICkqKGR8RHx0fFR8dHN8VFMpKCApKidbXiddKicoICkqfS8pIHx8IHN0cmVhbS5tYXRjaCgvXiggKSooZHxEfHR8VHx0c3xUUykoICkqIlteIl0qIiggKSp9LykpKSB7CiAgICAgIC8vIGRhdGVzICh3ZWlyZCBPREJDIHN5bnRheCkKICAgICAgLy8gcmVmOiBodHRwOi8vZGV2Lm15c3FsLmNvbS9kb2MvcmVmbWFuLzUuNS9lbi9kYXRlLWFuZC10aW1lLWxpdGVyYWxzLmh0bWwKICAgICAgcmV0dXJuICJudW1iZXIiOwogICAgfSBlbHNlIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKC9eW19cd1xkXS8pOwogICAgICB2YXIgd29yZCA9IHN0cmVhbS5jdXJyZW50KCkudG9Mb3dlckNhc2UoKTsKICAgICAgLy8gZGF0ZXMgKHN0YW5kYXJkIFNRTCBzeW50YXgpCiAgICAgIC8vIHJlZjogaHR0cDovL2Rldi5teXNxbC5jb20vZG9jL3JlZm1hbi81LjUvZW4vZGF0ZS1hbmQtdGltZS1saXRlcmFscy5odG1sCiAgICAgIGlmIChkYXRlU1FMLmhhc093blByb3BlcnR5KHdvcmQpICYmIChzdHJlYW0ubWF0Y2goL14oICkrJ1teJ10qJy8pIHx8IHN0cmVhbS5tYXRjaCgvXiggKSsiW14iXSoiLykpKQogICAgICAgIHJldHVybiAibnVtYmVyIjsKICAgICAgaWYgKGF0b21zLmhhc093blByb3BlcnR5KHdvcmQpKSByZXR1cm4gImF0b20iOwogICAgICBpZiAoYnVpbHRpbi5oYXNPd25Qcm9wZXJ0eSh3b3JkKSkgcmV0dXJuICJidWlsdGluIjsKICAgICAgaWYgKGtleXdvcmRzLmhhc093blByb3BlcnR5KHdvcmQpKSByZXR1cm4gImtleXdvcmQiOwogICAgICBpZiAoY2xpZW50Lmhhc093blByb3BlcnR5KHdvcmQpKSByZXR1cm4gInN0cmluZy0yIjsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfQoKICAvLyAnc3RyaW5nJywgd2l0aCBjaGFyIHNwZWNpZmllZCBpbiBxdW90ZSBlc2NhcGVkIGJ5ICdcJwogIGZ1bmN0aW9uIHRva2VuTGl0ZXJhbChxdW90ZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgdmFyIGVzY2FwZWQgPSBmYWxzZSwgY2g7CiAgICAgIHdoaWxlICgoY2ggPSBzdHJlYW0ubmV4dCgpKSAhPSBudWxsKSB7CiAgICAgICAgaWYgKGNoID09IHF1b3RlICYmICFlc2NhcGVkKSB7CiAgICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBlc2NhcGVkID0gIWVzY2FwZWQgJiYgY2ggPT0gIlxcIjsKICAgICAgfQogICAgICByZXR1cm4gInN0cmluZyI7CiAgICB9OwogIH0KICBmdW5jdGlvbiB0b2tlbkNvbW1lbnQoc3RyZWFtLCBzdGF0ZSkgewogICAgd2hpbGUgKHRydWUpIHsKICAgICAgaWYgKHN0cmVhbS5za2lwVG8oIioiKSkgewogICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgaWYgKHN0cmVhbS5lYXQoIi8iKSkgewogICAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gImNvbW1lbnQiOwogIH0KCiAgZnVuY3Rpb24gcHVzaENvbnRleHQoc3RyZWFtLCBzdGF0ZSwgdHlwZSkgewogICAgc3RhdGUuY29udGV4dCA9IHsKICAgICAgcHJldjogc3RhdGUuY29udGV4dCwKICAgICAgaW5kZW50OiBzdHJlYW0uaW5kZW50YXRpb24oKSwKICAgICAgY29sOiBzdHJlYW0uY29sdW1uKCksCiAgICAgIHR5cGU6IHR5cGUKICAgIH07CiAgfQoKICBmdW5jdGlvbiBwb3BDb250ZXh0KHN0YXRlKSB7CiAgICBzdGF0ZS5pbmRlbnQgPSBzdGF0ZS5jb250ZXh0LmluZGVudDsKICAgIHN0YXRlLmNvbnRleHQgPSBzdGF0ZS5jb250ZXh0LnByZXY7CiAgfQoKICByZXR1cm4gewogICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB7dG9rZW5pemU6IHRva2VuQmFzZSwgY29udGV4dDogbnVsbH07CiAgICB9LAoKICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIGlmIChzdHJlYW0uc29sKCkpIHsKICAgICAgICBpZiAoc3RhdGUuY29udGV4dCAmJiBzdGF0ZS5jb250ZXh0LmFsaWduID09IG51bGwpCiAgICAgICAgICBzdGF0ZS5jb250ZXh0LmFsaWduID0gZmFsc2U7CiAgICAgIH0KICAgICAgaWYgKHN0cmVhbS5lYXRTcGFjZSgpKSByZXR1cm4gbnVsbDsKCiAgICAgIHZhciBzdHlsZSA9IHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgICBpZiAoc3R5bGUgPT0gImNvbW1lbnQiKSByZXR1cm4gc3R5bGU7CgogICAgICBpZiAoc3RhdGUuY29udGV4dCAmJiBzdGF0ZS5jb250ZXh0LmFsaWduID09IG51bGwpCiAgICAgICAgc3RhdGUuY29udGV4dC5hbGlnbiA9IHRydWU7CgogICAgICB2YXIgdG9rID0gc3RyZWFtLmN1cnJlbnQoKTsKICAgICAgaWYgKHRvayA9PSAiKCIpCiAgICAgICAgcHVzaENvbnRleHQoc3RyZWFtLCBzdGF0ZSwgIikiKTsKICAgICAgZWxzZSBpZiAodG9rID09ICJbIikKICAgICAgICBwdXNoQ29udGV4dChzdHJlYW0sIHN0YXRlLCAiXSIpOwogICAgICBlbHNlIGlmIChzdGF0ZS5jb250ZXh0ICYmIHN0YXRlLmNvbnRleHQudHlwZSA9PSB0b2spCiAgICAgICAgcG9wQ29udGV4dChzdGF0ZSk7CiAgICAgIHJldHVybiBzdHlsZTsKICAgIH0sCgogICAgaW5kZW50OiBmdW5jdGlvbihzdGF0ZSwgdGV4dEFmdGVyKSB7CiAgICAgIHZhciBjeCA9IHN0YXRlLmNvbnRleHQ7CiAgICAgIGlmICghY3gpIHJldHVybiBDb2RlTWlycm9yLlBhc3M7CiAgICAgIHZhciBjbG9zaW5nID0gdGV4dEFmdGVyLmNoYXJBdCgwKSA9PSBjeC50eXBlOwogICAgICBpZiAoY3guYWxpZ24pIHJldHVybiBjeC5jb2wgKyAoY2xvc2luZyA/IDAgOiAxKTsKICAgICAgZWxzZSByZXR1cm4gY3guaW5kZW50ICsgKGNsb3NpbmcgPyAwIDogY29uZmlnLmluZGVudFVuaXQpOwogICAgfSwKCiAgICBibG9ja0NvbW1lbnRTdGFydDogIi8qIiwKICAgIGJsb2NrQ29tbWVudEVuZDogIiovIiwKICAgIGxpbmVDb21tZW50OiBzdXBwb3J0LmNvbW1lbnRTbGFzaFNsYXNoID8gIi8vIiA6IHN1cHBvcnQuY29tbWVudEhhc2ggPyAiIyIgOiBudWxsCiAgfTsKfSk7CgooZnVuY3Rpb24oKSB7CiAgInVzZSBzdHJpY3QiOwoKICAvLyBgaWRlbnRpZmllcmAKICBmdW5jdGlvbiBob29rSWRlbnRpZmllcihzdHJlYW0pIHsKICAgIC8vIE15U1FML01hcmlhREIgaWRlbnRpZmllcnMKICAgIC8vIHJlZjogaHR0cDovL2Rldi5teXNxbC5jb20vZG9jL3JlZm1hbi81LjYvZW4vaWRlbnRpZmllci1xdWFsaWZpZXJzLmh0bWwKICAgIHZhciBjaDsKICAgIHdoaWxlICgoY2ggPSBzdHJlYW0ubmV4dCgpKSAhPSBudWxsKSB7CiAgICAgIGlmIChjaCA9PSAiYCIgJiYgIXN0cmVhbS5lYXQoImAiKSkgcmV0dXJuICJ2YXJpYWJsZS0yIjsKICAgIH0KICAgIHN0cmVhbS5iYWNrVXAoc3RyZWFtLmN1cnJlbnQoKS5sZW5ndGggLSAxKTsKICAgIHJldHVybiBzdHJlYW0uZWF0V2hpbGUoL1x3LykgPyAidmFyaWFibGUtMiIgOiBudWxsOwogIH0KCiAgLy8gdmFyaWFibGUgdG9rZW4KICBmdW5jdGlvbiBob29rVmFyKHN0cmVhbSkgewogICAgLy8gdmFyaWFibGVzCiAgICAvLyBAQHByZWZpeC52YXJOYW1lIEB2YXJOYW1lCiAgICAvLyB2YXJOYW1lIGNhbiBiZSBxdW90ZWQgd2l0aCBgIG9yICcgb3IgIgogICAgLy8gcmVmOiBodHRwOi8vZGV2Lm15c3FsLmNvbS9kb2MvcmVmbWFuLzUuNS9lbi91c2VyLXZhcmlhYmxlcy5odG1sCiAgICBpZiAoc3RyZWFtLmVhdCgiQCIpKSB7CiAgICAgIHN0cmVhbS5tYXRjaCgvXnNlc3Npb25cLi8pOwogICAgICBzdHJlYW0ubWF0Y2goL15sb2NhbFwuLyk7CiAgICAgIHN0cmVhbS5tYXRjaCgvXmdsb2JhbFwuLyk7CiAgICB9CgogICAgaWYgKHN0cmVhbS5lYXQoIiciKSkgewogICAgICBzdHJlYW0ubWF0Y2goL14uKicvKTsKICAgICAgcmV0dXJuICJ2YXJpYWJsZS0yIjsKICAgIH0gZWxzZSBpZiAoc3RyZWFtLmVhdCgnIicpKSB7CiAgICAgIHN0cmVhbS5tYXRjaCgvXi4qIi8pOwogICAgICByZXR1cm4gInZhcmlhYmxlLTIiOwogICAgfSBlbHNlIGlmIChzdHJlYW0uZWF0KCJgIikpIHsKICAgICAgc3RyZWFtLm1hdGNoKC9eLipgLyk7CiAgICAgIHJldHVybiAidmFyaWFibGUtMiI7CiAgICB9IGVsc2UgaWYgKHN0cmVhbS5tYXRjaCgvXlswLTlhLXpBLVokXC5cX10rLykpIHsKICAgICAgcmV0dXJuICJ2YXJpYWJsZS0yIjsKICAgIH0KICAgIHJldHVybiBudWxsOwogIH07CgogIC8vIHNob3J0IGNsaWVudCBrZXl3b3JkIHRva2VuCiAgZnVuY3Rpb24gaG9va0NsaWVudChzdHJlYW0pIHsKICAgIC8vIFxOIG1lYW5zIE5VTEwKICAgIC8vIHJlZjogaHR0cDovL2Rldi5teXNxbC5jb20vZG9jL3JlZm1hbi81LjUvZW4vbnVsbC12YWx1ZXMuaHRtbAogICAgaWYgKHN0cmVhbS5lYXQoIk4iKSkgewogICAgICAgIHJldHVybiAiYXRvbSI7CiAgICB9CiAgICAvLyBcZywgZXRjCiAgICAvLyByZWY6IGh0dHA6Ly9kZXYubXlzcWwuY29tL2RvYy9yZWZtYW4vNS41L2VuL215c3FsLWNvbW1hbmRzLmh0bWwKICAgIHJldHVybiBzdHJlYW0ubWF0Y2goL15bYS16QS1aLiMhP10vKSA/ICJ2YXJpYWJsZS0yIiA6IG51bGw7CiAgfQoKICAvLyB0aGVzZSBrZXl3b3JkcyBhcmUgdXNlZCBieSBhbGwgU1FMIGRpYWxlY3RzIChob3dldmVyLCBhIG1vZGUgY2FuIHN0aWxsIG92ZXJ3cml0ZSBpdCkKICB2YXIgc3FsS2V5d29yZHMgPSAiYWx0ZXIgYW5kIGFzIGFzYyBiZXR3ZWVuIGJ5IGNvdW50IGNyZWF0ZSBkZWxldGUgZGVzYyBkaXN0aW5jdCBkcm9wIGZyb20gZ3JvdXAgaGF2aW5nIGluIGluc2VydCBpbnRvIGlzIGpvaW4gbGlrZSBub3Qgb24gb3Igb3JkZXIgc2VsZWN0IHNldCB0YWJsZSB1bmlvbiB1cGRhdGUgdmFsdWVzIHdoZXJlIGxpbWl0ICI7CgogIC8vIHR1cm4gYSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBpbnRvIGFuIGFycmF5CiAgZnVuY3Rpb24gc2V0KHN0cikgewogICAgdmFyIG9iaiA9IHt9LCB3b3JkcyA9IHN0ci5zcGxpdCgiICIpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB3b3Jkcy5sZW5ndGg7ICsraSkgb2JqW3dvcmRzW2ldXSA9IHRydWU7CiAgICByZXR1cm4gb2JqOwogIH0KCiAgLy8gQSBnZW5lcmljIFNRTCBNb2RlLiBJdCdzIG5vdCBhIHN0YW5kYXJkLCBpdCBqdXN0IHRyeSB0byBzdXBwb3J0IHdoYXQgaXMgZ2VuZXJhbGx5IHN1cHBvcnRlZAogIENvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC94LXNxbCIsIHsKICAgIG5hbWU6ICJzcWwiLAogICAga2V5d29yZHM6IHNldChzcWxLZXl3b3JkcyArICJiZWdpbiIpLAogICAgYnVpbHRpbjogc2V0KCJib29sIGJvb2xlYW4gYml0IGJsb2IgZW51bSBsb25nIGxvbmdibG9iIGxvbmd0ZXh0IG1lZGl1bSBtZWRpdW1ibG9iIG1lZGl1bWludCBtZWRpdW10ZXh0IHRpbWUgdGltZXN0YW1wIHRpbnlibG9iIHRpbnlpbnQgdGlueXRleHQgdGV4dCBiaWdpbnQgaW50IGludDEgaW50MiBpbnQzIGludDQgaW50OCBpbnRlZ2VyIGZsb2F0IGZsb2F0NCBmbG9hdDggZG91YmxlIGNoYXIgdmFyYmluYXJ5IHZhcmNoYXIgdmFyY2hhcmFjdGVyIHByZWNpc2lvbiByZWFsIGRhdGUgZGF0ZXRpbWUgeWVhciB1bnNpZ25lZCBzaWduZWQgZGVjaW1hbCBudW1lcmljIiksCiAgICBhdG9tczogc2V0KCJmYWxzZSB0cnVlIG51bGwgdW5rbm93biIpLAogICAgb3BlcmF0b3JDaGFyczogL15bKitcLSU8PiE9XS8sCiAgICBkYXRlU1FMOiBzZXQoImRhdGUgdGltZSB0aW1lc3RhbXAiKSwKICAgIHN1cHBvcnQ6IHNldCgiT0RCQ2RvdFRhYmxlIGRvdWJsZVF1b3RlIGJpbmFyeU51bWJlciBoZXhOdW1iZXIiKQogIH0pOwoKICBDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveC1tc3NxbCIsIHsKICAgIG5hbWU6ICJzcWwiLAogICAgY2xpZW50OiBzZXQoImNoYXJzZXQgY2xlYXIgY29ubmVjdCBlZGl0IGVnbyBleGl0IGdvIGhlbHAgbm9wYWdlciBub3RlZSBub3dhcm5pbmcgcGFnZXIgcHJpbnQgcHJvbXB0IHF1aXQgcmVoYXNoIHNvdXJjZSBzdGF0dXMgc3lzdGVtIHRlZSIpLAogICAga2V5d29yZHM6IHNldChzcWxLZXl3b3JkcyArICJiZWdpbiB0cmlnZ2VyIHByb2MgdmlldyBpbmRleCBmb3IgYWRkIGNvbnN0cmFpbnQga2V5IHByaW1hcnkgZm9yZWlnbiBjb2xsYXRlIGNsdXN0ZXJlZCBub25jbHVzdGVyZWQgZGVjbGFyZSBleGVjIiksCiAgICBidWlsdGluOiBzZXQoImJpZ2ludCBudW1lcmljIGJpdCBzbWFsbGludCBkZWNpbWFsIHNtYWxsbW9uZXkgaW50IHRpbnlpbnQgbW9uZXkgZmxvYXQgcmVhbCBjaGFyIHZhcmNoYXIgdGV4dCBuY2hhciBudmFyY2hhciBudGV4dCBiaW5hcnkgdmFyYmluYXJ5IGltYWdlIGN1cnNvciB0aW1lc3RhbXAgaGllcmFyY2h5aWQgdW5pcXVlaWRlbnRpZmllciBzcWxfdmFyaWFudCB4bWwgdGFibGUgIiksCiAgICBhdG9tczogc2V0KCJmYWxzZSB0cnVlIG51bGwgdW5rbm93biIpLAogICAgb3BlcmF0b3JDaGFyczogL15bKitcLSU8PiE9XS8sCiAgICBkYXRlU1FMOiBzZXQoImRhdGUgZGF0ZXRpbWVvZmZzZXQgZGF0ZXRpbWUyIHNtYWxsZGF0ZXRpbWUgZGF0ZXRpbWUgdGltZSIpLAogICAgaG9va3M6IHsKICAgICAgIkAiOiAgIGhvb2tWYXIKICAgIH0KICB9KTsKCiAgQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtbXlzcWwiLCB7CiAgICBuYW1lOiAic3FsIiwKICAgIGNsaWVudDogc2V0KCJjaGFyc2V0IGNsZWFyIGNvbm5lY3QgZWRpdCBlZ28gZXhpdCBnbyBoZWxwIG5vcGFnZXIgbm90ZWUgbm93YXJuaW5nIHBhZ2VyIHByaW50IHByb21wdCBxdWl0IHJlaGFzaCBzb3VyY2Ugc3RhdHVzIHN5c3RlbSB0ZWUiKSwKICAgIGtleXdvcmRzOiBzZXQoc3FsS2V5d29yZHMgKyAiYWNjZXNzaWJsZSBhY3Rpb24gYWRkIGFmdGVyIGFsZ29yaXRobSBhbGwgYW5hbHl6ZSBhc2Vuc2l0aXZlIGF0IGF1dGhvcnMgYXV0b19pbmNyZW1lbnQgYXV0b2NvbW1pdCBhdmcgYXZnX3Jvd19sZW5ndGggYmVmb3JlIGJpbmFyeSBiaW5sb2cgYm90aCBidHJlZSBjYWNoZSBjYWxsIGNhc2NhZGUgY2FzY2FkZWQgY2FzZSBjYXRhbG9nX25hbWUgY2hhaW4gY2hhbmdlIGNoYW5nZWQgY2hhcmFjdGVyIGNoZWNrIGNoZWNrcG9pbnQgY2hlY2tzdW0gY2xhc3Nfb3JpZ2luIGNsaWVudF9zdGF0aXN0aWNzIGNsb3NlIGNvYWxlc2NlIGNvZGUgY29sbGF0ZSBjb2xsYXRpb24gY29sbGF0aW9ucyBjb2x1bW4gY29sdW1ucyBjb21tZW50IGNvbW1pdCBjb21taXR0ZWQgY29tcGxldGlvbiBjb25jdXJyZW50IGNvbmRpdGlvbiBjb25uZWN0aW9uIGNvbnNpc3RlbnQgY29uc3RyYWludCBjb250YWlucyBjb250aW51ZSBjb250cmlidXRvcnMgY29udmVydCBjcm9zcyBjdXJyZW50IGN1cnJlbnRfZGF0ZSBjdXJyZW50X3RpbWUgY3VycmVudF90aW1lc3RhbXAgY3VycmVudF91c2VyIGN1cnNvciBkYXRhIGRhdGFiYXNlIGRhdGFiYXNlcyBkYXlfaG91ciBkYXlfbWljcm9zZWNvbmQgZGF5X21pbnV0ZSBkYXlfc2Vjb25kIGRlYWxsb2NhdGUgZGVjIGRlY2xhcmUgZGVmYXVsdCBkZWxheV9rZXlfd3JpdGUgZGVsYXllZCBkZWxpbWl0ZXIgZGVzX2tleV9maWxlIGRlc2NyaWJlIGRldGVybWluaXN0aWMgZGV2X3BvcCBkZXZfc2FtcCBkZXZpYW5jZSBkaWFnbm9zdGljcyBkaXJlY3RvcnkgZGlzYWJsZSBkaXNjYXJkIGRpc3RpbmN0cm93IGRpdiBkdWFsIGR1bXBmaWxlIGVhY2ggZWxzZWlmIGVuYWJsZSBlbmNsb3NlZCBlbmQgZW5kcyBlbmdpbmUgZW5naW5lcyBlbnVtIGVycm9ycyBlc2NhcGUgZXNjYXBlZCBldmVuIGV2ZW50IGV2ZW50cyBldmVyeSBleGVjdXRlIGV4aXN0cyBleGl0IGV4cGxhaW4gZXh0ZW5kZWQgZmFzdCBmZXRjaCBmaWVsZCBmaWVsZHMgZmlyc3QgZmx1c2ggZm9yIGZvcmNlIGZvcmVpZ24gZm91bmRfcm93cyBmdWxsIGZ1bGx0ZXh0IGZ1bmN0aW9uIGdlbmVyYWwgZ2V0IGdsb2JhbCBncmFudCBncmFudHMgZ3JvdXAgZ3JvdXBfY29uY2F0IGhhbmRsZXIgaGFzaCBoZWxwIGhpZ2hfcHJpb3JpdHkgaG9zdHMgaG91cl9taWNyb3NlY29uZCBob3VyX21pbnV0ZSBob3VyX3NlY29uZCBpZiBpZ25vcmUgaWdub3JlX3NlcnZlcl9pZHMgaW1wb3J0IGluZGV4IGluZGV4X3N0YXRpc3RpY3MgaW5maWxlIGlubmVyIGlubm9kYiBpbm91dCBpbnNlbnNpdGl2ZSBpbnNlcnRfbWV0aG9kIGluc3RhbGwgaW50ZXJ2YWwgaW52b2tlciBpc29sYXRpb24gaXRlcmF0ZSBrZXkga2V5cyBraWxsIGxhbmd1YWdlIGxhc3QgbGVhZGluZyBsZWF2ZSBsZWZ0IGxldmVsIGxpbWl0IGxpbmVhciBsaW5lcyBsaXN0IGxvYWQgbG9jYWwgbG9jYWx0aW1lIGxvY2FsdGltZXN0YW1wIGxvY2sgbG9ncyBsb3dfcHJpb3JpdHkgbWFzdGVyIG1hc3Rlcl9oZWFydGJlYXRfcGVyaW9kIG1hc3Rlcl9zc2xfdmVyaWZ5X3NlcnZlcl9jZXJ0IG1hc3RlcnMgbWF0Y2ggbWF4IG1heF9yb3dzIG1heHZhbHVlIG1lc3NhZ2VfdGV4dCBtaWRkbGVpbnQgbWlncmF0ZSBtaW4gbWluX3Jvd3MgbWludXRlX21pY3Jvc2Vjb25kIG1pbnV0ZV9zZWNvbmQgbW9kIG1vZGUgbW9kaWZpZXMgbW9kaWZ5IG11dGV4IG15c3FsX2Vycm5vIG5hdHVyYWwgbmV4dCBubyBub193cml0ZV90b19iaW5sb2cgb2ZmbGluZSBvZmZzZXQgb25lIG9ubGluZSBvcGVuIG9wdGltaXplIG9wdGlvbiBvcHRpb25hbGx5IG91dCBvdXRlciBvdXRmaWxlIHBhY2tfa2V5cyBwYXJzZXIgcGFydGl0aW9uIHBhcnRpdGlvbnMgcGFzc3dvcmQgcGhhc2UgcGx1Z2luIHBsdWdpbnMgcHJlcGFyZSBwcmVzZXJ2ZSBwcmV2IHByaW1hcnkgcHJpdmlsZWdlcyBwcm9jZWR1cmUgcHJvY2Vzc2xpc3QgcHJvZmlsZSBwcm9maWxlcyBwdXJnZSBxdWVyeSBxdWljayByYW5nZSByZWFkIHJlYWRfd3JpdGUgcmVhZHMgcmVhbCByZWJ1aWxkIHJlY292ZXIgcmVmZXJlbmNlcyByZWdleHAgcmVsYXlsb2cgcmVsZWFzZSByZW1vdmUgcmVuYW1lIHJlb3JnYW5pemUgcmVwYWlyIHJlcGVhdGFibGUgcmVwbGFjZSByZXF1aXJlIHJlc2lnbmFsIHJlc3RyaWN0IHJlc3VtZSByZXR1cm4gcmV0dXJucyByZXZva2UgcmlnaHQgcmxpa2Ugcm9sbGJhY2sgcm9sbHVwIHJvdyByb3dfZm9ybWF0IHJ0cmVlIHNhdmVwb2ludCBzY2hlZHVsZSBzY2hlbWEgc2NoZW1hX25hbWUgc2NoZW1hcyBzZWNvbmRfbWljcm9zZWNvbmQgc2VjdXJpdHkgc2Vuc2l0aXZlIHNlcGFyYXRvciBzZXJpYWxpemFibGUgc2VydmVyIHNlc3Npb24gc2hhcmUgc2hvdyBzaWduYWwgc2xhdmUgc2xvdyBzbWFsbGludCBzbmFwc2hvdCBzb25hbWUgc3BhdGlhbCBzcGVjaWZpYyBzcWwgc3FsX2JpZ19yZXN1bHQgc3FsX2J1ZmZlcl9yZXN1bHQgc3FsX2NhY2hlIHNxbF9jYWxjX2ZvdW5kX3Jvd3Mgc3FsX25vX2NhY2hlIHNxbF9zbWFsbF9yZXN1bHQgc3FsZXhjZXB0aW9uIHNxbHN0YXRlIHNxbHdhcm5pbmcgc3NsIHN0YXJ0IHN0YXJ0aW5nIHN0YXJ0cyBzdGF0dXMgc3RkIHN0ZGRldiBzdGRkZXZfcG9wIHN0ZGRldl9zYW1wIHN0b3JhZ2Ugc3RyYWlnaHRfam9pbiBzdWJjbGFzc19vcmlnaW4gc3VtIHN1c3BlbmQgdGFibGVfbmFtZSB0YWJsZV9zdGF0aXN0aWNzIHRhYmxlcyB0YWJsZXNwYWNlIHRlbXBvcmFyeSB0ZXJtaW5hdGVkIHRvIHRyYWlsaW5nIHRyYW5zYWN0aW9uIHRyaWdnZXIgdHJpZ2dlcnMgdHJ1bmNhdGUgdW5jb21taXR0ZWQgdW5kbyB1bmluc3RhbGwgdW5pcXVlIHVubG9jayB1cGdyYWRlIHVzYWdlIHVzZSB1c2VfZnJtIHVzZXIgdXNlcl9yZXNvdXJjZXMgdXNlcl9zdGF0aXN0aWNzIHVzaW5nIHV0Y19kYXRlIHV0Y190aW1lIHV0Y190aW1lc3RhbXAgdmFsdWUgdmFyaWFibGVzIHZhcnlpbmcgdmlldyB2aWV3cyB3YXJuaW5ncyB3aGVuIHdoaWxlIHdpdGggd29yayB3cml0ZSB4YSB4b3IgeWVhcl9tb250aCB6ZXJvZmlsbCBiZWdpbiBkbyB0aGVuIGVsc2UgbG9vcCByZXBlYXQiKSwKICAgIGJ1aWx0aW46IHNldCgiYm9vbCBib29sZWFuIGJpdCBibG9iIGRlY2ltYWwgZG91YmxlIGZsb2F0IGxvbmcgbG9uZ2Jsb2IgbG9uZ3RleHQgbWVkaXVtIG1lZGl1bWJsb2IgbWVkaXVtaW50IG1lZGl1bXRleHQgdGltZSB0aW1lc3RhbXAgdGlueWJsb2IgdGlueWludCB0aW55dGV4dCB0ZXh0IGJpZ2ludCBpbnQgaW50MSBpbnQyIGludDMgaW50NCBpbnQ4IGludGVnZXIgZmxvYXQgZmxvYXQ0IGZsb2F0OCBkb3VibGUgY2hhciB2YXJiaW5hcnkgdmFyY2hhciB2YXJjaGFyYWN0ZXIgcHJlY2lzaW9uIGRhdGUgZGF0ZXRpbWUgeWVhciB1bnNpZ25lZCBzaWduZWQgbnVtZXJpYyIpLAogICAgYXRvbXM6IHNldCgiZmFsc2UgdHJ1ZSBudWxsIHVua25vd24iKSwKICAgIG9wZXJhdG9yQ2hhcnM6IC9eWyorXC0lPD4hPSZ8Xl0vLAogICAgZGF0ZVNRTDogc2V0KCJkYXRlIHRpbWUgdGltZXN0YW1wIiksCiAgICBzdXBwb3J0OiBzZXQoIk9EQkNkb3RUYWJsZSBkZWNpbWFsbGVzc0Zsb2F0IHplcm9sZXNzRmxvYXQgYmluYXJ5TnVtYmVyIGhleE51bWJlciBkb3VibGVRdW90ZSBuQ2hhckNhc3QgY2hhcnNldENhc3QgY29tbWVudEhhc2ggY29tbWVudFNwYWNlUmVxdWlyZWQiKSwKICAgIGhvb2tzOiB7CiAgICAgICJAIjogICBob29rVmFyLAogICAgICAiYCI6ICAgaG9va0lkZW50aWZpZXIsCiAgICAgICJcXCI6ICBob29rQ2xpZW50CiAgICB9CiAgfSk7CgogIENvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC94LW1hcmlhZGIiLCB7CiAgICBuYW1lOiAic3FsIiwKICAgIGNsaWVudDogc2V0KCJjaGFyc2V0IGNsZWFyIGNvbm5lY3QgZWRpdCBlZ28gZXhpdCBnbyBoZWxwIG5vcGFnZXIgbm90ZWUgbm93YXJuaW5nIHBhZ2VyIHByaW50IHByb21wdCBxdWl0IHJlaGFzaCBzb3VyY2Ugc3RhdHVzIHN5c3RlbSB0ZWUiKSwKICAgIGtleXdvcmRzOiBzZXQoc3FsS2V5d29yZHMgKyAiYWNjZXNzaWJsZSBhY3Rpb24gYWRkIGFmdGVyIGFsZ29yaXRobSBhbGwgYWx3YXlzIGFuYWx5emUgYXNlbnNpdGl2ZSBhdCBhdXRob3JzIGF1dG9faW5jcmVtZW50IGF1dG9jb21taXQgYXZnIGF2Z19yb3dfbGVuZ3RoIGJlZm9yZSBiaW5hcnkgYmlubG9nIGJvdGggYnRyZWUgY2FjaGUgY2FsbCBjYXNjYWRlIGNhc2NhZGVkIGNhc2UgY2F0YWxvZ19uYW1lIGNoYWluIGNoYW5nZSBjaGFuZ2VkIGNoYXJhY3RlciBjaGVjayBjaGVja3BvaW50IGNoZWNrc3VtIGNsYXNzX29yaWdpbiBjbGllbnRfc3RhdGlzdGljcyBjbG9zZSBjb2FsZXNjZSBjb2RlIGNvbGxhdGUgY29sbGF0aW9uIGNvbGxhdGlvbnMgY29sdW1uIGNvbHVtbnMgY29tbWVudCBjb21taXQgY29tbWl0dGVkIGNvbXBsZXRpb24gY29uY3VycmVudCBjb25kaXRpb24gY29ubmVjdGlvbiBjb25zaXN0ZW50IGNvbnN0cmFpbnQgY29udGFpbnMgY29udGludWUgY29udHJpYnV0b3JzIGNvbnZlcnQgY3Jvc3MgY3VycmVudCBjdXJyZW50X2RhdGUgY3VycmVudF90aW1lIGN1cnJlbnRfdGltZXN0YW1wIGN1cnJlbnRfdXNlciBjdXJzb3IgZGF0YSBkYXRhYmFzZSBkYXRhYmFzZXMgZGF5X2hvdXIgZGF5X21pY3Jvc2Vjb25kIGRheV9taW51dGUgZGF5X3NlY29uZCBkZWFsbG9jYXRlIGRlYyBkZWNsYXJlIGRlZmF1bHQgZGVsYXlfa2V5X3dyaXRlIGRlbGF5ZWQgZGVsaW1pdGVyIGRlc19rZXlfZmlsZSBkZXNjcmliZSBkZXRlcm1pbmlzdGljIGRldl9wb3AgZGV2X3NhbXAgZGV2aWFuY2UgZGlhZ25vc3RpY3MgZGlyZWN0b3J5IGRpc2FibGUgZGlzY2FyZCBkaXN0aW5jdHJvdyBkaXYgZHVhbCBkdW1wZmlsZSBlYWNoIGVsc2VpZiBlbmFibGUgZW5jbG9zZWQgZW5kIGVuZHMgZW5naW5lIGVuZ2luZXMgZW51bSBlcnJvcnMgZXNjYXBlIGVzY2FwZWQgZXZlbiBldmVudCBldmVudHMgZXZlcnkgZXhlY3V0ZSBleGlzdHMgZXhpdCBleHBsYWluIGV4dGVuZGVkIGZhc3QgZmV0Y2ggZmllbGQgZmllbGRzIGZpcnN0IGZsdXNoIGZvciBmb3JjZSBmb3JlaWduIGZvdW5kX3Jvd3MgZnVsbCBmdWxsdGV4dCBmdW5jdGlvbiBnZW5lcmFsIGdlbmVyYXRlZCBnZXQgZ2xvYmFsIGdyYW50IGdyYW50cyBncm91cCBncm91cGJ5X2NvbmNhdCBoYW5kbGVyIGhhcmQgaGFzaCBoZWxwIGhpZ2hfcHJpb3JpdHkgaG9zdHMgaG91cl9taWNyb3NlY29uZCBob3VyX21pbnV0ZSBob3VyX3NlY29uZCBpZiBpZ25vcmUgaWdub3JlX3NlcnZlcl9pZHMgaW1wb3J0IGluZGV4IGluZGV4X3N0YXRpc3RpY3MgaW5maWxlIGlubmVyIGlubm9kYiBpbm91dCBpbnNlbnNpdGl2ZSBpbnNlcnRfbWV0aG9kIGluc3RhbGwgaW50ZXJ2YWwgaW52b2tlciBpc29sYXRpb24gaXRlcmF0ZSBrZXkga2V5cyBraWxsIGxhbmd1YWdlIGxhc3QgbGVhZGluZyBsZWF2ZSBsZWZ0IGxldmVsIGxpbWl0IGxpbmVhciBsaW5lcyBsaXN0IGxvYWQgbG9jYWwgbG9jYWx0aW1lIGxvY2FsdGltZXN0YW1wIGxvY2sgbG9ncyBsb3dfcHJpb3JpdHkgbWFzdGVyIG1hc3Rlcl9oZWFydGJlYXRfcGVyaW9kIG1hc3Rlcl9zc2xfdmVyaWZ5X3NlcnZlcl9jZXJ0IG1hc3RlcnMgbWF0Y2ggbWF4IG1heF9yb3dzIG1heHZhbHVlIG1lc3NhZ2VfdGV4dCBtaWRkbGVpbnQgbWlncmF0ZSBtaW4gbWluX3Jvd3MgbWludXRlX21pY3Jvc2Vjb25kIG1pbnV0ZV9zZWNvbmQgbW9kIG1vZGUgbW9kaWZpZXMgbW9kaWZ5IG11dGV4IG15c3FsX2Vycm5vIG5hdHVyYWwgbmV4dCBubyBub193cml0ZV90b19iaW5sb2cgb2ZmbGluZSBvZmZzZXQgb25lIG9ubGluZSBvcGVuIG9wdGltaXplIG9wdGlvbiBvcHRpb25hbGx5IG91dCBvdXRlciBvdXRmaWxlIHBhY2tfa2V5cyBwYXJzZXIgcGFydGl0aW9uIHBhcnRpdGlvbnMgcGFzc3dvcmQgcGVyc2lzdGVudCBwaGFzZSBwbHVnaW4gcGx1Z2lucyBwcmVwYXJlIHByZXNlcnZlIHByZXYgcHJpbWFyeSBwcml2aWxlZ2VzIHByb2NlZHVyZSBwcm9jZXNzbGlzdCBwcm9maWxlIHByb2ZpbGVzIHB1cmdlIHF1ZXJ5IHF1aWNrIHJhbmdlIHJlYWQgcmVhZF93cml0ZSByZWFkcyByZWFsIHJlYnVpbGQgcmVjb3ZlciByZWZlcmVuY2VzIHJlZ2V4cCByZWxheWxvZyByZWxlYXNlIHJlbW92ZSByZW5hbWUgcmVvcmdhbml6ZSByZXBhaXIgcmVwZWF0YWJsZSByZXBsYWNlIHJlcXVpcmUgcmVzaWduYWwgcmVzdHJpY3QgcmVzdW1lIHJldHVybiByZXR1cm5zIHJldm9rZSByaWdodCBybGlrZSByb2xsYmFjayByb2xsdXAgcm93IHJvd19mb3JtYXQgcnRyZWUgc2F2ZXBvaW50IHNjaGVkdWxlIHNjaGVtYSBzY2hlbWFfbmFtZSBzY2hlbWFzIHNlY29uZF9taWNyb3NlY29uZCBzZWN1cml0eSBzZW5zaXRpdmUgc2VwYXJhdG9yIHNlcmlhbGl6YWJsZSBzZXJ2ZXIgc2Vzc2lvbiBzaGFyZSBzaG93IHNodXRkb3duIHNpZ25hbCBzbGF2ZSBzbG93IHNtYWxsaW50IHNuYXBzaG90IHNvZnQgc29uYW1lIHNwYXRpYWwgc3BlY2lmaWMgc3FsIHNxbF9iaWdfcmVzdWx0IHNxbF9idWZmZXJfcmVzdWx0IHNxbF9jYWNoZSBzcWxfY2FsY19mb3VuZF9yb3dzIHNxbF9ub19jYWNoZSBzcWxfc21hbGxfcmVzdWx0IHNxbGV4Y2VwdGlvbiBzcWxzdGF0ZSBzcWx3YXJuaW5nIHNzbCBzdGFydCBzdGFydGluZyBzdGFydHMgc3RhdHVzIHN0ZCBzdGRkZXYgc3RkZGV2X3BvcCBzdGRkZXZfc2FtcCBzdG9yYWdlIHN0cmFpZ2h0X2pvaW4gc3ViY2xhc3Nfb3JpZ2luIHN1bSBzdXNwZW5kIHRhYmxlX25hbWUgdGFibGVfc3RhdGlzdGljcyB0YWJsZXMgdGFibGVzcGFjZSB0ZW1wb3JhcnkgdGVybWluYXRlZCB0byB0cmFpbGluZyB0cmFuc2FjdGlvbiB0cmlnZ2VyIHRyaWdnZXJzIHRydW5jYXRlIHVuY29tbWl0dGVkIHVuZG8gdW5pbnN0YWxsIHVuaXF1ZSB1bmxvY2sgdXBncmFkZSB1c2FnZSB1c2UgdXNlX2ZybSB1c2VyIHVzZXJfcmVzb3VyY2VzIHVzZXJfc3RhdGlzdGljcyB1c2luZyB1dGNfZGF0ZSB1dGNfdGltZSB1dGNfdGltZXN0YW1wIHZhbHVlIHZhcmlhYmxlcyB2YXJ5aW5nIHZpZXcgdmlld3MgdmlydHVhbCB3YXJuaW5ncyB3aGVuIHdoaWxlIHdpdGggd29yayB3cml0ZSB4YSB4b3IgeWVhcl9tb250aCB6ZXJvZmlsbCBiZWdpbiBkbyB0aGVuIGVsc2UgbG9vcCByZXBlYXQiKSwKICAgIGJ1aWx0aW46IHNldCgiYm9vbCBib29sZWFuIGJpdCBibG9iIGRlY2ltYWwgZG91YmxlIGZsb2F0IGxvbmcgbG9uZ2Jsb2IgbG9uZ3RleHQgbWVkaXVtIG1lZGl1bWJsb2IgbWVkaXVtaW50IG1lZGl1bXRleHQgdGltZSB0aW1lc3RhbXAgdGlueWJsb2IgdGlueWludCB0aW55dGV4dCB0ZXh0IGJpZ2ludCBpbnQgaW50MSBpbnQyIGludDMgaW50NCBpbnQ4IGludGVnZXIgZmxvYXQgZmxvYXQ0IGZsb2F0OCBkb3VibGUgY2hhciB2YXJiaW5hcnkgdmFyY2hhciB2YXJjaGFyYWN0ZXIgcHJlY2lzaW9uIGRhdGUgZGF0ZXRpbWUgeWVhciB1bnNpZ25lZCBzaWduZWQgbnVtZXJpYyIpLAogICAgYXRvbXM6IHNldCgiZmFsc2UgdHJ1ZSBudWxsIHVua25vd24iKSwKICAgIG9wZXJhdG9yQ2hhcnM6IC9eWyorXC0lPD4hPSZ8Xl0vLAogICAgZGF0ZVNRTDogc2V0KCJkYXRlIHRpbWUgdGltZXN0YW1wIiksCiAgICBzdXBwb3J0OiBzZXQoIk9EQkNkb3RUYWJsZSBkZWNpbWFsbGVzc0Zsb2F0IHplcm9sZXNzRmxvYXQgYmluYXJ5TnVtYmVyIGhleE51bWJlciBkb3VibGVRdW90ZSBuQ2hhckNhc3QgY2hhcnNldENhc3QgY29tbWVudEhhc2ggY29tbWVudFNwYWNlUmVxdWlyZWQiKSwKICAgIGhvb2tzOiB7CiAgICAgICJAIjogICBob29rVmFyLAogICAgICAiYCI6ICAgaG9va0lkZW50aWZpZXIsCiAgICAgICJcXCI6ICBob29rQ2xpZW50CiAgICB9CiAgfSk7CgogIC8vIHRoZSBxdWVyeSBsYW5ndWFnZSB1c2VkIGJ5IEFwYWNoZSBDYXNzYW5kcmEgaXMgY2FsbGVkIENRTCwgYnV0IHRoaXMgbWltZSB0eXBlCiAgLy8gaXMgY2FsbGVkIENhc3NhbmRyYSB0byBhdm9pZCBjb25mdXNpb24gd2l0aCBDb250ZXh0dWFsIFF1ZXJ5IExhbmd1YWdlCiAgQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtY2Fzc2FuZHJhIiwgewogICAgbmFtZTogInNxbCIsCiAgICBjbGllbnQ6IHsgfSwKICAgIGtleXdvcmRzOiBzZXQoImFkZCBhbGwgYWxsb3cgYWx0ZXIgYW5kIGFueSBhcHBseSBhcyBhc2MgYXV0aG9yaXplIGJhdGNoIGJlZ2luIGJ5IGNsdXN0ZXJpbmcgY29sdW1uZmFtaWx5IGNvbXBhY3QgY29uc2lzdGVuY3kgY291bnQgY3JlYXRlIGN1c3RvbSBkZWxldGUgZGVzYyBkaXN0aW5jdCBkcm9wIGVhY2hfcXVvcnVtIGV4aXN0cyBmaWx0ZXJpbmcgZnJvbSBncmFudCBpZiBpbiBpbmRleCBpbnNlcnQgaW50byBrZXkga2V5c3BhY2Uga2V5c3BhY2VzIGxldmVsIGxpbWl0IGxvY2FsX29uZSBsb2NhbF9xdW9ydW0gbW9kaWZ5IG5hbiBub3JlY3Vyc2l2ZSBub3N1cGVydXNlciBub3Qgb2Ygb24gb25lIG9yZGVyIHBhc3N3b3JkIHBlcm1pc3Npb24gcGVybWlzc2lvbnMgcHJpbWFyeSBxdW9ydW0gcmVuYW1lIHJldm9rZSBzY2hlbWEgc2VsZWN0IHNldCBzdG9yYWdlIHN1cGVydXNlciB0YWJsZSB0aHJlZSB0byB0b2tlbiB0cnVuY2F0ZSB0dGwgdHdvIHR5cGUgdW5sb2dnZWQgdXBkYXRlIHVzZSB1c2VyIHVzZXJzIHVzaW5nIHZhbHVlcyB3aGVyZSB3aXRoIHdyaXRldGltZSIpLAogICAgYnVpbHRpbjogc2V0KCJhc2NpaSBiaWdpbnQgYmxvYiBib29sZWFuIGNvdW50ZXIgZGVjaW1hbCBkb3VibGUgZmxvYXQgZnJvemVuIGluZXQgaW50IGxpc3QgbWFwIHN0YXRpYyB0ZXh0IHRpbWVzdGFtcCB0aW1ldXVpZCB0dXBsZSB1dWlkIHZhcmNoYXIgdmFyaW50IiksCiAgICBhdG9tczogc2V0KCJmYWxzZSB0cnVlIGluZmluaXR5IE5hTiIpLAogICAgb3BlcmF0b3JDaGFyczogL15bPD49XS8sCiAgICBkYXRlU1FMOiB7IH0sCiAgICBzdXBwb3J0OiBzZXQoImNvbW1lbnRTbGFzaFNsYXNoIGRlY2ltYWxsZXNzRmxvYXQiKSwKICAgIGhvb2tzOiB7IH0KICB9KTsKCiAgLy8gdGhpcyBpcyBiYXNlZCBvbiBQZXRlciBSYWdhbml0c2NoJ3MgJ3Bsc3FsJyBtb2RlCiAgQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtcGxzcWwiLCB7CiAgICBuYW1lOiAgICAgICAic3FsIiwKICAgIGNsaWVudDogICAgIHNldCgiYXBwaW5mbyBhcnJheXNpemUgYXV0b2NvbW1pdCBhdXRvcHJpbnQgYXV0b3JlY292ZXJ5IGF1dG90cmFjZSBibG9ja3Rlcm1pbmF0b3IgYnJlYWsgYnRpdGxlIGNtZHNlcCBjb2xzZXAgY29tcGF0aWJpbGl0eSBjb21wdXRlIGNvbmNhdCBjb3B5Y29tbWl0IGNvcHl0eXBlY2hlY2sgZGVmaW5lIGRlc2NyaWJlIGVjaG8gZWRpdGZpbGUgZW1iZWRkZWQgZXNjYXBlIGV4ZWMgZXhlY3V0ZSBmZWVkYmFjayBmbGFnZ2VyIGZsdXNoIGhlYWRpbmcgaGVhZHNlcCBpbnN0YW5jZSBsaW5lc2l6ZSBsbm8gbG9ib2Zmc2V0IGxvZ3NvdXJjZSBsb25nIGxvbmdjaHVua3NpemUgbWFya3VwIG5hdGl2ZSBuZXdwYWdlIG51bWZvcm1hdCBudW13aWR0aCBwYWdlc2l6ZSBwYXVzZSBwbm8gcmVjc2VwIHJlY3NlcGNoYXIgcmVsZWFzZSByZXBmb290ZXIgcmVwaGVhZGVyIHNlcnZlcm91dHB1dCBzaGlmdGlub3V0IHNob3cgc2hvd21vZGUgc2l6ZSBzcG9vbCBzcWxibGFua2xpbmVzIHNxbGNhc2Ugc3FsY29kZSBzcWxjb250aW51ZSBzcWxudW1iZXIgc3FscGx1c2NvbXBhdGliaWxpdHkgc3FscHJlZml4IHNxbHByb21wdCBzcWx0ZXJtaW5hdG9yIHN1ZmZpeCB0YWIgdGVybSB0ZXJtb3V0IHRpbWUgdGltaW5nIHRyaW1vdXQgdHJpbXNwb29sIHR0aXRsZSB1bmRlcmxpbmUgdmVyaWZ5IHZlcnNpb24gd3JhcCIpLAogICAga2V5d29yZHM6ICAgc2V0KCJhYm9ydCBhY2NlcHQgYWNjZXNzIGFkZCBhbGwgYWx0ZXIgYW5kIGFueSBhcnJheSBhcnJheWxlbiBhcyBhc2MgYXNzZXJ0IGFzc2lnbiBhdCBhdHRyaWJ1dGVzIGF1ZGl0IGF1dGhvcml6YXRpb24gYXZnIGJhc2VfdGFibGUgYmVnaW4gYmV0d2VlbiBiaW5hcnlfaW50ZWdlciBib2R5IGJvb2xlYW4gYnkgY2FzZSBjYXN0IGNoYXIgY2hhcl9iYXNlIGNoZWNrIGNsb3NlIGNsdXN0ZXIgY2x1c3RlcnMgY29sYXV0aCBjb2x1bW4gY29tbWVudCBjb21taXQgY29tcHJlc3MgY29ubmVjdCBjb25uZWN0ZWQgY29uc3RhbnQgY29uc3RyYWludCBjcmFzaCBjcmVhdGUgY3VycmVudCBjdXJydmFsIGN1cnNvciBkYXRhX2Jhc2UgZGF0YWJhc2UgZGF0ZSBkYmEgZGVhbGxvY2F0ZSBkZWJ1Z29mZiBkZWJ1Z29uIGRlY2ltYWwgZGVjbGFyZSBkZWZhdWx0IGRlZmluaXRpb24gZGVsYXkgZGVsZXRlIGRlc2MgZGlnaXRzIGRpc3Bvc2UgZGlzdGluY3QgZG8gZHJvcCBlbHNlIGVsc2VpZiBlbHNpZiBlbmFibGUgZW5kIGVudHJ5IGVzY2FwZSBleGNlcHRpb24gZXhjZXB0aW9uX2luaXQgZXhjaGFuZ2UgZXhjbHVzaXZlIGV4aXN0cyBleGl0IGV4dGVybmFsIGZhc3QgZmV0Y2ggZmlsZSBmb3IgZm9yY2UgZm9ybSBmcm9tIGZ1bmN0aW9uIGdlbmVyaWMgZ290byBncmFudCBncm91cCBoYXZpbmcgaWRlbnRpZmllZCBpZiBpbW1lZGlhdGUgaW4gaW5jcmVtZW50IGluZGV4IGluZGV4ZXMgaW5kaWNhdG9yIGluaXRpYWwgaW5pdHJhbnMgaW5zZXJ0IGludGVyZmFjZSBpbnRlcnNlY3QgaW50byBpcyBrZXkgbGV2ZWwgbGlicmFyeSBsaWtlIGxpbWl0ZWQgbG9jYWwgbG9jayBsb2cgbG9nZ2luZyBsb25nIGxvb3AgbWFzdGVyIG1heGV4dGVudHMgbWF4dHJhbnMgbWVtYmVyIG1pbmV4dGVudHMgbWludXMgbWlzbGFiZWwgbW9kZSBtb2RpZnkgbXVsdGlzZXQgbmV3IG5leHQgbm8gbm9hdWRpdCBub2NvbXByZXNzIG5vbG9nZ2luZyBub3BhcmFsbGVsIG5vdCBub3dhaXQgbnVtYmVyX2Jhc2Ugb2JqZWN0IG9mIG9mZiBvZmZsaW5lIG9uIG9ubGluZSBvbmx5IG9wZW4gb3B0aW9uIG9yIG9yZGVyIG91dCBwYWNrYWdlIHBhcmFsbGVsIHBhcnRpdGlvbiBwY3RmcmVlIHBjdGluY3JlYXNlIHBjdHVzZWQgcGxzX2ludGVnZXIgcG9zaXRpdmUgcG9zaXRpdmVuIHByYWdtYSBwcmltYXJ5IHByaW9yIHByaXZhdGUgcHJpdmlsZWdlcyBwcm9jZWR1cmUgcHVibGljIHJhaXNlIHJhbmdlIHJhdyByZWFkIHJlYnVpbGQgcmVjb3JkIHJlZiByZWZlcmVuY2VzIHJlZnJlc2ggcmVsZWFzZSByZW5hbWUgcmVwbGFjZSByZXNvdXJjZSByZXN0cmljdCByZXR1cm4gcmV0dXJuaW5nIHJldHVybnMgcmV2ZXJzZSByZXZva2Ugcm9sbGJhY2sgcm93IHJvd2lkIHJvd2xhYmVsIHJvd251bSByb3dzIHJ1biBzYXZlcG9pbnQgc2NoZW1hIHNlZ21lbnQgc2VsZWN0IHNlcGFyYXRlIHNlc3Npb24gc2V0IHNoYXJlIHNuYXBzaG90IHNvbWUgc3BhY2Ugc3BsaXQgc3FsIHN0YXJ0IHN0YXRlbWVudCBzdG9yYWdlIHN1YnR5cGUgc3VjY2Vzc2Z1bCBzeW5vbnltIHRhYmF1dGggdGFibGUgdGFibGVzIHRhYmxlc3BhY2UgdGFzayB0ZXJtaW5hdGUgdGhlbiB0byB0cmlnZ2VyIHRydW5jYXRlIHR5cGUgdW5pb24gdW5pcXVlIHVubGltaXRlZCB1bnJlY292ZXJhYmxlIHVudXNhYmxlIHVwZGF0ZSB1c2UgdXNpbmcgdmFsaWRhdGUgdmFsdWUgdmFsdWVzIHZhcmlhYmxlIHZpZXcgdmlld3Mgd2hlbiB3aGVuZXZlciB3aGVyZSB3aGlsZSB3aXRoIHdvcmsiKSwKICAgIGJ1aWx0aW46ICAgIHNldCgiYWJzIGFjb3MgYWRkX21vbnRocyBhc2NpaSBhc2luIGF0YW4gYXRhbjIgYXZlcmFnZSBiZmlsZSBiZmlsZW5hbWUgYmlnc2VyaWFsIGJpdCBibG9iIGNlaWwgY2hhcmFjdGVyIGNoYXJ0b3Jvd2lkIGNociBjbG9iIGNvbmNhdCBjb252ZXJ0IGNvcyBjb3NoIGNvdW50IGRlYyBkZWNvZGUgZGVyZWYgZHVhbCBkdW1wIGR1cF92YWxfb25faW5kZXggZW1wdHkgZXJyb3IgZXhwIGZhbHNlIGZsb2F0IGZsb29yIGZvdW5kIGdsYiBncmVhdGVzdCBoZXh0b3JhdyBpbml0Y2FwIGluc3RyIGluc3RyYiBpbnQgaW50ZWdlciBpc29wZW4gbGFzdF9kYXkgbGVhc3QgbGVuZ3RoIGxlbmd0aGIgbG4gbG93ZXIgbHBhZCBsdHJpbSBsdWIgbWFrZV9yZWYgbWF4IG1pbiBtbHNsYWJlbCBtb2QgbW9udGhzX2JldHdlZW4gbmF0dXJhbCBuYXR1cmFsbiBuY2hhciBuY2xvYiBuZXdfdGltZSBuZXh0X2RheSBuZXh0dmFsIG5sc19jaGFyc2V0X2RlY2xfbGVuIG5sc19jaGFyc2V0X2lkIG5sc19jaGFyc2V0X25hbWUgbmxzX2luaXRjYXAgbmxzX2xvd2VyIG5sc19zb3J0IG5sc191cHBlciBubHNzb3J0IG5vX2RhdGFfZm91bmQgbm90Zm91bmQgbnVsbCBudW1iZXIgbnVtZXJpYyBudmFyY2hhcjIgbnZsIG90aGVycyBwb3dlciByYXd0b2hleCByZWFsIHJlZnRvaGV4IHJvdW5kIHJvd2NvdW50IHJvd2lkdG9jaGFyIHJvd3R5cGUgcnBhZCBydHJpbSBzZXJpYWwgc2lnbiBzaWdudHlwZSBzaW4gc2luaCBzbWFsbGludCBzb3VuZGV4IHNxbGNvZGUgc3FsZXJybSBzcXJ0IHN0ZGRldiBzdHJpbmcgc3Vic3RyIHN1YnN0cmIgc3VtIHN5c2RhdGUgdGFuIHRhbmggdG9fY2hhciB0ZXh0IHRvX2RhdGUgdG9fbGFiZWwgdG9fbXVsdGlfYnl0ZSB0b19udW1iZXIgdG9fc2luZ2xlX2J5dGUgdHJhbnNsYXRlIHRydWUgdHJ1bmMgdWlkIHVubG9nZ2VkIHVwcGVyIHVzZXIgdXNlcmVudiB2YXJjaGFyIHZhcmNoYXIyIHZhcmlhbmNlIHZhcnlpbmcgdnNpemUgeG1sIiksCiAgICBvcGVyYXRvckNoYXJzOiAvXlsqK1wtJTw+IT1+XS8sCiAgICBkYXRlU1FMOiAgICBzZXQoImRhdGUgdGltZSB0aW1lc3RhbXAiKSwKICAgIHN1cHBvcnQ6ICAgIHNldCgiZG91YmxlUXVvdGUgbkNoYXJDYXN0IHplcm9sZXNzRmxvYXQgYmluYXJ5TnVtYmVyIGhleE51bWJlciIpCiAgfSk7CgogIC8vIENyZWF0ZWQgdG8gc3VwcG9ydCBzcGVjaWZpYyBoaXZlIGtleXdvcmRzCiAgQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtaGl2ZSIsIHsKICAgIG5hbWU6ICJzcWwiLAogICAga2V5d29yZHM6IHNldCgic2VsZWN0IGFsdGVyICRlbGVtJCAka2V5JCAkdmFsdWUkIGFkZCBhZnRlciBhbGwgYW5hbHl6ZSBhbmQgYXJjaGl2ZSBhcyBhc2MgYmVmb3JlIGJldHdlZW4gYmluYXJ5IGJvdGggYnVja2V0IGJ1Y2tldHMgYnkgY2FzY2FkZSBjYXNlIGNhc3QgY2hhbmdlIGNsdXN0ZXIgY2x1c3RlcmVkIGNsdXN0ZXJzdGF0dXMgY29sbGVjdGlvbiBjb2x1bW4gY29sdW1ucyBjb21tZW50IGNvbXB1dGUgY29uY2F0ZW5hdGUgY29udGludWUgY3JlYXRlIGNyb3NzIGN1cnNvciBkYXRhIGRhdGFiYXNlIGRhdGFiYXNlcyBkYnByb3BlcnRpZXMgZGVmZXJyZWQgZGVsZXRlIGRlbGltaXRlZCBkZXNjIGRlc2NyaWJlIGRpcmVjdG9yeSBkaXNhYmxlIGRpc3RpbmN0IGRpc3RyaWJ1dGUgZHJvcCBlbHNlIGVuYWJsZSBlbmQgZXNjYXBlZCBleGNsdXNpdmUgZXhpc3RzIGV4cGxhaW4gZXhwb3J0IGV4dGVuZGVkIGV4dGVybmFsIGZhbHNlIGZldGNoIGZpZWxkcyBmaWxlZm9ybWF0IGZpcnN0IGZvcm1hdCBmb3JtYXR0ZWQgZnJvbSBmdWxsIGZ1bmN0aW9uIGZ1bmN0aW9ucyBncmFudCBncm91cCBoYXZpbmcgaG9sZF9kZGx0aW1lIGlkeHByb3BlcnRpZXMgaWYgaW1wb3J0IGluIGluZGV4IGluZGV4ZXMgaW5wYXRoIGlucHV0ZHJpdmVyIGlucHV0Zm9ybWF0IGluc2VydCBpbnRlcnNlY3QgaW50byBpcyBpdGVtcyBqb2luIGtleXMgbGF0ZXJhbCBsZWZ0IGxpa2UgbGltaXQgbGluZXMgbG9hZCBsb2NhbCBsb2NhdGlvbiBsb2NrIGxvY2tzIG1hcGpvaW4gbWF0ZXJpYWxpemVkIG1pbnVzIG1zY2sgbm9fZHJvcCBub2NvbXByZXNzIG5vdCBvZiBvZmZsaW5lIG9uIG9wdGlvbiBvciBvcmRlciBvdXQgb3V0ZXIgb3V0cHV0ZHJpdmVyIG91dHB1dGZvcm1hdCBvdmVyd3JpdGUgcGFydGl0aW9uIHBhcnRpdGlvbmVkIHBhcnRpdGlvbnMgcGVyY2VudCBwbHVzIHByZXNlcnZlIHByb2NlZHVyZSBwdXJnZSByYW5nZSByY2ZpbGUgcmVhZCByZWFkb25seSByZWFkcyByZWJ1aWxkIHJlY29yZHJlYWRlciByZWNvcmR3cml0ZXIgcmVjb3ZlciByZWR1Y2UgcmVnZXhwIHJlbmFtZSByZXBhaXIgcmVwbGFjZSByZXN0cmljdCByZXZva2UgcmlnaHQgcmxpa2Ugcm93IHNjaGVtYSBzY2hlbWFzIHNlbWkgc2VxdWVuY2VmaWxlIHNlcmRlIHNlcmRlcHJvcGVydGllcyBzZXQgc2hhcmVkIHNob3cgc2hvd19kYXRhYmFzZSBzb3J0IHNvcnRlZCBzc2wgc3RhdGlzdGljcyBzdG9yZWQgc3RyZWFtdGFibGUgdGFibGUgdGFibGVzIHRhYmxlc2FtcGxlIHRibHByb3BlcnRpZXMgdGVtcG9yYXJ5IHRlcm1pbmF0ZWQgdGV4dGZpbGUgdGhlbiB0bXAgdG8gdG91Y2ggdHJhbnNmb3JtIHRyaWdnZXIgdHJ1ZSB1bmFyY2hpdmUgdW5kbyB1bmlvbiB1bmlxdWVqb2luIHVubG9jayB1cGRhdGUgdXNlIHVzaW5nIHV0YyB1dGNfdG1lc3RhbXAgdmlldyB3aGVuIHdoZXJlIHdoaWxlIHdpdGgiKSwKICAgIGJ1aWx0aW46IHNldCgiYm9vbCBib29sZWFuIGxvbmcgdGltZXN0YW1wIHRpbnlpbnQgc21hbGxpbnQgYmlnaW50IGludCBmbG9hdCBkb3VibGUgZGF0ZSBkYXRldGltZSB1bnNpZ25lZCBzdHJpbmcgYXJyYXkgc3RydWN0IG1hcCB1bmlvbnR5cGUiKSwKICAgIGF0b21zOiBzZXQoImZhbHNlIHRydWUgbnVsbCB1bmtub3duIiksCiAgICBvcGVyYXRvckNoYXJzOiAvXlsqK1wtJTw+IT1dLywKICAgIGRhdGVTUUw6IHNldCgiZGF0ZSB0aW1lc3RhbXAiKSwKICAgIHN1cHBvcnQ6IHNldCgiT0RCQ2RvdFRhYmxlIGRvdWJsZVF1b3RlIGJpbmFyeU51bWJlciBoZXhOdW1iZXIiKQogIH0pOwoKICBDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveC1wZ3NxbCIsIHsKICAgIG5hbWU6ICJzcWwiLAogICAgY2xpZW50OiBzZXQoInNvdXJjZSIpLAogICAgLy8gaHR0cDovL3d3dy5wb3N0Z3Jlc3FsLm9yZy9kb2NzLzkuNS9zdGF0aWMvc3FsLWtleXdvcmRzLWFwcGVuZGl4Lmh0bWwKICAgIGtleXdvcmRzOiBzZXQoc3FsS2V5d29yZHMgKyAiYSBhYm9ydCBhYnMgYWJzZW50IGFic29sdXRlIGFjY2VzcyBhY2NvcmRpbmcgYWN0aW9uIGFkYSBhZGQgYWRtaW4gYWZ0ZXIgYWdncmVnYXRlIGFsbCBhbGxvY2F0ZSBhbHNvIGFsd2F5cyBhbmFseXNlIGFuYWx5emUgYW55IGFyZSBhcnJheSBhcnJheV9hZ2cgYXJyYXlfbWF4X2NhcmRpbmFsaXR5IGFzZW5zaXRpdmUgYXNzZXJ0aW9uIGFzc2lnbm1lbnQgYXN5bW1ldHJpYyBhdCBhdG9taWMgYXR0cmlidXRlIGF0dHJpYnV0ZXMgYXV0aG9yaXphdGlvbiBhdmcgYmFja3dhcmQgYmFzZTY0IGJlZm9yZSBiZWdpbiBiZWdpbl9mcmFtZSBiZWdpbl9wYXJ0aXRpb24gYmVybm91bGxpIGJpbmFyeSBiaXRfbGVuZ3RoIGJsb2IgYmxvY2tlZCBib20gYm90aCBicmVhZHRoIGMgY2FjaGUgY2FsbCBjYWxsZWQgY2FyZGluYWxpdHkgY2FzY2FkZSBjYXNjYWRlZCBjYXNlIGNhc3QgY2F0YWxvZyBjYXRhbG9nX25hbWUgY2VpbCBjZWlsaW5nIGNoYWluIGNoYXJhY3RlcmlzdGljcyBjaGFyYWN0ZXJzIGNoYXJhY3Rlcl9sZW5ndGggY2hhcmFjdGVyX3NldF9jYXRhbG9nIGNoYXJhY3Rlcl9zZXRfbmFtZSBjaGFyYWN0ZXJfc2V0X3NjaGVtYSBjaGFyX2xlbmd0aCBjaGVjayBjaGVja3BvaW50IGNsYXNzIGNsYXNzX29yaWdpbiBjbG9iIGNsb3NlIGNsdXN0ZXIgY29hbGVzY2UgY29ib2wgY29sbGF0ZSBjb2xsYXRpb24gY29sbGF0aW9uX2NhdGFsb2cgY29sbGF0aW9uX25hbWUgY29sbGF0aW9uX3NjaGVtYSBjb2xsZWN0IGNvbHVtbiBjb2x1bW5zIGNvbHVtbl9uYW1lIGNvbW1hbmRfZnVuY3Rpb24gY29tbWFuZF9mdW5jdGlvbl9jb2RlIGNvbW1lbnQgY29tbWVudHMgY29tbWl0IGNvbW1pdHRlZCBjb25jdXJyZW50bHkgY29uZGl0aW9uIGNvbmRpdGlvbl9udW1iZXIgY29uZmlndXJhdGlvbiBjb25mbGljdCBjb25uZWN0IGNvbm5lY3Rpb24gY29ubmVjdGlvbl9uYW1lIGNvbnN0cmFpbnQgY29uc3RyYWludHMgY29uc3RyYWludF9jYXRhbG9nIGNvbnN0cmFpbnRfbmFtZSBjb25zdHJhaW50X3NjaGVtYSBjb25zdHJ1Y3RvciBjb250YWlucyBjb250ZW50IGNvbnRpbnVlIGNvbnRyb2wgY29udmVyc2lvbiBjb252ZXJ0IGNvcHkgY29yciBjb3JyZXNwb25kaW5nIGNvc3QgY292YXJfcG9wIGNvdmFyX3NhbXAgY3Jvc3MgY3N2IGN1YmUgY3VtZV9kaXN0IGN1cnJlbnQgY3VycmVudF9jYXRhbG9nIGN1cnJlbnRfZGF0ZSBjdXJyZW50X2RlZmF1bHRfdHJhbnNmb3JtX2dyb3VwIGN1cnJlbnRfcGF0aCBjdXJyZW50X3JvbGUgY3VycmVudF9yb3cgY3VycmVudF9zY2hlbWEgY3VycmVudF90aW1lIGN1cnJlbnRfdGltZXN0YW1wIGN1cnJlbnRfdHJhbnNmb3JtX2dyb3VwX2Zvcl90eXBlIGN1cnJlbnRfdXNlciBjdXJzb3IgY3Vyc29yX25hbWUgY3ljbGUgZGF0YSBkYXRhYmFzZSBkYXRhbGluayBkYXRldGltZV9pbnRlcnZhbF9jb2RlIGRhdGV0aW1lX2ludGVydmFsX3ByZWNpc2lvbiBkYXkgZGIgZGVhbGxvY2F0ZSBkZWMgZGVjbGFyZSBkZWZhdWx0IGRlZmF1bHRzIGRlZmVycmFibGUgZGVmZXJyZWQgZGVmaW5lZCBkZWZpbmVyIGRlZ3JlZSBkZWxpbWl0ZXIgZGVsaW1pdGVycyBkZW5zZV9yYW5rIGRlcHRoIGRlcmVmIGRlcml2ZWQgZGVzY3JpYmUgZGVzY3JpcHRvciBkZXRlcm1pbmlzdGljIGRpYWdub3N0aWNzIGRpY3Rpb25hcnkgZGlzYWJsZSBkaXNjYXJkIGRpc2Nvbm5lY3QgZGlzcGF0Y2ggZGxuZXdjb3B5IGRscHJldmlvdXNjb3B5IGRsdXJsY29tcGxldGUgZGx1cmxjb21wbGV0ZW9ubHkgZGx1cmxjb21wbGV0ZXdyaXRlIGRsdXJscGF0aCBkbHVybHBhdGhvbmx5IGRsdXJscGF0aHdyaXRlIGRsdXJsc2NoZW1lIGRsdXJsc2VydmVyIGRsdmFsdWUgZG8gZG9jdW1lbnQgZG9tYWluIGR5bmFtaWMgZHluYW1pY19mdW5jdGlvbiBkeW5hbWljX2Z1bmN0aW9uX2NvZGUgZWFjaCBlbGVtZW50IGVsc2UgZW1wdHkgZW5hYmxlIGVuY29kaW5nIGVuY3J5cHRlZCBlbmQgZW5kLWV4ZWMgZW5kX2ZyYW1lIGVuZF9wYXJ0aXRpb24gZW5mb3JjZWQgZW51bSBlcXVhbHMgZXNjYXBlIGV2ZW50IGV2ZXJ5IGV4Y2VwdCBleGNlcHRpb24gZXhjbHVkZSBleGNsdWRpbmcgZXhjbHVzaXZlIGV4ZWMgZXhlY3V0ZSBleGlzdHMgZXhwIGV4cGxhaW4gZXhwcmVzc2lvbiBleHRlbnNpb24gZXh0ZXJuYWwgZXh0cmFjdCBmYWxzZSBmYW1pbHkgZmV0Y2ggZmlsZSBmaWx0ZXIgZmluYWwgZmlyc3QgZmlyc3RfdmFsdWUgZmxhZyBmbG9hdCBmbG9vciBmb2xsb3dpbmcgZm9yIGZvcmNlIGZvcmVpZ24gZm9ydHJhbiBmb3J3YXJkIGZvdW5kIGZyYW1lX3JvdyBmcmVlIGZyZWV6ZSBmcyBmdWxsIGZ1bmN0aW9uIGZ1bmN0aW9ucyBmdXNpb24gZyBnZW5lcmFsIGdlbmVyYXRlZCBnZXQgZ2xvYmFsIGdvIGdvdG8gZ3JhbnQgZ3JhbnRlZCBncmVhdGVzdCBncm91cGluZyBncm91cHMgaGFuZGxlciBoZWFkZXIgaGV4IGhpZXJhcmNoeSBob2xkIGhvdXIgaWQgaWRlbnRpdHkgaWYgaWdub3JlIGlsaWtlIGltbWVkaWF0ZSBpbW1lZGlhdGVseSBpbW11dGFibGUgaW1wbGVtZW50YXRpb24gaW1wbGljaXQgaW1wb3J0IGluY2x1ZGluZyBpbmNyZW1lbnQgaW5kZW50IGluZGV4IGluZGV4ZXMgaW5kaWNhdG9yIGluaGVyaXQgaW5oZXJpdHMgaW5pdGlhbGx5IGlubGluZSBpbm5lciBpbm91dCBpbnB1dCBpbnNlbnNpdGl2ZSBpbnN0YW5jZSBpbnN0YW50aWFibGUgaW5zdGVhZCBpbnRlZ3JpdHkgaW50ZXJzZWN0IGludGVyc2VjdGlvbiBpbnZva2VyIGlzbnVsbCBpc29sYXRpb24gayBrZXkga2V5X21lbWJlciBrZXlfdHlwZSBsYWJlbCBsYWcgbGFuZ3VhZ2UgbGFyZ2UgbGFzdCBsYXN0X3ZhbHVlIGxhdGVyYWwgbGVhZCBsZWFkaW5nIGxlYWtwcm9vZiBsZWFzdCBsZWZ0IGxlbmd0aCBsZXZlbCBsaWJyYXJ5IGxpa2VfcmVnZXggbGluayBsaXN0ZW4gbG4gbG9hZCBsb2NhbCBsb2NhbHRpbWUgbG9jYWx0aW1lc3RhbXAgbG9jYXRpb24gbG9jYXRvciBsb2NrIGxvY2tlZCBsb2dnZWQgbG93ZXIgbSBtYXAgbWFwcGluZyBtYXRjaCBtYXRjaGVkIG1hdGVyaWFsaXplZCBtYXggbWF4dmFsdWUgbWF4X2NhcmRpbmFsaXR5IG1lbWJlciBtZXJnZSBtZXNzYWdlX2xlbmd0aCBtZXNzYWdlX29jdGV0X2xlbmd0aCBtZXNzYWdlX3RleHQgbWV0aG9kIG1pbiBtaW51dGUgbWludmFsdWUgbW9kIG1vZGUgbW9kaWZpZXMgbW9kdWxlIG1vbnRoIG1vcmUgbW92ZSBtdWx0aXNldCBtdW1wcyBuYW1lIG5hbWVzIG5hbWVzcGFjZSBuYXRpb25hbCBuYXR1cmFsIG5jaGFyIG5jbG9iIG5lc3RpbmcgbmV3IG5leHQgbmZjIG5mZCBuZmtjIG5ma2QgbmlsIG5vIG5vbmUgbm9ybWFsaXplIG5vcm1hbGl6ZWQgbm90aGluZyBub3RpZnkgbm90bnVsbCBub3dhaXQgbnRoX3ZhbHVlIG50aWxlIG51bGwgbnVsbGFibGUgbnVsbGlmIG51bGxzIG51bWJlciBvYmplY3Qgb2NjdXJyZW5jZXNfcmVnZXggb2N0ZXRzIG9jdGV0X2xlbmd0aCBvZiBvZmYgb2Zmc2V0IG9pZHMgb2xkIG9ubHkgb3BlbiBvcGVyYXRvciBvcHRpb24gb3B0aW9ucyBvcmRlcmluZyBvcmRpbmFsaXR5IG90aGVycyBvdXQgb3V0ZXIgb3V0cHV0IG92ZXIgb3ZlcmxhcHMgb3ZlcmxheSBvdmVycmlkaW5nIG93bmVkIG93bmVyIHAgcGFkIHBhcmFtZXRlciBwYXJhbWV0ZXJfbW9kZSBwYXJhbWV0ZXJfbmFtZSBwYXJhbWV0ZXJfb3JkaW5hbF9wb3NpdGlvbiBwYXJhbWV0ZXJfc3BlY2lmaWNfY2F0YWxvZyBwYXJhbWV0ZXJfc3BlY2lmaWNfbmFtZSBwYXJhbWV0ZXJfc3BlY2lmaWNfc2NoZW1hIHBhcnNlciBwYXJ0aWFsIHBhcnRpdGlvbiBwYXNjYWwgcGFzc2luZyBwYXNzdGhyb3VnaCBwYXNzd29yZCBwZXJjZW50IHBlcmNlbnRpbGVfY29udCBwZXJjZW50aWxlX2Rpc2MgcGVyY2VudF9yYW5rIHBlcmlvZCBwZXJtaXNzaW9uIHBsYWNpbmcgcGxhbnMgcGxpIHBvbGljeSBwb3J0aW9uIHBvc2l0aW9uIHBvc2l0aW9uX3JlZ2V4IHBvd2VyIHByZWNlZGVzIHByZWNlZGluZyBwcmVwYXJlIHByZXBhcmVkIHByZXNlcnZlIHByaW1hcnkgcHJpb3IgcHJpdmlsZWdlcyBwcm9jZWR1cmFsIHByb2NlZHVyZSBwcm9ncmFtIHB1YmxpYyBxdW90ZSByYW5nZSByYW5rIHJlYWQgcmVhZHMgcmVhc3NpZ24gcmVjaGVjayByZWNvdmVyeSByZWN1cnNpdmUgcmVmIHJlZmVyZW5jZXMgcmVmZXJlbmNpbmcgcmVmcmVzaCByZWdyX2F2Z3ggcmVncl9hdmd5IHJlZ3JfY291bnQgcmVncl9pbnRlcmNlcHQgcmVncl9yMiByZWdyX3Nsb3BlIHJlZ3Jfc3h4IHJlZ3Jfc3h5IHJlZ3Jfc3l5IHJlaW5kZXggcmVsYXRpdmUgcmVsZWFzZSByZW5hbWUgcmVwZWF0YWJsZSByZXBsYWNlIHJlcGxpY2EgcmVxdWlyaW5nIHJlc2V0IHJlc3BlY3QgcmVzdGFydCByZXN0b3JlIHJlc3RyaWN0IHJlc3VsdCByZXR1cm4gcmV0dXJuZWRfY2FyZGluYWxpdHkgcmV0dXJuZWRfbGVuZ3RoIHJldHVybmVkX29jdGV0X2xlbmd0aCByZXR1cm5lZF9zcWxzdGF0ZSByZXR1cm5pbmcgcmV0dXJucyByZXZva2UgcmlnaHQgcm9sZSByb2xsYmFjayByb2xsdXAgcm91dGluZSByb3V0aW5lX2NhdGFsb2cgcm91dGluZV9uYW1lIHJvdXRpbmVfc2NoZW1hIHJvdyByb3dzIHJvd19jb3VudCByb3dfbnVtYmVyIHJ1bGUgc2F2ZXBvaW50IHNjYWxlIHNjaGVtYSBzY2hlbWFfbmFtZSBzY29wZSBzY29wZV9jYXRhbG9nIHNjb3BlX25hbWUgc2NvcGVfc2NoZW1hIHNjcm9sbCBzZWFyY2ggc2Vjb25kIHNlY3Rpb24gc2VjdXJpdHkgc2VsZWN0aXZlIHNlbGYgc2Vuc2l0aXZlIHNlcXVlbmNlIHNlcXVlbmNlcyBzZXJpYWxpemFibGUgc2VydmVyIHNlcnZlcl9uYW1lIHNlc3Npb24gc2Vzc2lvbl91c2VyIHNldG9mIHNldHMgc2hhcmUgc2hvdyBzaW1pbGFyIHNpbXBsZSBzaXplIHNraXAgc25hcHNob3Qgc29tZSBzb3VyY2Ugc3BhY2Ugc3BlY2lmaWMgc3BlY2lmaWN0eXBlIHNwZWNpZmljX25hbWUgc3FsIHNxbGNvZGUgc3FsZXJyb3Igc3FsZXhjZXB0aW9uIHNxbHN0YXRlIHNxbHdhcm5pbmcgc3FydCBzdGFibGUgc3RhbmRhbG9uZSBzdGFydCBzdGF0ZSBzdGF0ZW1lbnQgc3RhdGljIHN0YXRpc3RpY3Mgc3RkZGV2X3BvcCBzdGRkZXZfc2FtcCBzdGRpbiBzdGRvdXQgc3RvcmFnZSBzdHJpY3Qgc3RyaXAgc3RydWN0dXJlIHN0eWxlIHN1YmNsYXNzX29yaWdpbiBzdWJtdWx0aXNldCBzdWJzdHJpbmcgc3Vic3RyaW5nX3JlZ2V4IHN1Y2NlZWRzIHN1bSBzeW1tZXRyaWMgc3lzaWQgc3lzdGVtIHN5c3RlbV90aW1lIHN5c3RlbV91c2VyIHQgdGFibGVzIHRhYmxlc2FtcGxlIHRhYmxlc3BhY2UgdGFibGVfbmFtZSB0ZW1wIHRlbXBsYXRlIHRlbXBvcmFyeSB0aGVuIHRpZXMgdGltZXpvbmVfaG91ciB0aW1lem9uZV9taW51dGUgdG8gdG9rZW4gdG9wX2xldmVsX2NvdW50IHRyYWlsaW5nIHRyYW5zYWN0aW9uIHRyYW5zYWN0aW9uc19jb21taXR0ZWQgdHJhbnNhY3Rpb25zX3JvbGxlZF9iYWNrIHRyYW5zYWN0aW9uX2FjdGl2ZSB0cmFuc2Zvcm0gdHJhbnNmb3JtcyB0cmFuc2xhdGUgdHJhbnNsYXRlX3JlZ2V4IHRyYW5zbGF0aW9uIHRyZWF0IHRyaWdnZXIgdHJpZ2dlcl9jYXRhbG9nIHRyaWdnZXJfbmFtZSB0cmlnZ2VyX3NjaGVtYSB0cmltIHRyaW1fYXJyYXkgdHJ1ZSB0cnVuY2F0ZSB0cnVzdGVkIHR5cGUgdHlwZXMgdWVzY2FwZSB1bmJvdW5kZWQgdW5jb21taXR0ZWQgdW5kZXIgdW5lbmNyeXB0ZWQgdW5pcXVlIHVua25vd24gdW5saW5rIHVubGlzdGVuIHVubG9nZ2VkIHVubmFtZWQgdW5uZXN0IHVudGlsIHVudHlwZWQgdXBwZXIgdXJpIHVzYWdlIHVzZXIgdXNlcl9kZWZpbmVkX3R5cGVfY2F0YWxvZyB1c2VyX2RlZmluZWRfdHlwZV9jb2RlIHVzZXJfZGVmaW5lZF90eXBlX25hbWUgdXNlcl9kZWZpbmVkX3R5cGVfc2NoZW1hIHVzaW5nIHZhY3V1bSB2YWxpZCB2YWxpZGF0ZSB2YWxpZGF0b3IgdmFsdWUgdmFsdWVfb2YgdmFyYmluYXJ5IHZhcmlhZGljIHZhcl9wb3AgdmFyX3NhbXAgdmVyYm9zZSB2ZXJzaW9uIHZlcnNpb25pbmcgdmlldyB2aWV3cyB2b2xhdGlsZSB3aGVuIHdoZW5ldmVyIHdoaXRlc3BhY2Ugd2lkdGhfYnVja2V0IHdpbmRvdyB3aXRoaW4gd29yayB3cmFwcGVyIHdyaXRlIHhtbGFnZyB4bWxhdHRyaWJ1dGVzIHhtbGJpbmFyeSB4bWxjYXN0IHhtbGNvbW1lbnQgeG1sY29uY2F0IHhtbGRlY2xhcmF0aW9uIHhtbGRvY3VtZW50IHhtbGVsZW1lbnQgeG1sZXhpc3RzIHhtbGZvcmVzdCB4bWxpdGVyYXRlIHhtbG5hbWVzcGFjZXMgeG1scGFyc2UgeG1scGkgeG1scXVlcnkgeG1scm9vdCB4bWxzY2hlbWEgeG1sc2VyaWFsaXplIHhtbHRhYmxlIHhtbHRleHQgeG1sdmFsaWRhdGUgeWVhciB5ZXMgbG9vcCByZXBlYXQiKSwKICAgIC8vIGh0dHA6Ly93d3cucG9zdGdyZXNxbC5vcmcvZG9jcy85LjUvc3RhdGljL2RhdGF0eXBlLmh0bWwKICAgIGJ1aWx0aW46IHNldCgiYmlnaW50IGludDggYmlnc2VyaWFsIHNlcmlhbDggYml0IHZhcnlpbmcgdmFyYml0IGJvb2xlYW4gYm9vbCBib3ggYnl0ZWEgY2hhcmFjdGVyIGNoYXIgdmFyY2hhciBjaWRyIGNpcmNsZSBkYXRlIGRvdWJsZSBwcmVjaXNpb24gZmxvYXQ4IGluZXQgaW50ZWdlciBpbnQgaW50NCBpbnRlcnZhbCBqc29uIGpzb25iIGxpbmUgbHNlZyBtYWNhZGRyIG1vbmV5IG51bWVyaWMgZGVjaW1hbCBwYXRoIHBnX2xzbiBwb2ludCBwb2x5Z29uIHJlYWwgZmxvYXQ0IHNtYWxsaW50IGludDIgc21hbGxzZXJpYWwgc2VyaWFsMiBzZXJpYWwgc2VyaWFsNCB0ZXh0IHRpbWUgd2l0aG91dCB6b25lIHdpdGggdGltZXR6IHRpbWVzdGFtcCB0aW1lc3RhbXB0eiB0c3F1ZXJ5IHRzdmVjdG9yIHR4aWRfc25hcHNob3QgdXVpZCB4bWwiKSwKICAgIGF0b21zOiBzZXQoImZhbHNlIHRydWUgbnVsbCB1bmtub3duIiksCiAgICBvcGVyYXRvckNoYXJzOiAvXlsqK1wtJTw+IT0mfF5cLyNAP35dLywKICAgIGRhdGVTUUw6IHNldCgiZGF0ZSB0aW1lIHRpbWVzdGFtcCIpLAogICAgc3VwcG9ydDogc2V0KCJPREJDZG90VGFibGUgZGVjaW1hbGxlc3NGbG9hdCB6ZXJvbGVzc0Zsb2F0IGJpbmFyeU51bWJlciBoZXhOdW1iZXIgbkNoYXJDYXN0IGNoYXJzZXRDYXN0IikKICB9KTsKCiAgLy8gR29vZ2xlJ3MgU1FMLWxpa2UgcXVlcnkgbGFuZ3VhZ2UsIEdRTAogIENvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC94LWdxbCIsIHsKICAgIG5hbWU6ICJzcWwiLAogICAga2V5d29yZHM6IHNldCgiYW5jZXN0b3IgYW5kIGFzYyBieSBjb250YWlucyBkZXNjIGRlc2NlbmRhbnQgZGlzdGluY3QgZnJvbSBncm91cCBoYXMgaW4gaXMgbGltaXQgb2Zmc2V0IG9uIG9yZGVyIHNlbGVjdCBzdXBlcnNldCB3aGVyZSIpLAogICAgYXRvbXM6IHNldCgiZmFsc2UgdHJ1ZSIpLAogICAgYnVpbHRpbjogc2V0KCJibG9iIGRhdGV0aW1lIGZpcnN0IGtleSBfX2tleV9fIHN0cmluZyBpbnRlZ2VyIGRvdWJsZSBib29sZWFuIG51bGwiKSwKICAgIG9wZXJhdG9yQ2hhcnM6IC9eWyorXC0lPD4hPV0vCiAgfSk7Cn0oKSk7Cgp9KTsKCi8qCiAgSG93IFByb3BlcnRpZXMgb2YgTWltZSBUeXBlcyBhcmUgdXNlZCBieSBTUUwgTW9kZQogID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KCiAga2V5d29yZHM6CiAgICBBIGxpc3Qgb2Yga2V5d29yZHMgeW91IHdhbnQgdG8gYmUgaGlnaGxpZ2h0ZWQuCiAgYnVpbHRpbjoKICAgIEEgbGlzdCBvZiBidWlsdGluIHR5cGVzIHlvdSB3YW50IHRvIGJlIGhpZ2hsaWdodGVkIChpZiB5b3Ugd2FudCB0eXBlcyB0byBiZSBvZiBjbGFzcyAiYnVpbHRpbiIgaW5zdGVhZCBvZiAia2V5d29yZCIpLgogIG9wZXJhdG9yQ2hhcnM6CiAgICBBbGwgY2hhcmFjdGVycyB0aGF0IG11c3QgYmUgaGFuZGxlZCBhcyBvcGVyYXRvcnMuCiAgY2xpZW50OgogICAgQ29tbWFuZHMgcGFyc2VkIGFuZCBleGVjdXRlZCBieSB0aGUgY2xpZW50IChub3QgdGhlIHNlcnZlcikuCiAgc3VwcG9ydDoKICAgIEEgbGlzdCBvZiBzdXBwb3J0ZWQgc3ludGF4ZXMgd2hpY2ggYXJlIG5vdCBjb21tb24sIGJ1dCBhcmUgc3VwcG9ydGVkIGJ5IG1vcmUgdGhhbiAxIERCTVMuCiAgICAqIE9EQkNkb3RUYWJsZTogLnRhYmxlTmFtZQogICAgKiB6ZXJvbGVzc0Zsb2F0OiAuMQogICAgKiBkb3VibGVRdW90ZQogICAgKiBuQ2hhckNhc3Q6IE4nc3RyaW5nJwogICAgKiBjaGFyc2V0Q2FzdDogX3V0Zjgnc3RyaW5nJwogICAgKiBjb21tZW50SGFzaDogdXNlICMgY2hhciBmb3IgY29tbWVudHMKICAgICogY29tbWVudFNsYXNoU2xhc2g6IHVzZSAvLyBmb3IgY29tbWVudHMKICAgICogY29tbWVudFNwYWNlUmVxdWlyZWQ6IHJlcXVpcmUgYSBzcGFjZSBhZnRlciAtLSBmb3IgY29tbWVudHMKICBhdG9tczoKICAgIEtleXdvcmRzIHRoYXQgbXVzdCBiZSBoaWdobGlnaHRlZCBhcyBhdG9tcywuIFNvbWUgREJNUydzIHN1cHBvcnQgbW9yZSBhdG9tcyB0aGFuIG90aGVyczoKICAgIFVOS05PV04sIElORklOSVRZLCBVTkRFUkZMT1csIE5hTi4uLgogIGRhdGVTUUw6CiAgICBVc2VkIGZvciBkYXRlL3RpbWUgU1FMIHN0YW5kYXJkIHN5bnRheCwgYmVjYXVzZSBub3QgYWxsIERCTVMncyBzdXBwb3J0IHNhbWUgdGVtcG9yYWwgdHlwZXMuCiovCg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/stex/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/stex/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogc1RlWCBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9InN0ZXguanMiPjwvc2NyaXB0Pgo8c3R5bGU+LkNvZGVNaXJyb3Ige2JhY2tncm91bmQ6ICNmOGY4Zjg7fTwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGgxPkNvZGVNaXJyb3I8L2gxPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5zVGVYPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5zVGVYIG1vZGU8L2gyPgo8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgpcYmVnaW57bW9kdWxlfVtpZD1iYnQtc2l6ZV0KXGltcG9ydG1vZHVsZVtiYWxhbmNlZC1iaW5hcnktdHJlZXNde2JhbGFuY2VkLWJpbmFyeS10cmVlc30KXGltcG9ydG1vZHVsZVtcS1dBUkNzbGlkZXN7ZG1hdGgvZW4vY2FyZGluYWxpdHl9XXtjYXJkaW5hbGl0eX0KClxiZWdpbntmcmFtZX0KICBcZnJhbWV0aXRsZXtTaXplIExlbW1hIGZvciBCYWxhbmNlZCBUcmVlc30KICBcYmVnaW57aXRlbWl6ZX0KICBcaXRlbQogICAgXGJlZ2lue2Fzc2VydGlvbn1baWQ9c2l6ZS1sZW1tYSx0eXBlPWxlbW1hXSAKICAgIExldCAkRz1cdHVwe1YsRX0kIGJlIGEgXHRlcm1yZWZbY2Q9YmluYXJ5LXRyZWVzXXtiYWxhbmNlZCBiaW5hcnkgdHJlZX0gCiAgICBvZiBcdGVybXJlZltjZD1ncmFwaC1kZXB0aCxuYW1lPXZlcnRleC1kZXB0aF17ZGVwdGh9JG4+aSQsIHRoZW4gdGhlIHNldAogICAgICRcZGVmZXF7XGxpdmFye1Z9aX17XHNldHN0e1xpbnNldHt2fXtWfX17XGdkZXB0aHt2fSA9IGl9fSQgb2YKICAgIFx0ZXJtcmVmW2NkPWdyYXBocy1pbnRybyxuYW1lPW5vZGVde25vZGVzfSBhdCAKICAgIFx0ZXJtcmVmW2NkPWdyYXBoLWRlcHRoLG5hbWU9dmVydGV4LWRlcHRoXXtkZXB0aH0gJGkkIGhhcwogICAgXHRlcm1yZWZbY2Q9Y2FyZGluYWxpdHksbmFtZT1jYXJkaW5hbGl0eV17Y2FyZGluYWxpdHl9ICRccG93ZXIyaSQuCiAgIFxlbmR7YXNzZXJ0aW9ufQogIFxpdGVtCiAgICBcYmVnaW57c3Byb29mfVtpZD1zaXplLWxlbW1hLXBmLHByb29mZW5kPSxmb3I9c2l6ZS1sZW1tYV17dmlhIGluZHVjdGlvbiBvdmVyIHRoZSBkZXB0aCAkaSQufQogICAgICBcYmVnaW57c3BmY2FzZXN9e1dlIGhhdmUgdG8gY29uc2lkZXIgdHdvIGNhc2VzfQogICAgICAgIFxiZWdpbntzcGZjYXNlfXskaT0wJH0KICAgICAgICAgIFxiZWdpbntzcGZzdGVwfVtkaXNwbGF5PWZsb3ddCiAgICAgICAgICAgIHRoZW4gJFxsaXZhcntWfWk9XHNldHtcbGl2YXJ7dn1yfSQsIHdoZXJlICRcbGl2YXJ7dn1yJCBpcyB0aGUgcm9vdCwgc28KICAgICAgICAgICAgJFxlcXtcY2FyZHtcbGl2YXJ7Vn0wfSxcY2FyZHtcc2V0e1xsaXZhcnt2fXJ9fSwxLFxwb3dlcjIwfSQuCiAgICAgICAgICBcZW5ke3NwZnN0ZXB9CiAgICAgICAgXGVuZHtzcGZjYXNlfQogICAgICAgIFxiZWdpbntzcGZjYXNlfXskaT4wJH0KICAgICAgICAgIFxiZWdpbntzcGZzdGVwfVtkaXNwbGF5PWZsb3ddCiAgICAgICAgICAgdGhlbiAkXGxpdmFye1Z9e2ktMX0kIGNvbnRhaW5zICRccG93ZXIye2ktMX0kIHZlcnRleGVzIAogICAgICAgICAgIFxiZWdpbntqdXN0aWZpY2F0aW9ufVttZXRob2Q9YnlJSF0oSUgpXGVuZHtqdXN0aWZpY2F0aW9ufQogICAgICAgICAgXGVuZHtzcGZzdGVwfQogICAgICAgICAgXGJlZ2lue3NwZnN0ZXB9CiAgICAgICAgICAgQnkgdGhlIFxiZWdpbntqdXN0aWZpY2F0aW9ufVttZXRob2Q9YnlEZWZdZGVmaW5pdGlvbiBvZiBhIGJpbmFyeQogICAgICAgICAgICAgIHRyZWVcZW5ke2p1c3RpZmljYXRpb259LCBlYWNoICRcaW5zZXR7dn17XGxpdmFye1Z9e2ktMX19JCBpcyBhIGxlYWYgb3IgaGFzCiAgICAgICAgICAgIHR3byBjaGlsZHJlbiB0aGF0IGFyZSBhdCBkZXB0aCAkaSQuCiAgICAgICAgICBcZW5ke3NwZnN0ZXB9CiAgICAgICAgICBcYmVnaW57c3Bmc3RlcH0KICAgICAgICAgICBBcyAkRyQgaXMgXHRlcm1yZWZbY2Q9YmFsYW5jZWQtYmluYXJ5LXRyZWVzLG5hbWU9YmFsYW5jZWQtYmluYXJ5LXRyZWVde2JhbGFuY2VkfSBhbmQgJFxnZGVwdGh7R309bj5pJCwgJFxsaXZhcntWfXtpLTF9JCBjYW5ub3QgY29udGFpbgogICAgICAgICAgICBsZWF2ZXMuCiAgICAgICAgICBcZW5ke3NwZnN0ZXB9CiAgICAgICAgICBcYmVnaW57c3Bmc3RlcH1bdHlwZT1jb25jbHVzaW9uXQogICAgICAgICAgIFRodXMgJFxlcXtcY2FyZHtcbGl2YXJ7Vn1pfSx7XGF0aW1lc1tjZG90XXsyLFxjYXJke1xsaXZhcntWfXtpLTF9fX19LHtcYXRpbWVzW2Nkb3RdezIsXHBvd2VyMntpLTF9fX0sXHBvd2VyMml9JC4KICAgICAgICAgIFxlbmR7c3Bmc3RlcH0KICAgICAgICBcZW5ke3NwZmNhc2V9CiAgICAgIFxlbmR7c3BmY2FzZXN9CiAgICBcZW5ke3Nwcm9vZn0KICBcaXRlbSAKICAgIFxiZWdpbnthc3NlcnRpb259W2lkPWZiYnQsdHlwZT1jb3JvbGxhcnldCQogICAgICBBIGZ1bGx5IGJhbGFuY2VkIHRyZWUgb2YgZGVwdGggJGQkIGhhcyAkXHBvd2VyMntkKzF9LTEkIG5vZGVzLgogICAgXGVuZHthc3NlcnRpb259CiAgXGl0ZW0KICAgICAgXGJlZ2lue3Nwcm9vZn1bZm9yPWZiYnQsaWQ9ZmJidC1wZl17fQogICAgICAgIFxiZWdpbntzcGZzdGVwfQogICAgICAgICAgTGV0ICRcZGVmZXF7R317XHR1cHtWLEV9fSQgYmUgYSBmdWxseSBiYWxhbmNlZCB0cmVlCiAgICAgICAgXGVuZHtzcGZzdGVwfQogICAgICAgIFxiZWdpbntzcGZzdGVwfQogICAgICAgICAgVGhlbiAkXGNhcmR7Vn09XFN1bWZyb210b3tpfTFke1xwb3dlcjJpfT0gXHBvd2VyMntkKzF9LTEkLgogICAgICAgIFxlbmR7c3Bmc3RlcH0KICAgICAgXGVuZHtzcHJvb2Z9CiAgICBcZW5ke2l0ZW1pemV9CiAgXGVuZHtmcmFtZX0KXGJlZ2lue25vdGV9CiAgXGJlZ2lue29tdGV4dH1bdHlwZT1jb25jbHVzaW9uLGZvcj1iaW5hcnktdHJlZV0KICAgIFRoaXMgc2hvd3MgdGhhdCBiYWxhbmNlZCBiaW5hcnkgdHJlZXMgZ3JvdyBpbiBicmVhZHRoIHZlcnkgcXVpY2tseSwgYSBjb25zZXF1ZW5jZSBvZgogICAgdGhpcyBpcyB0aGF0IHRoZXkgYXJlIHZlcnkgc2hhbGxvdyAoYW5kIHRoaXMgY29tcHV0ZSB2ZXJ5IGZhc3QpLCB3aGljaCBpcyB0aGUgZXNzZW5jZSBvZgogICAgdGhlIG5leHQgcmVzdWx0LgogIFxlbmR7b210ZXh0fQpcZW5ke25vdGV9ClxlbmR7bW9kdWxlfQoKJSUlIExvY2FsIFZhcmlhYmxlczogCiUlJSBtb2RlOiBMYVRlWAolJSUgVGVYLW1hc3RlcjogImFsbCIKJSUlIEVuZDogXGVuZHtkb2N1bWVudH0KPC90ZXh0YXJlYT48L2Zvcm0+CiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwge30pOwogICAgPC9zY3JpcHQ+CgogICAgPHA+PHN0cm9uZz5NSU1FIHR5cGVzIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPnRleHQveC1zdGV4PC9jb2RlPi48L3A+CgogICAgPHA+PHN0cm9uZz5QYXJzaW5nL0hpZ2hsaWdodGluZyBUZXN0czo8L3N0cm9uZz4gPGEgaHJlZj0iLi4vLi4vdGVzdC9pbmRleC5odG1sI3N0ZXhfKiI+bm9ybWFsPC9hPiwgIDxhIGhyZWY9Ii4uLy4uL3Rlc3QvaW5kZXguaHRtbCN2ZXJib3NlLHN0ZXhfKiI+dmVyYm9zZTwvYT4uPC9wPgoKICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/stex/stex.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovKgogKiBBdXRob3I6IENvbnN0YW50aW4gSnVjb3ZzY2hpIChjLmp1Y292c2NoaUBqYWNvYnMtdW5pdmVyc2l0eS5kZSkKICogTGljZW5jZTogTUlUCiAqLwoKKGZ1bmN0aW9uKG1vZCkgewogIGlmICh0eXBlb2YgZXhwb3J0cyA9PSAib2JqZWN0IiAmJiB0eXBlb2YgbW9kdWxlID09ICJvYmplY3QiKSAvLyBDb21tb25KUwogICAgbW9kKHJlcXVpcmUoIi4uLy4uL2xpYi9jb2RlbWlycm9yIikpOwogIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kKSAvLyBBTUQKICAgIGRlZmluZShbIi4uLy4uL2xpYi9jb2RlbWlycm9yIl0sIG1vZCk7CiAgZWxzZSAvLyBQbGFpbiBicm93c2VyIGVudgogICAgbW9kKENvZGVNaXJyb3IpOwp9KShmdW5jdGlvbihDb2RlTWlycm9yKSB7CiAgInVzZSBzdHJpY3QiOwoKICBDb2RlTWlycm9yLmRlZmluZU1vZGUoInN0ZXgiLCBmdW5jdGlvbigpIHsKICAgICJ1c2Ugc3RyaWN0IjsKCiAgICBmdW5jdGlvbiBwdXNoQ29tbWFuZChzdGF0ZSwgY29tbWFuZCkgewogICAgICBzdGF0ZS5jbWRTdGF0ZS5wdXNoKGNvbW1hbmQpOwogICAgfQoKICAgIGZ1bmN0aW9uIHBlZWtDb21tYW5kKHN0YXRlKSB7CiAgICAgIGlmIChzdGF0ZS5jbWRTdGF0ZS5sZW5ndGggPiAwKSB7CiAgICAgICAgcmV0dXJuIHN0YXRlLmNtZFN0YXRlW3N0YXRlLmNtZFN0YXRlLmxlbmd0aCAtIDFdOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gcG9wQ29tbWFuZChzdGF0ZSkgewogICAgICB2YXIgcGx1ZyA9IHN0YXRlLmNtZFN0YXRlLnBvcCgpOwogICAgICBpZiAocGx1ZykgewogICAgICAgIHBsdWcuY2xvc2VCcmFja2V0KCk7CiAgICAgIH0KICAgIH0KCiAgICAvLyByZXR1cm5zIHRoZSBub24tZGVmYXVsdCBwbHVnaW4gY2xvc2VzdCB0byB0aGUgZW5kIG9mIHRoZSBsaXN0CiAgICBmdW5jdGlvbiBnZXRNb3N0UG93ZXJmdWwoc3RhdGUpIHsKICAgICAgdmFyIGNvbnRleHQgPSBzdGF0ZS5jbWRTdGF0ZTsKICAgICAgZm9yICh2YXIgaSA9IGNvbnRleHQubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICB2YXIgcGx1ZyA9IGNvbnRleHRbaV07CiAgICAgICAgaWYgKHBsdWcubmFtZSA9PSAiREVGQVVMVCIpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcGx1ZzsKICAgICAgfQogICAgICByZXR1cm4geyBzdHlsZUlkZW50aWZpZXI6IGZ1bmN0aW9uKCkgeyByZXR1cm4gbnVsbDsgfSB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGFkZFBsdWdpblBhdHRlcm4ocGx1Z2luTmFtZSwgY21kU3R5bGUsIHN0eWxlcykgewogICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgIHRoaXMubmFtZSA9IHBsdWdpbk5hbWU7CiAgICAgICAgdGhpcy5icmFja2V0Tm8gPSAwOwogICAgICAgIHRoaXMuc3R5bGUgPSBjbWRTdHlsZTsKICAgICAgICB0aGlzLnN0eWxlcyA9IHN0eWxlczsKICAgICAgICB0aGlzLmFyZ3VtZW50ID0gbnVsbDsgICAvLyBcYmVnaW4gYW5kIFxlbmQgaGF2ZSBhcmd1bWVudHMgdGhhdCBmb2xsb3cuIFRoZXNlIGFyZSBzdG9yZWQgaW4gdGhlIHBsdWdpbgoKICAgICAgICB0aGlzLnN0eWxlSWRlbnRpZmllciA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIHRoaXMuc3R5bGVzW3RoaXMuYnJhY2tldE5vIC0gMV0gfHwgbnVsbDsKICAgICAgICB9OwogICAgICAgIHRoaXMub3BlbkJyYWNrZXQgPSBmdW5jdGlvbigpIHsKICAgICAgICAgIHRoaXMuYnJhY2tldE5vKys7CiAgICAgICAgICByZXR1cm4gImJyYWNrZXQiOwogICAgICAgIH07CiAgICAgICAgdGhpcy5jbG9zZUJyYWNrZXQgPSBmdW5jdGlvbigpIHt9OwogICAgICB9OwogICAgfQoKICAgIHZhciBwbHVnaW5zID0ge307CgogICAgcGx1Z2luc1siaW1wb3J0bW9kdWxlIl0gPSBhZGRQbHVnaW5QYXR0ZXJuKCJpbXBvcnRtb2R1bGUiLCAidGFnIiwgWyJzdHJpbmciLCAiYnVpbHRpbiJdKTsKICAgIHBsdWdpbnNbImRvY3VtZW50Y2xhc3MiXSA9IGFkZFBsdWdpblBhdHRlcm4oImRvY3VtZW50Y2xhc3MiLCAidGFnIiwgWyIiLCAiYXRvbSJdKTsKICAgIHBsdWdpbnNbInVzZXBhY2thZ2UiXSA9IGFkZFBsdWdpblBhdHRlcm4oInVzZXBhY2thZ2UiLCAidGFnIiwgWyJhdG9tIl0pOwogICAgcGx1Z2luc1siYmVnaW4iXSA9IGFkZFBsdWdpblBhdHRlcm4oImJlZ2luIiwgInRhZyIsIFsiYXRvbSJdKTsKICAgIHBsdWdpbnNbImVuZCJdID0gYWRkUGx1Z2luUGF0dGVybigiZW5kIiwgInRhZyIsIFsiYXRvbSJdKTsKCiAgICBwbHVnaW5zWyJERUZBVUxUIl0gPSBmdW5jdGlvbiAoKSB7CiAgICAgIHRoaXMubmFtZSA9ICJERUZBVUxUIjsKICAgICAgdGhpcy5zdHlsZSA9ICJ0YWciOwoKICAgICAgdGhpcy5zdHlsZUlkZW50aWZpZXIgPSB0aGlzLm9wZW5CcmFja2V0ID0gdGhpcy5jbG9zZUJyYWNrZXQgPSBmdW5jdGlvbigpIHt9OwogICAgfTsKCiAgICBmdW5jdGlvbiBzZXRTdGF0ZShzdGF0ZSwgZikgewogICAgICBzdGF0ZS5mID0gZjsKICAgIH0KCiAgICAvLyBjYWxsZWQgd2hlbiBpbiBhIG5vcm1hbCAobm8gZW52aXJvbm1lbnQpIGNvbnRleHQKICAgIGZ1bmN0aW9uIG5vcm1hbChzb3VyY2UsIHN0YXRlKSB7CiAgICAgIHZhciBwbHVnOwogICAgICAvLyBEbyB3ZSBsb29rIGxpa2UgJ1xjb21tYW5kJyA/ICBJZiBzbywgYXR0ZW1wdCB0byBhcHBseSB0aGUgcGx1Z2luICdjb21tYW5kJwogICAgICBpZiAoc291cmNlLm1hdGNoKC9eXFxbYS16QS1aQF0rLykpIHsKICAgICAgICB2YXIgY21kTmFtZSA9IHNvdXJjZS5jdXJyZW50KCkuc2xpY2UoMSk7CiAgICAgICAgcGx1ZyA9IHBsdWdpbnNbY21kTmFtZV0gfHwgcGx1Z2luc1siREVGQVVMVCJdOwogICAgICAgIHBsdWcgPSBuZXcgcGx1ZygpOwogICAgICAgIHB1c2hDb21tYW5kKHN0YXRlLCBwbHVnKTsKICAgICAgICBzZXRTdGF0ZShzdGF0ZSwgYmVnaW5QYXJhbXMpOwogICAgICAgIHJldHVybiBwbHVnLnN0eWxlOwogICAgICB9CgogICAgICAvLyBlc2NhcGUgY2hhcmFjdGVycwogICAgICBpZiAoc291cmNlLm1hdGNoKC9eXFxbJCYlI3t9X10vKSkgewogICAgICAgIHJldHVybiAidGFnIjsKICAgICAgfQoKICAgICAgLy8gd2hpdGUgc3BhY2UgY29udHJvbCBjaGFyYWN0ZXJzCiAgICAgIGlmIChzb3VyY2UubWF0Y2goL15cXFssOyFcL1xcXS8pKSB7CiAgICAgICAgcmV0dXJuICJ0YWciOwogICAgICB9CgogICAgICAvLyBmaW5kIGlmIHdlJ3JlIHN0YXJ0aW5nIHZhcmlvdXMgbWF0aCBtb2RlcwogICAgICBpZiAoc291cmNlLm1hdGNoKCJcXFsiKSkgewogICAgICAgIHNldFN0YXRlKHN0YXRlLCBmdW5jdGlvbihzb3VyY2UsIHN0YXRlKXsgcmV0dXJuIGluTWF0aE1vZGUoc291cmNlLCBzdGF0ZSwgIlxcXSIpOyB9KTsKICAgICAgICByZXR1cm4gImtleXdvcmQiOwogICAgICB9CiAgICAgIGlmIChzb3VyY2UubWF0Y2goIiQkIikpIHsKICAgICAgICBzZXRTdGF0ZShzdGF0ZSwgZnVuY3Rpb24oc291cmNlLCBzdGF0ZSl7IHJldHVybiBpbk1hdGhNb2RlKHNvdXJjZSwgc3RhdGUsICIkJCIpOyB9KTsKICAgICAgICByZXR1cm4gImtleXdvcmQiOwogICAgICB9CiAgICAgIGlmIChzb3VyY2UubWF0Y2goIiQiKSkgewogICAgICAgIHNldFN0YXRlKHN0YXRlLCBmdW5jdGlvbihzb3VyY2UsIHN0YXRlKXsgcmV0dXJuIGluTWF0aE1vZGUoc291cmNlLCBzdGF0ZSwgIiQiKTsgfSk7CiAgICAgICAgcmV0dXJuICJrZXl3b3JkIjsKICAgICAgfQoKICAgICAgdmFyIGNoID0gc291cmNlLm5leHQoKTsKICAgICAgaWYgKGNoID09ICIlIikgewogICAgICAgIHNvdXJjZS5za2lwVG9FbmQoKTsKICAgICAgICByZXR1cm4gImNvbW1lbnQiOwogICAgICB9IGVsc2UgaWYgKGNoID09ICd9JyB8fCBjaCA9PSAnXScpIHsKICAgICAgICBwbHVnID0gcGVla0NvbW1hbmQoc3RhdGUpOwogICAgICAgIGlmIChwbHVnKSB7CiAgICAgICAgICBwbHVnLmNsb3NlQnJhY2tldChjaCk7CiAgICAgICAgICBzZXRTdGF0ZShzdGF0ZSwgYmVnaW5QYXJhbXMpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gImVycm9yIjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICJicmFja2V0IjsKICAgICAgfSBlbHNlIGlmIChjaCA9PSAneycgfHwgY2ggPT0gJ1snKSB7CiAgICAgICAgcGx1ZyA9IHBsdWdpbnNbIkRFRkFVTFQiXTsKICAgICAgICBwbHVnID0gbmV3IHBsdWcoKTsKICAgICAgICBwdXNoQ29tbWFuZChzdGF0ZSwgcGx1Zyk7CiAgICAgICAgcmV0dXJuICJicmFja2V0IjsKICAgICAgfSBlbHNlIGlmICgvXGQvLnRlc3QoY2gpKSB7CiAgICAgICAgc291cmNlLmVhdFdoaWxlKC9bXHcuJV0vKTsKICAgICAgICByZXR1cm4gImF0b20iOwogICAgICB9IGVsc2UgewogICAgICAgIHNvdXJjZS5lYXRXaGlsZSgvW1x3XC1fXS8pOwogICAgICAgIHBsdWcgPSBnZXRNb3N0UG93ZXJmdWwoc3RhdGUpOwogICAgICAgIGlmIChwbHVnLm5hbWUgPT0gJ2JlZ2luJykgewogICAgICAgICAgcGx1Zy5hcmd1bWVudCA9IHNvdXJjZS5jdXJyZW50KCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBwbHVnLnN0eWxlSWRlbnRpZmllcigpOwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gaW5NYXRoTW9kZShzb3VyY2UsIHN0YXRlLCBlbmRNb2RlU2VxKSB7CiAgICAgIGlmIChzb3VyY2UuZWF0U3BhY2UoKSkgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGlmIChzb3VyY2UubWF0Y2goZW5kTW9kZVNlcSkpIHsKICAgICAgICBzZXRTdGF0ZShzdGF0ZSwgbm9ybWFsKTsKICAgICAgICByZXR1cm4gImtleXdvcmQiOwogICAgICB9CiAgICAgIGlmIChzb3VyY2UubWF0Y2goL15cXFthLXpBLVpAXSsvKSkgewogICAgICAgIHJldHVybiAidGFnIjsKICAgICAgfQogICAgICBpZiAoc291cmNlLm1hdGNoKC9eW2EtekEtWl0rLykpIHsKICAgICAgICByZXR1cm4gInZhcmlhYmxlLTIiOwogICAgICB9CiAgICAgIC8vIGVzY2FwZSBjaGFyYWN0ZXJzCiAgICAgIGlmIChzb3VyY2UubWF0Y2goL15cXFskJiUje31fXS8pKSB7CiAgICAgICAgcmV0dXJuICJ0YWciOwogICAgICB9CiAgICAgIC8vIHdoaXRlIHNwYWNlIGNvbnRyb2wgY2hhcmFjdGVycwogICAgICBpZiAoc291cmNlLm1hdGNoKC9eXFxbLDshXC9dLykpIHsKICAgICAgICByZXR1cm4gInRhZyI7CiAgICAgIH0KICAgICAgLy8gc3BlY2lhbCBtYXRoLW1vZGUgY2hhcmFjdGVycwogICAgICBpZiAoc291cmNlLm1hdGNoKC9eW1xeXyZdLykpIHsKICAgICAgICByZXR1cm4gInRhZyI7CiAgICAgIH0KICAgICAgLy8gbm9uLXNwZWNpYWwgY2hhcmFjdGVycwogICAgICBpZiAoc291cmNlLm1hdGNoKC9eWytcLTw+fD0sXC9AISo6OyciYH4jP10vKSkgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIGlmIChzb3VyY2UubWF0Y2goL14oXGQrXC5cZCp8XGQqXC5cZCt8XGQrKS8pKSB7CiAgICAgICAgcmV0dXJuICJudW1iZXIiOwogICAgICB9CiAgICAgIHZhciBjaCA9IHNvdXJjZS5uZXh0KCk7CiAgICAgIGlmIChjaCA9PSAieyIgfHwgY2ggPT0gIn0iIHx8IGNoID09ICJbIiB8fCBjaCA9PSAiXSIgfHwgY2ggPT0gIigiIHx8IGNoID09ICIpIikgewogICAgICAgIHJldHVybiAiYnJhY2tldCI7CiAgICAgIH0KCiAgICAgIGlmIChjaCA9PSAiJSIpIHsKICAgICAgICBzb3VyY2Uuc2tpcFRvRW5kKCk7CiAgICAgICAgcmV0dXJuICJjb21tZW50IjsKICAgICAgfQogICAgICByZXR1cm4gImVycm9yIjsKICAgIH0KCiAgICBmdW5jdGlvbiBiZWdpblBhcmFtcyhzb3VyY2UsIHN0YXRlKSB7CiAgICAgIHZhciBjaCA9IHNvdXJjZS5wZWVrKCksIGxhc3RQbHVnOwogICAgICBpZiAoY2ggPT0gJ3snIHx8IGNoID09ICdbJykgewogICAgICAgIGxhc3RQbHVnID0gcGVla0NvbW1hbmQoc3RhdGUpOwogICAgICAgIGxhc3RQbHVnLm9wZW5CcmFja2V0KGNoKTsKICAgICAgICBzb3VyY2UuZWF0KGNoKTsKICAgICAgICBzZXRTdGF0ZShzdGF0ZSwgbm9ybWFsKTsKICAgICAgICByZXR1cm4gImJyYWNrZXQiOwogICAgICB9CiAgICAgIGlmICgvWyBcdFxyXS8udGVzdChjaCkpIHsKICAgICAgICBzb3VyY2UuZWF0KGNoKTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICBzZXRTdGF0ZShzdGF0ZSwgbm9ybWFsKTsKICAgICAgcG9wQ29tbWFuZChzdGF0ZSk7CgogICAgICByZXR1cm4gbm9ybWFsKHNvdXJjZSwgc3RhdGUpOwogICAgfQoKICAgIHJldHVybiB7CiAgICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICBjbWRTdGF0ZTogW10sCiAgICAgICAgICBmOiBub3JtYWwKICAgICAgICB9OwogICAgICB9LAogICAgICBjb3B5U3RhdGU6IGZ1bmN0aW9uKHMpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgY21kU3RhdGU6IHMuY21kU3RhdGUuc2xpY2UoKSwKICAgICAgICAgIGY6IHMuZgogICAgICAgIH07CiAgICAgIH0sCiAgICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgICAgcmV0dXJuIHN0YXRlLmYoc3RyZWFtLCBzdGF0ZSk7CiAgICAgIH0sCiAgICAgIGJsYW5rTGluZTogZnVuY3Rpb24oc3RhdGUpIHsKICAgICAgICBzdGF0ZS5mID0gbm9ybWFsOwogICAgICAgIHN0YXRlLmNtZFN0YXRlLmxlbmd0aCA9IDA7CiAgICAgIH0sCiAgICAgIGxpbmVDb21tZW50OiAiJSIKICAgIH07CiAgfSk7CgogIENvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC94LXN0ZXgiLCAic3RleCIpOwogIENvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC94LWxhdGV4IiwgInN0ZXgiKTsKCn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/stex/test.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24oKSB7CiAgdmFyIG1vZGUgPSBDb2RlTWlycm9yLmdldE1vZGUoe3RhYlNpemU6IDR9LCAic3RleCIpOwogIGZ1bmN0aW9uIE1UKG5hbWUpIHsgdGVzdC5tb2RlKG5hbWUsIG1vZGUsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpOyB9CgogIE1UKCJ3b3JkIiwKICAgICAiZm9vIik7CgogIE1UKCJ0d29Xb3JkcyIsCiAgICAgImZvbyBiYXIiKTsKCiAgTVQoImJlZ2luRW5kRG9jdW1lbnQiLAogICAgICJbdGFnIFxcYmVnaW5dW2JyYWNrZXQge11bYXRvbSBkb2N1bWVudF1bYnJhY2tldCB9XSIsCiAgICAgIlt0YWcgXFxlbmRdW2JyYWNrZXQge11bYXRvbSBkb2N1bWVudF1bYnJhY2tldCB9XSIpOwoKICBNVCgiYmVnaW5FbmRFcXVhdGlvbiIsCiAgICAgIlt0YWcgXFxiZWdpbl1bYnJhY2tldCB7XVthdG9tIGVxdWF0aW9uXVticmFja2V0IH1dIiwKICAgICAiICBFPW1jXjIiLAogICAgICJbdGFnIFxcZW5kXVticmFja2V0IHtdW2F0b20gZXF1YXRpb25dW2JyYWNrZXQgfV0iKTsKCiAgTVQoImJlZ2luTW9kdWxlIiwKICAgICAiW3RhZyBcXGJlZ2luXVticmFja2V0IHtdW2F0b20gbW9kdWxlXVticmFja2V0IH1bW11dXSIpOwoKICBNVCgiYmVnaW5Nb2R1bGVJZCIsCiAgICAgIlt0YWcgXFxiZWdpbl1bYnJhY2tldCB7XVthdG9tIG1vZHVsZV1bYnJhY2tldCB9W1tdaWQ9YmJ0LXNpemVbYnJhY2tldCBdXV0iKTsKCiAgTVQoImltcG9ydE1vZHVsZSIsCiAgICAgIlt0YWcgXFxpbXBvcnRtb2R1bGVdW2JyYWNrZXQgW1tdW3N0cmluZyBiLWItdF1bYnJhY2tldCBdXXtdW2J1aWx0aW4gYi1iLXRdW2JyYWNrZXQgfV0iKTsKCiAgTVQoImltcG9ydE1vZHVsZVBhdGgiLAogICAgICJbdGFnIFxcaW1wb3J0bW9kdWxlXVticmFja2V0IFtbXVt0YWcgXFxLV0FSQ3NsaWRlc11bYnJhY2tldCB7XVtzdHJpbmcgZG1hdGgvZW4vY2FyZGluYWxpdHldW2JyYWNrZXQgfV1de11bYnVpbHRpbiBjYXJkXVticmFja2V0IH1dIik7CgogIE1UKCJwc0ZvclBERiIsCiAgICAgIlt0YWcgXFxQU2ZvclBERl1bYnJhY2tldCBbW11bYXRvbSAxXVticmFja2V0IF1de10jMVticmFja2V0IH1dIik7CgogIE1UKCJjb21tZW50IiwKICAgICAiW2NvbW1lbnQgJSBmb29dIik7CgogIE1UKCJ0YWdDb21tZW50IiwKICAgICAiW3RhZyBcXGl0ZW1dW2NvbW1lbnQgJSBiYXJdIik7CgogIE1UKCJjb21tZW50VGFnIiwKICAgICAiIFtjb21tZW50ICUgXFxpdGVtXSIpOwoKICBNVCgiY29tbWVudExpbmVCcmVhayIsCiAgICAgIltjb21tZW50ICVdIiwKICAgICAiZm9vIik7CgogIE1UKCJ0YWdFcnJvckN1cmx5IiwKICAgICAiW3RhZyBcXGJlZ2luXVtlcnJvciB9XVticmFja2V0IHtdIik7CgogIE1UKCJ0YWdFcnJvclNxdWFyZSIsCiAgICAgIlt0YWcgXFxpdGVtXVtlcnJvciBdXV1bYnJhY2tldCB7XSIpOwoKICBNVCgiY29tbWVudEN1cmx5IiwKICAgICAiW2NvbW1lbnQgJSB9XSIpOwoKICBNVCgidGFnSGFzaCIsCiAgICAgInRoZSBbdGFnIFxcI10ga2V5Iik7CgogIE1UKCJ0YWdOdW1iZXIiLAogICAgICJhIFt0YWcgXFwkXVthdG9tIDVdIHN0ZXRzb24iKTsKCiAgTVQoInRhZ1BlcmNlbnQiLAogICAgICJbYXRvbSAxMDBdW3RhZyBcXCVdIGJlZWYiKTsKCiAgTVQoInRhZ0FtcGVyc2FuZCIsCiAgICAgIkwgW3RhZyBcXCZdIE4iKTsKCiAgTVQoInRhZ1VuZGVyc2NvcmUiLAogICAgICJmb29bdGFnIFxcX11iYXIiKTsKCiAgTVQoInRhZ0JyYWNrZXRPcGVuIiwKICAgICAiW3RhZyBcXGVtcGhdW2JyYWNrZXQge11bdGFnIFxce11bYnJhY2tldCB9XSIpOwoKICBNVCgidGFnQnJhY2tldENsb3NlIiwKICAgICAiW3RhZyBcXGVtcGhdW2JyYWNrZXQge11bdGFnIFxcfV1bYnJhY2tldCB9XSIpOwoKICBNVCgidGFnTGV0dGVyTnVtYmVyIiwKICAgICAic2VjdGlvbiBbdGFnIFxcU11bYXRvbSAxXSIpOwoKICBNVCgidGV4dFRhZ051bWJlciIsCiAgICAgInBhcmEgW3RhZyBcXFBdW2F0b20gMl0iKTsKCiAgTVQoInRoaW5zcGFjZSIsCiAgICAgInhbdGFnIFxcLF15Iik7CgogIE1UKCJ0aGlja3NwYWNlIiwKICAgICAieFt0YWcgXFw7XXkiKTsKCiAgTVQoIm5lZ2F0aXZlVGhpbnNwYWNlIiwKICAgICAieFt0YWcgXFwhXXkiKTsKCiAgTVQoInBlcmlvZE5vdFNlbnRlbmNlIiwKICAgICAiSi5cXCBMLlxcIGlzIik7CgogIE1UKCJwZXJpb2RTZW50ZW5jZSIsCiAgICAgIlhbdGFnIFxcQF0uIFRoZSIpOwoKICBNVCgiaXRhbGljQ29ycmVjdGlvbiIsCiAgICAgIlticmFja2V0IHtdW3RhZyBcXGVtXSBJZlt0YWcgXFwvXVticmFja2V0IH1dIEkiKTsKCiAgTVQoInRhZ0JyYWNrZXQiLAogICAgICJbdGFnIFxcbmV3Y29tbWFuZF1bYnJhY2tldCB7XVt0YWcgXFxwb3BdW2JyYWNrZXQgfV0iKTsKCiAgTVQoImlubGluZU1hdGhUYWdGb2xsb3dlZEJ5TnVtYmVyIiwKICAgICAiW2tleXdvcmQgJF1bdGFnIFxccGldW251bWJlciAyXVtrZXl3b3JkICRdIik7CgogIE1UKCJpbmxpbmVNYXRoIiwKICAgICAiW2tleXdvcmQgJF1bbnVtYmVyIDNdW3ZhcmlhYmxlLTIgeF1bdGFnIF5dW251bWJlciAyLjQ1XS1bdGFnIFxcc3FydF1bYnJhY2tldCB7XVt0YWcgXFwkXFxhbHBoYV1bYnJhY2tldCB9XSA9IFtudW1iZXIgMl1ba2V5d29yZCAkXSBvdGhlciB0ZXh0Iik7CgogIE1UKCJkaXNwbGF5TWF0aCIsCiAgICAgIk1vcmUgW2tleXdvcmQgJCRdXHRbdmFyaWFibGUtMiBTXVt0YWcgXl1bdmFyaWFibGUtMiBuXVt0YWcgXFxzdW1dIFt2YXJpYWJsZS0yIGldW2tleXdvcmQgJCRdIG90aGVyIHRleHQiKTsKCiAgTVQoIm1hdGhXaXRoQ29tbWVudCIsCiAgICAgIltrZXl3b3JkICRdW3ZhcmlhYmxlLTIgeF0gW2NvbW1lbnQgJSAkXSIsCiAgICAgIlt2YXJpYWJsZS0yIHldW2tleXdvcmQgJF0gb3RoZXIgdGV4dCIpOwoKICBNVCgibGluZUJyZWFrQXJndW1lbnQiLAogICAgIlt0YWcgXFxcXF1bYnJhY2tldCBbW11bYXRvbSAxY21dW2JyYWNrZXQgXV1dIik7Cn0pKCk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/stylus/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/stylus/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogU3R5bHVzIG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vYWRkb24vaGludC9zaG93LWhpbnQuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9InN0eWx1cy5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi8uLi9hZGRvbi9oaW50L3Nob3ctaGludC5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi8uLi9hZGRvbi9oaW50L2Nzcy1oaW50LmpzIj48L3NjcmlwdD4KPHN0eWxlPi5Db2RlTWlycm9yIHtiYWNrZ3JvdW5kOiAjZjhmOGY4O30gZm9ybXttYXJnaW4tYm90dG9tOiAuN2VtO308L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxoMT5Db2RlTWlycm9yPC9oMT48aW1nIGlkPWxvZ28gc3JjPSIuLi8uLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5MYW5ndWFnZSBtb2RlczwvYT4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+U3R5bHVzPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5TdHlsdXMgbW9kZTwvaDI+Cjxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+Ci8qIFN0eWx1cyBtb2RlICovCgojaWQsCi5jbGFzcywKYXJ0aWNsZQogIGZvbnQtZmFtaWx5IEFyaWFsLCBzYW5zLXNlcmlmCgojaWQsCi5jbGFzcywKYXJ0aWNsZSB7CiAgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOwp9CgovLyBWYXJpYWJsZXMKZm9udC1zaXplLWJhc2UgPSAxNnB4CmxpbmUtaGVpZ2h0LWJhc2UgPSAxLjUKZm9udC1mYW1pbHktYmFzZSA9ICJIZWx2ZXRpY2EgTmV1ZSIsIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWYKdGV4dC1jb2xvciA9IGxpZ2h0ZW4oIzAwMCwgMjAlKQoKYm9keQogIGZvbnQgZm9udC1zaXplLWJhc2UvbGluZS1oZWlnaHQtYmFzZSBmb250LWZhbWlseS1iYXNlCiAgY29sb3IgdGV4dC1jb2xvcgoKYm9keSB7CiAgZm9udDogNDAwIDE2cHgvMS41ICJIZWx2ZXRpY2EgTmV1ZSIsIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWY7CiAgY29sb3I6ICMzMzM7Cn0KCi8vIFZhcmlhYmxlcwpsaW5rLWNvbG9yID0gZGFya2VuKCM0MjhiY2EsIDYuNSUpCmxpbmstaG92ZXItY29sb3IgPSBkYXJrZW4obGluay1jb2xvciwgMTUlKQpsaW5rLWRlY29yYXRpb24gPSBub25lCmxpbmstaG92ZXItZGVjb3JhdGlvbiA9IGZhbHNlCgovLyBNaXhpbgp0YWItZm9jdXMoKQogIG91dGxpbmUgdGhpbiBkb3R0ZWQKICBvdXRsaW5lIDVweCBhdXRvIC13ZWJraXQtZm9jdXMtcmluZy1jb2xvcgogIG91dGxpbmUtb2Zmc2V0IC0ycHgKCmEKICBjb2xvciBsaW5rLWNvbG9yCiAgaWYgbGluay1kZWNvcmF0aW9uCiAgICB0ZXh0LWRlY29yYXRpb24gbGluay1kZWNvcmF0aW9uCiAgJjpob3ZlcgogICY6Zm9jdXMKICAgIGNvbG9yIGxpbmstaG92ZXItY29sb3IKICAgIGlmIGxpbmstaG92ZXItZGVjb3JhdGlvbgogICAgICB0ZXh0LWRlY29yYXRpb24gbGluay1ob3Zlci1kZWNvcmF0aW9uCiAgJjpmb2N1cwogICAgdGFiLWZvY3VzKCkKCmEgewogIGNvbG9yOiAjMzc4MmM0OwogIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKfQphOmhvdmVyLAphOmZvY3VzIHsKICBjb2xvcjogIzJmNmVhNzsKfQphOmZvY3VzIHsKICBvdXRsaW5lOiB0aGluIGRvdHRlZDsKICBvdXRsaW5lOiA1cHggYXV0byAtd2Via2l0LWZvY3VzLXJpbmctY29sb3I7CiAgb3V0bGluZS1vZmZzZXQ6IC0ycHg7Cn0KPC90ZXh0YXJlYT4KPC9mb3JtPgo8c2NyaXB0PgogIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICBleHRyYUtleXM6IHsiQ3RybC1TcGFjZSI6ICJhdXRvY29tcGxldGUifSwKICAgIHRhYlNpemU6IDIKICB9KTsKPC9zY3JpcHQ+Cgo8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC94LXN0eWw8L2NvZGU+LjwvcD4KPHA+Q3JlYXRlZCBieSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vZG1pdHJ5a2lzZWx5b3YiPkRtaXRyeSBLaXNlbHlvdjwvYT48L3A+CjwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/stylus/stylus.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovLyBTdHlsdXMgbW9kZSBjcmVhdGVkIGJ5IERtaXRyeSBLaXNlbHlvdiBodHRwOi8vZ2l0LmlvL0FhUkIKCihmdW5jdGlvbihtb2QpIHsKICBpZiAodHlwZW9mIGV4cG9ydHMgPT0gIm9iamVjdCIgJiYgdHlwZW9mIG1vZHVsZSA9PSAib2JqZWN0IikgLy8gQ29tbW9uSlMKICAgIG1vZChyZXF1aXJlKCIuLi8uLi9saWIvY29kZW1pcnJvciIpKTsKICBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCkgLy8gQU1ECiAgICBkZWZpbmUoWyIuLi8uLi9saWIvY29kZW1pcnJvciJdLCBtb2QpOwogIGVsc2UgLy8gUGxhaW4gYnJvd3NlciBlbnYKICAgIG1vZChDb2RlTWlycm9yKTsKfSkoZnVuY3Rpb24oQ29kZU1pcnJvcikgewogICJ1c2Ugc3RyaWN0IjsKCiAgQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJzdHlsdXMiLCBmdW5jdGlvbihjb25maWcpIHsKICAgIHZhciBpbmRlbnRVbml0ID0gY29uZmlnLmluZGVudFVuaXQsCiAgICAgICAgdGFnS2V5d29yZHMgPSBrZXlTZXQodGFnS2V5d29yZHNfKSwKICAgICAgICB0YWdWYXJpYWJsZXNSZWdleHAgPSAvXihhfGJ8aXxzfGNvbHxlbSkkL2ksCiAgICAgICAgcHJvcGVydHlLZXl3b3JkcyA9IGtleVNldChwcm9wZXJ0eUtleXdvcmRzXyksCiAgICAgICAgbm9uU3RhbmRhcmRQcm9wZXJ0eUtleXdvcmRzID0ga2V5U2V0KG5vblN0YW5kYXJkUHJvcGVydHlLZXl3b3Jkc18pLAogICAgICAgIHZhbHVlS2V5d29yZHMgPSBrZXlTZXQodmFsdWVLZXl3b3Jkc18pLAogICAgICAgIGNvbG9yS2V5d29yZHMgPSBrZXlTZXQoY29sb3JLZXl3b3Jkc18pLAogICAgICAgIGRvY3VtZW50VHlwZXMgPSBrZXlTZXQoZG9jdW1lbnRUeXBlc18pLAogICAgICAgIGRvY3VtZW50VHlwZXNSZWdleHAgPSB3b3JkUmVnZXhwKGRvY3VtZW50VHlwZXNfKSwKICAgICAgICBtZWRpYUZlYXR1cmVzID0ga2V5U2V0KG1lZGlhRmVhdHVyZXNfKSwKICAgICAgICBtZWRpYVR5cGVzID0ga2V5U2V0KG1lZGlhVHlwZXNfKSwKICAgICAgICBmb250UHJvcGVydGllcyA9IGtleVNldChmb250UHJvcGVydGllc18pLAogICAgICAgIG9wZXJhdG9yc1JlZ2V4cCA9IC9eXHMqKFsuXXsyLDN9fCYmfFx8XHx8XCpcKnxbPyE9Ol0/PXxbLSsqXC8lPD5dPT98XD86fFx+KS8sCiAgICAgICAgd29yZE9wZXJhdG9yS2V5d29yZHNSZWdleHAgPSB3b3JkUmVnZXhwKHdvcmRPcGVyYXRvcktleXdvcmRzXyksCiAgICAgICAgYmxvY2tLZXl3b3JkcyA9IGtleVNldChibG9ja0tleXdvcmRzXyksCiAgICAgICAgdmVuZG9yUHJlZml4ZXNSZWdleHAgPSBuZXcgUmVnRXhwKC9eXC0obW96fG1zfG98d2Via2l0KS0vaSksCiAgICAgICAgY29tbW9uQXRvbXMgPSBrZXlTZXQoY29tbW9uQXRvbXNfKSwKICAgICAgICBmaXJzdFdvcmRNYXRjaCA9ICIiLAogICAgICAgIHN0YXRlcyA9IHt9LAogICAgICAgIGNoLAogICAgICAgIHN0eWxlLAogICAgICAgIHR5cGUsCiAgICAgICAgb3ZlcnJpZGU7CgogICAgLyoqCiAgICAgKiBUb2tlbml6ZXJzCiAgICAgKi8KICAgIGZ1bmN0aW9uIHRva2VuQmFzZShzdHJlYW0sIHN0YXRlKSB7CiAgICAgIGZpcnN0V29yZE1hdGNoID0gc3RyZWFtLnN0cmluZy5tYXRjaCgvKF5bXHctXStccyo9XHMqJCl8KF5ccypbXHctXStccyo9XHMqW1x3LV0pfCheXHMqKFwufCN8QHxcJHxcJnxcW3xcZHxcK3w6Oj98XHt8XD58fnxcLyk/XHMqW1x3LV0qKFthLXowLTktXXxcKnxcL1wqKShcKHwsKT8pLyk7CiAgICAgIHN0YXRlLmNvbnRleHQubGluZS5maXJzdFdvcmQgPSBmaXJzdFdvcmRNYXRjaCA/IGZpcnN0V29yZE1hdGNoWzBdLnJlcGxhY2UoL15ccyovLCAiIikgOiAiIjsKICAgICAgc3RhdGUuY29udGV4dC5saW5lLmluZGVudCA9IHN0cmVhbS5pbmRlbnRhdGlvbigpOwogICAgICBjaCA9IHN0cmVhbS5wZWVrKCk7CgogICAgICAvLyBMaW5lIGNvbW1lbnQKICAgICAgaWYgKHN0cmVhbS5tYXRjaCgiLy8iKSkgewogICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgICByZXR1cm4gWyJjb21tZW50IiwgImNvbW1lbnQiXTsKICAgICAgfQogICAgICAvLyBCbG9jayBjb21tZW50CiAgICAgIGlmIChzdHJlYW0ubWF0Y2goIi8qIikpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQ0NvbW1lbnQ7CiAgICAgICAgcmV0dXJuIHRva2VuQ0NvbW1lbnQoc3RyZWFtLCBzdGF0ZSk7CiAgICAgIH0KICAgICAgLy8gU3RyaW5nCiAgICAgIGlmIChjaCA9PSAiXCIiIHx8IGNoID09ICInIikgewogICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlblN0cmluZyhjaCk7CiAgICAgICAgcmV0dXJuIHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgICB9CiAgICAgIC8vIERlZgogICAgICBpZiAoY2ggPT0gIkAiKSB7CiAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcd1xcLV0vKTsKICAgICAgICByZXR1cm4gWyJkZWYiLCBzdHJlYW0uY3VycmVudCgpXTsKICAgICAgfQogICAgICAvLyBJRCBzZWxlY3RvciBvciBIZXggY29sb3IKICAgICAgaWYgKGNoID09ICIjIikgewogICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgLy8gSGV4IGNvbG9yCiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXlswLTlhLWZdezZ9fFswLTlhLWZdezN9L2kpKSB7CiAgICAgICAgICByZXR1cm4gWyJhdG9tIiwgImF0b20iXTsKICAgICAgICB9CiAgICAgICAgLy8gSUQgc2VsZWN0b3IKICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eW2Etel1bXHctXSovaSkpIHsKICAgICAgICAgIHJldHVybiBbImJ1aWx0aW4iLCAiaGFzaCJdOwogICAgICAgIH0KICAgICAgfQogICAgICAvLyBWZW5kb3IgcHJlZml4ZXMKICAgICAgaWYgKHN0cmVhbS5tYXRjaCh2ZW5kb3JQcmVmaXhlc1JlZ2V4cCkpIHsKICAgICAgICByZXR1cm4gWyJtZXRhIiwgInZlbmRvci1wcmVmaXhlcyJdOwogICAgICB9CiAgICAgIC8vIE51bWJlcnMKICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXi0/WzAtOV0/XC4/WzAtOV0vKSkgewogICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW2EteiVdL2kpOwogICAgICAgIHJldHVybiBbIm51bWJlciIsICJ1bml0Il07CiAgICAgIH0KICAgICAgLy8gIWltcG9ydGFudHxvcHRpb25hbAogICAgICBpZiAoY2ggPT0gIiEiKSB7CiAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgICByZXR1cm4gW3N0cmVhbS5tYXRjaCgvXihpbXBvcnRhbnR8b3B0aW9uYWwpL2kpID8gImtleXdvcmQiOiAib3BlcmF0b3IiLCAiaW1wb3J0YW50Il07CiAgICAgIH0KICAgICAgLy8gQ2xhc3MKICAgICAgaWYgKGNoID09ICIuIiAmJiBzdHJlYW0ubWF0Y2goL15cLlthLXpdW1x3LV0qL2kpKSB7CiAgICAgICAgcmV0dXJuIFsicXVhbGlmaWVyIiwgInF1YWxpZmllciJdOwogICAgICB9CiAgICAgIC8vIHVybCB1cmwtcHJlZml4IGRvbWFpbiByZWdleHAKICAgICAgaWYgKHN0cmVhbS5tYXRjaChkb2N1bWVudFR5cGVzUmVnZXhwKSkgewogICAgICAgIGlmIChzdHJlYW0ucGVlaygpID09ICIoIikgc3RhdGUudG9rZW5pemUgPSB0b2tlblBhcmVudGhlc2l6ZWQ7CiAgICAgICAgcmV0dXJuIFsicHJvcGVydHkiLCAid29yZCJdOwogICAgICB9CiAgICAgIC8vIE1peGlucyAvIEZ1bmN0aW9ucwogICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eW2Etel1bXHctXSpcKC9pKSkgewogICAgICAgIHN0cmVhbS5iYWNrVXAoMSk7CiAgICAgICAgcmV0dXJuIFsia2V5d29yZCIsICJtaXhpbiJdOwogICAgICB9CiAgICAgIC8vIEJsb2NrIG1peGlucwogICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eKFwrfC0pW2Etel1bXHctXSpcKC9pKSkgewogICAgICAgIHN0cmVhbS5iYWNrVXAoMSk7CiAgICAgICAgcmV0dXJuIFsia2V5d29yZCIsICJibG9jay1taXhpbiJdOwogICAgICB9CiAgICAgIC8vIFBhcmVudCBSZWZlcmVuY2UgQkVNIG5hbWluZwogICAgICBpZiAoc3RyZWFtLnN0cmluZy5tYXRjaCgvXlxzKiYvKSAmJiBzdHJlYW0ubWF0Y2goL15bLV9dK1thLXpdW1x3LV0qLykpIHsKICAgICAgICByZXR1cm4gWyJxdWFsaWZpZXIiLCAicXVhbGlmaWVyIl07CiAgICAgIH0KICAgICAgLy8gLyBSb290IFJlZmVyZW5jZSAmIFBhcmVudCBSZWZlcmVuY2UKICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXihcL3wmKSgtfF98OnxcLnwjfFthLXpdKS8pKSB7CiAgICAgICAgc3RyZWFtLmJhY2tVcCgxKTsKICAgICAgICByZXR1cm4gWyJ2YXJpYWJsZS0zIiwgInJlZmVyZW5jZSJdOwogICAgICB9CiAgICAgIGlmIChzdHJlYW0ubWF0Y2goL14mezF9XHMqJC8pKSB7CiAgICAgICAgcmV0dXJuIFsidmFyaWFibGUtMyIsICJyZWZlcmVuY2UiXTsKICAgICAgfQogICAgICAvLyBXb3JkIG9wZXJhdG9yCiAgICAgIGlmIChzdHJlYW0ubWF0Y2god29yZE9wZXJhdG9yS2V5d29yZHNSZWdleHApKSB7CiAgICAgICAgcmV0dXJuIFsib3BlcmF0b3IiLCAib3BlcmF0b3IiXTsKICAgICAgfQogICAgICAvLyBXb3JkCiAgICAgIGlmIChzdHJlYW0ubWF0Y2goL15cJD9bLV9dKlthLXowLTldK1tcdy1dKi9pKSkgewogICAgICAgIC8vIFZhcmlhYmxlCiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXihcLnxcWylbXHctXCdcIlxdXSsvaSwgZmFsc2UpKSB7CiAgICAgICAgICBpZiAoIXdvcmRJc1RhZyhzdHJlYW0uY3VycmVudCgpKSkgewogICAgICAgICAgICBzdHJlYW0ubWF0Y2goL1wuLyk7CiAgICAgICAgICAgIHJldHVybiBbInZhcmlhYmxlLTIiLCAidmFyaWFibGUtbmFtZSJdOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gWyJ2YXJpYWJsZS0yIiwgIndvcmQiXTsKICAgICAgfQogICAgICAvLyBPcGVyYXRvcnMKICAgICAgaWYgKHN0cmVhbS5tYXRjaChvcGVyYXRvcnNSZWdleHApKSB7CiAgICAgICAgcmV0dXJuIFsib3BlcmF0b3IiLCBzdHJlYW0uY3VycmVudCgpXTsKICAgICAgfQogICAgICAvLyBEZWxpbWl0ZXJzCiAgICAgIGlmICgvWzo7LHt9XFtcXVwoXCldLy50ZXN0KGNoKSkgewogICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgcmV0dXJuIFtudWxsLCBjaF07CiAgICAgIH0KICAgICAgLy8gTm9uLWRldGVjdGVkIGl0ZW1zCiAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgIHJldHVybiBbbnVsbCwgbnVsbF07CiAgICB9CgogICAgLyoqCiAgICAgKiBUb2tlbiBjb21tZW50CiAgICAgKi8KICAgIGZ1bmN0aW9uIHRva2VuQ0NvbW1lbnQoc3RyZWFtLCBzdGF0ZSkgewogICAgICB2YXIgbWF5YmVFbmQgPSBmYWxzZSwgY2g7CiAgICAgIHdoaWxlICgoY2ggPSBzdHJlYW0ubmV4dCgpKSAhPSBudWxsKSB7CiAgICAgICAgaWYgKG1heWJlRW5kICYmIGNoID09ICIvIikgewogICAgICAgICAgc3RhdGUudG9rZW5pemUgPSBudWxsOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIG1heWJlRW5kID0gKGNoID09ICIqIik7CiAgICAgIH0KICAgICAgcmV0dXJuIFsiY29tbWVudCIsICJjb21tZW50Il07CiAgICB9CgogICAgLyoqCiAgICAgKiBUb2tlbiBzdHJpbmcKICAgICAqLwogICAgZnVuY3Rpb24gdG9rZW5TdHJpbmcocXVvdGUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgICB2YXIgZXNjYXBlZCA9IGZhbHNlLCBjaDsKICAgICAgICB3aGlsZSAoKGNoID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkgewogICAgICAgICAgaWYgKGNoID09IHF1b3RlICYmICFlc2NhcGVkKSB7CiAgICAgICAgICAgIGlmIChxdW90ZSA9PSAiKSIpIHN0cmVhbS5iYWNrVXAoMSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgZXNjYXBlZCA9ICFlc2NhcGVkICYmIGNoID09ICJcXCI7CiAgICAgICAgfQogICAgICAgIGlmIChjaCA9PSBxdW90ZSB8fCAhZXNjYXBlZCAmJiBxdW90ZSAhPSAiKSIpIHN0YXRlLnRva2VuaXplID0gbnVsbDsKICAgICAgICByZXR1cm4gWyJzdHJpbmciLCAic3RyaW5nIl07CiAgICAgIH07CiAgICB9CgogICAgLyoqCiAgICAgKiBUb2tlbiBwYXJlbnRoZXNpemVkCiAgICAgKi8KICAgIGZ1bmN0aW9uIHRva2VuUGFyZW50aGVzaXplZChzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHN0cmVhbS5uZXh0KCk7IC8vIE11c3QgYmUgIigiCiAgICAgIGlmICghc3RyZWFtLm1hdGNoKC9ccypbXCJcJyldLywgZmFsc2UpKQogICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5TdHJpbmcoIikiKTsKICAgICAgZWxzZQogICAgICAgIHN0YXRlLnRva2VuaXplID0gbnVsbDsKICAgICAgcmV0dXJuIFtudWxsLCAiKCJdOwogICAgfQoKICAgIC8qKgogICAgICogQ29udGV4dCBtYW5hZ2VtZW50CiAgICAgKi8KICAgIGZ1bmN0aW9uIENvbnRleHQodHlwZSwgaW5kZW50LCBwcmV2LCBsaW5lKSB7CiAgICAgIHRoaXMudHlwZSA9IHR5cGU7CiAgICAgIHRoaXMuaW5kZW50ID0gaW5kZW50OwogICAgICB0aGlzLnByZXYgPSBwcmV2OwogICAgICB0aGlzLmxpbmUgPSBsaW5lIHx8IHtmaXJzdFdvcmQ6ICIiLCBpbmRlbnQ6IDB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0sIHR5cGUsIGluZGVudCkgewogICAgICBpbmRlbnQgPSBpbmRlbnQgPj0gMCA/IGluZGVudCA6IGluZGVudFVuaXQ7CiAgICAgIHN0YXRlLmNvbnRleHQgPSBuZXcgQ29udGV4dCh0eXBlLCBzdHJlYW0uaW5kZW50YXRpb24oKSArIGluZGVudCwgc3RhdGUuY29udGV4dCk7CiAgICAgIHJldHVybiB0eXBlOwogICAgfQoKICAgIGZ1bmN0aW9uIHBvcENvbnRleHQoc3RhdGUsIGN1cnJlbnRJbmRlbnQpIHsKICAgICAgdmFyIGNvbnRleHRJbmRlbnQgPSBzdGF0ZS5jb250ZXh0LmluZGVudCAtIGluZGVudFVuaXQ7CiAgICAgIGN1cnJlbnRJbmRlbnQgPSBjdXJyZW50SW5kZW50IHx8IGZhbHNlOwogICAgICBzdGF0ZS5jb250ZXh0ID0gc3RhdGUuY29udGV4dC5wcmV2OwogICAgICBpZiAoY3VycmVudEluZGVudCkgc3RhdGUuY29udGV4dC5pbmRlbnQgPSBjb250ZXh0SW5kZW50OwogICAgICByZXR1cm4gc3RhdGUuY29udGV4dC50eXBlOwogICAgfQoKICAgIGZ1bmN0aW9uIHBhc3ModHlwZSwgc3RyZWFtLCBzdGF0ZSkgewogICAgICByZXR1cm4gc3RhdGVzW3N0YXRlLmNvbnRleHQudHlwZV0odHlwZSwgc3RyZWFtLCBzdGF0ZSk7CiAgICB9CgogICAgZnVuY3Rpb24gcG9wQW5kUGFzcyh0eXBlLCBzdHJlYW0sIHN0YXRlLCBuKSB7CiAgICAgIGZvciAodmFyIGkgPSBuIHx8IDE7IGkgPiAwOyBpLS0pCiAgICAgICAgc3RhdGUuY29udGV4dCA9IHN0YXRlLmNvbnRleHQucHJldjsKICAgICAgcmV0dXJuIHBhc3ModHlwZSwgc3RyZWFtLCBzdGF0ZSk7CiAgICB9CgoKICAgIC8qKgogICAgICogUGFyc2VyCiAgICAgKi8KICAgIGZ1bmN0aW9uIHdvcmRJc1RhZyh3b3JkKSB7CiAgICAgIHJldHVybiB3b3JkLnRvTG93ZXJDYXNlKCkgaW4gdGFnS2V5d29yZHM7CiAgICB9CgogICAgZnVuY3Rpb24gd29yZElzUHJvcGVydHkod29yZCkgewogICAgICB3b3JkID0gd29yZC50b0xvd2VyQ2FzZSgpOwogICAgICByZXR1cm4gd29yZCBpbiBwcm9wZXJ0eUtleXdvcmRzIHx8IHdvcmQgaW4gZm9udFByb3BlcnRpZXM7CiAgICB9CgogICAgZnVuY3Rpb24gd29yZElzQmxvY2sod29yZCkgewogICAgICByZXR1cm4gd29yZC50b0xvd2VyQ2FzZSgpIGluIGJsb2NrS2V5d29yZHM7CiAgICB9CgogICAgZnVuY3Rpb24gd29yZElzVmVuZG9yUHJlZml4KHdvcmQpIHsKICAgICAgcmV0dXJuIHdvcmQudG9Mb3dlckNhc2UoKS5tYXRjaCh2ZW5kb3JQcmVmaXhlc1JlZ2V4cCk7CiAgICB9CgogICAgZnVuY3Rpb24gd29yZEFzVmFsdWUod29yZCkgewogICAgICB2YXIgd29yZExDID0gd29yZC50b0xvd2VyQ2FzZSgpOwogICAgICB2YXIgb3ZlcnJpZGUgPSAidmFyaWFibGUtMiI7CiAgICAgIGlmICh3b3JkSXNUYWcod29yZCkpIG92ZXJyaWRlID0gInRhZyI7CiAgICAgIGVsc2UgaWYgKHdvcmRJc0Jsb2NrKHdvcmQpKSBvdmVycmlkZSA9ICJibG9jay1rZXl3b3JkIjsKICAgICAgZWxzZSBpZiAod29yZElzUHJvcGVydHkod29yZCkpIG92ZXJyaWRlID0gInByb3BlcnR5IjsKICAgICAgZWxzZSBpZiAod29yZExDIGluIHZhbHVlS2V5d29yZHMgfHwgd29yZExDIGluIGNvbW1vbkF0b21zKSBvdmVycmlkZSA9ICJhdG9tIjsKICAgICAgZWxzZSBpZiAod29yZExDID09ICJyZXR1cm4iIHx8IHdvcmRMQyBpbiBjb2xvcktleXdvcmRzKSBvdmVycmlkZSA9ICJrZXl3b3JkIjsKCiAgICAgIC8vIEZvbnQgZmFtaWx5CiAgICAgIGVsc2UgaWYgKHdvcmQubWF0Y2goL15bQS1aXS8pKSBvdmVycmlkZSA9ICJzdHJpbmciOwogICAgICByZXR1cm4gb3ZlcnJpZGU7CiAgICB9CgogICAgZnVuY3Rpb24gdHlwZUlzQmxvY2sodHlwZSwgc3RyZWFtKSB7CiAgICAgIHJldHVybiAoKGVuZE9mTGluZShzdHJlYW0pICYmICh0eXBlID09ICJ7IiB8fCB0eXBlID09ICJdIiB8fCB0eXBlID09ICJoYXNoIiB8fCB0eXBlID09ICJxdWFsaWZpZXIiKSkgfHwgdHlwZSA9PSAiYmxvY2stbWl4aW4iKTsKICAgIH0KCiAgICBmdW5jdGlvbiB0eXBlSXNJbnRlcnBvbGF0aW9uKHR5cGUsIHN0cmVhbSkgewogICAgICByZXR1cm4gdHlwZSA9PSAieyIgJiYgc3RyZWFtLm1hdGNoKC9eXHMqXCQ/W1x3LV0rL2ksIGZhbHNlKTsKICAgIH0KCiAgICBmdW5jdGlvbiB0eXBlSXNQc2V1ZG8odHlwZSwgc3RyZWFtKSB7CiAgICAgIHJldHVybiB0eXBlID09ICI6IiAmJiBzdHJlYW0ubWF0Y2goL15bYS16LV0rLywgZmFsc2UpOwogICAgfQoKICAgIGZ1bmN0aW9uIHN0YXJ0T2ZMaW5lKHN0cmVhbSkgewogICAgICByZXR1cm4gc3RyZWFtLnNvbCgpIHx8IHN0cmVhbS5zdHJpbmcubWF0Y2gobmV3IFJlZ0V4cCgiXlxccyoiICsgZXNjYXBlUmVnRXhwKHN0cmVhbS5jdXJyZW50KCkpKSk7CiAgICB9CgogICAgZnVuY3Rpb24gZW5kT2ZMaW5lKHN0cmVhbSkgewogICAgICByZXR1cm4gc3RyZWFtLmVvbCgpIHx8IHN0cmVhbS5tYXRjaCgvXlxzKiQvLCBmYWxzZSk7CiAgICB9CgogICAgZnVuY3Rpb24gZmlyc3RXb3JkT2ZMaW5lKGxpbmUpIHsKICAgICAgdmFyIHJlID0gL15ccypbLV9dKlthLXowLTldK1tcdy1dKi9pOwogICAgICB2YXIgcmVzdWx0ID0gdHlwZW9mIGxpbmUgPT0gInN0cmluZyIgPyBsaW5lLm1hdGNoKHJlKSA6IGxpbmUuc3RyaW5nLm1hdGNoKHJlKTsKICAgICAgcmV0dXJuIHJlc3VsdCA/IHJlc3VsdFswXS5yZXBsYWNlKC9eXHMqLywgIiIpIDogIiI7CiAgICB9CgoKICAgIC8qKgogICAgICogQmxvY2sKICAgICAqLwogICAgc3RhdGVzLmJsb2NrID0gZnVuY3Rpb24odHlwZSwgc3RyZWFtLCBzdGF0ZSkgewogICAgICBpZiAoKHR5cGUgPT0gImNvbW1lbnQiICYmIHN0YXJ0T2ZMaW5lKHN0cmVhbSkpIHx8CiAgICAgICAgICAodHlwZSA9PSAiLCIgJiYgZW5kT2ZMaW5lKHN0cmVhbSkpIHx8CiAgICAgICAgICB0eXBlID09ICJtaXhpbiIpIHsKICAgICAgICByZXR1cm4gcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbSwgImJsb2NrIiwgMCk7CiAgICAgIH0KICAgICAgaWYgKHR5cGVJc0ludGVycG9sYXRpb24odHlwZSwgc3RyZWFtKSkgewogICAgICAgIHJldHVybiBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLCAiaW50ZXJwb2xhdGlvbiIpOwogICAgICB9CiAgICAgIGlmIChlbmRPZkxpbmUoc3RyZWFtKSAmJiB0eXBlID09ICJdIikgewogICAgICAgIGlmICghL15ccyooXC58I3w6fFxbfFwqfCYpLy50ZXN0KHN0cmVhbS5zdHJpbmcpICYmICF3b3JkSXNUYWcoZmlyc3RXb3JkT2ZMaW5lKHN0cmVhbSkpKSB7CiAgICAgICAgICByZXR1cm4gcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbSwgImJsb2NrIiwgMCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICh0eXBlSXNCbG9jayh0eXBlLCBzdHJlYW0sIHN0YXRlKSkgewogICAgICAgIHJldHVybiBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLCAiYmxvY2siKTsKICAgICAgfQogICAgICBpZiAodHlwZSA9PSAifSIgJiYgZW5kT2ZMaW5lKHN0cmVhbSkpIHsKICAgICAgICByZXR1cm4gcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbSwgImJsb2NrIiwgMCk7CiAgICAgIH0KICAgICAgaWYgKHR5cGUgPT0gInZhcmlhYmxlLW5hbWUiKSB7CiAgICAgICAgaWYgKHN0cmVhbS5zdHJpbmcubWF0Y2goL15ccz9cJFtcdy1cLlxbXF1cJ1wiXSskLykgfHwgd29yZElzQmxvY2soZmlyc3RXb3JkT2ZMaW5lKHN0cmVhbSkpKSB7CiAgICAgICAgICByZXR1cm4gcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbSwgInZhcmlhYmxlTmFtZSIpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgIHJldHVybiBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLCAidmFyaWFibGVOYW1lIiwgMCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICh0eXBlID09ICI9IikgewogICAgICAgIGlmICghZW5kT2ZMaW5lKHN0cmVhbSkgJiYgIXdvcmRJc0Jsb2NrKGZpcnN0V29yZE9mTGluZShzdHJlYW0pKSkgewogICAgICAgICAgcmV0dXJuIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0sICJibG9jayIsIDApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbSwgImJsb2NrIik7CiAgICAgIH0KICAgICAgaWYgKHR5cGUgPT0gIioiKSB7CiAgICAgICAgaWYgKGVuZE9mTGluZShzdHJlYW0pIHx8IHN0cmVhbS5tYXRjaCgvXHMqKCx8XC58I3xcW3w6fHspLyxmYWxzZSkpIHsKICAgICAgICAgIG92ZXJyaWRlID0gInRhZyI7CiAgICAgICAgICByZXR1cm4gcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbSwgImJsb2NrIik7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICh0eXBlSXNQc2V1ZG8odHlwZSwgc3RyZWFtKSkgewogICAgICAgIHJldHVybiBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLCAicHNldWRvIik7CiAgICAgIH0KICAgICAgaWYgKC9AKGZvbnQtZmFjZXxtZWRpYXxzdXBwb3J0c3woLW1vei0pP2RvY3VtZW50KS8udGVzdCh0eXBlKSkgewogICAgICAgIHJldHVybiBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLCBlbmRPZkxpbmUoc3RyZWFtKSA/ICJibG9jayIgOiAiYXRCbG9jayIpOwogICAgICB9CiAgICAgIGlmICgvQCgtKG1venxtc3xvfHdlYmtpdCktKT9rZXlmcmFtZXMkLy50ZXN0KHR5cGUpKSB7CiAgICAgICAgcmV0dXJuIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0sICJrZXlmcmFtZXMiKTsKICAgICAgfQogICAgICBpZiAoL0BleHRlbmRzPy8udGVzdCh0eXBlKSkgewogICAgICAgIHJldHVybiBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLCAiZXh0ZW5kIiwgMCk7CiAgICAgIH0KICAgICAgaWYgKHR5cGUgJiYgdHlwZS5jaGFyQXQoMCkgPT0gIkAiKSB7CgogICAgICAgIC8vIFByb3BlcnR5IExvb2t1cAogICAgICAgIGlmIChzdHJlYW0uaW5kZW50YXRpb24oKSA+IDAgJiYgd29yZElzUHJvcGVydHkoc3RyZWFtLmN1cnJlbnQoKS5zbGljZSgxKSkpIHsKICAgICAgICAgIG92ZXJyaWRlID0gInZhcmlhYmxlLTIiOwogICAgICAgICAgcmV0dXJuICJibG9jayI7CiAgICAgICAgfQogICAgICAgIGlmICgvKEBpbXBvcnR8QHJlcXVpcmV8QGNoYXJzZXQpLy50ZXN0KHR5cGUpKSB7CiAgICAgICAgICByZXR1cm4gcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbSwgImJsb2NrIiwgMCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLCAiYmxvY2siKTsKICAgICAgfQogICAgICBpZiAodHlwZSA9PSAicmVmZXJlbmNlIiAmJiBlbmRPZkxpbmUoc3RyZWFtKSkgewogICAgICAgIHJldHVybiBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLCAiYmxvY2siKTsKICAgICAgfQogICAgICBpZiAodHlwZSA9PSAiKCIpIHsKICAgICAgICByZXR1cm4gcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbSwgInBhcmVucyIpOwogICAgICB9CgogICAgICBpZiAodHlwZSA9PSAidmVuZG9yLXByZWZpeGVzIikgewogICAgICAgIHJldHVybiBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLCAidmVuZG9yUHJlZml4ZXMiKTsKICAgICAgfQogICAgICBpZiAodHlwZSA9PSAid29yZCIpIHsKICAgICAgICB2YXIgd29yZCA9IHN0cmVhbS5jdXJyZW50KCk7CiAgICAgICAgb3ZlcnJpZGUgPSB3b3JkQXNWYWx1ZSh3b3JkKTsKCiAgICAgICAgaWYgKG92ZXJyaWRlID09ICJwcm9wZXJ0eSIpIHsKICAgICAgICAgIGlmIChzdGFydE9mTGluZShzdHJlYW0pKSB7CiAgICAgICAgICAgIHJldHVybiBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLCAiYmxvY2siLCAwKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG92ZXJyaWRlID0gImF0b20iOwogICAgICAgICAgICByZXR1cm4gImJsb2NrIjsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChvdmVycmlkZSA9PSAidGFnIikgewoKICAgICAgICAgIC8vIHRhZyBpcyBhIGNzcyB2YWx1ZQogICAgICAgICAgaWYgKC9lbWJlZHxtZW51fHByZXxwcm9ncmVzc3xzdWJ8dGFibGUvLnRlc3Qod29yZCkpIHsKICAgICAgICAgICAgaWYgKHdvcmRJc1Byb3BlcnR5KGZpcnN0V29yZE9mTGluZShzdHJlYW0pKSkgewogICAgICAgICAgICAgIG92ZXJyaWRlID0gImF0b20iOwogICAgICAgICAgICAgIHJldHVybiAiYmxvY2siOwogICAgICAgICAgICB9CiAgICAgICAgICB9CgogICAgICAgICAgLy8gdGFnIGlzIGFuIGF0dHJpYnV0ZQogICAgICAgICAgaWYgKHN0cmVhbS5zdHJpbmcubWF0Y2gobmV3IFJlZ0V4cCgiXFxbXFxzKiIgKyB3b3JkICsgInwiICsgd29yZCArIlxccypcXF0iKSkpIHsKICAgICAgICAgICAgb3ZlcnJpZGUgPSAiYXRvbSI7CiAgICAgICAgICAgIHJldHVybiAiYmxvY2siOwogICAgICAgICAgfQoKICAgICAgICAgIC8vIHRhZyBpcyBhIHZhcmlhYmxlCiAgICAgICAgICBpZiAodGFnVmFyaWFibGVzUmVnZXhwLnRlc3Qod29yZCkpIHsKICAgICAgICAgICAgaWYgKChzdGFydE9mTGluZShzdHJlYW0pICYmIHN0cmVhbS5zdHJpbmcubWF0Y2goLz0vKSkgfHwKICAgICAgICAgICAgICAgICghc3RhcnRPZkxpbmUoc3RyZWFtKSAmJgogICAgICAgICAgICAgICAgICFzdHJlYW0uc3RyaW5nLm1hdGNoKC9eKFxzKlwufCN8XCZ8XFt8XC98PnxcKikvKSAmJgogICAgICAgICAgICAgICAgICF3b3JkSXNUYWcoZmlyc3RXb3JkT2ZMaW5lKHN0cmVhbSkpKSkgewogICAgICAgICAgICAgIG92ZXJyaWRlID0gInZhcmlhYmxlLTIiOwogICAgICAgICAgICAgIGlmICh3b3JkSXNCbG9jayhmaXJzdFdvcmRPZkxpbmUoc3RyZWFtKSkpICByZXR1cm4gImJsb2NrIjsKICAgICAgICAgICAgICByZXR1cm4gcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbSwgImJsb2NrIiwgMCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KCiAgICAgICAgICBpZiAoZW5kT2ZMaW5lKHN0cmVhbSkpIHJldHVybiBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLCAiYmxvY2siKTsKICAgICAgICB9CiAgICAgICAgaWYgKG92ZXJyaWRlID09ICJibG9jay1rZXl3b3JkIikgewogICAgICAgICAgb3ZlcnJpZGUgPSAia2V5d29yZCI7CgogICAgICAgICAgLy8gUG9zdGZpeCBjb25kaXRpb25hbHMKICAgICAgICAgIGlmIChzdHJlYW0uY3VycmVudCgvKGlmfHVubGVzcykvKSAmJiAhc3RhcnRPZkxpbmUoc3RyZWFtKSkgewogICAgICAgICAgICByZXR1cm4gImJsb2NrIjsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLCAiYmxvY2siKTsKICAgICAgICB9CiAgICAgICAgaWYgKHdvcmQgPT0gInJldHVybiIpIHJldHVybiBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLCAiYmxvY2siLCAwKTsKCiAgICAgICAgLy8gUGxhY2Vob2xkZXIgc2VsZWN0b3IKICAgICAgICBpZiAob3ZlcnJpZGUgPT0gInZhcmlhYmxlLTIiICYmIHN0cmVhbS5zdHJpbmcubWF0Y2goL15ccz9cJFtcdy1cLlxbXF1cJ1wiXSskLykpIHsKICAgICAgICAgIHJldHVybiBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLCAiYmxvY2siKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHN0YXRlLmNvbnRleHQudHlwZTsKICAgIH07CgoKICAgIC8qKgogICAgICogUGFyZW5zCiAgICAgKi8KICAgIHN0YXRlcy5wYXJlbnMgPSBmdW5jdGlvbih0eXBlLCBzdHJlYW0sIHN0YXRlKSB7CiAgICAgIGlmICh0eXBlID09ICIoIikgcmV0dXJuIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0sICJwYXJlbnMiKTsKICAgICAgaWYgKHR5cGUgPT0gIikiKSB7CiAgICAgICAgaWYgKHN0YXRlLmNvbnRleHQucHJldi50eXBlID09ICJwYXJlbnMiKSB7CiAgICAgICAgICByZXR1cm4gcG9wQ29udGV4dChzdGF0ZSk7CiAgICAgICAgfQogICAgICAgIGlmICgoc3RyZWFtLnN0cmluZy5tYXRjaCgvXlthLXpdW1x3LV0qXCgvaSkgJiYgZW5kT2ZMaW5lKHN0cmVhbSkpIHx8CiAgICAgICAgICAgIHdvcmRJc0Jsb2NrKGZpcnN0V29yZE9mTGluZShzdHJlYW0pKSB8fAogICAgICAgICAgICAvKFwufCN8OnxcW3xcKnwmfD58fnxcK3xcLykvLnRlc3QoZmlyc3RXb3JkT2ZMaW5lKHN0cmVhbSkpIHx8CiAgICAgICAgICAgICghc3RyZWFtLnN0cmluZy5tYXRjaCgvXi0/W2Etel1bXHctXC5cW1xdXCdcIl0qXHMqPS8pICYmCiAgICAgICAgICAgICB3b3JkSXNUYWcoZmlyc3RXb3JkT2ZMaW5lKHN0cmVhbSkpKSkgewogICAgICAgICAgcmV0dXJuIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0sICJibG9jayIpOwogICAgICAgIH0KICAgICAgICBpZiAoc3RyZWFtLnN0cmluZy5tYXRjaCgvXltcJC1dP1thLXpdW1x3LVwuXFtcXVwnXCJdKlxzKj0vKSB8fAogICAgICAgICAgICBzdHJlYW0uc3RyaW5nLm1hdGNoKC9eXHMqKFwofFwpfFswLTldKS8pIHx8CiAgICAgICAgICAgIHN0cmVhbS5zdHJpbmcubWF0Y2goL15ccytbYS16XVtcdy1dKlwoL2kpIHx8CiAgICAgICAgICAgIHN0cmVhbS5zdHJpbmcubWF0Y2goL15ccytbXCQtXT9bYS16XS9pKSkgewogICAgICAgICAgcmV0dXJuIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0sICJibG9jayIsIDApOwogICAgICAgIH0KICAgICAgICBpZiAoZW5kT2ZMaW5lKHN0cmVhbSkpIHJldHVybiBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLCAiYmxvY2siKTsKICAgICAgICBlbHNlIHJldHVybiBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLCAiYmxvY2siLCAwKTsKICAgICAgfQogICAgICBpZiAodHlwZSAmJiB0eXBlLmNoYXJBdCgwKSA9PSAiQCIgJiYgd29yZElzUHJvcGVydHkoc3RyZWFtLmN1cnJlbnQoKS5zbGljZSgxKSkpIHsKICAgICAgICBvdmVycmlkZSA9ICJ2YXJpYWJsZS0yIjsKICAgICAgfQogICAgICBpZiAodHlwZSA9PSAid29yZCIpIHsKICAgICAgICB2YXIgd29yZCA9IHN0cmVhbS5jdXJyZW50KCk7CiAgICAgICAgb3ZlcnJpZGUgPSB3b3JkQXNWYWx1ZSh3b3JkKTsKICAgICAgICBpZiAob3ZlcnJpZGUgPT0gInRhZyIgJiYgdGFnVmFyaWFibGVzUmVnZXhwLnRlc3Qod29yZCkpIHsKICAgICAgICAgIG92ZXJyaWRlID0gInZhcmlhYmxlLTIiOwogICAgICAgIH0KICAgICAgICBpZiAob3ZlcnJpZGUgPT0gInByb3BlcnR5IiB8fCB3b3JkID09ICJ0byIpIG92ZXJyaWRlID0gImF0b20iOwogICAgICB9CiAgICAgIGlmICh0eXBlID09ICJ2YXJpYWJsZS1uYW1lIikgewogICAgICAgIHJldHVybiBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLCAidmFyaWFibGVOYW1lIik7CiAgICAgIH0KICAgICAgaWYgKHR5cGVJc1BzZXVkbyh0eXBlLCBzdHJlYW0pKSB7CiAgICAgICAgcmV0dXJuIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0sICJwc2V1ZG8iKTsKICAgICAgfQogICAgICByZXR1cm4gc3RhdGUuY29udGV4dC50eXBlOwogICAgfTsKCgogICAgLyoqCiAgICAgKiBWZW5kb3IgcHJlZml4ZXMKICAgICAqLwogICAgc3RhdGVzLnZlbmRvclByZWZpeGVzID0gZnVuY3Rpb24odHlwZSwgc3RyZWFtLCBzdGF0ZSkgewogICAgICBpZiAodHlwZSA9PSAid29yZCIpIHsKICAgICAgICBvdmVycmlkZSA9ICJwcm9wZXJ0eSI7CiAgICAgICAgcmV0dXJuIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0sICJibG9jayIsIDApOwogICAgICB9CiAgICAgIHJldHVybiBwb3BDb250ZXh0KHN0YXRlKTsKICAgIH07CgoKICAgIC8qKgogICAgICogUHNldWRvCiAgICAgKi8KICAgIHN0YXRlcy5wc2V1ZG8gPSBmdW5jdGlvbih0eXBlLCBzdHJlYW0sIHN0YXRlKSB7CiAgICAgIGlmICghd29yZElzUHJvcGVydHkoZmlyc3RXb3JkT2ZMaW5lKHN0cmVhbS5zdHJpbmcpKSkgewogICAgICAgIHN0cmVhbS5tYXRjaCgvXlthLXotXSsvKTsKICAgICAgICBvdmVycmlkZSA9ICJ2YXJpYWJsZS0zIjsKICAgICAgICBpZiAoZW5kT2ZMaW5lKHN0cmVhbSkpIHJldHVybiBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLCAiYmxvY2siKTsKICAgICAgICByZXR1cm4gcG9wQ29udGV4dChzdGF0ZSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHBvcEFuZFBhc3ModHlwZSwgc3RyZWFtLCBzdGF0ZSk7CiAgICB9OwoKCiAgICAvKioKICAgICAqIGF0QmxvY2sKICAgICAqLwogICAgc3RhdGVzLmF0QmxvY2sgPSBmdW5jdGlvbih0eXBlLCBzdHJlYW0sIHN0YXRlKSB7CiAgICAgIGlmICh0eXBlID09ICIoIikgcmV0dXJuIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0sICJhdEJsb2NrX3BhcmVucyIpOwogICAgICBpZiAodHlwZUlzQmxvY2sodHlwZSwgc3RyZWFtLCBzdGF0ZSkpIHsKICAgICAgICByZXR1cm4gcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbSwgImJsb2NrIik7CiAgICAgIH0KICAgICAgaWYgKHR5cGVJc0ludGVycG9sYXRpb24odHlwZSwgc3RyZWFtKSkgewogICAgICAgIHJldHVybiBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLCAiaW50ZXJwb2xhdGlvbiIpOwogICAgICB9CiAgICAgIGlmICh0eXBlID09ICJ3b3JkIikgewogICAgICAgIHZhciB3b3JkID0gc3RyZWFtLmN1cnJlbnQoKS50b0xvd2VyQ2FzZSgpOwogICAgICAgIGlmICgvXihvbmx5fG5vdHxhbmR8b3IpJC8udGVzdCh3b3JkKSkKICAgICAgICAgIG92ZXJyaWRlID0gImtleXdvcmQiOwogICAgICAgIGVsc2UgaWYgKGRvY3VtZW50VHlwZXMuaGFzT3duUHJvcGVydHkod29yZCkpCiAgICAgICAgICBvdmVycmlkZSA9ICJ0YWciOwogICAgICAgIGVsc2UgaWYgKG1lZGlhVHlwZXMuaGFzT3duUHJvcGVydHkod29yZCkpCiAgICAgICAgICBvdmVycmlkZSA9ICJhdHRyaWJ1dGUiOwogICAgICAgIGVsc2UgaWYgKG1lZGlhRmVhdHVyZXMuaGFzT3duUHJvcGVydHkod29yZCkpCiAgICAgICAgICBvdmVycmlkZSA9ICJwcm9wZXJ0eSI7CiAgICAgICAgZWxzZSBpZiAobm9uU3RhbmRhcmRQcm9wZXJ0eUtleXdvcmRzLmhhc093blByb3BlcnR5KHdvcmQpKQogICAgICAgICAgb3ZlcnJpZGUgPSAic3RyaW5nLTIiOwogICAgICAgIGVsc2Ugb3ZlcnJpZGUgPSB3b3JkQXNWYWx1ZShzdHJlYW0uY3VycmVudCgpKTsKICAgICAgICBpZiAob3ZlcnJpZGUgPT0gInRhZyIgJiYgZW5kT2ZMaW5lKHN0cmVhbSkpIHsKICAgICAgICAgIHJldHVybiBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLCAiYmxvY2siKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHR5cGUgPT0gIm9wZXJhdG9yIiAmJiAvXihub3R8YW5kfG9yKSQvLnRlc3Qoc3RyZWFtLmN1cnJlbnQoKSkpIHsKICAgICAgICBvdmVycmlkZSA9ICJrZXl3b3JkIjsKICAgICAgfQogICAgICByZXR1cm4gc3RhdGUuY29udGV4dC50eXBlOwogICAgfTsKCiAgICBzdGF0ZXMuYXRCbG9ja19wYXJlbnMgPSBmdW5jdGlvbih0eXBlLCBzdHJlYW0sIHN0YXRlKSB7CiAgICAgIGlmICh0eXBlID09ICJ7IiB8fCB0eXBlID09ICJ9IikgcmV0dXJuIHN0YXRlLmNvbnRleHQudHlwZTsKICAgICAgaWYgKHR5cGUgPT0gIikiKSB7CiAgICAgICAgaWYgKGVuZE9mTGluZShzdHJlYW0pKSByZXR1cm4gcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbSwgImJsb2NrIik7CiAgICAgICAgZWxzZSByZXR1cm4gcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbSwgImF0QmxvY2siKTsKICAgICAgfQogICAgICBpZiAodHlwZSA9PSAid29yZCIpIHsKICAgICAgICB2YXIgd29yZCA9IHN0cmVhbS5jdXJyZW50KCkudG9Mb3dlckNhc2UoKTsKICAgICAgICBvdmVycmlkZSA9IHdvcmRBc1ZhbHVlKHdvcmQpOwogICAgICAgIGlmICgvXihtYXh8bWluKS8udGVzdCh3b3JkKSkgb3ZlcnJpZGUgPSAicHJvcGVydHkiOwogICAgICAgIGlmIChvdmVycmlkZSA9PSAidGFnIikgewogICAgICAgICAgdGFnVmFyaWFibGVzUmVnZXhwLnRlc3Qod29yZCkgPyBvdmVycmlkZSA9ICJ2YXJpYWJsZS0yIiA6IG92ZXJyaWRlID0gImF0b20iOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc3RhdGUuY29udGV4dC50eXBlOwogICAgICB9CiAgICAgIHJldHVybiBzdGF0ZXMuYXRCbG9jayh0eXBlLCBzdHJlYW0sIHN0YXRlKTsKICAgIH07CgoKICAgIC8qKgogICAgICogS2V5ZnJhbWVzCiAgICAgKi8KICAgIHN0YXRlcy5rZXlmcmFtZXMgPSBmdW5jdGlvbih0eXBlLCBzdHJlYW0sIHN0YXRlKSB7CiAgICAgIGlmIChzdHJlYW0uaW5kZW50YXRpb24oKSA9PSAiMCIgJiYgKCh0eXBlID09ICJ9IiAmJiBzdGFydE9mTGluZShzdHJlYW0pKSB8fCB0eXBlID09ICJdIiB8fCB0eXBlID09ICJoYXNoIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCB0eXBlID09ICJxdWFsaWZpZXIiIHx8IHdvcmRJc1RhZyhzdHJlYW0uY3VycmVudCgpKSkpIHsKICAgICAgICByZXR1cm4gcG9wQW5kUGFzcyh0eXBlLCBzdHJlYW0sIHN0YXRlKTsKICAgICAgfQogICAgICBpZiAodHlwZSA9PSAieyIpIHJldHVybiBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLCAia2V5ZnJhbWVzIik7CiAgICAgIGlmICh0eXBlID09ICJ9IikgewogICAgICAgIGlmIChzdGFydE9mTGluZShzdHJlYW0pKSByZXR1cm4gcG9wQ29udGV4dChzdGF0ZSwgdHJ1ZSk7CiAgICAgICAgZWxzZSByZXR1cm4gcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbSwgImtleWZyYW1lcyIpOwogICAgICB9CiAgICAgIGlmICh0eXBlID09ICJ1bml0IiAmJiAvXlswLTldK1wlJC8udGVzdChzdHJlYW0uY3VycmVudCgpKSkgewogICAgICAgIHJldHVybiBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLCAia2V5ZnJhbWVzIik7CiAgICAgIH0KICAgICAgaWYgKHR5cGUgPT0gIndvcmQiKSB7CiAgICAgICAgb3ZlcnJpZGUgPSB3b3JkQXNWYWx1ZShzdHJlYW0uY3VycmVudCgpKTsKICAgICAgICBpZiAob3ZlcnJpZGUgPT0gImJsb2NrLWtleXdvcmQiKSB7CiAgICAgICAgICBvdmVycmlkZSA9ICJrZXl3b3JkIjsKICAgICAgICAgIHJldHVybiBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLCAia2V5ZnJhbWVzIik7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICgvQChmb250LWZhY2V8bWVkaWF8c3VwcG9ydHN8KC1tb3otKT9kb2N1bWVudCkvLnRlc3QodHlwZSkpIHsKICAgICAgICByZXR1cm4gcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbSwgZW5kT2ZMaW5lKHN0cmVhbSkgPyAiYmxvY2siIDogImF0QmxvY2siKTsKICAgICAgfQogICAgICBpZiAodHlwZSA9PSAibWl4aW4iKSB7CiAgICAgICAgcmV0dXJuIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0sICJibG9jayIsIDApOwogICAgICB9CiAgICAgIHJldHVybiBzdGF0ZS5jb250ZXh0LnR5cGU7CiAgICB9OwoKCiAgICAvKioKICAgICAqIEludGVycG9sYXRpb24KICAgICAqLwogICAgc3RhdGVzLmludGVycG9sYXRpb24gPSBmdW5jdGlvbih0eXBlLCBzdHJlYW0sIHN0YXRlKSB7CiAgICAgIGlmICh0eXBlID09ICJ7IikgcG9wQ29udGV4dChzdGF0ZSkgJiYgcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbSwgImJsb2NrIik7CiAgICAgIGlmICh0eXBlID09ICJ9IikgewogICAgICAgIGlmIChzdHJlYW0uc3RyaW5nLm1hdGNoKC9eXHMqKFwufCN8OnxcW3xcKnwmfD58fnxcK3xcLykvaSkgfHwKICAgICAgICAgICAgKHN0cmVhbS5zdHJpbmcubWF0Y2goL15ccypbYS16XS9pKSAmJiB3b3JkSXNUYWcoZmlyc3RXb3JkT2ZMaW5lKHN0cmVhbSkpKSkgewogICAgICAgICAgcmV0dXJuIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0sICJibG9jayIpOwogICAgICAgIH0KICAgICAgICBpZiAoIXN0cmVhbS5zdHJpbmcubWF0Y2goL14oXHt8XHMqXCYpLykgfHwKICAgICAgICAgICAgc3RyZWFtLm1hdGNoKC9ccypbXHctXS8sZmFsc2UpKSB7CiAgICAgICAgICByZXR1cm4gcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbSwgImJsb2NrIiwgMCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLCAiYmxvY2siKTsKICAgICAgfQogICAgICBpZiAodHlwZSA9PSAidmFyaWFibGUtbmFtZSIpIHsKICAgICAgICByZXR1cm4gcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbSwgInZhcmlhYmxlTmFtZSIsIDApOwogICAgICB9CiAgICAgIGlmICh0eXBlID09ICJ3b3JkIikgewogICAgICAgIG92ZXJyaWRlID0gd29yZEFzVmFsdWUoc3RyZWFtLmN1cnJlbnQoKSk7CiAgICAgICAgaWYgKG92ZXJyaWRlID09ICJ0YWciKSBvdmVycmlkZSA9ICJhdG9tIjsKICAgICAgfQogICAgICByZXR1cm4gc3RhdGUuY29udGV4dC50eXBlOwogICAgfTsKCgogICAgLyoqCiAgICAgKiBFeHRlbmQvcwogICAgICovCiAgICBzdGF0ZXMuZXh0ZW5kID0gZnVuY3Rpb24odHlwZSwgc3RyZWFtLCBzdGF0ZSkgewogICAgICBpZiAodHlwZSA9PSAiWyIgfHwgdHlwZSA9PSAiPSIpIHJldHVybiAiZXh0ZW5kIjsKICAgICAgaWYgKHR5cGUgPT0gIl0iKSByZXR1cm4gcG9wQ29udGV4dChzdGF0ZSk7CiAgICAgIGlmICh0eXBlID09ICJ3b3JkIikgewogICAgICAgIG92ZXJyaWRlID0gd29yZEFzVmFsdWUoc3RyZWFtLmN1cnJlbnQoKSk7CiAgICAgICAgcmV0dXJuICJleHRlbmQiOwogICAgICB9CiAgICAgIHJldHVybiBwb3BDb250ZXh0KHN0YXRlKTsKICAgIH07CgoKICAgIC8qKgogICAgICogVmFyaWFibGUgbmFtZQogICAgICovCiAgICBzdGF0ZXMudmFyaWFibGVOYW1lID0gZnVuY3Rpb24odHlwZSwgc3RyZWFtLCBzdGF0ZSkgewogICAgICBpZiAodHlwZSA9PSAic3RyaW5nIiB8fCB0eXBlID09ICJbIiB8fCB0eXBlID09ICJdIiB8fCBzdHJlYW0uY3VycmVudCgpLm1hdGNoKC9eKFwufFwkKS8pKSB7CiAgICAgICAgaWYgKHN0cmVhbS5jdXJyZW50KCkubWF0Y2goL15cLltcdy1dKy9pKSkgb3ZlcnJpZGUgPSAidmFyaWFibGUtMiI7CiAgICAgICAgcmV0dXJuICJ2YXJpYWJsZU5hbWUiOwogICAgICB9CiAgICAgIHJldHVybiBwb3BBbmRQYXNzKHR5cGUsIHN0cmVhbSwgc3RhdGUpOwogICAgfTsKCgogICAgcmV0dXJuIHsKICAgICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24oYmFzZSkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICB0b2tlbml6ZTogbnVsbCwKICAgICAgICAgIHN0YXRlOiAiYmxvY2siLAogICAgICAgICAgY29udGV4dDogbmV3IENvbnRleHQoImJsb2NrIiwgYmFzZSB8fCAwLCBudWxsKQogICAgICAgIH07CiAgICAgIH0sCiAgICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgICAgaWYgKCFzdGF0ZS50b2tlbml6ZSAmJiBzdHJlYW0uZWF0U3BhY2UoKSkgcmV0dXJuIG51bGw7CiAgICAgICAgc3R5bGUgPSAoc3RhdGUudG9rZW5pemUgfHwgdG9rZW5CYXNlKShzdHJlYW0sIHN0YXRlKTsKICAgICAgICBpZiAoc3R5bGUgJiYgdHlwZW9mIHN0eWxlID09ICJvYmplY3QiKSB7CiAgICAgICAgICB0eXBlID0gc3R5bGVbMV07CiAgICAgICAgICBzdHlsZSA9IHN0eWxlWzBdOwogICAgICAgIH0KICAgICAgICBvdmVycmlkZSA9IHN0eWxlOwogICAgICAgIHN0YXRlLnN0YXRlID0gc3RhdGVzW3N0YXRlLnN0YXRlXSh0eXBlLCBzdHJlYW0sIHN0YXRlKTsKICAgICAgICByZXR1cm4gb3ZlcnJpZGU7CiAgICAgIH0sCiAgICAgIGluZGVudDogZnVuY3Rpb24oc3RhdGUsIHRleHRBZnRlciwgbGluZSkgewoKICAgICAgICB2YXIgY3ggPSBzdGF0ZS5jb250ZXh0LAogICAgICAgICAgICBjaCA9IHRleHRBZnRlciAmJiB0ZXh0QWZ0ZXIuY2hhckF0KDApLAogICAgICAgICAgICBpbmRlbnQgPSBjeC5pbmRlbnQsCiAgICAgICAgICAgIGxpbmVGaXJzdFdvcmQgPSBmaXJzdFdvcmRPZkxpbmUodGV4dEFmdGVyKSwKICAgICAgICAgICAgbGluZUluZGVudCA9IGxpbmUubGVuZ3RoIC0gbGluZS5yZXBsYWNlKC9eXHMqLywgIiIpLmxlbmd0aCwKICAgICAgICAgICAgcHJldkxpbmVGaXJzdFdvcmQgPSBzdGF0ZS5jb250ZXh0LnByZXYgPyBzdGF0ZS5jb250ZXh0LnByZXYubGluZS5maXJzdFdvcmQgOiAiIiwKICAgICAgICAgICAgcHJldkxpbmVJbmRlbnQgPSBzdGF0ZS5jb250ZXh0LnByZXYgPyBzdGF0ZS5jb250ZXh0LnByZXYubGluZS5pbmRlbnQgOiBsaW5lSW5kZW50OwoKICAgICAgICBpZiAoY3gucHJldiAmJgogICAgICAgICAgICAoY2ggPT0gIn0iICYmIChjeC50eXBlID09ICJibG9jayIgfHwgY3gudHlwZSA9PSAiYXRCbG9jayIgfHwgY3gudHlwZSA9PSAia2V5ZnJhbWVzIikgfHwKICAgICAgICAgICAgIGNoID09ICIpIiAmJiAoY3gudHlwZSA9PSAicGFyZW5zIiB8fCBjeC50eXBlID09ICJhdEJsb2NrX3BhcmVucyIpIHx8CiAgICAgICAgICAgICBjaCA9PSAieyIgJiYgKGN4LnR5cGUgPT0gImF0IikpKSB7CiAgICAgICAgICBpbmRlbnQgPSBjeC5pbmRlbnQgLSBpbmRlbnRVbml0OwogICAgICAgICAgY3ggPSBjeC5wcmV2OwogICAgICAgIH0gZWxzZSBpZiAoISgvKFx9KS8udGVzdChjaCkpKSB7CiAgICAgICAgICBpZiAoL0B8XCR8XGQvLnRlc3QoY2gpIHx8CiAgICAgICAgICAgICAgL15cey8udGVzdCh0ZXh0QWZ0ZXIpIHx8Ci9eXHMqXC8oXC98XCopLy50ZXN0KHRleHRBZnRlcikgfHwKICAgICAgICAgICAgICAvXlxzKlwvXCovLnRlc3QocHJldkxpbmVGaXJzdFdvcmQpIHx8CiAgICAgICAgICAgICAgL15ccypbXHctXC5cW1xdXCdcIl0rXHMqKFw/fDp8XCspPz0vaS50ZXN0KHRleHRBZnRlcikgfHwKL14oXCt8LSk/W2Etel1bXHctXSpcKC9pLnRlc3QodGV4dEFmdGVyKSB8fAovXnJldHVybi8udGVzdCh0ZXh0QWZ0ZXIpIHx8CiAgICAgICAgICAgICAgd29yZElzQmxvY2sobGluZUZpcnN0V29yZCkpIHsKICAgICAgICAgICAgaW5kZW50ID0gbGluZUluZGVudDsKICAgICAgICAgIH0gZWxzZSBpZiAoLyhcLnwjfDp8XFt8XCp8Jnw+fH58XCt8XC8pLy50ZXN0KGNoKSB8fCB3b3JkSXNUYWcobGluZUZpcnN0V29yZCkpIHsKICAgICAgICAgICAgaWYgKC9cLFxzKiQvLnRlc3QocHJldkxpbmVGaXJzdFdvcmQpKSB7CiAgICAgICAgICAgICAgaW5kZW50ID0gcHJldkxpbmVJbmRlbnQ7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoL15ccysvLnRlc3QobGluZSkgJiYgKC8oXC58I3w6fFxbfFwqfCZ8Pnx+fFwrfFwvKS8udGVzdChwcmV2TGluZUZpcnN0V29yZCkgfHwgd29yZElzVGFnKHByZXZMaW5lRmlyc3RXb3JkKSkpIHsKICAgICAgICAgICAgICBpbmRlbnQgPSBsaW5lSW5kZW50IDw9IHByZXZMaW5lSW5kZW50ID8gcHJldkxpbmVJbmRlbnQgOiBwcmV2TGluZUluZGVudCArIGluZGVudFVuaXQ7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgaW5kZW50ID0gbGluZUluZGVudDsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIGlmICghLyxccyokLy50ZXN0KGxpbmUpICYmICh3b3JkSXNWZW5kb3JQcmVmaXgobGluZUZpcnN0V29yZCkgfHwgd29yZElzUHJvcGVydHkobGluZUZpcnN0V29yZCkpKSB7CiAgICAgICAgICAgIGlmICh3b3JkSXNCbG9jayhwcmV2TGluZUZpcnN0V29yZCkpIHsKICAgICAgICAgICAgICBpbmRlbnQgPSBsaW5lSW5kZW50IDw9IHByZXZMaW5lSW5kZW50ID8gcHJldkxpbmVJbmRlbnQgOiBwcmV2TGluZUluZGVudCArIGluZGVudFVuaXQ7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoL15cey8udGVzdChwcmV2TGluZUZpcnN0V29yZCkpIHsKICAgICAgICAgICAgICBpbmRlbnQgPSBsaW5lSW5kZW50IDw9IHByZXZMaW5lSW5kZW50ID8gbGluZUluZGVudCA6IHByZXZMaW5lSW5kZW50ICsgaW5kZW50VW5pdDsKICAgICAgICAgICAgfSBlbHNlIGlmICh3b3JkSXNWZW5kb3JQcmVmaXgocHJldkxpbmVGaXJzdFdvcmQpIHx8IHdvcmRJc1Byb3BlcnR5KHByZXZMaW5lRmlyc3RXb3JkKSkgewogICAgICAgICAgICAgIGluZGVudCA9IGxpbmVJbmRlbnQgPj0gcHJldkxpbmVJbmRlbnQgPyBwcmV2TGluZUluZGVudCA6IGxpbmVJbmRlbnQ7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoL14oXC58I3w6fFxbfFwqfCZ8QHxcK3xcLXw+fH58XC8pLy50ZXN0KHByZXZMaW5lRmlyc3RXb3JkKSB8fAogICAgICAgICAgICAgICAgICAgICAgLz1ccyokLy50ZXN0KHByZXZMaW5lRmlyc3RXb3JkKSB8fAogICAgICAgICAgICAgICAgICAgICAgd29yZElzVGFnKHByZXZMaW5lRmlyc3RXb3JkKSB8fAogICAgICAgICAgICAgICAgICAgICAgL15cJFtcdy1cLlxbXF1cJ1wiXS8udGVzdChwcmV2TGluZUZpcnN0V29yZCkpIHsKICAgICAgICAgICAgICBpbmRlbnQgPSBwcmV2TGluZUluZGVudCArIGluZGVudFVuaXQ7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgaW5kZW50ID0gbGluZUluZGVudDsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gaW5kZW50OwogICAgICB9LAogICAgICBlbGVjdHJpY0NoYXJzOiAifSIsCiAgICAgIGxpbmVDb21tZW50OiAiLy8iLAogICAgICBmb2xkOiAiaW5kZW50IgogICAgfTsKICB9KTsKCiAgLy8gZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUTUwvRWxlbWVudAogIHZhciB0YWdLZXl3b3Jkc18gPSBbImEiLCJhYmJyIiwiYWRkcmVzcyIsImFyZWEiLCJhcnRpY2xlIiwiYXNpZGUiLCJhdWRpbyIsICJiIiwgImJhc2UiLCJiZGkiLCAiYmRvIiwiYmdzb3VuZCIsImJsb2NrcXVvdGUiLCJib2R5IiwiYnIiLCJidXR0b24iLCJjYW52YXMiLCJjYXB0aW9uIiwiY2l0ZSIsICJjb2RlIiwiY29sIiwiY29sZ3JvdXAiLCJkYXRhIiwiZGF0YWxpc3QiLCJkZCIsImRlbCIsImRldGFpbHMiLCJkZm4iLCJkaXYiLCAiZGwiLCJkdCIsImVtIiwiZW1iZWQiLCJmaWVsZHNldCIsImZpZ2NhcHRpb24iLCJmaWd1cmUiLCJmb290ZXIiLCJmb3JtIiwiaDEiLCAiaDIiLCJoMyIsImg0IiwiaDUiLCJoNiIsImhlYWQiLCJoZWFkZXIiLCJoZ3JvdXAiLCJociIsImh0bWwiLCJpIiwiaWZyYW1lIiwgImltZyIsImlucHV0IiwiaW5zIiwia2JkIiwia2V5Z2VuIiwibGFiZWwiLCJsZWdlbmQiLCJsaSIsImxpbmsiLCJtYWluIiwibWFwIiwgIm1hcmsiLCJtYXJxdWVlIiwibWVudSIsIm1lbnVpdGVtIiwibWV0YSIsIm1ldGVyIiwibmF2Iiwibm9iciIsIm5vZnJhbWVzIiwgIm5vc2NyaXB0Iiwib2JqZWN0Iiwib2wiLCJvcHRncm91cCIsIm9wdGlvbiIsIm91dHB1dCIsInAiLCJwYXJhbSIsInByZSIsICJwcm9ncmVzcyIsInEiLCJycCIsInJ0IiwicnVieSIsInMiLCJzYW1wIiwic2NyaXB0Iiwic2VjdGlvbiIsInNlbGVjdCIsICJzbWFsbCIsInNvdXJjZSIsInNwYW4iLCJzdHJvbmciLCJzdHlsZSIsInN1YiIsInN1bW1hcnkiLCJzdXAiLCJ0YWJsZSIsInRib2R5IiwidGQiLCJ0ZXh0YXJlYSIsInRmb290IiwidGgiLCJ0aGVhZCIsInRpbWUiLCJ0ciIsInRyYWNrIiwgInUiLCJ1bCIsInZhciIsInZpZGVvIl07CgogIC8vIGdpdGh1Yi5jb20vY29kZW1pcnJvci9Db2RlTWlycm9yL2Jsb2IvbWFzdGVyL21vZGUvY3NzL2Nzcy5qcwogIHZhciBkb2N1bWVudFR5cGVzXyA9IFsiZG9tYWluIiwgInJlZ2V4cCIsICJ1cmwiLCAidXJsLXByZWZpeCJdOwogIHZhciBtZWRpYVR5cGVzXyA9IFsiYWxsIiwiYXVyYWwiLCJicmFpbGxlIiwiaGFuZGhlbGQiLCJwcmludCIsInByb2plY3Rpb24iLCJzY3JlZW4iLCJ0dHkiLCJ0diIsImVtYm9zc2VkIl07CiAgdmFyIG1lZGlhRmVhdHVyZXNfID0gWyJ3aWR0aCIsIm1pbi13aWR0aCIsIm1heC13aWR0aCIsImhlaWdodCIsIm1pbi1oZWlnaHQiLCJtYXgtaGVpZ2h0IiwiZGV2aWNlLXdpZHRoIiwibWluLWRldmljZS13aWR0aCIsIm1heC1kZXZpY2Utd2lkdGgiLCJkZXZpY2UtaGVpZ2h0IiwibWluLWRldmljZS1oZWlnaHQiLCJtYXgtZGV2aWNlLWhlaWdodCIsImFzcGVjdC1yYXRpbyIsIm1pbi1hc3BlY3QtcmF0aW8iLCJtYXgtYXNwZWN0LXJhdGlvIiwiZGV2aWNlLWFzcGVjdC1yYXRpbyIsIm1pbi1kZXZpY2UtYXNwZWN0LXJhdGlvIiwibWF4LWRldmljZS1hc3BlY3QtcmF0aW8iLCJjb2xvciIsIm1pbi1jb2xvciIsIm1heC1jb2xvciIsImNvbG9yLWluZGV4IiwibWluLWNvbG9yLWluZGV4IiwibWF4LWNvbG9yLWluZGV4IiwibW9ub2Nocm9tZSIsIm1pbi1tb25vY2hyb21lIiwibWF4LW1vbm9jaHJvbWUiLCJyZXNvbHV0aW9uIiwibWluLXJlc29sdXRpb24iLCJtYXgtcmVzb2x1dGlvbiIsInNjYW4iLCJncmlkIl07CiAgdmFyIHByb3BlcnR5S2V5d29yZHNfID0gWyJhbGlnbi1jb250ZW50IiwiYWxpZ24taXRlbXMiLCJhbGlnbi1zZWxmIiwiYWxpZ25tZW50LWFkanVzdCIsImFsaWdubWVudC1iYXNlbGluZSIsImFuY2hvci1wb2ludCIsImFuaW1hdGlvbiIsImFuaW1hdGlvbi1kZWxheSIsImFuaW1hdGlvbi1kaXJlY3Rpb24iLCJhbmltYXRpb24tZHVyYXRpb24iLCJhbmltYXRpb24tZmlsbC1tb2RlIiwiYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudCIsImFuaW1hdGlvbi1uYW1lIiwiYW5pbWF0aW9uLXBsYXktc3RhdGUiLCJhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uIiwiYXBwZWFyYW5jZSIsImF6aW11dGgiLCJiYWNrZmFjZS12aXNpYmlsaXR5IiwiYmFja2dyb3VuZCIsImJhY2tncm91bmQtYXR0YWNobWVudCIsImJhY2tncm91bmQtY2xpcCIsImJhY2tncm91bmQtY29sb3IiLCJiYWNrZ3JvdW5kLWltYWdlIiwiYmFja2dyb3VuZC1vcmlnaW4iLCJiYWNrZ3JvdW5kLXBvc2l0aW9uIiwiYmFja2dyb3VuZC1yZXBlYXQiLCJiYWNrZ3JvdW5kLXNpemUiLCJiYXNlbGluZS1zaGlmdCIsImJpbmRpbmciLCJibGVlZCIsImJvb2ttYXJrLWxhYmVsIiwiYm9va21hcmstbGV2ZWwiLCJib29rbWFyay1zdGF0ZSIsImJvb2ttYXJrLXRhcmdldCIsImJvcmRlciIsImJvcmRlci1ib3R0b20iLCJib3JkZXItYm90dG9tLWNvbG9yIiwiYm9yZGVyLWJvdHRvbS1sZWZ0LXJhZGl1cyIsImJvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzIiwiYm9yZGVyLWJvdHRvbS1zdHlsZSIsImJvcmRlci1ib3R0b20td2lkdGgiLCJib3JkZXItY29sbGFwc2UiLCJib3JkZXItY29sb3IiLCJib3JkZXItaW1hZ2UiLCJib3JkZXItaW1hZ2Utb3V0c2V0IiwiYm9yZGVyLWltYWdlLXJlcGVhdCIsImJvcmRlci1pbWFnZS1zbGljZSIsImJvcmRlci1pbWFnZS1zb3VyY2UiLCJib3JkZXItaW1hZ2Utd2lkdGgiLCJib3JkZXItbGVmdCIsImJvcmRlci1sZWZ0LWNvbG9yIiwiYm9yZGVyLWxlZnQtc3R5bGUiLCJib3JkZXItbGVmdC13aWR0aCIsImJvcmRlci1yYWRpdXMiLCJib3JkZXItcmlnaHQiLCJib3JkZXItcmlnaHQtY29sb3IiLCJib3JkZXItcmlnaHQtc3R5bGUiLCJib3JkZXItcmlnaHQtd2lkdGgiLCJib3JkZXItc3BhY2luZyIsImJvcmRlci1zdHlsZSIsImJvcmRlci10b3AiLCJib3JkZXItdG9wLWNvbG9yIiwiYm9yZGVyLXRvcC1sZWZ0LXJhZGl1cyIsImJvcmRlci10b3AtcmlnaHQtcmFkaXVzIiwiYm9yZGVyLXRvcC1zdHlsZSIsImJvcmRlci10b3Atd2lkdGgiLCJib3JkZXItd2lkdGgiLCJib3R0b20iLCJib3gtZGVjb3JhdGlvbi1icmVhayIsImJveC1zaGFkb3ciLCJib3gtc2l6aW5nIiwiYnJlYWstYWZ0ZXIiLCJicmVhay1iZWZvcmUiLCJicmVhay1pbnNpZGUiLCJjYXB0aW9uLXNpZGUiLCJjbGVhciIsImNsaXAiLCJjb2xvciIsImNvbG9yLXByb2ZpbGUiLCJjb2x1bW4tY291bnQiLCJjb2x1bW4tZmlsbCIsImNvbHVtbi1nYXAiLCJjb2x1bW4tcnVsZSIsImNvbHVtbi1ydWxlLWNvbG9yIiwiY29sdW1uLXJ1bGUtc3R5bGUiLCJjb2x1bW4tcnVsZS13aWR0aCIsImNvbHVtbi1zcGFuIiwiY29sdW1uLXdpZHRoIiwiY29sdW1ucyIsImNvbnRlbnQiLCJjb3VudGVyLWluY3JlbWVudCIsImNvdW50ZXItcmVzZXQiLCJjcm9wIiwiY3VlIiwiY3VlLWFmdGVyIiwiY3VlLWJlZm9yZSIsImN1cnNvciIsImRpcmVjdGlvbiIsImRpc3BsYXkiLCJkb21pbmFudC1iYXNlbGluZSIsImRyb3AtaW5pdGlhbC1hZnRlci1hZGp1c3QiLCJkcm9wLWluaXRpYWwtYWZ0ZXItYWxpZ24iLCJkcm9wLWluaXRpYWwtYmVmb3JlLWFkanVzdCIsImRyb3AtaW5pdGlhbC1iZWZvcmUtYWxpZ24iLCJkcm9wLWluaXRpYWwtc2l6ZSIsImRyb3AtaW5pdGlhbC12YWx1ZSIsImVsZXZhdGlvbiIsImVtcHR5LWNlbGxzIiwiZml0IiwiZml0LXBvc2l0aW9uIiwiZmxleCIsImZsZXgtYmFzaXMiLCJmbGV4LWRpcmVjdGlvbiIsImZsZXgtZmxvdyIsImZsZXgtZ3JvdyIsImZsZXgtc2hyaW5rIiwiZmxleC13cmFwIiwiZmxvYXQiLCJmbG9hdC1vZmZzZXQiLCJmbG93LWZyb20iLCJmbG93LWludG8iLCJmb250IiwiZm9udC1mZWF0dXJlLXNldHRpbmdzIiwiZm9udC1mYW1pbHkiLCJmb250LWtlcm5pbmciLCJmb250LWxhbmd1YWdlLW92ZXJyaWRlIiwiZm9udC1zaXplIiwiZm9udC1zaXplLWFkanVzdCIsImZvbnQtc3RyZXRjaCIsImZvbnQtc3R5bGUiLCJmb250LXN5bnRoZXNpcyIsImZvbnQtdmFyaWFudCIsImZvbnQtdmFyaWFudC1hbHRlcm5hdGVzIiwiZm9udC12YXJpYW50LWNhcHMiLCJmb250LXZhcmlhbnQtZWFzdC1hc2lhbiIsImZvbnQtdmFyaWFudC1saWdhdHVyZXMiLCJmb250LXZhcmlhbnQtbnVtZXJpYyIsImZvbnQtdmFyaWFudC1wb3NpdGlvbiIsImZvbnQtd2VpZ2h0IiwiZ3JpZCIsImdyaWQtYXJlYSIsImdyaWQtYXV0by1jb2x1bW5zIiwiZ3JpZC1hdXRvLWZsb3ciLCJncmlkLWF1dG8tcG9zaXRpb24iLCJncmlkLWF1dG8tcm93cyIsImdyaWQtY29sdW1uIiwiZ3JpZC1jb2x1bW4tZW5kIiwiZ3JpZC1jb2x1bW4tc3RhcnQiLCJncmlkLXJvdyIsImdyaWQtcm93LWVuZCIsImdyaWQtcm93LXN0YXJ0IiwiZ3JpZC10ZW1wbGF0ZSIsImdyaWQtdGVtcGxhdGUtYXJlYXMiLCJncmlkLXRlbXBsYXRlLWNvbHVtbnMiLCJncmlkLXRlbXBsYXRlLXJvd3MiLCJoYW5naW5nLXB1bmN0dWF0aW9uIiwiaGVpZ2h0IiwiaHlwaGVucyIsImljb24iLCJpbWFnZS1vcmllbnRhdGlvbiIsImltYWdlLXJlbmRlcmluZyIsImltYWdlLXJlc29sdXRpb24iLCJpbmxpbmUtYm94LWFsaWduIiwianVzdGlmeS1jb250ZW50IiwibGVmdCIsImxldHRlci1zcGFjaW5nIiwibGluZS1icmVhayIsImxpbmUtaGVpZ2h0IiwibGluZS1zdGFja2luZyIsImxpbmUtc3RhY2tpbmctcnVieSIsImxpbmUtc3RhY2tpbmctc2hpZnQiLCJsaW5lLXN0YWNraW5nLXN0cmF0ZWd5IiwibGlzdC1zdHlsZSIsImxpc3Qtc3R5bGUtaW1hZ2UiLCJsaXN0LXN0eWxlLXBvc2l0aW9uIiwibGlzdC1zdHlsZS10eXBlIiwibWFyZ2luIiwibWFyZ2luLWJvdHRvbSIsIm1hcmdpbi1sZWZ0IiwibWFyZ2luLXJpZ2h0IiwibWFyZ2luLXRvcCIsIm1hcmtlci1vZmZzZXQiLCJtYXJrcyIsIm1hcnF1ZWUtZGlyZWN0aW9uIiwibWFycXVlZS1sb29wIiwibWFycXVlZS1wbGF5LWNvdW50IiwibWFycXVlZS1zcGVlZCIsIm1hcnF1ZWUtc3R5bGUiLCJtYXgtaGVpZ2h0IiwibWF4LXdpZHRoIiwibWluLWhlaWdodCIsIm1pbi13aWR0aCIsIm1vdmUtdG8iLCJuYXYtZG93biIsIm5hdi1pbmRleCIsIm5hdi1sZWZ0IiwibmF2LXJpZ2h0IiwibmF2LXVwIiwib2JqZWN0LWZpdCIsIm9iamVjdC1wb3NpdGlvbiIsIm9wYWNpdHkiLCJvcmRlciIsIm9ycGhhbnMiLCJvdXRsaW5lIiwib3V0bGluZS1jb2xvciIsIm91dGxpbmUtb2Zmc2V0Iiwib3V0bGluZS1zdHlsZSIsIm91dGxpbmUtd2lkdGgiLCJvdmVyZmxvdyIsIm92ZXJmbG93LXN0eWxlIiwib3ZlcmZsb3ctd3JhcCIsIm92ZXJmbG93LXgiLCJvdmVyZmxvdy15IiwicGFkZGluZyIsInBhZGRpbmctYm90dG9tIiwicGFkZGluZy1sZWZ0IiwicGFkZGluZy1yaWdodCIsInBhZGRpbmctdG9wIiwicGFnZSIsInBhZ2UtYnJlYWstYWZ0ZXIiLCJwYWdlLWJyZWFrLWJlZm9yZSIsInBhZ2UtYnJlYWstaW5zaWRlIiwicGFnZS1wb2xpY3kiLCJwYXVzZSIsInBhdXNlLWFmdGVyIiwicGF1c2UtYmVmb3JlIiwicGVyc3BlY3RpdmUiLCJwZXJzcGVjdGl2ZS1vcmlnaW4iLCJwaXRjaCIsInBpdGNoLXJhbmdlIiwicGxheS1kdXJpbmciLCJwb3NpdGlvbiIsInByZXNlbnRhdGlvbi1sZXZlbCIsInB1bmN0dWF0aW9uLXRyaW0iLCJxdW90ZXMiLCJyZWdpb24tYnJlYWstYWZ0ZXIiLCJyZWdpb24tYnJlYWstYmVmb3JlIiwicmVnaW9uLWJyZWFrLWluc2lkZSIsInJlZ2lvbi1mcmFnbWVudCIsInJlbmRlcmluZy1pbnRlbnQiLCJyZXNpemUiLCJyZXN0IiwicmVzdC1hZnRlciIsInJlc3QtYmVmb3JlIiwicmljaG5lc3MiLCJyaWdodCIsInJvdGF0aW9uIiwicm90YXRpb24tcG9pbnQiLCJydWJ5LWFsaWduIiwicnVieS1vdmVyaGFuZyIsInJ1YnktcG9zaXRpb24iLCJydWJ5LXNwYW4iLCJzaGFwZS1pbWFnZS10aHJlc2hvbGQiLCJzaGFwZS1pbnNpZGUiLCJzaGFwZS1tYXJnaW4iLCJzaGFwZS1vdXRzaWRlIiwic2l6ZSIsInNwZWFrIiwic3BlYWstYXMiLCJzcGVhay1oZWFkZXIiLCJzcGVhay1udW1lcmFsIiwic3BlYWstcHVuY3R1YXRpb24iLCJzcGVlY2gtcmF0ZSIsInN0cmVzcyIsInN0cmluZy1zZXQiLCJ0YWItc2l6ZSIsInRhYmxlLWxheW91dCIsInRhcmdldCIsInRhcmdldC1uYW1lIiwidGFyZ2V0LW5ldyIsInRhcmdldC1wb3NpdGlvbiIsInRleHQtYWxpZ24iLCJ0ZXh0LWFsaWduLWxhc3QiLCJ0ZXh0LWRlY29yYXRpb24iLCJ0ZXh0LWRlY29yYXRpb24tY29sb3IiLCJ0ZXh0LWRlY29yYXRpb24tbGluZSIsInRleHQtZGVjb3JhdGlvbi1za2lwIiwidGV4dC1kZWNvcmF0aW9uLXN0eWxlIiwidGV4dC1lbXBoYXNpcyIsInRleHQtZW1waGFzaXMtY29sb3IiLCJ0ZXh0LWVtcGhhc2lzLXBvc2l0aW9uIiwidGV4dC1lbXBoYXNpcy1zdHlsZSIsInRleHQtaGVpZ2h0IiwidGV4dC1pbmRlbnQiLCJ0ZXh0LWp1c3RpZnkiLCJ0ZXh0LW91dGxpbmUiLCJ0ZXh0LW92ZXJmbG93IiwidGV4dC1zaGFkb3ciLCJ0ZXh0LXNpemUtYWRqdXN0IiwidGV4dC1zcGFjZS1jb2xsYXBzZSIsInRleHQtdHJhbnNmb3JtIiwidGV4dC11bmRlcmxpbmUtcG9zaXRpb24iLCJ0ZXh0LXdyYXAiLCJ0b3AiLCJ0cmFuc2Zvcm0iLCJ0cmFuc2Zvcm0tb3JpZ2luIiwidHJhbnNmb3JtLXN0eWxlIiwidHJhbnNpdGlvbiIsInRyYW5zaXRpb24tZGVsYXkiLCJ0cmFuc2l0aW9uLWR1cmF0aW9uIiwidHJhbnNpdGlvbi1wcm9wZXJ0eSIsInRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uIiwidW5pY29kZS1iaWRpIiwidmVydGljYWwtYWxpZ24iLCJ2aXNpYmlsaXR5Iiwidm9pY2UtYmFsYW5jZSIsInZvaWNlLWR1cmF0aW9uIiwidm9pY2UtZmFtaWx5Iiwidm9pY2UtcGl0Y2giLCJ2b2ljZS1yYW5nZSIsInZvaWNlLXJhdGUiLCJ2b2ljZS1zdHJlc3MiLCJ2b2ljZS12b2x1bWUiLCJ2b2x1bWUiLCJ3aGl0ZS1zcGFjZSIsIndpZG93cyIsIndpZHRoIiwid29yZC1icmVhayIsIndvcmQtc3BhY2luZyIsIndvcmQtd3JhcCIsInotaW5kZXgiLCJjbGlwLXBhdGgiLCJjbGlwLXJ1bGUiLCJtYXNrIiwiZW5hYmxlLWJhY2tncm91bmQiLCJmaWx0ZXIiLCJmbG9vZC1jb2xvciIsImZsb29kLW9wYWNpdHkiLCJsaWdodGluZy1jb2xvciIsInN0b3AtY29sb3IiLCJzdG9wLW9wYWNpdHkiLCJwb2ludGVyLWV2ZW50cyIsImNvbG9yLWludGVycG9sYXRpb24iLCJjb2xvci1pbnRlcnBvbGF0aW9uLWZpbHRlcnMiLCJjb2xvci1yZW5kZXJpbmciLCJmaWxsIiwiZmlsbC1vcGFjaXR5IiwiZmlsbC1ydWxlIiwiaW1hZ2UtcmVuZGVyaW5nIiwibWFya2VyIiwibWFya2VyLWVuZCIsIm1hcmtlci1taWQiLCJtYXJrZXItc3RhcnQiLCJzaGFwZS1yZW5kZXJpbmciLCJzdHJva2UiLCJzdHJva2UtZGFzaGFycmF5Iiwic3Ryb2tlLWRhc2hvZmZzZXQiLCJzdHJva2UtbGluZWNhcCIsInN0cm9rZS1saW5lam9pbiIsInN0cm9rZS1taXRlcmxpbWl0Iiwic3Ryb2tlLW9wYWNpdHkiLCJzdHJva2Utd2lkdGgiLCJ0ZXh0LXJlbmRlcmluZyIsImJhc2VsaW5lLXNoaWZ0IiwiZG9taW5hbnQtYmFzZWxpbmUiLCJnbHlwaC1vcmllbnRhdGlvbi1ob3Jpem9udGFsIiwiZ2x5cGgtb3JpZW50YXRpb24tdmVydGljYWwiLCJ0ZXh0LWFuY2hvciIsIndyaXRpbmctbW9kZSIsImZvbnQtc21vb3RoaW5nIiwib3N4LWZvbnQtc21vb3RoaW5nIl07CiAgdmFyIG5vblN0YW5kYXJkUHJvcGVydHlLZXl3b3Jkc18gPSBbInNjcm9sbGJhci1hcnJvdy1jb2xvciIsInNjcm9sbGJhci1iYXNlLWNvbG9yIiwic2Nyb2xsYmFyLWRhcmstc2hhZG93LWNvbG9yIiwic2Nyb2xsYmFyLWZhY2UtY29sb3IiLCJzY3JvbGxiYXItaGlnaGxpZ2h0LWNvbG9yIiwic2Nyb2xsYmFyLXNoYWRvdy1jb2xvciIsInNjcm9sbGJhci0zZC1saWdodC1jb2xvciIsInNjcm9sbGJhci10cmFjay1jb2xvciIsInNoYXBlLWluc2lkZSIsInNlYXJjaGZpZWxkLWNhbmNlbC1idXR0b24iLCJzZWFyY2hmaWVsZC1kZWNvcmF0aW9uIiwic2VhcmNoZmllbGQtcmVzdWx0cy1idXR0b24iLCJzZWFyY2hmaWVsZC1yZXN1bHRzLWRlY29yYXRpb24iLCJ6b29tIl07CiAgdmFyIGZvbnRQcm9wZXJ0aWVzXyA9IFsiZm9udC1mYW1pbHkiLCJzcmMiLCJ1bmljb2RlLXJhbmdlIiwiZm9udC12YXJpYW50IiwiZm9udC1mZWF0dXJlLXNldHRpbmdzIiwiZm9udC1zdHJldGNoIiwiZm9udC13ZWlnaHQiLCJmb250LXN0eWxlIl07CiAgdmFyIGNvbG9yS2V5d29yZHNfID0gWyJhbGljZWJsdWUiLCJhbnRpcXVld2hpdGUiLCJhcXVhIiwiYXF1YW1hcmluZSIsImF6dXJlIiwiYmVpZ2UiLCJiaXNxdWUiLCJibGFjayIsImJsYW5jaGVkYWxtb25kIiwiYmx1ZSIsImJsdWV2aW9sZXQiLCJicm93biIsImJ1cmx5d29vZCIsImNhZGV0Ymx1ZSIsImNoYXJ0cmV1c2UiLCJjaG9jb2xhdGUiLCJjb3JhbCIsImNvcm5mbG93ZXJibHVlIiwiY29ybnNpbGsiLCJjcmltc29uIiwiY3lhbiIsImRhcmtibHVlIiwiZGFya2N5YW4iLCJkYXJrZ29sZGVucm9kIiwiZGFya2dyYXkiLCJkYXJrZ3JlZW4iLCJkYXJra2hha2kiLCJkYXJrbWFnZW50YSIsImRhcmtvbGl2ZWdyZWVuIiwiZGFya29yYW5nZSIsImRhcmtvcmNoaWQiLCJkYXJrcmVkIiwiZGFya3NhbG1vbiIsImRhcmtzZWFncmVlbiIsImRhcmtzbGF0ZWJsdWUiLCJkYXJrc2xhdGVncmF5IiwiZGFya3R1cnF1b2lzZSIsImRhcmt2aW9sZXQiLCJkZWVwcGluayIsImRlZXBza3libHVlIiwiZGltZ3JheSIsImRvZGdlcmJsdWUiLCJmaXJlYnJpY2siLCJmbG9yYWx3aGl0ZSIsImZvcmVzdGdyZWVuIiwiZnVjaHNpYSIsImdhaW5zYm9ybyIsImdob3N0d2hpdGUiLCJnb2xkIiwiZ29sZGVucm9kIiwiZ3JheSIsImdyZXkiLCJncmVlbiIsImdyZWVueWVsbG93IiwiaG9uZXlkZXciLCJob3RwaW5rIiwiaW5kaWFucmVkIiwiaW5kaWdvIiwiaXZvcnkiLCJraGFraSIsImxhdmVuZGVyIiwibGF2ZW5kZXJibHVzaCIsImxhd25ncmVlbiIsImxlbW9uY2hpZmZvbiIsImxpZ2h0Ymx1ZSIsImxpZ2h0Y29yYWwiLCJsaWdodGN5YW4iLCJsaWdodGdvbGRlbnJvZHllbGxvdyIsImxpZ2h0Z3JheSIsImxpZ2h0Z3JlZW4iLCJsaWdodHBpbmsiLCJsaWdodHNhbG1vbiIsImxpZ2h0c2VhZ3JlZW4iLCJsaWdodHNreWJsdWUiLCJsaWdodHNsYXRlZ3JheSIsImxpZ2h0c3RlZWxibHVlIiwibGlnaHR5ZWxsb3ciLCJsaW1lIiwibGltZWdyZWVuIiwibGluZW4iLCJtYWdlbnRhIiwibWFyb29uIiwibWVkaXVtYXF1YW1hcmluZSIsIm1lZGl1bWJsdWUiLCJtZWRpdW1vcmNoaWQiLCJtZWRpdW1wdXJwbGUiLCJtZWRpdW1zZWFncmVlbiIsIm1lZGl1bXNsYXRlYmx1ZSIsIm1lZGl1bXNwcmluZ2dyZWVuIiwibWVkaXVtdHVycXVvaXNlIiwibWVkaXVtdmlvbGV0cmVkIiwibWlkbmlnaHRibHVlIiwibWludGNyZWFtIiwibWlzdHlyb3NlIiwibW9jY2FzaW4iLCJuYXZham93aGl0ZSIsIm5hdnkiLCJvbGRsYWNlIiwib2xpdmUiLCJvbGl2ZWRyYWIiLCJvcmFuZ2UiLCJvcmFuZ2VyZWQiLCJvcmNoaWQiLCJwYWxlZ29sZGVucm9kIiwicGFsZWdyZWVuIiwicGFsZXR1cnF1b2lzZSIsInBhbGV2aW9sZXRyZWQiLCJwYXBheWF3aGlwIiwicGVhY2hwdWZmIiwicGVydSIsInBpbmsiLCJwbHVtIiwicG93ZGVyYmx1ZSIsInB1cnBsZSIsInJlYmVjY2FwdXJwbGUiLCJyZWQiLCJyb3N5YnJvd24iLCJyb3lhbGJsdWUiLCJzYWRkbGVicm93biIsInNhbG1vbiIsInNhbmR5YnJvd24iLCJzZWFncmVlbiIsInNlYXNoZWxsIiwic2llbm5hIiwic2lsdmVyIiwic2t5Ymx1ZSIsInNsYXRlYmx1ZSIsInNsYXRlZ3JheSIsInNub3ciLCJzcHJpbmdncmVlbiIsInN0ZWVsYmx1ZSIsInRhbiIsInRlYWwiLCJ0aGlzdGxlIiwidG9tYXRvIiwidHVycXVvaXNlIiwidmlvbGV0Iiwid2hlYXQiLCJ3aGl0ZSIsIndoaXRlc21va2UiLCJ5ZWxsb3ciLCJ5ZWxsb3dncmVlbiJdOwogIHZhciB2YWx1ZUtleXdvcmRzXyA9IFsiYWJvdmUiLCJhYnNvbHV0ZSIsImFjdGl2ZWJvcmRlciIsImFkZGl0aXZlIiwiYWN0aXZlY2FwdGlvbiIsImFmYXIiLCJhZnRlci13aGl0ZS1zcGFjZSIsImFoZWFkIiwiYWxpYXMiLCJhbGwiLCJhbGwtc2Nyb2xsIiwiYWxwaGFiZXRpYyIsImFsdGVybmF0ZSIsImFsd2F5cyIsImFtaGFyaWMiLCJhbWhhcmljLWFiZWdlZGUiLCJhbnRpYWxpYXNlZCIsImFwcHdvcmtzcGFjZSIsImFyYWJpYy1pbmRpYyIsImFybWVuaWFuIiwiYXN0ZXJpc2tzIiwiYXR0ciIsImF1dG8iLCJhdm9pZCIsImF2b2lkLWNvbHVtbiIsImF2b2lkLXBhZ2UiLCJhdm9pZC1yZWdpb24iLCJiYWNrZ3JvdW5kIiwiYmFja3dhcmRzIiwiYmFzZWxpbmUiLCJiZWxvdyIsImJpZGktb3ZlcnJpZGUiLCJiaW5hcnkiLCJiZW5nYWxpIiwiYmxpbmsiLCJibG9jayIsImJsb2NrLWF4aXMiLCJib2xkIiwiYm9sZGVyIiwiYm9yZGVyIiwiYm9yZGVyLWJveCIsImJvdGgiLCJib3R0b20iLCJicmVhayIsImJyZWFrLWFsbCIsImJyZWFrLXdvcmQiLCJidWxsZXRzIiwiYnV0dG9uIiwiYnV0dG9uLWJldmVsIiwiYnV0dG9uZmFjZSIsImJ1dHRvbmhpZ2hsaWdodCIsImJ1dHRvbnNoYWRvdyIsImJ1dHRvbnRleHQiLCJjYWxjIiwiY2FtYm9kaWFuIiwiY2FwaXRhbGl6ZSIsImNhcHMtbG9jay1pbmRpY2F0b3IiLCJjYXB0aW9uIiwiY2FwdGlvbnRleHQiLCJjYXJldCIsImNlbGwiLCJjZW50ZXIiLCJjaGVja2JveCIsImNpcmNsZSIsImNqay1kZWNpbWFsIiwiY2prLWVhcnRobHktYnJhbmNoIiwiY2prLWhlYXZlbmx5LXN0ZW0iLCJjamstaWRlb2dyYXBoaWMiLCJjbGVhciIsImNsaXAiLCJjbG9zZS1xdW90ZSIsImNvbC1yZXNpemUiLCJjb2xsYXBzZSIsImNvbHVtbiIsImNvbXBhY3QiLCJjb25kZW5zZWQiLCJjb250YWluIiwiY29udGVudCIsImNvbnRlbnQtYm94IiwiY29udGV4dC1tZW51IiwiY29udGludW91cyIsImNvcHkiLCJjb3VudGVyIiwiY291bnRlcnMiLCJjb3ZlciIsImNyb3AiLCJjcm9zcyIsImNyb3NzaGFpciIsImN1cnJlbnRjb2xvciIsImN1cnNpdmUiLCJjeWNsaWMiLCJkYXNoZWQiLCJkZWNpbWFsIiwiZGVjaW1hbC1sZWFkaW5nLXplcm8iLCJkZWZhdWx0IiwiZGVmYXVsdC1idXR0b24iLCJkZXN0aW5hdGlvbi1hdG9wIiwiZGVzdGluYXRpb24taW4iLCJkZXN0aW5hdGlvbi1vdXQiLCJkZXN0aW5hdGlvbi1vdmVyIiwiZGV2YW5hZ2FyaSIsImRpc2MiLCJkaXNjYXJkIiwiZGlzY2xvc3VyZS1jbG9zZWQiLCJkaXNjbG9zdXJlLW9wZW4iLCJkb2N1bWVudCIsImRvdC1kYXNoIiwiZG90LWRvdC1kYXNoIiwiZG90dGVkIiwiZG91YmxlIiwiZG93biIsImUtcmVzaXplIiwiZWFzZSIsImVhc2UtaW4iLCJlYXNlLWluLW91dCIsImVhc2Utb3V0IiwiZWxlbWVudCIsImVsbGlwc2UiLCJlbGxpcHNpcyIsImVtYmVkIiwiZW5kIiwiZXRoaW9waWMiLCJldGhpb3BpYy1hYmVnZWRlIiwiZXRoaW9waWMtYWJlZ2VkZS1hbS1ldCIsImV0aGlvcGljLWFiZWdlZGUtZ2V6IiwiZXRoaW9waWMtYWJlZ2VkZS10aS1lciIsImV0aGlvcGljLWFiZWdlZGUtdGktZXQiLCJldGhpb3BpYy1oYWxlaGFtZS1hYS1lciIsImV0aGlvcGljLWhhbGVoYW1lLWFhLWV0IiwiZXRoaW9waWMtaGFsZWhhbWUtYW0tZXQiLCJldGhpb3BpYy1oYWxlaGFtZS1nZXoiLCJldGhpb3BpYy1oYWxlaGFtZS1vbS1ldCIsImV0aGlvcGljLWhhbGVoYW1lLXNpZC1ldCIsImV0aGlvcGljLWhhbGVoYW1lLXNvLWV0IiwiZXRoaW9waWMtaGFsZWhhbWUtdGktZXIiLCJldGhpb3BpYy1oYWxlaGFtZS10aS1ldCIsImV0aGlvcGljLWhhbGVoYW1lLXRpZyIsImV0aGlvcGljLW51bWVyaWMiLCJldy1yZXNpemUiLCJleHBhbmRlZCIsImV4dGVuZHMiLCJleHRyYS1jb25kZW5zZWQiLCJleHRyYS1leHBhbmRlZCIsImZhbnRhc3kiLCJmYXN0IiwiZmlsbCIsImZpeGVkIiwiZmxhdCIsImZsZXgiLCJmb290bm90ZXMiLCJmb3J3YXJkcyIsImZyb20iLCJnZW9tZXRyaWNQcmVjaXNpb24iLCJnZW9yZ2lhbiIsImdyYXl0ZXh0IiwiZ3Jvb3ZlIiwiZ3VqYXJhdGkiLCJndXJtdWtoaSIsImhhbmQiLCJoYW5ndWwiLCJoYW5ndWwtY29uc29uYW50IiwiaGVicmV3IiwiaGVscCIsImhpZGRlbiIsImhpZGUiLCJoaWdoZXIiLCJoaWdobGlnaHQiLCJoaWdobGlnaHR0ZXh0IiwiaGlyYWdhbmEiLCJoaXJhZ2FuYS1pcm9oYSIsImhvcml6b250YWwiLCJoc2wiLCJoc2xhIiwiaWNvbiIsImlnbm9yZSIsImluYWN0aXZlYm9yZGVyIiwiaW5hY3RpdmVjYXB0aW9uIiwiaW5hY3RpdmVjYXB0aW9udGV4dCIsImluZmluaXRlIiwiaW5mb2JhY2tncm91bmQiLCJpbmZvdGV4dCIsImluaGVyaXQiLCJpbml0aWFsIiwiaW5saW5lIiwiaW5saW5lLWF4aXMiLCJpbmxpbmUtYmxvY2siLCJpbmxpbmUtZmxleCIsImlubGluZS10YWJsZSIsImluc2V0IiwiaW5zaWRlIiwiaW50cmluc2ljIiwiaW52ZXJ0IiwiaXRhbGljIiwiamFwYW5lc2UtZm9ybWFsIiwiamFwYW5lc2UtaW5mb3JtYWwiLCJqdXN0aWZ5Iiwia2FubmFkYSIsImthdGFrYW5hIiwia2F0YWthbmEtaXJvaGEiLCJrZWVwLWFsbCIsImtobWVyIiwia29yZWFuLWhhbmd1bC1mb3JtYWwiLCJrb3JlYW4taGFuamEtZm9ybWFsIiwia29yZWFuLWhhbmphLWluZm9ybWFsIiwibGFuZHNjYXBlIiwibGFvIiwibGFyZ2UiLCJsYXJnZXIiLCJsZWZ0IiwibGV2ZWwiLCJsaWdodGVyIiwibGluZS10aHJvdWdoIiwibGluZWFyIiwibGluZWFyLWdyYWRpZW50IiwibGluZXMiLCJsaXN0LWl0ZW0iLCJsaXN0Ym94IiwibGlzdGl0ZW0iLCJsb2NhbCIsImxvZ2ljYWwiLCJsb3VkIiwibG93ZXIiLCJsb3dlci1hbHBoYSIsImxvd2VyLWFybWVuaWFuIiwibG93ZXItZ3JlZWsiLCJsb3dlci1oZXhhZGVjaW1hbCIsImxvd2VyLWxhdGluIiwibG93ZXItbm9yd2VnaWFuIiwibG93ZXItcm9tYW4iLCJsb3dlcmNhc2UiLCJsdHIiLCJtYWxheWFsYW0iLCJtYXRjaCIsIm1hdHJpeCIsIm1hdHJpeDNkIiwibWVkaWEtY29udHJvbHMtYmFja2dyb3VuZCIsIm1lZGlhLWN1cnJlbnQtdGltZS1kaXNwbGF5IiwibWVkaWEtZnVsbHNjcmVlbi1idXR0b24iLCJtZWRpYS1tdXRlLWJ1dHRvbiIsIm1lZGlhLXBsYXktYnV0dG9uIiwibWVkaWEtcmV0dXJuLXRvLXJlYWx0aW1lLWJ1dHRvbiIsIm1lZGlhLXJld2luZC1idXR0b24iLCJtZWRpYS1zZWVrLWJhY2stYnV0dG9uIiwibWVkaWEtc2Vlay1mb3J3YXJkLWJ1dHRvbiIsIm1lZGlhLXNsaWRlciIsIm1lZGlhLXNsaWRlcnRodW1iIiwibWVkaWEtdGltZS1yZW1haW5pbmctZGlzcGxheSIsIm1lZGlhLXZvbHVtZS1zbGlkZXIiLCJtZWRpYS12b2x1bWUtc2xpZGVyLWNvbnRhaW5lciIsIm1lZGlhLXZvbHVtZS1zbGlkZXJ0aHVtYiIsIm1lZGl1bSIsIm1lbnUiLCJtZW51bGlzdCIsIm1lbnVsaXN0LWJ1dHRvbiIsIm1lbnVsaXN0LXRleHQiLCJtZW51bGlzdC10ZXh0ZmllbGQiLCJtZW51dGV4dCIsIm1lc3NhZ2UtYm94IiwibWlkZGxlIiwibWluLWludHJpbnNpYyIsIm1peCIsIm1vbmdvbGlhbiIsIm1vbm9zcGFjZSIsIm1vdmUiLCJtdWx0aXBsZSIsIm15YW5tYXIiLCJuLXJlc2l6ZSIsIm5hcnJvd2VyIiwibmUtcmVzaXplIiwibmVzdy1yZXNpemUiLCJuby1jbG9zZS1xdW90ZSIsIm5vLWRyb3AiLCJuby1vcGVuLXF1b3RlIiwibm8tcmVwZWF0Iiwibm9uZSIsIm5vcm1hbCIsIm5vdC1hbGxvd2VkIiwibm93cmFwIiwibnMtcmVzaXplIiwibnVtYmVycyIsIm51bWVyaWMiLCJudy1yZXNpemUiLCJud3NlLXJlc2l6ZSIsIm9ibGlxdWUiLCJvY3RhbCIsIm9wZW4tcXVvdGUiLCJvcHRpbWl6ZUxlZ2liaWxpdHkiLCJvcHRpbWl6ZVNwZWVkIiwib3JpeWEiLCJvcm9tbyIsIm91dHNldCIsIm91dHNpZGUiLCJvdXRzaWRlLXNoYXBlIiwib3ZlcmxheSIsIm92ZXJsaW5lIiwicGFkZGluZyIsInBhZGRpbmctYm94IiwicGFpbnRlZCIsInBhZ2UiLCJwYXVzZWQiLCJwZXJzaWFuIiwicGVyc3BlY3RpdmUiLCJwbHVzLWRhcmtlciIsInBsdXMtbGlnaHRlciIsInBvaW50ZXIiLCJwb2x5Z29uIiwicG9ydHJhaXQiLCJwcmUiLCJwcmUtbGluZSIsInByZS13cmFwIiwicHJlc2VydmUtM2QiLCJwcm9ncmVzcyIsInB1c2gtYnV0dG9uIiwicmFkaWFsLWdyYWRpZW50IiwicmFkaW8iLCJyZWFkLW9ubHkiLCJyZWFkLXdyaXRlIiwicmVhZC13cml0ZS1wbGFpbnRleHQtb25seSIsInJlY3RhbmdsZSIsInJlZ2lvbiIsInJlbGF0aXZlIiwicmVwZWF0IiwicmVwZWF0aW5nLWxpbmVhci1ncmFkaWVudCIsInJlcGVhdGluZy1yYWRpYWwtZ3JhZGllbnQiLCJyZXBlYXQteCIsInJlcGVhdC15IiwicmVzZXQiLCJyZXZlcnNlIiwicmdiIiwicmdiYSIsInJpZGdlIiwicmlnaHQiLCJyb3RhdGUiLCJyb3RhdGUzZCIsInJvdGF0ZVgiLCJyb3RhdGVZIiwicm90YXRlWiIsInJvdW5kIiwicm93LXJlc2l6ZSIsInJ0bCIsInJ1bi1pbiIsInJ1bm5pbmciLCJzLXJlc2l6ZSIsInNhbnMtc2VyaWYiLCJzY2FsZSIsInNjYWxlM2QiLCJzY2FsZVgiLCJzY2FsZVkiLCJzY2FsZVoiLCJzY3JvbGwiLCJzY3JvbGxiYXIiLCJzZS1yZXNpemUiLCJzZWFyY2hmaWVsZCIsInNlYXJjaGZpZWxkLWNhbmNlbC1idXR0b24iLCJzZWFyY2hmaWVsZC1kZWNvcmF0aW9uIiwic2VhcmNoZmllbGQtcmVzdWx0cy1idXR0b24iLCJzZWFyY2hmaWVsZC1yZXN1bHRzLWRlY29yYXRpb24iLCJzZW1pLWNvbmRlbnNlZCIsInNlbWktZXhwYW5kZWQiLCJzZXBhcmF0ZSIsInNlcmlmIiwic2hvdyIsInNpZGFtYSIsInNpbXAtY2hpbmVzZS1mb3JtYWwiLCJzaW1wLWNoaW5lc2UtaW5mb3JtYWwiLCJzaW5nbGUiLCJza2V3Iiwic2tld1giLCJza2V3WSIsInNraXAtd2hpdGUtc3BhY2UiLCJzbGlkZSIsInNsaWRlci1ob3Jpem9udGFsIiwic2xpZGVyLXZlcnRpY2FsIiwic2xpZGVydGh1bWItaG9yaXpvbnRhbCIsInNsaWRlcnRodW1iLXZlcnRpY2FsIiwic2xvdyIsInNtYWxsIiwic21hbGwtY2FwcyIsInNtYWxsLWNhcHRpb24iLCJzbWFsbGVyIiwic29saWQiLCJzb21hbGkiLCJzb3VyY2UtYXRvcCIsInNvdXJjZS1pbiIsInNvdXJjZS1vdXQiLCJzb3VyY2Utb3ZlciIsInNwYWNlIiwic3BlbGwtb3V0Iiwic3F1YXJlIiwic3F1YXJlLWJ1dHRvbiIsInN0YXJ0Iiwic3RhdGljIiwic3RhdHVzLWJhciIsInN0cmV0Y2giLCJzdHJva2UiLCJzdWIiLCJzdWJwaXhlbC1hbnRpYWxpYXNlZCIsInN1cGVyIiwic3ctcmVzaXplIiwic3ltYm9saWMiLCJzeW1ib2xzIiwidGFibGUiLCJ0YWJsZS1jYXB0aW9uIiwidGFibGUtY2VsbCIsInRhYmxlLWNvbHVtbiIsInRhYmxlLWNvbHVtbi1ncm91cCIsInRhYmxlLWZvb3Rlci1ncm91cCIsInRhYmxlLWhlYWRlci1ncm91cCIsInRhYmxlLXJvdyIsInRhYmxlLXJvdy1ncm91cCIsInRhbWlsIiwidGVsdWd1IiwidGV4dCIsInRleHQtYm90dG9tIiwidGV4dC10b3AiLCJ0ZXh0YXJlYSIsInRleHRmaWVsZCIsInRoYWkiLCJ0aGljayIsInRoaW4iLCJ0aHJlZWRkYXJrc2hhZG93IiwidGhyZWVkZmFjZSIsInRocmVlZGhpZ2hsaWdodCIsInRocmVlZGxpZ2h0c2hhZG93IiwidGhyZWVkc2hhZG93IiwidGliZXRhbiIsInRpZ3JlIiwidGlncmlueWEtZXIiLCJ0aWdyaW55YS1lci1hYmVnZWRlIiwidGlncmlueWEtZXQiLCJ0aWdyaW55YS1ldC1hYmVnZWRlIiwidG8iLCJ0b3AiLCJ0cmFkLWNoaW5lc2UtZm9ybWFsIiwidHJhZC1jaGluZXNlLWluZm9ybWFsIiwidHJhbnNsYXRlIiwidHJhbnNsYXRlM2QiLCJ0cmFuc2xhdGVYIiwidHJhbnNsYXRlWSIsInRyYW5zbGF0ZVoiLCJ0cmFuc3BhcmVudCIsInVsdHJhLWNvbmRlbnNlZCIsInVsdHJhLWV4cGFuZGVkIiwidW5kZXJsaW5lIiwidXAiLCJ1cHBlci1hbHBoYSIsInVwcGVyLWFybWVuaWFuIiwidXBwZXItZ3JlZWsiLCJ1cHBlci1oZXhhZGVjaW1hbCIsInVwcGVyLWxhdGluIiwidXBwZXItbm9yd2VnaWFuIiwidXBwZXItcm9tYW4iLCJ1cHBlcmNhc2UiLCJ1cmR1IiwidXJsIiwidmFyIiwidmVydGljYWwiLCJ2ZXJ0aWNhbC10ZXh0IiwidmlzaWJsZSIsInZpc2libGVGaWxsIiwidmlzaWJsZVBhaW50ZWQiLCJ2aXNpYmxlU3Ryb2tlIiwidmlzdWFsIiwidy1yZXNpemUiLCJ3YWl0Iiwid2F2ZSIsIndpZGVyIiwid2luZG93Iiwid2luZG93ZnJhbWUiLCJ3aW5kb3d0ZXh0Iiwid29yZHMiLCJ4LWxhcmdlIiwieC1zbWFsbCIsInhvciIsInh4LWxhcmdlIiwieHgtc21hbGwiLCJiaWN1YmljIiwib3B0aW1pemVzcGVlZCIsImdyYXlzY2FsZSIsInJvdyIsInJvdy1yZXZlcnNlIiwid3JhcCIsIndyYXAtcmV2ZXJzZSIsImNvbHVtbi1yZXZlcnNlIiwiZmxleC1zdGFydCIsImZsZXgtZW5kIiwic3BhY2UtYmV0d2VlbiIsInNwYWNlLWFyb3VuZCJdOwoKICB2YXIgd29yZE9wZXJhdG9yS2V5d29yZHNfID0gWyJpbiIsImFuZCIsIm9yIiwibm90IiwiaXMgbm90IiwiaXMgYSIsImlzIiwiaXNudCIsImRlZmluZWQiLCJpZiB1bmxlc3MiXSwKICAgICAgYmxvY2tLZXl3b3Jkc18gPSBbImZvciIsImlmIiwiZWxzZSIsInVubGVzcyIsICJmcm9tIiwgInRvIl0sCiAgICAgIGNvbW1vbkF0b21zXyA9IFsibnVsbCIsInRydWUiLCJmYWxzZSIsImhyZWYiLCJ0aXRsZSIsInR5cGUiLCJub3QtYWxsb3dlZCIsInJlYWRvbmx5IiwiZGlzYWJsZWQiXSwKICAgICAgY29tbW9uRGVmXyA9IFsiQGZvbnQtZmFjZSIsICJAa2V5ZnJhbWVzIiwgIkBtZWRpYSIsICJAdmlld3BvcnQiLCAiQHBhZ2UiLCAiQGhvc3QiLCAiQHN1cHBvcnRzIiwgIkBibG9jayIsICJAY3NzIl07CgogIHZhciBoaW50V29yZHMgPSB0YWdLZXl3b3Jkc18uY29uY2F0KGRvY3VtZW50VHlwZXNfLG1lZGlhVHlwZXNfLG1lZGlhRmVhdHVyZXNfLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5S2V5d29yZHNfLG5vblN0YW5kYXJkUHJvcGVydHlLZXl3b3Jkc18sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JLZXl3b3Jkc18sdmFsdWVLZXl3b3Jkc18sZm9udFByb3BlcnRpZXNfLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdvcmRPcGVyYXRvcktleXdvcmRzXyxibG9ja0tleXdvcmRzXywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tb25BdG9tc18sY29tbW9uRGVmXyk7CgogIGZ1bmN0aW9uIHdvcmRSZWdleHAod29yZHMpIHsKICAgIHdvcmRzID0gd29yZHMuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBiID4gYTt9KTsKICAgIHJldHVybiBuZXcgUmVnRXhwKCJeKCgiICsgd29yZHMuam9pbigiKXwoIikgKyAiKSlcXGIiKTsKICB9CgogIGZ1bmN0aW9uIGtleVNldChhcnJheSkgewogICAgdmFyIGtleXMgPSB7fTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyArK2kpIGtleXNbYXJyYXlbaV1dID0gdHJ1ZTsKICAgIHJldHVybiBrZXlzOwogIH0KCiAgZnVuY3Rpb24gZXNjYXBlUmVnRXhwKHRleHQpIHsKICAgIHJldHVybiB0ZXh0LnJlcGxhY2UoL1stW1xde30oKSorPy4sXFxeJHwjXHNdL2csICJcXCQmIik7CiAgfQoKICBDb2RlTWlycm9yLnJlZ2lzdGVySGVscGVyKCJoaW50V29yZHMiLCAic3R5bHVzIiwgaGludFdvcmRzKTsKICBDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveC1zdHlsIiwgInN0eWx1cyIpOwp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/swift/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/swift/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogU3dpZnQgbW9kZTwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uLy4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxzY3JpcHQgc3JjPSIuLi8uLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi8uLi9hZGRvbi9lZGl0L21hdGNoYnJhY2tldHMuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi9zd2lmdC5qcyI+PC9zY3JpcHQ+CjxzdHlsZT4KCS5Db2RlTWlycm9yIHsgYm9yZGVyOiAycHggaW5zZXQgI2RlZTsgfQogICAgPC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aDE+Q29kZU1pcnJvcjwvaDE+PGltZyBpZD1sb2dvIHNyYz0iLi4vLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+TGFuZ3VhZ2UgbW9kZXM8L2E+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPlN3aWZ0PC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5Td2lmdCBtb2RlPC9oMj4KPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KLy8KLy8gIFRpcENhbGN1bGF0b3JNb2RlbC5zd2lmdAovLyAgVGlwQ2FsY3VsYXRvcgovLwovLyAgQ3JlYXRlZCBieSBNYWluIEFjY291bnQgb24gMTIvMTgvMTQuCi8vICBDb3B5cmlnaHQgKGMpIDIwMTQgUmF6ZXdhcmUgTExDLiBBbGwgcmlnaHRzIHJlc2VydmVkLgovLwoKaW1wb3J0IEZvdW5kYXRpb24KCmNsYXNzIFRpcENhbGN1bGF0b3JNb2RlbCB7CgogIHZhciB0b3RhbDogRG91YmxlCiAgdmFyIHRheFBjdDogRG91YmxlCiAgdmFyIHN1YnRvdGFsOiBEb3VibGUgewogICAgZ2V0IHsKICAgICAgcmV0dXJuIHRvdGFsIC8gKHRheFBjdCArIDEpCiAgICB9CiAgfQoKICBpbml0KHRvdGFsOiBEb3VibGUsIHRheFBjdDogRG91YmxlKSB7CiAgICBzZWxmLnRvdGFsID0gdG90YWwKICAgIHNlbGYudGF4UGN0ID0gdGF4UGN0CiAgfQoKICBmdW5jIGNhbGNUaXBXaXRoVGlwUGN0KHRpcFBjdDogRG91YmxlKSAtPiBEb3VibGUgewogICAgcmV0dXJuIHN1YnRvdGFsICogdGlwUGN0CiAgfQoKICBmdW5jIHJldHVyblBvc3NpYmxlVGlwcygpIC0+IFtJbnQ6IERvdWJsZV0gewoKICAgIGxldCBwb3NzaWJsZVRpcHNJbmZlcnJlZCA9IFswLjE1LCAwLjE4LCAwLjIwXQogICAgbGV0IHBvc3NpYmxlVGlwc0V4cGxpY2l0OltEb3VibGVdID0gWzAuMTUsIDAuMTgsIDAuMjBdCgogICAgdmFyIHJldHZhbCA9IFtJbnQ6IERvdWJsZV0oKQogICAgZm9yIHBvc3NpYmxlVGlwIGluIHBvc3NpYmxlVGlwc0luZmVycmVkIHsKICAgICAgbGV0IGludFBjdCA9IEludChwb3NzaWJsZVRpcCoxMDApCiAgICAgIHJldHZhbFtpbnRQY3RdID0gY2FsY1RpcFdpdGhUaXBQY3QocG9zc2libGVUaXApCiAgICB9CiAgICByZXR1cm4gcmV0dmFsCgogIH0KCn0KPC90ZXh0YXJlYT48L2Zvcm0+CgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgICAgICBtYXRjaEJyYWNrZXRzOiB0cnVlLAogICAgICAgIG1vZGU6ICJ0ZXh0L3gtc3dpZnQiCiAgICAgIH0pOwogICAgPC9zY3JpcHQ+CgogICAgPHA+QSBzaW1wbGUgbW9kZSBmb3IgU3dpZnQ8L3A+CgogICAgPHA+PHN0cm9uZz5NSU1FIHR5cGVzIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPnRleHQveC1zd2lmdDwvY29kZT4gKFN3aWZ0IGNvZGUpPC9wPgogIDwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/swift/swift.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovLyBTd2lmdCBtb2RlIGNyZWF0ZWQgYnkgTWljaGFlbCBLYW1pbnNreSBodHRwczovL2dpdGh1Yi5jb20vbWthbWluc2t5MTEKCihmdW5jdGlvbihtb2QpIHsKICBpZiAodHlwZW9mIGV4cG9ydHMgPT0gIm9iamVjdCIgJiYgdHlwZW9mIG1vZHVsZSA9PSAib2JqZWN0IikKICAgIG1vZChyZXF1aXJlKCIuLi8uLi9saWIvY29kZW1pcnJvciIpKQogIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kKQogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKQogIGVsc2UKICAgIG1vZChDb2RlTWlycm9yKQp9KShmdW5jdGlvbihDb2RlTWlycm9yKSB7CiAgInVzZSBzdHJpY3QiCgogIGZ1bmN0aW9uIHdvcmRTZXQod29yZHMpIHsKICAgIHZhciBzZXQgPSB7fQogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB3b3Jkcy5sZW5ndGg7IGkrKykgc2V0W3dvcmRzW2ldXSA9IHRydWUKICAgIHJldHVybiBzZXQKICB9CgogIHZhciBrZXl3b3JkcyA9IHdvcmRTZXQoWyJfIiwidmFyIiwibGV0IiwiY2xhc3MiLCJlbnVtIiwiZXh0ZW5zaW9uIiwiaW1wb3J0IiwicHJvdG9jb2wiLCJzdHJ1Y3QiLCJmdW5jIiwidHlwZWFsaWFzIiwiYXNzb2NpYXRlZHR5cGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJvcGVuIiwicHVibGljIiwiaW50ZXJuYWwiLCJmaWxlcHJpdmF0ZSIsInByaXZhdGUiLCJkZWluaXQiLCJpbml0IiwibmV3Iiwib3ZlcnJpZGUiLCJzZWxmIiwic3Vic2NyaXB0Iiwic3VwZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJjb252ZW5pZW5jZSIsImR5bmFtaWMiLCJmaW5hbCIsImluZGlyZWN0IiwibGF6eSIsInJlcXVpcmVkIiwic3RhdGljIiwidW5vd25lZCIsInVub3duZWQoc2FmZSkiLCJ1bm93bmVkKHVuc2FmZSkiLCJ3ZWFrIiwiYXMiLCJpcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgImJyZWFrIiwiY2FzZSIsImNvbnRpbnVlIiwiZGVmYXVsdCIsImVsc2UiLCJmYWxsdGhyb3VnaCIsImZvciIsImd1YXJkIiwiaWYiLCJpbiIsInJlcGVhdCIsInN3aXRjaCIsIndoZXJlIiwid2hpbGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJkZWZlciIsInJldHVybiIsImlub3V0IiwibXV0YXRpbmciLCJub25tdXRhdGluZyIsImNhdGNoIiwiZG8iLCJyZXRocm93cyIsInRocm93IiwidGhyb3dzIiwidHJ5IiwiZGlkU2V0IiwiZ2V0Iiwic2V0Iiwid2lsbFNldCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgImFzc2lnbm1lbnQiLCJhc3NvY2lhdGl2aXR5IiwiaW5maXgiLCJsZWZ0Iiwibm9uZSIsIm9wZXJhdG9yIiwicG9zdGZpeCIsInByZWNlZGVuY2UiLCJwcmVjZWRlbmNlZ3JvdXAiLCJwcmVmaXgiLCJyaWdodCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIkFueSIsIkFueU9iamVjdCIsIlR5cGUiLCJkeW5hbWljVHlwZSIsIlNlbGYiLCJQcm90b2NvbCIsIl9fQ09MVU1OX18iLCJfX0ZJTEVfXyIsIl9fRlVOQ1RJT05fXyIsIl9fTElORV9fIl0pCiAgdmFyIGRlZmluaW5nS2V5d29yZHMgPSB3b3JkU2V0KFsidmFyIiwibGV0IiwiY2xhc3MiLCJlbnVtIiwiZXh0ZW5zaW9uIiwiaW1wb3J0IiwicHJvdG9jb2wiLCJzdHJ1Y3QiLCJmdW5jIiwidHlwZWFsaWFzIiwiYXNzb2NpYXRlZHR5cGUiXSkKICB2YXIgYXRvbXMgPSB3b3JkU2V0KFsidHJ1ZSIsImZhbHNlIiwibmlsIiwic2VsZiIsInN1cGVyIiwiXyJdKQogIHZhciB0eXBlcyA9IHdvcmRTZXQoWyJBcnJheSIsIkJvb2wiLCJEaWN0aW9uYXJ5IiwiRG91YmxlIiwiRmxvYXQiLCJJbnQiLCJOZXZlciIsIk9wdGlvbmFsIiwiU3RyaW5nIiwiVm9pZCJdKQogIHZhciBvcGVyYXRvcnMgPSAiKy0vKiU9fCY8PiIKICB2YXIgcHVuYyA9ICI7LC4oKXt9W10iCiAgdmFyIG51bWJlciA9IC9eLT8oPzooPzpbXGRfXStcLltfXGRdKnxcLltfXGRdK3wwb1swLTdfXC5dK3wwYlswMV9cLl0rKSg/OmUtP1tcZF9dKyk/fDB4W1xkX2EtZlwuXSsoPzpwLT9bXGRfXSspPykvaQogIHZhciBpZGVudGlmaWVyID0gL15bX0EtWmEteiRdW19BLVphLXokMC05XSovCiAgdmFyIHByb3BlcnR5ID0gL15bQFwjXC5dW19BLVphLXokXVtfQS1aYS16JDAtOV0qLwogIHZhciByZWdleHAgPSAvXlwvKD8hXHMpKD86XC9cLyk/KD86XFwufFteXC9dKStcLy8KCiAgZnVuY3Rpb24gdG9rZW5CYXNlKHN0cmVhbSwgc3RhdGUsIHByZXYpIHsKICAgIGlmIChzdHJlYW0uc29sKCkpIHN0YXRlLmluZGVudGVkID0gc3RyZWFtLmluZGVudGF0aW9uKCkKICAgIGlmIChzdHJlYW0uZWF0U3BhY2UoKSkgcmV0dXJuIG51bGwKCiAgICB2YXIgY2ggPSBzdHJlYW0ucGVlaygpCiAgICBpZiAoY2ggPT0gIi8iKSB7CiAgICAgIGlmIChzdHJlYW0ubWF0Y2goIi8vIikpIHsKICAgICAgICBzdHJlYW0uc2tpcFRvRW5kKCkKICAgICAgICByZXR1cm4gImNvbW1lbnQiCiAgICAgIH0KICAgICAgaWYgKHN0cmVhbS5tYXRjaCgiLyoiKSkgewogICAgICAgIHN0YXRlLnRva2VuaXplLnB1c2godG9rZW5Db21tZW50KQogICAgICAgIHJldHVybiB0b2tlbkNvbW1lbnQoc3RyZWFtLCBzdGF0ZSkKICAgICAgfQogICAgICBpZiAoc3RyZWFtLm1hdGNoKHJlZ2V4cCkpIHJldHVybiAic3RyaW5nLTIiCiAgICB9CiAgICBpZiAob3BlcmF0b3JzLmluZGV4T2YoY2gpID4gLTEpIHsKICAgICAgc3RyZWFtLm5leHQoKQogICAgICByZXR1cm4gIm9wZXJhdG9yIgogICAgfQogICAgaWYgKHB1bmMuaW5kZXhPZihjaCkgPiAtMSkgewogICAgICBzdHJlYW0ubmV4dCgpCiAgICAgIHN0cmVhbS5tYXRjaCgiLi4iKQogICAgICByZXR1cm4gInB1bmN0dWF0aW9uIgogICAgfQogICAgaWYgKGNoID09ICciJyB8fCBjaCA9PSAiJyIpIHsKICAgICAgc3RyZWFtLm5leHQoKQogICAgICB2YXIgdG9rZW5pemUgPSB0b2tlblN0cmluZyhjaCkKICAgICAgc3RhdGUudG9rZW5pemUucHVzaCh0b2tlbml6ZSkKICAgICAgcmV0dXJuIHRva2VuaXplKHN0cmVhbSwgc3RhdGUpCiAgICB9CgogICAgaWYgKHN0cmVhbS5tYXRjaChudW1iZXIpKSByZXR1cm4gIm51bWJlciIKICAgIGlmIChzdHJlYW0ubWF0Y2gocHJvcGVydHkpKSByZXR1cm4gInByb3BlcnR5IgoKICAgIGlmIChzdHJlYW0ubWF0Y2goaWRlbnRpZmllcikpIHsKICAgICAgdmFyIGlkZW50ID0gc3RyZWFtLmN1cnJlbnQoKQogICAgICBpZiAoa2V5d29yZHMuaGFzT3duUHJvcGVydHkoaWRlbnQpKSB7CiAgICAgICAgaWYgKGRlZmluaW5nS2V5d29yZHMuaGFzT3duUHJvcGVydHkoaWRlbnQpKQogICAgICAgICAgc3RhdGUucHJldiA9ICJkZWZpbmUiCiAgICAgICAgcmV0dXJuICJrZXl3b3JkIgogICAgICB9CiAgICAgIGlmICh0eXBlcy5oYXNPd25Qcm9wZXJ0eShpZGVudCkpIHJldHVybiAidmFyaWFibGUtMiIKICAgICAgaWYgKGF0b21zLmhhc093blByb3BlcnR5KGlkZW50KSkgcmV0dXJuICJhdG9tIgogICAgICBpZiAocHJldiA9PSAiZGVmaW5lIikgcmV0dXJuICJkZWYiCiAgICAgIHJldHVybiAidmFyaWFibGUiCiAgICB9CgogICAgc3RyZWFtLm5leHQoKQogICAgcmV0dXJuIG51bGwKICB9CgogIGZ1bmN0aW9uIHRva2VuVW50aWxDbG9zaW5nUGFyZW4oKSB7CiAgICB2YXIgZGVwdGggPSAwCiAgICByZXR1cm4gZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSwgcHJldikgewogICAgICB2YXIgaW5uZXIgPSB0b2tlbkJhc2Uoc3RyZWFtLCBzdGF0ZSwgcHJldikKICAgICAgaWYgKGlubmVyID09ICJwdW5jdHVhdGlvbiIpIHsKICAgICAgICBpZiAoc3RyZWFtLmN1cnJlbnQoKSA9PSAiKCIpICsrZGVwdGgKICAgICAgICBlbHNlIGlmIChzdHJlYW0uY3VycmVudCgpID09ICIpIikgewogICAgICAgICAgaWYgKGRlcHRoID09IDApIHsKICAgICAgICAgICAgc3RyZWFtLmJhY2tVcCgxKQogICAgICAgICAgICBzdGF0ZS50b2tlbml6ZS5wb3AoKQogICAgICAgICAgICByZXR1cm4gc3RhdGUudG9rZW5pemVbc3RhdGUudG9rZW5pemUubGVuZ3RoIC0gMV0oc3RyZWFtLCBzdGF0ZSkKICAgICAgICAgIH0KICAgICAgICAgIGVsc2UgLS1kZXB0aAogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gaW5uZXIKICAgIH0KICB9CgogIGZ1bmN0aW9uIHRva2VuU3RyaW5nKHF1b3RlKSB7CiAgICByZXR1cm4gZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICB2YXIgY2gsIGVzY2FwZWQgPSBmYWxzZQogICAgICB3aGlsZSAoY2ggPSBzdHJlYW0ubmV4dCgpKSB7CiAgICAgICAgaWYgKGVzY2FwZWQpIHsKICAgICAgICAgIGlmIChjaCA9PSAiKCIpIHsKICAgICAgICAgICAgc3RhdGUudG9rZW5pemUucHVzaCh0b2tlblVudGlsQ2xvc2luZ1BhcmVuKCkpCiAgICAgICAgICAgIHJldHVybiAic3RyaW5nIgogICAgICAgICAgfQogICAgICAgICAgZXNjYXBlZCA9IGZhbHNlCiAgICAgICAgfSBlbHNlIGlmIChjaCA9PSBxdW90ZSkgewogICAgICAgICAgYnJlYWsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZXNjYXBlZCA9IGNoID09ICJcXCIKICAgICAgICB9CiAgICAgIH0KICAgICAgc3RhdGUudG9rZW5pemUucG9wKCkKICAgICAgcmV0dXJuICJzdHJpbmciCiAgICB9CiAgfQoKICBmdW5jdGlvbiB0b2tlbkNvbW1lbnQoc3RyZWFtLCBzdGF0ZSkgewogICAgc3RyZWFtLm1hdGNoKC9eKD86W14qXXxcKig/IVwvKSkqLykKICAgIGlmIChzdHJlYW0ubWF0Y2goIiovIikpIHN0YXRlLnRva2VuaXplLnBvcCgpCiAgICByZXR1cm4gImNvbW1lbnQiCiAgfQoKICBmdW5jdGlvbiBDb250ZXh0KHByZXYsIGFsaWduLCBpbmRlbnRlZCkgewogICAgdGhpcy5wcmV2ID0gcHJldgogICAgdGhpcy5hbGlnbiA9IGFsaWduCiAgICB0aGlzLmluZGVudGVkID0gaW5kZW50ZWQKICB9CgogIGZ1bmN0aW9uIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0pIHsKICAgIHZhciBhbGlnbiA9IHN0cmVhbS5tYXRjaCgvXlxzKigkfFwvW1wvXCpdKS8sIGZhbHNlKSA/IG51bGwgOiBzdHJlYW0uY29sdW1uKCkgKyAxCiAgICBzdGF0ZS5jb250ZXh0ID0gbmV3IENvbnRleHQoc3RhdGUuY29udGV4dCwgYWxpZ24sIHN0YXRlLmluZGVudGVkKQogIH0KCiAgZnVuY3Rpb24gcG9wQ29udGV4dChzdGF0ZSkgewogICAgaWYgKHN0YXRlLmNvbnRleHQpIHsKICAgICAgc3RhdGUuaW5kZW50ZWQgPSBzdGF0ZS5jb250ZXh0LmluZGVudGVkCiAgICAgIHN0YXRlLmNvbnRleHQgPSBzdGF0ZS5jb250ZXh0LnByZXYKICAgIH0KICB9CgogIENvZGVNaXJyb3IuZGVmaW5lTW9kZSgic3dpZnQiLCBmdW5jdGlvbihjb25maWcpIHsKICAgIHJldHVybiB7CiAgICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICBwcmV2OiBudWxsLAogICAgICAgICAgY29udGV4dDogbnVsbCwKICAgICAgICAgIGluZGVudGVkOiAwLAogICAgICAgICAgdG9rZW5pemU6IFtdCiAgICAgICAgfQogICAgICB9LAoKICAgICAgdG9rZW46IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgICB2YXIgcHJldiA9IHN0YXRlLnByZXYKICAgICAgICBzdGF0ZS5wcmV2ID0gbnVsbAogICAgICAgIHZhciB0b2tlbml6ZSA9IHN0YXRlLnRva2VuaXplW3N0YXRlLnRva2VuaXplLmxlbmd0aCAtIDFdIHx8IHRva2VuQmFzZQogICAgICAgIHZhciBzdHlsZSA9IHRva2VuaXplKHN0cmVhbSwgc3RhdGUsIHByZXYpCiAgICAgICAgaWYgKCFzdHlsZSB8fCBzdHlsZSA9PSAiY29tbWVudCIpIHN0YXRlLnByZXYgPSBwcmV2CiAgICAgICAgZWxzZSBpZiAoIXN0YXRlLnByZXYpIHN0YXRlLnByZXYgPSBzdHlsZQoKICAgICAgICBpZiAoc3R5bGUgPT0gInB1bmN0dWF0aW9uIikgewogICAgICAgICAgdmFyIGJyYWNrZXQgPSAvW1woXFtce118KFtcXVwpXH1dKS8uZXhlYyhzdHJlYW0uY3VycmVudCgpKQogICAgICAgICAgaWYgKGJyYWNrZXQpIChicmFja2V0WzFdID8gcG9wQ29udGV4dCA6IHB1c2hDb250ZXh0KShzdGF0ZSwgc3RyZWFtKQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHN0eWxlCiAgICAgIH0sCgogICAgICBpbmRlbnQ6IGZ1bmN0aW9uKHN0YXRlLCB0ZXh0QWZ0ZXIpIHsKICAgICAgICB2YXIgY3ggPSBzdGF0ZS5jb250ZXh0CiAgICAgICAgaWYgKCFjeCkgcmV0dXJuIDAKICAgICAgICB2YXIgY2xvc2luZyA9IC9eW1xdXH1cKV0vLnRlc3QodGV4dEFmdGVyKQogICAgICAgIGlmIChjeC5hbGlnbiAhPSBudWxsKSByZXR1cm4gY3guYWxpZ24gLSAoY2xvc2luZyA/IDEgOiAwKQogICAgICAgIHJldHVybiBjeC5pbmRlbnRlZCArIChjbG9zaW5nID8gMCA6IGNvbmZpZy5pbmRlbnRVbml0KQogICAgICB9LAoKICAgICAgZWxlY3RyaWNJbnB1dDogL15ccypbXClcfVxdXSQvLAoKICAgICAgbGluZUNvbW1lbnQ6ICIvLyIsCiAgICAgIGJsb2NrQ29tbWVudFN0YXJ0OiAiLyoiLAogICAgICBibG9ja0NvbW1lbnRFbmQ6ICIqLyIKICAgIH0KICB9KQoKICBDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveC1zd2lmdCIsInN3aWZ0IikKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/tcl/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/tcl/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogVGNsIG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL3RoZW1lL25pZ2h0LmNzcyI+CjxzY3JpcHQgc3JjPSIuLi8uLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJ0Y2wuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vLi4vYWRkb24vc2Nyb2xsL3Njcm9sbHBhc3RlbmQuanMiPjwvc2NyaXB0Pgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxoMT5Db2RlTWlycm9yPC9oMT48aW1nIGlkPWxvZ28gc3JjPSIuLi8uLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5MYW5ndWFnZSBtb2RlczwvYT4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+VGNsPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5UY2wgbW9kZTwvaDI+Cjxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyMgICMjICAgICB3aG9pcy50Y2wgZm9yIGVnZ2Ryb3AgYnkgRm9yZF9MYXdubW93ZXIgaXJjLmdlZWtzaGVkLm5ldCAjU2NyaXB0LUhlbHAgICAgICAgICMjICAjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjIFRvIHVzZSB0aGlzIHNjcmlwdCB5b3UgbXVzdCBzZXQgY2hhbm5lbCBmbGFnICt3aG9pcyAoaWUgLmNoYW5zZXQgI2NoYW4gK3dob2lzKSAgICAgICAgICAgIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIyAgICAgIF9fX18gICAgICAgICAgICAgICAgX18gICAgICAgICAgICAgICAgICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgICMjCiMjICAgICAvIF9fL19fXyBfIF9fXyBfIF9fXy8gL19fX18gX19fICAgX19fICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgIyMKIyMgICAgLyBfLyAvIF8gYC8vIF8gYC8vIF8gIC8vIF9fLy8gXyBcIC8gXyBcICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICAjIwojIyAgIC9fX18vIFxfLCAvIFxfLCAvIFxfLF8vL18vICAgXF9fXy8vIC5fXy8gICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMgICMjCiMjICAgICAgICAvX19fLyAvX19fLyAgICAgICAgICAgICAgICAgL18vICAgICAgIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyAgIyMKIyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjICAjIwojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjICAjIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhcnQgU2V0dXAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyAgIyMKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwpuYW1lc3BhY2UgZXZhbCB3aG9pcyB7CiMjIGNoYW5nZSBjbWRjaGFyIHRvIHRoZSB0cmlnZ2VyIHlvdSB3YW50IHRvIHVzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIyAgIyMKICB2YXJpYWJsZSBjbWRjaGFyICIhIgojIyBjaGFuZ2UgY29tbWFuZCB0byB0aGUgd29yZCB0cmlnZ2VyIHlvdSB3b3VsZCBsaWtlIHRvIHVzZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMgICMjCiMjIEtlZXAgaW4gbWluZCwgVGhpcyB3aWxsIGFsc28gY2hhbmdlIHRoZSAuY2hhbnNldCArLy1jb21tYW5kICAgICAgICAgICAgICAgICAgICAgICAgICAjIyAgIyMKICB2YXJpYWJsZSBjb21tYW5kICJ3aG9pcyIKIyMgY2hhbmdlIHRleHRmIHRvIHRoZSBjb2xvcnMgeW91IHdhbnQgZm9yIHRoZSB0ZXh0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjICAjIwogIHZhcmlhYmxlIHRleHRmICJcMDE3XDAwMzA0IgojIyBjaGFuZ2UgdGFnZiB0byB0aGUgY29sb3JzIHlvdSB3YW50IGZvciB0YWdzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyMgICMjCiAgdmFyaWFibGUgdGFnZiAiXDAxN1wwMDIiCiMjIENoYW5nZSBsb2dvIHRvIHRoZSBsb2dvIHlvdSB3YW50IGF0IHRoZSBzdGFydCBvZiB0aGUgbGluZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAjIyAgIyMKICB2YXJpYWJsZSBsb2dvICJcMDE3XDAwMzA0XDAwMlxbXDAwMzA2V1wwMDNob2lzXDAwMzA0XF1cMDE3IgojIyBDaGFuZ2UgbGluZW91dCB0byB0aGUgcmVzdWx0cyB5b3Ugd2FudC4gVmFsaWQgcmVzdWx0cyBhcmUgY2hhbm5lbCB1c2VycyBtb2RlcyB0b3BpYyAgIyMgICMjCiAgdmFyaWFibGUgbGluZW91dCAiY2hhbm5lbCB1c2VycyBtb2RlcyB0b3BpYyIKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIyAgIyMgICAgICAgICAgICAgICAgICAgICAgICAgICBFbmQgU2V0dXAuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjICMjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICB2YXJpYWJsZSBjaGFubmVsICIiCiAgc2V0dWRlZiBmbGFnICR3aG9pczo6Y29tbWFuZAogIGJpbmQgcHViIC18LSBbc3RyaW5nIHRyaW1sZWZ0ICR3aG9pczo6Y21kY2hhcl0ke3dob2lzOjpjb21tYW5kfSB3aG9pczo6bGlzdAogIGJpbmQgcmF3IC18LSAiMzExIiB3aG9pczo6MzExCiAgYmluZCByYXcgLXwtICIzMTIiIHdob2lzOjozMTIKICBiaW5kIHJhdyAtfC0gIjMxOSIgd2hvaXM6OjMxOQogIGJpbmQgcmF3IC18LSAiMzE3IiB3aG9pczo6MzE3CiAgYmluZCByYXcgLXwtICIzMTMiIHdob2lzOjptdWx0aQogIGJpbmQgcmF3IC18LSAiMzEwIiB3aG9pczo6bXVsdGkKICBiaW5kIHJhdyAtfC0gIjMzNSIgd2hvaXM6Om11bHRpCiAgYmluZCByYXcgLXwtICIzMDEiIHdob2lzOjozMDEKICBiaW5kIHJhdyAtfC0gIjY3MSIgd2hvaXM6Om11bHRpCiAgYmluZCByYXcgLXwtICIzMjAiIHdob2lzOjptdWx0aQogIGJpbmQgcmF3IC18LSAiNDAxIiB3aG9pczo6bXVsdGkKICBiaW5kIHJhdyAtfC0gIjMxOCIgd2hvaXM6OjMxOAogIGJpbmQgcmF3IC18LSAiMzA3IiB3aG9pczo6MzA3Cn0KcHJvYyB3aG9pczo6MzExIHtmcm9tIGtleSB0ZXh0fSB7CiAgaWYge1tyZWdleHAgLS0ge15bXlxzXStccyguKz8pXHMoLis/KVxzKC4rPylcc1wqXHNcOiguKykkfSAkdGV4dCB3aG9sZW1hdGNoIG5pY2sgaWRlbnQgaG9zdCByZWFsbmFtZV19IHsKICAgIHB1dHNlcnYgIlBSSVZNU0cgJHdob2lzOjpjaGFubmVsIDoke3dob2lzOjpsb2dvfSAke3dob2lzOjp0YWdmfUhvc3Q6JHt3aG9pczo6dGV4dGZ9IFwKICAgICAgICAkbmljayBcKCR7aWRlbnR9QCR7aG9zdH1cKSAke3dob2lzOjp0YWdmfVJlYWxuYW1lOiR7d2hvaXM6OnRleHRmfSAkcmVhbG5hbWUiCiAgfQp9CnByb2Mgd2hvaXM6Om11bHRpIHtmcm9tIGtleSB0ZXh0fSB7CiAgaWYge1tyZWdleHAge1w6KC4qKSR9ICR0ZXh0IG1hdGNoICRrZXldfSB7CiAgICBwdXRzZXJ2ICJQUklWTVNHICR3aG9pczo6Y2hhbm5lbCA6JHt3aG9pczo6bG9nb30gJHt3aG9pczo6dGFnZn1Ob3RlOiR7d2hvaXM6OnRleHRmfSBbc3Vic3QgJCRrZXldIgogICAgICAgIHJldHVybiAxCiAgfQp9CnByb2Mgd2hvaXM6OjMxMiB7ZnJvbSBrZXkgdGV4dH0gewogIHJlZ2V4cCB7KFteXHNdKylcc1w6fSAkdGV4dCBtYXRjaCBzZXJ2ZXIKICBwdXRzZXJ2ICJQUklWTVNHICR3aG9pczo6Y2hhbm5lbCA6JHt3aG9pczo6bG9nb30gJHt3aG9pczo6dGFnZn1TZXJ2ZXI6JHt3aG9pczo6dGV4dGZ9ICRzZXJ2ZXIiCn0KcHJvYyB3aG9pczo6MzE5IHtmcm9tIGtleSB0ZXh0fSB7CiAgaWYge1tyZWdleHAgey4rXDooLispJH0gJHRleHQgbWF0Y2ggY2hhbm5lbHNdfSB7CiAgICBwdXRzZXJ2ICJQUklWTVNHICR3aG9pczo6Y2hhbm5lbCA6JHt3aG9pczo6bG9nb30gJHt3aG9pczo6dGFnZn1DaGFubmVsczoke3dob2lzOjp0ZXh0Zn0gJGNoYW5uZWxzIgogIH0KfQpwcm9jIHdob2lzOjozMTcge2Zyb20ga2V5IHRleHR9IHsKICBpZiB7W3JlZ2V4cCAtLSB7LipccyhcZCspXHMoXGQrKVxzXDp9ICR0ZXh0IHdob2xlbWF0Y2ggaWRsZSBzaWdub25dfSB7CiAgICBwdXRzZXJ2ICJQUklWTVNHICR3aG9pczo6Y2hhbm5lbCA6JHt3aG9pczo6bG9nb30gJHt3aG9pczo6dGFnZn1Db25uZWN0ZWQ6JHt3aG9pczo6dGV4dGZ9IFwKICAgICAgICBbY3RpbWUgJHNpZ25vbl0gJHt3aG9pczo6dGFnZn1JZGxlOiR7d2hvaXM6OnRleHRmfSBbZHVyYXRpb24gJGlkbGVdIgogIH0KfQpwcm9jIHdob2lzOjozMDEge2Zyb20ga2V5IHRleHR9IHsKICBpZiB7W3JlZ2V4cCB7Xi4rXHNbXlxzXStcc1w6KC4qKSR9ICR0ZXh0IG1hdGNoIGF3YXltc2ddfSB7CiAgICBwdXRzZXJ2ICJQUklWTVNHICR3aG9pczo6Y2hhbm5lbCA6JHt3aG9pczo6bG9nb30gJHt3aG9pczo6dGFnZn1Bd2F5OiR7d2hvaXM6OnRleHRmfSAkYXdheW1zZyIKICB9Cn0KcHJvYyB3aG9pczo6MzE4IHtmcm9tIGtleSB0ZXh0fSB7CiAgbmFtZXNwYWNlIGV2YWwgd2hvaXMgewogICAgICAgIHZhcmlhYmxlIGNoYW5uZWwgIiIKICB9CiAgdmFyaWFibGUgd2hvaXM6OmNoYW5uZWwgIiIKfQpwcm9jIHdob2lzOjozMDcge2Zyb20ga2V5IHRleHR9IHsKICBwdXRzZXJ2ICJQUklWTVNHICR3aG9pczo6Y2hhbm5lbCA6JHt3aG9pczo6bG9nb30gJHt3aG9pczo6dGFnZn1TZXJ2aWNlczoke3dob2lzOjp0ZXh0Zn0gUmVnaXN0ZXJlZCBOaWNrIgp9CnByb2Mgd2hvaXM6Omxpc3Qge25pY2sgaG9zdCBoYW5kIGNoYW4gdGV4dH0gewogIGlmIHtbbHNlYXJjaCAtZXhhY3QgW2NoYW5uZWwgaW5mbyAkY2hhbl0gIiske3dob2lzOjpjb21tYW5kfSJdICE9IC0xfSB7CiAgICBuYW1lc3BhY2UgZXZhbCB3aG9pcyB7CiAgICAgICAgICB2YXJpYWJsZSBjaGFubmVsICIiCiAgICAgICAgfQogICAgdmFyaWFibGUgd2hvaXM6OmNoYW5uZWwgJGNoYW4KICAgIHB1dHNlcnYgIldIT0lTICR0ZXh0IgogIH0KfQpwdXRsb2cgIlwwMDIqTG9hZGVkKiBcMDE3XDAwMzA0XDAwMlxbXDAwMzA2V1wwMDNob2lzXDAwMzA0XF1cMDE3IFwwMDJieSBcCkZvcmRfTGF3bm1vd2VyIGlyYy5HZWVrU2hlZC5uZXQgI1NjcmlwdC1IZWxwIgo8L3RleHRhcmVhPjwvZm9ybT4KICAgIDxzY3JpcHQ+CiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICAgICAgdGhlbWU6ICJuaWdodCIsCiAgICAgICAgbGluZU51bWJlcnM6IHRydWUsCiAgICAgICAgaW5kZW50VW5pdDogMiwKICAgICAgICBzY3JvbGxQYXN0RW5kOiB0cnVlLAogICAgICAgIG1vZGU6ICJ0ZXh0L3gtdGNsIgogICAgICB9KTsKICAgIDwvc2NyaXB0PgoKICAgIDxwPjxzdHJvbmc+TUlNRSB0eXBlcyBkZWZpbmVkOjwvc3Ryb25nPiA8Y29kZT50ZXh0L3gtdGNsPC9jb2RlPi48L3A+CgogIDwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/tcl/tcl.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovL3RjbCBtb2RlIGJ5IEZvcmRfTGF3bm1vd2VyIDo6IEJhc2VkIG9uIFZlbG9jaXR5IG1vZGUgYnkgU3RldmUgTydIYXJhCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJ0Y2wiLCBmdW5jdGlvbigpIHsKICBmdW5jdGlvbiBwYXJzZVdvcmRzKHN0cikgewogICAgdmFyIG9iaiA9IHt9LCB3b3JkcyA9IHN0ci5zcGxpdCgiICIpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB3b3Jkcy5sZW5ndGg7ICsraSkgb2JqW3dvcmRzW2ldXSA9IHRydWU7CiAgICByZXR1cm4gb2JqOwogIH0KICB2YXIga2V5d29yZHMgPSBwYXJzZVdvcmRzKCJUY2wgc2FmZSBhZnRlciBhcHBlbmQgYXJyYXkgYXV0b19leGVjb2sgYXV0b19pbXBvcnQgYXV0b19sb2FkICIgKwogICAgICAgICJhdXRvX21raW5kZXggYXV0b19ta2luZGV4X29sZCBhdXRvX3F1YWxpZnkgYXV0b19yZXNldCBiZ2Vycm9yICIgKwogICAgICAgICJiaW5hcnkgYnJlYWsgY2F0Y2ggY2QgY2xvc2UgY29uY2F0IGNvbnRpbnVlIGRkZSBlb2YgZW5jb2RpbmcgZXJyb3IgIiArCiAgICAgICAgImV2YWwgZXhlYyBleGl0IGV4cHIgZmJsb2NrZWQgZmNvbmZpZ3VyZSBmY29weSBmaWxlIGZpbGVldmVudCBmaWxlbmFtZSAiICsKICAgICAgICAiZmlsZW5hbWUgZmx1c2ggZm9yIGZvcmVhY2ggZm9ybWF0IGdldHMgZ2xvYiBnbG9iYWwgaGlzdG9yeSBodHRwIGlmICIgKwogICAgICAgICJpbmNyIGluZm8gaW50ZXJwIGpvaW4gbGFwcGVuZCBsaW5kZXggbGluc2VydCBsaXN0IGxsZW5ndGggbG9hZCBscmFuZ2UgIiArCiAgICAgICAgImxyZXBsYWNlIGxzZWFyY2ggbHNldCBsc29ydCBtZW1vcnkgbXNnY2F0IG5hbWVzcGFjZSBvcGVuIHBhY2thZ2UgcGFycmF5ICIgKwogICAgICAgICJwaWQgcGtnOjpjcmVhdGUgcGtnX21rSW5kZXggcHJvYyBwdXRzIHB3ZCByZV9zeW50YXggcmVhZCByZWdleCByZWdleHAgIiArCiAgICAgICAgInJlZ2lzdHJ5IHJlZ3N1YiByZW5hbWUgcmVzb3VyY2UgcmV0dXJuIHNjYW4gc2VlayBzZXQgc29ja2V0IHNvdXJjZSBzcGxpdCAiICsKICAgICAgICAic3RyaW5nIHN1YnN0IHN3aXRjaCB0Y2xfZW5kT2ZXb3JkIHRjbF9maW5kTGlicmFyeSB0Y2xfc3RhcnRPZk5leHRXb3JkICIgKwogICAgICAgICJ0Y2xfd29yZEJyZWFrQWZ0ZXIgdGNsX3N0YXJ0T2ZQcmV2aW91c1dvcmQgdGNsX3dvcmRCcmVha0JlZm9yZSB0Y2x0ZXN0ICIgKwogICAgICAgICJ0Y2x2YXJzIHRlbGwgdGltZSB0cmFjZSB1bmtub3duIHVuc2V0IHVwZGF0ZSB1cGxldmVsIHVwdmFyIHZhcmlhYmxlICIgKwogICAgInZ3YWl0Iik7CiAgICB2YXIgZnVuY3Rpb25zID0gcGFyc2VXb3JkcygiaWYgZWxzZWlmIGVsc2UgYW5kIG5vdCBvciBlcSBuZSBpbiBuaSBmb3IgZm9yZWFjaCB3aGlsZSBzd2l0Y2giKTsKICAgIHZhciBpc09wZXJhdG9yQ2hhciA9IC9bK1wtKiYlPTw+IT9eXC9cfF0vOwogICAgZnVuY3Rpb24gY2hhaW4oc3RyZWFtLCBzdGF0ZSwgZikgewogICAgICBzdGF0ZS50b2tlbml6ZSA9IGY7CiAgICAgIHJldHVybiBmKHN0cmVhbSwgc3RhdGUpOwogICAgfQogICAgZnVuY3Rpb24gdG9rZW5CYXNlKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgdmFyIGJlZm9yZVBhcmFtcyA9IHN0YXRlLmJlZm9yZVBhcmFtczsKICAgICAgc3RhdGUuYmVmb3JlUGFyYW1zID0gZmFsc2U7CiAgICAgIHZhciBjaCA9IHN0cmVhbS5uZXh0KCk7CiAgICAgIGlmICgoY2ggPT0gJyInIHx8IGNoID09ICInIikgJiYgc3RhdGUuaW5QYXJhbXMpIHsKICAgICAgICByZXR1cm4gY2hhaW4oc3RyZWFtLCBzdGF0ZSwgdG9rZW5TdHJpbmcoY2gpKTsKICAgICAgfSBlbHNlIGlmICgvW1xbXF17fVwoXCksO1wuXS8udGVzdChjaCkpIHsKICAgICAgICBpZiAoY2ggPT0gIigiICYmIGJlZm9yZVBhcmFtcykgc3RhdGUuaW5QYXJhbXMgPSB0cnVlOwogICAgICAgIGVsc2UgaWYgKGNoID09ICIpIikgc3RhdGUuaW5QYXJhbXMgPSBmYWxzZTsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICB9IGVsc2UgaWYgKC9cZC8udGVzdChjaCkpIHsKICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcd1wuXS8pOwogICAgICAgIHJldHVybiAibnVtYmVyIjsKICAgICAgfSBlbHNlIGlmIChjaCA9PSAiIyIpIHsKICAgICAgICBpZiAoc3RyZWFtLmVhdCgiKiIpKQogICAgICAgICAgcmV0dXJuIGNoYWluKHN0cmVhbSwgc3RhdGUsIHRva2VuQ29tbWVudCk7CiAgICAgICAgaWYgKGNoID09ICIjIiAmJiBzdHJlYW0ubWF0Y2goLyAqXFsgKlxbLykpCiAgICAgICAgICByZXR1cm4gY2hhaW4oc3RyZWFtLCBzdGF0ZSwgdG9rZW5VbnBhcnNlZCk7CiAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICAgIHJldHVybiAiY29tbWVudCI7CiAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJyInKSB7CiAgICAgICAgc3RyZWFtLnNraXBUbygvIi8pOwogICAgICAgIHJldHVybiAiY29tbWVudCI7CiAgICAgIH0gZWxzZSBpZiAoY2ggPT0gIiQiKSB7CiAgICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bJF9hLXowLTlBLVpcLns6XS8pOwogICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvfS8pOwogICAgICAgIHN0YXRlLmJlZm9yZVBhcmFtcyA9IHRydWU7CiAgICAgICAgcmV0dXJuICJidWlsdGluIjsKICAgICAgfSBlbHNlIGlmIChpc09wZXJhdG9yQ2hhci50ZXN0KGNoKSkgewogICAgICAgIHN0cmVhbS5lYXRXaGlsZShpc09wZXJhdG9yQ2hhcik7CiAgICAgICAgcmV0dXJuICJjb21tZW50IjsKICAgICAgfSBlbHNlIHsKICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcd1wkX3t9XHhhMS1cdWZmZmZdLyk7CiAgICAgICAgdmFyIHdvcmQgPSBzdHJlYW0uY3VycmVudCgpLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgaWYgKGtleXdvcmRzICYmIGtleXdvcmRzLnByb3BlcnR5SXNFbnVtZXJhYmxlKHdvcmQpKQogICAgICAgICAgcmV0dXJuICJrZXl3b3JkIjsKICAgICAgICBpZiAoZnVuY3Rpb25zICYmIGZ1bmN0aW9ucy5wcm9wZXJ0eUlzRW51bWVyYWJsZSh3b3JkKSkgewogICAgICAgICAgc3RhdGUuYmVmb3JlUGFyYW1zID0gdHJ1ZTsKICAgICAgICAgIHJldHVybiAia2V5d29yZCI7CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiB0b2tlblN0cmluZyhxdW90ZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICB2YXIgZXNjYXBlZCA9IGZhbHNlLCBuZXh0LCBlbmQgPSBmYWxzZTsKICAgICAgd2hpbGUgKChuZXh0ID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkgewogICAgICAgIGlmIChuZXh0ID09IHF1b3RlICYmICFlc2NhcGVkKSB7CiAgICAgICAgICBlbmQgPSB0cnVlOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGVzY2FwZWQgPSAhZXNjYXBlZCAmJiBuZXh0ID09ICJcXCI7CiAgICAgIH0KICAgICAgaWYgKGVuZCkgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgICB9OwogICAgfQogICAgZnVuY3Rpb24gdG9rZW5Db21tZW50KHN0cmVhbSwgc3RhdGUpIHsKICAgICAgdmFyIG1heWJlRW5kID0gZmFsc2UsIGNoOwogICAgICB3aGlsZSAoY2ggPSBzdHJlYW0ubmV4dCgpKSB7CiAgICAgICAgaWYgKGNoID09ICIjIiAmJiBtYXliZUVuZCkgewogICAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgbWF5YmVFbmQgPSAoY2ggPT0gIioiKTsKICAgICAgfQogICAgICByZXR1cm4gImNvbW1lbnQiOwogICAgfQogICAgZnVuY3Rpb24gdG9rZW5VbnBhcnNlZChzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHZhciBtYXliZUVuZCA9IDAsIGNoOwogICAgICB3aGlsZSAoY2ggPSBzdHJlYW0ubmV4dCgpKSB7CiAgICAgICAgaWYgKGNoID09ICIjIiAmJiBtYXliZUVuZCA9PSAyKSB7CiAgICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBpZiAoY2ggPT0gIl0iKQogICAgICAgICAgbWF5YmVFbmQrKzsKICAgICAgICBlbHNlIGlmIChjaCAhPSAiICIpCiAgICAgICAgICBtYXliZUVuZCA9IDA7CiAgICAgIH0KICAgICAgcmV0dXJuICJtZXRhIjsKICAgIH0KICAgIHJldHVybiB7CiAgICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICB0b2tlbml6ZTogdG9rZW5CYXNlLAogICAgICAgICAgYmVmb3JlUGFyYW1zOiBmYWxzZSwKICAgICAgICAgIGluUGFyYW1zOiBmYWxzZQogICAgICAgIH07CiAgICAgIH0sCiAgICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgICAgaWYgKHN0cmVhbS5lYXRTcGFjZSgpKSByZXR1cm4gbnVsbDsKICAgICAgICByZXR1cm4gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CiAgICAgIH0KICAgIH07Cn0pOwpDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveC10Y2wiLCAidGNsIik7Cgp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/textile/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/textile/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogVGV4dGlsZSBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9InRleHRpbGUuanMiPjwvc2NyaXB0Pgo8c3R5bGU+LkNvZGVNaXJyb3Ige2JhY2tncm91bmQ6ICNmOGY4Zjg7fTwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGgxPkNvZGVNaXJyb3I8L2gxPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWFyaWpuaC9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPSJhY3RpdmUiIGhyZWY9IiMiPlRleHRpbGU8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KICAgIDxoMj5UZXh0aWxlIG1vZGU8L2gyPgogICAgPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KaDEuIFRleHRpbGUgTW9kZQoKQSBwYXJhZ3JhcGggd2l0aG91dCBmb3JtYXR0aW5nLgoKcC4gQSBzaW1wbGUgUGFyYWdyYXBoLgoKCmgyLiBQaHJhc2UgTW9kaWZpZXJzCgpIZXJlIGFyZSBzb21lIHNpbXBsZSBwaHJhc2UgbW9kaWZpZXJzOiAqc3Ryb25nKiwgX2VtcGhhc2lzXywgKipib2xkKiosIGFuZCBfX2l0YWxpY19fLgoKQSA/P2NpdGF0aW9uPz8sIC1kZWxldGVkIHRleHQtLCAraW5zZXJ0ZWQgdGV4dCssIHNvbWUgXnN1cGVyc2NyaXB0XiwgYW5kIHNvbWUgfnN1YnNjcmlwdH4uCgpBICVzcGFuIGVsZW1lbnQlIGFuZCBAY29kZSBlbGVtZW50QAoKQSAibGluayI6aHR0cDovL2V4YW1wbGUuY29tLCBhICJsaW5rIHdpdGggKGFsdCB0ZXh0KSI6dXJsQWxpYXMKClt1cmxBbGlhc11odHRwOi8vZXhhbXBsZS5jb20vCgpBbiBpbWFnZTogIWh0dHA6Ly9leGFtcGxlLmNvbS9pbWFnZS5wbmchIGFuZCBhbiBpbWFnZSB3aXRoIGEgbGluazogIWh0dHA6Ly9leGFtcGxlLmNvbS9pbWFnZS5wbmchOmh0dHA6Ly9leGFtcGxlLmNvbQoKQSBzZW50ZW5jZSB3aXRoIGEgZm9vdG5vdGUuWzEyM10KCmZuMTIzLiBUaGUgZm9vdG5vdGUgaXMgZGVmaW5lZCBoZXJlLgoKUmVnaXN0ZXJlZChyKSwgVHJhZGVtYXJrKHRtKSwgYW5kIENvcHlyaWdodChjKQoKCmgyLiBIZWFkZXJzCgpoMS4gVG9wIGxldmVsCmgyLiBTZWNvbmQgbGV2ZWwKaDMuIFRoaXJkIGxldmVsCmg0LiBGb3VydGggbGV2ZWwKaDUuIEZpZnRoIGxldmVsCmg2LiBMb3dlc3QgbGV2ZWwKCgpoMi4gIExpc3RzCgoqIEFuIHVub3JkZXJlZCBsaXN0CioqIGZvbyBiYXIKKioqIGZvbyBiYXIKKioqKiBmb28gYmFyCioqIGZvbyBiYXIKCiMgQW4gb3JkZXJlZCBsaXN0CiMjIGZvbyBiYXIKIyMjIGZvbyBiYXIKIyMjIyBmb28gYmFyCiMjIGZvbyBiYXIKCi0gZGVmaW5pdGlvbiBsaXN0IDo9IGRlc2NyaXB0aW9uCi0gYW5vdGhlciBpdGVtICAgIDo9IGZvbyBiYXIKLSBzcGFubmluZyBpbmVzICAgOj0KICAgICAgICAgICAgICAgICAgICAgZm9vIGJhcgoKICAgICAgICAgICAgICAgICAgICAgZm9vIGJhciA9OgoKCmgyLiBBdHRyaWJ1dGVzCgpMYXlvdXRzIGFuZCBwaHJhc2UgbW9kaWZpZXJzIGNhbiBiZSBtb2RpZmllZCB3aXRoIHZhcmlvdXMga2luZHMgb2YgYXR0cmlidXRlczogYWxpZ25tZW50LCBDU1MgSUQsIENTUyBjbGFzcyBuYW1lcywgbGFuZ3VhZ2UsIHBhZGRpbmcsIGFuZCBDU1Mgc3R5bGVzLgoKaDMuIEFsaWdubWVudAoKZGl2PC4gbGVmdCBhbGlnbgpkaXY+LiByaWdodCBhbGlnbgoKaDMuIENTUyBJRCBhbmQgY2xhc3MgbmFtZQoKWW91IGFyZSBhICUobXktaWQjbXktY2xhc3NuYW1lKSByYWQlIHBlcnNvbi4KCmgzLiBMYW5ndWFnZQoKcFtlbl9DQV0uIFN0cmFuZ2Ugd2VhdGhlciwgZWg/CgpoMy4gSG9yaXpvbnRhbCBQYWRkaW5nCgpwKCgpKSkuIDJlbSBsZWZ0IHBhZGRpbmcsIDNlbSByaWdodCBwYWRkaW5nCgpoMy4gQ1NTIHN0eWxpbmcKCnB7YmFja2dyb3VuZDogcmVkfS4gRmlyZSEKCgpoMi4gVGFibGUKCnxfLiAgICAgICAgICAgICAgSGVhZGVyIDEgICAgICAgICAgICAgICB8Xy4gICAgICBIZWFkZXIgMiAgICAgICAgfAp8e2JhY2tncm91bmQ6I2RkZH0uIENlbGwgd2l0aCBiYWNrZ3JvdW5kfCAgICAgICAgIE5vcm1hbCAgICAgICAgIHwKfFwyLiAgICAgICAgIENlbGwgc3Bhbm5pbmcgMiBjb2x1bW5zICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwvMi4gICAgICAgICBDZWxsIHNwYW5uaW5nIDIgcm93cyAgICAgICB8KGNlbGwtY2xhc3MpLiBvbmUgICAgICAgfAp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHdvICAgICAgICAgICAgIHwKfD4uICAgICAgICAgICAgICAgICAgUmlnaHQgYWxpZ25lZCBjZWxsIHw8LiBMZWZ0IGFsaWduZWQgY2VsbCAgICB8CgoKaDMuIEEgdGFibGUgd2l0aCBhdHRyaWJ1dGVzOgoKdGFibGUoI3ByaWNlcykuCnxBZHVsdHN8JDV8CnxDaGlsZHJlbnwkMnwKCgpoMi4gQ29kZSBibG9ja3MKCmJjLgpmdW5jdGlvbiBmYWN0b3JpYWwobikgewogICAgaWYgKG4gPT09IDApIHsKICAgICAgICByZXR1cm4gMTsKICAgIH0KICAgIHJldHVybiBuICogZmFjdG9yaWFsKG4gLSAxKTsKfQoKcHJlLi4KICAgICAgICAgICAgICAgICwsLCwsLAogICAgICAgICAgICBvIyc5TU1IYic6Jy0sbywKICAgICAgICAgLm9IIjpISCQnICInICcgLSpSJm8sCiAgICAgICAgZE1NTSoiIidgJyAgICAgIC5vTSJITT8uCiAgICAgICAsTU1NJyAgICAgICAgICAiSExiZDwgPyZIXAogICAgICAuOk1IIC4iXCAgICAgICAgICBgIE1NICBNTSZiCiAgICAgLiAiKkggICAgLSAgICAgICAgJk1NTU1NTU1NTUg6CiAgICAgLiAgICBkYm9vICAgICAgICBNTU1NTU1NTU1NTU0uCiAgICAgLiAgIGRNTU1NTU1iICAgICAgKk1NTU1NTU1NTVAuCiAgICAgLiAgICBNTU1NTU1NUCAgICAgICAgKk1NTU1NUCAuCiAgICAgICAgICBgI01NTU1NICAgICAgICAgICBNTTZQICwKICAgICAgICcgICAgYE1NTVAiICAgICAgICAgICBITSpgLAogICAgICAgICcgICAgOk1NICAgICAgICAgICAgIC4tICwKICAgICAgICAgJy4gICBgIz8uLiAgLiAgICAgICAuLicKICAgICAgICAgICAgLS4gICAuICAgICAgICAgLi0KICAgICAgICAgICAgICAnJy0ub28sb28uLScnCgpcLiBfKDk+CiBcPT1fKQogIC0nPQoKaDIuIFRlbXBvcmFyaWx5IGRpc2FibGluZyB0ZXh0aWxlIG1hcmt1cAoKbm90ZXh0aWxlLiBEb24ndCBfX3RvdWNoIHRoaXMhX18KClN1cnJvdW5kIHRleHQgd2l0aCBkb3VibGUtZXF1YWxzIHRvIGRpc2FibGUgdGV4dGlsZSBpbmxpbmUuIEV4YW1wbGU6IFVzZSA9PSphc3Rlcmlza3MqPT0gZm9yICpzdHJvbmcqIHRleHQuCgoKaDIuIEhUTUwKClNvbWUgYmxvY2sgbGF5b3V0cyBhcmUgc2ltcGx5IHRleHRpbGUgdmVyc2lvbnMgb2YgSFRNTCB0YWdzIHdpdGggdGhlIHNhbWUgbmFtZSwgbGlrZSBAZGl2QCwgQHByZUAsIGFuZCBAcEAuIEhUTUwgdGFncyBjYW4gYWxzbyBleGlzdCBvbiB0aGVpciBvd24gbGluZToKCjxzZWN0aW9uPgogIDxoMT5UaXRsZTwvaDE+CiAgPHA+SGVsbG8hPC9wPgo8L3NlY3Rpb24+Cgo8L3RleHRhcmVhPjwvZm9ybT4KICAgIDxzY3JpcHQ+CiAgICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICAgICAgbGluZU51bWJlcnM6IHRydWUsCiAgICAgICAgICAgIG1vZGU6ICJ0ZXh0L3gtdGV4dGlsZSIKICAgICAgICB9KTsKICAgIDwvc2NyaXB0PgoKICAgIDxwPjxzdHJvbmc+TUlNRSB0eXBlcyBkZWZpbmVkOjwvc3Ryb25nPiA8Y29kZT50ZXh0L3gtdGV4dGlsZTwvY29kZT4uPC9wPgoKICAgIDxwPjxzdHJvbmc+UGFyc2luZy9IaWdobGlnaHRpbmcgVGVzdHM6PC9zdHJvbmc+IDxhIGhyZWY9Ii4uLy4uL3Rlc3QvaW5kZXguaHRtbCN0ZXh0aWxlXyoiPm5vcm1hbDwvYT4sICA8YSBocmVmPSIuLi8uLi90ZXN0L2luZGV4Lmh0bWwjdmVyYm9zZSx0ZXh0aWxlXyoiPnZlcmJvc2U8L2E+LjwvcD4KCjwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/textile/test.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24oKSB7CiAgdmFyIG1vZGUgPSBDb2RlTWlycm9yLmdldE1vZGUoe3RhYlNpemU6IDR9LCAndGV4dGlsZScpOwogIGZ1bmN0aW9uIE1UKG5hbWUpIHsgdGVzdC5tb2RlKG5hbWUsIG1vZGUsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpOyB9CgogIE1UKCdzaW1wbGVQYXJhZ3JhcGhzJywKICAgICAgJ1NvbWUgdGV4dC4nLAogICAgICAnJywKICAgICAgJ1NvbWUgbW9yZSB0ZXh0LicpOwoKICAvKgogICAqIFBocmFzZSBNb2RpZmllcnMKICAgKi8KCiAgTVQoJ2VtJywKICAgICAgJ2ZvbyBbZW0gX2Jhcl9dJyk7CgogIE1UKCdlbUJvb2d1cycsCiAgICAgICdjb2RlX21pcnJvcicpOwoKICBNVCgnc3Ryb25nJywKICAgICAgJ2ZvbyBbc3Ryb25nICpiYXIqXScpOwoKICBNVCgnc3Ryb25nQm9ndXMnLAogICAgICAnMyAqIDMgPSA5Jyk7CgogIE1UKCdpdGFsaWMnLAogICAgICAnZm9vIFtlbSBfX2Jhcl9fXScpOwoKICBNVCgnaXRhbGljQm9ndXMnLAogICAgICAnY29kZV9fbWlycm9yJyk7CgogIE1UKCdib2xkJywKICAgICAgJ2ZvbyBbc3Ryb25nICoqYmFyKipdJyk7CgogIE1UKCdib2xkQm9ndXMnLAogICAgICAnMyAqKiAzID0gMjcnKTsKCiAgTVQoJ3NpbXBsZUxpbmsnLAogICAgICAnW2xpbmsgIkNvZGVNaXJyb3IiOmh0dHA6Ly9jb2RlbWlycm9yLm5ldF0nKTsKCiAgTVQoJ3JlZmVyZW5jZUxpbmsnLAogICAgICAnW2xpbmsgIkNvZGVNaXJyb3IiOmNvZGVfbWlycm9yXScsCiAgICAgICdOb3JtYWwgVGV4dC4nLAogICAgICAnW2xpbmsgW1tjb2RlX21pcnJvcl1daHR0cDovL2NvZGVtaXJyb3IubmV0XScpOwoKICBNVCgnZm9vdENpdGUnLAogICAgICAnZm9vIGJhcltxdWFsaWZpZXIgW1sxXV1dJyk7CgogIE1UKCdmb290Q2l0ZUJvZ3VzJywKICAgICAgJ2ZvbyBiYXJbWzFhMl1dJyk7CgogIE1UKCdzcGVjaWFsLWNoYXJhY3RlcnMnLAogICAgICAgICAgJ1JlZ2lzdGVyZWQgW3RhZyAocildLCAnICsKICAgICAgICAgICdUcmFkZW1hcmsgW3RhZyAodG0pXSwgYW5kICcgKwogICAgICAgICAgJ0NvcHlyaWdodCBbdGFnIChjKV0gMjAwOCcpOwoKICBNVCgnY2l0ZScsCiAgICAgICJBIGJvb2sgaXMgW2tleXdvcmQgPz9UaGUgQ291bnQgb2YgTW9udGUgQ3Jpc3RvPz9dIGJ5IER1bWFzLiIpOwoKICBNVCgnYWRkaXRpb25BbmREZWxldGlvbicsCiAgICAgICdUaGUgbmV3cyBuZXR3b3JrcyBkZWNsYXJlZCBbbmVnYXRpdmUgLUFsIEdvcmUtXSAnICsKICAgICAgICAnW3Bvc2l0aXZlICtHZW9yZ2UgVy4gQnVzaCtdIHRoZSB3aW5uZXIgaW4gRmxvcmlkYS4nKTsKCiAgTVQoJ3N1YkFuZFN1cCcsCiAgICAgICdmKHgsIG4pID0gbG9nIFtidWlsdGluIH40fl0geCBbYnVpbHRpbiBebl5dJyk7CgogIE1UKCdzcGFuQW5kQ29kZScsCiAgICAgICdBIFtxdW90ZSAlc3BhbiBlbGVtZW50JV0gYW5kIFthdG9tIEBjb2RlIGVsZW1lbnRAXScpOwoKICBNVCgnc3BhbkJvZ3VzJywKICAgICAgJ1BlcmNlbnRhZ2UgMjUlIGlzIG5vdCBhIHNwYW4uJyk7CgogIE1UKCdjaXRlQm9ndXMnLAogICAgICAnUXVlc3Rpb24/IGlzIG5vdCBhIGNpdGF0aW9uLicpOwoKICBNVCgnY29kZUJvZ3VzJywKICAgICAgJ3VzZXJAZXhhbXBsZS5jb20nKTsKCiAgTVQoJ3N1YkJvZ3VzJywKICAgICAgJ351c2VybmFtZScpOwoKICBNVCgnc3VwQm9ndXMnLAogICAgICAnZm9vIF4gYmFyJyk7CgogIE1UKCdkZWxldGlvbkJvZ3VzJywKICAgICAgJzMgLSAzID0gMCcpOwoKICBNVCgnYWRkaXRpb25Cb2d1cycsCiAgICAgICczICsgMyA9IDYnKTsKCiAgTVQoJ2ltYWdlJywKICAgICAgJ0FuIGltYWdlOiBbc3RyaW5nICFodHRwOi8vd3d3LmV4YW1wbGUuY29tL2ltYWdlLnBuZyFdJyk7CgogIE1UKCdpbWFnZVdpdGhBbHRUZXh0JywKICAgICAgJ0FuIGltYWdlOiBbc3RyaW5nICFodHRwOi8vd3d3LmV4YW1wbGUuY29tL2ltYWdlLnBuZyAoQWx0IFRleHQpIV0nKTsKCiAgTVQoJ2ltYWdlV2l0aFVybCcsCiAgICAgICdBbiBpbWFnZTogW3N0cmluZyAhaHR0cDovL3d3dy5leGFtcGxlLmNvbS9pbWFnZS5wbmchOmh0dHA6Ly93d3cuZXhhbXBsZS5jb20vXScpOwoKICAvKgogICAqIEhlYWRlcnMKICAgKi8KCiAgTVQoJ2gxJywKICAgICAgJ1toZWFkZXImaGVhZGVyLTEgaDEuIGZvb10nKTsKCiAgTVQoJ2gyJywKICAgICAgJ1toZWFkZXImaGVhZGVyLTIgaDIuIGZvb10nKTsKCiAgTVQoJ2gzJywKICAgICAgJ1toZWFkZXImaGVhZGVyLTMgaDMuIGZvb10nKTsKCiAgTVQoJ2g0JywKICAgICAgJ1toZWFkZXImaGVhZGVyLTQgaDQuIGZvb10nKTsKCiAgTVQoJ2g1JywKICAgICAgJ1toZWFkZXImaGVhZGVyLTUgaDUuIGZvb10nKTsKCiAgTVQoJ2g2JywKICAgICAgJ1toZWFkZXImaGVhZGVyLTYgaDYuIGZvb10nKTsKCiAgTVQoJ2g3Qm9ndXMnLAogICAgICAnaDcuIGZvbycpOwoKICBNVCgnbXVsdGlwbGVIZWFkZXJzJywKICAgICAgJ1toZWFkZXImaGVhZGVyLTEgaDEuIEhlYWRpbmcgMV0nLAogICAgICAnJywKICAgICAgJ1NvbWUgdGV4dC4nLAogICAgICAnJywKICAgICAgJ1toZWFkZXImaGVhZGVyLTIgaDIuIEhlYWRpbmcgMl0nLAogICAgICAnJywKICAgICAgJ01vcmUgdGV4dC4nKTsKCiAgTVQoJ2gxaW5saW5lJywKICAgICAgJ1toZWFkZXImaGVhZGVyLTEgaDEuIGZvbyBdW2hlYWRlciZoZWFkZXItMSZlbSBfYmFyX11baGVhZGVyJmhlYWRlci0xICBiYXpdJyk7CgogIC8qCiAgICogTGlzdHMKICAgKi8KCiAgTVQoJ3VsJywKICAgICAgJ2ZvbycsCiAgICAgICdiYXInLAogICAgICAnJywKICAgICAgJ1t2YXJpYWJsZS0yICogZm9vXScsCiAgICAgICdbdmFyaWFibGUtMiAqIGJhcl0nKTsKCiAgTVQoJ3VsTm9CbGFuaycsCiAgICAgICdmb28nLAogICAgICAnYmFyJywKICAgICAgJ1t2YXJpYWJsZS0yICogZm9vXScsCiAgICAgICdbdmFyaWFibGUtMiAqIGJhcl0nKTsKCiAgTVQoJ29sJywKICAgICAgJ2ZvbycsCiAgICAgICdiYXInLAogICAgICAnJywKICAgICAgJ1t2YXJpYWJsZS0yICMgZm9vXScsCiAgICAgICdbdmFyaWFibGUtMiAjIGJhcl0nKTsKCiAgTVQoJ29sTm9CbGFuaycsCiAgICAgICdmb28nLAogICAgICAnYmFyJywKICAgICAgJ1t2YXJpYWJsZS0yICMgZm9vXScsCiAgICAgICdbdmFyaWFibGUtMiAjIGJhcl0nKTsKCiAgTVQoJ3VsRm9ybWF0dGluZycsCiAgICAgICdbdmFyaWFibGUtMiAqIF1bdmFyaWFibGUtMiZlbSBfZm9vX11bdmFyaWFibGUtMiAgYmFyXScsCiAgICAgICdbdmFyaWFibGUtMiAqIF1bdmFyaWFibGUtMiZzdHJvbmcgKl1bdmFyaWFibGUtMiZlbSZzdHJvbmcgX2Zvb19dJyArCiAgICAgICAgJ1t2YXJpYWJsZS0yJnN0cm9uZyAqXVt2YXJpYWJsZS0yICBiYXJdJywKICAgICAgJ1t2YXJpYWJsZS0yICogXVt2YXJpYWJsZS0yJnN0cm9uZyAqZm9vKl1bdmFyaWFibGUtMiAgYmFyXScpOwoKICBNVCgnb2xGb3JtYXR0aW5nJywKICAgICAgJ1t2YXJpYWJsZS0yICMgXVt2YXJpYWJsZS0yJmVtIF9mb29fXVt2YXJpYWJsZS0yICBiYXJdJywKICAgICAgJ1t2YXJpYWJsZS0yICMgXVt2YXJpYWJsZS0yJnN0cm9uZyAqXVt2YXJpYWJsZS0yJmVtJnN0cm9uZyBfZm9vX10nICsKICAgICAgICAnW3ZhcmlhYmxlLTImc3Ryb25nICpdW3ZhcmlhYmxlLTIgIGJhcl0nLAogICAgICAnW3ZhcmlhYmxlLTIgIyBdW3ZhcmlhYmxlLTImc3Ryb25nICpmb28qXVt2YXJpYWJsZS0yICBiYXJdJyk7CgogIE1UKCd1bE5lc3RlZCcsCiAgICAgICdbdmFyaWFibGUtMiAqIGZvb10nLAogICAgICAnW3ZhcmlhYmxlLTMgKiogYmFyXScsCiAgICAgICdba2V5d29yZCAqKiogYmFyXScsCiAgICAgICdbdmFyaWFibGUtMiAqKioqIGJhcl0nLAogICAgICAnW3ZhcmlhYmxlLTMgKiogYmFyXScpOwoKICBNVCgnb2xOZXN0ZWQnLAogICAgICAnW3ZhcmlhYmxlLTIgIyBmb29dJywKICAgICAgJ1t2YXJpYWJsZS0zICMjIGJhcl0nLAogICAgICAnW2tleXdvcmQgIyMjIGJhcl0nLAogICAgICAnW3ZhcmlhYmxlLTIgIyMjIyBiYXJdJywKICAgICAgJ1t2YXJpYWJsZS0zICMjIGJhcl0nKTsKCiAgTVQoJ3VsTmVzdGVkV2l0aE9sJywKICAgICAgJ1t2YXJpYWJsZS0yICogZm9vXScsCiAgICAgICdbdmFyaWFibGUtMyAjIyBiYXJdJywKICAgICAgJ1trZXl3b3JkICoqKiBiYXJdJywKICAgICAgJ1t2YXJpYWJsZS0yICMjIyMgYmFyXScsCiAgICAgICdbdmFyaWFibGUtMyAqKiBiYXJdJyk7CgogIE1UKCdvbE5lc3RlZFdpdGhVbCcsCiAgICAgICdbdmFyaWFibGUtMiAjIGZvb10nLAogICAgICAnW3ZhcmlhYmxlLTMgKiogYmFyXScsCiAgICAgICdba2V5d29yZCAjIyMgYmFyXScsCiAgICAgICdbdmFyaWFibGUtMiAqKioqIGJhcl0nLAogICAgICAnW3ZhcmlhYmxlLTMgIyMgYmFyXScpOwoKICBNVCgnZGVmaW5pdGlvbkxpc3QnLAogICAgICAnW251bWJlciAtIGNvZmZlZSA6PSBIb3QgXVtudW1iZXImZW0gX2FuZF9dW251bWJlciAgYmxhY2tdJywKICAgICAgJycsCiAgICAgICdOb3JtYWwgdGV4dC4nKTsKCiAgTVQoJ2RlZmluaXRpb25MaXN0U3BhbicsCiAgICAgICdbbnVtYmVyIC0gY29mZmVlIDo9XScsCiAgICAgICcnLAogICAgICAnW251bWJlciBIb3QgXVtudW1iZXImZW0gX2FuZF9dW251bWJlciAgYmxhY2sgPTpdJywKICAgICAgJycsCiAgICAgICdOb3JtYWwgdGV4dC4nKTsKCiAgTVQoJ2JvbycsCiAgICAgICdbbnVtYmVyIC0gZG9nIDo9IHdvb2Ygd29vZl0nLAogICAgICAnW251bWJlciAtIGNhdCA6PSBtZW93IG1lb3ddJywKICAgICAgJ1tudW1iZXIgLSB3aGFsZSA6PV0nLAogICAgICAnW251bWJlciBXaGFsZSBub2lzZXMuXScsCiAgICAgICcnLAogICAgICAnW251bWJlciBBbHNvLCBdW251bWJlciZlbSBfc3BsYXNoaW5nX11bbnVtYmVyIC4gPTpdJyk7CgogIC8qCiAgICogQXR0cmlidXRlcwogICAqLwoKICBNVCgnZGl2V2l0aEF0dHJpYnV0ZScsCiAgICAgICdbcHVuY3R1YXRpb24gZGl2XVtwdW5jdHVhdGlvbiZhdHRyaWJ1dGUgKCNteS1pZCldW3B1bmN0dWF0aW9uIC4gZm9vIGJhcl0nKTsKCiAgTVQoJ2RpdldpdGhBdHRyaWJ1dGVBbmQyZW1SaWdodFBhZGRpbmcnLAogICAgICAnW3B1bmN0dWF0aW9uIGRpdl1bcHVuY3R1YXRpb24mYXR0cmlidXRlICgjbXktaWQpKChdW3B1bmN0dWF0aW9uIC4gZm9vIGJhcl0nKTsKCiAgTVQoJ2RpdldpdGhDbGFzc0FuZElkJywKICAgICAgJ1twdW5jdHVhdGlvbiBkaXZdW3B1bmN0dWF0aW9uJmF0dHJpYnV0ZSAobXktY2xhc3MjbXktaWQpXVtwdW5jdHVhdGlvbiAuIGZvbyBiYXJdJyk7CgogIE1UKCdwYXJhZ3JhcGhXaXRoQ3NzJywKICAgICAgJ3BbYXR0cmlidXRlIHtjb2xvcjpyZWQ7fV0uIGZvbyBiYXInKTsKCiAgTVQoJ3BhcmFncmFwaE5lc3RlZFN0eWxlcycsCiAgICAgICdwLiBbc3Ryb25nICpmb28gXVtzdHJvbmcmZW0gX2Jhcl9dW3N0cm9uZyAqXScpOwoKICBNVCgncGFyYWdyYXBoV2l0aExhbmd1YWdlJywKICAgICAgJ3BbYXR0cmlidXRlIFtbZnJdXV0uIFBhcmxlei12b3VzIGZyYW7Dp2Fpcz8nKTsKCiAgTVQoJ3BhcmFncmFwaExlZnRBbGlnbicsCiAgICAgICdwW2F0dHJpYnV0ZSA8XS4gTGVmdCcpOwoKICBNVCgncGFyYWdyYXBoUmlnaHRBbGlnbicsCiAgICAgICdwW2F0dHJpYnV0ZSA+XS4gUmlnaHQnKTsKCiAgTVQoJ3BhcmFncmFwaFJpZ2h0QWxpZ24nLAogICAgICAncFthdHRyaWJ1dGUgPV0uIENlbnRlcicpOwoKICBNVCgncGFyYWdyYXBoSnVzdGlmaWVkJywKICAgICAgJ3BbYXR0cmlidXRlIDw+XS4gSnVzdGlmaWVkJyk7CgogIE1UKCdwYXJhZ3JhcGhXaXRoTGVmdEluZGVudDFlbScsCiAgICAgICdwW2F0dHJpYnV0ZSAoXS4gTGVmdCcpOwoKICBNVCgncGFyYWdyYXBoV2l0aFJpZ2h0SW5kZW50MWVtJywKICAgICAgJ3BbYXR0cmlidXRlICldLiBSaWdodCcpOwoKICBNVCgncGFyYWdyYXBoV2l0aExlZnRJbmRlbnQyZW0nLAogICAgICAncFthdHRyaWJ1dGUgKChdLiBMZWZ0Jyk7CgogIE1UKCdwYXJhZ3JhcGhXaXRoUmlnaHRJbmRlbnQyZW0nLAogICAgICAncFthdHRyaWJ1dGUgKSldLiBSaWdodCcpOwoKICBNVCgncGFyYWdyYXBoV2l0aExlZnRJbmRlbnQzZW1SaWdodEluZGVudDJlbScsCiAgICAgICdwW2F0dHJpYnV0ZSAoKCgpKV0uIFJpZ2h0Jyk7CgogIE1UKCdkaXZGb3JtYXR0aW5nJywKICAgICAgJ1twdW5jdHVhdGlvbiBkaXYuIF1bcHVuY3R1YXRpb24mc3Ryb25nICpmb28gXScgKwogICAgICAgICdbcHVuY3R1YXRpb24mc3Ryb25nJmVtIF9iYXJfXVtwdW5jdHVhdGlvbiZzdHJvbmcgKl0nKTsKCiAgTVQoJ3BocmFzZU1vZGlmaWVyQXR0cmlidXRlcycsCiAgICAgICdwW2F0dHJpYnV0ZSAobXktY2xhc3MpXS4gVGhpcyBpcyBhIHBhcmFncmFwaCB0aGF0IGhhcyBhIGNsYXNzIGFuZCcgKwogICAgICAnIHRoaXMgW2VtIF9dW2VtJmF0dHJpYnV0ZSAoI3NwZWNpYWwtcGhyYXNlKV1bZW0gZW1waGFzaXplZCBwaHJhc2VfXScgKwogICAgICAnIGhhcyBhbiBpZC4nKTsKCiAgTVQoJ2xpbmtXaXRoQ2xhc3MnLAogICAgICAnW2xpbmsgIihteS1jbGFzcykuIFRoaXMgaXMgYSBsaW5rIHdpdGggY2xhc3MiOmh0dHA6Ly9yZWRjbG90aC5vcmddJyk7CgogIC8qCiAgICogTGF5b3V0cwogICAqLwoKICBNVCgncGFyYWdyYXBoTGF5b3V0cycsCiAgICAgICdwLiBUaGlzIGlzIG9uZSBwYXJhZ3JhcGguJywKICAgICAgJycsCiAgICAgICdwLiBUaGlzIGlzIGFub3RoZXIuJyk7CgogIE1UKCdkaXYnLAogICAgICAnW3B1bmN0dWF0aW9uIGRpdi4gZm9vIGJhcl0nKTsKCiAgTVQoJ3ByZScsCiAgICAgICdbb3BlcmF0b3IgcHJlLiBUZXh0XScpOwoKICBNVCgnYnEuJywKICAgICAgJ1ticmFja2V0IGJxLiBmb28gYmFyXScsCiAgICAgICcnLAogICAgICAnTm9ybWFsIHRleHQuJyk7CgogIE1UKCdmb290bm90ZScsCiAgICAgICdbdmFyaWFibGUgZm4xMjMuIGZvbyBdW3ZhcmlhYmxlJnN0cm9uZyAqYmFyKl0nKTsKCiAgLyoKICAgKiBTcGFubmluZyBMYXlvdXRzCiAgICovCgogIE1UKCdicS4uVGhlblBhcmFncmFwaCcsCiAgICAgICdbYnJhY2tldCBicS4uIGZvbyBiYXJdJywKICAgICAgJycsCiAgICAgICdbYnJhY2tldCBNb3JlIHF1b3RlLl0nLAogICAgICAncC4gTm9ybWFsIFRleHQnKTsKCiAgTVQoJ2JxLi5UaGVuSDEnLAogICAgICAnW2JyYWNrZXQgYnEuLiBmb28gYmFyXScsCiAgICAgICcnLAogICAgICAnW2JyYWNrZXQgTW9yZSBxdW90ZS5dJywKICAgICAgJ1toZWFkZXImaGVhZGVyLTEgaDEuIEhlYWRlciBUZXh0XScpOwoKICBNVCgnYmMuLlRoZW5QYXJhZ3JhcGgnLAogICAgICAnW2F0b20gYmMuLiAjIFNvbWUgcnVieSBjb2RlXScsCiAgICAgICdbYXRvbSBvYmogPSB7Zm9vOiA6YmFyfV0nLAogICAgICAnW2F0b20gcHV0cyBvYmpdJywKICAgICAgJycsCiAgICAgICdbYXRvbSBvYmpbWzpsb3ZlXV0gPSAiKmxvdmUqIl0nLAogICAgICAnW2F0b20gcHV0cyBvYmoubG92ZS51cGNhc2VdJywKICAgICAgJycsCiAgICAgICdwLiBOb3JtYWwgdGV4dC4nKTsKCiAgTVQoJ2ZuMS4uVGhlblBhcmFncmFwaCcsCiAgICAgICdbdmFyaWFibGUgZm4xLi4gZm9vIGJhcl0nLAogICAgICAnJywKICAgICAgJ1t2YXJpYWJsZSBNb3JlLl0nLAogICAgICAncC4gTm9ybWFsIFRleHQnKTsKCiAgTVQoJ3ByZS4uVGhlblBhcmFncmFwaCcsCiAgICAgICdbb3BlcmF0b3IgcHJlLi4gZm9vIGJhcl0nLAogICAgICAnJywKICAgICAgJ1tvcGVyYXRvciBNb3JlLl0nLAogICAgICAncC4gTm9ybWFsIFRleHQnKTsKCiAgLyoKICAgKiBUYWJsZXMKICAgKi8KCiAgTVQoJ3RhYmxlJywKICAgICAgJ1t2YXJpYWJsZS0zJm9wZXJhdG9yIHxfLiBuYW1lIHxfLiBhZ2V8XScsCiAgICAgICdbdmFyaWFibGUtMyB8XVt2YXJpYWJsZS0zJnN0cm9uZyAqV2FsdGVyKl1bdmFyaWFibGUtMyB8ICAgNSAgfF0nLAogICAgICAnW3ZhcmlhYmxlLTMgfEZsb3JlbmNlfCAgIDYgIHxdJywKICAgICAgJycsCiAgICAgICdwLiBOb3JtYWwgdGV4dC4nKTsKCiAgTVQoJ3RhYmxlV2l0aEF0dHJpYnV0ZXMnLAogICAgICAnW3ZhcmlhYmxlLTMmb3BlcmF0b3IgfF8uIG5hbWUgfF8uIGFnZXxdJywKICAgICAgJ1t2YXJpYWJsZS0zIHxdW3ZhcmlhYmxlLTMmYXR0cmlidXRlIC8yLl1bdmFyaWFibGUtMyAgSmltIHxdJywKICAgICAgJ1t2YXJpYWJsZS0zIHxdW3ZhcmlhYmxlLTMmYXR0cmlidXRlIFxcMntjb2xvcjogcmVkfS5dW3ZhcmlhYmxlLTMgIFNhbSB8XScpOwoKICAvKgogICAqIEhUTUwKICAgKi8KCiAgTVQoJ2h0bWwnLAogICAgICAnW2NvbW1lbnQgPGRpdiBpZD0id3JhcHBlciI+XScsCiAgICAgICdbY29tbWVudCA8c2VjdGlvbiBpZD0iaW50cm9kdWN0aW9uIj5dJywKICAgICAgJycsCiAgICAgICdbaGVhZGVyJmhlYWRlci0xIGgxLiBXZWxjb21lXScsCiAgICAgICcnLAogICAgICAnW3ZhcmlhYmxlLTIgKiBJdGVtIG9uZV0nLAogICAgICAnW3ZhcmlhYmxlLTIgKiBJdGVtIHR3b10nLAogICAgICAnJywKICAgICAgJ1tjb21tZW50IDxhIGhyZWY9Imh0dHA6Ly9leGFtcGxlLmNvbSI+RXhhbXBsZTwvYT5dJywKICAgICAgJycsCiAgICAgICdbY29tbWVudCA8L3NlY3Rpb24+XScsCiAgICAgICdbY29tbWVudCA8L2Rpdj5dJyk7CgogIE1UKCdpbmxpbmVIdG1sJywKICAgICAgJ0kgY2FuIHVzZSBIVE1MIGRpcmVjdGx5IGluIG15IFtjb21tZW50IDxzcGFuIGNsYXNzPSJ5b3ViZXRjaGEiPlRleHRpbGU8L3NwYW4+XS4nKTsKCiAgLyoKICAgKiBOby1UZXh0aWxlCiAgICovCgogIE1UKCdub3RleHRpbGUnLAogICAgJ1tzdHJpbmctMiBub3RleHRpbGUuICpObyogZm9ybWF0dGluZ10nKTsKCiAgTVQoJ25vdGV4dGlsZUlubGluZScsCiAgICAgICdVc2UgW3N0cmluZy0yID09KmFzdGVyaXNrcyo9PV0gZm9yIFtzdHJvbmcgKnN0cm9uZypdIHRleHQuJyk7CgogIE1UKCdub3RleHRpbGVXaXRoUHJlJywKICAgICAgJ1tvcGVyYXRvciBwcmUuICpObyogZm9ybWF0dGluZ10nKTsKCiAgTVQoJ25vdGV4dGlsZVdpdGhTcGFubmluZ1ByZScsCiAgICAgICdbb3BlcmF0b3IgcHJlLi4gKk5vKiBmb3JtYXR0aW5nXScsCiAgICAgICcnLAogICAgICAnW29wZXJhdG9yICpObyogZm9ybWF0dGluZ10nKTsKCiAgLyogT25seSB0b2dnbGluZyBwaHJhc2VzIGJldHdlZW4gbm9uLXdvcmQgY2hhcnMuICovCgogIE1UKCdwaHJhc2UtaW4td29yZCcsCiAgICAgJ2Zvb19iYXJfYmF6Jyk7CgogIE1UKCdwaHJhc2Utbm9uLXdvcmQnLAogICAgICdbbmVnYXRpdmUgLXgtXSBhYWEtYmJiIGNjYy1kZGQgW25lZ2F0aXZlIC1lZWUtXSBmZmYgW25lZ2F0aXZlIC1nZ2ctXScpOwoKICBNVCgncGhyYXNlLWxvbmUtZGFzaCcsCiAgICAgJ2ZvbyAtIGJhciAtIGJheicpOwp9KSgpOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/textile/textile.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIHsgLy8gQ29tbW9uSlMKICAgIG1vZChyZXF1aXJlKCIuLi8uLi9saWIvY29kZW1pcnJvciIpKTsKICB9IGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kKSB7IC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICB9IGVsc2UgeyAvLyBQbGFpbiBicm93c2VyIGVudgogICAgbW9kKENvZGVNaXJyb3IpOwogIH0KfSkoZnVuY3Rpb24oQ29kZU1pcnJvcikgewogICJ1c2Ugc3RyaWN0IjsKCiAgdmFyIFRPS0VOX1NUWUxFUyA9IHsKICAgIGFkZGl0aW9uOiAicG9zaXRpdmUiLAogICAgYXR0cmlidXRlczogImF0dHJpYnV0ZSIsCiAgICBib2xkOiAic3Ryb25nIiwKICAgIGNpdGU6ICJrZXl3b3JkIiwKICAgIGNvZGU6ICJhdG9tIiwKICAgIGRlZmluaXRpb25MaXN0OiAibnVtYmVyIiwKICAgIGRlbGV0aW9uOiAibmVnYXRpdmUiLAogICAgZGl2OiAicHVuY3R1YXRpb24iLAogICAgZW06ICJlbSIsCiAgICBmb290bm90ZTogInZhcmlhYmxlIiwKICAgIGZvb3RDaXRlOiAicXVhbGlmaWVyIiwKICAgIGhlYWRlcjogImhlYWRlciIsCiAgICBodG1sOiAiY29tbWVudCIsCiAgICBpbWFnZTogInN0cmluZyIsCiAgICBpdGFsaWM6ICJlbSIsCiAgICBsaW5rOiAibGluayIsCiAgICBsaW5rRGVmaW5pdGlvbjogImxpbmsiLAogICAgbGlzdDE6ICJ2YXJpYWJsZS0yIiwKICAgIGxpc3QyOiAidmFyaWFibGUtMyIsCiAgICBsaXN0MzogImtleXdvcmQiLAogICAgbm90ZXh0aWxlOiAic3RyaW5nLTIiLAogICAgcHJlOiAib3BlcmF0b3IiLAogICAgcDogInByb3BlcnR5IiwKICAgIHF1b3RlOiAiYnJhY2tldCIsCiAgICBzcGFuOiAicXVvdGUiLAogICAgc3BlY2lhbENoYXI6ICJ0YWciLAogICAgc3Ryb25nOiAic3Ryb25nIiwKICAgIHN1YjogImJ1aWx0aW4iLAogICAgc3VwOiAiYnVpbHRpbiIsCiAgICB0YWJsZTogInZhcmlhYmxlLTMiLAogICAgdGFibGVIZWFkaW5nOiAib3BlcmF0b3IiCiAgfTsKCiAgZnVuY3Rpb24gc3RhcnROZXdMaW5lKHN0cmVhbSwgc3RhdGUpIHsKICAgIHN0YXRlLm1vZGUgPSBNb2Rlcy5uZXdMYXlvdXQ7CiAgICBzdGF0ZS50YWJsZUhlYWRpbmcgPSBmYWxzZTsKCiAgICBpZiAoc3RhdGUubGF5b3V0VHlwZSA9PT0gImRlZmluaXRpb25MaXN0IiAmJiBzdGF0ZS5zcGFubmluZ0xheW91dCAmJgogICAgICAgIHN0cmVhbS5tYXRjaChSRSgiZGVmaW5pdGlvbkxpc3RFbmQiKSwgZmFsc2UpKQogICAgICBzdGF0ZS5zcGFubmluZ0xheW91dCA9IGZhbHNlOwogIH0KCiAgZnVuY3Rpb24gaGFuZGxlUGhyYXNlTW9kaWZpZXIoc3RyZWFtLCBzdGF0ZSwgY2gpIHsKICAgIGlmIChjaCA9PT0gIl8iKSB7CiAgICAgIGlmIChzdHJlYW0uZWF0KCJfIikpCiAgICAgICAgcmV0dXJuIHRvZ2dsZVBocmFzZU1vZGlmaWVyKHN0cmVhbSwgc3RhdGUsICJpdGFsaWMiLCAvX18vLCAyKTsKICAgICAgZWxzZQogICAgICAgIHJldHVybiB0b2dnbGVQaHJhc2VNb2RpZmllcihzdHJlYW0sIHN0YXRlLCAiZW0iLCAvXy8sIDEpOwogICAgfQoKICAgIGlmIChjaCA9PT0gIioiKSB7CiAgICAgIGlmIChzdHJlYW0uZWF0KCIqIikpIHsKICAgICAgICByZXR1cm4gdG9nZ2xlUGhyYXNlTW9kaWZpZXIoc3RyZWFtLCBzdGF0ZSwgImJvbGQiLCAvXCpcKi8sIDIpOwogICAgICB9CiAgICAgIHJldHVybiB0b2dnbGVQaHJhc2VNb2RpZmllcihzdHJlYW0sIHN0YXRlLCAic3Ryb25nIiwgL1wqLywgMSk7CiAgICB9CgogICAgaWYgKGNoID09PSAiWyIpIHsKICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXGQrXF0vKSkgc3RhdGUuZm9vdENpdGUgPSB0cnVlOwogICAgICByZXR1cm4gdG9rZW5TdHlsZXMoc3RhdGUpOwogICAgfQoKICAgIGlmIChjaCA9PT0gIigiKSB7CiAgICAgIHZhciBzcGVjID0gc3RyZWFtLm1hdGNoKC9eKHJ8dG18YylcKS8pOwogICAgICBpZiAoc3BlYykKICAgICAgICByZXR1cm4gdG9rZW5TdHlsZXNXaXRoKHN0YXRlLCBUT0tFTl9TVFlMRVMuc3BlY2lhbENoYXIpOwogICAgfQoKICAgIGlmIChjaCA9PT0gIjwiICYmIHN0cmVhbS5tYXRjaCgvKFx3KylbXj5dKz5bXjxdKzxcL1wxPi8pKQogICAgICByZXR1cm4gdG9rZW5TdHlsZXNXaXRoKHN0YXRlLCBUT0tFTl9TVFlMRVMuaHRtbCk7CgogICAgaWYgKGNoID09PSAiPyIgJiYgc3RyZWFtLmVhdCgiPyIpKQogICAgICByZXR1cm4gdG9nZ2xlUGhyYXNlTW9kaWZpZXIoc3RyZWFtLCBzdGF0ZSwgImNpdGUiLCAvXD9cPy8sIDIpOwoKICAgIGlmIChjaCA9PT0gIj0iICYmIHN0cmVhbS5lYXQoIj0iKSkKICAgICAgcmV0dXJuIHRvZ2dsZVBocmFzZU1vZGlmaWVyKHN0cmVhbSwgc3RhdGUsICJub3RleHRpbGUiLCAvPT0vLCAyKTsKCiAgICBpZiAoY2ggPT09ICItIiAmJiAhc3RyZWFtLmVhdCgiLSIpKQogICAgICByZXR1cm4gdG9nZ2xlUGhyYXNlTW9kaWZpZXIoc3RyZWFtLCBzdGF0ZSwgImRlbGV0aW9uIiwgLy0vLCAxKTsKCiAgICBpZiAoY2ggPT09ICIrIikKICAgICAgcmV0dXJuIHRvZ2dsZVBocmFzZU1vZGlmaWVyKHN0cmVhbSwgc3RhdGUsICJhZGRpdGlvbiIsIC9cKy8sIDEpOwoKICAgIGlmIChjaCA9PT0gIn4iKQogICAgICByZXR1cm4gdG9nZ2xlUGhyYXNlTW9kaWZpZXIoc3RyZWFtLCBzdGF0ZSwgInN1YiIsIC9+LywgMSk7CgogICAgaWYgKGNoID09PSAiXiIpCiAgICAgIHJldHVybiB0b2dnbGVQaHJhc2VNb2RpZmllcihzdHJlYW0sIHN0YXRlLCAic3VwIiwgL1xeLywgMSk7CgogICAgaWYgKGNoID09PSAiJSIpCiAgICAgIHJldHVybiB0b2dnbGVQaHJhc2VNb2RpZmllcihzdHJlYW0sIHN0YXRlLCAic3BhbiIsIC8lLywgMSk7CgogICAgaWYgKGNoID09PSAiQCIpCiAgICAgIHJldHVybiB0b2dnbGVQaHJhc2VNb2RpZmllcihzdHJlYW0sIHN0YXRlLCAiY29kZSIsIC9ALywgMSk7CgogICAgaWYgKGNoID09PSAiISIpIHsKICAgICAgdmFyIHR5cGUgPSB0b2dnbGVQaHJhc2VNb2RpZmllcihzdHJlYW0sIHN0YXRlLCAiaW1hZ2UiLCAvKD86XChbXlwpXStcKSk/IS8sIDEpOwogICAgICBzdHJlYW0ubWF0Y2goL146XFMrLyk7IC8vIG9wdGlvbmFsIFVybCBwb3J0aW9uCiAgICAgIHJldHVybiB0eXBlOwogICAgfQogICAgcmV0dXJuIHRva2VuU3R5bGVzKHN0YXRlKTsKICB9CgogIGZ1bmN0aW9uIHRvZ2dsZVBocmFzZU1vZGlmaWVyKHN0cmVhbSwgc3RhdGUsIHBocmFzZU1vZGlmaWVyLCBjbG9zZVJFLCBvcGVuU2l6ZSkgewogICAgdmFyIGNoYXJCZWZvcmUgPSBzdHJlYW0ucG9zID4gb3BlblNpemUgPyBzdHJlYW0uc3RyaW5nLmNoYXJBdChzdHJlYW0ucG9zIC0gb3BlblNpemUgLSAxKSA6IG51bGw7CiAgICB2YXIgY2hhckFmdGVyID0gc3RyZWFtLnBlZWsoKTsKICAgIGlmIChzdGF0ZVtwaHJhc2VNb2RpZmllcl0pIHsKICAgICAgaWYgKCghY2hhckFmdGVyIHx8IC9cVy8udGVzdChjaGFyQWZ0ZXIpKSAmJiBjaGFyQmVmb3JlICYmIC9cUy8udGVzdChjaGFyQmVmb3JlKSkgewogICAgICAgIHZhciB0eXBlID0gdG9rZW5TdHlsZXMoc3RhdGUpOwogICAgICAgIHN0YXRlW3BocmFzZU1vZGlmaWVyXSA9IGZhbHNlOwogICAgICAgIHJldHVybiB0eXBlOwogICAgICB9CiAgICB9IGVsc2UgaWYgKCghY2hhckJlZm9yZSB8fCAvXFcvLnRlc3QoY2hhckJlZm9yZSkpICYmIGNoYXJBZnRlciAmJiAvXFMvLnRlc3QoY2hhckFmdGVyKSAmJgogICAgICAgICAgICAgICBzdHJlYW0ubWF0Y2gobmV3IFJlZ0V4cCgiXi4qXFxTIiArIGNsb3NlUkUuc291cmNlICsgIig/OlxcV3wkKSIpLCBmYWxzZSkpIHsKICAgICAgc3RhdGVbcGhyYXNlTW9kaWZpZXJdID0gdHJ1ZTsKICAgICAgc3RhdGUubW9kZSA9IE1vZGVzLmF0dHJpYnV0ZXM7CiAgICB9CiAgICByZXR1cm4gdG9rZW5TdHlsZXMoc3RhdGUpOwogIH07CgogIGZ1bmN0aW9uIHRva2VuU3R5bGVzKHN0YXRlKSB7CiAgICB2YXIgZGlzYWJsZWQgPSB0ZXh0aWxlRGlzYWJsZWQoc3RhdGUpOwogICAgaWYgKGRpc2FibGVkKSByZXR1cm4gZGlzYWJsZWQ7CgogICAgdmFyIHN0eWxlcyA9IFtdOwogICAgaWYgKHN0YXRlLmxheW91dFR5cGUpIHN0eWxlcy5wdXNoKFRPS0VOX1NUWUxFU1tzdGF0ZS5sYXlvdXRUeXBlXSk7CgogICAgc3R5bGVzID0gc3R5bGVzLmNvbmNhdChhY3RpdmVTdHlsZXMoCiAgICAgIHN0YXRlLCAiYWRkaXRpb24iLCAiYm9sZCIsICJjaXRlIiwgImNvZGUiLCAiZGVsZXRpb24iLCAiZW0iLCAiZm9vdENpdGUiLAogICAgICAiaW1hZ2UiLCAiaXRhbGljIiwgImxpbmsiLCAic3BhbiIsICJzdHJvbmciLCAic3ViIiwgInN1cCIsICJ0YWJsZSIsICJ0YWJsZUhlYWRpbmciKSk7CgogICAgaWYgKHN0YXRlLmxheW91dFR5cGUgPT09ICJoZWFkZXIiKQogICAgICBzdHlsZXMucHVzaChUT0tFTl9TVFlMRVMuaGVhZGVyICsgIi0iICsgc3RhdGUuaGVhZGVyKTsKCiAgICByZXR1cm4gc3R5bGVzLmxlbmd0aCA/IHN0eWxlcy5qb2luKCIgIikgOiBudWxsOwogIH0KCiAgZnVuY3Rpb24gdGV4dGlsZURpc2FibGVkKHN0YXRlKSB7CiAgICB2YXIgdHlwZSA9IHN0YXRlLmxheW91dFR5cGU7CgogICAgc3dpdGNoKHR5cGUpIHsKICAgIGNhc2UgIm5vdGV4dGlsZSI6CiAgICBjYXNlICJjb2RlIjoKICAgIGNhc2UgInByZSI6CiAgICAgIHJldHVybiBUT0tFTl9TVFlMRVNbdHlwZV07CiAgICBkZWZhdWx0OgogICAgICBpZiAoc3RhdGUubm90ZXh0aWxlKQogICAgICAgIHJldHVybiBUT0tFTl9TVFlMRVMubm90ZXh0aWxlICsgKHR5cGUgPyAoIiAiICsgVE9LRU5fU1RZTEVTW3R5cGVdKSA6ICIiKTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfQoKICBmdW5jdGlvbiB0b2tlblN0eWxlc1dpdGgoc3RhdGUsIGV4dHJhU3R5bGVzKSB7CiAgICB2YXIgZGlzYWJsZWQgPSB0ZXh0aWxlRGlzYWJsZWQoc3RhdGUpOwogICAgaWYgKGRpc2FibGVkKSByZXR1cm4gZGlzYWJsZWQ7CgogICAgdmFyIHR5cGUgPSB0b2tlblN0eWxlcyhzdGF0ZSk7CiAgICBpZiAoZXh0cmFTdHlsZXMpCiAgICAgIHJldHVybiB0eXBlID8gKHR5cGUgKyAiICIgKyBleHRyYVN0eWxlcykgOiBleHRyYVN0eWxlczsKICAgIGVsc2UKICAgICAgcmV0dXJuIHR5cGU7CiAgfQoKICBmdW5jdGlvbiBhY3RpdmVTdHlsZXMoc3RhdGUpIHsKICAgIHZhciBzdHlsZXMgPSBbXTsKICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgKytpKSB7CiAgICAgIGlmIChzdGF0ZVthcmd1bWVudHNbaV1dKQogICAgICAgIHN0eWxlcy5wdXNoKFRPS0VOX1NUWUxFU1thcmd1bWVudHNbaV1dKTsKICAgIH0KICAgIHJldHVybiBzdHlsZXM7CiAgfQoKICBmdW5jdGlvbiBibGFua0xpbmUoc3RhdGUpIHsKICAgIHZhciBzcGFubmluZ0xheW91dCA9IHN0YXRlLnNwYW5uaW5nTGF5b3V0LCB0eXBlID0gc3RhdGUubGF5b3V0VHlwZTsKCiAgICBmb3IgKHZhciBrZXkgaW4gc3RhdGUpIGlmIChzdGF0ZS5oYXNPd25Qcm9wZXJ0eShrZXkpKQogICAgICBkZWxldGUgc3RhdGVba2V5XTsKCiAgICBzdGF0ZS5tb2RlID0gTW9kZXMubmV3TGF5b3V0OwogICAgaWYgKHNwYW5uaW5nTGF5b3V0KSB7CiAgICAgIHN0YXRlLmxheW91dFR5cGUgPSB0eXBlOwogICAgICBzdGF0ZS5zcGFubmluZ0xheW91dCA9IHRydWU7CiAgICB9CiAgfQoKICB2YXIgUkVzID0gewogICAgY2FjaGU6IHt9LAogICAgc2luZ2xlOiB7CiAgICAgIGJjOiAiYmMiLAogICAgICBicTogImJxIiwKICAgICAgZGVmaW5pdGlvbkxpc3Q6IC8tIFteKD86Oj0pXSs6PSsvLAogICAgICBkZWZpbml0aW9uTGlzdEVuZDogLy4qPTpccyokLywKICAgICAgZGl2OiAiZGl2IiwKICAgICAgZHJhd1RhYmxlOiAvXHwuKlx8LywKICAgICAgZm9vdDogL2ZuXGQrLywKICAgICAgaGVhZGVyOiAvaFsxLTZdLywKICAgICAgaHRtbDogL1xzKjwoPzpcLyk/KFx3KykoPzpbXj5dKyk/Pig/OltePF0rPFwvXDE+KT8vLAogICAgICBsaW5rOiAvW14iXSsiOlxTLywKICAgICAgbGlua0RlZmluaXRpb246IC9cW1teXHNcXV0rXF1cUysvLAogICAgICBsaXN0OiAvKD86Iyt8XCorKS8sCiAgICAgIG5vdGV4dGlsZTogIm5vdGV4dGlsZSIsCiAgICAgIHBhcmE6ICJwIiwKICAgICAgcHJlOiAicHJlIiwKICAgICAgdGFibGU6ICJ0YWJsZSIsCiAgICAgIHRhYmxlQ2VsbEF0dHJpYnV0ZXM6IC9bXC9cXF1cZCsvLAogICAgICB0YWJsZUhlYWRpbmc6IC9cfF9cLi8sCiAgICAgIHRhYmxlVGV4dDogL1teIl9cKlxbXChcP1wrflxeJUB8LV0rLywKICAgICAgdGV4dDogL1teISJfPVwqXFtcKDxcP1wrflxeJUAtXSsvCiAgICB9LAogICAgYXR0cmlidXRlczogewogICAgICBhbGlnbjogLyg/Ojw+fDx8Pnw9KS8sCiAgICAgIHNlbGVjdG9yOiAvXChbXlwoXVteXCldK1wpLywKICAgICAgbGFuZzogL1xbW15cW1xdXStcXS8sCiAgICAgIHBhZDogLyg/OlwoK3xcKSspezEsMn0vLAogICAgICBjc3M6IC9ce1teXH1dK1x9LwogICAgfSwKICAgIGNyZWF0ZVJlOiBmdW5jdGlvbihuYW1lKSB7CiAgICAgIHN3aXRjaCAobmFtZSkgewogICAgICBjYXNlICJkcmF3VGFibGUiOgogICAgICAgIHJldHVybiBSRXMubWFrZVJlKCJeIiwgUkVzLnNpbmdsZS5kcmF3VGFibGUsICIkIik7CiAgICAgIGNhc2UgImh0bWwiOgogICAgICAgIHJldHVybiBSRXMubWFrZVJlKCJeIiwgUkVzLnNpbmdsZS5odG1sLCAiKD86IiwgUkVzLnNpbmdsZS5odG1sLCAiKSoiLCAiJCIpOwogICAgICBjYXNlICJsaW5rRGVmaW5pdGlvbiI6CiAgICAgICAgcmV0dXJuIFJFcy5tYWtlUmUoIl4iLCBSRXMuc2luZ2xlLmxpbmtEZWZpbml0aW9uLCAiJCIpOwogICAgICBjYXNlICJsaXN0TGF5b3V0IjoKICAgICAgICByZXR1cm4gUkVzLm1ha2VSZSgiXiIsIFJFcy5zaW5nbGUubGlzdCwgUkUoImFsbEF0dHJpYnV0ZXMiKSwgIipcXHMrIik7CiAgICAgIGNhc2UgInRhYmxlQ2VsbEF0dHJpYnV0ZXMiOgogICAgICAgIHJldHVybiBSRXMubWFrZVJlKCJeIiwgUkVzLmNob2ljZVJlKFJFcy5zaW5nbGUudGFibGVDZWxsQXR0cmlidXRlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRSgiYWxsQXR0cmlidXRlcyIpKSwgIitcXC4iKTsKICAgICAgY2FzZSAidHlwZSI6CiAgICAgICAgcmV0dXJuIFJFcy5tYWtlUmUoIl4iLCBSRSgiYWxsVHlwZXMiKSk7CiAgICAgIGNhc2UgInR5cGVMYXlvdXQiOgogICAgICAgIHJldHVybiBSRXMubWFrZVJlKCJeIiwgUkUoImFsbFR5cGVzIiksIFJFKCJhbGxBdHRyaWJ1dGVzIiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIipcXC5cXC4/IiwgIihcXHMrfCQpIik7CiAgICAgIGNhc2UgImF0dHJpYnV0ZXMiOgogICAgICAgIHJldHVybiBSRXMubWFrZVJlKCJeIiwgUkUoImFsbEF0dHJpYnV0ZXMiKSwgIisiKTsKCiAgICAgIGNhc2UgImFsbFR5cGVzIjoKICAgICAgICByZXR1cm4gUkVzLmNob2ljZVJlKFJFcy5zaW5nbGUuZGl2LCBSRXMuc2luZ2xlLmZvb3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRXMuc2luZ2xlLmhlYWRlciwgUkVzLnNpbmdsZS5iYywgUkVzLnNpbmdsZS5icSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFcy5zaW5nbGUubm90ZXh0aWxlLCBSRXMuc2luZ2xlLnByZSwgUkVzLnNpbmdsZS50YWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFcy5zaW5nbGUucGFyYSk7CgogICAgICBjYXNlICJhbGxBdHRyaWJ1dGVzIjoKICAgICAgICByZXR1cm4gUkVzLmNob2ljZVJlKFJFcy5hdHRyaWJ1dGVzLnNlbGVjdG9yLCBSRXMuYXR0cmlidXRlcy5jc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRXMuYXR0cmlidXRlcy5sYW5nLCBSRXMuYXR0cmlidXRlcy5hbGlnbiwgUkVzLmF0dHJpYnV0ZXMucGFkKTsKCiAgICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIFJFcy5tYWtlUmUoIl4iLCBSRXMuc2luZ2xlW25hbWVdKTsKICAgICAgfQogICAgfSwKICAgIG1ha2VSZTogZnVuY3Rpb24oKSB7CiAgICAgIHZhciBwYXR0ZXJuID0gIiI7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgdmFyIGFyZyA9IGFyZ3VtZW50c1tpXTsKICAgICAgICBwYXR0ZXJuICs9ICh0eXBlb2YgYXJnID09PSAic3RyaW5nIikgPyBhcmcgOiBhcmcuc291cmNlOwogICAgICB9CiAgICAgIHJldHVybiBuZXcgUmVnRXhwKHBhdHRlcm4pOwogICAgfSwKICAgIGNob2ljZVJlOiBmdW5jdGlvbigpIHsKICAgICAgdmFyIHBhcnRzID0gW2FyZ3VtZW50c1swXV07CiAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgcGFydHNbaSAqIDIgLSAxXSA9ICJ8IjsKICAgICAgICBwYXJ0c1tpICogMl0gPSBhcmd1bWVudHNbaV07CiAgICAgIH0KCiAgICAgIHBhcnRzLnVuc2hpZnQoIig/OiIpOwogICAgICBwYXJ0cy5wdXNoKCIpIik7CiAgICAgIHJldHVybiBSRXMubWFrZVJlLmFwcGx5KG51bGwsIHBhcnRzKTsKICAgIH0KICB9OwoKICBmdW5jdGlvbiBSRShuYW1lKSB7CiAgICByZXR1cm4gKFJFcy5jYWNoZVtuYW1lXSB8fCAoUkVzLmNhY2hlW25hbWVdID0gUkVzLmNyZWF0ZVJlKG5hbWUpKSk7CiAgfQoKICB2YXIgTW9kZXMgPSB7CiAgICBuZXdMYXlvdXQ6IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgaWYgKHN0cmVhbS5tYXRjaChSRSgidHlwZUxheW91dCIpLCBmYWxzZSkpIHsKICAgICAgICBzdGF0ZS5zcGFubmluZ0xheW91dCA9IGZhbHNlOwogICAgICAgIHJldHVybiAoc3RhdGUubW9kZSA9IE1vZGVzLmJsb2NrVHlwZSkoc3RyZWFtLCBzdGF0ZSk7CiAgICAgIH0KICAgICAgdmFyIG5ld01vZGU7CiAgICAgIGlmICghdGV4dGlsZURpc2FibGVkKHN0YXRlKSkgewogICAgICAgIGlmIChzdHJlYW0ubWF0Y2goUkUoImxpc3RMYXlvdXQiKSwgZmFsc2UpKQogICAgICAgICAgbmV3TW9kZSA9IE1vZGVzLmxpc3Q7CiAgICAgICAgZWxzZSBpZiAoc3RyZWFtLm1hdGNoKFJFKCJkcmF3VGFibGUiKSwgZmFsc2UpKQogICAgICAgICAgbmV3TW9kZSA9IE1vZGVzLnRhYmxlOwogICAgICAgIGVsc2UgaWYgKHN0cmVhbS5tYXRjaChSRSgibGlua0RlZmluaXRpb24iKSwgZmFsc2UpKQogICAgICAgICAgbmV3TW9kZSA9IE1vZGVzLmxpbmtEZWZpbml0aW9uOwogICAgICAgIGVsc2UgaWYgKHN0cmVhbS5tYXRjaChSRSgiZGVmaW5pdGlvbkxpc3QiKSkpCiAgICAgICAgICBuZXdNb2RlID0gTW9kZXMuZGVmaW5pdGlvbkxpc3Q7CiAgICAgICAgZWxzZSBpZiAoc3RyZWFtLm1hdGNoKFJFKCJodG1sIiksIGZhbHNlKSkKICAgICAgICAgIG5ld01vZGUgPSBNb2Rlcy5odG1sOwogICAgICB9CiAgICAgIHJldHVybiAoc3RhdGUubW9kZSA9IChuZXdNb2RlIHx8IE1vZGVzLnRleHQpKShzdHJlYW0sIHN0YXRlKTsKICAgIH0sCgogICAgYmxvY2tUeXBlOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHZhciBtYXRjaCwgdHlwZTsKICAgICAgc3RhdGUubGF5b3V0VHlwZSA9IG51bGw7CgogICAgICBpZiAobWF0Y2ggPSBzdHJlYW0ubWF0Y2goUkUoInR5cGUiKSkpCiAgICAgICAgdHlwZSA9IG1hdGNoWzBdOwogICAgICBlbHNlCiAgICAgICAgcmV0dXJuIChzdGF0ZS5tb2RlID0gTW9kZXMudGV4dCkoc3RyZWFtLCBzdGF0ZSk7CgogICAgICBpZiAobWF0Y2ggPSB0eXBlLm1hdGNoKFJFKCJoZWFkZXIiKSkpIHsKICAgICAgICBzdGF0ZS5sYXlvdXRUeXBlID0gImhlYWRlciI7CiAgICAgICAgc3RhdGUuaGVhZGVyID0gcGFyc2VJbnQobWF0Y2hbMF1bMV0pOwogICAgICB9IGVsc2UgaWYgKHR5cGUubWF0Y2goUkUoImJxIikpKSB7CiAgICAgICAgc3RhdGUubGF5b3V0VHlwZSA9ICJxdW90ZSI7CiAgICAgIH0gZWxzZSBpZiAodHlwZS5tYXRjaChSRSgiYmMiKSkpIHsKICAgICAgICBzdGF0ZS5sYXlvdXRUeXBlID0gImNvZGUiOwogICAgICB9IGVsc2UgaWYgKHR5cGUubWF0Y2goUkUoImZvb3QiKSkpIHsKICAgICAgICBzdGF0ZS5sYXlvdXRUeXBlID0gImZvb3Rub3RlIjsKICAgICAgfSBlbHNlIGlmICh0eXBlLm1hdGNoKFJFKCJub3RleHRpbGUiKSkpIHsKICAgICAgICBzdGF0ZS5sYXlvdXRUeXBlID0gIm5vdGV4dGlsZSI7CiAgICAgIH0gZWxzZSBpZiAodHlwZS5tYXRjaChSRSgicHJlIikpKSB7CiAgICAgICAgc3RhdGUubGF5b3V0VHlwZSA9ICJwcmUiOwogICAgICB9IGVsc2UgaWYgKHR5cGUubWF0Y2goUkUoImRpdiIpKSkgewogICAgICAgIHN0YXRlLmxheW91dFR5cGUgPSAiZGl2IjsKICAgICAgfSBlbHNlIGlmICh0eXBlLm1hdGNoKFJFKCJ0YWJsZSIpKSkgewogICAgICAgIHN0YXRlLmxheW91dFR5cGUgPSAidGFibGUiOwogICAgICB9CgogICAgICBzdGF0ZS5tb2RlID0gTW9kZXMuYXR0cmlidXRlczsKICAgICAgcmV0dXJuIHRva2VuU3R5bGVzKHN0YXRlKTsKICAgIH0sCgogICAgdGV4dDogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICBpZiAoc3RyZWFtLm1hdGNoKFJFKCJ0ZXh0IikpKSByZXR1cm4gdG9rZW5TdHlsZXMoc3RhdGUpOwoKICAgICAgdmFyIGNoID0gc3RyZWFtLm5leHQoKTsKICAgICAgaWYgKGNoID09PSAnIicpCiAgICAgICAgcmV0dXJuIChzdGF0ZS5tb2RlID0gTW9kZXMubGluaykoc3RyZWFtLCBzdGF0ZSk7CiAgICAgIHJldHVybiBoYW5kbGVQaHJhc2VNb2RpZmllcihzdHJlYW0sIHN0YXRlLCBjaCk7CiAgICB9LAoKICAgIGF0dHJpYnV0ZXM6IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgc3RhdGUubW9kZSA9IE1vZGVzLmxheW91dExlbmd0aDsKCiAgICAgIGlmIChzdHJlYW0ubWF0Y2goUkUoImF0dHJpYnV0ZXMiKSkpCiAgICAgICAgcmV0dXJuIHRva2VuU3R5bGVzV2l0aChzdGF0ZSwgVE9LRU5fU1RZTEVTLmF0dHJpYnV0ZXMpOwogICAgICBlbHNlCiAgICAgICAgcmV0dXJuIHRva2VuU3R5bGVzKHN0YXRlKTsKICAgIH0sCgogICAgbGF5b3V0TGVuZ3RoOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIGlmIChzdHJlYW0uZWF0KCIuIikgJiYgc3RyZWFtLmVhdCgiLiIpKQogICAgICAgIHN0YXRlLnNwYW5uaW5nTGF5b3V0ID0gdHJ1ZTsKCiAgICAgIHN0YXRlLm1vZGUgPSBNb2Rlcy50ZXh0OwogICAgICByZXR1cm4gdG9rZW5TdHlsZXMoc3RhdGUpOwogICAgfSwKCiAgICBsaXN0OiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHZhciBtYXRjaCA9IHN0cmVhbS5tYXRjaChSRSgibGlzdCIpKTsKICAgICAgc3RhdGUubGlzdERlcHRoID0gbWF0Y2hbMF0ubGVuZ3RoOwogICAgICB2YXIgbGlzdE1vZCA9IChzdGF0ZS5saXN0RGVwdGggLSAxKSAlIDM7CiAgICAgIGlmICghbGlzdE1vZCkKICAgICAgICBzdGF0ZS5sYXlvdXRUeXBlID0gImxpc3QxIjsKICAgICAgZWxzZSBpZiAobGlzdE1vZCA9PT0gMSkKICAgICAgICBzdGF0ZS5sYXlvdXRUeXBlID0gImxpc3QyIjsKICAgICAgZWxzZQogICAgICAgIHN0YXRlLmxheW91dFR5cGUgPSAibGlzdDMiOwoKICAgICAgc3RhdGUubW9kZSA9IE1vZGVzLmF0dHJpYnV0ZXM7CiAgICAgIHJldHVybiB0b2tlblN0eWxlcyhzdGF0ZSk7CiAgICB9LAoKICAgIGxpbms6IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgc3RhdGUubW9kZSA9IE1vZGVzLnRleHQ7CiAgICAgIGlmIChzdHJlYW0ubWF0Y2goUkUoImxpbmsiKSkpIHsKICAgICAgICBzdHJlYW0ubWF0Y2goL1xTKy8pOwogICAgICAgIHJldHVybiB0b2tlblN0eWxlc1dpdGgoc3RhdGUsIFRPS0VOX1NUWUxFUy5saW5rKTsKICAgICAgfQogICAgICByZXR1cm4gdG9rZW5TdHlsZXMoc3RhdGUpOwogICAgfSwKCiAgICBsaW5rRGVmaW5pdGlvbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICAgIHJldHVybiB0b2tlblN0eWxlc1dpdGgoc3RhdGUsIFRPS0VOX1NUWUxFUy5saW5rRGVmaW5pdGlvbik7CiAgICB9LAoKICAgIGRlZmluaXRpb25MaXN0OiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHN0cmVhbS5tYXRjaChSRSgiZGVmaW5pdGlvbkxpc3QiKSk7CgogICAgICBzdGF0ZS5sYXlvdXRUeXBlID0gImRlZmluaXRpb25MaXN0IjsKCiAgICAgIGlmIChzdHJlYW0ubWF0Y2goL1xzKiQvKSkKICAgICAgICBzdGF0ZS5zcGFubmluZ0xheW91dCA9IHRydWU7CiAgICAgIGVsc2UKICAgICAgICBzdGF0ZS5tb2RlID0gTW9kZXMuYXR0cmlidXRlczsKCiAgICAgIHJldHVybiB0b2tlblN0eWxlcyhzdGF0ZSk7CiAgICB9LAoKICAgIGh0bWw6IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICByZXR1cm4gdG9rZW5TdHlsZXNXaXRoKHN0YXRlLCBUT0tFTl9TVFlMRVMuaHRtbCk7CiAgICB9LAoKICAgIHRhYmxlOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHN0YXRlLmxheW91dFR5cGUgPSAidGFibGUiOwogICAgICByZXR1cm4gKHN0YXRlLm1vZGUgPSBNb2Rlcy50YWJsZUNlbGwpKHN0cmVhbSwgc3RhdGUpOwogICAgfSwKCiAgICB0YWJsZUNlbGw6IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgaWYgKHN0cmVhbS5tYXRjaChSRSgidGFibGVIZWFkaW5nIikpKQogICAgICAgIHN0YXRlLnRhYmxlSGVhZGluZyA9IHRydWU7CiAgICAgIGVsc2UKICAgICAgICBzdHJlYW0uZWF0KCJ8Iik7CgogICAgICBzdGF0ZS5tb2RlID0gTW9kZXMudGFibGVDZWxsQXR0cmlidXRlczsKICAgICAgcmV0dXJuIHRva2VuU3R5bGVzKHN0YXRlKTsKICAgIH0sCgogICAgdGFibGVDZWxsQXR0cmlidXRlczogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICBzdGF0ZS5tb2RlID0gTW9kZXMudGFibGVUZXh0OwoKICAgICAgaWYgKHN0cmVhbS5tYXRjaChSRSgidGFibGVDZWxsQXR0cmlidXRlcyIpKSkKICAgICAgICByZXR1cm4gdG9rZW5TdHlsZXNXaXRoKHN0YXRlLCBUT0tFTl9TVFlMRVMuYXR0cmlidXRlcyk7CiAgICAgIGVsc2UKICAgICAgICByZXR1cm4gdG9rZW5TdHlsZXMoc3RhdGUpOwogICAgfSwKCiAgICB0YWJsZVRleHQ6IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgaWYgKHN0cmVhbS5tYXRjaChSRSgidGFibGVUZXh0IikpKQogICAgICAgIHJldHVybiB0b2tlblN0eWxlcyhzdGF0ZSk7CgogICAgICBpZiAoc3RyZWFtLnBlZWsoKSA9PT0gInwiKSB7IC8vIGVuZCBvZiBjZWxsCiAgICAgICAgc3RhdGUubW9kZSA9IE1vZGVzLnRhYmxlQ2VsbDsKICAgICAgICByZXR1cm4gdG9rZW5TdHlsZXMoc3RhdGUpOwogICAgICB9CiAgICAgIHJldHVybiBoYW5kbGVQaHJhc2VNb2RpZmllcihzdHJlYW0sIHN0YXRlLCBzdHJlYW0ubmV4dCgpKTsKICAgIH0KICB9OwoKICBDb2RlTWlycm9yLmRlZmluZU1vZGUoInRleHRpbGUiLCBmdW5jdGlvbigpIHsKICAgIHJldHVybiB7CiAgICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB7IG1vZGU6IE1vZGVzLm5ld0xheW91dCB9OwogICAgICB9LAogICAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICAgIGlmIChzdHJlYW0uc29sKCkpIHN0YXJ0TmV3TGluZShzdHJlYW0sIHN0YXRlKTsKICAgICAgICByZXR1cm4gc3RhdGUubW9kZShzdHJlYW0sIHN0YXRlKTsKICAgICAgfSwKICAgICAgYmxhbmtMaW5lOiBibGFua0xpbmUKICAgIH07CiAgfSk7CgogIENvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC94LXRleHRpbGUiLCAidGV4dGlsZSIpOwp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/tiddlywiki/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/tiddlywiki/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogVGlkZGx5V2lraSBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJ0aWRkbHl3aWtpLmNzcyI+CjxzY3JpcHQgc3JjPSIuLi8uLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi8uLi9hZGRvbi9lZGl0L21hdGNoYnJhY2tldHMuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0idGlkZGx5d2lraS5qcyI+PC9zY3JpcHQ+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+LkNvZGVNaXJyb3Ige2JvcmRlci10b3A6IDFweCBzb2xpZCBibGFjazsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO308L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxoMT5Db2RlTWlycm9yPC9oMT48aW1nIGlkPWxvZ28gc3JjPSIuLi8uLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5MYW5ndWFnZSBtb2RlczwvYT4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+VGlkZGx5V2lraTwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+VGlkZGx5V2lraSBtb2RlPC9oMj4KCgo8ZGl2Pjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+CiFUaWRkbHlXaWtpIEZvcm1hdHRpbmcKKiBSZW5kZXJlZCB2ZXJzaW9ucyBjYW4gYmUgZm91bmQgYXQ6IGh0dHA6Ly93d3cudGlkZGx5d2lraS5jb20vI1JlZmVyZW5jZQoKfCFPcHRpb24gICAgICAgICAgICB8ICFTeW50YXggICAgICAgICAgICB8Cnxib2xkIGZvbnQgICAgICAgICAgfCAnJ2JvbGQnJyAgICAgICAgICAgfAp8aXRhbGljIHR5cGUgICAgICAgIHwgLy9pdGFsaWMvLyAgICAgICAgIHwKfHVuZGVybGluZWQgdGV4dCAgICB8IF9fdW5kZXJsaW5lZF9fICAgICB8CnxzdHJpa2V0aHJvdWdoIHRleHQgfCAtLXN0cmlrZXRocm91Z2gtLSAgfAp8c3VwZXJzY3JpcHQgdGV4dCAgIHwgc3VwZXJeXnNjcmlwdF5eICAgIHwKfHN1YnNjcmlwdCB0ZXh0ICAgICB8IHN1Yn5+c2NyaXB0fn4gICAgICB8CnxoaWdobGlnaHRlZCB0ZXh0ICAgfCBAQGhpZ2hsaWdodGVkQEAgICAgfAp8cHJlZm9ybWF0dGVkIHRleHQgIHwge3t7cHJlZm9ybWF0dGVkfX19IHwKCiFCbG9jayBFbGVtZW50cwo8PDwKIUhlYWRpbmcgMQoKISFIZWFkaW5nIDIKCiEhIUhlYWRpbmcgMwoKISEhIUhlYWRpbmcgNAoKISEhISFIZWFkaW5nIDUKPDw8CgohIUxpc3RzCjw8PAoqIHVub3JkZXJlZCBsaXN0LCBsZXZlbCAxCioqIHVub3JkZXJlZCBsaXN0LCBsZXZlbCAyCioqKiB1bm9yZGVyZWQgbGlzdCwgbGV2ZWwgMwoKIyBvcmRlcmVkIGxpc3QsIGxldmVsIDEKIyMgb3JkZXJlZCBsaXN0LCBsZXZlbCAyCiMjIyB1bm9yZGVyZWQgbGlzdCwgbGV2ZWwgMwoKOyBkZWZpbml0aW9uIGxpc3QsIHRlcm0KOiBkZWZpbml0aW9uIGxpc3QsIGRlc2NyaXB0aW9uCjw8PAoKISFCbG9ja3F1b3Rlcwo8PDwKPiBibG9ja3F1b3RlLCBsZXZlbCAxCj4+IGJsb2NrcXVvdGUsIGxldmVsIDIKPj4+IGJsb2NrcXVvdGUsIGxldmVsIDMKCj4gYmxvY2txdW90ZQo8PDwKCiEhUHJlZm9ybWF0dGVkIFRleHQKPDw8Cnt7ewpwcmVmb3JtYXR0ZWQgKGUuZy4gY29kZSkKfX19Cjw8PAoKISFDb2RlIFNlY3Rpb25zCjw8PAp7e3sKVGV4dCBzdHlsZSBjb2RlCn19fQoKLy97e3sKSlMgc3R5bGVkIGNvZGUuIFRpZGRseVdpa2kgbWl4ZWQgbW9kZSBzaG91bGQgc3VwcG9ydCBoaWdobGlnaHRlciBzd2l0Y2hpbmcgaW4gdGhlIGZ1dHVyZS4KLy99fX0KCjwhLS17e3stLT4KWE1MIHN0eWxlZCBjb2RlLiBUaWRkbHlXaWtpIG1peGVkIG1vZGUgc2hvdWxkIHN1cHBvcnQgaGlnaGxpZ2h0ZXIgc3dpdGNoaW5nIGluIHRoZSBmdXR1cmUuCjwhLS19fX0tLT4KPDw8CgohIVRhYmxlcwo8PDwKfENzc0NsYXNzfGsKfCFoZWFkaW5nIGNvbHVtbiAxfCFoZWFkaW5nIGNvbHVtbiAyfAp8cm93IDEsIGNvbHVtbiAxfHJvdyAxLCBjb2x1bW4gMnwKfHJvdyAyLCBjb2x1bW4gMXxyb3cgMiwgY29sdW1uIDJ8Cnw+fENPTFNQQU58CnxST1dTUEFOfCAuLi4gfAp8fnwgLi4uIHwKfENzc1Byb3BlcnR5OnZhbHVlOy4uLnwgLi4uIHwKfGNhcHRpb258YwoKJydBbm5vdGF0aW9uOicnCiogVGhlIHt7ez59fX0gbWFya2VyIGNyZWF0ZXMgYSAiY29sc3BhbiIsIGNhdXNpbmcgdGhlIGN1cnJlbnQgY2VsbCB0byBtZXJnZSB3aXRoIHRoZSBvbmUgdG8gdGhlIHJpZ2h0LgoqIFRoZSB7e3t+fX19IG1hcmtlciBjcmVhdGVzIGEgInJvd3NwYW4iLCBjYXVzaW5nIHRoZSBjdXJyZW50IGNlbGwgdG8gbWVyZ2Ugd2l0aCB0aGUgb25lIGFib3ZlLgo8PDwKISFJbWFnZXMgLyUgVE9ETyAlLwpjZi4gW1tUaWRkbHlXaWtpLmNvbXxodHRwOi8vd3d3LnRpZGRseXdpa2kuY29tLyNFbWJlZGRlZEltYWdlc11dCgohSHlwZXJsaW5rcwoqIFtbV2lraVdvcmRzfFdpa2lXb3JkXV0gYXJlIGF1dG9tYXRpY2FsbHkgdHJhbnNmb3JtZWQgdG8gaHlwZXJsaW5rcyB0byB0aGUgcmVzcGVjdGl2ZSB0aWRkbGVyCioqIHRoZSBhdXRvbWF0aWMgdHJhbnNmb3JtYXRpb24gY2FuIGJlIHN1cHByZXNzZWQgYnkgcHJlY2VkaW5nIHRoZSByZXNwZWN0aXZlIFdpa2lXb3JkIHdpdGggYSB0aWxkZSAoe3t7fn19fSk6IHt7e35XaWtpV29yZH19fQoqIFtbUHJldHR5TGlua3NdXSBhcmUgZW5jbG9zZWQgaW4gc3F1YXJlIGJyYWNrZXRzIGFuZCBjb250YWluIHRoZSBkZXNpcmVkIHRpZGRsZXIgbmFtZToge3t7W1t0aWRkbGVyIG5hbWVdXX19fQoqKiBvcHRpb25hbGx5LCBhIGN1c3RvbSB0aXRsZSBvciBkZXNjcmlwdGlvbiBjYW4gYmUgYWRkZWQsIHNlcGFyYXRlZCBieSBhIHBpcGUgY2hhcmFjdGVyICh7e3t8fX19KToge3t7W1t0aXRsZXx0YXJnZXRdXX19fTxicj4nJydOLkIuOicnJyBJbiB0aGlzIGNhc2UsIHRoZSB0YXJnZXQgY2FuIGFsc28gYmUgYW55IHdlYnNpdGUgKGkuZS4gVVJMKS4KCiFDdXN0b20gU3R5bGluZwoqIHt7e0BAQ3NzUHJvcGVydHk6dmFsdWU7Q3NzUHJvcGVydHk6dmFsdWU7Li4uQEB9fX08YnI+JydOLkIuOicnIENTUyBjb2xvciBkZWZpbml0aW9ucyBzaG91bGQgdXNlIGxvd2VyY2FzZSBsZXR0ZXJzIHRvIHByZXZlbnQgdGhlIGluYWR2ZXJ0ZW50IGNyZWF0aW9uIG9mIFdpa2lXb3Jkcy4KKiA8aHRtbD48Y29kZT57e2N1c3RvbUNzc0NsYXNzey4uLn19fTwvY29kZT48L2h0bWw+CiogcmF3IEhUTUwgY2FuIGJlIGluc2VydGVkIGJ5IGVuY2xvc2luZyB0aGUgcmVzcGVjdGl2ZSBjb2RlIGluIEhUTUwgdGFnczoge3t7PGh0bWw+IC4uLiA8L2h0bWw+fX19CgohU3BlY2lhbCBNYXJrZXJzCioge3t7PGJyPn19fSBmb3JjZXMgYSBtYW51YWwgbGluZSBicmVhawoqIHt7ey0tLS19fX0gY3JlYXRlcyBhIGhvcml6b250YWwgcnVsZXIKKiBbW0hUTUwgZW50aXRpZXN8aHR0cDovL3d3dy50aWRkbHl3aWtpLmNvbS8jSHRtbEVudGl0aWVzXV0KKiBbW0hUTUwgZW50aXRpZXMgbG9jYWx8SHRtbEVudGl0aWVzXV0KKiB7e3s8PG1hY3JvTmFtZT4+fX19IGNhbGxzIHRoZSByZXNwZWN0aXZlIFtbbWFjcm98TWFjcm9zXV0KKiBUbyBoaWRlIHRleHQgd2l0aGluIGEgdGlkZGxlciBzbyB0aGF0IGl0IGlzIG5vdCBkaXNwbGF5ZWQsIGl0IGNhbiBiZSB3cmFwcGVkIGluIHt7ey8lfX19IGFuZCB7e3slL319fS48YnIvPlRoaXMgY2FuIGJlIGEgdXNlZnVsIHRyaWNrIGZvciBoaWRpbmcgZHJhZnRzIG9yIGFubm90YXRpbmcgY29tcGxleCBtYXJrdXAuCiogVG8gcHJldmVudCB3aWtpIG1hcmt1cCBmcm9tIHRha2luZyBlZmZlY3QgZm9yIGEgcGFydGljdWxhciBzZWN0aW9uLCB0aGF0IHNlY3Rpb24gY2FuIGJlIGVuY2xvc2VkIGluIHRocmVlIGRvdWJsZSBxdW90ZXM6IGUuZy4ge3t7IiIiV2lraVdvcmQiIiJ9fX0uCjwvdGV4dGFyZWE+PC9kaXY+CgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICBtb2RlOiAndGlkZGx5d2lraScsICAgICAgCiAgICAgICAgbGluZU51bWJlcnM6IHRydWUsCiAgICAgICAgbWF0Y2hCcmFja2V0czogdHJ1ZQogICAgICB9KTsKICAgIDwvc2NyaXB0PgoKICAgIDxwPlRpZGRseVdpa2kgbW9kZSBzdXBwb3J0cyBhIHNpbmdsZSBjb25maWd1cmF0aW9uLjwvcD4KCiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC94LXRpZGRseXdpa2k8L2NvZGU+LjwvcD4KICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/tiddlywiki/tiddlywiki.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[c3Bhbi5jbS11bmRlcmxpbmVkIHsKICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKfQpzcGFuLmNtLXN0cmlrZXRocm91Z2ggewogIHRleHQtZGVjb3JhdGlvbjogbGluZS10aHJvdWdoOwp9CnNwYW4uY20tYnJhY2UgewogIGNvbG9yOiAjMTcwOwogIGZvbnQtd2VpZ2h0OiBib2xkOwp9CnNwYW4uY20tdGFibGUgewogIGNvbG9yOiBibHVlOwogIGZvbnQtd2VpZ2h0OiBib2xkOwp9Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/tiddlywiki/tiddlywiki.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovKioqCiAgICB8JydOYW1lJyd8dGlkZGx5d2lraS5qc3wKICAgIHwnJ0Rlc2NyaXB0aW9uJyd8RW5hYmxlcyBUaWRkbHlXaWtpeSBzeW50YXggaGlnaGxpZ2h0aW5nIHVzaW5nIENvZGVNaXJyb3J8CiAgICB8JydBdXRob3InJ3xQTWFyaW98CiAgICB8JydWZXJzaW9uJyd8MC4xLjd8CiAgICB8JydTdGF0dXMnJ3wnJ3N0YWJsZScnfAogICAgfCcnU291cmNlJyd8W1tHaXRIdWJ8aHR0cHM6Ly9naXRodWIuY29tL3BtYXJpby9Db2RlTWlycm9yMi9ibG9iL3R3LXN5bnRheC9tb2RlL3RpZGRseXdpa2ldXXwKICAgIHwnJ0RvY3VtZW50YXRpb24nJ3xodHRwOi8vY29kZW1pcnJvci50aWRkbHlzcGFjZS5jb20vfAogICAgfCcnTGljZW5zZScnfFtbTUlUIExpY2Vuc2V8aHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9taXQtbGljZW5zZS5waHBdXXwKICAgIHwnJ0NvcmVWZXJzaW9uJyd8Mi41LjB8CiAgICB8JydSZXF1aXJlcycnfGNvZGVtaXJyb3IuanN8CiAgICB8JydLZXl3b3JkcycnfHN5bnRheCBoaWdobGlnaHRpbmcgY29sb3IgY29kZSBtaXJyb3IgY29kZW1pcnJvcnwKICAgICEgSW5mbwogICAgQ29yZVZlcnNpb24gcGFyYW1ldGVyIGlzIG5lZWRlZCBmb3IgVGlkZGx5V2lraSBvbmx5IQoqKiovCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJ0aWRkbHl3aWtpIiwgZnVuY3Rpb24gKCkgewogIC8vIFRva2VuaXplcgogIHZhciB0ZXh0d29yZHMgPSB7fTsKCiAgdmFyIGtleXdvcmRzID0gewogICAgImFsbFRhZ3MiOiB0cnVlLCAiY2xvc2VBbGwiOiB0cnVlLCAibGlzdCI6IHRydWUsCiAgICAibmV3Sm91cm5hbCI6IHRydWUsICJuZXdUaWRkbGVyIjogdHJ1ZSwKICAgICJwZXJtYXZpZXciOiB0cnVlLCAic2F2ZUNoYW5nZXMiOiB0cnVlLAogICAgInNlYXJjaCI6IHRydWUsICJzbGlkZXIiOiB0cnVlLCAidGFicyI6IHRydWUsCiAgICAidGFnIjogdHJ1ZSwgInRhZ2dpbmciOiB0cnVlLCAidGFncyI6IHRydWUsCiAgICAidGlkZGxlciI6IHRydWUsICJ0aW1lbGluZSI6IHRydWUsCiAgICAidG9kYXkiOiB0cnVlLCAidmVyc2lvbiI6IHRydWUsICJvcHRpb24iOiB0cnVlLAogICAgIndpdGgiOiB0cnVlLCAiZmlsdGVyIjogdHJ1ZQogIH07CgogIHZhciBpc1NwYWNlTmFtZSA9IC9bXHdfXC1dL2ksCiAgICAgIHJlSFIgPSAvXlwtXC1cLVwtKyQvLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDxocj4KICAgICAgcmVXaWtpQ29tbWVudFN0YXJ0ID0gL15cL1wqXCpcKiQvLCAgICAgICAgICAgIC8vIC8qKioKICAgICAgcmVXaWtpQ29tbWVudFN0b3AgPSAvXlwqXCpcKlwvJC8sICAgICAgICAgICAgIC8vICoqKi8KICAgICAgcmVCbG9ja1F1b3RlID0gL148PDwkLywKCiAgICAgIHJlSnNDb2RlU3RhcnQgPSAvXlwvXC9ce1x7XHskLywgICAgICAgICAgICAgICAgICAgICAgIC8vIC8ve3t7IGpzIGJsb2NrIHN0YXJ0CiAgICAgIHJlSnNDb2RlU3RvcCA9IC9eXC9cL1x9XH1cfSQvLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIC8vfX19IGpzIHN0b3AKICAgICAgcmVYbWxDb2RlU3RhcnQgPSAvXjwhLS1ce1x7XHstLT4kLywgICAgICAgICAgIC8vIHhtbCBibG9jayBzdGFydAogICAgICByZVhtbENvZGVTdG9wID0gL148IS0tXH1cfVx9LS0+JC8sICAgICAgICAgICAgLy8geG1sIHN0b3AKCiAgICAgIHJlQ29kZUJsb2NrU3RhcnQgPSAvXlx7XHtceyQvLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIHt7eyBUVyB0ZXh0IGRpdiBibG9jayBzdGFydAogICAgICByZUNvZGVCbG9ja1N0b3AgPSAvXlx9XH1cfSQvLCAgICAgICAgICAgICAgICAgLy8gfX19IFRXIHRleHQgc3RvcAoKICAgICAgcmVVbnRpbENvZGVTdG9wID0gLy4qP1x9XH1cfS87CgogIGZ1bmN0aW9uIGNoYWluKHN0cmVhbSwgc3RhdGUsIGYpIHsKICAgIHN0YXRlLnRva2VuaXplID0gZjsKICAgIHJldHVybiBmKHN0cmVhbSwgc3RhdGUpOwogIH0KCiAgZnVuY3Rpb24gdG9rZW5CYXNlKHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBzb2wgPSBzdHJlYW0uc29sKCksIGNoID0gc3RyZWFtLnBlZWsoKTsKCiAgICBzdGF0ZS5ibG9jayA9IGZhbHNlOyAgICAgICAgLy8gaW5kaWNhdGVzIHRoZSBzdGFydCBvZiBhIGNvZGUgYmxvY2suCgogICAgLy8gY2hlY2sgc3RhcnQgb2YgIGJsb2NrcwogICAgaWYgKHNvbCAmJiAvWzxcL1wqe31cLV0vLnRlc3QoY2gpKSB7CiAgICAgIGlmIChzdHJlYW0ubWF0Y2gocmVDb2RlQmxvY2tTdGFydCkpIHsKICAgICAgICBzdGF0ZS5ibG9jayA9IHRydWU7CiAgICAgICAgcmV0dXJuIGNoYWluKHN0cmVhbSwgc3RhdGUsIHR3VG9rZW5Db2RlKTsKICAgICAgfQogICAgICBpZiAoc3RyZWFtLm1hdGNoKHJlQmxvY2tRdW90ZSkpCiAgICAgICAgcmV0dXJuICdxdW90ZSc7CiAgICAgIGlmIChzdHJlYW0ubWF0Y2gocmVXaWtpQ29tbWVudFN0YXJ0KSB8fCBzdHJlYW0ubWF0Y2gocmVXaWtpQ29tbWVudFN0b3ApKQogICAgICAgIHJldHVybiAnY29tbWVudCc7CiAgICAgIGlmIChzdHJlYW0ubWF0Y2gocmVKc0NvZGVTdGFydCkgfHwgc3RyZWFtLm1hdGNoKHJlSnNDb2RlU3RvcCkgfHwgc3RyZWFtLm1hdGNoKHJlWG1sQ29kZVN0YXJ0KSB8fCBzdHJlYW0ubWF0Y2gocmVYbWxDb2RlU3RvcCkpCiAgICAgICAgcmV0dXJuICdjb21tZW50JzsKICAgICAgaWYgKHN0cmVhbS5tYXRjaChyZUhSKSkKICAgICAgICByZXR1cm4gJ2hyJzsKICAgIH0KCiAgICBzdHJlYW0ubmV4dCgpOwogICAgaWYgKHNvbCAmJiAvW1wvXCohIzs6PnxdLy50ZXN0KGNoKSkgewogICAgICBpZiAoY2ggPT0gIiEiKSB7IC8vIHR3IGhlYWRlcgogICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgICByZXR1cm4gImhlYWRlciI7CiAgICAgIH0KICAgICAgaWYgKGNoID09ICIqIikgeyAvLyB0dyBsaXN0CiAgICAgICAgc3RyZWFtLmVhdFdoaWxlKCcqJyk7CiAgICAgICAgcmV0dXJuICJjb21tZW50IjsKICAgICAgfQogICAgICBpZiAoY2ggPT0gIiMiKSB7IC8vIHR3IG51bWJlcmVkIGxpc3QKICAgICAgICBzdHJlYW0uZWF0V2hpbGUoJyMnKTsKICAgICAgICByZXR1cm4gImNvbW1lbnQiOwogICAgICB9CiAgICAgIGlmIChjaCA9PSAiOyIpIHsgLy8gZGVmaW5pdGlvbiBsaXN0LCB0ZXJtCiAgICAgICAgc3RyZWFtLmVhdFdoaWxlKCc7Jyk7CiAgICAgICAgcmV0dXJuICJjb21tZW50IjsKICAgICAgfQogICAgICBpZiAoY2ggPT0gIjoiKSB7IC8vIGRlZmluaXRpb24gbGlzdCwgZGVzY3JpcHRpb24KICAgICAgICBzdHJlYW0uZWF0V2hpbGUoJzonKTsKICAgICAgICByZXR1cm4gImNvbW1lbnQiOwogICAgICB9CiAgICAgIGlmIChjaCA9PSAiPiIpIHsgLy8gc2luZ2xlIGxpbmUgcXVvdGUKICAgICAgICBzdHJlYW0uZWF0V2hpbGUoIj4iKTsKICAgICAgICByZXR1cm4gInF1b3RlIjsKICAgICAgfQogICAgICBpZiAoY2ggPT0gJ3wnKQogICAgICAgIHJldHVybiAnaGVhZGVyJzsKICAgIH0KCiAgICBpZiAoY2ggPT0gJ3snICYmIHN0cmVhbS5tYXRjaCgvXHtcey8pKQogICAgICByZXR1cm4gY2hhaW4oc3RyZWFtLCBzdGF0ZSwgdHdUb2tlbkNvZGUpOwoKICAgIC8vIHJ1ZGltZW50YXJ5IGh0bWw6Ly8gZmlsZTovLyBsaW5rIG1hdGNoaW5nLiBUVyBrbm93cyBtdWNoIG1vcmUgLi4uCiAgICBpZiAoL1toZl0vaS50ZXN0KGNoKSAmJgogICAgICAgIC9bdGldL2kudGVzdChzdHJlYW0ucGVlaygpKSAmJgogICAgICAgIHN0cmVhbS5tYXRjaCgvXGIodHRwcz98dHB8aWxlKTpcL1wvW1wtQS1aMC05KyZAI1wvJT89fl98JCE6LC47XSpbQS1aMC05KyZAI1wvJT1+X3wkXS9pKSkKICAgICAgcmV0dXJuICJsaW5rIjsKCiAgICAvLyBqdXN0IGEgbGl0dGxlIHN0cmluZyBpbmRpY2F0b3IsIGRvbid0IHdhbnQgdG8gaGF2ZSB0aGUgd2hvbGUgc3RyaW5nIGNvdmVyZWQKICAgIGlmIChjaCA9PSAnIicpCiAgICAgIHJldHVybiAnc3RyaW5nJzsKCiAgICBpZiAoY2ggPT0gJ34nKSAgICAvLyBfbm9fIENhbWVsQ2FzZSBpbmRpY2F0b3Igc2hvdWxkIGJlIGJvbGQKICAgICAgcmV0dXJuICdicmFjZSc7CgogICAgaWYgKC9bXFtcXV0vLnRlc3QoY2gpICYmIHN0cmVhbS5tYXRjaChjaCkpIC8vIGNoZWNrIGZvciBbWy4uXV0KICAgICAgcmV0dXJuICdicmFjZSc7CgogICAgaWYgKGNoID09ICJAIikgeyAgICAvLyBjaGVjayBmb3Igc3BhY2UgbGluay4gVE9ETyBmaXggQEAuLi5AQCBoaWdobGlnaHRpbmcKICAgICAgc3RyZWFtLmVhdFdoaWxlKGlzU3BhY2VOYW1lKTsKICAgICAgcmV0dXJuICJsaW5rIjsKICAgIH0KCiAgICBpZiAoL1xkLy50ZXN0KGNoKSkgeyAgICAgICAgLy8gbnVtYmVycwogICAgICBzdHJlYW0uZWF0V2hpbGUoL1xkLyk7CiAgICAgIHJldHVybiAibnVtYmVyIjsKICAgIH0KCiAgICBpZiAoY2ggPT0gIi8iKSB7IC8vIHR3IGludmlzaWJsZSBjb21tZW50CiAgICAgIGlmIChzdHJlYW0uZWF0KCIlIikpIHsKICAgICAgICByZXR1cm4gY2hhaW4oc3RyZWFtLCBzdGF0ZSwgdHdUb2tlbkNvbW1lbnQpOwogICAgICB9IGVsc2UgaWYgKHN0cmVhbS5lYXQoIi8iKSkgeyAvLwogICAgICAgIHJldHVybiBjaGFpbihzdHJlYW0sIHN0YXRlLCB0d1Rva2VuRW0pOwogICAgICB9CiAgICB9CgogICAgaWYgKGNoID09ICJfIiAmJiBzdHJlYW0uZWF0KCJfIikpIC8vIHR3IHVuZGVybGluZQogICAgICAgIHJldHVybiBjaGFpbihzdHJlYW0sIHN0YXRlLCB0d1Rva2VuVW5kZXJsaW5lKTsKCiAgICAvLyBzdHJpa2V0aHJvdWdoIGFuZCBtZGFzaCBoYW5kbGluZwogICAgaWYgKGNoID09ICItIiAmJiBzdHJlYW0uZWF0KCItIikpIHsKICAgICAgLy8gaWYgc3RyaWtldGhyb3VnaCBsb29rcyB1Z2x5LCBjaGFuZ2UgQ1NTLgogICAgICBpZiAoc3RyZWFtLnBlZWsoKSAhPSAnICcpCiAgICAgICAgcmV0dXJuIGNoYWluKHN0cmVhbSwgc3RhdGUsIHR3VG9rZW5TdHJpa2UpOwogICAgICAvLyBtZGFzaAogICAgICBpZiAoc3RyZWFtLnBlZWsoKSA9PSAnICcpCiAgICAgICAgcmV0dXJuICdicmFjZSc7CiAgICB9CgogICAgaWYgKGNoID09ICInIiAmJiBzdHJlYW0uZWF0KCInIikpIC8vIHR3IGJvbGQKICAgICAgcmV0dXJuIGNoYWluKHN0cmVhbSwgc3RhdGUsIHR3VG9rZW5TdHJvbmcpOwoKICAgIGlmIChjaCA9PSAiPCIgJiYgc3RyZWFtLmVhdCgiPCIpKSAvLyB0dyBtYWNybwogICAgICByZXR1cm4gY2hhaW4oc3RyZWFtLCBzdGF0ZSwgdHdUb2tlbk1hY3JvKTsKCiAgICAvLyBjb3JlIG1hY3JvIGhhbmRsaW5nCiAgICBzdHJlYW0uZWF0V2hpbGUoL1tcd1wkX10vKTsKICAgIHJldHVybiB0ZXh0d29yZHMucHJvcGVydHlJc0VudW1lcmFibGUoc3RyZWFtLmN1cnJlbnQoKSkgPyAia2V5d29yZCIgOiBudWxsCiAgfQoKICAvLyB0dyBpbnZpc2libGUgY29tbWVudAogIGZ1bmN0aW9uIHR3VG9rZW5Db21tZW50KHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBtYXliZUVuZCA9IGZhbHNlLCBjaDsKICAgIHdoaWxlIChjaCA9IHN0cmVhbS5uZXh0KCkpIHsKICAgICAgaWYgKGNoID09ICIvIiAmJiBtYXliZUVuZCkgewogICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIG1heWJlRW5kID0gKGNoID09ICIlIik7CiAgICB9CiAgICByZXR1cm4gImNvbW1lbnQiOwogIH0KCiAgLy8gdHcgc3Ryb25nIC8gYm9sZAogIGZ1bmN0aW9uIHR3VG9rZW5TdHJvbmcoc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIG1heWJlRW5kID0gZmFsc2UsCiAgICBjaDsKICAgIHdoaWxlIChjaCA9IHN0cmVhbS5uZXh0KCkpIHsKICAgICAgaWYgKGNoID09ICInIiAmJiBtYXliZUVuZCkgewogICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIG1heWJlRW5kID0gKGNoID09ICInIik7CiAgICB9CiAgICByZXR1cm4gInN0cm9uZyI7CiAgfQoKICAvLyB0dyBjb2RlCiAgZnVuY3Rpb24gdHdUb2tlbkNvZGUoc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIHNiID0gc3RhdGUuYmxvY2s7CgogICAgaWYgKHNiICYmIHN0cmVhbS5jdXJyZW50KCkpIHsKICAgICAgcmV0dXJuICJjb21tZW50IjsKICAgIH0KCiAgICBpZiAoIXNiICYmIHN0cmVhbS5tYXRjaChyZVVudGlsQ29kZVN0b3ApKSB7CiAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlOwogICAgICByZXR1cm4gImNvbW1lbnQiOwogICAgfQoKICAgIGlmIChzYiAmJiBzdHJlYW0uc29sKCkgJiYgc3RyZWFtLm1hdGNoKHJlQ29kZUJsb2NrU3RvcCkpIHsKICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICAgIHJldHVybiAiY29tbWVudCI7CiAgICB9CgogICAgc3RyZWFtLm5leHQoKTsKICAgIHJldHVybiAiY29tbWVudCI7CiAgfQoKICAvLyB0dyBlbSAvIGl0YWxpYwogIGZ1bmN0aW9uIHR3VG9rZW5FbShzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgbWF5YmVFbmQgPSBmYWxzZSwKICAgIGNoOwogICAgd2hpbGUgKGNoID0gc3RyZWFtLm5leHQoKSkgewogICAgICBpZiAoY2ggPT0gIi8iICYmIG1heWJlRW5kKSB7CiAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgbWF5YmVFbmQgPSAoY2ggPT0gIi8iKTsKICAgIH0KICAgIHJldHVybiAiZW0iOwogIH0KCiAgLy8gdHcgdW5kZXJsaW5lZCB0ZXh0CiAgZnVuY3Rpb24gdHdUb2tlblVuZGVybGluZShzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgbWF5YmVFbmQgPSBmYWxzZSwKICAgIGNoOwogICAgd2hpbGUgKGNoID0gc3RyZWFtLm5leHQoKSkgewogICAgICBpZiAoY2ggPT0gIl8iICYmIG1heWJlRW5kKSB7CiAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgbWF5YmVFbmQgPSAoY2ggPT0gIl8iKTsKICAgIH0KICAgIHJldHVybiAidW5kZXJsaW5lZCI7CiAgfQoKICAvLyB0dyBzdHJpa2UgdGhyb3VnaCB0ZXh0IGxvb2tzIHVnbHkKICAvLyBjaGFuZ2UgQ1NTIGlmIG5lZWRlZAogIGZ1bmN0aW9uIHR3VG9rZW5TdHJpa2Uoc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIG1heWJlRW5kID0gZmFsc2UsIGNoOwoKICAgIHdoaWxlIChjaCA9IHN0cmVhbS5uZXh0KCkpIHsKICAgICAgaWYgKGNoID09ICItIiAmJiBtYXliZUVuZCkgewogICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIG1heWJlRW5kID0gKGNoID09ICItIik7CiAgICB9CiAgICByZXR1cm4gInN0cmlrZXRocm91Z2giOwogIH0KCiAgLy8gbWFjcm8KICBmdW5jdGlvbiB0d1Rva2VuTWFjcm8oc3RyZWFtLCBzdGF0ZSkgewogICAgaWYgKHN0cmVhbS5jdXJyZW50KCkgPT0gJzw8JykgewogICAgICByZXR1cm4gJ21hY3JvJzsKICAgIH0KCiAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpOwogICAgaWYgKCFjaCkgewogICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBpZiAoY2ggPT0gIj4iKSB7CiAgICAgIGlmIChzdHJlYW0ucGVlaygpID09ICc+JykgewogICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICAgICAgcmV0dXJuICJtYWNybyI7CiAgICAgIH0KICAgIH0KCiAgICBzdHJlYW0uZWF0V2hpbGUoL1tcd1wkX10vKTsKICAgIHJldHVybiBrZXl3b3Jkcy5wcm9wZXJ0eUlzRW51bWVyYWJsZShzdHJlYW0uY3VycmVudCgpKSA/ICJrZXl3b3JkIiA6IG51bGwKICB9CgogIC8vIEludGVyZmFjZQogIHJldHVybiB7CiAgICBzdGFydFN0YXRlOiBmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiB7dG9rZW5pemU6IHRva2VuQmFzZX07CiAgICB9LAoKICAgIHRva2VuOiBmdW5jdGlvbiAoc3RyZWFtLCBzdGF0ZSkgewogICAgICBpZiAoc3RyZWFtLmVhdFNwYWNlKCkpIHJldHVybiBudWxsOwogICAgICB2YXIgc3R5bGUgPSBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgICAgcmV0dXJuIHN0eWxlOwogICAgfQogIH07Cn0pOwoKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtdGlkZGx5d2lraSIsICJ0aWRkbHl3aWtpIik7Cn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/tiki/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/tiki/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogVGlraSB3aWtpIG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9InRpa2kuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9InRpa2kuanMiPjwvc2NyaXB0Pgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPi5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazt9PC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aDE+Q29kZU1pcnJvcjwvaDE+PGltZyBpZD1sb2dvIHNyYz0iLi4vLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+TGFuZ3VhZ2UgbW9kZXM8L2E+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPlRpa2kgd2lraTwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+VGlraSB3aWtpIG1vZGU8L2gyPgoKCjxkaXY+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KSGVhZGluZ3MKIUhlYWRlciAxCiEhSGVhZGVyIDIKISEhSGVhZGVyIDMKISEhIUhlYWRlciA0CiEhISEhSGVhZGVyIDUKISEhISEhSGVhZGVyIDYKClN0eWxpbmcKLT10aXRsZWJhcj0tCl5eIEJveCBvbiBtdWx0aQpsaW5lcwpvZiBjb250ZW50Xl4KX19ib2xkX18KJydpdGFsaWMnJwo9PT11bmRlcmxpbmU9PT0KOjpjZW50ZXI6OgotLUxpbmUgVGhyb3VnaC0tCgpPcGVyYXRvcnMKfm5wfk5vIHBhcnNlfi9ucH4KCkxpbmsKW2xpbmt8ZGVzY3xub2NhY2hlXQoKV2lraQooKFdpa2kpKQooKFdpa2l8ZGVzYykpCigoV2lraXxkZXNjfHRpbWVvdXQpKQoKVGFibGUKfHxyb3cxIGNvbDF8cm93MSBjb2wyfHJvdzEgY29sMwpyb3cyIGNvbDF8cm93MiBjb2wyfHJvdzIgY29sMwpyb3czIGNvbDF8cm93MyBjb2wyfHJvdzMgY29sM3x8CgpMaXN0czoKKmJsYQoqKmJsYS0xCisrY29udGludWUtYmxhLTEKKioqYmxhLTIKKytjb250aW51ZS1ibGEtMQoqYmxhCitjb250aW51ZS1ibGEKI2JsYQoqKiB0cmEtbGEtbGEKK2NvbnRpbnVlLWJsYQojYmxhCgpQbHVnaW4gKHN0YW5kYXJkKToKe1BMVUdJTihhdHRyPSJteSBhdHRyIil9ClBsdWdpbiBCb2R5CntQTFVHSU59CgpQbHVnaW4gKGlubGluZSk6CntwbHVnaW4gYXR0cj0ibXkgYXR0ciJ9CjwvdGV4dGFyZWE+PC9kaXY+Cgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+Cgl2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgICAgIG1vZGU6ICd0aWtpJywgICAgICAKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZQogICAgfSk7Cjwvc2NyaXB0PgoKPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/tiki/tiki.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LmNtLXR3LXN5bnRheGVycm9yIHsKCWNvbG9yOiAjRkZGOwoJYmFja2dyb3VuZC1jb2xvcjogIzkwMDsKfQoKLmNtLXR3LWRlbGV0ZWQgewoJdGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7Cn0KCi5jbS10dy1oZWFkZXI1IHsKCWZvbnQtd2VpZ2h0OiBib2xkOwp9Ci5jbS10dy1saXN0aXRlbTpmaXJzdC1jaGlsZCB7IC8qQWRkZWQgZmlyc3QgY2hpbGQgdG8gZml4IGR1cGxpY2F0ZSBwYWRkaW5nIHdoZW4gaGlnaGxpZ2h0aW5nKi8KCXBhZGRpbmctbGVmdDogMTBweDsKfQoKLmNtLXR3LWJveCB7Cglib3JkZXItdG9wLXdpZHRoOiAwcHggIWltcG9ydGFudDsKCWJvcmRlci1zdHlsZTogc29saWQ7Cglib3JkZXItd2lkdGg6IDFweDsKCWJvcmRlci1jb2xvcjogaW5oZXJpdDsKfQoKLmNtLXR3LXVuZGVybGluZSB7Cgl0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKfQ==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/tiki/tiki.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCd0aWtpJywgZnVuY3Rpb24oY29uZmlnKSB7CiAgZnVuY3Rpb24gaW5CbG9jayhzdHlsZSwgdGVybWluYXRvciwgcmV0dXJuVG9rZW5pemVyKSB7CiAgICByZXR1cm4gZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICB3aGlsZSAoIXN0cmVhbS5lb2woKSkgewogICAgICAgIGlmIChzdHJlYW0ubWF0Y2godGVybWluYXRvcikpIHsKICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gaW5UZXh0OwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgIH0KCiAgICAgIGlmIChyZXR1cm5Ub2tlbml6ZXIpIHN0YXRlLnRva2VuaXplID0gcmV0dXJuVG9rZW5pemVyOwoKICAgICAgcmV0dXJuIHN0eWxlOwogICAgfTsKICB9CgogIGZ1bmN0aW9uIGluTGluZShzdHlsZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgd2hpbGUoIXN0cmVhbS5lb2woKSkgewogICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgIH0KICAgICAgc3RhdGUudG9rZW5pemUgPSBpblRleHQ7CiAgICAgIHJldHVybiBzdHlsZTsKICAgIH07CiAgfQoKICBmdW5jdGlvbiBpblRleHQoc3RyZWFtLCBzdGF0ZSkgewogICAgZnVuY3Rpb24gY2hhaW4ocGFyc2VyKSB7CiAgICAgIHN0YXRlLnRva2VuaXplID0gcGFyc2VyOwogICAgICByZXR1cm4gcGFyc2VyKHN0cmVhbSwgc3RhdGUpOwogICAgfQoKICAgIHZhciBzb2wgPSBzdHJlYW0uc29sKCk7CiAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpOwoKICAgIC8vbm9uIHN0YXJ0IG9mIGxpbmUKICAgIHN3aXRjaCAoY2gpIHsgLy9zd2l0Y2ggaXMgZ2VuZXJhbGx5IG11Y2ggZmFzdGVyIHRoYW4gaWYsIHNvIGl0IGlzIHVzZWQgaGVyZQogICAgY2FzZSAieyI6IC8vcGx1Z2luCiAgICAgIHN0cmVhbS5lYXQoIi8iKTsKICAgICAgc3RyZWFtLmVhdFNwYWNlKCk7CiAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW15cc1x1MDBhMD1cIlwnXC8/KH1dLyk7CiAgICAgIHN0YXRlLnRva2VuaXplID0gaW5QbHVnaW47CiAgICAgIHJldHVybiAidGFnIjsKICAgIGNhc2UgIl8iOiAvL2JvbGQKICAgICAgaWYgKHN0cmVhbS5lYXQoIl8iKSkKICAgICAgICByZXR1cm4gY2hhaW4oaW5CbG9jaygic3Ryb25nIiwgIl9fIiwgaW5UZXh0KSk7CiAgICAgIGJyZWFrOwogICAgY2FzZSAiJyI6IC8vaXRhbGljcwogICAgICBpZiAoc3RyZWFtLmVhdCgiJyIpKQogICAgICAgIHJldHVybiBjaGFpbihpbkJsb2NrKCJlbSIsICInJyIsIGluVGV4dCkpOwogICAgICBicmVhazsKICAgIGNhc2UgIigiOi8vIFdpa2kgTGluawogICAgICBpZiAoc3RyZWFtLmVhdCgiKCIpKQogICAgICAgIHJldHVybiBjaGFpbihpbkJsb2NrKCJ2YXJpYWJsZS0yIiwgIikpIiwgaW5UZXh0KSk7CiAgICAgIGJyZWFrOwogICAgY2FzZSAiWyI6Ly8gV2VibGluawogICAgICByZXR1cm4gY2hhaW4oaW5CbG9jaygidmFyaWFibGUtMyIsICJdIiwgaW5UZXh0KSk7CiAgICAgIGJyZWFrOwogICAgY2FzZSAifCI6IC8vdGFibGUKICAgICAgaWYgKHN0cmVhbS5lYXQoInwiKSkKICAgICAgICByZXR1cm4gY2hhaW4oaW5CbG9jaygiY29tbWVudCIsICJ8fCIpKTsKICAgICAgYnJlYWs7CiAgICBjYXNlICItIjoKICAgICAgaWYgKHN0cmVhbS5lYXQoIj0iKSkgey8vdGl0bGVCYXIKICAgICAgICByZXR1cm4gY2hhaW4oaW5CbG9jaygiaGVhZGVyIHN0cmluZyIsICI9LSIsIGluVGV4dCkpOwogICAgICB9IGVsc2UgaWYgKHN0cmVhbS5lYXQoIi0iKSkgey8vZGVsZXRlZAogICAgICAgIHJldHVybiBjaGFpbihpbkJsb2NrKCJlcnJvciB0dy1kZWxldGVkIiwgIi0tIiwgaW5UZXh0KSk7CiAgICAgIH0KICAgICAgYnJlYWs7CiAgICBjYXNlICI9IjogLy91bmRlcmxpbmUKICAgICAgaWYgKHN0cmVhbS5tYXRjaCgiPT0iKSkKICAgICAgICByZXR1cm4gY2hhaW4oaW5CbG9jaygidHctdW5kZXJsaW5lIiwgIj09PSIsIGluVGV4dCkpOwogICAgICBicmVhazsKICAgIGNhc2UgIjoiOgogICAgICBpZiAoc3RyZWFtLmVhdCgiOiIpKQogICAgICAgIHJldHVybiBjaGFpbihpbkJsb2NrKCJjb21tZW50IiwgIjo6IikpOwogICAgICBicmVhazsKICAgIGNhc2UgIl4iOiAvL2JveAogICAgICByZXR1cm4gY2hhaW4oaW5CbG9jaygidHctYm94IiwgIl4iKSk7CiAgICAgIGJyZWFrOwogICAgY2FzZSAifiI6IC8vbnAKICAgICAgaWYgKHN0cmVhbS5tYXRjaCgibnB+IikpCiAgICAgICAgcmV0dXJuIGNoYWluKGluQmxvY2soIm1ldGEiLCAifi9ucH4iKSk7CiAgICAgIGJyZWFrOwogICAgfQoKICAgIC8vc3RhcnQgb2YgbGluZSB0eXBlcwogICAgaWYgKHNvbCkgewogICAgICBzd2l0Y2ggKGNoKSB7CiAgICAgIGNhc2UgIiEiOiAvL2hlYWRlciBhdCBzdGFydCBvZiBsaW5lCiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgnISEhISEnKSkgewogICAgICAgICAgcmV0dXJuIGNoYWluKGluTGluZSgiaGVhZGVyIHN0cmluZyIpKTsKICAgICAgICB9IGVsc2UgaWYgKHN0cmVhbS5tYXRjaCgnISEhIScpKSB7CiAgICAgICAgICByZXR1cm4gY2hhaW4oaW5MaW5lKCJoZWFkZXIgc3RyaW5nIikpOwogICAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLm1hdGNoKCchISEnKSkgewogICAgICAgICAgcmV0dXJuIGNoYWluKGluTGluZSgiaGVhZGVyIHN0cmluZyIpKTsKICAgICAgICB9IGVsc2UgaWYgKHN0cmVhbS5tYXRjaCgnISEnKSkgewogICAgICAgICAgcmV0dXJuIGNoYWluKGluTGluZSgiaGVhZGVyIHN0cmluZyIpKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIGNoYWluKGluTGluZSgiaGVhZGVyIHN0cmluZyIpKTsKICAgICAgICB9CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgIioiOiAvL3Vub3JkZXJlZCBsaXN0IGxpbmUgaXRlbSwgb3IgPGxpIC8+IGF0IHN0YXJ0IG9mIGxpbmUKICAgICAgY2FzZSAiIyI6IC8vb3JkZXJlZCBsaXN0IGxpbmUgaXRlbSwgb3IgPGxpIC8+IGF0IHN0YXJ0IG9mIGxpbmUKICAgICAgY2FzZSAiKyI6IC8vb3JkZXJlZCBsaXN0IGxpbmUgaXRlbSwgb3IgPGxpIC8+IGF0IHN0YXJ0IG9mIGxpbmUKICAgICAgICByZXR1cm4gY2hhaW4oaW5MaW5lKCJ0dy1saXN0aXRlbSBicmFja2V0IikpOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CgogICAgLy9zdHJlYW0uZWF0V2hpbGUoL1sme10vKTsgd2FzIGVhdGluZyB1cCBwbHVnaW5zLCB0dXJuZWQgb2ZmIHRvIGFjdCBsZXNzIGxpa2UgaHRtbCBhbmQgbW9yZSBsaWtlIHRpa2kKICAgIHJldHVybiBudWxsOwogIH0KCiAgdmFyIGluZGVudFVuaXQgPSBjb25maWcuaW5kZW50VW5pdDsKCiAgLy8gUmV0dXJuIHZhcmlhYmxlcyBmb3IgdG9rZW5pemVycwogIHZhciBwbHVnaW5OYW1lLCB0eXBlOwogIGZ1bmN0aW9uIGluUGx1Z2luKHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBjaCA9IHN0cmVhbS5uZXh0KCk7CiAgICB2YXIgcGVlayA9IHN0cmVhbS5wZWVrKCk7CgogICAgaWYgKGNoID09ICJ9IikgewogICAgICBzdGF0ZS50b2tlbml6ZSA9IGluVGV4dDsKICAgICAgLy90eXBlID0gY2ggPT0gIikiID8gImVuZFBsdWdpbiIgOiAic2VsZmNsb3NlUGx1Z2luIjsgaW5QbHVnaW4KICAgICAgcmV0dXJuICJ0YWciOwogICAgfSBlbHNlIGlmIChjaCA9PSAiKCIgfHwgY2ggPT0gIikiKSB7CiAgICAgIHJldHVybiAiYnJhY2tldCI7CiAgICB9IGVsc2UgaWYgKGNoID09ICI9IikgewogICAgICB0eXBlID0gImVxdWFscyI7CgogICAgICBpZiAocGVlayA9PSAiPiIpIHsKICAgICAgICBjaCA9IHN0cmVhbS5uZXh0KCk7CiAgICAgICAgcGVlayA9IHN0cmVhbS5wZWVrKCk7CiAgICAgIH0KCiAgICAgIC8vaGVyZSB3ZSBkZXRlY3QgdmFsdWVzIGRpcmVjdGx5IGFmdGVyIGVxdWFsIGNoYXJhY3RlciB3aXRoIG5vIHF1b3RlcwogICAgICBpZiAoIS9bXCdcIl0vLnRlc3QocGVlaykpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IGluQXR0cmlidXRlTm9RdW90ZSgpOwogICAgICB9CiAgICAgIC8vZW5kIGRldGVjdCB2YWx1ZXMKCiAgICAgIHJldHVybiAib3BlcmF0b3IiOwogICAgfSBlbHNlIGlmICgvW1wnXCJdLy50ZXN0KGNoKSkgewogICAgICBzdGF0ZS50b2tlbml6ZSA9IGluQXR0cmlidXRlKGNoKTsKICAgICAgcmV0dXJuIHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgfSBlbHNlIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXlxzXHUwMGEwPVwiXCdcLz9dLyk7CiAgICAgIHJldHVybiAia2V5d29yZCI7CiAgICB9CiAgfQoKICBmdW5jdGlvbiBpbkF0dHJpYnV0ZShxdW90ZSkgewogICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgd2hpbGUgKCFzdHJlYW0uZW9sKCkpIHsKICAgICAgICBpZiAoc3RyZWFtLm5leHQoKSA9PSBxdW90ZSkgewogICAgICAgICAgc3RhdGUudG9rZW5pemUgPSBpblBsdWdpbjsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gInN0cmluZyI7CiAgICB9OwogIH0KCiAgZnVuY3Rpb24gaW5BdHRyaWJ1dGVOb1F1b3RlKCkgewogICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgd2hpbGUgKCFzdHJlYW0uZW9sKCkpIHsKICAgICAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpOwogICAgICAgIHZhciBwZWVrID0gc3RyZWFtLnBlZWsoKTsKICAgICAgICBpZiAoY2ggPT0gIiAiIHx8IGNoID09ICIsIiB8fCAvWyApfV0vLnRlc3QocGVlaykpIHsKICAgICAgc3RhdGUudG9rZW5pemUgPSBpblBsdWdpbjsKICAgICAgYnJlYWs7CiAgICB9CiAgfQogIHJldHVybiAic3RyaW5nIjsKfTsKICAgICAgICAgICAgICAgICAgICAgfQoKdmFyIGN1clN0YXRlLCBzZXRTdHlsZTsKZnVuY3Rpb24gcGFzcygpIHsKICBmb3IgKHZhciBpID0gYXJndW1lbnRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBjdXJTdGF0ZS5jYy5wdXNoKGFyZ3VtZW50c1tpXSk7Cn0KCmZ1bmN0aW9uIGNvbnQoKSB7CiAgcGFzcy5hcHBseShudWxsLCBhcmd1bWVudHMpOwogIHJldHVybiB0cnVlOwp9CgpmdW5jdGlvbiBwdXNoQ29udGV4dChwbHVnaW5OYW1lLCBzdGFydE9mTGluZSkgewogIHZhciBub0luZGVudCA9IGN1clN0YXRlLmNvbnRleHQgJiYgY3VyU3RhdGUuY29udGV4dC5ub0luZGVudDsKICBjdXJTdGF0ZS5jb250ZXh0ID0gewogICAgcHJldjogY3VyU3RhdGUuY29udGV4dCwKICAgIHBsdWdpbk5hbWU6IHBsdWdpbk5hbWUsCiAgICBpbmRlbnQ6IGN1clN0YXRlLmluZGVudGVkLAogICAgc3RhcnRPZkxpbmU6IHN0YXJ0T2ZMaW5lLAogICAgbm9JbmRlbnQ6IG5vSW5kZW50CiAgfTsKfQoKZnVuY3Rpb24gcG9wQ29udGV4dCgpIHsKICBpZiAoY3VyU3RhdGUuY29udGV4dCkgY3VyU3RhdGUuY29udGV4dCA9IGN1clN0YXRlLmNvbnRleHQucHJldjsKfQoKZnVuY3Rpb24gZWxlbWVudCh0eXBlKSB7CiAgaWYgKHR5cGUgPT0gIm9wZW5QbHVnaW4iKSB7Y3VyU3RhdGUucGx1Z2luTmFtZSA9IHBsdWdpbk5hbWU7IHJldHVybiBjb250KGF0dHJpYnV0ZXMsIGVuZHBsdWdpbihjdXJTdGF0ZS5zdGFydE9mTGluZSkpO30KICBlbHNlIGlmICh0eXBlID09ICJjbG9zZVBsdWdpbiIpIHsKICAgIHZhciBlcnIgPSBmYWxzZTsKICAgIGlmIChjdXJTdGF0ZS5jb250ZXh0KSB7CiAgICAgIGVyciA9IGN1clN0YXRlLmNvbnRleHQucGx1Z2luTmFtZSAhPSBwbHVnaW5OYW1lOwogICAgICBwb3BDb250ZXh0KCk7CiAgICB9IGVsc2UgewogICAgICBlcnIgPSB0cnVlOwogICAgfQogICAgaWYgKGVycikgc2V0U3R5bGUgPSAiZXJyb3IiOwogICAgcmV0dXJuIGNvbnQoZW5kY2xvc2VwbHVnaW4oZXJyKSk7CiAgfQogIGVsc2UgaWYgKHR5cGUgPT0gInN0cmluZyIpIHsKICAgIGlmICghY3VyU3RhdGUuY29udGV4dCB8fCBjdXJTdGF0ZS5jb250ZXh0Lm5hbWUgIT0gIiFjZGF0YSIpIHB1c2hDb250ZXh0KCIhY2RhdGEiKTsKICAgIGlmIChjdXJTdGF0ZS50b2tlbml6ZSA9PSBpblRleHQpIHBvcENvbnRleHQoKTsKICAgIHJldHVybiBjb250KCk7CiAgfQogIGVsc2UgcmV0dXJuIGNvbnQoKTsKfQoKZnVuY3Rpb24gZW5kcGx1Z2luKHN0YXJ0T2ZMaW5lKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKHR5cGUpIHsKICAgIGlmICgKICAgICAgdHlwZSA9PSAic2VsZmNsb3NlUGx1Z2luIiB8fAogICAgICAgIHR5cGUgPT0gImVuZFBsdWdpbiIKICAgICkKICAgICAgcmV0dXJuIGNvbnQoKTsKICAgIGlmICh0eXBlID09ICJlbmRQbHVnaW4iKSB7cHVzaENvbnRleHQoY3VyU3RhdGUucGx1Z2luTmFtZSwgc3RhcnRPZkxpbmUpOyByZXR1cm4gY29udCgpO30KICAgIHJldHVybiBjb250KCk7CiAgfTsKfQoKZnVuY3Rpb24gZW5kY2xvc2VwbHVnaW4oZXJyKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKHR5cGUpIHsKICAgIGlmIChlcnIpIHNldFN0eWxlID0gImVycm9yIjsKICAgIGlmICh0eXBlID09ICJlbmRQbHVnaW4iKSByZXR1cm4gY29udCgpOwogICAgcmV0dXJuIHBhc3MoKTsKICB9Owp9CgpmdW5jdGlvbiBhdHRyaWJ1dGVzKHR5cGUpIHsKICBpZiAodHlwZSA9PSAia2V5d29yZCIpIHtzZXRTdHlsZSA9ICJhdHRyaWJ1dGUiOyByZXR1cm4gY29udChhdHRyaWJ1dGVzKTt9CiAgaWYgKHR5cGUgPT0gImVxdWFscyIpIHJldHVybiBjb250KGF0dHZhbHVlLCBhdHRyaWJ1dGVzKTsKICByZXR1cm4gcGFzcygpOwp9CmZ1bmN0aW9uIGF0dHZhbHVlKHR5cGUpIHsKICBpZiAodHlwZSA9PSAia2V5d29yZCIpIHtzZXRTdHlsZSA9ICJzdHJpbmciOyByZXR1cm4gY29udCgpO30KICBpZiAodHlwZSA9PSAic3RyaW5nIikgcmV0dXJuIGNvbnQoYXR0dmFsdWVtYXliZSk7CiAgcmV0dXJuIHBhc3MoKTsKfQpmdW5jdGlvbiBhdHR2YWx1ZW1heWJlKHR5cGUpIHsKICBpZiAodHlwZSA9PSAic3RyaW5nIikgcmV0dXJuIGNvbnQoYXR0dmFsdWVtYXliZSk7CiAgZWxzZSByZXR1cm4gcGFzcygpOwp9CnJldHVybiB7CiAgc3RhcnRTdGF0ZTogZnVuY3Rpb24oKSB7CiAgICByZXR1cm4ge3Rva2VuaXplOiBpblRleHQsIGNjOiBbXSwgaW5kZW50ZWQ6IDAsIHN0YXJ0T2ZMaW5lOiB0cnVlLCBwbHVnaW5OYW1lOiBudWxsLCBjb250ZXh0OiBudWxsfTsKICB9LAogIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICBpZiAoc3RyZWFtLnNvbCgpKSB7CiAgICAgIHN0YXRlLnN0YXJ0T2ZMaW5lID0gdHJ1ZTsKICAgICAgc3RhdGUuaW5kZW50ZWQgPSBzdHJlYW0uaW5kZW50YXRpb24oKTsKICAgIH0KICAgIGlmIChzdHJlYW0uZWF0U3BhY2UoKSkgcmV0dXJuIG51bGw7CgogICAgc2V0U3R5bGUgPSB0eXBlID0gcGx1Z2luTmFtZSA9IG51bGw7CiAgICB2YXIgc3R5bGUgPSBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgIGlmICgoc3R5bGUgfHwgdHlwZSkgJiYgc3R5bGUgIT0gImNvbW1lbnQiKSB7CiAgICAgIGN1clN0YXRlID0gc3RhdGU7CiAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgdmFyIGNvbWIgPSBzdGF0ZS5jYy5wb3AoKSB8fCBlbGVtZW50OwogICAgICAgIGlmIChjb21iKHR5cGUgfHwgc3R5bGUpKSBicmVhazsKICAgICAgfQogICAgfQogICAgc3RhdGUuc3RhcnRPZkxpbmUgPSBmYWxzZTsKICAgIHJldHVybiBzZXRTdHlsZSB8fCBzdHlsZTsKICB9LAogIGluZGVudDogZnVuY3Rpb24oc3RhdGUsIHRleHRBZnRlcikgewogICAgdmFyIGNvbnRleHQgPSBzdGF0ZS5jb250ZXh0OwogICAgaWYgKGNvbnRleHQgJiYgY29udGV4dC5ub0luZGVudCkgcmV0dXJuIDA7CiAgICBpZiAoY29udGV4dCAmJiAvXntcLy8udGVzdCh0ZXh0QWZ0ZXIpKQogICAgICAgIGNvbnRleHQgPSBjb250ZXh0LnByZXY7CiAgICAgICAgd2hpbGUgKGNvbnRleHQgJiYgIWNvbnRleHQuc3RhcnRPZkxpbmUpCiAgICAgICAgICBjb250ZXh0ID0gY29udGV4dC5wcmV2OwogICAgICAgIGlmIChjb250ZXh0KSByZXR1cm4gY29udGV4dC5pbmRlbnQgKyBpbmRlbnRVbml0OwogICAgICAgIGVsc2UgcmV0dXJuIDA7CiAgICAgICB9LAogICAgZWxlY3RyaWNDaGFyczogIi8iCiAgfTsKfSk7CgpDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQvdGlraSIsICJ0aWtpIik7Cgp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/toml/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/toml/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogVE9NTCBNb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9InRvbWwuanMiPjwvc2NyaXB0Pgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPi5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazt9PC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aDE+Q29kZU1pcnJvcjwvaDE+PGltZyBpZD1sb2dvIHNyYz0iLi4vLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+TGFuZ3VhZ2UgbW9kZXM8L2E+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPlRPTUwgTW9kZTwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+VE9NTCBNb2RlPC9oMj4KPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KIyBUaGlzIGlzIGEgVE9NTCBkb2N1bWVudC4gQm9vbS4KCnRpdGxlID0gIlRPTUwgRXhhbXBsZSIKCltvd25lcl0KbmFtZSA9ICJUb20gUHJlc3Rvbi1XZXJuZXIiCm9yZ2FuaXphdGlvbiA9ICJHaXRIdWIiCmJpbyA9ICJHaXRIdWIgQ29mb3VuZGVyICZhbXA7IENFT1xuTGlrZXMgdGF0ZXIgdG90cyBhbmQgYmVlci4iCmRvYiA9IDE5NzktMDUtMjdUMDc6MzI6MDBaICMgRmlyc3QgY2xhc3MgZGF0ZXM/IFdoeSBub3Q/CgpbZGF0YWJhc2VdCnNlcnZlciA9ICIxOTIuMTY4LjEuMSIKcG9ydHMgPSBbIDgwMDEsIDgwMDEsIDgwMDIgXQpjb25uZWN0aW9uX21heCA9IDUwMDAKZW5hYmxlZCA9IHRydWUKCltzZXJ2ZXJzXQoKICAjIFlvdSBjYW4gaW5kZW50IGFzIHlvdSBwbGVhc2UuIFRhYnMgb3Igc3BhY2VzLiBUT01MIGRvbid0IGNhcmUuCiAgW3NlcnZlcnMuYWxwaGFdCiAgaXAgPSAiMTAuMC4wLjEiCiAgZGMgPSAiZXFkYzEwIgogIAogIFtzZXJ2ZXJzLmJldGFdCiAgaXAgPSAiMTAuMC4wLjIiCiAgZGMgPSAiZXFkYzEwIgogIApbY2xpZW50c10KZGF0YSA9IFsgWyJnYW1tYSIsICJkZWx0YSJdLCBbMSwgMl0gXQoKIyBMaW5lIGJyZWFrcyBhcmUgT0sgd2hlbiBpbnNpZGUgYXJyYXlzCmhvc3RzID0gWwogICJhbHBoYSIsCiAgIm9tZWdhIgpdCjwvdGV4dGFyZWE+PC9mb3JtPgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICBtb2RlOiB7bmFtZTogInRvbWwifSwKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZQogICAgICB9KTsKICAgIDwvc2NyaXB0PgogICAgPGgzPlRoZSBUT01MIE1vZGU8L2gzPgogICAgICA8cD4gQ3JlYXRlZCBieSBGb3JiZXMgTGluZGVzYXkuPC9wPgogICAgPHA+PHN0cm9uZz5NSU1FIHR5cGUgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC94LXRvbWw8L2NvZGU+LjwvcD4KICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/toml/toml.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJ0b21sIiwgZnVuY3Rpb24gKCkgewogIHJldHVybiB7CiAgICBzdGFydFN0YXRlOiBmdW5jdGlvbiAoKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgaW5TdHJpbmc6IGZhbHNlLAogICAgICAgIHN0cmluZ1R5cGU6ICIiLAogICAgICAgIGxoczogdHJ1ZSwKICAgICAgICBpbkFycmF5OiAwCiAgICAgIH07CiAgICB9LAogICAgdG9rZW46IGZ1bmN0aW9uIChzdHJlYW0sIHN0YXRlKSB7CiAgICAgIC8vY2hlY2sgZm9yIHN0YXRlIGNoYW5nZXMKICAgICAgaWYgKCFzdGF0ZS5pblN0cmluZyAmJiAoKHN0cmVhbS5wZWVrKCkgPT0gJyInKSB8fCAoc3RyZWFtLnBlZWsoKSA9PSAiJyIpKSkgewogICAgICAgIHN0YXRlLnN0cmluZ1R5cGUgPSBzdHJlYW0ucGVlaygpOwogICAgICAgIHN0cmVhbS5uZXh0KCk7IC8vIFNraXAgcXVvdGUKICAgICAgICBzdGF0ZS5pblN0cmluZyA9IHRydWU7IC8vIFVwZGF0ZSBzdGF0ZQogICAgICB9CiAgICAgIGlmIChzdHJlYW0uc29sKCkgJiYgc3RhdGUuaW5BcnJheSA9PT0gMCkgewogICAgICAgIHN0YXRlLmxocyA9IHRydWU7CiAgICAgIH0KICAgICAgLy9yZXR1cm4gc3RhdGUKICAgICAgaWYgKHN0YXRlLmluU3RyaW5nKSB7CiAgICAgICAgd2hpbGUgKHN0YXRlLmluU3RyaW5nICYmICFzdHJlYW0uZW9sKCkpIHsKICAgICAgICAgIGlmIChzdHJlYW0ucGVlaygpID09PSBzdGF0ZS5zdHJpbmdUeXBlKSB7CiAgICAgICAgICAgIHN0cmVhbS5uZXh0KCk7IC8vIFNraXAgcXVvdGUKICAgICAgICAgICAgc3RhdGUuaW5TdHJpbmcgPSBmYWxzZTsgLy8gQ2xlYXIgZmxhZwogICAgICAgICAgfSBlbHNlIGlmIChzdHJlYW0ucGVlaygpID09PSAnXFwnKSB7CiAgICAgICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdHJlYW0ubWF0Y2goL14uW15cXFwiXCddKi8pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gc3RhdGUubGhzID8gInByb3BlcnR5IHN0cmluZyIgOiAic3RyaW5nIjsgLy8gVG9rZW4gc3R5bGUKICAgICAgfSBlbHNlIGlmIChzdGF0ZS5pbkFycmF5ICYmIHN0cmVhbS5wZWVrKCkgPT09ICddJykgewogICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgc3RhdGUuaW5BcnJheS0tOwogICAgICAgIHJldHVybiAnYnJhY2tldCc7CiAgICAgIH0gZWxzZSBpZiAoc3RhdGUubGhzICYmIHN0cmVhbS5wZWVrKCkgPT09ICdbJyAmJiBzdHJlYW0uc2tpcFRvKCddJykpIHsKICAgICAgICBzdHJlYW0ubmV4dCgpOy8vc2tpcCBjbG9zaW5nIF0KICAgICAgICAvLyBhcnJheSBvZiBvYmplY3RzIGhhcyBhbiBleHRyYSBvcGVuICYgY2xvc2UgW10KICAgICAgICBpZiAoc3RyZWFtLnBlZWsoKSA9PT0gJ10nKSBzdHJlYW0ubmV4dCgpOwogICAgICAgIHJldHVybiAiYXRvbSI7CiAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLnBlZWsoKSA9PT0gIiMiKSB7CiAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICAgIHJldHVybiAiY29tbWVudCI7CiAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLmVhdFNwYWNlKCkpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfSBlbHNlIGlmIChzdGF0ZS5saHMgJiYgc3RyZWFtLmVhdFdoaWxlKGZ1bmN0aW9uIChjKSB7IHJldHVybiBjICE9ICc9JyAmJiBjICE9ICcgJzsgfSkpIHsKICAgICAgICByZXR1cm4gInByb3BlcnR5IjsKICAgICAgfSBlbHNlIGlmIChzdGF0ZS5saHMgJiYgc3RyZWFtLnBlZWsoKSA9PT0gIj0iKSB7CiAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgICBzdGF0ZS5saHMgPSBmYWxzZTsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfSBlbHNlIGlmICghc3RhdGUubGhzICYmIHN0cmVhbS5tYXRjaCgvXlxkXGRcZFxkW1xkXC1cOlwuVF0qWi8pKSB7CiAgICAgICAgcmV0dXJuICdhdG9tJzsgLy9kYXRlCiAgICAgIH0gZWxzZSBpZiAoIXN0YXRlLmxocyAmJiAoc3RyZWFtLm1hdGNoKCd0cnVlJykgfHwgc3RyZWFtLm1hdGNoKCdmYWxzZScpKSkgewogICAgICAgIHJldHVybiAnYXRvbSc7CiAgICAgIH0gZWxzZSBpZiAoIXN0YXRlLmxocyAmJiBzdHJlYW0ucGVlaygpID09PSAnWycpIHsKICAgICAgICBzdGF0ZS5pbkFycmF5Kys7CiAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgICByZXR1cm4gJ2JyYWNrZXQnOwogICAgICB9IGVsc2UgaWYgKCFzdGF0ZS5saHMgJiYgc3RyZWFtLm1hdGNoKC9eXC0/XGQrKD86XC5cZCspPy8pKSB7CiAgICAgICAgcmV0dXJuICdudW1iZXInOwogICAgICB9IGVsc2UgaWYgKCFzdHJlYW0uZWF0U3BhY2UoKSkgewogICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgIH0KICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfTsKfSk7CgpDb2RlTWlycm9yLmRlZmluZU1JTUUoJ3RleHQveC10b21sJywgJ3RvbWwnKTsKCn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/tornado/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/tornado/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogVG9ybmFkbyB0ZW1wbGF0ZSBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uLy4uL2FkZG9uL21vZGUvb3ZlcmxheS5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi94bWwveG1sLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL2h0bWxtaXhlZC9odG1sbWl4ZWQuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0idG9ybmFkby5qcyI+PC9zY3JpcHQ+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+LkNvZGVNaXJyb3Ige2JvcmRlci10b3A6IDFweCBzb2xpZCBibGFjazsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO308L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxoMT5Db2RlTWlycm9yPC9oMT48aW1nIGlkPWxvZ28gc3JjPSIuLi8uLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21hcmlqbmgvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5MYW5ndWFnZSBtb2RlczwvYT4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+VG9ybmFkbzwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+VG9ybmFkbyB0ZW1wbGF0ZSBtb2RlPC9oMj4KPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KPCFkb2N0eXBlIGh0bWw+CjxodG1sPgogICAgPGhlYWQ+CiAgICAgICAgPHRpdGxlPk15IFRvcm5hZG8gd2ViIGFwcGxpY2F0aW9uPC90aXRsZT4KICAgIDwvaGVhZD4KICAgIDxib2R5PgogICAgICAgIDxoMT4KICAgICAgICAgICAge3sgdGl0bGUgfX0KICAgICAgICA8L2gxPgogICAgICAgIDx1bCBjbGFzcz0ibXktbGlzdCI+CiAgICAgICAgICAgIHslIGZvciBpdGVtIGluIGl0ZW1zICV9CiAgICAgICAgICAgICAgICA8bGk+eyUgaXRlbS5uYW1lICV9PC9saT4KICAgICAgICAgICAgeyUgZW1wdHkgJX0KICAgICAgICAgICAgICAgIDxsaT5Zb3UgaGF2ZSBubyBpdGVtcyBpbiB5b3VyIGxpc3QuPC9saT4KICAgICAgICAgICAgeyUgZW5kICV9CiAgICAgICAgPC91bD4KICAgIDwvYm9keT4KPC9odG1sPgo8L3RleHRhcmVhPjwvZm9ybT4KCiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgICAgIG1vZGU6ICJ0b3JuYWRvIiwKICAgICAgICBpbmRlbnRVbml0OiA0LAogICAgICAgIGluZGVudFdpdGhUYWJzOiB0cnVlCiAgICAgIH0pOwogICAgPC9zY3JpcHQ+CgogICAgPHA+TW9kZSBmb3IgSFRNTCB3aXRoIGVtYmVkZGVkIFRvcm5hZG8gdGVtcGxhdGUgbWFya3VwLjwvcD4KCiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC94LXRvcm5hZG88L2NvZGU+PC9wPgogIDwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/tornado/tornado.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSwgcmVxdWlyZSgiLi4vaHRtbG1peGVkL2h0bWxtaXhlZCIpLAogICAgICAgIHJlcXVpcmUoIi4uLy4uL2FkZG9uL21vZGUvb3ZlcmxheSIpKTsKICBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCkgLy8gQU1ECiAgICBkZWZpbmUoWyIuLi8uLi9saWIvY29kZW1pcnJvciIsICIuLi9odG1sbWl4ZWQvaHRtbG1peGVkIiwKICAgICAgICAgICAgIi4uLy4uL2FkZG9uL21vZGUvb3ZlcmxheSJdLCBtb2QpOwogIGVsc2UgLy8gUGxhaW4gYnJvd3NlciBlbnYKICAgIG1vZChDb2RlTWlycm9yKTsKfSkoZnVuY3Rpb24oQ29kZU1pcnJvcikgewogICJ1c2Ugc3RyaWN0IjsKCiAgQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJ0b3JuYWRvOmlubmVyIiwgZnVuY3Rpb24oKSB7CiAgICB2YXIga2V5d29yZHMgPSBbImFuZCIsImFzIiwiYXNzZXJ0IiwiYXV0b2VzY2FwZSIsImJsb2NrIiwiYnJlYWsiLCJjbGFzcyIsImNvbW1lbnQiLCJjb250ZXh0IiwKICAgICAgICAgICAgICAgICAgICAiY29udGludWUiLCJkYXRldGltZSIsImRlZiIsImRlbCIsImVsaWYiLCJlbHNlIiwiZW5kIiwiZXNjYXBlIiwiZXhjZXB0IiwKICAgICAgICAgICAgICAgICAgICAiZXhlYyIsImV4dGVuZHMiLCJmYWxzZSIsImZpbmFsbHkiLCJmb3IiLCJmcm9tIiwiZ2xvYmFsIiwiaWYiLCJpbXBvcnQiLCJpbiIsCiAgICAgICAgICAgICAgICAgICAgImluY2x1ZGUiLCJpcyIsImpzb25fZW5jb2RlIiwibGFtYmRhIiwibGVuZ3RoIiwibGlua2lmeSIsImxvYWQiLCJtb2R1bGUiLAogICAgICAgICAgICAgICAgICAgICJub25lIiwibm90Iiwib3IiLCJwYXNzIiwicHJpbnQiLCJwdXQiLCJyYWlzZSIsInJhdyIsInJldHVybiIsInNlbGYiLCJzZXQiLAogICAgICAgICAgICAgICAgICAgICJzcXVlZXplIiwic3VwZXIiLCJ0cnVlIiwidHJ5IiwidXJsX2VzY2FwZSIsIndoaWxlIiwid2l0aCIsIndpdGhvdXQiLCJ4aHRtbF9lc2NhcGUiLCJ5aWVsZCJdOwogICAga2V5d29yZHMgPSBuZXcgUmVnRXhwKCJeKCgiICsga2V5d29yZHMuam9pbigiKXwoIikgKyAiKSlcXGIiKTsKCiAgICBmdW5jdGlvbiB0b2tlbkJhc2UgKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXlx7XS8pOwogICAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpOwogICAgICBpZiAoY2ggPT0gInsiKSB7CiAgICAgICAgaWYgKGNoID0gc3RyZWFtLmVhdCgvXHt8JXwjLykpIHsKICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gaW5UYWcoY2gpOwogICAgICAgICAgcmV0dXJuICJ0YWciOwogICAgICAgIH0KICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gaW5UYWcgKGNsb3NlKSB7CiAgICAgIGlmIChjbG9zZSA9PSAieyIpIHsKICAgICAgICBjbG9zZSA9ICJ9IjsKICAgICAgfQogICAgICByZXR1cm4gZnVuY3Rpb24gKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpOwogICAgICAgIGlmICgoY2ggPT0gY2xvc2UpICYmIHN0cmVhbS5lYXQoIn0iKSkgewogICAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICAgICAgICByZXR1cm4gInRhZyI7CiAgICAgICAgfQogICAgICAgIGlmIChzdHJlYW0ubWF0Y2goa2V5d29yZHMpKSB7CiAgICAgICAgICByZXR1cm4gImtleXdvcmQiOwogICAgICAgIH0KICAgICAgICByZXR1cm4gY2xvc2UgPT0gIiMiID8gImNvbW1lbnQiIDogInN0cmluZyI7CiAgICAgIH07CiAgICB9CiAgICByZXR1cm4gewogICAgICBzdGFydFN0YXRlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgcmV0dXJuIHt0b2tlbml6ZTogdG9rZW5CYXNlfTsKICAgICAgfSwKICAgICAgdG9rZW46IGZ1bmN0aW9uIChzdHJlYW0sIHN0YXRlKSB7CiAgICAgICAgcmV0dXJuIHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgICB9CiAgICB9OwogIH0pOwoKICBDb2RlTWlycm9yLmRlZmluZU1vZGUoInRvcm5hZG8iLCBmdW5jdGlvbihjb25maWcpIHsKICAgIHZhciBodG1sQmFzZSA9IENvZGVNaXJyb3IuZ2V0TW9kZShjb25maWcsICJ0ZXh0L2h0bWwiKTsKICAgIHZhciB0b3JuYWRvSW5uZXIgPSBDb2RlTWlycm9yLmdldE1vZGUoY29uZmlnLCAidG9ybmFkbzppbm5lciIpOwogICAgcmV0dXJuIENvZGVNaXJyb3Iub3ZlcmxheU1vZGUoaHRtbEJhc2UsIHRvcm5hZG9Jbm5lcik7CiAgfSk7CgogIENvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC94LXRvcm5hZG8iLCAidG9ybmFkbyIpOwp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/troff/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/troff/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogdHJvZmYgbW9kZTwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uLy4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPS4uLy4uL2xpYi9jb2RlbWlycm9yLmNzcz4KPHNjcmlwdCBzcmM9Li4vLi4vbGliL2NvZGVtaXJyb3IuanM+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi8uLi9hZGRvbi9lZGl0L21hdGNoYnJhY2tldHMuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz10cm9mZi5qcz48L3NjcmlwdD4KPHN0eWxlIHR5cGU9dGV4dC9jc3M+CiAgLkNvZGVNaXJyb3Ige2JvcmRlci10b3A6IDFweCBzb2xpZCBibGFjazsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO30KPC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aDE+Q29kZU1pcnJvcjwvaDE+PGltZyBpZD1sb2dvIHNyYz0iLi4vLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+TGFuZ3VhZ2UgbW9kZXM8L2E+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPnRyb2ZmPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj50cm9mZjwvaDI+CgoKPHRleHRhcmVhIGlkPWNvZGU+CidcIiB0Ci5cIiAgICAgVGl0bGU6IG1rdmV4dHJhY3QKLlRIICJNS1ZFWFRSQUNUIiAiMSIgIjIwMTVcLTAyXC0yOCIgIk1LVlRvb2xOaXggN1wmLjdcJi4wIiAiVXNlciBDb21tYW5kcyIKLlwiIH5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+Ci5pZSBcbiguZyAuZHMgQXEgXChhcQouZWwgICAgICAgLmRzIEFxICcKLlwiIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi5uaAouXCIgZGlzYWJsZSBqdXN0aWZpY2F0aW9uIChhZGp1c3QgdGV4dCB0byBsZWZ0IG1hcmdpbiBvbmx5KQouYWQgbAouXCIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLlNIICJOQU1FIgpta3ZleHRyYWN0IFwtIGV4dHJhY3QgdHJhY2tzIGZyb20gTWF0cm9za2EoVE0pIGZpbGVzIGludG8gb3RoZXIgZmlsZXMKLlNIICJTWU5PUFNJUyIKLkhQIFx3J1xmQm1rdmV4dHJhY3RcZlJcICd1ClxmQm1rdmV4dHJhY3RcZlIge21vZGV9IHtzb3VyY2VcLWZpbGVuYW1lfSBbb3B0aW9uc10gW2V4dHJhY3Rpb25cLXNwZWNdCi5TSCAiREVTQ1JJUFRJT04iCi5QUAouQiBta3ZleHRyYWN0CmV4dHJhY3RzIHNwZWNpZmljIHBhcnRzIGZyb20gYQouSSBNYXRyb3NrYShUTSkKZmlsZSB0byBvdGhlciB1c2VmdWwgZm9ybWF0c1wmLiBUaGUgZmlyc3QgYXJndW1lbnQsClxmQm1vZGVcZlIsIHRlbGxzClxmQm1rdmV4dHJhY3RcZlIoMSkKd2hhdCB0byBleHRyYWN0XCYuIEN1cnJlbnRseSBzdXBwb3J0ZWQgaXMgdGhlIGV4dHJhY3Rpb24gb2YKdHJhY2tzLAp0YWdzLAphdHRhY2htZW50cywKY2hhcHRlcnMsCkNVRSBzaGVldHMsCnRpbWVjb2RlcwphbmQKY3Vlc1wmLiBUaGUgc2Vjb25kIGFyZ3VtZW50IGlzIHRoZSBuYW1lIG9mIHRoZSBzb3VyY2UgZmlsZVwmLiBJdCBtdXN0IGJlIGEKTWF0cm9za2EoVE0pCmZpbGVcJi4gQWxsIGZvbGxvd2luZyBhcmd1bWVudHMgYXJlIG9wdGlvbnMgYW5kIGV4dHJhY3Rpb24gc3BlY2lmaWNhdGlvbnM7IGJvdGggb2Ygd2hpY2ggZGVwZW5kIG9uIHRoZSBzZWxlY3RlZCBtb2RlXCYuCi5TUyAiQ29tbW9uIG9wdGlvbnMiCi5QUApUaGUgZm9sbG93aW5nIG9wdGlvbnMgYXJlIGF2YWlsYWJsZSBpbiBhbGwgbW9kZXMgYW5kIG9ubHkgZGVzY3JpYmVkIG9uY2UgaW4gdGhpcyBzZWN0aW9uXCYuCi5QUApcZkJcLWZcZlIsIFxmQlwtXC1wYXJzZVwtZnVsbHlcZlIKLlJTIDQKU2V0cyB0aGUgcGFyc2UgbW9kZSB0byBcKihBcWZ1bGxcKihBcVwmLiBUaGUgZGVmYXVsdCBtb2RlIGRvZXMgbm90IHBhcnNlIHRoZSB3aG9sZSBmaWxlIGJ1dCB1c2VzIHRoZSBtZXRhIHNlZWsgZWxlbWVudHMgZm9yIGxvY2F0aW5nIHRoZSByZXF1aXJlZCBlbGVtZW50cyBvZiBhIHNvdXJjZSBmaWxlXCYuIEluIDk5JSBvZiBhbGwgY2FzZXMgdGhpcyBpcyBlbm91Z2hcJi4gQnV0IGZvciBmaWxlcyB0aGF0IGRvIG5vdCBjb250YWluIG1ldGEgc2VlayBlbGVtZW50cyBvciB3aGljaCBhcmUgZGFtYWdlZCB0aGUgdXNlciBtaWdodCBoYXZlIHRvIHVzZSB0aGlzIG1vZGVcJi4gQSBmdWxsIHNjYW4gb2YgYSBmaWxlIGNhbiB0YWtlIGEgY291cGxlIG9mIG1pbnV0ZXMgd2hpbGUgYSBmYXN0IHNjYW4gb25seSB0YWtlcyBzZWNvbmRzXCYuCi5SRQouUFAKXGZCXC1cLWNvbW1hbmRcLWxpbmVcLWNoYXJzZXRcZlIgXGZJY2hhcmFjdGVyXC1zZXRcZlIKLlJTIDQKU2V0cyB0aGUgY2hhcmFjdGVyIHNldCB0byBjb252ZXJ0IHN0cmluZ3MgZ2l2ZW4gb24gdGhlIGNvbW1hbmQgbGluZSBmcm9tXCYuIEl0IGRlZmF1bHRzIHRvIHRoZSBjaGFyYWN0ZXIgc2V0IGdpdmVuIGJ5IHN5c3RlbVwqKEFxcyBjdXJyZW50IGxvY2FsZVwmLgouUkUKLlBQClxmQlwtXC1vdXRwdXRcLWNoYXJzZXRcZlIgXGZJY2hhcmFjdGVyXC1zZXRcZlIKLlJTIDQKU2V0cyB0aGUgY2hhcmFjdGVyIHNldCB0byB3aGljaCBzdHJpbmdzIGFyZSBjb252ZXJ0ZWQgdGhhdCBhcmUgdG8gYmUgb3V0cHV0XCYuIEl0IGRlZmF1bHRzIHRvIHRoZSBjaGFyYWN0ZXIgc2V0IGdpdmVuIGJ5IHN5c3RlbVwqKEFxcyBjdXJyZW50IGxvY2FsZVwmLgouUkUKLlBQClxmQlwtclxmUiwgXGZCXC1cLXJlZGlyZWN0XC1vdXRwdXRcZlIgXGZJZmlsZVwtbmFtZVxmUgouUlMgNApXcml0ZXMgYWxsIG1lc3NhZ2VzIHRvIHRoZSBmaWxlClxmSWZpbGVcLW5hbWVcZlIKaW5zdGVhZCBvZiB0byB0aGUgY29uc29sZVwmLiBXaGlsZSB0aGlzIGNhbiBiZSBkb25lIGVhc2lseSB3aXRoIG91dHB1dCByZWRpcmVjdGlvbiB0aGVyZSBhcmUgY2FzZXMgaW4gd2hpY2ggdGhpcyBvcHRpb24gaXMgbmVlZGVkOiB3aGVuIHRoZSB0ZXJtaW5hbCByZWludGVycHJldHMgdGhlIG91dHB1dCBiZWZvcmUgd3JpdGluZyBpdCB0byBhIGZpbGVcJi4gVGhlIGNoYXJhY3RlciBzZXQgc2V0IHdpdGgKXGZCXC1cLW91dHB1dFwtY2hhcnNldFxmUgppcyBob25vcmVkXCYuCi5SRQouUFAKXGZCXC1cLXVpXC1sYW5ndWFnZVxmUiBcZkljb2RlXGZSCi5SUyA0CkZvcmNlcyB0aGUgdHJhbnNsYXRpb25zIGZvciB0aGUgbGFuZ3VhZ2UKXGZJY29kZVxmUgp0byBiZSB1c2VkIChlXCYuZ1wmLiBcKihBcWRlX0RFXCooQXEgZm9yIHRoZSBHZXJtYW4gdHJhbnNsYXRpb25zKVwmLiBJdCBpcyBwcmVmZXJhYmxlIHRvIHVzZSB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzClxmSUxBTkdcZlIsClxmSUxDX01FU1NBR0VTXGZSCmFuZApcZklMQ19BTExcZlIKdGhvdWdoXCYuIEVudGVyaW5nIFwqKEFxbGlzdFwqKEFxIGFzIHRoZQpcZkljb2RlXGZSCndpbGwgY2F1c2UKXGZCbWt2ZXh0cmFjdFxmUigxKQp0byBvdXRwdXQgYSBsaXN0IG9mIGF2YWlsYWJsZSB0cmFuc2xhdGlvbnNcJi4KCi5cIiBbLi4uXQoKLlNIICJTRUUgQUxTTyIKLlBQClxmQm1rdm1lcmdlXGZSKDEpLApcZkJta3ZpbmZvXGZSKDEpLApcZkJta3Zwcm9wZWRpdFxmUigxKSwKXGZCbW1nXGZSKDEpCi5TSCAiV1dXIgouUFAKVGhlIGxhdGVzdCB2ZXJzaW9uIGNhbiBhbHdheXMgYmUgZm91bmQgYXQKXG1bYmx1ZV1cZkJ0aGUgTUtWVG9vbE5peCBob21lcGFnZVxmUlxtW11cJlxzLTJcdVsxXVxkXHMrMlwmLgouU0ggIkFVVEhPUiIKLlBQClwoY28gXGZCTW9yaXR6IEJ1bmt1c1xmUiA8XCZtb3JpdHpAYnVua3VzXCYub3JnXCY+Ci5SUyA0CkRldmVsb3BlcgouUkUKLlNIICJOT1RFUyIKLklQICIgMS4iIDQKdGhlIE1LVlRvb2xOaXggaG9tZXBhZ2UKLlJTIDQKXCVodHRwczovL3d3dy5idW5rdXMub3JnL3ZpZGVvdG9vbHMvbWt2dG9vbG5peC8KLlJFCjwvdGV4dGFyZWE+Cgo8c2NyaXB0PgogIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnY29kZScpLCB7CiAgICBtb2RlOiAndHJvZmYnLAogICAgbGluZU51bWJlcnM6IHRydWUsCiAgICBtYXRjaEJyYWNrZXRzOiBmYWxzZQogIH0pOwo8L3NjcmlwdD4KCjxwPjxzdHJvbmc+TUlNRSB0eXBlcyBkZWZpbmVkOjwvc3Ryb25nPiA8Y29kZT50cm9mZjwvY29kZT4uPC9wPgo8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/troff/troff.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpCiAgICBkZWZpbmUoWyIuLi8uLi9saWIvY29kZW1pcnJvciJdLCBtb2QpOwogIGVsc2UKICAgIG1vZChDb2RlTWlycm9yKTsKfSkoZnVuY3Rpb24oQ29kZU1pcnJvcikgewoidXNlIHN0cmljdCI7CgpDb2RlTWlycm9yLmRlZmluZU1vZGUoJ3Ryb2ZmJywgZnVuY3Rpb24oKSB7CgogIHZhciB3b3JkcyA9IHt9OwoKICBmdW5jdGlvbiB0b2tlbkJhc2Uoc3RyZWFtKSB7CiAgICBpZiAoc3RyZWFtLmVhdFNwYWNlKCkpIHJldHVybiBudWxsOwoKICAgIHZhciBzb2wgPSBzdHJlYW0uc29sKCk7CiAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpOwoKICAgIGlmIChjaCA9PT0gJ1xcJykgewogICAgICBpZiAoc3RyZWFtLm1hdGNoKCdmQicpIHx8IHN0cmVhbS5tYXRjaCgnZlInKSB8fCBzdHJlYW0ubWF0Y2goJ2ZJJykgfHwKICAgICAgICAgIHN0cmVhbS5tYXRjaCgndScpICB8fCBzdHJlYW0ubWF0Y2goJ2QnKSAgfHwKICAgICAgICAgIHN0cmVhbS5tYXRjaCgnJScpICB8fCBzdHJlYW0ubWF0Y2goJyYnKSkgewogICAgICAgIHJldHVybiAnc3RyaW5nJzsKICAgICAgfQogICAgICBpZiAoc3RyZWFtLm1hdGNoKCdtWycpKSB7CiAgICAgICAgc3RyZWFtLnNraXBUbygnXScpOwogICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgcmV0dXJuICdzdHJpbmcnOwogICAgICB9CiAgICAgIGlmIChzdHJlYW0ubWF0Y2goJ3MrJykgfHwgc3RyZWFtLm1hdGNoKCdzLScpKSB7CiAgICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXGQtXS8pOwogICAgICAgIHJldHVybiAnc3RyaW5nJzsKICAgICAgfQogICAgICBpZiAoc3RyZWFtLm1hdGNoKCdcKCcpIHx8IHN0cmVhbS5tYXRjaCgnKlwoJykpIHsKICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcdy1dLyk7CiAgICAgICAgcmV0dXJuICdzdHJpbmcnOwogICAgICB9CiAgICAgIHJldHVybiAnc3RyaW5nJzsKICAgIH0KICAgIGlmIChzb2wgJiYgKGNoID09PSAnLicgfHwgY2ggPT09ICdcJycpKSB7CiAgICAgIGlmIChzdHJlYW0uZWF0KCdcXCcpICYmIHN0cmVhbS5lYXQoJ1wiJykpIHsKICAgICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICAgICAgcmV0dXJuICdjb21tZW50JzsKICAgICAgfQogICAgfQogICAgaWYgKHNvbCAmJiBjaCA9PT0gJy4nKSB7CiAgICAgIGlmIChzdHJlYW0ubWF0Y2goJ0IgJykgfHwgc3RyZWFtLm1hdGNoKCdJICcpIHx8IHN0cmVhbS5tYXRjaCgnUiAnKSkgewogICAgICAgIHJldHVybiAnYXR0cmlidXRlJzsKICAgICAgfQogICAgICBpZiAoc3RyZWFtLm1hdGNoKCdUSCAnKSB8fCBzdHJlYW0ubWF0Y2goJ1NIICcpIHx8IHN0cmVhbS5tYXRjaCgnU1MgJykgfHwgc3RyZWFtLm1hdGNoKCdIUCAnKSkgewogICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgICByZXR1cm4gJ3F1b3RlJzsKICAgICAgfQogICAgICBpZiAoKHN0cmVhbS5tYXRjaCgvW0EtWl0vKSAmJiBzdHJlYW0ubWF0Y2goL1tBLVpdLykpIHx8IChzdHJlYW0ubWF0Y2goL1thLXpdLykgJiYgc3RyZWFtLm1hdGNoKC9bYS16XS8pKSkgewogICAgICAgIHJldHVybiAnYXR0cmlidXRlJzsKICAgICAgfQogICAgfQogICAgc3RyZWFtLmVhdFdoaWxlKC9bXHctXS8pOwogICAgdmFyIGN1ciA9IHN0cmVhbS5jdXJyZW50KCk7CiAgICByZXR1cm4gd29yZHMuaGFzT3duUHJvcGVydHkoY3VyKSA/IHdvcmRzW2N1cl0gOiBudWxsOwogIH0KCiAgZnVuY3Rpb24gdG9rZW5pemUoc3RyZWFtLCBzdGF0ZSkgewogICAgcmV0dXJuIChzdGF0ZS50b2tlbnNbMF0gfHwgdG9rZW5CYXNlKSAoc3RyZWFtLCBzdGF0ZSk7CiAgfTsKCiAgcmV0dXJuIHsKICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKCkge3JldHVybiB7dG9rZW5zOltdfTt9LAogICAgdG9rZW46IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgcmV0dXJuIHRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgfQogIH07Cn0pOwoKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCd0ZXh0L3Ryb2ZmJywgJ3Ryb2ZmJyk7CkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgndGV4dC94LXRyb2ZmJywgJ3Ryb2ZmJyk7CkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgnYXBwbGljYXRpb24veC10cm9mZicsICd0cm9mZicpOwoKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/ttcn-cfg/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/ttcn-cfg/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogVFRDTi1DRkcgbW9kZTwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uLy4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxzY3JpcHQgc3JjPSIuLi8uLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJ0dGNuLWNmZy5qcyI+PC9zY3JpcHQ+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgICAuQ29kZU1pcnJvciB7CiAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIGJsYWNrOwogICAgICAgIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazsKICAgIH0KPC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxoMT5Db2RlTWlycm9yPC9oMT4KICAgICAgICA8aW1nIGlkPWxvZ28gc3JjPSIuLi8uLi9kb2MvbG9nby5wbmciPgogICAgPC9hPgoKICAgIDx1bD4KICAgICAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgICAgICA8bGk+PGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICAgICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgICA8L3VsPgogICAgPHVsPgogICAgICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5MYW5ndWFnZSBtb2RlczwvYT4KICAgICAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9Imh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVFRDTiI+VFRDTi1DRkc8L2E+CiAgICA8L3VsPgo8L2Rpdj4KPGFydGljbGU+CiAgICA8aDI+VFRDTi1DRkcgZXhhbXBsZTwvaDI+CiAgICA8ZGl2PgogICAgICAgIDx0ZXh0YXJlYSBpZD0idHRjbi1jZmctY29kZSI+CltNT0RVTEVfUEFSQU1FVEVSU10KIyBUaGlzIHNlY3Rpb24gc2hhbGwgY29udGFpbiB0aGUgdmFsdWVzIG9mIGFsbCBwYXJhbWV0ZXJzIHRoYXQgYXJlIGRlZmluZWQgaW4geW91ciBUVENOLTMgbW9kdWxlcy4KCltMT0dHSU5HXQojIEluIHRoaXMgc2VjdGlvbiB5b3UgY2FuIHNwZWNpZnkgdGhlIG5hbWUgb2YgdGhlIGxvZyBmaWxlIGFuZCB0aGUgY2xhc3NlcyBvZiBldmVudHMKIyB5b3Ugd2FudCB0byBsb2cgaW50byB0aGUgZmlsZSBvciBkaXNwbGF5IG9uIGNvbnNvbGUgKHN0YW5kYXJkIGVycm9yKS4KCkxvZ0ZpbGUgOj0gImxvZ3MvJWUuJWgtJXIuJXMiCkZpbGVNYXNrIDo9IExPR19BTEwgfCBERUJVRyB8IE1BVENISU5HCkNvbnNvbGVNYXNrIDo9IEVSUk9SIHwgV0FSTklORyB8IFRFU1RDQVNFIHwgU1RBVElTVElDUyB8IFBPUlRFVkVOVAoKTG9nU291cmNlSW5mbyA6PSBZZXMKQXBwZW5kRmlsZSA6PSBObwpUaW1lU3RhbXBGb3JtYXQgOj0gRGF0ZVRpbWUKTG9nRXZlbnRUeXBlcyA6PSBZZXMKU291cmNlSW5mb0Zvcm1hdCA6PSBTaW5nbGUKTG9nRW50aXR5TmFtZSA6PSBZZXMKCltURVNUUE9SVF9QQVJBTUVURVJTXQojIEluIHRoaXMgc2VjdGlvbiB5b3UgY2FuIHNwZWNpZnkgcGFyYW1ldGVycyB0aGF0IGFyZSBwYXNzZWQgdG8gVGVzdCBQb3J0cy4KCltERUZJTkVdCiMgSW4gdGhpcyBzZWN0aW9uIHlvdSBjYW4gY3JlYXRlIG1hY3JvIGRlZmluaXRpb25zLAojIHRoYXQgY2FuIGJlIHVzZWQgaW4gb3RoZXIgY29uZmlndXJhdGlvbiBmaWxlIHNlY3Rpb25zIGV4Y2VwdCBbSU5DTFVERV0uCgpbSU5DTFVERV0KIyBUbyB1c2UgY29uZmlndXJhdGlvbiBzZXR0aW5ncyBnaXZlbiBpbiBvdGhlciBjb25maWd1cmF0aW9uIGZpbGVzLAojIHRoZSBjb25maWd1cmF0aW9uIGZpbGVzIGp1c3QgbmVlZCB0byBiZSBsaXN0ZWQgaW4gdGhpcyBzZWN0aW9uLCB3aXRoIHRoZWlyIGZ1bGwgb3IgcmVsYXRpdmUgcGF0aG5hbWVzLgoKW0VYVEVSTkFMX0NPTU1BTkRTXQojIFRoaXMgc2VjdGlvbiBjYW4gZGVmaW5lIGV4dGVybmFsIGNvbW1hbmRzIChzaGVsbCBzY3JpcHRzKSB0byBiZSBleGVjdXRlZCBieSB0aGUgRVRTCiMgd2hlbmV2ZXIgYSBjb250cm9sIHBhcnQgb3IgdGVzdCBjYXNlIGlzIHN0YXJ0ZWQgb3IgdGVybWluYXRlZC4KCkJlZ2luVGVzdENhc2UgOj0gIiIKRW5kVGVzdENhc2UgOj0gIiIKQmVnaW5Db250cm9sUGFydCA6PSAiIgpFbmRDb250cm9sUGFydCA6PSAiIgoKW0VYRUNVVEVdCiMgSW4gdGhpcyBzZWN0aW9uIHlvdSBjYW4gc3BlY2lmeSB3aGF0IHBhcnRzIG9mIHlvdXIgdGVzdCBzdWl0ZSB5b3Ugd2FudCB0byBleGVjdXRlLgoKW0dST1VQU10KIyBJbiB0aGlzIHNlY3Rpb24geW91IGNhbiBzcGVjaWZ5IGdyb3VwcyBvZiBob3N0cy4gVGhlc2UgZ3JvdXBzIGNhbiBiZSB1c2VkIGluc2lkZSB0aGUKIyBbQ09NUE9ORU5UU10gc2VjdGlvbiB0byByZXN0cmljdCB0aGUgY3JlYXRpb24gb2YgY2VydGFpbiBQVENzIHRvIGEgZ2l2ZW4gc2V0IG9mIGhvc3RzLgoKW0NPTVBPTkVOVFNdCiMgVGhpcyBzZWN0aW9uIGNvbnNpc3RzIG9mIHJ1bGVzIHJlc3RyaWN0aW5nIHRoZSBsb2NhdGlvbiBvZiBjcmVhdGVkIFBUQ3MuCgpbTUFJTl9DT05UUk9MTEVSXQojIFRoZSBvcHRpb25zIGhlcmVpbiBjb250cm9sIHRoZSBiZWhhdmlvciBvZiBNQy4KClRDUFBvcnQgOj0gMApLaWxsVGltZXIgOj0gMTAuMApOdW1IQ3MgOj0gMApMb2NhbEFkZHJlc3MgOj0KICAgICAgICA8L3RleHRhcmVhPgogICAgPC9kaXY+CgogICAgPHNjcmlwdD4gCiAgICAgIHZhciB0dGNuRWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInR0Y24tY2ZnLWNvZGUiKSwgewogICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgICAgIG1hdGNoQnJhY2tldHM6IHRydWUsCiAgICAgICAgbW9kZTogInRleHQveC10dGNuLWNmZyIKICAgICAgfSk7CiAgICAgIHR0Y25FZGl0b3Iuc2V0U2l6ZSg2MDAsIDg2MCk7CiAgICAgIHZhciBtYWMgPSBDb2RlTWlycm9yLmtleU1hcC5kZWZhdWx0ID09IENvZGVNaXJyb3Iua2V5TWFwLm1hY0RlZmF1bHQ7CiAgICAgIENvZGVNaXJyb3Iua2V5TWFwLmRlZmF1bHRbKG1hYyA/ICJDbWQiIDogIkN0cmwiKSArICItU3BhY2UiXSA9ICJhdXRvY29tcGxldGUiOwogICAgPC9zY3JpcHQ+CiAgICA8YnIvPgogICAgPHA+PHN0cm9uZz5MYW5ndWFnZTo8L3N0cm9uZz4gVGVzdGluZyBhbmQgVGVzdCBDb250cm9sIE5vdGF0aW9uIC0KICAgICAgICBDb25maWd1cmF0aW9uIGZpbGVzCiAgICAgICAgKDxhIGhyZWY9Imh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVFRDTiI+VFRDTi1DRkc8L2E+KQogICAgPC9wPgogICAgPHA+PHN0cm9uZz5NSU1FIHR5cGVzIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPnRleHQveC10dGNuLWNmZzwvY29kZT4uPC9wPgoKICAgIDxici8+CiAgICA8cD5UaGUgZGV2ZWxvcG1lbnQgb2YgdGhpcyBtb2RlIGhhcyBiZWVuIHNwb25zb3JlZCBieSA8YSBocmVmPSJodHRwOi8vd3d3LmVyaWNzc29uLmNvbS8iPkVyaWNzc29uCiAgICA8L2E+LjwvcD4KICAgIDxwPkNvZGVkIGJ5IEFzbWVsYXNoIFRzZWdheSBHZWJyZXRzYWRrYW4gPC9wPgo8L2FydGljbGU+Cgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/ttcn-cfg/ttcn-cfg.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CgogIENvZGVNaXJyb3IuZGVmaW5lTW9kZSgidHRjbi1jZmciLCBmdW5jdGlvbihjb25maWcsIHBhcnNlckNvbmZpZykgewogICAgdmFyIGluZGVudFVuaXQgPSBjb25maWcuaW5kZW50VW5pdCwKICAgICAgICBrZXl3b3JkcyA9IHBhcnNlckNvbmZpZy5rZXl3b3JkcyB8fCB7fSwKICAgICAgICBmaWxlTkN0cmxNYXNrT3B0aW9ucyA9IHBhcnNlckNvbmZpZy5maWxlTkN0cmxNYXNrT3B0aW9ucyB8fCB7fSwKICAgICAgICBleHRlcm5hbENvbW1hbmRzID0gcGFyc2VyQ29uZmlnLmV4dGVybmFsQ29tbWFuZHMgfHwge30sCiAgICAgICAgbXVsdGlMaW5lU3RyaW5ncyA9IHBhcnNlckNvbmZpZy5tdWx0aUxpbmVTdHJpbmdzLAogICAgICAgIGluZGVudFN0YXRlbWVudHMgPSBwYXJzZXJDb25maWcuaW5kZW50U3RhdGVtZW50cyAhPT0gZmFsc2U7CiAgICB2YXIgaXNPcGVyYXRvckNoYXIgPSAvW1x8XS87CiAgICB2YXIgY3VyUHVuYzsKCiAgICBmdW5jdGlvbiB0b2tlbkJhc2Uoc3RyZWFtLCBzdGF0ZSkgewogICAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpOwogICAgICBpZiAoY2ggPT0gJyInIHx8IGNoID09ICInIikgewogICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5TdHJpbmcoY2gpOwogICAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgICAgfQogICAgICBpZiAoL1s6PV0vLnRlc3QoY2gpKSB7CiAgICAgICAgY3VyUHVuYyA9IGNoOwogICAgICAgIHJldHVybiAicHVuY3R1YXRpb24iOwogICAgICB9CiAgICAgIGlmIChjaCA9PSAiIyIpewogICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgICByZXR1cm4gImNvbW1lbnQiOwogICAgICB9CiAgICAgIGlmICgvXGQvLnRlc3QoY2gpKSB7CiAgICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXHdcLl0vKTsKICAgICAgICByZXR1cm4gIm51bWJlciI7CiAgICAgIH0KICAgICAgaWYgKGlzT3BlcmF0b3JDaGFyLnRlc3QoY2gpKSB7CiAgICAgICAgc3RyZWFtLmVhdFdoaWxlKGlzT3BlcmF0b3JDaGFyKTsKICAgICAgICByZXR1cm4gIm9wZXJhdG9yIjsKICAgICAgfQogICAgICBpZiAoY2ggPT0gIlsiKXsKICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcd19cXV0vKTsKICAgICAgICByZXR1cm4gIm51bWJlciBzZWN0aW9uVGl0bGUiOwogICAgICB9CgogICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcd1wkX10vKTsKICAgICAgdmFyIGN1ciA9IHN0cmVhbS5jdXJyZW50KCk7CiAgICAgIGlmIChrZXl3b3Jkcy5wcm9wZXJ0eUlzRW51bWVyYWJsZShjdXIpKSByZXR1cm4gImtleXdvcmQiOwogICAgICBpZiAoZmlsZU5DdHJsTWFza09wdGlvbnMucHJvcGVydHlJc0VudW1lcmFibGUoY3VyKSkKICAgICAgICByZXR1cm4gIm5lZ2F0aXZlIGZpbGVOQ3RybE1hc2tPcHRpb25zIjsKICAgICAgaWYgKGV4dGVybmFsQ29tbWFuZHMucHJvcGVydHlJc0VudW1lcmFibGUoY3VyKSkgcmV0dXJuICJuZWdhdGl2ZSBleHRlcm5hbENvbW1hbmRzIjsKCiAgICAgIHJldHVybiAidmFyaWFibGUiOwogICAgfQoKICAgIGZ1bmN0aW9uIHRva2VuU3RyaW5nKHF1b3RlKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgICAgdmFyIGVzY2FwZWQgPSBmYWxzZSwgbmV4dCwgZW5kID0gZmFsc2U7CiAgICAgICAgd2hpbGUgKChuZXh0ID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkgewogICAgICAgICAgaWYgKG5leHQgPT0gcXVvdGUgJiYgIWVzY2FwZWQpewogICAgICAgICAgICB2YXIgYWZ0ZXJOZXh0ID0gc3RyZWFtLnBlZWsoKTsKICAgICAgICAgICAgLy9sb29rIGlmIHRoZSBjaGFyYWN0ZXIgaWYgdGhlIHF1b3RlIGlzIGxpa2UgdGhlIEIgaW4gJzEwMTAwMDEwJ0IKICAgICAgICAgICAgaWYgKGFmdGVyTmV4dCl7CiAgICAgICAgICAgICAgYWZ0ZXJOZXh0ID0gYWZ0ZXJOZXh0LnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgICAgaWYoYWZ0ZXJOZXh0ID09ICJiIiB8fCBhZnRlck5leHQgPT0gImgiIHx8IGFmdGVyTmV4dCA9PSAibyIpCiAgICAgICAgICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVuZCA9IHRydWU7IGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgZXNjYXBlZCA9ICFlc2NhcGVkICYmIG5leHQgPT0gIlxcIjsKICAgICAgICB9CiAgICAgICAgaWYgKGVuZCB8fCAhKGVzY2FwZWQgfHwgbXVsdGlMaW5lU3RyaW5ncykpCiAgICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IG51bGw7CiAgICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIENvbnRleHQoaW5kZW50ZWQsIGNvbHVtbiwgdHlwZSwgYWxpZ24sIHByZXYpIHsKICAgICAgdGhpcy5pbmRlbnRlZCA9IGluZGVudGVkOwogICAgICB0aGlzLmNvbHVtbiA9IGNvbHVtbjsKICAgICAgdGhpcy50eXBlID0gdHlwZTsKICAgICAgdGhpcy5hbGlnbiA9IGFsaWduOwogICAgICB0aGlzLnByZXYgPSBwcmV2OwogICAgfQogICAgZnVuY3Rpb24gcHVzaENvbnRleHQoc3RhdGUsIGNvbCwgdHlwZSkgewogICAgICB2YXIgaW5kZW50ID0gc3RhdGUuaW5kZW50ZWQ7CiAgICAgIGlmIChzdGF0ZS5jb250ZXh0ICYmIHN0YXRlLmNvbnRleHQudHlwZSA9PSAic3RhdGVtZW50IikKICAgICAgICBpbmRlbnQgPSBzdGF0ZS5jb250ZXh0LmluZGVudGVkOwogICAgICByZXR1cm4gc3RhdGUuY29udGV4dCA9IG5ldyBDb250ZXh0KGluZGVudCwgY29sLCB0eXBlLCBudWxsLCBzdGF0ZS5jb250ZXh0KTsKICAgIH0KICAgIGZ1bmN0aW9uIHBvcENvbnRleHQoc3RhdGUpIHsKICAgICAgdmFyIHQgPSBzdGF0ZS5jb250ZXh0LnR5cGU7CiAgICAgIGlmICh0ID09ICIpIiB8fCB0ID09ICJdIiB8fCB0ID09ICJ9IikKICAgICAgICBzdGF0ZS5pbmRlbnRlZCA9IHN0YXRlLmNvbnRleHQuaW5kZW50ZWQ7CiAgICAgIHJldHVybiBzdGF0ZS5jb250ZXh0ID0gc3RhdGUuY29udGV4dC5wcmV2OwogICAgfQoKICAgIC8vSW50ZXJmYWNlCiAgICByZXR1cm4gewogICAgICBzdGFydFN0YXRlOiBmdW5jdGlvbihiYXNlY29sdW1uKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHRva2VuaXplOiBudWxsLAogICAgICAgICAgY29udGV4dDogbmV3IENvbnRleHQoKGJhc2Vjb2x1bW4gfHwgMCkgLSBpbmRlbnRVbml0LCAwLCAidG9wIiwgZmFsc2UpLAogICAgICAgICAgaW5kZW50ZWQ6IDAsCiAgICAgICAgICBzdGFydE9mTGluZTogdHJ1ZQogICAgICAgIH07CiAgICAgIH0sCgogICAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICAgIHZhciBjdHggPSBzdGF0ZS5jb250ZXh0OwogICAgICAgIGlmIChzdHJlYW0uc29sKCkpIHsKICAgICAgICAgIGlmIChjdHguYWxpZ24gPT0gbnVsbCkgY3R4LmFsaWduID0gZmFsc2U7CiAgICAgICAgICBzdGF0ZS5pbmRlbnRlZCA9IHN0cmVhbS5pbmRlbnRhdGlvbigpOwogICAgICAgICAgc3RhdGUuc3RhcnRPZkxpbmUgPSB0cnVlOwogICAgICAgIH0KICAgICAgICBpZiAoc3RyZWFtLmVhdFNwYWNlKCkpIHJldHVybiBudWxsOwogICAgICAgIGN1clB1bmMgPSBudWxsOwogICAgICAgIHZhciBzdHlsZSA9IChzdGF0ZS50b2tlbml6ZSB8fCB0b2tlbkJhc2UpKHN0cmVhbSwgc3RhdGUpOwogICAgICAgIGlmIChzdHlsZSA9PSAiY29tbWVudCIpIHJldHVybiBzdHlsZTsKICAgICAgICBpZiAoY3R4LmFsaWduID09IG51bGwpIGN0eC5hbGlnbiA9IHRydWU7CgogICAgICAgIGlmICgoY3VyUHVuYyA9PSAiOyIgfHwgY3VyUHVuYyA9PSAiOiIgfHwgY3VyUHVuYyA9PSAiLCIpCiAgICAgICAgICAgICYmIGN0eC50eXBlID09ICJzdGF0ZW1lbnQiKXsKICAgICAgICAgIHBvcENvbnRleHQoc3RhdGUpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChjdXJQdW5jID09ICJ7IikgcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbS5jb2x1bW4oKSwgIn0iKTsKICAgICAgICBlbHNlIGlmIChjdXJQdW5jID09ICJbIikgcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbS5jb2x1bW4oKSwgIl0iKTsKICAgICAgICBlbHNlIGlmIChjdXJQdW5jID09ICIoIikgcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbS5jb2x1bW4oKSwgIikiKTsKICAgICAgICBlbHNlIGlmIChjdXJQdW5jID09ICJ9IikgewogICAgICAgICAgd2hpbGUgKGN0eC50eXBlID09ICJzdGF0ZW1lbnQiKSBjdHggPSBwb3BDb250ZXh0KHN0YXRlKTsKICAgICAgICAgIGlmIChjdHgudHlwZSA9PSAifSIpIGN0eCA9IHBvcENvbnRleHQoc3RhdGUpOwogICAgICAgICAgd2hpbGUgKGN0eC50eXBlID09ICJzdGF0ZW1lbnQiKSBjdHggPSBwb3BDb250ZXh0KHN0YXRlKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoY3VyUHVuYyA9PSBjdHgudHlwZSkgcG9wQ29udGV4dChzdGF0ZSk7CiAgICAgICAgZWxzZSBpZiAoaW5kZW50U3RhdGVtZW50cyAmJiAoKChjdHgudHlwZSA9PSAifSIgfHwgY3R4LnR5cGUgPT0gInRvcCIpCiAgICAgICAgICAgICYmIGN1clB1bmMgIT0gJzsnKSB8fCAoY3R4LnR5cGUgPT0gInN0YXRlbWVudCIKICAgICAgICAgICAgJiYgY3VyUHVuYyA9PSAibmV3c3RhdGVtZW50IikpKQogICAgICAgICAgcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbS5jb2x1bW4oKSwgInN0YXRlbWVudCIpOwogICAgICAgIHN0YXRlLnN0YXJ0T2ZMaW5lID0gZmFsc2U7CiAgICAgICAgcmV0dXJuIHN0eWxlOwogICAgICB9LAoKICAgICAgZWxlY3RyaWNDaGFyczogInt9IiwKICAgICAgbGluZUNvbW1lbnQ6ICIjIiwKICAgICAgZm9sZDogImJyYWNlIgogICAgfTsKICB9KTsKCiAgZnVuY3Rpb24gd29yZHMoc3RyKSB7CiAgICB2YXIgb2JqID0ge30sIHdvcmRzID0gc3RyLnNwbGl0KCIgIik7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHdvcmRzLmxlbmd0aDsgKytpKQogICAgICBvYmpbd29yZHNbaV1dID0gdHJ1ZTsKICAgIHJldHVybiBvYmo7CiAgfQoKICBDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveC10dGNuLWNmZyIsIHsKICAgIG5hbWU6ICJ0dGNuLWNmZyIsCiAgICBrZXl3b3Jkczogd29yZHMoIlllcyBObyBMb2dGaWxlIEZpbGVNYXNrIENvbnNvbGVNYXNrIEFwcGVuZEZpbGUiICsKICAgICIgVGltZVN0YW1wRm9ybWF0IExvZ0V2ZW50VHlwZXMgU291cmNlSW5mb0Zvcm1hdCIgKwogICAgIiBMb2dFbnRpdHlOYW1lIExvZ1NvdXJjZUluZm8gRGlza0Z1bGxBY3Rpb24iICsKICAgICIgTG9nRmlsZU51bWJlciBMb2dGaWxlU2l6ZSBNYXRjaGluZ0hpbnRzIERldGFpbGVkIiArCiAgICAiIENvbXBhY3QgU3ViQ2F0ZWdvcmllcyBTdGFjayBTaW5nbGUgTm9uZSBTZWNvbmRzIiArCiAgICAiIERhdGVUaW1lIFRpbWUgU3RvcCBFcnJvciBSZXRyeSBEZWxldGUgVENQUG9ydCBLaWxsVGltZXIiICsKICAgICIgTnVtSENzIFVuaXhTb2NrZXRzRW5hYmxlZCBMb2NhbEFkZHJlc3MiKSwKICAgIGZpbGVOQ3RybE1hc2tPcHRpb25zOiB3b3JkcygiVFRDTl9FWEVDVVRPUiBUVENOX0VSUk9SIFRUQ05fV0FSTklORyIgKwogICAgIiBUVENOX1BPUlRFVkVOVCBUVENOX1RJTUVST1AgVFRDTl9WRVJESUNUT1AiICsKICAgICIgVFRDTl9ERUZBVUxUT1AgVFRDTl9URVNUQ0FTRSBUVENOX0FDVElPTiIgKwogICAgIiBUVENOX1VTRVIgVFRDTl9GVU5DVElPTiBUVENOX1NUQVRJU1RJQ1MiICsKICAgICIgVFRDTl9QQVJBTExFTCBUVENOX01BVENISU5HIFRUQ05fREVCVUciICsKICAgICIgRVhFQ1VUT1IgRVJST1IgV0FSTklORyBQT1JURVZFTlQgVElNRVJPUCIgKwogICAgIiBWRVJESUNUT1AgREVGQVVMVE9QIFRFU1RDQVNFIEFDVElPTiBVU0VSIiArCiAgICAiIEZVTkNUSU9OIFNUQVRJU1RJQ1MgUEFSQUxMRUwgTUFUQ0hJTkcgREVCVUciICsKICAgICIgTE9HX0FMTCBMT0dfTk9USElORyBBQ1RJT05fVU5RVUFMSUZJRUQiICsKICAgICIgREVCVUdfRU5DREVDIERFQlVHX1RFU1RQT1JUIiArCiAgICAiIERFQlVHX1VOUVVBTElGSUVEIERFRkFVTFRPUF9BQ1RJVkFURSIgKwogICAgIiBERUZBVUxUT1BfREVBQ1RJVkFURSBERUZBVUxUT1BfRVhJVCIgKwogICAgIiBERUZBVUxUT1BfVU5RVUFMSUZJRUQgRVJST1JfVU5RVUFMSUZJRUQiICsKICAgICIgRVhFQ1VUT1JfQ09NUE9ORU5UIEVYRUNVVE9SX0NPTkZJR0RBVEEiICsKICAgICIgRVhFQ1VUT1JfRVhUQ09NTUFORCBFWEVDVVRPUl9MT0dPUFRJT05TIiArCiAgICAiIEVYRUNVVE9SX1JVTlRJTUUgRVhFQ1VUT1JfVU5RVUFMSUZJRUQiICsKICAgICIgRlVOQ1RJT05fUk5EIEZVTkNUSU9OX1VOUVVBTElGSUVEIiArCiAgICAiIE1BVENISU5HX0RPTkUgTUFUQ0hJTkdfTUNTVUNDRVNTIiArCiAgICAiIE1BVENISU5HX01DVU5TVUNDIE1BVENISU5HX01NU1VDQ0VTUyIgKwogICAgIiBNQVRDSElOR19NTVVOU1VDQyBNQVRDSElOR19QQ1NVQ0NFU1MiICsKICAgICIgTUFUQ0hJTkdfUENVTlNVQ0MgTUFUQ0hJTkdfUE1TVUNDRVNTIiArCiAgICAiIE1BVENISU5HX1BNVU5TVUNDIE1BVENISU5HX1BST0JMRU0iICsKICAgICIgTUFUQ0hJTkdfVElNRU9VVCBNQVRDSElOR19VTlFVQUxJRklFRCIgKwogICAgIiBQQVJBTExFTF9QT1JUQ09OTiBQQVJBTExFTF9QT1JUTUFQIiArCiAgICAiIFBBUkFMTEVMX1BUQyBQQVJBTExFTF9VTlFVQUxJRklFRCIgKwogICAgIiBQT1JURVZFTlRfRFVBTFJFQ1YgUE9SVEVWRU5UX0RVQUxTRU5EIiArCiAgICAiIFBPUlRFVkVOVF9NQ1JFQ1YgUE9SVEVWRU5UX01DU0VORCIgKwogICAgIiBQT1JURVZFTlRfTU1SRUNWIFBPUlRFVkVOVF9NTVNFTkQiICsKICAgICIgUE9SVEVWRU5UX01RVUVVRSBQT1JURVZFTlRfUENJTiIgKwogICAgIiBQT1JURVZFTlRfUENPVVQgUE9SVEVWRU5UX1BNSU4iICsKICAgICIgUE9SVEVWRU5UX1BNT1VUIFBPUlRFVkVOVF9QUVVFVUUiICsKICAgICIgUE9SVEVWRU5UX1NUQVRFIFBPUlRFVkVOVF9VTlFVQUxJRklFRCIgKwogICAgIiBTVEFUSVNUSUNTX1VOUVVBTElGSUVEIFNUQVRJU1RJQ1NfVkVSRElDVCIgKwogICAgIiBURVNUQ0FTRV9GSU5JU0ggVEVTVENBU0VfU1RBUlQiICsKICAgICIgVEVTVENBU0VfVU5RVUFMSUZJRUQgVElNRVJPUF9HVUFSRCIgKwogICAgIiBUSU1FUk9QX1JFQUQgVElNRVJPUF9TVEFSVCBUSU1FUk9QX1NUT1AiICsKICAgICIgVElNRVJPUF9USU1FT1VUIFRJTUVST1BfVU5RVUFMSUZJRUQiICsKICAgICIgVVNFUl9VTlFVQUxJRklFRCBWRVJESUNUT1BfRklOQUwiICsKICAgICIgVkVSRElDVE9QX0dFVFZFUkRJQ1QgVkVSRElDVE9QX1NFVFZFUkRJQ1QiICsKICAgICIgVkVSRElDVE9QX1VOUVVBTElGSUVEIFdBUk5JTkdfVU5RVUFMSUZJRUQiKSwKICAgIGV4dGVybmFsQ29tbWFuZHM6IHdvcmRzKCJCZWdpbkNvbnRyb2xQYXJ0IEVuZENvbnRyb2xQYXJ0IEJlZ2luVGVzdENhc2UiICsKICAgICIgRW5kVGVzdENhc2UiKSwKICAgIG11bHRpTGluZVN0cmluZ3M6IHRydWUKICB9KTsKfSk7]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/ttcn/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/ttcn/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogVFRDTiBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9InR0Y24uanMiPjwvc2NyaXB0Pgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPgogICAgLkNvZGVNaXJyb3IgewogICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCBibGFjazsKICAgICAgICBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7CiAgICB9Cjwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogICAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aDE+Q29kZU1pcnJvcjwvaDE+CiAgICAgICAgPGltZyBpZD1sb2dvIHNyYz0iLi4vLi4vZG9jL2xvZ28ucG5nIj4KICAgIDwvYT4KCiAgICA8dWw+CiAgICAgICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICAgICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9jb2RlbWlycm9yIj5Db2RlPC9hPgogICAgPC91bD4KICAgIDx1bD4KICAgICAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+TGFuZ3VhZ2UgbW9kZXM8L2E+CiAgICAgICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSJodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1RUQ04iPlRUQ048L2E+CiAgICA8L3VsPgo8L2Rpdj4KPGFydGljbGU+CiAgICA8aDI+VFRDTiBleGFtcGxlPC9oMj4KICAgIDxkaXY+CiAgICAgICAgPHRleHRhcmVhIGlkPSJ0dGNuLWNvZGUiPgptb2R1bGUgVGVtcGxhdGVzIHsKICAvKiBpbXBvcnQgdHlwZXMgZnJvbSBBU04uMSAqLwogIGltcG9ydCBmcm9tIFR5cGVzIGxhbmd1YWdlICJBU04uMToxOTk3IiBhbGw7CgogIC8qIER1cmluZyB0aGUgY29udmVyc2lvbiBwaGFzZSBmcm9tIEFTTi4xIHRvIFRUQ04tMyAqLwogIC8qIC0gdGhlIG1pbnVzIHNpZ24gKE1lc3NhZ2UtVHlwZSkgd2l0aGluIHRoZSBpZGVudGlmaWVycyB3aWxsIGJlIHJlcGxhY2VkIGJ5IHVuZGVyc2NvcmUgKE1lc3NhZ2VfVHlwZSkqLwogIC8qIC0gdGhlIEFTTi4xIGlkZW50aWZpZXJzIG1hdGNoaW5nIGEgVFRDTi0zIGtleXdvcmQgKG9iamlkKSB3aWxsIGJlIHBvc3RmaXhlZCB3aXRoIGFuIHVuZGVyc2NvcmUgKG9iamlkXykqLwoKICAvLyBzaW1wbGUgdHlwZXMKCiAgdGVtcGxhdGUgU2VuZGVySUQgbG9jYWxPYmppZCA6PSBvYmppZCB7aXR1X3QoMCkgaWRlbnRpZmllZF9vcmdhbml6YXRpb24oNCkgZXRzaSgwKX07CgogIC8vIGNvbXBsZXggdHlwZXMKCiAgLyogQVNOLjEgTWVzc2FnZS1UeXBlIG1hcHBlZCB0byBUVENOLTMgTWVzc2FnZV9UeXBlICovCiAgdGVtcGxhdGUgTWVzc2FnZSByZWNlaXZlTXNnKHRlbXBsYXRlIChwcmVzZW50KSBNZXNzYWdlX1R5cGUgcF9tZXNzYWdlVHlwZSkgOj0gewogICAgaGVhZGVyIDo9IHBfbWVzc2FnZVR5cGUsCiAgICBib2R5IDo9ID8KICB9CgogIC8qIEFTTi4xIG9iamlkIG1hcHBlZCB0byBUVENOLTMgb2JqaWRfICovCiAgdGVtcGxhdGUgTWVzc2FnZSBzZW5kSW52aXRlTXNnIDo9IHsKICAgICAgaGVhZGVyIDo9IGludml0ZVR5cGUsCiAgICAgIGJvZHkgOj0gewogICAgICAgIC8qIG9wdGlvbmFsIGZpZWxkcyBtYXkgYmUgYXNzaWduZWQgYnkgb21pdCBvciBtYXkgYmUgaWdub3JlZC9za2lwcGVkICovCiAgICAgICAgZGVzY3JpcHRpb24gOj0gIkludml0ZSBNZXNzYWdlIiwKICAgICAgICBkYXRhIDo9ICdGRidPLAogICAgICAgIG9iamlkXyA6PSBsb2NhbE9iamlkCiAgICAgIH0KICB9CgogIHRlbXBsYXRlIE1lc3NhZ2Ugc2VuZEFjY2VwdE1zZyBtb2RpZmllcyBzZW5kSW52aXRlTXNnIDo9IHsKICAgICAgaGVhZGVyIDo9IGFjY2VwdFR5cGUsCiAgICAgIGJvZHkgOj0gewogICAgICAgIGRlc2NyaXB0aW9uIDo9ICJBY2NlcHQgTWVzc2FnZSIKICAgICAgfQogICAgfTsKCiAgdGVtcGxhdGUgTWVzc2FnZSBzZW5kRXJyb3JNc2cgbW9kaWZpZXMgc2VuZEludml0ZU1zZyA6PSB7CiAgICAgIGhlYWRlciA6PSBlcnJvclR5cGUsCiAgICAgIGJvZHkgOj0gewogICAgICAgIGRlc2NyaXB0aW9uIDo9ICJFcnJvciBNZXNzYWdlIgogICAgICB9CiAgICB9OwoKICB0ZW1wbGF0ZSBNZXNzYWdlIGV4cGVjdGVkRXJyb3JNc2cgOj0gewogICAgICBoZWFkZXIgOj0gZXJyb3JUeXBlLAogICAgICBib2R5IDo9ID8KICAgIH07CgogIHRlbXBsYXRlIE1lc3NhZ2UgZXhwZWN0ZWRJbnZpdGVNc2cgbW9kaWZpZXMgZXhwZWN0ZWRFcnJvck1zZyA6PSB7CiAgICAgIGhlYWRlciA6PSBpbnZpdGVUeXBlCiAgICB9OwoKICB0ZW1wbGF0ZSBNZXNzYWdlIGV4cGVjdGVkQWNjZXB0TXNnIG1vZGlmaWVzIGV4cGVjdGVkRXJyb3JNc2cgOj0gewogICAgICBoZWFkZXIgOj0gYWNjZXB0VHlwZQogICAgfTsKCn0gd2l0aCB7IGVuY29kZSAiQkVSOjE5OTciIH0KICAgICAgICA8L3RleHRhcmVhPgogICAgPC9kaXY+CgogICAgPHNjcmlwdD4gCiAgICAgIHZhciB0dGNuRWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInR0Y24tY29kZSIpLCB7CiAgICAgICAgbGluZU51bWJlcnM6IHRydWUsCiAgICAgICAgbWF0Y2hCcmFja2V0czogdHJ1ZSwKICAgICAgICBtb2RlOiAidGV4dC94LXR0Y24iCiAgICAgIH0pOwogICAgICB0dGNuRWRpdG9yLnNldFNpemUoNjAwLCA4NjApOwogICAgICB2YXIgbWFjID0gQ29kZU1pcnJvci5rZXlNYXAuZGVmYXVsdCA9PSBDb2RlTWlycm9yLmtleU1hcC5tYWNEZWZhdWx0OwogICAgICBDb2RlTWlycm9yLmtleU1hcC5kZWZhdWx0WyhtYWMgPyAiQ21kIiA6ICJDdHJsIikgKyAiLVNwYWNlIl0gPSAiYXV0b2NvbXBsZXRlIjsKICAgIDwvc2NyaXB0PgogICAgPGJyLz4KICAgIDxwPjxzdHJvbmc+TGFuZ3VhZ2U6PC9zdHJvbmc+IFRlc3RpbmcgYW5kIFRlc3QgQ29udHJvbCBOb3RhdGlvbgogICAgICAgICg8YSBocmVmPSJodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1RUQ04iPlRUQ048L2E+KQogICAgPC9wPgogICAgPHA+PHN0cm9uZz5NSU1FIHR5cGVzIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPnRleHQveC10dGNuLAogICAgICAgIHRleHQveC10dGNuMywgdGV4dC94LXR0Y25wcDwvY29kZT4uPC9wPgogICAgPGJyLz4KICAgIDxwPlRoZSBkZXZlbG9wbWVudCBvZiB0aGlzIG1vZGUgaGFzIGJlZW4gc3BvbnNvcmVkIGJ5IDxhIGhyZWY9Imh0dHA6Ly93d3cuZXJpY3Nzb24uY29tLyI+RXJpY3Nzb24KICAgIDwvYT4uPC9wPgogICAgPHA+Q29kZWQgYnkgQXNtZWxhc2ggVHNlZ2F5IEdlYnJldHNhZGthbiA8L3A+CjwvYXJ0aWNsZT4KCg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/ttcn/ttcn.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICAidXNlIHN0cmljdCI7CgogIENvZGVNaXJyb3IuZGVmaW5lTW9kZSgidHRjbiIsIGZ1bmN0aW9uKGNvbmZpZywgcGFyc2VyQ29uZmlnKSB7CiAgICB2YXIgaW5kZW50VW5pdCA9IGNvbmZpZy5pbmRlbnRVbml0LAogICAgICAgIGtleXdvcmRzID0gcGFyc2VyQ29uZmlnLmtleXdvcmRzIHx8IHt9LAogICAgICAgIGJ1aWx0aW4gPSBwYXJzZXJDb25maWcuYnVpbHRpbiB8fCB7fSwKICAgICAgICB0aW1lck9wcyA9IHBhcnNlckNvbmZpZy50aW1lck9wcyB8fCB7fSwKICAgICAgICBwb3J0T3BzICA9IHBhcnNlckNvbmZpZy5wb3J0T3BzIHx8IHt9LAogICAgICAgIGNvbmZpZ09wcyA9IHBhcnNlckNvbmZpZy5jb25maWdPcHMgfHwge30sCiAgICAgICAgdmVyZGljdE9wcyA9IHBhcnNlckNvbmZpZy52ZXJkaWN0T3BzIHx8IHt9LAogICAgICAgIHN1dE9wcyA9IHBhcnNlckNvbmZpZy5zdXRPcHMgfHwge30sCiAgICAgICAgZnVuY3Rpb25PcHMgPSBwYXJzZXJDb25maWcuZnVuY3Rpb25PcHMgfHwge30sCgogICAgICAgIHZlcmRpY3RDb25zdHMgPSBwYXJzZXJDb25maWcudmVyZGljdENvbnN0cyB8fCB7fSwKICAgICAgICBib29sZWFuQ29uc3RzID0gcGFyc2VyQ29uZmlnLmJvb2xlYW5Db25zdHMgfHwge30sCiAgICAgICAgb3RoZXJDb25zdHMgICA9IHBhcnNlckNvbmZpZy5vdGhlckNvbnN0cyB8fCB7fSwKCiAgICAgICAgdHlwZXMgPSBwYXJzZXJDb25maWcudHlwZXMgfHwge30sCiAgICAgICAgdmlzaWJpbGl0eU1vZGlmaWVycyA9IHBhcnNlckNvbmZpZy52aXNpYmlsaXR5TW9kaWZpZXJzIHx8IHt9LAogICAgICAgIHRlbXBsYXRlTWF0Y2ggPSBwYXJzZXJDb25maWcudGVtcGxhdGVNYXRjaCB8fCB7fSwKICAgICAgICBtdWx0aUxpbmVTdHJpbmdzID0gcGFyc2VyQ29uZmlnLm11bHRpTGluZVN0cmluZ3MsCiAgICAgICAgaW5kZW50U3RhdGVtZW50cyA9IHBhcnNlckNvbmZpZy5pbmRlbnRTdGF0ZW1lbnRzICE9PSBmYWxzZTsKICAgIHZhciBpc09wZXJhdG9yQ2hhciA9IC9bK1wtKiZAPTw+IVwvXS87CiAgICB2YXIgY3VyUHVuYzsKCiAgICBmdW5jdGlvbiB0b2tlbkJhc2Uoc3RyZWFtLCBzdGF0ZSkgewogICAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpOwoKICAgICAgaWYgKGNoID09ICciJyB8fCBjaCA9PSAiJyIpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuU3RyaW5nKGNoKTsKICAgICAgICByZXR1cm4gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CiAgICAgIH0KICAgICAgaWYgKC9bXFtcXXt9XChcKSw7XFw6XD9cLl0vLnRlc3QoY2gpKSB7CiAgICAgICAgY3VyUHVuYyA9IGNoOwogICAgICAgIHJldHVybiAicHVuY3R1YXRpb24iOwogICAgICB9CiAgICAgIGlmIChjaCA9PSAiIyIpewogICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgICByZXR1cm4gImF0b20gcHJlcHJvY2Vzc29yIjsKICAgICAgfQogICAgICBpZiAoY2ggPT0gIiUiKXsKICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1xiLyk7CiAgICAgICAgcmV0dXJuICJhdG9tIHR0Y24zTWFjcm9zIjsKICAgICAgfQogICAgICBpZiAoL1xkLy50ZXN0KGNoKSkgewogICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1x3XC5dLyk7CiAgICAgICAgcmV0dXJuICJudW1iZXIiOwogICAgICB9CiAgICAgIGlmIChjaCA9PSAiLyIpIHsKICAgICAgICBpZiAoc3RyZWFtLmVhdCgiKiIpKSB7CiAgICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQ29tbWVudDsKICAgICAgICAgIHJldHVybiB0b2tlbkNvbW1lbnQoc3RyZWFtLCBzdGF0ZSk7CiAgICAgICAgfQogICAgICAgIGlmIChzdHJlYW0uZWF0KCIvIikpIHsKICAgICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgICAgIHJldHVybiAiY29tbWVudCI7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChpc09wZXJhdG9yQ2hhci50ZXN0KGNoKSkgewogICAgICAgIGlmKGNoID09ICJAIil7CiAgICAgICAgICBpZihzdHJlYW0ubWF0Y2goInRyeSIpIHx8IHN0cmVhbS5tYXRjaCgiY2F0Y2giKQogICAgICAgICAgICAgIHx8IHN0cmVhbS5tYXRjaCgibGF6eSIpKXsKICAgICAgICAgICAgcmV0dXJuICJrZXl3b3JkIjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgc3RyZWFtLmVhdFdoaWxlKGlzT3BlcmF0b3JDaGFyKTsKICAgICAgICByZXR1cm4gIm9wZXJhdG9yIjsKICAgICAgfQogICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcd1wkX1x4YTEtXHVmZmZmXS8pOwogICAgICB2YXIgY3VyID0gc3RyZWFtLmN1cnJlbnQoKTsKCiAgICAgIGlmIChrZXl3b3Jkcy5wcm9wZXJ0eUlzRW51bWVyYWJsZShjdXIpKSByZXR1cm4gImtleXdvcmQiOwogICAgICBpZiAoYnVpbHRpbi5wcm9wZXJ0eUlzRW51bWVyYWJsZShjdXIpKSByZXR1cm4gImJ1aWx0aW4iOwoKICAgICAgaWYgKHRpbWVyT3BzLnByb3BlcnR5SXNFbnVtZXJhYmxlKGN1cikpIHJldHVybiAiZGVmIHRpbWVyT3BzIjsKICAgICAgaWYgKGNvbmZpZ09wcy5wcm9wZXJ0eUlzRW51bWVyYWJsZShjdXIpKSByZXR1cm4gImRlZiBjb25maWdPcHMiOwogICAgICBpZiAodmVyZGljdE9wcy5wcm9wZXJ0eUlzRW51bWVyYWJsZShjdXIpKSByZXR1cm4gImRlZiB2ZXJkaWN0T3BzIjsKICAgICAgaWYgKHBvcnRPcHMucHJvcGVydHlJc0VudW1lcmFibGUoY3VyKSkgcmV0dXJuICJkZWYgcG9ydE9wcyI7CiAgICAgIGlmIChzdXRPcHMucHJvcGVydHlJc0VudW1lcmFibGUoY3VyKSkgcmV0dXJuICJkZWYgc3V0T3BzIjsKICAgICAgaWYgKGZ1bmN0aW9uT3BzLnByb3BlcnR5SXNFbnVtZXJhYmxlKGN1cikpIHJldHVybiAiZGVmIGZ1bmN0aW9uT3BzIjsKCiAgICAgIGlmICh2ZXJkaWN0Q29uc3RzLnByb3BlcnR5SXNFbnVtZXJhYmxlKGN1cikpIHJldHVybiAic3RyaW5nIHZlcmRpY3RDb25zdHMiOwogICAgICBpZiAoYm9vbGVhbkNvbnN0cy5wcm9wZXJ0eUlzRW51bWVyYWJsZShjdXIpKSByZXR1cm4gInN0cmluZyBib29sZWFuQ29uc3RzIjsKICAgICAgaWYgKG90aGVyQ29uc3RzLnByb3BlcnR5SXNFbnVtZXJhYmxlKGN1cikpIHJldHVybiAic3RyaW5nIG90aGVyQ29uc3RzIjsKCiAgICAgIGlmICh0eXBlcy5wcm9wZXJ0eUlzRW51bWVyYWJsZShjdXIpKSByZXR1cm4gImJ1aWx0aW4gdHlwZXMiOwogICAgICBpZiAodmlzaWJpbGl0eU1vZGlmaWVycy5wcm9wZXJ0eUlzRW51bWVyYWJsZShjdXIpKQogICAgICAgIHJldHVybiAiYnVpbHRpbiB2aXNpYmlsaXR5TW9kaWZpZXJzIjsKICAgICAgaWYgKHRlbXBsYXRlTWF0Y2gucHJvcGVydHlJc0VudW1lcmFibGUoY3VyKSkgcmV0dXJuICJhdG9tIHRlbXBsYXRlTWF0Y2giOwoKICAgICAgcmV0dXJuICJ2YXJpYWJsZSI7CiAgICB9CgogICAgZnVuY3Rpb24gdG9rZW5TdHJpbmcocXVvdGUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgICB2YXIgZXNjYXBlZCA9IGZhbHNlLCBuZXh0LCBlbmQgPSBmYWxzZTsKICAgICAgICB3aGlsZSAoKG5leHQgPSBzdHJlYW0ubmV4dCgpKSAhPSBudWxsKSB7CiAgICAgICAgICBpZiAobmV4dCA9PSBxdW90ZSAmJiAhZXNjYXBlZCl7CiAgICAgICAgICAgIHZhciBhZnRlclF1b3RlID0gc3RyZWFtLnBlZWsoKTsKICAgICAgICAgICAgLy9sb29rIGlmIHRoZSBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIHF1b3RlIGlzIGxpa2UgdGhlIEIgaW4gJzEwMTAwMDEwJ0IKICAgICAgICAgICAgaWYgKGFmdGVyUXVvdGUpewogICAgICAgICAgICAgIGFmdGVyUXVvdGUgPSBhZnRlclF1b3RlLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgICAgaWYoYWZ0ZXJRdW90ZSA9PSAiYiIgfHwgYWZ0ZXJRdW90ZSA9PSAiaCIgfHwgYWZ0ZXJRdW90ZSA9PSAibyIpCiAgICAgICAgICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVuZCA9IHRydWU7IGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgZXNjYXBlZCA9ICFlc2NhcGVkICYmIG5leHQgPT0gIlxcIjsKICAgICAgICB9CiAgICAgICAgaWYgKGVuZCB8fCAhKGVzY2FwZWQgfHwgbXVsdGlMaW5lU3RyaW5ncykpCiAgICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IG51bGw7CiAgICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHRva2VuQ29tbWVudChzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHZhciBtYXliZUVuZCA9IGZhbHNlLCBjaDsKICAgICAgd2hpbGUgKGNoID0gc3RyZWFtLm5leHQoKSkgewogICAgICAgIGlmIChjaCA9PSAiLyIgJiYgbWF5YmVFbmQpIHsKICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gbnVsbDsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBtYXliZUVuZCA9IChjaCA9PSAiKiIpOwogICAgICB9CiAgICAgIHJldHVybiAiY29tbWVudCI7CiAgICB9CgogICAgZnVuY3Rpb24gQ29udGV4dChpbmRlbnRlZCwgY29sdW1uLCB0eXBlLCBhbGlnbiwgcHJldikgewogICAgICB0aGlzLmluZGVudGVkID0gaW5kZW50ZWQ7CiAgICAgIHRoaXMuY29sdW1uID0gY29sdW1uOwogICAgICB0aGlzLnR5cGUgPSB0eXBlOwogICAgICB0aGlzLmFsaWduID0gYWxpZ247CiAgICAgIHRoaXMucHJldiA9IHByZXY7CiAgICB9CgogICAgZnVuY3Rpb24gcHVzaENvbnRleHQoc3RhdGUsIGNvbCwgdHlwZSkgewogICAgICB2YXIgaW5kZW50ID0gc3RhdGUuaW5kZW50ZWQ7CiAgICAgIGlmIChzdGF0ZS5jb250ZXh0ICYmIHN0YXRlLmNvbnRleHQudHlwZSA9PSAic3RhdGVtZW50IikKICAgICAgICBpbmRlbnQgPSBzdGF0ZS5jb250ZXh0LmluZGVudGVkOwogICAgICByZXR1cm4gc3RhdGUuY29udGV4dCA9IG5ldyBDb250ZXh0KGluZGVudCwgY29sLCB0eXBlLCBudWxsLCBzdGF0ZS5jb250ZXh0KTsKICAgIH0KCiAgICBmdW5jdGlvbiBwb3BDb250ZXh0KHN0YXRlKSB7CiAgICAgIHZhciB0ID0gc3RhdGUuY29udGV4dC50eXBlOwogICAgICBpZiAodCA9PSAiKSIgfHwgdCA9PSAiXSIgfHwgdCA9PSAifSIpCiAgICAgICAgc3RhdGUuaW5kZW50ZWQgPSBzdGF0ZS5jb250ZXh0LmluZGVudGVkOwogICAgICByZXR1cm4gc3RhdGUuY29udGV4dCA9IHN0YXRlLmNvbnRleHQucHJldjsKICAgIH0KCiAgICAvL0ludGVyZmFjZQogICAgcmV0dXJuIHsKICAgICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24oYmFzZWNvbHVtbikgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICB0b2tlbml6ZTogbnVsbCwKICAgICAgICAgIGNvbnRleHQ6IG5ldyBDb250ZXh0KChiYXNlY29sdW1uIHx8IDApIC0gaW5kZW50VW5pdCwgMCwgInRvcCIsIGZhbHNlKSwKICAgICAgICAgIGluZGVudGVkOiAwLAogICAgICAgICAgc3RhcnRPZkxpbmU6IHRydWUKICAgICAgICB9OwogICAgICB9LAoKICAgICAgdG9rZW46IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgICB2YXIgY3R4ID0gc3RhdGUuY29udGV4dDsKICAgICAgICBpZiAoc3RyZWFtLnNvbCgpKSB7CiAgICAgICAgICBpZiAoY3R4LmFsaWduID09IG51bGwpIGN0eC5hbGlnbiA9IGZhbHNlOwogICAgICAgICAgc3RhdGUuaW5kZW50ZWQgPSBzdHJlYW0uaW5kZW50YXRpb24oKTsKICAgICAgICAgIHN0YXRlLnN0YXJ0T2ZMaW5lID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgaWYgKHN0cmVhbS5lYXRTcGFjZSgpKSByZXR1cm4gbnVsbDsKICAgICAgICBjdXJQdW5jID0gbnVsbDsKICAgICAgICB2YXIgc3R5bGUgPSAoc3RhdGUudG9rZW5pemUgfHwgdG9rZW5CYXNlKShzdHJlYW0sIHN0YXRlKTsKICAgICAgICBpZiAoc3R5bGUgPT0gImNvbW1lbnQiKSByZXR1cm4gc3R5bGU7CiAgICAgICAgaWYgKGN0eC5hbGlnbiA9PSBudWxsKSBjdHguYWxpZ24gPSB0cnVlOwoKICAgICAgICBpZiAoKGN1clB1bmMgPT0gIjsiIHx8IGN1clB1bmMgPT0gIjoiIHx8IGN1clB1bmMgPT0gIiwiKQogICAgICAgICAgICAmJiBjdHgudHlwZSA9PSAic3RhdGVtZW50Iil7CiAgICAgICAgICBwb3BDb250ZXh0KHN0YXRlKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoY3VyUHVuYyA9PSAieyIpIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0uY29sdW1uKCksICJ9Iik7CiAgICAgICAgZWxzZSBpZiAoY3VyUHVuYyA9PSAiWyIpIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0uY29sdW1uKCksICJdIik7CiAgICAgICAgZWxzZSBpZiAoY3VyUHVuYyA9PSAiKCIpIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0uY29sdW1uKCksICIpIik7CiAgICAgICAgZWxzZSBpZiAoY3VyUHVuYyA9PSAifSIpIHsKICAgICAgICAgIHdoaWxlIChjdHgudHlwZSA9PSAic3RhdGVtZW50IikgY3R4ID0gcG9wQ29udGV4dChzdGF0ZSk7CiAgICAgICAgICBpZiAoY3R4LnR5cGUgPT0gIn0iKSBjdHggPSBwb3BDb250ZXh0KHN0YXRlKTsKICAgICAgICAgIHdoaWxlIChjdHgudHlwZSA9PSAic3RhdGVtZW50IikgY3R4ID0gcG9wQ29udGV4dChzdGF0ZSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGN1clB1bmMgPT0gY3R4LnR5cGUpIHBvcENvbnRleHQoc3RhdGUpOwogICAgICAgIGVsc2UgaWYgKGluZGVudFN0YXRlbWVudHMgJiYKICAgICAgICAgICAgKCgoY3R4LnR5cGUgPT0gIn0iIHx8IGN0eC50eXBlID09ICJ0b3AiKSAmJiBjdXJQdW5jICE9ICc7JykgfHwKICAgICAgICAgICAgKGN0eC50eXBlID09ICJzdGF0ZW1lbnQiICYmIGN1clB1bmMgPT0gIm5ld3N0YXRlbWVudCIpKSkKICAgICAgICAgIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0uY29sdW1uKCksICJzdGF0ZW1lbnQiKTsKCiAgICAgICAgc3RhdGUuc3RhcnRPZkxpbmUgPSBmYWxzZTsKCiAgICAgICAgcmV0dXJuIHN0eWxlOwogICAgICB9LAoKICAgICAgZWxlY3RyaWNDaGFyczogInt9IiwKICAgICAgYmxvY2tDb21tZW50U3RhcnQ6ICIvKiIsCiAgICAgIGJsb2NrQ29tbWVudEVuZDogIiovIiwKICAgICAgbGluZUNvbW1lbnQ6ICIvLyIsCiAgICAgIGZvbGQ6ICJicmFjZSIKICAgIH07CiAgfSk7CgogIGZ1bmN0aW9uIHdvcmRzKHN0cikgewogICAgdmFyIG9iaiA9IHt9LCB3b3JkcyA9IHN0ci5zcGxpdCgiICIpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB3b3Jkcy5sZW5ndGg7ICsraSkgb2JqW3dvcmRzW2ldXSA9IHRydWU7CiAgICByZXR1cm4gb2JqOwogIH0KCiAgZnVuY3Rpb24gZGVmKG1pbWVzLCBtb2RlKSB7CiAgICBpZiAodHlwZW9mIG1pbWVzID09ICJzdHJpbmciKSBtaW1lcyA9IFttaW1lc107CiAgICB2YXIgd29yZHMgPSBbXTsKICAgIGZ1bmN0aW9uIGFkZChvYmopIHsKICAgICAgaWYgKG9iaikgZm9yICh2YXIgcHJvcCBpbiBvYmopIGlmIChvYmouaGFzT3duUHJvcGVydHkocHJvcCkpCiAgICAgICAgd29yZHMucHVzaChwcm9wKTsKICAgIH0KCiAgICBhZGQobW9kZS5rZXl3b3Jkcyk7CiAgICBhZGQobW9kZS5idWlsdGluKTsKICAgIGFkZChtb2RlLnRpbWVyT3BzKTsKICAgIGFkZChtb2RlLnBvcnRPcHMpOwoKICAgIGlmICh3b3Jkcy5sZW5ndGgpIHsKICAgICAgbW9kZS5oZWxwZXJUeXBlID0gbWltZXNbMF07CiAgICAgIENvZGVNaXJyb3IucmVnaXN0ZXJIZWxwZXIoImhpbnRXb3JkcyIsIG1pbWVzWzBdLCB3b3Jkcyk7CiAgICB9CgogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtaW1lcy5sZW5ndGg7ICsraSkKICAgICAgQ29kZU1pcnJvci5kZWZpbmVNSU1FKG1pbWVzW2ldLCBtb2RlKTsKICB9CgogIGRlZihbInRleHQveC10dGNuIiwgInRleHQveC10dGNuMyIsICJ0ZXh0L3gtdHRjbnBwIl0sIHsKICAgIG5hbWU6ICJ0dGNuIiwKICAgIGtleXdvcmRzOiB3b3JkcygiYWN0aXZhdGUgYWRkcmVzcyBhbGl2ZSBhbGwgYWx0IGFsdHN0ZXAgYW5kIGFuZDRiIGFueSIgKwogICAgIiBicmVhayBjYXNlIGNvbXBvbmVudCBjb25zdCBjb250aW51ZSBjb250cm9sIGRlYWN0aXZhdGUiICsKICAgICIgZGlzcGxheSBkbyBlbHNlIGVuY29kZSBlbnVtZXJhdGVkIGV4Y2VwdCBleGNlcHRpb24iICsKICAgICIgZXhlY3V0ZSBleHRlbmRzIGV4dGVuc2lvbiBleHRlcm5hbCBmb3IgZnJvbSBmdW5jdGlvbiIgKwogICAgIiBnb3RvIGdyb3VwIGlmIGltcG9ydCBpbiBpbmZpbml0eSBpbm91dCBpbnRlcmxlYXZlIiArCiAgICAiIGxhYmVsIGxhbmd1YWdlIGxlbmd0aCBsb2cgbWF0Y2ggbWVzc2FnZSBtaXhlZCBtb2QiICsKICAgICIgbW9kaWZpZXMgbW9kdWxlIG1vZHVsZXBhciBtdGMgbm9ibG9jayBub3Qgbm90NGIgbm93YWl0IiArCiAgICAiIG9mIG9uIG9wdGlvbmFsIG9yIG9yNGIgb3V0IG92ZXJyaWRlIHBhcmFtIHBhdHRlcm4gcG9ydCIgKwogICAgIiBwcm9jZWR1cmUgcmVjb3JkIHJlY3Vyc2l2ZSByZW0gcmVwZWF0IHJldHVybiBydW5zIHNlbGVjdCIgKwogICAgIiBzZWxmIHNlbmRlciBzZXQgc2lnbmF0dXJlIHN5c3RlbSB0ZW1wbGF0ZSB0ZXN0Y2FzZSB0byIgKwogICAgIiB0eXBlIHVuaW9uIHZhbHVlIHZhbHVlb2YgdmFyIHZhcmlhbnQgd2hpbGUgd2l0aCB4b3IgeG9yNGIiKSwKICAgIGJ1aWx0aW46IHdvcmRzKCJiaXQyaGV4IGJpdDJpbnQgYml0Mm9jdCBiaXQyc3RyIGNoYXIyaW50IGNoYXIyb2N0IGVuY3ZhbHVlIiArCiAgICAiIGRlY29tcCBkZWN2YWx1ZSBmbG9hdDJpbnQgZmxvYXQyc3RyIGhleDJiaXQgaGV4MmludCIgKwogICAgIiBoZXgyb2N0IGhleDJzdHIgaW50MmJpdCBpbnQyY2hhciBpbnQyZmxvYXQgaW50MmhleCIgKwogICAgIiBpbnQyb2N0IGludDJzdHIgaW50MnVuaWNoYXIgaXNib3VuZCBpc2Nob3NlbiBpc3ByZXNlbnQiICsKICAgICIgaXN2YWx1ZSBsZW5ndGhvZiBsb2cyc3RyIG9jdDJiaXQgb2N0MmNoYXIgb2N0MmhleCBvY3QyaW50IiArCiAgICAiIG9jdDJzdHIgcmVnZXhwIHJlcGxhY2Ugcm5kIHNpemVvZiBzdHIyYml0IHN0cjJmbG9hdCIgKwogICAgIiBzdHIyaGV4IHN0cjJpbnQgc3RyMm9jdCBzdWJzdHIgdW5pY2hhcjJpbnQgdW5pY2hhcjJjaGFyIiArCiAgICAiIGVudW0yaW50IiksCiAgICB0eXBlczogd29yZHMoImFueXR5cGUgYml0c3RyaW5nIGJvb2xlYW4gY2hhciBjaGFyc3RyaW5nIGRlZmF1bHQgZmxvYXQiICsKICAgICIgaGV4c3RyaW5nIGludGVnZXIgb2JqaWQgb2N0ZXRzdHJpbmcgdW5pdmVyc2FsIHZlcmRpY3R0eXBlIHRpbWVyIiksCiAgICB0aW1lck9wczogd29yZHMoInJlYWQgcnVubmluZyBzdGFydCBzdG9wIHRpbWVvdXQiKSwKICAgIHBvcnRPcHM6IHdvcmRzKCJjYWxsIGNhdGNoIGNoZWNrIGNsZWFyIGdldGNhbGwgZ2V0cmVwbHkgaGFsdCByYWlzZSByZWNlaXZlIiArCiAgICAiIHJlcGx5IHNlbmQgdHJpZ2dlciIpLAogICAgY29uZmlnT3BzOiB3b3JkcygiY3JlYXRlIGNvbm5lY3QgZGlzY29ubmVjdCBkb25lIGtpbGwga2lsbGVkIG1hcCB1bm1hcCIpLAogICAgdmVyZGljdE9wczogd29yZHMoImdldHZlcmRpY3Qgc2V0dmVyZGljdCIpLAogICAgc3V0T3BzOiB3b3JkcygiYWN0aW9uIiksCiAgICBmdW5jdGlvbk9wczogd29yZHMoImFwcGx5IGRlcmVmZXJzIHJlZmVycyIpLAoKICAgIHZlcmRpY3RDb25zdHM6IHdvcmRzKCJlcnJvciBmYWlsIGluY29uYyBub25lIHBhc3MiKSwKICAgIGJvb2xlYW5Db25zdHM6IHdvcmRzKCJ0cnVlIGZhbHNlIiksCiAgICBvdGhlckNvbnN0czogd29yZHMoIm51bGwgTlVMTCBvbWl0IiksCgogICAgdmlzaWJpbGl0eU1vZGlmaWVyczogd29yZHMoInByaXZhdGUgcHVibGljIGZyaWVuZCIpLAogICAgdGVtcGxhdGVNYXRjaDogd29yZHMoImNvbXBsZW1lbnQgaWZwcmVzZW50IHN1YnNldCBzdXBlcnNldCBwZXJtdXRhdGlvbiIpLAogICAgbXVsdGlMaW5lU3RyaW5nczogdHJ1ZQogIH0pOwp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/turtle/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/turtle/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogVHVydGxlIG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0idHVydGxlLmpzIj48L3NjcmlwdD4KPHN0eWxlPi5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazt9PC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aDE+Q29kZU1pcnJvcjwvaDE+PGltZyBpZD1sb2dvIHNyYz0iLi4vLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+TGFuZ3VhZ2UgbW9kZXM8L2E+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPlR1cnRsZTwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+VHVydGxlIG1vZGU8L2gyPgo8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgpAcHJlZml4IGZvYWY6IDxodHRwOi8veG1sbnMuY29tL2ZvYWYvMC4xLz4gLgpAcHJlZml4IGdlbzogPGh0dHA6Ly93d3cudzMub3JnLzIwMDMvMDEvZ2VvL3dnczg0X3BvcyM+IC4KQHByZWZpeCByZGY6IDxodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjPiAuCgo8aHR0cDovL3B1cmwub3JnL25ldC9ic2xldHRlbj4gCiAgICBhIGZvYWY6UGVyc29uOwogICAgZm9hZjppbnRlcmVzdCA8aHR0cDovL3d3dy53My5vcmcvMjAwMC8wMS9zdy8+OwogICAgZm9hZjpiYXNlZF9uZWFyIFsKICAgICAgICBnZW86bGF0ICIzNC4wNzM2MTExIiA7CiAgICAgICAgZ2VvOmxvbiAiLTExOC4zOTk0NDQ0IgogICBdCgo8L3RleHRhcmVhPjwvZm9ybT4KICAgIDxzY3JpcHQ+CiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICAgICAgbW9kZTogInRleHQvdHVydGxlIiwKICAgICAgICBtYXRjaEJyYWNrZXRzOiB0cnVlCiAgICAgIH0pOwogICAgPC9zY3JpcHQ+CgogICAgPHA+PHN0cm9uZz5NSU1FIHR5cGVzIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPnRleHQvdHVydGxlPC9jb2RlPi48L3A+CgogIDwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/turtle/turtle.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJ0dXJ0bGUiLCBmdW5jdGlvbihjb25maWcpIHsKICB2YXIgaW5kZW50VW5pdCA9IGNvbmZpZy5pbmRlbnRVbml0OwogIHZhciBjdXJQdW5jOwoKICBmdW5jdGlvbiB3b3JkUmVnZXhwKHdvcmRzKSB7CiAgICByZXR1cm4gbmV3IFJlZ0V4cCgiXig/OiIgKyB3b3Jkcy5qb2luKCJ8IikgKyAiKSQiLCAiaSIpOwogIH0KICB2YXIgb3BzID0gd29yZFJlZ2V4cChbXSk7CiAgdmFyIGtleXdvcmRzID0gd29yZFJlZ2V4cChbIkBwcmVmaXgiLCAiQGJhc2UiLCAiYSJdKTsKICB2YXIgb3BlcmF0b3JDaGFycyA9IC9bKitcLTw+PSZ8XS87CgogIGZ1bmN0aW9uIHRva2VuQmFzZShzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpOwogICAgY3VyUHVuYyA9IG51bGw7CiAgICBpZiAoY2ggPT0gIjwiICYmICFzdHJlYW0ubWF0Y2goL15bXHNcdTAwYTA9XS8sIGZhbHNlKSkgewogICAgICBzdHJlYW0ubWF0Y2goL15bXlxzXHUwMGEwPl0qPj8vKTsKICAgICAgcmV0dXJuICJhdG9tIjsKICAgIH0KICAgIGVsc2UgaWYgKGNoID09ICJcIiIgfHwgY2ggPT0gIiciKSB7CiAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5MaXRlcmFsKGNoKTsKICAgICAgcmV0dXJuIHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgfQogICAgZWxzZSBpZiAoL1t7fVwoXCksXC47XFtcXV0vLnRlc3QoY2gpKSB7CiAgICAgIGN1clB1bmMgPSBjaDsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICBlbHNlIGlmIChjaCA9PSAiIyIpIHsKICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICByZXR1cm4gImNvbW1lbnQiOwogICAgfQogICAgZWxzZSBpZiAob3BlcmF0b3JDaGFycy50ZXN0KGNoKSkgewogICAgICBzdHJlYW0uZWF0V2hpbGUob3BlcmF0b3JDaGFycyk7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgZWxzZSBpZiAoY2ggPT0gIjoiKSB7CiAgICAgICAgICByZXR1cm4gIm9wZXJhdG9yIjsKICAgICAgICB9IGVsc2UgewogICAgICBzdHJlYW0uZWF0V2hpbGUoL1tfXHdcZF0vKTsKICAgICAgaWYoc3RyZWFtLnBlZWsoKSA9PSAiOiIpIHsKICAgICAgICByZXR1cm4gInZhcmlhYmxlLTMiOwogICAgICB9IGVsc2UgewogICAgICAgICAgICAgdmFyIHdvcmQgPSBzdHJlYW0uY3VycmVudCgpOwoKICAgICAgICAgICAgIGlmKGtleXdvcmRzLnRlc3Qod29yZCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJtZXRhIjsKICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICBpZihjaCA+PSAiQSIgJiYgY2ggPD0gIloiKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJjb21tZW50IjsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gImtleXdvcmQiOwogICAgICAgICAgICAgICAgIH0KICAgICAgfQogICAgICB2YXIgd29yZCA9IHN0cmVhbS5jdXJyZW50KCk7CiAgICAgIGlmIChvcHMudGVzdCh3b3JkKSkKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgZWxzZSBpZiAoa2V5d29yZHMudGVzdCh3b3JkKSkKICAgICAgICByZXR1cm4gIm1ldGEiOwogICAgICBlbHNlCiAgICAgICAgcmV0dXJuICJ2YXJpYWJsZSI7CiAgICB9CiAgfQoKICBmdW5jdGlvbiB0b2tlbkxpdGVyYWwocXVvdGUpIHsKICAgIHJldHVybiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHZhciBlc2NhcGVkID0gZmFsc2UsIGNoOwogICAgICB3aGlsZSAoKGNoID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkgewogICAgICAgIGlmIChjaCA9PSBxdW90ZSAmJiAhZXNjYXBlZCkgewogICAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgZXNjYXBlZCA9ICFlc2NhcGVkICYmIGNoID09ICJcXCI7CiAgICAgIH0KICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgfTsKICB9CgogIGZ1bmN0aW9uIHB1c2hDb250ZXh0KHN0YXRlLCB0eXBlLCBjb2wpIHsKICAgIHN0YXRlLmNvbnRleHQgPSB7cHJldjogc3RhdGUuY29udGV4dCwgaW5kZW50OiBzdGF0ZS5pbmRlbnQsIGNvbDogY29sLCB0eXBlOiB0eXBlfTsKICB9CiAgZnVuY3Rpb24gcG9wQ29udGV4dChzdGF0ZSkgewogICAgc3RhdGUuaW5kZW50ID0gc3RhdGUuY29udGV4dC5pbmRlbnQ7CiAgICBzdGF0ZS5jb250ZXh0ID0gc3RhdGUuY29udGV4dC5wcmV2OwogIH0KCiAgcmV0dXJuIHsKICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4ge3Rva2VuaXplOiB0b2tlbkJhc2UsCiAgICAgICAgICAgICAgY29udGV4dDogbnVsbCwKICAgICAgICAgICAgICBpbmRlbnQ6IDAsCiAgICAgICAgICAgICAgY29sOiAwfTsKICAgIH0sCgogICAgdG9rZW46IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgaWYgKHN0cmVhbS5zb2woKSkgewogICAgICAgIGlmIChzdGF0ZS5jb250ZXh0ICYmIHN0YXRlLmNvbnRleHQuYWxpZ24gPT0gbnVsbCkgc3RhdGUuY29udGV4dC5hbGlnbiA9IGZhbHNlOwogICAgICAgIHN0YXRlLmluZGVudCA9IHN0cmVhbS5pbmRlbnRhdGlvbigpOwogICAgICB9CiAgICAgIGlmIChzdHJlYW0uZWF0U3BhY2UoKSkgcmV0dXJuIG51bGw7CiAgICAgIHZhciBzdHlsZSA9IHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwoKICAgICAgaWYgKHN0eWxlICE9ICJjb21tZW50IiAmJiBzdGF0ZS5jb250ZXh0ICYmIHN0YXRlLmNvbnRleHQuYWxpZ24gPT0gbnVsbCAmJiBzdGF0ZS5jb250ZXh0LnR5cGUgIT0gInBhdHRlcm4iKSB7CiAgICAgICAgc3RhdGUuY29udGV4dC5hbGlnbiA9IHRydWU7CiAgICAgIH0KCiAgICAgIGlmIChjdXJQdW5jID09ICIoIikgcHVzaENvbnRleHQoc3RhdGUsICIpIiwgc3RyZWFtLmNvbHVtbigpKTsKICAgICAgZWxzZSBpZiAoY3VyUHVuYyA9PSAiWyIpIHB1c2hDb250ZXh0KHN0YXRlLCAiXSIsIHN0cmVhbS5jb2x1bW4oKSk7CiAgICAgIGVsc2UgaWYgKGN1clB1bmMgPT0gInsiKSBwdXNoQ29udGV4dChzdGF0ZSwgIn0iLCBzdHJlYW0uY29sdW1uKCkpOwogICAgICBlbHNlIGlmICgvW1xdXH1cKV0vLnRlc3QoY3VyUHVuYykpIHsKICAgICAgICB3aGlsZSAoc3RhdGUuY29udGV4dCAmJiBzdGF0ZS5jb250ZXh0LnR5cGUgPT0gInBhdHRlcm4iKSBwb3BDb250ZXh0KHN0YXRlKTsKICAgICAgICBpZiAoc3RhdGUuY29udGV4dCAmJiBjdXJQdW5jID09IHN0YXRlLmNvbnRleHQudHlwZSkgcG9wQ29udGV4dChzdGF0ZSk7CiAgICAgIH0KICAgICAgZWxzZSBpZiAoY3VyUHVuYyA9PSAiLiIgJiYgc3RhdGUuY29udGV4dCAmJiBzdGF0ZS5jb250ZXh0LnR5cGUgPT0gInBhdHRlcm4iKSBwb3BDb250ZXh0KHN0YXRlKTsKICAgICAgZWxzZSBpZiAoL2F0b218c3RyaW5nfHZhcmlhYmxlLy50ZXN0KHN0eWxlKSAmJiBzdGF0ZS5jb250ZXh0KSB7CiAgICAgICAgaWYgKC9bXH1cXV0vLnRlc3Qoc3RhdGUuY29udGV4dC50eXBlKSkKICAgICAgICAgIHB1c2hDb250ZXh0KHN0YXRlLCAicGF0dGVybiIsIHN0cmVhbS5jb2x1bW4oKSk7CiAgICAgICAgZWxzZSBpZiAoc3RhdGUuY29udGV4dC50eXBlID09ICJwYXR0ZXJuIiAmJiAhc3RhdGUuY29udGV4dC5hbGlnbikgewogICAgICAgICAgc3RhdGUuY29udGV4dC5hbGlnbiA9IHRydWU7CiAgICAgICAgICBzdGF0ZS5jb250ZXh0LmNvbCA9IHN0cmVhbS5jb2x1bW4oKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiBzdHlsZTsKICAgIH0sCgogICAgaW5kZW50OiBmdW5jdGlvbihzdGF0ZSwgdGV4dEFmdGVyKSB7CiAgICAgIHZhciBmaXJzdENoYXIgPSB0ZXh0QWZ0ZXIgJiYgdGV4dEFmdGVyLmNoYXJBdCgwKTsKICAgICAgdmFyIGNvbnRleHQgPSBzdGF0ZS5jb250ZXh0OwogICAgICBpZiAoL1tcXVx9XS8udGVzdChmaXJzdENoYXIpKQogICAgICAgIHdoaWxlIChjb250ZXh0ICYmIGNvbnRleHQudHlwZSA9PSAicGF0dGVybiIpIGNvbnRleHQgPSBjb250ZXh0LnByZXY7CgogICAgICB2YXIgY2xvc2luZyA9IGNvbnRleHQgJiYgZmlyc3RDaGFyID09IGNvbnRleHQudHlwZTsKICAgICAgaWYgKCFjb250ZXh0KQogICAgICAgIHJldHVybiAwOwogICAgICBlbHNlIGlmIChjb250ZXh0LnR5cGUgPT0gInBhdHRlcm4iKQogICAgICAgIHJldHVybiBjb250ZXh0LmNvbDsKICAgICAgZWxzZSBpZiAoY29udGV4dC5hbGlnbikKICAgICAgICByZXR1cm4gY29udGV4dC5jb2wgKyAoY2xvc2luZyA/IDAgOiAxKTsKICAgICAgZWxzZQogICAgICAgIHJldHVybiBjb250ZXh0LmluZGVudCArIChjbG9zaW5nID8gMCA6IGluZGVudFVuaXQpOwogICAgfSwKCiAgICBsaW5lQ29tbWVudDogIiMiCiAgfTsKfSk7CgpDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQvdHVydGxlIiwgInR1cnRsZSIpOwoKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/twig/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/twig/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogVHdpZyBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9InR3aWcuanMiPjwvc2NyaXB0Pgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPi5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazt9PC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aDE+Q29kZU1pcnJvcjwvaDE+PGltZyBpZD1sb2dvIHNyYz0iLi4vLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+TGFuZ3VhZ2UgbW9kZXM8L2E+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPlR3aWc8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPlR3aWcgbW9kZTwvaDI+Cjxmb3JtPjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+CnslIGV4dGVuZHMgImxheW91dC50d2lnIiAlfQp7JSBibG9jayB0aXRsZSAlfUNvZGVNaXJyb3I6IFR3aWcgbW9kZXslIGVuZGJsb2NrICV9CnsjIHRoaXMgaXMgYSBjb21tZW50ICN9CnslIGJsb2NrIGNvbnRlbnQgJX0KICB7JSBmb3IgZm9vIGluIGJhciBpZiBmb28uYmF6IGlzIGRpdmlzaWJsZSBieSgzKSAlfQogICAgSGVsbG8ge3sgZm9vLndvcmxkIH19CiAgeyUgZWxzZSAlfQogICAgeyUgc2V0IG1zZyA9ICJSZXN1bHQgbm90IGZvdW5kIiAlfQogICAgeyUgaW5jbHVkZSAiZW1wdHkudHdpZyIgd2l0aCB7IG1lc3NhZ2U6IG1zZyB9ICV9CiAgeyUgZW5kZm9yICV9CnslIGVuZGJsb2NrICV9CjwvdGV4dGFyZWE+PC9mb3JtPgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9CiAgICAgIENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHttb2RlOgogICAgICAgIHtuYW1lOiAidHdpZyIsIGh0bWxNb2RlOiB0cnVlfX0pOwogICAgPC9zY3JpcHQ+CiAgPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/twig/twig.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSwgIHJlcXVpcmUoIi4uLy4uL2FkZG9uL21vZGUvbXVsdGlwbGV4IikpOwogIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kKSAvLyBBTUQKICAgIGRlZmluZShbIi4uLy4uL2xpYi9jb2RlbWlycm9yIiwgIi4uLy4uL2FkZG9uL21vZGUvbXVsdGlwbGV4Il0sIG1vZCk7CiAgZWxzZSAvLyBQbGFpbiBicm93c2VyIGVudgogICAgbW9kKENvZGVNaXJyb3IpOwp9KShmdW5jdGlvbihDb2RlTWlycm9yKSB7CiAgInVzZSBzdHJpY3QiOwoKICBDb2RlTWlycm9yLmRlZmluZU1vZGUoInR3aWc6aW5uZXIiLCBmdW5jdGlvbigpIHsKICAgIHZhciBrZXl3b3JkcyA9IFsiYW5kIiwgImFzIiwgImF1dG9lc2NhcGUiLCAiZW5kYXV0b2VzY2FwZSIsICJibG9jayIsICJkbyIsICJlbmRibG9jayIsICJlbHNlIiwgImVsc2VpZiIsICJleHRlbmRzIiwgImZvciIsICJlbmRmb3IiLCAiZW1iZWQiLCAiZW5kZW1iZWQiLCAiZmlsdGVyIiwgImVuZGZpbHRlciIsICJmbHVzaCIsICJmcm9tIiwgImlmIiwgImVuZGlmIiwgImluIiwgImlzIiwgImluY2x1ZGUiLCAiaW1wb3J0IiwgIm5vdCIsICJvciIsICJzZXQiLCAic3BhY2VsZXNzIiwgImVuZHNwYWNlbGVzcyIsICJ3aXRoIiwgImVuZHdpdGgiLCAidHJhbnMiLCAiZW5kdHJhbnMiLCAiYmxvY2t0cmFucyIsICJlbmRibG9ja3RyYW5zIiwgIm1hY3JvIiwgImVuZG1hY3JvIiwgInVzZSIsICJ2ZXJiYXRpbSIsICJlbmR2ZXJiYXRpbSJdLAogICAgICAgIG9wZXJhdG9yID0gL15bK1wtKiYlPTw+IT98fl5dLywKICAgICAgICBzaWduID0gL15bOlxbXChce10vLAogICAgICAgIGF0b20gPSBbInRydWUiLCAiZmFsc2UiLCAibnVsbCIsICJlbXB0eSIsICJkZWZpbmVkIiwgImRpdmlzaWJsZWJ5IiwgImRpdmlzaWJsZSBieSIsICJldmVuIiwgIm9kZCIsICJpdGVyYWJsZSIsICJzYW1lYXMiLCAic2FtZSBhcyJdLAogICAgICAgIG51bWJlciA9IC9eKFxkWytcLVwqXC9dKT9cZCsoXC5cZCspPy87CgogICAga2V5d29yZHMgPSBuZXcgUmVnRXhwKCIoKCIgKyBrZXl3b3Jkcy5qb2luKCIpfCgiKSArICIpKVxcYiIpOwogICAgYXRvbSA9IG5ldyBSZWdFeHAoIigoIiArIGF0b20uam9pbigiKXwoIikgKyAiKSlcXGIiKTsKCiAgICBmdW5jdGlvbiB0b2tlbkJhc2UgKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgdmFyIGNoID0gc3RyZWFtLnBlZWsoKTsKCiAgICAgIC8vQ29tbWVudAogICAgICBpZiAoc3RhdGUuaW5jb21tZW50KSB7CiAgICAgICAgaWYgKCFzdHJlYW0uc2tpcFRvKCIjfSIpKSB7CiAgICAgICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvXCN8fS8pOwogICAgICAgICAgc3RhdGUuaW5jb21tZW50ID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHJldHVybiAiY29tbWVudCI7CiAgICAgIC8vVGFnCiAgICAgIH0gZWxzZSBpZiAoc3RhdGUuaW50YWcpIHsKICAgICAgICAvL0FmdGVyIG9wZXJhdG9yCiAgICAgICAgaWYgKHN0YXRlLm9wZXJhdG9yKSB7CiAgICAgICAgICBzdGF0ZS5vcGVyYXRvciA9IGZhbHNlOwogICAgICAgICAgaWYgKHN0cmVhbS5tYXRjaChhdG9tKSkgewogICAgICAgICAgICByZXR1cm4gImF0b20iOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHN0cmVhbS5tYXRjaChudW1iZXIpKSB7CiAgICAgICAgICAgIHJldHVybiAibnVtYmVyIjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy9BZnRlciBzaWduCiAgICAgICAgaWYgKHN0YXRlLnNpZ24pIHsKICAgICAgICAgIHN0YXRlLnNpZ24gPSBmYWxzZTsKICAgICAgICAgIGlmIChzdHJlYW0ubWF0Y2goYXRvbSkpIHsKICAgICAgICAgICAgcmV0dXJuICJhdG9tIjsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChzdHJlYW0ubWF0Y2gobnVtYmVyKSkgewogICAgICAgICAgICByZXR1cm4gIm51bWJlciI7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoc3RhdGUuaW5zdHJpbmcpIHsKICAgICAgICAgIGlmIChjaCA9PSBzdGF0ZS5pbnN0cmluZykgewogICAgICAgICAgICBzdGF0ZS5pbnN0cmluZyA9IGZhbHNlOwogICAgICAgICAgfQogICAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgICAgIHJldHVybiAic3RyaW5nIjsKICAgICAgICB9IGVsc2UgaWYgKGNoID09ICInIiB8fCBjaCA9PSAnIicpIHsKICAgICAgICAgIHN0YXRlLmluc3RyaW5nID0gY2g7CiAgICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLm1hdGNoKHN0YXRlLmludGFnICsgIn0iKSB8fCBzdHJlYW0uZWF0KCItIikgJiYgc3RyZWFtLm1hdGNoKHN0YXRlLmludGFnICsgIn0iKSkgewogICAgICAgICAgc3RhdGUuaW50YWcgPSBmYWxzZTsKICAgICAgICAgIHJldHVybiAidGFnIjsKICAgICAgICB9IGVsc2UgaWYgKHN0cmVhbS5tYXRjaChvcGVyYXRvcikpIHsKICAgICAgICAgIHN0YXRlLm9wZXJhdG9yID0gdHJ1ZTsKICAgICAgICAgIHJldHVybiAib3BlcmF0b3IiOwogICAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLm1hdGNoKHNpZ24pKSB7CiAgICAgICAgICBzdGF0ZS5zaWduID0gdHJ1ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKHN0cmVhbS5lYXQoIiAiKSB8fCBzdHJlYW0uc29sKCkpIHsKICAgICAgICAgICAgaWYgKHN0cmVhbS5tYXRjaChrZXl3b3JkcykpIHsKICAgICAgICAgICAgICByZXR1cm4gImtleXdvcmQiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChzdHJlYW0ubWF0Y2goYXRvbSkpIHsKICAgICAgICAgICAgICByZXR1cm4gImF0b20iOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChzdHJlYW0ubWF0Y2gobnVtYmVyKSkgewogICAgICAgICAgICAgIHJldHVybiAibnVtYmVyIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoc3RyZWFtLnNvbCgpKSB7CiAgICAgICAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgICAgIH0KCiAgICAgICAgfQogICAgICAgIHJldHVybiAidmFyaWFibGUiOwogICAgICB9IGVsc2UgaWYgKHN0cmVhbS5lYXQoInsiKSkgewogICAgICAgIGlmIChjaCA9IHN0cmVhbS5lYXQoIiMiKSkgewogICAgICAgICAgc3RhdGUuaW5jb21tZW50ID0gdHJ1ZTsKICAgICAgICAgIGlmICghc3RyZWFtLnNraXBUbygiI30iKSkgewogICAgICAgICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1wjfH0vKTsKICAgICAgICAgICAgc3RhdGUuaW5jb21tZW50ID0gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gImNvbW1lbnQiOwogICAgICAgIC8vT3BlbiB0YWcKICAgICAgICB9IGVsc2UgaWYgKGNoID0gc3RyZWFtLmVhdCgvXHt8JS8pKSB7CiAgICAgICAgICAvL0NhY2hlIGNsb3NlIHRhZwogICAgICAgICAgc3RhdGUuaW50YWcgPSBjaDsKICAgICAgICAgIGlmIChjaCA9PSAieyIpIHsKICAgICAgICAgICAgc3RhdGUuaW50YWcgPSAifSI7CiAgICAgICAgICB9CiAgICAgICAgICBzdHJlYW0uZWF0KCItIik7CiAgICAgICAgICByZXR1cm4gInRhZyI7CiAgICAgICAgfQogICAgICB9CiAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICB9OwoKICAgIHJldHVybiB7CiAgICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uICgpIHsKICAgICAgICByZXR1cm4ge307CiAgICAgIH0sCiAgICAgIHRva2VuOiBmdW5jdGlvbiAoc3RyZWFtLCBzdGF0ZSkgewogICAgICAgIHJldHVybiB0b2tlbkJhc2Uoc3RyZWFtLCBzdGF0ZSk7CiAgICAgIH0KICAgIH07CiAgfSk7CgogIENvZGVNaXJyb3IuZGVmaW5lTW9kZSgidHdpZyIsIGZ1bmN0aW9uKGNvbmZpZywgcGFyc2VyQ29uZmlnKSB7CiAgICB2YXIgdHdpZ0lubmVyID0gQ29kZU1pcnJvci5nZXRNb2RlKGNvbmZpZywgInR3aWc6aW5uZXIiKTsKICAgIGlmICghcGFyc2VyQ29uZmlnIHx8ICFwYXJzZXJDb25maWcuYmFzZSkgcmV0dXJuIHR3aWdJbm5lcjsKICAgIHJldHVybiBDb2RlTWlycm9yLm11bHRpcGxleGluZ01vZGUoCiAgICAgIENvZGVNaXJyb3IuZ2V0TW9kZShjb25maWcsIHBhcnNlckNvbmZpZy5iYXNlKSwgewogICAgICAgIG9wZW46IC9ce1t7IyVdLywgY2xvc2U6IC9bfSMlXVx9LywgbW9kZTogdHdpZ0lubmVyLCBwYXJzZURlbGltaXRlcnM6IHRydWUKICAgICAgfQogICAgKTsKICB9KTsKICBDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveC10d2lnIiwgInR3aWciKTsKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/vb/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/vb/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogVkIuTkVUIG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8bGluayBocmVmPSJodHRwOi8vZm9udHMuZ29vZ2xlYXBpcy5jb20vY3NzP2ZhbWlseT1JbmNvbnNvbGF0YSIgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyI+CjxzY3JpcHQgc3JjPSIuLi8uLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJ2Yi5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9Ii4uLy4uL2FkZG9uL3J1bm1vZGUvcnVubW9kZS5qcyI+PC9zY3JpcHQ+CjxzdHlsZT4KICAgICAgLkNvZGVNaXJyb3Ige2JvcmRlcjogMXB4IHNvbGlkICNhYWE7IGhlaWdodDoyMTBweDsgaGVpZ2h0OiBhdXRvO30KICAgICAgLkNvZGVNaXJyb3Itc2Nyb2xsIHsgb3ZlcmZsb3cteDogYXV0bzsgb3ZlcmZsb3cteTogaGlkZGVuO30KICAgICAgLkNvZGVNaXJyb3IgcHJlIHsgZm9udC1mYW1pbHk6IEluY29uc29sYXRhOyBmb250LXNpemU6IDE0cHh9CiAgICA8L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxoMT5Db2RlTWlycm9yPC9oMT48aW1nIGlkPWxvZ28gc3JjPSIuLi8uLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5MYW5ndWFnZSBtb2RlczwvYT4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+VkIuTkVUPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5WQi5ORVQgbW9kZTwvaDI+Cgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+CmZ1bmN0aW9uIHRlc3QoZ29sZGVuLCB0ZXh0KSB7CiAgdmFyIG9rID0gdHJ1ZTsKICB2YXIgaSA9IDA7CiAgZnVuY3Rpb24gY2FsbGJhY2sodG9rZW4sIHN0eWxlLCBsaW5lTm8sIHBvcyl7CgkJLy9jb25zb2xlLmxvZyhTdHJpbmcodG9rZW4pICsgIiAiICsgU3RyaW5nKHN0eWxlKSArICIgIiArIFN0cmluZyhsaW5lTm8pICsgIiAiICsgU3RyaW5nKHBvcykpOwogICAgdmFyIHJlc3VsdCA9IFtTdHJpbmcodG9rZW4pLCBTdHJpbmcoc3R5bGUpXTsKICAgIGlmIChnb2xkZW5baV1bMF0gIT0gcmVzdWx0WzBdIHx8IGdvbGRlbltpXVsxXSAhPSByZXN1bHRbMV0pewogICAgICByZXR1cm4gIkVycm9yLCBleHBlY3RlZDogIiArIFN0cmluZyhnb2xkZW5baV0pICsgIiwgZ290OiAiICsgU3RyaW5nKHJlc3VsdCk7CiAgICAgIG9rID0gZmFsc2U7CiAgICB9CiAgICBpKys7CiAgfQogIENvZGVNaXJyb3IucnVuTW9kZSh0ZXh0LCAidGV4dC94LXZiIixjYWxsYmFjayk7IAoKICBpZiAob2spIHJldHVybiAiVGVzdHMgT0siOwp9CmZ1bmN0aW9uIHRlc3RUeXBlcygpIHsKICB2YXIgZ29sZGVuID0gW1snSW50ZWdlcicsJ2tleXdvcmQnXSxbJyAnLCdudWxsJ10sWydGbG9hdCcsJ2tleXdvcmQnXV0KICB2YXIgdGV4dCA9ICAiSW50ZWdlciBGbG9hdCI7CiAgcmV0dXJuIHRlc3QoZ29sZGVuLHRleHQpOwp9CmZ1bmN0aW9uIHRlc3RJZigpewogIHZhciBnb2xkZW4gPSBbWydJZicsJ2tleXdvcmQnXSxbJyAnLCdudWxsJ10sWydUcnVlJywna2V5d29yZCddLFsnICcsJ251bGwnXSxbJ0VuZCcsJ2tleXdvcmQnXSxbJyAnLCdudWxsJ10sWydJZicsJ2tleXdvcmQnXV07CiAgdmFyIHRleHQgPSAnSWYgVHJ1ZSBFbmQgSWYnOwogIHJldHVybiB0ZXN0KGdvbGRlbiwgdGV4dCk7Cn0KZnVuY3Rpb24gdGVzdERlY2woKXsKICAgdmFyIGdvbGRlbiA9IFtbJ0RpbScsJ2tleXdvcmQnXSxbJyAnLCdudWxsJ10sWyd4JywndmFyaWFibGUnXSxbJyAnLCdudWxsJ10sWydhcycsJ2tleXdvcmQnXSxbJyAnLCdudWxsJ10sWydJbnRlZ2VyJywna2V5d29yZCddXTsKICAgdmFyIHRleHQgPSAnRGltIHggYXMgSW50ZWdlcic7CiAgIHJldHVybiB0ZXN0KGdvbGRlbiwgdGV4dCk7Cn0KZnVuY3Rpb24gdGVzdEFsbCgpewogIHZhciByZXN1bHQgPSAiIjsKCiAgcmVzdWx0ICs9IHRlc3RUeXBlcygpICsgIlxuIjsKICByZXN1bHQgKz0gdGVzdElmKCkgKyAiXG4iOwogIHJlc3VsdCArPSB0ZXN0RGVjbCgpICsgIlxuIjsKICByZXR1cm4gcmVzdWx0OwoKfQpmdW5jdGlvbiBpbml0VGV4dChlZGl0b3IpIHsKICB2YXIgY29udGVudCA9ICdDbGFzcyByb2NrZXRcblByaXZhdGUgcXVhbGl0eSBhcyBEb3VibGVcblB1YmxpYyBTdWIgbGF1bmNoKCkgYXMgU3RyaW5nXG5pZiBxdWFsaXR5ID4gMC44XG5sYXVuY2ggPSAiU3VjY2Vzc2Z1bCJcbkVsc2VcbmxhdW5jaCA9ICJGYWlsZWQiXG5FbmQgSWZcbkVuZCBzdWJcbkVuZCBjbGFzc1xuJzsKICBlZGl0b3Iuc2V0VmFsdWUoY29udGVudCk7CiAgZm9yICh2YXIgaSA9MDsgaTwgZWRpdG9yLmxpbmVDb3VudCgpOyBpKyspIGVkaXRvci5pbmRlbnRMaW5lKGkpOwp9CmZ1bmN0aW9uIGluaXQoKSB7CiAgICBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgic29sdXRpb24iKSwgewogICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgICAgIG1vZGU6ICJ0ZXh0L3gtdmIiLAogICAgICAgIHJlYWRPbmx5OiBmYWxzZQogICAgfSk7CiAgICBydW5UZXN0KCk7Cn0KZnVuY3Rpb24gcnVuVGVzdCgpIHsKCWRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCd0ZXN0cmVzdWx0JykuaW5uZXJIVE1MID0gdGVzdEFsbCgpOwogIGluaXRUZXh0KGVkaXRvcik7CgkKfQpkb2N1bWVudC5ib2R5Lm9ubG9hZCA9IGluaXQ7Cjwvc2NyaXB0PgoKICA8ZGl2IGlkPSJlZGl0Ij4KICA8dGV4dGFyZWEgc3R5bGU9IndpZHRoOjk1JTtoZWlnaHQ6MjAwcHg7cGFkZGluZzo1cHg7IiBuYW1lPSJzb2x1dGlvbiIgaWQ9InNvbHV0aW9uIiA+PC90ZXh0YXJlYT4KICA8L2Rpdj4KICA8cHJlIGlkPSJ0ZXN0cmVzdWx0Ij48L3ByZT4KICA8cD5NSU1FIHR5cGUgZGVmaW5lZDogPGNvZGU+dGV4dC94LXZiPC9jb2RlPi48L3A+Cgo8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/vb/vb.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJ2YiIsIGZ1bmN0aW9uKGNvbmYsIHBhcnNlckNvbmYpIHsKICAgIHZhciBFUlJPUkNMQVNTID0gJ2Vycm9yJzsKCiAgICBmdW5jdGlvbiB3b3JkUmVnZXhwKHdvcmRzKSB7CiAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAoIl4oKCIgKyB3b3Jkcy5qb2luKCIpfCgiKSArICIpKVxcYiIsICJpIik7CiAgICB9CgogICAgdmFyIHNpbmdsZU9wZXJhdG9ycyA9IG5ldyBSZWdFeHAoIl5bXFwrXFwtXFwqLyUmXFxcXHxcXF5+PD4hXSIpOwogICAgdmFyIHNpbmdsZURlbGltaXRlcnMgPSBuZXcgUmVnRXhwKCdeW1xcKFxcKVxcW1xcXVxce1xcfUAsOmA9O1xcLl0nKTsKICAgIHZhciBkb3VibGVPcGVyYXRvcnMgPSBuZXcgUmVnRXhwKCJeKCg9PSl8KDw+KXwoPD0pfCg+PSl8KDw+KXwoPDwpfCg+Pil8KC8vKXwoXFwqXFwqKSkiKTsKICAgIHZhciBkb3VibGVEZWxpbWl0ZXJzID0gbmV3IFJlZ0V4cCgiXigoXFwrPSl8KFxcLT0pfChcXCo9KXwoJT0pfCgvPSl8KCY9KXwoXFx8PSl8KFxcXj0pKSIpOwogICAgdmFyIHRyaXBsZURlbGltaXRlcnMgPSBuZXcgUmVnRXhwKCJeKCgvLz0pfCg+Pj0pfCg8PD0pfChcXCpcXCo9KSkiKTsKICAgIHZhciBpZGVudGlmaWVycyA9IG5ldyBSZWdFeHAoIl5bX0EtWmEtel1bX0EtWmEtejAtOV0qIik7CgogICAgdmFyIG9wZW5pbmdLZXl3b3JkcyA9IFsnY2xhc3MnLCdtb2R1bGUnLCAnc3ViJywnZW51bScsJ3NlbGVjdCcsJ3doaWxlJywnaWYnLCdmdW5jdGlvbicsICAnZ2V0Jywnc2V0JywncHJvcGVydHknLCAndHJ5J107CiAgICB2YXIgbWlkZGxlS2V5d29yZHMgPSBbJ2Vsc2UnLCdlbHNlaWYnLCdjYXNlJywgJ2NhdGNoJ107CiAgICB2YXIgZW5kS2V5d29yZHMgPSBbJ25leHQnLCdsb29wJ107CgogICAgdmFyIG9wZXJhdG9yS2V5d29yZHMgPSBbJ2FuZCcsICdvcicsICdub3QnLCAneG9yJywgJ2luJ107CiAgICB2YXIgd29yZE9wZXJhdG9ycyA9IHdvcmRSZWdleHAob3BlcmF0b3JLZXl3b3Jkcyk7CiAgICB2YXIgY29tbW9uS2V5d29yZHMgPSBbJ2FzJywgJ2RpbScsICdicmVhaycsICAnY29udGludWUnLCdvcHRpb25hbCcsICd0aGVuJywgICd1bnRpbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgJ2dvdG8nLCAnYnl2YWwnLCdieXJlZicsJ25ldycsJ2hhbmRsZXMnLCdwcm9wZXJ0eScsICdyZXR1cm4nLAogICAgICAgICAgICAgICAgICAgICAgICAgICdjb25zdCcsJ3ByaXZhdGUnLCAncHJvdGVjdGVkJywgJ2ZyaWVuZCcsICdwdWJsaWMnLCAnc2hhcmVkJywgJ3N0YXRpYycsICd0cnVlJywnZmFsc2UnXTsKICAgIHZhciBjb21tb250eXBlcyA9IFsnaW50ZWdlcicsJ3N0cmluZycsJ2RvdWJsZScsJ2RlY2ltYWwnLCdib29sZWFuJywnc2hvcnQnLCdjaGFyJywgJ2Zsb2F0Jywnc2luZ2xlJ107CgogICAgdmFyIGtleXdvcmRzID0gd29yZFJlZ2V4cChjb21tb25LZXl3b3Jkcyk7CiAgICB2YXIgdHlwZXMgPSB3b3JkUmVnZXhwKGNvbW1vbnR5cGVzKTsKICAgIHZhciBzdHJpbmdQcmVmaXhlcyA9ICciJzsKCiAgICB2YXIgb3BlbmluZyA9IHdvcmRSZWdleHAob3BlbmluZ0tleXdvcmRzKTsKICAgIHZhciBtaWRkbGUgPSB3b3JkUmVnZXhwKG1pZGRsZUtleXdvcmRzKTsKICAgIHZhciBjbG9zaW5nID0gd29yZFJlZ2V4cChlbmRLZXl3b3Jkcyk7CiAgICB2YXIgZG91YmxlQ2xvc2luZyA9IHdvcmRSZWdleHAoWydlbmQnXSk7CiAgICB2YXIgZG9PcGVuaW5nID0gd29yZFJlZ2V4cChbJ2RvJ10pOwoKICAgIHZhciBpbmRlbnRJbmZvID0gbnVsbDsKCiAgICBDb2RlTWlycm9yLnJlZ2lzdGVySGVscGVyKCJoaW50V29yZHMiLCAidmIiLCBvcGVuaW5nS2V5d29yZHMuY29uY2F0KG1pZGRsZUtleXdvcmRzKS5jb25jYXQoZW5kS2V5d29yZHMpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvbmNhdChvcGVyYXRvcktleXdvcmRzKS5jb25jYXQoY29tbW9uS2V5d29yZHMpLmNvbmNhdChjb21tb250eXBlcykpOwoKICAgIGZ1bmN0aW9uIGluZGVudChfc3RyZWFtLCBzdGF0ZSkgewogICAgICBzdGF0ZS5jdXJyZW50SW5kZW50Kys7CiAgICB9CgogICAgZnVuY3Rpb24gZGVkZW50KF9zdHJlYW0sIHN0YXRlKSB7CiAgICAgIHN0YXRlLmN1cnJlbnRJbmRlbnQtLTsKICAgIH0KICAgIC8vIHRva2VuaXplcnMKICAgIGZ1bmN0aW9uIHRva2VuQmFzZShzdHJlYW0sIHN0YXRlKSB7CiAgICAgICAgaWYgKHN0cmVhbS5lYXRTcGFjZSgpKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgdmFyIGNoID0gc3RyZWFtLnBlZWsoKTsKCiAgICAgICAgLy8gSGFuZGxlIENvbW1lbnRzCiAgICAgICAgaWYgKGNoID09PSAiJyIpIHsKICAgICAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICAgICAgICByZXR1cm4gJ2NvbW1lbnQnOwogICAgICAgIH0KCgogICAgICAgIC8vIEhhbmRsZSBOdW1iZXIgTGl0ZXJhbHMKICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eKCgmSCl8KCZPKSk/WzAtOVwuYS1mXS9pLCBmYWxzZSkpIHsKICAgICAgICAgICAgdmFyIGZsb2F0TGl0ZXJhbCA9IGZhbHNlOwogICAgICAgICAgICAvLyBGbG9hdHMKICAgICAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXlxkKlwuXGQrRj8vaSkpIHsgZmxvYXRMaXRlcmFsID0gdHJ1ZTsgfQogICAgICAgICAgICBlbHNlIGlmIChzdHJlYW0ubWF0Y2goL15cZCtcLlxkKkY/LykpIHsgZmxvYXRMaXRlcmFsID0gdHJ1ZTsgfQogICAgICAgICAgICBlbHNlIGlmIChzdHJlYW0ubWF0Y2goL15cLlxkK0Y/LykpIHsgZmxvYXRMaXRlcmFsID0gdHJ1ZTsgfQoKICAgICAgICAgICAgaWYgKGZsb2F0TGl0ZXJhbCkgewogICAgICAgICAgICAgICAgLy8gRmxvYXQgbGl0ZXJhbHMgbWF5IGJlICJpbWFnaW5hcnkiCiAgICAgICAgICAgICAgICBzdHJlYW0uZWF0KC9KL2kpOwogICAgICAgICAgICAgICAgcmV0dXJuICdudW1iZXInOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEludGVnZXJzCiAgICAgICAgICAgIHZhciBpbnRMaXRlcmFsID0gZmFsc2U7CiAgICAgICAgICAgIC8vIEhleAogICAgICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eJkhbMC05YS1mXSsvaSkpIHsgaW50TGl0ZXJhbCA9IHRydWU7IH0KICAgICAgICAgICAgLy8gT2N0YWwKICAgICAgICAgICAgZWxzZSBpZiAoc3RyZWFtLm1hdGNoKC9eJk9bMC03XSsvaSkpIHsgaW50TGl0ZXJhbCA9IHRydWU7IH0KICAgICAgICAgICAgLy8gRGVjaW1hbAogICAgICAgICAgICBlbHNlIGlmIChzdHJlYW0ubWF0Y2goL15bMS05XVxkKkY/LykpIHsKICAgICAgICAgICAgICAgIC8vIERlY2ltYWwgbGl0ZXJhbHMgbWF5IGJlICJpbWFnaW5hcnkiCiAgICAgICAgICAgICAgICBzdHJlYW0uZWF0KC9KL2kpOwogICAgICAgICAgICAgICAgLy8gVE9ETyAtIENhbiB5b3UgaGF2ZSBpbWFnaW5hcnkgbG9uZ3M/CiAgICAgICAgICAgICAgICBpbnRMaXRlcmFsID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBaZXJvIGJ5IGl0c2VsZiB3aXRoIG5vIG90aGVyIHBpZWNlIG9mIG51bWJlci4KICAgICAgICAgICAgZWxzZSBpZiAoc3RyZWFtLm1hdGNoKC9eMCg/IVtcZHhdKS9pKSkgeyBpbnRMaXRlcmFsID0gdHJ1ZTsgfQogICAgICAgICAgICBpZiAoaW50TGl0ZXJhbCkgewogICAgICAgICAgICAgICAgLy8gSW50ZWdlciBsaXRlcmFscyBtYXkgYmUgImxvbmciCiAgICAgICAgICAgICAgICBzdHJlYW0uZWF0KC9ML2kpOwogICAgICAgICAgICAgICAgcmV0dXJuICdudW1iZXInOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBIYW5kbGUgU3RyaW5ncwogICAgICAgIGlmIChzdHJlYW0ubWF0Y2goc3RyaW5nUHJlZml4ZXMpKSB7CiAgICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5TdHJpbmdGYWN0b3J5KHN0cmVhbS5jdXJyZW50KCkpOwogICAgICAgICAgICByZXR1cm4gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CiAgICAgICAgfQoKICAgICAgICAvLyBIYW5kbGUgb3BlcmF0b3JzIGFuZCBEZWxpbWl0ZXJzCiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCh0cmlwbGVEZWxpbWl0ZXJzKSB8fCBzdHJlYW0ubWF0Y2goZG91YmxlRGVsaW1pdGVycykpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIGlmIChzdHJlYW0ubWF0Y2goZG91YmxlT3BlcmF0b3JzKQogICAgICAgICAgICB8fCBzdHJlYW0ubWF0Y2goc2luZ2xlT3BlcmF0b3JzKQogICAgICAgICAgICB8fCBzdHJlYW0ubWF0Y2god29yZE9wZXJhdG9ycykpIHsKICAgICAgICAgICAgcmV0dXJuICdvcGVyYXRvcic7CiAgICAgICAgfQogICAgICAgIGlmIChzdHJlYW0ubWF0Y2goc2luZ2xlRGVsaW1pdGVycykpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIGlmIChzdHJlYW0ubWF0Y2goZG9PcGVuaW5nKSkgewogICAgICAgICAgICBpbmRlbnQoc3RyZWFtLHN0YXRlKTsKICAgICAgICAgICAgc3RhdGUuZG9JbkN1cnJlbnRMaW5lID0gdHJ1ZTsKICAgICAgICAgICAgcmV0dXJuICdrZXl3b3JkJzsKICAgICAgICB9CiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaChvcGVuaW5nKSkgewogICAgICAgICAgICBpZiAoISBzdGF0ZS5kb0luQ3VycmVudExpbmUpCiAgICAgICAgICAgICAgaW5kZW50KHN0cmVhbSxzdGF0ZSk7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICBzdGF0ZS5kb0luQ3VycmVudExpbmUgPSBmYWxzZTsKICAgICAgICAgICAgcmV0dXJuICdrZXl3b3JkJzsKICAgICAgICB9CiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaChtaWRkbGUpKSB7CiAgICAgICAgICAgIHJldHVybiAna2V5d29yZCc7CiAgICAgICAgfQoKICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKGRvdWJsZUNsb3NpbmcpKSB7CiAgICAgICAgICAgIGRlZGVudChzdHJlYW0sc3RhdGUpOwogICAgICAgICAgICBkZWRlbnQoc3RyZWFtLHN0YXRlKTsKICAgICAgICAgICAgcmV0dXJuICdrZXl3b3JkJzsKICAgICAgICB9CiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaChjbG9zaW5nKSkgewogICAgICAgICAgICBkZWRlbnQoc3RyZWFtLHN0YXRlKTsKICAgICAgICAgICAgcmV0dXJuICdrZXl3b3JkJzsKICAgICAgICB9CgogICAgICAgIGlmIChzdHJlYW0ubWF0Y2godHlwZXMpKSB7CiAgICAgICAgICAgIHJldHVybiAna2V5d29yZCc7CiAgICAgICAgfQoKICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKGtleXdvcmRzKSkgewogICAgICAgICAgICByZXR1cm4gJ2tleXdvcmQnOwogICAgICAgIH0KCiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaChpZGVudGlmaWVycykpIHsKICAgICAgICAgICAgcmV0dXJuICd2YXJpYWJsZSc7CiAgICAgICAgfQoKICAgICAgICAvLyBIYW5kbGUgbm9uLWRldGVjdGVkIGl0ZW1zCiAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgICByZXR1cm4gRVJST1JDTEFTUzsKICAgIH0KCiAgICBmdW5jdGlvbiB0b2tlblN0cmluZ0ZhY3RvcnkoZGVsaW1pdGVyKSB7CiAgICAgICAgdmFyIHNpbmdsZWxpbmUgPSBkZWxpbWl0ZXIubGVuZ3RoID09IDE7CiAgICAgICAgdmFyIE9VVENMQVNTID0gJ3N0cmluZyc7CgogICAgICAgIHJldHVybiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgICAgICAgIHdoaWxlICghc3RyZWFtLmVvbCgpKSB7CiAgICAgICAgICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1teJyJdLyk7CiAgICAgICAgICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKGRlbGltaXRlcikpIHsKICAgICAgICAgICAgICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gT1VUQ0xBU1M7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHN0cmVhbS5lYXQoL1snIl0vKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoc2luZ2xlbGluZSkgewogICAgICAgICAgICAgICAgaWYgKHBhcnNlckNvbmYuc2luZ2xlTGluZVN0cmluZ0Vycm9ycykgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUkNMQVNTOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gT1VUQ0xBU1M7CiAgICAgICAgfTsKICAgIH0KCgogICAgZnVuY3Rpb24gdG9rZW5MZXhlcihzdHJlYW0sIHN0YXRlKSB7CiAgICAgICAgdmFyIHN0eWxlID0gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CiAgICAgICAgdmFyIGN1cnJlbnQgPSBzdHJlYW0uY3VycmVudCgpOwoKICAgICAgICAvLyBIYW5kbGUgJy4nIGNvbm5lY3RlZCBpZGVudGlmaWVycwogICAgICAgIGlmIChjdXJyZW50ID09PSAnLicpIHsKICAgICAgICAgICAgc3R5bGUgPSBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgICAgICAgICAgY3VycmVudCA9IHN0cmVhbS5jdXJyZW50KCk7CiAgICAgICAgICAgIGlmIChzdHlsZSA9PT0gJ3ZhcmlhYmxlJykgewogICAgICAgICAgICAgICAgcmV0dXJuICd2YXJpYWJsZSc7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JDTEFTUzsKICAgICAgICAgICAgfQogICAgICAgIH0KCgogICAgICAgIHZhciBkZWxpbWl0ZXJfaW5kZXggPSAnWyh7Jy5pbmRleE9mKGN1cnJlbnQpOwogICAgICAgIGlmIChkZWxpbWl0ZXJfaW5kZXggIT09IC0xKSB7CiAgICAgICAgICAgIGluZGVudChzdHJlYW0sIHN0YXRlICk7CiAgICAgICAgfQogICAgICAgIGlmIChpbmRlbnRJbmZvID09PSAnZGVkZW50JykgewogICAgICAgICAgICBpZiAoZGVkZW50KHN0cmVhbSwgc3RhdGUpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JDTEFTUzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBkZWxpbWl0ZXJfaW5kZXggPSAnXSl9Jy5pbmRleE9mKGN1cnJlbnQpOwogICAgICAgIGlmIChkZWxpbWl0ZXJfaW5kZXggIT09IC0xKSB7CiAgICAgICAgICAgIGlmIChkZWRlbnQoc3RyZWFtLCBzdGF0ZSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUkNMQVNTOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gc3R5bGU7CiAgICB9CgogICAgdmFyIGV4dGVybmFsID0gewogICAgICAgIGVsZWN0cmljQ2hhcnM6ImREcFB0VGZGZUUgIiwKICAgICAgICBzdGFydFN0YXRlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICB0b2tlbml6ZTogdG9rZW5CYXNlLAogICAgICAgICAgICAgIGxhc3RUb2tlbjogbnVsbCwKICAgICAgICAgICAgICBjdXJyZW50SW5kZW50OiAwLAogICAgICAgICAgICAgIG5leHRMaW5lSW5kZW50OiAwLAogICAgICAgICAgICAgIGRvSW5DdXJyZW50TGluZTogZmFsc2UKCgogICAgICAgICAgfTsKICAgICAgICB9LAoKICAgICAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICAgICAgICBpZiAoc3RyZWFtLnNvbCgpKSB7CiAgICAgICAgICAgICAgc3RhdGUuY3VycmVudEluZGVudCArPSBzdGF0ZS5uZXh0TGluZUluZGVudDsKICAgICAgICAgICAgICBzdGF0ZS5uZXh0TGluZUluZGVudCA9IDA7CiAgICAgICAgICAgICAgc3RhdGUuZG9JbkN1cnJlbnRMaW5lID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgc3R5bGUgPSB0b2tlbkxleGVyKHN0cmVhbSwgc3RhdGUpOwoKICAgICAgICAgICAgc3RhdGUubGFzdFRva2VuID0ge3N0eWxlOnN0eWxlLCBjb250ZW50OiBzdHJlYW0uY3VycmVudCgpfTsKCgoKICAgICAgICAgICAgcmV0dXJuIHN0eWxlOwogICAgICAgIH0sCgogICAgICAgIGluZGVudDogZnVuY3Rpb24oc3RhdGUsIHRleHRBZnRlcikgewogICAgICAgICAgICB2YXIgdHJ1ZVRleHQgPSB0ZXh0QWZ0ZXIucmVwbGFjZSgvXlxzK3xccyskL2csICcnKSA7CiAgICAgICAgICAgIGlmICh0cnVlVGV4dC5tYXRjaChjbG9zaW5nKSB8fCB0cnVlVGV4dC5tYXRjaChkb3VibGVDbG9zaW5nKSB8fCB0cnVlVGV4dC5tYXRjaChtaWRkbGUpKSByZXR1cm4gY29uZi5pbmRlbnRVbml0KihzdGF0ZS5jdXJyZW50SW5kZW50LTEpOwogICAgICAgICAgICBpZihzdGF0ZS5jdXJyZW50SW5kZW50IDwgMCkgcmV0dXJuIDA7CiAgICAgICAgICAgIHJldHVybiBzdGF0ZS5jdXJyZW50SW5kZW50ICogY29uZi5pbmRlbnRVbml0OwogICAgICAgIH0sCgogICAgICAgIGxpbmVDb21tZW50OiAiJyIKICAgIH07CiAgICByZXR1cm4gZXh0ZXJuYWw7Cn0pOwoKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtdmIiLCAidmIiKTsKCn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/vbscript/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/vbscript/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogVkJTY3JpcHQgbW9kZTwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uLy4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxzY3JpcHQgc3JjPSIuLi8uLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJ2YnNjcmlwdC5qcyI+PC9zY3JpcHQ+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+LkNvZGVNaXJyb3Ige2JvcmRlci10b3A6IDFweCBzb2xpZCBibGFjazsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrO308L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxoMT5Db2RlTWlycm9yPC9oMT48aW1nIGlkPWxvZ28gc3JjPSIuLi8uLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5MYW5ndWFnZSBtb2RlczwvYT4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+VkJTY3JpcHQ8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPlZCU2NyaXB0IG1vZGU8L2gyPgoKCjxkaXY+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KJyBQZXRlIEd1aGwKJyAwMy0wNC0yMDEyCicKJyBCYXNpYyBWQlNjcmlwdCBzdXBwb3J0IGZvciBjb2RlbWlycm9yMgoKQ29uc3QgRm9yUmVhZGluZyA9IDEsIEZvcldyaXRpbmcgPSAyLCBGb3JBcHBlbmRpbmcgPSA4CgpDYWxsIFN1YjAyMF9Qb3N0QnJvYWRjYXN0VG9VcmJhbkFpcnNoaXAoc3RyVXNlck5hbWUsIHN0clBhc3N3b3JkLCBpbnRUcmFuc21pdElELCBzdHJSZXNwb25zZSkKCklmIE5vdCBJc051bGwoc3RyUmVzcG9uc2UpIEFORCBMZW4oc3RyUmVzcG9uc2UpID0gMCBUaGVuCglib29sVHJhbnNtaXRPa1lOID0gRmFsc2UKRWxzZQoJJyBXU2NyaXB0LkVjaG8gIk9oIEhhcHB5IERheSEgT2ggSGFwcHkgREFZISIKCWJvb2xUcmFuc21pdE9rWU4gPSBUcnVlCkVuZCBJZgo8L3RleHRhcmVhPjwvZGl2PgoKICAgIDxzY3JpcHQ+CiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICAgICAgbGluZU51bWJlcnM6IHRydWUsCiAgICAgICAgaW5kZW50VW5pdDogNAogICAgICB9KTsKICAgIDwvc2NyaXB0PgoKICAgIDxwPjxzdHJvbmc+TUlNRSB0eXBlcyBkZWZpbmVkOjwvc3Ryb25nPiA8Y29kZT50ZXh0L3Zic2NyaXB0PC9jb2RlPi48L3A+CiAgPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/vbscript/vbscript.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovKgpGb3IgZXh0cmEgQVNQIGNsYXNzaWMgb2JqZWN0cywgaW5pdGlhbGl6ZSBDb2RlTWlycm9yIGluc3RhbmNlIHdpdGggdGhpcyBvcHRpb246CiAgICBpc0FTUDogdHJ1ZQoKRS5HLjoKICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICAgICAgbGluZU51bWJlcnM6IHRydWUsCiAgICAgICAgaXNBU1A6IHRydWUKICAgICAgfSk7CiovCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJ2YnNjcmlwdCIsIGZ1bmN0aW9uKGNvbmYsIHBhcnNlckNvbmYpIHsKICAgIHZhciBFUlJPUkNMQVNTID0gJ2Vycm9yJzsKCiAgICBmdW5jdGlvbiB3b3JkUmVnZXhwKHdvcmRzKSB7CiAgICAgICAgcmV0dXJuIG5ldyBSZWdFeHAoIl4oKCIgKyB3b3Jkcy5qb2luKCIpfCgiKSArICIpKVxcYiIsICJpIik7CiAgICB9CgogICAgdmFyIHNpbmdsZU9wZXJhdG9ycyA9IG5ldyBSZWdFeHAoIl5bXFwrXFwtXFwqLyZcXFxcXFxePD49XSIpOwogICAgdmFyIGRvdWJsZU9wZXJhdG9ycyA9IG5ldyBSZWdFeHAoIl4oKDw+KXwoPD0pfCg+PSkpIik7CiAgICB2YXIgc2luZ2xlRGVsaW1pdGVycyA9IG5ldyBSZWdFeHAoJ15bXFwuLF0nKTsKICAgIHZhciBicmFrZXRzID0gbmV3IFJlZ0V4cCgnXltcXChcXCldJyk7CiAgICB2YXIgaWRlbnRpZmllcnMgPSBuZXcgUmVnRXhwKCJeW0EtWmEtel1bX0EtWmEtejAtOV0qIik7CgogICAgdmFyIG9wZW5pbmdLZXl3b3JkcyA9IFsnY2xhc3MnLCdzdWInLCdzZWxlY3QnLCd3aGlsZScsJ2lmJywnZnVuY3Rpb24nLCAncHJvcGVydHknLCAnd2l0aCcsICdmb3InXTsKICAgIHZhciBtaWRkbGVLZXl3b3JkcyA9IFsnZWxzZScsJ2Vsc2VpZicsJ2Nhc2UnXTsKICAgIHZhciBlbmRLZXl3b3JkcyA9IFsnbmV4dCcsJ2xvb3AnLCd3ZW5kJ107CgogICAgdmFyIHdvcmRPcGVyYXRvcnMgPSB3b3JkUmVnZXhwKFsnYW5kJywgJ29yJywgJ25vdCcsICd4b3InLCAnaXMnLCAnbW9kJywgJ2VxdicsICdpbXAnXSk7CiAgICB2YXIgY29tbW9ua2V5d29yZHMgPSBbJ2RpbScsICdyZWRpbScsICd0aGVuJywgICd1bnRpbCcsICdyYW5kb21pemUnLAogICAgICAgICAgICAgICAgICAgICAgICAgICdieXZhbCcsJ2J5cmVmJywnbmV3JywncHJvcGVydHknLCAnZXhpdCcsICdpbicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgJ2NvbnN0JywncHJpdmF0ZScsICdwdWJsaWMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICdnZXQnLCdzZXQnLCdsZXQnLCAnc3RvcCcsICdvbiBlcnJvciByZXN1bWUgbmV4dCcsICdvbiBlcnJvciBnb3RvIDAnLCAnb3B0aW9uIGV4cGxpY2l0JywgJ2NhbGwnLCAnbWUnXTsKCiAgICAvL1RoaXMgbGlzdCB3YXMgZnJvbTogaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2Y4dGJjNzl4KHY9dnMuODQpLmFzcHgKICAgIHZhciBhdG9tV29yZHMgPSBbJ3RydWUnLCAnZmFsc2UnLCAnbm90aGluZycsICdlbXB0eScsICdudWxsJ107CiAgICAvL1RoaXMgbGlzdCB3YXMgZnJvbTogaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5LzNjYTh0ZmVrKHY9dnMuODQpLmFzcHgKICAgIHZhciBidWlsdGluRnVuY3NXb3JkcyA9IFsnYWJzJywgJ2FycmF5JywgJ2FzYycsICdhdG4nLCAnY2Jvb2wnLCAnY2J5dGUnLCAnY2N1cicsICdjZGF0ZScsICdjZGJsJywgJ2NocicsICdjaW50JywgJ2NsbmcnLCAnY29zJywgJ2NzbmcnLCAnY3N0cicsICdkYXRlJywgJ2RhdGVhZGQnLCAnZGF0ZWRpZmYnLCAnZGF0ZXBhcnQnLAogICAgICAgICAgICAgICAgICAgICAgICAnZGF0ZXNlcmlhbCcsICdkYXRldmFsdWUnLCAnZGF5JywgJ2VzY2FwZScsICdldmFsJywgJ2V4ZWN1dGUnLCAnZXhwJywgJ2ZpbHRlcicsICdmb3JtYXRjdXJyZW5jeScsICdmb3JtYXRkYXRldGltZScsICdmb3JtYXRudW1iZXInLCAnZm9ybWF0cGVyY2VudCcsICdnZXRsb2NhbGUnLCAnZ2V0b2JqZWN0JywKICAgICAgICAgICAgICAgICAgICAgICAgJ2dldHJlZicsICdoZXgnLCAnaG91cicsICdpbnB1dGJveCcsICdpbnN0cicsICdpbnN0cnJldicsICdpbnQnLCAnZml4JywgJ2lzYXJyYXknLCAnaXNkYXRlJywgJ2lzZW1wdHknLCAnaXNudWxsJywgJ2lzbnVtZXJpYycsICdpc29iamVjdCcsICdqb2luJywgJ2xib3VuZCcsICdsY2FzZScsICdsZWZ0JywKICAgICAgICAgICAgICAgICAgICAgICAgJ2xlbicsICdsb2FkcGljdHVyZScsICdsb2cnLCAnbHRyaW0nLCAncnRyaW0nLCAndHJpbScsICdtYXRocycsICdtaWQnLCAnbWludXRlJywgJ21vbnRoJywgJ21vbnRobmFtZScsICdtc2dib3gnLCAnbm93JywgJ29jdCcsICdyZXBsYWNlJywgJ3JnYicsICdyaWdodCcsICdybmQnLCAncm91bmQnLAogICAgICAgICAgICAgICAgICAgICAgICAnc2NyaXB0ZW5naW5lJywgJ3NjcmlwdGVuZ2luZWJ1aWxkdmVyc2lvbicsICdzY3JpcHRlbmdpbmVtYWpvcnZlcnNpb24nLCAnc2NyaXB0ZW5naW5lbWlub3J2ZXJzaW9uJywgJ3NlY29uZCcsICdzZXRsb2NhbGUnLCAnc2duJywgJ3NpbicsICdzcGFjZScsICdzcGxpdCcsICdzcXInLCAnc3RyY29tcCcsCiAgICAgICAgICAgICAgICAgICAgICAgICdzdHJpbmcnLCAnc3RycmV2ZXJzZScsICd0YW4nLCAndGltZScsICd0aW1lcicsICd0aW1lc2VyaWFsJywgJ3RpbWV2YWx1ZScsICd0eXBlbmFtZScsICd1Ym91bmQnLCAndWNhc2UnLCAndW5lc2NhcGUnLCAndmFydHlwZScsICd3ZWVrZGF5JywgJ3dlZWtkYXluYW1lJywgJ3llYXInXTsKCiAgICAvL1RoaXMgbGlzdCB3YXMgZnJvbTogaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L3lkejRjZmszKHY9dnMuODQpLmFzcHgKICAgIHZhciBidWlsdGluQ29uc3RzID0gWyd2YkJsYWNrJywgJ3ZiUmVkJywgJ3ZiR3JlZW4nLCAndmJZZWxsb3cnLCAndmJCbHVlJywgJ3ZiTWFnZW50YScsICd2YkN5YW4nLCAndmJXaGl0ZScsICd2YkJpbmFyeUNvbXBhcmUnLCAndmJUZXh0Q29tcGFyZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAndmJTdW5kYXknLCAndmJNb25kYXknLCAndmJUdWVzZGF5JywgJ3ZiV2VkbmVzZGF5JywgJ3ZiVGh1cnNkYXknLCAndmJGcmlkYXknLCAndmJTYXR1cmRheScsICd2YlVzZVN5c3RlbURheU9mV2VlaycsICd2YkZpcnN0SmFuMScsICd2YkZpcnN0Rm91ckRheXMnLCAndmJGaXJzdEZ1bGxXZWVrJywKICAgICAgICAgICAgICAgICAgICAgICAgICd2YkdlbmVyYWxEYXRlJywgJ3ZiTG9uZ0RhdGUnLCAndmJTaG9ydERhdGUnLCAndmJMb25nVGltZScsICd2YlNob3J0VGltZScsICd2Yk9iamVjdEVycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgICd2Yk9LT25seScsICd2Yk9LQ2FuY2VsJywgJ3ZiQWJvcnRSZXRyeUlnbm9yZScsICd2Ylllc05vQ2FuY2VsJywgJ3ZiWWVzTm8nLCAndmJSZXRyeUNhbmNlbCcsICd2YkNyaXRpY2FsJywgJ3ZiUXVlc3Rpb24nLCAndmJFeGNsYW1hdGlvbicsICd2YkluZm9ybWF0aW9uJywgJ3ZiRGVmYXVsdEJ1dHRvbjEnLCAndmJEZWZhdWx0QnV0dG9uMicsCiAgICAgICAgICAgICAgICAgICAgICAgICAndmJEZWZhdWx0QnV0dG9uMycsICd2YkRlZmF1bHRCdXR0b240JywgJ3ZiQXBwbGljYXRpb25Nb2RhbCcsICd2YlN5c3RlbU1vZGFsJywgJ3ZiT0snLCAndmJDYW5jZWwnLCAndmJBYm9ydCcsICd2YlJldHJ5JywgJ3ZiSWdub3JlJywgJ3ZiWWVzJywgJ3ZiTm8nLAogICAgICAgICAgICAgICAgICAgICAgICAgJ3ZiQ3InLCAnVmJDckxmJywgJ3ZiRm9ybUZlZWQnLCAndmJMZicsICd2Yk5ld0xpbmUnLCAndmJOdWxsQ2hhcicsICd2Yk51bGxTdHJpbmcnLCAndmJUYWInLCAndmJWZXJ0aWNhbFRhYicsICd2YlVzZURlZmF1bHQnLCAndmJUcnVlJywgJ3ZiRmFsc2UnLAogICAgICAgICAgICAgICAgICAgICAgICAgJ3ZiRW1wdHknLCAndmJOdWxsJywgJ3ZiSW50ZWdlcicsICd2YkxvbmcnLCAndmJTaW5nbGUnLCAndmJEb3VibGUnLCAndmJDdXJyZW5jeScsICd2YkRhdGUnLCAndmJTdHJpbmcnLCAndmJPYmplY3QnLCAndmJFcnJvcicsICd2YkJvb2xlYW4nLCAndmJWYXJpYW50JywgJ3ZiRGF0YU9iamVjdCcsICd2YkRlY2ltYWwnLCAndmJCeXRlJywgJ3ZiQXJyYXknXTsKICAgIC8vVGhpcyBsaXN0IHdhcyBmcm9tOiBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvaGtjMzc1ZWEodj12cy44NCkuYXNweAogICAgdmFyIGJ1aWx0aW5PYmpzV29yZHMgPSBbJ1dTY3JpcHQnLCAnZXJyJywgJ2RlYnVnJywgJ1JlZ0V4cCddOwogICAgdmFyIGtub3duUHJvcGVydGllcyA9IFsnZGVzY3JpcHRpb24nLCAnZmlyc3RpbmRleCcsICdnbG9iYWwnLCAnaGVscGNvbnRleHQnLCAnaGVscGZpbGUnLCAnaWdub3JlY2FzZScsICdsZW5ndGgnLCAnbnVtYmVyJywgJ3BhdHRlcm4nLCAnc291cmNlJywgJ3ZhbHVlJywgJ2NvdW50J107CiAgICB2YXIga25vd25NZXRob2RzID0gWydjbGVhcicsICdleGVjdXRlJywgJ3JhaXNlJywgJ3JlcGxhY2UnLCAndGVzdCcsICd3cml0ZScsICd3cml0ZWxpbmUnLCAnY2xvc2UnLCAnb3BlbicsICdzdGF0ZScsICdlb2YnLCAndXBkYXRlJywgJ2FkZG5ldycsICdlbmQnLCAnY3JlYXRlb2JqZWN0JywgJ3F1aXQnXTsKCiAgICB2YXIgYXNwQnVpbHRpbk9ianNXb3JkcyA9IFsnc2VydmVyJywgJ3Jlc3BvbnNlJywgJ3JlcXVlc3QnLCAnc2Vzc2lvbicsICdhcHBsaWNhdGlvbiddOwogICAgdmFyIGFzcEtub3duUHJvcGVydGllcyA9IFsnYnVmZmVyJywgJ2NhY2hlY29udHJvbCcsICdjaGFyc2V0JywgJ2NvbnRlbnR0eXBlJywgJ2V4cGlyZXMnLCAnZXhwaXJlc2Fic29sdXRlJywgJ2lzY2xpZW50Y29ubmVjdGVkJywgJ3BpY3MnLCAnc3RhdHVzJywgLy9yZXNwb25zZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY2xpZW50Y2VydGlmaWNhdGUnLCAnY29va2llcycsICdmb3JtJywgJ3F1ZXJ5c3RyaW5nJywgJ3NlcnZlcnZhcmlhYmxlcycsICd0b3RhbGJ5dGVzJywgLy9yZXF1ZXN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdjb250ZW50cycsICdzdGF0aWNvYmplY3RzJywgLy9hcHBsaWNhdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnY29kZXBhZ2UnLCAnbGNpZCcsICdzZXNzaW9uaWQnLCAndGltZW91dCcsIC8vc2Vzc2lvbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2NyaXB0dGltZW91dCddOyAvL3NlcnZlcgogICAgdmFyIGFzcEtub3duTWV0aG9kcyA9IFsnYWRkaGVhZGVyJywgJ2FwcGVuZHRvbG9nJywgJ2JpbmFyeXdyaXRlJywgJ2VuZCcsICdmbHVzaCcsICdyZWRpcmVjdCcsIC8vcmVzcG9uc2UKICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JpbmFyeXJlYWQnLCAvL3JlcXVlc3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JlbW92ZScsICdyZW1vdmVhbGwnLCAnbG9jaycsICd1bmxvY2snLCAvL2FwcGxpY2F0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICdhYmFuZG9uJywgLy9zZXNzaW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICdnZXRsYXN0ZXJyb3InLCAnaHRtbGVuY29kZScsICdtYXBwYXRoJywgJ3RyYW5zZmVyJywgJ3VybGVuY29kZSddOyAvL3NlcnZlcgoKICAgIHZhciBrbm93bldvcmRzID0ga25vd25NZXRob2RzLmNvbmNhdChrbm93blByb3BlcnRpZXMpOwoKICAgIGJ1aWx0aW5PYmpzV29yZHMgPSBidWlsdGluT2Jqc1dvcmRzLmNvbmNhdChidWlsdGluQ29uc3RzKTsKCiAgICBpZiAoY29uZi5pc0FTUCl7CiAgICAgICAgYnVpbHRpbk9ianNXb3JkcyA9IGJ1aWx0aW5PYmpzV29yZHMuY29uY2F0KGFzcEJ1aWx0aW5PYmpzV29yZHMpOwogICAgICAgIGtub3duV29yZHMgPSBrbm93bldvcmRzLmNvbmNhdChhc3BLbm93bk1ldGhvZHMsIGFzcEtub3duUHJvcGVydGllcyk7CiAgICB9OwoKICAgIHZhciBrZXl3b3JkcyA9IHdvcmRSZWdleHAoY29tbW9ua2V5d29yZHMpOwogICAgdmFyIGF0b21zID0gd29yZFJlZ2V4cChhdG9tV29yZHMpOwogICAgdmFyIGJ1aWx0aW5GdW5jcyA9IHdvcmRSZWdleHAoYnVpbHRpbkZ1bmNzV29yZHMpOwogICAgdmFyIGJ1aWx0aW5PYmpzID0gd29yZFJlZ2V4cChidWlsdGluT2Jqc1dvcmRzKTsKICAgIHZhciBrbm93biA9IHdvcmRSZWdleHAoa25vd25Xb3Jkcyk7CiAgICB2YXIgc3RyaW5nUHJlZml4ZXMgPSAnIic7CgogICAgdmFyIG9wZW5pbmcgPSB3b3JkUmVnZXhwKG9wZW5pbmdLZXl3b3Jkcyk7CiAgICB2YXIgbWlkZGxlID0gd29yZFJlZ2V4cChtaWRkbGVLZXl3b3Jkcyk7CiAgICB2YXIgY2xvc2luZyA9IHdvcmRSZWdleHAoZW5kS2V5d29yZHMpOwogICAgdmFyIGRvdWJsZUNsb3NpbmcgPSB3b3JkUmVnZXhwKFsnZW5kJ10pOwogICAgdmFyIGRvT3BlbmluZyA9IHdvcmRSZWdleHAoWydkbyddKTsKICAgIHZhciBub0luZGVudFdvcmRzID0gd29yZFJlZ2V4cChbJ29uIGVycm9yIHJlc3VtZSBuZXh0JywgJ2V4aXQnXSk7CiAgICB2YXIgY29tbWVudCA9IHdvcmRSZWdleHAoWydyZW0nXSk7CgoKICAgIGZ1bmN0aW9uIGluZGVudChfc3RyZWFtLCBzdGF0ZSkgewogICAgICBzdGF0ZS5jdXJyZW50SW5kZW50Kys7CiAgICB9CgogICAgZnVuY3Rpb24gZGVkZW50KF9zdHJlYW0sIHN0YXRlKSB7CiAgICAgIHN0YXRlLmN1cnJlbnRJbmRlbnQtLTsKICAgIH0KICAgIC8vIHRva2VuaXplcnMKICAgIGZ1bmN0aW9uIHRva2VuQmFzZShzdHJlYW0sIHN0YXRlKSB7CiAgICAgICAgaWYgKHN0cmVhbS5lYXRTcGFjZSgpKSB7CiAgICAgICAgICAgIHJldHVybiAnc3BhY2UnOwogICAgICAgICAgICAvL3JldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgdmFyIGNoID0gc3RyZWFtLnBlZWsoKTsKCiAgICAgICAgLy8gSGFuZGxlIENvbW1lbnRzCiAgICAgICAgaWYgKGNoID09PSAiJyIpIHsKICAgICAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICAgICAgICByZXR1cm4gJ2NvbW1lbnQnOwogICAgICAgIH0KICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKGNvbW1lbnQpKXsKICAgICAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICAgICAgICByZXR1cm4gJ2NvbW1lbnQnOwogICAgICAgIH0KCgogICAgICAgIC8vIEhhbmRsZSBOdW1iZXIgTGl0ZXJhbHMKICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eKCgmSCl8KCZPKSk/WzAtOVwuXS9pLCBmYWxzZSkgJiYgIXN0cmVhbS5tYXRjaCgvXigoJkgpfCgmTykpP1swLTlcLl0rW2Etel9dL2ksIGZhbHNlKSkgewogICAgICAgICAgICB2YXIgZmxvYXRMaXRlcmFsID0gZmFsc2U7CiAgICAgICAgICAgIC8vIEZsb2F0cwogICAgICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKC9eXGQqXC5cZCsvaSkpIHsgZmxvYXRMaXRlcmFsID0gdHJ1ZTsgfQogICAgICAgICAgICBlbHNlIGlmIChzdHJlYW0ubWF0Y2goL15cZCtcLlxkKi8pKSB7IGZsb2F0TGl0ZXJhbCA9IHRydWU7IH0KICAgICAgICAgICAgZWxzZSBpZiAoc3RyZWFtLm1hdGNoKC9eXC5cZCsvKSkgeyBmbG9hdExpdGVyYWwgPSB0cnVlOyB9CgogICAgICAgICAgICBpZiAoZmxvYXRMaXRlcmFsKSB7CiAgICAgICAgICAgICAgICAvLyBGbG9hdCBsaXRlcmFscyBtYXkgYmUgImltYWdpbmFyeSIKICAgICAgICAgICAgICAgIHN0cmVhbS5lYXQoL0ovaSk7CiAgICAgICAgICAgICAgICByZXR1cm4gJ251bWJlcic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gSW50ZWdlcnMKICAgICAgICAgICAgdmFyIGludExpdGVyYWwgPSBmYWxzZTsKICAgICAgICAgICAgLy8gSGV4CiAgICAgICAgICAgIGlmIChzdHJlYW0ubWF0Y2goL14mSFswLTlhLWZdKy9pKSkgeyBpbnRMaXRlcmFsID0gdHJ1ZTsgfQogICAgICAgICAgICAvLyBPY3RhbAogICAgICAgICAgICBlbHNlIGlmIChzdHJlYW0ubWF0Y2goL14mT1swLTddKy9pKSkgeyBpbnRMaXRlcmFsID0gdHJ1ZTsgfQogICAgICAgICAgICAvLyBEZWNpbWFsCiAgICAgICAgICAgIGVsc2UgaWYgKHN0cmVhbS5tYXRjaCgvXlsxLTldXGQqRj8vKSkgewogICAgICAgICAgICAgICAgLy8gRGVjaW1hbCBsaXRlcmFscyBtYXkgYmUgImltYWdpbmFyeSIKICAgICAgICAgICAgICAgIHN0cmVhbS5lYXQoL0ovaSk7CiAgICAgICAgICAgICAgICAvLyBUT0RPIC0gQ2FuIHlvdSBoYXZlIGltYWdpbmFyeSBsb25ncz8KICAgICAgICAgICAgICAgIGludExpdGVyYWwgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFplcm8gYnkgaXRzZWxmIHdpdGggbm8gb3RoZXIgcGllY2Ugb2YgbnVtYmVyLgogICAgICAgICAgICBlbHNlIGlmIChzdHJlYW0ubWF0Y2goL14wKD8hW1xkeF0pL2kpKSB7IGludExpdGVyYWwgPSB0cnVlOyB9CiAgICAgICAgICAgIGlmIChpbnRMaXRlcmFsKSB7CiAgICAgICAgICAgICAgICAvLyBJbnRlZ2VyIGxpdGVyYWxzIG1heSBiZSAibG9uZyIKICAgICAgICAgICAgICAgIHN0cmVhbS5lYXQoL0wvaSk7CiAgICAgICAgICAgICAgICByZXR1cm4gJ251bWJlcic7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIEhhbmRsZSBTdHJpbmdzCiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaChzdHJpbmdQcmVmaXhlcykpIHsKICAgICAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlblN0cmluZ0ZhY3Rvcnkoc3RyZWFtLmN1cnJlbnQoKSk7CiAgICAgICAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgICAgICB9CgogICAgICAgIC8vIEhhbmRsZSBvcGVyYXRvcnMgYW5kIERlbGltaXRlcnMKICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKGRvdWJsZU9wZXJhdG9ycykKICAgICAgICAgICAgfHwgc3RyZWFtLm1hdGNoKHNpbmdsZU9wZXJhdG9ycykKICAgICAgICAgICAgfHwgc3RyZWFtLm1hdGNoKHdvcmRPcGVyYXRvcnMpKSB7CiAgICAgICAgICAgIHJldHVybiAnb3BlcmF0b3InOwogICAgICAgIH0KICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKHNpbmdsZURlbGltaXRlcnMpKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaChicmFrZXRzKSkgewogICAgICAgICAgICByZXR1cm4gImJyYWNrZXQiOwogICAgICAgIH0KCiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaChub0luZGVudFdvcmRzKSkgewogICAgICAgICAgICBzdGF0ZS5kb0luQ3VycmVudExpbmUgPSB0cnVlOwoKICAgICAgICAgICAgcmV0dXJuICdrZXl3b3JkJzsKICAgICAgICB9CgogICAgICAgIGlmIChzdHJlYW0ubWF0Y2goZG9PcGVuaW5nKSkgewogICAgICAgICAgICBpbmRlbnQoc3RyZWFtLHN0YXRlKTsKICAgICAgICAgICAgc3RhdGUuZG9JbkN1cnJlbnRMaW5lID0gdHJ1ZTsKCiAgICAgICAgICAgIHJldHVybiAna2V5d29yZCc7CiAgICAgICAgfQogICAgICAgIGlmIChzdHJlYW0ubWF0Y2gob3BlbmluZykpIHsKICAgICAgICAgICAgaWYgKCEgc3RhdGUuZG9JbkN1cnJlbnRMaW5lKQogICAgICAgICAgICAgIGluZGVudChzdHJlYW0sc3RhdGUpOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgc3RhdGUuZG9JbkN1cnJlbnRMaW5lID0gZmFsc2U7CgogICAgICAgICAgICByZXR1cm4gJ2tleXdvcmQnOwogICAgICAgIH0KICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKG1pZGRsZSkpIHsKICAgICAgICAgICAgcmV0dXJuICdrZXl3b3JkJzsKICAgICAgICB9CgoKICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKGRvdWJsZUNsb3NpbmcpKSB7CiAgICAgICAgICAgIGRlZGVudChzdHJlYW0sc3RhdGUpOwogICAgICAgICAgICBkZWRlbnQoc3RyZWFtLHN0YXRlKTsKCiAgICAgICAgICAgIHJldHVybiAna2V5d29yZCc7CiAgICAgICAgfQogICAgICAgIGlmIChzdHJlYW0ubWF0Y2goY2xvc2luZykpIHsKICAgICAgICAgICAgaWYgKCEgc3RhdGUuZG9JbkN1cnJlbnRMaW5lKQogICAgICAgICAgICAgIGRlZGVudChzdHJlYW0sc3RhdGUpOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgc3RhdGUuZG9JbkN1cnJlbnRMaW5lID0gZmFsc2U7CgogICAgICAgICAgICByZXR1cm4gJ2tleXdvcmQnOwogICAgICAgIH0KCiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaChrZXl3b3JkcykpIHsKICAgICAgICAgICAgcmV0dXJuICdrZXl3b3JkJzsKICAgICAgICB9CgogICAgICAgIGlmIChzdHJlYW0ubWF0Y2goYXRvbXMpKSB7CiAgICAgICAgICAgIHJldHVybiAnYXRvbSc7CiAgICAgICAgfQoKICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKGtub3duKSkgewogICAgICAgICAgICByZXR1cm4gJ3ZhcmlhYmxlLTInOwogICAgICAgIH0KCiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaChidWlsdGluRnVuY3MpKSB7CiAgICAgICAgICAgIHJldHVybiAnYnVpbHRpbic7CiAgICAgICAgfQoKICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKGJ1aWx0aW5PYmpzKSl7CiAgICAgICAgICAgIHJldHVybiAndmFyaWFibGUtMic7CiAgICAgICAgfQoKICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKGlkZW50aWZpZXJzKSkgewogICAgICAgICAgICByZXR1cm4gJ3ZhcmlhYmxlJzsKICAgICAgICB9CgogICAgICAgIC8vIEhhbmRsZSBub24tZGV0ZWN0ZWQgaXRlbXMKICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgIHJldHVybiBFUlJPUkNMQVNTOwogICAgfQoKICAgIGZ1bmN0aW9uIHRva2VuU3RyaW5nRmFjdG9yeShkZWxpbWl0ZXIpIHsKICAgICAgICB2YXIgc2luZ2xlbGluZSA9IGRlbGltaXRlci5sZW5ndGggPT0gMTsKICAgICAgICB2YXIgT1VUQ0xBU1MgPSAnc3RyaW5nJzsKCiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgICAgICAgd2hpbGUgKCFzdHJlYW0uZW9sKCkpIHsKICAgICAgICAgICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW14nIl0vKTsKICAgICAgICAgICAgICAgIGlmIChzdHJlYW0ubWF0Y2goZGVsaW1pdGVyKSkgewogICAgICAgICAgICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBPVVRDTEFTUzsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgc3RyZWFtLmVhdCgvWyciXS8pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChzaW5nbGVsaW5lKSB7CiAgICAgICAgICAgICAgICBpZiAocGFyc2VyQ29uZi5zaW5nbGVMaW5lU3RyaW5nRXJyb3JzKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SQ0xBU1M7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBPVVRDTEFTUzsKICAgICAgICB9OwogICAgfQoKCiAgICBmdW5jdGlvbiB0b2tlbkxleGVyKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgICB2YXIgc3R5bGUgPSBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgICAgICB2YXIgY3VycmVudCA9IHN0cmVhbS5jdXJyZW50KCk7CgogICAgICAgIC8vIEhhbmRsZSAnLicgY29ubmVjdGVkIGlkZW50aWZpZXJzCiAgICAgICAgaWYgKGN1cnJlbnQgPT09ICcuJykgewogICAgICAgICAgICBzdHlsZSA9IHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwoKICAgICAgICAgICAgY3VycmVudCA9IHN0cmVhbS5jdXJyZW50KCk7CiAgICAgICAgICAgIGlmIChzdHlsZSAmJiAoc3R5bGUuc3Vic3RyKDAsIDgpID09PSAndmFyaWFibGUnIHx8IHN0eWxlPT09J2J1aWx0aW4nIHx8IHN0eWxlPT09J2tleXdvcmQnKSl7Ly98fCBrbm93bldvcmRzLmluZGV4T2YoY3VycmVudC5zdWJzdHJpbmcoMSkpID4gLTEpIHsKICAgICAgICAgICAgICAgIGlmIChzdHlsZSA9PT0gJ2J1aWx0aW4nIHx8IHN0eWxlID09PSAna2V5d29yZCcpIHN0eWxlPSd2YXJpYWJsZSc7CiAgICAgICAgICAgICAgICBpZiAoa25vd25Xb3Jkcy5pbmRleE9mKGN1cnJlbnQuc3Vic3RyKDEpKSA+IC0xKSBzdHlsZT0ndmFyaWFibGUtMic7CgogICAgICAgICAgICAgICAgcmV0dXJuIHN0eWxlOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SQ0xBU1M7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBzdHlsZTsKICAgIH0KCiAgICB2YXIgZXh0ZXJuYWwgPSB7CiAgICAgICAgZWxlY3RyaWNDaGFyczoiZERwUHRUZkZlRSAiLAogICAgICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgIHRva2VuaXplOiB0b2tlbkJhc2UsCiAgICAgICAgICAgICAgbGFzdFRva2VuOiBudWxsLAogICAgICAgICAgICAgIGN1cnJlbnRJbmRlbnQ6IDAsCiAgICAgICAgICAgICAgbmV4dExpbmVJbmRlbnQ6IDAsCiAgICAgICAgICAgICAgZG9JbkN1cnJlbnRMaW5lOiBmYWxzZSwKICAgICAgICAgICAgICBpZ25vcmVLZXl3b3JkOiBmYWxzZQoKCiAgICAgICAgICB9OwogICAgICAgIH0sCgogICAgICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgICAgICAgIGlmIChzdHJlYW0uc29sKCkpIHsKICAgICAgICAgICAgICBzdGF0ZS5jdXJyZW50SW5kZW50ICs9IHN0YXRlLm5leHRMaW5lSW5kZW50OwogICAgICAgICAgICAgIHN0YXRlLm5leHRMaW5lSW5kZW50ID0gMDsKICAgICAgICAgICAgICBzdGF0ZS5kb0luQ3VycmVudExpbmUgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBzdHlsZSA9IHRva2VuTGV4ZXIoc3RyZWFtLCBzdGF0ZSk7CgogICAgICAgICAgICBzdGF0ZS5sYXN0VG9rZW4gPSB7c3R5bGU6c3R5bGUsIGNvbnRlbnQ6IHN0cmVhbS5jdXJyZW50KCl9OwoKICAgICAgICAgICAgaWYgKHN0eWxlPT09J3NwYWNlJykgc3R5bGU9bnVsbDsKCiAgICAgICAgICAgIHJldHVybiBzdHlsZTsKICAgICAgICB9LAoKICAgICAgICBpbmRlbnQ6IGZ1bmN0aW9uKHN0YXRlLCB0ZXh0QWZ0ZXIpIHsKICAgICAgICAgICAgdmFyIHRydWVUZXh0ID0gdGV4dEFmdGVyLnJlcGxhY2UoL15ccyt8XHMrJC9nLCAnJykgOwogICAgICAgICAgICBpZiAodHJ1ZVRleHQubWF0Y2goY2xvc2luZykgfHwgdHJ1ZVRleHQubWF0Y2goZG91YmxlQ2xvc2luZykgfHwgdHJ1ZVRleHQubWF0Y2gobWlkZGxlKSkgcmV0dXJuIGNvbmYuaW5kZW50VW5pdCooc3RhdGUuY3VycmVudEluZGVudC0xKTsKICAgICAgICAgICAgaWYoc3RhdGUuY3VycmVudEluZGVudCA8IDApIHJldHVybiAwOwogICAgICAgICAgICByZXR1cm4gc3RhdGUuY3VycmVudEluZGVudCAqIGNvbmYuaW5kZW50VW5pdDsKICAgICAgICB9CgogICAgfTsKICAgIHJldHVybiBleHRlcm5hbDsKfSk7CgpDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQvdmJzY3JpcHQiLCAidmJzY3JpcHQiKTsKCn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/velocity/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/velocity/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogVmVsb2NpdHkgbW9kZTwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uLy4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vdGhlbWUvbmlnaHQuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9InZlbG9jaXR5LmpzIj48L3NjcmlwdD4KPHN0eWxlPi5Db2RlTWlycm9yIHtib3JkZXI6IDFweCBzb2xpZCBibGFjazt9PC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aDE+Q29kZU1pcnJvcjwvaDE+PGltZyBpZD1sb2dvIHNyYz0iLi4vLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+TGFuZ3VhZ2UgbW9kZXM8L2E+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPlZlbG9jaXR5PC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5WZWxvY2l0eSBtb2RlPC9oMj4KPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KIyMgVmVsb2NpdHkgQ29kZSBEZW1vCiMqCiAgIGJhc2VkIG9uIFBML1NRTCBtb2RlIGJ5IFBldGVyIFJhZ2FuaXRzY2gsIGFkYXB0ZWQgdG8gVmVsb2NpdHkgYnkgU3RldmUgTydIYXJhICggaHR0cDovL3d3dy5waXZvdGFsLXNvbHV0aW9ucy5jby51ayApCiAgIEF1Z3VzdCAyMDExCiojCgojKgogICBUaGlzIGlzIGEgbXVsdGlsaW5lIGNvbW1lbnQuCiAgIFRoaXMgaXMgdGhlIHNlY29uZCBsaW5lCiojCgojW1sgaGVsbG8gc3RldmUKICAgVGhpcyBoYXMgaW52YWxpZCBzeW50YXggdGhhdCB3b3VsZCBub3JtYWxseSBuZWVkICJwb29yIG1hbidzIGVzY2FwaW5nIiBsaWtlOgoKICAgI2RlZmluZSgpCgogICAke2JsYWgKXV0jCgojaW5jbHVkZSggImRpc2NsYWltZXIudHh0IiAib3Bpbmlvbi50eHQiICkKI2luY2x1ZGUoICRmb28gJGJhciApCgojcGFyc2UoICJsZWNvcmJ1c2llci52bSIgKQojcGFyc2UoICRmb28gKQoKI2V2YWx1YXRlKCAnc3RyaW5nIHdpdGggVlRMICNpZih0cnVlKXdpbGwgYmUgZGlzcGxheWVkI2VuZCcgKQoKI2RlZmluZSggJGhlbGxvICkgSGVsbG8gJHdobyAjZW5kICNzZXQoICR3aG8gPSAiV29ybGQhIikgJGhlbGxvICMjIGRpc3BsYXlzIEhlbGxvIFdvcmxkIQoKI2ZvcmVhY2goICRjdXN0b21lciBpbiAkY3VzdG9tZXJMaXN0ICkKCiAgICAkZm9yZWFjaC5jb3VudCAkY3VzdG9tZXIuTmFtZQoKICAgICNpZiggJGZvbyA9PSAke2Jhcn0pCiAgICAgICAgaXQncyB0cnVlIQogICAgICAgICNicmVhawogICAgI3tlbHNlfQogICAgICAgIGl0J3Mgbm90IQogICAgICAgICNzdG9wCiAgICAjZW5kCgogICAgI2lmICgkZm9yZWFjaC5wYXJlbnQuaGFzTmV4dCkKICAgICAgICAkdmVsb2NpdHlDb3VudAogICAgI2VuZAojZW5kCgokc29tZU9iamVjdC5nZXRWYWx1ZXMoInRoaXMgaXMgYSBzdHJpbmcgc3BsaXQKICAgICAgICBhY3Jvc3MgbGluZXMiKQoKJHNvbWVPYmplY3QoIlRoaXMgcGx1cyAkc29tZXRoaW5nIGluIHRoZSBtaWRkbGUiKS5tZXRob2QoNzU2NykucHJvcGVydHkKCiNzZXQoJHNvbWV0aGluZyA9ICJQYXJzZWFibGUgc3RyaW5nIHdpdGggJyRxdW90ZXMnISIpCgojbWFjcm8oIHRhYmxlcm93cyAkY29sb3IgJHNvbWVsaXN0ICkKICAgICNmb3JlYWNoKCAkc29tZXRoaW5nIGluICRzb21lbGlzdCApCiAgICAgICAgPHRyPjx0ZCBiZ2NvbG9yPSRjb2xvcj4kc29tZXRoaW5nPC90ZD48L3RyPgogICAgICAgIDx0cj48dGQgYmdjb2xvcj0kY29sb3I+JGJvZHlDb250ZW50PC90ZD48L3RyPgogICAgI2VuZAojZW5kCgojdGFibGVyb3dzKCJyZWQiIFsiZGFkc2RmIiwiZHNhIl0pCiNAdGFibGVyb3dzKCJyZWQiIFsiZGFkc2RmIiwiZHNhIl0pIHNvbWUgYm9keSBjb250ZW50ICNlbmQKCiAgIFZhcmlhYmxlIHJlZmVyZW5jZTogI3NldCggJG1vbmtleSA9ICRiaWxsICkKICAgU3RyaW5nIGxpdGVyYWw6ICNzZXQoICRtb25rZXkuRnJpZW5kID0gJ21vbmljYScgKQogICBQcm9wZXJ0eSByZWZlcmVuY2U6ICNzZXQoICRtb25rZXkuQmxhbWUgPSAkd2hpdGVob3VzZS5MZWFrICkKICAgTWV0aG9kIHJlZmVyZW5jZTogI3NldCggJG1vbmtleS5QbGFuID0gJHNwaW5kb2N0b3Iud2VhdmUoJHdlYikgKQogICBOdW1iZXIgbGl0ZXJhbDogI3NldCggJG1vbmtleS5OdW1iZXIgPSAxMjMgKQogICBSYW5nZSBvcGVyYXRvcjogI3NldCggJG1vbmtleS5OdW1iZXJzID0gWzEuLjNdICkKICAgT2JqZWN0IGxpc3Q6ICNzZXQoICRtb25rZXkuU2F5ID0gWyJOb3QiLCAkbXksICJmYXVsdCJdICkKICAgT2JqZWN0IG1hcDogI3NldCggJG1vbmtleS5NYXAgPSB7ImJhbmFuYSIgOiAiZ29vZCIsICJyb2FzdCBiZWVmIiA6ICJiYWQifSkKClRoZSBSSFMgY2FuIGFsc28gYmUgYSBzaW1wbGUgYXJpdGhtZXRpYyBleHByZXNzaW9uLCBzdWNoIGFzOgpBZGRpdGlvbjogI3NldCggJHZhbHVlID0gJGZvbyArIDEgKQogICBTdWJ0cmFjdGlvbjogI3NldCggJHZhbHVlID0gJGJhciAtIDEgKQogICBNdWx0aXBsaWNhdGlvbjogI3NldCggJHZhbHVlID0gJGZvbyAqICRiYXIgKQogICBEaXZpc2lvbjogI3NldCggJHZhbHVlID0gJGZvbyAvICRiYXIgKQogICBSZW1haW5kZXI6ICNzZXQoICR2YWx1ZSA9ICRmb28gJSAkYmFyICkKCjwvdGV4dGFyZWE+PC9mb3JtPgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICB0aGVtZTogIm5pZ2h0IiwKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgICAgICBpbmRlbnRVbml0OiA0LAogICAgICAgIG1vZGU6ICJ0ZXh0L3ZlbG9jaXR5IgogICAgICB9KTsKICAgIDwvc2NyaXB0PgoKICAgIDxwPjxzdHJvbmc+TUlNRSB0eXBlcyBkZWZpbmVkOjwvc3Ryb25nPiA8Y29kZT50ZXh0L3ZlbG9jaXR5PC9jb2RlPi48L3A+CgogIDwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/velocity/velocity.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJ2ZWxvY2l0eSIsIGZ1bmN0aW9uKCkgewogICAgZnVuY3Rpb24gcGFyc2VXb3JkcyhzdHIpIHsKICAgICAgICB2YXIgb2JqID0ge30sIHdvcmRzID0gc3RyLnNwbGl0KCIgIik7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB3b3Jkcy5sZW5ndGg7ICsraSkgb2JqW3dvcmRzW2ldXSA9IHRydWU7CiAgICAgICAgcmV0dXJuIG9iajsKICAgIH0KCiAgICB2YXIga2V5d29yZHMgPSBwYXJzZVdvcmRzKCIjZW5kICNlbHNlICNicmVhayAjc3RvcCAjW1sgI11dICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiI3tlbmR9ICN7ZWxzZX0gI3ticmVha30gI3tzdG9wfSIpOwogICAgdmFyIGZ1bmN0aW9ucyA9IHBhcnNlV29yZHMoIiNpZiAjZWxzZWlmICNmb3JlYWNoICNzZXQgI2luY2x1ZGUgI3BhcnNlICNtYWNybyAjZGVmaW5lICNldmFsdWF0ZSAiICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIje2lmfSAje2Vsc2VpZn0gI3tmb3JlYWNofSAje3NldH0gI3tpbmNsdWRlfSAje3BhcnNlfSAje21hY3JvfSAje2RlZmluZX0gI3tldmFsdWF0ZX0iKTsKICAgIHZhciBzcGVjaWFscyA9IHBhcnNlV29yZHMoIiRmb3JlYWNoLmNvdW50ICRmb3JlYWNoLmhhc05leHQgJGZvcmVhY2guZmlyc3QgJGZvcmVhY2gubGFzdCAkZm9yZWFjaC50b3Btb3N0ICRmb3JlYWNoLnBhcmVudC5jb3VudCAkZm9yZWFjaC5wYXJlbnQuaGFzTmV4dCAkZm9yZWFjaC5wYXJlbnQuZmlyc3QgJGZvcmVhY2gucGFyZW50Lmxhc3QgJGZvcmVhY2gucGFyZW50ICR2ZWxvY2l0eUNvdW50ICQhYm9keUNvbnRlbnQgJGJvZHlDb250ZW50Iik7CiAgICB2YXIgaXNPcGVyYXRvckNoYXIgPSAvWytcLSomJT08PiE/OlwvfF0vOwoKICAgIGZ1bmN0aW9uIGNoYWluKHN0cmVhbSwgc3RhdGUsIGYpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IGY7CiAgICAgICAgcmV0dXJuIGYoc3RyZWFtLCBzdGF0ZSk7CiAgICB9CiAgICBmdW5jdGlvbiB0b2tlbkJhc2Uoc3RyZWFtLCBzdGF0ZSkgewogICAgICAgIHZhciBiZWZvcmVQYXJhbXMgPSBzdGF0ZS5iZWZvcmVQYXJhbXM7CiAgICAgICAgc3RhdGUuYmVmb3JlUGFyYW1zID0gZmFsc2U7CiAgICAgICAgdmFyIGNoID0gc3RyZWFtLm5leHQoKTsKICAgICAgICAvLyBzdGFydCBvZiB1bnBhcnNlZCBzdHJpbmc/CiAgICAgICAgaWYgKChjaCA9PSAiJyIpICYmICFzdGF0ZS5pblN0cmluZyAmJiBzdGF0ZS5pblBhcmFtcykgewogICAgICAgICAgICBzdGF0ZS5sYXN0VG9rZW5XYXNCdWlsdGluID0gZmFsc2U7CiAgICAgICAgICAgIHJldHVybiBjaGFpbihzdHJlYW0sIHN0YXRlLCB0b2tlblN0cmluZyhjaCkpOwogICAgICAgIH0KICAgICAgICAvLyBzdGFydCBvZiBwYXJzZWQgc3RyaW5nPwogICAgICAgIGVsc2UgaWYgKChjaCA9PSAnIicpKSB7CiAgICAgICAgICAgIHN0YXRlLmxhc3RUb2tlbldhc0J1aWx0aW4gPSBmYWxzZTsKICAgICAgICAgICAgaWYgKHN0YXRlLmluU3RyaW5nKSB7CiAgICAgICAgICAgICAgICBzdGF0ZS5pblN0cmluZyA9IGZhbHNlOwogICAgICAgICAgICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHN0YXRlLmluUGFyYW1zKQogICAgICAgICAgICAgICAgcmV0dXJuIGNoYWluKHN0cmVhbSwgc3RhdGUsIHRva2VuU3RyaW5nKGNoKSk7CiAgICAgICAgfQogICAgICAgIC8vIGlzIGl0IG9uZSBvZiB0aGUgc3BlY2lhbCBzaWducyBbXXt9KCkuLDs/IFNlcGVyYXRvcj8KICAgICAgICBlbHNlIGlmICgvW1xbXF17fVwoXCksO1wuXS8udGVzdChjaCkpIHsKICAgICAgICAgICAgaWYgKGNoID09ICIoIiAmJiBiZWZvcmVQYXJhbXMpCiAgICAgICAgICAgICAgICBzdGF0ZS5pblBhcmFtcyA9IHRydWU7CiAgICAgICAgICAgIGVsc2UgaWYgKGNoID09ICIpIikgewogICAgICAgICAgICAgICAgc3RhdGUuaW5QYXJhbXMgPSBmYWxzZTsKICAgICAgICAgICAgICAgIHN0YXRlLmxhc3RUb2tlbldhc0J1aWx0aW4gPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICAvLyBzdGFydCBvZiBhIG51bWJlciB2YWx1ZT8KICAgICAgICBlbHNlIGlmICgvXGQvLnRlc3QoY2gpKSB7CiAgICAgICAgICAgIHN0YXRlLmxhc3RUb2tlbldhc0J1aWx0aW4gPSBmYWxzZTsKICAgICAgICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXHdcLl0vKTsKICAgICAgICAgICAgcmV0dXJuICJudW1iZXIiOwogICAgICAgIH0KICAgICAgICAvLyBtdWx0aSBsaW5lIGNvbW1lbnQ/CiAgICAgICAgZWxzZSBpZiAoY2ggPT0gIiMiICYmIHN0cmVhbS5lYXQoIioiKSkgewogICAgICAgICAgICBzdGF0ZS5sYXN0VG9rZW5XYXNCdWlsdGluID0gZmFsc2U7CiAgICAgICAgICAgIHJldHVybiBjaGFpbihzdHJlYW0sIHN0YXRlLCB0b2tlbkNvbW1lbnQpOwogICAgICAgIH0KICAgICAgICAvLyB1bnBhcnNlZCBjb250ZW50PwogICAgICAgIGVsc2UgaWYgKGNoID09ICIjIiAmJiBzdHJlYW0ubWF0Y2goLyAqXFsgKlxbLykpIHsKICAgICAgICAgICAgc3RhdGUubGFzdFRva2VuV2FzQnVpbHRpbiA9IGZhbHNlOwogICAgICAgICAgICByZXR1cm4gY2hhaW4oc3RyZWFtLCBzdGF0ZSwgdG9rZW5VbnBhcnNlZCk7CiAgICAgICAgfQogICAgICAgIC8vIHNpbmdsZSBsaW5lIGNvbW1lbnQ/CiAgICAgICAgZWxzZSBpZiAoY2ggPT0gIiMiICYmIHN0cmVhbS5lYXQoIiMiKSkgewogICAgICAgICAgICBzdGF0ZS5sYXN0VG9rZW5XYXNCdWlsdGluID0gZmFsc2U7CiAgICAgICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgICAgICAgcmV0dXJuICJjb21tZW50IjsKICAgICAgICB9CiAgICAgICAgLy8gdmFyaWFibGU/CiAgICAgICAgZWxzZSBpZiAoY2ggPT0gIiQiKSB7CiAgICAgICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1x3XGRcJF9cLnt9XS8pOwogICAgICAgICAgICAvLyBpcyBpdCBvbmUgb2YgdGhlIHNwZWNpYWxzPwogICAgICAgICAgICBpZiAoc3BlY2lhbHMgJiYgc3BlY2lhbHMucHJvcGVydHlJc0VudW1lcmFibGUoc3RyZWFtLmN1cnJlbnQoKSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAia2V5d29yZCI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBzdGF0ZS5sYXN0VG9rZW5XYXNCdWlsdGluID0gdHJ1ZTsKICAgICAgICAgICAgICAgIHN0YXRlLmJlZm9yZVBhcmFtcyA9IHRydWU7CiAgICAgICAgICAgICAgICByZXR1cm4gImJ1aWx0aW4iOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIGlzIGl0IGEgb3BlcmF0b3I/CiAgICAgICAgZWxzZSBpZiAoaXNPcGVyYXRvckNoYXIudGVzdChjaCkpIHsKICAgICAgICAgICAgc3RhdGUubGFzdFRva2VuV2FzQnVpbHRpbiA9IGZhbHNlOwogICAgICAgICAgICBzdHJlYW0uZWF0V2hpbGUoaXNPcGVyYXRvckNoYXIpOwogICAgICAgICAgICByZXR1cm4gIm9wZXJhdG9yIjsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIC8vIGdldCB0aGUgd2hvbGUgd29yZAogICAgICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcd1wkX3t9QF0vKTsKICAgICAgICAgICAgdmFyIHdvcmQgPSBzdHJlYW0uY3VycmVudCgpOwogICAgICAgICAgICAvLyBpcyBpdCBvbmUgb2YgdGhlIGxpc3RlZCBrZXl3b3Jkcz8KICAgICAgICAgICAgaWYgKGtleXdvcmRzICYmIGtleXdvcmRzLnByb3BlcnR5SXNFbnVtZXJhYmxlKHdvcmQpKQogICAgICAgICAgICAgICAgcmV0dXJuICJrZXl3b3JkIjsKICAgICAgICAgICAgLy8gaXMgaXQgb25lIG9mIHRoZSBsaXN0ZWQgZnVuY3Rpb25zPwogICAgICAgICAgICBpZiAoZnVuY3Rpb25zICYmIGZ1bmN0aW9ucy5wcm9wZXJ0eUlzRW51bWVyYWJsZSh3b3JkKSB8fAogICAgICAgICAgICAgICAgICAgIChzdHJlYW0uY3VycmVudCgpLm1hdGNoKC9eI0A/W2EtejAtOV9dKyAqJC9pKSAmJiBzdHJlYW0ucGVlaygpPT0iKCIpICYmCiAgICAgICAgICAgICAgICAgICAgICEoZnVuY3Rpb25zICYmIGZ1bmN0aW9ucy5wcm9wZXJ0eUlzRW51bWVyYWJsZSh3b3JkLnRvTG93ZXJDYXNlKCkpKSkgewogICAgICAgICAgICAgICAgc3RhdGUuYmVmb3JlUGFyYW1zID0gdHJ1ZTsKICAgICAgICAgICAgICAgIHN0YXRlLmxhc3RUb2tlbldhc0J1aWx0aW4gPSBmYWxzZTsKICAgICAgICAgICAgICAgIHJldHVybiAia2V5d29yZCI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHN0YXRlLmluU3RyaW5nKSB7CiAgICAgICAgICAgICAgICBzdGF0ZS5sYXN0VG9rZW5XYXNCdWlsdGluID0gZmFsc2U7CiAgICAgICAgICAgICAgICByZXR1cm4gInN0cmluZyI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHN0cmVhbS5wb3MgPiB3b3JkLmxlbmd0aCAmJiBzdHJlYW0uc3RyaW5nLmNoYXJBdChzdHJlYW0ucG9zLXdvcmQubGVuZ3RoLTEpPT0iLiIgJiYgc3RhdGUubGFzdFRva2VuV2FzQnVpbHRpbikKICAgICAgICAgICAgICAgIHJldHVybiAiYnVpbHRpbiI7CiAgICAgICAgICAgIC8vIGRlZmF1bHQ6IGp1c3QgYSAid29yZCIKICAgICAgICAgICAgc3RhdGUubGFzdFRva2VuV2FzQnVpbHRpbiA9IGZhbHNlOwogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gdG9rZW5TdHJpbmcocXVvdGUpIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICAgICAgICB2YXIgZXNjYXBlZCA9IGZhbHNlLCBuZXh0LCBlbmQgPSBmYWxzZTsKICAgICAgICAgICAgd2hpbGUgKChuZXh0ID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgaWYgKChuZXh0ID09IHF1b3RlKSAmJiAhZXNjYXBlZCkgewogICAgICAgICAgICAgICAgICAgIGVuZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAocXVvdGU9PSciJyAmJiBzdHJlYW0ucGVlaygpID09ICckJyAmJiAhZXNjYXBlZCkgewogICAgICAgICAgICAgICAgICAgIHN0YXRlLmluU3RyaW5nID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBlbmQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZXNjYXBlZCA9ICFlc2NhcGVkICYmIG5leHQgPT0gIlxcIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZW5kKSBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTsKICAgICAgICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gdG9rZW5Db21tZW50KHN0cmVhbSwgc3RhdGUpIHsKICAgICAgICB2YXIgbWF5YmVFbmQgPSBmYWxzZSwgY2g7CiAgICAgICAgd2hpbGUgKGNoID0gc3RyZWFtLm5leHQoKSkgewogICAgICAgICAgICBpZiAoY2ggPT0gIiMiICYmIG1heWJlRW5kKSB7CiAgICAgICAgICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG1heWJlRW5kID0gKGNoID09ICIqIik7CiAgICAgICAgfQogICAgICAgIHJldHVybiAiY29tbWVudCI7CiAgICB9CgogICAgZnVuY3Rpb24gdG9rZW5VbnBhcnNlZChzdHJlYW0sIHN0YXRlKSB7CiAgICAgICAgdmFyIG1heWJlRW5kID0gMCwgY2g7CiAgICAgICAgd2hpbGUgKGNoID0gc3RyZWFtLm5leHQoKSkgewogICAgICAgICAgICBpZiAoY2ggPT0gIiMiICYmIG1heWJlRW5kID09IDIpIHsKICAgICAgICAgICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGNoID09ICJdIikKICAgICAgICAgICAgICAgIG1heWJlRW5kKys7CiAgICAgICAgICAgIGVsc2UgaWYgKGNoICE9ICIgIikKICAgICAgICAgICAgICAgIG1heWJlRW5kID0gMDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICJtZXRhIjsKICAgIH0KICAgIC8vIEludGVyZmFjZQoKICAgIHJldHVybiB7CiAgICAgICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICB0b2tlbml6ZTogdG9rZW5CYXNlLAogICAgICAgICAgICAgICAgYmVmb3JlUGFyYW1zOiBmYWxzZSwKICAgICAgICAgICAgICAgIGluUGFyYW1zOiBmYWxzZSwKICAgICAgICAgICAgICAgIGluU3RyaW5nOiBmYWxzZSwKICAgICAgICAgICAgICAgIGxhc3RUb2tlbldhc0J1aWx0aW46IGZhbHNlCiAgICAgICAgICAgIH07CiAgICAgICAgfSwKCiAgICAgICAgdG9rZW46IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgICAgICAgaWYgKHN0cmVhbS5lYXRTcGFjZSgpKSByZXR1cm4gbnVsbDsKICAgICAgICAgICAgcmV0dXJuIHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgICAgIH0sCiAgICAgICAgYmxvY2tDb21tZW50U3RhcnQ6ICIjKiIsCiAgICAgICAgYmxvY2tDb21tZW50RW5kOiAiKiMiLAogICAgICAgIGxpbmVDb21tZW50OiAiIyMiLAogICAgICAgIGZvbGQ6ICJ2ZWxvY2l0eSIKICAgIH07Cn0pOwoKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3ZlbG9jaXR5IiwgInZlbG9jaXR5Iik7Cgp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/verilog/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/verilog/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogVmVyaWxvZy9TeXN0ZW1WZXJpbG9nIG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vLi4vYWRkb24vZWRpdC9tYXRjaGJyYWNrZXRzLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9InZlcmlsb2cuanMiPjwvc2NyaXB0Pgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPi5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazt9PC9zdHlsZT4KPGRpdiBpZD1uYXY+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aDE+Q29kZU1pcnJvcjwvaDE+PGltZyBpZD1sb2dvIHNyYz0iLi4vLi4vZG9jL2xvZ28ucG5nIj48L2E+CgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9pbmRleC5odG1sIj5Ib21lPC9hPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2RvYy9tYW51YWwuaHRtbCI+TWFudWFsPC9hPgogICAgPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jb2RlbWlycm9yL2NvZGVtaXJyb3IiPkNvZGU8L2E+CiAgPC91bD4KICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vaW5kZXguaHRtbCI+TGFuZ3VhZ2UgbW9kZXM8L2E+CiAgICA8bGk+PGEgY2xhc3M9YWN0aXZlIGhyZWY9IiMiPlZlcmlsb2cvU3lzdGVtVmVyaWxvZzwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+U3lzdGVtVmVyaWxvZyBtb2RlPC9oMj4KCjxkaXY+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KLy8gTGl0ZXJhbHMKMSdiMAoxJ2J4CjEnYnoKMTYnaERDNzgKJ2hkZWFkYmVlZgonYjAwMTF4eHp6CjEyMzQKMzInZDU2NzgKMy40ZTYKLTEyOC43CgovLyBNYWNybyBkZWZpbml0aW9uCmBkZWZpbmUgQlVTX1dJRFRIID0gODsKCi8vIE1vZHVsZSBkZWZpbml0aW9uCm1vZHVsZSBibG9jaygKICBpbnB1dCAgICAgICAgICAgICAgICAgICBjbGssCiAgaW5wdXQgICAgICAgICAgICAgICAgICAgcnN0X24sCiAgaW5wdXQgIFtgQlVTX1dJRFRILTE6MF0gZGF0YV9pbiwKICBvdXRwdXQgW2BCVVNfV0lEVEgtMTowXSBkYXRhX291dAopOwogIAogIGFsd2F5cyBAKHBvc2VkZ2UgY2xrIG9yIG5lZ2VkZ2UgcnN0X24pIGJlZ2luCgogICAgaWYgKH5yc3RfbikgYmVnaW4KICAgICAgZGF0YV9vdXQgPD0gOCdiMDsKICAgIGVuZCBlbHNlIGJlZ2luCiAgICAgIGRhdGFfb3V0IDw9IGRhdGFfaW47CiAgICBlbmQKICAgIAogICAgaWYgKH5yc3RfbikKICAgICAgZGF0YV9vdXQgPD0gOCdiMDsKICAgIGVsc2UKICAgICAgZGF0YV9vdXQgPD0gZGF0YV9pbjsKICAgIAogICAgaWYgKH5yc3RfbikKICAgICAgYmVnaW4KICAgICAgICBkYXRhX291dCA8PSA4J2IwOwogICAgICBlbmQKICAgIGVsc2UKICAgICAgYmVnaW4KICAgICAgICBkYXRhX291dCA8PSBkYXRhX2luOwogICAgICBlbmQKCiAgZW5kCiAgCmVuZG1vZHVsZQoKLy8gQ2xhc3MgZGVmaW5pdGlvbgpjbGFzcyB0ZXN0OwoKICAvKioKICAgKiBTdW0gdHdvIGludGVnZXJzCiAgICovCiAgZnVuY3Rpb24gaW50IHN1bShpbnQgYSwgaW50IGIpOwogICAgaW50IHJlc3VsdCA9IGEgKyBiOwogICAgc3RyaW5nIG1zZyA9ICRzZm9ybWF0ZigiJWQgKyAlZCA9ICVkIiwgYSwgYiwgcmVzdWx0KTsKICAgICRkaXNwbGF5KG1zZyk7CiAgICByZXR1cm4gcmVzdWx0OwogIGVuZGZ1bmN0aW9uCiAgCiAgdGFzayBkZWxheShpbnQgbnVtX2N5Y2xlcyk7CiAgICByZXBlYXQobnVtX2N5Y2xlcykgIzE7CiAgZW5kdGFzawogIAplbmRjbGFzcwoKPC90ZXh0YXJlYT48L2Rpdj4KCjxzY3JpcHQ+CiAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgbWF0Y2hCcmFja2V0czogdHJ1ZSwKICAgIG1vZGU6IHsKICAgICAgbmFtZTogInZlcmlsb2ciLAogICAgICBub0luZGVudEtleXdvcmRzOiBbInBhY2thZ2UiXQogICAgfQogIH0pOwo8L3NjcmlwdD4KCjxwPgpTeW50YXggaGlnaGxpZ2h0aW5nIGFuZCBpbmRlbnRhdGlvbiBmb3IgdGhlIFZlcmlsb2cgYW5kIFN5c3RlbVZlcmlsb2cgbGFuZ3VhZ2VzIChJRUVFIDE4MDApLgo8aDI+Q29uZmlndXJhdGlvbiBvcHRpb25zOjwvaDI+CiAgPHVsPgogICAgPGxpPjxzdHJvbmc+bm9JbmRlbnRLZXl3b3Jkczwvc3Ryb25nPiAtIExpc3Qgb2Yga2V5d29yZHMgd2hpY2ggc2hvdWxkIG5vdCBjYXVzZSBpbmRlbnRhdGlvbiB0byBpbmNyZWFzZS4gRS5nLiBbInBhY2thZ2UiLCAibW9kdWxlIl0uIERlZmF1bHQ6IE5vbmU8L2xpPgogIDwvdWw+CjwvcD4KCjxwPjxzdHJvbmc+TUlNRSB0eXBlcyBkZWZpbmVkOjwvc3Ryb25nPiA8Y29kZT50ZXh0L3gtdmVyaWxvZzwvY29kZT4gYW5kIDxjb2RlPnRleHQveC1zeXN0ZW12ZXJpbG9nPC9jb2RlPi48L3A+CjwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/verilog/test.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24oKSB7CiAgdmFyIG1vZGUgPSBDb2RlTWlycm9yLmdldE1vZGUoe2luZGVudFVuaXQ6IDR9LCAidmVyaWxvZyIpOwogIGZ1bmN0aW9uIE1UKG5hbWUpIHsgdGVzdC5tb2RlKG5hbWUsIG1vZGUsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpOyB9CgogIE1UKCJiaW5hcnlfbGl0ZXJhbHMiLAogICAgICJbbnVtYmVyIDEnYjBdIiwKICAgICAiW251bWJlciAxJ2IxXSIsCiAgICAgIltudW1iZXIgMSdieF0iLAogICAgICJbbnVtYmVyIDEnYnpdIiwKICAgICAiW251bWJlciAxJ2JYXSIsCiAgICAgIltudW1iZXIgMSdiWl0iLAogICAgICJbbnVtYmVyIDEnQjBdIiwKICAgICAiW251bWJlciAxJ0IxXSIsCiAgICAgIltudW1iZXIgMSdCeF0iLAogICAgICJbbnVtYmVyIDEnQnpdIiwKICAgICAiW251bWJlciAxJ0JYXSIsCiAgICAgIltudW1iZXIgMSdCWl0iLAogICAgICJbbnVtYmVyIDEnYjBdIiwKICAgICAiW251bWJlciAxJ2IxXSIsCiAgICAgIltudW1iZXIgMidiMDFdIiwKICAgICAiW251bWJlciAyJ2J4el0iLAogICAgICJbbnVtYmVyIDInYjExXSIsCiAgICAgIltudW1iZXIgMidiMTBdIiwKICAgICAiW251bWJlciAyJ2IxWl0iLAogICAgICJbbnVtYmVyIDEyJ2IwMTAxXzAxMDFfMDEwMV0iLAogICAgICJbbnVtYmVyIDEnYiAwXSIsCiAgICAgIltudW1iZXIgJ2IwMTAxXSIKICApOwoKICBNVCgib2N0YWxfbGl0ZXJhbHMiLAogICAgICJbbnVtYmVyIDMnbzddIiwKICAgICAiW251bWJlciAzJ083XSIsCiAgICAgIltudW1iZXIgMydzbzddIiwKICAgICAiW251bWJlciAzJ1NPN10iCiAgKTsKCiAgTVQoImRlY2ltYWxfbGl0ZXJhbHMiLAogICAgICJbbnVtYmVyIDBdIiwKICAgICAiW251bWJlciAxXSIsCiAgICAgIltudW1iZXIgN10iLAogICAgICJbbnVtYmVyIDEyM180NTZdIiwKICAgICAiW251bWJlciAnZDMzXSIsCiAgICAgIltudW1iZXIgOCdkMjU1XSIsCiAgICAgIltudW1iZXIgOCdEMjU1XSIsCiAgICAgIltudW1iZXIgOCdzZDI1NV0iLAogICAgICJbbnVtYmVyIDgnU0QyNTVdIiwKICAgICAiW251bWJlciAzMidkMTIzXSIsCiAgICAgIltudW1iZXIgMzIgJ2QxMjNdIiwKICAgICAiW251bWJlciAzMiAnZCAxMjNdIgogICk7CgogIE1UKCJoZXhfbGl0ZXJhbHMiLAogICAgICJbbnVtYmVyIDQnaDBdIiwKICAgICAiW251bWJlciA0J2hhXSIsCiAgICAgIltudW1iZXIgNCdoRl0iLAogICAgICJbbnVtYmVyIDQnaHhdIiwKICAgICAiW251bWJlciA0J2h6XSIsCiAgICAgIltudW1iZXIgNCdoWF0iLAogICAgICJbbnVtYmVyIDQnaFpdIiwKICAgICAiW251bWJlciAzMidoZGM3OF0iLAogICAgICJbbnVtYmVyIDMyJ2hEQzc4XSIsCiAgICAgIltudW1iZXIgMzIgJ2hEQzc4XSIsCiAgICAgIltudW1iZXIgMzInaCBEQzc4XSIsCiAgICAgIltudW1iZXIgMzIgJ2ggREM3OF0iLAogICAgICJbbnVtYmVyIDMyJ2g0NHg3XSIsCiAgICAgIltudW1iZXIgMzInaEZGRj9dIgogICk7CgogIE1UKCJyZWFsX251bWJlcl9saXRlcmFscyIsCiAgICAgIltudW1iZXIgMS4yXSIsCiAgICAgIltudW1iZXIgMC4xXSIsCiAgICAgIltudW1iZXIgMjM5NC4yNjMzMV0iLAogICAgICJbbnVtYmVyIDEuMkUxMl0iLAogICAgICJbbnVtYmVyIDEuMmUxMl0iLAogICAgICJbbnVtYmVyIDEuMzBlLTJdIiwKICAgICAiW251bWJlciAwLjFlLTBdIiwKICAgICAiW251bWJlciAyM0UxMF0iLAogICAgICJbbnVtYmVyIDI5RS0yXSIsCiAgICAgIltudW1iZXIgMjM2LjEyM183NjNfZS0xMl0iCiAgKTsKCiAgTVQoIm9wZXJhdG9ycyIsCiAgICAgIlttZXRhIF5dIgogICk7CgogIE1UKCJrZXl3b3JkcyIsCiAgICAgIltrZXl3b3JkIGxvZ2ljXSIsCiAgICAgIltrZXl3b3JkIGxvZ2ljXSBbdmFyaWFibGUgZm9vXSIsCiAgICAgIltrZXl3b3JkIHJlZ10gW3ZhcmlhYmxlIGFiY10iCiAgKTsKCiAgTVQoInZhcmlhYmxlcyIsCiAgICAgIlt2YXJpYWJsZSBfbGVhZGluZ191bmRlcnNjb3JlXSIsCiAgICAgIlt2YXJpYWJsZSBfaWZdIiwKICAgICAiW251bWJlciAxMl0gW3ZhcmlhYmxlIGZvb10iLAogICAgICJbdmFyaWFibGUgZm9vXSBbbnVtYmVyIDE0XSIKICApOwoKICBNVCgidGlja19kZWZpbmVzIiwKICAgICAiW2RlZiBgRk9PXSIsCiAgICAgIltkZWYgYGZvb10iLAogICAgICJbZGVmIGBGT09fYmFyXSIKICApOwoKICBNVCgic3lzdGVtX2NhbGxzIiwKICAgICAiW21ldGEgJGRpc3BsYXldIiwKICAgICAiW21ldGEgJHZwaV9wcmludGZdIgogICk7CgogIE1UKCJsaW5lX2NvbW1lbnQiLCAiW2NvbW1lbnQgLy8gSGVsbG8gd29ybGRdIik7CgogIC8vIEFsaWdubWVudCB0ZXN0cwogIE1UKCJhbGlnbl9wb3J0X21hcF9zdHlsZTEiLAogICAgIC8qKgogICAgICAqIG1vZCBtb2QoLmEoYSksCiAgICAgICogICAgICAgICAuYihiKQogICAgICAqICAgICAgICApOwogICAgICAqLwogICAgICJbdmFyaWFibGUgbW9kXSBbdmFyaWFibGUgbW9kXVticmFja2V0IChdLlt2YXJpYWJsZSBhXVticmFja2V0IChdW3ZhcmlhYmxlIGFdW2JyYWNrZXQgKV0sIiwKICAgICAiICAgICAgICAuW3ZhcmlhYmxlIGJdW2JyYWNrZXQgKF1bdmFyaWFibGUgYl1bYnJhY2tldCApXSIsCiAgICAgIiAgICAgICBbYnJhY2tldCApXTsiLAogICAgICIiCiAgKTsKCiAgTVQoImFsaWduX3BvcnRfbWFwX3N0eWxlMiIsCiAgICAgLyoqCiAgICAgICogbW9kIG1vZCgKICAgICAgKiAgICAgLmEoYSksCiAgICAgICogICAgIC5iKGIpCiAgICAgICogKTsKICAgICAgKi8KICAgICAiW3ZhcmlhYmxlIG1vZF0gW3ZhcmlhYmxlIG1vZF1bYnJhY2tldCAoXSIsCiAgICAgIiAgICAuW3ZhcmlhYmxlIGFdW2JyYWNrZXQgKF1bdmFyaWFibGUgYV1bYnJhY2tldCApXSwiLAogICAgICIgICAgLlt2YXJpYWJsZSBiXVticmFja2V0IChdW3ZhcmlhYmxlIGJdW2JyYWNrZXQgKV0iLAogICAgICJbYnJhY2tldCApXTsiLAogICAgICIiCiAgKTsKCiAgLy8gSW5kZW50YXRpb24gdGVzdHMKICBNVCgiaW5kZW50X3NpbmdsZV9zdGF0ZW1lbnRfaWYiLAogICAgICAiW2tleXdvcmQgaWZdIFticmFja2V0IChdW3ZhcmlhYmxlIGZvb11bYnJhY2tldCApXSIsCiAgICAgICIgICAgW2tleXdvcmQgYnJlYWtdOyIsCiAgICAgICIiCiAgKTsKCiAgTVQoIm5vX2luZGVudF9hZnRlcl9zaW5nbGVfbGluZV9pZiIsCiAgICAgICJba2V5d29yZCBpZl0gW2JyYWNrZXQgKF1bdmFyaWFibGUgZm9vXVticmFja2V0ICldIFtrZXl3b3JkIGJyZWFrXTsiLAogICAgICAiIgogICk7CgogIE1UKCJpbmRlbnRfYWZ0ZXJfaWZfYmVnaW5fc2FtZV9saW5lIiwKICAgICAgIltrZXl3b3JkIGlmXSBbYnJhY2tldCAoXVt2YXJpYWJsZSBmb29dW2JyYWNrZXQgKV0gW2tleXdvcmQgYmVnaW5dIiwKICAgICAgIiAgICBba2V5d29yZCBicmVha107IiwKICAgICAgIiAgICBba2V5d29yZCBicmVha107IiwKICAgICAgIltrZXl3b3JkIGVuZF0iLAogICAgICAiIgogICk7CgogIE1UKCJpbmRlbnRfYWZ0ZXJfaWZfYmVnaW5fbmV4dF9saW5lIiwKICAgICAgIltrZXl3b3JkIGlmXSBbYnJhY2tldCAoXVt2YXJpYWJsZSBmb29dW2JyYWNrZXQgKV0iLAogICAgICAiICAgIFtrZXl3b3JkIGJlZ2luXSIsCiAgICAgICIgICAgICAgIFtrZXl3b3JkIGJyZWFrXTsiLAogICAgICAiICAgICAgICBba2V5d29yZCBicmVha107IiwKICAgICAgIiAgICBba2V5d29yZCBlbmRdIiwKICAgICAgIiIKICApOwoKICBNVCgiaW5kZW50X3NpbmdsZV9zdGF0ZW1lbnRfaWZfZWxzZSIsCiAgICAgICJba2V5d29yZCBpZl0gW2JyYWNrZXQgKF1bdmFyaWFibGUgZm9vXVticmFja2V0ICldIiwKICAgICAgIiAgICBba2V5d29yZCBicmVha107IiwKICAgICAgIltrZXl3b3JkIGVsc2VdIiwKICAgICAgIiAgICBba2V5d29yZCBicmVha107IiwKICAgICAgIiIKICApOwoKICBNVCgiaW5kZW50X2lmX2Vsc2VfYmVnaW5fc2FtZV9saW5lIiwKICAgICAgIltrZXl3b3JkIGlmXSBbYnJhY2tldCAoXVt2YXJpYWJsZSBmb29dW2JyYWNrZXQgKV0gW2tleXdvcmQgYmVnaW5dIiwKICAgICAgIiAgICBba2V5d29yZCBicmVha107IiwKICAgICAgIiAgICBba2V5d29yZCBicmVha107IiwKICAgICAgIltrZXl3b3JkIGVuZF0gW2tleXdvcmQgZWxzZV0gW2tleXdvcmQgYmVnaW5dIiwKICAgICAgIiAgICBba2V5d29yZCBicmVha107IiwKICAgICAgIiAgICBba2V5d29yZCBicmVha107IiwKICAgICAgIltrZXl3b3JkIGVuZF0iLAogICAgICAiIgogICk7CgogIE1UKCJpbmRlbnRfaWZfZWxzZV9iZWdpbl9uZXh0X2xpbmUiLAogICAgICAiW2tleXdvcmQgaWZdIFticmFja2V0IChdW3ZhcmlhYmxlIGZvb11bYnJhY2tldCApXSIsCiAgICAgICIgICAgW2tleXdvcmQgYmVnaW5dIiwKICAgICAgIiAgICAgICAgW2tleXdvcmQgYnJlYWtdOyIsCiAgICAgICIgICAgICAgIFtrZXl3b3JkIGJyZWFrXTsiLAogICAgICAiICAgIFtrZXl3b3JkIGVuZF0iLAogICAgICAiW2tleXdvcmQgZWxzZV0iLAogICAgICAiICAgIFtrZXl3b3JkIGJlZ2luXSIsCiAgICAgICIgICAgICAgIFtrZXl3b3JkIGJyZWFrXTsiLAogICAgICAiICAgICAgICBba2V5d29yZCBicmVha107IiwKICAgICAgIiAgICBba2V5d29yZCBlbmRdIiwKICAgICAgIiIKICApOwoKICBNVCgiaW5kZW50X2lmX25lc3RlZF93aXRob3V0X2JlZ2luIiwKICAgICAgIltrZXl3b3JkIGlmXSBbYnJhY2tldCAoXVt2YXJpYWJsZSBmb29dW2JyYWNrZXQgKV0iLAogICAgICAiICAgIFtrZXl3b3JkIGlmXSBbYnJhY2tldCAoXVt2YXJpYWJsZSBmb29dW2JyYWNrZXQgKV0iLAogICAgICAiICAgICAgICBba2V5d29yZCBpZl0gW2JyYWNrZXQgKF1bdmFyaWFibGUgZm9vXVticmFja2V0ICldIiwKICAgICAgIiAgICAgICAgICAgIFtrZXl3b3JkIGJyZWFrXTsiLAogICAgICAiIgogICk7CgogIE1UKCJpbmRlbnRfY2FzZSIsCiAgICAgICJba2V5d29yZCBjYXNlXSBbYnJhY2tldCAoXVt2YXJpYWJsZSBzdGF0ZV1bYnJhY2tldCApXSIsCiAgICAgICIgICAgW3ZhcmlhYmxlIEZPT106IiwKICAgICAgIiAgICAgICAgW2tleXdvcmQgYnJlYWtdOyIsCiAgICAgICIgICAgW3ZhcmlhYmxlIEJBUl06IiwKICAgICAgIiAgICAgICAgW2tleXdvcmQgYnJlYWtdOyIsCiAgICAgICJba2V5d29yZCBlbmRjYXNlXSIsCiAgICAgICIiCiAgKTsKCiAgTVQoInVuaW5kZW50X2FmdGVyX2VuZF93aXRoX3ByZWNlZGluZ190ZXh0IiwKICAgICAgIltrZXl3b3JkIGJlZ2luXSIsCiAgICAgICIgICAgW2tleXdvcmQgYnJlYWtdOyBba2V5d29yZCBlbmRdIiwKICAgICAgIiIKICApOwoKICBNVCgiZXhwb3J0X2Z1bmN0aW9uX29uZV9saW5lX2RvZXNfbm90X2luZGVudCIsCiAgICAgIltrZXl3b3JkIGV4cG9ydF0gW3N0cmluZyBcIkRQSS1DXCJdIFtrZXl3b3JkIGZ1bmN0aW9uXSBbdmFyaWFibGUgaGVsbG9Gcm9tU1ZdOyIsCiAgICAgIiIKICApOwoKICBNVCgiZXhwb3J0X3Rhc2tfb25lX2xpbmVfZG9lc19ub3RfaW5kZW50IiwKICAgICAiW2tleXdvcmQgZXhwb3J0XSBbc3RyaW5nIFwiRFBJLUNcIl0gW2tleXdvcmQgdGFza10gW3ZhcmlhYmxlIGhlbGxvRnJvbVNWXTsiLAogICAgICIiCiAgKTsKCiAgTVQoImV4cG9ydF9mdW5jdGlvbl90d29fbGluZXNfaW5kZW50c19wcm9wZXJseSIsCiAgICAiW2tleXdvcmQgZXhwb3J0XSIsCiAgICAiICAgIFtzdHJpbmcgXCJEUEktQ1wiXSBba2V5d29yZCBmdW5jdGlvbl0gW3ZhcmlhYmxlIGhlbGxvRnJvbVNWXTsiLAogICAgIiIKICApOwoKICBNVCgiZXhwb3J0X3Rhc2tfdHdvX2xpbmVzX2luZGVudHNfcHJvcGVybHkiLAogICAgIltrZXl3b3JkIGV4cG9ydF0iLAogICAgIiAgICBbc3RyaW5nIFwiRFBJLUNcIl0gW2tleXdvcmQgdGFza10gW3ZhcmlhYmxlIGhlbGxvRnJvbVNWXTsiLAogICAgIiIKICApOwoKICBNVCgiaW1wb3J0X2Z1bmN0aW9uX29uZV9saW5lX2RvZXNfbm90X2luZGVudCIsCiAgICAiW2tleXdvcmQgaW1wb3J0XSBbc3RyaW5nIFwiRFBJLUNcIl0gW2tleXdvcmQgZnVuY3Rpb25dIFt2YXJpYWJsZSBoZWxsb0Zyb21DXTsiLAogICAgIiIKICApOwoKICBNVCgiaW1wb3J0X3Rhc2tfb25lX2xpbmVfZG9lc19ub3RfaW5kZW50IiwKICAgICJba2V5d29yZCBpbXBvcnRdIFtzdHJpbmcgXCJEUEktQ1wiXSBba2V5d29yZCB0YXNrXSBbdmFyaWFibGUgaGVsbG9Gcm9tQ107IiwKICAgICIiCiAgKTsKCiAgTVQoImltcG9ydF9wYWNrYWdlX3NpbmdsZV9saW5lX2RvZXNfbm90X2luZGVudCIsCiAgICAiW2tleXdvcmQgaW1wb3J0XSBbdmFyaWFibGUgcF06Olt2YXJpYWJsZSB4XTsiLAogICAgIltrZXl3b3JkIGltcG9ydF0gW3ZhcmlhYmxlIHBdOjpbdmFyaWFibGUgeV07IiwKICAgICIiCiAgKTsKCiAgTVQoImNvdmVyZ3JvdXBfd2l0aF9mdW5jdGlvbl9pbmRlbnRzX3Byb3Blcmx5IiwKICAgICJba2V5d29yZCBjb3Zlcmdyb3VwXSBbdmFyaWFibGUgY2ddIFtrZXl3b3JkIHdpdGhdIFtrZXl3b3JkIGZ1bmN0aW9uXSBbdmFyaWFibGUgc2FtcGxlXVticmFja2V0IChdW2tleXdvcmQgYml0XSBbdmFyaWFibGUgYl1bYnJhY2tldCApXTsiLAogICAgIiAgICBbdmFyaWFibGUgY10gOiBba2V5d29yZCBjb3ZlcnBvaW50XSBbdmFyaWFibGUgY107IiwKICAgICJba2V5d29yZCBlbmRncm91cF06IFt2YXJpYWJsZSBjZ10iLAogICAgIiIKICApOwoKfSkoKTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/verilog/verilog.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJ2ZXJpbG9nIiwgZnVuY3Rpb24oY29uZmlnLCBwYXJzZXJDb25maWcpIHsKCiAgdmFyIGluZGVudFVuaXQgPSBjb25maWcuaW5kZW50VW5pdCwKICAgICAgc3RhdGVtZW50SW5kZW50VW5pdCA9IHBhcnNlckNvbmZpZy5zdGF0ZW1lbnRJbmRlbnRVbml0IHx8IGluZGVudFVuaXQsCiAgICAgIGRvbnRBbGlnbkNhbGxzID0gcGFyc2VyQ29uZmlnLmRvbnRBbGlnbkNhbGxzLAogICAgICBub0luZGVudEtleXdvcmRzID0gcGFyc2VyQ29uZmlnLm5vSW5kZW50S2V5d29yZHMgfHwgW10sCiAgICAgIG11bHRpTGluZVN0cmluZ3MgPSBwYXJzZXJDb25maWcubXVsdGlMaW5lU3RyaW5ncywKICAgICAgaG9va3MgPSBwYXJzZXJDb25maWcuaG9va3MgfHwge307CgogIGZ1bmN0aW9uIHdvcmRzKHN0cikgewogICAgdmFyIG9iaiA9IHt9LCB3b3JkcyA9IHN0ci5zcGxpdCgiICIpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCB3b3Jkcy5sZW5ndGg7ICsraSkgb2JqW3dvcmRzW2ldXSA9IHRydWU7CiAgICByZXR1cm4gb2JqOwogIH0KCiAgLyoqCiAgICogS2V5d29yZHMgZnJvbSBJRUVFIDE4MDAtMjAxMgogICAqLwogIHZhciBrZXl3b3JkcyA9IHdvcmRzKAogICAgImFjY2VwdF9vbiBhbGlhcyBhbHdheXMgYWx3YXlzX2NvbWIgYWx3YXlzX2ZmIGFsd2F5c19sYXRjaCBhbmQgYXNzZXJ0IGFzc2lnbiBhc3N1bWUgYXV0b21hdGljIGJlZm9yZSBiZWdpbiBiaW5kICIgKwogICAgImJpbnMgYmluc29mIGJpdCBicmVhayBidWYgYnVmaWYwIGJ1ZmlmMSBieXRlIGNhc2UgY2FzZXggY2FzZXogY2VsbCBjaGFuZGxlIGNoZWNrZXIgY2xhc3MgY2xvY2tpbmcgY21vcyBjb25maWcgIiArCiAgICAiY29uc3QgY29uc3RyYWludCBjb250ZXh0IGNvbnRpbnVlIGNvdmVyIGNvdmVyZ3JvdXAgY292ZXJwb2ludCBjcm9zcyBkZWFzc2lnbiBkZWZhdWx0IGRlZnBhcmFtIGRlc2lnbiBkaXNhYmxlICIgKwogICAgImRpc3QgZG8gZWRnZSBlbHNlIGVuZCBlbmRjYXNlIGVuZGNoZWNrZXIgZW5kY2xhc3MgZW5kY2xvY2tpbmcgZW5kY29uZmlnIGVuZGZ1bmN0aW9uIGVuZGdlbmVyYXRlIGVuZGdyb3VwICIgKwogICAgImVuZGludGVyZmFjZSBlbmRtb2R1bGUgZW5kcGFja2FnZSBlbmRwcmltaXRpdmUgZW5kcHJvZ3JhbSBlbmRwcm9wZXJ0eSBlbmRzcGVjaWZ5IGVuZHNlcXVlbmNlIGVuZHRhYmxlIGVuZHRhc2sgIiArCiAgICAiZW51bSBldmVudCBldmVudHVhbGx5IGV4cGVjdCBleHBvcnQgZXh0ZW5kcyBleHRlcm4gZmluYWwgZmlyc3RfbWF0Y2ggZm9yIGZvcmNlIGZvcmVhY2ggZm9yZXZlciBmb3JrIGZvcmtqb2luICIgKwogICAgImZ1bmN0aW9uIGdlbmVyYXRlIGdlbnZhciBnbG9iYWwgaGlnaHowIGhpZ2h6MSBpZiBpZmYgaWZub25lIGlnbm9yZV9iaW5zIGlsbGVnYWxfYmlucyBpbXBsZW1lbnRzIGltcGxpZXMgaW1wb3J0ICIgKwogICAgImluY2RpciBpbmNsdWRlIGluaXRpYWwgaW5vdXQgaW5wdXQgaW5zaWRlIGluc3RhbmNlIGludCBpbnRlZ2VyIGludGVyY29ubmVjdCBpbnRlcmZhY2UgaW50ZXJzZWN0IGpvaW4gam9pbl9hbnkgIiArCiAgICAiam9pbl9ub25lIGxhcmdlIGxldCBsaWJsaXN0IGxpYnJhcnkgbG9jYWwgbG9jYWxwYXJhbSBsb2dpYyBsb25naW50IG1hY3JvbW9kdWxlIG1hdGNoZXMgbWVkaXVtIG1vZHBvcnQgbW9kdWxlICIgKwogICAgIm5hbmQgbmVnZWRnZSBuZXR0eXBlIG5ldyBuZXh0dGltZSBubW9zIG5vciBub3Nob3djYW5jZWxsZWQgbm90IG5vdGlmMCBub3RpZjEgbnVsbCBvciBvdXRwdXQgcGFja2FnZSBwYWNrZWQgIiArCiAgICAicGFyYW1ldGVyIHBtb3MgcG9zZWRnZSBwcmltaXRpdmUgcHJpb3JpdHkgcHJvZ3JhbSBwcm9wZXJ0eSBwcm90ZWN0ZWQgcHVsbDAgcHVsbDEgcHVsbGRvd24gcHVsbHVwICIgKwogICAgInB1bHNlc3R5bGVfb25kZXRlY3QgcHVsc2VzdHlsZV9vbmV2ZW50IHB1cmUgcmFuZCByYW5kYyByYW5kY2FzZSByYW5kc2VxdWVuY2UgcmNtb3MgcmVhbCByZWFsdGltZSByZWYgcmVnICIgKwogICAgInJlamVjdF9vbiByZWxlYXNlIHJlcGVhdCByZXN0cmljdCByZXR1cm4gcm5tb3MgcnBtb3MgcnRyYW4gcnRyYW5pZjAgcnRyYW5pZjEgc19hbHdheXMgc19ldmVudHVhbGx5IHNfbmV4dHRpbWUgIiArCiAgICAic191bnRpbCBzX3VudGlsX3dpdGggc2NhbGFyZWQgc2VxdWVuY2Ugc2hvcnRpbnQgc2hvcnRyZWFsIHNob3djYW5jZWxsZWQgc2lnbmVkIHNtYWxsIHNvZnQgc29sdmUgc3BlY2lmeSAiICsKICAgICJzcGVjcGFyYW0gc3RhdGljIHN0cmluZyBzdHJvbmcgc3Ryb25nMCBzdHJvbmcxIHN0cnVjdCBzdXBlciBzdXBwbHkwIHN1cHBseTEgc3luY19hY2NlcHRfb24gc3luY19yZWplY3Rfb24gIiArCiAgICAidGFibGUgdGFnZ2VkIHRhc2sgdGhpcyB0aHJvdWdob3V0IHRpbWUgdGltZXByZWNpc2lvbiB0aW1ldW5pdCB0cmFuIHRyYW5pZjAgdHJhbmlmMSB0cmkgdHJpMCB0cmkxIHRyaWFuZCB0cmlvciAiICsKICAgICJ0cmlyZWcgdHlwZSB0eXBlZGVmIHVuaW9uIHVuaXF1ZSB1bmlxdWUwIHVuc2lnbmVkIHVudGlsIHVudGlsX3dpdGggdW50eXBlZCB1c2UgdXdpcmUgdmFyIHZlY3RvcmVkIHZpcnR1YWwgdm9pZCAiICsKICAgICJ3YWl0IHdhaXRfb3JkZXIgd2FuZCB3ZWFrIHdlYWswIHdlYWsxIHdoaWxlIHdpbGRjYXJkIHdpcmUgd2l0aCB3aXRoaW4gd29yIHhub3IgeG9yIik7CgogIC8qKiBPcGVyYXRvcnMgZnJvbSBJRUVFIDE4MDAtMjAxMgogICAgIHVuYXJ5X29wZXJhdG9yIDo6PQogICAgICAgKyB8IC0gfCAhIHwgfiB8ICYgfCB+JiB8IHwgfCB+fCB8IF4gfCB+XiB8IF5+CiAgICAgYmluYXJ5X29wZXJhdG9yIDo6PQogICAgICAgKyB8IC0gfCAqIHwgLyB8ICUgfCA9PSB8ICE9IHwgPT09IHwgIT09IHwgPT0/IHwgIT0/IHwgJiYgfCB8fCB8ICoqCiAgICAgICB8IDwgfCA8PSB8ID4gfCA+PSB8ICYgfCB8IHwgXiB8IF5+IHwgfl4gfCA+PiB8IDw8IHwgPj4+IHwgPDw8CiAgICAgICB8IC0+IHwgPC0+CiAgICAgaW5jX29yX2RlY19vcGVyYXRvciA6Oj0gKysgfCAtLQogICAgIHVuYXJ5X21vZHVsZV9wYXRoX29wZXJhdG9yIDo6PQogICAgICAgISB8IH4gfCAmIHwgfiYgfCB8IHwgfnwgfCBeIHwgfl4gfCBefgogICAgIGJpbmFyeV9tb2R1bGVfcGF0aF9vcGVyYXRvciA6Oj0KICAgICAgID09IHwgIT0gfCAmJiB8IHx8IHwgJiB8IHwgfCBeIHwgXn4gfCB+XgogICovCiAgdmFyIGlzT3BlcmF0b3JDaGFyID0gL1tcK1wtXCpcLyF+JnxeJT0/Ol0vOwogIHZhciBpc0JyYWNrZXRDaGFyID0gL1tcW1xde30oKV0vOwoKICB2YXIgdW5zaWduZWROdW1iZXIgPSAvXGRbMC05X10qLzsKICB2YXIgZGVjaW1hbExpdGVyYWwgPSAvXGQqXHMqJ3M/ZFxzKlxkWzAtOV9dKi9pOwogIHZhciBiaW5hcnlMaXRlcmFsID0gL1xkKlxzKidzP2JccypbeHowMV1beHowMV9dKi9pOwogIHZhciBvY3RMaXRlcmFsID0gL1xkKlxzKidzP29ccypbeHowLTddW3h6MC03X10qL2k7CiAgdmFyIGhleExpdGVyYWwgPSAvXGQqXHMqJ3M/aFxzKlswLTlhLWZ4ej9dWzAtOWEtZnh6P19dKi9pOwogIHZhciByZWFsTGl0ZXJhbCA9IC8oXGRbXGRfXSooXC5cZFtcZF9dKik/RS0/W1xkX10rKXwoXGRbXGRfXSpcLlxkW1xkX10qKS9pOwoKICB2YXIgY2xvc2luZ0JyYWNrZXRPcldvcmQgPSAvXigoXHcrKXxbKX1cXV0pLzsKICB2YXIgY2xvc2luZ0JyYWNrZXQgPSAvWyl9XF1dLzsKCiAgdmFyIGN1clB1bmM7CiAgdmFyIGN1cktleXdvcmQ7CgogIC8vIEJsb2NrIG9wZW5pbmdzIHdoaWNoIGFyZSBjbG9zZWQgYnkgYSBtYXRjaGluZyBrZXl3b3JkIGluIHRoZSBmb3JtIG9mICgiZW5kIiArIGtleXdvcmQpCiAgLy8gRS5nLiAidGFzayIgPT4gImVuZHRhc2siCiAgdmFyIGJsb2NrS2V5d29yZHMgPSB3b3JkcygKICAgICJjYXNlIGNoZWNrZXIgY2xhc3MgY2xvY2tpbmcgY29uZmlnIGZ1bmN0aW9uIGdlbmVyYXRlIGludGVyZmFjZSBtb2R1bGUgcGFja2FnZSIgKwogICAgInByaW1pdGl2ZSBwcm9ncmFtIHByb3BlcnR5IHNwZWNpZnkgc2VxdWVuY2UgdGFibGUgdGFzayIKICApOwoKICAvLyBPcGVuaW5nL2Nsb3NpbmcgcGFpcnMKICB2YXIgb3BlbkNsb3NlID0ge307CiAgZm9yICh2YXIga2V5d29yZCBpbiBibG9ja0tleXdvcmRzKSB7CiAgICBvcGVuQ2xvc2Vba2V5d29yZF0gPSAiZW5kIiArIGtleXdvcmQ7CiAgfQogIG9wZW5DbG9zZVsiYmVnaW4iXSA9ICJlbmQiOwogIG9wZW5DbG9zZVsiY2FzZXgiXSA9ICJlbmRjYXNlIjsKICBvcGVuQ2xvc2VbImNhc2V6Il0gPSAiZW5kY2FzZSI7CiAgb3BlbkNsb3NlWyJkbyIgICBdID0gIndoaWxlIjsKICBvcGVuQ2xvc2VbImZvcmsiIF0gPSAiam9pbjtqb2luX2FueTtqb2luX25vbmUiOwogIG9wZW5DbG9zZVsiY292ZXJncm91cCJdID0gImVuZGdyb3VwIjsKCiAgZm9yICh2YXIgaSBpbiBub0luZGVudEtleXdvcmRzKSB7CiAgICB2YXIga2V5d29yZCA9IG5vSW5kZW50S2V5d29yZHNbaV07CiAgICBpZiAob3BlbkNsb3NlW2tleXdvcmRdKSB7CiAgICAgIG9wZW5DbG9zZVtrZXl3b3JkXSA9IHVuZGVmaW5lZDsKICAgIH0KICB9CgogIC8vIEtleXdvcmRzIHdoaWNoIG9wZW4gc3RhdGVtZW50cyB0aGF0IGFyZSBlbmRlZCB3aXRoIGEgc2VtaS1jb2xvbgogIHZhciBzdGF0ZW1lbnRLZXl3b3JkcyA9IHdvcmRzKCJhbHdheXMgYWx3YXlzX2NvbWIgYWx3YXlzX2ZmIGFsd2F5c19sYXRjaCBhc3NlcnQgYXNzaWduIGFzc3VtZSBlbHNlIGV4cG9ydCBmb3IgZm9yZWFjaCBmb3JldmVyIGlmIGltcG9ydCBpbml0aWFsIHJlcGVhdCB3aGlsZSIpOwoKICBmdW5jdGlvbiB0b2tlbkJhc2Uoc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIGNoID0gc3RyZWFtLnBlZWsoKSwgc3R5bGU7CiAgICBpZiAoaG9va3NbY2hdICYmIChzdHlsZSA9IGhvb2tzW2NoXShzdHJlYW0sIHN0YXRlKSkgIT0gZmFsc2UpIHJldHVybiBzdHlsZTsKICAgIGlmIChob29rcy50b2tlbkJhc2UgJiYgKHN0eWxlID0gaG9va3MudG9rZW5CYXNlKHN0cmVhbSwgc3RhdGUpKSAhPSBmYWxzZSkKICAgICAgcmV0dXJuIHN0eWxlOwoKICAgIGlmICgvWyw7OlwuXS8udGVzdChjaCkpIHsKICAgICAgY3VyUHVuYyA9IHN0cmVhbS5uZXh0KCk7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgaWYgKGlzQnJhY2tldENoYXIudGVzdChjaCkpIHsKICAgICAgY3VyUHVuYyA9IHN0cmVhbS5uZXh0KCk7CiAgICAgIHJldHVybiAiYnJhY2tldCI7CiAgICB9CiAgICAvLyBNYWNyb3MgKHRpY2stZGVmaW5lcykKICAgIGlmIChjaCA9PSAnYCcpIHsKICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgaWYgKHN0cmVhbS5lYXRXaGlsZSgvW1x3XCRfXS8pKSB7CiAgICAgICAgcmV0dXJuICJkZWYiOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICB9CiAgICAvLyBTeXN0ZW0gY2FsbHMKICAgIGlmIChjaCA9PSAnJCcpIHsKICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgaWYgKHN0cmVhbS5lYXRXaGlsZSgvW1x3XCRfXS8pKSB7CiAgICAgICAgcmV0dXJuICJtZXRhIjsKICAgICAgfSBlbHNlIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgfQogICAgLy8gVGltZSBsaXRlcmFscwogICAgaWYgKGNoID09ICcjJykgewogICAgICBzdHJlYW0ubmV4dCgpOwogICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcZF8uXS8pOwogICAgICByZXR1cm4gImRlZiI7CiAgICB9CiAgICAvLyBTdHJpbmdzCiAgICBpZiAoY2ggPT0gJyInKSB7CiAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5TdHJpbmcoY2gpOwogICAgICByZXR1cm4gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CiAgICB9CiAgICAvLyBDb21tZW50cwogICAgaWYgKGNoID09ICIvIikgewogICAgICBzdHJlYW0ubmV4dCgpOwogICAgICBpZiAoc3RyZWFtLmVhdCgiKiIpKSB7CiAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkNvbW1lbnQ7CiAgICAgICAgcmV0dXJuIHRva2VuQ29tbWVudChzdHJlYW0sIHN0YXRlKTsKICAgICAgfQogICAgICBpZiAoc3RyZWFtLmVhdCgiLyIpKSB7CiAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICAgIHJldHVybiAiY29tbWVudCI7CiAgICAgIH0KICAgICAgc3RyZWFtLmJhY2tVcCgxKTsKICAgIH0KCiAgICAvLyBOdW1lcmljIGxpdGVyYWxzCiAgICBpZiAoc3RyZWFtLm1hdGNoKHJlYWxMaXRlcmFsKSB8fAogICAgICAgIHN0cmVhbS5tYXRjaChkZWNpbWFsTGl0ZXJhbCkgfHwKICAgICAgICBzdHJlYW0ubWF0Y2goYmluYXJ5TGl0ZXJhbCkgfHwKICAgICAgICBzdHJlYW0ubWF0Y2gob2N0TGl0ZXJhbCkgfHwKICAgICAgICBzdHJlYW0ubWF0Y2goaGV4TGl0ZXJhbCkgfHwKICAgICAgICBzdHJlYW0ubWF0Y2godW5zaWduZWROdW1iZXIpIHx8CiAgICAgICAgc3RyZWFtLm1hdGNoKHJlYWxMaXRlcmFsKSkgewogICAgICByZXR1cm4gIm51bWJlciI7CiAgICB9CgogICAgLy8gT3BlcmF0b3JzCiAgICBpZiAoc3RyZWFtLmVhdFdoaWxlKGlzT3BlcmF0b3JDaGFyKSkgewogICAgICByZXR1cm4gIm1ldGEiOwogICAgfQoKICAgIC8vIEtleXdvcmRzIC8gcGxhaW4gdmFyaWFibGVzCiAgICBpZiAoc3RyZWFtLmVhdFdoaWxlKC9bXHdcJF9dLykpIHsKICAgICAgdmFyIGN1ciA9IHN0cmVhbS5jdXJyZW50KCk7CiAgICAgIGlmIChrZXl3b3Jkc1tjdXJdKSB7CiAgICAgICAgaWYgKG9wZW5DbG9zZVtjdXJdKSB7CiAgICAgICAgICBjdXJQdW5jID0gIm5ld2Jsb2NrIjsKICAgICAgICB9CiAgICAgICAgaWYgKHN0YXRlbWVudEtleXdvcmRzW2N1cl0pIHsKICAgICAgICAgIGN1clB1bmMgPSAibmV3c3RhdGVtZW50IjsKICAgICAgICB9CiAgICAgICAgY3VyS2V5d29yZCA9IGN1cjsKICAgICAgICByZXR1cm4gImtleXdvcmQiOwogICAgICB9CiAgICAgIHJldHVybiAidmFyaWFibGUiOwogICAgfQoKICAgIHN0cmVhbS5uZXh0KCk7CiAgICByZXR1cm4gbnVsbDsKICB9CgogIGZ1bmN0aW9uIHRva2VuU3RyaW5nKHF1b3RlKSB7CiAgICByZXR1cm4gZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICB2YXIgZXNjYXBlZCA9IGZhbHNlLCBuZXh0LCBlbmQgPSBmYWxzZTsKICAgICAgd2hpbGUgKChuZXh0ID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkgewogICAgICAgIGlmIChuZXh0ID09IHF1b3RlICYmICFlc2NhcGVkKSB7ZW5kID0gdHJ1ZTsgYnJlYWs7fQogICAgICAgIGVzY2FwZWQgPSAhZXNjYXBlZCAmJiBuZXh0ID09ICJcXCI7CiAgICAgIH0KICAgICAgaWYgKGVuZCB8fCAhKGVzY2FwZWQgfHwgbXVsdGlMaW5lU3RyaW5ncykpCiAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICAgIHJldHVybiAic3RyaW5nIjsKICAgIH07CiAgfQoKICBmdW5jdGlvbiB0b2tlbkNvbW1lbnQoc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIG1heWJlRW5kID0gZmFsc2UsIGNoOwogICAgd2hpbGUgKGNoID0gc3RyZWFtLm5leHQoKSkgewogICAgICBpZiAoY2ggPT0gIi8iICYmIG1heWJlRW5kKSB7CiAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgbWF5YmVFbmQgPSAoY2ggPT0gIioiKTsKICAgIH0KICAgIHJldHVybiAiY29tbWVudCI7CiAgfQoKICBmdW5jdGlvbiBDb250ZXh0KGluZGVudGVkLCBjb2x1bW4sIHR5cGUsIGFsaWduLCBwcmV2KSB7CiAgICB0aGlzLmluZGVudGVkID0gaW5kZW50ZWQ7CiAgICB0aGlzLmNvbHVtbiA9IGNvbHVtbjsKICAgIHRoaXMudHlwZSA9IHR5cGU7CiAgICB0aGlzLmFsaWduID0gYWxpZ247CiAgICB0aGlzLnByZXYgPSBwcmV2OwogIH0KICBmdW5jdGlvbiBwdXNoQ29udGV4dChzdGF0ZSwgY29sLCB0eXBlKSB7CiAgICB2YXIgaW5kZW50ID0gc3RhdGUuaW5kZW50ZWQ7CiAgICB2YXIgYyA9IG5ldyBDb250ZXh0KGluZGVudCwgY29sLCB0eXBlLCBudWxsLCBzdGF0ZS5jb250ZXh0KTsKICAgIHJldHVybiBzdGF0ZS5jb250ZXh0ID0gYzsKICB9CiAgZnVuY3Rpb24gcG9wQ29udGV4dChzdGF0ZSkgewogICAgdmFyIHQgPSBzdGF0ZS5jb250ZXh0LnR5cGU7CiAgICBpZiAodCA9PSAiKSIgfHwgdCA9PSAiXSIgfHwgdCA9PSAifSIpIHsKICAgICAgc3RhdGUuaW5kZW50ZWQgPSBzdGF0ZS5jb250ZXh0LmluZGVudGVkOwogICAgfQogICAgcmV0dXJuIHN0YXRlLmNvbnRleHQgPSBzdGF0ZS5jb250ZXh0LnByZXY7CiAgfQoKICBmdW5jdGlvbiBpc0Nsb3NpbmcodGV4dCwgY29udGV4dENsb3NpbmcpIHsKICAgIGlmICh0ZXh0ID09IGNvbnRleHRDbG9zaW5nKSB7CiAgICAgIHJldHVybiB0cnVlOwogICAgfSBlbHNlIHsKICAgICAgLy8gY29udGV4dENsb3NpbmcgbWF5IGJlIG11bHRpcGxlIGtleXdvcmRzIHNlcGFyYXRlZCBieSA7CiAgICAgIHZhciBjbG9zaW5nS2V5d29yZHMgPSBjb250ZXh0Q2xvc2luZy5zcGxpdCgiOyIpOwogICAgICBmb3IgKHZhciBpIGluIGNsb3NpbmdLZXl3b3JkcykgewogICAgICAgIGlmICh0ZXh0ID09IGNsb3NpbmdLZXl3b3Jkc1tpXSkgewogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGJ1aWxkRWxlY3RyaWNJbnB1dFJlZ0V4KCkgewogICAgLy8gUmVpbmRlbnRhdGlvbiBzaG91bGQgb2NjdXIgb24gYW55IGJyYWNrZXQgY2hhcjoge30oKVtdCiAgICAvLyBvciBvbiBhIG1hdGNoIG9mIGFueSBvZiB0aGUgYmxvY2sgY2xvc2luZyBrZXl3b3JkcywgYXQKICAgIC8vIHRoZSBlbmQgb2YgYSBsaW5lCiAgICB2YXIgYWxsQ2xvc2luZ3MgPSBbXTsKICAgIGZvciAodmFyIGkgaW4gb3BlbkNsb3NlKSB7CiAgICAgIGlmIChvcGVuQ2xvc2VbaV0pIHsKICAgICAgICB2YXIgY2xvc2luZ3MgPSBvcGVuQ2xvc2VbaV0uc3BsaXQoIjsiKTsKICAgICAgICBmb3IgKHZhciBqIGluIGNsb3NpbmdzKSB7CiAgICAgICAgICBhbGxDbG9zaW5ncy5wdXNoKGNsb3NpbmdzW2pdKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIHZhciByZSA9IG5ldyBSZWdFeHAoIlt7fSgpXFxbXFxdXXwoIiArIGFsbENsb3NpbmdzLmpvaW4oInwiKSArICIpJCIpOwogICAgcmV0dXJuIHJlOwogIH0KCiAgLy8gSW50ZXJmYWNlCiAgcmV0dXJuIHsKCiAgICAvLyBSZWdleCB0byBmb3JjZSBjdXJyZW50IGxpbmUgdG8gcmVpbmRlbnQKICAgIGVsZWN0cmljSW5wdXQ6IGJ1aWxkRWxlY3RyaWNJbnB1dFJlZ0V4KCksCgogICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24oYmFzZWNvbHVtbikgewogICAgICB2YXIgc3RhdGUgPSB7CiAgICAgICAgdG9rZW5pemU6IG51bGwsCiAgICAgICAgY29udGV4dDogbmV3IENvbnRleHQoKGJhc2Vjb2x1bW4gfHwgMCkgLSBpbmRlbnRVbml0LCAwLCAidG9wIiwgZmFsc2UpLAogICAgICAgIGluZGVudGVkOiAwLAogICAgICAgIHN0YXJ0T2ZMaW5lOiB0cnVlCiAgICAgIH07CiAgICAgIGlmIChob29rcy5zdGFydFN0YXRlKSBob29rcy5zdGFydFN0YXRlKHN0YXRlKTsKICAgICAgcmV0dXJuIHN0YXRlOwogICAgfSwKCiAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICB2YXIgY3R4ID0gc3RhdGUuY29udGV4dDsKICAgICAgaWYgKHN0cmVhbS5zb2woKSkgewogICAgICAgIGlmIChjdHguYWxpZ24gPT0gbnVsbCkgY3R4LmFsaWduID0gZmFsc2U7CiAgICAgICAgc3RhdGUuaW5kZW50ZWQgPSBzdHJlYW0uaW5kZW50YXRpb24oKTsKICAgICAgICBzdGF0ZS5zdGFydE9mTGluZSA9IHRydWU7CiAgICAgIH0KICAgICAgaWYgKGhvb2tzLnRva2VuKSBob29rcy50b2tlbihzdHJlYW0sIHN0YXRlKTsKICAgICAgaWYgKHN0cmVhbS5lYXRTcGFjZSgpKSByZXR1cm4gbnVsbDsKICAgICAgY3VyUHVuYyA9IG51bGw7CiAgICAgIGN1cktleXdvcmQgPSBudWxsOwogICAgICB2YXIgc3R5bGUgPSAoc3RhdGUudG9rZW5pemUgfHwgdG9rZW5CYXNlKShzdHJlYW0sIHN0YXRlKTsKICAgICAgaWYgKHN0eWxlID09ICJjb21tZW50IiB8fCBzdHlsZSA9PSAibWV0YSIgfHwgc3R5bGUgPT0gInZhcmlhYmxlIikgcmV0dXJuIHN0eWxlOwogICAgICBpZiAoY3R4LmFsaWduID09IG51bGwpIGN0eC5hbGlnbiA9IHRydWU7CgogICAgICBpZiAoY3VyUHVuYyA9PSBjdHgudHlwZSkgewogICAgICAgIHBvcENvbnRleHQoc3RhdGUpOwogICAgICB9IGVsc2UgaWYgKChjdXJQdW5jID09ICI7IiAmJiBjdHgudHlwZSA9PSAic3RhdGVtZW50IikgfHwKICAgICAgICAgICAgICAgKGN0eC50eXBlICYmIGlzQ2xvc2luZyhjdXJLZXl3b3JkLCBjdHgudHlwZSkpKSB7CiAgICAgICAgY3R4ID0gcG9wQ29udGV4dChzdGF0ZSk7CiAgICAgICAgd2hpbGUgKGN0eCAmJiBjdHgudHlwZSA9PSAic3RhdGVtZW50IikgY3R4ID0gcG9wQ29udGV4dChzdGF0ZSk7CiAgICAgIH0gZWxzZSBpZiAoY3VyUHVuYyA9PSAieyIpIHsKICAgICAgICBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLmNvbHVtbigpLCAifSIpOwogICAgICB9IGVsc2UgaWYgKGN1clB1bmMgPT0gIlsiKSB7CiAgICAgICAgcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbS5jb2x1bW4oKSwgIl0iKTsKICAgICAgfSBlbHNlIGlmIChjdXJQdW5jID09ICIoIikgewogICAgICAgIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0uY29sdW1uKCksICIpIik7CiAgICAgIH0gZWxzZSBpZiAoY3R4ICYmIGN0eC50eXBlID09ICJlbmRjYXNlIiAmJiBjdXJQdW5jID09ICI6IikgewogICAgICAgIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0uY29sdW1uKCksICJzdGF0ZW1lbnQiKTsKICAgICAgfSBlbHNlIGlmIChjdXJQdW5jID09ICJuZXdzdGF0ZW1lbnQiKSB7CiAgICAgICAgcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbS5jb2x1bW4oKSwgInN0YXRlbWVudCIpOwogICAgICB9IGVsc2UgaWYgKGN1clB1bmMgPT0gIm5ld2Jsb2NrIikgewogICAgICAgIGlmIChjdXJLZXl3b3JkID09ICJmdW5jdGlvbiIgJiYgY3R4ICYmIChjdHgudHlwZSA9PSAic3RhdGVtZW50IiB8fCBjdHgudHlwZSA9PSAiZW5kZ3JvdXAiKSkgewogICAgICAgICAgLy8gVGhlICdmdW5jdGlvbicga2V5d29yZCBjYW4gYXBwZWFyIGluIHNvbWUgb3RoZXIgY29udGV4dHMgd2hlcmUgaXQgYWN0dWFsbHkgZG9lcyBub3QKICAgICAgICAgIC8vIGluZGljYXRlIGEgZnVuY3Rpb24gKGltcG9ydC9leHBvcnQgRFBJIGFuZCBjb3Zlcmdyb3VwIGRlZmluaXRpb25zKS4KICAgICAgICAgIC8vIERvIG5vdGhpbmcgaW4gdGhpcyBjYXNlCiAgICAgICAgfSBlbHNlIGlmIChjdXJLZXl3b3JkID09ICJ0YXNrIiAmJiBjdHggJiYgY3R4LnR5cGUgPT0gInN0YXRlbWVudCIpIHsKICAgICAgICAgIC8vIFNhbWUgdGhpbmcgZm9yIHRhc2sKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdmFyIGNsb3NlID0gb3BlbkNsb3NlW2N1cktleXdvcmRdOwogICAgICAgICAgcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbS5jb2x1bW4oKSwgY2xvc2UpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgc3RhdGUuc3RhcnRPZkxpbmUgPSBmYWxzZTsKICAgICAgcmV0dXJuIHN0eWxlOwogICAgfSwKCiAgICBpbmRlbnQ6IGZ1bmN0aW9uKHN0YXRlLCB0ZXh0QWZ0ZXIpIHsKICAgICAgaWYgKHN0YXRlLnRva2VuaXplICE9IHRva2VuQmFzZSAmJiBzdGF0ZS50b2tlbml6ZSAhPSBudWxsKSByZXR1cm4gQ29kZU1pcnJvci5QYXNzOwogICAgICBpZiAoaG9va3MuaW5kZW50KSB7CiAgICAgICAgdmFyIGZyb21Ib29rID0gaG9va3MuaW5kZW50KHN0YXRlKTsKICAgICAgICBpZiAoZnJvbUhvb2sgPj0gMCkgcmV0dXJuIGZyb21Ib29rOwogICAgICB9CiAgICAgIHZhciBjdHggPSBzdGF0ZS5jb250ZXh0LCBmaXJzdENoYXIgPSB0ZXh0QWZ0ZXIgJiYgdGV4dEFmdGVyLmNoYXJBdCgwKTsKICAgICAgaWYgKGN0eC50eXBlID09ICJzdGF0ZW1lbnQiICYmIGZpcnN0Q2hhciA9PSAifSIpIGN0eCA9IGN0eC5wcmV2OwogICAgICB2YXIgY2xvc2luZyA9IGZhbHNlOwogICAgICB2YXIgcG9zc2libGVDbG9zaW5nID0gdGV4dEFmdGVyLm1hdGNoKGNsb3NpbmdCcmFja2V0T3JXb3JkKTsKICAgICAgaWYgKHBvc3NpYmxlQ2xvc2luZykKICAgICAgICBjbG9zaW5nID0gaXNDbG9zaW5nKHBvc3NpYmxlQ2xvc2luZ1swXSwgY3R4LnR5cGUpOwogICAgICBpZiAoY3R4LnR5cGUgPT0gInN0YXRlbWVudCIpIHJldHVybiBjdHguaW5kZW50ZWQgKyAoZmlyc3RDaGFyID09ICJ7IiA/IDAgOiBzdGF0ZW1lbnRJbmRlbnRVbml0KTsKICAgICAgZWxzZSBpZiAoY2xvc2luZ0JyYWNrZXQudGVzdChjdHgudHlwZSkgJiYgY3R4LmFsaWduICYmICFkb250QWxpZ25DYWxscykgcmV0dXJuIGN0eC5jb2x1bW4gKyAoY2xvc2luZyA/IDAgOiAxKTsKICAgICAgZWxzZSBpZiAoY3R4LnR5cGUgPT0gIikiICYmICFjbG9zaW5nKSByZXR1cm4gY3R4LmluZGVudGVkICsgc3RhdGVtZW50SW5kZW50VW5pdDsKICAgICAgZWxzZSByZXR1cm4gY3R4LmluZGVudGVkICsgKGNsb3NpbmcgPyAwIDogaW5kZW50VW5pdCk7CiAgICB9LAoKICAgIGJsb2NrQ29tbWVudFN0YXJ0OiAiLyoiLAogICAgYmxvY2tDb21tZW50RW5kOiAiKi8iLAogICAgbGluZUNvbW1lbnQ6ICIvLyIKICB9Owp9KTsKCiAgQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtdmVyaWxvZyIsIHsKICAgIG5hbWU6ICJ2ZXJpbG9nIgogIH0pOwoKICBDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveC1zeXN0ZW12ZXJpbG9nIiwgewogICAgbmFtZTogInZlcmlsb2ciCiAgfSk7CgogIC8vIFRMVlZlcmlsb2cgbW9kZQoKICB2YXIgdGx2Y2hTY29wZVByZWZpeGVzID0gewogICAgIj4iOiAicHJvcGVydHkiLCAiLT4iOiAicHJvcGVydHkiLCAiLSI6ICJociIsICJ8IjogImxpbmsiLCAiPyQiOiAicXVhbGlmaWVyIiwgIj8qIjogInF1YWxpZmllciIsCiAgICAiQC0iOiAidmFyaWFibGUtMyIsICJAIjogInZhcmlhYmxlLTMiLCAiPyI6ICJxdWFsaWZpZXIiCiAgfTsKCiAgZnVuY3Rpb24gdGx2R2VuSW5kZW50KHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciB0bHZpbmRlbnRVbml0ID0gMjsKICAgIHZhciBydG5JbmRlbnQgPSAtMSwgaW5kZW50VW5pdFJxID0gMCwgY3VySW5kZW50ID0gc3RyZWFtLmluZGVudGF0aW9uKCk7CiAgICBzd2l0Y2ggKHN0YXRlLnRsdkN1ckN0bEZsb3dDaGFyKSB7CiAgICBjYXNlICJcXCI6CiAgICAgIGN1ckluZGVudCA9IDA7CiAgICAgIGJyZWFrOwogICAgY2FzZSAifCI6CiAgICAgIGlmIChzdGF0ZS50bHZQcmV2UHJldkN0bEZsb3dDaGFyID09ICJAIikgewogICAgICAgIGluZGVudFVuaXRScSA9IC0yOyAvLy0yIG5ldyBwaXBlIHJxIGFmdGVyIGN1ciBwaXBlCiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgaWYgKHRsdmNoU2NvcGVQcmVmaXhlc1tzdGF0ZS50bHZQcmV2Q3RsRmxvd0NoYXJdKQogICAgICAgIGluZGVudFVuaXRScSA9IDE7IC8vICsxIG5ldyBzY29wZQogICAgICBicmVhazsKICAgIGNhc2UgIk0iOiAgLy8gbTQKICAgICAgaWYgKHN0YXRlLnRsdlByZXZQcmV2Q3RsRmxvd0NoYXIgPT0gIkAiKSB7CiAgICAgICAgaW5kZW50VW5pdFJxID0gLTI7IC8vLTIgbmV3IGluc3QgcnEgYWZ0ZXIgIHBpcGUKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBpZiAodGx2Y2hTY29wZVByZWZpeGVzW3N0YXRlLnRsdlByZXZDdGxGbG93Q2hhcl0pCiAgICAgICAgaW5kZW50VW5pdFJxID0gMTsgLy8gKzEgbmV3IHNjb3BlCiAgICAgIGJyZWFrOwogICAgY2FzZSAiQCI6CiAgICAgIGlmIChzdGF0ZS50bHZQcmV2Q3RsRmxvd0NoYXIgPT0gIlMiKQogICAgICAgIGluZGVudFVuaXRScSA9IC0xOyAvLyBuZXcgcGlwZSBzdGFnZSBhZnRlciBzdG10cwogICAgICBpZiAoc3RhdGUudGx2UHJldkN0bEZsb3dDaGFyID09ICJ8IikKICAgICAgICBpbmRlbnRVbml0UnEgPSAxOyAvLyAxc3QgcGlwZSBzdGFnZQogICAgICBicmVhazsKICAgIGNhc2UgIlMiOgogICAgICBpZiAoc3RhdGUudGx2UHJldkN0bEZsb3dDaGFyID09ICJAIikKICAgICAgICBpbmRlbnRVbml0UnEgPSAxOyAvLyBmbG93IGluIHBpcGUgc3RhZ2UKICAgICAgaWYgKHRsdmNoU2NvcGVQcmVmaXhlc1tzdGF0ZS50bHZQcmV2Q3RsRmxvd0NoYXJdKQogICAgICAgIGluZGVudFVuaXRScSA9IDE7IC8vICsxIG5ldyBzY29wZQogICAgICBicmVhazsKICAgIH0KICAgIHZhciBzdGF0ZW1lbnRJbmRlbnRVbml0ID0gdGx2aW5kZW50VW5pdDsKICAgIHJ0bkluZGVudCA9IGN1ckluZGVudCArIChpbmRlbnRVbml0UnEqc3RhdGVtZW50SW5kZW50VW5pdCk7CiAgICByZXR1cm4gcnRuSW5kZW50ID49IDAgPyBydG5JbmRlbnQgOiBjdXJJbmRlbnQ7CiAgfQoKICBDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveC10bHYiLCB7CiAgICBuYW1lOiAidmVyaWxvZyIsCiAgICBob29rczogewogICAgICAiXFwiOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgICAgdmFyIHZ4SW5kZW50ID0gMCwgc3R5bGUgPSBmYWxzZTsKICAgICAgICB2YXIgY3VyUHVuYyAgPSBzdHJlYW0uc3RyaW5nOwogICAgICAgIGlmICgoc3RyZWFtLnNvbCgpKSAmJiAoKC9cXFNWLy50ZXN0KHN0cmVhbS5zdHJpbmcpKSB8fCAoL1xcVExWLy50ZXN0KHN0cmVhbS5zdHJpbmcpKSkpIHsKICAgICAgICAgIGN1clB1bmMgPSAoL1xcVExWX3ZlcnNpb24vLnRlc3Qoc3RyZWFtLnN0cmluZykpCiAgICAgICAgICAgID8gIlxcVExWX3ZlcnNpb24iIDogc3RyZWFtLnN0cmluZzsKICAgICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgICAgIGlmIChjdXJQdW5jID09ICJcXFNWIiAmJiBzdGF0ZS52eENvZGVBY3RpdmUpIHtzdGF0ZS52eENvZGVBY3RpdmUgPSBmYWxzZTt9OwogICAgICAgICAgaWYgKCgvXFxUTFYvLnRlc3QoY3VyUHVuYykgJiYgIXN0YXRlLnZ4Q29kZUFjdGl2ZSkKICAgICAgICAgICAgfHwgKGN1clB1bmM9PSJcXFRMVl92ZXJzaW9uIiAmJiBzdGF0ZS52eENvZGVBY3RpdmUpKSB7c3RhdGUudnhDb2RlQWN0aXZlID0gdHJ1ZTt9OwogICAgICAgICAgc3R5bGUgPSAia2V5d29yZCI7CiAgICAgICAgICBzdGF0ZS50bHZDdXJDdGxGbG93Q2hhciAgPSBzdGF0ZS50bHZQcmV2UHJldkN0bEZsb3dDaGFyCiAgICAgICAgICAgID0gc3RhdGUudGx2UHJldkN0bEZsb3dDaGFyID0gIiI7CiAgICAgICAgICBpZiAoc3RhdGUudnhDb2RlQWN0aXZlID09IHRydWUpIHsKICAgICAgICAgICAgc3RhdGUudGx2Q3VyQ3RsRmxvd0NoYXIgID0gIlxcIjsKICAgICAgICAgICAgdnhJbmRlbnQgPSB0bHZHZW5JbmRlbnQoc3RyZWFtLCBzdGF0ZSk7CiAgICAgICAgICB9CiAgICAgICAgICBzdGF0ZS52eEluZGVudFJxID0gdnhJbmRlbnQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzdHlsZTsKICAgICAgfSwKICAgICAgdG9rZW5CYXNlOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgICAgdmFyIHZ4SW5kZW50ID0gMCwgc3R5bGUgPSBmYWxzZTsKICAgICAgICB2YXIgdGx2aXNPcGVyYXRvckNoYXIgPSAvW1xbXF09Ol0vOwogICAgICAgIHZhciB0bHZrcFNjb3BlUHJlZml4cyA9IHsKICAgICAgICAgICIqKiI6InZhcmlhYmxlLTIiLCAiKiI6InZhcmlhYmxlLTIiLCAiJCQiOiJ2YXJpYWJsZSIsICIkIjoidmFyaWFibGUiLAogICAgICAgICAgIl5eIjoiYXR0cmlidXRlIiwgIl4iOiJhdHRyaWJ1dGUifTsKICAgICAgICB2YXIgY2ggPSBzdHJlYW0ucGVlaygpOwogICAgICAgIHZhciB2eEN1ckN0bEZsb3dDaGFyVmFsdWVBdFN0YXJ0ID0gc3RhdGUudGx2Q3VyQ3RsRmxvd0NoYXI7CiAgICAgICAgaWYgKHN0YXRlLnZ4Q29kZUFjdGl2ZSA9PSB0cnVlKSB7CiAgICAgICAgICBpZiAoL1tcW1xde31cKFwpO1w6XS8udGVzdChjaCkpIHsKICAgICAgICAgICAgLy8gYnlwYXNzIG5lc3RpbmcgYW5kIDEgY2hhciBwdW5jCiAgICAgICAgICAgIHN0eWxlID0gIm1ldGEiOwogICAgICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgICAgfSBlbHNlIGlmIChjaCA9PSAiLyIpIHsKICAgICAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgICAgICAgaWYgKHN0cmVhbS5lYXQoIi8iKSkgewogICAgICAgICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgICAgICAgICBzdHlsZSA9ICJjb21tZW50IjsKICAgICAgICAgICAgICBzdGF0ZS50bHZDdXJDdGxGbG93Q2hhciA9ICJTIjsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBzdHJlYW0uYmFja1VwKDEpOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICJAIikgewogICAgICAgICAgICAvLyBwaXBlbGluZSBzdGFnZQogICAgICAgICAgICBzdHlsZSA9IHRsdmNoU2NvcGVQcmVmaXhlc1tjaF07CiAgICAgICAgICAgIHN0YXRlLnRsdkN1ckN0bEZsb3dDaGFyID0gIkAiOwogICAgICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcd1wkX10vKTsKICAgICAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLm1hdGNoKC9cYlttTV00Ky8sIHRydWUpKSB7IC8vIG1hdGNoOiBmdW5jdGlvbihwYXR0ZXJuLCBjb25zdW1lLCBjYXNlSW5zZW5zaXRpdmUpCiAgICAgICAgICAgIC8vIG00IHByZSBwcm9jCiAgICAgICAgICAgIHN0cmVhbS5za2lwVG8oIigiKTsKICAgICAgICAgICAgc3R5bGUgPSAiZGVmIjsKICAgICAgICAgICAgc3RhdGUudGx2Q3VyQ3RsRmxvd0NoYXIgPSAiTSI7CiAgICAgICAgICB9IGVsc2UgaWYgKGNoID09ICIhIiAmJiBzdHJlYW0uc29sKCkpIHsKICAgICAgICAgICAgLy8gdiBzdG10IGluIHRsdiByZWdpb24KICAgICAgICAgICAgLy8gc3RhdGUudGx2Q3VyQ3RsRmxvd0NoYXIgID0gIlMiOwogICAgICAgICAgICBzdHlsZSA9ICJjb21tZW50IjsKICAgICAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgICAgIH0gZWxzZSBpZiAodGx2aXNPcGVyYXRvckNoYXIudGVzdChjaCkpIHsKICAgICAgICAgICAgLy8gb3BlcmF0b3JzCiAgICAgICAgICAgIHN0cmVhbS5lYXRXaGlsZSh0bHZpc09wZXJhdG9yQ2hhcik7CiAgICAgICAgICAgIHN0eWxlID0gIm9wZXJhdG9yIjsKICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gIiMiKSB7CiAgICAgICAgICAgIC8vIHBoeSBoaWVyCiAgICAgICAgICAgIHN0YXRlLnRsdkN1ckN0bEZsb3dDaGFyICA9IChzdGF0ZS50bHZDdXJDdGxGbG93Q2hhciA9PSAiIikKICAgICAgICAgICAgICA/IGNoIDogc3RhdGUudGx2Q3VyQ3RsRmxvd0NoYXI7CiAgICAgICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvWystXVxkLyk7CiAgICAgICAgICAgIHN0eWxlID0gInRhZyI7CiAgICAgICAgICB9IGVsc2UgaWYgKHRsdmtwU2NvcGVQcmVmaXhzLnByb3BlcnR5SXNFbnVtZXJhYmxlKGNoKSkgewogICAgICAgICAgICAvLyBzcGVjaWFsIFRMViBvcGVyYXRvcnMKICAgICAgICAgICAgc3R5bGUgPSB0bHZrcFNjb3BlUHJlZml4c1tjaF07CiAgICAgICAgICAgIHN0YXRlLnRsdkN1ckN0bEZsb3dDaGFyID0gc3RhdGUudGx2Q3VyQ3RsRmxvd0NoYXIgPT0gIiIgPyAiUyIgOiBzdGF0ZS50bHZDdXJDdGxGbG93Q2hhcjsgIC8vIHN0bXQKICAgICAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgICAgICAgc3RyZWFtLm1hdGNoKC9bYS16QS1aXzAtOV0rLyk7CiAgICAgICAgICB9IGVsc2UgaWYgKHN0eWxlID0gdGx2Y2hTY29wZVByZWZpeGVzW2NoXSB8fCBmYWxzZSkgewogICAgICAgICAgICAvLyBzcGVjaWFsIFRMViBvcGVyYXRvcnMKICAgICAgICAgICAgc3RhdGUudGx2Q3VyQ3RsRmxvd0NoYXIgPSBzdGF0ZS50bHZDdXJDdGxGbG93Q2hhciA9PSAiIiA/IGNoIDogc3RhdGUudGx2Q3VyQ3RsRmxvd0NoYXI7CiAgICAgICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgICAgIHN0cmVhbS5tYXRjaCgvW2EtekEtWl8wLTldKy8pOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHN0YXRlLnRsdkN1ckN0bEZsb3dDaGFyICE9IHZ4Q3VyQ3RsRmxvd0NoYXJWYWx1ZUF0U3RhcnQpIHsgLy8gZmxvdyBjaGFuZ2UKICAgICAgICAgICAgdnhJbmRlbnQgPSB0bHZHZW5JbmRlbnQoc3RyZWFtLCBzdGF0ZSk7CiAgICAgICAgICAgIHN0YXRlLnZ4SW5kZW50UnEgPSB2eEluZGVudDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHN0eWxlOwogICAgICB9LAogICAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICAgIGlmIChzdGF0ZS52eENvZGVBY3RpdmUgPT0gdHJ1ZSAmJiBzdHJlYW0uc29sKCkgJiYgc3RhdGUudGx2Q3VyQ3RsRmxvd0NoYXIgIT0gIiIpIHsKICAgICAgICAgIHN0YXRlLnRsdlByZXZQcmV2Q3RsRmxvd0NoYXIgPSBzdGF0ZS50bHZQcmV2Q3RsRmxvd0NoYXI7CiAgICAgICAgICBzdGF0ZS50bHZQcmV2Q3RsRmxvd0NoYXIgPSBzdGF0ZS50bHZDdXJDdGxGbG93Q2hhcjsKICAgICAgICAgIHN0YXRlLnRsdkN1ckN0bEZsb3dDaGFyID0gIiI7CiAgICAgICAgfQogICAgICB9LAogICAgICBpbmRlbnQ6IGZ1bmN0aW9uKHN0YXRlKSB7CiAgICAgICAgcmV0dXJuIChzdGF0ZS52eENvZGVBY3RpdmUgPT0gdHJ1ZSkgPyBzdGF0ZS52eEluZGVudFJxIDogLTE7CiAgICAgIH0sCiAgICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKHN0YXRlKSB7CiAgICAgICAgc3RhdGUudGx2Q3VyQ3RsRmxvd0NoYXIgPSAiIjsKICAgICAgICBzdGF0ZS50bHZQcmV2Q3RsRmxvd0NoYXIgPSAiIjsKICAgICAgICBzdGF0ZS50bHZQcmV2UHJldkN0bEZsb3dDaGFyID0gIiI7CiAgICAgICAgc3RhdGUudnhDb2RlQWN0aXZlID0gdHJ1ZTsKICAgICAgICBzdGF0ZS52eEluZGVudFJxID0gMDsKICAgICAgfQogICAgfQogIH0pOwp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/vhdl/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/vhdl/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogVkhETCBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uLy4uL2FkZG9uL2VkaXQvbWF0Y2hicmFja2V0cy5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJ2aGRsLmpzIj48L3NjcmlwdD4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4uQ29kZU1pcnJvciB7Ym9yZGVyLXRvcDogMXB4IHNvbGlkIGJsYWNrOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGgxPkNvZGVNaXJyb3I8L2gxPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5WSERMPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5WSERMIG1vZGU8L2gyPgoKPGRpdj48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgpMSUJSQVJZIGllZWU7ClVTRSBpZWVlLnN0ZF9sb2dpY18xMTY0LkFMTDsKVVNFIGllZWUubnVtZXJpY19zdGQuQUxMOwoKRU5USVRZIHRiIElTCkVORCB0YjsKCkFSQ0hJVEVDVFVSRSBiZWhhdmlvciBPRiB0YiBJUwogICAtLUlucHV0cwogICBzaWduYWwgYSA6IHVuc2lnbmVkKDIgZG93bnRvIDApIDo9IChvdGhlcnMgPT4gJzAnKTsKICAgc2lnbmFsIGIgOiB1bnNpZ25lZCgyIGRvd250byAwKSA6PSAob3RoZXJzID0+ICcwJyk7CiAgICAtLU91dHB1dHMKICAgc2lnbmFsIGFfZXFfYiA6IHN0ZF9sb2dpYzsKICAgc2lnbmFsIGFfbGVfYiA6IHN0ZF9sb2dpYzsKICAgc2lnbmFsIGFfZ3RfYiA6IHN0ZF9sb2dpYzsKCiAgICBzaWduYWwgaSxqIDogaW50ZWdlcjsKCkJFR0lOCgogICAgLS0gSW5zdGFudGlhdGUgdGhlIFVuaXQgVW5kZXIgVGVzdCAoVVVUKQogICB1dXQ6IGVudGl0eSB3b3JrLmNvbXBhcmF0b3IgUE9SVCBNQVAgKAogICAgICAgICAgYSA9PiBhLAogICAgICAgICAgYiA9PiBiLAogICAgICAgICAgYV9lcV9iID0+IGFfZXFfYiwKICAgICAgICAgIGFfbGVfYiA9PiBhX2xlX2IsCiAgICAgICAgICBhX2d0X2IgPT4gYV9ndF9iCiAgICAgICAgKTsKCiAgIC0tIFN0aW11bHVzIHByb2Nlc3MKICAgc3RpbV9wcm9jOiBwcm9jZXNzCiAgIGJlZ2luCiAgICAgICAgZm9yIGkgaW4gMCB0byA4IGxvb3AKICAgICAgICAgICAgZm9yIGogaW4gMCB0byA4IGxvb3AKICAgICAgICAgICAgICAgIGEgPD0gdG9fdW5zaWduZWQoaSwzKTsgLS1pbnRlZ2VyIHRvIHVuc2lnbmVkIHR5cGUgY29udmVyc2lvbgogICAgICAgICAgICAgICAgYiA8PSB0b191bnNpZ25lZChqLDMpOwogICAgICAgICAgICAgICAgd2FpdCBmb3IgMTAgbnM7CiAgICAgICAgICAgIGVuZCBsb29wOwogICAgICAgIGVuZCBsb29wOwogICBlbmQgcHJvY2VzczsKCkVORDsKPC90ZXh0YXJlYT48L2Rpdj4KCjxzY3JpcHQ+CiAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgbWF0Y2hCcmFja2V0czogdHJ1ZSwKICAgIG1vZGU6IHsKICAgICAgbmFtZTogInZoZGwiLAogICAgfQogIH0pOwo8L3NjcmlwdD4KCjxwPgpTeW50YXggaGlnaGxpZ2h0aW5nIGFuZCBpbmRlbnRhdGlvbiBmb3IgdGhlIFZIREwgbGFuZ3VhZ2UuCjxoMj5Db25maWd1cmF0aW9uIG9wdGlvbnM6PC9oMj4KICA8dWw+CiAgICA8bGk+PHN0cm9uZz5hdG9tczwvc3Ryb25nPiAtIExpc3Qgb2YgYXRvbSB3b3Jkcy4gRGVmYXVsdDogIm51bGwiPC9saT4KICAgIDxsaT48c3Ryb25nPmhvb2tzPC9zdHJvbmc+IC0gTGlzdCBvZiBtZXRhIGhvb2tzLiBEZWZhdWx0OiBbImAiLCAiJCJdPC9saT4KICAgIDxsaT48c3Ryb25nPm11bHRpTGluZVN0cmluZ3M8L3N0cm9uZz4gLSBXaGV0aGVyIG11bHRpLWxpbmUgc3RyaW5ncyBhcmUgYWNjZXB0ZWQuIERlZmF1bHQ6IGZhbHNlPC9saT4KICA8L3VsPgo8L3A+Cgo8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC94LXZoZGw8L2NvZGU+LjwvcD4KPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/vhdl/vhdl.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovLyBPcmlnaW5hbGx5IHdyaXR0ZW4gYnkgQWxmIE5pZWxzZW4sIHJlLXdyaXR0ZW4gYnkgTWljaGFlbCBaaG91CihmdW5jdGlvbihtb2QpIHsKICBpZiAodHlwZW9mIGV4cG9ydHMgPT0gIm9iamVjdCIgJiYgdHlwZW9mIG1vZHVsZSA9PSAib2JqZWN0IikgLy8gQ29tbW9uSlMKICAgIG1vZChyZXF1aXJlKCIuLi8uLi9saWIvY29kZW1pcnJvciIpKTsKICBlbHNlIGlmICh0eXBlb2YgZGVmaW5lID09ICJmdW5jdGlvbiIgJiYgZGVmaW5lLmFtZCkgLy8gQU1ECiAgICBkZWZpbmUoWyIuLi8uLi9saWIvY29kZW1pcnJvciJdLCBtb2QpOwogIGVsc2UgLy8gUGxhaW4gYnJvd3NlciBlbnYKICAgIG1vZChDb2RlTWlycm9yKTsKfSkoZnVuY3Rpb24oQ29kZU1pcnJvcikgewoidXNlIHN0cmljdCI7CgpmdW5jdGlvbiB3b3JkcyhzdHIpIHsKICB2YXIgb2JqID0ge30sIHdvcmRzID0gc3RyLnNwbGl0KCIsIik7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCB3b3Jkcy5sZW5ndGg7ICsraSkgewogICAgdmFyIGFsbENhcHMgPSB3b3Jkc1tpXS50b1VwcGVyQ2FzZSgpOwogICAgdmFyIGZpcnN0Q2FwID0gd29yZHNbaV0uY2hhckF0KDApLnRvVXBwZXJDYXNlKCkgKyB3b3Jkc1tpXS5zbGljZSgxKTsKICAgIG9ialt3b3Jkc1tpXV0gPSB0cnVlOwogICAgb2JqW2FsbENhcHNdID0gdHJ1ZTsKICAgIG9ialtmaXJzdENhcF0gPSB0cnVlOwogIH0KICByZXR1cm4gb2JqOwp9CgpmdW5jdGlvbiBtZXRhSG9vayhzdHJlYW0pIHsKICBzdHJlYW0uZWF0V2hpbGUoL1tcd1wkX10vKTsKICByZXR1cm4gIm1ldGEiOwp9CgpDb2RlTWlycm9yLmRlZmluZU1vZGUoInZoZGwiLCBmdW5jdGlvbihjb25maWcsIHBhcnNlckNvbmZpZykgewogIHZhciBpbmRlbnRVbml0ID0gY29uZmlnLmluZGVudFVuaXQsCiAgICAgIGF0b21zID0gcGFyc2VyQ29uZmlnLmF0b21zIHx8IHdvcmRzKCJudWxsIiksCiAgICAgIGhvb2tzID0gcGFyc2VyQ29uZmlnLmhvb2tzIHx8IHsiYCI6IG1ldGFIb29rLCAiJCI6IG1ldGFIb29rfSwKICAgICAgbXVsdGlMaW5lU3RyaW5ncyA9IHBhcnNlckNvbmZpZy5tdWx0aUxpbmVTdHJpbmdzOwoKICB2YXIga2V5d29yZHMgPSB3b3JkcygiYWJzLGFjY2VzcyxhZnRlcixhbGlhcyxhbGwsYW5kLGFyY2hpdGVjdHVyZSxhcnJheSxhc3NlcnQsYXR0cmlidXRlLGJlZ2luLGJsb2NrLCIgKwogICAgICAiYm9keSxidWZmZXIsYnVzLGNhc2UsY29tcG9uZW50LGNvbmZpZ3VyYXRpb24sY29uc3RhbnQsZGlzY29ubmVjdCxkb3dudG8sZWxzZSxlbHNpZixlbmQsZW5kIGJsb2NrLGVuZCBjYXNlLCIgKwogICAgICAiZW5kIGNvbXBvbmVudCxlbmQgZm9yLGVuZCBnZW5lcmF0ZSxlbmQgaWYsZW5kIGxvb3AsZW5kIHByb2Nlc3MsZW5kIHJlY29yZCxlbmQgdW5pdHMsZW50aXR5LGV4aXQsZmlsZSxmb3IsIiArCiAgICAgICJmdW5jdGlvbixnZW5lcmF0ZSxnZW5lcmljLGdlbmVyaWMgbWFwLGdyb3VwLGd1YXJkZWQsaWYsaW1wdXJlLGluLGluZXJ0aWFsLGlub3V0LGlzLGxhYmVsLGxpYnJhcnksbGlua2FnZSwiICsKICAgICAgImxpdGVyYWwsbG9vcCxtYXAsbW9kLG5hbmQsbmV3LG5leHQsbm9yLG51bGwsb2Ysb24sb3BlbixvcixvdGhlcnMsb3V0LHBhY2thZ2UscGFja2FnZSBib2R5LHBvcnQscG9ydCBtYXAsIiArCiAgICAgICJwb3N0cG9uZWQscHJvY2VkdXJlLHByb2Nlc3MscHVyZSxyYW5nZSxyZWNvcmQscmVnaXN0ZXIscmVqZWN0LHJlbSxyZXBvcnQscmV0dXJuLHJvbCxyb3Isc2VsZWN0LHNldmVyaXR5LHNpZ25hbCwiICsKICAgICAgInNsYSxzbGwsc3JhLHNybCxzdWJ0eXBlLHRoZW4sdG8sdHJhbnNwb3J0LHR5cGUsdW5hZmZlY3RlZCx1bml0cyx1bnRpbCx1c2UsdmFyaWFibGUsd2FpdCx3aGVuLHdoaWxlLHdpdGgseG5vcix4b3IiKTsKCiAgdmFyIGJsb2NrS2V5d29yZHMgPSB3b3JkcygiYXJjaGl0ZWN0dXJlLGVudGl0eSxiZWdpbixjYXNlLHBvcnQsZWxzZSxlbHNpZixlbmQsZm9yLGZ1bmN0aW9uLGlmIik7CgogIHZhciBpc09wZXJhdG9yQ2hhciA9IC9bJnx+PjwhXClcKCojJUArXC89P1w6O317LFwuXF5cLVxbXF1dLzsKICB2YXIgY3VyUHVuYzsKCiAgZnVuY3Rpb24gdG9rZW5CYXNlKHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBjaCA9IHN0cmVhbS5uZXh0KCk7CiAgICBpZiAoaG9va3NbY2hdKSB7CiAgICAgIHZhciByZXN1bHQgPSBob29rc1tjaF0oc3RyZWFtLCBzdGF0ZSk7CiAgICAgIGlmIChyZXN1bHQgIT09IGZhbHNlKSByZXR1cm4gcmVzdWx0OwogICAgfQogICAgaWYgKGNoID09ICciJykgewogICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuU3RyaW5nMihjaCk7CiAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgIH0KICAgIGlmIChjaCA9PSAiJyIpIHsKICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlblN0cmluZyhjaCk7CiAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgIH0KICAgIGlmICgvW1xbXF17fVwoXCksO1w6XC5dLy50ZXN0KGNoKSkgewogICAgICBjdXJQdW5jID0gY2g7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgaWYgKC9bXGQnXS8udGVzdChjaCkpIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXHdcLiddLyk7CiAgICAgIHJldHVybiAibnVtYmVyIjsKICAgIH0KICAgIGlmIChjaCA9PSAiLSIpIHsKICAgICAgaWYgKHN0cmVhbS5lYXQoIi0iKSkgewogICAgICAgIHN0cmVhbS5za2lwVG9FbmQoKTsKICAgICAgICByZXR1cm4gImNvbW1lbnQiOwogICAgICB9CiAgICB9CiAgICBpZiAoaXNPcGVyYXRvckNoYXIudGVzdChjaCkpIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKGlzT3BlcmF0b3JDaGFyKTsKICAgICAgcmV0dXJuICJvcGVyYXRvciI7CiAgICB9CiAgICBzdHJlYW0uZWF0V2hpbGUoL1tcd1wkX10vKTsKICAgIHZhciBjdXIgPSBzdHJlYW0uY3VycmVudCgpOwogICAgaWYgKGtleXdvcmRzLnByb3BlcnR5SXNFbnVtZXJhYmxlKGN1ci50b0xvd2VyQ2FzZSgpKSkgewogICAgICBpZiAoYmxvY2tLZXl3b3Jkcy5wcm9wZXJ0eUlzRW51bWVyYWJsZShjdXIpKSBjdXJQdW5jID0gIm5ld3N0YXRlbWVudCI7CiAgICAgIHJldHVybiAia2V5d29yZCI7CiAgICB9CiAgICBpZiAoYXRvbXMucHJvcGVydHlJc0VudW1lcmFibGUoY3VyKSkgcmV0dXJuICJhdG9tIjsKICAgIHJldHVybiAidmFyaWFibGUiOwogIH0KCiAgZnVuY3Rpb24gdG9rZW5TdHJpbmcocXVvdGUpIHsKICAgIHJldHVybiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHZhciBlc2NhcGVkID0gZmFsc2UsIG5leHQsIGVuZCA9IGZhbHNlOwogICAgICB3aGlsZSAoKG5leHQgPSBzdHJlYW0ubmV4dCgpKSAhPSBudWxsKSB7CiAgICAgICAgaWYgKG5leHQgPT0gcXVvdGUgJiYgIWVzY2FwZWQpIHtlbmQgPSB0cnVlOyBicmVhazt9CiAgICAgICAgZXNjYXBlZCA9ICFlc2NhcGVkICYmIG5leHQgPT0gIi0tIjsKICAgICAgfQogICAgICBpZiAoZW5kIHx8ICEoZXNjYXBlZCB8fCBtdWx0aUxpbmVTdHJpbmdzKSkKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTsKICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgfTsKICB9CiAgZnVuY3Rpb24gdG9rZW5TdHJpbmcyKHF1b3RlKSB7CiAgICByZXR1cm4gZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICB2YXIgZXNjYXBlZCA9IGZhbHNlLCBuZXh0LCBlbmQgPSBmYWxzZTsKICAgICAgd2hpbGUgKChuZXh0ID0gc3RyZWFtLm5leHQoKSkgIT0gbnVsbCkgewogICAgICAgIGlmIChuZXh0ID09IHF1b3RlICYmICFlc2NhcGVkKSB7ZW5kID0gdHJ1ZTsgYnJlYWs7fQogICAgICAgIGVzY2FwZWQgPSAhZXNjYXBlZCAmJiBuZXh0ID09ICItLSI7CiAgICAgIH0KICAgICAgaWYgKGVuZCB8fCAhKGVzY2FwZWQgfHwgbXVsdGlMaW5lU3RyaW5ncykpCiAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICAgIHJldHVybiAic3RyaW5nLTIiOwogICAgfTsKICB9CgogIGZ1bmN0aW9uIENvbnRleHQoaW5kZW50ZWQsIGNvbHVtbiwgdHlwZSwgYWxpZ24sIHByZXYpIHsKICAgIHRoaXMuaW5kZW50ZWQgPSBpbmRlbnRlZDsKICAgIHRoaXMuY29sdW1uID0gY29sdW1uOwogICAgdGhpcy50eXBlID0gdHlwZTsKICAgIHRoaXMuYWxpZ24gPSBhbGlnbjsKICAgIHRoaXMucHJldiA9IHByZXY7CiAgfQogIGZ1bmN0aW9uIHB1c2hDb250ZXh0KHN0YXRlLCBjb2wsIHR5cGUpIHsKICAgIHJldHVybiBzdGF0ZS5jb250ZXh0ID0gbmV3IENvbnRleHQoc3RhdGUuaW5kZW50ZWQsIGNvbCwgdHlwZSwgbnVsbCwgc3RhdGUuY29udGV4dCk7CiAgfQogIGZ1bmN0aW9uIHBvcENvbnRleHQoc3RhdGUpIHsKICAgIHZhciB0ID0gc3RhdGUuY29udGV4dC50eXBlOwogICAgaWYgKHQgPT0gIikiIHx8IHQgPT0gIl0iIHx8IHQgPT0gIn0iKQogICAgICBzdGF0ZS5pbmRlbnRlZCA9IHN0YXRlLmNvbnRleHQuaW5kZW50ZWQ7CiAgICByZXR1cm4gc3RhdGUuY29udGV4dCA9IHN0YXRlLmNvbnRleHQucHJldjsKICB9CgogIC8vIEludGVyZmFjZQogIHJldHVybiB7CiAgICBzdGFydFN0YXRlOiBmdW5jdGlvbihiYXNlY29sdW1uKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgdG9rZW5pemU6IG51bGwsCiAgICAgICAgY29udGV4dDogbmV3IENvbnRleHQoKGJhc2Vjb2x1bW4gfHwgMCkgLSBpbmRlbnRVbml0LCAwLCAidG9wIiwgZmFsc2UpLAogICAgICAgIGluZGVudGVkOiAwLAogICAgICAgIHN0YXJ0T2ZMaW5lOiB0cnVlCiAgICAgIH07CiAgICB9LAoKICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHZhciBjdHggPSBzdGF0ZS5jb250ZXh0OwogICAgICBpZiAoc3RyZWFtLnNvbCgpKSB7CiAgICAgICAgaWYgKGN0eC5hbGlnbiA9PSBudWxsKSBjdHguYWxpZ24gPSBmYWxzZTsKICAgICAgICBzdGF0ZS5pbmRlbnRlZCA9IHN0cmVhbS5pbmRlbnRhdGlvbigpOwogICAgICAgIHN0YXRlLnN0YXJ0T2ZMaW5lID0gdHJ1ZTsKICAgICAgfQogICAgICBpZiAoc3RyZWFtLmVhdFNwYWNlKCkpIHJldHVybiBudWxsOwogICAgICBjdXJQdW5jID0gbnVsbDsKICAgICAgdmFyIHN0eWxlID0gKHN0YXRlLnRva2VuaXplIHx8IHRva2VuQmFzZSkoc3RyZWFtLCBzdGF0ZSk7CiAgICAgIGlmIChzdHlsZSA9PSAiY29tbWVudCIgfHwgc3R5bGUgPT0gIm1ldGEiKSByZXR1cm4gc3R5bGU7CiAgICAgIGlmIChjdHguYWxpZ24gPT0gbnVsbCkgY3R4LmFsaWduID0gdHJ1ZTsKCiAgICAgIGlmICgoY3VyUHVuYyA9PSAiOyIgfHwgY3VyUHVuYyA9PSAiOiIpICYmIGN0eC50eXBlID09ICJzdGF0ZW1lbnQiKSBwb3BDb250ZXh0KHN0YXRlKTsKICAgICAgZWxzZSBpZiAoY3VyUHVuYyA9PSAieyIpIHB1c2hDb250ZXh0KHN0YXRlLCBzdHJlYW0uY29sdW1uKCksICJ9Iik7CiAgICAgIGVsc2UgaWYgKGN1clB1bmMgPT0gIlsiKSBwdXNoQ29udGV4dChzdGF0ZSwgc3RyZWFtLmNvbHVtbigpLCAiXSIpOwogICAgICBlbHNlIGlmIChjdXJQdW5jID09ICIoIikgcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbS5jb2x1bW4oKSwgIikiKTsKICAgICAgZWxzZSBpZiAoY3VyUHVuYyA9PSAifSIpIHsKICAgICAgICB3aGlsZSAoY3R4LnR5cGUgPT0gInN0YXRlbWVudCIpIGN0eCA9IHBvcENvbnRleHQoc3RhdGUpOwogICAgICAgIGlmIChjdHgudHlwZSA9PSAifSIpIGN0eCA9IHBvcENvbnRleHQoc3RhdGUpOwogICAgICAgIHdoaWxlIChjdHgudHlwZSA9PSAic3RhdGVtZW50IikgY3R4ID0gcG9wQ29udGV4dChzdGF0ZSk7CiAgICAgIH0KICAgICAgZWxzZSBpZiAoY3VyUHVuYyA9PSBjdHgudHlwZSkgcG9wQ29udGV4dChzdGF0ZSk7CiAgICAgIGVsc2UgaWYgKGN0eC50eXBlID09ICJ9IiB8fCBjdHgudHlwZSA9PSAidG9wIiB8fCAoY3R4LnR5cGUgPT0gInN0YXRlbWVudCIgJiYgY3VyUHVuYyA9PSAibmV3c3RhdGVtZW50IikpCiAgICAgICAgcHVzaENvbnRleHQoc3RhdGUsIHN0cmVhbS5jb2x1bW4oKSwgInN0YXRlbWVudCIpOwogICAgICBzdGF0ZS5zdGFydE9mTGluZSA9IGZhbHNlOwogICAgICByZXR1cm4gc3R5bGU7CiAgICB9LAoKICAgIGluZGVudDogZnVuY3Rpb24oc3RhdGUsIHRleHRBZnRlcikgewogICAgICBpZiAoc3RhdGUudG9rZW5pemUgIT0gdG9rZW5CYXNlICYmIHN0YXRlLnRva2VuaXplICE9IG51bGwpIHJldHVybiAwOwogICAgICB2YXIgZmlyc3RDaGFyID0gdGV4dEFmdGVyICYmIHRleHRBZnRlci5jaGFyQXQoMCksIGN0eCA9IHN0YXRlLmNvbnRleHQsIGNsb3NpbmcgPSBmaXJzdENoYXIgPT0gY3R4LnR5cGU7CiAgICAgIGlmIChjdHgudHlwZSA9PSAic3RhdGVtZW50IikgcmV0dXJuIGN0eC5pbmRlbnRlZCArIChmaXJzdENoYXIgPT0gInsiID8gMCA6IGluZGVudFVuaXQpOwogICAgICBlbHNlIGlmIChjdHguYWxpZ24pIHJldHVybiBjdHguY29sdW1uICsgKGNsb3NpbmcgPyAwIDogMSk7CiAgICAgIGVsc2UgcmV0dXJuIGN0eC5pbmRlbnRlZCArIChjbG9zaW5nID8gMCA6IGluZGVudFVuaXQpOwogICAgfSwKCiAgICBlbGVjdHJpY0NoYXJzOiAie30iCiAgfTsKfSk7CgpDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveC12aGRsIiwgInZoZGwiKTsKCn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/vue/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/vue/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogVnVlLmpzIG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vLi4vYWRkb24vbW9kZS9vdmVybGF5LmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uLy4uL2FkZG9uL21vZGUvc2ltcGxlLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uLy4uL2FkZG9uL3NlbGVjdGlvbi9zZWxlY3Rpb24tcG9pbnRlci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi94bWwveG1sLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL2phdmFzY3JpcHQvamF2YXNjcmlwdC5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9jc3MvY3NzLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL2NvZmZlZXNjcmlwdC9jb2ZmZWVzY3JpcHQuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vc2Fzcy9zYXNzLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL3B1Zy9wdWcuanMiPjwvc2NyaXB0PgoKPHNjcmlwdCBzcmM9Ii4uL2hhbmRsZWJhcnMvaGFuZGxlYmFycy5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9odG1sbWl4ZWQvaHRtbG1peGVkLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9InZ1ZS5qcyI+PC9zY3JpcHQ+CjxzdHlsZT4uQ29kZU1pcnJvciB7Ym9yZGVyLXRvcDogMXB4IHNvbGlkIGJsYWNrOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGgxPkNvZGVNaXJyb3I8L2gxPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5WdWUuanMgbW9kZTwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+VnVlLmpzIG1vZGU8L2gyPgo8Zm9ybT48dGV4dGFyZWEgaWQ9ImNvZGUiIG5hbWU9ImNvZGUiPgo8dGVtcGxhdGU+CiAgPGRpdiBjbGFzcz0ic2FzcyI+SW0gYW0gYSB7e211c3RhY2hlLWxpa2V9fSB0ZW1wbGF0ZTwvZGl2Pgo8L3RlbXBsYXRlPgoKPHNjcmlwdCBsYW5nPSJjb2ZmZWUiPgogIG1vZHVsZS5leHBvcnRzID0KICAgIHByb3BzOiBbJ29uZScsICd0d28nLCAndGhyZWUnXQo8L3NjcmlwdD4KCjxzdHlsZSBsYW5nPSJzYXNzIj4KLnNhc3MKICBmb250LXNpemU6IDE4cHgKPC9zdHlsZT4KCjwvdGV4dGFyZWE+PC9mb3JtPgogICAgPHNjcmlwdD4KICAgICAgLy8gRGVmaW5lIGFuIGV4dGVuZGVkIG1peGVkLW1vZGUgdGhhdCB1bmRlcnN0YW5kcyB2YnNjcmlwdCBhbmQKICAgICAgLy8gbGVhdmVzIG11c3RhY2hlL2hhbmRsZWJhcnMgZW1iZWRkZWQgdGVtcGxhdGVzIGluIGh0bWwgbW9kZQogICAgICB2YXIgbWl4ZWRNb2RlID0gewogICAgICAgIG5hbWU6ICJ2dWUiCiAgICAgIH07CiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICAgICAgbW9kZTogbWl4ZWRNb2RlLAogICAgICAgIHNlbGVjdGlvblBvaW50ZXI6IHRydWUKICAgICAgfSk7CiAgICA8L3NjcmlwdD4KCiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC94LXZ1ZTwvY29kZT48L3A+CgogIDwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/vue/vue.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24gKG1vZCkgewogICJ1c2Ugc3RyaWN0IjsKICBpZiAodHlwZW9mIGV4cG9ydHMgPT09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT09ICJvYmplY3QiKSB7Ly8gQ29tbW9uSlMKICAgIG1vZChyZXF1aXJlKCIuLi8uLi9saWIvY29kZW1pcnJvciIpLAogICAgICAgIHJlcXVpcmUoIi4uLy4uL2FkZG9uL21vZGUvb3ZlcmxheSIpLAogICAgICAgIHJlcXVpcmUoIi4uL3htbC94bWwiKSwKICAgICAgICByZXF1aXJlKCIuLi9qYXZhc2NyaXB0L2phdmFzY3JpcHQiKSwKICAgICAgICByZXF1aXJlKCIuLi9jb2ZmZWVzY3JpcHQvY29mZmVlc2NyaXB0IiksCiAgICAgICAgcmVxdWlyZSgiLi4vY3NzL2NzcyIpLAogICAgICAgIHJlcXVpcmUoIi4uL3Nhc3Mvc2FzcyIpLAogICAgICAgIHJlcXVpcmUoIi4uL3N0eWx1cy9zdHlsdXMiKSwKICAgICAgICByZXF1aXJlKCIuLi9wdWcvcHVnIiksCiAgICAgICAgcmVxdWlyZSgiLi4vaGFuZGxlYmFycy9oYW5kbGViYXJzIikpOwogIH0gZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kKSB7IC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiLAogICAgICAgICAgICAiLi4vLi4vYWRkb24vbW9kZS9vdmVybGF5IiwKICAgICAgICAgICAgIi4uL3htbC94bWwiLAogICAgICAgICAgICAiLi4vamF2YXNjcmlwdC9qYXZhc2NyaXB0IiwKICAgICAgICAgICAgIi4uL2NvZmZlZXNjcmlwdC9jb2ZmZWVzY3JpcHQiLAogICAgICAgICAgICAiLi4vY3NzL2NzcyIsCiAgICAgICAgICAgICIuLi9zYXNzL3Nhc3MiLAogICAgICAgICAgICAiLi4vc3R5bHVzL3N0eWx1cyIsCiAgICAgICAgICAgICIuLi9wdWcvcHVnIiwKICAgICAgICAgICAgIi4uL2hhbmRsZWJhcnMvaGFuZGxlYmFycyJdLCBtb2QpOwogIH0gZWxzZSB7IC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7CiAgfQp9KShmdW5jdGlvbiAoQ29kZU1pcnJvcikgewogIHZhciB0YWdMYW5ndWFnZXMgPSB7CiAgICBzY3JpcHQ6IFsKICAgICAgWyJsYW5nIiwgL2NvZmZlZShzY3JpcHQpPy8sICJjb2ZmZWVzY3JpcHQiXSwKICAgICAgWyJ0eXBlIiwgL14oPzp0ZXh0fGFwcGxpY2F0aW9uKVwvKD86eC0pP2NvZmZlZSg/OnNjcmlwdCk/JC8sICJjb2ZmZWVzY3JpcHQiXQogICAgXSwKICAgIHN0eWxlOiBbCiAgICAgIFsibGFuZyIsIC9ec3R5bHVzJC9pLCAic3R5bHVzIl0sCiAgICAgIFsibGFuZyIsIC9ec2FzcyQvaSwgInNhc3MiXSwKICAgICAgWyJ0eXBlIiwgL14odGV4dFwvKT8oeC0pP3N0eWwodXMpPyQvaSwgInN0eWx1cyJdLAogICAgICBbInR5cGUiLCAvXnRleHRcL3Nhc3MvaSwgInNhc3MiXQogICAgXSwKICAgIHRlbXBsYXRlOiBbCiAgICAgIFsibGFuZyIsIC9ednVlLXRlbXBsYXRlJC9pLCAidnVlIl0sCiAgICAgIFsibGFuZyIsIC9ecHVnJC9pLCAicHVnIl0sCiAgICAgIFsibGFuZyIsIC9eaGFuZGxlYmFycyQvaSwgImhhbmRsZWJhcnMiXSwKICAgICAgWyJ0eXBlIiwgL14odGV4dFwvKT8oeC0pP3B1ZyQvaSwgInB1ZyJdLAogICAgICBbInR5cGUiLCAvXnRleHRcL3gtaGFuZGxlYmFycy10ZW1wbGF0ZSQvaSwgImhhbmRsZWJhcnMiXSwKICAgICAgW251bGwsIG51bGwsICJ2dWUtdGVtcGxhdGUiXQogICAgXQogIH07CgogIENvZGVNaXJyb3IuZGVmaW5lTW9kZSgidnVlLXRlbXBsYXRlIiwgZnVuY3Rpb24gKGNvbmZpZywgcGFyc2VyQ29uZmlnKSB7CiAgICB2YXIgbXVzdGFjaGVPdmVybGF5ID0gewogICAgICB0b2tlbjogZnVuY3Rpb24gKHN0cmVhbSkgewogICAgICAgIGlmIChzdHJlYW0ubWF0Y2goL15ce1x7Lio/XH1cfS8pKSByZXR1cm4gIm1ldGEgbXVzdGFjaGUiOwogICAgICAgIHdoaWxlIChzdHJlYW0ubmV4dCgpICYmICFzdHJlYW0ubWF0Y2goInt7IiwgZmFsc2UpKSB7fQogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICB9OwogICAgcmV0dXJuIENvZGVNaXJyb3Iub3ZlcmxheU1vZGUoQ29kZU1pcnJvci5nZXRNb2RlKGNvbmZpZywgcGFyc2VyQ29uZmlnLmJhY2tkcm9wIHx8ICJ0ZXh0L2h0bWwiKSwgbXVzdGFjaGVPdmVybGF5KTsKICB9KTsKCiAgQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJ2dWUiLCBmdW5jdGlvbiAoY29uZmlnKSB7CiAgICByZXR1cm4gQ29kZU1pcnJvci5nZXRNb2RlKGNvbmZpZywge25hbWU6ICJodG1sbWl4ZWQiLCB0YWdzOiB0YWdMYW5ndWFnZXN9KTsKICB9LCAiaHRtbG1peGVkIiwgInhtbCIsICJqYXZhc2NyaXB0IiwgImNvZmZlZXNjcmlwdCIsICJjc3MiLCAic2FzcyIsICJzdHlsdXMiLCAicHVnIiwgImhhbmRsZWJhcnMiKTsKCiAgQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJzY3JpcHQveC12dWUiLCAidnVlIik7Cn0pOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/webidl/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/webidl/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogV2ViIElETCBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2RvYy9kb2NzLmNzcyI+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uLy4uL2FkZG9uL2VkaXQvbWF0Y2hicmFja2V0cy5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSJ3ZWJpZGwuanMiPjwvc2NyaXB0Pgo8c3R5bGUgdHlwZT0idGV4dC9jc3MiPi5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazt9PC9zdHlsZT4KCjxkaXYgaWQ9Im5hdiI+CiAgPGEgaHJlZj0iaHR0cDovL2NvZGVtaXJyb3IubmV0Ij48aDE+Q29kZU1pcnJvcjwvaDE+PGltZyBpZD0ibG9nbyIgc3JjPSIuLi8uLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5MYW5ndWFnZSBtb2RlczwvYT4KICAgIDxsaT48YSBjbGFzcz0iYWN0aXZlIiBocmVmPSIjIj5XZWIgSURMPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CiAgPGgyPldlYiBJREwgbW9kZTwvaDI+CgogIDxkaXY+Cjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+CltOYW1lZENvbnN0cnVjdG9yPUltYWdlKG9wdGlvbmFsIHVuc2lnbmVkIGxvbmcgd2lkdGgsIG9wdGlvbmFsIHVuc2lnbmVkIGxvbmcgaGVpZ2h0KV0KaW50ZXJmYWNlIEhUTUxJbWFnZUVsZW1lbnQgOiBIVE1MRWxlbWVudCB7CiAgICAgICAgICAgYXR0cmlidXRlIERPTVN0cmluZyBhbHQ7CiAgICAgICAgICAgYXR0cmlidXRlIERPTVN0cmluZyBzcmM7CiAgICAgICAgICAgYXR0cmlidXRlIERPTVN0cmluZyBzcmNzZXQ7CiAgICAgICAgICAgYXR0cmlidXRlIERPTVN0cmluZyBzaXplczsKICAgICAgICAgICBhdHRyaWJ1dGUgRE9NU3RyaW5nPyBjcm9zc09yaWdpbjsKICAgICAgICAgICBhdHRyaWJ1dGUgRE9NU3RyaW5nIHVzZU1hcDsKICAgICAgICAgICBhdHRyaWJ1dGUgYm9vbGVhbiBpc01hcDsKICAgICAgICAgICBhdHRyaWJ1dGUgdW5zaWduZWQgbG9uZyB3aWR0aDsKICAgICAgICAgICBhdHRyaWJ1dGUgdW5zaWduZWQgbG9uZyBoZWlnaHQ7CiAgcmVhZG9ubHkgYXR0cmlidXRlIHVuc2lnbmVkIGxvbmcgbmF0dXJhbFdpZHRoOwogIHJlYWRvbmx5IGF0dHJpYnV0ZSB1bnNpZ25lZCBsb25nIG5hdHVyYWxIZWlnaHQ7CiAgcmVhZG9ubHkgYXR0cmlidXRlIGJvb2xlYW4gY29tcGxldGU7CiAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZyBjdXJyZW50U3JjOwoKICAvLyBhbHNvIGhhcyBvYnNvbGV0ZSBtZW1iZXJzCn07CgpwYXJ0aWFsIGludGVyZmFjZSBIVE1MSW1hZ2VFbGVtZW50IHsKICBhdHRyaWJ1dGUgRE9NU3RyaW5nIG5hbWU7CiAgYXR0cmlidXRlIERPTVN0cmluZyBsb3dzcmM7CiAgYXR0cmlidXRlIERPTVN0cmluZyBhbGlnbjsKICBhdHRyaWJ1dGUgdW5zaWduZWQgbG9uZyBoc3BhY2U7CiAgYXR0cmlidXRlIHVuc2lnbmVkIGxvbmcgdnNwYWNlOwogIGF0dHJpYnV0ZSBET01TdHJpbmcgbG9uZ0Rlc2M7CgogIFtUcmVhdE51bGxBcz1FbXB0eVN0cmluZ10gYXR0cmlidXRlIERPTVN0cmluZyBib3JkZXI7Cn07CjwvdGV4dGFyZWE+CiAgPC9kaXY+CgogIDxzY3JpcHQ+CiAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKICAgICAgbWF0Y2hCcmFja2V0czogdHJ1ZQogICAgfSk7CiAgPC9zY3JpcHQ+CgogIDxwPjxzdHJvbmc+TUlNRSB0eXBlIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPnRleHQveC13ZWJpZGw8L2NvZGU+LjwvcD4KPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/webidl/webidl.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKZnVuY3Rpb24gd29yZFJlZ2V4cCh3b3JkcykgewogIHJldHVybiBuZXcgUmVnRXhwKCJeKCgiICsgd29yZHMuam9pbigiKXwoIikgKyAiKSlcXGIiKTsKfTsKCnZhciBidWlsdGluQXJyYXkgPSBbCiAgIkNsYW1wIiwKICAiQ29uc3RydWN0b3IiLAogICJFbmZvcmNlUmFuZ2UiLAogICJFeHBvc2VkIiwKICAiSW1wbGljaXRUaGlzIiwKICAiR2xvYmFsIiwgIlByaW1hcnlHbG9iYWwiLAogICJMZWdhY3lBcnJheUNsYXNzIiwKICAiTGVnYWN5VW5lbnVtZXJhYmxlTmFtZWRQcm9wZXJ0aWVzIiwKICAiTGVuaWVudFRoaXMiLAogICJOYW1lZENvbnN0cnVjdG9yIiwKICAiTmV3T2JqZWN0IiwKICAiTm9JbnRlcmZhY2VPYmplY3QiLAogICJPdmVycmlkZUJ1aWx0aW5zIiwKICAiUHV0Rm9yd2FyZHMiLAogICJSZXBsYWNlYWJsZSIsCiAgIlNhbWVPYmplY3QiLAogICJUcmVhdE5vbk9iamVjdEFzTnVsbCIsCiAgIlRyZWF0TnVsbEFzIiwKICAgICJFbXB0eVN0cmluZyIsCiAgIlVuZm9yZ2VhYmxlIiwKICAiVW5zY29wZWFibGUiCl07CnZhciBidWlsdGlucyA9IHdvcmRSZWdleHAoYnVpbHRpbkFycmF5KTsKCnZhciB0eXBlQXJyYXkgPSBbCiAgInVuc2lnbmVkIiwgInNob3J0IiwgImxvbmciLCAgICAgICAgICAgICAgICAgIC8vIFVuc2lnbmVkSW50ZWdlclR5cGUKICAidW5yZXN0cmljdGVkIiwgImZsb2F0IiwgImRvdWJsZSIsICAgICAgICAgICAgLy8gVW5yZXN0cmljdGVkRmxvYXRUeXBlCiAgImJvb2xlYW4iLCAiYnl0ZSIsICJvY3RldCIsICAgICAgICAgICAgICAgICAgIC8vIFJlc3Qgb2YgUHJpbWl0aXZlVHlwZQogICJQcm9taXNlIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcm9taXNlVHlwZQogICJBcnJheUJ1ZmZlciIsICJEYXRhVmlldyIsICJJbnQ4QXJyYXkiLCAiSW50MTZBcnJheSIsICJJbnQzMkFycmF5IiwKICAiVWludDhBcnJheSIsICJVaW50MTZBcnJheSIsICJVaW50MzJBcnJheSIsICJVaW50OENsYW1wZWRBcnJheSIsCiAgIkZsb2F0MzJBcnJheSIsICJGbG9hdDY0QXJyYXkiLCAgICAgICAgICAgICAgIC8vIEJ1ZmZlclJlbGF0ZWRUeXBlCiAgIkJ5dGVTdHJpbmciLCAiRE9NU3RyaW5nIiwgIlVTVlN0cmluZyIsICJzZXF1ZW5jZSIsICJvYmplY3QiLCAiUmVnRXhwIiwKICAiRXJyb3IiLCAiRE9NRXhjZXB0aW9uIiwgIkZyb3plbkFycmF5IiwgICAgICAgLy8gUmVzdCBvZiBOb25BbnlUeXBlCiAgImFueSIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlc3Qgb2YgU2luZ2xlVHlwZQogICJ2b2lkIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXN0IG9mIFJldHVyblR5cGUKXTsKdmFyIHR5cGVzID0gd29yZFJlZ2V4cCh0eXBlQXJyYXkpOwoKdmFyIGtleXdvcmRBcnJheSA9IFsKICAiYXR0cmlidXRlIiwgImNhbGxiYWNrIiwgImNvbnN0IiwgImRlbGV0ZXIiLCAiZGljdGlvbmFyeSIsICJlbnVtIiwgImdldHRlciIsCiAgImltcGxlbWVudHMiLCAiaW5oZXJpdCIsICJpbnRlcmZhY2UiLCAiaXRlcmFibGUiLCAibGVnYWN5Y2FsbGVyIiwgIm1hcGxpa2UiLAogICJwYXJ0aWFsIiwgInJlcXVpcmVkIiwgInNlcmlhbGl6ZXIiLCAic2V0bGlrZSIsICJzZXR0ZXIiLCAic3RhdGljIiwKICAic3RyaW5naWZpZXIiLCAidHlwZWRlZiIsICAgICAgICAgICAgICAgICAgICAgLy8gQXJndW1lbnROYW1lS2V5d29yZCBleGNlcHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gInVucmVzdHJpY3RlZCIKICAib3B0aW9uYWwiLCAicmVhZG9ubHkiLCAib3IiCl07CnZhciBrZXl3b3JkcyA9IHdvcmRSZWdleHAoa2V5d29yZEFycmF5KTsKCnZhciBhdG9tQXJyYXkgPSBbCiAgInRydWUiLCAiZmFsc2UiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJvb2xlYW5MaXRlcmFsCiAgIkluZmluaXR5IiwgIk5hTiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZsb2F0TGl0ZXJhbAogICJudWxsIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXN0IG9mIENvbnN0VmFsdWUKXTsKdmFyIGF0b21zID0gd29yZFJlZ2V4cChhdG9tQXJyYXkpOwoKQ29kZU1pcnJvci5yZWdpc3RlckhlbHBlcigiaGludFdvcmRzIiwgIndlYmlkbCIsCiAgICBidWlsdGluQXJyYXkuY29uY2F0KHR5cGVBcnJheSkuY29uY2F0KGtleXdvcmRBcnJheSkuY29uY2F0KGF0b21BcnJheSkpOwoKdmFyIHN0YXJ0RGVmQXJyYXkgPSBbImNhbGxiYWNrIiwgImRpY3Rpb25hcnkiLCAiZW51bSIsICJpbnRlcmZhY2UiXTsKdmFyIHN0YXJ0RGVmcyA9IHdvcmRSZWdleHAoc3RhcnREZWZBcnJheSk7Cgp2YXIgZW5kRGVmQXJyYXkgPSBbInR5cGVkZWYiXTsKdmFyIGVuZERlZnMgPSB3b3JkUmVnZXhwKGVuZERlZkFycmF5KTsKCnZhciBzaW5nbGVPcGVyYXRvcnMgPSAvXls6PD0+P10vOwp2YXIgaW50ZWdlcnMgPSAvXi0/KFsxLTldWzAtOV0qfDBbWHhdWzAtOUEtRmEtZl0rfDBbMC03XSopLzsKdmFyIGZsb2F0cyA9IC9eLT8oKFswLTldK1wuWzAtOV0qfFswLTldKlwuWzAtOV0rKShbRWVdWystXT9bMC05XSspP3xbMC05XStbRWVdWystXT9bMC05XSspLzsKdmFyIGlkZW50aWZpZXJzID0gL15fP1tBLVphLXpdWzAtOUEtWl9hLXotXSovOwp2YXIgaWRlbnRpZmllcnNFbmQgPSAvXl8/W0EtWmEtel1bMC05QS1aX2Etei1dKig/PVxzKjspLzsKdmFyIHN0cmluZ3MgPSAvXiJbXiJdKiIvOwp2YXIgbXVsdGlsaW5lQ29tbWVudHMgPSAvXlwvXCouKj9cKlwvLzsKdmFyIG11bHRpbGluZUNvbW1lbnRzU3RhcnQgPSAvXlwvXCouKi87CnZhciBtdWx0aWxpbmVDb21tZW50c0VuZCA9IC9eLio/XCpcLy87CgpmdW5jdGlvbiByZWFkVG9rZW4oc3RyZWFtLCBzdGF0ZSkgewogIC8vIHdoaXRlc3BhY2UKICBpZiAoc3RyZWFtLmVhdFNwYWNlKCkpIHJldHVybiBudWxsOwoKICAvLyBjb21tZW50CiAgaWYgKHN0YXRlLmluQ29tbWVudCkgewogICAgaWYgKHN0cmVhbS5tYXRjaChtdWx0aWxpbmVDb21tZW50c0VuZCkpIHsKICAgICAgc3RhdGUuaW5Db21tZW50ID0gZmFsc2U7CiAgICAgIHJldHVybiAiY29tbWVudCI7CiAgICB9CiAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICByZXR1cm4gImNvbW1lbnQiOwogIH0KICBpZiAoc3RyZWFtLm1hdGNoKCIvLyIpKSB7CiAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICByZXR1cm4gImNvbW1lbnQiOwogIH0KICBpZiAoc3RyZWFtLm1hdGNoKG11bHRpbGluZUNvbW1lbnRzKSkgcmV0dXJuICJjb21tZW50IjsKICBpZiAoc3RyZWFtLm1hdGNoKG11bHRpbGluZUNvbW1lbnRzU3RhcnQpKSB7CiAgICBzdGF0ZS5pbkNvbW1lbnQgPSB0cnVlOwogICAgcmV0dXJuICJjb21tZW50IjsKICB9CgogIC8vIGludGVnZXIgYW5kIGZsb2F0CiAgaWYgKHN0cmVhbS5tYXRjaCgvXi0/WzAtOVwuXS8sIGZhbHNlKSkgewogICAgaWYgKHN0cmVhbS5tYXRjaChpbnRlZ2VycykgfHwgc3RyZWFtLm1hdGNoKGZsb2F0cykpIHJldHVybiAibnVtYmVyIjsKICB9CgogIC8vIHN0cmluZwogIGlmIChzdHJlYW0ubWF0Y2goc3RyaW5ncykpIHJldHVybiAic3RyaW5nIjsKCiAgLy8gaWRlbnRpZmllcgogIGlmIChzdGF0ZS5zdGFydERlZiAmJiBzdHJlYW0ubWF0Y2goaWRlbnRpZmllcnMpKSByZXR1cm4gImRlZiI7CgogIGlmIChzdGF0ZS5lbmREZWYgJiYgc3RyZWFtLm1hdGNoKGlkZW50aWZpZXJzRW5kKSkgewogICAgc3RhdGUuZW5kRGVmID0gZmFsc2U7CiAgICByZXR1cm4gImRlZiI7CiAgfQoKICBpZiAoc3RyZWFtLm1hdGNoKGtleXdvcmRzKSkgcmV0dXJuICJrZXl3b3JkIjsKCiAgaWYgKHN0cmVhbS5tYXRjaCh0eXBlcykpIHsKICAgIHZhciBsYXN0VG9rZW4gPSBzdGF0ZS5sYXN0VG9rZW47CiAgICB2YXIgbmV4dFRva2VuID0gKHN0cmVhbS5tYXRjaCgvXlxzKiguKz8pXGIvLCBmYWxzZSkgfHwgW10pWzFdOwoKICAgIGlmIChsYXN0VG9rZW4gPT09ICI6IiB8fCBsYXN0VG9rZW4gPT09ICJpbXBsZW1lbnRzIiB8fAogICAgICAgIG5leHRUb2tlbiA9PT0gImltcGxlbWVudHMiIHx8IG5leHRUb2tlbiA9PT0gIj0iKSB7CiAgICAgIC8vIFVzZWQgYXMgaWRlbnRpZmllcgogICAgICByZXR1cm4gImJ1aWx0aW4iOwogICAgfSBlbHNlIHsKICAgICAgLy8gVXNlZCBhcyB0eXBlCiAgICAgIHJldHVybiAidmFyaWFibGUtMyI7CiAgICB9CiAgfQoKICBpZiAoc3RyZWFtLm1hdGNoKGJ1aWx0aW5zKSkgcmV0dXJuICJidWlsdGluIjsKICBpZiAoc3RyZWFtLm1hdGNoKGF0b21zKSkgcmV0dXJuICJhdG9tIjsKICBpZiAoc3RyZWFtLm1hdGNoKGlkZW50aWZpZXJzKSkgcmV0dXJuICJ2YXJpYWJsZSI7CgogIC8vIG90aGVyCiAgaWYgKHN0cmVhbS5tYXRjaChzaW5nbGVPcGVyYXRvcnMpKSByZXR1cm4gIm9wZXJhdG9yIjsKCiAgLy8gdW5yZWNvZ25pemVkCiAgc3RyZWFtLm5leHQoKTsKICByZXR1cm4gbnVsbDsKfTsKCkNvZGVNaXJyb3IuZGVmaW5lTW9kZSgid2ViaWRsIiwgZnVuY3Rpb24oKSB7CiAgcmV0dXJuIHsKICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gewogICAgICAgIC8vIElzIGluIG11bHRpbGluZSBjb21tZW50CiAgICAgICAgaW5Db21tZW50OiBmYWxzZSwKICAgICAgICAvLyBMYXN0IG5vbi13aGl0ZXNwYWNlLCBtYXRjaGVkIHRva2VuCiAgICAgICAgbGFzdFRva2VuOiAiIiwKICAgICAgICAvLyBOZXh0IHRva2VuIGlzIGEgZGVmaW5pdGlvbgogICAgICAgIHN0YXJ0RGVmOiBmYWxzZSwKICAgICAgICAvLyBMYXN0IHRva2VuIG9mIHRoZSBzdGF0ZW1lbnQgaXMgYSBkZWZpbml0aW9uCiAgICAgICAgZW5kRGVmOiBmYWxzZQogICAgICB9OwogICAgfSwKICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHZhciBzdHlsZSA9IHJlYWRUb2tlbihzdHJlYW0sIHN0YXRlKTsKCiAgICAgIGlmIChzdHlsZSkgewogICAgICAgIHZhciBjdXIgPSBzdHJlYW0uY3VycmVudCgpOwogICAgICAgIHN0YXRlLmxhc3RUb2tlbiA9IGN1cjsKICAgICAgICBpZiAoc3R5bGUgPT09ICJrZXl3b3JkIikgewogICAgICAgICAgc3RhdGUuc3RhcnREZWYgPSBzdGFydERlZnMudGVzdChjdXIpOwogICAgICAgICAgc3RhdGUuZW5kRGVmID0gc3RhdGUuZW5kRGVmIHx8IGVuZERlZnMudGVzdChjdXIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzdGF0ZS5zdGFydERlZiA9IGZhbHNlOwogICAgICAgIH0KICAgICAgfQoKICAgICAgcmV0dXJuIHN0eWxlOwogICAgfQogIH07Cn0pOwoKQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L3gtd2ViaWRsIiwgIndlYmlkbCIpOwp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/xml/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/xml/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogWE1MIG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0ieG1sLmpzIj48L3NjcmlwdD4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4uQ29kZU1pcnJvciB7Ym9yZGVyLXRvcDogMXB4IHNvbGlkIGJsYWNrOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGgxPkNvZGVNaXJyb3I8L2gxPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5YTUw8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPlhNTCBtb2RlPC9oMj4KPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KJmx0O2h0bWwgc3R5bGU9ImNvbG9yOiBncmVlbiImZ3Q7CiAgJmx0OyEtLSB0aGlzIGlzIGEgY29tbWVudCAtLSZndDsKICAmbHQ7aGVhZCZndDsKICAgICZsdDt0aXRsZSZndDtIVE1MIEV4YW1wbGUmbHQ7L3RpdGxlJmd0OwogICZsdDsvaGVhZCZndDsKICAmbHQ7Ym9keSZndDsKICAgIFRoZSBpbmRlbnRhdGlvbiB0cmllcyB0byBiZSAmbHQ7ZW0mZ3Q7c29tZXdoYXQgJmFtcDtxdW90O2RvIHdoYXQKICAgIEkgbWVhbiZhbXA7cXVvdDsmbHQ7L2VtJmd0Oy4uLiBidXQgbWlnaHQgbm90IG1hdGNoIHlvdXIgc3R5bGUuCiAgJmx0Oy9ib2R5Jmd0OwombHQ7L2h0bWwmZ3Q7CjwvdGV4dGFyZWE+PC9mb3JtPgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHsKICAgICAgICBtb2RlOiAidGV4dC9odG1sIiwKICAgICAgICBsaW5lTnVtYmVyczogdHJ1ZQogICAgICB9KTsKICAgIDwvc2NyaXB0PgogICAgPHA+VGhlIFhNTCBtb2RlIHN1cHBvcnRzIHRoZXNlIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyczo8L3A+CiAgICA8ZGw+CiAgICAgIDxkdD48Y29kZT5odG1sTW9kZSAoYm9vbGVhbik8L2NvZGU+PC9kdD4KICAgICAgPGRkPlRoaXMgc3dpdGNoZXMgdGhlIG1vZGUgdG8gcGFyc2UgSFRNTCBpbnN0ZWFkIG9mIFhNTC4gVGhpcwogICAgICBtZWFucyBhdHRyaWJ1dGVzIGRvIG5vdCBoYXZlIHRvIGJlIHF1b3RlZCwgYW5kIHNvbWUgZWxlbWVudHMKICAgICAgKHN1Y2ggYXMgPGNvZGU+YnI8L2NvZGU+KSBkbyBub3QgcmVxdWlyZSBhIGNsb3NpbmcgdGFnLjwvZGQ+CiAgICAgIDxkdD48Y29kZT5tYXRjaENsb3NpbmcgKGJvb2xlYW4pPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD5Db250cm9scyB3aGV0aGVyIHRoZSBtb2RlIGNoZWNrcyB0aGF0IGNsb3NlIHRhZ3MgbWF0Y2ggdGhlCiAgICAgIGNvcnJlc3BvbmRpbmcgb3BlbmluZyB0YWcsIGFuZCBoaWdobGlnaHRzIG1pc21hdGNoZXMgYXMgZXJyb3JzLgogICAgICBEZWZhdWx0cyB0byB0cnVlLjwvZGQ+CiAgICAgIDxkdD48Y29kZT5hbGlnbkNEQVRBIChib29sZWFuKTwvY29kZT48L2R0PgogICAgICA8ZGQ+U2V0dGluZyB0aGlzIHRvIHRydWUgd2lsbCBmb3JjZSB0aGUgb3BlbmluZyB0YWcgb2YgQ0RBVEEKICAgICAgYmxvY2tzIHRvIG5vdCBiZSBpbmRlbnRlZC48L2RkPgogICAgPC9kbD4KCiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+YXBwbGljYXRpb24veG1sPC9jb2RlPiwgPGNvZGU+dGV4dC9odG1sPC9jb2RlPi48L3A+CiAgPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/xml/test.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24oKSB7CiAgdmFyIG1vZGUgPSBDb2RlTWlycm9yLmdldE1vZGUoe2luZGVudFVuaXQ6IDJ9LCAieG1sIiksIG1uYW1lID0gInhtbCI7CiAgZnVuY3Rpb24gTVQobmFtZSkgeyB0ZXN0Lm1vZGUobmFtZSwgbW9kZSwgQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSwgbW5hbWUpOyB9CgogIE1UKCJtYXRjaGluZyIsCiAgICAgIlt0YWcmYnJhY2tldCA8XVt0YWcgdG9wXVt0YWcmYnJhY2tldCA+XSIsCiAgICAgIiAgdGV4dCIsCiAgICAgIiAgW3RhZyZicmFja2V0IDxdW3RhZyBpbm5lcl1bdGFnJmJyYWNrZXQgLz5dIiwKICAgICAiW3RhZyZicmFja2V0IDwvXVt0YWcgdG9wXVt0YWcmYnJhY2tldCA+XSIpOwoKICBNVCgibm9ubWF0Y2hpbmciLAogICAgICJbdGFnJmJyYWNrZXQgPF1bdGFnIHRvcF1bdGFnJmJyYWNrZXQgPl0iLAogICAgICIgIFt0YWcmYnJhY2tldCA8XVt0YWcgaW5uZXJdW3RhZyZicmFja2V0IC8+XSIsCiAgICAgIiAgW3RhZyZicmFja2V0IDwvXVt0YWcmZXJyb3IgdGlwXVt0YWcmYnJhY2tldCZlcnJvciA+XSIpOwoKICBNVCgiZG9jdHlwZSIsCiAgICAgIlttZXRhIDwhZG9jdHlwZSBmb29iYXI+XSIsCiAgICAgIlt0YWcmYnJhY2tldCA8XVt0YWcgdG9wXVt0YWcmYnJhY2tldCAvPl0iKTsKCiAgTVQoImNkYXRhIiwKICAgICAiW3RhZyZicmFja2V0IDxdW3RhZyB0b3BdW3RhZyZicmFja2V0ID5dIiwKICAgICAiICBbYXRvbSA8IVtDREFUQVtmb29dIiwKICAgICAiW2F0b20gYmFyYmF6Z3VoXV1dXT5dIiwKICAgICAiW3RhZyZicmFja2V0IDwvXVt0YWcgdG9wXVt0YWcmYnJhY2tldCA+XSIpOwoKICAvLyBIVE1MIHRlc3RzCiAgbW9kZSA9IENvZGVNaXJyb3IuZ2V0TW9kZSh7aW5kZW50VW5pdDogMn0sICJ0ZXh0L2h0bWwiKTsKCiAgTVQoInNlbGZjbG9zZSIsCiAgICAgIlt0YWcmYnJhY2tldCA8XVt0YWcgaHRtbF1bdGFnJmJyYWNrZXQgPl0iLAogICAgICIgIFt0YWcmYnJhY2tldCA8XVt0YWcgbGlua10gW2F0dHJpYnV0ZSByZWxdPVtzdHJpbmcgc3R5bGVzaGVldF0gW2F0dHJpYnV0ZSBocmVmXT1bc3RyaW5nIFwiL2Zvb2JhclwiXVt0YWcmYnJhY2tldCA+XSIsCiAgICAgIlt0YWcmYnJhY2tldCA8L11bdGFnIGh0bWxdW3RhZyZicmFja2V0ID5dIik7CgogIE1UKCJsaXN0IiwKICAgICAiW3RhZyZicmFja2V0IDxdW3RhZyBvbF1bdGFnJmJyYWNrZXQgPl0iLAogICAgICIgIFt0YWcmYnJhY2tldCA8XVt0YWcgbGldW3RhZyZicmFja2V0ID5db25lIiwKICAgICAiICBbdGFnJmJyYWNrZXQgPF1bdGFnIGxpXVt0YWcmYnJhY2tldCA+XXR3byIsCiAgICAgIlt0YWcmYnJhY2tldCA8L11bdGFnIG9sXVt0YWcmYnJhY2tldCA+XSIpOwoKICBNVCgidmFsdWVsZXNzIiwKICAgICAiW3RhZyZicmFja2V0IDxdW3RhZyBpbnB1dF0gW2F0dHJpYnV0ZSB0eXBlXT1bc3RyaW5nIGNoZWNrYm94XSBbYXR0cmlidXRlIGNoZWNrZWRdW3RhZyZicmFja2V0IC8+XSIpOwoKICBNVCgicFRoZW5BcnRpY2xlIiwKICAgICAiW3RhZyZicmFja2V0IDxdW3RhZyBwXVt0YWcmYnJhY2tldCA+XSIsCiAgICAgIiAgZm9vIiwKICAgICAiW3RhZyZicmFja2V0IDxdW3RhZyBhcnRpY2xlXVt0YWcmYnJhY2tldCA+XWJhciIpOwoKfSkoKTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/xml/xml.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKdmFyIGh0bWxDb25maWcgPSB7CiAgYXV0b1NlbGZDbG9zZXJzOiB7J2FyZWEnOiB0cnVlLCAnYmFzZSc6IHRydWUsICdicic6IHRydWUsICdjb2wnOiB0cnVlLCAnY29tbWFuZCc6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgJ2VtYmVkJzogdHJ1ZSwgJ2ZyYW1lJzogdHJ1ZSwgJ2hyJzogdHJ1ZSwgJ2ltZyc6IHRydWUsICdpbnB1dCc6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgJ2tleWdlbic6IHRydWUsICdsaW5rJzogdHJ1ZSwgJ21ldGEnOiB0cnVlLCAncGFyYW0nOiB0cnVlLCAnc291cmNlJzogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAndHJhY2snOiB0cnVlLCAnd2JyJzogdHJ1ZSwgJ21lbnVpdGVtJzogdHJ1ZX0sCiAgaW1wbGljaXRseUNsb3NlZDogeydkZCc6IHRydWUsICdsaSc6IHRydWUsICdvcHRncm91cCc6IHRydWUsICdvcHRpb24nOiB0cnVlLCAncCc6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICdycCc6IHRydWUsICdydCc6IHRydWUsICd0Ym9keSc6IHRydWUsICd0ZCc6IHRydWUsICd0Zm9vdCc6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICd0aCc6IHRydWUsICd0cic6IHRydWV9LAogIGNvbnRleHRHcmFiYmVyczogewogICAgJ2RkJzogeydkZCc6IHRydWUsICdkdCc6IHRydWV9LAogICAgJ2R0JzogeydkZCc6IHRydWUsICdkdCc6IHRydWV9LAogICAgJ2xpJzogeydsaSc6IHRydWV9LAogICAgJ29wdGlvbic6IHsnb3B0aW9uJzogdHJ1ZSwgJ29wdGdyb3VwJzogdHJ1ZX0sCiAgICAnb3B0Z3JvdXAnOiB7J29wdGdyb3VwJzogdHJ1ZX0sCiAgICAncCc6IHsnYWRkcmVzcyc6IHRydWUsICdhcnRpY2xlJzogdHJ1ZSwgJ2FzaWRlJzogdHJ1ZSwgJ2Jsb2NrcXVvdGUnOiB0cnVlLCAnZGlyJzogdHJ1ZSwKICAgICAgICAgICdkaXYnOiB0cnVlLCAnZGwnOiB0cnVlLCAnZmllbGRzZXQnOiB0cnVlLCAnZm9vdGVyJzogdHJ1ZSwgJ2Zvcm0nOiB0cnVlLAogICAgICAgICAgJ2gxJzogdHJ1ZSwgJ2gyJzogdHJ1ZSwgJ2gzJzogdHJ1ZSwgJ2g0JzogdHJ1ZSwgJ2g1JzogdHJ1ZSwgJ2g2JzogdHJ1ZSwKICAgICAgICAgICdoZWFkZXInOiB0cnVlLCAnaGdyb3VwJzogdHJ1ZSwgJ2hyJzogdHJ1ZSwgJ21lbnUnOiB0cnVlLCAnbmF2JzogdHJ1ZSwgJ29sJzogdHJ1ZSwKICAgICAgICAgICdwJzogdHJ1ZSwgJ3ByZSc6IHRydWUsICdzZWN0aW9uJzogdHJ1ZSwgJ3RhYmxlJzogdHJ1ZSwgJ3VsJzogdHJ1ZX0sCiAgICAncnAnOiB7J3JwJzogdHJ1ZSwgJ3J0JzogdHJ1ZX0sCiAgICAncnQnOiB7J3JwJzogdHJ1ZSwgJ3J0JzogdHJ1ZX0sCiAgICAndGJvZHknOiB7J3Rib2R5JzogdHJ1ZSwgJ3Rmb290JzogdHJ1ZX0sCiAgICAndGQnOiB7J3RkJzogdHJ1ZSwgJ3RoJzogdHJ1ZX0sCiAgICAndGZvb3QnOiB7J3Rib2R5JzogdHJ1ZX0sCiAgICAndGgnOiB7J3RkJzogdHJ1ZSwgJ3RoJzogdHJ1ZX0sCiAgICAndGhlYWQnOiB7J3Rib2R5JzogdHJ1ZSwgJ3Rmb290JzogdHJ1ZX0sCiAgICAndHInOiB7J3RyJzogdHJ1ZX0KICB9LAogIGRvTm90SW5kZW50OiB7InByZSI6IHRydWV9LAogIGFsbG93VW5xdW90ZWQ6IHRydWUsCiAgYWxsb3dNaXNzaW5nOiB0cnVlLAogIGNhc2VGb2xkOiB0cnVlCn0KCnZhciB4bWxDb25maWcgPSB7CiAgYXV0b1NlbGZDbG9zZXJzOiB7fSwKICBpbXBsaWNpdGx5Q2xvc2VkOiB7fSwKICBjb250ZXh0R3JhYmJlcnM6IHt9LAogIGRvTm90SW5kZW50OiB7fSwKICBhbGxvd1VucXVvdGVkOiBmYWxzZSwKICBhbGxvd01pc3Npbmc6IGZhbHNlLAogIGNhc2VGb2xkOiBmYWxzZQp9CgpDb2RlTWlycm9yLmRlZmluZU1vZGUoInhtbCIsIGZ1bmN0aW9uKGVkaXRvckNvbmYsIGNvbmZpZ18pIHsKICB2YXIgaW5kZW50VW5pdCA9IGVkaXRvckNvbmYuaW5kZW50VW5pdAogIHZhciBjb25maWcgPSB7fQogIHZhciBkZWZhdWx0cyA9IGNvbmZpZ18uaHRtbE1vZGUgPyBodG1sQ29uZmlnIDogeG1sQ29uZmlnCiAgZm9yICh2YXIgcHJvcCBpbiBkZWZhdWx0cykgY29uZmlnW3Byb3BdID0gZGVmYXVsdHNbcHJvcF0KICBmb3IgKHZhciBwcm9wIGluIGNvbmZpZ18pIGNvbmZpZ1twcm9wXSA9IGNvbmZpZ19bcHJvcF0KCiAgLy8gUmV0dXJuIHZhcmlhYmxlcyBmb3IgdG9rZW5pemVycwogIHZhciB0eXBlLCBzZXRTdHlsZTsKCiAgZnVuY3Rpb24gaW5UZXh0KHN0cmVhbSwgc3RhdGUpIHsKICAgIGZ1bmN0aW9uIGNoYWluKHBhcnNlcikgewogICAgICBzdGF0ZS50b2tlbml6ZSA9IHBhcnNlcjsKICAgICAgcmV0dXJuIHBhcnNlcihzdHJlYW0sIHN0YXRlKTsKICAgIH0KCiAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpOwogICAgaWYgKGNoID09ICI8IikgewogICAgICBpZiAoc3RyZWFtLmVhdCgiISIpKSB7CiAgICAgICAgaWYgKHN0cmVhbS5lYXQoIlsiKSkgewogICAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgiQ0RBVEFbIikpIHJldHVybiBjaGFpbihpbkJsb2NrKCJhdG9tIiwgIl1dPiIpKTsKICAgICAgICAgIGVsc2UgcmV0dXJuIG51bGw7CiAgICAgICAgfSBlbHNlIGlmIChzdHJlYW0ubWF0Y2goIi0tIikpIHsKICAgICAgICAgIHJldHVybiBjaGFpbihpbkJsb2NrKCJjb21tZW50IiwgIi0tPiIpKTsKICAgICAgICB9IGVsc2UgaWYgKHN0cmVhbS5tYXRjaCgiRE9DVFlQRSIsIHRydWUsIHRydWUpKSB7CiAgICAgICAgICBzdHJlYW0uZWF0V2hpbGUoL1tcd1wuX1wtXS8pOwogICAgICAgICAgcmV0dXJuIGNoYWluKGRvY3R5cGUoMSkpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLmVhdCgiPyIpKSB7CiAgICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXHdcLl9cLV0vKTsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IGluQmxvY2soIm1ldGEiLCAiPz4iKTsKICAgICAgICByZXR1cm4gIm1ldGEiOwogICAgICB9IGVsc2UgewogICAgICAgIHR5cGUgPSBzdHJlYW0uZWF0KCIvIikgPyAiY2xvc2VUYWciIDogIm9wZW5UYWciOwogICAgICAgIHN0YXRlLnRva2VuaXplID0gaW5UYWc7CiAgICAgICAgcmV0dXJuICJ0YWcgYnJhY2tldCI7CiAgICAgIH0KICAgIH0gZWxzZSBpZiAoY2ggPT0gIiYiKSB7CiAgICAgIHZhciBvazsKICAgICAgaWYgKHN0cmVhbS5lYXQoIiMiKSkgewogICAgICAgIGlmIChzdHJlYW0uZWF0KCJ4IikpIHsKICAgICAgICAgIG9rID0gc3RyZWFtLmVhdFdoaWxlKC9bYS1mQS1GXGRdLykgJiYgc3RyZWFtLmVhdCgiOyIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBvayA9IHN0cmVhbS5lYXRXaGlsZSgvW1xkXS8pICYmIHN0cmVhbS5lYXQoIjsiKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgb2sgPSBzdHJlYW0uZWF0V2hpbGUoL1tcd1wuXC06XS8pICYmIHN0cmVhbS5lYXQoIjsiKTsKICAgICAgfQogICAgICByZXR1cm4gb2sgPyAiYXRvbSIgOiAiZXJyb3IiOwogICAgfSBlbHNlIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKC9bXiY8XS8pOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICB9CiAgaW5UZXh0LmlzSW5UZXh0ID0gdHJ1ZTsKCiAgZnVuY3Rpb24gaW5UYWcoc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIGNoID0gc3RyZWFtLm5leHQoKTsKICAgIGlmIChjaCA9PSAiPiIgfHwgKGNoID09ICIvIiAmJiBzdHJlYW0uZWF0KCI+IikpKSB7CiAgICAgIHN0YXRlLnRva2VuaXplID0gaW5UZXh0OwogICAgICB0eXBlID0gY2ggPT0gIj4iID8gImVuZFRhZyIgOiAic2VsZmNsb3NlVGFnIjsKICAgICAgcmV0dXJuICJ0YWcgYnJhY2tldCI7CiAgICB9IGVsc2UgaWYgKGNoID09ICI9IikgewogICAgICB0eXBlID0gImVxdWFscyI7CiAgICAgIHJldHVybiBudWxsOwogICAgfSBlbHNlIGlmIChjaCA9PSAiPCIpIHsKICAgICAgc3RhdGUudG9rZW5pemUgPSBpblRleHQ7CiAgICAgIHN0YXRlLnN0YXRlID0gYmFzZVN0YXRlOwogICAgICBzdGF0ZS50YWdOYW1lID0gc3RhdGUudGFnU3RhcnQgPSBudWxsOwogICAgICB2YXIgbmV4dCA9IHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgICByZXR1cm4gbmV4dCA/IG5leHQgKyAiIHRhZyBlcnJvciIgOiAidGFnIGVycm9yIjsKICAgIH0gZWxzZSBpZiAoL1tcJ1wiXS8udGVzdChjaCkpIHsKICAgICAgc3RhdGUudG9rZW5pemUgPSBpbkF0dHJpYnV0ZShjaCk7CiAgICAgIHN0YXRlLnN0cmluZ1N0YXJ0Q29sID0gc3RyZWFtLmNvbHVtbigpOwogICAgICByZXR1cm4gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CiAgICB9IGVsc2UgewogICAgICBzdHJlYW0ubWF0Y2goL15bXlxzXHUwMGEwPTw+XCJcJ10qW15cc1x1MDBhMD08PlwiXCdcL10vKTsKICAgICAgcmV0dXJuICJ3b3JkIjsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGluQXR0cmlidXRlKHF1b3RlKSB7CiAgICB2YXIgY2xvc3VyZSA9IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgd2hpbGUgKCFzdHJlYW0uZW9sKCkpIHsKICAgICAgICBpZiAoc3RyZWFtLm5leHQoKSA9PSBxdW90ZSkgewogICAgICAgICAgc3RhdGUudG9rZW5pemUgPSBpblRhZzsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gInN0cmluZyI7CiAgICB9OwogICAgY2xvc3VyZS5pc0luQXR0cmlidXRlID0gdHJ1ZTsKICAgIHJldHVybiBjbG9zdXJlOwogIH0KCiAgZnVuY3Rpb24gaW5CbG9jayhzdHlsZSwgdGVybWluYXRvcikgewogICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgd2hpbGUgKCFzdHJlYW0uZW9sKCkpIHsKICAgICAgICBpZiAoc3RyZWFtLm1hdGNoKHRlcm1pbmF0b3IpKSB7CiAgICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IGluVGV4dDsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBzdHJlYW0ubmV4dCgpOwogICAgICB9CiAgICAgIHJldHVybiBzdHlsZTsKICAgIH07CiAgfQogIGZ1bmN0aW9uIGRvY3R5cGUoZGVwdGgpIHsKICAgIHJldHVybiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHZhciBjaDsKICAgICAgd2hpbGUgKChjaCA9IHN0cmVhbS5uZXh0KCkpICE9IG51bGwpIHsKICAgICAgICBpZiAoY2ggPT0gIjwiKSB7CiAgICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IGRvY3R5cGUoZGVwdGggKyAxKTsKICAgICAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgICAgICB9IGVsc2UgaWYgKGNoID09ICI+IikgewogICAgICAgICAgaWYgKGRlcHRoID09IDEpIHsKICAgICAgICAgICAgc3RhdGUudG9rZW5pemUgPSBpblRleHQ7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3RhdGUudG9rZW5pemUgPSBkb2N0eXBlKGRlcHRoIC0gMSk7CiAgICAgICAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuICJtZXRhIjsKICAgIH07CiAgfQoKICBmdW5jdGlvbiBDb250ZXh0KHN0YXRlLCB0YWdOYW1lLCBzdGFydE9mTGluZSkgewogICAgdGhpcy5wcmV2ID0gc3RhdGUuY29udGV4dDsKICAgIHRoaXMudGFnTmFtZSA9IHRhZ05hbWU7CiAgICB0aGlzLmluZGVudCA9IHN0YXRlLmluZGVudGVkOwogICAgdGhpcy5zdGFydE9mTGluZSA9IHN0YXJ0T2ZMaW5lOwogICAgaWYgKGNvbmZpZy5kb05vdEluZGVudC5oYXNPd25Qcm9wZXJ0eSh0YWdOYW1lKSB8fCAoc3RhdGUuY29udGV4dCAmJiBzdGF0ZS5jb250ZXh0Lm5vSW5kZW50KSkKICAgICAgdGhpcy5ub0luZGVudCA9IHRydWU7CiAgfQogIGZ1bmN0aW9uIHBvcENvbnRleHQoc3RhdGUpIHsKICAgIGlmIChzdGF0ZS5jb250ZXh0KSBzdGF0ZS5jb250ZXh0ID0gc3RhdGUuY29udGV4dC5wcmV2OwogIH0KICBmdW5jdGlvbiBtYXliZVBvcENvbnRleHQoc3RhdGUsIG5leHRUYWdOYW1lKSB7CiAgICB2YXIgcGFyZW50VGFnTmFtZTsKICAgIHdoaWxlICh0cnVlKSB7CiAgICAgIGlmICghc3RhdGUuY29udGV4dCkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBwYXJlbnRUYWdOYW1lID0gc3RhdGUuY29udGV4dC50YWdOYW1lOwogICAgICBpZiAoIWNvbmZpZy5jb250ZXh0R3JhYmJlcnMuaGFzT3duUHJvcGVydHkocGFyZW50VGFnTmFtZSkgfHwKICAgICAgICAgICFjb25maWcuY29udGV4dEdyYWJiZXJzW3BhcmVudFRhZ05hbWVdLmhhc093blByb3BlcnR5KG5leHRUYWdOYW1lKSkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBwb3BDb250ZXh0KHN0YXRlKTsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGJhc2VTdGF0ZSh0eXBlLCBzdHJlYW0sIHN0YXRlKSB7CiAgICBpZiAodHlwZSA9PSAib3BlblRhZyIpIHsKICAgICAgc3RhdGUudGFnU3RhcnQgPSBzdHJlYW0uY29sdW1uKCk7CiAgICAgIHJldHVybiB0YWdOYW1lU3RhdGU7CiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gImNsb3NlVGFnIikgewogICAgICByZXR1cm4gY2xvc2VUYWdOYW1lU3RhdGU7CiAgICB9IGVsc2UgewogICAgICByZXR1cm4gYmFzZVN0YXRlOwogICAgfQogIH0KICBmdW5jdGlvbiB0YWdOYW1lU3RhdGUodHlwZSwgc3RyZWFtLCBzdGF0ZSkgewogICAgaWYgKHR5cGUgPT0gIndvcmQiKSB7CiAgICAgIHN0YXRlLnRhZ05hbWUgPSBzdHJlYW0uY3VycmVudCgpOwogICAgICBzZXRTdHlsZSA9ICJ0YWciOwogICAgICByZXR1cm4gYXR0clN0YXRlOwogICAgfSBlbHNlIHsKICAgICAgc2V0U3R5bGUgPSAiZXJyb3IiOwogICAgICByZXR1cm4gdGFnTmFtZVN0YXRlOwogICAgfQogIH0KICBmdW5jdGlvbiBjbG9zZVRhZ05hbWVTdGF0ZSh0eXBlLCBzdHJlYW0sIHN0YXRlKSB7CiAgICBpZiAodHlwZSA9PSAid29yZCIpIHsKICAgICAgdmFyIHRhZ05hbWUgPSBzdHJlYW0uY3VycmVudCgpOwogICAgICBpZiAoc3RhdGUuY29udGV4dCAmJiBzdGF0ZS5jb250ZXh0LnRhZ05hbWUgIT0gdGFnTmFtZSAmJgogICAgICAgICAgY29uZmlnLmltcGxpY2l0bHlDbG9zZWQuaGFzT3duUHJvcGVydHkoc3RhdGUuY29udGV4dC50YWdOYW1lKSkKICAgICAgICBwb3BDb250ZXh0KHN0YXRlKTsKICAgICAgaWYgKChzdGF0ZS5jb250ZXh0ICYmIHN0YXRlLmNvbnRleHQudGFnTmFtZSA9PSB0YWdOYW1lKSB8fCBjb25maWcubWF0Y2hDbG9zaW5nID09PSBmYWxzZSkgewogICAgICAgIHNldFN0eWxlID0gInRhZyI7CiAgICAgICAgcmV0dXJuIGNsb3NlU3RhdGU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc2V0U3R5bGUgPSAidGFnIGVycm9yIjsKICAgICAgICByZXR1cm4gY2xvc2VTdGF0ZUVycjsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgc2V0U3R5bGUgPSAiZXJyb3IiOwogICAgICByZXR1cm4gY2xvc2VTdGF0ZUVycjsKICAgIH0KICB9CgogIGZ1bmN0aW9uIGNsb3NlU3RhdGUodHlwZSwgX3N0cmVhbSwgc3RhdGUpIHsKICAgIGlmICh0eXBlICE9ICJlbmRUYWciKSB7CiAgICAgIHNldFN0eWxlID0gImVycm9yIjsKICAgICAgcmV0dXJuIGNsb3NlU3RhdGU7CiAgICB9CiAgICBwb3BDb250ZXh0KHN0YXRlKTsKICAgIHJldHVybiBiYXNlU3RhdGU7CiAgfQogIGZ1bmN0aW9uIGNsb3NlU3RhdGVFcnIodHlwZSwgc3RyZWFtLCBzdGF0ZSkgewogICAgc2V0U3R5bGUgPSAiZXJyb3IiOwogICAgcmV0dXJuIGNsb3NlU3RhdGUodHlwZSwgc3RyZWFtLCBzdGF0ZSk7CiAgfQoKICBmdW5jdGlvbiBhdHRyU3RhdGUodHlwZSwgX3N0cmVhbSwgc3RhdGUpIHsKICAgIGlmICh0eXBlID09ICJ3b3JkIikgewogICAgICBzZXRTdHlsZSA9ICJhdHRyaWJ1dGUiOwogICAgICByZXR1cm4gYXR0ckVxU3RhdGU7CiAgICB9IGVsc2UgaWYgKHR5cGUgPT0gImVuZFRhZyIgfHwgdHlwZSA9PSAic2VsZmNsb3NlVGFnIikgewogICAgICB2YXIgdGFnTmFtZSA9IHN0YXRlLnRhZ05hbWUsIHRhZ1N0YXJ0ID0gc3RhdGUudGFnU3RhcnQ7CiAgICAgIHN0YXRlLnRhZ05hbWUgPSBzdGF0ZS50YWdTdGFydCA9IG51bGw7CiAgICAgIGlmICh0eXBlID09ICJzZWxmY2xvc2VUYWciIHx8CiAgICAgICAgICBjb25maWcuYXV0b1NlbGZDbG9zZXJzLmhhc093blByb3BlcnR5KHRhZ05hbWUpKSB7CiAgICAgICAgbWF5YmVQb3BDb250ZXh0KHN0YXRlLCB0YWdOYW1lKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBtYXliZVBvcENvbnRleHQoc3RhdGUsIHRhZ05hbWUpOwogICAgICAgIHN0YXRlLmNvbnRleHQgPSBuZXcgQ29udGV4dChzdGF0ZSwgdGFnTmFtZSwgdGFnU3RhcnQgPT0gc3RhdGUuaW5kZW50ZWQpOwogICAgICB9CiAgICAgIHJldHVybiBiYXNlU3RhdGU7CiAgICB9CiAgICBzZXRTdHlsZSA9ICJlcnJvciI7CiAgICByZXR1cm4gYXR0clN0YXRlOwogIH0KICBmdW5jdGlvbiBhdHRyRXFTdGF0ZSh0eXBlLCBzdHJlYW0sIHN0YXRlKSB7CiAgICBpZiAodHlwZSA9PSAiZXF1YWxzIikgcmV0dXJuIGF0dHJWYWx1ZVN0YXRlOwogICAgaWYgKCFjb25maWcuYWxsb3dNaXNzaW5nKSBzZXRTdHlsZSA9ICJlcnJvciI7CiAgICByZXR1cm4gYXR0clN0YXRlKHR5cGUsIHN0cmVhbSwgc3RhdGUpOwogIH0KICBmdW5jdGlvbiBhdHRyVmFsdWVTdGF0ZSh0eXBlLCBzdHJlYW0sIHN0YXRlKSB7CiAgICBpZiAodHlwZSA9PSAic3RyaW5nIikgcmV0dXJuIGF0dHJDb250aW51ZWRTdGF0ZTsKICAgIGlmICh0eXBlID09ICJ3b3JkIiAmJiBjb25maWcuYWxsb3dVbnF1b3RlZCkge3NldFN0eWxlID0gInN0cmluZyI7IHJldHVybiBhdHRyU3RhdGU7fQogICAgc2V0U3R5bGUgPSAiZXJyb3IiOwogICAgcmV0dXJuIGF0dHJTdGF0ZSh0eXBlLCBzdHJlYW0sIHN0YXRlKTsKICB9CiAgZnVuY3Rpb24gYXR0ckNvbnRpbnVlZFN0YXRlKHR5cGUsIHN0cmVhbSwgc3RhdGUpIHsKICAgIGlmICh0eXBlID09ICJzdHJpbmciKSByZXR1cm4gYXR0ckNvbnRpbnVlZFN0YXRlOwogICAgcmV0dXJuIGF0dHJTdGF0ZSh0eXBlLCBzdHJlYW0sIHN0YXRlKTsKICB9CgogIHJldHVybiB7CiAgICBzdGFydFN0YXRlOiBmdW5jdGlvbihiYXNlSW5kZW50KSB7CiAgICAgIHZhciBzdGF0ZSA9IHt0b2tlbml6ZTogaW5UZXh0LAogICAgICAgICAgICAgICAgICAgc3RhdGU6IGJhc2VTdGF0ZSwKICAgICAgICAgICAgICAgICAgIGluZGVudGVkOiBiYXNlSW5kZW50IHx8IDAsCiAgICAgICAgICAgICAgICAgICB0YWdOYW1lOiBudWxsLCB0YWdTdGFydDogbnVsbCwKICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IG51bGx9CiAgICAgIGlmIChiYXNlSW5kZW50ICE9IG51bGwpIHN0YXRlLmJhc2VJbmRlbnQgPSBiYXNlSW5kZW50CiAgICAgIHJldHVybiBzdGF0ZQogICAgfSwKCiAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICBpZiAoIXN0YXRlLnRhZ05hbWUgJiYgc3RyZWFtLnNvbCgpKQogICAgICAgIHN0YXRlLmluZGVudGVkID0gc3RyZWFtLmluZGVudGF0aW9uKCk7CgogICAgICBpZiAoc3RyZWFtLmVhdFNwYWNlKCkpIHJldHVybiBudWxsOwogICAgICB0eXBlID0gbnVsbDsKICAgICAgdmFyIHN0eWxlID0gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CiAgICAgIGlmICgoc3R5bGUgfHwgdHlwZSkgJiYgc3R5bGUgIT0gImNvbW1lbnQiKSB7CiAgICAgICAgc2V0U3R5bGUgPSBudWxsOwogICAgICAgIHN0YXRlLnN0YXRlID0gc3RhdGUuc3RhdGUodHlwZSB8fCBzdHlsZSwgc3RyZWFtLCBzdGF0ZSk7CiAgICAgICAgaWYgKHNldFN0eWxlKQogICAgICAgICAgc3R5bGUgPSBzZXRTdHlsZSA9PSAiZXJyb3IiID8gc3R5bGUgKyAiIGVycm9yIiA6IHNldFN0eWxlOwogICAgICB9CiAgICAgIHJldHVybiBzdHlsZTsKICAgIH0sCgogICAgaW5kZW50OiBmdW5jdGlvbihzdGF0ZSwgdGV4dEFmdGVyLCBmdWxsTGluZSkgewogICAgICB2YXIgY29udGV4dCA9IHN0YXRlLmNvbnRleHQ7CiAgICAgIC8vIEluZGVudCBtdWx0aS1saW5lIHN0cmluZ3MgKGUuZy4gY3NzKS4KICAgICAgaWYgKHN0YXRlLnRva2VuaXplLmlzSW5BdHRyaWJ1dGUpIHsKICAgICAgICBpZiAoc3RhdGUudGFnU3RhcnQgPT0gc3RhdGUuaW5kZW50ZWQpCiAgICAgICAgICByZXR1cm4gc3RhdGUuc3RyaW5nU3RhcnRDb2wgKyAxOwogICAgICAgIGVsc2UKICAgICAgICAgIHJldHVybiBzdGF0ZS5pbmRlbnRlZCArIGluZGVudFVuaXQ7CiAgICAgIH0KICAgICAgaWYgKGNvbnRleHQgJiYgY29udGV4dC5ub0luZGVudCkgcmV0dXJuIENvZGVNaXJyb3IuUGFzczsKICAgICAgaWYgKHN0YXRlLnRva2VuaXplICE9IGluVGFnICYmIHN0YXRlLnRva2VuaXplICE9IGluVGV4dCkKICAgICAgICByZXR1cm4gZnVsbExpbmUgPyBmdWxsTGluZS5tYXRjaCgvXihccyopLylbMF0ubGVuZ3RoIDogMDsKICAgICAgLy8gSW5kZW50IHRoZSBzdGFydHMgb2YgYXR0cmlidXRlIG5hbWVzLgogICAgICBpZiAoc3RhdGUudGFnTmFtZSkgewogICAgICAgIGlmIChjb25maWcubXVsdGlsaW5lVGFnSW5kZW50UGFzdFRhZyAhPT0gZmFsc2UpCiAgICAgICAgICByZXR1cm4gc3RhdGUudGFnU3RhcnQgKyBzdGF0ZS50YWdOYW1lLmxlbmd0aCArIDI7CiAgICAgICAgZWxzZQogICAgICAgICAgcmV0dXJuIHN0YXRlLnRhZ1N0YXJ0ICsgaW5kZW50VW5pdCAqIChjb25maWcubXVsdGlsaW5lVGFnSW5kZW50RmFjdG9yIHx8IDEpOwogICAgICB9CiAgICAgIGlmIChjb25maWcuYWxpZ25DREFUQSAmJiAvPCFcW0NEQVRBXFsvLnRlc3QodGV4dEFmdGVyKSkgcmV0dXJuIDA7CiAgICAgIHZhciB0YWdBZnRlciA9IHRleHRBZnRlciAmJiAvXjwoXC8pPyhbXHdfOlwuLV0qKS8uZXhlYyh0ZXh0QWZ0ZXIpOwogICAgICBpZiAodGFnQWZ0ZXIgJiYgdGFnQWZ0ZXJbMV0pIHsgLy8gQ2xvc2luZyB0YWcgc3BvdHRlZAogICAgICAgIHdoaWxlIChjb250ZXh0KSB7CiAgICAgICAgICBpZiAoY29udGV4dC50YWdOYW1lID09IHRhZ0FmdGVyWzJdKSB7CiAgICAgICAgICAgIGNvbnRleHQgPSBjb250ZXh0LnByZXY7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfSBlbHNlIGlmIChjb25maWcuaW1wbGljaXRseUNsb3NlZC5oYXNPd25Qcm9wZXJ0eShjb250ZXh0LnRhZ05hbWUpKSB7CiAgICAgICAgICAgIGNvbnRleHQgPSBjb250ZXh0LnByZXY7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAodGFnQWZ0ZXIpIHsgLy8gT3BlbmluZyB0YWcgc3BvdHRlZAogICAgICAgIHdoaWxlIChjb250ZXh0KSB7CiAgICAgICAgICB2YXIgZ3JhYmJlcnMgPSBjb25maWcuY29udGV4dEdyYWJiZXJzW2NvbnRleHQudGFnTmFtZV07CiAgICAgICAgICBpZiAoZ3JhYmJlcnMgJiYgZ3JhYmJlcnMuaGFzT3duUHJvcGVydHkodGFnQWZ0ZXJbMl0pKQogICAgICAgICAgICBjb250ZXh0ID0gY29udGV4dC5wcmV2OwogICAgICAgICAgZWxzZQogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgd2hpbGUgKGNvbnRleHQgJiYgY29udGV4dC5wcmV2ICYmICFjb250ZXh0LnN0YXJ0T2ZMaW5lKQogICAgICAgIGNvbnRleHQgPSBjb250ZXh0LnByZXY7CiAgICAgIGlmIChjb250ZXh0KSByZXR1cm4gY29udGV4dC5pbmRlbnQgKyBpbmRlbnRVbml0OwogICAgICBlbHNlIHJldHVybiBzdGF0ZS5iYXNlSW5kZW50IHx8IDA7CiAgICB9LAoKICAgIGVsZWN0cmljSW5wdXQ6IC88XC9bXHNcdzpdKz4kLywKICAgIGJsb2NrQ29tbWVudFN0YXJ0OiAiPCEtLSIsCiAgICBibG9ja0NvbW1lbnRFbmQ6ICItLT4iLAoKICAgIGNvbmZpZ3VyYXRpb246IGNvbmZpZy5odG1sTW9kZSA/ICJodG1sIiA6ICJ4bWwiLAogICAgaGVscGVyVHlwZTogY29uZmlnLmh0bWxNb2RlID8gImh0bWwiIDogInhtbCIsCgogICAgc2tpcEF0dHJpYnV0ZTogZnVuY3Rpb24oc3RhdGUpIHsKICAgICAgaWYgKHN0YXRlLnN0YXRlID09IGF0dHJWYWx1ZVN0YXRlKQogICAgICAgIHN0YXRlLnN0YXRlID0gYXR0clN0YXRlCiAgICB9CiAgfTsKfSk7CgpDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveG1sIiwgInhtbCIpOwpDb2RlTWlycm9yLmRlZmluZU1JTUUoImFwcGxpY2F0aW9uL3htbCIsICJ4bWwiKTsKaWYgKCFDb2RlTWlycm9yLm1pbWVNb2Rlcy5oYXNPd25Qcm9wZXJ0eSgidGV4dC9odG1sIikpCiAgQ29kZU1pcnJvci5kZWZpbmVNSU1FKCJ0ZXh0L2h0bWwiLCB7bmFtZTogInhtbCIsIGh0bWxNb2RlOiB0cnVlfSk7Cgp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/xquery/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/xquery/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogWFF1ZXJ5IG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL3RoZW1lL3hxLWRhcmsuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9InhxdWVyeS5qcyI+PC9zY3JpcHQ+CjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CgkuQ29kZU1pcnJvciB7CgkgIGJvcmRlci10b3A6IDFweCBzb2xpZCBibGFjazsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrOwoJICBoZWlnaHQ6NDAwcHg7Cgl9CiAgICA8L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxoMT5Db2RlTWlycm9yPC9oMT48aW1nIGlkPWxvZ28gc3JjPSIuLi8uLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5MYW5ndWFnZSBtb2RlczwvYT4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+WFF1ZXJ5PC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5YUXVlcnkgbW9kZTwvaDI+CiAKIAo8ZGl2IGNsYXNzPSJjbS1zLWRlZmF1bHQiPiAKCTx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+IAp4cXVlcnkgdmVyc2lvbiAmcXVvdDsxLjAtbWwmcXVvdDs7Cig6IHRoaXMgaXMKIDogYSAKICAgImNvbW1lbnQiIDopCmxldCAkbGV0IDo9ICZsdDt4IGF0dHI9JnF1b3Q7dmFsdWUmcXVvdDsmZ3Q7JnF1b3Q7dGVzdCZxdW90OyZsdDtmdW5jJmd0O2Z1bmN0aW9uKCkgJHZhciB7ZnVuY3Rpb24oKX0geyR2YXJ9Jmx0Oy9mdW5jJmd0OyZsdDsveCZndDsKbGV0ICRqb2U6PTEKcmV0dXJuIGVsZW1lbnQgZWxlbWVudCB7CglhdHRyaWJ1dGUgYXR0cmlidXRlIHsgMSB9LAoJZWxlbWVudCB0ZXN0IHsgJiMzOTthJiMzOTsgfSwgCglhdHRyaWJ1dGUgZm9vIHsgJnF1b3Q7YmFyJnF1b3Q7IH0sCglmbjpkb2MoKVsgZm9vL0BiYXIgZXEgJGxldCBdLAoJLy94IH0gICAgCiAKKDogYSBtb3JlICdldmlsJyB0ZXN0IDopCig6IE1vZGlmaWVkIEJsYWtlbGV5IGV4YW1wbGUgKDogd2l0aCBuZXN0ZWQgY29tbWVudCA6KSAuLi4gOikKZGVjbGFyZSBwcml2YXRlIGZ1bmN0aW9uIGxvY2FsOmRlY2xhcmUoKSB7KCl9OwpkZWNsYXJlIHByaXZhdGUgZnVuY3Rpb24gbG9jYWw6cHJpdmF0ZSgpIHsoKX07CmRlY2xhcmUgcHJpdmF0ZSBmdW5jdGlvbiBsb2NhbDpmdW5jdGlvbigpIHsoKX07CmRlY2xhcmUgcHJpdmF0ZSBmdW5jdGlvbiBsb2NhbDpsb2NhbCgpIHsoKX07CmxldCAkbGV0IDo9ICZsdDtsZXQmZ3Q7bGV0ICRsZXQgOj0gJnF1b3Q7bGV0JnF1b3Q7Jmx0Oy9sZXQmZ3Q7CnJldHVybiBlbGVtZW50IGVsZW1lbnQgewoJYXR0cmlidXRlIGF0dHJpYnV0ZSB7IHRyeSB7IHhkbXA6dmVyc2lvbigpIH0gY2F0Y2goJGUpIHsgeGRtcDpsb2coJGUpIH0gfSwKCWF0dHJpYnV0ZSBmbjpkb2MgeyAmcXVvdDtiYXImcXVvdDsgY2FzdGFibGUgYXMgeHM6c3RyaW5nIH0sCgllbGVtZW50IHRleHQgeyB0ZXh0IHsgJnF1b3Q7dGV4dCZxdW90OyB9IH0sCglmbjpkb2MoKVsgY2hpbGQ6OmVxLyhAYmFyIHwgYXR0cmlidXRlOjphdHRyaWJ1dGUpIGVxICRsZXQgXSwKCS8vZm46ZG9jCn0KCgoKeHF1ZXJ5IHZlcnNpb24gJnF1b3Q7MS4wLW1sJnF1b3Q7OwoKKDogQ29weXJpZ2h0IDIwMDYtMjAxMCBNYXJrIExvZ2ljIENvcnBvcmF0aW9uLiA6KQoKKDoKIDogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICZxdW90O0xpY2Vuc2UmcXVvdDspOwogOiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiA6IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogOgogOiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCiA6CiA6IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKIDogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gJnF1b3Q7QVMgSVMmcXVvdDsgQkFTSVMsCiA6IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogOiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiA6IGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogOikKCm1vZHVsZSBuYW1lc3BhY2UganNvbiA9ICZxdW90O2h0dHA6Ly9tYXJrbG9naWMuY29tL2pzb24mcXVvdDs7CmRlY2xhcmUgZGVmYXVsdCBmdW5jdGlvbiBuYW1lc3BhY2UgJnF1b3Q7aHR0cDovL3d3dy53My5vcmcvMjAwNS94cGF0aC1mdW5jdGlvbnMmcXVvdDs7CgooOiBOZWVkIHRvIGJhY2tzbGFzaCBlc2NhcGUgYW55IGRvdWJsZSBxdW90ZXMsIGJhY2tzbGFzaGVzLCBhbmQgbmV3bGluZXMgOikKZGVjbGFyZSBmdW5jdGlvbiBqc29uOmVzY2FwZSgkcyBhcyB4czpzdHJpbmcpIGFzIHhzOnN0cmluZyB7CiAgbGV0ICRzIDo9IHJlcGxhY2UoJHMsICZxdW90O1xcJnF1b3Q7LCAmcXVvdDtcXFxcJnF1b3Q7KQogIGxldCAkcyA6PSByZXBsYWNlKCRzLCAmcXVvdDsmcXVvdDsmcXVvdDsmcXVvdDssICZxdW90O1xcJnF1b3Q7JnF1b3Q7JnF1b3Q7KQogIGxldCAkcyA6PSByZXBsYWNlKCRzLCBjb2RlcG9pbnRzLXRvLXN0cmluZygoMTMsIDEwKSksICZxdW90O1xcbiZxdW90OykKICBsZXQgJHMgOj0gcmVwbGFjZSgkcywgY29kZXBvaW50cy10by1zdHJpbmcoMTMpLCAmcXVvdDtcXG4mcXVvdDspCiAgbGV0ICRzIDo9IHJlcGxhY2UoJHMsIGNvZGVwb2ludHMtdG8tc3RyaW5nKDEwKSwgJnF1b3Q7XFxuJnF1b3Q7KQogIHJldHVybiAkcwp9OwoKZGVjbGFyZSBmdW5jdGlvbiBqc29uOmF0b21pemUoJHggYXMgZWxlbWVudCgpKSBhcyB4czpzdHJpbmcgewogIGlmIChjb3VudCgkeC9ub2RlKCkpID0gMCkgdGhlbiAnbnVsbCcKICBlbHNlIGlmICgkeC9AdHlwZSA9ICZxdW90O251bWJlciZxdW90OykgdGhlbgogICAgbGV0ICRjYXN0YWJsZSA6PSAkeCBjYXN0YWJsZSBhcyB4czpmbG9hdCBvcgogICAgICAgICAgICAgICAgICAgICAkeCBjYXN0YWJsZSBhcyB4czpkb3VibGUgb3IKICAgICAgICAgICAgICAgICAgICAgJHggY2FzdGFibGUgYXMgeHM6ZGVjaW1hbAogICAgcmV0dXJuCiAgICBpZiAoJGNhc3RhYmxlKSB0aGVuIHhzOnN0cmluZygkeCkKICAgIGVsc2UgZXJyb3IoY29uY2F0KCZxdW90O05vdCBhIG51bWJlcjogJnF1b3Q7LCB4ZG1wOmRlc2NyaWJlKCR4KSkpCiAgZWxzZSBpZiAoJHgvQHR5cGUgPSAmcXVvdDtib29sZWFuJnF1b3Q7KSB0aGVuCiAgICBsZXQgJGNhc3RhYmxlIDo9ICR4IGNhc3RhYmxlIGFzIHhzOmJvb2xlYW4KICAgIHJldHVybgogICAgaWYgKCRjYXN0YWJsZSkgdGhlbiB4czpzdHJpbmcoeHM6Ym9vbGVhbigkeCkpCiAgICBlbHNlIGVycm9yKGNvbmNhdCgmcXVvdDtOb3QgYSBib29sZWFuOiAmcXVvdDssIHhkbXA6ZGVzY3JpYmUoJHgpKSkKICBlbHNlIGNvbmNhdCgnJnF1b3Q7JywganNvbjplc2NhcGUoJHgpLCAnJnF1b3Q7JykKfTsKCig6IFByaW50IHRoZSB0aGluZyB0aGF0IGNvbWVzIGFmdGVyIHRoZSBjb2xvbiA6KQpkZWNsYXJlIGZ1bmN0aW9uIGpzb246cHJpbnQtdmFsdWUoJHggYXMgZWxlbWVudCgpKSBhcyB4czpzdHJpbmcgewogIGlmIChjb3VudCgkeC8qKSA9IDApIHRoZW4KICAgIGpzb246YXRvbWl6ZSgkeCkKICBlbHNlIGlmICgkeC9AcXVvdGUgPSAmcXVvdDt0cnVlJnF1b3Q7KSB0aGVuCiAgICBjb25jYXQoJyZxdW90OycsIGpzb246ZXNjYXBlKHhkbXA6cXVvdGUoJHgvbm9kZSgpKSksICcmcXVvdDsnKQogIGVsc2UKICAgIHN0cmluZy1qb2luKCgneycsCiAgICAgIHN0cmluZy1qb2luKGZvciAkaSBpbiAkeC8qIHJldHVybiBqc29uOnByaW50LW5hbWUtdmFsdWUoJGkpLCAmcXVvdDssJnF1b3Q7KSwKICAgICd9JyksICZxdW90OyZxdW90OykKfTsKCig6IFByaW50IHRoZSBuYW1lIGFuZCB2YWx1ZSBib3RoIDopCmRlY2xhcmUgZnVuY3Rpb24ganNvbjpwcmludC1uYW1lLXZhbHVlKCR4IGFzIGVsZW1lbnQoKSkgYXMgeHM6c3RyaW5nPyB7CiAgbGV0ICRuYW1lIDo9IG5hbWUoJHgpCiAgbGV0ICRmaXJzdC1pbi1hcnJheSA6PQogICAgY291bnQoJHgvcHJlY2VkaW5nLXNpYmxpbmc6OipbbmFtZSguKSA9ICRuYW1lXSkgPSAwIGFuZAogICAgKGNvdW50KCR4L2ZvbGxvd2luZy1zaWJsaW5nOjoqW25hbWUoLikgPSAkbmFtZV0pICZndDsgMCBvciAkeC9AYXJyYXkgPSAmcXVvdDt0cnVlJnF1b3Q7KQogIGxldCAkbGF0ZXItaW4tYXJyYXkgOj0gY291bnQoJHgvcHJlY2VkaW5nLXNpYmxpbmc6OipbbmFtZSguKSA9ICRuYW1lXSkgJmd0OyAwCiAgcmV0dXJuCgogIGlmICgkbGF0ZXItaW4tYXJyYXkpIHRoZW4KICAgICgpICAoOiBJIHdhcyBoYW5kbGVkIHByZXZpb3VzbHkgOikKICBlbHNlIGlmICgkZmlyc3QtaW4tYXJyYXkpIHRoZW4KICAgIHN0cmluZy1qb2luKCgnJnF1b3Q7JywganNvbjplc2NhcGUoJG5hbWUpLCAnJnF1b3Q7OlsnLAogICAgICBzdHJpbmctam9pbigoZm9yICRpIGluICgkeCwgJHgvZm9sbG93aW5nLXNpYmxpbmc6OipbbmFtZSguKSA9ICRuYW1lXSkgcmV0dXJuIGpzb246cHJpbnQtdmFsdWUoJGkpKSwgJnF1b3Q7LCZxdW90OyksCiAgICAnXScpLCAmcXVvdDsmcXVvdDspCiAgIGVsc2UKICAgICBzdHJpbmctam9pbigoJyZxdW90OycsIGpzb246ZXNjYXBlKCRuYW1lKSwgJyZxdW90OzonLCBqc29uOnByaW50LXZhbHVlKCR4KSksICZxdW90OyZxdW90OykKfTsKCig6fgogIFRyYW5zZm9ybXMgYW4gWE1MIGVsZW1lbnQgaW50byBhIEpTT04gc3RyaW5nIHJlcHJlc2VudGF0aW9uLiAgU2VlIGh0dHA6Ly9qc29uLm9yZy4KICAmbHQ7cC8mZ3Q7CiAgU2FtcGxlIHVzYWdlOgogICZsdDtwcmUmZ3Q7CiAgICB4cXVlcnkgdmVyc2lvbiAmcXVvdDsxLjAtbWwmcXVvdDs7CiAgICBpbXBvcnQgbW9kdWxlIG5hbWVzcGFjZSBqc29uPSZxdW90O2h0dHA6Ly9tYXJrbG9naWMuY29tL2pzb24mcXVvdDsgYXQgJnF1b3Q7anNvbi54cXkmcXVvdDs7CiAgICBqc29uOnNlcmlhbGl6ZSgmYW1wO2x0O2ZvbyZhbXA7Z3Q7JmFtcDtsdDtiYXImYW1wO2d0O2tpZCZhbXA7bHQ7L2JhciZhbXA7Z3Q7JmFtcDtsdDsvZm9vJmFtcDtndDspCiAgJmx0Oy9wcmUmZ3Q7CiAgU2FtcGxlIHRyYW5zZm9ybWF0aW9uczoKICAmbHQ7cHJlJmd0OwogICZhbXA7bHQ7ZS8mYW1wO2d0OyBiZWNvbWVzIHsmcXVvdDtlJnF1b3Q7Om51bGx9CiAgJmFtcDtsdDtlJmFtcDtndDt0ZXh0JmFtcDtsdDsvZSZhbXA7Z3Q7IGJlY29tZXMgeyZxdW90O2UmcXVvdDs6JnF1b3Q7dGV4dCZxdW90O30KICAmYW1wO2x0O2UmYW1wO2d0O3F1b3RlICZxdW90OyBlc2NhcGluZyZhbXA7bHQ7L2UmYW1wO2d0OyBiZWNvbWVzIHsmcXVvdDtlJnF1b3Q7OiZxdW90O3F1b3RlIFwmcXVvdDsgZXNjYXBpbmcmcXVvdDt9CiAgJmFtcDtsdDtlJmFtcDtndDtiYWNrc2xhc2ggXCBlc2NhcGluZyZhbXA7bHQ7L2UmYW1wO2d0OyBiZWNvbWVzIHsmcXVvdDtlJnF1b3Q7OiZxdW90O2JhY2tzbGFzaCBcXCBlc2NhcGluZyZxdW90O30KICAmYW1wO2x0O2UmYW1wO2d0OyZhbXA7bHQ7YSZhbXA7Z3Q7dGV4dDEmYW1wO2x0Oy9hJmFtcDtndDsmYW1wO2x0O2ImYW1wO2d0O3RleHQyJmFtcDtsdDsvYiZhbXA7Z3Q7JmFtcDtsdDsvZSZhbXA7Z3Q7IGJlY29tZXMgeyZxdW90O2UmcXVvdDs6eyZxdW90O2EmcXVvdDs6JnF1b3Q7dGV4dDEmcXVvdDssJnF1b3Q7YiZxdW90OzomcXVvdDt0ZXh0MiZxdW90O319CiAgJmFtcDtsdDtlJmFtcDtndDsmYW1wO2x0O2EmYW1wO2d0O3RleHQxJmFtcDtsdDsvYSZhbXA7Z3Q7JmFtcDtsdDthJmFtcDtndDt0ZXh0MiZhbXA7bHQ7L2EmYW1wO2d0OyZhbXA7bHQ7L2UmYW1wO2d0OyBiZWNvbWVzIHsmcXVvdDtlJnF1b3Q7OnsmcXVvdDthJnF1b3Q7OlsmcXVvdDt0ZXh0MSZxdW90OywmcXVvdDt0ZXh0MiZxdW90O119fQogICZhbXA7bHQ7ZSZhbXA7Z3Q7JmFtcDtsdDthIGFycmF5PSZxdW90O3RydWUmcXVvdDsmYW1wO2d0O3RleHQxJmFtcDtsdDsvYSZhbXA7Z3Q7JmFtcDtsdDsvZSZhbXA7Z3Q7IGJlY29tZXMgeyZxdW90O2UmcXVvdDs6eyZxdW90O2EmcXVvdDs6WyZxdW90O3RleHQxJnF1b3Q7XX19CiAgJmFtcDtsdDtlJmFtcDtndDsmYW1wO2x0O2EgdHlwZT0mcXVvdDtib29sZWFuJnF1b3Q7JmFtcDtndDtmYWxzZSZhbXA7bHQ7L2EmYW1wO2d0OyZhbXA7bHQ7L2UmYW1wO2d0OyBiZWNvbWVzIHsmcXVvdDtlJnF1b3Q7OnsmcXVvdDthJnF1b3Q7OmZhbHNlfX0KICAmYW1wO2x0O2UmYW1wO2d0OyZhbXA7bHQ7YSB0eXBlPSZxdW90O251bWJlciZxdW90OyZhbXA7Z3Q7MTIzLjUmYW1wO2x0Oy9hJmFtcDtndDsmYW1wO2x0Oy9lJmFtcDtndDsgYmVjb21lcyB7JnF1b3Q7ZSZxdW90Ozp7JnF1b3Q7YSZxdW90OzoxMjMuNX19CiAgJmFtcDtsdDtlIHF1b3RlPSZxdW90O3RydWUmcXVvdDsmYW1wO2d0OyZhbXA7bHQ7ZGl2IGF0dHJpYj0mcXVvdDt2YWx1ZSZxdW90Oy8mYW1wO2d0OyZhbXA7bHQ7L2UmYW1wO2d0OyBiZWNvbWVzIHsmcXVvdDtlJnF1b3Q7OiZxdW90OyZhbXA7bHQ7ZGl2IGF0dHJpYj1cJnF1b3Q7dmFsdWVcJnF1b3Q7LyZhbXA7Z3Q7JnF1b3Q7fQogICZsdDsvcHJlJmd0OwogICZsdDtwLyZndDsKICBOYW1lc3BhY2UgVVJJcyBhcmUgaWdub3JlZC4gIE5hbWVzcGFjZSBwcmVmaXhlcyBhcmUgaW5jbHVkZWQgaW4gdGhlIEpTT04gbmFtZS4KICAmbHQ7cC8mZ3Q7CiAgQXR0cmlidXRlcyBhcmUgaWdub3JlZCwgZXhjZXB0IGZvciB0aGUgc3BlY2lhbCBhdHRyaWJ1dGUgQGFycmF5PSZxdW90O3RydWUmcXVvdDsgdGhhdAogIGluZGljYXRlcyB0aGUgSlNPTiBzZXJpYWxpemF0aW9uIHNob3VsZCB3cml0ZSB0aGUgbm9kZSwgZXZlbiBpZiBzaW5nbGUsIGFzIGFuCiAgYXJyYXksIGFuZCB0aGUgYXR0cmlidXRlIEB0eXBlIHRoYXQgY2FuIGJlIHNldCB0byAmcXVvdDtib29sZWFuJnF1b3Q7IG9yICZxdW90O251bWJlciZxdW90OyB0bwogIGRpY3RhdGUgdGhlIHZhbHVlIHNob3VsZCBiZSB3cml0dGVuIGFzIHRoYXQgdHlwZSAodW5xdW90ZWQpLiAgVGhlcmUncyBhbHNvCiAgYW4gQHF1b3RlIGF0dHJpYnV0ZSB0aGF0IHdoZW4gc2V0IHRvIHRydWUgd3JpdGVzIHRoZSBpbm5lciBjb250ZW50IGFzIHRleHQKICByYXRoZXIgdGhhbiBhcyBzdHJ1Y3R1cmVkIEpTT04sIHVzZWZ1bCBmb3Igc2VuZGluZyBzb21lIFhIVE1MIG92ZXIgdGhlCiAgd2lyZS4KICAmbHQ7cC8mZ3Q7CiAgVGV4dCBub2RlcyB3aXRoaW4gbWl4ZWQgY29udGVudCBhcmUgaWdub3JlZC4KCiAgQHBhcmFtICR4IEVsZW1lbnQgbm9kZSB0byBjb252ZXJ0CiAgQHJldHVybiBTdHJpbmcgaG9sZGluZyBKU09OIHNlcmlhbGl6ZWQgcmVwcmVzZW50YXRpb24gb2YgJHgKCiAgQGF1dGhvciBKYXNvbiBIdW50ZXIKICBAdmVyc2lvbiAxLjAuMQogIAogIFBvcnRlZCB0byB4cXVlcnkgMS4wLW1sOyBkb3VibGUgZXNjYXBlZCBiYWNrc2xhc2hlcyBpbiBqc29uOmVzY2FwZQo6KQpkZWNsYXJlIGZ1bmN0aW9uIGpzb246c2VyaWFsaXplKCR4IGFzIGVsZW1lbnQoKSkgIGFzIHhzOnN0cmluZyB7CiAgc3RyaW5nLWpvaW4oKCd7JywganNvbjpwcmludC1uYW1lLXZhbHVlKCR4KSwgJ30nKSwgJnF1b3Q7JnF1b3Q7KQp9OwogIDwvdGV4dGFyZWE+IAo8L2Rpdj4gCiAKICAgIDxzY3JpcHQ+IAogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwgewogICAgICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgICAgIG1hdGNoQnJhY2tldHM6IHRydWUsCiAgICAgICAgdGhlbWU6ICJ4cS1kYXJrIgogICAgICB9KTsKICAgIDwvc2NyaXB0PiAKIAogICAgPHA+PHN0cm9uZz5NSU1FIHR5cGVzIGRlZmluZWQ6PC9zdHJvbmc+IDxjb2RlPmFwcGxpY2F0aW9uL3hxdWVyeTwvY29kZT4uPC9wPiAKIAogICAgPHA+RGV2ZWxvcG1lbnQgb2YgdGhlIENvZGVNaXJyb3IgWFF1ZXJ5IG1vZGUgd2FzIHNwb25zb3JlZCBieSAKICAgICAgPGEgaHJlZj0iaHR0cDovL21hcmtsb2dpYy5jb20iPk1hcmtMb2dpYzwvYT4gYW5kIGRldmVsb3BlZCBieSAKICAgICAgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9tYnJldm9vcnQiPk1pa2UgQnJldm9vcnQ8L2E+LgogICAgPC9wPgogCiAgPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/xquery/test.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovLyBEb24ndCB0YWtlIHRoZXNlIHRvbyBzZXJpb3VzbHkgLS0gdGhlIGV4cGVjdGVkIHJlc3VsdHMgYXBwZWFyIHRvIGJlCi8vIGJhc2VkIG9uIHRoZSByZXN1bHRzIG9mIGFjdHVhbCBydW5zIHdpdGhvdXQgYW55IHNlcmlvdXMgbWFudWFsCi8vIHZlcmlmaWNhdGlvbi4gSWYgYSBjaGFuZ2UgeW91IG1hZGUgY2F1c2VzIHRoZW0gdG8gZmFpbCwgdGhlIHRlc3QgaXMKLy8gYXMgbGlrZWx5IHRvIHdyb25nIGFzIHRoZSBjb2RlLgoKKGZ1bmN0aW9uKCkgewogIHZhciBtb2RlID0gQ29kZU1pcnJvci5nZXRNb2RlKHt0YWJTaXplOiA0fSwgInhxdWVyeSIpOwogIGZ1bmN0aW9uIE1UKG5hbWUpIHsgdGVzdC5tb2RlKG5hbWUsIG1vZGUsIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSkpOyB9CgogIE1UKCJldmlsdGVzdCIsCiAgICAgIltrZXl3b3JkIHhxdWVyeV0gW2tleXdvcmQgdmVyc2lvbl0gW3ZhcmlhYmxlICZxdW90OzFdW2tleXdvcmQgLl1bYXRvbSAwXVtrZXl3b3JkIC1dW3ZhcmlhYmxlIG1sJnF1b3Q7XVtkZWYmdmFyaWFibGUgO10gICAgICBbY29tbWVudCAoOiB0aGlzIGlzICAgICAgIDogYSAgICAgICAgICBcImNvbW1lbnRcIiA6KV0iLAogICAgICIgICAgICBba2V5d29yZCBsZXRdIFt2YXJpYWJsZSAkbGV0XSBba2V5d29yZCA6PV0gW3ZhcmlhYmxlICZsdDt4XSBbdmFyaWFibGUgYXR0cl1ba2V5d29yZCA9XVt2YXJpYWJsZSAmcXVvdDt2YWx1ZSZxdW90OyZndDsmcXVvdDt0ZXN0JnF1b3Q7Jmx0O2Z1bmMmZ3RdW2RlZiZ2YXJpYWJsZSA7ZnVuY3Rpb25dKCkgW3ZhcmlhYmxlICR2YXJdIHtba2V5d29yZCBmdW5jdGlvbl0oKX0ge1t2YXJpYWJsZSAkdmFyXX1bdmFyaWFibGUgJmx0O11ba2V5d29yZCAvXVt2YXJpYWJsZSBmdW5jJmd0OyZsdDtdW2tleXdvcmQgL11bdmFyaWFibGUgeCZndDtdIiwKICAgICAiICAgICAgW2tleXdvcmQgbGV0XSBbdmFyaWFibGUgJGpvZV1ba2V5d29yZCA6PV1bYXRvbSAxXSIsCiAgICAgIiAgICAgIFtrZXl3b3JkIHJldHVybl0gW2tleXdvcmQgZWxlbWVudF0gW3ZhcmlhYmxlIGVsZW1lbnRdIHsiLAogICAgICIgICAgICAgICAgW2tleXdvcmQgYXR0cmlidXRlXSBbdmFyaWFibGUgYXR0cmlidXRlXSB7IFthdG9tIDFdIH0sIiwKICAgICAiICAgICAgICAgIFtrZXl3b3JkIGVsZW1lbnRdIFt2YXJpYWJsZSB0ZXN0XSB7IFt2YXJpYWJsZSAmIzM5O2EmIzM5O10gfSwgICAgICAgICAgIFtrZXl3b3JkIGF0dHJpYnV0ZV0gW3ZhcmlhYmxlIGZvb10geyBbdmFyaWFibGUgJnF1b3Q7YmFyJnF1b3Q7XSB9LCIsCiAgICAgIiAgICAgICAgICBbZGVmJnZhcmlhYmxlIGZuOmRvY10oKVtbIFt2YXJpYWJsZSBmb29dW2tleXdvcmQgL11bdmFyaWFibGUgQGJhcl0gW2tleXdvcmQgZXFdIFt2YXJpYWJsZSAkbGV0XSBdXSwiLAogICAgICIgICAgICAgICAgW2tleXdvcmQgLy9dW3ZhcmlhYmxlIHhdIH0gICAgICAgICAgICAgICAgIFtjb21tZW50ICg6IGEgbW9yZSAnZXZpbCcgdGVzdCA6KV0iLAogICAgICIgICAgICBbY29tbWVudCAoOiBNb2RpZmllZCBCbGFrZWxleSBleGFtcGxlICg6IHdpdGggbmVzdGVkIGNvbW1lbnQgOikgLi4uIDopXSIsCiAgICAgIiAgICAgIFtrZXl3b3JkIGRlY2xhcmVdIFtrZXl3b3JkIHByaXZhdGVdIFtrZXl3b3JkIGZ1bmN0aW9uXSBbZGVmJnZhcmlhYmxlIGxvY2FsOmRlY2xhcmVdKCkgeygpfVt2YXJpYWJsZSA7XSIsCiAgICAgIiAgICAgIFtrZXl3b3JkIGRlY2xhcmVdIFtrZXl3b3JkIHByaXZhdGVdIFtrZXl3b3JkIGZ1bmN0aW9uXSBbZGVmJnZhcmlhYmxlIGxvY2FsOnByaXZhdGVdKCkgeygpfVt2YXJpYWJsZSA7XSIsCiAgICAgIiAgICAgIFtrZXl3b3JkIGRlY2xhcmVdIFtrZXl3b3JkIHByaXZhdGVdIFtrZXl3b3JkIGZ1bmN0aW9uXSBbZGVmJnZhcmlhYmxlIGxvY2FsOmZ1bmN0aW9uXSgpIHsoKX1bdmFyaWFibGUgO10iLAogICAgICIgICAgICBba2V5d29yZCBkZWNsYXJlXSBba2V5d29yZCBwcml2YXRlXSBba2V5d29yZCBmdW5jdGlvbl0gW2RlZiZ2YXJpYWJsZSBsb2NhbDpsb2NhbF0oKSB7KCl9W3ZhcmlhYmxlIDtdIiwKICAgICAiICAgICAgW2tleXdvcmQgbGV0XSBbdmFyaWFibGUgJGxldF0gW2tleXdvcmQgOj1dIFt2YXJpYWJsZSAmbHQ7bGV0Jmd0O2xldF0gW3ZhcmlhYmxlICRsZXRdIFtrZXl3b3JkIDo9XSBbdmFyaWFibGUgJnF1b3Q7bGV0JnF1b3Q7Jmx0O11ba2V5d29yZCAvbGV0XVt2YXJpYWJsZSAmZ3Q7XSIsCiAgICAgIiAgICAgIFtrZXl3b3JkIHJldHVybl0gW2tleXdvcmQgZWxlbWVudF0gW3ZhcmlhYmxlIGVsZW1lbnRdIHsiLAogICAgICIgICAgICAgICAgW2tleXdvcmQgYXR0cmlidXRlXSBbdmFyaWFibGUgYXR0cmlidXRlXSB7IFtrZXl3b3JkIHRyeV0geyBbZGVmJnZhcmlhYmxlIHhkbXA6dmVyc2lvbl0oKSB9IFtrZXl3b3JkIGNhdGNoXShbdmFyaWFibGUgJGVdKSB7IFtkZWYmdmFyaWFibGUgeGRtcDpsb2ddKFt2YXJpYWJsZSAkZV0pIH0gfSwiLAogICAgICIgICAgICAgICAgW2tleXdvcmQgYXR0cmlidXRlXSBbdmFyaWFibGUgZm46ZG9jXSB7IFt2YXJpYWJsZSAmcXVvdDtiYXImcXVvdDtdIFt2YXJpYWJsZSBjYXN0YWJsZV0gW2tleXdvcmQgYXNdIFthdG9tIHhzOnN0cmluZ10gfSwiLAogICAgICIgICAgICAgICAgW2tleXdvcmQgZWxlbWVudF0gW3ZhcmlhYmxlIHRleHRdIHsgW2tleXdvcmQgdGV4dF0geyBbdmFyaWFibGUgJnF1b3Q7dGV4dCZxdW90O10gfSB9LCIsCiAgICAgIiAgICAgICAgICBbZGVmJnZhcmlhYmxlIGZuOmRvY10oKVtbIFtxdWFsaWZpZXIgY2hpbGQ6Ol1bdmFyaWFibGUgZXFdW2tleXdvcmQgL10oW3ZhcmlhYmxlIEBiYXJdIFtrZXl3b3JkIHxdIFtxdWFsaWZpZXIgYXR0cmlidXRlOjpdW3ZhcmlhYmxlIGF0dHJpYnV0ZV0pIFtrZXl3b3JkIGVxXSBbdmFyaWFibGUgJGxldF0gXV0sIiwKICAgICAiICAgICAgICAgIFtrZXl3b3JkIC8vXVt2YXJpYWJsZSBmbjpkb2NdIiwKICAgICAiICAgICAgfSIpOwoKICBNVCgidGVzdEVtcHR5U2VxdWVuY2VLZXl3b3JkIiwKICAgICAiW3N0cmluZyBcImZvb1wiXSBba2V5d29yZCBpbnN0YW5jZV0gW2tleXdvcmQgb2ZdIFtrZXl3b3JkIGVtcHR5LXNlcXVlbmNlXSgpIik7CgogIE1UKCJ0ZXN0TXVsdGlBdHRyIiwKICAgICAiW3RhZyA8cCBdW2F0dHJpYnV0ZSBhMV09W3N0cmluZyBcImZvb1wiXSBbYXR0cmlidXRlIGEyXT1bc3RyaW5nIFwiYmFyXCJdW3RhZyA+XVt2YXJpYWJsZSBoZWxsb10gW3ZhcmlhYmxlIHdvcmxkXVt0YWcgPC9wPl0iKTsKCiAgTVQoInRlc3QgbmFtZXNwYWNlZCB2YXJpYWJsZSIsCiAgICAgIltrZXl3b3JkIGRlY2xhcmVdIFtrZXl3b3JkIG5hbWVzcGFjZV0gW3ZhcmlhYmxlIGVdIFtrZXl3b3JkID1dIFtzdHJpbmcgXCJodHRwOi8vZXhhbXBsZS5jb20vQU5hbWVzcGFjZVwiXVt2YXJpYWJsZSA7ZGVjbGFyZV0gW2tleXdvcmQgdmFyaWFibGVdIFt2YXJpYWJsZSAkZTpleGFtcGxlQ29tVGhpc1ZhcklzTm90UmVjb2duaXplZF0gW2tleXdvcmQgYXNdIFtrZXl3b3JkIGVsZW1lbnRdKFtrZXl3b3JkICpdKSBbdmFyaWFibGUgZXh0ZXJuYWw7XSIpOwoKICBNVCgidGVzdCBFUU5hbWUgdmFyaWFibGUiLAogICAgICJba2V5d29yZCBkZWNsYXJlXSBba2V5d29yZCB2YXJpYWJsZV0gW3ZhcmlhYmxlICRcImh0dHA6Ly93d3cuZXhhbXBsZS5jb20vbnMvbXlcIjp2YXJdIFtrZXl3b3JkIDo9XSBbYXRvbSAxMl1bdmFyaWFibGUgO10iLAogICAgICJbdGFnIDxvdXQ+XXtbdmFyaWFibGUgJFwiaHR0cDovL3d3dy5leGFtcGxlLmNvbS9ucy9teVwiOnZhcl19W3RhZyA8L291dD5dIik7CgogIE1UKCJ0ZXN0IEVRTmFtZSBmdW5jdGlvbiIsCiAgICAgIltrZXl3b3JkIGRlY2xhcmVdIFtrZXl3b3JkIGZ1bmN0aW9uXSBbZGVmJnZhcmlhYmxlIFwiaHR0cDovL3d3dy5leGFtcGxlLmNvbS9ucy9teVwiOmZuXSAoW3ZhcmlhYmxlICRhXSBba2V5d29yZCBhc10gW2F0b20geHM6aW50ZWdlcl0pIFtrZXl3b3JkIGFzXSBbYXRvbSB4czppbnRlZ2VyXSB7IiwKICAgICAiICAgW3ZhcmlhYmxlICRhXSBba2V5d29yZCArXSBbYXRvbSAyXSIsCiAgICAgIn1bdmFyaWFibGUgO10iLAogICAgICJbdGFnIDxvdXQ+XXtbZGVmJnZhcmlhYmxlIFwiaHR0cDovL3d3dy5leGFtcGxlLmNvbS9ucy9teVwiOmZuXShbYXRvbSAxMl0pfVt0YWcgPC9vdXQ+XSIpOwoKICBNVCgidGVzdCBFUU5hbWUgZnVuY3Rpb24gd2l0aCBzaW5nbGUgcXVvdGVzIiwKICAgICAiW2tleXdvcmQgZGVjbGFyZV0gW2tleXdvcmQgZnVuY3Rpb25dIFtkZWYmdmFyaWFibGUgJ2h0dHA6Ly93d3cuZXhhbXBsZS5jb20vbnMvbXknOmZuXSAoW3ZhcmlhYmxlICRhXSBba2V5d29yZCBhc10gW2F0b20geHM6aW50ZWdlcl0pIFtrZXl3b3JkIGFzXSBbYXRvbSB4czppbnRlZ2VyXSB7IiwKICAgICAiICAgW3ZhcmlhYmxlICRhXSBba2V5d29yZCArXSBbYXRvbSAyXSIsCiAgICAgIn1bdmFyaWFibGUgO10iLAogICAgICJbdGFnIDxvdXQ+XXtbZGVmJnZhcmlhYmxlICdodHRwOi8vd3d3LmV4YW1wbGUuY29tL25zL215Jzpmbl0oW2F0b20gMTJdKX1bdGFnIDwvb3V0Pl0iKTsKCiAgTVQoInRlc3RQcm9jZXNzaW5nSW5zdHJ1Y3Rpb25zIiwKICAgICAiW2RlZiZ2YXJpYWJsZSBkYXRhXShbY29tbWVudCZtZXRhIDw/dGFyZ2V0IGNvbnRlbnQ/Pl0pIFtrZXl3b3JkIGluc3RhbmNlXSBba2V5d29yZCBvZl0gW2F0b20geHM6c3RyaW5nXSIpOwoKICBNVCgidGVzdFF1b3RlRXNjYXBlRG91YmxlIiwKICAgICAiW2tleXdvcmQgbGV0XSBbdmFyaWFibGUgJHJvb3Rmb2xkZXJdIFtrZXl3b3JkIDo9XSBbc3RyaW5nIFwiYzpcXGJ1aWxkc1xcd2lubnRcXEhFQURcXHFhXFxzY3JpcHRzXFxcIl0iLAogICAgICJba2V5d29yZCBsZXRdIFt2YXJpYWJsZSAka2V5c2ZvbGRlcl0gW2tleXdvcmQgOj1dIFtkZWYmdmFyaWFibGUgY29uY2F0XShbdmFyaWFibGUgJHJvb3Rmb2xkZXJdLCBbc3RyaW5nIFwia2V5c1xcXCJdKSIpOwp9KSgpOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/xquery/xquery.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJ4cXVlcnkiLCBmdW5jdGlvbigpIHsKCiAgLy8gVGhlIGtleXdvcmRzIG9iamVjdCBpcyBzZXQgdG8gdGhlIHJlc3VsdCBvZiB0aGlzIHNlbGYgZXhlY3V0aW5nCiAgLy8gZnVuY3Rpb24uIEVhY2gga2V5d29yZCBpcyBhIHByb3BlcnR5IG9mIHRoZSBrZXl3b3JkcyBvYmplY3Qgd2hvc2UKICAvLyB2YWx1ZSBpcyB7dHlwZTogYXR5cGUsIHN0eWxlOiBhc3R5bGV9CiAgdmFyIGtleXdvcmRzID0gZnVuY3Rpb24oKXsKICAgIC8vIGNvbnZlbmllbmNlIGZ1bmN0aW9ucyB1c2VkIHRvIGJ1aWxkIGtleXdvcmRzIG9iamVjdAogICAgZnVuY3Rpb24ga3codHlwZSkge3JldHVybiB7dHlwZTogdHlwZSwgc3R5bGU6ICJrZXl3b3JkIn07fQogICAgdmFyIEEgPSBrdygia2V5d29yZCBhIikKICAgICAgLCBCID0ga3coImtleXdvcmQgYiIpCiAgICAgICwgQyA9IGt3KCJrZXl3b3JkIGMiKQogICAgICAsIG9wZXJhdG9yID0ga3coIm9wZXJhdG9yIikKICAgICAgLCBhdG9tID0ge3R5cGU6ICJhdG9tIiwgc3R5bGU6ICJhdG9tIn0KICAgICAgLCBwdW5jdHVhdGlvbiA9IHt0eXBlOiAicHVuY3R1YXRpb24iLCBzdHlsZTogbnVsbH0KICAgICAgLCBxdWFsaWZpZXIgPSB7dHlwZTogImF4aXNfc3BlY2lmaWVyIiwgc3R5bGU6ICJxdWFsaWZpZXIifTsKCiAgICAvLyBrd09iaiBpcyB3aGF0IGlzIHJldHVybiBmcm9tIHRoaXMgZnVuY3Rpb24gYXQgdGhlIGVuZAogICAgdmFyIGt3T2JqID0gewogICAgICAnaWYnOiBBLCAnc3dpdGNoJzogQSwgJ3doaWxlJzogQSwgJ2Zvcic6IEEsCiAgICAgICdlbHNlJzogQiwgJ3RoZW4nOiBCLCAndHJ5JzogQiwgJ2ZpbmFsbHknOiBCLCAnY2F0Y2gnOiBCLAogICAgICAnZWxlbWVudCc6IEMsICdhdHRyaWJ1dGUnOiBDLCAnbGV0JzogQywgJ2ltcGxlbWVudHMnOiBDLCAnaW1wb3J0JzogQywgJ21vZHVsZSc6IEMsICduYW1lc3BhY2UnOiBDLAogICAgICAncmV0dXJuJzogQywgJ3N1cGVyJzogQywgJ3RoaXMnOiBDLCAndGhyb3dzJzogQywgJ3doZXJlJzogQywgJ3ByaXZhdGUnOiBDLAogICAgICAnLCc6IHB1bmN0dWF0aW9uLAogICAgICAnbnVsbCc6IGF0b20sICdmbjpmYWxzZSgpJzogYXRvbSwgJ2ZuOnRydWUoKSc6IGF0b20KICAgIH07CgogICAgLy8gYSBsaXN0IG9mICdiYXNpYycga2V5d29yZHMuIEZvciBlYWNoIGFkZCBhIHByb3BlcnR5IHRvIGt3T2JqIHdpdGggdGhlIHZhbHVlIG9mCiAgICAvLyB7dHlwZTogYmFzaWNbaV0sIHN0eWxlOiAia2V5d29yZCJ9IGUuZy4gJ2FmdGVyJyAtLT4ge3R5cGU6ICJhZnRlciIsIHN0eWxlOiAia2V5d29yZCJ9CiAgICB2YXIgYmFzaWMgPSBbJ2FmdGVyJywnYW5jZXN0b3InLCdhbmNlc3Rvci1vci1zZWxmJywnYW5kJywnYXMnLCdhc2NlbmRpbmcnLCdhc3NlcnQnLCdhdHRyaWJ1dGUnLCdiZWZvcmUnLAogICAgJ2J5JywnY2FzZScsJ2Nhc3QnLCdjaGlsZCcsJ2NvbW1lbnQnLCdkZWNsYXJlJywnZGVmYXVsdCcsJ2RlZmluZScsJ2Rlc2NlbmRhbnQnLCdkZXNjZW5kYW50LW9yLXNlbGYnLAogICAgJ2Rlc2NlbmRpbmcnLCdkb2N1bWVudCcsJ2RvY3VtZW50LW5vZGUnLCdlbGVtZW50JywnZWxzZScsJ2VxJywnZXZlcnknLCdleGNlcHQnLCdleHRlcm5hbCcsJ2ZvbGxvd2luZycsCiAgICAnZm9sbG93aW5nLXNpYmxpbmcnLCdmb2xsb3dzJywnZm9yJywnZnVuY3Rpb24nLCdpZicsJ2ltcG9ydCcsJ2luJywnaW5zdGFuY2UnLCdpbnRlcnNlY3QnLCdpdGVtJywKICAgICdsZXQnLCdtb2R1bGUnLCduYW1lc3BhY2UnLCdub2RlJywnbm9kZScsJ29mJywnb25seScsJ29yJywnb3JkZXInLCdwYXJlbnQnLCdwcmVjZWRlcycsJ3ByZWNlZGluZycsCiAgICAncHJlY2VkaW5nLXNpYmxpbmcnLCdwcm9jZXNzaW5nLWluc3RydWN0aW9uJywncmVmJywncmV0dXJuJywncmV0dXJucycsJ3NhdGlzZmllcycsJ3NjaGVtYScsJ3NjaGVtYS1lbGVtZW50JywKICAgICdzZWxmJywnc29tZScsJ3NvcnRieScsJ3N0YWJsZScsJ3RleHQnLCd0aGVuJywndG8nLCd0cmVhdCcsJ3R5cGVzd2l0Y2gnLCd1bmlvbicsJ3ZhcmlhYmxlJywndmVyc2lvbicsJ3doZXJlJywKICAgICd4cXVlcnknLCAnZW1wdHktc2VxdWVuY2UnXTsKICAgIGZvcih2YXIgaT0wLCBsPWJhc2ljLmxlbmd0aDsgaSA8IGw7IGkrKykgeyBrd09ialtiYXNpY1tpXV0gPSBrdyhiYXNpY1tpXSk7fTsKCiAgICAvLyBhIGxpc3Qgb2YgdHlwZXMuIEZvciBlYWNoIGFkZCBhIHByb3BlcnR5IHRvIGt3T2JqIHdpdGggdGhlIHZhbHVlIG9mCiAgICAvLyB7dHlwZTogImF0b20iLCBzdHlsZTogImF0b20ifQogICAgdmFyIHR5cGVzID0gWyd4czpzdHJpbmcnLCAneHM6ZmxvYXQnLCAneHM6ZGVjaW1hbCcsICd4czpkb3VibGUnLCAneHM6aW50ZWdlcicsICd4czpib29sZWFuJywgJ3hzOmRhdGUnLCAneHM6ZGF0ZVRpbWUnLAogICAgJ3hzOnRpbWUnLCAneHM6ZHVyYXRpb24nLCAneHM6ZGF5VGltZUR1cmF0aW9uJywgJ3hzOnRpbWUnLCAneHM6eWVhck1vbnRoRHVyYXRpb24nLCAnbnVtZXJpYycsICd4czpoZXhCaW5hcnknLAogICAgJ3hzOmJhc2U2NEJpbmFyeScsICd4czphbnlVUkknLCAneHM6UU5hbWUnLCAneHM6Ynl0ZScsJ3hzOmJvb2xlYW4nLCd4czphbnlVUkknLCd4Zjp5ZWFyTW9udGhEdXJhdGlvbiddOwogICAgZm9yKHZhciBpPTAsIGw9dHlwZXMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7IGt3T2JqW3R5cGVzW2ldXSA9IGF0b207fTsKCiAgICAvLyBlYWNoIG9wZXJhdG9yIHdpbGwgYWRkIGEgcHJvcGVydHkgdG8ga3dPYmogd2l0aCB2YWx1ZSBvZiB7dHlwZTogIm9wZXJhdG9yIiwgc3R5bGU6ICJrZXl3b3JkIn0KICAgIHZhciBvcGVyYXRvcnMgPSBbJ2VxJywgJ25lJywgJ2x0JywgJ2xlJywgJ2d0JywgJ2dlJywgJzo9JywgJz0nLCAnPicsICc+PScsICc8JywgJzw9JywgJy4nLCAnfCcsICc/JywgJ2FuZCcsICdvcicsICdkaXYnLCAnaWRpdicsICdtb2QnLCAnKicsICcvJywgJysnLCAnLSddOwogICAgZm9yKHZhciBpPTAsIGw9b3BlcmF0b3JzLmxlbmd0aDsgaSA8IGw7IGkrKykgeyBrd09ialtvcGVyYXRvcnNbaV1dID0gb3BlcmF0b3I7fTsKCiAgICAvLyBlYWNoIGF4aXNfc3BlY2lmaWVycyB3aWxsIGFkZCBhIHByb3BlcnR5IHRvIGt3T2JqIHdpdGggdmFsdWUgb2Yge3R5cGU6ICJheGlzX3NwZWNpZmllciIsIHN0eWxlOiAicXVhbGlmaWVyIn0KICAgIHZhciBheGlzX3NwZWNpZmllcnMgPSBbInNlbGY6OiIsICJhdHRyaWJ1dGU6OiIsICJjaGlsZDo6IiwgImRlc2NlbmRhbnQ6OiIsICJkZXNjZW5kYW50LW9yLXNlbGY6OiIsICJwYXJlbnQ6OiIsCiAgICAiYW5jZXN0b3I6OiIsICJhbmNlc3Rvci1vci1zZWxmOjoiLCAiZm9sbG93aW5nOjoiLCAicHJlY2VkaW5nOjoiLCAiZm9sbG93aW5nLXNpYmxpbmc6OiIsICJwcmVjZWRpbmctc2libGluZzo6Il07CiAgICBmb3IodmFyIGk9MCwgbD1heGlzX3NwZWNpZmllcnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7IGt3T2JqW2F4aXNfc3BlY2lmaWVyc1tpXV0gPSBxdWFsaWZpZXI7IH07CgogICAgcmV0dXJuIGt3T2JqOwogIH0oKTsKCiAgZnVuY3Rpb24gY2hhaW4oc3RyZWFtLCBzdGF0ZSwgZikgewogICAgc3RhdGUudG9rZW5pemUgPSBmOwogICAgcmV0dXJuIGYoc3RyZWFtLCBzdGF0ZSk7CiAgfQoKICAvLyB0aGUgcHJpbWFyeSBtb2RlIHRva2VuaXplcgogIGZ1bmN0aW9uIHRva2VuQmFzZShzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpLAogICAgICAgIG1pZ2h0QmVGdW5jdGlvbiA9IGZhbHNlLAogICAgICAgIGlzRVFOYW1lID0gaXNFUU5hbWVBaGVhZChzdHJlYW0pOwoKICAgIC8vIGFuIFhNTCB0YWcgKGlmIG5vdCBpbiBzb21lIHN1YiwgY2hhaW5lZCB0b2tlbml6ZXIpCiAgICBpZiAoY2ggPT0gIjwiKSB7CiAgICAgIGlmKHN0cmVhbS5tYXRjaCgiIS0tIiwgdHJ1ZSkpCiAgICAgICAgcmV0dXJuIGNoYWluKHN0cmVhbSwgc3RhdGUsIHRva2VuWE1MQ29tbWVudCk7CgogICAgICBpZihzdHJlYW0ubWF0Y2goIiFbQ0RBVEEiLCBmYWxzZSkpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQ0RBVEE7CiAgICAgICAgcmV0dXJuICJ0YWciOwogICAgICB9CgogICAgICBpZihzdHJlYW0ubWF0Y2goIj8iLCBmYWxzZSkpIHsKICAgICAgICByZXR1cm4gY2hhaW4oc3RyZWFtLCBzdGF0ZSwgdG9rZW5QcmVQcm9jZXNzaW5nKTsKICAgICAgfQoKICAgICAgdmFyIGlzY2xvc2UgPSBzdHJlYW0uZWF0KCIvIik7CiAgICAgIHN0cmVhbS5lYXRTcGFjZSgpOwogICAgICB2YXIgdGFnTmFtZSA9ICIiLCBjOwogICAgICB3aGlsZSAoKGMgPSBzdHJlYW0uZWF0KC9bXlxzXHUwMGEwPTw+XCJcJ1wvP10vKSkpIHRhZ05hbWUgKz0gYzsKCiAgICAgIHJldHVybiBjaGFpbihzdHJlYW0sIHN0YXRlLCB0b2tlblRhZyh0YWdOYW1lLCBpc2Nsb3NlKSk7CiAgICB9CiAgICAvLyBzdGFydCBjb2RlIGJsb2NrCiAgICBlbHNlIGlmKGNoID09ICJ7IikgewogICAgICBwdXNoU3RhdGVTdGFjayhzdGF0ZSx7IHR5cGU6ICJjb2RlYmxvY2sifSk7CiAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgLy8gZW5kIGNvZGUgYmxvY2sKICAgIGVsc2UgaWYoY2ggPT0gIn0iKSB7CiAgICAgIHBvcFN0YXRlU3RhY2soc3RhdGUpOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIC8vIGlmIHdlJ3JlIGluIGFuIFhNTCBibG9jawogICAgZWxzZSBpZihpc0luWG1sQmxvY2soc3RhdGUpKSB7CiAgICAgIGlmKGNoID09ICI+IikKICAgICAgICByZXR1cm4gInRhZyI7CiAgICAgIGVsc2UgaWYoY2ggPT0gIi8iICYmIHN0cmVhbS5lYXQoIj4iKSkgewogICAgICAgIHBvcFN0YXRlU3RhY2soc3RhdGUpOwogICAgICAgIHJldHVybiAidGFnIjsKICAgICAgfQogICAgICBlbHNlCiAgICAgICAgcmV0dXJuICJ2YXJpYWJsZSI7CiAgICB9CiAgICAvLyBpZiBhIG51bWJlcgogICAgZWxzZSBpZiAoL1xkLy50ZXN0KGNoKSkgewogICAgICBzdHJlYW0ubWF0Y2goL15cZCooPzpcLlxkKik/KD86RVsrXC1dP1xkKyk/Lyk7CiAgICAgIHJldHVybiAiYXRvbSI7CiAgICB9CiAgICAvLyBjb21tZW50IHN0YXJ0CiAgICBlbHNlIGlmIChjaCA9PT0gIigiICYmIHN0cmVhbS5lYXQoIjoiKSkgewogICAgICBwdXNoU3RhdGVTdGFjayhzdGF0ZSwgeyB0eXBlOiAiY29tbWVudCJ9KTsKICAgICAgcmV0dXJuIGNoYWluKHN0cmVhbSwgc3RhdGUsIHRva2VuQ29tbWVudCk7CiAgICB9CiAgICAvLyBxdW90ZWQgc3RyaW5nCiAgICBlbHNlIGlmICggICFpc0VRTmFtZSAmJiAoY2ggPT09ICciJyB8fCBjaCA9PT0gIiciKSkKICAgICAgcmV0dXJuIGNoYWluKHN0cmVhbSwgc3RhdGUsIHRva2VuU3RyaW5nKGNoKSk7CiAgICAvLyB2YXJpYWJsZQogICAgZWxzZSBpZihjaCA9PT0gIiQiKSB7CiAgICAgIHJldHVybiBjaGFpbihzdHJlYW0sIHN0YXRlLCB0b2tlblZhcmlhYmxlKTsKICAgIH0KICAgIC8vIGFzc2lnbm1lbnQKICAgIGVsc2UgaWYoY2ggPT09IjoiICYmIHN0cmVhbS5lYXQoIj0iKSkgewogICAgICByZXR1cm4gImtleXdvcmQiOwogICAgfQogICAgLy8gb3BlbiBwYXJlbgogICAgZWxzZSBpZihjaCA9PT0gIigiKSB7CiAgICAgIHB1c2hTdGF0ZVN0YWNrKHN0YXRlLCB7IHR5cGU6ICJwYXJlbiJ9KTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICAvLyBjbG9zZSBwYXJlbgogICAgZWxzZSBpZihjaCA9PT0gIikiKSB7CiAgICAgIHBvcFN0YXRlU3RhY2soc3RhdGUpOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIC8vIG9wZW4gcGFyZW4KICAgIGVsc2UgaWYoY2ggPT09ICJbIikgewogICAgICBwdXNoU3RhdGVTdGFjayhzdGF0ZSwgeyB0eXBlOiAiYnJhY2tldCJ9KTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICAvLyBjbG9zZSBwYXJlbgogICAgZWxzZSBpZihjaCA9PT0gIl0iKSB7CiAgICAgIHBvcFN0YXRlU3RhY2soc3RhdGUpOwogICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGVsc2UgewogICAgICB2YXIga25vd24gPSBrZXl3b3Jkcy5wcm9wZXJ0eUlzRW51bWVyYWJsZShjaCkgJiYga2V5d29yZHNbY2hdOwoKICAgICAgLy8gaWYgdGhlcmUncyBhIEVRTmFtZSBhaGVhZCwgY29uc3VtZSB0aGUgcmVzdCBvZiB0aGUgc3RyaW5nIHBvcnRpb24sIGl0J3MgbGlrZWx5IGEgZnVuY3Rpb24KICAgICAgaWYoaXNFUU5hbWUgJiYgY2ggPT09ICdcIicpIHdoaWxlKHN0cmVhbS5uZXh0KCkgIT09ICciJyl7fQogICAgICBpZihpc0VRTmFtZSAmJiBjaCA9PT0gJ1wnJykgd2hpbGUoc3RyZWFtLm5leHQoKSAhPT0gJ1wnJyl7fQoKICAgICAgLy8gZ29iYmxlIHVwIGEgd29yZCBpZiB0aGUgY2hhcmFjdGVyIGlzIG5vdCBrbm93bgogICAgICBpZigha25vd24pIHN0cmVhbS5lYXRXaGlsZSgvW1x3XCRfLV0vKTsKCiAgICAgIC8vIGdvYmJsZSBhIGNvbG9uIGluIHRoZSBjYXNlIHRoYXQgaXMgYSBsaWIgZnVuYyB0eXBlIGNhbGwgZm46ZG9jCiAgICAgIHZhciBmb3VuZENvbG9uID0gc3RyZWFtLmVhdCgiOiIpOwoKICAgICAgLy8gaWYgdGhlcmUncyBub3QgYSBzZWNvbmQgY29sb24sIGdvYmJsZSBhbm90aGVyIHdvcmQuIE90aGVyd2lzZSwgaXQncyBwcm9iYWJseSBhbiBheGlzIHNwZWNpZmllcgogICAgICAvLyB3aGljaCBzaG91bGQgZ2V0IG1hdGNoZWQgYXMgYSBrZXl3b3JkCiAgICAgIGlmKCFzdHJlYW0uZWF0KCI6IikgJiYgZm91bmRDb2xvbikgewogICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvW1x3XCRfLV0vKTsKICAgICAgfQogICAgICAvLyBpZiB0aGUgbmV4dCBub24gd2hpdGVzcGFjZSBjaGFyYWN0ZXIgaXMgYW4gb3BlbiBwYXJlbiwgdGhpcyBpcyBwcm9iYWJseSBhIGZ1bmN0aW9uIChpZiBub3QgYSBrZXl3b3JkIG9mIG90aGVyIHNvcnQpCiAgICAgIGlmKHN0cmVhbS5tYXRjaCgvXlsgXHRdKlwoLywgZmFsc2UpKSB7CiAgICAgICAgbWlnaHRCZUZ1bmN0aW9uID0gdHJ1ZTsKICAgICAgfQogICAgICAvLyBpcyB0aGUgd29yZCBhIGtleXdvcmQ/CiAgICAgIHZhciB3b3JkID0gc3RyZWFtLmN1cnJlbnQoKTsKICAgICAga25vd24gPSBrZXl3b3Jkcy5wcm9wZXJ0eUlzRW51bWVyYWJsZSh3b3JkKSAmJiBrZXl3b3Jkc1t3b3JkXTsKCiAgICAgIC8vIGlmIHdlIHRoaW5rIGl0J3MgYSBmdW5jdGlvbiBjYWxsIGJ1dCBub3QgeWV0IGtub3duLAogICAgICAvLyBzZXQgc3R5bGUgdG8gdmFyaWFibGUgZm9yIG5vdyBmb3IgbGFjayBvZiBzb21ldGhpbmcgYmV0dGVyCiAgICAgIGlmKG1pZ2h0QmVGdW5jdGlvbiAmJiAha25vd24pIGtub3duID0ge3R5cGU6ICJmdW5jdGlvbl9jYWxsIiwgc3R5bGU6ICJ2YXJpYWJsZSBkZWYifTsKCiAgICAgIC8vIGlmIHRoZSBwcmV2aW91cyB3b3JkIHdhcyBlbGVtZW50LCBhdHRyaWJ1dGUsIGF4aXMgc3BlY2lmaWVyLCB0aGlzIHdvcmQgc2hvdWxkIGJlIHRoZSBuYW1lIG9mIHRoYXQKICAgICAgaWYoaXNJblhtbENvbnN0cnVjdG9yKHN0YXRlKSkgewogICAgICAgIHBvcFN0YXRlU3RhY2soc3RhdGUpOwogICAgICAgIHJldHVybiAidmFyaWFibGUiOwogICAgICB9CiAgICAgIC8vIGFzIHByZXZpb3VzbHkgY2hlY2tlZCwgaWYgdGhlIHdvcmQgaXMgZWxlbWVudCxhdHRyaWJ1dGUsIGF4aXMgc3BlY2lmaWVyLCBjYWxsIGl0IGFuICJ4bWxjb25zdHJ1Y3RvciIgYW5kCiAgICAgIC8vIHB1c2ggdGhlIHN0YWNrIHNvIHdlIGtub3cgdG8gbG9vayBmb3IgaXQgb24gdGhlIG5leHQgd29yZAogICAgICBpZih3b3JkID09ICJlbGVtZW50IiB8fCB3b3JkID09ICJhdHRyaWJ1dGUiIHx8IGtub3duLnR5cGUgPT0gImF4aXNfc3BlY2lmaWVyIikgcHVzaFN0YXRlU3RhY2soc3RhdGUsIHt0eXBlOiAieG1sY29uc3RydWN0b3IifSk7CgogICAgICAvLyBpZiB0aGUgd29yZCBpcyBrbm93biwgcmV0dXJuIHRoZSBkZXRhaWxzIG9mIHRoYXQgZWxzZSBqdXN0IGNhbGwgdGhpcyBhIGdlbmVyaWMgJ3dvcmQnCiAgICAgIHJldHVybiBrbm93biA/IGtub3duLnN0eWxlIDogInZhcmlhYmxlIjsKICAgIH0KICB9CgogIC8vIGhhbmRsZSBjb21tZW50cywgaW5jbHVkaW5nIG5lc3RlZAogIGZ1bmN0aW9uIHRva2VuQ29tbWVudChzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgbWF5YmVFbmQgPSBmYWxzZSwgbWF5YmVOZXN0ZWQgPSBmYWxzZSwgbmVzdGVkQ291bnQgPSAwLCBjaDsKICAgIHdoaWxlIChjaCA9IHN0cmVhbS5uZXh0KCkpIHsKICAgICAgaWYgKGNoID09ICIpIiAmJiBtYXliZUVuZCkgewogICAgICAgIGlmKG5lc3RlZENvdW50ID4gMCkKICAgICAgICAgIG5lc3RlZENvdW50LS07CiAgICAgICAgZWxzZSB7CiAgICAgICAgICBwb3BTdGF0ZVN0YWNrKHN0YXRlKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBlbHNlIGlmKGNoID09ICI6IiAmJiBtYXliZU5lc3RlZCkgewogICAgICAgIG5lc3RlZENvdW50Kys7CiAgICAgIH0KICAgICAgbWF5YmVFbmQgPSAoY2ggPT0gIjoiKTsKICAgICAgbWF5YmVOZXN0ZWQgPSAoY2ggPT0gIigiKTsKICAgIH0KCiAgICByZXR1cm4gImNvbW1lbnQiOwogIH0KCiAgLy8gdG9rZW5pemVyIGZvciBzdHJpbmcgbGl0ZXJhbHMKICAvLyBvcHRpb25hbGx5IHBhc3MgYSB0b2tlbml6ZXIgZnVuY3Rpb24gdG8gc2V0IHN0YXRlLnRva2VuaXplIGJhY2sgdG8gd2hlbiBmaW5pc2hlZAogIGZ1bmN0aW9uIHRva2VuU3RyaW5nKHF1b3RlLCBmKSB7CiAgICByZXR1cm4gZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICB2YXIgY2g7CgogICAgICBpZihpc0luU3RyaW5nKHN0YXRlKSAmJiBzdHJlYW0uY3VycmVudCgpID09IHF1b3RlKSB7CiAgICAgICAgcG9wU3RhdGVTdGFjayhzdGF0ZSk7CiAgICAgICAgaWYoZikgc3RhdGUudG9rZW5pemUgPSBmOwogICAgICAgIHJldHVybiAic3RyaW5nIjsKICAgICAgfQoKICAgICAgcHVzaFN0YXRlU3RhY2soc3RhdGUsIHsgdHlwZTogInN0cmluZyIsIG5hbWU6IHF1b3RlLCB0b2tlbml6ZTogdG9rZW5TdHJpbmcocXVvdGUsIGYpIH0pOwoKICAgICAgLy8gaWYgd2UncmUgaW4gYSBzdHJpbmcgYW5kIGluIGFuIFhNTCBibG9jaywgYWxsb3cgYW4gZW1iZWRkZWQgY29kZSBibG9jawogICAgICBpZihzdHJlYW0ubWF0Y2goInsiLCBmYWxzZSkgJiYgaXNJblhtbEF0dHJpYnV0ZUJsb2NrKHN0YXRlKSkgewogICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlOwogICAgICAgIHJldHVybiAic3RyaW5nIjsKICAgICAgfQoKCiAgICAgIHdoaWxlIChjaCA9IHN0cmVhbS5uZXh0KCkpIHsKICAgICAgICBpZiAoY2ggPT0gIHF1b3RlKSB7CiAgICAgICAgICBwb3BTdGF0ZVN0YWNrKHN0YXRlKTsKICAgICAgICAgIGlmKGYpIHN0YXRlLnRva2VuaXplID0gZjsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgIC8vIGlmIHdlJ3JlIGluIGEgc3RyaW5nIGFuZCBpbiBhbiBYTUwgYmxvY2ssIGFsbG93IGFuIGVtYmVkZGVkIGNvZGUgYmxvY2sgaW4gYW4gYXR0cmlidXRlCiAgICAgICAgICBpZihzdHJlYW0ubWF0Y2goInsiLCBmYWxzZSkgJiYgaXNJblhtbEF0dHJpYnV0ZUJsb2NrKHN0YXRlKSkgewogICAgICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTsKICAgICAgICAgICAgcmV0dXJuICJzdHJpbmciOwogICAgICAgICAgfQoKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiAic3RyaW5nIjsKICAgIH07CiAgfQoKICAvLyB0b2tlbml6ZXIgZm9yIHZhcmlhYmxlcwogIGZ1bmN0aW9uIHRva2VuVmFyaWFibGUoc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIGlzVmFyaWFibGVDaGFyID0gL1tcd1wkXy1dLzsKCiAgICAvLyBhIHZhcmlhYmxlIG1heSBzdGFydCB3aXRoIGEgcXVvdGVkIEVRTmFtZSBzbyBpZiB0aGUgbmV4dCBjaGFyYWN0ZXIgaXMgcXVvdGUsIGNvbnN1bWUgdG8gdGhlIG5leHQgcXVvdGUKICAgIGlmKHN0cmVhbS5lYXQoIlwiIikpIHsKICAgICAgd2hpbGUoc3RyZWFtLm5leHQoKSAhPT0gJ1wiJyl7fTsKICAgICAgc3RyZWFtLmVhdCgiOiIpOwogICAgfSBlbHNlIHsKICAgICAgc3RyZWFtLmVhdFdoaWxlKGlzVmFyaWFibGVDaGFyKTsKICAgICAgaWYoIXN0cmVhbS5tYXRjaCgiOj0iLCBmYWxzZSkpIHN0cmVhbS5lYXQoIjoiKTsKICAgIH0KICAgIHN0cmVhbS5lYXRXaGlsZShpc1ZhcmlhYmxlQ2hhcik7CiAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTsKICAgIHJldHVybiAidmFyaWFibGUiOwogIH0KCiAgLy8gdG9rZW5pemVyIGZvciBYTUwgdGFncwogIGZ1bmN0aW9uIHRva2VuVGFnKG5hbWUsIGlzY2xvc2UpIHsKICAgIHJldHVybiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIHN0cmVhbS5lYXRTcGFjZSgpOwogICAgICBpZihpc2Nsb3NlICYmIHN0cmVhbS5lYXQoIj4iKSkgewogICAgICAgIHBvcFN0YXRlU3RhY2soc3RhdGUpOwogICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlOwogICAgICAgIHJldHVybiAidGFnIjsKICAgICAgfQogICAgICAvLyBzZWxmIGNsb3NpbmcgdGFnIHdpdGhvdXQgYXR0cmlidXRlcz8KICAgICAgaWYoIXN0cmVhbS5lYXQoIi8iKSkKICAgICAgICBwdXNoU3RhdGVTdGFjayhzdGF0ZSwgeyB0eXBlOiAidGFnIiwgbmFtZTogbmFtZSwgdG9rZW5pemU6IHRva2VuQmFzZX0pOwogICAgICBpZighc3RyZWFtLmVhdCgiPiIpKSB7CiAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkF0dHJpYnV0ZTsKICAgICAgICByZXR1cm4gInRhZyI7CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkJhc2U7CiAgICAgIH0KICAgICAgcmV0dXJuICJ0YWciOwogICAgfTsKICB9CgogIC8vIHRva2VuaXplciBmb3IgWE1MIGF0dHJpYnV0ZXMKICBmdW5jdGlvbiB0b2tlbkF0dHJpYnV0ZShzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgY2ggPSBzdHJlYW0ubmV4dCgpOwoKICAgIGlmKGNoID09ICIvIiAmJiBzdHJlYW0uZWF0KCI+IikpIHsKICAgICAgaWYoaXNJblhtbEF0dHJpYnV0ZUJsb2NrKHN0YXRlKSkgcG9wU3RhdGVTdGFjayhzdGF0ZSk7CiAgICAgIGlmKGlzSW5YbWxCbG9jayhzdGF0ZSkpIHBvcFN0YXRlU3RhY2soc3RhdGUpOwogICAgICByZXR1cm4gInRhZyI7CiAgICB9CiAgICBpZihjaCA9PSAiPiIpIHsKICAgICAgaWYoaXNJblhtbEF0dHJpYnV0ZUJsb2NrKHN0YXRlKSkgcG9wU3RhdGVTdGFjayhzdGF0ZSk7CiAgICAgIHJldHVybiAidGFnIjsKICAgIH0KICAgIGlmKGNoID09ICI9IikKICAgICAgcmV0dXJuIG51bGw7CiAgICAvLyBxdW90ZWQgc3RyaW5nCiAgICBpZiAoY2ggPT0gJyInIHx8IGNoID09ICInIikKICAgICAgcmV0dXJuIGNoYWluKHN0cmVhbSwgc3RhdGUsIHRva2VuU3RyaW5nKGNoLCB0b2tlbkF0dHJpYnV0ZSkpOwoKICAgIGlmKCFpc0luWG1sQXR0cmlidXRlQmxvY2soc3RhdGUpKQogICAgICBwdXNoU3RhdGVTdGFjayhzdGF0ZSwgeyB0eXBlOiAiYXR0cmlidXRlIiwgdG9rZW5pemU6IHRva2VuQXR0cmlidXRlfSk7CgogICAgc3RyZWFtLmVhdCgvW2EtekEtWl86XS8pOwogICAgc3RyZWFtLmVhdFdoaWxlKC9bLWEtekEtWjAtOV86Ll0vKTsKICAgIHN0cmVhbS5lYXRTcGFjZSgpOwoKICAgIC8vIHRoZSBjYXNlIHdoZXJlIHRoZSBhdHRyaWJ1dGUgaGFzIG5vdCB2YWx1ZSBhbmQgdGhlIHRhZyB3YXMgY2xvc2VkCiAgICBpZihzdHJlYW0ubWF0Y2goIj4iLCBmYWxzZSkgfHwgc3RyZWFtLm1hdGNoKCIvIiwgZmFsc2UpKSB7CiAgICAgIHBvcFN0YXRlU3RhY2soc3RhdGUpOwogICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTsKICAgIH0KCiAgICByZXR1cm4gImF0dHJpYnV0ZSI7CiAgfQoKICAvLyBoYW5kbGUgY29tbWVudHMsIGluY2x1ZGluZyBuZXN0ZWQKICBmdW5jdGlvbiB0b2tlblhNTENvbW1lbnQoc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIGNoOwogICAgd2hpbGUgKGNoID0gc3RyZWFtLm5leHQoKSkgewogICAgICBpZiAoY2ggPT0gIi0iICYmIHN0cmVhbS5tYXRjaCgiLT4iLCB0cnVlKSkgewogICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlOwogICAgICAgIHJldHVybiAiY29tbWVudCI7CiAgICAgIH0KICAgIH0KICB9CgoKICAvLyBoYW5kbGUgQ0RBVEEKICBmdW5jdGlvbiB0b2tlbkNEQVRBKHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBjaDsKICAgIHdoaWxlIChjaCA9IHN0cmVhbS5uZXh0KCkpIHsKICAgICAgaWYgKGNoID09ICJdIiAmJiBzdHJlYW0ubWF0Y2goIl0iLCB0cnVlKSkgewogICAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5CYXNlOwogICAgICAgIHJldHVybiAiY29tbWVudCI7CiAgICAgIH0KICAgIH0KICB9CgogIC8vIGhhbmRsZSBwcmVwcm9jZXNzaW5nIGluc3RydWN0aW9ucwogIGZ1bmN0aW9uIHRva2VuUHJlUHJvY2Vzc2luZyhzdHJlYW0sIHN0YXRlKSB7CiAgICB2YXIgY2g7CiAgICB3aGlsZSAoY2ggPSBzdHJlYW0ubmV4dCgpKSB7CiAgICAgIGlmIChjaCA9PSAiPyIgJiYgc3RyZWFtLm1hdGNoKCI+IiwgdHJ1ZSkpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTsKICAgICAgICByZXR1cm4gImNvbW1lbnQgbWV0YSI7CiAgICAgIH0KICAgIH0KICB9CgoKICAvLyBmdW5jdGlvbnMgdG8gdGVzdCB0aGUgY3VycmVudCBjb250ZXh0IG9mIHRoZSBzdGF0ZQogIGZ1bmN0aW9uIGlzSW5YbWxCbG9jayhzdGF0ZSkgeyByZXR1cm4gaXNJbihzdGF0ZSwgInRhZyIpOyB9CiAgZnVuY3Rpb24gaXNJblhtbEF0dHJpYnV0ZUJsb2NrKHN0YXRlKSB7IHJldHVybiBpc0luKHN0YXRlLCAiYXR0cmlidXRlIik7IH0KICBmdW5jdGlvbiBpc0luWG1sQ29uc3RydWN0b3Ioc3RhdGUpIHsgcmV0dXJuIGlzSW4oc3RhdGUsICJ4bWxjb25zdHJ1Y3RvciIpOyB9CiAgZnVuY3Rpb24gaXNJblN0cmluZyhzdGF0ZSkgeyByZXR1cm4gaXNJbihzdGF0ZSwgInN0cmluZyIpOyB9CgogIGZ1bmN0aW9uIGlzRVFOYW1lQWhlYWQoc3RyZWFtKSB7CiAgICAvLyBhc3N1bWUgd2UndmUgYWxyZWFkeSBlYXRlbiBhIHF1b3RlICgiKQogICAgaWYoc3RyZWFtLmN1cnJlbnQoKSA9PT0gJyInKQogICAgICByZXR1cm4gc3RyZWFtLm1hdGNoKC9eW15cIl0rXCJcOi8sIGZhbHNlKTsKICAgIGVsc2UgaWYoc3RyZWFtLmN1cnJlbnQoKSA9PT0gJ1wnJykKICAgICAgcmV0dXJuIHN0cmVhbS5tYXRjaCgvXlteXCJdK1wnXDovLCBmYWxzZSk7CiAgICBlbHNlCiAgICAgIHJldHVybiBmYWxzZTsKICB9CgogIGZ1bmN0aW9uIGlzSW4oc3RhdGUsIHR5cGUpIHsKICAgIHJldHVybiAoc3RhdGUuc3RhY2subGVuZ3RoICYmIHN0YXRlLnN0YWNrW3N0YXRlLnN0YWNrLmxlbmd0aCAtIDFdLnR5cGUgPT0gdHlwZSk7CiAgfQoKICBmdW5jdGlvbiBwdXNoU3RhdGVTdGFjayhzdGF0ZSwgbmV3U3RhdGUpIHsKICAgIHN0YXRlLnN0YWNrLnB1c2gobmV3U3RhdGUpOwogIH0KCiAgZnVuY3Rpb24gcG9wU3RhdGVTdGFjayhzdGF0ZSkgewogICAgc3RhdGUuc3RhY2sucG9wKCk7CiAgICB2YXIgcmVpbnN0YXRlVG9rZW5pemUgPSBzdGF0ZS5zdGFjay5sZW5ndGggJiYgc3RhdGUuc3RhY2tbc3RhdGUuc3RhY2subGVuZ3RoLTFdLnRva2VuaXplOwogICAgc3RhdGUudG9rZW5pemUgPSByZWluc3RhdGVUb2tlbml6ZSB8fCB0b2tlbkJhc2U7CiAgfQoKICAvLyB0aGUgaW50ZXJmYWNlIGZvciB0aGUgbW9kZSBBUEkKICByZXR1cm4gewogICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgdG9rZW5pemU6IHRva2VuQmFzZSwKICAgICAgICBjYzogW10sCiAgICAgICAgc3RhY2s6IFtdCiAgICAgIH07CiAgICB9LAoKICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0sIHN0YXRlKSB7CiAgICAgIGlmIChzdHJlYW0uZWF0U3BhY2UoKSkgcmV0dXJuIG51bGw7CiAgICAgIHZhciBzdHlsZSA9IHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgICByZXR1cm4gc3R5bGU7CiAgICB9LAoKICAgIGJsb2NrQ29tbWVudFN0YXJ0OiAiKDoiLAogICAgYmxvY2tDb21tZW50RW5kOiAiOikiCgogIH07Cgp9KTsKCkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgiYXBwbGljYXRpb24veHF1ZXJ5IiwgInhxdWVyeSIpOwoKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/yacas/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/yacas/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogeWFjYXMgbW9kZTwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uLy4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPS4uLy4uL2xpYi9jb2RlbWlycm9yLmNzcz4KPHNjcmlwdCBzcmM9Li4vLi4vbGliL2NvZGVtaXJyb3IuanM+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPS4uLy4uL2FkZG9uL2VkaXQvbWF0Y2hicmFja2V0cy5qcz48L3NjcmlwdD4KPHNjcmlwdCBzcmM9eWFjYXMuanM+PC9zY3JpcHQ+CjxzdHlsZSB0eXBlPXRleHQvY3NzPgogIC5Db2RlTWlycm9yIHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCBibGFjazt9Cjwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGgxPkNvZGVNaXJyb3I8L2gxPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj55YWNhczwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+eWFjYXMgbW9kZTwvaDI+CgoKPHRleHRhcmVhIGlkPSJ5YWNhc0NvZGUiPgovLyBleGFtcGxlIHlhY2FzIGNvZGUKR3JhcGgoZWRnZXNfSXNMaXN0KSA8LS0gWwogICAgTG9jYWwodiwgZSwgZiwgdCk7CgogICAgdmVydGljZXMgOj0ge307CgogICAgRm9yRWFjaCAoZSwgZWRnZXMpIFsKICAgICAgICBJZiAoSXNMaXN0KGUpLCBlIDo9IEhlYWQoZSkpOwogICAgICAgIHtmLCB0fSA6PSBUYWlsKExpc3RpZnkoZSkpOwoKICAgICAgICBEZXN0cnVjdGl2ZUFwcGVuZCh2ZXJ0aWNlcywgZik7CiAgICAgICAgRGVzdHJ1Y3RpdmVBcHBlbmQodmVydGljZXMsIHQpOwogICAgXTsKCiAgICBHcmFwaChSZW1vdmVEdXBsaWNhdGVzKHZlcnRpY2VzKSwgZWRnZXMpOwpdOwoKMTAgIyBJc0dyYXBoKEdyYXBoKHZlcnRpY2VzX0lzTGlzdCwgZWRnZXNfSXNMaXN0KSkgPC0tIFRydWU7CjIwICMgSXNHcmFwaChfeCkgPC0tIEZhbHNlOwoKRWRnZXMoR3JhcGgodmVydGljZXNfSXNMaXN0LCBlZGdlc19Jc0xpc3QpKSA8LS0gZWRnZXM7ClZlcnRpY2VzKEdyYXBoKHZlcnRpY2VzX0lzTGlzdCwgZWRnZXNfSXNMaXN0KSkgPC0tIHZlcnRpY2VzOwoKQWRqYWNlbmN5TGlzdChnX0lzR3JhcGgpIDwtLSBbCiAgICBMb2NhbChsLCB2ZXJ0aWNlcywgZWRnZXMsIGUsIG9wLCBmLCB0KTsKCiAgICBsIDo9IEFzc29jaWF0aW9uJ0NyZWF0ZSgpOwoKICAgIHZlcnRpY2VzIDo9IFZlcnRpY2VzKGcpOwogICAgRm9yRWFjaCAodiwgdmVydGljZXMpCiAgICAgICAgQXNzb2NpYXRpb24nU2V0KGwsIHYsIHt9KTsKCiAgICBlZGdlcyA6PSBFZGdlcyhnKTsKCiAgICBGb3JFYWNoKGUsIGVkZ2VzKSBbCiAgICAgICAgSWYgKElzTGlzdChlKSwgZSA6PSBIZWFkKGUpKTsKICAgICAgICB7b3AsIGYsIHR9IDo9IExpc3RpZnkoZSk7CiAgICAgICAgRGVzdHJ1Y3RpdmVBcHBlbmQoQXNzb2NpYXRpb24nR2V0KGwsIGYpLCB0KTsKICAgICAgICBJZiAoU3RyaW5nKG9wKSA9ICI8LT4iLCBEZXN0cnVjdGl2ZUFwcGVuZChBc3NvY2lhdGlvbidHZXQobCwgdCksIGYpKTsKICAgIF07CgogICAgbDsKXTsKPC90ZXh0YXJlYT4KCjxzY3JpcHQ+CiAgdmFyIHlhY2FzRWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ3lhY2FzQ29kZScpLCB7CiAgICBtb2RlOiAndGV4dC94LXlhY2FzJywKICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgbWF0Y2hCcmFja2V0czogdHJ1ZQogIH0pOwo8L3NjcmlwdD4KCjxwPjxzdHJvbmc+TUlNRSB0eXBlcyBkZWZpbmVkOjwvc3Ryb25nPiA8Y29kZT50ZXh0L3gteWFjYXM8L2NvZGU+ICh5YWNhcykuPC9wPgo8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/yacas/yacas.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgovLyBZYWNhcyBtb2RlIGNvcHlyaWdodCAoYykgMjAxNSBieSBHcnplZ29yeiBNYXp1cgovLyBMb29zZWx5IGJhc2VkIG9uIG1hdGhlbWF0aWNhIG1vZGUgYnkgQ2FsaW4gQmFyYmF0CgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCd5YWNhcycsIGZ1bmN0aW9uKF9jb25maWcsIF9wYXJzZXJDb25maWcpIHsKCiAgZnVuY3Rpb24gd29yZHMoc3RyKSB7CiAgICB2YXIgb2JqID0ge30sIHdvcmRzID0gc3RyLnNwbGl0KCIgIik7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHdvcmRzLmxlbmd0aDsgKytpKSBvYmpbd29yZHNbaV1dID0gdHJ1ZTsKICAgIHJldHVybiBvYmo7CiAgfQoKICB2YXIgYm9kaWVkT3BzID0gd29yZHMoIkFzc2VydCBCYWNrUXVvdGUgRCBEZWZ1biBEZXJpdiBGb3IgRm9yRWFjaCBGcm9tRmlsZSAiICsKICAgICAgICAgICAgICAgICAgICAgICAgIkZyb21TdHJpbmcgRnVuY3Rpb24gSW50ZWdyYXRlIEludmVyc2VUYXlsb3IgTGltaXQgIiArCiAgICAgICAgICAgICAgICAgICAgICAgICJMb2NhbFN5bWJvbHMgTWFjcm8gTWFjcm9SdWxlIE1hY3JvUnVsZVBhdHRlcm4gIiArCiAgICAgICAgICAgICAgICAgICAgICAgICJOSW50ZWdyYXRlIFJ1bGUgUnVsZVBhdHRlcm4gU3Vic3QgVEQgVEV4cGxpY2l0U3VtICIgKwogICAgICAgICAgICAgICAgICAgICAgICAiVFN1bSBUYXlsb3IgVGF5bG9yMSBUYXlsb3IyIFRheWxvcjMgVG9GaWxlICIgKwogICAgICAgICAgICAgICAgICAgICAgICAiVG9TdGRvdXQgVG9TdHJpbmcgVHJhY2VSdWxlIFVudGlsIFdoaWxlIik7CgogIC8vIHBhdHRlcm5zCiAgdmFyIHBGbG9hdEZvcm0gID0gIig/Oig/OlxcLlxcZCt8XFxkK1xcLlxcZCp8XFxkKykoPzpbZUVdWystXT9cXGQrKT8pIjsKICB2YXIgcElkZW50aWZpZXIgPSAiKD86W2EtekEtWlxcJCddW2EtekEtWjAtOVxcJCddKikiOwoKICAvLyByZWd1bGFyIGV4cHJlc3Npb25zCiAgdmFyIHJlRmxvYXRGb3JtICAgID0gbmV3IFJlZ0V4cChwRmxvYXRGb3JtKTsKICB2YXIgcmVJZGVudGlmaWVyICAgPSBuZXcgUmVnRXhwKHBJZGVudGlmaWVyKTsKICB2YXIgcmVQYXR0ZXJuICAgICAgPSBuZXcgUmVnRXhwKHBJZGVudGlmaWVyICsgIj9fIiArIHBJZGVudGlmaWVyKTsKICB2YXIgcmVGdW5jdGlvbkxpa2UgPSBuZXcgUmVnRXhwKHBJZGVudGlmaWVyICsgIlxccypcXCgiKTsKCiAgZnVuY3Rpb24gdG9rZW5CYXNlKHN0cmVhbSwgc3RhdGUpIHsKICAgIHZhciBjaDsKCiAgICAvLyBnZXQgbmV4dCBjaGFyYWN0ZXIKICAgIGNoID0gc3RyZWFtLm5leHQoKTsKCiAgICAvLyBzdHJpbmcKICAgIGlmIChjaCA9PT0gJyInKSB7CiAgICAgIHN0YXRlLnRva2VuaXplID0gdG9rZW5TdHJpbmc7CiAgICAgIHJldHVybiBzdGF0ZS50b2tlbml6ZShzdHJlYW0sIHN0YXRlKTsKICAgIH0KCiAgICAvLyBjb21tZW50CiAgICBpZiAoY2ggPT09ICcvJykgewogICAgICBpZiAoc3RyZWFtLmVhdCgnKicpKSB7CiAgICAgICAgc3RhdGUudG9rZW5pemUgPSB0b2tlbkNvbW1lbnQ7CiAgICAgICAgcmV0dXJuIHN0YXRlLnRva2VuaXplKHN0cmVhbSwgc3RhdGUpOwogICAgICB9CiAgICAgIGlmIChzdHJlYW0uZWF0KCIvIikpIHsKICAgICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7CiAgICAgICAgcmV0dXJuICJjb21tZW50IjsKICAgICAgfQogICAgfQoKICAgIC8vIGdvIGJhY2sgb25lIGNoYXJhY3RlcgogICAgc3RyZWFtLmJhY2tVcCgxKTsKCiAgICAvLyB1cGRhdGUgc2NvcGUgaW5mbwogICAgdmFyIG0gPSBzdHJlYW0ubWF0Y2goL14oXHcrKVxzKlwoLywgZmFsc2UpOwogICAgaWYgKG0gIT09IG51bGwgJiYgYm9kaWVkT3BzLmhhc093blByb3BlcnR5KG1bMV0pKQogICAgICBzdGF0ZS5zY29wZXMucHVzaCgnYm9kaWVkJyk7CgogICAgdmFyIHNjb3BlID0gY3VycmVudFNjb3BlKHN0YXRlKTsKCiAgICBpZiAoc2NvcGUgPT09ICdib2RpZWQnICYmIGNoID09PSAnWycpCiAgICAgIHN0YXRlLnNjb3Blcy5wb3AoKTsKCiAgICBpZiAoY2ggPT09ICdbJyB8fCBjaCA9PT0gJ3snIHx8IGNoID09PSAnKCcpCiAgICAgIHN0YXRlLnNjb3Blcy5wdXNoKGNoKTsKCiAgICBzY29wZSA9IGN1cnJlbnRTY29wZShzdGF0ZSk7CgogICAgaWYgKHNjb3BlID09PSAnWycgJiYgY2ggPT09ICddJyB8fAogICAgICAgIHNjb3BlID09PSAneycgJiYgY2ggPT09ICd9JyB8fAogICAgICAgIHNjb3BlID09PSAnKCcgJiYgY2ggPT09ICcpJykKICAgICAgc3RhdGUuc2NvcGVzLnBvcCgpOwoKICAgIGlmIChjaCA9PT0gJzsnKSB7CiAgICAgIHdoaWxlIChzY29wZSA9PT0gJ2JvZGllZCcpIHsKICAgICAgICBzdGF0ZS5zY29wZXMucG9wKCk7CiAgICAgICAgc2NvcGUgPSBjdXJyZW50U2NvcGUoc3RhdGUpOwogICAgICB9CiAgICB9CgogICAgLy8gbG9vayBmb3Igb3JkZXJlZCBydWxlcwogICAgaWYgKHN0cmVhbS5tYXRjaCgvXGQrICojLywgdHJ1ZSwgZmFsc2UpKSB7CiAgICAgIHJldHVybiAncXVhbGlmaWVyJzsKICAgIH0KCiAgICAvLyBsb29rIGZvciBudW1iZXJzCiAgICBpZiAoc3RyZWFtLm1hdGNoKHJlRmxvYXRGb3JtLCB0cnVlLCBmYWxzZSkpIHsKICAgICAgcmV0dXJuICdudW1iZXInOwogICAgfQoKICAgIC8vIGxvb2sgZm9yIHBsYWNlaG9sZGVycwogICAgaWYgKHN0cmVhbS5tYXRjaChyZVBhdHRlcm4sIHRydWUsIGZhbHNlKSkgewogICAgICByZXR1cm4gJ3ZhcmlhYmxlLTMnOwogICAgfQoKICAgIC8vIG1hdGNoIGFsbCBicmFjZXMgc2VwYXJhdGVseQogICAgaWYgKHN0cmVhbS5tYXRjaCgvKD86XFt8XF18e3x9fFwofFwpKS8sIHRydWUsIGZhbHNlKSkgewogICAgICByZXR1cm4gJ2JyYWNrZXQnOwogICAgfQoKICAgIC8vIGxpdGVyYWxzIGxvb2tpbmcgbGlrZSBmdW5jdGlvbiBjYWxscwogICAgaWYgKHN0cmVhbS5tYXRjaChyZUZ1bmN0aW9uTGlrZSwgdHJ1ZSwgZmFsc2UpKSB7CiAgICAgIHN0cmVhbS5iYWNrVXAoMSk7CiAgICAgIHJldHVybiAndmFyaWFibGUnOwogICAgfQoKICAgIC8vIGFsbCBvdGhlciBpZGVudGlmaWVycwogICAgaWYgKHN0cmVhbS5tYXRjaChyZUlkZW50aWZpZXIsIHRydWUsIGZhbHNlKSkgewogICAgICByZXR1cm4gJ3ZhcmlhYmxlLTInOwogICAgfQoKICAgIC8vIG9wZXJhdG9yczsgbm90ZSB0aGF0IG9wZXJhdG9ycyBsaWtlIEBAIG9yIC87IGFyZSBtYXRjaGVkIHNlcGFyYXRlbHkgZm9yIGVhY2ggc3ltYm9sLgogICAgaWYgKHN0cmVhbS5tYXRjaCgvKD86XFx8XCt8XC18XCp8XC98LHw7fFwufDp8QHx+fD18Pnw8fCZ8XHx8X3xgfCd8XF58XD98IXwlKS8sIHRydWUsIGZhbHNlKSkgewogICAgICByZXR1cm4gJ29wZXJhdG9yJzsKICAgIH0KCiAgICAvLyBldmVyeXRoaW5nIGVsc2UgaXMgYW4gZXJyb3IKICAgIHJldHVybiAnZXJyb3InOwogIH0KCiAgZnVuY3Rpb24gdG9rZW5TdHJpbmcoc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIG5leHQsIGVuZCA9IGZhbHNlLCBlc2NhcGVkID0gZmFsc2U7CiAgICB3aGlsZSAoKG5leHQgPSBzdHJlYW0ubmV4dCgpKSAhPSBudWxsKSB7CiAgICAgIGlmIChuZXh0ID09PSAnIicgJiYgIWVzY2FwZWQpIHsKICAgICAgICBlbmQgPSB0cnVlOwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGVzY2FwZWQgPSAhZXNjYXBlZCAmJiBuZXh0ID09PSAnXFwnOwogICAgfQogICAgaWYgKGVuZCAmJiAhZXNjYXBlZCkgewogICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTsKICAgIH0KICAgIHJldHVybiAnc3RyaW5nJzsKICB9OwoKICBmdW5jdGlvbiB0b2tlbkNvbW1lbnQoc3RyZWFtLCBzdGF0ZSkgewogICAgdmFyIHByZXYsIG5leHQ7CiAgICB3aGlsZSgobmV4dCA9IHN0cmVhbS5uZXh0KCkpICE9IG51bGwpIHsKICAgICAgaWYgKHByZXYgPT09ICcqJyAmJiBuZXh0ID09PSAnLycpIHsKICAgICAgICBzdGF0ZS50b2tlbml6ZSA9IHRva2VuQmFzZTsKICAgICAgICBicmVhazsKICAgICAgfQogICAgICBwcmV2ID0gbmV4dDsKICAgIH0KICAgIHJldHVybiAnY29tbWVudCc7CiAgfQoKICBmdW5jdGlvbiBjdXJyZW50U2NvcGUoc3RhdGUpIHsKICAgIHZhciBzY29wZSA9IG51bGw7CiAgICBpZiAoc3RhdGUuc2NvcGVzLmxlbmd0aCA+IDApCiAgICAgIHNjb3BlID0gc3RhdGUuc2NvcGVzW3N0YXRlLnNjb3Blcy5sZW5ndGggLSAxXTsKICAgIHJldHVybiBzY29wZTsKICB9CgogIHJldHVybiB7CiAgICBzdGFydFN0YXRlOiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICB0b2tlbml6ZTogdG9rZW5CYXNlLAogICAgICAgIHNjb3BlczogW10KICAgICAgfTsKICAgIH0sCiAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICBpZiAoc3RyZWFtLmVhdFNwYWNlKCkpIHJldHVybiBudWxsOwogICAgICByZXR1cm4gc3RhdGUudG9rZW5pemUoc3RyZWFtLCBzdGF0ZSk7CiAgICB9LAogICAgaW5kZW50OiBmdW5jdGlvbihzdGF0ZSwgdGV4dEFmdGVyKSB7CiAgICAgIGlmIChzdGF0ZS50b2tlbml6ZSAhPT0gdG9rZW5CYXNlICYmIHN0YXRlLnRva2VuaXplICE9PSBudWxsKQogICAgICAgIHJldHVybiBDb2RlTWlycm9yLlBhc3M7CgogICAgICB2YXIgZGVsdGEgPSAwOwogICAgICBpZiAodGV4dEFmdGVyID09PSAnXScgfHwgdGV4dEFmdGVyID09PSAnXTsnIHx8CiAgICAgICAgICB0ZXh0QWZ0ZXIgPT09ICd9JyB8fCB0ZXh0QWZ0ZXIgPT09ICd9OycgfHwKICAgICAgICAgIHRleHRBZnRlciA9PT0gJyk7JykKICAgICAgICBkZWx0YSA9IC0xOwoKICAgICAgcmV0dXJuIChzdGF0ZS5zY29wZXMubGVuZ3RoICsgZGVsdGEpICogX2NvbmZpZy5pbmRlbnRVbml0OwogICAgfSwKICAgIGVsZWN0cmljQ2hhcnM6ICJ7fVtdKCk7IiwKICAgIGJsb2NrQ29tbWVudFN0YXJ0OiAiLyoiLAogICAgYmxvY2tDb21tZW50RW5kOiAiKi8iLAogICAgbGluZUNvbW1lbnQ6ICIvLyIKICB9Owp9KTsKCkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgndGV4dC94LXlhY2FzJywgewogIG5hbWU6ICd5YWNhcycKfSk7Cgp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/yaml-frontmatter/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/yaml-frontmatter/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogWUFNTCBmcm9udCBtYXR0ZXIgbW9kZTwvdGl0bGU+CjxtZXRhIGNoYXJzZXQ9InV0Zi04Ii8+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uLy4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxzY3JpcHQgc3JjPSIuLi8uLi9saWIvY29kZW1pcnJvci5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi8uLi9hZGRvbi9tb2RlL292ZXJsYXkuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vbWFya2Rvd24vbWFya2Rvd24uanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vZ2ZtL2dmbS5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi95YW1sL3lhbWwuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0ieWFtbC1mcm9udG1hdHRlci5qcyI+PC9zY3JpcHQ+CjxzdHlsZT4uQ29kZU1pcnJvciB7IGJvcmRlci10b3A6IDFweCBzb2xpZCAjZGRkOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2RkZDsgfTwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGgxPkNvZGVNaXJyb3I8L2gxPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5ZQU1MLUZyb250bWF0dGVyPC9hPgogIDwvdWw+CjwvZGl2PgoKPGFydGljbGU+CjxoMj5ZQU1MIGZyb250IG1hdHRlciBtb2RlPC9oMj4KPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KLS0tCnJlY2VpcHQ6ICAgICBPei1XYXJlIFB1cmNoYXNlIEludm9pY2UKZGF0ZTogICAgICAgIDIwMDctMDgtMDYKY3VzdG9tZXI6CiAgICBnaXZlbjogICBEb3JvdGh5CiAgICBmYW1pbHk6ICBHYWxlCgppdGVtczoKICAgIC0gcGFydF9ubzogICBBNDc4NgogICAgICBkZXNjcmlwOiAgIFdhdGVyIEJ1Y2tldCAoRmlsbGVkKQogICAgICBwcmljZTogICAgIDEuNDcKICAgICAgcXVhbnRpdHk6ICA0CgogICAgLSBwYXJ0X25vOiAgIEUxNjI4CiAgICAgIGRlc2NyaXA6ICAgSGlnaCBIZWVsZWQgIlJ1YnkiIFNsaXBwZXJzCiAgICAgIHNpemU6ICAgICAgIDgKICAgICAgcHJpY2U6ICAgICAxMDAuMjcKICAgICAgcXVhbnRpdHk6ICAxCgpiaWxsLXRvOiAgJmlkMDAxCiAgICBzdHJlZXQ6IHwKICAgICAgICAgICAgMTIzIFRvcm5hZG8gQWxsZXkKICAgICAgICAgICAgU3VpdGUgMTYKICAgIGNpdHk6ICAgRWFzdCBDZW50ZXJ2aWxsZQogICAgc3RhdGU6ICBLUwoKc2hpcC10bzogICppZDAwMQoKc3BlY2lhbERlbGl2ZXJ5OiAgPgogICAgRm9sbG93IHRoZSBZZWxsb3cgQnJpY2sKICAgIFJvYWQgdG8gdGhlIEVtZXJhbGQgQ2l0eS4KICAgIFBheSBubyBhdHRlbnRpb24gdG8gdGhlCiAgICBtYW4gYmVoaW5kIHRoZSBjdXJ0YWluLgotLS0KCkdpdEh1YiBGbGF2b3JlZCBNYXJrZG93bgo9PT09PT09PT09PT09PT09PT09PT09PT0KCkV2ZXJ5dGhpbmcgZnJvbSBtYXJrZG93biBwbHVzIEdGTSBmZWF0dXJlczoKCiMjIFVSTCBhdXRvbGlua2luZwoKVW5kZXJzY29yZXNfYXJlX2FsbG93ZWRfYmV0d2Vlbl93b3Jkcy4KCiMjIFN0cmlrZXRocm91Z2ggdGV4dAoKR0ZNIGFkZHMgc3ludGF4IHRvIHN0cmlrZXRocm91Z2ggdGV4dCwgd2hpY2ggaXMgbWlzc2luZyBmcm9tIHN0YW5kYXJkIE1hcmtkb3duLgoKfn5NaXN0YWtlbiB0ZXh0Ln5+Cn5+Kip3b3JrcyB3aXRoIG90aGVyIGZvcm1hdHRpbmcqKn5+Cgp+fnNwYW5zIGFjcm9zcwpsaW5lc35+CgojIyBGZW5jZWQgY29kZSBibG9ja3MgKGFuZCBzeW50YXggaGlnaGxpZ2h0aW5nKQoKYGBgamF2YXNjcmlwdApmb3IgKHZhciBpID0gMDsgaSAmbHQ7IGl0ZW1zLmxlbmd0aDsgaSsrKSB7CiAgICBjb25zb2xlLmxvZyhpdGVtc1tpXSwgaSk7IC8vIGxvZyB0aGVtCn0KYGBgCgojIyBUYXNrIExpc3RzCgotIFsgXSBJbmNvbXBsZXRlIHRhc2sgbGlzdCBpdGVtCi0gW3hdICoqQ29tcGxldGVkKiogdGFzayBsaXN0IGl0ZW0KCiMjIEEgYml0IG9mIEdpdEh1YiBzcGljZQoKKiBTSEE6IGJlNmE4Y2MxYzFlY2ZlOTQ4OWZiNTFlNDg2OWFmMTVhMTNmYzJjZDIKKiBVc2VyQFNIQSByZWY6IG1vam9tYm9AYmU2YThjYzFjMWVjZmU5NDg5ZmI1MWU0ODY5YWYxNWExM2ZjMmNkMgoqIFVzZXIvUHJvamVjdEBTSEE6IG1vam9tYm8vZ29kQGJlNmE4Y2MxYzFlY2ZlOTQ4OWZiNTFlNDg2OWFmMTVhMTNmYzJjZDIKKiBcI051bTogIzEKKiBVc2VyLyNOdW06IG1vam9tYm8jMQoqIFVzZXIvUHJvamVjdCNOdW06IG1vam9tYm8vZ29kIzEKClNlZSBodHRwOi8vZ2l0aHViLmdpdGh1Yi5jb20vZ2l0aHViLWZsYXZvcmVkLW1hcmtkb3duLy4KPC90ZXh0YXJlYT48L2Zvcm0+Cgo8cD5EZWZpbmVzIGEgbW9kZSB0aGF0IHBhcnNlcwphIDxhIGhyZWY9Imh0dHA6Ly9qZWt5bGxyYi5jb20vZG9jcy9mcm9udG1hdHRlci8iPllBTUwgZnJvbnRtYXR0ZXI8L2E+CmF0IHRoZSBzdGFydCBvZiBhIGZpbGUsIHN3aXRjaGluZyB0byBhIGJhc2UgbW9kZSBhdCB0aGUgZW5kIG9mIHRoYXQuClRha2VzIGEgbW9kZSBjb25maWd1cmF0aW9uIG9wdGlvbiA8Y29kZT5iYXNlPC9jb2RlPiB0byBjb25maWd1cmUgdGhlCmJhc2UgbW9kZSwgd2hpY2ggZGVmYXVsdHMgdG8gPGNvZGU+ImdmbSI8L2NvZGU+LjwvcD4KCiAgICA8c2NyaXB0PgogICAgICB2YXIgZWRpdG9yID0gQ29kZU1pcnJvci5mcm9tVGV4dEFyZWEoZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoImNvZGUiKSwge21vZGU6ICJ5YW1sLWZyb250bWF0dGVyIn0pOwogICAgPC9zY3JpcHQ+CgogIDwvYXJ0aWNsZT4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/yaml-frontmatter/yaml-frontmatter.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24gKG1vZCkgewogIGlmICh0eXBlb2YgZXhwb3J0cyA9PSAib2JqZWN0IiAmJiB0eXBlb2YgbW9kdWxlID09ICJvYmplY3QiKSAvLyBDb21tb25KUwogICAgbW9kKHJlcXVpcmUoIi4uLy4uL2xpYi9jb2RlbWlycm9yIiksIHJlcXVpcmUoIi4uL3lhbWwveWFtbCIpKQogIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kKSAvLyBBTUQKICAgIGRlZmluZShbIi4uLy4uL2xpYi9jb2RlbWlycm9yIiwgIi4uL3lhbWwveWFtbCJdLCBtb2QpCiAgZWxzZSAvLyBQbGFpbiBicm93c2VyIGVudgogICAgbW9kKENvZGVNaXJyb3IpCn0pKGZ1bmN0aW9uIChDb2RlTWlycm9yKSB7CgogIHZhciBTVEFSVCA9IDAsIEZST05UTUFUVEVSID0gMSwgQk9EWSA9IDIKCiAgLy8gYSBtaXhlZCBtb2RlIGZvciBNYXJrZG93biB0ZXh0IHdpdGggYW4gb3B0aW9uYWwgWUFNTCBmcm9udCBtYXR0ZXIKICBDb2RlTWlycm9yLmRlZmluZU1vZGUoInlhbWwtZnJvbnRtYXR0ZXIiLCBmdW5jdGlvbiAoY29uZmlnLCBwYXJzZXJDb25maWcpIHsKICAgIHZhciB5YW1sTW9kZSA9IENvZGVNaXJyb3IuZ2V0TW9kZShjb25maWcsICJ5YW1sIikKICAgIHZhciBpbm5lck1vZGUgPSBDb2RlTWlycm9yLmdldE1vZGUoY29uZmlnLCBwYXJzZXJDb25maWcgJiYgcGFyc2VyQ29uZmlnLmJhc2UgfHwgImdmbSIpCgogICAgZnVuY3Rpb24gY3VyTW9kZShzdGF0ZSkgewogICAgICByZXR1cm4gc3RhdGUuc3RhdGUgPT0gQk9EWSA/IGlubmVyTW9kZSA6IHlhbWxNb2RlCiAgICB9CgogICAgcmV0dXJuIHsKICAgICAgc3RhcnRTdGF0ZTogZnVuY3Rpb24gKCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICBzdGF0ZTogU1RBUlQsCiAgICAgICAgICBpbm5lcjogQ29kZU1pcnJvci5zdGFydFN0YXRlKHlhbWxNb2RlKQogICAgICAgIH0KICAgICAgfSwKICAgICAgY29weVN0YXRlOiBmdW5jdGlvbiAoc3RhdGUpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgc3RhdGU6IHN0YXRlLnN0YXRlLAogICAgICAgICAgaW5uZXI6IENvZGVNaXJyb3IuY29weVN0YXRlKGN1ck1vZGUoc3RhdGUpLCBzdGF0ZS5pbm5lcikKICAgICAgICB9CiAgICAgIH0sCiAgICAgIHRva2VuOiBmdW5jdGlvbiAoc3RyZWFtLCBzdGF0ZSkgewogICAgICAgIGlmIChzdGF0ZS5zdGF0ZSA9PSBTVEFSVCkgewogICAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvLS0tLywgZmFsc2UpKSB7CiAgICAgICAgICAgIHN0YXRlLnN0YXRlID0gRlJPTlRNQVRURVIKICAgICAgICAgICAgcmV0dXJuIHlhbWxNb2RlLnRva2VuKHN0cmVhbSwgc3RhdGUuaW5uZXIpCiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdGF0ZS5zdGF0ZSA9IEJPRFkKICAgICAgICAgICAgc3RhdGUuaW5uZXIgPSBDb2RlTWlycm9yLnN0YXJ0U3RhdGUoaW5uZXJNb2RlKQogICAgICAgICAgICByZXR1cm4gaW5uZXJNb2RlLnRva2VuKHN0cmVhbSwgc3RhdGUuaW5uZXIpCiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChzdGF0ZS5zdGF0ZSA9PSBGUk9OVE1BVFRFUikgewogICAgICAgICAgdmFyIGVuZCA9IHN0cmVhbS5zb2woKSAmJiBzdHJlYW0ubWF0Y2goLy0tLS8sIGZhbHNlKQogICAgICAgICAgdmFyIHN0eWxlID0geWFtbE1vZGUudG9rZW4oc3RyZWFtLCBzdGF0ZS5pbm5lcikKICAgICAgICAgIGlmIChlbmQpIHsKICAgICAgICAgICAgc3RhdGUuc3RhdGUgPSBCT0RZCiAgICAgICAgICAgIHN0YXRlLmlubmVyID0gQ29kZU1pcnJvci5zdGFydFN0YXRlKGlubmVyTW9kZSkKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBzdHlsZQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gaW5uZXJNb2RlLnRva2VuKHN0cmVhbSwgc3RhdGUuaW5uZXIpCiAgICAgICAgfQogICAgICB9LAogICAgICBpbm5lck1vZGU6IGZ1bmN0aW9uIChzdGF0ZSkgewogICAgICAgIHJldHVybiB7bW9kZTogY3VyTW9kZShzdGF0ZSksIHN0YXRlOiBzdGF0ZS5pbm5lcn0KICAgICAgfSwKICAgICAgYmxhbmtMaW5lOiBmdW5jdGlvbiAoc3RhdGUpIHsKICAgICAgICB2YXIgbW9kZSA9IGN1ck1vZGUoc3RhdGUpCiAgICAgICAgaWYgKG1vZGUuYmxhbmtMaW5lKSByZXR1cm4gbW9kZS5ibGFua0xpbmUoc3RhdGUuaW5uZXIpCiAgICAgIH0KICAgIH0KICB9KQp9KTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/yaml/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/yaml/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogWUFNTCBtb2RlPC90aXRsZT4KPG1ldGEgY2hhcnNldD0idXRmLTgiLz4KPGxpbmsgcmVsPXN0eWxlc2hlZXQgaHJlZj0iLi4vLi4vZG9jL2RvY3MuY3NzIj4KCjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0iLi4vLi4vbGliL2NvZGVtaXJyb3IuY3NzIj4KPHNjcmlwdCBzcmM9Ii4uLy4uL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9InlhbWwuanMiPjwvc2NyaXB0Pgo8c3R5bGU+LkNvZGVNaXJyb3IgeyBib3JkZXItdG9wOiAxcHggc29saWQgI2RkZDsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNkZGQ7IH08L3N0eWxlPgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxoMT5Db2RlTWlycm9yPC9oMT48aW1nIGlkPWxvZ28gc3JjPSIuLi8uLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uLy4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBocmVmPSIuLi9pbmRleC5odG1sIj5MYW5ndWFnZSBtb2RlczwvYT4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+WUFNTDwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgo8aDI+WUFNTCBtb2RlPC9oMj4KPGZvcm0+PHRleHRhcmVhIGlkPSJjb2RlIiBuYW1lPSJjb2RlIj4KLS0tICMgRmF2b3JpdGUgbW92aWVzCi0gQ2FzYWJsYW5jYQotIE5vcnRoIGJ5IE5vcnRod2VzdAotIFRoZSBNYW4gV2hvIFdhc24ndCBUaGVyZQotLS0gIyBTaG9wcGluZyBsaXN0ClttaWxrLCBwdW1wa2luIHBpZSwgZWdncywganVpY2VdCi0tLSAjIEluZGVudGVkIEJsb2NrcywgY29tbW9uIGluIFlBTUwgZGF0YSBmaWxlcywgdXNlIGluZGVudGF0aW9uIGFuZCBuZXcgbGluZXMgdG8gc2VwYXJhdGUgdGhlIGtleTogdmFsdWUgcGFpcnMKICBuYW1lOiBKb2huIFNtaXRoCiAgYWdlOiAzMwotLS0gIyBJbmxpbmUgQmxvY2tzLCBjb21tb24gaW4gWUFNTCBkYXRhIHN0cmVhbXMsIHVzZSBjb21tYXMgdG8gc2VwYXJhdGUgdGhlIGtleTogdmFsdWUgcGFpcnMgYmV0d2VlbiBicmFjZXMKe25hbWU6IEpvaG4gU21pdGgsIGFnZTogMzN9Ci0tLQpyZWNlaXB0OiAgICAgT3otV2FyZSBQdXJjaGFzZSBJbnZvaWNlCmRhdGU6ICAgICAgICAyMDA3LTA4LTA2CmN1c3RvbWVyOgogICAgZ2l2ZW46ICAgRG9yb3RoeQogICAgZmFtaWx5OiAgR2FsZQoKaXRlbXM6CiAgICAtIHBhcnRfbm86ICAgQTQ3ODYKICAgICAgZGVzY3JpcDogICBXYXRlciBCdWNrZXQgKEZpbGxlZCkKICAgICAgcHJpY2U6ICAgICAxLjQ3CiAgICAgIHF1YW50aXR5OiAgNAoKICAgIC0gcGFydF9ubzogICBFMTYyOAogICAgICBkZXNjcmlwOiAgIEhpZ2ggSGVlbGVkICJSdWJ5IiBTbGlwcGVycwogICAgICBzaXplOiAgICAgICA4CiAgICAgIHByaWNlOiAgICAgMTAwLjI3CiAgICAgIHF1YW50aXR5OiAgMQoKYmlsbC10bzogICZpZDAwMQogICAgc3RyZWV0OiB8CiAgICAgICAgICAgIDEyMyBUb3JuYWRvIEFsbGV5CiAgICAgICAgICAgIFN1aXRlIDE2CiAgICBjaXR5OiAgIEVhc3QgQ2VudGVydmlsbGUKICAgIHN0YXRlOiAgS1MKCnNoaXAtdG86ICAqaWQwMDEKCnNwZWNpYWxEZWxpdmVyeTogID4KICAgIEZvbGxvdyB0aGUgWWVsbG93IEJyaWNrCiAgICBSb2FkIHRvIHRoZSBFbWVyYWxkIENpdHkuCiAgICBQYXkgbm8gYXR0ZW50aW9uIHRvIHRoZQogICAgbWFuIGJlaGluZCB0aGUgY3VydGFpbi4KLi4uCjwvdGV4dGFyZWE+PC9mb3JtPgogICAgPHNjcmlwdD4KICAgICAgdmFyIGVkaXRvciA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJjb2RlIiksIHt9KTsKICAgIDwvc2NyaXB0PgoKICAgIDxwPjxzdHJvbmc+TUlNRSB0eXBlcyBkZWZpbmVkOjwvc3Ryb25nPiA8Y29kZT50ZXh0L3gteWFtbDwvY29kZT4uPC9wPgoKICA8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/yaml/yaml.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgICBtb2QocmVxdWlyZSgiLi4vLi4vbGliL2NvZGVtaXJyb3IiKSk7CiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PSAiZnVuY3Rpb24iICYmIGRlZmluZS5hbWQpIC8vIEFNRAogICAgZGVmaW5lKFsiLi4vLi4vbGliL2NvZGVtaXJyb3IiXSwgbW9kKTsKICBlbHNlIC8vIFBsYWluIGJyb3dzZXIgZW52CiAgICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJ5YW1sIiwgZnVuY3Rpb24oKSB7CgogIHZhciBjb25zID0gWyd0cnVlJywgJ2ZhbHNlJywgJ29uJywgJ29mZicsICd5ZXMnLCAnbm8nXTsKICB2YXIga2V5d29yZFJlZ2V4ID0gbmV3IFJlZ0V4cCgiXFxiKCgiK2NvbnMuam9pbigiKXwoIikrIikpJCIsICdpJyk7CgogIHJldHVybiB7CiAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtLCBzdGF0ZSkgewogICAgICB2YXIgY2ggPSBzdHJlYW0ucGVlaygpOwogICAgICB2YXIgZXNjID0gc3RhdGUuZXNjYXBlZDsKICAgICAgc3RhdGUuZXNjYXBlZCA9IGZhbHNlOwogICAgICAvKiBjb21tZW50cyAqLwogICAgICBpZiAoY2ggPT0gIiMiICYmIChzdHJlYW0ucG9zID09IDAgfHwgL1xzLy50ZXN0KHN0cmVhbS5zdHJpbmcuY2hhckF0KHN0cmVhbS5wb3MgLSAxKSkpKSB7CiAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICAgIHJldHVybiAiY29tbWVudCI7CiAgICAgIH0KCiAgICAgIGlmIChzdHJlYW0ubWF0Y2goL14oJyhbXiddfFxcLikqJz98IihbXiJdfFxcLikqIj8pLykpCiAgICAgICAgcmV0dXJuICJzdHJpbmciOwoKICAgICAgaWYgKHN0YXRlLmxpdGVyYWwgJiYgc3RyZWFtLmluZGVudGF0aW9uKCkgPiBzdGF0ZS5rZXlDb2wpIHsKICAgICAgICBzdHJlYW0uc2tpcFRvRW5kKCk7IHJldHVybiAic3RyaW5nIjsKICAgICAgfSBlbHNlIGlmIChzdGF0ZS5saXRlcmFsKSB7IHN0YXRlLmxpdGVyYWwgPSBmYWxzZTsgfQogICAgICBpZiAoc3RyZWFtLnNvbCgpKSB7CiAgICAgICAgc3RhdGUua2V5Q29sID0gMDsKICAgICAgICBzdGF0ZS5wYWlyID0gZmFsc2U7CiAgICAgICAgc3RhdGUucGFpclN0YXJ0ID0gZmFsc2U7CiAgICAgICAgLyogZG9jdW1lbnQgc3RhcnQgKi8KICAgICAgICBpZihzdHJlYW0ubWF0Y2goLy0tLS8pKSB7IHJldHVybiAiZGVmIjsgfQogICAgICAgIC8qIGRvY3VtZW50IGVuZCAqLwogICAgICAgIGlmIChzdHJlYW0ubWF0Y2goL1wuXC5cLi8pKSB7IHJldHVybiAiZGVmIjsgfQogICAgICAgIC8qIGFycmF5IGxpc3QgaXRlbSAqLwogICAgICAgIGlmIChzdHJlYW0ubWF0Y2goL1xzKi1ccysvKSkgeyByZXR1cm4gJ21ldGEnOyB9CiAgICAgIH0KICAgICAgLyogaW5saW5lIHBhaXJzL2xpc3RzICovCiAgICAgIGlmIChzdHJlYW0ubWF0Y2goL14oXHt8XH18XFt8XF0pLykpIHsKICAgICAgICBpZiAoY2ggPT0gJ3snKQogICAgICAgICAgc3RhdGUuaW5saW5lUGFpcnMrKzsKICAgICAgICBlbHNlIGlmIChjaCA9PSAnfScpCiAgICAgICAgICBzdGF0ZS5pbmxpbmVQYWlycy0tOwogICAgICAgIGVsc2UgaWYgKGNoID09ICdbJykKICAgICAgICAgIHN0YXRlLmlubGluZUxpc3QrKzsKICAgICAgICBlbHNlCiAgICAgICAgICBzdGF0ZS5pbmxpbmVMaXN0LS07CiAgICAgICAgcmV0dXJuICdtZXRhJzsKICAgICAgfQoKICAgICAgLyogbGlzdCBzZXBlcmF0b3IgKi8KICAgICAgaWYgKHN0YXRlLmlubGluZUxpc3QgPiAwICYmICFlc2MgJiYgY2ggPT0gJywnKSB7CiAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgICByZXR1cm4gJ21ldGEnOwogICAgICB9CiAgICAgIC8qIHBhaXJzIHNlcGVyYXRvciAqLwogICAgICBpZiAoc3RhdGUuaW5saW5lUGFpcnMgPiAwICYmICFlc2MgJiYgY2ggPT0gJywnKSB7CiAgICAgICAgc3RhdGUua2V5Q29sID0gMDsKICAgICAgICBzdGF0ZS5wYWlyID0gZmFsc2U7CiAgICAgICAgc3RhdGUucGFpclN0YXJ0ID0gZmFsc2U7CiAgICAgICAgc3RyZWFtLm5leHQoKTsKICAgICAgICByZXR1cm4gJ21ldGEnOwogICAgICB9CgogICAgICAvKiBzdGFydCBvZiB2YWx1ZSBvZiBhIHBhaXIgKi8KICAgICAgaWYgKHN0YXRlLnBhaXJTdGFydCkgewogICAgICAgIC8qIGJsb2NrIGxpdGVyYWxzICovCiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXlxzKihcfHxcPilccyovKSkgeyBzdGF0ZS5saXRlcmFsID0gdHJ1ZTsgcmV0dXJuICdtZXRhJzsgfTsKICAgICAgICAvKiByZWZlcmVuY2VzICovCiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXlxzKihcJnxcKilbYS16MC05XC5fLV0rXGIvaSkpIHsgcmV0dXJuICd2YXJpYWJsZS0yJzsgfQogICAgICAgIC8qIG51bWJlcnMgKi8KICAgICAgICBpZiAoc3RhdGUuaW5saW5lUGFpcnMgPT0gMCAmJiBzdHJlYW0ubWF0Y2goL15ccyotP1swLTlcLlwsXStccz8kLykpIHsgcmV0dXJuICdudW1iZXInOyB9CiAgICAgICAgaWYgKHN0YXRlLmlubGluZVBhaXJzID4gMCAmJiBzdHJlYW0ubWF0Y2goL15ccyotP1swLTlcLlwsXStccz8oPz0oLHx9KSkvKSkgeyByZXR1cm4gJ251bWJlcic7IH0KICAgICAgICAvKiBrZXl3b3JkcyAqLwogICAgICAgIGlmIChzdHJlYW0ubWF0Y2goa2V5d29yZFJlZ2V4KSkgeyByZXR1cm4gJ2tleXdvcmQnOyB9CiAgICAgIH0KCiAgICAgIC8qIHBhaXJzIChhc3NvY2lhdGl2ZSBhcnJheXMpIC0+IGtleSAqLwogICAgICBpZiAoIXN0YXRlLnBhaXIgJiYgc3RyZWFtLm1hdGNoKC9eXHMqKD86WyxcW1xde30mKiF8PiciJUBgXVteXHMnIjpdfFteLFxbXF17fSMmKiF8PiciJUBgXSlbXiNdKj8oPz1ccyo6KCR8XHMpKS8pKSB7CiAgICAgICAgc3RhdGUucGFpciA9IHRydWU7CiAgICAgICAgc3RhdGUua2V5Q29sID0gc3RyZWFtLmluZGVudGF0aW9uKCk7CiAgICAgICAgcmV0dXJuICJhdG9tIjsKICAgICAgfQogICAgICBpZiAoc3RhdGUucGFpciAmJiBzdHJlYW0ubWF0Y2goL146XHMqLykpIHsgc3RhdGUucGFpclN0YXJ0ID0gdHJ1ZTsgcmV0dXJuICdtZXRhJzsgfQoKICAgICAgLyogbm90aGluZyBmb3VuZCwgY29udGludWUgKi8KICAgICAgc3RhdGUucGFpclN0YXJ0ID0gZmFsc2U7CiAgICAgIHN0YXRlLmVzY2FwZWQgPSAoY2ggPT0gJ1xcJyk7CiAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgIHJldHVybiBudWxsOwogICAgfSwKICAgIHN0YXJ0U3RhdGU6IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gewogICAgICAgIHBhaXI6IGZhbHNlLAogICAgICAgIHBhaXJTdGFydDogZmFsc2UsCiAgICAgICAga2V5Q29sOiAwLAogICAgICAgIGlubGluZVBhaXJzOiAwLAogICAgICAgIGlubGluZUxpc3Q6IDAsCiAgICAgICAgbGl0ZXJhbDogZmFsc2UsCiAgICAgICAgZXNjYXBlZDogZmFsc2UKICAgICAgfTsKICAgIH0KICB9Owp9KTsKCkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC94LXlhbWwiLCAieWFtbCIpOwoKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/z80/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/z80/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8dGl0bGU+Q29kZU1pcnJvcjogWjgwIGFzc2VtYmx5IG1vZGU8L3RpdGxlPgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8bGluayByZWw9c3R5bGVzaGVldCBocmVmPSIuLi8uLi9kb2MvZG9jcy5jc3MiPgoKPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSIuLi8uLi9saWIvY29kZW1pcnJvci5jc3MiPgo8c2NyaXB0IHNyYz0iLi4vLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iejgwLmpzIj48L3NjcmlwdD4KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4uQ29kZU1pcnJvciB7Ym9yZGVyLXRvcDogMXB4IHNvbGlkIGJsYWNrOyBib3JkZXItYm90dG9tOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+CjxkaXYgaWQ9bmF2PgogIDxhIGhyZWY9Imh0dHA6Ly9jb2RlbWlycm9yLm5ldCI+PGgxPkNvZGVNaXJyb3I8L2gxPjxpbWcgaWQ9bG9nbyBzcmM9Ii4uLy4uL2RvYy9sb2dvLnBuZyI+PC9hPgoKICA8dWw+CiAgICA8bGk+PGEgaHJlZj0iLi4vLi4vaW5kZXguaHRtbCI+SG9tZTwvYT4KICAgIDxsaT48YSBocmVmPSIuLi8uLi9kb2MvbWFudWFsLmh0bWwiPk1hbnVhbDwvYT4KICAgIDxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9jb2RlbWlycm9yIj5Db2RlPC9hPgogIDwvdWw+CiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkxhbmd1YWdlIG1vZGVzPC9hPgogICAgPGxpPjxhIGNsYXNzPWFjdGl2ZSBocmVmPSIjIj5aODAgYXNzZW1ibHk8L2E+CiAgPC91bD4KPC9kaXY+Cgo8YXJ0aWNsZT4KPGgyPlo4MCBhc3NlbWJseSBtb2RlPC9oMj4KCgo8ZGl2Pjx0ZXh0YXJlYSBpZD0iY29kZSIgbmFtZT0iY29kZSI+CiNpbmNsdWRlICAgICJ0aTgzcGx1cy5pbmMiCiNkZWZpbmUgICAgIHByb2dTdGFydCAgICQ5RDk1CiAgICAub3JnIHByb2dTdGFydC0yCiAgICAuZGIgJEJCLCQ2RAoKICAgIGJjYWxsKF9DbHJMQ0RGdWxsKQogICAgbGQgaGwsMAogICAgbGQgKEN1ckNvbCksaGwKICAgIGxkIGhsLE1lc3NhZ2UKICAgIGJjYWxsKF9QdXRTKSA7IERpc3BsYXlzIHRoZSBzdHJpbmcKICAgIGJjYWxsKF9OZXdMaW5lKQogICAgcmV0Ck1lc3NhZ2U6CiAgICAuZGIgIkhlbGxvIHdvcmxkISIsMAo8L3RleHRhcmVhPjwvZGl2PgoKICAgIDxzY3JpcHQ+CiAgICAgIHZhciBlZGl0b3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYShkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpLCB7CiAgICAgICAgbGluZU51bWJlcnM6IHRydWUKICAgICAgfSk7CiAgICA8L3NjcmlwdD4KCiAgICA8cD48c3Ryb25nPk1JTUUgdHlwZXMgZGVmaW5lZDo8L3N0cm9uZz4gPGNvZGU+dGV4dC94LXo4MDwvY29kZT4sIDxjb2RlPnRleHQveC1lejgwPC9jb2RlPi48L3A+CiAgPC9hcnRpY2xlPgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/mode/z80/z80.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24obW9kKSB7CiAgaWYgKHR5cGVvZiBleHBvcnRzID09ICJvYmplY3QiICYmIHR5cGVvZiBtb2R1bGUgPT0gIm9iamVjdCIpIC8vIENvbW1vbkpTCiAgbW9kKHJlcXVpcmUoIi4uLy4uL2xpYi9jb2RlbWlycm9yIikpOwogIGVsc2UgaWYgKHR5cGVvZiBkZWZpbmUgPT0gImZ1bmN0aW9uIiAmJiBkZWZpbmUuYW1kKSAvLyBBTUQKICBkZWZpbmUoWyIuLi8uLi9saWIvY29kZW1pcnJvciJdLCBtb2QpOwogIGVsc2UgLy8gUGxhaW4gYnJvd3NlciBlbnYKICBtb2QoQ29kZU1pcnJvcik7Cn0pKGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKInVzZSBzdHJpY3QiOwoKQ29kZU1pcnJvci5kZWZpbmVNb2RlKCd6ODAnLCBmdW5jdGlvbihfY29uZmlnLCBwYXJzZXJDb25maWcpIHsKICB2YXIgZXo4MCA9IHBhcnNlckNvbmZpZy5lejgwOwogIHZhciBrZXl3b3JkczEsIGtleXdvcmRzMjsKICBpZiAoZXo4MCkgewogICAga2V5d29yZHMxID0gL14oZXh4P3wobGR8Y3ApKFtkaV1yPyk/fFtscF1lYXxwb3B8cHVzaHxhZFtjZF18Y3BsfGRhYXxkZWN8aW5jfG5lZ3xzYmN8c3VifGFuZHxiaXR8W2NzXWNmfHg/b3J8cmVzfHNldHxyW2xyXWM/YT98cltscl1kfHNbbHJdYXxzcmx8ZGpuenxub3B8W2RlXWl8aGFsdHxpbXxpbihbZGldbXI/fGlyP3xpcnh8MnI/KXxvdChkbXI/fFtpZF1yeHxpbXI/KXxvdXQoMD98W2RpXXI/fFtkaV0ycj8pfHRzdChpbyk/fHNscCkoXC4oW3NsXT9pKT9bc2xdKT9cYi9pOwogICAga2V5d29yZHMyID0gL14oKChjYWxsfGpbcHJdfHJzdHxyZXRbaW5dPykoXC4oW3NsXT9pKT9bc2xdKT8pfChyc3xzdCltaXgpXGIvaTsKICB9IGVsc2UgewogICAga2V5d29yZHMxID0gL14oZXh4P3wobGR8Y3B8aW4pKFtkaV1yPyk/fHBvcHxwdXNofGFkW2NkXXxjcGx8ZGFhfGRlY3xpbmN8bmVnfHNiY3xzdWJ8YW5kfGJpdHxbY3NdY2Z8eD9vcnxyZXN8c2V0fHJbbHJdYz9hP3xyW2xyXWR8c1tscl1hfHNybHxkam56fG5vcHxyc3R8W2RlXWl8aGFsdHxpbXxvdFtkaV1yfG91dFtkaV0/KVxiL2k7CiAgICBrZXl3b3JkczIgPSAvXihjYWxsfGpbcHJdfHJldFtpbl0/fGJfPyhjYWxsfGp1bXApKVxiL2k7CiAgfQoKICB2YXIgdmFyaWFibGVzMSA9IC9eKGFmP3xiYz98Y3xkZT98ZXxobD98bHxpW3h5XT98cnxzcClcYi9pOwogIHZhciB2YXJpYWJsZXMyID0gL14obj9bemNdfHBbb2VdP3xtKVxiL2k7CiAgdmFyIGVycm9ycyA9IC9eKFtobF1beHldfGlbeHldW2hsXXxzbGlhfHNsbClcYi9pOwogIHZhciBudW1iZXJzID0gL14oW1xkYS1mXStofFswLTddK298WzAxXStifFxkK2Q/KVxiL2k7CgogIHJldHVybiB7CiAgICBzdGFydFN0YXRlOiBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHsKICAgICAgICBjb250ZXh0OiAwCiAgICAgIH07CiAgICB9LAogICAgdG9rZW46IGZ1bmN0aW9uKHN0cmVhbSwgc3RhdGUpIHsKICAgICAgaWYgKCFzdHJlYW0uY29sdW1uKCkpCiAgICAgICAgc3RhdGUuY29udGV4dCA9IDA7CgogICAgICBpZiAoc3RyZWFtLmVhdFNwYWNlKCkpCiAgICAgICAgcmV0dXJuIG51bGw7CgogICAgICB2YXIgdzsKCiAgICAgIGlmIChzdHJlYW0uZWF0V2hpbGUoL1x3LykpIHsKICAgICAgICBpZiAoZXo4MCAmJiBzdHJlYW0uZWF0KCcuJykpIHsKICAgICAgICAgIHN0cmVhbS5lYXRXaGlsZSgvXHcvKTsKICAgICAgICB9CiAgICAgICAgdyA9IHN0cmVhbS5jdXJyZW50KCk7CgogICAgICAgIGlmIChzdHJlYW0uaW5kZW50YXRpb24oKSkgewogICAgICAgICAgaWYgKChzdGF0ZS5jb250ZXh0ID09IDEgfHwgc3RhdGUuY29udGV4dCA9PSA0KSAmJiB2YXJpYWJsZXMxLnRlc3QodykpIHsKICAgICAgICAgICAgc3RhdGUuY29udGV4dCA9IDQ7CiAgICAgICAgICAgIHJldHVybiAndmFyMic7CiAgICAgICAgICB9CgogICAgICAgICAgaWYgKHN0YXRlLmNvbnRleHQgPT0gMiAmJiB2YXJpYWJsZXMyLnRlc3QodykpIHsKICAgICAgICAgICAgc3RhdGUuY29udGV4dCA9IDQ7CiAgICAgICAgICAgIHJldHVybiAndmFyMyc7CiAgICAgICAgICB9CgogICAgICAgICAgaWYgKGtleXdvcmRzMS50ZXN0KHcpKSB7CiAgICAgICAgICAgIHN0YXRlLmNvbnRleHQgPSAxOwogICAgICAgICAgICByZXR1cm4gJ2tleXdvcmQnOwogICAgICAgICAgfSBlbHNlIGlmIChrZXl3b3JkczIudGVzdCh3KSkgewogICAgICAgICAgICBzdGF0ZS5jb250ZXh0ID0gMjsKICAgICAgICAgICAgcmV0dXJuICdrZXl3b3JkJzsKICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUuY29udGV4dCA9PSA0ICYmIG51bWJlcnMudGVzdCh3KSkgewogICAgICAgICAgICByZXR1cm4gJ251bWJlcic7CiAgICAgICAgICB9CgogICAgICAgICAgaWYgKGVycm9ycy50ZXN0KHcpKQogICAgICAgICAgICByZXR1cm4gJ2Vycm9yJzsKICAgICAgICB9IGVsc2UgaWYgKHN0cmVhbS5tYXRjaChudW1iZXJzKSkgewogICAgICAgICAgcmV0dXJuICdudW1iZXInOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLmVhdCgnOycpKSB7CiAgICAgICAgc3RyZWFtLnNraXBUb0VuZCgpOwogICAgICAgIHJldHVybiAnY29tbWVudCc7CiAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLmVhdCgnIicpKSB7CiAgICAgICAgd2hpbGUgKHcgPSBzdHJlYW0ubmV4dCgpKSB7CiAgICAgICAgICBpZiAodyA9PSAnIicpCiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgIGlmICh3ID09ICdcXCcpCiAgICAgICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAnc3RyaW5nJzsKICAgICAgfSBlbHNlIGlmIChzdHJlYW0uZWF0KCdcJycpKSB7CiAgICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXFw/LicvKSkKICAgICAgICAgIHJldHVybiAnbnVtYmVyJzsKICAgICAgfSBlbHNlIGlmIChzdHJlYW0uZWF0KCcuJykgfHwgc3RyZWFtLnNvbCgpICYmIHN0cmVhbS5lYXQoJyMnKSkgewogICAgICAgIHN0YXRlLmNvbnRleHQgPSA1OwoKICAgICAgICBpZiAoc3RyZWFtLmVhdFdoaWxlKC9cdy8pKQogICAgICAgICAgcmV0dXJuICdkZWYnOwogICAgICB9IGVsc2UgaWYgKHN0cmVhbS5lYXQoJyQnKSkgewogICAgICAgIGlmIChzdHJlYW0uZWF0V2hpbGUoL1tcZGEtZl0vaSkpCiAgICAgICAgICByZXR1cm4gJ251bWJlcic7CiAgICAgIH0gZWxzZSBpZiAoc3RyZWFtLmVhdCgnJScpKSB7CiAgICAgICAgaWYgKHN0cmVhbS5lYXRXaGlsZSgvWzAxXS8pKQogICAgICAgICAgcmV0dXJuICdudW1iZXInOwogICAgICB9IGVsc2UgewogICAgICAgIHN0cmVhbS5uZXh0KCk7CiAgICAgIH0KICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfTsKfSk7CgpDb2RlTWlycm9yLmRlZmluZU1JTUUoInRleHQveC16ODAiLCAiejgwIik7CkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC94LWV6ODAiLCB7IG5hbWU6ICJ6ODAiLCBlejgwOiB0cnVlIH0pOwoKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/package.json</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ewogICJuYW1lIjogImNvZGVtaXJyb3IiLAogICJ2ZXJzaW9uIjogIjUuMjAuMiIsCiAgIm1haW4iOiAibGliL2NvZGVtaXJyb3IuanMiLAogICJkZXNjcmlwdGlvbiI6ICJGdWxsLWZlYXR1cmVkIGluLWJyb3dzZXIgY29kZSBlZGl0b3IiLAogICJsaWNlbnNlIjogIk1JVCIsCiAgImRpcmVjdG9yaWVzIjogewogICAgImxpYiI6ICIuL2xpYiIKICB9LAogICJzY3JpcHRzIjogewogICAgImJ1aWxkIjogInJvbGx1cCAtYyIsCiAgICAid2F0Y2giOiAicm9sbHVwIC13IC1jIiwKICAgICJwcmVwdWJsaXNoIjogIm5wbSBydW4tc2NyaXB0IGJ1aWxkIiwKICAgICJ0ZXN0IjogIm5vZGUgLi90ZXN0L3J1bi5qcyIsCiAgICAibGludCI6ICJiaW4vbGludCIKICB9LAogICJkZXZEZXBlbmRlbmNpZXMiOiB7CiAgICAiYmxpbnQiOiAiXjAuNS4xIiwKICAgICJub2RlLXN0YXRpYyI6ICIwLjYuMCIsCiAgICAicGhhbnRvbWpzLXByZWJ1aWx0IjogIl4yLjEuMTIiLAogICAgInJvbGx1cCI6ICJeMC4zNC4xMCIsCiAgICAicm9sbHVwLXBsdWdpbi1idWJsZSI6ICJeMC4xNC4wIiwKICAgICJyb2xsdXAtd2F0Y2giOiAiXjIuNS4wIgogIH0sCiAgImJ1Z3MiOiAiaHR0cDovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9Db2RlTWlycm9yL2lzc3VlcyIsCiAgImtleXdvcmRzIjogWwogICAgIkphdmFTY3JpcHQiLAogICAgIkNvZGVNaXJyb3IiLAogICAgIkVkaXRvciIKICBdLAogICJob21lcGFnZSI6ICJodHRwOi8vY29kZW1pcnJvci5uZXQiLAogICJtYWludGFpbmVycyI6IFsKICAgIHsKICAgICAgIm5hbWUiOiAiTWFyaWpuIEhhdmVyYmVrZSIsCiAgICAgICJlbWFpbCI6ICJtYXJpam5oQGdtYWlsLmNvbSIsCiAgICAgICJ3ZWIiOiAiaHR0cDovL21hcmlqbmhhdmVyYmVrZS5ubCIKICAgIH0KICBdLAogICJyZXBvc2l0b3J5IjogewogICAgInR5cGUiOiAiZ2l0IiwKICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvQ29kZU1pcnJvci5naXQiCiAgfSwKICAianNwbSI6IHsKICAgICJkaXJlY3RvcmllcyI6IHt9LAogICAgImRlcGVuZGVuY2llcyI6IHt9LAogICAgImRldkRlcGVuZGVuY2llcyI6IHt9CiAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/README.md</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[IyBDb2RlTWlycm9yClshW0J1aWxkIFN0YXR1c10oaHR0cHM6Ly90cmF2aXMtY2kub3JnL2NvZGVtaXJyb3IvQ29kZU1pcnJvci5zdmcpXShodHRwczovL3RyYXZpcy1jaS5vcmcvY29kZW1pcnJvci9Db2RlTWlycm9yKQpbIVtOUE0gdmVyc2lvbl0oaHR0cHM6Ly9pbWcuc2hpZWxkcy5pby9ucG0vdi9jb2RlbWlycm9yLnN2ZyldKGh0dHBzOi8vd3d3Lm5wbWpzLm9yZy9wYWNrYWdlL2NvZGVtaXJyb3IpClshW0pvaW4gdGhlIGNoYXQgYXQgaHR0cHM6Ly9naXR0ZXIuaW0vY29kZW1pcnJvci9Db2RlTWlycm9yXShodHRwczovL2JhZGdlcy5naXR0ZXIuaW0vSm9pbiUyMENoYXQuc3ZnKV0oaHR0cHM6Ly9naXR0ZXIuaW0vY29kZW1pcnJvci9Db2RlTWlycm9yKSAgCltGdW5kaW5nIHN0YXR1czogIVttYWludGFpbmVyIGhhcHBpbmVzc10oaHR0cHM6Ly9tYXJpam5oYXZlcmJla2UubmwvZnVuZC9zdGF0dXNfcy5wbmc/YWdhaW4pXShodHRwczovL21hcmlqbmhhdmVyYmVrZS5ubC9mdW5kLykKCkNvZGVNaXJyb3IgaXMgYSB2ZXJzYXRpbGUgdGV4dCBlZGl0b3IgaW1wbGVtZW50ZWQgaW4gSmF2YVNjcmlwdCBmb3IKdGhlIGJyb3dzZXIuIEl0IGlzIHNwZWNpYWxpemVkIGZvciBlZGl0aW5nIGNvZGUsIGFuZCBjb21lcyB3aXRoIG92ZXIKMTAwIGxhbmd1YWdlIG1vZGVzIGFuZCB2YXJpb3VzIGFkZG9ucyB0aGF0IGltcGxlbWVudCBtb3JlIGFkdmFuY2VkCmVkaXRpbmcgZnVuY3Rpb25hbGl0eS4KCkEgcmljaCBwcm9ncmFtbWluZyBBUEkgYW5kIGEgQ1NTIHRoZW1pbmcgc3lzdGVtIGFyZSBhdmFpbGFibGUgZm9yCmN1c3RvbWl6aW5nIENvZGVNaXJyb3IgdG8gZml0IHlvdXIgYXBwbGljYXRpb24sIGFuZCBleHRlbmRpbmcgaXQgd2l0aApuZXcgZnVuY3Rpb25hbGl0eS4KCllvdSBjYW4gZmluZCBtb3JlIGluZm9ybWF0aW9uIChhbmQgdGhlClttYW51YWxdKGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwpKSBvbiB0aGUgW3Byb2plY3QKcGFnZV0oaHR0cDovL2NvZGVtaXJyb3IubmV0KS4gRm9yIHF1ZXN0aW9ucyBhbmQgZGlzY3Vzc2lvbiwgdXNlIHRoZQpbZGlzY3Vzc2lvbiBmb3J1bV0oaHR0cHM6Ly9kaXNjdXNzLmNvZGVtaXJyb3IubmV0LykuCgpTZWUKW0NPTlRSSUJVVElORy5tZF0oaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvQ29kZU1pcnJvci9ibG9iL21hc3Rlci9DT05UUklCVVRJTkcubWQpCmZvciBjb250cmlidXRpbmcgZ3VpZGVsaW5lcy4KClRoZSBDb2RlTWlycm9yIGNvbW11bml0eSBhaW1zIHRvIGJlIHdlbGNvbWluZyB0byBldmVyeWJvZHkuIFdlIHVzZSB0aGUKW0NvbnRyaWJ1dG9yIENvdmVuYW50CigxLjEpXShodHRwOi8vY29udHJpYnV0b3ItY292ZW5hbnQub3JnL3ZlcnNpb24vMS8xLzAvKSBhcyBvdXIgY29kZSBvZgpjb25kdWN0LgoKIyMjIFF1aWNrc3RhcnQKClRvIGJ1aWxkIHRoZSBwcm9qZWN0LCBtYWtlIHN1cmUgeW91IGhhdmUgTm9kZS5qcyBpbnN0YWxsZWQgKGF0IGxlYXN0IHZlcnNpb24gNikKYW5kIHRoZW4gYG5wbSBpbnN0YWxsICYmIG5wbSBydW4gYnVpbGRgLiBUbyBydW4sIGp1c3Qgb3BlbiBgaW5kZXguaHRtbGAgaW4geW91cgpicm93c2VyICh5b3UgZG9uJ3QgbmVlZCB0byBydW4gYSB3ZWJzZXJ2ZXIpLiBSdW4gdGhlIHRlc3RzIHdpdGggYG5wbSB0ZXN0YC4K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/rollup.config.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aW1wb3J0IGJ1YmxlIGZyb20gJ3JvbGx1cC1wbHVnaW4tYnVibGUnOwoKZXhwb3J0IGRlZmF1bHQgewogIGJhbm5lcjogYC8vIENvZGVNaXJyb3IsIGNvcHlyaWdodCAoYykgYnkgTWFyaWpuIEhhdmVyYmVrZSBhbmQgb3RoZXJzCi8vIERpc3RyaWJ1dGVkIHVuZGVyIGFuIE1JVCBsaWNlbnNlOiBodHRwOi8vY29kZW1pcnJvci5uZXQvTElDRU5TRQoKLy8gVGhpcyBpcyBDb2RlTWlycm9yIChodHRwOi8vY29kZW1pcnJvci5uZXQpLCBhIGNvZGUgZWRpdG9yCi8vIGltcGxlbWVudGVkIGluIEphdmFTY3JpcHQgb24gdG9wIG9mIHRoZSBicm93c2VyJ3MgRE9NLgovLwovLyBZb3UgY2FuIGZpbmQgc29tZSB0ZWNobmljYWwgYmFja2dyb3VuZCBmb3Igc29tZSBvZiB0aGUgY29kZSBiZWxvdwovLyBhdCBodHRwOi8vbWFyaWpuaGF2ZXJiZWtlLm5sL2Jsb2cvI2NtLWludGVybmFscyAuCmAsCiAgZW50cnk6ICJzcmMvY29kZW1pcnJvci5qcyIsCiAgZm9ybWF0OiAidW1kIiwKICBkZXN0OiAibGliL2NvZGVtaXJyb3IuanMiLAogIG1vZHVsZU5hbWU6ICJDb2RlTWlycm9yIiwKICBwbHVnaW5zOiBbIGJ1YmxlKCkgXQp9Owo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/src/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/src/codemirror.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aW1wb3J0IHsgQ29kZU1pcnJvciB9IGZyb20gIi4vZWRpdC9tYWluIgoKZXhwb3J0IGRlZmF1bHQgQ29kZU1pcnJvcgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/src/display/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/src/display/Display.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aW1wb3J0IHsgZ2Vja28sIGllLCBpZV92ZXJzaW9uLCBtb2JpbGUsIHdlYmtpdCB9IGZyb20gIi4uL3V0aWwvYnJvd3NlciIKaW1wb3J0IHsgZWx0IH0gZnJvbSAiLi4vdXRpbC9kb20iCmltcG9ydCB7IHNjcm9sbGVyR2FwIH0gZnJvbSAiLi4vdXRpbC9taXNjIgoKLy8gVGhlIGRpc3BsYXkgaGFuZGxlcyB0aGUgRE9NIGludGVncmF0aW9uLCBib3RoIGZvciBpbnB1dCByZWFkaW5nCi8vIGFuZCBjb250ZW50IGRyYXdpbmcuIEl0IGhvbGRzIHJlZmVyZW5jZXMgdG8gRE9NIG5vZGVzIGFuZAovLyBkaXNwbGF5LXJlbGF0ZWQgc3RhdGUuCgpleHBvcnQgZnVuY3Rpb24gRGlzcGxheShwbGFjZSwgZG9jLCBpbnB1dCkgewogIGxldCBkID0gdGhpcwogIHRoaXMuaW5wdXQgPSBpbnB1dAoKICAvLyBDb3ZlcnMgYm90dG9tLXJpZ2h0IHNxdWFyZSB3aGVuIGJvdGggc2Nyb2xsYmFycyBhcmUgcHJlc2VudC4KICBkLnNjcm9sbGJhckZpbGxlciA9IGVsdCgiZGl2IiwgbnVsbCwgIkNvZGVNaXJyb3Itc2Nyb2xsYmFyLWZpbGxlciIpCiAgZC5zY3JvbGxiYXJGaWxsZXIuc2V0QXR0cmlidXRlKCJjbS1ub3QtY29udGVudCIsICJ0cnVlIikKICAvLyBDb3ZlcnMgYm90dG9tIG9mIGd1dHRlciB3aGVuIGNvdmVyR3V0dGVyTmV4dFRvU2Nyb2xsYmFyIGlzIG9uCiAgLy8gYW5kIGggc2Nyb2xsYmFyIGlzIHByZXNlbnQuCiAgZC5ndXR0ZXJGaWxsZXIgPSBlbHQoImRpdiIsIG51bGwsICJDb2RlTWlycm9yLWd1dHRlci1maWxsZXIiKQogIGQuZ3V0dGVyRmlsbGVyLnNldEF0dHJpYnV0ZSgiY20tbm90LWNvbnRlbnQiLCAidHJ1ZSIpCiAgLy8gV2lsbCBjb250YWluIHRoZSBhY3R1YWwgY29kZSwgcG9zaXRpb25lZCB0byBjb3ZlciB0aGUgdmlld3BvcnQuCiAgZC5saW5lRGl2ID0gZWx0KCJkaXYiLCBudWxsLCAiQ29kZU1pcnJvci1jb2RlIikKICAvLyBFbGVtZW50cyBhcmUgYWRkZWQgdG8gdGhlc2UgdG8gcmVwcmVzZW50IHNlbGVjdGlvbiBhbmQgY3Vyc29ycy4KICBkLnNlbGVjdGlvbkRpdiA9IGVsdCgiZGl2IiwgbnVsbCwgbnVsbCwgInBvc2l0aW9uOiByZWxhdGl2ZTsgei1pbmRleDogMSIpCiAgZC5jdXJzb3JEaXYgPSBlbHQoImRpdiIsIG51bGwsICJDb2RlTWlycm9yLWN1cnNvcnMiKQogIC8vIEEgdmlzaWJpbGl0eTogaGlkZGVuIGVsZW1lbnQgdXNlZCB0byBmaW5kIHRoZSBzaXplIG9mIHRoaW5ncy4KICBkLm1lYXN1cmUgPSBlbHQoImRpdiIsIG51bGwsICJDb2RlTWlycm9yLW1lYXN1cmUiKQogIC8vIFdoZW4gbGluZXMgb3V0c2lkZSBvZiB0aGUgdmlld3BvcnQgYXJlIG1lYXN1cmVkLCB0aGV5IGFyZSBkcmF3biBpbiB0aGlzLgogIGQubGluZU1lYXN1cmUgPSBlbHQoImRpdiIsIG51bGwsICJDb2RlTWlycm9yLW1lYXN1cmUiKQogIC8vIFdyYXBzIGV2ZXJ5dGhpbmcgdGhhdCBuZWVkcyB0byBleGlzdCBpbnNpZGUgdGhlIHZlcnRpY2FsbHktcGFkZGVkIGNvb3JkaW5hdGUgc3lzdGVtCiAgZC5saW5lU3BhY2UgPSBlbHQoImRpdiIsIFtkLm1lYXN1cmUsIGQubGluZU1lYXN1cmUsIGQuc2VsZWN0aW9uRGl2LCBkLmN1cnNvckRpdiwgZC5saW5lRGl2XSwKICAgICAgICAgICAgICAgICAgICBudWxsLCAicG9zaXRpb246IHJlbGF0aXZlOyBvdXRsaW5lOiBub25lIikKICAvLyBNb3ZlZCBhcm91bmQgaXRzIHBhcmVudCB0byBjb3ZlciB2aXNpYmxlIHZpZXcuCiAgZC5tb3ZlciA9IGVsdCgiZGl2IiwgW2VsdCgiZGl2IiwgW2QubGluZVNwYWNlXSwgIkNvZGVNaXJyb3ItbGluZXMiKV0sIG51bGwsICJwb3NpdGlvbjogcmVsYXRpdmUiKQogIC8vIFNldCB0byB0aGUgaGVpZ2h0IG9mIHRoZSBkb2N1bWVudCwgYWxsb3dpbmcgc2Nyb2xsaW5nLgogIGQuc2l6ZXIgPSBlbHQoImRpdiIsIFtkLm1vdmVyXSwgIkNvZGVNaXJyb3Itc2l6ZXIiKQogIGQuc2l6ZXJXaWR0aCA9IG51bGwKICAvLyBCZWhhdmlvciBvZiBlbHRzIHdpdGggb3ZlcmZsb3c6IGF1dG8gYW5kIHBhZGRpbmcgaXMKICAvLyBpbmNvbnNpc3RlbnQgYWNyb3NzIGJyb3dzZXJzLiBUaGlzIGlzIHVzZWQgdG8gZW5zdXJlIHRoZQogIC8vIHNjcm9sbGFibGUgYXJlYSBpcyBiaWcgZW5vdWdoLgogIGQuaGVpZ2h0Rm9yY2VyID0gZWx0KCJkaXYiLCBudWxsLCBudWxsLCAicG9zaXRpb246IGFic29sdXRlOyBoZWlnaHQ6ICIgKyBzY3JvbGxlckdhcCArICJweDsgd2lkdGg6IDFweDsiKQogIC8vIFdpbGwgY29udGFpbiB0aGUgZ3V0dGVycywgaWYgYW55LgogIGQuZ3V0dGVycyA9IGVsdCgiZGl2IiwgbnVsbCwgIkNvZGVNaXJyb3ItZ3V0dGVycyIpCiAgZC5saW5lR3V0dGVyID0gbnVsbAogIC8vIEFjdHVhbCBzY3JvbGxhYmxlIGVsZW1lbnQuCiAgZC5zY3JvbGxlciA9IGVsdCgiZGl2IiwgW2Quc2l6ZXIsIGQuaGVpZ2h0Rm9yY2VyLCBkLmd1dHRlcnNdLCAiQ29kZU1pcnJvci1zY3JvbGwiKQogIGQuc2Nyb2xsZXIuc2V0QXR0cmlidXRlKCJ0YWJJbmRleCIsICItMSIpCiAgLy8gVGhlIGVsZW1lbnQgaW4gd2hpY2ggdGhlIGVkaXRvciBsaXZlcy4KICBkLndyYXBwZXIgPSBlbHQoImRpdiIsIFtkLnNjcm9sbGJhckZpbGxlciwgZC5ndXR0ZXJGaWxsZXIsIGQuc2Nyb2xsZXJdLCAiQ29kZU1pcnJvciIpCgogIC8vIFdvcmsgYXJvdW5kIElFNyB6LWluZGV4IGJ1ZyAobm90IHBlcmZlY3QsIGhlbmNlIElFNyBub3QgcmVhbGx5IGJlaW5nIHN1cHBvcnRlZCkKICBpZiAoaWUgJiYgaWVfdmVyc2lvbiA8IDgpIHsgZC5ndXR0ZXJzLnN0eWxlLnpJbmRleCA9IC0xOyBkLnNjcm9sbGVyLnN0eWxlLnBhZGRpbmdSaWdodCA9IDAgfQogIGlmICghd2Via2l0ICYmICEoZ2Vja28gJiYgbW9iaWxlKSkgZC5zY3JvbGxlci5kcmFnZ2FibGUgPSB0cnVlCgogIGlmIChwbGFjZSkgewogICAgaWYgKHBsYWNlLmFwcGVuZENoaWxkKSBwbGFjZS5hcHBlbmRDaGlsZChkLndyYXBwZXIpCiAgICBlbHNlIHBsYWNlKGQud3JhcHBlcikKICB9CgogIC8vIEN1cnJlbnQgcmVuZGVyZWQgcmFuZ2UgKG1heSBiZSBiaWdnZXIgdGhhbiB0aGUgdmlldyB3aW5kb3cpLgogIGQudmlld0Zyb20gPSBkLnZpZXdUbyA9IGRvYy5maXJzdAogIGQucmVwb3J0ZWRWaWV3RnJvbSA9IGQucmVwb3J0ZWRWaWV3VG8gPSBkb2MuZmlyc3QKICAvLyBJbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVuZGVyZWQgbGluZXMuCiAgZC52aWV3ID0gW10KICBkLnJlbmRlcmVkVmlldyA9IG51bGwKICAvLyBIb2xkcyBpbmZvIGFib3V0IGEgc2luZ2xlIHJlbmRlcmVkIGxpbmUgd2hlbiBpdCB3YXMgcmVuZGVyZWQKICAvLyBmb3IgbWVhc3VyZW1lbnQsIHdoaWxlIG5vdCBpbiB2aWV3LgogIGQuZXh0ZXJuYWxNZWFzdXJlZCA9IG51bGwKICAvLyBFbXB0eSBzcGFjZSAoaW4gcGl4ZWxzKSBhYm92ZSB0aGUgdmlldwogIGQudmlld09mZnNldCA9IDAKICBkLmxhc3RXcmFwSGVpZ2h0ID0gZC5sYXN0V3JhcFdpZHRoID0gMAogIGQudXBkYXRlTGluZU51bWJlcnMgPSBudWxsCgogIGQubmF0aXZlQmFyV2lkdGggPSBkLmJhckhlaWdodCA9IGQuYmFyV2lkdGggPSAwCiAgZC5zY3JvbGxiYXJzQ2xpcHBlZCA9IGZhbHNlCgogIC8vIFVzZWQgdG8gb25seSByZXNpemUgdGhlIGxpbmUgbnVtYmVyIGd1dHRlciB3aGVuIG5lY2Vzc2FyeSAod2hlbgogIC8vIHRoZSBhbW91bnQgb2YgbGluZXMgY3Jvc3NlcyBhIGJvdW5kYXJ5IHRoYXQgbWFrZXMgaXRzIHdpZHRoIGNoYW5nZSkKICBkLmxpbmVOdW1XaWR0aCA9IGQubGluZU51bUlubmVyV2lkdGggPSBkLmxpbmVOdW1DaGFycyA9IG51bGwKICAvLyBTZXQgdG8gdHJ1ZSB3aGVuIGEgbm9uLWhvcml6b250YWwtc2Nyb2xsaW5nIGxpbmUgd2lkZ2V0IGlzCiAgLy8gYWRkZWQuIEFzIGFuIG9wdGltaXphdGlvbiwgbGluZSB3aWRnZXQgYWxpZ25pbmcgaXMgc2tpcHBlZCB3aGVuCiAgLy8gdGhpcyBpcyBmYWxzZS4KICBkLmFsaWduV2lkZ2V0cyA9IGZhbHNlCgogIGQuY2FjaGVkQ2hhcldpZHRoID0gZC5jYWNoZWRUZXh0SGVpZ2h0ID0gZC5jYWNoZWRQYWRkaW5nSCA9IG51bGwKCiAgLy8gVHJhY2tzIHRoZSBtYXhpbXVtIGxpbmUgbGVuZ3RoIHNvIHRoYXQgdGhlIGhvcml6b250YWwgc2Nyb2xsYmFyCiAgLy8gY2FuIGJlIGtlcHQgc3RhdGljIHdoZW4gc2Nyb2xsaW5nLgogIGQubWF4TGluZSA9IG51bGwKICBkLm1heExpbmVMZW5ndGggPSAwCiAgZC5tYXhMaW5lQ2hhbmdlZCA9IGZhbHNlCgogIC8vIFVzZWQgZm9yIG1lYXN1cmluZyB3aGVlbCBzY3JvbGxpbmcgZ3JhbnVsYXJpdHkKICBkLndoZWVsRFggPSBkLndoZWVsRFkgPSBkLndoZWVsU3RhcnRYID0gZC53aGVlbFN0YXJ0WSA9IG51bGwKCiAgLy8gVHJ1ZSB3aGVuIHNoaWZ0IGlzIGhlbGQgZG93bi4KICBkLnNoaWZ0ID0gZmFsc2UKCiAgLy8gVXNlZCB0byB0cmFjayB3aGV0aGVyIGFueXRoaW5nIGhhcHBlbmVkIHNpbmNlIHRoZSBjb250ZXh0IG1lbnUKICAvLyB3YXMgb3BlbmVkLgogIGQuc2VsRm9yQ29udGV4dE1lbnUgPSBudWxsCgogIGQuYWN0aXZlVG91Y2ggPSBudWxsCgogIGlucHV0LmluaXQoZCkKfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/src/display/focus.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aW1wb3J0IHsgcmVzdGFydEJsaW5rIH0gZnJvbSAiLi9zZWxlY3Rpb24iCmltcG9ydCB7IHdlYmtpdCB9IGZyb20gIi4uL3V0aWwvYnJvd3NlciIKaW1wb3J0IHsgYWRkQ2xhc3MsIHJtQ2xhc3MgfSBmcm9tICIuLi91dGlsL2RvbSIKaW1wb3J0IHsgc2lnbmFsIH0gZnJvbSAiLi4vdXRpbC9ldmVudCIKCmV4cG9ydCBmdW5jdGlvbiBlbnN1cmVGb2N1cyhjbSkgewogIGlmICghY20uc3RhdGUuZm9jdXNlZCkgeyBjbS5kaXNwbGF5LmlucHV0LmZvY3VzKCk7IG9uRm9jdXMoY20pIH0KfQoKZXhwb3J0IGZ1bmN0aW9uIGRlbGF5Qmx1ckV2ZW50KGNtKSB7CiAgY20uc3RhdGUuZGVsYXlpbmdCbHVyRXZlbnQgPSB0cnVlCiAgc2V0VGltZW91dCgoKSA9PiB7IGlmIChjbS5zdGF0ZS5kZWxheWluZ0JsdXJFdmVudCkgewogICAgY20uc3RhdGUuZGVsYXlpbmdCbHVyRXZlbnQgPSBmYWxzZQogICAgb25CbHVyKGNtKQogIH0gfSwgMTAwKQp9CgpleHBvcnQgZnVuY3Rpb24gb25Gb2N1cyhjbSwgZSkgewogIGlmIChjbS5zdGF0ZS5kZWxheWluZ0JsdXJFdmVudCkgY20uc3RhdGUuZGVsYXlpbmdCbHVyRXZlbnQgPSBmYWxzZQoKICBpZiAoY20ub3B0aW9ucy5yZWFkT25seSA9PSAibm9jdXJzb3IiKSByZXR1cm4KICBpZiAoIWNtLnN0YXRlLmZvY3VzZWQpIHsKICAgIHNpZ25hbChjbSwgImZvY3VzIiwgY20sIGUpCiAgICBjbS5zdGF0ZS5mb2N1c2VkID0gdHJ1ZQogICAgYWRkQ2xhc3MoY20uZGlzcGxheS53cmFwcGVyLCAiQ29kZU1pcnJvci1mb2N1c2VkIikKICAgIC8vIFRoaXMgdGVzdCBwcmV2ZW50cyB0aGlzIGZyb20gZmlyaW5nIHdoZW4gYSBjb250ZXh0CiAgICAvLyBtZW51IGlzIGNsb3NlZCAoc2luY2UgdGhlIGlucHV0IHJlc2V0IHdvdWxkIGtpbGwgdGhlCiAgICAvLyBzZWxlY3QtYWxsIGRldGVjdGlvbiBoYWNrKQogICAgaWYgKCFjbS5jdXJPcCAmJiBjbS5kaXNwbGF5LnNlbEZvckNvbnRleHRNZW51ICE9IGNtLmRvYy5zZWwpIHsKICAgICAgY20uZGlzcGxheS5pbnB1dC5yZXNldCgpCiAgICAgIGlmICh3ZWJraXQpIHNldFRpbWVvdXQoKCkgPT4gY20uZGlzcGxheS5pbnB1dC5yZXNldCh0cnVlKSwgMjApIC8vIElzc3VlICMxNzMwCiAgICB9CiAgICBjbS5kaXNwbGF5LmlucHV0LnJlY2VpdmVkRm9jdXMoKQogIH0KICByZXN0YXJ0QmxpbmsoY20pCn0KZXhwb3J0IGZ1bmN0aW9uIG9uQmx1cihjbSwgZSkgewogIGlmIChjbS5zdGF0ZS5kZWxheWluZ0JsdXJFdmVudCkgcmV0dXJuCgogIGlmIChjbS5zdGF0ZS5mb2N1c2VkKSB7CiAgICBzaWduYWwoY20sICJibHVyIiwgY20sIGUpCiAgICBjbS5zdGF0ZS5mb2N1c2VkID0gZmFsc2UKICAgIHJtQ2xhc3MoY20uZGlzcGxheS53cmFwcGVyLCAiQ29kZU1pcnJvci1mb2N1c2VkIikKICB9CiAgY2xlYXJJbnRlcnZhbChjbS5kaXNwbGF5LmJsaW5rZXIpCiAgc2V0VGltZW91dCgoKSA9PiB7IGlmICghY20uc3RhdGUuZm9jdXNlZCkgY20uZGlzcGxheS5zaGlmdCA9IGZhbHNlIH0sIDE1MCkKfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/src/display/gutters.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aW1wb3J0IHsgZWx0LCByZW1vdmVDaGlsZHJlbiB9IGZyb20gIi4uL3V0aWwvZG9tIgppbXBvcnQgeyBpbmRleE9mIH0gZnJvbSAiLi4vdXRpbC9taXNjIgoKaW1wb3J0IHsgdXBkYXRlR3V0dGVyU3BhY2UgfSBmcm9tICIuL3VwZGF0ZV9kaXNwbGF5IgoKLy8gUmVidWlsZCB0aGUgZ3V0dGVyIGVsZW1lbnRzLCBlbnN1cmUgdGhlIG1hcmdpbiB0byB0aGUgbGVmdCBvZiB0aGUKLy8gY29kZSBtYXRjaGVzIHRoZWlyIHdpZHRoLgpleHBvcnQgZnVuY3Rpb24gdXBkYXRlR3V0dGVycyhjbSkgewogIGxldCBndXR0ZXJzID0gY20uZGlzcGxheS5ndXR0ZXJzLCBzcGVjcyA9IGNtLm9wdGlvbnMuZ3V0dGVycwogIHJlbW92ZUNoaWxkcmVuKGd1dHRlcnMpCiAgbGV0IGkgPSAwCiAgZm9yICg7IGkgPCBzcGVjcy5sZW5ndGg7ICsraSkgewogICAgbGV0IGd1dHRlckNsYXNzID0gc3BlY3NbaV0KICAgIGxldCBnRWx0ID0gZ3V0dGVycy5hcHBlbmRDaGlsZChlbHQoImRpdiIsIG51bGwsICJDb2RlTWlycm9yLWd1dHRlciAiICsgZ3V0dGVyQ2xhc3MpKQogICAgaWYgKGd1dHRlckNsYXNzID09ICJDb2RlTWlycm9yLWxpbmVudW1iZXJzIikgewogICAgICBjbS5kaXNwbGF5LmxpbmVHdXR0ZXIgPSBnRWx0CiAgICAgIGdFbHQuc3R5bGUud2lkdGggPSAoY20uZGlzcGxheS5saW5lTnVtV2lkdGggfHwgMSkgKyAicHgiCiAgICB9CiAgfQogIGd1dHRlcnMuc3R5bGUuZGlzcGxheSA9IGkgPyAiIiA6ICJub25lIgogIHVwZGF0ZUd1dHRlclNwYWNlKGNtKQp9CgovLyBNYWtlIHN1cmUgdGhlIGd1dHRlcnMgb3B0aW9ucyBjb250YWlucyB0aGUgZWxlbWVudAovLyAiQ29kZU1pcnJvci1saW5lbnVtYmVycyIgd2hlbiB0aGUgbGluZU51bWJlcnMgb3B0aW9uIGlzIHRydWUuCmV4cG9ydCBmdW5jdGlvbiBzZXRHdXR0ZXJzRm9yTGluZU51bWJlcnMob3B0aW9ucykgewogIGxldCBmb3VuZCA9IGluZGV4T2Yob3B0aW9ucy5ndXR0ZXJzLCAiQ29kZU1pcnJvci1saW5lbnVtYmVycyIpCiAgaWYgKGZvdW5kID09IC0xICYmIG9wdGlvbnMubGluZU51bWJlcnMpIHsKICAgIG9wdGlvbnMuZ3V0dGVycyA9IG9wdGlvbnMuZ3V0dGVycy5jb25jYXQoWyJDb2RlTWlycm9yLWxpbmVudW1iZXJzIl0pCiAgfSBlbHNlIGlmIChmb3VuZCA+IC0xICYmICFvcHRpb25zLmxpbmVOdW1iZXJzKSB7CiAgICBvcHRpb25zLmd1dHRlcnMgPSBvcHRpb25zLmd1dHRlcnMuc2xpY2UoMCkKICAgIG9wdGlvbnMuZ3V0dGVycy5zcGxpY2UoZm91bmQsIDEpCiAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/src/display/highlight_worker.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aW1wb3J0IHsgZ2V0U3RhdGVCZWZvcmUsIGhpZ2hsaWdodExpbmUsIHByb2Nlc3NMaW5lIH0gZnJvbSAiLi4vbGluZS9oaWdobGlnaHQiCmltcG9ydCB7IGNvcHlTdGF0ZSB9IGZyb20gIi4uL21vZGVzIgppbXBvcnQgeyBiaW5kIH0gZnJvbSAiLi4vdXRpbC9taXNjIgoKaW1wb3J0IHsgcnVuSW5PcCB9IGZyb20gIi4vb3BlcmF0aW9ucyIKaW1wb3J0IHsgcmVnTGluZUNoYW5nZSB9IGZyb20gIi4vdmlld190cmFja2luZyIKCi8vIEhJR0hMSUdIVCBXT1JLRVIKCmV4cG9ydCBmdW5jdGlvbiBzdGFydFdvcmtlcihjbSwgdGltZSkgewogIGlmIChjbS5kb2MubW9kZS5zdGFydFN0YXRlICYmIGNtLmRvYy5mcm9udGllciA8IGNtLmRpc3BsYXkudmlld1RvKQogICAgY20uc3RhdGUuaGlnaGxpZ2h0LnNldCh0aW1lLCBiaW5kKGhpZ2hsaWdodFdvcmtlciwgY20pKQp9CgpmdW5jdGlvbiBoaWdobGlnaHRXb3JrZXIoY20pIHsKICBsZXQgZG9jID0gY20uZG9jCiAgaWYgKGRvYy5mcm9udGllciA8IGRvYy5maXJzdCkgZG9jLmZyb250aWVyID0gZG9jLmZpcnN0CiAgaWYgKGRvYy5mcm9udGllciA+PSBjbS5kaXNwbGF5LnZpZXdUbykgcmV0dXJuCiAgbGV0IGVuZCA9ICtuZXcgRGF0ZSArIGNtLm9wdGlvbnMud29ya1RpbWUKICBsZXQgc3RhdGUgPSBjb3B5U3RhdGUoZG9jLm1vZGUsIGdldFN0YXRlQmVmb3JlKGNtLCBkb2MuZnJvbnRpZXIpKQogIGxldCBjaGFuZ2VkTGluZXMgPSBbXQoKICBkb2MuaXRlcihkb2MuZnJvbnRpZXIsIE1hdGgubWluKGRvYy5maXJzdCArIGRvYy5zaXplLCBjbS5kaXNwbGF5LnZpZXdUbyArIDUwMCksIGxpbmUgPT4gewogICAgaWYgKGRvYy5mcm9udGllciA+PSBjbS5kaXNwbGF5LnZpZXdGcm9tKSB7IC8vIFZpc2libGUKICAgICAgbGV0IG9sZFN0eWxlcyA9IGxpbmUuc3R5bGVzLCB0b29Mb25nID0gbGluZS50ZXh0Lmxlbmd0aCA+IGNtLm9wdGlvbnMubWF4SGlnaGxpZ2h0TGVuZ3RoCiAgICAgIGxldCBoaWdobGlnaHRlZCA9IGhpZ2hsaWdodExpbmUoY20sIGxpbmUsIHRvb0xvbmcgPyBjb3B5U3RhdGUoZG9jLm1vZGUsIHN0YXRlKSA6IHN0YXRlLCB0cnVlKQogICAgICBsaW5lLnN0eWxlcyA9IGhpZ2hsaWdodGVkLnN0eWxlcwogICAgICBsZXQgb2xkQ2xzID0gbGluZS5zdHlsZUNsYXNzZXMsIG5ld0NscyA9IGhpZ2hsaWdodGVkLmNsYXNzZXMKICAgICAgaWYgKG5ld0NscykgbGluZS5zdHlsZUNsYXNzZXMgPSBuZXdDbHMKICAgICAgZWxzZSBpZiAob2xkQ2xzKSBsaW5lLnN0eWxlQ2xhc3NlcyA9IG51bGwKICAgICAgbGV0IGlzY2hhbmdlID0gIW9sZFN0eWxlcyB8fCBvbGRTdHlsZXMubGVuZ3RoICE9IGxpbmUuc3R5bGVzLmxlbmd0aCB8fAogICAgICAgIG9sZENscyAhPSBuZXdDbHMgJiYgKCFvbGRDbHMgfHwgIW5ld0NscyB8fCBvbGRDbHMuYmdDbGFzcyAhPSBuZXdDbHMuYmdDbGFzcyB8fCBvbGRDbHMudGV4dENsYXNzICE9IG5ld0Nscy50ZXh0Q2xhc3MpCiAgICAgIGZvciAobGV0IGkgPSAwOyAhaXNjaGFuZ2UgJiYgaSA8IG9sZFN0eWxlcy5sZW5ndGg7ICsraSkgaXNjaGFuZ2UgPSBvbGRTdHlsZXNbaV0gIT0gbGluZS5zdHlsZXNbaV0KICAgICAgaWYgKGlzY2hhbmdlKSBjaGFuZ2VkTGluZXMucHVzaChkb2MuZnJvbnRpZXIpCiAgICAgIGxpbmUuc3RhdGVBZnRlciA9IHRvb0xvbmcgPyBzdGF0ZSA6IGNvcHlTdGF0ZShkb2MubW9kZSwgc3RhdGUpCiAgICB9IGVsc2UgewogICAgICBpZiAobGluZS50ZXh0Lmxlbmd0aCA8PSBjbS5vcHRpb25zLm1heEhpZ2hsaWdodExlbmd0aCkKICAgICAgICBwcm9jZXNzTGluZShjbSwgbGluZS50ZXh0LCBzdGF0ZSkKICAgICAgbGluZS5zdGF0ZUFmdGVyID0gZG9jLmZyb250aWVyICUgNSA9PSAwID8gY29weVN0YXRlKGRvYy5tb2RlLCBzdGF0ZSkgOiBudWxsCiAgICB9CiAgICArK2RvYy5mcm9udGllcgogICAgaWYgKCtuZXcgRGF0ZSA+IGVuZCkgewogICAgICBzdGFydFdvcmtlcihjbSwgY20ub3B0aW9ucy53b3JrRGVsYXkpCiAgICAgIHJldHVybiB0cnVlCiAgICB9CiAgfSkKICBpZiAoY2hhbmdlZExpbmVzLmxlbmd0aCkgcnVuSW5PcChjbSwgKCkgPT4gewogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGFuZ2VkTGluZXMubGVuZ3RoOyBpKyspCiAgICAgIHJlZ0xpbmVDaGFuZ2UoY20sIGNoYW5nZWRMaW5lc1tpXSwgInRleHQiKQogIH0pCn0K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/src/display/line_numbers.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aW1wb3J0IHsgbGluZU51bWJlckZvciB9IGZyb20gIi4uL2xpbmUvdXRpbHNfbGluZSIKaW1wb3J0IHsgY29tcGVuc2F0ZUZvckhTY3JvbGwgfSBmcm9tICIuLi9tZWFzdXJlbWVudC9wb3NpdGlvbl9tZWFzdXJlbWVudCIKaW1wb3J0IHsgZWx0IH0gZnJvbSAiLi4vdXRpbC9kb20iCgppbXBvcnQgeyB1cGRhdGVHdXR0ZXJTcGFjZSB9IGZyb20gIi4vdXBkYXRlX2Rpc3BsYXkiCgovLyBSZS1hbGlnbiBsaW5lIG51bWJlcnMgYW5kIGd1dHRlciBtYXJrcyB0byBjb21wZW5zYXRlIGZvcgovLyBob3Jpem9udGFsIHNjcm9sbGluZy4KZXhwb3J0IGZ1bmN0aW9uIGFsaWduSG9yaXpvbnRhbGx5KGNtKSB7CiAgbGV0IGRpc3BsYXkgPSBjbS5kaXNwbGF5LCB2aWV3ID0gZGlzcGxheS52aWV3CiAgaWYgKCFkaXNwbGF5LmFsaWduV2lkZ2V0cyAmJiAoIWRpc3BsYXkuZ3V0dGVycy5maXJzdENoaWxkIHx8ICFjbS5vcHRpb25zLmZpeGVkR3V0dGVyKSkgcmV0dXJuCiAgbGV0IGNvbXAgPSBjb21wZW5zYXRlRm9ySFNjcm9sbChkaXNwbGF5KSAtIGRpc3BsYXkuc2Nyb2xsZXIuc2Nyb2xsTGVmdCArIGNtLmRvYy5zY3JvbGxMZWZ0CiAgbGV0IGd1dHRlclcgPSBkaXNwbGF5Lmd1dHRlcnMub2Zmc2V0V2lkdGgsIGxlZnQgPSBjb21wICsgInB4IgogIGZvciAobGV0IGkgPSAwOyBpIDwgdmlldy5sZW5ndGg7IGkrKykgaWYgKCF2aWV3W2ldLmhpZGRlbikgewogICAgaWYgKGNtLm9wdGlvbnMuZml4ZWRHdXR0ZXIpIHsKICAgICAgaWYgKHZpZXdbaV0uZ3V0dGVyKQogICAgICAgIHZpZXdbaV0uZ3V0dGVyLnN0eWxlLmxlZnQgPSBsZWZ0CiAgICAgIGlmICh2aWV3W2ldLmd1dHRlckJhY2tncm91bmQpCiAgICAgICAgdmlld1tpXS5ndXR0ZXJCYWNrZ3JvdW5kLnN0eWxlLmxlZnQgPSBsZWZ0CiAgICB9CiAgICBsZXQgYWxpZ24gPSB2aWV3W2ldLmFsaWduYWJsZQogICAgaWYgKGFsaWduKSBmb3IgKGxldCBqID0gMDsgaiA8IGFsaWduLmxlbmd0aDsgaisrKQogICAgICBhbGlnbltqXS5zdHlsZS5sZWZ0ID0gbGVmdAogIH0KICBpZiAoY20ub3B0aW9ucy5maXhlZEd1dHRlcikKICAgIGRpc3BsYXkuZ3V0dGVycy5zdHlsZS5sZWZ0ID0gKGNvbXAgKyBndXR0ZXJXKSArICJweCIKfQoKLy8gVXNlZCB0byBlbnN1cmUgdGhhdCB0aGUgbGluZSBudW1iZXIgZ3V0dGVyIGlzIHN0aWxsIHRoZSByaWdodAovLyBzaXplIGZvciB0aGUgY3VycmVudCBkb2N1bWVudCBzaXplLiBSZXR1cm5zIHRydWUgd2hlbiBhbiB1cGRhdGUKLy8gaXMgbmVlZGVkLgpleHBvcnQgZnVuY3Rpb24gbWF5YmVVcGRhdGVMaW5lTnVtYmVyV2lkdGgoY20pIHsKICBpZiAoIWNtLm9wdGlvbnMubGluZU51bWJlcnMpIHJldHVybiBmYWxzZQogIGxldCBkb2MgPSBjbS5kb2MsIGxhc3QgPSBsaW5lTnVtYmVyRm9yKGNtLm9wdGlvbnMsIGRvYy5maXJzdCArIGRvYy5zaXplIC0gMSksIGRpc3BsYXkgPSBjbS5kaXNwbGF5CiAgaWYgKGxhc3QubGVuZ3RoICE9IGRpc3BsYXkubGluZU51bUNoYXJzKSB7CiAgICBsZXQgdGVzdCA9IGRpc3BsYXkubWVhc3VyZS5hcHBlbmRDaGlsZChlbHQoImRpdiIsIFtlbHQoImRpdiIsIGxhc3QpXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ29kZU1pcnJvci1saW5lbnVtYmVyIENvZGVNaXJyb3ItZ3V0dGVyLWVsdCIpKQogICAgbGV0IGlubmVyVyA9IHRlc3QuZmlyc3RDaGlsZC5vZmZzZXRXaWR0aCwgcGFkZGluZyA9IHRlc3Qub2Zmc2V0V2lkdGggLSBpbm5lclcKICAgIGRpc3BsYXkubGluZUd1dHRlci5zdHlsZS53aWR0aCA9ICIiCiAgICBkaXNwbGF5LmxpbmVOdW1Jbm5lcldpZHRoID0gTWF0aC5tYXgoaW5uZXJXLCBkaXNwbGF5LmxpbmVHdXR0ZXIub2Zmc2V0V2lkdGggLSBwYWRkaW5nKSArIDEKICAgIGRpc3BsYXkubGluZU51bVdpZHRoID0gZGlzcGxheS5saW5lTnVtSW5uZXJXaWR0aCArIHBhZGRpbmcKICAgIGRpc3BsYXkubGluZU51bUNoYXJzID0gZGlzcGxheS5saW5lTnVtSW5uZXJXaWR0aCA/IGxhc3QubGVuZ3RoIDogLTEKICAgIGRpc3BsYXkubGluZUd1dHRlci5zdHlsZS53aWR0aCA9IGRpc3BsYXkubGluZU51bVdpZHRoICsgInB4IgogICAgdXBkYXRlR3V0dGVyU3BhY2UoY20pCiAgICByZXR1cm4gdHJ1ZQogIH0KICByZXR1cm4gZmFsc2UKfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/src/display/mode_state.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aW1wb3J0IHsgZ2V0TW9kZSB9IGZyb20gIi4uL21vZGVzIgoKaW1wb3J0IHsgc3RhcnRXb3JrZXIgfSBmcm9tICIuL2hpZ2hsaWdodF93b3JrZXIiCmltcG9ydCB7IHJlZ0NoYW5nZSB9IGZyb20gIi4vdmlld190cmFja2luZyIKCi8vIFVzZWQgdG8gZ2V0IHRoZSBlZGl0b3IgaW50byBhIGNvbnNpc3RlbnQgc3RhdGUgYWdhaW4gd2hlbiBvcHRpb25zIGNoYW5nZS4KCmV4cG9ydCBmdW5jdGlvbiBsb2FkTW9kZShjbSkgewogIGNtLmRvYy5tb2RlID0gZ2V0TW9kZShjbS5vcHRpb25zLCBjbS5kb2MubW9kZU9wdGlvbikKICByZXNldE1vZGVTdGF0ZShjbSkKfQoKZXhwb3J0IGZ1bmN0aW9uIHJlc2V0TW9kZVN0YXRlKGNtKSB7CiAgY20uZG9jLml0ZXIobGluZSA9PiB7CiAgICBpZiAobGluZS5zdGF0ZUFmdGVyKSBsaW5lLnN0YXRlQWZ0ZXIgPSBudWxsCiAgICBpZiAobGluZS5zdHlsZXMpIGxpbmUuc3R5bGVzID0gbnVsbAogIH0pCiAgY20uZG9jLmZyb250aWVyID0gY20uZG9jLmZpcnN0CiAgc3RhcnRXb3JrZXIoY20sIDEwMCkKICBjbS5zdGF0ZS5tb2RlR2VuKysKICBpZiAoY20uY3VyT3ApIHJlZ0NoYW5nZShjbSkKfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/src/display/operations.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aW1wb3J0IHsgY2xpcFBvcyB9IGZyb20gIi4uL2xpbmUvcG9zIgppbXBvcnQgeyBmaW5kTWF4TGluZSB9IGZyb20gIi4uL2xpbmUvc3BhbnMiCmltcG9ydCB7IGRpc3BsYXlXaWR0aCwgbWVhc3VyZUNoYXIsIHNjcm9sbEdhcCB9IGZyb20gIi4uL21lYXN1cmVtZW50L3Bvc2l0aW9uX21lYXN1cmVtZW50IgppbXBvcnQgeyBzaWduYWwgfSBmcm9tICIuLi91dGlsL2V2ZW50IgppbXBvcnQgeyBhY3RpdmVFbHQgfSBmcm9tICIuLi91dGlsL2RvbSIKaW1wb3J0IHsgZmluaXNoT3BlcmF0aW9uLCBwdXNoT3BlcmF0aW9uIH0gZnJvbSAiLi4vdXRpbC9vcGVyYXRpb25fZ3JvdXAiCgppbXBvcnQgeyBlbnN1cmVGb2N1cyB9IGZyb20gIi4vZm9jdXMiCmltcG9ydCB7IGFsaWduSG9yaXpvbnRhbGx5IH0gZnJvbSAiLi9saW5lX251bWJlcnMiCmltcG9ydCB7IG1lYXN1cmVGb3JTY3JvbGxiYXJzLCB1cGRhdGVTY3JvbGxiYXJzIH0gZnJvbSAiLi9zY3JvbGxiYXJzIgppbXBvcnQgeyBzZXRTY3JvbGxMZWZ0IH0gZnJvbSAiLi9zY3JvbGxfZXZlbnRzIgppbXBvcnQgeyByZXN0YXJ0QmxpbmsgfSBmcm9tICIuL3NlbGVjdGlvbiIKaW1wb3J0IHsgbWF5YmVTY3JvbGxXaW5kb3csIHNjcm9sbFBvc0ludG9WaWV3IH0gZnJvbSAiLi9zY3JvbGxpbmciCmltcG9ydCB7IERpc3BsYXlVcGRhdGUsIG1heWJlQ2xpcFNjcm9sbGJhcnMsIHBvc3RVcGRhdGVEaXNwbGF5LCBzZXREb2N1bWVudEhlaWdodCwgdXBkYXRlRGlzcGxheUlmTmVlZGVkIH0gZnJvbSAiLi91cGRhdGVfZGlzcGxheSIKaW1wb3J0IHsgdXBkYXRlSGVpZ2h0c0luVmlld3BvcnQgfSBmcm9tICIuL3VwZGF0ZV9saW5lcyIKCi8vIE9wZXJhdGlvbnMgYXJlIHVzZWQgdG8gd3JhcCBhIHNlcmllcyBvZiBjaGFuZ2VzIHRvIHRoZSBlZGl0b3IKLy8gc3RhdGUgaW4gc3VjaCBhIHdheSB0aGF0IGVhY2ggY2hhbmdlIHdvbid0IGhhdmUgdG8gdXBkYXRlIHRoZQovLyBjdXJzb3IgYW5kIGRpc3BsYXkgKHdoaWNoIHdvdWxkIGJlIGF3a3dhcmQsIHNsb3csIGFuZAovLyBlcnJvci1wcm9uZSkuIEluc3RlYWQsIGRpc3BsYXkgdXBkYXRlcyBhcmUgYmF0Y2hlZCBhbmQgdGhlbiBhbGwKLy8gY29tYmluZWQgYW5kIGV4ZWN1dGVkIGF0IG9uY2UuCgpsZXQgbmV4dE9wSWQgPSAwCi8vIFN0YXJ0IGEgbmV3IG9wZXJhdGlvbi4KZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0T3BlcmF0aW9uKGNtKSB7CiAgY20uY3VyT3AgPSB7CiAgICBjbTogY20sCiAgICB2aWV3Q2hhbmdlZDogZmFsc2UsICAgICAgLy8gRmxhZyB0aGF0IGluZGljYXRlcyB0aGF0IGxpbmVzIG1pZ2h0IG5lZWQgdG8gYmUgcmVkcmF3bgogICAgc3RhcnRIZWlnaHQ6IGNtLmRvYy5oZWlnaHQsIC8vIFVzZWQgdG8gZGV0ZWN0IG5lZWQgdG8gdXBkYXRlIHNjcm9sbGJhcgogICAgZm9yY2VVcGRhdGU6IGZhbHNlLCAgICAgIC8vIFVzZWQgdG8gZm9yY2UgYSByZWRyYXcKICAgIHVwZGF0ZUlucHV0OiBudWxsLCAgICAgICAvLyBXaGV0aGVyIHRvIHJlc2V0IHRoZSBpbnB1dCB0ZXh0YXJlYQogICAgdHlwaW5nOiBmYWxzZSwgICAgICAgICAgIC8vIFdoZXRoZXIgdGhpcyByZXNldCBzaG91bGQgYmUgY2FyZWZ1bCB0byBsZWF2ZSBleGlzdGluZyB0ZXh0IChmb3IgY29tcG9zaXRpbmcpCiAgICBjaGFuZ2VPYmpzOiBudWxsLCAgICAgICAgLy8gQWNjdW11bGF0ZWQgY2hhbmdlcywgZm9yIGZpcmluZyBjaGFuZ2UgZXZlbnRzCiAgICBjdXJzb3JBY3Rpdml0eUhhbmRsZXJzOiBudWxsLCAvLyBTZXQgb2YgaGFuZGxlcnMgdG8gZmlyZSBjdXJzb3JBY3Rpdml0eSBvbgogICAgY3Vyc29yQWN0aXZpdHlDYWxsZWQ6IDAsIC8vIFRyYWNrcyB3aGljaCBjdXJzb3JBY3Rpdml0eSBoYW5kbGVycyBoYXZlIGJlZW4gY2FsbGVkIGFscmVhZHkKICAgIHNlbGVjdGlvbkNoYW5nZWQ6IGZhbHNlLCAvLyBXaGV0aGVyIHRoZSBzZWxlY3Rpb24gbmVlZHMgdG8gYmUgcmVkcmF3bgogICAgdXBkYXRlTWF4TGluZTogZmFsc2UsICAgIC8vIFNldCB3aGVuIHRoZSB3aWRlc3QgbGluZSBuZWVkcyB0byBiZSBkZXRlcm1pbmVkIGFuZXcKICAgIHNjcm9sbExlZnQ6IG51bGwsIHNjcm9sbFRvcDogbnVsbCwgLy8gSW50ZXJtZWRpYXRlIHNjcm9sbCBwb3NpdGlvbiwgbm90IHB1c2hlZCB0byBET00geWV0CiAgICBzY3JvbGxUb1BvczogbnVsbCwgICAgICAgLy8gVXNlZCB0byBzY3JvbGwgdG8gYSBzcGVjaWZpYyBwb3NpdGlvbgogICAgZm9jdXM6IGZhbHNlLAogICAgaWQ6ICsrbmV4dE9wSWQgICAgICAgICAgIC8vIFVuaXF1ZSBJRAogIH0KICBwdXNoT3BlcmF0aW9uKGNtLmN1ck9wKQp9CgovLyBGaW5pc2ggYW4gb3BlcmF0aW9uLCB1cGRhdGluZyB0aGUgZGlzcGxheSBhbmQgc2lnbmFsbGluZyBkZWxheWVkIGV2ZW50cwpleHBvcnQgZnVuY3Rpb24gZW5kT3BlcmF0aW9uKGNtKSB7CiAgbGV0IG9wID0gY20uY3VyT3AKICBmaW5pc2hPcGVyYXRpb24ob3AsIGdyb3VwID0+IHsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZ3JvdXAub3BzLmxlbmd0aDsgaSsrKQogICAgICBncm91cC5vcHNbaV0uY20uY3VyT3AgPSBudWxsCiAgICBlbmRPcGVyYXRpb25zKGdyb3VwKQogIH0pCn0KCi8vIFRoZSBET00gdXBkYXRlcyBkb25lIHdoZW4gYW4gb3BlcmF0aW9uIGZpbmlzaGVzIGFyZSBiYXRjaGVkIHNvCi8vIHRoYXQgdGhlIG1pbmltdW0gbnVtYmVyIG9mIHJlbGF5b3V0cyBhcmUgcmVxdWlyZWQuCmZ1bmN0aW9uIGVuZE9wZXJhdGlvbnMoZ3JvdXApIHsKICBsZXQgb3BzID0gZ3JvdXAub3BzCiAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcHMubGVuZ3RoOyBpKyspIC8vIFJlYWQgRE9NCiAgICBlbmRPcGVyYXRpb25fUjEob3BzW2ldKQogIGZvciAobGV0IGkgPSAwOyBpIDwgb3BzLmxlbmd0aDsgaSsrKSAvLyBXcml0ZSBET00gKG1heWJlKQogICAgZW5kT3BlcmF0aW9uX1cxKG9wc1tpXSkKICBmb3IgKGxldCBpID0gMDsgaSA8IG9wcy5sZW5ndGg7IGkrKykgLy8gUmVhZCBET00KICAgIGVuZE9wZXJhdGlvbl9SMihvcHNbaV0pCiAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcHMubGVuZ3RoOyBpKyspIC8vIFdyaXRlIERPTSAobWF5YmUpCiAgICBlbmRPcGVyYXRpb25fVzIob3BzW2ldKQogIGZvciAobGV0IGkgPSAwOyBpIDwgb3BzLmxlbmd0aDsgaSsrKSAvLyBSZWFkIERPTQogICAgZW5kT3BlcmF0aW9uX2ZpbmlzaChvcHNbaV0pCn0KCmZ1bmN0aW9uIGVuZE9wZXJhdGlvbl9SMShvcCkgewogIGxldCBjbSA9IG9wLmNtLCBkaXNwbGF5ID0gY20uZGlzcGxheQogIG1heWJlQ2xpcFNjcm9sbGJhcnMoY20pCiAgaWYgKG9wLnVwZGF0ZU1heExpbmUpIGZpbmRNYXhMaW5lKGNtKQoKICBvcC5tdXN0VXBkYXRlID0gb3Audmlld0NoYW5nZWQgfHwgb3AuZm9yY2VVcGRhdGUgfHwgb3Auc2Nyb2xsVG9wICE9IG51bGwgfHwKICAgIG9wLnNjcm9sbFRvUG9zICYmIChvcC5zY3JvbGxUb1Bvcy5mcm9tLmxpbmUgPCBkaXNwbGF5LnZpZXdGcm9tIHx8CiAgICAgICAgICAgICAgICAgICAgICAgb3Auc2Nyb2xsVG9Qb3MudG8ubGluZSA+PSBkaXNwbGF5LnZpZXdUbykgfHwKICAgIGRpc3BsYXkubWF4TGluZUNoYW5nZWQgJiYgY20ub3B0aW9ucy5saW5lV3JhcHBpbmcKICBvcC51cGRhdGUgPSBvcC5tdXN0VXBkYXRlICYmCiAgICBuZXcgRGlzcGxheVVwZGF0ZShjbSwgb3AubXVzdFVwZGF0ZSAmJiB7dG9wOiBvcC5zY3JvbGxUb3AsIGVuc3VyZTogb3Auc2Nyb2xsVG9Qb3N9LCBvcC5mb3JjZVVwZGF0ZSkKfQoKZnVuY3Rpb24gZW5kT3BlcmF0aW9uX1cxKG9wKSB7CiAgb3AudXBkYXRlZERpc3BsYXkgPSBvcC5tdXN0VXBkYXRlICYmIHVwZGF0ZURpc3BsYXlJZk5lZWRlZChvcC5jbSwgb3AudXBkYXRlKQp9CgpmdW5jdGlvbiBlbmRPcGVyYXRpb25fUjIob3ApIHsKICBsZXQgY20gPSBvcC5jbSwgZGlzcGxheSA9IGNtLmRpc3BsYXkKICBpZiAob3AudXBkYXRlZERpc3BsYXkpIHVwZGF0ZUhlaWdodHNJblZpZXdwb3J0KGNtKQoKICBvcC5iYXJNZWFzdXJlID0gbWVhc3VyZUZvclNjcm9sbGJhcnMoY20pCgogIC8vIElmIHRoZSBtYXggbGluZSBjaGFuZ2VkIHNpbmNlIGl0IHdhcyBsYXN0IG1lYXN1cmVkLCBtZWFzdXJlIGl0LAogIC8vIGFuZCBlbnN1cmUgdGhlIGRvY3VtZW50J3Mgd2lkdGggbWF0Y2hlcyBpdC4KICAvLyB1cGRhdGVEaXNwbGF5X1cyIHdpbGwgdXNlIHRoZXNlIHByb3BlcnRpZXMgdG8gZG8gdGhlIGFjdHVhbCByZXNpemluZwogIGlmIChkaXNwbGF5Lm1heExpbmVDaGFuZ2VkICYmICFjbS5vcHRpb25zLmxpbmVXcmFwcGluZykgewogICAgb3AuYWRqdXN0V2lkdGhUbyA9IG1lYXN1cmVDaGFyKGNtLCBkaXNwbGF5Lm1heExpbmUsIGRpc3BsYXkubWF4TGluZS50ZXh0Lmxlbmd0aCkubGVmdCArIDMKICAgIGNtLmRpc3BsYXkuc2l6ZXJXaWR0aCA9IG9wLmFkanVzdFdpZHRoVG8KICAgIG9wLmJhck1lYXN1cmUuc2Nyb2xsV2lkdGggPQogICAgICBNYXRoLm1heChkaXNwbGF5LnNjcm9sbGVyLmNsaWVudFdpZHRoLCBkaXNwbGF5LnNpemVyLm9mZnNldExlZnQgKyBvcC5hZGp1c3RXaWR0aFRvICsgc2Nyb2xsR2FwKGNtKSArIGNtLmRpc3BsYXkuYmFyV2lkdGgpCiAgICBvcC5tYXhTY3JvbGxMZWZ0ID0gTWF0aC5tYXgoMCwgZGlzcGxheS5zaXplci5vZmZzZXRMZWZ0ICsgb3AuYWRqdXN0V2lkdGhUbyAtIGRpc3BsYXlXaWR0aChjbSkpCiAgfQoKICBpZiAob3AudXBkYXRlZERpc3BsYXkgfHwgb3Auc2VsZWN0aW9uQ2hhbmdlZCkKICAgIG9wLnByZXBhcmVkU2VsZWN0aW9uID0gZGlzcGxheS5pbnB1dC5wcmVwYXJlU2VsZWN0aW9uKG9wLmZvY3VzKQp9CgpmdW5jdGlvbiBlbmRPcGVyYXRpb25fVzIob3ApIHsKICBsZXQgY20gPSBvcC5jbQoKICBpZiAob3AuYWRqdXN0V2lkdGhUbyAhPSBudWxsKSB7CiAgICBjbS5kaXNwbGF5LnNpemVyLnN0eWxlLm1pbldpZHRoID0gb3AuYWRqdXN0V2lkdGhUbyArICJweCIKICAgIGlmIChvcC5tYXhTY3JvbGxMZWZ0IDwgY20uZG9jLnNjcm9sbExlZnQpCiAgICAgIHNldFNjcm9sbExlZnQoY20sIE1hdGgubWluKGNtLmRpc3BsYXkuc2Nyb2xsZXIuc2Nyb2xsTGVmdCwgb3AubWF4U2Nyb2xsTGVmdCksIHRydWUpCiAgICBjbS5kaXNwbGF5Lm1heExpbmVDaGFuZ2VkID0gZmFsc2UKICB9CgogIGxldCB0YWtlRm9jdXMgPSBvcC5mb2N1cyAmJiBvcC5mb2N1cyA9PSBhY3RpdmVFbHQoKSAmJiAoIWRvY3VtZW50Lmhhc0ZvY3VzIHx8IGRvY3VtZW50Lmhhc0ZvY3VzKCkpCiAgaWYgKG9wLnByZXBhcmVkU2VsZWN0aW9uKQogICAgY20uZGlzcGxheS5pbnB1dC5zaG93U2VsZWN0aW9uKG9wLnByZXBhcmVkU2VsZWN0aW9uLCB0YWtlRm9jdXMpCiAgaWYgKG9wLnVwZGF0ZWREaXNwbGF5IHx8IG9wLnN0YXJ0SGVpZ2h0ICE9IGNtLmRvYy5oZWlnaHQpCiAgICB1cGRhdGVTY3JvbGxiYXJzKGNtLCBvcC5iYXJNZWFzdXJlKQogIGlmIChvcC51cGRhdGVkRGlzcGxheSkKICAgIHNldERvY3VtZW50SGVpZ2h0KGNtLCBvcC5iYXJNZWFzdXJlKQoKICBpZiAob3Auc2VsZWN0aW9uQ2hhbmdlZCkgcmVzdGFydEJsaW5rKGNtKQoKICBpZiAoY20uc3RhdGUuZm9jdXNlZCAmJiBvcC51cGRhdGVJbnB1dCkKICAgIGNtLmRpc3BsYXkuaW5wdXQucmVzZXQob3AudHlwaW5nKQogIGlmICh0YWtlRm9jdXMpIGVuc3VyZUZvY3VzKG9wLmNtKQp9CgpmdW5jdGlvbiBlbmRPcGVyYXRpb25fZmluaXNoKG9wKSB7CiAgbGV0IGNtID0gb3AuY20sIGRpc3BsYXkgPSBjbS5kaXNwbGF5LCBkb2MgPSBjbS5kb2MKCiAgaWYgKG9wLnVwZGF0ZWREaXNwbGF5KSBwb3N0VXBkYXRlRGlzcGxheShjbSwgb3AudXBkYXRlKQoKICAvLyBBYm9ydCBtb3VzZSB3aGVlbCBkZWx0YSBtZWFzdXJlbWVudCwgd2hlbiBzY3JvbGxpbmcgZXhwbGljaXRseQogIGlmIChkaXNwbGF5LndoZWVsU3RhcnRYICE9IG51bGwgJiYgKG9wLnNjcm9sbFRvcCAhPSBudWxsIHx8IG9wLnNjcm9sbExlZnQgIT0gbnVsbCB8fCBvcC5zY3JvbGxUb1BvcykpCiAgICBkaXNwbGF5LndoZWVsU3RhcnRYID0gZGlzcGxheS53aGVlbFN0YXJ0WSA9IG51bGwKCiAgLy8gUHJvcGFnYXRlIHRoZSBzY3JvbGwgcG9zaXRpb24gdG8gdGhlIGFjdHVhbCBET00gc2Nyb2xsZXIKICBpZiAob3Auc2Nyb2xsVG9wICE9IG51bGwgJiYgKGRpc3BsYXkuc2Nyb2xsZXIuc2Nyb2xsVG9wICE9IG9wLnNjcm9sbFRvcCB8fCBvcC5mb3JjZVNjcm9sbCkpIHsKICAgIGRvYy5zY3JvbGxUb3AgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihkaXNwbGF5LnNjcm9sbGVyLnNjcm9sbEhlaWdodCAtIGRpc3BsYXkuc2Nyb2xsZXIuY2xpZW50SGVpZ2h0LCBvcC5zY3JvbGxUb3ApKQogICAgZGlzcGxheS5zY3JvbGxiYXJzLnNldFNjcm9sbFRvcChkb2Muc2Nyb2xsVG9wKQogICAgZGlzcGxheS5zY3JvbGxlci5zY3JvbGxUb3AgPSBkb2Muc2Nyb2xsVG9wCiAgfQogIGlmIChvcC5zY3JvbGxMZWZ0ICE9IG51bGwgJiYgKGRpc3BsYXkuc2Nyb2xsZXIuc2Nyb2xsTGVmdCAhPSBvcC5zY3JvbGxMZWZ0IHx8IG9wLmZvcmNlU2Nyb2xsKSkgewogICAgZG9jLnNjcm9sbExlZnQgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihkaXNwbGF5LnNjcm9sbGVyLnNjcm9sbFdpZHRoIC0gZGlzcGxheS5zY3JvbGxlci5jbGllbnRXaWR0aCwgb3Auc2Nyb2xsTGVmdCkpCiAgICBkaXNwbGF5LnNjcm9sbGJhcnMuc2V0U2Nyb2xsTGVmdChkb2Muc2Nyb2xsTGVmdCkKICAgIGRpc3BsYXkuc2Nyb2xsZXIuc2Nyb2xsTGVmdCA9IGRvYy5zY3JvbGxMZWZ0CiAgICBhbGlnbkhvcml6b250YWxseShjbSkKICB9CiAgLy8gSWYgd2UgbmVlZCB0byBzY3JvbGwgYSBzcGVjaWZpYyBwb3NpdGlvbiBpbnRvIHZpZXcsIGRvIHNvLgogIGlmIChvcC5zY3JvbGxUb1BvcykgewogICAgbGV0IGNvb3JkcyA9IHNjcm9sbFBvc0ludG9WaWV3KGNtLCBjbGlwUG9zKGRvYywgb3Auc2Nyb2xsVG9Qb3MuZnJvbSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpcFBvcyhkb2MsIG9wLnNjcm9sbFRvUG9zLnRvKSwgb3Auc2Nyb2xsVG9Qb3MubWFyZ2luKQogICAgaWYgKG9wLnNjcm9sbFRvUG9zLmlzQ3Vyc29yICYmIGNtLnN0YXRlLmZvY3VzZWQpIG1heWJlU2Nyb2xsV2luZG93KGNtLCBjb29yZHMpCiAgfQoKICAvLyBGaXJlIGV2ZW50cyBmb3IgbWFya2VycyB0aGF0IGFyZSBoaWRkZW4vdW5pZGRlbiBieSBlZGl0aW5nIG9yCiAgLy8gdW5kb2luZwogIGxldCBoaWRkZW4gPSBvcC5tYXliZUhpZGRlbk1hcmtlcnMsIHVuaGlkZGVuID0gb3AubWF5YmVVbmhpZGRlbk1hcmtlcnMKICBpZiAoaGlkZGVuKSBmb3IgKGxldCBpID0gMDsgaSA8IGhpZGRlbi5sZW5ndGg7ICsraSkKICAgIGlmICghaGlkZGVuW2ldLmxpbmVzLmxlbmd0aCkgc2lnbmFsKGhpZGRlbltpXSwgImhpZGUiKQogIGlmICh1bmhpZGRlbikgZm9yIChsZXQgaSA9IDA7IGkgPCB1bmhpZGRlbi5sZW5ndGg7ICsraSkKICAgIGlmICh1bmhpZGRlbltpXS5saW5lcy5sZW5ndGgpIHNpZ25hbCh1bmhpZGRlbltpXSwgInVuaGlkZSIpCgogIGlmIChkaXNwbGF5LndyYXBwZXIub2Zmc2V0SGVpZ2h0KQogICAgZG9jLnNjcm9sbFRvcCA9IGNtLmRpc3BsYXkuc2Nyb2xsZXIuc2Nyb2xsVG9wCgogIC8vIEZpcmUgY2hhbmdlIGV2ZW50cywgYW5kIGRlbGF5ZWQgZXZlbnQgaGFuZGxlcnMKICBpZiAob3AuY2hhbmdlT2JqcykKICAgIHNpZ25hbChjbSwgImNoYW5nZXMiLCBjbSwgb3AuY2hhbmdlT2JqcykKICBpZiAob3AudXBkYXRlKQogICAgb3AudXBkYXRlLmZpbmlzaCgpCn0KCi8vIFJ1biB0aGUgZ2l2ZW4gZnVuY3Rpb24gaW4gYW4gb3BlcmF0aW9uCmV4cG9ydCBmdW5jdGlvbiBydW5Jbk9wKGNtLCBmKSB7CiAgaWYgKGNtLmN1ck9wKSByZXR1cm4gZigpCiAgc3RhcnRPcGVyYXRpb24oY20pCiAgdHJ5IHsgcmV0dXJuIGYoKSB9CiAgZmluYWxseSB7IGVuZE9wZXJhdGlvbihjbSkgfQp9Ci8vIFdyYXBzIGEgZnVuY3Rpb24gaW4gYW4gb3BlcmF0aW9uLiBSZXR1cm5zIHRoZSB3cmFwcGVkIGZ1bmN0aW9uLgpleHBvcnQgZnVuY3Rpb24gb3BlcmF0aW9uKGNtLCBmKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgaWYgKGNtLmN1ck9wKSByZXR1cm4gZi5hcHBseShjbSwgYXJndW1lbnRzKQogICAgc3RhcnRPcGVyYXRpb24oY20pCiAgICB0cnkgeyByZXR1cm4gZi5hcHBseShjbSwgYXJndW1lbnRzKSB9CiAgICBmaW5hbGx5IHsgZW5kT3BlcmF0aW9uKGNtKSB9CiAgfQp9Ci8vIFVzZWQgdG8gYWRkIG1ldGhvZHMgdG8gZWRpdG9yIGFuZCBkb2MgaW5zdGFuY2VzLCB3cmFwcGluZyB0aGVtIGluCi8vIG9wZXJhdGlvbnMuCmV4cG9ydCBmdW5jdGlvbiBtZXRob2RPcChmKSB7CiAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgaWYgKHRoaXMuY3VyT3ApIHJldHVybiBmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykKICAgIHN0YXJ0T3BlcmF0aW9uKHRoaXMpCiAgICB0cnkgeyByZXR1cm4gZi5hcHBseSh0aGlzLCBhcmd1bWVudHMpIH0KICAgIGZpbmFsbHkgeyBlbmRPcGVyYXRpb24odGhpcykgfQogIH0KfQpleHBvcnQgZnVuY3Rpb24gZG9jTWV0aG9kT3AoZikgewogIHJldHVybiBmdW5jdGlvbigpIHsKICAgIGxldCBjbSA9IHRoaXMuY20KICAgIGlmICghY20gfHwgY20uY3VyT3ApIHJldHVybiBmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykKICAgIHN0YXJ0T3BlcmF0aW9uKGNtKQogICAgdHJ5IHsgcmV0dXJuIGYuYXBwbHkodGhpcywgYXJndW1lbnRzKSB9CiAgICBmaW5hbGx5IHsgZW5kT3BlcmF0aW9uKGNtKSB9CiAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/src/display/scrollbars.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aW1wb3J0IHsgYWRkQ2xhc3MsIGVsdCwgcm1DbGFzcyB9IGZyb20gIi4uL3V0aWwvZG9tIgppbXBvcnQgeyBvbiB9IGZyb20gIi4uL3V0aWwvZXZlbnQiCmltcG9ydCB7IHNjcm9sbEdhcCwgcGFkZGluZ1ZlcnQgfSBmcm9tICIuLi9tZWFzdXJlbWVudC9wb3NpdGlvbl9tZWFzdXJlbWVudCIKaW1wb3J0IHsgaWUsIGllX3ZlcnNpb24sIG1hYywgbWFjX2dlTW91bnRhaW5MaW9uIH0gZnJvbSAiLi4vdXRpbC9icm93c2VyIgppbXBvcnQgeyB1cGRhdGVIZWlnaHRzSW5WaWV3cG9ydCB9IGZyb20gIi4vdXBkYXRlX2xpbmVzIgppbXBvcnQgeyBjb3B5T2JqLCBEZWxheWVkIH0gZnJvbSAiLi4vdXRpbC9taXNjIgoKaW1wb3J0IHsgc2V0U2Nyb2xsTGVmdCwgc2V0U2Nyb2xsVG9wIH0gZnJvbSAiLi9zY3JvbGxfZXZlbnRzIgoKLy8gU0NST0xMQkFSUwoKLy8gUHJlcGFyZSBET00gcmVhZHMgbmVlZGVkIHRvIHVwZGF0ZSB0aGUgc2Nyb2xsYmFycy4gRG9uZSBpbiBvbmUKLy8gc2hvdCB0byBtaW5pbWl6ZSB1cGRhdGUvbWVhc3VyZSByb3VuZHRyaXBzLgpleHBvcnQgZnVuY3Rpb24gbWVhc3VyZUZvclNjcm9sbGJhcnMoY20pIHsKICBsZXQgZCA9IGNtLmRpc3BsYXksIGd1dHRlclcgPSBkLmd1dHRlcnMub2Zmc2V0V2lkdGgKICBsZXQgZG9jSCA9IE1hdGgucm91bmQoY20uZG9jLmhlaWdodCArIHBhZGRpbmdWZXJ0KGNtLmRpc3BsYXkpKQogIHJldHVybiB7CiAgICBjbGllbnRIZWlnaHQ6IGQuc2Nyb2xsZXIuY2xpZW50SGVpZ2h0LAogICAgdmlld0hlaWdodDogZC53cmFwcGVyLmNsaWVudEhlaWdodCwKICAgIHNjcm9sbFdpZHRoOiBkLnNjcm9sbGVyLnNjcm9sbFdpZHRoLCBjbGllbnRXaWR0aDogZC5zY3JvbGxlci5jbGllbnRXaWR0aCwKICAgIHZpZXdXaWR0aDogZC53cmFwcGVyLmNsaWVudFdpZHRoLAogICAgYmFyTGVmdDogY20ub3B0aW9ucy5maXhlZEd1dHRlciA/IGd1dHRlclcgOiAwLAogICAgZG9jSGVpZ2h0OiBkb2NILAogICAgc2Nyb2xsSGVpZ2h0OiBkb2NIICsgc2Nyb2xsR2FwKGNtKSArIGQuYmFySGVpZ2h0LAogICAgbmF0aXZlQmFyV2lkdGg6IGQubmF0aXZlQmFyV2lkdGgsCiAgICBndXR0ZXJXaWR0aDogZ3V0dGVyVwogIH0KfQoKZnVuY3Rpb24gTmF0aXZlU2Nyb2xsYmFycyhwbGFjZSwgc2Nyb2xsLCBjbSkgewogIHRoaXMuY20gPSBjbQogIGxldCB2ZXJ0ID0gdGhpcy52ZXJ0ID0gZWx0KCJkaXYiLCBbZWx0KCJkaXYiLCBudWxsLCBudWxsLCAibWluLXdpZHRoOiAxcHgiKV0sICJDb2RlTWlycm9yLXZzY3JvbGxiYXIiKQogIGxldCBob3JpeiA9IHRoaXMuaG9yaXogPSBlbHQoImRpdiIsIFtlbHQoImRpdiIsIG51bGwsIG51bGwsICJoZWlnaHQ6IDEwMCU7IG1pbi1oZWlnaHQ6IDFweCIpXSwgIkNvZGVNaXJyb3ItaHNjcm9sbGJhciIpCiAgcGxhY2UodmVydCk7IHBsYWNlKGhvcml6KQoKICBvbih2ZXJ0LCAic2Nyb2xsIiwgKCkgPT4gewogICAgaWYgKHZlcnQuY2xpZW50SGVpZ2h0KSBzY3JvbGwodmVydC5zY3JvbGxUb3AsICJ2ZXJ0aWNhbCIpCiAgfSkKICBvbihob3JpeiwgInNjcm9sbCIsICgpID0+IHsKICAgIGlmIChob3Jpei5jbGllbnRXaWR0aCkgc2Nyb2xsKGhvcml6LnNjcm9sbExlZnQsICJob3Jpem9udGFsIikKICB9KQoKICB0aGlzLmNoZWNrZWRaZXJvV2lkdGggPSBmYWxzZQogIC8vIE5lZWQgdG8gc2V0IGEgbWluaW11bSB3aWR0aCB0byBzZWUgdGhlIHNjcm9sbGJhciBvbiBJRTcgKGJ1dCBtdXN0IG5vdCBzZXQgaXQgb24gSUU4KS4KICBpZiAoaWUgJiYgaWVfdmVyc2lvbiA8IDgpIHRoaXMuaG9yaXouc3R5bGUubWluSGVpZ2h0ID0gdGhpcy52ZXJ0LnN0eWxlLm1pbldpZHRoID0gIjE4cHgiCn0KCk5hdGl2ZVNjcm9sbGJhcnMucHJvdG90eXBlID0gY29weU9iaih7CiAgdXBkYXRlOiBmdW5jdGlvbihtZWFzdXJlKSB7CiAgICBsZXQgbmVlZHNIID0gbWVhc3VyZS5zY3JvbGxXaWR0aCA+IG1lYXN1cmUuY2xpZW50V2lkdGggKyAxCiAgICBsZXQgbmVlZHNWID0gbWVhc3VyZS5zY3JvbGxIZWlnaHQgPiBtZWFzdXJlLmNsaWVudEhlaWdodCArIDEKICAgIGxldCBzV2lkdGggPSBtZWFzdXJlLm5hdGl2ZUJhcldpZHRoCgogICAgaWYgKG5lZWRzVikgewogICAgICB0aGlzLnZlcnQuc3R5bGUuZGlzcGxheSA9ICJibG9jayIKICAgICAgdGhpcy52ZXJ0LnN0eWxlLmJvdHRvbSA9IG5lZWRzSCA/IHNXaWR0aCArICJweCIgOiAiMCIKICAgICAgbGV0IHRvdGFsSGVpZ2h0ID0gbWVhc3VyZS52aWV3SGVpZ2h0IC0gKG5lZWRzSCA/IHNXaWR0aCA6IDApCiAgICAgIC8vIEEgYnVnIGluIElFOCBjYW4gY2F1c2UgdGhpcyB2YWx1ZSB0byBiZSBuZWdhdGl2ZSwgc28gZ3VhcmQgaXQuCiAgICAgIHRoaXMudmVydC5maXJzdENoaWxkLnN0eWxlLmhlaWdodCA9CiAgICAgICAgTWF0aC5tYXgoMCwgbWVhc3VyZS5zY3JvbGxIZWlnaHQgLSBtZWFzdXJlLmNsaWVudEhlaWdodCArIHRvdGFsSGVpZ2h0KSArICJweCIKICAgIH0gZWxzZSB7CiAgICAgIHRoaXMudmVydC5zdHlsZS5kaXNwbGF5ID0gIiIKICAgICAgdGhpcy52ZXJ0LmZpcnN0Q2hpbGQuc3R5bGUuaGVpZ2h0ID0gIjAiCiAgICB9CgogICAgaWYgKG5lZWRzSCkgewogICAgICB0aGlzLmhvcml6LnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siCiAgICAgIHRoaXMuaG9yaXouc3R5bGUucmlnaHQgPSBuZWVkc1YgPyBzV2lkdGggKyAicHgiIDogIjAiCiAgICAgIHRoaXMuaG9yaXouc3R5bGUubGVmdCA9IG1lYXN1cmUuYmFyTGVmdCArICJweCIKICAgICAgbGV0IHRvdGFsV2lkdGggPSBtZWFzdXJlLnZpZXdXaWR0aCAtIG1lYXN1cmUuYmFyTGVmdCAtIChuZWVkc1YgPyBzV2lkdGggOiAwKQogICAgICB0aGlzLmhvcml6LmZpcnN0Q2hpbGQuc3R5bGUud2lkdGggPQogICAgICAgIChtZWFzdXJlLnNjcm9sbFdpZHRoIC0gbWVhc3VyZS5jbGllbnRXaWR0aCArIHRvdGFsV2lkdGgpICsgInB4IgogICAgfSBlbHNlIHsKICAgICAgdGhpcy5ob3Jpei5zdHlsZS5kaXNwbGF5ID0gIiIKICAgICAgdGhpcy5ob3Jpei5maXJzdENoaWxkLnN0eWxlLndpZHRoID0gIjAiCiAgICB9CgogICAgaWYgKCF0aGlzLmNoZWNrZWRaZXJvV2lkdGggJiYgbWVhc3VyZS5jbGllbnRIZWlnaHQgPiAwKSB7CiAgICAgIGlmIChzV2lkdGggPT0gMCkgdGhpcy56ZXJvV2lkdGhIYWNrKCkKICAgICAgdGhpcy5jaGVja2VkWmVyb1dpZHRoID0gdHJ1ZQogICAgfQoKICAgIHJldHVybiB7cmlnaHQ6IG5lZWRzViA/IHNXaWR0aCA6IDAsIGJvdHRvbTogbmVlZHNIID8gc1dpZHRoIDogMH0KICB9LAogIHNldFNjcm9sbExlZnQ6IGZ1bmN0aW9uKHBvcykgewogICAgaWYgKHRoaXMuaG9yaXouc2Nyb2xsTGVmdCAhPSBwb3MpIHRoaXMuaG9yaXouc2Nyb2xsTGVmdCA9IHBvcwogICAgaWYgKHRoaXMuZGlzYWJsZUhvcml6KSB0aGlzLmVuYWJsZVplcm9XaWR0aEJhcih0aGlzLmhvcml6LCB0aGlzLmRpc2FibGVIb3JpeikKICB9LAogIHNldFNjcm9sbFRvcDogZnVuY3Rpb24ocG9zKSB7CiAgICBpZiAodGhpcy52ZXJ0LnNjcm9sbFRvcCAhPSBwb3MpIHRoaXMudmVydC5zY3JvbGxUb3AgPSBwb3MKICAgIGlmICh0aGlzLmRpc2FibGVWZXJ0KSB0aGlzLmVuYWJsZVplcm9XaWR0aEJhcih0aGlzLnZlcnQsIHRoaXMuZGlzYWJsZVZlcnQpCiAgfSwKICB6ZXJvV2lkdGhIYWNrOiBmdW5jdGlvbigpIHsKICAgIGxldCB3ID0gbWFjICYmICFtYWNfZ2VNb3VudGFpbkxpb24gPyAiMTJweCIgOiAiMThweCIKICAgIHRoaXMuaG9yaXouc3R5bGUuaGVpZ2h0ID0gdGhpcy52ZXJ0LnN0eWxlLndpZHRoID0gdwogICAgdGhpcy5ob3Jpei5zdHlsZS5wb2ludGVyRXZlbnRzID0gdGhpcy52ZXJ0LnN0eWxlLnBvaW50ZXJFdmVudHMgPSAibm9uZSIKICAgIHRoaXMuZGlzYWJsZUhvcml6ID0gbmV3IERlbGF5ZWQKICAgIHRoaXMuZGlzYWJsZVZlcnQgPSBuZXcgRGVsYXllZAogIH0sCiAgZW5hYmxlWmVyb1dpZHRoQmFyOiBmdW5jdGlvbihiYXIsIGRlbGF5KSB7CiAgICBiYXIuc3R5bGUucG9pbnRlckV2ZW50cyA9ICJhdXRvIgogICAgZnVuY3Rpb24gbWF5YmVEaXNhYmxlKCkgewogICAgICAvLyBUbyBmaW5kIG91dCB3aGV0aGVyIHRoZSBzY3JvbGxiYXIgaXMgc3RpbGwgdmlzaWJsZSwgd2UKICAgICAgLy8gY2hlY2sgd2hldGhlciB0aGUgZWxlbWVudCB1bmRlciB0aGUgcGl4ZWwgaW4gdGhlIGJvdHRvbQogICAgICAvLyBsZWZ0IGNvcm5lciBvZiB0aGUgc2Nyb2xsYmFyIGJveCBpcyB0aGUgc2Nyb2xsYmFyIGJveAogICAgICAvLyBpdHNlbGYgKHdoZW4gdGhlIGJhciBpcyBzdGlsbCB2aXNpYmxlKSBvciBpdHMgZmlsbGVyIGNoaWxkCiAgICAgIC8vICh3aGVuIHRoZSBiYXIgaXMgaGlkZGVuKS4gSWYgaXQgaXMgc3RpbGwgdmlzaWJsZSwgd2Uga2VlcAogICAgICAvLyBpdCBlbmFibGVkLCBpZiBpdCdzIGhpZGRlbiwgd2UgZGlzYWJsZSBwb2ludGVyIGV2ZW50cy4KICAgICAgbGV0IGJveCA9IGJhci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKQogICAgICBsZXQgZWx0ID0gZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludChib3gubGVmdCArIDEsIGJveC5ib3R0b20gLSAxKQogICAgICBpZiAoZWx0ICE9IGJhcikgYmFyLnN0eWxlLnBvaW50ZXJFdmVudHMgPSAibm9uZSIKICAgICAgZWxzZSBkZWxheS5zZXQoMTAwMCwgbWF5YmVEaXNhYmxlKQogICAgfQogICAgZGVsYXkuc2V0KDEwMDAsIG1heWJlRGlzYWJsZSkKICB9LAogIGNsZWFyOiBmdW5jdGlvbigpIHsKICAgIGxldCBwYXJlbnQgPSB0aGlzLmhvcml6LnBhcmVudE5vZGUKICAgIHBhcmVudC5yZW1vdmVDaGlsZCh0aGlzLmhvcml6KQogICAgcGFyZW50LnJlbW92ZUNoaWxkKHRoaXMudmVydCkKICB9Cn0sIE5hdGl2ZVNjcm9sbGJhcnMucHJvdG90eXBlKQoKZnVuY3Rpb24gTnVsbFNjcm9sbGJhcnMoKSB7fQoKTnVsbFNjcm9sbGJhcnMucHJvdG90eXBlID0gY29weU9iaih7CiAgdXBkYXRlOiBmdW5jdGlvbigpIHsgcmV0dXJuIHtib3R0b206IDAsIHJpZ2h0OiAwfSB9LAogIHNldFNjcm9sbExlZnQ6IGZ1bmN0aW9uKCkge30sCiAgc2V0U2Nyb2xsVG9wOiBmdW5jdGlvbigpIHt9LAogIGNsZWFyOiBmdW5jdGlvbigpIHt9Cn0sIE51bGxTY3JvbGxiYXJzLnByb3RvdHlwZSkKCmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVTY3JvbGxiYXJzKGNtLCBtZWFzdXJlKSB7CiAgaWYgKCFtZWFzdXJlKSBtZWFzdXJlID0gbWVhc3VyZUZvclNjcm9sbGJhcnMoY20pCiAgbGV0IHN0YXJ0V2lkdGggPSBjbS5kaXNwbGF5LmJhcldpZHRoLCBzdGFydEhlaWdodCA9IGNtLmRpc3BsYXkuYmFySGVpZ2h0CiAgdXBkYXRlU2Nyb2xsYmFyc0lubmVyKGNtLCBtZWFzdXJlKQogIGZvciAobGV0IGkgPSAwOyBpIDwgNCAmJiBzdGFydFdpZHRoICE9IGNtLmRpc3BsYXkuYmFyV2lkdGggfHwgc3RhcnRIZWlnaHQgIT0gY20uZGlzcGxheS5iYXJIZWlnaHQ7IGkrKykgewogICAgaWYgKHN0YXJ0V2lkdGggIT0gY20uZGlzcGxheS5iYXJXaWR0aCAmJiBjbS5vcHRpb25zLmxpbmVXcmFwcGluZykKICAgICAgdXBkYXRlSGVpZ2h0c0luVmlld3BvcnQoY20pCiAgICB1cGRhdGVTY3JvbGxiYXJzSW5uZXIoY20sIG1lYXN1cmVGb3JTY3JvbGxiYXJzKGNtKSkKICAgIHN0YXJ0V2lkdGggPSBjbS5kaXNwbGF5LmJhcldpZHRoOyBzdGFydEhlaWdodCA9IGNtLmRpc3BsYXkuYmFySGVpZ2h0CiAgfQp9CgovLyBSZS1zeW5jaHJvbml6ZSB0aGUgZmFrZSBzY3JvbGxiYXJzIHdpdGggdGhlIGFjdHVhbCBzaXplIG9mIHRoZQovLyBjb250ZW50LgpmdW5jdGlvbiB1cGRhdGVTY3JvbGxiYXJzSW5uZXIoY20sIG1lYXN1cmUpIHsKICBsZXQgZCA9IGNtLmRpc3BsYXkKICBsZXQgc2l6ZXMgPSBkLnNjcm9sbGJhcnMudXBkYXRlKG1lYXN1cmUpCgogIGQuc2l6ZXIuc3R5bGUucGFkZGluZ1JpZ2h0ID0gKGQuYmFyV2lkdGggPSBzaXplcy5yaWdodCkgKyAicHgiCiAgZC5zaXplci5zdHlsZS5wYWRkaW5nQm90dG9tID0gKGQuYmFySGVpZ2h0ID0gc2l6ZXMuYm90dG9tKSArICJweCIKICBkLmhlaWdodEZvcmNlci5zdHlsZS5ib3JkZXJCb3R0b20gPSBzaXplcy5ib3R0b20gKyAicHggc29saWQgdHJhbnNwYXJlbnQiCgogIGlmIChzaXplcy5yaWdodCAmJiBzaXplcy5ib3R0b20pIHsKICAgIGQuc2Nyb2xsYmFyRmlsbGVyLnN0eWxlLmRpc3BsYXkgPSAiYmxvY2siCiAgICBkLnNjcm9sbGJhckZpbGxlci5zdHlsZS5oZWlnaHQgPSBzaXplcy5ib3R0b20gKyAicHgiCiAgICBkLnNjcm9sbGJhckZpbGxlci5zdHlsZS53aWR0aCA9IHNpemVzLnJpZ2h0ICsgInB4IgogIH0gZWxzZSBkLnNjcm9sbGJhckZpbGxlci5zdHlsZS5kaXNwbGF5ID0gIiIKICBpZiAoc2l6ZXMuYm90dG9tICYmIGNtLm9wdGlvbnMuY292ZXJHdXR0ZXJOZXh0VG9TY3JvbGxiYXIgJiYgY20ub3B0aW9ucy5maXhlZEd1dHRlcikgewogICAgZC5ndXR0ZXJGaWxsZXIuc3R5bGUuZGlzcGxheSA9ICJibG9jayIKICAgIGQuZ3V0dGVyRmlsbGVyLnN0eWxlLmhlaWdodCA9IHNpemVzLmJvdHRvbSArICJweCIKICAgIGQuZ3V0dGVyRmlsbGVyLnN0eWxlLndpZHRoID0gbWVhc3VyZS5ndXR0ZXJXaWR0aCArICJweCIKICB9IGVsc2UgZC5ndXR0ZXJGaWxsZXIuc3R5bGUuZGlzcGxheSA9ICIiCn0KCmV4cG9ydCBsZXQgc2Nyb2xsYmFyTW9kZWwgPSB7Im5hdGl2ZSI6IE5hdGl2ZVNjcm9sbGJhcnMsICJudWxsIjogTnVsbFNjcm9sbGJhcnN9CgpleHBvcnQgZnVuY3Rpb24gaW5pdFNjcm9sbGJhcnMoY20pIHsKICBpZiAoY20uZGlzcGxheS5zY3JvbGxiYXJzKSB7CiAgICBjbS5kaXNwbGF5LnNjcm9sbGJhcnMuY2xlYXIoKQogICAgaWYgKGNtLmRpc3BsYXkuc2Nyb2xsYmFycy5hZGRDbGFzcykKICAgICAgcm1DbGFzcyhjbS5kaXNwbGF5LndyYXBwZXIsIGNtLmRpc3BsYXkuc2Nyb2xsYmFycy5hZGRDbGFzcykKICB9CgogIGNtLmRpc3BsYXkuc2Nyb2xsYmFycyA9IG5ldyBzY3JvbGxiYXJNb2RlbFtjbS5vcHRpb25zLnNjcm9sbGJhclN0eWxlXShub2RlID0+IHsKICAgIGNtLmRpc3BsYXkud3JhcHBlci5pbnNlcnRCZWZvcmUobm9kZSwgY20uZGlzcGxheS5zY3JvbGxiYXJGaWxsZXIpCiAgICAvLyBQcmV2ZW50IGNsaWNrcyBpbiB0aGUgc2Nyb2xsYmFycyBmcm9tIGtpbGxpbmcgZm9jdXMKICAgIG9uKG5vZGUsICJtb3VzZWRvd24iLCAoKSA9PiB7CiAgICAgIGlmIChjbS5zdGF0ZS5mb2N1c2VkKSBzZXRUaW1lb3V0KCgpID0+IGNtLmRpc3BsYXkuaW5wdXQuZm9jdXMoKSwgMCkKICAgIH0pCiAgICBub2RlLnNldEF0dHJpYnV0ZSgiY20tbm90LWNvbnRlbnQiLCAidHJ1ZSIpCiAgfSwgKHBvcywgYXhpcykgPT4gewogICAgaWYgKGF4aXMgPT0gImhvcml6b250YWwiKSBzZXRTY3JvbGxMZWZ0KGNtLCBwb3MpCiAgICBlbHNlIHNldFNjcm9sbFRvcChjbSwgcG9zKQogIH0sIGNtKQogIGlmIChjbS5kaXNwbGF5LnNjcm9sbGJhcnMuYWRkQ2xhc3MpCiAgICBhZGRDbGFzcyhjbS5kaXNwbGF5LndyYXBwZXIsIGNtLmRpc3BsYXkuc2Nyb2xsYmFycy5hZGRDbGFzcykKfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/src/display/scrolling.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aW1wb3J0IHsgUG9zIH0gZnJvbSAiLi4vbGluZS9wb3MiCmltcG9ydCB7IGN1cnNvckNvb3JkcywgZGlzcGxheUhlaWdodCwgZGlzcGxheVdpZHRoLCBlc3RpbWF0ZUNvb3JkcywgcGFkZGluZ1RvcCwgcGFkZGluZ1ZlcnQsIHNjcm9sbEdhcCwgdGV4dEhlaWdodCB9IGZyb20gIi4uL21lYXN1cmVtZW50L3Bvc2l0aW9uX21lYXN1cmVtZW50IgppbXBvcnQgeyBwaGFudG9tIH0gZnJvbSAiLi4vdXRpbC9icm93c2VyIgppbXBvcnQgeyBlbHQgfSBmcm9tICIuLi91dGlsL2RvbSIKaW1wb3J0IHsgc2lnbmFsRE9NRXZlbnQgfSBmcm9tICIuLi91dGlsL2V2ZW50IgoKaW1wb3J0IHsgc2V0U2Nyb2xsTGVmdCwgc2V0U2Nyb2xsVG9wIH0gZnJvbSAiLi9zY3JvbGxfZXZlbnRzIgoKLy8gU0NST0xMSU5HIFRISU5HUyBJTlRPIFZJRVcKCi8vIElmIGFuIGVkaXRvciBzaXRzIG9uIHRoZSB0b3Agb3IgYm90dG9tIG9mIHRoZSB3aW5kb3csIHBhcnRpYWxseQovLyBzY3JvbGxlZCBvdXQgb2YgdmlldywgdGhpcyBlbnN1cmVzIHRoYXQgdGhlIGN1cnNvciBpcyB2aXNpYmxlLgpleHBvcnQgZnVuY3Rpb24gbWF5YmVTY3JvbGxXaW5kb3coY20sIGNvb3JkcykgewogIGlmIChzaWduYWxET01FdmVudChjbSwgInNjcm9sbEN1cnNvckludG9WaWV3IikpIHJldHVybgoKICBsZXQgZGlzcGxheSA9IGNtLmRpc3BsYXksIGJveCA9IGRpc3BsYXkuc2l6ZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIGRvU2Nyb2xsID0gbnVsbAogIGlmIChjb29yZHMudG9wICsgYm94LnRvcCA8IDApIGRvU2Nyb2xsID0gdHJ1ZQogIGVsc2UgaWYgKGNvb3Jkcy5ib3R0b20gKyBib3gudG9wID4gKHdpbmRvdy5pbm5lckhlaWdodCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KSkgZG9TY3JvbGwgPSBmYWxzZQogIGlmIChkb1Njcm9sbCAhPSBudWxsICYmICFwaGFudG9tKSB7CiAgICBsZXQgc2Nyb2xsTm9kZSA9IGVsdCgiZGl2IiwgIlx1MjAwYiIsIG51bGwsIGBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgICAgICAgICAgICAgICAgICB0b3A6ICR7Y29vcmRzLnRvcCAtIGRpc3BsYXkudmlld09mZnNldCAtIHBhZGRpbmdUb3AoY20uZGlzcGxheSl9cHg7CiAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6ICR7Y29vcmRzLmJvdHRvbSAtIGNvb3Jkcy50b3AgKyBzY3JvbGxHYXAoY20pICsgZGlzcGxheS5iYXJIZWlnaHR9cHg7CiAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0OiAke2Nvb3Jkcy5sZWZ0fXB4OyB3aWR0aDogMnB4O2ApCiAgICBjbS5kaXNwbGF5LmxpbmVTcGFjZS5hcHBlbmRDaGlsZChzY3JvbGxOb2RlKQogICAgc2Nyb2xsTm9kZS5zY3JvbGxJbnRvVmlldyhkb1Njcm9sbCkKICAgIGNtLmRpc3BsYXkubGluZVNwYWNlLnJlbW92ZUNoaWxkKHNjcm9sbE5vZGUpCiAgfQp9CgovLyBTY3JvbGwgYSBnaXZlbiBwb3NpdGlvbiBpbnRvIHZpZXcgKGltbWVkaWF0ZWx5KSwgdmVyaWZ5aW5nIHRoYXQKLy8gaXQgYWN0dWFsbHkgYmVjYW1lIHZpc2libGUgKGFzIGxpbmUgaGVpZ2h0cyBhcmUgYWNjdXJhdGVseQovLyBtZWFzdXJlZCwgdGhlIHBvc2l0aW9uIG9mIHNvbWV0aGluZyBtYXkgJ2RyaWZ0JyBkdXJpbmcgZHJhd2luZykuCmV4cG9ydCBmdW5jdGlvbiBzY3JvbGxQb3NJbnRvVmlldyhjbSwgcG9zLCBlbmQsIG1hcmdpbikgewogIGlmIChtYXJnaW4gPT0gbnVsbCkgbWFyZ2luID0gMAogIGxldCBjb29yZHMKICBmb3IgKGxldCBsaW1pdCA9IDA7IGxpbWl0IDwgNTsgbGltaXQrKykgewogICAgbGV0IGNoYW5nZWQgPSBmYWxzZQogICAgY29vcmRzID0gY3Vyc29yQ29vcmRzKGNtLCBwb3MpCiAgICBsZXQgZW5kQ29vcmRzID0gIWVuZCB8fCBlbmQgPT0gcG9zID8gY29vcmRzIDogY3Vyc29yQ29vcmRzKGNtLCBlbmQpCiAgICBsZXQgc2Nyb2xsUG9zID0gY2FsY3VsYXRlU2Nyb2xsUG9zKGNtLCBNYXRoLm1pbihjb29yZHMubGVmdCwgZW5kQ29vcmRzLmxlZnQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLm1pbihjb29yZHMudG9wLCBlbmRDb29yZHMudG9wKSAtIG1hcmdpbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5tYXgoY29vcmRzLmxlZnQsIGVuZENvb3Jkcy5sZWZ0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5tYXgoY29vcmRzLmJvdHRvbSwgZW5kQ29vcmRzLmJvdHRvbSkgKyBtYXJnaW4pCiAgICBsZXQgc3RhcnRUb3AgPSBjbS5kb2Muc2Nyb2xsVG9wLCBzdGFydExlZnQgPSBjbS5kb2Muc2Nyb2xsTGVmdAogICAgaWYgKHNjcm9sbFBvcy5zY3JvbGxUb3AgIT0gbnVsbCkgewogICAgICBzZXRTY3JvbGxUb3AoY20sIHNjcm9sbFBvcy5zY3JvbGxUb3ApCiAgICAgIGlmIChNYXRoLmFicyhjbS5kb2Muc2Nyb2xsVG9wIC0gc3RhcnRUb3ApID4gMSkgY2hhbmdlZCA9IHRydWUKICAgIH0KICAgIGlmIChzY3JvbGxQb3Muc2Nyb2xsTGVmdCAhPSBudWxsKSB7CiAgICAgIHNldFNjcm9sbExlZnQoY20sIHNjcm9sbFBvcy5zY3JvbGxMZWZ0KQogICAgICBpZiAoTWF0aC5hYnMoY20uZG9jLnNjcm9sbExlZnQgLSBzdGFydExlZnQpID4gMSkgY2hhbmdlZCA9IHRydWUKICAgIH0KICAgIGlmICghY2hhbmdlZCkgYnJlYWsKICB9CiAgcmV0dXJuIGNvb3Jkcwp9CgovLyBTY3JvbGwgYSBnaXZlbiBzZXQgb2YgY29vcmRpbmF0ZXMgaW50byB2aWV3IChpbW1lZGlhdGVseSkuCmV4cG9ydCBmdW5jdGlvbiBzY3JvbGxJbnRvVmlldyhjbSwgeDEsIHkxLCB4MiwgeTIpIHsKICBsZXQgc2Nyb2xsUG9zID0gY2FsY3VsYXRlU2Nyb2xsUG9zKGNtLCB4MSwgeTEsIHgyLCB5MikKICBpZiAoc2Nyb2xsUG9zLnNjcm9sbFRvcCAhPSBudWxsKSBzZXRTY3JvbGxUb3AoY20sIHNjcm9sbFBvcy5zY3JvbGxUb3ApCiAgaWYgKHNjcm9sbFBvcy5zY3JvbGxMZWZ0ICE9IG51bGwpIHNldFNjcm9sbExlZnQoY20sIHNjcm9sbFBvcy5zY3JvbGxMZWZ0KQp9CgovLyBDYWxjdWxhdGUgYSBuZXcgc2Nyb2xsIHBvc2l0aW9uIG5lZWRlZCB0byBzY3JvbGwgdGhlIGdpdmVuCi8vIHJlY3RhbmdsZSBpbnRvIHZpZXcuIFJldHVybnMgYW4gb2JqZWN0IHdpdGggc2Nyb2xsVG9wIGFuZAovLyBzY3JvbGxMZWZ0IHByb3BlcnRpZXMuIFdoZW4gdGhlc2UgYXJlIHVuZGVmaW5lZCwgdGhlCi8vIHZlcnRpY2FsL2hvcml6b250YWwgcG9zaXRpb24gZG9lcyBub3QgbmVlZCB0byBiZSBhZGp1c3RlZC4KZXhwb3J0IGZ1bmN0aW9uIGNhbGN1bGF0ZVNjcm9sbFBvcyhjbSwgeDEsIHkxLCB4MiwgeTIpIHsKICBsZXQgZGlzcGxheSA9IGNtLmRpc3BsYXksIHNuYXBNYXJnaW4gPSB0ZXh0SGVpZ2h0KGNtLmRpc3BsYXkpCiAgaWYgKHkxIDwgMCkgeTEgPSAwCiAgbGV0IHNjcmVlbnRvcCA9IGNtLmN1ck9wICYmIGNtLmN1ck9wLnNjcm9sbFRvcCAhPSBudWxsID8gY20uY3VyT3Auc2Nyb2xsVG9wIDogZGlzcGxheS5zY3JvbGxlci5zY3JvbGxUb3AKICBsZXQgc2NyZWVuID0gZGlzcGxheUhlaWdodChjbSksIHJlc3VsdCA9IHt9CiAgaWYgKHkyIC0geTEgPiBzY3JlZW4pIHkyID0geTEgKyBzY3JlZW4KICBsZXQgZG9jQm90dG9tID0gY20uZG9jLmhlaWdodCArIHBhZGRpbmdWZXJ0KGRpc3BsYXkpCiAgbGV0IGF0VG9wID0geTEgPCBzbmFwTWFyZ2luLCBhdEJvdHRvbSA9IHkyID4gZG9jQm90dG9tIC0gc25hcE1hcmdpbgogIGlmICh5MSA8IHNjcmVlbnRvcCkgewogICAgcmVzdWx0LnNjcm9sbFRvcCA9IGF0VG9wID8gMCA6IHkxCiAgfSBlbHNlIGlmICh5MiA+IHNjcmVlbnRvcCArIHNjcmVlbikgewogICAgbGV0IG5ld1RvcCA9IE1hdGgubWluKHkxLCAoYXRCb3R0b20gPyBkb2NCb3R0b20gOiB5MikgLSBzY3JlZW4pCiAgICBpZiAobmV3VG9wICE9IHNjcmVlbnRvcCkgcmVzdWx0LnNjcm9sbFRvcCA9IG5ld1RvcAogIH0KCiAgbGV0IHNjcmVlbmxlZnQgPSBjbS5jdXJPcCAmJiBjbS5jdXJPcC5zY3JvbGxMZWZ0ICE9IG51bGwgPyBjbS5jdXJPcC5zY3JvbGxMZWZ0IDogZGlzcGxheS5zY3JvbGxlci5zY3JvbGxMZWZ0CiAgbGV0IHNjcmVlbncgPSBkaXNwbGF5V2lkdGgoY20pIC0gKGNtLm9wdGlvbnMuZml4ZWRHdXR0ZXIgPyBkaXNwbGF5Lmd1dHRlcnMub2Zmc2V0V2lkdGggOiAwKQogIGxldCB0b29XaWRlID0geDIgLSB4MSA+IHNjcmVlbncKICBpZiAodG9vV2lkZSkgeDIgPSB4MSArIHNjcmVlbncKICBpZiAoeDEgPCAxMCkKICAgIHJlc3VsdC5zY3JvbGxMZWZ0ID0gMAogIGVsc2UgaWYgKHgxIDwgc2NyZWVubGVmdCkKICAgIHJlc3VsdC5zY3JvbGxMZWZ0ID0gTWF0aC5tYXgoMCwgeDEgLSAodG9vV2lkZSA/IDAgOiAxMCkpCiAgZWxzZSBpZiAoeDIgPiBzY3JlZW53ICsgc2NyZWVubGVmdCAtIDMpCiAgICByZXN1bHQuc2Nyb2xsTGVmdCA9IHgyICsgKHRvb1dpZGUgPyAwIDogMTApIC0gc2NyZWVudwogIHJldHVybiByZXN1bHQKfQoKLy8gU3RvcmUgYSByZWxhdGl2ZSBhZGp1c3RtZW50IHRvIHRoZSBzY3JvbGwgcG9zaXRpb24gaW4gdGhlIGN1cnJlbnQKLy8gb3BlcmF0aW9uICh0byBiZSBhcHBsaWVkIHdoZW4gdGhlIG9wZXJhdGlvbiBmaW5pc2hlcykuCmV4cG9ydCBmdW5jdGlvbiBhZGRUb1Njcm9sbFBvcyhjbSwgbGVmdCwgdG9wKSB7CiAgaWYgKGxlZnQgIT0gbnVsbCB8fCB0b3AgIT0gbnVsbCkgcmVzb2x2ZVNjcm9sbFRvUG9zKGNtKQogIGlmIChsZWZ0ICE9IG51bGwpCiAgICBjbS5jdXJPcC5zY3JvbGxMZWZ0ID0gKGNtLmN1ck9wLnNjcm9sbExlZnQgPT0gbnVsbCA/IGNtLmRvYy5zY3JvbGxMZWZ0IDogY20uY3VyT3Auc2Nyb2xsTGVmdCkgKyBsZWZ0CiAgaWYgKHRvcCAhPSBudWxsKQogICAgY20uY3VyT3Auc2Nyb2xsVG9wID0gKGNtLmN1ck9wLnNjcm9sbFRvcCA9PSBudWxsID8gY20uZG9jLnNjcm9sbFRvcCA6IGNtLmN1ck9wLnNjcm9sbFRvcCkgKyB0b3AKfQoKLy8gTWFrZSBzdXJlIHRoYXQgYXQgdGhlIGVuZCBvZiB0aGUgb3BlcmF0aW9uIHRoZSBjdXJyZW50IGN1cnNvciBpcwovLyBzaG93bi4KZXhwb3J0IGZ1bmN0aW9uIGVuc3VyZUN1cnNvclZpc2libGUoY20pIHsKICByZXNvbHZlU2Nyb2xsVG9Qb3MoY20pCiAgbGV0IGN1ciA9IGNtLmdldEN1cnNvcigpLCBmcm9tID0gY3VyLCB0byA9IGN1cgogIGlmICghY20ub3B0aW9ucy5saW5lV3JhcHBpbmcpIHsKICAgIGZyb20gPSBjdXIuY2ggPyBQb3MoY3VyLmxpbmUsIGN1ci5jaCAtIDEpIDogY3VyCiAgICB0byA9IFBvcyhjdXIubGluZSwgY3VyLmNoICsgMSkKICB9CiAgY20uY3VyT3Auc2Nyb2xsVG9Qb3MgPSB7ZnJvbTogZnJvbSwgdG86IHRvLCBtYXJnaW46IGNtLm9wdGlvbnMuY3Vyc29yU2Nyb2xsTWFyZ2luLCBpc0N1cnNvcjogdHJ1ZX0KfQoKLy8gV2hlbiBhbiBvcGVyYXRpb24gaGFzIGl0cyBzY3JvbGxUb1BvcyBwcm9wZXJ0eSBzZXQsIGFuZCBhbm90aGVyCi8vIHNjcm9sbCBhY3Rpb24gaXMgYXBwbGllZCBiZWZvcmUgdGhlIGVuZCBvZiB0aGUgb3BlcmF0aW9uLCB0aGlzCi8vICdzaW11bGF0ZXMnIHNjcm9sbGluZyB0aGF0IHBvc2l0aW9uIGludG8gdmlldyBpbiBhIGNoZWFwIHdheSwgc28KLy8gdGhhdCB0aGUgZWZmZWN0IG9mIGludGVybWVkaWF0ZSBzY3JvbGwgY29tbWFuZHMgaXMgbm90IGlnbm9yZWQuCmV4cG9ydCBmdW5jdGlvbiByZXNvbHZlU2Nyb2xsVG9Qb3MoY20pIHsKICBsZXQgcmFuZ2UgPSBjbS5jdXJPcC5zY3JvbGxUb1BvcwogIGlmIChyYW5nZSkgewogICAgY20uY3VyT3Auc2Nyb2xsVG9Qb3MgPSBudWxsCiAgICBsZXQgZnJvbSA9IGVzdGltYXRlQ29vcmRzKGNtLCByYW5nZS5mcm9tKSwgdG8gPSBlc3RpbWF0ZUNvb3JkcyhjbSwgcmFuZ2UudG8pCiAgICBsZXQgc1BvcyA9IGNhbGN1bGF0ZVNjcm9sbFBvcyhjbSwgTWF0aC5taW4oZnJvbS5sZWZ0LCB0by5sZWZ0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGgubWluKGZyb20udG9wLCB0by50b3ApIC0gcmFuZ2UubWFyZ2luLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5tYXgoZnJvbS5yaWdodCwgdG8ucmlnaHQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5tYXgoZnJvbS5ib3R0b20sIHRvLmJvdHRvbSkgKyByYW5nZS5tYXJnaW4pCiAgICBjbS5zY3JvbGxUbyhzUG9zLnNjcm9sbExlZnQsIHNQb3Muc2Nyb2xsVG9wKQogIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/src/display/scroll_events.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aW1wb3J0IHsgY2hyb21lLCBnZWNrbywgaWUsIG1hYywgcHJlc3RvLCBzYWZhcmksIHdlYmtpdCB9IGZyb20gIi4uL3V0aWwvYnJvd3NlciIKaW1wb3J0IHsgZV9wcmV2ZW50RGVmYXVsdCB9IGZyb20gIi4uL3V0aWwvZXZlbnQiCgppbXBvcnQgeyBzdGFydFdvcmtlciB9IGZyb20gIi4vaGlnaGxpZ2h0X3dvcmtlciIKaW1wb3J0IHsgYWxpZ25Ib3Jpem9udGFsbHkgfSBmcm9tICIuL2xpbmVfbnVtYmVycyIKaW1wb3J0IHsgdXBkYXRlRGlzcGxheVNpbXBsZX0gZnJvbSAiLi91cGRhdGVfZGlzcGxheSIKCi8vIFN5bmMgdGhlIHNjcm9sbGFibGUgYXJlYSBhbmQgc2Nyb2xsYmFycywgZW5zdXJlIHRoZSB2aWV3cG9ydAovLyBjb3ZlcnMgdGhlIHZpc2libGUgYXJlYS4KZXhwb3J0IGZ1bmN0aW9uIHNldFNjcm9sbFRvcChjbSwgdmFsKSB7CiAgaWYgKE1hdGguYWJzKGNtLmRvYy5zY3JvbGxUb3AgLSB2YWwpIDwgMikgcmV0dXJuCiAgY20uZG9jLnNjcm9sbFRvcCA9IHZhbAogIGlmICghZ2Vja28pIHVwZGF0ZURpc3BsYXlTaW1wbGUoY20sIHt0b3A6IHZhbH0pCiAgaWYgKGNtLmRpc3BsYXkuc2Nyb2xsZXIuc2Nyb2xsVG9wICE9IHZhbCkgY20uZGlzcGxheS5zY3JvbGxlci5zY3JvbGxUb3AgPSB2YWwKICBjbS5kaXNwbGF5LnNjcm9sbGJhcnMuc2V0U2Nyb2xsVG9wKHZhbCkKICBpZiAoZ2Vja28pIHVwZGF0ZURpc3BsYXlTaW1wbGUoY20pCiAgc3RhcnRXb3JrZXIoY20sIDEwMCkKfQovLyBTeW5jIHNjcm9sbGVyIGFuZCBzY3JvbGxiYXIsIGVuc3VyZSB0aGUgZ3V0dGVyIGVsZW1lbnRzIGFyZQovLyBhbGlnbmVkLgpleHBvcnQgZnVuY3Rpb24gc2V0U2Nyb2xsTGVmdChjbSwgdmFsLCBpc1Njcm9sbGVyKSB7CiAgaWYgKGlzU2Nyb2xsZXIgPyB2YWwgPT0gY20uZG9jLnNjcm9sbExlZnQgOiBNYXRoLmFicyhjbS5kb2Muc2Nyb2xsTGVmdCAtIHZhbCkgPCAyKSByZXR1cm4KICB2YWwgPSBNYXRoLm1pbih2YWwsIGNtLmRpc3BsYXkuc2Nyb2xsZXIuc2Nyb2xsV2lkdGggLSBjbS5kaXNwbGF5LnNjcm9sbGVyLmNsaWVudFdpZHRoKQogIGNtLmRvYy5zY3JvbGxMZWZ0ID0gdmFsCiAgYWxpZ25Ib3Jpem9udGFsbHkoY20pCiAgaWYgKGNtLmRpc3BsYXkuc2Nyb2xsZXIuc2Nyb2xsTGVmdCAhPSB2YWwpIGNtLmRpc3BsYXkuc2Nyb2xsZXIuc2Nyb2xsTGVmdCA9IHZhbAogIGNtLmRpc3BsYXkuc2Nyb2xsYmFycy5zZXRTY3JvbGxMZWZ0KHZhbCkKfQoKLy8gU2luY2UgdGhlIGRlbHRhIHZhbHVlcyByZXBvcnRlZCBvbiBtb3VzZSB3aGVlbCBldmVudHMgYXJlCi8vIHVuc3RhbmRhcmRpemVkIGJldHdlZW4gYnJvd3NlcnMgYW5kIGV2ZW4gYnJvd3NlciB2ZXJzaW9ucywgYW5kCi8vIGdlbmVyYWxseSBob3JyaWJseSB1bnByZWRpY3RhYmxlLCB0aGlzIGNvZGUgc3RhcnRzIGJ5IG1lYXN1cmluZwovLyB0aGUgc2Nyb2xsIGVmZmVjdCB0aGF0IHRoZSBmaXJzdCBmZXcgbW91c2Ugd2hlZWwgZXZlbnRzIGhhdmUsCi8vIGFuZCwgZnJvbSB0aGF0LCBkZXRlY3RzIHRoZSB3YXkgaXQgY2FuIGNvbnZlcnQgZGVsdGFzIHRvIHBpeGVsCi8vIG9mZnNldHMgYWZ0ZXJ3YXJkcy4KLy8KLy8gVGhlIHJlYXNvbiB3ZSB3YW50IHRvIGtub3cgdGhlIGFtb3VudCBhIHdoZWVsIGV2ZW50IHdpbGwgc2Nyb2xsCi8vIGlzIHRoYXQgaXQgZ2l2ZXMgdXMgYSBjaGFuY2UgdG8gdXBkYXRlIHRoZSBkaXNwbGF5IGJlZm9yZSB0aGUKLy8gYWN0dWFsIHNjcm9sbGluZyBoYXBwZW5zLCByZWR1Y2luZyBmbGlja2VyaW5nLgoKbGV0IHdoZWVsU2FtcGxlcyA9IDAsIHdoZWVsUGl4ZWxzUGVyVW5pdCA9IG51bGwKLy8gRmlsbCBpbiBhIGJyb3dzZXItZGV0ZWN0ZWQgc3RhcnRpbmcgdmFsdWUgb24gYnJvd3NlcnMgd2hlcmUgd2UKLy8ga25vdyBvbmUuIFRoZXNlIGRvbid0IGhhdmUgdG8gYmUgYWNjdXJhdGUgLS0gdGhlIHJlc3VsdCBvZiB0aGVtCi8vIGJlaW5nIHdyb25nIHdvdWxkIGp1c3QgYmUgYSBzbGlnaHQgZmxpY2tlciBvbiB0aGUgZmlyc3Qgd2hlZWwKLy8gc2Nyb2xsIChpZiBpdCBpcyBsYXJnZSBlbm91Z2gpLgppZiAoaWUpIHdoZWVsUGl4ZWxzUGVyVW5pdCA9IC0uNTMKZWxzZSBpZiAoZ2Vja28pIHdoZWVsUGl4ZWxzUGVyVW5pdCA9IDE1CmVsc2UgaWYgKGNocm9tZSkgd2hlZWxQaXhlbHNQZXJVbml0ID0gLS43CmVsc2UgaWYgKHNhZmFyaSkgd2hlZWxQaXhlbHNQZXJVbml0ID0gLTEvMwoKZnVuY3Rpb24gd2hlZWxFdmVudERlbHRhKGUpIHsKICBsZXQgZHggPSBlLndoZWVsRGVsdGFYLCBkeSA9IGUud2hlZWxEZWx0YVkKICBpZiAoZHggPT0gbnVsbCAmJiBlLmRldGFpbCAmJiBlLmF4aXMgPT0gZS5IT1JJWk9OVEFMX0FYSVMpIGR4ID0gZS5kZXRhaWwKICBpZiAoZHkgPT0gbnVsbCAmJiBlLmRldGFpbCAmJiBlLmF4aXMgPT0gZS5WRVJUSUNBTF9BWElTKSBkeSA9IGUuZGV0YWlsCiAgZWxzZSBpZiAoZHkgPT0gbnVsbCkgZHkgPSBlLndoZWVsRGVsdGEKICByZXR1cm4ge3g6IGR4LCB5OiBkeX0KfQpleHBvcnQgZnVuY3Rpb24gd2hlZWxFdmVudFBpeGVscyhlKSB7CiAgbGV0IGRlbHRhID0gd2hlZWxFdmVudERlbHRhKGUpCiAgZGVsdGEueCAqPSB3aGVlbFBpeGVsc1BlclVuaXQKICBkZWx0YS55ICo9IHdoZWVsUGl4ZWxzUGVyVW5pdAogIHJldHVybiBkZWx0YQp9CgpleHBvcnQgZnVuY3Rpb24gb25TY3JvbGxXaGVlbChjbSwgZSkgewogIGxldCBkZWx0YSA9IHdoZWVsRXZlbnREZWx0YShlKSwgZHggPSBkZWx0YS54LCBkeSA9IGRlbHRhLnkKCiAgbGV0IGRpc3BsYXkgPSBjbS5kaXNwbGF5LCBzY3JvbGwgPSBkaXNwbGF5LnNjcm9sbGVyCiAgLy8gUXVpdCBpZiB0aGVyZSdzIG5vdGhpbmcgdG8gc2Nyb2xsIGhlcmUKICBsZXQgY2FuU2Nyb2xsWCA9IHNjcm9sbC5zY3JvbGxXaWR0aCA+IHNjcm9sbC5jbGllbnRXaWR0aAogIGxldCBjYW5TY3JvbGxZID0gc2Nyb2xsLnNjcm9sbEhlaWdodCA+IHNjcm9sbC5jbGllbnRIZWlnaHQKICBpZiAoIShkeCAmJiBjYW5TY3JvbGxYIHx8IGR5ICYmIGNhblNjcm9sbFkpKSByZXR1cm4KCiAgLy8gV2Via2l0IGJyb3dzZXJzIG9uIE9TIFggYWJvcnQgbW9tZW50dW0gc2Nyb2xscyB3aGVuIHRoZSB0YXJnZXQKICAvLyBvZiB0aGUgc2Nyb2xsIGV2ZW50IGlzIHJlbW92ZWQgZnJvbSB0aGUgc2Nyb2xsYWJsZSBlbGVtZW50LgogIC8vIFRoaXMgaGFjayAoc2VlIHJlbGF0ZWQgY29kZSBpbiBwYXRjaERpc3BsYXkpIG1ha2VzIHN1cmUgdGhlCiAgLy8gZWxlbWVudCBpcyBrZXB0IGFyb3VuZC4KICBpZiAoZHkgJiYgbWFjICYmIHdlYmtpdCkgewogICAgb3V0ZXI6IGZvciAobGV0IGN1ciA9IGUudGFyZ2V0LCB2aWV3ID0gZGlzcGxheS52aWV3OyBjdXIgIT0gc2Nyb2xsOyBjdXIgPSBjdXIucGFyZW50Tm9kZSkgewogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZpZXcubGVuZ3RoOyBpKyspIHsKICAgICAgICBpZiAodmlld1tpXS5ub2RlID09IGN1cikgewogICAgICAgICAgY20uZGlzcGxheS5jdXJyZW50V2hlZWxUYXJnZXQgPSBjdXIKICAgICAgICAgIGJyZWFrIG91dGVyCiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKICAvLyBPbiBzb21lIGJyb3dzZXJzLCBob3Jpem9udGFsIHNjcm9sbGluZyB3aWxsIGNhdXNlIHJlZHJhd3MgdG8KICAvLyBoYXBwZW4gYmVmb3JlIHRoZSBndXR0ZXIgaGFzIGJlZW4gcmVhbGlnbmVkLCBjYXVzaW5nIGl0IHRvCiAgLy8gd3JpZ2dsZSBhcm91bmQgaW4gYSBtb3N0IHVuc2VlbWx5IHdheS4gV2hlbiB3ZSBoYXZlIGFuCiAgLy8gZXN0aW1hdGVkIHBpeGVscy9kZWx0YSB2YWx1ZSwgd2UganVzdCBoYW5kbGUgaG9yaXpvbnRhbAogIC8vIHNjcm9sbGluZyBlbnRpcmVseSBoZXJlLiBJdCdsbCBiZSBzbGlnaHRseSBvZmYgZnJvbSBuYXRpdmUsIGJ1dAogIC8vIGJldHRlciB0aGFuIGdsaXRjaGluZyBvdXQuCiAgaWYgKGR4ICYmICFnZWNrbyAmJiAhcHJlc3RvICYmIHdoZWVsUGl4ZWxzUGVyVW5pdCAhPSBudWxsKSB7CiAgICBpZiAoZHkgJiYgY2FuU2Nyb2xsWSkKICAgICAgc2V0U2Nyb2xsVG9wKGNtLCBNYXRoLm1heCgwLCBNYXRoLm1pbihzY3JvbGwuc2Nyb2xsVG9wICsgZHkgKiB3aGVlbFBpeGVsc1BlclVuaXQsIHNjcm9sbC5zY3JvbGxIZWlnaHQgLSBzY3JvbGwuY2xpZW50SGVpZ2h0KSkpCiAgICBzZXRTY3JvbGxMZWZ0KGNtLCBNYXRoLm1heCgwLCBNYXRoLm1pbihzY3JvbGwuc2Nyb2xsTGVmdCArIGR4ICogd2hlZWxQaXhlbHNQZXJVbml0LCBzY3JvbGwuc2Nyb2xsV2lkdGggLSBzY3JvbGwuY2xpZW50V2lkdGgpKSkKICAgIC8vIE9ubHkgcHJldmVudCBkZWZhdWx0IHNjcm9sbGluZyBpZiB2ZXJ0aWNhbCBzY3JvbGxpbmcgaXMKICAgIC8vIGFjdHVhbGx5IHBvc3NpYmxlLiBPdGhlcndpc2UsIGl0IGNhdXNlcyB2ZXJ0aWNhbCBzY3JvbGwKICAgIC8vIGppdHRlciBvbiBPU1ggdHJhY2twYWRzIHdoZW4gZGVsdGFYIGlzIHNtYWxsIGFuZCBkZWx0YVkKICAgIC8vIGlzIGxhcmdlIChpc3N1ZSAjMzU3OSkKICAgIGlmICghZHkgfHwgKGR5ICYmIGNhblNjcm9sbFkpKQogICAgICBlX3ByZXZlbnREZWZhdWx0KGUpCiAgICBkaXNwbGF5LndoZWVsU3RhcnRYID0gbnVsbCAvLyBBYm9ydCBtZWFzdXJlbWVudCwgaWYgaW4gcHJvZ3Jlc3MKICAgIHJldHVybgogIH0KCiAgLy8gJ1Byb2plY3QnIHRoZSB2aXNpYmxlIHZpZXdwb3J0IHRvIGNvdmVyIHRoZSBhcmVhIHRoYXQgaXMgYmVpbmcKICAvLyBzY3JvbGxlZCBpbnRvIHZpZXcgKGlmIHdlIGtub3cgZW5vdWdoIHRvIGVzdGltYXRlIGl0KS4KICBpZiAoZHkgJiYgd2hlZWxQaXhlbHNQZXJVbml0ICE9IG51bGwpIHsKICAgIGxldCBwaXhlbHMgPSBkeSAqIHdoZWVsUGl4ZWxzUGVyVW5pdAogICAgbGV0IHRvcCA9IGNtLmRvYy5zY3JvbGxUb3AsIGJvdCA9IHRvcCArIGRpc3BsYXkud3JhcHBlci5jbGllbnRIZWlnaHQKICAgIGlmIChwaXhlbHMgPCAwKSB0b3AgPSBNYXRoLm1heCgwLCB0b3AgKyBwaXhlbHMgLSA1MCkKICAgIGVsc2UgYm90ID0gTWF0aC5taW4oY20uZG9jLmhlaWdodCwgYm90ICsgcGl4ZWxzICsgNTApCiAgICB1cGRhdGVEaXNwbGF5U2ltcGxlKGNtLCB7dG9wOiB0b3AsIGJvdHRvbTogYm90fSkKICB9CgogIGlmICh3aGVlbFNhbXBsZXMgPCAyMCkgewogICAgaWYgKGRpc3BsYXkud2hlZWxTdGFydFggPT0gbnVsbCkgewogICAgICBkaXNwbGF5LndoZWVsU3RhcnRYID0gc2Nyb2xsLnNjcm9sbExlZnQ7IGRpc3BsYXkud2hlZWxTdGFydFkgPSBzY3JvbGwuc2Nyb2xsVG9wCiAgICAgIGRpc3BsYXkud2hlZWxEWCA9IGR4OyBkaXNwbGF5LndoZWVsRFkgPSBkeQogICAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICBpZiAoZGlzcGxheS53aGVlbFN0YXJ0WCA9PSBudWxsKSByZXR1cm4KICAgICAgICBsZXQgbW92ZWRYID0gc2Nyb2xsLnNjcm9sbExlZnQgLSBkaXNwbGF5LndoZWVsU3RhcnRYCiAgICAgICAgbGV0IG1vdmVkWSA9IHNjcm9sbC5zY3JvbGxUb3AgLSBkaXNwbGF5LndoZWVsU3RhcnRZCiAgICAgICAgbGV0IHNhbXBsZSA9IChtb3ZlZFkgJiYgZGlzcGxheS53aGVlbERZICYmIG1vdmVkWSAvIGRpc3BsYXkud2hlZWxEWSkgfHwKICAgICAgICAgIChtb3ZlZFggJiYgZGlzcGxheS53aGVlbERYICYmIG1vdmVkWCAvIGRpc3BsYXkud2hlZWxEWCkKICAgICAgICBkaXNwbGF5LndoZWVsU3RhcnRYID0gZGlzcGxheS53aGVlbFN0YXJ0WSA9IG51bGwKICAgICAgICBpZiAoIXNhbXBsZSkgcmV0dXJuCiAgICAgICAgd2hlZWxQaXhlbHNQZXJVbml0ID0gKHdoZWVsUGl4ZWxzUGVyVW5pdCAqIHdoZWVsU2FtcGxlcyArIHNhbXBsZSkgLyAod2hlZWxTYW1wbGVzICsgMSkKICAgICAgICArK3doZWVsU2FtcGxlcwogICAgICB9LCAyMDApCiAgICB9IGVsc2UgewogICAgICBkaXNwbGF5LndoZWVsRFggKz0gZHg7IGRpc3BsYXkud2hlZWxEWSArPSBkeQogICAgfQogIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/src/display/selection.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aW1wb3J0IHsgUG9zIH0gZnJvbSAiLi4vbGluZS9wb3MiCmltcG9ydCB7IHZpc3VhbExpbmUgfSBmcm9tICIuLi9saW5lL3NwYW5zIgppbXBvcnQgeyBnZXRMaW5lIH0gZnJvbSAiLi4vbGluZS91dGlsc19saW5lIgppbXBvcnQgeyBjaGFyQ29vcmRzLCBjdXJzb3JDb29yZHMsIGRpc3BsYXlXaWR0aCwgcGFkZGluZ0ggfSBmcm9tICIuLi9tZWFzdXJlbWVudC9wb3NpdGlvbl9tZWFzdXJlbWVudCIKaW1wb3J0IHsgZ2V0T3JkZXIsIGl0ZXJhdGVCaWRpU2VjdGlvbnMgfSBmcm9tICIuLi91dGlsL2JpZGkiCmltcG9ydCB7IGVsdCB9IGZyb20gIi4uL3V0aWwvZG9tIgoKZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVNlbGVjdGlvbihjbSkgewogIGNtLmRpc3BsYXkuaW5wdXQuc2hvd1NlbGVjdGlvbihjbS5kaXNwbGF5LmlucHV0LnByZXBhcmVTZWxlY3Rpb24oKSkKfQoKZXhwb3J0IGZ1bmN0aW9uIHByZXBhcmVTZWxlY3Rpb24oY20sIHByaW1hcnkpIHsKICBsZXQgZG9jID0gY20uZG9jLCByZXN1bHQgPSB7fQogIGxldCBjdXJGcmFnbWVudCA9IHJlc3VsdC5jdXJzb3JzID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpCiAgbGV0IHNlbEZyYWdtZW50ID0gcmVzdWx0LnNlbGVjdGlvbiA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKQoKICBmb3IgKGxldCBpID0gMDsgaSA8IGRvYy5zZWwucmFuZ2VzLmxlbmd0aDsgaSsrKSB7CiAgICBpZiAocHJpbWFyeSA9PT0gZmFsc2UgJiYgaSA9PSBkb2Muc2VsLnByaW1JbmRleCkgY29udGludWUKICAgIGxldCByYW5nZSA9IGRvYy5zZWwucmFuZ2VzW2ldCiAgICBpZiAocmFuZ2UuZnJvbSgpLmxpbmUgPj0gY20uZGlzcGxheS52aWV3VG8gfHwgcmFuZ2UudG8oKS5saW5lIDwgY20uZGlzcGxheS52aWV3RnJvbSkgY29udGludWUKICAgIGxldCBjb2xsYXBzZWQgPSByYW5nZS5lbXB0eSgpCiAgICBpZiAoY29sbGFwc2VkIHx8IGNtLm9wdGlvbnMuc2hvd0N1cnNvcldoZW5TZWxlY3RpbmcpCiAgICAgIGRyYXdTZWxlY3Rpb25DdXJzb3IoY20sIHJhbmdlLmhlYWQsIGN1ckZyYWdtZW50KQogICAgaWYgKCFjb2xsYXBzZWQpCiAgICAgIGRyYXdTZWxlY3Rpb25SYW5nZShjbSwgcmFuZ2UsIHNlbEZyYWdtZW50KQogIH0KICByZXR1cm4gcmVzdWx0Cn0KCi8vIERyYXdzIGEgY3Vyc29yIGZvciB0aGUgZ2l2ZW4gcmFuZ2UKZXhwb3J0IGZ1bmN0aW9uIGRyYXdTZWxlY3Rpb25DdXJzb3IoY20sIGhlYWQsIG91dHB1dCkgewogIGxldCBwb3MgPSBjdXJzb3JDb29yZHMoY20sIGhlYWQsICJkaXYiLCBudWxsLCBudWxsLCAhY20ub3B0aW9ucy5zaW5nbGVDdXJzb3JIZWlnaHRQZXJMaW5lKQoKICBsZXQgY3Vyc29yID0gb3V0cHV0LmFwcGVuZENoaWxkKGVsdCgiZGl2IiwgIlx1MDBhMCIsICJDb2RlTWlycm9yLWN1cnNvciIpKQogIGN1cnNvci5zdHlsZS5sZWZ0ID0gcG9zLmxlZnQgKyAicHgiCiAgY3Vyc29yLnN0eWxlLnRvcCA9IHBvcy50b3AgKyAicHgiCiAgY3Vyc29yLnN0eWxlLmhlaWdodCA9IE1hdGgubWF4KDAsIHBvcy5ib3R0b20gLSBwb3MudG9wKSAqIGNtLm9wdGlvbnMuY3Vyc29ySGVpZ2h0ICsgInB4IgoKICBpZiAocG9zLm90aGVyKSB7CiAgICAvLyBTZWNvbmRhcnkgY3Vyc29yLCBzaG93biB3aGVuIG9uIGEgJ2p1bXAnIGluIGJpLWRpcmVjdGlvbmFsIHRleHQKICAgIGxldCBvdGhlckN1cnNvciA9IG91dHB1dC5hcHBlbmRDaGlsZChlbHQoImRpdiIsICJcdTAwYTAiLCAiQ29kZU1pcnJvci1jdXJzb3IgQ29kZU1pcnJvci1zZWNvbmRhcnljdXJzb3IiKSkKICAgIG90aGVyQ3Vyc29yLnN0eWxlLmRpc3BsYXkgPSAiIgogICAgb3RoZXJDdXJzb3Iuc3R5bGUubGVmdCA9IHBvcy5vdGhlci5sZWZ0ICsgInB4IgogICAgb3RoZXJDdXJzb3Iuc3R5bGUudG9wID0gcG9zLm90aGVyLnRvcCArICJweCIKICAgIG90aGVyQ3Vyc29yLnN0eWxlLmhlaWdodCA9IChwb3Mub3RoZXIuYm90dG9tIC0gcG9zLm90aGVyLnRvcCkgKiAuODUgKyAicHgiCiAgfQp9CgovLyBEcmF3cyB0aGUgZ2l2ZW4gcmFuZ2UgYXMgYSBoaWdobGlnaHRlZCBzZWxlY3Rpb24KZnVuY3Rpb24gZHJhd1NlbGVjdGlvblJhbmdlKGNtLCByYW5nZSwgb3V0cHV0KSB7CiAgbGV0IGRpc3BsYXkgPSBjbS5kaXNwbGF5LCBkb2MgPSBjbS5kb2MKICBsZXQgZnJhZ21lbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkKICBsZXQgcGFkZGluZyA9IHBhZGRpbmdIKGNtLmRpc3BsYXkpLCBsZWZ0U2lkZSA9IHBhZGRpbmcubGVmdAogIGxldCByaWdodFNpZGUgPSBNYXRoLm1heChkaXNwbGF5LnNpemVyV2lkdGgsIGRpc3BsYXlXaWR0aChjbSkgLSBkaXNwbGF5LnNpemVyLm9mZnNldExlZnQpIC0gcGFkZGluZy5yaWdodAoKICBmdW5jdGlvbiBhZGQobGVmdCwgdG9wLCB3aWR0aCwgYm90dG9tKSB7CiAgICBpZiAodG9wIDwgMCkgdG9wID0gMAogICAgdG9wID0gTWF0aC5yb3VuZCh0b3ApCiAgICBib3R0b20gPSBNYXRoLnJvdW5kKGJvdHRvbSkKICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKGVsdCgiZGl2IiwgbnVsbCwgIkNvZGVNaXJyb3Itc2VsZWN0ZWQiLCBgcG9zaXRpb246IGFic29sdXRlOyBsZWZ0OiAke2xlZnR9cHg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wOiAke3RvcH1weDsgd2lkdGg6ICR7d2lkdGggPT0gbnVsbCA/IHJpZ2h0U2lkZSAtIGxlZnQgOiB3aWR0aH1weDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6ICR7Ym90dG9tIC0gdG9wfXB4YCkpCiAgfQoKICBmdW5jdGlvbiBkcmF3Rm9yTGluZShsaW5lLCBmcm9tQXJnLCB0b0FyZykgewogICAgbGV0IGxpbmVPYmogPSBnZXRMaW5lKGRvYywgbGluZSkKICAgIGxldCBsaW5lTGVuID0gbGluZU9iai50ZXh0Lmxlbmd0aAogICAgbGV0IHN0YXJ0LCBlbmQKICAgIGZ1bmN0aW9uIGNvb3JkcyhjaCwgYmlhcykgewogICAgICByZXR1cm4gY2hhckNvb3JkcyhjbSwgUG9zKGxpbmUsIGNoKSwgImRpdiIsIGxpbmVPYmosIGJpYXMpCiAgICB9CgogICAgaXRlcmF0ZUJpZGlTZWN0aW9ucyhnZXRPcmRlcihsaW5lT2JqKSwgZnJvbUFyZyB8fCAwLCB0b0FyZyA9PSBudWxsID8gbGluZUxlbiA6IHRvQXJnLCAoZnJvbSwgdG8sIGRpcikgPT4gewogICAgICBsZXQgbGVmdFBvcyA9IGNvb3Jkcyhmcm9tLCAibGVmdCIpLCByaWdodFBvcywgbGVmdCwgcmlnaHQKICAgICAgaWYgKGZyb20gPT0gdG8pIHsKICAgICAgICByaWdodFBvcyA9IGxlZnRQb3MKICAgICAgICBsZWZ0ID0gcmlnaHQgPSBsZWZ0UG9zLmxlZnQKICAgICAgfSBlbHNlIHsKICAgICAgICByaWdodFBvcyA9IGNvb3Jkcyh0byAtIDEsICJyaWdodCIpCiAgICAgICAgaWYgKGRpciA9PSAicnRsIikgeyBsZXQgdG1wID0gbGVmdFBvczsgbGVmdFBvcyA9IHJpZ2h0UG9zOyByaWdodFBvcyA9IHRtcCB9CiAgICAgICAgbGVmdCA9IGxlZnRQb3MubGVmdAogICAgICAgIHJpZ2h0ID0gcmlnaHRQb3MucmlnaHQKICAgICAgfQogICAgICBpZiAoZnJvbUFyZyA9PSBudWxsICYmIGZyb20gPT0gMCkgbGVmdCA9IGxlZnRTaWRlCiAgICAgIGlmIChyaWdodFBvcy50b3AgLSBsZWZ0UG9zLnRvcCA+IDMpIHsgLy8gRGlmZmVyZW50IGxpbmVzLCBkcmF3IHRvcCBwYXJ0CiAgICAgICAgYWRkKGxlZnQsIGxlZnRQb3MudG9wLCBudWxsLCBsZWZ0UG9zLmJvdHRvbSkKICAgICAgICBsZWZ0ID0gbGVmdFNpZGUKICAgICAgICBpZiAobGVmdFBvcy5ib3R0b20gPCByaWdodFBvcy50b3ApIGFkZChsZWZ0LCBsZWZ0UG9zLmJvdHRvbSwgbnVsbCwgcmlnaHRQb3MudG9wKQogICAgICB9CiAgICAgIGlmICh0b0FyZyA9PSBudWxsICYmIHRvID09IGxpbmVMZW4pIHJpZ2h0ID0gcmlnaHRTaWRlCiAgICAgIGlmICghc3RhcnQgfHwgbGVmdFBvcy50b3AgPCBzdGFydC50b3AgfHwgbGVmdFBvcy50b3AgPT0gc3RhcnQudG9wICYmIGxlZnRQb3MubGVmdCA8IHN0YXJ0LmxlZnQpCiAgICAgICAgc3RhcnQgPSBsZWZ0UG9zCiAgICAgIGlmICghZW5kIHx8IHJpZ2h0UG9zLmJvdHRvbSA+IGVuZC5ib3R0b20gfHwgcmlnaHRQb3MuYm90dG9tID09IGVuZC5ib3R0b20gJiYgcmlnaHRQb3MucmlnaHQgPiBlbmQucmlnaHQpCiAgICAgICAgZW5kID0gcmlnaHRQb3MKICAgICAgaWYgKGxlZnQgPCBsZWZ0U2lkZSArIDEpIGxlZnQgPSBsZWZ0U2lkZQogICAgICBhZGQobGVmdCwgcmlnaHRQb3MudG9wLCByaWdodCAtIGxlZnQsIHJpZ2h0UG9zLmJvdHRvbSkKICAgIH0pCiAgICByZXR1cm4ge3N0YXJ0OiBzdGFydCwgZW5kOiBlbmR9CiAgfQoKICBsZXQgc0Zyb20gPSByYW5nZS5mcm9tKCksIHNUbyA9IHJhbmdlLnRvKCkKICBpZiAoc0Zyb20ubGluZSA9PSBzVG8ubGluZSkgewogICAgZHJhd0ZvckxpbmUoc0Zyb20ubGluZSwgc0Zyb20uY2gsIHNUby5jaCkKICB9IGVsc2UgewogICAgbGV0IGZyb21MaW5lID0gZ2V0TGluZShkb2MsIHNGcm9tLmxpbmUpLCB0b0xpbmUgPSBnZXRMaW5lKGRvYywgc1RvLmxpbmUpCiAgICBsZXQgc2luZ2xlVkxpbmUgPSB2aXN1YWxMaW5lKGZyb21MaW5lKSA9PSB2aXN1YWxMaW5lKHRvTGluZSkKICAgIGxldCBsZWZ0RW5kID0gZHJhd0ZvckxpbmUoc0Zyb20ubGluZSwgc0Zyb20uY2gsIHNpbmdsZVZMaW5lID8gZnJvbUxpbmUudGV4dC5sZW5ndGggKyAxIDogbnVsbCkuZW5kCiAgICBsZXQgcmlnaHRTdGFydCA9IGRyYXdGb3JMaW5lKHNUby5saW5lLCBzaW5nbGVWTGluZSA/IDAgOiBudWxsLCBzVG8uY2gpLnN0YXJ0CiAgICBpZiAoc2luZ2xlVkxpbmUpIHsKICAgICAgaWYgKGxlZnRFbmQudG9wIDwgcmlnaHRTdGFydC50b3AgLSAyKSB7CiAgICAgICAgYWRkKGxlZnRFbmQucmlnaHQsIGxlZnRFbmQudG9wLCBudWxsLCBsZWZ0RW5kLmJvdHRvbSkKICAgICAgICBhZGQobGVmdFNpZGUsIHJpZ2h0U3RhcnQudG9wLCByaWdodFN0YXJ0LmxlZnQsIHJpZ2h0U3RhcnQuYm90dG9tKQogICAgICB9IGVsc2UgewogICAgICAgIGFkZChsZWZ0RW5kLnJpZ2h0LCBsZWZ0RW5kLnRvcCwgcmlnaHRTdGFydC5sZWZ0IC0gbGVmdEVuZC5yaWdodCwgbGVmdEVuZC5ib3R0b20pCiAgICAgIH0KICAgIH0KICAgIGlmIChsZWZ0RW5kLmJvdHRvbSA8IHJpZ2h0U3RhcnQudG9wKQogICAgICBhZGQobGVmdFNpZGUsIGxlZnRFbmQuYm90dG9tLCBudWxsLCByaWdodFN0YXJ0LnRvcCkKICB9CgogIG91dHB1dC5hcHBlbmRDaGlsZChmcmFnbWVudCkKfQoKLy8gQ3Vyc29yLWJsaW5raW5nCmV4cG9ydCBmdW5jdGlvbiByZXN0YXJ0QmxpbmsoY20pIHsKICBpZiAoIWNtLnN0YXRlLmZvY3VzZWQpIHJldHVybgogIGxldCBkaXNwbGF5ID0gY20uZGlzcGxheQogIGNsZWFySW50ZXJ2YWwoZGlzcGxheS5ibGlua2VyKQogIGxldCBvbiA9IHRydWUKICBkaXNwbGF5LmN1cnNvckRpdi5zdHlsZS52aXNpYmlsaXR5ID0gIiIKICBpZiAoY20ub3B0aW9ucy5jdXJzb3JCbGlua1JhdGUgPiAwKQogICAgZGlzcGxheS5ibGlua2VyID0gc2V0SW50ZXJ2YWwoKCkgPT4gZGlzcGxheS5jdXJzb3JEaXYuc3R5bGUudmlzaWJpbGl0eSA9IChvbiA9ICFvbikgPyAiIiA6ICJoaWRkZW4iLAogICAgICBjbS5vcHRpb25zLmN1cnNvckJsaW5rUmF0ZSkKICBlbHNlIGlmIChjbS5vcHRpb25zLmN1cnNvckJsaW5rUmF0ZSA8IDApCiAgICBkaXNwbGF5LmN1cnNvckRpdi5zdHlsZS52aXNpYmlsaXR5ID0gImhpZGRlbiIKfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/src/display/update_display.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aW1wb3J0IHsgc2F3Q29sbGFwc2VkU3BhbnMgfSBmcm9tICIuLi9saW5lL3Nhd19zcGVjaWFsX3NwYW5zIgppbXBvcnQgeyBoZWlnaHRBdExpbmUsIHZpc3VhbExpbmVFbmRObywgdmlzdWFsTGluZU5vIH0gZnJvbSAiLi4vbGluZS9zcGFucyIKaW1wb3J0IHsgZ2V0TGluZSwgbGluZU51bWJlckZvciB9IGZyb20gIi4uL2xpbmUvdXRpbHNfbGluZSIKaW1wb3J0IHsgZGlzcGxheUhlaWdodCwgZGlzcGxheVdpZHRoLCBnZXREaW1lbnNpb25zLCBwYWRkaW5nVmVydCwgc2Nyb2xsR2FwIH0gZnJvbSAiLi4vbWVhc3VyZW1lbnQvcG9zaXRpb25fbWVhc3VyZW1lbnQiCmltcG9ydCB7IG1hYywgd2Via2l0IH0gZnJvbSAiLi4vdXRpbC9icm93c2VyIgppbXBvcnQgeyBhY3RpdmVFbHQsIHJlbW92ZUNoaWxkcmVuIH0gZnJvbSAiLi4vdXRpbC9kb20iCmltcG9ydCB7IGhhc0hhbmRsZXIsIHNpZ25hbCB9IGZyb20gIi4uL3V0aWwvZXZlbnQiCmltcG9ydCB7IGluZGV4T2YgfSBmcm9tICIuLi91dGlsL21pc2MiCgppbXBvcnQgeyBidWlsZExpbmVFbGVtZW50LCB1cGRhdGVMaW5lRm9yQ2hhbmdlcyB9IGZyb20gIi4vdXBkYXRlX2xpbmUiCmltcG9ydCB7IHN0YXJ0V29ya2VyIH0gZnJvbSAiLi9oaWdobGlnaHRfd29ya2VyIgppbXBvcnQgeyBtYXliZVVwZGF0ZUxpbmVOdW1iZXJXaWR0aCB9IGZyb20gIi4vbGluZV9udW1iZXJzIgppbXBvcnQgeyBtZWFzdXJlRm9yU2Nyb2xsYmFycywgdXBkYXRlU2Nyb2xsYmFycyB9IGZyb20gIi4vc2Nyb2xsYmFycyIKaW1wb3J0IHsgdXBkYXRlU2VsZWN0aW9uIH0gZnJvbSAiLi9zZWxlY3Rpb24iCmltcG9ydCB7IHVwZGF0ZUhlaWdodHNJblZpZXdwb3J0LCB2aXNpYmxlTGluZXMgfSBmcm9tICIuL3VwZGF0ZV9saW5lcyIKaW1wb3J0IHsgYWRqdXN0VmlldywgY291bnREaXJ0eVZpZXcsIHJlc2V0VmlldyB9IGZyb20gIi4vdmlld190cmFja2luZyIKCi8vIERJU1BMQVkgRFJBV0lORwoKZXhwb3J0IGZ1bmN0aW9uIERpc3BsYXlVcGRhdGUoY20sIHZpZXdwb3J0LCBmb3JjZSkgewogIGxldCBkaXNwbGF5ID0gY20uZGlzcGxheQoKICB0aGlzLnZpZXdwb3J0ID0gdmlld3BvcnQKICAvLyBTdG9yZSBzb21lIHZhbHVlcyB0aGF0IHdlJ2xsIG5lZWQgbGF0ZXIgKGJ1dCBkb24ndCB3YW50IHRvIGZvcmNlIGEgcmVsYXlvdXQgZm9yKQogIHRoaXMudmlzaWJsZSA9IHZpc2libGVMaW5lcyhkaXNwbGF5LCBjbS5kb2MsIHZpZXdwb3J0KQogIHRoaXMuZWRpdG9ySXNIaWRkZW4gPSAhZGlzcGxheS53cmFwcGVyLm9mZnNldFdpZHRoCiAgdGhpcy53cmFwcGVySGVpZ2h0ID0gZGlzcGxheS53cmFwcGVyLmNsaWVudEhlaWdodAogIHRoaXMud3JhcHBlcldpZHRoID0gZGlzcGxheS53cmFwcGVyLmNsaWVudFdpZHRoCiAgdGhpcy5vbGREaXNwbGF5V2lkdGggPSBkaXNwbGF5V2lkdGgoY20pCiAgdGhpcy5mb3JjZSA9IGZvcmNlCiAgdGhpcy5kaW1zID0gZ2V0RGltZW5zaW9ucyhjbSkKICB0aGlzLmV2ZW50cyA9IFtdCn0KCkRpc3BsYXlVcGRhdGUucHJvdG90eXBlLnNpZ25hbCA9IGZ1bmN0aW9uKGVtaXR0ZXIsIHR5cGUpIHsKICBpZiAoaGFzSGFuZGxlcihlbWl0dGVyLCB0eXBlKSkKICAgIHRoaXMuZXZlbnRzLnB1c2goYXJndW1lbnRzKQp9CkRpc3BsYXlVcGRhdGUucHJvdG90eXBlLmZpbmlzaCA9IGZ1bmN0aW9uKCkgewogIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5ldmVudHMubGVuZ3RoOyBpKyspCiAgICBzaWduYWwuYXBwbHkobnVsbCwgdGhpcy5ldmVudHNbaV0pCn0KCmV4cG9ydCBmdW5jdGlvbiBtYXliZUNsaXBTY3JvbGxiYXJzKGNtKSB7CiAgbGV0IGRpc3BsYXkgPSBjbS5kaXNwbGF5CiAgaWYgKCFkaXNwbGF5LnNjcm9sbGJhcnNDbGlwcGVkICYmIGRpc3BsYXkuc2Nyb2xsZXIub2Zmc2V0V2lkdGgpIHsKICAgIGRpc3BsYXkubmF0aXZlQmFyV2lkdGggPSBkaXNwbGF5LnNjcm9sbGVyLm9mZnNldFdpZHRoIC0gZGlzcGxheS5zY3JvbGxlci5jbGllbnRXaWR0aAogICAgZGlzcGxheS5oZWlnaHRGb3JjZXIuc3R5bGUuaGVpZ2h0ID0gc2Nyb2xsR2FwKGNtKSArICJweCIKICAgIGRpc3BsYXkuc2l6ZXIuc3R5bGUubWFyZ2luQm90dG9tID0gLWRpc3BsYXkubmF0aXZlQmFyV2lkdGggKyAicHgiCiAgICBkaXNwbGF5LnNpemVyLnN0eWxlLmJvcmRlclJpZ2h0V2lkdGggPSBzY3JvbGxHYXAoY20pICsgInB4IgogICAgZGlzcGxheS5zY3JvbGxiYXJzQ2xpcHBlZCA9IHRydWUKICB9Cn0KCi8vIERvZXMgdGhlIGFjdHVhbCB1cGRhdGluZyBvZiB0aGUgbGluZSBkaXNwbGF5LiBCYWlscyBvdXQKLy8gKHJldHVybmluZyBmYWxzZSkgd2hlbiB0aGVyZSBpcyBub3RoaW5nIHRvIGJlIGRvbmUgYW5kIGZvcmNlZCBpcwovLyBmYWxzZS4KZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZURpc3BsYXlJZk5lZWRlZChjbSwgdXBkYXRlKSB7CiAgbGV0IGRpc3BsYXkgPSBjbS5kaXNwbGF5LCBkb2MgPSBjbS5kb2MKCiAgaWYgKHVwZGF0ZS5lZGl0b3JJc0hpZGRlbikgewogICAgcmVzZXRWaWV3KGNtKQogICAgcmV0dXJuIGZhbHNlCiAgfQoKICAvLyBCYWlsIG91dCBpZiB0aGUgdmlzaWJsZSBhcmVhIGlzIGFscmVhZHkgcmVuZGVyZWQgYW5kIG5vdGhpbmcgY2hhbmdlZC4KICBpZiAoIXVwZGF0ZS5mb3JjZSAmJgogICAgICB1cGRhdGUudmlzaWJsZS5mcm9tID49IGRpc3BsYXkudmlld0Zyb20gJiYgdXBkYXRlLnZpc2libGUudG8gPD0gZGlzcGxheS52aWV3VG8gJiYKICAgICAgKGRpc3BsYXkudXBkYXRlTGluZU51bWJlcnMgPT0gbnVsbCB8fCBkaXNwbGF5LnVwZGF0ZUxpbmVOdW1iZXJzID49IGRpc3BsYXkudmlld1RvKSAmJgogICAgICBkaXNwbGF5LnJlbmRlcmVkVmlldyA9PSBkaXNwbGF5LnZpZXcgJiYgY291bnREaXJ0eVZpZXcoY20pID09IDApCiAgICByZXR1cm4gZmFsc2UKCiAgaWYgKG1heWJlVXBkYXRlTGluZU51bWJlcldpZHRoKGNtKSkgewogICAgcmVzZXRWaWV3KGNtKQogICAgdXBkYXRlLmRpbXMgPSBnZXREaW1lbnNpb25zKGNtKQogIH0KCiAgLy8gQ29tcHV0ZSBhIHN1aXRhYmxlIG5ldyB2aWV3cG9ydCAoZnJvbSAmIHRvKQogIGxldCBlbmQgPSBkb2MuZmlyc3QgKyBkb2Muc2l6ZQogIGxldCBmcm9tID0gTWF0aC5tYXgodXBkYXRlLnZpc2libGUuZnJvbSAtIGNtLm9wdGlvbnMudmlld3BvcnRNYXJnaW4sIGRvYy5maXJzdCkKICBsZXQgdG8gPSBNYXRoLm1pbihlbmQsIHVwZGF0ZS52aXNpYmxlLnRvICsgY20ub3B0aW9ucy52aWV3cG9ydE1hcmdpbikKICBpZiAoZGlzcGxheS52aWV3RnJvbSA8IGZyb20gJiYgZnJvbSAtIGRpc3BsYXkudmlld0Zyb20gPCAyMCkgZnJvbSA9IE1hdGgubWF4KGRvYy5maXJzdCwgZGlzcGxheS52aWV3RnJvbSkKICBpZiAoZGlzcGxheS52aWV3VG8gPiB0byAmJiBkaXNwbGF5LnZpZXdUbyAtIHRvIDwgMjApIHRvID0gTWF0aC5taW4oZW5kLCBkaXNwbGF5LnZpZXdUbykKICBpZiAoc2F3Q29sbGFwc2VkU3BhbnMpIHsKICAgIGZyb20gPSB2aXN1YWxMaW5lTm8oY20uZG9jLCBmcm9tKQogICAgdG8gPSB2aXN1YWxMaW5lRW5kTm8oY20uZG9jLCB0bykKICB9CgogIGxldCBkaWZmZXJlbnQgPSBmcm9tICE9IGRpc3BsYXkudmlld0Zyb20gfHwgdG8gIT0gZGlzcGxheS52aWV3VG8gfHwKICAgIGRpc3BsYXkubGFzdFdyYXBIZWlnaHQgIT0gdXBkYXRlLndyYXBwZXJIZWlnaHQgfHwgZGlzcGxheS5sYXN0V3JhcFdpZHRoICE9IHVwZGF0ZS53cmFwcGVyV2lkdGgKICBhZGp1c3RWaWV3KGNtLCBmcm9tLCB0bykKCiAgZGlzcGxheS52aWV3T2Zmc2V0ID0gaGVpZ2h0QXRMaW5lKGdldExpbmUoY20uZG9jLCBkaXNwbGF5LnZpZXdGcm9tKSkKICAvLyBQb3NpdGlvbiB0aGUgbW92ZXIgZGl2IHRvIGFsaWduIHdpdGggdGhlIGN1cnJlbnQgc2Nyb2xsIHBvc2l0aW9uCiAgY20uZGlzcGxheS5tb3Zlci5zdHlsZS50b3AgPSBkaXNwbGF5LnZpZXdPZmZzZXQgKyAicHgiCgogIGxldCB0b1VwZGF0ZSA9IGNvdW50RGlydHlWaWV3KGNtKQogIGlmICghZGlmZmVyZW50ICYmIHRvVXBkYXRlID09IDAgJiYgIXVwZGF0ZS5mb3JjZSAmJiBkaXNwbGF5LnJlbmRlcmVkVmlldyA9PSBkaXNwbGF5LnZpZXcgJiYKICAgICAgKGRpc3BsYXkudXBkYXRlTGluZU51bWJlcnMgPT0gbnVsbCB8fCBkaXNwbGF5LnVwZGF0ZUxpbmVOdW1iZXJzID49IGRpc3BsYXkudmlld1RvKSkKICAgIHJldHVybiBmYWxzZQoKICAvLyBGb3IgYmlnIGNoYW5nZXMsIHdlIGhpZGUgdGhlIGVuY2xvc2luZyBlbGVtZW50IGR1cmluZyB0aGUKICAvLyB1cGRhdGUsIHNpbmNlIHRoYXQgc3BlZWRzIHVwIHRoZSBvcGVyYXRpb25zIG9uIG1vc3QgYnJvd3NlcnMuCiAgbGV0IGZvY3VzZWQgPSBhY3RpdmVFbHQoKQogIGlmICh0b1VwZGF0ZSA+IDQpIGRpc3BsYXkubGluZURpdi5zdHlsZS5kaXNwbGF5ID0gIm5vbmUiCiAgcGF0Y2hEaXNwbGF5KGNtLCBkaXNwbGF5LnVwZGF0ZUxpbmVOdW1iZXJzLCB1cGRhdGUuZGltcykKICBpZiAodG9VcGRhdGUgPiA0KSBkaXNwbGF5LmxpbmVEaXYuc3R5bGUuZGlzcGxheSA9ICIiCiAgZGlzcGxheS5yZW5kZXJlZFZpZXcgPSBkaXNwbGF5LnZpZXcKICAvLyBUaGVyZSBtaWdodCBoYXZlIGJlZW4gYSB3aWRnZXQgd2l0aCBhIGZvY3VzZWQgZWxlbWVudCB0aGF0IGdvdAogIC8vIGhpZGRlbiBvciB1cGRhdGVkLCBpZiBzbyByZS1mb2N1cyBpdC4KICBpZiAoZm9jdXNlZCAmJiBhY3RpdmVFbHQoKSAhPSBmb2N1c2VkICYmIGZvY3VzZWQub2Zmc2V0SGVpZ2h0KSBmb2N1c2VkLmZvY3VzKCkKCiAgLy8gUHJldmVudCBzZWxlY3Rpb24gYW5kIGN1cnNvcnMgZnJvbSBpbnRlcmZlcmluZyB3aXRoIHRoZSBzY3JvbGwKICAvLyB3aWR0aCBhbmQgaGVpZ2h0LgogIHJlbW92ZUNoaWxkcmVuKGRpc3BsYXkuY3Vyc29yRGl2KQogIHJlbW92ZUNoaWxkcmVuKGRpc3BsYXkuc2VsZWN0aW9uRGl2KQogIGRpc3BsYXkuZ3V0dGVycy5zdHlsZS5oZWlnaHQgPSBkaXNwbGF5LnNpemVyLnN0eWxlLm1pbkhlaWdodCA9IDAKCiAgaWYgKGRpZmZlcmVudCkgewogICAgZGlzcGxheS5sYXN0V3JhcEhlaWdodCA9IHVwZGF0ZS53cmFwcGVySGVpZ2h0CiAgICBkaXNwbGF5Lmxhc3RXcmFwV2lkdGggPSB1cGRhdGUud3JhcHBlcldpZHRoCiAgICBzdGFydFdvcmtlcihjbSwgNDAwKQogIH0KCiAgZGlzcGxheS51cGRhdGVMaW5lTnVtYmVycyA9IG51bGwKCiAgcmV0dXJuIHRydWUKfQoKZXhwb3J0IGZ1bmN0aW9uIHBvc3RVcGRhdGVEaXNwbGF5KGNtLCB1cGRhdGUpIHsKICBsZXQgdmlld3BvcnQgPSB1cGRhdGUudmlld3BvcnQKCiAgZm9yIChsZXQgZmlyc3QgPSB0cnVlOzsgZmlyc3QgPSBmYWxzZSkgewogICAgaWYgKCFmaXJzdCB8fCAhY20ub3B0aW9ucy5saW5lV3JhcHBpbmcgfHwgdXBkYXRlLm9sZERpc3BsYXlXaWR0aCA9PSBkaXNwbGF5V2lkdGgoY20pKSB7CiAgICAgIC8vIENsaXAgZm9yY2VkIHZpZXdwb3J0IHRvIGFjdHVhbCBzY3JvbGxhYmxlIGFyZWEuCiAgICAgIGlmICh2aWV3cG9ydCAmJiB2aWV3cG9ydC50b3AgIT0gbnVsbCkKICAgICAgICB2aWV3cG9ydCA9IHt0b3A6IE1hdGgubWluKGNtLmRvYy5oZWlnaHQgKyBwYWRkaW5nVmVydChjbS5kaXNwbGF5KSAtIGRpc3BsYXlIZWlnaHQoY20pLCB2aWV3cG9ydC50b3ApfQogICAgICAvLyBVcGRhdGVkIGxpbmUgaGVpZ2h0cyBtaWdodCByZXN1bHQgaW4gdGhlIGRyYXduIGFyZWEgbm90CiAgICAgIC8vIGFjdHVhbGx5IGNvdmVyaW5nIHRoZSB2aWV3cG9ydC4gS2VlcCBsb29waW5nIHVudGlsIGl0IGRvZXMuCiAgICAgIHVwZGF0ZS52aXNpYmxlID0gdmlzaWJsZUxpbmVzKGNtLmRpc3BsYXksIGNtLmRvYywgdmlld3BvcnQpCiAgICAgIGlmICh1cGRhdGUudmlzaWJsZS5mcm9tID49IGNtLmRpc3BsYXkudmlld0Zyb20gJiYgdXBkYXRlLnZpc2libGUudG8gPD0gY20uZGlzcGxheS52aWV3VG8pCiAgICAgICAgYnJlYWsKICAgIH0KICAgIGlmICghdXBkYXRlRGlzcGxheUlmTmVlZGVkKGNtLCB1cGRhdGUpKSBicmVhawogICAgdXBkYXRlSGVpZ2h0c0luVmlld3BvcnQoY20pCiAgICBsZXQgYmFyTWVhc3VyZSA9IG1lYXN1cmVGb3JTY3JvbGxiYXJzKGNtKQogICAgdXBkYXRlU2VsZWN0aW9uKGNtKQogICAgdXBkYXRlU2Nyb2xsYmFycyhjbSwgYmFyTWVhc3VyZSkKICAgIHNldERvY3VtZW50SGVpZ2h0KGNtLCBiYXJNZWFzdXJlKQogIH0KCiAgdXBkYXRlLnNpZ25hbChjbSwgInVwZGF0ZSIsIGNtKQogIGlmIChjbS5kaXNwbGF5LnZpZXdGcm9tICE9IGNtLmRpc3BsYXkucmVwb3J0ZWRWaWV3RnJvbSB8fCBjbS5kaXNwbGF5LnZpZXdUbyAhPSBjbS5kaXNwbGF5LnJlcG9ydGVkVmlld1RvKSB7CiAgICB1cGRhdGUuc2lnbmFsKGNtLCAidmlld3BvcnRDaGFuZ2UiLCBjbSwgY20uZGlzcGxheS52aWV3RnJvbSwgY20uZGlzcGxheS52aWV3VG8pCiAgICBjbS5kaXNwbGF5LnJlcG9ydGVkVmlld0Zyb20gPSBjbS5kaXNwbGF5LnZpZXdGcm9tOyBjbS5kaXNwbGF5LnJlcG9ydGVkVmlld1RvID0gY20uZGlzcGxheS52aWV3VG8KICB9Cn0KCmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVEaXNwbGF5U2ltcGxlKGNtLCB2aWV3cG9ydCkgewogIGxldCB1cGRhdGUgPSBuZXcgRGlzcGxheVVwZGF0ZShjbSwgdmlld3BvcnQpCiAgaWYgKHVwZGF0ZURpc3BsYXlJZk5lZWRlZChjbSwgdXBkYXRlKSkgewogICAgdXBkYXRlSGVpZ2h0c0luVmlld3BvcnQoY20pCiAgICBwb3N0VXBkYXRlRGlzcGxheShjbSwgdXBkYXRlKQogICAgbGV0IGJhck1lYXN1cmUgPSBtZWFzdXJlRm9yU2Nyb2xsYmFycyhjbSkKICAgIHVwZGF0ZVNlbGVjdGlvbihjbSkKICAgIHVwZGF0ZVNjcm9sbGJhcnMoY20sIGJhck1lYXN1cmUpCiAgICBzZXREb2N1bWVudEhlaWdodChjbSwgYmFyTWVhc3VyZSkKICAgIHVwZGF0ZS5maW5pc2goKQogIH0KfQoKLy8gU3luYyB0aGUgYWN0dWFsIGRpc3BsYXkgRE9NIHN0cnVjdHVyZSB3aXRoIGRpc3BsYXkudmlldywgcmVtb3ZpbmcKLy8gbm9kZXMgZm9yIGxpbmVzIHRoYXQgYXJlIG5vIGxvbmdlciBpbiB2aWV3LCBhbmQgY3JlYXRpbmcgdGhlIG9uZXMKLy8gdGhhdCBhcmUgbm90IHRoZXJlIHlldCwgYW5kIHVwZGF0aW5nIHRoZSBvbmVzIHRoYXQgYXJlIG91dCBvZgovLyBkYXRlLgpmdW5jdGlvbiBwYXRjaERpc3BsYXkoY20sIHVwZGF0ZU51bWJlcnNGcm9tLCBkaW1zKSB7CiAgbGV0IGRpc3BsYXkgPSBjbS5kaXNwbGF5LCBsaW5lTnVtYmVycyA9IGNtLm9wdGlvbnMubGluZU51bWJlcnMKICBsZXQgY29udGFpbmVyID0gZGlzcGxheS5saW5lRGl2LCBjdXIgPSBjb250YWluZXIuZmlyc3RDaGlsZAoKICBmdW5jdGlvbiBybShub2RlKSB7CiAgICBsZXQgbmV4dCA9IG5vZGUubmV4dFNpYmxpbmcKICAgIC8vIFdvcmtzIGFyb3VuZCBhIHRocm93LXNjcm9sbCBidWcgaW4gT1MgWCBXZWJraXQKICAgIGlmICh3ZWJraXQgJiYgbWFjICYmIGNtLmRpc3BsYXkuY3VycmVudFdoZWVsVGFyZ2V0ID09IG5vZGUpCiAgICAgIG5vZGUuc3R5bGUuZGlzcGxheSA9ICJub25lIgogICAgZWxzZQogICAgICBub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobm9kZSkKICAgIHJldHVybiBuZXh0CiAgfQoKICBsZXQgdmlldyA9IGRpc3BsYXkudmlldywgbGluZU4gPSBkaXNwbGF5LnZpZXdGcm9tCiAgLy8gTG9vcCBvdmVyIHRoZSBlbGVtZW50cyBpbiB0aGUgdmlldywgc3luY2luZyBjdXIgKHRoZSBET00gbm9kZXMKICAvLyBpbiBkaXNwbGF5LmxpbmVEaXYpIHdpdGggdGhlIHZpZXcgYXMgd2UgZ28uCiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2aWV3Lmxlbmd0aDsgaSsrKSB7CiAgICBsZXQgbGluZVZpZXcgPSB2aWV3W2ldCiAgICBpZiAobGluZVZpZXcuaGlkZGVuKSB7CiAgICB9IGVsc2UgaWYgKCFsaW5lVmlldy5ub2RlIHx8IGxpbmVWaWV3Lm5vZGUucGFyZW50Tm9kZSAhPSBjb250YWluZXIpIHsgLy8gTm90IGRyYXduIHlldAogICAgICBsZXQgbm9kZSA9IGJ1aWxkTGluZUVsZW1lbnQoY20sIGxpbmVWaWV3LCBsaW5lTiwgZGltcykKICAgICAgY29udGFpbmVyLmluc2VydEJlZm9yZShub2RlLCBjdXIpCiAgICB9IGVsc2UgeyAvLyBBbHJlYWR5IGRyYXduCiAgICAgIHdoaWxlIChjdXIgIT0gbGluZVZpZXcubm9kZSkgY3VyID0gcm0oY3VyKQogICAgICBsZXQgdXBkYXRlTnVtYmVyID0gbGluZU51bWJlcnMgJiYgdXBkYXRlTnVtYmVyc0Zyb20gIT0gbnVsbCAmJgogICAgICAgIHVwZGF0ZU51bWJlcnNGcm9tIDw9IGxpbmVOICYmIGxpbmVWaWV3LmxpbmVOdW1iZXIKICAgICAgaWYgKGxpbmVWaWV3LmNoYW5nZXMpIHsKICAgICAgICBpZiAoaW5kZXhPZihsaW5lVmlldy5jaGFuZ2VzLCAiZ3V0dGVyIikgPiAtMSkgdXBkYXRlTnVtYmVyID0gZmFsc2UKICAgICAgICB1cGRhdGVMaW5lRm9yQ2hhbmdlcyhjbSwgbGluZVZpZXcsIGxpbmVOLCBkaW1zKQogICAgICB9CiAgICAgIGlmICh1cGRhdGVOdW1iZXIpIHsKICAgICAgICByZW1vdmVDaGlsZHJlbihsaW5lVmlldy5saW5lTnVtYmVyKQogICAgICAgIGxpbmVWaWV3LmxpbmVOdW1iZXIuYXBwZW5kQ2hpbGQoZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUobGluZU51bWJlckZvcihjbS5vcHRpb25zLCBsaW5lTikpKQogICAgICB9CiAgICAgIGN1ciA9IGxpbmVWaWV3Lm5vZGUubmV4dFNpYmxpbmcKICAgIH0KICAgIGxpbmVOICs9IGxpbmVWaWV3LnNpemUKICB9CiAgd2hpbGUgKGN1cikgY3VyID0gcm0oY3VyKQp9CgpleHBvcnQgZnVuY3Rpb24gdXBkYXRlR3V0dGVyU3BhY2UoY20pIHsKICBsZXQgd2lkdGggPSBjbS5kaXNwbGF5Lmd1dHRlcnMub2Zmc2V0V2lkdGgKICBjbS5kaXNwbGF5LnNpemVyLnN0eWxlLm1hcmdpbkxlZnQgPSB3aWR0aCArICJweCIKfQoKZXhwb3J0IGZ1bmN0aW9uIHNldERvY3VtZW50SGVpZ2h0KGNtLCBtZWFzdXJlKSB7CiAgY20uZGlzcGxheS5zaXplci5zdHlsZS5taW5IZWlnaHQgPSBtZWFzdXJlLmRvY0hlaWdodCArICJweCIKICBjbS5kaXNwbGF5LmhlaWdodEZvcmNlci5zdHlsZS50b3AgPSBtZWFzdXJlLmRvY0hlaWdodCArICJweCIKICBjbS5kaXNwbGF5Lmd1dHRlcnMuc3R5bGUuaGVpZ2h0ID0gKG1lYXN1cmUuZG9jSGVpZ2h0ICsgY20uZGlzcGxheS5iYXJIZWlnaHQgKyBzY3JvbGxHYXAoY20pKSArICJweCIKfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/src/display/update_line.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aW1wb3J0IHsgYnVpbGRMaW5lQ29udGVudCB9IGZyb20gIi4uL2xpbmUvbGluZV9kYXRhIgppbXBvcnQgeyBsaW5lTnVtYmVyRm9yIH0gZnJvbSAiLi4vbGluZS91dGlsc19saW5lIgppbXBvcnQgeyBpZSwgaWVfdmVyc2lvbiB9IGZyb20gIi4uL3V0aWwvYnJvd3NlciIKaW1wb3J0IHsgZWx0IH0gZnJvbSAiLi4vdXRpbC9kb20iCmltcG9ydCB7IHNpZ25hbExhdGVyIH0gZnJvbSAiLi4vdXRpbC9vcGVyYXRpb25fZ3JvdXAiCgovLyBXaGVuIGFuIGFzcGVjdCBvZiBhIGxpbmUgY2hhbmdlcywgYSBzdHJpbmcgaXMgYWRkZWQgdG8KLy8gbGluZVZpZXcuY2hhbmdlcy4gVGhpcyB1cGRhdGVzIHRoZSByZWxldmFudCBwYXJ0IG9mIHRoZSBsaW5lJ3MKLy8gRE9NIHN0cnVjdHVyZS4KZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUxpbmVGb3JDaGFuZ2VzKGNtLCBsaW5lVmlldywgbGluZU4sIGRpbXMpIHsKICBmb3IgKGxldCBqID0gMDsgaiA8IGxpbmVWaWV3LmNoYW5nZXMubGVuZ3RoOyBqKyspIHsKICAgIGxldCB0eXBlID0gbGluZVZpZXcuY2hhbmdlc1tqXQogICAgaWYgKHR5cGUgPT0gInRleHQiKSB1cGRhdGVMaW5lVGV4dChjbSwgbGluZVZpZXcpCiAgICBlbHNlIGlmICh0eXBlID09ICJndXR0ZXIiKSB1cGRhdGVMaW5lR3V0dGVyKGNtLCBsaW5lVmlldywgbGluZU4sIGRpbXMpCiAgICBlbHNlIGlmICh0eXBlID09ICJjbGFzcyIpIHVwZGF0ZUxpbmVDbGFzc2VzKGxpbmVWaWV3KQogICAgZWxzZSBpZiAodHlwZSA9PSAid2lkZ2V0IikgdXBkYXRlTGluZVdpZGdldHMoY20sIGxpbmVWaWV3LCBkaW1zKQogIH0KICBsaW5lVmlldy5jaGFuZ2VzID0gbnVsbAp9CgovLyBMaW5lcyB3aXRoIGd1dHRlciBlbGVtZW50cywgd2lkZ2V0cyBvciBhIGJhY2tncm91bmQgY2xhc3MgbmVlZCB0bwovLyBiZSB3cmFwcGVkLCBhbmQgaGF2ZSB0aGUgZXh0cmEgZWxlbWVudHMgYWRkZWQgdG8gdGhlIHdyYXBwZXIgZGl2CmZ1bmN0aW9uIGVuc3VyZUxpbmVXcmFwcGVkKGxpbmVWaWV3KSB7CiAgaWYgKGxpbmVWaWV3Lm5vZGUgPT0gbGluZVZpZXcudGV4dCkgewogICAgbGluZVZpZXcubm9kZSA9IGVsdCgiZGl2IiwgbnVsbCwgbnVsbCwgInBvc2l0aW9uOiByZWxhdGl2ZSIpCiAgICBpZiAobGluZVZpZXcudGV4dC5wYXJlbnROb2RlKQogICAgICBsaW5lVmlldy50ZXh0LnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGxpbmVWaWV3Lm5vZGUsIGxpbmVWaWV3LnRleHQpCiAgICBsaW5lVmlldy5ub2RlLmFwcGVuZENoaWxkKGxpbmVWaWV3LnRleHQpCiAgICBpZiAoaWUgJiYgaWVfdmVyc2lvbiA8IDgpIGxpbmVWaWV3Lm5vZGUuc3R5bGUuekluZGV4ID0gMgogIH0KICByZXR1cm4gbGluZVZpZXcubm9kZQp9CgpmdW5jdGlvbiB1cGRhdGVMaW5lQmFja2dyb3VuZChsaW5lVmlldykgewogIGxldCBjbHMgPSBsaW5lVmlldy5iZ0NsYXNzID8gbGluZVZpZXcuYmdDbGFzcyArICIgIiArIChsaW5lVmlldy5saW5lLmJnQ2xhc3MgfHwgIiIpIDogbGluZVZpZXcubGluZS5iZ0NsYXNzCiAgaWYgKGNscykgY2xzICs9ICIgQ29kZU1pcnJvci1saW5lYmFja2dyb3VuZCIKICBpZiAobGluZVZpZXcuYmFja2dyb3VuZCkgewogICAgaWYgKGNscykgbGluZVZpZXcuYmFja2dyb3VuZC5jbGFzc05hbWUgPSBjbHMKICAgIGVsc2UgeyBsaW5lVmlldy5iYWNrZ3JvdW5kLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobGluZVZpZXcuYmFja2dyb3VuZCk7IGxpbmVWaWV3LmJhY2tncm91bmQgPSBudWxsIH0KICB9IGVsc2UgaWYgKGNscykgewogICAgbGV0IHdyYXAgPSBlbnN1cmVMaW5lV3JhcHBlZChsaW5lVmlldykKICAgIGxpbmVWaWV3LmJhY2tncm91bmQgPSB3cmFwLmluc2VydEJlZm9yZShlbHQoImRpdiIsIG51bGwsIGNscyksIHdyYXAuZmlyc3RDaGlsZCkKICB9Cn0KCi8vIFdyYXBwZXIgYXJvdW5kIGJ1aWxkTGluZUNvbnRlbnQgd2hpY2ggd2lsbCByZXVzZSB0aGUgc3RydWN0dXJlCi8vIGluIGRpc3BsYXkuZXh0ZXJuYWxNZWFzdXJlZCB3aGVuIHBvc3NpYmxlLgpmdW5jdGlvbiBnZXRMaW5lQ29udGVudChjbSwgbGluZVZpZXcpIHsKICBsZXQgZXh0ID0gY20uZGlzcGxheS5leHRlcm5hbE1lYXN1cmVkCiAgaWYgKGV4dCAmJiBleHQubGluZSA9PSBsaW5lVmlldy5saW5lKSB7CiAgICBjbS5kaXNwbGF5LmV4dGVybmFsTWVhc3VyZWQgPSBudWxsCiAgICBsaW5lVmlldy5tZWFzdXJlID0gZXh0Lm1lYXN1cmUKICAgIHJldHVybiBleHQuYnVpbHQKICB9CiAgcmV0dXJuIGJ1aWxkTGluZUNvbnRlbnQoY20sIGxpbmVWaWV3KQp9CgovLyBSZWRyYXcgdGhlIGxpbmUncyB0ZXh0LiBJbnRlcmFjdHMgd2l0aCB0aGUgYmFja2dyb3VuZCBhbmQgdGV4dAovLyBjbGFzc2VzIGJlY2F1c2UgdGhlIG1vZGUgbWF5IG91dHB1dCB0b2tlbnMgdGhhdCBpbmZsdWVuY2UgdGhlc2UKLy8gY2xhc3Nlcy4KZnVuY3Rpb24gdXBkYXRlTGluZVRleHQoY20sIGxpbmVWaWV3KSB7CiAgbGV0IGNscyA9IGxpbmVWaWV3LnRleHQuY2xhc3NOYW1lCiAgbGV0IGJ1aWx0ID0gZ2V0TGluZUNvbnRlbnQoY20sIGxpbmVWaWV3KQogIGlmIChsaW5lVmlldy50ZXh0ID09IGxpbmVWaWV3Lm5vZGUpIGxpbmVWaWV3Lm5vZGUgPSBidWlsdC5wcmUKICBsaW5lVmlldy50ZXh0LnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGJ1aWx0LnByZSwgbGluZVZpZXcudGV4dCkKICBsaW5lVmlldy50ZXh0ID0gYnVpbHQucHJlCiAgaWYgKGJ1aWx0LmJnQ2xhc3MgIT0gbGluZVZpZXcuYmdDbGFzcyB8fCBidWlsdC50ZXh0Q2xhc3MgIT0gbGluZVZpZXcudGV4dENsYXNzKSB7CiAgICBsaW5lVmlldy5iZ0NsYXNzID0gYnVpbHQuYmdDbGFzcwogICAgbGluZVZpZXcudGV4dENsYXNzID0gYnVpbHQudGV4dENsYXNzCiAgICB1cGRhdGVMaW5lQ2xhc3NlcyhsaW5lVmlldykKICB9IGVsc2UgaWYgKGNscykgewogICAgbGluZVZpZXcudGV4dC5jbGFzc05hbWUgPSBjbHMKICB9Cn0KCmZ1bmN0aW9uIHVwZGF0ZUxpbmVDbGFzc2VzKGxpbmVWaWV3KSB7CiAgdXBkYXRlTGluZUJhY2tncm91bmQobGluZVZpZXcpCiAgaWYgKGxpbmVWaWV3LmxpbmUud3JhcENsYXNzKQogICAgZW5zdXJlTGluZVdyYXBwZWQobGluZVZpZXcpLmNsYXNzTmFtZSA9IGxpbmVWaWV3LmxpbmUud3JhcENsYXNzCiAgZWxzZSBpZiAobGluZVZpZXcubm9kZSAhPSBsaW5lVmlldy50ZXh0KQogICAgbGluZVZpZXcubm9kZS5jbGFzc05hbWUgPSAiIgogIGxldCB0ZXh0Q2xhc3MgPSBsaW5lVmlldy50ZXh0Q2xhc3MgPyBsaW5lVmlldy50ZXh0Q2xhc3MgKyAiICIgKyAobGluZVZpZXcubGluZS50ZXh0Q2xhc3MgfHwgIiIpIDogbGluZVZpZXcubGluZS50ZXh0Q2xhc3MKICBsaW5lVmlldy50ZXh0LmNsYXNzTmFtZSA9IHRleHRDbGFzcyB8fCAiIgp9CgpmdW5jdGlvbiB1cGRhdGVMaW5lR3V0dGVyKGNtLCBsaW5lVmlldywgbGluZU4sIGRpbXMpIHsKICBpZiAobGluZVZpZXcuZ3V0dGVyKSB7CiAgICBsaW5lVmlldy5ub2RlLnJlbW92ZUNoaWxkKGxpbmVWaWV3Lmd1dHRlcikKICAgIGxpbmVWaWV3Lmd1dHRlciA9IG51bGwKICB9CiAgaWYgKGxpbmVWaWV3Lmd1dHRlckJhY2tncm91bmQpIHsKICAgIGxpbmVWaWV3Lm5vZGUucmVtb3ZlQ2hpbGQobGluZVZpZXcuZ3V0dGVyQmFja2dyb3VuZCkKICAgIGxpbmVWaWV3Lmd1dHRlckJhY2tncm91bmQgPSBudWxsCiAgfQogIGlmIChsaW5lVmlldy5saW5lLmd1dHRlckNsYXNzKSB7CiAgICBsZXQgd3JhcCA9IGVuc3VyZUxpbmVXcmFwcGVkKGxpbmVWaWV3KQogICAgbGluZVZpZXcuZ3V0dGVyQmFja2dyb3VuZCA9IGVsdCgiZGl2IiwgbnVsbCwgIkNvZGVNaXJyb3ItZ3V0dGVyLWJhY2tncm91bmQgIiArIGxpbmVWaWV3LmxpbmUuZ3V0dGVyQ2xhc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGBsZWZ0OiAke2NtLm9wdGlvbnMuZml4ZWRHdXR0ZXIgPyBkaW1zLmZpeGVkUG9zIDogLWRpbXMuZ3V0dGVyVG90YWxXaWR0aH1weDsgd2lkdGg6ICR7ZGltcy5ndXR0ZXJUb3RhbFdpZHRofXB4YCkKICAgIHdyYXAuaW5zZXJ0QmVmb3JlKGxpbmVWaWV3Lmd1dHRlckJhY2tncm91bmQsIGxpbmVWaWV3LnRleHQpCiAgfQogIGxldCBtYXJrZXJzID0gbGluZVZpZXcubGluZS5ndXR0ZXJNYXJrZXJzCiAgaWYgKGNtLm9wdGlvbnMubGluZU51bWJlcnMgfHwgbWFya2VycykgewogICAgbGV0IHdyYXAgPSBlbnN1cmVMaW5lV3JhcHBlZChsaW5lVmlldykKICAgIGxldCBndXR0ZXJXcmFwID0gbGluZVZpZXcuZ3V0dGVyID0gZWx0KCJkaXYiLCBudWxsLCAiQ29kZU1pcnJvci1ndXR0ZXItd3JhcHBlciIsIGBsZWZ0OiAke2NtLm9wdGlvbnMuZml4ZWRHdXR0ZXIgPyBkaW1zLmZpeGVkUG9zIDogLWRpbXMuZ3V0dGVyVG90YWxXaWR0aH1weGApCiAgICBjbS5kaXNwbGF5LmlucHV0LnNldFVuZWRpdGFibGUoZ3V0dGVyV3JhcCkKICAgIHdyYXAuaW5zZXJ0QmVmb3JlKGd1dHRlcldyYXAsIGxpbmVWaWV3LnRleHQpCiAgICBpZiAobGluZVZpZXcubGluZS5ndXR0ZXJDbGFzcykKICAgICAgZ3V0dGVyV3JhcC5jbGFzc05hbWUgKz0gIiAiICsgbGluZVZpZXcubGluZS5ndXR0ZXJDbGFzcwogICAgaWYgKGNtLm9wdGlvbnMubGluZU51bWJlcnMgJiYgKCFtYXJrZXJzIHx8ICFtYXJrZXJzWyJDb2RlTWlycm9yLWxpbmVudW1iZXJzIl0pKQogICAgICBsaW5lVmlldy5saW5lTnVtYmVyID0gZ3V0dGVyV3JhcC5hcHBlbmRDaGlsZCgKICAgICAgICBlbHQoImRpdiIsIGxpbmVOdW1iZXJGb3IoY20ub3B0aW9ucywgbGluZU4pLAogICAgICAgICAgICAiQ29kZU1pcnJvci1saW5lbnVtYmVyIENvZGVNaXJyb3ItZ3V0dGVyLWVsdCIsCiAgICAgICAgICAgIGBsZWZ0OiAke2RpbXMuZ3V0dGVyTGVmdFsiQ29kZU1pcnJvci1saW5lbnVtYmVycyJdfXB4OyB3aWR0aDogJHtjbS5kaXNwbGF5LmxpbmVOdW1Jbm5lcldpZHRofXB4YCkpCiAgICBpZiAobWFya2VycykgZm9yIChsZXQgayA9IDA7IGsgPCBjbS5vcHRpb25zLmd1dHRlcnMubGVuZ3RoOyArK2spIHsKICAgICAgbGV0IGlkID0gY20ub3B0aW9ucy5ndXR0ZXJzW2tdLCBmb3VuZCA9IG1hcmtlcnMuaGFzT3duUHJvcGVydHkoaWQpICYmIG1hcmtlcnNbaWRdCiAgICAgIGlmIChmb3VuZCkKICAgICAgICBndXR0ZXJXcmFwLmFwcGVuZENoaWxkKGVsdCgiZGl2IiwgW2ZvdW5kXSwgIkNvZGVNaXJyb3ItZ3V0dGVyLWVsdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYGxlZnQ6ICR7ZGltcy5ndXR0ZXJMZWZ0W2lkXX1weDsgd2lkdGg6ICR7ZGltcy5ndXR0ZXJXaWR0aFtpZF19cHhgKSkKICAgIH0KICB9Cn0KCmZ1bmN0aW9uIHVwZGF0ZUxpbmVXaWRnZXRzKGNtLCBsaW5lVmlldywgZGltcykgewogIGlmIChsaW5lVmlldy5hbGlnbmFibGUpIGxpbmVWaWV3LmFsaWduYWJsZSA9IG51bGwKICBmb3IgKGxldCBub2RlID0gbGluZVZpZXcubm9kZS5maXJzdENoaWxkLCBuZXh0OyBub2RlOyBub2RlID0gbmV4dCkgewogICAgbmV4dCA9IG5vZGUubmV4dFNpYmxpbmcKICAgIGlmIChub2RlLmNsYXNzTmFtZSA9PSAiQ29kZU1pcnJvci1saW5ld2lkZ2V0IikKICAgICAgbGluZVZpZXcubm9kZS5yZW1vdmVDaGlsZChub2RlKQogIH0KICBpbnNlcnRMaW5lV2lkZ2V0cyhjbSwgbGluZVZpZXcsIGRpbXMpCn0KCi8vIEJ1aWxkIGEgbGluZSdzIERPTSByZXByZXNlbnRhdGlvbiBmcm9tIHNjcmF0Y2gKZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkTGluZUVsZW1lbnQoY20sIGxpbmVWaWV3LCBsaW5lTiwgZGltcykgewogIGxldCBidWlsdCA9IGdldExpbmVDb250ZW50KGNtLCBsaW5lVmlldykKICBsaW5lVmlldy50ZXh0ID0gbGluZVZpZXcubm9kZSA9IGJ1aWx0LnByZQogIGlmIChidWlsdC5iZ0NsYXNzKSBsaW5lVmlldy5iZ0NsYXNzID0gYnVpbHQuYmdDbGFzcwogIGlmIChidWlsdC50ZXh0Q2xhc3MpIGxpbmVWaWV3LnRleHRDbGFzcyA9IGJ1aWx0LnRleHRDbGFzcwoKICB1cGRhdGVMaW5lQ2xhc3NlcyhsaW5lVmlldykKICB1cGRhdGVMaW5lR3V0dGVyKGNtLCBsaW5lVmlldywgbGluZU4sIGRpbXMpCiAgaW5zZXJ0TGluZVdpZGdldHMoY20sIGxpbmVWaWV3LCBkaW1zKQogIHJldHVybiBsaW5lVmlldy5ub2RlCn0KCi8vIEEgbGluZVZpZXcgbWF5IGNvbnRhaW4gbXVsdGlwbGUgbG9naWNhbCBsaW5lcyAod2hlbiBtZXJnZWQgYnkKLy8gY29sbGFwc2VkIHNwYW5zKS4gVGhlIHdpZGdldHMgZm9yIGFsbCBvZiB0aGVtIG5lZWQgdG8gYmUgZHJhd24uCmZ1bmN0aW9uIGluc2VydExpbmVXaWRnZXRzKGNtLCBsaW5lVmlldywgZGltcykgewogIGluc2VydExpbmVXaWRnZXRzRm9yKGNtLCBsaW5lVmlldy5saW5lLCBsaW5lVmlldywgZGltcywgdHJ1ZSkKICBpZiAobGluZVZpZXcucmVzdCkgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lVmlldy5yZXN0Lmxlbmd0aDsgaSsrKQogICAgaW5zZXJ0TGluZVdpZGdldHNGb3IoY20sIGxpbmVWaWV3LnJlc3RbaV0sIGxpbmVWaWV3LCBkaW1zLCBmYWxzZSkKfQoKZnVuY3Rpb24gaW5zZXJ0TGluZVdpZGdldHNGb3IoY20sIGxpbmUsIGxpbmVWaWV3LCBkaW1zLCBhbGxvd0Fib3ZlKSB7CiAgaWYgKCFsaW5lLndpZGdldHMpIHJldHVybgogIGxldCB3cmFwID0gZW5zdXJlTGluZVdyYXBwZWQobGluZVZpZXcpCiAgZm9yIChsZXQgaSA9IDAsIHdzID0gbGluZS53aWRnZXRzOyBpIDwgd3MubGVuZ3RoOyArK2kpIHsKICAgIGxldCB3aWRnZXQgPSB3c1tpXSwgbm9kZSA9IGVsdCgiZGl2IiwgW3dpZGdldC5ub2RlXSwgIkNvZGVNaXJyb3ItbGluZXdpZGdldCIpCiAgICBpZiAoIXdpZGdldC5oYW5kbGVNb3VzZUV2ZW50cykgbm9kZS5zZXRBdHRyaWJ1dGUoImNtLWlnbm9yZS1ldmVudHMiLCAidHJ1ZSIpCiAgICBwb3NpdGlvbkxpbmVXaWRnZXQod2lkZ2V0LCBub2RlLCBsaW5lVmlldywgZGltcykKICAgIGNtLmRpc3BsYXkuaW5wdXQuc2V0VW5lZGl0YWJsZShub2RlKQogICAgaWYgKGFsbG93QWJvdmUgJiYgd2lkZ2V0LmFib3ZlKQogICAgICB3cmFwLmluc2VydEJlZm9yZShub2RlLCBsaW5lVmlldy5ndXR0ZXIgfHwgbGluZVZpZXcudGV4dCkKICAgIGVsc2UKICAgICAgd3JhcC5hcHBlbmRDaGlsZChub2RlKQogICAgc2lnbmFsTGF0ZXIod2lkZ2V0LCAicmVkcmF3IikKICB9Cn0KCmZ1bmN0aW9uIHBvc2l0aW9uTGluZVdpZGdldCh3aWRnZXQsIG5vZGUsIGxpbmVWaWV3LCBkaW1zKSB7CiAgaWYgKHdpZGdldC5ub0hTY3JvbGwpIHsKICAgIDsobGluZVZpZXcuYWxpZ25hYmxlIHx8IChsaW5lVmlldy5hbGlnbmFibGUgPSBbXSkpLnB1c2gobm9kZSkKICAgIGxldCB3aWR0aCA9IGRpbXMud3JhcHBlcldpZHRoCiAgICBub2RlLnN0eWxlLmxlZnQgPSBkaW1zLmZpeGVkUG9zICsgInB4IgogICAgaWYgKCF3aWRnZXQuY292ZXJHdXR0ZXIpIHsKICAgICAgd2lkdGggLT0gZGltcy5ndXR0ZXJUb3RhbFdpZHRoCiAgICAgIG5vZGUuc3R5bGUucGFkZGluZ0xlZnQgPSBkaW1zLmd1dHRlclRvdGFsV2lkdGggKyAicHgiCiAgICB9CiAgICBub2RlLnN0eWxlLndpZHRoID0gd2lkdGggKyAicHgiCiAgfQogIGlmICh3aWRnZXQuY292ZXJHdXR0ZXIpIHsKICAgIG5vZGUuc3R5bGUuekluZGV4ID0gNQogICAgbm9kZS5zdHlsZS5wb3NpdGlvbiA9ICJyZWxhdGl2ZSIKICAgIGlmICghd2lkZ2V0Lm5vSFNjcm9sbCkgbm9kZS5zdHlsZS5tYXJnaW5MZWZ0ID0gLWRpbXMuZ3V0dGVyVG90YWxXaWR0aCArICJweCIKICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/src/display/update_lines.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aW1wb3J0IHsgaGVpZ2h0QXRMaW5lIH0gZnJvbSAiLi4vbGluZS9zcGFucyIKaW1wb3J0IHsgZ2V0TGluZSwgbGluZUF0SGVpZ2h0LCB1cGRhdGVMaW5lSGVpZ2h0IH0gZnJvbSAiLi4vbGluZS91dGlsc19saW5lIgppbXBvcnQgeyBwYWRkaW5nVG9wLCB0ZXh0SGVpZ2h0IH0gZnJvbSAiLi4vbWVhc3VyZW1lbnQvcG9zaXRpb25fbWVhc3VyZW1lbnQiCmltcG9ydCB7IGllLCBpZV92ZXJzaW9uIH0gZnJvbSAiLi4vdXRpbC9icm93c2VyIgoKLy8gUmVhZCB0aGUgYWN0dWFsIGhlaWdodHMgb2YgdGhlIHJlbmRlcmVkIGxpbmVzLCBhbmQgdXBkYXRlIHRoZWlyCi8vIHN0b3JlZCBoZWlnaHRzIHRvIG1hdGNoLgpleHBvcnQgZnVuY3Rpb24gdXBkYXRlSGVpZ2h0c0luVmlld3BvcnQoY20pIHsKICBsZXQgZGlzcGxheSA9IGNtLmRpc3BsYXkKICBsZXQgcHJldkJvdHRvbSA9IGRpc3BsYXkubGluZURpdi5vZmZzZXRUb3AKICBmb3IgKGxldCBpID0gMDsgaSA8IGRpc3BsYXkudmlldy5sZW5ndGg7IGkrKykgewogICAgbGV0IGN1ciA9IGRpc3BsYXkudmlld1tpXSwgaGVpZ2h0CiAgICBpZiAoY3VyLmhpZGRlbikgY29udGludWUKICAgIGlmIChpZSAmJiBpZV92ZXJzaW9uIDwgOCkgewogICAgICBsZXQgYm90ID0gY3VyLm5vZGUub2Zmc2V0VG9wICsgY3VyLm5vZGUub2Zmc2V0SGVpZ2h0CiAgICAgIGhlaWdodCA9IGJvdCAtIHByZXZCb3R0b20KICAgICAgcHJldkJvdHRvbSA9IGJvdAogICAgfSBlbHNlIHsKICAgICAgbGV0IGJveCA9IGN1ci5ub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpCiAgICAgIGhlaWdodCA9IGJveC5ib3R0b20gLSBib3gudG9wCiAgICB9CiAgICBsZXQgZGlmZiA9IGN1ci5saW5lLmhlaWdodCAtIGhlaWdodAogICAgaWYgKGhlaWdodCA8IDIpIGhlaWdodCA9IHRleHRIZWlnaHQoZGlzcGxheSkKICAgIGlmIChkaWZmID4gLjAwMSB8fCBkaWZmIDwgLS4wMDEpIHsKICAgICAgdXBkYXRlTGluZUhlaWdodChjdXIubGluZSwgaGVpZ2h0KQogICAgICB1cGRhdGVXaWRnZXRIZWlnaHQoY3VyLmxpbmUpCiAgICAgIGlmIChjdXIucmVzdCkgZm9yIChsZXQgaiA9IDA7IGogPCBjdXIucmVzdC5sZW5ndGg7IGorKykKICAgICAgICB1cGRhdGVXaWRnZXRIZWlnaHQoY3VyLnJlc3Rbal0pCiAgICB9CiAgfQp9CgovLyBSZWFkIGFuZCBzdG9yZSB0aGUgaGVpZ2h0IG9mIGxpbmUgd2lkZ2V0cyBhc3NvY2lhdGVkIHdpdGggdGhlCi8vIGdpdmVuIGxpbmUuCmZ1bmN0aW9uIHVwZGF0ZVdpZGdldEhlaWdodChsaW5lKSB7CiAgaWYgKGxpbmUud2lkZ2V0cykgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lLndpZGdldHMubGVuZ3RoOyArK2kpCiAgICBsaW5lLndpZGdldHNbaV0uaGVpZ2h0ID0gbGluZS53aWRnZXRzW2ldLm5vZGUucGFyZW50Tm9kZS5vZmZzZXRIZWlnaHQKfQoKLy8gQ29tcHV0ZSB0aGUgbGluZXMgdGhhdCBhcmUgdmlzaWJsZSBpbiBhIGdpdmVuIHZpZXdwb3J0IChkZWZhdWx0cwovLyB0aGUgdGhlIGN1cnJlbnQgc2Nyb2xsIHBvc2l0aW9uKS4gdmlld3BvcnQgbWF5IGNvbnRhaW4gdG9wLAovLyBoZWlnaHQsIGFuZCBlbnN1cmUgKHNlZSBvcC5zY3JvbGxUb1BvcykgcHJvcGVydGllcy4KZXhwb3J0IGZ1bmN0aW9uIHZpc2libGVMaW5lcyhkaXNwbGF5LCBkb2MsIHZpZXdwb3J0KSB7CiAgbGV0IHRvcCA9IHZpZXdwb3J0ICYmIHZpZXdwb3J0LnRvcCAhPSBudWxsID8gTWF0aC5tYXgoMCwgdmlld3BvcnQudG9wKSA6IGRpc3BsYXkuc2Nyb2xsZXIuc2Nyb2xsVG9wCiAgdG9wID0gTWF0aC5mbG9vcih0b3AgLSBwYWRkaW5nVG9wKGRpc3BsYXkpKQogIGxldCBib3R0b20gPSB2aWV3cG9ydCAmJiB2aWV3cG9ydC5ib3R0b20gIT0gbnVsbCA/IHZpZXdwb3J0LmJvdHRvbSA6IHRvcCArIGRpc3BsYXkud3JhcHBlci5jbGllbnRIZWlnaHQKCiAgbGV0IGZyb20gPSBsaW5lQXRIZWlnaHQoZG9jLCB0b3ApLCB0byA9IGxpbmVBdEhlaWdodChkb2MsIGJvdHRvbSkKICAvLyBFbnN1cmUgaXMgYSB7ZnJvbToge2xpbmUsIGNofSwgdG86IHtsaW5lLCBjaH19IG9iamVjdCwgYW5kCiAgLy8gZm9yY2VzIHRob3NlIGxpbmVzIGludG8gdGhlIHZpZXdwb3J0IChpZiBwb3NzaWJsZSkuCiAgaWYgKHZpZXdwb3J0ICYmIHZpZXdwb3J0LmVuc3VyZSkgewogICAgbGV0IGVuc3VyZUZyb20gPSB2aWV3cG9ydC5lbnN1cmUuZnJvbS5saW5lLCBlbnN1cmVUbyA9IHZpZXdwb3J0LmVuc3VyZS50by5saW5lCiAgICBpZiAoZW5zdXJlRnJvbSA8IGZyb20pIHsKICAgICAgZnJvbSA9IGVuc3VyZUZyb20KICAgICAgdG8gPSBsaW5lQXRIZWlnaHQoZG9jLCBoZWlnaHRBdExpbmUoZ2V0TGluZShkb2MsIGVuc3VyZUZyb20pKSArIGRpc3BsYXkud3JhcHBlci5jbGllbnRIZWlnaHQpCiAgICB9IGVsc2UgaWYgKE1hdGgubWluKGVuc3VyZVRvLCBkb2MubGFzdExpbmUoKSkgPj0gdG8pIHsKICAgICAgZnJvbSA9IGxpbmVBdEhlaWdodChkb2MsIGhlaWdodEF0TGluZShnZXRMaW5lKGRvYywgZW5zdXJlVG8pKSAtIGRpc3BsYXkud3JhcHBlci5jbGllbnRIZWlnaHQpCiAgICAgIHRvID0gZW5zdXJlVG8KICAgIH0KICB9CiAgcmV0dXJuIHtmcm9tOiBmcm9tLCB0bzogTWF0aC5tYXgodG8sIGZyb20gKyAxKX0KfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/src/display/view_tracking.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aW1wb3J0IHsgYnVpbGRWaWV3QXJyYXkgfSBmcm9tICIuLi9saW5lL2xpbmVfZGF0YSIKaW1wb3J0IHsgc2F3Q29sbGFwc2VkU3BhbnMgfSBmcm9tICIuLi9saW5lL3Nhd19zcGVjaWFsX3NwYW5zIgppbXBvcnQgeyB2aXN1YWxMaW5lRW5kTm8sIHZpc3VhbExpbmVObyB9IGZyb20gIi4uL2xpbmUvc3BhbnMiCmltcG9ydCB7IGZpbmRWaWV3SW5kZXggfSBmcm9tICIuLi9tZWFzdXJlbWVudC9wb3NpdGlvbl9tZWFzdXJlbWVudCIKaW1wb3J0IHsgaW5kZXhPZiB9IGZyb20gIi4uL3V0aWwvbWlzYyIKCi8vIFVwZGF0ZXMgdGhlIGRpc3BsYXkudmlldyBkYXRhIHN0cnVjdHVyZSBmb3IgYSBnaXZlbiBjaGFuZ2UgdG8gdGhlCi8vIGRvY3VtZW50LiBGcm9tIGFuZCB0byBhcmUgaW4gcHJlLWNoYW5nZSBjb29yZGluYXRlcy4gTGVuZGlmZiBpcwovLyB0aGUgYW1vdW50IG9mIGxpbmVzIGFkZGVkIG9yIHN1YnRyYWN0ZWQgYnkgdGhlIGNoYW5nZS4gVGhpcyBpcwovLyB1c2VkIGZvciBjaGFuZ2VzIHRoYXQgc3BhbiBtdWx0aXBsZSBsaW5lcywgb3IgY2hhbmdlIHRoZSB3YXkKLy8gbGluZXMgYXJlIGRpdmlkZWQgaW50byB2aXN1YWwgbGluZXMuIHJlZ0xpbmVDaGFuZ2UgKGJlbG93KQovLyByZWdpc3RlcnMgc2luZ2xlLWxpbmUgY2hhbmdlcy4KZXhwb3J0IGZ1bmN0aW9uIHJlZ0NoYW5nZShjbSwgZnJvbSwgdG8sIGxlbmRpZmYpIHsKICBpZiAoZnJvbSA9PSBudWxsKSBmcm9tID0gY20uZG9jLmZpcnN0CiAgaWYgKHRvID09IG51bGwpIHRvID0gY20uZG9jLmZpcnN0ICsgY20uZG9jLnNpemUKICBpZiAoIWxlbmRpZmYpIGxlbmRpZmYgPSAwCgogIGxldCBkaXNwbGF5ID0gY20uZGlzcGxheQogIGlmIChsZW5kaWZmICYmIHRvIDwgZGlzcGxheS52aWV3VG8gJiYKICAgICAgKGRpc3BsYXkudXBkYXRlTGluZU51bWJlcnMgPT0gbnVsbCB8fCBkaXNwbGF5LnVwZGF0ZUxpbmVOdW1iZXJzID4gZnJvbSkpCiAgICBkaXNwbGF5LnVwZGF0ZUxpbmVOdW1iZXJzID0gZnJvbQoKICBjbS5jdXJPcC52aWV3Q2hhbmdlZCA9IHRydWUKCiAgaWYgKGZyb20gPj0gZGlzcGxheS52aWV3VG8pIHsgLy8gQ2hhbmdlIGFmdGVyCiAgICBpZiAoc2F3Q29sbGFwc2VkU3BhbnMgJiYgdmlzdWFsTGluZU5vKGNtLmRvYywgZnJvbSkgPCBkaXNwbGF5LnZpZXdUbykKICAgICAgcmVzZXRWaWV3KGNtKQogIH0gZWxzZSBpZiAodG8gPD0gZGlzcGxheS52aWV3RnJvbSkgeyAvLyBDaGFuZ2UgYmVmb3JlCiAgICBpZiAoc2F3Q29sbGFwc2VkU3BhbnMgJiYgdmlzdWFsTGluZUVuZE5vKGNtLmRvYywgdG8gKyBsZW5kaWZmKSA+IGRpc3BsYXkudmlld0Zyb20pIHsKICAgICAgcmVzZXRWaWV3KGNtKQogICAgfSBlbHNlIHsKICAgICAgZGlzcGxheS52aWV3RnJvbSArPSBsZW5kaWZmCiAgICAgIGRpc3BsYXkudmlld1RvICs9IGxlbmRpZmYKICAgIH0KICB9IGVsc2UgaWYgKGZyb20gPD0gZGlzcGxheS52aWV3RnJvbSAmJiB0byA+PSBkaXNwbGF5LnZpZXdUbykgeyAvLyBGdWxsIG92ZXJsYXAKICAgIHJlc2V0VmlldyhjbSkKICB9IGVsc2UgaWYgKGZyb20gPD0gZGlzcGxheS52aWV3RnJvbSkgeyAvLyBUb3Agb3ZlcmxhcAogICAgbGV0IGN1dCA9IHZpZXdDdXR0aW5nUG9pbnQoY20sIHRvLCB0byArIGxlbmRpZmYsIDEpCiAgICBpZiAoY3V0KSB7CiAgICAgIGRpc3BsYXkudmlldyA9IGRpc3BsYXkudmlldy5zbGljZShjdXQuaW5kZXgpCiAgICAgIGRpc3BsYXkudmlld0Zyb20gPSBjdXQubGluZU4KICAgICAgZGlzcGxheS52aWV3VG8gKz0gbGVuZGlmZgogICAgfSBlbHNlIHsKICAgICAgcmVzZXRWaWV3KGNtKQogICAgfQogIH0gZWxzZSBpZiAodG8gPj0gZGlzcGxheS52aWV3VG8pIHsgLy8gQm90dG9tIG92ZXJsYXAKICAgIGxldCBjdXQgPSB2aWV3Q3V0dGluZ1BvaW50KGNtLCBmcm9tLCBmcm9tLCAtMSkKICAgIGlmIChjdXQpIHsKICAgICAgZGlzcGxheS52aWV3ID0gZGlzcGxheS52aWV3LnNsaWNlKDAsIGN1dC5pbmRleCkKICAgICAgZGlzcGxheS52aWV3VG8gPSBjdXQubGluZU4KICAgIH0gZWxzZSB7CiAgICAgIHJlc2V0VmlldyhjbSkKICAgIH0KICB9IGVsc2UgeyAvLyBHYXAgaW4gdGhlIG1pZGRsZQogICAgbGV0IGN1dFRvcCA9IHZpZXdDdXR0aW5nUG9pbnQoY20sIGZyb20sIGZyb20sIC0xKQogICAgbGV0IGN1dEJvdCA9IHZpZXdDdXR0aW5nUG9pbnQoY20sIHRvLCB0byArIGxlbmRpZmYsIDEpCiAgICBpZiAoY3V0VG9wICYmIGN1dEJvdCkgewogICAgICBkaXNwbGF5LnZpZXcgPSBkaXNwbGF5LnZpZXcuc2xpY2UoMCwgY3V0VG9wLmluZGV4KQogICAgICAgIC5jb25jYXQoYnVpbGRWaWV3QXJyYXkoY20sIGN1dFRvcC5saW5lTiwgY3V0Qm90LmxpbmVOKSkKICAgICAgICAuY29uY2F0KGRpc3BsYXkudmlldy5zbGljZShjdXRCb3QuaW5kZXgpKQogICAgICBkaXNwbGF5LnZpZXdUbyArPSBsZW5kaWZmCiAgICB9IGVsc2UgewogICAgICByZXNldFZpZXcoY20pCiAgICB9CiAgfQoKICBsZXQgZXh0ID0gZGlzcGxheS5leHRlcm5hbE1lYXN1cmVkCiAgaWYgKGV4dCkgewogICAgaWYgKHRvIDwgZXh0LmxpbmVOKQogICAgICBleHQubGluZU4gKz0gbGVuZGlmZgogICAgZWxzZSBpZiAoZnJvbSA8IGV4dC5saW5lTiArIGV4dC5zaXplKQogICAgICBkaXNwbGF5LmV4dGVybmFsTWVhc3VyZWQgPSBudWxsCiAgfQp9CgovLyBSZWdpc3RlciBhIGNoYW5nZSB0byBhIHNpbmdsZSBsaW5lLiBUeXBlIG11c3QgYmUgb25lIG9mICJ0ZXh0IiwKLy8gImd1dHRlciIsICJjbGFzcyIsICJ3aWRnZXQiCmV4cG9ydCBmdW5jdGlvbiByZWdMaW5lQ2hhbmdlKGNtLCBsaW5lLCB0eXBlKSB7CiAgY20uY3VyT3Audmlld0NoYW5nZWQgPSB0cnVlCiAgbGV0IGRpc3BsYXkgPSBjbS5kaXNwbGF5LCBleHQgPSBjbS5kaXNwbGF5LmV4dGVybmFsTWVhc3VyZWQKICBpZiAoZXh0ICYmIGxpbmUgPj0gZXh0LmxpbmVOICYmIGxpbmUgPCBleHQubGluZU4gKyBleHQuc2l6ZSkKICAgIGRpc3BsYXkuZXh0ZXJuYWxNZWFzdXJlZCA9IG51bGwKCiAgaWYgKGxpbmUgPCBkaXNwbGF5LnZpZXdGcm9tIHx8IGxpbmUgPj0gZGlzcGxheS52aWV3VG8pIHJldHVybgogIGxldCBsaW5lVmlldyA9IGRpc3BsYXkudmlld1tmaW5kVmlld0luZGV4KGNtLCBsaW5lKV0KICBpZiAobGluZVZpZXcubm9kZSA9PSBudWxsKSByZXR1cm4KICBsZXQgYXJyID0gbGluZVZpZXcuY2hhbmdlcyB8fCAobGluZVZpZXcuY2hhbmdlcyA9IFtdKQogIGlmIChpbmRleE9mKGFyciwgdHlwZSkgPT0gLTEpIGFyci5wdXNoKHR5cGUpCn0KCi8vIENsZWFyIHRoZSB2aWV3LgpleHBvcnQgZnVuY3Rpb24gcmVzZXRWaWV3KGNtKSB7CiAgY20uZGlzcGxheS52aWV3RnJvbSA9IGNtLmRpc3BsYXkudmlld1RvID0gY20uZG9jLmZpcnN0CiAgY20uZGlzcGxheS52aWV3ID0gW10KICBjbS5kaXNwbGF5LnZpZXdPZmZzZXQgPSAwCn0KCmZ1bmN0aW9uIHZpZXdDdXR0aW5nUG9pbnQoY20sIG9sZE4sIG5ld04sIGRpcikgewogIGxldCBpbmRleCA9IGZpbmRWaWV3SW5kZXgoY20sIG9sZE4pLCBkaWZmLCB2aWV3ID0gY20uZGlzcGxheS52aWV3CiAgaWYgKCFzYXdDb2xsYXBzZWRTcGFucyB8fCBuZXdOID09IGNtLmRvYy5maXJzdCArIGNtLmRvYy5zaXplKQogICAgcmV0dXJuIHtpbmRleDogaW5kZXgsIGxpbmVOOiBuZXdOfQogIGxldCBuID0gY20uZGlzcGxheS52aWV3RnJvbQogIGZvciAobGV0IGkgPSAwOyBpIDwgaW5kZXg7IGkrKykKICAgIG4gKz0gdmlld1tpXS5zaXplCiAgaWYgKG4gIT0gb2xkTikgewogICAgaWYgKGRpciA+IDApIHsKICAgICAgaWYgKGluZGV4ID09IHZpZXcubGVuZ3RoIC0gMSkgcmV0dXJuIG51bGwKICAgICAgZGlmZiA9IChuICsgdmlld1tpbmRleF0uc2l6ZSkgLSBvbGROCiAgICAgIGluZGV4KysKICAgIH0gZWxzZSB7CiAgICAgIGRpZmYgPSBuIC0gb2xkTgogICAgfQogICAgb2xkTiArPSBkaWZmOyBuZXdOICs9IGRpZmYKICB9CiAgd2hpbGUgKHZpc3VhbExpbmVObyhjbS5kb2MsIG5ld04pICE9IG5ld04pIHsKICAgIGlmIChpbmRleCA9PSAoZGlyIDwgMCA/IDAgOiB2aWV3Lmxlbmd0aCAtIDEpKSByZXR1cm4gbnVsbAogICAgbmV3TiArPSBkaXIgKiB2aWV3W2luZGV4IC0gKGRpciA8IDAgPyAxIDogMCldLnNpemUKICAgIGluZGV4ICs9IGRpcgogIH0KICByZXR1cm4ge2luZGV4OiBpbmRleCwgbGluZU46IG5ld059Cn0KCi8vIEZvcmNlIHRoZSB2aWV3IHRvIGNvdmVyIGEgZ2l2ZW4gcmFuZ2UsIGFkZGluZyBlbXB0eSB2aWV3IGVsZW1lbnQKLy8gb3IgY2xpcHBpbmcgb2ZmIGV4aXN0aW5nIG9uZXMgYXMgbmVlZGVkLgpleHBvcnQgZnVuY3Rpb24gYWRqdXN0VmlldyhjbSwgZnJvbSwgdG8pIHsKICBsZXQgZGlzcGxheSA9IGNtLmRpc3BsYXksIHZpZXcgPSBkaXNwbGF5LnZpZXcKICBpZiAodmlldy5sZW5ndGggPT0gMCB8fCBmcm9tID49IGRpc3BsYXkudmlld1RvIHx8IHRvIDw9IGRpc3BsYXkudmlld0Zyb20pIHsKICAgIGRpc3BsYXkudmlldyA9IGJ1aWxkVmlld0FycmF5KGNtLCBmcm9tLCB0bykKICAgIGRpc3BsYXkudmlld0Zyb20gPSBmcm9tCiAgfSBlbHNlIHsKICAgIGlmIChkaXNwbGF5LnZpZXdGcm9tID4gZnJvbSkKICAgICAgZGlzcGxheS52aWV3ID0gYnVpbGRWaWV3QXJyYXkoY20sIGZyb20sIGRpc3BsYXkudmlld0Zyb20pLmNvbmNhdChkaXNwbGF5LnZpZXcpCiAgICBlbHNlIGlmIChkaXNwbGF5LnZpZXdGcm9tIDwgZnJvbSkKICAgICAgZGlzcGxheS52aWV3ID0gZGlzcGxheS52aWV3LnNsaWNlKGZpbmRWaWV3SW5kZXgoY20sIGZyb20pKQogICAgZGlzcGxheS52aWV3RnJvbSA9IGZyb20KICAgIGlmIChkaXNwbGF5LnZpZXdUbyA8IHRvKQogICAgICBkaXNwbGF5LnZpZXcgPSBkaXNwbGF5LnZpZXcuY29uY2F0KGJ1aWxkVmlld0FycmF5KGNtLCBkaXNwbGF5LnZpZXdUbywgdG8pKQogICAgZWxzZSBpZiAoZGlzcGxheS52aWV3VG8gPiB0bykKICAgICAgZGlzcGxheS52aWV3ID0gZGlzcGxheS52aWV3LnNsaWNlKDAsIGZpbmRWaWV3SW5kZXgoY20sIHRvKSkKICB9CiAgZGlzcGxheS52aWV3VG8gPSB0bwp9CgovLyBDb3VudCB0aGUgbnVtYmVyIG9mIGxpbmVzIGluIHRoZSB2aWV3IHdob3NlIERPTSByZXByZXNlbnRhdGlvbiBpcwovLyBvdXQgb2YgZGF0ZSAob3Igbm9uZXhpc3RlbnQpLgpleHBvcnQgZnVuY3Rpb24gY291bnREaXJ0eVZpZXcoY20pIHsKICBsZXQgdmlldyA9IGNtLmRpc3BsYXkudmlldywgZGlydHkgPSAwCiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2aWV3Lmxlbmd0aDsgaSsrKSB7CiAgICBsZXQgbGluZVZpZXcgPSB2aWV3W2ldCiAgICBpZiAoIWxpbmVWaWV3LmhpZGRlbiAmJiAoIWxpbmVWaWV3Lm5vZGUgfHwgbGluZVZpZXcuY2hhbmdlcykpICsrZGlydHkKICB9CiAgcmV0dXJuIGRpcnR5Cn0K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/src/edit/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/src/edit/CodeMirror.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aW1wb3J0IHsgRGlzcGxheSB9IGZyb20gIi4uL2Rpc3BsYXkvRGlzcGxheSIKaW1wb3J0IHsgb25Gb2N1cywgb25CbHVyIH0gZnJvbSAiLi4vZGlzcGxheS9mb2N1cyIKaW1wb3J0IHsgc2V0R3V0dGVyc0ZvckxpbmVOdW1iZXJzLCB1cGRhdGVHdXR0ZXJzIH0gZnJvbSAiLi4vZGlzcGxheS9ndXR0ZXJzIgppbXBvcnQgeyBtYXliZVVwZGF0ZUxpbmVOdW1iZXJXaWR0aCB9IGZyb20gIi4uL2Rpc3BsYXkvbGluZV9udW1iZXJzIgppbXBvcnQgeyBlbmRPcGVyYXRpb24sIG9wZXJhdGlvbiwgc3RhcnRPcGVyYXRpb24gfSBmcm9tICIuLi9kaXNwbGF5L29wZXJhdGlvbnMiCmltcG9ydCB7IGluaXRTY3JvbGxiYXJzIH0gZnJvbSAiLi4vZGlzcGxheS9zY3JvbGxiYXJzIgppbXBvcnQgeyBvblNjcm9sbFdoZWVsLCBzZXRTY3JvbGxMZWZ0LCBzZXRTY3JvbGxUb3AgfSBmcm9tICIuLi9kaXNwbGF5L3Njcm9sbF9ldmVudHMiCmltcG9ydCB7IGNsaXBQb3MsIFBvcyB9IGZyb20gIi4uL2xpbmUvcG9zIgppbXBvcnQgeyBwb3NGcm9tTW91c2UgfSBmcm9tICIuLi9tZWFzdXJlbWVudC9wb3NpdGlvbl9tZWFzdXJlbWVudCIKaW1wb3J0IHsgZXZlbnRJbldpZGdldCB9IGZyb20gIi4uL21lYXN1cmVtZW50L3dpZGdldHMiCmltcG9ydCBEb2MgZnJvbSAiLi4vbW9kZWwvRG9jIgppbXBvcnQgeyBhdHRhY2hEb2MgfSBmcm9tICIuLi9tb2RlbC9kb2N1bWVudF9kYXRhIgppbXBvcnQgeyBSYW5nZSB9IGZyb20gIi4uL21vZGVsL3NlbGVjdGlvbiIKaW1wb3J0IHsgZXh0ZW5kU2VsZWN0aW9uIH0gZnJvbSAiLi4vbW9kZWwvc2VsZWN0aW9uX3VwZGF0ZXMiCmltcG9ydCB7IGNhcHR1cmVSaWdodENsaWNrLCBpZSwgaWVfdmVyc2lvbiwgbW9iaWxlLCB3ZWJraXQgfSBmcm9tICIuLi91dGlsL2Jyb3dzZXIiCmltcG9ydCB7IGVfcHJldmVudERlZmF1bHQsIGVfc3RvcCwgb24sIHNpZ25hbCwgc2lnbmFsRE9NRXZlbnQgfSBmcm9tICIuLi91dGlsL2V2ZW50IgppbXBvcnQgeyBiaW5kLCBjb3B5T2JqLCBEZWxheWVkIH0gZnJvbSAiLi4vdXRpbC9taXNjIgoKaW1wb3J0IHsgY2xlYXJEcmFnQ3Vyc29yLCBvbkRyYWdPdmVyLCBvbkRyYWdTdGFydCwgb25Ecm9wIH0gZnJvbSAiLi9kcm9wX2V2ZW50cyIKaW1wb3J0IHsgZW5zdXJlR2xvYmFsSGFuZGxlcnMgfSBmcm9tICIuL2dsb2JhbF9ldmVudHMiCmltcG9ydCB7IG9uS2V5RG93biwgb25LZXlQcmVzcywgb25LZXlVcCB9IGZyb20gIi4va2V5X2V2ZW50cyIKaW1wb3J0IHsgY2xpY2tJbkd1dHRlciwgb25Db250ZXh0TWVudSwgb25Nb3VzZURvd24gfSBmcm9tICIuL21vdXNlX2V2ZW50cyIKaW1wb3J0IHsgdGhlbWVDaGFuZ2VkIH0gZnJvbSAiLi91dGlscyIKaW1wb3J0IHsgZGVmYXVsdHMsIG9wdGlvbkhhbmRsZXJzLCBJbml0IH0gZnJvbSAiLi9vcHRpb25zIgoKLy8gQSBDb2RlTWlycm9yIGluc3RhbmNlIHJlcHJlc2VudHMgYW4gZWRpdG9yLiBUaGlzIGlzIHRoZSBvYmplY3QKLy8gdGhhdCB1c2VyIGNvZGUgaXMgdXN1YWxseSBkZWFsaW5nIHdpdGguCgpleHBvcnQgZnVuY3Rpb24gQ29kZU1pcnJvcihwbGFjZSwgb3B0aW9ucykgewogIGlmICghKHRoaXMgaW5zdGFuY2VvZiBDb2RlTWlycm9yKSkgcmV0dXJuIG5ldyBDb2RlTWlycm9yKHBsYWNlLCBvcHRpb25zKQoKICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zID0gb3B0aW9ucyA/IGNvcHlPYmoob3B0aW9ucykgOiB7fQogIC8vIERldGVybWluZSBlZmZlY3RpdmUgb3B0aW9ucyBiYXNlZCBvbiBnaXZlbiB2YWx1ZXMgYW5kIGRlZmF1bHRzLgogIGNvcHlPYmooZGVmYXVsdHMsIG9wdGlvbnMsIGZhbHNlKQogIHNldEd1dHRlcnNGb3JMaW5lTnVtYmVycyhvcHRpb25zKQoKICBsZXQgZG9jID0gb3B0aW9ucy52YWx1ZQogIGlmICh0eXBlb2YgZG9jID09ICJzdHJpbmciKSBkb2MgPSBuZXcgRG9jKGRvYywgb3B0aW9ucy5tb2RlLCBudWxsLCBvcHRpb25zLmxpbmVTZXBhcmF0b3IpCiAgdGhpcy5kb2MgPSBkb2MKCiAgbGV0IGlucHV0ID0gbmV3IENvZGVNaXJyb3IuaW5wdXRTdHlsZXNbb3B0aW9ucy5pbnB1dFN0eWxlXSh0aGlzKQogIGxldCBkaXNwbGF5ID0gdGhpcy5kaXNwbGF5ID0gbmV3IERpc3BsYXkocGxhY2UsIGRvYywgaW5wdXQpCiAgZGlzcGxheS53cmFwcGVyLkNvZGVNaXJyb3IgPSB0aGlzCiAgdXBkYXRlR3V0dGVycyh0aGlzKQogIHRoZW1lQ2hhbmdlZCh0aGlzKQogIGlmIChvcHRpb25zLmxpbmVXcmFwcGluZykKICAgIHRoaXMuZGlzcGxheS53cmFwcGVyLmNsYXNzTmFtZSArPSAiIENvZGVNaXJyb3Itd3JhcCIKICBpZiAob3B0aW9ucy5hdXRvZm9jdXMgJiYgIW1vYmlsZSkgZGlzcGxheS5pbnB1dC5mb2N1cygpCiAgaW5pdFNjcm9sbGJhcnModGhpcykKCiAgdGhpcy5zdGF0ZSA9IHsKICAgIGtleU1hcHM6IFtdLCAgLy8gc3RvcmVzIG1hcHMgYWRkZWQgYnkgYWRkS2V5TWFwCiAgICBvdmVybGF5czogW10sIC8vIGhpZ2hsaWdodGluZyBvdmVybGF5cywgYXMgYWRkZWQgYnkgYWRkT3ZlcmxheQogICAgbW9kZUdlbjogMCwgICAvLyBidW1wZWQgd2hlbiBtb2RlL292ZXJsYXkgY2hhbmdlcywgdXNlZCB0byBpbnZhbGlkYXRlIGhpZ2hsaWdodGluZyBpbmZvCiAgICBvdmVyd3JpdGU6IGZhbHNlLAogICAgZGVsYXlpbmdCbHVyRXZlbnQ6IGZhbHNlLAogICAgZm9jdXNlZDogZmFsc2UsCiAgICBzdXBwcmVzc0VkaXRzOiBmYWxzZSwgLy8gdXNlZCB0byBkaXNhYmxlIGVkaXRpbmcgZHVyaW5nIGtleSBoYW5kbGVycyB3aGVuIGluIHJlYWRPbmx5IG1vZGUKICAgIHBhc3RlSW5jb21pbmc6IGZhbHNlLCBjdXRJbmNvbWluZzogZmFsc2UsIC8vIGhlbHAgcmVjb2duaXplIHBhc3RlL2N1dCBlZGl0cyBpbiBpbnB1dC5wb2xsCiAgICBzZWxlY3RpbmdUZXh0OiBmYWxzZSwKICAgIGRyYWdnaW5nVGV4dDogZmFsc2UsCiAgICBoaWdobGlnaHQ6IG5ldyBEZWxheWVkKCksIC8vIHN0b3JlcyBoaWdobGlnaHQgd29ya2VyIHRpbWVvdXQKICAgIGtleVNlcTogbnVsbCwgIC8vIFVuZmluaXNoZWQga2V5IHNlcXVlbmNlCiAgICBzcGVjaWFsQ2hhcnM6IG51bGwKICB9CgogIC8vIE92ZXJyaWRlIG1hZ2ljIHRleHRhcmVhIGNvbnRlbnQgcmVzdG9yZSB0aGF0IElFIHNvbWV0aW1lcyBkb2VzCiAgLy8gb24gb3VyIGhpZGRlbiB0ZXh0YXJlYSBvbiByZWxvYWQKICBpZiAoaWUgJiYgaWVfdmVyc2lvbiA8IDExKSBzZXRUaW1lb3V0KCgpID0+IHRoaXMuZGlzcGxheS5pbnB1dC5yZXNldCh0cnVlKSwgMjApCgogIHJlZ2lzdGVyRXZlbnRIYW5kbGVycyh0aGlzKQogIGVuc3VyZUdsb2JhbEhhbmRsZXJzKCkKCiAgc3RhcnRPcGVyYXRpb24odGhpcykKICB0aGlzLmN1ck9wLmZvcmNlVXBkYXRlID0gdHJ1ZQogIGF0dGFjaERvYyh0aGlzLCBkb2MpCgogIGlmICgob3B0aW9ucy5hdXRvZm9jdXMgJiYgIW1vYmlsZSkgfHwgdGhpcy5oYXNGb2N1cygpKQogICAgc2V0VGltZW91dChiaW5kKG9uRm9jdXMsIHRoaXMpLCAyMCkKICBlbHNlCiAgICBvbkJsdXIodGhpcykKCiAgZm9yIChsZXQgb3B0IGluIG9wdGlvbkhhbmRsZXJzKSBpZiAob3B0aW9uSGFuZGxlcnMuaGFzT3duUHJvcGVydHkob3B0KSkKICAgIG9wdGlvbkhhbmRsZXJzW29wdF0odGhpcywgb3B0aW9uc1tvcHRdLCBJbml0KQogIG1heWJlVXBkYXRlTGluZU51bWJlcldpZHRoKHRoaXMpCiAgaWYgKG9wdGlvbnMuZmluaXNoSW5pdCkgb3B0aW9ucy5maW5pc2hJbml0KHRoaXMpCiAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbml0SG9va3MubGVuZ3RoOyArK2kpIGluaXRIb29rc1tpXSh0aGlzKQogIGVuZE9wZXJhdGlvbih0aGlzKQogIC8vIFN1cHByZXNzIG9wdGltaXplbGVnaWJpbGl0eSBpbiBXZWJraXQsIHNpbmNlIGl0IGJyZWFrcyB0ZXh0CiAgLy8gbWVhc3VyaW5nIG9uIGxpbmUgd3JhcHBpbmcgYm91bmRhcmllcy4KICBpZiAod2Via2l0ICYmIG9wdGlvbnMubGluZVdyYXBwaW5nICYmCiAgICAgIGdldENvbXB1dGVkU3R5bGUoZGlzcGxheS5saW5lRGl2KS50ZXh0UmVuZGVyaW5nID09ICJvcHRpbWl6ZWxlZ2liaWxpdHkiKQogICAgZGlzcGxheS5saW5lRGl2LnN0eWxlLnRleHRSZW5kZXJpbmcgPSAiYXV0byIKfQoKLy8gVGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBvcHRpb25zLgpDb2RlTWlycm9yLmRlZmF1bHRzID0gZGVmYXVsdHMKLy8gRnVuY3Rpb25zIHRvIHJ1biB3aGVuIG9wdGlvbnMgYXJlIGNoYW5nZWQuCkNvZGVNaXJyb3Iub3B0aW9uSGFuZGxlcnMgPSBvcHRpb25IYW5kbGVycwoKZXhwb3J0IGRlZmF1bHQgQ29kZU1pcnJvcgoKLy8gQXR0YWNoIHRoZSBuZWNlc3NhcnkgZXZlbnQgaGFuZGxlcnMgd2hlbiBpbml0aWFsaXppbmcgdGhlIGVkaXRvcgpmdW5jdGlvbiByZWdpc3RlckV2ZW50SGFuZGxlcnMoY20pIHsKICBsZXQgZCA9IGNtLmRpc3BsYXkKICBvbihkLnNjcm9sbGVyLCAibW91c2Vkb3duIiwgb3BlcmF0aW9uKGNtLCBvbk1vdXNlRG93bikpCiAgLy8gT2xkZXIgSUUncyB3aWxsIG5vdCBmaXJlIGEgc2Vjb25kIG1vdXNlZG93biBmb3IgYSBkb3VibGUgY2xpY2sKICBpZiAoaWUgJiYgaWVfdmVyc2lvbiA8IDExKQogICAgb24oZC5zY3JvbGxlciwgImRibGNsaWNrIiwgb3BlcmF0aW9uKGNtLCBlID0+IHsKICAgICAgaWYgKHNpZ25hbERPTUV2ZW50KGNtLCBlKSkgcmV0dXJuCiAgICAgIGxldCBwb3MgPSBwb3NGcm9tTW91c2UoY20sIGUpCiAgICAgIGlmICghcG9zIHx8IGNsaWNrSW5HdXR0ZXIoY20sIGUpIHx8IGV2ZW50SW5XaWRnZXQoY20uZGlzcGxheSwgZSkpIHJldHVybgogICAgICBlX3ByZXZlbnREZWZhdWx0KGUpCiAgICAgIGxldCB3b3JkID0gY20uZmluZFdvcmRBdChwb3MpCiAgICAgIGV4dGVuZFNlbGVjdGlvbihjbS5kb2MsIHdvcmQuYW5jaG9yLCB3b3JkLmhlYWQpCiAgICB9KSkKICBlbHNlCiAgICBvbihkLnNjcm9sbGVyLCAiZGJsY2xpY2siLCBlID0+IHNpZ25hbERPTUV2ZW50KGNtLCBlKSB8fCBlX3ByZXZlbnREZWZhdWx0KGUpKQogIC8vIFNvbWUgYnJvd3NlcnMgZmlyZSBjb250ZXh0bWVudSAqYWZ0ZXIqIG9wZW5pbmcgdGhlIG1lbnUsIGF0CiAgLy8gd2hpY2ggcG9pbnQgd2UgY2FuJ3QgbWVzcyB3aXRoIGl0IGFueW1vcmUuIENvbnRleHQgbWVudSBpcwogIC8vIGhhbmRsZWQgaW4gb25Nb3VzZURvd24gZm9yIHRoZXNlIGJyb3dzZXJzLgogIGlmICghY2FwdHVyZVJpZ2h0Q2xpY2spIG9uKGQuc2Nyb2xsZXIsICJjb250ZXh0bWVudSIsIGUgPT4gb25Db250ZXh0TWVudShjbSwgZSkpCgogIC8vIFVzZWQgdG8gc3VwcHJlc3MgbW91c2UgZXZlbnQgaGFuZGxpbmcgd2hlbiBhIHRvdWNoIGhhcHBlbnMKICBsZXQgdG91Y2hGaW5pc2hlZCwgcHJldlRvdWNoID0ge2VuZDogMH0KICBmdW5jdGlvbiBmaW5pc2hUb3VjaCgpIHsKICAgIGlmIChkLmFjdGl2ZVRvdWNoKSB7CiAgICAgIHRvdWNoRmluaXNoZWQgPSBzZXRUaW1lb3V0KCgpID0+IGQuYWN0aXZlVG91Y2ggPSBudWxsLCAxMDAwKQogICAgICBwcmV2VG91Y2ggPSBkLmFjdGl2ZVRvdWNoCiAgICAgIHByZXZUb3VjaC5lbmQgPSArbmV3IERhdGUKICAgIH0KICB9CiAgZnVuY3Rpb24gaXNNb3VzZUxpa2VUb3VjaEV2ZW50KGUpIHsKICAgIGlmIChlLnRvdWNoZXMubGVuZ3RoICE9IDEpIHJldHVybiBmYWxzZQogICAgbGV0IHRvdWNoID0gZS50b3VjaGVzWzBdCiAgICByZXR1cm4gdG91Y2gucmFkaXVzWCA8PSAxICYmIHRvdWNoLnJhZGl1c1kgPD0gMQogIH0KICBmdW5jdGlvbiBmYXJBd2F5KHRvdWNoLCBvdGhlcikgewogICAgaWYgKG90aGVyLmxlZnQgPT0gbnVsbCkgcmV0dXJuIHRydWUKICAgIGxldCBkeCA9IG90aGVyLmxlZnQgLSB0b3VjaC5sZWZ0LCBkeSA9IG90aGVyLnRvcCAtIHRvdWNoLnRvcAogICAgcmV0dXJuIGR4ICogZHggKyBkeSAqIGR5ID4gMjAgKiAyMAogIH0KICBvbihkLnNjcm9sbGVyLCAidG91Y2hzdGFydCIsIGUgPT4gewogICAgaWYgKCFzaWduYWxET01FdmVudChjbSwgZSkgJiYgIWlzTW91c2VMaWtlVG91Y2hFdmVudChlKSkgewogICAgICBjbGVhclRpbWVvdXQodG91Y2hGaW5pc2hlZCkKICAgICAgbGV0IG5vdyA9ICtuZXcgRGF0ZQogICAgICBkLmFjdGl2ZVRvdWNoID0ge3N0YXJ0OiBub3csIG1vdmVkOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICBwcmV2OiBub3cgLSBwcmV2VG91Y2guZW5kIDw9IDMwMCA/IHByZXZUb3VjaCA6IG51bGx9CiAgICAgIGlmIChlLnRvdWNoZXMubGVuZ3RoID09IDEpIHsKICAgICAgICBkLmFjdGl2ZVRvdWNoLmxlZnQgPSBlLnRvdWNoZXNbMF0ucGFnZVgKICAgICAgICBkLmFjdGl2ZVRvdWNoLnRvcCA9IGUudG91Y2hlc1swXS5wYWdlWQogICAgICB9CiAgICB9CiAgfSkKICBvbihkLnNjcm9sbGVyLCAidG91Y2htb3ZlIiwgKCkgPT4gewogICAgaWYgKGQuYWN0aXZlVG91Y2gpIGQuYWN0aXZlVG91Y2gubW92ZWQgPSB0cnVlCiAgfSkKICBvbihkLnNjcm9sbGVyLCAidG91Y2hlbmQiLCBlID0+IHsKICAgIGxldCB0b3VjaCA9IGQuYWN0aXZlVG91Y2gKICAgIGlmICh0b3VjaCAmJiAhZXZlbnRJbldpZGdldChkLCBlKSAmJiB0b3VjaC5sZWZ0ICE9IG51bGwgJiYKICAgICAgICAhdG91Y2gubW92ZWQgJiYgbmV3IERhdGUgLSB0b3VjaC5zdGFydCA8IDMwMCkgewogICAgICBsZXQgcG9zID0gY20uY29vcmRzQ2hhcihkLmFjdGl2ZVRvdWNoLCAicGFnZSIpLCByYW5nZQogICAgICBpZiAoIXRvdWNoLnByZXYgfHwgZmFyQXdheSh0b3VjaCwgdG91Y2gucHJldikpIC8vIFNpbmdsZSB0YXAKICAgICAgICByYW5nZSA9IG5ldyBSYW5nZShwb3MsIHBvcykKICAgICAgZWxzZSBpZiAoIXRvdWNoLnByZXYucHJldiB8fCBmYXJBd2F5KHRvdWNoLCB0b3VjaC5wcmV2LnByZXYpKSAvLyBEb3VibGUgdGFwCiAgICAgICAgcmFuZ2UgPSBjbS5maW5kV29yZEF0KHBvcykKICAgICAgZWxzZSAvLyBUcmlwbGUgdGFwCiAgICAgICAgcmFuZ2UgPSBuZXcgUmFuZ2UoUG9zKHBvcy5saW5lLCAwKSwgY2xpcFBvcyhjbS5kb2MsIFBvcyhwb3MubGluZSArIDEsIDApKSkKICAgICAgY20uc2V0U2VsZWN0aW9uKHJhbmdlLmFuY2hvciwgcmFuZ2UuaGVhZCkKICAgICAgY20uZm9jdXMoKQogICAgICBlX3ByZXZlbnREZWZhdWx0KGUpCiAgICB9CiAgICBmaW5pc2hUb3VjaCgpCiAgfSkKICBvbihkLnNjcm9sbGVyLCAidG91Y2hjYW5jZWwiLCBmaW5pc2hUb3VjaCkKCiAgLy8gU3luYyBzY3JvbGxpbmcgYmV0d2VlbiBmYWtlIHNjcm9sbGJhcnMgYW5kIHJlYWwgc2Nyb2xsYWJsZQogIC8vIGFyZWEsIGVuc3VyZSB2aWV3cG9ydCBpcyB1cGRhdGVkIHdoZW4gc2Nyb2xsaW5nLgogIG9uKGQuc2Nyb2xsZXIsICJzY3JvbGwiLCAoKSA9PiB7CiAgICBpZiAoZC5zY3JvbGxlci5jbGllbnRIZWlnaHQpIHsKICAgICAgc2V0U2Nyb2xsVG9wKGNtLCBkLnNjcm9sbGVyLnNjcm9sbFRvcCkKICAgICAgc2V0U2Nyb2xsTGVmdChjbSwgZC5zY3JvbGxlci5zY3JvbGxMZWZ0LCB0cnVlKQogICAgICBzaWduYWwoY20sICJzY3JvbGwiLCBjbSkKICAgIH0KICB9KQoKICAvLyBMaXN0ZW4gdG8gd2hlZWwgZXZlbnRzIGluIG9yZGVyIHRvIHRyeSBhbmQgdXBkYXRlIHRoZSB2aWV3cG9ydCBvbiB0aW1lLgogIG9uKGQuc2Nyb2xsZXIsICJtb3VzZXdoZWVsIiwgZSA9PiBvblNjcm9sbFdoZWVsKGNtLCBlKSkKICBvbihkLnNjcm9sbGVyLCAiRE9NTW91c2VTY3JvbGwiLCBlID0+IG9uU2Nyb2xsV2hlZWwoY20sIGUpKQoKICAvLyBQcmV2ZW50IHdyYXBwZXIgZnJvbSBldmVyIHNjcm9sbGluZwogIG9uKGQud3JhcHBlciwgInNjcm9sbCIsICgpID0+IGQud3JhcHBlci5zY3JvbGxUb3AgPSBkLndyYXBwZXIuc2Nyb2xsTGVmdCA9IDApCgogIGQuZHJhZ0Z1bmN0aW9ucyA9IHsKICAgIGVudGVyOiBlID0+IHtpZiAoIXNpZ25hbERPTUV2ZW50KGNtLCBlKSkgZV9zdG9wKGUpfSwKICAgIG92ZXI6IGUgPT4ge2lmICghc2lnbmFsRE9NRXZlbnQoY20sIGUpKSB7IG9uRHJhZ092ZXIoY20sIGUpOyBlX3N0b3AoZSkgfX0sCiAgICBzdGFydDogZSA9PiBvbkRyYWdTdGFydChjbSwgZSksCiAgICBkcm9wOiBvcGVyYXRpb24oY20sIG9uRHJvcCksCiAgICBsZWF2ZTogZSA9PiB7aWYgKCFzaWduYWxET01FdmVudChjbSwgZSkpIHsgY2xlYXJEcmFnQ3Vyc29yKGNtKSB9fQogIH0KCiAgbGV0IGlucCA9IGQuaW5wdXQuZ2V0RmllbGQoKQogIG9uKGlucCwgImtleXVwIiwgZSA9PiBvbktleVVwLmNhbGwoY20sIGUpKQogIG9uKGlucCwgImtleWRvd24iLCBvcGVyYXRpb24oY20sIG9uS2V5RG93bikpCiAgb24oaW5wLCAia2V5cHJlc3MiLCBvcGVyYXRpb24oY20sIG9uS2V5UHJlc3MpKQogIG9uKGlucCwgImZvY3VzIiwgZSA9PiBvbkZvY3VzKGNtLCBlKSkKICBvbihpbnAsICJibHVyIiwgZSA9PiBvbkJsdXIoY20sIGUpKQp9CgpsZXQgaW5pdEhvb2tzID0gW10KQ29kZU1pcnJvci5kZWZpbmVJbml0SG9vayA9IGYgPT4gaW5pdEhvb2tzLnB1c2goZikK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/src/edit/commands.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aW1wb3J0IHsgZGVsZXRlTmVhclNlbGVjdGlvbiB9IGZyb20gIi4vZGVsZXRlTmVhclNlbGVjdGlvbiIKaW1wb3J0IHsgcnVuSW5PcCB9IGZyb20gIi4uL2Rpc3BsYXkvb3BlcmF0aW9ucyIKaW1wb3J0IHsgZW5zdXJlQ3Vyc29yVmlzaWJsZSB9IGZyb20gIi4uL2Rpc3BsYXkvc2Nyb2xsaW5nIgppbXBvcnQgeyBjbGlwUG9zLCBQb3MgfSBmcm9tICIuLi9saW5lL3BvcyIKaW1wb3J0IHsgY29sbGFwc2VkU3BhbkF0RW5kLCB2aXN1YWxMaW5lIH0gZnJvbSAiLi4vbGluZS9zcGFucyIKaW1wb3J0IHsgZ2V0TGluZSwgbGluZU5vIH0gZnJvbSAiLi4vbGluZS91dGlsc19saW5lIgppbXBvcnQgeyBSYW5nZSB9IGZyb20gIi4uL21vZGVsL3NlbGVjdGlvbiIKaW1wb3J0IHsgc2VsZWN0QWxsIH0gZnJvbSAiLi4vbW9kZWwvc2VsZWN0aW9uX3VwZGF0ZXMiCmltcG9ydCB7IGNvdW50Q29sdW1uLCBzZWxfZG9udFNjcm9sbCwgc2VsX21vdmUsIHNwYWNlU3RyIH0gZnJvbSAiLi4vdXRpbC9taXNjIgppbXBvcnQgeyBnZXRPcmRlciwgbGluZUxlZnQsIGxpbmVSaWdodCB9IGZyb20gIi4uL3V0aWwvYmlkaSIKCi8vIENvbW1hbmRzIGFyZSBwYXJhbWV0ZXItbGVzcyBhY3Rpb25zIHRoYXQgY2FuIGJlIHBlcmZvcm1lZCBvbiBhbgovLyBlZGl0b3IsIG1vc3RseSB1c2VkIGZvciBrZXliaW5kaW5ncy4KZXhwb3J0IGxldCBjb21tYW5kcyA9IHsKICBzZWxlY3RBbGw6IHNlbGVjdEFsbCwKICBzaW5nbGVTZWxlY3Rpb246IGNtID0+IGNtLnNldFNlbGVjdGlvbihjbS5nZXRDdXJzb3IoImFuY2hvciIpLCBjbS5nZXRDdXJzb3IoImhlYWQiKSwgc2VsX2RvbnRTY3JvbGwpLAogIGtpbGxMaW5lOiBjbSA9PiBkZWxldGVOZWFyU2VsZWN0aW9uKGNtLCByYW5nZSA9PiB7CiAgICBpZiAocmFuZ2UuZW1wdHkoKSkgewogICAgICBsZXQgbGVuID0gZ2V0TGluZShjbS5kb2MsIHJhbmdlLmhlYWQubGluZSkudGV4dC5sZW5ndGgKICAgICAgaWYgKHJhbmdlLmhlYWQuY2ggPT0gbGVuICYmIHJhbmdlLmhlYWQubGluZSA8IGNtLmxhc3RMaW5lKCkpCiAgICAgICAgcmV0dXJuIHtmcm9tOiByYW5nZS5oZWFkLCB0bzogUG9zKHJhbmdlLmhlYWQubGluZSArIDEsIDApfQogICAgICBlbHNlCiAgICAgICAgcmV0dXJuIHtmcm9tOiByYW5nZS5oZWFkLCB0bzogUG9zKHJhbmdlLmhlYWQubGluZSwgbGVuKX0KICAgIH0gZWxzZSB7CiAgICAgIHJldHVybiB7ZnJvbTogcmFuZ2UuZnJvbSgpLCB0bzogcmFuZ2UudG8oKX0KICAgIH0KICB9KSwKICBkZWxldGVMaW5lOiBjbSA9PiBkZWxldGVOZWFyU2VsZWN0aW9uKGNtLCByYW5nZSA9PiAoewogICAgZnJvbTogUG9zKHJhbmdlLmZyb20oKS5saW5lLCAwKSwKICAgIHRvOiBjbGlwUG9zKGNtLmRvYywgUG9zKHJhbmdlLnRvKCkubGluZSArIDEsIDApKQogIH0pKSwKICBkZWxMaW5lTGVmdDogY20gPT4gZGVsZXRlTmVhclNlbGVjdGlvbihjbSwgcmFuZ2UgPT4gKHsKICAgIGZyb206IFBvcyhyYW5nZS5mcm9tKCkubGluZSwgMCksIHRvOiByYW5nZS5mcm9tKCkKICB9KSksCiAgZGVsV3JhcHBlZExpbmVMZWZ0OiBjbSA9PiBkZWxldGVOZWFyU2VsZWN0aW9uKGNtLCByYW5nZSA9PiB7CiAgICBsZXQgdG9wID0gY20uY2hhckNvb3JkcyhyYW5nZS5oZWFkLCAiZGl2IikudG9wICsgNQogICAgbGV0IGxlZnRQb3MgPSBjbS5jb29yZHNDaGFyKHtsZWZ0OiAwLCB0b3A6IHRvcH0sICJkaXYiKQogICAgcmV0dXJuIHtmcm9tOiBsZWZ0UG9zLCB0bzogcmFuZ2UuZnJvbSgpfQogIH0pLAogIGRlbFdyYXBwZWRMaW5lUmlnaHQ6IGNtID0+IGRlbGV0ZU5lYXJTZWxlY3Rpb24oY20sIHJhbmdlID0+IHsKICAgIGxldCB0b3AgPSBjbS5jaGFyQ29vcmRzKHJhbmdlLmhlYWQsICJkaXYiKS50b3AgKyA1CiAgICBsZXQgcmlnaHRQb3MgPSBjbS5jb29yZHNDaGFyKHtsZWZ0OiBjbS5kaXNwbGF5LmxpbmVEaXYub2Zmc2V0V2lkdGggKyAxMDAsIHRvcDogdG9wfSwgImRpdiIpCiAgICByZXR1cm4ge2Zyb206IHJhbmdlLmZyb20oKSwgdG86IHJpZ2h0UG9zIH0KICB9KSwKICB1bmRvOiBjbSA9PiBjbS51bmRvKCksCiAgcmVkbzogY20gPT4gY20ucmVkbygpLAogIHVuZG9TZWxlY3Rpb246IGNtID0+IGNtLnVuZG9TZWxlY3Rpb24oKSwKICByZWRvU2VsZWN0aW9uOiBjbSA9PiBjbS5yZWRvU2VsZWN0aW9uKCksCiAgZ29Eb2NTdGFydDogY20gPT4gY20uZXh0ZW5kU2VsZWN0aW9uKFBvcyhjbS5maXJzdExpbmUoKSwgMCkpLAogIGdvRG9jRW5kOiBjbSA9PiBjbS5leHRlbmRTZWxlY3Rpb24oUG9zKGNtLmxhc3RMaW5lKCkpKSwKICBnb0xpbmVTdGFydDogY20gPT4gY20uZXh0ZW5kU2VsZWN0aW9uc0J5KHJhbmdlID0+IGxpbmVTdGFydChjbSwgcmFuZ2UuaGVhZC5saW5lKSwKICAgIHtvcmlnaW46ICIrbW92ZSIsIGJpYXM6IDF9CiAgKSwKICBnb0xpbmVTdGFydFNtYXJ0OiBjbSA9PiBjbS5leHRlbmRTZWxlY3Rpb25zQnkocmFuZ2UgPT4gbGluZVN0YXJ0U21hcnQoY20sIHJhbmdlLmhlYWQpLAogICAge29yaWdpbjogIittb3ZlIiwgYmlhczogMX0KICApLAogIGdvTGluZUVuZDogY20gPT4gY20uZXh0ZW5kU2VsZWN0aW9uc0J5KHJhbmdlID0+IGxpbmVFbmQoY20sIHJhbmdlLmhlYWQubGluZSksCiAgICB7b3JpZ2luOiAiK21vdmUiLCBiaWFzOiAtMX0KICApLAogIGdvTGluZVJpZ2h0OiBjbSA9PiBjbS5leHRlbmRTZWxlY3Rpb25zQnkocmFuZ2UgPT4gewogICAgbGV0IHRvcCA9IGNtLmNoYXJDb29yZHMocmFuZ2UuaGVhZCwgImRpdiIpLnRvcCArIDUKICAgIHJldHVybiBjbS5jb29yZHNDaGFyKHtsZWZ0OiBjbS5kaXNwbGF5LmxpbmVEaXYub2Zmc2V0V2lkdGggKyAxMDAsIHRvcDogdG9wfSwgImRpdiIpCiAgfSwgc2VsX21vdmUpLAogIGdvTGluZUxlZnQ6IGNtID0+IGNtLmV4dGVuZFNlbGVjdGlvbnNCeShyYW5nZSA9PiB7CiAgICBsZXQgdG9wID0gY20uY2hhckNvb3JkcyhyYW5nZS5oZWFkLCAiZGl2IikudG9wICsgNQogICAgcmV0dXJuIGNtLmNvb3Jkc0NoYXIoe2xlZnQ6IDAsIHRvcDogdG9wfSwgImRpdiIpCiAgfSwgc2VsX21vdmUpLAogIGdvTGluZUxlZnRTbWFydDogY20gPT4gY20uZXh0ZW5kU2VsZWN0aW9uc0J5KHJhbmdlID0+IHsKICAgIGxldCB0b3AgPSBjbS5jaGFyQ29vcmRzKHJhbmdlLmhlYWQsICJkaXYiKS50b3AgKyA1CiAgICBsZXQgcG9zID0gY20uY29vcmRzQ2hhcih7bGVmdDogMCwgdG9wOiB0b3B9LCAiZGl2IikKICAgIGlmIChwb3MuY2ggPCBjbS5nZXRMaW5lKHBvcy5saW5lKS5zZWFyY2goL1xTLykpIHJldHVybiBsaW5lU3RhcnRTbWFydChjbSwgcmFuZ2UuaGVhZCkKICAgIHJldHVybiBwb3MKICB9LCBzZWxfbW92ZSksCiAgZ29MaW5lVXA6IGNtID0+IGNtLm1vdmVWKC0xLCAibGluZSIpLAogIGdvTGluZURvd246IGNtID0+IGNtLm1vdmVWKDEsICJsaW5lIiksCiAgZ29QYWdlVXA6IGNtID0+IGNtLm1vdmVWKC0xLCAicGFnZSIpLAogIGdvUGFnZURvd246IGNtID0+IGNtLm1vdmVWKDEsICJwYWdlIiksCiAgZ29DaGFyTGVmdDogY20gPT4gY20ubW92ZUgoLTEsICJjaGFyIiksCiAgZ29DaGFyUmlnaHQ6IGNtID0+IGNtLm1vdmVIKDEsICJjaGFyIiksCiAgZ29Db2x1bW5MZWZ0OiBjbSA9PiBjbS5tb3ZlSCgtMSwgImNvbHVtbiIpLAogIGdvQ29sdW1uUmlnaHQ6IGNtID0+IGNtLm1vdmVIKDEsICJjb2x1bW4iKSwKICBnb1dvcmRMZWZ0OiBjbSA9PiBjbS5tb3ZlSCgtMSwgIndvcmQiKSwKICBnb0dyb3VwUmlnaHQ6IGNtID0+IGNtLm1vdmVIKDEsICJncm91cCIpLAogIGdvR3JvdXBMZWZ0OiBjbSA9PiBjbS5tb3ZlSCgtMSwgImdyb3VwIiksCiAgZ29Xb3JkUmlnaHQ6IGNtID0+IGNtLm1vdmVIKDEsICJ3b3JkIiksCiAgZGVsQ2hhckJlZm9yZTogY20gPT4gY20uZGVsZXRlSCgtMSwgImNoYXIiKSwKICBkZWxDaGFyQWZ0ZXI6IGNtID0+IGNtLmRlbGV0ZUgoMSwgImNoYXIiKSwKICBkZWxXb3JkQmVmb3JlOiBjbSA9PiBjbS5kZWxldGVIKC0xLCAid29yZCIpLAogIGRlbFdvcmRBZnRlcjogY20gPT4gY20uZGVsZXRlSCgxLCAid29yZCIpLAogIGRlbEdyb3VwQmVmb3JlOiBjbSA9PiBjbS5kZWxldGVIKC0xLCAiZ3JvdXAiKSwKICBkZWxHcm91cEFmdGVyOiBjbSA9PiBjbS5kZWxldGVIKDEsICJncm91cCIpLAogIGluZGVudEF1dG86IGNtID0+IGNtLmluZGVudFNlbGVjdGlvbigic21hcnQiKSwKICBpbmRlbnRNb3JlOiBjbSA9PiBjbS5pbmRlbnRTZWxlY3Rpb24oImFkZCIpLAogIGluZGVudExlc3M6IGNtID0+IGNtLmluZGVudFNlbGVjdGlvbigic3VidHJhY3QiKSwKICBpbnNlcnRUYWI6IGNtID0+IGNtLnJlcGxhY2VTZWxlY3Rpb24oIlx0IiksCiAgaW5zZXJ0U29mdFRhYjogY20gPT4gewogICAgbGV0IHNwYWNlcyA9IFtdLCByYW5nZXMgPSBjbS5saXN0U2VsZWN0aW9ucygpLCB0YWJTaXplID0gY20ub3B0aW9ucy50YWJTaXplCiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJhbmdlcy5sZW5ndGg7IGkrKykgewogICAgICBsZXQgcG9zID0gcmFuZ2VzW2ldLmZyb20oKQogICAgICBsZXQgY29sID0gY291bnRDb2x1bW4oY20uZ2V0TGluZShwb3MubGluZSksIHBvcy5jaCwgdGFiU2l6ZSkKICAgICAgc3BhY2VzLnB1c2goc3BhY2VTdHIodGFiU2l6ZSAtIGNvbCAlIHRhYlNpemUpKQogICAgfQogICAgY20ucmVwbGFjZVNlbGVjdGlvbnMoc3BhY2VzKQogIH0sCiAgZGVmYXVsdFRhYjogY20gPT4gewogICAgaWYgKGNtLnNvbWV0aGluZ1NlbGVjdGVkKCkpIGNtLmluZGVudFNlbGVjdGlvbigiYWRkIikKICAgIGVsc2UgY20uZXhlY0NvbW1hbmQoImluc2VydFRhYiIpCiAgfSwKICAvLyBTd2FwIHRoZSB0d28gY2hhcnMgbGVmdCBhbmQgcmlnaHQgb2YgZWFjaCBzZWxlY3Rpb24ncyBoZWFkLgogIC8vIE1vdmUgY3Vyc29yIGJlaGluZCB0aGUgdHdvIHN3YXBwZWQgY2hhcmFjdGVycyBhZnRlcndhcmRzLgogIC8vCiAgLy8gRG9lc24ndCBjb25zaWRlciBsaW5lIGZlZWRzIGEgY2hhcmFjdGVyLgogIC8vIERvZXNuJ3Qgc2NhbiBtb3JlIHRoYW4gb25lIGxpbmUgYWJvdmUgdG8gZmluZCBhIGNoYXJhY3Rlci4KICAvLyBEb2Vzbid0IGRvIGFueXRoaW5nIG9uIGFuIGVtcHR5IGxpbmUuCiAgLy8gRG9lc24ndCBkbyBhbnl0aGluZyB3aXRoIG5vbi1lbXB0eSBzZWxlY3Rpb25zLgogIHRyYW5zcG9zZUNoYXJzOiBjbSA9PiBydW5Jbk9wKGNtLCAoKSA9PiB7CiAgICBsZXQgcmFuZ2VzID0gY20ubGlzdFNlbGVjdGlvbnMoKSwgbmV3U2VsID0gW10KICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGlmICghcmFuZ2VzW2ldLmVtcHR5KCkpIGNvbnRpbnVlCiAgICAgIGxldCBjdXIgPSByYW5nZXNbaV0uaGVhZCwgbGluZSA9IGdldExpbmUoY20uZG9jLCBjdXIubGluZSkudGV4dAogICAgICBpZiAobGluZSkgewogICAgICAgIGlmIChjdXIuY2ggPT0gbGluZS5sZW5ndGgpIGN1ciA9IG5ldyBQb3MoY3VyLmxpbmUsIGN1ci5jaCAtIDEpCiAgICAgICAgaWYgKGN1ci5jaCA+IDApIHsKICAgICAgICAgIGN1ciA9IG5ldyBQb3MoY3VyLmxpbmUsIGN1ci5jaCArIDEpCiAgICAgICAgICBjbS5yZXBsYWNlUmFuZ2UobGluZS5jaGFyQXQoY3VyLmNoIC0gMSkgKyBsaW5lLmNoYXJBdChjdXIuY2ggLSAyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBQb3MoY3VyLmxpbmUsIGN1ci5jaCAtIDIpLCBjdXIsICIrdHJhbnNwb3NlIikKICAgICAgICB9IGVsc2UgaWYgKGN1ci5saW5lID4gY20uZG9jLmZpcnN0KSB7CiAgICAgICAgICBsZXQgcHJldiA9IGdldExpbmUoY20uZG9jLCBjdXIubGluZSAtIDEpLnRleHQKICAgICAgICAgIGlmIChwcmV2KSB7CiAgICAgICAgICAgIGN1ciA9IG5ldyBQb3MoY3VyLmxpbmUsIDEpCiAgICAgICAgICAgIGNtLnJlcGxhY2VSYW5nZShsaW5lLmNoYXJBdCgwKSArIGNtLmRvYy5saW5lU2VwYXJhdG9yKCkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldi5jaGFyQXQocHJldi5sZW5ndGggLSAxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvcyhjdXIubGluZSAtIDEsIHByZXYubGVuZ3RoIC0gMSksIGN1ciwgIit0cmFuc3Bvc2UiKQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBuZXdTZWwucHVzaChuZXcgUmFuZ2UoY3VyLCBjdXIpKQogICAgfQogICAgY20uc2V0U2VsZWN0aW9ucyhuZXdTZWwpCiAgfSksCiAgbmV3bGluZUFuZEluZGVudDogY20gPT4gcnVuSW5PcChjbSwgKCkgPT4gewogICAgbGV0IHNlbHMgPSBjbS5saXN0U2VsZWN0aW9ucygpCiAgICBmb3IgKGxldCBpID0gc2Vscy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkKICAgICAgY20ucmVwbGFjZVJhbmdlKGNtLmRvYy5saW5lU2VwYXJhdG9yKCksIHNlbHNbaV0uYW5jaG9yLCBzZWxzW2ldLmhlYWQsICIraW5wdXQiKQogICAgc2VscyA9IGNtLmxpc3RTZWxlY3Rpb25zKCkKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2Vscy5sZW5ndGg7IGkrKykKICAgICAgY20uaW5kZW50TGluZShzZWxzW2ldLmZyb20oKS5saW5lLCBudWxsLCB0cnVlKQogICAgZW5zdXJlQ3Vyc29yVmlzaWJsZShjbSkKICB9KSwKICBvcGVuTGluZTogY20gPT4gY20ucmVwbGFjZVNlbGVjdGlvbigiXG4iLCAic3RhcnQiKSwKICB0b2dnbGVPdmVyd3JpdGU6IGNtID0+IGNtLnRvZ2dsZU92ZXJ3cml0ZSgpCn0KCgpmdW5jdGlvbiBsaW5lU3RhcnQoY20sIGxpbmVOKSB7CiAgbGV0IGxpbmUgPSBnZXRMaW5lKGNtLmRvYywgbGluZU4pCiAgbGV0IHZpc3VhbCA9IHZpc3VhbExpbmUobGluZSkKICBpZiAodmlzdWFsICE9IGxpbmUpIGxpbmVOID0gbGluZU5vKHZpc3VhbCkKICBsZXQgb3JkZXIgPSBnZXRPcmRlcih2aXN1YWwpCiAgbGV0IGNoID0gIW9yZGVyID8gMCA6IG9yZGVyWzBdLmxldmVsICUgMiA/IGxpbmVSaWdodCh2aXN1YWwpIDogbGluZUxlZnQodmlzdWFsKQogIHJldHVybiBQb3MobGluZU4sIGNoKQp9CmZ1bmN0aW9uIGxpbmVFbmQoY20sIGxpbmVOKSB7CiAgbGV0IG1lcmdlZCwgbGluZSA9IGdldExpbmUoY20uZG9jLCBsaW5lTikKICB3aGlsZSAobWVyZ2VkID0gY29sbGFwc2VkU3BhbkF0RW5kKGxpbmUpKSB7CiAgICBsaW5lID0gbWVyZ2VkLmZpbmQoMSwgdHJ1ZSkubGluZQogICAgbGluZU4gPSBudWxsCiAgfQogIGxldCBvcmRlciA9IGdldE9yZGVyKGxpbmUpCiAgbGV0IGNoID0gIW9yZGVyID8gbGluZS50ZXh0Lmxlbmd0aCA6IG9yZGVyWzBdLmxldmVsICUgMiA/IGxpbmVMZWZ0KGxpbmUpIDogbGluZVJpZ2h0KGxpbmUpCiAgcmV0dXJuIFBvcyhsaW5lTiA9PSBudWxsID8gbGluZU5vKGxpbmUpIDogbGluZU4sIGNoKQp9CmZ1bmN0aW9uIGxpbmVTdGFydFNtYXJ0KGNtLCBwb3MpIHsKICBsZXQgc3RhcnQgPSBsaW5lU3RhcnQoY20sIHBvcy5saW5lKQogIGxldCBsaW5lID0gZ2V0TGluZShjbS5kb2MsIHN0YXJ0LmxpbmUpCiAgbGV0IG9yZGVyID0gZ2V0T3JkZXIobGluZSkKICBpZiAoIW9yZGVyIHx8IG9yZGVyWzBdLmxldmVsID09IDApIHsKICAgIGxldCBmaXJzdE5vbldTID0gTWF0aC5tYXgoMCwgbGluZS50ZXh0LnNlYXJjaCgvXFMvKSkKICAgIGxldCBpbldTID0gcG9zLmxpbmUgPT0gc3RhcnQubGluZSAmJiBwb3MuY2ggPD0gZmlyc3ROb25XUyAmJiBwb3MuY2gKICAgIHJldHVybiBQb3Moc3RhcnQubGluZSwgaW5XUyA/IDAgOiBmaXJzdE5vbldTKQogIH0KICByZXR1cm4gc3RhcnQKfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/src/edit/deleteNearSelection.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aW1wb3J0IHsgcnVuSW5PcCB9IGZyb20gIi4uL2Rpc3BsYXkvb3BlcmF0aW9ucyIKaW1wb3J0IHsgZW5zdXJlQ3Vyc29yVmlzaWJsZSB9IGZyb20gIi4uL2Rpc3BsYXkvc2Nyb2xsaW5nIgppbXBvcnQgeyBjbXAgfSBmcm9tICIuLi9saW5lL3BvcyIKaW1wb3J0IHsgcmVwbGFjZVJhbmdlIH0gZnJvbSAiLi4vbW9kZWwvY2hhbmdlcyIKaW1wb3J0IHsgbHN0IH0gZnJvbSAiLi4vdXRpbC9taXNjIgoKLy8gSGVscGVyIGZvciBkZWxldGluZyB0ZXh0IG5lYXIgdGhlIHNlbGVjdGlvbihzKSwgdXNlZCB0byBpbXBsZW1lbnQKLy8gYmFja3NwYWNlLCBkZWxldGUsIGFuZCBzaW1pbGFyIGZ1bmN0aW9uYWxpdHkuCmV4cG9ydCBmdW5jdGlvbiBkZWxldGVOZWFyU2VsZWN0aW9uKGNtLCBjb21wdXRlKSB7CiAgbGV0IHJhbmdlcyA9IGNtLmRvYy5zZWwucmFuZ2VzLCBraWxsID0gW10KICAvLyBCdWlsZCB1cCBhIHNldCBvZiByYW5nZXMgdG8ga2lsbCBmaXJzdCwgbWVyZ2luZyBvdmVybGFwcGluZwogIC8vIHJhbmdlcy4KICBmb3IgKGxldCBpID0gMDsgaSA8IHJhbmdlcy5sZW5ndGg7IGkrKykgewogICAgbGV0IHRvS2lsbCA9IGNvbXB1dGUocmFuZ2VzW2ldKQogICAgd2hpbGUgKGtpbGwubGVuZ3RoICYmIGNtcCh0b0tpbGwuZnJvbSwgbHN0KGtpbGwpLnRvKSA8PSAwKSB7CiAgICAgIGxldCByZXBsYWNlZCA9IGtpbGwucG9wKCkKICAgICAgaWYgKGNtcChyZXBsYWNlZC5mcm9tLCB0b0tpbGwuZnJvbSkgPCAwKSB7CiAgICAgICAgdG9LaWxsLmZyb20gPSByZXBsYWNlZC5mcm9tCiAgICAgICAgYnJlYWsKICAgICAgfQogICAgfQogICAga2lsbC5wdXNoKHRvS2lsbCkKICB9CiAgLy8gTmV4dCwgcmVtb3ZlIHRob3NlIGFjdHVhbCByYW5nZXMuCiAgcnVuSW5PcChjbSwgKCkgPT4gewogICAgZm9yIChsZXQgaSA9IGtpbGwubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pCiAgICAgIHJlcGxhY2VSYW5nZShjbS5kb2MsICIiLCBraWxsW2ldLmZyb20sIGtpbGxbaV0udG8sICIrZGVsZXRlIikKICAgIGVuc3VyZUN1cnNvclZpc2libGUoY20pCiAgfSkKfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/src/edit/drop_events.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aW1wb3J0IHsgZHJhd1NlbGVjdGlvbkN1cnNvciB9IGZyb20gIi4uL2Rpc3BsYXkvc2VsZWN0aW9uIgppbXBvcnQgeyBvcGVyYXRpb24gfSBmcm9tICIuLi9kaXNwbGF5L29wZXJhdGlvbnMiCmltcG9ydCB7IGNsaXBQb3MgfSBmcm9tICIuLi9saW5lL3BvcyIKaW1wb3J0IHsgcG9zRnJvbU1vdXNlIH0gZnJvbSAiLi4vbWVhc3VyZW1lbnQvcG9zaXRpb25fbWVhc3VyZW1lbnQiCmltcG9ydCB7IGV2ZW50SW5XaWRnZXQgfSBmcm9tICIuLi9tZWFzdXJlbWVudC93aWRnZXRzIgppbXBvcnQgeyBtYWtlQ2hhbmdlLCByZXBsYWNlUmFuZ2UgfSBmcm9tICIuLi9tb2RlbC9jaGFuZ2VzIgppbXBvcnQgeyBjaGFuZ2VFbmQgfSBmcm9tICIuLi9tb2RlbC9jaGFuZ2VfbWVhc3VyZW1lbnQiCmltcG9ydCB7IHNpbXBsZVNlbGVjdGlvbiB9IGZyb20gIi4uL21vZGVsL3NlbGVjdGlvbiIKaW1wb3J0IHsgc2V0U2VsZWN0aW9uTm9VbmRvLCBzZXRTZWxlY3Rpb25SZXBsYWNlSGlzdG9yeSB9IGZyb20gIi4uL21vZGVsL3NlbGVjdGlvbl91cGRhdGVzIgppbXBvcnQgeyBpZSwgcHJlc3RvLCBzYWZhcmkgfSBmcm9tICIuLi91dGlsL2Jyb3dzZXIiCmltcG9ydCB7IGVsdCwgcmVtb3ZlQ2hpbGRyZW5BbmRBZGQgfSBmcm9tICIuLi91dGlsL2RvbSIKaW1wb3J0IHsgZV9wcmV2ZW50RGVmYXVsdCwgZV9zdG9wLCBzaWduYWxET01FdmVudCB9IGZyb20gIi4uL3V0aWwvZXZlbnQiCmltcG9ydCB7IGluZGV4T2YgfSBmcm9tICIuLi91dGlsL21pc2MiCgovLyBLbHVkZ2UgdG8gd29yayBhcm91bmQgc3RyYW5nZSBJRSBiZWhhdmlvciB3aGVyZSBpdCdsbCBzb21ldGltZXMKLy8gcmUtZmlyZSBhIHNlcmllcyBvZiBkcmFnLXJlbGF0ZWQgZXZlbnRzIHJpZ2h0IGFmdGVyIHRoZSBkcm9wICgjMTU1MSkKbGV0IGxhc3REcm9wID0gMAoKZXhwb3J0IGZ1bmN0aW9uIG9uRHJvcChlKSB7CiAgbGV0IGNtID0gdGhpcwogIGNsZWFyRHJhZ0N1cnNvcihjbSkKICBpZiAoc2lnbmFsRE9NRXZlbnQoY20sIGUpIHx8IGV2ZW50SW5XaWRnZXQoY20uZGlzcGxheSwgZSkpCiAgICByZXR1cm4KICBlX3ByZXZlbnREZWZhdWx0KGUpCiAgaWYgKGllKSBsYXN0RHJvcCA9ICtuZXcgRGF0ZQogIGxldCBwb3MgPSBwb3NGcm9tTW91c2UoY20sIGUsIHRydWUpLCBmaWxlcyA9IGUuZGF0YVRyYW5zZmVyLmZpbGVzCiAgaWYgKCFwb3MgfHwgY20uaXNSZWFkT25seSgpKSByZXR1cm4KICAvLyBNaWdodCBiZSBhIGZpbGUgZHJvcCwgaW4gd2hpY2ggY2FzZSB3ZSBzaW1wbHkgZXh0cmFjdCB0aGUgdGV4dAogIC8vIGFuZCBpbnNlcnQgaXQuCiAgaWYgKGZpbGVzICYmIGZpbGVzLmxlbmd0aCAmJiB3aW5kb3cuRmlsZVJlYWRlciAmJiB3aW5kb3cuRmlsZSkgewogICAgbGV0IG4gPSBmaWxlcy5sZW5ndGgsIHRleHQgPSBBcnJheShuKSwgcmVhZCA9IDAKICAgIGxldCBsb2FkRmlsZSA9IChmaWxlLCBpKSA9PiB7CiAgICAgIGlmIChjbS5vcHRpb25zLmFsbG93RHJvcEZpbGVUeXBlcyAmJgogICAgICAgICAgaW5kZXhPZihjbS5vcHRpb25zLmFsbG93RHJvcEZpbGVUeXBlcywgZmlsZS50eXBlKSA9PSAtMSkKICAgICAgICByZXR1cm4KCiAgICAgIGxldCByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcgogICAgICByZWFkZXIub25sb2FkID0gb3BlcmF0aW9uKGNtLCAoKSA9PiB7CiAgICAgICAgbGV0IGNvbnRlbnQgPSByZWFkZXIucmVzdWx0CiAgICAgICAgaWYgKC9bXHgwMC1ceDA4XHgwZS1ceDFmXXsyfS8udGVzdChjb250ZW50KSkgY29udGVudCA9ICIiCiAgICAgICAgdGV4dFtpXSA9IGNvbnRlbnQKICAgICAgICBpZiAoKytyZWFkID09IG4pIHsKICAgICAgICAgIHBvcyA9IGNsaXBQb3MoY20uZG9jLCBwb3MpCiAgICAgICAgICBsZXQgY2hhbmdlID0ge2Zyb206IHBvcywgdG86IHBvcywKICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogY20uZG9jLnNwbGl0TGluZXModGV4dC5qb2luKGNtLmRvYy5saW5lU2VwYXJhdG9yKCkpKSwKICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luOiAicGFzdGUifQogICAgICAgICAgbWFrZUNoYW5nZShjbS5kb2MsIGNoYW5nZSkKICAgICAgICAgIHNldFNlbGVjdGlvblJlcGxhY2VIaXN0b3J5KGNtLmRvYywgc2ltcGxlU2VsZWN0aW9uKHBvcywgY2hhbmdlRW5kKGNoYW5nZSkpKQogICAgICAgIH0KICAgICAgfSkKICAgICAgcmVhZGVyLnJlYWRBc1RleHQoZmlsZSkKICAgIH0KICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbjsgKytpKSBsb2FkRmlsZShmaWxlc1tpXSwgaSkKICB9IGVsc2UgeyAvLyBOb3JtYWwgZHJvcAogICAgLy8gRG9uJ3QgZG8gYSByZXBsYWNlIGlmIHRoZSBkcm9wIGhhcHBlbmVkIGluc2lkZSBvZiB0aGUgc2VsZWN0ZWQgdGV4dC4KICAgIGlmIChjbS5zdGF0ZS5kcmFnZ2luZ1RleHQgJiYgY20uZG9jLnNlbC5jb250YWlucyhwb3MpID4gLTEpIHsKICAgICAgY20uc3RhdGUuZHJhZ2dpbmdUZXh0KGUpCiAgICAgIC8vIEVuc3VyZSB0aGUgZWRpdG9yIGlzIHJlLWZvY3VzZWQKICAgICAgc2V0VGltZW91dCgoKSA9PiBjbS5kaXNwbGF5LmlucHV0LmZvY3VzKCksIDIwKQogICAgICByZXR1cm4KICAgIH0KICAgIHRyeSB7CiAgICAgIGxldCB0ZXh0ID0gZS5kYXRhVHJhbnNmZXIuZ2V0RGF0YSgiVGV4dCIpCiAgICAgIGlmICh0ZXh0KSB7CiAgICAgICAgbGV0IHNlbGVjdGVkCiAgICAgICAgaWYgKGNtLnN0YXRlLmRyYWdnaW5nVGV4dCAmJiAhY20uc3RhdGUuZHJhZ2dpbmdUZXh0LmNvcHkpCiAgICAgICAgICBzZWxlY3RlZCA9IGNtLmxpc3RTZWxlY3Rpb25zKCkKICAgICAgICBzZXRTZWxlY3Rpb25Ob1VuZG8oY20uZG9jLCBzaW1wbGVTZWxlY3Rpb24ocG9zLCBwb3MpKQogICAgICAgIGlmIChzZWxlY3RlZCkgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWxlY3RlZC5sZW5ndGg7ICsraSkKICAgICAgICAgIHJlcGxhY2VSYW5nZShjbS5kb2MsICIiLCBzZWxlY3RlZFtpXS5hbmNob3IsIHNlbGVjdGVkW2ldLmhlYWQsICJkcmFnIikKICAgICAgICBjbS5yZXBsYWNlU2VsZWN0aW9uKHRleHQsICJhcm91bmQiLCAicGFzdGUiKQogICAgICAgIGNtLmRpc3BsYXkuaW5wdXQuZm9jdXMoKQogICAgICB9CiAgICB9CiAgICBjYXRjaChlKXt9CiAgfQp9CgpleHBvcnQgZnVuY3Rpb24gb25EcmFnU3RhcnQoY20sIGUpIHsKICBpZiAoaWUgJiYgKCFjbS5zdGF0ZS5kcmFnZ2luZ1RleHQgfHwgK25ldyBEYXRlIC0gbGFzdERyb3AgPCAxMDApKSB7IGVfc3RvcChlKTsgcmV0dXJuIH0KICBpZiAoc2lnbmFsRE9NRXZlbnQoY20sIGUpIHx8IGV2ZW50SW5XaWRnZXQoY20uZGlzcGxheSwgZSkpIHJldHVybgoKICBlLmRhdGFUcmFuc2Zlci5zZXREYXRhKCJUZXh0IiwgY20uZ2V0U2VsZWN0aW9uKCkpCiAgZS5kYXRhVHJhbnNmZXIuZWZmZWN0QWxsb3dlZCA9ICJjb3B5TW92ZSIKCiAgLy8gVXNlIGR1bW15IGltYWdlIGluc3RlYWQgb2YgZGVmYXVsdCBicm93c2VycyBpbWFnZS4KICAvLyBSZWNlbnQgU2FmYXJpICh+Ni4wLjIpIGhhdmUgYSB0ZW5kZW5jeSB0byBzZWdmYXVsdCB3aGVuIHRoaXMgaGFwcGVucywgc28gd2UgZG9uJ3QgZG8gaXQgdGhlcmUuCiAgaWYgKGUuZGF0YVRyYW5zZmVyLnNldERyYWdJbWFnZSAmJiAhc2FmYXJpKSB7CiAgICBsZXQgaW1nID0gZWx0KCJpbWciLCBudWxsLCBudWxsLCAicG9zaXRpb246IGZpeGVkOyBsZWZ0OiAwOyB0b3A6IDA7IikKICAgIGltZy5zcmMgPSAiZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoQVFBQkFBQUFBQ0g1QkFFS0FBRUFMQUFBQUFBQkFBRUFBQUlDVEFFQU93PT0iCiAgICBpZiAocHJlc3RvKSB7CiAgICAgIGltZy53aWR0aCA9IGltZy5oZWlnaHQgPSAxCiAgICAgIGNtLmRpc3BsYXkud3JhcHBlci5hcHBlbmRDaGlsZChpbWcpCiAgICAgIC8vIEZvcmNlIGEgcmVsYXlvdXQsIG9yIE9wZXJhIHdvbid0IHVzZSBvdXIgaW1hZ2UgZm9yIHNvbWUgb2JzY3VyZSByZWFzb24KICAgICAgaW1nLl90b3AgPSBpbWcub2Zmc2V0VG9wCiAgICB9CiAgICBlLmRhdGFUcmFuc2Zlci5zZXREcmFnSW1hZ2UoaW1nLCAwLCAwKQogICAgaWYgKHByZXN0bykgaW1nLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoaW1nKQogIH0KfQoKZXhwb3J0IGZ1bmN0aW9uIG9uRHJhZ092ZXIoY20sIGUpIHsKICBsZXQgcG9zID0gcG9zRnJvbU1vdXNlKGNtLCBlKQogIGlmICghcG9zKSByZXR1cm4KICBsZXQgZnJhZyA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKQogIGRyYXdTZWxlY3Rpb25DdXJzb3IoY20sIHBvcywgZnJhZykKICBpZiAoIWNtLmRpc3BsYXkuZHJhZ0N1cnNvcikgewogICAgY20uZGlzcGxheS5kcmFnQ3Vyc29yID0gZWx0KCJkaXYiLCBudWxsLCAiQ29kZU1pcnJvci1jdXJzb3JzIENvZGVNaXJyb3ItZHJhZ2N1cnNvcnMiKQogICAgY20uZGlzcGxheS5saW5lU3BhY2UuaW5zZXJ0QmVmb3JlKGNtLmRpc3BsYXkuZHJhZ0N1cnNvciwgY20uZGlzcGxheS5jdXJzb3JEaXYpCiAgfQogIHJlbW92ZUNoaWxkcmVuQW5kQWRkKGNtLmRpc3BsYXkuZHJhZ0N1cnNvciwgZnJhZykKfQoKZXhwb3J0IGZ1bmN0aW9uIGNsZWFyRHJhZ0N1cnNvcihjbSkgewogIGlmIChjbS5kaXNwbGF5LmRyYWdDdXJzb3IpIHsKICAgIGNtLmRpc3BsYXkubGluZVNwYWNlLnJlbW92ZUNoaWxkKGNtLmRpc3BsYXkuZHJhZ0N1cnNvcikKICAgIGNtLmRpc3BsYXkuZHJhZ0N1cnNvciA9IG51bGwKICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/src/edit/fromTextArea.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aW1wb3J0IHsgQ29kZU1pcnJvciB9IGZyb20gIi4vQ29kZU1pcnJvciIKaW1wb3J0IHsgYWN0aXZlRWx0IH0gZnJvbSAiLi4vdXRpbC9kb20iCmltcG9ydCB7IG9mZiwgb24gfSBmcm9tICIuLi91dGlsL2V2ZW50IgppbXBvcnQgeyBjb3B5T2JqIH0gZnJvbSAiLi4vdXRpbC9taXNjIgoKZXhwb3J0IGZ1bmN0aW9uIGZyb21UZXh0QXJlYSh0ZXh0YXJlYSwgb3B0aW9ucykgewogIG9wdGlvbnMgPSBvcHRpb25zID8gY29weU9iaihvcHRpb25zKSA6IHt9CiAgb3B0aW9ucy52YWx1ZSA9IHRleHRhcmVhLnZhbHVlCiAgaWYgKCFvcHRpb25zLnRhYmluZGV4ICYmIHRleHRhcmVhLnRhYkluZGV4KQogICAgb3B0aW9ucy50YWJpbmRleCA9IHRleHRhcmVhLnRhYkluZGV4CiAgaWYgKCFvcHRpb25zLnBsYWNlaG9sZGVyICYmIHRleHRhcmVhLnBsYWNlaG9sZGVyKQogICAgb3B0aW9ucy5wbGFjZWhvbGRlciA9IHRleHRhcmVhLnBsYWNlaG9sZGVyCiAgLy8gU2V0IGF1dG9mb2N1cyB0byB0cnVlIGlmIHRoaXMgdGV4dGFyZWEgaXMgZm9jdXNlZCwgb3IgaWYgaXQgaGFzCiAgLy8gYXV0b2ZvY3VzIGFuZCBubyBvdGhlciBlbGVtZW50IGlzIGZvY3VzZWQuCiAgaWYgKG9wdGlvbnMuYXV0b2ZvY3VzID09IG51bGwpIHsKICAgIGxldCBoYXNGb2N1cyA9IGFjdGl2ZUVsdCgpCiAgICBvcHRpb25zLmF1dG9mb2N1cyA9IGhhc0ZvY3VzID09IHRleHRhcmVhIHx8CiAgICAgIHRleHRhcmVhLmdldEF0dHJpYnV0ZSgiYXV0b2ZvY3VzIikgIT0gbnVsbCAmJiBoYXNGb2N1cyA9PSBkb2N1bWVudC5ib2R5CiAgfQoKICBmdW5jdGlvbiBzYXZlKCkge3RleHRhcmVhLnZhbHVlID0gY20uZ2V0VmFsdWUoKX0KCiAgbGV0IHJlYWxTdWJtaXQKICBpZiAodGV4dGFyZWEuZm9ybSkgewogICAgb24odGV4dGFyZWEuZm9ybSwgInN1Ym1pdCIsIHNhdmUpCiAgICAvLyBEZXBsb3JhYmxlIGhhY2sgdG8gbWFrZSB0aGUgc3VibWl0IG1ldGhvZCBkbyB0aGUgcmlnaHQgdGhpbmcuCiAgICBpZiAoIW9wdGlvbnMubGVhdmVTdWJtaXRNZXRob2RBbG9uZSkgewogICAgICBsZXQgZm9ybSA9IHRleHRhcmVhLmZvcm0KICAgICAgcmVhbFN1Ym1pdCA9IGZvcm0uc3VibWl0CiAgICAgIHRyeSB7CiAgICAgICAgbGV0IHdyYXBwZWRTdWJtaXQgPSBmb3JtLnN1Ym1pdCA9ICgpID0+IHsKICAgICAgICAgIHNhdmUoKQogICAgICAgICAgZm9ybS5zdWJtaXQgPSByZWFsU3VibWl0CiAgICAgICAgICBmb3JtLnN1Ym1pdCgpCiAgICAgICAgICBmb3JtLnN1Ym1pdCA9IHdyYXBwZWRTdWJtaXQKICAgICAgICB9CiAgICAgIH0gY2F0Y2goZSkge30KICAgIH0KICB9CgogIG9wdGlvbnMuZmluaXNoSW5pdCA9IGNtID0+IHsKICAgIGNtLnNhdmUgPSBzYXZlCiAgICBjbS5nZXRUZXh0QXJlYSA9ICgpID0+IHRleHRhcmVhCiAgICBjbS50b1RleHRBcmVhID0gKCkgPT4gewogICAgICBjbS50b1RleHRBcmVhID0gaXNOYU4gLy8gUHJldmVudCB0aGlzIGZyb20gYmVpbmcgcmFuIHR3aWNlCiAgICAgIHNhdmUoKQogICAgICB0ZXh0YXJlYS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGNtLmdldFdyYXBwZXJFbGVtZW50KCkpCiAgICAgIHRleHRhcmVhLnN0eWxlLmRpc3BsYXkgPSAiIgogICAgICBpZiAodGV4dGFyZWEuZm9ybSkgewogICAgICAgIG9mZih0ZXh0YXJlYS5mb3JtLCAic3VibWl0Iiwgc2F2ZSkKICAgICAgICBpZiAodHlwZW9mIHRleHRhcmVhLmZvcm0uc3VibWl0ID09ICJmdW5jdGlvbiIpCiAgICAgICAgICB0ZXh0YXJlYS5mb3JtLnN1Ym1pdCA9IHJlYWxTdWJtaXQKICAgICAgfQogICAgfQogIH0KCiAgdGV4dGFyZWEuc3R5bGUuZGlzcGxheSA9ICJub25lIgogIGxldCBjbSA9IENvZGVNaXJyb3Iobm9kZSA9PiB0ZXh0YXJlYS5wYXJlbnROb2RlLmluc2VydEJlZm9yZShub2RlLCB0ZXh0YXJlYS5uZXh0U2libGluZyksCiAgICBvcHRpb25zKQogIHJldHVybiBjbQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/src/edit/global_events.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aW1wb3J0IHsgb25CbHVyIH0gZnJvbSAiLi4vZGlzcGxheS9mb2N1cyIKaW1wb3J0IHsgb24gfSBmcm9tICIuLi91dGlsL2V2ZW50IgoKLy8gVGhlc2UgbXVzdCBiZSBoYW5kbGVkIGNhcmVmdWxseSwgYmVjYXVzZSBuYWl2ZWx5IHJlZ2lzdGVyaW5nIGEKLy8gaGFuZGxlciBmb3IgZWFjaCBlZGl0b3Igd2lsbCBjYXVzZSB0aGUgZWRpdG9ycyB0byBuZXZlciBiZQovLyBnYXJiYWdlIGNvbGxlY3RlZC4KCmZ1bmN0aW9uIGZvckVhY2hDb2RlTWlycm9yKGYpIHsKICBpZiAoIWRvY3VtZW50LmJvZHkuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSkgcmV0dXJuCiAgbGV0IGJ5Q2xhc3MgPSBkb2N1bWVudC5ib2R5LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIkNvZGVNaXJyb3IiKQogIGZvciAobGV0IGkgPSAwOyBpIDwgYnlDbGFzcy5sZW5ndGg7IGkrKykgewogICAgbGV0IGNtID0gYnlDbGFzc1tpXS5Db2RlTWlycm9yCiAgICBpZiAoY20pIGYoY20pCiAgfQp9CgpsZXQgZ2xvYmFsc1JlZ2lzdGVyZWQgPSBmYWxzZQpleHBvcnQgZnVuY3Rpb24gZW5zdXJlR2xvYmFsSGFuZGxlcnMoKSB7CiAgaWYgKGdsb2JhbHNSZWdpc3RlcmVkKSByZXR1cm4KICByZWdpc3Rlckdsb2JhbEhhbmRsZXJzKCkKICBnbG9iYWxzUmVnaXN0ZXJlZCA9IHRydWUKfQpmdW5jdGlvbiByZWdpc3Rlckdsb2JhbEhhbmRsZXJzKCkgewogIC8vIFdoZW4gdGhlIHdpbmRvdyByZXNpemVzLCB3ZSBuZWVkIHRvIHJlZnJlc2ggYWN0aXZlIGVkaXRvcnMuCiAgbGV0IHJlc2l6ZVRpbWVyCiAgb24od2luZG93LCAicmVzaXplIiwgKCkgPT4gewogICAgaWYgKHJlc2l6ZVRpbWVyID09IG51bGwpIHJlc2l6ZVRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7CiAgICAgIHJlc2l6ZVRpbWVyID0gbnVsbAogICAgICBmb3JFYWNoQ29kZU1pcnJvcihvblJlc2l6ZSkKICAgIH0sIDEwMCkKICB9KQogIC8vIFdoZW4gdGhlIHdpbmRvdyBsb3NlcyBmb2N1cywgd2Ugd2FudCB0byBzaG93IHRoZSBlZGl0b3IgYXMgYmx1cnJlZAogIG9uKHdpbmRvdywgImJsdXIiLCAoKSA9PiBmb3JFYWNoQ29kZU1pcnJvcihvbkJsdXIpKQp9Ci8vIENhbGxlZCB3aGVuIHRoZSB3aW5kb3cgcmVzaXplcwpmdW5jdGlvbiBvblJlc2l6ZShjbSkgewogIGxldCBkID0gY20uZGlzcGxheQogIGlmIChkLmxhc3RXcmFwSGVpZ2h0ID09IGQud3JhcHBlci5jbGllbnRIZWlnaHQgJiYgZC5sYXN0V3JhcFdpZHRoID09IGQud3JhcHBlci5jbGllbnRXaWR0aCkKICAgIHJldHVybgogIC8vIE1pZ2h0IGJlIGEgdGV4dCBzY2FsaW5nIG9wZXJhdGlvbiwgY2xlYXIgc2l6ZSBjYWNoZXMuCiAgZC5jYWNoZWRDaGFyV2lkdGggPSBkLmNhY2hlZFRleHRIZWlnaHQgPSBkLmNhY2hlZFBhZGRpbmdIID0gbnVsbAogIGQuc2Nyb2xsYmFyc0NsaXBwZWQgPSBmYWxzZQogIGNtLnNldFNpemUoKQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/src/edit/key_events.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aW1wb3J0IHsgc2lnbmFsTGF0ZXIgfSBmcm9tICIuLi91dGlsL29wZXJhdGlvbl9ncm91cCIKaW1wb3J0IHsgcmVzdGFydEJsaW5rIH0gZnJvbSAiLi4vZGlzcGxheS9zZWxlY3Rpb24iCmltcG9ydCB7IGlzTW9kaWZpZXJLZXksIGtleU5hbWUsIGxvb2t1cEtleSB9IGZyb20gIi4uL2lucHV0L2tleW1hcCIKaW1wb3J0IHsgZXZlbnRJbldpZGdldCB9IGZyb20gIi4uL21lYXN1cmVtZW50L3dpZGdldHMiCmltcG9ydCB7IGllLCBpZV92ZXJzaW9uLCBtYWMsIHByZXN0byB9IGZyb20gIi4uL3V0aWwvYnJvd3NlciIKaW1wb3J0IHsgYWN0aXZlRWx0LCBhZGRDbGFzcywgcm1DbGFzcyB9IGZyb20gIi4uL3V0aWwvZG9tIgppbXBvcnQgeyBlX3ByZXZlbnREZWZhdWx0LCBvZmYsIG9uLCBzaWduYWxET01FdmVudCB9IGZyb20gIi4uL3V0aWwvZXZlbnQiCmltcG9ydCB7IGhhc0NvcHlFdmVudCB9IGZyb20gIi4uL3V0aWwvZmVhdHVyZV9kZXRlY3Rpb24iCmltcG9ydCB7IERlbGF5ZWQsIFBhc3MgfSBmcm9tICIuLi91dGlsL21pc2MiCgppbXBvcnQgeyBjb21tYW5kcyB9IGZyb20gIi4vY29tbWFuZHMiCgovLyBSdW4gYSBoYW5kbGVyIHRoYXQgd2FzIGJvdW5kIHRvIGEga2V5LgpmdW5jdGlvbiBkb0hhbmRsZUJpbmRpbmcoY20sIGJvdW5kLCBkcm9wU2hpZnQpIHsKICBpZiAodHlwZW9mIGJvdW5kID09ICJzdHJpbmciKSB7CiAgICBib3VuZCA9IGNvbW1hbmRzW2JvdW5kXQogICAgaWYgKCFib3VuZCkgcmV0dXJuIGZhbHNlCiAgfQogIC8vIEVuc3VyZSBwcmV2aW91cyBpbnB1dCBoYXMgYmVlbiByZWFkLCBzbyB0aGF0IHRoZSBoYW5kbGVyIHNlZXMgYQogIC8vIGNvbnNpc3RlbnQgdmlldyBvZiB0aGUgZG9jdW1lbnQKICBjbS5kaXNwbGF5LmlucHV0LmVuc3VyZVBvbGxlZCgpCiAgbGV0IHByZXZTaGlmdCA9IGNtLmRpc3BsYXkuc2hpZnQsIGRvbmUgPSBmYWxzZQogIHRyeSB7CiAgICBpZiAoY20uaXNSZWFkT25seSgpKSBjbS5zdGF0ZS5zdXBwcmVzc0VkaXRzID0gdHJ1ZQogICAgaWYgKGRyb3BTaGlmdCkgY20uZGlzcGxheS5zaGlmdCA9IGZhbHNlCiAgICBkb25lID0gYm91bmQoY20pICE9IFBhc3MKICB9IGZpbmFsbHkgewogICAgY20uZGlzcGxheS5zaGlmdCA9IHByZXZTaGlmdAogICAgY20uc3RhdGUuc3VwcHJlc3NFZGl0cyA9IGZhbHNlCiAgfQogIHJldHVybiBkb25lCn0KCmZ1bmN0aW9uIGxvb2t1cEtleUZvckVkaXRvcihjbSwgbmFtZSwgaGFuZGxlKSB7CiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjbS5zdGF0ZS5rZXlNYXBzLmxlbmd0aDsgaSsrKSB7CiAgICBsZXQgcmVzdWx0ID0gbG9va3VwS2V5KG5hbWUsIGNtLnN0YXRlLmtleU1hcHNbaV0sIGhhbmRsZSwgY20pCiAgICBpZiAocmVzdWx0KSByZXR1cm4gcmVzdWx0CiAgfQogIHJldHVybiAoY20ub3B0aW9ucy5leHRyYUtleXMgJiYgbG9va3VwS2V5KG5hbWUsIGNtLm9wdGlvbnMuZXh0cmFLZXlzLCBoYW5kbGUsIGNtKSkKICAgIHx8IGxvb2t1cEtleShuYW1lLCBjbS5vcHRpb25zLmtleU1hcCwgaGFuZGxlLCBjbSkKfQoKbGV0IHN0b3BTZXEgPSBuZXcgRGVsYXllZApmdW5jdGlvbiBkaXNwYXRjaEtleShjbSwgbmFtZSwgZSwgaGFuZGxlKSB7CiAgbGV0IHNlcSA9IGNtLnN0YXRlLmtleVNlcQogIGlmIChzZXEpIHsKICAgIGlmIChpc01vZGlmaWVyS2V5KG5hbWUpKSByZXR1cm4gImhhbmRsZWQiCiAgICBzdG9wU2VxLnNldCg1MCwgKCkgPT4gewogICAgICBpZiAoY20uc3RhdGUua2V5U2VxID09IHNlcSkgewogICAgICAgIGNtLnN0YXRlLmtleVNlcSA9IG51bGwKICAgICAgICBjbS5kaXNwbGF5LmlucHV0LnJlc2V0KCkKICAgICAgfQogICAgfSkKICAgIG5hbWUgPSBzZXEgKyAiICIgKyBuYW1lCiAgfQogIGxldCByZXN1bHQgPSBsb29rdXBLZXlGb3JFZGl0b3IoY20sIG5hbWUsIGhhbmRsZSkKCiAgaWYgKHJlc3VsdCA9PSAibXVsdGkiKQogICAgY20uc3RhdGUua2V5U2VxID0gbmFtZQogIGlmIChyZXN1bHQgPT0gImhhbmRsZWQiKQogICAgc2lnbmFsTGF0ZXIoY20sICJrZXlIYW5kbGVkIiwgY20sIG5hbWUsIGUpCgogIGlmIChyZXN1bHQgPT0gImhhbmRsZWQiIHx8IHJlc3VsdCA9PSAibXVsdGkiKSB7CiAgICBlX3ByZXZlbnREZWZhdWx0KGUpCiAgICByZXN0YXJ0QmxpbmsoY20pCiAgfQoKICBpZiAoc2VxICYmICFyZXN1bHQgJiYgL1wnJC8udGVzdChuYW1lKSkgewogICAgZV9wcmV2ZW50RGVmYXVsdChlKQogICAgcmV0dXJuIHRydWUKICB9CiAgcmV0dXJuICEhcmVzdWx0Cn0KCi8vIEhhbmRsZSBhIGtleSBmcm9tIHRoZSBrZXlkb3duIGV2ZW50LgpmdW5jdGlvbiBoYW5kbGVLZXlCaW5kaW5nKGNtLCBlKSB7CiAgbGV0IG5hbWUgPSBrZXlOYW1lKGUsIHRydWUpCiAgaWYgKCFuYW1lKSByZXR1cm4gZmFsc2UKCiAgaWYgKGUuc2hpZnRLZXkgJiYgIWNtLnN0YXRlLmtleVNlcSkgewogICAgLy8gRmlyc3QgdHJ5IHRvIHJlc29sdmUgZnVsbCBuYW1lIChpbmNsdWRpbmcgJ1NoaWZ0LScpLiBGYWlsaW5nCiAgICAvLyB0aGF0LCBzZWUgaWYgdGhlcmUgaXMgYSBjdXJzb3ItbW90aW9uIGNvbW1hbmQgKHN0YXJ0aW5nIHdpdGgKICAgIC8vICdnbycpIGJvdW5kIHRvIHRoZSBrZXluYW1lIHdpdGhvdXQgJ1NoaWZ0LScuCiAgICByZXR1cm4gZGlzcGF0Y2hLZXkoY20sICJTaGlmdC0iICsgbmFtZSwgZSwgYiA9PiBkb0hhbmRsZUJpbmRpbmcoY20sIGIsIHRydWUpKQogICAgICAgIHx8IGRpc3BhdGNoS2V5KGNtLCBuYW1lLCBlLCBiID0+IHsKICAgICAgICAgICAgIGlmICh0eXBlb2YgYiA9PSAic3RyaW5nIiA/IC9eZ29bQS1aXS8udGVzdChiKSA6IGIubW90aW9uKQogICAgICAgICAgICAgICByZXR1cm4gZG9IYW5kbGVCaW5kaW5nKGNtLCBiKQogICAgICAgICAgIH0pCiAgfSBlbHNlIHsKICAgIHJldHVybiBkaXNwYXRjaEtleShjbSwgbmFtZSwgZSwgYiA9PiBkb0hhbmRsZUJpbmRpbmcoY20sIGIpKQogIH0KfQoKLy8gSGFuZGxlIGEga2V5IGZyb20gdGhlIGtleXByZXNzIGV2ZW50CmZ1bmN0aW9uIGhhbmRsZUNoYXJCaW5kaW5nKGNtLCBlLCBjaCkgewogIHJldHVybiBkaXNwYXRjaEtleShjbSwgIiciICsgY2ggKyAiJyIsIGUsIGIgPT4gZG9IYW5kbGVCaW5kaW5nKGNtLCBiLCB0cnVlKSkKfQoKbGV0IGxhc3RTdG9wcGVkS2V5ID0gbnVsbApleHBvcnQgZnVuY3Rpb24gb25LZXlEb3duKGUpIHsKICBsZXQgY20gPSB0aGlzCiAgY20uY3VyT3AuZm9jdXMgPSBhY3RpdmVFbHQoKQogIGlmIChzaWduYWxET01FdmVudChjbSwgZSkpIHJldHVybgogIC8vIElFIGRvZXMgc3RyYW5nZSB0aGluZ3Mgd2l0aCBlc2NhcGUuCiAgaWYgKGllICYmIGllX3ZlcnNpb24gPCAxMSAmJiBlLmtleUNvZGUgPT0gMjcpIGUucmV0dXJuVmFsdWUgPSBmYWxzZQogIGxldCBjb2RlID0gZS5rZXlDb2RlCiAgY20uZGlzcGxheS5zaGlmdCA9IGNvZGUgPT0gMTYgfHwgZS5zaGlmdEtleQogIGxldCBoYW5kbGVkID0gaGFuZGxlS2V5QmluZGluZyhjbSwgZSkKICBpZiAocHJlc3RvKSB7CiAgICBsYXN0U3RvcHBlZEtleSA9IGhhbmRsZWQgPyBjb2RlIDogbnVsbAogICAgLy8gT3BlcmEgaGFzIG5vIGN1dCBldmVudC4uLiB3ZSB0cnkgdG8gYXQgbGVhc3QgY2F0Y2ggdGhlIGtleSBjb21ibwogICAgaWYgKCFoYW5kbGVkICYmIGNvZGUgPT0gODggJiYgIWhhc0NvcHlFdmVudCAmJiAobWFjID8gZS5tZXRhS2V5IDogZS5jdHJsS2V5KSkKICAgICAgY20ucmVwbGFjZVNlbGVjdGlvbigiIiwgbnVsbCwgImN1dCIpCiAgfQoKICAvLyBUdXJuIG1vdXNlIGludG8gY3Jvc3NoYWlyIHdoZW4gQWx0IGlzIGhlbGQgb24gTWFjLgogIGlmIChjb2RlID09IDE4ICYmICEvXGJDb2RlTWlycm9yLWNyb3NzaGFpclxiLy50ZXN0KGNtLmRpc3BsYXkubGluZURpdi5jbGFzc05hbWUpKQogICAgc2hvd0Nyb3NzSGFpcihjbSkKfQoKZnVuY3Rpb24gc2hvd0Nyb3NzSGFpcihjbSkgewogIGxldCBsaW5lRGl2ID0gY20uZGlzcGxheS5saW5lRGl2CiAgYWRkQ2xhc3MobGluZURpdiwgIkNvZGVNaXJyb3ItY3Jvc3NoYWlyIikKCiAgZnVuY3Rpb24gdXAoZSkgewogICAgaWYgKGUua2V5Q29kZSA9PSAxOCB8fCAhZS5hbHRLZXkpIHsKICAgICAgcm1DbGFzcyhsaW5lRGl2LCAiQ29kZU1pcnJvci1jcm9zc2hhaXIiKQogICAgICBvZmYoZG9jdW1lbnQsICJrZXl1cCIsIHVwKQogICAgICBvZmYoZG9jdW1lbnQsICJtb3VzZW92ZXIiLCB1cCkKICAgIH0KICB9CiAgb24oZG9jdW1lbnQsICJrZXl1cCIsIHVwKQogIG9uKGRvY3VtZW50LCAibW91c2VvdmVyIiwgdXApCn0KCmV4cG9ydCBmdW5jdGlvbiBvbktleVVwKGUpIHsKICBpZiAoZS5rZXlDb2RlID09IDE2KSB0aGlzLmRvYy5zZWwuc2hpZnQgPSBmYWxzZQogIHNpZ25hbERPTUV2ZW50KHRoaXMsIGUpCn0KCmV4cG9ydCBmdW5jdGlvbiBvbktleVByZXNzKGUpIHsKICBsZXQgY20gPSB0aGlzCiAgaWYgKGV2ZW50SW5XaWRnZXQoY20uZGlzcGxheSwgZSkgfHwgc2lnbmFsRE9NRXZlbnQoY20sIGUpIHx8IGUuY3RybEtleSAmJiAhZS5hbHRLZXkgfHwgbWFjICYmIGUubWV0YUtleSkgcmV0dXJuCiAgbGV0IGtleUNvZGUgPSBlLmtleUNvZGUsIGNoYXJDb2RlID0gZS5jaGFyQ29kZQogIGlmIChwcmVzdG8gJiYga2V5Q29kZSA9PSBsYXN0U3RvcHBlZEtleSkge2xhc3RTdG9wcGVkS2V5ID0gbnVsbDsgZV9wcmV2ZW50RGVmYXVsdChlKTsgcmV0dXJufQogIGlmICgocHJlc3RvICYmICghZS53aGljaCB8fCBlLndoaWNoIDwgMTApKSAmJiBoYW5kbGVLZXlCaW5kaW5nKGNtLCBlKSkgcmV0dXJuCiAgbGV0IGNoID0gU3RyaW5nLmZyb21DaGFyQ29kZShjaGFyQ29kZSA9PSBudWxsID8ga2V5Q29kZSA6IGNoYXJDb2RlKQogIC8vIFNvbWUgYnJvd3NlcnMgZmlyZSBrZXlwcmVzcyBldmVudHMgZm9yIGJhY2tzcGFjZQogIGlmIChjaCA9PSAiXHgwOCIpIHJldHVybgogIGlmIChoYW5kbGVDaGFyQmluZGluZyhjbSwgZSwgY2gpKSByZXR1cm4KICBjbS5kaXNwbGF5LmlucHV0Lm9uS2V5UHJlc3MoZSkKfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/src/edit/legacy.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aW1wb3J0IHsgc2Nyb2xsYmFyTW9kZWwgfSBmcm9tICIuLi9kaXNwbGF5L3Njcm9sbGJhcnMiCmltcG9ydCB7IHdoZWVsRXZlbnRQaXhlbHMgfSBmcm9tICIuLi9kaXNwbGF5L3Njcm9sbF9ldmVudHMiCmltcG9ydCB7IGtleU1hcCwga2V5TmFtZSwgaXNNb2RpZmllcktleSwgbG9va3VwS2V5LCBub3JtYWxpemVLZXlNYXAgfSBmcm9tICIuLi9pbnB1dC9rZXltYXAiCmltcG9ydCB7IGtleU5hbWVzIH0gZnJvbSAiLi4vaW5wdXQva2V5bmFtZXMiCmltcG9ydCB7IExpbmUgfSBmcm9tICIuLi9saW5lL2xpbmVfZGF0YSIKaW1wb3J0IHsgY21wLCBQb3MgfSBmcm9tICIuLi9saW5lL3BvcyIKaW1wb3J0IHsgY2hhbmdlRW5kIH0gZnJvbSAiLi4vbW9kZWwvY2hhbmdlX21lYXN1cmVtZW50IgppbXBvcnQgRG9jIGZyb20gIi4uL21vZGVsL0RvYyIKaW1wb3J0IHsgTGluZVdpZGdldCB9IGZyb20gIi4uL21vZGVsL2xpbmVfd2lkZ2V0IgppbXBvcnQgeyBTaGFyZWRUZXh0TWFya2VyLCBUZXh0TWFya2VyIH0gZnJvbSAiLi4vbW9kZWwvbWFya190ZXh0IgppbXBvcnQgeyBjb3B5U3RhdGUsIGV4dGVuZE1vZGUsIGdldE1vZGUsIGlubmVyTW9kZSwgbWltZU1vZGVzLCBtb2RlRXh0ZW5zaW9ucywgbW9kZXMsIHJlc29sdmVNb2RlLCBzdGFydFN0YXRlIH0gZnJvbSAiLi4vbW9kZXMiCmltcG9ydCB7IGFkZENsYXNzLCBjb250YWlucywgcm1DbGFzcyB9IGZyb20gIi4uL3V0aWwvZG9tIgppbXBvcnQgeyBlX3ByZXZlbnREZWZhdWx0LCBlX3N0b3AsIGVfc3RvcFByb3BhZ2F0aW9uLCBvZmYsIG9uLCBzaWduYWwgfSBmcm9tICIuLi91dGlsL2V2ZW50IgppbXBvcnQgeyBzcGxpdExpbmVzQXV0byB9IGZyb20gIi4uL3V0aWwvZmVhdHVyZV9kZXRlY3Rpb24iCmltcG9ydCB7IGNvdW50Q29sdW1uLCBmaW5kQ29sdW1uLCBpc1dvcmRDaGFyQmFzaWMsIFBhc3MgfSBmcm9tICIuLi91dGlsL21pc2MiCmltcG9ydCBTdHJpbmdTdHJlYW0gZnJvbSAiLi4vdXRpbC9TdHJpbmdTdHJlYW0iCgppbXBvcnQgeyBjb21tYW5kcyB9IGZyb20gIi4vY29tbWFuZHMiCgpleHBvcnQgZnVuY3Rpb24gYWRkTGVnYWN5UHJvcHMoQ29kZU1pcnJvcikgewogIENvZGVNaXJyb3Iub2ZmID0gb2ZmCiAgQ29kZU1pcnJvci5vbiA9IG9uCiAgQ29kZU1pcnJvci53aGVlbEV2ZW50UGl4ZWxzID0gd2hlZWxFdmVudFBpeGVscwogIENvZGVNaXJyb3IuRG9jID0gRG9jCiAgQ29kZU1pcnJvci5zcGxpdExpbmVzID0gc3BsaXRMaW5lc0F1dG8KICBDb2RlTWlycm9yLmNvdW50Q29sdW1uID0gY291bnRDb2x1bW4KICBDb2RlTWlycm9yLmZpbmRDb2x1bW4gPSBmaW5kQ29sdW1uCiAgQ29kZU1pcnJvci5pc1dvcmRDaGFyID0gaXNXb3JkQ2hhckJhc2ljCiAgQ29kZU1pcnJvci5QYXNzID0gUGFzcwogIENvZGVNaXJyb3Iuc2lnbmFsID0gc2lnbmFsCiAgQ29kZU1pcnJvci5MaW5lID0gTGluZQogIENvZGVNaXJyb3IuY2hhbmdlRW5kID0gY2hhbmdlRW5kCiAgQ29kZU1pcnJvci5zY3JvbGxiYXJNb2RlbCA9IHNjcm9sbGJhck1vZGVsCiAgQ29kZU1pcnJvci5Qb3MgPSBQb3MKICBDb2RlTWlycm9yLmNtcFBvcyA9IGNtcAogIENvZGVNaXJyb3IubW9kZXMgPSBtb2RlcwogIENvZGVNaXJyb3IubWltZU1vZGVzID0gbWltZU1vZGVzCiAgQ29kZU1pcnJvci5yZXNvbHZlTW9kZSA9IHJlc29sdmVNb2RlCiAgQ29kZU1pcnJvci5nZXRNb2RlID0gZ2V0TW9kZQogIENvZGVNaXJyb3IubW9kZUV4dGVuc2lvbnMgPSBtb2RlRXh0ZW5zaW9ucwogIENvZGVNaXJyb3IuZXh0ZW5kTW9kZSA9IGV4dGVuZE1vZGUKICBDb2RlTWlycm9yLmNvcHlTdGF0ZSA9IGNvcHlTdGF0ZQogIENvZGVNaXJyb3Iuc3RhcnRTdGF0ZSA9IHN0YXJ0U3RhdGUKICBDb2RlTWlycm9yLmlubmVyTW9kZSA9IGlubmVyTW9kZQogIENvZGVNaXJyb3IuY29tbWFuZHMgPSBjb21tYW5kcwogIENvZGVNaXJyb3Iua2V5TWFwID0ga2V5TWFwCiAgQ29kZU1pcnJvci5rZXlOYW1lID0ga2V5TmFtZQogIENvZGVNaXJyb3IuaXNNb2RpZmllcktleSA9IGlzTW9kaWZpZXJLZXkKICBDb2RlTWlycm9yLmxvb2t1cEtleSA9IGxvb2t1cEtleQogIENvZGVNaXJyb3Iubm9ybWFsaXplS2V5TWFwID0gbm9ybWFsaXplS2V5TWFwCiAgQ29kZU1pcnJvci5TdHJpbmdTdHJlYW0gPSBTdHJpbmdTdHJlYW0KICBDb2RlTWlycm9yLlNoYXJlZFRleHRNYXJrZXIgPSBTaGFyZWRUZXh0TWFya2VyCiAgQ29kZU1pcnJvci5UZXh0TWFya2VyID0gVGV4dE1hcmtlcgogIENvZGVNaXJyb3IuTGluZVdpZGdldCA9IExpbmVXaWRnZXQKICBDb2RlTWlycm9yLmVfcHJldmVudERlZmF1bHQgPSBlX3ByZXZlbnREZWZhdWx0CiAgQ29kZU1pcnJvci5lX3N0b3BQcm9wYWdhdGlvbiA9IGVfc3RvcFByb3BhZ2F0aW9uCiAgQ29kZU1pcnJvci5lX3N0b3AgPSBlX3N0b3AKICBDb2RlTWlycm9yLmFkZENsYXNzID0gYWRkQ2xhc3MKICBDb2RlTWlycm9yLmNvbnRhaW5zID0gY29udGFpbnMKICBDb2RlTWlycm9yLnJtQ2xhc3MgPSBybUNsYXNzCiAgQ29kZU1pcnJvci5rZXlOYW1lcyA9IGtleU5hbWVzCn0K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/src/edit/main.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gRURJVE9SIENPTlNUUlVDVE9SCgppbXBvcnQgeyBDb2RlTWlycm9yIH0gZnJvbSAiLi9Db2RlTWlycm9yIgpleHBvcnQgeyBDb2RlTWlycm9yIH0gZnJvbSAiLi9Db2RlTWlycm9yIgoKaW1wb3J0IHsgZXZlbnRNaXhpbiB9IGZyb20gIi4uL3V0aWwvZXZlbnQiCmltcG9ydCB7IGluZGV4T2YgfSBmcm9tICIuLi91dGlsL21pc2MiCgppbXBvcnQgeyBkZWZpbmVPcHRpb25zIH0gZnJvbSAiLi9vcHRpb25zIgoKZGVmaW5lT3B0aW9ucyhDb2RlTWlycm9yKQoKaW1wb3J0IGFkZEVkaXRvck1ldGhvZHMgZnJvbSAiLi9tZXRob2RzIgoKYWRkRWRpdG9yTWV0aG9kcyhDb2RlTWlycm9yKQoKaW1wb3J0IERvYyBmcm9tICIuLi9tb2RlbC9Eb2MiCgovLyBTZXQgdXAgbWV0aG9kcyBvbiBDb2RlTWlycm9yJ3MgcHJvdG90eXBlIHRvIHJlZGlyZWN0IHRvIHRoZSBlZGl0b3IncyBkb2N1bWVudC4KbGV0IGRvbnREZWxlZ2F0ZSA9ICJpdGVyIGluc2VydCByZW1vdmUgY29weSBnZXRFZGl0b3IgY29uc3RydWN0b3IiLnNwbGl0KCIgIikKZm9yIChsZXQgcHJvcCBpbiBEb2MucHJvdG90eXBlKSBpZiAoRG9jLnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eShwcm9wKSAmJiBpbmRleE9mKGRvbnREZWxlZ2F0ZSwgcHJvcCkgPCAwKQogIENvZGVNaXJyb3IucHJvdG90eXBlW3Byb3BdID0gKGZ1bmN0aW9uKG1ldGhvZCkgewogICAgcmV0dXJuIGZ1bmN0aW9uKCkge3JldHVybiBtZXRob2QuYXBwbHkodGhpcy5kb2MsIGFyZ3VtZW50cyl9CiAgfSkoRG9jLnByb3RvdHlwZVtwcm9wXSkKCmV2ZW50TWl4aW4oRG9jKQoKLy8gSU5QVVQgSEFORExJTkcKCmltcG9ydCBDb250ZW50RWRpdGFibGVJbnB1dCBmcm9tICIuLi9pbnB1dC9Db250ZW50RWRpdGFibGVJbnB1dCIKaW1wb3J0IFRleHRhcmVhSW5wdXQgZnJvbSAiLi4vaW5wdXQvVGV4dGFyZWFJbnB1dCIKQ29kZU1pcnJvci5pbnB1dFN0eWxlcyA9IHsidGV4dGFyZWEiOiBUZXh0YXJlYUlucHV0LCAiY29udGVudGVkaXRhYmxlIjogQ29udGVudEVkaXRhYmxlSW5wdXR9CgovLyBNT0RFIERFRklOSVRJT04gQU5EIFFVRVJZSU5HCgppbXBvcnQgeyBkZWZpbmVNSU1FLCBkZWZpbmVNb2RlIH0gZnJvbSAiLi4vbW9kZXMiCgovLyBFeHRyYSBhcmd1bWVudHMgYXJlIHN0b3JlZCBhcyB0aGUgbW9kZSdzIGRlcGVuZGVuY2llcywgd2hpY2ggaXMKLy8gdXNlZCBieSAobGVnYWN5KSBtZWNoYW5pc21zIGxpa2UgbG9hZG1vZGUuanMgdG8gYXV0b21hdGljYWxseQovLyBsb2FkIGEgbW9kZS4gKFByZWZlcnJlZCBtZWNoYW5pc20gaXMgdGhlIHJlcXVpcmUvZGVmaW5lIGNhbGxzLikKQ29kZU1pcnJvci5kZWZpbmVNb2RlID0gZnVuY3Rpb24obmFtZS8qLCBtb2RlLCDigKYqLykgewogIGlmICghQ29kZU1pcnJvci5kZWZhdWx0cy5tb2RlICYmIG5hbWUgIT0gIm51bGwiKSBDb2RlTWlycm9yLmRlZmF1bHRzLm1vZGUgPSBuYW1lCiAgZGVmaW5lTW9kZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpCn0KCkNvZGVNaXJyb3IuZGVmaW5lTUlNRSA9IGRlZmluZU1JTUUKCi8vIE1pbmltYWwgZGVmYXVsdCBtb2RlLgpDb2RlTWlycm9yLmRlZmluZU1vZGUoIm51bGwiLCAoKSA9PiAoe3Rva2VuOiBzdHJlYW0gPT4gc3RyZWFtLnNraXBUb0VuZCgpfSkpCkNvZGVNaXJyb3IuZGVmaW5lTUlNRSgidGV4dC9wbGFpbiIsICJudWxsIikKCi8vIEVYVEVOU0lPTlMKCkNvZGVNaXJyb3IuZGVmaW5lRXh0ZW5zaW9uID0gKG5hbWUsIGZ1bmMpID0+IHsKICBDb2RlTWlycm9yLnByb3RvdHlwZVtuYW1lXSA9IGZ1bmMKfQpDb2RlTWlycm9yLmRlZmluZURvY0V4dGVuc2lvbiA9IChuYW1lLCBmdW5jKSA9PiB7CiAgRG9jLnByb3RvdHlwZVtuYW1lXSA9IGZ1bmMKfQoKaW1wb3J0IHsgZnJvbVRleHRBcmVhIH0gZnJvbSAiLi9mcm9tVGV4dEFyZWEiCgpDb2RlTWlycm9yLmZyb21UZXh0QXJlYSA9IGZyb21UZXh0QXJlYQoKaW1wb3J0IHsgYWRkTGVnYWN5UHJvcHMgfSBmcm9tICIuL2xlZ2FjeSIKCmFkZExlZ2FjeVByb3BzKENvZGVNaXJyb3IpCgpDb2RlTWlycm9yLnZlcnNpb24gPSAiNS4yMC4yIgo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/src/edit/methods.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aW1wb3J0IHsgZGVsZXRlTmVhclNlbGVjdGlvbiB9IGZyb20gIi4vZGVsZXRlTmVhclNlbGVjdGlvbiIKaW1wb3J0IHsgY2hhbmdlTGluZSB9IGZyb20gIi4uL21vZGVsL2NoYW5nZXMiCmltcG9ydCB7IGNvbW1hbmRzIH0gZnJvbSAiLi9jb21tYW5kcyIKaW1wb3J0IHsgYXR0YWNoRG9jIH0gZnJvbSAiLi4vbW9kZWwvZG9jdW1lbnRfZGF0YSIKaW1wb3J0IHsgYWN0aXZlRWx0LCBhZGRDbGFzcywgcm1DbGFzcyB9IGZyb20gIi4uL3V0aWwvZG9tIgppbXBvcnQgeyBldmVudE1peGluLCBzaWduYWwgfSBmcm9tICIuLi91dGlsL2V2ZW50IgppbXBvcnQgeyBnZXRMaW5lU3R5bGVzLCBnZXRTdGF0ZUJlZm9yZSwgdGFrZVRva2VuIH0gZnJvbSAiLi4vbGluZS9oaWdobGlnaHQiCmltcG9ydCB7IGluZGVudExpbmUgfSBmcm9tICIuLi9pbnB1dC9pbmRlbnQiCmltcG9ydCB7IHRyaWdnZXJFbGVjdHJpYyB9IGZyb20gIi4uL2lucHV0L2lucHV0IgppbXBvcnQgeyBvbktleURvd24sIG9uS2V5UHJlc3MsIG9uS2V5VXAgfSBmcm9tICIuL2tleV9ldmVudHMiCmltcG9ydCB7IGdldEtleU1hcCB9IGZyb20gIi4uL2lucHV0L2tleW1hcCIKaW1wb3J0IHsgbWV0aG9kT3AsIG9wZXJhdGlvbiwgcnVuSW5PcCB9IGZyb20gIi4uL2Rpc3BsYXkvb3BlcmF0aW9ucyIKaW1wb3J0IHsgY2xpcExpbmUsIGNsaXBQb3MsIGNtcCwgUG9zIH0gZnJvbSAiLi4vbGluZS9wb3MiCmltcG9ydCB7IGNoYXJDb29yZHMsIGNoYXJXaWR0aCwgY2xlYXJDYWNoZXMsIGNsZWFyTGluZU1lYXN1cmVtZW50Q2FjaGUsIGNvb3Jkc0NoYXIsIGN1cnNvckNvb3JkcywgZGlzcGxheUhlaWdodCwgZGlzcGxheVdpZHRoLCBlc3RpbWF0ZUxpbmVIZWlnaHRzLCBmcm9tQ29vcmRTeXN0ZW0sIGludG9Db29yZFN5c3RlbSwgc2Nyb2xsR2FwLCB0ZXh0SGVpZ2h0IH0gZnJvbSAiLi4vbWVhc3VyZW1lbnQvcG9zaXRpb25fbWVhc3VyZW1lbnQiCmltcG9ydCB7IFJhbmdlIH0gZnJvbSAiLi4vbW9kZWwvc2VsZWN0aW9uIgppbXBvcnQgeyByZXBsYWNlT25lU2VsZWN0aW9uLCBza2lwQXRvbWljIH0gZnJvbSAiLi4vbW9kZWwvc2VsZWN0aW9uX3VwZGF0ZXMiCmltcG9ydCB7IGFkZFRvU2Nyb2xsUG9zLCBjYWxjdWxhdGVTY3JvbGxQb3MsIGVuc3VyZUN1cnNvclZpc2libGUsIHJlc29sdmVTY3JvbGxUb1Bvcywgc2Nyb2xsSW50b1ZpZXcgfSBmcm9tICIuLi9kaXNwbGF5L3Njcm9sbGluZyIKaW1wb3J0IHsgaGVpZ2h0QXRMaW5lIH0gZnJvbSAiLi4vbGluZS9zcGFucyIKaW1wb3J0IHsgdXBkYXRlR3V0dGVyU3BhY2UgfSBmcm9tICIuLi9kaXNwbGF5L3VwZGF0ZV9kaXNwbGF5IgppbXBvcnQgeyBsaW5lTGVmdCwgbGluZVJpZ2h0LCBtb3ZlTG9naWNhbGx5LCBtb3ZlVmlzdWFsbHkgfSBmcm9tICIuLi91dGlsL2JpZGkiCmltcG9ydCB7IGluZGV4T2YsIGluc2VydFNvcnRlZCwgaXNFbXB0eSwgaXNXb3JkQ2hhciwgc2VsX2RvbnRTY3JvbGwsIHNlbF9tb3ZlIH0gZnJvbSAiLi4vdXRpbC9taXNjIgppbXBvcnQgeyBzaWduYWxMYXRlciB9IGZyb20gIi4uL3V0aWwvb3BlcmF0aW9uX2dyb3VwIgppbXBvcnQgeyBnZXRMaW5lLCBpc0xpbmUsIGxpbmVBdEhlaWdodCwgbGluZU5vIH0gZnJvbSAiLi4vbGluZS91dGlsc19saW5lIgppbXBvcnQgeyByZWdDaGFuZ2UsIHJlZ0xpbmVDaGFuZ2UgfSBmcm9tICIuLi9kaXNwbGF5L3ZpZXdfdHJhY2tpbmciCgovLyBUaGUgcHVibGljbHkgdmlzaWJsZSBBUEkuIE5vdGUgdGhhdCBtZXRob2RPcChmKSBtZWFucwovLyAnd3JhcCBmIGluIGFuIG9wZXJhdGlvbiwgcGVyZm9ybWVkIG9uIGl0cyBgdGhpc2AgcGFyYW1ldGVyJy4KCi8vIFRoaXMgaXMgbm90IHRoZSBjb21wbGV0ZSBzZXQgb2YgZWRpdG9yIG1ldGhvZHMuIE1vc3Qgb2YgdGhlCi8vIG1ldGhvZHMgZGVmaW5lZCBvbiB0aGUgRG9jIHR5cGUgYXJlIGFsc28gaW5qZWN0ZWQgaW50bwovLyBDb2RlTWlycm9yLnByb3RvdHlwZSwgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGFuZAovLyBjb252ZW5pZW5jZS4KCmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uKENvZGVNaXJyb3IpIHsKICBsZXQgb3B0aW9uSGFuZGxlcnMgPSBDb2RlTWlycm9yLm9wdGlvbkhhbmRsZXJzCgogIGxldCBoZWxwZXJzID0gQ29kZU1pcnJvci5oZWxwZXJzID0ge30KCiAgQ29kZU1pcnJvci5wcm90b3R5cGUgPSB7CiAgICBjb25zdHJ1Y3RvcjogQ29kZU1pcnJvciwKICAgIGZvY3VzOiBmdW5jdGlvbigpe3dpbmRvdy5mb2N1cygpOyB0aGlzLmRpc3BsYXkuaW5wdXQuZm9jdXMoKX0sCgogICAgc2V0T3B0aW9uOiBmdW5jdGlvbihvcHRpb24sIHZhbHVlKSB7CiAgICAgIGxldCBvcHRpb25zID0gdGhpcy5vcHRpb25zLCBvbGQgPSBvcHRpb25zW29wdGlvbl0KICAgICAgaWYgKG9wdGlvbnNbb3B0aW9uXSA9PSB2YWx1ZSAmJiBvcHRpb24gIT0gIm1vZGUiKSByZXR1cm4KICAgICAgb3B0aW9uc1tvcHRpb25dID0gdmFsdWUKICAgICAgaWYgKG9wdGlvbkhhbmRsZXJzLmhhc093blByb3BlcnR5KG9wdGlvbikpCiAgICAgICAgb3BlcmF0aW9uKHRoaXMsIG9wdGlvbkhhbmRsZXJzW29wdGlvbl0pKHRoaXMsIHZhbHVlLCBvbGQpCiAgICB9LAoKICAgIGdldE9wdGlvbjogZnVuY3Rpb24ob3B0aW9uKSB7cmV0dXJuIHRoaXMub3B0aW9uc1tvcHRpb25dfSwKICAgIGdldERvYzogZnVuY3Rpb24oKSB7cmV0dXJuIHRoaXMuZG9jfSwKCiAgICBhZGRLZXlNYXA6IGZ1bmN0aW9uKG1hcCwgYm90dG9tKSB7CiAgICAgIHRoaXMuc3RhdGUua2V5TWFwc1tib3R0b20gPyAicHVzaCIgOiAidW5zaGlmdCJdKGdldEtleU1hcChtYXApKQogICAgfSwKICAgIHJlbW92ZUtleU1hcDogZnVuY3Rpb24obWFwKSB7CiAgICAgIGxldCBtYXBzID0gdGhpcy5zdGF0ZS5rZXlNYXBzCiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWFwcy5sZW5ndGg7ICsraSkKICAgICAgICBpZiAobWFwc1tpXSA9PSBtYXAgfHwgbWFwc1tpXS5uYW1lID09IG1hcCkgewogICAgICAgICAgbWFwcy5zcGxpY2UoaSwgMSkKICAgICAgICAgIHJldHVybiB0cnVlCiAgICAgICAgfQogICAgfSwKCiAgICBhZGRPdmVybGF5OiBtZXRob2RPcChmdW5jdGlvbihzcGVjLCBvcHRpb25zKSB7CiAgICAgIGxldCBtb2RlID0gc3BlYy50b2tlbiA/IHNwZWMgOiBDb2RlTWlycm9yLmdldE1vZGUodGhpcy5vcHRpb25zLCBzcGVjKQogICAgICBpZiAobW9kZS5zdGFydFN0YXRlKSB0aHJvdyBuZXcgRXJyb3IoIk92ZXJsYXlzIG1heSBub3QgYmUgc3RhdGVmdWwuIikKICAgICAgaW5zZXJ0U29ydGVkKHRoaXMuc3RhdGUub3ZlcmxheXMsCiAgICAgICAgICAgICAgICAgICB7bW9kZTogbW9kZSwgbW9kZVNwZWM6IHNwZWMsIG9wYXF1ZTogb3B0aW9ucyAmJiBvcHRpb25zLm9wYXF1ZSwKICAgICAgICAgICAgICAgICAgICBwcmlvcml0eTogKG9wdGlvbnMgJiYgb3B0aW9ucy5wcmlvcml0eSkgfHwgMH0sCiAgICAgICAgICAgICAgICAgICBvdmVybGF5ID0+IG92ZXJsYXkucHJpb3JpdHkpCiAgICAgIHRoaXMuc3RhdGUubW9kZUdlbisrCiAgICAgIHJlZ0NoYW5nZSh0aGlzKQogICAgfSksCiAgICByZW1vdmVPdmVybGF5OiBtZXRob2RPcChmdW5jdGlvbihzcGVjKSB7CiAgICAgIGxldCBvdmVybGF5cyA9IHRoaXMuc3RhdGUub3ZlcmxheXMKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvdmVybGF5cy5sZW5ndGg7ICsraSkgewogICAgICAgIGxldCBjdXIgPSBvdmVybGF5c1tpXS5tb2RlU3BlYwogICAgICAgIGlmIChjdXIgPT0gc3BlYyB8fCB0eXBlb2Ygc3BlYyA9PSAic3RyaW5nIiAmJiBjdXIubmFtZSA9PSBzcGVjKSB7CiAgICAgICAgICBvdmVybGF5cy5zcGxpY2UoaSwgMSkKICAgICAgICAgIHRoaXMuc3RhdGUubW9kZUdlbisrCiAgICAgICAgICByZWdDaGFuZ2UodGhpcykKICAgICAgICAgIHJldHVybgogICAgICAgIH0KICAgICAgfQogICAgfSksCgogICAgaW5kZW50TGluZTogbWV0aG9kT3AoZnVuY3Rpb24obiwgZGlyLCBhZ2dyZXNzaXZlKSB7CiAgICAgIGlmICh0eXBlb2YgZGlyICE9ICJzdHJpbmciICYmIHR5cGVvZiBkaXIgIT0gIm51bWJlciIpIHsKICAgICAgICBpZiAoZGlyID09IG51bGwpIGRpciA9IHRoaXMub3B0aW9ucy5zbWFydEluZGVudCA/ICJzbWFydCIgOiAicHJldiIKICAgICAgICBlbHNlIGRpciA9IGRpciA/ICJhZGQiIDogInN1YnRyYWN0IgogICAgICB9CiAgICAgIGlmIChpc0xpbmUodGhpcy5kb2MsIG4pKSBpbmRlbnRMaW5lKHRoaXMsIG4sIGRpciwgYWdncmVzc2l2ZSkKICAgIH0pLAogICAgaW5kZW50U2VsZWN0aW9uOiBtZXRob2RPcChmdW5jdGlvbihob3cpIHsKICAgICAgbGV0IHJhbmdlcyA9IHRoaXMuZG9jLnNlbC5yYW5nZXMsIGVuZCA9IC0xCiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgbGV0IHJhbmdlID0gcmFuZ2VzW2ldCiAgICAgICAgaWYgKCFyYW5nZS5lbXB0eSgpKSB7CiAgICAgICAgICBsZXQgZnJvbSA9IHJhbmdlLmZyb20oKSwgdG8gPSByYW5nZS50bygpCiAgICAgICAgICBsZXQgc3RhcnQgPSBNYXRoLm1heChlbmQsIGZyb20ubGluZSkKICAgICAgICAgIGVuZCA9IE1hdGgubWluKHRoaXMubGFzdExpbmUoKSwgdG8ubGluZSAtICh0by5jaCA/IDAgOiAxKSkgKyAxCiAgICAgICAgICBmb3IgKGxldCBqID0gc3RhcnQ7IGogPCBlbmQ7ICsraikKICAgICAgICAgICAgaW5kZW50TGluZSh0aGlzLCBqLCBob3cpCiAgICAgICAgICBsZXQgbmV3UmFuZ2VzID0gdGhpcy5kb2Muc2VsLnJhbmdlcwogICAgICAgICAgaWYgKGZyb20uY2ggPT0gMCAmJiByYW5nZXMubGVuZ3RoID09IG5ld1Jhbmdlcy5sZW5ndGggJiYgbmV3UmFuZ2VzW2ldLmZyb20oKS5jaCA+IDApCiAgICAgICAgICAgIHJlcGxhY2VPbmVTZWxlY3Rpb24odGhpcy5kb2MsIGksIG5ldyBSYW5nZShmcm9tLCBuZXdSYW5nZXNbaV0udG8oKSksIHNlbF9kb250U2Nyb2xsKQogICAgICAgIH0gZWxzZSBpZiAocmFuZ2UuaGVhZC5saW5lID4gZW5kKSB7CiAgICAgICAgICBpbmRlbnRMaW5lKHRoaXMsIHJhbmdlLmhlYWQubGluZSwgaG93LCB0cnVlKQogICAgICAgICAgZW5kID0gcmFuZ2UuaGVhZC5saW5lCiAgICAgICAgICBpZiAoaSA9PSB0aGlzLmRvYy5zZWwucHJpbUluZGV4KSBlbnN1cmVDdXJzb3JWaXNpYmxlKHRoaXMpCiAgICAgICAgfQogICAgICB9CiAgICB9KSwKCiAgICAvLyBGZXRjaCB0aGUgcGFyc2VyIHRva2VuIGZvciBhIGdpdmVuIGNoYXJhY3Rlci4gVXNlZnVsIGZvciBoYWNrcwogICAgLy8gdGhhdCB3YW50IHRvIGluc3BlY3QgdGhlIG1vZGUgc3RhdGUgKHNheSwgZm9yIGNvbXBsZXRpb24pLgogICAgZ2V0VG9rZW5BdDogZnVuY3Rpb24ocG9zLCBwcmVjaXNlKSB7CiAgICAgIHJldHVybiB0YWtlVG9rZW4odGhpcywgcG9zLCBwcmVjaXNlKQogICAgfSwKCiAgICBnZXRMaW5lVG9rZW5zOiBmdW5jdGlvbihsaW5lLCBwcmVjaXNlKSB7CiAgICAgIHJldHVybiB0YWtlVG9rZW4odGhpcywgUG9zKGxpbmUpLCBwcmVjaXNlLCB0cnVlKQogICAgfSwKCiAgICBnZXRUb2tlblR5cGVBdDogZnVuY3Rpb24ocG9zKSB7CiAgICAgIHBvcyA9IGNsaXBQb3ModGhpcy5kb2MsIHBvcykKICAgICAgbGV0IHN0eWxlcyA9IGdldExpbmVTdHlsZXModGhpcywgZ2V0TGluZSh0aGlzLmRvYywgcG9zLmxpbmUpKQogICAgICBsZXQgYmVmb3JlID0gMCwgYWZ0ZXIgPSAoc3R5bGVzLmxlbmd0aCAtIDEpIC8gMiwgY2ggPSBwb3MuY2gKICAgICAgbGV0IHR5cGUKICAgICAgaWYgKGNoID09IDApIHR5cGUgPSBzdHlsZXNbMl0KICAgICAgZWxzZSBmb3IgKDs7KSB7CiAgICAgICAgbGV0IG1pZCA9IChiZWZvcmUgKyBhZnRlcikgPj4gMQogICAgICAgIGlmICgobWlkID8gc3R5bGVzW21pZCAqIDIgLSAxXSA6IDApID49IGNoKSBhZnRlciA9IG1pZAogICAgICAgIGVsc2UgaWYgKHN0eWxlc1ttaWQgKiAyICsgMV0gPCBjaCkgYmVmb3JlID0gbWlkICsgMQogICAgICAgIGVsc2UgeyB0eXBlID0gc3R5bGVzW21pZCAqIDIgKyAyXTsgYnJlYWsgfQogICAgICB9CiAgICAgIGxldCBjdXQgPSB0eXBlID8gdHlwZS5pbmRleE9mKCJvdmVybGF5ICIpIDogLTEKICAgICAgcmV0dXJuIGN1dCA8IDAgPyB0eXBlIDogY3V0ID09IDAgPyBudWxsIDogdHlwZS5zbGljZSgwLCBjdXQgLSAxKQogICAgfSwKCiAgICBnZXRNb2RlQXQ6IGZ1bmN0aW9uKHBvcykgewogICAgICBsZXQgbW9kZSA9IHRoaXMuZG9jLm1vZGUKICAgICAgaWYgKCFtb2RlLmlubmVyTW9kZSkgcmV0dXJuIG1vZGUKICAgICAgcmV0dXJuIENvZGVNaXJyb3IuaW5uZXJNb2RlKG1vZGUsIHRoaXMuZ2V0VG9rZW5BdChwb3MpLnN0YXRlKS5tb2RlCiAgICB9LAoKICAgIGdldEhlbHBlcjogZnVuY3Rpb24ocG9zLCB0eXBlKSB7CiAgICAgIHJldHVybiB0aGlzLmdldEhlbHBlcnMocG9zLCB0eXBlKVswXQogICAgfSwKCiAgICBnZXRIZWxwZXJzOiBmdW5jdGlvbihwb3MsIHR5cGUpIHsKICAgICAgbGV0IGZvdW5kID0gW10KICAgICAgaWYgKCFoZWxwZXJzLmhhc093blByb3BlcnR5KHR5cGUpKSByZXR1cm4gZm91bmQKICAgICAgbGV0IGhlbHAgPSBoZWxwZXJzW3R5cGVdLCBtb2RlID0gdGhpcy5nZXRNb2RlQXQocG9zKQogICAgICBpZiAodHlwZW9mIG1vZGVbdHlwZV0gPT0gInN0cmluZyIpIHsKICAgICAgICBpZiAoaGVscFttb2RlW3R5cGVdXSkgZm91bmQucHVzaChoZWxwW21vZGVbdHlwZV1dKQogICAgICB9IGVsc2UgaWYgKG1vZGVbdHlwZV0pIHsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1vZGVbdHlwZV0ubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGxldCB2YWwgPSBoZWxwW21vZGVbdHlwZV1baV1dCiAgICAgICAgICBpZiAodmFsKSBmb3VuZC5wdXNoKHZhbCkKICAgICAgICB9CiAgICAgIH0gZWxzZSBpZiAobW9kZS5oZWxwZXJUeXBlICYmIGhlbHBbbW9kZS5oZWxwZXJUeXBlXSkgewogICAgICAgIGZvdW5kLnB1c2goaGVscFttb2RlLmhlbHBlclR5cGVdKQogICAgICB9IGVsc2UgaWYgKGhlbHBbbW9kZS5uYW1lXSkgewogICAgICAgIGZvdW5kLnB1c2goaGVscFttb2RlLm5hbWVdKQogICAgICB9CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGVscC5fZ2xvYmFsLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgbGV0IGN1ciA9IGhlbHAuX2dsb2JhbFtpXQogICAgICAgIGlmIChjdXIucHJlZChtb2RlLCB0aGlzKSAmJiBpbmRleE9mKGZvdW5kLCBjdXIudmFsKSA9PSAtMSkKICAgICAgICAgIGZvdW5kLnB1c2goY3VyLnZhbCkKICAgICAgfQogICAgICByZXR1cm4gZm91bmQKICAgIH0sCgogICAgZ2V0U3RhdGVBZnRlcjogZnVuY3Rpb24obGluZSwgcHJlY2lzZSkgewogICAgICBsZXQgZG9jID0gdGhpcy5kb2MKICAgICAgbGluZSA9IGNsaXBMaW5lKGRvYywgbGluZSA9PSBudWxsID8gZG9jLmZpcnN0ICsgZG9jLnNpemUgLSAxOiBsaW5lKQogICAgICByZXR1cm4gZ2V0U3RhdGVCZWZvcmUodGhpcywgbGluZSArIDEsIHByZWNpc2UpCiAgICB9LAoKICAgIGN1cnNvckNvb3JkczogZnVuY3Rpb24oc3RhcnQsIG1vZGUpIHsKICAgICAgbGV0IHBvcywgcmFuZ2UgPSB0aGlzLmRvYy5zZWwucHJpbWFyeSgpCiAgICAgIGlmIChzdGFydCA9PSBudWxsKSBwb3MgPSByYW5nZS5oZWFkCiAgICAgIGVsc2UgaWYgKHR5cGVvZiBzdGFydCA9PSAib2JqZWN0IikgcG9zID0gY2xpcFBvcyh0aGlzLmRvYywgc3RhcnQpCiAgICAgIGVsc2UgcG9zID0gc3RhcnQgPyByYW5nZS5mcm9tKCkgOiByYW5nZS50bygpCiAgICAgIHJldHVybiBjdXJzb3JDb29yZHModGhpcywgcG9zLCBtb2RlIHx8ICJwYWdlIikKICAgIH0sCgogICAgY2hhckNvb3JkczogZnVuY3Rpb24ocG9zLCBtb2RlKSB7CiAgICAgIHJldHVybiBjaGFyQ29vcmRzKHRoaXMsIGNsaXBQb3ModGhpcy5kb2MsIHBvcyksIG1vZGUgfHwgInBhZ2UiKQogICAgfSwKCiAgICBjb29yZHNDaGFyOiBmdW5jdGlvbihjb29yZHMsIG1vZGUpIHsKICAgICAgY29vcmRzID0gZnJvbUNvb3JkU3lzdGVtKHRoaXMsIGNvb3JkcywgbW9kZSB8fCAicGFnZSIpCiAgICAgIHJldHVybiBjb29yZHNDaGFyKHRoaXMsIGNvb3Jkcy5sZWZ0LCBjb29yZHMudG9wKQogICAgfSwKCiAgICBsaW5lQXRIZWlnaHQ6IGZ1bmN0aW9uKGhlaWdodCwgbW9kZSkgewogICAgICBoZWlnaHQgPSBmcm9tQ29vcmRTeXN0ZW0odGhpcywge3RvcDogaGVpZ2h0LCBsZWZ0OiAwfSwgbW9kZSB8fCAicGFnZSIpLnRvcAogICAgICByZXR1cm4gbGluZUF0SGVpZ2h0KHRoaXMuZG9jLCBoZWlnaHQgKyB0aGlzLmRpc3BsYXkudmlld09mZnNldCkKICAgIH0sCiAgICBoZWlnaHRBdExpbmU6IGZ1bmN0aW9uKGxpbmUsIG1vZGUpIHsKICAgICAgbGV0IGVuZCA9IGZhbHNlLCBsaW5lT2JqCiAgICAgIGlmICh0eXBlb2YgbGluZSA9PSAibnVtYmVyIikgewogICAgICAgIGxldCBsYXN0ID0gdGhpcy5kb2MuZmlyc3QgKyB0aGlzLmRvYy5zaXplIC0gMQogICAgICAgIGlmIChsaW5lIDwgdGhpcy5kb2MuZmlyc3QpIGxpbmUgPSB0aGlzLmRvYy5maXJzdAogICAgICAgIGVsc2UgaWYgKGxpbmUgPiBsYXN0KSB7IGxpbmUgPSBsYXN0OyBlbmQgPSB0cnVlIH0KICAgICAgICBsaW5lT2JqID0gZ2V0TGluZSh0aGlzLmRvYywgbGluZSkKICAgICAgfSBlbHNlIHsKICAgICAgICBsaW5lT2JqID0gbGluZQogICAgICB9CiAgICAgIHJldHVybiBpbnRvQ29vcmRTeXN0ZW0odGhpcywgbGluZU9iaiwge3RvcDogMCwgbGVmdDogMH0sIG1vZGUgfHwgInBhZ2UiKS50b3AgKwogICAgICAgIChlbmQgPyB0aGlzLmRvYy5oZWlnaHQgLSBoZWlnaHRBdExpbmUobGluZU9iaikgOiAwKQogICAgfSwKCiAgICBkZWZhdWx0VGV4dEhlaWdodDogZnVuY3Rpb24oKSB7IHJldHVybiB0ZXh0SGVpZ2h0KHRoaXMuZGlzcGxheSkgfSwKICAgIGRlZmF1bHRDaGFyV2lkdGg6IGZ1bmN0aW9uKCkgeyByZXR1cm4gY2hhcldpZHRoKHRoaXMuZGlzcGxheSkgfSwKCiAgICBzZXRHdXR0ZXJNYXJrZXI6IG1ldGhvZE9wKGZ1bmN0aW9uKGxpbmUsIGd1dHRlcklELCB2YWx1ZSkgewogICAgICByZXR1cm4gY2hhbmdlTGluZSh0aGlzLmRvYywgbGluZSwgImd1dHRlciIsIGxpbmUgPT4gewogICAgICAgIGxldCBtYXJrZXJzID0gbGluZS5ndXR0ZXJNYXJrZXJzIHx8IChsaW5lLmd1dHRlck1hcmtlcnMgPSB7fSkKICAgICAgICBtYXJrZXJzW2d1dHRlcklEXSA9IHZhbHVlCiAgICAgICAgaWYgKCF2YWx1ZSAmJiBpc0VtcHR5KG1hcmtlcnMpKSBsaW5lLmd1dHRlck1hcmtlcnMgPSBudWxsCiAgICAgICAgcmV0dXJuIHRydWUKICAgICAgfSkKICAgIH0pLAoKICAgIGNsZWFyR3V0dGVyOiBtZXRob2RPcChmdW5jdGlvbihndXR0ZXJJRCkgewogICAgICBsZXQgZG9jID0gdGhpcy5kb2MsIGkgPSBkb2MuZmlyc3QKICAgICAgZG9jLml0ZXIobGluZSA9PiB7CiAgICAgICAgaWYgKGxpbmUuZ3V0dGVyTWFya2VycyAmJiBsaW5lLmd1dHRlck1hcmtlcnNbZ3V0dGVySURdKSB7CiAgICAgICAgICBsaW5lLmd1dHRlck1hcmtlcnNbZ3V0dGVySURdID0gbnVsbAogICAgICAgICAgcmVnTGluZUNoYW5nZSh0aGlzLCBpLCAiZ3V0dGVyIikKICAgICAgICAgIGlmIChpc0VtcHR5KGxpbmUuZ3V0dGVyTWFya2VycykpIGxpbmUuZ3V0dGVyTWFya2VycyA9IG51bGwKICAgICAgICB9CiAgICAgICAgKytpCiAgICAgIH0pCiAgICB9KSwKCiAgICBsaW5lSW5mbzogZnVuY3Rpb24obGluZSkgewogICAgICBsZXQgbgogICAgICBpZiAodHlwZW9mIGxpbmUgPT0gIm51bWJlciIpIHsKICAgICAgICBpZiAoIWlzTGluZSh0aGlzLmRvYywgbGluZSkpIHJldHVybiBudWxsCiAgICAgICAgbiA9IGxpbmUKICAgICAgICBsaW5lID0gZ2V0TGluZSh0aGlzLmRvYywgbGluZSkKICAgICAgICBpZiAoIWxpbmUpIHJldHVybiBudWxsCiAgICAgIH0gZWxzZSB7CiAgICAgICAgbiA9IGxpbmVObyhsaW5lKQogICAgICAgIGlmIChuID09IG51bGwpIHJldHVybiBudWxsCiAgICAgIH0KICAgICAgcmV0dXJuIHtsaW5lOiBuLCBoYW5kbGU6IGxpbmUsIHRleHQ6IGxpbmUudGV4dCwgZ3V0dGVyTWFya2VyczogbGluZS5ndXR0ZXJNYXJrZXJzLAogICAgICAgICAgICAgIHRleHRDbGFzczogbGluZS50ZXh0Q2xhc3MsIGJnQ2xhc3M6IGxpbmUuYmdDbGFzcywgd3JhcENsYXNzOiBsaW5lLndyYXBDbGFzcywKICAgICAgICAgICAgICB3aWRnZXRzOiBsaW5lLndpZGdldHN9CiAgICB9LAoKICAgIGdldFZpZXdwb3J0OiBmdW5jdGlvbigpIHsgcmV0dXJuIHtmcm9tOiB0aGlzLmRpc3BsYXkudmlld0Zyb20sIHRvOiB0aGlzLmRpc3BsYXkudmlld1RvfX0sCgogICAgYWRkV2lkZ2V0OiBmdW5jdGlvbihwb3MsIG5vZGUsIHNjcm9sbCwgdmVydCwgaG9yaXopIHsKICAgICAgbGV0IGRpc3BsYXkgPSB0aGlzLmRpc3BsYXkKICAgICAgcG9zID0gY3Vyc29yQ29vcmRzKHRoaXMsIGNsaXBQb3ModGhpcy5kb2MsIHBvcykpCiAgICAgIGxldCB0b3AgPSBwb3MuYm90dG9tLCBsZWZ0ID0gcG9zLmxlZnQKICAgICAgbm9kZS5zdHlsZS5wb3NpdGlvbiA9ICJhYnNvbHV0ZSIKICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoImNtLWlnbm9yZS1ldmVudHMiLCAidHJ1ZSIpCiAgICAgIHRoaXMuZGlzcGxheS5pbnB1dC5zZXRVbmVkaXRhYmxlKG5vZGUpCiAgICAgIGRpc3BsYXkuc2l6ZXIuYXBwZW5kQ2hpbGQobm9kZSkKICAgICAgaWYgKHZlcnQgPT0gIm92ZXIiKSB7CiAgICAgICAgdG9wID0gcG9zLnRvcAogICAgICB9IGVsc2UgaWYgKHZlcnQgPT0gImFib3ZlIiB8fCB2ZXJ0ID09ICJuZWFyIikgewogICAgICAgIGxldCB2c3BhY2UgPSBNYXRoLm1heChkaXNwbGF5LndyYXBwZXIuY2xpZW50SGVpZ2h0LCB0aGlzLmRvYy5oZWlnaHQpLAogICAgICAgIGhzcGFjZSA9IE1hdGgubWF4KGRpc3BsYXkuc2l6ZXIuY2xpZW50V2lkdGgsIGRpc3BsYXkubGluZVNwYWNlLmNsaWVudFdpZHRoKQogICAgICAgIC8vIERlZmF1bHQgdG8gcG9zaXRpb25pbmcgYWJvdmUgKGlmIHNwZWNpZmllZCBhbmQgcG9zc2libGUpOyBvdGhlcndpc2UgZGVmYXVsdCB0byBwb3NpdGlvbmluZyBiZWxvdwogICAgICAgIGlmICgodmVydCA9PSAnYWJvdmUnIHx8IHBvcy5ib3R0b20gKyBub2RlLm9mZnNldEhlaWdodCA+IHZzcGFjZSkgJiYgcG9zLnRvcCA+IG5vZGUub2Zmc2V0SGVpZ2h0KQogICAgICAgICAgdG9wID0gcG9zLnRvcCAtIG5vZGUub2Zmc2V0SGVpZ2h0CiAgICAgICAgZWxzZSBpZiAocG9zLmJvdHRvbSArIG5vZGUub2Zmc2V0SGVpZ2h0IDw9IHZzcGFjZSkKICAgICAgICAgIHRvcCA9IHBvcy5ib3R0b20KICAgICAgICBpZiAobGVmdCArIG5vZGUub2Zmc2V0V2lkdGggPiBoc3BhY2UpCiAgICAgICAgICBsZWZ0ID0gaHNwYWNlIC0gbm9kZS5vZmZzZXRXaWR0aAogICAgICB9CiAgICAgIG5vZGUuc3R5bGUudG9wID0gdG9wICsgInB4IgogICAgICBub2RlLnN0eWxlLmxlZnQgPSBub2RlLnN0eWxlLnJpZ2h0ID0gIiIKICAgICAgaWYgKGhvcml6ID09ICJyaWdodCIpIHsKICAgICAgICBsZWZ0ID0gZGlzcGxheS5zaXplci5jbGllbnRXaWR0aCAtIG5vZGUub2Zmc2V0V2lkdGgKICAgICAgICBub2RlLnN0eWxlLnJpZ2h0ID0gIjBweCIKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoaG9yaXogPT0gImxlZnQiKSBsZWZ0ID0gMAogICAgICAgIGVsc2UgaWYgKGhvcml6ID09ICJtaWRkbGUiKSBsZWZ0ID0gKGRpc3BsYXkuc2l6ZXIuY2xpZW50V2lkdGggLSBub2RlLm9mZnNldFdpZHRoKSAvIDIKICAgICAgICBub2RlLnN0eWxlLmxlZnQgPSBsZWZ0ICsgInB4IgogICAgICB9CiAgICAgIGlmIChzY3JvbGwpCiAgICAgICAgc2Nyb2xsSW50b1ZpZXcodGhpcywgbGVmdCwgdG9wLCBsZWZ0ICsgbm9kZS5vZmZzZXRXaWR0aCwgdG9wICsgbm9kZS5vZmZzZXRIZWlnaHQpCiAgICB9LAoKICAgIHRyaWdnZXJPbktleURvd246IG1ldGhvZE9wKG9uS2V5RG93biksCiAgICB0cmlnZ2VyT25LZXlQcmVzczogbWV0aG9kT3Aob25LZXlQcmVzcyksCiAgICB0cmlnZ2VyT25LZXlVcDogb25LZXlVcCwKCiAgICBleGVjQ29tbWFuZDogZnVuY3Rpb24oY21kKSB7CiAgICAgIGlmIChjb21tYW5kcy5oYXNPd25Qcm9wZXJ0eShjbWQpKQogICAgICAgIHJldHVybiBjb21tYW5kc1tjbWRdLmNhbGwobnVsbCwgdGhpcykKICAgIH0sCgogICAgdHJpZ2dlckVsZWN0cmljOiBtZXRob2RPcChmdW5jdGlvbih0ZXh0KSB7IHRyaWdnZXJFbGVjdHJpYyh0aGlzLCB0ZXh0KSB9KSwKCiAgICBmaW5kUG9zSDogZnVuY3Rpb24oZnJvbSwgYW1vdW50LCB1bml0LCB2aXN1YWxseSkgewogICAgICBsZXQgZGlyID0gMQogICAgICBpZiAoYW1vdW50IDwgMCkgeyBkaXIgPSAtMTsgYW1vdW50ID0gLWFtb3VudCB9CiAgICAgIGxldCBjdXIgPSBjbGlwUG9zKHRoaXMuZG9jLCBmcm9tKQogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFtb3VudDsgKytpKSB7CiAgICAgICAgY3VyID0gZmluZFBvc0godGhpcy5kb2MsIGN1ciwgZGlyLCB1bml0LCB2aXN1YWxseSkKICAgICAgICBpZiAoY3VyLmhpdFNpZGUpIGJyZWFrCiAgICAgIH0KICAgICAgcmV0dXJuIGN1cgogICAgfSwKCiAgICBtb3ZlSDogbWV0aG9kT3AoZnVuY3Rpb24oZGlyLCB1bml0KSB7CiAgICAgIHRoaXMuZXh0ZW5kU2VsZWN0aW9uc0J5KHJhbmdlID0+IHsKICAgICAgICBpZiAodGhpcy5kaXNwbGF5LnNoaWZ0IHx8IHRoaXMuZG9jLmV4dGVuZCB8fCByYW5nZS5lbXB0eSgpKQogICAgICAgICAgcmV0dXJuIGZpbmRQb3NIKHRoaXMuZG9jLCByYW5nZS5oZWFkLCBkaXIsIHVuaXQsIHRoaXMub3B0aW9ucy5ydGxNb3ZlVmlzdWFsbHkpCiAgICAgICAgZWxzZQogICAgICAgICAgcmV0dXJuIGRpciA8IDAgPyByYW5nZS5mcm9tKCkgOiByYW5nZS50bygpCiAgICAgIH0sIHNlbF9tb3ZlKQogICAgfSksCgogICAgZGVsZXRlSDogbWV0aG9kT3AoZnVuY3Rpb24oZGlyLCB1bml0KSB7CiAgICAgIGxldCBzZWwgPSB0aGlzLmRvYy5zZWwsIGRvYyA9IHRoaXMuZG9jCiAgICAgIGlmIChzZWwuc29tZXRoaW5nU2VsZWN0ZWQoKSkKICAgICAgICBkb2MucmVwbGFjZVNlbGVjdGlvbigiIiwgbnVsbCwgIitkZWxldGUiKQogICAgICBlbHNlCiAgICAgICAgZGVsZXRlTmVhclNlbGVjdGlvbih0aGlzLCByYW5nZSA9PiB7CiAgICAgICAgICBsZXQgb3RoZXIgPSBmaW5kUG9zSChkb2MsIHJhbmdlLmhlYWQsIGRpciwgdW5pdCwgZmFsc2UpCiAgICAgICAgICByZXR1cm4gZGlyIDwgMCA/IHtmcm9tOiBvdGhlciwgdG86IHJhbmdlLmhlYWR9IDoge2Zyb206IHJhbmdlLmhlYWQsIHRvOiBvdGhlcn0KICAgICAgICB9KQogICAgfSksCgogICAgZmluZFBvc1Y6IGZ1bmN0aW9uKGZyb20sIGFtb3VudCwgdW5pdCwgZ29hbENvbHVtbikgewogICAgICBsZXQgZGlyID0gMSwgeCA9IGdvYWxDb2x1bW4KICAgICAgaWYgKGFtb3VudCA8IDApIHsgZGlyID0gLTE7IGFtb3VudCA9IC1hbW91bnQgfQogICAgICBsZXQgY3VyID0gY2xpcFBvcyh0aGlzLmRvYywgZnJvbSkKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbW91bnQ7ICsraSkgewogICAgICAgIGxldCBjb29yZHMgPSBjdXJzb3JDb29yZHModGhpcywgY3VyLCAiZGl2IikKICAgICAgICBpZiAoeCA9PSBudWxsKSB4ID0gY29vcmRzLmxlZnQKICAgICAgICBlbHNlIGNvb3Jkcy5sZWZ0ID0geAogICAgICAgIGN1ciA9IGZpbmRQb3NWKHRoaXMsIGNvb3JkcywgZGlyLCB1bml0KQogICAgICAgIGlmIChjdXIuaGl0U2lkZSkgYnJlYWsKICAgICAgfQogICAgICByZXR1cm4gY3VyCiAgICB9LAoKICAgIG1vdmVWOiBtZXRob2RPcChmdW5jdGlvbihkaXIsIHVuaXQpIHsKICAgICAgbGV0IGRvYyA9IHRoaXMuZG9jLCBnb2FscyA9IFtdCiAgICAgIGxldCBjb2xsYXBzZSA9ICF0aGlzLmRpc3BsYXkuc2hpZnQgJiYgIWRvYy5leHRlbmQgJiYgZG9jLnNlbC5zb21ldGhpbmdTZWxlY3RlZCgpCiAgICAgIGRvYy5leHRlbmRTZWxlY3Rpb25zQnkocmFuZ2UgPT4gewogICAgICAgIGlmIChjb2xsYXBzZSkKICAgICAgICAgIHJldHVybiBkaXIgPCAwID8gcmFuZ2UuZnJvbSgpIDogcmFuZ2UudG8oKQogICAgICAgIGxldCBoZWFkUG9zID0gY3Vyc29yQ29vcmRzKHRoaXMsIHJhbmdlLmhlYWQsICJkaXYiKQogICAgICAgIGlmIChyYW5nZS5nb2FsQ29sdW1uICE9IG51bGwpIGhlYWRQb3MubGVmdCA9IHJhbmdlLmdvYWxDb2x1bW4KICAgICAgICBnb2Fscy5wdXNoKGhlYWRQb3MubGVmdCkKICAgICAgICBsZXQgcG9zID0gZmluZFBvc1YodGhpcywgaGVhZFBvcywgZGlyLCB1bml0KQogICAgICAgIGlmICh1bml0ID09ICJwYWdlIiAmJiByYW5nZSA9PSBkb2Muc2VsLnByaW1hcnkoKSkKICAgICAgICAgIGFkZFRvU2Nyb2xsUG9zKHRoaXMsIG51bGwsIGNoYXJDb29yZHModGhpcywgcG9zLCAiZGl2IikudG9wIC0gaGVhZFBvcy50b3ApCiAgICAgICAgcmV0dXJuIHBvcwogICAgICB9LCBzZWxfbW92ZSkKICAgICAgaWYgKGdvYWxzLmxlbmd0aCkgZm9yIChsZXQgaSA9IDA7IGkgPCBkb2Muc2VsLnJhbmdlcy5sZW5ndGg7IGkrKykKICAgICAgICBkb2Muc2VsLnJhbmdlc1tpXS5nb2FsQ29sdW1uID0gZ29hbHNbaV0KICAgIH0pLAoKICAgIC8vIEZpbmQgdGhlIHdvcmQgYXQgdGhlIGdpdmVuIHBvc2l0aW9uIChhcyByZXR1cm5lZCBieSBjb29yZHNDaGFyKS4KICAgIGZpbmRXb3JkQXQ6IGZ1bmN0aW9uKHBvcykgewogICAgICBsZXQgZG9jID0gdGhpcy5kb2MsIGxpbmUgPSBnZXRMaW5lKGRvYywgcG9zLmxpbmUpLnRleHQKICAgICAgbGV0IHN0YXJ0ID0gcG9zLmNoLCBlbmQgPSBwb3MuY2gKICAgICAgaWYgKGxpbmUpIHsKICAgICAgICBsZXQgaGVscGVyID0gdGhpcy5nZXRIZWxwZXIocG9zLCAid29yZENoYXJzIikKICAgICAgICBpZiAoKHBvcy54UmVsIDwgMCB8fCBlbmQgPT0gbGluZS5sZW5ndGgpICYmIHN0YXJ0KSAtLXN0YXJ0OyBlbHNlICsrZW5kCiAgICAgICAgbGV0IHN0YXJ0Q2hhciA9IGxpbmUuY2hhckF0KHN0YXJ0KQogICAgICAgIGxldCBjaGVjayA9IGlzV29yZENoYXIoc3RhcnRDaGFyLCBoZWxwZXIpCiAgICAgICAgICA/IGNoID0+IGlzV29yZENoYXIoY2gsIGhlbHBlcikKICAgICAgICAgIDogL1xzLy50ZXN0KHN0YXJ0Q2hhcikgPyBjaCA9PiAvXHMvLnRlc3QoY2gpCiAgICAgICAgICA6IGNoID0+ICghL1xzLy50ZXN0KGNoKSAmJiAhaXNXb3JkQ2hhcihjaCkpCiAgICAgICAgd2hpbGUgKHN0YXJ0ID4gMCAmJiBjaGVjayhsaW5lLmNoYXJBdChzdGFydCAtIDEpKSkgLS1zdGFydAogICAgICAgIHdoaWxlIChlbmQgPCBsaW5lLmxlbmd0aCAmJiBjaGVjayhsaW5lLmNoYXJBdChlbmQpKSkgKytlbmQKICAgICAgfQogICAgICByZXR1cm4gbmV3IFJhbmdlKFBvcyhwb3MubGluZSwgc3RhcnQpLCBQb3MocG9zLmxpbmUsIGVuZCkpCiAgICB9LAoKICAgIHRvZ2dsZU92ZXJ3cml0ZTogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUgPT0gdGhpcy5zdGF0ZS5vdmVyd3JpdGUpIHJldHVybgogICAgICBpZiAodGhpcy5zdGF0ZS5vdmVyd3JpdGUgPSAhdGhpcy5zdGF0ZS5vdmVyd3JpdGUpCiAgICAgICAgYWRkQ2xhc3ModGhpcy5kaXNwbGF5LmN1cnNvckRpdiwgIkNvZGVNaXJyb3Itb3ZlcndyaXRlIikKICAgICAgZWxzZQogICAgICAgIHJtQ2xhc3ModGhpcy5kaXNwbGF5LmN1cnNvckRpdiwgIkNvZGVNaXJyb3Itb3ZlcndyaXRlIikKCiAgICAgIHNpZ25hbCh0aGlzLCAib3ZlcndyaXRlVG9nZ2xlIiwgdGhpcywgdGhpcy5zdGF0ZS5vdmVyd3JpdGUpCiAgICB9LAogICAgaGFzRm9jdXM6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5kaXNwbGF5LmlucHV0LmdldEZpZWxkKCkgPT0gYWN0aXZlRWx0KCkgfSwKICAgIGlzUmVhZE9ubHk6IGZ1bmN0aW9uKCkgeyByZXR1cm4gISEodGhpcy5vcHRpb25zLnJlYWRPbmx5IHx8IHRoaXMuZG9jLmNhbnRFZGl0KSB9LAoKICAgIHNjcm9sbFRvOiBtZXRob2RPcChmdW5jdGlvbih4LCB5KSB7CiAgICAgIGlmICh4ICE9IG51bGwgfHwgeSAhPSBudWxsKSByZXNvbHZlU2Nyb2xsVG9Qb3ModGhpcykKICAgICAgaWYgKHggIT0gbnVsbCkgdGhpcy5jdXJPcC5zY3JvbGxMZWZ0ID0geAogICAgICBpZiAoeSAhPSBudWxsKSB0aGlzLmN1ck9wLnNjcm9sbFRvcCA9IHkKICAgIH0pLAogICAgZ2V0U2Nyb2xsSW5mbzogZnVuY3Rpb24oKSB7CiAgICAgIGxldCBzY3JvbGxlciA9IHRoaXMuZGlzcGxheS5zY3JvbGxlcgogICAgICByZXR1cm4ge2xlZnQ6IHNjcm9sbGVyLnNjcm9sbExlZnQsIHRvcDogc2Nyb2xsZXIuc2Nyb2xsVG9wLAogICAgICAgICAgICAgIGhlaWdodDogc2Nyb2xsZXIuc2Nyb2xsSGVpZ2h0IC0gc2Nyb2xsR2FwKHRoaXMpIC0gdGhpcy5kaXNwbGF5LmJhckhlaWdodCwKICAgICAgICAgICAgICB3aWR0aDogc2Nyb2xsZXIuc2Nyb2xsV2lkdGggLSBzY3JvbGxHYXAodGhpcykgLSB0aGlzLmRpc3BsYXkuYmFyV2lkdGgsCiAgICAgICAgICAgICAgY2xpZW50SGVpZ2h0OiBkaXNwbGF5SGVpZ2h0KHRoaXMpLCBjbGllbnRXaWR0aDogZGlzcGxheVdpZHRoKHRoaXMpfQogICAgfSwKCiAgICBzY3JvbGxJbnRvVmlldzogbWV0aG9kT3AoZnVuY3Rpb24ocmFuZ2UsIG1hcmdpbikgewogICAgICBpZiAocmFuZ2UgPT0gbnVsbCkgewogICAgICAgIHJhbmdlID0ge2Zyb206IHRoaXMuZG9jLnNlbC5wcmltYXJ5KCkuaGVhZCwgdG86IG51bGx9CiAgICAgICAgaWYgKG1hcmdpbiA9PSBudWxsKSBtYXJnaW4gPSB0aGlzLm9wdGlvbnMuY3Vyc29yU2Nyb2xsTWFyZ2luCiAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHJhbmdlID09ICJudW1iZXIiKSB7CiAgICAgICAgcmFuZ2UgPSB7ZnJvbTogUG9zKHJhbmdlLCAwKSwgdG86IG51bGx9CiAgICAgIH0gZWxzZSBpZiAocmFuZ2UuZnJvbSA9PSBudWxsKSB7CiAgICAgICAgcmFuZ2UgPSB7ZnJvbTogcmFuZ2UsIHRvOiBudWxsfQogICAgICB9CiAgICAgIGlmICghcmFuZ2UudG8pIHJhbmdlLnRvID0gcmFuZ2UuZnJvbQogICAgICByYW5nZS5tYXJnaW4gPSBtYXJnaW4gfHwgMAoKICAgICAgaWYgKHJhbmdlLmZyb20ubGluZSAhPSBudWxsKSB7CiAgICAgICAgcmVzb2x2ZVNjcm9sbFRvUG9zKHRoaXMpCiAgICAgICAgdGhpcy5jdXJPcC5zY3JvbGxUb1BvcyA9IHJhbmdlCiAgICAgIH0gZWxzZSB7CiAgICAgICAgbGV0IHNQb3MgPSBjYWxjdWxhdGVTY3JvbGxQb3ModGhpcywgTWF0aC5taW4ocmFuZ2UuZnJvbS5sZWZ0LCByYW5nZS50by5sZWZ0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLm1pbihyYW5nZS5mcm9tLnRvcCwgcmFuZ2UudG8udG9wKSAtIHJhbmdlLm1hcmdpbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLm1heChyYW5nZS5mcm9tLnJpZ2h0LCByYW5nZS50by5yaWdodCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5tYXgocmFuZ2UuZnJvbS5ib3R0b20sIHJhbmdlLnRvLmJvdHRvbSkgKyByYW5nZS5tYXJnaW4pCiAgICAgICAgdGhpcy5zY3JvbGxUbyhzUG9zLnNjcm9sbExlZnQsIHNQb3Muc2Nyb2xsVG9wKQogICAgICB9CiAgICB9KSwKCiAgICBzZXRTaXplOiBtZXRob2RPcChmdW5jdGlvbih3aWR0aCwgaGVpZ2h0KSB7CiAgICAgIGxldCBpbnRlcnByZXQgPSB2YWwgPT4gdHlwZW9mIHZhbCA9PSAibnVtYmVyIiB8fCAvXlxkKyQvLnRlc3QoU3RyaW5nKHZhbCkpID8gdmFsICsgInB4IiA6IHZhbAogICAgICBpZiAod2lkdGggIT0gbnVsbCkgdGhpcy5kaXNwbGF5LndyYXBwZXIuc3R5bGUud2lkdGggPSBpbnRlcnByZXQod2lkdGgpCiAgICAgIGlmIChoZWlnaHQgIT0gbnVsbCkgdGhpcy5kaXNwbGF5LndyYXBwZXIuc3R5bGUuaGVpZ2h0ID0gaW50ZXJwcmV0KGhlaWdodCkKICAgICAgaWYgKHRoaXMub3B0aW9ucy5saW5lV3JhcHBpbmcpIGNsZWFyTGluZU1lYXN1cmVtZW50Q2FjaGUodGhpcykKICAgICAgbGV0IGxpbmVObyA9IHRoaXMuZGlzcGxheS52aWV3RnJvbQogICAgICB0aGlzLmRvYy5pdGVyKGxpbmVObywgdGhpcy5kaXNwbGF5LnZpZXdUbywgbGluZSA9PiB7CiAgICAgICAgaWYgKGxpbmUud2lkZ2V0cykgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lLndpZGdldHMubGVuZ3RoOyBpKyspCiAgICAgICAgICBpZiAobGluZS53aWRnZXRzW2ldLm5vSFNjcm9sbCkgeyByZWdMaW5lQ2hhbmdlKHRoaXMsIGxpbmVObywgIndpZGdldCIpOyBicmVhayB9CiAgICAgICAgKytsaW5lTm8KICAgICAgfSkKICAgICAgdGhpcy5jdXJPcC5mb3JjZVVwZGF0ZSA9IHRydWUKICAgICAgc2lnbmFsKHRoaXMsICJyZWZyZXNoIiwgdGhpcykKICAgIH0pLAoKICAgIG9wZXJhdGlvbjogZnVuY3Rpb24oZil7cmV0dXJuIHJ1bkluT3AodGhpcywgZil9LAoKICAgIHJlZnJlc2g6IG1ldGhvZE9wKGZ1bmN0aW9uKCkgewogICAgICBsZXQgb2xkSGVpZ2h0ID0gdGhpcy5kaXNwbGF5LmNhY2hlZFRleHRIZWlnaHQKICAgICAgcmVnQ2hhbmdlKHRoaXMpCiAgICAgIHRoaXMuY3VyT3AuZm9yY2VVcGRhdGUgPSB0cnVlCiAgICAgIGNsZWFyQ2FjaGVzKHRoaXMpCiAgICAgIHRoaXMuc2Nyb2xsVG8odGhpcy5kb2Muc2Nyb2xsTGVmdCwgdGhpcy5kb2Muc2Nyb2xsVG9wKQogICAgICB1cGRhdGVHdXR0ZXJTcGFjZSh0aGlzKQogICAgICBpZiAob2xkSGVpZ2h0ID09IG51bGwgfHwgTWF0aC5hYnMob2xkSGVpZ2h0IC0gdGV4dEhlaWdodCh0aGlzLmRpc3BsYXkpKSA+IC41KQogICAgICAgIGVzdGltYXRlTGluZUhlaWdodHModGhpcykKICAgICAgc2lnbmFsKHRoaXMsICJyZWZyZXNoIiwgdGhpcykKICAgIH0pLAoKICAgIHN3YXBEb2M6IG1ldGhvZE9wKGZ1bmN0aW9uKGRvYykgewogICAgICBsZXQgb2xkID0gdGhpcy5kb2MKICAgICAgb2xkLmNtID0gbnVsbAogICAgICBhdHRhY2hEb2ModGhpcywgZG9jKQogICAgICBjbGVhckNhY2hlcyh0aGlzKQogICAgICB0aGlzLmRpc3BsYXkuaW5wdXQucmVzZXQoKQogICAgICB0aGlzLnNjcm9sbFRvKGRvYy5zY3JvbGxMZWZ0LCBkb2Muc2Nyb2xsVG9wKQogICAgICB0aGlzLmN1ck9wLmZvcmNlU2Nyb2xsID0gdHJ1ZQogICAgICBzaWduYWxMYXRlcih0aGlzLCAic3dhcERvYyIsIHRoaXMsIG9sZCkKICAgICAgcmV0dXJuIG9sZAogICAgfSksCgogICAgZ2V0SW5wdXRGaWVsZDogZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kaXNwbGF5LmlucHV0LmdldEZpZWxkKCl9LAogICAgZ2V0V3JhcHBlckVsZW1lbnQ6IGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGlzcGxheS53cmFwcGVyfSwKICAgIGdldFNjcm9sbGVyRWxlbWVudDogZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kaXNwbGF5LnNjcm9sbGVyfSwKICAgIGdldEd1dHRlckVsZW1lbnQ6IGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZGlzcGxheS5ndXR0ZXJzfQogIH0KICBldmVudE1peGluKENvZGVNaXJyb3IpCgogIENvZGVNaXJyb3IucmVnaXN0ZXJIZWxwZXIgPSBmdW5jdGlvbih0eXBlLCBuYW1lLCB2YWx1ZSkgewogICAgaWYgKCFoZWxwZXJzLmhhc093blByb3BlcnR5KHR5cGUpKSBoZWxwZXJzW3R5cGVdID0gQ29kZU1pcnJvclt0eXBlXSA9IHtfZ2xvYmFsOiBbXX0KICAgIGhlbHBlcnNbdHlwZV1bbmFtZV0gPSB2YWx1ZQogIH0KICBDb2RlTWlycm9yLnJlZ2lzdGVyR2xvYmFsSGVscGVyID0gZnVuY3Rpb24odHlwZSwgbmFtZSwgcHJlZGljYXRlLCB2YWx1ZSkgewogICAgQ29kZU1pcnJvci5yZWdpc3RlckhlbHBlcih0eXBlLCBuYW1lLCB2YWx1ZSkKICAgIGhlbHBlcnNbdHlwZV0uX2dsb2JhbC5wdXNoKHtwcmVkOiBwcmVkaWNhdGUsIHZhbDogdmFsdWV9KQogIH0KfQoKLy8gVXNlZCBmb3IgaG9yaXpvbnRhbCByZWxhdGl2ZSBtb3Rpb24uIERpciBpcyAtMSBvciAxIChsZWZ0IG9yCi8vIHJpZ2h0KSwgdW5pdCBjYW4gYmUgImNoYXIiLCAiY29sdW1uIiAobGlrZSBjaGFyLCBidXQgZG9lc24ndAovLyBjcm9zcyBsaW5lIGJvdW5kYXJpZXMpLCAid29yZCIgKGFjcm9zcyBuZXh0IHdvcmQpLCBvciAiZ3JvdXAiICh0bwovLyB0aGUgc3RhcnQgb2YgbmV4dCBncm91cCBvZiB3b3JkIG9yIG5vbi13b3JkLW5vbi13aGl0ZXNwYWNlCi8vIGNoYXJzKS4gVGhlIHZpc3VhbGx5IHBhcmFtIGNvbnRyb2xzIHdoZXRoZXIsIGluIHJpZ2h0LXRvLWxlZnQKLy8gdGV4dCwgZGlyZWN0aW9uIDEgbWVhbnMgdG8gbW92ZSB0b3dhcmRzIHRoZSBuZXh0IGluZGV4IGluIHRoZQovLyBzdHJpbmcsIG9yIHRvd2FyZHMgdGhlIGNoYXJhY3RlciB0byB0aGUgcmlnaHQgb2YgdGhlIGN1cnJlbnQKLy8gcG9zaXRpb24uIFRoZSByZXN1bHRpbmcgcG9zaXRpb24gd2lsbCBoYXZlIGEgaGl0U2lkZT10cnVlCi8vIHByb3BlcnR5IGlmIGl0IHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgZG9jdW1lbnQuCmZ1bmN0aW9uIGZpbmRQb3NIKGRvYywgcG9zLCBkaXIsIHVuaXQsIHZpc3VhbGx5KSB7CiAgbGV0IGxpbmUgPSBwb3MubGluZSwgY2ggPSBwb3MuY2gsIG9yaWdEaXIgPSBkaXIKICBsZXQgbGluZU9iaiA9IGdldExpbmUoZG9jLCBsaW5lKQogIGZ1bmN0aW9uIGZpbmROZXh0TGluZSgpIHsKICAgIGxldCBsID0gbGluZSArIGRpcgogICAgaWYgKGwgPCBkb2MuZmlyc3QgfHwgbCA+PSBkb2MuZmlyc3QgKyBkb2Muc2l6ZSkgcmV0dXJuIGZhbHNlCiAgICBsaW5lID0gbAogICAgcmV0dXJuIGxpbmVPYmogPSBnZXRMaW5lKGRvYywgbCkKICB9CiAgZnVuY3Rpb24gbW92ZU9uY2UoYm91bmRUb0xpbmUpIHsKICAgIGxldCBuZXh0ID0gKHZpc3VhbGx5ID8gbW92ZVZpc3VhbGx5IDogbW92ZUxvZ2ljYWxseSkobGluZU9iaiwgY2gsIGRpciwgdHJ1ZSkKICAgIGlmIChuZXh0ID09IG51bGwpIHsKICAgICAgaWYgKCFib3VuZFRvTGluZSAmJiBmaW5kTmV4dExpbmUoKSkgewogICAgICAgIGlmICh2aXN1YWxseSkgY2ggPSAoZGlyIDwgMCA/IGxpbmVSaWdodCA6IGxpbmVMZWZ0KShsaW5lT2JqKQogICAgICAgIGVsc2UgY2ggPSBkaXIgPCAwID8gbGluZU9iai50ZXh0Lmxlbmd0aCA6IDAKICAgICAgfSBlbHNlIHJldHVybiBmYWxzZQogICAgfSBlbHNlIGNoID0gbmV4dAogICAgcmV0dXJuIHRydWUKICB9CgogIGlmICh1bml0ID09ICJjaGFyIikgewogICAgbW92ZU9uY2UoKQogIH0gZWxzZSBpZiAodW5pdCA9PSAiY29sdW1uIikgewogICAgbW92ZU9uY2UodHJ1ZSkKICB9IGVsc2UgaWYgKHVuaXQgPT0gIndvcmQiIHx8IHVuaXQgPT0gImdyb3VwIikgewogICAgbGV0IHNhd1R5cGUgPSBudWxsLCBncm91cCA9IHVuaXQgPT0gImdyb3VwIgogICAgbGV0IGhlbHBlciA9IGRvYy5jbSAmJiBkb2MuY20uZ2V0SGVscGVyKHBvcywgIndvcmRDaGFycyIpCiAgICBmb3IgKGxldCBmaXJzdCA9IHRydWU7OyBmaXJzdCA9IGZhbHNlKSB7CiAgICAgIGlmIChkaXIgPCAwICYmICFtb3ZlT25jZSghZmlyc3QpKSBicmVhawogICAgICBsZXQgY3VyID0gbGluZU9iai50ZXh0LmNoYXJBdChjaCkgfHwgIlxuIgogICAgICBsZXQgdHlwZSA9IGlzV29yZENoYXIoY3VyLCBoZWxwZXIpID8gInciCiAgICAgICAgOiBncm91cCAmJiBjdXIgPT0gIlxuIiA/ICJuIgogICAgICAgIDogIWdyb3VwIHx8IC9ccy8udGVzdChjdXIpID8gbnVsbAogICAgICAgIDogInAiCiAgICAgIGlmIChncm91cCAmJiAhZmlyc3QgJiYgIXR5cGUpIHR5cGUgPSAicyIKICAgICAgaWYgKHNhd1R5cGUgJiYgc2F3VHlwZSAhPSB0eXBlKSB7CiAgICAgICAgaWYgKGRpciA8IDApIHtkaXIgPSAxOyBtb3ZlT25jZSgpfQogICAgICAgIGJyZWFrCiAgICAgIH0KCiAgICAgIGlmICh0eXBlKSBzYXdUeXBlID0gdHlwZQogICAgICBpZiAoZGlyID4gMCAmJiAhbW92ZU9uY2UoIWZpcnN0KSkgYnJlYWsKICAgIH0KICB9CiAgbGV0IHJlc3VsdCA9IHNraXBBdG9taWMoZG9jLCBQb3MobGluZSwgY2gpLCBwb3MsIG9yaWdEaXIsIHRydWUpCiAgaWYgKCFjbXAocG9zLCByZXN1bHQpKSByZXN1bHQuaGl0U2lkZSA9IHRydWUKICByZXR1cm4gcmVzdWx0Cn0KCi8vIEZvciByZWxhdGl2ZSB2ZXJ0aWNhbCBtb3ZlbWVudC4gRGlyIG1heSBiZSAtMSBvciAxLiBVbml0IGNhbiBiZQovLyAicGFnZSIgb3IgImxpbmUiLiBUaGUgcmVzdWx0aW5nIHBvc2l0aW9uIHdpbGwgaGF2ZSBhIGhpdFNpZGU9dHJ1ZQovLyBwcm9wZXJ0eSBpZiBpdCByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGRvY3VtZW50LgpmdW5jdGlvbiBmaW5kUG9zVihjbSwgcG9zLCBkaXIsIHVuaXQpIHsKICBsZXQgZG9jID0gY20uZG9jLCB4ID0gcG9zLmxlZnQsIHkKICBpZiAodW5pdCA9PSAicGFnZSIpIHsKICAgIGxldCBwYWdlU2l6ZSA9IE1hdGgubWluKGNtLmRpc3BsYXkud3JhcHBlci5jbGllbnRIZWlnaHQsIHdpbmRvdy5pbm5lckhlaWdodCB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0KQogICAgbGV0IG1vdmVBbW91bnQgPSBNYXRoLm1heChwYWdlU2l6ZSAtIC41ICogdGV4dEhlaWdodChjbS5kaXNwbGF5KSwgMykKICAgIHkgPSAoZGlyID4gMCA/IHBvcy5ib3R0b20gOiBwb3MudG9wKSArIGRpciAqIG1vdmVBbW91bnQKCiAgfSBlbHNlIGlmICh1bml0ID09ICJsaW5lIikgewogICAgeSA9IGRpciA+IDAgPyBwb3MuYm90dG9tICsgMyA6IHBvcy50b3AgLSAzCiAgfQogIGxldCB0YXJnZXQKICBmb3IgKDs7KSB7CiAgICB0YXJnZXQgPSBjb29yZHNDaGFyKGNtLCB4LCB5KQogICAgaWYgKCF0YXJnZXQub3V0c2lkZSkgYnJlYWsKICAgIGlmIChkaXIgPCAwID8geSA8PSAwIDogeSA+PSBkb2MuaGVpZ2h0KSB7IHRhcmdldC5oaXRTaWRlID0gdHJ1ZTsgYnJlYWsgfQogICAgeSArPSBkaXIgKiA1CiAgfQogIHJldHVybiB0YXJnZXQKfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/src/edit/mouse_events.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aW1wb3J0IHsgZGVsYXlCbHVyRXZlbnQsIGVuc3VyZUZvY3VzIH0gZnJvbSAiLi4vZGlzcGxheS9mb2N1cyIKaW1wb3J0IHsgb3BlcmF0aW9uIH0gZnJvbSAiLi4vZGlzcGxheS9vcGVyYXRpb25zIgppbXBvcnQgeyB2aXNpYmxlTGluZXMgfSBmcm9tICIuLi9kaXNwbGF5L3VwZGF0ZV9saW5lcyIKaW1wb3J0IHsgY2xpcFBvcywgY21wLCBtYXhQb3MsIG1pblBvcywgUG9zIH0gZnJvbSAiLi4vbGluZS9wb3MiCmltcG9ydCB7IGdldExpbmUsIGxpbmVBdEhlaWdodCB9IGZyb20gIi4uL2xpbmUvdXRpbHNfbGluZSIKaW1wb3J0IHsgcG9zRnJvbU1vdXNlIH0gZnJvbSAiLi4vbWVhc3VyZW1lbnQvcG9zaXRpb25fbWVhc3VyZW1lbnQiCmltcG9ydCB7IGV2ZW50SW5XaWRnZXQgfSBmcm9tICIuLi9tZWFzdXJlbWVudC93aWRnZXRzIgppbXBvcnQgeyBub3JtYWxpemVTZWxlY3Rpb24sIFJhbmdlLCBTZWxlY3Rpb24gfSBmcm9tICIuLi9tb2RlbC9zZWxlY3Rpb24iCmltcG9ydCB7IGV4dGVuZFJhbmdlLCBleHRlbmRTZWxlY3Rpb24sIHJlcGxhY2VPbmVTZWxlY3Rpb24sIHNldFNlbGVjdGlvbiB9IGZyb20gIi4uL21vZGVsL3NlbGVjdGlvbl91cGRhdGVzIgppbXBvcnQgeyBjYXB0dXJlUmlnaHRDbGljaywgY2hyb21lT1MsIGllLCBpZV92ZXJzaW9uLCBtYWMsIHdlYmtpdCB9IGZyb20gIi4uL3V0aWwvYnJvd3NlciIKaW1wb3J0IHsgYWN0aXZlRWx0IH0gZnJvbSAiLi4vdXRpbC9kb20iCmltcG9ydCB7IGVfYnV0dG9uLCBlX2RlZmF1bHRQcmV2ZW50ZWQsIGVfcHJldmVudERlZmF1bHQsIGVfdGFyZ2V0LCBoYXNIYW5kbGVyLCBvZmYsIG9uLCBzaWduYWwsIHNpZ25hbERPTUV2ZW50IH0gZnJvbSAiLi4vdXRpbC9ldmVudCIKaW1wb3J0IHsgZHJhZ0FuZERyb3AgfSBmcm9tICIuLi91dGlsL2ZlYXR1cmVfZGV0ZWN0aW9uIgppbXBvcnQgeyBiaW5kLCBjb3VudENvbHVtbiwgZmluZENvbHVtbiwgc2VsX21vdXNlIH0gZnJvbSAiLi4vdXRpbC9taXNjIgoKLy8gQSBtb3VzZSBkb3duIGNhbiBiZSBhIHNpbmdsZSBjbGljaywgZG91YmxlIGNsaWNrLCB0cmlwbGUgY2xpY2ssCi8vIHN0YXJ0IG9mIHNlbGVjdGlvbiBkcmFnLCBzdGFydCBvZiB0ZXh0IGRyYWcsIG5ldyBjdXJzb3IKLy8gKGN0cmwtY2xpY2spLCByZWN0YW5nbGUgZHJhZyAoYWx0LWRyYWcpLCBvciB4d2luCi8vIG1pZGRsZS1jbGljay1wYXN0ZS4gT3IgaXQgbWlnaHQgYmUgYSBjbGljayBvbiBzb21ldGhpbmcgd2Ugc2hvdWxkCi8vIG5vdCBpbnRlcmZlcmUgd2l0aCwgc3VjaCBhcyBhIHNjcm9sbGJhciBvciB3aWRnZXQuCmV4cG9ydCBmdW5jdGlvbiBvbk1vdXNlRG93bihlKSB7CiAgbGV0IGNtID0gdGhpcywgZGlzcGxheSA9IGNtLmRpc3BsYXkKICBpZiAoc2lnbmFsRE9NRXZlbnQoY20sIGUpIHx8IGRpc3BsYXkuYWN0aXZlVG91Y2ggJiYgZGlzcGxheS5pbnB1dC5zdXBwb3J0c1RvdWNoKCkpIHJldHVybgogIGRpc3BsYXkuc2hpZnQgPSBlLnNoaWZ0S2V5CgogIGlmIChldmVudEluV2lkZ2V0KGRpc3BsYXksIGUpKSB7CiAgICBpZiAoIXdlYmtpdCkgewogICAgICAvLyBCcmllZmx5IHR1cm4gb2ZmIGRyYWdnYWJpbGl0eSwgdG8gYWxsb3cgd2lkZ2V0cyB0byBkbwogICAgICAvLyBub3JtYWwgZHJhZ2dpbmcgdGhpbmdzLgogICAgICBkaXNwbGF5LnNjcm9sbGVyLmRyYWdnYWJsZSA9IGZhbHNlCiAgICAgIHNldFRpbWVvdXQoKCkgPT4gZGlzcGxheS5zY3JvbGxlci5kcmFnZ2FibGUgPSB0cnVlLCAxMDApCiAgICB9CiAgICByZXR1cm4KICB9CiAgaWYgKGNsaWNrSW5HdXR0ZXIoY20sIGUpKSByZXR1cm4KICBsZXQgc3RhcnQgPSBwb3NGcm9tTW91c2UoY20sIGUpCiAgd2luZG93LmZvY3VzKCkKCiAgc3dpdGNoIChlX2J1dHRvbihlKSkgewogIGNhc2UgMToKICAgIC8vICMzMjYxOiBtYWtlIHN1cmUsIHRoYXQgd2UncmUgbm90IHN0YXJ0aW5nIGEgc2Vjb25kIHNlbGVjdGlvbgogICAgaWYgKGNtLnN0YXRlLnNlbGVjdGluZ1RleHQpCiAgICAgIGNtLnN0YXRlLnNlbGVjdGluZ1RleHQoZSkKICAgIGVsc2UgaWYgKHN0YXJ0KQogICAgICBsZWZ0QnV0dG9uRG93bihjbSwgZSwgc3RhcnQpCiAgICBlbHNlIGlmIChlX3RhcmdldChlKSA9PSBkaXNwbGF5LnNjcm9sbGVyKQogICAgICBlX3ByZXZlbnREZWZhdWx0KGUpCiAgICBicmVhawogIGNhc2UgMjoKICAgIGlmICh3ZWJraXQpIGNtLnN0YXRlLmxhc3RNaWRkbGVEb3duID0gK25ldyBEYXRlCiAgICBpZiAoc3RhcnQpIGV4dGVuZFNlbGVjdGlvbihjbS5kb2MsIHN0YXJ0KQogICAgc2V0VGltZW91dCgoKSA9PiBkaXNwbGF5LmlucHV0LmZvY3VzKCksIDIwKQogICAgZV9wcmV2ZW50RGVmYXVsdChlKQogICAgYnJlYWsKICBjYXNlIDM6CiAgICBpZiAoY2FwdHVyZVJpZ2h0Q2xpY2spIG9uQ29udGV4dE1lbnUoY20sIGUpCiAgICBlbHNlIGRlbGF5Qmx1ckV2ZW50KGNtKQogICAgYnJlYWsKICB9Cn0KCmxldCBsYXN0Q2xpY2ssIGxhc3REb3VibGVDbGljawpmdW5jdGlvbiBsZWZ0QnV0dG9uRG93bihjbSwgZSwgc3RhcnQpIHsKICBpZiAoaWUpIHNldFRpbWVvdXQoYmluZChlbnN1cmVGb2N1cywgY20pLCAwKQogIGVsc2UgY20uY3VyT3AuZm9jdXMgPSBhY3RpdmVFbHQoKQoKICBsZXQgbm93ID0gK25ldyBEYXRlLCB0eXBlCiAgaWYgKGxhc3REb3VibGVDbGljayAmJiBsYXN0RG91YmxlQ2xpY2sudGltZSA+IG5vdyAtIDQwMCAmJiBjbXAobGFzdERvdWJsZUNsaWNrLnBvcywgc3RhcnQpID09IDApIHsKICAgIHR5cGUgPSAidHJpcGxlIgogIH0gZWxzZSBpZiAobGFzdENsaWNrICYmIGxhc3RDbGljay50aW1lID4gbm93IC0gNDAwICYmIGNtcChsYXN0Q2xpY2sucG9zLCBzdGFydCkgPT0gMCkgewogICAgdHlwZSA9ICJkb3VibGUiCiAgICBsYXN0RG91YmxlQ2xpY2sgPSB7dGltZTogbm93LCBwb3M6IHN0YXJ0fQogIH0gZWxzZSB7CiAgICB0eXBlID0gInNpbmdsZSIKICAgIGxhc3RDbGljayA9IHt0aW1lOiBub3csIHBvczogc3RhcnR9CiAgfQoKICBsZXQgc2VsID0gY20uZG9jLnNlbCwgbW9kaWZpZXIgPSBtYWMgPyBlLm1ldGFLZXkgOiBlLmN0cmxLZXksIGNvbnRhaW5lZAogIGlmIChjbS5vcHRpb25zLmRyYWdEcm9wICYmIGRyYWdBbmREcm9wICYmICFjbS5pc1JlYWRPbmx5KCkgJiYKICAgICAgdHlwZSA9PSAic2luZ2xlIiAmJiAoY29udGFpbmVkID0gc2VsLmNvbnRhaW5zKHN0YXJ0KSkgPiAtMSAmJgogICAgICAoY21wKChjb250YWluZWQgPSBzZWwucmFuZ2VzW2NvbnRhaW5lZF0pLmZyb20oKSwgc3RhcnQpIDwgMCB8fCBzdGFydC54UmVsID4gMCkgJiYKICAgICAgKGNtcChjb250YWluZWQudG8oKSwgc3RhcnQpID4gMCB8fCBzdGFydC54UmVsIDwgMCkpCiAgICBsZWZ0QnV0dG9uU3RhcnREcmFnKGNtLCBlLCBzdGFydCwgbW9kaWZpZXIpCiAgZWxzZQogICAgbGVmdEJ1dHRvblNlbGVjdChjbSwgZSwgc3RhcnQsIHR5cGUsIG1vZGlmaWVyKQp9CgovLyBTdGFydCBhIHRleHQgZHJhZy4gV2hlbiBpdCBlbmRzLCBzZWUgaWYgYW55IGRyYWdnaW5nIGFjdHVhbGx5Ci8vIGhhcHBlbiwgYW5kIHRyZWF0IGFzIGEgY2xpY2sgaWYgaXQgZGlkbid0LgpmdW5jdGlvbiBsZWZ0QnV0dG9uU3RhcnREcmFnKGNtLCBlLCBzdGFydCwgbW9kaWZpZXIpIHsKICBsZXQgZGlzcGxheSA9IGNtLmRpc3BsYXksIHN0YXJ0VGltZSA9ICtuZXcgRGF0ZQogIGxldCBkcmFnRW5kID0gb3BlcmF0aW9uKGNtLCBlMiA9PiB7CiAgICBpZiAod2Via2l0KSBkaXNwbGF5LnNjcm9sbGVyLmRyYWdnYWJsZSA9IGZhbHNlCiAgICBjbS5zdGF0ZS5kcmFnZ2luZ1RleHQgPSBmYWxzZQogICAgb2ZmKGRvY3VtZW50LCAibW91c2V1cCIsIGRyYWdFbmQpCiAgICBvZmYoZGlzcGxheS5zY3JvbGxlciwgImRyb3AiLCBkcmFnRW5kKQogICAgaWYgKE1hdGguYWJzKGUuY2xpZW50WCAtIGUyLmNsaWVudFgpICsgTWF0aC5hYnMoZS5jbGllbnRZIC0gZTIuY2xpZW50WSkgPCAxMCkgewogICAgICBlX3ByZXZlbnREZWZhdWx0KGUyKQogICAgICBpZiAoIW1vZGlmaWVyICYmICtuZXcgRGF0ZSAtIDIwMCA8IHN0YXJ0VGltZSkKICAgICAgICBleHRlbmRTZWxlY3Rpb24oY20uZG9jLCBzdGFydCkKICAgICAgLy8gV29yayBhcm91bmQgdW5leHBsYWluYWJsZSBmb2N1cyBwcm9ibGVtIGluIElFOSAoIzIxMjcpIGFuZCBDaHJvbWUgKCMzMDgxKQogICAgICBpZiAod2Via2l0IHx8IGllICYmIGllX3ZlcnNpb24gPT0gOSkKICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtkb2N1bWVudC5ib2R5LmZvY3VzKCk7IGRpc3BsYXkuaW5wdXQuZm9jdXMoKX0sIDIwKQogICAgICBlbHNlCiAgICAgICAgZGlzcGxheS5pbnB1dC5mb2N1cygpCiAgICB9CiAgfSkKICAvLyBMZXQgdGhlIGRyYWcgaGFuZGxlciBoYW5kbGUgdGhpcy4KICBpZiAod2Via2l0KSBkaXNwbGF5LnNjcm9sbGVyLmRyYWdnYWJsZSA9IHRydWUKICBjbS5zdGF0ZS5kcmFnZ2luZ1RleHQgPSBkcmFnRW5kCiAgZHJhZ0VuZC5jb3B5ID0gbWFjID8gZS5hbHRLZXkgOiBlLmN0cmxLZXkKICAvLyBJRSdzIGFwcHJvYWNoIHRvIGRyYWdnYWJsZQogIGlmIChkaXNwbGF5LnNjcm9sbGVyLmRyYWdEcm9wKSBkaXNwbGF5LnNjcm9sbGVyLmRyYWdEcm9wKCkKICBvbihkb2N1bWVudCwgIm1vdXNldXAiLCBkcmFnRW5kKQogIG9uKGRpc3BsYXkuc2Nyb2xsZXIsICJkcm9wIiwgZHJhZ0VuZCkKfQoKLy8gTm9ybWFsIHNlbGVjdGlvbiwgYXMgb3Bwb3NlZCB0byB0ZXh0IGRyYWdnaW5nLgpmdW5jdGlvbiBsZWZ0QnV0dG9uU2VsZWN0KGNtLCBlLCBzdGFydCwgdHlwZSwgYWRkTmV3KSB7CiAgbGV0IGRpc3BsYXkgPSBjbS5kaXNwbGF5LCBkb2MgPSBjbS5kb2MKICBlX3ByZXZlbnREZWZhdWx0KGUpCgogIGxldCBvdXJSYW5nZSwgb3VySW5kZXgsIHN0YXJ0U2VsID0gZG9jLnNlbCwgcmFuZ2VzID0gc3RhcnRTZWwucmFuZ2VzCiAgaWYgKGFkZE5ldyAmJiAhZS5zaGlmdEtleSkgewogICAgb3VySW5kZXggPSBkb2Muc2VsLmNvbnRhaW5zKHN0YXJ0KQogICAgaWYgKG91ckluZGV4ID4gLTEpCiAgICAgIG91clJhbmdlID0gcmFuZ2VzW291ckluZGV4XQogICAgZWxzZQogICAgICBvdXJSYW5nZSA9IG5ldyBSYW5nZShzdGFydCwgc3RhcnQpCiAgfSBlbHNlIHsKICAgIG91clJhbmdlID0gZG9jLnNlbC5wcmltYXJ5KCkKICAgIG91ckluZGV4ID0gZG9jLnNlbC5wcmltSW5kZXgKICB9CgogIGlmIChjaHJvbWVPUyA/IGUuc2hpZnRLZXkgJiYgZS5tZXRhS2V5IDogZS5hbHRLZXkpIHsKICAgIHR5cGUgPSAicmVjdCIKICAgIGlmICghYWRkTmV3KSBvdXJSYW5nZSA9IG5ldyBSYW5nZShzdGFydCwgc3RhcnQpCiAgICBzdGFydCA9IHBvc0Zyb21Nb3VzZShjbSwgZSwgdHJ1ZSwgdHJ1ZSkKICAgIG91ckluZGV4ID0gLTEKICB9IGVsc2UgaWYgKHR5cGUgPT0gImRvdWJsZSIpIHsKICAgIGxldCB3b3JkID0gY20uZmluZFdvcmRBdChzdGFydCkKICAgIGlmIChjbS5kaXNwbGF5LnNoaWZ0IHx8IGRvYy5leHRlbmQpCiAgICAgIG91clJhbmdlID0gZXh0ZW5kUmFuZ2UoZG9jLCBvdXJSYW5nZSwgd29yZC5hbmNob3IsIHdvcmQuaGVhZCkKICAgIGVsc2UKICAgICAgb3VyUmFuZ2UgPSB3b3JkCiAgfSBlbHNlIGlmICh0eXBlID09ICJ0cmlwbGUiKSB7CiAgICBsZXQgbGluZSA9IG5ldyBSYW5nZShQb3Moc3RhcnQubGluZSwgMCksIGNsaXBQb3MoZG9jLCBQb3Moc3RhcnQubGluZSArIDEsIDApKSkKICAgIGlmIChjbS5kaXNwbGF5LnNoaWZ0IHx8IGRvYy5leHRlbmQpCiAgICAgIG91clJhbmdlID0gZXh0ZW5kUmFuZ2UoZG9jLCBvdXJSYW5nZSwgbGluZS5hbmNob3IsIGxpbmUuaGVhZCkKICAgIGVsc2UKICAgICAgb3VyUmFuZ2UgPSBsaW5lCiAgfSBlbHNlIHsKICAgIG91clJhbmdlID0gZXh0ZW5kUmFuZ2UoZG9jLCBvdXJSYW5nZSwgc3RhcnQpCiAgfQoKICBpZiAoIWFkZE5ldykgewogICAgb3VySW5kZXggPSAwCiAgICBzZXRTZWxlY3Rpb24oZG9jLCBuZXcgU2VsZWN0aW9uKFtvdXJSYW5nZV0sIDApLCBzZWxfbW91c2UpCiAgICBzdGFydFNlbCA9IGRvYy5zZWwKICB9IGVsc2UgaWYgKG91ckluZGV4ID09IC0xKSB7CiAgICBvdXJJbmRleCA9IHJhbmdlcy5sZW5ndGgKICAgIHNldFNlbGVjdGlvbihkb2MsIG5vcm1hbGl6ZVNlbGVjdGlvbihyYW5nZXMuY29uY2F0KFtvdXJSYW5nZV0pLCBvdXJJbmRleCksCiAgICAgICAgICAgICAgICAge3Njcm9sbDogZmFsc2UsIG9yaWdpbjogIiptb3VzZSJ9KQogIH0gZWxzZSBpZiAocmFuZ2VzLmxlbmd0aCA+IDEgJiYgcmFuZ2VzW291ckluZGV4XS5lbXB0eSgpICYmIHR5cGUgPT0gInNpbmdsZSIgJiYgIWUuc2hpZnRLZXkpIHsKICAgIHNldFNlbGVjdGlvbihkb2MsIG5vcm1hbGl6ZVNlbGVjdGlvbihyYW5nZXMuc2xpY2UoMCwgb3VySW5kZXgpLmNvbmNhdChyYW5nZXMuc2xpY2Uob3VySW5kZXggKyAxKSksIDApLAogICAgICAgICAgICAgICAgIHtzY3JvbGw6IGZhbHNlLCBvcmlnaW46ICIqbW91c2UifSkKICAgIHN0YXJ0U2VsID0gZG9jLnNlbAogIH0gZWxzZSB7CiAgICByZXBsYWNlT25lU2VsZWN0aW9uKGRvYywgb3VySW5kZXgsIG91clJhbmdlLCBzZWxfbW91c2UpCiAgfQoKICBsZXQgbGFzdFBvcyA9IHN0YXJ0CiAgZnVuY3Rpb24gZXh0ZW5kVG8ocG9zKSB7CiAgICBpZiAoY21wKGxhc3RQb3MsIHBvcykgPT0gMCkgcmV0dXJuCiAgICBsYXN0UG9zID0gcG9zCgogICAgaWYgKHR5cGUgPT0gInJlY3QiKSB7CiAgICAgIGxldCByYW5nZXMgPSBbXSwgdGFiU2l6ZSA9IGNtLm9wdGlvbnMudGFiU2l6ZQogICAgICBsZXQgc3RhcnRDb2wgPSBjb3VudENvbHVtbihnZXRMaW5lKGRvYywgc3RhcnQubGluZSkudGV4dCwgc3RhcnQuY2gsIHRhYlNpemUpCiAgICAgIGxldCBwb3NDb2wgPSBjb3VudENvbHVtbihnZXRMaW5lKGRvYywgcG9zLmxpbmUpLnRleHQsIHBvcy5jaCwgdGFiU2l6ZSkKICAgICAgbGV0IGxlZnQgPSBNYXRoLm1pbihzdGFydENvbCwgcG9zQ29sKSwgcmlnaHQgPSBNYXRoLm1heChzdGFydENvbCwgcG9zQ29sKQogICAgICBmb3IgKGxldCBsaW5lID0gTWF0aC5taW4oc3RhcnQubGluZSwgcG9zLmxpbmUpLCBlbmQgPSBNYXRoLm1pbihjbS5sYXN0TGluZSgpLCBNYXRoLm1heChzdGFydC5saW5lLCBwb3MubGluZSkpOwogICAgICAgICAgIGxpbmUgPD0gZW5kOyBsaW5lKyspIHsKICAgICAgICBsZXQgdGV4dCA9IGdldExpbmUoZG9jLCBsaW5lKS50ZXh0LCBsZWZ0UG9zID0gZmluZENvbHVtbih0ZXh0LCBsZWZ0LCB0YWJTaXplKQogICAgICAgIGlmIChsZWZ0ID09IHJpZ2h0KQogICAgICAgICAgcmFuZ2VzLnB1c2gobmV3IFJhbmdlKFBvcyhsaW5lLCBsZWZ0UG9zKSwgUG9zKGxpbmUsIGxlZnRQb3MpKSkKICAgICAgICBlbHNlIGlmICh0ZXh0Lmxlbmd0aCA+IGxlZnRQb3MpCiAgICAgICAgICByYW5nZXMucHVzaChuZXcgUmFuZ2UoUG9zKGxpbmUsIGxlZnRQb3MpLCBQb3MobGluZSwgZmluZENvbHVtbih0ZXh0LCByaWdodCwgdGFiU2l6ZSkpKSkKICAgICAgfQogICAgICBpZiAoIXJhbmdlcy5sZW5ndGgpIHJhbmdlcy5wdXNoKG5ldyBSYW5nZShzdGFydCwgc3RhcnQpKQogICAgICBzZXRTZWxlY3Rpb24oZG9jLCBub3JtYWxpemVTZWxlY3Rpb24oc3RhcnRTZWwucmFuZ2VzLnNsaWNlKDAsIG91ckluZGV4KS5jb25jYXQocmFuZ2VzKSwgb3VySW5kZXgpLAogICAgICAgICAgICAgICAgICAge29yaWdpbjogIiptb3VzZSIsIHNjcm9sbDogZmFsc2V9KQogICAgICBjbS5zY3JvbGxJbnRvVmlldyhwb3MpCiAgICB9IGVsc2UgewogICAgICBsZXQgb2xkUmFuZ2UgPSBvdXJSYW5nZQogICAgICBsZXQgYW5jaG9yID0gb2xkUmFuZ2UuYW5jaG9yLCBoZWFkID0gcG9zCiAgICAgIGlmICh0eXBlICE9ICJzaW5nbGUiKSB7CiAgICAgICAgbGV0IHJhbmdlCiAgICAgICAgaWYgKHR5cGUgPT0gImRvdWJsZSIpCiAgICAgICAgICByYW5nZSA9IGNtLmZpbmRXb3JkQXQocG9zKQogICAgICAgIGVsc2UKICAgICAgICAgIHJhbmdlID0gbmV3IFJhbmdlKFBvcyhwb3MubGluZSwgMCksIGNsaXBQb3MoZG9jLCBQb3MocG9zLmxpbmUgKyAxLCAwKSkpCiAgICAgICAgaWYgKGNtcChyYW5nZS5hbmNob3IsIGFuY2hvcikgPiAwKSB7CiAgICAgICAgICBoZWFkID0gcmFuZ2UuaGVhZAogICAgICAgICAgYW5jaG9yID0gbWluUG9zKG9sZFJhbmdlLmZyb20oKSwgcmFuZ2UuYW5jaG9yKQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBoZWFkID0gcmFuZ2UuYW5jaG9yCiAgICAgICAgICBhbmNob3IgPSBtYXhQb3Mob2xkUmFuZ2UudG8oKSwgcmFuZ2UuaGVhZCkKICAgICAgICB9CiAgICAgIH0KICAgICAgbGV0IHJhbmdlcyA9IHN0YXJ0U2VsLnJhbmdlcy5zbGljZSgwKQogICAgICByYW5nZXNbb3VySW5kZXhdID0gbmV3IFJhbmdlKGNsaXBQb3MoZG9jLCBhbmNob3IpLCBoZWFkKQogICAgICBzZXRTZWxlY3Rpb24oZG9jLCBub3JtYWxpemVTZWxlY3Rpb24ocmFuZ2VzLCBvdXJJbmRleCksIHNlbF9tb3VzZSkKICAgIH0KICB9CgogIGxldCBlZGl0b3JTaXplID0gZGlzcGxheS53cmFwcGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpCiAgLy8gVXNlZCB0byBlbnN1cmUgdGltZW91dCByZS10cmllcyBkb24ndCBmaXJlIHdoZW4gYW5vdGhlciBleHRlbmQKICAvLyBoYXBwZW5lZCBpbiB0aGUgbWVhbnRpbWUgKGNsZWFyVGltZW91dCBpc24ndCByZWxpYWJsZSAtLSBhdAogIC8vIGxlYXN0IG9uIENocm9tZSwgdGhlIHRpbWVvdXRzIHN0aWxsIGhhcHBlbiBldmVuIHdoZW4gY2xlYXJlZCwKICAvLyBpZiB0aGUgY2xlYXIgaGFwcGVucyBhZnRlciB0aGVpciBzY2hlZHVsZWQgZmlyaW5nIHRpbWUpLgogIGxldCBjb3VudGVyID0gMAoKICBmdW5jdGlvbiBleHRlbmQoZSkgewogICAgbGV0IGN1ckNvdW50ID0gKytjb3VudGVyCiAgICBsZXQgY3VyID0gcG9zRnJvbU1vdXNlKGNtLCBlLCB0cnVlLCB0eXBlID09ICJyZWN0IikKICAgIGlmICghY3VyKSByZXR1cm4KICAgIGlmIChjbXAoY3VyLCBsYXN0UG9zKSAhPSAwKSB7CiAgICAgIGNtLmN1ck9wLmZvY3VzID0gYWN0aXZlRWx0KCkKICAgICAgZXh0ZW5kVG8oY3VyKQogICAgICBsZXQgdmlzaWJsZSA9IHZpc2libGVMaW5lcyhkaXNwbGF5LCBkb2MpCiAgICAgIGlmIChjdXIubGluZSA+PSB2aXNpYmxlLnRvIHx8IGN1ci5saW5lIDwgdmlzaWJsZS5mcm9tKQogICAgICAgIHNldFRpbWVvdXQob3BlcmF0aW9uKGNtLCAoKSA9PiB7aWYgKGNvdW50ZXIgPT0gY3VyQ291bnQpIGV4dGVuZChlKX0pLCAxNTApCiAgICB9IGVsc2UgewogICAgICBsZXQgb3V0c2lkZSA9IGUuY2xpZW50WSA8IGVkaXRvclNpemUudG9wID8gLTIwIDogZS5jbGllbnRZID4gZWRpdG9yU2l6ZS5ib3R0b20gPyAyMCA6IDAKICAgICAgaWYgKG91dHNpZGUpIHNldFRpbWVvdXQob3BlcmF0aW9uKGNtLCAoKSA9PiB7CiAgICAgICAgaWYgKGNvdW50ZXIgIT0gY3VyQ291bnQpIHJldHVybgogICAgICAgIGRpc3BsYXkuc2Nyb2xsZXIuc2Nyb2xsVG9wICs9IG91dHNpZGUKICAgICAgICBleHRlbmQoZSkKICAgICAgfSksIDUwKQogICAgfQogIH0KCiAgZnVuY3Rpb24gZG9uZShlKSB7CiAgICBjbS5zdGF0ZS5zZWxlY3RpbmdUZXh0ID0gZmFsc2UKICAgIGNvdW50ZXIgPSBJbmZpbml0eQogICAgZV9wcmV2ZW50RGVmYXVsdChlKQogICAgZGlzcGxheS5pbnB1dC5mb2N1cygpCiAgICBvZmYoZG9jdW1lbnQsICJtb3VzZW1vdmUiLCBtb3ZlKQogICAgb2ZmKGRvY3VtZW50LCAibW91c2V1cCIsIHVwKQogICAgZG9jLmhpc3RvcnkubGFzdFNlbE9yaWdpbiA9IG51bGwKICB9CgogIGxldCBtb3ZlID0gb3BlcmF0aW9uKGNtLCBlID0+IHsKICAgIGlmICghZV9idXR0b24oZSkpIGRvbmUoZSkKICAgIGVsc2UgZXh0ZW5kKGUpCiAgfSkKICBsZXQgdXAgPSBvcGVyYXRpb24oY20sIGRvbmUpCiAgY20uc3RhdGUuc2VsZWN0aW5nVGV4dCA9IHVwCiAgb24oZG9jdW1lbnQsICJtb3VzZW1vdmUiLCBtb3ZlKQogIG9uKGRvY3VtZW50LCAibW91c2V1cCIsIHVwKQp9CgoKLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIGFuIGV2ZW50IGhhcHBlbmVkIGluIHRoZSBndXR0ZXIsIGFuZCBmaXJlcyB0aGUKLy8gaGFuZGxlcnMgZm9yIHRoZSBjb3JyZXNwb25kaW5nIGV2ZW50LgpmdW5jdGlvbiBndXR0ZXJFdmVudChjbSwgZSwgdHlwZSwgcHJldmVudCkgewogIGxldCBtWCwgbVkKICB0cnkgeyBtWCA9IGUuY2xpZW50WDsgbVkgPSBlLmNsaWVudFkgfQogIGNhdGNoKGUpIHsgcmV0dXJuIGZhbHNlIH0KICBpZiAobVggPj0gTWF0aC5mbG9vcihjbS5kaXNwbGF5Lmd1dHRlcnMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkucmlnaHQpKSByZXR1cm4gZmFsc2UKICBpZiAocHJldmVudCkgZV9wcmV2ZW50RGVmYXVsdChlKQoKICBsZXQgZGlzcGxheSA9IGNtLmRpc3BsYXkKICBsZXQgbGluZUJveCA9IGRpc3BsYXkubGluZURpdi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKQoKICBpZiAobVkgPiBsaW5lQm94LmJvdHRvbSB8fCAhaGFzSGFuZGxlcihjbSwgdHlwZSkpIHJldHVybiBlX2RlZmF1bHRQcmV2ZW50ZWQoZSkKICBtWSAtPSBsaW5lQm94LnRvcCAtIGRpc3BsYXkudmlld09mZnNldAoKICBmb3IgKGxldCBpID0gMDsgaSA8IGNtLm9wdGlvbnMuZ3V0dGVycy5sZW5ndGg7ICsraSkgewogICAgbGV0IGcgPSBkaXNwbGF5Lmd1dHRlcnMuY2hpbGROb2Rlc1tpXQogICAgaWYgKGcgJiYgZy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5yaWdodCA+PSBtWCkgewogICAgICBsZXQgbGluZSA9IGxpbmVBdEhlaWdodChjbS5kb2MsIG1ZKQogICAgICBsZXQgZ3V0dGVyID0gY20ub3B0aW9ucy5ndXR0ZXJzW2ldCiAgICAgIHNpZ25hbChjbSwgdHlwZSwgY20sIGxpbmUsIGd1dHRlciwgZSkKICAgICAgcmV0dXJuIGVfZGVmYXVsdFByZXZlbnRlZChlKQogICAgfQogIH0KfQoKZXhwb3J0IGZ1bmN0aW9uIGNsaWNrSW5HdXR0ZXIoY20sIGUpIHsKICByZXR1cm4gZ3V0dGVyRXZlbnQoY20sIGUsICJndXR0ZXJDbGljayIsIHRydWUpCn0KCi8vIENPTlRFWFQgTUVOVSBIQU5ETElORwoKLy8gVG8gbWFrZSB0aGUgY29udGV4dCBtZW51IHdvcmssIHdlIG5lZWQgdG8gYnJpZWZseSB1bmhpZGUgdGhlCi8vIHRleHRhcmVhIChtYWtpbmcgaXQgYXMgdW5vYnRydXNpdmUgYXMgcG9zc2libGUpIHRvIGxldCB0aGUKLy8gcmlnaHQtY2xpY2sgdGFrZSBlZmZlY3Qgb24gaXQuCmV4cG9ydCBmdW5jdGlvbiBvbkNvbnRleHRNZW51KGNtLCBlKSB7CiAgaWYgKGV2ZW50SW5XaWRnZXQoY20uZGlzcGxheSwgZSkgfHwgY29udGV4dE1lbnVJbkd1dHRlcihjbSwgZSkpIHJldHVybgogIGlmIChzaWduYWxET01FdmVudChjbSwgZSwgImNvbnRleHRtZW51IikpIHJldHVybgogIGNtLmRpc3BsYXkuaW5wdXQub25Db250ZXh0TWVudShlKQp9CgpmdW5jdGlvbiBjb250ZXh0TWVudUluR3V0dGVyKGNtLCBlKSB7CiAgaWYgKCFoYXNIYW5kbGVyKGNtLCAiZ3V0dGVyQ29udGV4dE1lbnUiKSkgcmV0dXJuIGZhbHNlCiAgcmV0dXJuIGd1dHRlckV2ZW50KGNtLCBlLCAiZ3V0dGVyQ29udGV4dE1lbnUiLCBmYWxzZSkKfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/src/edit/options.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aW1wb3J0IHsgb25CbHVyIH0gZnJvbSAiLi4vZGlzcGxheS9mb2N1cyIKaW1wb3J0IHsgc2V0R3V0dGVyc0ZvckxpbmVOdW1iZXJzLCB1cGRhdGVHdXR0ZXJzIH0gZnJvbSAiLi4vZGlzcGxheS9ndXR0ZXJzIgppbXBvcnQgeyBhbGlnbkhvcml6b250YWxseSB9IGZyb20gIi4uL2Rpc3BsYXkvbGluZV9udW1iZXJzIgppbXBvcnQgeyBsb2FkTW9kZSwgcmVzZXRNb2RlU3RhdGUgfSBmcm9tICIuLi9kaXNwbGF5L21vZGVfc3RhdGUiCmltcG9ydCB7IGluaXRTY3JvbGxiYXJzLCB1cGRhdGVTY3JvbGxiYXJzIH0gZnJvbSAiLi4vZGlzcGxheS9zY3JvbGxiYXJzIgppbXBvcnQgeyB1cGRhdGVTZWxlY3Rpb24gfSBmcm9tICIuLi9kaXNwbGF5L3NlbGVjdGlvbiIKaW1wb3J0IHsgcmVnQ2hhbmdlIH0gZnJvbSAiLi4vZGlzcGxheS92aWV3X3RyYWNraW5nIgppbXBvcnQgeyBnZXRLZXlNYXAgfSBmcm9tICIuLi9pbnB1dC9rZXltYXAiCmltcG9ydCB7IGRlZmF1bHRTcGVjaWFsQ2hhclBsYWNlaG9sZGVyIH0gZnJvbSAiLi4vbGluZS9saW5lX2RhdGEiCmltcG9ydCB7IFBvcyB9IGZyb20gIi4uL2xpbmUvcG9zIgppbXBvcnQgeyBmaW5kTWF4TGluZSB9IGZyb20gIi4uL2xpbmUvc3BhbnMiCmltcG9ydCB7IGNsZWFyQ2FjaGVzLCBjb21wZW5zYXRlRm9ySFNjcm9sbCwgZXN0aW1hdGVMaW5lSGVpZ2h0cyB9IGZyb20gIi4uL21lYXN1cmVtZW50L3Bvc2l0aW9uX21lYXN1cmVtZW50IgppbXBvcnQgeyByZXBsYWNlUmFuZ2UgfSBmcm9tICIuLi9tb2RlbC9jaGFuZ2VzIgppbXBvcnQgeyBtb2JpbGUsIHdpbmRvd3MgfSBmcm9tICIuLi91dGlsL2Jyb3dzZXIiCmltcG9ydCB7IGFkZENsYXNzLCBybUNsYXNzIH0gZnJvbSAiLi4vdXRpbC9kb20iCmltcG9ydCB7IG9mZiwgb24gfSBmcm9tICIuLi91dGlsL2V2ZW50IgoKaW1wb3J0IHsgdGhlbWVDaGFuZ2VkIH0gZnJvbSAiLi91dGlscyIKCmV4cG9ydCBsZXQgSW5pdCA9IHt0b1N0cmluZzogZnVuY3Rpb24oKXtyZXR1cm4gIkNvZGVNaXJyb3IuSW5pdCJ9fQoKZXhwb3J0IGxldCBkZWZhdWx0cyA9IHt9CmV4cG9ydCBsZXQgb3B0aW9uSGFuZGxlcnMgPSB7fQoKZXhwb3J0IGZ1bmN0aW9uIGRlZmluZU9wdGlvbnMoQ29kZU1pcnJvcikgewogIGxldCBvcHRpb25IYW5kbGVycyA9IENvZGVNaXJyb3Iub3B0aW9uSGFuZGxlcnMKCiAgZnVuY3Rpb24gb3B0aW9uKG5hbWUsIGRlZmx0LCBoYW5kbGUsIG5vdE9uSW5pdCkgewogICAgQ29kZU1pcnJvci5kZWZhdWx0c1tuYW1lXSA9IGRlZmx0CiAgICBpZiAoaGFuZGxlKSBvcHRpb25IYW5kbGVyc1tuYW1lXSA9CiAgICAgIG5vdE9uSW5pdCA/IChjbSwgdmFsLCBvbGQpID0+IHtpZiAob2xkICE9IEluaXQpIGhhbmRsZShjbSwgdmFsLCBvbGQpfSA6IGhhbmRsZQogIH0KCiAgQ29kZU1pcnJvci5kZWZpbmVPcHRpb24gPSBvcHRpb24KCiAgLy8gUGFzc2VkIHRvIG9wdGlvbiBoYW5kbGVycyB3aGVuIHRoZXJlIGlzIG5vIG9sZCB2YWx1ZS4KICBDb2RlTWlycm9yLkluaXQgPSBJbml0CgogIC8vIFRoZXNlIHR3byBhcmUsIG9uIGluaXQsIGNhbGxlZCBmcm9tIHRoZSBjb25zdHJ1Y3RvciBiZWNhdXNlIHRoZXkKICAvLyBoYXZlIHRvIGJlIGluaXRpYWxpemVkIGJlZm9yZSB0aGUgZWRpdG9yIGNhbiBzdGFydCBhdCBhbGwuCiAgb3B0aW9uKCJ2YWx1ZSIsICIiLCAoY20sIHZhbCkgPT4gY20uc2V0VmFsdWUodmFsKSwgdHJ1ZSkKICBvcHRpb24oIm1vZGUiLCBudWxsLCAoY20sIHZhbCkgPT4gewogICAgY20uZG9jLm1vZGVPcHRpb24gPSB2YWwKICAgIGxvYWRNb2RlKGNtKQogIH0sIHRydWUpCgogIG9wdGlvbigiaW5kZW50VW5pdCIsIDIsIGxvYWRNb2RlLCB0cnVlKQogIG9wdGlvbigiaW5kZW50V2l0aFRhYnMiLCBmYWxzZSkKICBvcHRpb24oInNtYXJ0SW5kZW50IiwgdHJ1ZSkKICBvcHRpb24oInRhYlNpemUiLCA0LCBjbSA9PiB7CiAgICByZXNldE1vZGVTdGF0ZShjbSkKICAgIGNsZWFyQ2FjaGVzKGNtKQogICAgcmVnQ2hhbmdlKGNtKQogIH0sIHRydWUpCiAgb3B0aW9uKCJsaW5lU2VwYXJhdG9yIiwgbnVsbCwgKGNtLCB2YWwpID0+IHsKICAgIGNtLmRvYy5saW5lU2VwID0gdmFsCiAgICBpZiAoIXZhbCkgcmV0dXJuCiAgICBsZXQgbmV3QnJlYWtzID0gW10sIGxpbmVObyA9IGNtLmRvYy5maXJzdAogICAgY20uZG9jLml0ZXIobGluZSA9PiB7CiAgICAgIGZvciAobGV0IHBvcyA9IDA7OykgewogICAgICAgIGxldCBmb3VuZCA9IGxpbmUudGV4dC5pbmRleE9mKHZhbCwgcG9zKQogICAgICAgIGlmIChmb3VuZCA9PSAtMSkgYnJlYWsKICAgICAgICBwb3MgPSBmb3VuZCArIHZhbC5sZW5ndGgKICAgICAgICBuZXdCcmVha3MucHVzaChQb3MobGluZU5vLCBmb3VuZCkpCiAgICAgIH0KICAgICAgbGluZU5vKysKICAgIH0pCiAgICBmb3IgKGxldCBpID0gbmV3QnJlYWtzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKQogICAgICByZXBsYWNlUmFuZ2UoY20uZG9jLCB2YWwsIG5ld0JyZWFrc1tpXSwgUG9zKG5ld0JyZWFrc1tpXS5saW5lLCBuZXdCcmVha3NbaV0uY2ggKyB2YWwubGVuZ3RoKSkKICB9KQogIG9wdGlvbigic3BlY2lhbENoYXJzIiwgL1tcdTAwMDAtXHUwMDFmXHUwMDdmXHUwMGFkXHUyMDBiLVx1MjAwZlx1MjAyOFx1MjAyOVx1ZmVmZl0vZywgKGNtLCB2YWwsIG9sZCkgPT4gewogICAgY20uc3RhdGUuc3BlY2lhbENoYXJzID0gbmV3IFJlZ0V4cCh2YWwuc291cmNlICsgKHZhbC50ZXN0KCJcdCIpID8gIiIgOiAifFx0IiksICJnIikKICAgIGlmIChvbGQgIT0gSW5pdCkgY20ucmVmcmVzaCgpCiAgfSkKICBvcHRpb24oInNwZWNpYWxDaGFyUGxhY2Vob2xkZXIiLCBkZWZhdWx0U3BlY2lhbENoYXJQbGFjZWhvbGRlciwgY20gPT4gY20ucmVmcmVzaCgpLCB0cnVlKQogIG9wdGlvbigiZWxlY3RyaWNDaGFycyIsIHRydWUpCiAgb3B0aW9uKCJpbnB1dFN0eWxlIiwgbW9iaWxlID8gImNvbnRlbnRlZGl0YWJsZSIgOiAidGV4dGFyZWEiLCAoKSA9PiB7CiAgICB0aHJvdyBuZXcgRXJyb3IoImlucHV0U3R5bGUgY2FuIG5vdCAoeWV0KSBiZSBjaGFuZ2VkIGluIGEgcnVubmluZyBlZGl0b3IiKSAvLyBGSVhNRQogIH0sIHRydWUpCiAgb3B0aW9uKCJzcGVsbGNoZWNrIiwgZmFsc2UsIChjbSwgdmFsKSA9PiBjbS5nZXRJbnB1dEZpZWxkKCkuc3BlbGxjaGVjayA9IHZhbCwgdHJ1ZSkKICBvcHRpb24oInJ0bE1vdmVWaXN1YWxseSIsICF3aW5kb3dzKQogIG9wdGlvbigid2hvbGVMaW5lVXBkYXRlQmVmb3JlIiwgdHJ1ZSkKCiAgb3B0aW9uKCJ0aGVtZSIsICJkZWZhdWx0IiwgY20gPT4gewogICAgdGhlbWVDaGFuZ2VkKGNtKQogICAgZ3V0dGVyc0NoYW5nZWQoY20pCiAgfSwgdHJ1ZSkKICBvcHRpb24oImtleU1hcCIsICJkZWZhdWx0IiwgKGNtLCB2YWwsIG9sZCkgPT4gewogICAgbGV0IG5leHQgPSBnZXRLZXlNYXAodmFsKQogICAgbGV0IHByZXYgPSBvbGQgIT0gSW5pdCAmJiBnZXRLZXlNYXAob2xkKQogICAgaWYgKHByZXYgJiYgcHJldi5kZXRhY2gpIHByZXYuZGV0YWNoKGNtLCBuZXh0KQogICAgaWYgKG5leHQuYXR0YWNoKSBuZXh0LmF0dGFjaChjbSwgcHJldiB8fCBudWxsKQogIH0pCiAgb3B0aW9uKCJleHRyYUtleXMiLCBudWxsKQoKICBvcHRpb24oImxpbmVXcmFwcGluZyIsIGZhbHNlLCB3cmFwcGluZ0NoYW5nZWQsIHRydWUpCiAgb3B0aW9uKCJndXR0ZXJzIiwgW10sIGNtID0+IHsKICAgIHNldEd1dHRlcnNGb3JMaW5lTnVtYmVycyhjbS5vcHRpb25zKQogICAgZ3V0dGVyc0NoYW5nZWQoY20pCiAgfSwgdHJ1ZSkKICBvcHRpb24oImZpeGVkR3V0dGVyIiwgdHJ1ZSwgKGNtLCB2YWwpID0+IHsKICAgIGNtLmRpc3BsYXkuZ3V0dGVycy5zdHlsZS5sZWZ0ID0gdmFsID8gY29tcGVuc2F0ZUZvckhTY3JvbGwoY20uZGlzcGxheSkgKyAicHgiIDogIjAiCiAgICBjbS5yZWZyZXNoKCkKICB9LCB0cnVlKQogIG9wdGlvbigiY292ZXJHdXR0ZXJOZXh0VG9TY3JvbGxiYXIiLCBmYWxzZSwgY20gPT4gdXBkYXRlU2Nyb2xsYmFycyhjbSksIHRydWUpCiAgb3B0aW9uKCJzY3JvbGxiYXJTdHlsZSIsICJuYXRpdmUiLCBjbSA9PiB7CiAgICBpbml0U2Nyb2xsYmFycyhjbSkKICAgIHVwZGF0ZVNjcm9sbGJhcnMoY20pCiAgICBjbS5kaXNwbGF5LnNjcm9sbGJhcnMuc2V0U2Nyb2xsVG9wKGNtLmRvYy5zY3JvbGxUb3ApCiAgICBjbS5kaXNwbGF5LnNjcm9sbGJhcnMuc2V0U2Nyb2xsTGVmdChjbS5kb2Muc2Nyb2xsTGVmdCkKICB9LCB0cnVlKQogIG9wdGlvbigibGluZU51bWJlcnMiLCBmYWxzZSwgY20gPT4gewogICAgc2V0R3V0dGVyc0ZvckxpbmVOdW1iZXJzKGNtLm9wdGlvbnMpCiAgICBndXR0ZXJzQ2hhbmdlZChjbSkKICB9LCB0cnVlKQogIG9wdGlvbigiZmlyc3RMaW5lTnVtYmVyIiwgMSwgZ3V0dGVyc0NoYW5nZWQsIHRydWUpCiAgb3B0aW9uKCJsaW5lTnVtYmVyRm9ybWF0dGVyIiwgaW50ZWdlciA9PiBpbnRlZ2VyLCBndXR0ZXJzQ2hhbmdlZCwgdHJ1ZSkKICBvcHRpb24oInNob3dDdXJzb3JXaGVuU2VsZWN0aW5nIiwgZmFsc2UsIHVwZGF0ZVNlbGVjdGlvbiwgdHJ1ZSkKCiAgb3B0aW9uKCJyZXNldFNlbGVjdGlvbk9uQ29udGV4dE1lbnUiLCB0cnVlKQogIG9wdGlvbigibGluZVdpc2VDb3B5Q3V0IiwgdHJ1ZSkKCiAgb3B0aW9uKCJyZWFkT25seSIsIGZhbHNlLCAoY20sIHZhbCkgPT4gewogICAgaWYgKHZhbCA9PSAibm9jdXJzb3IiKSB7CiAgICAgIG9uQmx1cihjbSkKICAgICAgY20uZGlzcGxheS5pbnB1dC5ibHVyKCkKICAgICAgY20uZGlzcGxheS5kaXNhYmxlZCA9IHRydWUKICAgIH0gZWxzZSB7CiAgICAgIGNtLmRpc3BsYXkuZGlzYWJsZWQgPSBmYWxzZQogICAgfQogICAgY20uZGlzcGxheS5pbnB1dC5yZWFkT25seUNoYW5nZWQodmFsKQogIH0pCiAgb3B0aW9uKCJkaXNhYmxlSW5wdXQiLCBmYWxzZSwgKGNtLCB2YWwpID0+IHtpZiAoIXZhbCkgY20uZGlzcGxheS5pbnB1dC5yZXNldCgpfSwgdHJ1ZSkKICBvcHRpb24oImRyYWdEcm9wIiwgdHJ1ZSwgZHJhZ0Ryb3BDaGFuZ2VkKQogIG9wdGlvbigiYWxsb3dEcm9wRmlsZVR5cGVzIiwgbnVsbCkKCiAgb3B0aW9uKCJjdXJzb3JCbGlua1JhdGUiLCA1MzApCiAgb3B0aW9uKCJjdXJzb3JTY3JvbGxNYXJnaW4iLCAwKQogIG9wdGlvbigiY3Vyc29ySGVpZ2h0IiwgMSwgdXBkYXRlU2VsZWN0aW9uLCB0cnVlKQogIG9wdGlvbigic2luZ2xlQ3Vyc29ySGVpZ2h0UGVyTGluZSIsIHRydWUsIHVwZGF0ZVNlbGVjdGlvbiwgdHJ1ZSkKICBvcHRpb24oIndvcmtUaW1lIiwgMTAwKQogIG9wdGlvbigid29ya0RlbGF5IiwgMTAwKQogIG9wdGlvbigiZmxhdHRlblNwYW5zIiwgdHJ1ZSwgcmVzZXRNb2RlU3RhdGUsIHRydWUpCiAgb3B0aW9uKCJhZGRNb2RlQ2xhc3MiLCBmYWxzZSwgcmVzZXRNb2RlU3RhdGUsIHRydWUpCiAgb3B0aW9uKCJwb2xsSW50ZXJ2YWwiLCAxMDApCiAgb3B0aW9uKCJ1bmRvRGVwdGgiLCAyMDAsIChjbSwgdmFsKSA9PiBjbS5kb2MuaGlzdG9yeS51bmRvRGVwdGggPSB2YWwpCiAgb3B0aW9uKCJoaXN0b3J5RXZlbnREZWxheSIsIDEyNTApCiAgb3B0aW9uKCJ2aWV3cG9ydE1hcmdpbiIsIDEwLCBjbSA9PiBjbS5yZWZyZXNoKCksIHRydWUpCiAgb3B0aW9uKCJtYXhIaWdobGlnaHRMZW5ndGgiLCAxMDAwMCwgcmVzZXRNb2RlU3RhdGUsIHRydWUpCiAgb3B0aW9uKCJtb3ZlSW5wdXRXaXRoQ3Vyc29yIiwgdHJ1ZSwgKGNtLCB2YWwpID0+IHsKICAgIGlmICghdmFsKSBjbS5kaXNwbGF5LmlucHV0LnJlc2V0UG9zaXRpb24oKQogIH0pCgogIG9wdGlvbigidGFiaW5kZXgiLCBudWxsLCAoY20sIHZhbCkgPT4gY20uZGlzcGxheS5pbnB1dC5nZXRGaWVsZCgpLnRhYkluZGV4ID0gdmFsIHx8ICIiKQogIG9wdGlvbigiYXV0b2ZvY3VzIiwgbnVsbCkKfQoKZnVuY3Rpb24gZ3V0dGVyc0NoYW5nZWQoY20pIHsKICB1cGRhdGVHdXR0ZXJzKGNtKQogIHJlZ0NoYW5nZShjbSkKICBzZXRUaW1lb3V0KCgpID0+IGFsaWduSG9yaXpvbnRhbGx5KGNtKSwgMjApCn0KCmZ1bmN0aW9uIGRyYWdEcm9wQ2hhbmdlZChjbSwgdmFsdWUsIG9sZCkgewogIGxldCB3YXNPbiA9IG9sZCAmJiBvbGQgIT0gSW5pdAogIGlmICghdmFsdWUgIT0gIXdhc09uKSB7CiAgICBsZXQgZnVuY3MgPSBjbS5kaXNwbGF5LmRyYWdGdW5jdGlvbnMKICAgIGxldCB0b2dnbGUgPSB2YWx1ZSA/IG9uIDogb2ZmCiAgICB0b2dnbGUoY20uZGlzcGxheS5zY3JvbGxlciwgImRyYWdzdGFydCIsIGZ1bmNzLnN0YXJ0KQogICAgdG9nZ2xlKGNtLmRpc3BsYXkuc2Nyb2xsZXIsICJkcmFnZW50ZXIiLCBmdW5jcy5lbnRlcikKICAgIHRvZ2dsZShjbS5kaXNwbGF5LnNjcm9sbGVyLCAiZHJhZ292ZXIiLCBmdW5jcy5vdmVyKQogICAgdG9nZ2xlKGNtLmRpc3BsYXkuc2Nyb2xsZXIsICJkcmFnbGVhdmUiLCBmdW5jcy5sZWF2ZSkKICAgIHRvZ2dsZShjbS5kaXNwbGF5LnNjcm9sbGVyLCAiZHJvcCIsIGZ1bmNzLmRyb3ApCiAgfQp9CgpmdW5jdGlvbiB3cmFwcGluZ0NoYW5nZWQoY20pIHsKICBpZiAoY20ub3B0aW9ucy5saW5lV3JhcHBpbmcpIHsKICAgIGFkZENsYXNzKGNtLmRpc3BsYXkud3JhcHBlciwgIkNvZGVNaXJyb3Itd3JhcCIpCiAgICBjbS5kaXNwbGF5LnNpemVyLnN0eWxlLm1pbldpZHRoID0gIiIKICAgIGNtLmRpc3BsYXkuc2l6ZXJXaWR0aCA9IG51bGwKICB9IGVsc2UgewogICAgcm1DbGFzcyhjbS5kaXNwbGF5LndyYXBwZXIsICJDb2RlTWlycm9yLXdyYXAiKQogICAgZmluZE1heExpbmUoY20pCiAgfQogIGVzdGltYXRlTGluZUhlaWdodHMoY20pCiAgcmVnQ2hhbmdlKGNtKQogIGNsZWFyQ2FjaGVzKGNtKQogIHNldFRpbWVvdXQoKCkgPT4gdXBkYXRlU2Nyb2xsYmFycyhjbSksIDEwMCkKfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/src/edit/utils.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aW1wb3J0IHsgY2xlYXJDYWNoZXMgfSBmcm9tICIuLi9tZWFzdXJlbWVudC9wb3NpdGlvbl9tZWFzdXJlbWVudCIKCmV4cG9ydCBmdW5jdGlvbiB0aGVtZUNoYW5nZWQoY20pIHsKICBjbS5kaXNwbGF5LndyYXBwZXIuY2xhc3NOYW1lID0gY20uZGlzcGxheS53cmFwcGVyLmNsYXNzTmFtZS5yZXBsYWNlKC9ccypjbS1zLVxTKy9nLCAiIikgKwogICAgY20ub3B0aW9ucy50aGVtZS5yZXBsYWNlKC8oXnxccylccyovZywgIiBjbS1zLSIpCiAgY2xlYXJDYWNoZXMoY20pCn0K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/src/input/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/src/input/ContentEditableInput.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aW1wb3J0IHsgb3BlcmF0aW9uLCBydW5Jbk9wIH0gZnJvbSAiLi4vZGlzcGxheS9vcGVyYXRpb25zIgppbXBvcnQgeyBwcmVwYXJlU2VsZWN0aW9uIH0gZnJvbSAiLi4vZGlzcGxheS9zZWxlY3Rpb24iCmltcG9ydCB7IHJlZ0NoYW5nZSB9IGZyb20gIi4uL2Rpc3BsYXkvdmlld190cmFja2luZyIKaW1wb3J0IHsgYXBwbHlUZXh0SW5wdXQsIGNvcHlhYmxlUmFuZ2VzLCBkaXNhYmxlQnJvd3Nlck1hZ2ljLCBoYW5kbGVQYXN0ZSwgaGlkZGVuVGV4dGFyZWEsIGxhc3RDb3BpZWQsIHNldExhc3RDb3BpZWQgfSBmcm9tICIuL2lucHV0IgppbXBvcnQgeyBjbXAsIG1heFBvcywgbWluUG9zLCBQb3MgfSBmcm9tICIuLi9saW5lL3BvcyIKaW1wb3J0IHsgZ2V0QmV0d2VlbiwgZ2V0TGluZSwgbGluZU5vIH0gZnJvbSAiLi4vbGluZS91dGlsc19saW5lIgppbXBvcnQgeyBmaW5kVmlld0ZvckxpbmUsIGZpbmRWaWV3SW5kZXgsIG1hcEZyb21MaW5lVmlldywgbm9kZUFuZE9mZnNldEluTGluZU1hcCB9IGZyb20gIi4uL21lYXN1cmVtZW50L3Bvc2l0aW9uX21lYXN1cmVtZW50IgppbXBvcnQgeyByZXBsYWNlUmFuZ2UgfSBmcm9tICIuLi9tb2RlbC9jaGFuZ2VzIgppbXBvcnQgeyBzaW1wbGVTZWxlY3Rpb24gfSBmcm9tICIuLi9tb2RlbC9zZWxlY3Rpb24iCmltcG9ydCB7IHNldFNlbGVjdGlvbiB9IGZyb20gIi4uL21vZGVsL3NlbGVjdGlvbl91cGRhdGVzIgppbXBvcnQgeyBnZXRCaWRpUGFydEF0LCBnZXRPcmRlciB9IGZyb20gIi4uL3V0aWwvYmlkaSIKaW1wb3J0IHsgZ2Vja28sIGllX3ZlcnNpb24gfSBmcm9tICIuLi91dGlsL2Jyb3dzZXIiCmltcG9ydCB7IGNvbnRhaW5zLCByYW5nZSwgcmVtb3ZlQ2hpbGRyZW5BbmRBZGQsIHNlbGVjdElucHV0IH0gZnJvbSAiLi4vdXRpbC9kb20iCmltcG9ydCB7IG9uLCBzaWduYWxET01FdmVudCB9IGZyb20gIi4uL3V0aWwvZXZlbnQiCmltcG9ydCB7IGNvcHlPYmosIERlbGF5ZWQsIGxzdCwgbm90aGluZywgc2VsX2RvbnRTY3JvbGwgfSBmcm9tICIuLi91dGlsL21pc2MiCgovLyBDT05URU5URURJVEFCTEUgSU5QVVQgU1RZTEUKCmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIENvbnRlbnRFZGl0YWJsZUlucHV0KGNtKSB7CiAgdGhpcy5jbSA9IGNtCiAgdGhpcy5sYXN0QW5jaG9yTm9kZSA9IHRoaXMubGFzdEFuY2hvck9mZnNldCA9IHRoaXMubGFzdEZvY3VzTm9kZSA9IHRoaXMubGFzdEZvY3VzT2Zmc2V0ID0gbnVsbAogIHRoaXMucG9sbGluZyA9IG5ldyBEZWxheWVkKCkKICB0aGlzLmdyYWNlUGVyaW9kID0gZmFsc2UKfQoKQ29udGVudEVkaXRhYmxlSW5wdXQucHJvdG90eXBlID0gY29weU9iaih7CiAgaW5pdDogZnVuY3Rpb24oZGlzcGxheSkgewogICAgbGV0IGlucHV0ID0gdGhpcywgY20gPSBpbnB1dC5jbQogICAgbGV0IGRpdiA9IGlucHV0LmRpdiA9IGRpc3BsYXkubGluZURpdgogICAgZGlzYWJsZUJyb3dzZXJNYWdpYyhkaXYsIGNtLm9wdGlvbnMuc3BlbGxjaGVjaykKCiAgICBvbihkaXYsICJwYXN0ZSIsIGUgPT4gewogICAgICBpZiAoc2lnbmFsRE9NRXZlbnQoY20sIGUpIHx8IGhhbmRsZVBhc3RlKGUsIGNtKSkgcmV0dXJuCiAgICAgIC8vIElFIGRvZXNuJ3QgZmlyZSBpbnB1dCBldmVudHMsIHNvIHdlIHNjaGVkdWxlIGEgcmVhZCBmb3IgdGhlIHBhc3RlZCBjb250ZW50IGluIHRoaXMgd2F5CiAgICAgIGlmIChpZV92ZXJzaW9uIDw9IDExKSBzZXRUaW1lb3V0KG9wZXJhdGlvbihjbSwgKCkgPT4gewogICAgICAgIGlmICghaW5wdXQucG9sbENvbnRlbnQoKSkgcmVnQ2hhbmdlKGNtKQogICAgICB9KSwgMjApCiAgICB9KQoKICAgIG9uKGRpdiwgImNvbXBvc2l0aW9uc3RhcnQiLCBlID0+IHsKICAgICAgbGV0IGRhdGEgPSBlLmRhdGEKICAgICAgaW5wdXQuY29tcG9zaW5nID0ge3NlbDogY20uZG9jLnNlbCwgZGF0YTogZGF0YSwgc3RhcnREYXRhOiBkYXRhfQogICAgICBpZiAoIWRhdGEpIHJldHVybgogICAgICBsZXQgcHJpbSA9IGNtLmRvYy5zZWwucHJpbWFyeSgpCiAgICAgIGxldCBsaW5lID0gY20uZ2V0TGluZShwcmltLmhlYWQubGluZSkKICAgICAgbGV0IGZvdW5kID0gbGluZS5pbmRleE9mKGRhdGEsIE1hdGgubWF4KDAsIHByaW0uaGVhZC5jaCAtIGRhdGEubGVuZ3RoKSkKICAgICAgaWYgKGZvdW5kID4gLTEgJiYgZm91bmQgPD0gcHJpbS5oZWFkLmNoKQogICAgICAgIGlucHV0LmNvbXBvc2luZy5zZWwgPSBzaW1wbGVTZWxlY3Rpb24oUG9zKHByaW0uaGVhZC5saW5lLCBmb3VuZCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3MocHJpbS5oZWFkLmxpbmUsIGZvdW5kICsgZGF0YS5sZW5ndGgpKQogICAgfSkKICAgIG9uKGRpdiwgImNvbXBvc2l0aW9udXBkYXRlIiwgZSA9PiBpbnB1dC5jb21wb3NpbmcuZGF0YSA9IGUuZGF0YSkKICAgIG9uKGRpdiwgImNvbXBvc2l0aW9uZW5kIiwgZSA9PiB7CiAgICAgIGxldCBvdXJzID0gaW5wdXQuY29tcG9zaW5nCiAgICAgIGlmICghb3VycykgcmV0dXJuCiAgICAgIGlmIChlLmRhdGEgIT0gb3Vycy5zdGFydERhdGEgJiYgIS9cdTIwMGIvLnRlc3QoZS5kYXRhKSkKICAgICAgICBvdXJzLmRhdGEgPSBlLmRhdGEKICAgICAgLy8gTmVlZCBhIHNtYWxsIGRlbGF5IHRvIHByZXZlbnQgb3RoZXIgY29kZSAoaW5wdXQgZXZlbnQsCiAgICAgIC8vIHNlbGVjdGlvbiBwb2xsaW5nKSBmcm9tIGRvaW5nIGRhbWFnZSB3aGVuIGZpcmVkIHJpZ2h0IGFmdGVyCiAgICAgIC8vIGNvbXBvc2l0aW9uZW5kLgogICAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICBpZiAoIW91cnMuaGFuZGxlZCkKICAgICAgICAgIGlucHV0LmFwcGx5Q29tcG9zaXRpb24ob3VycykKICAgICAgICBpZiAoaW5wdXQuY29tcG9zaW5nID09IG91cnMpCiAgICAgICAgICBpbnB1dC5jb21wb3NpbmcgPSBudWxsCiAgICAgIH0sIDUwKQogICAgfSkKCiAgICBvbihkaXYsICJ0b3VjaHN0YXJ0IiwgKCkgPT4gaW5wdXQuZm9yY2VDb21wb3NpdGlvbkVuZCgpKQoKICAgIG9uKGRpdiwgImlucHV0IiwgKCkgPT4gewogICAgICBpZiAoaW5wdXQuY29tcG9zaW5nKSByZXR1cm4KICAgICAgaWYgKGNtLmlzUmVhZE9ubHkoKSB8fCAhaW5wdXQucG9sbENvbnRlbnQoKSkKICAgICAgICBydW5Jbk9wKGlucHV0LmNtLCAoKSA9PiByZWdDaGFuZ2UoY20pKQogICAgfSkKCiAgICBmdW5jdGlvbiBvbkNvcHlDdXQoZSkgewogICAgICBpZiAoc2lnbmFsRE9NRXZlbnQoY20sIGUpKSByZXR1cm4KICAgICAgaWYgKGNtLnNvbWV0aGluZ1NlbGVjdGVkKCkpIHsKICAgICAgICBzZXRMYXN0Q29waWVkKHtsaW5lV2lzZTogZmFsc2UsIHRleHQ6IGNtLmdldFNlbGVjdGlvbnMoKX0pCiAgICAgICAgaWYgKGUudHlwZSA9PSAiY3V0IikgY20ucmVwbGFjZVNlbGVjdGlvbigiIiwgbnVsbCwgImN1dCIpCiAgICAgIH0gZWxzZSBpZiAoIWNtLm9wdGlvbnMubGluZVdpc2VDb3B5Q3V0KSB7CiAgICAgICAgcmV0dXJuCiAgICAgIH0gZWxzZSB7CiAgICAgICAgbGV0IHJhbmdlcyA9IGNvcHlhYmxlUmFuZ2VzKGNtKQogICAgICAgIHNldExhc3RDb3BpZWQoe2xpbmVXaXNlOiB0cnVlLCB0ZXh0OiByYW5nZXMudGV4dH0pCiAgICAgICAgaWYgKGUudHlwZSA9PSAiY3V0IikgewogICAgICAgICAgY20ub3BlcmF0aW9uKCgpID0+IHsKICAgICAgICAgICAgY20uc2V0U2VsZWN0aW9ucyhyYW5nZXMucmFuZ2VzLCAwLCBzZWxfZG9udFNjcm9sbCkKICAgICAgICAgICAgY20ucmVwbGFjZVNlbGVjdGlvbigiIiwgbnVsbCwgImN1dCIpCiAgICAgICAgICB9KQogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoZS5jbGlwYm9hcmREYXRhKSB7CiAgICAgICAgZS5jbGlwYm9hcmREYXRhLmNsZWFyRGF0YSgpCiAgICAgICAgbGV0IGNvbnRlbnQgPSBsYXN0Q29waWVkLnRleHQuam9pbigiXG4iKQogICAgICAgIC8vIGlPUyBleHBvc2VzIHRoZSBjbGlwYm9hcmQgQVBJLCBidXQgc2VlbXMgdG8gZGlzY2FyZCBjb250ZW50IGluc2VydGVkIGludG8gaXQKICAgICAgICBlLmNsaXBib2FyZERhdGEuc2V0RGF0YSgiVGV4dCIsIGNvbnRlbnQpCiAgICAgICAgaWYgKGUuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCJUZXh0IikgPT0gY29udGVudCkgewogICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpCiAgICAgICAgICByZXR1cm4KICAgICAgICB9CiAgICAgIH0KICAgICAgLy8gT2xkLWZhc2hpb25lZCBicmllZmx5LWZvY3VzLWEtdGV4dGFyZWEgaGFjawogICAgICBsZXQga2x1ZGdlID0gaGlkZGVuVGV4dGFyZWEoKSwgdGUgPSBrbHVkZ2UuZmlyc3RDaGlsZAogICAgICBjbS5kaXNwbGF5LmxpbmVTcGFjZS5pbnNlcnRCZWZvcmUoa2x1ZGdlLCBjbS5kaXNwbGF5LmxpbmVTcGFjZS5maXJzdENoaWxkKQogICAgICB0ZS52YWx1ZSA9IGxhc3RDb3BpZWQudGV4dC5qb2luKCJcbiIpCiAgICAgIGxldCBoYWRGb2N1cyA9IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQKICAgICAgc2VsZWN0SW5wdXQodGUpCiAgICAgIHNldFRpbWVvdXQoKCkgPT4gewogICAgICAgIGNtLmRpc3BsYXkubGluZVNwYWNlLnJlbW92ZUNoaWxkKGtsdWRnZSkKICAgICAgICBoYWRGb2N1cy5mb2N1cygpCiAgICAgICAgaWYgKGhhZEZvY3VzID09IGRpdikgaW5wdXQuc2hvd1ByaW1hcnlTZWxlY3Rpb24oKQogICAgICB9LCA1MCkKICAgIH0KICAgIG9uKGRpdiwgImNvcHkiLCBvbkNvcHlDdXQpCiAgICBvbihkaXYsICJjdXQiLCBvbkNvcHlDdXQpCiAgfSwKCiAgcHJlcGFyZVNlbGVjdGlvbjogZnVuY3Rpb24oKSB7CiAgICBsZXQgcmVzdWx0ID0gcHJlcGFyZVNlbGVjdGlvbih0aGlzLmNtLCBmYWxzZSkKICAgIHJlc3VsdC5mb2N1cyA9IHRoaXMuY20uc3RhdGUuZm9jdXNlZAogICAgcmV0dXJuIHJlc3VsdAogIH0sCgogIHNob3dTZWxlY3Rpb246IGZ1bmN0aW9uKGluZm8sIHRha2VGb2N1cykgewogICAgaWYgKCFpbmZvIHx8ICF0aGlzLmNtLmRpc3BsYXkudmlldy5sZW5ndGgpIHJldHVybgogICAgaWYgKGluZm8uZm9jdXMgfHwgdGFrZUZvY3VzKSB0aGlzLnNob3dQcmltYXJ5U2VsZWN0aW9uKCkKICAgIHRoaXMuc2hvd011bHRpcGxlU2VsZWN0aW9ucyhpbmZvKQogIH0sCgogIHNob3dQcmltYXJ5U2VsZWN0aW9uOiBmdW5jdGlvbigpIHsKICAgIGxldCBzZWwgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCksIHByaW0gPSB0aGlzLmNtLmRvYy5zZWwucHJpbWFyeSgpCiAgICBsZXQgY3VyQW5jaG9yID0gZG9tVG9Qb3ModGhpcy5jbSwgc2VsLmFuY2hvck5vZGUsIHNlbC5hbmNob3JPZmZzZXQpCiAgICBsZXQgY3VyRm9jdXMgPSBkb21Ub1Bvcyh0aGlzLmNtLCBzZWwuZm9jdXNOb2RlLCBzZWwuZm9jdXNPZmZzZXQpCiAgICBpZiAoY3VyQW5jaG9yICYmICFjdXJBbmNob3IuYmFkICYmIGN1ckZvY3VzICYmICFjdXJGb2N1cy5iYWQgJiYKICAgICAgICBjbXAobWluUG9zKGN1ckFuY2hvciwgY3VyRm9jdXMpLCBwcmltLmZyb20oKSkgPT0gMCAmJgogICAgICAgIGNtcChtYXhQb3MoY3VyQW5jaG9yLCBjdXJGb2N1cyksIHByaW0udG8oKSkgPT0gMCkKICAgICAgcmV0dXJuCgogICAgbGV0IHN0YXJ0ID0gcG9zVG9ET00odGhpcy5jbSwgcHJpbS5mcm9tKCkpCiAgICBsZXQgZW5kID0gcG9zVG9ET00odGhpcy5jbSwgcHJpbS50bygpKQogICAgaWYgKCFzdGFydCAmJiAhZW5kKSByZXR1cm4KCiAgICBsZXQgdmlldyA9IHRoaXMuY20uZGlzcGxheS52aWV3CiAgICBsZXQgb2xkID0gc2VsLnJhbmdlQ291bnQgJiYgc2VsLmdldFJhbmdlQXQoMCkKICAgIGlmICghc3RhcnQpIHsKICAgICAgc3RhcnQgPSB7bm9kZTogdmlld1swXS5tZWFzdXJlLm1hcFsyXSwgb2Zmc2V0OiAwfQogICAgfSBlbHNlIGlmICghZW5kKSB7IC8vIEZJWE1FIGRhbmdlcm91c2x5IGhhY2t5CiAgICAgIGxldCBtZWFzdXJlID0gdmlld1t2aWV3Lmxlbmd0aCAtIDFdLm1lYXN1cmUKICAgICAgbGV0IG1hcCA9IG1lYXN1cmUubWFwcyA/IG1lYXN1cmUubWFwc1ttZWFzdXJlLm1hcHMubGVuZ3RoIC0gMV0gOiBtZWFzdXJlLm1hcAogICAgICBlbmQgPSB7bm9kZTogbWFwW21hcC5sZW5ndGggLSAxXSwgb2Zmc2V0OiBtYXBbbWFwLmxlbmd0aCAtIDJdIC0gbWFwW21hcC5sZW5ndGggLSAzXX0KICAgIH0KCiAgICBsZXQgcm5nCiAgICB0cnkgeyBybmcgPSByYW5nZShzdGFydC5ub2RlLCBzdGFydC5vZmZzZXQsIGVuZC5vZmZzZXQsIGVuZC5ub2RlKSB9CiAgICBjYXRjaChlKSB7fSAvLyBPdXIgbW9kZWwgb2YgdGhlIERPTSBtaWdodCBiZSBvdXRkYXRlZCwgaW4gd2hpY2ggY2FzZSB0aGUgcmFuZ2Ugd2UgdHJ5IHRvIHNldCBjYW4gYmUgaW1wb3NzaWJsZQogICAgaWYgKHJuZykgewogICAgICBpZiAoIWdlY2tvICYmIHRoaXMuY20uc3RhdGUuZm9jdXNlZCkgewogICAgICAgIHNlbC5jb2xsYXBzZShzdGFydC5ub2RlLCBzdGFydC5vZmZzZXQpCiAgICAgICAgaWYgKCFybmcuY29sbGFwc2VkKSB7CiAgICAgICAgICBzZWwucmVtb3ZlQWxsUmFuZ2VzKCkKICAgICAgICAgIHNlbC5hZGRSYW5nZShybmcpCiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHNlbC5yZW1vdmVBbGxSYW5nZXMoKQogICAgICAgIHNlbC5hZGRSYW5nZShybmcpCiAgICAgIH0KICAgICAgaWYgKG9sZCAmJiBzZWwuYW5jaG9yTm9kZSA9PSBudWxsKSBzZWwuYWRkUmFuZ2Uob2xkKQogICAgICBlbHNlIGlmIChnZWNrbykgdGhpcy5zdGFydEdyYWNlUGVyaW9kKCkKICAgIH0KICAgIHRoaXMucmVtZW1iZXJTZWxlY3Rpb24oKQogIH0sCgogIHN0YXJ0R3JhY2VQZXJpb2Q6IGZ1bmN0aW9uKCkgewogICAgY2xlYXJUaW1lb3V0KHRoaXMuZ3JhY2VQZXJpb2QpCiAgICB0aGlzLmdyYWNlUGVyaW9kID0gc2V0VGltZW91dCgoKSA9PiB7CiAgICAgIHRoaXMuZ3JhY2VQZXJpb2QgPSBmYWxzZQogICAgICBpZiAodGhpcy5zZWxlY3Rpb25DaGFuZ2VkKCkpCiAgICAgICAgdGhpcy5jbS5vcGVyYXRpb24oKCkgPT4gdGhpcy5jbS5jdXJPcC5zZWxlY3Rpb25DaGFuZ2VkID0gdHJ1ZSkKICAgIH0sIDIwKQogIH0sCgogIHNob3dNdWx0aXBsZVNlbGVjdGlvbnM6IGZ1bmN0aW9uKGluZm8pIHsKICAgIHJlbW92ZUNoaWxkcmVuQW5kQWRkKHRoaXMuY20uZGlzcGxheS5jdXJzb3JEaXYsIGluZm8uY3Vyc29ycykKICAgIHJlbW92ZUNoaWxkcmVuQW5kQWRkKHRoaXMuY20uZGlzcGxheS5zZWxlY3Rpb25EaXYsIGluZm8uc2VsZWN0aW9uKQogIH0sCgogIHJlbWVtYmVyU2VsZWN0aW9uOiBmdW5jdGlvbigpIHsKICAgIGxldCBzZWwgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkKICAgIHRoaXMubGFzdEFuY2hvck5vZGUgPSBzZWwuYW5jaG9yTm9kZTsgdGhpcy5sYXN0QW5jaG9yT2Zmc2V0ID0gc2VsLmFuY2hvck9mZnNldAogICAgdGhpcy5sYXN0Rm9jdXNOb2RlID0gc2VsLmZvY3VzTm9kZTsgdGhpcy5sYXN0Rm9jdXNPZmZzZXQgPSBzZWwuZm9jdXNPZmZzZXQKICB9LAoKICBzZWxlY3Rpb25JbkVkaXRvcjogZnVuY3Rpb24oKSB7CiAgICBsZXQgc2VsID0gd2luZG93LmdldFNlbGVjdGlvbigpCiAgICBpZiAoIXNlbC5yYW5nZUNvdW50KSByZXR1cm4gZmFsc2UKICAgIGxldCBub2RlID0gc2VsLmdldFJhbmdlQXQoMCkuY29tbW9uQW5jZXN0b3JDb250YWluZXIKICAgIHJldHVybiBjb250YWlucyh0aGlzLmRpdiwgbm9kZSkKICB9LAoKICBmb2N1czogZnVuY3Rpb24oKSB7CiAgICBpZiAodGhpcy5jbS5vcHRpb25zLnJlYWRPbmx5ICE9ICJub2N1cnNvciIpIHRoaXMuZGl2LmZvY3VzKCkKICB9LAogIGJsdXI6IGZ1bmN0aW9uKCkgeyB0aGlzLmRpdi5ibHVyKCkgfSwKICBnZXRGaWVsZDogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLmRpdiB9LAoKICBzdXBwb3J0c1RvdWNoOiBmdW5jdGlvbigpIHsgcmV0dXJuIHRydWUgfSwKCiAgcmVjZWl2ZWRGb2N1czogZnVuY3Rpb24oKSB7CiAgICBsZXQgaW5wdXQgPSB0aGlzCiAgICBpZiAodGhpcy5zZWxlY3Rpb25JbkVkaXRvcigpKQogICAgICB0aGlzLnBvbGxTZWxlY3Rpb24oKQogICAgZWxzZQogICAgICBydW5Jbk9wKHRoaXMuY20sICgpID0+IGlucHV0LmNtLmN1ck9wLnNlbGVjdGlvbkNoYW5nZWQgPSB0cnVlKQoKICAgIGZ1bmN0aW9uIHBvbGwoKSB7CiAgICAgIGlmIChpbnB1dC5jbS5zdGF0ZS5mb2N1c2VkKSB7CiAgICAgICAgaW5wdXQucG9sbFNlbGVjdGlvbigpCiAgICAgICAgaW5wdXQucG9sbGluZy5zZXQoaW5wdXQuY20ub3B0aW9ucy5wb2xsSW50ZXJ2YWwsIHBvbGwpCiAgICAgIH0KICAgIH0KICAgIHRoaXMucG9sbGluZy5zZXQodGhpcy5jbS5vcHRpb25zLnBvbGxJbnRlcnZhbCwgcG9sbCkKICB9LAoKICBzZWxlY3Rpb25DaGFuZ2VkOiBmdW5jdGlvbigpIHsKICAgIGxldCBzZWwgPSB3aW5kb3cuZ2V0U2VsZWN0aW9uKCkKICAgIHJldHVybiBzZWwuYW5jaG9yTm9kZSAhPSB0aGlzLmxhc3RBbmNob3JOb2RlIHx8IHNlbC5hbmNob3JPZmZzZXQgIT0gdGhpcy5sYXN0QW5jaG9yT2Zmc2V0IHx8CiAgICAgIHNlbC5mb2N1c05vZGUgIT0gdGhpcy5sYXN0Rm9jdXNOb2RlIHx8IHNlbC5mb2N1c09mZnNldCAhPSB0aGlzLmxhc3RGb2N1c09mZnNldAogIH0sCgogIHBvbGxTZWxlY3Rpb246IGZ1bmN0aW9uKCkgewogICAgaWYgKCF0aGlzLmNvbXBvc2luZyAmJiAhdGhpcy5ncmFjZVBlcmlvZCAmJiB0aGlzLnNlbGVjdGlvbkNoYW5nZWQoKSkgewogICAgICBsZXQgc2VsID0gd2luZG93LmdldFNlbGVjdGlvbigpLCBjbSA9IHRoaXMuY20KICAgICAgdGhpcy5yZW1lbWJlclNlbGVjdGlvbigpCiAgICAgIGxldCBhbmNob3IgPSBkb21Ub1BvcyhjbSwgc2VsLmFuY2hvck5vZGUsIHNlbC5hbmNob3JPZmZzZXQpCiAgICAgIGxldCBoZWFkID0gZG9tVG9Qb3MoY20sIHNlbC5mb2N1c05vZGUsIHNlbC5mb2N1c09mZnNldCkKICAgICAgaWYgKGFuY2hvciAmJiBoZWFkKSBydW5Jbk9wKGNtLCAoKSA9PiB7CiAgICAgICAgc2V0U2VsZWN0aW9uKGNtLmRvYywgc2ltcGxlU2VsZWN0aW9uKGFuY2hvciwgaGVhZCksIHNlbF9kb250U2Nyb2xsKQogICAgICAgIGlmIChhbmNob3IuYmFkIHx8IGhlYWQuYmFkKSBjbS5jdXJPcC5zZWxlY3Rpb25DaGFuZ2VkID0gdHJ1ZQogICAgICB9KQogICAgfQogIH0sCgogIHBvbGxDb250ZW50OiBmdW5jdGlvbigpIHsKICAgIGxldCBjbSA9IHRoaXMuY20sIGRpc3BsYXkgPSBjbS5kaXNwbGF5LCBzZWwgPSBjbS5kb2Muc2VsLnByaW1hcnkoKQogICAgbGV0IGZyb20gPSBzZWwuZnJvbSgpLCB0byA9IHNlbC50bygpCiAgICBpZiAoZnJvbS5saW5lIDwgZGlzcGxheS52aWV3RnJvbSB8fCB0by5saW5lID4gZGlzcGxheS52aWV3VG8gLSAxKSByZXR1cm4gZmFsc2UKCiAgICBsZXQgZnJvbUluZGV4LCBmcm9tTGluZSwgZnJvbU5vZGUKICAgIGlmIChmcm9tLmxpbmUgPT0gZGlzcGxheS52aWV3RnJvbSB8fCAoZnJvbUluZGV4ID0gZmluZFZpZXdJbmRleChjbSwgZnJvbS5saW5lKSkgPT0gMCkgewogICAgICBmcm9tTGluZSA9IGxpbmVObyhkaXNwbGF5LnZpZXdbMF0ubGluZSkKICAgICAgZnJvbU5vZGUgPSBkaXNwbGF5LnZpZXdbMF0ubm9kZQogICAgfSBlbHNlIHsKICAgICAgZnJvbUxpbmUgPSBsaW5lTm8oZGlzcGxheS52aWV3W2Zyb21JbmRleF0ubGluZSkKICAgICAgZnJvbU5vZGUgPSBkaXNwbGF5LnZpZXdbZnJvbUluZGV4IC0gMV0ubm9kZS5uZXh0U2libGluZwogICAgfQogICAgbGV0IHRvSW5kZXggPSBmaW5kVmlld0luZGV4KGNtLCB0by5saW5lKQogICAgbGV0IHRvTGluZSwgdG9Ob2RlCiAgICBpZiAodG9JbmRleCA9PSBkaXNwbGF5LnZpZXcubGVuZ3RoIC0gMSkgewogICAgICB0b0xpbmUgPSBkaXNwbGF5LnZpZXdUbyAtIDEKICAgICAgdG9Ob2RlID0gZGlzcGxheS5saW5lRGl2Lmxhc3RDaGlsZAogICAgfSBlbHNlIHsKICAgICAgdG9MaW5lID0gbGluZU5vKGRpc3BsYXkudmlld1t0b0luZGV4ICsgMV0ubGluZSkgLSAxCiAgICAgIHRvTm9kZSA9IGRpc3BsYXkudmlld1t0b0luZGV4ICsgMV0ubm9kZS5wcmV2aW91c1NpYmxpbmcKICAgIH0KCiAgICBsZXQgbmV3VGV4dCA9IGNtLmRvYy5zcGxpdExpbmVzKGRvbVRleHRCZXR3ZWVuKGNtLCBmcm9tTm9kZSwgdG9Ob2RlLCBmcm9tTGluZSwgdG9MaW5lKSkKICAgIGxldCBvbGRUZXh0ID0gZ2V0QmV0d2VlbihjbS5kb2MsIFBvcyhmcm9tTGluZSwgMCksIFBvcyh0b0xpbmUsIGdldExpbmUoY20uZG9jLCB0b0xpbmUpLnRleHQubGVuZ3RoKSkKICAgIHdoaWxlIChuZXdUZXh0Lmxlbmd0aCA+IDEgJiYgb2xkVGV4dC5sZW5ndGggPiAxKSB7CiAgICAgIGlmIChsc3QobmV3VGV4dCkgPT0gbHN0KG9sZFRleHQpKSB7IG5ld1RleHQucG9wKCk7IG9sZFRleHQucG9wKCk7IHRvTGluZS0tIH0KICAgICAgZWxzZSBpZiAobmV3VGV4dFswXSA9PSBvbGRUZXh0WzBdKSB7IG5ld1RleHQuc2hpZnQoKTsgb2xkVGV4dC5zaGlmdCgpOyBmcm9tTGluZSsrIH0KICAgICAgZWxzZSBicmVhawogICAgfQoKICAgIGxldCBjdXRGcm9udCA9IDAsIGN1dEVuZCA9IDAKICAgIGxldCBuZXdUb3AgPSBuZXdUZXh0WzBdLCBvbGRUb3AgPSBvbGRUZXh0WzBdLCBtYXhDdXRGcm9udCA9IE1hdGgubWluKG5ld1RvcC5sZW5ndGgsIG9sZFRvcC5sZW5ndGgpCiAgICB3aGlsZSAoY3V0RnJvbnQgPCBtYXhDdXRGcm9udCAmJiBuZXdUb3AuY2hhckNvZGVBdChjdXRGcm9udCkgPT0gb2xkVG9wLmNoYXJDb2RlQXQoY3V0RnJvbnQpKQogICAgICArK2N1dEZyb250CiAgICBsZXQgbmV3Qm90ID0gbHN0KG5ld1RleHQpLCBvbGRCb3QgPSBsc3Qob2xkVGV4dCkKICAgIGxldCBtYXhDdXRFbmQgPSBNYXRoLm1pbihuZXdCb3QubGVuZ3RoIC0gKG5ld1RleHQubGVuZ3RoID09IDEgPyBjdXRGcm9udCA6IDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZEJvdC5sZW5ndGggLSAob2xkVGV4dC5sZW5ndGggPT0gMSA/IGN1dEZyb250IDogMCkpCiAgICB3aGlsZSAoY3V0RW5kIDwgbWF4Q3V0RW5kICYmCiAgICAgICAgICAgbmV3Qm90LmNoYXJDb2RlQXQobmV3Qm90Lmxlbmd0aCAtIGN1dEVuZCAtIDEpID09IG9sZEJvdC5jaGFyQ29kZUF0KG9sZEJvdC5sZW5ndGggLSBjdXRFbmQgLSAxKSkKICAgICAgKytjdXRFbmQKCiAgICBuZXdUZXh0W25ld1RleHQubGVuZ3RoIC0gMV0gPSBuZXdCb3Quc2xpY2UoMCwgbmV3Qm90Lmxlbmd0aCAtIGN1dEVuZCkKICAgIG5ld1RleHRbMF0gPSBuZXdUZXh0WzBdLnNsaWNlKGN1dEZyb250KQoKICAgIGxldCBjaEZyb20gPSBQb3MoZnJvbUxpbmUsIGN1dEZyb250KQogICAgbGV0IGNoVG8gPSBQb3ModG9MaW5lLCBvbGRUZXh0Lmxlbmd0aCA/IGxzdChvbGRUZXh0KS5sZW5ndGggLSBjdXRFbmQgOiAwKQogICAgaWYgKG5ld1RleHQubGVuZ3RoID4gMSB8fCBuZXdUZXh0WzBdIHx8IGNtcChjaEZyb20sIGNoVG8pKSB7CiAgICAgIHJlcGxhY2VSYW5nZShjbS5kb2MsIG5ld1RleHQsIGNoRnJvbSwgY2hUbywgIitpbnB1dCIpCiAgICAgIHJldHVybiB0cnVlCiAgICB9CiAgfSwKCiAgZW5zdXJlUG9sbGVkOiBmdW5jdGlvbigpIHsKICAgIHRoaXMuZm9yY2VDb21wb3NpdGlvbkVuZCgpCiAgfSwKICByZXNldDogZnVuY3Rpb24oKSB7CiAgICB0aGlzLmZvcmNlQ29tcG9zaXRpb25FbmQoKQogIH0sCiAgZm9yY2VDb21wb3NpdGlvbkVuZDogZnVuY3Rpb24oKSB7CiAgICBpZiAoIXRoaXMuY29tcG9zaW5nIHx8IHRoaXMuY29tcG9zaW5nLmhhbmRsZWQpIHJldHVybgogICAgdGhpcy5hcHBseUNvbXBvc2l0aW9uKHRoaXMuY29tcG9zaW5nKQogICAgdGhpcy5jb21wb3NpbmcuaGFuZGxlZCA9IHRydWUKICAgIHRoaXMuZGl2LmJsdXIoKQogICAgdGhpcy5kaXYuZm9jdXMoKQogIH0sCiAgYXBwbHlDb21wb3NpdGlvbjogZnVuY3Rpb24oY29tcG9zaW5nKSB7CiAgICBpZiAodGhpcy5jbS5pc1JlYWRPbmx5KCkpCiAgICAgIG9wZXJhdGlvbih0aGlzLmNtLCByZWdDaGFuZ2UpKHRoaXMuY20pCiAgICBlbHNlIGlmIChjb21wb3NpbmcuZGF0YSAmJiBjb21wb3NpbmcuZGF0YSAhPSBjb21wb3Npbmcuc3RhcnREYXRhKQogICAgICBvcGVyYXRpb24odGhpcy5jbSwgYXBwbHlUZXh0SW5wdXQpKHRoaXMuY20sIGNvbXBvc2luZy5kYXRhLCAwLCBjb21wb3Npbmcuc2VsKQogIH0sCgogIHNldFVuZWRpdGFibGU6IGZ1bmN0aW9uKG5vZGUpIHsKICAgIG5vZGUuY29udGVudEVkaXRhYmxlID0gImZhbHNlIgogIH0sCgogIG9uS2V5UHJlc3M6IGZ1bmN0aW9uKGUpIHsKICAgIGUucHJldmVudERlZmF1bHQoKQogICAgaWYgKCF0aGlzLmNtLmlzUmVhZE9ubHkoKSkKICAgICAgb3BlcmF0aW9uKHRoaXMuY20sIGFwcGx5VGV4dElucHV0KSh0aGlzLmNtLCBTdHJpbmcuZnJvbUNoYXJDb2RlKGUuY2hhckNvZGUgPT0gbnVsbCA/IGUua2V5Q29kZSA6IGUuY2hhckNvZGUpLCAwKQogIH0sCgogIHJlYWRPbmx5Q2hhbmdlZDogZnVuY3Rpb24odmFsKSB7CiAgICB0aGlzLmRpdi5jb250ZW50RWRpdGFibGUgPSBTdHJpbmcodmFsICE9ICJub2N1cnNvciIpCiAgfSwKCiAgb25Db250ZXh0TWVudTogbm90aGluZywKICByZXNldFBvc2l0aW9uOiBub3RoaW5nLAoKICBuZWVkc0NvbnRlbnRBdHRyaWJ1dGU6IHRydWUKICB9LCBDb250ZW50RWRpdGFibGVJbnB1dC5wcm90b3R5cGUpCgpmdW5jdGlvbiBwb3NUb0RPTShjbSwgcG9zKSB7CiAgbGV0IHZpZXcgPSBmaW5kVmlld0ZvckxpbmUoY20sIHBvcy5saW5lKQogIGlmICghdmlldyB8fCB2aWV3LmhpZGRlbikgcmV0dXJuIG51bGwKICBsZXQgbGluZSA9IGdldExpbmUoY20uZG9jLCBwb3MubGluZSkKICBsZXQgaW5mbyA9IG1hcEZyb21MaW5lVmlldyh2aWV3LCBsaW5lLCBwb3MubGluZSkKCiAgbGV0IG9yZGVyID0gZ2V0T3JkZXIobGluZSksIHNpZGUgPSAibGVmdCIKICBpZiAob3JkZXIpIHsKICAgIGxldCBwYXJ0UG9zID0gZ2V0QmlkaVBhcnRBdChvcmRlciwgcG9zLmNoKQogICAgc2lkZSA9IHBhcnRQb3MgJSAyID8gInJpZ2h0IiA6ICJsZWZ0IgogIH0KICBsZXQgcmVzdWx0ID0gbm9kZUFuZE9mZnNldEluTGluZU1hcChpbmZvLm1hcCwgcG9zLmNoLCBzaWRlKQogIHJlc3VsdC5vZmZzZXQgPSByZXN1bHQuY29sbGFwc2UgPT0gInJpZ2h0IiA/IHJlc3VsdC5lbmQgOiByZXN1bHQuc3RhcnQKICByZXR1cm4gcmVzdWx0Cn0KCmZ1bmN0aW9uIGJhZFBvcyhwb3MsIGJhZCkgeyBpZiAoYmFkKSBwb3MuYmFkID0gdHJ1ZTsgcmV0dXJuIHBvcyB9CgpmdW5jdGlvbiBkb21UZXh0QmV0d2VlbihjbSwgZnJvbSwgdG8sIGZyb21MaW5lLCB0b0xpbmUpIHsKICBsZXQgdGV4dCA9ICIiLCBjbG9zaW5nID0gZmFsc2UsIGxpbmVTZXAgPSBjbS5kb2MubGluZVNlcGFyYXRvcigpCiAgZnVuY3Rpb24gcmVjb2duaXplTWFya2VyKGlkKSB7IHJldHVybiBtYXJrZXIgPT4gbWFya2VyLmlkID09IGlkIH0KICBmdW5jdGlvbiB3YWxrKG5vZGUpIHsKICAgIGlmIChub2RlLm5vZGVUeXBlID09IDEpIHsKICAgICAgbGV0IGNtVGV4dCA9IG5vZGUuZ2V0QXR0cmlidXRlKCJjbS10ZXh0IikKICAgICAgaWYgKGNtVGV4dCAhPSBudWxsKSB7CiAgICAgICAgaWYgKGNtVGV4dCA9PSAiIikgY21UZXh0ID0gbm9kZS50ZXh0Q29udGVudC5yZXBsYWNlKC9cdTIwMGIvZywgIiIpCiAgICAgICAgdGV4dCArPSBjbVRleHQKICAgICAgICByZXR1cm4KICAgICAgfQogICAgICBsZXQgbWFya2VySUQgPSBub2RlLmdldEF0dHJpYnV0ZSgiY20tbWFya2VyIiksIHJhbmdlCiAgICAgIGlmIChtYXJrZXJJRCkgewogICAgICAgIGxldCBmb3VuZCA9IGNtLmZpbmRNYXJrcyhQb3MoZnJvbUxpbmUsIDApLCBQb3ModG9MaW5lICsgMSwgMCksIHJlY29nbml6ZU1hcmtlcigrbWFya2VySUQpKQogICAgICAgIGlmIChmb3VuZC5sZW5ndGggJiYgKHJhbmdlID0gZm91bmRbMF0uZmluZCgpKSkKICAgICAgICAgIHRleHQgKz0gZ2V0QmV0d2VlbihjbS5kb2MsIHJhbmdlLmZyb20sIHJhbmdlLnRvKS5qb2luKGxpbmVTZXApCiAgICAgICAgcmV0dXJuCiAgICAgIH0KICAgICAgaWYgKG5vZGUuZ2V0QXR0cmlidXRlKCJjb250ZW50ZWRpdGFibGUiKSA9PSAiZmFsc2UiKSByZXR1cm4KICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlLmNoaWxkTm9kZXMubGVuZ3RoOyBpKyspCiAgICAgICAgd2Fsayhub2RlLmNoaWxkTm9kZXNbaV0pCiAgICAgIGlmICgvXihwcmV8ZGl2fHApJC9pLnRlc3Qobm9kZS5ub2RlTmFtZSkpCiAgICAgICAgY2xvc2luZyA9IHRydWUKICAgIH0gZWxzZSBpZiAobm9kZS5ub2RlVHlwZSA9PSAzKSB7CiAgICAgIGxldCB2YWwgPSBub2RlLm5vZGVWYWx1ZQogICAgICBpZiAoIXZhbCkgcmV0dXJuCiAgICAgIGlmIChjbG9zaW5nKSB7CiAgICAgICAgdGV4dCArPSBsaW5lU2VwCiAgICAgICAgY2xvc2luZyA9IGZhbHNlCiAgICAgIH0KICAgICAgdGV4dCArPSB2YWwKICAgIH0KICB9CiAgZm9yICg7OykgewogICAgd2Fsayhmcm9tKQogICAgaWYgKGZyb20gPT0gdG8pIGJyZWFrCiAgICBmcm9tID0gZnJvbS5uZXh0U2libGluZwogIH0KICByZXR1cm4gdGV4dAp9CgpmdW5jdGlvbiBkb21Ub1BvcyhjbSwgbm9kZSwgb2Zmc2V0KSB7CiAgbGV0IGxpbmVOb2RlCiAgaWYgKG5vZGUgPT0gY20uZGlzcGxheS5saW5lRGl2KSB7CiAgICBsaW5lTm9kZSA9IGNtLmRpc3BsYXkubGluZURpdi5jaGlsZE5vZGVzW29mZnNldF0KICAgIGlmICghbGluZU5vZGUpIHJldHVybiBiYWRQb3MoY20uY2xpcFBvcyhQb3MoY20uZGlzcGxheS52aWV3VG8gLSAxKSksIHRydWUpCiAgICBub2RlID0gbnVsbDsgb2Zmc2V0ID0gMAogIH0gZWxzZSB7CiAgICBmb3IgKGxpbmVOb2RlID0gbm9kZTs7IGxpbmVOb2RlID0gbGluZU5vZGUucGFyZW50Tm9kZSkgewogICAgICBpZiAoIWxpbmVOb2RlIHx8IGxpbmVOb2RlID09IGNtLmRpc3BsYXkubGluZURpdikgcmV0dXJuIG51bGwKICAgICAgaWYgKGxpbmVOb2RlLnBhcmVudE5vZGUgJiYgbGluZU5vZGUucGFyZW50Tm9kZSA9PSBjbS5kaXNwbGF5LmxpbmVEaXYpIGJyZWFrCiAgICB9CiAgfQogIGZvciAobGV0IGkgPSAwOyBpIDwgY20uZGlzcGxheS52aWV3Lmxlbmd0aDsgaSsrKSB7CiAgICBsZXQgbGluZVZpZXcgPSBjbS5kaXNwbGF5LnZpZXdbaV0KICAgIGlmIChsaW5lVmlldy5ub2RlID09IGxpbmVOb2RlKQogICAgICByZXR1cm4gbG9jYXRlTm9kZUluTGluZVZpZXcobGluZVZpZXcsIG5vZGUsIG9mZnNldCkKICB9Cn0KCmZ1bmN0aW9uIGxvY2F0ZU5vZGVJbkxpbmVWaWV3KGxpbmVWaWV3LCBub2RlLCBvZmZzZXQpIHsKICBsZXQgd3JhcHBlciA9IGxpbmVWaWV3LnRleHQuZmlyc3RDaGlsZCwgYmFkID0gZmFsc2UKICBpZiAoIW5vZGUgfHwgIWNvbnRhaW5zKHdyYXBwZXIsIG5vZGUpKSByZXR1cm4gYmFkUG9zKFBvcyhsaW5lTm8obGluZVZpZXcubGluZSksIDApLCB0cnVlKQogIGlmIChub2RlID09IHdyYXBwZXIpIHsKICAgIGJhZCA9IHRydWUKICAgIG5vZGUgPSB3cmFwcGVyLmNoaWxkTm9kZXNbb2Zmc2V0XQogICAgb2Zmc2V0ID0gMAogICAgaWYgKCFub2RlKSB7CiAgICAgIGxldCBsaW5lID0gbGluZVZpZXcucmVzdCA/IGxzdChsaW5lVmlldy5yZXN0KSA6IGxpbmVWaWV3LmxpbmUKICAgICAgcmV0dXJuIGJhZFBvcyhQb3MobGluZU5vKGxpbmUpLCBsaW5lLnRleHQubGVuZ3RoKSwgYmFkKQogICAgfQogIH0KCiAgbGV0IHRleHROb2RlID0gbm9kZS5ub2RlVHlwZSA9PSAzID8gbm9kZSA6IG51bGwsIHRvcE5vZGUgPSBub2RlCiAgaWYgKCF0ZXh0Tm9kZSAmJiBub2RlLmNoaWxkTm9kZXMubGVuZ3RoID09IDEgJiYgbm9kZS5maXJzdENoaWxkLm5vZGVUeXBlID09IDMpIHsKICAgIHRleHROb2RlID0gbm9kZS5maXJzdENoaWxkCiAgICBpZiAob2Zmc2V0KSBvZmZzZXQgPSB0ZXh0Tm9kZS5ub2RlVmFsdWUubGVuZ3RoCiAgfQogIHdoaWxlICh0b3BOb2RlLnBhcmVudE5vZGUgIT0gd3JhcHBlcikgdG9wTm9kZSA9IHRvcE5vZGUucGFyZW50Tm9kZQogIGxldCBtZWFzdXJlID0gbGluZVZpZXcubWVhc3VyZSwgbWFwcyA9IG1lYXN1cmUubWFwcwoKICBmdW5jdGlvbiBmaW5kKHRleHROb2RlLCB0b3BOb2RlLCBvZmZzZXQpIHsKICAgIGZvciAobGV0IGkgPSAtMTsgaSA8IChtYXBzID8gbWFwcy5sZW5ndGggOiAwKTsgaSsrKSB7CiAgICAgIGxldCBtYXAgPSBpIDwgMCA/IG1lYXN1cmUubWFwIDogbWFwc1tpXQogICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG1hcC5sZW5ndGg7IGogKz0gMykgewogICAgICAgIGxldCBjdXJOb2RlID0gbWFwW2ogKyAyXQogICAgICAgIGlmIChjdXJOb2RlID09IHRleHROb2RlIHx8IGN1ck5vZGUgPT0gdG9wTm9kZSkgewogICAgICAgICAgbGV0IGxpbmUgPSBsaW5lTm8oaSA8IDAgPyBsaW5lVmlldy5saW5lIDogbGluZVZpZXcucmVzdFtpXSkKICAgICAgICAgIGxldCBjaCA9IG1hcFtqXSArIG9mZnNldAogICAgICAgICAgaWYgKG9mZnNldCA8IDAgfHwgY3VyTm9kZSAhPSB0ZXh0Tm9kZSkgY2ggPSBtYXBbaiArIChvZmZzZXQgPyAxIDogMCldCiAgICAgICAgICByZXR1cm4gUG9zKGxpbmUsIGNoKQogICAgICAgIH0KICAgICAgfQogICAgfQogIH0KICBsZXQgZm91bmQgPSBmaW5kKHRleHROb2RlLCB0b3BOb2RlLCBvZmZzZXQpCiAgaWYgKGZvdW5kKSByZXR1cm4gYmFkUG9zKGZvdW5kLCBiYWQpCgogIC8vIEZJWE1FIHRoaXMgaXMgYWxsIHJlYWxseSBzaGFreS4gbWlnaHQgaGFuZGxlIHRoZSBmZXcgY2FzZXMgaXQgbmVlZHMgdG8gaGFuZGxlLCBidXQgbGlrZWx5IHRvIGNhdXNlIHByb2JsZW1zCiAgZm9yIChsZXQgYWZ0ZXIgPSB0b3BOb2RlLm5leHRTaWJsaW5nLCBkaXN0ID0gdGV4dE5vZGUgPyB0ZXh0Tm9kZS5ub2RlVmFsdWUubGVuZ3RoIC0gb2Zmc2V0IDogMDsgYWZ0ZXI7IGFmdGVyID0gYWZ0ZXIubmV4dFNpYmxpbmcpIHsKICAgIGZvdW5kID0gZmluZChhZnRlciwgYWZ0ZXIuZmlyc3RDaGlsZCwgMCkKICAgIGlmIChmb3VuZCkKICAgICAgcmV0dXJuIGJhZFBvcyhQb3MoZm91bmQubGluZSwgZm91bmQuY2ggLSBkaXN0KSwgYmFkKQogICAgZWxzZQogICAgICBkaXN0ICs9IGFmdGVyLnRleHRDb250ZW50Lmxlbmd0aAogIH0KICBmb3IgKGxldCBiZWZvcmUgPSB0b3BOb2RlLnByZXZpb3VzU2libGluZywgZGlzdCA9IG9mZnNldDsgYmVmb3JlOyBiZWZvcmUgPSBiZWZvcmUucHJldmlvdXNTaWJsaW5nKSB7CiAgICBmb3VuZCA9IGZpbmQoYmVmb3JlLCBiZWZvcmUuZmlyc3RDaGlsZCwgLTEpCiAgICBpZiAoZm91bmQpCiAgICAgIHJldHVybiBiYWRQb3MoUG9zKGZvdW5kLmxpbmUsIGZvdW5kLmNoICsgZGlzdCksIGJhZCkKICAgIGVsc2UKICAgICAgZGlzdCArPSBiZWZvcmUudGV4dENvbnRlbnQubGVuZ3RoCiAgfQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/src/input/indent.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aW1wb3J0IHsgZ2V0U3RhdGVCZWZvcmUgfSBmcm9tICIuLi9saW5lL2hpZ2hsaWdodCIKaW1wb3J0IHsgUG9zIH0gZnJvbSAiLi4vbGluZS9wb3MiCmltcG9ydCB7IGdldExpbmUgfSBmcm9tICIuLi9saW5lL3V0aWxzX2xpbmUiCmltcG9ydCB7IHJlcGxhY2VSYW5nZSB9IGZyb20gIi4uL21vZGVsL2NoYW5nZXMiCmltcG9ydCB7IFJhbmdlIH0gZnJvbSAiLi4vbW9kZWwvc2VsZWN0aW9uIgppbXBvcnQgeyByZXBsYWNlT25lU2VsZWN0aW9uIH0gZnJvbSAiLi4vbW9kZWwvc2VsZWN0aW9uX3VwZGF0ZXMiCmltcG9ydCB7IGNvdW50Q29sdW1uLCBQYXNzLCBzcGFjZVN0ciB9IGZyb20gIi4uL3V0aWwvbWlzYyIKCi8vIEluZGVudCB0aGUgZ2l2ZW4gbGluZS4gVGhlIGhvdyBwYXJhbWV0ZXIgY2FuIGJlICJzbWFydCIsCi8vICJhZGQiL251bGwsICJzdWJ0cmFjdCIsIG9yICJwcmV2Ii4gV2hlbiBhZ2dyZXNzaXZlIGlzIGZhbHNlCi8vICh0eXBpY2FsbHkgc2V0IHRvIHRydWUgZm9yIGZvcmNlZCBzaW5nbGUtbGluZSBpbmRlbnRzKSwgZW1wdHkKLy8gbGluZXMgYXJlIG5vdCBpbmRlbnRlZCwgYW5kIHBsYWNlcyB3aGVyZSB0aGUgbW9kZSByZXR1cm5zIFBhc3MKLy8gYXJlIGxlZnQgYWxvbmUuCmV4cG9ydCBmdW5jdGlvbiBpbmRlbnRMaW5lKGNtLCBuLCBob3csIGFnZ3Jlc3NpdmUpIHsKICBsZXQgZG9jID0gY20uZG9jLCBzdGF0ZQogIGlmIChob3cgPT0gbnVsbCkgaG93ID0gImFkZCIKICBpZiAoaG93ID09ICJzbWFydCIpIHsKICAgIC8vIEZhbGwgYmFjayB0byAicHJldiIgd2hlbiB0aGUgbW9kZSBkb2Vzbid0IGhhdmUgYW4gaW5kZW50YXRpb24KICAgIC8vIG1ldGhvZC4KICAgIGlmICghZG9jLm1vZGUuaW5kZW50KSBob3cgPSAicHJldiIKICAgIGVsc2Ugc3RhdGUgPSBnZXRTdGF0ZUJlZm9yZShjbSwgbikKICB9CgogIGxldCB0YWJTaXplID0gY20ub3B0aW9ucy50YWJTaXplCiAgbGV0IGxpbmUgPSBnZXRMaW5lKGRvYywgbiksIGN1clNwYWNlID0gY291bnRDb2x1bW4obGluZS50ZXh0LCBudWxsLCB0YWJTaXplKQogIGlmIChsaW5lLnN0YXRlQWZ0ZXIpIGxpbmUuc3RhdGVBZnRlciA9IG51bGwKICBsZXQgY3VyU3BhY2VTdHJpbmcgPSBsaW5lLnRleHQubWF0Y2goL15ccyovKVswXSwgaW5kZW50YXRpb24KICBpZiAoIWFnZ3Jlc3NpdmUgJiYgIS9cUy8udGVzdChsaW5lLnRleHQpKSB7CiAgICBpbmRlbnRhdGlvbiA9IDAKICAgIGhvdyA9ICJub3QiCiAgfSBlbHNlIGlmIChob3cgPT0gInNtYXJ0IikgewogICAgaW5kZW50YXRpb24gPSBkb2MubW9kZS5pbmRlbnQoc3RhdGUsIGxpbmUudGV4dC5zbGljZShjdXJTcGFjZVN0cmluZy5sZW5ndGgpLCBsaW5lLnRleHQpCiAgICBpZiAoaW5kZW50YXRpb24gPT0gUGFzcyB8fCBpbmRlbnRhdGlvbiA+IDE1MCkgewogICAgICBpZiAoIWFnZ3Jlc3NpdmUpIHJldHVybgogICAgICBob3cgPSAicHJldiIKICAgIH0KICB9CiAgaWYgKGhvdyA9PSAicHJldiIpIHsKICAgIGlmIChuID4gZG9jLmZpcnN0KSBpbmRlbnRhdGlvbiA9IGNvdW50Q29sdW1uKGdldExpbmUoZG9jLCBuLTEpLnRleHQsIG51bGwsIHRhYlNpemUpCiAgICBlbHNlIGluZGVudGF0aW9uID0gMAogIH0gZWxzZSBpZiAoaG93ID09ICJhZGQiKSB7CiAgICBpbmRlbnRhdGlvbiA9IGN1clNwYWNlICsgY20ub3B0aW9ucy5pbmRlbnRVbml0CiAgfSBlbHNlIGlmIChob3cgPT0gInN1YnRyYWN0IikgewogICAgaW5kZW50YXRpb24gPSBjdXJTcGFjZSAtIGNtLm9wdGlvbnMuaW5kZW50VW5pdAogIH0gZWxzZSBpZiAodHlwZW9mIGhvdyA9PSAibnVtYmVyIikgewogICAgaW5kZW50YXRpb24gPSBjdXJTcGFjZSArIGhvdwogIH0KICBpbmRlbnRhdGlvbiA9IE1hdGgubWF4KDAsIGluZGVudGF0aW9uKQoKICBsZXQgaW5kZW50U3RyaW5nID0gIiIsIHBvcyA9IDAKICBpZiAoY20ub3B0aW9ucy5pbmRlbnRXaXRoVGFicykKICAgIGZvciAobGV0IGkgPSBNYXRoLmZsb29yKGluZGVudGF0aW9uIC8gdGFiU2l6ZSk7IGk7IC0taSkge3BvcyArPSB0YWJTaXplOyBpbmRlbnRTdHJpbmcgKz0gIlx0In0KICBpZiAocG9zIDwgaW5kZW50YXRpb24pIGluZGVudFN0cmluZyArPSBzcGFjZVN0cihpbmRlbnRhdGlvbiAtIHBvcykKCiAgaWYgKGluZGVudFN0cmluZyAhPSBjdXJTcGFjZVN0cmluZykgewogICAgcmVwbGFjZVJhbmdlKGRvYywgaW5kZW50U3RyaW5nLCBQb3MobiwgMCksIFBvcyhuLCBjdXJTcGFjZVN0cmluZy5sZW5ndGgpLCAiK2lucHV0IikKICAgIGxpbmUuc3RhdGVBZnRlciA9IG51bGwKICAgIHJldHVybiB0cnVlCiAgfSBlbHNlIHsKICAgIC8vIEVuc3VyZSB0aGF0LCBpZiB0aGUgY3Vyc29yIHdhcyBpbiB0aGUgd2hpdGVzcGFjZSBhdCB0aGUgc3RhcnQKICAgIC8vIG9mIHRoZSBsaW5lLCBpdCBpcyBtb3ZlZCB0byB0aGUgZW5kIG9mIHRoYXQgc3BhY2UuCiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRvYy5zZWwucmFuZ2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGxldCByYW5nZSA9IGRvYy5zZWwucmFuZ2VzW2ldCiAgICAgIGlmIChyYW5nZS5oZWFkLmxpbmUgPT0gbiAmJiByYW5nZS5oZWFkLmNoIDwgY3VyU3BhY2VTdHJpbmcubGVuZ3RoKSB7CiAgICAgICAgbGV0IHBvcyA9IFBvcyhuLCBjdXJTcGFjZVN0cmluZy5sZW5ndGgpCiAgICAgICAgcmVwbGFjZU9uZVNlbGVjdGlvbihkb2MsIGksIG5ldyBSYW5nZShwb3MsIHBvcykpCiAgICAgICAgYnJlYWsKICAgICAgfQogICAgfQogIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/src/input/input.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aW1wb3J0IHsgcnVuSW5PcCB9IGZyb20gIi4uL2Rpc3BsYXkvb3BlcmF0aW9ucyIKaW1wb3J0IHsgZW5zdXJlQ3Vyc29yVmlzaWJsZSB9IGZyb20gIi4uL2Rpc3BsYXkvc2Nyb2xsaW5nIgppbXBvcnQgeyBQb3MgfSBmcm9tICIuLi9saW5lL3BvcyIKaW1wb3J0IHsgZ2V0TGluZSB9IGZyb20gIi4uL2xpbmUvdXRpbHNfbGluZSIKaW1wb3J0IHsgbWFrZUNoYW5nZSB9IGZyb20gIi4uL21vZGVsL2NoYW5nZXMiCmltcG9ydCB7IGlvcywgd2Via2l0IH0gZnJvbSAiLi4vdXRpbC9icm93c2VyIgppbXBvcnQgeyBlbHQgfSBmcm9tICIuLi91dGlsL2RvbSIKaW1wb3J0IHsgbHN0LCBtYXAgfSBmcm9tICIuLi91dGlsL21pc2MiCmltcG9ydCB7IHNpZ25hbExhdGVyIH0gZnJvbSAiLi4vdXRpbC9vcGVyYXRpb25fZ3JvdXAiCmltcG9ydCB7IHNwbGl0TGluZXNBdXRvIH0gZnJvbSAiLi4vdXRpbC9mZWF0dXJlX2RldGVjdGlvbiIKCmltcG9ydCB7IGluZGVudExpbmUgfSBmcm9tICIuL2luZGVudCIKCi8vIFRoaXMgd2lsbCBiZSBzZXQgdG8gYSB7bGluZVdpc2U6IGJvb2wsIHRleHQ6IFtzdHJpbmddfSBvYmplY3QsIHNvCi8vIHRoYXQsIHdoZW4gcGFzdGluZywgd2Uga25vdyB3aGF0IGtpbmQgb2Ygc2VsZWN0aW9ucyB0aGUgY29waWVkCi8vIHRleHQgd2FzIG1hZGUgb3V0IG9mLgpleHBvcnQgbGV0IGxhc3RDb3BpZWQgPSBudWxsCgpleHBvcnQgZnVuY3Rpb24gc2V0TGFzdENvcGllZChuZXdMYXN0Q29waWVkKSB7CiAgbGFzdENvcGllZCA9IG5ld0xhc3RDb3BpZWQKfQoKZXhwb3J0IGZ1bmN0aW9uIGFwcGx5VGV4dElucHV0KGNtLCBpbnNlcnRlZCwgZGVsZXRlZCwgc2VsLCBvcmlnaW4pIHsKICBsZXQgZG9jID0gY20uZG9jCiAgY20uZGlzcGxheS5zaGlmdCA9IGZhbHNlCiAgaWYgKCFzZWwpIHNlbCA9IGRvYy5zZWwKCiAgbGV0IHBhc3RlID0gY20uc3RhdGUucGFzdGVJbmNvbWluZyB8fCBvcmlnaW4gPT0gInBhc3RlIgogIGxldCB0ZXh0TGluZXMgPSBzcGxpdExpbmVzQXV0byhpbnNlcnRlZCksIG11bHRpUGFzdGUgPSBudWxsCiAgLy8gV2hlbiBwYXNpbmcgTiBsaW5lcyBpbnRvIE4gc2VsZWN0aW9ucywgaW5zZXJ0IG9uZSBsaW5lIHBlciBzZWxlY3Rpb24KICBpZiAocGFzdGUgJiYgc2VsLnJhbmdlcy5sZW5ndGggPiAxKSB7CiAgICBpZiAobGFzdENvcGllZCAmJiBsYXN0Q29waWVkLnRleHQuam9pbigiXG4iKSA9PSBpbnNlcnRlZCkgewogICAgICBpZiAoc2VsLnJhbmdlcy5sZW5ndGggJSBsYXN0Q29waWVkLnRleHQubGVuZ3RoID09IDApIHsKICAgICAgICBtdWx0aVBhc3RlID0gW10KICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxhc3RDb3BpZWQudGV4dC5sZW5ndGg7IGkrKykKICAgICAgICAgIG11bHRpUGFzdGUucHVzaChkb2Muc3BsaXRMaW5lcyhsYXN0Q29waWVkLnRleHRbaV0pKQogICAgICB9CiAgICB9IGVsc2UgaWYgKHRleHRMaW5lcy5sZW5ndGggPT0gc2VsLnJhbmdlcy5sZW5ndGgpIHsKICAgICAgbXVsdGlQYXN0ZSA9IG1hcCh0ZXh0TGluZXMsIGwgPT4gW2xdKQogICAgfQogIH0KCiAgbGV0IHVwZGF0ZUlucHV0CiAgLy8gTm9ybWFsIGJlaGF2aW9yIGlzIHRvIGluc2VydCB0aGUgbmV3IHRleHQgaW50byBldmVyeSBzZWxlY3Rpb24KICBmb3IgKGxldCBpID0gc2VsLnJhbmdlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewogICAgbGV0IHJhbmdlID0gc2VsLnJhbmdlc1tpXQogICAgbGV0IGZyb20gPSByYW5nZS5mcm9tKCksIHRvID0gcmFuZ2UudG8oKQogICAgaWYgKHJhbmdlLmVtcHR5KCkpIHsKICAgICAgaWYgKGRlbGV0ZWQgJiYgZGVsZXRlZCA+IDApIC8vIEhhbmRsZSBkZWxldGlvbgogICAgICAgIGZyb20gPSBQb3MoZnJvbS5saW5lLCBmcm9tLmNoIC0gZGVsZXRlZCkKICAgICAgZWxzZSBpZiAoY20uc3RhdGUub3ZlcndyaXRlICYmICFwYXN0ZSkgLy8gSGFuZGxlIG92ZXJ3cml0ZQogICAgICAgIHRvID0gUG9zKHRvLmxpbmUsIE1hdGgubWluKGdldExpbmUoZG9jLCB0by5saW5lKS50ZXh0Lmxlbmd0aCwgdG8uY2ggKyBsc3QodGV4dExpbmVzKS5sZW5ndGgpKQogICAgICBlbHNlIGlmIChsYXN0Q29waWVkICYmIGxhc3RDb3BpZWQubGluZVdpc2UgJiYgbGFzdENvcGllZC50ZXh0LmpvaW4oIlxuIikgPT0gaW5zZXJ0ZWQpCiAgICAgICAgZnJvbSA9IHRvID0gUG9zKGZyb20ubGluZSwgMCkKICAgIH0KICAgIHVwZGF0ZUlucHV0ID0gY20uY3VyT3AudXBkYXRlSW5wdXQKICAgIGxldCBjaGFuZ2VFdmVudCA9IHtmcm9tOiBmcm9tLCB0bzogdG8sIHRleHQ6IG11bHRpUGFzdGUgPyBtdWx0aVBhc3RlW2kgJSBtdWx0aVBhc3RlLmxlbmd0aF0gOiB0ZXh0TGluZXMsCiAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luOiBvcmlnaW4gfHwgKHBhc3RlID8gInBhc3RlIiA6IGNtLnN0YXRlLmN1dEluY29taW5nID8gImN1dCIgOiAiK2lucHV0Iil9CiAgICBtYWtlQ2hhbmdlKGNtLmRvYywgY2hhbmdlRXZlbnQpCiAgICBzaWduYWxMYXRlcihjbSwgImlucHV0UmVhZCIsIGNtLCBjaGFuZ2VFdmVudCkKICB9CiAgaWYgKGluc2VydGVkICYmICFwYXN0ZSkKICAgIHRyaWdnZXJFbGVjdHJpYyhjbSwgaW5zZXJ0ZWQpCgogIGVuc3VyZUN1cnNvclZpc2libGUoY20pCiAgY20uY3VyT3AudXBkYXRlSW5wdXQgPSB1cGRhdGVJbnB1dAogIGNtLmN1ck9wLnR5cGluZyA9IHRydWUKICBjbS5zdGF0ZS5wYXN0ZUluY29taW5nID0gY20uc3RhdGUuY3V0SW5jb21pbmcgPSBmYWxzZQp9CgpleHBvcnQgZnVuY3Rpb24gaGFuZGxlUGFzdGUoZSwgY20pIHsKICBsZXQgcGFzdGVkID0gZS5jbGlwYm9hcmREYXRhICYmIGUuY2xpcGJvYXJkRGF0YS5nZXREYXRhKCJUZXh0IikKICBpZiAocGFzdGVkKSB7CiAgICBlLnByZXZlbnREZWZhdWx0KCkKICAgIGlmICghY20uaXNSZWFkT25seSgpICYmICFjbS5vcHRpb25zLmRpc2FibGVJbnB1dCkKICAgICAgcnVuSW5PcChjbSwgKCkgPT4gYXBwbHlUZXh0SW5wdXQoY20sIHBhc3RlZCwgMCwgbnVsbCwgInBhc3RlIikpCiAgICByZXR1cm4gdHJ1ZQogIH0KfQoKZXhwb3J0IGZ1bmN0aW9uIHRyaWdnZXJFbGVjdHJpYyhjbSwgaW5zZXJ0ZWQpIHsKICAvLyBXaGVuIGFuICdlbGVjdHJpYycgY2hhcmFjdGVyIGlzIGluc2VydGVkLCBpbW1lZGlhdGVseSB0cmlnZ2VyIGEgcmVpbmRlbnQKICBpZiAoIWNtLm9wdGlvbnMuZWxlY3RyaWNDaGFycyB8fCAhY20ub3B0aW9ucy5zbWFydEluZGVudCkgcmV0dXJuCiAgbGV0IHNlbCA9IGNtLmRvYy5zZWwKCiAgZm9yIChsZXQgaSA9IHNlbC5yYW5nZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgIGxldCByYW5nZSA9IHNlbC5yYW5nZXNbaV0KICAgIGlmIChyYW5nZS5oZWFkLmNoID4gMTAwIHx8IChpICYmIHNlbC5yYW5nZXNbaSAtIDFdLmhlYWQubGluZSA9PSByYW5nZS5oZWFkLmxpbmUpKSBjb250aW51ZQogICAgbGV0IG1vZGUgPSBjbS5nZXRNb2RlQXQocmFuZ2UuaGVhZCkKICAgIGxldCBpbmRlbnRlZCA9IGZhbHNlCiAgICBpZiAobW9kZS5lbGVjdHJpY0NoYXJzKSB7CiAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgbW9kZS5lbGVjdHJpY0NoYXJzLmxlbmd0aDsgaisrKQogICAgICAgIGlmIChpbnNlcnRlZC5pbmRleE9mKG1vZGUuZWxlY3RyaWNDaGFycy5jaGFyQXQoaikpID4gLTEpIHsKICAgICAgICAgIGluZGVudGVkID0gaW5kZW50TGluZShjbSwgcmFuZ2UuaGVhZC5saW5lLCAic21hcnQiKQogICAgICAgICAgYnJlYWsKICAgICAgICB9CiAgICB9IGVsc2UgaWYgKG1vZGUuZWxlY3RyaWNJbnB1dCkgewogICAgICBpZiAobW9kZS5lbGVjdHJpY0lucHV0LnRlc3QoZ2V0TGluZShjbS5kb2MsIHJhbmdlLmhlYWQubGluZSkudGV4dC5zbGljZSgwLCByYW5nZS5oZWFkLmNoKSkpCiAgICAgICAgaW5kZW50ZWQgPSBpbmRlbnRMaW5lKGNtLCByYW5nZS5oZWFkLmxpbmUsICJzbWFydCIpCiAgICB9CiAgICBpZiAoaW5kZW50ZWQpIHNpZ25hbExhdGVyKGNtLCAiZWxlY3RyaWNJbnB1dCIsIGNtLCByYW5nZS5oZWFkLmxpbmUpCiAgfQp9CgpleHBvcnQgZnVuY3Rpb24gY29weWFibGVSYW5nZXMoY20pIHsKICBsZXQgdGV4dCA9IFtdLCByYW5nZXMgPSBbXQogIGZvciAobGV0IGkgPSAwOyBpIDwgY20uZG9jLnNlbC5yYW5nZXMubGVuZ3RoOyBpKyspIHsKICAgIGxldCBsaW5lID0gY20uZG9jLnNlbC5yYW5nZXNbaV0uaGVhZC5saW5lCiAgICBsZXQgbGluZVJhbmdlID0ge2FuY2hvcjogUG9zKGxpbmUsIDApLCBoZWFkOiBQb3MobGluZSArIDEsIDApfQogICAgcmFuZ2VzLnB1c2gobGluZVJhbmdlKQogICAgdGV4dC5wdXNoKGNtLmdldFJhbmdlKGxpbmVSYW5nZS5hbmNob3IsIGxpbmVSYW5nZS5oZWFkKSkKICB9CiAgcmV0dXJuIHt0ZXh0OiB0ZXh0LCByYW5nZXM6IHJhbmdlc30KfQoKZXhwb3J0IGZ1bmN0aW9uIGRpc2FibGVCcm93c2VyTWFnaWMoZmllbGQsIHNwZWxsY2hlY2spIHsKICBmaWVsZC5zZXRBdHRyaWJ1dGUoImF1dG9jb3JyZWN0IiwgIm9mZiIpCiAgZmllbGQuc2V0QXR0cmlidXRlKCJhdXRvY2FwaXRhbGl6ZSIsICJvZmYiKQogIGZpZWxkLnNldEF0dHJpYnV0ZSgic3BlbGxjaGVjayIsICEhc3BlbGxjaGVjaykKfQoKZXhwb3J0IGZ1bmN0aW9uIGhpZGRlblRleHRhcmVhKCkgewogIGxldCB0ZSA9IGVsdCgidGV4dGFyZWEiLCBudWxsLCBudWxsLCAicG9zaXRpb246IGFic29sdXRlOyBib3R0b206IC0xZW07IHBhZGRpbmc6IDA7IHdpZHRoOiAxcHg7IGhlaWdodDogMWVtOyBvdXRsaW5lOiBub25lIikKICBsZXQgZGl2ID0gZWx0KCJkaXYiLCBbdGVdLCBudWxsLCAib3ZlcmZsb3c6IGhpZGRlbjsgcG9zaXRpb246IHJlbGF0aXZlOyB3aWR0aDogM3B4OyBoZWlnaHQ6IDBweDsiKQogIC8vIFRoZSB0ZXh0YXJlYSBpcyBrZXB0IHBvc2l0aW9uZWQgbmVhciB0aGUgY3Vyc29yIHRvIHByZXZlbnQgdGhlCiAgLy8gZmFjdCB0aGF0IGl0J2xsIGJlIHNjcm9sbGVkIGludG8gdmlldyBvbiBpbnB1dCBmcm9tIHNjcm9sbGluZwogIC8vIG91ciBmYWtlIGN1cnNvciBvdXQgb2Ygdmlldy4gT24gd2Via2l0LCB3aGVuIHdyYXA9b2ZmLCBwYXN0ZSBpcwogIC8vIHZlcnkgc2xvdy4gU28gbWFrZSB0aGUgYXJlYSB3aWRlIGluc3RlYWQuCiAgaWYgKHdlYmtpdCkgdGUuc3R5bGUud2lkdGggPSAiMTAwMHB4IgogIGVsc2UgdGUuc2V0QXR0cmlidXRlKCJ3cmFwIiwgIm9mZiIpCiAgLy8gSWYgYm9yZGVyOiAwOyAtLSBpT1MgZmFpbHMgdG8gb3BlbiBrZXlib2FyZCAoaXNzdWUgIzEyODcpCiAgaWYgKGlvcykgdGUuc3R5bGUuYm9yZGVyID0gIjFweCBzb2xpZCBibGFjayIKICBkaXNhYmxlQnJvd3Nlck1hZ2ljKHRlKQogIHJldHVybiBkaXYKfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/src/input/keymap.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aW1wb3J0IHsgZmxpcEN0cmxDbWQsIG1hYywgcHJlc3RvIH0gZnJvbSAiLi4vdXRpbC9icm93c2VyIgppbXBvcnQgeyBtYXAgfSBmcm9tICIuLi91dGlsL21pc2MiCgppbXBvcnQgeyBrZXlOYW1lcyB9IGZyb20gIi4va2V5bmFtZXMiCgpleHBvcnQgbGV0IGtleU1hcCA9IHt9CgprZXlNYXAuYmFzaWMgPSB7CiAgIkxlZnQiOiAiZ29DaGFyTGVmdCIsICJSaWdodCI6ICJnb0NoYXJSaWdodCIsICJVcCI6ICJnb0xpbmVVcCIsICJEb3duIjogImdvTGluZURvd24iLAogICJFbmQiOiAiZ29MaW5lRW5kIiwgIkhvbWUiOiAiZ29MaW5lU3RhcnRTbWFydCIsICJQYWdlVXAiOiAiZ29QYWdlVXAiLCAiUGFnZURvd24iOiAiZ29QYWdlRG93biIsCiAgIkRlbGV0ZSI6ICJkZWxDaGFyQWZ0ZXIiLCAiQmFja3NwYWNlIjogImRlbENoYXJCZWZvcmUiLCAiU2hpZnQtQmFja3NwYWNlIjogImRlbENoYXJCZWZvcmUiLAogICJUYWIiOiAiZGVmYXVsdFRhYiIsICJTaGlmdC1UYWIiOiAiaW5kZW50QXV0byIsCiAgIkVudGVyIjogIm5ld2xpbmVBbmRJbmRlbnQiLCAiSW5zZXJ0IjogInRvZ2dsZU92ZXJ3cml0ZSIsCiAgIkVzYyI6ICJzaW5nbGVTZWxlY3Rpb24iCn0KLy8gTm90ZSB0aGF0IHRoZSBzYXZlIGFuZCBmaW5kLXJlbGF0ZWQgY29tbWFuZHMgYXJlbid0IGRlZmluZWQgYnkKLy8gZGVmYXVsdC4gVXNlciBjb2RlIG9yIGFkZG9ucyBjYW4gZGVmaW5lIHRoZW0uIFVua25vd24gY29tbWFuZHMKLy8gYXJlIHNpbXBseSBpZ25vcmVkLgprZXlNYXAucGNEZWZhdWx0ID0gewogICJDdHJsLUEiOiAic2VsZWN0QWxsIiwgIkN0cmwtRCI6ICJkZWxldGVMaW5lIiwgIkN0cmwtWiI6ICJ1bmRvIiwgIlNoaWZ0LUN0cmwtWiI6ICJyZWRvIiwgIkN0cmwtWSI6ICJyZWRvIiwKICAiQ3RybC1Ib21lIjogImdvRG9jU3RhcnQiLCAiQ3RybC1FbmQiOiAiZ29Eb2NFbmQiLCAiQ3RybC1VcCI6ICJnb0xpbmVVcCIsICJDdHJsLURvd24iOiAiZ29MaW5lRG93biIsCiAgIkN0cmwtTGVmdCI6ICJnb0dyb3VwTGVmdCIsICJDdHJsLVJpZ2h0IjogImdvR3JvdXBSaWdodCIsICJBbHQtTGVmdCI6ICJnb0xpbmVTdGFydCIsICJBbHQtUmlnaHQiOiAiZ29MaW5lRW5kIiwKICAiQ3RybC1CYWNrc3BhY2UiOiAiZGVsR3JvdXBCZWZvcmUiLCAiQ3RybC1EZWxldGUiOiAiZGVsR3JvdXBBZnRlciIsICJDdHJsLVMiOiAic2F2ZSIsICJDdHJsLUYiOiAiZmluZCIsCiAgIkN0cmwtRyI6ICJmaW5kTmV4dCIsICJTaGlmdC1DdHJsLUciOiAiZmluZFByZXYiLCAiU2hpZnQtQ3RybC1GIjogInJlcGxhY2UiLCAiU2hpZnQtQ3RybC1SIjogInJlcGxhY2VBbGwiLAogICJDdHJsLVsiOiAiaW5kZW50TGVzcyIsICJDdHJsLV0iOiAiaW5kZW50TW9yZSIsCiAgIkN0cmwtVSI6ICJ1bmRvU2VsZWN0aW9uIiwgIlNoaWZ0LUN0cmwtVSI6ICJyZWRvU2VsZWN0aW9uIiwgIkFsdC1VIjogInJlZG9TZWxlY3Rpb24iLAogIGZhbGx0aHJvdWdoOiAiYmFzaWMiCn0KLy8gVmVyeSBiYXNpYyByZWFkbGluZS9lbWFjcy1zdHlsZSBiaW5kaW5ncywgd2hpY2ggYXJlIHN0YW5kYXJkIG9uIE1hYy4Ka2V5TWFwLmVtYWNzeSA9IHsKICAiQ3RybC1GIjogImdvQ2hhclJpZ2h0IiwgIkN0cmwtQiI6ICJnb0NoYXJMZWZ0IiwgIkN0cmwtUCI6ICJnb0xpbmVVcCIsICJDdHJsLU4iOiAiZ29MaW5lRG93biIsCiAgIkFsdC1GIjogImdvV29yZFJpZ2h0IiwgIkFsdC1CIjogImdvV29yZExlZnQiLCAiQ3RybC1BIjogImdvTGluZVN0YXJ0IiwgIkN0cmwtRSI6ICJnb0xpbmVFbmQiLAogICJDdHJsLVYiOiAiZ29QYWdlRG93biIsICJTaGlmdC1DdHJsLVYiOiAiZ29QYWdlVXAiLCAiQ3RybC1EIjogImRlbENoYXJBZnRlciIsICJDdHJsLUgiOiAiZGVsQ2hhckJlZm9yZSIsCiAgIkFsdC1EIjogImRlbFdvcmRBZnRlciIsICJBbHQtQmFja3NwYWNlIjogImRlbFdvcmRCZWZvcmUiLCAiQ3RybC1LIjogImtpbGxMaW5lIiwgIkN0cmwtVCI6ICJ0cmFuc3Bvc2VDaGFycyIsCiAgIkN0cmwtTyI6ICJvcGVuTGluZSIKfQprZXlNYXAubWFjRGVmYXVsdCA9IHsKICAiQ21kLUEiOiAic2VsZWN0QWxsIiwgIkNtZC1EIjogImRlbGV0ZUxpbmUiLCAiQ21kLVoiOiAidW5kbyIsICJTaGlmdC1DbWQtWiI6ICJyZWRvIiwgIkNtZC1ZIjogInJlZG8iLAogICJDbWQtSG9tZSI6ICJnb0RvY1N0YXJ0IiwgIkNtZC1VcCI6ICJnb0RvY1N0YXJ0IiwgIkNtZC1FbmQiOiAiZ29Eb2NFbmQiLCAiQ21kLURvd24iOiAiZ29Eb2NFbmQiLCAiQWx0LUxlZnQiOiAiZ29Hcm91cExlZnQiLAogICJBbHQtUmlnaHQiOiAiZ29Hcm91cFJpZ2h0IiwgIkNtZC1MZWZ0IjogImdvTGluZUxlZnQiLCAiQ21kLVJpZ2h0IjogImdvTGluZVJpZ2h0IiwgIkFsdC1CYWNrc3BhY2UiOiAiZGVsR3JvdXBCZWZvcmUiLAogICJDdHJsLUFsdC1CYWNrc3BhY2UiOiAiZGVsR3JvdXBBZnRlciIsICJBbHQtRGVsZXRlIjogImRlbEdyb3VwQWZ0ZXIiLCAiQ21kLVMiOiAic2F2ZSIsICJDbWQtRiI6ICJmaW5kIiwKICAiQ21kLUciOiAiZmluZE5leHQiLCAiU2hpZnQtQ21kLUciOiAiZmluZFByZXYiLCAiQ21kLUFsdC1GIjogInJlcGxhY2UiLCAiU2hpZnQtQ21kLUFsdC1GIjogInJlcGxhY2VBbGwiLAogICJDbWQtWyI6ICJpbmRlbnRMZXNzIiwgIkNtZC1dIjogImluZGVudE1vcmUiLCAiQ21kLUJhY2tzcGFjZSI6ICJkZWxXcmFwcGVkTGluZUxlZnQiLCAiQ21kLURlbGV0ZSI6ICJkZWxXcmFwcGVkTGluZVJpZ2h0IiwKICAiQ21kLVUiOiAidW5kb1NlbGVjdGlvbiIsICJTaGlmdC1DbWQtVSI6ICJyZWRvU2VsZWN0aW9uIiwgIkN0cmwtVXAiOiAiZ29Eb2NTdGFydCIsICJDdHJsLURvd24iOiAiZ29Eb2NFbmQiLAogIGZhbGx0aHJvdWdoOiBbImJhc2ljIiwgImVtYWNzeSJdCn0Ka2V5TWFwWyJkZWZhdWx0Il0gPSBtYWMgPyBrZXlNYXAubWFjRGVmYXVsdCA6IGtleU1hcC5wY0RlZmF1bHQKCi8vIEtFWU1BUCBESVNQQVRDSAoKZnVuY3Rpb24gbm9ybWFsaXplS2V5TmFtZShuYW1lKSB7CiAgbGV0IHBhcnRzID0gbmFtZS5zcGxpdCgvLSg/ISQpLykKICBuYW1lID0gcGFydHNbcGFydHMubGVuZ3RoIC0gMV0KICBsZXQgYWx0LCBjdHJsLCBzaGlmdCwgY21kCiAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJ0cy5sZW5ndGggLSAxOyBpKyspIHsKICAgIGxldCBtb2QgPSBwYXJ0c1tpXQogICAgaWYgKC9eKGNtZHxtZXRhfG0pJC9pLnRlc3QobW9kKSkgY21kID0gdHJ1ZQogICAgZWxzZSBpZiAoL15hKGx0KT8kL2kudGVzdChtb2QpKSBhbHQgPSB0cnVlCiAgICBlbHNlIGlmICgvXihjfGN0cmx8Y29udHJvbCkkL2kudGVzdChtb2QpKSBjdHJsID0gdHJ1ZQogICAgZWxzZSBpZiAoL15zKGhpZnQpPyQvaS50ZXN0KG1vZCkpIHNoaWZ0ID0gdHJ1ZQogICAgZWxzZSB0aHJvdyBuZXcgRXJyb3IoIlVucmVjb2duaXplZCBtb2RpZmllciBuYW1lOiAiICsgbW9kKQogIH0KICBpZiAoYWx0KSBuYW1lID0gIkFsdC0iICsgbmFtZQogIGlmIChjdHJsKSBuYW1lID0gIkN0cmwtIiArIG5hbWUKICBpZiAoY21kKSBuYW1lID0gIkNtZC0iICsgbmFtZQogIGlmIChzaGlmdCkgbmFtZSA9ICJTaGlmdC0iICsgbmFtZQogIHJldHVybiBuYW1lCn0KCi8vIFRoaXMgaXMgYSBrbHVkZ2UgdG8ga2VlcCBrZXltYXBzIG1vc3RseSB3b3JraW5nIGFzIHJhdyBvYmplY3RzCi8vIChiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSkgd2hpbGUgYXQgdGhlIHNhbWUgdGltZSBzdXBwb3J0IGZlYXR1cmVzCi8vIGxpa2Ugbm9ybWFsaXphdGlvbiBhbmQgbXVsdGktc3Ryb2tlIGtleSBiaW5kaW5ncy4gSXQgY29tcGlsZXMgYQovLyBuZXcgbm9ybWFsaXplZCBrZXltYXAsIGFuZCB0aGVuIHVwZGF0ZXMgdGhlIG9sZCBvYmplY3QgdG8gcmVmbGVjdAovLyB0aGlzLgpleHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplS2V5TWFwKGtleW1hcCkgewogIGxldCBjb3B5ID0ge30KICBmb3IgKGxldCBrZXluYW1lIGluIGtleW1hcCkgaWYgKGtleW1hcC5oYXNPd25Qcm9wZXJ0eShrZXluYW1lKSkgewogICAgbGV0IHZhbHVlID0ga2V5bWFwW2tleW5hbWVdCiAgICBpZiAoL14obmFtZXxmYWxsdGhyb3VnaHwoZGV8YXQpdGFjaCkkLy50ZXN0KGtleW5hbWUpKSBjb250aW51ZQogICAgaWYgKHZhbHVlID09ICIuLi4iKSB7IGRlbGV0ZSBrZXltYXBba2V5bmFtZV07IGNvbnRpbnVlIH0KCiAgICBsZXQga2V5cyA9IG1hcChrZXluYW1lLnNwbGl0KCIgIiksIG5vcm1hbGl6ZUtleU5hbWUpCiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsKICAgICAgbGV0IHZhbCwgbmFtZQogICAgICBpZiAoaSA9PSBrZXlzLmxlbmd0aCAtIDEpIHsKICAgICAgICBuYW1lID0ga2V5cy5qb2luKCIgIikKICAgICAgICB2YWwgPSB2YWx1ZQogICAgICB9IGVsc2UgewogICAgICAgIG5hbWUgPSBrZXlzLnNsaWNlKDAsIGkgKyAxKS5qb2luKCIgIikKICAgICAgICB2YWwgPSAiLi4uIgogICAgICB9CiAgICAgIGxldCBwcmV2ID0gY29weVtuYW1lXQogICAgICBpZiAoIXByZXYpIGNvcHlbbmFtZV0gPSB2YWwKICAgICAgZWxzZSBpZiAocHJldiAhPSB2YWwpIHRocm93IG5ldyBFcnJvcigiSW5jb25zaXN0ZW50IGJpbmRpbmdzIGZvciAiICsgbmFtZSkKICAgIH0KICAgIGRlbGV0ZSBrZXltYXBba2V5bmFtZV0KICB9CiAgZm9yIChsZXQgcHJvcCBpbiBjb3B5KSBrZXltYXBbcHJvcF0gPSBjb3B5W3Byb3BdCiAgcmV0dXJuIGtleW1hcAp9CgpleHBvcnQgZnVuY3Rpb24gbG9va3VwS2V5KGtleSwgbWFwLCBoYW5kbGUsIGNvbnRleHQpIHsKICBtYXAgPSBnZXRLZXlNYXAobWFwKQogIGxldCBmb3VuZCA9IG1hcC5jYWxsID8gbWFwLmNhbGwoa2V5LCBjb250ZXh0KSA6IG1hcFtrZXldCiAgaWYgKGZvdW5kID09PSBmYWxzZSkgcmV0dXJuICJub3RoaW5nIgogIGlmIChmb3VuZCA9PT0gIi4uLiIpIHJldHVybiAibXVsdGkiCiAgaWYgKGZvdW5kICE9IG51bGwgJiYgaGFuZGxlKGZvdW5kKSkgcmV0dXJuICJoYW5kbGVkIgoKICBpZiAobWFwLmZhbGx0aHJvdWdoKSB7CiAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG1hcC5mYWxsdGhyb3VnaCkgIT0gIltvYmplY3QgQXJyYXldIikKICAgICAgcmV0dXJuIGxvb2t1cEtleShrZXksIG1hcC5mYWxsdGhyb3VnaCwgaGFuZGxlLCBjb250ZXh0KQogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXAuZmFsbHRocm91Z2gubGVuZ3RoOyBpKyspIHsKICAgICAgbGV0IHJlc3VsdCA9IGxvb2t1cEtleShrZXksIG1hcC5mYWxsdGhyb3VnaFtpXSwgaGFuZGxlLCBjb250ZXh0KQogICAgICBpZiAocmVzdWx0KSByZXR1cm4gcmVzdWx0CiAgICB9CiAgfQp9CgovLyBNb2RpZmllciBrZXkgcHJlc3NlcyBkb24ndCBjb3VudCBhcyAncmVhbCcga2V5IHByZXNzZXMgZm9yIHRoZQovLyBwdXJwb3NlIG9mIGtleW1hcCBmYWxsdGhyb3VnaC4KZXhwb3J0IGZ1bmN0aW9uIGlzTW9kaWZpZXJLZXkodmFsdWUpIHsKICBsZXQgbmFtZSA9IHR5cGVvZiB2YWx1ZSA9PSAic3RyaW5nIiA/IHZhbHVlIDoga2V5TmFtZXNbdmFsdWUua2V5Q29kZV0KICByZXR1cm4gbmFtZSA9PSAiQ3RybCIgfHwgbmFtZSA9PSAiQWx0IiB8fCBuYW1lID09ICJTaGlmdCIgfHwgbmFtZSA9PSAiTW9kIgp9CgovLyBMb29rIHVwIHRoZSBuYW1lIG9mIGEga2V5IGFzIGluZGljYXRlZCBieSBhbiBldmVudCBvYmplY3QuCmV4cG9ydCBmdW5jdGlvbiBrZXlOYW1lKGV2ZW50LCBub1NoaWZ0KSB7CiAgaWYgKHByZXN0byAmJiBldmVudC5rZXlDb2RlID09IDM0ICYmIGV2ZW50WyJjaGFyIl0pIHJldHVybiBmYWxzZQogIGxldCBiYXNlID0ga2V5TmFtZXNbZXZlbnQua2V5Q29kZV0sIG5hbWUgPSBiYXNlCiAgaWYgKG5hbWUgPT0gbnVsbCB8fCBldmVudC5hbHRHcmFwaEtleSkgcmV0dXJuIGZhbHNlCiAgaWYgKGV2ZW50LmFsdEtleSAmJiBiYXNlICE9ICJBbHQiKSBuYW1lID0gIkFsdC0iICsgbmFtZQogIGlmICgoZmxpcEN0cmxDbWQgPyBldmVudC5tZXRhS2V5IDogZXZlbnQuY3RybEtleSkgJiYgYmFzZSAhPSAiQ3RybCIpIG5hbWUgPSAiQ3RybC0iICsgbmFtZQogIGlmICgoZmxpcEN0cmxDbWQgPyBldmVudC5jdHJsS2V5IDogZXZlbnQubWV0YUtleSkgJiYgYmFzZSAhPSAiQ21kIikgbmFtZSA9ICJDbWQtIiArIG5hbWUKICBpZiAoIW5vU2hpZnQgJiYgZXZlbnQuc2hpZnRLZXkgJiYgYmFzZSAhPSAiU2hpZnQiKSBuYW1lID0gIlNoaWZ0LSIgKyBuYW1lCiAgcmV0dXJuIG5hbWUKfQoKZXhwb3J0IGZ1bmN0aW9uIGdldEtleU1hcCh2YWwpIHsKICByZXR1cm4gdHlwZW9mIHZhbCA9PSAic3RyaW5nIiA/IGtleU1hcFt2YWxdIDogdmFsCn0K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/src/input/keynames.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZXhwb3J0IGxldCBrZXlOYW1lcyA9IHsKICAzOiAiRW50ZXIiLCA4OiAiQmFja3NwYWNlIiwgOTogIlRhYiIsIDEzOiAiRW50ZXIiLCAxNjogIlNoaWZ0IiwgMTc6ICJDdHJsIiwgMTg6ICJBbHQiLAogIDE5OiAiUGF1c2UiLCAyMDogIkNhcHNMb2NrIiwgMjc6ICJFc2MiLCAzMjogIlNwYWNlIiwgMzM6ICJQYWdlVXAiLCAzNDogIlBhZ2VEb3duIiwgMzU6ICJFbmQiLAogIDM2OiAiSG9tZSIsIDM3OiAiTGVmdCIsIDM4OiAiVXAiLCAzOTogIlJpZ2h0IiwgNDA6ICJEb3duIiwgNDQ6ICJQcmludFNjcm4iLCA0NTogIkluc2VydCIsCiAgNDY6ICJEZWxldGUiLCA1OTogIjsiLCA2MTogIj0iLCA5MTogIk1vZCIsIDkyOiAiTW9kIiwgOTM6ICJNb2QiLAogIDEwNjogIioiLCAxMDc6ICI9IiwgMTA5OiAiLSIsIDExMDogIi4iLCAxMTE6ICIvIiwgMTI3OiAiRGVsZXRlIiwKICAxNzM6ICItIiwgMTg2OiAiOyIsIDE4NzogIj0iLCAxODg6ICIsIiwgMTg5OiAiLSIsIDE5MDogIi4iLCAxOTE6ICIvIiwgMTkyOiAiYCIsIDIxOTogIlsiLCAyMjA6ICJcXCIsCiAgMjIxOiAiXSIsIDIyMjogIiciLCA2MzIzMjogIlVwIiwgNjMyMzM6ICJEb3duIiwgNjMyMzQ6ICJMZWZ0IiwgNjMyMzU6ICJSaWdodCIsIDYzMjcyOiAiRGVsZXRlIiwKICA2MzI3MzogIkhvbWUiLCA2MzI3NTogIkVuZCIsIDYzMjc2OiAiUGFnZVVwIiwgNjMyNzc6ICJQYWdlRG93biIsIDYzMzAyOiAiSW5zZXJ0Igp9CgovLyBOdW1iZXIga2V5cwpmb3IgKGxldCBpID0gMDsgaSA8IDEwOyBpKyspIGtleU5hbWVzW2kgKyA0OF0gPSBrZXlOYW1lc1tpICsgOTZdID0gU3RyaW5nKGkpCi8vIEFscGhhYmV0aWMga2V5cwpmb3IgKGxldCBpID0gNjU7IGkgPD0gOTA7IGkrKykga2V5TmFtZXNbaV0gPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGkpCi8vIEZ1bmN0aW9uIGtleXMKZm9yIChsZXQgaSA9IDE7IGkgPD0gMTI7IGkrKykga2V5TmFtZXNbaSArIDExMV0gPSBrZXlOYW1lc1tpICsgNjMyMzVdID0gIkYiICsgaQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/src/input/TextareaInput.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aW1wb3J0IHsgb3BlcmF0aW9uLCBydW5Jbk9wIH0gZnJvbSAiLi4vZGlzcGxheS9vcGVyYXRpb25zIgppbXBvcnQgeyBwcmVwYXJlU2VsZWN0aW9uIH0gZnJvbSAiLi4vZGlzcGxheS9zZWxlY3Rpb24iCmltcG9ydCB7IGFwcGx5VGV4dElucHV0LCBjb3B5YWJsZVJhbmdlcywgaGFuZGxlUGFzdGUsIGhpZGRlblRleHRhcmVhLCBsYXN0Q29waWVkLCBzZXRMYXN0Q29waWVkIH0gZnJvbSAiLi9pbnB1dCIKaW1wb3J0IHsgY3Vyc29yQ29vcmRzLCBwb3NGcm9tTW91c2UgfSBmcm9tICIuLi9tZWFzdXJlbWVudC9wb3NpdGlvbl9tZWFzdXJlbWVudCIKaW1wb3J0IHsgZXZlbnRJbldpZGdldCB9IGZyb20gIi4uL21lYXN1cmVtZW50L3dpZGdldHMiCmltcG9ydCB7IHNpbXBsZVNlbGVjdGlvbiB9IGZyb20gIi4uL21vZGVsL3NlbGVjdGlvbiIKaW1wb3J0IHsgc2VsZWN0QWxsLCBzZXRTZWxlY3Rpb24gfSBmcm9tICIuLi9tb2RlbC9zZWxlY3Rpb25fdXBkYXRlcyIKaW1wb3J0IHsgY2FwdHVyZVJpZ2h0Q2xpY2ssIGllLCBpZV92ZXJzaW9uLCBpb3MsIG1hYywgbW9iaWxlLCBwcmVzdG8sIHdlYmtpdCB9IGZyb20gIi4uL3V0aWwvYnJvd3NlciIKaW1wb3J0IHsgYWN0aXZlRWx0LCByZW1vdmVDaGlsZHJlbkFuZEFkZCwgc2VsZWN0SW5wdXQgfSBmcm9tICIuLi91dGlsL2RvbSIKaW1wb3J0IHsgZV9wcmV2ZW50RGVmYXVsdCwgZV9zdG9wLCBvZmYsIG9uLCBzaWduYWxET01FdmVudCB9IGZyb20gIi4uL3V0aWwvZXZlbnQiCmltcG9ydCB7IGhhc0NvcHlFdmVudCwgaGFzU2VsZWN0aW9uIH0gZnJvbSAiLi4vdXRpbC9mZWF0dXJlX2RldGVjdGlvbiIKaW1wb3J0IHsgY29weU9iaiwgRGVsYXllZCwgbm90aGluZywgc2VsX2RvbnRTY3JvbGwgfSBmcm9tICIuLi91dGlsL21pc2MiCgovLyBURVhUQVJFQSBJTlBVVCBTVFlMRQoKZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gVGV4dGFyZWFJbnB1dChjbSkgewogIHRoaXMuY20gPSBjbQogIC8vIFNlZSBpbnB1dC5wb2xsIGFuZCBpbnB1dC5yZXNldAogIHRoaXMucHJldklucHV0ID0gIiIKCiAgLy8gRmxhZyB0aGF0IGluZGljYXRlcyB3aGV0aGVyIHdlIGV4cGVjdCBpbnB1dCB0byBhcHBlYXIgcmVhbCBzb29uCiAgLy8gbm93IChhZnRlciBzb21lIGV2ZW50IGxpa2UgJ2tleXByZXNzJyBvciAnaW5wdXQnKSBhbmQgYXJlCiAgLy8gcG9sbGluZyBpbnRlbnNpdmVseS4KICB0aGlzLnBvbGxpbmdGYXN0ID0gZmFsc2UKICAvLyBTZWxmLXJlc2V0dGluZyB0aW1lb3V0IGZvciB0aGUgcG9sbGVyCiAgdGhpcy5wb2xsaW5nID0gbmV3IERlbGF5ZWQoKQogIC8vIFRyYWNrcyB3aGVuIGlucHV0LnJlc2V0IGhhcyBwdW50ZWQgdG8ganVzdCBwdXR0aW5nIGEgc2hvcnQKICAvLyBzdHJpbmcgaW50byB0aGUgdGV4dGFyZWEgaW5zdGVhZCBvZiB0aGUgZnVsbCBzZWxlY3Rpb24uCiAgdGhpcy5pbmFjY3VyYXRlU2VsZWN0aW9uID0gZmFsc2UKICAvLyBVc2VkIHRvIHdvcmsgYXJvdW5kIElFIGlzc3VlIHdpdGggc2VsZWN0aW9uIGJlaW5nIGZvcmdvdHRlbiB3aGVuIGZvY3VzIG1vdmVzIGF3YXkgZnJvbSB0ZXh0YXJlYQogIHRoaXMuaGFzU2VsZWN0aW9uID0gZmFsc2UKICB0aGlzLmNvbXBvc2luZyA9IG51bGwKfQoKVGV4dGFyZWFJbnB1dC5wcm90b3R5cGUgPSBjb3B5T2JqKHsKICBpbml0OiBmdW5jdGlvbihkaXNwbGF5KSB7CiAgICBsZXQgaW5wdXQgPSB0aGlzLCBjbSA9IHRoaXMuY20KCiAgICAvLyBXcmFwcyBhbmQgaGlkZXMgaW5wdXQgdGV4dGFyZWEKICAgIGxldCBkaXYgPSB0aGlzLndyYXBwZXIgPSBoaWRkZW5UZXh0YXJlYSgpCiAgICAvLyBUaGUgc2VtaWhpZGRlbiB0ZXh0YXJlYSB0aGF0IGlzIGZvY3VzZWQgd2hlbiB0aGUgZWRpdG9yIGlzCiAgICAvLyBmb2N1c2VkLCBhbmQgcmVjZWl2ZXMgaW5wdXQuCiAgICBsZXQgdGUgPSB0aGlzLnRleHRhcmVhID0gZGl2LmZpcnN0Q2hpbGQKICAgIGRpc3BsYXkud3JhcHBlci5pbnNlcnRCZWZvcmUoZGl2LCBkaXNwbGF5LndyYXBwZXIuZmlyc3RDaGlsZCkKCiAgICAvLyBOZWVkZWQgdG8gaGlkZSBiaWcgYmx1ZSBibGlua2luZyBjdXJzb3Igb24gTW9iaWxlIFNhZmFyaSAoZG9lc24ndCBzZWVtIHRvIHdvcmsgaW4gaU9TIDggYW55bW9yZSkKICAgIGlmIChpb3MpIHRlLnN0eWxlLndpZHRoID0gIjBweCIKCiAgICBvbih0ZSwgImlucHV0IiwgKCkgPT4gewogICAgICBpZiAoaWUgJiYgaWVfdmVyc2lvbiA+PSA5ICYmIHRoaXMuaGFzU2VsZWN0aW9uKSB0aGlzLmhhc1NlbGVjdGlvbiA9IG51bGwKICAgICAgaW5wdXQucG9sbCgpCiAgICB9KQoKICAgIG9uKHRlLCAicGFzdGUiLCBlID0+IHsKICAgICAgaWYgKHNpZ25hbERPTUV2ZW50KGNtLCBlKSB8fCBoYW5kbGVQYXN0ZShlLCBjbSkpIHJldHVybgoKICAgICAgY20uc3RhdGUucGFzdGVJbmNvbWluZyA9IHRydWUKICAgICAgaW5wdXQuZmFzdFBvbGwoKQogICAgfSkKCiAgICBmdW5jdGlvbiBwcmVwYXJlQ29weUN1dChlKSB7CiAgICAgIGlmIChzaWduYWxET01FdmVudChjbSwgZSkpIHJldHVybgogICAgICBpZiAoY20uc29tZXRoaW5nU2VsZWN0ZWQoKSkgewogICAgICAgIHNldExhc3RDb3BpZWQoe2xpbmVXaXNlOiBmYWxzZSwgdGV4dDogY20uZ2V0U2VsZWN0aW9ucygpfSkKICAgICAgICBpZiAoaW5wdXQuaW5hY2N1cmF0ZVNlbGVjdGlvbikgewogICAgICAgICAgaW5wdXQucHJldklucHV0ID0gIiIKICAgICAgICAgIGlucHV0LmluYWNjdXJhdGVTZWxlY3Rpb24gPSBmYWxzZQogICAgICAgICAgdGUudmFsdWUgPSBsYXN0Q29waWVkLnRleHQuam9pbigiXG4iKQogICAgICAgICAgc2VsZWN0SW5wdXQodGUpCiAgICAgICAgfQogICAgICB9IGVsc2UgaWYgKCFjbS5vcHRpb25zLmxpbmVXaXNlQ29weUN1dCkgewogICAgICAgIHJldHVybgogICAgICB9IGVsc2UgewogICAgICAgIGxldCByYW5nZXMgPSBjb3B5YWJsZVJhbmdlcyhjbSkKICAgICAgICBzZXRMYXN0Q29waWVkKHtsaW5lV2lzZTogdHJ1ZSwgdGV4dDogcmFuZ2VzLnRleHR9KQogICAgICAgIGlmIChlLnR5cGUgPT0gImN1dCIpIHsKICAgICAgICAgIGNtLnNldFNlbGVjdGlvbnMocmFuZ2VzLnJhbmdlcywgbnVsbCwgc2VsX2RvbnRTY3JvbGwpCiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlucHV0LnByZXZJbnB1dCA9ICIiCiAgICAgICAgICB0ZS52YWx1ZSA9IHJhbmdlcy50ZXh0LmpvaW4oIlxuIikKICAgICAgICAgIHNlbGVjdElucHV0KHRlKQogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoZS50eXBlID09ICJjdXQiKSBjbS5zdGF0ZS5jdXRJbmNvbWluZyA9IHRydWUKICAgIH0KICAgIG9uKHRlLCAiY3V0IiwgcHJlcGFyZUNvcHlDdXQpCiAgICBvbih0ZSwgImNvcHkiLCBwcmVwYXJlQ29weUN1dCkKCiAgICBvbihkaXNwbGF5LnNjcm9sbGVyLCAicGFzdGUiLCBlID0+IHsKICAgICAgaWYgKGV2ZW50SW5XaWRnZXQoZGlzcGxheSwgZSkgfHwgc2lnbmFsRE9NRXZlbnQoY20sIGUpKSByZXR1cm4KICAgICAgY20uc3RhdGUucGFzdGVJbmNvbWluZyA9IHRydWUKICAgICAgaW5wdXQuZm9jdXMoKQogICAgfSkKCiAgICAvLyBQcmV2ZW50IG5vcm1hbCBzZWxlY3Rpb24gaW4gdGhlIGVkaXRvciAod2UgaGFuZGxlIG91ciBvd24pCiAgICBvbihkaXNwbGF5LmxpbmVTcGFjZSwgInNlbGVjdHN0YXJ0IiwgZSA9PiB7CiAgICAgIGlmICghZXZlbnRJbldpZGdldChkaXNwbGF5LCBlKSkgZV9wcmV2ZW50RGVmYXVsdChlKQogICAgfSkKCiAgICBvbih0ZSwgImNvbXBvc2l0aW9uc3RhcnQiLCAoKSA9PiB7CiAgICAgIGxldCBzdGFydCA9IGNtLmdldEN1cnNvcigiZnJvbSIpCiAgICAgIGlmIChpbnB1dC5jb21wb3NpbmcpIGlucHV0LmNvbXBvc2luZy5yYW5nZS5jbGVhcigpCiAgICAgIGlucHV0LmNvbXBvc2luZyA9IHsKICAgICAgICBzdGFydDogc3RhcnQsCiAgICAgICAgcmFuZ2U6IGNtLm1hcmtUZXh0KHN0YXJ0LCBjbS5nZXRDdXJzb3IoInRvIiksIHtjbGFzc05hbWU6ICJDb2RlTWlycm9yLWNvbXBvc2luZyJ9KQogICAgICB9CiAgICB9KQogICAgb24odGUsICJjb21wb3NpdGlvbmVuZCIsICgpID0+IHsKICAgICAgaWYgKGlucHV0LmNvbXBvc2luZykgewogICAgICAgIGlucHV0LnBvbGwoKQogICAgICAgIGlucHV0LmNvbXBvc2luZy5yYW5nZS5jbGVhcigpCiAgICAgICAgaW5wdXQuY29tcG9zaW5nID0gbnVsbAogICAgICB9CiAgICB9KQogIH0sCgogIHByZXBhcmVTZWxlY3Rpb246IGZ1bmN0aW9uKCkgewogICAgLy8gUmVkcmF3IHRoZSBzZWxlY3Rpb24gYW5kL29yIGN1cnNvcgogICAgbGV0IGNtID0gdGhpcy5jbSwgZGlzcGxheSA9IGNtLmRpc3BsYXksIGRvYyA9IGNtLmRvYwogICAgbGV0IHJlc3VsdCA9IHByZXBhcmVTZWxlY3Rpb24oY20pCgogICAgLy8gTW92ZSB0aGUgaGlkZGVuIHRleHRhcmVhIG5lYXIgdGhlIGN1cnNvciB0byBwcmV2ZW50IHNjcm9sbGluZyBhcnRpZmFjdHMKICAgIGlmIChjbS5vcHRpb25zLm1vdmVJbnB1dFdpdGhDdXJzb3IpIHsKICAgICAgbGV0IGhlYWRQb3MgPSBjdXJzb3JDb29yZHMoY20sIGRvYy5zZWwucHJpbWFyeSgpLmhlYWQsICJkaXYiKQogICAgICBsZXQgd3JhcE9mZiA9IGRpc3BsYXkud3JhcHBlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwgbGluZU9mZiA9IGRpc3BsYXkubGluZURpdi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKQogICAgICByZXN1bHQudGVUb3AgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihkaXNwbGF5LndyYXBwZXIuY2xpZW50SGVpZ2h0IC0gMTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRQb3MudG9wICsgbGluZU9mZi50b3AgLSB3cmFwT2ZmLnRvcCkpCiAgICAgIHJlc3VsdC50ZUxlZnQgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihkaXNwbGF5LndyYXBwZXIuY2xpZW50V2lkdGggLSAxMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRQb3MubGVmdCArIGxpbmVPZmYubGVmdCAtIHdyYXBPZmYubGVmdCkpCiAgICB9CgogICAgcmV0dXJuIHJlc3VsdAogIH0sCgogIHNob3dTZWxlY3Rpb246IGZ1bmN0aW9uKGRyYXduKSB7CiAgICBsZXQgY20gPSB0aGlzLmNtLCBkaXNwbGF5ID0gY20uZGlzcGxheQogICAgcmVtb3ZlQ2hpbGRyZW5BbmRBZGQoZGlzcGxheS5jdXJzb3JEaXYsIGRyYXduLmN1cnNvcnMpCiAgICByZW1vdmVDaGlsZHJlbkFuZEFkZChkaXNwbGF5LnNlbGVjdGlvbkRpdiwgZHJhd24uc2VsZWN0aW9uKQogICAgaWYgKGRyYXduLnRlVG9wICE9IG51bGwpIHsKICAgICAgdGhpcy53cmFwcGVyLnN0eWxlLnRvcCA9IGRyYXduLnRlVG9wICsgInB4IgogICAgICB0aGlzLndyYXBwZXIuc3R5bGUubGVmdCA9IGRyYXduLnRlTGVmdCArICJweCIKICAgIH0KICB9LAoKICAvLyBSZXNldCB0aGUgaW5wdXQgdG8gY29ycmVzcG9uZCB0byB0aGUgc2VsZWN0aW9uIChvciB0byBiZSBlbXB0eSwKICAvLyB3aGVuIG5vdCB0eXBpbmcgYW5kIG5vdGhpbmcgaXMgc2VsZWN0ZWQpCiAgcmVzZXQ6IGZ1bmN0aW9uKHR5cGluZykgewogICAgaWYgKHRoaXMuY29udGV4dE1lbnVQZW5kaW5nKSByZXR1cm4KICAgIGxldCBtaW5pbWFsLCBzZWxlY3RlZCwgY20gPSB0aGlzLmNtLCBkb2MgPSBjbS5kb2MKICAgIGlmIChjbS5zb21ldGhpbmdTZWxlY3RlZCgpKSB7CiAgICAgIHRoaXMucHJldklucHV0ID0gIiIKICAgICAgbGV0IHJhbmdlID0gZG9jLnNlbC5wcmltYXJ5KCkKICAgICAgbWluaW1hbCA9IGhhc0NvcHlFdmVudCAmJgogICAgICAgIChyYW5nZS50bygpLmxpbmUgLSByYW5nZS5mcm9tKCkubGluZSA+IDEwMCB8fCAoc2VsZWN0ZWQgPSBjbS5nZXRTZWxlY3Rpb24oKSkubGVuZ3RoID4gMTAwMCkKICAgICAgbGV0IGNvbnRlbnQgPSBtaW5pbWFsID8gIi0iIDogc2VsZWN0ZWQgfHwgY20uZ2V0U2VsZWN0aW9uKCkKICAgICAgdGhpcy50ZXh0YXJlYS52YWx1ZSA9IGNvbnRlbnQKICAgICAgaWYgKGNtLnN0YXRlLmZvY3VzZWQpIHNlbGVjdElucHV0KHRoaXMudGV4dGFyZWEpCiAgICAgIGlmIChpZSAmJiBpZV92ZXJzaW9uID49IDkpIHRoaXMuaGFzU2VsZWN0aW9uID0gY29udGVudAogICAgfSBlbHNlIGlmICghdHlwaW5nKSB7CiAgICAgIHRoaXMucHJldklucHV0ID0gdGhpcy50ZXh0YXJlYS52YWx1ZSA9ICIiCiAgICAgIGlmIChpZSAmJiBpZV92ZXJzaW9uID49IDkpIHRoaXMuaGFzU2VsZWN0aW9uID0gbnVsbAogICAgfQogICAgdGhpcy5pbmFjY3VyYXRlU2VsZWN0aW9uID0gbWluaW1hbAogIH0sCgogIGdldEZpZWxkOiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMudGV4dGFyZWEgfSwKCiAgc3VwcG9ydHNUb3VjaDogZnVuY3Rpb24oKSB7IHJldHVybiBmYWxzZSB9LAoKICBmb2N1czogZnVuY3Rpb24oKSB7CiAgICBpZiAodGhpcy5jbS5vcHRpb25zLnJlYWRPbmx5ICE9ICJub2N1cnNvciIgJiYgKCFtb2JpbGUgfHwgYWN0aXZlRWx0KCkgIT0gdGhpcy50ZXh0YXJlYSkpIHsKICAgICAgdHJ5IHsgdGhpcy50ZXh0YXJlYS5mb2N1cygpIH0KICAgICAgY2F0Y2ggKGUpIHt9IC8vIElFOCB3aWxsIHRocm93IGlmIHRoZSB0ZXh0YXJlYSBpcyBkaXNwbGF5OiBub25lIG9yIG5vdCBpbiBET00KICAgIH0KICB9LAoKICBibHVyOiBmdW5jdGlvbigpIHsgdGhpcy50ZXh0YXJlYS5ibHVyKCkgfSwKCiAgcmVzZXRQb3NpdGlvbjogZnVuY3Rpb24oKSB7CiAgICB0aGlzLndyYXBwZXIuc3R5bGUudG9wID0gdGhpcy53cmFwcGVyLnN0eWxlLmxlZnQgPSAwCiAgfSwKCiAgcmVjZWl2ZWRGb2N1czogZnVuY3Rpb24oKSB7IHRoaXMuc2xvd1BvbGwoKSB9LAoKICAvLyBQb2xsIGZvciBpbnB1dCBjaGFuZ2VzLCB1c2luZyB0aGUgbm9ybWFsIHJhdGUgb2YgcG9sbGluZy4gVGhpcwogIC8vIHJ1bnMgYXMgbG9uZyBhcyB0aGUgZWRpdG9yIGlzIGZvY3VzZWQuCiAgc2xvd1BvbGw6IGZ1bmN0aW9uKCkgewogICAgaWYgKHRoaXMucG9sbGluZ0Zhc3QpIHJldHVybgogICAgdGhpcy5wb2xsaW5nLnNldCh0aGlzLmNtLm9wdGlvbnMucG9sbEludGVydmFsLCAoKSA9PiB7CiAgICAgIHRoaXMucG9sbCgpCiAgICAgIGlmICh0aGlzLmNtLnN0YXRlLmZvY3VzZWQpIHRoaXMuc2xvd1BvbGwoKQogICAgfSkKICB9LAoKICAvLyBXaGVuIGFuIGV2ZW50IGhhcyBqdXN0IGNvbWUgaW4gdGhhdCBpcyBsaWtlbHkgdG8gYWRkIG9yIGNoYW5nZQogIC8vIHNvbWV0aGluZyBpbiB0aGUgaW5wdXQgdGV4dGFyZWEsIHdlIHBvbGwgZmFzdGVyLCB0byBlbnN1cmUgdGhhdAogIC8vIHRoZSBjaGFuZ2UgYXBwZWFycyBvbiB0aGUgc2NyZWVuIHF1aWNrbHkuCiAgZmFzdFBvbGw6IGZ1bmN0aW9uKCkgewogICAgbGV0IG1pc3NlZCA9IGZhbHNlLCBpbnB1dCA9IHRoaXMKICAgIGlucHV0LnBvbGxpbmdGYXN0ID0gdHJ1ZQogICAgZnVuY3Rpb24gcCgpIHsKICAgICAgbGV0IGNoYW5nZWQgPSBpbnB1dC5wb2xsKCkKICAgICAgaWYgKCFjaGFuZ2VkICYmICFtaXNzZWQpIHttaXNzZWQgPSB0cnVlOyBpbnB1dC5wb2xsaW5nLnNldCg2MCwgcCl9CiAgICAgIGVsc2Uge2lucHV0LnBvbGxpbmdGYXN0ID0gZmFsc2U7IGlucHV0LnNsb3dQb2xsKCl9CiAgICB9CiAgICBpbnB1dC5wb2xsaW5nLnNldCgyMCwgcCkKICB9LAoKICAvLyBSZWFkIGlucHV0IGZyb20gdGhlIHRleHRhcmVhLCBhbmQgdXBkYXRlIHRoZSBkb2N1bWVudCB0byBtYXRjaC4KICAvLyBXaGVuIHNvbWV0aGluZyBpcyBzZWxlY3RlZCwgaXQgaXMgcHJlc2VudCBpbiB0aGUgdGV4dGFyZWEsIGFuZAogIC8vIHNlbGVjdGVkICh1bmxlc3MgaXQgaXMgaHVnZSwgaW4gd2hpY2ggY2FzZSBhIHBsYWNlaG9sZGVyIGlzCiAgLy8gdXNlZCkuIFdoZW4gbm90aGluZyBpcyBzZWxlY3RlZCwgdGhlIGN1cnNvciBzaXRzIGFmdGVyIHByZXZpb3VzbHkKICAvLyBzZWVuIHRleHQgKGNhbiBiZSBlbXB0eSksIHdoaWNoIGlzIHN0b3JlZCBpbiBwcmV2SW5wdXQgKHdlIG11c3QKICAvLyBub3QgcmVzZXQgdGhlIHRleHRhcmVhIHdoZW4gdHlwaW5nLCBiZWNhdXNlIHRoYXQgYnJlYWtzIElNRSkuCiAgcG9sbDogZnVuY3Rpb24oKSB7CiAgICBsZXQgY20gPSB0aGlzLmNtLCBpbnB1dCA9IHRoaXMudGV4dGFyZWEsIHByZXZJbnB1dCA9IHRoaXMucHJldklucHV0CiAgICAvLyBTaW5jZSB0aGlzIGlzIGNhbGxlZCBhICpsb3QqLCB0cnkgdG8gYmFpbCBvdXQgYXMgY2hlYXBseSBhcwogICAgLy8gcG9zc2libGUgd2hlbiBpdCBpcyBjbGVhciB0aGF0IG5vdGhpbmcgaGFwcGVuZWQuIGhhc1NlbGVjdGlvbgogICAgLy8gd2lsbCBiZSB0aGUgY2FzZSB3aGVuIHRoZXJlIGlzIGEgbG90IG9mIHRleHQgaW4gdGhlIHRleHRhcmVhLAogICAgLy8gaW4gd2hpY2ggY2FzZSByZWFkaW5nIGl0cyB2YWx1ZSB3b3VsZCBiZSBleHBlbnNpdmUuCiAgICBpZiAodGhpcy5jb250ZXh0TWVudVBlbmRpbmcgfHwgIWNtLnN0YXRlLmZvY3VzZWQgfHwKICAgICAgICAoaGFzU2VsZWN0aW9uKGlucHV0KSAmJiAhcHJldklucHV0ICYmICF0aGlzLmNvbXBvc2luZykgfHwKICAgICAgICBjbS5pc1JlYWRPbmx5KCkgfHwgY20ub3B0aW9ucy5kaXNhYmxlSW5wdXQgfHwgY20uc3RhdGUua2V5U2VxKQogICAgICByZXR1cm4gZmFsc2UKCiAgICBsZXQgdGV4dCA9IGlucHV0LnZhbHVlCiAgICAvLyBJZiBub3RoaW5nIGNoYW5nZWQsIGJhaWwuCiAgICBpZiAodGV4dCA9PSBwcmV2SW5wdXQgJiYgIWNtLnNvbWV0aGluZ1NlbGVjdGVkKCkpIHJldHVybiBmYWxzZQogICAgLy8gV29yayBhcm91bmQgbm9uc2Vuc2ljYWwgc2VsZWN0aW9uIHJlc2V0dGluZyBpbiBJRTkvMTAsIGFuZAogICAgLy8gaW5leHBsaWNhYmxlIGFwcGVhcmFuY2Ugb2YgcHJpdmF0ZSBhcmVhIHVuaWNvZGUgY2hhcmFjdGVycyBvbgogICAgLy8gc29tZSBrZXkgY29tYm9zIGluIE1hYyAoIzI2ODkpLgogICAgaWYgKGllICYmIGllX3ZlcnNpb24gPj0gOSAmJiB0aGlzLmhhc1NlbGVjdGlvbiA9PT0gdGV4dCB8fAogICAgICAgIG1hYyAmJiAvW1x1ZjcwMC1cdWY3ZmZdLy50ZXN0KHRleHQpKSB7CiAgICAgIGNtLmRpc3BsYXkuaW5wdXQucmVzZXQoKQogICAgICByZXR1cm4gZmFsc2UKICAgIH0KCiAgICBpZiAoY20uZG9jLnNlbCA9PSBjbS5kaXNwbGF5LnNlbEZvckNvbnRleHRNZW51KSB7CiAgICAgIGxldCBmaXJzdCA9IHRleHQuY2hhckNvZGVBdCgwKQogICAgICBpZiAoZmlyc3QgPT0gMHgyMDBiICYmICFwcmV2SW5wdXQpIHByZXZJbnB1dCA9ICJcdTIwMGIiCiAgICAgIGlmIChmaXJzdCA9PSAweDIxZGEpIHsgdGhpcy5yZXNldCgpOyByZXR1cm4gdGhpcy5jbS5leGVjQ29tbWFuZCgidW5kbyIpIH0KICAgIH0KICAgIC8vIEZpbmQgdGhlIHBhcnQgb2YgdGhlIGlucHV0IHRoYXQgaXMgYWN0dWFsbHkgbmV3CiAgICBsZXQgc2FtZSA9IDAsIGwgPSBNYXRoLm1pbihwcmV2SW5wdXQubGVuZ3RoLCB0ZXh0Lmxlbmd0aCkKICAgIHdoaWxlIChzYW1lIDwgbCAmJiBwcmV2SW5wdXQuY2hhckNvZGVBdChzYW1lKSA9PSB0ZXh0LmNoYXJDb2RlQXQoc2FtZSkpICsrc2FtZQoKICAgIHJ1bkluT3AoY20sICgpID0+IHsKICAgICAgYXBwbHlUZXh0SW5wdXQoY20sIHRleHQuc2xpY2Uoc2FtZSksIHByZXZJbnB1dC5sZW5ndGggLSBzYW1lLAogICAgICAgICAgICAgICAgICAgICBudWxsLCB0aGlzLmNvbXBvc2luZyA/ICIqY29tcG9zZSIgOiBudWxsKQoKICAgICAgLy8gRG9uJ3QgbGVhdmUgbG9uZyB0ZXh0IGluIHRoZSB0ZXh0YXJlYSwgc2luY2UgaXQgbWFrZXMgZnVydGhlciBwb2xsaW5nIHNsb3cKICAgICAgaWYgKHRleHQubGVuZ3RoID4gMTAwMCB8fCB0ZXh0LmluZGV4T2YoIlxuIikgPiAtMSkgaW5wdXQudmFsdWUgPSB0aGlzLnByZXZJbnB1dCA9ICIiCiAgICAgIGVsc2UgdGhpcy5wcmV2SW5wdXQgPSB0ZXh0CgogICAgICBpZiAodGhpcy5jb21wb3NpbmcpIHsKICAgICAgICB0aGlzLmNvbXBvc2luZy5yYW5nZS5jbGVhcigpCiAgICAgICAgdGhpcy5jb21wb3NpbmcucmFuZ2UgPSBjbS5tYXJrVGV4dCh0aGlzLmNvbXBvc2luZy5zdGFydCwgY20uZ2V0Q3Vyc29yKCJ0byIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogIkNvZGVNaXJyb3ItY29tcG9zaW5nIn0pCiAgICAgIH0KICAgIH0pCiAgICByZXR1cm4gdHJ1ZQogIH0sCgogIGVuc3VyZVBvbGxlZDogZnVuY3Rpb24oKSB7CiAgICBpZiAodGhpcy5wb2xsaW5nRmFzdCAmJiB0aGlzLnBvbGwoKSkgdGhpcy5wb2xsaW5nRmFzdCA9IGZhbHNlCiAgfSwKCiAgb25LZXlQcmVzczogZnVuY3Rpb24oKSB7CiAgICBpZiAoaWUgJiYgaWVfdmVyc2lvbiA+PSA5KSB0aGlzLmhhc1NlbGVjdGlvbiA9IG51bGwKICAgIHRoaXMuZmFzdFBvbGwoKQogIH0sCgogIG9uQ29udGV4dE1lbnU6IGZ1bmN0aW9uKGUpIHsKICAgIGxldCBpbnB1dCA9IHRoaXMsIGNtID0gaW5wdXQuY20sIGRpc3BsYXkgPSBjbS5kaXNwbGF5LCB0ZSA9IGlucHV0LnRleHRhcmVhCiAgICBsZXQgcG9zID0gcG9zRnJvbU1vdXNlKGNtLCBlKSwgc2Nyb2xsUG9zID0gZGlzcGxheS5zY3JvbGxlci5zY3JvbGxUb3AKICAgIGlmICghcG9zIHx8IHByZXN0bykgcmV0dXJuIC8vIE9wZXJhIGlzIGRpZmZpY3VsdC4KCiAgICAvLyBSZXNldCB0aGUgY3VycmVudCB0ZXh0IHNlbGVjdGlvbiBvbmx5IGlmIHRoZSBjbGljayBpcyBkb25lIG91dHNpZGUgb2YgdGhlIHNlbGVjdGlvbgogICAgLy8gYW5kICdyZXNldFNlbGVjdGlvbk9uQ29udGV4dE1lbnUnIG9wdGlvbiBpcyB0cnVlLgogICAgbGV0IHJlc2V0ID0gY20ub3B0aW9ucy5yZXNldFNlbGVjdGlvbk9uQ29udGV4dE1lbnUKICAgIGlmIChyZXNldCAmJiBjbS5kb2Muc2VsLmNvbnRhaW5zKHBvcykgPT0gLTEpCiAgICAgIG9wZXJhdGlvbihjbSwgc2V0U2VsZWN0aW9uKShjbS5kb2MsIHNpbXBsZVNlbGVjdGlvbihwb3MpLCBzZWxfZG9udFNjcm9sbCkKCiAgICBsZXQgb2xkQ1NTID0gdGUuc3R5bGUuY3NzVGV4dCwgb2xkV3JhcHBlckNTUyA9IGlucHV0LndyYXBwZXIuc3R5bGUuY3NzVGV4dAogICAgaW5wdXQud3JhcHBlci5zdHlsZS5jc3NUZXh0ID0gInBvc2l0aW9uOiBhYnNvbHV0ZSIKICAgIGxldCB3cmFwcGVyQm94ID0gaW5wdXQud3JhcHBlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKQogICAgdGUuc3R5bGUuY3NzVGV4dCA9IGBwb3NpdGlvbjogYWJzb2x1dGU7IHdpZHRoOiAzMHB4OyBoZWlnaHQ6IDMwcHg7CiAgICAgIHRvcDogJHtlLmNsaWVudFkgLSB3cmFwcGVyQm94LnRvcCAtIDV9cHg7IGxlZnQ6ICR7ZS5jbGllbnRYIC0gd3JhcHBlckJveC5sZWZ0IC0gNX1weDsKICAgICAgei1pbmRleDogMTAwMDsgYmFja2dyb3VuZDogJHtpZSA/ICJyZ2JhKDI1NSwgMjU1LCAyNTUsIC4wNSkiIDogInRyYW5zcGFyZW50In07CiAgICAgIG91dGxpbmU6IG5vbmU7IGJvcmRlci13aWR0aDogMDsgb3V0bGluZTogbm9uZTsgb3ZlcmZsb3c6IGhpZGRlbjsgb3BhY2l0eTogLjA1OyBmaWx0ZXI6IGFscGhhKG9wYWNpdHk9NSk7YAogICAgbGV0IG9sZFNjcm9sbFkKICAgIGlmICh3ZWJraXQpIG9sZFNjcm9sbFkgPSB3aW5kb3cuc2Nyb2xsWSAvLyBXb3JrIGFyb3VuZCBDaHJvbWUgaXNzdWUgKCMyNzEyKQogICAgZGlzcGxheS5pbnB1dC5mb2N1cygpCiAgICBpZiAod2Via2l0KSB3aW5kb3cuc2Nyb2xsVG8obnVsbCwgb2xkU2Nyb2xsWSkKICAgIGRpc3BsYXkuaW5wdXQucmVzZXQoKQogICAgLy8gQWRkcyAiU2VsZWN0IGFsbCIgdG8gY29udGV4dCBtZW51IGluIEZGCiAgICBpZiAoIWNtLnNvbWV0aGluZ1NlbGVjdGVkKCkpIHRlLnZhbHVlID0gaW5wdXQucHJldklucHV0ID0gIiAiCiAgICBpbnB1dC5jb250ZXh0TWVudVBlbmRpbmcgPSB0cnVlCiAgICBkaXNwbGF5LnNlbEZvckNvbnRleHRNZW51ID0gY20uZG9jLnNlbAogICAgY2xlYXJUaW1lb3V0KGRpc3BsYXkuZGV0ZWN0aW5nU2VsZWN0QWxsKQoKICAgIC8vIFNlbGVjdC1hbGwgd2lsbCBiZSBncmV5ZWQgb3V0IGlmIHRoZXJlJ3Mgbm90aGluZyB0byBzZWxlY3QsIHNvCiAgICAvLyB0aGlzIGFkZHMgYSB6ZXJvLXdpZHRoIHNwYWNlIHNvIHRoYXQgd2UgY2FuIGxhdGVyIGNoZWNrIHdoZXRoZXIKICAgIC8vIGl0IGdvdCBzZWxlY3RlZC4KICAgIGZ1bmN0aW9uIHByZXBhcmVTZWxlY3RBbGxIYWNrKCkgewogICAgICBpZiAodGUuc2VsZWN0aW9uU3RhcnQgIT0gbnVsbCkgewogICAgICAgIGxldCBzZWxlY3RlZCA9IGNtLnNvbWV0aGluZ1NlbGVjdGVkKCkKICAgICAgICBsZXQgZXh0dmFsID0gIlx1MjAwYiIgKyAoc2VsZWN0ZWQgPyB0ZS52YWx1ZSA6ICIiKQogICAgICAgIHRlLnZhbHVlID0gIlx1MjFkYSIgLy8gVXNlZCB0byBjYXRjaCBjb250ZXh0LW1lbnUgdW5kbwogICAgICAgIHRlLnZhbHVlID0gZXh0dmFsCiAgICAgICAgaW5wdXQucHJldklucHV0ID0gc2VsZWN0ZWQgPyAiIiA6ICJcdTIwMGIiCiAgICAgICAgdGUuc2VsZWN0aW9uU3RhcnQgPSAxOyB0ZS5zZWxlY3Rpb25FbmQgPSBleHR2YWwubGVuZ3RoCiAgICAgICAgLy8gUmUtc2V0IHRoaXMsIGluIGNhc2Ugc29tZSBvdGhlciBoYW5kbGVyIHRvdWNoZWQgdGhlCiAgICAgICAgLy8gc2VsZWN0aW9uIGluIHRoZSBtZWFudGltZS4KICAgICAgICBkaXNwbGF5LnNlbEZvckNvbnRleHRNZW51ID0gY20uZG9jLnNlbAogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiByZWhpZGUoKSB7CiAgICAgIGlucHV0LmNvbnRleHRNZW51UGVuZGluZyA9IGZhbHNlCiAgICAgIGlucHV0LndyYXBwZXIuc3R5bGUuY3NzVGV4dCA9IG9sZFdyYXBwZXJDU1MKICAgICAgdGUuc3R5bGUuY3NzVGV4dCA9IG9sZENTUwogICAgICBpZiAoaWUgJiYgaWVfdmVyc2lvbiA8IDkpIGRpc3BsYXkuc2Nyb2xsYmFycy5zZXRTY3JvbGxUb3AoZGlzcGxheS5zY3JvbGxlci5zY3JvbGxUb3AgPSBzY3JvbGxQb3MpCgogICAgICAvLyBUcnkgdG8gZGV0ZWN0IHRoZSB1c2VyIGNob29zaW5nIHNlbGVjdC1hbGwKICAgICAgaWYgKHRlLnNlbGVjdGlvblN0YXJ0ICE9IG51bGwpIHsKICAgICAgICBpZiAoIWllIHx8IChpZSAmJiBpZV92ZXJzaW9uIDwgOSkpIHByZXBhcmVTZWxlY3RBbGxIYWNrKCkKICAgICAgICBsZXQgaSA9IDAsIHBvbGwgPSAoKSA9PiB7CiAgICAgICAgICBpZiAoZGlzcGxheS5zZWxGb3JDb250ZXh0TWVudSA9PSBjbS5kb2Muc2VsICYmIHRlLnNlbGVjdGlvblN0YXJ0ID09IDAgJiYKICAgICAgICAgICAgICB0ZS5zZWxlY3Rpb25FbmQgPiAwICYmIGlucHV0LnByZXZJbnB1dCA9PSAiXHUyMDBiIikKICAgICAgICAgICAgb3BlcmF0aW9uKGNtLCBzZWxlY3RBbGwpKGNtKQogICAgICAgICAgZWxzZSBpZiAoaSsrIDwgMTApIGRpc3BsYXkuZGV0ZWN0aW5nU2VsZWN0QWxsID0gc2V0VGltZW91dChwb2xsLCA1MDApCiAgICAgICAgICBlbHNlIGRpc3BsYXkuaW5wdXQucmVzZXQoKQogICAgICAgIH0KICAgICAgICBkaXNwbGF5LmRldGVjdGluZ1NlbGVjdEFsbCA9IHNldFRpbWVvdXQocG9sbCwgMjAwKQogICAgICB9CiAgICB9CgogICAgaWYgKGllICYmIGllX3ZlcnNpb24gPj0gOSkgcHJlcGFyZVNlbGVjdEFsbEhhY2soKQogICAgaWYgKGNhcHR1cmVSaWdodENsaWNrKSB7CiAgICAgIGVfc3RvcChlKQogICAgICBsZXQgbW91c2V1cCA9ICgpID0+IHsKICAgICAgICBvZmYod2luZG93LCAibW91c2V1cCIsIG1vdXNldXApCiAgICAgICAgc2V0VGltZW91dChyZWhpZGUsIDIwKQogICAgICB9CiAgICAgIG9uKHdpbmRvdywgIm1vdXNldXAiLCBtb3VzZXVwKQogICAgfSBlbHNlIHsKICAgICAgc2V0VGltZW91dChyZWhpZGUsIDUwKQogICAgfQogIH0sCgogIHJlYWRPbmx5Q2hhbmdlZDogZnVuY3Rpb24odmFsKSB7CiAgICBpZiAoIXZhbCkgdGhpcy5yZXNldCgpCiAgfSwKCiAgc2V0VW5lZGl0YWJsZTogbm90aGluZywKCiAgbmVlZHNDb250ZW50QXR0cmlidXRlOiBmYWxzZQp9LCBUZXh0YXJlYUlucHV0LnByb3RvdHlwZSkK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/src/line/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/src/line/highlight.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aW1wb3J0IHsgY291bnRDb2x1bW4gfSBmcm9tICIuLi91dGlsL21pc2MiCmltcG9ydCB7IGNvcHlTdGF0ZSwgaW5uZXJNb2RlLCBzdGFydFN0YXRlIH0gZnJvbSAiLi4vbW9kZXMiCmltcG9ydCBTdHJpbmdTdHJlYW0gZnJvbSAiLi4vdXRpbC9TdHJpbmdTdHJlYW0iCgppbXBvcnQgeyBnZXRMaW5lLCBsaW5lTm8gfSBmcm9tICIuL3V0aWxzX2xpbmUiCmltcG9ydCB7IGNsaXBQb3MgfSBmcm9tICIuL3BvcyIKCi8vIENvbXB1dGUgYSBzdHlsZSBhcnJheSAoYW4gYXJyYXkgc3RhcnRpbmcgd2l0aCBhIG1vZGUgZ2VuZXJhdGlvbgovLyAtLSBmb3IgaW52YWxpZGF0aW9uIC0tIGZvbGxvd2VkIGJ5IHBhaXJzIG9mIGVuZCBwb3NpdGlvbnMgYW5kCi8vIHN0eWxlIHN0cmluZ3MpLCB3aGljaCBpcyB1c2VkIHRvIGhpZ2hsaWdodCB0aGUgdG9rZW5zIG9uIHRoZQovLyBsaW5lLgpleHBvcnQgZnVuY3Rpb24gaGlnaGxpZ2h0TGluZShjbSwgbGluZSwgc3RhdGUsIGZvcmNlVG9FbmQpIHsKICAvLyBBIHN0eWxlcyBhcnJheSBhbHdheXMgc3RhcnRzIHdpdGggYSBudW1iZXIgaWRlbnRpZnlpbmcgdGhlCiAgLy8gbW9kZS9vdmVybGF5cyB0aGF0IGl0IGlzIGJhc2VkIG9uIChmb3IgZWFzeSBpbnZhbGlkYXRpb24pLgogIGxldCBzdCA9IFtjbS5zdGF0ZS5tb2RlR2VuXSwgbGluZUNsYXNzZXMgPSB7fQogIC8vIENvbXB1dGUgdGhlIGJhc2UgYXJyYXkgb2Ygc3R5bGVzCiAgcnVuTW9kZShjbSwgbGluZS50ZXh0LCBjbS5kb2MubW9kZSwgc3RhdGUsIChlbmQsIHN0eWxlKSA9PiBzdC5wdXNoKGVuZCwgc3R5bGUpLAogICAgbGluZUNsYXNzZXMsIGZvcmNlVG9FbmQpCgogIC8vIFJ1biBvdmVybGF5cywgYWRqdXN0IHN0eWxlIGFycmF5LgogIGZvciAobGV0IG8gPSAwOyBvIDwgY20uc3RhdGUub3ZlcmxheXMubGVuZ3RoOyArK28pIHsKICAgIGxldCBvdmVybGF5ID0gY20uc3RhdGUub3ZlcmxheXNbb10sIGkgPSAxLCBhdCA9IDAKICAgIHJ1bk1vZGUoY20sIGxpbmUudGV4dCwgb3ZlcmxheS5tb2RlLCB0cnVlLCAoZW5kLCBzdHlsZSkgPT4gewogICAgICBsZXQgc3RhcnQgPSBpCiAgICAgIC8vIEVuc3VyZSB0aGVyZSdzIGEgdG9rZW4gZW5kIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uLCBhbmQgdGhhdCBpIHBvaW50cyBhdCBpdAogICAgICB3aGlsZSAoYXQgPCBlbmQpIHsKICAgICAgICBsZXQgaV9lbmQgPSBzdFtpXQogICAgICAgIGlmIChpX2VuZCA+IGVuZCkKICAgICAgICAgIHN0LnNwbGljZShpLCAxLCBlbmQsIHN0W2krMV0sIGlfZW5kKQogICAgICAgIGkgKz0gMgogICAgICAgIGF0ID0gTWF0aC5taW4oZW5kLCBpX2VuZCkKICAgICAgfQogICAgICBpZiAoIXN0eWxlKSByZXR1cm4KICAgICAgaWYgKG92ZXJsYXkub3BhcXVlKSB7CiAgICAgICAgc3Quc3BsaWNlKHN0YXJ0LCBpIC0gc3RhcnQsIGVuZCwgIm92ZXJsYXkgIiArIHN0eWxlKQogICAgICAgIGkgPSBzdGFydCArIDIKICAgICAgfSBlbHNlIHsKICAgICAgICBmb3IgKDsgc3RhcnQgPCBpOyBzdGFydCArPSAyKSB7CiAgICAgICAgICBsZXQgY3VyID0gc3Rbc3RhcnQrMV0KICAgICAgICAgIHN0W3N0YXJ0KzFdID0gKGN1ciA/IGN1ciArICIgIiA6ICIiKSArICJvdmVybGF5ICIgKyBzdHlsZQogICAgICAgIH0KICAgICAgfQogICAgfSwgbGluZUNsYXNzZXMpCiAgfQoKICByZXR1cm4ge3N0eWxlczogc3QsIGNsYXNzZXM6IGxpbmVDbGFzc2VzLmJnQ2xhc3MgfHwgbGluZUNsYXNzZXMudGV4dENsYXNzID8gbGluZUNsYXNzZXMgOiBudWxsfQp9CgpleHBvcnQgZnVuY3Rpb24gZ2V0TGluZVN0eWxlcyhjbSwgbGluZSwgdXBkYXRlRnJvbnRpZXIpIHsKICBpZiAoIWxpbmUuc3R5bGVzIHx8IGxpbmUuc3R5bGVzWzBdICE9IGNtLnN0YXRlLm1vZGVHZW4pIHsKICAgIGxldCBzdGF0ZSA9IGdldFN0YXRlQmVmb3JlKGNtLCBsaW5lTm8obGluZSkpCiAgICBsZXQgcmVzdWx0ID0gaGlnaGxpZ2h0TGluZShjbSwgbGluZSwgbGluZS50ZXh0Lmxlbmd0aCA+IGNtLm9wdGlvbnMubWF4SGlnaGxpZ2h0TGVuZ3RoID8gY29weVN0YXRlKGNtLmRvYy5tb2RlLCBzdGF0ZSkgOiBzdGF0ZSkKICAgIGxpbmUuc3RhdGVBZnRlciA9IHN0YXRlCiAgICBsaW5lLnN0eWxlcyA9IHJlc3VsdC5zdHlsZXMKICAgIGlmIChyZXN1bHQuY2xhc3NlcykgbGluZS5zdHlsZUNsYXNzZXMgPSByZXN1bHQuY2xhc3NlcwogICAgZWxzZSBpZiAobGluZS5zdHlsZUNsYXNzZXMpIGxpbmUuc3R5bGVDbGFzc2VzID0gbnVsbAogICAgaWYgKHVwZGF0ZUZyb250aWVyID09PSBjbS5kb2MuZnJvbnRpZXIpIGNtLmRvYy5mcm9udGllcisrCiAgfQogIHJldHVybiBsaW5lLnN0eWxlcwp9CgpleHBvcnQgZnVuY3Rpb24gZ2V0U3RhdGVCZWZvcmUoY20sIG4sIHByZWNpc2UpIHsKICBsZXQgZG9jID0gY20uZG9jLCBkaXNwbGF5ID0gY20uZGlzcGxheQogIGlmICghZG9jLm1vZGUuc3RhcnRTdGF0ZSkgcmV0dXJuIHRydWUKICBsZXQgcG9zID0gZmluZFN0YXJ0TGluZShjbSwgbiwgcHJlY2lzZSksIHN0YXRlID0gcG9zID4gZG9jLmZpcnN0ICYmIGdldExpbmUoZG9jLCBwb3MtMSkuc3RhdGVBZnRlcgogIGlmICghc3RhdGUpIHN0YXRlID0gc3RhcnRTdGF0ZShkb2MubW9kZSkKICBlbHNlIHN0YXRlID0gY29weVN0YXRlKGRvYy5tb2RlLCBzdGF0ZSkKICBkb2MuaXRlcihwb3MsIG4sIGxpbmUgPT4gewogICAgcHJvY2Vzc0xpbmUoY20sIGxpbmUudGV4dCwgc3RhdGUpCiAgICBsZXQgc2F2ZSA9IHBvcyA9PSBuIC0gMSB8fCBwb3MgJSA1ID09IDAgfHwgcG9zID49IGRpc3BsYXkudmlld0Zyb20gJiYgcG9zIDwgZGlzcGxheS52aWV3VG8KICAgIGxpbmUuc3RhdGVBZnRlciA9IHNhdmUgPyBjb3B5U3RhdGUoZG9jLm1vZGUsIHN0YXRlKSA6IG51bGwKICAgICsrcG9zCiAgfSkKICBpZiAocHJlY2lzZSkgZG9jLmZyb250aWVyID0gcG9zCiAgcmV0dXJuIHN0YXRlCn0KCi8vIExpZ2h0d2VpZ2h0IGZvcm0gb2YgaGlnaGxpZ2h0IC0tIHByb2NlZWQgb3ZlciB0aGlzIGxpbmUgYW5kCi8vIHVwZGF0ZSBzdGF0ZSwgYnV0IGRvbid0IHNhdmUgYSBzdHlsZSBhcnJheS4gVXNlZCBmb3IgbGluZXMgdGhhdAovLyBhcmVuJ3QgY3VycmVudGx5IHZpc2libGUuCmV4cG9ydCBmdW5jdGlvbiBwcm9jZXNzTGluZShjbSwgdGV4dCwgc3RhdGUsIHN0YXJ0QXQpIHsKICBsZXQgbW9kZSA9IGNtLmRvYy5tb2RlCiAgbGV0IHN0cmVhbSA9IG5ldyBTdHJpbmdTdHJlYW0odGV4dCwgY20ub3B0aW9ucy50YWJTaXplKQogIHN0cmVhbS5zdGFydCA9IHN0cmVhbS5wb3MgPSBzdGFydEF0IHx8IDAKICBpZiAodGV4dCA9PSAiIikgY2FsbEJsYW5rTGluZShtb2RlLCBzdGF0ZSkKICB3aGlsZSAoIXN0cmVhbS5lb2woKSkgewogICAgcmVhZFRva2VuKG1vZGUsIHN0cmVhbSwgc3RhdGUpCiAgICBzdHJlYW0uc3RhcnQgPSBzdHJlYW0ucG9zCiAgfQp9CgpmdW5jdGlvbiBjYWxsQmxhbmtMaW5lKG1vZGUsIHN0YXRlKSB7CiAgaWYgKG1vZGUuYmxhbmtMaW5lKSByZXR1cm4gbW9kZS5ibGFua0xpbmUoc3RhdGUpCiAgaWYgKCFtb2RlLmlubmVyTW9kZSkgcmV0dXJuCiAgbGV0IGlubmVyID0gaW5uZXJNb2RlKG1vZGUsIHN0YXRlKQogIGlmIChpbm5lci5tb2RlLmJsYW5rTGluZSkgcmV0dXJuIGlubmVyLm1vZGUuYmxhbmtMaW5lKGlubmVyLnN0YXRlKQp9CgpleHBvcnQgZnVuY3Rpb24gcmVhZFRva2VuKG1vZGUsIHN0cmVhbSwgc3RhdGUsIGlubmVyKSB7CiAgZm9yIChsZXQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7CiAgICBpZiAoaW5uZXIpIGlubmVyWzBdID0gaW5uZXJNb2RlKG1vZGUsIHN0YXRlKS5tb2RlCiAgICBsZXQgc3R5bGUgPSBtb2RlLnRva2VuKHN0cmVhbSwgc3RhdGUpCiAgICBpZiAoc3RyZWFtLnBvcyA+IHN0cmVhbS5zdGFydCkgcmV0dXJuIHN0eWxlCiAgfQogIHRocm93IG5ldyBFcnJvcigiTW9kZSAiICsgbW9kZS5uYW1lICsgIiBmYWlsZWQgdG8gYWR2YW5jZSBzdHJlYW0uIikKfQoKLy8gVXRpbGl0eSBmb3IgZ2V0VG9rZW5BdCBhbmQgZ2V0TGluZVRva2VucwpleHBvcnQgZnVuY3Rpb24gdGFrZVRva2VuKGNtLCBwb3MsIHByZWNpc2UsIGFzQXJyYXkpIHsKICBsZXQgZ2V0T2JqID0gY29weSA9PiAoewogICAgc3RhcnQ6IHN0cmVhbS5zdGFydCwgZW5kOiBzdHJlYW0ucG9zLAogICAgc3RyaW5nOiBzdHJlYW0uY3VycmVudCgpLAogICAgdHlwZTogc3R5bGUgfHwgbnVsbCwKICAgIHN0YXRlOiBjb3B5ID8gY29weVN0YXRlKGRvYy5tb2RlLCBzdGF0ZSkgOiBzdGF0ZQogIH0pCgogIGxldCBkb2MgPSBjbS5kb2MsIG1vZGUgPSBkb2MubW9kZSwgc3R5bGUKICBwb3MgPSBjbGlwUG9zKGRvYywgcG9zKQogIGxldCBsaW5lID0gZ2V0TGluZShkb2MsIHBvcy5saW5lKSwgc3RhdGUgPSBnZXRTdGF0ZUJlZm9yZShjbSwgcG9zLmxpbmUsIHByZWNpc2UpCiAgbGV0IHN0cmVhbSA9IG5ldyBTdHJpbmdTdHJlYW0obGluZS50ZXh0LCBjbS5vcHRpb25zLnRhYlNpemUpLCB0b2tlbnMKICBpZiAoYXNBcnJheSkgdG9rZW5zID0gW10KICB3aGlsZSAoKGFzQXJyYXkgfHwgc3RyZWFtLnBvcyA8IHBvcy5jaCkgJiYgIXN0cmVhbS5lb2woKSkgewogICAgc3RyZWFtLnN0YXJ0ID0gc3RyZWFtLnBvcwogICAgc3R5bGUgPSByZWFkVG9rZW4obW9kZSwgc3RyZWFtLCBzdGF0ZSkKICAgIGlmIChhc0FycmF5KSB0b2tlbnMucHVzaChnZXRPYmoodHJ1ZSkpCiAgfQogIHJldHVybiBhc0FycmF5ID8gdG9rZW5zIDogZ2V0T2JqKCkKfQoKZnVuY3Rpb24gZXh0cmFjdExpbmVDbGFzc2VzKHR5cGUsIG91dHB1dCkgewogIGlmICh0eXBlKSBmb3IgKDs7KSB7CiAgICBsZXQgbGluZUNsYXNzID0gdHlwZS5tYXRjaCgvKD86XnxccyspbGluZS0oYmFja2dyb3VuZC0pPyhcUyspLykKICAgIGlmICghbGluZUNsYXNzKSBicmVhawogICAgdHlwZSA9IHR5cGUuc2xpY2UoMCwgbGluZUNsYXNzLmluZGV4KSArIHR5cGUuc2xpY2UobGluZUNsYXNzLmluZGV4ICsgbGluZUNsYXNzWzBdLmxlbmd0aCkKICAgIGxldCBwcm9wID0gbGluZUNsYXNzWzFdID8gImJnQ2xhc3MiIDogInRleHRDbGFzcyIKICAgIGlmIChvdXRwdXRbcHJvcF0gPT0gbnVsbCkKICAgICAgb3V0cHV0W3Byb3BdID0gbGluZUNsYXNzWzJdCiAgICBlbHNlIGlmICghKG5ldyBSZWdFeHAoIig/Ol58XHMpIiArIGxpbmVDbGFzc1syXSArICIoPzokfFxzKSIpKS50ZXN0KG91dHB1dFtwcm9wXSkpCiAgICAgIG91dHB1dFtwcm9wXSArPSAiICIgKyBsaW5lQ2xhc3NbMl0KICB9CiAgcmV0dXJuIHR5cGUKfQoKLy8gUnVuIHRoZSBnaXZlbiBtb2RlJ3MgcGFyc2VyIG92ZXIgYSBsaW5lLCBjYWxsaW5nIGYgZm9yIGVhY2ggdG9rZW4uCmZ1bmN0aW9uIHJ1bk1vZGUoY20sIHRleHQsIG1vZGUsIHN0YXRlLCBmLCBsaW5lQ2xhc3NlcywgZm9yY2VUb0VuZCkgewogIGxldCBmbGF0dGVuU3BhbnMgPSBtb2RlLmZsYXR0ZW5TcGFucwogIGlmIChmbGF0dGVuU3BhbnMgPT0gbnVsbCkgZmxhdHRlblNwYW5zID0gY20ub3B0aW9ucy5mbGF0dGVuU3BhbnMKICBsZXQgY3VyU3RhcnQgPSAwLCBjdXJTdHlsZSA9IG51bGwKICBsZXQgc3RyZWFtID0gbmV3IFN0cmluZ1N0cmVhbSh0ZXh0LCBjbS5vcHRpb25zLnRhYlNpemUpLCBzdHlsZQogIGxldCBpbm5lciA9IGNtLm9wdGlvbnMuYWRkTW9kZUNsYXNzICYmIFtudWxsXQogIGlmICh0ZXh0ID09ICIiKSBleHRyYWN0TGluZUNsYXNzZXMoY2FsbEJsYW5rTGluZShtb2RlLCBzdGF0ZSksIGxpbmVDbGFzc2VzKQogIHdoaWxlICghc3RyZWFtLmVvbCgpKSB7CiAgICBpZiAoc3RyZWFtLnBvcyA+IGNtLm9wdGlvbnMubWF4SGlnaGxpZ2h0TGVuZ3RoKSB7CiAgICAgIGZsYXR0ZW5TcGFucyA9IGZhbHNlCiAgICAgIGlmIChmb3JjZVRvRW5kKSBwcm9jZXNzTGluZShjbSwgdGV4dCwgc3RhdGUsIHN0cmVhbS5wb3MpCiAgICAgIHN0cmVhbS5wb3MgPSB0ZXh0Lmxlbmd0aAogICAgICBzdHlsZSA9IG51bGwKICAgIH0gZWxzZSB7CiAgICAgIHN0eWxlID0gZXh0cmFjdExpbmVDbGFzc2VzKHJlYWRUb2tlbihtb2RlLCBzdHJlYW0sIHN0YXRlLCBpbm5lciksIGxpbmVDbGFzc2VzKQogICAgfQogICAgaWYgKGlubmVyKSB7CiAgICAgIGxldCBtTmFtZSA9IGlubmVyWzBdLm5hbWUKICAgICAgaWYgKG1OYW1lKSBzdHlsZSA9ICJtLSIgKyAoc3R5bGUgPyBtTmFtZSArICIgIiArIHN0eWxlIDogbU5hbWUpCiAgICB9CiAgICBpZiAoIWZsYXR0ZW5TcGFucyB8fCBjdXJTdHlsZSAhPSBzdHlsZSkgewogICAgICB3aGlsZSAoY3VyU3RhcnQgPCBzdHJlYW0uc3RhcnQpIHsKICAgICAgICBjdXJTdGFydCA9IE1hdGgubWluKHN0cmVhbS5zdGFydCwgY3VyU3RhcnQgKyA1MDAwKQogICAgICAgIGYoY3VyU3RhcnQsIGN1clN0eWxlKQogICAgICB9CiAgICAgIGN1clN0eWxlID0gc3R5bGUKICAgIH0KICAgIHN0cmVhbS5zdGFydCA9IHN0cmVhbS5wb3MKICB9CiAgd2hpbGUgKGN1clN0YXJ0IDwgc3RyZWFtLnBvcykgewogICAgLy8gV2Via2l0IHNlZW1zIHRvIHJlZnVzZSB0byByZW5kZXIgdGV4dCBub2RlcyBsb25nZXIgdGhhbiA1NzQ0NAogICAgLy8gY2hhcmFjdGVycywgYW5kIHJldHVybnMgaW5hY2N1cmF0ZSBtZWFzdXJlbWVudHMgaW4gbm9kZXMKICAgIC8vIHN0YXJ0aW5nIGFyb3VuZCA1MDAwIGNoYXJzLgogICAgbGV0IHBvcyA9IE1hdGgubWluKHN0cmVhbS5wb3MsIGN1clN0YXJ0ICsgNTAwMCkKICAgIGYocG9zLCBjdXJTdHlsZSkKICAgIGN1clN0YXJ0ID0gcG9zCiAgfQp9CgovLyBGaW5kcyB0aGUgbGluZSB0byBzdGFydCB3aXRoIHdoZW4gc3RhcnRpbmcgYSBwYXJzZS4gVHJpZXMgdG8KLy8gZmluZCBhIGxpbmUgd2l0aCBhIHN0YXRlQWZ0ZXIsIHNvIHRoYXQgaXQgY2FuIHN0YXJ0IHdpdGggYQovLyB2YWxpZCBzdGF0ZS4gSWYgdGhhdCBmYWlscywgaXQgcmV0dXJucyB0aGUgbGluZSB3aXRoIHRoZQovLyBzbWFsbGVzdCBpbmRlbnRhdGlvbiwgd2hpY2ggdGVuZHMgdG8gbmVlZCB0aGUgbGVhc3QgY29udGV4dCB0bwovLyBwYXJzZSBjb3JyZWN0bHkuCmZ1bmN0aW9uIGZpbmRTdGFydExpbmUoY20sIG4sIHByZWNpc2UpIHsKICBsZXQgbWluaW5kZW50LCBtaW5saW5lLCBkb2MgPSBjbS5kb2MKICBsZXQgbGltID0gcHJlY2lzZSA/IC0xIDogbiAtIChjbS5kb2MubW9kZS5pbm5lck1vZGUgPyAxMDAwIDogMTAwKQogIGZvciAobGV0IHNlYXJjaCA9IG47IHNlYXJjaCA+IGxpbTsgLS1zZWFyY2gpIHsKICAgIGlmIChzZWFyY2ggPD0gZG9jLmZpcnN0KSByZXR1cm4gZG9jLmZpcnN0CiAgICBsZXQgbGluZSA9IGdldExpbmUoZG9jLCBzZWFyY2ggLSAxKQogICAgaWYgKGxpbmUuc3RhdGVBZnRlciAmJiAoIXByZWNpc2UgfHwgc2VhcmNoIDw9IGRvYy5mcm9udGllcikpIHJldHVybiBzZWFyY2gKICAgIGxldCBpbmRlbnRlZCA9IGNvdW50Q29sdW1uKGxpbmUudGV4dCwgbnVsbCwgY20ub3B0aW9ucy50YWJTaXplKQogICAgaWYgKG1pbmxpbmUgPT0gbnVsbCB8fCBtaW5pbmRlbnQgPiBpbmRlbnRlZCkgewogICAgICBtaW5saW5lID0gc2VhcmNoIC0gMQogICAgICBtaW5pbmRlbnQgPSBpbmRlbnRlZAogICAgfQogIH0KICByZXR1cm4gbWlubGluZQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/src/line/line_data.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aW1wb3J0IHsgZ2V0T3JkZXIgfSBmcm9tICIuLi91dGlsL2JpZGkiCmltcG9ydCB7IGllLCBpZV92ZXJzaW9uLCB3ZWJraXQgfSBmcm9tICIuLi91dGlsL2Jyb3dzZXIiCmltcG9ydCB7IGVsdCwgam9pbkNsYXNzZXMgfSBmcm9tICIuLi91dGlsL2RvbSIKaW1wb3J0IHsgZXZlbnRNaXhpbiwgc2lnbmFsIH0gZnJvbSAiLi4vdXRpbC9ldmVudCIKaW1wb3J0IHsgaGFzQmFkQmlkaVJlY3RzLCB6ZXJvV2lkdGhFbGVtZW50IH0gZnJvbSAiLi4vdXRpbC9mZWF0dXJlX2RldGVjdGlvbiIKaW1wb3J0IHsgbHN0LCBzcGFjZVN0ciB9IGZyb20gIi4uL3V0aWwvbWlzYyIKCmltcG9ydCB7IGdldExpbmVTdHlsZXMgfSBmcm9tICIuL2hpZ2hsaWdodCIKaW1wb3J0IHsgYXR0YWNoTWFya2VkU3BhbnMsIGNvbXBhcmVDb2xsYXBzZWRNYXJrZXJzLCBkZXRhY2hNYXJrZWRTcGFucywgbGluZUlzSGlkZGVuLCB2aXN1YWxMaW5lQ29udGludWVkIH0gZnJvbSAiLi9zcGFucyIKaW1wb3J0IHsgZ2V0TGluZSwgbGluZU5vLCB1cGRhdGVMaW5lSGVpZ2h0IH0gZnJvbSAiLi91dGlsc19saW5lIgoKLy8gTElORSBEQVRBIFNUUlVDVFVSRQoKLy8gTGluZSBvYmplY3RzLiBUaGVzZSBob2xkIHN0YXRlIHJlbGF0ZWQgdG8gYSBsaW5lLCBpbmNsdWRpbmcKLy8gaGlnaGxpZ2h0aW5nIGluZm8gKHRoZSBzdHlsZXMgYXJyYXkpLgpleHBvcnQgZnVuY3Rpb24gTGluZSh0ZXh0LCBtYXJrZWRTcGFucywgZXN0aW1hdGVIZWlnaHQpIHsKICB0aGlzLnRleHQgPSB0ZXh0CiAgYXR0YWNoTWFya2VkU3BhbnModGhpcywgbWFya2VkU3BhbnMpCiAgdGhpcy5oZWlnaHQgPSBlc3RpbWF0ZUhlaWdodCA/IGVzdGltYXRlSGVpZ2h0KHRoaXMpIDogMQp9CmV2ZW50TWl4aW4oTGluZSkKTGluZS5wcm90b3R5cGUubGluZU5vID0gZnVuY3Rpb24oKSB7IHJldHVybiBsaW5lTm8odGhpcykgfQoKLy8gQ2hhbmdlIHRoZSBjb250ZW50ICh0ZXh0LCBtYXJrZXJzKSBvZiBhIGxpbmUuIEF1dG9tYXRpY2FsbHkKLy8gaW52YWxpZGF0ZXMgY2FjaGVkIGluZm9ybWF0aW9uIGFuZCB0cmllcyB0byByZS1lc3RpbWF0ZSB0aGUKLy8gbGluZSdzIGhlaWdodC4KZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUxpbmUobGluZSwgdGV4dCwgbWFya2VkU3BhbnMsIGVzdGltYXRlSGVpZ2h0KSB7CiAgbGluZS50ZXh0ID0gdGV4dAogIGlmIChsaW5lLnN0YXRlQWZ0ZXIpIGxpbmUuc3RhdGVBZnRlciA9IG51bGwKICBpZiAobGluZS5zdHlsZXMpIGxpbmUuc3R5bGVzID0gbnVsbAogIGlmIChsaW5lLm9yZGVyICE9IG51bGwpIGxpbmUub3JkZXIgPSBudWxsCiAgZGV0YWNoTWFya2VkU3BhbnMobGluZSkKICBhdHRhY2hNYXJrZWRTcGFucyhsaW5lLCBtYXJrZWRTcGFucykKICBsZXQgZXN0SGVpZ2h0ID0gZXN0aW1hdGVIZWlnaHQgPyBlc3RpbWF0ZUhlaWdodChsaW5lKSA6IDEKICBpZiAoZXN0SGVpZ2h0ICE9IGxpbmUuaGVpZ2h0KSB1cGRhdGVMaW5lSGVpZ2h0KGxpbmUsIGVzdEhlaWdodCkKfQoKLy8gRGV0YWNoIGEgbGluZSBmcm9tIHRoZSBkb2N1bWVudCB0cmVlIGFuZCBpdHMgbWFya2Vycy4KZXhwb3J0IGZ1bmN0aW9uIGNsZWFuVXBMaW5lKGxpbmUpIHsKICBsaW5lLnBhcmVudCA9IG51bGwKICBkZXRhY2hNYXJrZWRTcGFucyhsaW5lKQp9CgovLyBDb252ZXJ0IGEgc3R5bGUgYXMgcmV0dXJuZWQgYnkgYSBtb2RlIChlaXRoZXIgbnVsbCwgb3IgYSBzdHJpbmcKLy8gY29udGFpbmluZyBvbmUgb3IgbW9yZSBzdHlsZXMpIHRvIGEgQ1NTIHN0eWxlLiBUaGlzIGlzIGNhY2hlZCwKLy8gYW5kIGFsc28gbG9va3MgZm9yIGxpbmUtd2lkZSBzdHlsZXMuCmxldCBzdHlsZVRvQ2xhc3NDYWNoZSA9IHt9LCBzdHlsZVRvQ2xhc3NDYWNoZVdpdGhNb2RlID0ge30KZnVuY3Rpb24gaW50ZXJwcmV0VG9rZW5TdHlsZShzdHlsZSwgb3B0aW9ucykgewogIGlmICghc3R5bGUgfHwgL15ccyokLy50ZXN0KHN0eWxlKSkgcmV0dXJuIG51bGwKICBsZXQgY2FjaGUgPSBvcHRpb25zLmFkZE1vZGVDbGFzcyA/IHN0eWxlVG9DbGFzc0NhY2hlV2l0aE1vZGUgOiBzdHlsZVRvQ2xhc3NDYWNoZQogIHJldHVybiBjYWNoZVtzdHlsZV0gfHwKICAgIChjYWNoZVtzdHlsZV0gPSBzdHlsZS5yZXBsYWNlKC9cUysvZywgImNtLSQmIikpCn0KCi8vIFJlbmRlciB0aGUgRE9NIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0ZXh0IG9mIGEgbGluZS4gQWxzbyBidWlsZHMKLy8gdXAgYSAnbGluZSBtYXAnLCB3aGljaCBwb2ludHMgYXQgdGhlIERPTSBub2RlcyB0aGF0IHJlcHJlc2VudAovLyBzcGVjaWZpYyBzdHJldGNoZXMgb2YgdGV4dCwgYW5kIGlzIHVzZWQgYnkgdGhlIG1lYXN1cmluZyBjb2RlLgovLyBUaGUgcmV0dXJuZWQgb2JqZWN0IGNvbnRhaW5zIHRoZSBET00gbm9kZSwgdGhpcyBtYXAsIGFuZAovLyBpbmZvcm1hdGlvbiBhYm91dCBsaW5lLXdpZGUgc3R5bGVzIHRoYXQgd2VyZSBzZXQgYnkgdGhlIG1vZGUuCmV4cG9ydCBmdW5jdGlvbiBidWlsZExpbmVDb250ZW50KGNtLCBsaW5lVmlldykgewogIC8vIFRoZSBwYWRkaW5nLXJpZ2h0IGZvcmNlcyB0aGUgZWxlbWVudCB0byBoYXZlIGEgJ2JvcmRlcicsIHdoaWNoCiAgLy8gaXMgbmVlZGVkIG9uIFdlYmtpdCB0byBiZSBhYmxlIHRvIGdldCBsaW5lLWxldmVsIGJvdW5kaW5nCiAgLy8gcmVjdGFuZ2xlcyBmb3IgaXQgKGluIG1lYXN1cmVDaGFyKS4KICBsZXQgY29udGVudCA9IGVsdCgic3BhbiIsIG51bGwsIG51bGwsIHdlYmtpdCA/ICJwYWRkaW5nLXJpZ2h0OiAuMXB4IiA6IG51bGwpCiAgbGV0IGJ1aWxkZXIgPSB7cHJlOiBlbHQoInByZSIsIFtjb250ZW50XSwgIkNvZGVNaXJyb3ItbGluZSIpLCBjb250ZW50OiBjb250ZW50LAogICAgICAgICAgICAgICAgIGNvbDogMCwgcG9zOiAwLCBjbTogY20sCiAgICAgICAgICAgICAgICAgdHJhaWxpbmdTcGFjZTogZmFsc2UsCiAgICAgICAgICAgICAgICAgc3BsaXRTcGFjZXM6IChpZSB8fCB3ZWJraXQpICYmIGNtLmdldE9wdGlvbigibGluZVdyYXBwaW5nIil9CiAgbGluZVZpZXcubWVhc3VyZSA9IHt9CgogIC8vIEl0ZXJhdGUgb3ZlciB0aGUgbG9naWNhbCBsaW5lcyB0aGF0IG1ha2UgdXAgdGhpcyB2aXN1YWwgbGluZS4KICBmb3IgKGxldCBpID0gMDsgaSA8PSAobGluZVZpZXcucmVzdCA/IGxpbmVWaWV3LnJlc3QubGVuZ3RoIDogMCk7IGkrKykgewogICAgbGV0IGxpbmUgPSBpID8gbGluZVZpZXcucmVzdFtpIC0gMV0gOiBsaW5lVmlldy5saW5lLCBvcmRlcgogICAgYnVpbGRlci5wb3MgPSAwCiAgICBidWlsZGVyLmFkZFRva2VuID0gYnVpbGRUb2tlbgogICAgLy8gT3B0aW9uYWxseSB3aXJlIGluIHNvbWUgaGFja3MgaW50byB0aGUgdG9rZW4tcmVuZGVyaW5nCiAgICAvLyBhbGdvcml0aG0sIHRvIGRlYWwgd2l0aCBicm93c2VyIHF1aXJrcy4KICAgIGlmIChoYXNCYWRCaWRpUmVjdHMoY20uZGlzcGxheS5tZWFzdXJlKSAmJiAob3JkZXIgPSBnZXRPcmRlcihsaW5lKSkpCiAgICAgIGJ1aWxkZXIuYWRkVG9rZW4gPSBidWlsZFRva2VuQmFkQmlkaShidWlsZGVyLmFkZFRva2VuLCBvcmRlcikKICAgIGJ1aWxkZXIubWFwID0gW10KICAgIGxldCBhbGxvd0Zyb250aWVyVXBkYXRlID0gbGluZVZpZXcgIT0gY20uZGlzcGxheS5leHRlcm5hbE1lYXN1cmVkICYmIGxpbmVObyhsaW5lKQogICAgaW5zZXJ0TGluZUNvbnRlbnQobGluZSwgYnVpbGRlciwgZ2V0TGluZVN0eWxlcyhjbSwgbGluZSwgYWxsb3dGcm9udGllclVwZGF0ZSkpCiAgICBpZiAobGluZS5zdHlsZUNsYXNzZXMpIHsKICAgICAgaWYgKGxpbmUuc3R5bGVDbGFzc2VzLmJnQ2xhc3MpCiAgICAgICAgYnVpbGRlci5iZ0NsYXNzID0gam9pbkNsYXNzZXMobGluZS5zdHlsZUNsYXNzZXMuYmdDbGFzcywgYnVpbGRlci5iZ0NsYXNzIHx8ICIiKQogICAgICBpZiAobGluZS5zdHlsZUNsYXNzZXMudGV4dENsYXNzKQogICAgICAgIGJ1aWxkZXIudGV4dENsYXNzID0gam9pbkNsYXNzZXMobGluZS5zdHlsZUNsYXNzZXMudGV4dENsYXNzLCBidWlsZGVyLnRleHRDbGFzcyB8fCAiIikKICAgIH0KCiAgICAvLyBFbnN1cmUgYXQgbGVhc3QgYSBzaW5nbGUgbm9kZSBpcyBwcmVzZW50LCBmb3IgbWVhc3VyaW5nLgogICAgaWYgKGJ1aWxkZXIubWFwLmxlbmd0aCA9PSAwKQogICAgICBidWlsZGVyLm1hcC5wdXNoKDAsIDAsIGJ1aWxkZXIuY29udGVudC5hcHBlbmRDaGlsZCh6ZXJvV2lkdGhFbGVtZW50KGNtLmRpc3BsYXkubWVhc3VyZSkpKQoKICAgIC8vIFN0b3JlIHRoZSBtYXAgYW5kIGEgY2FjaGUgb2JqZWN0IGZvciB0aGUgY3VycmVudCBsb2dpY2FsIGxpbmUKICAgIGlmIChpID09IDApIHsKICAgICAgbGluZVZpZXcubWVhc3VyZS5tYXAgPSBidWlsZGVyLm1hcAogICAgICBsaW5lVmlldy5tZWFzdXJlLmNhY2hlID0ge30KICAgIH0gZWxzZSB7CiAgICAgIDsobGluZVZpZXcubWVhc3VyZS5tYXBzIHx8IChsaW5lVmlldy5tZWFzdXJlLm1hcHMgPSBbXSkpLnB1c2goYnVpbGRlci5tYXApCiAgICAgIDsobGluZVZpZXcubWVhc3VyZS5jYWNoZXMgfHwgKGxpbmVWaWV3Lm1lYXN1cmUuY2FjaGVzID0gW10pKS5wdXNoKHt9KQogICAgfQogIH0KCiAgLy8gU2VlIGlzc3VlICMyOTAxCiAgaWYgKHdlYmtpdCkgewogICAgbGV0IGxhc3QgPSBidWlsZGVyLmNvbnRlbnQubGFzdENoaWxkCiAgICBpZiAoL1xiY20tdGFiXGIvLnRlc3QobGFzdC5jbGFzc05hbWUpIHx8IChsYXN0LnF1ZXJ5U2VsZWN0b3IgJiYgbGFzdC5xdWVyeVNlbGVjdG9yKCIuY20tdGFiIikpKQogICAgICBidWlsZGVyLmNvbnRlbnQuY2xhc3NOYW1lID0gImNtLXRhYi13cmFwLWhhY2siCiAgfQoKICBzaWduYWwoY20sICJyZW5kZXJMaW5lIiwgY20sIGxpbmVWaWV3LmxpbmUsIGJ1aWxkZXIucHJlKQogIGlmIChidWlsZGVyLnByZS5jbGFzc05hbWUpCiAgICBidWlsZGVyLnRleHRDbGFzcyA9IGpvaW5DbGFzc2VzKGJ1aWxkZXIucHJlLmNsYXNzTmFtZSwgYnVpbGRlci50ZXh0Q2xhc3MgfHwgIiIpCgogIHJldHVybiBidWlsZGVyCn0KCmV4cG9ydCBmdW5jdGlvbiBkZWZhdWx0U3BlY2lhbENoYXJQbGFjZWhvbGRlcihjaCkgewogIGxldCB0b2tlbiA9IGVsdCgic3BhbiIsICJcdTIwMjIiLCAiY20taW52YWxpZGNoYXIiKQogIHRva2VuLnRpdGxlID0gIlxcdSIgKyBjaC5jaGFyQ29kZUF0KDApLnRvU3RyaW5nKDE2KQogIHRva2VuLnNldEF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIsIHRva2VuLnRpdGxlKQogIHJldHVybiB0b2tlbgp9CgovLyBCdWlsZCB1cCB0aGUgRE9NIHJlcHJlc2VudGF0aW9uIGZvciBhIHNpbmdsZSB0b2tlbiwgYW5kIGFkZCBpdCB0bwovLyB0aGUgbGluZSBtYXAuIFRha2VzIGNhcmUgdG8gcmVuZGVyIHNwZWNpYWwgY2hhcmFjdGVycyBzZXBhcmF0ZWx5LgpmdW5jdGlvbiBidWlsZFRva2VuKGJ1aWxkZXIsIHRleHQsIHN0eWxlLCBzdGFydFN0eWxlLCBlbmRTdHlsZSwgdGl0bGUsIGNzcykgewogIGlmICghdGV4dCkgcmV0dXJuCiAgbGV0IGRpc3BsYXlUZXh0ID0gYnVpbGRlci5zcGxpdFNwYWNlcyA/IHNwbGl0U3BhY2VzKHRleHQsIGJ1aWxkZXIudHJhaWxpbmdTcGFjZSkgOiB0ZXh0CiAgbGV0IHNwZWNpYWwgPSBidWlsZGVyLmNtLnN0YXRlLnNwZWNpYWxDaGFycywgbXVzdFdyYXAgPSBmYWxzZQogIGxldCBjb250ZW50CiAgaWYgKCFzcGVjaWFsLnRlc3QodGV4dCkpIHsKICAgIGJ1aWxkZXIuY29sICs9IHRleHQubGVuZ3RoCiAgICBjb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZGlzcGxheVRleHQpCiAgICBidWlsZGVyLm1hcC5wdXNoKGJ1aWxkZXIucG9zLCBidWlsZGVyLnBvcyArIHRleHQubGVuZ3RoLCBjb250ZW50KQogICAgaWYgKGllICYmIGllX3ZlcnNpb24gPCA5KSBtdXN0V3JhcCA9IHRydWUKICAgIGJ1aWxkZXIucG9zICs9IHRleHQubGVuZ3RoCiAgfSBlbHNlIHsKICAgIGNvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCkKICAgIGxldCBwb3MgPSAwCiAgICB3aGlsZSAodHJ1ZSkgewogICAgICBzcGVjaWFsLmxhc3RJbmRleCA9IHBvcwogICAgICBsZXQgbSA9IHNwZWNpYWwuZXhlYyh0ZXh0KQogICAgICBsZXQgc2tpcHBlZCA9IG0gPyBtLmluZGV4IC0gcG9zIDogdGV4dC5sZW5ndGggLSBwb3MKICAgICAgaWYgKHNraXBwZWQpIHsKICAgICAgICBsZXQgdHh0ID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZGlzcGxheVRleHQuc2xpY2UocG9zLCBwb3MgKyBza2lwcGVkKSkKICAgICAgICBpZiAoaWUgJiYgaWVfdmVyc2lvbiA8IDkpIGNvbnRlbnQuYXBwZW5kQ2hpbGQoZWx0KCJzcGFuIiwgW3R4dF0pKQogICAgICAgIGVsc2UgY29udGVudC5hcHBlbmRDaGlsZCh0eHQpCiAgICAgICAgYnVpbGRlci5tYXAucHVzaChidWlsZGVyLnBvcywgYnVpbGRlci5wb3MgKyBza2lwcGVkLCB0eHQpCiAgICAgICAgYnVpbGRlci5jb2wgKz0gc2tpcHBlZAogICAgICAgIGJ1aWxkZXIucG9zICs9IHNraXBwZWQKICAgICAgfQogICAgICBpZiAoIW0pIGJyZWFrCiAgICAgIHBvcyArPSBza2lwcGVkICsgMQogICAgICBsZXQgdHh0CiAgICAgIGlmIChtWzBdID09ICJcdCIpIHsKICAgICAgICBsZXQgdGFiU2l6ZSA9IGJ1aWxkZXIuY20ub3B0aW9ucy50YWJTaXplLCB0YWJXaWR0aCA9IHRhYlNpemUgLSBidWlsZGVyLmNvbCAlIHRhYlNpemUKICAgICAgICB0eHQgPSBjb250ZW50LmFwcGVuZENoaWxkKGVsdCgic3BhbiIsIHNwYWNlU3RyKHRhYldpZHRoKSwgImNtLXRhYiIpKQogICAgICAgIHR4dC5zZXRBdHRyaWJ1dGUoInJvbGUiLCAicHJlc2VudGF0aW9uIikKICAgICAgICB0eHQuc2V0QXR0cmlidXRlKCJjbS10ZXh0IiwgIlx0IikKICAgICAgICBidWlsZGVyLmNvbCArPSB0YWJXaWR0aAogICAgICB9IGVsc2UgaWYgKG1bMF0gPT0gIlxyIiB8fCBtWzBdID09ICJcbiIpIHsKICAgICAgICB0eHQgPSBjb250ZW50LmFwcGVuZENoaWxkKGVsdCgic3BhbiIsIG1bMF0gPT0gIlxyIiA/ICJcdTI0MGQiIDogIlx1MjQyNCIsICJjbS1pbnZhbGlkY2hhciIpKQogICAgICAgIHR4dC5zZXRBdHRyaWJ1dGUoImNtLXRleHQiLCBtWzBdKQogICAgICAgIGJ1aWxkZXIuY29sICs9IDEKICAgICAgfSBlbHNlIHsKICAgICAgICB0eHQgPSBidWlsZGVyLmNtLm9wdGlvbnMuc3BlY2lhbENoYXJQbGFjZWhvbGRlcihtWzBdKQogICAgICAgIHR4dC5zZXRBdHRyaWJ1dGUoImNtLXRleHQiLCBtWzBdKQogICAgICAgIGlmIChpZSAmJiBpZV92ZXJzaW9uIDwgOSkgY29udGVudC5hcHBlbmRDaGlsZChlbHQoInNwYW4iLCBbdHh0XSkpCiAgICAgICAgZWxzZSBjb250ZW50LmFwcGVuZENoaWxkKHR4dCkKICAgICAgICBidWlsZGVyLmNvbCArPSAxCiAgICAgIH0KICAgICAgYnVpbGRlci5tYXAucHVzaChidWlsZGVyLnBvcywgYnVpbGRlci5wb3MgKyAxLCB0eHQpCiAgICAgIGJ1aWxkZXIucG9zKysKICAgIH0KICB9CiAgYnVpbGRlci50cmFpbGluZ1NwYWNlID0gZGlzcGxheVRleHQuY2hhckNvZGVBdCh0ZXh0Lmxlbmd0aCAtIDEpID09IDMyCiAgaWYgKHN0eWxlIHx8IHN0YXJ0U3R5bGUgfHwgZW5kU3R5bGUgfHwgbXVzdFdyYXAgfHwgY3NzKSB7CiAgICBsZXQgZnVsbFN0eWxlID0gc3R5bGUgfHwgIiIKICAgIGlmIChzdGFydFN0eWxlKSBmdWxsU3R5bGUgKz0gc3RhcnRTdHlsZQogICAgaWYgKGVuZFN0eWxlKSBmdWxsU3R5bGUgKz0gZW5kU3R5bGUKICAgIGxldCB0b2tlbiA9IGVsdCgic3BhbiIsIFtjb250ZW50XSwgZnVsbFN0eWxlLCBjc3MpCiAgICBpZiAodGl0bGUpIHRva2VuLnRpdGxlID0gdGl0bGUKICAgIHJldHVybiBidWlsZGVyLmNvbnRlbnQuYXBwZW5kQ2hpbGQodG9rZW4pCiAgfQogIGJ1aWxkZXIuY29udGVudC5hcHBlbmRDaGlsZChjb250ZW50KQp9CgpmdW5jdGlvbiBzcGxpdFNwYWNlcyh0ZXh0LCB0cmFpbGluZ0JlZm9yZSkgewogIGlmICh0ZXh0Lmxlbmd0aCA+IDEgJiYgIS8gIC8udGVzdCh0ZXh0KSkgcmV0dXJuIHRleHQKICBsZXQgc3BhY2VCZWZvcmUgPSB0cmFpbGluZ0JlZm9yZSwgcmVzdWx0ID0gIiIKICBmb3IgKGxldCBpID0gMDsgaSA8IHRleHQubGVuZ3RoOyBpKyspIHsKICAgIGxldCBjaCA9IHRleHQuY2hhckF0KGkpCiAgICBpZiAoY2ggPT0gIiAiICYmIHNwYWNlQmVmb3JlICYmIChpID09IHRleHQubGVuZ3RoIC0gMSB8fCB0ZXh0LmNoYXJDb2RlQXQoaSArIDEpID09IDMyKSkKICAgICAgY2ggPSAiXHUwMGEwIgogICAgcmVzdWx0ICs9IGNoCiAgICBzcGFjZUJlZm9yZSA9IGNoID09ICIgIgogIH0KICByZXR1cm4gcmVzdWx0Cn0KCi8vIFdvcmsgYXJvdW5kIG5vbnNlbnNlIGRpbWVuc2lvbnMgYmVpbmcgcmVwb3J0ZWQgZm9yIHN0cmV0Y2hlcyBvZgovLyByaWdodC10by1sZWZ0IHRleHQuCmZ1bmN0aW9uIGJ1aWxkVG9rZW5CYWRCaWRpKGlubmVyLCBvcmRlcikgewogIHJldHVybiAoYnVpbGRlciwgdGV4dCwgc3R5bGUsIHN0YXJ0U3R5bGUsIGVuZFN0eWxlLCB0aXRsZSwgY3NzKSA9PiB7CiAgICBzdHlsZSA9IHN0eWxlID8gc3R5bGUgKyAiIGNtLWZvcmNlLWJvcmRlciIgOiAiY20tZm9yY2UtYm9yZGVyIgogICAgbGV0IHN0YXJ0ID0gYnVpbGRlci5wb3MsIGVuZCA9IHN0YXJ0ICsgdGV4dC5sZW5ndGgKICAgIGZvciAoOzspIHsKICAgICAgLy8gRmluZCB0aGUgcGFydCB0aGF0IG92ZXJsYXBzIHdpdGggdGhlIHN0YXJ0IG9mIHRoaXMgdGV4dAogICAgICBsZXQgcGFydAogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9yZGVyLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgcGFydCA9IG9yZGVyW2ldCiAgICAgICAgaWYgKHBhcnQudG8gPiBzdGFydCAmJiBwYXJ0LmZyb20gPD0gc3RhcnQpIGJyZWFrCiAgICAgIH0KICAgICAgaWYgKHBhcnQudG8gPj0gZW5kKSByZXR1cm4gaW5uZXIoYnVpbGRlciwgdGV4dCwgc3R5bGUsIHN0YXJ0U3R5bGUsIGVuZFN0eWxlLCB0aXRsZSwgY3NzKQogICAgICBpbm5lcihidWlsZGVyLCB0ZXh0LnNsaWNlKDAsIHBhcnQudG8gLSBzdGFydCksIHN0eWxlLCBzdGFydFN0eWxlLCBudWxsLCB0aXRsZSwgY3NzKQogICAgICBzdGFydFN0eWxlID0gbnVsbAogICAgICB0ZXh0ID0gdGV4dC5zbGljZShwYXJ0LnRvIC0gc3RhcnQpCiAgICAgIHN0YXJ0ID0gcGFydC50bwogICAgfQogIH0KfQoKZnVuY3Rpb24gYnVpbGRDb2xsYXBzZWRTcGFuKGJ1aWxkZXIsIHNpemUsIG1hcmtlciwgaWdub3JlV2lkZ2V0KSB7CiAgbGV0IHdpZGdldCA9ICFpZ25vcmVXaWRnZXQgJiYgbWFya2VyLndpZGdldE5vZGUKICBpZiAod2lkZ2V0KSBidWlsZGVyLm1hcC5wdXNoKGJ1aWxkZXIucG9zLCBidWlsZGVyLnBvcyArIHNpemUsIHdpZGdldCkKICBpZiAoIWlnbm9yZVdpZGdldCAmJiBidWlsZGVyLmNtLmRpc3BsYXkuaW5wdXQubmVlZHNDb250ZW50QXR0cmlidXRlKSB7CiAgICBpZiAoIXdpZGdldCkKICAgICAgd2lkZ2V0ID0gYnVpbGRlci5jb250ZW50LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKSkKICAgIHdpZGdldC5zZXRBdHRyaWJ1dGUoImNtLW1hcmtlciIsIG1hcmtlci5pZCkKICB9CiAgaWYgKHdpZGdldCkgewogICAgYnVpbGRlci5jbS5kaXNwbGF5LmlucHV0LnNldFVuZWRpdGFibGUod2lkZ2V0KQogICAgYnVpbGRlci5jb250ZW50LmFwcGVuZENoaWxkKHdpZGdldCkKICB9CiAgYnVpbGRlci5wb3MgKz0gc2l6ZQogIGJ1aWxkZXIudHJhaWxpbmdTcGFjZSA9IGZhbHNlCn0KCi8vIE91dHB1dHMgYSBudW1iZXIgb2Ygc3BhbnMgdG8gbWFrZSB1cCBhIGxpbmUsIHRha2luZyBoaWdobGlnaHRpbmcKLy8gYW5kIG1hcmtlZCB0ZXh0IGludG8gYWNjb3VudC4KZnVuY3Rpb24gaW5zZXJ0TGluZUNvbnRlbnQobGluZSwgYnVpbGRlciwgc3R5bGVzKSB7CiAgbGV0IHNwYW5zID0gbGluZS5tYXJrZWRTcGFucywgYWxsVGV4dCA9IGxpbmUudGV4dCwgYXQgPSAwCiAgaWYgKCFzcGFucykgewogICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzdHlsZXMubGVuZ3RoOyBpKz0yKQogICAgICBidWlsZGVyLmFkZFRva2VuKGJ1aWxkZXIsIGFsbFRleHQuc2xpY2UoYXQsIGF0ID0gc3R5bGVzW2ldKSwgaW50ZXJwcmV0VG9rZW5TdHlsZShzdHlsZXNbaSsxXSwgYnVpbGRlci5jbS5vcHRpb25zKSkKICAgIHJldHVybgogIH0KCiAgbGV0IGxlbiA9IGFsbFRleHQubGVuZ3RoLCBwb3MgPSAwLCBpID0gMSwgdGV4dCA9ICIiLCBzdHlsZSwgY3NzCiAgbGV0IG5leHRDaGFuZ2UgPSAwLCBzcGFuU3R5bGUsIHNwYW5FbmRTdHlsZSwgc3BhblN0YXJ0U3R5bGUsIHRpdGxlLCBjb2xsYXBzZWQKICBmb3IgKDs7KSB7CiAgICBpZiAobmV4dENoYW5nZSA9PSBwb3MpIHsgLy8gVXBkYXRlIGN1cnJlbnQgbWFya2VyIHNldAogICAgICBzcGFuU3R5bGUgPSBzcGFuRW5kU3R5bGUgPSBzcGFuU3RhcnRTdHlsZSA9IHRpdGxlID0gY3NzID0gIiIKICAgICAgY29sbGFwc2VkID0gbnVsbDsgbmV4dENoYW5nZSA9IEluZmluaXR5CiAgICAgIGxldCBmb3VuZEJvb2ttYXJrcyA9IFtdLCBlbmRTdHlsZXMKICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBzcGFucy5sZW5ndGg7ICsraikgewogICAgICAgIGxldCBzcCA9IHNwYW5zW2pdLCBtID0gc3AubWFya2VyCiAgICAgICAgaWYgKG0udHlwZSA9PSAiYm9va21hcmsiICYmIHNwLmZyb20gPT0gcG9zICYmIG0ud2lkZ2V0Tm9kZSkgewogICAgICAgICAgZm91bmRCb29rbWFya3MucHVzaChtKQogICAgICAgIH0gZWxzZSBpZiAoc3AuZnJvbSA8PSBwb3MgJiYgKHNwLnRvID09IG51bGwgfHwgc3AudG8gPiBwb3MgfHwgbS5jb2xsYXBzZWQgJiYgc3AudG8gPT0gcG9zICYmIHNwLmZyb20gPT0gcG9zKSkgewogICAgICAgICAgaWYgKHNwLnRvICE9IG51bGwgJiYgc3AudG8gIT0gcG9zICYmIG5leHRDaGFuZ2UgPiBzcC50bykgewogICAgICAgICAgICBuZXh0Q2hhbmdlID0gc3AudG8KICAgICAgICAgICAgc3BhbkVuZFN0eWxlID0gIiIKICAgICAgICAgIH0KICAgICAgICAgIGlmIChtLmNsYXNzTmFtZSkgc3BhblN0eWxlICs9ICIgIiArIG0uY2xhc3NOYW1lCiAgICAgICAgICBpZiAobS5jc3MpIGNzcyA9IChjc3MgPyBjc3MgKyAiOyIgOiAiIikgKyBtLmNzcwogICAgICAgICAgaWYgKG0uc3RhcnRTdHlsZSAmJiBzcC5mcm9tID09IHBvcykgc3BhblN0YXJ0U3R5bGUgKz0gIiAiICsgbS5zdGFydFN0eWxlCiAgICAgICAgICBpZiAobS5lbmRTdHlsZSAmJiBzcC50byA9PSBuZXh0Q2hhbmdlKSAoZW5kU3R5bGVzIHx8IChlbmRTdHlsZXMgPSBbXSkpLnB1c2gobS5lbmRTdHlsZSwgc3AudG8pCiAgICAgICAgICBpZiAobS50aXRsZSAmJiAhdGl0bGUpIHRpdGxlID0gbS50aXRsZQogICAgICAgICAgaWYgKG0uY29sbGFwc2VkICYmICghY29sbGFwc2VkIHx8IGNvbXBhcmVDb2xsYXBzZWRNYXJrZXJzKGNvbGxhcHNlZC5tYXJrZXIsIG0pIDwgMCkpCiAgICAgICAgICAgIGNvbGxhcHNlZCA9IHNwCiAgICAgICAgfSBlbHNlIGlmIChzcC5mcm9tID4gcG9zICYmIG5leHRDaGFuZ2UgPiBzcC5mcm9tKSB7CiAgICAgICAgICBuZXh0Q2hhbmdlID0gc3AuZnJvbQogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoZW5kU3R5bGVzKSBmb3IgKGxldCBqID0gMDsgaiA8IGVuZFN0eWxlcy5sZW5ndGg7IGogKz0gMikKICAgICAgICBpZiAoZW5kU3R5bGVzW2ogKyAxXSA9PSBuZXh0Q2hhbmdlKSBzcGFuRW5kU3R5bGUgKz0gIiAiICsgZW5kU3R5bGVzW2pdCgogICAgICBpZiAoIWNvbGxhcHNlZCB8fCBjb2xsYXBzZWQuZnJvbSA9PSBwb3MpIGZvciAobGV0IGogPSAwOyBqIDwgZm91bmRCb29rbWFya3MubGVuZ3RoOyArK2opCiAgICAgICAgYnVpbGRDb2xsYXBzZWRTcGFuKGJ1aWxkZXIsIDAsIGZvdW5kQm9va21hcmtzW2pdKQogICAgICBpZiAoY29sbGFwc2VkICYmIChjb2xsYXBzZWQuZnJvbSB8fCAwKSA9PSBwb3MpIHsKICAgICAgICBidWlsZENvbGxhcHNlZFNwYW4oYnVpbGRlciwgKGNvbGxhcHNlZC50byA9PSBudWxsID8gbGVuICsgMSA6IGNvbGxhcHNlZC50bykgLSBwb3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxhcHNlZC5tYXJrZXIsIGNvbGxhcHNlZC5mcm9tID09IG51bGwpCiAgICAgICAgaWYgKGNvbGxhcHNlZC50byA9PSBudWxsKSByZXR1cm4KICAgICAgICBpZiAoY29sbGFwc2VkLnRvID09IHBvcykgY29sbGFwc2VkID0gZmFsc2UKICAgICAgfQogICAgfQogICAgaWYgKHBvcyA+PSBsZW4pIGJyZWFrCgogICAgbGV0IHVwdG8gPSBNYXRoLm1pbihsZW4sIG5leHRDaGFuZ2UpCiAgICB3aGlsZSAodHJ1ZSkgewogICAgICBpZiAodGV4dCkgewogICAgICAgIGxldCBlbmQgPSBwb3MgKyB0ZXh0Lmxlbmd0aAogICAgICAgIGlmICghY29sbGFwc2VkKSB7CiAgICAgICAgICBsZXQgdG9rZW5UZXh0ID0gZW5kID4gdXB0byA/IHRleHQuc2xpY2UoMCwgdXB0byAtIHBvcykgOiB0ZXh0CiAgICAgICAgICBidWlsZGVyLmFkZFRva2VuKGJ1aWxkZXIsIHRva2VuVGV4dCwgc3R5bGUgPyBzdHlsZSArIHNwYW5TdHlsZSA6IHNwYW5TdHlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhblN0YXJ0U3R5bGUsIHBvcyArIHRva2VuVGV4dC5sZW5ndGggPT0gbmV4dENoYW5nZSA/IHNwYW5FbmRTdHlsZSA6ICIiLCB0aXRsZSwgY3NzKQogICAgICAgIH0KICAgICAgICBpZiAoZW5kID49IHVwdG8pIHt0ZXh0ID0gdGV4dC5zbGljZSh1cHRvIC0gcG9zKTsgcG9zID0gdXB0bzsgYnJlYWt9CiAgICAgICAgcG9zID0gZW5kCiAgICAgICAgc3BhblN0YXJ0U3R5bGUgPSAiIgogICAgICB9CiAgICAgIHRleHQgPSBhbGxUZXh0LnNsaWNlKGF0LCBhdCA9IHN0eWxlc1tpKytdKQogICAgICBzdHlsZSA9IGludGVycHJldFRva2VuU3R5bGUoc3R5bGVzW2krK10sIGJ1aWxkZXIuY20ub3B0aW9ucykKICAgIH0KICB9Cn0KCgovLyBUaGVzZSBvYmplY3RzIGFyZSB1c2VkIHRvIHJlcHJlc2VudCB0aGUgdmlzaWJsZSAoY3VycmVudGx5IGRyYXduKQovLyBwYXJ0IG9mIHRoZSBkb2N1bWVudC4gQSBMaW5lVmlldyBtYXkgY29ycmVzcG9uZCB0byBtdWx0aXBsZQovLyBsb2dpY2FsIGxpbmVzLCBpZiB0aG9zZSBhcmUgY29ubmVjdGVkIGJ5IGNvbGxhcHNlZCByYW5nZXMuCmV4cG9ydCBmdW5jdGlvbiBMaW5lVmlldyhkb2MsIGxpbmUsIGxpbmVOKSB7CiAgLy8gVGhlIHN0YXJ0aW5nIGxpbmUKICB0aGlzLmxpbmUgPSBsaW5lCiAgLy8gQ29udGludWluZyBsaW5lcywgaWYgYW55CiAgdGhpcy5yZXN0ID0gdmlzdWFsTGluZUNvbnRpbnVlZChsaW5lKQogIC8vIE51bWJlciBvZiBsb2dpY2FsIGxpbmVzIGluIHRoaXMgdmlzdWFsIGxpbmUKICB0aGlzLnNpemUgPSB0aGlzLnJlc3QgPyBsaW5lTm8obHN0KHRoaXMucmVzdCkpIC0gbGluZU4gKyAxIDogMQogIHRoaXMubm9kZSA9IHRoaXMudGV4dCA9IG51bGwKICB0aGlzLmhpZGRlbiA9IGxpbmVJc0hpZGRlbihkb2MsIGxpbmUpCn0KCi8vIENyZWF0ZSBhIHJhbmdlIG9mIExpbmVWaWV3IG9iamVjdHMgZm9yIHRoZSBnaXZlbiBsaW5lcy4KZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkVmlld0FycmF5KGNtLCBmcm9tLCB0bykgewogIGxldCBhcnJheSA9IFtdLCBuZXh0UG9zCiAgZm9yIChsZXQgcG9zID0gZnJvbTsgcG9zIDwgdG87IHBvcyA9IG5leHRQb3MpIHsKICAgIGxldCB2aWV3ID0gbmV3IExpbmVWaWV3KGNtLmRvYywgZ2V0TGluZShjbS5kb2MsIHBvcyksIHBvcykKICAgIG5leHRQb3MgPSBwb3MgKyB2aWV3LnNpemUKICAgIGFycmF5LnB1c2godmlldykKICB9CiAgcmV0dXJuIGFycmF5Cn0K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/src/line/pos.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aW1wb3J0IHsgZ2V0TGluZSB9IGZyb20gIi4vdXRpbHNfbGluZSIKCi8vIEEgUG9zIGluc3RhbmNlIHJlcHJlc2VudHMgYSBwb3NpdGlvbiB3aXRoaW4gdGhlIHRleHQuCmV4cG9ydCBmdW5jdGlvbiBQb3MgKGxpbmUsIGNoKSB7CiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFBvcykpIHJldHVybiBuZXcgUG9zKGxpbmUsIGNoKQogIHRoaXMubGluZSA9IGxpbmU7IHRoaXMuY2ggPSBjaAp9CgovLyBDb21wYXJlIHR3byBwb3NpdGlvbnMsIHJldHVybiAwIGlmIHRoZXkgYXJlIHRoZSBzYW1lLCBhIG5lZ2F0aXZlCi8vIG51bWJlciB3aGVuIGEgaXMgbGVzcywgYW5kIGEgcG9zaXRpdmUgbnVtYmVyIG90aGVyd2lzZS4KZXhwb3J0IGZ1bmN0aW9uIGNtcChhLCBiKSB7IHJldHVybiBhLmxpbmUgLSBiLmxpbmUgfHwgYS5jaCAtIGIuY2ggfQoKZXhwb3J0IGZ1bmN0aW9uIGNvcHlQb3MoeCkge3JldHVybiBQb3MoeC5saW5lLCB4LmNoKX0KZXhwb3J0IGZ1bmN0aW9uIG1heFBvcyhhLCBiKSB7IHJldHVybiBjbXAoYSwgYikgPCAwID8gYiA6IGEgfQpleHBvcnQgZnVuY3Rpb24gbWluUG9zKGEsIGIpIHsgcmV0dXJuIGNtcChhLCBiKSA8IDAgPyBhIDogYiB9CgovLyBNb3N0IG9mIHRoZSBleHRlcm5hbCBBUEkgY2xpcHMgZ2l2ZW4gcG9zaXRpb25zIHRvIG1ha2Ugc3VyZSB0aGV5Ci8vIGFjdHVhbGx5IGV4aXN0IHdpdGhpbiB0aGUgZG9jdW1lbnQuCmV4cG9ydCBmdW5jdGlvbiBjbGlwTGluZShkb2MsIG4pIHtyZXR1cm4gTWF0aC5tYXgoZG9jLmZpcnN0LCBNYXRoLm1pbihuLCBkb2MuZmlyc3QgKyBkb2Muc2l6ZSAtIDEpKX0KZXhwb3J0IGZ1bmN0aW9uIGNsaXBQb3MoZG9jLCBwb3MpIHsKICBpZiAocG9zLmxpbmUgPCBkb2MuZmlyc3QpIHJldHVybiBQb3MoZG9jLmZpcnN0LCAwKQogIGxldCBsYXN0ID0gZG9jLmZpcnN0ICsgZG9jLnNpemUgLSAxCiAgaWYgKHBvcy5saW5lID4gbGFzdCkgcmV0dXJuIFBvcyhsYXN0LCBnZXRMaW5lKGRvYywgbGFzdCkudGV4dC5sZW5ndGgpCiAgcmV0dXJuIGNsaXBUb0xlbihwb3MsIGdldExpbmUoZG9jLCBwb3MubGluZSkudGV4dC5sZW5ndGgpCn0KZnVuY3Rpb24gY2xpcFRvTGVuKHBvcywgbGluZWxlbikgewogIGxldCBjaCA9IHBvcy5jaAogIGlmIChjaCA9PSBudWxsIHx8IGNoID4gbGluZWxlbikgcmV0dXJuIFBvcyhwb3MubGluZSwgbGluZWxlbikKICBlbHNlIGlmIChjaCA8IDApIHJldHVybiBQb3MocG9zLmxpbmUsIDApCiAgZWxzZSByZXR1cm4gcG9zCn0KZXhwb3J0IGZ1bmN0aW9uIGNsaXBQb3NBcnJheShkb2MsIGFycmF5KSB7CiAgbGV0IG91dCA9IFtdCiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykgb3V0W2ldID0gY2xpcFBvcyhkb2MsIGFycmF5W2ldKQogIHJldHVybiBvdXQKfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/src/line/saw_special_spans.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gT3B0aW1pemUgc29tZSBjb2RlIHdoZW4gdGhlc2UgZmVhdHVyZXMgYXJlIG5vdCB1c2VkLgpleHBvcnQgbGV0IHNhd1JlYWRPbmx5U3BhbnMgPSBmYWxzZSwgc2F3Q29sbGFwc2VkU3BhbnMgPSBmYWxzZQoKZXhwb3J0IGZ1bmN0aW9uIHNlZVJlYWRPbmx5U3BhbnMoKSB7CiAgc2F3UmVhZE9ubHlTcGFucyA9IHRydWUKfQoKZXhwb3J0IGZ1bmN0aW9uIHNlZUNvbGxhcHNlZFNwYW5zKCkgewogIHNhd0NvbGxhcHNlZFNwYW5zID0gdHJ1ZQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/src/line/spans.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aW1wb3J0IHsgaW5kZXhPZiwgbHN0IH0gZnJvbSAiLi4vdXRpbC9taXNjIgoKaW1wb3J0IHsgY21wIH0gZnJvbSAiLi9wb3MiCmltcG9ydCB7IHNhd0NvbGxhcHNlZFNwYW5zIH0gZnJvbSAiLi9zYXdfc3BlY2lhbF9zcGFucyIKaW1wb3J0IHsgZ2V0TGluZSwgaXNMaW5lLCBsaW5lTm8gfSBmcm9tICIuL3V0aWxzX2xpbmUiCgovLyBURVhUTUFSS0VSIFNQQU5TCgpleHBvcnQgZnVuY3Rpb24gTWFya2VkU3BhbihtYXJrZXIsIGZyb20sIHRvKSB7CiAgdGhpcy5tYXJrZXIgPSBtYXJrZXIKICB0aGlzLmZyb20gPSBmcm9tOyB0aGlzLnRvID0gdG8KfQoKLy8gU2VhcmNoIGFuIGFycmF5IG9mIHNwYW5zIGZvciBhIHNwYW4gbWF0Y2hpbmcgdGhlIGdpdmVuIG1hcmtlci4KZXhwb3J0IGZ1bmN0aW9uIGdldE1hcmtlZFNwYW5Gb3Ioc3BhbnMsIG1hcmtlcikgewogIGlmIChzcGFucykgZm9yIChsZXQgaSA9IDA7IGkgPCBzcGFucy5sZW5ndGg7ICsraSkgewogICAgbGV0IHNwYW4gPSBzcGFuc1tpXQogICAgaWYgKHNwYW4ubWFya2VyID09IG1hcmtlcikgcmV0dXJuIHNwYW4KICB9Cn0KLy8gUmVtb3ZlIGEgc3BhbiBmcm9tIGFuIGFycmF5LCByZXR1cm5pbmcgdW5kZWZpbmVkIGlmIG5vIHNwYW5zIGFyZQovLyBsZWZ0ICh3ZSBkb24ndCBzdG9yZSBhcnJheXMgZm9yIGxpbmVzIHdpdGhvdXQgc3BhbnMpLgpleHBvcnQgZnVuY3Rpb24gcmVtb3ZlTWFya2VkU3BhbihzcGFucywgc3BhbikgewogIGxldCByCiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzcGFucy5sZW5ndGg7ICsraSkKICAgIGlmIChzcGFuc1tpXSAhPSBzcGFuKSAociB8fCAociA9IFtdKSkucHVzaChzcGFuc1tpXSkKICByZXR1cm4gcgp9Ci8vIEFkZCBhIHNwYW4gdG8gYSBsaW5lLgpleHBvcnQgZnVuY3Rpb24gYWRkTWFya2VkU3BhbihsaW5lLCBzcGFuKSB7CiAgbGluZS5tYXJrZWRTcGFucyA9IGxpbmUubWFya2VkU3BhbnMgPyBsaW5lLm1hcmtlZFNwYW5zLmNvbmNhdChbc3Bhbl0pIDogW3NwYW5dCiAgc3Bhbi5tYXJrZXIuYXR0YWNoTGluZShsaW5lKQp9CgovLyBVc2VkIGZvciB0aGUgYWxnb3JpdGhtIHRoYXQgYWRqdXN0cyBtYXJrZXJzIGZvciBhIGNoYW5nZSBpbiB0aGUKLy8gZG9jdW1lbnQuIFRoZXNlIGZ1bmN0aW9ucyBjdXQgYW4gYXJyYXkgb2Ygc3BhbnMgYXQgYSBnaXZlbgovLyBjaGFyYWN0ZXIgcG9zaXRpb24sIHJldHVybmluZyBhbiBhcnJheSBvZiByZW1haW5pbmcgY2h1bmtzIChvcgovLyB1bmRlZmluZWQgaWYgbm90aGluZyByZW1haW5zKS4KZnVuY3Rpb24gbWFya2VkU3BhbnNCZWZvcmUob2xkLCBzdGFydENoLCBpc0luc2VydCkgewogIGxldCBudwogIGlmIChvbGQpIGZvciAobGV0IGkgPSAwOyBpIDwgb2xkLmxlbmd0aDsgKytpKSB7CiAgICBsZXQgc3BhbiA9IG9sZFtpXSwgbWFya2VyID0gc3Bhbi5tYXJrZXIKICAgIGxldCBzdGFydHNCZWZvcmUgPSBzcGFuLmZyb20gPT0gbnVsbCB8fCAobWFya2VyLmluY2x1c2l2ZUxlZnQgPyBzcGFuLmZyb20gPD0gc3RhcnRDaCA6IHNwYW4uZnJvbSA8IHN0YXJ0Q2gpCiAgICBpZiAoc3RhcnRzQmVmb3JlIHx8IHNwYW4uZnJvbSA9PSBzdGFydENoICYmIG1hcmtlci50eXBlID09ICJib29rbWFyayIgJiYgKCFpc0luc2VydCB8fCAhc3Bhbi5tYXJrZXIuaW5zZXJ0TGVmdCkpIHsKICAgICAgbGV0IGVuZHNBZnRlciA9IHNwYW4udG8gPT0gbnVsbCB8fCAobWFya2VyLmluY2x1c2l2ZVJpZ2h0ID8gc3Bhbi50byA+PSBzdGFydENoIDogc3Bhbi50byA+IHN0YXJ0Q2gpCiAgICAgIDsobncgfHwgKG53ID0gW10pKS5wdXNoKG5ldyBNYXJrZWRTcGFuKG1hcmtlciwgc3Bhbi5mcm9tLCBlbmRzQWZ0ZXIgPyBudWxsIDogc3Bhbi50bykpCiAgICB9CiAgfQogIHJldHVybiBudwp9CmZ1bmN0aW9uIG1hcmtlZFNwYW5zQWZ0ZXIob2xkLCBlbmRDaCwgaXNJbnNlcnQpIHsKICBsZXQgbncKICBpZiAob2xkKSBmb3IgKGxldCBpID0gMDsgaSA8IG9sZC5sZW5ndGg7ICsraSkgewogICAgbGV0IHNwYW4gPSBvbGRbaV0sIG1hcmtlciA9IHNwYW4ubWFya2VyCiAgICBsZXQgZW5kc0FmdGVyID0gc3Bhbi50byA9PSBudWxsIHx8IChtYXJrZXIuaW5jbHVzaXZlUmlnaHQgPyBzcGFuLnRvID49IGVuZENoIDogc3Bhbi50byA+IGVuZENoKQogICAgaWYgKGVuZHNBZnRlciB8fCBzcGFuLmZyb20gPT0gZW5kQ2ggJiYgbWFya2VyLnR5cGUgPT0gImJvb2ttYXJrIiAmJiAoIWlzSW5zZXJ0IHx8IHNwYW4ubWFya2VyLmluc2VydExlZnQpKSB7CiAgICAgIGxldCBzdGFydHNCZWZvcmUgPSBzcGFuLmZyb20gPT0gbnVsbCB8fCAobWFya2VyLmluY2x1c2l2ZUxlZnQgPyBzcGFuLmZyb20gPD0gZW5kQ2ggOiBzcGFuLmZyb20gPCBlbmRDaCkKICAgICAgOyhudyB8fCAobncgPSBbXSkpLnB1c2gobmV3IE1hcmtlZFNwYW4obWFya2VyLCBzdGFydHNCZWZvcmUgPyBudWxsIDogc3Bhbi5mcm9tIC0gZW5kQ2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Bhbi50byA9PSBudWxsID8gbnVsbCA6IHNwYW4udG8gLSBlbmRDaCkpCiAgICB9CiAgfQogIHJldHVybiBudwp9CgovLyBHaXZlbiBhIGNoYW5nZSBvYmplY3QsIGNvbXB1dGUgdGhlIG5ldyBzZXQgb2YgbWFya2VyIHNwYW5zIHRoYXQKLy8gY292ZXIgdGhlIGxpbmUgaW4gd2hpY2ggdGhlIGNoYW5nZSB0b29rIHBsYWNlLiBSZW1vdmVzIHNwYW5zCi8vIGVudGlyZWx5IHdpdGhpbiB0aGUgY2hhbmdlLCByZWNvbm5lY3RzIHNwYW5zIGJlbG9uZ2luZyB0byB0aGUKLy8gc2FtZSBtYXJrZXIgdGhhdCBhcHBlYXIgb24gYm90aCBzaWRlcyBvZiB0aGUgY2hhbmdlLCBhbmQgY3V0cyBvZmYKLy8gc3BhbnMgcGFydGlhbGx5IHdpdGhpbiB0aGUgY2hhbmdlLiBSZXR1cm5zIGFuIGFycmF5IG9mIHNwYW4KLy8gYXJyYXlzIHdpdGggb25lIGVsZW1lbnQgZm9yIGVhY2ggbGluZSBpbiAoYWZ0ZXIpIHRoZSBjaGFuZ2UuCmV4cG9ydCBmdW5jdGlvbiBzdHJldGNoU3BhbnNPdmVyQ2hhbmdlKGRvYywgY2hhbmdlKSB7CiAgaWYgKGNoYW5nZS5mdWxsKSByZXR1cm4gbnVsbAogIGxldCBvbGRGaXJzdCA9IGlzTGluZShkb2MsIGNoYW5nZS5mcm9tLmxpbmUpICYmIGdldExpbmUoZG9jLCBjaGFuZ2UuZnJvbS5saW5lKS5tYXJrZWRTcGFucwogIGxldCBvbGRMYXN0ID0gaXNMaW5lKGRvYywgY2hhbmdlLnRvLmxpbmUpICYmIGdldExpbmUoZG9jLCBjaGFuZ2UudG8ubGluZSkubWFya2VkU3BhbnMKICBpZiAoIW9sZEZpcnN0ICYmICFvbGRMYXN0KSByZXR1cm4gbnVsbAoKICBsZXQgc3RhcnRDaCA9IGNoYW5nZS5mcm9tLmNoLCBlbmRDaCA9IGNoYW5nZS50by5jaCwgaXNJbnNlcnQgPSBjbXAoY2hhbmdlLmZyb20sIGNoYW5nZS50bykgPT0gMAogIC8vIEdldCB0aGUgc3BhbnMgdGhhdCAnc3RpY2sgb3V0JyBvbiBib3RoIHNpZGVzCiAgbGV0IGZpcnN0ID0gbWFya2VkU3BhbnNCZWZvcmUob2xkRmlyc3QsIHN0YXJ0Q2gsIGlzSW5zZXJ0KQogIGxldCBsYXN0ID0gbWFya2VkU3BhbnNBZnRlcihvbGRMYXN0LCBlbmRDaCwgaXNJbnNlcnQpCgogIC8vIE5leHQsIG1lcmdlIHRob3NlIHR3byBlbmRzCiAgbGV0IHNhbWVMaW5lID0gY2hhbmdlLnRleHQubGVuZ3RoID09IDEsIG9mZnNldCA9IGxzdChjaGFuZ2UudGV4dCkubGVuZ3RoICsgKHNhbWVMaW5lID8gc3RhcnRDaCA6IDApCiAgaWYgKGZpcnN0KSB7CiAgICAvLyBGaXggdXAgLnRvIHByb3BlcnRpZXMgb2YgZmlyc3QKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmlyc3QubGVuZ3RoOyArK2kpIHsKICAgICAgbGV0IHNwYW4gPSBmaXJzdFtpXQogICAgICBpZiAoc3Bhbi50byA9PSBudWxsKSB7CiAgICAgICAgbGV0IGZvdW5kID0gZ2V0TWFya2VkU3BhbkZvcihsYXN0LCBzcGFuLm1hcmtlcikKICAgICAgICBpZiAoIWZvdW5kKSBzcGFuLnRvID0gc3RhcnRDaAogICAgICAgIGVsc2UgaWYgKHNhbWVMaW5lKSBzcGFuLnRvID0gZm91bmQudG8gPT0gbnVsbCA/IG51bGwgOiBmb3VuZC50byArIG9mZnNldAogICAgICB9CiAgICB9CiAgfQogIGlmIChsYXN0KSB7CiAgICAvLyBGaXggdXAgLmZyb20gaW4gbGFzdCAob3IgbW92ZSB0aGVtIGludG8gZmlyc3QgaW4gY2FzZSBvZiBzYW1lTGluZSkKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGFzdC5sZW5ndGg7ICsraSkgewogICAgICBsZXQgc3BhbiA9IGxhc3RbaV0KICAgICAgaWYgKHNwYW4udG8gIT0gbnVsbCkgc3Bhbi50byArPSBvZmZzZXQKICAgICAgaWYgKHNwYW4uZnJvbSA9PSBudWxsKSB7CiAgICAgICAgbGV0IGZvdW5kID0gZ2V0TWFya2VkU3BhbkZvcihmaXJzdCwgc3Bhbi5tYXJrZXIpCiAgICAgICAgaWYgKCFmb3VuZCkgewogICAgICAgICAgc3Bhbi5mcm9tID0gb2Zmc2V0CiAgICAgICAgICBpZiAoc2FtZUxpbmUpIChmaXJzdCB8fCAoZmlyc3QgPSBbXSkpLnB1c2goc3BhbikKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc3Bhbi5mcm9tICs9IG9mZnNldAogICAgICAgIGlmIChzYW1lTGluZSkgKGZpcnN0IHx8IChmaXJzdCA9IFtdKSkucHVzaChzcGFuKQogICAgICB9CiAgICB9CiAgfQogIC8vIE1ha2Ugc3VyZSB3ZSBkaWRuJ3QgY3JlYXRlIGFueSB6ZXJvLWxlbmd0aCBzcGFucwogIGlmIChmaXJzdCkgZmlyc3QgPSBjbGVhckVtcHR5U3BhbnMoZmlyc3QpCiAgaWYgKGxhc3QgJiYgbGFzdCAhPSBmaXJzdCkgbGFzdCA9IGNsZWFyRW1wdHlTcGFucyhsYXN0KQoKICBsZXQgbmV3TWFya2VycyA9IFtmaXJzdF0KICBpZiAoIXNhbWVMaW5lKSB7CiAgICAvLyBGaWxsIGdhcCB3aXRoIHdob2xlLWxpbmUtc3BhbnMKICAgIGxldCBnYXAgPSBjaGFuZ2UudGV4dC5sZW5ndGggLSAyLCBnYXBNYXJrZXJzCiAgICBpZiAoZ2FwID4gMCAmJiBmaXJzdCkKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaXJzdC5sZW5ndGg7ICsraSkKICAgICAgICBpZiAoZmlyc3RbaV0udG8gPT0gbnVsbCkKICAgICAgICAgIChnYXBNYXJrZXJzIHx8IChnYXBNYXJrZXJzID0gW10pKS5wdXNoKG5ldyBNYXJrZWRTcGFuKGZpcnN0W2ldLm1hcmtlciwgbnVsbCwgbnVsbCkpCiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdhcDsgKytpKQogICAgICBuZXdNYXJrZXJzLnB1c2goZ2FwTWFya2VycykKICAgIG5ld01hcmtlcnMucHVzaChsYXN0KQogIH0KICByZXR1cm4gbmV3TWFya2Vycwp9CgovLyBSZW1vdmUgc3BhbnMgdGhhdCBhcmUgZW1wdHkgYW5kIGRvbid0IGhhdmUgYSBjbGVhcldoZW5FbXB0eQovLyBvcHRpb24gb2YgZmFsc2UuCmZ1bmN0aW9uIGNsZWFyRW1wdHlTcGFucyhzcGFucykgewogIGZvciAobGV0IGkgPSAwOyBpIDwgc3BhbnMubGVuZ3RoOyArK2kpIHsKICAgIGxldCBzcGFuID0gc3BhbnNbaV0KICAgIGlmIChzcGFuLmZyb20gIT0gbnVsbCAmJiBzcGFuLmZyb20gPT0gc3Bhbi50byAmJiBzcGFuLm1hcmtlci5jbGVhcldoZW5FbXB0eSAhPT0gZmFsc2UpCiAgICAgIHNwYW5zLnNwbGljZShpLS0sIDEpCiAgfQogIGlmICghc3BhbnMubGVuZ3RoKSByZXR1cm4gbnVsbAogIHJldHVybiBzcGFucwp9CgovLyBVc2VkIHRvICdjbGlwJyBvdXQgcmVhZE9ubHkgcmFuZ2VzIHdoZW4gbWFraW5nIGEgY2hhbmdlLgpleHBvcnQgZnVuY3Rpb24gcmVtb3ZlUmVhZE9ubHlSYW5nZXMoZG9jLCBmcm9tLCB0bykgewogIGxldCBtYXJrZXJzID0gbnVsbAogIGRvYy5pdGVyKGZyb20ubGluZSwgdG8ubGluZSArIDEsIGxpbmUgPT4gewogICAgaWYgKGxpbmUubWFya2VkU3BhbnMpIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZS5tYXJrZWRTcGFucy5sZW5ndGg7ICsraSkgewogICAgICBsZXQgbWFyayA9IGxpbmUubWFya2VkU3BhbnNbaV0ubWFya2VyCiAgICAgIGlmIChtYXJrLnJlYWRPbmx5ICYmICghbWFya2VycyB8fCBpbmRleE9mKG1hcmtlcnMsIG1hcmspID09IC0xKSkKICAgICAgICAobWFya2VycyB8fCAobWFya2VycyA9IFtdKSkucHVzaChtYXJrKQogICAgfQogIH0pCiAgaWYgKCFtYXJrZXJzKSByZXR1cm4gbnVsbAogIGxldCBwYXJ0cyA9IFt7ZnJvbTogZnJvbSwgdG86IHRvfV0KICBmb3IgKGxldCBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyArK2kpIHsKICAgIGxldCBtayA9IG1hcmtlcnNbaV0sIG0gPSBtay5maW5kKDApCiAgICBmb3IgKGxldCBqID0gMDsgaiA8IHBhcnRzLmxlbmd0aDsgKytqKSB7CiAgICAgIGxldCBwID0gcGFydHNbal0KICAgICAgaWYgKGNtcChwLnRvLCBtLmZyb20pIDwgMCB8fCBjbXAocC5mcm9tLCBtLnRvKSA+IDApIGNvbnRpbnVlCiAgICAgIGxldCBuZXdQYXJ0cyA9IFtqLCAxXSwgZGZyb20gPSBjbXAocC5mcm9tLCBtLmZyb20pLCBkdG8gPSBjbXAocC50bywgbS50bykKICAgICAgaWYgKGRmcm9tIDwgMCB8fCAhbWsuaW5jbHVzaXZlTGVmdCAmJiAhZGZyb20pCiAgICAgICAgbmV3UGFydHMucHVzaCh7ZnJvbTogcC5mcm9tLCB0bzogbS5mcm9tfSkKICAgICAgaWYgKGR0byA+IDAgfHwgIW1rLmluY2x1c2l2ZVJpZ2h0ICYmICFkdG8pCiAgICAgICAgbmV3UGFydHMucHVzaCh7ZnJvbTogbS50bywgdG86IHAudG99KQogICAgICBwYXJ0cy5zcGxpY2UuYXBwbHkocGFydHMsIG5ld1BhcnRzKQogICAgICBqICs9IG5ld1BhcnRzLmxlbmd0aCAtIDEKICAgIH0KICB9CiAgcmV0dXJuIHBhcnRzCn0KCi8vIENvbm5lY3Qgb3IgZGlzY29ubmVjdCBzcGFucyBmcm9tIGEgbGluZS4KZXhwb3J0IGZ1bmN0aW9uIGRldGFjaE1hcmtlZFNwYW5zKGxpbmUpIHsKICBsZXQgc3BhbnMgPSBsaW5lLm1hcmtlZFNwYW5zCiAgaWYgKCFzcGFucykgcmV0dXJuCiAgZm9yIChsZXQgaSA9IDA7IGkgPCBzcGFucy5sZW5ndGg7ICsraSkKICAgIHNwYW5zW2ldLm1hcmtlci5kZXRhY2hMaW5lKGxpbmUpCiAgbGluZS5tYXJrZWRTcGFucyA9IG51bGwKfQpleHBvcnQgZnVuY3Rpb24gYXR0YWNoTWFya2VkU3BhbnMobGluZSwgc3BhbnMpIHsKICBpZiAoIXNwYW5zKSByZXR1cm4KICBmb3IgKGxldCBpID0gMDsgaSA8IHNwYW5zLmxlbmd0aDsgKytpKQogICAgc3BhbnNbaV0ubWFya2VyLmF0dGFjaExpbmUobGluZSkKICBsaW5lLm1hcmtlZFNwYW5zID0gc3BhbnMKfQoKLy8gSGVscGVycyB1c2VkIHdoZW4gY29tcHV0aW5nIHdoaWNoIG92ZXJsYXBwaW5nIGNvbGxhcHNlZCBzcGFuCi8vIGNvdW50cyBhcyB0aGUgbGFyZ2VyIG9uZS4KZnVuY3Rpb24gZXh0cmFMZWZ0KG1hcmtlcikgeyByZXR1cm4gbWFya2VyLmluY2x1c2l2ZUxlZnQgPyAtMSA6IDAgfQpmdW5jdGlvbiBleHRyYVJpZ2h0KG1hcmtlcikgeyByZXR1cm4gbWFya2VyLmluY2x1c2l2ZVJpZ2h0ID8gMSA6IDAgfQoKLy8gUmV0dXJucyBhIG51bWJlciBpbmRpY2F0aW5nIHdoaWNoIG9mIHR3byBvdmVybGFwcGluZyBjb2xsYXBzZWQKLy8gc3BhbnMgaXMgbGFyZ2VyIChhbmQgdGh1cyBpbmNsdWRlcyB0aGUgb3RoZXIpLiBGYWxscyBiYWNrIHRvCi8vIGNvbXBhcmluZyBpZHMgd2hlbiB0aGUgc3BhbnMgY292ZXIgZXhhY3RseSB0aGUgc2FtZSByYW5nZS4KZXhwb3J0IGZ1bmN0aW9uIGNvbXBhcmVDb2xsYXBzZWRNYXJrZXJzKGEsIGIpIHsKICBsZXQgbGVuRGlmZiA9IGEubGluZXMubGVuZ3RoIC0gYi5saW5lcy5sZW5ndGgKICBpZiAobGVuRGlmZiAhPSAwKSByZXR1cm4gbGVuRGlmZgogIGxldCBhUG9zID0gYS5maW5kKCksIGJQb3MgPSBiLmZpbmQoKQogIGxldCBmcm9tQ21wID0gY21wKGFQb3MuZnJvbSwgYlBvcy5mcm9tKSB8fCBleHRyYUxlZnQoYSkgLSBleHRyYUxlZnQoYikKICBpZiAoZnJvbUNtcCkgcmV0dXJuIC1mcm9tQ21wCiAgbGV0IHRvQ21wID0gY21wKGFQb3MudG8sIGJQb3MudG8pIHx8IGV4dHJhUmlnaHQoYSkgLSBleHRyYVJpZ2h0KGIpCiAgaWYgKHRvQ21wKSByZXR1cm4gdG9DbXAKICByZXR1cm4gYi5pZCAtIGEuaWQKfQoKLy8gRmluZCBvdXQgd2hldGhlciBhIGxpbmUgZW5kcyBvciBzdGFydHMgaW4gYSBjb2xsYXBzZWQgc3Bhbi4gSWYKLy8gc28sIHJldHVybiB0aGUgbWFya2VyIGZvciB0aGF0IHNwYW4uCmZ1bmN0aW9uIGNvbGxhcHNlZFNwYW5BdFNpZGUobGluZSwgc3RhcnQpIHsKICBsZXQgc3BzID0gc2F3Q29sbGFwc2VkU3BhbnMgJiYgbGluZS5tYXJrZWRTcGFucywgZm91bmQKICBpZiAoc3BzKSBmb3IgKGxldCBzcCwgaSA9IDA7IGkgPCBzcHMubGVuZ3RoOyArK2kpIHsKICAgIHNwID0gc3BzW2ldCiAgICBpZiAoc3AubWFya2VyLmNvbGxhcHNlZCAmJiAoc3RhcnQgPyBzcC5mcm9tIDogc3AudG8pID09IG51bGwgJiYKICAgICAgICAoIWZvdW5kIHx8IGNvbXBhcmVDb2xsYXBzZWRNYXJrZXJzKGZvdW5kLCBzcC5tYXJrZXIpIDwgMCkpCiAgICAgIGZvdW5kID0gc3AubWFya2VyCiAgfQogIHJldHVybiBmb3VuZAp9CmV4cG9ydCBmdW5jdGlvbiBjb2xsYXBzZWRTcGFuQXRTdGFydChsaW5lKSB7IHJldHVybiBjb2xsYXBzZWRTcGFuQXRTaWRlKGxpbmUsIHRydWUpIH0KZXhwb3J0IGZ1bmN0aW9uIGNvbGxhcHNlZFNwYW5BdEVuZChsaW5lKSB7IHJldHVybiBjb2xsYXBzZWRTcGFuQXRTaWRlKGxpbmUsIGZhbHNlKSB9CgovLyBUZXN0IHdoZXRoZXIgdGhlcmUgZXhpc3RzIGEgY29sbGFwc2VkIHNwYW4gdGhhdCBwYXJ0aWFsbHkKLy8gb3ZlcmxhcHMgKGNvdmVycyB0aGUgc3RhcnQgb3IgZW5kLCBidXQgbm90IGJvdGgpIG9mIGEgbmV3IHNwYW4uCi8vIFN1Y2ggb3ZlcmxhcCBpcyBub3QgYWxsb3dlZC4KZXhwb3J0IGZ1bmN0aW9uIGNvbmZsaWN0aW5nQ29sbGFwc2VkUmFuZ2UoZG9jLCBsaW5lTm8sIGZyb20sIHRvLCBtYXJrZXIpIHsKICBsZXQgbGluZSA9IGdldExpbmUoZG9jLCBsaW5lTm8pCiAgbGV0IHNwcyA9IHNhd0NvbGxhcHNlZFNwYW5zICYmIGxpbmUubWFya2VkU3BhbnMKICBpZiAoc3BzKSBmb3IgKGxldCBpID0gMDsgaSA8IHNwcy5sZW5ndGg7ICsraSkgewogICAgbGV0IHNwID0gc3BzW2ldCiAgICBpZiAoIXNwLm1hcmtlci5jb2xsYXBzZWQpIGNvbnRpbnVlCiAgICBsZXQgZm91bmQgPSBzcC5tYXJrZXIuZmluZCgwKQogICAgbGV0IGZyb21DbXAgPSBjbXAoZm91bmQuZnJvbSwgZnJvbSkgfHwgZXh0cmFMZWZ0KHNwLm1hcmtlcikgLSBleHRyYUxlZnQobWFya2VyKQogICAgbGV0IHRvQ21wID0gY21wKGZvdW5kLnRvLCB0bykgfHwgZXh0cmFSaWdodChzcC5tYXJrZXIpIC0gZXh0cmFSaWdodChtYXJrZXIpCiAgICBpZiAoZnJvbUNtcCA+PSAwICYmIHRvQ21wIDw9IDAgfHwgZnJvbUNtcCA8PSAwICYmIHRvQ21wID49IDApIGNvbnRpbnVlCiAgICBpZiAoZnJvbUNtcCA8PSAwICYmIChzcC5tYXJrZXIuaW5jbHVzaXZlUmlnaHQgJiYgbWFya2VyLmluY2x1c2l2ZUxlZnQgPyBjbXAoZm91bmQudG8sIGZyb20pID49IDAgOiBjbXAoZm91bmQudG8sIGZyb20pID4gMCkgfHwKICAgICAgICBmcm9tQ21wID49IDAgJiYgKHNwLm1hcmtlci5pbmNsdXNpdmVSaWdodCAmJiBtYXJrZXIuaW5jbHVzaXZlTGVmdCA/IGNtcChmb3VuZC5mcm9tLCB0bykgPD0gMCA6IGNtcChmb3VuZC5mcm9tLCB0bykgPCAwKSkKICAgICAgcmV0dXJuIHRydWUKICB9Cn0KCi8vIEEgdmlzdWFsIGxpbmUgaXMgYSBsaW5lIGFzIGRyYXduIG9uIHRoZSBzY3JlZW4uIEZvbGRpbmcsIGZvcgovLyBleGFtcGxlLCBjYW4gY2F1c2UgbXVsdGlwbGUgbG9naWNhbCBsaW5lcyB0byBhcHBlYXIgb24gdGhlIHNhbWUKLy8gdmlzdWFsIGxpbmUuIFRoaXMgZmluZHMgdGhlIHN0YXJ0IG9mIHRoZSB2aXN1YWwgbGluZSB0aGF0IHRoZQovLyBnaXZlbiBsaW5lIGlzIHBhcnQgb2YgKHVzdWFsbHkgdGhhdCBpcyB0aGUgbGluZSBpdHNlbGYpLgpleHBvcnQgZnVuY3Rpb24gdmlzdWFsTGluZShsaW5lKSB7CiAgbGV0IG1lcmdlZAogIHdoaWxlIChtZXJnZWQgPSBjb2xsYXBzZWRTcGFuQXRTdGFydChsaW5lKSkKICAgIGxpbmUgPSBtZXJnZWQuZmluZCgtMSwgdHJ1ZSkubGluZQogIHJldHVybiBsaW5lCn0KCi8vIFJldHVybnMgYW4gYXJyYXkgb2YgbG9naWNhbCBsaW5lcyB0aGF0IGNvbnRpbnVlIHRoZSB2aXN1YWwgbGluZQovLyBzdGFydGVkIGJ5IHRoZSBhcmd1bWVudCwgb3IgdW5kZWZpbmVkIGlmIHRoZXJlIGFyZSBubyBzdWNoIGxpbmVzLgpleHBvcnQgZnVuY3Rpb24gdmlzdWFsTGluZUNvbnRpbnVlZChsaW5lKSB7CiAgbGV0IG1lcmdlZCwgbGluZXMKICB3aGlsZSAobWVyZ2VkID0gY29sbGFwc2VkU3BhbkF0RW5kKGxpbmUpKSB7CiAgICBsaW5lID0gbWVyZ2VkLmZpbmQoMSwgdHJ1ZSkubGluZQogICAgOyhsaW5lcyB8fCAobGluZXMgPSBbXSkpLnB1c2gobGluZSkKICB9CiAgcmV0dXJuIGxpbmVzCn0KCi8vIEdldCB0aGUgbGluZSBudW1iZXIgb2YgdGhlIHN0YXJ0IG9mIHRoZSB2aXN1YWwgbGluZSB0aGF0IHRoZQovLyBnaXZlbiBsaW5lIG51bWJlciBpcyBwYXJ0IG9mLgpleHBvcnQgZnVuY3Rpb24gdmlzdWFsTGluZU5vKGRvYywgbGluZU4pIHsKICBsZXQgbGluZSA9IGdldExpbmUoZG9jLCBsaW5lTiksIHZpcyA9IHZpc3VhbExpbmUobGluZSkKICBpZiAobGluZSA9PSB2aXMpIHJldHVybiBsaW5lTgogIHJldHVybiBsaW5lTm8odmlzKQp9CgovLyBHZXQgdGhlIGxpbmUgbnVtYmVyIG9mIHRoZSBzdGFydCBvZiB0aGUgbmV4dCB2aXN1YWwgbGluZSBhZnRlcgovLyB0aGUgZ2l2ZW4gbGluZS4KZXhwb3J0IGZ1bmN0aW9uIHZpc3VhbExpbmVFbmRObyhkb2MsIGxpbmVOKSB7CiAgaWYgKGxpbmVOID4gZG9jLmxhc3RMaW5lKCkpIHJldHVybiBsaW5lTgogIGxldCBsaW5lID0gZ2V0TGluZShkb2MsIGxpbmVOKSwgbWVyZ2VkCiAgaWYgKCFsaW5lSXNIaWRkZW4oZG9jLCBsaW5lKSkgcmV0dXJuIGxpbmVOCiAgd2hpbGUgKG1lcmdlZCA9IGNvbGxhcHNlZFNwYW5BdEVuZChsaW5lKSkKICAgIGxpbmUgPSBtZXJnZWQuZmluZCgxLCB0cnVlKS5saW5lCiAgcmV0dXJuIGxpbmVObyhsaW5lKSArIDEKfQoKLy8gQ29tcHV0ZSB3aGV0aGVyIGEgbGluZSBpcyBoaWRkZW4uIExpbmVzIGNvdW50IGFzIGhpZGRlbiB3aGVuIHRoZXkKLy8gYXJlIHBhcnQgb2YgYSB2aXN1YWwgbGluZSB0aGF0IHN0YXJ0cyB3aXRoIGFub3RoZXIgbGluZSwgb3Igd2hlbgovLyB0aGV5IGFyZSBlbnRpcmVseSBjb3ZlcmVkIGJ5IGNvbGxhcHNlZCwgbm9uLXdpZGdldCBzcGFuLgpleHBvcnQgZnVuY3Rpb24gbGluZUlzSGlkZGVuKGRvYywgbGluZSkgewogIGxldCBzcHMgPSBzYXdDb2xsYXBzZWRTcGFucyAmJiBsaW5lLm1hcmtlZFNwYW5zCiAgaWYgKHNwcykgZm9yIChsZXQgc3AsIGkgPSAwOyBpIDwgc3BzLmxlbmd0aDsgKytpKSB7CiAgICBzcCA9IHNwc1tpXQogICAgaWYgKCFzcC5tYXJrZXIuY29sbGFwc2VkKSBjb250aW51ZQogICAgaWYgKHNwLmZyb20gPT0gbnVsbCkgcmV0dXJuIHRydWUKICAgIGlmIChzcC5tYXJrZXIud2lkZ2V0Tm9kZSkgY29udGludWUKICAgIGlmIChzcC5mcm9tID09IDAgJiYgc3AubWFya2VyLmluY2x1c2l2ZUxlZnQgJiYgbGluZUlzSGlkZGVuSW5uZXIoZG9jLCBsaW5lLCBzcCkpCiAgICAgIHJldHVybiB0cnVlCiAgfQp9CmZ1bmN0aW9uIGxpbmVJc0hpZGRlbklubmVyKGRvYywgbGluZSwgc3BhbikgewogIGlmIChzcGFuLnRvID09IG51bGwpIHsKICAgIGxldCBlbmQgPSBzcGFuLm1hcmtlci5maW5kKDEsIHRydWUpCiAgICByZXR1cm4gbGluZUlzSGlkZGVuSW5uZXIoZG9jLCBlbmQubGluZSwgZ2V0TWFya2VkU3BhbkZvcihlbmQubGluZS5tYXJrZWRTcGFucywgc3Bhbi5tYXJrZXIpKQogIH0KICBpZiAoc3Bhbi5tYXJrZXIuaW5jbHVzaXZlUmlnaHQgJiYgc3Bhbi50byA9PSBsaW5lLnRleHQubGVuZ3RoKQogICAgcmV0dXJuIHRydWUKICBmb3IgKGxldCBzcCwgaSA9IDA7IGkgPCBsaW5lLm1hcmtlZFNwYW5zLmxlbmd0aDsgKytpKSB7CiAgICBzcCA9IGxpbmUubWFya2VkU3BhbnNbaV0KICAgIGlmIChzcC5tYXJrZXIuY29sbGFwc2VkICYmICFzcC5tYXJrZXIud2lkZ2V0Tm9kZSAmJiBzcC5mcm9tID09IHNwYW4udG8gJiYKICAgICAgICAoc3AudG8gPT0gbnVsbCB8fCBzcC50byAhPSBzcGFuLmZyb20pICYmCiAgICAgICAgKHNwLm1hcmtlci5pbmNsdXNpdmVMZWZ0IHx8IHNwYW4ubWFya2VyLmluY2x1c2l2ZVJpZ2h0KSAmJgogICAgICAgIGxpbmVJc0hpZGRlbklubmVyKGRvYywgbGluZSwgc3ApKSByZXR1cm4gdHJ1ZQogIH0KfQoKLy8gRmluZCB0aGUgaGVpZ2h0IGFib3ZlIHRoZSBnaXZlbiBsaW5lLgpleHBvcnQgZnVuY3Rpb24gaGVpZ2h0QXRMaW5lKGxpbmVPYmopIHsKICBsaW5lT2JqID0gdmlzdWFsTGluZShsaW5lT2JqKQoKICBsZXQgaCA9IDAsIGNodW5rID0gbGluZU9iai5wYXJlbnQKICBmb3IgKGxldCBpID0gMDsgaSA8IGNodW5rLmxpbmVzLmxlbmd0aDsgKytpKSB7CiAgICBsZXQgbGluZSA9IGNodW5rLmxpbmVzW2ldCiAgICBpZiAobGluZSA9PSBsaW5lT2JqKSBicmVhawogICAgZWxzZSBoICs9IGxpbmUuaGVpZ2h0CiAgfQogIGZvciAobGV0IHAgPSBjaHVuay5wYXJlbnQ7IHA7IGNodW5rID0gcCwgcCA9IGNodW5rLnBhcmVudCkgewogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwLmNoaWxkcmVuLmxlbmd0aDsgKytpKSB7CiAgICAgIGxldCBjdXIgPSBwLmNoaWxkcmVuW2ldCiAgICAgIGlmIChjdXIgPT0gY2h1bmspIGJyZWFrCiAgICAgIGVsc2UgaCArPSBjdXIuaGVpZ2h0CiAgICB9CiAgfQogIHJldHVybiBoCn0KCi8vIENvbXB1dGUgdGhlIGNoYXJhY3RlciBsZW5ndGggb2YgYSBsaW5lLCB0YWtpbmcgaW50byBhY2NvdW50Ci8vIGNvbGxhcHNlZCByYW5nZXMgKHNlZSBtYXJrVGV4dCkgdGhhdCBtaWdodCBoaWRlIHBhcnRzLCBhbmQgam9pbgovLyBvdGhlciBsaW5lcyBvbnRvIGl0LgpleHBvcnQgZnVuY3Rpb24gbGluZUxlbmd0aChsaW5lKSB7CiAgaWYgKGxpbmUuaGVpZ2h0ID09IDApIHJldHVybiAwCiAgbGV0IGxlbiA9IGxpbmUudGV4dC5sZW5ndGgsIG1lcmdlZCwgY3VyID0gbGluZQogIHdoaWxlIChtZXJnZWQgPSBjb2xsYXBzZWRTcGFuQXRTdGFydChjdXIpKSB7CiAgICBsZXQgZm91bmQgPSBtZXJnZWQuZmluZCgwLCB0cnVlKQogICAgY3VyID0gZm91bmQuZnJvbS5saW5lCiAgICBsZW4gKz0gZm91bmQuZnJvbS5jaCAtIGZvdW5kLnRvLmNoCiAgfQogIGN1ciA9IGxpbmUKICB3aGlsZSAobWVyZ2VkID0gY29sbGFwc2VkU3BhbkF0RW5kKGN1cikpIHsKICAgIGxldCBmb3VuZCA9IG1lcmdlZC5maW5kKDAsIHRydWUpCiAgICBsZW4gLT0gY3VyLnRleHQubGVuZ3RoIC0gZm91bmQuZnJvbS5jaAogICAgY3VyID0gZm91bmQudG8ubGluZQogICAgbGVuICs9IGN1ci50ZXh0Lmxlbmd0aCAtIGZvdW5kLnRvLmNoCiAgfQogIHJldHVybiBsZW4KfQoKLy8gRmluZCB0aGUgbG9uZ2VzdCBsaW5lIGluIHRoZSBkb2N1bWVudC4KZXhwb3J0IGZ1bmN0aW9uIGZpbmRNYXhMaW5lKGNtKSB7CiAgbGV0IGQgPSBjbS5kaXNwbGF5LCBkb2MgPSBjbS5kb2MKICBkLm1heExpbmUgPSBnZXRMaW5lKGRvYywgZG9jLmZpcnN0KQogIGQubWF4TGluZUxlbmd0aCA9IGxpbmVMZW5ndGgoZC5tYXhMaW5lKQogIGQubWF4TGluZUNoYW5nZWQgPSB0cnVlCiAgZG9jLml0ZXIobGluZSA9PiB7CiAgICBsZXQgbGVuID0gbGluZUxlbmd0aChsaW5lKQogICAgaWYgKGxlbiA+IGQubWF4TGluZUxlbmd0aCkgewogICAgICBkLm1heExpbmVMZW5ndGggPSBsZW4KICAgICAgZC5tYXhMaW5lID0gbGluZQogICAgfQogIH0pCn0K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/src/line/utils_line.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aW1wb3J0IHsgaW5kZXhPZiB9IGZyb20gIi4uL3V0aWwvbWlzYyIKCi8vIEZpbmQgdGhlIGxpbmUgb2JqZWN0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGxpbmUgbnVtYmVyLgpleHBvcnQgZnVuY3Rpb24gZ2V0TGluZShkb2MsIG4pIHsKICBuIC09IGRvYy5maXJzdAogIGlmIChuIDwgMCB8fCBuID49IGRvYy5zaXplKSB0aHJvdyBuZXcgRXJyb3IoIlRoZXJlIGlzIG5vIGxpbmUgIiArIChuICsgZG9jLmZpcnN0KSArICIgaW4gdGhlIGRvY3VtZW50LiIpCiAgbGV0IGNodW5rID0gZG9jCiAgd2hpbGUgKCFjaHVuay5saW5lcykgewogICAgZm9yIChsZXQgaSA9IDA7OyArK2kpIHsKICAgICAgbGV0IGNoaWxkID0gY2h1bmsuY2hpbGRyZW5baV0sIHN6ID0gY2hpbGQuY2h1bmtTaXplKCkKICAgICAgaWYgKG4gPCBzeikgeyBjaHVuayA9IGNoaWxkOyBicmVhayB9CiAgICAgIG4gLT0gc3oKICAgIH0KICB9CiAgcmV0dXJuIGNodW5rLmxpbmVzW25dCn0KCi8vIEdldCB0aGUgcGFydCBvZiBhIGRvY3VtZW50IGJldHdlZW4gdHdvIHBvc2l0aW9ucywgYXMgYW4gYXJyYXkgb2YKLy8gc3RyaW5ncy4KZXhwb3J0IGZ1bmN0aW9uIGdldEJldHdlZW4oZG9jLCBzdGFydCwgZW5kKSB7CiAgbGV0IG91dCA9IFtdLCBuID0gc3RhcnQubGluZQogIGRvYy5pdGVyKHN0YXJ0LmxpbmUsIGVuZC5saW5lICsgMSwgbGluZSA9PiB7CiAgICBsZXQgdGV4dCA9IGxpbmUudGV4dAogICAgaWYgKG4gPT0gZW5kLmxpbmUpIHRleHQgPSB0ZXh0LnNsaWNlKDAsIGVuZC5jaCkKICAgIGlmIChuID09IHN0YXJ0LmxpbmUpIHRleHQgPSB0ZXh0LnNsaWNlKHN0YXJ0LmNoKQogICAgb3V0LnB1c2godGV4dCkKICAgICsrbgogIH0pCiAgcmV0dXJuIG91dAp9Ci8vIEdldCB0aGUgbGluZXMgYmV0d2VlbiBmcm9tIGFuZCB0bywgYXMgYXJyYXkgb2Ygc3RyaW5ncy4KZXhwb3J0IGZ1bmN0aW9uIGdldExpbmVzKGRvYywgZnJvbSwgdG8pIHsKICBsZXQgb3V0ID0gW10KICBkb2MuaXRlcihmcm9tLCB0bywgbGluZSA9PiB7IG91dC5wdXNoKGxpbmUudGV4dCkgfSkgLy8gaXRlciBhYm9ydHMgd2hlbiBjYWxsYmFjayByZXR1cm5zIHRydXRoeSB2YWx1ZQogIHJldHVybiBvdXQKfQoKLy8gVXBkYXRlIHRoZSBoZWlnaHQgb2YgYSBsaW5lLCBwcm9wYWdhdGluZyB0aGUgaGVpZ2h0IGNoYW5nZQovLyB1cHdhcmRzIHRvIHBhcmVudCBub2Rlcy4KZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUxpbmVIZWlnaHQobGluZSwgaGVpZ2h0KSB7CiAgbGV0IGRpZmYgPSBoZWlnaHQgLSBsaW5lLmhlaWdodAogIGlmIChkaWZmKSBmb3IgKGxldCBuID0gbGluZTsgbjsgbiA9IG4ucGFyZW50KSBuLmhlaWdodCArPSBkaWZmCn0KCi8vIEdpdmVuIGEgbGluZSBvYmplY3QsIGZpbmQgaXRzIGxpbmUgbnVtYmVyIGJ5IHdhbGtpbmcgdXAgdGhyb3VnaAovLyBpdHMgcGFyZW50IGxpbmtzLgpleHBvcnQgZnVuY3Rpb24gbGluZU5vKGxpbmUpIHsKICBpZiAobGluZS5wYXJlbnQgPT0gbnVsbCkgcmV0dXJuIG51bGwKICBsZXQgY3VyID0gbGluZS5wYXJlbnQsIG5vID0gaW5kZXhPZihjdXIubGluZXMsIGxpbmUpCiAgZm9yIChsZXQgY2h1bmsgPSBjdXIucGFyZW50OyBjaHVuazsgY3VyID0gY2h1bmssIGNodW5rID0gY2h1bmsucGFyZW50KSB7CiAgICBmb3IgKGxldCBpID0gMDs7ICsraSkgewogICAgICBpZiAoY2h1bmsuY2hpbGRyZW5baV0gPT0gY3VyKSBicmVhawogICAgICBubyArPSBjaHVuay5jaGlsZHJlbltpXS5jaHVua1NpemUoKQogICAgfQogIH0KICByZXR1cm4gbm8gKyBjdXIuZmlyc3QKfQoKLy8gRmluZCB0aGUgbGluZSBhdCB0aGUgZ2l2ZW4gdmVydGljYWwgcG9zaXRpb24sIHVzaW5nIHRoZSBoZWlnaHQKLy8gaW5mb3JtYXRpb24gaW4gdGhlIGRvY3VtZW50IHRyZWUuCmV4cG9ydCBmdW5jdGlvbiBsaW5lQXRIZWlnaHQoY2h1bmssIGgpIHsKICBsZXQgbiA9IGNodW5rLmZpcnN0CiAgb3V0ZXI6IGRvIHsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2h1bmsuY2hpbGRyZW4ubGVuZ3RoOyArK2kpIHsKICAgICAgbGV0IGNoaWxkID0gY2h1bmsuY2hpbGRyZW5baV0sIGNoID0gY2hpbGQuaGVpZ2h0CiAgICAgIGlmIChoIDwgY2gpIHsgY2h1bmsgPSBjaGlsZDsgY29udGludWUgb3V0ZXIgfQogICAgICBoIC09IGNoCiAgICAgIG4gKz0gY2hpbGQuY2h1bmtTaXplKCkKICAgIH0KICAgIHJldHVybiBuCiAgfSB3aGlsZSAoIWNodW5rLmxpbmVzKQogIGxldCBpID0gMAogIGZvciAoOyBpIDwgY2h1bmsubGluZXMubGVuZ3RoOyArK2kpIHsKICAgIGxldCBsaW5lID0gY2h1bmsubGluZXNbaV0sIGxoID0gbGluZS5oZWlnaHQKICAgIGlmIChoIDwgbGgpIGJyZWFrCiAgICBoIC09IGxoCiAgfQogIHJldHVybiBuICsgaQp9CgpleHBvcnQgZnVuY3Rpb24gaXNMaW5lKGRvYywgbCkge3JldHVybiBsID49IGRvYy5maXJzdCAmJiBsIDwgZG9jLmZpcnN0ICsgZG9jLnNpemV9CgpleHBvcnQgZnVuY3Rpb24gbGluZU51bWJlckZvcihvcHRpb25zLCBpKSB7CiAgcmV0dXJuIFN0cmluZyhvcHRpb25zLmxpbmVOdW1iZXJGb3JtYXR0ZXIoaSArIG9wdGlvbnMuZmlyc3RMaW5lTnVtYmVyKSkKfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/src/measurement/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/src/measurement/position_measurement.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aW1wb3J0IHsgYnVpbGRMaW5lQ29udGVudCwgTGluZVZpZXcgfSBmcm9tICIuLi9saW5lL2xpbmVfZGF0YSIKaW1wb3J0IHsgY2xpcFBvcywgUG9zIH0gZnJvbSAiLi4vbGluZS9wb3MiCmltcG9ydCB7IGNvbGxhcHNlZFNwYW5BdEVuZCwgaGVpZ2h0QXRMaW5lLCBsaW5lSXNIaWRkZW4sIHZpc3VhbExpbmUgfSBmcm9tICIuLi9saW5lL3NwYW5zIgppbXBvcnQgeyBnZXRMaW5lLCBsaW5lQXRIZWlnaHQsIGxpbmVObywgdXBkYXRlTGluZUhlaWdodCB9IGZyb20gIi4uL2xpbmUvdXRpbHNfbGluZSIKaW1wb3J0IHsgYmlkaUxlZnQsIGJpZGlSaWdodCwgYmlkaU90aGVyLCBnZXRCaWRpUGFydEF0LCBnZXRPcmRlciwgbGluZUxlZnQsIGxpbmVSaWdodCwgbW92ZVZpc3VhbGx5IH0gZnJvbSAiLi4vdXRpbC9iaWRpIgppbXBvcnQgeyBpZSwgaWVfdmVyc2lvbiB9IGZyb20gIi4uL3V0aWwvYnJvd3NlciIKaW1wb3J0IHsgZWx0LCByZW1vdmVDaGlsZHJlbiwgcmFuZ2UsIHJlbW92ZUNoaWxkcmVuQW5kQWRkIH0gZnJvbSAiLi4vdXRpbC9kb20iCmltcG9ydCB7IGVfdGFyZ2V0IH0gZnJvbSAiLi4vdXRpbC9ldmVudCIKaW1wb3J0IHsgaGFzQmFkWm9vbWVkUmVjdHMgfSBmcm9tICIuLi91dGlsL2ZlYXR1cmVfZGV0ZWN0aW9uIgppbXBvcnQgeyBjb3VudENvbHVtbiwgaXNFeHRlbmRpbmdDaGFyLCBzY3JvbGxlckdhcCB9IGZyb20gIi4uL3V0aWwvbWlzYyIKaW1wb3J0IHsgdXBkYXRlTGluZUZvckNoYW5nZXMgfSBmcm9tICIuLi9kaXNwbGF5L3VwZGF0ZV9saW5lIgoKaW1wb3J0IHsgd2lkZ2V0SGVpZ2h0IH0gZnJvbSAiLi93aWRnZXRzIgoKLy8gUE9TSVRJT04gTUVBU1VSRU1FTlQKCmV4cG9ydCBmdW5jdGlvbiBwYWRkaW5nVG9wKGRpc3BsYXkpIHtyZXR1cm4gZGlzcGxheS5saW5lU3BhY2Uub2Zmc2V0VG9wfQpleHBvcnQgZnVuY3Rpb24gcGFkZGluZ1ZlcnQoZGlzcGxheSkge3JldHVybiBkaXNwbGF5Lm1vdmVyLm9mZnNldEhlaWdodCAtIGRpc3BsYXkubGluZVNwYWNlLm9mZnNldEhlaWdodH0KZXhwb3J0IGZ1bmN0aW9uIHBhZGRpbmdIKGRpc3BsYXkpIHsKICBpZiAoZGlzcGxheS5jYWNoZWRQYWRkaW5nSCkgcmV0dXJuIGRpc3BsYXkuY2FjaGVkUGFkZGluZ0gKICBsZXQgZSA9IHJlbW92ZUNoaWxkcmVuQW5kQWRkKGRpc3BsYXkubWVhc3VyZSwgZWx0KCJwcmUiLCAieCIpKQogIGxldCBzdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlID8gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZSkgOiBlLmN1cnJlbnRTdHlsZQogIGxldCBkYXRhID0ge2xlZnQ6IHBhcnNlSW50KHN0eWxlLnBhZGRpbmdMZWZ0KSwgcmlnaHQ6IHBhcnNlSW50KHN0eWxlLnBhZGRpbmdSaWdodCl9CiAgaWYgKCFpc05hTihkYXRhLmxlZnQpICYmICFpc05hTihkYXRhLnJpZ2h0KSkgZGlzcGxheS5jYWNoZWRQYWRkaW5nSCA9IGRhdGEKICByZXR1cm4gZGF0YQp9CgpleHBvcnQgZnVuY3Rpb24gc2Nyb2xsR2FwKGNtKSB7IHJldHVybiBzY3JvbGxlckdhcCAtIGNtLmRpc3BsYXkubmF0aXZlQmFyV2lkdGggfQpleHBvcnQgZnVuY3Rpb24gZGlzcGxheVdpZHRoKGNtKSB7CiAgcmV0dXJuIGNtLmRpc3BsYXkuc2Nyb2xsZXIuY2xpZW50V2lkdGggLSBzY3JvbGxHYXAoY20pIC0gY20uZGlzcGxheS5iYXJXaWR0aAp9CmV4cG9ydCBmdW5jdGlvbiBkaXNwbGF5SGVpZ2h0KGNtKSB7CiAgcmV0dXJuIGNtLmRpc3BsYXkuc2Nyb2xsZXIuY2xpZW50SGVpZ2h0IC0gc2Nyb2xsR2FwKGNtKSAtIGNtLmRpc3BsYXkuYmFySGVpZ2h0Cn0KCi8vIEVuc3VyZSB0aGUgbGluZVZpZXcud3JhcHBpbmcuaGVpZ2h0cyBhcnJheSBpcyBwb3B1bGF0ZWQuIFRoaXMgaXMKLy8gYW4gYXJyYXkgb2YgYm90dG9tIG9mZnNldHMgZm9yIHRoZSBsaW5lcyB0aGF0IG1ha2UgdXAgYSBkcmF3bgovLyBsaW5lLiBXaGVuIGxpbmVXcmFwcGluZyBpcyBvbiwgdGhlcmUgbWlnaHQgYmUgbW9yZSB0aGFuIG9uZQovLyBoZWlnaHQuCmZ1bmN0aW9uIGVuc3VyZUxpbmVIZWlnaHRzKGNtLCBsaW5lVmlldywgcmVjdCkgewogIGxldCB3cmFwcGluZyA9IGNtLm9wdGlvbnMubGluZVdyYXBwaW5nCiAgbGV0IGN1cldpZHRoID0gd3JhcHBpbmcgJiYgZGlzcGxheVdpZHRoKGNtKQogIGlmICghbGluZVZpZXcubWVhc3VyZS5oZWlnaHRzIHx8IHdyYXBwaW5nICYmIGxpbmVWaWV3Lm1lYXN1cmUud2lkdGggIT0gY3VyV2lkdGgpIHsKICAgIGxldCBoZWlnaHRzID0gbGluZVZpZXcubWVhc3VyZS5oZWlnaHRzID0gW10KICAgIGlmICh3cmFwcGluZykgewogICAgICBsaW5lVmlldy5tZWFzdXJlLndpZHRoID0gY3VyV2lkdGgKICAgICAgbGV0IHJlY3RzID0gbGluZVZpZXcudGV4dC5maXJzdENoaWxkLmdldENsaWVudFJlY3RzKCkKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZWN0cy5sZW5ndGggLSAxOyBpKyspIHsKICAgICAgICBsZXQgY3VyID0gcmVjdHNbaV0sIG5leHQgPSByZWN0c1tpICsgMV0KICAgICAgICBpZiAoTWF0aC5hYnMoY3VyLmJvdHRvbSAtIG5leHQuYm90dG9tKSA+IDIpCiAgICAgICAgICBoZWlnaHRzLnB1c2goKGN1ci5ib3R0b20gKyBuZXh0LnRvcCkgLyAyIC0gcmVjdC50b3ApCiAgICAgIH0KICAgIH0KICAgIGhlaWdodHMucHVzaChyZWN0LmJvdHRvbSAtIHJlY3QudG9wKQogIH0KfQoKLy8gRmluZCBhIGxpbmUgbWFwIChtYXBwaW5nIGNoYXJhY3RlciBvZmZzZXRzIHRvIHRleHQgbm9kZXMpIGFuZCBhCi8vIG1lYXN1cmVtZW50IGNhY2hlIGZvciB0aGUgZ2l2ZW4gbGluZSBudW1iZXIuIChBIGxpbmUgdmlldyBtaWdodAovLyBjb250YWluIG11bHRpcGxlIGxpbmVzIHdoZW4gY29sbGFwc2VkIHJhbmdlcyBhcmUgcHJlc2VudC4pCmV4cG9ydCBmdW5jdGlvbiBtYXBGcm9tTGluZVZpZXcobGluZVZpZXcsIGxpbmUsIGxpbmVOKSB7CiAgaWYgKGxpbmVWaWV3LmxpbmUgPT0gbGluZSkKICAgIHJldHVybiB7bWFwOiBsaW5lVmlldy5tZWFzdXJlLm1hcCwgY2FjaGU6IGxpbmVWaWV3Lm1lYXN1cmUuY2FjaGV9CiAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lVmlldy5yZXN0Lmxlbmd0aDsgaSsrKQogICAgaWYgKGxpbmVWaWV3LnJlc3RbaV0gPT0gbGluZSkKICAgICAgcmV0dXJuIHttYXA6IGxpbmVWaWV3Lm1lYXN1cmUubWFwc1tpXSwgY2FjaGU6IGxpbmVWaWV3Lm1lYXN1cmUuY2FjaGVzW2ldfQogIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZVZpZXcucmVzdC5sZW5ndGg7IGkrKykKICAgIGlmIChsaW5lTm8obGluZVZpZXcucmVzdFtpXSkgPiBsaW5lTikKICAgICAgcmV0dXJuIHttYXA6IGxpbmVWaWV3Lm1lYXN1cmUubWFwc1tpXSwgY2FjaGU6IGxpbmVWaWV3Lm1lYXN1cmUuY2FjaGVzW2ldLCBiZWZvcmU6IHRydWV9Cn0KCi8vIFJlbmRlciBhIGxpbmUgaW50byB0aGUgaGlkZGVuIG5vZGUgZGlzcGxheS5leHRlcm5hbE1lYXN1cmVkLiBVc2VkCi8vIHdoZW4gbWVhc3VyZW1lbnQgaXMgbmVlZGVkIGZvciBhIGxpbmUgdGhhdCdzIG5vdCBpbiB0aGUgdmlld3BvcnQuCmZ1bmN0aW9uIHVwZGF0ZUV4dGVybmFsTWVhc3VyZW1lbnQoY20sIGxpbmUpIHsKICBsaW5lID0gdmlzdWFsTGluZShsaW5lKQogIGxldCBsaW5lTiA9IGxpbmVObyhsaW5lKQogIGxldCB2aWV3ID0gY20uZGlzcGxheS5leHRlcm5hbE1lYXN1cmVkID0gbmV3IExpbmVWaWV3KGNtLmRvYywgbGluZSwgbGluZU4pCiAgdmlldy5saW5lTiA9IGxpbmVOCiAgbGV0IGJ1aWx0ID0gdmlldy5idWlsdCA9IGJ1aWxkTGluZUNvbnRlbnQoY20sIHZpZXcpCiAgdmlldy50ZXh0ID0gYnVpbHQucHJlCiAgcmVtb3ZlQ2hpbGRyZW5BbmRBZGQoY20uZGlzcGxheS5saW5lTWVhc3VyZSwgYnVpbHQucHJlKQogIHJldHVybiB2aWV3Cn0KCi8vIEdldCBhIHt0b3AsIGJvdHRvbSwgbGVmdCwgcmlnaHR9IGJveCAoaW4gbGluZS1sb2NhbCBjb29yZGluYXRlcykKLy8gZm9yIGEgZ2l2ZW4gY2hhcmFjdGVyLgpleHBvcnQgZnVuY3Rpb24gbWVhc3VyZUNoYXIoY20sIGxpbmUsIGNoLCBiaWFzKSB7CiAgcmV0dXJuIG1lYXN1cmVDaGFyUHJlcGFyZWQoY20sIHByZXBhcmVNZWFzdXJlRm9yTGluZShjbSwgbGluZSksIGNoLCBiaWFzKQp9CgovLyBGaW5kIGEgbGluZSB2aWV3IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGdpdmVuIGxpbmUgbnVtYmVyLgpleHBvcnQgZnVuY3Rpb24gZmluZFZpZXdGb3JMaW5lKGNtLCBsaW5lTikgewogIGlmIChsaW5lTiA+PSBjbS5kaXNwbGF5LnZpZXdGcm9tICYmIGxpbmVOIDwgY20uZGlzcGxheS52aWV3VG8pCiAgICByZXR1cm4gY20uZGlzcGxheS52aWV3W2ZpbmRWaWV3SW5kZXgoY20sIGxpbmVOKV0KICBsZXQgZXh0ID0gY20uZGlzcGxheS5leHRlcm5hbE1lYXN1cmVkCiAgaWYgKGV4dCAmJiBsaW5lTiA+PSBleHQubGluZU4gJiYgbGluZU4gPCBleHQubGluZU4gKyBleHQuc2l6ZSkKICAgIHJldHVybiBleHQKfQoKLy8gTWVhc3VyZW1lbnQgY2FuIGJlIHNwbGl0IGluIHR3byBzdGVwcywgdGhlIHNldC11cCB3b3JrIHRoYXQKLy8gYXBwbGllcyB0byB0aGUgd2hvbGUgbGluZSwgYW5kIHRoZSBtZWFzdXJlbWVudCBvZiB0aGUgYWN0dWFsCi8vIGNoYXJhY3Rlci4gRnVuY3Rpb25zIGxpa2UgY29vcmRzQ2hhciwgdGhhdCBuZWVkIHRvIGRvIGEgbG90IG9mCi8vIG1lYXN1cmVtZW50cyBpbiBhIHJvdywgY2FuIHRodXMgZW5zdXJlIHRoYXQgdGhlIHNldC11cCB3b3JrIGlzCi8vIG9ubHkgZG9uZSBvbmNlLgpmdW5jdGlvbiBwcmVwYXJlTWVhc3VyZUZvckxpbmUoY20sIGxpbmUpIHsKICBsZXQgbGluZU4gPSBsaW5lTm8obGluZSkKICBsZXQgdmlldyA9IGZpbmRWaWV3Rm9yTGluZShjbSwgbGluZU4pCiAgaWYgKHZpZXcgJiYgIXZpZXcudGV4dCkgewogICAgdmlldyA9IG51bGwKICB9IGVsc2UgaWYgKHZpZXcgJiYgdmlldy5jaGFuZ2VzKSB7CiAgICB1cGRhdGVMaW5lRm9yQ2hhbmdlcyhjbSwgdmlldywgbGluZU4sIGdldERpbWVuc2lvbnMoY20pKQogICAgY20uY3VyT3AuZm9yY2VVcGRhdGUgPSB0cnVlCiAgfQogIGlmICghdmlldykKICAgIHZpZXcgPSB1cGRhdGVFeHRlcm5hbE1lYXN1cmVtZW50KGNtLCBsaW5lKQoKICBsZXQgaW5mbyA9IG1hcEZyb21MaW5lVmlldyh2aWV3LCBsaW5lLCBsaW5lTikKICByZXR1cm4gewogICAgbGluZTogbGluZSwgdmlldzogdmlldywgcmVjdDogbnVsbCwKICAgIG1hcDogaW5mby5tYXAsIGNhY2hlOiBpbmZvLmNhY2hlLCBiZWZvcmU6IGluZm8uYmVmb3JlLAogICAgaGFzSGVpZ2h0czogZmFsc2UKICB9Cn0KCi8vIEdpdmVuIGEgcHJlcGFyZWQgbWVhc3VyZW1lbnQgb2JqZWN0LCBtZWFzdXJlcyB0aGUgcG9zaXRpb24gb2YgYW4KLy8gYWN0dWFsIGNoYXJhY3RlciAob3IgZmV0Y2hlcyBpdCBmcm9tIHRoZSBjYWNoZSkuCmZ1bmN0aW9uIG1lYXN1cmVDaGFyUHJlcGFyZWQoY20sIHByZXBhcmVkLCBjaCwgYmlhcywgdmFySGVpZ2h0KSB7CiAgaWYgKHByZXBhcmVkLmJlZm9yZSkgY2ggPSAtMQogIGxldCBrZXkgPSBjaCArIChiaWFzIHx8ICIiKSwgZm91bmQKICBpZiAocHJlcGFyZWQuY2FjaGUuaGFzT3duUHJvcGVydHkoa2V5KSkgewogICAgZm91bmQgPSBwcmVwYXJlZC5jYWNoZVtrZXldCiAgfSBlbHNlIHsKICAgIGlmICghcHJlcGFyZWQucmVjdCkKICAgICAgcHJlcGFyZWQucmVjdCA9IHByZXBhcmVkLnZpZXcudGV4dC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKQogICAgaWYgKCFwcmVwYXJlZC5oYXNIZWlnaHRzKSB7CiAgICAgIGVuc3VyZUxpbmVIZWlnaHRzKGNtLCBwcmVwYXJlZC52aWV3LCBwcmVwYXJlZC5yZWN0KQogICAgICBwcmVwYXJlZC5oYXNIZWlnaHRzID0gdHJ1ZQogICAgfQogICAgZm91bmQgPSBtZWFzdXJlQ2hhcklubmVyKGNtLCBwcmVwYXJlZCwgY2gsIGJpYXMpCiAgICBpZiAoIWZvdW5kLmJvZ3VzKSBwcmVwYXJlZC5jYWNoZVtrZXldID0gZm91bmQKICB9CiAgcmV0dXJuIHtsZWZ0OiBmb3VuZC5sZWZ0LCByaWdodDogZm91bmQucmlnaHQsCiAgICAgICAgICB0b3A6IHZhckhlaWdodCA/IGZvdW5kLnJ0b3AgOiBmb3VuZC50b3AsCiAgICAgICAgICBib3R0b206IHZhckhlaWdodCA/IGZvdW5kLnJib3R0b20gOiBmb3VuZC5ib3R0b219Cn0KCmxldCBudWxsUmVjdCA9IHtsZWZ0OiAwLCByaWdodDogMCwgdG9wOiAwLCBib3R0b206IDB9CgpleHBvcnQgZnVuY3Rpb24gbm9kZUFuZE9mZnNldEluTGluZU1hcChtYXAsIGNoLCBiaWFzKSB7CiAgbGV0IG5vZGUsIHN0YXJ0LCBlbmQsIGNvbGxhcHNlLCBtU3RhcnQsIG1FbmQKICAvLyBGaXJzdCwgc2VhcmNoIHRoZSBsaW5lIG1hcCBmb3IgdGhlIHRleHQgbm9kZSBjb3JyZXNwb25kaW5nIHRvLAogIC8vIG9yIGNsb3Nlc3QgdG8sIHRoZSB0YXJnZXQgY2hhcmFjdGVyLgogIGZvciAobGV0IGkgPSAwOyBpIDwgbWFwLmxlbmd0aDsgaSArPSAzKSB7CiAgICBtU3RhcnQgPSBtYXBbaV0KICAgIG1FbmQgPSBtYXBbaSArIDFdCiAgICBpZiAoY2ggPCBtU3RhcnQpIHsKICAgICAgc3RhcnQgPSAwOyBlbmQgPSAxCiAgICAgIGNvbGxhcHNlID0gImxlZnQiCiAgICB9IGVsc2UgaWYgKGNoIDwgbUVuZCkgewogICAgICBzdGFydCA9IGNoIC0gbVN0YXJ0CiAgICAgIGVuZCA9IHN0YXJ0ICsgMQogICAgfSBlbHNlIGlmIChpID09IG1hcC5sZW5ndGggLSAzIHx8IGNoID09IG1FbmQgJiYgbWFwW2kgKyAzXSA+IGNoKSB7CiAgICAgIGVuZCA9IG1FbmQgLSBtU3RhcnQKICAgICAgc3RhcnQgPSBlbmQgLSAxCiAgICAgIGlmIChjaCA+PSBtRW5kKSBjb2xsYXBzZSA9ICJyaWdodCIKICAgIH0KICAgIGlmIChzdGFydCAhPSBudWxsKSB7CiAgICAgIG5vZGUgPSBtYXBbaSArIDJdCiAgICAgIGlmIChtU3RhcnQgPT0gbUVuZCAmJiBiaWFzID09IChub2RlLmluc2VydExlZnQgPyAibGVmdCIgOiAicmlnaHQiKSkKICAgICAgICBjb2xsYXBzZSA9IGJpYXMKICAgICAgaWYgKGJpYXMgPT0gImxlZnQiICYmIHN0YXJ0ID09IDApCiAgICAgICAgd2hpbGUgKGkgJiYgbWFwW2kgLSAyXSA9PSBtYXBbaSAtIDNdICYmIG1hcFtpIC0gMV0uaW5zZXJ0TGVmdCkgewogICAgICAgICAgbm9kZSA9IG1hcFsoaSAtPSAzKSArIDJdCiAgICAgICAgICBjb2xsYXBzZSA9ICJsZWZ0IgogICAgICAgIH0KICAgICAgaWYgKGJpYXMgPT0gInJpZ2h0IiAmJiBzdGFydCA9PSBtRW5kIC0gbVN0YXJ0KQogICAgICAgIHdoaWxlIChpIDwgbWFwLmxlbmd0aCAtIDMgJiYgbWFwW2kgKyAzXSA9PSBtYXBbaSArIDRdICYmICFtYXBbaSArIDVdLmluc2VydExlZnQpIHsKICAgICAgICAgIG5vZGUgPSBtYXBbKGkgKz0gMykgKyAyXQogICAgICAgICAgY29sbGFwc2UgPSAicmlnaHQiCiAgICAgICAgfQogICAgICBicmVhawogICAgfQogIH0KICByZXR1cm4ge25vZGU6IG5vZGUsIHN0YXJ0OiBzdGFydCwgZW5kOiBlbmQsIGNvbGxhcHNlOiBjb2xsYXBzZSwgY292ZXJTdGFydDogbVN0YXJ0LCBjb3ZlckVuZDogbUVuZH0KfQoKZnVuY3Rpb24gZ2V0VXNlZnVsUmVjdChyZWN0cywgYmlhcykgewogIGxldCByZWN0ID0gbnVsbFJlY3QKICBpZiAoYmlhcyA9PSAibGVmdCIpIGZvciAobGV0IGkgPSAwOyBpIDwgcmVjdHMubGVuZ3RoOyBpKyspIHsKICAgIGlmICgocmVjdCA9IHJlY3RzW2ldKS5sZWZ0ICE9IHJlY3QucmlnaHQpIGJyZWFrCiAgfSBlbHNlIGZvciAobGV0IGkgPSByZWN0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewogICAgaWYgKChyZWN0ID0gcmVjdHNbaV0pLmxlZnQgIT0gcmVjdC5yaWdodCkgYnJlYWsKICB9CiAgcmV0dXJuIHJlY3QKfQoKZnVuY3Rpb24gbWVhc3VyZUNoYXJJbm5lcihjbSwgcHJlcGFyZWQsIGNoLCBiaWFzKSB7CiAgbGV0IHBsYWNlID0gbm9kZUFuZE9mZnNldEluTGluZU1hcChwcmVwYXJlZC5tYXAsIGNoLCBiaWFzKQogIGxldCBub2RlID0gcGxhY2Uubm9kZSwgc3RhcnQgPSBwbGFjZS5zdGFydCwgZW5kID0gcGxhY2UuZW5kLCBjb2xsYXBzZSA9IHBsYWNlLmNvbGxhcHNlCgogIGxldCByZWN0CiAgaWYgKG5vZGUubm9kZVR5cGUgPT0gMykgeyAvLyBJZiBpdCBpcyBhIHRleHQgbm9kZSwgdXNlIGEgcmFuZ2UgdG8gcmV0cmlldmUgdGhlIGNvb3JkaW5hdGVzLgogICAgZm9yIChsZXQgaSA9IDA7IGkgPCA0OyBpKyspIHsgLy8gUmV0cnkgYSBtYXhpbXVtIG9mIDQgdGltZXMgd2hlbiBub25zZW5zZSByZWN0YW5nbGVzIGFyZSByZXR1cm5lZAogICAgICB3aGlsZSAoc3RhcnQgJiYgaXNFeHRlbmRpbmdDaGFyKHByZXBhcmVkLmxpbmUudGV4dC5jaGFyQXQocGxhY2UuY292ZXJTdGFydCArIHN0YXJ0KSkpIC0tc3RhcnQKICAgICAgd2hpbGUgKHBsYWNlLmNvdmVyU3RhcnQgKyBlbmQgPCBwbGFjZS5jb3ZlckVuZCAmJiBpc0V4dGVuZGluZ0NoYXIocHJlcGFyZWQubGluZS50ZXh0LmNoYXJBdChwbGFjZS5jb3ZlclN0YXJ0ICsgZW5kKSkpICsrZW5kCiAgICAgIGlmIChpZSAmJiBpZV92ZXJzaW9uIDwgOSAmJiBzdGFydCA9PSAwICYmIGVuZCA9PSBwbGFjZS5jb3ZlckVuZCAtIHBsYWNlLmNvdmVyU3RhcnQpCiAgICAgICAgcmVjdCA9IG5vZGUucGFyZW50Tm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKQogICAgICBlbHNlCiAgICAgICAgcmVjdCA9IGdldFVzZWZ1bFJlY3QocmFuZ2Uobm9kZSwgc3RhcnQsIGVuZCkuZ2V0Q2xpZW50UmVjdHMoKSwgYmlhcykKICAgICAgaWYgKHJlY3QubGVmdCB8fCByZWN0LnJpZ2h0IHx8IHN0YXJ0ID09IDApIGJyZWFrCiAgICAgIGVuZCA9IHN0YXJ0CiAgICAgIHN0YXJ0ID0gc3RhcnQgLSAxCiAgICAgIGNvbGxhcHNlID0gInJpZ2h0IgogICAgfQogICAgaWYgKGllICYmIGllX3ZlcnNpb24gPCAxMSkgcmVjdCA9IG1heWJlVXBkYXRlUmVjdEZvclpvb21pbmcoY20uZGlzcGxheS5tZWFzdXJlLCByZWN0KQogIH0gZWxzZSB7IC8vIElmIGl0IGlzIGEgd2lkZ2V0LCBzaW1wbHkgZ2V0IHRoZSBib3ggZm9yIHRoZSB3aG9sZSB3aWRnZXQuCiAgICBpZiAoc3RhcnQgPiAwKSBjb2xsYXBzZSA9IGJpYXMgPSAicmlnaHQiCiAgICBsZXQgcmVjdHMKICAgIGlmIChjbS5vcHRpb25zLmxpbmVXcmFwcGluZyAmJiAocmVjdHMgPSBub2RlLmdldENsaWVudFJlY3RzKCkpLmxlbmd0aCA+IDEpCiAgICAgIHJlY3QgPSByZWN0c1tiaWFzID09ICJyaWdodCIgPyByZWN0cy5sZW5ndGggLSAxIDogMF0KICAgIGVsc2UKICAgICAgcmVjdCA9IG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkKICB9CiAgaWYgKGllICYmIGllX3ZlcnNpb24gPCA5ICYmICFzdGFydCAmJiAoIXJlY3QgfHwgIXJlY3QubGVmdCAmJiAhcmVjdC5yaWdodCkpIHsKICAgIGxldCByU3BhbiA9IG5vZGUucGFyZW50Tm9kZS5nZXRDbGllbnRSZWN0cygpWzBdCiAgICBpZiAoclNwYW4pCiAgICAgIHJlY3QgPSB7bGVmdDogclNwYW4ubGVmdCwgcmlnaHQ6IHJTcGFuLmxlZnQgKyBjaGFyV2lkdGgoY20uZGlzcGxheSksIHRvcDogclNwYW4udG9wLCBib3R0b206IHJTcGFuLmJvdHRvbX0KICAgIGVsc2UKICAgICAgcmVjdCA9IG51bGxSZWN0CiAgfQoKICBsZXQgcnRvcCA9IHJlY3QudG9wIC0gcHJlcGFyZWQucmVjdC50b3AsIHJib3QgPSByZWN0LmJvdHRvbSAtIHByZXBhcmVkLnJlY3QudG9wCiAgbGV0IG1pZCA9IChydG9wICsgcmJvdCkgLyAyCiAgbGV0IGhlaWdodHMgPSBwcmVwYXJlZC52aWV3Lm1lYXN1cmUuaGVpZ2h0cwogIGxldCBpID0gMAogIGZvciAoOyBpIDwgaGVpZ2h0cy5sZW5ndGggLSAxOyBpKyspCiAgICBpZiAobWlkIDwgaGVpZ2h0c1tpXSkgYnJlYWsKICBsZXQgdG9wID0gaSA/IGhlaWdodHNbaSAtIDFdIDogMCwgYm90ID0gaGVpZ2h0c1tpXQogIGxldCByZXN1bHQgPSB7bGVmdDogKGNvbGxhcHNlID09ICJyaWdodCIgPyByZWN0LnJpZ2h0IDogcmVjdC5sZWZ0KSAtIHByZXBhcmVkLnJlY3QubGVmdCwKICAgICAgICAgICAgICAgIHJpZ2h0OiAoY29sbGFwc2UgPT0gImxlZnQiID8gcmVjdC5sZWZ0IDogcmVjdC5yaWdodCkgLSBwcmVwYXJlZC5yZWN0LmxlZnQsCiAgICAgICAgICAgICAgICB0b3A6IHRvcCwgYm90dG9tOiBib3R9CiAgaWYgKCFyZWN0LmxlZnQgJiYgIXJlY3QucmlnaHQpIHJlc3VsdC5ib2d1cyA9IHRydWUKICBpZiAoIWNtLm9wdGlvbnMuc2luZ2xlQ3Vyc29ySGVpZ2h0UGVyTGluZSkgeyByZXN1bHQucnRvcCA9IHJ0b3A7IHJlc3VsdC5yYm90dG9tID0gcmJvdCB9CgogIHJldHVybiByZXN1bHQKfQoKLy8gV29yayBhcm91bmQgcHJvYmxlbSB3aXRoIGJvdW5kaW5nIGNsaWVudCByZWN0cyBvbiByYW5nZXMgYmVpbmcKLy8gcmV0dXJuZWQgaW5jb3JyZWN0bHkgd2hlbiB6b29tZWQgb24gSUUxMCBhbmQgYmVsb3cuCmZ1bmN0aW9uIG1heWJlVXBkYXRlUmVjdEZvclpvb21pbmcobWVhc3VyZSwgcmVjdCkgewogIGlmICghd2luZG93LnNjcmVlbiB8fCBzY3JlZW4ubG9naWNhbFhEUEkgPT0gbnVsbCB8fAogICAgICBzY3JlZW4ubG9naWNhbFhEUEkgPT0gc2NyZWVuLmRldmljZVhEUEkgfHwgIWhhc0JhZFpvb21lZFJlY3RzKG1lYXN1cmUpKQogICAgcmV0dXJuIHJlY3QKICBsZXQgc2NhbGVYID0gc2NyZWVuLmxvZ2ljYWxYRFBJIC8gc2NyZWVuLmRldmljZVhEUEkKICBsZXQgc2NhbGVZID0gc2NyZWVuLmxvZ2ljYWxZRFBJIC8gc2NyZWVuLmRldmljZVlEUEkKICByZXR1cm4ge2xlZnQ6IHJlY3QubGVmdCAqIHNjYWxlWCwgcmlnaHQ6IHJlY3QucmlnaHQgKiBzY2FsZVgsCiAgICAgICAgICB0b3A6IHJlY3QudG9wICogc2NhbGVZLCBib3R0b206IHJlY3QuYm90dG9tICogc2NhbGVZfQp9CgpleHBvcnQgZnVuY3Rpb24gY2xlYXJMaW5lTWVhc3VyZW1lbnRDYWNoZUZvcihsaW5lVmlldykgewogIGlmIChsaW5lVmlldy5tZWFzdXJlKSB7CiAgICBsaW5lVmlldy5tZWFzdXJlLmNhY2hlID0ge30KICAgIGxpbmVWaWV3Lm1lYXN1cmUuaGVpZ2h0cyA9IG51bGwKICAgIGlmIChsaW5lVmlldy5yZXN0KSBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVWaWV3LnJlc3QubGVuZ3RoOyBpKyspCiAgICAgIGxpbmVWaWV3Lm1lYXN1cmUuY2FjaGVzW2ldID0ge30KICB9Cn0KCmV4cG9ydCBmdW5jdGlvbiBjbGVhckxpbmVNZWFzdXJlbWVudENhY2hlKGNtKSB7CiAgY20uZGlzcGxheS5leHRlcm5hbE1lYXN1cmUgPSBudWxsCiAgcmVtb3ZlQ2hpbGRyZW4oY20uZGlzcGxheS5saW5lTWVhc3VyZSkKICBmb3IgKGxldCBpID0gMDsgaSA8IGNtLmRpc3BsYXkudmlldy5sZW5ndGg7IGkrKykKICAgIGNsZWFyTGluZU1lYXN1cmVtZW50Q2FjaGVGb3IoY20uZGlzcGxheS52aWV3W2ldKQp9CgpleHBvcnQgZnVuY3Rpb24gY2xlYXJDYWNoZXMoY20pIHsKICBjbGVhckxpbmVNZWFzdXJlbWVudENhY2hlKGNtKQogIGNtLmRpc3BsYXkuY2FjaGVkQ2hhcldpZHRoID0gY20uZGlzcGxheS5jYWNoZWRUZXh0SGVpZ2h0ID0gY20uZGlzcGxheS5jYWNoZWRQYWRkaW5nSCA9IG51bGwKICBpZiAoIWNtLm9wdGlvbnMubGluZVdyYXBwaW5nKSBjbS5kaXNwbGF5Lm1heExpbmVDaGFuZ2VkID0gdHJ1ZQogIGNtLmRpc3BsYXkubGluZU51bUNoYXJzID0gbnVsbAp9CgpmdW5jdGlvbiBwYWdlU2Nyb2xsWCgpIHsgcmV0dXJuIHdpbmRvdy5wYWdlWE9mZnNldCB8fCAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IHx8IGRvY3VtZW50LmJvZHkpLnNjcm9sbExlZnQgfQpmdW5jdGlvbiBwYWdlU2Nyb2xsWSgpIHsgcmV0dXJuIHdpbmRvdy5wYWdlWU9mZnNldCB8fCAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IHx8IGRvY3VtZW50LmJvZHkpLnNjcm9sbFRvcCB9CgovLyBDb252ZXJ0cyBhIHt0b3AsIGJvdHRvbSwgbGVmdCwgcmlnaHR9IGJveCBmcm9tIGxpbmUtbG9jYWwKLy8gY29vcmRpbmF0ZXMgaW50byBhbm90aGVyIGNvb3JkaW5hdGUgc3lzdGVtLiBDb250ZXh0IG1heSBiZSBvbmUgb2YKLy8gImxpbmUiLCAiZGl2IiAoZGlzcGxheS5saW5lRGl2KSwgImxvY2FsIi4vbnVsbCAoZWRpdG9yKSwgIndpbmRvdyIsCi8vIG9yICJwYWdlIi4KZXhwb3J0IGZ1bmN0aW9uIGludG9Db29yZFN5c3RlbShjbSwgbGluZU9iaiwgcmVjdCwgY29udGV4dCkgewogIGlmIChsaW5lT2JqLndpZGdldHMpIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZU9iai53aWRnZXRzLmxlbmd0aDsgKytpKSBpZiAobGluZU9iai53aWRnZXRzW2ldLmFib3ZlKSB7CiAgICBsZXQgc2l6ZSA9IHdpZGdldEhlaWdodChsaW5lT2JqLndpZGdldHNbaV0pCiAgICByZWN0LnRvcCArPSBzaXplOyByZWN0LmJvdHRvbSArPSBzaXplCiAgfQogIGlmIChjb250ZXh0ID09ICJsaW5lIikgcmV0dXJuIHJlY3QKICBpZiAoIWNvbnRleHQpIGNvbnRleHQgPSAibG9jYWwiCiAgbGV0IHlPZmYgPSBoZWlnaHRBdExpbmUobGluZU9iaikKICBpZiAoY29udGV4dCA9PSAibG9jYWwiKSB5T2ZmICs9IHBhZGRpbmdUb3AoY20uZGlzcGxheSkKICBlbHNlIHlPZmYgLT0gY20uZGlzcGxheS52aWV3T2Zmc2V0CiAgaWYgKGNvbnRleHQgPT0gInBhZ2UiIHx8IGNvbnRleHQgPT0gIndpbmRvdyIpIHsKICAgIGxldCBsT2ZmID0gY20uZGlzcGxheS5saW5lU3BhY2UuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkKICAgIHlPZmYgKz0gbE9mZi50b3AgKyAoY29udGV4dCA9PSAid2luZG93IiA/IDAgOiBwYWdlU2Nyb2xsWSgpKQogICAgbGV0IHhPZmYgPSBsT2ZmLmxlZnQgKyAoY29udGV4dCA9PSAid2luZG93IiA/IDAgOiBwYWdlU2Nyb2xsWCgpKQogICAgcmVjdC5sZWZ0ICs9IHhPZmY7IHJlY3QucmlnaHQgKz0geE9mZgogIH0KICByZWN0LnRvcCArPSB5T2ZmOyByZWN0LmJvdHRvbSArPSB5T2ZmCiAgcmV0dXJuIHJlY3QKfQoKLy8gQ292ZXJ0cyBhIGJveCBmcm9tICJkaXYiIGNvb3JkcyB0byBhbm90aGVyIGNvb3JkaW5hdGUgc3lzdGVtLgovLyBDb250ZXh0IG1heSBiZSAid2luZG93IiwgInBhZ2UiLCAiZGl2Iiwgb3IgImxvY2FsIi4vbnVsbC4KZXhwb3J0IGZ1bmN0aW9uIGZyb21Db29yZFN5c3RlbShjbSwgY29vcmRzLCBjb250ZXh0KSB7CiAgaWYgKGNvbnRleHQgPT0gImRpdiIpIHJldHVybiBjb29yZHMKICBsZXQgbGVmdCA9IGNvb3Jkcy5sZWZ0LCB0b3AgPSBjb29yZHMudG9wCiAgLy8gRmlyc3QgbW92ZSBpbnRvICJwYWdlIiBjb29yZGluYXRlIHN5c3RlbQogIGlmIChjb250ZXh0ID09ICJwYWdlIikgewogICAgbGVmdCAtPSBwYWdlU2Nyb2xsWCgpCiAgICB0b3AgLT0gcGFnZVNjcm9sbFkoKQogIH0gZWxzZSBpZiAoY29udGV4dCA9PSAibG9jYWwiIHx8ICFjb250ZXh0KSB7CiAgICBsZXQgbG9jYWxCb3ggPSBjbS5kaXNwbGF5LnNpemVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpCiAgICBsZWZ0ICs9IGxvY2FsQm94LmxlZnQKICAgIHRvcCArPSBsb2NhbEJveC50b3AKICB9CgogIGxldCBsaW5lU3BhY2VCb3ggPSBjbS5kaXNwbGF5LmxpbmVTcGFjZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKQogIHJldHVybiB7bGVmdDogbGVmdCAtIGxpbmVTcGFjZUJveC5sZWZ0LCB0b3A6IHRvcCAtIGxpbmVTcGFjZUJveC50b3B9Cn0KCmV4cG9ydCBmdW5jdGlvbiBjaGFyQ29vcmRzKGNtLCBwb3MsIGNvbnRleHQsIGxpbmVPYmosIGJpYXMpIHsKICBpZiAoIWxpbmVPYmopIGxpbmVPYmogPSBnZXRMaW5lKGNtLmRvYywgcG9zLmxpbmUpCiAgcmV0dXJuIGludG9Db29yZFN5c3RlbShjbSwgbGluZU9iaiwgbWVhc3VyZUNoYXIoY20sIGxpbmVPYmosIHBvcy5jaCwgYmlhcyksIGNvbnRleHQpCn0KCi8vIFJldHVybnMgYSBib3ggZm9yIGEgZ2l2ZW4gY3Vyc29yIHBvc2l0aW9uLCB3aGljaCBtYXkgaGF2ZSBhbgovLyAnb3RoZXInIHByb3BlcnR5IGNvbnRhaW5pbmcgdGhlIHBvc2l0aW9uIG9mIHRoZSBzZWNvbmRhcnkgY3Vyc29yCi8vIG9uIGEgYmlkaSBib3VuZGFyeS4KZXhwb3J0IGZ1bmN0aW9uIGN1cnNvckNvb3JkcyhjbSwgcG9zLCBjb250ZXh0LCBsaW5lT2JqLCBwcmVwYXJlZE1lYXN1cmUsIHZhckhlaWdodCkgewogIGxpbmVPYmogPSBsaW5lT2JqIHx8IGdldExpbmUoY20uZG9jLCBwb3MubGluZSkKICBpZiAoIXByZXBhcmVkTWVhc3VyZSkgcHJlcGFyZWRNZWFzdXJlID0gcHJlcGFyZU1lYXN1cmVGb3JMaW5lKGNtLCBsaW5lT2JqKQogIGZ1bmN0aW9uIGdldChjaCwgcmlnaHQpIHsKICAgIGxldCBtID0gbWVhc3VyZUNoYXJQcmVwYXJlZChjbSwgcHJlcGFyZWRNZWFzdXJlLCBjaCwgcmlnaHQgPyAicmlnaHQiIDogImxlZnQiLCB2YXJIZWlnaHQpCiAgICBpZiAocmlnaHQpIG0ubGVmdCA9IG0ucmlnaHQ7IGVsc2UgbS5yaWdodCA9IG0ubGVmdAogICAgcmV0dXJuIGludG9Db29yZFN5c3RlbShjbSwgbGluZU9iaiwgbSwgY29udGV4dCkKICB9CiAgZnVuY3Rpb24gZ2V0QmlkaShjaCwgcGFydFBvcykgewogICAgbGV0IHBhcnQgPSBvcmRlcltwYXJ0UG9zXSwgcmlnaHQgPSBwYXJ0LmxldmVsICUgMgogICAgaWYgKGNoID09IGJpZGlMZWZ0KHBhcnQpICYmIHBhcnRQb3MgJiYgcGFydC5sZXZlbCA8IG9yZGVyW3BhcnRQb3MgLSAxXS5sZXZlbCkgewogICAgICBwYXJ0ID0gb3JkZXJbLS1wYXJ0UG9zXQogICAgICBjaCA9IGJpZGlSaWdodChwYXJ0KSAtIChwYXJ0LmxldmVsICUgMiA/IDAgOiAxKQogICAgICByaWdodCA9IHRydWUKICAgIH0gZWxzZSBpZiAoY2ggPT0gYmlkaVJpZ2h0KHBhcnQpICYmIHBhcnRQb3MgPCBvcmRlci5sZW5ndGggLSAxICYmIHBhcnQubGV2ZWwgPCBvcmRlcltwYXJ0UG9zICsgMV0ubGV2ZWwpIHsKICAgICAgcGFydCA9IG9yZGVyWysrcGFydFBvc10KICAgICAgY2ggPSBiaWRpTGVmdChwYXJ0KSAtIHBhcnQubGV2ZWwgJSAyCiAgICAgIHJpZ2h0ID0gZmFsc2UKICAgIH0KICAgIGlmIChyaWdodCAmJiBjaCA9PSBwYXJ0LnRvICYmIGNoID4gcGFydC5mcm9tKSByZXR1cm4gZ2V0KGNoIC0gMSkKICAgIHJldHVybiBnZXQoY2gsIHJpZ2h0KQogIH0KICBsZXQgb3JkZXIgPSBnZXRPcmRlcihsaW5lT2JqKSwgY2ggPSBwb3MuY2gKICBpZiAoIW9yZGVyKSByZXR1cm4gZ2V0KGNoKQogIGxldCBwYXJ0UG9zID0gZ2V0QmlkaVBhcnRBdChvcmRlciwgY2gpCiAgbGV0IHZhbCA9IGdldEJpZGkoY2gsIHBhcnRQb3MpCiAgaWYgKGJpZGlPdGhlciAhPSBudWxsKSB2YWwub3RoZXIgPSBnZXRCaWRpKGNoLCBiaWRpT3RoZXIpCiAgcmV0dXJuIHZhbAp9CgovLyBVc2VkIHRvIGNoZWFwbHkgZXN0aW1hdGUgdGhlIGNvb3JkaW5hdGVzIGZvciBhIHBvc2l0aW9uLiBVc2VkIGZvcgovLyBpbnRlcm1lZGlhdGUgc2Nyb2xsIHVwZGF0ZXMuCmV4cG9ydCBmdW5jdGlvbiBlc3RpbWF0ZUNvb3JkcyhjbSwgcG9zKSB7CiAgbGV0IGxlZnQgPSAwCiAgcG9zID0gY2xpcFBvcyhjbS5kb2MsIHBvcykKICBpZiAoIWNtLm9wdGlvbnMubGluZVdyYXBwaW5nKSBsZWZ0ID0gY2hhcldpZHRoKGNtLmRpc3BsYXkpICogcG9zLmNoCiAgbGV0IGxpbmVPYmogPSBnZXRMaW5lKGNtLmRvYywgcG9zLmxpbmUpCiAgbGV0IHRvcCA9IGhlaWdodEF0TGluZShsaW5lT2JqKSArIHBhZGRpbmdUb3AoY20uZGlzcGxheSkKICByZXR1cm4ge2xlZnQ6IGxlZnQsIHJpZ2h0OiBsZWZ0LCB0b3A6IHRvcCwgYm90dG9tOiB0b3AgKyBsaW5lT2JqLmhlaWdodH0KfQoKLy8gUG9zaXRpb25zIHJldHVybmVkIGJ5IGNvb3Jkc0NoYXIgY29udGFpbiBzb21lIGV4dHJhIGluZm9ybWF0aW9uLgovLyB4UmVsIGlzIHRoZSByZWxhdGl2ZSB4IHBvc2l0aW9uIG9mIHRoZSBpbnB1dCBjb29yZGluYXRlcyBjb21wYXJlZAovLyB0byB0aGUgZm91bmQgcG9zaXRpb24gKHNvIHhSZWwgPiAwIG1lYW5zIHRoZSBjb29yZGluYXRlcyBhcmUgdG8KLy8gdGhlIHJpZ2h0IG9mIHRoZSBjaGFyYWN0ZXIgcG9zaXRpb24sIGZvciBleGFtcGxlKS4gV2hlbiBvdXRzaWRlCi8vIGlzIHRydWUsIHRoYXQgbWVhbnMgdGhlIGNvb3JkaW5hdGVzIGxpZSBvdXRzaWRlIHRoZSBsaW5lJ3MKLy8gdmVydGljYWwgcmFuZ2UuCmZ1bmN0aW9uIFBvc1dpdGhJbmZvKGxpbmUsIGNoLCBvdXRzaWRlLCB4UmVsKSB7CiAgbGV0IHBvcyA9IFBvcyhsaW5lLCBjaCkKICBwb3MueFJlbCA9IHhSZWwKICBpZiAob3V0c2lkZSkgcG9zLm91dHNpZGUgPSB0cnVlCiAgcmV0dXJuIHBvcwp9CgovLyBDb21wdXRlIHRoZSBjaGFyYWN0ZXIgcG9zaXRpb24gY2xvc2VzdCB0byB0aGUgZ2l2ZW4gY29vcmRpbmF0ZXMuCi8vIElucHV0IG11c3QgYmUgbGluZVNwYWNlLWxvY2FsICgiZGl2IiBjb29yZGluYXRlIHN5c3RlbSkuCmV4cG9ydCBmdW5jdGlvbiBjb29yZHNDaGFyKGNtLCB4LCB5KSB7CiAgbGV0IGRvYyA9IGNtLmRvYwogIHkgKz0gY20uZGlzcGxheS52aWV3T2Zmc2V0CiAgaWYgKHkgPCAwKSByZXR1cm4gUG9zV2l0aEluZm8oZG9jLmZpcnN0LCAwLCB0cnVlLCAtMSkKICBsZXQgbGluZU4gPSBsaW5lQXRIZWlnaHQoZG9jLCB5KSwgbGFzdCA9IGRvYy5maXJzdCArIGRvYy5zaXplIC0gMQogIGlmIChsaW5lTiA+IGxhc3QpCiAgICByZXR1cm4gUG9zV2l0aEluZm8oZG9jLmZpcnN0ICsgZG9jLnNpemUgLSAxLCBnZXRMaW5lKGRvYywgbGFzdCkudGV4dC5sZW5ndGgsIHRydWUsIDEpCiAgaWYgKHggPCAwKSB4ID0gMAoKICBsZXQgbGluZU9iaiA9IGdldExpbmUoZG9jLCBsaW5lTikKICBmb3IgKDs7KSB7CiAgICBsZXQgZm91bmQgPSBjb29yZHNDaGFySW5uZXIoY20sIGxpbmVPYmosIGxpbmVOLCB4LCB5KQogICAgbGV0IG1lcmdlZCA9IGNvbGxhcHNlZFNwYW5BdEVuZChsaW5lT2JqKQogICAgbGV0IG1lcmdlZFBvcyA9IG1lcmdlZCAmJiBtZXJnZWQuZmluZCgwLCB0cnVlKQogICAgaWYgKG1lcmdlZCAmJiAoZm91bmQuY2ggPiBtZXJnZWRQb3MuZnJvbS5jaCB8fCBmb3VuZC5jaCA9PSBtZXJnZWRQb3MuZnJvbS5jaCAmJiBmb3VuZC54UmVsID4gMCkpCiAgICAgIGxpbmVOID0gbGluZU5vKGxpbmVPYmogPSBtZXJnZWRQb3MudG8ubGluZSkKICAgIGVsc2UKICAgICAgcmV0dXJuIGZvdW5kCiAgfQp9CgpmdW5jdGlvbiBjb29yZHNDaGFySW5uZXIoY20sIGxpbmVPYmosIGxpbmVObywgeCwgeSkgewogIGxldCBpbm5lck9mZiA9IHkgLSBoZWlnaHRBdExpbmUobGluZU9iaikKICBsZXQgd3JvbmdMaW5lID0gZmFsc2UsIGFkanVzdCA9IDIgKiBjbS5kaXNwbGF5LndyYXBwZXIuY2xpZW50V2lkdGgKICBsZXQgcHJlcGFyZWRNZWFzdXJlID0gcHJlcGFyZU1lYXN1cmVGb3JMaW5lKGNtLCBsaW5lT2JqKQoKICBmdW5jdGlvbiBnZXRYKGNoKSB7CiAgICBsZXQgc3AgPSBjdXJzb3JDb29yZHMoY20sIFBvcyhsaW5lTm8sIGNoKSwgImxpbmUiLCBsaW5lT2JqLCBwcmVwYXJlZE1lYXN1cmUpCiAgICB3cm9uZ0xpbmUgPSB0cnVlCiAgICBpZiAoaW5uZXJPZmYgPiBzcC5ib3R0b20pIHJldHVybiBzcC5sZWZ0IC0gYWRqdXN0CiAgICBlbHNlIGlmIChpbm5lck9mZiA8IHNwLnRvcCkgcmV0dXJuIHNwLmxlZnQgKyBhZGp1c3QKICAgIGVsc2Ugd3JvbmdMaW5lID0gZmFsc2UKICAgIHJldHVybiBzcC5sZWZ0CiAgfQoKICBsZXQgYmlkaSA9IGdldE9yZGVyKGxpbmVPYmopLCBkaXN0ID0gbGluZU9iai50ZXh0Lmxlbmd0aAogIGxldCBmcm9tID0gbGluZUxlZnQobGluZU9iaiksIHRvID0gbGluZVJpZ2h0KGxpbmVPYmopCiAgbGV0IGZyb21YID0gZ2V0WChmcm9tKSwgZnJvbU91dHNpZGUgPSB3cm9uZ0xpbmUsIHRvWCA9IGdldFgodG8pLCB0b091dHNpZGUgPSB3cm9uZ0xpbmUKCiAgaWYgKHggPiB0b1gpIHJldHVybiBQb3NXaXRoSW5mbyhsaW5lTm8sIHRvLCB0b091dHNpZGUsIDEpCiAgLy8gRG8gYSBiaW5hcnkgc2VhcmNoIGJldHdlZW4gdGhlc2UgYm91bmRzLgogIGZvciAoOzspIHsKICAgIGlmIChiaWRpID8gdG8gPT0gZnJvbSB8fCB0byA9PSBtb3ZlVmlzdWFsbHkobGluZU9iaiwgZnJvbSwgMSkgOiB0byAtIGZyb20gPD0gMSkgewogICAgICBsZXQgY2ggPSB4IDwgZnJvbVggfHwgeCAtIGZyb21YIDw9IHRvWCAtIHggPyBmcm9tIDogdG8KICAgICAgbGV0IG91dHNpZGUgPSBjaCA9PSBmcm9tID8gZnJvbU91dHNpZGUgOiB0b091dHNpZGUKICAgICAgbGV0IHhEaWZmID0geCAtIChjaCA9PSBmcm9tID8gZnJvbVggOiB0b1gpCiAgICAgIC8vIFRoaXMgaXMgYSBrbHVkZ2UgdG8gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRoZSBjb29yZGluYXRlcwogICAgICAvLyBhcmUgYWZ0ZXIgYSBsaW5lLXdyYXBwZWQgbGluZS4gV2Ugc2hvdWxkIHJlcGxhY2UgaXQgd2l0aCBhCiAgICAgIC8vIG1vcmUgZ2VuZXJhbCBoYW5kbGluZyBvZiBjdXJzb3IgcG9zaXRpb25zIGFyb3VuZCBsaW5lCiAgICAgIC8vIGJyZWFrcy4gKElzc3VlICM0MDc4KQogICAgICBpZiAodG9PdXRzaWRlICYmICFiaWRpICYmICEvXHMvLnRlc3QobGluZU9iai50ZXh0LmNoYXJBdChjaCkpICYmIHhEaWZmID4gMCAmJgogICAgICAgICAgY2ggPCBsaW5lT2JqLnRleHQubGVuZ3RoICYmIHByZXBhcmVkTWVhc3VyZS52aWV3Lm1lYXN1cmUuaGVpZ2h0cy5sZW5ndGggPiAxKSB7CiAgICAgICAgbGV0IGNoYXJTaXplID0gbWVhc3VyZUNoYXJQcmVwYXJlZChjbSwgcHJlcGFyZWRNZWFzdXJlLCBjaCwgInJpZ2h0IikKICAgICAgICBpZiAoaW5uZXJPZmYgPD0gY2hhclNpemUuYm90dG9tICYmIGlubmVyT2ZmID49IGNoYXJTaXplLnRvcCAmJiBNYXRoLmFicyh4IC0gY2hhclNpemUucmlnaHQpIDwgeERpZmYpIHsKICAgICAgICAgIG91dHNpZGUgPSBmYWxzZQogICAgICAgICAgY2grKwogICAgICAgICAgeERpZmYgPSB4IC0gY2hhclNpemUucmlnaHQKICAgICAgICB9CiAgICAgIH0KICAgICAgd2hpbGUgKGlzRXh0ZW5kaW5nQ2hhcihsaW5lT2JqLnRleHQuY2hhckF0KGNoKSkpICsrY2gKICAgICAgbGV0IHBvcyA9IFBvc1dpdGhJbmZvKGxpbmVObywgY2gsIG91dHNpZGUsIHhEaWZmIDwgLTEgPyAtMSA6IHhEaWZmID4gMSA/IDEgOiAwKQogICAgICByZXR1cm4gcG9zCiAgICB9CiAgICBsZXQgc3RlcCA9IE1hdGguY2VpbChkaXN0IC8gMiksIG1pZGRsZSA9IGZyb20gKyBzdGVwCiAgICBpZiAoYmlkaSkgewogICAgICBtaWRkbGUgPSBmcm9tCiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RlcDsgKytpKSBtaWRkbGUgPSBtb3ZlVmlzdWFsbHkobGluZU9iaiwgbWlkZGxlLCAxKQogICAgfQogICAgbGV0IG1pZGRsZVggPSBnZXRYKG1pZGRsZSkKICAgIGlmIChtaWRkbGVYID4geCkge3RvID0gbWlkZGxlOyB0b1ggPSBtaWRkbGVYOyBpZiAodG9PdXRzaWRlID0gd3JvbmdMaW5lKSB0b1ggKz0gMTAwMDsgZGlzdCA9IHN0ZXB9CiAgICBlbHNlIHtmcm9tID0gbWlkZGxlOyBmcm9tWCA9IG1pZGRsZVg7IGZyb21PdXRzaWRlID0gd3JvbmdMaW5lOyBkaXN0IC09IHN0ZXB9CiAgfQp9CgpsZXQgbWVhc3VyZVRleHQKLy8gQ29tcHV0ZSB0aGUgZGVmYXVsdCB0ZXh0IGhlaWdodC4KZXhwb3J0IGZ1bmN0aW9uIHRleHRIZWlnaHQoZGlzcGxheSkgewogIGlmIChkaXNwbGF5LmNhY2hlZFRleHRIZWlnaHQgIT0gbnVsbCkgcmV0dXJuIGRpc3BsYXkuY2FjaGVkVGV4dEhlaWdodAogIGlmIChtZWFzdXJlVGV4dCA9PSBudWxsKSB7CiAgICBtZWFzdXJlVGV4dCA9IGVsdCgicHJlIikKICAgIC8vIE1lYXN1cmUgYSBidW5jaCBvZiBsaW5lcywgZm9yIGJyb3dzZXJzIHRoYXQgY29tcHV0ZQogICAgLy8gZnJhY3Rpb25hbCBoZWlnaHRzLgogICAgZm9yIChsZXQgaSA9IDA7IGkgPCA0OTsgKytpKSB7CiAgICAgIG1lYXN1cmVUZXh0LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCJ4IikpCiAgICAgIG1lYXN1cmVUZXh0LmFwcGVuZENoaWxkKGVsdCgiYnIiKSkKICAgIH0KICAgIG1lYXN1cmVUZXh0LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCJ4IikpCiAgfQogIHJlbW92ZUNoaWxkcmVuQW5kQWRkKGRpc3BsYXkubWVhc3VyZSwgbWVhc3VyZVRleHQpCiAgbGV0IGhlaWdodCA9IG1lYXN1cmVUZXh0Lm9mZnNldEhlaWdodCAvIDUwCiAgaWYgKGhlaWdodCA+IDMpIGRpc3BsYXkuY2FjaGVkVGV4dEhlaWdodCA9IGhlaWdodAogIHJlbW92ZUNoaWxkcmVuKGRpc3BsYXkubWVhc3VyZSkKICByZXR1cm4gaGVpZ2h0IHx8IDEKfQoKLy8gQ29tcHV0ZSB0aGUgZGVmYXVsdCBjaGFyYWN0ZXIgd2lkdGguCmV4cG9ydCBmdW5jdGlvbiBjaGFyV2lkdGgoZGlzcGxheSkgewogIGlmIChkaXNwbGF5LmNhY2hlZENoYXJXaWR0aCAhPSBudWxsKSByZXR1cm4gZGlzcGxheS5jYWNoZWRDaGFyV2lkdGgKICBsZXQgYW5jaG9yID0gZWx0KCJzcGFuIiwgInh4eHh4eHh4eHgiKQogIGxldCBwcmUgPSBlbHQoInByZSIsIFthbmNob3JdKQogIHJlbW92ZUNoaWxkcmVuQW5kQWRkKGRpc3BsYXkubWVhc3VyZSwgcHJlKQogIGxldCByZWN0ID0gYW5jaG9yLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLCB3aWR0aCA9IChyZWN0LnJpZ2h0IC0gcmVjdC5sZWZ0KSAvIDEwCiAgaWYgKHdpZHRoID4gMikgZGlzcGxheS5jYWNoZWRDaGFyV2lkdGggPSB3aWR0aAogIHJldHVybiB3aWR0aCB8fCAxMAp9CgovLyBEbyBhIGJ1bGstcmVhZCBvZiB0aGUgRE9NIHBvc2l0aW9ucyBhbmQgc2l6ZXMgbmVlZGVkIHRvIGRyYXcgdGhlCi8vIHZpZXcsIHNvIHRoYXQgd2UgZG9uJ3QgaW50ZXJsZWF2ZSByZWFkaW5nIGFuZCB3cml0aW5nIHRvIHRoZSBET00uCmV4cG9ydCBmdW5jdGlvbiBnZXREaW1lbnNpb25zKGNtKSB7CiAgbGV0IGQgPSBjbS5kaXNwbGF5LCBsZWZ0ID0ge30sIHdpZHRoID0ge30KICBsZXQgZ3V0dGVyTGVmdCA9IGQuZ3V0dGVycy5jbGllbnRMZWZ0CiAgZm9yIChsZXQgbiA9IGQuZ3V0dGVycy5maXJzdENoaWxkLCBpID0gMDsgbjsgbiA9IG4ubmV4dFNpYmxpbmcsICsraSkgewogICAgbGVmdFtjbS5vcHRpb25zLmd1dHRlcnNbaV1dID0gbi5vZmZzZXRMZWZ0ICsgbi5jbGllbnRMZWZ0ICsgZ3V0dGVyTGVmdAogICAgd2lkdGhbY20ub3B0aW9ucy5ndXR0ZXJzW2ldXSA9IG4uY2xpZW50V2lkdGgKICB9CiAgcmV0dXJuIHtmaXhlZFBvczogY29tcGVuc2F0ZUZvckhTY3JvbGwoZCksCiAgICAgICAgICBndXR0ZXJUb3RhbFdpZHRoOiBkLmd1dHRlcnMub2Zmc2V0V2lkdGgsCiAgICAgICAgICBndXR0ZXJMZWZ0OiBsZWZ0LAogICAgICAgICAgZ3V0dGVyV2lkdGg6IHdpZHRoLAogICAgICAgICAgd3JhcHBlcldpZHRoOiBkLndyYXBwZXIuY2xpZW50V2lkdGh9Cn0KCi8vIENvbXB1dGVzIGRpc3BsYXkuc2Nyb2xsZXIuc2Nyb2xsTGVmdCArIGRpc3BsYXkuZ3V0dGVycy5vZmZzZXRXaWR0aCwKLy8gYnV0IHVzaW5nIGdldEJvdW5kaW5nQ2xpZW50UmVjdCB0byBnZXQgYSBzdWItcGl4ZWwtYWNjdXJhdGUKLy8gcmVzdWx0LgpleHBvcnQgZnVuY3Rpb24gY29tcGVuc2F0ZUZvckhTY3JvbGwoZGlzcGxheSkgewogIHJldHVybiBkaXNwbGF5LnNjcm9sbGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQgLSBkaXNwbGF5LnNpemVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQKfQoKLy8gUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgZXN0aW1hdGVzIHRoZSBoZWlnaHQgb2YgYSBsaW5lLCB0byB1c2UgYXMKLy8gZmlyc3QgYXBwcm94aW1hdGlvbiB1bnRpbCB0aGUgbGluZSBiZWNvbWVzIHZpc2libGUgKGFuZCBpcyB0aHVzCi8vIHByb3Blcmx5IG1lYXN1cmFibGUpLgpleHBvcnQgZnVuY3Rpb24gZXN0aW1hdGVIZWlnaHQoY20pIHsKICBsZXQgdGggPSB0ZXh0SGVpZ2h0KGNtLmRpc3BsYXkpLCB3cmFwcGluZyA9IGNtLm9wdGlvbnMubGluZVdyYXBwaW5nCiAgbGV0IHBlckxpbmUgPSB3cmFwcGluZyAmJiBNYXRoLm1heCg1LCBjbS5kaXNwbGF5LnNjcm9sbGVyLmNsaWVudFdpZHRoIC8gY2hhcldpZHRoKGNtLmRpc3BsYXkpIC0gMykKICByZXR1cm4gbGluZSA9PiB7CiAgICBpZiAobGluZUlzSGlkZGVuKGNtLmRvYywgbGluZSkpIHJldHVybiAwCgogICAgbGV0IHdpZGdldHNIZWlnaHQgPSAwCiAgICBpZiAobGluZS53aWRnZXRzKSBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmUud2lkZ2V0cy5sZW5ndGg7IGkrKykgewogICAgICBpZiAobGluZS53aWRnZXRzW2ldLmhlaWdodCkgd2lkZ2V0c0hlaWdodCArPSBsaW5lLndpZGdldHNbaV0uaGVpZ2h0CiAgICB9CgogICAgaWYgKHdyYXBwaW5nKQogICAgICByZXR1cm4gd2lkZ2V0c0hlaWdodCArIChNYXRoLmNlaWwobGluZS50ZXh0Lmxlbmd0aCAvIHBlckxpbmUpIHx8IDEpICogdGgKICAgIGVsc2UKICAgICAgcmV0dXJuIHdpZGdldHNIZWlnaHQgKyB0aAogIH0KfQoKZXhwb3J0IGZ1bmN0aW9uIGVzdGltYXRlTGluZUhlaWdodHMoY20pIHsKICBsZXQgZG9jID0gY20uZG9jLCBlc3QgPSBlc3RpbWF0ZUhlaWdodChjbSkKICBkb2MuaXRlcihsaW5lID0+IHsKICAgIGxldCBlc3RIZWlnaHQgPSBlc3QobGluZSkKICAgIGlmIChlc3RIZWlnaHQgIT0gbGluZS5oZWlnaHQpIHVwZGF0ZUxpbmVIZWlnaHQobGluZSwgZXN0SGVpZ2h0KQogIH0pCn0KCi8vIEdpdmVuIGEgbW91c2UgZXZlbnQsIGZpbmQgdGhlIGNvcnJlc3BvbmRpbmcgcG9zaXRpb24uIElmIGxpYmVyYWwKLy8gaXMgZmFsc2UsIGl0IGNoZWNrcyB3aGV0aGVyIGEgZ3V0dGVyIG9yIHNjcm9sbGJhciB3YXMgY2xpY2tlZCwKLy8gYW5kIHJldHVybnMgbnVsbCBpZiBpdCB3YXMuIGZvclJlY3QgaXMgdXNlZCBieSByZWN0YW5ndWxhcgovLyBzZWxlY3Rpb25zLCBhbmQgdHJpZXMgdG8gZXN0aW1hdGUgYSBjaGFyYWN0ZXIgcG9zaXRpb24gZXZlbiBmb3IKLy8gY29vcmRpbmF0ZXMgYmV5b25kIHRoZSByaWdodCBvZiB0aGUgdGV4dC4KZXhwb3J0IGZ1bmN0aW9uIHBvc0Zyb21Nb3VzZShjbSwgZSwgbGliZXJhbCwgZm9yUmVjdCkgewogIGxldCBkaXNwbGF5ID0gY20uZGlzcGxheQogIGlmICghbGliZXJhbCAmJiBlX3RhcmdldChlKS5nZXRBdHRyaWJ1dGUoImNtLW5vdC1jb250ZW50IikgPT0gInRydWUiKSByZXR1cm4gbnVsbAoKICBsZXQgeCwgeSwgc3BhY2UgPSBkaXNwbGF5LmxpbmVTcGFjZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKQogIC8vIEZhaWxzIHVucHJlZGljdGFibHkgb24gSUVbNjddIHdoZW4gbW91c2UgaXMgZHJhZ2dlZCBhcm91bmQgcXVpY2tseS4KICB0cnkgeyB4ID0gZS5jbGllbnRYIC0gc3BhY2UubGVmdDsgeSA9IGUuY2xpZW50WSAtIHNwYWNlLnRvcCB9CiAgY2F0Y2ggKGUpIHsgcmV0dXJuIG51bGwgfQogIGxldCBjb29yZHMgPSBjb29yZHNDaGFyKGNtLCB4LCB5KSwgbGluZQogIGlmIChmb3JSZWN0ICYmIGNvb3Jkcy54UmVsID09IDEgJiYgKGxpbmUgPSBnZXRMaW5lKGNtLmRvYywgY29vcmRzLmxpbmUpLnRleHQpLmxlbmd0aCA9PSBjb29yZHMuY2gpIHsKICAgIGxldCBjb2xEaWZmID0gY291bnRDb2x1bW4obGluZSwgbGluZS5sZW5ndGgsIGNtLm9wdGlvbnMudGFiU2l6ZSkgLSBsaW5lLmxlbmd0aAogICAgY29vcmRzID0gUG9zKGNvb3Jkcy5saW5lLCBNYXRoLm1heCgwLCBNYXRoLnJvdW5kKCh4IC0gcGFkZGluZ0goY20uZGlzcGxheSkubGVmdCkgLyBjaGFyV2lkdGgoY20uZGlzcGxheSkpIC0gY29sRGlmZikpCiAgfQogIHJldHVybiBjb29yZHMKfQoKLy8gRmluZCB0aGUgdmlldyBlbGVtZW50IGNvcnJlc3BvbmRpbmcgdG8gYSBnaXZlbiBsaW5lLiBSZXR1cm4gbnVsbAovLyB3aGVuIHRoZSBsaW5lIGlzbid0IHZpc2libGUuCmV4cG9ydCBmdW5jdGlvbiBmaW5kVmlld0luZGV4KGNtLCBuKSB7CiAgaWYgKG4gPj0gY20uZGlzcGxheS52aWV3VG8pIHJldHVybiBudWxsCiAgbiAtPSBjbS5kaXNwbGF5LnZpZXdGcm9tCiAgaWYgKG4gPCAwKSByZXR1cm4gbnVsbAogIGxldCB2aWV3ID0gY20uZGlzcGxheS52aWV3CiAgZm9yIChsZXQgaSA9IDA7IGkgPCB2aWV3Lmxlbmd0aDsgaSsrKSB7CiAgICBuIC09IHZpZXdbaV0uc2l6ZQogICAgaWYgKG4gPCAwKSByZXR1cm4gaQogIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/src/measurement/widgets.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aW1wb3J0IHsgY29udGFpbnMsIGVsdCwgcmVtb3ZlQ2hpbGRyZW5BbmRBZGQgfSBmcm9tICIuLi91dGlsL2RvbSIKaW1wb3J0IHsgZV90YXJnZXQgfSBmcm9tICIuLi91dGlsL2V2ZW50IgoKZXhwb3J0IGZ1bmN0aW9uIHdpZGdldEhlaWdodCh3aWRnZXQpIHsKICBpZiAod2lkZ2V0LmhlaWdodCAhPSBudWxsKSByZXR1cm4gd2lkZ2V0LmhlaWdodAogIGxldCBjbSA9IHdpZGdldC5kb2MuY20KICBpZiAoIWNtKSByZXR1cm4gMAogIGlmICghY29udGFpbnMoZG9jdW1lbnQuYm9keSwgd2lkZ2V0Lm5vZGUpKSB7CiAgICBsZXQgcGFyZW50U3R5bGUgPSAicG9zaXRpb246IHJlbGF0aXZlOyIKICAgIGlmICh3aWRnZXQuY292ZXJHdXR0ZXIpCiAgICAgIHBhcmVudFN0eWxlICs9ICJtYXJnaW4tbGVmdDogLSIgKyBjbS5kaXNwbGF5Lmd1dHRlcnMub2Zmc2V0V2lkdGggKyAicHg7IgogICAgaWYgKHdpZGdldC5ub0hTY3JvbGwpCiAgICAgIHBhcmVudFN0eWxlICs9ICJ3aWR0aDogIiArIGNtLmRpc3BsYXkud3JhcHBlci5jbGllbnRXaWR0aCArICJweDsiCiAgICByZW1vdmVDaGlsZHJlbkFuZEFkZChjbS5kaXNwbGF5Lm1lYXN1cmUsIGVsdCgiZGl2IiwgW3dpZGdldC5ub2RlXSwgbnVsbCwgcGFyZW50U3R5bGUpKQogIH0KICByZXR1cm4gd2lkZ2V0LmhlaWdodCA9IHdpZGdldC5ub2RlLnBhcmVudE5vZGUub2Zmc2V0SGVpZ2h0Cn0KCi8vIFJldHVybiB0cnVlIHdoZW4gdGhlIGdpdmVuIG1vdXNlIGV2ZW50IGhhcHBlbmVkIGluIGEgd2lkZ2V0CmV4cG9ydCBmdW5jdGlvbiBldmVudEluV2lkZ2V0KGRpc3BsYXksIGUpIHsKICBmb3IgKGxldCBuID0gZV90YXJnZXQoZSk7IG4gIT0gZGlzcGxheS53cmFwcGVyOyBuID0gbi5wYXJlbnROb2RlKSB7CiAgICBpZiAoIW4gfHwgKG4ubm9kZVR5cGUgPT0gMSAmJiBuLmdldEF0dHJpYnV0ZSgiY20taWdub3JlLWV2ZW50cyIpID09ICJ0cnVlIikgfHwKICAgICAgICAobi5wYXJlbnROb2RlID09IGRpc3BsYXkuc2l6ZXIgJiYgbiAhPSBkaXNwbGF5Lm1vdmVyKSkKICAgICAgcmV0dXJuIHRydWUKICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/src/model/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/src/model/changes.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aW1wb3J0IHsgc3RhcnRXb3JrZXIgfSBmcm9tICIuLi9kaXNwbGF5L2hpZ2hsaWdodF93b3JrZXIiCmltcG9ydCB7IG9wZXJhdGlvbiB9IGZyb20gIi4uL2Rpc3BsYXkvb3BlcmF0aW9ucyIKaW1wb3J0IHsgcmVnQ2hhbmdlLCByZWdMaW5lQ2hhbmdlIH0gZnJvbSAiLi4vZGlzcGxheS92aWV3X3RyYWNraW5nIgppbXBvcnQgeyBjbGlwTGluZSwgY2xpcFBvcywgY21wLCBQb3MgfSBmcm9tICIuLi9saW5lL3BvcyIKaW1wb3J0IHsgc2F3UmVhZE9ubHlTcGFucyB9IGZyb20gIi4uL2xpbmUvc2F3X3NwZWNpYWxfc3BhbnMiCmltcG9ydCB7IGxpbmVMZW5ndGgsIHJlbW92ZVJlYWRPbmx5UmFuZ2VzLCBzdHJldGNoU3BhbnNPdmVyQ2hhbmdlLCB2aXN1YWxMaW5lIH0gZnJvbSAiLi4vbGluZS9zcGFucyIKaW1wb3J0IHsgZ2V0QmV0d2VlbiwgZ2V0TGluZSwgbGluZU5vIH0gZnJvbSAiLi4vbGluZS91dGlsc19saW5lIgppbXBvcnQgeyBlc3RpbWF0ZUhlaWdodCB9IGZyb20gIi4uL21lYXN1cmVtZW50L3Bvc2l0aW9uX21lYXN1cmVtZW50IgppbXBvcnQgeyBoYXNIYW5kbGVyLCBzaWduYWwsIHNpZ25hbEN1cnNvckFjdGl2aXR5IH0gZnJvbSAiLi4vdXRpbC9ldmVudCIKaW1wb3J0IHsgaW5kZXhPZiwgbHN0LCBtYXAsIHNlbF9kb250U2Nyb2xsIH0gZnJvbSAiLi4vdXRpbC9taXNjIgppbXBvcnQgeyBzaWduYWxMYXRlciB9IGZyb20gIi4uL3V0aWwvb3BlcmF0aW9uX2dyb3VwIgoKaW1wb3J0IHsgY2hhbmdlRW5kLCBjb21wdXRlU2VsQWZ0ZXJDaGFuZ2UgfSBmcm9tICIuL2NoYW5nZV9tZWFzdXJlbWVudCIKaW1wb3J0IHsgaXNXaG9sZUxpbmVVcGRhdGUsIGxpbmtlZERvY3MsIHVwZGF0ZURvYyB9IGZyb20gIi4vZG9jdW1lbnRfZGF0YSIKaW1wb3J0IHsgYWRkQ2hhbmdlVG9IaXN0b3J5LCBoaXN0b3J5Q2hhbmdlRnJvbUNoYW5nZSwgbWVyZ2VPbGRTcGFucywgcHVzaFNlbGVjdGlvblRvSGlzdG9yeSB9IGZyb20gIi4vaGlzdG9yeSIKaW1wb3J0IHsgUmFuZ2UsIFNlbGVjdGlvbiB9IGZyb20gIi4vc2VsZWN0aW9uIgppbXBvcnQgeyBzZXRTZWxlY3Rpb24sIHNldFNlbGVjdGlvbk5vVW5kbyB9IGZyb20gIi4vc2VsZWN0aW9uX3VwZGF0ZXMiCgovLyBVUERBVElORwoKLy8gQWxsb3cgImJlZm9yZUNoYW5nZSIgZXZlbnQgaGFuZGxlcnMgdG8gaW5mbHVlbmNlIGEgY2hhbmdlCmZ1bmN0aW9uIGZpbHRlckNoYW5nZShkb2MsIGNoYW5nZSwgdXBkYXRlKSB7CiAgbGV0IG9iaiA9IHsKICAgIGNhbmNlbGVkOiBmYWxzZSwKICAgIGZyb206IGNoYW5nZS5mcm9tLAogICAgdG86IGNoYW5nZS50bywKICAgIHRleHQ6IGNoYW5nZS50ZXh0LAogICAgb3JpZ2luOiBjaGFuZ2Uub3JpZ2luLAogICAgY2FuY2VsOiAoKSA9PiBvYmouY2FuY2VsZWQgPSB0cnVlCiAgfQogIGlmICh1cGRhdGUpIG9iai51cGRhdGUgPSAoZnJvbSwgdG8sIHRleHQsIG9yaWdpbikgPT4gewogICAgaWYgKGZyb20pIG9iai5mcm9tID0gY2xpcFBvcyhkb2MsIGZyb20pCiAgICBpZiAodG8pIG9iai50byA9IGNsaXBQb3MoZG9jLCB0bykKICAgIGlmICh0ZXh0KSBvYmoudGV4dCA9IHRleHQKICAgIGlmIChvcmlnaW4gIT09IHVuZGVmaW5lZCkgb2JqLm9yaWdpbiA9IG9yaWdpbgogIH0KICBzaWduYWwoZG9jLCAiYmVmb3JlQ2hhbmdlIiwgZG9jLCBvYmopCiAgaWYgKGRvYy5jbSkgc2lnbmFsKGRvYy5jbSwgImJlZm9yZUNoYW5nZSIsIGRvYy5jbSwgb2JqKQoKICBpZiAob2JqLmNhbmNlbGVkKSByZXR1cm4gbnVsbAogIHJldHVybiB7ZnJvbTogb2JqLmZyb20sIHRvOiBvYmoudG8sIHRleHQ6IG9iai50ZXh0LCBvcmlnaW46IG9iai5vcmlnaW59Cn0KCi8vIEFwcGx5IGEgY2hhbmdlIHRvIGEgZG9jdW1lbnQsIGFuZCBhZGQgaXQgdG8gdGhlIGRvY3VtZW50J3MKLy8gaGlzdG9yeSwgYW5kIHByb3BhZ2F0aW5nIGl0IHRvIGFsbCBsaW5rZWQgZG9jdW1lbnRzLgpleHBvcnQgZnVuY3Rpb24gbWFrZUNoYW5nZShkb2MsIGNoYW5nZSwgaWdub3JlUmVhZE9ubHkpIHsKICBpZiAoZG9jLmNtKSB7CiAgICBpZiAoIWRvYy5jbS5jdXJPcCkgcmV0dXJuIG9wZXJhdGlvbihkb2MuY20sIG1ha2VDaGFuZ2UpKGRvYywgY2hhbmdlLCBpZ25vcmVSZWFkT25seSkKICAgIGlmIChkb2MuY20uc3RhdGUuc3VwcHJlc3NFZGl0cykgcmV0dXJuCiAgfQoKICBpZiAoaGFzSGFuZGxlcihkb2MsICJiZWZvcmVDaGFuZ2UiKSB8fCBkb2MuY20gJiYgaGFzSGFuZGxlcihkb2MuY20sICJiZWZvcmVDaGFuZ2UiKSkgewogICAgY2hhbmdlID0gZmlsdGVyQ2hhbmdlKGRvYywgY2hhbmdlLCB0cnVlKQogICAgaWYgKCFjaGFuZ2UpIHJldHVybgogIH0KCiAgLy8gUG9zc2libHkgc3BsaXQgb3Igc3VwcHJlc3MgdGhlIHVwZGF0ZSBiYXNlZCBvbiB0aGUgcHJlc2VuY2UKICAvLyBvZiByZWFkLW9ubHkgc3BhbnMgaW4gaXRzIHJhbmdlLgogIGxldCBzcGxpdCA9IHNhd1JlYWRPbmx5U3BhbnMgJiYgIWlnbm9yZVJlYWRPbmx5ICYmIHJlbW92ZVJlYWRPbmx5UmFuZ2VzKGRvYywgY2hhbmdlLmZyb20sIGNoYW5nZS50bykKICBpZiAoc3BsaXQpIHsKICAgIGZvciAobGV0IGkgPSBzcGxpdC5sZW5ndGggLSAxOyBpID49IDA7IC0taSkKICAgICAgbWFrZUNoYW5nZUlubmVyKGRvYywge2Zyb206IHNwbGl0W2ldLmZyb20sIHRvOiBzcGxpdFtpXS50bywgdGV4dDogaSA/IFsiIl0gOiBjaGFuZ2UudGV4dH0pCiAgfSBlbHNlIHsKICAgIG1ha2VDaGFuZ2VJbm5lcihkb2MsIGNoYW5nZSkKICB9Cn0KCmZ1bmN0aW9uIG1ha2VDaGFuZ2VJbm5lcihkb2MsIGNoYW5nZSkgewogIGlmIChjaGFuZ2UudGV4dC5sZW5ndGggPT0gMSAmJiBjaGFuZ2UudGV4dFswXSA9PSAiIiAmJiBjbXAoY2hhbmdlLmZyb20sIGNoYW5nZS50bykgPT0gMCkgcmV0dXJuCiAgbGV0IHNlbEFmdGVyID0gY29tcHV0ZVNlbEFmdGVyQ2hhbmdlKGRvYywgY2hhbmdlKQogIGFkZENoYW5nZVRvSGlzdG9yeShkb2MsIGNoYW5nZSwgc2VsQWZ0ZXIsIGRvYy5jbSA/IGRvYy5jbS5jdXJPcC5pZCA6IE5hTikKCiAgbWFrZUNoYW5nZVNpbmdsZURvYyhkb2MsIGNoYW5nZSwgc2VsQWZ0ZXIsIHN0cmV0Y2hTcGFuc092ZXJDaGFuZ2UoZG9jLCBjaGFuZ2UpKQogIGxldCByZWJhc2VkID0gW10KCiAgbGlua2VkRG9jcyhkb2MsIChkb2MsIHNoYXJlZEhpc3QpID0+IHsKICAgIGlmICghc2hhcmVkSGlzdCAmJiBpbmRleE9mKHJlYmFzZWQsIGRvYy5oaXN0b3J5KSA9PSAtMSkgewogICAgICByZWJhc2VIaXN0KGRvYy5oaXN0b3J5LCBjaGFuZ2UpCiAgICAgIHJlYmFzZWQucHVzaChkb2MuaGlzdG9yeSkKICAgIH0KICAgIG1ha2VDaGFuZ2VTaW5nbGVEb2MoZG9jLCBjaGFuZ2UsIG51bGwsIHN0cmV0Y2hTcGFuc092ZXJDaGFuZ2UoZG9jLCBjaGFuZ2UpKQogIH0pCn0KCi8vIFJldmVydCBhIGNoYW5nZSBzdG9yZWQgaW4gYSBkb2N1bWVudCdzIGhpc3RvcnkuCmV4cG9ydCBmdW5jdGlvbiBtYWtlQ2hhbmdlRnJvbUhpc3RvcnkoZG9jLCB0eXBlLCBhbGxvd1NlbGVjdGlvbk9ubHkpIHsKICBpZiAoZG9jLmNtICYmIGRvYy5jbS5zdGF0ZS5zdXBwcmVzc0VkaXRzICYmICFhbGxvd1NlbGVjdGlvbk9ubHkpIHJldHVybgoKICBsZXQgaGlzdCA9IGRvYy5oaXN0b3J5LCBldmVudCwgc2VsQWZ0ZXIgPSBkb2Muc2VsCiAgbGV0IHNvdXJjZSA9IHR5cGUgPT0gInVuZG8iID8gaGlzdC5kb25lIDogaGlzdC51bmRvbmUsIGRlc3QgPSB0eXBlID09ICJ1bmRvIiA/IGhpc3QudW5kb25lIDogaGlzdC5kb25lCgogIC8vIFZlcmlmeSB0aGF0IHRoZXJlIGlzIGEgdXNlYWJsZSBldmVudCAoc28gdGhhdCBjdHJsLXogd29uJ3QKICAvLyBuZWVkbGVzc2x5IGNsZWFyIHNlbGVjdGlvbiBldmVudHMpCiAgbGV0IGkgPSAwCiAgZm9yICg7IGkgPCBzb3VyY2UubGVuZ3RoOyBpKyspIHsKICAgIGV2ZW50ID0gc291cmNlW2ldCiAgICBpZiAoYWxsb3dTZWxlY3Rpb25Pbmx5ID8gZXZlbnQucmFuZ2VzICYmICFldmVudC5lcXVhbHMoZG9jLnNlbCkgOiAhZXZlbnQucmFuZ2VzKQogICAgICBicmVhawogIH0KICBpZiAoaSA9PSBzb3VyY2UubGVuZ3RoKSByZXR1cm4KICBoaXN0Lmxhc3RPcmlnaW4gPSBoaXN0Lmxhc3RTZWxPcmlnaW4gPSBudWxsCgogIGZvciAoOzspIHsKICAgIGV2ZW50ID0gc291cmNlLnBvcCgpCiAgICBpZiAoZXZlbnQucmFuZ2VzKSB7CiAgICAgIHB1c2hTZWxlY3Rpb25Ub0hpc3RvcnkoZXZlbnQsIGRlc3QpCiAgICAgIGlmIChhbGxvd1NlbGVjdGlvbk9ubHkgJiYgIWV2ZW50LmVxdWFscyhkb2Muc2VsKSkgewogICAgICAgIHNldFNlbGVjdGlvbihkb2MsIGV2ZW50LCB7Y2xlYXJSZWRvOiBmYWxzZX0pCiAgICAgICAgcmV0dXJuCiAgICAgIH0KICAgICAgc2VsQWZ0ZXIgPSBldmVudAogICAgfQogICAgZWxzZSBicmVhawogIH0KCiAgLy8gQnVpbGQgdXAgYSByZXZlcnNlIGNoYW5nZSBvYmplY3QgdG8gYWRkIHRvIHRoZSBvcHBvc2l0ZSBoaXN0b3J5CiAgLy8gc3RhY2sgKHJlZG8gd2hlbiB1bmRvaW5nLCBhbmQgdmljZSB2ZXJzYSkuCiAgbGV0IGFudGlDaGFuZ2VzID0gW10KICBwdXNoU2VsZWN0aW9uVG9IaXN0b3J5KHNlbEFmdGVyLCBkZXN0KQogIGRlc3QucHVzaCh7Y2hhbmdlczogYW50aUNoYW5nZXMsIGdlbmVyYXRpb246IGhpc3QuZ2VuZXJhdGlvbn0pCiAgaGlzdC5nZW5lcmF0aW9uID0gZXZlbnQuZ2VuZXJhdGlvbiB8fCArK2hpc3QubWF4R2VuZXJhdGlvbgoKICBsZXQgZmlsdGVyID0gaGFzSGFuZGxlcihkb2MsICJiZWZvcmVDaGFuZ2UiKSB8fCBkb2MuY20gJiYgaGFzSGFuZGxlcihkb2MuY20sICJiZWZvcmVDaGFuZ2UiKQoKICBmb3IgKGxldCBpID0gZXZlbnQuY2hhbmdlcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkgewogICAgbGV0IGNoYW5nZSA9IGV2ZW50LmNoYW5nZXNbaV0KICAgIGNoYW5nZS5vcmlnaW4gPSB0eXBlCiAgICBpZiAoZmlsdGVyICYmICFmaWx0ZXJDaGFuZ2UoZG9jLCBjaGFuZ2UsIGZhbHNlKSkgewogICAgICBzb3VyY2UubGVuZ3RoID0gMAogICAgICByZXR1cm4KICAgIH0KCiAgICBhbnRpQ2hhbmdlcy5wdXNoKGhpc3RvcnlDaGFuZ2VGcm9tQ2hhbmdlKGRvYywgY2hhbmdlKSkKCiAgICBsZXQgYWZ0ZXIgPSBpID8gY29tcHV0ZVNlbEFmdGVyQ2hhbmdlKGRvYywgY2hhbmdlKSA6IGxzdChzb3VyY2UpCiAgICBtYWtlQ2hhbmdlU2luZ2xlRG9jKGRvYywgY2hhbmdlLCBhZnRlciwgbWVyZ2VPbGRTcGFucyhkb2MsIGNoYW5nZSkpCiAgICBpZiAoIWkgJiYgZG9jLmNtKSBkb2MuY20uc2Nyb2xsSW50b1ZpZXcoe2Zyb206IGNoYW5nZS5mcm9tLCB0bzogY2hhbmdlRW5kKGNoYW5nZSl9KQogICAgbGV0IHJlYmFzZWQgPSBbXQoKICAgIC8vIFByb3BhZ2F0ZSB0byB0aGUgbGlua2VkIGRvY3VtZW50cwogICAgbGlua2VkRG9jcyhkb2MsIChkb2MsIHNoYXJlZEhpc3QpID0+IHsKICAgICAgaWYgKCFzaGFyZWRIaXN0ICYmIGluZGV4T2YocmViYXNlZCwgZG9jLmhpc3RvcnkpID09IC0xKSB7CiAgICAgICAgcmViYXNlSGlzdChkb2MuaGlzdG9yeSwgY2hhbmdlKQogICAgICAgIHJlYmFzZWQucHVzaChkb2MuaGlzdG9yeSkKICAgICAgfQogICAgICBtYWtlQ2hhbmdlU2luZ2xlRG9jKGRvYywgY2hhbmdlLCBudWxsLCBtZXJnZU9sZFNwYW5zKGRvYywgY2hhbmdlKSkKICAgIH0pCiAgfQp9CgovLyBTdWItdmlld3MgbmVlZCB0aGVpciBsaW5lIG51bWJlcnMgc2hpZnRlZCB3aGVuIHRleHQgaXMgYWRkZWQKLy8gYWJvdmUgb3IgYmVsb3cgdGhlbSBpbiB0aGUgcGFyZW50IGRvY3VtZW50LgpmdW5jdGlvbiBzaGlmdERvYyhkb2MsIGRpc3RhbmNlKSB7CiAgaWYgKGRpc3RhbmNlID09IDApIHJldHVybgogIGRvYy5maXJzdCArPSBkaXN0YW5jZQogIGRvYy5zZWwgPSBuZXcgU2VsZWN0aW9uKG1hcChkb2Muc2VsLnJhbmdlcywgcmFuZ2UgPT4gbmV3IFJhbmdlKAogICAgUG9zKHJhbmdlLmFuY2hvci5saW5lICsgZGlzdGFuY2UsIHJhbmdlLmFuY2hvci5jaCksCiAgICBQb3MocmFuZ2UuaGVhZC5saW5lICsgZGlzdGFuY2UsIHJhbmdlLmhlYWQuY2gpCiAgKSksIGRvYy5zZWwucHJpbUluZGV4KQogIGlmIChkb2MuY20pIHsKICAgIHJlZ0NoYW5nZShkb2MuY20sIGRvYy5maXJzdCwgZG9jLmZpcnN0IC0gZGlzdGFuY2UsIGRpc3RhbmNlKQogICAgZm9yIChsZXQgZCA9IGRvYy5jbS5kaXNwbGF5LCBsID0gZC52aWV3RnJvbTsgbCA8IGQudmlld1RvOyBsKyspCiAgICAgIHJlZ0xpbmVDaGFuZ2UoZG9jLmNtLCBsLCAiZ3V0dGVyIikKICB9Cn0KCi8vIE1vcmUgbG93ZXItbGV2ZWwgY2hhbmdlIGZ1bmN0aW9uLCBoYW5kbGluZyBvbmx5IGEgc2luZ2xlIGRvY3VtZW50Ci8vIChub3QgbGlua2VkIG9uZXMpLgpmdW5jdGlvbiBtYWtlQ2hhbmdlU2luZ2xlRG9jKGRvYywgY2hhbmdlLCBzZWxBZnRlciwgc3BhbnMpIHsKICBpZiAoZG9jLmNtICYmICFkb2MuY20uY3VyT3ApCiAgICByZXR1cm4gb3BlcmF0aW9uKGRvYy5jbSwgbWFrZUNoYW5nZVNpbmdsZURvYykoZG9jLCBjaGFuZ2UsIHNlbEFmdGVyLCBzcGFucykKCiAgaWYgKGNoYW5nZS50by5saW5lIDwgZG9jLmZpcnN0KSB7CiAgICBzaGlmdERvYyhkb2MsIGNoYW5nZS50ZXh0Lmxlbmd0aCAtIDEgLSAoY2hhbmdlLnRvLmxpbmUgLSBjaGFuZ2UuZnJvbS5saW5lKSkKICAgIHJldHVybgogIH0KICBpZiAoY2hhbmdlLmZyb20ubGluZSA+IGRvYy5sYXN0TGluZSgpKSByZXR1cm4KCiAgLy8gQ2xpcCB0aGUgY2hhbmdlIHRvIHRoZSBzaXplIG9mIHRoaXMgZG9jCiAgaWYgKGNoYW5nZS5mcm9tLmxpbmUgPCBkb2MuZmlyc3QpIHsKICAgIGxldCBzaGlmdCA9IGNoYW5nZS50ZXh0Lmxlbmd0aCAtIDEgLSAoZG9jLmZpcnN0IC0gY2hhbmdlLmZyb20ubGluZSkKICAgIHNoaWZ0RG9jKGRvYywgc2hpZnQpCiAgICBjaGFuZ2UgPSB7ZnJvbTogUG9zKGRvYy5maXJzdCwgMCksIHRvOiBQb3MoY2hhbmdlLnRvLmxpbmUgKyBzaGlmdCwgY2hhbmdlLnRvLmNoKSwKICAgICAgICAgICAgICB0ZXh0OiBbbHN0KGNoYW5nZS50ZXh0KV0sIG9yaWdpbjogY2hhbmdlLm9yaWdpbn0KICB9CiAgbGV0IGxhc3QgPSBkb2MubGFzdExpbmUoKQogIGlmIChjaGFuZ2UudG8ubGluZSA+IGxhc3QpIHsKICAgIGNoYW5nZSA9IHtmcm9tOiBjaGFuZ2UuZnJvbSwgdG86IFBvcyhsYXN0LCBnZXRMaW5lKGRvYywgbGFzdCkudGV4dC5sZW5ndGgpLAogICAgICAgICAgICAgIHRleHQ6IFtjaGFuZ2UudGV4dFswXV0sIG9yaWdpbjogY2hhbmdlLm9yaWdpbn0KICB9CgogIGNoYW5nZS5yZW1vdmVkID0gZ2V0QmV0d2Vlbihkb2MsIGNoYW5nZS5mcm9tLCBjaGFuZ2UudG8pCgogIGlmICghc2VsQWZ0ZXIpIHNlbEFmdGVyID0gY29tcHV0ZVNlbEFmdGVyQ2hhbmdlKGRvYywgY2hhbmdlKQogIGlmIChkb2MuY20pIG1ha2VDaGFuZ2VTaW5nbGVEb2NJbkVkaXRvcihkb2MuY20sIGNoYW5nZSwgc3BhbnMpCiAgZWxzZSB1cGRhdGVEb2MoZG9jLCBjaGFuZ2UsIHNwYW5zKQogIHNldFNlbGVjdGlvbk5vVW5kbyhkb2MsIHNlbEFmdGVyLCBzZWxfZG9udFNjcm9sbCkKfQoKLy8gSGFuZGxlIHRoZSBpbnRlcmFjdGlvbiBvZiBhIGNoYW5nZSB0byBhIGRvY3VtZW50IHdpdGggdGhlIGVkaXRvcgovLyB0aGF0IHRoaXMgZG9jdW1lbnQgaXMgcGFydCBvZi4KZnVuY3Rpb24gbWFrZUNoYW5nZVNpbmdsZURvY0luRWRpdG9yKGNtLCBjaGFuZ2UsIHNwYW5zKSB7CiAgbGV0IGRvYyA9IGNtLmRvYywgZGlzcGxheSA9IGNtLmRpc3BsYXksIGZyb20gPSBjaGFuZ2UuZnJvbSwgdG8gPSBjaGFuZ2UudG8KCiAgbGV0IHJlY29tcHV0ZU1heExlbmd0aCA9IGZhbHNlLCBjaGVja1dpZHRoU3RhcnQgPSBmcm9tLmxpbmUKICBpZiAoIWNtLm9wdGlvbnMubGluZVdyYXBwaW5nKSB7CiAgICBjaGVja1dpZHRoU3RhcnQgPSBsaW5lTm8odmlzdWFsTGluZShnZXRMaW5lKGRvYywgZnJvbS5saW5lKSkpCiAgICBkb2MuaXRlcihjaGVja1dpZHRoU3RhcnQsIHRvLmxpbmUgKyAxLCBsaW5lID0+IHsKICAgICAgaWYgKGxpbmUgPT0gZGlzcGxheS5tYXhMaW5lKSB7CiAgICAgICAgcmVjb21wdXRlTWF4TGVuZ3RoID0gdHJ1ZQogICAgICAgIHJldHVybiB0cnVlCiAgICAgIH0KICAgIH0pCiAgfQoKICBpZiAoZG9jLnNlbC5jb250YWlucyhjaGFuZ2UuZnJvbSwgY2hhbmdlLnRvKSA+IC0xKQogICAgc2lnbmFsQ3Vyc29yQWN0aXZpdHkoY20pCgogIHVwZGF0ZURvYyhkb2MsIGNoYW5nZSwgc3BhbnMsIGVzdGltYXRlSGVpZ2h0KGNtKSkKCiAgaWYgKCFjbS5vcHRpb25zLmxpbmVXcmFwcGluZykgewogICAgZG9jLml0ZXIoY2hlY2tXaWR0aFN0YXJ0LCBmcm9tLmxpbmUgKyBjaGFuZ2UudGV4dC5sZW5ndGgsIGxpbmUgPT4gewogICAgICBsZXQgbGVuID0gbGluZUxlbmd0aChsaW5lKQogICAgICBpZiAobGVuID4gZGlzcGxheS5tYXhMaW5lTGVuZ3RoKSB7CiAgICAgICAgZGlzcGxheS5tYXhMaW5lID0gbGluZQogICAgICAgIGRpc3BsYXkubWF4TGluZUxlbmd0aCA9IGxlbgogICAgICAgIGRpc3BsYXkubWF4TGluZUNoYW5nZWQgPSB0cnVlCiAgICAgICAgcmVjb21wdXRlTWF4TGVuZ3RoID0gZmFsc2UKICAgICAgfQogICAgfSkKICAgIGlmIChyZWNvbXB1dGVNYXhMZW5ndGgpIGNtLmN1ck9wLnVwZGF0ZU1heExpbmUgPSB0cnVlCiAgfQoKICAvLyBBZGp1c3QgZnJvbnRpZXIsIHNjaGVkdWxlIHdvcmtlcgogIGRvYy5mcm9udGllciA9IE1hdGgubWluKGRvYy5mcm9udGllciwgZnJvbS5saW5lKQogIHN0YXJ0V29ya2VyKGNtLCA0MDApCgogIGxldCBsZW5kaWZmID0gY2hhbmdlLnRleHQubGVuZ3RoIC0gKHRvLmxpbmUgLSBmcm9tLmxpbmUpIC0gMQogIC8vIFJlbWVtYmVyIHRoYXQgdGhlc2UgbGluZXMgY2hhbmdlZCwgZm9yIHVwZGF0aW5nIHRoZSBkaXNwbGF5CiAgaWYgKGNoYW5nZS5mdWxsKQogICAgcmVnQ2hhbmdlKGNtKQogIGVsc2UgaWYgKGZyb20ubGluZSA9PSB0by5saW5lICYmIGNoYW5nZS50ZXh0Lmxlbmd0aCA9PSAxICYmICFpc1dob2xlTGluZVVwZGF0ZShjbS5kb2MsIGNoYW5nZSkpCiAgICByZWdMaW5lQ2hhbmdlKGNtLCBmcm9tLmxpbmUsICJ0ZXh0IikKICBlbHNlCiAgICByZWdDaGFuZ2UoY20sIGZyb20ubGluZSwgdG8ubGluZSArIDEsIGxlbmRpZmYpCgogIGxldCBjaGFuZ2VzSGFuZGxlciA9IGhhc0hhbmRsZXIoY20sICJjaGFuZ2VzIiksIGNoYW5nZUhhbmRsZXIgPSBoYXNIYW5kbGVyKGNtLCAiY2hhbmdlIikKICBpZiAoY2hhbmdlSGFuZGxlciB8fCBjaGFuZ2VzSGFuZGxlcikgewogICAgbGV0IG9iaiA9IHsKICAgICAgZnJvbTogZnJvbSwgdG86IHRvLAogICAgICB0ZXh0OiBjaGFuZ2UudGV4dCwKICAgICAgcmVtb3ZlZDogY2hhbmdlLnJlbW92ZWQsCiAgICAgIG9yaWdpbjogY2hhbmdlLm9yaWdpbgogICAgfQogICAgaWYgKGNoYW5nZUhhbmRsZXIpIHNpZ25hbExhdGVyKGNtLCAiY2hhbmdlIiwgY20sIG9iaikKICAgIGlmIChjaGFuZ2VzSGFuZGxlcikgKGNtLmN1ck9wLmNoYW5nZU9ianMgfHwgKGNtLmN1ck9wLmNoYW5nZU9ianMgPSBbXSkpLnB1c2gob2JqKQogIH0KICBjbS5kaXNwbGF5LnNlbEZvckNvbnRleHRNZW51ID0gbnVsbAp9CgpleHBvcnQgZnVuY3Rpb24gcmVwbGFjZVJhbmdlKGRvYywgY29kZSwgZnJvbSwgdG8sIG9yaWdpbikgewogIGlmICghdG8pIHRvID0gZnJvbQogIGlmIChjbXAodG8sIGZyb20pIDwgMCkgeyBsZXQgdG1wID0gdG87IHRvID0gZnJvbTsgZnJvbSA9IHRtcCB9CiAgaWYgKHR5cGVvZiBjb2RlID09ICJzdHJpbmciKSBjb2RlID0gZG9jLnNwbGl0TGluZXMoY29kZSkKICBtYWtlQ2hhbmdlKGRvYywge2Zyb206IGZyb20sIHRvOiB0bywgdGV4dDogY29kZSwgb3JpZ2luOiBvcmlnaW59KQp9CgovLyBSZWJhc2luZy9yZXNldHRpbmcgaGlzdG9yeSB0byBkZWFsIHdpdGggZXh0ZXJuYWxseS1zb3VyY2VkIGNoYW5nZXMKCmZ1bmN0aW9uIHJlYmFzZUhpc3RTZWxTaW5nbGUocG9zLCBmcm9tLCB0bywgZGlmZikgewogIGlmICh0byA8IHBvcy5saW5lKSB7CiAgICBwb3MubGluZSArPSBkaWZmCiAgfSBlbHNlIGlmIChmcm9tIDwgcG9zLmxpbmUpIHsKICAgIHBvcy5saW5lID0gZnJvbQogICAgcG9zLmNoID0gMAogIH0KfQoKLy8gVHJpZXMgdG8gcmViYXNlIGFuIGFycmF5IG9mIGhpc3RvcnkgZXZlbnRzIGdpdmVuIGEgY2hhbmdlIGluIHRoZQovLyBkb2N1bWVudC4gSWYgdGhlIGNoYW5nZSB0b3VjaGVzIHRoZSBzYW1lIGxpbmVzIGFzIHRoZSBldmVudCwgdGhlCi8vIGV2ZW50LCBhbmQgZXZlcnl0aGluZyAnYmVoaW5kJyBpdCwgaXMgZGlzY2FyZGVkLiBJZiB0aGUgY2hhbmdlIGlzCi8vIGJlZm9yZSB0aGUgZXZlbnQsIHRoZSBldmVudCdzIHBvc2l0aW9ucyBhcmUgdXBkYXRlZC4gVXNlcyBhCi8vIGNvcHktb24td3JpdGUgc2NoZW1lIGZvciB0aGUgcG9zaXRpb25zLCB0byBhdm9pZCBoYXZpbmcgdG8KLy8gcmVhbGxvY2F0ZSB0aGVtIGFsbCBvbiBldmVyeSByZWJhc2UsIGJ1dCBhbHNvIGF2b2lkIHByb2JsZW1zIHdpdGgKLy8gc2hhcmVkIHBvc2l0aW9uIG9iamVjdHMgYmVpbmcgdW5zYWZlbHkgdXBkYXRlZC4KZnVuY3Rpb24gcmViYXNlSGlzdEFycmF5KGFycmF5LCBmcm9tLCB0bywgZGlmZikgewogIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyArK2kpIHsKICAgIGxldCBzdWIgPSBhcnJheVtpXSwgb2sgPSB0cnVlCiAgICBpZiAoc3ViLnJhbmdlcykgewogICAgICBpZiAoIXN1Yi5jb3BpZWQpIHsgc3ViID0gYXJyYXlbaV0gPSBzdWIuZGVlcENvcHkoKTsgc3ViLmNvcGllZCA9IHRydWUgfQogICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHN1Yi5yYW5nZXMubGVuZ3RoOyBqKyspIHsKICAgICAgICByZWJhc2VIaXN0U2VsU2luZ2xlKHN1Yi5yYW5nZXNbal0uYW5jaG9yLCBmcm9tLCB0bywgZGlmZikKICAgICAgICByZWJhc2VIaXN0U2VsU2luZ2xlKHN1Yi5yYW5nZXNbal0uaGVhZCwgZnJvbSwgdG8sIGRpZmYpCiAgICAgIH0KICAgICAgY29udGludWUKICAgIH0KICAgIGZvciAobGV0IGogPSAwOyBqIDwgc3ViLmNoYW5nZXMubGVuZ3RoOyArK2opIHsKICAgICAgbGV0IGN1ciA9IHN1Yi5jaGFuZ2VzW2pdCiAgICAgIGlmICh0byA8IGN1ci5mcm9tLmxpbmUpIHsKICAgICAgICBjdXIuZnJvbSA9IFBvcyhjdXIuZnJvbS5saW5lICsgZGlmZiwgY3VyLmZyb20uY2gpCiAgICAgICAgY3VyLnRvID0gUG9zKGN1ci50by5saW5lICsgZGlmZiwgY3VyLnRvLmNoKQogICAgICB9IGVsc2UgaWYgKGZyb20gPD0gY3VyLnRvLmxpbmUpIHsKICAgICAgICBvayA9IGZhbHNlCiAgICAgICAgYnJlYWsKICAgICAgfQogICAgfQogICAgaWYgKCFvaykgewogICAgICBhcnJheS5zcGxpY2UoMCwgaSArIDEpCiAgICAgIGkgPSAwCiAgICB9CiAgfQp9CgpmdW5jdGlvbiByZWJhc2VIaXN0KGhpc3QsIGNoYW5nZSkgewogIGxldCBmcm9tID0gY2hhbmdlLmZyb20ubGluZSwgdG8gPSBjaGFuZ2UudG8ubGluZSwgZGlmZiA9IGNoYW5nZS50ZXh0Lmxlbmd0aCAtICh0byAtIGZyb20pIC0gMQogIHJlYmFzZUhpc3RBcnJheShoaXN0LmRvbmUsIGZyb20sIHRvLCBkaWZmKQogIHJlYmFzZUhpc3RBcnJheShoaXN0LnVuZG9uZSwgZnJvbSwgdG8sIGRpZmYpCn0KCi8vIFV0aWxpdHkgZm9yIGFwcGx5aW5nIGEgY2hhbmdlIHRvIGEgbGluZSBieSBoYW5kbGUgb3IgbnVtYmVyLAovLyByZXR1cm5pbmcgdGhlIG51bWJlciBhbmQgb3B0aW9uYWxseSByZWdpc3RlcmluZyB0aGUgbGluZSBhcwovLyBjaGFuZ2VkLgpleHBvcnQgZnVuY3Rpb24gY2hhbmdlTGluZShkb2MsIGhhbmRsZSwgY2hhbmdlVHlwZSwgb3ApIHsKICBsZXQgbm8gPSBoYW5kbGUsIGxpbmUgPSBoYW5kbGUKICBpZiAodHlwZW9mIGhhbmRsZSA9PSAibnVtYmVyIikgbGluZSA9IGdldExpbmUoZG9jLCBjbGlwTGluZShkb2MsIGhhbmRsZSkpCiAgZWxzZSBubyA9IGxpbmVObyhoYW5kbGUpCiAgaWYgKG5vID09IG51bGwpIHJldHVybiBudWxsCiAgaWYgKG9wKGxpbmUsIG5vKSAmJiBkb2MuY20pIHJlZ0xpbmVDaGFuZ2UoZG9jLmNtLCBubywgY2hhbmdlVHlwZSkKICByZXR1cm4gbGluZQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/src/model/change_measurement.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aW1wb3J0IHsgY21wLCBQb3MgfSBmcm9tICIuLi9saW5lL3BvcyIKaW1wb3J0IHsgbHN0IH0gZnJvbSAiLi4vdXRpbC9taXNjIgoKaW1wb3J0IHsgbm9ybWFsaXplU2VsZWN0aW9uLCBSYW5nZSwgU2VsZWN0aW9uIH0gZnJvbSAiLi9zZWxlY3Rpb24iCgovLyBDb21wdXRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgZW5kIG9mIGEgY2hhbmdlIChpdHMgJ3RvJyBwcm9wZXJ0eQovLyByZWZlcnMgdG8gdGhlIHByZS1jaGFuZ2UgZW5kKS4KZXhwb3J0IGZ1bmN0aW9uIGNoYW5nZUVuZChjaGFuZ2UpIHsKICBpZiAoIWNoYW5nZS50ZXh0KSByZXR1cm4gY2hhbmdlLnRvCiAgcmV0dXJuIFBvcyhjaGFuZ2UuZnJvbS5saW5lICsgY2hhbmdlLnRleHQubGVuZ3RoIC0gMSwKICAgICAgICAgICAgIGxzdChjaGFuZ2UudGV4dCkubGVuZ3RoICsgKGNoYW5nZS50ZXh0Lmxlbmd0aCA9PSAxID8gY2hhbmdlLmZyb20uY2ggOiAwKSkKfQoKLy8gQWRqdXN0IGEgcG9zaXRpb24gdG8gcmVmZXIgdG8gdGhlIHBvc3QtY2hhbmdlIHBvc2l0aW9uIG9mIHRoZQovLyBzYW1lIHRleHQsIG9yIHRoZSBlbmQgb2YgdGhlIGNoYW5nZSBpZiB0aGUgY2hhbmdlIGNvdmVycyBpdC4KZnVuY3Rpb24gYWRqdXN0Rm9yQ2hhbmdlKHBvcywgY2hhbmdlKSB7CiAgaWYgKGNtcChwb3MsIGNoYW5nZS5mcm9tKSA8IDApIHJldHVybiBwb3MKICBpZiAoY21wKHBvcywgY2hhbmdlLnRvKSA8PSAwKSByZXR1cm4gY2hhbmdlRW5kKGNoYW5nZSkKCiAgbGV0IGxpbmUgPSBwb3MubGluZSArIGNoYW5nZS50ZXh0Lmxlbmd0aCAtIChjaGFuZ2UudG8ubGluZSAtIGNoYW5nZS5mcm9tLmxpbmUpIC0gMSwgY2ggPSBwb3MuY2gKICBpZiAocG9zLmxpbmUgPT0gY2hhbmdlLnRvLmxpbmUpIGNoICs9IGNoYW5nZUVuZChjaGFuZ2UpLmNoIC0gY2hhbmdlLnRvLmNoCiAgcmV0dXJuIFBvcyhsaW5lLCBjaCkKfQoKZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVTZWxBZnRlckNoYW5nZShkb2MsIGNoYW5nZSkgewogIGxldCBvdXQgPSBbXQogIGZvciAobGV0IGkgPSAwOyBpIDwgZG9jLnNlbC5yYW5nZXMubGVuZ3RoOyBpKyspIHsKICAgIGxldCByYW5nZSA9IGRvYy5zZWwucmFuZ2VzW2ldCiAgICBvdXQucHVzaChuZXcgUmFuZ2UoYWRqdXN0Rm9yQ2hhbmdlKHJhbmdlLmFuY2hvciwgY2hhbmdlKSwKICAgICAgICAgICAgICAgICAgICAgICBhZGp1c3RGb3JDaGFuZ2UocmFuZ2UuaGVhZCwgY2hhbmdlKSkpCiAgfQogIHJldHVybiBub3JtYWxpemVTZWxlY3Rpb24ob3V0LCBkb2Muc2VsLnByaW1JbmRleCkKfQoKZnVuY3Rpb24gb2Zmc2V0UG9zKHBvcywgb2xkLCBudykgewogIGlmIChwb3MubGluZSA9PSBvbGQubGluZSkKICAgIHJldHVybiBQb3MobncubGluZSwgcG9zLmNoIC0gb2xkLmNoICsgbncuY2gpCiAgZWxzZQogICAgcmV0dXJuIFBvcyhudy5saW5lICsgKHBvcy5saW5lIC0gb2xkLmxpbmUpLCBwb3MuY2gpCn0KCi8vIFVzZWQgYnkgcmVwbGFjZVNlbGVjdGlvbnMgdG8gYWxsb3cgbW92aW5nIHRoZSBzZWxlY3Rpb24gdG8gdGhlCi8vIHN0YXJ0IG9yIGFyb3VuZCB0aGUgcmVwbGFjZWQgdGVzdC4gSGludCBtYXkgYmUgInN0YXJ0IiBvciAiYXJvdW5kIi4KZXhwb3J0IGZ1bmN0aW9uIGNvbXB1dGVSZXBsYWNlZFNlbChkb2MsIGNoYW5nZXMsIGhpbnQpIHsKICBsZXQgb3V0ID0gW10KICBsZXQgb2xkUHJldiA9IFBvcyhkb2MuZmlyc3QsIDApLCBuZXdQcmV2ID0gb2xkUHJldgogIGZvciAobGV0IGkgPSAwOyBpIDwgY2hhbmdlcy5sZW5ndGg7IGkrKykgewogICAgbGV0IGNoYW5nZSA9IGNoYW5nZXNbaV0KICAgIGxldCBmcm9tID0gb2Zmc2V0UG9zKGNoYW5nZS5mcm9tLCBvbGRQcmV2LCBuZXdQcmV2KQogICAgbGV0IHRvID0gb2Zmc2V0UG9zKGNoYW5nZUVuZChjaGFuZ2UpLCBvbGRQcmV2LCBuZXdQcmV2KQogICAgb2xkUHJldiA9IGNoYW5nZS50bwogICAgbmV3UHJldiA9IHRvCiAgICBpZiAoaGludCA9PSAiYXJvdW5kIikgewogICAgICBsZXQgcmFuZ2UgPSBkb2Muc2VsLnJhbmdlc1tpXSwgaW52ID0gY21wKHJhbmdlLmhlYWQsIHJhbmdlLmFuY2hvcikgPCAwCiAgICAgIG91dFtpXSA9IG5ldyBSYW5nZShpbnYgPyB0byA6IGZyb20sIGludiA/IGZyb20gOiB0bykKICAgIH0gZWxzZSB7CiAgICAgIG91dFtpXSA9IG5ldyBSYW5nZShmcm9tLCBmcm9tKQogICAgfQogIH0KICByZXR1cm4gbmV3IFNlbGVjdGlvbihvdXQsIGRvYy5zZWwucHJpbUluZGV4KQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/src/model/chunk.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aW1wb3J0IHsgY2xlYW5VcExpbmUgfSBmcm9tICIuLi9saW5lL2xpbmVfZGF0YSIKaW1wb3J0IHsgaW5kZXhPZiB9IGZyb20gIi4uL3V0aWwvbWlzYyIKaW1wb3J0IHsgc2lnbmFsTGF0ZXIgfSBmcm9tICIuLi91dGlsL29wZXJhdGlvbl9ncm91cCIKCi8vIFRoZSBkb2N1bWVudCBpcyByZXByZXNlbnRlZCBhcyBhIEJUcmVlIGNvbnNpc3Rpbmcgb2YgbGVhdmVzLCB3aXRoCi8vIGNodW5rIG9mIGxpbmVzIGluIHRoZW0sIGFuZCBicmFuY2hlcywgd2l0aCB1cCB0byB0ZW4gbGVhdmVzIG9yCi8vIG90aGVyIGJyYW5jaCBub2RlcyBiZWxvdyB0aGVtLiBUaGUgdG9wIG5vZGUgaXMgYWx3YXlzIGEgYnJhbmNoCi8vIG5vZGUsIGFuZCBpcyB0aGUgZG9jdW1lbnQgb2JqZWN0IGl0c2VsZiAobWVhbmluZyBpdCBoYXMKLy8gYWRkaXRpb25hbCBtZXRob2RzIGFuZCBwcm9wZXJ0aWVzKS4KLy8KLy8gQWxsIG5vZGVzIGhhdmUgcGFyZW50IGxpbmtzLiBUaGUgdHJlZSBpcyB1c2VkIGJvdGggdG8gZ28gZnJvbQovLyBsaW5lIG51bWJlcnMgdG8gbGluZSBvYmplY3RzLCBhbmQgdG8gZ28gZnJvbSBvYmplY3RzIHRvIG51bWJlcnMuCi8vIEl0IGFsc28gaW5kZXhlcyBieSBoZWlnaHQsIGFuZCBpcyB1c2VkIHRvIGNvbnZlcnQgYmV0d2VlbiBoZWlnaHQKLy8gYW5kIGxpbmUgb2JqZWN0LCBhbmQgdG8gZmluZCB0aGUgdG90YWwgaGVpZ2h0IG9mIHRoZSBkb2N1bWVudC4KLy8KLy8gU2VlIGFsc28gaHR0cDovL21hcmlqbmhhdmVyYmVrZS5ubC9ibG9nL2NvZGVtaXJyb3ItbGluZS10cmVlLmh0bWwKCmV4cG9ydCBmdW5jdGlvbiBMZWFmQ2h1bmsobGluZXMpIHsKICB0aGlzLmxpbmVzID0gbGluZXMKICB0aGlzLnBhcmVudCA9IG51bGwKICBsZXQgaGVpZ2h0ID0gMAogIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyArK2kpIHsKICAgIGxpbmVzW2ldLnBhcmVudCA9IHRoaXMKICAgIGhlaWdodCArPSBsaW5lc1tpXS5oZWlnaHQKICB9CiAgdGhpcy5oZWlnaHQgPSBoZWlnaHQKfQoKTGVhZkNodW5rLnByb3RvdHlwZSA9IHsKICBjaHVua1NpemU6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5saW5lcy5sZW5ndGggfSwKICAvLyBSZW1vdmUgdGhlIG4gbGluZXMgYXQgb2Zmc2V0ICdhdCcuCiAgcmVtb3ZlSW5uZXI6IGZ1bmN0aW9uKGF0LCBuKSB7CiAgICBmb3IgKGxldCBpID0gYXQsIGUgPSBhdCArIG47IGkgPCBlOyArK2kpIHsKICAgICAgbGV0IGxpbmUgPSB0aGlzLmxpbmVzW2ldCiAgICAgIHRoaXMuaGVpZ2h0IC09IGxpbmUuaGVpZ2h0CiAgICAgIGNsZWFuVXBMaW5lKGxpbmUpCiAgICAgIHNpZ25hbExhdGVyKGxpbmUsICJkZWxldGUiKQogICAgfQogICAgdGhpcy5saW5lcy5zcGxpY2UoYXQsIG4pCiAgfSwKICAvLyBIZWxwZXIgdXNlZCB0byBjb2xsYXBzZSBhIHNtYWxsIGJyYW5jaCBpbnRvIGEgc2luZ2xlIGxlYWYuCiAgY29sbGFwc2U6IGZ1bmN0aW9uKGxpbmVzKSB7CiAgICBsaW5lcy5wdXNoLmFwcGx5KGxpbmVzLCB0aGlzLmxpbmVzKQogIH0sCiAgLy8gSW5zZXJ0IHRoZSBnaXZlbiBhcnJheSBvZiBsaW5lcyBhdCBvZmZzZXQgJ2F0JywgY291bnQgdGhlbSBhcwogIC8vIGhhdmluZyB0aGUgZ2l2ZW4gaGVpZ2h0LgogIGluc2VydElubmVyOiBmdW5jdGlvbihhdCwgbGluZXMsIGhlaWdodCkgewogICAgdGhpcy5oZWlnaHQgKz0gaGVpZ2h0CiAgICB0aGlzLmxpbmVzID0gdGhpcy5saW5lcy5zbGljZSgwLCBhdCkuY29uY2F0KGxpbmVzKS5jb25jYXQodGhpcy5saW5lcy5zbGljZShhdCkpCiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgKytpKSBsaW5lc1tpXS5wYXJlbnQgPSB0aGlzCiAgfSwKICAvLyBVc2VkIHRvIGl0ZXJhdGUgb3ZlciBhIHBhcnQgb2YgdGhlIHRyZWUuCiAgaXRlck46IGZ1bmN0aW9uKGF0LCBuLCBvcCkgewogICAgZm9yIChsZXQgZSA9IGF0ICsgbjsgYXQgPCBlOyArK2F0KQogICAgICBpZiAob3AodGhpcy5saW5lc1thdF0pKSByZXR1cm4gdHJ1ZQogIH0KfQoKZXhwb3J0IGZ1bmN0aW9uIEJyYW5jaENodW5rKGNoaWxkcmVuKSB7CiAgdGhpcy5jaGlsZHJlbiA9IGNoaWxkcmVuCiAgbGV0IHNpemUgPSAwLCBoZWlnaHQgPSAwCiAgZm9yIChsZXQgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7ICsraSkgewogICAgbGV0IGNoID0gY2hpbGRyZW5baV0KICAgIHNpemUgKz0gY2guY2h1bmtTaXplKCk7IGhlaWdodCArPSBjaC5oZWlnaHQKICAgIGNoLnBhcmVudCA9IHRoaXMKICB9CiAgdGhpcy5zaXplID0gc2l6ZQogIHRoaXMuaGVpZ2h0ID0gaGVpZ2h0CiAgdGhpcy5wYXJlbnQgPSBudWxsCn0KCkJyYW5jaENodW5rLnByb3RvdHlwZSA9IHsKICBjaHVua1NpemU6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5zaXplIH0sCiAgcmVtb3ZlSW5uZXI6IGZ1bmN0aW9uKGF0LCBuKSB7CiAgICB0aGlzLnNpemUgLT0gbgogICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgKytpKSB7CiAgICAgIGxldCBjaGlsZCA9IHRoaXMuY2hpbGRyZW5baV0sIHN6ID0gY2hpbGQuY2h1bmtTaXplKCkKICAgICAgaWYgKGF0IDwgc3opIHsKICAgICAgICBsZXQgcm0gPSBNYXRoLm1pbihuLCBzeiAtIGF0KSwgb2xkSGVpZ2h0ID0gY2hpbGQuaGVpZ2h0CiAgICAgICAgY2hpbGQucmVtb3ZlSW5uZXIoYXQsIHJtKQogICAgICAgIHRoaXMuaGVpZ2h0IC09IG9sZEhlaWdodCAtIGNoaWxkLmhlaWdodAogICAgICAgIGlmIChzeiA9PSBybSkgeyB0aGlzLmNoaWxkcmVuLnNwbGljZShpLS0sIDEpOyBjaGlsZC5wYXJlbnQgPSBudWxsIH0KICAgICAgICBpZiAoKG4gLT0gcm0pID09IDApIGJyZWFrCiAgICAgICAgYXQgPSAwCiAgICAgIH0gZWxzZSBhdCAtPSBzegogICAgfQogICAgLy8gSWYgdGhlIHJlc3VsdCBpcyBzbWFsbGVyIHRoYW4gMjUgbGluZXMsIGVuc3VyZSB0aGF0IGl0IGlzIGEKICAgIC8vIHNpbmdsZSBsZWFmIG5vZGUuCiAgICBpZiAodGhpcy5zaXplIC0gbiA8IDI1ICYmCiAgICAgICAgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoID4gMSB8fCAhKHRoaXMuY2hpbGRyZW5bMF0gaW5zdGFuY2VvZiBMZWFmQ2h1bmspKSkgewogICAgICBsZXQgbGluZXMgPSBbXQogICAgICB0aGlzLmNvbGxhcHNlKGxpbmVzKQogICAgICB0aGlzLmNoaWxkcmVuID0gW25ldyBMZWFmQ2h1bmsobGluZXMpXQogICAgICB0aGlzLmNoaWxkcmVuWzBdLnBhcmVudCA9IHRoaXMKICAgIH0KICB9LAogIGNvbGxhcHNlOiBmdW5jdGlvbihsaW5lcykgewogICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgKytpKSB0aGlzLmNoaWxkcmVuW2ldLmNvbGxhcHNlKGxpbmVzKQogIH0sCiAgaW5zZXJ0SW5uZXI6IGZ1bmN0aW9uKGF0LCBsaW5lcywgaGVpZ2h0KSB7CiAgICB0aGlzLnNpemUgKz0gbGluZXMubGVuZ3RoCiAgICB0aGlzLmhlaWdodCArPSBoZWlnaHQKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7ICsraSkgewogICAgICBsZXQgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldLCBzeiA9IGNoaWxkLmNodW5rU2l6ZSgpCiAgICAgIGlmIChhdCA8PSBzeikgewogICAgICAgIGNoaWxkLmluc2VydElubmVyKGF0LCBsaW5lcywgaGVpZ2h0KQogICAgICAgIGlmIChjaGlsZC5saW5lcyAmJiBjaGlsZC5saW5lcy5sZW5ndGggPiA1MCkgewogICAgICAgICAgLy8gVG8gYXZvaWQgbWVtb3J5IHRocmFzaGluZyB3aGVuIGNoaWxkLmxpbmVzIGlzIGh1Z2UgKGUuZy4gZmlyc3QgdmlldyBvZiBhIGxhcmdlIGZpbGUpLCBpdCdzIG5ldmVyIHNwbGljZWQuCiAgICAgICAgICAvLyBJbnN0ZWFkLCBzbWFsbCBzbGljZXMgYXJlIHRha2VuLiBUaGV5J3JlIHRha2VuIGluIG9yZGVyIGJlY2F1c2Ugc2VxdWVudGlhbCBtZW1vcnkgYWNjZXNzZXMgYXJlIGZhc3Rlc3QuCiAgICAgICAgICBsZXQgcmVtYWluaW5nID0gY2hpbGQubGluZXMubGVuZ3RoICUgMjUgKyAyNQogICAgICAgICAgZm9yIChsZXQgcG9zID0gcmVtYWluaW5nOyBwb3MgPCBjaGlsZC5saW5lcy5sZW5ndGg7KSB7CiAgICAgICAgICAgIGxldCBsZWFmID0gbmV3IExlYWZDaHVuayhjaGlsZC5saW5lcy5zbGljZShwb3MsIHBvcyArPSAyNSkpCiAgICAgICAgICAgIGNoaWxkLmhlaWdodCAtPSBsZWFmLmhlaWdodAogICAgICAgICAgICB0aGlzLmNoaWxkcmVuLnNwbGljZSgrK2ksIDAsIGxlYWYpCiAgICAgICAgICAgIGxlYWYucGFyZW50ID0gdGhpcwogICAgICAgICAgfQogICAgICAgICAgY2hpbGQubGluZXMgPSBjaGlsZC5saW5lcy5zbGljZSgwLCByZW1haW5pbmcpCiAgICAgICAgICB0aGlzLm1heWJlU3BpbGwoKQogICAgICAgIH0KICAgICAgICBicmVhawogICAgICB9CiAgICAgIGF0IC09IHN6CiAgICB9CiAgfSwKICAvLyBXaGVuIGEgbm9kZSBoYXMgZ3Jvd24sIGNoZWNrIHdoZXRoZXIgaXQgc2hvdWxkIGJlIHNwbGl0LgogIG1heWJlU3BpbGw6IGZ1bmN0aW9uKCkgewogICAgaWYgKHRoaXMuY2hpbGRyZW4ubGVuZ3RoIDw9IDEwKSByZXR1cm4KICAgIGxldCBtZSA9IHRoaXMKICAgIGRvIHsKICAgICAgbGV0IHNwaWxsZWQgPSBtZS5jaGlsZHJlbi5zcGxpY2UobWUuY2hpbGRyZW4ubGVuZ3RoIC0gNSwgNSkKICAgICAgbGV0IHNpYmxpbmcgPSBuZXcgQnJhbmNoQ2h1bmsoc3BpbGxlZCkKICAgICAgaWYgKCFtZS5wYXJlbnQpIHsgLy8gQmVjb21lIHRoZSBwYXJlbnQgbm9kZQogICAgICAgIGxldCBjb3B5ID0gbmV3IEJyYW5jaENodW5rKG1lLmNoaWxkcmVuKQogICAgICAgIGNvcHkucGFyZW50ID0gbWUKICAgICAgICBtZS5jaGlsZHJlbiA9IFtjb3B5LCBzaWJsaW5nXQogICAgICAgIG1lID0gY29weQogICAgIH0gZWxzZSB7CiAgICAgICAgbWUuc2l6ZSAtPSBzaWJsaW5nLnNpemUKICAgICAgICBtZS5oZWlnaHQgLT0gc2libGluZy5oZWlnaHQKICAgICAgICBsZXQgbXlJbmRleCA9IGluZGV4T2YobWUucGFyZW50LmNoaWxkcmVuLCBtZSkKICAgICAgICBtZS5wYXJlbnQuY2hpbGRyZW4uc3BsaWNlKG15SW5kZXggKyAxLCAwLCBzaWJsaW5nKQogICAgICB9CiAgICAgIHNpYmxpbmcucGFyZW50ID0gbWUucGFyZW50CiAgICB9IHdoaWxlIChtZS5jaGlsZHJlbi5sZW5ndGggPiAxMCkKICAgIG1lLnBhcmVudC5tYXliZVNwaWxsKCkKICB9LAogIGl0ZXJOOiBmdW5jdGlvbihhdCwgbiwgb3ApIHsKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5jaGlsZHJlbi5sZW5ndGg7ICsraSkgewogICAgICBsZXQgY2hpbGQgPSB0aGlzLmNoaWxkcmVuW2ldLCBzeiA9IGNoaWxkLmNodW5rU2l6ZSgpCiAgICAgIGlmIChhdCA8IHN6KSB7CiAgICAgICAgbGV0IHVzZWQgPSBNYXRoLm1pbihuLCBzeiAtIGF0KQogICAgICAgIGlmIChjaGlsZC5pdGVyTihhdCwgdXNlZCwgb3ApKSByZXR1cm4gdHJ1ZQogICAgICAgIGlmICgobiAtPSB1c2VkKSA9PSAwKSBicmVhawogICAgICAgIGF0ID0gMAogICAgICB9IGVsc2UgYXQgLT0gc3oKICAgIH0KICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/src/model/Doc.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aW1wb3J0IENvZGVNaXJyb3IgZnJvbSAiLi4vZWRpdC9Db2RlTWlycm9yIgppbXBvcnQgeyBkb2NNZXRob2RPcCB9IGZyb20gIi4uL2Rpc3BsYXkvb3BlcmF0aW9ucyIKaW1wb3J0IHsgTGluZSB9IGZyb20gIi4uL2xpbmUvbGluZV9kYXRhIgppbXBvcnQgeyBjbGlwUG9zLCBjbGlwUG9zQXJyYXksIFBvcyB9IGZyb20gIi4uL2xpbmUvcG9zIgppbXBvcnQgeyB2aXN1YWxMaW5lIH0gZnJvbSAiLi4vbGluZS9zcGFucyIKaW1wb3J0IHsgZ2V0QmV0d2VlbiwgZ2V0TGluZSwgZ2V0TGluZXMsIGlzTGluZSwgbGluZU5vIH0gZnJvbSAiLi4vbGluZS91dGlsc19saW5lIgppbXBvcnQgeyBjbGFzc1Rlc3QgfSBmcm9tICIuLi91dGlsL2RvbSIKaW1wb3J0IHsgc3BsaXRMaW5lc0F1dG8gfSBmcm9tICIuLi91dGlsL2ZlYXR1cmVfZGV0ZWN0aW9uIgppbXBvcnQgeyBjcmVhdGVPYmosIG1hcCwgc2VsX2RvbnRTY3JvbGwgfSBmcm9tICIuLi91dGlsL21pc2MiCmltcG9ydCB7IGVuc3VyZUN1cnNvclZpc2libGUgfSBmcm9tICIuLi9kaXNwbGF5L3Njcm9sbGluZyIKCmltcG9ydCB7IGNoYW5nZUxpbmUsIG1ha2VDaGFuZ2UsIG1ha2VDaGFuZ2VGcm9tSGlzdG9yeSwgcmVwbGFjZVJhbmdlIH0gZnJvbSAiLi9jaGFuZ2VzIgppbXBvcnQgeyBjb21wdXRlUmVwbGFjZWRTZWwgfSBmcm9tICIuL2NoYW5nZV9tZWFzdXJlbWVudCIKaW1wb3J0IHsgQnJhbmNoQ2h1bmssIExlYWZDaHVuayB9IGZyb20gIi4vY2h1bmsiCmltcG9ydCB7IGxpbmtlZERvY3MsIHVwZGF0ZURvYyB9IGZyb20gIi4vZG9jdW1lbnRfZGF0YSIKaW1wb3J0IHsgY29weUhpc3RvcnlBcnJheSwgSGlzdG9yeSB9IGZyb20gIi4vaGlzdG9yeSIKaW1wb3J0IHsgYWRkTGluZVdpZGdldCB9IGZyb20gIi4vbGluZV93aWRnZXQiCmltcG9ydCB7IGNvcHlTaGFyZWRNYXJrZXJzLCBkZXRhY2hTaGFyZWRNYXJrZXJzLCBmaW5kU2hhcmVkTWFya2VycywgbWFya1RleHQgfSBmcm9tICIuL21hcmtfdGV4dCIKaW1wb3J0IHsgbm9ybWFsaXplU2VsZWN0aW9uLCBSYW5nZSwgc2ltcGxlU2VsZWN0aW9uIH0gZnJvbSAiLi9zZWxlY3Rpb24iCmltcG9ydCB7IGV4dGVuZFNlbGVjdGlvbiwgZXh0ZW5kU2VsZWN0aW9ucywgc2V0U2VsZWN0aW9uLCBzZXRTZWxlY3Rpb25SZXBsYWNlSGlzdG9yeSwgc2V0U2ltcGxlU2VsZWN0aW9uIH0gZnJvbSAiLi9zZWxlY3Rpb25fdXBkYXRlcyIKCmxldCBuZXh0RG9jSWQgPSAwCmxldCBEb2MgPSBmdW5jdGlvbih0ZXh0LCBtb2RlLCBmaXJzdExpbmUsIGxpbmVTZXApIHsKICBpZiAoISh0aGlzIGluc3RhbmNlb2YgRG9jKSkgcmV0dXJuIG5ldyBEb2ModGV4dCwgbW9kZSwgZmlyc3RMaW5lLCBsaW5lU2VwKQogIGlmIChmaXJzdExpbmUgPT0gbnVsbCkgZmlyc3RMaW5lID0gMAoKICBCcmFuY2hDaHVuay5jYWxsKHRoaXMsIFtuZXcgTGVhZkNodW5rKFtuZXcgTGluZSgiIiwgbnVsbCldKV0pCiAgdGhpcy5maXJzdCA9IGZpcnN0TGluZQogIHRoaXMuc2Nyb2xsVG9wID0gdGhpcy5zY3JvbGxMZWZ0ID0gMAogIHRoaXMuY2FudEVkaXQgPSBmYWxzZQogIHRoaXMuY2xlYW5HZW5lcmF0aW9uID0gMQogIHRoaXMuZnJvbnRpZXIgPSBmaXJzdExpbmUKICBsZXQgc3RhcnQgPSBQb3MoZmlyc3RMaW5lLCAwKQogIHRoaXMuc2VsID0gc2ltcGxlU2VsZWN0aW9uKHN0YXJ0KQogIHRoaXMuaGlzdG9yeSA9IG5ldyBIaXN0b3J5KG51bGwpCiAgdGhpcy5pZCA9ICsrbmV4dERvY0lkCiAgdGhpcy5tb2RlT3B0aW9uID0gbW9kZQogIHRoaXMubGluZVNlcCA9IGxpbmVTZXAKICB0aGlzLmV4dGVuZCA9IGZhbHNlCgogIGlmICh0eXBlb2YgdGV4dCA9PSAic3RyaW5nIikgdGV4dCA9IHRoaXMuc3BsaXRMaW5lcyh0ZXh0KQogIHVwZGF0ZURvYyh0aGlzLCB7ZnJvbTogc3RhcnQsIHRvOiBzdGFydCwgdGV4dDogdGV4dH0pCiAgc2V0U2VsZWN0aW9uKHRoaXMsIHNpbXBsZVNlbGVjdGlvbihzdGFydCksIHNlbF9kb250U2Nyb2xsKQp9CgpEb2MucHJvdG90eXBlID0gY3JlYXRlT2JqKEJyYW5jaENodW5rLnByb3RvdHlwZSwgewogIGNvbnN0cnVjdG9yOiBEb2MsCiAgLy8gSXRlcmF0ZSBvdmVyIHRoZSBkb2N1bWVudC4gU3VwcG9ydHMgdHdvIGZvcm1zIC0tIHdpdGggb25seSBvbmUKICAvLyBhcmd1bWVudCwgaXQgY2FsbHMgdGhhdCBmb3IgZWFjaCBsaW5lIGluIHRoZSBkb2N1bWVudC4gV2l0aAogIC8vIHRocmVlLCBpdCBpdGVyYXRlcyBvdmVyIHRoZSByYW5nZSBnaXZlbiBieSB0aGUgZmlyc3QgdHdvICh3aXRoCiAgLy8gdGhlIHNlY29uZCBiZWluZyBub24taW5jbHVzaXZlKS4KICBpdGVyOiBmdW5jdGlvbihmcm9tLCB0bywgb3ApIHsKICAgIGlmIChvcCkgdGhpcy5pdGVyTihmcm9tIC0gdGhpcy5maXJzdCwgdG8gLSBmcm9tLCBvcCkKICAgIGVsc2UgdGhpcy5pdGVyTih0aGlzLmZpcnN0LCB0aGlzLmZpcnN0ICsgdGhpcy5zaXplLCBmcm9tKQogIH0sCgogIC8vIE5vbi1wdWJsaWMgaW50ZXJmYWNlIGZvciBhZGRpbmcgYW5kIHJlbW92aW5nIGxpbmVzLgogIGluc2VydDogZnVuY3Rpb24oYXQsIGxpbmVzKSB7CiAgICBsZXQgaGVpZ2h0ID0gMAogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7ICsraSkgaGVpZ2h0ICs9IGxpbmVzW2ldLmhlaWdodAogICAgdGhpcy5pbnNlcnRJbm5lcihhdCAtIHRoaXMuZmlyc3QsIGxpbmVzLCBoZWlnaHQpCiAgfSwKICByZW1vdmU6IGZ1bmN0aW9uKGF0LCBuKSB7IHRoaXMucmVtb3ZlSW5uZXIoYXQgLSB0aGlzLmZpcnN0LCBuKSB9LAoKICAvLyBGcm9tIGhlcmUsIHRoZSBtZXRob2RzIGFyZSBwYXJ0IG9mIHRoZSBwdWJsaWMgaW50ZXJmYWNlLiBNb3N0CiAgLy8gYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gQ29kZU1pcnJvciAoZWRpdG9yKSBpbnN0YW5jZXMuCgogIGdldFZhbHVlOiBmdW5jdGlvbihsaW5lU2VwKSB7CiAgICBsZXQgbGluZXMgPSBnZXRMaW5lcyh0aGlzLCB0aGlzLmZpcnN0LCB0aGlzLmZpcnN0ICsgdGhpcy5zaXplKQogICAgaWYgKGxpbmVTZXAgPT09IGZhbHNlKSByZXR1cm4gbGluZXMKICAgIHJldHVybiBsaW5lcy5qb2luKGxpbmVTZXAgfHwgdGhpcy5saW5lU2VwYXJhdG9yKCkpCiAgfSwKICBzZXRWYWx1ZTogZG9jTWV0aG9kT3AoZnVuY3Rpb24oY29kZSkgewogICAgbGV0IHRvcCA9IFBvcyh0aGlzLmZpcnN0LCAwKSwgbGFzdCA9IHRoaXMuZmlyc3QgKyB0aGlzLnNpemUgLSAxCiAgICBtYWtlQ2hhbmdlKHRoaXMsIHtmcm9tOiB0b3AsIHRvOiBQb3MobGFzdCwgZ2V0TGluZSh0aGlzLCBsYXN0KS50ZXh0Lmxlbmd0aCksCiAgICAgICAgICAgICAgICAgICAgICB0ZXh0OiB0aGlzLnNwbGl0TGluZXMoY29kZSksIG9yaWdpbjogInNldFZhbHVlIiwgZnVsbDogdHJ1ZX0sIHRydWUpCiAgICBzZXRTZWxlY3Rpb24odGhpcywgc2ltcGxlU2VsZWN0aW9uKHRvcCkpCiAgfSksCiAgcmVwbGFjZVJhbmdlOiBmdW5jdGlvbihjb2RlLCBmcm9tLCB0bywgb3JpZ2luKSB7CiAgICBmcm9tID0gY2xpcFBvcyh0aGlzLCBmcm9tKQogICAgdG8gPSB0byA/IGNsaXBQb3ModGhpcywgdG8pIDogZnJvbQogICAgcmVwbGFjZVJhbmdlKHRoaXMsIGNvZGUsIGZyb20sIHRvLCBvcmlnaW4pCiAgfSwKICBnZXRSYW5nZTogZnVuY3Rpb24oZnJvbSwgdG8sIGxpbmVTZXApIHsKICAgIGxldCBsaW5lcyA9IGdldEJldHdlZW4odGhpcywgY2xpcFBvcyh0aGlzLCBmcm9tKSwgY2xpcFBvcyh0aGlzLCB0bykpCiAgICBpZiAobGluZVNlcCA9PT0gZmFsc2UpIHJldHVybiBsaW5lcwogICAgcmV0dXJuIGxpbmVzLmpvaW4obGluZVNlcCB8fCB0aGlzLmxpbmVTZXBhcmF0b3IoKSkKICB9LAoKICBnZXRMaW5lOiBmdW5jdGlvbihsaW5lKSB7bGV0IGwgPSB0aGlzLmdldExpbmVIYW5kbGUobGluZSk7IHJldHVybiBsICYmIGwudGV4dH0sCgogIGdldExpbmVIYW5kbGU6IGZ1bmN0aW9uKGxpbmUpIHtpZiAoaXNMaW5lKHRoaXMsIGxpbmUpKSByZXR1cm4gZ2V0TGluZSh0aGlzLCBsaW5lKX0sCiAgZ2V0TGluZU51bWJlcjogZnVuY3Rpb24obGluZSkge3JldHVybiBsaW5lTm8obGluZSl9LAoKICBnZXRMaW5lSGFuZGxlVmlzdWFsU3RhcnQ6IGZ1bmN0aW9uKGxpbmUpIHsKICAgIGlmICh0eXBlb2YgbGluZSA9PSAibnVtYmVyIikgbGluZSA9IGdldExpbmUodGhpcywgbGluZSkKICAgIHJldHVybiB2aXN1YWxMaW5lKGxpbmUpCiAgfSwKCiAgbGluZUNvdW50OiBmdW5jdGlvbigpIHtyZXR1cm4gdGhpcy5zaXplfSwKICBmaXJzdExpbmU6IGZ1bmN0aW9uKCkge3JldHVybiB0aGlzLmZpcnN0fSwKICBsYXN0TGluZTogZnVuY3Rpb24oKSB7cmV0dXJuIHRoaXMuZmlyc3QgKyB0aGlzLnNpemUgLSAxfSwKCiAgY2xpcFBvczogZnVuY3Rpb24ocG9zKSB7cmV0dXJuIGNsaXBQb3ModGhpcywgcG9zKX0sCgogIGdldEN1cnNvcjogZnVuY3Rpb24oc3RhcnQpIHsKICAgIGxldCByYW5nZSA9IHRoaXMuc2VsLnByaW1hcnkoKSwgcG9zCiAgICBpZiAoc3RhcnQgPT0gbnVsbCB8fCBzdGFydCA9PSAiaGVhZCIpIHBvcyA9IHJhbmdlLmhlYWQKICAgIGVsc2UgaWYgKHN0YXJ0ID09ICJhbmNob3IiKSBwb3MgPSByYW5nZS5hbmNob3IKICAgIGVsc2UgaWYgKHN0YXJ0ID09ICJlbmQiIHx8IHN0YXJ0ID09ICJ0byIgfHwgc3RhcnQgPT09IGZhbHNlKSBwb3MgPSByYW5nZS50bygpCiAgICBlbHNlIHBvcyA9IHJhbmdlLmZyb20oKQogICAgcmV0dXJuIHBvcwogIH0sCiAgbGlzdFNlbGVjdGlvbnM6IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5zZWwucmFuZ2VzIH0sCiAgc29tZXRoaW5nU2VsZWN0ZWQ6IGZ1bmN0aW9uKCkge3JldHVybiB0aGlzLnNlbC5zb21ldGhpbmdTZWxlY3RlZCgpfSwKCiAgc2V0Q3Vyc29yOiBkb2NNZXRob2RPcChmdW5jdGlvbihsaW5lLCBjaCwgb3B0aW9ucykgewogICAgc2V0U2ltcGxlU2VsZWN0aW9uKHRoaXMsIGNsaXBQb3ModGhpcywgdHlwZW9mIGxpbmUgPT0gIm51bWJlciIgPyBQb3MobGluZSwgY2ggfHwgMCkgOiBsaW5lKSwgbnVsbCwgb3B0aW9ucykKICB9KSwKICBzZXRTZWxlY3Rpb246IGRvY01ldGhvZE9wKGZ1bmN0aW9uKGFuY2hvciwgaGVhZCwgb3B0aW9ucykgewogICAgc2V0U2ltcGxlU2VsZWN0aW9uKHRoaXMsIGNsaXBQb3ModGhpcywgYW5jaG9yKSwgY2xpcFBvcyh0aGlzLCBoZWFkIHx8IGFuY2hvciksIG9wdGlvbnMpCiAgfSksCiAgZXh0ZW5kU2VsZWN0aW9uOiBkb2NNZXRob2RPcChmdW5jdGlvbihoZWFkLCBvdGhlciwgb3B0aW9ucykgewogICAgZXh0ZW5kU2VsZWN0aW9uKHRoaXMsIGNsaXBQb3ModGhpcywgaGVhZCksIG90aGVyICYmIGNsaXBQb3ModGhpcywgb3RoZXIpLCBvcHRpb25zKQogIH0pLAogIGV4dGVuZFNlbGVjdGlvbnM6IGRvY01ldGhvZE9wKGZ1bmN0aW9uKGhlYWRzLCBvcHRpb25zKSB7CiAgICBleHRlbmRTZWxlY3Rpb25zKHRoaXMsIGNsaXBQb3NBcnJheSh0aGlzLCBoZWFkcyksIG9wdGlvbnMpCiAgfSksCiAgZXh0ZW5kU2VsZWN0aW9uc0J5OiBkb2NNZXRob2RPcChmdW5jdGlvbihmLCBvcHRpb25zKSB7CiAgICBsZXQgaGVhZHMgPSBtYXAodGhpcy5zZWwucmFuZ2VzLCBmKQogICAgZXh0ZW5kU2VsZWN0aW9ucyh0aGlzLCBjbGlwUG9zQXJyYXkodGhpcywgaGVhZHMpLCBvcHRpb25zKQogIH0pLAogIHNldFNlbGVjdGlvbnM6IGRvY01ldGhvZE9wKGZ1bmN0aW9uKHJhbmdlcywgcHJpbWFyeSwgb3B0aW9ucykgewogICAgaWYgKCFyYW5nZXMubGVuZ3RoKSByZXR1cm4KICAgIGxldCBvdXQgPSBbXQogICAgZm9yIChsZXQgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspCiAgICAgIG91dFtpXSA9IG5ldyBSYW5nZShjbGlwUG9zKHRoaXMsIHJhbmdlc1tpXS5hbmNob3IpLAogICAgICAgICAgICAgICAgICAgICAgICAgY2xpcFBvcyh0aGlzLCByYW5nZXNbaV0uaGVhZCkpCiAgICBpZiAocHJpbWFyeSA9PSBudWxsKSBwcmltYXJ5ID0gTWF0aC5taW4ocmFuZ2VzLmxlbmd0aCAtIDEsIHRoaXMuc2VsLnByaW1JbmRleCkKICAgIHNldFNlbGVjdGlvbih0aGlzLCBub3JtYWxpemVTZWxlY3Rpb24ob3V0LCBwcmltYXJ5KSwgb3B0aW9ucykKICB9KSwKICBhZGRTZWxlY3Rpb246IGRvY01ldGhvZE9wKGZ1bmN0aW9uKGFuY2hvciwgaGVhZCwgb3B0aW9ucykgewogICAgbGV0IHJhbmdlcyA9IHRoaXMuc2VsLnJhbmdlcy5zbGljZSgwKQogICAgcmFuZ2VzLnB1c2gobmV3IFJhbmdlKGNsaXBQb3ModGhpcywgYW5jaG9yKSwgY2xpcFBvcyh0aGlzLCBoZWFkIHx8IGFuY2hvcikpKQogICAgc2V0U2VsZWN0aW9uKHRoaXMsIG5vcm1hbGl6ZVNlbGVjdGlvbihyYW5nZXMsIHJhbmdlcy5sZW5ndGggLSAxKSwgb3B0aW9ucykKICB9KSwKCiAgZ2V0U2VsZWN0aW9uOiBmdW5jdGlvbihsaW5lU2VwKSB7CiAgICBsZXQgcmFuZ2VzID0gdGhpcy5zZWwucmFuZ2VzLCBsaW5lcwogICAgZm9yIChsZXQgaSA9IDA7IGkgPCByYW5nZXMubGVuZ3RoOyBpKyspIHsKICAgICAgbGV0IHNlbCA9IGdldEJldHdlZW4odGhpcywgcmFuZ2VzW2ldLmZyb20oKSwgcmFuZ2VzW2ldLnRvKCkpCiAgICAgIGxpbmVzID0gbGluZXMgPyBsaW5lcy5jb25jYXQoc2VsKSA6IHNlbAogICAgfQogICAgaWYgKGxpbmVTZXAgPT09IGZhbHNlKSByZXR1cm4gbGluZXMKICAgIGVsc2UgcmV0dXJuIGxpbmVzLmpvaW4obGluZVNlcCB8fCB0aGlzLmxpbmVTZXBhcmF0b3IoKSkKICB9LAogIGdldFNlbGVjdGlvbnM6IGZ1bmN0aW9uKGxpbmVTZXApIHsKICAgIGxldCBwYXJ0cyA9IFtdLCByYW5nZXMgPSB0aGlzLnNlbC5yYW5nZXMKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGxldCBzZWwgPSBnZXRCZXR3ZWVuKHRoaXMsIHJhbmdlc1tpXS5mcm9tKCksIHJhbmdlc1tpXS50bygpKQogICAgICBpZiAobGluZVNlcCAhPT0gZmFsc2UpIHNlbCA9IHNlbC5qb2luKGxpbmVTZXAgfHwgdGhpcy5saW5lU2VwYXJhdG9yKCkpCiAgICAgIHBhcnRzW2ldID0gc2VsCiAgICB9CiAgICByZXR1cm4gcGFydHMKICB9LAogIHJlcGxhY2VTZWxlY3Rpb246IGZ1bmN0aW9uKGNvZGUsIGNvbGxhcHNlLCBvcmlnaW4pIHsKICAgIGxldCBkdXAgPSBbXQogICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnNlbC5yYW5nZXMubGVuZ3RoOyBpKyspCiAgICAgIGR1cFtpXSA9IGNvZGUKICAgIHRoaXMucmVwbGFjZVNlbGVjdGlvbnMoZHVwLCBjb2xsYXBzZSwgb3JpZ2luIHx8ICIraW5wdXQiKQogIH0sCiAgcmVwbGFjZVNlbGVjdGlvbnM6IGRvY01ldGhvZE9wKGZ1bmN0aW9uKGNvZGUsIGNvbGxhcHNlLCBvcmlnaW4pIHsKICAgIGxldCBjaGFuZ2VzID0gW10sIHNlbCA9IHRoaXMuc2VsCiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlbC5yYW5nZXMubGVuZ3RoOyBpKyspIHsKICAgICAgbGV0IHJhbmdlID0gc2VsLnJhbmdlc1tpXQogICAgICBjaGFuZ2VzW2ldID0ge2Zyb206IHJhbmdlLmZyb20oKSwgdG86IHJhbmdlLnRvKCksIHRleHQ6IHRoaXMuc3BsaXRMaW5lcyhjb2RlW2ldKSwgb3JpZ2luOiBvcmlnaW59CiAgICB9CiAgICBsZXQgbmV3U2VsID0gY29sbGFwc2UgJiYgY29sbGFwc2UgIT0gImVuZCIgJiYgY29tcHV0ZVJlcGxhY2VkU2VsKHRoaXMsIGNoYW5nZXMsIGNvbGxhcHNlKQogICAgZm9yIChsZXQgaSA9IGNoYW5nZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pCiAgICAgIG1ha2VDaGFuZ2UodGhpcywgY2hhbmdlc1tpXSkKICAgIGlmIChuZXdTZWwpIHNldFNlbGVjdGlvblJlcGxhY2VIaXN0b3J5KHRoaXMsIG5ld1NlbCkKICAgIGVsc2UgaWYgKHRoaXMuY20pIGVuc3VyZUN1cnNvclZpc2libGUodGhpcy5jbSkKICB9KSwKICB1bmRvOiBkb2NNZXRob2RPcChmdW5jdGlvbigpIHttYWtlQ2hhbmdlRnJvbUhpc3RvcnkodGhpcywgInVuZG8iKX0pLAogIHJlZG86IGRvY01ldGhvZE9wKGZ1bmN0aW9uKCkge21ha2VDaGFuZ2VGcm9tSGlzdG9yeSh0aGlzLCAicmVkbyIpfSksCiAgdW5kb1NlbGVjdGlvbjogZG9jTWV0aG9kT3AoZnVuY3Rpb24oKSB7bWFrZUNoYW5nZUZyb21IaXN0b3J5KHRoaXMsICJ1bmRvIiwgdHJ1ZSl9KSwKICByZWRvU2VsZWN0aW9uOiBkb2NNZXRob2RPcChmdW5jdGlvbigpIHttYWtlQ2hhbmdlRnJvbUhpc3RvcnkodGhpcywgInJlZG8iLCB0cnVlKX0pLAoKICBzZXRFeHRlbmRpbmc6IGZ1bmN0aW9uKHZhbCkge3RoaXMuZXh0ZW5kID0gdmFsfSwKICBnZXRFeHRlbmRpbmc6IGZ1bmN0aW9uKCkge3JldHVybiB0aGlzLmV4dGVuZH0sCgogIGhpc3RvcnlTaXplOiBmdW5jdGlvbigpIHsKICAgIGxldCBoaXN0ID0gdGhpcy5oaXN0b3J5LCBkb25lID0gMCwgdW5kb25lID0gMAogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoaXN0LmRvbmUubGVuZ3RoOyBpKyspIGlmICghaGlzdC5kb25lW2ldLnJhbmdlcykgKytkb25lCiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhpc3QudW5kb25lLmxlbmd0aDsgaSsrKSBpZiAoIWhpc3QudW5kb25lW2ldLnJhbmdlcykgKyt1bmRvbmUKICAgIHJldHVybiB7dW5kbzogZG9uZSwgcmVkbzogdW5kb25lfQogIH0sCiAgY2xlYXJIaXN0b3J5OiBmdW5jdGlvbigpIHt0aGlzLmhpc3RvcnkgPSBuZXcgSGlzdG9yeSh0aGlzLmhpc3RvcnkubWF4R2VuZXJhdGlvbil9LAoKICBtYXJrQ2xlYW46IGZ1bmN0aW9uKCkgewogICAgdGhpcy5jbGVhbkdlbmVyYXRpb24gPSB0aGlzLmNoYW5nZUdlbmVyYXRpb24odHJ1ZSkKICB9LAogIGNoYW5nZUdlbmVyYXRpb246IGZ1bmN0aW9uKGZvcmNlU3BsaXQpIHsKICAgIGlmIChmb3JjZVNwbGl0KQogICAgICB0aGlzLmhpc3RvcnkubGFzdE9wID0gdGhpcy5oaXN0b3J5Lmxhc3RTZWxPcCA9IHRoaXMuaGlzdG9yeS5sYXN0T3JpZ2luID0gbnVsbAogICAgcmV0dXJuIHRoaXMuaGlzdG9yeS5nZW5lcmF0aW9uCiAgfSwKICBpc0NsZWFuOiBmdW5jdGlvbiAoZ2VuKSB7CiAgICByZXR1cm4gdGhpcy5oaXN0b3J5LmdlbmVyYXRpb24gPT0gKGdlbiB8fCB0aGlzLmNsZWFuR2VuZXJhdGlvbikKICB9LAoKICBnZXRIaXN0b3J5OiBmdW5jdGlvbigpIHsKICAgIHJldHVybiB7ZG9uZTogY29weUhpc3RvcnlBcnJheSh0aGlzLmhpc3RvcnkuZG9uZSksCiAgICAgICAgICAgIHVuZG9uZTogY29weUhpc3RvcnlBcnJheSh0aGlzLmhpc3RvcnkudW5kb25lKX0KICB9LAogIHNldEhpc3Rvcnk6IGZ1bmN0aW9uKGhpc3REYXRhKSB7CiAgICBsZXQgaGlzdCA9IHRoaXMuaGlzdG9yeSA9IG5ldyBIaXN0b3J5KHRoaXMuaGlzdG9yeS5tYXhHZW5lcmF0aW9uKQogICAgaGlzdC5kb25lID0gY29weUhpc3RvcnlBcnJheShoaXN0RGF0YS5kb25lLnNsaWNlKDApLCBudWxsLCB0cnVlKQogICAgaGlzdC51bmRvbmUgPSBjb3B5SGlzdG9yeUFycmF5KGhpc3REYXRhLnVuZG9uZS5zbGljZSgwKSwgbnVsbCwgdHJ1ZSkKICB9LAoKICBhZGRMaW5lQ2xhc3M6IGRvY01ldGhvZE9wKGZ1bmN0aW9uKGhhbmRsZSwgd2hlcmUsIGNscykgewogICAgcmV0dXJuIGNoYW5nZUxpbmUodGhpcywgaGFuZGxlLCB3aGVyZSA9PSAiZ3V0dGVyIiA/ICJndXR0ZXIiIDogImNsYXNzIiwgbGluZSA9PiB7CiAgICAgIGxldCBwcm9wID0gd2hlcmUgPT0gInRleHQiID8gInRleHRDbGFzcyIKICAgICAgICAgICAgICAgOiB3aGVyZSA9PSAiYmFja2dyb3VuZCIgPyAiYmdDbGFzcyIKICAgICAgICAgICAgICAgOiB3aGVyZSA9PSAiZ3V0dGVyIiA/ICJndXR0ZXJDbGFzcyIgOiAid3JhcENsYXNzIgogICAgICBpZiAoIWxpbmVbcHJvcF0pIGxpbmVbcHJvcF0gPSBjbHMKICAgICAgZWxzZSBpZiAoY2xhc3NUZXN0KGNscykudGVzdChsaW5lW3Byb3BdKSkgcmV0dXJuIGZhbHNlCiAgICAgIGVsc2UgbGluZVtwcm9wXSArPSAiICIgKyBjbHMKICAgICAgcmV0dXJuIHRydWUKICAgIH0pCiAgfSksCiAgcmVtb3ZlTGluZUNsYXNzOiBkb2NNZXRob2RPcChmdW5jdGlvbihoYW5kbGUsIHdoZXJlLCBjbHMpIHsKICAgIHJldHVybiBjaGFuZ2VMaW5lKHRoaXMsIGhhbmRsZSwgd2hlcmUgPT0gImd1dHRlciIgPyAiZ3V0dGVyIiA6ICJjbGFzcyIsIGxpbmUgPT4gewogICAgICBsZXQgcHJvcCA9IHdoZXJlID09ICJ0ZXh0IiA/ICJ0ZXh0Q2xhc3MiCiAgICAgICAgICAgICAgIDogd2hlcmUgPT0gImJhY2tncm91bmQiID8gImJnQ2xhc3MiCiAgICAgICAgICAgICAgIDogd2hlcmUgPT0gImd1dHRlciIgPyAiZ3V0dGVyQ2xhc3MiIDogIndyYXBDbGFzcyIKICAgICAgbGV0IGN1ciA9IGxpbmVbcHJvcF0KICAgICAgaWYgKCFjdXIpIHJldHVybiBmYWxzZQogICAgICBlbHNlIGlmIChjbHMgPT0gbnVsbCkgbGluZVtwcm9wXSA9IG51bGwKICAgICAgZWxzZSB7CiAgICAgICAgbGV0IGZvdW5kID0gY3VyLm1hdGNoKGNsYXNzVGVzdChjbHMpKQogICAgICAgIGlmICghZm91bmQpIHJldHVybiBmYWxzZQogICAgICAgIGxldCBlbmQgPSBmb3VuZC5pbmRleCArIGZvdW5kWzBdLmxlbmd0aAogICAgICAgIGxpbmVbcHJvcF0gPSBjdXIuc2xpY2UoMCwgZm91bmQuaW5kZXgpICsgKCFmb3VuZC5pbmRleCB8fCBlbmQgPT0gY3VyLmxlbmd0aCA/ICIiIDogIiAiKSArIGN1ci5zbGljZShlbmQpIHx8IG51bGwKICAgICAgfQogICAgICByZXR1cm4gdHJ1ZQogICAgfSkKICB9KSwKCiAgYWRkTGluZVdpZGdldDogZG9jTWV0aG9kT3AoZnVuY3Rpb24oaGFuZGxlLCBub2RlLCBvcHRpb25zKSB7CiAgICByZXR1cm4gYWRkTGluZVdpZGdldCh0aGlzLCBoYW5kbGUsIG5vZGUsIG9wdGlvbnMpCiAgfSksCiAgcmVtb3ZlTGluZVdpZGdldDogZnVuY3Rpb24od2lkZ2V0KSB7IHdpZGdldC5jbGVhcigpIH0sCgogIG1hcmtUZXh0OiBmdW5jdGlvbihmcm9tLCB0bywgb3B0aW9ucykgewogICAgcmV0dXJuIG1hcmtUZXh0KHRoaXMsIGNsaXBQb3ModGhpcywgZnJvbSksIGNsaXBQb3ModGhpcywgdG8pLCBvcHRpb25zLCBvcHRpb25zICYmIG9wdGlvbnMudHlwZSB8fCAicmFuZ2UiKQogIH0sCiAgc2V0Qm9va21hcms6IGZ1bmN0aW9uKHBvcywgb3B0aW9ucykgewogICAgbGV0IHJlYWxPcHRzID0ge3JlcGxhY2VkV2l0aDogb3B0aW9ucyAmJiAob3B0aW9ucy5ub2RlVHlwZSA9PSBudWxsID8gb3B0aW9ucy53aWRnZXQgOiBvcHRpb25zKSwKICAgICAgICAgICAgICAgICAgICBpbnNlcnRMZWZ0OiBvcHRpb25zICYmIG9wdGlvbnMuaW5zZXJ0TGVmdCwKICAgICAgICAgICAgICAgICAgICBjbGVhcldoZW5FbXB0eTogZmFsc2UsIHNoYXJlZDogb3B0aW9ucyAmJiBvcHRpb25zLnNoYXJlZCwKICAgICAgICAgICAgICAgICAgICBoYW5kbGVNb3VzZUV2ZW50czogb3B0aW9ucyAmJiBvcHRpb25zLmhhbmRsZU1vdXNlRXZlbnRzfQogICAgcG9zID0gY2xpcFBvcyh0aGlzLCBwb3MpCiAgICByZXR1cm4gbWFya1RleHQodGhpcywgcG9zLCBwb3MsIHJlYWxPcHRzLCAiYm9va21hcmsiKQogIH0sCiAgZmluZE1hcmtzQXQ6IGZ1bmN0aW9uKHBvcykgewogICAgcG9zID0gY2xpcFBvcyh0aGlzLCBwb3MpCiAgICBsZXQgbWFya2VycyA9IFtdLCBzcGFucyA9IGdldExpbmUodGhpcywgcG9zLmxpbmUpLm1hcmtlZFNwYW5zCiAgICBpZiAoc3BhbnMpIGZvciAobGV0IGkgPSAwOyBpIDwgc3BhbnMubGVuZ3RoOyArK2kpIHsKICAgICAgbGV0IHNwYW4gPSBzcGFuc1tpXQogICAgICBpZiAoKHNwYW4uZnJvbSA9PSBudWxsIHx8IHNwYW4uZnJvbSA8PSBwb3MuY2gpICYmCiAgICAgICAgICAoc3Bhbi50byA9PSBudWxsIHx8IHNwYW4udG8gPj0gcG9zLmNoKSkKICAgICAgICBtYXJrZXJzLnB1c2goc3Bhbi5tYXJrZXIucGFyZW50IHx8IHNwYW4ubWFya2VyKQogICAgfQogICAgcmV0dXJuIG1hcmtlcnMKICB9LAogIGZpbmRNYXJrczogZnVuY3Rpb24oZnJvbSwgdG8sIGZpbHRlcikgewogICAgZnJvbSA9IGNsaXBQb3ModGhpcywgZnJvbSk7IHRvID0gY2xpcFBvcyh0aGlzLCB0bykKICAgIGxldCBmb3VuZCA9IFtdLCBsaW5lTm8gPSBmcm9tLmxpbmUKICAgIHRoaXMuaXRlcihmcm9tLmxpbmUsIHRvLmxpbmUgKyAxLCBsaW5lID0+IHsKICAgICAgbGV0IHNwYW5zID0gbGluZS5tYXJrZWRTcGFucwogICAgICBpZiAoc3BhbnMpIGZvciAobGV0IGkgPSAwOyBpIDwgc3BhbnMubGVuZ3RoOyBpKyspIHsKICAgICAgICBsZXQgc3BhbiA9IHNwYW5zW2ldCiAgICAgICAgaWYgKCEoc3Bhbi50byAhPSBudWxsICYmIGxpbmVObyA9PSBmcm9tLmxpbmUgJiYgZnJvbS5jaCA+PSBzcGFuLnRvIHx8CiAgICAgICAgICAgICAgc3Bhbi5mcm9tID09IG51bGwgJiYgbGluZU5vICE9IGZyb20ubGluZSB8fAogICAgICAgICAgICAgIHNwYW4uZnJvbSAhPSBudWxsICYmIGxpbmVObyA9PSB0by5saW5lICYmIHNwYW4uZnJvbSA+PSB0by5jaCkgJiYKICAgICAgICAgICAgKCFmaWx0ZXIgfHwgZmlsdGVyKHNwYW4ubWFya2VyKSkpCiAgICAgICAgICBmb3VuZC5wdXNoKHNwYW4ubWFya2VyLnBhcmVudCB8fCBzcGFuLm1hcmtlcikKICAgICAgfQogICAgICArK2xpbmVObwogICAgfSkKICAgIHJldHVybiBmb3VuZAogIH0sCiAgZ2V0QWxsTWFya3M6IGZ1bmN0aW9uKCkgewogICAgbGV0IG1hcmtlcnMgPSBbXQogICAgdGhpcy5pdGVyKGxpbmUgPT4gewogICAgICBsZXQgc3BzID0gbGluZS5tYXJrZWRTcGFucwogICAgICBpZiAoc3BzKSBmb3IgKGxldCBpID0gMDsgaSA8IHNwcy5sZW5ndGg7ICsraSkKICAgICAgICBpZiAoc3BzW2ldLmZyb20gIT0gbnVsbCkgbWFya2Vycy5wdXNoKHNwc1tpXS5tYXJrZXIpCiAgICB9KQogICAgcmV0dXJuIG1hcmtlcnMKICB9LAoKICBwb3NGcm9tSW5kZXg6IGZ1bmN0aW9uKG9mZikgewogICAgbGV0IGNoLCBsaW5lTm8gPSB0aGlzLmZpcnN0LCBzZXBTaXplID0gdGhpcy5saW5lU2VwYXJhdG9yKCkubGVuZ3RoCiAgICB0aGlzLml0ZXIobGluZSA9PiB7CiAgICAgIGxldCBzeiA9IGxpbmUudGV4dC5sZW5ndGggKyBzZXBTaXplCiAgICAgIGlmIChzeiA+IG9mZikgeyBjaCA9IG9mZjsgcmV0dXJuIHRydWUgfQogICAgICBvZmYgLT0gc3oKICAgICAgKytsaW5lTm8KICAgIH0pCiAgICByZXR1cm4gY2xpcFBvcyh0aGlzLCBQb3MobGluZU5vLCBjaCkpCiAgfSwKICBpbmRleEZyb21Qb3M6IGZ1bmN0aW9uIChjb29yZHMpIHsKICAgIGNvb3JkcyA9IGNsaXBQb3ModGhpcywgY29vcmRzKQogICAgbGV0IGluZGV4ID0gY29vcmRzLmNoCiAgICBpZiAoY29vcmRzLmxpbmUgPCB0aGlzLmZpcnN0IHx8IGNvb3Jkcy5jaCA8IDApIHJldHVybiAwCiAgICBsZXQgc2VwU2l6ZSA9IHRoaXMubGluZVNlcGFyYXRvcigpLmxlbmd0aAogICAgdGhpcy5pdGVyKHRoaXMuZmlyc3QsIGNvb3Jkcy5saW5lLCBsaW5lID0+IHsgLy8gaXRlciBhYm9ydHMgd2hlbiBjYWxsYmFjayByZXR1cm5zIGEgdHJ1dGh5IHZhbHVlCiAgICAgIGluZGV4ICs9IGxpbmUudGV4dC5sZW5ndGggKyBzZXBTaXplCiAgICB9KQogICAgcmV0dXJuIGluZGV4CiAgfSwKCiAgY29weTogZnVuY3Rpb24oY29weUhpc3RvcnkpIHsKICAgIGxldCBkb2MgPSBuZXcgRG9jKGdldExpbmVzKHRoaXMsIHRoaXMuZmlyc3QsIHRoaXMuZmlyc3QgKyB0aGlzLnNpemUpLAogICAgICAgICAgICAgICAgICAgICAgdGhpcy5tb2RlT3B0aW9uLCB0aGlzLmZpcnN0LCB0aGlzLmxpbmVTZXApCiAgICBkb2Muc2Nyb2xsVG9wID0gdGhpcy5zY3JvbGxUb3A7IGRvYy5zY3JvbGxMZWZ0ID0gdGhpcy5zY3JvbGxMZWZ0CiAgICBkb2Muc2VsID0gdGhpcy5zZWwKICAgIGRvYy5leHRlbmQgPSBmYWxzZQogICAgaWYgKGNvcHlIaXN0b3J5KSB7CiAgICAgIGRvYy5oaXN0b3J5LnVuZG9EZXB0aCA9IHRoaXMuaGlzdG9yeS51bmRvRGVwdGgKICAgICAgZG9jLnNldEhpc3RvcnkodGhpcy5nZXRIaXN0b3J5KCkpCiAgICB9CiAgICByZXR1cm4gZG9jCiAgfSwKCiAgbGlua2VkRG9jOiBmdW5jdGlvbihvcHRpb25zKSB7CiAgICBpZiAoIW9wdGlvbnMpIG9wdGlvbnMgPSB7fQogICAgbGV0IGZyb20gPSB0aGlzLmZpcnN0LCB0byA9IHRoaXMuZmlyc3QgKyB0aGlzLnNpemUKICAgIGlmIChvcHRpb25zLmZyb20gIT0gbnVsbCAmJiBvcHRpb25zLmZyb20gPiBmcm9tKSBmcm9tID0gb3B0aW9ucy5mcm9tCiAgICBpZiAob3B0aW9ucy50byAhPSBudWxsICYmIG9wdGlvbnMudG8gPCB0bykgdG8gPSBvcHRpb25zLnRvCiAgICBsZXQgY29weSA9IG5ldyBEb2MoZ2V0TGluZXModGhpcywgZnJvbSwgdG8pLCBvcHRpb25zLm1vZGUgfHwgdGhpcy5tb2RlT3B0aW9uLCBmcm9tLCB0aGlzLmxpbmVTZXApCiAgICBpZiAob3B0aW9ucy5zaGFyZWRIaXN0KSBjb3B5Lmhpc3RvcnkgPSB0aGlzLmhpc3RvcnkKICAgIDsodGhpcy5saW5rZWQgfHwgKHRoaXMubGlua2VkID0gW10pKS5wdXNoKHtkb2M6IGNvcHksIHNoYXJlZEhpc3Q6IG9wdGlvbnMuc2hhcmVkSGlzdH0pCiAgICBjb3B5LmxpbmtlZCA9IFt7ZG9jOiB0aGlzLCBpc1BhcmVudDogdHJ1ZSwgc2hhcmVkSGlzdDogb3B0aW9ucy5zaGFyZWRIaXN0fV0KICAgIGNvcHlTaGFyZWRNYXJrZXJzKGNvcHksIGZpbmRTaGFyZWRNYXJrZXJzKHRoaXMpKQogICAgcmV0dXJuIGNvcHkKICB9LAogIHVubGlua0RvYzogZnVuY3Rpb24ob3RoZXIpIHsKICAgIGlmIChvdGhlciBpbnN0YW5jZW9mIENvZGVNaXJyb3IpIG90aGVyID0gb3RoZXIuZG9jCiAgICBpZiAodGhpcy5saW5rZWQpIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5saW5rZWQubGVuZ3RoOyArK2kpIHsKICAgICAgbGV0IGxpbmsgPSB0aGlzLmxpbmtlZFtpXQogICAgICBpZiAobGluay5kb2MgIT0gb3RoZXIpIGNvbnRpbnVlCiAgICAgIHRoaXMubGlua2VkLnNwbGljZShpLCAxKQogICAgICBvdGhlci51bmxpbmtEb2ModGhpcykKICAgICAgZGV0YWNoU2hhcmVkTWFya2VycyhmaW5kU2hhcmVkTWFya2Vycyh0aGlzKSkKICAgICAgYnJlYWsKICAgIH0KICAgIC8vIElmIHRoZSBoaXN0b3JpZXMgd2VyZSBzaGFyZWQsIHNwbGl0IHRoZW0gYWdhaW4KICAgIGlmIChvdGhlci5oaXN0b3J5ID09IHRoaXMuaGlzdG9yeSkgewogICAgICBsZXQgc3BsaXRJZHMgPSBbb3RoZXIuaWRdCiAgICAgIGxpbmtlZERvY3Mob3RoZXIsIGRvYyA9PiBzcGxpdElkcy5wdXNoKGRvYy5pZCksIHRydWUpCiAgICAgIG90aGVyLmhpc3RvcnkgPSBuZXcgSGlzdG9yeShudWxsKQogICAgICBvdGhlci5oaXN0b3J5LmRvbmUgPSBjb3B5SGlzdG9yeUFycmF5KHRoaXMuaGlzdG9yeS5kb25lLCBzcGxpdElkcykKICAgICAgb3RoZXIuaGlzdG9yeS51bmRvbmUgPSBjb3B5SGlzdG9yeUFycmF5KHRoaXMuaGlzdG9yeS51bmRvbmUsIHNwbGl0SWRzKQogICAgfQogIH0sCiAgaXRlckxpbmtlZERvY3M6IGZ1bmN0aW9uKGYpIHtsaW5rZWREb2NzKHRoaXMsIGYpfSwKCiAgZ2V0TW9kZTogZnVuY3Rpb24oKSB7cmV0dXJuIHRoaXMubW9kZX0sCiAgZ2V0RWRpdG9yOiBmdW5jdGlvbigpIHtyZXR1cm4gdGhpcy5jbX0sCgogIHNwbGl0TGluZXM6IGZ1bmN0aW9uKHN0cikgewogICAgaWYgKHRoaXMubGluZVNlcCkgcmV0dXJuIHN0ci5zcGxpdCh0aGlzLmxpbmVTZXApCiAgICByZXR1cm4gc3BsaXRMaW5lc0F1dG8oc3RyKQogIH0sCiAgbGluZVNlcGFyYXRvcjogZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLmxpbmVTZXAgfHwgIlxuIiB9Cn0pCgovLyBQdWJsaWMgYWxpYXMuCkRvYy5wcm90b3R5cGUuZWFjaExpbmUgPSBEb2MucHJvdG90eXBlLml0ZXIKCmV4cG9ydCBkZWZhdWx0IERvYwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/src/model/document_data.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aW1wb3J0IHsgbG9hZE1vZGUgfSBmcm9tICIuLi9kaXNwbGF5L21vZGVfc3RhdGUiCmltcG9ydCB7IHJlZ0NoYW5nZSB9IGZyb20gIi4uL2Rpc3BsYXkvdmlld190cmFja2luZyIKaW1wb3J0IHsgTGluZSwgdXBkYXRlTGluZSB9IGZyb20gIi4uL2xpbmUvbGluZV9kYXRhIgppbXBvcnQgeyBmaW5kTWF4TGluZSB9IGZyb20gIi4uL2xpbmUvc3BhbnMiCmltcG9ydCB7IGdldExpbmUgfSBmcm9tICIuLi9saW5lL3V0aWxzX2xpbmUiCmltcG9ydCB7IGVzdGltYXRlTGluZUhlaWdodHMgfSBmcm9tICIuLi9tZWFzdXJlbWVudC9wb3NpdGlvbl9tZWFzdXJlbWVudCIKaW1wb3J0IHsgbHN0IH0gZnJvbSAiLi4vdXRpbC9taXNjIgppbXBvcnQgeyBzaWduYWxMYXRlciB9IGZyb20gIi4uL3V0aWwvb3BlcmF0aW9uX2dyb3VwIgoKLy8gRE9DVU1FTlQgREFUQSBTVFJVQ1RVUkUKCi8vIEJ5IGRlZmF1bHQsIHVwZGF0ZXMgdGhhdCBzdGFydCBhbmQgZW5kIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lCi8vIGFyZSB0cmVhdGVkIHNwZWNpYWxseSwgaW4gb3JkZXIgdG8gbWFrZSB0aGUgYXNzb2NpYXRpb24gb2YgbGluZQovLyB3aWRnZXRzIGFuZCBtYXJrZXIgZWxlbWVudHMgd2l0aCB0aGUgdGV4dCBiZWhhdmUgbW9yZSBpbnR1aXRpdmUuCmV4cG9ydCBmdW5jdGlvbiBpc1dob2xlTGluZVVwZGF0ZShkb2MsIGNoYW5nZSkgewogIHJldHVybiBjaGFuZ2UuZnJvbS5jaCA9PSAwICYmIGNoYW5nZS50by5jaCA9PSAwICYmIGxzdChjaGFuZ2UudGV4dCkgPT0gIiIgJiYKICAgICghZG9jLmNtIHx8IGRvYy5jbS5vcHRpb25zLndob2xlTGluZVVwZGF0ZUJlZm9yZSkKfQoKLy8gUGVyZm9ybSBhIGNoYW5nZSBvbiB0aGUgZG9jdW1lbnQgZGF0YSBzdHJ1Y3R1cmUuCmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVEb2MoZG9jLCBjaGFuZ2UsIG1hcmtlZFNwYW5zLCBlc3RpbWF0ZUhlaWdodCkgewogIGZ1bmN0aW9uIHNwYW5zRm9yKG4pIHtyZXR1cm4gbWFya2VkU3BhbnMgPyBtYXJrZWRTcGFuc1tuXSA6IG51bGx9CiAgZnVuY3Rpb24gdXBkYXRlKGxpbmUsIHRleHQsIHNwYW5zKSB7CiAgICB1cGRhdGVMaW5lKGxpbmUsIHRleHQsIHNwYW5zLCBlc3RpbWF0ZUhlaWdodCkKICAgIHNpZ25hbExhdGVyKGxpbmUsICJjaGFuZ2UiLCBsaW5lLCBjaGFuZ2UpCiAgfQogIGZ1bmN0aW9uIGxpbmVzRm9yKHN0YXJ0LCBlbmQpIHsKICAgIGxldCByZXN1bHQgPSBbXQogICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpCiAgICAgIHJlc3VsdC5wdXNoKG5ldyBMaW5lKHRleHRbaV0sIHNwYW5zRm9yKGkpLCBlc3RpbWF0ZUhlaWdodCkpCiAgICByZXR1cm4gcmVzdWx0CiAgfQoKICBsZXQgZnJvbSA9IGNoYW5nZS5mcm9tLCB0byA9IGNoYW5nZS50bywgdGV4dCA9IGNoYW5nZS50ZXh0CiAgbGV0IGZpcnN0TGluZSA9IGdldExpbmUoZG9jLCBmcm9tLmxpbmUpLCBsYXN0TGluZSA9IGdldExpbmUoZG9jLCB0by5saW5lKQogIGxldCBsYXN0VGV4dCA9IGxzdCh0ZXh0KSwgbGFzdFNwYW5zID0gc3BhbnNGb3IodGV4dC5sZW5ndGggLSAxKSwgbmxpbmVzID0gdG8ubGluZSAtIGZyb20ubGluZQoKICAvLyBBZGp1c3QgdGhlIGxpbmUgc3RydWN0dXJlCiAgaWYgKGNoYW5nZS5mdWxsKSB7CiAgICBkb2MuaW5zZXJ0KDAsIGxpbmVzRm9yKDAsIHRleHQubGVuZ3RoKSkKICAgIGRvYy5yZW1vdmUodGV4dC5sZW5ndGgsIGRvYy5zaXplIC0gdGV4dC5sZW5ndGgpCiAgfSBlbHNlIGlmIChpc1dob2xlTGluZVVwZGF0ZShkb2MsIGNoYW5nZSkpIHsKICAgIC8vIFRoaXMgaXMgYSB3aG9sZS1saW5lIHJlcGxhY2UuIFRyZWF0ZWQgc3BlY2lhbGx5IHRvIG1ha2UKICAgIC8vIHN1cmUgbGluZSBvYmplY3RzIG1vdmUgdGhlIHdheSB0aGV5IGFyZSBzdXBwb3NlZCB0by4KICAgIGxldCBhZGRlZCA9IGxpbmVzRm9yKDAsIHRleHQubGVuZ3RoIC0gMSkKICAgIHVwZGF0ZShsYXN0TGluZSwgbGFzdExpbmUudGV4dCwgbGFzdFNwYW5zKQogICAgaWYgKG5saW5lcykgZG9jLnJlbW92ZShmcm9tLmxpbmUsIG5saW5lcykKICAgIGlmIChhZGRlZC5sZW5ndGgpIGRvYy5pbnNlcnQoZnJvbS5saW5lLCBhZGRlZCkKICB9IGVsc2UgaWYgKGZpcnN0TGluZSA9PSBsYXN0TGluZSkgewogICAgaWYgKHRleHQubGVuZ3RoID09IDEpIHsKICAgICAgdXBkYXRlKGZpcnN0TGluZSwgZmlyc3RMaW5lLnRleHQuc2xpY2UoMCwgZnJvbS5jaCkgKyBsYXN0VGV4dCArIGZpcnN0TGluZS50ZXh0LnNsaWNlKHRvLmNoKSwgbGFzdFNwYW5zKQogICAgfSBlbHNlIHsKICAgICAgbGV0IGFkZGVkID0gbGluZXNGb3IoMSwgdGV4dC5sZW5ndGggLSAxKQogICAgICBhZGRlZC5wdXNoKG5ldyBMaW5lKGxhc3RUZXh0ICsgZmlyc3RMaW5lLnRleHQuc2xpY2UodG8uY2gpLCBsYXN0U3BhbnMsIGVzdGltYXRlSGVpZ2h0KSkKICAgICAgdXBkYXRlKGZpcnN0TGluZSwgZmlyc3RMaW5lLnRleHQuc2xpY2UoMCwgZnJvbS5jaCkgKyB0ZXh0WzBdLCBzcGFuc0ZvcigwKSkKICAgICAgZG9jLmluc2VydChmcm9tLmxpbmUgKyAxLCBhZGRlZCkKICAgIH0KICB9IGVsc2UgaWYgKHRleHQubGVuZ3RoID09IDEpIHsKICAgIHVwZGF0ZShmaXJzdExpbmUsIGZpcnN0TGluZS50ZXh0LnNsaWNlKDAsIGZyb20uY2gpICsgdGV4dFswXSArIGxhc3RMaW5lLnRleHQuc2xpY2UodG8uY2gpLCBzcGFuc0ZvcigwKSkKICAgIGRvYy5yZW1vdmUoZnJvbS5saW5lICsgMSwgbmxpbmVzKQogIH0gZWxzZSB7CiAgICB1cGRhdGUoZmlyc3RMaW5lLCBmaXJzdExpbmUudGV4dC5zbGljZSgwLCBmcm9tLmNoKSArIHRleHRbMF0sIHNwYW5zRm9yKDApKQogICAgdXBkYXRlKGxhc3RMaW5lLCBsYXN0VGV4dCArIGxhc3RMaW5lLnRleHQuc2xpY2UodG8uY2gpLCBsYXN0U3BhbnMpCiAgICBsZXQgYWRkZWQgPSBsaW5lc0ZvcigxLCB0ZXh0Lmxlbmd0aCAtIDEpCiAgICBpZiAobmxpbmVzID4gMSkgZG9jLnJlbW92ZShmcm9tLmxpbmUgKyAxLCBubGluZXMgLSAxKQogICAgZG9jLmluc2VydChmcm9tLmxpbmUgKyAxLCBhZGRlZCkKICB9CgogIHNpZ25hbExhdGVyKGRvYywgImNoYW5nZSIsIGRvYywgY2hhbmdlKQp9CgovLyBDYWxsIGYgZm9yIGFsbCBsaW5rZWQgZG9jdW1lbnRzLgpleHBvcnQgZnVuY3Rpb24gbGlua2VkRG9jcyhkb2MsIGYsIHNoYXJlZEhpc3RPbmx5KSB7CiAgZnVuY3Rpb24gcHJvcGFnYXRlKGRvYywgc2tpcCwgc2hhcmVkSGlzdCkgewogICAgaWYgKGRvYy5saW5rZWQpIGZvciAobGV0IGkgPSAwOyBpIDwgZG9jLmxpbmtlZC5sZW5ndGg7ICsraSkgewogICAgICBsZXQgcmVsID0gZG9jLmxpbmtlZFtpXQogICAgICBpZiAocmVsLmRvYyA9PSBza2lwKSBjb250aW51ZQogICAgICBsZXQgc2hhcmVkID0gc2hhcmVkSGlzdCAmJiByZWwuc2hhcmVkSGlzdAogICAgICBpZiAoc2hhcmVkSGlzdE9ubHkgJiYgIXNoYXJlZCkgY29udGludWUKICAgICAgZihyZWwuZG9jLCBzaGFyZWQpCiAgICAgIHByb3BhZ2F0ZShyZWwuZG9jLCBkb2MsIHNoYXJlZCkKICAgIH0KICB9CiAgcHJvcGFnYXRlKGRvYywgbnVsbCwgdHJ1ZSkKfQoKLy8gQXR0YWNoIGEgZG9jdW1lbnQgdG8gYW4gZWRpdG9yLgpleHBvcnQgZnVuY3Rpb24gYXR0YWNoRG9jKGNtLCBkb2MpIHsKICBpZiAoZG9jLmNtKSB0aHJvdyBuZXcgRXJyb3IoIlRoaXMgZG9jdW1lbnQgaXMgYWxyZWFkeSBpbiB1c2UuIikKICBjbS5kb2MgPSBkb2MKICBkb2MuY20gPSBjbQogIGVzdGltYXRlTGluZUhlaWdodHMoY20pCiAgbG9hZE1vZGUoY20pCiAgaWYgKCFjbS5vcHRpb25zLmxpbmVXcmFwcGluZykgZmluZE1heExpbmUoY20pCiAgY20ub3B0aW9ucy5tb2RlID0gZG9jLm1vZGVPcHRpb24KICByZWdDaGFuZ2UoY20pCn0KCg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/src/model/history.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aW1wb3J0IHsgY21wLCBjb3B5UG9zIH0gZnJvbSAiLi4vbGluZS9wb3MiCmltcG9ydCB7IHN0cmV0Y2hTcGFuc092ZXJDaGFuZ2UgfSBmcm9tICIuLi9saW5lL3NwYW5zIgppbXBvcnQgeyBnZXRCZXR3ZWVuIH0gZnJvbSAiLi4vbGluZS91dGlsc19saW5lIgppbXBvcnQgeyBzaWduYWwgfSBmcm9tICIuLi91dGlsL2V2ZW50IgppbXBvcnQgeyBpbmRleE9mLCBsc3QgfSBmcm9tICIuLi91dGlsL21pc2MiCgppbXBvcnQgeyBjaGFuZ2VFbmQgfSBmcm9tICIuL2NoYW5nZV9tZWFzdXJlbWVudCIKaW1wb3J0IHsgbGlua2VkRG9jcyB9IGZyb20gIi4vZG9jdW1lbnRfZGF0YSIKaW1wb3J0IHsgU2VsZWN0aW9uIH0gZnJvbSAiLi9zZWxlY3Rpb24iCgpleHBvcnQgZnVuY3Rpb24gSGlzdG9yeShzdGFydEdlbikgewogIC8vIEFycmF5cyBvZiBjaGFuZ2UgZXZlbnRzIGFuZCBzZWxlY3Rpb25zLiBEb2luZyBzb21ldGhpbmcgYWRkcyBhbgogIC8vIGV2ZW50IHRvIGRvbmUgYW5kIGNsZWFycyB1bmRvLiBVbmRvaW5nIG1vdmVzIGV2ZW50cyBmcm9tIGRvbmUKICAvLyB0byB1bmRvbmUsIHJlZG9pbmcgbW92ZXMgdGhlbSBpbiB0aGUgb3RoZXIgZGlyZWN0aW9uLgogIHRoaXMuZG9uZSA9IFtdOyB0aGlzLnVuZG9uZSA9IFtdCiAgdGhpcy51bmRvRGVwdGggPSBJbmZpbml0eQogIC8vIFVzZWQgdG8gdHJhY2sgd2hlbiBjaGFuZ2VzIGNhbiBiZSBtZXJnZWQgaW50byBhIHNpbmdsZSB1bmRvCiAgLy8gZXZlbnQKICB0aGlzLmxhc3RNb2RUaW1lID0gdGhpcy5sYXN0U2VsVGltZSA9IDAKICB0aGlzLmxhc3RPcCA9IHRoaXMubGFzdFNlbE9wID0gbnVsbAogIHRoaXMubGFzdE9yaWdpbiA9IHRoaXMubGFzdFNlbE9yaWdpbiA9IG51bGwKICAvLyBVc2VkIGJ5IHRoZSBpc0NsZWFuKCkgbWV0aG9kCiAgdGhpcy5nZW5lcmF0aW9uID0gdGhpcy5tYXhHZW5lcmF0aW9uID0gc3RhcnRHZW4gfHwgMQp9CgovLyBDcmVhdGUgYSBoaXN0b3J5IGNoYW5nZSBldmVudCBmcm9tIGFuIHVwZGF0ZURvYy1zdHlsZSBjaGFuZ2UKLy8gb2JqZWN0LgpleHBvcnQgZnVuY3Rpb24gaGlzdG9yeUNoYW5nZUZyb21DaGFuZ2UoZG9jLCBjaGFuZ2UpIHsKICBsZXQgaGlzdENoYW5nZSA9IHtmcm9tOiBjb3B5UG9zKGNoYW5nZS5mcm9tKSwgdG86IGNoYW5nZUVuZChjaGFuZ2UpLCB0ZXh0OiBnZXRCZXR3ZWVuKGRvYywgY2hhbmdlLmZyb20sIGNoYW5nZS50byl9CiAgYXR0YWNoTG9jYWxTcGFucyhkb2MsIGhpc3RDaGFuZ2UsIGNoYW5nZS5mcm9tLmxpbmUsIGNoYW5nZS50by5saW5lICsgMSkKICBsaW5rZWREb2NzKGRvYywgZG9jID0+IGF0dGFjaExvY2FsU3BhbnMoZG9jLCBoaXN0Q2hhbmdlLCBjaGFuZ2UuZnJvbS5saW5lLCBjaGFuZ2UudG8ubGluZSArIDEpLCB0cnVlKQogIHJldHVybiBoaXN0Q2hhbmdlCn0KCi8vIFBvcCBhbGwgc2VsZWN0aW9uIGV2ZW50cyBvZmYgdGhlIGVuZCBvZiBhIGhpc3RvcnkgYXJyYXkuIFN0b3AgYXQKLy8gYSBjaGFuZ2UgZXZlbnQuCmZ1bmN0aW9uIGNsZWFyU2VsZWN0aW9uRXZlbnRzKGFycmF5KSB7CiAgd2hpbGUgKGFycmF5Lmxlbmd0aCkgewogICAgbGV0IGxhc3QgPSBsc3QoYXJyYXkpCiAgICBpZiAobGFzdC5yYW5nZXMpIGFycmF5LnBvcCgpCiAgICBlbHNlIGJyZWFrCiAgfQp9CgovLyBGaW5kIHRoZSB0b3AgY2hhbmdlIGV2ZW50IGluIHRoZSBoaXN0b3J5LiBQb3Agb2ZmIHNlbGVjdGlvbgovLyBldmVudHMgdGhhdCBhcmUgaW4gdGhlIHdheS4KZnVuY3Rpb24gbGFzdENoYW5nZUV2ZW50KGhpc3QsIGZvcmNlKSB7CiAgaWYgKGZvcmNlKSB7CiAgICBjbGVhclNlbGVjdGlvbkV2ZW50cyhoaXN0LmRvbmUpCiAgICByZXR1cm4gbHN0KGhpc3QuZG9uZSkKICB9IGVsc2UgaWYgKGhpc3QuZG9uZS5sZW5ndGggJiYgIWxzdChoaXN0LmRvbmUpLnJhbmdlcykgewogICAgcmV0dXJuIGxzdChoaXN0LmRvbmUpCiAgfSBlbHNlIGlmIChoaXN0LmRvbmUubGVuZ3RoID4gMSAmJiAhaGlzdC5kb25lW2hpc3QuZG9uZS5sZW5ndGggLSAyXS5yYW5nZXMpIHsKICAgIGhpc3QuZG9uZS5wb3AoKQogICAgcmV0dXJuIGxzdChoaXN0LmRvbmUpCiAgfQp9CgovLyBSZWdpc3RlciBhIGNoYW5nZSBpbiB0aGUgaGlzdG9yeS4gTWVyZ2VzIGNoYW5nZXMgdGhhdCBhcmUgd2l0aGluCi8vIGEgc2luZ2xlIG9wZXJhdGlvbiwgb3IgYXJlIGNsb3NlIHRvZ2V0aGVyIHdpdGggYW4gb3JpZ2luIHRoYXQKLy8gYWxsb3dzIG1lcmdpbmcgKHN0YXJ0aW5nIHdpdGggIisiKSBpbnRvIGEgc2luZ2xlIGV2ZW50LgpleHBvcnQgZnVuY3Rpb24gYWRkQ2hhbmdlVG9IaXN0b3J5KGRvYywgY2hhbmdlLCBzZWxBZnRlciwgb3BJZCkgewogIGxldCBoaXN0ID0gZG9jLmhpc3RvcnkKICBoaXN0LnVuZG9uZS5sZW5ndGggPSAwCiAgbGV0IHRpbWUgPSArbmV3IERhdGUsIGN1cgogIGxldCBsYXN0CgogIGlmICgoaGlzdC5sYXN0T3AgPT0gb3BJZCB8fAogICAgICAgaGlzdC5sYXN0T3JpZ2luID09IGNoYW5nZS5vcmlnaW4gJiYgY2hhbmdlLm9yaWdpbiAmJgogICAgICAgKChjaGFuZ2Uub3JpZ2luLmNoYXJBdCgwKSA9PSAiKyIgJiYgZG9jLmNtICYmIGhpc3QubGFzdE1vZFRpbWUgPiB0aW1lIC0gZG9jLmNtLm9wdGlvbnMuaGlzdG9yeUV2ZW50RGVsYXkpIHx8CiAgICAgICAgY2hhbmdlLm9yaWdpbi5jaGFyQXQoMCkgPT0gIioiKSkgJiYKICAgICAgKGN1ciA9IGxhc3RDaGFuZ2VFdmVudChoaXN0LCBoaXN0Lmxhc3RPcCA9PSBvcElkKSkpIHsKICAgIC8vIE1lcmdlIHRoaXMgY2hhbmdlIGludG8gdGhlIGxhc3QgZXZlbnQKICAgIGxhc3QgPSBsc3QoY3VyLmNoYW5nZXMpCiAgICBpZiAoY21wKGNoYW5nZS5mcm9tLCBjaGFuZ2UudG8pID09IDAgJiYgY21wKGNoYW5nZS5mcm9tLCBsYXN0LnRvKSA9PSAwKSB7CiAgICAgIC8vIE9wdGltaXplZCBjYXNlIGZvciBzaW1wbGUgaW5zZXJ0aW9uIC0tIGRvbid0IHdhbnQgdG8gYWRkCiAgICAgIC8vIG5ldyBjaGFuZ2VzZXRzIGZvciBldmVyeSBjaGFyYWN0ZXIgdHlwZWQKICAgICAgbGFzdC50byA9IGNoYW5nZUVuZChjaGFuZ2UpCiAgICB9IGVsc2UgewogICAgICAvLyBBZGQgbmV3IHN1Yi1ldmVudAogICAgICBjdXIuY2hhbmdlcy5wdXNoKGhpc3RvcnlDaGFuZ2VGcm9tQ2hhbmdlKGRvYywgY2hhbmdlKSkKICAgIH0KICB9IGVsc2UgewogICAgLy8gQ2FuIG5vdCBiZSBtZXJnZWQsIHN0YXJ0IGEgbmV3IGV2ZW50LgogICAgbGV0IGJlZm9yZSA9IGxzdChoaXN0LmRvbmUpCiAgICBpZiAoIWJlZm9yZSB8fCAhYmVmb3JlLnJhbmdlcykKICAgICAgcHVzaFNlbGVjdGlvblRvSGlzdG9yeShkb2Muc2VsLCBoaXN0LmRvbmUpCiAgICBjdXIgPSB7Y2hhbmdlczogW2hpc3RvcnlDaGFuZ2VGcm9tQ2hhbmdlKGRvYywgY2hhbmdlKV0sCiAgICAgICAgICAgZ2VuZXJhdGlvbjogaGlzdC5nZW5lcmF0aW9ufQogICAgaGlzdC5kb25lLnB1c2goY3VyKQogICAgd2hpbGUgKGhpc3QuZG9uZS5sZW5ndGggPiBoaXN0LnVuZG9EZXB0aCkgewogICAgICBoaXN0LmRvbmUuc2hpZnQoKQogICAgICBpZiAoIWhpc3QuZG9uZVswXS5yYW5nZXMpIGhpc3QuZG9uZS5zaGlmdCgpCiAgICB9CiAgfQogIGhpc3QuZG9uZS5wdXNoKHNlbEFmdGVyKQogIGhpc3QuZ2VuZXJhdGlvbiA9ICsraGlzdC5tYXhHZW5lcmF0aW9uCiAgaGlzdC5sYXN0TW9kVGltZSA9IGhpc3QubGFzdFNlbFRpbWUgPSB0aW1lCiAgaGlzdC5sYXN0T3AgPSBoaXN0Lmxhc3RTZWxPcCA9IG9wSWQKICBoaXN0Lmxhc3RPcmlnaW4gPSBoaXN0Lmxhc3RTZWxPcmlnaW4gPSBjaGFuZ2Uub3JpZ2luCgogIGlmICghbGFzdCkgc2lnbmFsKGRvYywgImhpc3RvcnlBZGRlZCIpCn0KCmZ1bmN0aW9uIHNlbGVjdGlvbkV2ZW50Q2FuQmVNZXJnZWQoZG9jLCBvcmlnaW4sIHByZXYsIHNlbCkgewogIGxldCBjaCA9IG9yaWdpbi5jaGFyQXQoMCkKICByZXR1cm4gY2ggPT0gIioiIHx8CiAgICBjaCA9PSAiKyIgJiYKICAgIHByZXYucmFuZ2VzLmxlbmd0aCA9PSBzZWwucmFuZ2VzLmxlbmd0aCAmJgogICAgcHJldi5zb21ldGhpbmdTZWxlY3RlZCgpID09IHNlbC5zb21ldGhpbmdTZWxlY3RlZCgpICYmCiAgICBuZXcgRGF0ZSAtIGRvYy5oaXN0b3J5Lmxhc3RTZWxUaW1lIDw9IChkb2MuY20gPyBkb2MuY20ub3B0aW9ucy5oaXN0b3J5RXZlbnREZWxheSA6IDUwMCkKfQoKLy8gQ2FsbGVkIHdoZW5ldmVyIHRoZSBzZWxlY3Rpb24gY2hhbmdlcywgc2V0cyB0aGUgbmV3IHNlbGVjdGlvbiBhcwovLyB0aGUgcGVuZGluZyBzZWxlY3Rpb24gaW4gdGhlIGhpc3RvcnksIGFuZCBwdXNoZXMgdGhlIG9sZCBwZW5kaW5nCi8vIHNlbGVjdGlvbiBpbnRvIHRoZSAnZG9uZScgYXJyYXkgd2hlbiBpdCB3YXMgc2lnbmlmaWNhbnRseQovLyBkaWZmZXJlbnQgKGluIG51bWJlciBvZiBzZWxlY3RlZCByYW5nZXMsIGVtcHRpbmVzcywgb3IgdGltZSkuCmV4cG9ydCBmdW5jdGlvbiBhZGRTZWxlY3Rpb25Ub0hpc3RvcnkoZG9jLCBzZWwsIG9wSWQsIG9wdGlvbnMpIHsKICBsZXQgaGlzdCA9IGRvYy5oaXN0b3J5LCBvcmlnaW4gPSBvcHRpb25zICYmIG9wdGlvbnMub3JpZ2luCgogIC8vIEEgbmV3IGV2ZW50IGlzIHN0YXJ0ZWQgd2hlbiB0aGUgcHJldmlvdXMgb3JpZ2luIGRvZXMgbm90IG1hdGNoCiAgLy8gdGhlIGN1cnJlbnQsIG9yIHRoZSBvcmlnaW5zIGRvbid0IGFsbG93IG1hdGNoaW5nLiBPcmlnaW5zCiAgLy8gc3RhcnRpbmcgd2l0aCAqIGFyZSBhbHdheXMgbWVyZ2VkLCB0aG9zZSBzdGFydGluZyB3aXRoICsgYXJlCiAgLy8gbWVyZ2VkIHdoZW4gc2ltaWxhciBhbmQgY2xvc2UgdG9nZXRoZXIgaW4gdGltZS4KICBpZiAob3BJZCA9PSBoaXN0Lmxhc3RTZWxPcCB8fAogICAgICAob3JpZ2luICYmIGhpc3QubGFzdFNlbE9yaWdpbiA9PSBvcmlnaW4gJiYKICAgICAgIChoaXN0Lmxhc3RNb2RUaW1lID09IGhpc3QubGFzdFNlbFRpbWUgJiYgaGlzdC5sYXN0T3JpZ2luID09IG9yaWdpbiB8fAogICAgICAgIHNlbGVjdGlvbkV2ZW50Q2FuQmVNZXJnZWQoZG9jLCBvcmlnaW4sIGxzdChoaXN0LmRvbmUpLCBzZWwpKSkpCiAgICBoaXN0LmRvbmVbaGlzdC5kb25lLmxlbmd0aCAtIDFdID0gc2VsCiAgZWxzZQogICAgcHVzaFNlbGVjdGlvblRvSGlzdG9yeShzZWwsIGhpc3QuZG9uZSkKCiAgaGlzdC5sYXN0U2VsVGltZSA9ICtuZXcgRGF0ZQogIGhpc3QubGFzdFNlbE9yaWdpbiA9IG9yaWdpbgogIGhpc3QubGFzdFNlbE9wID0gb3BJZAogIGlmIChvcHRpb25zICYmIG9wdGlvbnMuY2xlYXJSZWRvICE9PSBmYWxzZSkKICAgIGNsZWFyU2VsZWN0aW9uRXZlbnRzKGhpc3QudW5kb25lKQp9CgpleHBvcnQgZnVuY3Rpb24gcHVzaFNlbGVjdGlvblRvSGlzdG9yeShzZWwsIGRlc3QpIHsKICBsZXQgdG9wID0gbHN0KGRlc3QpCiAgaWYgKCEodG9wICYmIHRvcC5yYW5nZXMgJiYgdG9wLmVxdWFscyhzZWwpKSkKICAgIGRlc3QucHVzaChzZWwpCn0KCi8vIFVzZWQgdG8gc3RvcmUgbWFya2VkIHNwYW4gaW5mb3JtYXRpb24gaW4gdGhlIGhpc3RvcnkuCmZ1bmN0aW9uIGF0dGFjaExvY2FsU3BhbnMoZG9jLCBjaGFuZ2UsIGZyb20sIHRvKSB7CiAgbGV0IGV4aXN0aW5nID0gY2hhbmdlWyJzcGFuc18iICsgZG9jLmlkXSwgbiA9IDAKICBkb2MuaXRlcihNYXRoLm1heChkb2MuZmlyc3QsIGZyb20pLCBNYXRoLm1pbihkb2MuZmlyc3QgKyBkb2Muc2l6ZSwgdG8pLCBsaW5lID0+IHsKICAgIGlmIChsaW5lLm1hcmtlZFNwYW5zKQogICAgICAoZXhpc3RpbmcgfHwgKGV4aXN0aW5nID0gY2hhbmdlWyJzcGFuc18iICsgZG9jLmlkXSA9IHt9KSlbbl0gPSBsaW5lLm1hcmtlZFNwYW5zCiAgICArK24KICB9KQp9CgovLyBXaGVuIHVuL3JlLWRvaW5nIHJlc3RvcmVzIHRleHQgY29udGFpbmluZyBtYXJrZWQgc3BhbnMsIHRob3NlCi8vIHRoYXQgaGF2ZSBiZWVuIGV4cGxpY2l0bHkgY2xlYXJlZCBzaG91bGQgbm90IGJlIHJlc3RvcmVkLgpmdW5jdGlvbiByZW1vdmVDbGVhcmVkU3BhbnMoc3BhbnMpIHsKICBpZiAoIXNwYW5zKSByZXR1cm4gbnVsbAogIGxldCBvdXQKICBmb3IgKGxldCBpID0gMDsgaSA8IHNwYW5zLmxlbmd0aDsgKytpKSB7CiAgICBpZiAoc3BhbnNbaV0ubWFya2VyLmV4cGxpY2l0bHlDbGVhcmVkKSB7IGlmICghb3V0KSBvdXQgPSBzcGFucy5zbGljZSgwLCBpKSB9CiAgICBlbHNlIGlmIChvdXQpIG91dC5wdXNoKHNwYW5zW2ldKQogIH0KICByZXR1cm4gIW91dCA/IHNwYW5zIDogb3V0Lmxlbmd0aCA/IG91dCA6IG51bGwKfQoKLy8gUmV0cmlldmUgYW5kIGZpbHRlciB0aGUgb2xkIG1hcmtlZCBzcGFucyBzdG9yZWQgaW4gYSBjaGFuZ2UgZXZlbnQuCmZ1bmN0aW9uIGdldE9sZFNwYW5zKGRvYywgY2hhbmdlKSB7CiAgbGV0IGZvdW5kID0gY2hhbmdlWyJzcGFuc18iICsgZG9jLmlkXQogIGlmICghZm91bmQpIHJldHVybiBudWxsCiAgbGV0IG53ID0gW10KICBmb3IgKGxldCBpID0gMDsgaSA8IGNoYW5nZS50ZXh0Lmxlbmd0aDsgKytpKQogICAgbncucHVzaChyZW1vdmVDbGVhcmVkU3BhbnMoZm91bmRbaV0pKQogIHJldHVybiBudwp9CgovLyBVc2VkIGZvciB1bi9yZS1kb2luZyBjaGFuZ2VzIGZyb20gdGhlIGhpc3RvcnkuIENvbWJpbmVzIHRoZQovLyByZXN1bHQgb2YgY29tcHV0aW5nIHRoZSBleGlzdGluZyBzcGFucyB3aXRoIHRoZSBzZXQgb2Ygc3BhbnMgdGhhdAovLyBleGlzdGVkIGluIHRoZSBoaXN0b3J5IChzbyB0aGF0IGRlbGV0aW5nIGFyb3VuZCBhIHNwYW4gYW5kIHRoZW4KLy8gdW5kb2luZyBicmluZ3MgYmFjayB0aGUgc3BhbikuCmV4cG9ydCBmdW5jdGlvbiBtZXJnZU9sZFNwYW5zKGRvYywgY2hhbmdlKSB7CiAgbGV0IG9sZCA9IGdldE9sZFNwYW5zKGRvYywgY2hhbmdlKQogIGxldCBzdHJldGNoZWQgPSBzdHJldGNoU3BhbnNPdmVyQ2hhbmdlKGRvYywgY2hhbmdlKQogIGlmICghb2xkKSByZXR1cm4gc3RyZXRjaGVkCiAgaWYgKCFzdHJldGNoZWQpIHJldHVybiBvbGQKCiAgZm9yIChsZXQgaSA9IDA7IGkgPCBvbGQubGVuZ3RoOyArK2kpIHsKICAgIGxldCBvbGRDdXIgPSBvbGRbaV0sIHN0cmV0Y2hDdXIgPSBzdHJldGNoZWRbaV0KICAgIGlmIChvbGRDdXIgJiYgc3RyZXRjaEN1cikgewogICAgICBzcGFuczogZm9yIChsZXQgaiA9IDA7IGogPCBzdHJldGNoQ3VyLmxlbmd0aDsgKytqKSB7CiAgICAgICAgbGV0IHNwYW4gPSBzdHJldGNoQ3VyW2pdCiAgICAgICAgZm9yIChsZXQgayA9IDA7IGsgPCBvbGRDdXIubGVuZ3RoOyArK2spCiAgICAgICAgICBpZiAob2xkQ3VyW2tdLm1hcmtlciA9PSBzcGFuLm1hcmtlcikgY29udGludWUgc3BhbnMKICAgICAgICBvbGRDdXIucHVzaChzcGFuKQogICAgICB9CiAgICB9IGVsc2UgaWYgKHN0cmV0Y2hDdXIpIHsKICAgICAgb2xkW2ldID0gc3RyZXRjaEN1cgogICAgfQogIH0KICByZXR1cm4gb2xkCn0KCi8vIFVzZWQgYm90aCB0byBwcm92aWRlIGEgSlNPTi1zYWZlIG9iamVjdCBpbiAuZ2V0SGlzdG9yeSwgYW5kLCB3aGVuCi8vIGRldGFjaGluZyBhIGRvY3VtZW50LCB0byBzcGxpdCB0aGUgaGlzdG9yeSBpbiB0d28KZXhwb3J0IGZ1bmN0aW9uIGNvcHlIaXN0b3J5QXJyYXkoZXZlbnRzLCBuZXdHcm91cCwgaW5zdGFudGlhdGVTZWwpIHsKICBsZXQgY29weSA9IFtdCiAgZm9yIChsZXQgaSA9IDA7IGkgPCBldmVudHMubGVuZ3RoOyArK2kpIHsKICAgIGxldCBldmVudCA9IGV2ZW50c1tpXQogICAgaWYgKGV2ZW50LnJhbmdlcykgewogICAgICBjb3B5LnB1c2goaW5zdGFudGlhdGVTZWwgPyBTZWxlY3Rpb24ucHJvdG90eXBlLmRlZXBDb3B5LmNhbGwoZXZlbnQpIDogZXZlbnQpCiAgICAgIGNvbnRpbnVlCiAgICB9CiAgICBsZXQgY2hhbmdlcyA9IGV2ZW50LmNoYW5nZXMsIG5ld0NoYW5nZXMgPSBbXQogICAgY29weS5wdXNoKHtjaGFuZ2VzOiBuZXdDaGFuZ2VzfSkKICAgIGZvciAobGV0IGogPSAwOyBqIDwgY2hhbmdlcy5sZW5ndGg7ICsraikgewogICAgICBsZXQgY2hhbmdlID0gY2hhbmdlc1tqXSwgbQogICAgICBuZXdDaGFuZ2VzLnB1c2goe2Zyb206IGNoYW5nZS5mcm9tLCB0bzogY2hhbmdlLnRvLCB0ZXh0OiBjaGFuZ2UudGV4dH0pCiAgICAgIGlmIChuZXdHcm91cCkgZm9yICh2YXIgcHJvcCBpbiBjaGFuZ2UpIGlmIChtID0gcHJvcC5tYXRjaCgvXnNwYW5zXyhcZCspJC8pKSB7CiAgICAgICAgaWYgKGluZGV4T2YobmV3R3JvdXAsIE51bWJlcihtWzFdKSkgPiAtMSkgewogICAgICAgICAgbHN0KG5ld0NoYW5nZXMpW3Byb3BdID0gY2hhbmdlW3Byb3BdCiAgICAgICAgICBkZWxldGUgY2hhbmdlW3Byb3BdCiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQogIHJldHVybiBjb3B5Cn0K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/src/model/line_widget.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aW1wb3J0IHsgcnVuSW5PcCB9IGZyb20gIi4uL2Rpc3BsYXkvb3BlcmF0aW9ucyIKaW1wb3J0IHsgYWRkVG9TY3JvbGxQb3MgfSBmcm9tICIuLi9kaXNwbGF5L3Njcm9sbGluZyIKaW1wb3J0IHsgcmVnTGluZUNoYW5nZSB9IGZyb20gIi4uL2Rpc3BsYXkvdmlld190cmFja2luZyIKaW1wb3J0IHsgaGVpZ2h0QXRMaW5lLCBsaW5lSXNIaWRkZW4gfSBmcm9tICIuLi9saW5lL3NwYW5zIgppbXBvcnQgeyBsaW5lTm8sIHVwZGF0ZUxpbmVIZWlnaHQgfSBmcm9tICIuLi9saW5lL3V0aWxzX2xpbmUiCmltcG9ydCB7IHdpZGdldEhlaWdodCB9IGZyb20gIi4uL21lYXN1cmVtZW50L3dpZGdldHMiCmltcG9ydCB7IGNoYW5nZUxpbmUgfSBmcm9tICIuL2NoYW5nZXMiCmltcG9ydCB7IGV2ZW50TWl4aW4gfSBmcm9tICIuLi91dGlsL2V2ZW50IgoKLy8gTGluZSB3aWRnZXRzIGFyZSBibG9jayBlbGVtZW50cyBkaXNwbGF5ZWQgYWJvdmUgb3IgYmVsb3cgYSBsaW5lLgoKZXhwb3J0IGZ1bmN0aW9uIExpbmVXaWRnZXQoZG9jLCBub2RlLCBvcHRpb25zKSB7CiAgaWYgKG9wdGlvbnMpIGZvciAobGV0IG9wdCBpbiBvcHRpb25zKSBpZiAob3B0aW9ucy5oYXNPd25Qcm9wZXJ0eShvcHQpKQogICAgdGhpc1tvcHRdID0gb3B0aW9uc1tvcHRdCiAgdGhpcy5kb2MgPSBkb2MKICB0aGlzLm5vZGUgPSBub2RlCn0KZXZlbnRNaXhpbihMaW5lV2lkZ2V0KQoKZnVuY3Rpb24gYWRqdXN0U2Nyb2xsV2hlbkFib3ZlVmlzaWJsZShjbSwgbGluZSwgZGlmZikgewogIGlmIChoZWlnaHRBdExpbmUobGluZSkgPCAoKGNtLmN1ck9wICYmIGNtLmN1ck9wLnNjcm9sbFRvcCkgfHwgY20uZG9jLnNjcm9sbFRvcCkpCiAgICBhZGRUb1Njcm9sbFBvcyhjbSwgbnVsbCwgZGlmZikKfQoKTGluZVdpZGdldC5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbigpIHsKICBsZXQgY20gPSB0aGlzLmRvYy5jbSwgd3MgPSB0aGlzLmxpbmUud2lkZ2V0cywgbGluZSA9IHRoaXMubGluZSwgbm8gPSBsaW5lTm8obGluZSkKICBpZiAobm8gPT0gbnVsbCB8fCAhd3MpIHJldHVybgogIGZvciAobGV0IGkgPSAwOyBpIDwgd3MubGVuZ3RoOyArK2kpIGlmICh3c1tpXSA9PSB0aGlzKSB3cy5zcGxpY2UoaS0tLCAxKQogIGlmICghd3MubGVuZ3RoKSBsaW5lLndpZGdldHMgPSBudWxsCiAgbGV0IGhlaWdodCA9IHdpZGdldEhlaWdodCh0aGlzKQogIHVwZGF0ZUxpbmVIZWlnaHQobGluZSwgTWF0aC5tYXgoMCwgbGluZS5oZWlnaHQgLSBoZWlnaHQpKQogIGlmIChjbSkgcnVuSW5PcChjbSwgKCkgPT4gewogICAgYWRqdXN0U2Nyb2xsV2hlbkFib3ZlVmlzaWJsZShjbSwgbGluZSwgLWhlaWdodCkKICAgIHJlZ0xpbmVDaGFuZ2UoY20sIG5vLCAid2lkZ2V0IikKICB9KQp9CkxpbmVXaWRnZXQucHJvdG90eXBlLmNoYW5nZWQgPSBmdW5jdGlvbigpIHsKICBsZXQgb2xkSCA9IHRoaXMuaGVpZ2h0LCBjbSA9IHRoaXMuZG9jLmNtLCBsaW5lID0gdGhpcy5saW5lCiAgdGhpcy5oZWlnaHQgPSBudWxsCiAgbGV0IGRpZmYgPSB3aWRnZXRIZWlnaHQodGhpcykgLSBvbGRICiAgaWYgKCFkaWZmKSByZXR1cm4KICB1cGRhdGVMaW5lSGVpZ2h0KGxpbmUsIGxpbmUuaGVpZ2h0ICsgZGlmZikKICBpZiAoY20pIHJ1bkluT3AoY20sICgpID0+IHsKICAgIGNtLmN1ck9wLmZvcmNlVXBkYXRlID0gdHJ1ZQogICAgYWRqdXN0U2Nyb2xsV2hlbkFib3ZlVmlzaWJsZShjbSwgbGluZSwgZGlmZikKICB9KQp9CgpleHBvcnQgZnVuY3Rpb24gYWRkTGluZVdpZGdldChkb2MsIGhhbmRsZSwgbm9kZSwgb3B0aW9ucykgewogIGxldCB3aWRnZXQgPSBuZXcgTGluZVdpZGdldChkb2MsIG5vZGUsIG9wdGlvbnMpCiAgbGV0IGNtID0gZG9jLmNtCiAgaWYgKGNtICYmIHdpZGdldC5ub0hTY3JvbGwpIGNtLmRpc3BsYXkuYWxpZ25XaWRnZXRzID0gdHJ1ZQogIGNoYW5nZUxpbmUoZG9jLCBoYW5kbGUsICJ3aWRnZXQiLCBsaW5lID0+IHsKICAgIGxldCB3aWRnZXRzID0gbGluZS53aWRnZXRzIHx8IChsaW5lLndpZGdldHMgPSBbXSkKICAgIGlmICh3aWRnZXQuaW5zZXJ0QXQgPT0gbnVsbCkgd2lkZ2V0cy5wdXNoKHdpZGdldCkKICAgIGVsc2Ugd2lkZ2V0cy5zcGxpY2UoTWF0aC5taW4od2lkZ2V0cy5sZW5ndGggLSAxLCBNYXRoLm1heCgwLCB3aWRnZXQuaW5zZXJ0QXQpKSwgMCwgd2lkZ2V0KQogICAgd2lkZ2V0LmxpbmUgPSBsaW5lCiAgICBpZiAoY20gJiYgIWxpbmVJc0hpZGRlbihkb2MsIGxpbmUpKSB7CiAgICAgIGxldCBhYm92ZVZpc2libGUgPSBoZWlnaHRBdExpbmUobGluZSkgPCBkb2Muc2Nyb2xsVG9wCiAgICAgIHVwZGF0ZUxpbmVIZWlnaHQobGluZSwgbGluZS5oZWlnaHQgKyB3aWRnZXRIZWlnaHQod2lkZ2V0KSkKICAgICAgaWYgKGFib3ZlVmlzaWJsZSkgYWRkVG9TY3JvbGxQb3MoY20sIG51bGwsIHdpZGdldC5oZWlnaHQpCiAgICAgIGNtLmN1ck9wLmZvcmNlVXBkYXRlID0gdHJ1ZQogICAgfQogICAgcmV0dXJuIHRydWUKICB9KQogIHJldHVybiB3aWRnZXQKfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/src/model/mark_text.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aW1wb3J0IHsgZWx0IH0gZnJvbSAiLi4vdXRpbC9kb20iCmltcG9ydCB7IGV2ZW50TWl4aW4sIGhhc0hhbmRsZXIsIG9uIH0gZnJvbSAiLi4vdXRpbC9ldmVudCIKaW1wb3J0IHsgZW5kT3BlcmF0aW9uLCBvcGVyYXRpb24sIHJ1bkluT3AsIHN0YXJ0T3BlcmF0aW9uIH0gZnJvbSAiLi4vZGlzcGxheS9vcGVyYXRpb25zIgppbXBvcnQgeyBjbGlwUG9zLCBjbXAsIFBvcyB9IGZyb20gIi4uL2xpbmUvcG9zIgppbXBvcnQgeyBsaW5lTm8sIHVwZGF0ZUxpbmVIZWlnaHQgfSBmcm9tICIuLi9saW5lL3V0aWxzX2xpbmUiCmltcG9ydCB7IGNsZWFyTGluZU1lYXN1cmVtZW50Q2FjaGVGb3IsIGZpbmRWaWV3Rm9yTGluZSwgdGV4dEhlaWdodCB9IGZyb20gIi4uL21lYXN1cmVtZW50L3Bvc2l0aW9uX21lYXN1cmVtZW50IgppbXBvcnQgeyBzZWVSZWFkT25seVNwYW5zLCBzZWVDb2xsYXBzZWRTcGFucyB9IGZyb20gIi4uL2xpbmUvc2F3X3NwZWNpYWxfc3BhbnMiCmltcG9ydCB7IGFkZE1hcmtlZFNwYW4sIGNvbmZsaWN0aW5nQ29sbGFwc2VkUmFuZ2UsIGdldE1hcmtlZFNwYW5Gb3IsIGxpbmVJc0hpZGRlbiwgbGluZUxlbmd0aCwgTWFya2VkU3BhbiwgcmVtb3ZlTWFya2VkU3BhbiwgdmlzdWFsTGluZSB9IGZyb20gIi4uL2xpbmUvc3BhbnMiCmltcG9ydCB7IGNvcHlPYmosIGluZGV4T2YsIGxzdCB9IGZyb20gIi4uL3V0aWwvbWlzYyIKaW1wb3J0IHsgc2lnbmFsTGF0ZXIgfSBmcm9tICIuLi91dGlsL29wZXJhdGlvbl9ncm91cCIKaW1wb3J0IHsgd2lkZ2V0SGVpZ2h0IH0gZnJvbSAiLi4vbWVhc3VyZW1lbnQvd2lkZ2V0cyIKaW1wb3J0IHsgcmVnQ2hhbmdlLCByZWdMaW5lQ2hhbmdlIH0gZnJvbSAiLi4vZGlzcGxheS92aWV3X3RyYWNraW5nIgoKaW1wb3J0IHsgbGlua2VkRG9jcyB9IGZyb20gIi4vZG9jdW1lbnRfZGF0YSIKaW1wb3J0IHsgYWRkQ2hhbmdlVG9IaXN0b3J5IH0gZnJvbSAiLi9oaXN0b3J5IgppbXBvcnQgeyByZUNoZWNrU2VsZWN0aW9uIH0gZnJvbSAiLi9zZWxlY3Rpb25fdXBkYXRlcyIKCi8vIFRFWFRNQVJLRVJTCgovLyBDcmVhdGVkIHdpdGggbWFya1RleHQgYW5kIHNldEJvb2ttYXJrIG1ldGhvZHMuIEEgVGV4dE1hcmtlciBpcyBhCi8vIGhhbmRsZSB0aGF0IGNhbiBiZSB1c2VkIHRvIGNsZWFyIG9yIGZpbmQgYSBtYXJrZWQgcG9zaXRpb24gaW4gdGhlCi8vIGRvY3VtZW50LiBMaW5lIG9iamVjdHMgaG9sZCBhcnJheXMgKG1hcmtlZFNwYW5zKSBjb250YWluaW5nCi8vIHtmcm9tLCB0bywgbWFya2VyfSBvYmplY3QgcG9pbnRpbmcgdG8gc3VjaCBtYXJrZXIgb2JqZWN0cywgYW5kCi8vIGluZGljYXRpbmcgdGhhdCBzdWNoIGEgbWFya2VyIGlzIHByZXNlbnQgb24gdGhhdCBsaW5lLiBNdWx0aXBsZQovLyBsaW5lcyBtYXkgcG9pbnQgdG8gdGhlIHNhbWUgbWFya2VyIHdoZW4gaXQgc3BhbnMgYWNyb3NzIGxpbmVzLgovLyBUaGUgc3BhbnMgd2lsbCBoYXZlIG51bGwgZm9yIHRoZWlyIGZyb20vdG8gcHJvcGVydGllcyB3aGVuIHRoZQovLyBtYXJrZXIgY29udGludWVzIGJleW9uZCB0aGUgc3RhcnQvZW5kIG9mIHRoZSBsaW5lLiBNYXJrZXJzIGhhdmUKLy8gbGlua3MgYmFjayB0byB0aGUgbGluZXMgdGhleSBjdXJyZW50bHkgdG91Y2guCgovLyBDb2xsYXBzZWQgbWFya2VycyBoYXZlIHVuaXF1ZSBpZHMsIGluIG9yZGVyIHRvIGJlIGFibGUgdG8gb3JkZXIKLy8gdGhlbSwgd2hpY2ggaXMgbmVlZGVkIGZvciB1bmlxdWVseSBkZXRlcm1pbmluZyBhbiBvdXRlciBtYXJrZXIKLy8gd2hlbiB0aGV5IG92ZXJsYXAgKHRoZXkgbWF5IG5lc3QsIGJ1dCBub3QgcGFydGlhbGx5IG92ZXJsYXApLgpsZXQgbmV4dE1hcmtlcklkID0gMAoKZXhwb3J0IGZ1bmN0aW9uIFRleHRNYXJrZXIoZG9jLCB0eXBlKSB7CiAgdGhpcy5saW5lcyA9IFtdCiAgdGhpcy50eXBlID0gdHlwZQogIHRoaXMuZG9jID0gZG9jCiAgdGhpcy5pZCA9ICsrbmV4dE1hcmtlcklkCn0KZXZlbnRNaXhpbihUZXh0TWFya2VyKQoKLy8gQ2xlYXIgdGhlIG1hcmtlci4KVGV4dE1hcmtlci5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbigpIHsKICBpZiAodGhpcy5leHBsaWNpdGx5Q2xlYXJlZCkgcmV0dXJuCiAgbGV0IGNtID0gdGhpcy5kb2MuY20sIHdpdGhPcCA9IGNtICYmICFjbS5jdXJPcAogIGlmICh3aXRoT3ApIHN0YXJ0T3BlcmF0aW9uKGNtKQogIGlmIChoYXNIYW5kbGVyKHRoaXMsICJjbGVhciIpKSB7CiAgICBsZXQgZm91bmQgPSB0aGlzLmZpbmQoKQogICAgaWYgKGZvdW5kKSBzaWduYWxMYXRlcih0aGlzLCAiY2xlYXIiLCBmb3VuZC5mcm9tLCBmb3VuZC50bykKICB9CiAgbGV0IG1pbiA9IG51bGwsIG1heCA9IG51bGwKICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubGluZXMubGVuZ3RoOyArK2kpIHsKICAgIGxldCBsaW5lID0gdGhpcy5saW5lc1tpXQogICAgbGV0IHNwYW4gPSBnZXRNYXJrZWRTcGFuRm9yKGxpbmUubWFya2VkU3BhbnMsIHRoaXMpCiAgICBpZiAoY20gJiYgIXRoaXMuY29sbGFwc2VkKSByZWdMaW5lQ2hhbmdlKGNtLCBsaW5lTm8obGluZSksICJ0ZXh0IikKICAgIGVsc2UgaWYgKGNtKSB7CiAgICAgIGlmIChzcGFuLnRvICE9IG51bGwpIG1heCA9IGxpbmVObyhsaW5lKQogICAgICBpZiAoc3Bhbi5mcm9tICE9IG51bGwpIG1pbiA9IGxpbmVObyhsaW5lKQogICAgfQogICAgbGluZS5tYXJrZWRTcGFucyA9IHJlbW92ZU1hcmtlZFNwYW4obGluZS5tYXJrZWRTcGFucywgc3BhbikKICAgIGlmIChzcGFuLmZyb20gPT0gbnVsbCAmJiB0aGlzLmNvbGxhcHNlZCAmJiAhbGluZUlzSGlkZGVuKHRoaXMuZG9jLCBsaW5lKSAmJiBjbSkKICAgICAgdXBkYXRlTGluZUhlaWdodChsaW5lLCB0ZXh0SGVpZ2h0KGNtLmRpc3BsYXkpKQogIH0KICBpZiAoY20gJiYgdGhpcy5jb2xsYXBzZWQgJiYgIWNtLm9wdGlvbnMubGluZVdyYXBwaW5nKSBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubGluZXMubGVuZ3RoOyArK2kpIHsKICAgIGxldCB2aXN1YWwgPSB2aXN1YWxMaW5lKHRoaXMubGluZXNbaV0pLCBsZW4gPSBsaW5lTGVuZ3RoKHZpc3VhbCkKICAgIGlmIChsZW4gPiBjbS5kaXNwbGF5Lm1heExpbmVMZW5ndGgpIHsKICAgICAgY20uZGlzcGxheS5tYXhMaW5lID0gdmlzdWFsCiAgICAgIGNtLmRpc3BsYXkubWF4TGluZUxlbmd0aCA9IGxlbgogICAgICBjbS5kaXNwbGF5Lm1heExpbmVDaGFuZ2VkID0gdHJ1ZQogICAgfQogIH0KCiAgaWYgKG1pbiAhPSBudWxsICYmIGNtICYmIHRoaXMuY29sbGFwc2VkKSByZWdDaGFuZ2UoY20sIG1pbiwgbWF4ICsgMSkKICB0aGlzLmxpbmVzLmxlbmd0aCA9IDAKICB0aGlzLmV4cGxpY2l0bHlDbGVhcmVkID0gdHJ1ZQogIGlmICh0aGlzLmF0b21pYyAmJiB0aGlzLmRvYy5jYW50RWRpdCkgewogICAgdGhpcy5kb2MuY2FudEVkaXQgPSBmYWxzZQogICAgaWYgKGNtKSByZUNoZWNrU2VsZWN0aW9uKGNtLmRvYykKICB9CiAgaWYgKGNtKSBzaWduYWxMYXRlcihjbSwgIm1hcmtlckNsZWFyZWQiLCBjbSwgdGhpcykKICBpZiAod2l0aE9wKSBlbmRPcGVyYXRpb24oY20pCiAgaWYgKHRoaXMucGFyZW50KSB0aGlzLnBhcmVudC5jbGVhcigpCn0KCi8vIEZpbmQgdGhlIHBvc2l0aW9uIG9mIHRoZSBtYXJrZXIgaW4gdGhlIGRvY3VtZW50LiBSZXR1cm5zIGEge2Zyb20sCi8vIHRvfSBvYmplY3QgYnkgZGVmYXVsdC4gU2lkZSBjYW4gYmUgcGFzc2VkIHRvIGdldCBhIHNwZWNpZmljIHNpZGUKLy8gLS0gMCAoYm90aCksIC0xIChsZWZ0KSwgb3IgMSAocmlnaHQpLiBXaGVuIGxpbmVPYmogaXMgdHJ1ZSwgdGhlCi8vIFBvcyBvYmplY3RzIHJldHVybmVkIGNvbnRhaW4gYSBsaW5lIG9iamVjdCwgcmF0aGVyIHRoYW4gYSBsaW5lCi8vIG51bWJlciAodXNlZCB0byBwcmV2ZW50IGxvb2tpbmcgdXAgdGhlIHNhbWUgbGluZSB0d2ljZSkuClRleHRNYXJrZXIucHJvdG90eXBlLmZpbmQgPSBmdW5jdGlvbihzaWRlLCBsaW5lT2JqKSB7CiAgaWYgKHNpZGUgPT0gbnVsbCAmJiB0aGlzLnR5cGUgPT0gImJvb2ttYXJrIikgc2lkZSA9IDEKICBsZXQgZnJvbSwgdG8KICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubGluZXMubGVuZ3RoOyArK2kpIHsKICAgIGxldCBsaW5lID0gdGhpcy5saW5lc1tpXQogICAgbGV0IHNwYW4gPSBnZXRNYXJrZWRTcGFuRm9yKGxpbmUubWFya2VkU3BhbnMsIHRoaXMpCiAgICBpZiAoc3Bhbi5mcm9tICE9IG51bGwpIHsKICAgICAgZnJvbSA9IFBvcyhsaW5lT2JqID8gbGluZSA6IGxpbmVObyhsaW5lKSwgc3Bhbi5mcm9tKQogICAgICBpZiAoc2lkZSA9PSAtMSkgcmV0dXJuIGZyb20KICAgIH0KICAgIGlmIChzcGFuLnRvICE9IG51bGwpIHsKICAgICAgdG8gPSBQb3MobGluZU9iaiA/IGxpbmUgOiBsaW5lTm8obGluZSksIHNwYW4udG8pCiAgICAgIGlmIChzaWRlID09IDEpIHJldHVybiB0bwogICAgfQogIH0KICByZXR1cm4gZnJvbSAmJiB7ZnJvbTogZnJvbSwgdG86IHRvfQp9CgovLyBTaWduYWxzIHRoYXQgdGhlIG1hcmtlcidzIHdpZGdldCBjaGFuZ2VkLCBhbmQgc3Vycm91bmRpbmcgbGF5b3V0Ci8vIHNob3VsZCBiZSByZWNvbXB1dGVkLgpUZXh0TWFya2VyLnByb3RvdHlwZS5jaGFuZ2VkID0gZnVuY3Rpb24oKSB7CiAgbGV0IHBvcyA9IHRoaXMuZmluZCgtMSwgdHJ1ZSksIHdpZGdldCA9IHRoaXMsIGNtID0gdGhpcy5kb2MuY20KICBpZiAoIXBvcyB8fCAhY20pIHJldHVybgogIHJ1bkluT3AoY20sICgpID0+IHsKICAgIGxldCBsaW5lID0gcG9zLmxpbmUsIGxpbmVOID0gbGluZU5vKHBvcy5saW5lKQogICAgbGV0IHZpZXcgPSBmaW5kVmlld0ZvckxpbmUoY20sIGxpbmVOKQogICAgaWYgKHZpZXcpIHsKICAgICAgY2xlYXJMaW5lTWVhc3VyZW1lbnRDYWNoZUZvcih2aWV3KQogICAgICBjbS5jdXJPcC5zZWxlY3Rpb25DaGFuZ2VkID0gY20uY3VyT3AuZm9yY2VVcGRhdGUgPSB0cnVlCiAgICB9CiAgICBjbS5jdXJPcC51cGRhdGVNYXhMaW5lID0gdHJ1ZQogICAgaWYgKCFsaW5lSXNIaWRkZW4od2lkZ2V0LmRvYywgbGluZSkgJiYgd2lkZ2V0LmhlaWdodCAhPSBudWxsKSB7CiAgICAgIGxldCBvbGRIZWlnaHQgPSB3aWRnZXQuaGVpZ2h0CiAgICAgIHdpZGdldC5oZWlnaHQgPSBudWxsCiAgICAgIGxldCBkSGVpZ2h0ID0gd2lkZ2V0SGVpZ2h0KHdpZGdldCkgLSBvbGRIZWlnaHQKICAgICAgaWYgKGRIZWlnaHQpCiAgICAgICAgdXBkYXRlTGluZUhlaWdodChsaW5lLCBsaW5lLmhlaWdodCArIGRIZWlnaHQpCiAgICB9CiAgfSkKfQoKVGV4dE1hcmtlci5wcm90b3R5cGUuYXR0YWNoTGluZSA9IGZ1bmN0aW9uKGxpbmUpIHsKICBpZiAoIXRoaXMubGluZXMubGVuZ3RoICYmIHRoaXMuZG9jLmNtKSB7CiAgICBsZXQgb3AgPSB0aGlzLmRvYy5jbS5jdXJPcAogICAgaWYgKCFvcC5tYXliZUhpZGRlbk1hcmtlcnMgfHwgaW5kZXhPZihvcC5tYXliZUhpZGRlbk1hcmtlcnMsIHRoaXMpID09IC0xKQogICAgICAob3AubWF5YmVVbmhpZGRlbk1hcmtlcnMgfHwgKG9wLm1heWJlVW5oaWRkZW5NYXJrZXJzID0gW10pKS5wdXNoKHRoaXMpCiAgfQogIHRoaXMubGluZXMucHVzaChsaW5lKQp9ClRleHRNYXJrZXIucHJvdG90eXBlLmRldGFjaExpbmUgPSBmdW5jdGlvbihsaW5lKSB7CiAgdGhpcy5saW5lcy5zcGxpY2UoaW5kZXhPZih0aGlzLmxpbmVzLCBsaW5lKSwgMSkKICBpZiAoIXRoaXMubGluZXMubGVuZ3RoICYmIHRoaXMuZG9jLmNtKSB7CiAgICBsZXQgb3AgPSB0aGlzLmRvYy5jbS5jdXJPcAogICAgOyhvcC5tYXliZUhpZGRlbk1hcmtlcnMgfHwgKG9wLm1heWJlSGlkZGVuTWFya2VycyA9IFtdKSkucHVzaCh0aGlzKQogIH0KfQoKLy8gQ3JlYXRlIGEgbWFya2VyLCB3aXJlIGl0IHVwIHRvIHRoZSByaWdodCBsaW5lcywgYW5kCmV4cG9ydCBmdW5jdGlvbiBtYXJrVGV4dChkb2MsIGZyb20sIHRvLCBvcHRpb25zLCB0eXBlKSB7CiAgLy8gU2hhcmVkIG1hcmtlcnMgKGFjcm9zcyBsaW5rZWQgZG9jdW1lbnRzKSBhcmUgaGFuZGxlZCBzZXBhcmF0ZWx5CiAgLy8gKG1hcmtUZXh0U2hhcmVkIHdpbGwgY2FsbCBvdXQgdG8gdGhpcyBhZ2Fpbiwgb25jZSBwZXIKICAvLyBkb2N1bWVudCkuCiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5zaGFyZWQpIHJldHVybiBtYXJrVGV4dFNoYXJlZChkb2MsIGZyb20sIHRvLCBvcHRpb25zLCB0eXBlKQogIC8vIEVuc3VyZSB3ZSBhcmUgaW4gYW4gb3BlcmF0aW9uLgogIGlmIChkb2MuY20gJiYgIWRvYy5jbS5jdXJPcCkgcmV0dXJuIG9wZXJhdGlvbihkb2MuY20sIG1hcmtUZXh0KShkb2MsIGZyb20sIHRvLCBvcHRpb25zLCB0eXBlKQoKICBsZXQgbWFya2VyID0gbmV3IFRleHRNYXJrZXIoZG9jLCB0eXBlKSwgZGlmZiA9IGNtcChmcm9tLCB0bykKICBpZiAob3B0aW9ucykgY29weU9iaihvcHRpb25zLCBtYXJrZXIsIGZhbHNlKQogIC8vIERvbid0IGNvbm5lY3QgZW1wdHkgbWFya2VycyB1bmxlc3MgY2xlYXJXaGVuRW1wdHkgaXMgZmFsc2UKICBpZiAoZGlmZiA+IDAgfHwgZGlmZiA9PSAwICYmIG1hcmtlci5jbGVhcldoZW5FbXB0eSAhPT0gZmFsc2UpCiAgICByZXR1cm4gbWFya2VyCiAgaWYgKG1hcmtlci5yZXBsYWNlZFdpdGgpIHsKICAgIC8vIFNob3dpbmcgdXAgYXMgYSB3aWRnZXQgaW1wbGllcyBjb2xsYXBzZWQgKHdpZGdldCByZXBsYWNlcyB0ZXh0KQogICAgbWFya2VyLmNvbGxhcHNlZCA9IHRydWUKICAgIG1hcmtlci53aWRnZXROb2RlID0gZWx0KCJzcGFuIiwgW21hcmtlci5yZXBsYWNlZFdpdGhdLCAiQ29kZU1pcnJvci13aWRnZXQiKQogICAgaWYgKCFvcHRpb25zLmhhbmRsZU1vdXNlRXZlbnRzKSBtYXJrZXIud2lkZ2V0Tm9kZS5zZXRBdHRyaWJ1dGUoImNtLWlnbm9yZS1ldmVudHMiLCAidHJ1ZSIpCiAgICBpZiAob3B0aW9ucy5pbnNlcnRMZWZ0KSBtYXJrZXIud2lkZ2V0Tm9kZS5pbnNlcnRMZWZ0ID0gdHJ1ZQogIH0KICBpZiAobWFya2VyLmNvbGxhcHNlZCkgewogICAgaWYgKGNvbmZsaWN0aW5nQ29sbGFwc2VkUmFuZ2UoZG9jLCBmcm9tLmxpbmUsIGZyb20sIHRvLCBtYXJrZXIpIHx8CiAgICAgICAgZnJvbS5saW5lICE9IHRvLmxpbmUgJiYgY29uZmxpY3RpbmdDb2xsYXBzZWRSYW5nZShkb2MsIHRvLmxpbmUsIGZyb20sIHRvLCBtYXJrZXIpKQogICAgICB0aHJvdyBuZXcgRXJyb3IoIkluc2VydGluZyBjb2xsYXBzZWQgbWFya2VyIHBhcnRpYWxseSBvdmVybGFwcGluZyBhbiBleGlzdGluZyBvbmUiKQogICAgc2VlQ29sbGFwc2VkU3BhbnMoKQogIH0KCiAgaWYgKG1hcmtlci5hZGRUb0hpc3RvcnkpCiAgICBhZGRDaGFuZ2VUb0hpc3RvcnkoZG9jLCB7ZnJvbTogZnJvbSwgdG86IHRvLCBvcmlnaW46ICJtYXJrVGV4dCJ9LCBkb2Muc2VsLCBOYU4pCgogIGxldCBjdXJMaW5lID0gZnJvbS5saW5lLCBjbSA9IGRvYy5jbSwgdXBkYXRlTWF4TGluZQogIGRvYy5pdGVyKGN1ckxpbmUsIHRvLmxpbmUgKyAxLCBsaW5lID0+IHsKICAgIGlmIChjbSAmJiBtYXJrZXIuY29sbGFwc2VkICYmICFjbS5vcHRpb25zLmxpbmVXcmFwcGluZyAmJiB2aXN1YWxMaW5lKGxpbmUpID09IGNtLmRpc3BsYXkubWF4TGluZSkKICAgICAgdXBkYXRlTWF4TGluZSA9IHRydWUKICAgIGlmIChtYXJrZXIuY29sbGFwc2VkICYmIGN1ckxpbmUgIT0gZnJvbS5saW5lKSB1cGRhdGVMaW5lSGVpZ2h0KGxpbmUsIDApCiAgICBhZGRNYXJrZWRTcGFuKGxpbmUsIG5ldyBNYXJrZWRTcGFuKG1hcmtlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyTGluZSA9PSBmcm9tLmxpbmUgPyBmcm9tLmNoIDogbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VyTGluZSA9PSB0by5saW5lID8gdG8uY2ggOiBudWxsKSkKICAgICsrY3VyTGluZQogIH0pCiAgLy8gbGluZUlzSGlkZGVuIGRlcGVuZHMgb24gdGhlIHByZXNlbmNlIG9mIHRoZSBzcGFucywgc28gbmVlZHMgYSBzZWNvbmQgcGFzcwogIGlmIChtYXJrZXIuY29sbGFwc2VkKSBkb2MuaXRlcihmcm9tLmxpbmUsIHRvLmxpbmUgKyAxLCBsaW5lID0+IHsKICAgIGlmIChsaW5lSXNIaWRkZW4oZG9jLCBsaW5lKSkgdXBkYXRlTGluZUhlaWdodChsaW5lLCAwKQogIH0pCgogIGlmIChtYXJrZXIuY2xlYXJPbkVudGVyKSBvbihtYXJrZXIsICJiZWZvcmVDdXJzb3JFbnRlciIsICgpID0+IG1hcmtlci5jbGVhcigpKQoKICBpZiAobWFya2VyLnJlYWRPbmx5KSB7CiAgICBzZWVSZWFkT25seVNwYW5zKCkKICAgIGlmIChkb2MuaGlzdG9yeS5kb25lLmxlbmd0aCB8fCBkb2MuaGlzdG9yeS51bmRvbmUubGVuZ3RoKQogICAgICBkb2MuY2xlYXJIaXN0b3J5KCkKICB9CiAgaWYgKG1hcmtlci5jb2xsYXBzZWQpIHsKICAgIG1hcmtlci5pZCA9ICsrbmV4dE1hcmtlcklkCiAgICBtYXJrZXIuYXRvbWljID0gdHJ1ZQogIH0KICBpZiAoY20pIHsKICAgIC8vIFN5bmMgZWRpdG9yIHN0YXRlCiAgICBpZiAodXBkYXRlTWF4TGluZSkgY20uY3VyT3AudXBkYXRlTWF4TGluZSA9IHRydWUKICAgIGlmIChtYXJrZXIuY29sbGFwc2VkKQogICAgICByZWdDaGFuZ2UoY20sIGZyb20ubGluZSwgdG8ubGluZSArIDEpCiAgICBlbHNlIGlmIChtYXJrZXIuY2xhc3NOYW1lIHx8IG1hcmtlci50aXRsZSB8fCBtYXJrZXIuc3RhcnRTdHlsZSB8fCBtYXJrZXIuZW5kU3R5bGUgfHwgbWFya2VyLmNzcykKICAgICAgZm9yIChsZXQgaSA9IGZyb20ubGluZTsgaSA8PSB0by5saW5lOyBpKyspIHJlZ0xpbmVDaGFuZ2UoY20sIGksICJ0ZXh0IikKICAgIGlmIChtYXJrZXIuYXRvbWljKSByZUNoZWNrU2VsZWN0aW9uKGNtLmRvYykKICAgIHNpZ25hbExhdGVyKGNtLCAibWFya2VyQWRkZWQiLCBjbSwgbWFya2VyKQogIH0KICByZXR1cm4gbWFya2VyCn0KCi8vIFNIQVJFRCBURVhUTUFSS0VSUwoKLy8gQSBzaGFyZWQgbWFya2VyIHNwYW5zIG11bHRpcGxlIGxpbmtlZCBkb2N1bWVudHMuIEl0IGlzCi8vIGltcGxlbWVudGVkIGFzIGEgbWV0YS1tYXJrZXItb2JqZWN0IGNvbnRyb2xsaW5nIG11bHRpcGxlIG5vcm1hbAovLyBtYXJrZXJzLgpleHBvcnQgZnVuY3Rpb24gU2hhcmVkVGV4dE1hcmtlcihtYXJrZXJzLCBwcmltYXJ5KSB7CiAgdGhpcy5tYXJrZXJzID0gbWFya2VycwogIHRoaXMucHJpbWFyeSA9IHByaW1hcnkKICBmb3IgKGxldCBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyArK2kpCiAgICBtYXJrZXJzW2ldLnBhcmVudCA9IHRoaXMKfQpldmVudE1peGluKFNoYXJlZFRleHRNYXJrZXIpCgpTaGFyZWRUZXh0TWFya2VyLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uKCkgewogIGlmICh0aGlzLmV4cGxpY2l0bHlDbGVhcmVkKSByZXR1cm4KICB0aGlzLmV4cGxpY2l0bHlDbGVhcmVkID0gdHJ1ZQogIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5tYXJrZXJzLmxlbmd0aDsgKytpKQogICAgdGhpcy5tYXJrZXJzW2ldLmNsZWFyKCkKICBzaWduYWxMYXRlcih0aGlzLCAiY2xlYXIiKQp9ClNoYXJlZFRleHRNYXJrZXIucHJvdG90eXBlLmZpbmQgPSBmdW5jdGlvbihzaWRlLCBsaW5lT2JqKSB7CiAgcmV0dXJuIHRoaXMucHJpbWFyeS5maW5kKHNpZGUsIGxpbmVPYmopCn0KCmZ1bmN0aW9uIG1hcmtUZXh0U2hhcmVkKGRvYywgZnJvbSwgdG8sIG9wdGlvbnMsIHR5cGUpIHsKICBvcHRpb25zID0gY29weU9iaihvcHRpb25zKQogIG9wdGlvbnMuc2hhcmVkID0gZmFsc2UKICBsZXQgbWFya2VycyA9IFttYXJrVGV4dChkb2MsIGZyb20sIHRvLCBvcHRpb25zLCB0eXBlKV0sIHByaW1hcnkgPSBtYXJrZXJzWzBdCiAgbGV0IHdpZGdldCA9IG9wdGlvbnMud2lkZ2V0Tm9kZQogIGxpbmtlZERvY3MoZG9jLCBkb2MgPT4gewogICAgaWYgKHdpZGdldCkgb3B0aW9ucy53aWRnZXROb2RlID0gd2lkZ2V0LmNsb25lTm9kZSh0cnVlKQogICAgbWFya2Vycy5wdXNoKG1hcmtUZXh0KGRvYywgY2xpcFBvcyhkb2MsIGZyb20pLCBjbGlwUG9zKGRvYywgdG8pLCBvcHRpb25zLCB0eXBlKSkKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZG9jLmxpbmtlZC5sZW5ndGg7ICsraSkKICAgICAgaWYgKGRvYy5saW5rZWRbaV0uaXNQYXJlbnQpIHJldHVybgogICAgcHJpbWFyeSA9IGxzdChtYXJrZXJzKQogIH0pCiAgcmV0dXJuIG5ldyBTaGFyZWRUZXh0TWFya2VyKG1hcmtlcnMsIHByaW1hcnkpCn0KCmV4cG9ydCBmdW5jdGlvbiBmaW5kU2hhcmVkTWFya2Vycyhkb2MpIHsKICByZXR1cm4gZG9jLmZpbmRNYXJrcyhQb3MoZG9jLmZpcnN0LCAwKSwgZG9jLmNsaXBQb3MoUG9zKGRvYy5sYXN0TGluZSgpKSksIG0gPT4gbS5wYXJlbnQpCn0KCmV4cG9ydCBmdW5jdGlvbiBjb3B5U2hhcmVkTWFya2Vycyhkb2MsIG1hcmtlcnMpIHsKICBmb3IgKGxldCBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyBpKyspIHsKICAgIGxldCBtYXJrZXIgPSBtYXJrZXJzW2ldLCBwb3MgPSBtYXJrZXIuZmluZCgpCiAgICBsZXQgbUZyb20gPSBkb2MuY2xpcFBvcyhwb3MuZnJvbSksIG1UbyA9IGRvYy5jbGlwUG9zKHBvcy50bykKICAgIGlmIChjbXAobUZyb20sIG1UbykpIHsKICAgICAgbGV0IHN1Yk1hcmsgPSBtYXJrVGV4dChkb2MsIG1Gcm9tLCBtVG8sIG1hcmtlci5wcmltYXJ5LCBtYXJrZXIucHJpbWFyeS50eXBlKQogICAgICBtYXJrZXIubWFya2Vycy5wdXNoKHN1Yk1hcmspCiAgICAgIHN1Yk1hcmsucGFyZW50ID0gbWFya2VyCiAgICB9CiAgfQp9CgpleHBvcnQgZnVuY3Rpb24gZGV0YWNoU2hhcmVkTWFya2VycyhtYXJrZXJzKSB7CiAgZm9yIChsZXQgaSA9IDA7IGkgPCBtYXJrZXJzLmxlbmd0aDsgaSsrKSB7CiAgICBsZXQgbWFya2VyID0gbWFya2Vyc1tpXSwgbGlua2VkID0gW21hcmtlci5wcmltYXJ5LmRvY10KICAgIGxpbmtlZERvY3MobWFya2VyLnByaW1hcnkuZG9jLCBkID0+IGxpbmtlZC5wdXNoKGQpKQogICAgZm9yIChsZXQgaiA9IDA7IGogPCBtYXJrZXIubWFya2Vycy5sZW5ndGg7IGorKykgewogICAgICBsZXQgc3ViTWFya2VyID0gbWFya2VyLm1hcmtlcnNbal0KICAgICAgaWYgKGluZGV4T2YobGlua2VkLCBzdWJNYXJrZXIuZG9jKSA9PSAtMSkgewogICAgICAgIHN1Yk1hcmtlci5wYXJlbnQgPSBudWxsCiAgICAgICAgbWFya2VyLm1hcmtlcnMuc3BsaWNlKGotLSwgMSkKICAgICAgfQogICAgfQogIH0KfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/src/model/selection.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aW1wb3J0IHsgY21wLCBjb3B5UG9zLCBtYXhQb3MsIG1pblBvcyB9IGZyb20gIi4uL2xpbmUvcG9zIgppbXBvcnQgeyBpbmRleE9mIH0gZnJvbSAiLi4vdXRpbC9taXNjIgoKLy8gU2VsZWN0aW9uIG9iamVjdHMgYXJlIGltbXV0YWJsZS4gQSBuZXcgb25lIGlzIGNyZWF0ZWQgZXZlcnkgdGltZQovLyB0aGUgc2VsZWN0aW9uIGNoYW5nZXMuIEEgc2VsZWN0aW9uIGlzIG9uZSBvciBtb3JlIG5vbi1vdmVybGFwcGluZwovLyAoYW5kIG5vbi10b3VjaGluZykgcmFuZ2VzLCBzb3J0ZWQsIGFuZCBhbiBpbnRlZ2VyIHRoYXQgaW5kaWNhdGVzCi8vIHdoaWNoIG9uZSBpcyB0aGUgcHJpbWFyeSBzZWxlY3Rpb24gKHRoZSBvbmUgdGhhdCdzIHNjcm9sbGVkIGludG8KLy8gdmlldywgdGhhdCBnZXRDdXJzb3IgcmV0dXJucywgZXRjKS4KZXhwb3J0IGZ1bmN0aW9uIFNlbGVjdGlvbihyYW5nZXMsIHByaW1JbmRleCkgewogIHRoaXMucmFuZ2VzID0gcmFuZ2VzCiAgdGhpcy5wcmltSW5kZXggPSBwcmltSW5kZXgKfQoKU2VsZWN0aW9uLnByb3RvdHlwZSA9IHsKICBwcmltYXJ5OiBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMucmFuZ2VzW3RoaXMucHJpbUluZGV4XSB9LAogIGVxdWFsczogZnVuY3Rpb24ob3RoZXIpIHsKICAgIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm4gdHJ1ZQogICAgaWYgKG90aGVyLnByaW1JbmRleCAhPSB0aGlzLnByaW1JbmRleCB8fCBvdGhlci5yYW5nZXMubGVuZ3RoICE9IHRoaXMucmFuZ2VzLmxlbmd0aCkgcmV0dXJuIGZhbHNlCiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucmFuZ2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgIGxldCBoZXJlID0gdGhpcy5yYW5nZXNbaV0sIHRoZXJlID0gb3RoZXIucmFuZ2VzW2ldCiAgICAgIGlmIChjbXAoaGVyZS5hbmNob3IsIHRoZXJlLmFuY2hvcikgIT0gMCB8fCBjbXAoaGVyZS5oZWFkLCB0aGVyZS5oZWFkKSAhPSAwKSByZXR1cm4gZmFsc2UKICAgIH0KICAgIHJldHVybiB0cnVlCiAgfSwKICBkZWVwQ29weTogZnVuY3Rpb24oKSB7CiAgICBsZXQgb3V0ID0gW10KICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yYW5nZXMubGVuZ3RoOyBpKyspCiAgICAgIG91dFtpXSA9IG5ldyBSYW5nZShjb3B5UG9zKHRoaXMucmFuZ2VzW2ldLmFuY2hvciksIGNvcHlQb3ModGhpcy5yYW5nZXNbaV0uaGVhZCkpCiAgICByZXR1cm4gbmV3IFNlbGVjdGlvbihvdXQsIHRoaXMucHJpbUluZGV4KQogIH0sCiAgc29tZXRoaW5nU2VsZWN0ZWQ6IGZ1bmN0aW9uKCkgewogICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnJhbmdlcy5sZW5ndGg7IGkrKykKICAgICAgaWYgKCF0aGlzLnJhbmdlc1tpXS5lbXB0eSgpKSByZXR1cm4gdHJ1ZQogICAgcmV0dXJuIGZhbHNlCiAgfSwKICBjb250YWluczogZnVuY3Rpb24ocG9zLCBlbmQpIHsKICAgIGlmICghZW5kKSBlbmQgPSBwb3MKICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5yYW5nZXMubGVuZ3RoOyBpKyspIHsKICAgICAgbGV0IHJhbmdlID0gdGhpcy5yYW5nZXNbaV0KICAgICAgaWYgKGNtcChlbmQsIHJhbmdlLmZyb20oKSkgPj0gMCAmJiBjbXAocG9zLCByYW5nZS50bygpKSA8PSAwKQogICAgICAgIHJldHVybiBpCiAgICB9CiAgICByZXR1cm4gLTEKICB9Cn0KCmV4cG9ydCBmdW5jdGlvbiBSYW5nZShhbmNob3IsIGhlYWQpIHsKICB0aGlzLmFuY2hvciA9IGFuY2hvcjsgdGhpcy5oZWFkID0gaGVhZAp9CgpSYW5nZS5wcm90b3R5cGUgPSB7CiAgZnJvbTogZnVuY3Rpb24oKSB7IHJldHVybiBtaW5Qb3ModGhpcy5hbmNob3IsIHRoaXMuaGVhZCkgfSwKICB0bzogZnVuY3Rpb24oKSB7IHJldHVybiBtYXhQb3ModGhpcy5hbmNob3IsIHRoaXMuaGVhZCkgfSwKICBlbXB0eTogZnVuY3Rpb24oKSB7CiAgICByZXR1cm4gdGhpcy5oZWFkLmxpbmUgPT0gdGhpcy5hbmNob3IubGluZSAmJiB0aGlzLmhlYWQuY2ggPT0gdGhpcy5hbmNob3IuY2gKICB9Cn0KCi8vIFRha2UgYW4gdW5zb3J0ZWQsIHBvdGVudGlhbGx5IG92ZXJsYXBwaW5nIHNldCBvZiByYW5nZXMsIGFuZAovLyBidWlsZCBhIHNlbGVjdGlvbiBvdXQgb2YgaXQuICdDb25zdW1lcycgcmFuZ2VzIGFycmF5IChtb2RpZnlpbmcKLy8gaXQpLgpleHBvcnQgZnVuY3Rpb24gbm9ybWFsaXplU2VsZWN0aW9uKHJhbmdlcywgcHJpbUluZGV4KSB7CiAgbGV0IHByaW0gPSByYW5nZXNbcHJpbUluZGV4XQogIHJhbmdlcy5zb3J0KChhLCBiKSA9PiBjbXAoYS5mcm9tKCksIGIuZnJvbSgpKSkKICBwcmltSW5kZXggPSBpbmRleE9mKHJhbmdlcywgcHJpbSkKICBmb3IgKGxldCBpID0gMTsgaSA8IHJhbmdlcy5sZW5ndGg7IGkrKykgewogICAgbGV0IGN1ciA9IHJhbmdlc1tpXSwgcHJldiA9IHJhbmdlc1tpIC0gMV0KICAgIGlmIChjbXAocHJldi50bygpLCBjdXIuZnJvbSgpKSA+PSAwKSB7CiAgICAgIGxldCBmcm9tID0gbWluUG9zKHByZXYuZnJvbSgpLCBjdXIuZnJvbSgpKSwgdG8gPSBtYXhQb3MocHJldi50bygpLCBjdXIudG8oKSkKICAgICAgbGV0IGludiA9IHByZXYuZW1wdHkoKSA/IGN1ci5mcm9tKCkgPT0gY3VyLmhlYWQgOiBwcmV2LmZyb20oKSA9PSBwcmV2LmhlYWQKICAgICAgaWYgKGkgPD0gcHJpbUluZGV4KSAtLXByaW1JbmRleAogICAgICByYW5nZXMuc3BsaWNlKC0taSwgMiwgbmV3IFJhbmdlKGludiA/IHRvIDogZnJvbSwgaW52ID8gZnJvbSA6IHRvKSkKICAgIH0KICB9CiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24ocmFuZ2VzLCBwcmltSW5kZXgpCn0KCmV4cG9ydCBmdW5jdGlvbiBzaW1wbGVTZWxlY3Rpb24oYW5jaG9yLCBoZWFkKSB7CiAgcmV0dXJuIG5ldyBTZWxlY3Rpb24oW25ldyBSYW5nZShhbmNob3IsIGhlYWQgfHwgYW5jaG9yKV0sIDApCn0K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/src/model/selection_updates.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aW1wb3J0IHsgc2lnbmFsTGF0ZXIgfSBmcm9tICIuLi91dGlsL29wZXJhdGlvbl9ncm91cCIKaW1wb3J0IHsgZW5zdXJlQ3Vyc29yVmlzaWJsZSB9IGZyb20gIi4uL2Rpc3BsYXkvc2Nyb2xsaW5nIgppbXBvcnQgeyBjbGlwUG9zLCBjbXAsIFBvcyB9IGZyb20gIi4uL2xpbmUvcG9zIgppbXBvcnQgeyBnZXRMaW5lIH0gZnJvbSAiLi4vbGluZS91dGlsc19saW5lIgppbXBvcnQgeyBoYXNIYW5kbGVyLCBzaWduYWwsIHNpZ25hbEN1cnNvckFjdGl2aXR5IH0gZnJvbSAiLi4vdXRpbC9ldmVudCIKaW1wb3J0IHsgbHN0LCBzZWxfZG9udFNjcm9sbCB9IGZyb20gIi4uL3V0aWwvbWlzYyIKCmltcG9ydCB7IGFkZFNlbGVjdGlvblRvSGlzdG9yeSB9IGZyb20gIi4vaGlzdG9yeSIKaW1wb3J0IHsgbm9ybWFsaXplU2VsZWN0aW9uLCBSYW5nZSwgU2VsZWN0aW9uLCBzaW1wbGVTZWxlY3Rpb24gfSBmcm9tICIuL3NlbGVjdGlvbiIKCi8vIFRoZSAnc2Nyb2xsJyBwYXJhbWV0ZXIgZ2l2ZW4gdG8gbWFueSBvZiB0aGVzZSBpbmRpY2F0ZWQgd2hldGhlcgovLyB0aGUgbmV3IGN1cnNvciBwb3NpdGlvbiBzaG91bGQgYmUgc2Nyb2xsZWQgaW50byB2aWV3IGFmdGVyCi8vIG1vZGlmeWluZyB0aGUgc2VsZWN0aW9uLgoKLy8gSWYgc2hpZnQgaXMgaGVsZCBvciB0aGUgZXh0ZW5kIGZsYWcgaXMgc2V0LCBleHRlbmRzIGEgcmFuZ2UgdG8KLy8gaW5jbHVkZSBhIGdpdmVuIHBvc2l0aW9uIChhbmQgb3B0aW9uYWxseSBhIHNlY29uZCBwb3NpdGlvbikuCi8vIE90aGVyd2lzZSwgc2ltcGx5IHJldHVybnMgdGhlIHJhbmdlIGJldHdlZW4gdGhlIGdpdmVuIHBvc2l0aW9ucy4KLy8gVXNlZCBmb3IgY3Vyc29yIG1vdGlvbiBhbmQgc3VjaC4KZXhwb3J0IGZ1bmN0aW9uIGV4dGVuZFJhbmdlKGRvYywgcmFuZ2UsIGhlYWQsIG90aGVyKSB7CiAgaWYgKGRvYy5jbSAmJiBkb2MuY20uZGlzcGxheS5zaGlmdCB8fCBkb2MuZXh0ZW5kKSB7CiAgICBsZXQgYW5jaG9yID0gcmFuZ2UuYW5jaG9yCiAgICBpZiAob3RoZXIpIHsKICAgICAgbGV0IHBvc0JlZm9yZSA9IGNtcChoZWFkLCBhbmNob3IpIDwgMAogICAgICBpZiAocG9zQmVmb3JlICE9IChjbXAob3RoZXIsIGFuY2hvcikgPCAwKSkgewogICAgICAgIGFuY2hvciA9IGhlYWQKICAgICAgICBoZWFkID0gb3RoZXIKICAgICAgfSBlbHNlIGlmIChwb3NCZWZvcmUgIT0gKGNtcChoZWFkLCBvdGhlcikgPCAwKSkgewogICAgICAgIGhlYWQgPSBvdGhlcgogICAgICB9CiAgICB9CiAgICByZXR1cm4gbmV3IFJhbmdlKGFuY2hvciwgaGVhZCkKICB9IGVsc2UgewogICAgcmV0dXJuIG5ldyBSYW5nZShvdGhlciB8fCBoZWFkLCBoZWFkKQogIH0KfQoKLy8gRXh0ZW5kIHRoZSBwcmltYXJ5IHNlbGVjdGlvbiByYW5nZSwgZGlzY2FyZCB0aGUgcmVzdC4KZXhwb3J0IGZ1bmN0aW9uIGV4dGVuZFNlbGVjdGlvbihkb2MsIGhlYWQsIG90aGVyLCBvcHRpb25zKSB7CiAgc2V0U2VsZWN0aW9uKGRvYywgbmV3IFNlbGVjdGlvbihbZXh0ZW5kUmFuZ2UoZG9jLCBkb2Muc2VsLnByaW1hcnkoKSwgaGVhZCwgb3RoZXIpXSwgMCksIG9wdGlvbnMpCn0KCi8vIEV4dGVuZCBhbGwgc2VsZWN0aW9ucyAocG9zIGlzIGFuIGFycmF5IG9mIHNlbGVjdGlvbnMgd2l0aCBsZW5ndGgKLy8gZXF1YWwgdGhlIG51bWJlciBvZiBzZWxlY3Rpb25zKQpleHBvcnQgZnVuY3Rpb24gZXh0ZW5kU2VsZWN0aW9ucyhkb2MsIGhlYWRzLCBvcHRpb25zKSB7CiAgbGV0IG91dCA9IFtdCiAgZm9yIChsZXQgaSA9IDA7IGkgPCBkb2Muc2VsLnJhbmdlcy5sZW5ndGg7IGkrKykKICAgIG91dFtpXSA9IGV4dGVuZFJhbmdlKGRvYywgZG9jLnNlbC5yYW5nZXNbaV0sIGhlYWRzW2ldLCBudWxsKQogIGxldCBuZXdTZWwgPSBub3JtYWxpemVTZWxlY3Rpb24ob3V0LCBkb2Muc2VsLnByaW1JbmRleCkKICBzZXRTZWxlY3Rpb24oZG9jLCBuZXdTZWwsIG9wdGlvbnMpCn0KCi8vIFVwZGF0ZXMgYSBzaW5nbGUgcmFuZ2UgaW4gdGhlIHNlbGVjdGlvbi4KZXhwb3J0IGZ1bmN0aW9uIHJlcGxhY2VPbmVTZWxlY3Rpb24oZG9jLCBpLCByYW5nZSwgb3B0aW9ucykgewogIGxldCByYW5nZXMgPSBkb2Muc2VsLnJhbmdlcy5zbGljZSgwKQogIHJhbmdlc1tpXSA9IHJhbmdlCiAgc2V0U2VsZWN0aW9uKGRvYywgbm9ybWFsaXplU2VsZWN0aW9uKHJhbmdlcywgZG9jLnNlbC5wcmltSW5kZXgpLCBvcHRpb25zKQp9CgovLyBSZXNldCB0aGUgc2VsZWN0aW9uIHRvIGEgc2luZ2xlIHJhbmdlLgpleHBvcnQgZnVuY3Rpb24gc2V0U2ltcGxlU2VsZWN0aW9uKGRvYywgYW5jaG9yLCBoZWFkLCBvcHRpb25zKSB7CiAgc2V0U2VsZWN0aW9uKGRvYywgc2ltcGxlU2VsZWN0aW9uKGFuY2hvciwgaGVhZCksIG9wdGlvbnMpCn0KCi8vIEdpdmUgYmVmb3JlU2VsZWN0aW9uQ2hhbmdlIGhhbmRsZXJzIGEgY2hhbmdlIHRvIGluZmx1ZW5jZSBhCi8vIHNlbGVjdGlvbiB1cGRhdGUuCmZ1bmN0aW9uIGZpbHRlclNlbGVjdGlvbkNoYW5nZShkb2MsIHNlbCwgb3B0aW9ucykgewogIGxldCBvYmogPSB7CiAgICByYW5nZXM6IHNlbC5yYW5nZXMsCiAgICB1cGRhdGU6IGZ1bmN0aW9uKHJhbmdlcykgewogICAgICB0aGlzLnJhbmdlcyA9IFtdCiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmFuZ2VzLmxlbmd0aDsgaSsrKQogICAgICAgIHRoaXMucmFuZ2VzW2ldID0gbmV3IFJhbmdlKGNsaXBQb3MoZG9jLCByYW5nZXNbaV0uYW5jaG9yKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGlwUG9zKGRvYywgcmFuZ2VzW2ldLmhlYWQpKQogICAgfSwKICAgIG9yaWdpbjogb3B0aW9ucyAmJiBvcHRpb25zLm9yaWdpbgogIH0KICBzaWduYWwoZG9jLCAiYmVmb3JlU2VsZWN0aW9uQ2hhbmdlIiwgZG9jLCBvYmopCiAgaWYgKGRvYy5jbSkgc2lnbmFsKGRvYy5jbSwgImJlZm9yZVNlbGVjdGlvbkNoYW5nZSIsIGRvYy5jbSwgb2JqKQogIGlmIChvYmoucmFuZ2VzICE9IHNlbC5yYW5nZXMpIHJldHVybiBub3JtYWxpemVTZWxlY3Rpb24ob2JqLnJhbmdlcywgb2JqLnJhbmdlcy5sZW5ndGggLSAxKQogIGVsc2UgcmV0dXJuIHNlbAp9CgpleHBvcnQgZnVuY3Rpb24gc2V0U2VsZWN0aW9uUmVwbGFjZUhpc3RvcnkoZG9jLCBzZWwsIG9wdGlvbnMpIHsKICBsZXQgZG9uZSA9IGRvYy5oaXN0b3J5LmRvbmUsIGxhc3QgPSBsc3QoZG9uZSkKICBpZiAobGFzdCAmJiBsYXN0LnJhbmdlcykgewogICAgZG9uZVtkb25lLmxlbmd0aCAtIDFdID0gc2VsCiAgICBzZXRTZWxlY3Rpb25Ob1VuZG8oZG9jLCBzZWwsIG9wdGlvbnMpCiAgfSBlbHNlIHsKICAgIHNldFNlbGVjdGlvbihkb2MsIHNlbCwgb3B0aW9ucykKICB9Cn0KCi8vIFNldCBhIG5ldyBzZWxlY3Rpb24uCmV4cG9ydCBmdW5jdGlvbiBzZXRTZWxlY3Rpb24oZG9jLCBzZWwsIG9wdGlvbnMpIHsKICBzZXRTZWxlY3Rpb25Ob1VuZG8oZG9jLCBzZWwsIG9wdGlvbnMpCiAgYWRkU2VsZWN0aW9uVG9IaXN0b3J5KGRvYywgZG9jLnNlbCwgZG9jLmNtID8gZG9jLmNtLmN1ck9wLmlkIDogTmFOLCBvcHRpb25zKQp9CgpleHBvcnQgZnVuY3Rpb24gc2V0U2VsZWN0aW9uTm9VbmRvKGRvYywgc2VsLCBvcHRpb25zKSB7CiAgaWYgKGhhc0hhbmRsZXIoZG9jLCAiYmVmb3JlU2VsZWN0aW9uQ2hhbmdlIikgfHwgZG9jLmNtICYmIGhhc0hhbmRsZXIoZG9jLmNtLCAiYmVmb3JlU2VsZWN0aW9uQ2hhbmdlIikpCiAgICBzZWwgPSBmaWx0ZXJTZWxlY3Rpb25DaGFuZ2UoZG9jLCBzZWwsIG9wdGlvbnMpCgogIGxldCBiaWFzID0gb3B0aW9ucyAmJiBvcHRpb25zLmJpYXMgfHwKICAgIChjbXAoc2VsLnByaW1hcnkoKS5oZWFkLCBkb2Muc2VsLnByaW1hcnkoKS5oZWFkKSA8IDAgPyAtMSA6IDEpCiAgc2V0U2VsZWN0aW9uSW5uZXIoZG9jLCBza2lwQXRvbWljSW5TZWxlY3Rpb24oZG9jLCBzZWwsIGJpYXMsIHRydWUpKQoKICBpZiAoIShvcHRpb25zICYmIG9wdGlvbnMuc2Nyb2xsID09PSBmYWxzZSkgJiYgZG9jLmNtKQogICAgZW5zdXJlQ3Vyc29yVmlzaWJsZShkb2MuY20pCn0KCmZ1bmN0aW9uIHNldFNlbGVjdGlvbklubmVyKGRvYywgc2VsKSB7CiAgaWYgKHNlbC5lcXVhbHMoZG9jLnNlbCkpIHJldHVybgoKICBkb2Muc2VsID0gc2VsCgogIGlmIChkb2MuY20pIHsKICAgIGRvYy5jbS5jdXJPcC51cGRhdGVJbnB1dCA9IGRvYy5jbS5jdXJPcC5zZWxlY3Rpb25DaGFuZ2VkID0gdHJ1ZQogICAgc2lnbmFsQ3Vyc29yQWN0aXZpdHkoZG9jLmNtKQogIH0KICBzaWduYWxMYXRlcihkb2MsICJjdXJzb3JBY3Rpdml0eSIsIGRvYykKfQoKLy8gVmVyaWZ5IHRoYXQgdGhlIHNlbGVjdGlvbiBkb2VzIG5vdCBwYXJ0aWFsbHkgc2VsZWN0IGFueSBhdG9taWMKLy8gbWFya2VkIHJhbmdlcy4KZXhwb3J0IGZ1bmN0aW9uIHJlQ2hlY2tTZWxlY3Rpb24oZG9jKSB7CiAgc2V0U2VsZWN0aW9uSW5uZXIoZG9jLCBza2lwQXRvbWljSW5TZWxlY3Rpb24oZG9jLCBkb2Muc2VsLCBudWxsLCBmYWxzZSksIHNlbF9kb250U2Nyb2xsKQp9CgovLyBSZXR1cm4gYSBzZWxlY3Rpb24gdGhhdCBkb2VzIG5vdCBwYXJ0aWFsbHkgc2VsZWN0IGFueSBhdG9taWMKLy8gcmFuZ2VzLgpmdW5jdGlvbiBza2lwQXRvbWljSW5TZWxlY3Rpb24oZG9jLCBzZWwsIGJpYXMsIG1heUNsZWFyKSB7CiAgbGV0IG91dAogIGZvciAobGV0IGkgPSAwOyBpIDwgc2VsLnJhbmdlcy5sZW5ndGg7IGkrKykgewogICAgbGV0IHJhbmdlID0gc2VsLnJhbmdlc1tpXQogICAgbGV0IG9sZCA9IHNlbC5yYW5nZXMubGVuZ3RoID09IGRvYy5zZWwucmFuZ2VzLmxlbmd0aCAmJiBkb2Muc2VsLnJhbmdlc1tpXQogICAgbGV0IG5ld0FuY2hvciA9IHNraXBBdG9taWMoZG9jLCByYW5nZS5hbmNob3IsIG9sZCAmJiBvbGQuYW5jaG9yLCBiaWFzLCBtYXlDbGVhcikKICAgIGxldCBuZXdIZWFkID0gc2tpcEF0b21pYyhkb2MsIHJhbmdlLmhlYWQsIG9sZCAmJiBvbGQuaGVhZCwgYmlhcywgbWF5Q2xlYXIpCiAgICBpZiAob3V0IHx8IG5ld0FuY2hvciAhPSByYW5nZS5hbmNob3IgfHwgbmV3SGVhZCAhPSByYW5nZS5oZWFkKSB7CiAgICAgIGlmICghb3V0KSBvdXQgPSBzZWwucmFuZ2VzLnNsaWNlKDAsIGkpCiAgICAgIG91dFtpXSA9IG5ldyBSYW5nZShuZXdBbmNob3IsIG5ld0hlYWQpCiAgICB9CiAgfQogIHJldHVybiBvdXQgPyBub3JtYWxpemVTZWxlY3Rpb24ob3V0LCBzZWwucHJpbUluZGV4KSA6IHNlbAp9CgpmdW5jdGlvbiBza2lwQXRvbWljSW5uZXIoZG9jLCBwb3MsIG9sZFBvcywgZGlyLCBtYXlDbGVhcikgewogIGxldCBsaW5lID0gZ2V0TGluZShkb2MsIHBvcy5saW5lKQogIGlmIChsaW5lLm1hcmtlZFNwYW5zKSBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmUubWFya2VkU3BhbnMubGVuZ3RoOyArK2kpIHsKICAgIGxldCBzcCA9IGxpbmUubWFya2VkU3BhbnNbaV0sIG0gPSBzcC5tYXJrZXIKICAgIGlmICgoc3AuZnJvbSA9PSBudWxsIHx8IChtLmluY2x1c2l2ZUxlZnQgPyBzcC5mcm9tIDw9IHBvcy5jaCA6IHNwLmZyb20gPCBwb3MuY2gpKSAmJgogICAgICAgIChzcC50byA9PSBudWxsIHx8IChtLmluY2x1c2l2ZVJpZ2h0ID8gc3AudG8gPj0gcG9zLmNoIDogc3AudG8gPiBwb3MuY2gpKSkgewogICAgICBpZiAobWF5Q2xlYXIpIHsKICAgICAgICBzaWduYWwobSwgImJlZm9yZUN1cnNvckVudGVyIikKICAgICAgICBpZiAobS5leHBsaWNpdGx5Q2xlYXJlZCkgewogICAgICAgICAgaWYgKCFsaW5lLm1hcmtlZFNwYW5zKSBicmVhawogICAgICAgICAgZWxzZSB7LS1pOyBjb250aW51ZX0KICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKCFtLmF0b21pYykgY29udGludWUKCiAgICAgIGlmIChvbGRQb3MpIHsKICAgICAgICBsZXQgbmVhciA9IG0uZmluZChkaXIgPCAwID8gMSA6IC0xKSwgZGlmZgogICAgICAgIGlmIChkaXIgPCAwID8gbS5pbmNsdXNpdmVSaWdodCA6IG0uaW5jbHVzaXZlTGVmdCkKICAgICAgICAgIG5lYXIgPSBtb3ZlUG9zKGRvYywgbmVhciwgLWRpciwgbmVhciAmJiBuZWFyLmxpbmUgPT0gcG9zLmxpbmUgPyBsaW5lIDogbnVsbCkKICAgICAgICBpZiAobmVhciAmJiBuZWFyLmxpbmUgPT0gcG9zLmxpbmUgJiYgKGRpZmYgPSBjbXAobmVhciwgb2xkUG9zKSkgJiYgKGRpciA8IDAgPyBkaWZmIDwgMCA6IGRpZmYgPiAwKSkKICAgICAgICAgIHJldHVybiBza2lwQXRvbWljSW5uZXIoZG9jLCBuZWFyLCBwb3MsIGRpciwgbWF5Q2xlYXIpCiAgICAgIH0KCiAgICAgIGxldCBmYXIgPSBtLmZpbmQoZGlyIDwgMCA/IC0xIDogMSkKICAgICAgaWYgKGRpciA8IDAgPyBtLmluY2x1c2l2ZUxlZnQgOiBtLmluY2x1c2l2ZVJpZ2h0KQogICAgICAgIGZhciA9IG1vdmVQb3MoZG9jLCBmYXIsIGRpciwgZmFyLmxpbmUgPT0gcG9zLmxpbmUgPyBsaW5lIDogbnVsbCkKICAgICAgcmV0dXJuIGZhciA/IHNraXBBdG9taWNJbm5lcihkb2MsIGZhciwgcG9zLCBkaXIsIG1heUNsZWFyKSA6IG51bGwKICAgIH0KICB9CiAgcmV0dXJuIHBvcwp9CgovLyBFbnN1cmUgYSBnaXZlbiBwb3NpdGlvbiBpcyBub3QgaW5zaWRlIGFuIGF0b21pYyByYW5nZS4KZXhwb3J0IGZ1bmN0aW9uIHNraXBBdG9taWMoZG9jLCBwb3MsIG9sZFBvcywgYmlhcywgbWF5Q2xlYXIpIHsKICBsZXQgZGlyID0gYmlhcyB8fCAxCiAgbGV0IGZvdW5kID0gc2tpcEF0b21pY0lubmVyKGRvYywgcG9zLCBvbGRQb3MsIGRpciwgbWF5Q2xlYXIpIHx8CiAgICAgICghbWF5Q2xlYXIgJiYgc2tpcEF0b21pY0lubmVyKGRvYywgcG9zLCBvbGRQb3MsIGRpciwgdHJ1ZSkpIHx8CiAgICAgIHNraXBBdG9taWNJbm5lcihkb2MsIHBvcywgb2xkUG9zLCAtZGlyLCBtYXlDbGVhcikgfHwKICAgICAgKCFtYXlDbGVhciAmJiBza2lwQXRvbWljSW5uZXIoZG9jLCBwb3MsIG9sZFBvcywgLWRpciwgdHJ1ZSkpCiAgaWYgKCFmb3VuZCkgewogICAgZG9jLmNhbnRFZGl0ID0gdHJ1ZQogICAgcmV0dXJuIFBvcyhkb2MuZmlyc3QsIDApCiAgfQogIHJldHVybiBmb3VuZAp9CgpmdW5jdGlvbiBtb3ZlUG9zKGRvYywgcG9zLCBkaXIsIGxpbmUpIHsKICBpZiAoZGlyIDwgMCAmJiBwb3MuY2ggPT0gMCkgewogICAgaWYgKHBvcy5saW5lID4gZG9jLmZpcnN0KSByZXR1cm4gY2xpcFBvcyhkb2MsIFBvcyhwb3MubGluZSAtIDEpKQogICAgZWxzZSByZXR1cm4gbnVsbAogIH0gZWxzZSBpZiAoZGlyID4gMCAmJiBwb3MuY2ggPT0gKGxpbmUgfHwgZ2V0TGluZShkb2MsIHBvcy5saW5lKSkudGV4dC5sZW5ndGgpIHsKICAgIGlmIChwb3MubGluZSA8IGRvYy5maXJzdCArIGRvYy5zaXplIC0gMSkgcmV0dXJuIFBvcyhwb3MubGluZSArIDEsIDApCiAgICBlbHNlIHJldHVybiBudWxsCiAgfSBlbHNlIHsKICAgIHJldHVybiBuZXcgUG9zKHBvcy5saW5lLCBwb3MuY2ggKyBkaXIpCiAgfQp9CgpleHBvcnQgZnVuY3Rpb24gc2VsZWN0QWxsKGNtKSB7CiAgY20uc2V0U2VsZWN0aW9uKFBvcyhjbS5maXJzdExpbmUoKSwgMCksIFBvcyhjbS5sYXN0TGluZSgpKSwgc2VsX2RvbnRTY3JvbGwpCn0K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/src/modes.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aW1wb3J0IHsgY29weU9iaiwgY3JlYXRlT2JqIH0gZnJvbSAiLi91dGlsL21pc2MiCgovLyBLbm93biBtb2RlcywgYnkgbmFtZSBhbmQgYnkgTUlNRQpleHBvcnQgbGV0IG1vZGVzID0ge30sIG1pbWVNb2RlcyA9IHt9CgovLyBFeHRyYSBhcmd1bWVudHMgYXJlIHN0b3JlZCBhcyB0aGUgbW9kZSdzIGRlcGVuZGVuY2llcywgd2hpY2ggaXMKLy8gdXNlZCBieSAobGVnYWN5KSBtZWNoYW5pc21zIGxpa2UgbG9hZG1vZGUuanMgdG8gYXV0b21hdGljYWxseQovLyBsb2FkIGEgbW9kZS4gKFByZWZlcnJlZCBtZWNoYW5pc20gaXMgdGhlIHJlcXVpcmUvZGVmaW5lIGNhbGxzLikKZXhwb3J0IGZ1bmN0aW9uIGRlZmluZU1vZGUobmFtZSwgbW9kZSkgewogIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMikKICAgIG1vZGUuZGVwZW5kZW5jaWVzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAyKQogIG1vZGVzW25hbWVdID0gbW9kZQp9CgpleHBvcnQgZnVuY3Rpb24gZGVmaW5lTUlNRShtaW1lLCBzcGVjKSB7CiAgbWltZU1vZGVzW21pbWVdID0gc3BlYwp9CgovLyBHaXZlbiBhIE1JTUUgdHlwZSwgYSB7bmFtZSwgLi4ub3B0aW9uc30gY29uZmlnIG9iamVjdCwgb3IgYSBuYW1lCi8vIHN0cmluZywgcmV0dXJuIGEgbW9kZSBjb25maWcgb2JqZWN0LgpleHBvcnQgZnVuY3Rpb24gcmVzb2x2ZU1vZGUoc3BlYykgewogIGlmICh0eXBlb2Ygc3BlYyA9PSAic3RyaW5nIiAmJiBtaW1lTW9kZXMuaGFzT3duUHJvcGVydHkoc3BlYykpIHsKICAgIHNwZWMgPSBtaW1lTW9kZXNbc3BlY10KICB9IGVsc2UgaWYgKHNwZWMgJiYgdHlwZW9mIHNwZWMubmFtZSA9PSAic3RyaW5nIiAmJiBtaW1lTW9kZXMuaGFzT3duUHJvcGVydHkoc3BlYy5uYW1lKSkgewogICAgbGV0IGZvdW5kID0gbWltZU1vZGVzW3NwZWMubmFtZV0KICAgIGlmICh0eXBlb2YgZm91bmQgPT0gInN0cmluZyIpIGZvdW5kID0ge25hbWU6IGZvdW5kfQogICAgc3BlYyA9IGNyZWF0ZU9iaihmb3VuZCwgc3BlYykKICAgIHNwZWMubmFtZSA9IGZvdW5kLm5hbWUKICB9IGVsc2UgaWYgKHR5cGVvZiBzcGVjID09ICJzdHJpbmciICYmIC9eW1x3XC1dK1wvW1x3XC1dK1wreG1sJC8udGVzdChzcGVjKSkgewogICAgcmV0dXJuIHJlc29sdmVNb2RlKCJhcHBsaWNhdGlvbi94bWwiKQogIH0gZWxzZSBpZiAodHlwZW9mIHNwZWMgPT0gInN0cmluZyIgJiYgL15bXHdcLV0rXC9bXHdcLV0rXCtqc29uJC8udGVzdChzcGVjKSkgewogICAgcmV0dXJuIHJlc29sdmVNb2RlKCJhcHBsaWNhdGlvbi9qc29uIikKICB9CiAgaWYgKHR5cGVvZiBzcGVjID09ICJzdHJpbmciKSByZXR1cm4ge25hbWU6IHNwZWN9CiAgZWxzZSByZXR1cm4gc3BlYyB8fCB7bmFtZTogIm51bGwifQp9CgovLyBHaXZlbiBhIG1vZGUgc3BlYyAoYW55dGhpbmcgdGhhdCByZXNvbHZlTW9kZSBhY2NlcHRzKSwgZmluZCBhbmQKLy8gaW5pdGlhbGl6ZSBhbiBhY3R1YWwgbW9kZSBvYmplY3QuCmV4cG9ydCBmdW5jdGlvbiBnZXRNb2RlKG9wdGlvbnMsIHNwZWMpIHsKICBzcGVjID0gcmVzb2x2ZU1vZGUoc3BlYykKICBsZXQgbWZhY3RvcnkgPSBtb2Rlc1tzcGVjLm5hbWVdCiAgaWYgKCFtZmFjdG9yeSkgcmV0dXJuIGdldE1vZGUob3B0aW9ucywgInRleHQvcGxhaW4iKQogIGxldCBtb2RlT2JqID0gbWZhY3Rvcnkob3B0aW9ucywgc3BlYykKICBpZiAobW9kZUV4dGVuc2lvbnMuaGFzT3duUHJvcGVydHkoc3BlYy5uYW1lKSkgewogICAgbGV0IGV4dHMgPSBtb2RlRXh0ZW5zaW9uc1tzcGVjLm5hbWVdCiAgICBmb3IgKGxldCBwcm9wIGluIGV4dHMpIHsKICAgICAgaWYgKCFleHRzLmhhc093blByb3BlcnR5KHByb3ApKSBjb250aW51ZQogICAgICBpZiAobW9kZU9iai5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgbW9kZU9ialsiXyIgKyBwcm9wXSA9IG1vZGVPYmpbcHJvcF0KICAgICAgbW9kZU9ialtwcm9wXSA9IGV4dHNbcHJvcF0KICAgIH0KICB9CiAgbW9kZU9iai5uYW1lID0gc3BlYy5uYW1lCiAgaWYgKHNwZWMuaGVscGVyVHlwZSkgbW9kZU9iai5oZWxwZXJUeXBlID0gc3BlYy5oZWxwZXJUeXBlCiAgaWYgKHNwZWMubW9kZVByb3BzKSBmb3IgKGxldCBwcm9wIGluIHNwZWMubW9kZVByb3BzKQogICAgbW9kZU9ialtwcm9wXSA9IHNwZWMubW9kZVByb3BzW3Byb3BdCgogIHJldHVybiBtb2RlT2JqCn0KCi8vIFRoaXMgY2FuIGJlIHVzZWQgdG8gYXR0YWNoIHByb3BlcnRpZXMgdG8gbW9kZSBvYmplY3RzIGZyb20KLy8gb3V0c2lkZSB0aGUgYWN0dWFsIG1vZGUgZGVmaW5pdGlvbi4KZXhwb3J0IGxldCBtb2RlRXh0ZW5zaW9ucyA9IHt9CmV4cG9ydCBmdW5jdGlvbiBleHRlbmRNb2RlKG1vZGUsIHByb3BlcnRpZXMpIHsKICBsZXQgZXh0cyA9IG1vZGVFeHRlbnNpb25zLmhhc093blByb3BlcnR5KG1vZGUpID8gbW9kZUV4dGVuc2lvbnNbbW9kZV0gOiAobW9kZUV4dGVuc2lvbnNbbW9kZV0gPSB7fSkKICBjb3B5T2JqKHByb3BlcnRpZXMsIGV4dHMpCn0KCmV4cG9ydCBmdW5jdGlvbiBjb3B5U3RhdGUobW9kZSwgc3RhdGUpIHsKICBpZiAoc3RhdGUgPT09IHRydWUpIHJldHVybiBzdGF0ZQogIGlmIChtb2RlLmNvcHlTdGF0ZSkgcmV0dXJuIG1vZGUuY29weVN0YXRlKHN0YXRlKQogIGxldCBuc3RhdGUgPSB7fQogIGZvciAobGV0IG4gaW4gc3RhdGUpIHsKICAgIGxldCB2YWwgPSBzdGF0ZVtuXQogICAgaWYgKHZhbCBpbnN0YW5jZW9mIEFycmF5KSB2YWwgPSB2YWwuY29uY2F0KFtdKQogICAgbnN0YXRlW25dID0gdmFsCiAgfQogIHJldHVybiBuc3RhdGUKfQoKLy8gR2l2ZW4gYSBtb2RlIGFuZCBhIHN0YXRlIChmb3IgdGhhdCBtb2RlKSwgZmluZCB0aGUgaW5uZXIgbW9kZSBhbmQKLy8gc3RhdGUgYXQgdGhlIHBvc2l0aW9uIHRoYXQgdGhlIHN0YXRlIHJlZmVycyB0by4KZXhwb3J0IGZ1bmN0aW9uIGlubmVyTW9kZShtb2RlLCBzdGF0ZSkgewogIGxldCBpbmZvCiAgd2hpbGUgKG1vZGUuaW5uZXJNb2RlKSB7CiAgICBpbmZvID0gbW9kZS5pbm5lck1vZGUoc3RhdGUpCiAgICBpZiAoIWluZm8gfHwgaW5mby5tb2RlID09IG1vZGUpIGJyZWFrCiAgICBzdGF0ZSA9IGluZm8uc3RhdGUKICAgIG1vZGUgPSBpbmZvLm1vZGUKICB9CiAgcmV0dXJuIGluZm8gfHwge21vZGU6IG1vZGUsIHN0YXRlOiBzdGF0ZX0KfQoKZXhwb3J0IGZ1bmN0aW9uIHN0YXJ0U3RhdGUobW9kZSwgYTEsIGEyKSB7CiAgcmV0dXJuIG1vZGUuc3RhcnRTdGF0ZSA/IG1vZGUuc3RhcnRTdGF0ZShhMSwgYTIpIDogdHJ1ZQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/src/util/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/src/util/bidi.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aW1wb3J0IHsgaXNFeHRlbmRpbmdDaGFyLCBsc3QgfSBmcm9tICIuL21pc2MiCgovLyBCSURJIEhFTFBFUlMKCmV4cG9ydCBmdW5jdGlvbiBpdGVyYXRlQmlkaVNlY3Rpb25zKG9yZGVyLCBmcm9tLCB0bywgZikgewogIGlmICghb3JkZXIpIHJldHVybiBmKGZyb20sIHRvLCAibHRyIikKICBsZXQgZm91bmQgPSBmYWxzZQogIGZvciAobGV0IGkgPSAwOyBpIDwgb3JkZXIubGVuZ3RoOyArK2kpIHsKICAgIGxldCBwYXJ0ID0gb3JkZXJbaV0KICAgIGlmIChwYXJ0LmZyb20gPCB0byAmJiBwYXJ0LnRvID4gZnJvbSB8fCBmcm9tID09IHRvICYmIHBhcnQudG8gPT0gZnJvbSkgewogICAgICBmKE1hdGgubWF4KHBhcnQuZnJvbSwgZnJvbSksIE1hdGgubWluKHBhcnQudG8sIHRvKSwgcGFydC5sZXZlbCA9PSAxID8gInJ0bCIgOiAibHRyIikKICAgICAgZm91bmQgPSB0cnVlCiAgICB9CiAgfQogIGlmICghZm91bmQpIGYoZnJvbSwgdG8sICJsdHIiKQp9CgpleHBvcnQgZnVuY3Rpb24gYmlkaUxlZnQocGFydCkgeyByZXR1cm4gcGFydC5sZXZlbCAlIDIgPyBwYXJ0LnRvIDogcGFydC5mcm9tIH0KZXhwb3J0IGZ1bmN0aW9uIGJpZGlSaWdodChwYXJ0KSB7IHJldHVybiBwYXJ0LmxldmVsICUgMiA/IHBhcnQuZnJvbSA6IHBhcnQudG8gfQoKZXhwb3J0IGZ1bmN0aW9uIGxpbmVMZWZ0KGxpbmUpIHsgbGV0IG9yZGVyID0gZ2V0T3JkZXIobGluZSk7IHJldHVybiBvcmRlciA/IGJpZGlMZWZ0KG9yZGVyWzBdKSA6IDAgfQpleHBvcnQgZnVuY3Rpb24gbGluZVJpZ2h0KGxpbmUpIHsKICBsZXQgb3JkZXIgPSBnZXRPcmRlcihsaW5lKQogIGlmICghb3JkZXIpIHJldHVybiBsaW5lLnRleHQubGVuZ3RoCiAgcmV0dXJuIGJpZGlSaWdodChsc3Qob3JkZXIpKQp9CgpmdW5jdGlvbiBjb21wYXJlQmlkaUxldmVsKG9yZGVyLCBhLCBiKSB7CiAgbGV0IGxpbmVkaXIgPSBvcmRlclswXS5sZXZlbAogIGlmIChhID09IGxpbmVkaXIpIHJldHVybiB0cnVlCiAgaWYgKGIgPT0gbGluZWRpcikgcmV0dXJuIGZhbHNlCiAgcmV0dXJuIGEgPCBiCn0KCmV4cG9ydCBsZXQgYmlkaU90aGVyID0gbnVsbApleHBvcnQgZnVuY3Rpb24gZ2V0QmlkaVBhcnRBdChvcmRlciwgcG9zKSB7CiAgbGV0IGZvdW5kCiAgYmlkaU90aGVyID0gbnVsbAogIGZvciAobGV0IGkgPSAwOyBpIDwgb3JkZXIubGVuZ3RoOyArK2kpIHsKICAgIGxldCBjdXIgPSBvcmRlcltpXQogICAgaWYgKGN1ci5mcm9tIDwgcG9zICYmIGN1ci50byA+IHBvcykgcmV0dXJuIGkKICAgIGlmICgoY3VyLmZyb20gPT0gcG9zIHx8IGN1ci50byA9PSBwb3MpKSB7CiAgICAgIGlmIChmb3VuZCA9PSBudWxsKSB7CiAgICAgICAgZm91bmQgPSBpCiAgICAgIH0gZWxzZSBpZiAoY29tcGFyZUJpZGlMZXZlbChvcmRlciwgY3VyLmxldmVsLCBvcmRlcltmb3VuZF0ubGV2ZWwpKSB7CiAgICAgICAgaWYgKGN1ci5mcm9tICE9IGN1ci50bykgYmlkaU90aGVyID0gZm91bmQKICAgICAgICByZXR1cm4gaQogICAgICB9IGVsc2UgewogICAgICAgIGlmIChjdXIuZnJvbSAhPSBjdXIudG8pIGJpZGlPdGhlciA9IGkKICAgICAgICByZXR1cm4gZm91bmQKICAgICAgfQogICAgfQogIH0KICByZXR1cm4gZm91bmQKfQoKZnVuY3Rpb24gbW92ZUluTGluZShsaW5lLCBwb3MsIGRpciwgYnlVbml0KSB7CiAgaWYgKCFieVVuaXQpIHJldHVybiBwb3MgKyBkaXIKICBkbyBwb3MgKz0gZGlyCiAgd2hpbGUgKHBvcyA+IDAgJiYgaXNFeHRlbmRpbmdDaGFyKGxpbmUudGV4dC5jaGFyQXQocG9zKSkpCiAgcmV0dXJuIHBvcwp9CgovLyBUaGlzIGlzIG5lZWRlZCBpbiBvcmRlciB0byBtb3ZlICd2aXN1YWxseScgdGhyb3VnaCBiaS1kaXJlY3Rpb25hbAovLyB0ZXh0IC0tIGkuZS4sIHByZXNzaW5nIGxlZnQgc2hvdWxkIG1ha2UgdGhlIGN1cnNvciBnbyBsZWZ0LCBldmVuCi8vIHdoZW4gaW4gUlRMIHRleHQuIFRoZSB0cmlja3kgcGFydCBpcyB0aGUgJ2p1bXBzJywgd2hlcmUgUlRMIGFuZAovLyBMVFIgdGV4dCB0b3VjaCBlYWNoIG90aGVyLiBUaGlzIG9mdGVuIHJlcXVpcmVzIHRoZSBjdXJzb3Igb2Zmc2V0Ci8vIHRvIG1vdmUgbW9yZSB0aGFuIG9uZSB1bml0LCBpbiBvcmRlciB0byB2aXN1YWxseSBtb3ZlIG9uZSB1bml0LgpleHBvcnQgZnVuY3Rpb24gbW92ZVZpc3VhbGx5KGxpbmUsIHN0YXJ0LCBkaXIsIGJ5VW5pdCkgewogIGxldCBiaWRpID0gZ2V0T3JkZXIobGluZSkKICBpZiAoIWJpZGkpIHJldHVybiBtb3ZlTG9naWNhbGx5KGxpbmUsIHN0YXJ0LCBkaXIsIGJ5VW5pdCkKICBsZXQgcG9zID0gZ2V0QmlkaVBhcnRBdChiaWRpLCBzdGFydCksIHBhcnQgPSBiaWRpW3Bvc10KICBsZXQgdGFyZ2V0ID0gbW92ZUluTGluZShsaW5lLCBzdGFydCwgcGFydC5sZXZlbCAlIDIgPyAtZGlyIDogZGlyLCBieVVuaXQpCgogIGZvciAoOzspIHsKICAgIGlmICh0YXJnZXQgPiBwYXJ0LmZyb20gJiYgdGFyZ2V0IDwgcGFydC50bykgcmV0dXJuIHRhcmdldAogICAgaWYgKHRhcmdldCA9PSBwYXJ0LmZyb20gfHwgdGFyZ2V0ID09IHBhcnQudG8pIHsKICAgICAgaWYgKGdldEJpZGlQYXJ0QXQoYmlkaSwgdGFyZ2V0KSA9PSBwb3MpIHJldHVybiB0YXJnZXQKICAgICAgcGFydCA9IGJpZGlbcG9zICs9IGRpcl0KICAgICAgcmV0dXJuIChkaXIgPiAwKSA9PSBwYXJ0LmxldmVsICUgMiA/IHBhcnQudG8gOiBwYXJ0LmZyb20KICAgIH0gZWxzZSB7CiAgICAgIHBhcnQgPSBiaWRpW3BvcyArPSBkaXJdCiAgICAgIGlmICghcGFydCkgcmV0dXJuIG51bGwKICAgICAgaWYgKChkaXIgPiAwKSA9PSBwYXJ0LmxldmVsICUgMikKICAgICAgICB0YXJnZXQgPSBtb3ZlSW5MaW5lKGxpbmUsIHBhcnQudG8sIC0xLCBieVVuaXQpCiAgICAgIGVsc2UKICAgICAgICB0YXJnZXQgPSBtb3ZlSW5MaW5lKGxpbmUsIHBhcnQuZnJvbSwgMSwgYnlVbml0KQogICAgfQogIH0KfQoKZXhwb3J0IGZ1bmN0aW9uIG1vdmVMb2dpY2FsbHkobGluZSwgc3RhcnQsIGRpciwgYnlVbml0KSB7CiAgbGV0IHRhcmdldCA9IHN0YXJ0ICsgZGlyCiAgaWYgKGJ5VW5pdCkgd2hpbGUgKHRhcmdldCA+IDAgJiYgaXNFeHRlbmRpbmdDaGFyKGxpbmUudGV4dC5jaGFyQXQodGFyZ2V0KSkpIHRhcmdldCArPSBkaXIKICByZXR1cm4gdGFyZ2V0IDwgMCB8fCB0YXJnZXQgPiBsaW5lLnRleHQubGVuZ3RoID8gbnVsbCA6IHRhcmdldAp9CgovLyBCaWRpcmVjdGlvbmFsIG9yZGVyaW5nIGFsZ29yaXRobQovLyBTZWUgaHR0cDovL3VuaWNvZGUub3JnL3JlcG9ydHMvdHI5L3RyOS0xMy5odG1sIGZvciB0aGUgYWxnb3JpdGhtCi8vIHRoYXQgdGhpcyAocGFydGlhbGx5KSBpbXBsZW1lbnRzLgoKLy8gT25lLWNoYXIgY29kZXMgdXNlZCBmb3IgY2hhcmFjdGVyIHR5cGVzOgovLyBMIChMKTogICBMZWZ0LXRvLVJpZ2h0Ci8vIFIgKFIpOiAgIFJpZ2h0LXRvLUxlZnQKLy8gciAoQUwpOiAgUmlnaHQtdG8tTGVmdCBBcmFiaWMKLy8gMSAoRU4pOiAgRXVyb3BlYW4gTnVtYmVyCi8vICsgKEVTKTogIEV1cm9wZWFuIE51bWJlciBTZXBhcmF0b3IKLy8gJSAoRVQpOiAgRXVyb3BlYW4gTnVtYmVyIFRlcm1pbmF0b3IKLy8gbiAoQU4pOiAgQXJhYmljIE51bWJlcgovLyAsIChDUyk6ICBDb21tb24gTnVtYmVyIFNlcGFyYXRvcgovLyBtIChOU00pOiBOb24tU3BhY2luZyBNYXJrCi8vIGIgKEJOKTogIEJvdW5kYXJ5IE5ldXRyYWwKLy8gcyAoQik6ICAgUGFyYWdyYXBoIFNlcGFyYXRvcgovLyB0IChTKTogICBTZWdtZW50IFNlcGFyYXRvcgovLyB3IChXUyk6ICBXaGl0ZXNwYWNlCi8vIE4gKE9OKTogIE90aGVyIE5ldXRyYWxzCgovLyBSZXR1cm5zIG51bGwgaWYgY2hhcmFjdGVycyBhcmUgb3JkZXJlZCBhcyB0aGV5IGFwcGVhcgovLyAobGVmdC10by1yaWdodCksIG9yIGFuIGFycmF5IG9mIHNlY3Rpb25zICh7ZnJvbSwgdG8sIGxldmVsfQovLyBvYmplY3RzKSBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSBvY2N1ciB2aXN1YWxseS4KZXhwb3J0IGxldCBiaWRpT3JkZXJpbmcgPSAoZnVuY3Rpb24oKSB7CiAgLy8gQ2hhcmFjdGVyIHR5cGVzIGZvciBjb2RlcG9pbnRzIDAgdG8gMHhmZgogIGxldCBsb3dUeXBlcyA9ICJiYmJiYmJiYmJ0c3R3c2JiYmJiYmJiYmJiYmJic3NzdHdOTiUlJU5OTk5OTixOLE4xMTExMTExMTExTk5OTk5OTkxMTExMTExMTExMTExMTExMTExMTExMTExMTk5OTk5OTExMTExMTExMTExMTExMTExMTExMTExMTExOTk5OYmJiYmJic2JiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiLE4lJSUlTk5OTkxOTk5OTiUlMTFOTE5OTjFMTk5OTk5MTExMTExMTExMTExMTExMTExMTExMTE5MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTiIKICAvLyBDaGFyYWN0ZXIgdHlwZXMgZm9yIGNvZGVwb2ludHMgMHg2MDAgdG8gMHg2ZmYKICBsZXQgYXJhYmljVHlwZXMgPSAicnJycnJycnJycnJyLHJOTm1tbW1tbXJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJybW1tbW1tbW1tbW1tbW1ycnJycnJybm5ubm5ubm5ubiVubnJycm1ycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycnJycm1tbW1tbW1tbW1tbW1tbW1tbW1ObW1tbSIKICBmdW5jdGlvbiBjaGFyVHlwZShjb2RlKSB7CiAgICBpZiAoY29kZSA8PSAweGY3KSByZXR1cm4gbG93VHlwZXMuY2hhckF0KGNvZGUpCiAgICBlbHNlIGlmICgweDU5MCA8PSBjb2RlICYmIGNvZGUgPD0gMHg1ZjQpIHJldHVybiAiUiIKICAgIGVsc2UgaWYgKDB4NjAwIDw9IGNvZGUgJiYgY29kZSA8PSAweDZlZCkgcmV0dXJuIGFyYWJpY1R5cGVzLmNoYXJBdChjb2RlIC0gMHg2MDApCiAgICBlbHNlIGlmICgweDZlZSA8PSBjb2RlICYmIGNvZGUgPD0gMHg4YWMpIHJldHVybiAiciIKICAgIGVsc2UgaWYgKDB4MjAwMCA8PSBjb2RlICYmIGNvZGUgPD0gMHgyMDBiKSByZXR1cm4gInciCiAgICBlbHNlIGlmIChjb2RlID09IDB4MjAwYykgcmV0dXJuICJiIgogICAgZWxzZSByZXR1cm4gIkwiCiAgfQoKICBsZXQgYmlkaVJFID0gL1tcdTA1OTAtXHUwNWY0XHUwNjAwLVx1MDZmZlx1MDcwMC1cdTA4YWNdLwogIGxldCBpc05ldXRyYWwgPSAvW3N0d05dLywgaXNTdHJvbmcgPSAvW0xScl0vLCBjb3VudHNBc0xlZnQgPSAvW0xiMW5dLywgY291bnRzQXNOdW0gPSAvWzFuXS8KICAvLyBCcm93c2VycyBzZWVtIHRvIGFsd2F5cyB0cmVhdCB0aGUgYm91bmRhcmllcyBvZiBibG9jayBlbGVtZW50cyBhcyBiZWluZyBMLgogIGxldCBvdXRlclR5cGUgPSAiTCIKCiAgZnVuY3Rpb24gQmlkaVNwYW4obGV2ZWwsIGZyb20sIHRvKSB7CiAgICB0aGlzLmxldmVsID0gbGV2ZWwKICAgIHRoaXMuZnJvbSA9IGZyb207IHRoaXMudG8gPSB0bwogIH0KCiAgcmV0dXJuIGZ1bmN0aW9uKHN0cikgewogICAgaWYgKCFiaWRpUkUudGVzdChzdHIpKSByZXR1cm4gZmFsc2UKICAgIGxldCBsZW4gPSBzdHIubGVuZ3RoLCB0eXBlcyA9IFtdCiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgKytpKQogICAgICB0eXBlcy5wdXNoKGNoYXJUeXBlKHN0ci5jaGFyQ29kZUF0KGkpKSkKCiAgICAvLyBXMS4gRXhhbWluZSBlYWNoIG5vbi1zcGFjaW5nIG1hcmsgKE5TTSkgaW4gdGhlIGxldmVsIHJ1biwgYW5kCiAgICAvLyBjaGFuZ2UgdGhlIHR5cGUgb2YgdGhlIE5TTSB0byB0aGUgdHlwZSBvZiB0aGUgcHJldmlvdXMKICAgIC8vIGNoYXJhY3Rlci4gSWYgdGhlIE5TTSBpcyBhdCB0aGUgc3RhcnQgb2YgdGhlIGxldmVsIHJ1biwgaXQgd2lsbAogICAgLy8gZ2V0IHRoZSB0eXBlIG9mIHNvci4KICAgIGZvciAobGV0IGkgPSAwLCBwcmV2ID0gb3V0ZXJUeXBlOyBpIDwgbGVuOyArK2kpIHsKICAgICAgbGV0IHR5cGUgPSB0eXBlc1tpXQogICAgICBpZiAodHlwZSA9PSAibSIpIHR5cGVzW2ldID0gcHJldgogICAgICBlbHNlIHByZXYgPSB0eXBlCiAgICB9CgogICAgLy8gVzIuIFNlYXJjaCBiYWNrd2FyZHMgZnJvbSBlYWNoIGluc3RhbmNlIG9mIGEgRXVyb3BlYW4gbnVtYmVyCiAgICAvLyB1bnRpbCB0aGUgZmlyc3Qgc3Ryb25nIHR5cGUgKFIsIEwsIEFMLCBvciBzb3IpIGlzIGZvdW5kLiBJZiBhbgogICAgLy8gQUwgaXMgZm91bmQsIGNoYW5nZSB0aGUgdHlwZSBvZiB0aGUgRXVyb3BlYW4gbnVtYmVyIHRvIEFyYWJpYwogICAgLy8gbnVtYmVyLgogICAgLy8gVzMuIENoYW5nZSBhbGwgQUxzIHRvIFIuCiAgICBmb3IgKGxldCBpID0gMCwgY3VyID0gb3V0ZXJUeXBlOyBpIDwgbGVuOyArK2kpIHsKICAgICAgbGV0IHR5cGUgPSB0eXBlc1tpXQogICAgICBpZiAodHlwZSA9PSAiMSIgJiYgY3VyID09ICJyIikgdHlwZXNbaV0gPSAibiIKICAgICAgZWxzZSBpZiAoaXNTdHJvbmcudGVzdCh0eXBlKSkgeyBjdXIgPSB0eXBlOyBpZiAodHlwZSA9PSAiciIpIHR5cGVzW2ldID0gIlIiIH0KICAgIH0KCiAgICAvLyBXNC4gQSBzaW5nbGUgRXVyb3BlYW4gc2VwYXJhdG9yIGJldHdlZW4gdHdvIEV1cm9wZWFuIG51bWJlcnMKICAgIC8vIGNoYW5nZXMgdG8gYSBFdXJvcGVhbiBudW1iZXIuIEEgc2luZ2xlIGNvbW1vbiBzZXBhcmF0b3IgYmV0d2VlbgogICAgLy8gdHdvIG51bWJlcnMgb2YgdGhlIHNhbWUgdHlwZSBjaGFuZ2VzIHRvIHRoYXQgdHlwZS4KICAgIGZvciAobGV0IGkgPSAxLCBwcmV2ID0gdHlwZXNbMF07IGkgPCBsZW4gLSAxOyArK2kpIHsKICAgICAgbGV0IHR5cGUgPSB0eXBlc1tpXQogICAgICBpZiAodHlwZSA9PSAiKyIgJiYgcHJldiA9PSAiMSIgJiYgdHlwZXNbaSsxXSA9PSAiMSIpIHR5cGVzW2ldID0gIjEiCiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gIiwiICYmIHByZXYgPT0gdHlwZXNbaSsxXSAmJgogICAgICAgICAgICAgICAocHJldiA9PSAiMSIgfHwgcHJldiA9PSAibiIpKSB0eXBlc1tpXSA9IHByZXYKICAgICAgcHJldiA9IHR5cGUKICAgIH0KCiAgICAvLyBXNS4gQSBzZXF1ZW5jZSBvZiBFdXJvcGVhbiB0ZXJtaW5hdG9ycyBhZGphY2VudCB0byBFdXJvcGVhbgogICAgLy8gbnVtYmVycyBjaGFuZ2VzIHRvIGFsbCBFdXJvcGVhbiBudW1iZXJzLgogICAgLy8gVzYuIE90aGVyd2lzZSwgc2VwYXJhdG9ycyBhbmQgdGVybWluYXRvcnMgY2hhbmdlIHRvIE90aGVyCiAgICAvLyBOZXV0cmFsLgogICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47ICsraSkgewogICAgICBsZXQgdHlwZSA9IHR5cGVzW2ldCiAgICAgIGlmICh0eXBlID09ICIsIikgdHlwZXNbaV0gPSAiTiIKICAgICAgZWxzZSBpZiAodHlwZSA9PSAiJSIpIHsKICAgICAgICBsZXQgZW5kCiAgICAgICAgZm9yIChlbmQgPSBpICsgMTsgZW5kIDwgbGVuICYmIHR5cGVzW2VuZF0gPT0gIiUiOyArK2VuZCkge30KICAgICAgICBsZXQgcmVwbGFjZSA9IChpICYmIHR5cGVzW2ktMV0gPT0gIiEiKSB8fCAoZW5kIDwgbGVuICYmIHR5cGVzW2VuZF0gPT0gIjEiKSA/ICIxIiA6ICJOIgogICAgICAgIGZvciAobGV0IGogPSBpOyBqIDwgZW5kOyArK2opIHR5cGVzW2pdID0gcmVwbGFjZQogICAgICAgIGkgPSBlbmQgLSAxCiAgICAgIH0KICAgIH0KCiAgICAvLyBXNy4gU2VhcmNoIGJhY2t3YXJkcyBmcm9tIGVhY2ggaW5zdGFuY2Ugb2YgYSBFdXJvcGVhbiBudW1iZXIKICAgIC8vIHVudGlsIHRoZSBmaXJzdCBzdHJvbmcgdHlwZSAoUiwgTCwgb3Igc29yKSBpcyBmb3VuZC4gSWYgYW4gTCBpcwogICAgLy8gZm91bmQsIHRoZW4gY2hhbmdlIHRoZSB0eXBlIG9mIHRoZSBFdXJvcGVhbiBudW1iZXIgdG8gTC4KICAgIGZvciAobGV0IGkgPSAwLCBjdXIgPSBvdXRlclR5cGU7IGkgPCBsZW47ICsraSkgewogICAgICBsZXQgdHlwZSA9IHR5cGVzW2ldCiAgICAgIGlmIChjdXIgPT0gIkwiICYmIHR5cGUgPT0gIjEiKSB0eXBlc1tpXSA9ICJMIgogICAgICBlbHNlIGlmIChpc1N0cm9uZy50ZXN0KHR5cGUpKSBjdXIgPSB0eXBlCiAgICB9CgogICAgLy8gTjEuIEEgc2VxdWVuY2Ugb2YgbmV1dHJhbHMgdGFrZXMgdGhlIGRpcmVjdGlvbiBvZiB0aGUKICAgIC8vIHN1cnJvdW5kaW5nIHN0cm9uZyB0ZXh0IGlmIHRoZSB0ZXh0IG9uIGJvdGggc2lkZXMgaGFzIHRoZSBzYW1lCiAgICAvLyBkaXJlY3Rpb24uIEV1cm9wZWFuIGFuZCBBcmFiaWMgbnVtYmVycyBhY3QgYXMgaWYgdGhleSB3ZXJlIFIgaW4KICAgIC8vIHRlcm1zIG9mIHRoZWlyIGluZmx1ZW5jZSBvbiBuZXV0cmFscy4gU3RhcnQtb2YtbGV2ZWwtcnVuIChzb3IpCiAgICAvLyBhbmQgZW5kLW9mLWxldmVsLXJ1biAoZW9yKSBhcmUgdXNlZCBhdCBsZXZlbCBydW4gYm91bmRhcmllcy4KICAgIC8vIE4yLiBBbnkgcmVtYWluaW5nIG5ldXRyYWxzIHRha2UgdGhlIGVtYmVkZGluZyBkaXJlY3Rpb24uCiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgKytpKSB7CiAgICAgIGlmIChpc05ldXRyYWwudGVzdCh0eXBlc1tpXSkpIHsKICAgICAgICBsZXQgZW5kCiAgICAgICAgZm9yIChlbmQgPSBpICsgMTsgZW5kIDwgbGVuICYmIGlzTmV1dHJhbC50ZXN0KHR5cGVzW2VuZF0pOyArK2VuZCkge30KICAgICAgICBsZXQgYmVmb3JlID0gKGkgPyB0eXBlc1tpLTFdIDogb3V0ZXJUeXBlKSA9PSAiTCIKICAgICAgICBsZXQgYWZ0ZXIgPSAoZW5kIDwgbGVuID8gdHlwZXNbZW5kXSA6IG91dGVyVHlwZSkgPT0gIkwiCiAgICAgICAgbGV0IHJlcGxhY2UgPSBiZWZvcmUgfHwgYWZ0ZXIgPyAiTCIgOiAiUiIKICAgICAgICBmb3IgKGxldCBqID0gaTsgaiA8IGVuZDsgKytqKSB0eXBlc1tqXSA9IHJlcGxhY2UKICAgICAgICBpID0gZW5kIC0gMQogICAgICB9CiAgICB9CgogICAgLy8gSGVyZSB3ZSBkZXBhcnQgZnJvbSB0aGUgZG9jdW1lbnRlZCBhbGdvcml0aG0sIGluIG9yZGVyIHRvIGF2b2lkCiAgICAvLyBidWlsZGluZyB1cCBhbiBhY3R1YWwgbGV2ZWxzIGFycmF5LiBTaW5jZSB0aGVyZSBhcmUgb25seSB0aHJlZQogICAgLy8gbGV2ZWxzICgwLCAxLCAyKSBpbiBhbiBpbXBsZW1lbnRhdGlvbiB0aGF0IGRvZXNuJ3QgdGFrZQogICAgLy8gZXhwbGljaXQgZW1iZWRkaW5nIGludG8gYWNjb3VudCwgd2UgY2FuIGJ1aWxkIHVwIHRoZSBvcmRlciBvbgogICAgLy8gdGhlIGZseSwgd2l0aG91dCBmb2xsb3dpbmcgdGhlIGxldmVsLWJhc2VkIGFsZ29yaXRobS4KICAgIGxldCBvcmRlciA9IFtdLCBtCiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjspIHsKICAgICAgaWYgKGNvdW50c0FzTGVmdC50ZXN0KHR5cGVzW2ldKSkgewogICAgICAgIGxldCBzdGFydCA9IGkKICAgICAgICBmb3IgKCsraTsgaSA8IGxlbiAmJiBjb3VudHNBc0xlZnQudGVzdCh0eXBlc1tpXSk7ICsraSkge30KICAgICAgICBvcmRlci5wdXNoKG5ldyBCaWRpU3BhbigwLCBzdGFydCwgaSkpCiAgICAgIH0gZWxzZSB7CiAgICAgICAgbGV0IHBvcyA9IGksIGF0ID0gb3JkZXIubGVuZ3RoCiAgICAgICAgZm9yICgrK2k7IGkgPCBsZW4gJiYgdHlwZXNbaV0gIT0gIkwiOyArK2kpIHt9CiAgICAgICAgZm9yIChsZXQgaiA9IHBvczsgaiA8IGk7KSB7CiAgICAgICAgICBpZiAoY291bnRzQXNOdW0udGVzdCh0eXBlc1tqXSkpIHsKICAgICAgICAgICAgaWYgKHBvcyA8IGopIG9yZGVyLnNwbGljZShhdCwgMCwgbmV3IEJpZGlTcGFuKDEsIHBvcywgaikpCiAgICAgICAgICAgIGxldCBuc3RhcnQgPSBqCiAgICAgICAgICAgIGZvciAoKytqOyBqIDwgaSAmJiBjb3VudHNBc051bS50ZXN0KHR5cGVzW2pdKTsgKytqKSB7fQogICAgICAgICAgICBvcmRlci5zcGxpY2UoYXQsIDAsIG5ldyBCaWRpU3BhbigyLCBuc3RhcnQsIGopKQogICAgICAgICAgICBwb3MgPSBqCiAgICAgICAgICB9IGVsc2UgKytqCiAgICAgICAgfQogICAgICAgIGlmIChwb3MgPCBpKSBvcmRlci5zcGxpY2UoYXQsIDAsIG5ldyBCaWRpU3BhbigxLCBwb3MsIGkpKQogICAgICB9CiAgICB9CiAgICBpZiAob3JkZXJbMF0ubGV2ZWwgPT0gMSAmJiAobSA9IHN0ci5tYXRjaCgvXlxzKy8pKSkgewogICAgICBvcmRlclswXS5mcm9tID0gbVswXS5sZW5ndGgKICAgICAgb3JkZXIudW5zaGlmdChuZXcgQmlkaVNwYW4oMCwgMCwgbVswXS5sZW5ndGgpKQogICAgfQogICAgaWYgKGxzdChvcmRlcikubGV2ZWwgPT0gMSAmJiAobSA9IHN0ci5tYXRjaCgvXHMrJC8pKSkgewogICAgICBsc3Qob3JkZXIpLnRvIC09IG1bMF0ubGVuZ3RoCiAgICAgIG9yZGVyLnB1c2gobmV3IEJpZGlTcGFuKDAsIGxlbiAtIG1bMF0ubGVuZ3RoLCBsZW4pKQogICAgfQogICAgaWYgKG9yZGVyWzBdLmxldmVsID09IDIpCiAgICAgIG9yZGVyLnVuc2hpZnQobmV3IEJpZGlTcGFuKDEsIG9yZGVyWzBdLnRvLCBvcmRlclswXS50bykpCiAgICBpZiAob3JkZXJbMF0ubGV2ZWwgIT0gbHN0KG9yZGVyKS5sZXZlbCkKICAgICAgb3JkZXIucHVzaChuZXcgQmlkaVNwYW4ob3JkZXJbMF0ubGV2ZWwsIGxlbiwgbGVuKSkKCiAgICByZXR1cm4gb3JkZXIKICB9Cn0pKCkKCi8vIEdldCB0aGUgYmlkaSBvcmRlcmluZyBmb3IgdGhlIGdpdmVuIGxpbmUgKGFuZCBjYWNoZSBpdCkuIFJldHVybnMKLy8gZmFsc2UgZm9yIGxpbmVzIHRoYXQgYXJlIGZ1bGx5IGxlZnQtdG8tcmlnaHQsIGFuZCBhbiBhcnJheSBvZgovLyBCaWRpU3BhbiBvYmplY3RzIG90aGVyd2lzZS4KZXhwb3J0IGZ1bmN0aW9uIGdldE9yZGVyKGxpbmUpIHsKICBsZXQgb3JkZXIgPSBsaW5lLm9yZGVyCiAgaWYgKG9yZGVyID09IG51bGwpIG9yZGVyID0gbGluZS5vcmRlciA9IGJpZGlPcmRlcmluZyhsaW5lLnRleHQpCiAgcmV0dXJuIG9yZGVyCn0K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/src/util/browser.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gS2x1ZGdlcyBmb3IgYnVncyBhbmQgYmVoYXZpb3IgZGlmZmVyZW5jZXMgdGhhdCBjYW4ndCBiZSBmZWF0dXJlCi8vIGRldGVjdGVkIGFyZSBlbmFibGVkIGJhc2VkIG9uIHVzZXJBZ2VudCBldGMgc25pZmZpbmcuCmxldCB1c2VyQWdlbnQgPSBuYXZpZ2F0b3IudXNlckFnZW50CmxldCBwbGF0Zm9ybSA9IG5hdmlnYXRvci5wbGF0Zm9ybQoKZXhwb3J0IGxldCBnZWNrbyA9IC9nZWNrb1wvXGQvaS50ZXN0KHVzZXJBZ2VudCkKbGV0IGllX3VwdG8xMCA9IC9NU0lFIFxkLy50ZXN0KHVzZXJBZ2VudCkKbGV0IGllXzExdXAgPSAvVHJpZGVudFwvKD86WzctOV18XGR7Mix9KVwuLipydjooXGQrKS8uZXhlYyh1c2VyQWdlbnQpCmV4cG9ydCBsZXQgaWUgPSBpZV91cHRvMTAgfHwgaWVfMTF1cApleHBvcnQgbGV0IGllX3ZlcnNpb24gPSBpZSAmJiAoaWVfdXB0bzEwID8gZG9jdW1lbnQuZG9jdW1lbnRNb2RlIHx8IDYgOiBpZV8xMXVwWzFdKQpleHBvcnQgbGV0IHdlYmtpdCA9IC9XZWJLaXRcLy8udGVzdCh1c2VyQWdlbnQpCmxldCBxdHdlYmtpdCA9IHdlYmtpdCAmJiAvUXRcL1xkK1wuXGQrLy50ZXN0KHVzZXJBZ2VudCkKZXhwb3J0IGxldCBjaHJvbWUgPSAvQ2hyb21lXC8vLnRlc3QodXNlckFnZW50KQpleHBvcnQgbGV0IHByZXN0byA9IC9PcGVyYVwvLy50ZXN0KHVzZXJBZ2VudCkKZXhwb3J0IGxldCBzYWZhcmkgPSAvQXBwbGUgQ29tcHV0ZXIvLnRlc3QobmF2aWdhdG9yLnZlbmRvcikKZXhwb3J0IGxldCBtYWNfZ2VNb3VudGFpbkxpb24gPSAvTWFjIE9TIFggMVxkXEQoWzgtOV18XGRcZClcRC8udGVzdCh1c2VyQWdlbnQpCmV4cG9ydCBsZXQgcGhhbnRvbSA9IC9QaGFudG9tSlMvLnRlc3QodXNlckFnZW50KQoKZXhwb3J0IGxldCBpb3MgPSAvQXBwbGVXZWJLaXQvLnRlc3QodXNlckFnZW50KSAmJiAvTW9iaWxlXC9cdysvLnRlc3QodXNlckFnZW50KQovLyBUaGlzIGlzIHdvZWZ1bGx5IGluY29tcGxldGUuIFN1Z2dlc3Rpb25zIGZvciBhbHRlcm5hdGl2ZSBtZXRob2RzIHdlbGNvbWUuCmV4cG9ydCBsZXQgbW9iaWxlID0gaW9zIHx8IC9BbmRyb2lkfHdlYk9TfEJsYWNrQmVycnl8T3BlcmEgTWluaXxPcGVyYSBNb2JpfElFTW9iaWxlL2kudGVzdCh1c2VyQWdlbnQpCmV4cG9ydCBsZXQgbWFjID0gaW9zIHx8IC9NYWMvLnRlc3QocGxhdGZvcm0pCmV4cG9ydCBsZXQgY2hyb21lT1MgPSAvXGJDck9TXGIvLnRlc3QodXNlckFnZW50KQpleHBvcnQgbGV0IHdpbmRvd3MgPSAvd2luL2kudGVzdChwbGF0Zm9ybSkKCmxldCBwcmVzdG9fdmVyc2lvbiA9IHByZXN0byAmJiB1c2VyQWdlbnQubWF0Y2goL1ZlcnNpb25cLyhcZCpcLlxkKikvKQppZiAocHJlc3RvX3ZlcnNpb24pIHByZXN0b192ZXJzaW9uID0gTnVtYmVyKHByZXN0b192ZXJzaW9uWzFdKQppZiAocHJlc3RvX3ZlcnNpb24gJiYgcHJlc3RvX3ZlcnNpb24gPj0gMTUpIHsgcHJlc3RvID0gZmFsc2U7IHdlYmtpdCA9IHRydWUgfQovLyBTb21lIGJyb3dzZXJzIHVzZSB0aGUgd3JvbmcgZXZlbnQgcHJvcGVydGllcyB0byBzaWduYWwgY21kL2N0cmwgb24gT1MgWApleHBvcnQgbGV0IGZsaXBDdHJsQ21kID0gbWFjICYmIChxdHdlYmtpdCB8fCBwcmVzdG8gJiYgKHByZXN0b192ZXJzaW9uID09IG51bGwgfHwgcHJlc3RvX3ZlcnNpb24gPCAxMi4xMSkpCmV4cG9ydCBsZXQgY2FwdHVyZVJpZ2h0Q2xpY2sgPSBnZWNrbyB8fCAoaWUgJiYgaWVfdmVyc2lvbiA+PSA5KQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/src/util/dom.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aW1wb3J0IHsgaWUsIGllX3ZlcnNpb24sIGlvcyB9IGZyb20gIi4vYnJvd3NlciIKCmV4cG9ydCBmdW5jdGlvbiBjbGFzc1Rlc3QoY2xzKSB7IHJldHVybiBuZXcgUmVnRXhwKCIoXnxcXHMpIiArIGNscyArICIoPzokfFxccylcXHMqIikgfQoKZXhwb3J0IGxldCBybUNsYXNzID0gZnVuY3Rpb24obm9kZSwgY2xzKSB7CiAgbGV0IGN1cnJlbnQgPSBub2RlLmNsYXNzTmFtZQogIGxldCBtYXRjaCA9IGNsYXNzVGVzdChjbHMpLmV4ZWMoY3VycmVudCkKICBpZiAobWF0Y2gpIHsKICAgIGxldCBhZnRlciA9IGN1cnJlbnQuc2xpY2UobWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGgpCiAgICBub2RlLmNsYXNzTmFtZSA9IGN1cnJlbnQuc2xpY2UoMCwgbWF0Y2guaW5kZXgpICsgKGFmdGVyID8gbWF0Y2hbMV0gKyBhZnRlciA6ICIiKQogIH0KfQoKZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUNoaWxkcmVuKGUpIHsKICBmb3IgKGxldCBjb3VudCA9IGUuY2hpbGROb2Rlcy5sZW5ndGg7IGNvdW50ID4gMDsgLS1jb3VudCkKICAgIGUucmVtb3ZlQ2hpbGQoZS5maXJzdENoaWxkKQogIHJldHVybiBlCn0KCmV4cG9ydCBmdW5jdGlvbiByZW1vdmVDaGlsZHJlbkFuZEFkZChwYXJlbnQsIGUpIHsKICByZXR1cm4gcmVtb3ZlQ2hpbGRyZW4ocGFyZW50KS5hcHBlbmRDaGlsZChlKQp9CgpleHBvcnQgZnVuY3Rpb24gZWx0KHRhZywgY29udGVudCwgY2xhc3NOYW1lLCBzdHlsZSkgewogIGxldCBlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWcpCiAgaWYgKGNsYXNzTmFtZSkgZS5jbGFzc05hbWUgPSBjbGFzc05hbWUKICBpZiAoc3R5bGUpIGUuc3R5bGUuY3NzVGV4dCA9IHN0eWxlCiAgaWYgKHR5cGVvZiBjb250ZW50ID09ICJzdHJpbmciKSBlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGNvbnRlbnQpKQogIGVsc2UgaWYgKGNvbnRlbnQpIGZvciAobGV0IGkgPSAwOyBpIDwgY29udGVudC5sZW5ndGg7ICsraSkgZS5hcHBlbmRDaGlsZChjb250ZW50W2ldKQogIHJldHVybiBlCn0KCmV4cG9ydCBsZXQgcmFuZ2UKaWYgKGRvY3VtZW50LmNyZWF0ZVJhbmdlKSByYW5nZSA9IGZ1bmN0aW9uKG5vZGUsIHN0YXJ0LCBlbmQsIGVuZE5vZGUpIHsKICBsZXQgciA9IGRvY3VtZW50LmNyZWF0ZVJhbmdlKCkKICByLnNldEVuZChlbmROb2RlIHx8IG5vZGUsIGVuZCkKICByLnNldFN0YXJ0KG5vZGUsIHN0YXJ0KQogIHJldHVybiByCn0KZWxzZSByYW5nZSA9IGZ1bmN0aW9uKG5vZGUsIHN0YXJ0LCBlbmQpIHsKICBsZXQgciA9IGRvY3VtZW50LmJvZHkuY3JlYXRlVGV4dFJhbmdlKCkKICB0cnkgeyByLm1vdmVUb0VsZW1lbnRUZXh0KG5vZGUucGFyZW50Tm9kZSkgfQogIGNhdGNoKGUpIHsgcmV0dXJuIHIgfQogIHIuY29sbGFwc2UodHJ1ZSkKICByLm1vdmVFbmQoImNoYXJhY3RlciIsIGVuZCkKICByLm1vdmVTdGFydCgiY2hhcmFjdGVyIiwgc3RhcnQpCiAgcmV0dXJuIHIKfQoKZXhwb3J0IGZ1bmN0aW9uIGNvbnRhaW5zKHBhcmVudCwgY2hpbGQpIHsKICBpZiAoY2hpbGQubm9kZVR5cGUgPT0gMykgLy8gQW5kcm9pZCBicm93c2VyIGFsd2F5cyByZXR1cm5zIGZhbHNlIHdoZW4gY2hpbGQgaXMgYSB0ZXh0bm9kZQogICAgY2hpbGQgPSBjaGlsZC5wYXJlbnROb2RlCiAgaWYgKHBhcmVudC5jb250YWlucykKICAgIHJldHVybiBwYXJlbnQuY29udGFpbnMoY2hpbGQpCiAgZG8gewogICAgaWYgKGNoaWxkLm5vZGVUeXBlID09IDExKSBjaGlsZCA9IGNoaWxkLmhvc3QKICAgIGlmIChjaGlsZCA9PSBwYXJlbnQpIHJldHVybiB0cnVlCiAgfSB3aGlsZSAoY2hpbGQgPSBjaGlsZC5wYXJlbnROb2RlKQp9CgpleHBvcnQgbGV0IGFjdGl2ZUVsdCA9IGZ1bmN0aW9uKCkgewogIGxldCBhY3RpdmVFbGVtZW50ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudAogIHdoaWxlIChhY3RpdmVFbGVtZW50ICYmIGFjdGl2ZUVsZW1lbnQucm9vdCAmJiBhY3RpdmVFbGVtZW50LnJvb3QuYWN0aXZlRWxlbWVudCkKICAgIGFjdGl2ZUVsZW1lbnQgPSBhY3RpdmVFbGVtZW50LnJvb3QuYWN0aXZlRWxlbWVudAogIHJldHVybiBhY3RpdmVFbGVtZW50Cn0KLy8gT2xkZXIgdmVyc2lvbnMgb2YgSUUgdGhyb3dzIHVuc3BlY2lmaWVkIGVycm9yIHdoZW4gdG91Y2hpbmcKLy8gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCBpbiBzb21lIGNhc2VzIChkdXJpbmcgbG9hZGluZywgaW4gaWZyYW1lKQppZiAoaWUgJiYgaWVfdmVyc2lvbiA8IDExKSBhY3RpdmVFbHQgPSBmdW5jdGlvbigpIHsKICB0cnkgeyByZXR1cm4gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCB9CiAgY2F0Y2goZSkgeyByZXR1cm4gZG9jdW1lbnQuYm9keSB9Cn0KCmV4cG9ydCBmdW5jdGlvbiBhZGRDbGFzcyhub2RlLCBjbHMpIHsKICBsZXQgY3VycmVudCA9IG5vZGUuY2xhc3NOYW1lCiAgaWYgKCFjbGFzc1Rlc3QoY2xzKS50ZXN0KGN1cnJlbnQpKSBub2RlLmNsYXNzTmFtZSArPSAoY3VycmVudCA/ICIgIiA6ICIiKSArIGNscwp9CmV4cG9ydCBmdW5jdGlvbiBqb2luQ2xhc3NlcyhhLCBiKSB7CiAgbGV0IGFzID0gYS5zcGxpdCgiICIpCiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcy5sZW5ndGg7IGkrKykKICAgIGlmIChhc1tpXSAmJiAhY2xhc3NUZXN0KGFzW2ldKS50ZXN0KGIpKSBiICs9ICIgIiArIGFzW2ldCiAgcmV0dXJuIGIKfQoKZXhwb3J0IGxldCBzZWxlY3RJbnB1dCA9IGZ1bmN0aW9uKG5vZGUpIHsgbm9kZS5zZWxlY3QoKSB9CmlmIChpb3MpIC8vIE1vYmlsZSBTYWZhcmkgYXBwYXJlbnRseSBoYXMgYSBidWcgd2hlcmUgc2VsZWN0KCkgaXMgYnJva2VuLgogIHNlbGVjdElucHV0ID0gZnVuY3Rpb24obm9kZSkgeyBub2RlLnNlbGVjdGlvblN0YXJ0ID0gMDsgbm9kZS5zZWxlY3Rpb25FbmQgPSBub2RlLnZhbHVlLmxlbmd0aCB9CmVsc2UgaWYgKGllKSAvLyBTdXBwcmVzcyBteXN0ZXJpb3VzIElFMTAgZXJyb3JzCiAgc2VsZWN0SW5wdXQgPSBmdW5jdGlvbihub2RlKSB7IHRyeSB7IG5vZGUuc2VsZWN0KCkgfSBjYXRjaChfZSkge30gfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/src/util/event.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aW1wb3J0IHsgbWFjIH0gZnJvbSAiLi9icm93c2VyIgppbXBvcnQgeyBpbmRleE9mIH0gZnJvbSAiLi9taXNjIgoKLy8gRVZFTlQgSEFORExJTkcKCi8vIExpZ2h0d2VpZ2h0IGV2ZW50IGZyYW1ld29yay4gb24vb2ZmIGFsc28gd29yayBvbiBET00gbm9kZXMsCi8vIHJlZ2lzdGVyaW5nIG5hdGl2ZSBET00gaGFuZGxlcnMuCgpleHBvcnQgbGV0IG9uID0gZnVuY3Rpb24oZW1pdHRlciwgdHlwZSwgZikgewogIGlmIChlbWl0dGVyLmFkZEV2ZW50TGlzdGVuZXIpCiAgICBlbWl0dGVyLmFkZEV2ZW50TGlzdGVuZXIodHlwZSwgZiwgZmFsc2UpCiAgZWxzZSBpZiAoZW1pdHRlci5hdHRhY2hFdmVudCkKICAgIGVtaXR0ZXIuYXR0YWNoRXZlbnQoIm9uIiArIHR5cGUsIGYpCiAgZWxzZSB7CiAgICBsZXQgbWFwID0gZW1pdHRlci5faGFuZGxlcnMgfHwgKGVtaXR0ZXIuX2hhbmRsZXJzID0ge30pCiAgICBsZXQgYXJyID0gbWFwW3R5cGVdIHx8IChtYXBbdHlwZV0gPSBbXSkKICAgIGFyci5wdXNoKGYpCiAgfQp9CgpsZXQgbm9IYW5kbGVycyA9IFtdCmV4cG9ydCBmdW5jdGlvbiBnZXRIYW5kbGVycyhlbWl0dGVyLCB0eXBlLCBjb3B5KSB7CiAgbGV0IGFyciA9IGVtaXR0ZXIuX2hhbmRsZXJzICYmIGVtaXR0ZXIuX2hhbmRsZXJzW3R5cGVdCiAgaWYgKGNvcHkpIHJldHVybiBhcnIgJiYgYXJyLmxlbmd0aCA+IDAgPyBhcnIuc2xpY2UoKSA6IG5vSGFuZGxlcnMKICBlbHNlIHJldHVybiBhcnIgfHwgbm9IYW5kbGVycwp9CgpleHBvcnQgZnVuY3Rpb24gb2ZmKGVtaXR0ZXIsIHR5cGUsIGYpIHsKICBpZiAoZW1pdHRlci5yZW1vdmVFdmVudExpc3RlbmVyKQogICAgZW1pdHRlci5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIGYsIGZhbHNlKQogIGVsc2UgaWYgKGVtaXR0ZXIuZGV0YWNoRXZlbnQpCiAgICBlbWl0dGVyLmRldGFjaEV2ZW50KCJvbiIgKyB0eXBlLCBmKQogIGVsc2UgewogICAgbGV0IGhhbmRsZXJzID0gZ2V0SGFuZGxlcnMoZW1pdHRlciwgdHlwZSwgZmFsc2UpCiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGhhbmRsZXJzLmxlbmd0aDsgKytpKQogICAgICBpZiAoaGFuZGxlcnNbaV0gPT0gZikgeyBoYW5kbGVycy5zcGxpY2UoaSwgMSk7IGJyZWFrIH0KICB9Cn0KCmV4cG9ydCBmdW5jdGlvbiBzaWduYWwoZW1pdHRlciwgdHlwZSAvKiwgdmFsdWVzLi4uKi8pIHsKICBsZXQgaGFuZGxlcnMgPSBnZXRIYW5kbGVycyhlbWl0dGVyLCB0eXBlLCB0cnVlKQogIGlmICghaGFuZGxlcnMubGVuZ3RoKSByZXR1cm4KICBsZXQgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMikKICBmb3IgKGxldCBpID0gMDsgaSA8IGhhbmRsZXJzLmxlbmd0aDsgKytpKSBoYW5kbGVyc1tpXS5hcHBseShudWxsLCBhcmdzKQp9CgovLyBUaGUgRE9NIGV2ZW50cyB0aGF0IENvZGVNaXJyb3IgaGFuZGxlcyBjYW4gYmUgb3ZlcnJpZGRlbiBieQovLyByZWdpc3RlcmluZyBhIChub24tRE9NKSBoYW5kbGVyIG9uIHRoZSBlZGl0b3IgZm9yIHRoZSBldmVudCBuYW1lLAovLyBhbmQgcHJldmVudERlZmF1bHQtaW5nIHRoZSBldmVudCBpbiB0aGF0IGhhbmRsZXIuCmV4cG9ydCBmdW5jdGlvbiBzaWduYWxET01FdmVudChjbSwgZSwgb3ZlcnJpZGUpIHsKICBpZiAodHlwZW9mIGUgPT0gInN0cmluZyIpCiAgICBlID0ge3R5cGU6IGUsIHByZXZlbnREZWZhdWx0OiBmdW5jdGlvbigpIHsgdGhpcy5kZWZhdWx0UHJldmVudGVkID0gdHJ1ZSB9fQogIHNpZ25hbChjbSwgb3ZlcnJpZGUgfHwgZS50eXBlLCBjbSwgZSkKICByZXR1cm4gZV9kZWZhdWx0UHJldmVudGVkKGUpIHx8IGUuY29kZW1pcnJvcklnbm9yZQp9CgpleHBvcnQgZnVuY3Rpb24gc2lnbmFsQ3Vyc29yQWN0aXZpdHkoY20pIHsKICBsZXQgYXJyID0gY20uX2hhbmRsZXJzICYmIGNtLl9oYW5kbGVycy5jdXJzb3JBY3Rpdml0eQogIGlmICghYXJyKSByZXR1cm4KICBsZXQgc2V0ID0gY20uY3VyT3AuY3Vyc29yQWN0aXZpdHlIYW5kbGVycyB8fCAoY20uY3VyT3AuY3Vyc29yQWN0aXZpdHlIYW5kbGVycyA9IFtdKQogIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgKytpKSBpZiAoaW5kZXhPZihzZXQsIGFycltpXSkgPT0gLTEpCiAgICBzZXQucHVzaChhcnJbaV0pCn0KCmV4cG9ydCBmdW5jdGlvbiBoYXNIYW5kbGVyKGVtaXR0ZXIsIHR5cGUpIHsKICByZXR1cm4gZ2V0SGFuZGxlcnMoZW1pdHRlciwgdHlwZSkubGVuZ3RoID4gMAp9CgovLyBBZGQgb24gYW5kIG9mZiBtZXRob2RzIHRvIGEgY29uc3RydWN0b3IncyBwcm90b3R5cGUsIHRvIG1ha2UKLy8gcmVnaXN0ZXJpbmcgZXZlbnRzIG9uIHN1Y2ggb2JqZWN0cyBtb3JlIGNvbnZlbmllbnQuCmV4cG9ydCBmdW5jdGlvbiBldmVudE1peGluKGN0b3IpIHsKICBjdG9yLnByb3RvdHlwZS5vbiA9IGZ1bmN0aW9uKHR5cGUsIGYpIHtvbih0aGlzLCB0eXBlLCBmKX0KICBjdG9yLnByb3RvdHlwZS5vZmYgPSBmdW5jdGlvbih0eXBlLCBmKSB7b2ZmKHRoaXMsIHR5cGUsIGYpfQp9CgovLyBEdWUgdG8gdGhlIGZhY3QgdGhhdCB3ZSBzdGlsbCBzdXBwb3J0IGp1cmFzc2ljIElFIHZlcnNpb25zLCBzb21lCi8vIGNvbXBhdGliaWxpdHkgd3JhcHBlcnMgYXJlIG5lZWRlZC4KCmV4cG9ydCBmdW5jdGlvbiBlX3ByZXZlbnREZWZhdWx0KGUpIHsKICBpZiAoZS5wcmV2ZW50RGVmYXVsdCkgZS5wcmV2ZW50RGVmYXVsdCgpCiAgZWxzZSBlLnJldHVyblZhbHVlID0gZmFsc2UKfQpleHBvcnQgZnVuY3Rpb24gZV9zdG9wUHJvcGFnYXRpb24oZSkgewogIGlmIChlLnN0b3BQcm9wYWdhdGlvbikgZS5zdG9wUHJvcGFnYXRpb24oKQogIGVsc2UgZS5jYW5jZWxCdWJibGUgPSB0cnVlCn0KZXhwb3J0IGZ1bmN0aW9uIGVfZGVmYXVsdFByZXZlbnRlZChlKSB7CiAgcmV0dXJuIGUuZGVmYXVsdFByZXZlbnRlZCAhPSBudWxsID8gZS5kZWZhdWx0UHJldmVudGVkIDogZS5yZXR1cm5WYWx1ZSA9PSBmYWxzZQp9CmV4cG9ydCBmdW5jdGlvbiBlX3N0b3AoZSkge2VfcHJldmVudERlZmF1bHQoZSk7IGVfc3RvcFByb3BhZ2F0aW9uKGUpfQoKZXhwb3J0IGZ1bmN0aW9uIGVfdGFyZ2V0KGUpIHtyZXR1cm4gZS50YXJnZXQgfHwgZS5zcmNFbGVtZW50fQpleHBvcnQgZnVuY3Rpb24gZV9idXR0b24oZSkgewogIGxldCBiID0gZS53aGljaAogIGlmIChiID09IG51bGwpIHsKICAgIGlmIChlLmJ1dHRvbiAmIDEpIGIgPSAxCiAgICBlbHNlIGlmIChlLmJ1dHRvbiAmIDIpIGIgPSAzCiAgICBlbHNlIGlmIChlLmJ1dHRvbiAmIDQpIGIgPSAyCiAgfQogIGlmIChtYWMgJiYgZS5jdHJsS2V5ICYmIGIgPT0gMSkgYiA9IDMKICByZXR1cm4gYgp9Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/src/util/feature_detection.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aW1wb3J0IHsgZWx0LCByYW5nZSwgcmVtb3ZlQ2hpbGRyZW4sIHJlbW92ZUNoaWxkcmVuQW5kQWRkIH0gZnJvbSAiLi9kb20iCmltcG9ydCB7IGllLCBpZV92ZXJzaW9uIH0gZnJvbSAiLi9icm93c2VyIgoKLy8gRGV0ZWN0IGRyYWctYW5kLWRyb3AKZXhwb3J0IGxldCBkcmFnQW5kRHJvcCA9IGZ1bmN0aW9uKCkgewogIC8vIFRoZXJlIGlzICpzb21lKiBraW5kIG9mIGRyYWctYW5kLWRyb3Agc3VwcG9ydCBpbiBJRTYtOCwgYnV0IEkKICAvLyBjb3VsZG4ndCBnZXQgaXQgdG8gd29yayB5ZXQuCiAgaWYgKGllICYmIGllX3ZlcnNpb24gPCA5KSByZXR1cm4gZmFsc2UKICBsZXQgZGl2ID0gZWx0KCdkaXYnKQogIHJldHVybiAiZHJhZ2dhYmxlIiBpbiBkaXYgfHwgImRyYWdEcm9wIiBpbiBkaXYKfSgpCgpsZXQgendzcFN1cHBvcnRlZApleHBvcnQgZnVuY3Rpb24gemVyb1dpZHRoRWxlbWVudChtZWFzdXJlKSB7CiAgaWYgKHp3c3BTdXBwb3J0ZWQgPT0gbnVsbCkgewogICAgbGV0IHRlc3QgPSBlbHQoInNwYW4iLCAiXHUyMDBiIikKICAgIHJlbW92ZUNoaWxkcmVuQW5kQWRkKG1lYXN1cmUsIGVsdCgic3BhbiIsIFt0ZXN0LCBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgieCIpXSkpCiAgICBpZiAobWVhc3VyZS5maXJzdENoaWxkLm9mZnNldEhlaWdodCAhPSAwKQogICAgICB6d3NwU3VwcG9ydGVkID0gdGVzdC5vZmZzZXRXaWR0aCA8PSAxICYmIHRlc3Qub2Zmc2V0SGVpZ2h0ID4gMiAmJiAhKGllICYmIGllX3ZlcnNpb24gPCA4KQogIH0KICBsZXQgbm9kZSA9IHp3c3BTdXBwb3J0ZWQgPyBlbHQoInNwYW4iLCAiXHUyMDBiIikgOgogICAgZWx0KCJzcGFuIiwgIlx1MDBhMCIsIG51bGwsICJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHdpZHRoOiAxcHg7IG1hcmdpbi1yaWdodDogLTFweCIpCiAgbm9kZS5zZXRBdHRyaWJ1dGUoImNtLXRleHQiLCAiIikKICByZXR1cm4gbm9kZQp9CgovLyBGZWF0dXJlLWRldGVjdCBJRSdzIGNydW1teSBjbGllbnQgcmVjdCByZXBvcnRpbmcgZm9yIGJpZGkgdGV4dApsZXQgYmFkQmlkaVJlY3RzCmV4cG9ydCBmdW5jdGlvbiBoYXNCYWRCaWRpUmVjdHMobWVhc3VyZSkgewogIGlmIChiYWRCaWRpUmVjdHMgIT0gbnVsbCkgcmV0dXJuIGJhZEJpZGlSZWN0cwogIGxldCB0eHQgPSByZW1vdmVDaGlsZHJlbkFuZEFkZChtZWFzdXJlLCBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiQVx1MDYyZUEiKSkKICBsZXQgcjAgPSByYW5nZSh0eHQsIDAsIDEpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpCiAgbGV0IHIxID0gcmFuZ2UodHh0LCAxLCAyKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKQogIHJlbW92ZUNoaWxkcmVuKG1lYXN1cmUpCiAgaWYgKCFyMCB8fCByMC5sZWZ0ID09IHIwLnJpZ2h0KSByZXR1cm4gZmFsc2UgLy8gU2FmYXJpIHJldHVybnMgbnVsbCBpbiBzb21lIGNhc2VzICgjMjc4MCkKICByZXR1cm4gYmFkQmlkaVJlY3RzID0gKHIxLnJpZ2h0IC0gcjAucmlnaHQgPCAzKQp9CgovLyBTZWUgaWYgIiIuc3BsaXQgaXMgdGhlIGJyb2tlbiBJRSB2ZXJzaW9uLCBpZiBzbywgcHJvdmlkZSBhbgovLyBhbHRlcm5hdGl2ZSB3YXkgdG8gc3BsaXQgbGluZXMuCmV4cG9ydCBsZXQgc3BsaXRMaW5lc0F1dG8gPSAiXG5cbmIiLnNwbGl0KC9cbi8pLmxlbmd0aCAhPSAzID8gc3RyaW5nID0+IHsKICBsZXQgcG9zID0gMCwgcmVzdWx0ID0gW10sIGwgPSBzdHJpbmcubGVuZ3RoCiAgd2hpbGUgKHBvcyA8PSBsKSB7CiAgICBsZXQgbmwgPSBzdHJpbmcuaW5kZXhPZigiXG4iLCBwb3MpCiAgICBpZiAobmwgPT0gLTEpIG5sID0gc3RyaW5nLmxlbmd0aAogICAgbGV0IGxpbmUgPSBzdHJpbmcuc2xpY2UocG9zLCBzdHJpbmcuY2hhckF0KG5sIC0gMSkgPT0gIlxyIiA/IG5sIC0gMSA6IG5sKQogICAgbGV0IHJ0ID0gbGluZS5pbmRleE9mKCJcciIpCiAgICBpZiAocnQgIT0gLTEpIHsKICAgICAgcmVzdWx0LnB1c2gobGluZS5zbGljZSgwLCBydCkpCiAgICAgIHBvcyArPSBydCArIDEKICAgIH0gZWxzZSB7CiAgICAgIHJlc3VsdC5wdXNoKGxpbmUpCiAgICAgIHBvcyA9IG5sICsgMQogICAgfQogIH0KICByZXR1cm4gcmVzdWx0Cn0gOiBzdHJpbmcgPT4gc3RyaW5nLnNwbGl0KC9cclxuP3xcbi8pCgpleHBvcnQgbGV0IGhhc1NlbGVjdGlvbiA9IHdpbmRvdy5nZXRTZWxlY3Rpb24gPyB0ZSA9PiB7CiAgdHJ5IHsgcmV0dXJuIHRlLnNlbGVjdGlvblN0YXJ0ICE9IHRlLnNlbGVjdGlvbkVuZCB9CiAgY2F0Y2goZSkgeyByZXR1cm4gZmFsc2UgfQp9IDogdGUgPT4gewogIGxldCByYW5nZQogIHRyeSB7cmFuZ2UgPSB0ZS5vd25lckRvY3VtZW50LnNlbGVjdGlvbi5jcmVhdGVSYW5nZSgpfQogIGNhdGNoKGUpIHt9CiAgaWYgKCFyYW5nZSB8fCByYW5nZS5wYXJlbnRFbGVtZW50KCkgIT0gdGUpIHJldHVybiBmYWxzZQogIHJldHVybiByYW5nZS5jb21wYXJlRW5kUG9pbnRzKCJTdGFydFRvRW5kIiwgcmFuZ2UpICE9IDAKfQoKZXhwb3J0IGxldCBoYXNDb3B5RXZlbnQgPSAoKCkgPT4gewogIGxldCBlID0gZWx0KCJkaXYiKQogIGlmICgib25jb3B5IiBpbiBlKSByZXR1cm4gdHJ1ZQogIGUuc2V0QXR0cmlidXRlKCJvbmNvcHkiLCAicmV0dXJuOyIpCiAgcmV0dXJuIHR5cGVvZiBlLm9uY29weSA9PSAiZnVuY3Rpb24iCn0pKCkKCmxldCBiYWRab29tZWRSZWN0cyA9IG51bGwKZXhwb3J0IGZ1bmN0aW9uIGhhc0JhZFpvb21lZFJlY3RzKG1lYXN1cmUpIHsKICBpZiAoYmFkWm9vbWVkUmVjdHMgIT0gbnVsbCkgcmV0dXJuIGJhZFpvb21lZFJlY3RzCiAgbGV0IG5vZGUgPSByZW1vdmVDaGlsZHJlbkFuZEFkZChtZWFzdXJlLCBlbHQoInNwYW4iLCAieCIpKQogIGxldCBub3JtYWwgPSBub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpCiAgbGV0IGZyb21SYW5nZSA9IHJhbmdlKG5vZGUsIDAsIDEpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpCiAgcmV0dXJuIGJhZFpvb21lZFJlY3RzID0gTWF0aC5hYnMobm9ybWFsLmxlZnQgLSBmcm9tUmFuZ2UubGVmdCkgPiAxCn0K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/src/util/misc.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[ZXhwb3J0IGZ1bmN0aW9uIGJpbmQoZikgewogIGxldCBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKQogIHJldHVybiBmdW5jdGlvbigpe3JldHVybiBmLmFwcGx5KG51bGwsIGFyZ3MpfQp9CgpleHBvcnQgZnVuY3Rpb24gY29weU9iaihvYmosIHRhcmdldCwgb3ZlcndyaXRlKSB7CiAgaWYgKCF0YXJnZXQpIHRhcmdldCA9IHt9CiAgZm9yIChsZXQgcHJvcCBpbiBvYmopCiAgICBpZiAob2JqLmhhc093blByb3BlcnR5KHByb3ApICYmIChvdmVyd3JpdGUgIT09IGZhbHNlIHx8ICF0YXJnZXQuaGFzT3duUHJvcGVydHkocHJvcCkpKQogICAgICB0YXJnZXRbcHJvcF0gPSBvYmpbcHJvcF0KICByZXR1cm4gdGFyZ2V0Cn0KCi8vIENvdW50cyB0aGUgY29sdW1uIG9mZnNldCBpbiBhIHN0cmluZywgdGFraW5nIHRhYnMgaW50byBhY2NvdW50LgovLyBVc2VkIG1vc3RseSB0byBmaW5kIGluZGVudGF0aW9uLgpleHBvcnQgZnVuY3Rpb24gY291bnRDb2x1bW4oc3RyaW5nLCBlbmQsIHRhYlNpemUsIHN0YXJ0SW5kZXgsIHN0YXJ0VmFsdWUpIHsKICBpZiAoZW5kID09IG51bGwpIHsKICAgIGVuZCA9IHN0cmluZy5zZWFyY2goL1teXHNcdTAwYTBdLykKICAgIGlmIChlbmQgPT0gLTEpIGVuZCA9IHN0cmluZy5sZW5ndGgKICB9CiAgZm9yIChsZXQgaSA9IHN0YXJ0SW5kZXggfHwgMCwgbiA9IHN0YXJ0VmFsdWUgfHwgMDs7KSB7CiAgICBsZXQgbmV4dFRhYiA9IHN0cmluZy5pbmRleE9mKCJcdCIsIGkpCiAgICBpZiAobmV4dFRhYiA8IDAgfHwgbmV4dFRhYiA+PSBlbmQpCiAgICAgIHJldHVybiBuICsgKGVuZCAtIGkpCiAgICBuICs9IG5leHRUYWIgLSBpCiAgICBuICs9IHRhYlNpemUgLSAobiAlIHRhYlNpemUpCiAgICBpID0gbmV4dFRhYiArIDEKICB9Cn0KCmV4cG9ydCBmdW5jdGlvbiBEZWxheWVkKCkge3RoaXMuaWQgPSBudWxsfQpEZWxheWVkLnByb3RvdHlwZS5zZXQgPSBmdW5jdGlvbihtcywgZikgewogIGNsZWFyVGltZW91dCh0aGlzLmlkKQogIHRoaXMuaWQgPSBzZXRUaW1lb3V0KGYsIG1zKQp9CgpleHBvcnQgZnVuY3Rpb24gaW5kZXhPZihhcnJheSwgZWx0KSB7CiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7ICsraSkKICAgIGlmIChhcnJheVtpXSA9PSBlbHQpIHJldHVybiBpCiAgcmV0dXJuIC0xCn0KCi8vIE51bWJlciBvZiBwaXhlbHMgYWRkZWQgdG8gc2Nyb2xsZXIgYW5kIHNpemVyIHRvIGhpZGUgc2Nyb2xsYmFyCmV4cG9ydCBsZXQgc2Nyb2xsZXJHYXAgPSAzMAoKLy8gUmV0dXJuZWQgb3IgdGhyb3duIGJ5IHZhcmlvdXMgcHJvdG9jb2xzIHRvIHNpZ25hbCAnSSdtIG5vdAovLyBoYW5kbGluZyB0aGlzJy4KZXhwb3J0IGxldCBQYXNzID0ge3RvU3RyaW5nOiBmdW5jdGlvbigpe3JldHVybiAiQ29kZU1pcnJvci5QYXNzIn19CgovLyBSZXVzZWQgb3B0aW9uIG9iamVjdHMgZm9yIHNldFNlbGVjdGlvbiAmIGZyaWVuZHMKZXhwb3J0IGxldCBzZWxfZG9udFNjcm9sbCA9IHtzY3JvbGw6IGZhbHNlfSwgc2VsX21vdXNlID0ge29yaWdpbjogIiptb3VzZSJ9LCBzZWxfbW92ZSA9IHtvcmlnaW46ICIrbW92ZSJ9CgovLyBUaGUgaW52ZXJzZSBvZiBjb3VudENvbHVtbiAtLSBmaW5kIHRoZSBvZmZzZXQgdGhhdCBjb3JyZXNwb25kcyB0bwovLyBhIHBhcnRpY3VsYXIgY29sdW1uLgpleHBvcnQgZnVuY3Rpb24gZmluZENvbHVtbihzdHJpbmcsIGdvYWwsIHRhYlNpemUpIHsKICBmb3IgKGxldCBwb3MgPSAwLCBjb2wgPSAwOzspIHsKICAgIGxldCBuZXh0VGFiID0gc3RyaW5nLmluZGV4T2YoIlx0IiwgcG9zKQogICAgaWYgKG5leHRUYWIgPT0gLTEpIG5leHRUYWIgPSBzdHJpbmcubGVuZ3RoCiAgICBsZXQgc2tpcHBlZCA9IG5leHRUYWIgLSBwb3MKICAgIGlmIChuZXh0VGFiID09IHN0cmluZy5sZW5ndGggfHwgY29sICsgc2tpcHBlZCA+PSBnb2FsKQogICAgICByZXR1cm4gcG9zICsgTWF0aC5taW4oc2tpcHBlZCwgZ29hbCAtIGNvbCkKICAgIGNvbCArPSBuZXh0VGFiIC0gcG9zCiAgICBjb2wgKz0gdGFiU2l6ZSAtIChjb2wgJSB0YWJTaXplKQogICAgcG9zID0gbmV4dFRhYiArIDEKICAgIGlmIChjb2wgPj0gZ29hbCkgcmV0dXJuIHBvcwogIH0KfQoKbGV0IHNwYWNlU3RycyA9IFsiIl0KZXhwb3J0IGZ1bmN0aW9uIHNwYWNlU3RyKG4pIHsKICB3aGlsZSAoc3BhY2VTdHJzLmxlbmd0aCA8PSBuKQogICAgc3BhY2VTdHJzLnB1c2gobHN0KHNwYWNlU3RycykgKyAiICIpCiAgcmV0dXJuIHNwYWNlU3Ryc1tuXQp9CgpleHBvcnQgZnVuY3Rpb24gbHN0KGFycikgeyByZXR1cm4gYXJyW2Fyci5sZW5ndGgtMV0gfQoKZXhwb3J0IGZ1bmN0aW9uIG1hcChhcnJheSwgZikgewogIGxldCBvdXQgPSBbXQogIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyYXkubGVuZ3RoOyBpKyspIG91dFtpXSA9IGYoYXJyYXlbaV0sIGkpCiAgcmV0dXJuIG91dAp9CgpleHBvcnQgZnVuY3Rpb24gaW5zZXJ0U29ydGVkKGFycmF5LCB2YWx1ZSwgc2NvcmUpIHsKICBsZXQgcG9zID0gMCwgcHJpb3JpdHkgPSBzY29yZSh2YWx1ZSkKICB3aGlsZSAocG9zIDwgYXJyYXkubGVuZ3RoICYmIHNjb3JlKGFycmF5W3Bvc10pIDw9IHByaW9yaXR5KSBwb3MrKwogIGFycmF5LnNwbGljZShwb3MsIDAsIHZhbHVlKQp9CgpleHBvcnQgZnVuY3Rpb24gbm90aGluZygpIHt9CgpleHBvcnQgZnVuY3Rpb24gY3JlYXRlT2JqKGJhc2UsIHByb3BzKSB7CiAgbGV0IGluc3QKICBpZiAoT2JqZWN0LmNyZWF0ZSkgewogICAgaW5zdCA9IE9iamVjdC5jcmVhdGUoYmFzZSkKICB9IGVsc2UgewogICAgbm90aGluZy5wcm90b3R5cGUgPSBiYXNlCiAgICBpbnN0ID0gbmV3IG5vdGhpbmcoKQogIH0KICBpZiAocHJvcHMpIGNvcHlPYmoocHJvcHMsIGluc3QpCiAgcmV0dXJuIGluc3QKfQoKbGV0IG5vbkFTQ0lJU2luZ2xlQ2FzZVdvcmRDaGFyID0gL1tcdTAwZGZcdTA1ODdcdTA1OTAtXHUwNWY0XHUwNjAwLVx1MDZmZlx1MzA0MC1cdTMwOWZcdTMwYTAtXHUzMGZmXHUzNDAwLVx1NGRiNVx1NGUwMC1cdTlmY2NcdWFjMDAtXHVkN2FmXS8KZXhwb3J0IGZ1bmN0aW9uIGlzV29yZENoYXJCYXNpYyhjaCkgewogIHJldHVybiAvXHcvLnRlc3QoY2gpIHx8IGNoID4gIlx4ODAiICYmCiAgICAoY2gudG9VcHBlckNhc2UoKSAhPSBjaC50b0xvd2VyQ2FzZSgpIHx8IG5vbkFTQ0lJU2luZ2xlQ2FzZVdvcmRDaGFyLnRlc3QoY2gpKQp9CmV4cG9ydCBmdW5jdGlvbiBpc1dvcmRDaGFyKGNoLCBoZWxwZXIpIHsKICBpZiAoIWhlbHBlcikgcmV0dXJuIGlzV29yZENoYXJCYXNpYyhjaCkKICBpZiAoaGVscGVyLnNvdXJjZS5pbmRleE9mKCJcXHciKSA+IC0xICYmIGlzV29yZENoYXJCYXNpYyhjaCkpIHJldHVybiB0cnVlCiAgcmV0dXJuIGhlbHBlci50ZXN0KGNoKQp9CgpleHBvcnQgZnVuY3Rpb24gaXNFbXB0eShvYmopIHsKICBmb3IgKGxldCBuIGluIG9iaikgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShuKSAmJiBvYmpbbl0pIHJldHVybiBmYWxzZQogIHJldHVybiB0cnVlCn0KCi8vIEV4dGVuZGluZyB1bmljb2RlIGNoYXJhY3RlcnMuIEEgc2VyaWVzIG9mIGEgbm9uLWV4dGVuZGluZyBjaGFyICsKLy8gYW55IG51bWJlciBvZiBleHRlbmRpbmcgY2hhcnMgaXMgdHJlYXRlZCBhcyBhIHNpbmdsZSB1bml0IGFzIGZhcgovLyBhcyBlZGl0aW5nIGFuZCBtZWFzdXJpbmcgaXMgY29uY2VybmVkLiBUaGlzIGlzIG5vdCBmdWxseSBjb3JyZWN0LAovLyBzaW5jZSBzb21lIHNjcmlwdHMvZm9udHMvYnJvd3NlcnMgYWxzbyB0cmVhdCBvdGhlciBjb25maWd1cmF0aW9ucwovLyBvZiBjb2RlIHBvaW50cyBhcyBhIGdyb3VwLgpsZXQgZXh0ZW5kaW5nQ2hhcnMgPSAvW1x1MDMwMC1cdTAzNmZcdTA0ODMtXHUwNDg5XHUwNTkxLVx1MDViZFx1MDViZlx1MDVjMVx1MDVjMlx1MDVjNFx1MDVjNVx1MDVjN1x1MDYxMC1cdTA2MWFcdTA2NGItXHUwNjVlXHUwNjcwXHUwNmQ2LVx1MDZkY1x1MDZkZS1cdTA2ZTRcdTA2ZTdcdTA2ZThcdTA2ZWEtXHUwNmVkXHUwNzExXHUwNzMwLVx1MDc0YVx1MDdhNi1cdTA3YjBcdTA3ZWItXHUwN2YzXHUwODE2LVx1MDgxOVx1MDgxYi1cdTA4MjNcdTA4MjUtXHUwODI3XHUwODI5LVx1MDgyZFx1MDkwMC1cdTA5MDJcdTA5M2NcdTA5NDEtXHUwOTQ4XHUwOTRkXHUwOTUxLVx1MDk1NVx1MDk2Mlx1MDk2M1x1MDk4MVx1MDliY1x1MDliZVx1MDljMS1cdTA5YzRcdTA5Y2RcdTA5ZDdcdTA5ZTJcdTA5ZTNcdTBhMDFcdTBhMDJcdTBhM2NcdTBhNDFcdTBhNDJcdTBhNDdcdTBhNDhcdTBhNGItXHUwYTRkXHUwYTUxXHUwYTcwXHUwYTcxXHUwYTc1XHUwYTgxXHUwYTgyXHUwYWJjXHUwYWMxLVx1MGFjNVx1MGFjN1x1MGFjOFx1MGFjZFx1MGFlMlx1MGFlM1x1MGIwMVx1MGIzY1x1MGIzZVx1MGIzZlx1MGI0MS1cdTBiNDRcdTBiNGRcdTBiNTZcdTBiNTdcdTBiNjJcdTBiNjNcdTBiODJcdTBiYmVcdTBiYzBcdTBiY2RcdTBiZDdcdTBjM2UtXHUwYzQwXHUwYzQ2LVx1MGM0OFx1MGM0YS1cdTBjNGRcdTBjNTVcdTBjNTZcdTBjNjJcdTBjNjNcdTBjYmNcdTBjYmZcdTBjYzJcdTBjYzZcdTBjY2NcdTBjY2RcdTBjZDVcdTBjZDZcdTBjZTJcdTBjZTNcdTBkM2VcdTBkNDEtXHUwZDQ0XHUwZDRkXHUwZDU3XHUwZDYyXHUwZDYzXHUwZGNhXHUwZGNmXHUwZGQyLVx1MGRkNFx1MGRkNlx1MGRkZlx1MGUzMVx1MGUzNC1cdTBlM2FcdTBlNDctXHUwZTRlXHUwZWIxXHUwZWI0LVx1MGViOVx1MGViYlx1MGViY1x1MGVjOC1cdTBlY2RcdTBmMThcdTBmMTlcdTBmMzVcdTBmMzdcdTBmMzlcdTBmNzEtXHUwZjdlXHUwZjgwLVx1MGY4NFx1MGY4Nlx1MGY4N1x1MGY5MC1cdTBmOTdcdTBmOTktXHUwZmJjXHUwZmM2XHUxMDJkLVx1MTAzMFx1MTAzMi1cdTEwMzdcdTEwMzlcdTEwM2FcdTEwM2RcdTEwM2VcdTEwNThcdTEwNTlcdTEwNWUtXHUxMDYwXHUxMDcxLVx1MTA3NFx1MTA4Mlx1MTA4NVx1MTA4Nlx1MTA4ZFx1MTA5ZFx1MTM1Zlx1MTcxMi1cdTE3MTRcdTE3MzItXHUxNzM0XHUxNzUyXHUxNzUzXHUxNzcyXHUxNzczXHUxN2I3LVx1MTdiZFx1MTdjNlx1MTdjOS1cdTE3ZDNcdTE3ZGRcdTE4MGItXHUxODBkXHUxOGE5XHUxOTIwLVx1MTkyMlx1MTkyN1x1MTkyOFx1MTkzMlx1MTkzOS1cdTE5M2JcdTFhMTdcdTFhMThcdTFhNTZcdTFhNTgtXHUxYTVlXHUxYTYwXHUxYTYyXHUxYTY1LVx1MWE2Y1x1MWE3My1cdTFhN2NcdTFhN2ZcdTFiMDAtXHUxYjAzXHUxYjM0XHUxYjM2LVx1MWIzYVx1MWIzY1x1MWI0Mlx1MWI2Yi1cdTFiNzNcdTFiODBcdTFiODFcdTFiYTItXHUxYmE1XHUxYmE4XHUxYmE5XHUxYzJjLVx1MWMzM1x1MWMzNlx1MWMzN1x1MWNkMC1cdTFjZDJcdTFjZDQtXHUxY2UwXHUxY2UyLVx1MWNlOFx1MWNlZFx1MWRjMC1cdTFkZTZcdTFkZmQtXHUxZGZmXHUyMDBjXHUyMDBkXHUyMGQwLVx1MjBmMFx1MmNlZi1cdTJjZjFcdTJkZTAtXHUyZGZmXHUzMDJhLVx1MzAyZlx1MzA5OVx1MzA5YVx1YTY2Zi1cdWE2NzJcdWE2N2NcdWE2N2RcdWE2ZjBcdWE2ZjFcdWE4MDJcdWE4MDZcdWE4MGJcdWE4MjVcdWE4MjZcdWE4YzRcdWE4ZTAtXHVhOGYxXHVhOTI2LVx1YTkyZFx1YTk0Ny1cdWE5NTFcdWE5ODAtXHVhOTgyXHVhOWIzXHVhOWI2LVx1YTliOVx1YTliY1x1YWEyOS1cdWFhMmVcdWFhMzFcdWFhMzJcdWFhMzVcdWFhMzZcdWFhNDNcdWFhNGNcdWFhYjBcdWFhYjItXHVhYWI0XHVhYWI3XHVhYWI4XHVhYWJlXHVhYWJmXHVhYWMxXHVhYmU1XHVhYmU4XHVhYmVkXHVkYzAwLVx1ZGZmZlx1ZmIxZVx1ZmUwMC1cdWZlMGZcdWZlMjAtXHVmZTI2XHVmZjllXHVmZjlmXS8KZXhwb3J0IGZ1bmN0aW9uIGlzRXh0ZW5kaW5nQ2hhcihjaCkgeyByZXR1cm4gY2guY2hhckNvZGVBdCgwKSA+PSA3NjggJiYgZXh0ZW5kaW5nQ2hhcnMudGVzdChjaCkgfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/src/util/operation_group.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aW1wb3J0IHsgZ2V0SGFuZGxlcnMgfSBmcm9tICIuL2V2ZW50IgoKbGV0IG9wZXJhdGlvbkdyb3VwID0gbnVsbAoKZXhwb3J0IGZ1bmN0aW9uIHB1c2hPcGVyYXRpb24ob3ApIHsKICBpZiAob3BlcmF0aW9uR3JvdXApIHsKICAgIG9wZXJhdGlvbkdyb3VwLm9wcy5wdXNoKG9wKQogIH0gZWxzZSB7CiAgICBvcC5vd25zR3JvdXAgPSBvcGVyYXRpb25Hcm91cCA9IHsKICAgICAgb3BzOiBbb3BdLAogICAgICBkZWxheWVkQ2FsbGJhY2tzOiBbXQogICAgfQogIH0KfQoKZnVuY3Rpb24gZmlyZUNhbGxiYWNrc0Zvck9wcyhncm91cCkgewogIC8vIENhbGxzIGRlbGF5ZWQgY2FsbGJhY2tzIGFuZCBjdXJzb3JBY3Rpdml0eSBoYW5kbGVycyB1bnRpbCBubwogIC8vIG5ldyBvbmVzIGFwcGVhcgogIGxldCBjYWxsYmFja3MgPSBncm91cC5kZWxheWVkQ2FsbGJhY2tzLCBpID0gMAogIGRvIHsKICAgIGZvciAoOyBpIDwgY2FsbGJhY2tzLmxlbmd0aDsgaSsrKQogICAgICBjYWxsYmFja3NbaV0uY2FsbChudWxsKQogICAgZm9yIChsZXQgaiA9IDA7IGogPCBncm91cC5vcHMubGVuZ3RoOyBqKyspIHsKICAgICAgbGV0IG9wID0gZ3JvdXAub3BzW2pdCiAgICAgIGlmIChvcC5jdXJzb3JBY3Rpdml0eUhhbmRsZXJzKQogICAgICAgIHdoaWxlIChvcC5jdXJzb3JBY3Rpdml0eUNhbGxlZCA8IG9wLmN1cnNvckFjdGl2aXR5SGFuZGxlcnMubGVuZ3RoKQogICAgICAgICAgb3AuY3Vyc29yQWN0aXZpdHlIYW5kbGVyc1tvcC5jdXJzb3JBY3Rpdml0eUNhbGxlZCsrXS5jYWxsKG51bGwsIG9wLmNtKQogICAgfQogIH0gd2hpbGUgKGkgPCBjYWxsYmFja3MubGVuZ3RoKQp9CgpleHBvcnQgZnVuY3Rpb24gZmluaXNoT3BlcmF0aW9uKG9wLCBlbmRDYikgewogIGxldCBncm91cCA9IG9wLm93bnNHcm91cAogIGlmICghZ3JvdXApIHJldHVybgoKICB0cnkgeyBmaXJlQ2FsbGJhY2tzRm9yT3BzKGdyb3VwKSB9CiAgZmluYWxseSB7CiAgICBvcGVyYXRpb25Hcm91cCA9IG51bGwKICAgIGVuZENiKGdyb3VwKQogIH0KfQoKbGV0IG9ycGhhbkRlbGF5ZWRDYWxsYmFja3MgPSBudWxsCgovLyBPZnRlbiwgd2Ugd2FudCB0byBzaWduYWwgZXZlbnRzIGF0IGEgcG9pbnQgd2hlcmUgd2UgYXJlIGluIHRoZQovLyBtaWRkbGUgb2Ygc29tZSB3b3JrLCBidXQgZG9uJ3Qgd2FudCB0aGUgaGFuZGxlciB0byBzdGFydCBjYWxsaW5nCi8vIG90aGVyIG1ldGhvZHMgb24gdGhlIGVkaXRvciwgd2hpY2ggbWlnaHQgYmUgaW4gYW4gaW5jb25zaXN0ZW50Ci8vIHN0YXRlIG9yIHNpbXBseSBub3QgZXhwZWN0IGFueSBvdGhlciBldmVudHMgdG8gaGFwcGVuLgovLyBzaWduYWxMYXRlciBsb29rcyB3aGV0aGVyIHRoZXJlIGFyZSBhbnkgaGFuZGxlcnMsIGFuZCBzY2hlZHVsZXMKLy8gdGhlbSB0byBiZSBleGVjdXRlZCB3aGVuIHRoZSBsYXN0IG9wZXJhdGlvbiBlbmRzLCBvciwgaWYgbm8KLy8gb3BlcmF0aW9uIGlzIGFjdGl2ZSwgd2hlbiBhIHRpbWVvdXQgZmlyZXMuCmV4cG9ydCBmdW5jdGlvbiBzaWduYWxMYXRlcihlbWl0dGVyLCB0eXBlIC8qLCB2YWx1ZXMuLi4qLykgewogIGxldCBhcnIgPSBnZXRIYW5kbGVycyhlbWl0dGVyLCB0eXBlLCBmYWxzZSkKICBpZiAoIWFyci5sZW5ndGgpIHJldHVybgogIGxldCBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAyKSwgbGlzdAogIGlmIChvcGVyYXRpb25Hcm91cCkgewogICAgbGlzdCA9IG9wZXJhdGlvbkdyb3VwLmRlbGF5ZWRDYWxsYmFja3MKICB9IGVsc2UgaWYgKG9ycGhhbkRlbGF5ZWRDYWxsYmFja3MpIHsKICAgIGxpc3QgPSBvcnBoYW5EZWxheWVkQ2FsbGJhY2tzCiAgfSBlbHNlIHsKICAgIGxpc3QgPSBvcnBoYW5EZWxheWVkQ2FsbGJhY2tzID0gW10KICAgIHNldFRpbWVvdXQoZmlyZU9ycGhhbkRlbGF5ZWQsIDApCiAgfQogIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgKytpKQogICAgbGlzdC5wdXNoKCgpID0+IGFycltpXS5hcHBseShudWxsLCBhcmdzKSkKfQoKZnVuY3Rpb24gZmlyZU9ycGhhbkRlbGF5ZWQoKSB7CiAgbGV0IGRlbGF5ZWQgPSBvcnBoYW5EZWxheWVkQ2FsbGJhY2tzCiAgb3JwaGFuRGVsYXllZENhbGxiYWNrcyA9IG51bGwKICBmb3IgKGxldCBpID0gMDsgaSA8IGRlbGF5ZWQubGVuZ3RoOyArK2kpIGRlbGF5ZWRbaV0oKQp9Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/src/util/StringStream.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[aW1wb3J0IHsgY291bnRDb2x1bW4gfSBmcm9tICIuL21pc2MiCgovLyBTVFJJTkcgU1RSRUFNCgovLyBGZWQgdG8gdGhlIG1vZGUgcGFyc2VycywgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byBtYWtlCi8vIHBhcnNlcnMgbW9yZSBzdWNjaW5jdC4KCmxldCBTdHJpbmdTdHJlYW0gPSBmdW5jdGlvbihzdHJpbmcsIHRhYlNpemUpIHsKICB0aGlzLnBvcyA9IHRoaXMuc3RhcnQgPSAwCiAgdGhpcy5zdHJpbmcgPSBzdHJpbmcKICB0aGlzLnRhYlNpemUgPSB0YWJTaXplIHx8IDgKICB0aGlzLmxhc3RDb2x1bW5Qb3MgPSB0aGlzLmxhc3RDb2x1bW5WYWx1ZSA9IDAKICB0aGlzLmxpbmVTdGFydCA9IDAKfQoKU3RyaW5nU3RyZWFtLnByb3RvdHlwZSA9IHsKICBlb2w6IGZ1bmN0aW9uKCkge3JldHVybiB0aGlzLnBvcyA+PSB0aGlzLnN0cmluZy5sZW5ndGh9LAogIHNvbDogZnVuY3Rpb24oKSB7cmV0dXJuIHRoaXMucG9zID09IHRoaXMubGluZVN0YXJ0fSwKICBwZWVrOiBmdW5jdGlvbigpIHtyZXR1cm4gdGhpcy5zdHJpbmcuY2hhckF0KHRoaXMucG9zKSB8fCB1bmRlZmluZWR9LAogIG5leHQ6IGZ1bmN0aW9uKCkgewogICAgaWYgKHRoaXMucG9zIDwgdGhpcy5zdHJpbmcubGVuZ3RoKQogICAgICByZXR1cm4gdGhpcy5zdHJpbmcuY2hhckF0KHRoaXMucG9zKyspCiAgfSwKICBlYXQ6IGZ1bmN0aW9uKG1hdGNoKSB7CiAgICBsZXQgY2ggPSB0aGlzLnN0cmluZy5jaGFyQXQodGhpcy5wb3MpCiAgICBsZXQgb2sKICAgIGlmICh0eXBlb2YgbWF0Y2ggPT0gInN0cmluZyIpIG9rID0gY2ggPT0gbWF0Y2gKICAgIGVsc2Ugb2sgPSBjaCAmJiAobWF0Y2gudGVzdCA/IG1hdGNoLnRlc3QoY2gpIDogbWF0Y2goY2gpKQogICAgaWYgKG9rKSB7Kyt0aGlzLnBvczsgcmV0dXJuIGNofQogIH0sCiAgZWF0V2hpbGU6IGZ1bmN0aW9uKG1hdGNoKSB7CiAgICBsZXQgc3RhcnQgPSB0aGlzLnBvcwogICAgd2hpbGUgKHRoaXMuZWF0KG1hdGNoKSl7fQogICAgcmV0dXJuIHRoaXMucG9zID4gc3RhcnQKICB9LAogIGVhdFNwYWNlOiBmdW5jdGlvbigpIHsKICAgIGxldCBzdGFydCA9IHRoaXMucG9zCiAgICB3aGlsZSAoL1tcc1x1MDBhMF0vLnRlc3QodGhpcy5zdHJpbmcuY2hhckF0KHRoaXMucG9zKSkpICsrdGhpcy5wb3MKICAgIHJldHVybiB0aGlzLnBvcyA+IHN0YXJ0CiAgfSwKICBza2lwVG9FbmQ6IGZ1bmN0aW9uKCkge3RoaXMucG9zID0gdGhpcy5zdHJpbmcubGVuZ3RofSwKICBza2lwVG86IGZ1bmN0aW9uKGNoKSB7CiAgICBsZXQgZm91bmQgPSB0aGlzLnN0cmluZy5pbmRleE9mKGNoLCB0aGlzLnBvcykKICAgIGlmIChmb3VuZCA+IC0xKSB7dGhpcy5wb3MgPSBmb3VuZDsgcmV0dXJuIHRydWV9CiAgfSwKICBiYWNrVXA6IGZ1bmN0aW9uKG4pIHt0aGlzLnBvcyAtPSBufSwKICBjb2x1bW46IGZ1bmN0aW9uKCkgewogICAgaWYgKHRoaXMubGFzdENvbHVtblBvcyA8IHRoaXMuc3RhcnQpIHsKICAgICAgdGhpcy5sYXN0Q29sdW1uVmFsdWUgPSBjb3VudENvbHVtbih0aGlzLnN0cmluZywgdGhpcy5zdGFydCwgdGhpcy50YWJTaXplLCB0aGlzLmxhc3RDb2x1bW5Qb3MsIHRoaXMubGFzdENvbHVtblZhbHVlKQogICAgICB0aGlzLmxhc3RDb2x1bW5Qb3MgPSB0aGlzLnN0YXJ0CiAgICB9CiAgICByZXR1cm4gdGhpcy5sYXN0Q29sdW1uVmFsdWUgLSAodGhpcy5saW5lU3RhcnQgPyBjb3VudENvbHVtbih0aGlzLnN0cmluZywgdGhpcy5saW5lU3RhcnQsIHRoaXMudGFiU2l6ZSkgOiAwKQogIH0sCiAgaW5kZW50YXRpb246IGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIGNvdW50Q29sdW1uKHRoaXMuc3RyaW5nLCBudWxsLCB0aGlzLnRhYlNpemUpIC0KICAgICAgKHRoaXMubGluZVN0YXJ0ID8gY291bnRDb2x1bW4odGhpcy5zdHJpbmcsIHRoaXMubGluZVN0YXJ0LCB0aGlzLnRhYlNpemUpIDogMCkKICB9LAogIG1hdGNoOiBmdW5jdGlvbihwYXR0ZXJuLCBjb25zdW1lLCBjYXNlSW5zZW5zaXRpdmUpIHsKICAgIGlmICh0eXBlb2YgcGF0dGVybiA9PSAic3RyaW5nIikgewogICAgICBsZXQgY2FzZWQgPSBzdHIgPT4gY2FzZUluc2Vuc2l0aXZlID8gc3RyLnRvTG93ZXJDYXNlKCkgOiBzdHIKICAgICAgbGV0IHN1YnN0ciA9IHRoaXMuc3RyaW5nLnN1YnN0cih0aGlzLnBvcywgcGF0dGVybi5sZW5ndGgpCiAgICAgIGlmIChjYXNlZChzdWJzdHIpID09IGNhc2VkKHBhdHRlcm4pKSB7CiAgICAgICAgaWYgKGNvbnN1bWUgIT09IGZhbHNlKSB0aGlzLnBvcyArPSBwYXR0ZXJuLmxlbmd0aAogICAgICAgIHJldHVybiB0cnVlCiAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgIGxldCBtYXRjaCA9IHRoaXMuc3RyaW5nLnNsaWNlKHRoaXMucG9zKS5tYXRjaChwYXR0ZXJuKQogICAgICBpZiAobWF0Y2ggJiYgbWF0Y2guaW5kZXggPiAwKSByZXR1cm4gbnVsbAogICAgICBpZiAobWF0Y2ggJiYgY29uc3VtZSAhPT0gZmFsc2UpIHRoaXMucG9zICs9IG1hdGNoWzBdLmxlbmd0aAogICAgICByZXR1cm4gbWF0Y2gKICAgIH0KICB9LAogIGN1cnJlbnQ6IGZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuc3RyaW5nLnNsaWNlKHRoaXMuc3RhcnQsIHRoaXMucG9zKX0sCiAgaGlkZUZpcnN0Q2hhcnM6IGZ1bmN0aW9uKG4sIGlubmVyKSB7CiAgICB0aGlzLmxpbmVTdGFydCArPSBuCiAgICB0cnkgeyByZXR1cm4gaW5uZXIoKSB9CiAgICBmaW5hbGx5IHsgdGhpcy5saW5lU3RhcnQgLT0gbiB9CiAgfQp9CgpleHBvcnQgZGVmYXVsdCBTdHJpbmdTdHJlYW0K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/test/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/test/comment_test.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[bmFtZXNwYWNlID0gImNvbW1lbnRfIjsKCihmdW5jdGlvbigpIHsKICBmdW5jdGlvbiB0ZXN0KG5hbWUsIG1vZGUsIHJ1biwgYmVmb3JlLCBhZnRlcikgewogICAgcmV0dXJuIHRlc3RDTShuYW1lLCBmdW5jdGlvbihjbSkgewogICAgICBydW4oY20pOwogICAgICBlcShjbS5nZXRWYWx1ZSgpLCBhZnRlcik7CiAgICB9LCB7dmFsdWU6IGJlZm9yZSwgbW9kZTogbW9kZX0pOwogIH0KCiAgdmFyIHNpbXBsZVByb2cgPSAiZnVuY3Rpb24gZm9vKCkge1xuICByZXR1cm4gYmFyO1xufSI7CiAgdmFyIGlubGluZUJsb2NrID0gImZvbygvKiBiYXIgKi8gdHJ1ZSk7IjsKICB2YXIgaW5saW5lQmxvY2tzID0gImZvbygvKiBiYXIgKi8gdHJ1ZSwgLyogYmF6ICovIGZhbHNlKTsiOwogIHZhciBtdWx0aUxpbmVJbmxpbmVCbG9jayA9IFsiYWJvdmUoKTsiLCAiZm9vKC8qIGJhciAqLyB0cnVlKTsiLCAiYmVsb3coKTsiXTsKCiAgdGVzdCgiYmxvY2siLCAiamF2YXNjcmlwdCIsIGZ1bmN0aW9uKGNtKSB7CiAgICBjbS5ibG9ja0NvbW1lbnQoUG9zKDAsIDMpLCBQb3MoMywgMCksIHtibG9ja0NvbW1lbnRMZWFkOiAiICoifSk7CiAgfSwgc2ltcGxlUHJvZyArICJcbiIsICIvKiBmdW5jdGlvbiBmb28oKSB7XG4gKiAgIHJldHVybiBiYXI7XG4gKiB9XG4gKi8iKTsKCiAgdGVzdCgiYmxvY2tUb2dnbGUiLCAiamF2YXNjcmlwdCIsIGZ1bmN0aW9uKGNtKSB7CiAgICBjbS5ibG9ja0NvbW1lbnQoUG9zKDAsIDMpLCBQb3MoMiwgMCksIHtibG9ja0NvbW1lbnRMZWFkOiAiICoifSk7CiAgICBjbS51bmNvbW1lbnQoUG9zKDAsIDMpLCBQb3MoMiwgMCksIHtibG9ja0NvbW1lbnRMZWFkOiAiICoifSk7CiAgfSwgc2ltcGxlUHJvZywgc2ltcGxlUHJvZyk7CgogIHRlc3QoImJsb2NrVG9nZ2xlMiIsICJqYXZhc2NyaXB0IiwgZnVuY3Rpb24oY20pIHsKICAgIGNtLnNldEN1cnNvcih7bGluZTogMCwgY2g6IDcgLyogaW5zaWRlIHRoZSBibG9jayBjb21tZW50ICovfSk7CiAgICBjbS5leGVjQ29tbWFuZCgidG9nZ2xlQ29tbWVudCIpOwogIH0sIGlubGluZUJsb2NrLCAiZm9vKGJhciB0cnVlKTsiKTsKCiAgLy8gVGhpcyB0ZXN0IHNob3VsZCB3b3JrIGJ1dCBjdXJyZW50bHkgZmFpbHMuCiAgLy8gdGVzdCgiYmxvY2tUb2dnbGUzIiwgImphdmFzY3JpcHQiLCBmdW5jdGlvbihjbSkgewogIC8vICAgY20uc2V0Q3Vyc29yKHtsaW5lOiAwLCBjaDogNyAvKiBpbnNpZGUgdGhlIGZpcnN0IGJsb2NrIGNvbW1lbnQgKi99KTsKICAvLyAgIGNtLmV4ZWNDb21tYW5kKCJ0b2dnbGVDb21tZW50Iik7CiAgLy8gfSwgaW5saW5lQmxvY2tzLCAiZm9vKGJhciB0cnVlLCAvKiBiYXogKi8gZmFsc2UpOyIpOwoKICB0ZXN0KCJsaW5lIiwgImphdmFzY3JpcHQiLCBmdW5jdGlvbihjbSkgewogICAgY20ubGluZUNvbW1lbnQoUG9zKDEsIDEpLCBQb3MoMSwgMSkpOwogIH0sIHNpbXBsZVByb2csICJmdW5jdGlvbiBmb28oKSB7XG4vLyAgIHJldHVybiBiYXI7XG59Iik7CgogIHRlc3QoImxpbmVUb2dnbGUiLCAiamF2YXNjcmlwdCIsIGZ1bmN0aW9uKGNtKSB7CiAgICBjbS5saW5lQ29tbWVudChQb3MoMCwgMCksIFBvcygyLCAxKSk7CiAgICBjbS51bmNvbW1lbnQoUG9zKDAsIDApLCBQb3MoMiwgMSkpOwogIH0sIHNpbXBsZVByb2csIHNpbXBsZVByb2cpOwoKICB0ZXN0KCJmYWxsYmFja1RvQmxvY2siLCAiY3NzIiwgZnVuY3Rpb24oY20pIHsKICAgIGNtLmxpbmVDb21tZW50KFBvcygwLCAwKSwgUG9zKDIsIDEpKTsKICB9LCAiaHRtbCB7XG4gIGJvcmRlcjogbm9uZTtcbn0iLCAiLyogaHRtbCB7XG4gIGJvcmRlcjogbm9uZTtcbn0gKi8iKTsKCiAgdGVzdCgiZmFsbGJhY2tUb0xpbmUiLCAicnVieSIsIGZ1bmN0aW9uKGNtKSB7CiAgICBjbS5ibG9ja0NvbW1lbnQoUG9zKDAsIDApLCBQb3MoMSkpOwogIH0sICJkZWYgYmxhaCgpXG4gIHJldHVybiBoYWhcbiIsICIjIGRlZiBibGFoKClcbiMgICByZXR1cm4gaGFoXG4iKTsKCiAgdGVzdCgiaWdub3JlRXh0ZXJuYWxCbG9ja0NvbW1lbnRzIiwgImphdmFzY3JpcHQiLCBmdW5jdGlvbihjbSkgewogICAgY20uZXhlY0NvbW1hbmQoInRvZ2dsZUNvbW1lbnQiKTsKICB9LCBpbmxpbmVCbG9ja3MsICIvLyAiICsgaW5saW5lQmxvY2tzKTsKCiAgdGVzdCgiaWdub3JlRXh0ZXJuYWxCbG9ja0NvbW1lbnRzMiIsICJqYXZhc2NyaXB0IiwgZnVuY3Rpb24oY20pIHsKICAgIGNtLnNldEN1cnNvcih7bGluZTogMCwgY2g6IG51bGwgLyogZW9sICovfSk7CiAgICBjbS5leGVjQ29tbWFuZCgidG9nZ2xlQ29tbWVudCIpOwogIH0sIGlubGluZUJsb2NrcywgIi8vICIgKyBpbmxpbmVCbG9ja3MpOwoKICB0ZXN0KCJpZ25vcmVFeHRlcm5hbEJsb2NrQ29tbWVudHNNdWx0aUxpbmVBYm92ZSIsICJqYXZhc2NyaXB0IiwgZnVuY3Rpb24oY20pIHsKICAgIGNtLnNldFNlbGVjdGlvbih7bGluZTogMCwgY2g6IDB9LCB7bGluZTogMSwgY2g6IDF9KTsKICAgIGNtLmV4ZWNDb21tYW5kKCJ0b2dnbGVDb21tZW50Iik7CiAgfSwgbXVsdGlMaW5lSW5saW5lQmxvY2suam9pbigiXG4iKSwgWyIvLyAiICsgbXVsdGlMaW5lSW5saW5lQmxvY2tbMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvLyAiICsgbXVsdGlMaW5lSW5saW5lQmxvY2tbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpTGluZUlubGluZUJsb2NrWzJdXS5qb2luKCJcbiIpKTsKCiAgdGVzdCgiaWdub3JlRXh0ZXJuYWxCbG9ja0NvbW1lbnRzTXVsdGlMaW5lQmVsb3ciLCAiamF2YXNjcmlwdCIsIGZ1bmN0aW9uKGNtKSB7CiAgICBjbS5zZXRTZWxlY3Rpb24oe2xpbmU6IDEsIGNoOiAxMyAvKiBhZnRlciBlbmQgb2YgYmxvY2sgY29tbWVudCAqL30sIHtsaW5lOiAyLCBjaDogMX0pOwogICAgY20uZXhlY0NvbW1hbmQoInRvZ2dsZUNvbW1lbnQiKTsKICB9LCBtdWx0aUxpbmVJbmxpbmVCbG9jay5qb2luKCJcbiIpLCBbbXVsdGlMaW5lSW5saW5lQmxvY2tbMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvLyAiICsgbXVsdGlMaW5lSW5saW5lQmxvY2tbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvLyAiICsgbXVsdGlMaW5lSW5saW5lQmxvY2tbMl1dLmpvaW4oIlxuIikpOwoKICB0ZXN0KCJjb21tZW50UmFuZ2UiLCAiamF2YXNjcmlwdCIsIGZ1bmN0aW9uKGNtKSB7CiAgICBjbS5ibG9ja0NvbW1lbnQoUG9zKDEsIDIpLCBQb3MoMSwgMTMpLCB7ZnVsbExpbmVzOiBmYWxzZX0pOwogIH0sIHNpbXBsZVByb2csICJmdW5jdGlvbiBmb28oKSB7XG4gIC8qcmV0dXJuIGJhcjsqL1xufSIpOwoKICB0ZXN0KCJpbmRlbnRlZCIsICJqYXZhc2NyaXB0IiwgZnVuY3Rpb24oY20pIHsKICAgIGNtLmxpbmVDb21tZW50KFBvcygxLCAwKSwgUG9zKDIpLCB7aW5kZW50OiB0cnVlfSk7CiAgfSwgc2ltcGxlUHJvZywgImZ1bmN0aW9uIGZvbygpIHtcbi8vICAgcmV0dXJuIGJhcjtcbi8vIH0iKTsKCiAgdGVzdCgic2luZ2xlRW1wdHlMaW5lIiwgImphdmFzY3JpcHQiLCBmdW5jdGlvbihjbSkgewogICAgY20uc2V0Q3Vyc29yKDEpOwogICAgY20uZXhlY0NvbW1hbmQoInRvZ2dsZUNvbW1lbnQiKTsKICB9LCAiYTtcblxuYjsiLCAiYTtcbi8vIFxuYjsiKTsKCiAgdGVzdCgiZG9udE1lc3NXaXRoU3RyaW5ncyIsICJqYXZhc2NyaXB0IiwgZnVuY3Rpb24oY20pIHsKICAgIGNtLmV4ZWNDb21tYW5kKCJ0b2dnbGVDb21tZW50Iik7CiAgfSwgImNvbnNvbGUubG9nKFwiLypzdHJpbmcqL1wiKTsiLCAiLy8gY29uc29sZS5sb2coXCIvKnN0cmluZyovXCIpOyIpOwoKICB0ZXN0KCJkb250TWVzc1dpdGhTdHJpbmdzMiIsICJqYXZhc2NyaXB0IiwgZnVuY3Rpb24oY20pIHsKICAgIGNtLmV4ZWNDb21tYW5kKCJ0b2dnbGVDb21tZW50Iik7CiAgfSwgImNvbnNvbGUubG9nKFwiLy8gc3RyaW5nXCIpOyIsICIvLyBjb25zb2xlLmxvZyhcIi8vIHN0cmluZ1wiKTsiKTsKCiAgdGVzdCgiZG9udE1lc3NXaXRoU3RyaW5nczMiLCAiamF2YXNjcmlwdCIsIGZ1bmN0aW9uKGNtKSB7CiAgICBjbS5leGVjQ29tbWFuZCgidG9nZ2xlQ29tbWVudCIpOwogIH0sICIvLyBjb25zb2xlLmxvZyhcIi8vIHN0cmluZ1wiKTsiLCAiY29uc29sZS5sb2coXCIvLyBzdHJpbmdcIik7Iik7CgogIHRlc3QoImluY2x1ZGVMYXN0TGluZSIsICJqYXZhc2NyaXB0IiwgZnVuY3Rpb24oY20pIHsKICAgIGNtLmV4ZWNDb21tYW5kKCJzZWxlY3RBbGwiKQogICAgY20uZXhlY0NvbW1hbmQoInRvZ2dsZUNvbW1lbnQiKQogIH0sICIvLyBmb29cbi8vIGJhclxuYmF6IiwgIi8vIC8vIGZvb1xuLy8gLy8gYmFyXG4vLyBiYXoiKQoKICB0ZXN0KCJ1bmNvbW1lbnRXaXRoVHJhaWxpbmdCbG9ja0VuZCIsICJ4bWwiLCBmdW5jdGlvbihjbSkgewogICAgY20uZXhlY0NvbW1hbmQoInRvZ2dsZUNvbW1lbnQiKQogIH0sICI8IS0tIGZvbyAtLT4gLS0+IiwgImZvbyAtLT4iKQoKICB0ZXN0KCJkb250Q29tbWVudEluQ29tbWVudCIsICJ4bWwiLCBmdW5jdGlvbihjbSkgewogICAgY20uc2V0Q3Vyc29yKDEsIDApCiAgICBjbS5leGVjQ29tbWFuZCgidG9nZ2xlQ29tbWVudCIpCiAgfSwgIjwhLS0gZm9vXG5iYXIgLS0+IiwgIjwhLS0gZm9vXG5iYXIgLS0+IikKfSkoKTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/test/doc_test.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKCkgewogIC8vIEEgbWluaWxhbmd1YWdlIGZvciBpbnN0YW50aWF0aW5nIGxpbmtlZCBDb2RlTWlycm9yIGluc3RhbmNlcyBhbmQgRG9jcwogIGZ1bmN0aW9uIGluc3RhbnRpYXRlU3BlYyhzcGVjLCBwbGFjZSwgb3B0cykgewogICAgdmFyIG5hbWVzID0ge30sIHBvcyA9IDAsIGwgPSBzcGVjLmxlbmd0aCwgZWRpdG9ycyA9IFtdOwogICAgd2hpbGUgKHNwZWMpIHsKICAgICAgdmFyIG0gPSBzcGVjLm1hdGNoKC9eKFx3KykoXCo/KSg/Oj0nKFteXCddKiknfDwofj8pKFx3KykoPzpcLyhcZCspLShcZCspKT8pXHMqLyk7CiAgICAgIHZhciBuYW1lID0gbVsxXSwgaXNEb2MgPSBtWzJdLCBjdXI7CiAgICAgIGlmIChtWzNdKSB7CiAgICAgICAgY3VyID0gaXNEb2MgPyBDb2RlTWlycm9yLkRvYyhtWzNdKSA6IENvZGVNaXJyb3IocGxhY2UsIGNsb25lKG9wdHMsIHt2YWx1ZTogbVszXX0pKTsKICAgICAgfSBlbHNlIHsKICAgICAgICB2YXIgb3RoZXIgPSBtWzVdOwogICAgICAgIGlmICghbmFtZXMuaGFzT3duUHJvcGVydHkob3RoZXIpKSB7CiAgICAgICAgICBuYW1lc1tvdGhlcl0gPSBlZGl0b3JzLmxlbmd0aDsKICAgICAgICAgIGVkaXRvcnMucHVzaChDb2RlTWlycm9yKHBsYWNlLCBvcHRzKSk7CiAgICAgICAgfQogICAgICAgIHZhciBkb2MgPSBlZGl0b3JzW25hbWVzW290aGVyXV0ubGlua2VkRG9jKHsKICAgICAgICAgIHNoYXJlZEhpc3Q6ICFtWzRdLAogICAgICAgICAgZnJvbTogbVs2XSA/IE51bWJlcihtWzZdKSA6IG51bGwsCiAgICAgICAgICB0bzogbVs3XSA/IE51bWJlcihtWzddKSA6IG51bGwKICAgICAgICB9KTsKICAgICAgICBjdXIgPSBpc0RvYyA/IGRvYyA6IENvZGVNaXJyb3IocGxhY2UsIGNsb25lKG9wdHMsIHt2YWx1ZTogZG9jfSkpOwogICAgICB9CiAgICAgIG5hbWVzW25hbWVdID0gZWRpdG9ycy5sZW5ndGg7CiAgICAgIGVkaXRvcnMucHVzaChjdXIpOwogICAgICBzcGVjID0gc3BlYy5zbGljZShtWzBdLmxlbmd0aCk7CiAgICB9CiAgICByZXR1cm4gZWRpdG9yczsKICB9CgogIGZ1bmN0aW9uIGNsb25lKG9iaiwgcHJvcHMpIHsKICAgIGlmICghb2JqKSByZXR1cm47CiAgICBjbG9uZS5wcm90b3R5cGUgPSBvYmo7CiAgICB2YXIgaW5zdCA9IG5ldyBjbG9uZSgpOwogICAgaWYgKHByb3BzKSBmb3IgKHZhciBuIGluIHByb3BzKSBpZiAocHJvcHMuaGFzT3duUHJvcGVydHkobikpCiAgICAgIGluc3Rbbl0gPSBwcm9wc1tuXTsKICAgIHJldHVybiBpbnN0OwogIH0KCiAgZnVuY3Rpb24gZXFBbGwodmFsKSB7CiAgICB2YXIgZW5kID0gYXJndW1lbnRzLmxlbmd0aCwgbXNnID0gbnVsbDsKICAgIGlmICh0eXBlb2YgYXJndW1lbnRzW2VuZC0xXSA9PSAic3RyaW5nIikKICAgICAgbXNnID0gYXJndW1lbnRzWy0tZW5kXTsKICAgIGlmIChpID09IGVuZCkgdGhyb3cgbmV3IEVycm9yKCJObyBlZGl0b3JzIHByb3ZpZGVkIHRvIGVxQWxsIik7CiAgICBmb3IgKHZhciBpID0gMTsgaSA8IGVuZDsgKytpKQogICAgICBlcShhcmd1bWVudHNbaV0uZ2V0VmFsdWUoKSwgdmFsLCBtc2cpCiAgfQoKICBmdW5jdGlvbiB0ZXN0RG9jKG5hbWUsIHNwZWMsIHJ1biwgb3B0cywgZXhwZWN0RmFpbCkgewogICAgaWYgKCFvcHRzKSBvcHRzID0ge307CgogICAgcmV0dXJuIHRlc3QoImRvY18iICsgbmFtZSwgZnVuY3Rpb24oKSB7CiAgICAgIHZhciBwbGFjZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0ZXN0Z3JvdW5kIik7CiAgICAgIHZhciBlZGl0b3JzID0gaW5zdGFudGlhdGVTcGVjKHNwZWMsIHBsYWNlLCBvcHRzKTsKICAgICAgdmFyIHN1Y2Nlc3NmdWwgPSBmYWxzZTsKCiAgICAgIHRyeSB7CiAgICAgICAgcnVuLmFwcGx5KG51bGwsIGVkaXRvcnMpOwogICAgICAgIHN1Y2Nlc3NmdWwgPSB0cnVlOwogICAgICB9IGZpbmFsbHkgewogICAgICAgIGlmICghc3VjY2Vzc2Z1bCB8fCB2ZXJib3NlKSB7CiAgICAgICAgICBwbGFjZS5zdHlsZS52aXNpYmlsaXR5ID0gInZpc2libGUiOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVkaXRvcnMubGVuZ3RoOyArK2kpCiAgICAgICAgICAgIGlmIChlZGl0b3JzW2ldIGluc3RhbmNlb2YgQ29kZU1pcnJvcikKICAgICAgICAgICAgICBwbGFjZS5yZW1vdmVDaGlsZChlZGl0b3JzW2ldLmdldFdyYXBwZXJFbGVtZW50KCkpOwogICAgICAgIH0KICAgICAgfQogICAgfSwgZXhwZWN0RmFpbCk7CiAgfQoKICB2YXIgaWVfbHQ4ID0gL01TSUUgWzEtN11cYi8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTsKCiAgZnVuY3Rpb24gdGVzdEJhc2ljKGEsIGIpIHsKICAgIGVxQWxsKCJ4IiwgYSwgYik7CiAgICBhLnNldFZhbHVlKCJoZXkiKTsKICAgIGVxQWxsKCJoZXkiLCBhLCBiKTsKICAgIGIuc2V0VmFsdWUoIndvdyIpOwogICAgZXFBbGwoIndvdyIsIGEsIGIpOwogICAgYS5yZXBsYWNlUmFuZ2UoInVcbnZcbnciLCBQb3MoMCwgMykpOwogICAgYi5yZXBsYWNlUmFuZ2UoImkiLCBQb3MoMCwgNCkpOwogICAgYi5yZXBsYWNlUmFuZ2UoImoiLCBQb3MoMiwgMSkpOwogICAgZXFBbGwoIndvd3VpXG52XG53aiIsIGEsIGIpOwogIH0KCiAgdGVzdERvYygiYmFzaWMiLCAiQT0neCcgQjxBIiwgdGVzdEJhc2ljKTsKICB0ZXN0RG9jKCJiYXNpY1NlcGFyYXRlIiwgIkE9J3gnIEI8fkEiLCB0ZXN0QmFzaWMpOwoKICB0ZXN0RG9jKCJzaGFyZWRIaXN0IiwgIkE9J2FiXG5jZFxuZWYnIEI8QSIsIGZ1bmN0aW9uKGEsIGIpIHsKICAgIGEucmVwbGFjZVJhbmdlKCJ4IiwgUG9zKDApKTsKICAgIGIucmVwbGFjZVJhbmdlKCJ5IiwgUG9zKDEpKTsKICAgIGEucmVwbGFjZVJhbmdlKCJ6IiwgUG9zKDIpKTsKICAgIGVxQWxsKCJhYnhcbmNkeVxuZWZ6IiwgYSwgYik7CiAgICBhLnVuZG8oKTsKICAgIGEudW5kbygpOwogICAgZXFBbGwoImFieFxuY2RcbmVmIiwgYSwgYik7CiAgICBhLnJlZG8oKTsKICAgIGVxQWxsKCJhYnhcbmNkeVxuZWYiLCBhLCBiKTsKICAgIGIucmVkbygpOwogICAgZXFBbGwoImFieFxuY2R5XG5lZnoiLCBhLCBiKTsKICAgIGEudW5kbygpOyBiLnVuZG8oKTsgYS51bmRvKCk7IGEudW5kbygpOwogICAgZXFBbGwoImFiXG5jZFxuZWYiLCBhLCBiKTsKICB9LCBudWxsLCBpZV9sdDgpOwoKICB0ZXN0RG9jKCJ1bmRvSW50YWN0IiwgIkE9J2FiXG5jZFxuZWYnIEI8fkEiLCBmdW5jdGlvbihhLCBiKSB7CiAgICBhLnJlcGxhY2VSYW5nZSgieCIsIFBvcygwKSk7CiAgICBiLnJlcGxhY2VSYW5nZSgieSIsIFBvcygxKSk7CiAgICBhLnJlcGxhY2VSYW5nZSgieiIsIFBvcygyKSk7CiAgICBhLnJlcGxhY2VSYW5nZSgicSIsIFBvcygwKSk7CiAgICBlcUFsbCgiYWJ4cVxuY2R5XG5lZnoiLCBhLCBiKTsKICAgIGEudW5kbygpOwogICAgYS51bmRvKCk7CiAgICBlcUFsbCgiYWJ4XG5jZHlcbmVmIiwgYSwgYik7CiAgICBiLnVuZG8oKTsKICAgIGVxQWxsKCJhYnhcbmNkXG5lZiIsIGEsIGIpOwogICAgYS5yZWRvKCk7CiAgICBlcUFsbCgiYWJ4XG5jZFxuZWZ6IiwgYSwgYik7CiAgICBhLnJlZG8oKTsKICAgIGVxQWxsKCJhYnhxXG5jZFxuZWZ6IiwgYSwgYik7CiAgICBhLnVuZG8oKTsgYS51bmRvKCk7IGEudW5kbygpOyBhLnVuZG8oKTsKICAgIGVxQWxsKCJhYlxuY2RcbmVmIiwgYSwgYik7CiAgICBiLnJlZG8oKTsKICAgIGVxQWxsKCJhYlxuY2R5XG5lZiIsIGEsIGIpOwogIH0pOwoKICB0ZXN0RG9jKCJ1bmRvQ29uZmxpY3QiLCAiQT0nYWJcbmNkXG5lZicgQjx+QSIsIGZ1bmN0aW9uKGEsIGIpIHsKICAgIGEucmVwbGFjZVJhbmdlKCJ4IiwgUG9zKDApKTsKICAgIGEucmVwbGFjZVJhbmdlKCJ6IiwgUG9zKDIpKTsKICAgIC8vIFRoaXMgc2hvdWxkIGNsZWFyIHRoZSBmaXJzdCB1bmRvIGV2ZW50IGluIGEsIGJ1dCBub3QgdGhlIHNlY29uZAogICAgYi5yZXBsYWNlUmFuZ2UoInkiLCBQb3MoMCkpOwogICAgYS51bmRvKCk7IGEudW5kbygpOwogICAgZXFBbGwoImFieHlcbmNkXG5lZiIsIGEsIGIpOwogICAgYS5yZXBsYWNlUmFuZ2UoInUiLCBQb3MoMikpOwogICAgYS5yZXBsYWNlUmFuZ2UoInYiLCBQb3MoMCkpOwogICAgLy8gVGhpcyBzaG91bGQgY2xlYXIgYm90aCBldmVudHMgaW4gYQogICAgYi5yZXBsYWNlUmFuZ2UoInciLCBQb3MoMCkpOwogICAgYS51bmRvKCk7IGEudW5kbygpOwogICAgZXFBbGwoImFieHl2d1xuY2RcbmVmdSIsIGEsIGIpOwogIH0pOwoKICB0ZXN0RG9jKCJkb3VibGVSZWJhc2UiLCAiQT0nYWJcbmNkXG5lZlxuZycgQjx+QSBDPEIiLCBmdW5jdGlvbihhLCBiLCBjKSB7CiAgICBjLnJlcGxhY2VSYW5nZSgidSIsIFBvcygzKSk7CiAgICBhLnJlcGxhY2VSYW5nZSgiIiwgUG9zKDAsIDApLCBQb3MoMSwgMCkpOwogICAgYy51bmRvKCk7CiAgICBlcUFsbCgiY2RcbmVmXG5nIiwgYSwgYiwgYyk7CiAgfSk7CgogIHRlc3REb2MoInVuZG9VcGRhdGUiLCAiQT0nYWJcbmNkXG5lZicgQjx+QSIsIGZ1bmN0aW9uKGEsIGIpIHsKICAgIGEucmVwbGFjZVJhbmdlKCJ4IiwgUG9zKDIpKTsKICAgIGIucmVwbGFjZVJhbmdlKCJ1XG52XG53XG4iLCBQb3MoMCwgMCkpOwogICAgYS51bmRvKCk7CiAgICBlcUFsbCgidVxudlxud1xuYWJcbmNkXG5lZiIsIGEsIGIpOwogICAgYS5yZWRvKCk7CiAgICBlcUFsbCgidVxudlxud1xuYWJcbmNkXG5lZngiLCBhLCBiKTsKICAgIGEudW5kbygpOwogICAgZXFBbGwoInVcbnZcbndcbmFiXG5jZFxuZWYiLCBhLCBiKTsKICAgIGIudW5kbygpOwogICAgYS5yZWRvKCk7CiAgICBlcUFsbCgiYWJcbmNkXG5lZngiLCBhLCBiKTsKICAgIGEudW5kbygpOwogICAgZXFBbGwoImFiXG5jZFxuZWYiLCBhLCBiKTsKICB9KTsKCiAgdGVzdERvYygidW5kb0tlZXBSYW5nZXMiLCAiQT0nYWJjZGVmZycgQjxBIiwgZnVuY3Rpb24oYSwgYikgewogICAgdmFyIG0gPSBhLm1hcmtUZXh0KFBvcygwLCAxKSwgUG9zKDAsIDMpLCB7Y2xhc3NOYW1lOiAiZm9vIn0pOwogICAgYi5yZXBsYWNlUmFuZ2UoIngiLCBQb3MoMCwgMCkpOwogICAgZXFQb3MobS5maW5kKCkuZnJvbSwgUG9zKDAsIDIpKTsKICAgIGIucmVwbGFjZVJhbmdlKCJ5enp5IiwgUG9zKDAsIDEpLCBQb3MoMCkpOwogICAgZXEobS5maW5kKCksIG51bGwpOwogICAgYi51bmRvKCk7CiAgICBlcVBvcyhtLmZpbmQoKS5mcm9tLCBQb3MoMCwgMikpOwogICAgYi51bmRvKCk7CiAgICBlcVBvcyhtLmZpbmQoKS5mcm9tLCBQb3MoMCwgMSkpOwogIH0pOwoKICB0ZXN0RG9jKCJsb25nQ2hhaW4iLCAiQT0ndXYnIEI8QSBDPEIgRDxDIiwgZnVuY3Rpb24oYSwgYiwgYywgZCkgewogICAgYS5yZXBsYWNlU2VsZWN0aW9uKCJYIik7CiAgICBlcUFsbCgiWHV2IiwgYSwgYiwgYywgZCk7CiAgICBkLnJlcGxhY2VSYW5nZSgiWSIsIFBvcygwKSk7CiAgICBlcUFsbCgiWHV2WSIsIGEsIGIsIGMsIGQpOwogIH0pOwoKICB0ZXN0RG9jKCJicm9hZENhc3QiLCAiQjxBIEM8QSBEPEEgRTxBIiwgZnVuY3Rpb24oYSwgYiwgYywgZCwgZSkgewogICAgYi5zZXRWYWx1ZSgidXUiKTsKICAgIGVxQWxsKCJ1dSIsIGEsIGIsIGMsIGQsIGUpOwogICAgYS5yZXBsYWNlUmFuZ2UoInYiLCBQb3MoMCwgMSkpOwogICAgZXFBbGwoInV2dSIsIGEsIGIsIGMsIGQsIGUpOwogIH0pOwoKICAvLyBBIGFuZCBCIHNoYXJlIGEgaGlzdG9yeSwgQyBhbmQgRCBzaGFyZSBhIHNlcGFyYXRlIG9uZQogIHRlc3REb2MoImlzbGFuZHMiLCAiQT0neFxueVxueicgQjxBIEM8fkEgRDxDIiwgZnVuY3Rpb24oYSwgYiwgYywgZCkgewogICAgYS5yZXBsYWNlUmFuZ2UoInUiLCBQb3MoMCkpOwogICAgZC5yZXBsYWNlUmFuZ2UoInYiLCBQb3MoMikpOwogICAgYi51bmRvKCk7CiAgICBlcUFsbCgieFxueVxuenYiLCBhLCBiLCBjLCBkKTsKICAgIGMudW5kbygpOwogICAgZXFBbGwoInhcbnlcbnoiLCBhLCBiLCBjLCBkKTsKICAgIGEucmVkbygpOwogICAgZXFBbGwoInh1XG55XG56IiwgYSwgYiwgYywgZCk7CiAgICBkLnJlZG8oKTsKICAgIGVxQWxsKCJ4dVxueVxuenYiLCBhLCBiLCBjLCBkKTsKICB9KTsKCiAgdGVzdERvYygidW5saW5rIiwgIkI8QSBDPEEgRDxCIiwgZnVuY3Rpb24oYSwgYiwgYywgZCkgewogICAgYS5zZXRWYWx1ZSgiaGkiKTsKICAgIGIudW5saW5rRG9jKGEpOwogICAgZC5zZXRWYWx1ZSgiYXllIik7CiAgICBlcUFsbCgiaGkiLCBhLCBjKTsKICAgIGVxQWxsKCJheWUiLCBiLCBkKTsKICAgIGEuc2V0VmFsdWUoIm9vIik7CiAgICBlcUFsbCgib28iLCBhLCBjKTsKICAgIGVxQWxsKCJheWUiLCBiLCBkKTsKICB9KTsKCiAgdGVzdERvYygiYmFyZURvYyIsICJBKj0nZm9vJyBCKjxBIEM8QiIsIGZ1bmN0aW9uKGEsIGIsIGMpIHsKICAgIGlzKGEgaW5zdGFuY2VvZiBDb2RlTWlycm9yLkRvYyk7CiAgICBpcyhiIGluc3RhbmNlb2YgQ29kZU1pcnJvci5Eb2MpOwogICAgaXMoYyBpbnN0YW5jZW9mIENvZGVNaXJyb3IpOwogICAgZXFBbGwoImZvbyIsIGEsIGIsIGMpOwogICAgYS5yZXBsYWNlUmFuZ2UoImhleSIsIFBvcygwLCAwKSwgUG9zKDApKTsKICAgIGMucmVwbGFjZVJhbmdlKCIhIiwgUG9zKDApKTsKICAgIGVxQWxsKCJoZXkhIiwgYSwgYiwgYyk7CiAgICBiLnVubGlua0RvYyhhKTsKICAgIGIuc2V0VmFsdWUoIngiKTsKICAgIGVxQWxsKCJ4IiwgYiwgYyk7CiAgICBlcUFsbCgiaGV5ISIsIGEpOwogIH0pOwoKICB0ZXN0RG9jKCJzd2FwRG9jIiwgIkE9J2EnIEIqPSdiJyBDPEEiLCBmdW5jdGlvbihhLCBiLCBjKSB7CiAgICB2YXIgZCA9IGEuc3dhcERvYyhiKTsKICAgIGQuc2V0VmFsdWUoIngiKTsKICAgIGVxQWxsKCJ4IiwgYywgZCk7CiAgICBlcUFsbCgiYiIsIGEsIGIpOwogIH0pOwoKICB0ZXN0RG9jKCJkb2NLZWVwc1Njcm9sbCIsICJBPSd4JyBCKj0neSciLCBmdW5jdGlvbihhLCBiKSB7CiAgICBhZGREb2MoYSwgMjAwLCAyMDApOwogICAgYS5zY3JvbGxJbnRvVmlldyhQb3MoMTk5LCAyMDApKTsKICAgIHZhciBjID0gYS5zd2FwRG9jKGIpOwogICAgYS5zd2FwRG9jKGMpOwogICAgdmFyIHBvcyA9IGEuZ2V0U2Nyb2xsSW5mbygpOwogICAgaXMocG9zLmxlZnQgPiAwLCAibm90IGF0IGxlZnQiKTsKICAgIGlzKHBvcy50b3AgPiAwLCAibm90IGF0IHRvcCIpOwogIH0pOwoKICB0ZXN0RG9jKCJjb3B5RG9jIiwgIkE9J3UnIiwgZnVuY3Rpb24oYSkgewogICAgdmFyIGNvcHkgPSBhLmdldERvYygpLmNvcHkodHJ1ZSk7CiAgICBhLnNldFZhbHVlKCJmb28iKTsKICAgIGNvcHkuc2V0VmFsdWUoImJhciIpOwogICAgdmFyIG9sZCA9IGEuc3dhcERvYyhjb3B5KTsKICAgIGVxKGEuZ2V0VmFsdWUoKSwgImJhciIpOwogICAgYS51bmRvKCk7CiAgICBlcShhLmdldFZhbHVlKCksICJ1Iik7CiAgICBhLnN3YXBEb2Mob2xkKTsKICAgIGVxKGEuZ2V0VmFsdWUoKSwgImZvbyIpOwogICAgZXEob2xkLmhpc3RvcnlTaXplKCkudW5kbywgMSk7CiAgICBlcShvbGQuY29weShmYWxzZSkuaGlzdG9yeVNpemUoKS51bmRvLCAwKTsKICB9KTsKCiAgdGVzdERvYygiZG9jS2VlcHNNb2RlIiwgIkE9JzErMSciLCBmdW5jdGlvbihhKSB7CiAgICB2YXIgb3RoZXIgPSBDb2RlTWlycm9yLkRvYygiaGkiLCAidGV4dC94LW1hcmtkb3duIik7CiAgICBhLnNldE9wdGlvbigibW9kZSIsICJ0ZXh0L2phdmFzY3JpcHQiKTsKICAgIHZhciBvbGQgPSBhLnN3YXBEb2Mob3RoZXIpOwogICAgZXEoYS5nZXRPcHRpb24oIm1vZGUiKSwgInRleHQveC1tYXJrZG93biIpOwogICAgZXEoYS5nZXRNb2RlKCkubmFtZSwgIm1hcmtkb3duIik7CiAgICBhLnN3YXBEb2Mob2xkKTsKICAgIGVxKGEuZ2V0T3B0aW9uKCJtb2RlIiksICJ0ZXh0L2phdmFzY3JpcHQiKTsKICAgIGVxKGEuZ2V0TW9kZSgpLm5hbWUsICJqYXZhc2NyaXB0Iik7CiAgfSk7CgogIHRlc3REb2MoInN1YnZpZXciLCAiQT0nMVxuMlxuM1xuNFxuNScgQjx+QS8xLTMiLCBmdW5jdGlvbihhLCBiKSB7CiAgICBlcShiLmdldFZhbHVlKCksICIyXG4zIik7CiAgICBlcShiLmZpcnN0TGluZSgpLCAxKTsKICAgIGIuc2V0Q3Vyc29yKFBvcyg0KSk7CiAgICBlcVBvcyhiLmdldEN1cnNvcigpLCBQb3MoMiwgMSkpOwogICAgYS5yZXBsYWNlUmFuZ2UoIi0xXG4wXG4iLCBQb3MoMCwgMCkpOwogICAgZXEoYi5maXJzdExpbmUoKSwgMyk7CiAgICBlcVBvcyhiLmdldEN1cnNvcigpLCBQb3MoNCwgMSkpOwogICAgYS51bmRvKCk7CiAgICBlcVBvcyhiLmdldEN1cnNvcigpLCBQb3MoMiwgMSkpOwogICAgYi5yZXBsYWNlUmFuZ2UoIm95b3lcbiIsIFBvcygyLCAwKSk7CiAgICBlcShhLmdldFZhbHVlKCksICIxXG4yXG5veW95XG4zXG40XG41Iik7CiAgICBiLnVuZG8oKTsKICAgIGVxKGEuZ2V0VmFsdWUoKSwgIjFcbjJcbjNcbjRcbjUiKTsKICB9KTsKCiAgdGVzdERvYygic3Vidmlld0VkaXRPbkJvdW5kYXJ5IiwgIkE9JzExXG4yMlxuMzNcbjQ0XG41NScgQjx+QS8xLTQiLCBmdW5jdGlvbihhLCBiKSB7CiAgICBhLnJlcGxhY2VSYW5nZSgieFxueXlcbnoiLCBQb3MoMCwgMSksIFBvcygyLCAxKSk7CiAgICBlcShiLmZpcnN0TGluZSgpLCAyKTsKICAgIGVxKGIubGluZUNvdW50KCksIDIpOwogICAgZXEoYi5nZXRWYWx1ZSgpLCAiejNcbjQ0Iik7CiAgICBhLnJlcGxhY2VSYW5nZSgicVxucnJcbnMiLCBQb3MoMywgMSksIFBvcyg0LCAxKSk7CiAgICBlcShiLmZpcnN0TGluZSgpLCAyKTsKICAgIGVxKGIuZ2V0VmFsdWUoKSwgInozXG40cSIpOwogICAgZXEoYS5nZXRWYWx1ZSgpLCAiMXhcbnl5XG56M1xuNHFcbnJyXG5zNSIpOwogICAgYS5leGVjQ29tbWFuZCgic2VsZWN0QWxsIik7CiAgICBhLnJlcGxhY2VTZWxlY3Rpb24oIiEiKTsKICAgIGVxQWxsKCIhIiwgYSwgYik7CiAgfSk7CgoKICB0ZXN0RG9jKCJzaGFyZWRNYXJrZXIiLCAiQT0nYWJcbmNkXG5lZlxuZ2gnIEI8QSBDPH5BLzEtMiIsIGZ1bmN0aW9uKGEsIGIsIGMpIHsKICAgIHZhciBtYXJrID0gYi5tYXJrVGV4dChQb3MoMCwgMSksIFBvcygzLCAxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiAiY20tc2VhcmNoaW5nIiwgc2hhcmVkOiB0cnVlfSk7CiAgICB2YXIgZm91bmQgPSBhLmZpbmRNYXJrc0F0KFBvcygwLCAyKSk7CiAgICBlcShmb3VuZC5sZW5ndGgsIDEpOwogICAgZXEoZm91bmRbMF0sIG1hcmspOwogICAgZXEoYy5maW5kTWFya3NBdChQb3MoMSwgMSkpLmxlbmd0aCwgMSk7CiAgICBlcVBvcyhtYXJrLmZpbmQoKS5mcm9tLCBQb3MoMCwgMSkpOwogICAgZXFQb3MobWFyay5maW5kKCkudG8sIFBvcygzLCAxKSk7CiAgICBiLnJlcGxhY2VSYW5nZSgieFxueVxuIiwgUG9zKDAsIDApKTsKICAgIGVxUG9zKG1hcmsuZmluZCgpLmZyb20sIFBvcygyLCAxKSk7CiAgICBlcVBvcyhtYXJrLmZpbmQoKS50bywgUG9zKDUsIDEpKTsKICAgIHZhciBjbGVhcmVkID0gMDsKICAgIENvZGVNaXJyb3Iub24obWFyaywgImNsZWFyIiwgZnVuY3Rpb24oKSB7KytjbGVhcmVkO30pOwogICAgYi5vcGVyYXRpb24oZnVuY3Rpb24oKXttYXJrLmNsZWFyKCk7fSk7CiAgICBlcShhLmZpbmRNYXJrc0F0KFBvcygzLCAxKSkubGVuZ3RoLCAwKTsKICAgIGVxKGIuZmluZE1hcmtzQXQoUG9zKDMsIDEpKS5sZW5ndGgsIDApOwogICAgZXEoYy5maW5kTWFya3NBdChQb3MoMywgMSkpLmxlbmd0aCwgMCk7CiAgICBlcShtYXJrLmZpbmQoKSwgbnVsbCk7CiAgICBlcShjbGVhcmVkLCAxKTsKICB9KTsKCiAgdGVzdERvYygic2hhcmVkTWFya2VyQ29weSIsICJBPSdhYmNkZSciLCBmdW5jdGlvbihhKSB7CiAgICB2YXIgc2hhcmVkID0gYS5tYXJrVGV4dChQb3MoMCwgMSksIFBvcygwLCAzKSwge3NoYXJlZDogdHJ1ZX0pOwogICAgdmFyIGIgPSBhLmxpbmtlZERvYygpOwogICAgdmFyIGZvdW5kID0gYi5maW5kTWFya3NBdChQb3MoMCwgMikpOwogICAgZXEoZm91bmQubGVuZ3RoLCAxKTsKICAgIGVxKGZvdW5kWzBdLCBzaGFyZWQpOwogICAgc2hhcmVkLmNsZWFyKCk7CiAgICBlcShiLmZpbmRNYXJrc0F0KFBvcygwLCAyKSksIDApOwogIH0pOwoKICB0ZXN0RG9jKCJzaGFyZWRNYXJrZXJEZXRhY2giLCAiQT0nYWJjZGUnIEI8QSBDPEIiLCBmdW5jdGlvbihhLCBiLCBjKSB7CiAgICB2YXIgc2hhcmVkID0gYS5tYXJrVGV4dChQb3MoMCwgMSksIFBvcygwLCAzKSwge3NoYXJlZDogdHJ1ZX0pOwogICAgYS51bmxpbmtEb2MoYik7CiAgICB2YXIgaW5CID0gYi5maW5kTWFya3NBdChQb3MoMCwgMikpOwogICAgZXEoaW5CLmxlbmd0aCwgMSk7CiAgICBpcyhpbkJbMF0gIT0gc2hhcmVkKTsKICAgIHZhciBpbkMgPSBjLmZpbmRNYXJrc0F0KFBvcygwLCAyKSk7CiAgICBlcShpbkMubGVuZ3RoLCAxKTsKICAgIGlzKGluQ1swXSAhPSBzaGFyZWQpOwogICAgaW5DWzBdLmNsZWFyKCk7CiAgICBpcyhzaGFyZWQuZmluZCgpKTsKICB9KTsKCiAgdGVzdERvYygic2hhcmVkQm9va21hcmsiLCAiQT0nYWJcbmNkXG5lZlxuZ2gnIEI8QSBDPH5BLzEtMiIsIGZ1bmN0aW9uKGEsIGIsIGMpIHsKICAgIHZhciBtYXJrID0gYi5zZXRCb29rbWFyayhQb3MoMSwgMSksIHtzaGFyZWQ6IHRydWV9KTsKICAgIHZhciBmb3VuZCA9IGEuZmluZE1hcmtzQXQoUG9zKDEsIDEpKTsKICAgIGVxKGZvdW5kLmxlbmd0aCwgMSk7CiAgICBlcShmb3VuZFswXSwgbWFyayk7CiAgICBlcShjLmZpbmRNYXJrc0F0KFBvcygxLCAxKSkubGVuZ3RoLCAxKTsKICAgIGVxUG9zKG1hcmsuZmluZCgpLCBQb3MoMSwgMSkpOwogICAgYi5yZXBsYWNlUmFuZ2UoInhcbnlcbiIsIFBvcygwLCAwKSk7CiAgICBlcVBvcyhtYXJrLmZpbmQoKSwgUG9zKDMsIDEpKTsKICAgIHZhciBjbGVhcmVkID0gMDsKICAgIENvZGVNaXJyb3Iub24obWFyaywgImNsZWFyIiwgZnVuY3Rpb24oKSB7KytjbGVhcmVkO30pOwogICAgYi5vcGVyYXRpb24oZnVuY3Rpb24oKSB7bWFyay5jbGVhcigpO30pOwogICAgZXEoYS5maW5kTWFya3MoUG9zKDAsIDApLCBQb3MoNSkpLmxlbmd0aCwgMCk7CiAgICBlcShiLmZpbmRNYXJrcyhQb3MoMCwgMCksIFBvcyg1KSkubGVuZ3RoLCAwKTsKICAgIGVxKGMuZmluZE1hcmtzKFBvcygwLCAwKSwgUG9zKDUpKS5sZW5ndGgsIDApOwogICAgZXEobWFyay5maW5kKCksIG51bGwpOwogICAgZXEoY2xlYXJlZCwgMSk7CiAgfSk7CgogIHRlc3REb2MoInVuZG9JblN1YnZpZXciLCAiQT0nbGluZSAwXG5saW5lIDFcbmxpbmUgMlxubGluZSAzXG5saW5lIDQnIEI8QS8xLTQiLCBmdW5jdGlvbihhLCBiKSB7CiAgICBiLnJlcGxhY2VSYW5nZSgieCIsIFBvcygyLCAwKSk7CiAgICBhLnVuZG8oKTsKICAgIGVxKGEuZ2V0VmFsdWUoKSwgImxpbmUgMFxubGluZSAxXG5saW5lIDJcbmxpbmUgM1xubGluZSA0Iik7CiAgICBlcShiLmdldFZhbHVlKCksICJsaW5lIDFcbmxpbmUgMlxubGluZSAzIik7CiAgfSk7Cn0pKCk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/test/driver.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dmFyIHRlc3RzID0gW10sIGZpbHRlcnMgPSBbXSwgYWxsTmFtZXMgPSBbXTsKCmZ1bmN0aW9uIEZhaWx1cmUod2h5KSB7dGhpcy5tZXNzYWdlID0gd2h5O30KRmFpbHVyZS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMubWVzc2FnZTsgfTsKCmZ1bmN0aW9uIGluZGV4T2YoY29sbGVjdGlvbiwgZWx0KSB7CiAgaWYgKGNvbGxlY3Rpb24uaW5kZXhPZikgcmV0dXJuIGNvbGxlY3Rpb24uaW5kZXhPZihlbHQpOwogIGZvciAodmFyIGkgPSAwLCBlID0gY29sbGVjdGlvbi5sZW5ndGg7IGkgPCBlOyArK2kpCiAgICBpZiAoY29sbGVjdGlvbltpXSA9PSBlbHQpIHJldHVybiBpOwogIHJldHVybiAtMTsKfQoKZnVuY3Rpb24gdGVzdChuYW1lLCBydW4sIGV4cGVjdGVkRmFpbCkgewogIC8vIEZvcmNlIHVuaXF1ZSBuYW1lcwogIHZhciBvcmlnaW5hbE5hbWUgPSBuYW1lOwogIHZhciBpID0gMjsgLy8gU2Vjb25kIGZ1bmN0aW9uIHdvdWxkIGJlIE5BTUVfMgogIHdoaWxlIChpbmRleE9mKGFsbE5hbWVzLCBuYW1lKSAhPT0gLTEpewogICAgbmFtZSA9IG9yaWdpbmFsTmFtZSArICJfIiArIGk7CiAgICBpKys7CiAgfQogIGFsbE5hbWVzLnB1c2gobmFtZSk7CiAgLy8gQWRkIHRlc3QKICB0ZXN0cy5wdXNoKHtuYW1lOiBuYW1lLCBmdW5jOiBydW4sIGV4cGVjdGVkRmFpbDogZXhwZWN0ZWRGYWlsfSk7CiAgcmV0dXJuIG5hbWU7Cn0KdmFyIG5hbWVzcGFjZSA9ICIiOwpmdW5jdGlvbiB0ZXN0Q00obmFtZSwgcnVuLCBvcHRzLCBleHBlY3RlZEZhaWwpIHsKICByZXR1cm4gdGVzdChuYW1lc3BhY2UgKyBuYW1lLCBmdW5jdGlvbigpIHsKICAgIHZhciBwbGFjZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0ZXN0Z3JvdW5kIiksIGNtID0gd2luZG93LmNtID0gQ29kZU1pcnJvcihwbGFjZSwgb3B0cyk7CiAgICB2YXIgc3VjY2Vzc2Z1bCA9IGZhbHNlOwogICAgdHJ5IHsKICAgICAgcnVuKGNtKTsKICAgICAgc3VjY2Vzc2Z1bCA9IHRydWU7CiAgICB9IGZpbmFsbHkgewogICAgICBpZiAoIXN1Y2Nlc3NmdWwgfHwgdmVyYm9zZSkgewogICAgICAgIHBsYWNlLnN0eWxlLnZpc2liaWxpdHkgPSAidmlzaWJsZSI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcGxhY2UucmVtb3ZlQ2hpbGQoY20uZ2V0V3JhcHBlckVsZW1lbnQoKSk7CiAgICAgIH0KICAgIH0KICB9LCBleHBlY3RlZEZhaWwpOwp9CgpmdW5jdGlvbiBydW5UZXN0cyhjYWxsYmFjaykgewogIHZhciB0b3RhbFRpbWUgPSAwOwogIGZ1bmN0aW9uIHN0ZXAoaSkgewogICAgZm9yICg7OykgewogICAgICBpZiAoaSA9PT0gdGVzdHMubGVuZ3RoKSB7CiAgICAgICAgcnVubmluZyA9IGZhbHNlOwogICAgICAgIHJldHVybiBjYWxsYmFjaygiZG9uZSIpOwogICAgICB9CiAgICAgIHZhciB0ZXN0ID0gdGVzdHNbaV0sIHNraXAgPSBmYWxzZTsKICAgICAgaWYgKGZpbHRlcnMubGVuZ3RoKSB7CiAgICAgICAgc2tpcCA9IHRydWU7CiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBmaWx0ZXJzLmxlbmd0aDsgaisrKQogICAgICAgICAgaWYgKHRlc3QubmFtZS5tYXRjaChmaWx0ZXJzW2pdKSkgc2tpcCA9IGZhbHNlOwogICAgICB9CiAgICAgIGlmIChza2lwKSB7CiAgICAgICAgY2FsbGJhY2soInNraXBwZWQiLCB0ZXN0Lm5hbWUsIG1lc3NhZ2UpOwogICAgICAgIGkrKzsKICAgICAgfSBlbHNlIHsKICAgICAgICBicmVhazsKICAgICAgfQogICAgfQogICAgdmFyIGV4cEZhaWwgPSB0ZXN0LmV4cGVjdGVkRmFpbCwgc3RhcnRUaW1lID0gK25ldyBEYXRlLCB0aHJldyA9IGZhbHNlOwogICAgdHJ5IHsKICAgICAgdmFyIG1lc3NhZ2UgPSB0ZXN0LmZ1bmMoKTsKICAgIH0gY2F0Y2goZSkgewogICAgICB0aHJldyA9IHRydWU7CiAgICAgIGlmIChleHBGYWlsKSBjYWxsYmFjaygiZXhwZWN0ZWQiLCB0ZXN0Lm5hbWUpOwogICAgICBlbHNlIGlmIChlIGluc3RhbmNlb2YgRmFpbHVyZSkgY2FsbGJhY2soImZhaWwiLCB0ZXN0Lm5hbWUsIGUubWVzc2FnZSk7CiAgICAgIGVsc2UgewogICAgICAgIHZhciBwb3MgPSAvKD86XGJhdCB8QCkuKj8oW15cLzpdKyk6KFxkKykvLmV4ZWMoZS5zdGFjayk7CiAgICAgICAgaWYgKHBvcykgY29uc29sZVsibG9nIl0oZS5zdGFjayk7CiAgICAgICAgY2FsbGJhY2soImVycm9yIiwgdGVzdC5uYW1lLCBlLnRvU3RyaW5nKCkgKyAocG9zID8gIiAoIiArIHBvc1sxXSArICI6IiArIHBvc1syXSArICIpIiA6ICIiKSk7CiAgICAgIH0KICAgIH0KICAgIGlmICghdGhyZXcpIHsKICAgICAgaWYgKGV4cEZhaWwpIGNhbGxiYWNrKCJmYWlsIiwgdGVzdC5uYW1lLCBtZXNzYWdlIHx8ICJleHBlY3RlZCBmYWlsdXJlLCBidXQgcGFzc2VkIik7CiAgICAgIGVsc2UgY2FsbGJhY2soIm9rIiwgdGVzdC5uYW1lLCBtZXNzYWdlKTsKICAgIH0KICAgIGlmICghcXVpdCkgeyAvLyBSdW4gbmV4dCB0ZXN0CiAgICAgIHZhciBkZWxheSA9IDA7CiAgICAgIHRvdGFsVGltZSArPSAoK25ldyBEYXRlKSAtIHN0YXJ0VGltZTsKICAgICAgaWYgKHRvdGFsVGltZSA+IDUwMCl7CiAgICAgICAgdG90YWxUaW1lID0gMDsKICAgICAgICBkZWxheSA9IDUwOwogICAgICB9CiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXtzdGVwKGkgKyAxKTt9LCBkZWxheSk7CiAgICB9IGVsc2UgeyAvLyBRdWl0IHRlc3RzCiAgICAgIHJ1bm5pbmcgPSBmYWxzZTsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgfQogIHN0ZXAoMCk7Cn0KCmZ1bmN0aW9uIGxhYmVsKHN0ciwgbXNnKSB7CiAgaWYgKG1zZykgcmV0dXJuIHN0ciArICIgKCIgKyBtc2cgKyAiKSI7CiAgcmV0dXJuIHN0cjsKfQpmdW5jdGlvbiBlcShhLCBiLCBtc2cpIHsKICBpZiAoYSAhPSBiKSB0aHJvdyBuZXcgRmFpbHVyZShsYWJlbChhICsgIiAhPSAiICsgYiwgbXNnKSk7Cn0KZnVuY3Rpb24gbmVhcihhLCBiLCBtYXJnaW4sIG1zZykgewogIGlmIChNYXRoLmFicyhhIC0gYikgPiBtYXJnaW4pCiAgICB0aHJvdyBuZXcgRmFpbHVyZShsYWJlbChhICsgIiBpcyBub3QgY2xvc2UgdG8gIiArIGIgKyAiICgiICsgbWFyZ2luICsgIikiLCBtc2cpKTsKfQpmdW5jdGlvbiBlcVBvcyhhLCBiLCBtc2cpIHsKICBmdW5jdGlvbiBzdHIocCkgeyByZXR1cm4gIntsaW5lOiIgKyBwLmxpbmUgKyAiLGNoOiIgKyBwLmNoICsgIn0iOyB9CiAgaWYgKGEgPT0gYikgcmV0dXJuOwogIGlmIChhID09IG51bGwpIHRocm93IG5ldyBGYWlsdXJlKGxhYmVsKCJjb21wYXJpbmcgbnVsbCB0byAiICsgc3RyKGIpLCBtc2cpKTsKICBpZiAoYiA9PSBudWxsKSB0aHJvdyBuZXcgRmFpbHVyZShsYWJlbCgiY29tcGFyaW5nICIgKyBzdHIoYSkgKyAiIHRvIG51bGwiLCBtc2cpKTsKICBpZiAoYS5saW5lICE9IGIubGluZSB8fCBhLmNoICE9IGIuY2gpIHRocm93IG5ldyBGYWlsdXJlKGxhYmVsKHN0cihhKSArICIgIT0gIiArIHN0cihiKSwgbXNnKSk7Cn0KZnVuY3Rpb24gaXMoYSwgbXNnKSB7CiAgaWYgKCFhKSB0aHJvdyBuZXcgRmFpbHVyZShsYWJlbCgiYXNzZXJ0aW9uIGZhaWxlZCIsIG1zZykpOwp9CgpmdW5jdGlvbiBjb3VudFRlc3RzKCkgewogIGlmICghZmlsdGVycy5sZW5ndGgpIHJldHVybiB0ZXN0cy5sZW5ndGg7CiAgdmFyIHN1bSA9IDA7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCB0ZXN0cy5sZW5ndGg7ICsraSkgewogICAgdmFyIG5hbWUgPSB0ZXN0c1tpXS5uYW1lOwogICAgZm9yICh2YXIgaiA9IDA7IGogPCBmaWx0ZXJzLmxlbmd0aDsgaisrKSB7CiAgICAgIGlmIChuYW1lLm1hdGNoKGZpbHRlcnNbal0pKSB7CiAgICAgICAgKytzdW07CiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuIHN1bTsKfQoKZnVuY3Rpb24gcGFyc2VUZXN0RmlsdGVyKHMpIHsKICBpZiAoL19cKiQvLnRlc3QocykpIHJldHVybiBuZXcgUmVnRXhwKCJeIiArIHMuc2xpY2UoMCwgcy5sZW5ndGggLSAyKSwgImkiKTsKICBlbHNlIHJldHVybiBuZXcgUmVnRXhwKHMsICJpIik7Cn0K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/test/emacs_test.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKCkgewogICJ1c2Ugc3RyaWN0IjsKCiAgdmFyIFBvcyA9IENvZGVNaXJyb3IuUG9zOwogIG5hbWVzcGFjZSA9ICJlbWFjc18iOwoKICB2YXIgZXZlbnRDYWNoZSA9IHt9OwogIGZ1bmN0aW9uIGZha2VFdmVudChrZXlOYW1lKSB7CiAgICB2YXIgZXZlbnQgPSBldmVudENhY2hlW2tleV07CiAgICBpZiAoZXZlbnQpIHJldHVybiBldmVudDsKCiAgICB2YXIgY3RybCwgc2hpZnQsIGFsdDsKICAgIHZhciBrZXkgPSBrZXlOYW1lLnJlcGxhY2UoL1x3Ky0vZywgZnVuY3Rpb24odHlwZSkgewogICAgICBpZiAodHlwZSA9PSAiQ3RybC0iKSBjdHJsID0gdHJ1ZTsKICAgICAgZWxzZSBpZiAodHlwZSA9PSAiQWx0LSIpIGFsdCA9IHRydWU7CiAgICAgIGVsc2UgaWYgKHR5cGUgPT0gIlNoaWZ0LSIpIHNoaWZ0ID0gdHJ1ZTsKICAgICAgcmV0dXJuICIiOwogICAgfSk7CiAgICB2YXIgY29kZTsKICAgIGZvciAodmFyIGMgaW4gQ29kZU1pcnJvci5rZXlOYW1lcykKICAgICAgaWYgKENvZGVNaXJyb3Iua2V5TmFtZXNbY10gPT0ga2V5KSB7IGNvZGUgPSBjOyBicmVhazsgfQogICAgaWYgKGNvZGUgPT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKCJVbmtub3duIGtleTogIiArIGtleSk7CgogICAgcmV0dXJuIGV2ZW50Q2FjaGVba2V5TmFtZV0gPSB7CiAgICAgIHR5cGU6ICJrZXlkb3duIiwga2V5Q29kZTogY29kZSwgY3RybEtleTogY3RybCwgc2hpZnRLZXk6IHNoaWZ0LCBhbHRLZXk6IGFsdCwKICAgICAgcHJldmVudERlZmF1bHQ6IGZ1bmN0aW9uKCl7fSwgc3RvcFByb3BhZ2F0aW9uOiBmdW5jdGlvbigpe30KICAgIH07CiAgfQoKICBmdW5jdGlvbiBzaW0obmFtZSwgc3RhcnQgLyosIGFjdGlvbnMuLi4gKi8pIHsKICAgIHZhciBrZXlzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAyKTsKICAgIHRlc3RDTShuYW1lLCBmdW5jdGlvbihjbSkgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyArK2kpIHsKICAgICAgICB2YXIgY3VyID0ga2V5c1tpXTsKICAgICAgICBpZiAoY3VyIGluc3RhbmNlb2YgUG9zKSBjbS5zZXRDdXJzb3IoY3VyKTsKICAgICAgICBlbHNlIGlmIChjdXIuY2FsbCkgY3VyKGNtKTsKICAgICAgICBlbHNlIGNtLnRyaWdnZXJPbktleURvd24oZmFrZUV2ZW50KGN1cikpOwogICAgICB9CiAgICB9LCB7a2V5TWFwOiAiZW1hY3MiLCB2YWx1ZTogc3RhcnQsIG1vZGU6ICJqYXZhc2NyaXB0In0pOwogIH0KCiAgZnVuY3Rpb24gYXQobGluZSwgY2gpIHsgcmV0dXJuIGZ1bmN0aW9uKGNtKSB7IGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MobGluZSwgY2gpKTsgfTsgfQogIGZ1bmN0aW9uIHR4dChzdHIpIHsgcmV0dXJuIGZ1bmN0aW9uKGNtKSB7IGVxKGNtLmdldFZhbHVlKCksIHN0cik7IH07IH0KCiAgc2ltKCJtb3Rpb25IU2ltcGxlIiwgImFiYyIsICJDdHJsLUYiLCAiQ3RybC1GIiwgIkN0cmwtQiIsIGF0KDAsIDEpKTsKICBzaW0oIm1vdGlvbkhNdWx0aSIsICJhYmNkZSIsCiAgICAgICJDdHJsLTQiLCAiQ3RybC1GIiwgYXQoMCwgNCksICJDdHJsLS0iLCAiQ3RybC0yIiwgIkN0cmwtRiIsIGF0KDAsIDIpLAogICAgICAiQ3RybC01IiwgIkN0cmwtQiIsIGF0KDAsIDApKTsKCiAgc2ltKCJtb3Rpb25IV29yZCIsICJhYmMuIGRlZiBnaGkiLAogICAgICAiQWx0LUYiLCBhdCgwLCAzKSwgIkFsdC1GIiwgYXQoMCwgOCksCiAgICAgICJDdHJsLUIiLCAiQWx0LUIiLCBhdCgwLCA1KSwgIkFsdC1CIiwgYXQoMCwgMCkpOwogIHNpbSgibW90aW9uSFdvcmRNdWx0aSIsICJhYmMuIGRlZiBnaGkgIiwKICAgICAgIkN0cmwtMyIsICJBbHQtRiIsIGF0KDAsIDEyKSwgIkN0cmwtMiIsICJBbHQtQiIsIGF0KDAsIDUpLAogICAgICAiQ3RybC0tIiwgIkFsdC1CIiwgYXQoMCwgOCkpOwoKICBzaW0oIm1vdGlvblZTaW1wbGUiLCAiYVxuYlxuY1xuIiwgIkN0cmwtTiIsICJDdHJsLU4iLCAiQ3RybC1QIiwgYXQoMSwgMCkpOwogIHNpbSgibW90aW9uVk11bHRpIiwgImFcbmJcbmNcbmRcbmVcbiIsCiAgICAgICJDdHJsLTIiLCAiQ3RybC1OIiwgYXQoMiwgMCksICJDdHJsLUYiLCAiQ3RybC0tIiwgIkN0cmwtTiIsIGF0KDEsIDEpLAogICAgICAiQ3RybC0tIiwgIkN0cmwtMyIsICJDdHJsLVAiLCBhdCg0LCAxKSk7CgogIHNpbSgia2lsbFlhbmsiLCAiYWJjXG5kZWZcbmdoaSIsCiAgICAgICJDdHJsLUYiLCAiQ3RybC1TcGFjZSIsICJDdHJsLU4iLCAiQ3RybC1OIiwgIkN0cmwtVyIsICJDdHJsLUUiLCAiQ3RybC1ZIiwKICAgICAgdHh0KCJhaGliY1xuZGVmXG5nIikpOwogIHNpbSgia2lsbFJpbmciLCAiYWJjZGVmIiwKICAgICAgIkN0cmwtU3BhY2UiLCAiQ3RybC1GIiwgIkN0cmwtVyIsICJDdHJsLVNwYWNlIiwgIkN0cmwtRiIsICJDdHJsLVciLAogICAgICAiQ3RybC1ZIiwgIkFsdC1ZIiwKICAgICAgdHh0KCJhY2RlZiIpKTsKICBzaW0oImNvcHlZYW5rIiwgImFiY2QiLAogICAgICAiQ3RybC1TcGFjZSIsICJDdHJsLUUiLCAiQWx0LVciLCAiQ3RybC1ZIiwKICAgICAgdHh0KCJhYmNkYWJjZCIpKTsKCiAgc2ltKCJraWxsTGluZVNpbXBsZSIsICJmb29cbmJhciIsICJDdHJsLUYiLCAiQ3RybC1LIiwgdHh0KCJmXG5iYXIiKSk7CiAgc2ltKCJraWxsTGluZUVtcHR5TGluZSIsICJmb29cbiAgXG5iYXIiLCAiQ3RybC1OIiwgIkN0cmwtSyIsIHR4dCgiZm9vXG5iYXIiKSk7CiAgc2ltKCJraWxsTGluZU11bHRpIiwgImZvb1xuYmFyXG5iYXoiLAogICAgICAiQ3RybC1GIiwgIkN0cmwtRiIsICJDdHJsLUsiLCAiQ3RybC1LIiwgIkN0cmwtSyIsICJDdHJsLUEiLCAiQ3RybC1ZIiwKICAgICAgdHh0KCJvXG5iYXJmb1xuYmF6IikpOwoKICBzaW0oIm1vdmVCeVBhcmFncmFwaCIsICJhYmNcbmRlZlxuXG5cbmhpalxua2xtXG5cbiIsCiAgICAgICJDdHJsLUYiLCAiQ3RybC1Eb3duIiwgYXQoMiwgMCksICJDdHJsLURvd24iLCBhdCg2LCAwKSwKICAgICAgIkN0cmwtTiIsICJDdHJsLVVwIiwgYXQoMywgMCksICJDdHJsLVVwIiwgYXQoMCwgMCksCiAgICAgIFBvcygxLCAyKSwgIkN0cmwtRG93biIsIGF0KDIsIDApLCBQb3MoNCwgMiksICJDdHJsLVVwIiwgYXQoMywgMCkpOwogIHNpbSgibW92ZUJ5UGFyYWdyYXBoTXVsdGkiLCAiYWJjXG5cbmRlZlxuXG5oaWpcblxua2xtIiwKICAgICAgIkN0cmwtVSIsICIyIiwgIkN0cmwtRG93biIsIGF0KDMsIDApLAogICAgICAiU2hpZnQtQWx0LS4iLCAiQ3RybC0zIiwgIkN0cmwtVXAiLCBhdCgxLCAwKSk7CgogIHNpbSgibW92ZUJ5U2VudGVuY2UiLCAic2VudGVuY2Ugb25lISBzZW50ZW5jZVxudHdvXG5cbnBhcmFncmFwaCB0d28iLAogICAgICAiQWx0LUUiLCBhdCgwLCAxMyksICJBbHQtRSIsIGF0KDEsIDMpLCAiQ3RybC1GIiwgIkFsdC1BIiwgYXQoMCwgMTMpKTsKCiAgc2ltKCJtb3ZlQnlFeHByIiwgImZ1bmN0aW9uIGZvbyhhLCBiKSB7fSIsCiAgICAgICJDdHJsLUFsdC1GIiwgYXQoMCwgOCksICJDdHJsLUFsdC1GIiwgYXQoMCwgMTIpLCAiQ3RybC1BbHQtRiIsIGF0KDAsIDE4KSwKICAgICAgIkN0cmwtQWx0LUIiLCBhdCgwLCAxMiksICJDdHJsLUFsdC1CIiwgYXQoMCwgOSkpOwogIHNpbSgibW92ZUJ5RXhwck11bHRpIiwgImZvbyBiYXIgYmF6IGJ1ZyIsCiAgICAgICJDdHJsLTIiLCAiQ3RybC1BbHQtRiIsIGF0KDAsIDcpLAogICAgICAiQ3RybC0tIiwgIkN0cmwtQWx0LUYiLCBhdCgwLCA0KSwKICAgICAgIkN0cmwtLSIsICJDdHJsLTIiLCAiQ3RybC1BbHQtQiIsIGF0KDAsIDExKSk7CiAgc2ltKCJkZWxFeHByIiwgInZhciB4ID0gW1xuICBhLFxuICBiXG4gIGNcbl07IiwKICAgICAgUG9zKDAsIDgpLCAiQ3RybC1BbHQtSyIsIHR4dCgidmFyIHggPSA7IiksICJDdHJsLS8iLAogICAgICBQb3MoNCwgMSksICJDdHJsLUFsdC1CYWNrc3BhY2UiLCB0eHQoInZhciB4ID0gOyIpKTsKICBzaW0oImRlbEV4cHJNdWx0aSIsICJmb28gYmFyIGJheiIsCiAgICAgICJDdHJsLTIiLCAiQ3RybC1BbHQtSyIsIHR4dCgiIGJheiIpLAogICAgICAiQ3RybC0vIiwgIkN0cmwtRSIsICJDdHJsLTIiLCAiQ3RybC1BbHQtQmFja3NwYWNlIiwgdHh0KCJmb28gIikpOwoKICBzaW0oImp1c3RPbmVTcGFjZSIsICJoaSAgICAgIGJ5ZSAgIiwKICAgICAgUG9zKDAsIDQpLCAiQWx0LVNwYWNlIiwgdHh0KCJoaSBieWUgICIpLAogICAgICBQb3MoMCwgNCksICJBbHQtU3BhY2UiLCB0eHQoImhpIGIgeWUgICIpLAogICAgICAiQ3RybC1BIiwgIkFsdC1TcGFjZSIsICJDdHJsLUUiLCAiQWx0LVNwYWNlIiwgdHh0KCIgaGkgYiB5ZSAiKSk7CgogIHNpbSgib3BlbkxpbmUiLCAiZm9vIGJhciIsICJBbHQtRiIsICJDdHJsLU8iLCB0eHQoImZvb1xuIGJhciIpKQoKICBzaW0oInRyYW5zcG9zZUNoYXIiLCAiYWJjZFxuZSIsCiAgICAgICJDdHJsLUYiLCAiQ3RybC1UIiwgIkN0cmwtVCIsIHR4dCgiYmNhZFxuZSIpLCBhdCgwLCAzKSwKICAgICAgIkN0cmwtRiIsICJDdHJsLVQiLCAiQ3RybC1UIiwgIkN0cmwtVCIsIHR4dCgiYmNkYVxuZSIpLCBhdCgwLCA0KSwKICAgICAgIkN0cmwtRiIsICJDdHJsLVQiLCB0eHQoImJjZGVcbmEiKSwgYXQoMSwgMSkpOwoKICBzaW0oIm1hbmlwV29yZENhc2UiLCAiZm9vIEJBUiBiQVoiLAogICAgICAiQWx0LUMiLCAiQWx0LUwiLCAiQWx0LVUiLCB0eHQoIkZvbyBiYXIgQkFaIiksCiAgICAgICJDdHJsLUEiLCAiQWx0LVUiLCAiQWx0LUwiLCAiQWx0LUMiLCB0eHQoIkZPTyBiYXIgQmF6IikpOwogIHNpbSgibWFuaXBXb3JkQ2FzZU11bHRpIiwgImZvbyBCYXIgYkF6IiwKICAgICAgIkN0cmwtMiIsICJBbHQtVSIsIHR4dCgiRk9PIEJBUiBiQXoiKSwKICAgICAgIkN0cmwtQSIsICJDdHJsLTMiLCAiQWx0LUMiLCB0eHQoIkZvbyBCYXIgQmF6IikpOwoKICBzaW0oInVwRXhwciIsICJmb28ge1xuICBiYXJbXTtcbiAgYmF6KGJsYWgpO1xufSIsCiAgICAgIFBvcygyLCA3KSwgIkN0cmwtQWx0LVUiLCBhdCgyLCA1KSwgIkN0cmwtQWx0LVUiLCBhdCgwLCA0KSk7CiAgc2ltKCJ0cmFuc3Bvc2VFeHByIiwgImRvIGZvb1tiYXJdIGRhaCIsCiAgICAgIFBvcygwLCA2KSwgIkN0cmwtQWx0LVQiLCB0eHQoImRvIFtiYXJdZm9vIGRhaCIpKTsKCiAgc2ltKCJjbGVhck1hcmsiLCAiYWJjZGUiLCBQb3MoMCwgMiksICJDdHJsLVNwYWNlIiwgIkN0cmwtRiIsICJDdHJsLUYiLAogICAgICAiQ3RybC1HIiwgIkN0cmwtVyIsIHR4dCgiYWJjZGUiKSk7CgogIHNpbSgiZGVsUmVnaW9uIiwgImFiY2RlIiwgIkN0cmwtU3BhY2UiLCAiQ3RybC1GIiwgIkN0cmwtRiIsICJEZWxldGUiLCB0eHQoImNkZSIpKTsKICBzaW0oImJhY2tzcGFjZVJlZ2lvbiIsICJhYmNkZSIsICJDdHJsLVNwYWNlIiwgIkN0cmwtRiIsICJDdHJsLUYiLCAiQmFja3NwYWNlIiwgdHh0KCJjZGUiKSk7CgogIHRlc3RDTSgic2F2ZSIsIGZ1bmN0aW9uKGNtKSB7CiAgICB2YXIgc2F2ZWQgPSBmYWxzZTsKICAgIENvZGVNaXJyb3IuY29tbWFuZHMuc2F2ZSA9IGZ1bmN0aW9uKGNtKSB7IHNhdmVkID0gY20uZ2V0VmFsdWUoKTsgfTsKICAgIGNtLnRyaWdnZXJPbktleURvd24oZmFrZUV2ZW50KCJDdHJsLVgiKSk7CiAgICBjbS50cmlnZ2VyT25LZXlEb3duKGZha2VFdmVudCgiQ3RybC1TIikpOwogICAgaXMoc2F2ZWQsICJoaSIpOwogIH0sIHt2YWx1ZTogImhpIiwga2V5TWFwOiAiZW1hY3MifSk7CgogIHRlc3RDTSgiZ290b0ludmFsaWRMaW5lRmxvYXQiLCBmdW5jdGlvbihjbSkgewogICAgY20ub3BlbkRpYWxvZyA9IGZ1bmN0aW9uKF8sIGNiKSB7IGNiKCIyLjIiKTsgfTsKICAgIGNtLnRyaWdnZXJPbktleURvd24oZmFrZUV2ZW50KCJBbHQtRyIpKTsKICAgIGNtLnRyaWdnZXJPbktleURvd24oZmFrZUV2ZW50KCJHIikpOwogIH0sIHt2YWx1ZTogIjFcbjJcbjNcbjQiLCBrZXlNYXA6ICJlbWFjcyJ9KTsKfSkoKTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/test/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCFkb2N0eXBlIGh0bWw+Cgo8bWV0YSBjaGFyc2V0PSJ1dGYtOCIvPgo8dGl0bGU+Q29kZU1pcnJvcjogVGVzdCBTdWl0ZTwvdGl0bGU+CjxsaW5rIHJlbD1zdHlsZXNoZWV0IGhyZWY9Ii4uL2RvYy9kb2NzLmNzcyI+Cgo8bGluayByZWw9InN0eWxlc2hlZXQiIGhyZWY9Ii4uL2xpYi9jb2RlbWlycm9yLmNzcyI+CjxsaW5rIHJlbD0ic3R5bGVzaGVldCIgaHJlZj0ibW9kZV90ZXN0LmNzcyI+CjxzY3JpcHQgc3JjPSIuLi9kb2MvYWN0aXZlYm9va21hcmsuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vbGliL2NvZGVtaXJyb3IuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vbW9kZS9tZXRhLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL2FkZG9uL21vZGUvb3ZlcmxheS5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9hZGRvbi9tb2RlL211bHRpcGxleC5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9hZGRvbi9zZWFyY2gvc2VhcmNoY3Vyc29yLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL2FkZG9uL2RpYWxvZy9kaWFsb2cuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vYWRkb24vZWRpdC9tYXRjaGJyYWNrZXRzLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL2FkZG9uL2hpbnQvc3FsLWhpbnQuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vYWRkb24vY29tbWVudC9jb21tZW50LmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL2FkZG9uL21vZGUvc2ltcGxlLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL21vZGUvY3NzL2Nzcy5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9tb2RlL2NsaWtlL2NsaWtlLmpzIj48L3NjcmlwdD4KPCEtLSBjbGlrZSBtdXN0IGJlIGFmdGVyIGNzcyBvciB2aW0gYW5kIHN1YmxpbWUgdGVzdHMgd2lsbCBmYWlsIC0tPgo8c2NyaXB0IHNyYz0iLi4vbW9kZS9jeXBoZXIvY3lwaGVyLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL21vZGUvZ2ZtL2dmbS5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9tb2RlL2hhbWwvaGFtbC5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9tb2RlL2h0bWxtaXhlZC9odG1sbWl4ZWQuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vbW9kZS9qYXZhc2NyaXB0L2phdmFzY3JpcHQuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vbW9kZS9qc3gvanN4LmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL21vZGUvbWFya2Rvd24vbWFya2Rvd24uanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vbW9kZS9waHAvcGhwLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL21vZGUvcHl0aG9uL3B5dGhvbi5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9tb2RlL3Bvd2Vyc2hlbGwvcG93ZXJzaGVsbC5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9tb2RlL3J1YnkvcnVieS5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9tb2RlL3NoZWxsL3NoZWxsLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL21vZGUvc2xpbS9zbGltLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL21vZGUvc3FsL3NxbC5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9tb2RlL3N0ZXgvc3RleC5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9tb2RlL3RleHRpbGUvdGV4dGlsZS5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9tb2RlL3Zlcmlsb2cvdmVyaWxvZy5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9tb2RlL3htbC94bWwuanMiPjwvc2NyaXB0Pgo8c2NyaXB0IHNyYz0iLi4vbW9kZS94cXVlcnkveHF1ZXJ5LmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL2tleW1hcC9lbWFjcy5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9rZXltYXAvc3VibGltZS5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9rZXltYXAvdmltLmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL21vZGUvcnVzdC9ydXN0LmpzIj48L3NjcmlwdD4KPHNjcmlwdCBzcmM9Ii4uL21vZGUvbXNjZ2VuL21zY2dlbi5qcyI+PC9zY3JpcHQ+CjxzY3JpcHQgc3JjPSIuLi9tb2RlL2R5bGFuL2R5bGFuLmpzIj48L3NjcmlwdD4KCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgLm9rIHtjb2xvcjogIzA5MDt9CiAgLmZhaWwge2NvbG9yOiAjZTAwO30KICAuZXJyb3Ige2NvbG9yOiAjYzkwO30KICAuZG9uZSB7Zm9udC13ZWlnaHQ6IGJvbGQ7fQogICNwcm9ncmVzcyB7CiAgYmFja2dyb3VuZDogIzQ1ZDsKICBjb2xvcjogd2hpdGU7CiAgdGV4dC1zaGFkb3c6IDAgMCAxcHggIzQ1ZCwgMCAwIDJweCAjNDVkLCAwIDAgM3B4ICM0NWQ7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgd2hpdGUtc3BhY2U6IHByZTsKICB9CiAgI3Rlc3Rncm91bmQgewogIHZpc2liaWxpdHk6IGhpZGRlbjsKICB9CiAgI3Rlc3Rncm91bmQub2Zmc2NyZWVuIHsKICB2aXNpYmlsaXR5OiB2aXNpYmxlOwogIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICBsZWZ0OiAtMTAwMDBweDsKICB0b3A6IC0xMDAwMHB4OwogIH0KICAuQ29kZU1pcnJvciB7IGJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOyB9Cjwvc3R5bGU+Cgo8ZGl2IGlkPW5hdj4KICA8YSBocmVmPSJodHRwOi8vY29kZW1pcnJvci5uZXQiPjxoMT5Db2RlTWlycm9yPC9oMT48aW1nIGlkPWxvZ28gc3JjPSIuLi9kb2MvbG9nby5wbmciPjwvYT4KCiAgPHVsPgogICAgPGxpPjxhIGhyZWY9Ii4uL2luZGV4Lmh0bWwiPkhvbWU8L2E+CiAgICA8bGk+PGEgaHJlZj0iLi4vZG9jL21hbnVhbC5odG1sIj5NYW51YWw8L2E+CiAgICA8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvZGVtaXJyb3IvY29kZW1pcnJvciI+Q29kZTwvYT4KICA8L3VsPgogIDx1bD4KICAgIDxsaT48YSBjbGFzcz1hY3RpdmUgaHJlZj0iIyI+VGVzdCBzdWl0ZTwvYT4KICA8L3VsPgo8L2Rpdj4KCjxhcnRpY2xlPgogIDxoMj5UZXN0IFN1aXRlPC9oMj4KCiAgICA8cD5BIGxpbWl0ZWQgc2V0IG9mIHByb2dyYW1tYXRpYyBzYW5pdHkgdGVzdHMgZm9yIENvZGVNaXJyb3IuPC9wPgoKICAgIDxkaXYgc3R5bGU9ImJvcmRlcjogMXB4IHNvbGlkIGJsYWNrOyBwYWRkaW5nOiAxcHg7IG1heC13aWR0aDogNzAwcHg7Ij4KICAgICAgPGRpdiBzdHlsZT0id2lkdGg6IDBweDsiIGlkPXByb2dyZXNzPjxkaXYgc3R5bGU9InBhZGRpbmc6IDNweDsiPlJhbiA8c3BhbiBpZD0icHJvZ3Jlc3NfcmFuIj4wPC9zcGFuPjxzcGFuIGlkPSJwcm9ncmVzc190b3RhbCI+IG9mIDA8L3NwYW4+IHRlc3RzPC9kaXY+PC9kaXY+CiAgICA8L2Rpdj4KICAgIDxwIGlkPXN0YXR1cz5QbGVhc2UgZW5hYmxlIEphdmFTY3JpcHQuLi48L3A+CiAgICA8ZGl2IGlkPW91dHB1dD48L2Rpdj4KCiAgICA8ZGl2IGlkPXRlc3Rncm91bmQ+PC9kaXY+CgogICAgPHNjcmlwdCBzcmM9ImRyaXZlci5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0idGVzdC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iZG9jX3Rlc3QuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Im11bHRpX3Rlc3QuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9InNjcm9sbF90ZXN0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJjb21tZW50X3Rlc3QuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9InNlYXJjaF90ZXN0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJtb2RlX3Rlc3QuanMiPjwvc2NyaXB0PgoKICAgIDxzY3JpcHQgc3JjPSIuLi9tb2RlL2NsaWtlL3Rlc3QuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Ii4uL21vZGUvY3NzL3Rlc3QuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Ii4uL21vZGUvY3NzL2dzc190ZXN0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSIuLi9tb2RlL2Nzcy9zY3NzX3Rlc3QuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Ii4uL21vZGUvY3NzL2xlc3NfdGVzdC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iLi4vbW9kZS9jeXBoZXIvdGVzdC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iLi4vbW9kZS9nZm0vdGVzdC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iLi4vbW9kZS9oYW1sL3Rlc3QuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Ii4uL21vZGUvamF2YXNjcmlwdC90ZXN0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSIuLi9tb2RlL2pzeC90ZXN0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSIuLi9tb2RlL21hcmtkb3duL3Rlc3QuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Ii4uL21vZGUvcGhwL3Rlc3QuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Ii4uL21vZGUvcG93ZXJzaGVsbC90ZXN0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSIuLi9tb2RlL3J1YnkvdGVzdC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iLi4vbW9kZS9zaGVsbC90ZXN0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSIuLi9tb2RlL3NsaW0vdGVzdC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iLi4vbW9kZS9zdGV4L3Rlc3QuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Ii4uL21vZGUvdGV4dGlsZS90ZXN0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSIuLi9tb2RlL3Zlcmlsb2cvdGVzdC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iLi4vbW9kZS94bWwvdGVzdC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iLi4vbW9kZS94cXVlcnkvdGVzdC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iLi4vbW9kZS9weXRob24vdGVzdC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iLi4vbW9kZS9ydXN0L3Rlc3QuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Ii4uL21vZGUvbXNjZ2VuL21zY2dlbl90ZXN0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSIuLi9tb2RlL21zY2dlbi94dV90ZXN0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSIuLi9tb2RlL21zY2dlbi9tc2dlbm55X3Rlc3QuanMiPjwvc2NyaXB0PgogICAgPHNjcmlwdCBzcmM9Ii4uL21vZGUvZHlsYW4vdGVzdC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iLi4vYWRkb24vbW9kZS9tdWx0aXBsZXhfdGVzdC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0iZW1hY3NfdGVzdC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0ic3FsLWhpbnQtdGVzdC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0IHNyYz0ic3VibGltZV90ZXN0LmpzIj48L3NjcmlwdD4KICAgIDxzY3JpcHQgc3JjPSJ2aW1fdGVzdC5qcyI+PC9zY3JpcHQ+CiAgICA8c2NyaXB0PgogICAgICB3aW5kb3cub25sb2FkID0gcnVuSGFybmVzczsKICAgICAgQ29kZU1pcnJvci5vbih3aW5kb3csICdoYXNoY2hhbmdlJywgcnVuSGFybmVzcyk7CgogICAgICBmdW5jdGlvbiBlc2Moc3RyKSB7CiAgICAgICAgcmV0dXJuIHN0ci5yZXBsYWNlKC9bPCZdLywgZnVuY3Rpb24oY2gpIHsgcmV0dXJuIGNoID09ICI8IiA/ICImbHQ7IiA6ICImYW1wOyI7IH0pOwogICAgICB9CgogICAgICB2YXIgb3V0cHV0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoIm91dHB1dCIpLAogICAgICAgICAgcHJvZ3Jlc3MgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgicHJvZ3Jlc3MiKSwKICAgICAgICAgIHByb2dyZXNzUmFuID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInByb2dyZXNzX3JhbiIpLmNoaWxkTm9kZXNbMF0sCiAgICAgICAgICBwcm9ncmVzc1RvdGFsID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInByb2dyZXNzX3RvdGFsIikuY2hpbGROb2Rlc1swXTsKICAgICAgdmFyIGNvdW50ID0gMCwKICAgICAgICAgIGZhaWxlZCA9IDAsCiAgICAgICAgICBza2lwcGVkID0gMCwKICAgICAgICAgIGJhZCA9ICIiLAogICAgICAgICAgcnVubmluZyA9IGZhbHNlLCAvLyBGbGFnIHRoYXQgc3RhdGVzIHRlc3RzIGFyZSBydW5uaW5nCiAgICAgICAgICBxdWl0ID0gZmFsc2UsIC8vIEZsYWcgdG8gcXVpdCB0ZXN0cyBBU0FQCiAgICAgICAgICB2ZXJib3NlID0gZmFsc2U7IC8vIEFkZHMgbWVzc2FnZSBmb3IgKmV2ZXJ5KiB0ZXN0IHRvIG91dHB1dAoKICAgICAgZnVuY3Rpb24gcnVuSGFybmVzcygpewogICAgICAgIGlmIChydW5uaW5nKSB7CiAgICAgICAgICBxdWl0ID0gdHJ1ZTsKICAgICAgICAgIHNldFN0YXR1cygiUmVzdGFydGluZyB0ZXN0cy4uLiIsICcnLCB0cnVlKTsKICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXtydW5IYXJuZXNzKCk7fSwgNTAwKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgZmlsdGVycyA9IFtdOwogICAgICAgIHZlcmJvc2UgPSBmYWxzZTsKICAgICAgICBpZiAod2luZG93LmxvY2F0aW9uLmhhc2guc3Vic3RyKDEpKXsKICAgICAgICAgIHZhciBzdHJpbmdzID0gd2luZG93LmxvY2F0aW9uLmhhc2guc3Vic3RyKDEpLnNwbGl0KCIsIik7CiAgICAgICAgICB3aGlsZSAoc3RyaW5ncy5sZW5ndGgpIHsKICAgICAgICAgICAgdmFyIHMgPSBzdHJpbmdzLnNoaWZ0KCk7CiAgICAgICAgICAgIGlmIChzID09PSAidmVyYm9zZSIpCiAgICAgICAgICAgICAgdmVyYm9zZSA9IHRydWU7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICBmaWx0ZXJzLnB1c2gocGFyc2VUZXN0RmlsdGVyKGRlY29kZVVSSUNvbXBvbmVudChzKSkpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBxdWl0ID0gZmFsc2U7CiAgICAgICAgcnVubmluZyA9IHRydWU7CiAgICAgICAgc2V0U3RhdHVzKCJMb2FkaW5nIHRlc3RzLi4uIik7CiAgICAgICAgY291bnQgPSAwOwogICAgICAgIGZhaWxlZCA9IDA7CiAgICAgICAgc2tpcHBlZCA9IDA7CiAgICAgICAgYmFkID0gIiI7CiAgICAgICAgdG90YWxUZXN0cyA9IGNvdW50VGVzdHMoKTsKICAgICAgICBwcm9ncmVzc1RvdGFsLm5vZGVWYWx1ZSA9ICIgb2YgIiArIHRvdGFsVGVzdHM7CiAgICAgICAgcHJvZ3Jlc3NSYW4ubm9kZVZhbHVlID0gY291bnQ7CiAgICAgICAgb3V0cHV0LmlubmVySFRNTCA9ICcnOwogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJ0ZXN0Z3JvdW5kIikuaW5uZXJIVE1MID0gIjxmb3JtPiIgKwogICAgICAgICAgIjx0ZXh0YXJlYSBpZD1cImNvZGVcIiBuYW1lPVwiY29kZVwiPjwvdGV4dGFyZWE+IiArCiAgICAgICAgICAiPGlucHV0IHR5cGU9c3VibWl0IHZhbHVlPW9rIG5hbWU9c3VibWl0PiIgKwogICAgICAgICAgIjwvZm9ybT4iOwogICAgICAgIHJ1blRlc3RzKGRpc3BsYXlUZXN0KTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gc2V0U3RhdHVzKG1lc3NhZ2UsIGNsYXNzTmFtZSwgZm9yY2UpewogICAgICAgIGlmIChxdWl0ICYmICFmb3JjZSkgcmV0dXJuOwogICAgICAgIGlmICghbWVzc2FnZSkgdGhyb3coIm11c3QgcHJvdmlkZSBtZXNzYWdlIik7CiAgICAgICAgdmFyIHN0YXR1cyA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJzdGF0dXMiKS5jaGlsZE5vZGVzWzBdOwogICAgICAgIHN0YXR1cy5ub2RlVmFsdWUgPSBtZXNzYWdlOwogICAgICAgIHN0YXR1cy5wYXJlbnROb2RlLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKICAgICAgfQogICAgICBmdW5jdGlvbiBhZGRPdXRwdXQobmFtZSwgY2xhc3NOYW1lLCBjb2RlKXsKICAgICAgICB2YXIgbmV3T3V0cHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGwiKTsKICAgICAgICB2YXIgbmV3VGl0bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkdCIpOwogICAgICAgIG5ld1RpdGxlLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKICAgICAgICBuZXdUaXRsZS5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShuYW1lKSk7CiAgICAgICAgbmV3T3V0cHV0LmFwcGVuZENoaWxkKG5ld1RpdGxlKTsKICAgICAgICB2YXIgbmV3TWVzc2FnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRkIik7CiAgICAgICAgbmV3TWVzc2FnZS5pbm5lckhUTUwgPSBjb2RlOwogICAgICAgIG5ld091dHB1dC5hcHBlbmRDaGlsZChuZXdUaXRsZSk7CiAgICAgICAgbmV3T3V0cHV0LmFwcGVuZENoaWxkKG5ld01lc3NhZ2UpOwogICAgICAgIG91dHB1dC5hcHBlbmRDaGlsZChuZXdPdXRwdXQpOwogICAgICB9CiAgICAgIGZ1bmN0aW9uIGRpc3BsYXlUZXN0KHR5cGUsIG5hbWUsIGN1c3RvbU1lc3NhZ2UpIHsKICAgICAgICB2YXIgbWVzc2FnZSA9ICI/Pz8iOwogICAgICAgIGlmICh0eXBlICE9ICJkb25lIiAmJiB0eXBlICE9ICJza2lwcGVkIikgKytjb3VudDsKICAgICAgICBwcm9ncmVzcy5zdHlsZS53aWR0aCA9IChjb3VudCAqIChwcm9ncmVzcy5wYXJlbnROb2RlLmNsaWVudFdpZHRoIC0gMikgLyB0b3RhbFRlc3RzKSArICJweCI7CiAgICAgICAgcHJvZ3Jlc3NSYW4ubm9kZVZhbHVlID0gY291bnQ7CiAgICAgICAgaWYgKHR5cGUgPT0gIm9rIikgewogICAgICAgICAgbWVzc2FnZSA9ICJUZXN0ICciICsgbmFtZSArICInIHBhc3NlZCI7CiAgICAgICAgICBpZiAoIXZlcmJvc2UpIGN1c3RvbU1lc3NhZ2UgPSBmYWxzZTsKICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gInNraXBwZWQiKSB7CiAgICAgICAgICBtZXNzYWdlID0gIlRlc3QgJyIgKyBuYW1lICsgIicgc2tpcHBlZCI7CiAgICAgICAgICArK3NraXBwZWQ7CiAgICAgICAgICBpZiAoIXZlcmJvc2UpIGN1c3RvbU1lc3NhZ2UgPSBmYWxzZTsKICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gImV4cGVjdGVkIikgewogICAgICAgICAgbWVzc2FnZSA9ICJUZXN0ICciICsgbmFtZSArICInIGZhaWxlZCBhcyBleHBlY3RlZCI7CiAgICAgICAgICBpZiAoIXZlcmJvc2UpIGN1c3RvbU1lc3NhZ2UgPSBmYWxzZTsKICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gImVycm9yIiB8fCB0eXBlID09ICJmYWlsIikgewogICAgICAgICAgKytmYWlsZWQ7CiAgICAgICAgICBtZXNzYWdlID0gIlRlc3QgJyIgKyBuYW1lICsgIicgZmFpbGVkIjsKICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT0gImRvbmUiKSB7CiAgICAgICAgICBpZiAoZmFpbGVkKSB7CiAgICAgICAgICAgIHR5cGUgKz0gIiBmYWlsIjsKICAgICAgICAgICAgbWVzc2FnZSA9IGZhaWxlZCArICIgZmFpbHVyZSIgKyAoZmFpbGVkID4gMSA/ICJzIiA6ICIiKTsKICAgICAgICAgIH0gZWxzZSBpZiAoY291bnQgPCB0b3RhbFRlc3RzKSB7CiAgICAgICAgICAgIGZhaWxlZCA9IHRvdGFsVGVzdHMgLSBjb3VudDsKICAgICAgICAgICAgdHlwZSArPSAiIGZhaWwiOwogICAgICAgICAgICBtZXNzYWdlID0gZmFpbGVkICsgIiBmYWlsdXJlIiArIChmYWlsZWQgPiAxID8gInMiIDogIiIpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdHlwZSArPSAiIG9rIjsKICAgICAgICAgICAgbWVzc2FnZSA9ICJBbGwgcGFzc2VkIjsKICAgICAgICAgICAgaWYgKHNraXBwZWQpIHsKICAgICAgICAgICAgICBtZXNzYWdlICs9ICIgKCIgKyBza2lwcGVkICsgIiBza2lwcGVkKSI7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHByb2dyZXNzVG90YWwubm9kZVZhbHVlID0gJyc7CiAgICAgICAgICBjdXN0b21NZXNzYWdlID0gdHJ1ZTsgLy8gSGFjayB0byBhdm9pZCBhZGRpbmcgdG8gb3V0cHV0CiAgICAgICAgfQogICAgICAgIGlmICh2ZXJib3NlICYmICFjdXN0b21NZXNzYWdlKSAgY3VzdG9tTWVzc2FnZSA9IG1lc3NhZ2U7CiAgICAgICAgc2V0U3RhdHVzKG1lc3NhZ2UsIHR5cGUpOwogICAgICAgIGlmIChjdXN0b21NZXNzYWdlICYmIGN1c3RvbU1lc3NhZ2UubGVuZ3RoID4gMCkgewogICAgICAgICAgYWRkT3V0cHV0KG5hbWUsIHR5cGUsIGN1c3RvbU1lc3NhZ2UpOwogICAgICAgIH0KICAgICAgfQogICAgPC9zY3JpcHQ+Cgo8L2FydGljbGU+Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/test/lint.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dmFyIGJsaW50ID0gcmVxdWlyZSgiYmxpbnQiKTsKClsibW9kZSIsICJsaWIiLCAiYWRkb24iLCAia2V5bWFwIl0uZm9yRWFjaChmdW5jdGlvbihkaXIpIHsKICBibGludC5jaGVja0RpcihkaXIsIHsKICAgIGJyb3dzZXI6IHRydWUsCiAgICBhbGxvd2VkR2xvYmFsczogWyJDb2RlTWlycm9yIiwgImRlZmluZSIsICJ0ZXN0IiwgInJlcXVpcmVqcyJdLAogICAgYmxvYjogIi8vIENvZGVNaXJyb3IsIGNvcHlyaWdodCAoYykgYnkgTWFyaWpuIEhhdmVyYmVrZSBhbmQgb3RoZXJzXG4vLyBEaXN0cmlidXRlZCB1bmRlciBhbiBNSVQgbGljZW5zZTogaHR0cDpcL1wvY29kZW1pcnJvci5uZXRcL0xJQ0VOU0VcblxuIgogIH0pOwp9KTsKClsic3JjIl0uZm9yRWFjaChmdW5jdGlvbihkaXIpIHsKICBibGludC5jaGVja0RpcihkaXIsIHsKICAgIGJyb3dzZXI6IHRydWUsCiAgICBlY21hVmVyc2lvbjogNiwKICAgIHNlbWljb2xvbnM6IGZhbHNlCiAgfSk7Cn0pOwoKbW9kdWxlLmV4cG9ydHMgPSB7b2s6IGJsaW50LnN1Y2Nlc3MoKX07Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/test/mode_test.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Lm10LW91dHB1dCAubXQtdG9rZW4gewogIGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7CiAgd2hpdGUtc3BhY2U6IHByZTsKICBmb250LWZhbWlseTogIkNvbnNvbGFzIiwgbW9ub3NwYWNlOwogIHRleHQtYWxpZ246IGNlbnRlcjsKfQoKLm10LW91dHB1dCAubXQtc3R5bGUgewogIGZvbnQtc2l6ZTogeC1zbWFsbDsKfQoKLm10LW91dHB1dCAubXQtc3RhdGUgewogIGZvbnQtc2l6ZTogeC1zbWFsbDsKICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwp9CgoubXQtb3V0cHV0IC5tdC1zdGF0ZS1yb3cgewogIGRpc3BsYXk6IG5vbmU7Cn0KCi5tdC1zdGF0ZS11bmhpZGUgLm10LW91dHB1dCAubXQtc3RhdGUtcm93IHsKICBkaXNwbGF5OiB0YWJsZS1yb3c7Cn0K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/test/mode_test.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIEhlbHBlciB0byB0ZXN0IENvZGVNaXJyb3IgaGlnaGxpZ2h0aW5nIG1vZGVzLiBJdCBwcmV0dHkgcHJpbnRzIG91dHB1dCBvZiB0aGUKICogaGlnaGxpZ2h0ZXIgYW5kIGNhbiBjaGVjayBhZ2FpbnN0IGV4cGVjdGVkIHN0eWxlcy4KICoKICogTW9kZSB0ZXN0cyBhcmUgcmVnaXN0ZXJlZCBieSBjYWxsaW5nIHRlc3QubW9kZSh0ZXN0TmFtZSwgbW9kZSwKICogdG9rZW5zKSwgd2hlcmUgbW9kZSBpcyBhIG1vZGUgb2JqZWN0IGFzIHJldHVybmVkIGJ5CiAqIENvZGVNaXJyb3IuZ2V0TW9kZSwgYW5kIHRva2VucyBpcyBhbiBhcnJheSBvZiBsaW5lcyB0aGF0IG1ha2UgdXAKICogdGhlIHRlc3QuCiAqCiAqIFRoZXNlIGxpbmVzIGFyZSBzdHJpbmdzLCBpbiB3aGljaCBzdHlsZWQgc3RyZXRjaGVzIG9mIGNvZGUgYXJlCiAqIGVuY2xvc2VkIGluIGJyYWNrZXRzIGBbXWAsIGFuZCBwcmVmaXhlZCBieSB0aGVpciBzdHlsZS4gRm9yCiAqIGV4YW1wbGUsIGBba2V5d29yZCBpZl1gLiBCcmFja2V0cyBpbiB0aGUgY29kZSBpdHNlbGYgbXVzdCBiZQogKiBkdXBsaWNhdGVkIHRvIHByZXZlbnQgdGhlbSBmcm9tIGJlaW5nIGludGVycHJldGVkIGFzIHRva2VuCiAqIGJvdW5kYXJpZXMuIEZvciBleGFtcGxlIGBhW1tpXV1gIGZvciBgYVtpXWAuIElmIGEgdG9rZW4gaGFzCiAqIG11bHRpcGxlIHN0eWxlcywgdGhlIHN0eWxlcyBtdXN0IGJlIHNlcGFyYXRlZCBieSBhbXBlcnNhbmRzLCBmb3IKICogZXhhbXBsZSBgW3RhZyZlcnJvciA8L2htdGw+XWAuCiAqCiAqIFNlZSB0aGUgdGVzdC5qcyBmaWxlcyBpbiB0aGUgY3NzLCBtYXJrZG93biwgZ2ZtLCBhbmQgc3RleCBtb2RlCiAqIGRpcmVjdG9yaWVzIGZvciBleGFtcGxlcy4KICovCihmdW5jdGlvbigpIHsKICBmdW5jdGlvbiBmaW5kU2luZ2xlKHN0ciwgcG9zLCBjaCkgewogICAgZm9yICg7OykgewogICAgICB2YXIgZm91bmQgPSBzdHIuaW5kZXhPZihjaCwgcG9zKTsKICAgICAgaWYgKGZvdW5kID09IC0xKSByZXR1cm4gbnVsbDsKICAgICAgaWYgKHN0ci5jaGFyQXQoZm91bmQgKyAxKSAhPSBjaCkgcmV0dXJuIGZvdW5kOwogICAgICBwb3MgPSBmb3VuZCArIDI7CiAgICB9CiAgfQoKICB2YXIgc3R5bGVOYW1lID0gL1tcdyYtX10rL2c7CiAgZnVuY3Rpb24gcGFyc2VUb2tlbnMoc3RycykgewogICAgdmFyIHRva2VucyA9IFtdLCBwbGFpbiA9ICIiOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHJzLmxlbmd0aDsgKytpKSB7CiAgICAgIGlmIChpKSBwbGFpbiArPSAiXG4iOwogICAgICB2YXIgc3RyID0gc3Ryc1tpXSwgcG9zID0gMDsKICAgICAgd2hpbGUgKHBvcyA8IHN0ci5sZW5ndGgpIHsKICAgICAgICB2YXIgc3R5bGUgPSBudWxsLCB0ZXh0OwogICAgICAgIGlmIChzdHIuY2hhckF0KHBvcykgPT0gIlsiICYmIHN0ci5jaGFyQXQocG9zKzEpICE9ICJbIikgewogICAgICAgICAgc3R5bGVOYW1lLmxhc3RJbmRleCA9IHBvcyArIDE7CiAgICAgICAgICB2YXIgbSA9IHN0eWxlTmFtZS5leGVjKHN0cik7CiAgICAgICAgICBzdHlsZSA9IG1bMF0ucmVwbGFjZSgvJi9nLCAiICIpOwogICAgICAgICAgdmFyIHRleHRTdGFydCA9IHBvcyArIHN0eWxlLmxlbmd0aCArIDI7CiAgICAgICAgICB2YXIgZW5kID0gZmluZFNpbmdsZShzdHIsIHRleHRTdGFydCwgIl0iKTsKICAgICAgICAgIGlmIChlbmQgPT0gbnVsbCkgdGhyb3cgbmV3IEVycm9yKCJVbnRlcm1pbmF0ZWQgdG9rZW4gYXQgIiArIHBvcyArICIgaW4gJyIgKyBzdHIgKyAiJyIgKyBzdHlsZSk7CiAgICAgICAgICB0ZXh0ID0gc3RyLnNsaWNlKHRleHRTdGFydCwgZW5kKTsKICAgICAgICAgIHBvcyA9IGVuZCArIDE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHZhciBlbmQgPSBmaW5kU2luZ2xlKHN0ciwgcG9zLCAiWyIpOwogICAgICAgICAgaWYgKGVuZCA9PSBudWxsKSBlbmQgPSBzdHIubGVuZ3RoOwogICAgICAgICAgdGV4dCA9IHN0ci5zbGljZShwb3MsIGVuZCk7CiAgICAgICAgICBwb3MgPSBlbmQ7CiAgICAgICAgfQogICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoL1xbXFt8XF1cXS9nLCBmdW5jdGlvbihzKSB7cmV0dXJuIHMuY2hhckF0KDApO30pOwogICAgICAgIHRva2Vucy5wdXNoKHtzdHlsZTogc3R5bGUsIHRleHQ6IHRleHR9KTsKICAgICAgICBwbGFpbiArPSB0ZXh0OwogICAgICB9CiAgICB9CiAgICByZXR1cm4ge3Rva2VuczogdG9rZW5zLCBwbGFpbjogcGxhaW59OwogIH0KCiAgdGVzdC5tb2RlID0gZnVuY3Rpb24obmFtZSwgbW9kZSwgdG9rZW5zLCBtb2RlTmFtZSkgewogICAgdmFyIGRhdGEgPSBwYXJzZVRva2Vucyh0b2tlbnMpOwogICAgcmV0dXJuIHRlc3QoKG1vZGVOYW1lIHx8IG1vZGUubmFtZSkgKyAiXyIgKyBuYW1lLCBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGNvbXBhcmUoZGF0YS5wbGFpbiwgZGF0YS50b2tlbnMsIG1vZGUpOwogICAgfSk7CiAgfTsKCiAgZnVuY3Rpb24gZXNjKHN0cikgewogICAgcmV0dXJuIHN0ci5yZXBsYWNlKCcmJywgJyZhbXA7JykucmVwbGFjZSgnPCcsICcmbHQ7JykucmVwbGFjZSgvPi9nLCAiJmd0OyIpLnJlcGxhY2UoLyIvZywgIiZxdW90OyIpLnJlcGxhY2UoLycvZywgIiYjMDM5OyIpOwo7CiAgfQoKICBmdW5jdGlvbiBjb21wYXJlKHRleHQsIGV4cGVjdGVkLCBtb2RlKSB7CgogICAgdmFyIGV4cGVjdGVkT3V0cHV0ID0gW107CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGV4cGVjdGVkLmxlbmd0aDsgKytpKSB7CiAgICAgIHZhciBzdHkgPSBleHBlY3RlZFtpXS5zdHlsZTsKICAgICAgaWYgKHN0eSAmJiBzdHkuaW5kZXhPZigiICIpKSBzdHkgPSBzdHkuc3BsaXQoJyAnKS5zb3J0KCkuam9pbignICcpOwogICAgICBleHBlY3RlZE91dHB1dC5wdXNoKHtzdHlsZTogc3R5LCB0ZXh0OiBleHBlY3RlZFtpXS50ZXh0fSk7CiAgICB9CgogICAgdmFyIG9ic2VydmVkT3V0cHV0ID0gaGlnaGxpZ2h0KHRleHQsIG1vZGUpOwoKICAgIHZhciBzID0gIiI7CiAgICB2YXIgZGlmZiA9IGhpZ2hsaWdodE91dHB1dHNEaWZmZXJlbnQoZXhwZWN0ZWRPdXRwdXQsIG9ic2VydmVkT3V0cHV0KTsKICAgIGlmIChkaWZmICE9IG51bGwpIHsKICAgICAgcyArPSAnPGRpdiBjbGFzcz0ibXQtdGVzdCBtdC1mYWlsIj4nOwogICAgICBzICs9ICAgJzxwcmU+JyArIGVzYyh0ZXh0KSArICc8L3ByZT4nOwogICAgICBzICs9ICAgJzxkaXYgY2xhc3M9ImNtLXMtZGVmYXVsdCI+JzsKICAgICAgcyArPSAnZXhwZWN0ZWQ6JzsKICAgICAgcyArPSAgIHByZXR0eVByaW50T3V0cHV0VGFibGUoZXhwZWN0ZWRPdXRwdXQsIGRpZmYpOwogICAgICBzICs9ICdvYnNlcnZlZDogWzxhIG9uY2xpY2s9InRoaXMucGFyZW50RWxlbWVudC5jbGFzc05hbWUrPVwnIG10LXN0YXRlLXVuaGlkZVwnIj5kaXNwbGF5IHN0YXRlczwvYT5dJzsKICAgICAgcyArPSAgIHByZXR0eVByaW50T3V0cHV0VGFibGUob2JzZXJ2ZWRPdXRwdXQsIGRpZmYpOwogICAgICBzICs9ICAgJzwvZGl2Pic7CiAgICAgIHMgKz0gJzwvZGl2Pic7CiAgICB9CiAgICBpZiAob2JzZXJ2ZWRPdXRwdXQuaW5kZW50RmFpbHVyZXMpIHsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvYnNlcnZlZE91dHB1dC5pbmRlbnRGYWlsdXJlcy5sZW5ndGg7IGkrKykKICAgICAgICBzICs9ICI8ZGl2IGNsYXNzPSdtdC10ZXN0IG10LWZhaWwnPiIgKyBlc2Mob2JzZXJ2ZWRPdXRwdXQuaW5kZW50RmFpbHVyZXNbaV0pICsgIjwvZGl2PiI7CiAgICB9CiAgICBpZiAocykgdGhyb3cgbmV3IEZhaWx1cmUocyk7CiAgfQoKICBmdW5jdGlvbiBzdHJpbmdpZnkob2JqKSB7CiAgICBmdW5jdGlvbiByZXBsYWNlcihrZXksIG9iaikgewogICAgICBpZiAodHlwZW9mIG9iaiA9PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgdmFyIG0gPSBvYmoudG9TdHJpbmcoKS5tYXRjaCgvZnVuY3Rpb25ccypbXlxzKF0qLyk7CiAgICAgICAgcmV0dXJuIG0gPyBtWzBdIDogImZ1bmN0aW9uIjsKICAgICAgfQogICAgICByZXR1cm4gb2JqOwogICAgfQogICAgaWYgKHdpbmRvdy5KU09OICYmIEpTT04uc3RyaW5naWZ5KQogICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkob2JqLCByZXBsYWNlciwgMik7CiAgICByZXR1cm4gIlt1bnN1cHBvcnRlZF0iOyAgLy8gRmFpbCBzYWZlbHkgaWYgbm8gbmF0aXZlIEpTT04uCiAgfQoKICBmdW5jdGlvbiBoaWdobGlnaHQoc3RyaW5nLCBtb2RlKSB7CiAgICB2YXIgc3RhdGUgPSBtb2RlLnN0YXJ0U3RhdGUoKTsKCiAgICB2YXIgbGluZXMgPSBzdHJpbmcucmVwbGFjZSgvXHJcbi9nLCdcbicpLnNwbGl0KCdcbicpOwogICAgdmFyIHN0ID0gW10sIHBvcyA9IDA7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmVzLmxlbmd0aDsgKytpKSB7CiAgICAgIHZhciBsaW5lID0gbGluZXNbaV0sIG5ld0xpbmUgPSB0cnVlOwogICAgICBpZiAobW9kZS5pbmRlbnQpIHsKICAgICAgICB2YXIgd3MgPSBsaW5lLm1hdGNoKC9eXHMqLylbMF07CiAgICAgICAgdmFyIGluZGVudCA9IG1vZGUuaW5kZW50KHN0YXRlLCBsaW5lLnNsaWNlKHdzLmxlbmd0aCkpOwogICAgICAgIGlmIChpbmRlbnQgIT0gQ29kZU1pcnJvci5QYXNzICYmIGluZGVudCAhPSB3cy5sZW5ndGgpCiAgICAgICAgICAoc3QuaW5kZW50RmFpbHVyZXMgfHwgKHN0LmluZGVudEZhaWx1cmVzID0gW10pKS5wdXNoKAogICAgICAgICAgICAiSW5kZW50YXRpb24gb2YgbGluZSAiICsgKGkgKyAxKSArICIgaXMgIiArIGluZGVudCArICIgKGV4cGVjdGVkICIgKyB3cy5sZW5ndGggKyAiKSIpOwogICAgICB9CiAgICAgIHZhciBzdHJlYW0gPSBuZXcgQ29kZU1pcnJvci5TdHJpbmdTdHJlYW0obGluZSk7CiAgICAgIGlmIChsaW5lID09ICIiICYmIG1vZGUuYmxhbmtMaW5lKSBtb2RlLmJsYW5rTGluZShzdGF0ZSk7CiAgICAgIC8qIFN0YXJ0IGNvcGllZCBjb2RlIGZyb20gQ29kZU1pcnJvci5oaWdobGlnaHQgKi8KICAgICAgd2hpbGUgKCFzdHJlYW0uZW9sKCkpIHsKICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IDEwICYmIHN0cmVhbS5zdGFydCA+PSBzdHJlYW0ucG9zOyBqKyspCiAgICAgICAgICB2YXIgY29tcGFyZSA9IG1vZGUudG9rZW4oc3RyZWFtLCBzdGF0ZSk7CiAgICAgICAgaWYgKGogPT0gMTApCiAgICAgICAgICB0aHJvdyBuZXcgRmFpbHVyZSgiRmFpbGVkIHRvIGFkdmFuY2UgdGhlIHN0cmVhbS4iICsgc3RyZWFtLnN0cmluZyArICIgIiArIHN0cmVhbS5wb3MpOwogICAgICAgIHZhciBzdWJzdHIgPSBzdHJlYW0uY3VycmVudCgpOwogICAgICAgIGlmIChjb21wYXJlICYmIGNvbXBhcmUuaW5kZXhPZigiICIpID4gLTEpIGNvbXBhcmUgPSBjb21wYXJlLnNwbGl0KCcgJykuc29ydCgpLmpvaW4oJyAnKTsKICAgICAgICBzdHJlYW0uc3RhcnQgPSBzdHJlYW0ucG9zOwogICAgICAgIGlmIChwb3MgJiYgc3RbcG9zLTFdLnN0eWxlID09IGNvbXBhcmUgJiYgIW5ld0xpbmUpIHsKICAgICAgICAgIHN0W3Bvcy0xXS50ZXh0ICs9IHN1YnN0cjsKICAgICAgICB9IGVsc2UgaWYgKHN1YnN0cikgewogICAgICAgICAgc3RbcG9zKytdID0ge3N0eWxlOiBjb21wYXJlLCB0ZXh0OiBzdWJzdHIsIHN0YXRlOiBzdHJpbmdpZnkoc3RhdGUpfTsKICAgICAgICB9CiAgICAgICAgLy8gR2l2ZSB1cCB3aGVuIGxpbmUgaXMgcmlkaWN1bG91c2x5IGxvbmcKICAgICAgICBpZiAoc3RyZWFtLnBvcyA+IDUwMDApIHsKICAgICAgICAgIHN0W3BvcysrXSA9IHtzdHlsZTogbnVsbCwgdGV4dDogdGhpcy50ZXh0LnNsaWNlKHN0cmVhbS5wb3MpfTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBuZXdMaW5lID0gZmFsc2U7CiAgICAgIH0KICAgIH0KCiAgICByZXR1cm4gc3Q7CiAgfQoKICBmdW5jdGlvbiBoaWdobGlnaHRPdXRwdXRzRGlmZmVyZW50KG8xLCBvMikgewogICAgdmFyIG1pbkxlbiA9IE1hdGgubWluKG8xLmxlbmd0aCwgbzIubGVuZ3RoKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbWluTGVuOyArK2kpCiAgICAgIGlmIChvMVtpXS5zdHlsZSAhPSBvMltpXS5zdHlsZSB8fCBvMVtpXS50ZXh0ICE9IG8yW2ldLnRleHQpIHJldHVybiBpOwogICAgaWYgKG8xLmxlbmd0aCA+IG1pbkxlbiB8fCBvMi5sZW5ndGggPiBtaW5MZW4pIHJldHVybiBtaW5MZW47CiAgfQoKICBmdW5jdGlvbiBwcmV0dHlQcmludE91dHB1dFRhYmxlKG91dHB1dCwgZGlmZkF0KSB7CiAgICB2YXIgcyA9ICc8dGFibGUgY2xhc3M9Im10LW91dHB1dCI+JzsKICAgIHMgKz0gJzx0cj4nOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvdXRwdXQubGVuZ3RoOyArK2kpIHsKICAgICAgdmFyIHN0eWxlID0gb3V0cHV0W2ldLnN0eWxlLCB2YWwgPSBvdXRwdXRbaV0udGV4dDsKICAgICAgcyArPQogICAgICAnPHRkIGNsYXNzPSJtdC10b2tlbiInICsgKGkgPT0gZGlmZkF0ID8gIiBzdHlsZT0nYmFja2dyb3VuZDogcGluayciIDogIiIpICsgJz4nICsKICAgICAgICAnPHNwYW4gY2xhc3M9ImNtLScgKyBlc2MoU3RyaW5nKHN0eWxlKSkgKyAnIj4nICsKICAgICAgICBlc2ModmFsLnJlcGxhY2UoLyAvZywnXHhiNycpKSArICAvLyDCtyBNSURETEUgRE9UCiAgICAgICAgJzwvc3Bhbj4nICsKICAgICAgICAnPC90ZD4nOwogICAgfQogICAgcyArPSAnPC90cj48dHI+JzsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb3V0cHV0Lmxlbmd0aDsgKytpKSB7CiAgICAgIHMgKz0gJzx0ZCBjbGFzcz0ibXQtc3R5bGUiPjxzcGFuPicgKyAob3V0cHV0W2ldLnN0eWxlIHx8IG51bGwpICsgJzwvc3Bhbj48L3RkPic7CiAgICB9CiAgICBpZihvdXRwdXRbMF0uc3RhdGUpIHsKICAgICAgcyArPSAnPC90cj48dHIgY2xhc3M9Im10LXN0YXRlLXJvdyIgdGl0bGU9IlN0YXRlIEFGVEVSIGVhY2ggdG9rZW4iPic7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgb3V0cHV0Lmxlbmd0aDsgKytpKSB7CiAgICAgICAgcyArPSAnPHRkIGNsYXNzPSJtdC1zdGF0ZSI+PHByZT4nICsgZXNjKG91dHB1dFtpXS5zdGF0ZSkgKyAnPC9wcmU+PC90ZD4nOwogICAgICB9CiAgICB9CiAgICBzICs9ICc8L3RyPjwvdGFibGU+JzsKICAgIHJldHVybiBzOwogIH0KfSkoKTsK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/test/multi_test.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKCkgewogIG5hbWVzcGFjZSA9ICJtdWx0aV8iOwoKICBmdW5jdGlvbiBoYXNTZWxlY3Rpb25zKGNtKSB7CiAgICB2YXIgc2VscyA9IGNtLmxpc3RTZWxlY3Rpb25zKCk7CiAgICB2YXIgZ2l2ZW4gPSAoYXJndW1lbnRzLmxlbmd0aCAtIDEpIC8gNDsKICAgIGlmIChzZWxzLmxlbmd0aCAhPSBnaXZlbikKICAgICAgdGhyb3cgbmV3IEZhaWx1cmUoImV4cGVjdGVkICIgKyBnaXZlbiArICIgc2VsZWN0aW9ucywgZm91bmQgIiArIHNlbHMubGVuZ3RoKTsKICAgIGZvciAodmFyIGkgPSAwLCBwID0gMTsgaSA8IGdpdmVuOyBpKyssIHAgKz0gNCkgewogICAgICB2YXIgYW5jaG9yID0gUG9zKGFyZ3VtZW50c1twXSwgYXJndW1lbnRzW3AgKyAxXSk7CiAgICAgIHZhciBoZWFkID0gUG9zKGFyZ3VtZW50c1twICsgMl0sIGFyZ3VtZW50c1twICsgM10pOwogICAgICBlcVBvcyhzZWxzW2ldLmFuY2hvciwgYW5jaG9yLCAiYW5jaG9yIG9mIHNlbGVjdGlvbiAiICsgaSk7CiAgICAgIGVxUG9zKHNlbHNbaV0uaGVhZCwgaGVhZCwgImhlYWQgb2Ygc2VsZWN0aW9uICIgKyBpKTsKICAgIH0KICB9CiAgZnVuY3Rpb24gaGFzQ3Vyc29ycyhjbSkgewogICAgdmFyIHNlbHMgPSBjbS5saXN0U2VsZWN0aW9ucygpOwogICAgdmFyIGdpdmVuID0gKGFyZ3VtZW50cy5sZW5ndGggLSAxKSAvIDI7CiAgICBpZiAoc2Vscy5sZW5ndGggIT0gZ2l2ZW4pCiAgICAgIHRocm93IG5ldyBGYWlsdXJlKCJleHBlY3RlZCAiICsgZ2l2ZW4gKyAiIHNlbGVjdGlvbnMsIGZvdW5kICIgKyBzZWxzLmxlbmd0aCk7CiAgICBmb3IgKHZhciBpID0gMCwgcCA9IDE7IGkgPCBnaXZlbjsgaSsrLCBwICs9IDIpIHsKICAgICAgZXFQb3Moc2Vsc1tpXS5hbmNob3IsIHNlbHNbaV0uaGVhZCwgInNvbWV0aGluZyBzZWxlY3RlZCBmb3IgIiArIGkpOwogICAgICB2YXIgaGVhZCA9IFBvcyhhcmd1bWVudHNbcF0sIGFyZ3VtZW50c1twICsgMV0pOwogICAgICBlcVBvcyhzZWxzW2ldLmhlYWQsIGhlYWQsICJzZWxlY3Rpb24gIiArIGkpOwogICAgfQogIH0KCiAgdGVzdENNKCJnZXRTZWxlY3Rpb24iLCBmdW5jdGlvbihjbSkgewogICAgc2VsZWN0KGNtLCB7YW5jaG9yOiBQb3MoMCwgMCksIGhlYWQ6IFBvcygxLCAyKX0sIHthbmNob3I6IFBvcygyLCAyKSwgaGVhZDogUG9zKDIsIDApfSk7CiAgICBlcShjbS5nZXRTZWxlY3Rpb24oKSwgIjEyMzRcbjU2XG45MCIpOwogICAgZXEoY20uZ2V0U2VsZWN0aW9uKGZhbHNlKS5qb2luKCJ8IiksICIxMjM0fDU2fDkwIik7CiAgICBlcShjbS5nZXRTZWxlY3Rpb25zKCkuam9pbigifCIpLCAiMTIzNFxuNTZ8OTAiKTsKICB9LCB7dmFsdWU6ICIxMjM0XG41Njc4XG45MCJ9KTsKCiAgdGVzdENNKCJzZXRTZWxlY3Rpb24iLCBmdW5jdGlvbihjbSkgewogICAgc2VsZWN0KGNtLCBQb3MoMywgMCksIFBvcygwLCAwKSwge2FuY2hvcjogUG9zKDIsIDUpLCBoZWFkOiBQb3MoMSwgMCl9KTsKICAgIGhhc1NlbGVjdGlvbnMoY20sIDAsIDAsIDAsIDAsCiAgICAgICAgICAgICAgICAgIDIsIDUsIDEsIDAsCiAgICAgICAgICAgICAgICAgIDMsIDAsIDMsIDApOwogICAgY20uc2V0U2VsZWN0aW9uKFBvcygxLCAyKSwgUG9zKDEsIDEpKTsKICAgIGhhc1NlbGVjdGlvbnMoY20sIDEsIDIsIDEsIDEpOwogICAgc2VsZWN0KGNtLCB7YW5jaG9yOiBQb3MoMSwgMSksIGhlYWQ6IFBvcygyLCA0KX0sCiAgICAgICAgICAge2FuY2hvcjogUG9zKDAsIDApLCBoZWFkOiBQb3MoMSwgMyl9LAogICAgICAgICAgIFBvcygzLCAwKSwgUG9zKDIsIDIpKTsKICAgIGhhc1NlbGVjdGlvbnMoY20sIDAsIDAsIDIsIDQsCiAgICAgICAgICAgICAgICAgIDMsIDAsIDMsIDApOwogICAgY20uc2V0U2VsZWN0aW9ucyhbe2FuY2hvcjogUG9zKDAsIDEpLCBoZWFkOiBQb3MoMCwgMil9LAogICAgICAgICAgICAgICAgICAgICAge2FuY2hvcjogUG9zKDEsIDEpLCBoZWFkOiBQb3MoMSwgMil9LAogICAgICAgICAgICAgICAgICAgICAge2FuY2hvcjogUG9zKDIsIDEpLCBoZWFkOiBQb3MoMiwgMil9XSwgMSk7CiAgICBlcVBvcyhjbS5nZXRDdXJzb3IoImhlYWQiKSwgUG9zKDEsIDIpKTsKICAgIGVxUG9zKGNtLmdldEN1cnNvcigiYW5jaG9yIiksIFBvcygxLCAxKSk7CiAgICBlcVBvcyhjbS5nZXRDdXJzb3IoImZyb20iKSwgUG9zKDEsIDEpKTsKICAgIGVxUG9zKGNtLmdldEN1cnNvcigidG8iKSwgUG9zKDEsIDIpKTsKICAgIGNtLnNldEN1cnNvcihQb3MoMSwgMSkpOwogICAgaGFzQ3Vyc29ycyhjbSwgMSwgMSk7CiAgfSwge3ZhbHVlOiAiYWJjZGVcbmFiY2RlXG5hYmNkZVxuIn0pOwoKICB0ZXN0Q00oInNvbWV0aGluZ1NlbGVjdGVkIiwgZnVuY3Rpb24oY20pIHsKICAgIHNlbGVjdChjbSwgUG9zKDAsIDEpLCB7YW5jaG9yOiBQb3MoMCwgMyksIGhlYWQ6IFBvcygwLCA1KX0pOwogICAgZXEoY20uc29tZXRoaW5nU2VsZWN0ZWQoKSwgdHJ1ZSk7CiAgICBzZWxlY3QoY20sIFBvcygwLCAxKSwgUG9zKDAsIDMpLCBQb3MoMCwgNSkpOwogICAgZXEoY20uc29tZXRoaW5nU2VsZWN0ZWQoKSwgZmFsc2UpOwogIH0sIHt2YWx1ZTogIjEyMzQ1Njc4OSJ9KTsKCiAgdGVzdENNKCJleHRlbmRTZWxlY3Rpb24iLCBmdW5jdGlvbihjbSkgewogICAgc2VsZWN0KGNtLCBQb3MoMCwgMSksIFBvcygxLCAxKSwgUG9zKDIsIDEpKTsKICAgIGNtLnNldEV4dGVuZGluZyh0cnVlKTsKICAgIGNtLmV4dGVuZFNlbGVjdGlvbnMoW1BvcygwLCAyKSwgUG9zKDEsIDApLCBQb3MoMiwgMyldKTsKICAgIGhhc1NlbGVjdGlvbnMoY20sIDAsIDEsIDAsIDIsCiAgICAgICAgICAgICAgICAgIDEsIDEsIDEsIDAsCiAgICAgICAgICAgICAgICAgIDIsIDEsIDIsIDMpOwogICAgY20uZXh0ZW5kU2VsZWN0aW9uKFBvcygyLCA0KSwgUG9zKDIsIDApKTsKICAgIGhhc1NlbGVjdGlvbnMoY20sIDIsIDQsIDIsIDApOwogIH0sIHt2YWx1ZTogIjEyMzRcbjEyMzRcbjEyMzQifSk7CgogIHRlc3RDTSgiYWRkU2VsZWN0aW9uIiwgZnVuY3Rpb24oY20pIHsKICAgIHNlbGVjdChjbSwgUG9zKDAsIDEpLCBQb3MoMSwgMSkpOwogICAgY20uYWRkU2VsZWN0aW9uKFBvcygwLCAwKSwgUG9zKDAsIDQpKTsKICAgIGhhc1NlbGVjdGlvbnMoY20sIDAsIDAsIDAsIDQsCiAgICAgICAgICAgICAgICAgIDEsIDEsIDEsIDEpOwogICAgY20uYWRkU2VsZWN0aW9uKFBvcygyLCAyKSk7CiAgICBoYXNTZWxlY3Rpb25zKGNtLCAwLCAwLCAwLCA0LAogICAgICAgICAgICAgICAgICAxLCAxLCAxLCAxLAogICAgICAgICAgICAgICAgICAyLCAyLCAyLCAyKTsKICB9LCB7dmFsdWU6ICIxMjM0XG4xMjM0XG4xMjM0In0pOwoKICB0ZXN0Q00oInJlcGxhY2VTZWxlY3Rpb24iLCBmdW5jdGlvbihjbSkgewogICAgdmFyIHNlbGVjdGlvbnMgPSBbe2FuY2hvcjogUG9zKDAsIDApLCBoZWFkOiBQb3MoMCwgMSl9LAogICAgICAgICAgICAgICAgICAgICAge2FuY2hvcjogUG9zKDAsIDIpLCBoZWFkOiBQb3MoMCwgMyl9LAogICAgICAgICAgICAgICAgICAgICAge2FuY2hvcjogUG9zKDAsIDQpLCBoZWFkOiBQb3MoMCwgNSl9LAogICAgICAgICAgICAgICAgICAgICAge2FuY2hvcjogUG9zKDIsIDEpLCBoZWFkOiBQb3MoMiwgNCl9LAogICAgICAgICAgICAgICAgICAgICAge2FuY2hvcjogUG9zKDIsIDUpLCBoZWFkOiBQb3MoMiwgNil9XTsKICAgIHZhciB2YWwgPSAiMTIzNDU2XG4xMjM0NTZcbjEyMzQ1NiI7CiAgICBjbS5zZXRWYWx1ZSh2YWwpOwogICAgY20uc2V0U2VsZWN0aW9ucyhzZWxlY3Rpb25zKTsKICAgIGNtLnJlcGxhY2VTZWxlY3Rpb24oImFiIiwgImFyb3VuZCIpOwogICAgZXEoY20uZ2V0VmFsdWUoKSwgImFiMmFiNGFiNlxuMTIzNDU2XG4xYWI1YWIiKTsKICAgIGhhc1NlbGVjdGlvbnMoY20sIDAsIDAsIDAsIDIsCiAgICAgICAgICAgICAgICAgIDAsIDMsIDAsIDUsCiAgICAgICAgICAgICAgICAgIDAsIDYsIDAsIDgsCiAgICAgICAgICAgICAgICAgIDIsIDEsIDIsIDMsCiAgICAgICAgICAgICAgICAgIDIsIDQsIDIsIDYpOwogICAgY20uc2V0VmFsdWUodmFsKTsKICAgIGNtLnNldFNlbGVjdGlvbnMoc2VsZWN0aW9ucyk7CiAgICBjbS5yZXBsYWNlU2VsZWN0aW9uKCIiLCAiYXJvdW5kIik7CiAgICBlcShjbS5nZXRWYWx1ZSgpLCAiMjQ2XG4xMjM0NTZcbjE1Iik7CiAgICBoYXNTZWxlY3Rpb25zKGNtLCAwLCAwLCAwLCAwLAogICAgICAgICAgICAgICAgICAwLCAxLCAwLCAxLAogICAgICAgICAgICAgICAgICAwLCAyLCAwLCAyLAogICAgICAgICAgICAgICAgICAyLCAxLCAyLCAxLAogICAgICAgICAgICAgICAgICAyLCAyLCAyLCAyKTsKICAgIGNtLnNldFZhbHVlKHZhbCk7CiAgICBjbS5zZXRTZWxlY3Rpb25zKHNlbGVjdGlvbnMpOwogICAgY20ucmVwbGFjZVNlbGVjdGlvbigiWFxuWVxuWiIsICJhcm91bmQiKTsKICAgIGhhc1NlbGVjdGlvbnMoY20sIDAsIDAsIDIsIDEsCiAgICAgICAgICAgICAgICAgIDIsIDIsIDQsIDEsCiAgICAgICAgICAgICAgICAgIDQsIDIsIDYsIDEsCiAgICAgICAgICAgICAgICAgIDgsIDEsIDEwLCAxLAogICAgICAgICAgICAgICAgICAxMCwgMiwgMTIsIDEpOwogICAgY20ucmVwbGFjZVNlbGVjdGlvbigiYSIsICJhcm91bmQiKTsKICAgIGhhc1NlbGVjdGlvbnMoY20sIDAsIDAsIDAsIDEsCiAgICAgICAgICAgICAgICAgIDAsIDIsIDAsIDMsCiAgICAgICAgICAgICAgICAgIDAsIDQsIDAsIDUsCiAgICAgICAgICAgICAgICAgIDIsIDEsIDIsIDIsCiAgICAgICAgICAgICAgICAgIDIsIDMsIDIsIDQpOwogICAgY20ucmVwbGFjZVNlbGVjdGlvbigieHkiLCAic3RhcnQiKTsKICAgIGhhc1NlbGVjdGlvbnMoY20sIDAsIDAsIDAsIDAsCiAgICAgICAgICAgICAgICAgIDAsIDMsIDAsIDMsCiAgICAgICAgICAgICAgICAgIDAsIDYsIDAsIDYsCiAgICAgICAgICAgICAgICAgIDIsIDEsIDIsIDEsCiAgICAgICAgICAgICAgICAgIDIsIDQsIDIsIDQpOwogICAgY20ucmVwbGFjZVNlbGVjdGlvbigielxuZiIpOwogICAgaGFzU2VsZWN0aW9ucyhjbSwgMSwgMSwgMSwgMSwKICAgICAgICAgICAgICAgICAgMiwgMSwgMiwgMSwKICAgICAgICAgICAgICAgICAgMywgMSwgMywgMSwKICAgICAgICAgICAgICAgICAgNiwgMSwgNiwgMSwKICAgICAgICAgICAgICAgICAgNywgMSwgNywgMSk7CiAgICBlcShjbS5nZXRWYWx1ZSgpLCAielxuZnh5MnpcbmZ4eTR6XG5meHk2XG4xMjM0NTZcbjF6XG5meHk1elxuZnh5Iik7CiAgfSk7CgogIGZ1bmN0aW9uIHNlbGVjdChjbSkgewogICAgdmFyIHNlbHMgPSBbXTsKICAgIGZvciAodmFyIGkgPSAxOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgIHZhciBhcmcgPSBhcmd1bWVudHNbaV07CiAgICAgIGlmIChhcmcuaGVhZCkgc2Vscy5wdXNoKGFyZyk7CiAgICAgIGVsc2Ugc2Vscy5wdXNoKHtoZWFkOiBhcmcsIGFuY2hvcjogYXJnfSk7CiAgICB9CiAgICBjbS5zZXRTZWxlY3Rpb25zKHNlbHMsIHNlbHMubGVuZ3RoIC0gMSk7CiAgfQoKICB0ZXN0Q00oImluZGVudFNlbGVjdGlvbiIsIGZ1bmN0aW9uKGNtKSB7CiAgICBzZWxlY3QoY20sIFBvcygwLCAxKSwgUG9zKDEsIDEpKTsKICAgIGNtLmluZGVudFNlbGVjdGlvbig0KTsKICAgIGVxKGNtLmdldFZhbHVlKCksICIgICAgZm9vXG4gICAgYmFyXG5iYXoiKTsKCiAgICBzZWxlY3QoY20sIFBvcygwLCAyKSwgUG9zKDAsIDMpLCBQb3MoMCwgNCkpOwogICAgY20uaW5kZW50U2VsZWN0aW9uKC0yKTsKICAgIGVxKGNtLmdldFZhbHVlKCksICIgIGZvb1xuICAgIGJhclxuYmF6Iik7CgogICAgc2VsZWN0KGNtLCB7YW5jaG9yOiBQb3MoMCwgMCksIGhlYWQ6IFBvcygxLCAyKX0sCiAgICAgICAgICAge2FuY2hvcjogUG9zKDEsIDMpLCBoZWFkOiBQb3MoMiwgMCl9KTsKICAgIGNtLmluZGVudFNlbGVjdGlvbigtMik7CiAgICBlcShjbS5nZXRWYWx1ZSgpLCAiZm9vXG4gIGJhclxuYmF6Iik7CiAgfSwge3ZhbHVlOiAiZm9vXG5iYXJcbmJheiJ9KTsKCiAgdGVzdENNKCJraWxsTGluZSIsIGZ1bmN0aW9uKGNtKSB7CiAgICBzZWxlY3QoY20sIFBvcygwLCAxKSwgUG9zKDAsIDIpLCBQb3MoMSwgMSkpOwogICAgY20uZXhlY0NvbW1hbmQoImtpbGxMaW5lIik7CiAgICBlcShjbS5nZXRWYWx1ZSgpLCAiZlxuYlxuYmF6Iik7CiAgICBjbS5leGVjQ29tbWFuZCgia2lsbExpbmUiKTsKICAgIGVxKGNtLmdldFZhbHVlKCksICJmYmJheiIpOwogICAgY20uc2V0VmFsdWUoImZvb1xuYmFyXG5iYXoiKTsKICAgIHNlbGVjdChjbSwgUG9zKDAsIDEpLCB7YW5jaG9yOiBQb3MoMCwgMiksIGhlYWQ6IFBvcygyLCAxKX0pOwogICAgY20uZXhlY0NvbW1hbmQoImtpbGxMaW5lIik7CiAgICBlcShjbS5nZXRWYWx1ZSgpLCAiZmF6Iik7CiAgfSwge3ZhbHVlOiAiZm9vXG5iYXJcbmJheiJ9KTsKCiAgdGVzdENNKCJkZWxldGVMaW5lIiwgZnVuY3Rpb24oY20pIHsKICAgIHNlbGVjdChjbSwgUG9zKDAsIDApLAogICAgICAgICAgIHtoZWFkOiBQb3MoMCwgMSksIGFuY2hvcjogUG9zKDIsIDApfSwKICAgICAgICAgICBQb3MoNCwgMCkpOwogICAgY20uZXhlY0NvbW1hbmQoImRlbGV0ZUxpbmUiKTsKICAgIGVxKGNtLmdldFZhbHVlKCksICI0XG42XG43Iik7CiAgICBzZWxlY3QoY20sIFBvcygyLCAxKSk7CiAgICBjbS5leGVjQ29tbWFuZCgiZGVsZXRlTGluZSIpOwogICAgZXEoY20uZ2V0VmFsdWUoKSwgIjRcbjZcbiIpOwogIH0sIHt2YWx1ZTogIjFcbjJcbjNcbjRcbjVcbjZcbjcifSk7CgogIHRlc3RDTSgiZGVsZXRlSCIsIGZ1bmN0aW9uKGNtKSB7CiAgICBzZWxlY3QoY20sIFBvcygwLCA0KSwge2FuY2hvcjogUG9zKDEsIDQpLCBoZWFkOiBQb3MoMSwgNSl9KTsKICAgIGNtLmV4ZWNDb21tYW5kKCJkZWxXb3JkQWZ0ZXIiKTsKICAgIGVxKGNtLmdldFZhbHVlKCksICJmb28gYmFyIGJhelxuYWJjIGVmIGdoaVxuIik7CiAgICBjbS5leGVjQ29tbWFuZCgiZGVsV29yZEFmdGVyIik7CiAgICBlcShjbS5nZXRWYWx1ZSgpLCAiZm9vICBiYXpcbmFiYyAgZ2hpXG4iKTsKICAgIGNtLmV4ZWNDb21tYW5kKCJkZWxDaGFyQmVmb3JlIik7CiAgICBjbS5leGVjQ29tbWFuZCgiZGVsQ2hhckJlZm9yZSIpOwogICAgZXEoY20uZ2V0VmFsdWUoKSwgImZvIGJhelxuYWIgZ2hpXG4iKTsKICAgIHNlbGVjdChjbSwgUG9zKDAsIDMpLCBQb3MoMCwgNCksIFBvcygwLCA1KSk7CiAgICBjbS5leGVjQ29tbWFuZCgiZGVsV29yZEFmdGVyIik7CiAgICBlcShjbS5nZXRWYWx1ZSgpLCAiZm8gXG5hYiBnaGlcbiIpOwogIH0sIHt2YWx1ZTogImZvbyBiYXIgYmF6XG5hYmMgZGVmIGdoaVxuIn0pOwoKICB0ZXN0Q00oImdvTGluZVN0YXJ0IiwgZnVuY3Rpb24oY20pIHsKICAgIHNlbGVjdChjbSwgUG9zKDAsIDIpLCBQb3MoMCwgMyksIFBvcygxLCAxKSk7CiAgICBjbS5leGVjQ29tbWFuZCgiZ29MaW5lU3RhcnQiKTsKICAgIGhhc0N1cnNvcnMoY20sIDAsIDAsIDEsIDApOwogICAgc2VsZWN0KGNtLCBQb3MoMSwgMSksIFBvcygwLCAxKSk7CiAgICBjbS5zZXRFeHRlbmRpbmcodHJ1ZSk7CiAgICBjbS5leGVjQ29tbWFuZCgiZ29MaW5lU3RhcnQiKTsKICAgIGhhc1NlbGVjdGlvbnMoY20sIDAsIDEsIDAsIDAsCiAgICAgICAgICAgICAgICAgIDEsIDEsIDEsIDApOwogIH0sIHt2YWx1ZTogImZvb1xuYmFyXG5iYXoifSk7CgogIHRlc3RDTSgibW92ZVYiLCBmdW5jdGlvbihjbSkgewogICAgc2VsZWN0KGNtLCBQb3MoMCwgMiksIFBvcygxLCAyKSk7CiAgICBjbS5leGVjQ29tbWFuZCgiZ29MaW5lRG93biIpOwogICAgaGFzQ3Vyc29ycyhjbSwgMSwgMiwgMiwgMik7CiAgICBjbS5leGVjQ29tbWFuZCgiZ29MaW5lVXAiKTsKICAgIGhhc0N1cnNvcnMoY20sIDAsIDIsIDEsIDIpOwogICAgY20uZXhlY0NvbW1hbmQoImdvTGluZVVwIik7CiAgICBoYXNDdXJzb3JzKGNtLCAwLCAwLCAwLCAyKTsKICAgIGNtLmV4ZWNDb21tYW5kKCJnb0xpbmVVcCIpOwogICAgaGFzQ3Vyc29ycyhjbSwgMCwgMCk7CiAgICBzZWxlY3QoY20sIFBvcygwLCAyKSwgUG9zKDEsIDIpKTsKICAgIGNtLnNldEV4dGVuZGluZyh0cnVlKTsKICAgIGNtLmV4ZWNDb21tYW5kKCJnb0xpbmVEb3duIik7CiAgICBoYXNTZWxlY3Rpb25zKGNtLCAwLCAyLCAyLCAyKTsKICB9LCB7dmFsdWU6ICIxMjM0NVxuMTIzNDVcbjEyMzQ1In0pOwoKICB0ZXN0Q00oIm1vdmVIIiwgZnVuY3Rpb24oY20pIHsKICAgIHNlbGVjdChjbSwgUG9zKDAsIDEpLCBQb3MoMCwgMyksIFBvcygwLCA1KSwgUG9zKDIsIDMpKTsKICAgIGNtLmV4ZWNDb21tYW5kKCJnb0NoYXJSaWdodCIpOwogICAgaGFzQ3Vyc29ycyhjbSwgMCwgMiwgMCwgNCwgMSwgMCwgMiwgNCk7CiAgICBjbS5leGVjQ29tbWFuZCgiZ29DaGFyTGVmdCIpOwogICAgaGFzQ3Vyc29ycyhjbSwgMCwgMSwgMCwgMywgMCwgNSwgMiwgMyk7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDE1OyBpKyspCiAgICAgIGNtLmV4ZWNDb21tYW5kKCJnb0NoYXJSaWdodCIpOwogICAgaGFzQ3Vyc29ycyhjbSwgMiwgNCwgMiwgNSk7CiAgfSwge3ZhbHVlOiAiMTIzNDVcbjEyMzQ1XG4xMjM0NSJ9KTsKCiAgdGVzdENNKCJuZXdsaW5lQW5kSW5kZW50IiwgZnVuY3Rpb24oY20pIHsKICAgIHNlbGVjdChjbSwgUG9zKDAsIDUpLCBQb3MoMSwgNSkpOwogICAgY20uZXhlY0NvbW1hbmQoIm5ld2xpbmVBbmRJbmRlbnQiKTsKICAgIGhhc0N1cnNvcnMoY20sIDEsIDIsIDMsIDIpOwogICAgZXEoY20uZ2V0VmFsdWUoKSwgInggPSBbXG4gIDFdO1xueSA9IFtcbiAgMl07Iik7CiAgICBjbS51bmRvKCk7CiAgICBlcShjbS5nZXRWYWx1ZSgpLCAieCA9IFsxXTtcbnkgPSBbMl07Iik7CiAgICBoYXNDdXJzb3JzKGNtLCAwLCA1LCAxLCA1KTsKICAgIHNlbGVjdChjbSwgUG9zKDAsIDUpLCBQb3MoMCwgNikpOwogICAgY20uZXhlY0NvbW1hbmQoIm5ld2xpbmVBbmRJbmRlbnQiKTsKICAgIGhhc0N1cnNvcnMoY20sIDEsIDIsIDIsIDApOwogICAgZXEoY20uZ2V0VmFsdWUoKSwgInggPSBbXG4gIDFcbl07XG55ID0gWzJdOyIpOwogIH0sIHt2YWx1ZTogInggPSBbMV07XG55ID0gWzJdOyIsIG1vZGU6ICJqYXZhc2NyaXB0In0pOwoKICB0ZXN0Q00oImdvRG9jU3RhcnRFbmQiLCBmdW5jdGlvbihjbSkgewogICAgc2VsZWN0KGNtLCBQb3MoMCwgMSksIFBvcygxLCAxKSk7CiAgICBjbS5leGVjQ29tbWFuZCgiZ29Eb2NTdGFydCIpOwogICAgaGFzQ3Vyc29ycyhjbSwgMCwgMCk7CiAgICBzZWxlY3QoY20sIFBvcygwLCAxKSwgUG9zKDEsIDEpKTsKICAgIGNtLmV4ZWNDb21tYW5kKCJnb0RvY0VuZCIpOwogICAgaGFzQ3Vyc29ycyhjbSwgMSwgMyk7CiAgICBzZWxlY3QoY20sIFBvcygwLCAxKSwgUG9zKDEsIDEpKTsKICAgIGNtLnNldEV4dGVuZGluZyh0cnVlKTsKICAgIGNtLmV4ZWNDb21tYW5kKCJnb0RvY0VuZCIpOwogICAgaGFzU2VsZWN0aW9ucyhjbSwgMSwgMSwgMSwgMyk7CiAgfSwge3ZhbHVlOiAiYWJjXG5kZWYifSk7CgogIHRlc3RDTSgic2VsZWN0aW9uSGlzdG9yeSIsIGZ1bmN0aW9uKGNtKSB7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IDM7ICsraSkKICAgICAgY20uYWRkU2VsZWN0aW9uKFBvcygwLCBpICogMiksIFBvcygwLCBpICogMiArIDEpKTsKICAgIGNtLmV4ZWNDb21tYW5kKCJ1bmRvU2VsZWN0aW9uIik7CiAgICBlcShjbS5nZXRTZWxlY3Rpb24oKSwgIjFcbjIiKTsKICAgIGNtLmV4ZWNDb21tYW5kKCJ1bmRvU2VsZWN0aW9uIik7CiAgICBlcShjbS5nZXRTZWxlY3Rpb24oKSwgIjEiKTsKICAgIGNtLmV4ZWNDb21tYW5kKCJ1bmRvU2VsZWN0aW9uIik7CiAgICBlcShjbS5nZXRTZWxlY3Rpb24oKSwgIiIpOwogICAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygwLCAwKSk7CiAgICBjbS5leGVjQ29tbWFuZCgicmVkb1NlbGVjdGlvbiIpOwogICAgZXEoY20uZ2V0U2VsZWN0aW9uKCksICIxIik7CiAgICBjbS5leGVjQ29tbWFuZCgicmVkb1NlbGVjdGlvbiIpOwogICAgZXEoY20uZ2V0U2VsZWN0aW9uKCksICIxXG4yIik7CiAgICBjbS5leGVjQ29tbWFuZCgicmVkb1NlbGVjdGlvbiIpOwogICAgZXEoY20uZ2V0U2VsZWN0aW9uKCksICIxXG4yXG4zIik7CiAgfSwge3ZhbHVlOiAiMSAyIDMifSk7Cn0pKCk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/test/phantom_driver.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dmFyIHBhZ2UgPSByZXF1aXJlKCd3ZWJwYWdlJykuY3JlYXRlKCk7CgpwYWdlLm9wZW4oImh0dHA6Ly9sb2NhbGhvc3Q6MzAwMC90ZXN0L2luZGV4Lmh0bWwiLCBmdW5jdGlvbiAoc3RhdHVzKSB7CiAgaWYgKHN0YXR1cyAhPSAic3VjY2VzcyIpIHsKICAgIGNvbnNvbGUubG9nKCJwYWdlIGNvdWxkbid0IGJlIGxvYWRlZCBzdWNjZXNzZnVsbHkiKTsKICAgIHBoYW50b20uZXhpdCgxKTsKICB9CiAgd2FpdEZvcihmdW5jdGlvbiAoKSB7CiAgICByZXR1cm4gcGFnZS5ldmFsdWF0ZShmdW5jdGlvbiAoKSB7CiAgICAgIHZhciBvdXRwdXQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc3RhdHVzJyk7CiAgICAgIGlmICghb3V0cHV0KSB7IHJldHVybiBmYWxzZTsgfQogICAgICByZXR1cm4gKC9eKFxkKyBmYWlsdXJlcz98YWxsIHBhc3NlZCkvaSkudGVzdChvdXRwdXQuaW5uZXJUZXh0KTsKICAgIH0pOwogIH0sIGZ1bmN0aW9uICgpIHsKICAgIHZhciBmYWlsZWQgPSBwYWdlLmV2YWx1YXRlKGZ1bmN0aW9uICgpIHsgcmV0dXJuIHdpbmRvdy5mYWlsZWQ7IH0pOwogICAgdmFyIG91dHB1dCA9IHBhZ2UuZXZhbHVhdGUoZnVuY3Rpb24gKCkgewogICAgICByZXR1cm4gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ291dHB1dCcpLmlubmVyVGV4dCArICJcbiIgKwogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdzdGF0dXMnKS5pbm5lclRleHQ7CiAgICB9KTsKICAgIGNvbnNvbGUubG9nKG91dHB1dCk7CiAgICBwaGFudG9tLmV4aXQoZmFpbGVkID4gMCA/IDEgOiAwKTsKICB9KTsKfSk7CgpmdW5jdGlvbiB3YWl0Rm9yICh0ZXN0LCBjYikgewogIGlmICh0ZXN0KCkpIHsKICAgIGNiKCk7CiAgfSBlbHNlIHsKICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyB3YWl0Rm9yKHRlc3QsIGNiKTsgfSwgMjUwKTsKICB9Cn0K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/test/run.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[IyEvdXNyL2Jpbi9lbnYgbm9kZQoKdmFyIG9rID0gcmVxdWlyZSgiLi9saW50Iikub2s7Cgp2YXIgZmlsZXMgPSBuZXcgKHJlcXVpcmUoJ25vZGUtc3RhdGljJykuU2VydmVyKSgpOwoKdmFyIHNlcnZlciA9IHJlcXVpcmUoJ2h0dHAnKS5jcmVhdGVTZXJ2ZXIoZnVuY3Rpb24gKHJlcSwgcmVzKSB7CiAgcmVxLmFkZExpc3RlbmVyKCdlbmQnLCBmdW5jdGlvbiAoKSB7CiAgICBmaWxlcy5zZXJ2ZShyZXEsIHJlcywgZnVuY3Rpb24gKGVyci8qLCByZXN1bHQgKi8pIHsKICAgICAgaWYgKGVycikgewogICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTsKICAgICAgICBwcm9jZXNzLmV4aXQoMSk7CiAgICAgIH0KICAgIH0pOwogIH0pLnJlc3VtZSgpOwp9KS5hZGRMaXN0ZW5lcignZXJyb3InLCBmdW5jdGlvbiAoZXJyKSB7CiAgdGhyb3cgZXJyOwp9KS5saXN0ZW4oMzAwMCwgZnVuY3Rpb24gKCkgewogIHZhciBjaGlsZFByb2Nlc3MgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJyk7CiAgdmFyIHBoYW50b21qcyA9IHJlcXVpcmUoInBoYW50b21qcy1wcmVidWlsdCIpOwogIHZhciBjaGlsZEFyZ3MgPSBbCiAgICByZXF1aXJlKCJwYXRoIikuam9pbihfX2Rpcm5hbWUsICdwaGFudG9tX2RyaXZlci5qcycpCiAgXTsKICBjaGlsZFByb2Nlc3MuZXhlY0ZpbGUocGhhbnRvbWpzLnBhdGgsIGNoaWxkQXJncywgZnVuY3Rpb24gKGVyciwgc3Rkb3V0LCBzdGRlcnIpIHsKICAgIHNlcnZlci5jbG9zZSgpOwogICAgY29uc29sZS5sb2coc3Rkb3V0KTsKICAgIGlmIChlcnIpIGNvbnNvbGUuZXJyb3IoZXJyKTsKICAgIGlmIChzdGRlcnIpIGNvbnNvbGUuZXJyb3Ioc3RkZXJyKTsKICAgIHByb2Nlc3MuZXhpdChlcnIgfHwgc3RkZXJyIHx8ICFvayA/IDEgOiAwKTsKICB9KTsKfSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/test/scroll_test.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKCkgewogICJ1c2Ugc3RyaWN0IjsKCiAgbmFtZXNwYWNlID0gInNjcm9sbF8iOwoKICB0ZXN0Q00oImJhcnNfaGlkZGVuIiwgZnVuY3Rpb24oY20pIHsKICAgIGZvciAodmFyIGkgPSAwOzsgaSsrKSB7CiAgICAgIHZhciB3cmFwQm94ID0gY20uZ2V0V3JhcHBlckVsZW1lbnQoKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgdmFyIHNjcm9sbEJveCA9IGNtLmdldFNjcm9sbGVyRWxlbWVudCgpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICBpcyh3cmFwQm94LmJvdHRvbSA8IHNjcm9sbEJveC5ib3R0b20gLSAxMCk7CiAgICAgIGlzKHdyYXBCb3gucmlnaHQgPCBzY3JvbGxCb3gucmlnaHQgLSAxMCk7CiAgICAgIGlmIChpID09IDEpIGJyZWFrOwogICAgICBjbS5nZXRXcmFwcGVyRWxlbWVudCgpLnN0eWxlLmhlaWdodCA9ICJhdXRvIjsKICAgICAgY20ucmVmcmVzaCgpOwogICAgfQogIH0pOwogIAogIGZ1bmN0aW9uIGJhckgoY20pIHsgcmV0dXJuIGJ5Q2xhc3NOYW1lKGNtLmdldFdyYXBwZXJFbGVtZW50KCksICJDb2RlTWlycm9yLWhzY3JvbGxiYXIiKVswXTsgfQogIGZ1bmN0aW9uIGJhclYoY20pIHsgcmV0dXJuIGJ5Q2xhc3NOYW1lKGNtLmdldFdyYXBwZXJFbGVtZW50KCksICJDb2RlTWlycm9yLXZzY3JvbGxiYXIiKVswXTsgfQoKICBmdW5jdGlvbiBkaXNwbGF5Qm90dG9tKGNtLCBzY3JvbGxiYXIpIHsKICAgIGlmIChzY3JvbGxiYXIgJiYgY20uZGlzcGxheS5zY3JvbGxlci5vZmZzZXRIZWlnaHQgPiBjbS5kaXNwbGF5LnNjcm9sbGVyLmNsaWVudEhlaWdodCkKICAgICAgcmV0dXJuIGJhckgoY20pLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDsKICAgIGVsc2UKICAgICAgcmV0dXJuIGNtLmdldFdyYXBwZXJFbGVtZW50KCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tIC0gMTsKICB9CgogIGZ1bmN0aW9uIGRpc3BsYXlSaWdodChjbSwgc2Nyb2xsYmFyKSB7CiAgICBpZiAoc2Nyb2xsYmFyICYmIGNtLmRpc3BsYXkuc2Nyb2xsZXIub2Zmc2V0V2lkdGggPiBjbS5kaXNwbGF5LnNjcm9sbGVyLmNsaWVudFdpZHRoKQogICAgICByZXR1cm4gYmFyVihjbSkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdDsKICAgIGVsc2UKICAgICAgcmV0dXJuIGNtLmdldFdyYXBwZXJFbGVtZW50KCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkucmlnaHQgLSAxOwogIH0KCiAgZnVuY3Rpb24gdGVzdE1vdmVkb3duRml4ZWQoY20sIGhTY3JvbGwpIHsKICAgIGNtLnNldFNpemUoIjEwMHB4IiwgIjEwMHB4Iik7CiAgICBpZiAoaFNjcm9sbCkgY20uc2V0VmFsdWUobmV3IEFycmF5KDEwMCkuam9pbigieCIpKTsKICAgIHZhciBib3R0b20gPSBkaXNwbGF5Qm90dG9tKGNtLCBoU2Nyb2xsKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMzA7IGkrKykgewogICAgICBjbS5yZXBsYWNlU2VsZWN0aW9uKCJ4XG4iKTsKICAgICAgdmFyIGN1cnNvckJvdHRvbSA9IGNtLmN1cnNvckNvb3JkcyhudWxsLCAid2luZG93IikuYm90dG9tOwogICAgICBpcyhjdXJzb3JCb3R0b20gPD0gYm90dG9tKTsKICAgIH0KICAgIGlzKGN1cnNvckJvdHRvbSA+PSBib3R0b20gLSA1KTsKICB9CgogIHRlc3RDTSgibW92ZWRvd25fZml4ZWQiLCBmdW5jdGlvbihjbSkge3Rlc3RNb3ZlZG93bkZpeGVkKGNtLCBmYWxzZSk7fSk7CiAgdGVzdENNKCJtb3ZlZG93bl9oc2Nyb2xsX2ZpeGVkIiwgZnVuY3Rpb24oY20pIHt0ZXN0TW92ZWRvd25GaXhlZChjbSwgdHJ1ZSk7fSk7CgogIGZ1bmN0aW9uIHRlc3RNb3ZlZG93blJlc2l6ZShjbSwgaFNjcm9sbCkgewogICAgY20uZ2V0V3JhcHBlckVsZW1lbnQoKS5zdHlsZS5oZWlnaHQgPSAiYXV0byI7CiAgICBpZiAoaFNjcm9sbCkgY20uc2V0VmFsdWUobmV3IEFycmF5KDEwMCkuam9pbigieCIpKTsKICAgIGNtLnJlZnJlc2goKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMzA7IGkrKykgewogICAgICBjbS5yZXBsYWNlU2VsZWN0aW9uKCJ4XG4iKTsKICAgICAgdmFyIGJvdHRvbSA9IGRpc3BsYXlCb3R0b20oY20sIGhTY3JvbGwpOwogICAgICB2YXIgY3Vyc29yQm90dG9tID0gY20uY3Vyc29yQ29vcmRzKG51bGwsICJ3aW5kb3ciKS5ib3R0b207CiAgICAgIGlzKGN1cnNvckJvdHRvbSA8PSBib3R0b20pOwogICAgICBpcyhjdXJzb3JCb3R0b20gPj0gYm90dG9tIC0gNSk7CiAgICB9CiAgfQoKICB0ZXN0Q00oIm1vdmVkb3duX3Jlc2l6ZSIsIGZ1bmN0aW9uKGNtKSB7dGVzdE1vdmVkb3duUmVzaXplKGNtLCBmYWxzZSk7fSk7CiAgdGVzdENNKCJtb3ZlZG93bl9oc2Nyb2xsX3Jlc2l6ZSIsIGZ1bmN0aW9uKGNtKSB7dGVzdE1vdmVkb3duUmVzaXplKGNtLCB0cnVlKTt9KTsKCiAgZnVuY3Rpb24gdGVzdE1vdmVyaWdodChjbSwgd3JhcCwgc2Nyb2xsKSB7CiAgICBjbS5zZXRTaXplKCIxMDBweCIsICIxMDBweCIpOwogICAgaWYgKHdyYXApIGNtLnNldE9wdGlvbigibGluZVdyYXBwaW5nIiwgdHJ1ZSk7CiAgICBpZiAoc2Nyb2xsKSB7CiAgICAgIGNtLnNldFZhbHVlKCJcbiIgKyBuZXcgQXJyYXkoMTAwKS5qb2luKCJ4XG4iKSk7CiAgICAgIGNtLnNldEN1cnNvcihQb3MoMCwgMCkpOwogICAgfQogICAgdmFyIHJpZ2h0ID0gZGlzcGxheVJpZ2h0KGNtLCBzY3JvbGwpOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPCAxMDsgaSsrKSB7CiAgICAgIGNtLnJlcGxhY2VTZWxlY3Rpb24oInh4eHh4eHh4eHgiKTsKICAgICAgdmFyIGN1cnNvclJpZ2h0ID0gY20uY3Vyc29yQ29vcmRzKG51bGwsICJ3aW5kb3ciKS5yaWdodDsKICAgICAgaXMoY3Vyc29yUmlnaHQgPCByaWdodCk7CiAgICB9CiAgICBpZiAoIXdyYXApIGlzKGN1cnNvclJpZ2h0ID4gcmlnaHQgLSAyMCk7CiAgfQoKICB0ZXN0Q00oIm1vdmVyaWdodCIsIGZ1bmN0aW9uKGNtKSB7dGVzdE1vdmVyaWdodChjbSwgZmFsc2UsIGZhbHNlKTt9KTsKICB0ZXN0Q00oIm1vdmVyaWdodF93cmFwIiwgZnVuY3Rpb24oY20pIHt0ZXN0TW92ZXJpZ2h0KGNtLCB0cnVlLCBmYWxzZSk7fSk7CiAgdGVzdENNKCJtb3ZlcmlnaHRfc2Nyb2xsIiwgZnVuY3Rpb24oY20pIHt0ZXN0TW92ZXJpZ2h0KGNtLCBmYWxzZSwgdHJ1ZSk7fSk7CiAgdGVzdENNKCJtb3ZlcmlnaHRfc2Nyb2xsX3dyYXAiLCBmdW5jdGlvbihjbSkge3Rlc3RNb3ZlcmlnaHQoY20sIHRydWUsIHRydWUpO30pOwoKICB0ZXN0Q00oInN1ZGRlbmx5X3dpZGUiLCBmdW5jdGlvbihjbSkgewogICAgYWRkRG9jKGNtLCAxMDAsIDEwMCk7CiAgICBjbS5yZXBsYWNlU2VsZWN0aW9uKG5ldyBBcnJheSg2MDApLmpvaW4oImwgIikgKyAiXG4iKTsKICAgIGNtLmV4ZWNDb21tYW5kKCJnb0xpbmVVcCIpOwogICAgY20uZXhlY0NvbW1hbmQoImdvTGluZUVuZCIpOwogICAgaXMoYmFySChjbSkuc2Nyb2xsTGVmdCA+IGNtLmdldFNjcm9sbGVyRWxlbWVudCgpLnNjcm9sbExlZnQgLSAxKTsKICB9KTsKCiAgdGVzdENNKCJ3cmFwX2NoYW5nZXNfaGVpZ2h0IiwgZnVuY3Rpb24oY20pIHsKICAgIHZhciBsaW5lID0gbmV3IEFycmF5KDIwKS5qb2luKCJhICIpICsgIlxuIjsKICAgIGNtLnNldFZhbHVlKG5ldyBBcnJheSgyMCkuam9pbihsaW5lKSk7CiAgICB2YXIgYm94ID0gY20uZ2V0V3JhcHBlckVsZW1lbnQoKS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgIGNtLnNldFNpemUoY20uY3Vyc29yQ29vcmRzKFBvcygwKSwgIndpbmRvdyIpLnJpZ2h0IC0gYm94LmxlZnQgKyAyLAogICAgICAgICAgICAgICBjbS5jdXJzb3JDb29yZHMoUG9zKDE5LCAwKSwgIndpbmRvdyIpLmJvdHRvbSAtIGJveC50b3AgKyAyKTsKICAgIGNtLnNldEN1cnNvcihQb3MoMTksIDApKTsKICAgIGNtLnJlcGxhY2VTZWxlY3Rpb24oIlxuIik7CiAgICBpcyhjbS5jdXJzb3JDb29yZHMobnVsbCwgIndpbmRvdyIpLmJvdHRvbSA8IGRpc3BsYXlCb3R0b20oY20sIGZhbHNlKSk7CiAgfSwge2xpbmVXcmFwcGluZzogdHJ1ZX0pOwoKICB0ZXN0Q00oImhlaWdodF9hdXRvX3dpdGhfZ3V0dGVyX2V4cGVjdF9ub19zY3JvbGxfYWZ0ZXJfbGluZV9kZWxldGUiLCBmdW5jdGlvbihjbSkgewogICAgY20uc2V0U2l6ZShudWxsLCAiYXV0byIpOwogICAgY20uc2V0VmFsdWUoInhcbiIpOwogICAgY20uZXhlY0NvbW1hbmQoImdvRG9jRW5kIik7CiAgICBjbS5leGVjQ29tbWFuZCgiZGVsQ2hhckJlZm9yZSIpOwogICAgZXEoY20uZ2V0U2Nyb2xsSW5mbygpLnRvcCwgMCk7CiAgICBjbS5zY3JvbGxUbyhudWxsLCAxMCk7CiAgICBpcyhjbS5nZXRTY3JvbGxJbmZvKCkudG9wIDwgNSk7CiAgfSwge2xpbmVOdW1iZXJzOiB0cnVlfSk7Cn0pKCk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/test/search_test.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKCkgewogICJ1c2Ugc3RyaWN0IjsKCiAgZnVuY3Rpb24gdGVzdChuYW1lKSB7CiAgICB2YXIgdGV4dCA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSwgYXJndW1lbnRzLmxlbmd0aCAtIDEpLmpvaW4oIlxuIik7CiAgICB2YXIgYm9keSA9IGFyZ3VtZW50c1thcmd1bWVudHMubGVuZ3RoIC0gMV07CiAgICByZXR1cm4gd2luZG93LnRlc3QoInNlYXJjaF8iICsgbmFtZSwgZnVuY3Rpb24oKSB7CiAgICAgIGJvZHkobmV3IENvZGVNaXJyb3IuRG9jKHRleHQpKTsKICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gcnVuKGRvYywgcXVlcnksIGluc2Vuc2l0aXZlKSB7CiAgICB2YXIgY3Vyc29yID0gZG9jLmdldFNlYXJjaEN1cnNvcihxdWVyeSwgbnVsbCwgaW5zZW5zaXRpdmUpOwogICAgZm9yICh2YXIgaSA9IDM7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpICs9IDQpIHsKICAgICAgdmFyIGZvdW5kID0gY3Vyc29yLmZpbmROZXh0KCk7CiAgICAgIGlzKGZvdW5kLCAibm90IGVub3VnaCByZXN1bHRzIChmb3J3YXJkKSIpOwogICAgICBlcVBvcyhQb3MoYXJndW1lbnRzW2ldLCBhcmd1bWVudHNbaSArIDFdKSwgY3Vyc29yLmZyb20oKSwgImZyb20sIGZvcndhcmQsICIgKyAoaSAtIDMpIC8gNCk7CiAgICAgIGVxUG9zKFBvcyhhcmd1bWVudHNbaSArIDJdLCBhcmd1bWVudHNbaSArIDNdKSwgY3Vyc29yLnRvKCksICJ0bywgZm9yd2FyZCwgIiArIChpIC0gMykgLyA0KTsKICAgIH0KICAgIGlzKCFjdXJzb3IuZmluZE5leHQoKSwgInRvbyBtYW55IG1hdGNoZXMgKGZvcndhcmQpIik7CiAgICBmb3IgKHZhciBpID0gYXJndW1lbnRzLmxlbmd0aCAtIDQ7IGkgPj0gMzsgaSAtPSA0KSB7CiAgICAgIHZhciBmb3VuZCA9IGN1cnNvci5maW5kUHJldmlvdXMoKTsKICAgICAgaXMoZm91bmQsICJub3QgZW5vdWdoIHJlc3VsdHMgKGJhY2t3YXJkcykiKTsKICAgICAgZXFQb3MoUG9zKGFyZ3VtZW50c1tpXSwgYXJndW1lbnRzW2kgKyAxXSksIGN1cnNvci5mcm9tKCksICJmcm9tLCBiYWNrd2FyZHMsICIgKyAoaSAtIDMpIC8gNCk7CiAgICAgIGVxUG9zKFBvcyhhcmd1bWVudHNbaSArIDJdLCBhcmd1bWVudHNbaSArIDNdKSwgY3Vyc29yLnRvKCksICJ0bywgYmFja3dhcmRzLCAiICsgKGkgLSAzKSAvIDQpOwogICAgfQogICAgaXMoIWN1cnNvci5maW5kUHJldmlvdXMoKSwgInRvbyBtYW55IG1hdGNoZXMgKGJhY2t3YXJkcykiKTsKICB9CgogIHRlc3QoInNpbXBsZSIsICJhYmNkZWZnIiwgImFiY2RlZmciLCBmdW5jdGlvbihkb2MpIHsKICAgIHJ1bihkb2MsICJjZGUiLCBmYWxzZSwgMCwgMiwgMCwgNSwgMSwgMiwgMSwgNSk7CiAgfSk7CgogIHRlc3QoIm11bHRpbGluZSIsICJoYWxsbyIsICJnb29kYnllIiwgZnVuY3Rpb24oZG9jKSB7CiAgICBydW4oZG9jLCAibGxvXG5nb28iLCBmYWxzZSwgMCwgMiwgMSwgMyk7CiAgICBydW4oZG9jLCAiYmxhaFxuaGFsbCIsIGZhbHNlKTsKICAgIHJ1bihkb2MsICJieWVcbmV5ZSIsIGZhbHNlKTsKICB9KTsKCiAgdGVzdCgicmVnZXhwIiwgImFiY2RlIiwgImFiY2RlIiwgZnVuY3Rpb24oZG9jKSB7CiAgICBydW4oZG9jLCAvYmNkLywgZmFsc2UsIDAsIDEsIDAsIDQsIDEsIDEsIDEsIDQpOwogICAgcnVuKGRvYywgL0JDRC8sIGZhbHNlKTsKICAgIHJ1bihkb2MsIC9CQ0QvaSwgZmFsc2UsIDAsIDEsIDAsIDQsIDEsIDEsIDEsIDQpOwogIH0pOwoKICB0ZXN0KCJpbnNlbnNpdGl2ZSIsICJoYWxsbyIsICJIQUxMTyIsICJvaW5rIiwgImhBbGxPIiwgZnVuY3Rpb24oZG9jKSB7CiAgICBydW4oZG9jLCAiQWxsIiwgZmFsc2UsIDMsIDEsIDMsIDQpOwogICAgcnVuKGRvYywgIkFsbCIsIHRydWUsIDAsIDEsIDAsIDQsIDEsIDEsIDEsIDQsIDMsIDEsIDMsIDQpOwogIH0pOwoKICB0ZXN0KCJtdWx0aWxpbmVJbnNlbnNpdGl2ZSIsICJ6aWUgZ2luZHMga29tVCIsICJEZSBTdG9vbWJvb3QiLCAidWl0IFNwYW5qZSB3ZWVyIGFhbiIsIGZ1bmN0aW9uKGRvYykgewogICAgcnVuKGRvYywgImtvbXRcbmRlIHN0b29tYm9vdFxudWl0IiwgZmFsc2UpOwogICAgcnVuKGRvYywgImtvbXRcbmRlIHN0b29tYm9vdFxudWl0IiwgdHJ1ZSwgMCwgMTAsIDIsIDMpOwogICAgcnVuKGRvYywgImtPTXRcbmRFIHN0T09tYm9vdFxudWlUIiwgdHJ1ZSwgMCwgMTAsIDIsIDMpOwogIH0pOwoKICB0ZXN0KCJleHBhbmRpbmdDYXNlRm9sZCIsICI8Yj7EsMSwIMSwxLA8L2I+IiwgIjxiPnV1IHV1PC9iPiIsIGZ1bmN0aW9uKGRvYykgewogICAgaWYgKHBoYW50b20pIHJldHVybjsgLy8gQSBQaGFudG9tIGJ1ZyBtYWtlcyB0aGlzIGhhbmcKICAgIHJ1bihkb2MsICI8L2I+IiwgdHJ1ZSwgMCwgOCwgMCwgMTIsIDEsIDgsIDEsIDEyKTsKICAgIHJ1bihkb2MsICLEsMSwIiwgdHJ1ZSwgMCwgMywgMCwgNSwgMCwgNiwgMCwgOCk7CiAgfSk7Cn0pKCk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/test/sql-hint-test.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Ly8gQ29kZU1pcnJvciwgY29weXJpZ2h0IChjKSBieSBNYXJpam4gSGF2ZXJiZWtlIGFuZCBvdGhlcnMKLy8gRGlzdHJpYnV0ZWQgdW5kZXIgYW4gTUlUIGxpY2Vuc2U6IGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9MSUNFTlNFCgooZnVuY3Rpb24oKSB7CiAgdmFyIFBvcyA9IENvZGVNaXJyb3IuUG9zOwoKICB2YXIgc2ltcGxlVGFibGVzID0gewogICAgInVzZXJzIjogWyJuYW1lIiwgInNjb3JlIiwgImJpcnRoRGF0ZSJdLAogICAgInhjb3VudHJpZXMiOiBbIm5hbWUiLCAicG9wdWxhdGlvbiIsICJzaXplIl0KICB9OwoKICB2YXIgc2NoZW1hVGFibGVzID0gewogICAgInNjaGVtYS51c2VycyI6IFsibmFtZSIsICJzY29yZSIsICJiaXJ0aERhdGUiXSwKICAgICJzY2hlbWEuY291bnRyaWVzIjogWyJuYW1lIiwgInBvcHVsYXRpb24iLCAic2l6ZSJdCiAgfTsKCiAgdmFyIGRpc3BsYXlUZXh0VGFibGVzID0gW3sKICAgIHRleHQ6ICJteXRhYmxlIiwKICAgIGRpc3BsYXlUZXh0OiAibXl0YWJsZSB8IFRoZSBtYWluIHRhYmxlIiwKICAgIGNvbHVtbnM6IFt7dGV4dDogImlkIiwgZGlzcGxheVRleHQ6ICJpZCB8IFVuaXF1ZSBJRCJ9LAogICAgICAgICAgICAgIHt0ZXh0OiAibmFtZSIsIGRpc3BsYXlUZXh0OiAibmFtZSB8IFRoZSBuYW1lIn1dCiAgfV07CgogIG5hbWVzcGFjZSA9ICJzcWwtaGludF8iOwoKICBmdW5jdGlvbiB0ZXN0KG5hbWUsIHNwZWMpIHsKICAgIHRlc3RDTShuYW1lLCBmdW5jdGlvbihjbSkgewogICAgICBjbS5zZXRWYWx1ZShzcGVjLnZhbHVlKTsKICAgICAgY20uc2V0Q3Vyc29yKHNwZWMuY3Vyc29yKTsKICAgICAgdmFyIGNvbXBsZXRpb24gPSBDb2RlTWlycm9yLmhpbnQuc3FsKGNtLCB7dGFibGVzOiBzcGVjLnRhYmxlc30pOwogICAgICBpZiAoIWRlZXBDb21wYXJlKGNvbXBsZXRpb24ubGlzdCwgc3BlYy5saXN0KSkKICAgICAgICB0aHJvdyBuZXcgRmFpbHVyZSgiV3JvbmcgY29tcGxldGlvbiByZXN1bHRzICIgKyBKU09OLnN0cmluZ2lmeShjb21wbGV0aW9uLmxpc3QpICsgIiB2cyAiICsgSlNPTi5zdHJpbmdpZnkoc3BlYy5saXN0KSk7CiAgICAgIGVxUG9zKGNvbXBsZXRpb24uZnJvbSwgc3BlYy5mcm9tKTsKICAgICAgZXFQb3MoY29tcGxldGlvbi50bywgc3BlYy50byk7CiAgICB9LCB7CiAgICAgIHZhbHVlOiBzcGVjLnZhbHVlLAogICAgICBtb2RlOiAidGV4dC94LW15c3FsIgogICAgfSk7CiAgfQoKICB0ZXN0KCJrZXl3b3JkcyIsIHsKICAgIHZhbHVlOiAiU0VMIiwKICAgIGN1cnNvcjogUG9zKDAsIDMpLAogICAgbGlzdDogWyJTRUxFQ1QiXSwKICAgIGZyb206IFBvcygwLCAwKSwKICAgIHRvOiBQb3MoMCwgMykKICB9KTsKCiAgdGVzdCgiZnJvbSIsIHsKICAgIHZhbHVlOiAiU0VMRUNUICogZnIiLAogICAgY3Vyc29yOiBQb3MoMCwgMTEpLAogICAgbGlzdDogWyJGUk9NIl0sCiAgICBmcm9tOiBQb3MoMCwgOSksCiAgICB0bzogUG9zKDAsIDExKQogIH0pOwoKICB0ZXN0KCJ0YWJsZSIsIHsKICAgIHZhbHVlOiAiU0VMRUNUIHhjIiwKICAgIGN1cnNvcjogUG9zKDAsIDkpLAogICAgdGFibGVzOiBzaW1wbGVUYWJsZXMsCiAgICBsaXN0OiBbInhjb3VudHJpZXMiXSwKICAgIGZyb206IFBvcygwLCA3KSwKICAgIHRvOiBQb3MoMCwgOSkKICB9KTsKCiAgdGVzdCgiY29sdW1ucyIsIHsKICAgIHZhbHVlOiAiU0VMRUNUIHVzZXJzLiIsCiAgICBjdXJzb3I6IFBvcygwLCAxMyksCiAgICB0YWJsZXM6IHNpbXBsZVRhYmxlcywKICAgIGxpc3Q6IFsidXNlcnMubmFtZSIsICJ1c2Vycy5zY29yZSIsICJ1c2Vycy5iaXJ0aERhdGUiXSwKICAgIGZyb206IFBvcygwLCA3KSwKICAgIHRvOiBQb3MoMCwgMTMpCiAgfSk7CgogIHRlc3QoInNpbmdsZWNvbHVtbiIsIHsKICAgIHZhbHVlOiAiU0VMRUNUIHVzZXJzLm5hIiwKICAgIGN1cnNvcjogUG9zKDAsIDE1KSwKICAgIHRhYmxlczogc2ltcGxlVGFibGVzLAogICAgbGlzdDogWyJ1c2Vycy5uYW1lIl0sCiAgICBmcm9tOiBQb3MoMCwgNyksCiAgICB0bzogUG9zKDAsIDE1KQogIH0pOwoKICB0ZXN0KCJxdW90ZWQiLCB7CiAgICB2YWx1ZTogIlNFTEVDVCBgdXNlcnNgLmBuYSIsCiAgICBjdXJzb3I6IFBvcygwLCAxOCksCiAgICB0YWJsZXM6IHNpbXBsZVRhYmxlcywKICAgIGxpc3Q6IFsiYHVzZXJzYC5gbmFtZWAiXSwKICAgIGZyb206IFBvcygwLCA3KSwKICAgIHRvOiBQb3MoMCwgMTgpCiAgfSk7CgogIHRlc3QoInF1b3RlZGNvbHVtbiIsIHsKICAgIHZhbHVlOiAiU0VMRUNUIHVzZXJzLmBuYSIsCiAgICBjdXJzb3I6IFBvcygwLCAxNiksCiAgICB0YWJsZXM6IHNpbXBsZVRhYmxlcywKICAgIGxpc3Q6IFsiYHVzZXJzYC5gbmFtZWAiXSwKICAgIGZyb206IFBvcygwLCA3KSwKICAgIHRvOiBQb3MoMCwgMTYpCiAgfSk7CgogIHRlc3QoInNjaGVtYSIsIHsKICAgIHZhbHVlOiAiU0VMRUNUIHNjaGVtIiwKICAgIGN1cnNvcjogUG9zKDAsIDEyKSwKICAgIHRhYmxlczogc2NoZW1hVGFibGVzLAogICAgbGlzdDogWyJzY2hlbWEudXNlcnMiLCAic2NoZW1hLmNvdW50cmllcyIsCiAgICAgICAgICAgIlNDSEVNQSIsICJTQ0hFTUFfTkFNRSIsICJTQ0hFTUFTIl0sCiAgICBmcm9tOiBQb3MoMCwgNyksCiAgICB0bzogUG9zKDAsIDEyKQogIH0pOwoKICB0ZXN0KCJzY2hlbWFxdW90ZWQiLCB7CiAgICB2YWx1ZTogIlNFTEVDVCBgc2NoIiwKICAgIGN1cnNvcjogUG9zKDAsIDExKSwKICAgIHRhYmxlczogc2NoZW1hVGFibGVzLAogICAgbGlzdDogWyJgc2NoZW1hYC5gdXNlcnNgIiwgImBzY2hlbWFgLmBjb3VudHJpZXNgIl0sCiAgICBmcm9tOiBQb3MoMCwgNyksCiAgICB0bzogUG9zKDAsIDExKQogIH0pOwoKICB0ZXN0KCJzY2hlbWFjb2x1bW4iLCB7CiAgICB2YWx1ZTogIlNFTEVDVCBzY2hlbWEudXNlcnMuIiwKICAgIGN1cnNvcjogUG9zKDAsIDIwKSwKICAgIHRhYmxlczogc2NoZW1hVGFibGVzLAogICAgbGlzdDogWyJzY2hlbWEudXNlcnMubmFtZSIsCiAgICAgICAgICAgInNjaGVtYS51c2Vycy5zY29yZSIsCiAgICAgICAgICAgInNjaGVtYS51c2Vycy5iaXJ0aERhdGUiXSwKICAgIGZyb206IFBvcygwLCA3KSwKICAgIHRvOiBQb3MoMCwgMjApCiAgfSk7CgogIHRlc3QoInNjaGVtYWNvbHVtbnF1b3RlZCIsIHsKICAgIHZhbHVlOiAiU0VMRUNUIGBzY2hlbWFgLmB1c2Vyc2AuIiwKICAgIGN1cnNvcjogUG9zKDAsIDI0KSwKICAgIHRhYmxlczogc2NoZW1hVGFibGVzLAogICAgbGlzdDogWyJgc2NoZW1hYC5gdXNlcnNgLmBuYW1lYCIsCiAgICAgICAgICAgImBzY2hlbWFgLmB1c2Vyc2AuYHNjb3JlYCIsCiAgICAgICAgICAgImBzY2hlbWFgLmB1c2Vyc2AuYGJpcnRoRGF0ZWAiXSwKICAgIGZyb206IFBvcygwLCA3KSwKICAgIHRvOiBQb3MoMCwgMjQpCiAgfSk7CgogIHRlc3QoImRpc3BsYXlUZXh0X3RhYmxlIiwgewogICAgdmFsdWU6ICJTRUxFQ1QgbXl0IiwKICAgIGN1cnNvcjogUG9zKDAsIDEwKSwKICAgIHRhYmxlczogZGlzcGxheVRleHRUYWJsZXMsCiAgICBsaXN0OiBkaXNwbGF5VGV4dFRhYmxlcywKICAgIGZyb206IFBvcygwLCA3KSwKICAgIHRvOiBQb3MoMCwgMTApCiAgfSk7CgogIHRlc3QoImRpc3BsYXlUZXh0X2NvbHVtbiIsIHsKICAgIHZhbHVlOiAiU0VMRUNUIG15dGFibGUuIiwKICAgIGN1cnNvcjogUG9zKDAsIDE1KSwKICAgIHRhYmxlczogZGlzcGxheVRleHRUYWJsZXMsCiAgICBsaXN0OiBbe3RleHQ6ICJteXRhYmxlLmlkIiwgZGlzcGxheVRleHQ6ICJpZCB8IFVuaXF1ZSBJRCJ9LAogICAgICAgICAgIHt0ZXh0OiAibXl0YWJsZS5uYW1lIiwgZGlzcGxheVRleHQ6ICJuYW1lIHwgVGhlIG5hbWUifV0sCiAgICBmcm9tOiBQb3MoMCwgNyksCiAgICB0bzogUG9zKDAsIDE1KQogIH0pOwoKICB0ZXN0KCJhbGlhc19jb21wbGV0ZSIsIHsKICAgIHZhbHVlOiAiU0VMRUNUIHQuIEZST00gdXNlcnMgdCIsCiAgICBjdXJzb3I6IFBvcygwLCA5KSwKICAgIHRhYmxlczogc2ltcGxlVGFibGVzLAogICAgbGlzdDogWyJ0Lm5hbWUiLCAidC5zY29yZSIsICJ0LmJpcnRoRGF0ZSJdLAogICAgZnJvbTogUG9zKDAsIDcpLAogICAgdG86IFBvcygwLCA5KQogIH0pOwoKICB0ZXN0KCJhbGlhc19jb21wbGV0ZV93aXRoX2Rpc3BsYXlUZXh0IiwgewogICAgdmFsdWU6ICJTRUxFQ1QgdC4gRlJPTSBteXRhYmxlIHQiLAogICAgY3Vyc29yOiBQb3MoMCwgOSksCiAgICB0YWJsZXM6IGRpc3BsYXlUZXh0VGFibGVzLAogICAgbGlzdDogW3t0ZXh0OiAidC5pZCIsIGRpc3BsYXlUZXh0OiAiaWQgfCBVbmlxdWUgSUQifSwKICAgICAgICAgICB7dGV4dDogInQubmFtZSIsIGRpc3BsYXlUZXh0OiAibmFtZSB8IFRoZSBuYW1lIn1dLAogICAgZnJvbTogUG9zKDAsIDcpLAogICAgdG86IFBvcygwLCA5KQogIH0pCgogIGZ1bmN0aW9uIGRlZXBDb21wYXJlKGEsIGIpIHsKICAgIGlmICghYSB8fCB0eXBlb2YgYSAhPSAib2JqZWN0IikKICAgICAgcmV0dXJuIGEgPT09IGI7CiAgICBpZiAoIWIgfHwgdHlwZW9mIGIgIT0gIm9iamVjdCIpCiAgICAgIHJldHVybiBmYWxzZTsKICAgIGZvciAodmFyIHByb3AgaW4gYSkgaWYgKCFkZWVwQ29tcGFyZShhW3Byb3BdLCBiW3Byb3BdKSkgcmV0dXJuIGZhbHNlOwogICAgcmV0dXJuIHRydWU7CiAgfQp9KSgpOwo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/test/sublime_test.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[KGZ1bmN0aW9uKCkgewogICJ1c2Ugc3RyaWN0IjsKICAKICB2YXIgUG9zID0gQ29kZU1pcnJvci5Qb3M7CiAgbmFtZXNwYWNlID0gInN1YmxpbWVfIjsKCiAgZnVuY3Rpb24gc3RUZXN0KG5hbWUpIHsKICAgIHZhciBhY3Rpb25zID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTsKICAgIHRlc3RDTShuYW1lLCBmdW5jdGlvbihjbSkgewogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFjdGlvbnMubGVuZ3RoOyBpKyspIHsKICAgICAgICB2YXIgYWN0aW9uID0gYWN0aW9uc1tpXTsKICAgICAgICBpZiAodHlwZW9mIGFjdGlvbiA9PSAic3RyaW5nIiAmJiBpID09IDApCiAgICAgICAgICBjbS5zZXRWYWx1ZShhY3Rpb24pOwogICAgICAgIGVsc2UgaWYgKHR5cGVvZiBhY3Rpb24gPT0gInN0cmluZyIpCiAgICAgICAgICBjbS5leGVjQ29tbWFuZChhY3Rpb24pOwogICAgICAgIGVsc2UgaWYgKGFjdGlvbiBpbnN0YW5jZW9mIFBvcykKICAgICAgICAgIGNtLnNldEN1cnNvcihhY3Rpb24pOwogICAgICAgIGVsc2UKICAgICAgICAgIGFjdGlvbihjbSk7CiAgICAgIH0KICAgIH0pOwogIH0KCiAgZnVuY3Rpb24gYXQobGluZSwgY2gsIG1zZykgewogICAgcmV0dXJuIGZ1bmN0aW9uKGNtKSB7CiAgICAgIGVxKGNtLmxpc3RTZWxlY3Rpb25zKCkubGVuZ3RoLCAxKTsKICAgICAgZXFQb3MoY20uZ2V0Q3Vyc29yKCJoZWFkIiksIFBvcyhsaW5lLCBjaCksIG1zZyk7CiAgICAgIGVxUG9zKGNtLmdldEN1cnNvcigiYW5jaG9yIiksIFBvcyhsaW5lLCBjaCksIG1zZyk7CiAgICB9OwogIH0KCiAgZnVuY3Rpb24gdmFsKGNvbnRlbnQsIG1zZykgewogICAgcmV0dXJuIGZ1bmN0aW9uKGNtKSB7IGVxKGNtLmdldFZhbHVlKCksIGNvbnRlbnQsIG1zZyk7IH07CiAgfQoKICBmdW5jdGlvbiBhcmdzVG9SYW5nZXMoYXJncykgewogICAgaWYgKGFyZ3MubGVuZ3RoICUgNCkgdGhyb3cgbmV3IEVycm9yKCJXcm9uZyBudW1iZXIgb2YgYXJndW1lbnRzIGZvciByYW5nZXMuIik7CiAgICB2YXIgcmFuZ2VzID0gW107CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpICs9IDQpCiAgICAgIHJhbmdlcy5wdXNoKHthbmNob3I6IFBvcyhhcmdzW2ldLCBhcmdzW2kgKyAxXSksCiAgICAgICAgICAgICAgICAgICBoZWFkOiBQb3MoYXJnc1tpICsgMl0sIGFyZ3NbaSArIDNdKX0pOwogICAgcmV0dXJuIHJhbmdlczsKICB9CgogIGZ1bmN0aW9uIHNldFNlbCgpIHsKICAgIHZhciByYW5nZXMgPSBhcmdzVG9SYW5nZXMoYXJndW1lbnRzKTsKICAgIHJldHVybiBmdW5jdGlvbihjbSkgeyBjbS5zZXRTZWxlY3Rpb25zKHJhbmdlcywgMCk7IH07CiAgfQoKICBmdW5jdGlvbiBoYXNTZWwoKSB7CiAgICB2YXIgcmFuZ2VzID0gYXJnc1RvUmFuZ2VzKGFyZ3VtZW50cyk7CiAgICByZXR1cm4gZnVuY3Rpb24oY20pIHsKICAgICAgdmFyIHNlbHMgPSBjbS5saXN0U2VsZWN0aW9ucygpOwogICAgICBpZiAoc2Vscy5sZW5ndGggIT0gcmFuZ2VzLmxlbmd0aCkKICAgICAgICB0aHJvdyBuZXcgRmFpbHVyZSgiRXhwZWN0ZWQgIiArIHJhbmdlcy5sZW5ndGggKyAiIHNlbGVjdGlvbnMsIGJ1dCBmb3VuZCAiICsgc2Vscy5sZW5ndGgpOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNlbHMubGVuZ3RoOyBpKyspIHsKICAgICAgICBlcVBvcyhzZWxzW2ldLmFuY2hvciwgcmFuZ2VzW2ldLmFuY2hvciwgImFuY2hvciAiICsgaSk7CiAgICAgICAgZXFQb3Moc2Vsc1tpXS5oZWFkLCByYW5nZXNbaV0uaGVhZCwgImhlYWQgIiArIGkpOwogICAgICB9CiAgICB9OwogIH0KCiAgc3RUZXN0KCJieVN1YndvcmQiLCAidGhlIGZvb19iYXIgRG9vRGFoQmFoIFxuIGEiLAogICAgICAgICAiZ29TdWJ3b3JkTGVmdCIsIGF0KDAsIDApLAogICAgICAgICAiZ29TdWJ3b3JkUmlnaHQiLCBhdCgwLCAzKSwKICAgICAgICAgImdvU3Vid29yZFJpZ2h0IiwgYXQoMCwgNyksCiAgICAgICAgICJnb1N1YndvcmRSaWdodCIsIGF0KDAsIDExKSwKICAgICAgICAgImdvU3Vid29yZFJpZ2h0IiwgYXQoMCwgMTUpLAogICAgICAgICAiZ29TdWJ3b3JkUmlnaHQiLCBhdCgwLCAxOCksCiAgICAgICAgICJnb1N1YndvcmRSaWdodCIsIGF0KDAsIDIxKSwKICAgICAgICAgImdvU3Vid29yZFJpZ2h0IiwgYXQoMCwgMjIpLAogICAgICAgICAiZ29TdWJ3b3JkUmlnaHQiLCBhdCgxLCAwKSwKICAgICAgICAgImdvU3Vid29yZFJpZ2h0IiwgYXQoMSwgMiksCiAgICAgICAgICJnb1N1YndvcmRSaWdodCIsIGF0KDEsIDIpLAogICAgICAgICAiZ29TdWJ3b3JkTGVmdCIsIGF0KDEsIDEpLAogICAgICAgICAiZ29TdWJ3b3JkTGVmdCIsIGF0KDEsIDApLAogICAgICAgICAiZ29TdWJ3b3JkTGVmdCIsIGF0KDAsIDIyKSwKICAgICAgICAgImdvU3Vid29yZExlZnQiLCBhdCgwLCAxOCksCiAgICAgICAgICJnb1N1YndvcmRMZWZ0IiwgYXQoMCwgMTUpLAogICAgICAgICAiZ29TdWJ3b3JkTGVmdCIsIGF0KDAsIDEyKSwKICAgICAgICAgImdvU3Vid29yZExlZnQiLCBhdCgwLCA4KSwKICAgICAgICAgImdvU3Vid29yZExlZnQiLCBhdCgwLCA0KSwKICAgICAgICAgImdvU3Vid29yZExlZnQiLCBhdCgwLCAwKSk7CgogIHN0VGVzdCgic3BsaXRTZWxlY3Rpb25CeUxpbmUiLCAiYWJjXG5kZWZcbmdoaSIsCiAgICAgICAgIHNldFNlbCgwLCAxLCAyLCAyKSwKICAgICAgICAgInNwbGl0U2VsZWN0aW9uQnlMaW5lIiwKICAgICAgICAgaGFzU2VsKDAsIDEsIDAsIDMsCiAgICAgICAgICAgICAgICAxLCAwLCAxLCAzLAogICAgICAgICAgICAgICAgMiwgMCwgMiwgMikpOwoKICBzdFRlc3QoInNwbGl0U2VsZWN0aW9uQnlMaW5lTXVsdGkiLCAiYWJjXG5kZWZcbmdoaVxuamtsIiwKICAgICAgICAgc2V0U2VsKDAsIDEsIDEsIDEsCiAgICAgICAgICAgICAgICAxLCAyLCAzLCAyLAogICAgICAgICAgICAgICAgMywgMywgMywgMyksCiAgICAgICAgICJzcGxpdFNlbGVjdGlvbkJ5TGluZSIsCiAgICAgICAgIGhhc1NlbCgwLCAxLCAwLCAzLAogICAgICAgICAgICAgICAgMSwgMCwgMSwgMSwKICAgICAgICAgICAgICAgIDEsIDIsIDEsIDMsCiAgICAgICAgICAgICAgICAyLCAwLCAyLCAzLAogICAgICAgICAgICAgICAgMywgMCwgMywgMiwKICAgICAgICAgICAgICAgIDMsIDMsIDMsIDMpKTsKCiAgc3RUZXN0KCJzZWxlY3RMaW5lIiwgImFiY1xuZGVmXG5naGkiLAogICAgICAgICBzZXRTZWwoMCwgMSwgMCwgMSwKICAgICAgICAgICAgICAgIDIsIDAsIDIsIDEpLAogICAgICAgICAic2VsZWN0TGluZSIsCiAgICAgICAgIGhhc1NlbCgwLCAwLCAxLCAwLAogICAgICAgICAgICAgICAgMiwgMCwgMiwgMyksCiAgICAgICAgIHNldFNlbCgwLCAxLCAxLCAwKSwKICAgICAgICAgInNlbGVjdExpbmUiLAogICAgICAgICBoYXNTZWwoMCwgMCwgMiwgMCkpOwoKICBzdFRlc3QoImluc2VydExpbmVBZnRlciIsICJhYmNkZVxuZmdoaWprbFxubW4iLAogICAgICAgICBzZXRTZWwoMCwgMSwgMCwgMSwKICAgICAgICAgICAgICAgIDAsIDMsIDAsIDMsCiAgICAgICAgICAgICAgICAxLCAyLCAxLCAyLAogICAgICAgICAgICAgICAgMSwgMywgMSwgNSksICJpbnNlcnRMaW5lQWZ0ZXIiLAogICAgICAgICBoYXNTZWwoMSwgMCwgMSwgMCwKICAgICAgICAgICAgICAgIDMsIDAsIDMsIDApLCB2YWwoImFiY2RlXG5cbmZnaGlqa2xcblxubW4iKSk7CgogIHN0VGVzdCgiaW5zZXJ0TGluZUJlZm9yZSIsICJhYmNkZVxuZmdoaWprbFxubW4iLAogICAgICAgICBzZXRTZWwoMCwgMSwgMCwgMSwKICAgICAgICAgICAgICAgIDAsIDMsIDAsIDMsCiAgICAgICAgICAgICAgICAxLCAyLCAxLCAyLAogICAgICAgICAgICAgICAgMSwgMywgMSwgNSksICJpbnNlcnRMaW5lQmVmb3JlIiwKICAgICAgICAgaGFzU2VsKDAsIDAsIDAsIDAsCiAgICAgICAgICAgICAgICAyLCAwLCAyLCAwKSwgdmFsKCJcbmFiY2RlXG5cbmZnaGlqa2xcbm1uIikpOwoKICBzdFRlc3QoInNlbGVjdE5leHRPY2N1cnJlbmNlIiwgImEgZm9vIGJhclxuZm9vYmFyIGZvbyIsCiAgICAgICAgIHNldFNlbCgwLCAyLCAwLCA1KSwKICAgICAgICAgInNlbGVjdE5leHRPY2N1cnJlbmNlIiwgaGFzU2VsKDAsIDIsIDAsIDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAwLCAxLCAzKSwKICAgICAgICAgInNlbGVjdE5leHRPY2N1cnJlbmNlIiwgaGFzU2VsKDAsIDIsIDAsIDUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAwLCAxLCAzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgNywgMSwgMTApLAogICAgICAgICAic2VsZWN0TmV4dE9jY3VycmVuY2UiLCBoYXNTZWwoMCwgMiwgMCwgNSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIDAsIDEsIDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCA3LCAxLCAxMCksCiAgICAgICAgIFBvcygwLCAzKSwgInNlbGVjdE5leHRPY2N1cnJlbmNlIiwgaGFzU2VsKDAsIDIsIDAsIDUpLAogICAgICAgICJzZWxlY3ROZXh0T2NjdXJyZW5jZSIsIGhhc1NlbCgwLCAyLCAwLCA1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCA3LCAxLCAxMCksCiAgICAgICAgIHNldFNlbCgwLCA2LCAwLCA5KSwKICAgICAgICAgInNlbGVjdE5leHRPY2N1cnJlbmNlIiwgaGFzU2VsKDAsIDYsIDAsIDksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAzLCAxLCA2KSk7CgogIHN0VGVzdCgic2VsZWN0U2NvcGUiLCAiZm9vKGEpIHtcbiAgYmFyWzEsIDJdO1xufSIsCiAgICAgICAgICJzZWxlY3RTY29wZSIsIGhhc1NlbCgwLCAwLCAyLCAxKSwKICAgICAgICAgUG9zKDAsIDQpLCAic2VsZWN0U2NvcGUiLCBoYXNTZWwoMCwgNCwgMCwgNSksCiAgICAgICAgIFBvcygwLCA1KSwgInNlbGVjdFNjb3BlIiwgaGFzU2VsKDAsIDQsIDAsIDUpLAogICAgICAgICBQb3MoMCwgNiksICJzZWxlY3RTY29wZSIsIGhhc1NlbCgwLCAwLCAyLCAxKSwKICAgICAgICAgUG9zKDAsIDgpLCAic2VsZWN0U2NvcGUiLCBoYXNTZWwoMCwgOCwgMiwgMCksCiAgICAgICAgIFBvcygxLCAyKSwgInNlbGVjdFNjb3BlIiwgaGFzU2VsKDAsIDgsIDIsIDApLAogICAgICAgICBQb3MoMSwgNiksICJzZWxlY3RTY29wZSIsIGhhc1NlbCgxLCA2LCAxLCAxMCksCiAgICAgICAgIFBvcygxLCA5KSwgInNlbGVjdFNjb3BlIiwgaGFzU2VsKDEsIDYsIDEsIDEwKSk7CgogIHN0VGVzdCgiZ29Ub0JyYWNrZXQiLCAiZm9vKGEpIHtcbiAgYmFyWzEsIDJdO1xufSIsCiAgICAgICAgIFBvcygwLCAwKSwgImdvVG9CcmFja2V0IiwgYXQoMCwgMCksCiAgICAgICAgIFBvcygwLCA0KSwgImdvVG9CcmFja2V0IiwgYXQoMCwgNSksICJnb1RvQnJhY2tldCIsIGF0KDAsIDQpLAogICAgICAgICBQb3MoMCwgOCksICJnb1RvQnJhY2tldCIsIGF0KDIsIDApLCAiZ29Ub0JyYWNrZXQiLCBhdCgwLCA4KSwKICAgICAgICAgUG9zKDEsIDIpLCAiZ29Ub0JyYWNrZXQiLCBhdCgyLCAwKSwKICAgICAgICAgUG9zKDEsIDcpLCAiZ29Ub0JyYWNrZXQiLCBhdCgxLCAxMCksICJnb1RvQnJhY2tldCIsIGF0KDEsIDYpKTsKCiAgc3RUZXN0KCJzd2FwTGluZSIsICIxXG4yXG4zLS0tXG40XG41IiwKICAgICAgICAgInN3YXBMaW5lRG93biIsIHZhbCgiMlxuMVxuMy0tLVxuNFxuNSIpLAogICAgICAgICAic3dhcExpbmVVcCIsIHZhbCgiMVxuMlxuMy0tLVxuNFxuNSIpLAogICAgICAgICAic3dhcExpbmVVcCIsIHZhbCgiMVxuMlxuMy0tLVxuNFxuNSIpLAogICAgICAgICBQb3MoNCwgMSksICJzd2FwTGluZURvd24iLCB2YWwoIjFcbjJcbjMtLS1cbjRcbjUiKSwKICAgICAgICAgc2V0U2VsKDAsIDEsIDAsIDEsCiAgICAgICAgICAgICAgICAxLCAwLCAyLCAwLAogICAgICAgICAgICAgICAgMiwgMiwgMiwgMiksCiAgICAgICAgICJzd2FwTGluZURvd24iLCB2YWwoIjRcbjFcbjJcbjMtLS1cbjUiKSwKICAgICAgICAgaGFzU2VsKDEsIDEsIDEsIDEsCiAgICAgICAgICAgICAgICAyLCAwLCAzLCAwLAogICAgICAgICAgICAgICAgMywgMiwgMywgMiksCiAgICAgICAgICJzd2FwTGluZVVwIiwgdmFsKCIxXG4yXG4zLS0tXG40XG41IiksCiAgICAgICAgIGhhc1NlbCgwLCAxLCAwLCAxLAogICAgICAgICAgICAgICAgMSwgMCwgMiwgMCwKICAgICAgICAgICAgICAgIDIsIDIsIDIsIDIpKTsKCiAgc3RUZXN0KCJzd2FwTGluZUVtcHR5Qm90dG9tU2VsIiwgIjFcbjJcbjMiLAogICAgICAgICBzZXRTZWwoMCwgMSwgMSwgMCksCiAgICAgICAgICJzd2FwTGluZURvd24iLCB2YWwoIjJcbjFcbjMiKSwgaGFzU2VsKDEsIDEsIDIsIDApLAogICAgICAgICAic3dhcExpbmVVcCIsIHZhbCgiMVxuMlxuMyIpLCBoYXNTZWwoMCwgMSwgMSwgMCksCiAgICAgICAgICJzd2FwTGluZVVwIiwgdmFsKCIxXG4yXG4zIiksIGhhc1NlbCgwLCAwLCAwLCAwKSk7CgogIHN0VGVzdCgic3dhcExpbmVVcEZyb21FbmQiLCAiYVxuYlxuYyIsCiAgICAgICAgIFBvcygyLCAxKSwgInN3YXBMaW5lVXAiLAogICAgICAgICBoYXNTZWwoMSwgMSwgMSwgMSksIHZhbCgiYVxuY1xuYiIpKTsKCiAgc3RUZXN0KCJqb2luTGluZXMiLCAiYWJjXG5kZWZcbmdoaVxuamtsIiwKICAgICAgICAgImpvaW5MaW5lcyIsIHZhbCgiYWJjIGRlZlxuZ2hpXG5qa2wiKSwgYXQoMCwgNCksCiAgICAgICAgICJ1bmRvIiwKICAgICAgICAgc2V0U2VsKDAsIDIsIDEsIDEpLCAiam9pbkxpbmVzIiwKICAgICAgICAgdmFsKCJhYmMgZGVmIGdoaVxuamtsIiksIGhhc1NlbCgwLCAyLCAwLCA4KSwKICAgICAgICAgInVuZG8iLAogICAgICAgICBzZXRTZWwoMCwgMSwgMCwgMSwKICAgICAgICAgICAgICAgIDEsIDEsIDEsIDEsCiAgICAgICAgICAgICAgICAzLCAxLCAzLCAxKSwgImpvaW5MaW5lcyIsCiAgICAgICAgIHZhbCgiYWJjIGRlZiBnaGlcbmprbCIpLCBoYXNTZWwoMCwgNCwgMCwgNCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCA4LCAwLCA4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIDMsIDEsIDMpKTsKCiAgc3RUZXN0KCJkdXBsaWNhdGVMaW5lIiwgImFiY1xuZGVmXG5naGkiLAogICAgICAgICBQb3MoMSwgMCksICJkdXBsaWNhdGVMaW5lIiwgdmFsKCJhYmNcbmRlZlxuZGVmXG5naGkiKSwgYXQoMiwgMCksCiAgICAgICAgICJ1bmRvIiwKICAgICAgICAgc2V0U2VsKDAsIDEsIDAsIDEsCiAgICAgICAgICAgICAgICAxLCAxLCAxLCAxLAogICAgICAgICAgICAgICAgMiwgMSwgMiwgMSksICJkdXBsaWNhdGVMaW5lIiwKICAgICAgICAgdmFsKCJhYmNcbmFiY1xuZGVmXG5kZWZcbmdoaVxuZ2hpIiksIGhhc1NlbCgxLCAxLCAxLCAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMsIDEsIDMsIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNSwgMSwgNSwgMSkpOwogIHN0VGVzdCgiZHVwbGljYXRlTGluZVNlbGVjdGlvbiIsICJhYmNkZWYiLAogICAgICAgICBzZXRTZWwoMCwgMSwgMCwgMSwKICAgICAgICAgICAgICAgIDAsIDIsIDAsIDQsCiAgICAgICAgICAgICAgICAwLCA1LCAwLCA1KSwKICAgICAgICAgImR1cGxpY2F0ZUxpbmUiLAogICAgICAgICB2YWwoImFiY2RlZlxuYWJjZGNkZWZcbmFiY2RjZGVmIiksIGhhc1NlbCgyLCAxLCAyLCAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLCA0LCAyLCA2LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLCA3LCAyLCA3KSk7CgogIHN0VGVzdCgic2VsZWN0TGluZXNVcHdhcmQiLCAiMTIzXG4zNDVcbjc4OVxuMDEyIiwKICAgICAgICAgc2V0U2VsKDAsIDEsIDAsIDEsCiAgICAgICAgICAgICAgICAxLCAxLCAxLCAzLAogICAgICAgICAgICAgICAgMiwgMCwgMiwgMCwKICAgICAgICAgICAgICAgIDMsIDAsIDMsIDApLAogICAgICAgICAic2VsZWN0TGluZXNVcHdhcmQiLAogICAgICAgICBoYXNTZWwoMCwgMSwgMCwgMSwKICAgICAgICAgICAgICAgIDAsIDMsIDAsIDMsCiAgICAgICAgICAgICAgICAxLCAwLCAxLCAwLAogICAgICAgICAgICAgICAgMSwgMSwgMSwgMywKICAgICAgICAgICAgICAgIDIsIDAsIDIsIDAsCiAgICAgICAgICAgICAgICAzLCAwLCAzLCAwKSk7CgogIHN0VGVzdCgic2VsZWN0TGluZXNEb3dud2FyZCIsICIxMjNcbjM0NVxuNzg5XG4wMTIiLAogICAgICAgICBzZXRTZWwoMCwgMSwgMCwgMSwKICAgICAgICAgICAgICAgIDEsIDEsIDEsIDMsCiAgICAgICAgICAgICAgICAyLCAwLCAyLCAwLAogICAgICAgICAgICAgICAgMywgMCwgMywgMCksCiAgICAgICAgICJzZWxlY3RMaW5lc0Rvd253YXJkIiwKICAgICAgICAgaGFzU2VsKDAsIDEsIDAsIDEsCiAgICAgICAgICAgICAgICAxLCAxLCAxLCAzLAogICAgICAgICAgICAgICAgMiwgMCwgMiwgMCwKICAgICAgICAgICAgICAgIDIsIDMsIDIsIDMsCiAgICAgICAgICAgICAgICAzLCAwLCAzLCAwKSk7CgogIHN0VGVzdCgic29ydExpbmVzIiwgImNcbmJcbmFcbkNcbkJcbkEiLAogICAgICAgICAic29ydExpbmVzIiwgdmFsKCJBXG5CXG5DXG5hXG5iXG5jIiksCiAgICAgICAgICJ1bmRvIiwKICAgICAgICAgc2V0U2VsKDAsIDAsIDIsIDAsCiAgICAgICAgICAgICAgICAzLCAwLCA1LCAwKSwKICAgICAgICAgInNvcnRMaW5lcyIsIHZhbCgiYVxuYlxuY1xuQVxuQlxuQyIpLAogICAgICAgICBoYXNTZWwoMCwgMCwgMiwgMSwKICAgICAgICAgICAgICAgIDMsIDAsIDUsIDEpLAogICAgICAgICAidW5kbyIsCiAgICAgICAgIHNldFNlbCgxLCAwLCA0LCAwKSwgInNvcnRMaW5lc0luc2Vuc2l0aXZlIiwgdmFsKCJjXG5hXG5CXG5iXG5DXG5BIikpOwoKICBzdFRlc3QoImJvb2ttYXJrcyIsICJhYmNcbmRlZlxuZ2hpXG5qa2wiLAogICAgICAgICBQb3MoMCwgMSksICJ0b2dnbGVCb29rbWFyayIsCiAgICAgICAgIHNldFNlbCgxLCAxLCAxLCAyKSwgInRvZ2dsZUJvb2ttYXJrIiwKICAgICAgICAgc2V0U2VsKDIsIDEsIDIsIDIpLCAidG9nZ2xlQm9va21hcmsiLAogICAgICAgICAibmV4dEJvb2ttYXJrIiwgaGFzU2VsKDAsIDEsIDAsIDEpLAogICAgICAgICAibmV4dEJvb2ttYXJrIiwgaGFzU2VsKDEsIDEsIDEsIDIpLAogICAgICAgICAibmV4dEJvb2ttYXJrIiwgaGFzU2VsKDIsIDEsIDIsIDIpLAogICAgICAgICAicHJldkJvb2ttYXJrIiwgaGFzU2VsKDEsIDEsIDEsIDIpLAogICAgICAgICAicHJldkJvb2ttYXJrIiwgaGFzU2VsKDAsIDEsIDAsIDEpLAogICAgICAgICAicHJldkJvb2ttYXJrIiwgaGFzU2VsKDIsIDEsIDIsIDIpLAogICAgICAgICAicHJldkJvb2ttYXJrIiwgaGFzU2VsKDEsIDEsIDEsIDIpLAogICAgICAgICAidG9nZ2xlQm9va21hcmsiLAogICAgICAgICAicHJldkJvb2ttYXJrIiwgaGFzU2VsKDIsIDEsIDIsIDIpLAogICAgICAgICAicHJldkJvb2ttYXJrIiwgaGFzU2VsKDAsIDEsIDAsIDEpLAogICAgICAgICAic2VsZWN0Qm9va21hcmtzIiwgaGFzU2VsKDAsIDEsIDAsIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiwgMSwgMiwgMiksCiAgICAgICAgICJjbGVhckJvb2ttYXJrcyIsCiAgICAgICAgIFBvcygwLCAwKSwgInNlbGVjdEJvb2ttYXJrcyIsIGF0KDAsIDApKTsKCiAgc3RUZXN0KCJzbWFydEJhY2tzcGFjZSIsICIgIGZvb1xuICAgIGJhciIsCiAgICAgICAgIHNldFNlbCgwLCAyLCAwLCAyLCAxLCA0LCAxLCA0LCAxLCA2LCAxLCA2KSwgInNtYXJ0QmFja3NwYWNlIiwKICAgICAgICAgdmFsKCJmb29cbiAgYnIiKSkKCiAgc3RUZXN0KCJ1cEFuZERvd25jYXNlQXRDdXJzb3IiLCAiYWJjXG5kZWYgIHhcbmdoSSIsCiAgICAgICAgIHNldFNlbCgwLCAxLCAwLCAzLAogICAgICAgICAgICAgICAgMSwgMSwgMSwgMSwKICAgICAgICAgICAgICAgIDEsIDQsIDEsIDQpLCAidXBjYXNlQXRDdXJzb3IiLAogICAgICAgICB2YWwoImFCQ1xuREVGICB4XG5naEkiKSwgaGFzU2VsKDAsIDEsIDAsIDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgMywgMSwgMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCA0LCAxLCA0KSwKICAgICAgICAgImRvd25jYXNlQXRDdXJzb3IiLAogICAgICAgICB2YWwoImFiY1xuZGVmICB4XG5naEkiKSwgaGFzU2VsKDAsIDEsIDAsIDMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgMywgMSwgMywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCA0LCAxLCA0KSk7CgogIHN0VGVzdCgibWFyayIsICJhYmNcbmRlZlxuZ2hpIiwKICAgICAgICAgUG9zKDEsIDEpLCAic2V0U3VibGltZU1hcmsiLAogICAgICAgICBQb3MoMiwgMSksICJzZWxlY3RUb1N1YmxpbWVNYXJrIiwgaGFzU2VsKDIsIDEsIDEsIDEpLAogICAgICAgICBQb3MoMCwgMSksICJzd2FwV2l0aFN1YmxpbWVNYXJrIiwgYXQoMSwgMSksICJzd2FwV2l0aFN1YmxpbWVNYXJrIiwgYXQoMCwgMSksCiAgICAgICAgICJkZWxldGVUb1N1YmxpbWVNYXJrIiwgdmFsKCJhZWZcbmdoaSIpLAogICAgICAgICAic3VibGltZVlhbmsiLCB2YWwoImFiY1xuZGVmXG5naGkiKSwgYXQoMSwgMSkpOwoKICBzdFRlc3QoImZpbmRVbmRlciIsICJmb28gZm9vYmFyICBhIiwKICAgICAgICAgImZpbmRVbmRlciIsIGhhc1NlbCgwLCA0LCAwLCA3KSwKICAgICAgICAgImZpbmRVbmRlciIsIGhhc1NlbCgwLCAwLCAwLCAzKSwKICAgICAgICAgImZpbmRVbmRlclByZXZpb3VzIiwgaGFzU2VsKDAsIDQsIDAsIDcpLAogICAgICAgICAiZmluZFVuZGVyUHJldmlvdXMiLCBoYXNTZWwoMCwgMCwgMCwgMyksCiAgICAgICAgIFBvcygwLCA0KSwgImZpbmRVbmRlciIsIGhhc1NlbCgwLCA0LCAwLCAxMCksCiAgICAgICAgIFBvcygwLCAxMSksICJmaW5kVW5kZXIiLCBoYXNTZWwoMCwgMTEsIDAsIDExKSk7Cn0pKCk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/test/test.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[dmFyIFBvcyA9IENvZGVNaXJyb3IuUG9zOwoKQ29kZU1pcnJvci5kZWZhdWx0cy5ydGxNb3ZlVmlzdWFsbHkgPSB0cnVlOwoKZnVuY3Rpb24gZm9yRWFjaChhcnIsIGYpIHsKICBmb3IgKHZhciBpID0gMCwgZSA9IGFyci5sZW5ndGg7IGkgPCBlOyArK2kpIGYoYXJyW2ldLCBpKTsKfQoKZnVuY3Rpb24gYWRkRG9jKGNtLCB3aWR0aCwgaGVpZ2h0KSB7CiAgdmFyIGNvbnRlbnQgPSBbXSwgbGluZSA9ICIiOwogIGZvciAodmFyIGkgPSAwOyBpIDwgd2lkdGg7ICsraSkgbGluZSArPSAieCI7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBoZWlnaHQ7ICsraSkgY29udGVudC5wdXNoKGxpbmUpOwogIGNtLnNldFZhbHVlKGNvbnRlbnQuam9pbigiXG4iKSk7Cn0KCmZ1bmN0aW9uIGJ5Q2xhc3NOYW1lKGVsdCwgY2xzKSB7CiAgaWYgKGVsdC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKSByZXR1cm4gZWx0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoY2xzKTsKICB2YXIgZm91bmQgPSBbXSwgcmUgPSBuZXcgUmVnRXhwKCJcXGIiICsgY2xzICsgIlxcYiIpOwogIGZ1bmN0aW9uIHNlYXJjaChlbHQpIHsKICAgIGlmIChlbHQubm9kZVR5cGUgPT0gMykgcmV0dXJuOwogICAgaWYgKHJlLnRlc3QoZWx0LmNsYXNzTmFtZSkpIGZvdW5kLnB1c2goZWx0KTsKICAgIGZvciAodmFyIGkgPSAwLCBlID0gZWx0LmNoaWxkTm9kZXMubGVuZ3RoOyBpIDwgZTsgKytpKQogICAgICBzZWFyY2goZWx0LmNoaWxkTm9kZXNbaV0pOwogIH0KICBzZWFyY2goZWx0KTsKICByZXR1cm4gZm91bmQ7Cn0KCnZhciBpZV9sdDggPSAvTVNJRSBbMS03XVxiLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpOwp2YXIgaWVfbHQ5ID0gL01TSUUgWzEtOF1cYi8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTsKdmFyIG1hYyA9IC9NYWMvLnRlc3QobmF2aWdhdG9yLnBsYXRmb3JtKTsKdmFyIHBoYW50b20gPSAvUGhhbnRvbUpTLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpOwp2YXIgb3BlcmEgPSAvT3BlcmFcL1wuLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpOwp2YXIgb3BlcmFfdmVyc2lvbiA9IG9wZXJhICYmIG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1ZlcnNpb25cLyhcZCtcLlxkKykvKTsKaWYgKG9wZXJhX3ZlcnNpb24pIG9wZXJhX3ZlcnNpb24gPSBOdW1iZXIob3BlcmFfdmVyc2lvbik7CnZhciBvcGVyYV9sdDEwID0gb3BlcmEgJiYgKCFvcGVyYV92ZXJzaW9uIHx8IG9wZXJhX3ZlcnNpb24gPCAxMCk7CgpuYW1lc3BhY2UgPSAiY29yZV8iOwoKdGVzdCgiY29yZV9mcm9tVGV4dEFyZWEiLCBmdW5jdGlvbigpIHsKICB2YXIgdGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiY29kZSIpOwogIHRlLnZhbHVlID0gIkNPTlRFTlQiOwogIHZhciBjbSA9IENvZGVNaXJyb3IuZnJvbVRleHRBcmVhKHRlKTsKICBpcyghdGUub2Zmc2V0SGVpZ2h0KTsKICBlcShjbS5nZXRWYWx1ZSgpLCAiQ09OVEVOVCIpOwogIGNtLnNldFZhbHVlKCJmb29cbmJhciIpOwogIGVxKGNtLmdldFZhbHVlKCksICJmb29cbmJhciIpOwogIGNtLnNhdmUoKTsKICBpcygvXmZvb1xyP1xuYmFyJC8udGVzdCh0ZS52YWx1ZSkpOwogIGNtLnNldFZhbHVlKCJ4eHgiKTsKICBjbS50b1RleHRBcmVhKCk7CiAgaXModGUub2Zmc2V0SGVpZ2h0KTsKICBlcSh0ZS52YWx1ZSwgInh4eCIpOwp9KTsKCnRlc3RDTSgiZ2V0UmFuZ2UiLCBmdW5jdGlvbihjbSkgewogIGVxKGNtLmdldExpbmUoMCksICIxMjM0Iik7CiAgZXEoY20uZ2V0TGluZSgxKSwgIjU2NzgiKTsKICBlcShjbS5nZXRMaW5lKDIpLCBudWxsKTsKICBlcShjbS5nZXRMaW5lKC0xKSwgbnVsbCk7CiAgZXEoY20uZ2V0UmFuZ2UoUG9zKDAsIDApLCBQb3MoMCwgMykpLCAiMTIzIik7CiAgZXEoY20uZ2V0UmFuZ2UoUG9zKDAsIC0xKSwgUG9zKDAsIDIwMCkpLCAiMTIzNCIpOwogIGVxKGNtLmdldFJhbmdlKFBvcygwLCAyKSwgUG9zKDEsIDIpKSwgIjM0XG41NiIpOwogIGVxKGNtLmdldFJhbmdlKFBvcygxLCAyKSwgUG9zKDEwMCwgMCkpLCAiNzgiKTsKfSwge3ZhbHVlOiAiMTIzNFxuNTY3OCJ9KTsKCnRlc3RDTSgicmVwbGFjZVJhbmdlIiwgZnVuY3Rpb24oY20pIHsKICBlcShjbS5nZXRWYWx1ZSgpLCAiIik7CiAgY20ucmVwbGFjZVJhbmdlKCJmb29cbiIsIFBvcygwLCAwKSk7CiAgZXEoY20uZ2V0VmFsdWUoKSwgImZvb1xuIik7CiAgY20ucmVwbGFjZVJhbmdlKCJhXG5iIiwgUG9zKDAsIDEpKTsKICBlcShjbS5nZXRWYWx1ZSgpLCAiZmFcbmJvb1xuIik7CiAgZXEoY20ubGluZUNvdW50KCksIDMpOwogIGNtLnJlcGxhY2VSYW5nZSgieHl6enkiLCBQb3MoMCwgMCksIFBvcygxLCAxKSk7CiAgZXEoY20uZ2V0VmFsdWUoKSwgInh5enp5b29cbiIpOwogIGNtLnJlcGxhY2VSYW5nZSgiYWJjIiwgUG9zKDAsIDApLCBQb3MoMTAsIDApKTsKICBlcShjbS5nZXRWYWx1ZSgpLCAiYWJjIik7CiAgZXEoY20ubGluZUNvdW50KCksIDEpOwp9KTsKCnRlc3RDTSgic2VsZWN0aW9uIiwgZnVuY3Rpb24oY20pIHsKICBjbS5zZXRTZWxlY3Rpb24oUG9zKDAsIDQpLCBQb3MoMiwgMikpOwogIGlzKGNtLnNvbWV0aGluZ1NlbGVjdGVkKCkpOwogIGVxKGNtLmdldFNlbGVjdGlvbigpLCAiMTFcbjIyMjIyMlxuMzMiKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoZmFsc2UpLCBQb3MoMiwgMikpOwogIGVxUG9zKGNtLmdldEN1cnNvcih0cnVlKSwgUG9zKDAsIDQpKTsKICBjbS5zZXRTZWxlY3Rpb24oUG9zKDEsIDApKTsKICBpcyghY20uc29tZXRoaW5nU2VsZWN0ZWQoKSk7CiAgZXEoY20uZ2V0U2VsZWN0aW9uKCksICIiKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IodHJ1ZSksIFBvcygxLCAwKSk7CiAgY20ucmVwbGFjZVNlbGVjdGlvbigiYWJjIiwgImFyb3VuZCIpOwogIGVxKGNtLmdldFNlbGVjdGlvbigpLCAiYWJjIik7CiAgZXEoY20uZ2V0VmFsdWUoKSwgIjExMTExMVxuYWJjMjIyMjIyXG4zMzMzMzMiKTsKICBjbS5yZXBsYWNlU2VsZWN0aW9uKCJkZWYiLCAiZW5kIik7CiAgZXEoY20uZ2V0U2VsZWN0aW9uKCksICIiKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IodHJ1ZSksIFBvcygxLCAzKSk7CiAgY20uc2V0Q3Vyc29yKFBvcygyLCAxKSk7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKHRydWUpLCBQb3MoMiwgMSkpOwogIGNtLnNldEN1cnNvcigxLCAyKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IodHJ1ZSksIFBvcygxLCAyKSk7Cn0sIHt2YWx1ZTogIjExMTExMVxuMjIyMjIyXG4zMzMzMzMifSk7Cgp0ZXN0Q00oImV4dGVuZFNlbGVjdGlvbiIsIGZ1bmN0aW9uKGNtKSB7CiAgY20uc2V0RXh0ZW5kaW5nKHRydWUpOwogIGFkZERvYyhjbSwgMTAsIDEwKTsKICBjbS5zZXRTZWxlY3Rpb24oUG9zKDMsIDUpKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoImhlYWQiKSwgUG9zKDMsIDUpKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoImFuY2hvciIpLCBQb3MoMywgNSkpOwogIGNtLnNldFNlbGVjdGlvbihQb3MoMiwgNSksIFBvcyg1LCA1KSk7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCJoZWFkIiksIFBvcyg1LCA1KSk7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCJhbmNob3IiKSwgUG9zKDIsIDUpKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoInN0YXJ0IiksIFBvcygyLCA1KSk7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCJlbmQiKSwgUG9zKDUsIDUpKTsKICBjbS5zZXRTZWxlY3Rpb24oUG9zKDUsIDUpLCBQb3MoMiwgNSkpOwogIGVxUG9zKGNtLmdldEN1cnNvcigiaGVhZCIpLCBQb3MoMiwgNSkpOwogIGVxUG9zKGNtLmdldEN1cnNvcigiYW5jaG9yIiksIFBvcyg1LCA1KSk7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCJzdGFydCIpLCBQb3MoMiwgNSkpOwogIGVxUG9zKGNtLmdldEN1cnNvcigiZW5kIiksIFBvcyg1LCA1KSk7CiAgY20uZXh0ZW5kU2VsZWN0aW9uKFBvcygzLCAyKSk7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCJoZWFkIiksIFBvcygzLCAyKSk7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCJhbmNob3IiKSwgUG9zKDUsIDUpKTsKICBjbS5leHRlbmRTZWxlY3Rpb24oUG9zKDYsIDIpKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoImhlYWQiKSwgUG9zKDYsIDIpKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoImFuY2hvciIpLCBQb3MoNSwgNSkpOwogIGNtLmV4dGVuZFNlbGVjdGlvbihQb3MoNiwgMyksIFBvcyg2LCA0KSk7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCJoZWFkIiksIFBvcyg2LCA0KSk7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCJhbmNob3IiKSwgUG9zKDUsIDUpKTsKICBjbS5leHRlbmRTZWxlY3Rpb24oUG9zKDAsIDMpLCBQb3MoMCwgNCkpOwogIGVxUG9zKGNtLmdldEN1cnNvcigiaGVhZCIpLCBQb3MoMCwgMykpOwogIGVxUG9zKGNtLmdldEN1cnNvcigiYW5jaG9yIiksIFBvcyg1LCA1KSk7CiAgY20uZXh0ZW5kU2VsZWN0aW9uKFBvcyg0LCA1KSwgUG9zKDYsIDUpKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoImhlYWQiKSwgUG9zKDYsIDUpKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoImFuY2hvciIpLCBQb3MoNCwgNSkpOwogIGNtLnNldEV4dGVuZGluZyhmYWxzZSk7CiAgY20uZXh0ZW5kU2VsZWN0aW9uKFBvcygwLCAzKSwgUG9zKDAsIDQpKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoImhlYWQiKSwgUG9zKDAsIDMpKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoImFuY2hvciIpLCBQb3MoMCwgNCkpOwp9KTsKCnRlc3RDTSgibGluZXMiLCBmdW5jdGlvbihjbSkgewogIGVxKGNtLmdldExpbmUoMCksICIxMTExMTEiKTsKICBlcShjbS5nZXRMaW5lKDEpLCAiMjIyMjIyIik7CiAgZXEoY20uZ2V0TGluZSgtMSksIG51bGwpOwogIGNtLnJlcGxhY2VSYW5nZSgiIiwgUG9zKDEsIDApLCBQb3MoMiwgMCkpCiAgY20ucmVwbGFjZVJhbmdlKCJhYmMiLCBQb3MoMSwgMCksIFBvcygxKSk7CiAgZXEoY20uZ2V0VmFsdWUoKSwgIjExMTExMVxuYWJjIik7Cn0sIHt2YWx1ZTogIjExMTExMVxuMjIyMjIyXG4zMzMzMzMifSk7Cgp0ZXN0Q00oImluZGVudCIsIGZ1bmN0aW9uKGNtKSB7CiAgY20uaW5kZW50TGluZSgxKTsKICBlcShjbS5nZXRMaW5lKDEpLCAiICAgYmxhaCgpOyIpOwogIGNtLnNldE9wdGlvbigiaW5kZW50VW5pdCIsIDgpOwogIGNtLmluZGVudExpbmUoMSk7CiAgZXEoY20uZ2V0TGluZSgxKSwgIlx0YmxhaCgpOyIpOwogIGNtLnNldE9wdGlvbigiaW5kZW50VW5pdCIsIDEwKTsKICBjbS5zZXRPcHRpb24oInRhYlNpemUiLCA0KTsKICBjbS5pbmRlbnRMaW5lKDEpOwogIGVxKGNtLmdldExpbmUoMSksICJcdFx0ICBibGFoKCk7Iik7Cn0sIHt2YWx1ZTogImlmICh4KSB7XG5ibGFoKCk7XG59IiwgaW5kZW50VW5pdDogMywgaW5kZW50V2l0aFRhYnM6IHRydWUsIHRhYlNpemU6IDh9KTsKCnRlc3RDTSgiaW5kZW50QnlOdW1iZXIiLCBmdW5jdGlvbihjbSkgewogIGNtLmluZGVudExpbmUoMCwgMik7CiAgZXEoY20uZ2V0TGluZSgwKSwgIiAgZm9vIik7CiAgY20uaW5kZW50TGluZSgwLCAtMjAwKTsKICBlcShjbS5nZXRMaW5lKDApLCAiZm9vIik7CiAgY20uc2V0U2VsZWN0aW9uKFBvcygwLCAwKSwgUG9zKDEsIDIpKTsKICBjbS5pbmRlbnRTZWxlY3Rpb24oMyk7CiAgZXEoY20uZ2V0VmFsdWUoKSwgIiAgIGZvb1xuICAgYmFyXG5iYXoiKTsKfSwge3ZhbHVlOiAiZm9vXG5iYXJcbmJheiJ9KTsKCnRlc3QoImNvcmVfZGVmYXVsdHMiLCBmdW5jdGlvbigpIHsKICB2YXIgZGVmc0NvcHkgPSB7fSwgZGVmcyA9IENvZGVNaXJyb3IuZGVmYXVsdHM7CiAgZm9yICh2YXIgb3B0IGluIGRlZnMpIGRlZnNDb3B5W29wdF0gPSBkZWZzW29wdF07CiAgZGVmcy5pbmRlbnRVbml0ID0gNTsKICBkZWZzLnZhbHVlID0gInV1IjsKICBkZWZzLmluZGVudFdpdGhUYWJzID0gdHJ1ZTsKICBkZWZzLnRhYmluZGV4ID0gNTU7CiAgdmFyIHBsYWNlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRlc3Rncm91bmQiKSwgY20gPSBDb2RlTWlycm9yKHBsYWNlKTsKICB0cnkgewogICAgZXEoY20uZ2V0T3B0aW9uKCJpbmRlbnRVbml0IiksIDUpOwogICAgY20uc2V0T3B0aW9uKCJpbmRlbnRVbml0IiwgMTApOwogICAgZXEoZGVmcy5pbmRlbnRVbml0LCA1KTsKICAgIGVxKGNtLmdldFZhbHVlKCksICJ1dSIpOwogICAgZXEoY20uZ2V0T3B0aW9uKCJpbmRlbnRXaXRoVGFicyIpLCB0cnVlKTsKICAgIGVxKGNtLmdldElucHV0RmllbGQoKS50YWJJbmRleCwgNTUpOwogIH0KICBmaW5hbGx5IHsKICAgIGZvciAodmFyIG9wdCBpbiBkZWZzQ29weSkgZGVmc1tvcHRdID0gZGVmc0NvcHlbb3B0XTsKICAgIHBsYWNlLnJlbW92ZUNoaWxkKGNtLmdldFdyYXBwZXJFbGVtZW50KCkpOwogIH0KfSk7Cgp0ZXN0Q00oImxpbmVJbmZvIiwgZnVuY3Rpb24oY20pIHsKICBlcShjbS5saW5lSW5mbygtMSksIG51bGwpOwogIHZhciBtYXJrID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3BhbiIpOwogIHZhciBsaCA9IGNtLnNldEd1dHRlck1hcmtlcigxLCAiRk9PIiwgbWFyayk7CiAgdmFyIGluZm8gPSBjbS5saW5lSW5mbygxKTsKICBlcShpbmZvLnRleHQsICIyMjIyMjIiKTsKICBlcShpbmZvLmd1dHRlck1hcmtlcnMuRk9PLCBtYXJrKTsKICBlcShpbmZvLmxpbmUsIDEpOwogIGVxKGNtLmxpbmVJbmZvKDIpLmd1dHRlck1hcmtlcnMsIG51bGwpOwogIGNtLnNldEd1dHRlck1hcmtlcihsaCwgIkZPTyIsIG51bGwpOwogIGVxKGNtLmxpbmVJbmZvKDEpLmd1dHRlck1hcmtlcnMsIG51bGwpOwogIGNtLnNldEd1dHRlck1hcmtlcigxLCAiRk9PIiwgbWFyayk7CiAgY20uc2V0R3V0dGVyTWFya2VyKDAsICJGT08iLCBtYXJrKTsKICBjbS5jbGVhckd1dHRlcigiRk9PIik7CiAgZXEoY20ubGluZUluZm8oMCkuZ3V0dGVyTWFya2VycywgbnVsbCk7CiAgZXEoY20ubGluZUluZm8oMSkuZ3V0dGVyTWFya2VycywgbnVsbCk7Cn0sIHt2YWx1ZTogIjExMTExMVxuMjIyMjIyXG4zMzMzMzMifSk7Cgp0ZXN0Q00oImNvb3JkcyIsIGZ1bmN0aW9uKGNtKSB7CiAgY20uc2V0U2l6ZShudWxsLCAxMDApOwogIGFkZERvYyhjbSwgMzIsIDIwMCk7CiAgdmFyIHRvcCA9IGNtLmNoYXJDb29yZHMoUG9zKDAsIDApKTsKICB2YXIgYm90ID0gY20uY2hhckNvb3JkcyhQb3MoMjAwLCAzMCkpOwogIGlzKHRvcC5sZWZ0IDwgYm90LmxlZnQpOwogIGlzKHRvcC50b3AgPCBib3QudG9wKTsKICBpcyh0b3AudG9wIDwgdG9wLmJvdHRvbSk7CiAgY20uc2Nyb2xsVG8obnVsbCwgMTAwKTsKICB2YXIgdG9wMiA9IGNtLmNoYXJDb29yZHMoUG9zKDAsIDApKTsKICBpcyh0b3AudG9wID4gdG9wMi50b3ApOwogIGVxKHRvcC5sZWZ0LCB0b3AyLmxlZnQpOwp9KTsKCnRlc3RDTSgiY29vcmRzQ2hhciIsIGZ1bmN0aW9uKGNtKSB7CiAgYWRkRG9jKGNtLCAzNSwgNzApOwogIGZvciAodmFyIGkgPSAwOyBpIDwgMjsgKytpKSB7CiAgICB2YXIgc3lzID0gaSA/ICJsb2NhbCIgOiAicGFnZSI7CiAgICBmb3IgKHZhciBjaCA9IDA7IGNoIDw9IDM1OyBjaCArPSA1KSB7CiAgICAgIGZvciAodmFyIGxpbmUgPSAwOyBsaW5lIDwgNzA7IGxpbmUgKz0gNSkgewogICAgICAgIGNtLnNldEN1cnNvcihsaW5lLCBjaCk7CiAgICAgICAgdmFyIGNvb3JkcyA9IGNtLmNoYXJDb29yZHMoUG9zKGxpbmUsIGNoKSwgc3lzKTsKICAgICAgICB2YXIgcG9zID0gY20uY29vcmRzQ2hhcih7bGVmdDogY29vcmRzLmxlZnQgKyAxLCB0b3A6IGNvb3Jkcy50b3AgKyAxfSwgc3lzKTsKICAgICAgICBlcVBvcyhwb3MsIFBvcyhsaW5lLCBjaCkpOwogICAgICB9CiAgICB9CiAgfQp9LCB7bGluZU51bWJlcnM6IHRydWV9KTsKCnRlc3RDTSgicG9zRnJvbUluZGV4IiwgZnVuY3Rpb24oY20pIHsKICBjbS5zZXRWYWx1ZSgKICAgICJUaGlzIGZ1bmN0aW9uIHNob3VsZFxuIiArCiAgICAiY29udmVydCBhIHplcm8gYmFzZWQgaW5kZXhcbiIgKwogICAgInRvIGxpbmUgYW5kIGNoLiIKICApOwoKICB2YXIgZXhhbXBsZXMgPSBbCiAgICB7IGluZGV4OiAtMSwgbGluZTogMCwgY2g6IDAgIH0sIC8vIDwtIFRlc3RzIGNsaXBwaW5nCiAgICB7IGluZGV4OiAwLCAgbGluZTogMCwgY2g6IDAgIH0sCiAgICB7IGluZGV4OiAxMCwgbGluZTogMCwgY2g6IDEwIH0sCiAgICB7IGluZGV4OiAzOSwgbGluZTogMSwgY2g6IDE4IH0sCiAgICB7IGluZGV4OiA1NSwgbGluZTogMiwgY2g6IDcgIH0sCiAgICB7IGluZGV4OiA2MywgbGluZTogMiwgY2g6IDE1IH0sCiAgICB7IGluZGV4OiA2NCwgbGluZTogMiwgY2g6IDE1IH0gIC8vIDwtIFRlc3RzIGNsaXBwaW5nCiAgXTsKCiAgZm9yICh2YXIgaSA9IDA7IGkgPCBleGFtcGxlcy5sZW5ndGg7IGkrKykgewogICAgdmFyIGV4YW1wbGUgPSBleGFtcGxlc1tpXTsKICAgIHZhciBwb3MgPSBjbS5wb3NGcm9tSW5kZXgoZXhhbXBsZS5pbmRleCk7CiAgICBlcShwb3MubGluZSwgZXhhbXBsZS5saW5lKTsKICAgIGVxKHBvcy5jaCwgZXhhbXBsZS5jaCk7CiAgICBpZiAoZXhhbXBsZS5pbmRleCA+PSAwICYmIGV4YW1wbGUuaW5kZXggPCA2NCkKICAgICAgZXEoY20uaW5kZXhGcm9tUG9zKHBvcyksIGV4YW1wbGUuaW5kZXgpOwogIH0KfSk7Cgp0ZXN0Q00oInVuZG8iLCBmdW5jdGlvbihjbSkgewogIGNtLnJlcGxhY2VSYW5nZSgiZGVmIiwgUG9zKDAsIDApLCBQb3MoMCkpOwogIGVxKGNtLmhpc3RvcnlTaXplKCkudW5kbywgMSk7CiAgY20udW5kbygpOwogIGVxKGNtLmdldFZhbHVlKCksICJhYmMiKTsKICBlcShjbS5oaXN0b3J5U2l6ZSgpLnVuZG8sIDApOwogIGVxKGNtLmhpc3RvcnlTaXplKCkucmVkbywgMSk7CiAgY20ucmVkbygpOwogIGVxKGNtLmdldFZhbHVlKCksICJkZWYiKTsKICBlcShjbS5oaXN0b3J5U2l6ZSgpLnVuZG8sIDEpOwogIGVxKGNtLmhpc3RvcnlTaXplKCkucmVkbywgMCk7CiAgY20uc2V0VmFsdWUoIjFcblxuXG4yIik7CiAgY20uY2xlYXJIaXN0b3J5KCk7CiAgZXEoY20uaGlzdG9yeVNpemUoKS51bmRvLCAwKTsKICBmb3IgKHZhciBpID0gMDsgaSA8IDIwOyArK2kpIHsKICAgIGNtLnJlcGxhY2VSYW5nZSgiYSIsIFBvcygwLCAwKSk7CiAgICBjbS5yZXBsYWNlUmFuZ2UoImIiLCBQb3MoMywgMCkpOwogIH0KICBlcShjbS5oaXN0b3J5U2l6ZSgpLnVuZG8sIDQwKTsKICBmb3IgKHZhciBpID0gMDsgaSA8IDQwOyArK2kpCiAgICBjbS51bmRvKCk7CiAgZXEoY20uaGlzdG9yeVNpemUoKS5yZWRvLCA0MCk7CiAgZXEoY20uZ2V0VmFsdWUoKSwgIjFcblxuXG4yIik7Cn0sIHt2YWx1ZTogImFiYyJ9KTsKCnRlc3RDTSgidW5kb0RlcHRoIiwgZnVuY3Rpb24oY20pIHsKICBjbS5yZXBsYWNlUmFuZ2UoImQiLCBQb3MoMCkpOwogIGNtLnJlcGxhY2VSYW5nZSgiZSIsIFBvcygwKSk7CiAgY20ucmVwbGFjZVJhbmdlKCJmIiwgUG9zKDApKTsKICBjbS51bmRvKCk7IGNtLnVuZG8oKTsgY20udW5kbygpOwogIGVxKGNtLmdldFZhbHVlKCksICJhYmNkIik7Cn0sIHt2YWx1ZTogImFiYyIsIHVuZG9EZXB0aDogNH0pOwoKdGVzdENNKCJ1bmRvRG9lc250Q2xlYXJWYWx1ZSIsIGZ1bmN0aW9uKGNtKSB7CiAgY20udW5kbygpOwogIGVxKGNtLmdldFZhbHVlKCksICJ4Iik7Cn0sIHt2YWx1ZTogIngifSk7Cgp0ZXN0Q00oInVuZG9NdWx0aUxpbmUiLCBmdW5jdGlvbihjbSkgewogIGNtLm9wZXJhdGlvbihmdW5jdGlvbigpIHsKICAgIGNtLnJlcGxhY2VSYW5nZSgieCIsIFBvcygwLCAwKSk7CiAgICBjbS5yZXBsYWNlUmFuZ2UoInkiLCBQb3MoMSwgMCkpOwogIH0pOwogIGNtLnVuZG8oKTsKICBlcShjbS5nZXRWYWx1ZSgpLCAiYWJjXG5kZWZcbmdoaSIpOwogIGNtLm9wZXJhdGlvbihmdW5jdGlvbigpIHsKICAgIGNtLnJlcGxhY2VSYW5nZSgieSIsIFBvcygxLCAwKSk7CiAgICBjbS5yZXBsYWNlUmFuZ2UoIngiLCBQb3MoMCwgMCkpOwogIH0pOwogIGNtLnVuZG8oKTsKICBlcShjbS5nZXRWYWx1ZSgpLCAiYWJjXG5kZWZcbmdoaSIpOwogIGNtLm9wZXJhdGlvbihmdW5jdGlvbigpIHsKICAgIGNtLnJlcGxhY2VSYW5nZSgieSIsIFBvcygyLCAwKSk7CiAgICBjbS5yZXBsYWNlUmFuZ2UoIngiLCBQb3MoMSwgMCkpOwogICAgY20ucmVwbGFjZVJhbmdlKCJ6IiwgUG9zKDIsIDApKTsKICB9KTsKICBjbS51bmRvKCk7CiAgZXEoY20uZ2V0VmFsdWUoKSwgImFiY1xuZGVmXG5naGkiLCAzKTsKfSwge3ZhbHVlOiAiYWJjXG5kZWZcbmdoaSJ9KTsKCnRlc3RDTSgidW5kb0NvbXBvc2l0ZSIsIGZ1bmN0aW9uKGNtKSB7CiAgY20ucmVwbGFjZVJhbmdlKCJ5IiwgUG9zKDEpKTsKICBjbS5vcGVyYXRpb24oZnVuY3Rpb24oKSB7CiAgICBjbS5yZXBsYWNlUmFuZ2UoIngiLCBQb3MoMCkpOwogICAgY20ucmVwbGFjZVJhbmdlKCJ6IiwgUG9zKDIpKTsKICB9KTsKICBlcShjbS5nZXRWYWx1ZSgpLCAiYXhcbmJ5XG5jelxuIik7CiAgY20udW5kbygpOwogIGVxKGNtLmdldFZhbHVlKCksICJhXG5ieVxuY1xuIik7CiAgY20udW5kbygpOwogIGVxKGNtLmdldFZhbHVlKCksICJhXG5iXG5jXG4iKTsKICBjbS5yZWRvKCk7IGNtLnJlZG8oKTsKICBlcShjbS5nZXRWYWx1ZSgpLCAiYXhcbmJ5XG5jelxuIik7Cn0sIHt2YWx1ZTogImFcbmJcbmNcbiJ9KTsKCnRlc3RDTSgidW5kb1NlbGVjdGlvbiIsIGZ1bmN0aW9uKGNtKSB7CiAgY20uc2V0U2VsZWN0aW9uKFBvcygwLCAyKSwgUG9zKDAsIDQpKTsKICBjbS5yZXBsYWNlU2VsZWN0aW9uKCIiKTsKICBjbS5zZXRDdXJzb3IoUG9zKDEsIDApKTsKICBjbS51bmRvKCk7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKHRydWUpLCBQb3MoMCwgMikpOwogIGVxUG9zKGNtLmdldEN1cnNvcihmYWxzZSksIFBvcygwLCA0KSk7CiAgY20uc2V0Q3Vyc29yKFBvcygxLCAwKSk7CiAgY20ucmVkbygpOwogIGVxUG9zKGNtLmdldEN1cnNvcih0cnVlKSwgUG9zKDAsIDIpKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoZmFsc2UpLCBQb3MoMCwgMikpOwp9LCB7dmFsdWU6ICJhYmNkZWZnaFxuIn0pOwoKdGVzdENNKCJ1bmRvU2VsZWN0aW9uQXNCZWZvcmUiLCBmdW5jdGlvbihjbSkgewogIGNtLnJlcGxhY2VTZWxlY3Rpb24oImFiYyIsICJhcm91bmQiKTsKICBjbS51bmRvKCk7CiAgY20ucmVkbygpOwogIGVxKGNtLmdldFNlbGVjdGlvbigpLCAiYWJjIik7Cn0pOwoKdGVzdENNKCJzZWxlY3Rpb25DaGFuZ2VDb25mdXNlc0hpc3RvcnkiLCBmdW5jdGlvbihjbSkgewogIGNtLnJlcGxhY2VTZWxlY3Rpb24oImFiYyIsIG51bGwsICJkb250bWVyZ2UiKTsKICBjbS5vcGVyYXRpb24oZnVuY3Rpb24oKSB7CiAgICBjbS5zZXRDdXJzb3IoUG9zKDAsIDApKTsKICAgIGNtLnJlcGxhY2VTZWxlY3Rpb24oImFiYyIsIG51bGwsICJkb250bWVyZ2UiKTsKICB9KTsKICBlcShjbS5oaXN0b3J5U2l6ZSgpLnVuZG8sIDIpOwp9KTsKCnRlc3RDTSgibWFya1RleHRTaW5nbGVMaW5lIiwgZnVuY3Rpb24oY20pIHsKICBmb3JFYWNoKFt7YTogMCwgYjogMSwgYzogIiIsIGY6IDIsIHQ6IDV9LAogICAgICAgICAgIHthOiAwLCBiOiA0LCBjOiAiIiwgZjogMCwgdDogMn0sCiAgICAgICAgICAge2E6IDEsIGI6IDIsIGM6ICJ4IiwgZjogMywgdDogNn0sCiAgICAgICAgICAge2E6IDQsIGI6IDUsIGM6ICIiLCBmOiAzLCB0OiA1fSwKICAgICAgICAgICB7YTogNCwgYjogNSwgYzogInh4IiwgZjogMywgdDogN30sCiAgICAgICAgICAge2E6IDIsIGI6IDUsIGM6ICIiLCBmOiAyLCB0OiAzfSwKICAgICAgICAgICB7YTogMiwgYjogNSwgYzogImFiY2QiLCBmOiA2LCB0OiA3fSwKICAgICAgICAgICB7YTogMiwgYjogNiwgYzogIngiLCBmOiBudWxsLCB0OiBudWxsfSwKICAgICAgICAgICB7YTogMywgYjogNiwgYzogIiIsIGY6IG51bGwsIHQ6IG51bGx9LAogICAgICAgICAgIHthOiAwLCBiOiA5LCBjOiAiaGFsbG8iLCBmOiBudWxsLCB0OiBudWxsfSwKICAgICAgICAgICB7YTogNCwgYjogNiwgYzogIngiLCBmOiAzLCB0OiA0fSwKICAgICAgICAgICB7YTogNCwgYjogOCwgYzogIiIsIGY6IDMsIHQ6IDR9LAogICAgICAgICAgIHthOiA2LCBiOiA2LCBjOiAiYSIsIGY6IDMsIHQ6IDZ9LAogICAgICAgICAgIHthOiA4LCBiOiA5LCBjOiAiIiwgZjogMywgdDogNn1dLCBmdW5jdGlvbih0ZXN0KSB7CiAgICBjbS5zZXRWYWx1ZSgiMTIzNDU2Nzg5MCIpOwogICAgdmFyIHIgPSBjbS5tYXJrVGV4dChQb3MoMCwgMyksIFBvcygwLCA2KSwge2NsYXNzTmFtZTogImZvbyJ9KTsKICAgIGNtLnJlcGxhY2VSYW5nZSh0ZXN0LmMsIFBvcygwLCB0ZXN0LmEpLCBQb3MoMCwgdGVzdC5iKSk7CiAgICB2YXIgZiA9IHIuZmluZCgpOwogICAgZXEoZiAmJiBmLmZyb20uY2gsIHRlc3QuZik7IGVxKGYgJiYgZi50by5jaCwgdGVzdC50KTsKICB9KTsKfSk7Cgp0ZXN0Q00oIm1hcmtUZXh0TXVsdGlMaW5lIiwgZnVuY3Rpb24oY20pIHsKICBmdW5jdGlvbiBwKHYpIHsgcmV0dXJuIHYgJiYgUG9zKHZbMF0sIHZbMV0pOyB9CiAgZm9yRWFjaChbe2E6IFswLCAwXSwgYjogWzAsIDVdLCBjOiAiIiwgZjogWzAsIDBdLCB0OiBbMiwgNV19LAogICAgICAgICAgIHthOiBbMCwgMF0sIGI6IFswLCA1XSwgYzogImZvb1xuIiwgZjogWzEsIDBdLCB0OiBbMywgNV19LAogICAgICAgICAgIHthOiBbMCwgMV0sIGI6IFswLCAxMF0sIGM6ICIiLCBmOiBbMCwgMV0sIHQ6IFsyLCA1XX0sCiAgICAgICAgICAge2E6IFswLCA1XSwgYjogWzAsIDZdLCBjOiAieCIsIGY6IFswLCA2XSwgdDogWzIsIDVdfSwKICAgICAgICAgICB7YTogWzAsIDBdLCBiOiBbMSwgMF0sIGM6ICIiLCBmOiBbMCwgMF0sIHQ6IFsxLCA1XX0sCiAgICAgICAgICAge2E6IFswLCA2XSwgYjogWzIsIDRdLCBjOiAiIiwgZjogWzAsIDVdLCB0OiBbMCwgN119LAogICAgICAgICAgIHthOiBbMCwgNl0sIGI6IFsyLCA0XSwgYzogImFhIiwgZjogWzAsIDVdLCB0OiBbMCwgOV19LAogICAgICAgICAgIHthOiBbMSwgMl0sIGI6IFsxLCA4XSwgYzogIiIsIGY6IFswLCA1XSwgdDogWzIsIDVdfSwKICAgICAgICAgICB7YTogWzAsIDVdLCBiOiBbMiwgNV0sIGM6ICJ4eCIsIGY6IG51bGwsIHQ6IG51bGx9LAogICAgICAgICAgIHthOiBbMCwgMF0sIGI6IFsyLCAxMF0sIGM6ICJ4IiwgZjogbnVsbCwgdDogbnVsbH0sCiAgICAgICAgICAge2E6IFsxLCA1XSwgYjogWzIsIDVdLCBjOiAiIiwgZjogWzAsIDVdLCB0OiBbMSwgNV19LAogICAgICAgICAgIHthOiBbMiwgMF0sIGI6IFsyLCAzXSwgYzogIiIsIGY6IFswLCA1XSwgdDogWzIsIDJdfSwKICAgICAgICAgICB7YTogWzIsIDVdLCBiOiBbMywgMF0sIGM6ICJhXG5iIiwgZjogWzAsIDVdLCB0OiBbMiwgNV19LAogICAgICAgICAgIHthOiBbMiwgM10sIGI6IFszLCAwXSwgYzogIngiLCBmOiBbMCwgNV0sIHQ6IFsyLCAzXX0sCiAgICAgICAgICAge2E6IFsxLCAxXSwgYjogWzEsIDldLCBjOiAiMVxuMlxuMyIsIGY6IFswLCA1XSwgdDogWzQsIDVdfV0sIGZ1bmN0aW9uKHRlc3QpIHsKICAgIGNtLnNldFZhbHVlKCJhYWFhYWFhYWFhXG5iYmJiYmJiYmJiXG5jY2NjY2NjY2NjXG5kZGRkZGRkZFxuIik7CiAgICB2YXIgciA9IGNtLm1hcmtUZXh0KFBvcygwLCA1KSwgUG9zKDIsIDUpLAogICAgICAgICAgICAgICAgICAgICAgICB7Y2xhc3NOYW1lOiAiQ29kZU1pcnJvci1tYXRjaGluZ2JyYWNrZXQifSk7CiAgICBjbS5yZXBsYWNlUmFuZ2UodGVzdC5jLCBwKHRlc3QuYSksIHAodGVzdC5iKSk7CiAgICB2YXIgZiA9IHIuZmluZCgpOwogICAgZXFQb3MoZiAmJiBmLmZyb20sIHAodGVzdC5mKSk7IGVxUG9zKGYgJiYgZi50bywgcCh0ZXN0LnQpKTsKICB9KTsKfSk7Cgp0ZXN0Q00oIm1hcmtUZXh0VW5kbyIsIGZ1bmN0aW9uKGNtKSB7CiAgdmFyIG1hcmtlcjEsIG1hcmtlcjIsIGJvb2ttYXJrOwogIG1hcmtlcjEgPSBjbS5tYXJrVGV4dChQb3MoMCwgMSksIFBvcygwLCAzKSwKICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogIkNvZGVNaXJyb3ItbWF0Y2hpbmdicmFja2V0In0pOwogIG1hcmtlcjIgPSBjbS5tYXJrVGV4dChQb3MoMCwgMCksIFBvcygyLCAxKSwKICAgICAgICAgICAgICAgICAgICAgICAge2NsYXNzTmFtZTogIkNvZGVNaXJyb3ItbWF0Y2hpbmdicmFja2V0In0pOwogIGJvb2ttYXJrID0gY20uc2V0Qm9va21hcmsoUG9zKDEsIDUpKTsKICBjbS5vcGVyYXRpb24oZnVuY3Rpb24oKXsKICAgIGNtLnJlcGxhY2VSYW5nZSgiZm9vIiwgUG9zKDAsIDIpKTsKICAgIGNtLnJlcGxhY2VSYW5nZSgiYmFyXG5iYXpcbmJ1Z1xuIiwgUG9zKDIsIDApLCBQb3MoMywgMCkpOwogIH0pOwogIHZhciB2MSA9IGNtLmdldFZhbHVlKCk7CiAgY20uc2V0VmFsdWUoIiIpOwogIGVxKG1hcmtlcjEuZmluZCgpLCBudWxsKTsgZXEobWFya2VyMi5maW5kKCksIG51bGwpOyBlcShib29rbWFyay5maW5kKCksIG51bGwpOwogIGNtLnVuZG8oKTsKICBlcVBvcyhib29rbWFyay5maW5kKCksIFBvcygxLCA1KSwgInN0aWxsIHRoZXJlIik7CiAgY20udW5kbygpOwogIHZhciBtMVBvcyA9IG1hcmtlcjEuZmluZCgpLCBtMlBvcyA9IG1hcmtlcjIuZmluZCgpOwogIGVxUG9zKG0xUG9zLmZyb20sIFBvcygwLCAxKSk7IGVxUG9zKG0xUG9zLnRvLCBQb3MoMCwgMykpOwogIGVxUG9zKG0yUG9zLmZyb20sIFBvcygwLCAwKSk7IGVxUG9zKG0yUG9zLnRvLCBQb3MoMiwgMSkpOwogIGVxUG9zKGJvb2ttYXJrLmZpbmQoKSwgUG9zKDEsIDUpKTsKICBjbS5yZWRvKCk7IGNtLnJlZG8oKTsKICBlcShib29rbWFyay5maW5kKCksIG51bGwpOwogIGNtLnVuZG8oKTsKICBlcVBvcyhib29rbWFyay5maW5kKCksIFBvcygxLCA1KSk7CiAgZXEoY20uZ2V0VmFsdWUoKSwgdjEpOwp9LCB7dmFsdWU6ICIxMjM0XG41Njc4OVxuMDBcbiJ9KTsKCnRlc3RDTSgibWFya1RleHRTdGF5R29uZSIsIGZ1bmN0aW9uKGNtKSB7CiAgdmFyIG0xID0gY20ubWFya1RleHQoUG9zKDAsIDApLCBQb3MoMCwgMSkpOwogIGNtLnJlcGxhY2VSYW5nZSgiaGkiLCBQb3MoMCwgMikpOwogIG0xLmNsZWFyKCk7CiAgY20udW5kbygpOwogIGVxKG0xLmZpbmQoKSwgbnVsbCk7Cn0sIHt2YWx1ZTogImhlbGxvIn0pOwoKdGVzdENNKCJtYXJrVGV4dEFsbG93RW1wdHkiLCBmdW5jdGlvbihjbSkgewogIHZhciBtMSA9IGNtLm1hcmtUZXh0KFBvcygwLCAxKSwgUG9zKDAsIDIpLCB7Y2xlYXJXaGVuRW1wdHk6IGZhbHNlfSk7CiAgaXMobTEuZmluZCgpKTsKICBjbS5yZXBsYWNlUmFuZ2UoIngiLCBQb3MoMCwgMCkpOwogIGlzKG0xLmZpbmQoKSk7CiAgY20ucmVwbGFjZVJhbmdlKCJ5IiwgUG9zKDAsIDIpKTsKICBpcyhtMS5maW5kKCkpOwogIGNtLnJlcGxhY2VSYW5nZSgieiIsIFBvcygwLCAzKSwgUG9zKDAsIDQpKTsKICBpcyghbTEuZmluZCgpKTsKICB2YXIgbTIgPSBjbS5tYXJrVGV4dChQb3MoMCwgMSksIFBvcygwLCAyKSwge2NsZWFyV2hlbkVtcHR5OiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1c2l2ZUxlZnQ6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdXNpdmVSaWdodDogdHJ1ZX0pOwogIGNtLnJlcGxhY2VSYW5nZSgicSIsIFBvcygwLCAxKSwgUG9zKDAsIDIpKTsKICBpcyhtMi5maW5kKCkpOwogIGNtLnJlcGxhY2VSYW5nZSgiIiwgUG9zKDAsIDApLCBQb3MoMCwgMykpOwogIGlzKCFtMi5maW5kKCkpOwogIHZhciBtMyA9IGNtLm1hcmtUZXh0KFBvcygwLCAxKSwgUG9zKDAsIDEpLCB7Y2xlYXJXaGVuRW1wdHk6IGZhbHNlfSk7CiAgY20ucmVwbGFjZVJhbmdlKCJhIiwgUG9zKDAsIDMpKTsKICBpcyhtMy5maW5kKCkpOwogIGNtLnJlcGxhY2VSYW5nZSgiYiIsIFBvcygwLCAxKSk7CiAgaXMoIW0zLmZpbmQoKSk7Cn0sIHt2YWx1ZTogImFiY2RlIn0pOwoKdGVzdENNKCJtYXJrVGV4dFN0YWNrZWQiLCBmdW5jdGlvbihjbSkgewogIHZhciBtMSA9IGNtLm1hcmtUZXh0KFBvcygwLCAwKSwgUG9zKDAsIDApLCB7Y2xlYXJXaGVuRW1wdHk6IGZhbHNlfSk7CiAgdmFyIG0yID0gY20ubWFya1RleHQoUG9zKDAsIDApLCBQb3MoMCwgMCksIHtjbGVhcldoZW5FbXB0eTogZmFsc2V9KTsKICBjbS5yZXBsYWNlUmFuZ2UoIkIiLCBQb3MoMCwgMSkpOwogIGlzKG0xLmZpbmQoKSAmJiBtMi5maW5kKCkpOwp9LCB7dmFsdWU6ICJBIn0pOwoKdGVzdENNKCJ1bmRvUHJlc2VydmVzTmV3TWFya3MiLCBmdW5jdGlvbihjbSkgewogIGNtLm1hcmtUZXh0KFBvcygwLCAzKSwgUG9zKDAsIDQpKTsKICBjbS5tYXJrVGV4dChQb3MoMSwgMSksIFBvcygxLCAzKSk7CiAgY20ucmVwbGFjZVJhbmdlKCIiLCBQb3MoMCwgMyksIFBvcygzLCAxKSk7CiAgdmFyIG1CZWZvcmUgPSBjbS5tYXJrVGV4dChQb3MoMCwgMCksIFBvcygwLCAxKSk7CiAgdmFyIG1BZnRlciA9IGNtLm1hcmtUZXh0KFBvcygwLCA1KSwgUG9zKDAsIDYpKTsKICB2YXIgbUFyb3VuZCA9IGNtLm1hcmtUZXh0KFBvcygwLCAyKSwgUG9zKDAsIDQpKTsKICBjbS51bmRvKCk7CiAgZXFQb3MobUJlZm9yZS5maW5kKCkuZnJvbSwgUG9zKDAsIDApKTsKICBlcVBvcyhtQmVmb3JlLmZpbmQoKS50bywgUG9zKDAsIDEpKTsKICBlcVBvcyhtQWZ0ZXIuZmluZCgpLmZyb20sIFBvcygzLCAzKSk7CiAgZXFQb3MobUFmdGVyLmZpbmQoKS50bywgUG9zKDMsIDQpKTsKICBlcVBvcyhtQXJvdW5kLmZpbmQoKS5mcm9tLCBQb3MoMCwgMikpOwogIGVxUG9zKG1Bcm91bmQuZmluZCgpLnRvLCBQb3MoMywgMikpOwogIHZhciBmb3VuZCA9IGNtLmZpbmRNYXJrc0F0KFBvcygyLCAyKSk7CiAgZXEoZm91bmQubGVuZ3RoLCAxKTsKICBlcShmb3VuZFswXSwgbUFyb3VuZCk7Cn0sIHt2YWx1ZTogImFhYWFcbmJiYmJcbmNjY2NcbmRkZGQifSk7Cgp0ZXN0Q00oIm1hcmtDbGVhckJldHdlZW4iLCBmdW5jdGlvbihjbSkgewogIGNtLnNldFZhbHVlKCJhYWFcbmJiYlxuY2NjXG5kZGRcbiIpOwogIGNtLm1hcmtUZXh0KFBvcygwLCAwKSwgUG9zKDIpKTsKICBjbS5yZXBsYWNlUmFuZ2UoImFhYVxuYmJiXG5jY2MiLCBQb3MoMCwgMCksIFBvcygyKSk7CiAgZXEoY20uZmluZE1hcmtzQXQoUG9zKDEsIDEpKS5sZW5ndGgsIDApOwp9KTsKCnRlc3RDTSgiZmluZE1hcmtzTWlkZGxlIiwgZnVuY3Rpb24oY20pIHsKICB2YXIgbWFyayA9IGNtLm1hcmtUZXh0KFBvcygxLCAxKSwgUG9zKDMsIDEpKTsKICB2YXIgZm91bmQgPSBjbS5maW5kTWFya3MoUG9zKDIsIDEpLCBQb3MoMiwgMikpOwogIGVxKGZvdW5kLmxlbmd0aCwgMSk7CiAgZXEoZm91bmRbMF0sIG1hcmspOwp9LCB7dmFsdWU6ICJsaW5lIDBcbmxpbmUgMVxubGluZSAyXG5saW5lIDMifSk7Cgp0ZXN0Q00oImRlbGV0ZVNwYW5Db2xsYXBzZWRJbmNsdXNpdmVMZWZ0IiwgZnVuY3Rpb24oY20pIHsKICB2YXIgZnJvbSA9IFBvcygxLCAwKSwgdG8gPSBQb3MoMSwgMSk7CiAgdmFyIG0gPSBjbS5tYXJrVGV4dChmcm9tLCB0bywge2NvbGxhcHNlZDogdHJ1ZSwgaW5jbHVzaXZlTGVmdDogdHJ1ZX0pOwogIC8vIERlbGV0ZSBjb2xsYXBzZWQgc3Bhbi4KICBjbS5yZXBsYWNlUmFuZ2UoIiIsIGZyb20sIHRvKTsKfSwge3ZhbHVlOiAiYWJjXG5YXG5kZWYifSk7Cgp0ZXN0Q00oIm1hcmtUZXh0Q1NTIiwgZnVuY3Rpb24oY20pIHsKICBmdW5jdGlvbiBwcmVzZW50KCkgewogICAgdmFyIHNwYW5zID0gY20uZGlzcGxheS5saW5lRGl2LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJzcGFuIik7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IHNwYW5zLmxlbmd0aDsgaSsrKQogICAgICBpZiAoc3BhbnNbaV0uc3R5bGUuY29sb3IgPT0gImN5YW4iICYmIHNwYW5baV0udGV4dENvbnRlbnQgPT0gImNkZWZnIikgcmV0dXJuIHRydWU7CiAgfQogIHZhciBtID0gY20ubWFya1RleHQoUG9zKDAsIDIpLCBQb3MoMCwgNiksIHtjc3M6ICJjb2xvcjogY3lhbiJ9KTsKICBtLmNsZWFyKCk7CiAgaXMoIXByZXNlbnQoKSk7Cn0sIHt2YWx1ZTogImFiY2RlZmdoIn0pOwoKdGVzdENNKCJib29rbWFyayIsIGZ1bmN0aW9uKGNtKSB7CiAgZnVuY3Rpb24gcCh2KSB7IHJldHVybiB2ICYmIFBvcyh2WzBdLCB2WzFdKTsgfQogIGZvckVhY2goW3thOiBbMSwgMF0sIGI6IFsxLCAxXSwgYzogIiIsIGQ6IFsxLCA0XX0sCiAgICAgICAgICAge2E6IFsxLCAxXSwgYjogWzEsIDFdLCBjOiAieHgiLCBkOiBbMSwgN119LAogICAgICAgICAgIHthOiBbMSwgNF0sIGI6IFsxLCA1XSwgYzogImFiIiwgZDogWzEsIDZdfSwKICAgICAgICAgICB7YTogWzEsIDRdLCBiOiBbMSwgNl0sIGM6ICIiLCBkOiBudWxsfSwKICAgICAgICAgICB7YTogWzEsIDVdLCBiOiBbMSwgNl0sIGM6ICJhYmMiLCBkOiBbMSwgNV19LAogICAgICAgICAgIHthOiBbMSwgNl0sIGI6IFsxLCA4XSwgYzogIiIsIGQ6IFsxLCA1XX0sCiAgICAgICAgICAge2E6IFsxLCA0XSwgYjogWzEsIDRdLCBjOiAiXG5cbiIsIGQ6IFszLCAxXX0sCiAgICAgICAgICAge2JtOiBbMSwgOV0sIGE6IFsxLCAxXSwgYjogWzEsIDFdLCBjOiAiXG4iLCBkOiBbMiwgOF19XSwgZnVuY3Rpb24odGVzdCkgewogICAgY20uc2V0VmFsdWUoIjEyMzQ1Njc4OTBcbjEyMzQ1Njc4OTBcbjEyMzQ1Njc4OTAiKTsKICAgIHZhciBiID0gY20uc2V0Qm9va21hcmsocCh0ZXN0LmJtKSB8fCBQb3MoMSwgNSkpOwogICAgY20ucmVwbGFjZVJhbmdlKHRlc3QuYywgcCh0ZXN0LmEpLCBwKHRlc3QuYikpOwogICAgZXFQb3MoYi5maW5kKCksIHAodGVzdC5kKSk7CiAgfSk7Cn0pOwoKdGVzdENNKCJib29rbWFya0luc2VydExlZnQiLCBmdW5jdGlvbihjbSkgewogIHZhciBiciA9IGNtLnNldEJvb2ttYXJrKFBvcygwLCAyKSwge2luc2VydExlZnQ6IGZhbHNlfSk7CiAgdmFyIGJsID0gY20uc2V0Qm9va21hcmsoUG9zKDAsIDIpLCB7aW5zZXJ0TGVmdDogdHJ1ZX0pOwogIGNtLnNldEN1cnNvcihQb3MoMCwgMikpOwogIGNtLnJlcGxhY2VTZWxlY3Rpb24oImhpIik7CiAgZXFQb3MoYnIuZmluZCgpLCBQb3MoMCwgMikpOwogIGVxUG9zKGJsLmZpbmQoKSwgUG9zKDAsIDQpKTsKICBjbS5yZXBsYWNlUmFuZ2UoIiIsIFBvcygwLCA0KSwgUG9zKDAsIDUpKTsKICBjbS5yZXBsYWNlUmFuZ2UoIiIsIFBvcygwLCAyKSwgUG9zKDAsIDQpKTsKICBjbS5yZXBsYWNlUmFuZ2UoIiIsIFBvcygwLCAxKSwgUG9zKDAsIDIpKTsKICAvLyBWZXJpZnkgdGhhdCBkZWxldGluZyBuZXh0IHRvIGJvb2ttYXJrcyBkb2Vzbid0IGtpbGwgdGhlbQogIGVxUG9zKGJyLmZpbmQoKSwgUG9zKDAsIDEpKTsKICBlcVBvcyhibC5maW5kKCksIFBvcygwLCAxKSk7Cn0sIHt2YWx1ZTogImFiY2RlZiJ9KTsKCnRlc3RDTSgiYm9va21hcmtDdXJzb3IiLCBmdW5jdGlvbihjbSkgewogIHZhciBwb3MwMSA9IGNtLmN1cnNvckNvb3JkcyhQb3MoMCwgMSkpLCBwb3MxMSA9IGNtLmN1cnNvckNvb3JkcyhQb3MoMSwgMSkpLAogICAgICBwb3MyMCA9IGNtLmN1cnNvckNvb3JkcyhQb3MoMiwgMCkpLCBwb3MzMCA9IGNtLmN1cnNvckNvb3JkcyhQb3MoMywgMCkpLAogICAgICBwb3M0MSA9IGNtLmN1cnNvckNvb3JkcyhQb3MoNCwgMSkpOwogIGNtLnNldEJvb2ttYXJrKFBvcygwLCAxKSwge3dpZGdldDogZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIuKGkCIpLCBpbnNlcnRMZWZ0OiB0cnVlfSk7CiAgY20uc2V0Qm9va21hcmsoUG9zKDIsIDApLCB7d2lkZ2V0OiBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgi4oaQIiksIGluc2VydExlZnQ6IHRydWV9KTsKICBjbS5zZXRCb29rbWFyayhQb3MoMSwgMSksIHt3aWRnZXQ6IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCLihpIiKX0pOwogIGNtLnNldEJvb2ttYXJrKFBvcygzLCAwKSwge3dpZGdldDogZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIuKGkiIpfSk7CiAgdmFyIG5ldzAxID0gY20uY3Vyc29yQ29vcmRzKFBvcygwLCAxKSksIG5ldzExID0gY20uY3Vyc29yQ29vcmRzKFBvcygxLCAxKSksCiAgICAgIG5ldzIwID0gY20uY3Vyc29yQ29vcmRzKFBvcygyLCAwKSksIG5ldzMwID0gY20uY3Vyc29yQ29vcmRzKFBvcygzLCAwKSk7CiAgbmVhcihuZXcwMS5sZWZ0LCBwb3MwMS5sZWZ0LCAxKTsKICBuZWFyKG5ldzAxLnRvcCwgcG9zMDEudG9wLCAxKTsKICBpcyhuZXcxMS5sZWZ0ID4gcG9zMTEubGVmdCwgImF0IHJpZ2h0LCBtaWRkbGUgb2YgbGluZSIpOwogIG5lYXIobmV3MTEudG9wID09IHBvczExLnRvcCwgMSk7CiAgbmVhcihuZXcyMC5sZWZ0LCBwb3MyMC5sZWZ0LCAxKTsKICBuZWFyKG5ldzIwLnRvcCwgcG9zMjAudG9wLCAxKTsKICBpcyhuZXczMC5sZWZ0ID4gcG9zMzAubGVmdCwgImF0IHJpZ2h0LCBlbXB0eSBsaW5lIik7CiAgbmVhcihuZXczMC50b3AsIHBvczMwLCAxKTsKICBjbS5zZXRCb29rbWFyayhQb3MoNCwgMCksIHt3aWRnZXQ6IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCLihpIiKX0pOwogIGlzKGNtLmN1cnNvckNvb3JkcyhQb3MoNCwgMSkpLmxlZnQgPiBwb3M0MS5sZWZ0LCAic2luZ2xlLWNoYXIgYnVnIik7Cn0sIHt2YWx1ZTogImZvb1xuYmFyXG5cblxueFxueSJ9KTsKCnRlc3RDTSgibXVsdGlCb29rbWFya0N1cnNvciIsIGZ1bmN0aW9uKGNtKSB7CiAgaWYgKHBoYW50b20pIHJldHVybjsKICB2YXIgbXMgPSBbXSwgbTsKICBmdW5jdGlvbiBhZGQoaW5zZXJ0TGVmdCkgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCAzOyArK2kpIHsKICAgICAgdmFyIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7CiAgICAgIG5vZGUuaW5uZXJIVE1MID0gIlgiOwogICAgICBtcy5wdXNoKGNtLnNldEJvb2ttYXJrKFBvcygwLCAxKSwge3dpZGdldDogbm9kZSwgaW5zZXJ0TGVmdDogaW5zZXJ0TGVmdH0pKTsKICAgIH0KICB9CiAgdmFyIGJhc2UxID0gY20uY3Vyc29yQ29vcmRzKFBvcygwLCAxKSkubGVmdCwgYmFzZTQgPSBjbS5jdXJzb3JDb29yZHMoUG9zKDAsIDQpKS5sZWZ0OwogIGFkZCh0cnVlKTsKICBuZWFyKGJhc2UxLCBjbS5jdXJzb3JDb29yZHMoUG9zKDAsIDEpKS5sZWZ0LCAxKTsKICB3aGlsZSAobSA9IG1zLnBvcCgpKSBtLmNsZWFyKCk7CiAgYWRkKGZhbHNlKTsKICBuZWFyKGJhc2U0LCBjbS5jdXJzb3JDb29yZHMoUG9zKDAsIDEpKS5sZWZ0LCAxKTsKfSwge3ZhbHVlOiAiYWJjZGVmZyJ9KTsKCnRlc3RDTSgiZ2V0QWxsTWFya3MiLCBmdW5jdGlvbihjbSkgewogIGFkZERvYyhjbSwgMTAsIDEwKTsKICB2YXIgbTEgPSBjbS5zZXRCb29rbWFyayhQb3MoMCwgMikpOwogIHZhciBtMiA9IGNtLm1hcmtUZXh0KFBvcygwLCAyKSwgUG9zKDMsIDIpKTsKICB2YXIgbTMgPSBjbS5tYXJrVGV4dChQb3MoMSwgMiksIFBvcygxLCA4KSk7CiAgdmFyIG00ID0gY20ubWFya1RleHQoUG9zKDgsIDApLCBQb3MoOSwgMCkpOwogIGVxKGNtLmdldEFsbE1hcmtzKCkubGVuZ3RoLCA0KTsKICBtMS5jbGVhcigpOwogIG0zLmNsZWFyKCk7CiAgZXEoY20uZ2V0QWxsTWFya3MoKS5sZW5ndGgsIDIpOwp9KTsKCnRlc3RDTSgic2V0VmFsdWVDbGVhcnMiLCBmdW5jdGlvbihjbSkgewogIGNtLmFkZExpbmVDbGFzcygwLCAid3JhcCIsICJmb28iKTsKICB2YXIgbWFyayA9IGNtLm1hcmtUZXh0KFBvcygwLCAwKSwgUG9zKDEsIDEpLCB7aW5jbHVzaXZlTGVmdDogdHJ1ZSwgaW5jbHVzaXZlUmlnaHQ6IHRydWV9KTsKICBjbS5zZXRWYWx1ZSgiZm9vIik7CiAgaXMoIWNtLmxpbmVJbmZvKDApLndyYXBDbGFzcyk7CiAgaXMoIW1hcmsuZmluZCgpKTsKfSwge3ZhbHVlOiAiYVxuYiJ9KTsKCnRlc3RDTSgiYnVnNTc3IiwgZnVuY3Rpb24oY20pIHsKICBjbS5zZXRWYWx1ZSgiYVxuYiIpOwogIGNtLmNsZWFySGlzdG9yeSgpOwogIGNtLnNldFZhbHVlKCJmb29vb28iKTsKICBjbS51bmRvKCk7Cn0pOwoKdGVzdENNKCJzY3JvbGxTbmFwIiwgZnVuY3Rpb24oY20pIHsKICBjbS5zZXRTaXplKDEwMCwgMTAwKTsKICBhZGREb2MoY20sIDIwMCwgMjAwKTsKICBjbS5zZXRDdXJzb3IoUG9zKDEwMCwgMTgwKSk7CiAgdmFyIGluZm8gPSBjbS5nZXRTY3JvbGxJbmZvKCk7CiAgaXMoaW5mby5sZWZ0ID4gMCAmJiBpbmZvLnRvcCA+IDApOwogIGNtLnNldEN1cnNvcihQb3MoMCwgMCkpOwogIGluZm8gPSBjbS5nZXRTY3JvbGxJbmZvKCk7CiAgaXMoaW5mby5sZWZ0ID09IDAgJiYgaW5mby50b3AgPT0gMCwgInNjcm9sbGVkIGNsZWFuIHRvIHRvcCIpOwogIGNtLnNldEN1cnNvcihQb3MoMTAwLCAxODApKTsKICBjbS5zZXRDdXJzb3IoUG9zKDE5OSwgMCkpOwogIGluZm8gPSBjbS5nZXRTY3JvbGxJbmZvKCk7CiAgaXMoaW5mby5sZWZ0ID09IDAgJiYgaW5mby50b3AgKyAyID4gaW5mby5oZWlnaHQgLSBjbS5nZXRTY3JvbGxlckVsZW1lbnQoKS5jbGllbnRIZWlnaHQsICJzY3JvbGxlZCBjbGVhbiB0byBib3R0b20iKTsKfSk7Cgp0ZXN0Q00oInNjcm9sbEludG9WaWV3IiwgZnVuY3Rpb24oY20pIHsKICBpZiAocGhhbnRvbSkgcmV0dXJuOwogIHZhciBvdXRlciA9IGNtLmdldFdyYXBwZXJFbGVtZW50KCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgZnVuY3Rpb24gdGVzdChsaW5lLCBjaCwgbXNnKSB7CiAgICB2YXIgcG9zID0gUG9zKGxpbmUsIGNoKTsKICAgIGNtLnNjcm9sbEludG9WaWV3KHBvcyk7CiAgICB2YXIgYm94ID0gY20uY2hhckNvb3Jkcyhwb3MsICJ3aW5kb3ciKTsKICAgIGlzKGJveC5sZWZ0ID49IG91dGVyLmxlZnQsIG1zZyArICIgKGxlZnQpIik7CiAgICBpcyhib3gucmlnaHQgPD0gb3V0ZXIucmlnaHQsIG1zZyArICIgKHJpZ2h0KSIpOwogICAgaXMoYm94LnRvcCA+PSBvdXRlci50b3AsIG1zZyArICIgKHRvcCkiKTsKICAgIGlzKGJveC5ib3R0b20gPD0gb3V0ZXIuYm90dG9tLCBtc2cgKyAiIChib3R0b20pIik7CiAgfQogIGFkZERvYyhjbSwgMjAwLCAyMDApOwogIHRlc3QoMTk5LCAxOTksICJib3R0b20gcmlnaHQiKTsKICB0ZXN0KDAsIDAsICJ0b3AgbGVmdCIpOwogIHRlc3QoMTAwLCAxMDAsICJjZW50ZXIiKTsKICB0ZXN0KDE5OSwgMCwgImJvdHRvbSBsZWZ0Iik7CiAgdGVzdCgwLCAxOTksICJ0b3AgcmlnaHQiKTsKICB0ZXN0KDEwMCwgMTAwLCAiY2VudGVyIGFnYWluIik7Cn0pOwoKdGVzdENNKCJzY3JvbGxCYWNrQW5kRm9ydGgiLCBmdW5jdGlvbihjbSkgewogIGFkZERvYyhjbSwgMSwgMjAwKTsKICBjbS5vcGVyYXRpb24oZnVuY3Rpb24oKSB7CiAgICBjbS5zY3JvbGxJbnRvVmlldyhQb3MoMTk5LCAwKSk7CiAgICBjbS5zY3JvbGxJbnRvVmlldyhQb3MoNCwgMCkpOwogIH0pOwogIGlzKGNtLmdldFNjcm9sbEluZm8oKS50b3AgPiAwKTsKfSk7Cgp0ZXN0Q00oInNlbGVjdEFsbE5vU2Nyb2xsIiwgZnVuY3Rpb24oY20pIHsKICBhZGREb2MoY20sIDEsIDIwMCk7CiAgY20uZXhlY0NvbW1hbmQoInNlbGVjdEFsbCIpOwogIGVxKGNtLmdldFNjcm9sbEluZm8oKS50b3AsIDApOwogIGNtLnNldEN1cnNvcigxOTkpOwogIGNtLmV4ZWNDb21tYW5kKCJzZWxlY3RBbGwiKTsKICBpcyhjbS5nZXRTY3JvbGxJbmZvKCkudG9wID4gMCk7Cn0pOwoKdGVzdENNKCJzZWxlY3Rpb25Qb3MiLCBmdW5jdGlvbihjbSkgewogIGlmIChwaGFudG9tIHx8IGNtLmdldE9wdGlvbigiaW5wdXRTdHlsZSIpICE9ICJ0ZXh0YXJlYSIpIHJldHVybjsKICBjbS5zZXRTaXplKDEwMCwgMTAwKTsKICBhZGREb2MoY20sIDIwMCwgMTAwKTsKICBjbS5zZXRTZWxlY3Rpb24oUG9zKDEsIDEwMCksIFBvcyg5OCwgMTAwKSk7CiAgdmFyIGxpbmVXaWR0aCA9IGNtLmNoYXJDb29yZHMoUG9zKDAsIDIwMCksICJsb2NhbCIpLmxlZnQ7CiAgdmFyIGxpbmVIZWlnaHQgPSAoY20uY2hhckNvb3JkcyhQb3MoOTkpKS50b3AgLSBjbS5jaGFyQ29vcmRzKFBvcygwKSkudG9wKSAvIDEwMDsKICBjbS5zY3JvbGxUbygwLCAwKTsKICB2YXIgc2VsRWx0ID0gYnlDbGFzc05hbWUoY20uZ2V0V3JhcHBlckVsZW1lbnQoKSwgIkNvZGVNaXJyb3Itc2VsZWN0ZWQiKTsKICB2YXIgb3V0ZXIgPSBjbS5nZXRXcmFwcGVyRWxlbWVudCgpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogIHZhciBzYXdNaWRkbGUsIHNhd1RvcCwgc2F3Qm90dG9tOwogIGZvciAodmFyIGkgPSAwLCBlID0gc2VsRWx0Lmxlbmd0aDsgaSA8IGU7ICsraSkgewogICAgdmFyIGJveCA9IHNlbEVsdFtpXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgIHZhciBhdExlZnQgPSBib3gubGVmdCAtIG91dGVyLmxlZnQgPCAzMDsKICAgIHZhciB3aWR0aCA9IGJveC5yaWdodCAtIGJveC5sZWZ0OwogICAgdmFyIGF0UmlnaHQgPSBib3gucmlnaHQgLSBvdXRlci5sZWZ0ID4gLjggKiBsaW5lV2lkdGg7CiAgICBpZiAoYXRMZWZ0ICYmIGF0UmlnaHQpIHsKICAgICAgc2F3TWlkZGxlID0gdHJ1ZTsKICAgICAgaXMoYm94LmJvdHRvbSAtIGJveC50b3AgPiA5MCAqIGxpbmVIZWlnaHQsICJtaWRkbGUgaGlnaCIpOwogICAgICBpcyh3aWR0aCA+IC45ICogbGluZVdpZHRoLCAibWlkZGxlIHdpZGUiKTsKICAgIH0gZWxzZSB7CiAgICAgIGlzKHdpZHRoID4gLjQgKiBsaW5lV2lkdGgsICJ0b3AvYm90IHdpZGUgZW5vdWdoIik7CiAgICAgIGlzKHdpZHRoIDwgLjYgKiBsaW5lV2lkdGgsICJ0b3AvYm90IHNsaW0gZW5vdWdoIik7CiAgICAgIGlmIChhdExlZnQpIHsKICAgICAgICBzYXdCb3R0b20gPSB0cnVlOwogICAgICAgIGlzKGJveC50b3AgLSBvdXRlci50b3AgPiA5NiAqIGxpbmVIZWlnaHQsICJib3QgYmVsb3ciKTsKICAgICAgfSBlbHNlIGlmIChhdFJpZ2h0KSB7CiAgICAgICAgc2F3VG9wID0gdHJ1ZTsKICAgICAgICBpcyhib3gudG9wIC0gb3V0ZXIudG9wIDwgMi4xICogbGluZUhlaWdodCwgInRvcCBhYm92ZSIpOwogICAgICB9CiAgICB9CiAgfQogIGlzKHNhd1RvcCAmJiBzYXdCb3R0b20gJiYgc2F3TWlkZGxlLCAiYWxsIHBhcnRzIik7Cn0sIG51bGwpOwoKdGVzdENNKCJyZXN0b3JlSGlzdG9yeSIsIGZ1bmN0aW9uKGNtKSB7CiAgY20uc2V0VmFsdWUoImFiY1xuZGVmIik7CiAgY20ucmVwbGFjZVJhbmdlKCJoZWxsbyIsIFBvcygxLCAwKSwgUG9zKDEpKTsKICBjbS5yZXBsYWNlUmFuZ2UoImdvb3AiLCBQb3MoMCwgMCksIFBvcygwKSk7CiAgY20udW5kbygpOwogIHZhciBzdG9yZWRWYWwgPSBjbS5nZXRWYWx1ZSgpLCBzdG9yZWRIaXN0ID0gY20uZ2V0SGlzdG9yeSgpOwogIGlmICh3aW5kb3cuSlNPTikgc3RvcmVkSGlzdCA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoc3RvcmVkSGlzdCkpOwogIGVxKHN0b3JlZFZhbCwgImFiY1xuaGVsbG8iKTsKICBjbS5zZXRWYWx1ZSgiIik7CiAgY20uY2xlYXJIaXN0b3J5KCk7CiAgZXEoY20uaGlzdG9yeVNpemUoKS51bmRvLCAwKTsKICBjbS5zZXRWYWx1ZShzdG9yZWRWYWwpOwogIGNtLnNldEhpc3Rvcnkoc3RvcmVkSGlzdCk7CiAgY20ucmVkbygpOwogIGVxKGNtLmdldFZhbHVlKCksICJnb29wXG5oZWxsbyIpOwogIGNtLnVuZG8oKTsgY20udW5kbygpOwogIGVxKGNtLmdldFZhbHVlKCksICJhYmNcbmRlZiIpOwp9KTsKCnRlc3RDTSgiZG91YmxlU2Nyb2xsYmFyIiwgZnVuY3Rpb24oY20pIHsKICB2YXIgZHVtbXkgPSBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInAiKSk7CiAgZHVtbXkuc3R5bGUuY3NzVGV4dCA9ICJoZWlnaHQ6IDUwcHg7IG92ZXJmbG93OiBzY3JvbGw7IHdpZHRoOiA1MHB4IjsKICB2YXIgc2Nyb2xsYmFyV2lkdGggPSBkdW1teS5vZmZzZXRXaWR0aCArIDEgLSBkdW1teS5jbGllbnRXaWR0aDsKICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGR1bW15KTsKICBpZiAoc2Nyb2xsYmFyV2lkdGggPCAyKSByZXR1cm47CiAgY20uc2V0U2l6ZShudWxsLCAxMDApOwogIGFkZERvYyhjbSwgMSwgMzAwKTsKICB2YXIgd3JhcCA9IGNtLmdldFdyYXBwZXJFbGVtZW50KCk7CiAgaXMod3JhcC5vZmZzZXRXaWR0aCAtIGJ5Q2xhc3NOYW1lKHdyYXAsICJDb2RlTWlycm9yLWxpbmVzIilbMF0ub2Zmc2V0V2lkdGggPD0gc2Nyb2xsYmFyV2lkdGggKiAxLjUpOwp9KTsKCnRlc3RDTSgid2VpcmRMaW5lYnJlYWtzIiwgZnVuY3Rpb24oY20pIHsKICBjbS5zZXRWYWx1ZSgiZm9vXG5iYXJccmJhelxyXG5xdXV4XG5ccnBsb3AiKTsKICBpcyhjbS5nZXRWYWx1ZSgpLCAiZm9vXG5iYXJcbmJhelxucXV1eFxuXG5wbG9wIik7CiAgaXMoY20ubGluZUNvdW50KCksIDYpOwogIGNtLnNldFZhbHVlKCJcblxuIik7CiAgaXMoY20ubGluZUNvdW50KCksIDMpOwp9KTsKCnRlc3RDTSgic2V0U2l6ZSIsIGZ1bmN0aW9uKGNtKSB7CiAgY20uc2V0U2l6ZSgxMDAsIDEwMCk7CiAgdmFyIHdyYXAgPSBjbS5nZXRXcmFwcGVyRWxlbWVudCgpOwogIGlzKHdyYXAub2Zmc2V0V2lkdGgsIDEwMCk7CiAgaXMod3JhcC5vZmZzZXRIZWlnaHQsIDEwMCk7CiAgY20uc2V0U2l6ZSgiMTAwJSIsICIzZW0iKTsKICBpcyh3cmFwLnN0eWxlLndpZHRoLCAiMTAwJSIpOwogIGlzKHdyYXAuc3R5bGUuaGVpZ2h0LCAiM2VtIik7CiAgY20uc2V0U2l6ZShudWxsLCA0MCk7CiAgaXMod3JhcC5zdHlsZS53aWR0aCwgIjEwMCUiKTsKICBpcyh3cmFwLnN0eWxlLmhlaWdodCwgIjQwcHgiKTsKfSk7CgpmdW5jdGlvbiBmb2xkTGluZXMoY20sIHN0YXJ0LCBlbmQsIGF1dG9DbGVhcikgewogIHJldHVybiBjbS5tYXJrVGV4dChQb3Moc3RhcnQsIDApLCBQb3MoZW5kIC0gMSksIHsKICAgIGluY2x1c2l2ZUxlZnQ6IHRydWUsCiAgICBpbmNsdXNpdmVSaWdodDogdHJ1ZSwKICAgIGNvbGxhcHNlZDogdHJ1ZSwKICAgIGNsZWFyT25FbnRlcjogYXV0b0NsZWFyCiAgfSk7Cn0KCnRlc3RDTSgiY29sbGFwc2VkTGluZXMiLCBmdW5jdGlvbihjbSkgewogIGFkZERvYyhjbSwgNCwgMTApOwogIHZhciByYW5nZSA9IGZvbGRMaW5lcyhjbSwgNCwgNSksIGNsZWFyZWQgPSAwOwogIENvZGVNaXJyb3Iub24ocmFuZ2UsICJjbGVhciIsIGZ1bmN0aW9uKCkge2NsZWFyZWQrKzt9KTsKICBjbS5zZXRDdXJzb3IoUG9zKDMsIDApKTsKICBDb2RlTWlycm9yLmNvbW1hbmRzLmdvTGluZURvd24oY20pOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoNSwgMCkpOwogIGNtLnJlcGxhY2VSYW5nZSgiYWJjZGVmZyIsIFBvcygzLCAwKSwgUG9zKDMpKTsKICBjbS5zZXRDdXJzb3IoUG9zKDMsIDYpKTsKICBDb2RlTWlycm9yLmNvbW1hbmRzLmdvTGluZURvd24oY20pOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoNSwgNCkpOwogIGNtLnJlcGxhY2VSYW5nZSgiYWIiLCBQb3MoMywgMCksIFBvcygzKSk7CiAgY20uc2V0Q3Vyc29yKFBvcygzLCAyKSk7CiAgQ29kZU1pcnJvci5jb21tYW5kcy5nb0xpbmVEb3duKGNtKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDUsIDIpKTsKICBjbS5vcGVyYXRpb24oZnVuY3Rpb24oKSB7cmFuZ2UuY2xlYXIoKTsgcmFuZ2UuY2xlYXIoKTt9KTsKICBlcShjbGVhcmVkLCAxKTsKfSk7Cgp0ZXN0Q00oImNvbGxhcHNlZFJhbmdlQ29vcmRzQ2hhciIsIGZ1bmN0aW9uKGNtKSB7CiAgdmFyIHBvc18xXzMgPSBjbS5jaGFyQ29vcmRzKFBvcygxLCAzKSk7CiAgcG9zXzFfMy5sZWZ0ICs9IDI7IHBvc18xXzMudG9wICs9IDI7CiAgdmFyIG9wdHMgPSB7Y29sbGFwc2VkOiB0cnVlLCBpbmNsdXNpdmVMZWZ0OiB0cnVlLCBpbmNsdXNpdmVSaWdodDogdHJ1ZX07CiAgdmFyIG0xID0gY20ubWFya1RleHQoUG9zKDAsIDApLCBQb3MoMiwgMCksIG9wdHMpOwogIGVxUG9zKGNtLmNvb3Jkc0NoYXIocG9zXzFfMyksIFBvcygzLCAzKSk7CiAgbTEuY2xlYXIoKTsKICB2YXIgbTEgPSBjbS5tYXJrVGV4dChQb3MoMCwgMCksIFBvcygxLCAxKSwge2NvbGxhcHNlZDogdHJ1ZSwgaW5jbHVzaXZlTGVmdDogdHJ1ZX0pOwogIHZhciBtMiA9IGNtLm1hcmtUZXh0KFBvcygxLCAxKSwgUG9zKDIsIDApLCB7Y29sbGFwc2VkOiB0cnVlLCBpbmNsdXNpdmVSaWdodDogdHJ1ZX0pOwogIGVxUG9zKGNtLmNvb3Jkc0NoYXIocG9zXzFfMyksIFBvcygzLCAzKSk7CiAgbTEuY2xlYXIoKTsgbTIuY2xlYXIoKTsKICB2YXIgbTEgPSBjbS5tYXJrVGV4dChQb3MoMCwgMCksIFBvcygxLCA2KSwgb3B0cyk7CiAgZXFQb3MoY20uY29vcmRzQ2hhcihwb3NfMV8zKSwgUG9zKDMsIDMpKTsKfSwge3ZhbHVlOiAiMTIzNDU2XG5hYmNkZWZcbmdoaWprbFxubW5vcHFyXG4ifSk7Cgp0ZXN0Q00oImNvbGxhcHNlZFJhbmdlQmV0d2VlbkxpbmVzU2VsZWN0ZWQiLCBmdW5jdGlvbihjbSkgewogIGlmIChjbS5nZXRPcHRpb24oImlucHV0U3R5bGUiKSAhPSAidGV4dGFyZWEiKSByZXR1cm47CiAgdmFyIHdpZGdldCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTsKICB3aWRnZXQudGV4dENvbnRlbnQgPSAiXHUyMTk0IjsKICBjbS5tYXJrVGV4dChQb3MoMCwgMyksIFBvcygxLCAwKSwge3JlcGxhY2VkV2l0aDogd2lkZ2V0fSk7CiAgY20uc2V0U2VsZWN0aW9uKFBvcygwLCAzKSwgUG9zKDEsIDApKTsKICB2YXIgc2VsRWx0cyA9IGJ5Q2xhc3NOYW1lKGNtLmdldFdyYXBwZXJFbGVtZW50KCksICJDb2RlTWlycm9yLXNlbGVjdGVkIik7CiAgZm9yICh2YXIgaSA9IDAsIHcgPSAwOyBpIDwgc2VsRWx0cy5sZW5ndGg7IGkrKykKICAgIHcgKz0gc2VsRWx0c1tpXS5vZmZzZXRXaWR0aDsKICBpcyh3ID4gMCk7Cn0sIHt2YWx1ZTogIm9uZVxudHdvIn0pOwoKdGVzdENNKCJyYW5kb21Db2xsYXBzZWRSYW5nZXMiLCBmdW5jdGlvbihjbSkgewogIGFkZERvYyhjbSwgMjAsIDUwMCk7CiAgY20ub3BlcmF0aW9uKGZ1bmN0aW9uKCkgewogICAgZm9yICh2YXIgaSA9IDA7IGkgPCAyMDA7IGkrKykgewogICAgICB2YXIgc3RhcnQgPSBQb3MoTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogNTAwKSwgTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMjApKTsKICAgICAgaWYgKGkgJSA0KQogICAgICAgIHRyeSB7IGNtLm1hcmtUZXh0KHN0YXJ0LCBQb3Moc3RhcnQubGluZSArIDIsIDEpLCB7Y29sbGFwc2VkOiB0cnVlfSk7IH0KICAgICAgICBjYXRjaChlKSB7IGlmICghL292ZXJsYXBwaW5nLy50ZXN0KFN0cmluZyhlKSkpIHRocm93IGU7IH0KICAgICAgZWxzZQogICAgICAgIGNtLm1hcmtUZXh0KHN0YXJ0LCBQb3Moc3RhcnQubGluZSwgc3RhcnQuY2ggKyA0KSwgeyJjbGFzc05hbWUiOiAiZm9vIn0pOwogICAgfQogIH0pOwp9KTsKCnRlc3RDTSgiaGlkZGVuTGluZXNBdXRvVW5mb2xkIiwgZnVuY3Rpb24oY20pIHsKICB2YXIgcmFuZ2UgPSBmb2xkTGluZXMoY20sIDEsIDMsIHRydWUpLCBjbGVhcmVkID0gMDsKICBDb2RlTWlycm9yLm9uKHJhbmdlLCAiY2xlYXIiLCBmdW5jdGlvbigpIHtjbGVhcmVkKys7fSk7CiAgY20uc2V0Q3Vyc29yKFBvcygzLCAwKSk7CiAgZXEoY2xlYXJlZCwgMCk7CiAgY20uZXhlY0NvbW1hbmQoImdvQ2hhckxlZnQiKTsKICBlcShjbGVhcmVkLCAxKTsKICByYW5nZSA9IGZvbGRMaW5lcyhjbSwgMSwgMywgdHJ1ZSk7CiAgQ29kZU1pcnJvci5vbihyYW5nZSwgImNsZWFyIiwgZnVuY3Rpb24oKSB7Y2xlYXJlZCsrO30pOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoMywgMCkpOwogIGNtLnNldEN1cnNvcihQb3MoMCwgMykpOwogIGNtLmV4ZWNDb21tYW5kKCJnb0NoYXJSaWdodCIpOwogIGVxKGNsZWFyZWQsIDIpOwp9LCB7dmFsdWU6ICJhYmNcbmRlZlxuZ2hpXG5qa2wifSk7Cgp0ZXN0Q00oImhpZGRlbkxpbmVzU2VsZWN0QWxsIiwgZnVuY3Rpb24oY20pIHsgIC8vIElzc3VlICM0ODQKICBhZGREb2MoY20sIDQsIDIwKTsKICBmb2xkTGluZXMoY20sIDAsIDEwKTsKICBmb2xkTGluZXMoY20sIDExLCAyMCk7CiAgQ29kZU1pcnJvci5jb21tYW5kcy5zZWxlY3RBbGwoY20pOwogIGVxUG9zKGNtLmdldEN1cnNvcih0cnVlKSwgUG9zKDEwLCAwKSk7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKGZhbHNlKSwgUG9zKDEwLCA0KSk7Cn0pOwoKCnRlc3RDTSgiZXZlcnl0aGluZ0ZvbGRlZCIsIGZ1bmN0aW9uKGNtKSB7CiAgYWRkRG9jKGNtLCAyLCAyKTsKICBmdW5jdGlvbiBlbnRlclByZXNzKCkgewogICAgY20udHJpZ2dlck9uS2V5RG93bih7dHlwZTogImtleWRvd24iLCBrZXlDb2RlOiAxMywgcHJldmVudERlZmF1bHQ6IGZ1bmN0aW9uKCl7fSwgc3RvcFByb3BhZ2F0aW9uOiBmdW5jdGlvbigpe319KTsKICB9CiAgdmFyIGZvbGQgPSBmb2xkTGluZXMoY20sIDAsIDIpOwogIGVudGVyUHJlc3MoKTsKICBlcShjbS5nZXRWYWx1ZSgpLCAieHhcbnh4Iik7CiAgZm9sZC5jbGVhcigpOwogIGZvbGQgPSBmb2xkTGluZXMoY20sIDAsIDIsIHRydWUpOwogIGVxKGZvbGQuZmluZCgpLCBudWxsKTsKICBlbnRlclByZXNzKCk7CiAgZXEoY20uZ2V0VmFsdWUoKSwgIlxueHhcbnh4Iik7Cn0pOwoKdGVzdENNKCJzdHJ1Y3R1cmVkRm9sZCIsIGZ1bmN0aW9uKGNtKSB7CiAgaWYgKHBoYW50b20pIHJldHVybjsKICBhZGREb2MoY20sIDQsIDgpOwogIHZhciByYW5nZSA9IGNtLm1hcmtUZXh0KFBvcygxLCAyKSwgUG9zKDYsIDIpLCB7CiAgICByZXBsYWNlZFdpdGg6IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCJRIikKICB9KTsKICBjbS5zZXRDdXJzb3IoMCwgMyk7CiAgQ29kZU1pcnJvci5jb21tYW5kcy5nb0xpbmVEb3duKGNtKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDYsIDIpKTsKICBDb2RlTWlycm9yLmNvbW1hbmRzLmdvQ2hhckxlZnQoY20pOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoMSwgMikpOwogIENvZGVNaXJyb3IuY29tbWFuZHMuZGVsQ2hhckFmdGVyKGNtKTsKICBlcShjbS5nZXRWYWx1ZSgpLCAieHh4eFxueHh4eFxueHh4eCIpOwogIGFkZERvYyhjbSwgNCwgOCk7CiAgcmFuZ2UgPSBjbS5tYXJrVGV4dChQb3MoMSwgMiksIFBvcyg2LCAyKSwgewogICAgcmVwbGFjZWRXaXRoOiBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgiTSIpLAogICAgY2xlYXJPbkVudGVyOiB0cnVlCiAgfSk7CiAgdmFyIGNsZWFyZWQgPSAwOwogIENvZGVNaXJyb3Iub24ocmFuZ2UsICJjbGVhciIsIGZ1bmN0aW9uKCl7KytjbGVhcmVkO30pOwogIGNtLnNldEN1cnNvcigwLCAzKTsKICBDb2RlTWlycm9yLmNvbW1hbmRzLmdvTGluZURvd24oY20pOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoNiwgMikpOwogIENvZGVNaXJyb3IuY29tbWFuZHMuZ29DaGFyTGVmdChjbSk7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcyg2LCAxKSk7CiAgZXEoY2xlYXJlZCwgMSk7CiAgcmFuZ2UuY2xlYXIoKTsKICBlcShjbGVhcmVkLCAxKTsKICByYW5nZSA9IGNtLm1hcmtUZXh0KFBvcygxLCAyKSwgUG9zKDYsIDIpLCB7CiAgICByZXBsYWNlZFdpdGg6IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCJRIiksCiAgICBjbGVhck9uRW50ZXI6IHRydWUKICB9KTsKICByYW5nZS5jbGVhcigpOwogIGNtLnNldEN1cnNvcigxLCAyKTsKICBDb2RlTWlycm9yLmNvbW1hbmRzLmdvQ2hhclJpZ2h0KGNtKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDEsIDMpKTsKICByYW5nZSA9IGNtLm1hcmtUZXh0KFBvcygyLCAwKSwgUG9zKDQsIDQpLCB7CiAgICByZXBsYWNlZFdpdGg6IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCJNIikKICB9KTsKICBjbS5zZXRDdXJzb3IoMSwgMCk7CiAgQ29kZU1pcnJvci5jb21tYW5kcy5nb0xpbmVEb3duKGNtKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDIsIDApKTsKfSwgbnVsbCk7Cgp0ZXN0Q00oIm5lc3RlZEZvbGQiLCBmdW5jdGlvbihjbSkgewogIGFkZERvYyhjbSwgMTAsIDMpOwogIGZ1bmN0aW9uIGZvbGQobGwsIGNsLCBsciwgY3IpIHsKICAgIHJldHVybiBjbS5tYXJrVGV4dChQb3MobGwsIGNsKSwgUG9zKGxyLCBjciksIHtjb2xsYXBzZWQ6IHRydWV9KTsKICB9CiAgdmFyIGlubmVyMSA9IGZvbGQoMCwgNiwgMSwgMyksIGlubmVyMiA9IGZvbGQoMCwgMiwgMSwgOCksIG91dGVyID0gZm9sZCgwLCAxLCAyLCAzKSwgaW5uZXIwID0gZm9sZCgwLCA1LCAwLCA2KTsKICBjbS5zZXRDdXJzb3IoMCwgMSk7CiAgQ29kZU1pcnJvci5jb21tYW5kcy5nb0NoYXJSaWdodChjbSk7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygyLCAzKSk7CiAgaW5uZXIwLmNsZWFyKCk7CiAgQ29kZU1pcnJvci5jb21tYW5kcy5nb0NoYXJMZWZ0KGNtKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDAsIDEpKTsKICBvdXRlci5jbGVhcigpOwogIENvZGVNaXJyb3IuY29tbWFuZHMuZ29DaGFyUmlnaHQoY20pOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoMCwgMikpOwogIENvZGVNaXJyb3IuY29tbWFuZHMuZ29DaGFyUmlnaHQoY20pOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoMSwgOCkpOwogIGlubmVyMi5jbGVhcigpOwogIENvZGVNaXJyb3IuY29tbWFuZHMuZ29DaGFyTGVmdChjbSk7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygxLCA3KSk7CiAgY20uc2V0Q3Vyc29yKDAsIDUpOwogIENvZGVNaXJyb3IuY29tbWFuZHMuZ29DaGFyUmlnaHQoY20pOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoMCwgNikpOwogIENvZGVNaXJyb3IuY29tbWFuZHMuZ29DaGFyUmlnaHQoY20pOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoMSwgMykpOwp9KTsKCnRlc3RDTSgiYmFkTmVzdGVkRm9sZCIsIGZ1bmN0aW9uKGNtKSB7CiAgYWRkRG9jKGNtLCA0LCA0KTsKICBjbS5tYXJrVGV4dChQb3MoMCwgMiksIFBvcygzLCAyKSwge2NvbGxhcHNlZDogdHJ1ZX0pOwogIHZhciBjYXVnaHQ7CiAgdHJ5IHtjbS5tYXJrVGV4dChQb3MoMCwgMSksIFBvcygwLCAzKSwge2NvbGxhcHNlZDogdHJ1ZX0pO30KICBjYXRjaChlKSB7Y2F1Z2h0ID0gZTt9CiAgaXMoY2F1Z2h0IGluc3RhbmNlb2YgRXJyb3IsICJubyBlcnJvciIpOwogIGlzKC9vdmVybGFwL2kudGVzdChjYXVnaHQubWVzc2FnZSksICJ3cm9uZyBlcnJvciIpOwp9KTsKCnRlc3RDTSgibmVzdGVkRm9sZE9uU2lkZSIsIGZ1bmN0aW9uKGNtKSB7CiAgdmFyIG0xID0gY20ubWFya1RleHQoUG9zKDAsIDEpLCBQb3MoMiwgMSksIHtjb2xsYXBzZWQ6IHRydWUsIGluY2x1c2l2ZVJpZ2h0OiB0cnVlfSk7CiAgdmFyIG0yID0gY20ubWFya1RleHQoUG9zKDAsIDEpLCBQb3MoMCwgMiksIHtjb2xsYXBzZWQ6IHRydWV9KTsKICBjbS5tYXJrVGV4dChQb3MoMCwgMSksIFBvcygwLCAyKSwge2NvbGxhcHNlZDogdHJ1ZX0pLmNsZWFyKCk7CiAgdHJ5IHsgY20ubWFya1RleHQoUG9zKDAsIDEpLCBQb3MoMCwgMiksIHtjb2xsYXBzZWQ6IHRydWUsIGluY2x1c2l2ZUxlZnQ6IHRydWV9KTsgfQogIGNhdGNoKGUpIHsgdmFyIGNhdWdodCA9IGU7IH0KICBpcyhjYXVnaHQgJiYgL292ZXJsYXAvaS50ZXN0KGNhdWdodC5tZXNzYWdlKSk7CiAgdmFyIG0zID0gY20ubWFya1RleHQoUG9zKDIsIDApLCBQb3MoMiwgMSksIHtjb2xsYXBzZWQ6IHRydWV9KTsKICB2YXIgbTQgPSBjbS5tYXJrVGV4dChQb3MoMiwgMCksIFBvcygyLCAxKSwge2NvbGxhcHNlOiB0cnVlLCBpbmNsdXNpdmVSaWdodDogdHJ1ZX0pOwogIG0xLmNsZWFyKCk7IG00LmNsZWFyKCk7CiAgbTEgPSBjbS5tYXJrVGV4dChQb3MoMCwgMSksIFBvcygyLCAxKSwge2NvbGxhcHNlZDogdHJ1ZX0pOwogIGNtLm1hcmtUZXh0KFBvcygyLCAwKSwgUG9zKDIsIDEpLCB7Y29sbGFwc2VkOiB0cnVlfSkuY2xlYXIoKTsKICB0cnkgeyBjbS5tYXJrVGV4dChQb3MoMiwgMCksIFBvcygyLCAxKSwge2NvbGxhcHNlZDogdHJ1ZSwgaW5jbHVzaXZlUmlnaHQ6IHRydWV9KTsgfQogIGNhdGNoKGUpIHsgdmFyIGNhdWdodCA9IGU7IH0KICBpcyhjYXVnaHQgJiYgL292ZXJsYXAvaS50ZXN0KGNhdWdodC5tZXNzYWdlKSk7Cn0sIHt2YWx1ZTogImFiXG5jZFxlZiJ9KTsKCnRlc3RDTSgiZWRpdEluRm9sZCIsIGZ1bmN0aW9uKGNtKSB7CiAgYWRkRG9jKGNtLCA0LCA2KTsKICB2YXIgbSA9IGNtLm1hcmtUZXh0KFBvcygxLCAyKSwgUG9zKDMsIDIpLCB7Y29sbGFwc2VkOiB0cnVlfSk7CiAgY20ucmVwbGFjZVJhbmdlKCIiLCBQb3MoMCwgMCksIFBvcygxLCAzKSk7CiAgY20ucmVwbGFjZVJhbmdlKCIiLCBQb3MoMiwgMSksIFBvcygzLCAzKSk7CiAgY20ucmVwbGFjZVJhbmdlKCJhXG5iXG5jXG5kIiwgUG9zKDAsIDEpLCBQb3MoMSwgMCkpOwogIGNtLmN1cnNvckNvb3JkcyhQb3MoMCwgMCkpOwp9KTsKCnRlc3RDTSgid3JhcHBpbmdJbmxpbmVXaWRnZXQiLCBmdW5jdGlvbihjbSkgewogIGNtLnNldFNpemUoIjExZW0iKTsKICB2YXIgdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTsKICB3LnN0eWxlLmNvbG9yID0gInJlZCI7CiAgdy5pbm5lckhUTUwgPSAib25lIHR3byB0aHJlZSBmb3VyIjsKICBjbS5tYXJrVGV4dChQb3MoMCwgNiksIFBvcygwLCA5KSwge3JlcGxhY2VkV2l0aDogd30pOwogIHZhciBjdXIwID0gY20uY3Vyc29yQ29vcmRzKFBvcygwLCAwKSksIGN1cjEgPSBjbS5jdXJzb3JDb29yZHMoUG9zKDAsIDEwKSk7CiAgaXMoY3VyMC50b3AgPCBjdXIxLnRvcCk7CiAgaXMoY3VyMC5ib3R0b20gPCBjdXIxLmJvdHRvbSk7CiAgdmFyIGN1ckwgPSBjbS5jdXJzb3JDb29yZHMoUG9zKDAsIDYpKSwgY3VyUiA9IGNtLmN1cnNvckNvb3JkcyhQb3MoMCwgOSkpOwogIGVxKGN1ckwudG9wLCBjdXIwLnRvcCk7CiAgZXEoY3VyTC5ib3R0b20sIGN1cjAuYm90dG9tKTsKICBlcShjdXJSLnRvcCwgY3VyMS50b3ApOwogIGVxKGN1clIuYm90dG9tLCBjdXIxLmJvdHRvbSk7CiAgY20ucmVwbGFjZVJhbmdlKCIiLCBQb3MoMCwgOSksIFBvcygwKSk7CiAgY3VyUiA9IGNtLmN1cnNvckNvb3JkcyhQb3MoMCwgOSkpOwogIGlmIChwaGFudG9tKSByZXR1cm47CiAgZXEoY3VyUi50b3AsIGN1cjEudG9wKTsKICBlcShjdXJSLmJvdHRvbSwgY3VyMS5ib3R0b20pOwp9LCB7dmFsdWU6ICIxIDIgMyB4eHggNCIsIGxpbmVXcmFwcGluZzogdHJ1ZX0pOwoKdGVzdENNKCJzaG93RW1wdHlXaWRnZXRTcGFuIiwgZnVuY3Rpb24oY20pIHsKICB2YXIgbWFya2VyID0gY20ubWFya1RleHQoUG9zKDAsIDIpLCBQb3MoMCwgMiksIHsKICAgIGNsZWFyV2hlbkVtcHR5OiBmYWxzZSwKICAgIHJlcGxhY2VkV2l0aDogZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoIlgiKQogIH0pOwogIGVxKGNtLmRpc3BsYXkudmlld1swXS50ZXh0LnRleHRDb250ZW50LCAiYWJYYyIpOwp9LCB7dmFsdWU6ICJhYmMifSk7Cgp0ZXN0Q00oImNoYW5nZWRJbmxpbmVXaWRnZXQiLCBmdW5jdGlvbihjbSkgewogIGNtLnNldFNpemUoIjEwZW0iKTsKICB2YXIgdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoInNwYW4iKTsKICB3LmlubmVySFRNTCA9ICJ4IjsKICB2YXIgbSA9IGNtLm1hcmtUZXh0KFBvcygwLCA0KSwgUG9zKDAsIDUpLCB7cmVwbGFjZWRXaXRoOiB3fSk7CiAgdy5pbm5lckhUTUwgPSAiYW5kIG5vdyB0aGUgd2lkZ2V0IGlzIHJlYWxseSByZWFsbHkgbG9uZyBhbGwgb2YgYSBzdWRkZW4gYW5kIGEgc2Nyb2xsYmFyIGlzIG5lZWRlZCI7CiAgbS5jaGFuZ2VkKCk7CiAgdmFyIGhTY3JvbGwgPSBieUNsYXNzTmFtZShjbS5nZXRXcmFwcGVyRWxlbWVudCgpLCAiQ29kZU1pcnJvci1oc2Nyb2xsYmFyIilbMF07CiAgaXMoaFNjcm9sbC5zY3JvbGxXaWR0aCA+IGhTY3JvbGwuY2xpZW50V2lkdGgpOwp9LCB7dmFsdWU6ICJoZWxsbyB0aGVyZSJ9KTsKCnRlc3RDTSgiY2hhbmdlZEJvb2ttYXJrIiwgZnVuY3Rpb24oY20pIHsKICBjbS5zZXRTaXplKCIxMGVtIik7CiAgdmFyIHcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzcGFuIik7CiAgdy5pbm5lckhUTUwgPSAieCI7CiAgdmFyIG0gPSBjbS5zZXRCb29rbWFyayhQb3MoMCwgNCksIHt3aWRnZXQ6IHd9KTsKICB3LmlubmVySFRNTCA9ICJhbmQgbm93IHRoZSB3aWRnZXQgaXMgcmVhbGx5IHJlYWxseSBsb25nIGFsbCBvZiBhIHN1ZGRlbiBhbmQgYSBzY3JvbGxiYXIgaXMgbmVlZGVkIjsKICBtLmNoYW5nZWQoKTsKICB2YXIgaFNjcm9sbCA9IGJ5Q2xhc3NOYW1lKGNtLmdldFdyYXBwZXJFbGVtZW50KCksICJDb2RlTWlycm9yLWhzY3JvbGxiYXIiKVswXTsKICBpcyhoU2Nyb2xsLnNjcm9sbFdpZHRoID4gaFNjcm9sbC5jbGllbnRXaWR0aCk7Cn0sIHt2YWx1ZTogImFiY2RlZmcifSk7Cgp0ZXN0Q00oImlubGluZVdpZGdldCIsIGZ1bmN0aW9uKGNtKSB7CiAgdmFyIHcgPSBjbS5zZXRCb29rbWFyayhQb3MoMCwgMiksIHt3aWRnZXQ6IGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCJ1dSIpfSk7CiAgY20uc2V0Q3Vyc29yKDAsIDIpOwogIENvZGVNaXJyb3IuY29tbWFuZHMuZ29MaW5lRG93bihjbSk7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygxLCA0KSk7CiAgY20uc2V0Q3Vyc29yKDAsIDIpOwogIGNtLnJlcGxhY2VTZWxlY3Rpb24oImhpIik7CiAgZXFQb3Mody5maW5kKCksIFBvcygwLCAyKSk7CiAgY20uc2V0Q3Vyc29yKDAsIDEpOwogIGNtLnJlcGxhY2VTZWxlY3Rpb24oImF5Iik7CiAgZXFQb3Mody5maW5kKCksIFBvcygwLCA0KSk7CiAgZXEoY20uZ2V0TGluZSgwKSwgInVheXVoaXV1Iik7Cn0sIHt2YWx1ZTogInV1dXVcbnV1dXV1dSJ9KTsKCnRlc3RDTSgid3JhcHBpbmdBbmRSZXNpemluZyIsIGZ1bmN0aW9uKGNtKSB7CiAgY20uc2V0U2l6ZShudWxsLCAiYXV0byIpOwogIGNtLnNldE9wdGlvbigibGluZVdyYXBwaW5nIiwgdHJ1ZSk7CiAgdmFyIHdyYXAgPSBjbS5nZXRXcmFwcGVyRWxlbWVudCgpLCBoMCA9IHdyYXAub2Zmc2V0SGVpZ2h0OwogIHZhciBkb2MgPSAieHh4IHh4eCB4eHggeHh4IHh4eCI7CiAgY20uc2V0VmFsdWUoZG9jKTsKICBmb3IgKHZhciBzdGVwID0gMTAsIHcgPSBjbS5jaGFyQ29vcmRzKFBvcygwLCAxOCksICJkaXYiKS5yaWdodDs7IHcgKz0gc3RlcCkgewogICAgY20uc2V0U2l6ZSh3KTsKICAgIGlmICh3cmFwLm9mZnNldEhlaWdodCA8PSBoMCAqIChvcGVyYV9sdDEwID8gMS4yIDogMS41KSkgewogICAgICBpZiAoc3RlcCA9PSAxMCkgeyB3IC09IDEwOyBzdGVwID0gMTsgfQogICAgICBlbHNlIGJyZWFrOwogICAgfQogIH0KICAvLyBFbnN1cmUgdGhhdCBwdXR0aW5nIHRoZSBjdXJzb3IgYXQgdGhlIGVuZCBvZiB0aGUgbWF4aW1hbGx5IGxvbmcKICAvLyBsaW5lIGRvZXNuJ3QgY2F1c2Ugd3JhcHBpbmcgdG8gaGFwcGVuLgogIGNtLnNldEN1cnNvcihQb3MoMCwgZG9jLmxlbmd0aCkpOwogIGVxKHdyYXAub2Zmc2V0SGVpZ2h0LCBoMCk7CiAgY20ucmVwbGFjZVNlbGVjdGlvbigieCIpOwogIGlzKHdyYXAub2Zmc2V0SGVpZ2h0ID4gaDAsICJ3cmFwcGluZyBoYXBwZW5zIik7CiAgLy8gTm93IGFkZCBhIG1heC1oZWlnaHQgYW5kLCBpbiBhIGRvY3VtZW50IGNvbnNpc3Rpbmcgb2YKICAvLyBhbG1vc3Qtd3JhcHBlZCBsaW5lcywgZ28gb3ZlciBpdCBzbyB0aGF0IGEgc2Nyb2xsYmFyIGFwcGVhcnMuCiAgY20uc2V0VmFsdWUoZG9jICsgIlxuIiArIGRvYyArICJcbiIpOwogIGNtLmdldFNjcm9sbGVyRWxlbWVudCgpLnN0eWxlLm1heEhlaWdodCA9ICIxMDBweCI7CiAgY20ucmVwbGFjZVJhbmdlKCJcblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cbiFcbiIsIFBvcygyLCAwKSk7CiAgZm9yRWFjaChbUG9zKDAsIGRvYy5sZW5ndGgpLCBQb3MoMCwgZG9jLmxlbmd0aCAtIDEpLAogICAgICAgICAgIFBvcygwLCAwKSwgUG9zKDEsIGRvYy5sZW5ndGgpLCBQb3MoMSwgZG9jLmxlbmd0aCAtIDEpXSwKICAgICAgICAgIGZ1bmN0aW9uKHBvcykgewogICAgdmFyIGNvb3JkcyA9IGNtLmNoYXJDb29yZHMocG9zKTsKICAgIGVxUG9zKHBvcywgY20uY29vcmRzQ2hhcih7bGVmdDogY29vcmRzLmxlZnQgKyAyLCB0b3A6IGNvb3Jkcy50b3AgKyA1fSkpOwogIH0pOwp9LCBudWxsLCBpZV9sdDgpOwoKdGVzdENNKCJtZWFzdXJlRW5kT2ZMaW5lIiwgZnVuY3Rpb24oY20pIHsKICBpZiAocGhhbnRvbSkgcmV0dXJuOwogIGNtLnNldFNpemUobnVsbCwgImF1dG8iKTsKICB2YXIgaW5uZXIgPSBieUNsYXNzTmFtZShjbS5nZXRXcmFwcGVyRWxlbWVudCgpLCAiQ29kZU1pcnJvci1saW5lcyIpWzBdLmZpcnN0Q2hpbGQ7CiAgdmFyIGxoID0gaW5uZXIub2Zmc2V0SGVpZ2h0OwogIGZvciAodmFyIHN0ZXAgPSAxMCwgdyA9IGNtLmNoYXJDb29yZHMoUG9zKDAsIDcpLCAiZGl2IikucmlnaHQ7OyB3ICs9IHN0ZXApIHsKICAgIGNtLnNldFNpemUodyk7CiAgICBpZiAoaW5uZXIub2Zmc2V0SGVpZ2h0IDwgMi41ICogbGgpIHsKICAgICAgaWYgKHN0ZXAgPT0gMTApIHsgdyAtPSAxMDsgc3RlcCA9IDE7IH0KICAgICAgZWxzZSBicmVhazsKICAgIH0KICB9CiAgY20uc2V0VmFsdWUoY20uZ2V0VmFsdWUoKSArICJcblxuIik7CiAgdmFyIGVuZFBvcyA9IGNtLmNoYXJDb29yZHMoUG9zKDAsIDE4KSwgImxvY2FsIik7CiAgaXMoZW5kUG9zLnRvcCA+IGxoICogLjgsICJub3QgYXQgdG9wIik7CiAgaXMoZW5kUG9zLmxlZnQgPiB3IC0gMjAsICJub3QgYXQgcmlnaHQiKTsKICBlbmRQb3MgPSBjbS5jaGFyQ29vcmRzKFBvcygwLCAxOCkpOwogIGVxUG9zKGNtLmNvb3Jkc0NoYXIoe2xlZnQ6IGVuZFBvcy5sZWZ0LCB0b3A6IGVuZFBvcy50b3AgKyA1fSksIFBvcygwLCAxOCkpOwp9LCB7bW9kZTogInRleHQvaHRtbCIsIHZhbHVlOiAiPCEtLSBmb28gYmFycnIgLS0+IiwgbGluZVdyYXBwaW5nOiB0cnVlfSwgaWVfbHQ4IHx8IG9wZXJhX2x0MTApOwoKdGVzdENNKCJtZWFzdXJlV3JhcHBlZEVuZE9mTGluZSIsIGZ1bmN0aW9uKGNtKSB7CiAgaWYgKHBoYW50b20pIHJldHVybjsKICBjbS5zZXRTaXplKG51bGwsICJhdXRvIik7CiAgdmFyIGlubmVyID0gYnlDbGFzc05hbWUoY20uZ2V0V3JhcHBlckVsZW1lbnQoKSwgIkNvZGVNaXJyb3ItbGluZXMiKVswXS5maXJzdENoaWxkOwogIHZhciBsaCA9IGlubmVyLm9mZnNldEhlaWdodDsKICBmb3IgKHZhciBzdGVwID0gMTAsIHcgPSBjbS5jaGFyQ29vcmRzKFBvcygwLCA3KSwgImRpdiIpLnJpZ2h0OzsgdyArPSBzdGVwKSB7CiAgICBjbS5zZXRTaXplKHcpOwogICAgaWYgKGlubmVyLm9mZnNldEhlaWdodCA8IDIuNSAqIGxoKSB7CiAgICAgIGlmIChzdGVwID09IDEwKSB7IHcgLT0gMTA7IHN0ZXAgPSAxOyB9CiAgICAgIGVsc2UgYnJlYWs7CiAgICB9CiAgfQogIHZhciBlbmRQb3MgPSBjbS5jaGFyQ29vcmRzKFBvcygwLCAxMikpOyAvLyBOZXh0LXRvLWxhc3Qgc2luY2UgbGFzdCB3b3VsZCB3cmFwICgjMTg2MikKICBlbmRQb3MubGVmdCArPSB3OyAvLyBBZGQgd2lkdGggb2YgZWRpdG9yIGp1c3QgdG8gYmUgc3VyZSB0aGF0IHdlIGFyZSBiZWhpbmQgbGFzdCBjaGFyYWN0ZXIKICBlcVBvcyhjbS5jb29yZHNDaGFyKGVuZFBvcyksIFBvcygwLCAxMykpOwp9LCB7bW9kZTogInRleHQvaHRtbCIsIHZhbHVlOiAiMDEyMzQ1Njc4OWFiY2RlMDEyMzQ1Njc4OSIsIGxpbmVXcmFwcGluZzogdHJ1ZX0sIGllX2x0OCB8fCBvcGVyYV9sdDEwKTsKCnRlc3RDTSgic2Nyb2xsVmVydGljYWxseUFuZEhvcml6b250YWxseSIsIGZ1bmN0aW9uKGNtKSB7CiAgaWYgKGNtLmdldE9wdGlvbigiaW5wdXRTdHlsZSIpICE9ICJ0ZXh0YXJlYSIpIHJldHVybjsKICBjbS5zZXRTaXplKDEwMCwgMTAwKTsKICBhZGREb2MoY20sIDQwLCA0MCk7CiAgY20uc2V0Q3Vyc29yKDM5KTsKICB2YXIgd3JhcCA9IGNtLmdldFdyYXBwZXJFbGVtZW50KCksIGJhciA9IGJ5Q2xhc3NOYW1lKHdyYXAsICJDb2RlTWlycm9yLXZzY3JvbGxiYXIiKVswXTsKICBpcyhiYXIub2Zmc2V0SGVpZ2h0IDwgd3JhcC5vZmZzZXRIZWlnaHQsICJ2ZXJ0aWNhbCBzY3JvbGxiYXIgbGltaXRlZCBieSBob3Jpem9udGFsIG9uZSIpOwogIHZhciBjdXJzb3JCb3ggPSBieUNsYXNzTmFtZSh3cmFwLCAiQ29kZU1pcnJvci1jdXJzb3IiKVswXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICB2YXIgZWRpdG9yQm94ID0gd3JhcC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICBpcyhjdXJzb3JCb3guYm90dG9tIDwgZWRpdG9yQm94LnRvcCArIGNtLmdldFNjcm9sbGVyRWxlbWVudCgpLmNsaWVudEhlaWdodCwKICAgICAiYm90dG9tIGxpbmUgdmlzaWJsZSIpOwp9LCB7bGluZU51bWJlcnM6IHRydWV9KTsKCnRlc3RDTSgibW92ZVZzdHVjayIsIGZ1bmN0aW9uKGNtKSB7CiAgdmFyIGxpbmVzID0gYnlDbGFzc05hbWUoY20uZ2V0V3JhcHBlckVsZW1lbnQoKSwgIkNvZGVNaXJyb3ItbGluZXMiKVswXS5maXJzdENoaWxkLCBoMCA9IGxpbmVzLm9mZnNldEhlaWdodDsKICB2YXIgdmFsID0gImZvb29vb29vb29vb29vb29vb29vb29vb29vIGJhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFyXG4iOwogIGNtLnNldFZhbHVlKHZhbCk7CiAgZm9yICh2YXIgdyA9IGNtLmNoYXJDb29yZHMoUG9zKDAsIDI2KSwgImRpdiIpLnJpZ2h0ICogMi44OzsgdyArPSA1KSB7CiAgICBjbS5zZXRTaXplKHcpOwogICAgaWYgKGxpbmVzLm9mZnNldEhlaWdodCA8PSAzLjUgKiBoMCkgYnJlYWs7CiAgfQogIGNtLnNldEN1cnNvcihQb3MoMCwgdmFsLmxlbmd0aCAtIDEpKTsKICBjbS5tb3ZlVigtMSwgImxpbmUiKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDAsIDI2KSk7Cn0sIHtsaW5lV3JhcHBpbmc6IHRydWV9LCBpZV9sdDggfHwgb3BlcmFfbHQxMCk7Cgp0ZXN0Q00oImNvbGxhcHNlT25Nb3ZlIiwgZnVuY3Rpb24oY20pIHsKICBjbS5zZXRTZWxlY3Rpb24oUG9zKDAsIDEpLCBQb3MoMiwgNCkpOwogIGNtLmV4ZWNDb21tYW5kKCJnb0xpbmVVcCIpOwogIGlzKCFjbS5zb21ldGhpbmdTZWxlY3RlZCgpKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDAsIDEpKTsKICBjbS5zZXRTZWxlY3Rpb24oUG9zKDAsIDEpLCBQb3MoMiwgNCkpOwogIGNtLmV4ZWNDb21tYW5kKCJnb1BhZ2VEb3duIik7CiAgaXMoIWNtLnNvbWV0aGluZ1NlbGVjdGVkKCkpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoMiwgNCkpOwogIGNtLmV4ZWNDb21tYW5kKCJnb0xpbmVVcCIpOwogIGNtLmV4ZWNDb21tYW5kKCJnb0xpbmVVcCIpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoMCwgNCkpOwogIGNtLnNldFNlbGVjdGlvbihQb3MoMCwgMSksIFBvcygyLCA0KSk7CiAgY20uZXhlY0NvbW1hbmQoImdvQ2hhckxlZnQiKTsKICBpcyghY20uc29tZXRoaW5nU2VsZWN0ZWQoKSk7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygwLCAxKSk7Cn0sIHt2YWx1ZTogImFhYWFhXG5iXG5jY2NjYyJ9KTsKCnRlc3RDTSgiY2xpY2tUYWIiLCBmdW5jdGlvbihjbSkgewogIHZhciBwMCA9IGNtLmNoYXJDb29yZHMoUG9zKDAsIDApKTsKICBlcVBvcyhjbS5jb29yZHNDaGFyKHtsZWZ0OiBwMC5sZWZ0ICsgNSwgdG9wOiBwMC50b3AgKyA1fSksIFBvcygwLCAwKSk7CiAgZXFQb3MoY20uY29vcmRzQ2hhcih7bGVmdDogcDAucmlnaHQgLSA1LCB0b3A6IHAwLnRvcCArIDV9KSwgUG9zKDAsIDEpKTsKfSwge3ZhbHVlOiAiXHRcblxuIiwgbGluZVdyYXBwaW5nOiB0cnVlLCB0YWJTaXplOiA4fSk7Cgp0ZXN0Q00oInZlcnRpY2FsU2Nyb2xsIiwgZnVuY3Rpb24oY20pIHsKICBjbS5zZXRTaXplKDEwMCwgMjAwKTsKICBjbS5zZXRWYWx1ZSgiZm9vXG5iYXJcbmJhelxuIik7CiAgdmFyIHNjID0gY20uZ2V0U2Nyb2xsZXJFbGVtZW50KCksIGJhc2VXaWR0aCA9IHNjLnNjcm9sbFdpZHRoOwogIGNtLnJlcGxhY2VSYW5nZSgiYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhaCIsIFBvcygwLCAwKSwgUG9zKDApKTsKICBpcyhzYy5zY3JvbGxXaWR0aCA+IGJhc2VXaWR0aCwgInNjcm9sbGJhciBwcmVzZW50Iik7CiAgY20ucmVwbGFjZVJhbmdlKCJmb28iLCBQb3MoMCwgMCksIFBvcygwKSk7CiAgaWYgKCFwaGFudG9tKSBlcShzYy5zY3JvbGxXaWR0aCwgYmFzZVdpZHRoLCAic2Nyb2xsYmFyIGdvbmUiKTsKICBjbS5yZXBsYWNlUmFuZ2UoImFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWgiLCBQb3MoMCwgMCksIFBvcygwKSk7CiAgY20ucmVwbGFjZVJhbmdlKCJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmgiLCBQb3MoMSwgMCksIFBvcygxKSk7CiAgaXMoc2Muc2Nyb2xsV2lkdGggPiBiYXNlV2lkdGgsICJwcmVzZW50IGFnYWluIik7CiAgdmFyIGN1cldpZHRoID0gc2Muc2Nyb2xsV2lkdGg7CiAgY20ucmVwbGFjZVJhbmdlKCJmb28iLCBQb3MoMCwgMCksIFBvcygwKSk7CiAgaXMoc2Muc2Nyb2xsV2lkdGggPCBjdXJXaWR0aCwgInNjcm9sbGJhciBzbWFsbGVyIik7CiAgaXMoc2Muc2Nyb2xsV2lkdGggPiBiYXNlV2lkdGgsICJidXQgc3RpbGwgcHJlc2VudCIpOwp9KTsKCnRlc3RDTSgiZXh0cmFLZXlzIiwgZnVuY3Rpb24oY20pIHsKICB2YXIgb3V0Y29tZTsKICBmdW5jdGlvbiBmYWtlS2V5KGV4cGVjdGVkLCBjb2RlLCBwcm9wcykgewogICAgaWYgKHR5cGVvZiBjb2RlID09ICJzdHJpbmciKSBjb2RlID0gY29kZS5jaGFyQ29kZUF0KDApOwogICAgdmFyIGUgPSB7dHlwZTogImtleWRvd24iLCBrZXlDb2RlOiBjb2RlLCBwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24oKXt9LCBzdG9wUHJvcGFnYXRpb246IGZ1bmN0aW9uKCl7fX07CiAgICBpZiAocHJvcHMpIGZvciAodmFyIG4gaW4gcHJvcHMpIGVbbl0gPSBwcm9wc1tuXTsKICAgIG91dGNvbWUgPSBudWxsOwogICAgY20udHJpZ2dlck9uS2V5RG93bihlKTsKICAgIGVxKG91dGNvbWUsIGV4cGVjdGVkKTsKICB9CiAgQ29kZU1pcnJvci5jb21tYW5kcy50ZXN0Q29tbWFuZCA9IGZ1bmN0aW9uKCkge291dGNvbWUgPSAidGMiO307CiAgQ29kZU1pcnJvci5jb21tYW5kcy5nb1Rlc3RDb21tYW5kID0gZnVuY3Rpb24oKSB7b3V0Y29tZSA9ICJndGMiO307CiAgY20uc2V0T3B0aW9uKCJleHRyYUtleXMiLCB7IlNoaWZ0LVgiOiBmdW5jdGlvbigpIHtvdXRjb21lID0gInN4Ijt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJYIjogZnVuY3Rpb24oKSB7b3V0Y29tZSA9ICJ4Ijt9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDdHJsLUFsdC1VIjogZnVuY3Rpb24oKSB7b3V0Y29tZSA9ICJjYXUiO30sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVuZCI6ICJ0ZXN0Q29tbWFuZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhvbWUiOiAiZ29UZXN0Q29tbWFuZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRhYiI6IGZhbHNlfSk7CiAgZmFrZUtleShudWxsLCAiVSIpOwogIGZha2VLZXkoImNhdSIsICJVIiwge2N0cmxLZXk6IHRydWUsIGFsdEtleTogdHJ1ZX0pOwogIGZha2VLZXkobnVsbCwgIlUiLCB7c2hpZnRLZXk6IHRydWUsIGN0cmxLZXk6IHRydWUsIGFsdEtleTogdHJ1ZX0pOwogIGZha2VLZXkoIngiLCAiWCIpOwogIGZha2VLZXkoInN4IiwgIlgiLCB7c2hpZnRLZXk6IHRydWV9KTsKICBmYWtlS2V5KCJ0YyIsIDM1KTsKICBmYWtlS2V5KG51bGwsIDM1LCB7c2hpZnRLZXk6IHRydWV9KTsKICBmYWtlS2V5KCJndGMiLCAzNik7CiAgZmFrZUtleSgiZ3RjIiwgMzYsIHtzaGlmdEtleTogdHJ1ZX0pOwogIGZha2VLZXkobnVsbCwgOSk7Cn0sIG51bGwsIHdpbmRvdy5vcGVyYSAmJiBtYWMpOwoKdGVzdENNKCJ3b3JkTW92ZW1lbnRDb21tYW5kcyIsIGZ1bmN0aW9uKGNtKSB7CiAgY20uZXhlY0NvbW1hbmQoImdvV29yZExlZnQiKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDAsIDApKTsKICBjbS5leGVjQ29tbWFuZCgiZ29Xb3JkUmlnaHQiKTsgY20uZXhlY0NvbW1hbmQoImdvV29yZFJpZ2h0Iik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygwLCA3KSk7CiAgY20uZXhlY0NvbW1hbmQoImdvV29yZExlZnQiKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDAsIDUpKTsKICBjbS5leGVjQ29tbWFuZCgiZ29Xb3JkUmlnaHQiKTsgY20uZXhlY0NvbW1hbmQoImdvV29yZFJpZ2h0Iik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygwLCAxMikpOwogIGNtLmV4ZWNDb21tYW5kKCJnb1dvcmRMZWZ0Iik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygwLCA5KSk7CiAgY20uZXhlY0NvbW1hbmQoImdvV29yZFJpZ2h0Iik7IGNtLmV4ZWNDb21tYW5kKCJnb1dvcmRSaWdodCIpOyBjbS5leGVjQ29tbWFuZCgiZ29Xb3JkUmlnaHQiKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDAsIDI0KSk7CiAgY20uZXhlY0NvbW1hbmQoImdvV29yZFJpZ2h0Iik7IGNtLmV4ZWNDb21tYW5kKCJnb1dvcmRSaWdodCIpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoMSwgOSkpOwogIGNtLmV4ZWNDb21tYW5kKCJnb1dvcmRSaWdodCIpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoMSwgMTMpKTsKICBjbS5leGVjQ29tbWFuZCgiZ29Xb3JkUmlnaHQiKTsgY20uZXhlY0NvbW1hbmQoImdvV29yZFJpZ2h0Iik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygyLCAwKSk7Cn0sIHt2YWx1ZTogInRoaXMgaXMgKHRoZSkgZmlyc3RsaW5lLlxuYSBmb28xMlx1MDBlOVx1MDBmOFx1MDBkN2JhclxuIn0pOwoKdGVzdENNKCJncm91cE1vdmVtZW50Q29tbWFuZHMiLCBmdW5jdGlvbihjbSkgewogIGNtLmV4ZWNDb21tYW5kKCJnb0dyb3VwTGVmdCIpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoMCwgMCkpOwogIGNtLmV4ZWNDb21tYW5kKCJnb0dyb3VwUmlnaHQiKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDAsIDQpKTsKICBjbS5leGVjQ29tbWFuZCgiZ29Hcm91cFJpZ2h0Iik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygwLCA3KSk7CiAgY20uZXhlY0NvbW1hbmQoImdvR3JvdXBSaWdodCIpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoMCwgMTApKTsKICBjbS5leGVjQ29tbWFuZCgiZ29Hcm91cExlZnQiKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDAsIDcpKTsKICBjbS5leGVjQ29tbWFuZCgiZ29Hcm91cFJpZ2h0Iik7IGNtLmV4ZWNDb21tYW5kKCJnb0dyb3VwUmlnaHQiKTsgY20uZXhlY0NvbW1hbmQoImdvR3JvdXBSaWdodCIpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoMCwgMTUpKTsKICBjbS5zZXRDdXJzb3IoUG9zKDAsIDE3KSk7CiAgY20uZXhlY0NvbW1hbmQoImdvR3JvdXBMZWZ0Iik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygwLCAxNikpOwogIGNtLmV4ZWNDb21tYW5kKCJnb0dyb3VwTGVmdCIpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoMCwgMTQpKTsKICBjbS5leGVjQ29tbWFuZCgiZ29Hcm91cFJpZ2h0Iik7IGNtLmV4ZWNDb21tYW5kKCJnb0dyb3VwUmlnaHQiKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDAsIDIwKSk7CiAgY20uZXhlY0NvbW1hbmQoImdvR3JvdXBSaWdodCIpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoMSwgMCkpOwogIGNtLmV4ZWNDb21tYW5kKCJnb0dyb3VwUmlnaHQiKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDEsIDIpKTsKICBjbS5leGVjQ29tbWFuZCgiZ29Hcm91cFJpZ2h0Iik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygxLCA1KSk7CiAgY20uZXhlY0NvbW1hbmQoImdvR3JvdXBMZWZ0Iik7IGNtLmV4ZWNDb21tYW5kKCJnb0dyb3VwTGVmdCIpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoMSwgMCkpOwogIGNtLmV4ZWNDb21tYW5kKCJnb0dyb3VwTGVmdCIpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoMCwgMjApKTsKICBjbS5leGVjQ29tbWFuZCgiZ29Hcm91cExlZnQiKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDAsIDE2KSk7Cn0sIHt2YWx1ZTogImJvb28gYmEtLS1xdXV4LiBmZmZmXG4gIGFiYyBkIn0pOwoKdGVzdENNKCJncm91cHNBbmRXaGl0ZXNwYWNlIiwgZnVuY3Rpb24oY20pIHsKICB2YXIgcG9zaXRpb25zID0gW1BvcygwLCAwKSwgUG9zKDAsIDIpLCBQb3MoMCwgNSksIFBvcygwLCA5KSwgUG9zKDAsIDExKSwKICAgICAgICAgICAgICAgICAgIFBvcygxLCAwKSwgUG9zKDEsIDIpLCBQb3MoMSwgNSldOwogIGZvciAodmFyIGkgPSAxOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7CiAgICBjbS5leGVjQ29tbWFuZCgiZ29Hcm91cFJpZ2h0Iik7CiAgICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgcG9zaXRpb25zW2ldKTsKICB9CiAgZm9yICh2YXIgaSA9IHBvc2l0aW9ucy5sZW5ndGggLSAyOyBpID49IDA7IGktLSkgewogICAgY20uZXhlY0NvbW1hbmQoImdvR3JvdXBMZWZ0Iik7CiAgICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgaSA9PSAyID8gUG9zKDAsIDYpIDogcG9zaXRpb25zW2ldKTsKICB9Cn0sIHt2YWx1ZTogIiAgZm9vICsrKyAgXG4gIGJhciJ9KTsKCnRlc3RDTSgiY2hhck1vdmVtZW50Q29tbWFuZHMiLCBmdW5jdGlvbihjbSkgewogIGNtLmV4ZWNDb21tYW5kKCJnb0NoYXJMZWZ0Iik7IGNtLmV4ZWNDb21tYW5kKCJnb0NvbHVtbkxlZnQiKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDAsIDApKTsKICBjbS5leGVjQ29tbWFuZCgiZ29DaGFyUmlnaHQiKTsgY20uZXhlY0NvbW1hbmQoImdvQ2hhclJpZ2h0Iik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygwLCAyKSk7CiAgY20uc2V0Q3Vyc29yKFBvcygxLCAwKSk7CiAgY20uZXhlY0NvbW1hbmQoImdvQ29sdW1uTGVmdCIpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoMSwgMCkpOwogIGNtLmV4ZWNDb21tYW5kKCJnb0NoYXJMZWZ0Iik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygwLCA1KSk7CiAgY20uZXhlY0NvbW1hbmQoImdvQ29sdW1uUmlnaHQiKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDAsIDUpKTsKICBjbS5leGVjQ29tbWFuZCgiZ29DaGFyUmlnaHQiKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDEsIDApKTsKICBjbS5leGVjQ29tbWFuZCgiZ29MaW5lRW5kIik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygxLCA1KSk7CiAgY20uZXhlY0NvbW1hbmQoImdvTGluZVN0YXJ0U21hcnQiKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDEsIDEpKTsKICBjbS5leGVjQ29tbWFuZCgiZ29MaW5lU3RhcnRTbWFydCIpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoMSwgMCkpOwogIGNtLnNldEN1cnNvcihQb3MoMiwgMCkpOwogIGNtLmV4ZWNDb21tYW5kKCJnb0NoYXJSaWdodCIpOyBjbS5leGVjQ29tbWFuZCgiZ29Db2x1bW5SaWdodCIpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoMiwgMCkpOwp9LCB7dmFsdWU6ICJsaW5lMVxuIGluZTJcbiJ9KTsKCnRlc3RDTSgidmVydGljYWxNb3ZlbWVudENvbW1hbmRzIiwgZnVuY3Rpb24oY20pIHsKICBjbS5leGVjQ29tbWFuZCgiZ29MaW5lVXAiKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDAsIDApKTsKICBjbS5leGVjQ29tbWFuZCgiZ29MaW5lRG93biIpOwogIGlmICghcGhhbnRvbSkgLy8gVGhpcyBmYWlscyBpbiBQaGFudG9tSlMsIHRob3VnaCBub3QgaW4gYSByZWFsIFdlYmtpdAogICAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygxLCAwKSk7CiAgY20uc2V0Q3Vyc29yKFBvcygxLCAxMikpOwogIGNtLmV4ZWNDb21tYW5kKCJnb0xpbmVEb3duIik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygyLCA1KSk7CiAgY20uZXhlY0NvbW1hbmQoImdvTGluZURvd24iKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDMsIDApKTsKICBjbS5leGVjQ29tbWFuZCgiZ29MaW5lVXAiKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDIsIDUpKTsKICBjbS5leGVjQ29tbWFuZCgiZ29MaW5lVXAiKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDEsIDEyKSk7CiAgY20uZXhlY0NvbW1hbmQoImdvUGFnZURvd24iKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDUsIDApKTsKICBjbS5leGVjQ29tbWFuZCgiZ29QYWdlRG93biIpOyBjbS5leGVjQ29tbWFuZCgiZ29MaW5lRG93biIpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoNSwgMCkpOwogIGNtLmV4ZWNDb21tYW5kKCJnb1BhZ2VVcCIpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoMCwgMCkpOwp9LCB7dmFsdWU6ICJsaW5lMVxubG9uZyBsb25nIGxpbmUyXG5saW5lM1xuXG5saW5lNVxuIn0pOwoKdGVzdENNKCJ2ZXJ0aWNhbE1vdmVtZW50Q29tbWFuZHNXcmFwcGluZyIsIGZ1bmN0aW9uKGNtKSB7CiAgY20uc2V0U2l6ZSgxMjApOwogIGNtLnNldEN1cnNvcihQb3MoMCwgNSkpOwogIGNtLmV4ZWNDb21tYW5kKCJnb0xpbmVEb3duIik7CiAgZXEoY20uZ2V0Q3Vyc29yKCkubGluZSwgMCk7CiAgaXMoY20uZ2V0Q3Vyc29yKCkuY2ggPiA1LCAibW92ZWQgYmV5b25kIHdyYXAiKTsKICBmb3IgKHZhciBpID0gMDsgOyArK2kpIHsKICAgIGlzKGkgPCAyMCwgIm5vIGVuZGxlc3MgbG9vcCIpOwogICAgY20uZXhlY0NvbW1hbmQoImdvTGluZURvd24iKTsKICAgIHZhciBjdXIgPSBjbS5nZXRDdXJzb3IoKTsKICAgIGlmIChjdXIubGluZSA9PSAxKSBlcShjdXIuY2gsIDUpOwogICAgaWYgKGN1ci5saW5lID09IDIpIHsgZXEoY3VyLmNoLCAxKTsgYnJlYWs7IH0KICB9Cn0sIHt2YWx1ZTogImEgdmVyeSBsb25nIGxpbmUgdGhhdCB3cmFwcyBhcm91bmQgc29tZWhvdyBzbyB0aGF0IHdlIGNhbiB0ZXN0IGN1cnNvciBtb3ZlbWVudFxuc2hvcnRvbmVcbmsiLAogICAgbGluZVdyYXBwaW5nOiB0cnVlfSk7Cgp0ZXN0Q00oInZlcnRpY2FsTW92ZW1lbnRDb21tYW5kc1NpbmdsZUxpbmUiLCBmdW5jdGlvbihjbSkgewogIGNtLmRpc3BsYXkud3JhcHBlci5zdHlsZS5oZWlnaHQgPSAiYXV0byI7CiAgY20ucmVmcmVzaCgpOwogIGNtLmV4ZWNDb21tYW5kKCJnb0xpbmVVcCIpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoMCwgMCkpOwogIGNtLmV4ZWNDb21tYW5kKCJnb0xpbmVEb3duIik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygwLCAxMSkpOwogIGNtLnNldEN1cnNvcihQb3MoMCwgNSkpOwogIGNtLmV4ZWNDb21tYW5kKCJnb0xpbmVEb3duIik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygwLCAxMSkpOwogIGNtLmV4ZWNDb21tYW5kKCJnb0xpbmVEb3duIik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygwLCAxMSkpOwogIGNtLmV4ZWNDb21tYW5kKCJnb0xpbmVVcCIpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoMCwgMCkpOwogIGNtLmV4ZWNDb21tYW5kKCJnb0xpbmVVcCIpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoMCwgMCkpOwogIGNtLmV4ZWNDb21tYW5kKCJnb1BhZ2VEb3duIik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygwLCAxMSkpOwogIGNtLmV4ZWNDb21tYW5kKCJnb1BhZ2VEb3duIik7IGNtLmV4ZWNDb21tYW5kKCJnb0xpbmVEb3duIik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygwLCAxMSkpOwogIGNtLmV4ZWNDb21tYW5kKCJnb1BhZ2VVcCIpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoMCwgMCkpOwogIGNtLnNldEN1cnNvcihQb3MoMCwgNSkpOwogIGNtLmV4ZWNDb21tYW5kKCJnb1BhZ2VVcCIpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoMCwgMCkpOwogIGNtLnNldEN1cnNvcihQb3MoMCwgNSkpOwogIGNtLmV4ZWNDb21tYW5kKCJnb1BhZ2VEb3duIik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygwLCAxMSkpOwp9LCB7dmFsdWU6ICJzaW5nbGUgbGluZSJ9KTsKCgp0ZXN0Q00oInJ0bE1vdmVtZW50IiwgZnVuY3Rpb24oY20pIHsKICBpZiAoY20uZ2V0T3B0aW9uKCJpbnB1dFN0eWxlIikgIT0gInRleHRhcmVhIikgcmV0dXJuOwogIGZvckVhY2goWyLYrtit2KwiLCAi2K7YrWFiY9iu2K3YrCIsICJhYtiu2K3Yrtit2KxjZCIsICJhYtiuZGUiLCAiYWLYrtitMjM0MtiuMdit2KwiLCAi2K4x2K0y2K7YrTPYrXjYrCIsCiAgICAgICAgICAgItiu2K1jZCIsICIx2K7YrWNkIiwgImFiY2Rl2K0x2KwiLCAi2K7Zhdix2K3YqNmH2Kcg2YXZh9inISIsICJmb29iYXLYsSIsICLYriDYqSDZgiIsCiAgICAgICAgICAgIjxpbWcgc3JjPVwiL9eR15PXmden15QzLmpwZ1wiPiIsICLZitiq2YUg2KfZhNiz2K3YqCDZgdmKIDA1INmB2KjYsdin2YrYsSAyMDE0Il0sIGZ1bmN0aW9uKGxpbmUpIHsKICAgIHZhciBpbnYgPSBsaW5lLmNoYXJDb2RlQXQoMCkgPiAxMjg7CiAgICBjbS5zZXRWYWx1ZShsaW5lICsgIlxuIik7IGNtLmV4ZWNDb21tYW5kKGludiA/ICJnb0xpbmVFbmQiIDogImdvTGluZVN0YXJ0Iik7CiAgICB2YXIgY3Vyc29ycyA9IGJ5Q2xhc3NOYW1lKGNtLmdldFdyYXBwZXJFbGVtZW50KCksICJDb2RlTWlycm9yLWN1cnNvcnMiKVswXTsKICAgIHZhciBjdXJzb3IgPSBjdXJzb3JzLmZpcnN0Q2hpbGQ7CiAgICB2YXIgcHJldlggPSBjdXJzb3Iub2Zmc2V0TGVmdCwgcHJldlkgPSBjdXJzb3Iub2Zmc2V0VG9wOwogICAgZm9yICh2YXIgaSA9IDA7IGkgPD0gbGluZS5sZW5ndGg7ICsraSkgewogICAgICBjbS5leGVjQ29tbWFuZCgiZ29DaGFyUmlnaHQiKTsKICAgICAgY3Vyc29yID0gY3Vyc29ycy5maXJzdENoaWxkOwogICAgICBpZiAoaSA9PSBsaW5lLmxlbmd0aCkgaXMoY3Vyc29yLm9mZnNldFRvcCA+IHByZXZZLCAibmV4dCBsaW5lIik7CiAgICAgIGVsc2UgaXMoY3Vyc29yLm9mZnNldExlZnQgPiBwcmV2WCwgIm1vdmVkIHJpZ2h0Iik7CiAgICAgIHByZXZYID0gY3Vyc29yLm9mZnNldExlZnQ7IHByZXZZID0gY3Vyc29yLm9mZnNldFRvcDsKICAgIH0KICAgIGNtLnNldEN1cnNvcigwLCAwKTsgY20uZXhlY0NvbW1hbmQoaW52ID8gImdvTGluZVN0YXJ0IiA6ICJnb0xpbmVFbmQiKTsKICAgIHByZXZYID0gY3Vyc29ycy5maXJzdENoaWxkLm9mZnNldExlZnQ7CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbmUubGVuZ3RoOyArK2kpIHsKICAgICAgY20uZXhlY0NvbW1hbmQoImdvQ2hhckxlZnQiKTsKICAgICAgY3Vyc29yID0gY3Vyc29ycy5maXJzdENoaWxkOwogICAgICBpcyhjdXJzb3Iub2Zmc2V0TGVmdCA8IHByZXZYLCAibW92ZWQgbGVmdCIpOwogICAgICBwcmV2WCA9IGN1cnNvci5vZmZzZXRMZWZ0OwogICAgfQogIH0pOwp9LCBudWxsLCBpZV9sdDkpOwoKLy8gVmVyaWZ5IHRoYXQgdXBkYXRpbmcgYSBsaW5lIGNsZWFycyBpdHMgYmlkaSBvcmRlcmluZwp0ZXN0Q00oImJpZGlVcGRhdGUiLCBmdW5jdGlvbihjbSkgewogIGNtLnNldEN1cnNvcihQb3MoMCwgMikpOwogIGNtLnJlcGxhY2VTZWxlY3Rpb24oItiu2K3YrCIsICJzdGFydCIpOwogIGNtLmV4ZWNDb21tYW5kKCJnb0NoYXJSaWdodCIpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoMCwgNCkpOwp9LCB7dmFsdWU6ICJhYmNkXG4ifSk7Cgp0ZXN0Q00oIm1vdmVieVRleHRVbml0IiwgZnVuY3Rpb24oY20pIHsKICBjbS5zZXRWYWx1ZSgi15HWsNa816jWtdeQ16nWtFxuZcyBZcyBZcyBzIFcbiIpOwogIGNtLmV4ZWNDb21tYW5kKCJnb0xpbmVFbmQiKTsKICBmb3IgKHZhciBpID0gMDsgaSA8IDQ7ICsraSkgY20uZXhlY0NvbW1hbmQoImdvQ2hhclJpZ2h0Iik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygwLCAwKSk7CiAgY20uZXhlY0NvbW1hbmQoImdvQ2hhclJpZ2h0Iik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygxLCAwKSk7CiAgY20uZXhlY0NvbW1hbmQoImdvQ2hhclJpZ2h0Iik7CiAgY20uZXhlY0NvbW1hbmQoImdvQ2hhclJpZ2h0Iik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygxLCA0KSk7CiAgY20uZXhlY0NvbW1hbmQoImdvQ2hhclJpZ2h0Iik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygxLCA3KSk7Cn0pOwoKdGVzdENNKCJsaW5lQ2hhbmdlRXZlbnRzIiwgZnVuY3Rpb24oY20pIHsKICBhZGREb2MoY20sIDMsIDUpOwogIHZhciBsb2cgPSBbXSwgd2FudCA9IFsiY2ggMCIsICJjaCAxIiwgImRlbCAyIiwgImNoIDAiLCAiY2ggMCIsICJkZWwgMSIsICJkZWwgMyIsICJkZWwgNCJdOwogIGZvciAodmFyIGkgPSAwOyBpIDwgNTsgKytpKSB7CiAgICBDb2RlTWlycm9yLm9uKGNtLmdldExpbmVIYW5kbGUoaSksICJkZWxldGUiLCBmdW5jdGlvbihpKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtsb2cucHVzaCgiZGVsICIgKyBpKTt9OwogICAgfShpKSk7CiAgICBDb2RlTWlycm9yLm9uKGNtLmdldExpbmVIYW5kbGUoaSksICJjaGFuZ2UiLCBmdW5jdGlvbihpKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHtsb2cucHVzaCgiY2ggIiArIGkpO307CiAgICB9KGkpKTsKICB9CiAgY20ucmVwbGFjZVJhbmdlKCJ4IiwgUG9zKDAsIDEpKTsKICBjbS5yZXBsYWNlUmFuZ2UoInh5IiwgUG9zKDEsIDEpLCBQb3MoMikpOwogIGNtLnJlcGxhY2VSYW5nZSgiZm9vXG5iYXIiLCBQb3MoMCwgMSkpOwogIGNtLnJlcGxhY2VSYW5nZSgiIiwgUG9zKDAsIDApLCBQb3MoY20ubGluZUNvdW50KCkpKTsKICBlcShsb2cubGVuZ3RoLCB3YW50Lmxlbmd0aCwgInNhbWUgbGVuZ3RoIik7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsb2cubGVuZ3RoOyArK2kpCiAgICBlcShsb2dbaV0sIHdhbnRbaV0pOwp9KTsKCnRlc3RDTSgic2Nyb2xsRW50aXJlbHlUb1JpZ2h0IiwgZnVuY3Rpb24oY20pIHsKICBpZiAocGhhbnRvbSB8fCBjbS5nZXRPcHRpb24oImlucHV0U3R5bGUiKSAhPSAidGV4dGFyZWEiKSByZXR1cm47CiAgYWRkRG9jKGNtLCA1MDAsIDIpOwogIGNtLnNldEN1cnNvcihQb3MoMCwgNTAwKSk7CiAgdmFyIHdyYXAgPSBjbS5nZXRXcmFwcGVyRWxlbWVudCgpLCBjdXIgPSBieUNsYXNzTmFtZSh3cmFwLCAiQ29kZU1pcnJvci1jdXJzb3IiKVswXTsKICBpcyh3cmFwLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnJpZ2h0ID4gY3VyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmxlZnQpOwp9KTsKCnRlc3RDTSgibGluZVdpZGdldHMiLCBmdW5jdGlvbihjbSkgewogIGFkZERvYyhjbSwgNTAwLCAzKTsKICB2YXIgbGFzdCA9IGNtLmNoYXJDb29yZHMoUG9zKDIsIDApKTsKICB2YXIgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogIG5vZGUuaW5uZXJIVE1MID0gImhpIjsKICB2YXIgd2lkZ2V0ID0gY20uYWRkTGluZVdpZGdldCgxLCBub2RlKTsKICBpcyhsYXN0LnRvcCA8IGNtLmNoYXJDb29yZHMoUG9zKDIsIDApKS50b3AsICJ0b29rIHVwIHNwYWNlIik7CiAgY20uc2V0Q3Vyc29yKFBvcygxLCAxKSk7CiAgY20uZXhlY0NvbW1hbmQoImdvTGluZURvd24iKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDIsIDEpKTsKICBjbS5leGVjQ29tbWFuZCgiZ29MaW5lVXAiKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDEsIDEpKTsKfSk7Cgp0ZXN0Q00oImxpbmVXaWRnZXRGb2N1cyIsIGZ1bmN0aW9uKGNtKSB7CiAgdmFyIHBsYWNlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRlc3Rncm91bmQiKTsKICBwbGFjZS5jbGFzc05hbWUgPSAib2Zmc2NyZWVuIjsKICB0cnkgewogICAgYWRkRG9jKGNtLCA1MDAsIDEwKTsKICAgIHZhciBub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTsKICAgIHZhciB3aWRnZXQgPSBjbS5hZGRMaW5lV2lkZ2V0KDEsIG5vZGUpOwogICAgbm9kZS5mb2N1cygpOwogICAgZXEoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCwgbm9kZSk7CiAgICBjbS5yZXBsYWNlUmFuZ2UoIm5ldyBzdHVmZiIsIFBvcygxLCAwKSk7CiAgICBlcShkb2N1bWVudC5hY3RpdmVFbGVtZW50LCBub2RlKTsKICB9IGZpbmFsbHkgewogICAgcGxhY2UuY2xhc3NOYW1lID0gIiI7CiAgfQp9KTsKCnRlc3RDTSgibGluZVdpZGdldENhdXRpb3VzUmVkcmF3IiwgZnVuY3Rpb24oY20pIHsKICB2YXIgbm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpOwogIG5vZGUuaW5uZXJIVE1MID0gImhhaGFoIjsKICB2YXIgdyA9IGNtLmFkZExpbmVXaWRnZXQoMCwgbm9kZSk7CiAgdmFyIHJlZHJhd24gPSBmYWxzZTsKICB3Lm9uKCJyZWRyYXciLCBmdW5jdGlvbigpIHsgcmVkcmF3biA9IHRydWU7IH0pOwogIGNtLnJlcGxhY2VTZWxlY3Rpb24oIjAiKTsKICBpcyghcmVkcmF3bik7Cn0sIHt2YWx1ZTogIjEyM1xuNDU2In0pOwoKCnZhciBrbm93blNjcm9sbGJhcldpZHRoOwpmdW5jdGlvbiBzY3JvbGxiYXJXaWR0aChtZWFzdXJlKSB7CiAgaWYgKGtub3duU2Nyb2xsYmFyV2lkdGggIT0gbnVsbCkgcmV0dXJuIGtub3duU2Nyb2xsYmFyV2lkdGg7CiAgdmFyIGRpdiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogIGRpdi5zdHlsZS5jc3NUZXh0ID0gIndpZHRoOiA1MHB4OyBoZWlnaHQ6IDUwcHg7IG92ZXJmbG93LXg6IHNjcm9sbCI7CiAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkaXYpOwogIGtub3duU2Nyb2xsYmFyV2lkdGggPSBkaXYub2Zmc2V0SGVpZ2h0IC0gZGl2LmNsaWVudEhlaWdodDsKICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGRpdik7CiAgcmV0dXJuIGtub3duU2Nyb2xsYmFyV2lkdGggfHwgMDsKfQoKdGVzdENNKCJsaW5lV2lkZ2V0Q2hhbmdlZCIsIGZ1bmN0aW9uKGNtKSB7CiAgYWRkRG9jKGNtLCAyLCAzMDApOwogIHZhciBoYWxmU2Nyb2xsYmFyV2lkdGggPSBzY3JvbGxiYXJXaWR0aChjbS5kaXNwbGF5Lm1lYXN1cmUpLzI7CiAgY20uc2V0T3B0aW9uKCdsaW5lTnVtYmVycycsIHRydWUpOwogIGNtLnNldFNpemUoNjAwLCBjbS5kZWZhdWx0VGV4dEhlaWdodCgpICogNTApOwogIGNtLnNjcm9sbFRvKG51bGwsIGNtLmhlaWdodEF0TGluZSgxMjUsICJsb2NhbCIpKTsKCiAgdmFyIGV4cGVjdGVkV2lkZ2V0SGVpZ2h0ID0gNjA7CiAgdmFyIGV4cGVjdGVkTGluZXNJbldpZGdldCA9IDM7CiAgZnVuY3Rpb24gdygpIHsKICAgIHZhciBub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgICAvLyB3ZSB1c2UgdGhlc2UgY2hpbGRyZW4gd2l0aCBqdXN0IHVuZGVyIGhhbGYgd2lkdGggb2YgdGhlIGxpbmUgdG8gY2hlY2sgbWVhc3VyZW1lbnRzIGFyZSBtYWRlIHdpdGggY29ycmVjdCB3aWR0aAogICAgLy8gd2hlbiBwbGFjZWQgaW4gdGhlIG1lYXN1cmUgZGl2LgogICAgLy8gSWYgdGhlIHdpZGdldCBpcyBtZWFzdXJlZCBhdCBhIHdpZHRoIG11Y2ggbmFycm93ZXIgdGhhbiBpdCBpcyBkaXNwbGF5ZWQgYXQsIHRoZSB1bmRlckhhbGYgY2hpbGRyZW4gd2lsbCBzcGFuIHR3byBsaW5lcyBhbmQgYnJlYWsgdGhlIHRlc3QuCiAgICAvLyBJZiB0aGUgd2lkZ2V0IGlzIG1lYXN1cmVkIGF0IGEgd2lkdGggbXVjaCB3aWRlciB0aGFuIGl0IGlzIGRpc3BsYXllZCBhdCwgdGhlIG92ZXJIYWxmIGNoaWxkcmVuIHdpbGwgY29tYmluZSBhbmQgYnJlYWsgdGhlIHRlc3QuCiAgICAvLyBOb3RlIHRoYXQgdGhpcyB0ZXN0IG9ubHkgY2hlY2tzIHdpZGdldHMgd2hlcmUgY292ZXJHdXR0ZXIgaXMgdHJ1ZSwgYmVjYXVzZSB0aGVzZSByZXF1aXJlIGV4dHJhIHN0eWxpbmcgdG8gZ2V0IHRoZSB3aWR0aCByaWdodC4KICAgIC8vIEl0IG1heSBhbHNvIGJlIHdvcnRod2hpbGUgdG8gY2hlY2sgdGhpcyBmb3Igbm9uLWNvdmVyR3V0dGVyIHdpZGdldHMuCiAgICAvLyBWaXN1YWxseToKICAgIC8vIEdvb2Q6CiAgICAvLyB8IC0tLS0tLS0tLS0tLS0gZGlzcGxheSB3aWR0aCAtLS0tLS0tLS0tLS0tIHwKICAgIC8vIHwgLS0tLS0tLSB3aWRnZXQtd2lkdGggd2hlbiBtZWFzdXJlZCAtLS0tLS0gfAogICAgLy8gfCB8IC0tIHVuZGVyLWhhbGYgLS0gfCB8IC0tIHVuZGVyLWhhbGYgLS0gfCB8CiAgICAvLyB8IHwgLS0tIG92ZXItaGFsZiAtLS0gfCAgICAgICAgICAgICAgICAgICAgIHwKICAgIC8vIHwgfCAtLS0gb3Zlci1oYWxmIC0tLSB8ICAgICAgICAgICAgICAgICAgICAgfAogICAgLy8gSGVpZ2h0OiBtZWFzdXJlZCBhcyAzIGxpbmVzLCBzYW1lIGFzIGl0IHdpbGwgYmUgd2hlbiBhY3R1YWxseSBkaXNwbGF5ZWQKCiAgICAvLyBCYWQgKHRvbyBuYXJyb3cpOgogICAgLy8gfCAtLS0tLS0tLS0tLS0tIGRpc3BsYXkgd2lkdGggLS0tLS0tLS0tLS0tLSB8CiAgICAvLyB8IC0tLS0tLSB3aWRnZXQtd2lkdGggd2hlbiBtZWFzdXJlZCAtLS0tLSB8ICA8IC0tIHVoIG9oCiAgICAvLyB8IHwgLS0gdW5kZXItaGFsZiAtLSB8ICAgICAgICAgICAgICAgICAgICB8CiAgICAvLyB8IHwgLS0gdW5kZXItaGFsZiAtLSB8ICAgICAgICAgICAgICAgICAgICB8ICA8IC0tIHdoZW4gbWVhc3VyZWQsIHNob3ZlZCB0byBuZXh0IGxpbmUKICAgIC8vIHwgfCAtLS0gb3Zlci1oYWxmIC0tLSB8ICAgICAgICAgICAgICAgICAgIHwKICAgIC8vIHwgfCAtLS0gb3Zlci1oYWxmIC0tLSB8ICAgICAgICAgICAgICAgICAgIHwKICAgIC8vIEhlaWdodDogbWVhc3VyZWQgYXMgNCBsaW5lcywgbW9yZSB0aGFuIGV4cGVjdGVkIC4gV2lsbCBiZSBkaXNwbGF5ZWQgYXMgMyBsaW5lcyEKCiAgICAvLyBCYWQgKHRvbyB3aWRlKToKICAgIC8vIHwgLS0tLS0tLS0tLS0tLSBkaXNwbGF5IHdpZHRoIC0tLS0tLS0tLS0tLS0gfAogICAgLy8gfCAtLS0tLS0tLSB3aWRnZXQtd2lkdGggd2hlbiBtZWFzdXJlZCAtLS0tLS0tIHwgPCAtLSB1aCBvaAogICAgLy8gfCB8IC0tIHVuZGVyLWhhbGYgLS0gfCB8IC0tIHVuZGVyLWhhbGYgLS0gfCAgIHwKICAgIC8vIHwgfCAtLS0gb3Zlci1oYWxmIC0tLSB8IHwgLS0tIG92ZXItaGFsZiAtLS0gfCB8IDwgLS0gd2hlbiBtZWFzdXJlZCwgY29tYmluZWQgb24gb25lIGxpbmUKICAgIC8vIEhlaWdodDogbWVhc3VyZWQgYXMgMiBsaW5lcywgbGVzcyB0aGFuIGV4cGVjdGVkLiBXaWxsIGJlIGRpc3BsYXllZCBhcyAzIGxpbmVzIQoKICAgIHZhciBiYXJlbHlVbmRlckhhbGZXaWR0aEh0bWwgPSAnPGRpdiBzdHlsZT0iZGlzcGxheTogaW5saW5lLWJsb2NrOyBoZWlnaHQ6IDFweDsgd2lkdGg6ICcrKDI4NSAtIGhhbGZTY3JvbGxiYXJXaWR0aCkrJ3B4OyI+PC9kaXY+JzsKICAgIHZhciBiYXJlbHlPdmVySGFsZldpZHRoSHRtbCA9ICc8ZGl2IHN0eWxlPSJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IGhlaWdodDogMXB4OyB3aWR0aDogJysoMzA1IC0gaGFsZlNjcm9sbGJhcldpZHRoKSsncHg7Ij48L2Rpdj4nOwogICAgbm9kZS5pbm5lckhUTUwgPSBuZXcgQXJyYXkoMykuam9pbihiYXJlbHlVbmRlckhhbGZXaWR0aEh0bWwpICsgbmV3IEFycmF5KDMpLmpvaW4oYmFyZWx5T3ZlckhhbGZXaWR0aEh0bWwpOwogICAgbm9kZS5zdHlsZS5jc3NUZXh0ID0gImJhY2tncm91bmQ6IHllbGxvdztmb250LXNpemU6MDtsaW5lLWhlaWdodDogIiArIChleHBlY3RlZFdpZGdldEhlaWdodC9leHBlY3RlZExpbmVzSW5XaWRnZXQpICsgInB4OyI7CiAgICByZXR1cm4gbm9kZTsKICB9CiAgdmFyIGluZm8wID0gY20uZ2V0U2Nyb2xsSW5mbygpOwogIHZhciB3MCA9IGNtLmFkZExpbmVXaWRnZXQoMCwgdygpLCB7IGNvdmVyR3V0dGVyOiB0cnVlIH0pOwogIHZhciB3MTUwID0gY20uYWRkTGluZVdpZGdldCgxNTAsIHcoKSwgeyBjb3Zlckd1dHRlcjogdHJ1ZSB9KTsKICB2YXIgdzMwMCA9IGNtLmFkZExpbmVXaWRnZXQoMzAwLCB3KCksIHsgY292ZXJHdXR0ZXI6IHRydWUgfSk7CiAgdmFyIGluZm8xID0gY20uZ2V0U2Nyb2xsSW5mbygpOwogIGVxKGluZm8wLmhlaWdodCArICgzICogZXhwZWN0ZWRXaWRnZXRIZWlnaHQpLCBpbmZvMS5oZWlnaHQpOwogIGVxKGluZm8wLnRvcCArIGV4cGVjdGVkV2lkZ2V0SGVpZ2h0LCBpbmZvMS50b3ApOwogIGV4cGVjdGVkV2lkZ2V0SGVpZ2h0ID0gMTI7CiAgdzAubm9kZS5zdHlsZS5saW5lSGVpZ2h0ID0gdzE1MC5ub2RlLnN0eWxlLmxpbmVIZWlnaHQgPSB3MzAwLm5vZGUuc3R5bGUubGluZUhlaWdodCA9IChleHBlY3RlZFdpZGdldEhlaWdodC9leHBlY3RlZExpbmVzSW5XaWRnZXQpICsgInB4IjsKICB3MC5jaGFuZ2VkKCk7IHcxNTAuY2hhbmdlZCgpOyB3MzAwLmNoYW5nZWQoKTsKICB2YXIgaW5mbzIgPSBjbS5nZXRTY3JvbGxJbmZvKCk7CiAgZXEoaW5mbzAuaGVpZ2h0ICsgKDMgKiBleHBlY3RlZFdpZGdldEhlaWdodCksIGluZm8yLmhlaWdodCk7CiAgZXEoaW5mbzAudG9wICsgZXhwZWN0ZWRXaWRnZXRIZWlnaHQsIGluZm8yLnRvcCk7Cn0pOwoKdGVzdENNKCJnZXRMaW5lTnVtYmVyIiwgZnVuY3Rpb24oY20pIHsKICBhZGREb2MoY20sIDIsIDIwKTsKICB2YXIgaDEgPSBjbS5nZXRMaW5lSGFuZGxlKDEpOwogIGVxKGNtLmdldExpbmVOdW1iZXIoaDEpLCAxKTsKICBjbS5yZXBsYWNlUmFuZ2UoImhpXG5ieWVcbiIsIFBvcygwLCAwKSk7CiAgZXEoY20uZ2V0TGluZU51bWJlcihoMSksIDMpOwogIGNtLnNldFZhbHVlKCIiKTsKICBlcShjbS5nZXRMaW5lTnVtYmVyKGgxKSwgbnVsbCk7Cn0pOwoKdGVzdENNKCJqdW1wVGhlR2FwIiwgZnVuY3Rpb24oY20pIHsKICBpZiAocGhhbnRvbSkgcmV0dXJuOwogIHZhciBsb25nTGluZSA9ICJhYmNkZWYgZ2hpa2xtbm9wIHFyc3R1dncgeHl6ICI7CiAgbG9uZ0xpbmUgKz0gbG9uZ0xpbmU7IGxvbmdMaW5lICs9IGxvbmdMaW5lOyBsb25nTGluZSArPSBsb25nTGluZTsKICBjbS5yZXBsYWNlUmFuZ2UobG9uZ0xpbmUsIFBvcygyLCAwKSwgUG9zKDIpKTsKICBjbS5zZXRTaXplKCIyMDBweCIsIG51bGwpOwogIGNtLmdldFdyYXBwZXJFbGVtZW50KCkuc3R5bGUubGluZUhlaWdodCA9IDI7CiAgY20ucmVmcmVzaCgpOwogIGNtLnNldEN1cnNvcihQb3MoMCwgMSkpOwogIGNtLmV4ZWNDb21tYW5kKCJnb0xpbmVEb3duIik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygxLCAxKSk7CiAgY20uZXhlY0NvbW1hbmQoImdvTGluZURvd24iKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDIsIDEpKTsKICBjbS5leGVjQ29tbWFuZCgiZ29MaW5lRG93biIpOwogIGVxKGNtLmdldEN1cnNvcigpLmxpbmUsIDIpOwogIGlzKGNtLmdldEN1cnNvcigpLmNoID4gMSk7CiAgY20uZXhlY0NvbW1hbmQoImdvTGluZVVwIik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygyLCAxKSk7CiAgY20uZXhlY0NvbW1hbmQoImdvTGluZVVwIik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygxLCAxKSk7CiAgdmFyIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKICBub2RlLmlubmVySFRNTCA9ICJoaSI7IG5vZGUuc3R5bGUuaGVpZ2h0ID0gIjMwcHgiOwogIGNtLmFkZExpbmVXaWRnZXQoMCwgbm9kZSk7CiAgY20uYWRkTGluZVdpZGdldCgxLCBub2RlLmNsb25lTm9kZSh0cnVlKSwge2Fib3ZlOiB0cnVlfSk7CiAgY20uc2V0Q3Vyc29yKFBvcygwLCAyKSk7CiAgY20uZXhlY0NvbW1hbmQoImdvTGluZURvd24iKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDEsIDIpKTsKICBjbS5leGVjQ29tbWFuZCgiZ29MaW5lVXAiKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDAsIDIpKTsKfSwge2xpbmVXcmFwcGluZzogdHJ1ZSwgdmFsdWU6ICJhYmNcbmRlZlxuZ2hpXG5qa2xcbiJ9KTsKCnRlc3RDTSgiYWRkTGluZUNsYXNzIiwgZnVuY3Rpb24oY20pIHsKICBmdW5jdGlvbiBjbHMobGluZSwgdGV4dCwgYmcsIHdyYXAsIGd1dHRlcikgewogICAgdmFyIGkgPSBjbS5saW5lSW5mbyhsaW5lKTsKICAgIGVxKGkudGV4dENsYXNzLCB0ZXh0KTsKICAgIGVxKGkuYmdDbGFzcywgYmcpOwogICAgZXEoaS53cmFwQ2xhc3MsIHdyYXApOwogICAgaWYgKHR5cGVvZiBpLmhhbmRsZS5ndXR0ZXJDbGFzcyAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICBlcShpLmhhbmRsZS5ndXR0ZXJDbGFzcywgZ3V0dGVyKTsKICAgIH0KICB9CiAgY20uYWRkTGluZUNsYXNzKDAsICJ0ZXh0IiwgImZvbyIpOwogIGNtLmFkZExpbmVDbGFzcygwLCAidGV4dCIsICJiYXIiKTsKICBjbS5hZGRMaW5lQ2xhc3MoMSwgImJhY2tncm91bmQiLCAiYmF6Iik7CiAgY20uYWRkTGluZUNsYXNzKDEsICJ3cmFwIiwgImZvbyIpOwogIGNtLmFkZExpbmVDbGFzcygxLCAiZ3V0dGVyIiwgImd1dHRlci1jbGFzcyIpOwogIGNscygwLCAiZm9vIGJhciIsIG51bGwsIG51bGwsIG51bGwpOwogIGNscygxLCBudWxsLCAiYmF6IiwgImZvbyIsICJndXR0ZXItY2xhc3MiKTsKICB2YXIgbGluZXMgPSBjbS5kaXNwbGF5LmxpbmVEaXY7CiAgZXEoYnlDbGFzc05hbWUobGluZXMsICJmb28iKS5sZW5ndGgsIDIpOwogIGVxKGJ5Q2xhc3NOYW1lKGxpbmVzLCAiYmFyIikubGVuZ3RoLCAxKTsKICBlcShieUNsYXNzTmFtZShsaW5lcywgImJheiIpLmxlbmd0aCwgMSk7CiAgZXEoYnlDbGFzc05hbWUobGluZXMsICJndXR0ZXItY2xhc3MiKS5sZW5ndGgsIDIpOyAvLyBHdXR0ZXIgY2xhc3NlcyBhcmUgcmVmbGVjdGVkIGluIDIgbm9kZXMKICBjbS5yZW1vdmVMaW5lQ2xhc3MoMCwgInRleHQiLCAiZm9vIik7CiAgY2xzKDAsICJiYXIiLCBudWxsLCBudWxsLCBudWxsKTsKICBjbS5yZW1vdmVMaW5lQ2xhc3MoMCwgInRleHQiLCAiZm9vIik7CiAgY2xzKDAsICJiYXIiLCBudWxsLCBudWxsLCBudWxsKTsKICBjbS5yZW1vdmVMaW5lQ2xhc3MoMCwgInRleHQiLCAiYmFyIik7CiAgY2xzKDAsIG51bGwsIG51bGwsIG51bGwpOwoKICBjbS5hZGRMaW5lQ2xhc3MoMSwgIndyYXAiLCAicXV1eCIpOwogIGNscygxLCBudWxsLCAiYmF6IiwgImZvbyBxdXV4IiwgImd1dHRlci1jbGFzcyIpOwogIGNtLnJlbW92ZUxpbmVDbGFzcygxLCAid3JhcCIpOwogIGNscygxLCBudWxsLCAiYmF6IiwgbnVsbCwgImd1dHRlci1jbGFzcyIpOwogIGNtLnJlbW92ZUxpbmVDbGFzcygxLCAiZ3V0dGVyIiwgImd1dHRlci1jbGFzcyIpOwogIGVxKGJ5Q2xhc3NOYW1lKGxpbmVzLCAiZ3V0dGVyLWNsYXNzIikubGVuZ3RoLCAwKTsKICBjbHMoMSwgbnVsbCwgImJheiIsIG51bGwsIG51bGwpOwoKICBjbS5hZGRMaW5lQ2xhc3MoMSwgImd1dHRlciIsICJndXR0ZXItY2xhc3MiKTsKICBjbHMoMSwgbnVsbCwgImJheiIsIG51bGwsICJndXR0ZXItY2xhc3MiKTsKICBjbS5yZW1vdmVMaW5lQ2xhc3MoMSwgImd1dHRlciIsICJndXR0ZXItY2xhc3MiKTsKICBjbHMoMSwgbnVsbCwgImJheiIsIG51bGwsIG51bGwpOwoKfSwge3ZhbHVlOiAiaG9ob2hvXG4iLCBsaW5lTnVtYmVyczogdHJ1ZX0pOwoKdGVzdENNKCJhdG9taWNNYXJrZXIiLCBmdW5jdGlvbihjbSkgewogIGFkZERvYyhjbSwgMTAsIDEwKTsKICBmdW5jdGlvbiBhdG9tKGxsLCBjbCwgbHIsIGNyLCBsaSwgcmkpIHsKICAgIHJldHVybiBjbS5tYXJrVGV4dChQb3MobGwsIGNsKSwgUG9zKGxyLCBjciksCiAgICAgICAgICAgICAgICAgICAgICAge2F0b21pYzogdHJ1ZSwgaW5jbHVzaXZlTGVmdDogbGksIGluY2x1c2l2ZVJpZ2h0OiByaX0pOwogIH0KICB2YXIgbSA9IGF0b20oMCwgMSwgMCwgNSk7CiAgY20uc2V0Q3Vyc29yKFBvcygwLCAxKSk7CiAgY20uZXhlY0NvbW1hbmQoImdvQ2hhclJpZ2h0Iik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygwLCA1KSk7CiAgY20uZXhlY0NvbW1hbmQoImdvQ2hhckxlZnQiKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDAsIDEpKTsKICBtLmNsZWFyKCk7CiAgbSA9IGF0b20oMCwgMCwgMCwgNSwgdHJ1ZSk7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygwLCA1KSwgInB1c2hlZCBvdXQiKTsKICBjbS5leGVjQ29tbWFuZCgiZ29DaGFyTGVmdCIpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoMCwgNSkpOwogIG0uY2xlYXIoKTsKICBtID0gYXRvbSg4LCA0LCA5LCAxMCwgZmFsc2UsIHRydWUpOwogIGNtLnNldEN1cnNvcihQb3MoOSwgOCkpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoOCwgNCksICJzZXQiKTsKICBjbS5leGVjQ29tbWFuZCgiZ29DaGFyUmlnaHQiKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDgsIDQpLCAiY2hhciByaWdodCIpOwogIGNtLmV4ZWNDb21tYW5kKCJnb0xpbmVEb3duIik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcyg4LCA0KSwgImxpbmUgZG93biIpOwogIGNtLmV4ZWNDb21tYW5kKCJnb0NoYXJMZWZ0Iik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcyg4LCAzKSk7CiAgbS5jbGVhcigpOwogIG0gPSBhdG9tKDEsIDEsIDMsIDgpOwogIGNtLnNldEN1cnNvcihQb3MoMCwgMCkpOwogIGNtLnNldEN1cnNvcihQb3MoMiwgMCkpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoMywgOCkpOwogIGNtLmV4ZWNDb21tYW5kKCJnb0NoYXJMZWZ0Iik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygxLCAxKSk7CiAgY20uZXhlY0NvbW1hbmQoImdvQ2hhclJpZ2h0Iik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygzLCA4KSk7CiAgY20uZXhlY0NvbW1hbmQoImdvTGluZVVwIik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygxLCAxKSk7CiAgY20uZXhlY0NvbW1hbmQoImdvTGluZURvd24iKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDMsIDgpKTsKICBjbS5leGVjQ29tbWFuZCgiZGVsQ2hhckJlZm9yZSIpOwogIGVxKGNtLmdldFZhbHVlKCkubGVuZ3RoLCA4MCwgImRlbCBjaHVuayIpOwogIG0gPSBhdG9tKDMsIDAsIDUsIDUpOwogIGNtLnNldEN1cnNvcihQb3MoMywgMCkpOwogIGNtLmV4ZWNDb21tYW5kKCJkZWxXb3JkQWZ0ZXIiKTsKICBlcShjbS5nZXRWYWx1ZSgpLmxlbmd0aCwgNTMsICJkZWwgY2h1bmsiKTsKfSk7Cgp0ZXN0Q00oInNlbGVjdGlvbkJpYXMiLCBmdW5jdGlvbihjbSkgewogIGNtLm1hcmtUZXh0KFBvcygwLCAxKSwgUG9zKDAsIDMpLCB7YXRvbWljOiB0cnVlfSk7CiAgY20uc2V0Q3Vyc29yKFBvcygwLCAyKSk7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygwLCAxKSk7CiAgY20uc2V0Q3Vyc29yKFBvcygwLCAyKSk7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygwLCAzKSk7CiAgY20uc2V0Q3Vyc29yKFBvcygwLCAyKSk7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygwLCAxKSk7CiAgY20uc2V0Q3Vyc29yKFBvcygwLCAyKSwgbnVsbCwge2JpYXM6IC0xfSk7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygwLCAxKSk7CiAgY20uc2V0Q3Vyc29yKFBvcygwLCA0KSk7CiAgY20uc2V0Q3Vyc29yKFBvcygwLCAyKSwgbnVsbCwge2JpYXM6IDF9KTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDAsIDMpKTsKfSwge3ZhbHVlOiAiMTIzNDUifSk7Cgp0ZXN0Q00oInNlbGVjdGlvbkhvbWVFbmQiLCBmdW5jdGlvbihjbSkgewogIGNtLm1hcmtUZXh0KFBvcygxLCAwKSwgUG9zKDEsIDEpLCB7YXRvbWljOiB0cnVlLCBpbmNsdXNpdmVMZWZ0OiB0cnVlfSk7CiAgY20ubWFya1RleHQoUG9zKDEsIDMpLCBQb3MoMSwgNCksIHthdG9taWM6IHRydWUsIGluY2x1c2l2ZVJpZ2h0OiB0cnVlfSk7CiAgY20uc2V0Q3Vyc29yKFBvcygxLCAyKSk7CiAgY20uZXhlY0NvbW1hbmQoImdvTGluZVN0YXJ0Iik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygxLCAxKSk7CiAgY20uZXhlY0NvbW1hbmQoImdvTGluZUVuZCIpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoMSwgMykpOwp9LCB7dmFsdWU6ICJhYlxuY2RlZlxuZ2gifSk7Cgp0ZXN0Q00oInJlYWRPbmx5TWFya2VyIiwgZnVuY3Rpb24oY20pIHsKICBmdW5jdGlvbiBtYXJrKGxsLCBjbCwgbHIsIGNyLCBhdCkgewogICAgcmV0dXJuIGNtLm1hcmtUZXh0KFBvcyhsbCwgY2wpLCBQb3MobHIsIGNyKSwKICAgICAgICAgICAgICAgICAgICAgICB7cmVhZE9ubHk6IHRydWUsIGF0b21pYzogYXR9KTsKICB9CiAgdmFyIG0gPSBtYXJrKDAsIDEsIDAsIDQpOwogIGNtLnNldEN1cnNvcihQb3MoMCwgMikpOwogIGNtLnJlcGxhY2VTZWxlY3Rpb24oImhpIiwgImVuZCIpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoMCwgMikpOwogIGVxKGNtLmdldExpbmUoMCksICJhYmNkZSIpOwogIGNtLmV4ZWNDb21tYW5kKCJzZWxlY3RBbGwiKTsKICBjbS5yZXBsYWNlU2VsZWN0aW9uKCJvb3BzIiwgImFyb3VuZCIpOwogIGVxKGNtLmdldFZhbHVlKCksICJvb3BzYmNkIik7CiAgY20udW5kbygpOwogIGVxUG9zKG0uZmluZCgpLmZyb20sIFBvcygwLCAxKSk7CiAgZXFQb3MobS5maW5kKCkudG8sIFBvcygwLCA0KSk7CiAgbS5jbGVhcigpOwogIGNtLnNldEN1cnNvcihQb3MoMCwgMikpOwogIGNtLnJlcGxhY2VTZWxlY3Rpb24oImhpIiwgImFyb3VuZCIpOwogIGVxKGNtLmdldExpbmUoMCksICJhYmhpY2RlIik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygwLCA0KSk7CiAgbSA9IG1hcmsoMCwgMiwgMiwgMiwgdHJ1ZSk7CiAgY20uc2V0U2VsZWN0aW9uKFBvcygxLCAxKSwgUG9zKDIsIDQpKTsKICBjbS5yZXBsYWNlU2VsZWN0aW9uKCJ0IiwgImVuZCIpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoMiwgMykpOwogIGVxKGNtLmdldExpbmUoMiksICJrbHRvIik7CiAgY20uZXhlY0NvbW1hbmQoImdvQ2hhckxlZnQiKTsKICBjbS5leGVjQ29tbWFuZCgiZ29DaGFyTGVmdCIpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoMCwgMikpOwogIGNtLnNldFNlbGVjdGlvbihQb3MoMCwgMSksIFBvcygwLCAzKSk7CiAgY20ucmVwbGFjZVNlbGVjdGlvbigieHgiLCAiYXJvdW5kIik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygwLCAzKSk7CiAgZXEoY20uZ2V0TGluZSgwKSwgImF4eGhpY2RlIik7Cn0sIHt2YWx1ZTogImFiY2RlXG5mZ2hpalxua2xtbm9cbiJ9KTsKCnRlc3RDTSgiZGlydHlCaXQiLCBmdW5jdGlvbihjbSkgewogIGVxKGNtLmlzQ2xlYW4oKSwgdHJ1ZSk7CiAgY20ucmVwbGFjZVNlbGVjdGlvbigiYm9vIiwgbnVsbCwgInRlc3QiKTsKICBlcShjbS5pc0NsZWFuKCksIGZhbHNlKTsKICBjbS51bmRvKCk7CiAgZXEoY20uaXNDbGVhbigpLCB0cnVlKTsKICBjbS5yZXBsYWNlU2VsZWN0aW9uKCJib28iLCBudWxsLCAidGVzdCIpOwogIGNtLnJlcGxhY2VTZWxlY3Rpb24oImJheiIsIG51bGwsICJ0ZXN0Iik7CiAgY20udW5kbygpOwogIGVxKGNtLmlzQ2xlYW4oKSwgZmFsc2UpOwogIGNtLm1hcmtDbGVhbigpOwogIGVxKGNtLmlzQ2xlYW4oKSwgdHJ1ZSk7CiAgY20udW5kbygpOwogIGVxKGNtLmlzQ2xlYW4oKSwgZmFsc2UpOwogIGNtLnJlZG8oKTsKICBlcShjbS5pc0NsZWFuKCksIHRydWUpOwp9KTsKCnRlc3RDTSgiY2hhbmdlR2VuZXJhdGlvbiIsIGZ1bmN0aW9uKGNtKSB7CiAgY20ucmVwbGFjZVNlbGVjdGlvbigieCIpOwogIHZhciBzb2Z0R2VuID0gY20uY2hhbmdlR2VuZXJhdGlvbigpOwogIGNtLnJlcGxhY2VTZWxlY3Rpb24oIngiKTsKICBjbS51bmRvKCk7CiAgZXEoY20uZ2V0VmFsdWUoKSwgIiIpOwogIGlzKCFjbS5pc0NsZWFuKHNvZnRHZW4pKTsKICBjbS5yZXBsYWNlU2VsZWN0aW9uKCJ4Iik7CiAgdmFyIGhhcmRHZW4gPSBjbS5jaGFuZ2VHZW5lcmF0aW9uKHRydWUpOwogIGNtLnJlcGxhY2VTZWxlY3Rpb24oIngiKTsKICBjbS51bmRvKCk7CiAgZXEoY20uZ2V0VmFsdWUoKSwgIngiKTsKICBpcyhjbS5pc0NsZWFuKGhhcmRHZW4pKTsKfSk7Cgp0ZXN0Q00oImFkZEtleU1hcCIsIGZ1bmN0aW9uKGNtKSB7CiAgZnVuY3Rpb24gc2VuZEtleShjb2RlKSB7CiAgICBjbS50cmlnZ2VyT25LZXlEb3duKHt0eXBlOiAia2V5ZG93biIsIGtleUNvZGU6IGNvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICBwcmV2ZW50RGVmYXVsdDogZnVuY3Rpb24oKXt9LCBzdG9wUHJvcGFnYXRpb246IGZ1bmN0aW9uKCl7fX0pOwogIH0KCiAgc2VuZEtleSgzOSk7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygwLCAxKSk7CiAgdmFyIHRlc3QgPSAwOwogIHZhciBtYXAxID0ge1JpZ2h0OiBmdW5jdGlvbigpIHsgKyt0ZXN0OyB9fSwgbWFwMiA9IHtSaWdodDogZnVuY3Rpb24oKSB7IHRlc3QgKz0gMTA7IH19CiAgY20uYWRkS2V5TWFwKG1hcDEpOwogIHNlbmRLZXkoMzkpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoMCwgMSkpOwogIGVxKHRlc3QsIDEpOwogIGNtLmFkZEtleU1hcChtYXAyLCB0cnVlKTsKICBzZW5kS2V5KDM5KTsKICBlcSh0ZXN0LCAyKTsKICBjbS5yZW1vdmVLZXlNYXAobWFwMSk7CiAgc2VuZEtleSgzOSk7CiAgZXEodGVzdCwgMTIpOwogIGNtLnJlbW92ZUtleU1hcChtYXAyKTsKICBzZW5kS2V5KDM5KTsKICBlcSh0ZXN0LCAxMik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygwLCAyKSk7CiAgY20uYWRkS2V5TWFwKHtSaWdodDogZnVuY3Rpb24oKSB7IHRlc3QgPSA1NTsgfSwgbmFtZTogIm15bWFwIn0pOwogIHNlbmRLZXkoMzkpOwogIGVxKHRlc3QsIDU1KTsKICBjbS5yZW1vdmVLZXlNYXAoIm15bWFwIik7CiAgc2VuZEtleSgzOSk7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygwLCAzKSk7Cn0sIHt2YWx1ZTogImFiYyJ9KTsKCnRlc3RDTSgiZmluZFBvc0giLCBmdW5jdGlvbihjbSkgewogIGZvckVhY2goW3tmcm9tOiBQb3MoMCwgMCksIHRvOiBQb3MoMCwgMSksIGJ5OiAxfSwKICAgICAgICAgICB7ZnJvbTogUG9zKDAsIDApLCB0bzogUG9zKDAsIDApLCBieTogLTEsIGhpdFNpZGU6IHRydWV9LAogICAgICAgICAgIHtmcm9tOiBQb3MoMCwgMCksIHRvOiBQb3MoMCwgNCksIGJ5OiAxLCB1bml0OiAid29yZCJ9LAogICAgICAgICAgIHtmcm9tOiBQb3MoMCwgMCksIHRvOiBQb3MoMCwgOCksIGJ5OiAyLCB1bml0OiAid29yZCJ9LAogICAgICAgICAgIHtmcm9tOiBQb3MoMCwgMCksIHRvOiBQb3MoMiwgMCksIGJ5OiAyMCwgdW5pdDogIndvcmQiLCBoaXRTaWRlOiB0cnVlfSwKICAgICAgICAgICB7ZnJvbTogUG9zKDAsIDcpLCB0bzogUG9zKDAsIDUpLCBieTogLTEsIHVuaXQ6ICJ3b3JkIn0sCiAgICAgICAgICAge2Zyb206IFBvcygwLCA0KSwgdG86IFBvcygwLCA4KSwgYnk6IDEsIHVuaXQ6ICJ3b3JkIn0sCiAgICAgICAgICAge2Zyb206IFBvcygxLCAwKSwgdG86IFBvcygxLCAxOCksIGJ5OiAzLCB1bml0OiAid29yZCJ9LAogICAgICAgICAgIHtmcm9tOiBQb3MoMSwgMjIpLCB0bzogUG9zKDEsIDUpLCBieTogLTMsIHVuaXQ6ICJ3b3JkIn0sCiAgICAgICAgICAge2Zyb206IFBvcygxLCAxNSksIHRvOiBQb3MoMSwgMTApLCBieTogLTV9LAogICAgICAgICAgIHtmcm9tOiBQb3MoMSwgMTUpLCB0bzogUG9zKDEsIDEwKSwgYnk6IC01LCB1bml0OiAiY29sdW1uIn0sCiAgICAgICAgICAge2Zyb206IFBvcygxLCAxNSksIHRvOiBQb3MoMSwgMCksIGJ5OiAtNTAsIHVuaXQ6ICJjb2x1bW4iLCBoaXRTaWRlOiB0cnVlfSwKICAgICAgICAgICB7ZnJvbTogUG9zKDEsIDE1KSwgdG86IFBvcygxLCAyNCksIGJ5OiA1MCwgdW5pdDogImNvbHVtbiIsIGhpdFNpZGU6IHRydWV9LAogICAgICAgICAgIHtmcm9tOiBQb3MoMSwgMTUpLCB0bzogUG9zKDIsIDApLCBieTogNTAsIGhpdFNpZGU6IHRydWV9XSwgZnVuY3Rpb24odCkgewogICAgdmFyIHIgPSBjbS5maW5kUG9zSCh0LmZyb20sIHQuYnksIHQudW5pdCB8fCAiY2hhciIpOwogICAgZXFQb3MociwgdC50byk7CiAgICBlcSghIXIuaGl0U2lkZSwgISF0LmhpdFNpZGUpOwogIH0pOwp9LCB7dmFsdWU6ICJsaW5lIG9uZVxubGluZSB0d28uc29tZXRoaW5nLm90aGVyXG4ifSk7Cgp0ZXN0Q00oImJlZm9yZUNoYW5nZSIsIGZ1bmN0aW9uKGNtKSB7CiAgY20ub24oImJlZm9yZUNoYW5nZSIsIGZ1bmN0aW9uKGNtLCBjaGFuZ2UpIHsKICAgIHZhciB0ZXh0ID0gW107CiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoYW5nZS50ZXh0Lmxlbmd0aDsgKytpKQogICAgICB0ZXh0LnB1c2goY2hhbmdlLnRleHRbaV0ucmVwbGFjZSgvXHMvZywgIl8iKSk7CiAgICBjaGFuZ2UudXBkYXRlKG51bGwsIG51bGwsIHRleHQpOwogIH0pOwogIGNtLnNldFZhbHVlKCJoZWxsbywgaSBhbSBhXG5uZXcgZG9jdW1lbnRcbiIpOwogIGVxKGNtLmdldFZhbHVlKCksICJoZWxsbyxfaV9hbV9hXG5uZXdfZG9jdW1lbnRcbiIpOwogIENvZGVNaXJyb3Iub24oY20uZ2V0RG9jKCksICJiZWZvcmVDaGFuZ2UiLCBmdW5jdGlvbihkb2MsIGNoYW5nZSkgewogICAgaWYgKGNoYW5nZS5mcm9tLmxpbmUgPT0gMCkgY2hhbmdlLmNhbmNlbCgpOwogIH0pOwogIGNtLnNldFZhbHVlKCJvb3BzIik7IC8vIENhbmNlbGVkCiAgZXEoY20uZ2V0VmFsdWUoKSwgImhlbGxvLF9pX2FtX2Fcbm5ld19kb2N1bWVudFxuIik7CiAgY20ucmVwbGFjZVJhbmdlKCJoZXkgaGV5IGhleSIsIFBvcygxLCAwKSwgUG9zKDIsIDApKTsKICBlcShjbS5nZXRWYWx1ZSgpLCAiaGVsbG8sX2lfYW1fYVxuaGV5X2hleV9oZXkiKTsKfSwge3ZhbHVlOiAiYWJjZGVmZ2hpamsifSk7Cgp0ZXN0Q00oImJlZm9yZUNoYW5nZVVuZG8iLCBmdW5jdGlvbihjbSkgewogIGNtLnJlcGxhY2VSYW5nZSgiaGkiLCBQb3MoMCwgMCksIFBvcygwKSk7CiAgY20ucmVwbGFjZVJhbmdlKCJieWUiLCBQb3MoMCwgMCksIFBvcygwKSk7CiAgZXEoY20uaGlzdG9yeVNpemUoKS51bmRvLCAyKTsKICBjbS5vbigiYmVmb3JlQ2hhbmdlIiwgZnVuY3Rpb24oY20sIGNoYW5nZSkgewogICAgaXMoIWNoYW5nZS51cGRhdGUpOwogICAgY2hhbmdlLmNhbmNlbCgpOwogIH0pOwogIGNtLnVuZG8oKTsKICBlcShjbS5oaXN0b3J5U2l6ZSgpLnVuZG8sIDApOwogIGVxKGNtLmdldFZhbHVlKCksICJieWVcbnR3byIpOwp9LCB7dmFsdWU6ICJvbmVcbnR3byJ9KTsKCnRlc3RDTSgiYmVmb3JlU2VsZWN0aW9uQ2hhbmdlIiwgZnVuY3Rpb24oY20pIHsKICBmdW5jdGlvbiBub3RBdEVuZChjbSwgcG9zKSB7CiAgICB2YXIgbGVuID0gY20uZ2V0TGluZShwb3MubGluZSkubGVuZ3RoOwogICAgaWYgKCFsZW4gfHwgcG9zLmNoID09IGxlbikgcmV0dXJuIFBvcyhwb3MubGluZSwgcG9zLmNoIC0gMSk7CiAgICByZXR1cm4gcG9zOwogIH0KICBjbS5vbigiYmVmb3JlU2VsZWN0aW9uQ2hhbmdlIiwgZnVuY3Rpb24oY20sIG9iaikgewogICAgb2JqLnVwZGF0ZShbe2FuY2hvcjogbm90QXRFbmQoY20sIG9iai5yYW5nZXNbMF0uYW5jaG9yKSwKICAgICAgICAgICAgICAgICBoZWFkOiBub3RBdEVuZChjbSwgb2JqLnJhbmdlc1swXS5oZWFkKX1dKTsKICB9KTsKCiAgYWRkRG9jKGNtLCAxMCwgMTApOwogIGNtLmV4ZWNDb21tYW5kKCJnb0xpbmVFbmQiKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDAsIDkpKTsKICBjbS5leGVjQ29tbWFuZCgic2VsZWN0QWxsIik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCJzdGFydCIpLCBQb3MoMCwgMCkpOwogIGVxUG9zKGNtLmdldEN1cnNvcigiZW5kIiksIFBvcyg5LCA5KSk7Cn0pOwoKdGVzdENNKCJjaGFuZ2VfcmVtb3ZlZFRleHQiLCBmdW5jdGlvbihjbSkgewogIGNtLnNldFZhbHVlKCJhYmNcbmRlZiIpOwoKICB2YXIgcmVtb3ZlZFRleHQgPSBbXTsKICBjbS5vbigiY2hhbmdlIiwgZnVuY3Rpb24oY20sIGNoYW5nZSkgewogICAgcmVtb3ZlZFRleHQucHVzaChjaGFuZ2UucmVtb3ZlZCk7CiAgfSk7CgogIGNtLm9wZXJhdGlvbihmdW5jdGlvbigpIHsKICAgIGNtLnJlcGxhY2VSYW5nZSgieHl6IiwgUG9zKDAsIDApLCBQb3MoMSwxKSk7CiAgICBjbS5yZXBsYWNlUmFuZ2UoIjEyMyIsIFBvcygwLDApKTsKICB9KTsKCiAgZXEocmVtb3ZlZFRleHQubGVuZ3RoLCAyKTsKICBlcShyZW1vdmVkVGV4dFswXS5qb2luKCJcbiIpLCAiYWJjXG5kIik7CiAgZXEocmVtb3ZlZFRleHRbMV0uam9pbigiXG4iKSwgIiIpOwoKICB2YXIgcmVtb3ZlZFRleHQgPSBbXTsKICBjbS51bmRvKCk7CiAgZXEocmVtb3ZlZFRleHQubGVuZ3RoLCAyKTsKICBlcShyZW1vdmVkVGV4dFswXS5qb2luKCJcbiIpLCAiMTIzIik7CiAgZXEocmVtb3ZlZFRleHRbMV0uam9pbigiXG4iKSwgInh5eiIpOwoKICB2YXIgcmVtb3ZlZFRleHQgPSBbXTsKICBjbS5yZWRvKCk7CiAgZXEocmVtb3ZlZFRleHQubGVuZ3RoLCAyKTsKICBlcShyZW1vdmVkVGV4dFswXS5qb2luKCJcbiIpLCAiYWJjXG5kIik7CiAgZXEocmVtb3ZlZFRleHRbMV0uam9pbigiXG4iKSwgIiIpOwp9KTsKCnRlc3RDTSgibGluZVN0eWxlRnJvbU1vZGUiLCBmdW5jdGlvbihjbSkgewogIENvZGVNaXJyb3IuZGVmaW5lTW9kZSgidGVzdF9tb2RlIiwgZnVuY3Rpb24oKSB7CiAgICByZXR1cm4ge3Rva2VuOiBmdW5jdGlvbihzdHJlYW0pIHsKICAgICAgaWYgKHN0cmVhbS5tYXRjaCgvXlxbW15cXV0qXF0vKSkgcmV0dXJuICIgIGxpbmUtYnJhY2tldHMgICI7CiAgICAgIGlmIChzdHJlYW0ubWF0Y2goL15cKFteXCldKlwpLykpIHJldHVybiAiICBsaW5lLWJhY2tncm91bmQtcGFyZW5zICAiOwogICAgICBpZiAoc3RyZWFtLm1hdGNoKC9ePFtePl0qPi8pKSByZXR1cm4gIiAgc3BhbiAgbGluZS1saW5lICBsaW5lLWJhY2tncm91bmQtYmcgICI7CiAgICAgIHN0cmVhbS5tYXRjaCgvXlxzK3xeXFMrLyk7CiAgICB9fTsKICB9KTsKICBjbS5zZXRPcHRpb24oIm1vZGUiLCAidGVzdF9tb2RlIik7CiAgdmFyIGJyYWNrZXRFbHRzID0gYnlDbGFzc05hbWUoY20uZ2V0V3JhcHBlckVsZW1lbnQoKSwgImJyYWNrZXRzIik7CiAgZXEoYnJhY2tldEVsdHMubGVuZ3RoLCAxLCAiYnJhY2tldHMgY291bnQiKTsKICBlcShicmFja2V0RWx0c1swXS5ub2RlTmFtZSwgIlBSRSIpOwogIGlzKCEvYnJhY2tldHMuKmJyYWNrZXRzLy50ZXN0KGJyYWNrZXRFbHRzWzBdLmNsYXNzTmFtZSkpOwogIHZhciBwYXJlbkVsdHMgPSBieUNsYXNzTmFtZShjbS5nZXRXcmFwcGVyRWxlbWVudCgpLCAicGFyZW5zIik7CiAgZXEocGFyZW5FbHRzLmxlbmd0aCwgMSwgInBhcmVucyBjb3VudCIpOwogIGVxKHBhcmVuRWx0c1swXS5ub2RlTmFtZSwgIkRJViIpOwogIGlzKCEvcGFyZW5zLipwYXJlbnMvLnRlc3QocGFyZW5FbHRzWzBdLmNsYXNzTmFtZSkpOwogIGVxKHBhcmVuRWx0c1swXS5wYXJlbnRFbGVtZW50Lm5vZGVOYW1lLCAiRElWIik7CgogIGVxKGJ5Q2xhc3NOYW1lKGNtLmdldFdyYXBwZXJFbGVtZW50KCksICJiZyIpLmxlbmd0aCwgMSk7CiAgZXEoYnlDbGFzc05hbWUoY20uZ2V0V3JhcHBlckVsZW1lbnQoKSwgImxpbmUiKS5sZW5ndGgsIDEpOwogIHZhciBzcGFuRWx0cyA9IGJ5Q2xhc3NOYW1lKGNtLmdldFdyYXBwZXJFbGVtZW50KCksICJjbS1zcGFuIik7CiAgZXEoc3BhbkVsdHMubGVuZ3RoLCAyKTsKICBpcygvXlxzKmNtLXNwYW5ccyokLy50ZXN0KHNwYW5FbHRzWzBdLmNsYXNzTmFtZSkpOwp9LCB7dmFsdWU6ICJsaW5lMTogW2JyXSBbYnJdXG5saW5lMjogKHBhcikgKHBhcilcbmxpbmUzOiA8dGFnPiA8dGFnPiJ9KTsKCnRlc3RDTSgibGluZVN0eWxlRnJvbUJsYW5rTGluZSIsIGZ1bmN0aW9uKGNtKSB7CiAgQ29kZU1pcnJvci5kZWZpbmVNb2RlKCJsaW5lU3R5bGVGcm9tQmxhbmtMaW5lX21vZGUiLCBmdW5jdGlvbigpIHsKICAgIHJldHVybiB7dG9rZW46IGZ1bmN0aW9uKHN0cmVhbSkgeyBzdHJlYW0uc2tpcFRvRW5kKCk7IHJldHVybiAiY29tbWVudCI7IH0sCiAgICAgICAgICAgIGJsYW5rTGluZTogZnVuY3Rpb24oKSB7IHJldHVybiAibGluZS1ibGFuayI7IH19OwogIH0pOwogIGNtLnNldE9wdGlvbigibW9kZSIsICJsaW5lU3R5bGVGcm9tQmxhbmtMaW5lX21vZGUiKTsKICB2YXIgYmxhbmtFbHRzID0gYnlDbGFzc05hbWUoY20uZ2V0V3JhcHBlckVsZW1lbnQoKSwgImJsYW5rIik7CiAgZXEoYmxhbmtFbHRzLmxlbmd0aCwgMSk7CiAgZXEoYmxhbmtFbHRzWzBdLm5vZGVOYW1lLCAiUFJFIik7CiAgY20ucmVwbGFjZVJhbmdlKCJ4IiwgUG9zKDEsIDApKTsKICBibGFua0VsdHMgPSBieUNsYXNzTmFtZShjbS5nZXRXcmFwcGVyRWxlbWVudCgpLCAiYmxhbmsiKTsKICBlcShibGFua0VsdHMubGVuZ3RoLCAwKTsKfSwge3ZhbHVlOiAiZm9vXG5cbmJhciJ9KTsKCkNvZGVNaXJyb3IucmVnaXN0ZXJIZWxwZXIoInh4eCIsICJhIiwgIkEiKTsKQ29kZU1pcnJvci5yZWdpc3RlckhlbHBlcigieHh4IiwgImIiLCAiQiIpOwpDb2RlTWlycm9yLmRlZmluZU1vZGUoInl5eSIsIGZ1bmN0aW9uKCkgewogIHJldHVybiB7CiAgICB0b2tlbjogZnVuY3Rpb24oc3RyZWFtKSB7IHN0cmVhbS5za2lwVG9FbmQoKTsgfSwKICAgIHh4eDogWyJhIiwgImIiLCAicSJdCiAgfTsKfSk7CkNvZGVNaXJyb3IucmVnaXN0ZXJHbG9iYWxIZWxwZXIoInh4eCIsICJjIiwgZnVuY3Rpb24obSkgeyByZXR1cm4gbS5lbmFibGVDOyB9LCAiQyIpOwoKdGVzdENNKCJoZWxwZXJzIiwgZnVuY3Rpb24oY20pIHsKICBjbS5zZXRPcHRpb24oIm1vZGUiLCAieXl5Iik7CiAgZXEoY20uZ2V0SGVscGVycyhQb3MoMCwgMCksICJ4eHgiKS5qb2luKCIvIiksICJBL0IiKTsKICBjbS5zZXRPcHRpb24oIm1vZGUiLCB7bmFtZTogInl5eSIsIG1vZGVQcm9wczoge3h4eDogImIiLCBlbmFibGVDOiB0cnVlfX0pOwogIGVxKGNtLmdldEhlbHBlcnMoUG9zKDAsIDApLCAieHh4Iikuam9pbigiLyIpLCAiQi9DIik7CiAgY20uc2V0T3B0aW9uKCJtb2RlIiwgImphdmFzY3JpcHQiKTsKICBlcShjbS5nZXRIZWxwZXJzKFBvcygwLCAwKSwgInh4eCIpLmpvaW4oIi8iKSwgIiIpOwp9KTsKCnRlc3RDTSgic2VsZWN0aW9uSGlzdG9yeSIsIGZ1bmN0aW9uKGNtKSB7CiAgZm9yICh2YXIgaSA9IDA7IGkgPCAzOyBpKyspIHsKICAgIGNtLnNldEV4dGVuZGluZyh0cnVlKTsKICAgIGNtLmV4ZWNDb21tYW5kKCJnb0NoYXJSaWdodCIpOwogICAgY20uc2V0RXh0ZW5kaW5nKGZhbHNlKTsKICAgIGNtLmV4ZWNDb21tYW5kKCJnb0NoYXJSaWdodCIpOwogICAgY20uZXhlY0NvbW1hbmQoImdvQ2hhclJpZ2h0Iik7CiAgfQogIGNtLmV4ZWNDb21tYW5kKCJ1bmRvU2VsZWN0aW9uIik7CiAgZXEoY20uZ2V0U2VsZWN0aW9uKCksICJjIik7CiAgY20uZXhlY0NvbW1hbmQoInVuZG9TZWxlY3Rpb24iKTsKICBlcShjbS5nZXRTZWxlY3Rpb24oKSwgIiIpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoMCwgNCkpOwogIGNtLmV4ZWNDb21tYW5kKCJ1bmRvU2VsZWN0aW9uIik7CiAgZXEoY20uZ2V0U2VsZWN0aW9uKCksICJiIik7CiAgY20uZXhlY0NvbW1hbmQoInJlZG9TZWxlY3Rpb24iKTsKICBlcShjbS5nZXRTZWxlY3Rpb24oKSwgIiIpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoMCwgNCkpOwogIGNtLmV4ZWNDb21tYW5kKCJyZWRvU2VsZWN0aW9uIik7CiAgZXEoY20uZ2V0U2VsZWN0aW9uKCksICJjIik7CiAgY20uZXhlY0NvbW1hbmQoInJlZG9TZWxlY3Rpb24iKTsKICBlcShjbS5nZXRTZWxlY3Rpb24oKSwgIiIpOwogIGVxUG9zKGNtLmdldEN1cnNvcigpLCBQb3MoMCwgNikpOwp9LCB7dmFsdWU6ICJhIGIgYyBkIn0pOwoKdGVzdENNKCJzZWxlY3Rpb25DaGFuZ2VSZWR1Y2VzUmVkbyIsIGZ1bmN0aW9uKGNtKSB7CiAgY20ucmVwbGFjZVNlbGVjdGlvbigiWCIpOwogIGNtLmV4ZWNDb21tYW5kKCJnb0NoYXJSaWdodCIpOwogIGNtLnVuZG9TZWxlY3Rpb24oKTsKICBjbS5leGVjQ29tbWFuZCgic2VsZWN0QWxsIik7CiAgY20udW5kb1NlbGVjdGlvbigpOwogIGVxKGNtLmdldFZhbHVlKCksICJYYWJjIik7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCksIFBvcygwLCAxKSk7CiAgY20udW5kb1NlbGVjdGlvbigpOwogIGVxKGNtLmdldFZhbHVlKCksICJhYmMiKTsKfSwge3ZhbHVlOiAiYWJjIn0pOwoKdGVzdENNKCJzZWxlY3Rpb25IaXN0b3J5Tm9uT3ZlcmxhcHBpbmciLCBmdW5jdGlvbihjbSkgewogIGNtLnNldFNlbGVjdGlvbihQb3MoMCwgMCksIFBvcygwLCAxKSk7CiAgY20uc2V0U2VsZWN0aW9uKFBvcygwLCAyKSwgUG9zKDAsIDMpKTsKICBjbS5leGVjQ29tbWFuZCgidW5kb1NlbGVjdGlvbiIpOwogIGVxUG9zKGNtLmdldEN1cnNvcigiYW5jaG9yIiksIFBvcygwLCAwKSk7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCJoZWFkIiksIFBvcygwLCAxKSk7Cn0sIHt2YWx1ZTogIjEyMzQifSk7Cgp0ZXN0Q00oImN1cnNvck1vdGlvblNwbGl0c0hpc3RvcnkiLCBmdW5jdGlvbihjbSkgewogIGNtLnJlcGxhY2VTZWxlY3Rpb24oImEiKTsKICBjbS5leGVjQ29tbWFuZCgiZ29DaGFyUmlnaHQiKTsKICBjbS5yZXBsYWNlU2VsZWN0aW9uKCJiIik7CiAgY20ucmVwbGFjZVNlbGVjdGlvbigiYyIpOwogIGNtLnVuZG8oKTsKICBlcShjbS5nZXRWYWx1ZSgpLCAiYTEyMzQiKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDAsIDIpKTsKICBjbS51bmRvKCk7CiAgZXEoY20uZ2V0VmFsdWUoKSwgIjEyMzQiKTsKICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDAsIDApKTsKfSwge3ZhbHVlOiAiMTIzNCJ9KTsKCnRlc3RDTSgic2VsQ2hhbmdlSW5PcGVyYXRpb25Eb2VzTm90U3BsaXQiLCBmdW5jdGlvbihjbSkgewogIGZvciAodmFyIGkgPSAwOyBpIDwgNDsgaSsrKSB7CiAgICBjbS5vcGVyYXRpb24oZnVuY3Rpb24oKSB7CiAgICAgIGNtLnJlcGxhY2VTZWxlY3Rpb24oIngiKTsKICAgICAgY20uc2V0Q3Vyc29yKFBvcygwLCBjbS5nZXRDdXJzb3IoKS5jaCAtIDEpKTsKICAgIH0pOwogIH0KICBlcVBvcyhjbS5nZXRDdXJzb3IoKSwgUG9zKDAsIDApKTsKICBlcShjbS5nZXRWYWx1ZSgpLCAieHh4eGEiKTsKICBjbS51bmRvKCk7CiAgZXEoY20uZ2V0VmFsdWUoKSwgImEiKTsKfSwge3ZhbHVlOiAiYSJ9KTsKCnRlc3RDTSgiYWx3YXlzTWVyZ2VTZWxFdmVudFdpdGhDaGFuZ2VPcmlnaW4iLCBmdW5jdGlvbihjbSkgewogIGNtLnJlcGxhY2VTZWxlY3Rpb24oIlUiLCBudWxsLCAiZm9vIik7CiAgY20uc2V0U2VsZWN0aW9uKFBvcygwLCAwKSwgUG9zKDAsIDEpLCB7b3JpZ2luOiAiZm9vIn0pOwogIGNtLnVuZG9TZWxlY3Rpb24oKTsKICBlcShjbS5nZXRWYWx1ZSgpLCAiYSIpOwogIGNtLnJlcGxhY2VTZWxlY3Rpb24oIlYiLCBudWxsLCAiZm9vIik7CiAgY20uc2V0U2VsZWN0aW9uKFBvcygwLCAwKSwgUG9zKDAsIDEpLCB7b3JpZ2luOiAiYmFyIn0pOwogIGNtLnVuZG9TZWxlY3Rpb24oKTsKICBlcShjbS5nZXRWYWx1ZSgpLCAiVmEiKTsKfSwge3ZhbHVlOiAiYSJ9KTsKCnRlc3RDTSgiZ2V0VG9rZW5BdCIsIGZ1bmN0aW9uKGNtKSB7CiAgdmFyIHRva1BsdXMgPSBjbS5nZXRUb2tlbkF0KFBvcygwLCAyKSk7CiAgZXEodG9rUGx1cy50eXBlLCAib3BlcmF0b3IiKTsKICBlcSh0b2tQbHVzLnN0cmluZywgIisiKTsKICB2YXIgdG9rcyA9IGNtLmdldExpbmVUb2tlbnMoMCk7CiAgZXEodG9rcy5sZW5ndGgsIDMpOwogIGZvckVhY2goW1sibnVtYmVyIiwgIjEiXSwgWyJvcGVyYXRvciIsICIrIl0sIFsibnVtYmVyIiwgIjIiXV0sIGZ1bmN0aW9uKGV4cGVjdCwgaSkgewogICAgZXEodG9rc1tpXS50eXBlLCBleHBlY3RbMF0pOwogICAgZXEodG9rc1tpXS5zdHJpbmcsIGV4cGVjdFsxXSk7CiAgfSk7Cn0sIHt2YWx1ZTogIjErMiIsIG1vZGU6ICJqYXZhc2NyaXB0In0pOwoKdGVzdENNKCJnZXRUb2tlblR5cGVBdCIsIGZ1bmN0aW9uKGNtKSB7CiAgZXEoY20uZ2V0VG9rZW5UeXBlQXQoUG9zKDAsIDApKSwgIm51bWJlciIpOwogIGVxKGNtLmdldFRva2VuVHlwZUF0KFBvcygwLCA2KSksICJzdHJpbmciKTsKICBjbS5hZGRPdmVybGF5KHsKICAgIHRva2VuOiBmdW5jdGlvbihzdHJlYW0pIHsKICAgICAgaWYgKHN0cmVhbS5tYXRjaCgiZm9vIikpIHJldHVybiAiZm9vIjsKICAgICAgZWxzZSBzdHJlYW0ubmV4dCgpOwogICAgfQogIH0pOwogIGVxKGJ5Q2xhc3NOYW1lKGNtLmdldFdyYXBwZXJFbGVtZW50KCksICJjbS1mb28iKS5sZW5ndGgsIDEpOwogIGVxKGNtLmdldFRva2VuVHlwZUF0KFBvcygwLCA2KSksICJzdHJpbmciKTsKfSwge3ZhbHVlOiAiMSArICdmb28nIiwgbW9kZTogImphdmFzY3JpcHQifSk7Cgp0ZXN0Q00oInJlc2l6ZUxpbmVXaWRnZXQiLCBmdW5jdGlvbihjbSkgewogIGFkZERvYyhjbSwgMjAwLCAzKTsKICB2YXIgd2lkZ2V0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgicHJlIik7CiAgd2lkZ2V0LmlubmVySFRNTCA9ICJpbXdpZGdldCI7CiAgd2lkZ2V0LnN0eWxlLmJhY2tncm91bmQgPSAieWVsbG93IjsKICBjbS5hZGRMaW5lV2lkZ2V0KDEsIHdpZGdldCwge25vSFNjcm9sbDogdHJ1ZX0pOwogIGNtLnNldFNpemUoNDApOwogIGlzKHdpZGdldC5wYXJlbnROb2RlLm9mZnNldFdpZHRoIDwgNDIpOwp9KTsKCnRlc3RDTSgiY29tYmluZWRPcGVyYXRpb25zIiwgZnVuY3Rpb24oY20pIHsKICB2YXIgcGxhY2UgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidGVzdGdyb3VuZCIpOwogIHZhciBvdGhlciA9IENvZGVNaXJyb3IocGxhY2UsIHt2YWx1ZTogIjEyMyJ9KTsKICB0cnkgewogICAgY20ub3BlcmF0aW9uKGZ1bmN0aW9uKCkgewogICAgICBjbS5hZGRMaW5lQ2xhc3MoMCwgIndyYXAiLCAiZm9vIik7CiAgICAgIG90aGVyLmFkZExpbmVDbGFzcygwLCAid3JhcCIsICJmb28iKTsKICAgIH0pOwogICAgZXEoYnlDbGFzc05hbWUoY20uZ2V0V3JhcHBlckVsZW1lbnQoKSwgImZvbyIpLmxlbmd0aCwgMSk7CiAgICBlcShieUNsYXNzTmFtZShvdGhlci5nZXRXcmFwcGVyRWxlbWVudCgpLCAiZm9vIikubGVuZ3RoLCAxKTsKICAgIGNtLm9wZXJhdGlvbihmdW5jdGlvbigpIHsKICAgICAgY20ucmVtb3ZlTGluZUNsYXNzKDAsICJ3cmFwIiwgImZvbyIpOwogICAgICBvdGhlci5yZW1vdmVMaW5lQ2xhc3MoMCwgIndyYXAiLCAiZm9vIik7CiAgICB9KTsKICAgIGVxKGJ5Q2xhc3NOYW1lKGNtLmdldFdyYXBwZXJFbGVtZW50KCksICJmb28iKS5sZW5ndGgsIDApOwogICAgZXEoYnlDbGFzc05hbWUob3RoZXIuZ2V0V3JhcHBlckVsZW1lbnQoKSwgImZvbyIpLmxlbmd0aCwgMCk7CiAgfSBmaW5hbGx5IHsKICAgIHBsYWNlLnJlbW92ZUNoaWxkKG90aGVyLmdldFdyYXBwZXJFbGVtZW50KCkpOwogIH0KfSwge3ZhbHVlOiAiYWJjIn0pOwoKdGVzdENNKCJldmVudE9yZGVyIiwgZnVuY3Rpb24oY20pIHsKICB2YXIgc2VlbiA9IFtdOwogIGNtLm9uKCJjaGFuZ2UiLCBmdW5jdGlvbigpIHsKICAgIGlmICghc2Vlbi5sZW5ndGgpIGNtLnJlcGxhY2VTZWxlY3Rpb24oIi4iKTsKICAgIHNlZW4ucHVzaCgiY2hhbmdlIik7CiAgfSk7CiAgY20ub24oImN1cnNvckFjdGl2aXR5IiwgZnVuY3Rpb24oKSB7CiAgICBjbS5yZXBsYWNlU2VsZWN0aW9uKCIhIik7CiAgICBzZWVuLnB1c2goImFjdGl2aXR5Iik7CiAgfSk7CiAgY20ucmVwbGFjZVNlbGVjdGlvbigiLyIpOwogIGVxKHNlZW4uam9pbigiLCIpLCAiY2hhbmdlLGNoYW5nZSxhY3Rpdml0eSxjaGFuZ2UiKTsKfSk7Cgp0ZXN0Q00oInNwbGl0U3BhY2VzX25vbnNwZWNpYWwiLCBmdW5jdGlvbihjbSkgewogIGVxKGJ5Q2xhc3NOYW1lKGNtLmdldFdyYXBwZXJFbGVtZW50KCksICJjbS1pbnZhbGlkY2hhciIpLmxlbmd0aCwgMCk7Cn0sIHsKICBzcGVjaWFsQ2hhcnM6IC9bXHUwMGEwXS8sCiAgdmFsdWU6ICJzcGFjZXMgLT4gICAgICAgICAgICA8LSBiZXR3ZWVuIgp9KTsKCnRlc3QoImNvcmVfcm1DbGFzcyIsIGZ1bmN0aW9uKCkgewogIHZhciBub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgbm9kZS5jbGFzc05hbWUgPSAiZm9vLWJhciBiYXotcXV1eCB5YWRkYSI7CiAgQ29kZU1pcnJvci5ybUNsYXNzKG5vZGUsICJxdXV4Iik7CiAgZXEobm9kZS5jbGFzc05hbWUsICJmb28tYmFyIGJhei1xdXV4IHlhZGRhIik7CiAgQ29kZU1pcnJvci5ybUNsYXNzKG5vZGUsICJiYXotcXV1eCIpOwogIGVxKG5vZGUuY2xhc3NOYW1lLCAiZm9vLWJhciB5YWRkYSIpOwogIENvZGVNaXJyb3Iucm1DbGFzcyhub2RlLCAieWFkZGEiKTsKICBlcShub2RlLmNsYXNzTmFtZSwgImZvby1iYXIiKTsKICBDb2RlTWlycm9yLnJtQ2xhc3Mobm9kZSwgImZvby1iYXIiKTsKICBlcShub2RlLmNsYXNzTmFtZSwgIiIpOwogIG5vZGUuY2xhc3NOYW1lID0gIiBmb28gIjsKICBDb2RlTWlycm9yLnJtQ2xhc3Mobm9kZSwgImZvbyIpOwogIGVxKG5vZGUuY2xhc3NOYW1lLCAiIik7Cn0pOwoKdGVzdCgiY29yZV9hZGRDbGFzcyIsIGZ1bmN0aW9uKCkgewogIHZhciBub2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgQ29kZU1pcnJvci5hZGRDbGFzcyhub2RlLCAiYSIpOwogIGVxKG5vZGUuY2xhc3NOYW1lLCAiYSIpOwogIENvZGVNaXJyb3IuYWRkQ2xhc3Mobm9kZSwgImEiKTsKICBlcShub2RlLmNsYXNzTmFtZSwgImEiKTsKICBDb2RlTWlycm9yLmFkZENsYXNzKG5vZGUsICJiIik7CiAgZXEobm9kZS5jbGFzc05hbWUsICJhIGIiKTsKICBDb2RlTWlycm9yLmFkZENsYXNzKG5vZGUsICJhIik7CiAgQ29kZU1pcnJvci5hZGRDbGFzcyhub2RlLCAiYiIpOwogIGVxKG5vZGUuY2xhc3NOYW1lLCAiYSBiIik7Cn0pOwoKdGVzdENNKCJsaW5lU2VwYXJhdG9yIiwgZnVuY3Rpb24oY20pIHsKICBlcShjbS5saW5lQ291bnQoKSwgMyk7CiAgZXEoY20uZ2V0TGluZSgxKSwgImJhclxyIik7CiAgZXEoY20uZ2V0TGluZSgyKSwgImJhelxycXV1eCIpOwogIGNtLnNldE9wdGlvbigibGluZVNlcGFyYXRvciIsICJcciIpOwogIGVxKGNtLmxpbmVDb3VudCgpLCA1KTsKICBlcShjbS5nZXRMaW5lKDQpLCAicXV1eCIpOwogIGVxKGNtLmdldFZhbHVlKCksICJmb29ccmJhclxyXHJiYXpccnF1dXgiKTsKICBlcShjbS5nZXRWYWx1ZSgiXG4iKSwgImZvb1xuYmFyXG5cbmJhelxucXV1eCIpOwogIGNtLnNldE9wdGlvbigibGluZVNlcGFyYXRvciIsIG51bGwpOwogIGNtLnNldFZhbHVlKCJmb29cbmJhclxyXG5iYXpccnF1dXgiKTsKICBlcShjbS5saW5lQ291bnQoKSwgNCk7Cn0sIHt2YWx1ZTogImZvb1xuYmFyXHJcbmJhelxycXV1eCIsCiAgICBsaW5lU2VwYXJhdG9yOiAiXG4ifSk7Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/test/vim_test.js</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[Q29kZU1pcnJvci5WaW0uc3VwcHJlc3NFcnJvckxvZ2dpbmcgPSB0cnVlOwoKdmFyIGNvZGUgPSAnJyArCicgd09yZDEgKCMlXG4nICsKJyB3b3JkM10gXG4nICsKJ2FvcG9wIHBvcCAwIDEgMiAzIDRcbicgKwonIChhKSBbYl0ge2N9IFxuJyArCidpbnQgZ2V0Y2hhcih2b2lkKSB7XG4nICsKJyAgc3RhdGljIGNoYXIgYnVmW0JVRlNJWl07XG4nICsKJyAgc3RhdGljIGNoYXIgKmJ1ZnAgPSBidWY7XG4nICsKJyAgaWYgKG4gPT0gMCkgeyAgLyogYnVmZmVyIGlzIGVtcHR5ICovXG4nICsKJyAgICBuID0gcmVhZCgwLCBidWYsIHNpemVvZiBidWYpO1xuJyArCicgICAgYnVmcCA9IGJ1ZjtcbicgKwonICB9XG4nICsKJ1xuJyArCicgIHJldHVybiAoLS1uID49IDApID8gKHVuc2lnbmVkIGNoYXIpICpidWZwKysgOiBFT0Y7XG4nICsKJyBcbicgKwonfVxuJzsKCnZhciBsaW5lcyA9IChmdW5jdGlvbigpIHsKICBsaW5lVGV4dCA9IGNvZGUuc3BsaXQoJ1xuJyk7CiAgdmFyIHJldCA9IFtdOwogIGZvciAodmFyIGkgPSAwOyBpIDwgbGluZVRleHQubGVuZ3RoOyBpKyspIHsKICAgIHJldFtpXSA9IHsKICAgICAgbGluZTogaSwKICAgICAgbGVuZ3RoOiBsaW5lVGV4dFtpXS5sZW5ndGgsCiAgICAgIGxpbmVUZXh0OiBsaW5lVGV4dFtpXSwKICAgICAgdGV4dFN0YXJ0OiAvXlxzKi8uZXhlYyhsaW5lVGV4dFtpXSlbMF0ubGVuZ3RoCiAgICB9OwogIH0KICByZXR1cm4gcmV0Owp9KSgpOwp2YXIgZW5kT2ZEb2N1bWVudCA9IG1ha2VDdXJzb3IobGluZXMubGVuZ3RoIC0gMSwKICAgIGxpbmVzW2xpbmVzLmxlbmd0aCAtIDFdLmxlbmd0aCk7CnZhciB3b3JkTGluZSA9IGxpbmVzWzBdOwp2YXIgYmlnV29yZExpbmUgPSBsaW5lc1sxXTsKdmFyIGNoYXJMaW5lID0gbGluZXNbMl07CnZhciBicmFjZXNMaW5lID0gbGluZXNbM107CnZhciBzZWVrQnJhY2VMaW5lID0gbGluZXNbNF07Cgp2YXIgd29yZDEgPSB7CiAgc3RhcnQ6IHsgbGluZTogd29yZExpbmUubGluZSwgY2g6IDEgfSwKICBlbmQ6IHsgbGluZTogd29yZExpbmUubGluZSwgY2g6IDUgfQp9Owp2YXIgd29yZDIgPSB7CiAgc3RhcnQ6IHsgbGluZTogd29yZExpbmUubGluZSwgY2g6IHdvcmQxLmVuZC5jaCArIDIgfSwKICBlbmQ6IHsgbGluZTogd29yZExpbmUubGluZSwgY2g6IHdvcmQxLmVuZC5jaCArIDQgfQp9Owp2YXIgd29yZDMgPSB7CiAgc3RhcnQ6IHsgbGluZTogYmlnV29yZExpbmUubGluZSwgY2g6IDEgfSwKICBlbmQ6IHsgbGluZTogYmlnV29yZExpbmUubGluZSwgY2g6IDUgfQp9Owp2YXIgYmlnV29yZDEgPSB3b3JkMTsKdmFyIGJpZ1dvcmQyID0gd29yZDI7CnZhciBiaWdXb3JkMyA9IHsKICBzdGFydDogeyBsaW5lOiBiaWdXb3JkTGluZS5saW5lLCBjaDogMSB9LAogIGVuZDogeyBsaW5lOiBiaWdXb3JkTGluZS5saW5lLCBjaDogNyB9Cn07CnZhciBiaWdXb3JkNCA9IHsKICBzdGFydDogeyBsaW5lOiBiaWdXb3JkTGluZS5saW5lLCBjaDogYmlnV29yZDEuZW5kLmNoICsgMyB9LAogIGVuZDogeyBsaW5lOiBiaWdXb3JkTGluZS5saW5lLCBjaDogYmlnV29yZDEuZW5kLmNoICsgNyB9Cn07Cgp2YXIgb0NoYXJzID0gWyB7IGxpbmU6IGNoYXJMaW5lLmxpbmUsIGNoOiAxIH0sCiAgICB7IGxpbmU6IGNoYXJMaW5lLmxpbmUsIGNoOiAzIH0sCiAgICB7IGxpbmU6IGNoYXJMaW5lLmxpbmUsIGNoOiA3IH0gXTsKdmFyIHBDaGFycyA9IFsgeyBsaW5lOiBjaGFyTGluZS5saW5lLCBjaDogMiB9LAogICAgeyBsaW5lOiBjaGFyTGluZS5saW5lLCBjaDogNCB9LAogICAgeyBsaW5lOiBjaGFyTGluZS5saW5lLCBjaDogNiB9LAogICAgeyBsaW5lOiBjaGFyTGluZS5saW5lLCBjaDogOCB9IF07CnZhciBudW1DaGFycyA9IFsgeyBsaW5lOiBjaGFyTGluZS5saW5lLCBjaDogMTAgfSwKICAgIHsgbGluZTogY2hhckxpbmUubGluZSwgY2g6IDEyIH0sCiAgICB7IGxpbmU6IGNoYXJMaW5lLmxpbmUsIGNoOiAxNCB9LAogICAgeyBsaW5lOiBjaGFyTGluZS5saW5lLCBjaDogMTYgfSwKICAgIHsgbGluZTogY2hhckxpbmUubGluZSwgY2g6IDE4IH1dOwp2YXIgcGFyZW5zMSA9IHsKICBzdGFydDogeyBsaW5lOiBicmFjZXNMaW5lLmxpbmUsIGNoOiAxIH0sCiAgZW5kOiB7IGxpbmU6IGJyYWNlc0xpbmUubGluZSwgY2g6IDMgfQp9Owp2YXIgc3F1YXJlczEgPSB7CiAgc3RhcnQ6IHsgbGluZTogYnJhY2VzTGluZS5saW5lLCBjaDogNSB9LAogIGVuZDogeyBsaW5lOiBicmFjZXNMaW5lLmxpbmUsIGNoOiA3IH0KfTsKdmFyIGN1cmx5czEgPSB7CiAgc3RhcnQ6IHsgbGluZTogYnJhY2VzTGluZS5saW5lLCBjaDogOSB9LAogIGVuZDogeyBsaW5lOiBicmFjZXNMaW5lLmxpbmUsIGNoOiAxMSB9Cn07CnZhciBzZWVrT3V0c2lkZSA9IHsKICBzdGFydDogeyBsaW5lOiBzZWVrQnJhY2VMaW5lLmxpbmUsIGNoOiAxIH0sCiAgZW5kOiB7IGxpbmU6IHNlZWtCcmFjZUxpbmUubGluZSwgY2g6IDE2IH0KfTsKdmFyIHNlZWtJbnNpZGUgPSB7CiAgc3RhcnQ6IHsgbGluZTogc2Vla0JyYWNlTGluZS5saW5lLCBjaDogMTQgfSwKICBlbmQ6IHsgbGluZTogc2Vla0JyYWNlTGluZS5saW5lLCBjaDogMTEgfQp9OwoKZnVuY3Rpb24gY29weUN1cnNvcihjdXIpIHsKICByZXR1cm4geyBjaDogY3VyLmNoLCBsaW5lOiBjdXIubGluZSB9Owp9CgpmdW5jdGlvbiBmb3JFYWNoKGFyciwgZnVuYykgewogIGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7CiAgICBmdW5jKGFycltpXSwgaSwgYXJyKTsKICB9Cn0KCmZ1bmN0aW9uIHRlc3RWaW0obmFtZSwgcnVuLCBvcHRzLCBleHBlY3RlZEZhaWwpIHsKICB2YXIgdmltT3B0cyA9IHsKICAgIGxpbmVOdW1iZXJzOiB0cnVlLAogICAgdmltTW9kZTogdHJ1ZSwKICAgIHNob3dDdXJzb3JXaGVuU2VsZWN0aW5nOiB0cnVlLAogICAgdmFsdWU6IGNvZGUKICB9OwogIGZvciAodmFyIHByb3AgaW4gb3B0cykgewogICAgaWYgKG9wdHMuaGFzT3duUHJvcGVydHkocHJvcCkpIHsKICAgICAgdmltT3B0c1twcm9wXSA9IG9wdHNbcHJvcF07CiAgICB9CiAgfQogIHJldHVybiB0ZXN0KCd2aW1fJyArIG5hbWUsIGZ1bmN0aW9uKCkgewogICAgdmFyIHBsYWNlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRlc3Rncm91bmQiKTsKICAgIHZhciBjbSA9IENvZGVNaXJyb3IocGxhY2UsIHZpbU9wdHMpOwogICAgdmFyIHZpbSA9IENvZGVNaXJyb3IuVmltLm1heWJlSW5pdFZpbVN0YXRlXyhjbSk7CgogICAgZnVuY3Rpb24gZG9LZXlzRm4oY20pIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKGFyZ3MpIHsKICAgICAgICBpZiAoYXJncyBpbnN0YW5jZW9mIEFycmF5KSB7CiAgICAgICAgICBhcmd1bWVudHMgPSBhcmdzOwogICAgICAgIH0KICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgdmFyIHJlc3VsdCA9IENvZGVNaXJyb3IuVmltLmhhbmRsZUtleShjbSwgYXJndW1lbnRzW2ldKTsKICAgICAgICAgIGlmICghcmVzdWx0ICYmIGNtLnN0YXRlLnZpbS5pbnNlcnRNb2RlKSB7CiAgICAgICAgICAgIGNtLnJlcGxhY2VTZWxlY3Rpb25zKGZpbGxBcnJheShhcmd1bWVudHNbaV0sIGNtLmxpc3RTZWxlY3Rpb25zKCkubGVuZ3RoKSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBkb0luc2VydE1vZGVLZXlzRm4oY20pIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKGFyZ3MpIHsKICAgICAgICBpZiAoYXJncyBpbnN0YW5jZW9mIEFycmF5KSB7IGFyZ3VtZW50cyA9IGFyZ3M7IH0KICAgICAgICBmdW5jdGlvbiBleGVjdXRlSGFuZGxlcihoYW5kbGVyKSB7CiAgICAgICAgICBpZiAodHlwZW9mIGhhbmRsZXIgPT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgQ29kZU1pcnJvci5jb21tYW5kc1toYW5kbGVyXShjbSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBoYW5kbGVyKGNtKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgdmFyIGtleSA9IGFyZ3VtZW50c1tpXTsKICAgICAgICAgIC8vIEZpbmQga2V5IGluIGtleW1hcCBhbmQgaGFuZGxlLgogICAgICAgICAgdmFyIGhhbmRsZWQgPSBDb2RlTWlycm9yLmxvb2t1cEtleShrZXksIGNtLmdldE9wdGlvbigna2V5TWFwJyksIGV4ZWN1dGVIYW5kbGVyLCBjbSk7CiAgICAgICAgICAvLyBSZWNvcmQgZm9yIGluc2VydCBtb2RlLgogICAgICAgICAgaWYgKGhhbmRsZWQgPT0gImhhbmRsZWQiICYmIGNtLnN0YXRlLnZpbS5pbnNlcnRNb2RlICYmIGFyZ3VtZW50c1tpXSAhPSAnRXNjJykgewogICAgICAgICAgICB2YXIgbGFzdENoYW5nZSA9IENvZGVNaXJyb3IuVmltLmdldFZpbUdsb2JhbFN0YXRlXygpLm1hY3JvTW9kZVN0YXRlLmxhc3RJbnNlcnRNb2RlQ2hhbmdlczsKICAgICAgICAgICAgaWYgKGxhc3RDaGFuZ2UgJiYgKGtleS5pbmRleE9mKCdEZWxldGUnKSAhPSAtMSB8fCBrZXkuaW5kZXhPZignQmFja3NwYWNlJykgIT0gLTEpKSB7CiAgICAgICAgICAgICAgbGFzdENoYW5nZS5jaGFuZ2VzLnB1c2gobmV3IENvZGVNaXJyb3IuVmltLkluc2VydE1vZGVLZXkoa2V5KSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGRvRXhGbihjbSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oY29tbWFuZCkgewogICAgICAgIGNtLm9wZW5EaWFsb2cgPSBoZWxwZXJzLmZha2VPcGVuRGlhbG9nKGNvbW1hbmQpOwogICAgICAgIGhlbHBlcnMuZG9LZXlzKCc6Jyk7CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGFzc2VydEN1cnNvckF0Rm4oY20pIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKGxpbmUsIGNoKSB7CiAgICAgICAgdmFyIHBvczsKICAgICAgICBpZiAoY2ggPT0gbnVsbCAmJiB0eXBlb2YgbGluZS5saW5lID09ICdudW1iZXInKSB7CiAgICAgICAgICBwb3MgPSBsaW5lOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBwb3MgPSBtYWtlQ3Vyc29yKGxpbmUsIGNoKTsKICAgICAgICB9CiAgICAgICAgZXFQb3MocG9zLCBjbS5nZXRDdXJzb3IoKSk7CiAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGZha2VPcGVuRGlhbG9nKHJlc3VsdCkgewogICAgICByZXR1cm4gZnVuY3Rpb24odGV4dCwgY2FsbGJhY2spIHsKICAgICAgICByZXR1cm4gY2FsbGJhY2socmVzdWx0KTsKICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gZmFrZU9wZW5Ob3RpZmljYXRpb24obWF0Y2hlcikgewogICAgICByZXR1cm4gZnVuY3Rpb24odGV4dCkgewogICAgICAgIG1hdGNoZXIodGV4dCk7CiAgICAgIH0KICAgIH0KICAgIHZhciBoZWxwZXJzID0gewogICAgICBkb0tleXM6IGRvS2V5c0ZuKGNtKSwKICAgICAgLy8gV2FybmluZzogT25seSBlbXVsYXRlcyBrZXltYXAgZXZlbnRzLCBub3QgY2hhcmFjdGVyIGluc2VydGlvbnMuIFVzZQogICAgICAvLyByZXBsYWNlUmFuZ2UgdG8gc2ltdWxhdGUgY2hhcmFjdGVyIGluc2VydGlvbnMuCiAgICAgIC8vIEtleXMgYXJlIGluIENvZGVNaXJyb3IgZm9ybWF0LCBOT1QgdmltIGZvcm1hdC4KICAgICAgZG9JbnNlcnRNb2RlS2V5czogZG9JbnNlcnRNb2RlS2V5c0ZuKGNtKSwKICAgICAgZG9FeDogZG9FeEZuKGNtKSwKICAgICAgYXNzZXJ0Q3Vyc29yQXQ6IGFzc2VydEN1cnNvckF0Rm4oY20pLAogICAgICBmYWtlT3BlbkRpYWxvZzogZmFrZU9wZW5EaWFsb2csCiAgICAgIGZha2VPcGVuTm90aWZpY2F0aW9uOiBmYWtlT3Blbk5vdGlmaWNhdGlvbiwKICAgICAgZ2V0UmVnaXN0ZXJDb250cm9sbGVyOiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gQ29kZU1pcnJvci5WaW0uZ2V0UmVnaXN0ZXJDb250cm9sbGVyKCk7CiAgICAgIH0KICAgIH0KICAgIENvZGVNaXJyb3IuVmltLnJlc2V0VmltR2xvYmFsU3RhdGVfKCk7CiAgICB2YXIgc3VjY2Vzc2Z1bCA9IGZhbHNlOwogICAgdmFyIHNhdmVkT3Blbk5vdGlmaWNhdGlvbiA9IGNtLm9wZW5Ob3RpZmljYXRpb247CiAgICB2YXIgc2F2ZWRPcGVuRGlhbG9nID0gY20ub3BlbkRpYWxvZzsKICAgIHRyeSB7CiAgICAgIHJ1bihjbSwgdmltLCBoZWxwZXJzKTsKICAgICAgc3VjY2Vzc2Z1bCA9IHRydWU7CiAgICB9IGZpbmFsbHkgewogICAgICBjbS5vcGVuTm90aWZpY2F0aW9uID0gc2F2ZWRPcGVuTm90aWZpY2F0aW9uOwogICAgICBjbS5vcGVuRGlhbG9nID0gc2F2ZWRPcGVuRGlhbG9nOwogICAgICBpZiAoIXN1Y2Nlc3NmdWwgfHwgdmVyYm9zZSkgewogICAgICAgIHBsYWNlLnN0eWxlLnZpc2liaWxpdHkgPSAidmlzaWJsZSI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcGxhY2UucmVtb3ZlQ2hpbGQoY20uZ2V0V3JhcHBlckVsZW1lbnQoKSk7CiAgICAgIH0KICAgIH0KICB9LCBleHBlY3RlZEZhaWwpOwp9Owp0ZXN0VmltKCdxcUBxJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygncScsICdxJywgJ2wnLCAnbCcsICdxJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLDIpOwogIGhlbHBlcnMuZG9LZXlzKCdAJywgJ3EnKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsNCk7Cn0sIHsgdmFsdWU6ICcgICAgICAgICAgICAnfSk7CnRlc3RWaW0oJ0BAJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygncScsICdxJywgJ2wnLCAnbCcsICdxJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLDIpOwogIGhlbHBlcnMuZG9LZXlzKCdAJywgJ3EnKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsNCk7CiAgaGVscGVycy5kb0tleXMoJ0AnLCAnQCcpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCw2KTsKfSwgeyB2YWx1ZTogJyAgICAgICAgICAgICd9KTsKdmFyIGp1bXBsaXN0U2NlbmUgPSAnJysKICAnd29yZFxuJysKICAnKHdvcmQpXG4nKwogICd7d29yZFxuJysKICAnd29yZC5cbicrCiAgJ1xuJysKICAnd29yZCBzZWFyY2hcbicrCiAgJ313b3JkXG4nKwogICd3b3JkXG4nKwogICd3b3JkXG4nOwpmdW5jdGlvbiB0ZXN0SnVtcGxpc3QobmFtZSwga2V5cywgZW5kUG9zLCBzdGFydFBvcywgZGlhbG9nKSB7CiAgZW5kUG9zID0gbWFrZUN1cnNvcihlbmRQb3NbMF0sIGVuZFBvc1sxXSk7CiAgc3RhcnRQb3MgPSBtYWtlQ3Vyc29yKHN0YXJ0UG9zWzBdLCBzdGFydFBvc1sxXSk7CiAgdGVzdFZpbShuYW1lLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgICBDb2RlTWlycm9yLlZpbS5yZXNldFZpbUdsb2JhbFN0YXRlXygpOwogICAgaWYoZGlhbG9nKWNtLm9wZW5EaWFsb2cgPSBoZWxwZXJzLmZha2VPcGVuRGlhbG9nKCd3b3JkJyk7CiAgICBjbS5zZXRDdXJzb3Ioc3RhcnRQb3MpOwogICAgaGVscGVycy5kb0tleXMuYXBwbHkobnVsbCwga2V5cyk7CiAgICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KGVuZFBvcyk7CiAgfSwge3ZhbHVlOiBqdW1wbGlzdFNjZW5lfSk7Cn07CnRlc3RKdW1wbGlzdCgnanVtcGxpc3RfSCcsIFsnSCcsICc8Qy1vPiddLCBbNSwyXSwgWzUsMl0pOwp0ZXN0SnVtcGxpc3QoJ2p1bXBsaXN0X00nLCBbJ00nLCAnPEMtbz4nXSwgWzIsMl0sIFsyLDJdKTsKdGVzdEp1bXBsaXN0KCdqdW1wbGlzdF9MJywgWydMJywgJzxDLW8+J10sIFsyLDJdLCBbMiwyXSk7CnRlc3RKdW1wbGlzdCgnanVtcGxpc3RfW1snLCBbJ1snLCAnWycsICc8Qy1vPiddLCBbNSwyXSwgWzUsMl0pOwp0ZXN0SnVtcGxpc3QoJ2p1bXBsaXN0X11dJywgWyddJywgJ10nLCAnPEMtbz4nXSwgWzIsMl0sIFsyLDJdKTsKdGVzdEp1bXBsaXN0KCdqdW1wbGlzdF9HJywgWydHJywgJzxDLW8+J10sIFs1LDJdLCBbNSwyXSk7CnRlc3RKdW1wbGlzdCgnanVtcGxpc3RfZ2cnLCBbJ2cnLCAnZycsICc8Qy1vPiddLCBbNSwyXSwgWzUsMl0pOwp0ZXN0SnVtcGxpc3QoJ2p1bXBsaXN0XyUnLCBbJyUnLCAnPEMtbz4nXSwgWzEsNV0sIFsxLDVdKTsKdGVzdEp1bXBsaXN0KCdqdW1wbGlzdF97JywgWyd7JywgJzxDLW8+J10sIFsxLDVdLCBbMSw1XSk7CnRlc3RKdW1wbGlzdCgnanVtcGxpc3RffScsIFsnfScsICc8Qy1vPiddLCBbMSw1XSwgWzEsNV0pOwp0ZXN0SnVtcGxpc3QoJ2p1bXBsaXN0X1wnJywgWydtJywgJ2EnLCAnaCcsICdcJycsICdhJywgJ2gnLCAnPEMtaT4nXSwgWzEsMF0sIFsxLDVdKTsKdGVzdEp1bXBsaXN0KCdqdW1wbGlzdF9gJywgWydtJywgJ2EnLCAnaCcsICdgJywgJ2EnLCAnaCcsICc8Qy1pPiddLCBbMSw1XSwgWzEsNV0pOwp0ZXN0SnVtcGxpc3QoJ2p1bXBsaXN0XypfY2FjaGVkQ3Vyc29yJywgWycqJywgJzxDLW8+J10sIFsxLDNdLCBbMSwzXSk7CnRlc3RKdW1wbGlzdCgnanVtcGxpc3RfI19jYWNoZWRDdXJzb3InLCBbJyMnLCAnPEMtbz4nXSwgWzEsM10sIFsxLDNdKTsKdGVzdEp1bXBsaXN0KCdqdW1wbGlzdF9uJywgWycjJywgJ24nLCAnPEMtbz4nXSwgWzEsMV0sIFsyLDNdKTsKdGVzdEp1bXBsaXN0KCdqdW1wbGlzdF9OJywgWycjJywgJ04nLCAnPEMtbz4nXSwgWzEsMV0sIFsyLDNdKTsKdGVzdEp1bXBsaXN0KCdqdW1wbGlzdF9yZXBlYXRfPGMtbz4nLCBbJyonLCAnKicsICcqJywgJzMnLCAnPEMtbz4nXSwgWzIsM10sIFsyLDNdKTsKdGVzdEp1bXBsaXN0KCdqdW1wbGlzdF9yZXBlYXRfPGMtaT4nLCBbJyonLCAnKicsICcqJywgJzMnLCAnPEMtbz4nLCAnMicsICc8Qy1pPiddLCBbNSwwXSwgWzIsM10pOwp0ZXN0SnVtcGxpc3QoJ2p1bXBsaXN0X3JlcGVhdGVkX21vdGlvbicsIFsnMycsICcqJywgJzxDLW8+J10sIFsyLDNdLCBbMiwzXSk7CnRlc3RKdW1wbGlzdCgnanVtcGxpc3RfLycsIFsnLycsICc8Qy1vPiddLCBbMiwzXSwgWzIsM10sICdkaWFsb2cnKTsKdGVzdEp1bXBsaXN0KCdqdW1wbGlzdF8/JywgWyc/JywgJzxDLW8+J10sIFsyLDNdLCBbMiwzXSwgJ2RpYWxvZycpOwp0ZXN0SnVtcGxpc3QoJ2p1bXBsaXN0X3NraXBfZGVsZXRlZF9tYXJrPGMtbz4nLAogICAgICAgICAgICAgWycqJywgJ24nLCAnbicsICdrJywgJ2QnLCAnaycsICc8Qy1vPicsICc8Qy1vPicsICc8Qy1vPiddLAogICAgICAgICAgICAgWzAsMl0sIFswLDJdKTsKdGVzdEp1bXBsaXN0KCdqdW1wbGlzdF9za2lwX2RlbGV0ZWRfbWFyazxjLWk+JywKICAgICAgICAgICAgIFsnKicsICduJywgJ24nLCAnaycsICdkJywgJ2snLCAnPEMtbz4nLCAnPEMtaT4nLCAnPEMtaT4nXSwKICAgICAgICAgICAgIFsxLDBdLCBbMCwyXSk7CgovKioKICogQHBhcmFtIG5hbWUgTmFtZSBvZiB0aGUgdGVzdAogKiBAcGFyYW0ga2V5cyBBbiBhcnJheSBvZiBrZXlzIG9yIGEgc3RyaW5nIHdpdGggYSBzaW5nbGUga2V5IHRvIHNpbXVsYXRlLgogKiBAcGFyYW0gZW5kUG9zIFRoZSBleHBlY3RlZCBlbmQgcG9zaXRpb24gb2YgdGhlIGN1cnNvci4KICogQHBhcmFtIHN0YXJ0UG9zIFRoZSBwb3NpdGlvbiB0aGUgY3Vyc29yIHNob3VsZCBzdGFydCBhdCwgZGVmYXVsdHMgdG8gMCwgMC4KICovCmZ1bmN0aW9uIHRlc3RNb3Rpb24obmFtZSwga2V5cywgZW5kUG9zLCBzdGFydFBvcykgewogIHRlc3RWaW0obmFtZSwgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogICAgaWYgKCFzdGFydFBvcykgewogICAgICBzdGFydFBvcyA9IHsgbGluZTogMCwgY2g6IDAgfTsKICAgIH0KICAgIGNtLnNldEN1cnNvcihzdGFydFBvcyk7CiAgICBoZWxwZXJzLmRvS2V5cyhrZXlzKTsKICAgIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoZW5kUG9zKTsKICB9KTsKfTsKCmZ1bmN0aW9uIG1ha2VDdXJzb3IobGluZSwgY2gpIHsKICByZXR1cm4geyBsaW5lOiBsaW5lLCBjaDogY2ggfTsKfTsKCmZ1bmN0aW9uIG9mZnNldEN1cnNvcihjdXIsIG9mZnNldExpbmUsIG9mZnNldENoKSB7CiAgcmV0dXJuIHsgbGluZTogY3VyLmxpbmUgKyBvZmZzZXRMaW5lLCBjaDogY3VyLmNoICsgb2Zmc2V0Q2ggfTsKfTsKCi8vIE1vdGlvbiB0ZXN0cwp0ZXN0TW90aW9uKCd8JywgJ3wnLCBtYWtlQ3Vyc29yKDAsIDApLCBtYWtlQ3Vyc29yKDAsNCkpOwp0ZXN0TW90aW9uKCd8X3JlcGVhdCcsIFsnMycsICd8J10sIG1ha2VDdXJzb3IoMCwgMiksIG1ha2VDdXJzb3IoMCw0KSk7CnRlc3RNb3Rpb24oJ2gnLCAnaCcsIG1ha2VDdXJzb3IoMCwgMCksIHdvcmQxLnN0YXJ0KTsKdGVzdE1vdGlvbignaF9yZXBlYXQnLCBbJzMnLCAnaCddLCBvZmZzZXRDdXJzb3Iod29yZDEuZW5kLCAwLCAtMyksIHdvcmQxLmVuZCk7CnRlc3RNb3Rpb24oJ2wnLCAnbCcsIG1ha2VDdXJzb3IoMCwgMSkpOwp0ZXN0TW90aW9uKCdsX3JlcGVhdCcsIFsnMicsICdsJ10sIG1ha2VDdXJzb3IoMCwgMikpOwp0ZXN0TW90aW9uKCdqJywgJ2onLCBvZmZzZXRDdXJzb3Iod29yZDEuZW5kLCAxLCAwKSwgd29yZDEuZW5kKTsKdGVzdE1vdGlvbignal9yZXBlYXQnLCBbJzInLCAnaiddLCBvZmZzZXRDdXJzb3Iod29yZDEuZW5kLCAyLCAwKSwgd29yZDEuZW5kKTsKdGVzdE1vdGlvbignal9yZXBlYXRfY2xpcCcsIFsnMTAwMCcsICdqJ10sIGVuZE9mRG9jdW1lbnQpOwp0ZXN0TW90aW9uKCdrJywgJ2snLCBvZmZzZXRDdXJzb3Iod29yZDMuZW5kLCAtMSwgMCksIHdvcmQzLmVuZCk7CnRlc3RNb3Rpb24oJ2tfcmVwZWF0JywgWycyJywgJ2snXSwgbWFrZUN1cnNvcigwLCA0KSwgbWFrZUN1cnNvcigyLCA0KSk7CnRlc3RNb3Rpb24oJ2tfcmVwZWF0X2NsaXAnLCBbJzEwMDAnLCAnayddLCBtYWtlQ3Vyc29yKDAsIDQpLCBtYWtlQ3Vyc29yKDIsIDQpKTsKdGVzdE1vdGlvbigndycsICd3Jywgd29yZDEuc3RhcnQpOwp0ZXN0TW90aW9uKCd3X211bHRpcGxlX25ld2xpbmVzX25vX3NwYWNlJywgJ3cnLCBtYWtlQ3Vyc29yKDEyLCAyKSwgbWFrZUN1cnNvcigxMSwgMikpOwp0ZXN0TW90aW9uKCd3X211bHRpcGxlX25ld2xpbmVzX3dpdGhfc3BhY2UnLCAndycsIG1ha2VDdXJzb3IoMTQsIDApLCBtYWtlQ3Vyc29yKDEyLCA1MSkpOwp0ZXN0TW90aW9uKCd3X3JlcGVhdCcsIFsnMicsICd3J10sIHdvcmQyLnN0YXJ0KTsKdGVzdE1vdGlvbignd193cmFwJywgWyd3J10sIHdvcmQzLnN0YXJ0LCB3b3JkMi5zdGFydCk7CnRlc3RNb3Rpb24oJ3dfZW5kT2ZEb2N1bWVudCcsICd3JywgZW5kT2ZEb2N1bWVudCwgZW5kT2ZEb2N1bWVudCk7CnRlc3RNb3Rpb24oJ3dfc3RhcnRfdG9fZW5kJywgWycxMDAwJywgJ3cnXSwgZW5kT2ZEb2N1bWVudCwgbWFrZUN1cnNvcigwLCAwKSk7CnRlc3RNb3Rpb24oJ1cnLCAnVycsIGJpZ1dvcmQxLnN0YXJ0KTsKdGVzdE1vdGlvbignV19yZXBlYXQnLCBbJzInLCAnVyddLCBiaWdXb3JkMy5zdGFydCwgYmlnV29yZDEuc3RhcnQpOwp0ZXN0TW90aW9uKCdlJywgJ2UnLCB3b3JkMS5lbmQpOwp0ZXN0TW90aW9uKCdlX3JlcGVhdCcsIFsnMicsICdlJ10sIHdvcmQyLmVuZCk7CnRlc3RNb3Rpb24oJ2Vfd3JhcCcsICdlJywgd29yZDMuZW5kLCB3b3JkMi5lbmQpOwp0ZXN0TW90aW9uKCdlX2VuZE9mRG9jdW1lbnQnLCAnZScsIGVuZE9mRG9jdW1lbnQsIGVuZE9mRG9jdW1lbnQpOwp0ZXN0TW90aW9uKCdlX3N0YXJ0X3RvX2VuZCcsIFsnMTAwMCcsICdlJ10sIGVuZE9mRG9jdW1lbnQsIG1ha2VDdXJzb3IoMCwgMCkpOwp0ZXN0TW90aW9uKCdiJywgJ2InLCB3b3JkMy5zdGFydCwgd29yZDMuZW5kKTsKdGVzdE1vdGlvbignYl9yZXBlYXQnLCBbJzInLCAnYiddLCB3b3JkMi5zdGFydCwgd29yZDMuZW5kKTsKdGVzdE1vdGlvbignYl93cmFwJywgJ2InLCB3b3JkMi5zdGFydCwgd29yZDMuc3RhcnQpOwp0ZXN0TW90aW9uKCdiX3N0YXJ0T2ZEb2N1bWVudCcsICdiJywgbWFrZUN1cnNvcigwLCAwKSwgbWFrZUN1cnNvcigwLCAwKSk7CnRlc3RNb3Rpb24oJ2JfZW5kX3RvX3N0YXJ0JywgWycxMDAwJywgJ2InXSwgbWFrZUN1cnNvcigwLCAwKSwgZW5kT2ZEb2N1bWVudCk7CnRlc3RNb3Rpb24oJ2dlJywgWydnJywgJ2UnXSwgd29yZDIuZW5kLCB3b3JkMy5lbmQpOwp0ZXN0TW90aW9uKCdnZV9yZXBlYXQnLCBbJzInLCAnZycsICdlJ10sIHdvcmQxLmVuZCwgd29yZDMuc3RhcnQpOwp0ZXN0TW90aW9uKCdnZV93cmFwJywgWydnJywgJ2UnXSwgd29yZDIuZW5kLCB3b3JkMy5zdGFydCk7CnRlc3RNb3Rpb24oJ2dlX3N0YXJ0T2ZEb2N1bWVudCcsIFsnZycsICdlJ10sIG1ha2VDdXJzb3IoMCwgMCksCiAgICBtYWtlQ3Vyc29yKDAsIDApKTsKdGVzdE1vdGlvbignZ2VfZW5kX3RvX3N0YXJ0JywgWycxMDAwJywgJ2cnLCAnZSddLCBtYWtlQ3Vyc29yKDAsIDApLCBlbmRPZkRvY3VtZW50KTsKdGVzdE1vdGlvbignZ2cnLCBbJ2cnLCAnZyddLCBtYWtlQ3Vyc29yKGxpbmVzWzBdLmxpbmUsIGxpbmVzWzBdLnRleHRTdGFydCksCiAgICBtYWtlQ3Vyc29yKDMsIDEpKTsKdGVzdE1vdGlvbignZ2dfcmVwZWF0JywgWyczJywgJ2cnLCAnZyddLAogICAgbWFrZUN1cnNvcihsaW5lc1syXS5saW5lLCBsaW5lc1syXS50ZXh0U3RhcnQpKTsKdGVzdE1vdGlvbignRycsICdHJywKICAgIG1ha2VDdXJzb3IobGluZXNbbGluZXMubGVuZ3RoIC0gMV0ubGluZSwgbGluZXNbbGluZXMubGVuZ3RoIC0gMV0udGV4dFN0YXJ0KSwKICAgIG1ha2VDdXJzb3IoMywgMSkpOwp0ZXN0TW90aW9uKCdHX3JlcGVhdCcsIFsnMycsICdHJ10sIG1ha2VDdXJzb3IobGluZXNbMl0ubGluZSwKICAgIGxpbmVzWzJdLnRleHRTdGFydCkpOwovLyBUT0RPOiBNYWtlIHRoZSB0ZXN0IGNvZGUgbG9uZyBlbm91Z2ggdG8gdGVzdCBDdHJsLUYgYW5kIEN0cmwtQi4KdGVzdE1vdGlvbignMCcsICcwJywgbWFrZUN1cnNvcigwLCAwKSwgbWFrZUN1cnNvcigwLCA4KSk7CnRlc3RNb3Rpb24oJ14nLCAnXicsIG1ha2VDdXJzb3IoMCwgbGluZXNbMF0udGV4dFN0YXJ0KSwgbWFrZUN1cnNvcigwLCA4KSk7CnRlc3RNb3Rpb24oJysnLCAnKycsIG1ha2VDdXJzb3IoMSwgbGluZXNbMV0udGV4dFN0YXJ0KSwgbWFrZUN1cnNvcigwLCA4KSk7CnRlc3RNb3Rpb24oJy0nLCAnLScsIG1ha2VDdXJzb3IoMCwgbGluZXNbMF0udGV4dFN0YXJ0KSwgbWFrZUN1cnNvcigxLCA0KSk7CnRlc3RNb3Rpb24oJ18nLCBbJzYnLCdfJ10sIG1ha2VDdXJzb3IoNSwgbGluZXNbNV0udGV4dFN0YXJ0KSwgbWFrZUN1cnNvcigwLCA4KSk7CnRlc3RNb3Rpb24oJyQnLCAnJCcsIG1ha2VDdXJzb3IoMCwgbGluZXNbMF0ubGVuZ3RoIC0gMSksIG1ha2VDdXJzb3IoMCwgMSkpOwp0ZXN0TW90aW9uKCckX3JlcGVhdCcsIFsnMicsICckJ10sIG1ha2VDdXJzb3IoMSwgbGluZXNbMV0ubGVuZ3RoIC0gMSksCiAgICBtYWtlQ3Vyc29yKDAsIDMpKTsKdGVzdE1vdGlvbignZicsIFsnZicsICdwJ10sIHBDaGFyc1swXSwgbWFrZUN1cnNvcihjaGFyTGluZS5saW5lLCAwKSk7CnRlc3RNb3Rpb24oJ2ZfcmVwZWF0JywgWycyJywgJ2YnLCAncCddLCBwQ2hhcnNbMl0sIHBDaGFyc1swXSk7CnRlc3RNb3Rpb24oJ2ZfbnVtJywgWydmJywgJzInXSwgbnVtQ2hhcnNbMl0sIG1ha2VDdXJzb3IoY2hhckxpbmUubGluZSwgMCkpOwp0ZXN0TW90aW9uKCd0JywgWyd0JywncCddLCBvZmZzZXRDdXJzb3IocENoYXJzWzBdLCAwLCAtMSksCiAgICBtYWtlQ3Vyc29yKGNoYXJMaW5lLmxpbmUsIDApKTsKdGVzdE1vdGlvbigndF9yZXBlYXQnLCBbJzInLCAndCcsICdwJ10sIG9mZnNldEN1cnNvcihwQ2hhcnNbMl0sIDAsIC0xKSwKICAgIHBDaGFyc1swXSk7CnRlc3RNb3Rpb24oJ0YnLCBbJ0YnLCAncCddLCBwQ2hhcnNbMF0sIHBDaGFyc1sxXSk7CnRlc3RNb3Rpb24oJ0ZfcmVwZWF0JywgWycyJywgJ0YnLCAncCddLCBwQ2hhcnNbMF0sIHBDaGFyc1syXSk7CnRlc3RNb3Rpb24oJ1QnLCBbJ1QnLCAncCddLCBvZmZzZXRDdXJzb3IocENoYXJzWzBdLCAwLCAxKSwgcENoYXJzWzFdKTsKdGVzdE1vdGlvbignVF9yZXBlYXQnLCBbJzInLCAnVCcsICdwJ10sIG9mZnNldEN1cnNvcihwQ2hhcnNbMF0sIDAsIDEpLCBwQ2hhcnNbMl0pOwp0ZXN0TW90aW9uKCclX3BhcmVucycsIFsnJSddLCBwYXJlbnMxLmVuZCwgcGFyZW5zMS5zdGFydCk7CnRlc3RNb3Rpb24oJyVfc3F1YXJlcycsIFsnJSddLCBzcXVhcmVzMS5lbmQsIHNxdWFyZXMxLnN0YXJ0KTsKdGVzdE1vdGlvbignJV9icmFjZXMnLCBbJyUnXSwgY3VybHlzMS5lbmQsIGN1cmx5czEuc3RhcnQpOwp0ZXN0TW90aW9uKCclX3NlZWtfb3V0c2lkZScsIFsnJSddLCBzZWVrT3V0c2lkZS5lbmQsIHNlZWtPdXRzaWRlLnN0YXJ0KTsKdGVzdE1vdGlvbignJV9zZWVrX2luc2lkZScsIFsnJSddLCBzZWVrSW5zaWRlLmVuZCwgc2Vla0luc2lkZS5zdGFydCk7CnRlc3RWaW0oJyVfc2Vla19za2lwJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLDApOwogIGhlbHBlcnMuZG9LZXlzKFsnJSddKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsOSk7Cn0sIHt2YWx1ZTonMDEyMzQiKCIoKSd9KTsKdGVzdFZpbSgnJV9za2lwX3N0cmluZycsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwwKTsKICBoZWxwZXJzLmRvS2V5cyhbJyUnXSk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLDQpOwogIGNtLnNldEN1cnNvcigwLDIpOwogIGhlbHBlcnMuZG9LZXlzKFsnJSddKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsMCk7Cn0sIHt2YWx1ZTonKCIpIiknfSk7CnRlc3RWaW0oJyVfc2tpcF9jb21tZW50JywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLDApOwogIGhlbHBlcnMuZG9LZXlzKFsnJSddKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsNik7CiAgY20uc2V0Q3Vyc29yKDAsMyk7CiAgaGVscGVycy5kb0tleXMoWyclJ10pOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwwKTsKfSwge3ZhbHVlOicoLyopKi8pJ30pOwovLyBNYWtlIHN1cmUgdGhhdCBtb3ZpbmcgZG93biBhZnRlciBnb2luZyB0byB0aGUgZW5kIG9mIGEgbGluZSBhbHdheXMgbGVhdmVzIHlvdQovLyBhdCB0aGUgZW5kIG9mIGEgbGluZSwgYnV0IHByZXNlcnZlcyB0aGUgb2Zmc2V0IGluIG90aGVyIGNhc2VzCnRlc3RWaW0oJ0NoYW5naW5nIGxpbmVzIGFmdGVyIEVvbCBvcGVyYXRpb24nLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsMCk7CiAgaGVscGVycy5kb0tleXMoWyckJ10pOwogIGhlbHBlcnMuZG9LZXlzKFsnaiddKTsKICAvLyBBZnRlciBtb3ZpbmcgdG8gRW9sIGFuZCB0aGVuIGRvd24sIHdlIHNob3VsZCBiZSBhdCBFb2wgb2YgbGluZSAyCiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCh7IGxpbmU6IDEsIGNoOiBsaW5lc1sxXS5sZW5ndGggLSAxIH0pOwogIGhlbHBlcnMuZG9LZXlzKFsnaiddKTsKICAvLyBBZnRlciBtb3ZpbmcgZG93biwgd2Ugc2hvdWxkIGJlIGF0IEVvbCBvZiBsaW5lIDMKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KHsgbGluZTogMiwgY2g6IGxpbmVzWzJdLmxlbmd0aCAtIDEgfSk7CiAgaGVscGVycy5kb0tleXMoWydoJ10pOwogIGhlbHBlcnMuZG9LZXlzKFsnaiddKTsKICAvLyBBZnRlciBtb3ZpbmcgYmFjayBvbmUgc3BhY2UgYW5kIHRoZW4gZG93biwgc2luY2UgbGluZSA0IGlzIHNob3J0ZXIgdGhhbiBsaW5lIDIsIHdlIHNob3VsZAogIC8vIGJlIGF0IEVvbCBvZiBsaW5lIDIgLSAxCiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCh7IGxpbmU6IDMsIGNoOiBsaW5lc1szXS5sZW5ndGggLSAxIH0pOwogIGhlbHBlcnMuZG9LZXlzKFsnaiddKTsKICBoZWxwZXJzLmRvS2V5cyhbJ2onXSk7CiAgLy8gQWZ0ZXIgbW92aW5nIGRvd24gYWdhaW4sIHNpbmNlIGxpbmUgMyBoYXMgZW5vdWdoIGNoYXJhY3RlcnMsIHdlIHNob3VsZCBiZSBiYWNrIHRvIHRoZQogIC8vIHNhbWUgcGxhY2Ugd2Ugd2VyZSBhdCBvbiBsaW5lIDEKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KHsgbGluZTogNSwgY2g6IGxpbmVzWzJdLmxlbmd0aCAtIDIgfSk7Cn0pOwovL21ha2luZyBzdXJlIGdqIGFuZCBnayByZWNvdmVyIGZyb20gY2xpcHBpbmcKdGVzdFZpbSgnZ2pfZ2tfY2xpcHBpbmcnLCBmdW5jdGlvbihjbSx2aW0saGVscGVycyl7CiAgY20uc2V0Q3Vyc29yKDAsIDEpOwogIGhlbHBlcnMuZG9LZXlzKCdnJywnaicsJ2cnLCdqJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgyLCAxKTsKICBoZWxwZXJzLmRvS2V5cygnZycsJ2snLCdnJywnaycpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgMSk7Cn0se3ZhbHVlOiAnbGluZSAxXG5cbmxpbmUgMid9KTsKLy90ZXN0aW5nIGEgbWl4IG9mIGovayBhbmQgZ2ovZ2sKdGVzdFZpbSgnal9rX2FuZF9nal9naycsIGZ1bmN0aW9uKGNtLHZpbSxoZWxwZXJzKXsKICBjbS5zZXRTaXplKDEyMCk7CiAgY20uc2V0Q3Vyc29yKDAsIDApOwogIC8vZ28gdG8gdGhlIGxhc3QgY2hhcmFjdGVyIG9uIHRoZSBmaXJzdCBsaW5lCiAgaGVscGVycy5kb0tleXMoJyQnKTsKICAvL21vdmUgdXAvZG93biBvbiB0aGUgY29sdW1uIHdpdGhpbiB0aGUgd3JhcHBlZCBsaW5lCiAgLy9zaWRlLWVmZmVjdDogY3Vyc29yIGlzIG5vdCBsb2NrZWQgdG8gZW9sIGFueW1vcmUKICBoZWxwZXJzLmRvS2V5cygnZycsJ2snKTsKICB2YXIgY3VyPWNtLmdldEN1cnNvcigpOwogIGVxKGN1ci5saW5lLDApOwogIGlzKChjdXIuY2g8MTc2KSwnZ2sgZGlkblwndCBtb3ZlIGN1cnNvciBiYWNrICgxKScpOwogIGhlbHBlcnMuZG9LZXlzKCdnJywnaicpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgMTc2KTsKICAvL3Nob3VsZCBtb3ZlIHRvIGNoYXJhY3RlciAxNzcgb24gbGluZSAyIChqL2sgcHJlc2VydmUgY2hhcmFjdGVyIGluZGV4IHdpdGhpbiBsaW5lKQogIGhlbHBlcnMuZG9LZXlzKCdqJyk7CiAgLy9kdWUgdG8gZGlmZmVyZW50IGxpbmUgd3JhcHBpbmcsIHRoZSBjdXJzb3IgY2FuIGJlIG9uIGEgZGlmZmVyZW50IHNjcmVlbi14IG5vdwogIC8vZ2ogYW5kIGdrIHByZXNlcnZlIHNjcmVlbi14IG9uIG1vdmVtZW50LCBtdWNoIGxpa2UgbW92ZVYKICBoZWxwZXJzLmRvS2V5cygnMycsJ2cnLCdrJyk7CiAgY3VyPWNtLmdldEN1cnNvcigpOwogIGVxKGN1ci5saW5lLDEpOwogIGlzKChjdXIuY2g8MTc2KSwnZ2sgZGlkblwndCBtb3ZlIGN1cnNvciBiYWNrICgyKScpOwogIGhlbHBlcnMuZG9LZXlzKCdnJywnaicsJzInLCdnJywnaicpOwogIC8vc2hvdWxkIHJldHVybiB0byB0aGUgc2FtZSBjaGFyYWN0ZXItaW5kZXgKICBoZWxwZXJzLmRvS2V5cygnaycpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgMTc2KTsKfSx7IGxpbmVXcmFwcGluZzp0cnVlLCB2YWx1ZTogJ1RoaXMgbGluZSBpcyBpbnRlbnRpYWxseSBsb25nIHRvIHRlc3QgbW92ZW1lbnQgb2YgZ2ogYW5kIGdrIG92ZXIgd3JhcHBlZCBsaW5lcy4gSSB3aWxsIHN0YXJ0IG9uIHRoZSBlbmQgb2YgdGhpcyBsaW5lLCB0aGVuIG1ha2UgYSBzdGVwIHVwIGFuZCBiYWNrIHRvIHNldCB0aGUgb3JpZ2luIGZvciBqIGFuZCBrLlxuVGhpcyBsaW5lIGlzIHN1cHBvc2VkIHRvIGJlIGV2ZW4gbG9uZ2VyIHRoYW4gdGhlIHByZXZpb3VzLiBJIHdpbGwganVtcCBoZXJlIGFuZCBtYWtlIGFub3RoZXIgd2lnZ2xlIHdpdGggZ2ogYW5kIGdrLCBiZWZvcmUgSSBqdW1wIGJhY2sgdG8gdGhlIGxpbmUgYWJvdmUuIEJvdGggd2lnZ2xlcyBzaG91bGQgbm90IGNoYW5nZSBteSBjdXJzb3JcJ3MgdGFyZ2V0IGNoYXJhY3RlciBidXQgYm90aCBqL2sgYW5kIGdqL2drIGNoYW5nZSBlYWNoIG90aGVyXCdzIHJlZmVyZW5jZSBwb3NpdGlvbi4nfSk7CnRlc3RWaW0oJ2dqX2drJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGlmIChwaGFudG9tKSByZXR1cm47CiAgY20uc2V0U2l6ZSgxMjApOwogIC8vIFRlc3QgdG9wIG9mIGRvY3VtZW50IGVkZ2UgY2FzZS4KICBjbS5zZXRDdXJzb3IoMCwgNCk7CiAgaGVscGVycy5kb0tleXMoJ2cnLCAnaicpOwogIGhlbHBlcnMuZG9LZXlzKCcxMCcsICdnJywgJ2snKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDQpOwoKICAvLyBUZXN0IG1vdmluZyBkb3duIHByZXNlcnZlcyBjb2x1bW4gcG9zaXRpb24uCiAgaGVscGVycy5kb0tleXMoJ2cnLCAnaicpOwogIHZhciBwb3MxID0gY20uZ2V0Q3Vyc29yKCk7CiAgdmFyIGV4cGVjdGVkUG9zMiA9IHsgbGluZTogMCwgY2g6IChwb3MxLmNoIC0gNCkgKiAyICsgNH07CiAgaGVscGVycy5kb0tleXMoJ2cnLCAnaicpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoZXhwZWN0ZWRQb3MyKTsKCiAgLy8gTW92ZSB0byB0aGUgbGFzdCBjaGFyYWN0ZXIKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgLy8gTW92ZSBsZWZ0IHRvIHJlc2V0IEhTUG9zCiAgaGVscGVycy5kb0tleXMoJ2gnKTsKICAvLyBUZXN0IGJvdHRvbSBvZiBkb2N1bWVudCBlZGdlIGNhc2UuCiAgaGVscGVycy5kb0tleXMoJzEwMCcsICdnJywgJ2onKTsKICB2YXIgZW5kaW5nUG9zID0gY20uZ2V0Q3Vyc29yKCk7CiAgaXMoZW5kaW5nUG9zICE9IDAsICdnaiBzaG91bGQgbm90IGJlIG9uIHdyYXBwZWQgbGluZSAwJyk7CiAgdmFyIHRvcExlZnRDaGFyQ29vcmRzID0gY20uY2hhckNvb3JkcyhtYWtlQ3Vyc29yKDAsIDApKTsKICB2YXIgZW5kaW5nQ2hhckNvb3JkcyA9IGNtLmNoYXJDb29yZHMoZW5kaW5nUG9zKTsKICBpcyh0b3BMZWZ0Q2hhckNvb3Jkcy5sZWZ0ID09IGVuZGluZ0NoYXJDb29yZHMubGVmdCwgJ2dqIHNob3VsZCBlbmQgdXAgb24gY29sdW1uIDAnKTsKfSx7IGxpbmVOdW1iZXJzOiBmYWxzZSwgbGluZVdyYXBwaW5nOnRydWUsIHZhbHVlOiAnVGhpc2xpbmVpc2ludGVudGlvbmFsbHlsb25ndG90ZXN0bW92ZW1lbnRvZmdqYW5kZ2tvdmVyd3JhcHBlZGxpbmVzLicgfSk7CnRlc3RWaW0oJ30nLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDApOwogIGhlbHBlcnMuZG9LZXlzKCd9Jyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgxLCAwKTsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJzInLCAnfScpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoNCwgMCk7CiAgY20uc2V0Q3Vyc29yKDAsIDApOwogIGhlbHBlcnMuZG9LZXlzKCc2JywgJ30nKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDUsIDApOwp9LCB7IHZhbHVlOiAnYVxuXG5iXG5jXG5cbmQnIH0pOwp0ZXN0VmltKCd7JywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcig1LCAwKTsKICBoZWxwZXJzLmRvS2V5cygneycpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoNCwgMCk7CiAgY20uc2V0Q3Vyc29yKDUsIDApOwogIGhlbHBlcnMuZG9LZXlzKCcyJywgJ3snKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDEsIDApOwogIGNtLnNldEN1cnNvcig1LCAwKTsKICBoZWxwZXJzLmRvS2V5cygnNicsICd7Jyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCAwKTsKfSwgeyB2YWx1ZTogJ2FcblxuYlxuY1xuXG5kJyB9KTsKdGVzdFZpbSgncGFyYWdyYXBoX21vdGlvbnMnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDEwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygneycpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoNCwgMCk7CiAgaGVscGVycy5kb0tleXMoJ3snKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDApOwogIGhlbHBlcnMuZG9LZXlzKCcyJywgJ30nKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDcsIDApOwogIGhlbHBlcnMuZG9LZXlzKCcyJywgJ30nKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDE2LCAwKTsKCiAgY20uc2V0Q3Vyc29yKDksIDApOwogIGhlbHBlcnMuZG9LZXlzKCd9Jyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgxNCwgMCk7CgogIGNtLnNldEN1cnNvcig2LCAwKTsKICBoZWxwZXJzLmRvS2V5cygnfScpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoNywgMCk7CgogIC8vIGlwIGluc2lkZSBlbXB0eSBzcGFjZQogIGNtLnNldEN1cnNvcigxMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJ3YnLCAnaScsICdwJyk7CiAgZXFQb3MoUG9zKDcsIDApLCBjbS5nZXRDdXJzb3IoJ2FuY2hvcicpKTsKICBlcVBvcyhQb3MoMTIsIDApLCBjbS5nZXRDdXJzb3IoJ2hlYWQnKSk7CiAgaGVscGVycy5kb0tleXMoJ2knLCAncCcpOwogIGVxUG9zKFBvcyg3LCAwKSwgY20uZ2V0Q3Vyc29yKCdhbmNob3InKSk7CiAgZXFQb3MoUG9zKDEzLCAxKSwgY20uZ2V0Q3Vyc29yKCdoZWFkJykpOwogIGhlbHBlcnMuZG9LZXlzKCcyJywgJ2knLCAncCcpOwogIGVxUG9zKFBvcyg3LCAwKSwgY20uZ2V0Q3Vyc29yKCdhbmNob3InKSk7CiAgZXFQb3MoUG9zKDE2LCAxKSwgY20uZ2V0Q3Vyc29yKCdoZWFkJykpOwoKICAvLyBzaG91bGQgc3dpdGNoIHRvIHZpc3VhbExpbmUgbW9kZQogIGNtLnNldEN1cnNvcigxNCwgMCk7CiAgaGVscGVycy5kb0tleXMoJzxFc2M+JywgJ3YnLCAnaScsICdwJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgxNCwgMCk7CgogIGNtLnNldEN1cnNvcigxNCwgMCk7CiAgaGVscGVycy5kb0tleXMoJzxFc2M+JywgJ1YnLCAnaScsICdwJyk7CiAgZXFQb3MoUG9zKDE2LCAxKSwgY20uZ2V0Q3Vyc29yKCdoZWFkJykpOwoKICAvLyBhcCBpbnNpZGUgZW1wdHkgc3BhY2UKICBjbS5zZXRDdXJzb3IoMTAsIDApOwogIGhlbHBlcnMuZG9LZXlzKCc8RXNjPicsICd2JywgJ2EnLCAncCcpOwogIGVxUG9zKFBvcyg3LCAwKSwgY20uZ2V0Q3Vyc29yKCdhbmNob3InKSk7CiAgZXFQb3MoUG9zKDEzLCAxKSwgY20uZ2V0Q3Vyc29yKCdoZWFkJykpOwogIGhlbHBlcnMuZG9LZXlzKCdhJywgJ3AnKTsKICBlcVBvcyhQb3MoNywgMCksIGNtLmdldEN1cnNvcignYW5jaG9yJykpOwogIGVxUG9zKFBvcygxNiwgMSksIGNtLmdldEN1cnNvcignaGVhZCcpKTsKCiAgY20uc2V0Q3Vyc29yKDEzLCAwKTsKICBoZWxwZXJzLmRvS2V5cygndicsICdhJywgJ3AnKTsKICBlcVBvcyhQb3MoMTMsIDApLCBjbS5nZXRDdXJzb3IoJ2FuY2hvcicpKTsKICBlcVBvcyhQb3MoMTQsIDApLCBjbS5nZXRDdXJzb3IoJ2hlYWQnKSk7CgogIGNtLnNldEN1cnNvcigxNiwgMCk7CiAgaGVscGVycy5kb0tleXMoJ3YnLCAnYScsICdwJyk7CiAgZXFQb3MoUG9zKDE0LCAwKSwgY20uZ2V0Q3Vyc29yKCdhbmNob3InKSk7CiAgZXFQb3MoUG9zKDE2LCAxKSwgY20uZ2V0Q3Vyc29yKCdoZWFkJykpOwoKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJ3YnLCAnYScsICdwJyk7CiAgZXFQb3MoUG9zKDAsIDApLCBjbS5nZXRDdXJzb3IoJ2FuY2hvcicpKTsKICBlcVBvcyhQb3MoNCwgMCksIGNtLmdldEN1cnNvcignaGVhZCcpKTsKCiAgY20uc2V0Q3Vyc29yKDAsIDApOwogIGhlbHBlcnMuZG9LZXlzKCdkJywgJ2knLCAncCcpOwogIHZhciByZWdpc3RlciA9IGhlbHBlcnMuZ2V0UmVnaXN0ZXJDb250cm9sbGVyKCkuZ2V0UmVnaXN0ZXIoKTsKICBlcSgnYVxuYVxuJywgcmVnaXN0ZXIudG9TdHJpbmcoKSk7CiAgaXMocmVnaXN0ZXIubGluZXdpc2UpOwogIGhlbHBlcnMuZG9LZXlzKCczJywgJ2onLCAncCcpOwogIGhlbHBlcnMuZG9LZXlzKCd5JywgJ2knLCAncCcpOwogIGlzKHJlZ2lzdGVyLmxpbmV3aXNlKTsKICBlcSgnYlxuYVxuYVxuY1xuJywgcmVnaXN0ZXIudG9TdHJpbmcoKSk7Cn0sIHsgdmFsdWU6ICdhXG5hXG5cblxuXG5iXG5jXG5cblxuXG5cblxuXG5kXG5cbmVcbmYnIH0pOwoKLy8gT3BlcmF0b3IgdGVzdHMKdGVzdFZpbSgnZGwnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgdmFyIGN1clN0YXJ0ID0gbWFrZUN1cnNvcigwLCAwKTsKICBjbS5zZXRDdXJzb3IoY3VyU3RhcnQpOwogIGhlbHBlcnMuZG9LZXlzKCdkJywgJ2wnKTsKICBlcSgnd29yZDEgJywgY20uZ2V0VmFsdWUoKSk7CiAgdmFyIHJlZ2lzdGVyID0gaGVscGVycy5nZXRSZWdpc3RlckNvbnRyb2xsZXIoKS5nZXRSZWdpc3RlcigpOwogIGVxKCcgJywgcmVnaXN0ZXIudG9TdHJpbmcoKSk7CiAgaXMoIXJlZ2lzdGVyLmxpbmV3aXNlKTsKICBlcVBvcyhjdXJTdGFydCwgY20uZ2V0Q3Vyc29yKCkpOwp9LCB7IHZhbHVlOiAnIHdvcmQxICcgfSk7CnRlc3RWaW0oJ2RsX2VvbCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgNik7CiAgaGVscGVycy5kb0tleXMoJ2QnLCAnbCcpOwogIGVxKCcgd29yZDEnLCBjbS5nZXRWYWx1ZSgpKTsKICB2YXIgcmVnaXN0ZXIgPSBoZWxwZXJzLmdldFJlZ2lzdGVyQ29udHJvbGxlcigpLmdldFJlZ2lzdGVyKCk7CiAgZXEoJyAnLCByZWdpc3Rlci50b1N0cmluZygpKTsKICBpcyghcmVnaXN0ZXIubGluZXdpc2UpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgNSk7Cn0sIHsgdmFsdWU6ICcgd29yZDEgJyB9KTsKdGVzdFZpbSgnZGxfcmVwZWF0JywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIHZhciBjdXJTdGFydCA9IG1ha2VDdXJzb3IoMCwgMCk7CiAgY20uc2V0Q3Vyc29yKGN1clN0YXJ0KTsKICBoZWxwZXJzLmRvS2V5cygnMicsICdkJywgJ2wnKTsKICBlcSgnb3JkMSAnLCBjbS5nZXRWYWx1ZSgpKTsKICB2YXIgcmVnaXN0ZXIgPSBoZWxwZXJzLmdldFJlZ2lzdGVyQ29udHJvbGxlcigpLmdldFJlZ2lzdGVyKCk7CiAgZXEoJyB3JywgcmVnaXN0ZXIudG9TdHJpbmcoKSk7CiAgaXMoIXJlZ2lzdGVyLmxpbmV3aXNlKTsKICBlcVBvcyhjdXJTdGFydCwgY20uZ2V0Q3Vyc29yKCkpOwp9LCB7IHZhbHVlOiAnIHdvcmQxICcgfSk7CnRlc3RWaW0oJ2RoJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIHZhciBjdXJTdGFydCA9IG1ha2VDdXJzb3IoMCwgMyk7CiAgY20uc2V0Q3Vyc29yKGN1clN0YXJ0KTsKICBoZWxwZXJzLmRvS2V5cygnZCcsICdoJyk7CiAgZXEoJyB3cmQxICcsIGNtLmdldFZhbHVlKCkpOwogIHZhciByZWdpc3RlciA9IGhlbHBlcnMuZ2V0UmVnaXN0ZXJDb250cm9sbGVyKCkuZ2V0UmVnaXN0ZXIoKTsKICBlcSgnbycsIHJlZ2lzdGVyLnRvU3RyaW5nKCkpOwogIGlzKCFyZWdpc3Rlci5saW5ld2lzZSk7CiAgZXFQb3Mob2Zmc2V0Q3Vyc29yKGN1clN0YXJ0LCAwICwgLTEpLCBjbS5nZXRDdXJzb3IoKSk7Cn0sIHsgdmFsdWU6ICcgd29yZDEgJyB9KTsKdGVzdFZpbSgnZGonLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgdmFyIGN1clN0YXJ0ID0gbWFrZUN1cnNvcigwLCAzKTsKICBjbS5zZXRDdXJzb3IoY3VyU3RhcnQpOwogIGhlbHBlcnMuZG9LZXlzKCdkJywgJ2onKTsKICBlcSgnIHdvcmQzJywgY20uZ2V0VmFsdWUoKSk7CiAgdmFyIHJlZ2lzdGVyID0gaGVscGVycy5nZXRSZWdpc3RlckNvbnRyb2xsZXIoKS5nZXRSZWdpc3RlcigpOwogIGVxKCcgd29yZDFcbndvcmQyXG4nLCByZWdpc3Rlci50b1N0cmluZygpKTsKICBpcyhyZWdpc3Rlci5saW5ld2lzZSk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCAxKTsKfSwgeyB2YWx1ZTogJyB3b3JkMVxud29yZDJcbiB3b3JkMycgfSk7CnRlc3RWaW0oJ2RqX2VuZF9vZl9kb2N1bWVudCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICB2YXIgY3VyU3RhcnQgPSBtYWtlQ3Vyc29yKDAsIDMpOwogIGNtLnNldEN1cnNvcihjdXJTdGFydCk7CiAgaGVscGVycy5kb0tleXMoJ2QnLCAnaicpOwogIGVxKCcnLCBjbS5nZXRWYWx1ZSgpKTsKICB2YXIgcmVnaXN0ZXIgPSBoZWxwZXJzLmdldFJlZ2lzdGVyQ29udHJvbGxlcigpLmdldFJlZ2lzdGVyKCk7CiAgZXEoJyB3b3JkMSBcbicsIHJlZ2lzdGVyLnRvU3RyaW5nKCkpOwogIGlzKHJlZ2lzdGVyLmxpbmV3aXNlKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDApOwp9LCB7IHZhbHVlOiAnIHdvcmQxICcgfSk7CnRlc3RWaW0oJ2RrJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIHZhciBjdXJTdGFydCA9IG1ha2VDdXJzb3IoMSwgMyk7CiAgY20uc2V0Q3Vyc29yKGN1clN0YXJ0KTsKICBoZWxwZXJzLmRvS2V5cygnZCcsICdrJyk7CiAgZXEoJyB3b3JkMycsIGNtLmdldFZhbHVlKCkpOwogIHZhciByZWdpc3RlciA9IGhlbHBlcnMuZ2V0UmVnaXN0ZXJDb250cm9sbGVyKCkuZ2V0UmVnaXN0ZXIoKTsKICBlcSgnIHdvcmQxXG53b3JkMlxuJywgcmVnaXN0ZXIudG9TdHJpbmcoKSk7CiAgaXMocmVnaXN0ZXIubGluZXdpc2UpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgMSk7Cn0sIHsgdmFsdWU6ICcgd29yZDFcbndvcmQyXG4gd29yZDMnIH0pOwp0ZXN0VmltKCdka19zdGFydF9vZl9kb2N1bWVudCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICB2YXIgY3VyU3RhcnQgPSBtYWtlQ3Vyc29yKDAsIDMpOwogIGNtLnNldEN1cnNvcihjdXJTdGFydCk7CiAgaGVscGVycy5kb0tleXMoJ2QnLCAnaycpOwogIGVxKCcnLCBjbS5nZXRWYWx1ZSgpKTsKICB2YXIgcmVnaXN0ZXIgPSBoZWxwZXJzLmdldFJlZ2lzdGVyQ29udHJvbGxlcigpLmdldFJlZ2lzdGVyKCk7CiAgZXEoJyB3b3JkMSBcbicsIHJlZ2lzdGVyLnRvU3RyaW5nKCkpOwogIGlzKHJlZ2lzdGVyLmxpbmV3aXNlKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDApOwp9LCB7IHZhbHVlOiAnIHdvcmQxICcgfSk7CnRlc3RWaW0oJ2R3X3NwYWNlJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIHZhciBjdXJTdGFydCA9IG1ha2VDdXJzb3IoMCwgMCk7CiAgY20uc2V0Q3Vyc29yKGN1clN0YXJ0KTsKICBoZWxwZXJzLmRvS2V5cygnZCcsICd3Jyk7CiAgZXEoJ3dvcmQxICcsIGNtLmdldFZhbHVlKCkpOwogIHZhciByZWdpc3RlciA9IGhlbHBlcnMuZ2V0UmVnaXN0ZXJDb250cm9sbGVyKCkuZ2V0UmVnaXN0ZXIoKTsKICBlcSgnICcsIHJlZ2lzdGVyLnRvU3RyaW5nKCkpOwogIGlzKCFyZWdpc3Rlci5saW5ld2lzZSk7CiAgZXFQb3MoY3VyU3RhcnQsIGNtLmdldEN1cnNvcigpKTsKfSwgeyB2YWx1ZTogJyB3b3JkMSAnIH0pOwp0ZXN0VmltKCdkd193b3JkJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIHZhciBjdXJTdGFydCA9IG1ha2VDdXJzb3IoMCwgMSk7CiAgY20uc2V0Q3Vyc29yKGN1clN0YXJ0KTsKICBoZWxwZXJzLmRvS2V5cygnZCcsICd3Jyk7CiAgZXEoJyB3b3JkMicsIGNtLmdldFZhbHVlKCkpOwogIHZhciByZWdpc3RlciA9IGhlbHBlcnMuZ2V0UmVnaXN0ZXJDb250cm9sbGVyKCkuZ2V0UmVnaXN0ZXIoKTsKICBlcSgnd29yZDEgJywgcmVnaXN0ZXIudG9TdHJpbmcoKSk7CiAgaXMoIXJlZ2lzdGVyLmxpbmV3aXNlKTsKICBlcVBvcyhjdXJTdGFydCwgY20uZ2V0Q3Vyc29yKCkpOwp9LCB7IHZhbHVlOiAnIHdvcmQxIHdvcmQyJyB9KTsKdGVzdFZpbSgnZHdfdW5pY29kZV93b3JkJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGhlbHBlcnMuZG9LZXlzKCdkJywgJ3cnKTsKICBlcShjbS5nZXRWYWx1ZSgpLmxlbmd0aCwgMTApOwogIGhlbHBlcnMuZG9LZXlzKCdkJywgJ3cnKTsKICBlcShjbS5nZXRWYWx1ZSgpLmxlbmd0aCwgNik7CiAgaGVscGVycy5kb0tleXMoJ2QnLCAndycpOwogIGVxKGNtLmdldFZhbHVlKCkubGVuZ3RoLCA1KTsKICBoZWxwZXJzLmRvS2V5cygnZCcsICdlJyk7CiAgZXEoY20uZ2V0VmFsdWUoKS5sZW5ndGgsIDIpOwp9LCB7IHZhbHVlOiAnICBcdTA1NjJcdTA1NjFcdTA1ODBcdTA1ODdceGJiZVx4YjVnICAnIH0pOwp0ZXN0VmltKCdkd19vbmx5X3dvcmQnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgLy8gVGVzdCB0aGF0IGlmIHRoZXJlIGlzIG9ubHkgMSB3b3JkIGxlZnQsIGR3IGRlbGV0ZXMgdGlsbCB0aGUgZW5kIG9mIHRoZQogIC8vIGxpbmUuCiAgY20uc2V0Q3Vyc29yKDAsIDEpOwogIGhlbHBlcnMuZG9LZXlzKCdkJywgJ3cnKTsKICBlcSgnICcsIGNtLmdldFZhbHVlKCkpOwogIHZhciByZWdpc3RlciA9IGhlbHBlcnMuZ2V0UmVnaXN0ZXJDb250cm9sbGVyKCkuZ2V0UmVnaXN0ZXIoKTsKICBlcSgnd29yZDEgJywgcmVnaXN0ZXIudG9TdHJpbmcoKSk7CiAgaXMoIXJlZ2lzdGVyLmxpbmV3aXNlKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDApOwp9LCB7IHZhbHVlOiAnIHdvcmQxICcgfSk7CnRlc3RWaW0oJ2R3X2VvbCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICAvLyBBc3NlcnQgdGhhdCBkdyBkb2VzIG5vdCBkZWxldGUgdGhlIG5ld2xpbmUgaWYgbGFzdCB3b3JkIHRvIGRlbGV0ZSBpcyBhdCBlbmQKICAvLyBvZiBsaW5lLgogIGNtLnNldEN1cnNvcigwLCAxKTsKICBoZWxwZXJzLmRvS2V5cygnZCcsICd3Jyk7CiAgZXEoJyBcbndvcmQyJywgY20uZ2V0VmFsdWUoKSk7CiAgdmFyIHJlZ2lzdGVyID0gaGVscGVycy5nZXRSZWdpc3RlckNvbnRyb2xsZXIoKS5nZXRSZWdpc3RlcigpOwogIGVxKCd3b3JkMScsIHJlZ2lzdGVyLnRvU3RyaW5nKCkpOwogIGlzKCFyZWdpc3Rlci5saW5ld2lzZSk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCAwKTsKfSwgeyB2YWx1ZTogJyB3b3JkMVxud29yZDInIH0pOwp0ZXN0VmltKCdkd19lb2xfd2l0aF9tdWx0aXBsZV9uZXdsaW5lcycsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICAvLyBBc3NlcnQgdGhhdCBkdyBkb2VzIG5vdCBkZWxldGUgdGhlIG5ld2xpbmUgaWYgbGFzdCB3b3JkIHRvIGRlbGV0ZSBpcyBhdCBlbmQKICAvLyBvZiBsaW5lIGFuZCBpdCBpcyBmb2xsb3dlZCBieSBtdWx0aXBsZSBuZXdsaW5lcy4KICBjbS5zZXRDdXJzb3IoMCwgMSk7CiAgaGVscGVycy5kb0tleXMoJ2QnLCAndycpOwogIGVxKCcgXG5cbndvcmQyJywgY20uZ2V0VmFsdWUoKSk7CiAgdmFyIHJlZ2lzdGVyID0gaGVscGVycy5nZXRSZWdpc3RlckNvbnRyb2xsZXIoKS5nZXRSZWdpc3RlcigpOwogIGVxKCd3b3JkMScsIHJlZ2lzdGVyLnRvU3RyaW5nKCkpOwogIGlzKCFyZWdpc3Rlci5saW5ld2lzZSk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCAwKTsKfSwgeyB2YWx1ZTogJyB3b3JkMVxuXG53b3JkMicgfSk7CnRlc3RWaW0oJ2R3X2VtcHR5X2xpbmVfZm9sbG93ZWRfYnlfd2hpdGVzcGFjZScsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJ2QnLCAndycpOwogIGVxKCcgIFxud29yZCcsIGNtLmdldFZhbHVlKCkpOwp9LCB7IHZhbHVlOiAnXG4gIFxud29yZCcgfSk7CnRlc3RWaW0oJ2R3X2VtcHR5X2xpbmVfZm9sbG93ZWRfYnlfd29yZCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJ2QnLCAndycpOwogIGVxKCd3b3JkJywgY20uZ2V0VmFsdWUoKSk7Cn0sIHsgdmFsdWU6ICdcbndvcmQnIH0pOwp0ZXN0VmltKCdkd19lbXB0eV9saW5lX2ZvbGxvd2VkX2J5X2VtcHR5X2xpbmUnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDApOwogIGhlbHBlcnMuZG9LZXlzKCdkJywgJ3cnKTsKICBlcSgnXG4nLCBjbS5nZXRWYWx1ZSgpKTsKfSwgeyB2YWx1ZTogJ1xuXG4nIH0pOwp0ZXN0VmltKCdkd193aGl0ZXNwYWNlX2ZvbGxvd2VkX2J5X3doaXRlc3BhY2UnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDApOwogIGhlbHBlcnMuZG9LZXlzKCdkJywgJ3cnKTsKICBlcSgnXG4gICBcbicsIGNtLmdldFZhbHVlKCkpOwp9LCB7IHZhbHVlOiAnICBcbiAgIFxuJyB9KTsKdGVzdFZpbSgnZHdfd2hpdGVzcGFjZV9mb2xsb3dlZF9ieV9lbXB0eV9saW5lJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnZCcsICd3Jyk7CiAgZXEoJ1xuXG4nLCBjbS5nZXRWYWx1ZSgpKTsKfSwgeyB2YWx1ZTogJyAgXG5cbicgfSk7CnRlc3RWaW0oJ2R3X3dvcmRfd2hpdGVzcGFjZV93b3JkJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnZCcsICd3Jyk7CiAgZXEoJ1xuICAgXG53b3JkMicsIGNtLmdldFZhbHVlKCkpOwp9LCB7IHZhbHVlOiAnd29yZDFcbiAgIFxud29yZDInfSkKdGVzdFZpbSgnZHdfZW5kX29mX2RvY3VtZW50JywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigxLCAyKTsKICBoZWxwZXJzLmRvS2V5cygnZCcsICd3Jyk7CiAgZXEoJ1xuYWInLCBjbS5nZXRWYWx1ZSgpKTsKfSwgeyB2YWx1ZTogJ1xuYWJjJyB9KTsKdGVzdFZpbSgnZHdfcmVwZWF0JywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIC8vIEFzc2VydCB0aGF0IGR3IGRvZXMgZGVsZXRlIG5ld2xpbmUgaWYgaXQgc2hvdWxkIGdvIHRvIHRoZSBuZXh0IGxpbmUsIGFuZAogIC8vIHRoYXQgcmVwZWF0IHdvcmtzIHByb3Blcmx5LgogIGNtLnNldEN1cnNvcigwLCAxKTsKICBoZWxwZXJzLmRvS2V5cygnZCcsICcyJywgJ3cnKTsKICBlcSgnICcsIGNtLmdldFZhbHVlKCkpOwogIHZhciByZWdpc3RlciA9IGhlbHBlcnMuZ2V0UmVnaXN0ZXJDb250cm9sbGVyKCkuZ2V0UmVnaXN0ZXIoKTsKICBlcSgnd29yZDFcbndvcmQyJywgcmVnaXN0ZXIudG9TdHJpbmcoKSk7CiAgaXMoIXJlZ2lzdGVyLmxpbmV3aXNlKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDApOwp9LCB7IHZhbHVlOiAnIHdvcmQxXG53b3JkMicgfSk7CnRlc3RWaW0oJ2RlX3dvcmRfc3RhcnRfYW5kX2VtcHR5X2xpbmVzJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnZCcsICdlJyk7CiAgZXEoJ1xuXG4nLCBjbS5nZXRWYWx1ZSgpKTsKfSwgeyB2YWx1ZTogJ3dvcmRcblxuJyB9KTsKdGVzdFZpbSgnZGVfd29yZF9lbmRfYW5kX2VtcHR5X2xpbmVzJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAzKTsKICBoZWxwZXJzLmRvS2V5cygnZCcsICdlJyk7CiAgZXEoJ3dvcicsIGNtLmdldFZhbHVlKCkpOwp9LCB7IHZhbHVlOiAnd29yZFxuXG5cbicgfSk7CnRlc3RWaW0oJ2RlX3doaXRlc3BhY2VfYW5kX2VtcHR5X2xpbmVzJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnZCcsICdlJyk7CiAgZXEoJycsIGNtLmdldFZhbHVlKCkpOwp9LCB7IHZhbHVlOiAnICAgXG5cblxuJyB9KTsKdGVzdFZpbSgnZGVfZW5kX29mX2RvY3VtZW50JywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigxLCAyKTsKICBoZWxwZXJzLmRvS2V5cygnZCcsICdlJyk7CiAgZXEoJ1xuYWInLCBjbS5nZXRWYWx1ZSgpKTsKfSwgeyB2YWx1ZTogJ1xuYWJjJyB9KTsKdGVzdFZpbSgnZGJfZW1wdHlfbGluZXMnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDIsIDApOwogIGhlbHBlcnMuZG9LZXlzKCdkJywgJ2InKTsKICBlcSgnXG5cbicsIGNtLmdldFZhbHVlKCkpOwp9LCB7IHZhbHVlOiAnXG5cblxuJyB9KTsKdGVzdFZpbSgnZGJfd29yZF9zdGFydF9hbmRfZW1wdHlfbGluZXMnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDIsIDApOwogIGhlbHBlcnMuZG9LZXlzKCdkJywgJ2InKTsKICBlcSgnXG53b3JkJywgY20uZ2V0VmFsdWUoKSk7Cn0sIHsgdmFsdWU6ICdcblxud29yZCcgfSk7CnRlc3RWaW0oJ2RiX3dvcmRfZW5kX2FuZF9lbXB0eV9saW5lcycsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMiwgMyk7CiAgaGVscGVycy5kb0tleXMoJ2QnLCAnYicpOwogIGVxKCdcblxuZCcsIGNtLmdldFZhbHVlKCkpOwp9LCB7IHZhbHVlOiAnXG5cbndvcmQnIH0pOwp0ZXN0VmltKCdkYl93aGl0ZXNwYWNlX2FuZF9lbXB0eV9saW5lcycsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMiwgMCk7CiAgaGVscGVycy5kb0tleXMoJ2QnLCAnYicpOwogIGVxKCcnLCBjbS5nZXRWYWx1ZSgpKTsKfSwgeyB2YWx1ZTogJ1xuICAgXG4nIH0pOwp0ZXN0VmltKCdkYl9zdGFydF9vZl9kb2N1bWVudCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJ2QnLCAnYicpOwogIGVxKCdhYmNcbicsIGNtLmdldFZhbHVlKCkpOwp9LCB7IHZhbHVlOiAnYWJjXG4nIH0pOwp0ZXN0VmltKCdkZ2VfZW1wdHlfbGluZXMnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDEsIDApOwogIGhlbHBlcnMuZG9LZXlzKCdkJywgJ2cnLCAnZScpOwogIC8vIE5vdGU6IEluIHJlYWwgVklNIHRoZSByZXN1bHQgc2hvdWxkIGJlICcnLCBidXQgaXQncyBub3QgcXVpdGUgY29uc2lzdGVudCwKICAvLyBzaW5jZSAyIG5ld2xpbmVzIGFyZSBkZWxldGVkLiBCdXQgaW4gdGhlIHNpbWlsYXIgY2FzZSBvZiB3b3JkXG5cbiwgb25seQogIC8vIDEgbmV3bGluZSBpcyBkZWxldGVkLiBXZSdsbCBkaXZlcmdlIGZyb20gVklNJ3MgYmVoYXZpb3Igc2luY2UgaXQncyBtdWNoCiAgLy8gZWFzaWVyIHRoaXMgd2F5LgogIGVxKCdcbicsIGNtLmdldFZhbHVlKCkpOwp9LCB7IHZhbHVlOiAnXG5cbicgfSk7CnRlc3RWaW0oJ2RnZV93b3JkX2FuZF9lbXB0eV9saW5lcycsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMSwgMCk7CiAgaGVscGVycy5kb0tleXMoJ2QnLCAnZycsICdlJyk7CiAgZXEoJ3dvclxuJywgY20uZ2V0VmFsdWUoKSk7Cn0sIHsgdmFsdWU6ICd3b3JkXG5cbid9KTsKdGVzdFZpbSgnZGdlX3doaXRlc3BhY2VfYW5kX2VtcHR5X2xpbmVzJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigyLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnZCcsICdnJywgJ2UnKTsKICBlcSgnJywgY20uZ2V0VmFsdWUoKSk7Cn0sIHsgdmFsdWU6ICdcbiAgXG4nIH0pOwp0ZXN0VmltKCdkZ2Vfc3RhcnRfb2ZfZG9jdW1lbnQnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDApOwogIGhlbHBlcnMuZG9LZXlzKCdkJywgJ2cnLCAnZScpOwogIGVxKCdiY1xuJywgY20uZ2V0VmFsdWUoKSk7Cn0sIHsgdmFsdWU6ICdhYmNcbicgfSk7CnRlc3RWaW0oJ2RfaW5jbHVzaXZlJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIC8vIEFzc2VydCB0aGF0IHdoZW4gaW5jbHVzaXZlIGlzIHNldCwgdGhlIGNoYXJhY3RlciB0aGUgY3Vyc29yIGlzIG9uIGdldHMKICAvLyBkZWxldGVkIHRvby4KICB2YXIgY3VyU3RhcnQgPSBtYWtlQ3Vyc29yKDAsIDEpOwogIGNtLnNldEN1cnNvcihjdXJTdGFydCk7CiAgaGVscGVycy5kb0tleXMoJ2QnLCAnZScpOwogIGVxKCcgICcsIGNtLmdldFZhbHVlKCkpOwogIHZhciByZWdpc3RlciA9IGhlbHBlcnMuZ2V0UmVnaXN0ZXJDb250cm9sbGVyKCkuZ2V0UmVnaXN0ZXIoKTsKICBlcSgnd29yZDEnLCByZWdpc3Rlci50b1N0cmluZygpKTsKICBpcyghcmVnaXN0ZXIubGluZXdpc2UpOwogIGVxUG9zKGN1clN0YXJ0LCBjbS5nZXRDdXJzb3IoKSk7Cn0sIHsgdmFsdWU6ICcgd29yZDEgJyB9KTsKdGVzdFZpbSgnZF9yZXZlcnNlJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIC8vIFRlc3QgdGhhdCBkZWxldGluZyBpbiByZXZlcnNlIHdvcmtzLgogIGNtLnNldEN1cnNvcigxLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnZCcsICdiJyk7CiAgZXEoJyB3b3JkMiAnLCBjbS5nZXRWYWx1ZSgpKTsKICB2YXIgcmVnaXN0ZXIgPSBoZWxwZXJzLmdldFJlZ2lzdGVyQ29udHJvbGxlcigpLmdldFJlZ2lzdGVyKCk7CiAgZXEoJ3dvcmQxXG4nLCByZWdpc3Rlci50b1N0cmluZygpKTsKICBpcyghcmVnaXN0ZXIubGluZXdpc2UpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgMSk7Cn0sIHsgdmFsdWU6ICcgd29yZDFcbndvcmQyICcgfSk7CnRlc3RWaW0oJ2RkJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAzKTsKICB2YXIgZXhwZWN0ZWRCdWZmZXIgPSBjbS5nZXRSYW5nZSh7IGxpbmU6IDAsIGNoOiAwIH0sCiAgICB7IGxpbmU6IDEsIGNoOiAwIH0pOwogIHZhciBleHBlY3RlZExpbmVDb3VudCA9IGNtLmxpbmVDb3VudCgpIC0gMTsKICBoZWxwZXJzLmRvS2V5cygnZCcsICdkJyk7CiAgZXEoZXhwZWN0ZWRMaW5lQ291bnQsIGNtLmxpbmVDb3VudCgpKTsKICB2YXIgcmVnaXN0ZXIgPSBoZWxwZXJzLmdldFJlZ2lzdGVyQ29udHJvbGxlcigpLmdldFJlZ2lzdGVyKCk7CiAgZXEoZXhwZWN0ZWRCdWZmZXIsIHJlZ2lzdGVyLnRvU3RyaW5nKCkpOwogIGlzKHJlZ2lzdGVyLmxpbmV3aXNlKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIGxpbmVzWzFdLnRleHRTdGFydCk7Cn0pOwp0ZXN0VmltKCdkZF9wcmVmaXhfcmVwZWF0JywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAzKTsKICB2YXIgZXhwZWN0ZWRCdWZmZXIgPSBjbS5nZXRSYW5nZSh7IGxpbmU6IDAsIGNoOiAwIH0sCiAgICB7IGxpbmU6IDIsIGNoOiAwIH0pOwogIHZhciBleHBlY3RlZExpbmVDb3VudCA9IGNtLmxpbmVDb3VudCgpIC0gMjsKICBoZWxwZXJzLmRvS2V5cygnMicsICdkJywgJ2QnKTsKICBlcShleHBlY3RlZExpbmVDb3VudCwgY20ubGluZUNvdW50KCkpOwogIHZhciByZWdpc3RlciA9IGhlbHBlcnMuZ2V0UmVnaXN0ZXJDb250cm9sbGVyKCkuZ2V0UmVnaXN0ZXIoKTsKICBlcShleHBlY3RlZEJ1ZmZlciwgcmVnaXN0ZXIudG9TdHJpbmcoKSk7CiAgaXMocmVnaXN0ZXIubGluZXdpc2UpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgbGluZXNbMl0udGV4dFN0YXJ0KTsKfSk7CnRlc3RWaW0oJ2RkX21vdGlvbl9yZXBlYXQnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDMpOwogIHZhciBleHBlY3RlZEJ1ZmZlciA9IGNtLmdldFJhbmdlKHsgbGluZTogMCwgY2g6IDAgfSwKICAgIHsgbGluZTogMiwgY2g6IDAgfSk7CiAgdmFyIGV4cGVjdGVkTGluZUNvdW50ID0gY20ubGluZUNvdW50KCkgLSAyOwogIGhlbHBlcnMuZG9LZXlzKCdkJywgJzInLCAnZCcpOwogIGVxKGV4cGVjdGVkTGluZUNvdW50LCBjbS5saW5lQ291bnQoKSk7CiAgdmFyIHJlZ2lzdGVyID0gaGVscGVycy5nZXRSZWdpc3RlckNvbnRyb2xsZXIoKS5nZXRSZWdpc3RlcigpOwogIGVxKGV4cGVjdGVkQnVmZmVyLCByZWdpc3Rlci50b1N0cmluZygpKTsKICBpcyhyZWdpc3Rlci5saW5ld2lzZSk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCBsaW5lc1syXS50ZXh0U3RhcnQpOwp9KTsKdGVzdFZpbSgnZGRfbXVsdGlwbHlfcmVwZWF0JywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAzKTsKICB2YXIgZXhwZWN0ZWRCdWZmZXIgPSBjbS5nZXRSYW5nZSh7IGxpbmU6IDAsIGNoOiAwIH0sCiAgICB7IGxpbmU6IDYsIGNoOiAwIH0pOwogIHZhciBleHBlY3RlZExpbmVDb3VudCA9IGNtLmxpbmVDb3VudCgpIC0gNjsKICBoZWxwZXJzLmRvS2V5cygnMicsICdkJywgJzMnLCAnZCcpOwogIGVxKGV4cGVjdGVkTGluZUNvdW50LCBjbS5saW5lQ291bnQoKSk7CiAgdmFyIHJlZ2lzdGVyID0gaGVscGVycy5nZXRSZWdpc3RlckNvbnRyb2xsZXIoKS5nZXRSZWdpc3RlcigpOwogIGVxKGV4cGVjdGVkQnVmZmVyLCByZWdpc3Rlci50b1N0cmluZygpKTsKICBpcyhyZWdpc3Rlci5saW5ld2lzZSk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCBsaW5lc1s2XS50ZXh0U3RhcnQpOwp9KTsKdGVzdFZpbSgnZGRfbGFzdGxpbmUnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKGNtLmxpbmVDb3VudCgpLCAwKTsKICB2YXIgZXhwZWN0ZWRMaW5lQ291bnQgPSBjbS5saW5lQ291bnQoKSAtIDE7CiAgaGVscGVycy5kb0tleXMoJ2QnLCAnZCcpOwogIGVxKGV4cGVjdGVkTGluZUNvdW50LCBjbS5saW5lQ291bnQoKSk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdChjbS5saW5lQ291bnQoKSAtIDEsIDApOwp9KTsKdGVzdFZpbSgnZGRfb25seV9saW5lJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAwKTsKICB2YXIgZXhwZWN0ZWRSZWdpc3RlciA9IGNtLmdldFZhbHVlKCkgKyAiXG4iOwogIGhlbHBlcnMuZG9LZXlzKCdkJywnZCcpOwogIGVxKDEsIGNtLmxpbmVDb3VudCgpKTsKICBlcSgnJywgY20uZ2V0VmFsdWUoKSk7CiAgdmFyIHJlZ2lzdGVyID0gaGVscGVycy5nZXRSZWdpc3RlckNvbnRyb2xsZXIoKS5nZXRSZWdpc3RlcigpOwogIGVxKGV4cGVjdGVkUmVnaXN0ZXIsIHJlZ2lzdGVyLnRvU3RyaW5nKCkpOwp9LCB7IHZhbHVlOiAidGhpc2lzdGhlb25seWxpbmUiIH0pOwovLyBZYW5rIGNvbW1hbmRzIHNob3VsZCBiZWhhdmUgdGhlIGV4YWN0IHNhbWUgYXMgZCBjb21tYW5kcywgZXhwZWN0IHRoYXQgbm90aGluZwovLyBnZXRzIGRlbGV0ZWQuCnRlc3RWaW0oJ3l3X3JlcGVhdCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICAvLyBBc3NlcnQgdGhhdCB5dyBkb2VzIHlhbmsgbmV3bGluZSBpZiBpdCBzaG91bGQgZ28gdG8gdGhlIG5leHQgbGluZSwgYW5kCiAgLy8gdGhhdCByZXBlYXQgd29ya3MgcHJvcGVybHkuCiAgdmFyIGN1clN0YXJ0ID0gbWFrZUN1cnNvcigwLCAxKTsKICBjbS5zZXRDdXJzb3IoY3VyU3RhcnQpOwogIGhlbHBlcnMuZG9LZXlzKCd5JywgJzInLCAndycpOwogIGVxKCcgd29yZDFcbndvcmQyJywgY20uZ2V0VmFsdWUoKSk7CiAgdmFyIHJlZ2lzdGVyID0gaGVscGVycy5nZXRSZWdpc3RlckNvbnRyb2xsZXIoKS5nZXRSZWdpc3RlcigpOwogIGVxKCd3b3JkMVxud29yZDInLCByZWdpc3Rlci50b1N0cmluZygpKTsKICBpcyghcmVnaXN0ZXIubGluZXdpc2UpOwogIGVxUG9zKGN1clN0YXJ0LCBjbS5nZXRDdXJzb3IoKSk7Cn0sIHsgdmFsdWU6ICcgd29yZDFcbndvcmQyJyB9KTsKdGVzdFZpbSgneXlfbXVsdGlwbHlfcmVwZWF0JywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIHZhciBjdXJTdGFydCA9IG1ha2VDdXJzb3IoMCwgMyk7CiAgY20uc2V0Q3Vyc29yKGN1clN0YXJ0KTsKICB2YXIgZXhwZWN0ZWRCdWZmZXIgPSBjbS5nZXRSYW5nZSh7IGxpbmU6IDAsIGNoOiAwIH0sCiAgICB7IGxpbmU6IDYsIGNoOiAwIH0pOwogIHZhciBleHBlY3RlZExpbmVDb3VudCA9IGNtLmxpbmVDb3VudCgpOwogIGhlbHBlcnMuZG9LZXlzKCcyJywgJ3knLCAnMycsICd5Jyk7CiAgZXEoZXhwZWN0ZWRMaW5lQ291bnQsIGNtLmxpbmVDb3VudCgpKTsKICB2YXIgcmVnaXN0ZXIgPSBoZWxwZXJzLmdldFJlZ2lzdGVyQ29udHJvbGxlcigpLmdldFJlZ2lzdGVyKCk7CiAgZXEoZXhwZWN0ZWRCdWZmZXIsIHJlZ2lzdGVyLnRvU3RyaW5nKCkpOwogIGlzKHJlZ2lzdGVyLmxpbmV3aXNlKTsKICBlcVBvcyhjdXJTdGFydCwgY20uZ2V0Q3Vyc29yKCkpOwp9KTsKLy8gQ2hhbmdlIGNvbW1hbmRzIGJlaGF2ZSBsaWtlIGQgY29tbWFuZHMgZXhjZXB0IHRoYXQgaXQgYWxzbyBlbnRlcnMgaW5zZXJ0Ci8vIG1vZGUuIEluIGFkZGl0aW9uLCB3aGVuIHRoZSBjaGFuZ2UgaXMgbGluZXdpc2UsIGFuIGFkZGl0aW9uYWwgbmV3bGluZSBpcwovLyBpbnNlcnRlZCBzbyB0aGF0IGluc2VydCBtb2RlIHN0YXJ0cyBvbiB0aGF0IGxpbmUuCnRlc3RWaW0oJ2N3JywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnYycsICcyJywgJ3cnKTsKICBlcSgnIHdvcmQzJywgY20uZ2V0VmFsdWUoKSk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCAwKTsKfSwgeyB2YWx1ZTogJ3dvcmQxIHdvcmQyIHdvcmQzJ30pOwp0ZXN0VmltKCdjd19yZXBlYXQnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgLy8gQXNzZXJ0IHRoYXQgY3cgZG9lcyBkZWxldGUgbmV3bGluZSBpZiBpdCBzaG91bGQgZ28gdG8gdGhlIG5leHQgbGluZSwgYW5kCiAgLy8gdGhhdCByZXBlYXQgd29ya3MgcHJvcGVybHkuCiAgdmFyIGN1clN0YXJ0ID0gbWFrZUN1cnNvcigwLCAxKTsKICBjbS5zZXRDdXJzb3IoY3VyU3RhcnQpOwogIGhlbHBlcnMuZG9LZXlzKCdjJywgJzInLCAndycpOwogIGVxKCcgJywgY20uZ2V0VmFsdWUoKSk7CiAgdmFyIHJlZ2lzdGVyID0gaGVscGVycy5nZXRSZWdpc3RlckNvbnRyb2xsZXIoKS5nZXRSZWdpc3RlcigpOwogIGVxKCd3b3JkMVxud29yZDInLCByZWdpc3Rlci50b1N0cmluZygpKTsKICBpcyghcmVnaXN0ZXIubGluZXdpc2UpOwogIGVxUG9zKGN1clN0YXJ0LCBjbS5nZXRDdXJzb3IoKSk7CiAgZXEoJ3ZpbS1pbnNlcnQnLCBjbS5nZXRPcHRpb24oJ2tleU1hcCcpKTsKfSwgeyB2YWx1ZTogJyB3b3JkMVxud29yZDInIH0pOwp0ZXN0VmltKCdjY19tdWx0aXBseV9yZXBlYXQnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDMpOwogIHZhciBleHBlY3RlZEJ1ZmZlciA9IGNtLmdldFJhbmdlKHsgbGluZTogMCwgY2g6IDAgfSwKICAgIHsgbGluZTogNiwgY2g6IDAgfSk7CiAgdmFyIGV4cGVjdGVkTGluZUNvdW50ID0gY20ubGluZUNvdW50KCkgLSA1OwogIGhlbHBlcnMuZG9LZXlzKCcyJywgJ2MnLCAnMycsICdjJyk7CiAgZXEoZXhwZWN0ZWRMaW5lQ291bnQsIGNtLmxpbmVDb3VudCgpKTsKICB2YXIgcmVnaXN0ZXIgPSBoZWxwZXJzLmdldFJlZ2lzdGVyQ29udHJvbGxlcigpLmdldFJlZ2lzdGVyKCk7CiAgZXEoZXhwZWN0ZWRCdWZmZXIsIHJlZ2lzdGVyLnRvU3RyaW5nKCkpOwogIGlzKHJlZ2lzdGVyLmxpbmV3aXNlKTsKICBlcSgndmltLWluc2VydCcsIGNtLmdldE9wdGlvbigna2V5TWFwJykpOwp9KTsKdGVzdFZpbSgnY3QnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDkpOwogIGhlbHBlcnMuZG9LZXlzKCdjJywgJ3QnLCAndycpOwogIGVxKCcgIHdvcmQxICB3b3JkMycsIGNtLmdldFZhbHVlKCkpOwogIGhlbHBlcnMuZG9LZXlzKCc8RXNjPicsICdjJywgJ3wnKTsKICBlcSgnIHdvcmQzJywgY20uZ2V0VmFsdWUoKSk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnPEVzYz4nLCAnMicsICd1JywgJ3cnLCAnaCcpOwogIGhlbHBlcnMuZG9LZXlzKCdjJywgJzInLCAnZycsICdlJyk7CiAgZXEoJyAgd29yZHdvcmQzJywgY20uZ2V0VmFsdWUoKSk7Cn0sIHsgdmFsdWU6ICcgIHdvcmQxICB3b3JkMiAgd29yZDMnfSk7CnRlc3RWaW0oJ2NjX3Nob3VsZF9ub3RfYXBwZW5kX3RvX2RvY3VtZW50JywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIHZhciBleHBlY3RlZExpbmVDb3VudCA9IGNtLmxpbmVDb3VudCgpOwogIGNtLnNldEN1cnNvcihjbS5sYXN0TGluZSgpLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnYycsICdjJyk7CiAgZXEoZXhwZWN0ZWRMaW5lQ291bnQsIGNtLmxpbmVDb3VudCgpKTsKfSk7CmZ1bmN0aW9uIGZpbGxBcnJheSh2YWwsIHRpbWVzKSB7CiAgdmFyIGFyciA9IFtdOwogIGZvciAodmFyIGkgPSAwOyBpIDwgdGltZXM7IGkrKykgewogICAgYXJyLnB1c2godmFsKTsKICB9CiAgcmV0dXJuIGFycjsKfQp0ZXN0VmltKCdjX3Zpc3VhbF9ibG9jaycsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgMSk7CiAgaGVscGVycy5kb0tleXMoJzxDLXY+JywgJzInLCAnaicsICdsJywgJ2wnLCAnbCcsICdjJyk7CiAgdmFyIHJlcGxhY2VtZW50ID0gZmlsbEFycmF5KCdoZWxsbycsIDMpOwogIGNtLnJlcGxhY2VTZWxlY3Rpb25zKHJlcGxhY2VtZW50KTsKICBlcSgnMWhlbGxvXG41aGVsbG9cbmFoZWxsb2ZnJywgY20uZ2V0VmFsdWUoKSk7CiAgaGVscGVycy5kb0tleXMoJzxFc2M+Jyk7CiAgY20uc2V0Q3Vyc29yKDIsIDMpOwogIGhlbHBlcnMuZG9LZXlzKCc8Qy12PicsICcyJywgJ2snLCAnaCcsICdDJyk7CiAgcmVwbGFjZW1lbnQgPSBmaWxsQXJyYXkoJ3dvcmxkJywgMyk7CiAgY20ucmVwbGFjZVNlbGVjdGlvbnMocmVwbGFjZW1lbnQpOwogIGVxKCcxaHdvcmxkXG41aHdvcmxkXG5haHdvcmxkJywgY20uZ2V0VmFsdWUoKSk7Cn0sIHt2YWx1ZTogJzEyMzRcbjU2NzhcbmFiY2RlZmcnfSk7CnRlc3RWaW0oJ2NfdmlzdWFsX2Jsb2NrX3JlcGxheScsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgMSk7CiAgaGVscGVycy5kb0tleXMoJzxDLXY+JywgJzInLCAnaicsICdsJywgJ2MnKTsKICB2YXIgcmVwbGFjZW1lbnQgPSBmaWxsQXJyYXkoJ2ZvJywgMyk7CiAgY20ucmVwbGFjZVNlbGVjdGlvbnMocmVwbGFjZW1lbnQpOwogIGVxKCcxZm80XG41Zm84XG5hZm9kZWZnJywgY20uZ2V0VmFsdWUoKSk7CiAgaGVscGVycy5kb0tleXMoJzxFc2M+Jyk7CiAgY20uc2V0Q3Vyc29yKDAsIDApOwogIGhlbHBlcnMuZG9LZXlzKCcuJyk7CiAgZXEoJ2ZvbzRcbmZvbzhcbmZvb2RlZmcnLCBjbS5nZXRWYWx1ZSgpKTsKfSwge3ZhbHVlOiAnMTIzNFxuNTY3OFxuYWJjZGVmZyd9KTsKCnRlc3RWaW0oJ2RfdmlzdWFsX2Jsb2NrJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAxKTsKICBoZWxwZXJzLmRvS2V5cygnPEMtdj4nLCAnMicsICdqJywgJ2wnLCAnbCcsICdsJywgJ2QnKTsKICBlcSgnMVxuNVxuYWZnJywgY20uZ2V0VmFsdWUoKSk7Cn0sIHt2YWx1ZTogJzEyMzRcbjU2NzhcbmFiY2RlZmcnfSk7CnRlc3RWaW0oJ0RfdmlzdWFsX2Jsb2NrJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAxKTsKICBoZWxwZXJzLmRvS2V5cygnPEMtdj4nLCAnMicsICdqJywgJ2wnLCAnRCcpOwogIGVxKCcxXG41XG5hJywgY20uZ2V0VmFsdWUoKSk7Cn0sIHt2YWx1ZTogJzEyMzRcbjU2NzhcbmFiY2RlZmcnfSk7Cgp0ZXN0VmltKCdzX3Zpc3VhbF9ibG9jaycsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgMSk7CiAgaGVscGVycy5kb0tleXMoJzxDLXY+JywgJzInLCAnaicsICdsJywgJ2wnLCAnbCcsICdzJyk7CiAgdmFyIHJlcGxhY2VtZW50ID0gZmlsbEFycmF5KCdoZWxsb3snLCAzKTsKICBjbS5yZXBsYWNlU2VsZWN0aW9ucyhyZXBsYWNlbWVudCk7CiAgZXEoJzFoZWxsb3tcbjVoZWxsb3tcbmFoZWxsb3tmZ1xuJywgY20uZ2V0VmFsdWUoKSk7CiAgaGVscGVycy5kb0tleXMoJzxFc2M+Jyk7CiAgY20uc2V0Q3Vyc29yKDIsIDMpOwogIGhlbHBlcnMuZG9LZXlzKCc8Qy12PicsICcxJywgJ2snLCAnaCcsICdTJyk7CiAgcmVwbGFjZW1lbnQgPSBmaWxsQXJyYXkoJ3dvcmxkJywgMSk7CiAgY20ucmVwbGFjZVNlbGVjdGlvbnMocmVwbGFjZW1lbnQpOwogIGVxKCcxaGVsbG97XG4gIHdvcmxkXG4nLCBjbS5nZXRWYWx1ZSgpKTsKfSwge3ZhbHVlOiAnMTIzNFxuNTY3OFxuYWJjZGVmZ1xuJ30pOwoKLy8gU3dhcGNhc2UgY29tbWFuZHMgZWRpdCBpbiBwbGFjZSBhbmQgZG8gbm90IG1vZGlmeSByZWdpc3RlcnMuCnRlc3RWaW0oJ2d+d19yZXBlYXQnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgLy8gQXNzZXJ0IHRoYXQgZHcgZG9lcyBkZWxldGUgbmV3bGluZSBpZiBpdCBzaG91bGQgZ28gdG8gdGhlIG5leHQgbGluZSwgYW5kCiAgLy8gdGhhdCByZXBlYXQgd29ya3MgcHJvcGVybHkuCiAgdmFyIGN1clN0YXJ0ID0gbWFrZUN1cnNvcigwLCAxKTsKICBjbS5zZXRDdXJzb3IoY3VyU3RhcnQpOwogIGhlbHBlcnMuZG9LZXlzKCdnJywgJ34nLCAnMicsICd3Jyk7CiAgZXEoJyBXT1JEMVxuV09SRDInLCBjbS5nZXRWYWx1ZSgpKTsKICB2YXIgcmVnaXN0ZXIgPSBoZWxwZXJzLmdldFJlZ2lzdGVyQ29udHJvbGxlcigpLmdldFJlZ2lzdGVyKCk7CiAgZXEoJycsIHJlZ2lzdGVyLnRvU3RyaW5nKCkpOwogIGlzKCFyZWdpc3Rlci5saW5ld2lzZSk7CiAgZXFQb3MoY3VyU3RhcnQsIGNtLmdldEN1cnNvcigpKTsKfSwgeyB2YWx1ZTogJyB3b3JkMVxud29yZDInIH0pOwp0ZXN0VmltKCdnfmd+JywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIHZhciBjdXJTdGFydCA9IG1ha2VDdXJzb3IoMCwgMyk7CiAgY20uc2V0Q3Vyc29yKGN1clN0YXJ0KTsKICB2YXIgZXhwZWN0ZWRMaW5lQ291bnQgPSBjbS5saW5lQ291bnQoKTsKICB2YXIgZXhwZWN0ZWRWYWx1ZSA9IGNtLmdldFZhbHVlKCkudG9VcHBlckNhc2UoKTsKICBoZWxwZXJzLmRvS2V5cygnMicsICdnJywgJ34nLCAnMycsICdnJywgJ34nKTsKICBlcShleHBlY3RlZFZhbHVlLCBjbS5nZXRWYWx1ZSgpKTsKICB2YXIgcmVnaXN0ZXIgPSBoZWxwZXJzLmdldFJlZ2lzdGVyQ29udHJvbGxlcigpLmdldFJlZ2lzdGVyKCk7CiAgZXEoJycsIHJlZ2lzdGVyLnRvU3RyaW5nKCkpOwogIGlzKCFyZWdpc3Rlci5saW5ld2lzZSk7CiAgZXFQb3MoY3VyU3RhcnQsIGNtLmdldEN1cnNvcigpKTsKfSwgeyB2YWx1ZTogJyB3b3JkMVxud29yZDJcbndvcmQzXG53b3JkNFxud29yZDVcbndvcmQ2JyB9KTsKdGVzdFZpbSgnZ3VfYW5kX2dVJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIHZhciBjdXJTdGFydCA9IG1ha2VDdXJzb3IoMCwgNyk7CiAgdmFyIHZhbHVlID0gY20uZ2V0VmFsdWUoKTsKICBjbS5zZXRDdXJzb3IoY3VyU3RhcnQpOwogIGhlbHBlcnMuZG9LZXlzKCcyJywgJ2cnLCAnVScsICd3Jyk7CiAgZXEoY20uZ2V0VmFsdWUoKSwgJ3dhIHdiIHhYIFdDIHdkJyk7CiAgZXFQb3MoY3VyU3RhcnQsIGNtLmdldEN1cnNvcigpKTsKICBoZWxwZXJzLmRvS2V5cygnMicsICdnJywgJ3UnLCAndycpOwogIGVxKGNtLmdldFZhbHVlKCksIHZhbHVlKTsKCiAgaGVscGVycy5kb0tleXMoJzInLCAnZycsICdVJywgJ0InKTsKICBlcShjbS5nZXRWYWx1ZSgpLCAnd2EgV0IgWHggd2Mgd2QnKTsKICBlcVBvcyhtYWtlQ3Vyc29yKDAsIDMpLCBjbS5nZXRDdXJzb3IoKSk7CgogIGNtLnNldEN1cnNvcihtYWtlQ3Vyc29yKDAsIDQpKTsKICBoZWxwZXJzLmRvS2V5cygnZycsICd1JywgJ2knLCAndycpOwogIGVxKGNtLmdldFZhbHVlKCksICd3YSB3YiBYeCB3YyB3ZCcpOwogIGVxUG9zKG1ha2VDdXJzb3IoMCwgMyksIGNtLmdldEN1cnNvcigpKTsKCiAgLy8gVE9ETzogc3VwcG9ydCBnVWdVIGd1dQogIC8vIGVxUG9zKG1ha2VDdXJzb3IoMCwgMCksIGNtLmdldEN1cnNvcigpKTsKCiAgdmFyIHJlZ2lzdGVyID0gaGVscGVycy5nZXRSZWdpc3RlckNvbnRyb2xsZXIoKS5nZXRSZWdpc3RlcigpOwogIGVxKCcnLCByZWdpc3Rlci50b1N0cmluZygpKTsKICBpcyghcmVnaXN0ZXIubGluZXdpc2UpOwp9LCB7IHZhbHVlOiAnd2Egd2IgeHggd2Mgd2QnIH0pOwp0ZXN0VmltKCd2aXN1YWxfYmxvY2tfficsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMSwgMSk7CiAgaGVscGVycy5kb0tleXMoJzxDLXY+JywgJ2wnLCAnbCcsICdqJywgJ34nKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDEsIDEpOwogIGVxKCdoZWxsb1xud29STGRcbmFCQ0RlJywgY20uZ2V0VmFsdWUoKSk7CiAgY20uc2V0Q3Vyc29yKDIsIDApOwogIGhlbHBlcnMuZG9LZXlzKCd2JywgJ2wnLCAnbCcsICd+Jyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgyLCAwKTsKICBlcSgnaGVsbG9cbndvUkxkXG5BYmNEZScsIGNtLmdldFZhbHVlKCkpOwp9LHt2YWx1ZTogJ2hlbGxvXG53T3JsZFxuYWJjZGUnIH0pOwp0ZXN0VmltKCcuX3N3YXBDYXNlX3Zpc3VhbEJsb2NrJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGhlbHBlcnMuZG9LZXlzKCc8Qy12PicsICdqJywgJ2onLCAnbCcsICd+Jyk7CiAgY20uc2V0Q3Vyc29yKDAsIDMpOwogIGhlbHBlcnMuZG9LZXlzKCcuJyk7CiAgZXEoJ0hlbExPXG5Xb3JMZFxuQWJjZEUnLCBjbS5nZXRWYWx1ZSgpKTsKfSx7dmFsdWU6ICdoRWxsb1xud09ybERcbmFCY0RlJyB9KTsKdGVzdFZpbSgnLl9kZWxldGVfdmlzdWFsQmxvY2snLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgaGVscGVycy5kb0tleXMoJzxDLXY+JywgJ2onLCAneCcpOwogIGVxKCdpdmVcbmVcbnNvbWVcbnN1Z2FyJywgY20uZ2V0VmFsdWUoKSk7CiAgaGVscGVycy5kb0tleXMoJy4nKTsKICBlcSgndmVcblxuc29tZVxuc3VnYXInLCBjbS5nZXRWYWx1ZSgpKTsKICBoZWxwZXJzLmRvS2V5cygnaicsICdqJywgJy4nKTsKICBlcSgndmVcblxub21lXG51Z2FyJywgY20uZ2V0VmFsdWUoKSk7CiAgaGVscGVycy5kb0tleXMoJ3UnLCAnPEMtcj4nLCAnLicpOwogIGVxKCd2ZVxuXG5tZVxuZ2FyJywgY20uZ2V0VmFsdWUoKSk7Cn0se3ZhbHVlOiAnZ2l2ZVxubWVcbnNvbWVcbnN1Z2FyJyB9KTsKdGVzdFZpbSgnPnttb3Rpb259JywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigxLCAzKTsKICB2YXIgZXhwZWN0ZWRMaW5lQ291bnQgPSBjbS5saW5lQ291bnQoKTsKICB2YXIgZXhwZWN0ZWRWYWx1ZSA9ICcgICB3b3JkMVxuICB3b3JkMlxud29yZDMgJzsKICBoZWxwZXJzLmRvS2V5cygnPicsICdrJyk7CiAgZXEoZXhwZWN0ZWRWYWx1ZSwgY20uZ2V0VmFsdWUoKSk7CiAgdmFyIHJlZ2lzdGVyID0gaGVscGVycy5nZXRSZWdpc3RlckNvbnRyb2xsZXIoKS5nZXRSZWdpc3RlcigpOwogIGVxKCcnLCByZWdpc3Rlci50b1N0cmluZygpKTsKICBpcyghcmVnaXN0ZXIubGluZXdpc2UpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgMyk7Cn0sIHsgdmFsdWU6ICcgd29yZDFcbndvcmQyXG53b3JkMyAnLCBpbmRlbnRVbml0OiAyIH0pOwp0ZXN0VmltKCc+PicsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgMyk7CiAgdmFyIGV4cGVjdGVkTGluZUNvdW50ID0gY20ubGluZUNvdW50KCk7CiAgdmFyIGV4cGVjdGVkVmFsdWUgPSAnICAgd29yZDFcbiAgd29yZDJcbndvcmQzICc7CiAgaGVscGVycy5kb0tleXMoJzInLCAnPicsICc+Jyk7CiAgZXEoZXhwZWN0ZWRWYWx1ZSwgY20uZ2V0VmFsdWUoKSk7CiAgdmFyIHJlZ2lzdGVyID0gaGVscGVycy5nZXRSZWdpc3RlckNvbnRyb2xsZXIoKS5nZXRSZWdpc3RlcigpOwogIGVxKCcnLCByZWdpc3Rlci50b1N0cmluZygpKTsKICBpcyghcmVnaXN0ZXIubGluZXdpc2UpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgMyk7Cn0sIHsgdmFsdWU6ICcgd29yZDFcbndvcmQyXG53b3JkMyAnLCBpbmRlbnRVbml0OiAyIH0pOwp0ZXN0VmltKCc8e21vdGlvbn0nLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDEsIDMpOwogIHZhciBleHBlY3RlZExpbmVDb3VudCA9IGNtLmxpbmVDb3VudCgpOwogIHZhciBleHBlY3RlZFZhbHVlID0gJyB3b3JkMVxud29yZDJcbndvcmQzICc7CiAgaGVscGVycy5kb0tleXMoJzwnLCAnaycpOwogIGVxKGV4cGVjdGVkVmFsdWUsIGNtLmdldFZhbHVlKCkpOwogIHZhciByZWdpc3RlciA9IGhlbHBlcnMuZ2V0UmVnaXN0ZXJDb250cm9sbGVyKCkuZ2V0UmVnaXN0ZXIoKTsKICBlcSgnJywgcmVnaXN0ZXIudG9TdHJpbmcoKSk7CiAgaXMoIXJlZ2lzdGVyLmxpbmV3aXNlKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDEpOwp9LCB7IHZhbHVlOiAnICAgd29yZDFcbiAgd29yZDJcbndvcmQzICcsIGluZGVudFVuaXQ6IDIgfSk7CnRlc3RWaW0oJzw8JywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAzKTsKICB2YXIgZXhwZWN0ZWRMaW5lQ291bnQgPSBjbS5saW5lQ291bnQoKTsKICB2YXIgZXhwZWN0ZWRWYWx1ZSA9ICcgd29yZDFcbndvcmQyXG53b3JkMyAnOwogIGhlbHBlcnMuZG9LZXlzKCcyJywgJzwnLCAnPCcpOwogIGVxKGV4cGVjdGVkVmFsdWUsIGNtLmdldFZhbHVlKCkpOwogIHZhciByZWdpc3RlciA9IGhlbHBlcnMuZ2V0UmVnaXN0ZXJDb250cm9sbGVyKCkuZ2V0UmVnaXN0ZXIoKTsKICBlcSgnJywgcmVnaXN0ZXIudG9TdHJpbmcoKSk7CiAgaXMoIXJlZ2lzdGVyLmxpbmV3aXNlKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDEpOwp9LCB7IHZhbHVlOiAnICAgd29yZDFcbiAgd29yZDJcbndvcmQzICcsIGluZGVudFVuaXQ6IDIgfSk7CgovLyBFZGl0IHRlc3RzCmZ1bmN0aW9uIHRlc3RFZGl0KG5hbWUsIGJlZm9yZSwgcG9zLCBlZGl0LCBhZnRlcikgewogIHJldHVybiB0ZXN0VmltKG5hbWUsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICAgICAgICAgICAgIHZhciBjaCA9IGJlZm9yZS5zZWFyY2gocG9zKQogICAgICAgICAgICAgdmFyIGxpbmUgPSBiZWZvcmUuc3Vic3RyaW5nKDAsIGNoKS5zcGxpdCgnXG4nKS5sZW5ndGggLSAxOwogICAgICAgICAgICAgaWYgKGxpbmUpIHsKICAgICAgICAgICAgICAgY2ggPSBiZWZvcmUuc3Vic3RyaW5nKDAsIGNoKS5zcGxpdCgnXG4nKS5wb3AoKS5sZW5ndGg7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjbS5zZXRDdXJzb3IobGluZSwgY2gpOwogICAgICAgICAgICAgaGVscGVycy5kb0tleXMuYXBwbHkodGhpcywgZWRpdC5zcGxpdCgnJykpOwogICAgICAgICAgICAgZXEoYWZ0ZXIsIGNtLmdldFZhbHVlKCkpOwogICAgICAgICAgIH0sIHt2YWx1ZTogYmVmb3JlfSk7Cn0KCi8vIFRoZXNlIERlbGV0ZSB0ZXN0cyBlZmZlY3RpdmVseSBjb3ZlciB3b3JkLXdpc2UgQ2hhbmdlLCBWaXN1YWwgJiBZYW5rLgovLyBUYWJzIGFyZSB1c2VkIGFzIGRpZmZlcmVudGlhdGVkIHdoaXRlc3BhY2UgdG8gY2F0Y2ggZWRnZSBjYXNlcy4KLy8gTm9ybWFsIHdvcmQ6CnRlc3RFZGl0KCdkaXdfbWlkX3NwYycsICdmb28gXHRiQXJcdCBiYXonLCAvQS8sICdkaXcnLCAnZm9vIFx0XHQgYmF6Jyk7CnRlc3RFZGl0KCdkYXdfbWlkX3NwYycsICdmb28gXHRiQXJcdCBiYXonLCAvQS8sICdkYXcnLCAnZm9vIFx0YmF6Jyk7CnRlc3RFZGl0KCdkaXdfbWlkX3B1bmN0JywgJ2ZvbyBcdGJBci5cdCBiYXonLCAvQS8sICdkaXcnLCAnZm9vIFx0Llx0IGJheicpOwp0ZXN0RWRpdCgnZGF3X21pZF9wdW5jdCcsICdmb28gXHRiQXIuXHQgYmF6JywgL0EvLCAnZGF3JywgJ2Zvby5cdCBiYXonKTsKdGVzdEVkaXQoJ2Rpd19taWRfcHVuY3QyJywgJ2ZvbyBcdCxiQXIuXHQgYmF6JywgL0EvLCAnZGl3JywgJ2ZvbyBcdCwuXHQgYmF6Jyk7CnRlc3RFZGl0KCdkYXdfbWlkX3B1bmN0MicsICdmb28gXHQsYkFyLlx0IGJheicsIC9BLywgJ2RhdycsICdmb28gXHQsLlx0IGJheicpOwp0ZXN0RWRpdCgnZGl3X3N0YXJ0X3NwYycsICdiQXIgXHRiYXonLCAvQS8sICdkaXcnLCAnIFx0YmF6Jyk7CnRlc3RFZGl0KCdkYXdfc3RhcnRfc3BjJywgJ2JBciBcdGJheicsIC9BLywgJ2RhdycsICdiYXonKTsKdGVzdEVkaXQoJ2Rpd19zdGFydF9wdW5jdCcsICdiQXIuIFx0YmF6JywgL0EvLCAnZGl3JywgJy4gXHRiYXonKTsKdGVzdEVkaXQoJ2Rhd19zdGFydF9wdW5jdCcsICdiQXIuIFx0YmF6JywgL0EvLCAnZGF3JywgJy4gXHRiYXonKTsKdGVzdEVkaXQoJ2Rpd19lbmRfc3BjJywgJ2ZvbyBcdGJBcicsIC9BLywgJ2RpdycsICdmb28gXHQnKTsKdGVzdEVkaXQoJ2Rhd19lbmRfc3BjJywgJ2ZvbyBcdGJBcicsIC9BLywgJ2RhdycsICdmb28nKTsKdGVzdEVkaXQoJ2Rpd19lbmRfcHVuY3QnLCAnZm9vIFx0YkFyLicsIC9BLywgJ2RpdycsICdmb28gXHQuJyk7CnRlc3RFZGl0KCdkYXdfZW5kX3B1bmN0JywgJ2ZvbyBcdGJBci4nLCAvQS8sICdkYXcnLCAnZm9vLicpOwovLyBCaWcgd29yZDoKdGVzdEVkaXQoJ2RpV19taWRfc3BjJywgJ2ZvbyBcdGJBclx0IGJheicsIC9BLywgJ2RpVycsICdmb28gXHRcdCBiYXonKTsKdGVzdEVkaXQoJ2RhV19taWRfc3BjJywgJ2ZvbyBcdGJBclx0IGJheicsIC9BLywgJ2RhVycsICdmb28gXHRiYXonKTsKdGVzdEVkaXQoJ2RpV19taWRfcHVuY3QnLCAnZm9vIFx0YkFyLlx0IGJheicsIC9BLywgJ2RpVycsICdmb28gXHRcdCBiYXonKTsKdGVzdEVkaXQoJ2RhV19taWRfcHVuY3QnLCAnZm9vIFx0YkFyLlx0IGJheicsIC9BLywgJ2RhVycsICdmb28gXHRiYXonKTsKdGVzdEVkaXQoJ2RpV19taWRfcHVuY3QyJywgJ2ZvbyBcdCxiQXIuXHQgYmF6JywgL0EvLCAnZGlXJywgJ2ZvbyBcdFx0IGJheicpOwp0ZXN0RWRpdCgnZGFXX21pZF9wdW5jdDInLCAnZm9vIFx0LGJBci5cdCBiYXonLCAvQS8sICdkYVcnLCAnZm9vIFx0YmF6Jyk7CnRlc3RFZGl0KCdkaVdfc3RhcnRfc3BjJywgJ2JBclx0IGJheicsIC9BLywgJ2RpVycsICdcdCBiYXonKTsKdGVzdEVkaXQoJ2RhV19zdGFydF9zcGMnLCAnYkFyXHQgYmF6JywgL0EvLCAnZGFXJywgJ2JheicpOwp0ZXN0RWRpdCgnZGlXX3N0YXJ0X3B1bmN0JywgJ2JBci5cdCBiYXonLCAvQS8sICdkaVcnLCAnXHQgYmF6Jyk7CnRlc3RFZGl0KCdkYVdfc3RhcnRfcHVuY3QnLCAnYkFyLlx0IGJheicsIC9BLywgJ2RhVycsICdiYXonKTsKdGVzdEVkaXQoJ2RpV19lbmRfc3BjJywgJ2ZvbyBcdGJBcicsIC9BLywgJ2RpVycsICdmb28gXHQnKTsKdGVzdEVkaXQoJ2RhV19lbmRfc3BjJywgJ2ZvbyBcdGJBcicsIC9BLywgJ2RhVycsICdmb28nKTsKdGVzdEVkaXQoJ2RpV19lbmRfcHVuY3QnLCAnZm9vIFx0YkFyLicsIC9BLywgJ2RpVycsICdmb28gXHQnKTsKdGVzdEVkaXQoJ2RhV19lbmRfcHVuY3QnLCAnZm9vIFx0YkFyLicsIC9BLywgJ2RhVycsICdmb28nKTsKLy8gRGVsZXRpbmcgdGV4dCBvYmplY3RzCi8vICAgIE9wZW4gYW5kIGNsb3NlIG9uIHNhbWUgbGluZQp0ZXN0RWRpdCgnZGkoX29wZW5fc3BjJywgJ2ZvbyAoYkFyKSBiYXonLCAvXCgvLCAnZGkoJywgJ2ZvbyAoKSBiYXonKTsKdGVzdEVkaXQoJ2RpKV9vcGVuX3NwYycsICdmb28gKGJBcikgYmF6JywgL1woLywgJ2RpKScsICdmb28gKCkgYmF6Jyk7CnRlc3RFZGl0KCdkaWJfb3Blbl9zcGMnLCAnZm9vIChiQXIpIGJheicsIC9cKC8sICdkaWInLCAnZm9vICgpIGJheicpOwp0ZXN0RWRpdCgnZGEoX29wZW5fc3BjJywgJ2ZvbyAoYkFyKSBiYXonLCAvXCgvLCAnZGEoJywgJ2ZvbyAgYmF6Jyk7CnRlc3RFZGl0KCdkYSlfb3Blbl9zcGMnLCAnZm9vIChiQXIpIGJheicsIC9cKC8sICdkYSknLCAnZm9vICBiYXonKTsKCnRlc3RFZGl0KCdkaShfbWlkZGxlX3NwYycsICdmb28gKGJBcikgYmF6JywgL0EvLCAnZGkoJywgJ2ZvbyAoKSBiYXonKTsKdGVzdEVkaXQoJ2RpKV9taWRkbGVfc3BjJywgJ2ZvbyAoYkFyKSBiYXonLCAvQS8sICdkaSknLCAnZm9vICgpIGJheicpOwp0ZXN0RWRpdCgnZGEoX21pZGRsZV9zcGMnLCAnZm9vIChiQXIpIGJheicsIC9BLywgJ2RhKCcsICdmb28gIGJheicpOwp0ZXN0RWRpdCgnZGEpX21pZGRsZV9zcGMnLCAnZm9vIChiQXIpIGJheicsIC9BLywgJ2RhKScsICdmb28gIGJheicpOwoKdGVzdEVkaXQoJ2RpKF9jbG9zZV9zcGMnLCAnZm9vIChiQXIpIGJheicsIC9cKS8sICdkaSgnLCAnZm9vICgpIGJheicpOwp0ZXN0RWRpdCgnZGkpX2Nsb3NlX3NwYycsICdmb28gKGJBcikgYmF6JywgL1wpLywgJ2RpKScsICdmb28gKCkgYmF6Jyk7CnRlc3RFZGl0KCdkYShfY2xvc2Vfc3BjJywgJ2ZvbyAoYkFyKSBiYXonLCAvXCkvLCAnZGEoJywgJ2ZvbyAgYmF6Jyk7CnRlc3RFZGl0KCdkYSlfY2xvc2Vfc3BjJywgJ2ZvbyAoYkFyKSBiYXonLCAvXCkvLCAnZGEpJywgJ2ZvbyAgYmF6Jyk7CgovLyAgZGVsZXRlIGFyb3VuZCBhbmQgaW5uZXIgYi4KdGVzdEVkaXQoJ2RhYl9vbl8oX3Nob3VsZF9kZWxldGVfYXJvdW5kXygpYmxvY2snLCAnbyggaW4oYWJjKSApJywgL1woYS8sICdkYWInLCAnbyggaW4gKScpOwoKLy8gIGRlbGV0ZSBhcm91bmQgYW5kIGlubmVyIEIuCnRlc3RFZGl0KCdkYUJfb25fe19zaG91bGRfZGVsZXRlX2Fyb3VuZF97fWJsb2NrJywgJ297IGlue2FiY30gfScsIC97YS8sICdkYUInLCAnb3sgaW4gfScpOwp0ZXN0RWRpdCgnZGlCX29uX3tfc2hvdWxkX2RlbGV0ZV9pbm5lcl97fWJsb2NrJywgJ297IGlue2FiY30gfScsIC97YS8sICdkaUInLCAnb3sgaW57fSB9Jyk7Cgp0ZXN0RWRpdCgnZGF7X29uX3tfc2hvdWxkX2RlbGV0ZV9pbm5lcl9ibG9jaycsICdveyBpbnthYmN9IH0nLCAve2EvLCAnZGF7JywgJ297IGluIH0nKTsKdGVzdEVkaXQoJ2RpW19vbl8oX3Nob3VsZF9ub3RfZGVsZXRlJywgJ2ZvbyAoYkFyKSBiYXonLCAvXCgvLCAnZGlbJywgJ2ZvbyAoYkFyKSBiYXonKTsKdGVzdEVkaXQoJ2RpW19vbl8pX3Nob3VsZF9ub3RfZGVsZXRlJywgJ2ZvbyAoYkFyKSBiYXonLCAvXCkvLCAnZGlbJywgJ2ZvbyAoYkFyKSBiYXonKTsKdGVzdEVkaXQoJ2RhW19vbl8oX3Nob3VsZF9ub3RfZGVsZXRlJywgJ2ZvbyAoYkFyKSBiYXonLCAvXCgvLCAnZGFbJywgJ2ZvbyAoYkFyKSBiYXonKTsKdGVzdEVkaXQoJ2RhW19vbl8pX3Nob3VsZF9ub3RfZGVsZXRlJywgJ2ZvbyAoYkFyKSBiYXonLCAvXCkvLCAnZGFbJywgJ2ZvbyAoYkFyKSBiYXonKTsKdGVzdE1vdGlvbignZGkoX291dHNpZGVfc2hvdWxkX3N0YXknLCBbJ2QnLCAnaScsICcoJ10sIHsgbGluZTogMCwgY2g6IDB9LCB7IGxpbmU6IDAsIGNoOiAwfSk7CgovLyAgT3BlbiBhbmQgY2xvc2Ugb24gZGlmZmVyZW50IGxpbmVzLCBlcXVhbGx5IGluZGVudGVkCnRlc3RFZGl0KCdkaXtfbWlkZGxlX3NwYycsICdhe1xuXHRiYXJcbn1iJywgL3IvLCAnZGl7JywgJ2F7fWInKTsKdGVzdEVkaXQoJ2RpfV9taWRkbGVfc3BjJywgJ2F7XG5cdGJhclxufWInLCAvci8sICdkaX0nLCAnYXt9YicpOwp0ZXN0RWRpdCgnZGF7X21pZGRsZV9zcGMnLCAnYXtcblx0YmFyXG59YicsIC9yLywgJ2RheycsICdhYicpOwp0ZXN0RWRpdCgnZGF9X21pZGRsZV9zcGMnLCAnYXtcblx0YmFyXG59YicsIC9yLywgJ2RhfScsICdhYicpOwp0ZXN0RWRpdCgnZGFCX21pZGRsZV9zcGMnLCAnYXtcblx0YmFyXG59YicsIC9yLywgJ2RhQicsICdhYicpOwoKLy8gb3BlbiBhbmQgY2xvc2Ugb24gZGlmZiBsaW5lcywgb3BlbiBpbmRlbnRlZCBsZXNzIHRoYW4gY2xvc2UKdGVzdEVkaXQoJ2Rpe19taWRkbGVfc3BjJywgJ2F7XG5cdGJhclxuXHR9YicsIC9yLywgJ2RpeycsICdhe31iJyk7CnRlc3RFZGl0KCdkaX1fbWlkZGxlX3NwYycsICdhe1xuXHRiYXJcblx0fWInLCAvci8sICdkaX0nLCAnYXt9YicpOwp0ZXN0RWRpdCgnZGF7X21pZGRsZV9zcGMnLCAnYXtcblx0YmFyXG5cdH1iJywgL3IvLCAnZGF7JywgJ2FiJyk7CnRlc3RFZGl0KCdkYX1fbWlkZGxlX3NwYycsICdhe1xuXHRiYXJcblx0fWInLCAvci8sICdkYX0nLCAnYWInKTsKCi8vIG9wZW4gYW5kIGNsb3NlIG9uIGRpZmYgbGluZXMsIG9wZW4gaW5kZW50ZWQgbW9yZSB0aGFuIGNsb3NlCnRlc3RFZGl0KCdkaVtfbWlkZGxlX3NwYycsICdhXHRbXG5cdGJhclxuXWInLCAvci8sICdkaVsnLCAnYVx0W11iJyk7CnRlc3RFZGl0KCdkaV1fbWlkZGxlX3NwYycsICdhXHRbXG5cdGJhclxuXWInLCAvci8sICdkaV0nLCAnYVx0W11iJyk7CnRlc3RFZGl0KCdkYVtfbWlkZGxlX3NwYycsICdhXHRbXG5cdGJhclxuXWInLCAvci8sICdkYVsnLCAnYVx0YicpOwp0ZXN0RWRpdCgnZGFdX21pZGRsZV9zcGMnLCAnYVx0W1xuXHRiYXJcbl1iJywgL3IvLCAnZGFdJywgJ2FcdGInKTsKCmZ1bmN0aW9uIHRlc3RTZWxlY3Rpb24obmFtZSwgYmVmb3JlLCBwb3MsIGtleXMsIHNlbCkgewogIHJldHVybiB0ZXN0VmltKG5hbWUsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICAgICAgICAgICAgIHZhciBjaCA9IGJlZm9yZS5zZWFyY2gocG9zKQogICAgICAgICAgICAgdmFyIGxpbmUgPSBiZWZvcmUuc3Vic3RyaW5nKDAsIGNoKS5zcGxpdCgnXG4nKS5sZW5ndGggLSAxOwogICAgICAgICAgICAgaWYgKGxpbmUpIHsKICAgICAgICAgICAgICAgY2ggPSBiZWZvcmUuc3Vic3RyaW5nKDAsIGNoKS5zcGxpdCgnXG4nKS5wb3AoKS5sZW5ndGg7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBjbS5zZXRDdXJzb3IobGluZSwgY2gpOwogICAgICAgICAgICAgaGVscGVycy5kb0tleXMuYXBwbHkodGhpcywga2V5cy5zcGxpdCgnJykpOwogICAgICAgICAgICAgZXEoc2VsLCBjbS5nZXRTZWxlY3Rpb24oKSk7CiAgICAgICAgICAgfSwge3ZhbHVlOiBiZWZvcmV9KTsKfQp0ZXN0U2VsZWN0aW9uKCd2aXdfbWlkZGxlX3NwYycsICdmb28gXHRiQXJcdCBiYXonLCAvQS8sICd2aXcnLCAnYkFyJyk7CnRlc3RTZWxlY3Rpb24oJ3Zhd19taWRkbGVfc3BjJywgJ2ZvbyBcdGJBclx0IGJheicsIC9BLywgJ3ZhdycsICdiQXJcdCAnKTsKdGVzdFNlbGVjdGlvbigndml3X21pZGRsZV9wdW5jdCcsICdmb28gXHRiQXIsXHQgYmF6JywgL0EvLCAndml3JywgJ2JBcicpOwp0ZXN0U2VsZWN0aW9uKCd2YVdfbWlkZGxlX3B1bmN0JywgJ2ZvbyBcdGJBcixcdCBiYXonLCAvQS8sICd2YVcnLCAnYkFyLFx0ICcpOwp0ZXN0U2VsZWN0aW9uKCd2aXdfc3RhcnRfc3BjJywgJ2ZvbyBcdGJBclx0IGJheicsIC9iLywgJ3ZpdycsICdiQXInKTsKdGVzdFNlbGVjdGlvbigndml3X2VuZF9zcGMnLCAnZm9vIFx0YkFyXHQgYmF6JywgL3IvLCAndml3JywgJ2JBcicpOwp0ZXN0U2VsZWN0aW9uKCd2aXdfZW9sJywgJ2ZvbyBcdGJBcicsIC9yLywgJ3ZpdycsICdiQXInKTsKdGVzdFNlbGVjdGlvbigndml7X21pZGRsZV9zcGMnLCAnYXtcblx0YmFyXG5cdH1iJywgL3IvLCAndml7JywgJ1xuXHRiYXJcblx0Jyk7CnRlc3RTZWxlY3Rpb24oJ3Zhe19taWRkbGVfc3BjJywgJ2F7XG5cdGJhclxuXHR9YicsIC9yLywgJ3ZheycsICd7XG5cdGJhclxuXHR9Jyk7Cgp0ZXN0VmltKCdtb3VzZV9zZWxlY3QnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0U2VsZWN0aW9uKFBvcygwLCAyKSwgUG9zKDAsIDQpLCB7b3JpZ2luOiAnKm1vdXNlJ30pOwogIGlzKGNtLnN0YXRlLnZpbS52aXN1YWxNb2RlKTsKICBpcyghY20uc3RhdGUudmltLnZpc3VhbExpbmUpOwogIGlzKCFjbS5zdGF0ZS52aW0udmlzdWFsQmxvY2spOwogIGhlbHBlcnMuZG9LZXlzKCc8RXNjPicpOwogIGlzKCFjbS5zb21ldGhpbmdTZWxlY3RlZCgpKTsKICBoZWxwZXJzLmRvS2V5cygnZycsICd2Jyk7CiAgZXEoJ2NkJywgY20uZ2V0U2VsZWN0aW9uKCkpOwp9LCB7dmFsdWU6ICdhYmNkZWYnfSk7CgovLyBPcGVyYXRvci1tb3Rpb24gdGVzdHMKdGVzdFZpbSgnRCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgMyk7CiAgaGVscGVycy5kb0tleXMoJ0QnKTsKICBlcSgnIHdvXG53b3JkMlxuIHdvcmQzJywgY20uZ2V0VmFsdWUoKSk7CiAgdmFyIHJlZ2lzdGVyID0gaGVscGVycy5nZXRSZWdpc3RlckNvbnRyb2xsZXIoKS5nZXRSZWdpc3RlcigpOwogIGVxKCdyZDEnLCByZWdpc3Rlci50b1N0cmluZygpKTsKICBpcyghcmVnaXN0ZXIubGluZXdpc2UpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgMik7Cn0sIHsgdmFsdWU6ICcgd29yZDFcbndvcmQyXG4gd29yZDMnIH0pOwp0ZXN0VmltKCdDJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIHZhciBjdXJTdGFydCA9IG1ha2VDdXJzb3IoMCwgMyk7CiAgY20uc2V0Q3Vyc29yKGN1clN0YXJ0KTsKICBoZWxwZXJzLmRvS2V5cygnQycpOwogIGVxKCcgd29cbndvcmQyXG4gd29yZDMnLCBjbS5nZXRWYWx1ZSgpKTsKICB2YXIgcmVnaXN0ZXIgPSBoZWxwZXJzLmdldFJlZ2lzdGVyQ29udHJvbGxlcigpLmdldFJlZ2lzdGVyKCk7CiAgZXEoJ3JkMScsIHJlZ2lzdGVyLnRvU3RyaW5nKCkpOwogIGlzKCFyZWdpc3Rlci5saW5ld2lzZSk7CiAgZXFQb3MoY3VyU3RhcnQsIGNtLmdldEN1cnNvcigpKTsKICBlcSgndmltLWluc2VydCcsIGNtLmdldE9wdGlvbigna2V5TWFwJykpOwp9LCB7IHZhbHVlOiAnIHdvcmQxXG53b3JkMlxuIHdvcmQzJyB9KTsKdGVzdFZpbSgnWScsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICB2YXIgY3VyU3RhcnQgPSBtYWtlQ3Vyc29yKDAsIDMpOwogIGNtLnNldEN1cnNvcihjdXJTdGFydCk7CiAgaGVscGVycy5kb0tleXMoJ1knKTsKICBlcSgnIHdvcmQxXG53b3JkMlxuIHdvcmQzJywgY20uZ2V0VmFsdWUoKSk7CiAgdmFyIHJlZ2lzdGVyID0gaGVscGVycy5nZXRSZWdpc3RlckNvbnRyb2xsZXIoKS5nZXRSZWdpc3RlcigpOwogIGVxKCdyZDEnLCByZWdpc3Rlci50b1N0cmluZygpKTsKICBpcyghcmVnaXN0ZXIubGluZXdpc2UpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgMyk7Cn0sIHsgdmFsdWU6ICcgd29yZDFcbndvcmQyXG4gd29yZDMnIH0pOwp0ZXN0VmltKCd+JywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGhlbHBlcnMuZG9LZXlzKCczJywgJ34nKTsKICBlcSgnQUJDZGVmZycsIGNtLmdldFZhbHVlKCkpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgMyk7Cn0sIHsgdmFsdWU6ICdhYmNkZWZnJyB9KTsKCi8vIEFjdGlvbiB0ZXN0cwp0ZXN0VmltKCdjdHJsLWEnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDApOwogIGhlbHBlcnMuZG9LZXlzKCc8Qy1hPicpOwogIGVxKCctOScsIGNtLmdldFZhbHVlKCkpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgMSk7CiAgaGVscGVycy5kb0tleXMoJzInLCc8Qy1hPicpOwogIGVxKCctNycsIGNtLmdldFZhbHVlKCkpOwp9LCB7dmFsdWU6ICctMTAnfSk7CnRlc3RWaW0oJ2N0cmwteCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJzxDLXg+Jyk7CiAgZXEoJy0xJywgY20uZ2V0VmFsdWUoKSk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCAxKTsKICBoZWxwZXJzLmRvS2V5cygnMicsJzxDLXg+Jyk7CiAgZXEoJy0zJywgY20uZ2V0VmFsdWUoKSk7Cn0sIHt2YWx1ZTogJzAnfSk7CnRlc3RWaW0oJzxDLXg+LzxDLWE+IHNlYXJjaCBmb3J3YXJkJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGZvckVhY2goWyc8Qy14PicsICc8Qy1hPiddLCBmdW5jdGlvbihrZXkpIHsKICAgIGNtLnNldEN1cnNvcigwLCAwKTsKICAgIGhlbHBlcnMuZG9LZXlzKGtleSk7CiAgICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDUpOwogICAgaGVscGVycy5kb0tleXMoJ2wnKTsKICAgIGhlbHBlcnMuZG9LZXlzKGtleSk7CiAgICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDEwKTsKICAgIGNtLnNldEN1cnNvcigwLCAxMSk7CiAgICBoZWxwZXJzLmRvS2V5cyhrZXkpOwogICAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCAxMSk7CiAgfSk7Cn0sIHt2YWx1ZTogJ19fam1wMSBqbXAyIGptcCd9KTsKdGVzdFZpbSgnYScsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgMSk7CiAgaGVscGVycy5kb0tleXMoJ2EnKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDIpOwogIGVxKCd2aW0taW5zZXJ0JywgY20uZ2V0T3B0aW9uKCdrZXlNYXAnKSk7Cn0pOwp0ZXN0VmltKCdhX2VvbCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgbGluZXNbMF0ubGVuZ3RoIC0gMSk7CiAgaGVscGVycy5kb0tleXMoJ2EnKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIGxpbmVzWzBdLmxlbmd0aCk7CiAgZXEoJ3ZpbS1pbnNlcnQnLCBjbS5nZXRPcHRpb24oJ2tleU1hcCcpKTsKfSk7CnRlc3RWaW0oJ0FfZW5kT2ZTZWxlY3RlZEFyZWEnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDApOwogIGhlbHBlcnMuZG9LZXlzKCd2JywgJ2onLCAnbCcpOwogIGhlbHBlcnMuZG9LZXlzKCdBJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgxLCAyKTsKICBlcSgndmltLWluc2VydCcsIGNtLmdldE9wdGlvbigna2V5TWFwJykpOwp9LCB7dmFsdWU6ICdmb29cbmJhcid9KTsKdGVzdFZpbSgnaScsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgMSk7CiAgaGVscGVycy5kb0tleXMoJ2knKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDEpOwogIGVxKCd2aW0taW5zZXJ0JywgY20uZ2V0T3B0aW9uKCdrZXlNYXAnKSk7Cn0pOwp0ZXN0VmltKCdpX3JlcGVhdCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBoZWxwZXJzLmRvS2V5cygnMycsICdpJyk7CiAgY20ucmVwbGFjZVJhbmdlKCd0ZXN0JywgY20uZ2V0Q3Vyc29yKCkpOwogIGhlbHBlcnMuZG9LZXlzKCc8RXNjPicpOwogIGVxKCd0ZXN0dGVzdHRlc3QnLCBjbS5nZXRWYWx1ZSgpKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDExKTsKfSwgeyB2YWx1ZTogJycgfSk7CnRlc3RWaW0oJ2lfcmVwZWF0X2RlbGV0ZScsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgNCk7CiAgaGVscGVycy5kb0tleXMoJzInLCAnaScpOwogIGNtLnJlcGxhY2VSYW5nZSgneicsIGNtLmdldEN1cnNvcigpKTsKICBoZWxwZXJzLmRvSW5zZXJ0TW9kZUtleXMoJ0JhY2tzcGFjZScsICdCYWNrc3BhY2UnKTsKICBoZWxwZXJzLmRvS2V5cygnPEVzYz4nKTsKICBlcSgnYWJlJywgY20uZ2V0VmFsdWUoKSk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCAxKTsKfSwgeyB2YWx1ZTogJ2FiY2RlJyB9KTsKdGVzdFZpbSgnaW5zZXJ0JywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGhlbHBlcnMuZG9LZXlzKCdpJyk7CiAgZXEoJ3ZpbS1pbnNlcnQnLCBjbS5nZXRPcHRpb24oJ2tleU1hcCcpKTsKICBlcShmYWxzZSwgY20uc3RhdGUub3ZlcndyaXRlKTsKICBoZWxwZXJzLmRvS2V5cygnPElucz4nKTsKICBlcSgndmltLXJlcGxhY2UnLCBjbS5nZXRPcHRpb24oJ2tleU1hcCcpKTsKICBlcSh0cnVlLCBjbS5zdGF0ZS5vdmVyd3JpdGUpOwogIGhlbHBlcnMuZG9LZXlzKCc8SW5zPicpOwogIGVxKCd2aW0taW5zZXJ0JywgY20uZ2V0T3B0aW9uKCdrZXlNYXAnKSk7CiAgZXEoZmFsc2UsIGNtLnN0YXRlLm92ZXJ3cml0ZSk7Cn0pOwp0ZXN0VmltKCdpX2JhY2tzcGFjZScsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgMTApOwogIGhlbHBlcnMuZG9LZXlzKCdpJyk7CiAgaGVscGVycy5kb0luc2VydE1vZGVLZXlzKCdCYWNrc3BhY2UnKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDkpOwogIGVxKCcwMTIzNDU2NzgnLCBjbS5nZXRWYWx1ZSgpKTsKfSwgeyB2YWx1ZTogJzAxMjM0NTY3ODknfSk7CnRlc3RWaW0oJ2lfb3ZlcndyaXRlX2JhY2tzcGFjZScsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgMTApOwogIGhlbHBlcnMuZG9LZXlzKCdpJyk7CiAgaGVscGVycy5kb0tleXMoJzxJbnM+Jyk7CiAgaGVscGVycy5kb0luc2VydE1vZGVLZXlzKCdCYWNrc3BhY2UnKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDkpOwogIGVxKCcwMTIzNDU2Nzg5JywgY20uZ2V0VmFsdWUoKSk7Cn0sIHsgdmFsdWU6ICcwMTIzNDU2Nzg5J30pOwp0ZXN0VmltKCdBJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGhlbHBlcnMuZG9LZXlzKCdBJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCBsaW5lc1swXS5sZW5ndGgpOwogIGVxKCd2aW0taW5zZXJ0JywgY20uZ2V0T3B0aW9uKCdrZXlNYXAnKSk7Cn0pOwp0ZXN0VmltKCdBX3Zpc3VhbF9ibG9jaycsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgMSk7CiAgaGVscGVycy5kb0tleXMoJzxDLXY+JywgJzInLCAnaicsICdsJywgJ2wnLCAnQScpOwogIHZhciByZXBsYWNlbWVudCA9IG5ldyBBcnJheShjbS5saXN0U2VsZWN0aW9ucygpLmxlbmd0aCsxKS5qb2luKCdoZWxsbyAnKS5zcGxpdCgnICcpOwogIHJlcGxhY2VtZW50LnBvcCgpOwogIGNtLnJlcGxhY2VTZWxlY3Rpb25zKHJlcGxhY2VtZW50KTsKICBlcSgndGVzdGhlbGxvXG5tZWhlbGxvXG5wbGVhaGVsbG9zZScsIGNtLmdldFZhbHVlKCkpOwogIGhlbHBlcnMuZG9LZXlzKCc8RXNjPicpOwogIGNtLnNldEN1cnNvcigwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnLicpOwogIC8vIFRPRE8gdGhpcyBkb2Vzbid0IHdvcmsgeWV0CiAgLy8gZXEoJ3Rlc2hlbGxvdGhlbGxvXG5tZSBoZWxsbyBoZWxsb1xucGxlaGVsbG9haGVsbG9zZScsIGNtLmdldFZhbHVlKCkpOwp9LCB7dmFsdWU6ICd0ZXN0XG5tZVxucGxlYXNlJ30pOwp0ZXN0VmltKCdJJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCA0KTsKICBoZWxwZXJzLmRvS2V5cygnSScpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgbGluZXNbMF0udGV4dFN0YXJ0KTsKICBlcSgndmltLWluc2VydCcsIGNtLmdldE9wdGlvbigna2V5TWFwJykpOwp9KTsKdGVzdFZpbSgnSV9yZXBlYXQnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDEpOwogIGhlbHBlcnMuZG9LZXlzKCczJywgJ0knKTsKICBjbS5yZXBsYWNlUmFuZ2UoJ3Rlc3QnLCBjbS5nZXRDdXJzb3IoKSk7CiAgaGVscGVycy5kb0tleXMoJzxFc2M+Jyk7CiAgZXEoJ3Rlc3R0ZXN0dGVzdGJsYWgnLCBjbS5nZXRWYWx1ZSgpKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDExKTsKfSwgeyB2YWx1ZTogJ2JsYWgnIH0pOwp0ZXN0VmltKCdJX3Zpc3VhbF9ibG9jaycsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJzxDLXY+JywgJzInLCAnaicsICdsJywgJ2wnLCAnSScpOwogIHZhciByZXBsYWNlbWVudCA9IG5ldyBBcnJheShjbS5saXN0U2VsZWN0aW9ucygpLmxlbmd0aCsxKS5qb2luKCdoZWxsbyAnKS5zcGxpdCgnICcpOwogIHJlcGxhY2VtZW50LnBvcCgpOwogIGNtLnJlcGxhY2VTZWxlY3Rpb25zKHJlcGxhY2VtZW50KTsKICBlcSgnaGVsbG90ZXN0XG5oZWxsb21lXG5oZWxsb3BsZWFzZScsIGNtLmdldFZhbHVlKCkpOwp9LCB7dmFsdWU6ICd0ZXN0XG5tZVxucGxlYXNlJ30pOwp0ZXN0VmltKCdvJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCA0KTsKICBoZWxwZXJzLmRvS2V5cygnbycpOwogIGVxKCd3b3JkMVxuXG53b3JkMicsIGNtLmdldFZhbHVlKCkpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMSwgMCk7CiAgZXEoJ3ZpbS1pbnNlcnQnLCBjbS5nZXRPcHRpb24oJ2tleU1hcCcpKTsKfSwgeyB2YWx1ZTogJ3dvcmQxXG53b3JkMicgfSk7CnRlc3RWaW0oJ29fcmVwZWF0JywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnMycsICdvJyk7CiAgY20ucmVwbGFjZVJhbmdlKCd0ZXN0JywgY20uZ2V0Q3Vyc29yKCkpOwogIGhlbHBlcnMuZG9LZXlzKCc8RXNjPicpOwogIGVxKCdcbnRlc3RcbnRlc3RcbnRlc3QnLCBjbS5nZXRWYWx1ZSgpKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDMsIDMpOwp9LCB7IHZhbHVlOiAnJyB9KTsKdGVzdFZpbSgnTycsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgNCk7CiAgaGVscGVycy5kb0tleXMoJ08nKTsKICBlcSgnXG53b3JkMVxud29yZDInLCBjbS5nZXRWYWx1ZSgpKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDApOwogIGVxKCd2aW0taW5zZXJ0JywgY20uZ2V0T3B0aW9uKCdrZXlNYXAnKSk7Cn0sIHsgdmFsdWU6ICd3b3JkMVxud29yZDInIH0pOwp0ZXN0VmltKCdKJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCA0KTsKICBoZWxwZXJzLmRvS2V5cygnSicpOwogIHZhciBleHBlY3RlZFZhbHVlID0gJ3dvcmQxICB3b3JkMlxud29yZDNcbiB3b3JkNCc7CiAgZXEoZXhwZWN0ZWRWYWx1ZSwgY20uZ2V0VmFsdWUoKSk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCBleHBlY3RlZFZhbHVlLmluZGV4T2YoJ3dvcmQyJykgLSAxKTsKfSwgeyB2YWx1ZTogJ3dvcmQxIFxuICAgIHdvcmQyXG53b3JkM1xuIHdvcmQ0JyB9KTsKdGVzdFZpbSgnSl9yZXBlYXQnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDQpOwogIGhlbHBlcnMuZG9LZXlzKCczJywgJ0onKTsKICB2YXIgZXhwZWN0ZWRWYWx1ZSA9ICd3b3JkMSAgd29yZDIgd29yZDNcbiB3b3JkNCc7CiAgZXEoZXhwZWN0ZWRWYWx1ZSwgY20uZ2V0VmFsdWUoKSk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCBleHBlY3RlZFZhbHVlLmluZGV4T2YoJ3dvcmQzJykgLSAxKTsKfSwgeyB2YWx1ZTogJ3dvcmQxIFxuICAgIHdvcmQyXG53b3JkM1xuIHdvcmQ0JyB9KTsKdGVzdFZpbSgncCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgMSk7CiAgaGVscGVycy5nZXRSZWdpc3RlckNvbnRyb2xsZXIoKS5wdXNoVGV4dCgnIicsICd5YW5rJywgJ2FiY1xuZGVmJywgZmFsc2UpOwogIGhlbHBlcnMuZG9LZXlzKCdwJyk7CiAgZXEoJ19fYWJjXG5kZWZfJywgY20uZ2V0VmFsdWUoKSk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgxLCAyKTsKfSwgeyB2YWx1ZTogJ19fXycgfSk7CnRlc3RWaW0oJ3BfcmVnaXN0ZXInLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDEpOwogIGhlbHBlcnMuZ2V0UmVnaXN0ZXJDb250cm9sbGVyKCkuZ2V0UmVnaXN0ZXIoJ2EnKS5zZXRUZXh0KCdhYmNcbmRlZicsIGZhbHNlKTsKICBoZWxwZXJzLmRvS2V5cygnIicsICdhJywgJ3AnKTsKICBlcSgnX19hYmNcbmRlZl8nLCBjbS5nZXRWYWx1ZSgpKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDEsIDIpOwp9LCB7IHZhbHVlOiAnX19fJyB9KTsKdGVzdFZpbSgncF93cm9uZ19yZWdpc3RlcicsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgMSk7CiAgaGVscGVycy5nZXRSZWdpc3RlckNvbnRyb2xsZXIoKS5nZXRSZWdpc3RlcignYScpLnNldFRleHQoJ2FiY1xuZGVmJywgZmFsc2UpOwogIGhlbHBlcnMuZG9LZXlzKCdwJyk7CiAgZXEoJ19fXycsIGNtLmdldFZhbHVlKCkpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgMSk7Cn0sIHsgdmFsdWU6ICdfX18nIH0pOwp0ZXN0VmltKCdwX2xpbmUnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDEpOwogIGhlbHBlcnMuZ2V0UmVnaXN0ZXJDb250cm9sbGVyKCkucHVzaFRleHQoJyInLCAneWFuaycsICcgIGFcbmRcbicsIHRydWUpOwogIGhlbHBlcnMuZG9LZXlzKCcyJywgJ3AnKTsKICBlcSgnX19fXG4gIGFcbmRcbiAgYVxuZCcsIGNtLmdldFZhbHVlKCkpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMSwgMik7Cn0sIHsgdmFsdWU6ICdfX18nIH0pOwp0ZXN0VmltKCdwX2xhc3RsaW5lJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAxKTsKICBoZWxwZXJzLmdldFJlZ2lzdGVyQ29udHJvbGxlcigpLnB1c2hUZXh0KCciJywgJ3lhbmsnLCAnICBhXG5kJywgdHJ1ZSk7CiAgaGVscGVycy5kb0tleXMoJzInLCAncCcpOwogIGVxKCdfX19cbiAgYVxuZFxuICBhXG5kJywgY20uZ2V0VmFsdWUoKSk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgxLCAyKTsKfSwgeyB2YWx1ZTogJ19fXycgfSk7CnRlc3RWaW0oJ11wX2ZpcnN0X2luZGVudF9pc19zbWFsbGVyJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGhlbHBlcnMuZ2V0UmVnaXN0ZXJDb250cm9sbGVyKCkucHVzaFRleHQoJyInLCAneWFuaycsICcgIGFiY1xuICAgIGRlZlxuJywgdHJ1ZSk7CiAgaGVscGVycy5kb0tleXMoJ10nLCAncCcpOwogIGVxKCcgIF9fX1xuICBhYmNcbiAgICBkZWYnLCBjbS5nZXRWYWx1ZSgpKTsKfSwgeyB2YWx1ZTogJyAgX19fJyB9KTsKdGVzdFZpbSgnXXBfZmlyc3RfaW5kZW50X2lzX2xhcmdlcicsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBoZWxwZXJzLmdldFJlZ2lzdGVyQ29udHJvbGxlcigpLnB1c2hUZXh0KCciJywgJ3lhbmsnLCAnICAgIGFiY1xuICBkZWZcbicsIHRydWUpOwogIGhlbHBlcnMuZG9LZXlzKCddJywgJ3AnKTsKICBlcSgnICBfX19cbiAgYWJjXG5kZWYnLCBjbS5nZXRWYWx1ZSgpKTsKfSwgeyB2YWx1ZTogJyAgX19fJyB9KTsKdGVzdFZpbSgnXXBfd2l0aF90YWJfaW5kZW50cycsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBoZWxwZXJzLmdldFJlZ2lzdGVyQ29udHJvbGxlcigpLnB1c2hUZXh0KCciJywgJ3lhbmsnLCAnXHRcdGFiY1xuXHRcdFx0ZGVmXG4nLCB0cnVlKTsKICBoZWxwZXJzLmRvS2V5cygnXScsICdwJyk7CiAgZXEoJ1x0X19fXG5cdGFiY1xuXHRcdGRlZicsIGNtLmdldFZhbHVlKCkpOwp9LCB7IHZhbHVlOiAnXHRfX18nLCBpbmRlbnRXaXRoVGFiczogdHJ1ZX0pOwp0ZXN0VmltKCddcF93aXRoX3NwYWNlc190cmFuc2xhdGVkX3RvX3RhYnMnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgaGVscGVycy5nZXRSZWdpc3RlckNvbnRyb2xsZXIoKS5wdXNoVGV4dCgnIicsICd5YW5rJywgJyAgYWJjXG4gICAgZGVmXG4nLCB0cnVlKTsKICBoZWxwZXJzLmRvS2V5cygnXScsICdwJyk7CiAgZXEoJ1x0X19fXG5cdGFiY1xuXHRcdGRlZicsIGNtLmdldFZhbHVlKCkpOwp9LCB7IHZhbHVlOiAnXHRfX18nLCBpbmRlbnRXaXRoVGFiczogdHJ1ZSwgdGFiU2l6ZTogMiB9KTsKdGVzdFZpbSgnW3AnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgaGVscGVycy5nZXRSZWdpc3RlckNvbnRyb2xsZXIoKS5wdXNoVGV4dCgnIicsICd5YW5rJywgJyAgYWJjXG4gICAgZGVmXG4nLCB0cnVlKTsKICBoZWxwZXJzLmRvS2V5cygnWycsICdwJyk7CiAgZXEoJyAgYWJjXG4gICAgZGVmXG4gIF9fXycsIGNtLmdldFZhbHVlKCkpOwp9LCB7IHZhbHVlOiAnICBfX18nIH0pOwp0ZXN0VmltKCdQJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAxKTsKICBoZWxwZXJzLmdldFJlZ2lzdGVyQ29udHJvbGxlcigpLnB1c2hUZXh0KCciJywgJ3lhbmsnLCAnYWJjXG5kZWYnLCBmYWxzZSk7CiAgaGVscGVycy5kb0tleXMoJ1AnKTsKICBlcSgnX2FiY1xuZGVmX18nLCBjbS5nZXRWYWx1ZSgpKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDEsIDMpOwp9LCB7IHZhbHVlOiAnX19fJyB9KTsKdGVzdFZpbSgnUF9saW5lJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAxKTsKICBoZWxwZXJzLmdldFJlZ2lzdGVyQ29udHJvbGxlcigpLnB1c2hUZXh0KCciJywgJ3lhbmsnLCAnICBhXG5kXG4nLCB0cnVlKTsKICBoZWxwZXJzLmRvS2V5cygnMicsICdQJyk7CiAgZXEoJyAgYVxuZFxuICBhXG5kXG5fX18nLCBjbS5nZXRWYWx1ZSgpKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDIpOwp9LCB7IHZhbHVlOiAnX19fJyB9KTsKdGVzdFZpbSgncicsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgMSk7CiAgaGVscGVycy5kb0tleXMoJzMnLCAncicsICd1Jyk7CiAgZXEoJ3d1dXVldFxuYW5vdGhlcicsIGNtLmdldFZhbHVlKCksJzNyIGZhaWxlZCcpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgMyk7CiAgY20uc2V0Q3Vyc29yKDAsIDQpOwogIGhlbHBlcnMuZG9LZXlzKCd2JywgJ2onLCAnaCcsICdyJywgJzxTcGFjZT4nKTsKICBlcSgnd3V1dSAgXG4gICAgaGVyJywgY20uZ2V0VmFsdWUoKSwnUmVwbGFjaW5nIHNlbGVjdGlvbiBieSBzcGFjZS1jaGFyYWN0ZXJzIGZhaWxlZCcpOwp9LCB7IHZhbHVlOiAnd29yZGV0XG5hbm90aGVyJyB9KTsKdGVzdFZpbSgncl92aXN1YWxfYmxvY2snLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDIsIDMpOwogIGhlbHBlcnMuZG9LZXlzKCc8Qy12PicsICdrJywgJ2snLCAnaCcsICdoJywgJ3InLCAnbCcpOwogIGVxKCcxbGxsXG41bGxsXG5hbGxsZWZnJywgY20uZ2V0VmFsdWUoKSk7CiAgaGVscGVycy5kb0tleXMoJzxDLXY+JywgJ2wnLCAnaicsICdyJywgJzxTcGFjZT4nKTsKICBlcSgnMSAgbFxuNSAgbFxuYWxsbGVmZycsIGNtLmdldFZhbHVlKCkpOwogIGNtLnNldEN1cnNvcigyLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnbycpOwogIGhlbHBlcnMuZG9LZXlzKCc8RXNjPicpOwogIGNtLnJlcGxhY2VSYW5nZSgnXHRcdCcsIGNtLmdldEN1cnNvcigpKTsKICBoZWxwZXJzLmRvS2V5cygnPEMtdj4nLCAnaCcsICdoJywgJ3InLCAncicpOwogIGVxKCcxICBsXG41ICBsXG5hbGxsZWZnXG5ycnJycnJycicsIGNtLmdldFZhbHVlKCkpOwp9LCB7dmFsdWU6ICcxMjM0XG41Njc4XG5hYmNkZWZnJ30pOwp0ZXN0VmltKCdSJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAxKTsKICBoZWxwZXJzLmRvS2V5cygnUicpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgMSk7CiAgZXEoJ3ZpbS1yZXBsYWNlJywgY20uZ2V0T3B0aW9uKCdrZXlNYXAnKSk7CiAgaXMoY20uc3RhdGUub3ZlcndyaXRlLCAnU2V0dGluZyBvdmVyd3JpdGUgc3RhdGUgZmFpbGVkJyk7Cn0pOwp0ZXN0VmltKCdtYXJrJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigyLCAyKTsKICBoZWxwZXJzLmRvS2V5cygnbScsICd0Jyk7CiAgY20uc2V0Q3Vyc29yKDAsIDApOwogIGhlbHBlcnMuZG9LZXlzKCdgJywgJ3QnKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDIsIDIpOwogIGNtLnNldEN1cnNvcigyLCAwKTsKICBjbS5yZXBsYWNlUmFuZ2UoJyAgIGgnLCBjbS5nZXRDdXJzb3IoKSk7CiAgY20uc2V0Q3Vyc29yKDAsIDApOwogIGhlbHBlcnMuZG9LZXlzKCdcJycsICd0Jyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgyLCAzKTsKfSk7CnRlc3RWaW0oJ2p1bXBUb01hcmtfbmV4dCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMiwgMik7CiAgaGVscGVycy5kb0tleXMoJ20nLCAndCcpOwogIGNtLnNldEN1cnNvcigwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnXScsICdgJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgyLCAyKTsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJ10nLCAnXCcnKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDIsIDApOwp9KTsKdGVzdFZpbSgnanVtcFRvTWFya19uZXh0X3JlcGVhdCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMiwgMik7CiAgaGVscGVycy5kb0tleXMoJ20nLCAnYScpOwogIGNtLnNldEN1cnNvcigzLCAyKTsKICBoZWxwZXJzLmRvS2V5cygnbScsICdiJyk7CiAgY20uc2V0Q3Vyc29yKDQsIDIpOwogIGhlbHBlcnMuZG9LZXlzKCdtJywgJ2MnKTsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJzInLCAnXScsICdgJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgzLCAyKTsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJzInLCAnXScsICdcJycpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMywgMSk7Cn0pOwp0ZXN0VmltKCdqdW1wVG9NYXJrX25leHRfc2FtZWxpbmUnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDIsIDApOwogIGhlbHBlcnMuZG9LZXlzKCdtJywgJ2EnKTsKICBjbS5zZXRDdXJzb3IoMiwgNCk7CiAgaGVscGVycy5kb0tleXMoJ20nLCAnYicpOwogIGNtLnNldEN1cnNvcigyLCAyKTsKICBoZWxwZXJzLmRvS2V5cygnXScsICdgJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgyLCA0KTsKfSk7CnRlc3RWaW0oJ2p1bXBUb01hcmtfbmV4dF9vbmx5cHJldicsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMiwgMCk7CiAgaGVscGVycy5kb0tleXMoJ20nLCAnYScpOwogIGNtLnNldEN1cnNvcig0LCAwKTsKICBoZWxwZXJzLmRvS2V5cygnXScsICdgJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCg0LCAwKTsKfSk7CnRlc3RWaW0oJ2p1bXBUb01hcmtfbmV4dF9ub21hcmsnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDIsIDIpOwogIGhlbHBlcnMuZG9LZXlzKCddJywgJ2AnKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDIsIDIpOwogIGhlbHBlcnMuZG9LZXlzKCddJywgJ1wnJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgyLCAwKTsKfSk7CnRlc3RWaW0oJ2p1bXBUb01hcmtfbmV4dF9saW5ld2lzZV9vdmVyJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigyLCAyKTsKICBoZWxwZXJzLmRvS2V5cygnbScsICdhJyk7CiAgY20uc2V0Q3Vyc29yKDMsIDQpOwogIGhlbHBlcnMuZG9LZXlzKCdtJywgJ2InKTsKICBjbS5zZXRDdXJzb3IoMiwgMSk7CiAgaGVscGVycy5kb0tleXMoJ10nLCAnXCcnKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDMsIDEpOwp9KTsKdGVzdFZpbSgnanVtcFRvTWFya19uZXh0X2FjdGlvbicsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMiwgMik7CiAgaGVscGVycy5kb0tleXMoJ20nLCAndCcpOwogIGNtLnNldEN1cnNvcigwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnZCcsICddJywgJ2AnKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDApOwogIHZhciBhY3R1YWwgPSBjbS5nZXRMaW5lKDApOwogIHZhciBleHBlY3RlZCA9ICdwb3AgcG9wIDAgMSAyIDMgNCc7CiAgZXEoYWN0dWFsLCBleHBlY3RlZCwgIkRlbGV0aW5nIHdoaWxlIGp1bXBpbmcgdG8gdGhlIG5leHQgbWFyayBmYWlsZWQuIik7Cn0pOwp0ZXN0VmltKCdqdW1wVG9NYXJrX25leHRfbGluZV9hY3Rpb24nLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDIsIDIpOwogIGhlbHBlcnMuZG9LZXlzKCdtJywgJ3QnKTsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJ2QnLCAnXScsICdcJycpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgMSk7CiAgdmFyIGFjdHVhbCA9IGNtLmdldExpbmUoMCk7CiAgdmFyIGV4cGVjdGVkID0gJyAoYSkgW2JdIHtjfSAnCiAgZXEoYWN0dWFsLCBleHBlY3RlZCwgIkRlbGV0aW5nIHdoaWxlIGp1bXBpbmcgdG8gdGhlIG5leHQgbWFyayBsaW5lIGZhaWxlZC4iKTsKfSk7CnRlc3RWaW0oJ2p1bXBUb01hcmtfcHJldicsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMiwgMik7CiAgaGVscGVycy5kb0tleXMoJ20nLCAndCcpOwogIGNtLnNldEN1cnNvcig0LCAwKTsKICBoZWxwZXJzLmRvS2V5cygnWycsICdgJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgyLCAyKTsKICBjbS5zZXRDdXJzb3IoNCwgMCk7CiAgaGVscGVycy5kb0tleXMoJ1snLCAnXCcnKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDIsIDApOwp9KTsKdGVzdFZpbSgnanVtcFRvTWFya19wcmV2X3JlcGVhdCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMiwgMik7CiAgaGVscGVycy5kb0tleXMoJ20nLCAnYScpOwogIGNtLnNldEN1cnNvcigzLCAyKTsKICBoZWxwZXJzLmRvS2V5cygnbScsICdiJyk7CiAgY20uc2V0Q3Vyc29yKDQsIDIpOwogIGhlbHBlcnMuZG9LZXlzKCdtJywgJ2MnKTsKICBjbS5zZXRDdXJzb3IoNSwgMCk7CiAgaGVscGVycy5kb0tleXMoJzInLCAnWycsICdgJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgzLCAyKTsKICBjbS5zZXRDdXJzb3IoNSwgMCk7CiAgaGVscGVycy5kb0tleXMoJzInLCAnWycsICdcJycpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMywgMSk7Cn0pOwp0ZXN0VmltKCdqdW1wVG9NYXJrX3ByZXZfc2FtZWxpbmUnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDIsIDApOwogIGhlbHBlcnMuZG9LZXlzKCdtJywgJ2EnKTsKICBjbS5zZXRDdXJzb3IoMiwgNCk7CiAgaGVscGVycy5kb0tleXMoJ20nLCAnYicpOwogIGNtLnNldEN1cnNvcigyLCAyKTsKICBoZWxwZXJzLmRvS2V5cygnWycsICdgJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgyLCAwKTsKfSk7CnRlc3RWaW0oJ2p1bXBUb01hcmtfcHJldl9vbmx5bmV4dCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoNCwgNCk7CiAgaGVscGVycy5kb0tleXMoJ20nLCAnYScpOwogIGNtLnNldEN1cnNvcigyLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnWycsICdgJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgyLCAwKTsKfSk7CnRlc3RWaW0oJ2p1bXBUb01hcmtfcHJldl9ub21hcmsnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDIsIDIpOwogIGhlbHBlcnMuZG9LZXlzKCdbJywgJ2AnKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDIsIDIpOwogIGhlbHBlcnMuZG9LZXlzKCdbJywgJ1wnJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgyLCAwKTsKfSk7CnRlc3RWaW0oJ2p1bXBUb01hcmtfcHJldl9saW5ld2lzZV9vdmVyJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigyLCAyKTsKICBoZWxwZXJzLmRvS2V5cygnbScsICdhJyk7CiAgY20uc2V0Q3Vyc29yKDMsIDQpOwogIGhlbHBlcnMuZG9LZXlzKCdtJywgJ2InKTsKICBjbS5zZXRDdXJzb3IoMywgNik7CiAgaGVscGVycy5kb0tleXMoJ1snLCAnXCcnKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDIsIDApOwp9KTsKdGVzdFZpbSgnZGVsbWFya19zaW5nbGUnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDEsIDIpOwogIGhlbHBlcnMuZG9LZXlzKCdtJywgJ3QnKTsKICBoZWxwZXJzLmRvRXgoJ2RlbG1hcmtzIHQnKTsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJ2AnLCAndCcpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgMCk7Cn0pOwp0ZXN0VmltKCdkZWxtYXJrX3JhbmdlJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigxLCAyKTsKICBoZWxwZXJzLmRvS2V5cygnbScsICdhJyk7CiAgY20uc2V0Q3Vyc29yKDIsIDIpOwogIGhlbHBlcnMuZG9LZXlzKCdtJywgJ2InKTsKICBjbS5zZXRDdXJzb3IoMywgMik7CiAgaGVscGVycy5kb0tleXMoJ20nLCAnYycpOwogIGNtLnNldEN1cnNvcig0LCAyKTsKICBoZWxwZXJzLmRvS2V5cygnbScsICdkJyk7CiAgY20uc2V0Q3Vyc29yKDUsIDIpOwogIGhlbHBlcnMuZG9LZXlzKCdtJywgJ2UnKTsKICBoZWxwZXJzLmRvRXgoJ2RlbG1hcmtzIGItZCcpOwogIGNtLnNldEN1cnNvcigwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnYCcsICdhJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgxLCAyKTsKICBoZWxwZXJzLmRvS2V5cygnYCcsICdiJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgxLCAyKTsKICBoZWxwZXJzLmRvS2V5cygnYCcsICdjJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgxLCAyKTsKICBoZWxwZXJzLmRvS2V5cygnYCcsICdkJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgxLCAyKTsKICBoZWxwZXJzLmRvS2V5cygnYCcsICdlJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCg1LCAyKTsKfSk7CnRlc3RWaW0oJ2RlbG1hcmtfbXVsdGknLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDEsIDIpOwogIGhlbHBlcnMuZG9LZXlzKCdtJywgJ2EnKTsKICBjbS5zZXRDdXJzb3IoMiwgMik7CiAgaGVscGVycy5kb0tleXMoJ20nLCAnYicpOwogIGNtLnNldEN1cnNvcigzLCAyKTsKICBoZWxwZXJzLmRvS2V5cygnbScsICdjJyk7CiAgY20uc2V0Q3Vyc29yKDQsIDIpOwogIGhlbHBlcnMuZG9LZXlzKCdtJywgJ2QnKTsKICBjbS5zZXRDdXJzb3IoNSwgMik7CiAgaGVscGVycy5kb0tleXMoJ20nLCAnZScpOwogIGhlbHBlcnMuZG9FeCgnZGVsbWFya3MgYmNkJyk7CiAgY20uc2V0Q3Vyc29yKDAsIDApOwogIGhlbHBlcnMuZG9LZXlzKCdgJywgJ2EnKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDEsIDIpOwogIGhlbHBlcnMuZG9LZXlzKCdgJywgJ2InKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDEsIDIpOwogIGhlbHBlcnMuZG9LZXlzKCdgJywgJ2MnKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDEsIDIpOwogIGhlbHBlcnMuZG9LZXlzKCdgJywgJ2QnKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDEsIDIpOwogIGhlbHBlcnMuZG9LZXlzKCdgJywgJ2UnKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDUsIDIpOwp9KTsKdGVzdFZpbSgnZGVsbWFya19tdWx0aV9zcGFjZScsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMSwgMik7CiAgaGVscGVycy5kb0tleXMoJ20nLCAnYScpOwogIGNtLnNldEN1cnNvcigyLCAyKTsKICBoZWxwZXJzLmRvS2V5cygnbScsICdiJyk7CiAgY20uc2V0Q3Vyc29yKDMsIDIpOwogIGhlbHBlcnMuZG9LZXlzKCdtJywgJ2MnKTsKICBjbS5zZXRDdXJzb3IoNCwgMik7CiAgaGVscGVycy5kb0tleXMoJ20nLCAnZCcpOwogIGNtLnNldEN1cnNvcig1LCAyKTsKICBoZWxwZXJzLmRvS2V5cygnbScsICdlJyk7CiAgaGVscGVycy5kb0V4KCdkZWxtYXJrcyBiIGMgZCcpOwogIGNtLnNldEN1cnNvcigwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnYCcsICdhJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgxLCAyKTsKICBoZWxwZXJzLmRvS2V5cygnYCcsICdiJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgxLCAyKTsKICBoZWxwZXJzLmRvS2V5cygnYCcsICdjJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgxLCAyKTsKICBoZWxwZXJzLmRvS2V5cygnYCcsICdkJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgxLCAyKTsKICBoZWxwZXJzLmRvS2V5cygnYCcsICdlJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCg1LCAyKTsKfSk7CnRlc3RWaW0oJ2RlbG1hcmtfYWxsJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigxLCAyKTsKICBoZWxwZXJzLmRvS2V5cygnbScsICdhJyk7CiAgY20uc2V0Q3Vyc29yKDIsIDIpOwogIGhlbHBlcnMuZG9LZXlzKCdtJywgJ2InKTsKICBjbS5zZXRDdXJzb3IoMywgMik7CiAgaGVscGVycy5kb0tleXMoJ20nLCAnYycpOwogIGNtLnNldEN1cnNvcig0LCAyKTsKICBoZWxwZXJzLmRvS2V5cygnbScsICdkJyk7CiAgY20uc2V0Q3Vyc29yKDUsIDIpOwogIGhlbHBlcnMuZG9LZXlzKCdtJywgJ2UnKTsKICBoZWxwZXJzLmRvRXgoJ2RlbG1hcmtzIGEgYi1kZScpOwogIGNtLnNldEN1cnNvcigwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnYCcsICdhJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnYCcsICdiJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnYCcsICdjJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnYCcsICdkJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnYCcsICdlJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCAwKTsKfSk7CnRlc3RWaW0oJ3Zpc3VhbCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBoZWxwZXJzLmRvS2V5cygnbCcsICd2JywgJ2wnLCAnbCcpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgNCk7CiAgZXFQb3MobWFrZUN1cnNvcigwLCAxKSwgY20uZ2V0Q3Vyc29yKCdhbmNob3InKSk7CiAgaGVscGVycy5kb0tleXMoJ2QnKTsKICBlcSgnMTUnLCBjbS5nZXRWYWx1ZSgpKTsKfSwgeyB2YWx1ZTogJzEyMzQ1JyB9KTsKdGVzdFZpbSgndmlzdWFsX3lhbmsnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgaGVscGVycy5kb0tleXMoJ3YnLCAnMycsICdsJywgJ3knKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDApOwogIGhlbHBlcnMuZG9LZXlzKCdwJyk7CiAgZXEoJ2FhIHRlIHRlc3QgZm9yIHlhbmsnLCBjbS5nZXRWYWx1ZSgpKTsKfSwgeyB2YWx1ZTogJ2EgdGVzdCBmb3IgeWFuaycgfSkKdGVzdFZpbSgndmlzdWFsX3cnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgaGVscGVycy5kb0tleXMoJ3YnLCAndycpOwogIGVxKGNtLmdldFNlbGVjdGlvbigpLCAnbW90aW9uIHQnKTsKfSwgeyB2YWx1ZTogJ21vdGlvbiB0ZXN0J30pOwp0ZXN0VmltKCd2aXN1YWxfaW5pdGlhbF9zZWxlY3Rpb24nLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDEpOwogIGhlbHBlcnMuZG9LZXlzKCd2Jyk7CiAgY20uZ2V0U2VsZWN0aW9uKCduJyk7Cn0sIHsgdmFsdWU6ICdpbml0J30pOwp0ZXN0VmltKCd2aXN1YWxfY3Jvc3NvdmVyX2xlZnQnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDIpOwogIGhlbHBlcnMuZG9LZXlzKCd2JywgJ2wnLCAnaCcsICdoJyk7CiAgY20uZ2V0U2VsZWN0aW9uKCdybycpOwp9LCB7IHZhbHVlOiAnY3Jvc3MnfSk7CnRlc3RWaW0oJ3Zpc3VhbF9jcm9zc292ZXJfbGVmdCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgMik7CiAgaGVscGVycy5kb0tleXMoJ3YnLCAnaCcsICdsJywgJ2wnKTsKICBjbS5nZXRTZWxlY3Rpb24oJ29zJyk7Cn0sIHsgdmFsdWU6ICdjcm9zcyd9KTsKdGVzdFZpbSgndmlzdWFsX2Nyb3Nzb3Zlcl91cCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMywgMik7CiAgaGVscGVycy5kb0tleXMoJ3YnLCAnaicsICdrJywgJ2snKTsKICBlcVBvcyhQb3MoMiwgMiksIGNtLmdldEN1cnNvcignaGVhZCcpKTsKICBlcVBvcyhQb3MoMywgMyksIGNtLmdldEN1cnNvcignYW5jaG9yJykpOwogIGhlbHBlcnMuZG9LZXlzKCdrJyk7CiAgZXFQb3MoUG9zKDEsIDIpLCBjbS5nZXRDdXJzb3IoJ2hlYWQnKSk7CiAgZXFQb3MoUG9zKDMsIDMpLCBjbS5nZXRDdXJzb3IoJ2FuY2hvcicpKTsKfSwgeyB2YWx1ZTogJ2Nyb3NzXG5jcm9zc1xuY3Jvc3NcbmNyb3NzXG5jcm9zc1xuJ30pOwp0ZXN0VmltKCd2aXN1YWxfY3Jvc3NvdmVyX2Rvd24nLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDEsIDIpOwogIGhlbHBlcnMuZG9LZXlzKCd2JywgJ2snLCAnaicsICdqJyk7CiAgZXFQb3MoUG9zKDIsIDMpLCBjbS5nZXRDdXJzb3IoJ2hlYWQnKSk7CiAgZXFQb3MoUG9zKDEsIDIpLCBjbS5nZXRDdXJzb3IoJ2FuY2hvcicpKTsKICBoZWxwZXJzLmRvS2V5cygnaicpOwogIGVxUG9zKFBvcygzLCAzKSwgY20uZ2V0Q3Vyc29yKCdoZWFkJykpOwogIGVxUG9zKFBvcygxLCAyKSwgY20uZ2V0Q3Vyc29yKCdhbmNob3InKSk7Cn0sIHsgdmFsdWU6ICdjcm9zc1xuY3Jvc3NcbmNyb3NzXG5jcm9zc1xuY3Jvc3Ncbid9KTsKdGVzdFZpbSgndmlzdWFsX2V4aXQnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgaGVscGVycy5kb0tleXMoJzxDLXY+JywgJ2wnLCAnaicsICdqJywgJzxFc2M+Jyk7CiAgZXFQb3MoY20uZ2V0Q3Vyc29yKCdhbmNob3InKSwgY20uZ2V0Q3Vyc29yKCdoZWFkJykpOwogIGVxKHZpbS52aXN1YWxNb2RlLCBmYWxzZSk7Cn0sIHsgdmFsdWU6ICdoZWxsb1xud29ybGRcbmZvbycgfSk7CnRlc3RWaW0oJ3Zpc3VhbF9saW5lJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGhlbHBlcnMuZG9LZXlzKCdsJywgJ1YnLCAnbCcsICdqJywgJ2onLCAnZCcpOwogIGVxKCcgNFxuIDUnLCBjbS5nZXRWYWx1ZSgpKTsKfSwgeyB2YWx1ZTogJyAxXG4gMlxuIDNcbiA0XG4gNScgfSk7CnRlc3RWaW0oJ3Zpc3VhbF9ibG9ja19tb3ZlX3RvX2VvbCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICAvLyBtb3ZlVG9Fb2wgc2hvdWxkIG1vdmUgYWxsIGJsb2NrIGN1cnNvcnMgdG8gZW5kIG9mIGxpbmUKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJzxDLXY+JywgJ0cnLCAnJCcpOwogIHZhciBzZWxlY3Rpb25zID0gY20uZ2V0U2VsZWN0aW9ucygpLmpvaW4oKTsKICBlcSgnMTIzLDQ1LDYnLCBzZWxlY3Rpb25zKTsKICAvLyBDaGVja3MgdGhhdCB3aXRoIGN1cnNvciBhdCBJbmZpbml0eSwgZmluZGluZyB3b3JkcyBiYWNrd2FyZHMgc3RpbGwgd29ya3MuCiAgaGVscGVycy5kb0tleXMoJzInLCAnaycsICdiJyk7CiAgc2VsZWN0aW9ucyA9IGNtLmdldFNlbGVjdGlvbnMoKS5qb2luKCk7CiAgZXEoJzEnLCBzZWxlY3Rpb25zKTsKfSwge3ZhbHVlOiAnMTIzXG40NVxuNid9KTsKdGVzdFZpbSgndmlzdWFsX2Jsb2NrX2RpZmZlcmVudF9saW5lX2xlbmd0aHMnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgLy8gdGVzdCB0aGUgYmxvY2sgc2VsZWN0aW9uIHdpdGggbGluZXMgb2YgZGlmZmVyZW50IGxlbmd0aAogIC8vIGkuZS4gZXh0ZW5kaW5nIHRoZSBzZWxlY3Rpb24KICAvLyB0aWxsIHRoZSBlbmQgb2YgdGhlIGxvbmdlc3QgbGluZS4KICBoZWxwZXJzLmRvS2V5cygnPEMtdj4nLCAnbCcsICdqJywgJ2onLCAnNicsICdsJywgJ2QnKTsKICBoZWxwZXJzLmRvS2V5cygnZCcsICdkJywgJ2QnLCAnZCcpOwogIGVxKCcnLCBjbS5nZXRWYWx1ZSgpKTsKfSwge3ZhbHVlOiAnMTIzNFxuNTY3OFxuYWJjZGVmZyd9KTsKdGVzdFZpbSgndmlzdWFsX2Jsb2NrX3RydW5jYXRlX29uX3Nob3J0X2xpbmUnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgLy8gY2hlY2sgZm9yIGxlZnQgc2lkZSBzZWxlY3Rpb24gaW4gY2FzZQogIC8vIG9mIG1vdmluZyB1cCB0byBhIHNob3J0ZXIgbGluZS4KICBjbS5yZXBsYWNlUmFuZ2UoJycsIGNtLmdldEN1cnNvcigpKTsKICBjbS5zZXRDdXJzb3IoMywgNCk7CiAgaGVscGVycy5kb0tleXMoJzxDLXY+JywgJ2wnLCAnaycsICdrJywgJ2QnKTsKICBlcSgnaGVsbG8gd29ybGRcbntcbnRpc1xuc2EhJywgY20uZ2V0VmFsdWUoKSk7Cn0sIHt2YWx1ZTogJ2hlbGxvIHdvcmxkXG57XG50aGlzIGlzXG5zcGFydGEhJ30pOwp0ZXN0VmltKCd2aXN1YWxfYmxvY2tfY29ybmVycycsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMSwgMik7CiAgaGVscGVycy5kb0tleXMoJzxDLXY+JywgJzInLCAnbCcsICdrJyk7CiAgLy8gY2lyY2xlIGFyb3VuZCB0aGUgYW5jaG9yCiAgLy8gYW5kIGNoZWNrIHRoZSBzZWxlY3Rpb25zCiAgdmFyIHNlbGVjdGlvbnMgPSBjbS5nZXRTZWxlY3Rpb25zKCk7CiAgZXEoJzM0NTg5MScsIHNlbGVjdGlvbnMuam9pbignJykpOwogIGhlbHBlcnMuZG9LZXlzKCc0JywgJ2gnKTsKICBzZWxlY3Rpb25zID0gY20uZ2V0U2VsZWN0aW9ucygpOwogIGVxKCcxMjM2NzgnLCBzZWxlY3Rpb25zLmpvaW4oJycpKTsKICBoZWxwZXJzLmRvS2V5cygnaicsICdqJyk7CiAgc2VsZWN0aW9ucyA9IGNtLmdldFNlbGVjdGlvbnMoKTsKICBlcSgnNjc4YWJjJywgc2VsZWN0aW9ucy5qb2luKCcnKSk7CiAgaGVscGVycy5kb0tleXMoJzQnLCAnbCcpOwogIHNlbGVjdGlvbnMgPSBjbS5nZXRTZWxlY3Rpb25zKCk7CiAgZXEoJzg5MWNkZScsIHNlbGVjdGlvbnMuam9pbignJykpOwp9LCB7dmFsdWU6ICcxMjM0NVxuNjc4OTFcbmFiY2RlJ30pOwp0ZXN0VmltKCd2aXN1YWxfYmxvY2tfbW9kZV9zd2l0Y2gnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgLy8gc3dpdGNoIGJldHdlZW4gdmlzdWFsIG1vZGVzCiAgY20uc2V0Q3Vyc29yKDEsIDEpOwogIC8vIGJsb2Nrd2lzZSB0byBjaGFyYWN0ZXJ3aXNlIHZpc3VhbAogIGhlbHBlcnMuZG9LZXlzKCc8Qy12PicsICdqJywgJ2wnLCAndicpOwogIHZhciBzZWxlY3Rpb25zID0gY20uZ2V0U2VsZWN0aW9ucygpOwogIGVxKCc3ODkxXG5hYmMnLCBzZWxlY3Rpb25zLmpvaW4oJycpKTsKICAvLyBjaGFyYWN0ZXJ3aXNlIHRvIGJsb2Nrd2lzZQogIGhlbHBlcnMuZG9LZXlzKCc8Qy12PicpOwogIHNlbGVjdGlvbnMgPSBjbS5nZXRTZWxlY3Rpb25zKCk7CiAgZXEoJzc4YmMnLCBzZWxlY3Rpb25zLmpvaW4oJycpKTsKICAvLyBibG9ja3dpc2UgdG8gbGluZXdpc2UgdmlzdWFsCiAgaGVscGVycy5kb0tleXMoJ1YnKTsKICBzZWxlY3Rpb25zID0gY20uZ2V0U2VsZWN0aW9ucygpOwogIGVxKCc2Nzg5MVxuYWJjZGUnLCBzZWxlY3Rpb25zLmpvaW4oJycpKTsKfSwge3ZhbHVlOiAnMTIzNDVcbjY3ODkxXG5hYmNkZSd9KTsKdGVzdFZpbSgndmlzdWFsX2Jsb2NrX2Nyb3NzaW5nX3Nob3J0X2xpbmUnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgLy8gdmlzdWFsIGJsb2NrIHdpdGggbG9uZyBhbmQgc2hvcnQgbGluZXMKICBjbS5zZXRDdXJzb3IoMCwgMyk7CiAgaGVscGVycy5kb0tleXMoJzxDLXY+JywgJ2onLCAnaicsICdqJyk7CiAgdmFyIHNlbGVjdGlvbnMgPSBjbS5nZXRTZWxlY3Rpb25zKCkuam9pbigpOwogIGVxKCc0LCxkLGInLCBzZWxlY3Rpb25zKTsKICBoZWxwZXJzLmRvS2V5cygnMycsICdrJyk7CiAgc2VsZWN0aW9ucyA9IGNtLmdldFNlbGVjdGlvbnMoKS5qb2luKCk7CiAgZXEoJzQnLCBzZWxlY3Rpb25zKTsKICBoZWxwZXJzLmRvS2V5cygnNScsICdqJywgJ2snKTsKICBzZWxlY3Rpb25zID0gY20uZ2V0U2VsZWN0aW9ucygpLmpvaW4oIiIpOwogIGVxKDEwLCBzZWxlY3Rpb25zLmxlbmd0aCk7Cn0sIHt2YWx1ZTogJzEyMzQ1NlxuNzhcbmFiY2RlZmdcbmZvb2JhclxufVxuJ30pOwp0ZXN0VmltKCd2aXN1YWxfYmxvY2tfY3VyUG9zX29uX2V4aXQnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDApOwogIGhlbHBlcnMuZG9LZXlzKCc8Qy12PicsICczJyAsICdsJywgJzxFc2M+Jyk7CiAgZXFQb3MobWFrZUN1cnNvcigwLCAzKSwgY20uZ2V0Q3Vyc29yKCkpOwogIGhlbHBlcnMuZG9LZXlzKCdoJywgJzxDLXY+JywgJzInICwgJ2onICwnMycgLCAnbCcpOwogIGVxKGNtLmdldFNlbGVjdGlvbnMoKS5qb2luKCksICIzNDU2LCxjZGVmIik7CiAgaGVscGVycy5kb0tleXMoJzQnICwgJ2gnKTsKICBlcShjbS5nZXRTZWxlY3Rpb25zKCkuam9pbigpLCAiMjMsOCxiYyIpOwogIGhlbHBlcnMuZG9LZXlzKCcyJyAsICdsJyk7CiAgZXEoY20uZ2V0U2VsZWN0aW9ucygpLmpvaW4oKSwgIjM0LCxjZCIpOwp9LCB7dmFsdWU6ICcxMjM0NTZcbjc4XG5hYmNkZWZnXG5mb29iYXInfSk7Cgp0ZXN0VmltKCd2aXN1YWxfbWFya3MnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgaGVscGVycy5kb0tleXMoJ2wnLCAndicsICdsJywgJ2wnLCAnaicsICdqJywgJ3YnKTsKICAvLyBUZXN0IHZpc3VhbCBtb2RlIG1hcmtzCiAgY20uc2V0Q3Vyc29yKDIsIDEpOwogIGhlbHBlcnMuZG9LZXlzKCdcJycsICc8Jyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCAxKTsKICBoZWxwZXJzLmRvS2V5cygnXCcnLCAnPicpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMiwgMCk7Cn0pOwp0ZXN0VmltKCd2aXN1YWxfam9pbicsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBoZWxwZXJzLmRvS2V5cygnbCcsICdWJywgJ2wnLCAnaicsICdqJywgJ0onKTsKICBlcSgnIDEgMiAzXG4gNFxuIDUnLCBjbS5nZXRWYWx1ZSgpKTsKICBpcyghdmltLnZpc3VhbE1vZGUpOwp9LCB7IHZhbHVlOiAnIDFcbiAyXG4gM1xuIDRcbiA1JyB9KTsKdGVzdFZpbSgndmlzdWFsX2pvaW5fMicsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBoZWxwZXJzLmRvS2V5cygnRycsICdWJywgJ2cnLCAnZycsICdKJyk7CiAgZXEoJzEgMiAzIDQgNSA2ICcsIGNtLmdldFZhbHVlKCkpOwogIGlzKCF2aW0udmlzdWFsTW9kZSk7Cn0sIHsgdmFsdWU6ICcxXG4yXG4zXG40XG41XG42XG4nfSk7CnRlc3RWaW0oJ3Zpc3VhbF9ibGFuaycsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBoZWxwZXJzLmRvS2V5cygndicsICdrJyk7CiAgZXEodmltLnZpc3VhbE1vZGUsIHRydWUpOwp9LCB7IHZhbHVlOiAnXG4nIH0pOwp0ZXN0VmltKCdyZXNlbGVjdF92aXN1YWwnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgaGVscGVycy5kb0tleXMoJ2wnLCAndicsICdsJywgJ2wnLCAnbCcsICd5JywgJ2cnLCAndicpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgNSk7CiAgZXFQb3MobWFrZUN1cnNvcigwLCAxKSwgY20uZ2V0Q3Vyc29yKCdhbmNob3InKSk7CiAgaGVscGVycy5kb0tleXMoJ3YnKTsKICBjbS5zZXRDdXJzb3IoMSwgMCk7CiAgaGVscGVycy5kb0tleXMoJ3YnLCAnbCcsICdsJywgJ3AnKTsKICBlcSgnMTIzNDU2XG4yMzQ1XG5iYXInLCBjbS5nZXRWYWx1ZSgpKTsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJ2cnLCAndicpOwogIC8vIGhlcmUgdGhlIGZha2UgY3Vyc29yIGlzIGF0ICgxLCAzKQogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMSwgNCk7CiAgZXFQb3MobWFrZUN1cnNvcigxLCAwKSwgY20uZ2V0Q3Vyc29yKCdhbmNob3InKSk7CiAgaGVscGVycy5kb0tleXMoJ3YnKTsKICBjbS5zZXRDdXJzb3IoMiwgMCk7CiAgaGVscGVycy5kb0tleXMoJ3YnLCAnbCcsICdsJywgJ2cnLCAndicpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMSwgNCk7CiAgZXFQb3MobWFrZUN1cnNvcigxLCAwKSwgY20uZ2V0Q3Vyc29yKCdhbmNob3InKSk7CiAgaGVscGVycy5kb0tleXMoJ2cnLCAndicpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMiwgMyk7CiAgZXFQb3MobWFrZUN1cnNvcigyLCAwKSwgY20uZ2V0Q3Vyc29yKCdhbmNob3InKSk7CiAgZXEoJzEyMzQ1NlxuMjM0NVxuYmFyJywgY20uZ2V0VmFsdWUoKSk7Cn0sIHsgdmFsdWU6ICcxMjM0NTZcbmZvb1xuYmFyJyB9KTsKdGVzdFZpbSgncmVzZWxlY3RfdmlzdWFsX2xpbmUnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgaGVscGVycy5kb0tleXMoJ2wnLCAnVicsICdqJywgJ2onLCAnVicsICdnJywgJ3YnLCAnZCcpOwogIGVxKCdmb29cbmFuZFxuYmFyJywgY20uZ2V0VmFsdWUoKSk7CiAgY20uc2V0Q3Vyc29yKDEsIDApOwogIGhlbHBlcnMuZG9LZXlzKCdWJywgJ3knLCAnaicpOwogIGhlbHBlcnMuZG9LZXlzKCdWJywgJ3AnICwgJ2cnLCAndicsICdkJyk7CiAgZXEoJ2Zvb1xuYW5kJywgY20uZ2V0VmFsdWUoKSk7Cn0sIHsgdmFsdWU6ICdoZWxsb1xudGhpc1xuaXNcbmZvb1xuYW5kXG5iYXInIH0pOwp0ZXN0VmltKCdyZXNlbGVjdF92aXN1YWxfYmxvY2snLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDEsIDIpOwogIGhlbHBlcnMuZG9LZXlzKCc8Qy12PicsICdrJywgJ2gnLCAnPEMtdj4nKTsKICBjbS5zZXRDdXJzb3IoMiwgMSk7CiAgaGVscGVycy5kb0tleXMoJ3YnLCAnbCcsICdnJywgJ3YnKTsKICBlcVBvcyhQb3MoMSwgMiksIHZpbS5zZWwuYW5jaG9yKTsKICBlcVBvcyhQb3MoMCwgMSksIHZpbS5zZWwuaGVhZCk7CiAgLy8gRW5zdXJlIHNlbGVjdGlvbiBpcyBkb25lIHdpdGggdmlzdWFsIGJsb2NrIG1vZGUgcmF0aGVyIHRoYW4gb25lCiAgLy8gY29udGludW91cyByYW5nZS4KICBlcShjbS5nZXRTZWxlY3Rpb25zKCkuam9pbignJyksICcyM29vJykKICBoZWxwZXJzLmRvS2V5cygnZycsICd2Jyk7CiAgZXFQb3MoUG9zKDIsIDEpLCB2aW0uc2VsLmFuY2hvcik7CiAgZXFQb3MoUG9zKDIsIDIpLCB2aW0uc2VsLmhlYWQpOwogIGhlbHBlcnMuZG9LZXlzKCc8RXNjPicpOwogIC8vIEVuc3VyZSBzZWxlY3Rpb24gb2YgZGVsZXRlZCByYW5nZQogIGNtLnNldEN1cnNvcigxLCAxKTsKICBoZWxwZXJzLmRvS2V5cygndicsICc8Qy12PicsICdqJywgJ2QnLCAnZycsICd2Jyk7CiAgZXEoY20uZ2V0U2VsZWN0aW9ucygpLmpvaW4oJycpLCAnb3InKTsKfSwgeyB2YWx1ZTogJzEyMzQ1NlxuZm9vXG5iYXInIH0pOwp0ZXN0VmltKCdzX25vcm1hbCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgMSk7CiAgaGVscGVycy5kb0tleXMoJ3MnKTsKICBoZWxwZXJzLmRvS2V5cygnPEVzYz4nKTsKICBlcSgnYWMnLCBjbS5nZXRWYWx1ZSgpKTsKfSwgeyB2YWx1ZTogJ2FiYyd9KTsKdGVzdFZpbSgnc192aXN1YWwnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDEpOwogIGhlbHBlcnMuZG9LZXlzKCd2JywgJ3MnKTsKICBoZWxwZXJzLmRvS2V5cygnPEVzYz4nKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDApOwogIGVxKCdhYycsIGNtLmdldFZhbHVlKCkpOwp9LCB7IHZhbHVlOiAnYWJjJ30pOwp0ZXN0VmltKCdvX3Zpc3VhbCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwwKTsKICBoZWxwZXJzLmRvS2V5cygndicsJ2wnLCdsJywnbCcsJ28nKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsMCk7CiAgaGVscGVycy5kb0tleXMoJ3YnLCd2JywnaicsJ2onLCdqJywnbycpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwwKTsKICBoZWxwZXJzLmRvS2V5cygnTycpOwogIGhlbHBlcnMuZG9LZXlzKCdsJywnbCcpCiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgzLCAzKTsKICBoZWxwZXJzLmRvS2V5cygnZCcpOwogIGVxKCdwJyxjbS5nZXRWYWx1ZSgpKTsKfSwgeyB2YWx1ZTogJ2FiY2RcbmVmZ2hcbmlqa2xcbm1ub3AnfSk7CnRlc3RWaW0oJ29fdmlzdWFsX2Jsb2NrJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAxKTsKICBoZWxwZXJzLmRvS2V5cygnPEMtdj4nLCczJywnaicsJ2wnLCdsJywgJ28nKTsKICBlcVBvcyhQb3MoMywgMyksIHZpbS5zZWwuYW5jaG9yKTsKICBlcVBvcyhQb3MoMCwgMSksIHZpbS5zZWwuaGVhZCk7CiAgaGVscGVycy5kb0tleXMoJ08nKTsKICBlcVBvcyhQb3MoMywgMSksIHZpbS5zZWwuYW5jaG9yKTsKICBlcVBvcyhQb3MoMCwgMyksIHZpbS5zZWwuaGVhZCk7CiAgaGVscGVycy5kb0tleXMoJ28nKTsKICBlcVBvcyhQb3MoMCwgMyksIHZpbS5zZWwuYW5jaG9yKTsKICBlcVBvcyhQb3MoMywgMSksIHZpbS5zZWwuaGVhZCk7Cn0sIHsgdmFsdWU6ICdhYmNkXG5lZmdoXG5pamtsXG5tbm9wJ30pOwp0ZXN0VmltKCdjaGFuZ2VDYXNlX3Zpc3VhbCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJ3YnLCAnbCcsICdsJyk7CiAgaGVscGVycy5kb0tleXMoJ1UnKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDApOwogIGhlbHBlcnMuZG9LZXlzKCd2JywgJ2wnLCAnbCcpOwogIGhlbHBlcnMuZG9LZXlzKCd1Jyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnbCcsICdsJywgJ2wnLCAnLicpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgMyk7CiAgY20uc2V0Q3Vyc29yKDAsIDApOwogIGhlbHBlcnMuZG9LZXlzKCdxJywgJ2EnLCAndicsICdqJywgJ1UnLCAncScpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJ2onLCAnQCcsICdhJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgxLCAwKTsKICBjbS5zZXRDdXJzb3IoMywgMCk7CiAgaGVscGVycy5kb0tleXMoJ1YnLCAnVScsICdqJywgJy4nKTsKICBlcSgnQUJDREVGXG5HSElKS0xcbk1ub3BxXG5TSE9SVCBMSU5FXG5MT05HIExJTkUgT0YgVEVYVCcsIGNtLmdldFZhbHVlKCkpOwp9LCB7IHZhbHVlOiAnYWJjZGVmXG5naGlqa2xcbm1ub3BxXG5zaG9ydCBsaW5lXG5sb25nIGxpbmUgb2YgdGV4dCd9KTsKdGVzdFZpbSgnY2hhbmdlQ2FzZV92aXN1YWxfYmxvY2snLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDIsIDEpOwogIGhlbHBlcnMuZG9LZXlzKCc8Qy12PicsICdrJywgJ2snLCAnaCcsICdVJyk7CiAgZXEoJ0FCY2RlZlxuR0hpamtsXG5NTm9wcVxuZm9vJywgY20uZ2V0VmFsdWUoKSk7CiAgY20uc2V0Q3Vyc29yKDAsIDIpOwogIGhlbHBlcnMuZG9LZXlzKCcuJyk7CiAgZXEoJ0FCQ0RlZlxuR0hJSmtsXG5NTk9QcVxuZm9vJywgY20uZ2V0VmFsdWUoKSk7CiAgLy8gY2hlY2sgd2hlbiBsYXN0IGxpbmUgaXMgc2hvcnRlci4KICBjbS5zZXRDdXJzb3IoMiwgMik7CiAgaGVscGVycy5kb0tleXMoJy4nKTsKICBlcSgnQUJDRGVmXG5HSElKa2xcbk1OT1BxXG5mb08nLCBjbS5nZXRWYWx1ZSgpKTsKfSwgeyB2YWx1ZTogJ2FiY2RlZlxuZ2hpamtsXG5tbm9wcVxuZm9vJ30pOwp0ZXN0VmltKCd2aXN1YWxfcGFzdGUnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDApOwogIGhlbHBlcnMuZG9LZXlzKCd2JywgJ2wnLCAnbCcsICd5Jyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnMycsICdsJywgJ2onLCAndicsICdsJywgJ3AnKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDEsIDUpOwogIGVxKCd0aGlzIGlzIGFcbnVuaXRoaXRlc3QgZm9yIHZpc3VhbCBwYXN0ZScsIGNtLmdldFZhbHVlKCkpOwogIGNtLnNldEN1cnNvcigwLCAwKTsKICAvLyBpbiBjYXNlIG9mIHBhc3Rpbmcgd2hvbGUgbGluZQogIGhlbHBlcnMuZG9LZXlzKCd5JywgJ3knKTsKICBjbS5zZXRDdXJzb3IoMSwgNik7CiAgaGVscGVycy5kb0tleXMoJ3YnLCAnbCcsICdsJywgJ2wnLCAncCcpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMiwgMCk7CiAgZXEoJ3RoaXMgaXMgYVxudW5pdGhpXG50aGlzIGlzIGFcbiBmb3IgdmlzdWFsIHBhc3RlJywgY20uZ2V0VmFsdWUoKSk7Cn0sIHsgdmFsdWU6ICd0aGlzIGlzIGFcbnVuaXQgdGVzdCBmb3IgdmlzdWFsIHBhc3RlJ30pOwoKLy8gVGhpcyBjaGVja3MgdGhlIGNvbnRlbnRzIG9mIHRoZSByZWdpc3RlciB1c2VkIHRvIHBhc3RlIHRoZSB0ZXh0CnRlc3RWaW0oJ3ZfcGFzdGVfZnJvbV9yZWdpc3RlcicsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJyInLCAnYScsICd5JywgJ3cnKTsKICBjbS5zZXRDdXJzb3IoMSwgMCk7CiAgaGVscGVycy5kb0tleXMoJ3YnLCAncCcpOwogIGNtLm9wZW5EaWFsb2cgPSBoZWxwZXJzLmZha2VPcGVuRGlhbG9nKCdyZWdpc3RlcnMnKTsKICBjbS5vcGVuTm90aWZpY2F0aW9uID0gaGVscGVycy5mYWtlT3Blbk5vdGlmaWNhdGlvbihmdW5jdGlvbih0ZXh0KSB7CiAgICBpcygvYVxzK3JlZ2lzdGVyLy50ZXN0KHRleHQpKTsKICB9KTsKfSwgeyB2YWx1ZTogJ3JlZ2lzdGVyIGNvbnRlbnRzXG5hcmUgbm90IGVyYXNlZCd9KTsKdGVzdFZpbSgnU19ub3JtYWwnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDEpOwogIGhlbHBlcnMuZG9LZXlzKCdqJywgJ1MnKTsKICBoZWxwZXJzLmRvS2V5cygnPEVzYz4nKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDEsIDEpOwogIGVxKCdhYXtcbiAgXG5jYycsIGNtLmdldFZhbHVlKCkpOwogIGhlbHBlcnMuZG9LZXlzKCdqJywgJ1MnKTsKICBlcSgnYWF7XG4gIFxuICAnLCBjbS5nZXRWYWx1ZSgpKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDIsIDIpOwogIGhlbHBlcnMuZG9LZXlzKCc8RXNjPicpOwogIGhlbHBlcnMuZG9LZXlzKCdkJywgJ2QnLCAnZCcsICdkJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnUycpOwogIGlzKHZpbS5pbnNlcnRNb2RlKTsKICBlcSgnJywgY20uZ2V0VmFsdWUoKSk7Cn0sIHsgdmFsdWU6ICdhYXtcbmJiXG5jYyd9KTsKdGVzdFZpbSgnYmxvY2t3aXNlX3Bhc3RlJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnPEMtdj4nLCAnMycsICdqJywgJ2wnLCAneScpOwogIGNtLnNldEN1cnNvcigwLCAyKTsKICAvLyBwYXN0ZSBvbmUgY2hhciBhZnRlciB0aGUgY3VycmVudCBjdXJzb3IgcG9zaXRpb24KICBoZWxwZXJzLmRvS2V5cygncCcpOwogIGVxKCdoZWxoZWxvXG53b3J3b2xkXG5mb29mb1xuYmFyYmEnLCBjbS5nZXRWYWx1ZSgpKTsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJ3YnLCAnNCcsICdsJywgJ3knKTsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJzxDLXY+JywgJzMnLCAnaicsICdwJyk7CiAgZXEoJ2hlbGhlZWxoZWxvXG5vcndvbGRcbm9vZm9cbmFyYmEnLCBjbS5nZXRWYWx1ZSgpKTsKfSwgeyB2YWx1ZTogJ2hlbGxvXG53b3JsZFxuZm9vXG5iYXInfSk7CnRlc3RWaW0oJ2Jsb2Nrd2lzZV9wYXN0ZV9sb25nL3Nob3J0X2xpbmUnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgLy8gZXh0ZW5kIHNob3J0IGxpbmVzIGluIGNhc2Ugb2YgZGlmZmVyZW50IGxpbmUgbGVuZ3Rocy4KICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJzxDLXY+JywgJ2onLCAnaicsICd5Jyk7CiAgY20uc2V0Q3Vyc29yKDAsIDMpOwogIGhlbHBlcnMuZG9LZXlzKCdwJyk7CiAgZXEoJ2hlbGxob1xuZm9vIGZcbmJhciBiJywgY20uZ2V0VmFsdWUoKSk7Cn0sIHsgdmFsdWU6ICdoZWxsb1xuZm9vXG5iYXInfSk7CnRlc3RWaW0oJ2Jsb2Nrd2lzZV9wYXN0ZV9jdXRfcGFzdGUnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDApOwogIGhlbHBlcnMuZG9LZXlzKCc8Qy12PicsICcyJywgJ2onLCAneCcpOwogIGNtLnNldEN1cnNvcigwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnUCcpOwogIGVxKCdjdXRcbmFuZFxucGFzdGVcbm1lJywgY20uZ2V0VmFsdWUoKSk7Cn0sIHsgdmFsdWU6ICdjdXRcbmFuZFxucGFzdGVcbm1lJ30pOwp0ZXN0VmltKCdibG9ja3dpc2VfcGFzdGVfZnJvbV9yZWdpc3RlcicsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJzxDLXY+JywgJzInLCAnaicsICciJywgJ2EnLCAneScpOwogIGNtLnNldEN1cnNvcigwLCAzKTsKICBoZWxwZXJzLmRvS2V5cygnIicsICdhJywgJ3AnKTsKICBlcSgnZm9vYmZhclxuaGVsbGhvXG53b3Jsd2QnLCBjbS5nZXRWYWx1ZSgpKTsKfSwgeyB2YWx1ZTogJ2Zvb2JhclxuaGVsbG9cbndvcmxkJ30pOwp0ZXN0VmltKCdibG9ja3dpc2VfcGFzdGVfbGFzdF9saW5lJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnPEMtdj4nLCAnMicsICdqJywgJ2wnLCAneScpOwogIGNtLnNldEN1cnNvcigzLCAwKTsKICBoZWxwZXJzLmRvS2V5cygncCcpOwogIGVxKCdjdXRcbmFuZFxucGFzdGVcbm1jdWVcbiBhblxuIHBhJywgY20uZ2V0VmFsdWUoKSk7Cn0sIHsgdmFsdWU6ICdjdXRcbmFuZFxucGFzdGVcbm1lJ30pOwoKdGVzdFZpbSgnU192aXN1YWwnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDEpOwogIGhlbHBlcnMuZG9LZXlzKCd2JywgJ2onLCAnUycpOwogIGhlbHBlcnMuZG9LZXlzKCc8RXNjPicpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgMCk7CiAgZXEoJ1xuY2MnLCBjbS5nZXRWYWx1ZSgpKTsKfSwgeyB2YWx1ZTogJ2FhXG5iYlxuY2MnfSk7Cgp0ZXN0VmltKCdkXy8nLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20ub3BlbkRpYWxvZyA9IGhlbHBlcnMuZmFrZU9wZW5EaWFsb2coJ21hdGNoJyk7CiAgaGVscGVycy5kb0tleXMoJzInLCAnZCcsICcvJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCAwKTsKICBlcSgnbWF0Y2ggXG4gbmV4dCcsIGNtLmdldFZhbHVlKCkpOwogIGNtLm9wZW5EaWFsb2cgPSBoZWxwZXJzLmZha2VPcGVuRGlhbG9nKCcyJyk7CiAgaGVscGVycy5kb0tleXMoJ2QnLCAnOicpOwogIC8vIFRPRE8gZXEoJyBuZXh0JywgY20uZ2V0VmFsdWUoKSk7Cn0sIHsgdmFsdWU6ICd0ZXh0IG1hdGNoIG1hdGNoIFxuIG5leHQnIH0pOwp0ZXN0VmltKCcvIGFuZCBuL04nLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20ub3BlbkRpYWxvZyA9IGhlbHBlcnMuZmFrZU9wZW5EaWFsb2coJ21hdGNoJyk7CiAgaGVscGVycy5kb0tleXMoJy8nKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDExKTsKICBoZWxwZXJzLmRvS2V5cygnbicpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMSwgNik7CiAgaGVscGVycy5kb0tleXMoJ04nKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDExKTsKCiAgY20uc2V0Q3Vyc29yKDAsIDApOwogIGhlbHBlcnMuZG9LZXlzKCcyJywgJy8nKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDEsIDYpOwp9LCB7IHZhbHVlOiAnbWF0Y2ggbm9wZSBtYXRjaCBcbiBub3BlIE1hdGNoJyB9KTsKdGVzdFZpbSgnL19jYXNlJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLm9wZW5EaWFsb2cgPSBoZWxwZXJzLmZha2VPcGVuRGlhbG9nKCdNYXRjaCcpOwogIGhlbHBlcnMuZG9LZXlzKCcvJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgxLCA2KTsKfSwgeyB2YWx1ZTogJ21hdGNoIG5vcGUgbWF0Y2ggXG4gbm9wZSBNYXRjaCcgfSk7CnRlc3RWaW0oJy9fMl9wY3JlJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIENvZGVNaXJyb3IuVmltLnNldE9wdGlvbigncGNyZScsIHRydWUpOwogIGNtLm9wZW5EaWFsb2cgPSBoZWxwZXJzLmZha2VPcGVuRGlhbG9nKCcod29yZCl7Mn0nKTsKICBoZWxwZXJzLmRvS2V5cygnLycpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMSwgOSk7CiAgaGVscGVycy5kb0tleXMoJ24nKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDIsIDEpOwp9LCB7IHZhbHVlOiAnd29yZFxuIGFub3RoZXIgd29yZHdvcmRcbiB3b3Jkd29yZHdvcmRcbicgfSk7CnRlc3RWaW0oJy9fMl9ub3BjcmUnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgQ29kZU1pcnJvci5WaW0uc2V0T3B0aW9uKCdwY3JlJywgZmFsc2UpOwogIGNtLm9wZW5EaWFsb2cgPSBoZWxwZXJzLmZha2VPcGVuRGlhbG9nKCdcXCh3b3JkXFwpXFx7Mn0nKTsKICBoZWxwZXJzLmRvS2V5cygnLycpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMSwgOSk7CiAgaGVscGVycy5kb0tleXMoJ24nKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDIsIDEpOwp9LCB7IHZhbHVlOiAnd29yZFxuIGFub3RoZXIgd29yZHdvcmRcbiB3b3Jkd29yZHdvcmRcbicgfSk7CnRlc3RWaW0oJy9fbm9uZ3JlZWR5JywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLm9wZW5EaWFsb2cgPSBoZWxwZXJzLmZha2VPcGVuRGlhbG9nKCdhYScpOwogIGhlbHBlcnMuZG9LZXlzKCcvJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCA0KTsKICBoZWxwZXJzLmRvS2V5cygnbicpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMSwgMyk7CiAgaGVscGVycy5kb0tleXMoJ24nKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDApOwp9LCB7IHZhbHVlOiAnYWFhIGFhIFxuIGEgYWEnfSk7CnRlc3RWaW0oJz9fbm9uZ3JlZWR5JywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLm9wZW5EaWFsb2cgPSBoZWxwZXJzLmZha2VPcGVuRGlhbG9nKCdhYScpOwogIGhlbHBlcnMuZG9LZXlzKCc/Jyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgxLCAzKTsKICBoZWxwZXJzLmRvS2V5cygnbicpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgNCk7CiAgaGVscGVycy5kb0tleXMoJ24nKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDApOwp9LCB7IHZhbHVlOiAnYWFhIGFhIFxuIGEgYWEnfSk7CnRlc3RWaW0oJy9fZ3JlZWR5JywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLm9wZW5EaWFsb2cgPSBoZWxwZXJzLmZha2VPcGVuRGlhbG9nKCdhKycpOwogIGhlbHBlcnMuZG9LZXlzKCcvJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCA0KTsKICBoZWxwZXJzLmRvS2V5cygnbicpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMSwgMSk7CiAgaGVscGVycy5kb0tleXMoJ24nKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDEsIDMpOwogIGhlbHBlcnMuZG9LZXlzKCduJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCAwKTsKfSwgeyB2YWx1ZTogJ2FhYSBhYSBcbiBhIGFhJ30pOwp0ZXN0VmltKCc/X2dyZWVkeScsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5vcGVuRGlhbG9nID0gaGVscGVycy5mYWtlT3BlbkRpYWxvZygnYSsnKTsKICBoZWxwZXJzLmRvS2V5cygnPycpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMSwgMyk7CiAgaGVscGVycy5kb0tleXMoJ24nKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDEsIDEpOwogIGhlbHBlcnMuZG9LZXlzKCduJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCA0KTsKICBoZWxwZXJzLmRvS2V5cygnbicpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgMCk7Cn0sIHsgdmFsdWU6ICdhYWEgYWEgXG4gYSBhYSd9KTsKdGVzdFZpbSgnL19ncmVlZHlfMF9vcl9tb3JlJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLm9wZW5EaWFsb2cgPSBoZWxwZXJzLmZha2VPcGVuRGlhbG9nKCdhKicpOwogIGhlbHBlcnMuZG9LZXlzKCcvJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCAzKTsKICBoZWxwZXJzLmRvS2V5cygnbicpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgNCk7CiAgaGVscGVycy5kb0tleXMoJ24nKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDUpOwogIGhlbHBlcnMuZG9LZXlzKCduJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgxLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnbicpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMSwgMSk7CiAgaGVscGVycy5kb0tleXMoJ24nKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDApOwp9LCB7IHZhbHVlOiAnYWFhICBhYVxuIGFhJ30pOwp0ZXN0VmltKCc/X2dyZWVkeV8wX29yX21vcmUnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20ub3BlbkRpYWxvZyA9IGhlbHBlcnMuZmFrZU9wZW5EaWFsb2coJ2EqJyk7CiAgaGVscGVycy5kb0tleXMoJz8nKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDEsIDEpOwogIGhlbHBlcnMuZG9LZXlzKCduJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgxLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnbicpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgNSk7CiAgaGVscGVycy5kb0tleXMoJ24nKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDQpOwogIGhlbHBlcnMuZG9LZXlzKCduJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCAzKTsKICBoZWxwZXJzLmRvS2V5cygnbicpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgMCk7Cn0sIHsgdmFsdWU6ICdhYWEgIGFhXG4gYWEnfSk7CnRlc3RWaW0oJz8gYW5kIG4vTicsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5vcGVuRGlhbG9nID0gaGVscGVycy5mYWtlT3BlbkRpYWxvZygnbWF0Y2gnKTsKICBoZWxwZXJzLmRvS2V5cygnPycpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMSwgNik7CiAgaGVscGVycy5kb0tleXMoJ24nKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDExKTsKICBoZWxwZXJzLmRvS2V5cygnTicpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMSwgNik7CgogIGNtLnNldEN1cnNvcigwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnMicsICc/Jyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCAxMSk7Cn0sIHsgdmFsdWU6ICdtYXRjaCBub3BlIG1hdGNoIFxuIG5vcGUgTWF0Y2gnIH0pOwp0ZXN0VmltKCcqJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCA5KTsKICBoZWxwZXJzLmRvS2V5cygnKicpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgMjIpOwoKICBjbS5zZXRDdXJzb3IoMCwgOSk7CiAgaGVscGVycy5kb0tleXMoJzInLCAnKicpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMSwgOCk7Cn0sIHsgdmFsdWU6ICdub21hdGNoIG1hdGNoIG5vbWF0Y2ggbWF0Y2ggXG5ub21hdGNoIE1hdGNoJyB9KTsKdGVzdFZpbSgnKl9ub193b3JkJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnKicpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgMCk7Cn0sIHsgdmFsdWU6ICcgXG4gbWF0Y2ggXG4nIH0pOwp0ZXN0VmltKCcqX3N5bWJvbCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJyonKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDEsIDApOwp9LCB7IHZhbHVlOiAnIC99XG4vfSBtYXRjaCBcbicgfSk7CnRlc3RWaW0oJyMnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDkpOwogIGhlbHBlcnMuZG9LZXlzKCcjJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgxLCA4KTsKCiAgY20uc2V0Q3Vyc29yKDAsIDkpOwogIGhlbHBlcnMuZG9LZXlzKCcyJywgJyMnKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDIyKTsKfSwgeyB2YWx1ZTogJ25vbWF0Y2ggbWF0Y2ggbm9tYXRjaCBtYXRjaCBcbm5vbWF0Y2ggTWF0Y2gnIH0pOwp0ZXN0VmltKCcqX3NlZWsnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgLy8gU2hvdWxkIHNraXAgb3ZlciBzcGFjZSBhbmQgc3ltYm9scy4KICBjbS5zZXRDdXJzb3IoMCwgMyk7CiAgaGVscGVycy5kb0tleXMoJyonKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDIyKTsKfSwgeyB2YWx1ZTogJyAgICA6PSAgbWF0Y2ggbm9tYXRjaCBtYXRjaCBcbm5vbWF0Y2ggTWF0Y2gnIH0pOwp0ZXN0VmltKCcjJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIC8vIFNob3VsZCBza2lwIG92ZXIgc3BhY2UgYW5kIHN5bWJvbHMuCiAgY20uc2V0Q3Vyc29yKDAsIDMpOwogIGhlbHBlcnMuZG9LZXlzKCcjJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgxLCA4KTsKfSwgeyB2YWx1ZTogJyAgICA6PSAgbWF0Y2ggbm9tYXRjaCBtYXRjaCBcbm5vbWF0Y2ggTWF0Y2gnIH0pOwp0ZXN0VmltKCdnKicsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgOCk7CiAgaGVscGVycy5kb0tleXMoJ2cnLCAnKicpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgMTgpOwogIGNtLnNldEN1cnNvcigwLCA4KTsKICBoZWxwZXJzLmRvS2V5cygnMycsICdnJywgJyonKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDEsIDgpOwp9LCB7IHZhbHVlOiAnbWF0Y2hlcyBtYXRjaCBhbHNvTWF0Y2hcbm1hdGNobWUgbWF0Y2hpbmcnIH0pOwp0ZXN0VmltKCdnIycsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgOCk7CiAgaGVscGVycy5kb0tleXMoJ2cnLCAnIycpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgMCk7CiAgY20uc2V0Q3Vyc29yKDAsIDgpOwogIGhlbHBlcnMuZG9LZXlzKCczJywgJ2cnLCAnIycpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMSwgMCk7Cn0sIHsgdmFsdWU6ICdtYXRjaGVzIG1hdGNoIGFsc29NYXRjaFxubWF0Y2htZSBtYXRjaGluZycgfSk7CnRlc3RWaW0oJ21hY3JvX2luc2VydCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJ3EnLCAnYScsICcwJywgJ2knKTsKICBjbS5yZXBsYWNlUmFuZ2UoJ2ZvbycsIGNtLmdldEN1cnNvcigpKTsKICBoZWxwZXJzLmRvS2V5cygnPEVzYz4nKTsKICBoZWxwZXJzLmRvS2V5cygncScsICdAJywgJ2EnKTsKICBlcSgnZm9vZm9vJywgY20uZ2V0VmFsdWUoKSk7Cn0sIHsgdmFsdWU6ICcnfSk7CnRlc3RWaW0oJ21hY3JvX2luc2VydF9yZXBlYXQnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDApOwogIGhlbHBlcnMuZG9LZXlzKCdxJywgJ2EnLCAnJCcsICdhJyk7CiAgY20ucmVwbGFjZVJhbmdlKCdsYXJyeS4nLCBjbS5nZXRDdXJzb3IoKSk7CiAgaGVscGVycy5kb0tleXMoJzxFc2M+Jyk7CiAgaGVscGVycy5kb0tleXMoJ2EnKTsKICBjbS5yZXBsYWNlUmFuZ2UoJ2N1cmx5LicsIGNtLmdldEN1cnNvcigpKTsKICBoZWxwZXJzLmRvS2V5cygnPEVzYz4nKTsKICBoZWxwZXJzLmRvS2V5cygncScpOwogIGhlbHBlcnMuZG9LZXlzKCdhJyk7CiAgY20ucmVwbGFjZVJhbmdlKCdtb2UuJywgY20uZ2V0Q3Vyc29yKCkpOwogIGhlbHBlcnMuZG9LZXlzKCc8RXNjPicpOwogIGhlbHBlcnMuZG9LZXlzKCdAJywgJ2EnKTsKICAvLyBBdCB0aGlzIHBvaW50LCB0aGUgbW9zdCByZWNlbnQgZWRpdCBzaG91bGQgYmUgdGhlIDJuZCBpbnNlcnQgY2hhbmdlCiAgLy8gaW5zaWRlIHRoZSBtYWNybywgaS5lLiAiY3VybHkuIi4KICBoZWxwZXJzLmRvS2V5cygnLicpOwogIGVxKCdsYXJyeS5jdXJseS5tb2UubGFycnkuY3VybHkuY3VybHkuJywgY20uZ2V0VmFsdWUoKSk7Cn0sIHsgdmFsdWU6ICcnfSk7CnRlc3RWaW0oJ21hY3JvX3NwYWNlJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnPFNwYWNlPicsICc8U3BhY2U+Jyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCAyKTsKICBoZWxwZXJzLmRvS2V5cygncScsICdhJywgJzxTcGFjZT4nLCAnPFNwYWNlPicsICdxJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCA0KTsKICBoZWxwZXJzLmRvS2V5cygnQCcsICdhJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCA2KTsKICBoZWxwZXJzLmRvS2V5cygnQCcsICdhJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCA4KTsKfSwgeyB2YWx1ZTogJ29uZSBsaW5lIG9mIHRleHQuJ30pOwp0ZXN0VmltKCdtYWNyb190X3NlYXJjaCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJ3EnLCAnYScsICd0JywgJ2UnLCAncScpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgMSk7CiAgaGVscGVycy5kb0tleXMoJ2wnLCAnQCcsICdhJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCA2KTsKICBoZWxwZXJzLmRvS2V5cygnbCcsICc7Jyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCAxMik7Cn0sIHsgdmFsdWU6ICdvbmUgbGluZSBvZiB0ZXh0Lid9KTsKdGVzdFZpbSgnbWFjcm9fZl9zZWFyY2gnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDApOwogIGhlbHBlcnMuZG9LZXlzKCdxJywgJ2InLCAnZicsICdlJywgJ3EnKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDIpOwogIGhlbHBlcnMuZG9LZXlzKCdAJywgJ2InKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDcpOwogIGhlbHBlcnMuZG9LZXlzKCc7Jyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCAxMyk7Cn0sIHsgdmFsdWU6ICdvbmUgbGluZSBvZiB0ZXh0Lid9KTsKdGVzdFZpbSgnbWFjcm9fc2xhc2hfc2VhcmNoJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygncScsICdjJyk7CiAgY20ub3BlbkRpYWxvZyA9IGhlbHBlcnMuZmFrZU9wZW5EaWFsb2coJ2UnKTsKICBoZWxwZXJzLmRvS2V5cygnLycsICdxJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCAyKTsKICBoZWxwZXJzLmRvS2V5cygnQCcsICdjJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCA3KTsKICBoZWxwZXJzLmRvS2V5cygnbicpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgMTMpOwp9LCB7IHZhbHVlOiAnb25lIGxpbmUgb2YgdGV4dC4nfSk7CnRlc3RWaW0oJ21hY3JvX211bHRpc2xhc2hfc2VhcmNoJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygncScsICdkJyk7CiAgY20ub3BlbkRpYWxvZyA9IGhlbHBlcnMuZmFrZU9wZW5EaWFsb2coJ2UnKTsKICBoZWxwZXJzLmRvS2V5cygnLycpOwogIGNtLm9wZW5EaWFsb2cgPSBoZWxwZXJzLmZha2VPcGVuRGlhbG9nKCd0Jyk7CiAgaGVscGVycy5kb0tleXMoJy8nLCAncScpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgMTIpOwogIGhlbHBlcnMuZG9LZXlzKCdAJywgJ2QnKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDE1KTsKfSwgeyB2YWx1ZTogJ29uZSBsaW5lIG9mIHRleHQgdG8gcnVsZSB0aGVtIGFsbC4nfSk7CnRlc3RWaW0oJ21hY3JvX2xhc3RfZXhfY29tbWFuZF9yZWdpc3RlcicsIGZ1bmN0aW9uIChjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDApOwogIGhlbHBlcnMuZG9FeCgncy9hL2InKTsKICBoZWxwZXJzLmRvS2V5cygnMicsICdAJywgJzonKTsKICBlcSgnYmJiYWEnLCBjbS5nZXRWYWx1ZSgpKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDIpOwp9LCB7IHZhbHVlOiAnYWFhYWEnfSk7CnRlc3RWaW0oJ21hY3JvX3BhcmVucycsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJ3EnLCAneicsICdpJyk7CiAgY20ucmVwbGFjZVJhbmdlKCcoJywgY20uZ2V0Q3Vyc29yKCkpOwogIGhlbHBlcnMuZG9LZXlzKCc8RXNjPicpOwogIGhlbHBlcnMuZG9LZXlzKCdlJywgJ2EnKTsKICBjbS5yZXBsYWNlUmFuZ2UoJyknLCBjbS5nZXRDdXJzb3IoKSk7CiAgaGVscGVycy5kb0tleXMoJzxFc2M+Jyk7CiAgaGVscGVycy5kb0tleXMoJ3EnKTsKICBoZWxwZXJzLmRvS2V5cygndycsICdAJywgJ3onKTsKICBoZWxwZXJzLmRvS2V5cygndycsICdAJywgJ3onKTsKICBlcSgnKHNlZSkgKHNwb3QpIChydW4pJywgY20uZ2V0VmFsdWUoKSk7Cn0sIHsgdmFsdWU6ICdzZWUgc3BvdCBydW4nfSk7CnRlc3RWaW0oJ21hY3JvX292ZXJ3cml0ZScsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJ3EnLCAneicsICcwJywgJ2knKTsKICBjbS5yZXBsYWNlUmFuZ2UoJ0kgJywgY20uZ2V0Q3Vyc29yKCkpOwogIGhlbHBlcnMuZG9LZXlzKCc8RXNjPicpOwogIGhlbHBlcnMuZG9LZXlzKCdxJyk7CiAgaGVscGVycy5kb0tleXMoJ2UnKTsKICAvLyBOb3cgcmVwbGFjZSB0aGUgbWFjcm8gd2l0aCBzb21ldGhpbmcgZWxzZS4KICBoZWxwZXJzLmRvS2V5cygncScsICd6JywgJ2EnKTsKICBjbS5yZXBsYWNlUmFuZ2UoJy4nLCBjbS5nZXRDdXJzb3IoKSk7CiAgaGVscGVycy5kb0tleXMoJzxFc2M+Jyk7CiAgaGVscGVycy5kb0tleXMoJ3EnKTsKICBoZWxwZXJzLmRvS2V5cygnZScsICdAJywgJ3onKTsKICBoZWxwZXJzLmRvS2V5cygnZScsICdAJywgJ3onKTsKICBlcSgnSSBzZWUuIHNwb3QuIHJ1bi4nLCBjbS5nZXRWYWx1ZSgpKTsKfSwgeyB2YWx1ZTogJ3NlZSBzcG90IHJ1bid9KTsKdGVzdFZpbSgnbWFjcm9fc2VhcmNoX2YnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDApOwogIGhlbHBlcnMuZG9LZXlzKCdxJywgJ2EnLCAnZicsICcgJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLDMpOwogIGhlbHBlcnMuZG9LZXlzKCdxJywgJzAnKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsMCk7CiAgaGVscGVycy5kb0tleXMoJ0AnLCAnYScpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwzKTsKfSwgeyB2YWx1ZTogJ1RoZSBxdWljayBicm93biBmb3gganVtcGVkIG92ZXIgdGhlIGxhenkgZG9nLid9KTsKdGVzdFZpbSgnbWFjcm9fc2VhcmNoXzJmJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygncScsICdhJywgJzInLCAnZicsICcgJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLDkpOwogIGhlbHBlcnMuZG9LZXlzKCdxJywgJzAnKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsMCk7CiAgaGVscGVycy5kb0tleXMoJ0AnLCAnYScpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCw5KTsKfSwgeyB2YWx1ZTogJ1RoZSBxdWljayBicm93biBmb3gganVtcGVkIG92ZXIgdGhlIGxhenkgZG9nLid9KTsKdGVzdFZpbSgneWFua19yZWdpc3RlcicsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJyInLCAnYScsICd5JywgJ3knKTsKICBoZWxwZXJzLmRvS2V5cygnaicsICciJywgJ2InLCAneScsICd5Jyk7CiAgY20ub3BlbkRpYWxvZyA9IGhlbHBlcnMuZmFrZU9wZW5EaWFsb2coJ3JlZ2lzdGVycycpOwogIGNtLm9wZW5Ob3RpZmljYXRpb24gPSBoZWxwZXJzLmZha2VPcGVuTm90aWZpY2F0aW9uKGZ1bmN0aW9uKHRleHQpIHsKICAgIGlzKC9hXHMrZm9vLy50ZXN0KHRleHQpKTsKICAgIGlzKC9iXHMrYmFyLy50ZXN0KHRleHQpKTsKICB9KTsKICBoZWxwZXJzLmRvS2V5cygnOicpOwp9LCB7IHZhbHVlOiAnZm9vXG5iYXInfSk7CnRlc3RWaW0oJ3lhbmtfdmlzdWFsX2Jsb2NrJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAxKTsKICBoZWxwZXJzLmRvS2V5cygnPEMtdj4nLCAnbCcsICdqJywgJyInLCAnYScsICd5Jyk7CiAgY20ub3Blbk5vdGlmaWNhdGlvbiA9IGhlbHBlcnMuZmFrZU9wZW5Ob3RpZmljYXRpb24oZnVuY3Rpb24odGV4dCkgewogICAgaXMoL2Fccytvb1xuYXIvLnRlc3QodGV4dCkpOwogIH0pOwogIGhlbHBlcnMuZG9LZXlzKCc6Jyk7Cn0sIHsgdmFsdWU6ICdmb29cbmJhcid9KTsKdGVzdFZpbSgneWFua19hcHBlbmRfbGluZV90b19saW5lX3JlZ2lzdGVyJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnIicsICdhJywgJ3knLCAneScpOwogIGhlbHBlcnMuZG9LZXlzKCdqJywgJyInLCAnQScsICd5JywgJ3knKTsKICBjbS5vcGVuRGlhbG9nID0gaGVscGVycy5mYWtlT3BlbkRpYWxvZygncmVnaXN0ZXJzJyk7CiAgY20ub3Blbk5vdGlmaWNhdGlvbiA9IGhlbHBlcnMuZmFrZU9wZW5Ob3RpZmljYXRpb24oZnVuY3Rpb24odGV4dCkgewogICAgaXMoL2Fccytmb29cbmJhci8udGVzdCh0ZXh0KSk7CiAgICBpcygvIlxzK2Zvb1xuYmFyLy50ZXN0KHRleHQpKTsKICB9KTsKICBoZWxwZXJzLmRvS2V5cygnOicpOwp9LCB7IHZhbHVlOiAnZm9vXG5iYXInfSk7CnRlc3RWaW0oJ3lhbmtfYXBwZW5kX3dvcmRfdG9fd29yZF9yZWdpc3RlcicsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJyInLCAnYScsICd5JywgJ3cnKTsKICBoZWxwZXJzLmRvS2V5cygnaicsICciJywgJ0EnLCAneScsICd3Jyk7CiAgY20ub3BlbkRpYWxvZyA9IGhlbHBlcnMuZmFrZU9wZW5EaWFsb2coJ3JlZ2lzdGVycycpOwogIGNtLm9wZW5Ob3RpZmljYXRpb24gPSBoZWxwZXJzLmZha2VPcGVuTm90aWZpY2F0aW9uKGZ1bmN0aW9uKHRleHQpIHsKICAgIGlzKC9hXHMrZm9vYmFyLy50ZXN0KHRleHQpKTsKICAgIGlzKC8iXHMrZm9vYmFyLy50ZXN0KHRleHQpKTsKICB9KTsKICBoZWxwZXJzLmRvS2V5cygnOicpOwp9LCB7IHZhbHVlOiAnZm9vXG5iYXInfSk7CnRlc3RWaW0oJ3lhbmtfYXBwZW5kX2xpbmVfdG9fd29yZF9yZWdpc3RlcicsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJyInLCAnYScsICd5JywgJ3cnKTsKICBoZWxwZXJzLmRvS2V5cygnaicsICciJywgJ0EnLCAneScsICd5Jyk7CiAgY20ub3BlbkRpYWxvZyA9IGhlbHBlcnMuZmFrZU9wZW5EaWFsb2coJ3JlZ2lzdGVycycpOwogIGNtLm9wZW5Ob3RpZmljYXRpb24gPSBoZWxwZXJzLmZha2VPcGVuTm90aWZpY2F0aW9uKGZ1bmN0aW9uKHRleHQpIHsKICAgIGlzKC9hXHMrZm9vXG5iYXIvLnRlc3QodGV4dCkpOwogICAgaXMoLyJccytmb29cbmJhci8udGVzdCh0ZXh0KSk7CiAgfSk7CiAgaGVscGVycy5kb0tleXMoJzonKTsKfSwgeyB2YWx1ZTogJ2Zvb1xuYmFyJ30pOwp0ZXN0VmltKCd5YW5rX2FwcGVuZF93b3JkX3RvX2xpbmVfcmVnaXN0ZXInLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDApOwogIGhlbHBlcnMuZG9LZXlzKCciJywgJ2EnLCAneScsICd5Jyk7CiAgaGVscGVycy5kb0tleXMoJ2onLCAnIicsICdBJywgJ3knLCAndycpOwogIGNtLm9wZW5EaWFsb2cgPSBoZWxwZXJzLmZha2VPcGVuRGlhbG9nKCdyZWdpc3RlcnMnKTsKICBjbS5vcGVuTm90aWZpY2F0aW9uID0gaGVscGVycy5mYWtlT3Blbk5vdGlmaWNhdGlvbihmdW5jdGlvbih0ZXh0KSB7CiAgICBpcygvYVxzK2Zvb1xuYmFyLy50ZXN0KHRleHQpKTsKICAgIGlzKC8iXHMrZm9vXG5iYXIvLnRlc3QodGV4dCkpOwogIH0pOwogIGhlbHBlcnMuZG9LZXlzKCc6Jyk7Cn0sIHsgdmFsdWU6ICdmb29cbmJhcid9KTsKdGVzdFZpbSgnbWFjcm9fcmVnaXN0ZXInLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDApOwogIGhlbHBlcnMuZG9LZXlzKCdxJywgJ2EnLCAnaScpOwogIGNtLnJlcGxhY2VSYW5nZSgnZ2FuZ25hbScsIGNtLmdldEN1cnNvcigpKTsKICBoZWxwZXJzLmRvS2V5cygnPEVzYz4nKTsKICBoZWxwZXJzLmRvS2V5cygncScpOwogIGhlbHBlcnMuZG9LZXlzKCdxJywgJ2InLCAnbycpOwogIGNtLnJlcGxhY2VSYW5nZSgnc3R5bGUnLCBjbS5nZXRDdXJzb3IoKSk7CiAgaGVscGVycy5kb0tleXMoJzxFc2M+Jyk7CiAgaGVscGVycy5kb0tleXMoJ3EnKTsKICBjbS5vcGVuRGlhbG9nID0gaGVscGVycy5mYWtlT3BlbkRpYWxvZygncmVnaXN0ZXJzJyk7CiAgY20ub3Blbk5vdGlmaWNhdGlvbiA9IGhlbHBlcnMuZmFrZU9wZW5Ob3RpZmljYXRpb24oZnVuY3Rpb24odGV4dCkgewogICAgaXMoL2FccytpLy50ZXN0KHRleHQpKTsKICAgIGlzKC9iXHMrby8udGVzdCh0ZXh0KSk7CiAgfSk7CiAgaGVscGVycy5kb0tleXMoJzonKTsKfSwgeyB2YWx1ZTogJyd9KTsKdGVzdFZpbSgnLl9yZWdpc3RlcicsIGZ1bmN0aW9uKGNtLHZpbSxoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsMCk7CiAgaGVscGVycy5kb0tleXMoJ2knKTsKICBjbS5yZXBsYWNlUmFuZ2UoJ2ZvbycsY20uZ2V0Q3Vyc29yKCkpOwogIGhlbHBlcnMuZG9LZXlzKCc8RXNjPicpOwogIGNtLm9wZW5EaWFsb2cgPSBoZWxwZXJzLmZha2VPcGVuRGlhbG9nKCdyZWdpc3RlcnMnKTsKICBjbS5vcGVuTm90aWZpY2F0aW9uID0gaGVscGVycy5mYWtlT3Blbk5vdGlmaWNhdGlvbihmdW5jdGlvbih0ZXh0KSB7CiAgICBpcygvXC5ccytmb28vLnRlc3QodGV4dCkpOwogIH0pOwogIGhlbHBlcnMuZG9LZXlzKCc6Jyk7Cn0sIHt2YWx1ZTogJyd9KTsKdGVzdFZpbSgnOl9yZWdpc3RlcicsIGZ1bmN0aW9uKGNtLHZpbSxoZWxwZXJzKSB7CiAgaGVscGVycy5kb0V4KCdiYXInKTsKICBjbS5vcGVuRGlhbG9nID0gaGVscGVycy5mYWtlT3BlbkRpYWxvZygncmVnaXN0ZXJzJyk7CiAgY20ub3Blbk5vdGlmaWNhdGlvbiA9IGhlbHBlcnMuZmFrZU9wZW5Ob3RpZmljYXRpb24oZnVuY3Rpb24odGV4dCkgewogICAgaXMoLzpccytiYXIvLnRlc3QodGV4dCkpOwogIH0pOwogIGhlbHBlcnMuZG9LZXlzKCc6Jyk7Cn0sIHt2YWx1ZTogJyd9KTsKdGVzdFZpbSgnc2VhcmNoX3JlZ2lzdGVyX2VzY2FwZScsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICAvLyBDaGVjayB0aGF0IHRoZSByZWdpc3RlciBpcyByZXN0b3JlZCBpZiB0aGUgdXNlciBlc2NhcGVzIHJhdGhlciB0aGFuIGNvbmZpcm1zLgogIGNtLm9wZW5EaWFsb2cgPSBoZWxwZXJzLmZha2VPcGVuRGlhbG9nKCd3YWxkbycpOwogIGhlbHBlcnMuZG9LZXlzKCcvJyk7CiAgdmFyIG9uS2V5RG93bjsKICB2YXIgb25LZXlVcDsKICB2YXIgS0VZQ09ERVMgPSB7CiAgICBmOiA3MCwKICAgIG86IDc5LAogICAgRXNjOiAyNwogIH07CiAgY20ub3BlbkRpYWxvZyA9IGZ1bmN0aW9uKHRlbXBsYXRlLCBjYWxsYmFjaywgb3B0aW9ucykgewogICAgb25LZXlEb3duID0gb3B0aW9ucy5vbktleURvd247CiAgICBvbktleVVwID0gb3B0aW9ucy5vbktleVVwOwogIH07CiAgdmFyIGNsb3NlID0gZnVuY3Rpb24oKSB7fTsKICBoZWxwZXJzLmRvS2V5cygnLycpOwogIC8vIEZha2Ugc29tZSBrZXlib2FyZCBldmVudHMgY29taW5nIGluLgogIG9uS2V5RG93bih7a2V5Q29kZTogS0VZQ09ERVMuZn0sICcnLCBjbG9zZSk7CiAgb25LZXlVcCh7a2V5Q29kZTogS0VZQ09ERVMuZn0sICcnLCBjbG9zZSk7CiAgb25LZXlEb3duKHtrZXlDb2RlOiBLRVlDT0RFUy5vfSwgJ2YnLCBjbG9zZSk7CiAgb25LZXlVcCh7a2V5Q29kZTogS0VZQ09ERVMub30sICdmJywgY2xvc2UpOwogIG9uS2V5RG93bih7a2V5Q29kZTogS0VZQ09ERVMub30sICdmbycsIGNsb3NlKTsKICBvbktleVVwKHtrZXlDb2RlOiBLRVlDT0RFUy5vfSwgJ2ZvJywgY2xvc2UpOwogIG9uS2V5RG93bih7a2V5Q29kZTogS0VZQ09ERVMuRXNjfSwgJ2ZvbycsIGNsb3NlKTsKICBjbS5vcGVuRGlhbG9nID0gaGVscGVycy5mYWtlT3BlbkRpYWxvZygncmVnaXN0ZXJzJyk7CiAgY20ub3Blbk5vdGlmaWNhdGlvbiA9IGhlbHBlcnMuZmFrZU9wZW5Ob3RpZmljYXRpb24oZnVuY3Rpb24odGV4dCkgewogICAgaXMoL3dhbGRvLy50ZXN0KHRleHQpKTsKICAgIGlzKCEvZm9vLy50ZXN0KHRleHQpKTsKICB9KTsKICBoZWxwZXJzLmRvS2V5cygnOicpOwp9LCB7dmFsdWU6ICcnfSk7CnRlc3RWaW0oJ3NlYXJjaF9yZWdpc3RlcicsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5vcGVuRGlhbG9nID0gaGVscGVycy5mYWtlT3BlbkRpYWxvZygnZm9vJyk7CiAgaGVscGVycy5kb0tleXMoJy8nKTsKICBjbS5vcGVuRGlhbG9nID0gaGVscGVycy5mYWtlT3BlbkRpYWxvZygncmVnaXN0ZXJzJyk7CiAgY20ub3Blbk5vdGlmaWNhdGlvbiA9IGhlbHBlcnMuZmFrZU9wZW5Ob3RpZmljYXRpb24oZnVuY3Rpb24odGV4dCkgewogICAgaXMoL1wvXHMrZm9vLy50ZXN0KHRleHQpKTsKICB9KTsKICBoZWxwZXJzLmRvS2V5cygnOicpOwp9LCB7dmFsdWU6ICcnfSk7CnRlc3RWaW0oJ3NlYXJjaF9oaXN0b3J5JywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLm9wZW5EaWFsb2cgPSBoZWxwZXJzLmZha2VPcGVuRGlhbG9nKCd0aGlzJyk7CiAgaGVscGVycy5kb0tleXMoJy8nKTsKICBjbS5vcGVuRGlhbG9nID0gaGVscGVycy5mYWtlT3BlbkRpYWxvZygnY2hlY2tzJyk7CiAgaGVscGVycy5kb0tleXMoJy8nKTsKICBjbS5vcGVuRGlhbG9nID0gaGVscGVycy5mYWtlT3BlbkRpYWxvZygnc2VhcmNoJyk7CiAgaGVscGVycy5kb0tleXMoJy8nKTsKICBjbS5vcGVuRGlhbG9nID0gaGVscGVycy5mYWtlT3BlbkRpYWxvZygnaGlzdG9yeScpOwogIGhlbHBlcnMuZG9LZXlzKCcvJyk7CiAgY20ub3BlbkRpYWxvZyA9IGhlbHBlcnMuZmFrZU9wZW5EaWFsb2coJ2NoZWNrcycpOwogIGhlbHBlcnMuZG9LZXlzKCcvJyk7CiAgdmFyIG9uS2V5RG93bjsKICB2YXIgb25LZXlVcDsKICB2YXIgcXVlcnkgPSAnJzsKICB2YXIga2V5Q29kZXMgPSB7CiAgICBVcDogMzgsCiAgICBEb3duOiA0MAogIH07CiAgY20ub3BlbkRpYWxvZyA9IGZ1bmN0aW9uKHRlbXBsYXRlLCBjYWxsYmFjaywgb3B0aW9ucykgewogICAgb25LZXlVcCA9IG9wdGlvbnMub25LZXlVcDsKICAgIG9uS2V5RG93biA9IG9wdGlvbnMub25LZXlEb3duOwogIH07CiAgdmFyIGNsb3NlID0gZnVuY3Rpb24obmV3VmFsKSB7CiAgICBpZiAodHlwZW9mIG5ld1ZhbCA9PSAnc3RyaW5nJykgcXVlcnkgPSBuZXdWYWw7CiAgfQogIGhlbHBlcnMuZG9LZXlzKCcvJyk7CiAgb25LZXlEb3duKHtrZXlDb2RlOiBrZXlDb2Rlcy5VcH0sIHF1ZXJ5LCBjbG9zZSk7CiAgb25LZXlVcCh7a2V5Q29kZToga2V5Q29kZXMuVXB9LCBxdWVyeSwgY2xvc2UpOwogIGVxKHF1ZXJ5LCAnY2hlY2tzJyk7CiAgb25LZXlEb3duKHtrZXlDb2RlOiBrZXlDb2Rlcy5VcH0sIHF1ZXJ5LCBjbG9zZSk7CiAgb25LZXlVcCh7a2V5Q29kZToga2V5Q29kZXMuVXB9LCBxdWVyeSwgY2xvc2UpOwogIGVxKHF1ZXJ5LCAnaGlzdG9yeScpOwogIG9uS2V5RG93bih7a2V5Q29kZToga2V5Q29kZXMuVXB9LCBxdWVyeSwgY2xvc2UpOwogIG9uS2V5VXAoe2tleUNvZGU6IGtleUNvZGVzLlVwfSwgcXVlcnksIGNsb3NlKTsKICBlcShxdWVyeSwgJ3NlYXJjaCcpOwogIG9uS2V5RG93bih7a2V5Q29kZToga2V5Q29kZXMuVXB9LCBxdWVyeSwgY2xvc2UpOwogIG9uS2V5VXAoe2tleUNvZGU6IGtleUNvZGVzLlVwfSwgcXVlcnksIGNsb3NlKTsKICBlcShxdWVyeSwgJ3RoaXMnKTsKICBvbktleURvd24oe2tleUNvZGU6IGtleUNvZGVzLkRvd259LCBxdWVyeSwgY2xvc2UpOwogIG9uS2V5VXAoe2tleUNvZGU6IGtleUNvZGVzLkRvd259LCBxdWVyeSwgY2xvc2UpOwogIGVxKHF1ZXJ5LCAnc2VhcmNoJyk7Cn0sIHt2YWx1ZTogJyd9KTsKdGVzdFZpbSgnZXhDb21tYW5kX2hpc3RvcnknLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20ub3BlbkRpYWxvZyA9IGhlbHBlcnMuZmFrZU9wZW5EaWFsb2coJ3JlZ2lzdGVycycpOwogIGhlbHBlcnMuZG9LZXlzKCc6Jyk7CiAgY20ub3BlbkRpYWxvZyA9IGhlbHBlcnMuZmFrZU9wZW5EaWFsb2coJ3NvcnQnKTsKICBoZWxwZXJzLmRvS2V5cygnOicpOwogIGNtLm9wZW5EaWFsb2cgPSBoZWxwZXJzLmZha2VPcGVuRGlhbG9nKCdtYXAnKTsKICBoZWxwZXJzLmRvS2V5cygnOicpOwogIGNtLm9wZW5EaWFsb2cgPSBoZWxwZXJzLmZha2VPcGVuRGlhbG9nKCdpbnZhbGlkJyk7CiAgaGVscGVycy5kb0tleXMoJzonKTsKICB2YXIgb25LZXlEb3duOwogIHZhciBvbktleVVwOwogIHZhciBpbnB1dCA9ICcnOwogIHZhciBrZXlDb2RlcyA9IHsKICAgIFVwOiAzOCwKICAgIERvd246IDQwLAogICAgczogMTE1CiAgfTsKICBjbS5vcGVuRGlhbG9nID0gZnVuY3Rpb24odGVtcGxhdGUsIGNhbGxiYWNrLCBvcHRpb25zKSB7CiAgICBvbktleVVwID0gb3B0aW9ucy5vbktleVVwOwogICAgb25LZXlEb3duID0gb3B0aW9ucy5vbktleURvd247CiAgfTsKICB2YXIgY2xvc2UgPSBmdW5jdGlvbihuZXdWYWwpIHsKICAgIGlmICh0eXBlb2YgbmV3VmFsID09ICdzdHJpbmcnKSBpbnB1dCA9IG5ld1ZhbDsKICB9CiAgaGVscGVycy5kb0tleXMoJzonKTsKICBvbktleURvd24oe2tleUNvZGU6IGtleUNvZGVzLlVwfSwgaW5wdXQsIGNsb3NlKTsKICBlcShpbnB1dCwgJ2ludmFsaWQnKTsKICBvbktleURvd24oe2tleUNvZGU6IGtleUNvZGVzLlVwfSwgaW5wdXQsIGNsb3NlKTsKICBlcShpbnB1dCwgJ21hcCcpOwogIG9uS2V5RG93bih7a2V5Q29kZToga2V5Q29kZXMuVXB9LCBpbnB1dCwgY2xvc2UpOwogIGVxKGlucHV0LCAnc29ydCcpOwogIG9uS2V5RG93bih7a2V5Q29kZToga2V5Q29kZXMuVXB9LCBpbnB1dCwgY2xvc2UpOwogIGVxKGlucHV0LCAncmVnaXN0ZXJzJyk7CiAgb25LZXlEb3duKHtrZXlDb2RlOiBrZXlDb2Rlcy5zfSwgJycsIGNsb3NlKTsKICBpbnB1dCA9ICdzJzsKICBvbktleURvd24oe2tleUNvZGU6IGtleUNvZGVzLlVwfSwgaW5wdXQsIGNsb3NlKTsKICBlcShpbnB1dCwgJ3NvcnQnKTsKfSwge3ZhbHVlOiAnJ30pOwp0ZXN0VmltKCdzZWFyY2hfY2xlYXInLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgdmFyIG9uS2V5RG93bjsKICB2YXIgaW5wdXQgPSAnJzsKICB2YXIga2V5Q29kZXMgPSB7CiAgICBDdHJsOiAxNywKICAgIHU6IDg1CiAgfTsKICBjbS5vcGVuRGlhbG9nID0gZnVuY3Rpb24odGVtcGxhdGUsIGNhbGxiYWNrLCBvcHRpb25zKSB7CiAgICBvbktleURvd24gPSBvcHRpb25zLm9uS2V5RG93bjsKICB9OwogIHZhciBjbG9zZSA9IGZ1bmN0aW9uKG5ld1ZhbCkgewogICAgaWYgKHR5cGVvZiBuZXdWYWwgPT0gJ3N0cmluZycpIGlucHV0ID0gbmV3VmFsOwogIH0KICBoZWxwZXJzLmRvS2V5cygnLycpOwogIGlucHV0ID0gJ2Zvbyc7CiAgb25LZXlEb3duKHtrZXlDb2RlOiBrZXlDb2Rlcy5DdHJsfSwgaW5wdXQsIGNsb3NlKTsKICBvbktleURvd24oe2tleUNvZGU6IGtleUNvZGVzLnUsIGN0cmxLZXk6IHRydWV9LCBpbnB1dCwgY2xvc2UpOwogIGVxKGlucHV0LCAnJyk7Cn0pOwp0ZXN0VmltKCdleENvbW1hbmRfY2xlYXInLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgdmFyIG9uS2V5RG93bjsKICB2YXIgaW5wdXQgPSAnJzsKICB2YXIga2V5Q29kZXMgPSB7CiAgICBDdHJsOiAxNywKICAgIHU6IDg1CiAgfTsKICBjbS5vcGVuRGlhbG9nID0gZnVuY3Rpb24odGVtcGxhdGUsIGNhbGxiYWNrLCBvcHRpb25zKSB7CiAgICBvbktleURvd24gPSBvcHRpb25zLm9uS2V5RG93bjsKICB9OwogIHZhciBjbG9zZSA9IGZ1bmN0aW9uKG5ld1ZhbCkgewogICAgaWYgKHR5cGVvZiBuZXdWYWwgPT0gJ3N0cmluZycpIGlucHV0ID0gbmV3VmFsOwogIH0KICBoZWxwZXJzLmRvS2V5cygnOicpOwogIGlucHV0ID0gJ2Zvbyc7CiAgb25LZXlEb3duKHtrZXlDb2RlOiBrZXlDb2Rlcy5DdHJsfSwgaW5wdXQsIGNsb3NlKTsKICBvbktleURvd24oe2tleUNvZGU6IGtleUNvZGVzLnUsIGN0cmxLZXk6IHRydWV9LCBpbnB1dCwgY2xvc2UpOwogIGVxKGlucHV0LCAnJyk7Cn0pOwp0ZXN0VmltKCcuJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnMicsICdkJywgJ3cnKTsKICBoZWxwZXJzLmRvS2V5cygnLicpOwogIGVxKCc1IDYnLCBjbS5nZXRWYWx1ZSgpKTsKfSwgeyB2YWx1ZTogJzEgMiAzIDQgNSA2J30pOwp0ZXN0VmltKCcuX3JlcGVhdCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJzInLCAnZCcsICd3Jyk7CiAgaGVscGVycy5kb0tleXMoJzMnLCAnLicpOwogIGVxKCc2JywgY20uZ2V0VmFsdWUoKSk7Cn0sIHsgdmFsdWU6ICcxIDIgMyA0IDUgNid9KTsKdGVzdFZpbSgnLl9pbnNlcnQnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgaGVscGVycy5kb0tleXMoJ2knKTsKICBjbS5yZXBsYWNlUmFuZ2UoJ3Rlc3QnLCBjbS5nZXRDdXJzb3IoKSk7CiAgaGVscGVycy5kb0tleXMoJzxFc2M+Jyk7CiAgaGVscGVycy5kb0tleXMoJy4nKTsKICBlcSgndGVzdGVzdHQnLCBjbS5nZXRWYWx1ZSgpKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDYpOwogIGhlbHBlcnMuZG9LZXlzKCdPJyk7CiAgY20ucmVwbGFjZVJhbmdlKCd4eXonLCBjbS5nZXRDdXJzb3IoKSk7CiAgaGVscGVycy5kb0luc2VydE1vZGVLZXlzKCdCYWNrc3BhY2UnKTsKICBoZWxwZXJzLmRvSW5zZXJ0TW9kZUtleXMoJ0Rvd24nKTsKICBoZWxwZXJzLmRvS2V5cygnPEVzYz4nKTsKICBoZWxwZXJzLmRvS2V5cygnLicpOwogIGVxKCd4eVxueHlcbnRlc3Rlc3R0JywgY20uZ2V0VmFsdWUoKSk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgxLCAxKTsKfSwgeyB2YWx1ZTogJyd9KTsKdGVzdFZpbSgnLl9pbnNlcnRfcmVwZWF0JywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGhlbHBlcnMuZG9LZXlzKCdpJyk7CiAgY20ucmVwbGFjZVJhbmdlKCd0ZXN0JywgY20uZ2V0Q3Vyc29yKCkpOwogIGNtLnNldEN1cnNvcigwLCA0KTsKICBoZWxwZXJzLmRvS2V5cygnPEVzYz4nKTsKICBoZWxwZXJzLmRvS2V5cygnMicsICcuJyk7CiAgZXEoJ3Rlc3Rlc3R0ZXN0dCcsIGNtLmdldFZhbHVlKCkpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgMTApOwp9LCB7IHZhbHVlOiAnJ30pOwp0ZXN0VmltKCcuX3JlcGVhdF9pbnNlcnQnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgaGVscGVycy5kb0tleXMoJzMnLCAnaScpOwogIGNtLnJlcGxhY2VSYW5nZSgndGUnLCBjbS5nZXRDdXJzb3IoKSk7CiAgY20uc2V0Q3Vyc29yKDAsIDIpOwogIGhlbHBlcnMuZG9LZXlzKCc8RXNjPicpOwogIGhlbHBlcnMuZG9LZXlzKCcuJyk7CiAgZXEoJ3RldGV0dGV0ZXRlZScsIGNtLmdldFZhbHVlKCkpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgMTApOwp9LCB7IHZhbHVlOiAnJ30pOwp0ZXN0VmltKCcuX2luc2VydF9vJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGhlbHBlcnMuZG9LZXlzKCdvJyk7CiAgY20ucmVwbGFjZVJhbmdlKCd6JywgY20uZ2V0Q3Vyc29yKCkpOwogIGNtLnNldEN1cnNvcigxLCAxKTsKICBoZWxwZXJzLmRvS2V5cygnPEVzYz4nKTsKICBoZWxwZXJzLmRvS2V5cygnLicpOwogIGVxKCdcbnpcbnonLCBjbS5nZXRWYWx1ZSgpKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDIsIDApOwp9LCB7IHZhbHVlOiAnJ30pOwp0ZXN0VmltKCcuX2luc2VydF9vX3JlcGVhdCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBoZWxwZXJzLmRvS2V5cygnbycpOwogIGNtLnJlcGxhY2VSYW5nZSgneicsIGNtLmdldEN1cnNvcigpKTsKICBoZWxwZXJzLmRvS2V5cygnPEVzYz4nKTsKICBjbS5zZXRDdXJzb3IoMSwgMCk7CiAgaGVscGVycy5kb0tleXMoJzInLCAnLicpOwogIGVxKCdcbnpcbnpcbnonLCBjbS5nZXRWYWx1ZSgpKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDMsIDApOwp9LCB7IHZhbHVlOiAnJ30pOwp0ZXN0VmltKCcuX2luc2VydF9vX2luZGVudCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBoZWxwZXJzLmRvS2V5cygnbycpOwogIGNtLnJlcGxhY2VSYW5nZSgneicsIGNtLmdldEN1cnNvcigpKTsKICBoZWxwZXJzLmRvS2V5cygnPEVzYz4nKTsKICBjbS5zZXRDdXJzb3IoMSwgMik7CiAgaGVscGVycy5kb0tleXMoJy4nKTsKICBlcSgne1xuICB6XG4gIHonLCBjbS5nZXRWYWx1ZSgpKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDIsIDIpOwp9LCB7IHZhbHVlOiAneyd9KTsKdGVzdFZpbSgnLl9pbnNlcnRfY3cnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgaGVscGVycy5kb0tleXMoJ2MnLCAndycpOwogIGNtLnJlcGxhY2VSYW5nZSgndGVzdCcsIGNtLmdldEN1cnNvcigpKTsKICBoZWxwZXJzLmRvS2V5cygnPEVzYz4nKTsKICBjbS5zZXRDdXJzb3IoMCwgMyk7CiAgaGVscGVycy5kb0tleXMoJzInLCAnbCcpOwogIGhlbHBlcnMuZG9LZXlzKCcuJyk7CiAgZXEoJ3Rlc3QgdGVzdCB3b3JkMycsIGNtLmdldFZhbHVlKCkpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwgOCk7Cn0sIHsgdmFsdWU6ICd3b3JkMSB3b3JkMiB3b3JkMycgfSk7CnRlc3RWaW0oJy5faW5zZXJ0X2N3X3JlcGVhdCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICAvLyBGb3Igc29tZSByZWFzb24sIHJlcGVhdCBjdyBpbiBkZXNrdG9wIFZJTSB3aWxsIGRvZXMgbm90IHJlcGVhdCBpbnNlcnQgbW9kZQogIC8vIGNoYW5nZXMuIFdpbGwgY29uZm9ybSB0byB0aGF0IGJlaGF2aW9yLgogIGhlbHBlcnMuZG9LZXlzKCdjJywgJ3cnKTsKICBjbS5yZXBsYWNlUmFuZ2UoJ3Rlc3QnLCBjbS5nZXRDdXJzb3IoKSk7CiAgaGVscGVycy5kb0tleXMoJzxFc2M+Jyk7CiAgY20uc2V0Q3Vyc29yKDAsIDQpOwogIGhlbHBlcnMuZG9LZXlzKCdsJyk7CiAgaGVscGVycy5kb0tleXMoJzInLCAnLicpOwogIGVxKCd0ZXN0IHRlc3QnLCBjbS5nZXRWYWx1ZSgpKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDgpOwp9LCB7IHZhbHVlOiAnd29yZDEgd29yZDIgd29yZDMnIH0pOwp0ZXN0VmltKCcuX2RlbGV0ZScsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgNSk7CiAgaGVscGVycy5kb0tleXMoJ2knKTsKICBoZWxwZXJzLmRvSW5zZXJ0TW9kZUtleXMoJ0JhY2tzcGFjZScpOwogIGhlbHBlcnMuZG9LZXlzKCc8RXNjPicpOwogIGhlbHBlcnMuZG9LZXlzKCcuJyk7CiAgZXEoJ3phY2UnLCBjbS5nZXRWYWx1ZSgpKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDEpOwp9LCB7IHZhbHVlOiAnemFiY2RlJ30pOwp0ZXN0VmltKCcuX2RlbGV0ZV9yZXBlYXQnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDYpOwogIGhlbHBlcnMuZG9LZXlzKCdpJyk7CiAgaGVscGVycy5kb0luc2VydE1vZGVLZXlzKCdCYWNrc3BhY2UnKTsKICBoZWxwZXJzLmRvS2V5cygnPEVzYz4nKTsKICBoZWxwZXJzLmRvS2V5cygnMicsICcuJyk7CiAgZXEoJ3p6Y2UnLCBjbS5nZXRWYWx1ZSgpKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDEpOwp9LCB7IHZhbHVlOiAnenphYmNkZSd9KTsKdGVzdFZpbSgnLl92aXN1YWxfPicsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJ1YnLCAnaicsICc+Jyk7CiAgY20uc2V0Q3Vyc29yKDIsIDApCiAgaGVscGVycy5kb0tleXMoJy4nKTsKICBlcSgnICAxXG4gIDJcbiAgM1xuICA0JywgY20uZ2V0VmFsdWUoKSk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgyLCAyKTsKfSwgeyB2YWx1ZTogJzFcbjJcbjNcbjQnfSk7CnRlc3RWaW0oJ2Y7JywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnZicsICd4Jyk7CiAgaGVscGVycy5kb0tleXMoJzsnKTsKICBoZWxwZXJzLmRvS2V5cygnMicsICc7Jyk7CiAgZXEoOSwgY20uZ2V0Q3Vyc29yKCkuY2gpOwp9LCB7IHZhbHVlOiAnMDF4M3h4Njc4eCd9KTsKdGVzdFZpbSgnRjsnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDgpOwogIGhlbHBlcnMuZG9LZXlzKCdGJywgJ3gnKTsKICBoZWxwZXJzLmRvS2V5cygnOycpOwogIGhlbHBlcnMuZG9LZXlzKCcyJywgJzsnKTsKICBlcSgyLCBjbS5nZXRDdXJzb3IoKS5jaCk7Cn0sIHsgdmFsdWU6ICcwMXgzeHg2eDh4J30pOwp0ZXN0VmltKCd0OycsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJ3QnLCAneCcpOwogIGhlbHBlcnMuZG9LZXlzKCc7Jyk7CiAgaGVscGVycy5kb0tleXMoJzInLCAnOycpOwogIGVxKDgsIGNtLmdldEN1cnNvcigpLmNoKTsKfSwgeyB2YWx1ZTogJzAxeDN4eDY3OHgnfSk7CnRlc3RWaW0oJ1Q7JywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCA5KTsKICBoZWxwZXJzLmRvS2V5cygnVCcsICd4Jyk7CiAgaGVscGVycy5kb0tleXMoJzsnKTsKICBoZWxwZXJzLmRvS2V5cygnMicsICc7Jyk7CiAgZXEoMiwgY20uZ2V0Q3Vyc29yKCkuY2gpOwp9LCB7IHZhbHVlOiAnMHh4M3h4Njc4eCd9KTsKdGVzdFZpbSgnZiwnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDYpOwogIGhlbHBlcnMuZG9LZXlzKCdmJywgJ3gnKTsKICBoZWxwZXJzLmRvS2V5cygnLCcpOwogIGhlbHBlcnMuZG9LZXlzKCcyJywgJywnKTsKICBlcSgyLCBjbS5nZXRDdXJzb3IoKS5jaCk7Cn0sIHsgdmFsdWU6ICcwMXgzeHg2Nzh4J30pOwp0ZXN0VmltKCdGLCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgMyk7CiAgaGVscGVycy5kb0tleXMoJ0YnLCAneCcpOwogIGhlbHBlcnMuZG9LZXlzKCcsJyk7CiAgaGVscGVycy5kb0tleXMoJzInLCAnLCcpOwogIGVxKDksIGNtLmdldEN1cnNvcigpLmNoKTsKfSwgeyB2YWx1ZTogJzAxeDN4eDY3OHgnfSk7CnRlc3RWaW0oJ3QsJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCA2KTsKICBoZWxwZXJzLmRvS2V5cygndCcsICd4Jyk7CiAgaGVscGVycy5kb0tleXMoJywnKTsKICBoZWxwZXJzLmRvS2V5cygnMicsICcsJyk7CiAgZXEoMywgY20uZ2V0Q3Vyc29yKCkuY2gpOwp9LCB7IHZhbHVlOiAnMDF4M3h4Njc4eCd9KTsKdGVzdFZpbSgnVCwnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDQpOwogIGhlbHBlcnMuZG9LZXlzKCdUJywgJ3gnKTsKICBoZWxwZXJzLmRvS2V5cygnLCcpOwogIGhlbHBlcnMuZG9LZXlzKCcyJywgJywnKTsKICBlcSg4LCBjbS5nZXRDdXJzb3IoKS5jaCk7Cn0sIHsgdmFsdWU6ICcwMXgzeHg2N3h4J30pOwp0ZXN0VmltKCdmZCw7JywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnZicsICc0Jyk7CiAgY20uc2V0Q3Vyc29yKDAsIDApOwogIGhlbHBlcnMuZG9LZXlzKCdkJywgJzsnKTsKICBlcSgnNTY3ODknLCBjbS5nZXRWYWx1ZSgpKTsKICBoZWxwZXJzLmRvS2V5cygndScpOwogIGNtLnNldEN1cnNvcigwLCA5KTsKICBoZWxwZXJzLmRvS2V5cygnZCcsICcsJyk7CiAgZXEoJzAxMjM5JywgY20uZ2V0VmFsdWUoKSk7Cn0sIHsgdmFsdWU6ICcwMTIzNDU2Nzg5J30pOwp0ZXN0VmltKCdGZCw7JywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCA5KTsKICBoZWxwZXJzLmRvS2V5cygnRicsICc0Jyk7CiAgY20uc2V0Q3Vyc29yKDAsIDkpOwogIGhlbHBlcnMuZG9LZXlzKCdkJywgJzsnKTsKICBlcSgnMDEyMzknLCBjbS5nZXRWYWx1ZSgpKTsKICBoZWxwZXJzLmRvS2V5cygndScpOwogIGNtLnNldEN1cnNvcigwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnZCcsICcsJyk7CiAgZXEoJzU2Nzg5JywgY20uZ2V0VmFsdWUoKSk7Cn0sIHsgdmFsdWU6ICcwMTIzNDU2Nzg5J30pOwp0ZXN0VmltKCd0ZCw7JywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygndCcsICc0Jyk7CiAgY20uc2V0Q3Vyc29yKDAsIDApOwogIGhlbHBlcnMuZG9LZXlzKCdkJywgJzsnKTsKICBlcSgnNDU2Nzg5JywgY20uZ2V0VmFsdWUoKSk7CiAgaGVscGVycy5kb0tleXMoJ3UnKTsKICBjbS5zZXRDdXJzb3IoMCwgOSk7CiAgaGVscGVycy5kb0tleXMoJ2QnLCAnLCcpOwogIGVxKCcwMTIzNDknLCBjbS5nZXRWYWx1ZSgpKTsKfSwgeyB2YWx1ZTogJzAxMjM0NTY3ODknfSk7CnRlc3RWaW0oJ1RkLDsnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDkpOwogIGhlbHBlcnMuZG9LZXlzKCdUJywgJzQnKTsKICBjbS5zZXRDdXJzb3IoMCwgOSk7CiAgaGVscGVycy5kb0tleXMoJ2QnLCAnOycpOwogIGVxKCcwMTIzNDknLCBjbS5nZXRWYWx1ZSgpKTsKICBoZWxwZXJzLmRvS2V5cygndScpOwogIGNtLnNldEN1cnNvcigwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnZCcsICcsJyk7CiAgZXEoJzQ1Njc4OScsIGNtLmdldFZhbHVlKCkpOwp9LCB7IHZhbHVlOiAnMDEyMzQ1Njc4OSd9KTsKdGVzdFZpbSgnZmMsOycsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJ2YnLCAnNCcpOwogIGNtLnNldEN1cnNvcigwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnYycsICc7JywgJzxFc2M+Jyk7CiAgZXEoJzU2Nzg5JywgY20uZ2V0VmFsdWUoKSk7CiAgaGVscGVycy5kb0tleXMoJ3UnKTsKICBjbS5zZXRDdXJzb3IoMCwgOSk7CiAgaGVscGVycy5kb0tleXMoJ2MnLCAnLCcpOwogIGVxKCcwMTIzOScsIGNtLmdldFZhbHVlKCkpOwp9LCB7IHZhbHVlOiAnMDEyMzQ1Njc4OSd9KTsKdGVzdFZpbSgnRmMsOycsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgOSk7CiAgaGVscGVycy5kb0tleXMoJ0YnLCAnNCcpOwogIGNtLnNldEN1cnNvcigwLCA5KTsKICBoZWxwZXJzLmRvS2V5cygnYycsICc7JywgJzxFc2M+Jyk7CiAgZXEoJzAxMjM5JywgY20uZ2V0VmFsdWUoKSk7CiAgaGVscGVycy5kb0tleXMoJ3UnKTsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJ2MnLCAnLCcpOwogIGVxKCc1Njc4OScsIGNtLmdldFZhbHVlKCkpOwp9LCB7IHZhbHVlOiAnMDEyMzQ1Njc4OSd9KTsKdGVzdFZpbSgndGMsOycsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJ3QnLCAnNCcpOwogIGNtLnNldEN1cnNvcigwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnYycsICc7JywgJzxFc2M+Jyk7CiAgZXEoJzQ1Njc4OScsIGNtLmdldFZhbHVlKCkpOwogIGhlbHBlcnMuZG9LZXlzKCd1Jyk7CiAgY20uc2V0Q3Vyc29yKDAsIDkpOwogIGhlbHBlcnMuZG9LZXlzKCdjJywgJywnKTsKICBlcSgnMDEyMzQ5JywgY20uZ2V0VmFsdWUoKSk7Cn0sIHsgdmFsdWU6ICcwMTIzNDU2Nzg5J30pOwp0ZXN0VmltKCdUYyw7JywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCA5KTsKICBoZWxwZXJzLmRvS2V5cygnVCcsICc0Jyk7CiAgY20uc2V0Q3Vyc29yKDAsIDkpOwogIGhlbHBlcnMuZG9LZXlzKCdjJywgJzsnLCAnPEVzYz4nKTsKICBlcSgnMDEyMzQ5JywgY20uZ2V0VmFsdWUoKSk7CiAgaGVscGVycy5kb0tleXMoJ3UnKTsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJ2MnLCAnLCcpOwogIGVxKCc0NTY3ODknLCBjbS5nZXRWYWx1ZSgpKTsKfSwgeyB2YWx1ZTogJzAxMjM0NTY3ODknfSk7CnRlc3RWaW0oJ2Z5LDsnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDApOwogIGhlbHBlcnMuZG9LZXlzKCdmJywgJzQnKTsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJ3knLCAnOycsICdQJyk7CiAgZXEoJzAxMjM0MDEyMzQ1Njc4OScsIGNtLmdldFZhbHVlKCkpOwogIGhlbHBlcnMuZG9LZXlzKCd1Jyk7CiAgY20uc2V0Q3Vyc29yKDAsIDkpOwogIGhlbHBlcnMuZG9LZXlzKCd5JywgJywnLCAnUCcpOwogIGVxKCcwMTIzNDU2Nzg0NTY3ODknLCBjbS5nZXRWYWx1ZSgpKTsKfSwgeyB2YWx1ZTogJzAxMjM0NTY3ODknfSk7CnRlc3RWaW0oJ0Z5LDsnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDkpOwogIGhlbHBlcnMuZG9LZXlzKCdGJywgJzQnKTsKICBjbS5zZXRDdXJzb3IoMCwgOSk7CiAgaGVscGVycy5kb0tleXMoJ3knLCAnOycsICdwJyk7CiAgZXEoJzAxMjM0NTY3ODk0NTY3OCcsIGNtLmdldFZhbHVlKCkpOwogIGhlbHBlcnMuZG9LZXlzKCd1Jyk7CiAgY20uc2V0Q3Vyc29yKDAsIDApOwogIGhlbHBlcnMuZG9LZXlzKCd5JywgJywnLCAnUCcpOwogIGVxKCcwMTIzNDAxMjM0NTY3ODknLCBjbS5nZXRWYWx1ZSgpKTsKfSwgeyB2YWx1ZTogJzAxMjM0NTY3ODknfSk7CnRlc3RWaW0oJ3R5LDsnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDApOwogIGhlbHBlcnMuZG9LZXlzKCd0JywgJzQnKTsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJ3knLCAnOycsICdQJyk7CiAgZXEoJzAxMjMwMTIzNDU2Nzg5JywgY20uZ2V0VmFsdWUoKSk7CiAgaGVscGVycy5kb0tleXMoJ3UnKTsKICBjbS5zZXRDdXJzb3IoMCwgOSk7CiAgaGVscGVycy5kb0tleXMoJ3knLCAnLCcsICdwJyk7CiAgZXEoJzAxMjM0NTY3ODk1Njc4JywgY20uZ2V0VmFsdWUoKSk7Cn0sIHsgdmFsdWU6ICcwMTIzNDU2Nzg5J30pOwp0ZXN0VmltKCdUeSw7JywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCA5KTsKICBoZWxwZXJzLmRvS2V5cygnVCcsICc0Jyk7CiAgY20uc2V0Q3Vyc29yKDAsIDkpOwogIGhlbHBlcnMuZG9LZXlzKCd5JywgJzsnLCAncCcpOwogIGVxKCcwMTIzNDU2Nzg5NTY3OCcsIGNtLmdldFZhbHVlKCkpOwogIGhlbHBlcnMuZG9LZXlzKCd1Jyk7CiAgY20uc2V0Q3Vyc29yKDAsIDApOwogIGhlbHBlcnMuZG9LZXlzKCd5JywgJywnLCAnUCcpOwogIGVxKCcwMTIzMDEyMzQ1Njc4OScsIGNtLmdldFZhbHVlKCkpOwp9LCB7IHZhbHVlOiAnMDEyMzQ1Njc4OSd9KTsKdGVzdFZpbSgnSE1MJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIHZhciBsaW5lcyA9IDM1OwogIHZhciB0ZXh0SGVpZ2h0ID0gY20uZGVmYXVsdFRleHRIZWlnaHQoKTsKICBjbS5zZXRTaXplKDYwMCwgbGluZXMqdGV4dEhlaWdodCk7CiAgY20uc2V0Q3Vyc29yKDEyMCwgMCk7CiAgaGVscGVycy5kb0tleXMoJ0gnKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDg2LCAyKTsKICBoZWxwZXJzLmRvS2V5cygnTCcpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMTIwLCA0KTsKICBoZWxwZXJzLmRvS2V5cygnTScpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMTAzLDQpOwp9LCB7IHZhbHVlOiAoZnVuY3Rpb24oKXsKICB2YXIgbGluZXMgPSBuZXcgQXJyYXkoMTAwKTsKICB2YXIgdXBwZXIgPSAnICB4eFxuJzsKICB2YXIgbG93ZXIgPSAnICAgIHh4XG4nOwogIHVwcGVyID0gbGluZXMuam9pbih1cHBlcik7CiAgbG93ZXIgPSBsaW5lcy5qb2luKGxvd2VyKTsKICByZXR1cm4gdXBwZXIgKyBsb3dlcjsKfSkoKX0pOwoKdmFyIHpWYWxzID0gW107CmZvckVhY2goWyd6YicsJ3p6JywnenQnLCd6LScsJ3ouJywnejxDUj4nXSwgZnVuY3Rpb24oZSwgaWR4KXsKICB2YXIgbGluZU51bSA9IDI1MDsKICB2YXIgbGluZXMgPSAzNTsKICB0ZXN0VmltKGUsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICAgIHZhciBrMSA9IGVbMF07CiAgICB2YXIgazIgPSBlLnN1YnN0cmluZygxKTsKICAgIHZhciB0ZXh0SGVpZ2h0ID0gY20uZGVmYXVsdFRleHRIZWlnaHQoKTsKICAgIGNtLnNldFNpemUoNjAwLCBsaW5lcyp0ZXh0SGVpZ2h0KTsKICAgIGNtLnNldEN1cnNvcihsaW5lTnVtLCAwKTsKICAgIGhlbHBlcnMuZG9LZXlzKGsxLCBrMik7CiAgICB6VmFsc1tpZHhdID0gY20uZ2V0U2Nyb2xsSW5mbygpLnRvcDsKICB9LCB7IHZhbHVlOiAoZnVuY3Rpb24oKXsKICAgIHJldHVybiBuZXcgQXJyYXkoNTAwKS5qb2luKCdcbicpOwogIH0pKCl9KTsKfSk7CnRlc3RWaW0oJ3piX3RvX2JvdHRvbScsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpewogIHZhciBsaW5lTnVtID0gMjUwOwogIGNtLnNldFNpemUoNjAwLCAzNSpjbS5kZWZhdWx0VGV4dEhlaWdodCgpKTsKICBjbS5zZXRDdXJzb3IobGluZU51bSwgMCk7CiAgaGVscGVycy5kb0tleXMoJ3onLCAnYicpOwogIHZhciBzY3JvbGxJbmZvID0gY20uZ2V0U2Nyb2xsSW5mbygpOwogIGVxKHNjcm9sbEluZm8udG9wICsgc2Nyb2xsSW5mby5jbGllbnRIZWlnaHQsIGNtLmNoYXJDb29yZHMoUG9zKGxpbmVOdW0sIDApLCAnbG9jYWwnKS5ib3R0b20pOwp9LCB7IHZhbHVlOiAoZnVuY3Rpb24oKXsKICByZXR1cm4gbmV3IEFycmF5KDUwMCkuam9pbignXG4nKTsKfSkoKX0pOwp0ZXN0VmltKCd6dF90b190b3AnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKXsKICB2YXIgbGluZU51bSA9IDI1MDsKICBjbS5zZXRTaXplKDYwMCwgMzUqY20uZGVmYXVsdFRleHRIZWlnaHQoKSk7CiAgY20uc2V0Q3Vyc29yKGxpbmVOdW0sIDApOwogIGhlbHBlcnMuZG9LZXlzKCd6JywgJ3QnKTsKICBlcShjbS5nZXRTY3JvbGxJbmZvKCkudG9wLCBjbS5jaGFyQ29vcmRzKFBvcyhsaW5lTnVtLCAwKSwgJ2xvY2FsJykudG9wKTsKfSwgeyB2YWx1ZTogKGZ1bmN0aW9uKCl7CiAgcmV0dXJuIG5ldyBBcnJheSg1MDApLmpvaW4oJ1xuJyk7Cn0pKCl9KTsKdGVzdFZpbSgnemI8enonLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKXsKICBlcSh6VmFsc1swXTx6VmFsc1sxXSwgdHJ1ZSk7Cn0pOwp0ZXN0VmltKCd6ejx6dCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpewogIGVxKHpWYWxzWzFdPHpWYWxzWzJdLCB0cnVlKTsKfSk7CnRlc3RWaW0oJ3piPT16LScsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpewogIGVxKHpWYWxzWzBdLCB6VmFsc1szXSk7Cn0pOwp0ZXN0VmltKCd6ej09ei4nLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKXsKICBlcSh6VmFsc1sxXSwgelZhbHNbNF0pOwp9KTsKdGVzdFZpbSgnenQ9PXo8Q1I+JywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycyl7CiAgZXEoelZhbHNbMl0sIHpWYWxzWzVdKTsKfSk7Cgp2YXIgbW92ZVRpbGxDaGFyYWN0ZXJTYW5kYm94ID0KICAnVGhlIHF1aWNrIGJyb3duIGZveCBcbic7CnRlc3RWaW0oJ21vdmVUaWxsQ2hhcmFjdGVyJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycyl7CiAgY20uc2V0Q3Vyc29yKDAsIDApOwogIC8vIFNlYXJjaCBmb3IgdGhlICdxJy4KICBjbS5vcGVuRGlhbG9nID0gaGVscGVycy5mYWtlT3BlbkRpYWxvZygncScpOwogIGhlbHBlcnMuZG9LZXlzKCcvJyk7CiAgZXEoNCwgY20uZ2V0Q3Vyc29yKCkuY2gpOwogIC8vIEp1bXAgdG8ganVzdCBiZWZvcmUgdGhlIGZpcnN0IG8gaW4gdGhlIGxpc3QuCiAgaGVscGVycy5kb0tleXMoJ3QnKTsKICBoZWxwZXJzLmRvS2V5cygnbycpOwogIGVxKCdUaGUgcXVpY2sgYnJvd24gZm94IFxuJywgY20uZ2V0VmFsdWUoKSk7CiAgLy8gRGVsZXRlIHRoYXQgb25lIGNoYXJhY3Rlci4KICBoZWxwZXJzLmRvS2V5cygnZCcpOwogIGhlbHBlcnMuZG9LZXlzKCd0Jyk7CiAgaGVscGVycy5kb0tleXMoJ28nKTsKICBlcSgnVGhlIHF1aWNrIGJvd24gZm94IFxuJywgY20uZ2V0VmFsdWUoKSk7CiAgLy8gRGVsZXRlIGV2ZXJ5dGhpbmcgdW50aWwgdGhlIG5leHQgJ28nLgogIGhlbHBlcnMuZG9LZXlzKCcuJyk7CiAgZXEoJ1RoZSBxdWljayBib3ggXG4nLCBjbS5nZXRWYWx1ZSgpKTsKICAvLyBBbiB1bm1hdGNoZWQgY2hhcmFjdGVyIHNob3VsZCBoYXZlIG5vIGVmZmVjdC4KICBoZWxwZXJzLmRvS2V5cygnZCcpOwogIGhlbHBlcnMuZG9LZXlzKCd0Jyk7CiAgaGVscGVycy5kb0tleXMoJ3EnKTsKICBlcSgnVGhlIHF1aWNrIGJveCBcbicsIGNtLmdldFZhbHVlKCkpOwogIC8vIE1hdGNoZXMgc2hvdWxkIG9ubHkgYmUgcG9zc2libGUgb24gc2luZ2xlIGxpbmVzLgogIGhlbHBlcnMuZG9LZXlzKCdkJyk7CiAgaGVscGVycy5kb0tleXMoJ3QnKTsKICBoZWxwZXJzLmRvS2V5cygneicpOwogIGVxKCdUaGUgcXVpY2sgYm94IFxuJywgY20uZ2V0VmFsdWUoKSk7CiAgLy8gQWZ0ZXIgYWxsIHRoYXQsIHRoZSBzZWFyY2ggZm9yICdxJyBzaG91bGQgc3RpbGwgYmUgYWN0aXZlLCBzbyB0aGUgJ04nIGNvbW1hbmQKICAvLyBjYW4gcnVuIGl0IGFnYWluIGluIHJldmVyc2UuIFVzZSB0aGF0IHRvIGRlbGV0ZSBldmVyeXRoaW5nIGJhY2sgdG8gdGhlICdxJy4KICBoZWxwZXJzLmRvS2V5cygnZCcpOwogIGhlbHBlcnMuZG9LZXlzKCdOJyk7CiAgZXEoJ1RoZSBveCBcbicsIGNtLmdldFZhbHVlKCkpOwogIGVxKDQsIGNtLmdldEN1cnNvcigpLmNoKTsKfSwgeyB2YWx1ZTogbW92ZVRpbGxDaGFyYWN0ZXJTYW5kYm94fSk7CnRlc3RWaW0oJ3NlYXJjaEZvclBpcGUnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKXsKICBDb2RlTWlycm9yLlZpbS5zZXRPcHRpb24oJ3BjcmUnLCBmYWxzZSk7CiAgY20uc2V0Q3Vyc29yKDAsIDApOwogIC8vIFNlYXJjaCBmb3IgdGhlICd8Jy4KICBjbS5vcGVuRGlhbG9nID0gaGVscGVycy5mYWtlT3BlbkRpYWxvZygnfCcpOwogIGhlbHBlcnMuZG9LZXlzKCcvJyk7CiAgZXEoNCwgY20uZ2V0Q3Vyc29yKCkuY2gpOwp9LCB7IHZhbHVlOiAndGhpc3x0aGF0J30pOwoKCnZhciBzY3JvbGxNb3Rpb25TYW5kYm94ID0KICAnXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuXG5cblxuJzsKdGVzdFZpbSgnc2Nyb2xsTW90aW9uJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycyl7CiAgdmFyIHByZXZDdXJzb3IsIHByZXZTY3JvbGxJbmZvOwogIGNtLnNldEN1cnNvcigwLCAwKTsKICAvLyBjdHJsLXkgYXQgdGhlIHRvcCBvZiB0aGUgZmlsZSBzaG91bGQgaGF2ZSBubyBlZmZlY3QuCiAgaGVscGVycy5kb0tleXMoJzxDLXk+Jyk7CiAgZXEoMCwgY20uZ2V0Q3Vyc29yKCkubGluZSk7CiAgcHJldlNjcm9sbEluZm8gPSBjbS5nZXRTY3JvbGxJbmZvKCk7CiAgaGVscGVycy5kb0tleXMoJzxDLWU+Jyk7CiAgZXEoMSwgY20uZ2V0Q3Vyc29yKCkubGluZSk7CiAgaXMocHJldlNjcm9sbEluZm8udG9wIDwgY20uZ2V0U2Nyb2xsSW5mbygpLnRvcCk7CiAgLy8gSnVtcCB0byB0aGUgZW5kIG9mIHRoZSBzYW5kYm94LgogIGNtLnNldEN1cnNvcigxMDAwLCAwKTsKICBwcmV2Q3Vyc29yID0gY20uZ2V0Q3Vyc29yKCk7CiAgLy8gY3RybC1lIGF0IHRoZSBib3R0b20gb2YgdGhlIGZpbGUgc2hvdWxkIGhhdmUgbm8gZWZmZWN0LgogIGhlbHBlcnMuZG9LZXlzKCc8Qy1lPicpOwogIGVxKHByZXZDdXJzb3IubGluZSwgY20uZ2V0Q3Vyc29yKCkubGluZSk7CiAgcHJldlNjcm9sbEluZm8gPSBjbS5nZXRTY3JvbGxJbmZvKCk7CiAgaGVscGVycy5kb0tleXMoJzxDLXk+Jyk7CiAgZXEocHJldkN1cnNvci5saW5lIC0gMSwgY20uZ2V0Q3Vyc29yKCkubGluZSwgIlkiKTsKICBpcyhwcmV2U2Nyb2xsSW5mby50b3AgPiBjbS5nZXRTY3JvbGxJbmZvKCkudG9wKTsKfSwgeyB2YWx1ZTogc2Nyb2xsTW90aW9uU2FuZGJveH0pOwoKdmFyIHNxdWFyZUJyYWNrZXRNb3Rpb25TYW5kYm94ID0gJycrCiAgJyh7XG4nKy8vMAogICcgICh7XG4nKy8vMTEKICAnICAvKmNvbW1lbnQge1xuJysvLzIKICAnICAgICAgICAgICAgKi8oXG4nKy8vMwogICcjZWxzZSAgICAgICAgICAgICAgICBcbicrLy80CiAgJyAgLyogICAgICAgKVxuJysvLzUKICAnI2lmICAgICAgICB9XG4nKy8vNgogICcgICl9Ki9cbicrLy83CiAgJyl9XG4nKy8vOAogICd7fVxuJysvLzkKICAnI2Vsc2Uge3tcbicrLy8xMAogICd7fVxuJysvLzExCiAgJ31cbicrLy8xMgogICd7XG4nKy8vMTMKICAnI2VuZGlmXG4nKy8vMTQKICAnfVxuJysvLzE1CiAgJ31cbicrLy8xNgogICcjZWxzZSc7Ly8xNwp0ZXN0VmltKCdbWywgXV0nLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDApOwogIGhlbHBlcnMuZG9LZXlzKCddJywgJ10nKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDksMCk7CiAgaGVscGVycy5kb0tleXMoJzInLCAnXScsICddJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgxMywwKTsKICBoZWxwZXJzLmRvS2V5cygnXScsICddJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgxNywwKTsKICBoZWxwZXJzLmRvS2V5cygnWycsICdbJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgxMywwKTsKICBoZWxwZXJzLmRvS2V5cygnMicsICdbJywgJ1snKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDksMCk7CiAgaGVscGVycy5kb0tleXMoJ1snLCAnWycpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwwKTsKfSwgeyB2YWx1ZTogc3F1YXJlQnJhY2tldE1vdGlvblNhbmRib3h9KTsKdGVzdFZpbSgnW10sIF1bJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnXScsICdbJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgxMiwwKTsKICBoZWxwZXJzLmRvS2V5cygnMicsICddJywgJ1snKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDE2LDApOwogIGhlbHBlcnMuZG9LZXlzKCddJywgJ1snKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDE3LDApOwogIGhlbHBlcnMuZG9LZXlzKCdbJywgJ10nKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDE2LDApOwogIGhlbHBlcnMuZG9LZXlzKCcyJywgJ1snLCAnXScpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMTIsMCk7CiAgaGVscGVycy5kb0tleXMoJ1snLCAnXScpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwwKTsKfSwgeyB2YWx1ZTogc3F1YXJlQnJhY2tldE1vdGlvblNhbmRib3h9KTsKdGVzdFZpbSgnW3ssIF19JywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcig0LCAxMCk7CiAgaGVscGVycy5kb0tleXMoJ1snLCAneycpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMiwxMik7CiAgaGVscGVycy5kb0tleXMoJzInLCAnWycsICd7Jyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLDEpOwogIGNtLnNldEN1cnNvcig0LCAxMCk7CiAgaGVscGVycy5kb0tleXMoJ10nLCAnfScpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoNiwxMSk7CiAgaGVscGVycy5kb0tleXMoJzInLCAnXScsICd9Jyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCg4LDEpOwogIGNtLnNldEN1cnNvcigwLDEpOwogIGhlbHBlcnMuZG9LZXlzKCddJywgJ30nKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDgsMSk7CiAgaGVscGVycy5kb0tleXMoJ1snLCAneycpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMCwxKTsKfSwgeyB2YWx1ZTogc3F1YXJlQnJhY2tldE1vdGlvblNhbmRib3h9KTsKdGVzdFZpbSgnWygsIF0pJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcig0LCAxMCk7CiAgaGVscGVycy5kb0tleXMoJ1snLCAnKCcpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMywxNCk7CiAgaGVscGVycy5kb0tleXMoJzInLCAnWycsICcoJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLDApOwogIGNtLnNldEN1cnNvcig0LCAxMCk7CiAgaGVscGVycy5kb0tleXMoJ10nLCAnKScpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoNSwxMSk7CiAgaGVscGVycy5kb0tleXMoJzInLCAnXScsICcpJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCg4LDApOwogIGhlbHBlcnMuZG9LZXlzKCdbJywgJygnKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsMCk7CiAgaGVscGVycy5kb0tleXMoJ10nLCAnKScpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoOCwwKTsKfSwgeyB2YWx1ZTogc3F1YXJlQnJhY2tldE1vdGlvblNhbmRib3h9KTsKdGVzdFZpbSgnWyosIF0qLCBbLywgXS8nLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgZm9yRWFjaChbJyonLCAnLyddLCBmdW5jdGlvbihrZXkpewogICAgY20uc2V0Q3Vyc29yKDcsIDApOwogICAgaGVscGVycy5kb0tleXMoJzInLCAnWycsIGtleSk7CiAgICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDIsMik7CiAgICBoZWxwZXJzLmRvS2V5cygnMicsICddJywga2V5KTsKICAgIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoNyw1KTsKICB9KTsKfSwgeyB2YWx1ZTogc3F1YXJlQnJhY2tldE1vdGlvblNhbmRib3h9KTsKdGVzdFZpbSgnWyMsIF0jJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigxMCwgMyk7CiAgaGVscGVycy5kb0tleXMoJzInLCAnWycsICcjJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCg0LDApOwogIGhlbHBlcnMuZG9LZXlzKCc1JywgJ10nLCAnIycpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMTcsMCk7CiAgY20uc2V0Q3Vyc29yKDEwLCAzKTsKICBoZWxwZXJzLmRvS2V5cygnXScsICcjJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgxNCwwKTsKfSwgeyB2YWx1ZTogc3F1YXJlQnJhY2tldE1vdGlvblNhbmRib3h9KTsKdGVzdFZpbSgnW20sIF1tLCBbTSwgXU0nLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDExLCAwKTsKICBoZWxwZXJzLmRvS2V5cygnWycsICdtJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgxMCw3KTsKICBoZWxwZXJzLmRvS2V5cygnNCcsICdbJywgJ20nKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDEsMyk7CiAgaGVscGVycy5kb0tleXMoJzUnLCAnXScsICdtJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgxMSwwKTsKICBoZWxwZXJzLmRvS2V5cygnWycsICdNJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCg5LDEpOwogIGhlbHBlcnMuZG9LZXlzKCczJywgJ10nLCAnTScpOwogIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoMTUsMCk7CiAgaGVscGVycy5kb0tleXMoJzUnLCAnWycsICdNJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCg3LDMpOwp9LCB7IHZhbHVlOiBzcXVhcmVCcmFja2V0TW90aW9uU2FuZGJveH0pOwoKLy8gRXggbW9kZSB0ZXN0cwp0ZXN0VmltKCdleF9nb190b19saW5lJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAwKTsKICBoZWxwZXJzLmRvRXgoJzQnKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDMsIDApOwp9LCB7IHZhbHVlOiAnYVxuYlxuY1xuZFxuZVxuJ30pOwp0ZXN0VmltKCdleF93cml0ZScsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICB2YXIgdG1wID0gQ29kZU1pcnJvci5jb21tYW5kcy5zYXZlOwogIHZhciB3cml0dGVuOwogIHZhciBhY3R1YWxDbTsKICBDb2RlTWlycm9yLmNvbW1hbmRzLnNhdmUgPSBmdW5jdGlvbihjbSkgewogICAgd3JpdHRlbiA9IHRydWU7CiAgICBhY3R1YWxDbSA9IGNtOwogIH07CiAgLy8gVGVzdCB0aGF0IHcsIHdyLCB3cmkgLi4uIHdyaXRlIGFsbCB0cmlnZ2VyIDp3cml0ZS4KICB2YXIgY29tbWFuZCA9ICd3cml0ZSc7CiAgZm9yICh2YXIgaSA9IDE7IGkgPCBjb21tYW5kLmxlbmd0aDsgaSsrKSB7CiAgICB3cml0dGVuID0gZmFsc2U7CiAgICBhY3R1YWxDbSA9IG51bGw7CiAgICBoZWxwZXJzLmRvRXgoY29tbWFuZC5zdWJzdHJpbmcoMCwgaSkpOwogICAgZXEod3JpdHRlbiwgdHJ1ZSk7CiAgICBlcShhY3R1YWxDbSwgY20pOwogIH0KICBDb2RlTWlycm9yLmNvbW1hbmRzLnNhdmUgPSB0bXA7Cn0pOwp0ZXN0VmltKCdleF9zb3J0JywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGhlbHBlcnMuZG9FeCgnc29ydCcpOwogIGVxKCdaXG5hXG5iXG5jXG5kJywgY20uZ2V0VmFsdWUoKSk7Cn0sIHsgdmFsdWU6ICdiXG5aXG5kXG5jXG5hJ30pOwp0ZXN0VmltKCdleF9zb3J0X3JldmVyc2UnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgaGVscGVycy5kb0V4KCdzb3J0IScpOwogIGVxKCdkXG5jXG5iXG5hJywgY20uZ2V0VmFsdWUoKSk7Cn0sIHsgdmFsdWU6ICdiXG5kXG5jXG5hJ30pOwp0ZXN0VmltKCdleF9zb3J0X3JhbmdlJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGhlbHBlcnMuZG9FeCgnMiwzc29ydCcpOwogIGVxKCdiXG5jXG5kXG5hJywgY20uZ2V0VmFsdWUoKSk7Cn0sIHsgdmFsdWU6ICdiXG5kXG5jXG5hJ30pOwp0ZXN0VmltKCdleF9zb3J0X29uZWxpbmUnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgaGVscGVycy5kb0V4KCcyc29ydCcpOwogIC8vIEV4cGVjdCBubyBjaGFuZ2UuCiAgZXEoJ2JcbmRcbmNcbmEnLCBjbS5nZXRWYWx1ZSgpKTsKfSwgeyB2YWx1ZTogJ2JcbmRcbmNcbmEnfSk7CnRlc3RWaW0oJ2V4X3NvcnRfaWdub3JlQ2FzZScsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBoZWxwZXJzLmRvRXgoJ3NvcnQgaScpOwogIGVxKCdhXG5iXG5jXG5kXG5aJywgY20uZ2V0VmFsdWUoKSk7Cn0sIHsgdmFsdWU6ICdiXG5aXG5kXG5jXG5hJ30pOwp0ZXN0VmltKCdleF9zb3J0X3VuaXF1ZScsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBoZWxwZXJzLmRvRXgoJ3NvcnQgdScpOwogIGVxKCdaXG5hXG5iXG5jXG5kJywgY20uZ2V0VmFsdWUoKSk7Cn0sIHsgdmFsdWU6ICdiXG5aXG5hXG5hXG5kXG5hXG5jXG5hJ30pOwp0ZXN0VmltKCdleF9zb3J0X2RlY2ltYWwnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgaGVscGVycy5kb0V4KCdzb3J0IGQnKTsKICBlcSgnZDNcbiBzNVxuNlxuLjknLCBjbS5nZXRWYWx1ZSgpKTsKfSwgeyB2YWx1ZTogJzZcbmQzXG4gczVcbi45J30pOwp0ZXN0VmltKCdleF9zb3J0X2RlY2ltYWxfbmVnYXRpdmUnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgaGVscGVycy5kb0V4KCdzb3J0IGQnKTsKICBlcSgnei05XG5kM1xuIHM1XG42XG4uOScsIGNtLmdldFZhbHVlKCkpOwp9LCB7IHZhbHVlOiAnNlxuZDNcbiBzNVxuLjlcbnotOSd9KTsKdGVzdFZpbSgnZXhfc29ydF9kZWNpbWFsX3JldmVyc2UnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgaGVscGVycy5kb0V4KCdzb3J0ISBkJyk7CiAgZXEoJy45XG42XG4gczVcbmQzJywgY20uZ2V0VmFsdWUoKSk7Cn0sIHsgdmFsdWU6ICc2XG5kM1xuIHM1XG4uOSd9KTsKdGVzdFZpbSgnZXhfc29ydF9oZXgnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgaGVscGVycy5kb0V4KCdzb3J0IHgnKTsKICBlcSgnIHM1XG42XG4uOVxuJjB4QlxuZDMnLCBjbS5nZXRWYWx1ZSgpKTsKfSwgeyB2YWx1ZTogJzZcbmQzXG4gczVcbiYweEJcbi45J30pOwp0ZXN0VmltKCdleF9zb3J0X29jdGFsJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGhlbHBlcnMuZG9FeCgnc29ydCBvJyk7CiAgZXEoJy44XG4uOVxuZDNcbiBzNVxuNicsIGNtLmdldFZhbHVlKCkpOwp9LCB7IHZhbHVlOiAnNlxuZDNcbiBzNVxuLjlcbi44J30pOwp0ZXN0VmltKCdleF9zb3J0X2RlY2ltYWxfbWl4ZWQnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgaGVscGVycy5kb0V4KCdzb3J0IGQnKTsKICBlcSgneVxuelxuYzFcbmIyXG5hMycsIGNtLmdldFZhbHVlKCkpOwp9LCB7IHZhbHVlOiAnYTNcbnpcbmMxXG55XG5iMid9KTsKdGVzdFZpbSgnZXhfc29ydF9kZWNpbWFsX21peGVkX3JldmVyc2UnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgaGVscGVycy5kb0V4KCdzb3J0ISBkJyk7CiAgZXEoJ2EzXG5iMlxuYzFcbnpcbnknLCBjbS5nZXRWYWx1ZSgpKTsKfSwgeyB2YWx1ZTogJ2EzXG56XG5jMVxueVxuYjInfSk7CnRlc3RWaW0oJ2V4X3NvcnRfcGF0dGVybnNfbm90X3N1cHBvcnRlZCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICB2YXIgbm90aWZpZWQgPSBmYWxzZTsKICBjbS5vcGVuTm90aWZpY2F0aW9uID0gaGVscGVycy5mYWtlT3Blbk5vdGlmaWNhdGlvbihmdW5jdGlvbih0ZXh0KSB7CiAgICBub3RpZmllZCA9IC9wYXR0ZXJucyBub3Qgc3VwcG9ydGVkLy50ZXN0KHRleHQpOwogIH0pOwogIGhlbHBlcnMuZG9FeCgnc29ydCAvYWJjLycpOwogIGlzKG5vdGlmaWVkLCAnTm8gbm90aWZpY2F0aW9uLicpOwp9KTsKLy8gdGVzdCBmb3IgOmdsb2JhbCBjb21tYW5kCnRlc3RWaW0oJ2V4X2dsb2JhbCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0V4KCdnL29uZS9zLy90d28nKTsKICBlcSgndHdvIHR3b1xuIHR3byB0d29cbiB0d28gdHdvJywgY20uZ2V0VmFsdWUoKSk7CiAgaGVscGVycy5kb0V4KCcxLDJnL3R3by9zLy9vbmUnKTsKICBlcSgnb25lIG9uZVxuIG9uZSBvbmVcbiB0d28gdHdvJywgY20uZ2V0VmFsdWUoKSk7Cn0sIHt2YWx1ZTogJ29uZSBvbmVcbiBvbmUgb25lXG4gb25lIG9uZSd9KTsKdGVzdFZpbSgnZXhfZ2xvYmFsX2NvbmZpcm0nLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDAsIDApOwogIHZhciBvbktleURvd247CiAgdmFyIG9wZW5EaWFsb2dTYXZlID0gY20ub3BlbkRpYWxvZzsKICB2YXIgS0VZQ09ERVMgPSB7CiAgICBhOiA2NSwKICAgIG46IDc4LAogICAgcTogODEsCiAgICB5OiA4OQogIH07CiAgLy8gSW50ZXJjZXB0IHRoZSBleCBjb21tYW5kLCAnZ2xvYmFsJwogIGNtLm9wZW5EaWFsb2cgPSBmdW5jdGlvbih0ZW1wbGF0ZSwgY2FsbGJhY2ssIG9wdGlvbnMpIHsKICAgIC8vIEludGVyY2VwdCB0aGUgcHJvbXB0IGZvciB0aGUgZW1iZWRkZWQgZXggY29tbWFuZCwgJ3N1YnN0aXR1dGUnCiAgICBjbS5vcGVuRGlhbG9nID0gZnVuY3Rpb24odGVtcGxhdGUsIGNhbGxiYWNrLCBvcHRpb25zKSB7CiAgICAgIG9uS2V5RG93biA9IG9wdGlvbnMub25LZXlEb3duOwogICAgfTsKICAgIGNhbGxiYWNrKCdnL29uZS9zLy90d28vZ2MnKTsKICB9OwogIGhlbHBlcnMuZG9LZXlzKCc6Jyk7CiAgdmFyIGNsb3NlID0gZnVuY3Rpb24oKSB7fTsKICBvbktleURvd24oe2tleUNvZGU6IEtFWUNPREVTLm59LCAnJywgY2xvc2UpOwogIG9uS2V5RG93bih7a2V5Q29kZTogS0VZQ09ERVMueX0sICcnLCBjbG9zZSk7CiAgb25LZXlEb3duKHtrZXlDb2RlOiBLRVlDT0RFUy5hfSwgJycsIGNsb3NlKTsKICBvbktleURvd24oe2tleUNvZGU6IEtFWUNPREVTLnF9LCAnJywgY2xvc2UpOwogIG9uS2V5RG93bih7a2V5Q29kZTogS0VZQ09ERVMueX0sICcnLCBjbG9zZSk7CiAgZXEoJ29uZSB0d29cbiB0d28gdHdvXG4gb25lIG9uZVxuIHR3byBvbmVcbiBvbmUgb25lJywgY20uZ2V0VmFsdWUoKSk7Cn0sIHt2YWx1ZTogJ29uZSBvbmVcbiBvbmUgb25lXG4gb25lIG9uZVxuIG9uZSBvbmVcbiBvbmUgb25lJ30pOwovLyBCYXNpYyBzdWJzdGl0dXRlIHRlc3RzLgp0ZXN0VmltKCdleF9zdWJzdGl0dXRlX3NhbWVfbGluZScsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMSwgMCk7CiAgaGVscGVycy5kb0V4KCdzL29uZS90d28vZycpOwogIGVxKCdvbmUgb25lXG4gdHdvIHR3bycsIGNtLmdldFZhbHVlKCkpOwp9LCB7IHZhbHVlOiAnb25lIG9uZVxuIG9uZSBvbmUnfSk7CnRlc3RWaW0oJ2V4X3N1YnN0aXR1dGVfZnVsbF9maWxlJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigxLCAwKTsKICBoZWxwZXJzLmRvRXgoJyVzL29uZS90d28vZycpOwogIGVxKCd0d28gdHdvXG4gdHdvIHR3bycsIGNtLmdldFZhbHVlKCkpOwp9LCB7IHZhbHVlOiAnb25lIG9uZVxuIG9uZSBvbmUnfSk7CnRlc3RWaW0oJ2V4X3N1YnN0aXR1dGVfaW5wdXRfcmFuZ2UnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgY20uc2V0Q3Vyc29yKDEsIDApOwogIGhlbHBlcnMuZG9FeCgnMSwzcy9cXGQvMC9nJyk7CiAgZXEoJzBcbjBcbjBcbjQnLCBjbS5nZXRWYWx1ZSgpKTsKfSwgeyB2YWx1ZTogJzFcbjJcbjNcbjQnIH0pOwp0ZXN0VmltKCdleF9zdWJzdGl0dXRlX3Zpc3VhbF9yYW5nZScsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMSwgMCk7CiAgLy8gU2V0IGxhc3QgdmlzdWFsIG1vZGUgc2VsZWN0aW9uIG1hcmtzICc8IGFuZCAnPiBhdCBsaW5lcyAyIGFuZCA0CiAgaGVscGVycy5kb0tleXMoJ1YnLCAnMicsICdqJywgJ3YnKTsKICBoZWxwZXJzLmRvRXgoJ1wnPCxcJz5zL1xcZC8wL2cnKTsKICBlcSgnMVxuMFxuMFxuMFxuNScsIGNtLmdldFZhbHVlKCkpOwp9LCB7IHZhbHVlOiAnMVxuMlxuM1xuNFxuNScgfSk7CnRlc3RWaW0oJ2V4X3N1YnN0aXR1dGVfZW1wdHlfcXVlcnknLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgLy8gSWYgdGhlIHF1ZXJ5IGlzIGVtcHR5LCB1c2UgbGFzdCBxdWVyeS4KICBjbS5zZXRDdXJzb3IoMSwgMCk7CiAgY20ub3BlbkRpYWxvZyA9IGhlbHBlcnMuZmFrZU9wZW5EaWFsb2coJzEnKTsKICBoZWxwZXJzLmRvS2V5cygnLycpOwogIGhlbHBlcnMuZG9FeCgncy8vYi9nJyk7CiAgZXEoJ2FiYiBhYjIgYWIzJywgY20uZ2V0VmFsdWUoKSk7Cn0sIHsgdmFsdWU6ICdhMTEgYTEyIGExMycgfSk7CnRlc3RWaW0oJ2V4X3N1YnN0aXR1dGVfamF2YXNjcmlwdCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBDb2RlTWlycm9yLlZpbS5zZXRPcHRpb24oJ3BjcmUnLCBmYWxzZSk7CiAgY20uc2V0Q3Vyc29yKDEsIDApOwogIC8vIFRocm93IGFsbCB0aGUgdGhpbmdzIHRoYXQgamF2YXNjcmlwdCBsaWtlcyB0byB0cmVhdCBhcyBzcGVjaWFsIHZhbHVlcwogIC8vIGludG8gdGhlIHJlcGxhY2UgcGFydC4gQWxsIHNob3VsZCBiZSBsaXRlcmFsICh0aGlzIGlzIFZJTSkuCiAgaGVscGVycy5kb0V4KCdzL1xcKFxcZCtcXCkvJCQgJFwnICRgICQmIFxcMS9nJykKICBlcSgnYSAkJCAkXCcgJGAgJCYgMCBiJywgY20uZ2V0VmFsdWUoKSk7Cn0sIHsgdmFsdWU6ICdhIDAgYicgfSk7CnRlc3RWaW0oJ2V4X3N1YnN0aXR1dGVfZW1wdHlfYXJndW1lbnRzJywgZnVuY3Rpb24oY20sdmltLGhlbHBlcnMpIHsKICBjbS5zZXRDdXJzb3IoMCwgMCk7CiAgaGVscGVycy5kb0V4KCdzL2EvYi9nJyk7CiAgY20uc2V0Q3Vyc29yKDEsIDApOwogIGhlbHBlcnMuZG9FeCgncycpOwogIGVxKCdiIGJcbmIgYScsIGNtLmdldFZhbHVlKCkpOwp9LCB7dmFsdWU6ICdhIGFcbmEgYSd9KTsKCi8vIE1vcmUgY29tcGxleCBzdWJzdGl0dXRlIHRlc3RzIHRoYXQgdGVzdCBib3RoIHBjcmUgYW5kIG5vcGNyZSBvcHRpb25zLgpmdW5jdGlvbiB0ZXN0U3Vic3RpdHV0ZShuYW1lLCBvcHRpb25zKSB7CiAgdGVzdFZpbShuYW1lICsgJ19wY3JlJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogICAgY20uc2V0Q3Vyc29yKDEsIDApOwogICAgQ29kZU1pcnJvci5WaW0uc2V0T3B0aW9uKCdwY3JlJywgdHJ1ZSk7CiAgICBoZWxwZXJzLmRvRXgob3B0aW9ucy5leHByKTsKICAgIGVxKG9wdGlvbnMuZXhwZWN0ZWRWYWx1ZSwgY20uZ2V0VmFsdWUoKSk7CiAgfSwgb3B0aW9ucyk7CiAgLy8gSWYgbm8gbm9QY3JlRXhwciBpcyBkZWZpbmVkLCBhc3N1bWUgdGhhdCBpdCdzIHRoZSBzYW1lIGFzIHRoZSBleHByLgogIHZhciBub1BjcmVFeHByID0gb3B0aW9ucy5ub1BjcmVFeHByID8gb3B0aW9ucy5ub1BjcmVFeHByIDogb3B0aW9ucy5leHByOwogIHRlc3RWaW0obmFtZSArICdfbm9wY3JlJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogICAgY20uc2V0Q3Vyc29yKDEsIDApOwogICAgQ29kZU1pcnJvci5WaW0uc2V0T3B0aW9uKCdwY3JlJywgZmFsc2UpOwogICAgaGVscGVycy5kb0V4KG5vUGNyZUV4cHIpOwogICAgZXEob3B0aW9ucy5leHBlY3RlZFZhbHVlLCBjbS5nZXRWYWx1ZSgpKTsKICB9LCBvcHRpb25zKTsKfQp0ZXN0U3Vic3RpdHV0ZSgnZXhfc3Vic3RpdHV0ZV9jYXB0dXJlJywgewogIHZhbHVlOiAnYTExIGExMiBhMTMnLAogIGV4cGVjdGVkVmFsdWU6ICdhMTExMSBhMTIxMiBhMTMxMycsCiAgLy8gJG4gaXMgYSBiYWNrcmVmZXJlbmNlCiAgZXhwcjogJ3MvKFxcZCspLyQxJDEvZycsCiAgLy8gXG4gaXMgYSBiYWNrcmVmZXJlbmNlLgogIG5vUGNyZUV4cHI6ICdzL1xcKFxcZCtcXCkvXFwxXFwxL2cnfSk7CnRlc3RTdWJzdGl0dXRlKCdleF9zdWJzdGl0dXRlX2NhcHR1cmUyJywgewogIHZhbHVlOiAnYSAwIGInLAogIGV4cGVjdGVkVmFsdWU6ICdhICQwMCBiJywKICBleHByOiAncy8oXFxkKykvJCQkMSQxL2cnLAogIG5vUGNyZUV4cHI6ICdzL1xcKFxcZCtcXCkvJFxcMVxcMS9nJ30pOwp0ZXN0U3Vic3RpdHV0ZSgnZXhfc3Vic3RpdHV0ZV9ub2NhcHR1cmUnLCB7CiAgdmFsdWU6ICdhMTEgYTEyIGExMycsCiAgZXhwZWN0ZWRWYWx1ZTogJ2EkMSQxIGEkMSQxIGEkMSQxJywKICBleHByOiAncy8oXFxkKykvJCQxJCQxL2cnLAogIG5vUGNyZUV4cHI6ICdzL1xcKFxcZCtcXCkvJDEkMS9nJ30pOwp0ZXN0U3Vic3RpdHV0ZSgnZXhfc3Vic3RpdHV0ZV9ub2NhcHR1cmUyJywgewogIHZhbHVlOiAnYSAwIGInLAogIGV4cGVjdGVkVmFsdWU6ICdhICQxMCBiJywKICBleHByOiAncy8oXFxkKykvJCQxJDEvZycsCiAgbm9QY3JlRXhwcjogJ3MvXFwoXFxkK1xcKS9cXCQxXFwxL2cnfSk7CnRlc3RTdWJzdGl0dXRlKCdleF9zdWJzdGl0dXRlX25vY2FwdHVyZScsIHsKICB2YWx1ZTogJ2EgYiBjJywKICBleHBlY3RlZFZhbHVlOiAnYSAkIGMnLAogIGV4cHI6ICdzL2IvJCQvJywKICBub1BjcmVFeHByOiAncy9iLyQvJ30pOwp0ZXN0U3Vic3RpdHV0ZSgnZXhfc3Vic3RpdHV0ZV9zbGFzaF9yZWdleCcsIHsKICB2YWx1ZTogJ29uZS90d28gXG4gdGhyZWUvZm91cicsCiAgZXhwZWN0ZWRWYWx1ZTogJ29uZXx0d28gXG4gdGhyZWV8Zm91cicsCiAgZXhwcjogJyVzL1xcLy98J30pOwp0ZXN0U3Vic3RpdHV0ZSgnZXhfc3Vic3RpdHV0ZV9waXBlX3JlZ2V4JywgewogIHZhbHVlOiAnb25lfHR3byBcbiB0aHJlZXxmb3VyJywKICBleHBlY3RlZFZhbHVlOiAnb25lLHR3byBcbiB0aHJlZSxmb3VyJywKICBleHByOiAnJXMvXFx8LywvJywKICBub1BjcmVFeHByOiAnJXMvfC8sLyd9KTsKdGVzdFN1YnN0aXR1dGUoJ2V4X3N1YnN0aXR1dGVfb3JfcmVnZXgnLCB7CiAgdmFsdWU6ICdvbmV8dHdvIFxuIHRocmVlfGZvdXInLAogIGV4cGVjdGVkVmFsdWU6ICdhbmF8dHdhIFxuIHRocmFhfGZhYXInLAogIGV4cHI6ICclcy9vfGV8dS9hL2cnLAogIG5vUGNyZUV4cHI6ICclcy9vXFx8ZVxcfHUvYS9nJ30pOwp0ZXN0U3Vic3RpdHV0ZSgnZXhfc3Vic3RpdHV0ZV9vcl93b3JkX3JlZ2V4JywgewogIHZhbHVlOiAnb25lfHR3byBcbiB0aHJlZXxmb3VyJywKICBleHBlY3RlZFZhbHVlOiAnZml2ZXxmaXZlIFxuIHRocmVlfGZvdXInLAogIGV4cHI6ICclcy8ob25lfHR3bykvZml2ZS9nJywKICBub1BjcmVFeHByOiAnJXMvXFwob25lXFx8dHdvXFwpL2ZpdmUvZyd9KTsKdGVzdFN1YnN0aXR1dGUoJ2V4X3N1YnN0aXR1dGVfYmFja3NsYXNoc2xhc2hfcmVnZXgnLCB7CiAgdmFsdWU6ICdvbmVcXHR3byBcbiB0aHJlZVxcZm91cicsCiAgZXhwZWN0ZWRWYWx1ZTogJ29uZSx0d28gXG4gdGhyZWUsZm91cicsCiAgZXhwcjogJyVzL1xcXFwvLCd9KTsKdGVzdFN1YnN0aXR1dGUoJ2V4X3N1YnN0aXR1dGVfc2xhc2hfcmVwbGFjZW1lbnQnLCB7CiAgdmFsdWU6ICdvbmUsdHdvIFxuIHRocmVlLGZvdXInLAogIGV4cGVjdGVkVmFsdWU6ICdvbmUvdHdvIFxuIHRocmVlL2ZvdXInLAogIGV4cHI6ICclcy8sL1xcLyd9KTsKdGVzdFN1YnN0aXR1dGUoJ2V4X3N1YnN0aXR1dGVfYmFja3NsYXNoX3JlcGxhY2VtZW50JywgewogIHZhbHVlOiAnb25lLHR3byBcbiB0aHJlZSxmb3VyJywKICBleHBlY3RlZFZhbHVlOiAnb25lXFx0d28gXG4gdGhyZWVcXGZvdXInLAogIGV4cHI6ICclcy8sL1xcXFwvZyd9KTsKdGVzdFN1YnN0aXR1dGUoJ2V4X3N1YnN0aXR1dGVfbXVsdGliYWNrc2xhc2hfcmVwbGFjZW1lbnQnLCB7CiAgdmFsdWU6ICdvbmUsdHdvIFxuIHRocmVlLGZvdXInLAogIGV4cGVjdGVkVmFsdWU6ICdvbmVcXFxcXFxcXHR3byBcbiB0aHJlZVxcXFxcXFxcZm91cicsIC8vIDIqOCBiYWNrc2xhc2hlcy4KICBleHByOiAnJXMvLC9cXFxcXFxcXFxcXFxcXFxcL2cnfSk7IC8vIDE2IGJhY2tzbGFzaGVzLgp0ZXN0U3Vic3RpdHV0ZSgnZXhfc3Vic3RpdHV0ZV9uZXdsaW5lX3JlcGxhY2VtZW50JywgewogIHZhbHVlOiAnb25lLHR3byBcbiB0aHJlZSxmb3VyJywKICBleHBlY3RlZFZhbHVlOiAnb25lXG50d28gXG4gdGhyZWVcbmZvdXInLAogIGV4cHI6ICclcy8sL1xcbi9nJ30pOwp0ZXN0U3Vic3RpdHV0ZSgnZXhfc3Vic3RpdHV0ZV9icmFjZXNfd29yZCcsIHsKICB2YWx1ZTogJ2FiYWJhYiBhYmIgYWJ7Mn0nLAogIGV4cGVjdGVkVmFsdWU6ICdhYiBhYmIgYWJ7Mn0nLAogIGV4cHI6ICclcy8oYWIpezJ9Ly9nJywKICBub1BjcmVFeHByOiAnJXMvXFwoYWJcXClcXHsyXFx9Ly9nJ30pOwp0ZXN0U3Vic3RpdHV0ZSgnZXhfc3Vic3RpdHV0ZV9icmFjZXNfcmFuZ2UnLCB7CiAgdmFsdWU6ICdhIGFhIGFhYSBhYWFhJywKICBleHBlY3RlZFZhbHVlOiAnYSAgIGEnLAogIGV4cHI6ICclcy9hezIsM30vL2cnLAogIG5vUGNyZUV4cHI6ICclcy9hXFx7MiwzXFx9Ly9nJ30pOwp0ZXN0U3Vic3RpdHV0ZSgnZXhfc3Vic3RpdHV0ZV9icmFjZXNfbGl0ZXJhbCcsIHsKICB2YWx1ZTogJ2FiYWJhYiBhYmIgYWJ7Mn0nLAogIGV4cGVjdGVkVmFsdWU6ICdhYmFiYWIgYWJiICcsCiAgZXhwcjogJyVzL2FiXFx7MlxcfS8vZycsCiAgbm9QY3JlRXhwcjogJyVzL2FiezJ9Ly9nJ30pOwp0ZXN0U3Vic3RpdHV0ZSgnZXhfc3Vic3RpdHV0ZV9icmFjZXNfY2hhcicsIHsKICB2YWx1ZTogJ2FiYWJhYiBhYmIgYWJ7Mn0nLAogIGV4cGVjdGVkVmFsdWU6ICdhYmFiYWIgIGFiezJ9JywKICBleHByOiAnJXMvYWJ7Mn0vL2cnLAogIG5vUGNyZUV4cHI6ICclcy9hYlxcezJcXH0vL2cnfSk7CnRlc3RTdWJzdGl0dXRlKCdleF9zdWJzdGl0dXRlX2JyYWNlc19ub19lc2NhcGUnLCB7CiAgdmFsdWU6ICdhYmFiYWIgYWJiIGFiezJ9JywKICBleHBlY3RlZFZhbHVlOiAnYWJhYmFiICBhYnsyfScsCiAgZXhwcjogJyVzL2FiezJ9Ly9nJywKICBub1BjcmVFeHByOiAnJXMvYWJcXHsyfS8vZyd9KTsKdGVzdFN1YnN0aXR1dGUoJ2V4X3N1YnN0aXR1dGVfY291bnQnLCB7CiAgdmFsdWU6ICcxXG4yXG4zXG40JywKICBleHBlY3RlZFZhbHVlOiAnMVxuMFxuMFxuNCcsCiAgZXhwcjogJ3MvXFxkLzAvaSAyJ30pOwp0ZXN0U3Vic3RpdHV0ZSgnZXhfc3Vic3RpdHV0ZV9jb3VudF93aXRoX3JhbmdlJywgewogIHZhbHVlOiAnMVxuMlxuM1xuNCcsCiAgZXhwZWN0ZWRWYWx1ZTogJzFcbjJcbjBcbjAnLAogIGV4cHI6ICcxLDNzL1xcZC8wLyAzJ30pOwp0ZXN0U3Vic3RpdHV0ZSgnZXhfc3Vic3RpdHV0ZV9ub3RfZ2xvYmFsJywgewogIHZhbHVlOiAnYWFhXG5iYWFcbmNhYScsCiAgZXhwZWN0ZWRWYWx1ZTogJ3hhYVxuYnhhXG5jeGEnLAogIGV4cHI6ICclcy9hL3gvJ30pOwpmdW5jdGlvbiB0ZXN0U3Vic3RpdHV0ZUNvbmZpcm0obmFtZSwgY29tbWFuZCwgaW5pdGlhbFZhbHVlLCBleHBlY3RlZFZhbHVlLCBrZXlzLCBmaW5hbFBvcykgewogIHRlc3RWaW0obmFtZSwgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogICAgdmFyIHNhdmVkT3BlbkRpYWxvZyA9IGNtLm9wZW5EaWFsb2c7CiAgICB2YXIgc2F2ZWRLZXlOYW1lID0gQ29kZU1pcnJvci5rZXlOYW1lOwogICAgdmFyIG9uS2V5RG93bjsKICAgIHZhciByZWNvcmRlZENhbGxiYWNrOwogICAgdmFyIGNsb3NlZCA9IHRydWU7IC8vIFN0YXJ0IG91dCBjbG9zZWQsIHNldCBmYWxzZSBvbiBzZWNvbmQgb3BlbkRpYWxvZy4KICAgIGZ1bmN0aW9uIGNsb3NlKCkgewogICAgICBjbG9zZWQgPSB0cnVlOwogICAgfQogICAgLy8gRmlyc3Qgb3BlbkRpYWxvZyBzaG91bGQgc2F2ZSBjYWxsYmFjay4KICAgIGNtLm9wZW5EaWFsb2cgPSBmdW5jdGlvbih0ZW1wbGF0ZSwgY2FsbGJhY2ssIG9wdGlvbnMpIHsKICAgICAgcmVjb3JkZWRDYWxsYmFjayA9IGNhbGxiYWNrOwogICAgfQogICAgLy8gRG8gZmlyc3Qgb3BlbkRpYWxvZy4KICAgIGhlbHBlcnMuZG9LZXlzKCc6Jyk7CiAgICAvLyBTZWNvbmQgb3BlbkRpYWxvZyBzaG91bGQgc2F2ZSBrZXlEb3duIGhhbmRsZXIuCiAgICBjbS5vcGVuRGlhbG9nID0gZnVuY3Rpb24odGVtcGxhdGUsIGNhbGxiYWNrLCBvcHRpb25zKSB7CiAgICAgIG9uS2V5RG93biA9IG9wdGlvbnMub25LZXlEb3duOwogICAgICBjbG9zZWQgPSBmYWxzZTsKICAgIH07CiAgICAvLyBSZXR1cm4gdGhlIGNvbW1hbmQgdG8gVmltIGFuZCB0cmlnZ2VyIHNlY29uZCBvcGVuRGlhbG9nLgogICAgcmVjb3JkZWRDYWxsYmFjayhjb21tYW5kKTsKICAgIC8vIFRoZSBldmVudCBzaG91bGQgcmVhbGx5IHVzZSBrZXlDb2RlLCBidXQgaGVyZSBqdXN0IG1vY2sgaXQgb3V0IGFuZCB1c2UKICAgIC8vIGtleSBhbmQgcmVwbGFjZSBrZXlOYW1lIHRvIGp1c3QgcmV0dXJuIGtleS4KICAgIENvZGVNaXJyb3Iua2V5TmFtZSA9IGZ1bmN0aW9uIChlKSB7IHJldHVybiBlLmtleTsgfQogICAga2V5cyA9IGtleXMudG9VcHBlckNhc2UoKTsKICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgewogICAgICBpcyghY2xvc2VkKTsKICAgICAgb25LZXlEb3duKHsga2V5OiBrZXlzLmNoYXJBdChpKSB9LCAnJywgY2xvc2UpOwogICAgfQogICAgdHJ5IHsKICAgICAgZXEoZXhwZWN0ZWRWYWx1ZSwgY20uZ2V0VmFsdWUoKSk7CiAgICAgIGhlbHBlcnMuYXNzZXJ0Q3Vyc29yQXQoZmluYWxQb3MpOwogICAgICBpcyhjbG9zZWQpOwogICAgfSBjYXRjaChlKSB7CiAgICAgIHRocm93IGUKICAgIH0gZmluYWxseSB7CiAgICAgIC8vIFJlc3RvcmUgb3ZlcnJpZGRlbiBmdW5jdGlvbnMuCiAgICAgIENvZGVNaXJyb3Iua2V5TmFtZSA9IHNhdmVkS2V5TmFtZTsKICAgICAgY20ub3BlbkRpYWxvZyA9IHNhdmVkT3BlbkRpYWxvZzsKICAgIH0KICB9LCB7IHZhbHVlOiBpbml0aWFsVmFsdWUgfSk7Cn07CnRlc3RTdWJzdGl0dXRlQ29uZmlybSgnZXhfc3Vic3RpdHV0ZV9jb25maXJtX2VtcHR5ZG9jJywKICAgICclcy94L2IvYycsICcnLCAnJywgJycsIG1ha2VDdXJzb3IoMCwgMCkpOwp0ZXN0U3Vic3RpdHV0ZUNvbmZpcm0oJ2V4X3N1YnN0aXR1dGVfY29uZmlybV9ub21hdGNoJywKICAgICclcy94L2IvYycsICdiYSBhXG5iYWInLCAnYmEgYVxuYmFiJywgJycsIG1ha2VDdXJzb3IoMCwgMCkpOwp0ZXN0U3Vic3RpdHV0ZUNvbmZpcm0oJ2V4X3N1YnN0aXR1dGVfY29uZmlybV9hY2NlcHQnLAogICAgJyVzL2EvYi9jZycsICdiYSBhXG5iYWInLCAnYmIgYlxuYmJiJywgJ3l5eScsIG1ha2VDdXJzb3IoMSwgMSkpOwp0ZXN0U3Vic3RpdHV0ZUNvbmZpcm0oJ2V4X3N1YnN0aXR1dGVfY29uZmlybV9yYW5kb21fa2V5cycsCiAgICAnJXMvYS9iL2NnJywgJ2JhIGFcbmJhYicsICdiYiBiXG5iYmInLCAneXNka3l3ZXJ0eScsIG1ha2VDdXJzb3IoMSwgMSkpOwp0ZXN0U3Vic3RpdHV0ZUNvbmZpcm0oJ2V4X3N1YnN0aXR1dGVfY29uZmlybV9zb21lJywKICAgICclcy9hL2IvY2cnLCAnYmEgYVxuYmFiJywgJ2JiIGFcbmJiYicsICd5bnknLCBtYWtlQ3Vyc29yKDEsIDEpKTsKdGVzdFN1YnN0aXR1dGVDb25maXJtKCdleF9zdWJzdGl0dXRlX2NvbmZpcm1fYWxsJywKICAgICclcy9hL2IvY2cnLCAnYmEgYVxuYmFiJywgJ2JiIGJcbmJiYicsICdhJywgbWFrZUN1cnNvcigxLCAxKSk7CnRlc3RTdWJzdGl0dXRlQ29uZmlybSgnZXhfc3Vic3RpdHV0ZV9jb25maXJtX2FjY2VwdF90aGVuX2FsbCcsCiAgICAnJXMvYS9iL2NnJywgJ2JhIGFcbmJhYicsICdiYiBiXG5iYmInLCAneWEnLCBtYWtlQ3Vyc29yKDEsIDEpKTsKdGVzdFN1YnN0aXR1dGVDb25maXJtKCdleF9zdWJzdGl0dXRlX2NvbmZpcm1fcXVpdCcsCiAgICAnJXMvYS9iL2NnJywgJ2JhIGFcbmJhYicsICdiYiBhXG5iYWInLCAneXEnLCBtYWtlQ3Vyc29yKDAsIDMpKTsKdGVzdFN1YnN0aXR1dGVDb25maXJtKCdleF9zdWJzdGl0dXRlX2NvbmZpcm1fbGFzdCcsCiAgICAnJXMvYS9iL2NnJywgJ2JhIGFcbmJhYicsICdiYiBiXG5iYWInLCAneWwnLCBtYWtlQ3Vyc29yKDAsIDMpKTsKdGVzdFN1YnN0aXR1dGVDb25maXJtKCdleF9zdWJzdGl0dXRlX2NvbmZpcm1fb25lbGluZScsCiAgICAnMXMvYS9iL2NnJywgJ2JhIGFcbmJhYicsICdiYiBiXG5iYWInLCAneWwnLCBtYWtlQ3Vyc29yKDAsIDMpKTsKdGVzdFN1YnN0aXR1dGVDb25maXJtKCdleF9zdWJzdGl0dXRlX2NvbmZpcm1fcmFuZ2VfYWNjZXB0JywKICAgICcxLDJzL2EvYi9jZycsICdhYVxuYSBcbmFcbmEnLCAnYmJcbmIgXG5hXG5hJywgJ3l5eScsIG1ha2VDdXJzb3IoMSwgMCkpOwp0ZXN0U3Vic3RpdHV0ZUNvbmZpcm0oJ2V4X3N1YnN0aXR1dGVfY29uZmlybV9yYW5nZV9zb21lJywKICAgICcxLDNzL2EvYi9jZycsICdhYVxuYSBcbmFcbmEnLCAnYmFcbmIgXG5iXG5hJywgJ3lueXknLCBtYWtlQ3Vyc29yKDIsIDApKTsKdGVzdFN1YnN0aXR1dGVDb25maXJtKCdleF9zdWJzdGl0dXRlX2NvbmZpcm1fcmFuZ2VfYWxsJywKICAgICcxLDNzL2EvYi9jZycsICdhYVxuYSBcbmFcbmEnLCAnYmJcbmIgXG5iXG5hJywgJ2EnLCBtYWtlQ3Vyc29yKDIsIDApKTsKdGVzdFN1YnN0aXR1dGVDb25maXJtKCdleF9zdWJzdGl0dXRlX2NvbmZpcm1fcmFuZ2VfbGFzdCcsCiAgICAnMSwzcy9hL2IvY2cnLCAnYWFcbmEgXG5hXG5hJywgJ2JiXG5iIFxuYVxuYScsICd5eWwnLCBtYWtlQ3Vyc29yKDEsIDApKTsKLy86bm9oIHNob3VsZCBjbGVhciBoaWdobGlnaHRpbmcgb2Ygc2VhcmNoLXJlc3VsdHMgYnV0IGFsbG93IHRvIHJlc3VtZSBzZWFyY2ggdGhyb3VnaCBuCnRlc3RWaW0oJ2V4X25vaF9jbGVhclNlYXJjaEhpZ2hsaWdodCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBjbS5vcGVuRGlhbG9nID0gaGVscGVycy5mYWtlT3BlbkRpYWxvZygnbWF0Y2gnKTsKICBoZWxwZXJzLmRvS2V5cygnPycpOwogIGhlbHBlcnMuZG9FeCgnbm9oJyk7CiAgZXEodmltLnNlYXJjaFN0YXRlXy5nZXRPdmVybGF5KCksbnVsbCwnbWF0Y2gtaGlnaGxpZ2h0aW5nIHdhc25cJ3QgY2xlYXJlZCcpOwogIGhlbHBlcnMuZG9LZXlzKCduJyk7CiAgaGVscGVycy5hc3NlcnRDdXJzb3JBdCgwLCAxMSwnY2FuXCd0IHJlc3VtZSBzZWFyY2ggYWZ0ZXIgY2xlYXJpbmcgaGlnaGxpZ2h0aW5nJyk7Cn0sIHsgdmFsdWU6ICdtYXRjaCBub3BlIG1hdGNoIFxuIG5vcGUgTWF0Y2gnIH0pOwp0ZXN0VmltKCdleF95YW5rJywgZnVuY3Rpb24gKGNtLCB2aW0sIGhlbHBlcnMpIHsKICB2YXIgY3VyU3RhcnQgPSBtYWtlQ3Vyc29yKDMsIDApOwogIGNtLnNldEN1cnNvcihjdXJTdGFydCk7CiAgaGVscGVycy5kb0V4KCd5Jyk7CiAgdmFyIHJlZ2lzdGVyID0gaGVscGVycy5nZXRSZWdpc3RlckNvbnRyb2xsZXIoKS5nZXRSZWdpc3RlcigpOwogIHZhciBsaW5lID0gY20uZ2V0TGluZSgzKTsKICBlcShsaW5lICsgJ1xuJywgcmVnaXN0ZXIudG9TdHJpbmcoKSk7Cn0pOwp0ZXN0VmltKCdzZXRfYm9vbGVhbicsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBDb2RlTWlycm9yLlZpbS5kZWZpbmVPcHRpb24oJ3Rlc3RvcHRpb24nLCB0cnVlLCAnYm9vbGVhbicpOwogIC8vIFRlc3QgZGVmYXVsdCB2YWx1ZSBpcyBzZXQuCiAgaXMoQ29kZU1pcnJvci5WaW0uZ2V0T3B0aW9uKCd0ZXN0b3B0aW9uJykpOwogIHRyeSB7CiAgICAvLyBUZXN0IGZhaWwgdG8gc2V0IHRvIG5vbi1ib29sZWFuCiAgICBDb2RlTWlycm9yLlZpbS5zZXRPcHRpb24oJ3Rlc3RvcHRpb24nLCAnNScpOwogICAgZmFpbCgpOwogIH0gY2F0Y2ggKGV4cGVjdGVkKSB7fQogIC8vIFRlc3Qgc2V0T3B0aW9uCiAgQ29kZU1pcnJvci5WaW0uc2V0T3B0aW9uKCd0ZXN0b3B0aW9uJywgZmFsc2UpOwogIGlzKCFDb2RlTWlycm9yLlZpbS5nZXRPcHRpb24oJ3Rlc3RvcHRpb24nKSk7Cn0pOwp0ZXN0VmltKCdleF9zZXRfYm9vbGVhbicsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBDb2RlTWlycm9yLlZpbS5kZWZpbmVPcHRpb24oJ3Rlc3RvcHRpb24nLCB0cnVlLCAnYm9vbGVhbicpOwogIC8vIFRlc3QgZGVmYXVsdCB2YWx1ZSBpcyBzZXQuCiAgaXMoQ29kZU1pcnJvci5WaW0uZ2V0T3B0aW9uKCd0ZXN0b3B0aW9uJykpOwogIHRyeSB7CiAgICAvLyBUZXN0IGZhaWwgdG8gc2V0IHRvIG5vbi1ib29sZWFuCiAgICBoZWxwZXJzLmRvRXgoJ3NldCB0ZXN0b3B0aW9uPTIyJyk7CiAgICBmYWlsKCk7CiAgfSBjYXRjaCAoZXhwZWN0ZWQpIHt9CiAgLy8gVGVzdCBzZXRPcHRpb24KICBoZWxwZXJzLmRvRXgoJ3NldCBub3Rlc3RvcHRpb24nKTsKICBpcyghQ29kZU1pcnJvci5WaW0uZ2V0T3B0aW9uKCd0ZXN0b3B0aW9uJykpOwp9KTsKdGVzdFZpbSgnc2V0X3N0cmluZycsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBDb2RlTWlycm9yLlZpbS5kZWZpbmVPcHRpb24oJ3Rlc3RvcHRpb24nLCAnYScsICdzdHJpbmcnKTsKICAvLyBUZXN0IGRlZmF1bHQgdmFsdWUgaXMgc2V0LgogIGVxKCdhJywgQ29kZU1pcnJvci5WaW0uZ2V0T3B0aW9uKCd0ZXN0b3B0aW9uJykpOwogIHRyeSB7CiAgICAvLyBUZXN0IGZhaWwgdG8gc2V0IG5vbi1zdHJpbmcuCiAgICBDb2RlTWlycm9yLlZpbS5zZXRPcHRpb24oJ3Rlc3RvcHRpb24nLCB0cnVlKTsKICAgIGZhaWwoKTsKICB9IGNhdGNoIChleHBlY3RlZCkge30KICB0cnkgewogICAgLy8gVGVzdCBmYWlsIHRvIHNldCAnbm90ZXN0b3B0aW9uJwogICAgQ29kZU1pcnJvci5WaW0uc2V0T3B0aW9uKCdub3Rlc3RvcHRpb24nLCAnYicpOwogICAgZmFpbCgpOwogIH0gY2F0Y2ggKGV4cGVjdGVkKSB7fQogIC8vIFRlc3Qgc2V0T3B0aW9uCiAgQ29kZU1pcnJvci5WaW0uc2V0T3B0aW9uKCd0ZXN0b3B0aW9uJywgJ2MnKTsKICBlcSgnYycsIENvZGVNaXJyb3IuVmltLmdldE9wdGlvbigndGVzdG9wdGlvbicpKTsKfSk7CnRlc3RWaW0oJ2V4X3NldF9zdHJpbmcnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgQ29kZU1pcnJvci5WaW0uZGVmaW5lT3B0aW9uKCd0ZXN0b3B0JywgJ2EnLCAnc3RyaW5nJyk7CiAgLy8gVGVzdCBkZWZhdWx0IHZhbHVlIGlzIHNldC4KICBlcSgnYScsIENvZGVNaXJyb3IuVmltLmdldE9wdGlvbigndGVzdG9wdCcpKTsKICB0cnkgewogICAgLy8gVGVzdCBmYWlsIHRvIHNldCAnbm90ZXN0b3B0JwogICAgaGVscGVycy5kb0V4KCdzZXQgbm90ZXN0b3B0PWInKTsKICAgIGZhaWwoKTsKICB9IGNhdGNoIChleHBlY3RlZCkge30KICAvLyBUZXN0IHNldE9wdGlvbgogIGhlbHBlcnMuZG9FeCgnc2V0IHRlc3RvcHQ9YycpCiAgZXEoJ2MnLCBDb2RlTWlycm9yLlZpbS5nZXRPcHRpb24oJ3Rlc3RvcHQnKSk7CiAgaGVscGVycy5kb0V4KCdzZXQgdGVzdG9wdD1jJykKICBlcSgnYycsIENvZGVNaXJyb3IuVmltLmdldE9wdGlvbigndGVzdG9wdCcsIGNtKSk7IC8vbG9jYWwgfHwgZ2xvYmFsCiAgZXEoJ2MnLCBDb2RlTWlycm9yLlZpbS5nZXRPcHRpb24oJ3Rlc3RvcHQnLCBjbSwge3Njb3BlOiAnbG9jYWwnfSkpOyAvLyBsb2NhbAogIGVxKCdjJywgQ29kZU1pcnJvci5WaW0uZ2V0T3B0aW9uKCd0ZXN0b3B0JywgY20sIHtzY29wZTogJ2dsb2JhbCd9KSk7IC8vIGdsb2JhbAogIGVxKCdjJywgQ29kZU1pcnJvci5WaW0uZ2V0T3B0aW9uKCd0ZXN0b3B0JykpOyAvLyBnbG9iYWwKICAvLyBUZXN0IHNldE9wdGlvbiBnbG9iYWwKICBoZWxwZXJzLmRvRXgoJ3NldGcgdGVzdG9wdD1kJykKICBlcSgnYycsIENvZGVNaXJyb3IuVmltLmdldE9wdGlvbigndGVzdG9wdCcsIGNtKSk7CiAgZXEoJ2MnLCBDb2RlTWlycm9yLlZpbS5nZXRPcHRpb24oJ3Rlc3RvcHQnLCBjbSwge3Njb3BlOiAnbG9jYWwnfSkpOwogIGVxKCdkJywgQ29kZU1pcnJvci5WaW0uZ2V0T3B0aW9uKCd0ZXN0b3B0JywgY20sIHtzY29wZTogJ2dsb2JhbCd9KSk7CiAgZXEoJ2QnLCBDb2RlTWlycm9yLlZpbS5nZXRPcHRpb24oJ3Rlc3RvcHQnKSk7CiAgLy8gVGVzdCBzZXRPcHRpb24gbG9jYWwKICBoZWxwZXJzLmRvRXgoJ3NldGwgdGVzdG9wdD1lJykKICBlcSgnZScsIENvZGVNaXJyb3IuVmltLmdldE9wdGlvbigndGVzdG9wdCcsIGNtKSk7CiAgZXEoJ2UnLCBDb2RlTWlycm9yLlZpbS5nZXRPcHRpb24oJ3Rlc3RvcHQnLCBjbSwge3Njb3BlOiAnbG9jYWwnfSkpOwogIGVxKCdkJywgQ29kZU1pcnJvci5WaW0uZ2V0T3B0aW9uKCd0ZXN0b3B0JywgY20sIHtzY29wZTogJ2dsb2JhbCd9KSk7CiAgZXEoJ2QnLCBDb2RlTWlycm9yLlZpbS5nZXRPcHRpb24oJ3Rlc3RvcHQnKSk7Cn0pOwp0ZXN0VmltKCdleF9zZXRfY2FsbGJhY2snLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgdmFyIGdsb2JhbDsKCiAgZnVuY3Rpb24gY2IodmFsLCBjbSwgY2ZnKSB7CiAgICBpZiAodmFsID09PSB1bmRlZmluZWQpIHsKICAgICAgLy8gR2V0dGVyCiAgICAgIGlmIChjbSkgewogICAgICAgIHJldHVybiBjbS5fbG9jYWw7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIGdsb2JhbDsKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgLy8gU2V0dGVyCiAgICAgIGlmIChjbSkgewogICAgICAgIGNtLl9sb2NhbCA9IHZhbDsKICAgICAgfSBlbHNlIHsKICAgICAgICBnbG9iYWwgPSB2YWw7CiAgICAgIH0KICAgIH0KICB9CgogIENvZGVNaXJyb3IuVmltLmRlZmluZU9wdGlvbigndGVzdG9wdCcsICdhJywgJ3N0cmluZycsIGNiKTsKICAvLyBUZXN0IGRlZmF1bHQgdmFsdWUgaXMgc2V0LgogIGVxKCdhJywgQ29kZU1pcnJvci5WaW0uZ2V0T3B0aW9uKCd0ZXN0b3B0JykpOwogIHRyeSB7CiAgICAvLyBUZXN0IGZhaWwgdG8gc2V0ICdub3Rlc3RvcHQnCiAgICBoZWxwZXJzLmRvRXgoJ3NldCBub3Rlc3RvcHQ9YicpOwogICAgZmFpbCgpOwogIH0gY2F0Y2ggKGV4cGVjdGVkKSB7fQogIC8vIFRlc3Qgc2V0T3B0aW9uIChJZGVudGljYWwgdG8gdGhlIHN0cmluZyB0ZXN0cywgYnV0IHZpYSBjYWxsYmFjayBpbnN0ZWFkKQogIGhlbHBlcnMuZG9FeCgnc2V0IHRlc3RvcHQ9YycpCiAgZXEoJ2MnLCBDb2RlTWlycm9yLlZpbS5nZXRPcHRpb24oJ3Rlc3RvcHQnLCBjbSkpOyAvL2xvY2FsIHx8IGdsb2JhbAogIGVxKCdjJywgQ29kZU1pcnJvci5WaW0uZ2V0T3B0aW9uKCd0ZXN0b3B0JywgY20sIHtzY29wZTogJ2xvY2FsJ30pKTsgLy8gbG9jYWwKICBlcSgnYycsIENvZGVNaXJyb3IuVmltLmdldE9wdGlvbigndGVzdG9wdCcsIGNtLCB7c2NvcGU6ICdnbG9iYWwnfSkpOyAvLyBnbG9iYWwKICBlcSgnYycsIENvZGVNaXJyb3IuVmltLmdldE9wdGlvbigndGVzdG9wdCcpKTsgLy8gZ2xvYmFsCiAgLy8gVGVzdCBzZXRPcHRpb24gZ2xvYmFsCiAgaGVscGVycy5kb0V4KCdzZXRnIHRlc3RvcHQ9ZCcpCiAgZXEoJ2MnLCBDb2RlTWlycm9yLlZpbS5nZXRPcHRpb24oJ3Rlc3RvcHQnLCBjbSkpOwogIGVxKCdjJywgQ29kZU1pcnJvci5WaW0uZ2V0T3B0aW9uKCd0ZXN0b3B0JywgY20sIHtzY29wZTogJ2xvY2FsJ30pKTsKICBlcSgnZCcsIENvZGVNaXJyb3IuVmltLmdldE9wdGlvbigndGVzdG9wdCcsIGNtLCB7c2NvcGU6ICdnbG9iYWwnfSkpOwogIGVxKCdkJywgQ29kZU1pcnJvci5WaW0uZ2V0T3B0aW9uKCd0ZXN0b3B0JykpOwogIC8vIFRlc3Qgc2V0T3B0aW9uIGxvY2FsCiAgaGVscGVycy5kb0V4KCdzZXRsIHRlc3RvcHQ9ZScpCiAgZXEoJ2UnLCBDb2RlTWlycm9yLlZpbS5nZXRPcHRpb24oJ3Rlc3RvcHQnLCBjbSkpOwogIGVxKCdlJywgQ29kZU1pcnJvci5WaW0uZ2V0T3B0aW9uKCd0ZXN0b3B0JywgY20sIHtzY29wZTogJ2xvY2FsJ30pKTsKICBlcSgnZCcsIENvZGVNaXJyb3IuVmltLmdldE9wdGlvbigndGVzdG9wdCcsIGNtLCB7c2NvcGU6ICdnbG9iYWwnfSkpOwogIGVxKCdkJywgQ29kZU1pcnJvci5WaW0uZ2V0T3B0aW9uKCd0ZXN0b3B0JykpOwp9KQp0ZXN0VmltKCdleF9zZXRfZmlsZXR5cGUnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgQ29kZU1pcnJvci5kZWZpbmVNb2RlKCd0ZXN0X21vZGUnLCBmdW5jdGlvbigpIHsKICAgIHJldHVybiB7dG9rZW46IGZ1bmN0aW9uKHN0cmVhbSkgewogICAgICBzdHJlYW0ubWF0Y2goL15ccyt8XlxTKy8pOwogICAgfX07CiAgfSk7CiAgQ29kZU1pcnJvci5kZWZpbmVNb2RlKCd0ZXN0X21vZGVfMicsIGZ1bmN0aW9uKCkgewogICAgcmV0dXJuIHt0b2tlbjogZnVuY3Rpb24oc3RyZWFtKSB7CiAgICAgIHN0cmVhbS5tYXRjaCgvXlxzK3xeXFMrLyk7CiAgICB9fTsKICB9KTsKICAvLyBUZXN0IG1vZGUgaXMgc2V0LgogIGhlbHBlcnMuZG9FeCgnc2V0IGZpbGV0eXBlPXRlc3RfbW9kZScpOwogIGVxKCd0ZXN0X21vZGUnLCBjbS5nZXRNb2RlKCkubmFtZSk7CiAgLy8gVGVzdCAnZnQnIGFsaWFzIGFsc28gc2V0cyBtb2RlLgogIGhlbHBlcnMuZG9FeCgnc2V0IGZ0PXRlc3RfbW9kZV8yJyk7CiAgZXEoJ3Rlc3RfbW9kZV8yJywgY20uZ2V0TW9kZSgpLm5hbWUpOwp9KTsKdGVzdFZpbSgnZXhfc2V0X2ZpbGV0eXBlX251bGwnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgQ29kZU1pcnJvci5kZWZpbmVNb2RlKCd0ZXN0X21vZGUnLCBmdW5jdGlvbigpIHsKICAgIHJldHVybiB7dG9rZW46IGZ1bmN0aW9uKHN0cmVhbSkgewogICAgICBzdHJlYW0ubWF0Y2goL15ccyt8XlxTKy8pOwogICAgfX07CiAgfSk7CiAgY20uc2V0T3B0aW9uKCdtb2RlJywgJ3Rlc3RfbW9kZScpOwogIC8vIFRlc3QgbW9kZSBpcyBzZXQgdG8gbnVsbC4KICBoZWxwZXJzLmRvRXgoJ3NldCBmaWxldHlwZT0nKTsKICBlcSgnbnVsbCcsIGNtLmdldE1vZGUoKS5uYW1lKTsKfSk7Ci8vIFRPRE86IFJlc2V0IGtleSBtYXBzIGFmdGVyIGVhY2ggdGVzdC4KdGVzdFZpbSgnZXhfbWFwX2tleTJrZXknLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgaGVscGVycy5kb0V4KCdtYXAgYSB4Jyk7CiAgaGVscGVycy5kb0tleXMoJ2EnKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDApOwogIGVxKCdiYycsIGNtLmdldFZhbHVlKCkpOwp9LCB7IHZhbHVlOiAnYWJjJyB9KTsKdGVzdFZpbSgnZXhfdW5tYXBfa2V5MmtleScsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBoZWxwZXJzLmRvRXgoJ3VubWFwIGEnKTsKICBoZWxwZXJzLmRvS2V5cygnYScpOwogIGVxKCd2aW0taW5zZXJ0JywgY20uZ2V0T3B0aW9uKCdrZXlNYXAnKSk7Cn0sIHsgdmFsdWU6ICdhYmMnIH0pOwp0ZXN0VmltKCdleF91bm1hcF9rZXkya2V5X2RvZXNfbm90X3JlbW92ZV9kZWZhdWx0JywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIHRyeSB7CiAgICBoZWxwZXJzLmRvRXgoJ3VubWFwIGEnKTsKICAgIGZhaWwoKTsKICB9IGNhdGNoIChleHBlY3RlZCkge30KICBoZWxwZXJzLmRvS2V5cygnYScpOwogIGVxKCd2aW0taW5zZXJ0JywgY20uZ2V0T3B0aW9uKCdrZXlNYXAnKSk7Cn0sIHsgdmFsdWU6ICdhYmMnIH0pOwp0ZXN0VmltKCdleF9tYXBfa2V5MmtleV90b19jb2xvbicsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBoZWxwZXJzLmRvRXgoJ21hcCA7IDonKTsKICB2YXIgZGlhbG9nT3BlbmVkID0gZmFsc2U7CiAgY20ub3BlbkRpYWxvZyA9IGZ1bmN0aW9uKCkgewogICAgZGlhbG9nT3BlbmVkID0gdHJ1ZTsKICB9CiAgaGVscGVycy5kb0tleXMoJzsnKTsKICBlcShkaWFsb2dPcGVuZWQsIHRydWUpOwp9KTsKdGVzdFZpbSgnZXhfbWFwX2V4MmtleTonLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgaGVscGVycy5kb0V4KCdtYXAgOmRlbCB4Jyk7CiAgaGVscGVycy5kb0V4KCdkZWwnKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDApOwogIGVxKCdiYycsIGNtLmdldFZhbHVlKCkpOwp9LCB7IHZhbHVlOiAnYWJjJyB9KTsKdGVzdFZpbSgnZXhfbWFwX2V4MmV4JywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGhlbHBlcnMuZG9FeCgnbWFwIDpkZWwgOncnKTsKICB2YXIgdG1wID0gQ29kZU1pcnJvci5jb21tYW5kcy5zYXZlOwogIHZhciB3cml0dGVuID0gZmFsc2U7CiAgdmFyIGFjdHVhbENtOwogIENvZGVNaXJyb3IuY29tbWFuZHMuc2F2ZSA9IGZ1bmN0aW9uKGNtKSB7CiAgICB3cml0dGVuID0gdHJ1ZTsKICAgIGFjdHVhbENtID0gY207CiAgfTsKICBoZWxwZXJzLmRvRXgoJ2RlbCcpOwogIENvZGVNaXJyb3IuY29tbWFuZHMuc2F2ZSA9IHRtcDsKICBlcSh3cml0dGVuLCB0cnVlKTsKICBlcShhY3R1YWxDbSwgY20pOwp9KTsKdGVzdFZpbSgnZXhfbWFwX2tleTJleCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICBoZWxwZXJzLmRvRXgoJ21hcCBhIDp3Jyk7CiAgdmFyIHRtcCA9IENvZGVNaXJyb3IuY29tbWFuZHMuc2F2ZTsKICB2YXIgd3JpdHRlbiA9IGZhbHNlOwogIHZhciBhY3R1YWxDbTsKICBDb2RlTWlycm9yLmNvbW1hbmRzLnNhdmUgPSBmdW5jdGlvbihjbSkgewogICAgd3JpdHRlbiA9IHRydWU7CiAgICBhY3R1YWxDbSA9IGNtOwogIH07CiAgaGVscGVycy5kb0tleXMoJ2EnKTsKICBDb2RlTWlycm9yLmNvbW1hbmRzLnNhdmUgPSB0bXA7CiAgZXEod3JpdHRlbiwgdHJ1ZSk7CiAgZXEoYWN0dWFsQ20sIGNtKTsKfSk7CnRlc3RWaW0oJ2V4X21hcF9rZXkya2V5X3Zpc3VhbF9hcGknLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgQ29kZU1pcnJvci5WaW0ubWFwKCdiJywgJzp3JywgJ3Zpc3VhbCcpOwogIHZhciB0bXAgPSBDb2RlTWlycm9yLmNvbW1hbmRzLnNhdmU7CiAgdmFyIHdyaXR0ZW4gPSBmYWxzZTsKICB2YXIgYWN0dWFsQ207CiAgQ29kZU1pcnJvci5jb21tYW5kcy5zYXZlID0gZnVuY3Rpb24oY20pIHsKICAgIHdyaXR0ZW4gPSB0cnVlOwogICAgYWN0dWFsQ20gPSBjbTsKICB9OwogIC8vIE1hcHBpbmcgc2hvdWxkIG5vdCB3b3JrIGluIG5vcm1hbCBtb2RlLgogIGhlbHBlcnMuZG9LZXlzKCdiJyk7CiAgZXEod3JpdHRlbiwgZmFsc2UpOwogIC8vIE1hcHBpbmcgc2hvdWxkIHdvcmsgaW4gdmlzdWFsIG1vZGUuCiAgaGVscGVycy5kb0tleXMoJ3YnLCAnYicpOwogIGVxKHdyaXR0ZW4sIHRydWUpOwogIGVxKGFjdHVhbENtLCBjbSk7CgogIENvZGVNaXJyb3IuY29tbWFuZHMuc2F2ZSA9IHRtcDsKfSk7CnRlc3RWaW0oJ2V4X2ltYXAnLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgQ29kZU1pcnJvci5WaW0ubWFwKCdqaycsICc8RXNjPicsICdpbnNlcnQnKTsKICBoZWxwZXJzLmRvS2V5cygnaScpOwogIGlzKHZpbS5pbnNlcnRNb2RlKTsKICBoZWxwZXJzLmRvS2V5cygnaicsICdrJyk7CiAgaXMoIXZpbS5pbnNlcnRNb2RlKTsKICBjbS5zZXRDdXJzb3IoMCwgMSk7CiAgQ29kZU1pcnJvci5WaW0ubWFwKCdqaicsICc8RXNjPicsICdpbnNlcnQnKTsKICBoZWxwZXJzLmRvS2V5cygnPEMtdj4nLCAnMicsICdqJywgJ2wnLCAnYycpOwogIHZhciByZXBsYWNlbWVudCA9IGZpbGxBcnJheSgnZm8nLCAzKTsKICBjbS5yZXBsYWNlU2VsZWN0aW9ucyhyZXBsYWNlbWVudCk7CiAgZXEoJzFmbzRcbjVmbzhcbmFmb2RlZmcnLCBjbS5nZXRWYWx1ZSgpKTsKICBoZWxwZXJzLmRvS2V5cygnaicsICdqJyk7CiAgY20uc2V0Q3Vyc29yKDAsIDApOwogIGhlbHBlcnMuZG9LZXlzKCcuJyk7CiAgZXEoJ2ZvbzRcbmZvbzhcbmZvb2RlZmcnLCBjbS5nZXRWYWx1ZSgpKTsKfSwgeyB2YWx1ZTogJzEyMzRcbjU2NzhcbmFiY2RlZmcnIH0pOwp0ZXN0VmltKCdleF91bm1hcF9hcGknLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgQ29kZU1pcnJvci5WaW0ubWFwKCc8QWx0LVg+JywgJ2dnJywgJ25vcm1hbCcpOwogIGlzKENvZGVNaXJyb3IuVmltLmhhbmRsZUtleShjbSwgIjxBbHQtWD4iLCAibm9ybWFsIiksICJBbHQtWCBrZXkgaXMgbWFwcGVkIik7CiAgQ29kZU1pcnJvci5WaW0udW5tYXAoIjxBbHQtWD4iLCAibm9ybWFsIik7CiAgaXMoIUNvZGVNaXJyb3IuVmltLmhhbmRsZUtleShjbSwgIjxBbHQtWD4iLCAibm9ybWFsIiksICJBbHQtWCBrZXkgaXMgdW5tYXBwZWQiKTsKfSk7CgovLyBUZXN0aW5nIHJlZ2lzdHJhdGlvbiBvZiBmdW5jdGlvbnMgYXMgZXgtY29tbWFuZHMgYW5kIG1hcHBpbmcgdG8gPEtleT4ta2V5cwp0ZXN0VmltKCdleF9hcGlfdGVzdCcsIGZ1bmN0aW9uKGNtLCB2aW0sIGhlbHBlcnMpIHsKICB2YXIgcmVzPWZhbHNlOwogIHZhciB2YWw9J2Zyb20nOwogIENvZGVNaXJyb3IuVmltLmRlZmluZUV4KCdleHRlc3QnLCdleHQnLGZ1bmN0aW9uKGNtLHBhcmFtcyl7CiAgICBpZihwYXJhbXMuYXJncyl2YWw9cGFyYW1zLmFyZ3NbMF07CiAgICBlbHNlIHJlcz10cnVlOwogIH0pOwogIGhlbHBlcnMuZG9FeCgnOmV4dCB0bycpOwogIGVxKHZhbCwndG8nLCdEZWZpbmluZyBleC1jb21tYW5kIGZhaWxlZCcpOwogIENvZGVNaXJyb3IuVmltLm1hcCgnPEMtQ1I+PFNwYWNlPicsJzpleHQnKTsKICBoZWxwZXJzLmRvS2V5cygnPEMtQ1I+JywnPFNwYWNlPicpOwogIGlzKHJlcywnTWFwcGluZyB0byBrZXkgZmFpbGVkJyk7Cn0pOwovLyBGb3Igbm93LCB0aGlzIHRlc3QgbmVlZHMgdG8gYmUgbGFzdCBiZWNhdXNlIGl0IG1lc3NlcyB1cCA6IGZvciBmdXR1cmUgdGVzdHMuCnRlc3RWaW0oJ2V4X21hcF9rZXkya2V5X2Zyb21fY29sb24nLCBmdW5jdGlvbihjbSwgdmltLCBoZWxwZXJzKSB7CiAgaGVscGVycy5kb0V4KCdtYXAgOiB4Jyk7CiAgaGVscGVycy5kb0tleXMoJzonKTsKICBoZWxwZXJzLmFzc2VydEN1cnNvckF0KDAsIDApOwogIGVxKCdiYycsIGNtLmdldFZhbHVlKCkpOwp9LCB7IHZhbHVlOiAnYWJjJyB9KTsKCi8vIFRlc3QgZXZlbnQgaGFuZGxlcnMKdGVzdFZpbSgnYmVmb3JlU2VsZWN0aW9uQ2hhbmdlJywgZnVuY3Rpb24oY20sIHZpbSwgaGVscGVycykgewogIGNtLnNldEN1cnNvcigwLCAxMDApOwogIGVxUG9zKGNtLmdldEN1cnNvcignaGVhZCcpLCBjbS5nZXRDdXJzb3IoJ2FuY2hvcicpKTsKfSwgeyB2YWx1ZTogJ2FiYycgfSk7CgoK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/theme/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/theme/3024-day.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKCiAgICBOYW1lOiAgICAgICAzMDI0IGRheQogICAgQXV0aG9yOiAgICAgSmFuIFQuIFNvdHQgKGh0dHA6Ly9naXRodWIuY29tL2lkbGViZXJnKQoKICAgIENvZGVNaXJyb3IgdGVtcGxhdGUgYnkgSmFuIFQuIFNvdHQgKGh0dHBzOi8vZ2l0aHViLmNvbS9pZGxlYmVyZy9iYXNlMTYtY29kZW1pcnJvcikKICAgIE9yaWdpbmFsIEJhc2UxNiBjb2xvciBzY2hlbWUgYnkgQ2hyaXMgS2VtcHNvbiAoaHR0cHM6Ly9naXRodWIuY29tL2Nocmlza2VtcHNvbi9iYXNlMTYpCgoqLwoKLmNtLXMtMzAyNC1kYXkuQ29kZU1pcnJvciB7IGJhY2tncm91bmQ6ICNmN2Y3Zjc7IGNvbG9yOiAjM2EzNDMyOyB9Ci5jbS1zLTMwMjQtZGF5IGRpdi5Db2RlTWlycm9yLXNlbGVjdGVkIHsgYmFja2dyb3VuZDogI2Q2ZDVkNDsgfQoKLmNtLXMtMzAyNC1kYXkgLkNvZGVNaXJyb3ItbGluZTo6c2VsZWN0aW9uLCAuY20tcy0zMDI0LWRheSAuQ29kZU1pcnJvci1saW5lID4gc3Bhbjo6c2VsZWN0aW9uLCAuY20tcy0zMDI0LWRheSAuQ29kZU1pcnJvci1saW5lID4gc3BhbiA+IHNwYW46OnNlbGVjdGlvbiB7IGJhY2tncm91bmQ6ICNkNmQ1ZDQ7IH0KLmNtLXMtMzAyNC1kYXkgLkNvZGVNaXJyb3ItbGluZTo6LW1vei1zZWxlY3Rpb24sIC5jbS1zLTMwMjQtZGF5IC5Db2RlTWlycm9yLWxpbmUgPiBzcGFuOjotbW96LXNlbGVjdGlvbiwgLmNtLXMtMzAyNC1kYXkgLkNvZGVNaXJyb3ItbGluZSA+IHNwYW4gPiBzcGFuOjpzZWxlY3Rpb24geyBiYWNrZ3JvdW5kOiAjZDlkOWQ5OyB9CgouY20tcy0zMDI0LWRheSAuQ29kZU1pcnJvci1ndXR0ZXJzIHsgYmFja2dyb3VuZDogI2Y3ZjdmNzsgYm9yZGVyLXJpZ2h0OiAwcHg7IH0KLmNtLXMtMzAyNC1kYXkgLkNvZGVNaXJyb3ItZ3V0dGVybWFya2VyIHsgY29sb3I6ICNkYjJkMjA7IH0KLmNtLXMtMzAyNC1kYXkgLkNvZGVNaXJyb3ItZ3V0dGVybWFya2VyLXN1YnRsZSB7IGNvbG9yOiAjODA3ZDdjOyB9Ci5jbS1zLTMwMjQtZGF5IC5Db2RlTWlycm9yLWxpbmVudW1iZXIgeyBjb2xvcjogIzgwN2Q3YzsgfQoKLmNtLXMtMzAyNC1kYXkgLkNvZGVNaXJyb3ItY3Vyc29yIHsgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjNWM1ODU1OyB9CgouY20tcy0zMDI0LWRheSBzcGFuLmNtLWNvbW1lbnQgeyBjb2xvcjogI2NkYWI1MzsgfQouY20tcy0zMDI0LWRheSBzcGFuLmNtLWF0b20geyBjb2xvcjogI2ExNmE5NDsgfQouY20tcy0zMDI0LWRheSBzcGFuLmNtLW51bWJlciB7IGNvbG9yOiAjYTE2YTk0OyB9CgouY20tcy0zMDI0LWRheSBzcGFuLmNtLXByb3BlcnR5LCAuY20tcy0zMDI0LWRheSBzcGFuLmNtLWF0dHJpYnV0ZSB7IGNvbG9yOiAjMDFhMjUyOyB9Ci5jbS1zLTMwMjQtZGF5IHNwYW4uY20ta2V5d29yZCB7IGNvbG9yOiAjZGIyZDIwOyB9Ci5jbS1zLTMwMjQtZGF5IHNwYW4uY20tc3RyaW5nIHsgY29sb3I6ICNmZGVkMDI7IH0KCi5jbS1zLTMwMjQtZGF5IHNwYW4uY20tdmFyaWFibGUgeyBjb2xvcjogIzAxYTI1MjsgfQouY20tcy0zMDI0LWRheSBzcGFuLmNtLXZhcmlhYmxlLTIgeyBjb2xvcjogIzAxYTBlNDsgfQouY20tcy0zMDI0LWRheSBzcGFuLmNtLWRlZiB7IGNvbG9yOiAjZThiYmQwOyB9Ci5jbS1zLTMwMjQtZGF5IHNwYW4uY20tYnJhY2tldCB7IGNvbG9yOiAjM2EzNDMyOyB9Ci5jbS1zLTMwMjQtZGF5IHNwYW4uY20tdGFnIHsgY29sb3I6ICNkYjJkMjA7IH0KLmNtLXMtMzAyNC1kYXkgc3Bhbi5jbS1saW5rIHsgY29sb3I6ICNhMTZhOTQ7IH0KLmNtLXMtMzAyNC1kYXkgc3Bhbi5jbS1lcnJvciB7IGJhY2tncm91bmQ6ICNkYjJkMjA7IGNvbG9yOiAjNWM1ODU1OyB9CgouY20tcy0zMDI0LWRheSAuQ29kZU1pcnJvci1hY3RpdmVsaW5lLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiAjZThmMmZmOyB9Ci5jbS1zLTMwMjQtZGF5IC5Db2RlTWlycm9yLW1hdGNoaW5nYnJhY2tldCB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyBjb2xvcjogI2ExNmE5NCAhaW1wb3J0YW50OyB9Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/theme/3024-night.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKCiAgICBOYW1lOiAgICAgICAzMDI0IG5pZ2h0CiAgICBBdXRob3I6ICAgICBKYW4gVC4gU290dCAoaHR0cDovL2dpdGh1Yi5jb20vaWRsZWJlcmcpCgogICAgQ29kZU1pcnJvciB0ZW1wbGF0ZSBieSBKYW4gVC4gU290dCAoaHR0cHM6Ly9naXRodWIuY29tL2lkbGViZXJnL2Jhc2UxNi1jb2RlbWlycm9yKQogICAgT3JpZ2luYWwgQmFzZTE2IGNvbG9yIHNjaGVtZSBieSBDaHJpcyBLZW1wc29uIChodHRwczovL2dpdGh1Yi5jb20vY2hyaXNrZW1wc29uL2Jhc2UxNikKCiovCgouY20tcy0zMDI0LW5pZ2h0LkNvZGVNaXJyb3IgeyBiYWNrZ3JvdW5kOiAjMDkwMzAwOyBjb2xvcjogI2Q2ZDVkNDsgfQouY20tcy0zMDI0LW5pZ2h0IGRpdi5Db2RlTWlycm9yLXNlbGVjdGVkIHsgYmFja2dyb3VuZDogIzNhMzQzMjsgfQouY20tcy0zMDI0LW5pZ2h0IC5Db2RlTWlycm9yLWxpbmU6OnNlbGVjdGlvbiwgLmNtLXMtMzAyNC1uaWdodCAuQ29kZU1pcnJvci1saW5lID4gc3Bhbjo6c2VsZWN0aW9uLCAuY20tcy0zMDI0LW5pZ2h0IC5Db2RlTWlycm9yLWxpbmUgPiBzcGFuID4gc3Bhbjo6c2VsZWN0aW9uIHsgYmFja2dyb3VuZDogcmdiYSg1OCwgNTIsIDUwLCAuOTkpOyB9Ci5jbS1zLTMwMjQtbmlnaHQgLkNvZGVNaXJyb3ItbGluZTo6LW1vei1zZWxlY3Rpb24sIC5jbS1zLTMwMjQtbmlnaHQgLkNvZGVNaXJyb3ItbGluZSA+IHNwYW46Oi1tb3otc2VsZWN0aW9uLCAuY20tcy0zMDI0LW5pZ2h0IC5Db2RlTWlycm9yLWxpbmUgPiBzcGFuID4gc3Bhbjo6LW1vei1zZWxlY3Rpb24geyBiYWNrZ3JvdW5kOiByZ2JhKDU4LCA1MiwgNTAsIC45OSk7IH0KLmNtLXMtMzAyNC1uaWdodCAuQ29kZU1pcnJvci1ndXR0ZXJzIHsgYmFja2dyb3VuZDogIzA5MDMwMDsgYm9yZGVyLXJpZ2h0OiAwcHg7IH0KLmNtLXMtMzAyNC1uaWdodCAuQ29kZU1pcnJvci1ndXR0ZXJtYXJrZXIgeyBjb2xvcjogI2RiMmQyMDsgfQouY20tcy0zMDI0LW5pZ2h0IC5Db2RlTWlycm9yLWd1dHRlcm1hcmtlci1zdWJ0bGUgeyBjb2xvcjogIzVjNTg1NTsgfQouY20tcy0zMDI0LW5pZ2h0IC5Db2RlTWlycm9yLWxpbmVudW1iZXIgeyBjb2xvcjogIzVjNTg1NTsgfQoKLmNtLXMtMzAyNC1uaWdodCAuQ29kZU1pcnJvci1jdXJzb3IgeyBib3JkZXItbGVmdDogMXB4IHNvbGlkICM4MDdkN2M7IH0KCi5jbS1zLTMwMjQtbmlnaHQgc3Bhbi5jbS1jb21tZW50IHsgY29sb3I6ICNjZGFiNTM7IH0KLmNtLXMtMzAyNC1uaWdodCBzcGFuLmNtLWF0b20geyBjb2xvcjogI2ExNmE5NDsgfQouY20tcy0zMDI0LW5pZ2h0IHNwYW4uY20tbnVtYmVyIHsgY29sb3I6ICNhMTZhOTQ7IH0KCi5jbS1zLTMwMjQtbmlnaHQgc3Bhbi5jbS1wcm9wZXJ0eSwgLmNtLXMtMzAyNC1uaWdodCBzcGFuLmNtLWF0dHJpYnV0ZSB7IGNvbG9yOiAjMDFhMjUyOyB9Ci5jbS1zLTMwMjQtbmlnaHQgc3Bhbi5jbS1rZXl3b3JkIHsgY29sb3I6ICNkYjJkMjA7IH0KLmNtLXMtMzAyNC1uaWdodCBzcGFuLmNtLXN0cmluZyB7IGNvbG9yOiAjZmRlZDAyOyB9CgouY20tcy0zMDI0LW5pZ2h0IHNwYW4uY20tdmFyaWFibGUgeyBjb2xvcjogIzAxYTI1MjsgfQouY20tcy0zMDI0LW5pZ2h0IHNwYW4uY20tdmFyaWFibGUtMiB7IGNvbG9yOiAjMDFhMGU0OyB9Ci5jbS1zLTMwMjQtbmlnaHQgc3Bhbi5jbS1kZWYgeyBjb2xvcjogI2U4YmJkMDsgfQouY20tcy0zMDI0LW5pZ2h0IHNwYW4uY20tYnJhY2tldCB7IGNvbG9yOiAjZDZkNWQ0OyB9Ci5jbS1zLTMwMjQtbmlnaHQgc3Bhbi5jbS10YWcgeyBjb2xvcjogI2RiMmQyMDsgfQouY20tcy0zMDI0LW5pZ2h0IHNwYW4uY20tbGluayB7IGNvbG9yOiAjYTE2YTk0OyB9Ci5jbS1zLTMwMjQtbmlnaHQgc3Bhbi5jbS1lcnJvciB7IGJhY2tncm91bmQ6ICNkYjJkMjA7IGNvbG9yOiAjODA3ZDdjOyB9CgouY20tcy0zMDI0LW5pZ2h0IC5Db2RlTWlycm9yLWFjdGl2ZWxpbmUtYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6ICMyRjJGMkY7IH0KLmNtLXMtMzAyNC1uaWdodCAuQ29kZU1pcnJvci1tYXRjaGluZ2JyYWNrZXQgeyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgY29sb3I6IHdoaXRlICFpbXBvcnRhbnQ7IH0K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/theme/abcdef.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LmNtLXMtYWJjZGVmLkNvZGVNaXJyb3IgeyBiYWNrZ3JvdW5kOiAjMGYwZjBmOyBjb2xvcjogI2RlZmRlZjsgfQouY20tcy1hYmNkZWYgZGl2LkNvZGVNaXJyb3Itc2VsZWN0ZWQgeyBiYWNrZ3JvdW5kOiAjNTE1MTUxOyB9Ci5jbS1zLWFiY2RlZiAuQ29kZU1pcnJvci1saW5lOjpzZWxlY3Rpb24sIC5jbS1zLWFiY2RlZiAuQ29kZU1pcnJvci1saW5lID4gc3Bhbjo6c2VsZWN0aW9uLCAuY20tcy1hYmNkZWYgLkNvZGVNaXJyb3ItbGluZSA+IHNwYW4gPiBzcGFuOjpzZWxlY3Rpb24geyBiYWNrZ3JvdW5kOiByZ2JhKDU2LCA1NiwgNTYsIDAuOTkpOyB9Ci5jbS1zLWFiY2RlZiAuQ29kZU1pcnJvci1saW5lOjotbW96LXNlbGVjdGlvbiwgLmNtLXMtYWJjZGVmIC5Db2RlTWlycm9yLWxpbmUgPiBzcGFuOjotbW96LXNlbGVjdGlvbiwgLmNtLXMtYWJjZGVmIC5Db2RlTWlycm9yLWxpbmUgPiBzcGFuID4gc3Bhbjo6LW1vei1zZWxlY3Rpb24geyBiYWNrZ3JvdW5kOiByZ2JhKDU2LCA1NiwgNTYsIDAuOTkpOyB9Ci5jbS1zLWFiY2RlZiAuQ29kZU1pcnJvci1ndXR0ZXJzIHsgYmFja2dyb3VuZDogIzU1NTsgYm9yZGVyLXJpZ2h0OiAycHggc29saWQgIzMxNDE1MTsgfQouY20tcy1hYmNkZWYgLkNvZGVNaXJyb3ItZ3V0dGVybWFya2VyIHsgY29sb3I6ICMyMjI7IH0KLmNtLXMtYWJjZGVmIC5Db2RlTWlycm9yLWd1dHRlcm1hcmtlci1zdWJ0bGUgeyBjb2xvcjogYXp1cmU7IH0KLmNtLXMtYWJjZGVmIC5Db2RlTWlycm9yLWxpbmVudW1iZXIgeyBjb2xvcjogI0ZGRkZGRjsgfQouY20tcy1hYmNkZWYgLkNvZGVNaXJyb3ItY3Vyc29yIHsgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjMDBGRjAwOyB9CgouY20tcy1hYmNkZWYgc3Bhbi5jbS1rZXl3b3JkIHsgY29sb3I6IGRhcmtnb2xkZW5yb2Q7IGZvbnQtd2VpZ2h0OiBib2xkOyB9Ci5jbS1zLWFiY2RlZiBzcGFuLmNtLWF0b20geyBjb2xvcjogIzc3RjsgfQouY20tcy1hYmNkZWYgc3Bhbi5jbS1udW1iZXIgeyBjb2xvcjogdmlvbGV0OyB9Ci5jbS1zLWFiY2RlZiBzcGFuLmNtLWRlZiB7IGNvbG9yOiAjZmZmYWJjOyB9Ci5jbS1zLWFiY2RlZiBzcGFuLmNtLXZhcmlhYmxlIHsgY29sb3I6ICNhYmNkZWY7IH0KLmNtLXMtYWJjZGVmIHNwYW4uY20tdmFyaWFibGUtMiB7IGNvbG9yOiAjY2FjYmNjOyB9Ci5jbS1zLWFiY2RlZiBzcGFuLmNtLXZhcmlhYmxlLTMgeyBjb2xvcjogI2RlZjsgfQouY20tcy1hYmNkZWYgc3Bhbi5jbS1wcm9wZXJ0eSB7IGNvbG9yOiAjZmVkY2JhOyB9Ci5jbS1zLWFiY2RlZiBzcGFuLmNtLW9wZXJhdG9yIHsgY29sb3I6ICNmZjA7IH0KLmNtLXMtYWJjZGVmIHNwYW4uY20tY29tbWVudCB7IGNvbG9yOiAjN2E3YjdjOyBmb250LXN0eWxlOiBpdGFsaWM7fQouY20tcy1hYmNkZWYgc3Bhbi5jbS1zdHJpbmcgeyBjb2xvcjogIzJiNDsgfQouY20tcy1hYmNkZWYgc3Bhbi5jbS1tZXRhIHsgY29sb3I6ICNDOUY7IH0KLmNtLXMtYWJjZGVmIHNwYW4uY20tcXVhbGlmaWVyIHsgY29sb3I6ICNGRkY3MDA7IH0KLmNtLXMtYWJjZGVmIHNwYW4uY20tYnVpbHRpbiB7IGNvbG9yOiAjMzBhYWJjOyB9Ci5jbS1zLWFiY2RlZiBzcGFuLmNtLWJyYWNrZXQgeyBjb2xvcjogIzhhOGE4YTsgfQouY20tcy1hYmNkZWYgc3Bhbi5jbS10YWcgeyBjb2xvcjogI0ZGREQ0NDsgfQouY20tcy1hYmNkZWYgc3Bhbi5jbS1hdHRyaWJ1dGUgeyBjb2xvcjogI0RERkYwMDsgfQouY20tcy1hYmNkZWYgc3Bhbi5jbS1lcnJvciB7IGNvbG9yOiAjRkYwMDAwOyB9Ci5jbS1zLWFiY2RlZiBzcGFuLmNtLWhlYWRlciB7IGNvbG9yOiBhcXVhbWFyaW5lOyBmb250LXdlaWdodDogYm9sZDsgfQouY20tcy1hYmNkZWYgc3Bhbi5jbS1saW5rIHsgY29sb3I6IGJsdWV2aW9sZXQ7IH0KCi5jbS1zLWFiY2RlZiAuQ29kZU1pcnJvci1hY3RpdmVsaW5lLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiAjMzE0MTUxOyB9Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/theme/ambiance-mobile.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LmNtLXMtYW1iaWFuY2UuQ29kZU1pcnJvciB7CiAgLXdlYmtpdC1ib3gtc2hhZG93OiBub25lOwogIC1tb3otYm94LXNoYWRvdzogbm9uZTsKICBib3gtc2hhZG93OiBub25lOwp9Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/theme/ambiance.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogYW1iaWFuY2UgdGhlbWUgZm9yIGNvZGVtaXJyb3IgKi8KCi8qIENvbG9yIHNjaGVtZSAqLwoKLmNtLXMtYW1iaWFuY2UgLmNtLWhlYWRlciB7IGNvbG9yOiBibHVlOyB9Ci5jbS1zLWFtYmlhbmNlIC5jbS1xdW90ZSB7IGNvbG9yOiAjMjRDMkM3OyB9CgouY20tcy1hbWJpYW5jZSAuY20ta2V5d29yZCB7IGNvbG9yOiAjY2RhODY5OyB9Ci5jbS1zLWFtYmlhbmNlIC5jbS1hdG9tIHsgY29sb3I6ICNDRjdFQTk7IH0KLmNtLXMtYW1iaWFuY2UgLmNtLW51bWJlciB7IGNvbG9yOiAjNzhDRjhBOyB9Ci5jbS1zLWFtYmlhbmNlIC5jbS1kZWYgeyBjb2xvcjogI2FhYzZlMzsgfQouY20tcy1hbWJpYW5jZSAuY20tdmFyaWFibGUgeyBjb2xvcjogI2ZmYjc5NTsgfQouY20tcy1hbWJpYW5jZSAuY20tdmFyaWFibGUtMiB7IGNvbG9yOiAjZWVkMWIzOyB9Ci5jbS1zLWFtYmlhbmNlIC5jbS12YXJpYWJsZS0zIHsgY29sb3I6ICNmYWRlZDM7IH0KLmNtLXMtYW1iaWFuY2UgLmNtLXByb3BlcnR5IHsgY29sb3I6ICNlZWQxYjM7IH0KLmNtLXMtYW1iaWFuY2UgLmNtLW9wZXJhdG9yIHsgY29sb3I6ICNmYThkNmE7IH0KLmNtLXMtYW1iaWFuY2UgLmNtLWNvbW1lbnQgeyBjb2xvcjogIzU1NTsgZm9udC1zdHlsZTppdGFsaWM7IH0KLmNtLXMtYW1iaWFuY2UgLmNtLXN0cmluZyB7IGNvbG9yOiAjOGY5ZDZhOyB9Ci5jbS1zLWFtYmlhbmNlIC5jbS1zdHJpbmctMiB7IGNvbG9yOiAjOWQ5MzdjOyB9Ci5jbS1zLWFtYmlhbmNlIC5jbS1tZXRhIHsgY29sb3I6ICNEMkE4QTE7IH0KLmNtLXMtYW1iaWFuY2UgLmNtLXF1YWxpZmllciB7IGNvbG9yOiB5ZWxsb3c7IH0KLmNtLXMtYW1iaWFuY2UgLmNtLWJ1aWx0aW4geyBjb2xvcjogIzk5OTljYzsgfQouY20tcy1hbWJpYW5jZSAuY20tYnJhY2tldCB7IGNvbG9yOiAjMjRDMkM3OyB9Ci5jbS1zLWFtYmlhbmNlIC5jbS10YWcgeyBjb2xvcjogI2ZlZTRmZjsgfQouY20tcy1hbWJpYW5jZSAuY20tYXR0cmlidXRlIHsgY29sb3I6ICM5Qjg1OUQ7IH0KLmNtLXMtYW1iaWFuY2UgLmNtLWhyIHsgY29sb3I6IHBpbms7IH0KLmNtLXMtYW1iaWFuY2UgLmNtLWxpbmsgeyBjb2xvcjogI0Y0QzIwQjsgfQouY20tcy1hbWJpYW5jZSAuY20tc3BlY2lhbCB7IGNvbG9yOiAjRkY5RDAwOyB9Ci5jbS1zLWFtYmlhbmNlIC5jbS1lcnJvciB7IGNvbG9yOiAjQUYyMDE4OyB9CgouY20tcy1hbWJpYW5jZSAuQ29kZU1pcnJvci1tYXRjaGluZ2JyYWNrZXQgeyBjb2xvcjogIzBmMDsgfQouY20tcy1hbWJpYW5jZSAuQ29kZU1pcnJvci1ub25tYXRjaGluZ2JyYWNrZXQgeyBjb2xvcjogI2YyMjsgfQoKLmNtLXMtYW1iaWFuY2UgZGl2LkNvZGVNaXJyb3Itc2VsZWN0ZWQgeyBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpOyB9Ci5jbS1zLWFtYmlhbmNlLkNvZGVNaXJyb3ItZm9jdXNlZCBkaXYuQ29kZU1pcnJvci1zZWxlY3RlZCB7IGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMCk7IH0KLmNtLXMtYW1iaWFuY2UgLkNvZGVNaXJyb3ItbGluZTo6c2VsZWN0aW9uLCAuY20tcy1hbWJpYW5jZSAuQ29kZU1pcnJvci1saW5lID4gc3Bhbjo6c2VsZWN0aW9uLCAuY20tcy1hbWJpYW5jZSAuQ29kZU1pcnJvci1saW5lID4gc3BhbiA+IHNwYW46OnNlbGVjdGlvbiB7IGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMCk7IH0KLmNtLXMtYW1iaWFuY2UgLkNvZGVNaXJyb3ItbGluZTo6LW1vei1zZWxlY3Rpb24sIC5jbS1zLWFtYmlhbmNlIC5Db2RlTWlycm9yLWxpbmUgPiBzcGFuOjotbW96LXNlbGVjdGlvbiwgLmNtLXMtYW1iaWFuY2UgLkNvZGVNaXJyb3ItbGluZSA+IHNwYW4gPiBzcGFuOjotbW96LXNlbGVjdGlvbiB7IGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMCk7IH0KCi8qIEVkaXRvciBzdHlsaW5nICovCgouY20tcy1hbWJpYW5jZS5Db2RlTWlycm9yIHsKICBsaW5lLWhlaWdodDogMS40MGVtOwogIGNvbG9yOiAjRTZFMURDOwogIGJhY2tncm91bmQtY29sb3I6ICMyMDIwMjA7CiAgLXdlYmtpdC1ib3gtc2hhZG93OiBpbnNldCAwIDAgMTBweCBibGFjazsKICAtbW96LWJveC1zaGFkb3c6IGluc2V0IDAgMCAxMHB4IGJsYWNrOwogIGJveC1zaGFkb3c6IGluc2V0IDAgMCAxMHB4IGJsYWNrOwp9CgouY20tcy1hbWJpYW5jZSAuQ29kZU1pcnJvci1ndXR0ZXJzIHsKICBiYWNrZ3JvdW5kOiAjM0QzRDNEOwogIGJvcmRlci1yaWdodDogMXB4IHNvbGlkICM0RDRENEQ7CiAgYm94LXNoYWRvdzogMCAxMHB4IDIwcHggYmxhY2s7Cn0KCi5jbS1zLWFtYmlhbmNlIC5Db2RlTWlycm9yLWxpbmVudW1iZXIgewogIHRleHQtc2hhZG93OiAwcHggMXB4IDFweCAjNGQ0ZDRkOwogIGNvbG9yOiAjMTExOwogIHBhZGRpbmc6IDAgNXB4Owp9CgouY20tcy1hbWJpYW5jZSAuQ29kZU1pcnJvci1ndXR0ZXJtYXJrZXIgeyBjb2xvcjogI2FhYTsgfQouY20tcy1hbWJpYW5jZSAuQ29kZU1pcnJvci1ndXR0ZXJtYXJrZXItc3VidGxlIHsgY29sb3I6ICMxMTE7IH0KCi5jbS1zLWFtYmlhbmNlIC5Db2RlTWlycm9yLWN1cnNvciB7IGJvcmRlci1sZWZ0OiAxcHggc29saWQgIzc5OTFFODsgfQoKLmNtLXMtYW1iaWFuY2UgLkNvZGVNaXJyb3ItYWN0aXZlbGluZS1iYWNrZ3JvdW5kIHsKICBiYWNrZ3JvdW5kOiBub25lIHJlcGVhdCBzY3JvbGwgMCUgMCUgcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjAzMSk7Cn0KCi5jbS1zLWFtYmlhbmNlLkNvZGVNaXJyb3IsCi5jbS1zLWFtYmlhbmNlIC5Db2RlTWlycm9yLWd1dHRlcnMgewogIGJhY2tncm91bmQtaW1hZ2U6IHVybCgiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFNZ0FBQURJQ0FRQUFBQUhVV1lWQUFCRkZVbEVRVlFZR2J6QkNlRFZVLzc0LzZmajlISWN4L0ZSSHg5SkNGbXpNeUdSVVJoTFpJa1Vzb2VSZlVqUzJGTkR0cjZXa01oTzlzbStTOG1hSmZ1K0pjc2crL28vYytaNHovdDk3L3Zlenkzeit6OGVrR2xuWUlDRy9vN2dkayt3bVNIWjF6NHBKSXRxYXBqb0tYV2FobThObVY2ZU9UYldVT3A2LzZhL1hJZzZHUXFtZW5KMmxESHl2Q0ZaMmNCRGJtdEhBMDQzVkZoSHdYeENsV21lWUFkTGhWMDBCZDg1Z284Vm1hRkNrYlZremxRRU56ZkJEWjVndE43SHdGMEtEclR3SjBkeXBTT3pwYUtDTXdRSEtUSXJlWUl4bG1oWFR6VFdrVm0rTFR5blpoaVNCVDNSWlE3YUdmakdFZDNxeVhRMUZEeW1xYkt4cHNwRVJRTjJNaVJqTlpsRkZRWGZDTkZtOW5NMXpwQXNvWWptdFJUYzVhand1YVhjNXhyV3NrVDk3UmFLekFHZTVBUkhoVlVzRGJqS2tsemlpWDVXUk9jSndTTkNOSSs5dzFKd3Y0WmIycjdsQ01aNG9xNUMwRWRUeCsyR3pOdUtwSitpRmYzOEpFV2tISm45RE5GN21tQkRJVHJXRWcwVldMM3BIVTIwdFNabnVxV3UrUjNCdFlhOFh4VjFITzdHeUQzMlVrT3BML3lEbG9JTkZUbXZ0SWQrbm1BanhSdzQwVk13Vktpd3JLTEU0Yks1VU9WbnRZd2hPY1NTWEtySkhLUEplZG9jcEdqVnovWk1JYm5ZVVBCMTAvZUtDcnM1YXBxcGdWbVd6QllXcG10S0hlY0pQamFVdUVnUkREYVUwb1pnaENKNnpOTVE1WmhEWXgwNXI1djJtdVFkTTBFSUx0WFVzYUtpUVg5V01FVW90YWdRekZiVU5ONk5VUEMybm01cHhFV0dDak1jM0dkSkhqU1Uya09STEsvSkdTcmtmR0VJam5jVS9DWVVuT2lwb1llbXdqOHRTVDlOc0ptQjdUVVZYdGJVdFhBVEpWWlhCTXZZZVRYSmZvYmdKVVBtR01QL3lGYVdvbmFhNkJjRk8zbnFjSXFDb3pTWm9ab1NyMWc0ekpPenV5R254VEVYM2xVRUo3V2NaZ21lOGRkYVd2V0pvMkFKUjlEWlUzQ1VJYmhDU0c2eWJTd042cXRKVm5DVTJzdkRUUDJaSW5PdzJjQlRycXRRYWh0TlpuOU5jSjRsMk5hU21Ta2tQMW5vWlduVndrTG1kVVBPd0xaRXd5MlozUzNSKzRySUc5aGNicFBYSEZWV2NRZFprbjJGT3RhM2NLV1FuTlJDNWcxTHNKYWg0R0N6U1ZzS25DT1k1T0FGUlRCZWt5eXJ5ZXlpbGhGS3ZhNzVyNE1jMGFXYW5HRWFUaGN5MzFzNDM5S0t4VHpKWVk1V1RIUFUxRnRJSGpRVTNPaXA0eGxOemovbEJ3MjNkWVpWbGlRYTdXQVhmNHNoZXRjUWZhdEkraldSREJQbXlOZVc2QTFQNWtkRGd5WUpsYmEwQklNOEJadTFKZnJGd0l0eWpjQU1SM0swQldPSXJ0TUVYeWh5cmxWRXgzdWk1ZFVCam1CL1EzQ1hXODVSNG1CRDBzN0IrNHE1dEtVak9sYjlxcW1oaTVBWjZHRklDNUhYdE9vYmRZR2xWZE1WYk5KOHRvTlRGY0h4bm9MK211QmFnY2N0alduYk5NdVIwMHVJN25RRVN3ZzVxMnFxcktXSWZyTlVtZVFvY1k2SHV5eEpWMDJ3ajM2dzAweWhwbVVGZW52NHA2ZlVrWllxTHl1aW54MlJHT2poQ1hZeUpGODRvaVUwMFlNT09oaHF1TmRmYk9CN2dVODhwWTR4Sk84TFZkcDYvcTJ2b2VCNFIwNHZJZGhTRTQweFpPYngxSEdHSi9qYTBMQnRoRkluS2FMUFBGenVDYVlhb2o4SmpQTUU4eW95eG82emxCcWtpVVpZZ3EwME9ZTXN3YldPNU5HbXEreGhpcHhITFJXMjlBUmpOS1hPMHdSbmVhcjhYU2c0WEZQTEtFUFVTMUdxdnlMd2l1QlVvYTd6cFowbDV4eEZ3V21XWkMxSDVoNUZ3VThlUTdLK2c4VWNWWTZUTVFyZVZRVC84dVE4WitBTElYblNFYTJwWVpRbmVFOVJaYlNCTllYZldZSnpXL2gvNGo0RHAxdFlWY0ZJQzUwMTlWeWk0VGhQcVNGQ3pqR1dhSFFUQlU4cTZ2clZ3Z3hQOUxrbTg0MGltV0twY0xDallUdHJLdXd2c0tTbnJ2SENYR2tTTWs5cDZsaGNrZlJwSWVpcytOMlBpc3pUK21GTHNweUdsZVVoRHdjTHJacW15ZXlseHdqQmNLSEVhcHFrbXlhbmd5TFpSVk9pandPdENZNVNzRzV6TDBPd2xDSjR5NUt6bkYzRVVORERyaW53aXlMWlJ6T1h0bEJiSzVJVEhGR0xwOFEwUjZhYjZtUzdlbkkyY0ZyeE95SHZPQ0ZhVDFIVGhTMWtyakN3cVdldXJDa2srd2lsbGhDQytSU1puUlhCaVphQzVSWFJJWllLcDJseWZySHdpS1BLUjBKRHpyZFUyRUZncGlkYXdsRkRSNkZnWFVNTmErZzFGWTNiVVFoMmNMQ3dvc1JkbnVRVFMvUytKVnJHTGVXSXZ0UVV2T05KeGxxU1FZWUtwd29OMmthb2NMamRWc2lzNE1rODBFU0YyWXBTa3p3bGRqSGtqRkNVdXRJL3IrRUhEVThvQ3M2eXpMM1BoV2lFb29aZEZNa3ltbGFzNEFjSTNLbW9NTU5TUTN0SHpqR1dDcmNKSmRZeVpDN1FGR3dqUkw5cCtNclJrQUdXeklhV0NuOVcwRjNUc0swMWMyWnZRdzBieXZ4dVFVMHIxbE0wcUpPN3dXMGtSSU1kRFR0WEVkemk0VkloK0VvSUhtMG1XdEF0cENpeGxhYmduODNmS1RJN2FuSmU5U1Q3V0lLMURNR3BRbVllQTU4SW1WNmV6T0dPeksyS2dxMDFwZDYwY0tXaVVpOUxpZXZiLzB2SURQSFEwNUt6dDRkZFBja1FCUXRvYXVyanlIbmVrL25LenBRTHJWZ0tQaklraDJ2NHV5ZXpwditYb283ZlBGWGFHRnAxdmFMS3hRNHVVcFFRUzVWdVFzN0JDcTR4Ukp2N2Z3cFZ2dkZFQjNqKzYyMGhhT3VvY3FNaFdkNlRUUEFFeCttZEZOR0hkcmFuRmU5NVdyV21JdmxZNEYxRGxlMkVDZ2M2Y3RvN1NyeXVxR0dHaGEwdEZRNVY1M21pZ1VLbWc2WEtBbzRxUzNtaWsrME9acEFoT0xlWktpY2FjZ2FZY3l4NWh5cFlRRTAyWkE0eGkvcE5oT1F4UjRrbE5LeXFhY2orbXB4bkxUbm5HU284NSsrM1pDWnE2bHJaa1hsR0VYM28rQzlGaWVjY0piWldWRmpDMFlvMUZabkpob1lNRm9JMWhFWjlyNmh3Zzc1SHd6Qk5oYlpDZEpFZkp3VFBHekp2YUtJbXcxeVlYMUhEQW1wWFIrWkpRL1NtZ3FNTlZRYjV2Z2FtR3dMdHQ3Vnd2UDdRazF4cGlNNXg1Q3l2OTNFMDZNWm1nczBOeWEyYXpJS09ZS0NHQlFRVzk3Um1oS05LRjAySlpxSEVKNG81OHFwN1g1RWNabWM1NnRyWEVxempDQloxTUZHUjg3UWwydFNUczZDR3hTMDVQVHpSUW9ya2J3N2FLb0tYRkRYc1lXNDJWSmloL3ErRlAyQmRUekRUd1ZxT1lCMTNsaU01MHZHN3d5MjhxYWd5dUlYTWVRSS9PcXE4YmNuNXdKSTUweEgwMENSbnR5ZnBMMVQ0aHlkWXBvWGdOaUZ6b0lVVERabkxOUnpoNFRCSHdiWUdEdlpreG1seUpsb3lyNnRSaWhwZVVHOTRHbkt0SXpuUkVGMHR6SkcvT09yNzNKQmNyU2gxazZXdVRwcmdMVSttblNHbnY2WmdlME5OeitrVERkSDhudUF1VGRKRENOYjIxTENpSXVxbFlicUd6VDNSQW9ab2ZRZmpGYXprcWVOV2RZYUd2WVRNMDAxRVcyb0tQdlZrMWxkVUdTZ1V0SEZ3aktNMWg5am5GY215NWxDaG9MTmFRTUdHRHNZYktpeGxhTUJtbXN4MVFqQ2ZmbHdUZk8vZ2NrVzBydVozanVnS1IzUjVXOWhHVVdxQ2d4dUZnc3VhQ0hvcm90R0t6R2FlWkI5RE1zYVRuS0NwTXR3VHZPemhZazByZHJBcktDcWNhV21WazErRjM3MnVyMVlrS3hnYXRJOFFmZTFnSVg5d0U5RmdTOEVTbXVBQklYblJVYkNhcGNLZStuTzdzbENsU1pGenBWL0xrTG5jRWIxcWlPNDJmUzNSODU1U3UybUNMaDYydDFTWVpaWVZtS3dJSGpSRUYydWloVHpCMjBKT2t6N2RreHpZUW5LMFVPVTQ5NHdoK1ZXUmM2VW4ya3BUYVZnTERGRWtKL3VoelJjSTBZS0dncEdXT2xvY0JVL2E0ZktvSi9wRWFOVjZqaXAzK0VzOVZYWTA3OHJHbm1BZGY3dDl5bFBYUzM0UkJTdVlQczFVZWNaVFU3OFdhbmhCQ0hwWjVzQW9UejBMR1pLalBmOVRSeXBxV0VpVHZPRmdsTDFmQ0VZM3dZLysrcmJrN0M4YldlYkE2cDZvbTZQZ09MMmtwNDRURkpsVk5CWGFlMnJxcWRaenRPSnBUODdHUXNFOWpxQ1BJZTlWUmVadVEvQ0lnYWNzeVpkQ3BJU2NTWXFjWms4cituc3lDemh5ZmhPcUhHT0l2ckxrbkM4d1RwRmNhWWlHQy9SVTFOUmJVZVVwb2NRT25rUnBHT3JJT2NOUngrMXVBMFVyemhTU3QrVnlTM1NKcG5GV2t6TkRxT0ZHSVdjZlI4NkRubUFSVFExSEtJTDMzRXhQaWVtZU9oWVNTanpsU1VaWnVFNFR2ZW9KTG5CVU9Gb2Y2S2l5c0NibkFFY1pnY1VOVERPd2txV3UzUld0bUdwWndsSGhKRU5kWjNtaUd6MGxKbHNLbmpid3FTSFFqcHhuRkRsVExMd3FKUE1aTWpkN0tyemtTRzdWc3hYQlpFK0Y4WVprYjAxT2UwMHl5Uks5cHNoNVNZaDI5eVNQS0JvMnlsTmh0N1prWm5zS2VuaktOSnU5UE5FeVpwYUNIdjRLdDZSUXNMdkFWcDdNOWtJaW1tQ1V3R2VXcUxNbUd1SW90WU1tV05wU2Foa2hadzlGcVpzVm5LSmhzakFIdnRITXNUTTlmQ0kwNkR4L3UzdmZVWENxZnNLUmM0b0ZZMmpNc29vLzdESkR3WjFDc0lLbkp1K0o5bGRrcG1pQ3hReDFyV2pJK1Q5RndjV1d6T3VhWUgwSGo3a2xOUlZXRVFwbWFxb3Nha2lHTlRGSGRqUy9xblVkbWYwTkpXNXhzTDBIaGltQ0NaWlNSem1TUFRYSlE0YWF6dEF3dFpub2FiZWJKK2h0Q2FaN0NtNTM1QnlvcVhLYlgxV1JjNEVoMk1rUlhXekltVmM5NkNqNFZkT0tWeFI4NFZkUXNJVU04UHNvb3UyYnlWSHlaRnVxN084b3RiU1EyVUFvZUVXVHVkQVRMR1NwWnpWTGxYVmtQVTJKYysyN2xzdzJqbWc1VDVWaGJlRTNCVDA4M0s5V3NUVGtGVS9Pc2kwckM1bFJscHdSSFVpZXNOUzBzT3ZtcUdNTDFhUmJQQXhUSkQ5Wkt0eHVvYitoaGw4Y3dZR1dwSjhudWI3dDVwNmNvWWJNb3ZaMUJUZGFLbjFqWUQ2aDRHRkRORnlUL0txZTFYQ1hwaFhIT0tMWm11UlNSZEJQRWZWVVhRekptNVlHUEdHSmR2QUVyN2hITmRHWm51QnZycGNpR21vcE9MZjVOMHVWTXkwRmZZVG9KazkwdVVDYkp1cGFWcE81M1VKWFIyYlZwb1UwMFYyS09vNHpNRnJCZDBKdHoycGEwY2xUNVE1TDhJcFExNzdtV1FlalBNRUpodVFqUzEwcmVmNkhIamRFaHkxUDFFWVI3R3RPMHVTc0tKUVlMaVRuRzFyVlNjajVseWF6cHFXR2w1dUJiUldsN202aXhHT09uRXNNSlI3ejhKMG42S01uQ2R4aGlOWVFDb1o2Q21ZTG5POG9tQzNNa1czYmt0bFBtRXQvVlFRSGVqTDMrZE9FNUZsUGRLL01xOGhaeHhKdEx5UnJlcExUaFlLYkxaeGtTYjVXNTJ2WXhOT2FPeFVGMHl4TVVQd0JUWXFDenkwMVhheVlLMHNKeVdCTHFYME13VTVDem95bVJ6VjBFamplVWVMZ0RwVG82aWo0MlpBenZEMDFkSFVVVFBMVTk2TWRMYkJNRThuRkJuN3pKQ010SmNab2tuOFlvcVUwRlM1V0ZLeW5pSG9iZ3VNY21XOE4wWGtXWmpreU4zaHFPTXRTMDhyKy94VEJ3cFpTWjNxaVZSWDhTek1ISGpmVU5GamdIRVBtWTlQTDN5a0V6eGtTcmUvMVpENnovTnV6bnVCMFJjRTFUV1RtOXpSZ2ZVV1ZKaUc2eXJ6Z21XUFhDOEVBUjRXeGhsYWQwWmJnUXlFejNwRzVSVkV3d0RKSDJtZ0twamNUaUNPem4xbGZVV0FORmJaMkJBOGJhbG5Fd2VKQzlKMGl1YWVab0kraXBwRkN6dEVLVnZja1IyaWljZTFKdmhWeXRyUXdVQVpwZ3N1YkNQYVU3eFVlOXZXbmFPcGFTQkVzcGFseWtoQzliVWxPTXBUNDJaSGNhNmh5cnFLbXcvd01SOEg1Wm1kRm9CVkpiMDNPNFVMMHRTTm52SWVSbWtyTFdxcnM3OGdjckVuMnRwY2JvaDBVUE9XM1VVUjlQTWs0VDRubk5LV21DamxyZWZoQ3d4Uk56dGZtSVFWZERFbHZTNG0xL1d1T3Vqb1pDczVYVk9qdEtQR29rSnpzWUN0RllvV29uU1BUMjFEaGVVL3dXaE0xOUZjRWx3cU5HT3NwOVE4Ti9jd1hhaU5EMU1tZUwxUTVYUk90WVlnR2VGcTFhVE1zb01tY3JLalFyT0ZRVFExZm1CWWhtVzZvOEpramM3aURKUlRCSW81a2dKRDV5TUVZQTNzckNnN1ZGS3dpVkprbVJDYzVvaEdPS2hzWU1uL1hCTGRvNXRhWmpsYjlZQWxHV1JpbXFiQ3NvWTdIRkFYTGE1STFIUFJ4TU1zUURIRmtXdFJObmlxVDlVRWVOamNFN1JVbHJDSjRSMkNTSnVxbEtIV3ZKWGpBVU5jSVRZa2VudUJSQjg0VGJlZXBjcVRqM3paeUZKemdZUWRIbnFmZ0kwZGRVd1M2R3FXcHNLV2hqcTljVjB2QkFFTU4yem5xK0VCZklXVCtwQ2xZdzV4c1RsSlU2R2VJQnNqR21tQU5UekpaaUlZcGdyTTBPYThaTWpkN05QODdqeGhxR09oSmxuUXRqdVFwQis4YUVFMDB3WkZ6blNKUHlIeGdIM0hrUE9zSkZ2WWs4enFDSHpUczFCWU9hNEozUEZVK1VWUlp4bEhETTRZYXZsTlV1TW9SdmVpWkEyZDdnck1OYzJnK1JiU0NFS3ptZ1lzVW1XbWF6Rkp5b2lPWjRLbnloS09HUnpXSmEwK21veVY0VFZIRHpuNTFBd3RxYXBoZmsvbFJRMDhGWDFpaXF4VEIva0x3ZDBWeW5LZkV2STZjZDRYTVY1Yk1oWjdnWlVXVnpZUTZObTJCWXp4SmJ3M2JHdGhFVVVNZmdiR2VvcmFlNkR4SHRKb1o2YWxoWjAreXRpVm9LMVI0ejVQVHJPRUNUL1N1Z3NlRU9sYjFNTU5SNFZSTmNKeStWMUhnOU9OQ2xTWkZaamRIbGM2VzZGQkxkSmphMk1DNWhocHUwREJZRVkxVEZHd2lGQXhSUkNzWWtpTTlKUmIwSk5NVmtXNkNaWVQvMkVpVEdXbW84aytoNEZoRE5FN0J2cHBvVFNGbm1DVjV4Wkt6dmNDZERvN1ZWUG5JVStJK1JjNjhqdUFwQzkwTXdjRkNzSjVoRHF4Z1NjWUtyZXJ1eVF3VHFyem9xRENtaFdpNEliaEIwWXJ0M1JHYTZHZkR2NTJyS1hXaGgyOGR5WmFXVXZjWmVNVEJhWm9TR3lpQ3RSVTVKOGl2aWlvSGFFcnM3SmtqNjFzeVZ6VFRnT2NVT1E4YnVGQlRZV2RMNWczVDRxbHBlMCt3dkQ2M2hlQVhSZkNDSWVkOVJiQ3NwMkNpSTdyYVVPWU9UVTEzTjhQTkh2cGFHdmF5bzRhM0xMVDFsRHJWRVBUMnpMVWxoZUIxUitaVFJmS1dKK2Rjb2NMSmZpMTF2eUo1MWxMcUowV0Q3dFJ3cnllemppVjVXMjh1Sk85cXlrelg4SkRlMmxIbC85b3lCd2EyVU1mT25ncFhDaXh2S2RYVGszd3JzS21pVllkWklxc29XRUVSamJjVU5EdWlhUW9tR29JYkZkRUhtc3lXbnVSK0llcmlLRFZMbmxhd2x5TkhLd0tsU1U2MzFQS2VwOEo0UStheWprU0xLWUxoYWxOSGxZdnR0YjZmSG0wcDZPQXBzWjRsMlZmZHFaa2p1eXN5NnlzS0xsY2tmMUtVdXRDVHMzOWJtQ2dFeXlvYXNJV2xWYU1GN21nbVd0QlQ4S29sNXhwSDlJR2xsbzhjSmRvcGN2WjJzSW1sRG1NSWJ0RGszS0lwZU5pUzA4bFF3MTFORlBUd1ZGbFBQNnBKMmd2UmZJN2dRVWZtTkF0ZjZHczB3UXhEc0tHbFZCZEY4ckNhM2p6ZHdNYUdIT3NJdHJaazdoQXlPenBLOVZTMDZqNUY0OWIwVk5HT09mS3MzbERUb01zTUJlOVpXdEhGRWd4VEpMczdxcnlnS1pqVW5tQ1lvZUFxZVU2anFXdUxKdXA0V2doT2R2Q1lKbnJTa1N6b3lSa201TTJTdFF3Vmx0UGtmQ0FrNTh0RVQvQ1NnKzhNVWVjbW90TUVuaEJLZldCSVpzZzJpaHJ1TUpRYW9JbSt0a1RMS0Vxc3BNaDAwdzk1Z3ZGQ1FSdER3VFQxZ1ZERFNFVmRsd3FaZnhvUVJiSzBnK3RiaUJaeHpLbHBucHlwZWpkRHdUYWVPdm9yTWsvSUpFMTBoOUNxUmUyOGhoTGJlMHBNc2RTd3Y0WmJoS2l2bzJCakRXZkw4VUtKZ2Vhdndsd2I1S2x3aHlFNHU0WGtHRTJ5dFpDem5LTENEWlpxNDJWelQ4SExDcnBydUZiSWZPSUlObWgvcUNkWjFaQmM2NWtMSFIxQmt5ZjV6bjZwTjNTdkdLSWxGTkdwbGhyTzlRU1hhbkxPTVFUTENhMFlKQ1JyQ1ptL0NabXJMVG03V3pDSzRHSkRpV1VkRmVZeDFMQ0ZnM05NZDBYbUN1RjNZNXJJVExEVXNZUzl6b0hWenduSm9ZcFNUUW9PYnlFenI0Y0ZCTnFZVG9wb2FVL3dreUxaMmxQaFgvNVk5NXVseEdUVjdLamhXck9aZ2w4TXlVVWFmallyYU5qTlUxTjNJV2NqVDVXeldxand0b2FySFNVT2JHWU8zR0NKWnBzQmxuSkdQZDZaWUx5bDFHZENBMjYyNUl3d0pEUDhHVUt5bWJ6dXlQbFpsdlRVc2FVaDV6RkRoUldGelBLS1pMQWxXZGNRYk9iZ0Y5dE9xT3NtQjFkcWNxWUptV3N0RmJaUlJJOXBvb2xtcWlMblUwUE92eFNjcGFoMmlTTDVVSk56Z1NjWTUrQXVJYnBPMFlEM05DVytkTE1zekZTZEZDV0dxRzZlVnEydVlWTkRkSUNHRDZXN0VQUldaRVk1Z3BzRTlyVWtTM21panp6Sm5tNlVwVUZYRzFoQ1VlVm9TNVdmTmNGcGJsRUxMMnFxckN2TXZSZmQ0NW9hbHZLVTJ0aVE2ZVBKT1ZNUlhhc2U5aVR0TEp6dFB4SktMV3BvMkNSRGNKd24yc1dTTEtJTzFXUVdOVEN2cFZVdk9aaGdTQzQwSkQwZE9jdGFTcXprQ1JiWHNLbGIxMU9pcDZQQ0owSXdTSk0zMWozYWtSeGxQN1J3bjZhR2FVTDBxaUxuSmt2QjN4V1oyK1ExVGZDd3BRSDNHMG85MlV6bVg0by9vSk5RTU1TUWM1NDd3VkhoZGsrVkN3MDFERllFblR4elpLQW03NFFtZU5OUjF3Nld6RWhOSzE1Vkp6dUNkeFE1M2RSVUR3czVLdndnQk1PRWdwY1ZOZTBoWkk2UlhUMUpkMGN5ajVuc2FFQUhnVm1HYUpJbFdkc2M1VWkyRWxyUlI2anJSQXR0Tk1FQUlXclRERnVia1phb2s3L0FremZJd2Z1V1ZxMGpIenVDSzRRYWJ0TFVNVlBCM2tKMG95SFRTVkZscU1BTGlsSmYyUmY4azVhYUh0TWZheW9jTEJTOEw4OW9Lb3hwSnZuQWtEUGEwcXA1REFVVEhLV21DY250aGxvdThpQ0thRkZMSFdjSU5kMW55SXdYcXJTeE1ObVNzNkttb0wyUXJLdVd0bFE1VjAxMjB4UTV2UnlaUzFyZ0ZrV3doaU93aXVRYlIwT09WaFFNOWlTM3RpWHA0UmF3UlBNcDV0RGxldE9PQkw5NU1wTTAxZFpUQk05cGtuNXFGMDEwckllSEZjRlpobVNHcFlwVHNJNm53aHFlNUM5eW5obHBwNW9waHVSYjZXY0pGbGRrVm5WRXd3eFZmclZrdm5XVXVOTENnNWJnYm9GSFBEbERQRG1uSzdoVXJXaUliamFkRGNsdWpsWmNhb2tPRnVwNFJpMWthY1Y2am1ycksxaE45Ykd3cEtFQlE0UTZEdklVWE9tbzZVNUxxUU02RVB5aUtOalZrUG5Ka0RQTkVheGhpRmF5NUV4VzFOWFZVR3FjcFlZZFBjR2lDcTd6L1RTbGJoTDRwcGxXWEtkN05aTzVRUUZyZWZoUlFXL05IT3NxY0lnbGM0VWhXa2xSOEswUXpiQXcwOENCRG5wYmdxWGRlRC9RVXNNNFJaWERGQlc2V0pLZS9tRlBkSDBMdEJnaXE1N3dGTHpseVF6ejgycVl4NUQ1V0pQNXlWSkRXMDFCZnlIblM2SEtPL3JlWnFJZDFXR2E0SGtoMmtXb2RKOGk2S29JUGxBajJoUHQ3NkN6WHNWUjZrb1BSeldUZktxSWVudGF0WXBRdzJtZTRBQTN5MUtpbmQzU3dvT0taRGNGWFR3bDl0V1U2bWZnUms5ZDcxc0t0bE53cmpuWXc1dEM1bjVMZEtpR3J5M0pLTmxIRWQzb2FNQ0ZIcmF6QlBNcC91TkorVjdJdWRjU2JlT0lkalVFZHdsMFZIQ09abzV0NllsdUV1YUM5bVFlTWdTZk95S25ZR0ZIY0llUTg0eVFXYnVKWUpwWnc1Q3pnbERIN2dLbldxcU05WlRhWGNOMFRlWWhSODRlUXRKVDc2SkoxbFJFZTdXbm52c01tUmM5RlE3U0JCTTltVjNsQ1VkbUhrL1MyUkFNdDBRakZORnFRcFdqRFBRMDFEWFdVZERCa1h6aUtQakdFUDNWUCt6SVdVMnQ3aW00MUZPbG95V3puL0w2ZGtVeTNWTERhWjZhcHBnRExIUGpKRXN5dkpuZ1dFUFV5VkJpQWFIQ1RFWHdyTHZTRWJWMWUxZ0tKbmlpY1dvckMxTVVyVmpCM3VEaEpFL3dnU096azFEWHBrMGs3M3FDTTh4dzJVdkQ1a0ptRFVmT29tcU1wV0NrSlJsdktYR21vZUJtMThVU2pWSWswNFNDbHhUQjZZcmdMQVBMV1lLOUhMVXQ1Y21jMHZZRVM4R25UZVJjNnNrWmJRa1dkeFJzSWN5QlJ6eDFEYlRrOUZiVTBjYVRQT2dKSGhKS25PR0lWaFFxdkttbzBsbFJ3OXNhYnJaa0R0ZGczUHFhS2k5b2F0alk4QitHMzcxcGFNZzYrbVpGTk50UTA0bVdCcTNyWUxPbXRXV1FwOEtKbnB5OURkRmVuc3lqZHFaK3lZNDBWSmxIOHdjZEx6QzhQWm52SE1GVVRaVXJEVGtMeVFhR3VzNVg1THpwWUFmM2krZS9abGhxR3FXaGg2T3U2eFRSOVo2b2k1QVpadHA3TWoyRUVtOG9TcHhpWVpDSFUvMWZiR2ROTk5SUm9aTWhtaWxFYjJncUhPRUpEdFhrSEsvSm5HNklydmJQQ3dWM05oT05WZFMxdGhCTXMxVDRRT0JjVFdhMkl6aE1rMm5XNUt5bjl0WFV0cHY5UnNHMm1zeGsrWnNRelJRYWNKbmNwZ2tlMCtUOHk1RnpqOEJpR283WGxKamFUSWxwUXM3S0ZqcHFHbkt1b3lFUGVJS25GTWtaSHZvcGdoODF5U3hORld2SldjS1JzNzBqMkZPVDAxMklsbEVFTzFuNHBEMTUxM1lnMnNzUVBPVGhPa3Z5cnFIVWRFWE9TRXNpaG1CYlRiS1gxa0xCUFdxV2tMT3FKYmpCM0dCSVptb2E4cVdsNENHL2laN29pQTcyWkw3VEpOZVpVWTdrRlFmdERjSEhsdUJ6UmJDZWd6TXRyUmpWUXBYMmxnb1BLS0xKQWtjYk1sMDFYSzJwN3loTDhwQ0JiUTNCTjJhdkpnS3Z0dGNyV0RLM0NpVU9WeFE4WlArcHFYS3lJeG5tQnltQ2c1dkpqTmZrUEs0K2M4Y0lmSzhvY1Z0N2ttZmQvSTVTUjFoS3ZDelV0YitsaGdjMDBaYU82Q3loSVFQMVV2NHlJWmpsb2FkNzJQWFgwT0lKdm5GVSswWmY2TWhzSndUZlcwcjBVd1FmVzRMTkxabDVISzI2MUpDWjRxbkJhQXJlVkFTM1dyalYwTEJuTkRVTk5EVG9DRWVGZndnY2I0Z09FcUxSaGlyV2tleHJDRVlLVlY3MTFETFlFRTFYQkVzcDV0cFRHam9ya29tS1lGOUZEWHY3ZlIzQkd3YmV0dFN4bnlMNTNNQlBqc3hEWmpNaCtWVVc5TlJ4cTFEaFZrK0ZTeFFjYUdqVjlQYXd2NmVHQnl3NXF6b3k3eGs0UnNPU2hxakp3V0tlLzFwRUVmemtvYmVEL2RRSm1wcWVkY3lCVHkyc3I0bkdOUkgwYzBTUFdUTHJxQWMwT1FjYi9nZW1LZ3F1Y1FUN3lTV0tDbjJFVW90b0N2cFpjdDdSTzJzeS9RVzBJV2NYZDdwUVJReVpWd1QyVVNSTzg3dWhqaW9UTEtWMmJycE1VY01RUmJLSC9OMlQrVWxUcGFNbHM2Y21jNkNDTnkzSmRZWVNVenpKUTRvU0Qzb0tMbmNVTE9pSnZqQkVDMm9xbkNKa0psdUNZeTJaUTVzbzlZWWxaMVZMbFFVMW1YRVcxalpFUndqL01VU1JjMjRUZGV4bHFMS2ZRQnREVFNjSlVWOEZzelhCRVk1a3RwRDVVcjloWUI0TmIxaWlrdzNKb1lwa0tYK1JvZFJLRnQ1M01NdVJuS1NwWTMxUHdZYUdhSUxoM3d4Skd6OVRrVFBFRVR4b0NXWnJndk9sbXlNenhGRXdWSkU1eFpLenZ5SjRXeEVjMTZHZDRYZTNXZXE0WEgyaktSaWtxT2tHUTg3aFFuQzd3Qm1HWUxBbmVzWDNNK1M4N2VGQVRhdXVOK1Fjcmg3eEl4WEpiVUlkTXczSkdFM3lsQ1d6cmllYXFDbjR6aEdNMTlUUTN6MW9IMUFYK3BXRXFJYzd3TkdBa1VMQm8vWnhSYVY5Tk55aDRCcjNyQ0haemJ6bVNmYXdCTDBkTlJ3cFcxa0s5bXhQWFI5cG92Y2RyR1NaSzljMmsweHdGR3pqdW5pQ3RSU1pDWjZjY1o3Z2FrdG1nQU90S2JHL0puT2tKcmpjUVRkRk1zeFJRMmNMWTNXVElybEN3MWVXS244UjZwdnQ0R0ZEc28zUW9MNGEzbkxrM0c2SnJ0TUUzZFNlbnB4N1BORlRtZ2EwRWFKVExRMDYxc0VlUW9XWGhTbzlMVFhzYVNqb0pRUlhlWkx0RGNsYkNyWXpmekhIZWFLakhDVk9Va1FITzNKZUVlcHI1Nm1oaXlhWVlLampOVStGZWQxd1M1VmxoV1NxSS9oWVVkRE9rYXhpS2Vob3lPbnJDVjV5Qkh0YldGcVRIQ0N3dHBEY1lvbGVzVlI1eVV6VFpCYjNSTk1kMGQ2V1ArU3ZodUJtUmNHeG51UXpUOTVJQzI4NWNyNDFjTEdRNmFKSmhtaTRUTUdlbXB4ZWltQlJRdzF0RktWKzhqZDZLdXpvU1RxcUR4elJ0cFprdXJ2S0VIeGxxWEtSSWpqZlVOTlhRc05Pc1JTY29XRkxUK1llUlpWRDNHUk4wTWRRY0txUWpIRE1yZEdHVnUzaVlKcFF4M1dHVXZmYm14d0ZmUjIwV0JxMG9ZWTdMTUZoaGdZdHI4anBhRW5hT3pqYXdXV2FUUDhtTXIwdC9FUERQb3FjbnhUQkk1bzU4TDd1b1duTXJwb3FQd2dWcmxBVVdFK1YrVFFsOXJhd295UDZRR0FsUXcyVFBSWCtZU2t4eUJDOFo2amhIa1hCZ1FMN1dJSTNEVkZuUmZDckJmeGV3djlENnhzeWp5czRWa2hXYjlwVVU2MjdKbGxWMFlETkhNa3UvbGROTU1YREVvNGFGbkFrazRVNmZyTkVVNFhnWlVQbUVLSFVsNDRLcnptWWFtakFiaDBKRnZHbmFUTFB1MXM5alBDd2pGcFlpTjd6MURUT2svbmMwN0NmREZ6bUNmN2krYmZOSFhoRHRMZUJYelRCVDVya012V09JeHBsNEVNaDJMR0pCdTJzeURuQUV4Mm5hRWhIRFdNTXpQWkVoeWd5UzFtUzVSVEpyNVprb0tiRVVvWXFyMmtxZERVRTh6dEs3T2FJbnRKa0ZySUVDd3Y4TEpUYVZ4NVhKRTg2Z284ZEZlWjNGTjNyamFiQ0FZcG9ZRWVDOXp6SlZVTEJibVpoRHlkN2tvMDl5ZHBOWjNubTJLZWU0RlBQWEhuWUVGMW5xT0ZFQzA4TFVWY0R2WVhrSkhXOGdUYUtDazlZR09lSUpocWlFNFRvUEVlcGRwN0lXRmpkd25XYXVmR013SkpDTXRVVFRCQks5QkdDT3kydEdHckpUSEl3eUVPenA2YVB6Tk1PdGxaa0R2Y0VXcFA1U1ZOaGZrdkR4aG1TYXpUSlhZck05VTFFMHh3RlZ3cVpRd3pKeHc2K2tHR0dVajJGZ2xHR21uYjEvRzUxdWRSU01ObFR3NkdHbkNjVXdWY09wbXNxVEhhMDZvNzJzdzFSTDAycDl6MFZibk1MT2FJWDNRS2FZS1NDRlF6QktFVU5IVFNjNDhrNTNSSDl3eEdNdHBRYTVLampXMFcwbjZYQ0NDRzR5eE5OZGhRNFI0bDFGZisyc1NkNlVGSGlJRU95cXFGZ1QwMW1FVU1EK2pveTc1alBoT0Erb1ZWTG0zMDlGUjR5Vk9scDRSaExpU2NObVNtYVlGNVB3MFNUck9Jb1dNU1IyVWtSWE9NcCtNNFNIVzhvOFpvaTZPWmdqS09hRmFyOHpaRHprV3p2S09qa0tCam1DWGJ5OEphaGhqWFVMWTRLbHpnS0x2QXd4VkdodnlkNHp4QjFkOVQwcGlhem1LTENWWlk1c0tpRDB5MlpTWXJrVUVQVWJJaytkbFE0U0pIVFI1MGsxRFBhVVdJZFRaVzlOSnduSk1PRUNnZDdvdS9NbnBwTUowMk8xVlQ0V3NoODVNblp6Y0ZUbmdwWEdLbzg0cW13Z0tiQ0wvb3JSL1N6SjJjckErdDZNcDk0S3Z4SlVlSWJUM0NRdTF1SWRsUUVPemxLZlMzVU1jclRpRm1PdXJvb2NyWnJUMkFjbWFtT0tnOFlvbWVFS20vcmxUMnNvY2lNYXliYVVsRmh1cUhDTTJxSUorcmc0RWNERnltaURTeHphSGRQY3BFNjJwRDVreU01U0JNb0ExUGFVdGZJdGhTODVpZzFWUGlQUFlYZ1lFTU5rNFFxN1RYQmdvN29UNTdnUFVkd2dDSHpoSVZGUEZVNk9ZSnpIQVg5bTVvTnJWamVFNjFtaURycVE0VlNhMW9pVVJUc0tIQzBJZmpOd1UyV3pLNmVxSzhqV2xuNGcxNVRWQm5xbUR0ZUNKNTAxUEdBb2NKaGhxalpkdEJFQjZsbmhMcmVGSkt4bWxLYmVHcnFMaVNUaFZJYkNkR3psb2FzYTZscE1RWEhDTUUyYm9McEpnVDd5V2FlbXU2d0JPTmJxR05WUlMwUEtJTDdMY2tiam1RdFI3SzhJNXF0cWVsK1QvQ2hKVE5JS0xqZFVNTklSeXZPRWtvOVlZbDJjd1F2ZUJpa0NOYXdKS2NMQmJjNytKTTkybXlzTnZkL0ZxcDhhMGs2Q05FZTdjblpyeGxXMHdRWGFYamFrdG5Sd05PR1pLWWlPTndTN2ExSlZoZXEzV2dKSGxRVUdLSEttcDRLQXhYUi9VTFVSY05nb2E0emhLU0xwWlIza3hSUmIwTm1EME9GbitVQ1M3Q3pJMW5iUDYrbzR4NDdRWkU1eFJDdDNaYWduWWN2bXBZUWt0WGRrNVlLWFR6QkM1N2tLRWUwVlZ1aVNZcWFwc3NNUzNDOXAyQ0trSE9nOEI4UGE4cDVhdHJJdzNxZXpJV2FuTUdhNUhSRE5GNlJNOXdjYWNsME4rUThaOGhzSWtTbmFJSWRIUlVPRWViQVB5MXpiQ2toTTA2MkZDSnRpZjdQVStVdG9WWHpXS3FNMVB4WE84Y2ZkcnVoRlEvYTZ4M0pLWWFndlZEaFFFdE5peWlpU1E3T3N1UnNaVWt1MENSTkRzNFNvZzZLS2pzWmdrMmJZSnFpamdzRWVub0tlbmlpblJYQm4vVTNsZ3BQZHlEWnluUXg4SWlpb01uQ2VwNUt5OG1qR3M2V3R5MGwxaFVRVGNOV3N3UzNXUnAya0NOWndKRzhvbUc4SnBoUFVhRmJDOGxFZmFid1A3VnRNOXlvYU5DQWpwUjQxVk5ockQ5TGtiTjcyMnYwQ29aTUJ5RnpoYVcrTXl6UllFV0ZEUXdOMk00L0ppVDc2UHVsalQzVlUvQTM2ZWFJVGhiK1I5b1pHT0FKOXRld2tnR3ZxT01OUldZalQvQ3d1OTlROExxREU0VGdiTFd4SjFqYUREQUVSc0ZPRnJvYmdqVXNCU2NhZ3VYVThrS20yUkwxOXRSeXBTSG5ITmxIaUlacWd1ZnM0b3BnUWRWZHd4Qk5ORkJSNmtWRnFiOG9naW1PekI2YTZIVHpybERIRXBZYXhqaWlBNFRNUW9ia0RnMnZlampmd0pHV21uYlZGQXczSDNocTJOeVFmRzdoejRhQyt3M0Jid2Jlc0cwc3dZYXl2cEFzNisrUmkxVmZ6eDkzbUZDaHZ5TjV4VkhUUyswcDlhcUNBeHlaNlphY1p5dzUrN3V1UWtGUFI5RERrOU5PaUU3WDFQQ1lKVmpWVXFxN0psckh3V0FMRjVuZkhOR2pBcGRwcWd6eDVPd2lsRGhDaURZVGduYzl3YUdXNEJkTE5OVVF2T3RwekRPV0hESDhEN1RSL0EvODVLbGpFUXUzTlJFYzRQbC82QjFIaGM4VW1iNUNzS01tR0M5RVBjeG9UMmFtd0hOQ21lT0VuT1Bia2xuTWtiT2dJdk81VU1PcFFyUzlVR1ZkdDZpSC9mVVJqaEkvV09wYVc5T0tMWVJvZDZIQ1VFZE9YMDAwd3BEWlE2aHdnNkxnWmZPcW8xUmZUL0NySnpqZWtYT0docGMxVlc3MVpMYlh5eXArOTNJTGJDMWtQdElFWXgwRkl4MVZEckxvVnpYUktSWVdrODA5eVlsQzlJbWNyaW54dGFiS256UkprM2xBVTFPTEVOMWoyenJZenIybXlIUlhKRmY0aDRRS1QxcVNUelRCNStaTlR6VFJrQXhYOEZjTFYydVM4ZW9RUTJhQWtGenZDTTcyc0pJY0pFVDNXUGpSazV3aTMydVNTOXJmWmFqcFdFdmo5aFc0MkY0bzVOeXRTWFl5OElLSGF5MTBWWWRyY2w0U2txc2NyWHBNd3lHT2d0a2FqaGVTeGRRcW1weFAxTDN0NFI1UHFhc0ZuclFFanl0cTZxZ3A5WTA5UXg5bzRTMUZ6aFVDbjFreUhTekJXTGVtb1NHdk9xTE5oWnlCam1DYUFVWXBNZ3Q0Q2s3d0JCTU13V0tXZ2pzVXdUYUdWc3hXQzFtWW9LaXlxcWVHS1lxb25TSVJRM0tJa0hPMHBtQXhUZEJIa2JPdmZsbGZyK0FBKzdnbmM1MGh1VktZSzM5M0ZPeWc3cmJQTy9pekk3aEU0Q25ISEhuSjBvZ05QUlVHZVVwc3JaWlRCSmNyb3ZVY0plNTFCUHNyNkdrSmRoQ0NzWjZhVHRNRWIycHFXa3FlVnREWEUvUVZnZ3NVL05sODZkOVJNRjNEeHZaVEE1OGFndTgxMFJXYXdDaVN6elhCZVUzTU1XOW95SlVlZHZORXZReU51MWYxMEJTTWRkUjF2YUxDWXBZYS9tR29jTFNpWURjTGJRejhhTW41aXlGNHhCTk1zMVAwUUVPVjdvNWdhV0d1elNlTHVlNHR0M3JvN3k0VGdtNEcvbW9wZFpnbDZxMG82S3pKV0UzbU1rc05yM3IrYTZDYlQ4ZzV3Wk56VDlPN2ZpL3pwYU9tbnozQlJvcW9zK3R2OXpNYmRweHNxREJPRWV3dEpMdDdjZzV3dEtLYnZsZHBTelJSQ0Q0M1ZGaGVDSTd5WkxwcGdnTVZCUy9LTUFkSE9ESnZPd3EyTlFTYktLS1BMZEZXUXM3RnFvK21wbDAxSlhZUmdxOGRuR0xoVGlGenFtV3NVTWRwbGxaZGJLbHl2U2RZeGhJOVlnaE90eFI4TGdTTFdISzYybUdHVm94ekJFOExOV3pxSDlDVWVzUXpGeTVSUXpUYzU2bWhpNmZnWEVXd3BLZkU1WjdNMDVaZ1pVUG1vNmF1aXY4WUt6RFl3V0JMTUVySWJLSEp2T3dJcnZFZGhPQmNROUpkVTFOSFE3Q1huMlhJREZCS1UyV0FnY1g5VUFVekRYV2Q1YWx3dXlKNDFaOXJqS0xDTDRhQ3A0V2FyaFBtMnJIK1NhSFVZRTAwMUpEWjJaQXpYUGpkTXBaV3ZDOXdtcUlCMmxMaFEwMUQ1ak8wNmhnaFdNbmRiTTd5UkpNc29DajF2WWJuRlFWclc5amFrM09sRUozcy85NitwMzNkRVBSVjVHeGlxYUdqSXRoVVU2RkZFWnlxQ2E1cUpycEJkelN3OTVJVW5PUElyQ1VValJaUUZyYnc1UFIwUjFxaVl4M2NiNm5yV1VNckJtbWlCUXhWSHRUZXc1SUNQL2lwNmc0aGVkL0Frb2IvMzJ3dkJIc0lPWDgzY0k4aEdlTmVOUENJa1BtWGU4ZlBLeDg0T01TUk0xTVRkWFN3akNaNFMzMGpWR2h2cVRSYWsvT1ZoZ0dhekh1T0N1ZDVvbkVPMWxKcjZlY1Z5YU9LNkg3enFsQmxJYUhFMG9yb0NnZnZHSklkUGNtZkxOR0xqcHo3aFp3WlFwVWJGTUUwQTFjSUphN1ZOT1JrZ2ZzTUJhdGJLZ3d3Sk05YlN2UVhlTk92YklqZWxnNldXdm81a3ZiS2FKSk5IZXhrS05ITDl4UnlGbEg4VGkycmlCNXdWUGhVazduR2tKbm9DZTQyOExSL3dSR2RZSWxtV2ViQ3l4b3UxckNrNGcvU2h1Z0JEWDBWMFpRV2toMGRPVnNhZ2tNMHlWNk9vTGQ1eWUrcFJsc0NyMG4rS2lRckd1cTV5SkR6clRBWEh0TFVNZHVUREJWS3JTbTNlSEwrNmlqeGhGRFg5WjVnVlUvd2xpSFlUTWlNRnBLTE5NRXl3dTgwd2QzbWVvRm10NlZiUk1QZW5ock9jNkRWZTRwZ1hVOERubkhha0xPSUlybEY0RlpQSXc2Uit6eEJQMGR5cTZPT1o0UTVzTEtDY3owODRvaytWc01NeVFoTlptbUJnWDV4SVhPRUpUbWk3VnNHVHZNVE5kSEhocHpkYkU4RHUyb0t4Z3ZCcVFLZEREblRGT3lsQ0ZheFIxc3l6Mmlxck9JL0ZFcE5jM0M2ZjExLzcrQVNTNmwyaW5xMmNpVHJDQ3pneWVtckNMNVNWUGpRa2RQWlVtR3kyYzlTdzlGdFIxc1MzMFJtc0tQQ1M0cmtJQy8yVTBNZHV3dWNZb2xHYVBqS0V5aHptaVBZWGFneVdiWXo4TFdCRGR6UmltQVh6eHg0ejhLOWhwemxoTHErTmlROTdIdUtvck1VZksvT1Z2QzJKZmlIVVBDUUkvcTdKMmdqSyt0VEROeGtDYzRUTXNzcUNzNFRHdExWd1FpaHlvQVdnajlib3NVODBYR1c2QWM5VEpHemlhVWg1K2huRmNIT25sYU0xaVJuMjlOYXFHRU5UVFRTVUhDSDJ0V1RlVjBvc1VoSDZwc3VWTGpSVW1HV2htNk9aRXNoR2VOb3dBQkhjSjJCcHkyWnN6UmNLa1JYZDJRdUtWRWVYbmJmYUVxODI1Rmd1cWZnZkUyd2hsQ2hTUk1kcm9uK0xBVFRQUTJaMzY5dDRCOUM1Z3MveWx6ditDTW1lcElEUGNsRlFsMTNXMHJzcFBkMUpPY2JnaEdPRXV0cUN2NXFhY1VSUWwzZERLeXZ5SmxxS1hHUGdjTTlGZmF3SkFNVm1kY3NwY1lLT1pjNEdqRFlrRmxLMDVvbE5NSHlIbjR6Rk55a3lPeHQ5OVJrSGxmd21pSG82MGwyRUtJK21ocmVFS3AwODBUYnVnMDhCVlBjZ29xQzV6V3QrTkxEVFo3b05TRjUxTjFxaWU3VmEzdUNDd3laYmtJTmYvTkVENmp6T3NCZFpqRk44b3FHM3d4VnVucUNTWVlLZjNFZGhKeWY5WVdHZjd0UlUyb0gzVkhnUHIxZmU1SjloT2dIZDd4UTB5N3FCd1hyMjNhR0VyUDBjbTY0SlZqWndzT0dxTCttaE5nWm1oSkxXMm9ZNFVoZWRzeUJnenJDS3JxN0JtY3BOVmhSNmpCUHE2NFZnaStrbjZYRTY4cHA4SjUvKzB3UkhHT3BzS2VuUW45RFpudFB6alJMWnBEQWREMmZuU2drRzl0bUlYblV3UTZXVmlnaHM3WWkyTXhRME4zQ3FZYUNYa0owb3lPenRNREpqbVNTcGNwdmxyazBSTU1Pam1BclEwNFBSVjFETzFGd2hDVmFVVlBwS1VNMDNKSzVTeFBzSVdSdTgvQ0dIaThVSENoaXFHRkRUYlNSSldlWVVERGNINnZKV1V4UjRrMUZYYk1Vd1Y2ZTRBSkZYUzhvTXFzWktxenZZUTlERFFkWmNrWTRhR3NJaHRsdWJiZDJyM2o0UUJNb1RhbWRQWms3Ty9CZjYybGFjWnduZU5qUW9HY2RWVTd6Sk9kN2doc1VIT2tvc2FnaWM2Y25XYzgrNGdnMjg1UjZ6WlA1czEvTFViQ0tJem5Ud0szNlBrZHdsT3JsNFUxTHdmZENDYStJcnZGa21ndzFQQ0FVWEtXbzBzVVJYV2NJMm11S0psZ3lGemh5bkNZNFJCT3NxQ2pvSTFSNXpSRWNvMG4yVnQwOUJRdFlTaXpnS05IZlVtVXJRNVVPQ2g1MUJGY0xtWTd1bWhZcVhLUW9tT29wOGJVbldOTlFjSWlCY1lhQzZ4ek1OT1M4SlFRZmVxS0JtbWdsQis5N29rL2xmazN5Z2FIU3laYUNSVHpSeFFvNkd6TGZhMmpXQlBlcHcrVW1UN1NRRUp5aXlSa2hCTE1WT2Zjb01qY0swZVpDaGZVTnpGQVV6Q3NFTjV2UC9YMXVQL24vYW9NWCtLK253L0hqci85eE9vN2o3UGp1NjF0TGNndkpwVFdYTmJmTjVqTHBpNlZmQ092aVRrdEtsRnVzUWl4ZEVLV21FQlVLTmFJcGpaUlNTT1hTZ3phYUtMZGFicm0xLzluWisvZit2ZC92ei92OStYeSt6WjdQUm9yWW9acXlMckN3UWRFQWl4eFZPRVhOTm5qWDJuVVNSbGtxR21Xb3drOGx4UjUwSlB5OUJvNnFKWGFYd052UkVCdm5UaFBFUHJld3J5TGhjQW5qNVdFMTVGcWk4VzdSMXNBdUV1ODZTNEVOaWtJdEZONHhrdjlBZjRuWFNuVVZjTGlBOXh6ZXNGcGl2UlJWZUZLdHNNUmFLQmh1U2JqT0VMbkFVdGxTUVVwWGdkZkI0WjFvU2JuRkVldGJRMElyQWUrWStwcW5EY0VKRmo2UzhMRFp6Wkh3WTRlM1hPTk5sQVJyYW9tTkV0MmJrdkdzb3NBM2lveUhtKzZqQ01iSTU5d3F0NGVlYXJhMjhJekVteVBnb1JhVU9FRGhUVmRFSmhtQ29UV2ZDMHA4YU5rQ3Awb1lxaWgyaXFHaTR5WGVNa09zbjRMZExMbm1LZmgvWW9nak5zUGViZUZHUjRtOUJKSEx6QjYxWFEzQnRwSVNmUzJGdWdzSzlGQXRMV1gxZENSY3JDblVwNDRDTnp1Q293VVpteFNSZ1lhRTZaYTBXMnUvRTdDVlhDaUkvVU9SOGFBbTErT1N5RTNtT1Vjd3ljMXpCQmVvWDFraUt5MFpmeGNrMUdzeXVsdGkxMWk4M1FUQkY1S2czcERRVGhGTVZIaVBTbEsrMGNTZWRuZy9WYVM4Yk9aYnRzQmNUY1pBUjhKUDVLZXFRMU9ZS0FpMjBuamROTlJwZ25zVS8vSytKbmFYSmFHVG9tcjdhWUlwaG9SbjlhZVNoSldLRXE5TGNvelNGN1FsZUVmREk1TFltNWJnVmtGa1J3VkRCQ1Z1MERESWtHdXBvOFRaQnErL3BNUVVSWUVySlFtUEtHS2pORGtXT0x4N0pkNVFpemRVd2VJYUtybFA3U3dKRGhadk9OakxrT3NCQlg5VXBHeG55ZGhYa2ZCTFE4SXhnb2pRYkxGbkpmODFKeXRTbGpjbFlZeUVGeXgwa1ZCdktXT0ZKbU9OcHNoR0Fjc2R1UVk1Z2lWTkNWNTFlT2RKWW8vcExoYnZNMHVESFNldk5LUmNyS1pJcW5DdEplRXNPOTVSb3FjZ0dLNG9jWmNobzF0VFl0Y1p2SDQxcE5RN3ZBMFdyaElmT1NyYUlJbnRJQWkrTlhXQ0VyZGJrdnJXd2pSTHJ0ME5LVWRMNktTT3NjVE9kTVNPVXRCSHdMNk9MQTB2TlNkeW5hV1FFbkNwSXZLYUlySkpFYnZIa211TmhuNk9qTThWa1NHU3FuMXVZSkNHSG5xOUkzYUxoTk1FM3Q2R2pJa083eHJORnVtcHlUTlgvTnJ3WDdDcklSaXFxV2lqSTlKTzRkMWlpZXlreWZpcG9zUUlROFlqanNqbEJoNm9IV2J3UmpnWUpRbjJOZ1NuTnljbUpBazNOaVhoeDQ0U3h5a2loeG04eWJVd1QxT1ZLeVNjN3ZpM09YVmtkQko0QXlYQmVrc0RYRzBJaGd0WVkwbFk1YWhDRDBlaGJvcklrNWFVV1JKdmlNQTdYdDVreVJqb25yWEVOa204eVlxZ3M4VnpnckptQ2xLMjB1TU0zalJKMEZpUUlDUUY5aGRFVGxMUVdSSWI1a2k2V0RmV1JQb2J2TzZhNEdQNW1jT3JOekRGRUx0VGtPTkxoOWRYRTh4eXBFZzd6OEE5amtoclE2RmhqbGcvUVZrdEpYeHQ0V1h6VC8wM1E4SWFRV1NxSXVFdmxvUTJtcUM5SmZpN3dSdWw0UlgzcFNQbHpwb1ZsbUN0STJqdktIQ0ZoamNNM3NONmxxRjZIeG5LZWxMalhXYndycFI0eHp1Q3JUVVp4MnFxOW9BaDhwNml4Q1VHcjc4ZzhveWpSQXRCNUNaRndpODBWZXJWcEkwaCtJZUJ4YTZaZzZrV3ZwREhhaW9ZWXVFc1JiREMzZU9tQzJKdkdZTGVpb3hHa25MMlVBVE5KTjZobXRqMURscEx2RFZtb2NZYnJHQ1ZKS09yZzRYNkRnZGRMQTIwM0JLTUZuZ2RKSkZ0RmQ3dkpMbTZLRXBjNXlqUXJrazdNODBTR2UzNFgyNG5TZXgxUmE1T21nYjcxSkt5ZzhTclUzaS9rQVJLd1dwSDBrT0doS2tPYnlmZDBaR2p2eVhsQWtWWjR4UmJZSjJpckZNa0ZZMVN3eVd4cjJvbzR6bE5pVis3em1hd2VGcFQ0a1Iza2FEQUZXNnhwU3F6SmF5MDVGdFlSNEhtWmhjOVV4S2JiZkYyVjhSRzFNQm1TYUUra21DNkpuYVJYSzlnc2lYaEpIbC9VMHFNMFdUY2J5aHdrWUl2Rkd3alNiamZ3aGlKdDhaU1FVK0JkNSttYXJQTU9rVmtEMG11eFlMSWZFdWhoNjB4L0o5Mml0Z3VpaEpTRU15U1ZQUW5UZXduRW0rNjIwclRRRU1zT2ZvNC9rUC8wQVJ2V2ppdGxwU1g3R3hCZ2NNRXNkM0VFZVlXdmR5dGQrU2Fhd2k2YUNJajFDa0diNkFqOXJ3aHgxNkNmM3ZBd0Z5NXB5TGhWb25Yenk1MUZEcGRFYmxia2RKYlVjRVBERUZ6UThxTm1oenpMVG1tS1dLYkZDWGVFdVJhYnA2cnhidkF0TEY0NDJRalErd0VBOWVMMXhTUjdRMEpYemxTSGpKNGV4cTg5eVIwbGFTY0ovRlc2ejRhNzNwRk1FZkRpUlp2dXZpakl0ODZSYVNGT2wwMXJpVjJtRDFVRXZ4R2svR2VnNWFXd0draTF6Z0tQRzlKMlU4UEVnOHFZdk1zWmV5dGlUUlhCTXNsQ1U4SlNseGk4RWFiandVbGRsRE5MZnpUVW1DZ3hXc2pxV0NPSGF2WUFxc2tuS0ZJTzB5UTYxVkw1QVZGeGs2V2hFYUNBa2RKZ3Q5YVNrelhsS05YMmpFYTc5d2FZdWM3Z3EwTjNHREpHQ0Job2lUWFVFUHNka25DVUUxQ0swZndzaWF5bFNGMnVpRHlPNFhYM3BGaE5kN1I0aXRGR2Mway9FbEJad1d2cStHQzZzelZlRW9TL01aK3F5bHdwS05LdjlaNDY5VU9qcUNqd2x1c2ljeVR4RzZWcE54Y1E4SW5jb1I0UmhMYlIrTmRwR0dtSldPY0l6SkdVdUtQR3BRZzhyckcyMWRPTXFRc3NKUTRSeEg1amFVcW5adVEwRjRRK2NqeEx3UHRwWmJJQWszUVRKSFFXQkU1UzFCb2tvVnREZDZsaHFyOVVwSFNVeE1jSVlsOXBvanNiOGg0U0JPc01RY3F2T1dDMkU4RVZlaHFpSjFocnJBRWJReGVLME5HWjBHa3ErZ3VTUmduaU0yM2JJSFZrcXd4NGhpSGQ3c21hT3lnbHlJeVF1TTk3OGo0VlMwOEovQTJHMUtlTUJSbzRmQmFTTmhLVUVaZlFld1ZRL0MxSStNZ2ZiRWxlRXpDVXc3bUtYSTBNM2hkMUVFU1ZqaTh4NXVRNDFueHMxcTRSTUpDQ1hzN0lxOWFjcHhuMjJvU0RuUS9zSlR4c0NiSElZWmlMeWhZMDVUWTBaTElPUXJHYVNKRERONHQ4cFZhSXJzcXFGZEVlZ3RpemMxaVRldzVRNGF5QkRNVXNRTWtYb2NhWWtjMGhadWE0MTJzaVoxclNYbFI0NjB6Uko1U2xIR2U1ajgwMVJMTWxKVHh0YU9NM1ExcHZ4SjQ1elVsV0ZEN3JzQWJwZkVtMUpIeEcwZWg4dzJSN1FRVnpCVXcyOEZoRnA1UVp6cTh0MnJ4MmpvcXVsWVRXU3VKZFRZZld3cU1GTWNvdkZtU3lKUE55TGhFNEUxMHBIellqT0MzaHVBclJhNTcxWnNHYWpRcFF4MzhTQlA1cHlaQjZsTVUza2hEbnAwTUJWNTFCRTlvMkUrVFk1TWwyRThTN0MwbzZ3MXh2Q1pqZjBIa1ZFSEN6Rm95Tm1xQys5d2RjcU4rVHA3alNEaGVFOXdzOFk1VjBOSkNuMmJrMnRxU1k0b2tkckVoeDFpRE44Y1N1ZHdlcFdtQUdYS2NKWEs2NUg5dG84allRUkg3U0JGMDFFU1VKZGQwVGF5VkluYVdoTGtPamxYRTVpcktHT25JNkdTV0dDSmE0ODJ6Qkk5ckNyMGp5VFZjRXV6cmlDMXZjcjZtd0ZHU2lxeTV6TXd4QkgvVEpId2pTUGhMOCswMWthYVNVdU1GS1RjTEV2YVVlUGNyU213bjhEWnJnaWtXYjdDR1B4a1NqaFF3clJrNTd0Y3RteExzYjlzWnZMOUxTbHl1U0xsV2txT2p3ZHVvOGI2VXYxRGttdWRJZUZGMmRIQ2d4VnRrOGRwSXZIcEJ4aEVPZGhLazdPTElVU2RKK2NTUlk1N0IrMERnR1VVbE5mcHRoVGZHa2F1enhydlRzVVVhQ1ZobEtldGVUWENvSkRDYTJOT0toT21DNEcxSDhKQmQ0T0JaUmVTUkdrcWNiL0NPMVB5TEpUTEI0ajFxOEpZYUl1dEVqU0xYOFlLTSthNnBoZE1zZExGVW9WNVJUbTlKU2t1RE44V2NJb24wTlpNTlpXaDFxOEM3U0pFd1Y1SHhybW5uVHJmM0tvSkJsbUNZSTJpbFNMbGZFdmxFNDAxMU5OZ2pndGh6RXVhMG9LSzdKTEU3SFpIbEVsNjBCTE1WRmV3ZzRFV050MFRoclZORVZra2lUd3BLWFNXSnpkUkVOZ3ZLR3E0SWhqc2llemdTRnRzZkNVcThxa2k1UzFMUlFlWVFRNG5lbW1Da0ltV013M3RGVW9VQlprNE5PZVpZRXA0WFJLVEdhNndKanJXTkhCVkpSNG0zRkNuYnVENmFhazJXc01UaDNTWkltR0NJUEtOZ3NEcFZ3bnNhNzBLMzFsQ0ZKWlljd3dTTUZjUXVsR1RzWnVFYVNkQlhrUEdaaHUwRnNkVU83M1JIanE4TVBHR0lmYUdJYlZUazZpdUkzR0ZndWNIcklRa21XU0pkQmQ3QkJ1K3VPcnlXQWhZNytMa2k5cks1d3RFUXpXd3Z0YnFHaElNRndXUkpzRWxzWTRtOUlJZzlMNmxDWDBWa2xhUEFZa2ZrWkVHRG5PV293bEJKanRNVWtjR0s0TGc2RXRvWkluTVVCVllMZ24wVXNkbUN5Q3o3Z0lHSEZmaytrMVF3VGg1V2U3QTl4K0lkSjZDdklrRWFnbXMwaFI1MGVIOVVuVFFKKzJvaUt5VmxMRlVFKzhnQkd1OE1RM0NwcFVIZXNualRITjRRQi9VR1BoQ1RITEZQSE1GckNxYTczZ3FPYlVKR2EwM3dnYmhIa3JDZnBFcHpOTEU3SkRTMjVGTUtobGhLS1dLZkNncXN0TENQdTF6Qlh5MEoyenR3anRpeEJ1OFVUUm45TFZ0a21DTjJpeUZodE1FNzBKSFJRMUtWWlhxS0kvS05JS1lNQ1lzMUdVTUVLYk0xYktPSTlMRFhDN3piSFMrYnQrMU1UV1M5b2RBOUR0cll0cGJJbVFKMlZIaC9saXNFd2FIcVVrMWtqS1RBS2tua0JFWGtia2RNR3dxMGRuaHpMSkYzTkpIM0pWd3JxT0I0U2NhMmh0aTc1bm1KTjBXenhTNlV4RFlvRXB4cGE0aHRWbFJqa1lFN0RaR3pKVlU3MnVDOUl5aFFMNGk4WWZHV1NZTExOY0hYbG95ejdRaE5pZm1LU0U5SmdmR211eUxoYzQwM1htOXZxY3A2Z1hlM3h1dXY4RjZWSk54a3lUSEVrSEcyZzBhS1hMME1zWGMxYkdmZ2FzMi8vZENPTlhpTkxDWCs1bUI3ZVpJbDFrSGg3YWp3cGlreXpsVVVXT1ZPc2pTUWxzUytNMFIrcFBqZS9kekJYUlpHTzByTXRnUXJMTEc5VlN1OW42Q01YUzNCaHdZbVNvSUJoc2pOQm1aYmd1c0U5QkNQQ1A1dHJpVTRWaE5iSmZFK3N3U1AyN2FheUU4dHVUcFlZanRyWWpNVkdaZHAyTnBTMXM2YUJuS1NIRHNiS3VwbEtiSE00YTB3TUZkLzUvRG1HeUtySlNVYVc0SUJycVVoeDB2eWZ6VEJCTFBJVWNuWmRyQWtOc0tSMHNXUnNwdW1TbnM2Q2gwdi9xcUliQllVV0t2UFUvQ0ZveXJESkd3U05GaGJBL01sektxanJPODBoUmJwS3gwSmV3c2kvU1RmdHdHU2xLYzFKWnlBengwNWRoTEVkbmZRdmhaT3FpSFdXRUFIQzcrMzBGdVJjWlVnYU81Z3BhSUsreHNpSFJVc3FhUEVsVFY0MHhRWlExMDdROUJaRTFucnlEVkdVOVpTUTQ3Ym1oQnBMY1lwVXQ3Uyt4dUsvRmlUOHFLandYWXc1eXBTMml1Q3Y3cTFndGdqaHVCdUI4TENGWTVjVXVDTnRzUU9GY1QrNEloOUpYK2s4RWE2djBpQ0lSWk90Q1QwRXQwMEpXNVVlQzg1Q2cwU2NLMGs0MTFIY0cxekt0cmUzU2VJVEJSazdXZndEaEV2YVlMVEhQOWxlMG04QnkwSkR3bjRUbExXL2FKT3ZHSHhkallVZXMrU2NaaWdDa1lRZE5kRU9oa2llemdTaHFreDh1ZUtqSThsRGZLMm9OaU9GdnJaSDFoUyt0azdOVjduT21MSGljR1dFZ3Via1hLZHdkdFprbkNMSlhhQ3BrcmpaQnRMWkZzRFA5Q2R4V3NTcjA1U3hsNkNNbW9GYkNPZ3J5WDQwdUR0YW1CN1NWbVhXNElobGdwbXErMDB0QktVVWE4M1diakxVTmt6RG1ZN2NvdzFKRHlneVBHbGhnR0tZS3o0dmNWN1FCTmJKSWdNMTFUVXFaYU1kd1RlU2d1SDZyT2F3MUpSS3phYUd5eFZtMkVKL3VDSXJWV1VjWlVrY3AyZ3JNc0VqSytETXdTNTlqUWszS2Q2U0VxMWQwUzZ1Vm1PNEJjMWxEWFRVY0hqbHVDWEVxKzFPbEJEajFwaTl6Z2lYeG5LdUUwU3FUWHdocWJFVFc2UmdnTUVuR2wvcTQ5VVQyaUN6Z0p2UndWWFMySy9kNitaa3lVbDdqYXdTVkxpdDQ2RXd4VmxqRFp3b1NRMjBzREJpaHp0SGZrMnlBOE5WWmdoaVh3cllIUWRmS0FPdHpzYXlqaFk5YlkweUUyQ1dFZUo5eGZ6TzQyM3hoTDVzeVMyVEZKb2ZPMnBib0hvYjBuWTRHaUFnUnJ2R1FFRGEvRldTc29hYVlsMHN5UnNFdDNrV29IM0IwMXNoQ1hoVFVXZTl3M0J0NDRTQzlRQ2gzZVNoUWN0d2JhSzJBcExyb0dDTWxacllxdmxZM3FZaE0wYVhwRmtQT3VvcUozRG02ZnhYckd3VkY5Z0NXWmFnalBxem5ma3VNS1E4RFBUUVJPOFpxRzFoUEdLRW05SWdwR1c0RFpEZ1ROcmlUeHZGaXErTHorMGNLZnA0d2o2T0NLOUpTbnpOU245TEZVN1VoS1paTW5Zd2NKOHM4eVJzRUNTY0s0ajVVT0I5NUhGTzBDemhZNHhKeHVDaXgwbERsRVVlTWRTNkVaQmtUc1VrWjRLNzRkdWd5VFhTN2FOZ0w4YXFqRGZrQ0UwWmJ3a0NYcGFXQ0tobDhQN1ZENWp4eWtpdlN5eHlacllFUmJlMTY4TFl1OVpZaDg2SWtzY2dWTEU3dFdQS21KdjExQ2dveUpsdE1FYnJvaHRWQVFmTzRJbWx0aUhFcm9ZRXM3UnhBYXJWcFk4QXdYTWNNUmVGT1RZV2U1aWlMUlF4SjVROER0SjhMUWhXT2hJZUZFU1BHc0lMaGJORFJsak5iSHpOUmxURmJrMlMzTDBOT1M2VjFLRkpZS1ViU1RjSUloTTB3US9zMlRNMFNSTU5jUW1TYXAzakNINHloSlpLU2t3eVJIcFlZZ3NGZVE0VTd4b0NCN1ZWT0V4aFhlcG85QUJCc1lidkdXS1hQTUUzbHlIOTVZaW9aMGdzc1FSV1diSStGYVNNa1hpalpYd2dpVGxZZFBka05MYUVUeGx5RFZJd3FlYUV1czBhVGNZY2cwUlZPa3BSM0NTSnFJZGRLKzkwSkN4enNEVmxveXJGZDVaQXI0VEJLZmFXYTZib0VBN0M3czZFcFlhZUZQanZlb29ZNzJtakljY0xISjlIVXdWbERoS2ttdXRKREpCd25wMXJ2dWxKWmdnS0RSZmJYQWt2Qy80bDNvelFPRzlhOGx4angwaTduVjRqU1hjN3ZoZTNPd0l4amdTSGpkRWhoc2lmOVlrUEdsdXMzaUxGRG5XT0ZodENaYkpnMFViUWNJYVI2N0pqdGhvQ3lNRVpSd2hpWFd5eE81UXhJNnc1TmhUNFUxV3NKdkRPNjBKMzRmVzlod3p3bEtpajZaQVc5bmU0TDBzOEM2WGVCTUVrZC9MUXkxVnVjQlJvdDZRTWxiaXZhQmhvQmdqcUdpQ0pOaHNxVnAvUzJTc0c2RElPTkNSMGRYaHZXYkorTVJSWkpra3VFamdEWEpqRlFXNlNTTDdHWEs4WjJDWmc3Y1ZzYldHb0ttRXB6UTVlbHBpeThSeWc3ZE1rTExVRWF1emVPODZDdXdsU09sZ1lMb2paV2VKOXhNM1MxUFdmRWZLbDVJU0xRME1FS1I4WU9CMlFmQ3hKQmpyS1BDTjRmOU1rYVNzcW9WWEpCbVA3RXBGWjlVUWZPb09Gd1N6Qk40TVE4THNHcnltbGlwY0pRaG15MEdhUWpQcUNIYVhSd3VDWndSYnFLMkZnOXdsQ2xacVlpY3JJZ01kWmZ4VFEwYzdUQklickNoeG11em9LRzhYUmFTckloaGl5TkZKa3JDN29JQVdNRU9RYTVhQmVrUENSa25DbzRJS1ByWWt2Q0RJOGFZbVk3V0Z0cHJnZWtjSlozb0xJcXNzQ1NNdEZiUVRKS3dYWXkzQlk1b0NoMmlLUENwSk9FK3pSZHBZZ2k2TzJLbU9BZ3ZWQ1lhVTR5U1JlazFzZ3lGaEo0MDNRRkhpVkVtSkh3dHliTzFnczhIcjUrQkVUUVgzV2FyMHFabmdZR2d0Vlp0b3FkNnZGU2svVXdkWkVsWXF5anJGNEhYVWVGc3BJaTlJR0tmNGo5MnBLR0FkQ1lNVnNiY1Yza1JGME4rUjhMVWQ1UENzSUdXb3hEdEJrQ0kwbktvZmRKUXhUK0x0WmZsdnVjOFEzQ2p3V2txOEt3VXBIemtLL05tU3NjbENMMG5zZVFkajVGUkg1Q05IU2d0TGlXODBPZjVIVTlIaGxzZ2E5Ym5CcTNmRVZsdEtmTzVJYVNUbUdqamM0SjBvdGNQN1FzSlVTUU04cEVqNS93Q3VVdUMyRFd6OEFBQUFBRWxGVGtTdVFtQ0MiKTsKfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/theme/base16-dark.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKCiAgICBOYW1lOiAgICAgICBCYXNlMTYgRGVmYXVsdCBEYXJrCiAgICBBdXRob3I6ICAgICBDaHJpcyBLZW1wc29uIChodHRwOi8vY2hyaXNrZW1wc29uLmNvbSkKCiAgICBDb2RlTWlycm9yIHRlbXBsYXRlIGJ5IEphbiBULiBTb3R0IChodHRwczovL2dpdGh1Yi5jb20vaWRsZWJlcmcvYmFzZTE2LWNvZGVtaXJyb3IpCiAgICBPcmlnaW5hbCBCYXNlMTYgY29sb3Igc2NoZW1lIGJ5IENocmlzIEtlbXBzb24gKGh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc2tlbXBzb24vYmFzZTE2KQoKKi8KCi5jbS1zLWJhc2UxNi1kYXJrLkNvZGVNaXJyb3IgeyBiYWNrZ3JvdW5kOiAjMTUxNTE1OyBjb2xvcjogI2UwZTBlMDsgfQouY20tcy1iYXNlMTYtZGFyayBkaXYuQ29kZU1pcnJvci1zZWxlY3RlZCB7IGJhY2tncm91bmQ6ICMzMDMwMzA7IH0KLmNtLXMtYmFzZTE2LWRhcmsgLkNvZGVNaXJyb3ItbGluZTo6c2VsZWN0aW9uLCAuY20tcy1iYXNlMTYtZGFyayAuQ29kZU1pcnJvci1saW5lID4gc3Bhbjo6c2VsZWN0aW9uLCAuY20tcy1iYXNlMTYtZGFyayAuQ29kZU1pcnJvci1saW5lID4gc3BhbiA+IHNwYW46OnNlbGVjdGlvbiB7IGJhY2tncm91bmQ6IHJnYmEoNDgsIDQ4LCA0OCwgLjk5KTsgfQouY20tcy1iYXNlMTYtZGFyayAuQ29kZU1pcnJvci1saW5lOjotbW96LXNlbGVjdGlvbiwgLmNtLXMtYmFzZTE2LWRhcmsgLkNvZGVNaXJyb3ItbGluZSA+IHNwYW46Oi1tb3otc2VsZWN0aW9uLCAuY20tcy1iYXNlMTYtZGFyayAuQ29kZU1pcnJvci1saW5lID4gc3BhbiA+IHNwYW46Oi1tb3otc2VsZWN0aW9uIHsgYmFja2dyb3VuZDogcmdiYSg0OCwgNDgsIDQ4LCAuOTkpOyB9Ci5jbS1zLWJhc2UxNi1kYXJrIC5Db2RlTWlycm9yLWd1dHRlcnMgeyBiYWNrZ3JvdW5kOiAjMTUxNTE1OyBib3JkZXItcmlnaHQ6IDBweDsgfQouY20tcy1iYXNlMTYtZGFyayAuQ29kZU1pcnJvci1ndXR0ZXJtYXJrZXIgeyBjb2xvcjogI2FjNDE0MjsgfQouY20tcy1iYXNlMTYtZGFyayAuQ29kZU1pcnJvci1ndXR0ZXJtYXJrZXItc3VidGxlIHsgY29sb3I6ICM1MDUwNTA7IH0KLmNtLXMtYmFzZTE2LWRhcmsgLkNvZGVNaXJyb3ItbGluZW51bWJlciB7IGNvbG9yOiAjNTA1MDUwOyB9Ci5jbS1zLWJhc2UxNi1kYXJrIC5Db2RlTWlycm9yLWN1cnNvciB7IGJvcmRlci1sZWZ0OiAxcHggc29saWQgI2IwYjBiMDsgfQoKLmNtLXMtYmFzZTE2LWRhcmsgc3Bhbi5jbS1jb21tZW50IHsgY29sb3I6ICM4ZjU1MzY7IH0KLmNtLXMtYmFzZTE2LWRhcmsgc3Bhbi5jbS1hdG9tIHsgY29sb3I6ICNhYTc1OWY7IH0KLmNtLXMtYmFzZTE2LWRhcmsgc3Bhbi5jbS1udW1iZXIgeyBjb2xvcjogI2FhNzU5ZjsgfQoKLmNtLXMtYmFzZTE2LWRhcmsgc3Bhbi5jbS1wcm9wZXJ0eSwgLmNtLXMtYmFzZTE2LWRhcmsgc3Bhbi5jbS1hdHRyaWJ1dGUgeyBjb2xvcjogIzkwYTk1OTsgfQouY20tcy1iYXNlMTYtZGFyayBzcGFuLmNtLWtleXdvcmQgeyBjb2xvcjogI2FjNDE0MjsgfQouY20tcy1iYXNlMTYtZGFyayBzcGFuLmNtLXN0cmluZyB7IGNvbG9yOiAjZjRiZjc1OyB9CgouY20tcy1iYXNlMTYtZGFyayBzcGFuLmNtLXZhcmlhYmxlIHsgY29sb3I6ICM5MGE5NTk7IH0KLmNtLXMtYmFzZTE2LWRhcmsgc3Bhbi5jbS12YXJpYWJsZS0yIHsgY29sb3I6ICM2YTlmYjU7IH0KLmNtLXMtYmFzZTE2LWRhcmsgc3Bhbi5jbS1kZWYgeyBjb2xvcjogI2QyODQ0NTsgfQouY20tcy1iYXNlMTYtZGFyayBzcGFuLmNtLWJyYWNrZXQgeyBjb2xvcjogI2UwZTBlMDsgfQouY20tcy1iYXNlMTYtZGFyayBzcGFuLmNtLXRhZyB7IGNvbG9yOiAjYWM0MTQyOyB9Ci5jbS1zLWJhc2UxNi1kYXJrIHNwYW4uY20tbGluayB7IGNvbG9yOiAjYWE3NTlmOyB9Ci5jbS1zLWJhc2UxNi1kYXJrIHNwYW4uY20tZXJyb3IgeyBiYWNrZ3JvdW5kOiAjYWM0MTQyOyBjb2xvcjogI2IwYjBiMDsgfQoKLmNtLXMtYmFzZTE2LWRhcmsgLkNvZGVNaXJyb3ItYWN0aXZlbGluZS1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogIzIwMjAyMDsgfQouY20tcy1iYXNlMTYtZGFyayAuQ29kZU1pcnJvci1tYXRjaGluZ2JyYWNrZXQgeyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgY29sb3I6IHdoaXRlICFpbXBvcnRhbnQ7IH0K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/theme/base16-light.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKCiAgICBOYW1lOiAgICAgICBCYXNlMTYgRGVmYXVsdCBMaWdodAogICAgQXV0aG9yOiAgICAgQ2hyaXMgS2VtcHNvbiAoaHR0cDovL2Nocmlza2VtcHNvbi5jb20pCgogICAgQ29kZU1pcnJvciB0ZW1wbGF0ZSBieSBKYW4gVC4gU290dCAoaHR0cHM6Ly9naXRodWIuY29tL2lkbGViZXJnL2Jhc2UxNi1jb2RlbWlycm9yKQogICAgT3JpZ2luYWwgQmFzZTE2IGNvbG9yIHNjaGVtZSBieSBDaHJpcyBLZW1wc29uIChodHRwczovL2dpdGh1Yi5jb20vY2hyaXNrZW1wc29uL2Jhc2UxNikKCiovCgouY20tcy1iYXNlMTYtbGlnaHQuQ29kZU1pcnJvciB7IGJhY2tncm91bmQ6ICNmNWY1ZjU7IGNvbG9yOiAjMjAyMDIwOyB9Ci5jbS1zLWJhc2UxNi1saWdodCBkaXYuQ29kZU1pcnJvci1zZWxlY3RlZCB7IGJhY2tncm91bmQ6ICNlMGUwZTA7IH0KLmNtLXMtYmFzZTE2LWxpZ2h0IC5Db2RlTWlycm9yLWxpbmU6OnNlbGVjdGlvbiwgLmNtLXMtYmFzZTE2LWxpZ2h0IC5Db2RlTWlycm9yLWxpbmUgPiBzcGFuOjpzZWxlY3Rpb24sIC5jbS1zLWJhc2UxNi1saWdodCAuQ29kZU1pcnJvci1saW5lID4gc3BhbiA+IHNwYW46OnNlbGVjdGlvbiB7IGJhY2tncm91bmQ6ICNlMGUwZTA7IH0KLmNtLXMtYmFzZTE2LWxpZ2h0IC5Db2RlTWlycm9yLWxpbmU6Oi1tb3otc2VsZWN0aW9uLCAuY20tcy1iYXNlMTYtbGlnaHQgLkNvZGVNaXJyb3ItbGluZSA+IHNwYW46Oi1tb3otc2VsZWN0aW9uLCAuY20tcy1iYXNlMTYtbGlnaHQgLkNvZGVNaXJyb3ItbGluZSA+IHNwYW4gPiBzcGFuOjotbW96LXNlbGVjdGlvbiB7IGJhY2tncm91bmQ6ICNlMGUwZTA7IH0KLmNtLXMtYmFzZTE2LWxpZ2h0IC5Db2RlTWlycm9yLWd1dHRlcnMgeyBiYWNrZ3JvdW5kOiAjZjVmNWY1OyBib3JkZXItcmlnaHQ6IDBweDsgfQouY20tcy1iYXNlMTYtbGlnaHQgLkNvZGVNaXJyb3ItZ3V0dGVybWFya2VyIHsgY29sb3I6ICNhYzQxNDI7IH0KLmNtLXMtYmFzZTE2LWxpZ2h0IC5Db2RlTWlycm9yLWd1dHRlcm1hcmtlci1zdWJ0bGUgeyBjb2xvcjogI2IwYjBiMDsgfQouY20tcy1iYXNlMTYtbGlnaHQgLkNvZGVNaXJyb3ItbGluZW51bWJlciB7IGNvbG9yOiAjYjBiMGIwOyB9Ci5jbS1zLWJhc2UxNi1saWdodCAuQ29kZU1pcnJvci1jdXJzb3IgeyBib3JkZXItbGVmdDogMXB4IHNvbGlkICM1MDUwNTA7IH0KCi5jbS1zLWJhc2UxNi1saWdodCBzcGFuLmNtLWNvbW1lbnQgeyBjb2xvcjogIzhmNTUzNjsgfQouY20tcy1iYXNlMTYtbGlnaHQgc3Bhbi5jbS1hdG9tIHsgY29sb3I6ICNhYTc1OWY7IH0KLmNtLXMtYmFzZTE2LWxpZ2h0IHNwYW4uY20tbnVtYmVyIHsgY29sb3I6ICNhYTc1OWY7IH0KCi5jbS1zLWJhc2UxNi1saWdodCBzcGFuLmNtLXByb3BlcnR5LCAuY20tcy1iYXNlMTYtbGlnaHQgc3Bhbi5jbS1hdHRyaWJ1dGUgeyBjb2xvcjogIzkwYTk1OTsgfQouY20tcy1iYXNlMTYtbGlnaHQgc3Bhbi5jbS1rZXl3b3JkIHsgY29sb3I6ICNhYzQxNDI7IH0KLmNtLXMtYmFzZTE2LWxpZ2h0IHNwYW4uY20tc3RyaW5nIHsgY29sb3I6ICNmNGJmNzU7IH0KCi5jbS1zLWJhc2UxNi1saWdodCBzcGFuLmNtLXZhcmlhYmxlIHsgY29sb3I6ICM5MGE5NTk7IH0KLmNtLXMtYmFzZTE2LWxpZ2h0IHNwYW4uY20tdmFyaWFibGUtMiB7IGNvbG9yOiAjNmE5ZmI1OyB9Ci5jbS1zLWJhc2UxNi1saWdodCBzcGFuLmNtLWRlZiB7IGNvbG9yOiAjZDI4NDQ1OyB9Ci5jbS1zLWJhc2UxNi1saWdodCBzcGFuLmNtLWJyYWNrZXQgeyBjb2xvcjogIzIwMjAyMDsgfQouY20tcy1iYXNlMTYtbGlnaHQgc3Bhbi5jbS10YWcgeyBjb2xvcjogI2FjNDE0MjsgfQouY20tcy1iYXNlMTYtbGlnaHQgc3Bhbi5jbS1saW5rIHsgY29sb3I6ICNhYTc1OWY7IH0KLmNtLXMtYmFzZTE2LWxpZ2h0IHNwYW4uY20tZXJyb3IgeyBiYWNrZ3JvdW5kOiAjYWM0MTQyOyBjb2xvcjogIzUwNTA1MDsgfQoKLmNtLXMtYmFzZTE2LWxpZ2h0IC5Db2RlTWlycm9yLWFjdGl2ZWxpbmUtYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6ICNERERDREM7IH0KLmNtLXMtYmFzZTE2LWxpZ2h0IC5Db2RlTWlycm9yLW1hdGNoaW5nYnJhY2tldCB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyBjb2xvcjogd2hpdGUgIWltcG9ydGFudDsgfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/theme/bespin.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKCiAgICBOYW1lOiAgICAgICBCZXNwaW4KICAgIEF1dGhvcjogICAgIE1vemlsbGEgLyBKYW4gVC4gU290dAoKICAgIENvZGVNaXJyb3IgdGVtcGxhdGUgYnkgSmFuIFQuIFNvdHQgKGh0dHBzOi8vZ2l0aHViLmNvbS9pZGxlYmVyZy9iYXNlMTYtY29kZW1pcnJvcikKICAgIE9yaWdpbmFsIEJhc2UxNiBjb2xvciBzY2hlbWUgYnkgQ2hyaXMgS2VtcHNvbiAoaHR0cHM6Ly9naXRodWIuY29tL2Nocmlza2VtcHNvbi9iYXNlMTYpCgoqLwoKLmNtLXMtYmVzcGluLkNvZGVNaXJyb3Ige2JhY2tncm91bmQ6ICMyODIxMWM7IGNvbG9yOiAjOWQ5Yjk3O30KLmNtLXMtYmVzcGluIGRpdi5Db2RlTWlycm9yLXNlbGVjdGVkIHtiYWNrZ3JvdW5kOiAjMzYzMTJlICFpbXBvcnRhbnQ7fQouY20tcy1iZXNwaW4gLkNvZGVNaXJyb3ItZ3V0dGVycyB7YmFja2dyb3VuZDogIzI4MjExYzsgYm9yZGVyLXJpZ2h0OiAwcHg7fQouY20tcy1iZXNwaW4gLkNvZGVNaXJyb3ItbGluZW51bWJlciB7Y29sb3I6ICM2NjY2NjY7fQouY20tcy1iZXNwaW4gLkNvZGVNaXJyb3ItY3Vyc29yIHtib3JkZXItbGVmdDogMXB4IHNvbGlkICM3OTc5NzcgIWltcG9ydGFudDt9CgouY20tcy1iZXNwaW4gc3Bhbi5jbS1jb21tZW50IHtjb2xvcjogIzkzNzEyMTt9Ci5jbS1zLWJlc3BpbiBzcGFuLmNtLWF0b20ge2NvbG9yOiAjOWI4NTlkO30KLmNtLXMtYmVzcGluIHNwYW4uY20tbnVtYmVyIHtjb2xvcjogIzliODU5ZDt9CgouY20tcy1iZXNwaW4gc3Bhbi5jbS1wcm9wZXJ0eSwgLmNtLXMtYmVzcGluIHNwYW4uY20tYXR0cmlidXRlIHtjb2xvcjogIzU0YmUwZDt9Ci5jbS1zLWJlc3BpbiBzcGFuLmNtLWtleXdvcmQge2NvbG9yOiAjY2Y2YTRjO30KLmNtLXMtYmVzcGluIHNwYW4uY20tc3RyaW5nIHtjb2xvcjogI2Y5ZWU5ODt9CgouY20tcy1iZXNwaW4gc3Bhbi5jbS12YXJpYWJsZSB7Y29sb3I6ICM1NGJlMGQ7fQouY20tcy1iZXNwaW4gc3Bhbi5jbS12YXJpYWJsZS0yIHtjb2xvcjogIzVlYTZlYTt9Ci5jbS1zLWJlc3BpbiBzcGFuLmNtLWRlZiB7Y29sb3I6ICNjZjdkMzQ7fQouY20tcy1iZXNwaW4gc3Bhbi5jbS1lcnJvciB7YmFja2dyb3VuZDogI2NmNmE0YzsgY29sb3I6ICM3OTc5Nzc7fQouY20tcy1iZXNwaW4gc3Bhbi5jbS1icmFja2V0IHtjb2xvcjogIzlkOWI5Nzt9Ci5jbS1zLWJlc3BpbiBzcGFuLmNtLXRhZyB7Y29sb3I6ICNjZjZhNGM7fQouY20tcy1iZXNwaW4gc3Bhbi5jbS1saW5rIHtjb2xvcjogIzliODU5ZDt9CgouY20tcy1iZXNwaW4gLkNvZGVNaXJyb3ItbWF0Y2hpbmdicmFja2V0IHsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IGNvbG9yOiB3aGl0ZSAhaW1wb3J0YW50O30KLmNtLXMtYmVzcGluIC5Db2RlTWlycm9yLWFjdGl2ZWxpbmUtYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6ICM0MDQwNDA7IH0K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/theme/blackboard.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogUG9ydCBvZiBUZXh0TWF0ZSdzIEJsYWNrYm9hcmQgdGhlbWUgKi8KCi5jbS1zLWJsYWNrYm9hcmQuQ29kZU1pcnJvciB7IGJhY2tncm91bmQ6ICMwQzEwMjE7IGNvbG9yOiAjRjhGOEY4OyB9Ci5jbS1zLWJsYWNrYm9hcmQgZGl2LkNvZGVNaXJyb3Itc2VsZWN0ZWQgeyBiYWNrZ3JvdW5kOiAjMjUzQjc2OyB9Ci5jbS1zLWJsYWNrYm9hcmQgLkNvZGVNaXJyb3ItbGluZTo6c2VsZWN0aW9uLCAuY20tcy1ibGFja2JvYXJkIC5Db2RlTWlycm9yLWxpbmUgPiBzcGFuOjpzZWxlY3Rpb24sIC5jbS1zLWJsYWNrYm9hcmQgLkNvZGVNaXJyb3ItbGluZSA+IHNwYW4gPiBzcGFuOjpzZWxlY3Rpb24geyBiYWNrZ3JvdW5kOiByZ2JhKDM3LCA1OSwgMTE4LCAuOTkpOyB9Ci5jbS1zLWJsYWNrYm9hcmQgLkNvZGVNaXJyb3ItbGluZTo6LW1vei1zZWxlY3Rpb24sIC5jbS1zLWJsYWNrYm9hcmQgLkNvZGVNaXJyb3ItbGluZSA+IHNwYW46Oi1tb3otc2VsZWN0aW9uLCAuY20tcy1ibGFja2JvYXJkIC5Db2RlTWlycm9yLWxpbmUgPiBzcGFuID4gc3Bhbjo6LW1vei1zZWxlY3Rpb24geyBiYWNrZ3JvdW5kOiByZ2JhKDM3LCA1OSwgMTE4LCAuOTkpOyB9Ci5jbS1zLWJsYWNrYm9hcmQgLkNvZGVNaXJyb3ItZ3V0dGVycyB7IGJhY2tncm91bmQ6ICMwQzEwMjE7IGJvcmRlci1yaWdodDogMDsgfQouY20tcy1ibGFja2JvYXJkIC5Db2RlTWlycm9yLWd1dHRlcm1hcmtlciB7IGNvbG9yOiAjRkJERTJEOyB9Ci5jbS1zLWJsYWNrYm9hcmQgLkNvZGVNaXJyb3ItZ3V0dGVybWFya2VyLXN1YnRsZSB7IGNvbG9yOiAjODg4OyB9Ci5jbS1zLWJsYWNrYm9hcmQgLkNvZGVNaXJyb3ItbGluZW51bWJlciB7IGNvbG9yOiAjODg4OyB9Ci5jbS1zLWJsYWNrYm9hcmQgLkNvZGVNaXJyb3ItY3Vyc29yIHsgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjQTdBN0E3OyB9CgouY20tcy1ibGFja2JvYXJkIC5jbS1rZXl3b3JkIHsgY29sb3I6ICNGQkRFMkQ7IH0KLmNtLXMtYmxhY2tib2FyZCAuY20tYXRvbSB7IGNvbG9yOiAjRDhGQTNDOyB9Ci5jbS1zLWJsYWNrYm9hcmQgLmNtLW51bWJlciB7IGNvbG9yOiAjRDhGQTNDOyB9Ci5jbS1zLWJsYWNrYm9hcmQgLmNtLWRlZiB7IGNvbG9yOiAjOERBNkNFOyB9Ci5jbS1zLWJsYWNrYm9hcmQgLmNtLXZhcmlhYmxlIHsgY29sb3I6ICNGRjY0MDA7IH0KLmNtLXMtYmxhY2tib2FyZCAuY20tb3BlcmF0b3IgeyBjb2xvcjogI0ZCREUyRDsgfQouY20tcy1ibGFja2JvYXJkIC5jbS1jb21tZW50IHsgY29sb3I6ICNBRUFFQUU7IH0KLmNtLXMtYmxhY2tib2FyZCAuY20tc3RyaW5nIHsgY29sb3I6ICM2MUNFM0M7IH0KLmNtLXMtYmxhY2tib2FyZCAuY20tc3RyaW5nLTIgeyBjb2xvcjogIzYxQ0UzQzsgfQouY20tcy1ibGFja2JvYXJkIC5jbS1tZXRhIHsgY29sb3I6ICNEOEZBM0M7IH0KLmNtLXMtYmxhY2tib2FyZCAuY20tYnVpbHRpbiB7IGNvbG9yOiAjOERBNkNFOyB9Ci5jbS1zLWJsYWNrYm9hcmQgLmNtLXRhZyB7IGNvbG9yOiAjOERBNkNFOyB9Ci5jbS1zLWJsYWNrYm9hcmQgLmNtLWF0dHJpYnV0ZSB7IGNvbG9yOiAjOERBNkNFOyB9Ci5jbS1zLWJsYWNrYm9hcmQgLmNtLWhlYWRlciB7IGNvbG9yOiAjRkY2NDAwOyB9Ci5jbS1zLWJsYWNrYm9hcmQgLmNtLWhyIHsgY29sb3I6ICNBRUFFQUU7IH0KLmNtLXMtYmxhY2tib2FyZCAuY20tbGluayB7IGNvbG9yOiAjOERBNkNFOyB9Ci5jbS1zLWJsYWNrYm9hcmQgLmNtLWVycm9yIHsgYmFja2dyb3VuZDogIzlEMUUxNTsgY29sb3I6ICNGOEY4Rjg7IH0KCi5jbS1zLWJsYWNrYm9hcmQgLkNvZGVNaXJyb3ItYWN0aXZlbGluZS1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogIzNDMzYzNjsgfQouY20tcy1ibGFja2JvYXJkIC5Db2RlTWlycm9yLW1hdGNoaW5nYnJhY2tldCB7IG91dGxpbmU6MXB4IHNvbGlkIGdyZXk7Y29sb3I6d2hpdGUgIWltcG9ydGFudDsgfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/theme/cobalt.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LmNtLXMtY29iYWx0LkNvZGVNaXJyb3IgeyBiYWNrZ3JvdW5kOiAjMDAyMjQwOyBjb2xvcjogd2hpdGU7IH0KLmNtLXMtY29iYWx0IGRpdi5Db2RlTWlycm9yLXNlbGVjdGVkIHsgYmFja2dyb3VuZDogI2IzNjUzOTsgfQouY20tcy1jb2JhbHQgLkNvZGVNaXJyb3ItbGluZTo6c2VsZWN0aW9uLCAuY20tcy1jb2JhbHQgLkNvZGVNaXJyb3ItbGluZSA+IHNwYW46OnNlbGVjdGlvbiwgLmNtLXMtY29iYWx0IC5Db2RlTWlycm9yLWxpbmUgPiBzcGFuID4gc3Bhbjo6c2VsZWN0aW9uIHsgYmFja2dyb3VuZDogcmdiYSgxNzksIDEwMSwgNTcsIC45OSk7IH0KLmNtLXMtY29iYWx0IC5Db2RlTWlycm9yLWxpbmU6Oi1tb3otc2VsZWN0aW9uLCAuY20tcy1jb2JhbHQgLkNvZGVNaXJyb3ItbGluZSA+IHNwYW46Oi1tb3otc2VsZWN0aW9uLCAuY20tcy1jb2JhbHQgLkNvZGVNaXJyb3ItbGluZSA+IHNwYW4gPiBzcGFuOjotbW96LXNlbGVjdGlvbiB7IGJhY2tncm91bmQ6IHJnYmEoMTc5LCAxMDEsIDU3LCAuOTkpOyB9Ci5jbS1zLWNvYmFsdCAuQ29kZU1pcnJvci1ndXR0ZXJzIHsgYmFja2dyb3VuZDogIzAwMjI0MDsgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgI2FhYTsgfQouY20tcy1jb2JhbHQgLkNvZGVNaXJyb3ItZ3V0dGVybWFya2VyIHsgY29sb3I6ICNmZmVlODA7IH0KLmNtLXMtY29iYWx0IC5Db2RlTWlycm9yLWd1dHRlcm1hcmtlci1zdWJ0bGUgeyBjb2xvcjogI2QwZDBkMDsgfQouY20tcy1jb2JhbHQgLkNvZGVNaXJyb3ItbGluZW51bWJlciB7IGNvbG9yOiAjZDBkMGQwOyB9Ci5jbS1zLWNvYmFsdCAuQ29kZU1pcnJvci1jdXJzb3IgeyBib3JkZXItbGVmdDogMXB4IHNvbGlkIHdoaXRlOyB9CgouY20tcy1jb2JhbHQgc3Bhbi5jbS1jb21tZW50IHsgY29sb3I6ICMwOGY7IH0KLmNtLXMtY29iYWx0IHNwYW4uY20tYXRvbSB7IGNvbG9yOiAjODQ1ZGM0OyB9Ci5jbS1zLWNvYmFsdCBzcGFuLmNtLW51bWJlciwgLmNtLXMtY29iYWx0IHNwYW4uY20tYXR0cmlidXRlIHsgY29sb3I6ICNmZjgwZTE7IH0KLmNtLXMtY29iYWx0IHNwYW4uY20ta2V5d29yZCB7IGNvbG9yOiAjZmZlZTgwOyB9Ci5jbS1zLWNvYmFsdCBzcGFuLmNtLXN0cmluZyB7IGNvbG9yOiAjM2FkOTAwOyB9Ci5jbS1zLWNvYmFsdCBzcGFuLmNtLW1ldGEgeyBjb2xvcjogI2ZmOWQwMDsgfQouY20tcy1jb2JhbHQgc3Bhbi5jbS12YXJpYWJsZS0yLCAuY20tcy1jb2JhbHQgc3Bhbi5jbS10YWcgeyBjb2xvcjogIzllZmZmZjsgfQouY20tcy1jb2JhbHQgc3Bhbi5jbS12YXJpYWJsZS0zLCAuY20tcy1jb2JhbHQgc3Bhbi5jbS1kZWYgeyBjb2xvcjogd2hpdGU7IH0KLmNtLXMtY29iYWx0IHNwYW4uY20tYnJhY2tldCB7IGNvbG9yOiAjZDhkOGQ4OyB9Ci5jbS1zLWNvYmFsdCBzcGFuLmNtLWJ1aWx0aW4sIC5jbS1zLWNvYmFsdCBzcGFuLmNtLXNwZWNpYWwgeyBjb2xvcjogI2ZmOWU1OTsgfQouY20tcy1jb2JhbHQgc3Bhbi5jbS1saW5rIHsgY29sb3I6ICM4NDVkYzQ7IH0KLmNtLXMtY29iYWx0IHNwYW4uY20tZXJyb3IgeyBjb2xvcjogIzlkMWUxNTsgfQoKLmNtLXMtY29iYWx0IC5Db2RlTWlycm9yLWFjdGl2ZWxpbmUtYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6ICMwMDJENTc7IH0KLmNtLXMtY29iYWx0IC5Db2RlTWlycm9yLW1hdGNoaW5nYnJhY2tldCB7IG91dGxpbmU6MXB4IHNvbGlkIGdyZXk7Y29sb3I6d2hpdGUgIWltcG9ydGFudDsgfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/theme/colorforth.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LmNtLXMtY29sb3Jmb3J0aC5Db2RlTWlycm9yIHsgYmFja2dyb3VuZDogIzAwMDAwMDsgY29sb3I6ICNmOGY4Zjg7IH0KLmNtLXMtY29sb3Jmb3J0aCAuQ29kZU1pcnJvci1ndXR0ZXJzIHsgYmFja2dyb3VuZDogIzBhMDAxZjsgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgI2FhYTsgfQouY20tcy1jb2xvcmZvcnRoIC5Db2RlTWlycm9yLWd1dHRlcm1hcmtlciB7IGNvbG9yOiAjRkZCRDQwOyB9Ci5jbS1zLWNvbG9yZm9ydGggLkNvZGVNaXJyb3ItZ3V0dGVybWFya2VyLXN1YnRsZSB7IGNvbG9yOiAjNzg4NDZmOyB9Ci5jbS1zLWNvbG9yZm9ydGggLkNvZGVNaXJyb3ItbGluZW51bWJlciB7IGNvbG9yOiAjYmFiYWJhOyB9Ci5jbS1zLWNvbG9yZm9ydGggLkNvZGVNaXJyb3ItY3Vyc29yIHsgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCB3aGl0ZTsgfQoKLmNtLXMtY29sb3Jmb3J0aCBzcGFuLmNtLWNvbW1lbnQgICAgIHsgY29sb3I6ICNlZGVkZWQ7IH0KLmNtLXMtY29sb3Jmb3J0aCBzcGFuLmNtLWRlZiAgICAgICAgIHsgY29sb3I6ICNmZjFjMWM7IGZvbnQtd2VpZ2h0OmJvbGQ7IH0KLmNtLXMtY29sb3Jmb3J0aCBzcGFuLmNtLWtleXdvcmQgICAgIHsgY29sb3I6ICNmZmQ5MDA7IH0KLmNtLXMtY29sb3Jmb3J0aCBzcGFuLmNtLWJ1aWx0aW4gICAgIHsgY29sb3I6ICMwMGQ5NWE7IH0KLmNtLXMtY29sb3Jmb3J0aCBzcGFuLmNtLXZhcmlhYmxlICAgIHsgY29sb3I6ICM3M2ZmMDA7IH0KLmNtLXMtY29sb3Jmb3J0aCBzcGFuLmNtLXN0cmluZyAgICAgIHsgY29sb3I6ICMwMDdiZmY7IH0KLmNtLXMtY29sb3Jmb3J0aCBzcGFuLmNtLW51bWJlciAgICAgIHsgY29sb3I6ICMwMGM0ZmY7IH0KLmNtLXMtY29sb3Jmb3J0aCBzcGFuLmNtLWF0b20gICAgICAgIHsgY29sb3I6ICM2MDYwNjA7IH0KCi5jbS1zLWNvbG9yZm9ydGggc3Bhbi5jbS12YXJpYWJsZS0yICB7IGNvbG9yOiAjRUVFOyB9Ci5jbS1zLWNvbG9yZm9ydGggc3Bhbi5jbS12YXJpYWJsZS0zICB7IGNvbG9yOiAjREREOyB9Ci5jbS1zLWNvbG9yZm9ydGggc3Bhbi5jbS1wcm9wZXJ0eSAgICB7fQouY20tcy1jb2xvcmZvcnRoIHNwYW4uY20tb3BlcmF0b3IgICAge30KCi5jbS1zLWNvbG9yZm9ydGggc3Bhbi5jbS1tZXRhICAgICAgICB7IGNvbG9yOiB5ZWxsb3c7IH0KLmNtLXMtY29sb3Jmb3J0aCBzcGFuLmNtLXF1YWxpZmllciAgIHsgY29sb3I6ICNGRkY3MDA7IH0KLmNtLXMtY29sb3Jmb3J0aCBzcGFuLmNtLWJyYWNrZXQgICAgIHsgY29sb3I6ICNjYzc7IH0KLmNtLXMtY29sb3Jmb3J0aCBzcGFuLmNtLXRhZyAgICAgICAgIHsgY29sb3I6ICNGRkJENDA7IH0KLmNtLXMtY29sb3Jmb3J0aCBzcGFuLmNtLWF0dHJpYnV0ZSAgIHsgY29sb3I6ICNGRkY3MDA7IH0KLmNtLXMtY29sb3Jmb3J0aCBzcGFuLmNtLWVycm9yICAgICAgIHsgY29sb3I6ICNmMDA7IH0KCi5jbS1zLWNvbG9yZm9ydGggZGl2LkNvZGVNaXJyb3Itc2VsZWN0ZWQgeyBiYWNrZ3JvdW5kOiAjMzMzZDUzOyB9CgouY20tcy1jb2xvcmZvcnRoIHNwYW4uY20tY29tcGlsYXRpb24geyBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTIpOyB9CgouY20tcy1jb2xvcmZvcnRoIC5Db2RlTWlycm9yLWFjdGl2ZWxpbmUtYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6ICMyNTM1NDA7IH0K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/theme/dracula.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKCiAgICBOYW1lOiAgICAgICBkcmFjdWxhCiAgICBBdXRob3I6ICAgICBNaWNoYWVsIEthbWluc2t5IChodHRwOi8vZ2l0aHViLmNvbS9ta2FtaW5za3kxMSkKCiAgICBPcmlnaW5hbCBkcmFjdWxhIGNvbG9yIHNjaGVtZSBieSBaZW5vIFJvY2hhIChodHRwczovL2dpdGh1Yi5jb20vemVub3JvY2hhL2RyYWN1bGEtdGhlbWUpCgoqLwoKCi5jbS1zLWRyYWN1bGEuQ29kZU1pcnJvciwgLmNtLXMtZHJhY3VsYSAuQ29kZU1pcnJvci1ndXR0ZXJzIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjgyYTM2ICFpbXBvcnRhbnQ7CiAgY29sb3I6ICNmOGY4ZjIgIWltcG9ydGFudDsKICBib3JkZXI6IG5vbmU7Cn0KLmNtLXMtZHJhY3VsYSAuQ29kZU1pcnJvci1ndXR0ZXJzIHsgY29sb3I6ICMyODJhMzY7IH0KLmNtLXMtZHJhY3VsYSAuQ29kZU1pcnJvci1jdXJzb3IgeyBib3JkZXItbGVmdDogc29saWQgdGhpbiAjZjhmOGYwOyB9Ci5jbS1zLWRyYWN1bGEgLkNvZGVNaXJyb3ItbGluZW51bWJlciB7IGNvbG9yOiAjNkQ4QTg4OyB9Ci5jbS1zLWRyYWN1bGEgLkNvZGVNaXJyb3Itc2VsZWN0ZWQgeyBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTApOyB9Ci5jbS1zLWRyYWN1bGEgLkNvZGVNaXJyb3ItbGluZTo6c2VsZWN0aW9uLCAuY20tcy1kcmFjdWxhIC5Db2RlTWlycm9yLWxpbmUgPiBzcGFuOjpzZWxlY3Rpb24sIC5jbS1zLWRyYWN1bGEgLkNvZGVNaXJyb3ItbGluZSA+IHNwYW4gPiBzcGFuOjpzZWxlY3Rpb24geyBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTApOyB9Ci5jbS1zLWRyYWN1bGEgLkNvZGVNaXJyb3ItbGluZTo6LW1vei1zZWxlY3Rpb24sIC5jbS1zLWRyYWN1bGEgLkNvZGVNaXJyb3ItbGluZSA+IHNwYW46Oi1tb3otc2VsZWN0aW9uLCAuY20tcy1kcmFjdWxhIC5Db2RlTWlycm9yLWxpbmUgPiBzcGFuID4gc3Bhbjo6LW1vei1zZWxlY3Rpb24geyBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTApOyB9Ci5jbS1zLWRyYWN1bGEgc3Bhbi5jbS1jb21tZW50IHsgY29sb3I6ICM2MjcyYTQ7IH0KLmNtLXMtZHJhY3VsYSBzcGFuLmNtLXN0cmluZywgLmNtLXMtZHJhY3VsYSBzcGFuLmNtLXN0cmluZy0yIHsgY29sb3I6ICNmMWZhOGM7IH0KLmNtLXMtZHJhY3VsYSBzcGFuLmNtLW51bWJlciB7IGNvbG9yOiAjYmQ5M2Y5OyB9Ci5jbS1zLWRyYWN1bGEgc3Bhbi5jbS12YXJpYWJsZSB7IGNvbG9yOiAjNTBmYTdiOyB9Ci5jbS1zLWRyYWN1bGEgc3Bhbi5jbS12YXJpYWJsZS0yIHsgY29sb3I6IHdoaXRlOyB9Ci5jbS1zLWRyYWN1bGEgc3Bhbi5jbS1kZWYgeyBjb2xvcjogI2ZmYjg2YzsgfQouY20tcy1kcmFjdWxhIHNwYW4uY20ta2V5d29yZCB7IGNvbG9yOiAjZmY3OWM2OyB9Ci5jbS1zLWRyYWN1bGEgc3Bhbi5jbS1vcGVyYXRvciB7IGNvbG9yOiAjZmY3OWM2OyB9Ci5jbS1zLWRyYWN1bGEgc3Bhbi5jbS1rZXl3b3JkIHsgY29sb3I6ICNmZjc5YzY7IH0KLmNtLXMtZHJhY3VsYSBzcGFuLmNtLWF0b20geyBjb2xvcjogI2JkOTNmOTsgfQouY20tcy1kcmFjdWxhIHNwYW4uY20tbWV0YSB7IGNvbG9yOiAjZjhmOGYyOyB9Ci5jbS1zLWRyYWN1bGEgc3Bhbi5jbS10YWcgeyBjb2xvcjogI2ZmNzljNjsgfQouY20tcy1kcmFjdWxhIHNwYW4uY20tYXR0cmlidXRlIHsgY29sb3I6ICM1MGZhN2I7IH0KLmNtLXMtZHJhY3VsYSBzcGFuLmNtLXF1YWxpZmllciB7IGNvbG9yOiAjNTBmYTdiOyB9Ci5jbS1zLWRyYWN1bGEgc3Bhbi5jbS1wcm9wZXJ0eSB7IGNvbG9yOiAjNjZkOWVmOyB9Ci5jbS1zLWRyYWN1bGEgc3Bhbi5jbS1idWlsdGluIHsgY29sb3I6ICM1MGZhN2I7IH0KLmNtLXMtZHJhY3VsYSBzcGFuLmNtLXZhcmlhYmxlLTMgeyBjb2xvcjogIzUwZmE3YjsgfQoKLmNtLXMtZHJhY3VsYSAuQ29kZU1pcnJvci1hY3RpdmVsaW5lLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwyNTUsMjU1LDAuMSk7IH0KLmNtLXMtZHJhY3VsYSAuQ29kZU1pcnJvci1tYXRjaGluZ2JyYWNrZXQgeyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgY29sb3I6IHdoaXRlICFpbXBvcnRhbnQ7IH0K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/theme/duotone-dark.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKTmFtZTogICBEdW9Ub25lLURhcmsKQXV0aG9yOiBieSBCcmFtIGRlIEhhYW4sIGFkYXB0ZWQgZnJvbSBEdW9Ub25lIHRoZW1lcyBieSBTaW11cmFpIChodHRwOi8vc2ltdXJhaS5jb20vcHJvamVjdHMvMjAxNi8wMS8wMS9kdW90b25lLXRoZW1lcykKCkNvZGVNaXJyb3IgdGVtcGxhdGUgYnkgSmFuIFQuIFNvdHQgKGh0dHBzOi8vZ2l0aHViLmNvbS9pZGxlYmVyZyksIGFkYXB0ZWQgYnkgQnJhbSBkZSBIYWFuIChodHRwczovL2dpdGh1Yi5jb20vYXRlbGllcmJyYW0vKQoqLwoKLmNtLXMtZHVvdG9uZS1kYXJrLkNvZGVNaXJyb3IgeyBiYWNrZ3JvdW5kOiAjMmEyNzM0OyBjb2xvcjogIzZjNjc4MzsgfQouY20tcy1kdW90b25lLWRhcmsgZGl2LkNvZGVNaXJyb3Itc2VsZWN0ZWQgeyBiYWNrZ3JvdW5kOiAjNTQ1MTY3IWltcG9ydGFudDsgfQouY20tcy1kdW90b25lLWRhcmsgLkNvZGVNaXJyb3ItZ3V0dGVycyB7IGJhY2tncm91bmQ6ICMyYTI3MzQ7IGJvcmRlci1yaWdodDogMHB4OyB9Ci5jbS1zLWR1b3RvbmUtZGFyayAuQ29kZU1pcnJvci1saW5lbnVtYmVyIHsgY29sb3I6ICM1NDUxNjc7IH0KCi8qIGJlZ2luIGN1cnNvciAqLwouY20tcy1kdW90b25lLWRhcmsgLkNvZGVNaXJyb3ItY3Vyc29yIHsgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjZmZhZDVjOyAvKiBib3JkZXItbGVmdDogMXB4IHNvbGlkICNmZmFkNWM4MDsgKi8gYm9yZGVyLXJpZ2h0OiAuNWVtIHNvbGlkICNmZmFkNWM7IC8qIGJvcmRlci1yaWdodDogLjVlbSBzb2xpZCAjZmZhZDVjODA7ICovIG9wYWNpdHk6IC41OyB9Ci5jbS1zLWR1b3RvbmUtZGFyayAuQ29kZU1pcnJvci1hY3RpdmVsaW5lLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiAjMzYzMzQyOyAvKiBiYWNrZ3JvdW5kOiAjMzYzMzQyODA7ICAqLyBvcGFjaXR5OiAuNTt9Ci5jbS1zLWR1b3RvbmUtZGFyayAuY20tZmF0LWN1cnNvciAuQ29kZU1pcnJvci1jdXJzb3IgeyBiYWNrZ3JvdW5kOiAjZmZhZDVjOyAvKiBiYWNrZ3JvdW5kOiAjZmZhZDVjODA7ICovIG9wYWNpdHk6IC41O30KLyogZW5kIGN1cnNvciAqLwoKLmNtLXMtZHVvdG9uZS1kYXJrIHNwYW4uY20tYXRvbSwgLmNtLXMtZHVvdG9uZS1kYXJrIHNwYW4uY20tbnVtYmVyLCAuY20tcy1kdW90b25lLWRhcmsgc3Bhbi5jbS1rZXl3b3JkLCAuY20tcy1kdW90b25lLWRhcmsgc3Bhbi5jbS12YXJpYWJsZSwgLmNtLXMtZHVvdG9uZS1kYXJrIHNwYW4uY20tYXR0cmlidXRlLCAuY20tcy1kdW90b25lLWRhcmsgc3Bhbi5jbS1xdW90ZSwgLmNtLXMtZHVvdG9uZS1kYXJrIHNwYW4uY20taHIsIC5jbS1zLWR1b3RvbmUtZGFyayBzcGFuLmNtLWxpbmsgeyBjb2xvcjogI2ZmY2M5OTsgfQoKLmNtLXMtZHVvdG9uZS1kYXJrIHNwYW4uY20tcHJvcGVydHkgeyBjb2xvcjogIzlhODZmZDsgfQouY20tcy1kdW90b25lLWRhcmsgc3Bhbi5jbS1wdW5jdHVhdGlvbiwgLmNtLXMtZHVvdG9uZS1kYXJrIHNwYW4uY20tdW5pdCwgLmNtLXMtZHVvdG9uZS1kYXJrIHNwYW4uY20tbmVnYXRpdmUgeyBjb2xvcjogI2UwOTE0MjsgfQouY20tcy1kdW90b25lLWRhcmsgc3Bhbi5jbS1zdHJpbmcgeyBjb2xvcjogI2ZmYjg3MDsgfQouY20tcy1kdW90b25lLWRhcmsgc3Bhbi5jbS1vcGVyYXRvciB7IGNvbG9yOiAjZmZhZDVjOyB9Ci5jbS1zLWR1b3RvbmUtZGFyayBzcGFuLmNtLXBvc2l0aXZlIHsgY29sb3I6ICM2YTUxZTY7IH0KCi5jbS1zLWR1b3RvbmUtZGFyayBzcGFuLmNtLXZhcmlhYmxlLTIsIC5jbS1zLWR1b3RvbmUtZGFyayBzcGFuLmNtLXZhcmlhYmxlLTMsIC5jbS1zLWR1b3RvbmUtZGFyayBzcGFuLmNtLXN0cmluZy0yLCAuY20tcy1kdW90b25lLWRhcmsgc3Bhbi5jbS11cmwgeyBjb2xvcjogIzdhNjNlZTsgfQouY20tcy1kdW90b25lLWRhcmsgc3Bhbi5jbS1kZWYsIC5jbS1zLWR1b3RvbmUtZGFyayBzcGFuLmNtLXRhZywgLmNtLXMtZHVvdG9uZS1kYXJrIHNwYW4uY20tYnVpbHRpbiwgLmNtLXMtZHVvdG9uZS1kYXJrIHNwYW4uY20tcXVhbGlmaWVyLCAuY20tcy1kdW90b25lLWRhcmsgc3Bhbi5jbS1oZWFkZXIsIC5jbS1zLWR1b3RvbmUtZGFyayBzcGFuLmNtLWVtIHsgY29sb3I6ICNlZWViZmY7IH0KLmNtLXMtZHVvdG9uZS1kYXJrIHNwYW4uY20tYnJhY2tldCwgLmNtLXMtZHVvdG9uZS1kYXJrIHNwYW4uY20tY29tbWVudCB7IGNvbG9yOiAjNmM2NzgzOyB9CgovKiB1c2luZyAjZjAwIHJlZCBmb3IgZXJyb3JzLCBkb24ndCB0aGluayBhbnkgb2YgdGhlIGNvbG9yc2NoZW1lIHZhcmlhYmxlcyB3aWxsIHN0YW5kIG91dCBlbm91Z2gsIC4uLiBtYXliZSBieSBnaXZpbmcgaXQgYSBiYWNrZ3JvdW5kLWNvbG9yIC4uLiAqLwouY20tcy1kdW90b25lLWRhcmsgc3Bhbi5jbS1lcnJvciwgLmNtLXMtZHVvdG9uZS1kYXJrIHNwYW4uY20taW52YWxpZGNoYXIgeyBjb2xvcjogI2YwMDsgfQoKLmNtLXMtZHVvdG9uZS1kYXJrIHNwYW4uY20taGVhZGVyIHsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgfQouY20tcy1kdW90b25lLWRhcmsgLkNvZGVNaXJyb3ItbWF0Y2hpbmdicmFja2V0IHsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IGNvbG9yOiAjZWVlYmZmICFpbXBvcnRhbnQ7IH0gCg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/theme/duotone-light.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKTmFtZTogICBEdW9Ub25lLUxpZ2h0CkF1dGhvcjogYnkgQnJhbSBkZSBIYWFuLCBhZGFwdGVkIGZyb20gRHVvVG9uZSB0aGVtZXMgYnkgU2ltdXJhaSAoaHR0cDovL3NpbXVyYWkuY29tL3Byb2plY3RzLzIwMTYvMDEvMDEvZHVvdG9uZS10aGVtZXMpCgpDb2RlTWlycm9yIHRlbXBsYXRlIGJ5IEphbiBULiBTb3R0IChodHRwczovL2dpdGh1Yi5jb20vaWRsZWJlcmcpLCBhZGFwdGVkIGJ5IEJyYW0gZGUgSGFhbiAoaHR0cHM6Ly9naXRodWIuY29tL2F0ZWxpZXJicmFtLykKKi8KCi5jbS1zLWR1b3RvbmUtbGlnaHQuQ29kZU1pcnJvciB7IGJhY2tncm91bmQ6ICNmYWY4ZjU7IGNvbG9yOiAjYjI5NzYyOyB9Ci5jbS1zLWR1b3RvbmUtbGlnaHQgZGl2LkNvZGVNaXJyb3Itc2VsZWN0ZWQgeyBiYWNrZ3JvdW5kOiAjZTNkY2NlICFpbXBvcnRhbnQ7IH0KLmNtLXMtZHVvdG9uZS1saWdodCAuQ29kZU1pcnJvci1ndXR0ZXJzIHsgYmFja2dyb3VuZDogI2ZhZjhmNTsgYm9yZGVyLXJpZ2h0OiAwcHg7IH0KLmNtLXMtZHVvdG9uZS1saWdodCAuQ29kZU1pcnJvci1saW5lbnVtYmVyIHsgY29sb3I6ICNjZGM0YjE7IH0KCi8qIGJlZ2luIGN1cnNvciAqLwouY20tcy1kdW90b25lLWxpZ2h0IC5Db2RlTWlycm9yLWN1cnNvciB7IGJvcmRlci1sZWZ0OiAxcHggc29saWQgIzkzYWJkYzsgLyogYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjOTNhYmRjODA7ICovIGJvcmRlci1yaWdodDogLjVlbSBzb2xpZCAjOTNhYmRjOyAvKiBib3JkZXItcmlnaHQ6IC41ZW0gc29saWQgIzkzYWJkYzgwOyAqLyBvcGFjaXR5OiAuNTsgfQouY20tcy1kdW90b25lLWxpZ2h0IC5Db2RlTWlycm9yLWFjdGl2ZWxpbmUtYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6ICNlM2RjY2U7ICAvKiBiYWNrZ3JvdW5kOiAjZTNkY2NlODA7ICovIG9wYWNpdHk6IC41OyB9Ci5jbS1zLWR1b3RvbmUtbGlnaHQgLmNtLWZhdC1jdXJzb3IgLkNvZGVNaXJyb3ItY3Vyc29yIHsgYmFja2dyb3VuZDogIzkzYWJkYzsgLyogIzkzYWJkYzgwOyAqLyBvcGFjaXR5OiAuNTsgfQovKiBlbmQgY3Vyc29yICovCgouY20tcy1kdW90b25lLWxpZ2h0IHNwYW4uY20tYXRvbSwgLmNtLXMtZHVvdG9uZS1saWdodCBzcGFuLmNtLW51bWJlciwgLmNtLXMtZHVvdG9uZS1saWdodCBzcGFuLmNtLWtleXdvcmQsIC5jbS1zLWR1b3RvbmUtbGlnaHQgc3Bhbi5jbS12YXJpYWJsZSwgLmNtLXMtZHVvdG9uZS1saWdodCBzcGFuLmNtLWF0dHJpYnV0ZSwgLmNtLXMtZHVvdG9uZS1saWdodCBzcGFuLmNtLXF1b3RlLCAuY20tcy1kdW90b25lLWxpZ2h0LWxpZ2h0IHNwYW4uY20taHIsIC5jbS1zLWR1b3RvbmUtbGlnaHQtbGlnaHQgc3Bhbi5jbS1saW5rIHsgY29sb3I6ICMwNjMyODk7IH0KCi5jbS1zLWR1b3RvbmUtbGlnaHQgc3Bhbi5jbS1wcm9wZXJ0eSB7IGNvbG9yOiAjYjI5NzYyOyB9Ci5jbS1zLWR1b3RvbmUtbGlnaHQgc3Bhbi5jbS1wdW5jdHVhdGlvbiwgLmNtLXMtZHVvdG9uZS1saWdodCBzcGFuLmNtLXVuaXQsIC5jbS1zLWR1b3RvbmUtbGlnaHQgc3Bhbi5jbS1uZWdhdGl2ZSB7IGNvbG9yOiAjMDYzMjg5OyB9Ci5jbS1zLWR1b3RvbmUtbGlnaHQgc3Bhbi5jbS1zdHJpbmcsIC5jbS1zLWR1b3RvbmUtbGlnaHQgc3Bhbi5jbS1vcGVyYXRvciB7IGNvbG9yOiAjMTY1OWRmOyB9Ci5jbS1zLWR1b3RvbmUtbGlnaHQgc3Bhbi5jbS1wb3NpdGl2ZSB7IGNvbG9yOiAjODk2NzI0OyB9CgouY20tcy1kdW90b25lLWxpZ2h0IHNwYW4uY20tdmFyaWFibGUtMiwgLmNtLXMtZHVvdG9uZS1saWdodCBzcGFuLmNtLXZhcmlhYmxlLTMsIC5jbS1zLWR1b3RvbmUtbGlnaHQgc3Bhbi5jbS1zdHJpbmctMiwgLmNtLXMtZHVvdG9uZS1saWdodCBzcGFuLmNtLXVybCB7IGNvbG9yOiAjODk2NzI0OyB9Ci5jbS1zLWR1b3RvbmUtbGlnaHQgc3Bhbi5jbS1kZWYsIC5jbS1zLWR1b3RvbmUtbGlnaHQgc3Bhbi5jbS10YWcsIC5jbS1zLWR1b3RvbmUtbGlnaHQgc3Bhbi5jbS1idWlsdGluLCAuY20tcy1kdW90b25lLWxpZ2h0IHNwYW4uY20tcXVhbGlmaWVyLCAuY20tcy1kdW90b25lLWxpZ2h0IHNwYW4uY20taGVhZGVyLCAuY20tcy1kdW90b25lLWxpZ2h0IHNwYW4uY20tZW0geyBjb2xvcjogIzJkMjAwNjsgfQouY20tcy1kdW90b25lLWxpZ2h0IHNwYW4uY20tYnJhY2tldCwgLmNtLXMtZHVvdG9uZS1saWdodCBzcGFuLmNtLWNvbW1lbnQgeyBjb2xvcjogI2I2YWQ5YTsgfQoKLyogdXNpbmcgI2YwMCByZWQgZm9yIGVycm9ycywgZG9uJ3QgdGhpbmsgYW55IG9mIHRoZSBjb2xvcnNjaGVtZSB2YXJpYWJsZXMgd2lsbCBzdGFuZCBvdXQgZW5vdWdoLCAuLi4gbWF5YmUgYnkgZ2l2aW5nIGl0IGEgYmFja2dyb3VuZC1jb2xvciAuLi4gKi8KLyogLmNtLXMtZHVvdG9uZS1saWdodCBzcGFuLmNtLWVycm9yIHsgYmFja2dyb3VuZDogIzg5NjcyNDsgY29sb3I6ICM3MjhmY2I7IH0gKi8KLmNtLXMtZHVvdG9uZS1saWdodCBzcGFuLmNtLWVycm9yLCAuY20tcy1kdW90b25lLWxpZ2h0IHNwYW4uY20taW52YWxpZGNoYXIgeyBjb2xvcjogI2YwMDsgfQoKLmNtLXMtZHVvdG9uZS1saWdodCBzcGFuLmNtLWhlYWRlciB7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IH0KLmNtLXMtZHVvdG9uZS1saWdodCAuQ29kZU1pcnJvci1tYXRjaGluZ2JyYWNrZXQgeyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgY29sb3I6ICNmYWY4ZjUgIWltcG9ydGFudDsgfQoK]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/theme/eclipse.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LmNtLXMtZWNsaXBzZSBzcGFuLmNtLW1ldGEgeyBjb2xvcjogI0ZGMTcxNzsgfQouY20tcy1lY2xpcHNlIHNwYW4uY20ta2V5d29yZCB7IGxpbmUtaGVpZ2h0OiAxZW07IGZvbnQtd2VpZ2h0OiBib2xkOyBjb2xvcjogIzdGMDA1NTsgfQouY20tcy1lY2xpcHNlIHNwYW4uY20tYXRvbSB7IGNvbG9yOiAjMjE5OyB9Ci5jbS1zLWVjbGlwc2Ugc3Bhbi5jbS1udW1iZXIgeyBjb2xvcjogIzE2NDsgfQouY20tcy1lY2xpcHNlIHNwYW4uY20tZGVmIHsgY29sb3I6ICMwMGY7IH0KLmNtLXMtZWNsaXBzZSBzcGFuLmNtLXZhcmlhYmxlIHsgY29sb3I6IGJsYWNrOyB9Ci5jbS1zLWVjbGlwc2Ugc3Bhbi5jbS12YXJpYWJsZS0yIHsgY29sb3I6ICMwMDAwQzA7IH0KLmNtLXMtZWNsaXBzZSBzcGFuLmNtLXZhcmlhYmxlLTMgeyBjb2xvcjogIzAwMDBDMDsgfQouY20tcy1lY2xpcHNlIHNwYW4uY20tcHJvcGVydHkgeyBjb2xvcjogYmxhY2s7IH0KLmNtLXMtZWNsaXBzZSBzcGFuLmNtLW9wZXJhdG9yIHsgY29sb3I6IGJsYWNrOyB9Ci5jbS1zLWVjbGlwc2Ugc3Bhbi5jbS1jb21tZW50IHsgY29sb3I6ICMzRjdGNUY7IH0KLmNtLXMtZWNsaXBzZSBzcGFuLmNtLXN0cmluZyB7IGNvbG9yOiAjMkEwMEZGOyB9Ci5jbS1zLWVjbGlwc2Ugc3Bhbi5jbS1zdHJpbmctMiB7IGNvbG9yOiAjZjUwOyB9Ci5jbS1zLWVjbGlwc2Ugc3Bhbi5jbS1xdWFsaWZpZXIgeyBjb2xvcjogIzU1NTsgfQouY20tcy1lY2xpcHNlIHNwYW4uY20tYnVpbHRpbiB7IGNvbG9yOiAjMzBhOyB9Ci5jbS1zLWVjbGlwc2Ugc3Bhbi5jbS1icmFja2V0IHsgY29sb3I6ICNjYzc7IH0KLmNtLXMtZWNsaXBzZSBzcGFuLmNtLXRhZyB7IGNvbG9yOiAjMTcwOyB9Ci5jbS1zLWVjbGlwc2Ugc3Bhbi5jbS1hdHRyaWJ1dGUgeyBjb2xvcjogIzAwYzsgfQouY20tcy1lY2xpcHNlIHNwYW4uY20tbGluayB7IGNvbG9yOiAjMjE5OyB9Ci5jbS1zLWVjbGlwc2Ugc3Bhbi5jbS1lcnJvciB7IGNvbG9yOiAjZjAwOyB9CgouY20tcy1lY2xpcHNlIC5Db2RlTWlycm9yLWFjdGl2ZWxpbmUtYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6ICNlOGYyZmY7IH0KLmNtLXMtZWNsaXBzZSAuQ29kZU1pcnJvci1tYXRjaGluZ2JyYWNrZXQgeyBvdXRsaW5lOjFweCBzb2xpZCBncmV5OyBjb2xvcjpibGFjayAhaW1wb3J0YW50OyB9Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/theme/elegant.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LmNtLXMtZWxlZ2FudCBzcGFuLmNtLW51bWJlciwgLmNtLXMtZWxlZ2FudCBzcGFuLmNtLXN0cmluZywgLmNtLXMtZWxlZ2FudCBzcGFuLmNtLWF0b20geyBjb2xvcjogIzc2MjsgfQouY20tcy1lbGVnYW50IHNwYW4uY20tY29tbWVudCB7IGNvbG9yOiAjMjYyOyBmb250LXN0eWxlOiBpdGFsaWM7IGxpbmUtaGVpZ2h0OiAxZW07IH0KLmNtLXMtZWxlZ2FudCBzcGFuLmNtLW1ldGEgeyBjb2xvcjogIzU1NTsgZm9udC1zdHlsZTogaXRhbGljOyBsaW5lLWhlaWdodDogMWVtOyB9Ci5jbS1zLWVsZWdhbnQgc3Bhbi5jbS12YXJpYWJsZSB7IGNvbG9yOiBibGFjazsgfQouY20tcy1lbGVnYW50IHNwYW4uY20tdmFyaWFibGUtMiB7IGNvbG9yOiAjYjExOyB9Ci5jbS1zLWVsZWdhbnQgc3Bhbi5jbS1xdWFsaWZpZXIgeyBjb2xvcjogIzU1NTsgfQouY20tcy1lbGVnYW50IHNwYW4uY20ta2V5d29yZCB7IGNvbG9yOiAjNzMwOyB9Ci5jbS1zLWVsZWdhbnQgc3Bhbi5jbS1idWlsdGluIHsgY29sb3I6ICMzMGE7IH0KLmNtLXMtZWxlZ2FudCBzcGFuLmNtLWxpbmsgeyBjb2xvcjogIzc2MjsgfQouY20tcy1lbGVnYW50IHNwYW4uY20tZXJyb3IgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjZmRkOyB9CgouY20tcy1lbGVnYW50IC5Db2RlTWlycm9yLWFjdGl2ZWxpbmUtYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6ICNlOGYyZmY7IH0KLmNtLXMtZWxlZ2FudCAuQ29kZU1pcnJvci1tYXRjaGluZ2JyYWNrZXQgeyBvdXRsaW5lOjFweCBzb2xpZCBncmV5OyBjb2xvcjpibGFjayAhaW1wb3J0YW50OyB9Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/theme/erlang-dark.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LmNtLXMtZXJsYW5nLWRhcmsuQ29kZU1pcnJvciB7IGJhY2tncm91bmQ6ICMwMDIyNDA7IGNvbG9yOiB3aGl0ZTsgfQouY20tcy1lcmxhbmctZGFyayBkaXYuQ29kZU1pcnJvci1zZWxlY3RlZCB7IGJhY2tncm91bmQ6ICNiMzY1Mzk7IH0KLmNtLXMtZXJsYW5nLWRhcmsgLkNvZGVNaXJyb3ItbGluZTo6c2VsZWN0aW9uLCAuY20tcy1lcmxhbmctZGFyayAuQ29kZU1pcnJvci1saW5lID4gc3Bhbjo6c2VsZWN0aW9uLCAuY20tcy1lcmxhbmctZGFyayAuQ29kZU1pcnJvci1saW5lID4gc3BhbiA+IHNwYW46OnNlbGVjdGlvbiB7IGJhY2tncm91bmQ6IHJnYmEoMTc5LCAxMDEsIDU3LCAuOTkpOyB9Ci5jbS1zLWVybGFuZy1kYXJrIC5Db2RlTWlycm9yLWxpbmU6Oi1tb3otc2VsZWN0aW9uLCAuY20tcy1lcmxhbmctZGFyayAuQ29kZU1pcnJvci1saW5lID4gc3Bhbjo6LW1vei1zZWxlY3Rpb24sIC5jbS1zLWVybGFuZy1kYXJrIC5Db2RlTWlycm9yLWxpbmUgPiBzcGFuID4gc3Bhbjo6LW1vei1zZWxlY3Rpb24geyBiYWNrZ3JvdW5kOiByZ2JhKDE3OSwgMTAxLCA1NywgLjk5KTsgfQouY20tcy1lcmxhbmctZGFyayAuQ29kZU1pcnJvci1ndXR0ZXJzIHsgYmFja2dyb3VuZDogIzAwMjI0MDsgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgI2FhYTsgfQouY20tcy1lcmxhbmctZGFyayAuQ29kZU1pcnJvci1ndXR0ZXJtYXJrZXIgeyBjb2xvcjogd2hpdGU7IH0KLmNtLXMtZXJsYW5nLWRhcmsgLkNvZGVNaXJyb3ItZ3V0dGVybWFya2VyLXN1YnRsZSB7IGNvbG9yOiAjZDBkMGQwOyB9Ci5jbS1zLWVybGFuZy1kYXJrIC5Db2RlTWlycm9yLWxpbmVudW1iZXIgeyBjb2xvcjogI2QwZDBkMDsgfQouY20tcy1lcmxhbmctZGFyayAuQ29kZU1pcnJvci1jdXJzb3IgeyBib3JkZXItbGVmdDogMXB4IHNvbGlkIHdoaXRlOyB9CgouY20tcy1lcmxhbmctZGFyayBzcGFuLmNtLXF1b3RlICAgICAgeyBjb2xvcjogI2NjYzsgfQouY20tcy1lcmxhbmctZGFyayBzcGFuLmNtLWF0b20gICAgICAgeyBjb2xvcjogI2YxMzNmMTsgfQouY20tcy1lcmxhbmctZGFyayBzcGFuLmNtLWF0dHJpYnV0ZSAgeyBjb2xvcjogI2ZmODBlMTsgfQouY20tcy1lcmxhbmctZGFyayBzcGFuLmNtLWJyYWNrZXQgICAgeyBjb2xvcjogI2ZmOWQwMDsgfQouY20tcy1lcmxhbmctZGFyayBzcGFuLmNtLWJ1aWx0aW4gICAgeyBjb2xvcjogI2VhYTsgfQouY20tcy1lcmxhbmctZGFyayBzcGFuLmNtLWNvbW1lbnQgICAgeyBjb2xvcjogIzc3ZjsgfQouY20tcy1lcmxhbmctZGFyayBzcGFuLmNtLWRlZiAgICAgICAgeyBjb2xvcjogI2U3YTsgfQouY20tcy1lcmxhbmctZGFyayBzcGFuLmNtLWtleXdvcmQgICAgeyBjb2xvcjogI2ZmZWU4MDsgfQouY20tcy1lcmxhbmctZGFyayBzcGFuLmNtLW1ldGEgICAgICAgeyBjb2xvcjogIzUwZmVmZTsgfQouY20tcy1lcmxhbmctZGFyayBzcGFuLmNtLW51bWJlciAgICAgeyBjb2xvcjogI2ZmZDBkMDsgfQouY20tcy1lcmxhbmctZGFyayBzcGFuLmNtLW9wZXJhdG9yICAgeyBjb2xvcjogI2Q1NTsgfQouY20tcy1lcmxhbmctZGFyayBzcGFuLmNtLXByb3BlcnR5ICAgeyBjb2xvcjogI2NjYzsgfQouY20tcy1lcmxhbmctZGFyayBzcGFuLmNtLXF1YWxpZmllciAgeyBjb2xvcjogI2NjYzsgfQouY20tcy1lcmxhbmctZGFyayBzcGFuLmNtLXNwZWNpYWwgICAgeyBjb2xvcjogI2ZmYmJiYjsgfQouY20tcy1lcmxhbmctZGFyayBzcGFuLmNtLXN0cmluZyAgICAgeyBjb2xvcjogIzNhZDkwMDsgfQouY20tcy1lcmxhbmctZGFyayBzcGFuLmNtLXN0cmluZy0yICAgeyBjb2xvcjogI2NjYzsgfQouY20tcy1lcmxhbmctZGFyayBzcGFuLmNtLXRhZyAgICAgICAgeyBjb2xvcjogIzllZmZmZjsgfQouY20tcy1lcmxhbmctZGFyayBzcGFuLmNtLXZhcmlhYmxlICAgeyBjb2xvcjogIzUwZmU1MDsgfQouY20tcy1lcmxhbmctZGFyayBzcGFuLmNtLXZhcmlhYmxlLTIgeyBjb2xvcjogI2UwZTsgfQouY20tcy1lcmxhbmctZGFyayBzcGFuLmNtLXZhcmlhYmxlLTMgeyBjb2xvcjogI2NjYzsgfQouY20tcy1lcmxhbmctZGFyayBzcGFuLmNtLWVycm9yICAgICAgeyBjb2xvcjogIzlkMWUxNTsgfQoKLmNtLXMtZXJsYW5nLWRhcmsgLkNvZGVNaXJyb3ItYWN0aXZlbGluZS1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogIzAxMzQ2MTsgfQouY20tcy1lcmxhbmctZGFyayAuQ29kZU1pcnJvci1tYXRjaGluZ2JyYWNrZXQgeyBvdXRsaW5lOjFweCBzb2xpZCBncmV5OyBjb2xvcjp3aGl0ZSAhaW1wb3J0YW50OyB9Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/theme/hopscotch.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKCiAgICBOYW1lOiAgICAgICBIb3BzY290Y2gKICAgIEF1dGhvcjogICAgIEphbiBULiBTb3R0CgogICAgQ29kZU1pcnJvciB0ZW1wbGF0ZSBieSBKYW4gVC4gU290dCAoaHR0cHM6Ly9naXRodWIuY29tL2lkbGViZXJnL2Jhc2UxNi1jb2RlbWlycm9yKQogICAgT3JpZ2luYWwgQmFzZTE2IGNvbG9yIHNjaGVtZSBieSBDaHJpcyBLZW1wc29uIChodHRwczovL2dpdGh1Yi5jb20vY2hyaXNrZW1wc29uL2Jhc2UxNikKCiovCgouY20tcy1ob3BzY290Y2guQ29kZU1pcnJvciB7YmFja2dyb3VuZDogIzMyMjkzMTsgY29sb3I6ICNkNWQzZDU7fQouY20tcy1ob3BzY290Y2ggZGl2LkNvZGVNaXJyb3Itc2VsZWN0ZWQge2JhY2tncm91bmQ6ICM0MzNiNDIgIWltcG9ydGFudDt9Ci5jbS1zLWhvcHNjb3RjaCAuQ29kZU1pcnJvci1ndXR0ZXJzIHtiYWNrZ3JvdW5kOiAjMzIyOTMxOyBib3JkZXItcmlnaHQ6IDBweDt9Ci5jbS1zLWhvcHNjb3RjaCAuQ29kZU1pcnJvci1saW5lbnVtYmVyIHtjb2xvcjogIzc5NzM3OTt9Ci5jbS1zLWhvcHNjb3RjaCAuQ29kZU1pcnJvci1jdXJzb3Ige2JvcmRlci1sZWZ0OiAxcHggc29saWQgIzk4OTQ5OCAhaW1wb3J0YW50O30KCi5jbS1zLWhvcHNjb3RjaCBzcGFuLmNtLWNvbW1lbnQge2NvbG9yOiAjYjMzNTA4O30KLmNtLXMtaG9wc2NvdGNoIHNwYW4uY20tYXRvbSB7Y29sb3I6ICNjODVlN2M7fQouY20tcy1ob3BzY290Y2ggc3Bhbi5jbS1udW1iZXIge2NvbG9yOiAjYzg1ZTdjO30KCi5jbS1zLWhvcHNjb3RjaCBzcGFuLmNtLXByb3BlcnR5LCAuY20tcy1ob3BzY290Y2ggc3Bhbi5jbS1hdHRyaWJ1dGUge2NvbG9yOiAjOGZjMTNlO30KLmNtLXMtaG9wc2NvdGNoIHNwYW4uY20ta2V5d29yZCB7Y29sb3I6ICNkZDQ2NGM7fQouY20tcy1ob3BzY290Y2ggc3Bhbi5jbS1zdHJpbmcge2NvbG9yOiAjZmRjYzU5O30KCi5jbS1zLWhvcHNjb3RjaCBzcGFuLmNtLXZhcmlhYmxlIHtjb2xvcjogIzhmYzEzZTt9Ci5jbS1zLWhvcHNjb3RjaCBzcGFuLmNtLXZhcmlhYmxlLTIge2NvbG9yOiAjMTI5MGJmO30KLmNtLXMtaG9wc2NvdGNoIHNwYW4uY20tZGVmIHtjb2xvcjogI2ZkOGIxOTt9Ci5jbS1zLWhvcHNjb3RjaCBzcGFuLmNtLWVycm9yIHtiYWNrZ3JvdW5kOiAjZGQ0NjRjOyBjb2xvcjogIzk4OTQ5ODt9Ci5jbS1zLWhvcHNjb3RjaCBzcGFuLmNtLWJyYWNrZXQge2NvbG9yOiAjZDVkM2Q1O30KLmNtLXMtaG9wc2NvdGNoIHNwYW4uY20tdGFnIHtjb2xvcjogI2RkNDY0Yzt9Ci5jbS1zLWhvcHNjb3RjaCBzcGFuLmNtLWxpbmsge2NvbG9yOiAjYzg1ZTdjO30KCi5jbS1zLWhvcHNjb3RjaCAuQ29kZU1pcnJvci1tYXRjaGluZ2JyYWNrZXQgeyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgY29sb3I6IHdoaXRlICFpbXBvcnRhbnQ7fQouY20tcy1ob3BzY290Y2ggLkNvZGVNaXJyb3ItYWN0aXZlbGluZS1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogIzMwMjAyMDsgfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/theme/icecoder.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKSUNFY29kZXIgZGVmYXVsdCB0aGVtZSBieSBNYXR0IFBhc3MsIHVzZWQgaW4gY29kZSBlZGl0b3IgYXZhaWxhYmxlIGF0IGh0dHBzOi8vaWNlY29kZXIubmV0CiovCgouY20tcy1pY2Vjb2RlciB7IGNvbG9yOiAjNjY2OyBiYWNrZ3JvdW5kOiAjMWQxZDFiOyB9CgouY20tcy1pY2Vjb2RlciBzcGFuLmNtLWtleXdvcmQgeyBjb2xvcjogI2VlZTsgZm9udC13ZWlnaHQ6Ym9sZDsgfSAgLyogb2ZmLXdoaXRlIDEgKi8KLmNtLXMtaWNlY29kZXIgc3Bhbi5jbS1hdG9tIHsgY29sb3I6ICNlMWM3NmU7IH0gICAgICAgICAgICAgICAgICAgIC8qIHllbGxvdyAqLwouY20tcy1pY2Vjb2RlciBzcGFuLmNtLW51bWJlciB7IGNvbG9yOiAjNmNiNWQ5OyB9ICAgICAgICAgICAgICAgICAgLyogYmx1ZSAqLwouY20tcy1pY2Vjb2RlciBzcGFuLmNtLWRlZiB7IGNvbG9yOiAjYjljYTRhOyB9ICAgICAgICAgICAgICAgICAgICAgLyogZ3JlZW4gKi8KCi5jbS1zLWljZWNvZGVyIHNwYW4uY20tdmFyaWFibGUgeyBjb2xvcjogIzZjYjVkOTsgfSAgICAgICAgICAgICAgICAvKiBibHVlICovCi5jbS1zLWljZWNvZGVyIHNwYW4uY20tdmFyaWFibGUtMiB7IGNvbG9yOiAjY2MxZTVjOyB9ICAgICAgICAgICAgICAvKiBwaW5rICovCi5jbS1zLWljZWNvZGVyIHNwYW4uY20tdmFyaWFibGUtMyB7IGNvbG9yOiAjZjk2MDJjOyB9ICAgICAgICAgICAgICAvKiBvcmFuZ2UgKi8KCi5jbS1zLWljZWNvZGVyIHNwYW4uY20tcHJvcGVydHkgeyBjb2xvcjogI2VlZTsgfSAgICAgICAgICAgICAgICAgICAvKiBvZmYtd2hpdGUgMSAqLwouY20tcy1pY2Vjb2RlciBzcGFuLmNtLW9wZXJhdG9yIHsgY29sb3I6ICM5MTc5YmI7IH0gICAgICAgICAgICAgICAgLyogcHVycGxlICovCi5jbS1zLWljZWNvZGVyIHNwYW4uY20tY29tbWVudCB7IGNvbG9yOiAjOTdhM2FhOyB9ICAgICAgICAgICAgICAgICAvKiBncmV5LWJsdWUgKi8KCi5jbS1zLWljZWNvZGVyIHNwYW4uY20tc3RyaW5nIHsgY29sb3I6ICNiOWNhNGE7IH0gICAgICAgICAgICAgICAgICAvKiBncmVlbiAqLwouY20tcy1pY2Vjb2RlciBzcGFuLmNtLXN0cmluZy0yIHsgY29sb3I6ICM2Y2I1ZDk7IH0gICAgICAgICAgICAgICAgLyogYmx1ZSAqLwoKLmNtLXMtaWNlY29kZXIgc3Bhbi5jbS1tZXRhIHsgY29sb3I6ICM1NTU7IH0gICAgICAgICAgICAgICAgICAgICAgIC8qIGdyZXkgKi8KCi5jbS1zLWljZWNvZGVyIHNwYW4uY20tcXVhbGlmaWVyIHsgY29sb3I6ICM1NTU7IH0gICAgICAgICAgICAgICAgICAvKiBncmV5ICovCi5jbS1zLWljZWNvZGVyIHNwYW4uY20tYnVpbHRpbiB7IGNvbG9yOiAjMjE0ZTdiOyB9ICAgICAgICAgICAgICAgICAvKiBicmlnaHQgYmx1ZSAqLwouY20tcy1pY2Vjb2RlciBzcGFuLmNtLWJyYWNrZXQgeyBjb2xvcjogI2NjNzsgfSAgICAgICAgICAgICAgICAgICAgLyogZ3JleS15ZWxsb3cgKi8KCi5jbS1zLWljZWNvZGVyIHNwYW4uY20tdGFnIHsgY29sb3I6ICNlOGU4ZTg7IH0gICAgICAgICAgICAgICAgICAgICAvKiBvZmYtd2hpdGUgMiAqLwouY20tcy1pY2Vjb2RlciBzcGFuLmNtLWF0dHJpYnV0ZSB7IGNvbG9yOiAjMDk5OyB9ICAgICAgICAgICAgICAgICAgLyogdGVhbCAqLwoKLmNtLXMtaWNlY29kZXIgc3Bhbi5jbS1oZWFkZXIgeyBjb2xvcjogIzZhMGQ2YTsgfSAgICAgICAgICAgICAgICAgIC8qIHB1cnBsZS1waW5rICovCi5jbS1zLWljZWNvZGVyIHNwYW4uY20tcXVvdGUgeyBjb2xvcjogIzE4NjcxODsgfSAgICAgICAgICAgICAgICAgICAvKiBkYXJrIGdyZWVuICovCi5jbS1zLWljZWNvZGVyIHNwYW4uY20taHIgeyBjb2xvcjogIzg4ODsgfSAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtaWQtZ3JleSAqLwouY20tcy1pY2Vjb2RlciBzcGFuLmNtLWxpbmsgeyBjb2xvcjogI2UxYzc2ZTsgfSAgICAgICAgICAgICAgICAgICAgLyogeWVsbG93ICovCi5jbS1zLWljZWNvZGVyIHNwYW4uY20tZXJyb3IgeyBjb2xvcjogI2QwMDsgfSAgICAgICAgICAgICAgICAgICAgICAvKiByZWQgKi8KCi5jbS1zLWljZWNvZGVyIC5Db2RlTWlycm9yLWN1cnNvciB7IGJvcmRlci1sZWZ0OiAxcHggc29saWQgd2hpdGU7IH0KLmNtLXMtaWNlY29kZXIgZGl2LkNvZGVNaXJyb3Itc2VsZWN0ZWQgeyBjb2xvcjogI2ZmZjsgYmFja2dyb3VuZDogIzAzNzsgfQouY20tcy1pY2Vjb2RlciAuQ29kZU1pcnJvci1ndXR0ZXJzIHsgYmFja2dyb3VuZDogIzFkMWQxYjsgbWluLXdpZHRoOiA0MXB4OyBib3JkZXItcmlnaHQ6IDA7IH0KLmNtLXMtaWNlY29kZXIgLkNvZGVNaXJyb3ItbGluZW51bWJlciB7IGNvbG9yOiAjNTU1OyBjdXJzb3I6IGRlZmF1bHQ7IH0KLmNtLXMtaWNlY29kZXIgLkNvZGVNaXJyb3ItbWF0Y2hpbmdicmFja2V0IHsgY29sb3I6ICNmZmYgIWltcG9ydGFudDsgYmFja2dyb3VuZDogIzU1NSAhaW1wb3J0YW50OyB9Ci5jbS1zLWljZWNvZGVyIC5Db2RlTWlycm9yLWFjdGl2ZWxpbmUtYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6ICMwMDA7IH0K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/theme/isotope.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKCiAgICBOYW1lOiAgICAgICBJc290b3BlCiAgICBBdXRob3I6ICAgICBEYXZpZCBEZXNhbmRybyAvIEphbiBULiBTb3R0CgogICAgQ29kZU1pcnJvciB0ZW1wbGF0ZSBieSBKYW4gVC4gU290dCAoaHR0cHM6Ly9naXRodWIuY29tL2lkbGViZXJnL2Jhc2UxNi1jb2RlbWlycm9yKQogICAgT3JpZ2luYWwgQmFzZTE2IGNvbG9yIHNjaGVtZSBieSBDaHJpcyBLZW1wc29uIChodHRwczovL2dpdGh1Yi5jb20vY2hyaXNrZW1wc29uL2Jhc2UxNikKCiovCgouY20tcy1pc290b3BlLkNvZGVNaXJyb3Ige2JhY2tncm91bmQ6ICMwMDAwMDA7IGNvbG9yOiAjZTBlMGUwO30KLmNtLXMtaXNvdG9wZSBkaXYuQ29kZU1pcnJvci1zZWxlY3RlZCB7YmFja2dyb3VuZDogIzQwNDA0MCAhaW1wb3J0YW50O30KLmNtLXMtaXNvdG9wZSAuQ29kZU1pcnJvci1ndXR0ZXJzIHtiYWNrZ3JvdW5kOiAjMDAwMDAwOyBib3JkZXItcmlnaHQ6IDBweDt9Ci5jbS1zLWlzb3RvcGUgLkNvZGVNaXJyb3ItbGluZW51bWJlciB7Y29sb3I6ICM4MDgwODA7fQouY20tcy1pc290b3BlIC5Db2RlTWlycm9yLWN1cnNvciB7Ym9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjYzBjMGMwICFpbXBvcnRhbnQ7fQoKLmNtLXMtaXNvdG9wZSBzcGFuLmNtLWNvbW1lbnQge2NvbG9yOiAjMzMwMGZmO30KLmNtLXMtaXNvdG9wZSBzcGFuLmNtLWF0b20ge2NvbG9yOiAjY2MwMGZmO30KLmNtLXMtaXNvdG9wZSBzcGFuLmNtLW51bWJlciB7Y29sb3I6ICNjYzAwZmY7fQoKLmNtLXMtaXNvdG9wZSBzcGFuLmNtLXByb3BlcnR5LCAuY20tcy1pc290b3BlIHNwYW4uY20tYXR0cmlidXRlIHtjb2xvcjogIzMzZmYwMDt9Ci5jbS1zLWlzb3RvcGUgc3Bhbi5jbS1rZXl3b3JkIHtjb2xvcjogI2ZmMDAwMDt9Ci5jbS1zLWlzb3RvcGUgc3Bhbi5jbS1zdHJpbmcge2NvbG9yOiAjZmYwMDk5O30KCi5jbS1zLWlzb3RvcGUgc3Bhbi5jbS12YXJpYWJsZSB7Y29sb3I6ICMzM2ZmMDA7fQouY20tcy1pc290b3BlIHNwYW4uY20tdmFyaWFibGUtMiB7Y29sb3I6ICMwMDY2ZmY7fQouY20tcy1pc290b3BlIHNwYW4uY20tZGVmIHtjb2xvcjogI2ZmOTkwMDt9Ci5jbS1zLWlzb3RvcGUgc3Bhbi5jbS1lcnJvciB7YmFja2dyb3VuZDogI2ZmMDAwMDsgY29sb3I6ICNjMGMwYzA7fQouY20tcy1pc290b3BlIHNwYW4uY20tYnJhY2tldCB7Y29sb3I6ICNlMGUwZTA7fQouY20tcy1pc290b3BlIHNwYW4uY20tdGFnIHtjb2xvcjogI2ZmMDAwMDt9Ci5jbS1zLWlzb3RvcGUgc3Bhbi5jbS1saW5rIHtjb2xvcjogI2NjMDBmZjt9CgouY20tcy1pc290b3BlIC5Db2RlTWlycm9yLW1hdGNoaW5nYnJhY2tldCB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyBjb2xvcjogd2hpdGUgIWltcG9ydGFudDt9Ci5jbS1zLWlzb3RvcGUgLkNvZGVNaXJyb3ItYWN0aXZlbGluZS1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogIzIwMjAyMDsgfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/theme/lesser-dark.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKaHR0cDovL2xlc3Njc3Mub3JnLyBkYXJrIHRoZW1lClBvcnRlZCB0byBDb2RlTWlycm9yIGJ5IFBldGVyIEtyb29uCiovCi5jbS1zLWxlc3Nlci1kYXJrIHsKICBsaW5lLWhlaWdodDogMS4zZW07Cn0KLmNtLXMtbGVzc2VyLWRhcmsuQ29kZU1pcnJvciB7IGJhY2tncm91bmQ6ICMyNjI2MjY7IGNvbG9yOiAjRUJFRkU3OyB0ZXh0LXNoYWRvdzogMCAtMXB4IDFweCAjMjYyNjI2OyB9Ci5jbS1zLWxlc3Nlci1kYXJrIGRpdi5Db2RlTWlycm9yLXNlbGVjdGVkIHsgYmFja2dyb3VuZDogIzQ1NDQzQjsgfSAvKiAzMzMyMkIqLwouY20tcy1sZXNzZXItZGFyayAuQ29kZU1pcnJvci1saW5lOjpzZWxlY3Rpb24sIC5jbS1zLWxlc3Nlci1kYXJrIC5Db2RlTWlycm9yLWxpbmUgPiBzcGFuOjpzZWxlY3Rpb24sIC5jbS1zLWxlc3Nlci1kYXJrIC5Db2RlTWlycm9yLWxpbmUgPiBzcGFuID4gc3Bhbjo6c2VsZWN0aW9uIHsgYmFja2dyb3VuZDogcmdiYSg2OSwgNjgsIDU5LCAuOTkpOyB9Ci5jbS1zLWxlc3Nlci1kYXJrIC5Db2RlTWlycm9yLWxpbmU6Oi1tb3otc2VsZWN0aW9uLCAuY20tcy1sZXNzZXItZGFyayAuQ29kZU1pcnJvci1saW5lID4gc3Bhbjo6LW1vei1zZWxlY3Rpb24sIC5jbS1zLWxlc3Nlci1kYXJrIC5Db2RlTWlycm9yLWxpbmUgPiBzcGFuID4gc3Bhbjo6LW1vei1zZWxlY3Rpb24geyBiYWNrZ3JvdW5kOiByZ2JhKDY5LCA2OCwgNTksIC45OSk7IH0KLmNtLXMtbGVzc2VyLWRhcmsgLkNvZGVNaXJyb3ItY3Vyc29yIHsgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCB3aGl0ZTsgfQouY20tcy1sZXNzZXItZGFyayBwcmUgeyBwYWRkaW5nOiAwIDhweDsgfS8qZWRpdGFibGUgY29kZSBob2xkZXIqLwoKLmNtLXMtbGVzc2VyLWRhcmsuQ29kZU1pcnJvciBzcGFuLkNvZGVNaXJyb3ItbWF0Y2hpbmdicmFja2V0IHsgY29sb3I6ICM3RUZDN0U7IH0vKjY1RkM2NSovCgouY20tcy1sZXNzZXItZGFyayAuQ29kZU1pcnJvci1ndXR0ZXJzIHsgYmFja2dyb3VuZDogIzI2MjYyNjsgYm9yZGVyLXJpZ2h0OjFweCBzb2xpZCAjYWFhOyB9Ci5jbS1zLWxlc3Nlci1kYXJrIC5Db2RlTWlycm9yLWd1dHRlcm1hcmtlciB7IGNvbG9yOiAjNTk5ZWZmOyB9Ci5jbS1zLWxlc3Nlci1kYXJrIC5Db2RlTWlycm9yLWd1dHRlcm1hcmtlci1zdWJ0bGUgeyBjb2xvcjogIzc3NzsgfQouY20tcy1sZXNzZXItZGFyayAuQ29kZU1pcnJvci1saW5lbnVtYmVyIHsgY29sb3I6ICM3Nzc7IH0KCi5jbS1zLWxlc3Nlci1kYXJrIHNwYW4uY20taGVhZGVyIHsgY29sb3I6ICNhMGE7IH0KLmNtLXMtbGVzc2VyLWRhcmsgc3Bhbi5jbS1xdW90ZSB7IGNvbG9yOiAjMDkwOyB9Ci5jbS1zLWxlc3Nlci1kYXJrIHNwYW4uY20ta2V5d29yZCB7IGNvbG9yOiAjNTk5ZWZmOyB9Ci5jbS1zLWxlc3Nlci1kYXJrIHNwYW4uY20tYXRvbSB7IGNvbG9yOiAjQzJCNDcwOyB9Ci5jbS1zLWxlc3Nlci1kYXJrIHNwYW4uY20tbnVtYmVyIHsgY29sb3I6ICNCMzVFNEQ7IH0KLmNtLXMtbGVzc2VyLWRhcmsgc3Bhbi5jbS1kZWYgeyBjb2xvcjogd2hpdGU7IH0KLmNtLXMtbGVzc2VyLWRhcmsgc3Bhbi5jbS12YXJpYWJsZSB7IGNvbG9yOiNEOUJGOEM7IH0KLmNtLXMtbGVzc2VyLWRhcmsgc3Bhbi5jbS12YXJpYWJsZS0yIHsgY29sb3I6ICM2NjkxOTk7IH0KLmNtLXMtbGVzc2VyLWRhcmsgc3Bhbi5jbS12YXJpYWJsZS0zIHsgY29sb3I6IHdoaXRlOyB9Ci5jbS1zLWxlc3Nlci1kYXJrIHNwYW4uY20tcHJvcGVydHkgeyBjb2xvcjogIzkyQTc1QzsgfQouY20tcy1sZXNzZXItZGFyayBzcGFuLmNtLW9wZXJhdG9yIHsgY29sb3I6ICM5MkE3NUM7IH0KLmNtLXMtbGVzc2VyLWRhcmsgc3Bhbi5jbS1jb21tZW50IHsgY29sb3I6ICM2NjY7IH0KLmNtLXMtbGVzc2VyLWRhcmsgc3Bhbi5jbS1zdHJpbmcgeyBjb2xvcjogI0JDRDI3OTsgfQouY20tcy1sZXNzZXItZGFyayBzcGFuLmNtLXN0cmluZy0yIHsgY29sb3I6ICNmNTA7IH0KLmNtLXMtbGVzc2VyLWRhcmsgc3Bhbi5jbS1tZXRhIHsgY29sb3I6ICM3MzhDNzM7IH0KLmNtLXMtbGVzc2VyLWRhcmsgc3Bhbi5jbS1xdWFsaWZpZXIgeyBjb2xvcjogIzU1NTsgfQouY20tcy1sZXNzZXItZGFyayBzcGFuLmNtLWJ1aWx0aW4geyBjb2xvcjogI2ZmOWU1OTsgfQouY20tcy1sZXNzZXItZGFyayBzcGFuLmNtLWJyYWNrZXQgeyBjb2xvcjogI0VCRUZFNzsgfQouY20tcy1sZXNzZXItZGFyayBzcGFuLmNtLXRhZyB7IGNvbG9yOiAjNjY5MTk5OyB9Ci5jbS1zLWxlc3Nlci1kYXJrIHNwYW4uY20tYXR0cmlidXRlIHsgY29sb3I6ICMwMGM7IH0KLmNtLXMtbGVzc2VyLWRhcmsgc3Bhbi5jbS1ociB7IGNvbG9yOiAjOTk5OyB9Ci5jbS1zLWxlc3Nlci1kYXJrIHNwYW4uY20tbGluayB7IGNvbG9yOiAjMDBjOyB9Ci5jbS1zLWxlc3Nlci1kYXJrIHNwYW4uY20tZXJyb3IgeyBjb2xvcjogIzlkMWUxNTsgfQoKLmNtLXMtbGVzc2VyLWRhcmsgLkNvZGVNaXJyb3ItYWN0aXZlbGluZS1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogIzNDM0EzQTsgfQouY20tcy1sZXNzZXItZGFyayAuQ29kZU1pcnJvci1tYXRjaGluZ2JyYWNrZXQgeyBvdXRsaW5lOjFweCBzb2xpZCBncmV5OyBjb2xvcjp3aGl0ZSAhaW1wb3J0YW50OyB9Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/theme/liquibyte.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LmNtLXMtbGlxdWlieXRlLkNvZGVNaXJyb3IgewoJYmFja2dyb3VuZC1jb2xvcjogIzAwMDsKCWNvbG9yOiAjZmZmOwoJbGluZS1oZWlnaHQ6IDEuMmVtOwoJZm9udC1zaXplOiAxZW07Cn0KLmNtLXMtbGlxdWlieXRlIC5Db2RlTWlycm9yLWZvY3VzZWQgLmNtLW1hdGNoaGlnaGxpZ2h0IHsKCXRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwoJdGV4dC1kZWNvcmF0aW9uLWNvbG9yOiAjMGYwOwoJdGV4dC1kZWNvcmF0aW9uLXN0eWxlOiB3YXZ5Owp9Ci5jbS1zLWxpcXVpYnl0ZSAuY20tdHJhaWxpbmdzcGFjZSB7Cgl0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDsKCXRleHQtZGVjb3JhdGlvbi1jb2xvcjogI2YwMDsKCXRleHQtZGVjb3JhdGlvbi1zdHlsZTogZG90dGVkOwp9Ci5jbS1zLWxpcXVpYnl0ZSAuY20tdGFiIHsKCXRleHQtZGVjb3JhdGlvbjogbGluZS10aHJvdWdoOwoJdGV4dC1kZWNvcmF0aW9uLWNvbG9yOiAjNDA0MDQwOwoJdGV4dC1kZWNvcmF0aW9uLXN0eWxlOiBkb3R0ZWQ7Cn0KLmNtLXMtbGlxdWlieXRlIC5Db2RlTWlycm9yLWd1dHRlcnMgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjMjYyNjI2OyBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjNTA1MDUwOyBwYWRkaW5nLXJpZ2h0OiAwLjhlbTsgfQouY20tcy1saXF1aWJ5dGUgLkNvZGVNaXJyb3ItZ3V0dGVyLWVsdCBkaXYgeyBmb250LXNpemU6IDEuMmVtOyB9Ci5jbS1zLWxpcXVpYnl0ZSAuQ29kZU1pcnJvci1ndXR0ZXJtYXJrZXIgeyAgfQouY20tcy1saXF1aWJ5dGUgLkNvZGVNaXJyb3ItZ3V0dGVybWFya2VyLXN1YnRsZSB7ICB9Ci5jbS1zLWxpcXVpYnl0ZSAuQ29kZU1pcnJvci1saW5lbnVtYmVyIHsgY29sb3I6ICM2MDYwNjA7IHBhZGRpbmctbGVmdDogMDsgfQouY20tcy1saXF1aWJ5dGUgLkNvZGVNaXJyb3ItY3Vyc29yIHsgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjZWVlOyB9CgouY20tcy1saXF1aWJ5dGUgc3Bhbi5jbS1jb21tZW50ICAgICB7IGNvbG9yOiAjMDA4MDAwOyB9Ci5jbS1zLWxpcXVpYnl0ZSBzcGFuLmNtLWRlZiAgICAgICAgIHsgY29sb3I6ICNmZmFmNDA7IGZvbnQtd2VpZ2h0OiBib2xkOyB9Ci5jbS1zLWxpcXVpYnl0ZSBzcGFuLmNtLWtleXdvcmQgICAgIHsgY29sb3I6ICNjMDgwZmY7IGZvbnQtd2VpZ2h0OiBib2xkOyB9Ci5jbS1zLWxpcXVpYnl0ZSBzcGFuLmNtLWJ1aWx0aW4gICAgIHsgY29sb3I6ICNmZmFmNDA7IGZvbnQtd2VpZ2h0OiBib2xkOyB9Ci5jbS1zLWxpcXVpYnl0ZSBzcGFuLmNtLXZhcmlhYmxlICAgIHsgY29sb3I6ICM1OTY3ZmY7IGZvbnQtd2VpZ2h0OiBib2xkOyB9Ci5jbS1zLWxpcXVpYnl0ZSBzcGFuLmNtLXN0cmluZyAgICAgIHsgY29sb3I6ICNmZjgwMDA7IH0KLmNtLXMtbGlxdWlieXRlIHNwYW4uY20tbnVtYmVyICAgICAgeyBjb2xvcjogIzBmMDsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLmNtLXMtbGlxdWlieXRlIHNwYW4uY20tYXRvbSAgICAgICAgeyBjb2xvcjogI2JmMzAzMDsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KCi5jbS1zLWxpcXVpYnl0ZSBzcGFuLmNtLXZhcmlhYmxlLTIgIHsgY29sb3I6ICMwMDdmN2Y7IGZvbnQtd2VpZ2h0OiBib2xkOyB9Ci5jbS1zLWxpcXVpYnl0ZSBzcGFuLmNtLXZhcmlhYmxlLTMgIHsgY29sb3I6ICNjMDgwZmY7IGZvbnQtd2VpZ2h0OiBib2xkOyB9Ci5jbS1zLWxpcXVpYnl0ZSBzcGFuLmNtLXByb3BlcnR5ICAgIHsgY29sb3I6ICM5OTk7IGZvbnQtd2VpZ2h0OiBib2xkOyB9Ci5jbS1zLWxpcXVpYnl0ZSBzcGFuLmNtLW9wZXJhdG9yICAgIHsgY29sb3I6ICNmZmY7IH0KCi5jbS1zLWxpcXVpYnl0ZSBzcGFuLmNtLW1ldGEgICAgICAgIHsgY29sb3I6ICMwZjA7IH0KLmNtLXMtbGlxdWlieXRlIHNwYW4uY20tcXVhbGlmaWVyICAgeyBjb2xvcjogI2ZmZjcwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLmNtLXMtbGlxdWlieXRlIHNwYW4uY20tYnJhY2tldCAgICAgeyBjb2xvcjogI2NjNzsgfQouY20tcy1saXF1aWJ5dGUgc3Bhbi5jbS10YWcgICAgICAgICB7IGNvbG9yOiAjZmYwOyBmb250LXdlaWdodDogYm9sZDsgfQouY20tcy1saXF1aWJ5dGUgc3Bhbi5jbS1hdHRyaWJ1dGUgICB7IGNvbG9yOiAjYzA4MGZmOyBmb250LXdlaWdodDogYm9sZDsgfQouY20tcy1saXF1aWJ5dGUgc3Bhbi5jbS1lcnJvciAgICAgICB7IGNvbG9yOiAjZjAwOyB9CgouY20tcy1saXF1aWJ5dGUgZGl2LkNvZGVNaXJyb3Itc2VsZWN0ZWQgeyBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwgMCwgMCwgMC4yNSk7IH0KCi5jbS1zLWxpcXVpYnl0ZSBzcGFuLmNtLWNvbXBpbGF0aW9uIHsgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjEyKTsgfQoKLmNtLXMtbGlxdWlieXRlIC5Db2RlTWlycm9yLWFjdGl2ZWxpbmUtYmFja2dyb3VuZCB7IGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMjU1LCAwLCAwLjE1KTsgfQoKLyogRGVmYXVsdCBzdHlsZXMgZm9yIGNvbW1vbiBhZGRvbnMgKi8KLmNtLXMtbGlxdWlieXRlIC5Db2RlTWlycm9yIHNwYW4uQ29kZU1pcnJvci1tYXRjaGluZ2JyYWNrZXQgeyBjb2xvcjogIzBmMDsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLmNtLXMtbGlxdWlieXRlIC5Db2RlTWlycm9yIHNwYW4uQ29kZU1pcnJvci1ub25tYXRjaGluZ2JyYWNrZXQgeyBjb2xvcjogI2YwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLkNvZGVNaXJyb3ItbWF0Y2hpbmd0YWcgeyBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDE1MCwgMjU1LCAwLCAuMyk7IH0KLyogU2Nyb2xsYmFycyAqLwovKiBTaW1wbGUgKi8KLmNtLXMtbGlxdWlieXRlIGRpdi5Db2RlTWlycm9yLXNpbXBsZXNjcm9sbC1ob3Jpem9udGFsIGRpdjpob3ZlciwgZGl2LkNvZGVNaXJyb3Itc2ltcGxlc2Nyb2xsLXZlcnRpY2FsIGRpdjpob3ZlciB7CgliYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDgwLCA4MCwgODAsIC43KTsKfQouY20tcy1saXF1aWJ5dGUgZGl2LkNvZGVNaXJyb3Itc2ltcGxlc2Nyb2xsLWhvcml6b250YWwgZGl2LCBkaXYuQ29kZU1pcnJvci1zaW1wbGVzY3JvbGwtdmVydGljYWwgZGl2IHsKCWJhY2tncm91bmQtY29sb3I6IHJnYmEoODAsIDgwLCA4MCwgLjMpOwoJYm9yZGVyOiAxcHggc29saWQgIzQwNDA0MDsKCWJvcmRlci1yYWRpdXM6IDVweDsKfQouY20tcy1saXF1aWJ5dGUgZGl2LkNvZGVNaXJyb3Itc2ltcGxlc2Nyb2xsLXZlcnRpY2FsIGRpdiB7Cglib3JkZXItdG9wOiAxcHggc29saWQgIzQwNDA0MDsKCWJvcmRlci1ib3R0b206IDFweCBzb2xpZCAjNDA0MDQwOwp9Ci5jbS1zLWxpcXVpYnl0ZSBkaXYuQ29kZU1pcnJvci1zaW1wbGVzY3JvbGwtaG9yaXpvbnRhbCBkaXYgewoJYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjNDA0MDQwOwoJYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgIzQwNDA0MDsKfQouY20tcy1saXF1aWJ5dGUgZGl2LkNvZGVNaXJyb3Itc2ltcGxlc2Nyb2xsLXZlcnRpY2FsIHsKCWJhY2tncm91bmQtY29sb3I6ICMyNjI2MjY7Cn0KLmNtLXMtbGlxdWlieXRlIGRpdi5Db2RlTWlycm9yLXNpbXBsZXNjcm9sbC1ob3Jpem9udGFsIHsKCWJhY2tncm91bmQtY29sb3I6ICMyNjI2MjY7Cglib3JkZXItdG9wOiAxcHggc29saWQgIzQwNDA0MDsKfQovKiBPdmVybGF5ICovCi5jbS1zLWxpcXVpYnl0ZSBkaXYuQ29kZU1pcnJvci1vdmVybGF5c2Nyb2xsLWhvcml6b250YWwgZGl2LCBkaXYuQ29kZU1pcnJvci1vdmVybGF5c2Nyb2xsLXZlcnRpY2FsIGRpdiB7CgliYWNrZ3JvdW5kLWNvbG9yOiAjNDA0MDQwOwoJYm9yZGVyLXJhZGl1czogNXB4Owp9Ci5jbS1zLWxpcXVpYnl0ZSBkaXYuQ29kZU1pcnJvci1vdmVybGF5c2Nyb2xsLXZlcnRpY2FsIGRpdiB7Cglib3JkZXI6IDFweCBzb2xpZCAjNDA0MDQwOwp9Ci5jbS1zLWxpcXVpYnl0ZSBkaXYuQ29kZU1pcnJvci1vdmVybGF5c2Nyb2xsLWhvcml6b250YWwgZGl2IHsKCWJvcmRlcjogMXB4IHNvbGlkICM0MDQwNDA7Cn0K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/theme/material.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKCiAgICBOYW1lOiAgICAgICBtYXRlcmlhbAogICAgQXV0aG9yOiAgICAgTWljaGFlbCBLYW1pbnNreSAoaHR0cDovL2dpdGh1Yi5jb20vbWthbWluc2t5MTEpCgogICAgT3JpZ2luYWwgbWF0ZXJpYWwgY29sb3Igc2NoZW1lIGJ5IE1hdHRpYSBBc3RvcmlubyAoaHR0cHM6Ly9naXRodWIuY29tL2VxdWludXNvY2lvL21hdGVyaWFsLXRoZW1lKQoKKi8KCi5jbS1zLW1hdGVyaWFsIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjMjYzMjM4OwogIGNvbG9yOiByZ2JhKDIzMywgMjM3LCAyMzcsIDEpOwp9Ci5jbS1zLW1hdGVyaWFsIC5Db2RlTWlycm9yLWd1dHRlcnMgewogIGJhY2tncm91bmQ6ICMyNjMyMzg7CiAgY29sb3I6IHJnYig4MywxMjcsMTI2KTsKICBib3JkZXI6IG5vbmU7Cn0KLmNtLXMtbWF0ZXJpYWwgLkNvZGVNaXJyb3ItZ3V0dGVybWFya2VyLCAuY20tcy1tYXRlcmlhbCAuQ29kZU1pcnJvci1ndXR0ZXJtYXJrZXItc3VidGxlLCAuY20tcy1tYXRlcmlhbCAuQ29kZU1pcnJvci1saW5lbnVtYmVyIHsgY29sb3I6IHJnYig4MywxMjcsMTI2KTsgfQouY20tcy1tYXRlcmlhbCAuQ29kZU1pcnJvci1jdXJzb3IgeyBib3JkZXItbGVmdDogMXB4IHNvbGlkICNmOGY4ZjA7IH0KLmNtLXMtbWF0ZXJpYWwgZGl2LkNvZGVNaXJyb3Itc2VsZWN0ZWQgeyBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMTUpOyB9Ci5jbS1zLW1hdGVyaWFsLkNvZGVNaXJyb3ItZm9jdXNlZCBkaXYuQ29kZU1pcnJvci1zZWxlY3RlZCB7IGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMCk7IH0KLmNtLXMtbWF0ZXJpYWwgLkNvZGVNaXJyb3ItbGluZTo6c2VsZWN0aW9uLCAuY20tcy1tYXRlcmlhbCAuQ29kZU1pcnJvci1saW5lID4gc3Bhbjo6c2VsZWN0aW9uLCAuY20tcy1tYXRlcmlhbCAuQ29kZU1pcnJvci1saW5lID4gc3BhbiA+IHNwYW46OnNlbGVjdGlvbiB7IGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMCk7IH0KLmNtLXMtbWF0ZXJpYWwgLkNvZGVNaXJyb3ItbGluZTo6LW1vei1zZWxlY3Rpb24sIC5jbS1zLW1hdGVyaWFsIC5Db2RlTWlycm9yLWxpbmUgPiBzcGFuOjotbW96LXNlbGVjdGlvbiwgLmNtLXMtbWF0ZXJpYWwgLkNvZGVNaXJyb3ItbGluZSA+IHNwYW4gPiBzcGFuOjotbW96LXNlbGVjdGlvbiB7IGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMCk7IH0KCi5jbS1zLW1hdGVyaWFsIC5Db2RlTWlycm9yLWFjdGl2ZWxpbmUtYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMCk7IH0KLmNtLXMtbWF0ZXJpYWwgLmNtLWtleXdvcmQgeyBjb2xvcjogcmdiYSgxOTksIDE0NiwgMjM0LCAxKTsgfQouY20tcy1tYXRlcmlhbCAuY20tb3BlcmF0b3IgeyBjb2xvcjogcmdiYSgyMzMsIDIzNywgMjM3LCAxKTsgfQouY20tcy1tYXRlcmlhbCAuY20tdmFyaWFibGUtMiB7IGNvbG9yOiAjODBDQkM0OyB9Ci5jbS1zLW1hdGVyaWFsIC5jbS12YXJpYWJsZS0zIHsgY29sb3I6ICM4MkIxRkY7IH0KLmNtLXMtbWF0ZXJpYWwgLmNtLWJ1aWx0aW4geyBjb2xvcjogI0RFQ0I2QjsgfQouY20tcy1tYXRlcmlhbCAuY20tYXRvbSB7IGNvbG9yOiAjRjc3NjY5OyB9Ci5jbS1zLW1hdGVyaWFsIC5jbS1udW1iZXIgeyBjb2xvcjogI0Y3NzY2OTsgfQouY20tcy1tYXRlcmlhbCAuY20tZGVmIHsgY29sb3I6IHJnYmEoMjMzLCAyMzcsIDIzNywgMSk7IH0KLmNtLXMtbWF0ZXJpYWwgLmNtLXN0cmluZyB7IGNvbG9yOiAjQzNFODhEOyB9Ci5jbS1zLW1hdGVyaWFsIC5jbS1zdHJpbmctMiB7IGNvbG9yOiAjODBDQkM0OyB9Ci5jbS1zLW1hdGVyaWFsIC5jbS1jb21tZW50IHsgY29sb3I6ICM1NDZFN0E7IH0KLmNtLXMtbWF0ZXJpYWwgLmNtLXZhcmlhYmxlIHsgY29sb3I6ICM4MkIxRkY7IH0KLmNtLXMtbWF0ZXJpYWwgLmNtLXRhZyB7IGNvbG9yOiAjODBDQkM0OyB9Ci5jbS1zLW1hdGVyaWFsIC5jbS1tZXRhIHsgY29sb3I6ICM4MENCQzQ7IH0KLmNtLXMtbWF0ZXJpYWwgLmNtLWF0dHJpYnV0ZSB7IGNvbG9yOiAjRkZDQjZCOyB9Ci5jbS1zLW1hdGVyaWFsIC5jbS1wcm9wZXJ0eSB7IGNvbG9yOiAjODBDQkFFOyB9Ci5jbS1zLW1hdGVyaWFsIC5jbS1xdWFsaWZpZXIgeyBjb2xvcjogI0RFQ0I2QjsgfQouY20tcy1tYXRlcmlhbCAuY20tdmFyaWFibGUtMyB7IGNvbG9yOiAjREVDQjZCOyB9Ci5jbS1zLW1hdGVyaWFsIC5jbS10YWcgeyBjb2xvcjogcmdiYSgyNTUsIDgzLCAxMTIsIDEpOyB9Ci5jbS1zLW1hdGVyaWFsIC5jbS1lcnJvciB7CiAgY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMS4wKTsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjRUM1RjY3Owp9Ci5jbS1zLW1hdGVyaWFsIC5Db2RlTWlycm9yLW1hdGNoaW5nYnJhY2tldCB7CiAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgY29sb3I6IHdoaXRlICFpbXBvcnRhbnQ7Cn0K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/theme/mbo.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qICAgQmFzZWQgb24gbWJvbmFjaSdzIEJyYWNrZXRzIG1ibyB0aGVtZSAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgIGh0dHBzOi8vZ2l0aHViLmNvbS9tYm9uYWNpL2dsb2JhbC9ibG9iL21hc3Rlci9NYm8udG1UaGVtZSAgKi8KLyogICBDcmVhdGUgeW91ciBvd246IGh0dHA6Ly90bXRoZW1lLWVkaXRvci5oZXJva3VhcHAuY29tICAgICAgICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLmNtLXMtbWJvLkNvZGVNaXJyb3IgeyBiYWNrZ3JvdW5kOiAjMmMyYzJjOyBjb2xvcjogI2ZmZmZlYzsgfQouY20tcy1tYm8gZGl2LkNvZGVNaXJyb3Itc2VsZWN0ZWQgeyBiYWNrZ3JvdW5kOiAjNzE2QzYyOyB9Ci5jbS1zLW1ibyAuQ29kZU1pcnJvci1saW5lOjpzZWxlY3Rpb24sIC5jbS1zLW1ibyAuQ29kZU1pcnJvci1saW5lID4gc3Bhbjo6c2VsZWN0aW9uLCAuY20tcy1tYm8gLkNvZGVNaXJyb3ItbGluZSA+IHNwYW4gPiBzcGFuOjpzZWxlY3Rpb24geyBiYWNrZ3JvdW5kOiByZ2JhKDExMywgMTA4LCA5OCwgLjk5KTsgfQouY20tcy1tYm8gLkNvZGVNaXJyb3ItbGluZTo6LW1vei1zZWxlY3Rpb24sIC5jbS1zLW1ibyAuQ29kZU1pcnJvci1saW5lID4gc3Bhbjo6LW1vei1zZWxlY3Rpb24sIC5jbS1zLW1ibyAuQ29kZU1pcnJvci1saW5lID4gc3BhbiA+IHNwYW46Oi1tb3otc2VsZWN0aW9uIHsgYmFja2dyb3VuZDogcmdiYSgxMTMsIDEwOCwgOTgsIC45OSk7IH0KLmNtLXMtbWJvIC5Db2RlTWlycm9yLWd1dHRlcnMgeyBiYWNrZ3JvdW5kOiAjNGU0ZTRlOyBib3JkZXItcmlnaHQ6IDBweDsgfQouY20tcy1tYm8gLkNvZGVNaXJyb3ItZ3V0dGVybWFya2VyIHsgY29sb3I6IHdoaXRlOyB9Ci5jbS1zLW1ibyAuQ29kZU1pcnJvci1ndXR0ZXJtYXJrZXItc3VidGxlIHsgY29sb3I6IGdyZXk7IH0KLmNtLXMtbWJvIC5Db2RlTWlycm9yLWxpbmVudW1iZXIgeyBjb2xvcjogI2RhZGFkYTsgfQouY20tcy1tYm8gLkNvZGVNaXJyb3ItY3Vyc29yIHsgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjZmZmZmVjOyB9CgouY20tcy1tYm8gc3Bhbi5jbS1jb21tZW50IHsgY29sb3I6ICM5NTk1OGE7IH0KLmNtLXMtbWJvIHNwYW4uY20tYXRvbSB7IGNvbG9yOiAjMDBhOGM2OyB9Ci5jbS1zLW1ibyBzcGFuLmNtLW51bWJlciB7IGNvbG9yOiAjMDBhOGM2OyB9CgouY20tcy1tYm8gc3Bhbi5jbS1wcm9wZXJ0eSwgLmNtLXMtbWJvIHNwYW4uY20tYXR0cmlidXRlIHsgY29sb3I6ICM5ZGRmZTk7IH0KLmNtLXMtbWJvIHNwYW4uY20ta2V5d29yZCB7IGNvbG9yOiAjZmZiOTI4OyB9Ci5jbS1zLW1ibyBzcGFuLmNtLXN0cmluZyB7IGNvbG9yOiAjZmZjZjZjOyB9Ci5jbS1zLW1ibyBzcGFuLmNtLXN0cmluZy5jbS1wcm9wZXJ0eSB7IGNvbG9yOiAjZmZmZmVjOyB9CgouY20tcy1tYm8gc3Bhbi5jbS12YXJpYWJsZSB7IGNvbG9yOiAjZmZmZmVjOyB9Ci5jbS1zLW1ibyBzcGFuLmNtLXZhcmlhYmxlLTIgeyBjb2xvcjogIzAwYThjNjsgfQouY20tcy1tYm8gc3Bhbi5jbS1kZWYgeyBjb2xvcjogI2ZmZmZlYzsgfQouY20tcy1tYm8gc3Bhbi5jbS1icmFja2V0IHsgY29sb3I6ICNmZmZmZmM7IGZvbnQtd2VpZ2h0OiBib2xkOyB9Ci5jbS1zLW1ibyBzcGFuLmNtLXRhZyB7IGNvbG9yOiAjOWRkZmU5OyB9Ci5jbS1zLW1ibyBzcGFuLmNtLWxpbmsgeyBjb2xvcjogI2Y1NGIwNzsgfQouY20tcy1tYm8gc3Bhbi5jbS1lcnJvciB7IGJvcmRlci1ib3R0b206ICM2MzYzNjM7IGNvbG9yOiAjZmZmZmVjOyB9Ci5jbS1zLW1ibyBzcGFuLmNtLXF1YWxpZmllciB7IGNvbG9yOiAjZmZmZmVjOyB9CgouY20tcy1tYm8gLkNvZGVNaXJyb3ItYWN0aXZlbGluZS1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogIzQ5NGI0MTsgfQouY20tcy1tYm8gLkNvZGVNaXJyb3ItbWF0Y2hpbmdicmFja2V0IHsgY29sb3I6ICNmZmI5MjggIWltcG9ydGFudDsgfQouY20tcy1tYm8gLkNvZGVNaXJyb3ItbWF0Y2hpbmd0YWcgeyBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIC4zNyk7IH0K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/theme/mdn-like.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKICBNRE4tTElLRSBUaGVtZSAtIE1vemlsbGEKICBQb3J0ZWQgdG8gQ29kZU1pcnJvciBieSBQZXRlciBLcm9vbiA8cGxha3Jvb25AZ21haWwuY29tPgogIFJlcG9ydCBidWdzL2lzc3VlcyBoZXJlOiBodHRwczovL2dpdGh1Yi5jb20vY29kZW1pcnJvci9Db2RlTWlycm9yL2lzc3VlcwogIEdpdEh1YjogQHBldGVya3Jvb24KCiAgVGhlIG1kbi1saWtlIHRoZW1lIGlzIGluc3BpcmVkIG9uIHRoZSBkaXNwbGF5ZWQgY29kZSBleGFtcGxlcyBhdDogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL2FuaW1hdGlvbgoKKi8KLmNtLXMtbWRuLWxpa2UuQ29kZU1pcnJvciB7IGNvbG9yOiAjOTk5OyBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmOyB9Ci5jbS1zLW1kbi1saWtlIGRpdi5Db2RlTWlycm9yLXNlbGVjdGVkIHsgYmFja2dyb3VuZDogI2NmYzsgfQouY20tcy1tZG4tbGlrZSAuQ29kZU1pcnJvci1saW5lOjpzZWxlY3Rpb24sIC5jbS1zLW1kbi1saWtlIC5Db2RlTWlycm9yLWxpbmUgPiBzcGFuOjpzZWxlY3Rpb24sIC5jbS1zLW1kbi1saWtlIC5Db2RlTWlycm9yLWxpbmUgPiBzcGFuID4gc3Bhbjo6c2VsZWN0aW9uIHsgYmFja2dyb3VuZDogI2NmYzsgfQouY20tcy1tZG4tbGlrZSAuQ29kZU1pcnJvci1saW5lOjotbW96LXNlbGVjdGlvbiwgLmNtLXMtbWRuLWxpa2UgLkNvZGVNaXJyb3ItbGluZSA+IHNwYW46Oi1tb3otc2VsZWN0aW9uLCAuY20tcy1tZG4tbGlrZSAuQ29kZU1pcnJvci1saW5lID4gc3BhbiA+IHNwYW46Oi1tb3otc2VsZWN0aW9uIHsgYmFja2dyb3VuZDogI2NmYzsgfQoKLmNtLXMtbWRuLWxpa2UgLkNvZGVNaXJyb3ItZ3V0dGVycyB7IGJhY2tncm91bmQ6ICNmOGY4Zjg7IGJvcmRlci1sZWZ0OiA2cHggc29saWQgcmdiYSgwLDgzLDE1OSwwLjY1KTsgY29sb3I6ICMzMzM7IH0KLmNtLXMtbWRuLWxpa2UgLkNvZGVNaXJyb3ItbGluZW51bWJlciB7IGNvbG9yOiAjYWFhOyBwYWRkaW5nLWxlZnQ6IDhweDsgfQouY20tcy1tZG4tbGlrZSAuQ29kZU1pcnJvci1jdXJzb3IgeyBib3JkZXItbGVmdDogMnB4IHNvbGlkICMyMjI7IH0KCi5jbS1zLW1kbi1saWtlIC5jbS1rZXl3b3JkIHsgY29sb3I6ICM2MjYyRkY7IH0KLmNtLXMtbWRuLWxpa2UgLmNtLWF0b20geyBjb2xvcjogI0Y5MDsgfQouY20tcy1tZG4tbGlrZSAuY20tbnVtYmVyIHsgY29sb3I6ICAjY2E3ODQxOyB9Ci5jbS1zLW1kbi1saWtlIC5jbS1kZWYgeyBjb2xvcjogIzhEQTZDRTsgfQouY20tcy1tZG4tbGlrZSBzcGFuLmNtLXZhcmlhYmxlLTIsIC5jbS1zLW1kbi1saWtlIHNwYW4uY20tdGFnIHsgY29sb3I6ICM2OTA7IH0KLmNtLXMtbWRuLWxpa2Ugc3Bhbi5jbS12YXJpYWJsZS0zLCAuY20tcy1tZG4tbGlrZSBzcGFuLmNtLWRlZiB7IGNvbG9yOiAjMDdhOyB9CgouY20tcy1tZG4tbGlrZSAuY20tdmFyaWFibGUgeyBjb2xvcjogIzA3YTsgfQouY20tcy1tZG4tbGlrZSAuY20tcHJvcGVydHkgeyBjb2xvcjogIzkwNTsgfQouY20tcy1tZG4tbGlrZSAuY20tcXVhbGlmaWVyIHsgY29sb3I6ICM2OTA7IH0KCi5jbS1zLW1kbi1saWtlIC5jbS1vcGVyYXRvciB7IGNvbG9yOiAjY2RhODY5OyB9Ci5jbS1zLW1kbi1saWtlIC5jbS1jb21tZW50IHsgY29sb3I6Izc3NzsgZm9udC13ZWlnaHQ6bm9ybWFsOyB9Ci5jbS1zLW1kbi1saWtlIC5jbS1zdHJpbmcgeyBjb2xvcjojMDdhOyBmb250LXN0eWxlOml0YWxpYzsgfQouY20tcy1tZG4tbGlrZSAuY20tc3RyaW5nLTIgeyBjb2xvcjojYmQ2YjE4OyB9IC8qPyovCi5jbS1zLW1kbi1saWtlIC5jbS1tZXRhIHsgY29sb3I6ICMwMDA7IH0gLyo/Ki8KLmNtLXMtbWRuLWxpa2UgLmNtLWJ1aWx0aW4geyBjb2xvcjogIzlCNzUzNjsgfSAvKj8qLwouY20tcy1tZG4tbGlrZSAuY20tdGFnIHsgY29sb3I6ICM5OTc2NDM7IH0KLmNtLXMtbWRuLWxpa2UgLmNtLWF0dHJpYnV0ZSB7IGNvbG9yOiAjZDZiYjZkOyB9IC8qPyovCi5jbS1zLW1kbi1saWtlIC5jbS1oZWFkZXIgeyBjb2xvcjogI0ZGNjQwMDsgfQouY20tcy1tZG4tbGlrZSAuY20taHIgeyBjb2xvcjogI0FFQUVBRTsgfQouY20tcy1tZG4tbGlrZSAuY20tbGluayB7IGNvbG9yOiNhZDkzNjE7IGZvbnQtc3R5bGU6aXRhbGljOyB0ZXh0LWRlY29yYXRpb246bm9uZTsgfQouY20tcy1tZG4tbGlrZSAuY20tZXJyb3IgeyBib3JkZXItYm90dG9tOiAxcHggc29saWQgcmVkOyB9CgpkaXYuY20tcy1tZG4tbGlrZSAuQ29kZU1pcnJvci1hY3RpdmVsaW5lLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiAjZWZlZmZmOyB9CmRpdi5jbS1zLW1kbi1saWtlIHNwYW4uQ29kZU1pcnJvci1tYXRjaGluZ2JyYWNrZXQgeyBvdXRsaW5lOjFweCBzb2xpZCBncmV5OyBjb2xvcjogaW5oZXJpdDsgfQoKLmNtLXMtbWRuLWxpa2UuQ29kZU1pcnJvciB7IGJhY2tncm91bmQtaW1hZ2U6IHVybChkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUZjQUFBQXlDQVlBQUFBcDhVZUZBQUFIdmtsRVFWUjQyczJiNjNiY05neUVRWkNTSENkdDJ2ZC8wdFdGN0krUTZYZ01YaVR0dXZVNVBsNTdaUUtrS0h6RUFPdEY1S2VJSkJHSjh1dkw1OTlGUkZSRVpoRng4RGVYdjh0cm42OFJ1R2FDOFRSZm8zU05wOWRsRERIZWR5THlUVVRlUldTdFhLUFpyanRwWnhhUnc1aFBxb3pSczFOOC9lbnpJaVFSV2NDZ3k0TVVBMGYrWFdsaURoeUw4TGZ5dng3ZWkvQWUzaVFGSHl3N1UvNTlwUVZJTUVFUEV6MEc3WGl3ZFJqelNmQzNVVHR6OXZjaEludHh2cnk1aU1nZkloSm9FZmxPejJDUXIzRjVoL0hmZUZlK0dUZExhS2N1OUw4TFRlUWIvUi83R2dic2ZLZWR5TmRvSHNOMzF1UlBXcmZaNXdzai9OenpSUUh1VG9JZFUzYWh3bnNLUHhYQ2pKSVR1T3NpN1hMYzdTRy92NUdkQUxzN3dmOEpqVEZpQjUrUXZURWZSeUdPZlgzTHJ4OHd4eVFpM3NOcTQ2TzdRYWhRaUNzUkZncWRkakJvdVZFSE9LRGdYQVFIRDlnSkNyNXNNS2tFZGp3c2FyRy93dzNCTUhCVTdPQmpYbnpkeVk3U2ZDeGY1L3o2QVRjY3J3bEt1d0Mvamh6bm5QRjRDZ1Z6aGhWZjR4cDJFaXhjQkFjdE83NWlaOC9mTTl6QXMyT016S2RzbGdYV0o5WEc4UFFvT0FNQTVmR2Nzdk9SZ3YwZG9CWHlIckN3ZkxKQU93bzcxUUxOa2I4bjJQbDZFV2lSN09DaWJ0a1BhejRLYy8wTk5BemUyZ2p1M3pPd2VrQUxEYUNGUEk1dmpQRm1nR1k1QVpxeUdFdkgxeDdRZkliOFl0eE1uQS9iK1FRMGFRREF3YzZKTUZnOENiUVo0cW9ZRUVIYlJ3Tm9qdUszRUh3ZDdWQUxTZ3ErTU5ES3pmVDU4VDhxZHBBRHJnVzBHbWdjQVMxbGh6enRKbWtBemNQTk9RYnNXRUFMQkRTbE1LVUcwRXE0Q0xBUVd2RVZROVdVNTdnWkp3WnRnUE8zcjlvQlRROVdPOFRqcVhJTng4UjBFWXBpWkVVV09GM0Z4a2JKa2dVOUIyZjQxWUJySWo1WmZzUWEwTTVrVGdpQUFxTTNTaFhMZ3U4WE1xY3JRQnZKMENMNXBuVHNmTUIxM29COGF0aHBBcTJYT1FtY0dtb0FDQ0x5ZHg3blRvYTIzQVRhU0lZMmljaGZPZFBUR3hsYXNYTUxhTDBNTFpBT3dBS0lNK3k4Q21pY29iR2RDY2JiSzlEek4reVlHVm9OTkk1aVVLVE15WU9qUHNlNEE4U00xTW1jWGdVMHRvT3ExeU8vdjhGT3hsQVN5YzdUZ2VZYUFNQkpIY1kxQ2NDd0dJL1RLNEFtRGJEeUtZQkJ0RlVrUnd0bzhneWdpUUVhQnlGZ0owMEJIMk04Sld3UVMxbmFmRFhRQ2lkV3lPSThBY2pEQ1NqQ0xrOG5nT2J1QW0zSkFIQWR1YkFtT2FLMDZWOE1ORXNLUEpPaG9iU3Byd1FhNmdEN0RjbFJRZHFjd0w0enhxZ0JyUWNhYlVpQkxjbFJES0FsV3ArZXRQa0JhTk1BMEFLbHJId1RkRUJ5WkFBNEdNK1NObHVTWTZ3QXpjTU5ld3htZ2lnNUtzMG5rclNwQnZTYVFITWRLVEJBbkxvak9kWXlHcFEyNTQ2MDJaSUxQZFREMWhkbGdnZEltNzRqYlRwOHZEd0Y1WllVZUxXR0pwV3NoNlhOeVhnY1l3Vm9KUVRFaGhUWWt4elpqaVU1bnBVMlRhQjk3OVRRZWhsYUFWcTRrYUdwaVB3d3dMa1lVdUJiUXdvY3lRVHYxdEEwKzFVRldvSkYzaXYxb3ErcW9TazhFUWRKbXdIa3ppSUY3b09aazE0RUdpdGliQWRqTFlZSzc4SDV2Wk9odFdwb0kwQVRHSHMwUThPTWI0RXkrMmJVMlVZenRDdEEwd0ZBczdUcGxHTFJWUUNjcWFGZEdTUENlVEkxUU5JQzUyaVdOem9mNlVpYjd4akVwMDdtTk5vVVltVm9zVkl0SHJIelJsTGdCbjlMRnlSSGFRQ3RWVU1idFROaG9YV2lUT085ay9WOEJkQWMxT3EwQXJTUXM2LzVTVTBoY2tOeTlOblhxUVkwUEdZbzVkV0o3bklOYU42bzk1OEZXaW4yN2FCYVdSa2ExcjVteXZMT0FtMGozMGVCSnFDeEhMUmVWY2x4aHhPRU4ySmZEV2p4QnRBQzdNSUgxZlZhR2RvT3A0cUpZRGdLdEtQU0ZOSUQyZ1NuR2xkckNxa0ZaKzVVZVFYUUJJUnJTd29jYmRaWVFULzJMd1JhaEJQQlhvSHJCOG54YUdST1NUNjJES1ViUU9NTXpaSUM5YWJrdUVMZlF6UUFMV1RuRE5BbThLSFdGT0pnSjUrU0hJdlRQY214MXhReVpSaE5MNVFjaTY4OWFYTUVhTi91TklXa0V3REF2RnBPWm1nc0JhYUduYnMxTlBhMUptMzJnQlpBSWgxcEN0RzdUU0g0YUUweTF1Vlk0dXFvRlBpc0dscFAyclNBNXFUZWNXbjVhZ0s2QnpTcGdBeUQrd0ZhcWhuWW9TWjFWd3I4Q21sVFFicmNPM1phWDBOQUV5TWJZYUFseXF1Rm9MS0szU1BieTlDZVZVUFRoclNKbWtDQUUwQ3JLVVFhZGk0RHJkU2xXaG1haDBZTDl6OXZDbEg1OVlHYkh4MUo4VlpUeUFqUWVwSmptWHdBS1REUUkzb21jM3AxVTRnRFVmNlJmY2RZZnJVcDVDbEFpMkozQmE2VU9YR28rSytiUXJqanNzaXRHMlNKenNoYUx3TXRYZ1JhZ1VOcFlZb1ZrTVNCTE0rOUdHaUpaTXZkdUc2RFJaNHFjMDRETVB0UVF4T2pFdEFDbWhPN0sxQWJOYlFERWdnWnlKd3NjRnBBR3dFTmhvQmVVd2gzYldvbGhlOEJUWVZLeFFFV3JTVW4vdWhjTTVLaHZVdS8rZVF1MEx6aGkrVnJLMFByWlpORFFLczljcFlVdUZZZ01WcEQ0L054ZW5KVGlNQ05xZFVFVWYxcVpXanBwTFQ1cVNra1VaYkN3a2JaTVN1Vm51ODBoZlNrelJiUWVxQ1pTQWg2aHVSNFZ0b00yZ0hBbExmNzJzbXVXZ0UrVlY3WHBFMjVBYjJXRkRneWhuU3VLYnM0R3VHekNqUit0SW9VdU1GZzNrZ2NXS0xUd1JxYW5KUTJXMDBoQXNlbmZhQXBSQzQyaGJDdksxU2xFMEh0RTlCR2duZUpPK0VMYW1pdEQxWWpqT1luTllWY3JhR2h0S2tXMEVxVlZlRHg3MzNJMk5INTgxazFOTnhOTEcwaTBJSjgvTmpWYU9aMHRZWjJWdHIwWHY3dFBWM2hrV3A5RUZrZ1MvSjB2b3NuZ1RhU29hRzA2V0hpK3hPYlFrYUFkbGJhblA4QjIrMmwwZjkwTG1VQUFBQUFTVVZPUks1Q1lJST0pOyB9Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/theme/midnight.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogQmFzZWQgb24gdGhlIHRoZW1lIGF0IGh0dHA6Ly9ib25zYWlkZW4uZ2l0aHViLmNvbS9KYXZhU2NyaXB0LUdhcmRlbiAqLwoKLyo8IS0tbWF0Y2gtLT4qLwouY20tcy1taWRuaWdodCBzcGFuLkNvZGVNaXJyb3ItbWF0Y2hoaWdobGlnaHQgeyBiYWNrZ3JvdW5kOiAjNDk0OTQ5OyB9Ci5jbS1zLW1pZG5pZ2h0LkNvZGVNaXJyb3ItZm9jdXNlZCBzcGFuLkNvZGVNaXJyb3ItbWF0Y2hoaWdobGlnaHQgeyBiYWNrZ3JvdW5kOiAjMzE0RDY3ICFpbXBvcnRhbnQ7IH0KCi8qPCEtLWFjdGl2ZWxpbmUtLT4qLwouY20tcy1taWRuaWdodCAuQ29kZU1pcnJvci1hY3RpdmVsaW5lLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiAjMjUzNTQwOyB9CgouY20tcy1taWRuaWdodC5Db2RlTWlycm9yIHsKICAgIGJhY2tncm91bmQ6ICMwRjE5MkE7CiAgICBjb2xvcjogI0QxRURGRjsKfQoKLmNtLXMtbWlkbmlnaHQuQ29kZU1pcnJvciB7IGJvcmRlci10b3A6IDFweCBzb2xpZCBibGFjazsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIGJsYWNrOyB9CgouY20tcy1taWRuaWdodCBkaXYuQ29kZU1pcnJvci1zZWxlY3RlZCB7IGJhY2tncm91bmQ6ICMzMTRENjc7IH0KLmNtLXMtbWlkbmlnaHQgLkNvZGVNaXJyb3ItbGluZTo6c2VsZWN0aW9uLCAuY20tcy1taWRuaWdodCAuQ29kZU1pcnJvci1saW5lID4gc3Bhbjo6c2VsZWN0aW9uLCAuY20tcy1taWRuaWdodCAuQ29kZU1pcnJvci1saW5lID4gc3BhbiA+IHNwYW46OnNlbGVjdGlvbiB7IGJhY2tncm91bmQ6IHJnYmEoNDksIDc3LCAxMDMsIC45OSk7IH0KLmNtLXMtbWlkbmlnaHQgLkNvZGVNaXJyb3ItbGluZTo6LW1vei1zZWxlY3Rpb24sIC5jbS1zLW1pZG5pZ2h0IC5Db2RlTWlycm9yLWxpbmUgPiBzcGFuOjotbW96LXNlbGVjdGlvbiwgLmNtLXMtbWlkbmlnaHQgLkNvZGVNaXJyb3ItbGluZSA+IHNwYW4gPiBzcGFuOjotbW96LXNlbGVjdGlvbiB7IGJhY2tncm91bmQ6IHJnYmEoNDksIDc3LCAxMDMsIC45OSk7IH0KLmNtLXMtbWlkbmlnaHQgLkNvZGVNaXJyb3ItZ3V0dGVycyB7IGJhY2tncm91bmQ6ICMwRjE5MkE7IGJvcmRlci1yaWdodDogMXB4IHNvbGlkOyB9Ci5jbS1zLW1pZG5pZ2h0IC5Db2RlTWlycm9yLWd1dHRlcm1hcmtlciB7IGNvbG9yOiB3aGl0ZTsgfQouY20tcy1taWRuaWdodCAuQ29kZU1pcnJvci1ndXR0ZXJtYXJrZXItc3VidGxlIHsgY29sb3I6ICNkMGQwZDA7IH0KLmNtLXMtbWlkbmlnaHQgLkNvZGVNaXJyb3ItbGluZW51bWJlciB7IGNvbG9yOiAjRDBEMEQwOyB9Ci5jbS1zLW1pZG5pZ2h0IC5Db2RlTWlycm9yLWN1cnNvciB7IGJvcmRlci1sZWZ0OiAxcHggc29saWQgI0Y4RjhGMDsgfQoKLmNtLXMtbWlkbmlnaHQgc3Bhbi5jbS1jb21tZW50IHsgY29sb3I6ICM0MjhCREQ7IH0KLmNtLXMtbWlkbmlnaHQgc3Bhbi5jbS1hdG9tIHsgY29sb3I6ICNBRTgxRkY7IH0KLmNtLXMtbWlkbmlnaHQgc3Bhbi5jbS1udW1iZXIgeyBjb2xvcjogI0QxRURGRjsgfQoKLmNtLXMtbWlkbmlnaHQgc3Bhbi5jbS1wcm9wZXJ0eSwgLmNtLXMtbWlkbmlnaHQgc3Bhbi5jbS1hdHRyaWJ1dGUgeyBjb2xvcjogI0E2RTIyRTsgfQouY20tcy1taWRuaWdodCBzcGFuLmNtLWtleXdvcmQgeyBjb2xvcjogI0U4MzczNzsgfQouY20tcy1taWRuaWdodCBzcGFuLmNtLXN0cmluZyB7IGNvbG9yOiAjMURDMTE2OyB9CgouY20tcy1taWRuaWdodCBzcGFuLmNtLXZhcmlhYmxlIHsgY29sb3I6ICNGRkFBM0U7IH0KLmNtLXMtbWlkbmlnaHQgc3Bhbi5jbS12YXJpYWJsZS0yIHsgY29sb3I6ICNGRkFBM0U7IH0KLmNtLXMtbWlkbmlnaHQgc3Bhbi5jbS1kZWYgeyBjb2xvcjogIzRERDsgfQouY20tcy1taWRuaWdodCBzcGFuLmNtLWJyYWNrZXQgeyBjb2xvcjogI0QxRURGRjsgfQouY20tcy1taWRuaWdodCBzcGFuLmNtLXRhZyB7IGNvbG9yOiAjNDQ5OyB9Ci5jbS1zLW1pZG5pZ2h0IHNwYW4uY20tbGluayB7IGNvbG9yOiAjQUU4MUZGOyB9Ci5jbS1zLW1pZG5pZ2h0IHNwYW4uY20tZXJyb3IgeyBiYWNrZ3JvdW5kOiAjRjkyNjcyOyBjb2xvcjogI0Y4RjhGMDsgfQoKLmNtLXMtbWlkbmlnaHQgLkNvZGVNaXJyb3ItbWF0Y2hpbmdicmFja2V0IHsKICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICBjb2xvcjogd2hpdGUgIWltcG9ydGFudDsKfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/theme/monokai.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogQmFzZWQgb24gU3VibGltZSBUZXh0J3MgTW9ub2thaSB0aGVtZSAqLwoKLmNtLXMtbW9ub2thaS5Db2RlTWlycm9yIHsgYmFja2dyb3VuZDogIzI3MjgyMjsgY29sb3I6ICNmOGY4ZjI7IH0KLmNtLXMtbW9ub2thaSBkaXYuQ29kZU1pcnJvci1zZWxlY3RlZCB7IGJhY2tncm91bmQ6ICM0OTQ4M0U7IH0KLmNtLXMtbW9ub2thaSAuQ29kZU1pcnJvci1saW5lOjpzZWxlY3Rpb24sIC5jbS1zLW1vbm9rYWkgLkNvZGVNaXJyb3ItbGluZSA+IHNwYW46OnNlbGVjdGlvbiwgLmNtLXMtbW9ub2thaSAuQ29kZU1pcnJvci1saW5lID4gc3BhbiA+IHNwYW46OnNlbGVjdGlvbiB7IGJhY2tncm91bmQ6IHJnYmEoNzMsIDcyLCA2MiwgLjk5KTsgfQouY20tcy1tb25va2FpIC5Db2RlTWlycm9yLWxpbmU6Oi1tb3otc2VsZWN0aW9uLCAuY20tcy1tb25va2FpIC5Db2RlTWlycm9yLWxpbmUgPiBzcGFuOjotbW96LXNlbGVjdGlvbiwgLmNtLXMtbW9ub2thaSAuQ29kZU1pcnJvci1saW5lID4gc3BhbiA+IHNwYW46Oi1tb3otc2VsZWN0aW9uIHsgYmFja2dyb3VuZDogcmdiYSg3MywgNzIsIDYyLCAuOTkpOyB9Ci5jbS1zLW1vbm9rYWkgLkNvZGVNaXJyb3ItZ3V0dGVycyB7IGJhY2tncm91bmQ6ICMyNzI4MjI7IGJvcmRlci1yaWdodDogMHB4OyB9Ci5jbS1zLW1vbm9rYWkgLkNvZGVNaXJyb3ItZ3V0dGVybWFya2VyIHsgY29sb3I6IHdoaXRlOyB9Ci5jbS1zLW1vbm9rYWkgLkNvZGVNaXJyb3ItZ3V0dGVybWFya2VyLXN1YnRsZSB7IGNvbG9yOiAjZDBkMGQwOyB9Ci5jbS1zLW1vbm9rYWkgLkNvZGVNaXJyb3ItbGluZW51bWJlciB7IGNvbG9yOiAjZDBkMGQwOyB9Ci5jbS1zLW1vbm9rYWkgLkNvZGVNaXJyb3ItY3Vyc29yIHsgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjZjhmOGYwOyB9CgouY20tcy1tb25va2FpIHNwYW4uY20tY29tbWVudCB7IGNvbG9yOiAjNzU3MTVlOyB9Ci5jbS1zLW1vbm9rYWkgc3Bhbi5jbS1hdG9tIHsgY29sb3I6ICNhZTgxZmY7IH0KLmNtLXMtbW9ub2thaSBzcGFuLmNtLW51bWJlciB7IGNvbG9yOiAjYWU4MWZmOyB9CgouY20tcy1tb25va2FpIHNwYW4uY20tcHJvcGVydHksIC5jbS1zLW1vbm9rYWkgc3Bhbi5jbS1hdHRyaWJ1dGUgeyBjb2xvcjogI2E2ZTIyZTsgfQouY20tcy1tb25va2FpIHNwYW4uY20ta2V5d29yZCB7IGNvbG9yOiAjZjkyNjcyOyB9Ci5jbS1zLW1vbm9rYWkgc3Bhbi5jbS1idWlsdGluIHsgY29sb3I6ICM2NmQ5ZWY7IH0KLmNtLXMtbW9ub2thaSBzcGFuLmNtLXN0cmluZyB7IGNvbG9yOiAjZTZkYjc0OyB9CgouY20tcy1tb25va2FpIHNwYW4uY20tdmFyaWFibGUgeyBjb2xvcjogI2Y4ZjhmMjsgfQouY20tcy1tb25va2FpIHNwYW4uY20tdmFyaWFibGUtMiB7IGNvbG9yOiAjOWVmZmZmOyB9Ci5jbS1zLW1vbm9rYWkgc3Bhbi5jbS12YXJpYWJsZS0zIHsgY29sb3I6ICM2NmQ5ZWY7IH0KLmNtLXMtbW9ub2thaSBzcGFuLmNtLWRlZiB7IGNvbG9yOiAjZmQ5NzFmOyB9Ci5jbS1zLW1vbm9rYWkgc3Bhbi5jbS1icmFja2V0IHsgY29sb3I6ICNmOGY4ZjI7IH0KLmNtLXMtbW9ub2thaSBzcGFuLmNtLXRhZyB7IGNvbG9yOiAjZjkyNjcyOyB9Ci5jbS1zLW1vbm9rYWkgc3Bhbi5jbS1oZWFkZXIgeyBjb2xvcjogI2FlODFmZjsgfQouY20tcy1tb25va2FpIHNwYW4uY20tbGluayB7IGNvbG9yOiAjYWU4MWZmOyB9Ci5jbS1zLW1vbm9rYWkgc3Bhbi5jbS1lcnJvciB7IGJhY2tncm91bmQ6ICNmOTI2NzI7IGNvbG9yOiAjZjhmOGYwOyB9CgouY20tcy1tb25va2FpIC5Db2RlTWlycm9yLWFjdGl2ZWxpbmUtYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6ICMzNzM4MzE7IH0KLmNtLXMtbW9ub2thaSAuQ29kZU1pcnJvci1tYXRjaGluZ2JyYWNrZXQgewogIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogIGNvbG9yOiB3aGl0ZSAhaW1wb3J0YW50Owp9Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/theme/neat.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LmNtLXMtbmVhdCBzcGFuLmNtLWNvbW1lbnQgeyBjb2xvcjogI2E4NjsgfQouY20tcy1uZWF0IHNwYW4uY20ta2V5d29yZCB7IGxpbmUtaGVpZ2h0OiAxZW07IGZvbnQtd2VpZ2h0OiBib2xkOyBjb2xvcjogYmx1ZTsgfQouY20tcy1uZWF0IHNwYW4uY20tc3RyaW5nIHsgY29sb3I6ICNhMjI7IH0KLmNtLXMtbmVhdCBzcGFuLmNtLWJ1aWx0aW4geyBsaW5lLWhlaWdodDogMWVtOyBmb250LXdlaWdodDogYm9sZDsgY29sb3I6ICMwNzc7IH0KLmNtLXMtbmVhdCBzcGFuLmNtLXNwZWNpYWwgeyBsaW5lLWhlaWdodDogMWVtOyBmb250LXdlaWdodDogYm9sZDsgY29sb3I6ICMwYWE7IH0KLmNtLXMtbmVhdCBzcGFuLmNtLXZhcmlhYmxlIHsgY29sb3I6IGJsYWNrOyB9Ci5jbS1zLW5lYXQgc3Bhbi5jbS1udW1iZXIsIC5jbS1zLW5lYXQgc3Bhbi5jbS1hdG9tIHsgY29sb3I6ICMzYTM7IH0KLmNtLXMtbmVhdCBzcGFuLmNtLW1ldGEgeyBjb2xvcjogIzU1NTsgfQouY20tcy1uZWF0IHNwYW4uY20tbGluayB7IGNvbG9yOiAjM2EzOyB9CgouY20tcy1uZWF0IC5Db2RlTWlycm9yLWFjdGl2ZWxpbmUtYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6ICNlOGYyZmY7IH0KLmNtLXMtbmVhdCAuQ29kZU1pcnJvci1tYXRjaGluZ2JyYWNrZXQgeyBvdXRsaW5lOjFweCBzb2xpZCBncmV5OyBjb2xvcjpibGFjayAhaW1wb3J0YW50OyB9Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/theme/neo.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogbmVvIHRoZW1lIGZvciBjb2RlbWlycm9yICovCgovKiBDb2xvciBzY2hlbWUgKi8KCi5jbS1zLW5lby5Db2RlTWlycm9yIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiNmZmZmZmY7CiAgY29sb3I6IzJlMzgzYzsKICBsaW5lLWhlaWdodDoxLjQzNzU7Cn0KLmNtLXMtbmVvIC5jbS1jb21tZW50IHsgY29sb3I6Izc1Nzg3YjsgfQouY20tcy1uZW8gLmNtLWtleXdvcmQsIC5jbS1zLW5lbyAuY20tcHJvcGVydHkgeyBjb2xvcjojMWQ3NWIzOyB9Ci5jbS1zLW5lbyAuY20tYXRvbSwuY20tcy1uZW8gLmNtLW51bWJlciB7IGNvbG9yOiM3NTQzOGE7IH0KLmNtLXMtbmVvIC5jbS1ub2RlLC5jbS1zLW5lbyAuY20tdGFnIHsgY29sb3I6IzljMzMyODsgfQouY20tcy1uZW8gLmNtLXN0cmluZyB7IGNvbG9yOiNiMzVlMTQ7IH0KLmNtLXMtbmVvIC5jbS12YXJpYWJsZSwuY20tcy1uZW8gLmNtLXF1YWxpZmllciB7IGNvbG9yOiMwNDdkNjU7IH0KCgovKiBFZGl0b3Igc3R5bGluZyAqLwoKLmNtLXMtbmVvIHByZSB7CiAgcGFkZGluZzowOwp9CgouY20tcy1uZW8gLkNvZGVNaXJyb3ItZ3V0dGVycyB7CiAgYm9yZGVyOm5vbmU7CiAgYm9yZGVyLXJpZ2h0OjEwcHggc29saWQgdHJhbnNwYXJlbnQ7CiAgYmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDsKfQoKLmNtLXMtbmVvIC5Db2RlTWlycm9yLWxpbmVudW1iZXIgewogIHBhZGRpbmc6MDsKICBjb2xvcjojZTBlMmU1Owp9CgouY20tcy1uZW8gLkNvZGVNaXJyb3ItZ3V0dGVybWFya2VyIHsgY29sb3I6ICMxZDc1YjM7IH0KLmNtLXMtbmVvIC5Db2RlTWlycm9yLWd1dHRlcm1hcmtlci1zdWJ0bGUgeyBjb2xvcjogI2UwZTJlNTsgfQoKLmNtLXMtbmVvIC5Db2RlTWlycm9yLWN1cnNvciB7CiAgd2lkdGg6IGF1dG87CiAgYm9yZGVyOiAwOwogIGJhY2tncm91bmQ6IHJnYmEoMTU1LDE1NywxNjIsMC4zNyk7CiAgei1pbmRleDogMTsKfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/theme/night.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogTG9vc2VseSBiYXNlZCBvbiB0aGUgTWlkbmlnaHQgVGV4dG1hdGUgdGhlbWUgKi8KCi5jbS1zLW5pZ2h0LkNvZGVNaXJyb3IgeyBiYWNrZ3JvdW5kOiAjMGEwMDFmOyBjb2xvcjogI2Y4ZjhmODsgfQouY20tcy1uaWdodCBkaXYuQ29kZU1pcnJvci1zZWxlY3RlZCB7IGJhY2tncm91bmQ6ICM0NDc7IH0KLmNtLXMtbmlnaHQgLkNvZGVNaXJyb3ItbGluZTo6c2VsZWN0aW9uLCAuY20tcy1uaWdodCAuQ29kZU1pcnJvci1saW5lID4gc3Bhbjo6c2VsZWN0aW9uLCAuY20tcy1uaWdodCAuQ29kZU1pcnJvci1saW5lID4gc3BhbiA+IHNwYW46OnNlbGVjdGlvbiB7IGJhY2tncm91bmQ6IHJnYmEoNjgsIDY4LCAxMTksIC45OSk7IH0KLmNtLXMtbmlnaHQgLkNvZGVNaXJyb3ItbGluZTo6LW1vei1zZWxlY3Rpb24sIC5jbS1zLW5pZ2h0IC5Db2RlTWlycm9yLWxpbmUgPiBzcGFuOjotbW96LXNlbGVjdGlvbiwgLmNtLXMtbmlnaHQgLkNvZGVNaXJyb3ItbGluZSA+IHNwYW4gPiBzcGFuOjotbW96LXNlbGVjdGlvbiB7IGJhY2tncm91bmQ6IHJnYmEoNjgsIDY4LCAxMTksIC45OSk7IH0KLmNtLXMtbmlnaHQgLkNvZGVNaXJyb3ItZ3V0dGVycyB7IGJhY2tncm91bmQ6ICMwYTAwMWY7IGJvcmRlci1yaWdodDogMXB4IHNvbGlkICNhYWE7IH0KLmNtLXMtbmlnaHQgLkNvZGVNaXJyb3ItZ3V0dGVybWFya2VyIHsgY29sb3I6IHdoaXRlOyB9Ci5jbS1zLW5pZ2h0IC5Db2RlTWlycm9yLWd1dHRlcm1hcmtlci1zdWJ0bGUgeyBjb2xvcjogI2JiYjsgfQouY20tcy1uaWdodCAuQ29kZU1pcnJvci1saW5lbnVtYmVyIHsgY29sb3I6ICNmOGY4Zjg7IH0KLmNtLXMtbmlnaHQgLkNvZGVNaXJyb3ItY3Vyc29yIHsgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCB3aGl0ZTsgfQoKLmNtLXMtbmlnaHQgc3Bhbi5jbS1jb21tZW50IHsgY29sb3I6ICM4OTAwZDE7IH0KLmNtLXMtbmlnaHQgc3Bhbi5jbS1hdG9tIHsgY29sb3I6ICM4NDVkYzQ7IH0KLmNtLXMtbmlnaHQgc3Bhbi5jbS1udW1iZXIsIC5jbS1zLW5pZ2h0IHNwYW4uY20tYXR0cmlidXRlIHsgY29sb3I6ICNmZmQ1MDA7IH0KLmNtLXMtbmlnaHQgc3Bhbi5jbS1rZXl3b3JkIHsgY29sb3I6ICM1OTllZmY7IH0KLmNtLXMtbmlnaHQgc3Bhbi5jbS1zdHJpbmcgeyBjb2xvcjogIzM3ZjE0YTsgfQouY20tcy1uaWdodCBzcGFuLmNtLW1ldGEgeyBjb2xvcjogIzc2NzhlMjsgfQouY20tcy1uaWdodCBzcGFuLmNtLXZhcmlhYmxlLTIsIC5jbS1zLW5pZ2h0IHNwYW4uY20tdGFnIHsgY29sb3I6ICM5OWIyZmY7IH0KLmNtLXMtbmlnaHQgc3Bhbi5jbS12YXJpYWJsZS0zLCAuY20tcy1uaWdodCBzcGFuLmNtLWRlZiB7IGNvbG9yOiB3aGl0ZTsgfQouY20tcy1uaWdodCBzcGFuLmNtLWJyYWNrZXQgeyBjb2xvcjogIzhkYTZjZTsgfQouY20tcy1uaWdodCBzcGFuLmNtLWJ1aWx0aW4sIC5jbS1zLW5pZ2h0IHNwYW4uY20tc3BlY2lhbCB7IGNvbG9yOiAjZmY5ZTU5OyB9Ci5jbS1zLW5pZ2h0IHNwYW4uY20tbGluayB7IGNvbG9yOiAjODQ1ZGM0OyB9Ci5jbS1zLW5pZ2h0IHNwYW4uY20tZXJyb3IgeyBjb2xvcjogIzlkMWUxNTsgfQoKLmNtLXMtbmlnaHQgLkNvZGVNaXJyb3ItYWN0aXZlbGluZS1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogIzFDMDA1QTsgfQouY20tcy1uaWdodCAuQ29kZU1pcnJvci1tYXRjaGluZ2JyYWNrZXQgeyBvdXRsaW5lOjFweCBzb2xpZCBncmV5OyBjb2xvcjp3aGl0ZSAhaW1wb3J0YW50OyB9Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/theme/panda-syntax.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKCU5hbWU6ICAgICAgIFBhbmRhIFN5bnRheAoJQXV0aG9yOiAgICAgU2lhbWFrIE1va2h0YXJpIChodHRwOi8vZ2l0aHViLmNvbS9zaWFtYWsvKQoJQ29kZU1pcnJvciB0ZW1wbGF0ZSBieSBTaWFtYWsgTW9raHRhcmkgKGh0dHBzOi8vZ2l0aHViLmNvbS9zaWFtYWsvYXRvbS1wYW5kYS1zeW50YXgpCiovCi5jbS1zLXBhbmRhLXN5bnRheCB7CgliYWNrZ3JvdW5kOiAjMjkyQTJCOwoJY29sb3I6ICNFNkU2RTY7CglsaW5lLWhlaWdodDogMS41OwoJZm9udC1mYW1pbHk6ICdPcGVyYXRvciBNb25vJywgJ1NvdXJjZSBTYW5zIFBybycsIE1lbmxvLCBNb25hY28sIENvbnNvbGFzLCBDb3VyaWVyIE5ldywgbW9ub3NwYWNlOwp9Ci5jbS1zLXBhbmRhLXN5bnRheCAuQ29kZU1pcnJvci1jdXJzb3IgeyBib3JkZXItY29sb3I6ICNmZjJjNmQ7IH0KLmNtLXMtcGFuZGEtc3ludGF4IC5Db2RlTWlycm9yLWFjdGl2ZWxpbmUtYmFja2dyb3VuZCB7CgliYWNrZ3JvdW5kOiByZ2JhKDk5LCAxMjMsIDE1NiwgMC4xKTsKfQouY20tcy1wYW5kYS1zeW50YXggLkNvZGVNaXJyb3Itc2VsZWN0ZWQgewoJYmFja2dyb3VuZDogI0ZGRjsKfQouY20tcy1wYW5kYS1zeW50YXggLmNtLWNvbW1lbnQgewoJZm9udC1zdHlsZTogaXRhbGljOwoJY29sb3I6ICM2NzZCNzk7Cn0KLmNtLXMtcGFuZGEtc3ludGF4IC5jbS1vcGVyYXRvciB7Cgljb2xvcjogI2YzZjNmMzsKfQouY20tcy1wYW5kYS1zeW50YXggLmNtLXN0cmluZyB7Cgljb2xvcjogIzE5RjlEODsKfQouY20tcy1wYW5kYS1zeW50YXggLmNtLXN0cmluZy0yIHsKICAgIGNvbG9yOiAjRkZCODZDOwp9CgouY20tcy1wYW5kYS1zeW50YXggLmNtLXRhZyB7Cgljb2xvcjogI2ZmMmM2ZDsKfQouY20tcy1wYW5kYS1zeW50YXggLmNtLW1ldGEgewoJY29sb3I6ICNiMDg0ZWI7Cn0KCi5jbS1zLXBhbmRhLXN5bnRheCAuY20tbnVtYmVyIHsKCWNvbG9yOiAjRkZCODZDOwp9Ci5jbS1zLXBhbmRhLXN5bnRheCAuY20tYXRvbSB7Cgljb2xvcjogI2ZmMmM2ZDsKfQouY20tcy1wYW5kYS1zeW50YXggLmNtLWtleXdvcmQgewoJY29sb3I6ICNGRjc1QjU7Cn0KLmNtLXMtcGFuZGEtc3ludGF4IC5jbS12YXJpYWJsZSB7Cgljb2xvcjogI2ZmYjg2YzsKfQouY20tcy1wYW5kYS1zeW50YXggLmNtLXZhcmlhYmxlLTIgewoJY29sb3I6ICNmZjlhYzE7Cn0KLmNtLXMtcGFuZGEtc3ludGF4IC5jbS12YXJpYWJsZS0zIHsKCWNvbG9yOiAjZmY5YWMxOwp9CgouY20tcy1wYW5kYS1zeW50YXggLmNtLWRlZiB7Cgljb2xvcjogI2U2ZTZlNjsKfQouY20tcy1wYW5kYS1zeW50YXggLmNtLXByb3BlcnR5IHsKCWNvbG9yOiAjZjNmM2YzOwp9Ci5jbS1zLXBhbmRhLXN5bnRheCAuY20tdW5pdCB7CiAgICBjb2xvcjogI2ZmYjg2YzsKfQoKLmNtLXMtcGFuZGEtc3ludGF4IC5jbS1hdHRyaWJ1dGUgewogICAgY29sb3I6ICNmZmI4NmM7Cn0KCi5jbS1zLXBhbmRhLXN5bnRheCAuQ29kZU1pcnJvci1tYXRjaGluZ2JyYWNrZXQgewogICAgYm9yZGVyLWJvdHRvbTogMXB4IGRvdHRlZCAjMTlGOUQ4OwogICAgcGFkZGluZy1ib3R0b206IDJweDsKICAgIGNvbG9yOiAjZTZlNmU2Owp9Ci5jbS1zLXBhbmRhLXN5bnRheCAuQ29kZU1pcnJvci1ndXR0ZXJzIHsKICAgIGJhY2tncm91bmQ6ICMyOTJhMmI7CiAgICBib3JkZXItcmlnaHQtY29sb3I6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xKTsKfQouY20tcy1wYW5kYS1zeW50YXggLkNvZGVNaXJyb3ItbGluZW51bWJlciB7CiAgICBjb2xvcjogI2U2ZTZlNjsKICAgIG9wYWNpdHk6IDAuNjsKfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/theme/paraiso-dark.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKCiAgICBOYW1lOiAgICAgICBQYXJhw61zbyAoRGFyaykKICAgIEF1dGhvcjogICAgIEphbiBULiBTb3R0CgogICAgQ29sb3Igc2NoZW1lIGJ5IEphbiBULiBTb3R0IChodHRwczovL2dpdGh1Yi5jb20vaWRsZWJlcmcvUGFyYWlzby1Db2RlTWlycm9yKQogICAgSW5zcGlyZWQgYnkgdGhlIGFydCBvZiBSdWJlbnMgTFAgKGh0dHA6Ly93d3cucnViZW5zbHAuY29tLmJyKQoKKi8KCi5jbS1zLXBhcmFpc28tZGFyay5Db2RlTWlycm9yIHsgYmFja2dyb3VuZDogIzJmMWUyZTsgY29sb3I6ICNiOWI2YjA7IH0KLmNtLXMtcGFyYWlzby1kYXJrIGRpdi5Db2RlTWlycm9yLXNlbGVjdGVkIHsgYmFja2dyb3VuZDogIzQxMzIzZjsgfQouY20tcy1wYXJhaXNvLWRhcmsgLkNvZGVNaXJyb3ItbGluZTo6c2VsZWN0aW9uLCAuY20tcy1wYXJhaXNvLWRhcmsgLkNvZGVNaXJyb3ItbGluZSA+IHNwYW46OnNlbGVjdGlvbiwgLmNtLXMtcGFyYWlzby1kYXJrIC5Db2RlTWlycm9yLWxpbmUgPiBzcGFuID4gc3Bhbjo6c2VsZWN0aW9uIHsgYmFja2dyb3VuZDogcmdiYSg2NSwgNTAsIDYzLCAuOTkpOyB9Ci5jbS1zLXBhcmFpc28tZGFyayAuQ29kZU1pcnJvci1saW5lOjotbW96LXNlbGVjdGlvbiwgLmNtLXMtcGFyYWlzby1kYXJrIC5Db2RlTWlycm9yLWxpbmUgPiBzcGFuOjotbW96LXNlbGVjdGlvbiwgLmNtLXMtcGFyYWlzby1kYXJrIC5Db2RlTWlycm9yLWxpbmUgPiBzcGFuID4gc3Bhbjo6LW1vei1zZWxlY3Rpb24geyBiYWNrZ3JvdW5kOiByZ2JhKDY1LCA1MCwgNjMsIC45OSk7IH0KLmNtLXMtcGFyYWlzby1kYXJrIC5Db2RlTWlycm9yLWd1dHRlcnMgeyBiYWNrZ3JvdW5kOiAjMmYxZTJlOyBib3JkZXItcmlnaHQ6IDBweDsgfQouY20tcy1wYXJhaXNvLWRhcmsgLkNvZGVNaXJyb3ItZ3V0dGVybWFya2VyIHsgY29sb3I6ICNlZjYxNTU7IH0KLmNtLXMtcGFyYWlzby1kYXJrIC5Db2RlTWlycm9yLWd1dHRlcm1hcmtlci1zdWJ0bGUgeyBjb2xvcjogIzc3NmU3MTsgfQouY20tcy1wYXJhaXNvLWRhcmsgLkNvZGVNaXJyb3ItbGluZW51bWJlciB7IGNvbG9yOiAjNzc2ZTcxOyB9Ci5jbS1zLXBhcmFpc28tZGFyayAuQ29kZU1pcnJvci1jdXJzb3IgeyBib3JkZXItbGVmdDogMXB4IHNvbGlkICM4ZDg2ODc7IH0KCi5jbS1zLXBhcmFpc28tZGFyayBzcGFuLmNtLWNvbW1lbnQgeyBjb2xvcjogI2U5NmJhODsgfQouY20tcy1wYXJhaXNvLWRhcmsgc3Bhbi5jbS1hdG9tIHsgY29sb3I6ICM4MTViYTQ7IH0KLmNtLXMtcGFyYWlzby1kYXJrIHNwYW4uY20tbnVtYmVyIHsgY29sb3I6ICM4MTViYTQ7IH0KCi5jbS1zLXBhcmFpc28tZGFyayBzcGFuLmNtLXByb3BlcnR5LCAuY20tcy1wYXJhaXNvLWRhcmsgc3Bhbi5jbS1hdHRyaWJ1dGUgeyBjb2xvcjogIzQ4YjY4NTsgfQouY20tcy1wYXJhaXNvLWRhcmsgc3Bhbi5jbS1rZXl3b3JkIHsgY29sb3I6ICNlZjYxNTU7IH0KLmNtLXMtcGFyYWlzby1kYXJrIHNwYW4uY20tc3RyaW5nIHsgY29sb3I6ICNmZWM0MTg7IH0KCi5jbS1zLXBhcmFpc28tZGFyayBzcGFuLmNtLXZhcmlhYmxlIHsgY29sb3I6ICM0OGI2ODU7IH0KLmNtLXMtcGFyYWlzby1kYXJrIHNwYW4uY20tdmFyaWFibGUtMiB7IGNvbG9yOiAjMDZiNmVmOyB9Ci5jbS1zLXBhcmFpc28tZGFyayBzcGFuLmNtLWRlZiB7IGNvbG9yOiAjZjk5YjE1OyB9Ci5jbS1zLXBhcmFpc28tZGFyayBzcGFuLmNtLWJyYWNrZXQgeyBjb2xvcjogI2I5YjZiMDsgfQouY20tcy1wYXJhaXNvLWRhcmsgc3Bhbi5jbS10YWcgeyBjb2xvcjogI2VmNjE1NTsgfQouY20tcy1wYXJhaXNvLWRhcmsgc3Bhbi5jbS1saW5rIHsgY29sb3I6ICM4MTViYTQ7IH0KLmNtLXMtcGFyYWlzby1kYXJrIHNwYW4uY20tZXJyb3IgeyBiYWNrZ3JvdW5kOiAjZWY2MTU1OyBjb2xvcjogIzhkODY4NzsgfQoKLmNtLXMtcGFyYWlzby1kYXJrIC5Db2RlTWlycm9yLWFjdGl2ZWxpbmUtYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6ICM0RDM0NEE7IH0KLmNtLXMtcGFyYWlzby1kYXJrIC5Db2RlTWlycm9yLW1hdGNoaW5nYnJhY2tldCB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyBjb2xvcjogd2hpdGUgIWltcG9ydGFudDsgfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/theme/paraiso-light.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKCiAgICBOYW1lOiAgICAgICBQYXJhw61zbyAoTGlnaHQpCiAgICBBdXRob3I6ICAgICBKYW4gVC4gU290dAoKICAgIENvbG9yIHNjaGVtZSBieSBKYW4gVC4gU290dCAoaHR0cHM6Ly9naXRodWIuY29tL2lkbGViZXJnL1BhcmFpc28tQ29kZU1pcnJvcikKICAgIEluc3BpcmVkIGJ5IHRoZSBhcnQgb2YgUnViZW5zIExQIChodHRwOi8vd3d3LnJ1YmVuc2xwLmNvbS5icikKCiovCgouY20tcy1wYXJhaXNvLWxpZ2h0LkNvZGVNaXJyb3IgeyBiYWNrZ3JvdW5kOiAjZTdlOWRiOyBjb2xvcjogIzQxMzIzZjsgfQouY20tcy1wYXJhaXNvLWxpZ2h0IGRpdi5Db2RlTWlycm9yLXNlbGVjdGVkIHsgYmFja2dyb3VuZDogI2I5YjZiMDsgfQouY20tcy1wYXJhaXNvLWxpZ2h0IC5Db2RlTWlycm9yLWxpbmU6OnNlbGVjdGlvbiwgLmNtLXMtcGFyYWlzby1saWdodCAuQ29kZU1pcnJvci1saW5lID4gc3Bhbjo6c2VsZWN0aW9uLCAuY20tcy1wYXJhaXNvLWxpZ2h0IC5Db2RlTWlycm9yLWxpbmUgPiBzcGFuID4gc3Bhbjo6c2VsZWN0aW9uIHsgYmFja2dyb3VuZDogI2I5YjZiMDsgfQouY20tcy1wYXJhaXNvLWxpZ2h0IC5Db2RlTWlycm9yLWxpbmU6Oi1tb3otc2VsZWN0aW9uLCAuY20tcy1wYXJhaXNvLWxpZ2h0IC5Db2RlTWlycm9yLWxpbmUgPiBzcGFuOjotbW96LXNlbGVjdGlvbiwgLmNtLXMtcGFyYWlzby1saWdodCAuQ29kZU1pcnJvci1saW5lID4gc3BhbiA+IHNwYW46Oi1tb3otc2VsZWN0aW9uIHsgYmFja2dyb3VuZDogI2I5YjZiMDsgfQouY20tcy1wYXJhaXNvLWxpZ2h0IC5Db2RlTWlycm9yLWd1dHRlcnMgeyBiYWNrZ3JvdW5kOiAjZTdlOWRiOyBib3JkZXItcmlnaHQ6IDBweDsgfQouY20tcy1wYXJhaXNvLWxpZ2h0IC5Db2RlTWlycm9yLWd1dHRlcm1hcmtlciB7IGNvbG9yOiBibGFjazsgfQouY20tcy1wYXJhaXNvLWxpZ2h0IC5Db2RlTWlycm9yLWd1dHRlcm1hcmtlci1zdWJ0bGUgeyBjb2xvcjogIzhkODY4NzsgfQouY20tcy1wYXJhaXNvLWxpZ2h0IC5Db2RlTWlycm9yLWxpbmVudW1iZXIgeyBjb2xvcjogIzhkODY4NzsgfQouY20tcy1wYXJhaXNvLWxpZ2h0IC5Db2RlTWlycm9yLWN1cnNvciB7IGJvcmRlci1sZWZ0OiAxcHggc29saWQgIzc3NmU3MTsgfQoKLmNtLXMtcGFyYWlzby1saWdodCBzcGFuLmNtLWNvbW1lbnQgeyBjb2xvcjogI2U5NmJhODsgfQouY20tcy1wYXJhaXNvLWxpZ2h0IHNwYW4uY20tYXRvbSB7IGNvbG9yOiAjODE1YmE0OyB9Ci5jbS1zLXBhcmFpc28tbGlnaHQgc3Bhbi5jbS1udW1iZXIgeyBjb2xvcjogIzgxNWJhNDsgfQoKLmNtLXMtcGFyYWlzby1saWdodCBzcGFuLmNtLXByb3BlcnR5LCAuY20tcy1wYXJhaXNvLWxpZ2h0IHNwYW4uY20tYXR0cmlidXRlIHsgY29sb3I6ICM0OGI2ODU7IH0KLmNtLXMtcGFyYWlzby1saWdodCBzcGFuLmNtLWtleXdvcmQgeyBjb2xvcjogI2VmNjE1NTsgfQouY20tcy1wYXJhaXNvLWxpZ2h0IHNwYW4uY20tc3RyaW5nIHsgY29sb3I6ICNmZWM0MTg7IH0KCi5jbS1zLXBhcmFpc28tbGlnaHQgc3Bhbi5jbS12YXJpYWJsZSB7IGNvbG9yOiAjNDhiNjg1OyB9Ci5jbS1zLXBhcmFpc28tbGlnaHQgc3Bhbi5jbS12YXJpYWJsZS0yIHsgY29sb3I6ICMwNmI2ZWY7IH0KLmNtLXMtcGFyYWlzby1saWdodCBzcGFuLmNtLWRlZiB7IGNvbG9yOiAjZjk5YjE1OyB9Ci5jbS1zLXBhcmFpc28tbGlnaHQgc3Bhbi5jbS1icmFja2V0IHsgY29sb3I6ICM0MTMyM2Y7IH0KLmNtLXMtcGFyYWlzby1saWdodCBzcGFuLmNtLXRhZyB7IGNvbG9yOiAjZWY2MTU1OyB9Ci5jbS1zLXBhcmFpc28tbGlnaHQgc3Bhbi5jbS1saW5rIHsgY29sb3I6ICM4MTViYTQ7IH0KLmNtLXMtcGFyYWlzby1saWdodCBzcGFuLmNtLWVycm9yIHsgYmFja2dyb3VuZDogI2VmNjE1NTsgY29sb3I6ICM3NzZlNzE7IH0KCi5jbS1zLXBhcmFpc28tbGlnaHQgLkNvZGVNaXJyb3ItYWN0aXZlbGluZS1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogI0NGRDFDNDsgfQouY20tcy1wYXJhaXNvLWxpZ2h0IC5Db2RlTWlycm9yLW1hdGNoaW5nYnJhY2tldCB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyBjb2xvcjogd2hpdGUgIWltcG9ydGFudDsgfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/theme/pastel-on-dark.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqIFBhc3RlbCBPbiBEYXJrIHRoZW1lIHBvcnRlZCBmcm9tIEFDRSBlZGl0b3IKICogQGxpY2Vuc2UgTUlUCiAqIEBjb3B5cmlnaHQgQXRvbWljUGFnZXMgTExDIDIwMTQKICogQGF1dGhvciBEZW5uaXMgVGhvbXBzb24sIEF0b21pY1BhZ2VzIExMQwogKiBAdmVyc2lvbiAxLjEKICogQHNvdXJjZSBodHRwczovL2dpdGh1Yi5jb20vYXRvbWljcGFnZXMvY29kZW1pcnJvci1wYXN0ZWwtb24tZGFyay10aGVtZQogKi8KCi5jbS1zLXBhc3RlbC1vbi1kYXJrLkNvZGVNaXJyb3IgewoJYmFja2dyb3VuZDogIzJjMjgyNzsKCWNvbG9yOiAjOEY5MzhGOwoJbGluZS1oZWlnaHQ6IDEuNTsKfQouY20tcy1wYXN0ZWwtb24tZGFyayBkaXYuQ29kZU1pcnJvci1zZWxlY3RlZCB7IGJhY2tncm91bmQ6IHJnYmEoMjIxLDI0MCwyNTUsMC4yKTsgfQouY20tcy1wYXN0ZWwtb24tZGFyayAuQ29kZU1pcnJvci1saW5lOjpzZWxlY3Rpb24sIC5jbS1zLXBhc3RlbC1vbi1kYXJrIC5Db2RlTWlycm9yLWxpbmUgPiBzcGFuOjpzZWxlY3Rpb24sIC5jbS1zLXBhc3RlbC1vbi1kYXJrIC5Db2RlTWlycm9yLWxpbmUgPiBzcGFuID4gc3Bhbjo6c2VsZWN0aW9uIHsgYmFja2dyb3VuZDogcmdiYSgyMjEsMjQwLDI1NSwwLjIpOyB9Ci5jbS1zLXBhc3RlbC1vbi1kYXJrIC5Db2RlTWlycm9yLWxpbmU6Oi1tb3otc2VsZWN0aW9uLCAuY20tcy1wYXN0ZWwtb24tZGFyayAuQ29kZU1pcnJvci1saW5lID4gc3Bhbjo6LW1vei1zZWxlY3Rpb24sIC5jbS1zLXBhc3RlbC1vbi1kYXJrIC5Db2RlTWlycm9yLWxpbmUgPiBzcGFuID4gc3Bhbjo6LW1vei1zZWxlY3Rpb24geyBiYWNrZ3JvdW5kOiByZ2JhKDIyMSwyNDAsMjU1LDAuMik7IH0KCi5jbS1zLXBhc3RlbC1vbi1kYXJrIC5Db2RlTWlycm9yLWd1dHRlcnMgewoJYmFja2dyb3VuZDogIzM0MzAyZjsKCWJvcmRlci1yaWdodDogMHB4OwoJcGFkZGluZzogMCAzcHg7Cn0KLmNtLXMtcGFzdGVsLW9uLWRhcmsgLkNvZGVNaXJyb3ItZ3V0dGVybWFya2VyIHsgY29sb3I6IHdoaXRlOyB9Ci5jbS1zLXBhc3RlbC1vbi1kYXJrIC5Db2RlTWlycm9yLWd1dHRlcm1hcmtlci1zdWJ0bGUgeyBjb2xvcjogIzhGOTM4RjsgfQouY20tcy1wYXN0ZWwtb24tZGFyayAuQ29kZU1pcnJvci1saW5lbnVtYmVyIHsgY29sb3I6ICM4RjkzOEY7IH0KLmNtLXMtcGFzdGVsLW9uLWRhcmsgLkNvZGVNaXJyb3ItY3Vyc29yIHsgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjQTdBN0E3OyB9Ci5jbS1zLXBhc3RlbC1vbi1kYXJrIHNwYW4uY20tY29tbWVudCB7IGNvbG9yOiAjQTZDNkZGOyB9Ci5jbS1zLXBhc3RlbC1vbi1kYXJrIHNwYW4uY20tYXRvbSB7IGNvbG9yOiAjREU4RTMwOyB9Ci5jbS1zLXBhc3RlbC1vbi1kYXJrIHNwYW4uY20tbnVtYmVyIHsgY29sb3I6ICNDQ0NDQ0M7IH0KLmNtLXMtcGFzdGVsLW9uLWRhcmsgc3Bhbi5jbS1wcm9wZXJ0eSB7IGNvbG9yOiAjOEY5MzhGOyB9Ci5jbS1zLXBhc3RlbC1vbi1kYXJrIHNwYW4uY20tYXR0cmlidXRlIHsgY29sb3I6ICNhNmUyMmU7IH0KLmNtLXMtcGFzdGVsLW9uLWRhcmsgc3Bhbi5jbS1rZXl3b3JkIHsgY29sb3I6ICNBRUIyRjg7IH0KLmNtLXMtcGFzdGVsLW9uLWRhcmsgc3Bhbi5jbS1zdHJpbmcgeyBjb2xvcjogIzY2QTk2ODsgfQouY20tcy1wYXN0ZWwtb24tZGFyayBzcGFuLmNtLXZhcmlhYmxlIHsgY29sb3I6ICNBRUIyRjg7IH0KLmNtLXMtcGFzdGVsLW9uLWRhcmsgc3Bhbi5jbS12YXJpYWJsZS0yIHsgY29sb3I6ICNCRUJGNTU7IH0KLmNtLXMtcGFzdGVsLW9uLWRhcmsgc3Bhbi5jbS12YXJpYWJsZS0zIHsgY29sb3I6ICNERThFMzA7IH0KLmNtLXMtcGFzdGVsLW9uLWRhcmsgc3Bhbi5jbS1kZWYgeyBjb2xvcjogIzc1N2FEODsgfQouY20tcy1wYXN0ZWwtb24tZGFyayBzcGFuLmNtLWJyYWNrZXQgeyBjb2xvcjogI2Y4ZjhmMjsgfQouY20tcy1wYXN0ZWwtb24tZGFyayBzcGFuLmNtLXRhZyB7IGNvbG9yOiAjQzFDMTQ0OyB9Ci5jbS1zLXBhc3RlbC1vbi1kYXJrIHNwYW4uY20tbGluayB7IGNvbG9yOiAjYWU4MWZmOyB9Ci5jbS1zLXBhc3RlbC1vbi1kYXJrIHNwYW4uY20tcXVhbGlmaWVyLC5jbS1zLXBhc3RlbC1vbi1kYXJrIHNwYW4uY20tYnVpbHRpbiB7IGNvbG9yOiAjQzFDMTQ0OyB9Ci5jbS1zLXBhc3RlbC1vbi1kYXJrIHNwYW4uY20tZXJyb3IgewoJYmFja2dyb3VuZDogIzc1N2FEODsKCWNvbG9yOiAjZjhmOGYwOwp9Ci5jbS1zLXBhc3RlbC1vbi1kYXJrIC5Db2RlTWlycm9yLWFjdGl2ZWxpbmUtYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4wMzEpOyB9Ci5jbS1zLXBhc3RlbC1vbi1kYXJrIC5Db2RlTWlycm9yLW1hdGNoaW5nYnJhY2tldCB7Cglib3JkZXI6IDFweCBzb2xpZCByZ2JhKDI1NSwyNTUsMjU1LDAuMjUpOwoJY29sb3I6ICM4RjkzOEYgIWltcG9ydGFudDsKCW1hcmdpbjogLTFweCAtMXB4IDAgLTFweDsKfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/theme/railscasts.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKCiAgICBOYW1lOiAgICAgICBSYWlsc2Nhc3RzCiAgICBBdXRob3I6ICAgICBSeWFuIEJhdGVzIChodHRwOi8vcmFpbHNjYXN0cy5jb20pCgogICAgQ29kZU1pcnJvciB0ZW1wbGF0ZSBieSBKYW4gVC4gU290dCAoaHR0cHM6Ly9naXRodWIuY29tL2lkbGViZXJnL2Jhc2UxNi1jb2RlbWlycm9yKQogICAgT3JpZ2luYWwgQmFzZTE2IGNvbG9yIHNjaGVtZSBieSBDaHJpcyBLZW1wc29uIChodHRwczovL2dpdGh1Yi5jb20vY2hyaXNrZW1wc29uL2Jhc2UxNikKCiovCgouY20tcy1yYWlsc2Nhc3RzLkNvZGVNaXJyb3Ige2JhY2tncm91bmQ6ICMyYjJiMmI7IGNvbG9yOiAjZjRmMWVkO30KLmNtLXMtcmFpbHNjYXN0cyBkaXYuQ29kZU1pcnJvci1zZWxlY3RlZCB7YmFja2dyb3VuZDogIzI3MjkzNSAhaW1wb3J0YW50O30KLmNtLXMtcmFpbHNjYXN0cyAuQ29kZU1pcnJvci1ndXR0ZXJzIHtiYWNrZ3JvdW5kOiAjMmIyYjJiOyBib3JkZXItcmlnaHQ6IDBweDt9Ci5jbS1zLXJhaWxzY2FzdHMgLkNvZGVNaXJyb3ItbGluZW51bWJlciB7Y29sb3I6ICM1YTY0N2U7fQouY20tcy1yYWlsc2Nhc3RzIC5Db2RlTWlycm9yLWN1cnNvciB7Ym9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjZDRjZmM5ICFpbXBvcnRhbnQ7fQoKLmNtLXMtcmFpbHNjYXN0cyBzcGFuLmNtLWNvbW1lbnQge2NvbG9yOiAjYmM5NDU4O30KLmNtLXMtcmFpbHNjYXN0cyBzcGFuLmNtLWF0b20ge2NvbG9yOiAjYjZiM2ViO30KLmNtLXMtcmFpbHNjYXN0cyBzcGFuLmNtLW51bWJlciB7Y29sb3I6ICNiNmIzZWI7fQoKLmNtLXMtcmFpbHNjYXN0cyBzcGFuLmNtLXByb3BlcnR5LCAuY20tcy1yYWlsc2Nhc3RzIHNwYW4uY20tYXR0cmlidXRlIHtjb2xvcjogI2E1YzI2MTt9Ci5jbS1zLXJhaWxzY2FzdHMgc3Bhbi5jbS1rZXl3b3JkIHtjb2xvcjogI2RhNDkzOTt9Ci5jbS1zLXJhaWxzY2FzdHMgc3Bhbi5jbS1zdHJpbmcge2NvbG9yOiAjZmZjNjZkO30KCi5jbS1zLXJhaWxzY2FzdHMgc3Bhbi5jbS12YXJpYWJsZSB7Y29sb3I6ICNhNWMyNjE7fQouY20tcy1yYWlsc2Nhc3RzIHNwYW4uY20tdmFyaWFibGUtMiB7Y29sb3I6ICM2ZDljYmU7fQouY20tcy1yYWlsc2Nhc3RzIHNwYW4uY20tZGVmIHtjb2xvcjogI2NjNzgzMzt9Ci5jbS1zLXJhaWxzY2FzdHMgc3Bhbi5jbS1lcnJvciB7YmFja2dyb3VuZDogI2RhNDkzOTsgY29sb3I6ICNkNGNmYzk7fQouY20tcy1yYWlsc2Nhc3RzIHNwYW4uY20tYnJhY2tldCB7Y29sb3I6ICNmNGYxZWQ7fQouY20tcy1yYWlsc2Nhc3RzIHNwYW4uY20tdGFnIHtjb2xvcjogI2RhNDkzOTt9Ci5jbS1zLXJhaWxzY2FzdHMgc3Bhbi5jbS1saW5rIHtjb2xvcjogI2I2YjNlYjt9CgouY20tcy1yYWlsc2Nhc3RzIC5Db2RlTWlycm9yLW1hdGNoaW5nYnJhY2tldCB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyBjb2xvcjogd2hpdGUgIWltcG9ydGFudDt9Ci5jbS1zLXJhaWxzY2FzdHMgLkNvZGVNaXJyb3ItYWN0aXZlbGluZS1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogIzMwMzA0MDsgfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/theme/rubyblue.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LmNtLXMtcnVieWJsdWUuQ29kZU1pcnJvciB7IGJhY2tncm91bmQ6ICMxMTI0MzU7IGNvbG9yOiB3aGl0ZTsgfQouY20tcy1ydWJ5Ymx1ZSBkaXYuQ29kZU1pcnJvci1zZWxlY3RlZCB7IGJhY2tncm91bmQ6ICMzODU2NkY7IH0KLmNtLXMtcnVieWJsdWUgLkNvZGVNaXJyb3ItbGluZTo6c2VsZWN0aW9uLCAuY20tcy1ydWJ5Ymx1ZSAuQ29kZU1pcnJvci1saW5lID4gc3Bhbjo6c2VsZWN0aW9uLCAuY20tcy1ydWJ5Ymx1ZSAuQ29kZU1pcnJvci1saW5lID4gc3BhbiA+IHNwYW46OnNlbGVjdGlvbiB7IGJhY2tncm91bmQ6IHJnYmEoNTYsIDg2LCAxMTEsIDAuOTkpOyB9Ci5jbS1zLXJ1YnlibHVlIC5Db2RlTWlycm9yLWxpbmU6Oi1tb3otc2VsZWN0aW9uLCAuY20tcy1ydWJ5Ymx1ZSAuQ29kZU1pcnJvci1saW5lID4gc3Bhbjo6LW1vei1zZWxlY3Rpb24sIC5jbS1zLXJ1YnlibHVlIC5Db2RlTWlycm9yLWxpbmUgPiBzcGFuID4gc3Bhbjo6LW1vei1zZWxlY3Rpb24geyBiYWNrZ3JvdW5kOiByZ2JhKDU2LCA4NiwgMTExLCAwLjk5KTsgfQouY20tcy1ydWJ5Ymx1ZSAuQ29kZU1pcnJvci1ndXR0ZXJzIHsgYmFja2dyb3VuZDogIzFGNDY2MTsgYm9yZGVyLXJpZ2h0OiA3cHggc29saWQgIzNFNzA4NzsgfQouY20tcy1ydWJ5Ymx1ZSAuQ29kZU1pcnJvci1ndXR0ZXJtYXJrZXIgeyBjb2xvcjogd2hpdGU7IH0KLmNtLXMtcnVieWJsdWUgLkNvZGVNaXJyb3ItZ3V0dGVybWFya2VyLXN1YnRsZSB7IGNvbG9yOiAjM0U3MDg3OyB9Ci5jbS1zLXJ1YnlibHVlIC5Db2RlTWlycm9yLWxpbmVudW1iZXIgeyBjb2xvcjogd2hpdGU7IH0KLmNtLXMtcnVieWJsdWUgLkNvZGVNaXJyb3ItY3Vyc29yIHsgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCB3aGl0ZTsgfQoKLmNtLXMtcnVieWJsdWUgc3Bhbi5jbS1jb21tZW50IHsgY29sb3I6ICM5OTk7IGZvbnQtc3R5bGU6aXRhbGljOyBsaW5lLWhlaWdodDogMWVtOyB9Ci5jbS1zLXJ1YnlibHVlIHNwYW4uY20tYXRvbSB7IGNvbG9yOiAjRjRDMjBCOyB9Ci5jbS1zLXJ1YnlibHVlIHNwYW4uY20tbnVtYmVyLCAuY20tcy1ydWJ5Ymx1ZSBzcGFuLmNtLWF0dHJpYnV0ZSB7IGNvbG9yOiAjODJDNkUwOyB9Ci5jbS1zLXJ1YnlibHVlIHNwYW4uY20ta2V5d29yZCB7IGNvbG9yOiAjRjBGOyB9Ci5jbS1zLXJ1YnlibHVlIHNwYW4uY20tc3RyaW5nIHsgY29sb3I6ICNGMDgwNDc7IH0KLmNtLXMtcnVieWJsdWUgc3Bhbi5jbS1tZXRhIHsgY29sb3I6ICNGMEY7IH0KLmNtLXMtcnVieWJsdWUgc3Bhbi5jbS12YXJpYWJsZS0yLCAuY20tcy1ydWJ5Ymx1ZSBzcGFuLmNtLXRhZyB7IGNvbG9yOiAjN0JEODI3OyB9Ci5jbS1zLXJ1YnlibHVlIHNwYW4uY20tdmFyaWFibGUtMywgLmNtLXMtcnVieWJsdWUgc3Bhbi5jbS1kZWYgeyBjb2xvcjogd2hpdGU7IH0KLmNtLXMtcnVieWJsdWUgc3Bhbi5jbS1icmFja2V0IHsgY29sb3I6ICNGMEY7IH0KLmNtLXMtcnVieWJsdWUgc3Bhbi5jbS1saW5rIHsgY29sb3I6ICNGNEMyMEI7IH0KLmNtLXMtcnVieWJsdWUgc3Bhbi5Db2RlTWlycm9yLW1hdGNoaW5nYnJhY2tldCB7IGNvbG9yOiNGMEYgIWltcG9ydGFudDsgfQouY20tcy1ydWJ5Ymx1ZSBzcGFuLmNtLWJ1aWx0aW4sIC5jbS1zLXJ1YnlibHVlIHNwYW4uY20tc3BlY2lhbCB7IGNvbG9yOiAjRkY5RDAwOyB9Ci5jbS1zLXJ1YnlibHVlIHNwYW4uY20tZXJyb3IgeyBjb2xvcjogI0FGMjAxODsgfQoKLmNtLXMtcnVieWJsdWUgLkNvZGVNaXJyb3ItYWN0aXZlbGluZS1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogIzE3MzA0NzsgfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/theme/seti.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKCiAgICBOYW1lOiAgICAgICBzZXRpCiAgICBBdXRob3I6ICAgICBNaWNoYWVsIEthbWluc2t5IChodHRwOi8vZ2l0aHViLmNvbS9ta2FtaW5za3kxMSkKCiAgICBPcmlnaW5hbCBzZXRpIGNvbG9yIHNjaGVtZSBieSBKZXNzZSBXZWVkIChodHRwczovL2dpdGh1Yi5jb20vamVzc2V3ZWVkL3NldGktc3ludGF4KQoKKi8KCgouY20tcy1zZXRpLkNvZGVNaXJyb3IgewogIGJhY2tncm91bmQtY29sb3I6ICMxNTE3MTggIWltcG9ydGFudDsKICBjb2xvcjogI0NGRDJEMSAhaW1wb3J0YW50OwogIGJvcmRlcjogbm9uZTsKfQouY20tcy1zZXRpIC5Db2RlTWlycm9yLWd1dHRlcnMgewogIGNvbG9yOiAjNDA0YjUzOwogIGJhY2tncm91bmQtY29sb3I6ICMwRTExMTI7CiAgYm9yZGVyOiBub25lOwp9Ci5jbS1zLXNldGkgLkNvZGVNaXJyb3ItY3Vyc29yIHsgYm9yZGVyLWxlZnQ6IHNvbGlkIHRoaW4gI2Y4ZjhmMDsgfQouY20tcy1zZXRpIC5Db2RlTWlycm9yLWxpbmVudW1iZXIgeyBjb2xvcjogIzZEOEE4ODsgfQouY20tcy1zZXRpLkNvZGVNaXJyb3ItZm9jdXNlZCBkaXYuQ29kZU1pcnJvci1zZWxlY3RlZCB7IGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMCk7IH0KLmNtLXMtc2V0aSAuQ29kZU1pcnJvci1saW5lOjpzZWxlY3Rpb24sIC5jbS1zLXNldGkgLkNvZGVNaXJyb3ItbGluZSA+IHNwYW46OnNlbGVjdGlvbiwgLmNtLXMtc2V0aSAuQ29kZU1pcnJvci1saW5lID4gc3BhbiA+IHNwYW46OnNlbGVjdGlvbiB7IGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMCk7IH0KLmNtLXMtc2V0aSAuQ29kZU1pcnJvci1saW5lOjotbW96LXNlbGVjdGlvbiwgLmNtLXMtc2V0aSAuQ29kZU1pcnJvci1saW5lID4gc3Bhbjo6LW1vei1zZWxlY3Rpb24sIC5jbS1zLXNldGkgLkNvZGVNaXJyb3ItbGluZSA+IHNwYW4gPiBzcGFuOjotbW96LXNlbGVjdGlvbiB7IGJhY2tncm91bmQ6IHJnYmEoMjU1LCAyNTUsIDI1NSwgMC4xMCk7IH0KLmNtLXMtc2V0aSBzcGFuLmNtLWNvbW1lbnQgeyBjb2xvcjogIzQxNTM1YjsgfQouY20tcy1zZXRpIHNwYW4uY20tc3RyaW5nLCAuY20tcy1zZXRpIHNwYW4uY20tc3RyaW5nLTIgeyBjb2xvcjogIzU1YjVkYjsgfQouY20tcy1zZXRpIHNwYW4uY20tbnVtYmVyIHsgY29sb3I6ICNjZDNmNDU7IH0KLmNtLXMtc2V0aSBzcGFuLmNtLXZhcmlhYmxlIHsgY29sb3I6ICM1NWI1ZGI7IH0KLmNtLXMtc2V0aSBzcGFuLmNtLXZhcmlhYmxlLTIgeyBjb2xvcjogI2EwNzRjNDsgfQouY20tcy1zZXRpIHNwYW4uY20tZGVmIHsgY29sb3I6ICM1NWI1ZGI7IH0KLmNtLXMtc2V0aSBzcGFuLmNtLWtleXdvcmQgeyBjb2xvcjogI2ZmNzljNjsgfQouY20tcy1zZXRpIHNwYW4uY20tb3BlcmF0b3IgeyBjb2xvcjogIzlmY2E1NjsgfQouY20tcy1zZXRpIHNwYW4uY20ta2V5d29yZCB7IGNvbG9yOiAjZTZjZDY5OyB9Ci5jbS1zLXNldGkgc3Bhbi5jbS1hdG9tIHsgY29sb3I6ICNjZDNmNDU7IH0KLmNtLXMtc2V0aSBzcGFuLmNtLW1ldGEgeyBjb2xvcjogIzU1YjVkYjsgfQouY20tcy1zZXRpIHNwYW4uY20tdGFnIHsgY29sb3I6ICM1NWI1ZGI7IH0KLmNtLXMtc2V0aSBzcGFuLmNtLWF0dHJpYnV0ZSB7IGNvbG9yOiAjOWZjYTU2OyB9Ci5jbS1zLXNldGkgc3Bhbi5jbS1xdWFsaWZpZXIgeyBjb2xvcjogIzlmY2E1NjsgfQouY20tcy1zZXRpIHNwYW4uY20tcHJvcGVydHkgeyBjb2xvcjogI2EwNzRjNDsgfQouY20tcy1zZXRpIHNwYW4uY20tdmFyaWFibGUtMyB7IGNvbG9yOiAjOWZjYTU2OyB9Ci5jbS1zLXNldGkgc3Bhbi5jbS1idWlsdGluIHsgY29sb3I6ICM5ZmNhNTY7IH0KLmNtLXMtc2V0aSAuQ29kZU1pcnJvci1hY3RpdmVsaW5lLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiAjMTAxMjEzOyB9Ci5jbS1zLXNldGkgLkNvZGVNaXJyb3ItbWF0Y2hpbmdicmFja2V0IHsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IGNvbG9yOiB3aGl0ZSAhaW1wb3J0YW50OyB9Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/theme/solarized.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKU29sYXJpemVkIHRoZW1lIGZvciBjb2RlLW1pcnJvcgpodHRwOi8vZXRoYW5zY2hvb25vdmVyLmNvbS9zb2xhcml6ZWQKKi8KCi8qClNvbGFyaXplZCBjb2xvciBwYWxldHRlCmh0dHA6Ly9ldGhhbnNjaG9vbm92ZXIuY29tL3NvbGFyaXplZC9pbWcvc29sYXJpemVkLXBhbGV0dGUucG5nCiovCgouc29sYXJpemVkLmJhc2UwMyB7IGNvbG9yOiAjMDAyYjM2OyB9Ci5zb2xhcml6ZWQuYmFzZTAyIHsgY29sb3I6ICMwNzM2NDI7IH0KLnNvbGFyaXplZC5iYXNlMDEgeyBjb2xvcjogIzU4NmU3NTsgfQouc29sYXJpemVkLmJhc2UwMCB7IGNvbG9yOiAjNjU3YjgzOyB9Ci5zb2xhcml6ZWQuYmFzZTAgeyBjb2xvcjogIzgzOTQ5NjsgfQouc29sYXJpemVkLmJhc2UxIHsgY29sb3I6ICM5M2ExYTE7IH0KLnNvbGFyaXplZC5iYXNlMiB7IGNvbG9yOiAjZWVlOGQ1OyB9Ci5zb2xhcml6ZWQuYmFzZTMgIHsgY29sb3I6ICNmZGY2ZTM7IH0KLnNvbGFyaXplZC5zb2xhci15ZWxsb3cgIHsgY29sb3I6ICNiNTg5MDA7IH0KLnNvbGFyaXplZC5zb2xhci1vcmFuZ2UgIHsgY29sb3I6ICNjYjRiMTY7IH0KLnNvbGFyaXplZC5zb2xhci1yZWQgeyBjb2xvcjogI2RjMzIyZjsgfQouc29sYXJpemVkLnNvbGFyLW1hZ2VudGEgeyBjb2xvcjogI2QzMzY4MjsgfQouc29sYXJpemVkLnNvbGFyLXZpb2xldCAgeyBjb2xvcjogIzZjNzFjNDsgfQouc29sYXJpemVkLnNvbGFyLWJsdWUgeyBjb2xvcjogIzI2OGJkMjsgfQouc29sYXJpemVkLnNvbGFyLWN5YW4geyBjb2xvcjogIzJhYTE5ODsgfQouc29sYXJpemVkLnNvbGFyLWdyZWVuIHsgY29sb3I6ICM4NTk5MDA7IH0KCi8qIENvbG9yIHNjaGVtZSBmb3IgY29kZS1taXJyb3IgKi8KCi5jbS1zLXNvbGFyaXplZCB7CiAgbGluZS1oZWlnaHQ6IDEuNDVlbTsKICBjb2xvci1wcm9maWxlOiBzUkdCOwogIHJlbmRlcmluZy1pbnRlbnQ6IGF1dG87Cn0KLmNtLXMtc29sYXJpemVkLmNtLXMtZGFyayB7CiAgY29sb3I6ICM4Mzk0OTY7CiAgYmFja2dyb3VuZC1jb2xvcjogIzAwMmIzNjsKICB0ZXh0LXNoYWRvdzogIzAwMmIzNiAwIDFweDsKfQouY20tcy1zb2xhcml6ZWQuY20tcy1saWdodCB7CiAgYmFja2dyb3VuZC1jb2xvcjogI2ZkZjZlMzsKICBjb2xvcjogIzY1N2I4MzsKICB0ZXh0LXNoYWRvdzogI2VlZThkNSAwIDFweDsKfQoKLmNtLXMtc29sYXJpemVkIC5Db2RlTWlycm9yLXdpZGdldCB7CiAgdGV4dC1zaGFkb3c6IG5vbmU7Cn0KCi5jbS1zLXNvbGFyaXplZCAuY20taGVhZGVyIHsgY29sb3I6ICM1ODZlNzU7IH0KLmNtLXMtc29sYXJpemVkIC5jbS1xdW90ZSB7IGNvbG9yOiAjOTNhMWExOyB9CgouY20tcy1zb2xhcml6ZWQgLmNtLWtleXdvcmQgeyBjb2xvcjogI2NiNGIxNjsgfQouY20tcy1zb2xhcml6ZWQgLmNtLWF0b20geyBjb2xvcjogI2QzMzY4MjsgfQouY20tcy1zb2xhcml6ZWQgLmNtLW51bWJlciB7IGNvbG9yOiAjZDMzNjgyOyB9Ci5jbS1zLXNvbGFyaXplZCAuY20tZGVmIHsgY29sb3I6ICMyYWExOTg7IH0KCi5jbS1zLXNvbGFyaXplZCAuY20tdmFyaWFibGUgeyBjb2xvcjogIzgzOTQ5NjsgfQouY20tcy1zb2xhcml6ZWQgLmNtLXZhcmlhYmxlLTIgeyBjb2xvcjogI2I1ODkwMDsgfQouY20tcy1zb2xhcml6ZWQgLmNtLXZhcmlhYmxlLTMgeyBjb2xvcjogIzZjNzFjNDsgfQoKLmNtLXMtc29sYXJpemVkIC5jbS1wcm9wZXJ0eSB7IGNvbG9yOiAjMmFhMTk4OyB9Ci5jbS1zLXNvbGFyaXplZCAuY20tb3BlcmF0b3IgeyBjb2xvcjogIzZjNzFjNDsgfQoKLmNtLXMtc29sYXJpemVkIC5jbS1jb21tZW50IHsgY29sb3I6ICM1ODZlNzU7IGZvbnQtc3R5bGU6aXRhbGljOyB9CgouY20tcy1zb2xhcml6ZWQgLmNtLXN0cmluZyB7IGNvbG9yOiAjODU5OTAwOyB9Ci5jbS1zLXNvbGFyaXplZCAuY20tc3RyaW5nLTIgeyBjb2xvcjogI2I1ODkwMDsgfQoKLmNtLXMtc29sYXJpemVkIC5jbS1tZXRhIHsgY29sb3I6ICM4NTk5MDA7IH0KLmNtLXMtc29sYXJpemVkIC5jbS1xdWFsaWZpZXIgeyBjb2xvcjogI2I1ODkwMDsgfQouY20tcy1zb2xhcml6ZWQgLmNtLWJ1aWx0aW4geyBjb2xvcjogI2QzMzY4MjsgfQouY20tcy1zb2xhcml6ZWQgLmNtLWJyYWNrZXQgeyBjb2xvcjogI2NiNGIxNjsgfQouY20tcy1zb2xhcml6ZWQgLkNvZGVNaXJyb3ItbWF0Y2hpbmdicmFja2V0IHsgY29sb3I6ICM4NTk5MDA7IH0KLmNtLXMtc29sYXJpemVkIC5Db2RlTWlycm9yLW5vbm1hdGNoaW5nYnJhY2tldCB7IGNvbG9yOiAjZGMzMjJmOyB9Ci5jbS1zLXNvbGFyaXplZCAuY20tdGFnIHsgY29sb3I6ICM5M2ExYTE7IH0KLmNtLXMtc29sYXJpemVkIC5jbS1hdHRyaWJ1dGUgeyBjb2xvcjogIzJhYTE5ODsgfQouY20tcy1zb2xhcml6ZWQgLmNtLWhyIHsKICBjb2xvcjogdHJhbnNwYXJlbnQ7CiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkICM1ODZlNzU7CiAgZGlzcGxheTogYmxvY2s7Cn0KLmNtLXMtc29sYXJpemVkIC5jbS1saW5rIHsgY29sb3I6ICM5M2ExYTE7IGN1cnNvcjogcG9pbnRlcjsgfQouY20tcy1zb2xhcml6ZWQgLmNtLXNwZWNpYWwgeyBjb2xvcjogIzZjNzFjNDsgfQouY20tcy1zb2xhcml6ZWQgLmNtLWVtIHsKICBjb2xvcjogIzk5OTsKICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICB0ZXh0LWRlY29yYXRpb24tc3R5bGU6IGRvdHRlZDsKfQouY20tcy1zb2xhcml6ZWQgLmNtLXN0cm9uZyB7IGNvbG9yOiAjZWVlOyB9Ci5jbS1zLXNvbGFyaXplZCAuY20tZXJyb3IsCi5jbS1zLXNvbGFyaXplZCAuY20taW52YWxpZGNoYXIgewogIGNvbG9yOiAjNTg2ZTc1OwogIGJvcmRlci1ib3R0b206IDFweCBkb3R0ZWQgI2RjMzIyZjsKfQoKLmNtLXMtc29sYXJpemVkLmNtLXMtZGFyayBkaXYuQ29kZU1pcnJvci1zZWxlY3RlZCB7IGJhY2tncm91bmQ6ICMwNzM2NDI7IH0KLmNtLXMtc29sYXJpemVkLmNtLXMtZGFyay5Db2RlTWlycm9yIDo6c2VsZWN0aW9uIHsgYmFja2dyb3VuZDogcmdiYSg3LCA1NCwgNjYsIDAuOTkpOyB9Ci5jbS1zLXNvbGFyaXplZC5jbS1zLWRhcmsgLkNvZGVNaXJyb3ItbGluZTo6LW1vei1zZWxlY3Rpb24sIC5jbS1zLWRhcmsgLkNvZGVNaXJyb3ItbGluZSA+IHNwYW46Oi1tb3otc2VsZWN0aW9uLCAuY20tcy1kYXJrIC5Db2RlTWlycm9yLWxpbmUgPiBzcGFuID4gc3Bhbjo6LW1vei1zZWxlY3Rpb24geyBiYWNrZ3JvdW5kOiByZ2JhKDcsIDU0LCA2NiwgMC45OSk7IH0KCi5jbS1zLXNvbGFyaXplZC5jbS1zLWxpZ2h0IGRpdi5Db2RlTWlycm9yLXNlbGVjdGVkIHsgYmFja2dyb3VuZDogI2VlZThkNTsgfQouY20tcy1zb2xhcml6ZWQuY20tcy1saWdodCAuQ29kZU1pcnJvci1saW5lOjpzZWxlY3Rpb24sIC5jbS1zLWxpZ2h0IC5Db2RlTWlycm9yLWxpbmUgPiBzcGFuOjpzZWxlY3Rpb24sIC5jbS1zLWxpZ2h0IC5Db2RlTWlycm9yLWxpbmUgPiBzcGFuID4gc3Bhbjo6c2VsZWN0aW9uIHsgYmFja2dyb3VuZDogI2VlZThkNTsgfQouY20tcy1zb2xhcml6ZWQuY20tcy1saWdodCAuQ29kZU1pcnJvci1saW5lOjotbW96LXNlbGVjdGlvbiwgLmNtLXMtbGlnaCAuQ29kZU1pcnJvci1saW5lID4gc3Bhbjo6LW1vei1zZWxlY3Rpb24sIC5jbS1zLWxpZ2ggLkNvZGVNaXJyb3ItbGluZSA+IHNwYW4gPiBzcGFuOjotbW96LXNlbGVjdGlvbiB7IGJhY2tncm91bmQ6ICNlZWU4ZDU7IH0KCi8qIEVkaXRvciBzdHlsaW5nICovCgoKCi8qIExpdHRsZSBzaGFkb3cgb24gdGhlIHZpZXctcG9ydCBvZiB0aGUgYnVmZmVyIHZpZXcgKi8KLmNtLXMtc29sYXJpemVkLkNvZGVNaXJyb3IgewogIC1tb3otYm94LXNoYWRvdzogaW5zZXQgN3B4IDAgMTJweCAtNnB4ICMwMDA7CiAgLXdlYmtpdC1ib3gtc2hhZG93OiBpbnNldCA3cHggMCAxMnB4IC02cHggIzAwMDsKICBib3gtc2hhZG93OiBpbnNldCA3cHggMCAxMnB4IC02cHggIzAwMDsKfQoKLyogUmVtb3ZlIGd1dHRlciBib3JkZXIgKi8KLmNtLXMtc29sYXJpemVkIC5Db2RlTWlycm9yLWd1dHRlcnMgewogIGJvcmRlci1yaWdodDogMDsKfQoKLyogR3V0dGVyIGNvbG9ycyBhbmQgbGluZSBudW1iZXIgc3R5bGluZyBiYXNlZCBvZiBjb2xvciBzY2hlbWUgKGRhcmsgLyBsaWdodCkgKi8KCi8qIERhcmsgKi8KLmNtLXMtc29sYXJpemVkLmNtLXMtZGFyayAuQ29kZU1pcnJvci1ndXR0ZXJzIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDczNjQyOwp9CgouY20tcy1zb2xhcml6ZWQuY20tcy1kYXJrIC5Db2RlTWlycm9yLWxpbmVudW1iZXIgewogIGNvbG9yOiAjNTg2ZTc1OwogIHRleHQtc2hhZG93OiAjMDIxMDE0IDAgLTFweDsKfQoKLyogTGlnaHQgKi8KLmNtLXMtc29sYXJpemVkLmNtLXMtbGlnaHQgLkNvZGVNaXJyb3ItZ3V0dGVycyB7CiAgYmFja2dyb3VuZC1jb2xvcjogI2VlZThkNTsKfQoKLmNtLXMtc29sYXJpemVkLmNtLXMtbGlnaHQgLkNvZGVNaXJyb3ItbGluZW51bWJlciB7CiAgY29sb3I6ICM4Mzk0OTY7Cn0KCi8qIENvbW1vbiAqLwouY20tcy1zb2xhcml6ZWQgLkNvZGVNaXJyb3ItbGluZW51bWJlciB7CiAgcGFkZGluZzogMCA1cHg7Cn0KLmNtLXMtc29sYXJpemVkIC5Db2RlTWlycm9yLWd1dHRlcm1hcmtlci1zdWJ0bGUgeyBjb2xvcjogIzU4NmU3NTsgfQouY20tcy1zb2xhcml6ZWQuY20tcy1kYXJrIC5Db2RlTWlycm9yLWd1dHRlcm1hcmtlciB7IGNvbG9yOiAjZGRkOyB9Ci5jbS1zLXNvbGFyaXplZC5jbS1zLWxpZ2h0IC5Db2RlTWlycm9yLWd1dHRlcm1hcmtlciB7IGNvbG9yOiAjY2I0YjE2OyB9CgouY20tcy1zb2xhcml6ZWQgLkNvZGVNaXJyb3ItZ3V0dGVyIC5Db2RlTWlycm9yLWd1dHRlci10ZXh0IHsKICBjb2xvcjogIzU4NmU3NTsKfQoKLyogQ3Vyc29yICovCi5jbS1zLXNvbGFyaXplZCAuQ29kZU1pcnJvci1jdXJzb3IgeyBib3JkZXItbGVmdDogMXB4IHNvbGlkICM4MTkwOTA7IH0KCi8qIEZhdCBjdXJzb3IgKi8KLmNtLXMtc29sYXJpemVkLmNtLXMtbGlnaHQuY20tZmF0LWN1cnNvciAuQ29kZU1pcnJvci1jdXJzb3IgeyBiYWNrZ3JvdW5kOiAjNzdlZTc3OyB9Ci5jbS1zLXNvbGFyaXplZC5jbS1zLWxpZ2h0IC5jbS1hbmltYXRlLWZhdC1jdXJzb3IgeyBiYWNrZ3JvdW5kLWNvbG9yOiAjNzdlZTc3OyB9Ci5jbS1zLXNvbGFyaXplZC5jbS1zLWRhcmsuY20tZmF0LWN1cnNvciAuQ29kZU1pcnJvci1jdXJzb3IgeyBiYWNrZ3JvdW5kOiAjNTg2ZTc1OyB9Ci5jbS1zLXNvbGFyaXplZC5jbS1zLWRhcmsgLmNtLWFuaW1hdGUtZmF0LWN1cnNvciB7IGJhY2tncm91bmQtY29sb3I6ICM1ODZlNzU7IH0KCi8qIEFjdGl2ZSBsaW5lICovCi5jbS1zLXNvbGFyaXplZC5jbS1zLWRhcmsgLkNvZGVNaXJyb3ItYWN0aXZlbGluZS1iYWNrZ3JvdW5kIHsKICBiYWNrZ3JvdW5kOiByZ2JhKDI1NSwgMjU1LCAyNTUsIDAuMDYpOwp9Ci5jbS1zLXNvbGFyaXplZC5jbS1zLWxpZ2h0IC5Db2RlTWlycm9yLWFjdGl2ZWxpbmUtYmFja2dyb3VuZCB7CiAgYmFja2dyb3VuZDogcmdiYSgwLCAwLCAwLCAwLjA2KTsKfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/theme/the-matrix.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LmNtLXMtdGhlLW1hdHJpeC5Db2RlTWlycm9yIHsgYmFja2dyb3VuZDogIzAwMDAwMDsgY29sb3I6ICMwMEZGMDA7IH0KLmNtLXMtdGhlLW1hdHJpeCBkaXYuQ29kZU1pcnJvci1zZWxlY3RlZCB7IGJhY2tncm91bmQ6ICMyRDJEMkQ7IH0KLmNtLXMtdGhlLW1hdHJpeCAuQ29kZU1pcnJvci1saW5lOjpzZWxlY3Rpb24sIC5jbS1zLXRoZS1tYXRyaXggLkNvZGVNaXJyb3ItbGluZSA+IHNwYW46OnNlbGVjdGlvbiwgLmNtLXMtdGhlLW1hdHJpeCAuQ29kZU1pcnJvci1saW5lID4gc3BhbiA+IHNwYW46OnNlbGVjdGlvbiB7IGJhY2tncm91bmQ6IHJnYmEoNDUsIDQ1LCA0NSwgMC45OSk7IH0KLmNtLXMtdGhlLW1hdHJpeCAuQ29kZU1pcnJvci1saW5lOjotbW96LXNlbGVjdGlvbiwgLmNtLXMtdGhlLW1hdHJpeCAuQ29kZU1pcnJvci1saW5lID4gc3Bhbjo6LW1vei1zZWxlY3Rpb24sIC5jbS1zLXRoZS1tYXRyaXggLkNvZGVNaXJyb3ItbGluZSA+IHNwYW4gPiBzcGFuOjotbW96LXNlbGVjdGlvbiB7IGJhY2tncm91bmQ6IHJnYmEoNDUsIDQ1LCA0NSwgMC45OSk7IH0KLmNtLXMtdGhlLW1hdHJpeCAuQ29kZU1pcnJvci1ndXR0ZXJzIHsgYmFja2dyb3VuZDogIzA2MDsgYm9yZGVyLXJpZ2h0OiAycHggc29saWQgIzAwRkYwMDsgfQouY20tcy10aGUtbWF0cml4IC5Db2RlTWlycm9yLWd1dHRlcm1hcmtlciB7IGNvbG9yOiAjMGYwOyB9Ci5jbS1zLXRoZS1tYXRyaXggLkNvZGVNaXJyb3ItZ3V0dGVybWFya2VyLXN1YnRsZSB7IGNvbG9yOiB3aGl0ZTsgfQouY20tcy10aGUtbWF0cml4IC5Db2RlTWlycm9yLWxpbmVudW1iZXIgeyBjb2xvcjogI0ZGRkZGRjsgfQouY20tcy10aGUtbWF0cml4IC5Db2RlTWlycm9yLWN1cnNvciB7IGJvcmRlci1sZWZ0OiAxcHggc29saWQgIzAwRkYwMDsgfQoKLmNtLXMtdGhlLW1hdHJpeCBzcGFuLmNtLWtleXdvcmQgeyBjb2xvcjogIzAwODgwMzsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLmNtLXMtdGhlLW1hdHJpeCBzcGFuLmNtLWF0b20geyBjb2xvcjogIzNGRjsgfQouY20tcy10aGUtbWF0cml4IHNwYW4uY20tbnVtYmVyIHsgY29sb3I6ICNGRkI5NEY7IH0KLmNtLXMtdGhlLW1hdHJpeCBzcGFuLmNtLWRlZiB7IGNvbG9yOiAjOTlDOyB9Ci5jbS1zLXRoZS1tYXRyaXggc3Bhbi5jbS12YXJpYWJsZSB7IGNvbG9yOiAjRjZDOyB9Ci5jbS1zLXRoZS1tYXRyaXggc3Bhbi5jbS12YXJpYWJsZS0yIHsgY29sb3I6ICNDNkY7IH0KLmNtLXMtdGhlLW1hdHJpeCBzcGFuLmNtLXZhcmlhYmxlLTMgeyBjb2xvcjogIzk2RjsgfQouY20tcy10aGUtbWF0cml4IHNwYW4uY20tcHJvcGVydHkgeyBjb2xvcjogIzYyRkZBMDsgfQouY20tcy10aGUtbWF0cml4IHNwYW4uY20tb3BlcmF0b3IgeyBjb2xvcjogIzk5OTsgfQouY20tcy10aGUtbWF0cml4IHNwYW4uY20tY29tbWVudCB7IGNvbG9yOiAjQ0NDQ0NDOyB9Ci5jbS1zLXRoZS1tYXRyaXggc3Bhbi5jbS1zdHJpbmcgeyBjb2xvcjogIzM5QzsgfQouY20tcy10aGUtbWF0cml4IHNwYW4uY20tbWV0YSB7IGNvbG9yOiAjQzlGOyB9Ci5jbS1zLXRoZS1tYXRyaXggc3Bhbi5jbS1xdWFsaWZpZXIgeyBjb2xvcjogI0ZGRjcwMDsgfQouY20tcy10aGUtbWF0cml4IHNwYW4uY20tYnVpbHRpbiB7IGNvbG9yOiAjMzBhOyB9Ci5jbS1zLXRoZS1tYXRyaXggc3Bhbi5jbS1icmFja2V0IHsgY29sb3I6ICNjYzc7IH0KLmNtLXMtdGhlLW1hdHJpeCBzcGFuLmNtLXRhZyB7IGNvbG9yOiAjRkZCRDQwOyB9Ci5jbS1zLXRoZS1tYXRyaXggc3Bhbi5jbS1hdHRyaWJ1dGUgeyBjb2xvcjogI0ZGRjcwMDsgfQouY20tcy10aGUtbWF0cml4IHNwYW4uY20tZXJyb3IgeyBjb2xvcjogI0ZGMDAwMDsgfQoKLmNtLXMtdGhlLW1hdHJpeCAuQ29kZU1pcnJvci1hY3RpdmVsaW5lLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiAjMDQwOyB9Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/theme/tomorrow-night-bright.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKCiAgICBOYW1lOiAgICAgICBUb21vcnJvdyBOaWdodCAtIEJyaWdodAogICAgQXV0aG9yOiAgICAgQ2hyaXMgS2VtcHNvbgoKICAgIFBvcnQgZG9uZSBieSBHZXJhcmQgQnJhYWQgPG1lQGdicmFhZC5ubD4KCiovCgouY20tcy10b21vcnJvdy1uaWdodC1icmlnaHQuQ29kZU1pcnJvciB7IGJhY2tncm91bmQ6ICMwMDAwMDA7IGNvbG9yOiAjZWFlYWVhOyB9Ci5jbS1zLXRvbW9ycm93LW5pZ2h0LWJyaWdodCBkaXYuQ29kZU1pcnJvci1zZWxlY3RlZCB7IGJhY2tncm91bmQ6ICM0MjQyNDI7IH0KLmNtLXMtdG9tb3Jyb3ctbmlnaHQtYnJpZ2h0IC5Db2RlTWlycm9yLWd1dHRlcnMgeyBiYWNrZ3JvdW5kOiAjMDAwMDAwOyBib3JkZXItcmlnaHQ6IDBweDsgfQouY20tcy10b21vcnJvdy1uaWdodC1icmlnaHQgLkNvZGVNaXJyb3ItZ3V0dGVybWFya2VyIHsgY29sb3I6ICNlNzhjNDU7IH0KLmNtLXMtdG9tb3Jyb3ctbmlnaHQtYnJpZ2h0IC5Db2RlTWlycm9yLWd1dHRlcm1hcmtlci1zdWJ0bGUgeyBjb2xvcjogIzc3NzsgfQouY20tcy10b21vcnJvdy1uaWdodC1icmlnaHQgLkNvZGVNaXJyb3ItbGluZW51bWJlciB7IGNvbG9yOiAjNDI0MjQyOyB9Ci5jbS1zLXRvbW9ycm93LW5pZ2h0LWJyaWdodCAuQ29kZU1pcnJvci1jdXJzb3IgeyBib3JkZXItbGVmdDogMXB4IHNvbGlkICM2QTZBNkE7IH0KCi5jbS1zLXRvbW9ycm93LW5pZ2h0LWJyaWdodCBzcGFuLmNtLWNvbW1lbnQgeyBjb2xvcjogI2QyN2I1MzsgfQouY20tcy10b21vcnJvdy1uaWdodC1icmlnaHQgc3Bhbi5jbS1hdG9tIHsgY29sb3I6ICNhMTZhOTQ7IH0KLmNtLXMtdG9tb3Jyb3ctbmlnaHQtYnJpZ2h0IHNwYW4uY20tbnVtYmVyIHsgY29sb3I6ICNhMTZhOTQ7IH0KCi5jbS1zLXRvbW9ycm93LW5pZ2h0LWJyaWdodCBzcGFuLmNtLXByb3BlcnR5LCAuY20tcy10b21vcnJvdy1uaWdodC1icmlnaHQgc3Bhbi5jbS1hdHRyaWJ1dGUgeyBjb2xvcjogIzk5Y2M5OTsgfQouY20tcy10b21vcnJvdy1uaWdodC1icmlnaHQgc3Bhbi5jbS1rZXl3b3JkIHsgY29sb3I6ICNkNTRlNTM7IH0KLmNtLXMtdG9tb3Jyb3ctbmlnaHQtYnJpZ2h0IHNwYW4uY20tc3RyaW5nIHsgY29sb3I6ICNlN2M1NDc7IH0KCi5jbS1zLXRvbW9ycm93LW5pZ2h0LWJyaWdodCBzcGFuLmNtLXZhcmlhYmxlIHsgY29sb3I6ICNiOWNhNGE7IH0KLmNtLXMtdG9tb3Jyb3ctbmlnaHQtYnJpZ2h0IHNwYW4uY20tdmFyaWFibGUtMiB7IGNvbG9yOiAjN2FhNmRhOyB9Ci5jbS1zLXRvbW9ycm93LW5pZ2h0LWJyaWdodCBzcGFuLmNtLWRlZiB7IGNvbG9yOiAjZTc4YzQ1OyB9Ci5jbS1zLXRvbW9ycm93LW5pZ2h0LWJyaWdodCBzcGFuLmNtLWJyYWNrZXQgeyBjb2xvcjogI2VhZWFlYTsgfQouY20tcy10b21vcnJvdy1uaWdodC1icmlnaHQgc3Bhbi5jbS10YWcgeyBjb2xvcjogI2Q1NGU1MzsgfQouY20tcy10b21vcnJvdy1uaWdodC1icmlnaHQgc3Bhbi5jbS1saW5rIHsgY29sb3I6ICNhMTZhOTQ7IH0KLmNtLXMtdG9tb3Jyb3ctbmlnaHQtYnJpZ2h0IHNwYW4uY20tZXJyb3IgeyBiYWNrZ3JvdW5kOiAjZDU0ZTUzOyBjb2xvcjogIzZBNkE2QTsgfQoKLmNtLXMtdG9tb3Jyb3ctbmlnaHQtYnJpZ2h0IC5Db2RlTWlycm9yLWFjdGl2ZWxpbmUtYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6ICMyYTJhMmE7IH0KLmNtLXMtdG9tb3Jyb3ctbmlnaHQtYnJpZ2h0IC5Db2RlTWlycm9yLW1hdGNoaW5nYnJhY2tldCB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyBjb2xvcjogd2hpdGUgIWltcG9ydGFudDsgfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/theme/tomorrow-night-eighties.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKCiAgICBOYW1lOiAgICAgICBUb21vcnJvdyBOaWdodCAtIEVpZ2h0aWVzCiAgICBBdXRob3I6ICAgICBDaHJpcyBLZW1wc29uCgogICAgQ29kZU1pcnJvciB0ZW1wbGF0ZSBieSBKYW4gVC4gU290dCAoaHR0cHM6Ly9naXRodWIuY29tL2lkbGViZXJnL2Jhc2UxNi1jb2RlbWlycm9yKQogICAgT3JpZ2luYWwgQmFzZTE2IGNvbG9yIHNjaGVtZSBieSBDaHJpcyBLZW1wc29uIChodHRwczovL2dpdGh1Yi5jb20vY2hyaXNrZW1wc29uL2Jhc2UxNikKCiovCgouY20tcy10b21vcnJvdy1uaWdodC1laWdodGllcy5Db2RlTWlycm9yIHsgYmFja2dyb3VuZDogIzAwMDAwMDsgY29sb3I6ICNDQ0NDQ0M7IH0KLmNtLXMtdG9tb3Jyb3ctbmlnaHQtZWlnaHRpZXMgZGl2LkNvZGVNaXJyb3Itc2VsZWN0ZWQgeyBiYWNrZ3JvdW5kOiAjMkQyRDJEOyB9Ci5jbS1zLXRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzIC5Db2RlTWlycm9yLWxpbmU6OnNlbGVjdGlvbiwgLmNtLXMtdG9tb3Jyb3ctbmlnaHQtZWlnaHRpZXMgLkNvZGVNaXJyb3ItbGluZSA+IHNwYW46OnNlbGVjdGlvbiwgLmNtLXMtdG9tb3Jyb3ctbmlnaHQtZWlnaHRpZXMgLkNvZGVNaXJyb3ItbGluZSA+IHNwYW4gPiBzcGFuOjpzZWxlY3Rpb24geyBiYWNrZ3JvdW5kOiByZ2JhKDQ1LCA0NSwgNDUsIDAuOTkpOyB9Ci5jbS1zLXRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzIC5Db2RlTWlycm9yLWxpbmU6Oi1tb3otc2VsZWN0aW9uLCAuY20tcy10b21vcnJvdy1uaWdodC1laWdodGllcyAuQ29kZU1pcnJvci1saW5lID4gc3Bhbjo6LW1vei1zZWxlY3Rpb24sIC5jbS1zLXRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzIC5Db2RlTWlycm9yLWxpbmUgPiBzcGFuID4gc3Bhbjo6LW1vei1zZWxlY3Rpb24geyBiYWNrZ3JvdW5kOiByZ2JhKDQ1LCA0NSwgNDUsIDAuOTkpOyB9Ci5jbS1zLXRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzIC5Db2RlTWlycm9yLWd1dHRlcnMgeyBiYWNrZ3JvdW5kOiAjMDAwMDAwOyBib3JkZXItcmlnaHQ6IDBweDsgfQouY20tcy10b21vcnJvdy1uaWdodC1laWdodGllcyAuQ29kZU1pcnJvci1ndXR0ZXJtYXJrZXIgeyBjb2xvcjogI2YyNzc3YTsgfQouY20tcy10b21vcnJvdy1uaWdodC1laWdodGllcyAuQ29kZU1pcnJvci1ndXR0ZXJtYXJrZXItc3VidGxlIHsgY29sb3I6ICM3Nzc7IH0KLmNtLXMtdG9tb3Jyb3ctbmlnaHQtZWlnaHRpZXMgLkNvZGVNaXJyb3ItbGluZW51bWJlciB7IGNvbG9yOiAjNTE1MTUxOyB9Ci5jbS1zLXRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzIC5Db2RlTWlycm9yLWN1cnNvciB7IGJvcmRlci1sZWZ0OiAxcHggc29saWQgIzZBNkE2QTsgfQoKLmNtLXMtdG9tb3Jyb3ctbmlnaHQtZWlnaHRpZXMgc3Bhbi5jbS1jb21tZW50IHsgY29sb3I6ICNkMjdiNTM7IH0KLmNtLXMtdG9tb3Jyb3ctbmlnaHQtZWlnaHRpZXMgc3Bhbi5jbS1hdG9tIHsgY29sb3I6ICNhMTZhOTQ7IH0KLmNtLXMtdG9tb3Jyb3ctbmlnaHQtZWlnaHRpZXMgc3Bhbi5jbS1udW1iZXIgeyBjb2xvcjogI2ExNmE5NDsgfQoKLmNtLXMtdG9tb3Jyb3ctbmlnaHQtZWlnaHRpZXMgc3Bhbi5jbS1wcm9wZXJ0eSwgLmNtLXMtdG9tb3Jyb3ctbmlnaHQtZWlnaHRpZXMgc3Bhbi5jbS1hdHRyaWJ1dGUgeyBjb2xvcjogIzk5Y2M5OTsgfQouY20tcy10b21vcnJvdy1uaWdodC1laWdodGllcyBzcGFuLmNtLWtleXdvcmQgeyBjb2xvcjogI2YyNzc3YTsgfQouY20tcy10b21vcnJvdy1uaWdodC1laWdodGllcyBzcGFuLmNtLXN0cmluZyB7IGNvbG9yOiAjZmZjYzY2OyB9CgouY20tcy10b21vcnJvdy1uaWdodC1laWdodGllcyBzcGFuLmNtLXZhcmlhYmxlIHsgY29sb3I6ICM5OWNjOTk7IH0KLmNtLXMtdG9tb3Jyb3ctbmlnaHQtZWlnaHRpZXMgc3Bhbi5jbS12YXJpYWJsZS0yIHsgY29sb3I6ICM2Njk5Y2M7IH0KLmNtLXMtdG9tb3Jyb3ctbmlnaHQtZWlnaHRpZXMgc3Bhbi5jbS1kZWYgeyBjb2xvcjogI2Y5OTE1NzsgfQouY20tcy10b21vcnJvdy1uaWdodC1laWdodGllcyBzcGFuLmNtLWJyYWNrZXQgeyBjb2xvcjogI0NDQ0NDQzsgfQouY20tcy10b21vcnJvdy1uaWdodC1laWdodGllcyBzcGFuLmNtLXRhZyB7IGNvbG9yOiAjZjI3NzdhOyB9Ci5jbS1zLXRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzIHNwYW4uY20tbGluayB7IGNvbG9yOiAjYTE2YTk0OyB9Ci5jbS1zLXRvbW9ycm93LW5pZ2h0LWVpZ2h0aWVzIHNwYW4uY20tZXJyb3IgeyBiYWNrZ3JvdW5kOiAjZjI3NzdhOyBjb2xvcjogIzZBNkE2QTsgfQoKLmNtLXMtdG9tb3Jyb3ctbmlnaHQtZWlnaHRpZXMgLkNvZGVNaXJyb3ItYWN0aXZlbGluZS1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogIzM0MzYwMDsgfQouY20tcy10b21vcnJvdy1uaWdodC1laWdodGllcyAuQ29kZU1pcnJvci1tYXRjaGluZ2JyYWNrZXQgeyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgY29sb3I6IHdoaXRlICFpbXBvcnRhbnQ7IH0K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/theme/ttcn.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LmNtLXMtdHRjbiAuY20tcXVvdGUgeyBjb2xvcjogIzA5MDsgfQouY20tcy10dGNuIC5jbS1uZWdhdGl2ZSB7IGNvbG9yOiAjZDQ0OyB9Ci5jbS1zLXR0Y24gLmNtLXBvc2l0aXZlIHsgY29sb3I6ICMyOTI7IH0KLmNtLXMtdHRjbiAuY20taGVhZGVyLCAuY20tc3Ryb25nIHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLmNtLXMtdHRjbiAuY20tZW0geyBmb250LXN0eWxlOiBpdGFsaWM7IH0KLmNtLXMtdHRjbiAuY20tbGluayB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOyB9Ci5jbS1zLXR0Y24gLmNtLXN0cmlrZXRocm91Z2ggeyB0ZXh0LWRlY29yYXRpb246IGxpbmUtdGhyb3VnaDsgfQouY20tcy10dGNuIC5jbS1oZWFkZXIgeyBjb2xvcjogIzAwZjsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KCi5jbS1zLXR0Y24gLmNtLWF0b20geyBjb2xvcjogIzIxOTsgfQouY20tcy10dGNuIC5jbS1hdHRyaWJ1dGUgeyBjb2xvcjogIzAwYzsgfQouY20tcy10dGNuIC5jbS1icmFja2V0IHsgY29sb3I6ICM5OTc7IH0KLmNtLXMtdHRjbiAuY20tY29tbWVudCB7IGNvbG9yOiAjMzMzMzMzOyB9Ci5jbS1zLXR0Y24gLmNtLWRlZiB7IGNvbG9yOiAjMDBmOyB9Ci5jbS1zLXR0Y24gLmNtLWVtIHsgZm9udC1zdHlsZTogaXRhbGljOyB9Ci5jbS1zLXR0Y24gLmNtLWVycm9yIHsgY29sb3I6ICNmMDA7IH0KLmNtLXMtdHRjbiAuY20taHIgeyBjb2xvcjogIzk5OTsgfQouY20tcy10dGNuIC5jbS1pbnZhbGlkY2hhciB7IGNvbG9yOiAjZjAwOyB9Ci5jbS1zLXR0Y24gLmNtLWtleXdvcmQgeyBmb250LXdlaWdodDpib2xkOyB9Ci5jbS1zLXR0Y24gLmNtLWxpbmsgeyBjb2xvcjogIzAwYzsgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7IH0KLmNtLXMtdHRjbiAuY20tbWV0YSB7IGNvbG9yOiAjNTU1OyB9Ci5jbS1zLXR0Y24gLmNtLW5lZ2F0aXZlIHsgY29sb3I6ICNkNDQ7IH0KLmNtLXMtdHRjbiAuY20tcG9zaXRpdmUgeyBjb2xvcjogIzI5MjsgfQouY20tcy10dGNuIC5jbS1xdWFsaWZpZXIgeyBjb2xvcjogIzU1NTsgfQouY20tcy10dGNuIC5jbS1zdHJpa2V0aHJvdWdoIHsgdGV4dC1kZWNvcmF0aW9uOiBsaW5lLXRocm91Z2g7IH0KLmNtLXMtdHRjbiAuY20tc3RyaW5nIHsgY29sb3I6ICMwMDY0MDA7IH0KLmNtLXMtdHRjbiAuY20tc3RyaW5nLTIgeyBjb2xvcjogI2Y1MDsgfQouY20tcy10dGNuIC5jbS1zdHJvbmcgeyBmb250LXdlaWdodDogYm9sZDsgfQouY20tcy10dGNuIC5jbS10YWcgeyBjb2xvcjogIzE3MDsgfQouY20tcy10dGNuIC5jbS12YXJpYWJsZSB7IGNvbG9yOiAjOEIyMjUyOyB9Ci5jbS1zLXR0Y24gLmNtLXZhcmlhYmxlLTIgeyBjb2xvcjogIzA1YTsgfQouY20tcy10dGNuIC5jbS12YXJpYWJsZS0zIHsgY29sb3I6ICMwODU7IH0KCi5jbS1zLXR0Y24gLmNtLWludmFsaWRjaGFyIHsgY29sb3I6ICNmMDA7IH0KCi8qIEFTTiAqLwouY20tcy10dGNuIC5jbS1hY2Nlc3NUeXBlcywKLmNtLXMtdHRjbiAuY20tY29tcGFyZVR5cGVzIHsgY29sb3I6ICMyNzQwOEI7IH0KLmNtLXMtdHRjbiAuY20tY21pcFZlcmJzIHsgY29sb3I6ICM4QjIyNTI7IH0KLmNtLXMtdHRjbiAuY20tbW9kaWZpZXIgeyBjb2xvcjojRDI2OTFFOyB9Ci5jbS1zLXR0Y24gLmNtLXN0YXR1cyB7IGNvbG9yOiM4QjQ1NDU7IH0KLmNtLXMtdHRjbiAuY20tc3RvcmFnZSB7IGNvbG9yOiNBMDIwRjA7IH0KLmNtLXMtdHRjbiAuY20tdGFncyB7IGNvbG9yOiMwMDY0MDA7IH0KCi8qIENGRyAqLwouY20tcy10dGNuIC5jbS1leHRlcm5hbENvbW1hbmRzIHsgY29sb3I6ICM4QjQ1NDU7IGZvbnQtd2VpZ2h0OmJvbGQ7IH0KLmNtLXMtdHRjbiAuY20tZmlsZU5DdHJsTWFza09wdGlvbnMsCi5jbS1zLXR0Y24gLmNtLXNlY3Rpb25UaXRsZSB7IGNvbG9yOiAjMkU4QjU3OyBmb250LXdlaWdodDpib2xkOyB9CgovKiBUVENOICovCi5jbS1zLXR0Y24gLmNtLWJvb2xlYW5Db25zdHMsCi5jbS1zLXR0Y24gLmNtLW90aGVyQ29uc3RzLAouY20tcy10dGNuIC5jbS12ZXJkaWN0Q29uc3RzIHsgY29sb3I6ICMwMDY0MDA7IH0KLmNtLXMtdHRjbiAuY20tY29uZmlnT3BzLAouY20tcy10dGNuIC5jbS1mdW5jdGlvbk9wcywKLmNtLXMtdHRjbiAuY20tcG9ydE9wcywKLmNtLXMtdHRjbiAuY20tc3V0T3BzLAouY20tcy10dGNuIC5jbS10aW1lck9wcywKLmNtLXMtdHRjbiAuY20tdmVyZGljdE9wcyB7IGNvbG9yOiAjMDAwMEZGOyB9Ci5jbS1zLXR0Y24gLmNtLXByZXByb2Nlc3NvciwKLmNtLXMtdHRjbiAuY20tdGVtcGxhdGVNYXRjaCwKLmNtLXMtdHRjbiAuY20tdHRjbjNNYWNyb3MgeyBjb2xvcjogIzI3NDA4QjsgfQouY20tcy10dGNuIC5jbS10eXBlcyB7IGNvbG9yOiAjQTUyQTJBOyBmb250LXdlaWdodDpib2xkOyB9Ci5jbS1zLXR0Y24gLmNtLXZpc2liaWxpdHlNb2RpZmllcnMgeyBmb250LXdlaWdodDpib2xkOyB9Cg==]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/theme/twilight.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LmNtLXMtdHdpbGlnaHQuQ29kZU1pcnJvciB7IGJhY2tncm91bmQ6ICMxNDE0MTQ7IGNvbG9yOiAjZjdmN2Y3OyB9IC8qKi8KLmNtLXMtdHdpbGlnaHQgZGl2LkNvZGVNaXJyb3Itc2VsZWN0ZWQgeyBiYWNrZ3JvdW5kOiAjMzIzMjMyOyB9IC8qKi8KLmNtLXMtdHdpbGlnaHQgLkNvZGVNaXJyb3ItbGluZTo6c2VsZWN0aW9uLCAuY20tcy10d2lsaWdodCAuQ29kZU1pcnJvci1saW5lID4gc3Bhbjo6c2VsZWN0aW9uLCAuY20tcy10d2lsaWdodCAuQ29kZU1pcnJvci1saW5lID4gc3BhbiA+IHNwYW46OnNlbGVjdGlvbiB7IGJhY2tncm91bmQ6IHJnYmEoNTAsIDUwLCA1MCwgMC45OSk7IH0KLmNtLXMtdHdpbGlnaHQgLkNvZGVNaXJyb3ItbGluZTo6LW1vei1zZWxlY3Rpb24sIC5jbS1zLXR3aWxpZ2h0IC5Db2RlTWlycm9yLWxpbmUgPiBzcGFuOjotbW96LXNlbGVjdGlvbiwgLmNtLXMtdHdpbGlnaHQgLkNvZGVNaXJyb3ItbGluZSA+IHNwYW4gPiBzcGFuOjotbW96LXNlbGVjdGlvbiB7IGJhY2tncm91bmQ6IHJnYmEoNTAsIDUwLCA1MCwgMC45OSk7IH0KCi5jbS1zLXR3aWxpZ2h0IC5Db2RlTWlycm9yLWd1dHRlcnMgeyBiYWNrZ3JvdW5kOiAjMjIyOyBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCAjYWFhOyB9Ci5jbS1zLXR3aWxpZ2h0IC5Db2RlTWlycm9yLWd1dHRlcm1hcmtlciB7IGNvbG9yOiB3aGl0ZTsgfQouY20tcy10d2lsaWdodCAuQ29kZU1pcnJvci1ndXR0ZXJtYXJrZXItc3VidGxlIHsgY29sb3I6ICNhYWE7IH0KLmNtLXMtdHdpbGlnaHQgLkNvZGVNaXJyb3ItbGluZW51bWJlciB7IGNvbG9yOiAjYWFhOyB9Ci5jbS1zLXR3aWxpZ2h0IC5Db2RlTWlycm9yLWN1cnNvciB7IGJvcmRlci1sZWZ0OiAxcHggc29saWQgd2hpdGU7IH0KCi5jbS1zLXR3aWxpZ2h0IC5jbS1rZXl3b3JkIHsgY29sb3I6ICNmOWVlOTg7IH0gLyoqLwouY20tcy10d2lsaWdodCAuY20tYXRvbSB7IGNvbG9yOiAjRkMwOyB9Ci5jbS1zLXR3aWxpZ2h0IC5jbS1udW1iZXIgeyBjb2xvcjogICNjYTc4NDE7IH0gLyoqLwouY20tcy10d2lsaWdodCAuY20tZGVmIHsgY29sb3I6ICM4REE2Q0U7IH0KLmNtLXMtdHdpbGlnaHQgc3Bhbi5jbS12YXJpYWJsZS0yLCAuY20tcy10d2lsaWdodCBzcGFuLmNtLXRhZyB7IGNvbG9yOiAjNjA3MzkyOyB9IC8qKi8KLmNtLXMtdHdpbGlnaHQgc3Bhbi5jbS12YXJpYWJsZS0zLCAuY20tcy10d2lsaWdodCBzcGFuLmNtLWRlZiB7IGNvbG9yOiAjNjA3MzkyOyB9IC8qKi8KLmNtLXMtdHdpbGlnaHQgLmNtLW9wZXJhdG9yIHsgY29sb3I6ICNjZGE4Njk7IH0gLyoqLwouY20tcy10d2lsaWdodCAuY20tY29tbWVudCB7IGNvbG9yOiM3Nzc7IGZvbnQtc3R5bGU6aXRhbGljOyBmb250LXdlaWdodDpub3JtYWw7IH0gLyoqLwouY20tcy10d2lsaWdodCAuY20tc3RyaW5nIHsgY29sb3I6IzhmOWQ2YTsgZm9udC1zdHlsZTppdGFsaWM7IH0gLyoqLwouY20tcy10d2lsaWdodCAuY20tc3RyaW5nLTIgeyBjb2xvcjojYmQ2YjE4OyB9IC8qPyovCi5jbS1zLXR3aWxpZ2h0IC5jbS1tZXRhIHsgYmFja2dyb3VuZC1jb2xvcjojMTQxNDE0OyBjb2xvcjojZjdmN2Y3OyB9IC8qPyovCi5jbS1zLXR3aWxpZ2h0IC5jbS1idWlsdGluIHsgY29sb3I6ICNjZGE4Njk7IH0gLyo/Ki8KLmNtLXMtdHdpbGlnaHQgLmNtLXRhZyB7IGNvbG9yOiAjOTk3NjQzOyB9IC8qKi8KLmNtLXMtdHdpbGlnaHQgLmNtLWF0dHJpYnV0ZSB7IGNvbG9yOiAjZDZiYjZkOyB9IC8qPyovCi5jbS1zLXR3aWxpZ2h0IC5jbS1oZWFkZXIgeyBjb2xvcjogI0ZGNjQwMDsgfQouY20tcy10d2lsaWdodCAuY20taHIgeyBjb2xvcjogI0FFQUVBRTsgfQouY20tcy10d2lsaWdodCAuY20tbGluayB7IGNvbG9yOiNhZDkzNjE7IGZvbnQtc3R5bGU6aXRhbGljOyB0ZXh0LWRlY29yYXRpb246bm9uZTsgfSAvKiovCi5jbS1zLXR3aWxpZ2h0IC5jbS1lcnJvciB7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZWQ7IH0KCi5jbS1zLXR3aWxpZ2h0IC5Db2RlTWlycm9yLWFjdGl2ZWxpbmUtYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6ICMyNzI4MkU7IH0KLmNtLXMtdHdpbGlnaHQgLkNvZGVNaXJyb3ItbWF0Y2hpbmdicmFja2V0IHsgb3V0bGluZToxcHggc29saWQgZ3JleTsgY29sb3I6d2hpdGUgIWltcG9ydGFudDsgfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/theme/vibrant-ink.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyogVGFrZW4gZnJvbSB0aGUgcG9wdWxhciBWaXN1YWwgU3R1ZGlvIFZpYnJhbnQgSW5rIFNjaGVtYSAqLwoKLmNtLXMtdmlicmFudC1pbmsuQ29kZU1pcnJvciB7IGJhY2tncm91bmQ6IGJsYWNrOyBjb2xvcjogd2hpdGU7IH0KLmNtLXMtdmlicmFudC1pbmsgZGl2LkNvZGVNaXJyb3Itc2VsZWN0ZWQgeyBiYWNrZ3JvdW5kOiAjMzU0OTNjOyB9Ci5jbS1zLXZpYnJhbnQtaW5rIC5Db2RlTWlycm9yLWxpbmU6OnNlbGVjdGlvbiwgLmNtLXMtdmlicmFudC1pbmsgLkNvZGVNaXJyb3ItbGluZSA+IHNwYW46OnNlbGVjdGlvbiwgLmNtLXMtdmlicmFudC1pbmsgLkNvZGVNaXJyb3ItbGluZSA+IHNwYW4gPiBzcGFuOjpzZWxlY3Rpb24geyBiYWNrZ3JvdW5kOiByZ2JhKDUzLCA3MywgNjAsIDAuOTkpOyB9Ci5jbS1zLXZpYnJhbnQtaW5rIC5Db2RlTWlycm9yLWxpbmU6Oi1tb3otc2VsZWN0aW9uLCAuY20tcy12aWJyYW50LWluayAuQ29kZU1pcnJvci1saW5lID4gc3Bhbjo6LW1vei1zZWxlY3Rpb24sIC5jbS1zLXZpYnJhbnQtaW5rIC5Db2RlTWlycm9yLWxpbmUgPiBzcGFuID4gc3Bhbjo6LW1vei1zZWxlY3Rpb24geyBiYWNrZ3JvdW5kOiByZ2JhKDUzLCA3MywgNjAsIDAuOTkpOyB9CgouY20tcy12aWJyYW50LWluayAuQ29kZU1pcnJvci1ndXR0ZXJzIHsgYmFja2dyb3VuZDogIzAwMjI0MDsgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgI2FhYTsgfQouY20tcy12aWJyYW50LWluayAuQ29kZU1pcnJvci1ndXR0ZXJtYXJrZXIgeyBjb2xvcjogd2hpdGU7IH0KLmNtLXMtdmlicmFudC1pbmsgLkNvZGVNaXJyb3ItZ3V0dGVybWFya2VyLXN1YnRsZSB7IGNvbG9yOiAjZDBkMGQwOyB9Ci5jbS1zLXZpYnJhbnQtaW5rIC5Db2RlTWlycm9yLWxpbmVudW1iZXIgeyBjb2xvcjogI2QwZDBkMDsgfQouY20tcy12aWJyYW50LWluayAuQ29kZU1pcnJvci1jdXJzb3IgeyBib3JkZXItbGVmdDogMXB4IHNvbGlkIHdoaXRlOyB9CgouY20tcy12aWJyYW50LWluayAuY20ta2V5d29yZCB7IGNvbG9yOiAjQ0M3ODMyOyB9Ci5jbS1zLXZpYnJhbnQtaW5rIC5jbS1hdG9tIHsgY29sb3I6ICNGQzA7IH0KLmNtLXMtdmlicmFudC1pbmsgLmNtLW51bWJlciB7IGNvbG9yOiAgI0ZGRUU5ODsgfQouY20tcy12aWJyYW50LWluayAuY20tZGVmIHsgY29sb3I6ICM4REE2Q0U7IH0KLmNtLXMtdmlicmFudC1pbmsgc3Bhbi5jbS12YXJpYWJsZS0yLCAuY20tcy12aWJyYW50IHNwYW4uY20tdGFnIHsgY29sb3I6ICNGRkM2NkQ7IH0KLmNtLXMtdmlicmFudC1pbmsgc3Bhbi5jbS12YXJpYWJsZS0zLCAuY20tcy12aWJyYW50IHNwYW4uY20tZGVmIHsgY29sb3I6ICNGRkM2NkQ7IH0KLmNtLXMtdmlicmFudC1pbmsgLmNtLW9wZXJhdG9yIHsgY29sb3I6ICM4ODg7IH0KLmNtLXMtdmlicmFudC1pbmsgLmNtLWNvbW1lbnQgeyBjb2xvcjogZ3JheTsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0KLmNtLXMtdmlicmFudC1pbmsgLmNtLXN0cmluZyB7IGNvbG9yOiAgI0E1QzI1QzsgfQouY20tcy12aWJyYW50LWluayAuY20tc3RyaW5nLTIgeyBjb2xvcjogcmVkOyB9Ci5jbS1zLXZpYnJhbnQtaW5rIC5jbS1tZXRhIHsgY29sb3I6ICNEOEZBM0M7IH0KLmNtLXMtdmlicmFudC1pbmsgLmNtLWJ1aWx0aW4geyBjb2xvcjogIzhEQTZDRTsgfQouY20tcy12aWJyYW50LWluayAuY20tdGFnIHsgY29sb3I6ICM4REE2Q0U7IH0KLmNtLXMtdmlicmFudC1pbmsgLmNtLWF0dHJpYnV0ZSB7IGNvbG9yOiAjOERBNkNFOyB9Ci5jbS1zLXZpYnJhbnQtaW5rIC5jbS1oZWFkZXIgeyBjb2xvcjogI0ZGNjQwMDsgfQouY20tcy12aWJyYW50LWluayAuY20taHIgeyBjb2xvcjogI0FFQUVBRTsgfQouY20tcy12aWJyYW50LWluayAuY20tbGluayB7IGNvbG9yOiBibHVlOyB9Ci5jbS1zLXZpYnJhbnQtaW5rIC5jbS1lcnJvciB7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZWQ7IH0KCi5jbS1zLXZpYnJhbnQtaW5rIC5Db2RlTWlycm9yLWFjdGl2ZWxpbmUtYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6ICMyNzI4MkU7IH0KLmNtLXMtdmlicmFudC1pbmsgLkNvZGVNaXJyb3ItbWF0Y2hpbmdicmFja2V0IHsgb3V0bGluZToxcHggc29saWQgZ3JleTsgY29sb3I6d2hpdGUgIWltcG9ydGFudDsgfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/theme/xq-dark.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKQ29weXJpZ2h0IChDKSAyMDExIGJ5IE1hcmtMb2dpYyBDb3Jwb3JhdGlvbgpBdXRob3I6IE1pa2UgQnJldm9vcnQgPG1pa2VAYnJldm9vcnQuY29tPgoKUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQpvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAppbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCmZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgphbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLApGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgpMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLApPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOClRIRSBTT0ZUV0FSRS4KKi8KLmNtLXMteHEtZGFyay5Db2RlTWlycm9yIHsgYmFja2dyb3VuZDogIzBhMDAxZjsgY29sb3I6ICNmOGY4Zjg7IH0KLmNtLXMteHEtZGFyayBkaXYuQ29kZU1pcnJvci1zZWxlY3RlZCB7IGJhY2tncm91bmQ6ICMyNzAwN0E7IH0KLmNtLXMteHEtZGFyayAuQ29kZU1pcnJvci1saW5lOjpzZWxlY3Rpb24sIC5jbS1zLXhxLWRhcmsgLkNvZGVNaXJyb3ItbGluZSA+IHNwYW46OnNlbGVjdGlvbiwgLmNtLXMteHEtZGFyayAuQ29kZU1pcnJvci1saW5lID4gc3BhbiA+IHNwYW46OnNlbGVjdGlvbiB7IGJhY2tncm91bmQ6IHJnYmEoMzksIDAsIDEyMiwgMC45OSk7IH0KLmNtLXMteHEtZGFyayAuQ29kZU1pcnJvci1saW5lOjotbW96LXNlbGVjdGlvbiwgLmNtLXMteHEtZGFyayAuQ29kZU1pcnJvci1saW5lID4gc3Bhbjo6LW1vei1zZWxlY3Rpb24sIC5jbS1zLXhxLWRhcmsgLkNvZGVNaXJyb3ItbGluZSA+IHNwYW4gPiBzcGFuOjotbW96LXNlbGVjdGlvbiB7IGJhY2tncm91bmQ6IHJnYmEoMzksIDAsIDEyMiwgMC45OSk7IH0KLmNtLXMteHEtZGFyayAuQ29kZU1pcnJvci1ndXR0ZXJzIHsgYmFja2dyb3VuZDogIzBhMDAxZjsgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgI2FhYTsgfQouY20tcy14cS1kYXJrIC5Db2RlTWlycm9yLWd1dHRlcm1hcmtlciB7IGNvbG9yOiAjRkZCRDQwOyB9Ci5jbS1zLXhxLWRhcmsgLkNvZGVNaXJyb3ItZ3V0dGVybWFya2VyLXN1YnRsZSB7IGNvbG9yOiAjZjhmOGY4OyB9Ci5jbS1zLXhxLWRhcmsgLkNvZGVNaXJyb3ItbGluZW51bWJlciB7IGNvbG9yOiAjZjhmOGY4OyB9Ci5jbS1zLXhxLWRhcmsgLkNvZGVNaXJyb3ItY3Vyc29yIHsgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCB3aGl0ZTsgfQoKLmNtLXMteHEtZGFyayBzcGFuLmNtLWtleXdvcmQgeyBjb2xvcjogI0ZGQkQ0MDsgfQouY20tcy14cS1kYXJrIHNwYW4uY20tYXRvbSB7IGNvbG9yOiAjNkM4Q0Q1OyB9Ci5jbS1zLXhxLWRhcmsgc3Bhbi5jbS1udW1iZXIgeyBjb2xvcjogIzE2NDsgfQouY20tcy14cS1kYXJrIHNwYW4uY20tZGVmIHsgY29sb3I6ICNGRkY7IHRleHQtZGVjb3JhdGlvbjp1bmRlcmxpbmU7IH0KLmNtLXMteHEtZGFyayBzcGFuLmNtLXZhcmlhYmxlIHsgY29sb3I6ICNGRkY7IH0KLmNtLXMteHEtZGFyayBzcGFuLmNtLXZhcmlhYmxlLTIgeyBjb2xvcjogI0VFRTsgfQouY20tcy14cS1kYXJrIHNwYW4uY20tdmFyaWFibGUtMyB7IGNvbG9yOiAjREREOyB9Ci5jbS1zLXhxLWRhcmsgc3Bhbi5jbS1wcm9wZXJ0eSB7fQouY20tcy14cS1kYXJrIHNwYW4uY20tb3BlcmF0b3Ige30KLmNtLXMteHEtZGFyayBzcGFuLmNtLWNvbW1lbnQgeyBjb2xvcjogZ3JheTsgfQouY20tcy14cS1kYXJrIHNwYW4uY20tc3RyaW5nIHsgY29sb3I6ICM5RkVFMDA7IH0KLmNtLXMteHEtZGFyayBzcGFuLmNtLW1ldGEgeyBjb2xvcjogeWVsbG93OyB9Ci5jbS1zLXhxLWRhcmsgc3Bhbi5jbS1xdWFsaWZpZXIgeyBjb2xvcjogI0ZGRjcwMDsgfQouY20tcy14cS1kYXJrIHNwYW4uY20tYnVpbHRpbiB7IGNvbG9yOiAjMzBhOyB9Ci5jbS1zLXhxLWRhcmsgc3Bhbi5jbS1icmFja2V0IHsgY29sb3I6ICNjYzc7IH0KLmNtLXMteHEtZGFyayBzcGFuLmNtLXRhZyB7IGNvbG9yOiAjRkZCRDQwOyB9Ci5jbS1zLXhxLWRhcmsgc3Bhbi5jbS1hdHRyaWJ1dGUgeyBjb2xvcjogI0ZGRjcwMDsgfQouY20tcy14cS1kYXJrIHNwYW4uY20tZXJyb3IgeyBjb2xvcjogI2YwMDsgfQoKLmNtLXMteHEtZGFyayAuQ29kZU1pcnJvci1hY3RpdmVsaW5lLWJhY2tncm91bmQgeyBiYWNrZ3JvdW5kOiAjMjcyODJFOyB9Ci5jbS1zLXhxLWRhcmsgLkNvZGVNaXJyb3ItbWF0Y2hpbmdicmFja2V0IHsgb3V0bGluZToxcHggc29saWQgZ3JleTsgY29sb3I6d2hpdGUgIWltcG9ydGFudDsgfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/theme/xq-light.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKQ29weXJpZ2h0IChDKSAyMDExIGJ5IE1hcmtMb2dpYyBDb3Jwb3JhdGlvbgpBdXRob3I6IE1pa2UgQnJldm9vcnQgPG1pa2VAYnJldm9vcnQuY29tPgoKUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weQpvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAppbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzCnRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwKY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCmZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CgpUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgphbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KClRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCklNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLApGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgpMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLApPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOClRIRSBTT0ZUV0FSRS4KKi8KLmNtLXMteHEtbGlnaHQgc3Bhbi5jbS1rZXl3b3JkIHsgbGluZS1oZWlnaHQ6IDFlbTsgZm9udC13ZWlnaHQ6IGJvbGQ7IGNvbG9yOiAjNUE1Q0FEOyB9Ci5jbS1zLXhxLWxpZ2h0IHNwYW4uY20tYXRvbSB7IGNvbG9yOiAjNkM4Q0Q1OyB9Ci5jbS1zLXhxLWxpZ2h0IHNwYW4uY20tbnVtYmVyIHsgY29sb3I6ICMxNjQ7IH0KLmNtLXMteHEtbGlnaHQgc3Bhbi5jbS1kZWYgeyB0ZXh0LWRlY29yYXRpb246dW5kZXJsaW5lOyB9Ci5jbS1zLXhxLWxpZ2h0IHNwYW4uY20tdmFyaWFibGUgeyBjb2xvcjogYmxhY2s7IH0KLmNtLXMteHEtbGlnaHQgc3Bhbi5jbS12YXJpYWJsZS0yIHsgY29sb3I6YmxhY2s7IH0KLmNtLXMteHEtbGlnaHQgc3Bhbi5jbS12YXJpYWJsZS0zIHsgY29sb3I6IGJsYWNrOyB9Ci5jbS1zLXhxLWxpZ2h0IHNwYW4uY20tcHJvcGVydHkge30KLmNtLXMteHEtbGlnaHQgc3Bhbi5jbS1vcGVyYXRvciB7fQouY20tcy14cS1saWdodCBzcGFuLmNtLWNvbW1lbnQgeyBjb2xvcjogIzAwODBGRjsgZm9udC1zdHlsZTogaXRhbGljOyB9Ci5jbS1zLXhxLWxpZ2h0IHNwYW4uY20tc3RyaW5nIHsgY29sb3I6IHJlZDsgfQouY20tcy14cS1saWdodCBzcGFuLmNtLW1ldGEgeyBjb2xvcjogeWVsbG93OyB9Ci5jbS1zLXhxLWxpZ2h0IHNwYW4uY20tcXVhbGlmaWVyIHsgY29sb3I6IGdyZXk7IH0KLmNtLXMteHEtbGlnaHQgc3Bhbi5jbS1idWlsdGluIHsgY29sb3I6ICM3RUE2NTY7IH0KLmNtLXMteHEtbGlnaHQgc3Bhbi5jbS1icmFja2V0IHsgY29sb3I6ICNjYzc7IH0KLmNtLXMteHEtbGlnaHQgc3Bhbi5jbS10YWcgeyBjb2xvcjogIzNGN0Y3RjsgfQouY20tcy14cS1saWdodCBzcGFuLmNtLWF0dHJpYnV0ZSB7IGNvbG9yOiAjN0YwMDdGOyB9Ci5jbS1zLXhxLWxpZ2h0IHNwYW4uY20tZXJyb3IgeyBjb2xvcjogI2YwMDsgfQoKLmNtLXMteHEtbGlnaHQgLkNvZGVNaXJyb3ItYWN0aXZlbGluZS1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogI2U4ZjJmZjsgfQouY20tcy14cS1saWdodCAuQ29kZU1pcnJvci1tYXRjaGluZ2JyYWNrZXQgeyBvdXRsaW5lOjFweCBzb2xpZCBncmV5O2NvbG9yOmJsYWNrICFpbXBvcnRhbnQ7YmFja2dyb3VuZDp5ZWxsb3c7IH0K]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/theme/yeti.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoKCiAgICBOYW1lOiAgICAgICB5ZXRpCiAgICBBdXRob3I6ICAgICBNaWNoYWVsIEthbWluc2t5IChodHRwOi8vZ2l0aHViLmNvbS9ta2FtaW5za3kxMSkKCiAgICBPcmlnaW5hbCB5ZXRpIGNvbG9yIHNjaGVtZSBieSBKZXNzZSBXZWVkIChodHRwczovL2dpdGh1Yi5jb20vamVzc2V3ZWVkL3lldGktc3ludGF4KQoKKi8KCgouY20tcy15ZXRpLkNvZGVNaXJyb3IgewogIGJhY2tncm91bmQtY29sb3I6ICNFQ0VBRTggIWltcG9ydGFudDsKICBjb2xvcjogI2QxYzljMCAhaW1wb3J0YW50OwogIGJvcmRlcjogbm9uZTsKfQoKLmNtLXMteWV0aSAuQ29kZU1pcnJvci1ndXR0ZXJzIHsKICBjb2xvcjogI2FkYWJhNjsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjRTVFMURCOwogIGJvcmRlcjogbm9uZTsKfQouY20tcy15ZXRpIC5Db2RlTWlycm9yLWN1cnNvciB7IGJvcmRlci1sZWZ0OiBzb2xpZCB0aGluICNkMWM5YzA7IH0KLmNtLXMteWV0aSAuQ29kZU1pcnJvci1saW5lbnVtYmVyIHsgY29sb3I6ICNhZGFiYTY7IH0KLmNtLXMteWV0aS5Db2RlTWlycm9yLWZvY3VzZWQgZGl2LkNvZGVNaXJyb3Itc2VsZWN0ZWQgeyBiYWNrZ3JvdW5kOiAjRENEOEQyOyB9Ci5jbS1zLXlldGkgLkNvZGVNaXJyb3ItbGluZTo6c2VsZWN0aW9uLCAuY20tcy15ZXRpIC5Db2RlTWlycm9yLWxpbmUgPiBzcGFuOjpzZWxlY3Rpb24sIC5jbS1zLXlldGkgLkNvZGVNaXJyb3ItbGluZSA+IHNwYW4gPiBzcGFuOjpzZWxlY3Rpb24geyBiYWNrZ3JvdW5kOiAjRENEOEQyOyB9Ci5jbS1zLXlldGkgLkNvZGVNaXJyb3ItbGluZTo6LW1vei1zZWxlY3Rpb24sIC5jbS1zLXlldGkgLkNvZGVNaXJyb3ItbGluZSA+IHNwYW46Oi1tb3otc2VsZWN0aW9uLCAuY20tcy15ZXRpIC5Db2RlTWlycm9yLWxpbmUgPiBzcGFuID4gc3Bhbjo6LW1vei1zZWxlY3Rpb24geyBiYWNrZ3JvdW5kOiAjRENEOEQyOyB9Ci5jbS1zLXlldGkgc3Bhbi5jbS1jb21tZW50IHsgY29sb3I6ICNkNGM4YmU7IH0KLmNtLXMteWV0aSBzcGFuLmNtLXN0cmluZywgLmNtLXMteWV0aSBzcGFuLmNtLXN0cmluZy0yIHsgY29sb3I6ICM5NmMwZDg7IH0KLmNtLXMteWV0aSBzcGFuLmNtLW51bWJlciB7IGNvbG9yOiAjYTA3NGM0OyB9Ci5jbS1zLXlldGkgc3Bhbi5jbS12YXJpYWJsZSB7IGNvbG9yOiAjNTViNWRiOyB9Ci5jbS1zLXlldGkgc3Bhbi5jbS12YXJpYWJsZS0yIHsgY29sb3I6ICNhMDc0YzQ7IH0KLmNtLXMteWV0aSBzcGFuLmNtLWRlZiB7IGNvbG9yOiAjNTViNWRiOyB9Ci5jbS1zLXlldGkgc3Bhbi5jbS1vcGVyYXRvciB7IGNvbG9yOiAjOWZiOTZlOyB9Ci5jbS1zLXlldGkgc3Bhbi5jbS1rZXl3b3JkIHsgY29sb3I6ICM5ZmI5NmU7IH0KLmNtLXMteWV0aSBzcGFuLmNtLWF0b20geyBjb2xvcjogI2EwNzRjNDsgfQouY20tcy15ZXRpIHNwYW4uY20tbWV0YSB7IGNvbG9yOiAjOTZjMGQ4OyB9Ci5jbS1zLXlldGkgc3Bhbi5jbS10YWcgeyBjb2xvcjogIzk2YzBkODsgfQouY20tcy15ZXRpIHNwYW4uY20tYXR0cmlidXRlIHsgY29sb3I6ICM5ZmI5NmU7IH0KLmNtLXMteWV0aSBzcGFuLmNtLXF1YWxpZmllciB7IGNvbG9yOiAjOTZjMGQ4OyB9Ci5jbS1zLXlldGkgc3Bhbi5jbS1wcm9wZXJ0eSB7IGNvbG9yOiAjYTA3NGM0OyB9Ci5jbS1zLXlldGkgc3Bhbi5jbS1idWlsdGluIHsgY29sb3I6ICNhMDc0YzQ7IH0KLmNtLXMteWV0aSBzcGFuLmNtLXZhcmlhYmxlLTMgeyBjb2xvcjogIzk2YzBkODsgfQouY20tcy15ZXRpIC5Db2RlTWlycm9yLWFjdGl2ZWxpbmUtYmFja2dyb3VuZCB7IGJhY2tncm91bmQ6ICNFN0U0RTA7IH0KLmNtLXMteWV0aSAuQ29kZU1pcnJvci1tYXRjaGluZ2JyYWNrZXQgeyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgfQo=]]></data>
	</file>
	<file>
	  <filename>/codemirror-5.20.2/theme/zenburn.css</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[LyoqCiAqICIKICogIFVzaW5nIFplbmJ1cm4gY29sb3IgcGFsZXR0ZSBmcm9tIHRoZSBFbWFjcyBaZW5idXJuIFRoZW1lCiAqICBodHRwczovL2dpdGh1Yi5jb20vYmJhdHNvdi96ZW5idXJuLWVtYWNzL2Jsb2IvbWFzdGVyL3plbmJ1cm4tdGhlbWUuZWwKICoKICogIEFsc28gdXNpbmcgcGFydHMgb2YgaHR0cHM6Ly9naXRodWIuY29tL3hhdmkvY29kZXJheS1saWdodHRhYmxlLXRoZW1lCiAqICIKICogRnJvbTogaHR0cHM6Ly9naXRodWIuY29tL3dpc2Vub21hZC96ZW5idXJuLWxpZ2h0dGFibGUtdGhlbWUvYmxvYi9tYXN0ZXIvemVuYnVybi5jc3MKICovCgouY20tcy16ZW5idXJuIC5Db2RlTWlycm9yLWd1dHRlcnMgeyBiYWNrZ3JvdW5kOiAjM2YzZjNmICFpbXBvcnRhbnQ7IH0KLmNtLXMtemVuYnVybiAuQ29kZU1pcnJvci1mb2xkZ3V0dGVyLW9wZW4sIC5Db2RlTWlycm9yLWZvbGRndXR0ZXItZm9sZGVkIHsgY29sb3I6ICM5OTk7IH0KLmNtLXMtemVuYnVybiAuQ29kZU1pcnJvci1jdXJzb3IgeyBib3JkZXItbGVmdDogMXB4IHNvbGlkIHdoaXRlOyB9Ci5jbS1zLXplbmJ1cm4geyBiYWNrZ3JvdW5kLWNvbG9yOiAjM2YzZjNmOyBjb2xvcjogI2RjZGNjYzsgfQouY20tcy16ZW5idXJuIHNwYW4uY20tYnVpbHRpbiB7IGNvbG9yOiAjZGNkY2NjOyBmb250LXdlaWdodDogYm9sZDsgfQouY20tcy16ZW5idXJuIHNwYW4uY20tY29tbWVudCB7IGNvbG9yOiAjN2Y5ZjdmOyB9Ci5jbS1zLXplbmJ1cm4gc3Bhbi5jbS1rZXl3b3JkIHsgY29sb3I6ICNmMGRmYWY7IGZvbnQtd2VpZ2h0OiBib2xkOyB9Ci5jbS1zLXplbmJ1cm4gc3Bhbi5jbS1hdG9tIHsgY29sb3I6ICNiZmViYmY7IH0KLmNtLXMtemVuYnVybiBzcGFuLmNtLWRlZiB7IGNvbG9yOiAjZGNkY2NjOyB9Ci5jbS1zLXplbmJ1cm4gc3Bhbi5jbS12YXJpYWJsZSB7IGNvbG9yOiAjZGZhZjhmOyB9Ci5jbS1zLXplbmJ1cm4gc3Bhbi5jbS12YXJpYWJsZS0yIHsgY29sb3I6ICNkY2RjY2M7IH0KLmNtLXMtemVuYnVybiBzcGFuLmNtLXN0cmluZyB7IGNvbG9yOiAjY2M5MzkzOyB9Ci5jbS1zLXplbmJ1cm4gc3Bhbi5jbS1zdHJpbmctMiB7IGNvbG9yOiAjY2M5MzkzOyB9Ci5jbS1zLXplbmJ1cm4gc3Bhbi5jbS1udW1iZXIgeyBjb2xvcjogI2RjZGNjYzsgfQouY20tcy16ZW5idXJuIHNwYW4uY20tdGFnIHsgY29sb3I6ICM5M2UwZTM7IH0KLmNtLXMtemVuYnVybiBzcGFuLmNtLXByb3BlcnR5IHsgY29sb3I6ICNkZmFmOGY7IH0KLmNtLXMtemVuYnVybiBzcGFuLmNtLWF0dHJpYnV0ZSB7IGNvbG9yOiAjZGZhZjhmOyB9Ci5jbS1zLXplbmJ1cm4gc3Bhbi5jbS1xdWFsaWZpZXIgeyBjb2xvcjogIzdjYjhiYjsgfQouY20tcy16ZW5idXJuIHNwYW4uY20tbWV0YSB7IGNvbG9yOiAjZjBkZmFmOyB9Ci5jbS1zLXplbmJ1cm4gc3Bhbi5jbS1oZWFkZXIgeyBjb2xvcjogI2YwZWZkMDsgfQouY20tcy16ZW5idXJuIHNwYW4uY20tb3BlcmF0b3IgeyBjb2xvcjogI2YwZWZkMDsgfQouY20tcy16ZW5idXJuIHNwYW4uQ29kZU1pcnJvci1tYXRjaGluZ2JyYWNrZXQgeyBib3gtc2l6aW5nOiBib3JkZXItYm94OyBiYWNrZ3JvdW5kOiB0cmFuc3BhcmVudDsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkOyB9Ci5jbS1zLXplbmJ1cm4gc3Bhbi5Db2RlTWlycm9yLW5vbm1hdGNoaW5nYnJhY2tldCB7IGJvcmRlci1ib3R0b206IDFweCBzb2xpZDsgYmFja2dyb3VuZDogbm9uZTsgfQouY20tcy16ZW5idXJuIC5Db2RlTWlycm9yLWFjdGl2ZWxpbmUgeyBiYWNrZ3JvdW5kOiAjMDAwMDAwOyB9Ci5jbS1zLXplbmJ1cm4gLkNvZGVNaXJyb3ItYWN0aXZlbGluZS1iYWNrZ3JvdW5kIHsgYmFja2dyb3VuZDogIzAwMDAwMDsgfQouY20tcy16ZW5idXJuIGRpdi5Db2RlTWlycm9yLXNlbGVjdGVkIHsgYmFja2dyb3VuZDogIzU0NTQ1NDsgfQouY20tcy16ZW5idXJuIC5Db2RlTWlycm9yLWZvY3VzZWQgZGl2LkNvZGVNaXJyb3Itc2VsZWN0ZWQgeyBiYWNrZ3JvdW5kOiAjNGY0ZjRmOyB9Cg==]]></data>
	</file>
	<file>
	  <filename>/CodeMirror.module.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKI0NNUyAtIENNUyBNYWRlIFNpbXBsZQojKGMpMjAwNS0wNiBieSBNb3J0ZW4gUG91bHNlbiAobW9ydGVuQHBvdWxzZW4ub3JnKQojVGhpcyBwcm9qZWN0J3MgaG9tZXBhZ2UgaXM6IGh0dHA6Ly93d3cuY21zbWFkZXNpbXBsZS5vcmcKIwojVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKI2l0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CiN0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgojKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KIwojVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiNidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgojTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQojR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KI1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiNhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQojRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQQoKCmNsYXNzIENvZGVNaXJyb3IgZXh0ZW5kcyBDTVNNb2R1bGUgewoJdmFyICRub2VkaXRvcnM9MDsKCXZhciAkaGVhZGVyaW5mb3NlbnQ9ZmFsc2U7CiAgdmFyICRfaHRtbGFjdGl2ZSA9IGZhbHNlOwogIHZhciAkX2phdmFzY3JpcHRhY3RpdmUgPSBmYWxzZTsKICB2YXIgJF9jc3NhY3RpdmUgPSBmYWxzZTsKICB2YXIgJF9waHBhY3RpdmUgPSBmYWxzZTsKICB2YXIgJF9kZWZhdWx0Y3NzYWRkaXRpb25zID0gIi5Db2RlTWlycm9yIHtsaW5lLWhlaWdodDogMS4zZW07IGZvbnQtc2l6ZToxMXB4fSI7CiAgdmFyICRfY21kaXI9ImNvZGVtaXJyb3ItNS4yMC4yIjsKCgoJZnVuY3Rpb24gR2V0TmFtZSgpIHsKCQlyZXR1cm4gJ0NvZGVNaXJyb3InOwoJfQoKCWZ1bmN0aW9uIElzUGx1Z2luTW9kdWxlKCkgewoJCXJldHVybiBmYWxzZTsKCX0KCglmdW5jdGlvbiBIYXNBZG1pbigpIHsKCQlyZXR1cm4gdHJ1ZTsKCX0KCglmdW5jdGlvbiBHZXRIZWxwKCkgewoJCXJldHVybiAkdGhpcy0+TGFuZygiaGVscCIpOwoJfQoKCWZ1bmN0aW9uIEdldEF1dGhvcigpIHsKCQlyZXR1cm4gJ01vcnRlbiBQb3Vsc2VuJzsKCX0KCglmdW5jdGlvbiBHZXRBdXRob3JFbWFpbCgpIHsKCQlyZXR1cm4gJyZsdDttb3J0ZW5AcG91bHNlbi5vcmcmZ3Q7JzsKCX0KCglmdW5jdGlvbiBHZXRDaGFuZ2VMb2coKSB7CgkJcmV0dXJuICR0aGlzLT5Qcm9jZXNzVGVtcGxhdGUoJ2NoYW5nZWxvZy50cGwnKTsKCX0KCglmdW5jdGlvbiBHZXRWZXJzaW9uKCkgewoJCXJldHVybiAnNS4wLjEnOwoJfQoJCglmdW5jdGlvbiBNaW5pbXVtQ01TVmVyc2lvbigpIHsKCQlyZXR1cm4gIjIuMCI7Cgl9CgogIGZ1bmN0aW9uIEluaXRpYWxpemVBZG1pbigpIHsKICAgJHRoaXMtPnN5bnRheGFjdGl2ZT10cnVlOwogIH0KCiAgLypmdW5jdGlvbiBIYXNDYXBhYmlsaXR5KCRjYXBhYmlsaXR5LCAkcGFyYW1zPWFycmF5KCkpIHsKICAgIGlmICgkY2FwYWJpbGl0eT09Ind5c2l3eWciKSByZXR1cm4gdHJ1ZTsKICAgIGlmICgkY2FwYWJpbGl0eT09InN5bnRheGhpZ2hsaWdodGluZyIpIHJldHVybiB0cnVlOwogICAgcmV0dXJuIGZhbHNlOwogIH0qLwoKICBwdWJsaWMgZnVuY3Rpb24gSGFzQ2FwYWJpbGl0eSgkY2FwYWJpbGl0eSwgJHBhcmFtcyA9IGFycmF5KCkpCiAgewogICAgaWYoICRjYXBhYmlsaXR5ID09IENtc0NvcmVDYXBhYmlsaXRpZXM6OlNZTlRBWF9NT0RVTEUgKSByZXR1cm4gVFJVRTsKICAgIHJldHVybiBGQUxTRTsKICB9CgoJLypmdW5jdGlvbiBJc1dZU0lXWUcoKSB7CgkJcmV0dXJuIHRydWU7Cgl9CgoJZnVuY3Rpb24gSXNTeW50YXhIaWdobGlnaHRlcigpIHsKCQlyZXR1cm4gdHJ1ZTsKCX0qLwoKCWZ1bmN0aW9uIFZpc2libGVUb0FkbWluVXNlcigpIHsKCQlyZXR1cm4gJHRoaXMtPkNoZWNrUGVybWlzc2lvbignTW9kaWZ5IFNpdGUgUHJlZmVyZW5jZXMnKTsKCX0KCgkvKmZ1bmN0aW9uIFN5bnRheFBhZ2VGb3JtU3VibWl0KCkgewoJCXJldHVybiAiZm9yICh2YXIgY250RWRpdG9yID0gMDsgY250RWRpdG9yIDwgbnVtQ29kZU1pcnJvckFyZWFzOyBjbnRFZGl0b3IrKykge1xuIgoJCS4iXHRcdHZhciBlZGl0b3IgPSBldmFsKCdjb2RlbWlycm9yZWRpdG9yJyArIGNudEVkaXRvcik7XG4iCiAgICAuIlx0XHRlZGl0b3Iuc2F2ZSgpIgoKCQkuIlx0fVxuIjsKCX0qLwoJCgkvKmZ1bmN0aW9uIFdZU0lXWUdQYWdlRm9ybVN1Ym1pdCgpIHsKCQlyZXR1cm4gJHRoaXMtPlN5bnRheFBhZ2VGb3JtU3VibWl0KCk7Cgl9CgoJZnVuY3Rpb24gV1lTSVdZR1RleHRBcmVhKCRuYW1lPSd0ZXh0YXJlYScsJGNvbHVtbnM9JzgwJywkcm93cz0nMTUnLCRlbmNvZGluZz0nJywkY29udGVudD0nJywkc3R5bGVzaGVldD0nJywkYWRkdGV4dD0nJykgewoJCSR0aGlzLT53eXNpd3lnYWN0aXZlPXRydWU7CgkJcmV0dXJuICR0aGlzLT5TeW50YXhUZXh0YXJlYSgkbmFtZSwiaHRtbCIsJGNvbHVtbnMsJHJvd3MsJGVuY29kaW5nLCRjb250ZW50KTsKCX0qLwoKCS8qZnVuY3Rpb24gU3ludGF4VGV4dGFyZWEoJG5hbWU9J3RleHRhcmVhJywkc3ludGF4PSJodG1sIiwkY29sdW1ucz0nODAnLCRyb3dzPScxNScsJGVuY29kaW5nPScnLCRjb250ZW50PScnLCRzdHlsZXNoZWV0PScnLCRhZGR0ZXh0PScnKSB7CgkJJHRoaXMtPnN5bnRheGFjdGl2ZT10cnVlOwkKCQkvKmlmICgkdGhpcy0+R2V0UHJlZmVyZW5jZSgidXNlYXV0b2NvbXBsZXRlIiwiMSIpPT0iMCIpICRjbGFzcy49IiBhdXRvY29tcGxldGUtb2ZmIjsKCQlpZiAoJHRoaXMtPkdldFByZWZlcmVuY2UoInNob3dsaW5lbnVtYmVycyIsIjEiKT09IjAiKSAkY2xhc3MuPSIgbGluZW51bWJlcnMtb2ZmIjsKCQkqLwogICAgICAvKmlmICgkdGhpcy0+R2V0UHJlZmVyZW5jZSgic2hvd3RvZ2dsZXN5bnRheCIsIjEiKT09IjEiKSB7CiAgICAgCgkJCSR0ZXh0YXJlYS49Ijxici8+PGlucHV0IHR5cGU9J2NoZWNrYm94JyBjaGVja2VkPScxJyBvbmNsaWNrPSdjb2RlcHJlc3MiLiR0aGlzLT5ub2VkaXRvcnMuIi50b2dnbGVFZGl0b3IoKTsnIGNoZWNrZWQ9J2NoZWNrZWQnIGlkPSdjb2RlcHJlc3NjaGVjayIuJHRoaXMtPm5vZWRpdG9ycy4iJz48bGFiZWwgZm9yPSdjb2RlcHJlc3NjaGVjayIuJHRoaXMtPm5vZWRpdG9ycy4iJz4iLiR0aGlzLT5MYW5nKCJ0b2dnbGVzeW50YXgiKS4iPC9sYWJlbD4iOwoJCX0qLwogICAgLyokc21hcnR5PSR0aGlzLT5zbWFydHk7CiAgICBpZiAoJHRoaXMtPkdldFByZWZlcmVuY2UoInNob3dsaW5lbnVtYmVycyIsIjEiKT09IjEiKXsKICAgICAgJHNtYXJ0eS0+YXNzaWduKCdsaW5lbnVtYmVycycsICJ0cnVlIik7CiAgICB9IGVsc2UgewogICAgICAkc21hcnR5LT5hc3NpZ24oJ2xpbmVudW1iZXJzJywgImZhbHNlIik7CiAgICB9CiAgICBpZiAoJHRoaXMtPkdldFByZWZlcmVuY2UoInRleHR3cmFwcGluZyIsIjEiKT09IjEiKXsKICAgICAgJHNtYXJ0eS0+YXNzaWduKCd0ZXh0d3JhcHBpbmcnLCAidHJ1ZSIpOwogICAgfSBlbHNlIHsKICAgICAgJHNtYXJ0eS0+YXNzaWduKCd0ZXh0d3JhcHBpbmcnLCAiZmFsc2UiKTsKICAgIH0KICAgIGlmICgkdGhpcy0+R2V0UHJlZmVyZW5jZSgiYXV0b21hdGNocGFyZW5zIiwiMCIpPT0iMSIpewogICAgICAkc21hcnR5LT5hc3NpZ24oJ2F1dG9tYXRjaHBhcmVucycsICJ0cnVlIik7CiAgICB9IGVsc2UgewogICAgICAkc21hcnR5LT5hc3NpZ24oJ2F1dG9tYXRjaHBhcmVucycsICJmYWxzZSIpOwogICAgfQoKICAgICR0aGVtZT0kdGhpcy0+R2V0UHJlZmVyZW5jZSgidGhlbWUiLCJkZWZhdWx0Iik7CiAgICAkc21hcnR5LT5hc3NpZ24oJ3RoZW1lJywgJHRoZW1lKTsKICAgICR0YWJzaXplPSR0aGlzLT5HZXRQcmVmZXJlbmNlKCJ0YWJzaXplIiwiMiIpOwogICAgJHNtYXJ0eS0+YXNzaWduKCd0YWJzaXplJywgJHRhYnNpemUpOwoKICAgICRjb25maWc9Y21zbXMoKS0+R2V0Q29uZmlnKCk7CgogICAgJHNtYXJ0eS0+YXNzaWduKCdudW1pZCcsICR0aGlzLT5ub2VkaXRvcnMpOwogICAgJHNtYXJ0eS0+YXNzaWduKCd0ZXh0YXJlYWlkJywgImNvZGVtaXJyb3JhcmVhIi4kdGhpcy0+bm9lZGl0b3JzKTsKICAgICRzbWFydHktPmFzc2lnbigndGV4dGFyZWFuYW1lJywgJG5hbWUpOwogICAgJHNtYXJ0eS0+YXNzaWduKCdjb250ZW50JywgJGNvbnRlbnQpOwoKICAgICRzbWFydHktPmFzc2lnbigndGFiaGFuZGxpbmcnLCAkdGhpcy0+R2V0UHJlZmVyZW5jZSgidGFiaGFuZGxpbmciLCJpbmRlbnQiKSk7CiAgICAkc21hcnR5LT5hc3NpZ24oJ2FsbG93ZnVsbHNjcmVlbicsICR0aGlzLT5HZXRQcmVmZXJlbmNlKCJhbGxvd2Z1bGxzY3JlZW4iLCIwIikpOwogICAgCiAgICAkc21hcnR5LT5hc3NpZ24oJ3Jvb3RfdXJsJywgJGNvbmZpZ1sicm9vdF91cmwiXSk7CgogICAgc3dpdGNoICgkc3ludGF4KSB7CiAgICAgIGNhc2UgImh0bWwiIDogJHNtYXJ0eS0+YXNzaWduKCdtb2RlJywgInRleHQvaHRtbCIpOyAkdGhpcy0+X2h0bWxhY3RpdmU9dHJ1ZTsgYnJlYWs7CiAgICAgIGNhc2UgImpzIjoKICAgICAgY2FzZSAiamF2YXNjcmlwdCIgOiAkc21hcnR5LT5hc3NpZ24oJ21vZGUnLCAidGV4dC9qYXZhc2NyaXB0Iik7JHRoaXMtPl9qYXZhc2NyaXB0YWN0aXZlPXRydWU7ICBicmVhazsKICAgICAgY2FzZSAiY3NzIiA6ICRzbWFydHktPmFzc2lnbignbW9kZScsICJ0ZXh0L2NzcyIpOyAkdGhpcy0+X2Nzc2FjdGl2ZT10cnVlOyBicmVhazsKICAgICAgLy9jYXNlICJwaHAiIDogJHNtYXJ0eS0+YXNzaWduKCdtb2RlJywgImFwcGxpY2F0aW9uL3gtaHR0cGQtcGhwIik7ICR0aGlzLT5fcGhwYWN0aXZlPXRydWU7IGJyZWFrOwogICAgICBjYXNlICJwaHAiIDogJHNtYXJ0eS0+YXNzaWduKCdtb2RlJywgInRleHQveC1waHAiKTsgJHRoaXMtPl9waHBhY3RpdmU9dHJ1ZTsgYnJlYWs7CiAgICB9CgoKICAgICR0ZXh0YXJlYT0kdGhpcy0+UHJvY2Vzc1RlbXBsYXRlKCdjb2RlbWlycm9yM2FyZWEudHBsJyk7CgoJCSR0aGlzLT5ub2VkaXRvcnMrKzsKCgkJcmV0dXJuICR0ZXh0YXJlYTsKCX0qLwoKCS8qZnVuY3Rpb24gV1lTSVdZR0dlbmVyYXRlSGVhZGVyKCRzZWxlY3RvciA9IG51bGwsJGNzc25hbWUgPSBudWxsKSB7CgkJcmV0dXJuICR0aGlzLT5TeW50YXhHZW5lcmF0ZUhlYWRlcigpOwoJfSovCgoJZnVuY3Rpb24gU3ludGF4R2VuZXJhdGVIZWFkZXIoKSB7CgkvKglpZiAoJHRoaXMtPmhlYWRlcmluZm9zZW50KSByZXR1cm4gIiI7CgkJaWYgKCR0aGlzLT5ub2VkaXRvcnM9PTApIHJldHVybiAnJzsqLwoJCS8vJEdMT0JBTFNbImNvbmZpZyJdWyJyb290X3BhdGgiXS4KICAgICRjb25maWc9Y21zbXMoKS0+R2V0Q29uZmlnKCk7CiAgICAkYWxyZWFkeWluPWFycmF5KCk7CgogICAgJHRoZW1lPSR0aGlzLT5HZXRQcmVmZXJlbmNlKCJ0aGVtZSIsImVsZWdhbnQiKTsKCgoJCSRzY3JpcHRwYXRoPSRjb25maWdbInJvb3RfdXJsIl0uIi9tb2R1bGVzL0NvZGVNaXJyb3IvIi4kdGhpcy0+X2NtZGlyOwogICAgLy9lY2hvICRzY3JpcHRwYXRoOwoKCQkkaGVhZGVyPSIiOwogICAgJGhlYWRlci49JwoJICA8c2NyaXB0IGxhbmd1YWdlPSJKYXZhc2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iJy4kc2NyaXB0cGF0aC4nL2xpYi9jb2RlbWlycm9yLmpzIj48L3NjcmlwdD4nOwoKICAgICRoZWFkZXIuPScKICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IicuJHNjcmlwdHBhdGguJy9saWIvY29kZW1pcnJvci5jc3MiLz4nOwoKICAgICAgJGhlYWRlci49JwogICAgPGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iJy4kc2NyaXB0cGF0aC4nL3RoZW1lLycuJHRoZW1lLicuY3NzIi8+JzsKCgogICAgICAvKiRoZWFkZXIuPScKICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IicuJHNjcmlwdHBhdGguJy90aGVtZS9kZWZhdWx0LmNzcyIvPic7Ki8KCiAgIC8vIGlmICgkdGhpcy0+X2h0bWxhY3RpdmUpIHsKCiAgICAgICRoZWFkZXIuPScKICAgICAgPHNjcmlwdCBsYW5ndWFnZT0iSmF2YXNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IicuJHNjcmlwdHBhdGguJy9tb2RlL2Nzcy9jc3MuanMiPjwvc2NyaXB0Pic7CiAgICAgICRhbHJlYWR5aW5bXT0iY3NzLmpzIjsKICAgICAgJGhlYWRlci49JwogICAgICA8c2NyaXB0IGxhbmd1YWdlPSJKYXZhc2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iJy4kc2NyaXB0cGF0aC4nL21vZGUvamF2YXNjcmlwdC9qYXZhc2NyaXB0LmpzIj48L3NjcmlwdD4nOwogICAgICAkYWxyZWFkeWluW109ImphdmFzY3JpcHQuanMiOwogICAgICAkaGVhZGVyLj0nCiAgICAgIDxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFzY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSInLiRzY3JpcHRwYXRoLicvbW9kZS94bWwveG1sLmpzIj48L3NjcmlwdD4nOwogICAgICAkYWxyZWFkeWluW109InhtbC5qcyI7CiAgICAgICRoZWFkZXIuPScKICAgICAgPHNjcmlwdCBsYW5ndWFnZT0iSmF2YXNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IicuJHNjcmlwdHBhdGguJy9tb2RlL2h0bWxtaXhlZC9odG1sbWl4ZWQuanMiPjwvc2NyaXB0Pic7CiAgICAgICRhbHJlYWR5aW5bXT0iaHRtbG1peGVkLmpzIjsKICAgLy8gfQogICAvLyBpZiAoJHRoaXMtPl9qYXZhc2NyaXB0YWN0aXZlKSB7CiAgICAgIGlmICghaW5fYXJyYXkoImphdmFzY3JpcHQuanMiLCRhbHJlYWR5aW4pKSB7CiAgICAgICAgJGhlYWRlci49JwogICAgICA8c2NyaXB0IGxhbmd1YWdlPSJKYXZhc2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iJy4kc2NyaXB0cGF0aC4nL21vZGUvamF2YXNjcmlwdC9qYXZhc2NyaXB0LmpzIj48L3NjcmlwdD4nOwogICAgICAgICRhbHJlYWR5aW5bXT0iamF2YXNjcmlwdC5qcyI7CiAgICAgIH0KICAgICAgICAgICAgCgogICAvLyB9CiAgICAvL2lmICgkdGhpcy0+X2Nzc2FjdGl2ZSkgewogICAgICBpZiAoIWluX2FycmF5KCJjc3MuanMiLCRhbHJlYWR5aW4pKSB7CiAgICAgICAgJGhlYWRlci49JwogICAgICA8c2NyaXB0IGxhbmd1YWdlPSJKYXZhc2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iJy4kc2NyaXB0cGF0aC4nL21vZGUvY3NzL2Nzcy5qcyI+PC9zY3JpcHQ+JzsKICAgICAgICAkYWxyZWFkeWluW109ImNzcy5qcyI7CiAgICAgICAgJGhlYWRlci49JwogICAgICA8c2NyaXB0IGxhbmd1YWdlPSJKYXZhc2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iJy4kc2NyaXB0cGF0aC4nL21vZGUvc2Fzcy9zYXNzLmpzIj48L3NjcmlwdD4nOwogICAgICAgICRhbHJlYWR5aW5bXT0iY3NzLmpzIjsKICAgICAgICAkaGVhZGVyLj0nCiAgICAgIDxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFzY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSInLiRzY3JpcHRwYXRoLicvbW9kZS9sZXNzL2xlc3MuanMiPjwvc2NyaXB0Pic7CiAgICAgICAgJGFscmVhZHlpbltdPSJjc3MuanMiOwogICAgICB9CgogICAvLyB9CiAgICAvL2lmICgkdGhpcy0+X3BocGFjdGl2ZSkgewogICAgICAvKmlmICghaW5fYXJyYXkoImNzcy5qcyIsJGFscmVhZHlpbikpIHsKICAgICAgICAkaGVhZGVyLj0nCiAgICAgICAgPHNjcmlwdCBsYW5ndWFnZT0iSmF2YXNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IicuJHNjcmlwdHBhdGguJy9tb2RlL2Nzcy9jc3MuanMiPjwvc2NyaXB0Pic7CiAgICAgICAgJGFscmVhZHlpbltdPSJjc3MuanMiOwogICAgICB9CiAgICAgIGlmICghaW5fYXJyYXkoImphdmFzY3JpcHQuanMiLCRhbHJlYWR5aW4pKSB7CiAgICAgICAgJGhlYWRlci49JwogICAgICAgIDxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFzY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSInLiRzY3JpcHRwYXRoLicvbW9kZS9qYXZhc2NyaXB0L2phdmFzY3JpcHQuanMiPjwvc2NyaXB0Pic7CiAgICAgICAgJGFscmVhZHlpbltdPSJqYXZhc2NyaXB0LmpzIjsKICAgICAgfQogICAgICBpZiAoIWluX2FycmF5KCJ4bWwuanMiLCRhbHJlYWR5aW4pKSB7CiAgICAgICAgJGhlYWRlci49JwogICAgICAgIDxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFzY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCIgc3JjPSInLiRzY3JpcHRwYXRoLicvbW9kZS94bWwveG1sLmpzIj48L3NjcmlwdD4nOwogICAgICAgICRhbHJlYWR5aW5bXT0ieG1sLmpzIjsKICAgICAgfSovCiAgICAgIGlmICghaW5fYXJyYXkoImNsaWtlLmpzIiwkYWxyZWFkeWluKSkgewogICAgICAgICRoZWFkZXIuPScKICAgICAgICA8c2NyaXB0IGxhbmd1YWdlPSJKYXZhc2NyaXB0IiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiIHNyYz0iJy4kc2NyaXB0cGF0aC4nL21vZGUvY2xpa2UvY2xpa2UuanMiPjwvc2NyaXB0Pic7CiAgICAgICAgJGFscmVhZHlpbltdPSJjbGlrZS5qcyI7CiAgICAgIH0KICAgICAgLyppZiAoIWluX2FycmF5KCJjbGlrZS5jc3MiLCRhbHJlYWR5aW4pKSB7CiAgICAgICAgJGhlYWRlci49JwogICAgICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IicuJHNjcmlwdHBhdGguJy9tb2RlL2NsaWtlL2NsaWtlLmNzcyIgLz4nOwogICAgICAgICRhbHJlYWR5aW5bXT0iY2xpa2UuY3NzIjsKICAgICAgfSovCiAgICAgIGlmICghaW5fYXJyYXkoInBocC5qcyIsJGFscmVhZHlpbikpIHsKICAgICAgICAkaGVhZGVyLj0nCiAgICAgICAgPHNjcmlwdCBsYW5ndWFnZT0iSmF2YXNjcmlwdCIgdHlwZT0idGV4dC9qYXZhc2NyaXB0IiBzcmM9IicuJHNjcmlwdHBhdGguJy9tb2RlL3BocC9waHAuanMiPjwvc2NyaXB0Pic7CiAgICAgICAgJGFscmVhZHlpbltdPSJwaHAuanMiOwogICAgICB9CiAgICAvL30KICAgIC8qaWYgKCR0aGVtZSE9ImRlZmF1bHQiKSB7CiAgICAgICRoZWFkZXIuPScKICAgIDxsaW5rIHJlbD0ic3R5bGVzaGVldCIgdHlwZT0idGV4dC9jc3MiIGhyZWY9IicuJHNjcmlwdHBhdGguJy90aGVtZS9kZWZhdWx0LmNzcyIvPic7CiAgICB9Ki8KCi8qICAgICRoZWFkZXIuPScKCjxzY3JpcHQgbGFuZ3VhZ2U9IkphdmFzY3JpcHQiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+CiAgdmFyIG51bUNvZGVNaXJyb3JBcmVhcz0nLiR0aGlzLT5ub2VkaXRvcnMuJzsKPC9zY3JpcHQ+CgonOyovCiAgICAkd3JhcHBpbmc9JHRoaXMtPkdldFByZWZlcmVuY2UoInRleHR3cmFwcGluZyIpOwogICAgJHRhYnNpemU9JHRoaXMtPkdldFByZWZlcmVuY2UoInRhYnNpemUiLDIpOwogICAgJGNzcz0kdGhpcy0+R2V0UHJlZmVyZW5jZSgiY3NzcmVwbGFjZSIpOwogICAgLy9pZiAoKQogICAgaWYgKCR3cmFwcGluZz09IjEiKSAkd3JhcHBpbmc9InRydWUiOyBlbHNlICR3cmFwcGluZz0iZmFsc2UiOwokaGVhZGVyLj0iCjxzY3JpcHQgdHlwZT1cInRleHQvamF2YXNjcmlwdFwiPgovL3ZhciBteUNvZGVNaXJyb3IgPSBDb2RlTWlycm9yKGRvY3VtZW50LmJvZHkpOwoJCQkkKHdpbmRvdykubG9hZChmdW5jdGlvbigpewoJCQkgICAkKCd0ZXh0YXJlYS5Db2RlTWlycm9yJykuZWFjaChmdW5jdGlvbigpewoJCQkgICB2YXIgY3VycmVudE1vZGUgPSB0aGlzLmRhdGFzZXQuY21zTGFuZzsKCQkJICAgaWYgKGN1cnJlbnRNb2RlPT0naHRtbCcpIHsKCQkJICAgICBjdXJyZW50TW9kZT0naHRtbG1peGVkJzsJCQkgICAgIAoJCQkgICB9CgkJCSAgIGlmIChjdXJyZW50TW9kZT09J2NzcycpIHsKCQkJICAgICBjdXJyZW50TW9kZT0nIi4kY3NzLiInOwkJCSAgICAgCgkJCSAgIH0KCQkJICAgLy9hbGVydChjdXJyZW50TW9kZSk7CgkJCSAgIHZhciBteUNvZGVNaXJyb3IgPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYSh0aGlzLHsKCQkJICAgICAKCQkJICAgICAgbW9kZTogIGN1cnJlbnRNb2RlLAoJCQkgICAgICBsaW5lTnVtYmVyczogdHJ1ZSwKCQkJICAgICAgdGhlbWU6ICciLiR0aGVtZS4iJywKCQkJICAgICAgbGluZVdyYXBwaW5nOiAiLiR3cmFwcGluZy4iLAoJCQkgICAgICB0YWJTaXplOiAiLiR0YWJzaXplLiIsCgkJCSAgICAgCgkJCSAgIH0KCQkJICAgKTsKCQkJICAgZnVuY3Rpb24gdXBkYXRlVGV4dEFyZWEoKSB7CiAgICAgICAgICAgICAgbXlDb2RlTWlycm9yLnNhdmUoKTsKICAgICAgICAgICAgICAKICAgICAgICAgICB9Cm15Q29kZU1pcnJvci5vbignY2hhbmdlJywgdXBkYXRlVGV4dEFyZWEpOwoJCQkJCQoJCQkJfSk7CgkJCQkvL2FjZVJlc2l6ZSgpOwoJCQl9KTsKCQkJPC9zY3JpcHQ+CiI7CgogICAvKiAkaGVhZGVyLj0nCjxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+CiAgJy4kdGhpcy0+R2V0UHJlZmVyZW5jZSgiY3NzYWRkaXRpb25zIiwkdGhpcy0+X2RlZmF1bHRjc3NhZGRpdGlvbnMpLicKPC9zdHlsZT4KICAgICc7Ki8KCgoKCgkJJHRoaXMtPmhlYWRlcmluZm9zZW50PXRydWU7CgkJcmV0dXJuICRoZWFkZXI7Cgl9Cn0KCj8+]]></data>
	</file>
	<file>
	  <filename>/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCEtLSBEVU1NWSBIVE1MIEZJTEUgLS0+]]></data>
	</file>
	<file>
	  <filename>/lang/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lang/en_US.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbImZyaWVuZGx5bmFtZSJdPSJDb2RlTWlycm9yIHN5bnRheGhpZ2hsaWdodGluZyBlZGl0b3IiOwoKJGxhbmdbInBvc3RpbnN0YWxsIl09IlRoZSBDb2RlTWlycm9yIG1vZHVsZSB3YXMgc3VjZXNzZnVsbHkgaW5zdGFsbGVkIjsKJGxhbmdbIm5lZWRwZXJtaXNzaW9uIl09IidZb3UgbmVlZCB0aGUgJyVzJyBwZXJtaXNzaW9uIHRvIHBlcmZvcm0gdGhhdCBmdW5jdGlvbi4iOwoKJGxhbmdbInNldHRpbmdzdGFiIl09IlNldHRpbmdzIjsKJGxhbmdbInNhdmVzZXR0aW5ncyJdPSJTYXZlIHNldHRpbmdzIjsKJGxhbmdbInNldHRpbmdzc2F2ZWQiXT0iU2V0dGluZ3Mgc2F2ZWQiOwoKJGxhbmdbImh0bWx0ZXN0Il09IkhUTUwgc3ludGF4IHRlc3QiOwokbGFuZ1siY3NzdGVzdCJdPSJDU1Mgc3ludGF4IHRlc3QiOwokbGFuZ1sicGhwdGVzdCJdPSJQSFAgc3ludGF4IHRlc3QiOwokbGFuZ1sianN0ZXN0Il09IkphdmFTY3JpcHQgc3ludGF4IHRlc3QiOwovLyRsYW5nWyJleGFtcGxlc3ludGF4Il09IlN5bnRheCB0byB0ZXN0IHdpdGgiOwovLyRsYW5nWyJjaGFuZ2UiXT0iQ2hhbmdlLi4uIjsKCiRsYW5nWyJzaG93bGluZW51bWJlcnMiXT0iU2hvdyBsaW5lbnVtYmVycyI7CiRsYW5nWyJhbGxvd2Z1bGxzY3JlZW4iXT0iQWxsb3cgZnVsbHNjcmVlbiBtb2RlIChGMTEpIjsKCiRsYW5nWyJ0ZXh0d3JhcHBpbmciXT0iV3JhcCBsb25nIGxpbmVzIjsKJGxhbmdbImF1dG9tYXRjaHBhcmVucyJdPSJBdXRvbWF0Y2ggcGFyZW50aGVzaXMiOwokbGFuZ1sidGFiaGFuZGxpbmciXT0iSG93IHRvIGhhbmRsZSBwcmVzc2luZyB0aGUgVEFCIGtleSI7CiRsYW5nWyJ0YWJkZWZhdWx0Il09IkxldCB0aGUgYnJvd3NlciBkZWNpZGUiOwokbGFuZ1sidGFiaW5kZW50Il09IkRvIGluZGVudGF0aW9uIjsKJGxhbmdbInRhYnNwYWNlcyJdPSJJbnNlcnQgc3BhY2VzIjsKJGxhbmdbInRhYnNoaWZ0Il09IlNoaWZ0IHRvIHRoZSByaWdodCwgc2hpZnQtVEFCIHNoaWZ0cyB0byBsZWZ0IjsKJGxhbmdbInRhYnNpemUiXT0iU2l6ZSBvZiB0YWJzIjsKCiRsYW5nWyJjc3NhZGRpdGlvbnMiXT0iQWRkaXRpb25zIHRvIHRoZSBDb2RlTWlycm9yLWNzcy4iOwoKJGxhbmdbInRoZW1lIl09IlRoZW1lIjsKCiRsYW5nWyJkb250cmVwbGFjZWNzcyJdPSJEb24ndCByZXBsYWNlIjsKJGxhbmdbImNzc3JlcGxhY2UiXT0iUmVwbGFjZSBDU1MgZWRpdGluZyB3aXRoIjsKCiRsYW5nWyJoZWxwIl09IjxzdHJvbmc+V2hhdCBkb2VzIHRoaXMgbW9kdWxlIGRvPzwvc3Ryb25nPgo8YnIvPgpUaGUgQ29kZU1pcnJvciBtb2R1bGUgYWxsb3dzIHlvdSB0byBlZGl0IGNvbnRlbnQsIHRlbXBsYXRlcyBhbmQgc3R5bGVzaGVldHMgdXNpbmcgYSBzeW50YXhoaWdobGlnaHRpbmcgZWRpdG9yIGluc2lkZSB5b3VyIGJyb3dzZXIuCkl0IGNhbiBib3RoIHJlcGxhY2UgYSB3eXNpd3lnLW1vZHVsZSwgYW5kIGFjdCBzdGFuZGFsb25lIGZvciB0ZW1wbGF0ZS9zdHlsZXNoZWV0IGVkaXRpbmcgKG9ubHkgc3VwcG9ydGVkIGluIENNU21zIDEuMSspCjxici8+PGJyLz4KPHN0cm9uZz5Ib3cgZG8gSSB1c2UgdGhpcyBtb2R1bGU/PC9zdHJvbmc+CllvdSBzaW1wbHkgaW5zdGFsbCBpdCwgYW5kIGNob29zZSBpdCBpbiB5b3VyIGFkbWluIHVzZXIgcHJlZmVyZW5jZXMuIE5vdGUsIHRoYXQgaWYgeW91IHVzZSBDTVNtcyAxLjEgb3IgYWJvdmUgeW91IGNhbgpzZWxlY3QgQ29kZU1pcnJvciBib3RoIGFzIGEgV1lTSVdZRyBhbmQgYXMgYSBzeW50YXggaGlnaGxpZ2h0aW5nIGVkaXRvci4iOwo/Pgo=]]></data>
	</file>
	<file>
	  <filename>/lang/ext/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/lang/ext/da_DK.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0NvZGVNaXJyb3IgLSBlbiBzeW50YWtzLWZyZW1oJmFlbGlnO3ZlbmRlIGVkaXRvcic7CiRsYW5nWydwb3N0aW5zdGFsbCddID0gJ0NvZGVNaXJyb3IgbW9kdWxldCBibGV2IGtvcnJla3QgaW5zdGFsbGVyZXQnOwokbGFuZ1snbmVlZHBlcm1pc3Npb24nXSA9ICcmIzAzOTtZb3UgbmVlZCB0aGUgJiMwMzk7JXMmIzAzOTsgcGVybWlzc2lvbiB0byBwZXJmb3JtIHRoYXQgZnVuY3Rpb24uJzsKJGxhbmdbJ3NldHRpbmdzdGFiJ10gPSAnSW5kc3RpbGxpbmdlcic7CiRsYW5nWydzYXZlc2V0dGluZ3MnXSA9ICdHZW0gaW5kc3RpbGxpbmdlcic7CiRsYW5nWydzZXR0aW5nc3NhdmVkJ10gPSAnSW5kc3RpbGxpbmdlcm5lIGJsZXYgZ2VtdCc7CiRsYW5nWydodG1sdGVzdCddID0gJ0hUTUwgc3ludGFrcyB0ZXN0JzsKJGxhbmdbJ2Nzc3Rlc3QnXSA9ICdDU1Mgc3ludGFrcyB0ZXN0JzsKJGxhbmdbJ3BocHRlc3QnXSA9ICdQSFAgc3ludGFrcyB0ZXN0JzsKJGxhbmdbJ2pzdGVzdCddID0gJ0phdmFTY3JpcHQgc3ludGFrcyB0ZXN0JzsKJGxhbmdbJ2V4YW1wbGVzeW50YXgnXSA9ICdTeW50YWtzIGRlciBza2FsIHRlc3RlcyBtZWQnOwokbGFuZ1snY2hhbmdlJ10gPSAnU2tpZnQuLi4nOwokbGFuZ1snc2hvd2xpbmVudW1iZXJzJ10gPSAnVmlzIGxpbmllbnVtcmUnOwokbGFuZ1sndGV4dHdyYXBwaW5nJ10gPSAnT21icnlkIGxhbmdlIGxpbmllcic7CiRsYW5nWydhdXRvbWF0Y2hwYXJlbnMnXSA9ICdWaXMgbWF0Y2hlbmRlIHBhcmVudGVzZXInOwokbGFuZ1sndGFiaGFuZGxpbmcnXSA9ICdIb3cgdG8gaGFuZGxlIHByZXNzaW5nIHRoZSBUQUIga2V5JzsKJGxhbmdbJ3RhYmRlZmF1bHQnXSA9ICdMZXQgdGhlIGJyb3dzZXIgZGVjaWRlJzsKJGxhbmdbJ3RhYmluZGVudCddID0gJ0RvIGluZGVudGF0aW9uJzsKJGxhbmdbJ3RhYnNwYWNlcyddID0gJ0luc2VydCBzcGFjZXMnOwokbGFuZ1sndGFic2hpZnQnXSA9ICdTaGlmdCB0byB0aGUgcmlnaHQsIHNoaWZ0LVRBQiBzaGlmdHMgdG8gbGVmdCc7CiRsYW5nWydjc3NhZGRpdGlvbnMnXSA9ICdUaWxmJm9zbGFzaDtqZWxzZXIgdGlsIENvZGVNaXJyb3ItY3NzLic7CiRsYW5nWydoZWxwJ10gPSAnPHN0cm9uZz5IdmFkIGcmb3NsYXNoO3IgZGV0dGUgbW9kdWw/PC9zdHJvbmc+DQo8YnIvPg0KQ29kZU1pcnJvci1tb2R1bGVzIGdpdmVyIGRpZyBtdWxpZ2hlZCBmb3IgYXQgcmVkaWdlcmUgaW5kaG9sZCwgc2thYmVsb25lciBvZyBzdHlsZXNoZWV0cyB2ZWQgaGomYWVsaWc7bHAgYWYgc3ludGFrcy1mcmVtaCZhZWxpZzt2ZW5kZSByZWRpZ2VyaW5nIGkgZGluIGJyb3dzZXIuDQo8YnIvPjxici8+DQo8c3Ryb25nPkh2b3JkYW4gYnJ1Z2VyIGplZyBkZXR0ZSBtb2R1bD88L3N0cm9uZz4NCkR1IGluc3RhbGxlcmVyIGRldCBvZyB2JmFlbGlnO2xnZXIgZGV0IGkgZGluZSBicnVnZXIgaW5kc3RpbGxpbmdlciBmb3IgYWRtaW5zaXRyYXRpb25lbi4gQmVtJmFlbGlnO3JrIGF0IGR1IGthbiB2JmFlbGlnO2xnZSBhdCBiZW55dHRlIGRldCBiJmFyaW5nO2RlIHNvbSBzeW50YWtzIGZyZW1oJmFlbGlnO3ZlciBvZyBXWVNJV1lHLic7CiRsYW5nWydxY2EnXSA9ICcxMjI5NjAxNzkwLTg1MjQzMTk3LTQzMjYwNzEzJzsKJGxhbmdbJ3V0bWEnXSA9ICcxNTY4NjEzNTMuMzg5Njg0Mzk0LjEzMDExNDIxNDAuMTMwMTI1NDY5Ny4xMzAxNDM1MjU2LjMnOwokbGFuZ1sndXRteiddID0gJzE1Njg2MTM1My4xMzAxMTQyMTQwLjEuMS51dG1jc3I9KGRpcmVjdCl8dXRtY2NuPShkaXJlY3QpfHV0bWNtZD0obm9uZSknOwokbGFuZ1sndXRtYiddID0gJzE1Njg2MTM1Myc7CiRsYW5nWyd1dG1jJ10gPSAnMTU2ODYxMzUzJzsKPz4=]]></data>
	</file>
	<file>
	  <filename>/lang/ext/de_DE.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0NvZGVNaXJyb3IgLSBFZGl0b3IgbWl0IFN5bnRheGhlcnZvcmhlYnVuZyc7CiRsYW5nWydwb3N0aW5zdGFsbCddID0gJ0RhcyBDb2RlTWlycm9yLU1vZHVsIHd1cmRlIGluc3RhbGxpZXJ0Lic7CiRsYW5nWyduZWVkcGVybWlzc2lvbiddID0gJ1NpZSBiZW4mb3VtbDt0aWdlbiBkaWUgJiMwMzk7JXMmIzAzOTstQmVyZWNodGlndW5nLCB1bSBkaWVzZSBGdW5rdGlvbiBhdXN6dWYmdXVtbDtocmVuLic7CiRsYW5nWydzZXR0aW5nc3RhYiddID0gJ0VpbnN0ZWxsdW5nZW4nOwokbGFuZ1snc2F2ZXNldHRpbmdzJ10gPSAnRWluc3RlbGx1bmdlbiBzcGVpY2hlcm4nOwokbGFuZ1snc2V0dGluZ3NzYXZlZCddID0gJ0VpbnN0ZWxsdW5nZW4gZ2VzcGVpY2hlcnQnOwokbGFuZ1snaHRtbHRlc3QnXSA9ICdIVE1MLVN5bnRheC1UZXN0JzsKJGxhbmdbJ2Nzc3Rlc3QnXSA9ICdDU1MtU3ludGF4LVRlc3QnOwokbGFuZ1sncGhwdGVzdCddID0gJ1BIUC1TeW50YXgtVGVzdCc7CiRsYW5nWydqc3Rlc3QnXSA9ICdKYXZhU2NyaXB0LVN5bnRheC1UZXN0JzsKJGxhbmdbJ3Nob3dsaW5lbnVtYmVycyddID0gJ1plaWxlbm51bW1lcm4gYW56ZWlnZW4nOwokbGFuZ1snYWxsb3dmdWxsc2NyZWVuJ10gPSAnVm9sbGJpbGRtb2R1cyBlcmxhdWJlbiAoRjExKSc7CiRsYW5nWydhdXRvbWF0Y2hwYXJlbnMnXSA9ICdBdXRvbWF0aXNjaGUgS2xhbW1lci1Fcmtlbm51bmcnOwokbGFuZ1sndGFiaGFuZGxpbmcnXSA9ICdXYXMgc29sbCBiZWltIERyJnV1bWw7Y2tlbiBkZXIgVEFCLVRhc3RlIHBhc3NpZXJlbic7CiRsYW5nWyd0YWJkZWZhdWx0J10gPSAnQnJvd3NlciBlbnRzY2hlaWRlbiBsYXNzZW4nOwokbGFuZ1sndGFiaW5kZW50J10gPSAnRWluciZ1dW1sO2NrZW4nOwokbGFuZ1sndGFic3BhY2VzJ10gPSAnTGVlcnplaWNoZW4gZWluZiZ1dW1sO2dlbic7CiRsYW5nWyd0YWJzaGlmdCddID0gJ1NoaWZ0IG5hY2ggcmVjaHRzLCBTaGlmdC1UQUIgdmVyc2NoaWVidCBzaWNoIG5hY2ggbGlua3MnOwokbGFuZ1sndGFic2l6ZSddID0gJ0dyJm91bWw7JnN6bGlnO2UgZGVyIFJlZ2lzdGVya2FydGVuJzsKJGxhbmdbJ2Nzc2FkZGl0aW9ucyddID0gJ1p1cyZhdW1sO3R6ZSB6dXIgQ29kZU1pcnJvci1DU1MuJzsKJGxhbmdbJ3RoZW1lJ10gPSAnVGhlbWUgJzsKJGxhbmdbJ2hlbHAnXSA9ICc8aDM+V2FzIG1hY2h0IGRpZXNlcyBNb2R1bD88L2gzPg0KPHA+RGFzIENvZGVNaXJyb3ItTW9kdWwgaXN0IGVpbiBFZGl0b3IgbWl0IFN5bnRheGhlcnZvcmhlYnVuZywgbWl0IGRlbSBTaWUgZGllIEluaGFsdGUsIGRpZSBUZW1wbGF0ZXMgdW5kIGRpZSBTdHlsZXNoZWV0cyBiZWFyYmVpdGVuIGsmb3VtbDtubmVuLiBEYXMgTW9kdWwga2FubiBzb3dvaGwgZGllIFdZU0lXWUctRWRpdG9yZW4gZXJzZXR6ZW4gYWxzIGF1Y2ggc2VwYXJhdCB6dW0gQmVhcmJlaXRlbiB2b24gVGVtcGxhdGVzIHVuZCBTdHlsZXNoZWV0cyB2ZXJ3ZW5kZXQgd2VyZGVuICh1bnRlcnN0JnV1bWw7dHp0IGFiIENNU01TLVZlcnNpb24gMS4xKS48L3A+DQo8aDM+V2llIHdpcmQgZXMgZWluZ2VzZXR6dD88L2gzPg0KPHA+SW5zdGFsbGllcmVuIFNpZSBkYXMgTW9kdWwgdW5kIGFrdGl2aWVyZW4gU2llIGVzIGFuc2NobGllJnN6bGlnO2VuZCBpbiBkZW4gYmVudXR6ZXJzcGV6aWZpc2NoZW4gRWluc3RlbGx1bmdlbi48L3A+DQo8cD5CZWFjaHRlbiBTaWUsIGRhc3MgU2llIGFiIENNU01TLVZlcnNpb24gMS4xIHVuZCBoJm91bWw7aGVyIENvZGVNaXJyb3Igc293b2hsIGFscyBXWVNJV1lHLUVkaXRvciBhbHMgYXVjaCBhbHMgRWRpdG9yIG1pdCBTeW50YXhoZXJ2b3JoZWJ1bmcgYXVzdyZhdW1sO2hsZW4gayZvdW1sO25uZW4uPC9wPic7CiRsYW5nWyd1dG1hJ10gPSAnMTU2ODYxMzUzLjEyNDQyMzIzODEuMTMyNjgzMjc5NS4xMzI2ODMyNzk1LjEzMjY4MzI3OTUuMSc7CiRsYW5nWyd1dG16J10gPSAnMTU2ODYxMzUzLjEzMjY4MzI3OTUuMS4xLnV0bWNjbj0oZGlyZWN0KXx1dG1jc3I9KGRpcmVjdCl8dXRtY21kPShub25lKSc7CiRsYW5nWyd1dG1jJ10gPSAnMTU2ODYxMzUzJzsKJGxhbmdbJ3V0bWInXSA9ICcxNTY4NjEzNTMnOwo/Pg==]]></data>
	</file>
	<file>
	  <filename>/lang/ext/es_ES.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0VkaXRvciBkZSByZXNhbHRhZG8gZGUgc2ludGF4aXMgQ29kZU1pcnJvcic7CiRsYW5nWydwb3N0aW5zdGFsbCddID0gJ0VsIG0mYW1wO29hY3V0ZTtkdWxvIENvZGVNaXJyb3IgZnVlIHNhdGlzZmFjdG9yaWFtZW50ZSBpbnN0YWxhZG8nOwokbGFuZ1snbmVlZHBlcm1pc3Npb24nXSA9ICcmIzAzOTtTZSBuZWNlc2l0YSBlbCBwZXJtaXNvIGRlICYjMDM5OyVzJiMwMzk7IHBhcmEgcmVhbGl6YXIgZXN0YSBmdW5jaSZhbXA7b2FjdXRlO24uJzsKJGxhbmdbJ3NldHRpbmdzdGFiJ10gPSAnQWp1c3Rlcyc7CiRsYW5nWydzYXZlc2V0dGluZ3MnXSA9ICdTYWx2YXIgYWp1c3Rlcyc7CiRsYW5nWydzZXR0aW5nc3NhdmVkJ10gPSAnQWp1c3RlcyBndWFyZGFkb3MnOwokbGFuZ1snaHRtbHRlc3QnXSA9ICdQcnVlYmEgZGUgc2ludGF4aXMgSFRNTCc7CiRsYW5nWydjc3N0ZXN0J10gPSAnUHJ1ZWJhIGRlIHNpbnRheGlzIENTUyc7CiRsYW5nWydwaHB0ZXN0J10gPSAnUHJ1ZWJhIGRlIHNpbnRheGlzIFBIUCc7CiRsYW5nWydleGFtcGxlc3ludGF4J10gPSAnU3ludGF4aXMgdXNhZGEgcGFyYSBwcm9iYXInOwokbGFuZ1snY2hhbmdlJ10gPSAnQ2FtYmlhci4uLic7CiRsYW5nWydzaG93bGluZW51bWJlcnMnXSA9ICdNb3N0YXIgZWwgbiZhbXA7dWFjdXRlO21lcm8gZGUgbCZhbXA7aWFjdXRlO25lYXMnOwokbGFuZ1sndGV4dHdyYXBwaW5nJ10gPSAnQXV0by1hanVzdGFyIGxpbmVhcyBsYXJnYXMnOwokbGFuZ1snaGVscCddID0gJzxzdHJvbmc+UXUmYW1wO2VhY3V0ZTsgaGFjZSBlc3RlIG0mYW1wO29hY3V0ZTtkdWxvPzwvc3Ryb25nPg0KPGJyLz4NCkVsIG0mYW1wO29hY3V0ZTtkdWxvIENvZGVNaXJyb3IgbGUgcGVybWl0ZSBlZGl0YXIgY29udGVuaWRvLCBwbGFudGlsbGFzIHkgaG9qYXMgZGUgZXN0aWxvIHVzYW5kbyB1biBlZGl0b3IgZGUgcmVzYWx0YWRvIGRlIHNpbnRheGlzIGRlbnRybyBkZSBzdSBuYXZlZ2Fkb3IuDQpFc3RlIHRhbWJpdSZhbXA7ZWFjdXRlO24gcHVlZGUgIHJlZW1wbGF6YXIgZWwgbSZhbXA7b2FjdXRlO2R1bG8gZGUgd3lzaXd5ZywgeSBhY3R1YXIgc29sbyBwYXJhIGVkaWNpJmFtcDtvYWN1dGU7biBkZSBwbGFudGlsbGFzL2hvamFzIGRlIGVzdGlsbyB0ZW1wbGF0ZS9zdHlsZXNoZWV0ICAoc29sbyBzb3BvcnRhZG8gZW4gQ01TbXMgMS4xKykNCjxici8+PGJyLz4NCjxzdHJvbmc+QyZhbXA7b2FjdXRlO21vIHVzbyBlc3RlIG0mYW1wO29hY3V0ZTtkdWxvPzwvc3Ryb25nPg0KVXN0ZWQgc2ltcGxlbWVudGUgbG8gaW5zdGFsYSwgeSBsbyBzZWxlY2Npb25hIGVuIGxhcyBwcmVmZXJlY2lhcyBkZSBsYSBhZG1pbmlzdHJhY2kmYW1wO29hY3V0ZTtuLiBOb3RlIHF1ZSwgc2kgdXN0ZWQgdXNhIENNU21zIDEuMSBvIHN1cGVyaW9yIGEgZXN0ZSB1c3RlZCBwdWVkZSBzZWxlY2Npb25hciBDb2RlTWlycm9yIGp1bnRvIGNvbiBXWVNJV1lHIHBhcmEgZWwgcmVzYWx0YWRvIGRlIHNpbnRheGlzLic7CiRsYW5nWydxY2EnXSA9ICdQMC0yMDk2MDU0MzcwLTEyNTk4MDM2MTU5MzknOwokbGFuZ1sndXRtYSddID0gJzE1Njg2MTM1My4yMzg2MDY4NTQuMTI1OTgwNDM2OC4xMjY3NjUyNDU5LjEyNjc2NTk3NzMuNTcnOwokbGFuZ1sndXRteiddID0gJzE1Njg2MTM1My4xMjY3NjUyNDU5LjU2LjI4LnV0bWNjbj0ocmVmZXJyYWwpfHV0bWNzcj1mb3J1bS5jbXNtYWRlc2ltcGxlLm9yZ3x1dG1jY3Q9L2luZGV4LnBocC90b3BpYywxOTkyOS4wLmh0bWx8dXRtY21kPXJlZmVycmFsJzsKJGxhbmdbJ3V0bWMnXSA9ICcxNTY4NjEzNTMnOwokbGFuZ1sndXRtYiddID0gJzE1Njg2MTM1Myc7Cj8+]]></data>
	</file>
	<file>
	  <filename>/lang/ext/fr_FR.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0VkaXRldXIgZGUgc3ludGF4ZSBjb2xvciZlYWN1dGU7IENvZGVNaXJyb3InOwokbGFuZ1sncG9zdGluc3RhbGwnXSA9ICdMZSBtb2R1bGUgQ29kZU1pcnJvciBhICZlYWN1dGU7dCZlYWN1dGU7IGluc3RhbGwmZWFjdXRlOyBhdmVjIHN1Y2MmZWdyYXZlO3MnOwokbGFuZ1snbmVlZHBlcm1pc3Npb24nXSA9ICcmIzAzOTtWb3VzIGF2ZXogYmVzb2luIGRlIGwmIzAzOTthdXRvcmlzYXRpb24gJiMwMzk7JXMmIzAzOTsgIHBvdXIgY2V0dGUgZm9uY3Rpb24nOwokbGFuZ1snc2V0dGluZ3N0YWInXSA9ICdQYXJhbSZlZ3JhdmU7dHJlcyc7CiRsYW5nWydzYXZlc2V0dGluZ3MnXSA9ICdTYXV2ZWdhcmRlciBsZXMgcGFyYW0mZWdyYXZlO3RyZXMnOwokbGFuZ1snc2V0dGluZ3NzYXZlZCddID0gJ1BhcmFtJmVncmF2ZTt0cmVzIHNhdXZlZ2FyZCZlYWN1dGU7cyc7CiRsYW5nWydodG1sdGVzdCddID0gJ1Rlc3QgZGUgc3ludGF4ZSBIVE1MICc7CiRsYW5nWydjc3N0ZXN0J10gPSAnVGVzdCBkZSBzeW50YXhlIENTUyAnOwokbGFuZ1sncGhwdGVzdCddID0gJ1Rlc3QgZGUgc3ludGF4ZSBQSFAnOwokbGFuZ1snanN0ZXN0J10gPSAnVGVzdCBkZSBzeW50YXhlIEphdmFTY3JpcHQnOwokbGFuZ1snc2hvd2xpbmVudW1iZXJzJ10gPSAnQWZmaWNoZXIgbGUgbm9tYnJlIGRlIGxpZ25lcyc7CiRsYW5nWydhbGxvd2Z1bGxzY3JlZW4nXSA9ICdBdXRvcmlzZXIgbGUgbW9kZSBwbGVpbiAmZWFjdXRlO2NyYW4gKEYxMSknOwokbGFuZ1sndGV4dHdyYXBwaW5nJ10gPSAnUmVudm9pICZhZ3JhdmU7IGxhIGxpZ25lIGF1dG9tYXRpcXVlICc7CiRsYW5nWydhdXRvbWF0Y2hwYXJlbnMnXSA9ICdBZmZpY2hlciBsZXMgY29ycmVzcG9uZGFuY2VzIGRlIHBhcmVudGgmZWdyYXZlO3Nlcyc7CiRsYW5nWyd0YWJoYW5kbGluZyddID0gJ0NvbW1lbnQgZyZlYWN1dGU7cmVyIGxlIGNsaWMgc3VyIGxhIHRvdWNoZSBUQUInOwokbGFuZ1sndGFiZGVmYXVsdCddID0gJ0xhaXNzZXIgbGUgbmF2aWdhdGV1ciBkJmVhY3V0ZTtjaWRlcic7CiRsYW5nWyd0YWJpbmRlbnQnXSA9ICdJbmRlbnRlcic7CiRsYW5nWyd0YWJzcGFjZXMnXSA9ICdJbnMmZWFjdXRlO3JlciBkZXMgZXNwYWNlcyc7CiRsYW5nWyd0YWJzaGlmdCddID0gJ1NoaWZ0IHZlcnMgbGEgZHJvaXRlLCBzaGlmdC1UQUIgc2hpZnRzIHZlcnMgbGEgZ2F1Y2hlJzsKJGxhbmdbJ3RhYnNpemUnXSA9ICdUYWlsbGUgZGVzIG9uZ2xldHMnOwokbGFuZ1snY3NzYWRkaXRpb25zJ10gPSAnQWpvdXRzICZhZ3JhdmU7IGxhIGZldWlsbGUgZGUgc3R5bGUgZGUgQ29kZU1pcnJvci4nOwokbGFuZ1sndGhlbWUnXSA9ICdUaCZlZ3JhdmU7bWUnOwokbGFuZ1snaGVscCddID0gJzxzdHJvbmc+UXVlIGZhaXQgY2UgbW9kdWxlJm5ic3A7Pzwvc3Ryb25nPg0KPGJyLz4NCkxlIG1vZHVsZSBDb2RlTWlycm9yIHZvdXMgcGVybWV0IGRlIG1vZGlmaWVyIGxlIGNvbnRlbnUsIGxlcyBnYWJhcml0cyBldCBsZXMgZmV1aWxsZXMgZGUgc3R5bGUgZW4gdXRpbGlzYW50IHVuICZlYWN1dGU7ZGl0ZXVyIGRlIHN5bnRheGUgY29sb3ImZWFjdXRlOyBsJiMwMzk7aW50JmVhY3V0ZTtyaWV1ciBkZSB2b3RyZSBuYXZpZ2F0ZXVyLiANCklsIHBldXQgYXVzc2kgYmllbiByZW1wbGFjZXIgbCYjMDM5OyZlYWN1dGU7ZGl0ZXVyIFdZU0lXWUcsIGV0IHBlcm1ldHRyZSBkZSB2aXN1YWxpc2VyLSZlYWN1dGU7ZGl0ZXIgbGVzIGdhYmFyaXRzLCBmZXVpbGxlcyBkZSBzdHlsZS4gKFVuaXF1ZW1lbnQgcG91ciB2ZXJzaW9uIENNU01TIDEuMSBvdSBwbHVzKQ0KPGJyLz48YnIvPg0KPHN0cm9uZz5Db21tZW50IGwmIzAzOTt1dGlsaXNlciZuYnNwOz88L3N0cm9uZz48YnIvPg0KSWwgdm91cyBzdWZmaXQgZGUgbCYjMDM5O2luc3RhbGxlciwgZXQgZGFucyAmcXVvdDtNZXMgcHImZWFjdXRlO2YmZWFjdXRlO3JlbmNlcyAvIFByJmVhY3V0ZTtmJmVhY3V0ZTtyZW5jZXMgZGUgbCYjMDM5O3V0aWxpc2F0ZXVyJnF1b3Q7IGNob2lzaXIgYXZlYyBsZSBtZW51IGQmZWFjdXRlO3JvdWxhbnQgQ29kZU1pcnJvciBkYW5zICZxdW90O1MmZWFjdXRlO2xlY3Rpb25uZXIgbGEgc3ludGF4ZSBzdXJsaWduJmVhY3V0ZTtlJnF1b3Q7IGV0L291ICZlYWN1dGU7dmVudHVlbGxlbWVudCBkYW5zICZxdW90O1MmZWFjdXRlO2xlY3Rpb24gZHUgV1lTSVdZRyAmYWdyYXZlOyB1dGlsaXNlciZxdW90Oy4NCic7Cj8+]]></data>
	</file>
	<file>
	  <filename>/lang/ext/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCEtLSBEVU1NWSBIVE1MIEZJTEUgLS0+]]></data>
	</file>
	<file>
	  <filename>/lang/ext/nb_NO.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0NvZGVNaXJyb3Igc3ludGFrc2ZyZW1oZXZpbmdzcmVkaWdlcmVyJzsKJGxhbmdbJ3Bvc3RpbnN0YWxsJ10gPSAnQ29kZU1pcnJvciBtb2R1bGVuIGJsZSBpbnN0YWxsZXJ0JzsKJGxhbmdbJ25lZWRwZXJtaXNzaW9uJ10gPSAnRHUgdHJlbmdlciAmIzAzOTslcyYjMDM5OyB0aWxsYXRlbHNlIGZvciAmYXJpbmc7IHV0ZiZvc2xhc2g7cmUgZGVubmUgZnVua3Nqb25lbi4nOwokbGFuZ1snc2V0dGluZ3N0YWInXSA9ICdJbm5zdGlsbGluZ2VyJzsKJGxhbmdbJ3NhdmVzZXR0aW5ncyddID0gJ0xhZ3JlIGlubnN0aWxsaW5nZXInOwokbGFuZ1snc2V0dGluZ3NzYXZlZCddID0gJ0lubnN0aWxsaW5nZXIgbGFncmV0JzsKJGxhbmdbJ2h0bWx0ZXN0J10gPSAnSFRNTCBzeW50YWtzIHRlc3QnOwokbGFuZ1snY3NzdGVzdCddID0gJ0NTUyBzeW50YWtzIHRlc3QnOwokbGFuZ1sncGhwdGVzdCddID0gJ1BIUCBzeW50YWtzIHRlc3QnOwokbGFuZ1snanN0ZXN0J10gPSAnSmF2YVNjcmlwdCBzeW50YWtzdGVzdCc7CiRsYW5nWydzaG93bGluZW51bWJlcnMnXSA9ICdWaXMgbGluamVudW1tZXInOwokbGFuZ1snYWxsb3dmdWxsc2NyZWVuJ10gPSAnVGlsbGF0IGZ1bGxza2plcm1zbW9kdXMgKEYxMSknOwokbGFuZ1sndGV4dHdyYXBwaW5nJ10gPSAnVGVrc3Ricnl0aW5nJzsKJGxhbmdbJ2F1dG9tYXRjaHBhcmVucyddID0gJ0F1dG9tYXRpc2tlIHBhcmFudGVzZXInOwokbGFuZ1sndGFiaGFuZGxpbmcnXSA9ICdIdm9yZGFuIHNrYWwgdHJ5a2sgYXYgVEFCLXRhc3RlbiBoJmFyaW5nO250ZXJlcyc7CiRsYW5nWyd0YWJkZWZhdWx0J10gPSAnTGEgbmV0dGxlc2VyZW4gYXZnaiZvc2xhc2g7cmUnOwokbGFuZ1sndGFiaW5kZW50J10gPSAnTGFnIGlubnJ5a2snOwokbGFuZ1sndGFic3BhY2VzJ10gPSAnU2V0dCBpbm4gbWVsbG9tcm9tJzsKJGxhbmdbJ3RhYnNoaWZ0J10gPSAnU2hpZnQgdGlsIGgmb3NsYXNoO3lyZSwgc2hpZnQtVEFCIHNlbmRlciB0aWwgdmVuc3RyZSc7CiRsYW5nWyd0YWJzaXplJ10gPSAnU3Qmb3NsYXNoO3JyZWxzZSBwJmFyaW5nOyBmYW5lcic7CiRsYW5nWydjc3NhZGRpdGlvbnMnXSA9ICdDb2RlTWlycm9yLWNzcyB0aWxsZWdnLic7CiRsYW5nWyd0aGVtZSddID0gJ1RlbWEnOwokbGFuZ1snaGVscCddID0gJzxzdHJvbmc+V2hhdCBkb2VzIHRoaXMgbW9kdWxlIGRvPzwvc3Ryb25nPg0KPGJyLz4NClRoZSBDb2RlTWlycm9yIG1vZHVsZSBhbGxvd3MgeW91IHRvIGVkaXQgY29udGVudCwgdGVtcGxhdGVzIGFuZCBzdHlsZXNoZWV0cyB1c2luZyBhIHN5bnRheGhpZ2hsaWdodGluZyBlZGl0b3IgaW5zaWRlIHlvdXIgYnJvd3Nlci4NCkl0IGNhbiBib3RoIHJlcGxhY2UgYSB3eXNpd3lnLW1vZHVsZSwgYW5kIGFjdCBzdGFuZGFsb25lIGZvciB0ZW1wbGF0ZS9zdHlsZXNoZWV0IGVkaXRpbmcgKG9ubHkgc3VwcG9ydGVkIGluIENNU21zIDEuMSspDQo8YnIvPjxici8+DQo8c3Ryb25nPkhvdyBkbyBJIHVzZSB0aGlzIG1vZHVsZT88L3N0cm9uZz4NCllvdSBzaW1wbHkgaW5zdGFsbCBpdCwgYW5kIGNob29zZSBpdCBpbiB5b3VyIGFkbWluIHVzZXIgcHJlZmVyZW5jZXMuIE5vdGUsIHRoYXQgaWYgeW91IHVzZSBDTVNtcyAxLjEgb3IgYWJvdmUgeW91IGNhbg0Kc2VsZWN0IENvZGVBcmVhIGJvdGggYXMgYSBXWVNJV1lHIGFuZCBhcyBhIHN5bnRheCBoaWdobGlnaHRpbmcgZWRpdG9yLic7CiRsYW5nWydxY2EnXSA9ICdQMC01MzY4NDkxMTUtMTMwNzk4MzQ5NTIxMCc7CiRsYW5nWyd1dG1hJ10gPSAnMTU2ODYxMzUzLjE1MDUxOTI4Ny4xMzgxMDcyNzczLjEzODEwNzI3NzMuMTM4MTA3ODQzOS4yJzsKJGxhbmdbJ3V0bXonXSA9ICcxNTY4NjEzNTMuMTM4MTA3Mjc3My4xLjEudXRtY3NyPShkaXJlY3QpfHV0bWNjbj0oZGlyZWN0KXx1dG1jbWQ9KG5vbmUpJzsKJGxhbmdbJ3V0bWInXSA9ICcxNTY4NjEzNTMnOwokbGFuZ1sndXRtYyddID0gJzE1Njg2MTM1Myc7Cj8+]]></data>
	</file>
	<file>
	  <filename>/lang/ext/nl_NL.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0NvZGVNaXJyb3IgU3ludGF4aGlnaGxpZ2h0aW5nIEVkaXRvcic7CiRsYW5nWydwb3N0aW5zdGFsbCddID0gJ0RlIENvZGVNaXJyb3IgTW9kdWxlIGlzIGdlJml1bWw7bnN0YWxsZWVyZCc7CiRsYW5nWyduZWVkcGVybWlzc2lvbiddID0gJ1UgaGVlZnQgJiMwMzk7JXMmIzAzOTsgcmVjaHRlbiBub2RpZyBvbSBkZXplIGZ1bmN0aWUgdGUgZ2VicnVpa2VuLic7CiRsYW5nWydzZXR0aW5nc3RhYiddID0gJ0luc3RlbGxpbmdlbic7CiRsYW5nWydzYXZlc2V0dGluZ3MnXSA9ICdJbnN0ZWxsaW5nZW4gb3BzbGFhbic7CiRsYW5nWydzZXR0aW5nc3NhdmVkJ10gPSAnSW5zdGVsbGluZ2VuIG9wZ2VzbGFnZW4nOwokbGFuZ1snaHRtbHRlc3QnXSA9ICdIVE1MIFN5bnRheCBUZXN0JzsKJGxhbmdbJ2Nzc3Rlc3QnXSA9ICdDU1MgU3ludGF4IFRlc3QnOwokbGFuZ1sncGhwdGVzdCddID0gJ1BIUCBTeW50YXggVGVzdCc7CiRsYW5nWydqc3Rlc3QnXSA9ICdKYXZhU2NyaXB0IFN5bnRheCBUZXN0JzsKJGxhbmdbJ3Nob3dsaW5lbnVtYmVycyddID0gJ1JlZ2VsbnVtbWVycyB0b25lbic7CiRsYW5nWydhbGxvd2Z1bGxzY3JlZW4nXSA9ICdTdGEgZnVsbHNjcmVlbiBtb2R1cyB0b2UgKEYxMSknOwokbGFuZ1sndGV4dHdyYXBwaW5nJ10gPSAnTGFuZ2UgcmVnZWxzIGFmYnJla2VuJzsKJGxhbmdbJ2F1dG9tYXRjaHBhcmVucyddID0gJ0F1dG9tYXRpc2NoIGJpaiBlbGthYXIgaG9yZW5kZSB0YWdzIGtsZXVyZW4nOwokbGFuZ1sndGFiaGFuZGxpbmcnXSA9ICdXYXQgdGUgZG9lbiBiaWogaGV0IGluZHJ1a2tlbiB2YW4gVEFCIHRvZXRzJzsKJGxhbmdbJ3RhYmRlZmF1bHQnXSA9ICdMYWF0IGRlIGJyb3dzZXIgaGV0IGJlcGFsZW4nOwokbGFuZ1sndGFiaW5kZW50J10gPSAnTWFhayByZWdlbCBpbnNwcmluZ2luZyc7CiRsYW5nWyd0YWJzcGFjZXMnXSA9ICdWb2VnIHNwYXRpZXMgdG9lJzsKJGxhbmdbJ3RhYnNoaWZ0J10gPSAnVmVycGxhYXRzdCBuYWFyIHJlY2h0cywgc2hpZnQtVEFCIHZlcnBsYWF0c3QgbmFhciBsaW5rcyc7CiRsYW5nWyd0YWJzaXplJ10gPSAnQWZtZXRpbmdlbiB2YW4gZGUgdGFicyc7CiRsYW5nWydjc3NhZGRpdGlvbnMnXSA9ICdBYW5wYXNzaW5nZW4gYWFuIGRlIENvZGVNaXJyb3ItY3NzLic7CiRsYW5nWyd0aGVtZSddID0gJ1RoZW1lICc7CiRsYW5nWydoZWxwJ10gPSAnPHN0cm9uZz5XaGF0IGRvZXMgdGhpcyBtb2R1bGUgZG8/IDwvc3Ryb25nPg0KPGJyIC8+DQpUaGUgQ29kZU1pcnJvciBtb2R1bGUgYWxsb3dzIHlvdSB0byBlZGl0IGNvbnRlbnQsIHRlbXBsYXRlcyBhbmQgc3R5bGVzaGVldHMgdXNpbmcgYSBzeW50YXhoaWdobGlnaHRpbmcgZWRpdG9yIGluc2lkZSB5b3VyIGJyb3dzZXIuDQpJdCBjYW4gYm90aCByZXBsYWNlIGEgd3lzaXd5Zy1tb2R1bGUsIGFuZCBhY3Qgc3RhbmRhbG9uZSBmb3IgdGVtcGxhdGUvc3R5bGVzaGVldCBlZGl0aW5nIChvbmx5IHN1cHBvcnRlZCBpbiBDTVNtcyAxLjErKQ0KPGJyLz48YnIvPg0KPHN0cm9uZz5Ib3cgZG8gSSB1c2UgdGhpcyBtb2R1bGU/PC9zdHJvbmc+DQpZb3Ugc2ltcGx5IGluc3RhbGwgaXQsIGFuZCBjaG9vc2UgaXQgaW4geW91ciBhZG1pbiB1c2VyIHByZWZlcmVuY2VzLiBOb3RlLCB0aGF0IGlmIHlvdSB1c2UgQ01TbXMgMS4xIG9yIGFib3ZlIHlvdSBjYW4NCnNlbGVjdCBDb2RlQXJlYSBib3RoIGFzIGEgV1lTSVdZRyBhbmQgYXMgYSBzeW50YXggaGlnaGxpZ2h0aW5nIGVkaXRvci4nOwokbGFuZ1sndXRtYSddID0gJzE1Njg2MTM1My4xNTI4NDE0MjA2LjEzNjgxMTAyMTAuMTM2ODExMDIxMC4xMzY4MTEwMjEwLjEnOwokbGFuZ1sndXRteiddID0gJzE1Njg2MTM1My4xMzY4MTEwMjEwLjEuMS51dG1jY249KGRpcmVjdCl8dXRtY3NyPShkaXJlY3QpfHV0bWNtZD0obm9uZSknOwokbGFuZ1sndXRtYiddID0gJzE1Njg2MTM1Myc7CiRsYW5nWyd1dG1jJ10gPSAnMTU2ODYxMzUzJzsKPz4=]]></data>
	</file>
	<file>
	  <filename>/lang/ext/ro_RO.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0VkaXRvcnVsIENvZGVNaXJyb3IgY3UgZXZpZGVudGlhdG9yIGRlIHNpbnRheGEnOwokbGFuZ1sncG9zdGluc3RhbGwnXSA9ICdNb2R1bHVsIENvZGVNaXJyb3IgYSBmb3N0IGluc3RhbGF0IGN1IHN1Y2Nlcyc7CiRsYW5nWyduZWVkcGVybWlzc2lvbiddID0gJ0F2ZXRpIG5ldm9pZSBkZSBwZXJtaXNpdW5lYSAmIzAzOTslcyYjMDM5OyBwZW50cnUgYWNlYXN0YSBmdW5jdGllLic7CiRsYW5nWydzZXR0aW5nc3RhYiddID0gJ1NldGFyaSc7CiRsYW5nWydzYXZlc2V0dGluZ3MnXSA9ICdTYWx2YXJlIHNldGFyaSc7CiRsYW5nWydzZXR0aW5nc3NhdmVkJ10gPSAnU2V0YXJpbGUgYXUgZm9zdCBzYWx2YXRlJzsKJGxhbmdbJ2h0bWx0ZXN0J10gPSAndGVzdCBzaW50YXhhIEhUTUwnOwokbGFuZ1snY3NzdGVzdCddID0gJ3Rlc3Qgc2ludGF4YSBDU1MnOwokbGFuZ1sncGhwdGVzdCddID0gJ3Rlc3Qgc2ludGF4YSBQSFAnOwokbGFuZ1snanN0ZXN0J10gPSAndGVzdCBzaW50YXhhIEphdmFTY3JpcHQnOwokbGFuZ1snZXhhbXBsZXN5bnRheCddID0gJ1N5bnRheCB0byB0ZXN0IGN1JzsKJGxhbmdbJ2NoYW5nZSddID0gJ1NjaGltYmEnOwokbGFuZ1snc2hvd2xpbmVudW1iZXJzJ10gPSAnQWZpc2FyZSBudW1lcmUgZGUgbGluaWUnOwokbGFuZ1sndGV4dHdyYXBwaW5nJ10gPSAnU3RyYW5nZSBsaW5paWxlIGx1bmdpJzsKJGxhbmdbJ2F1dG9tYXRjaHBhcmVucyddID0gJ0F1dG9wb3RyaXZpcmUgcGFyYW50ZXplJzsKJGxhbmdbJ2hlbHAnXSA9ICc8c3Ryb25nPkNlIGZhY2UgYWNlc3QgbW9kdWw/PC9zdHJvbmc+DQo8YnIvPg0KTW9kdWx1bCBDb2RlTWlycm9yIHZhIHBlcm1pdGUgc2EgZWRpdGF0aSBjb250aW51dCwgdGVtcGxhdGUtdXJpIHNpIHN0eWxlc2hlZXQtdXJpIGZvbG9zaW5kIHVuIGVkaXRvciBjdSBldmlkZW50aWF0b3IgZGUgc2ludGF4YSBkaW4gYnJvd3Nlci4NClBvYXRlIGlubG9jdWkgYXRhdCB1biBtb2R1bCB3eXNpd3lnLCBzaSBzYSBmdW5jdGlvbmV6ZSBkZSBzaW5lIHN0YXRhdG9yIHBlbnRydSBlZGl0YXJlIGRlIHRlbXBsYXRlL3N0eWxlc2hlZXQuDQo8YnIvPjxici8+DQo8c3Ryb25nPkN1bSBzZSBmb2xvc2VzZSBhY2VzdCBtb2R1bD88L3N0cm9uZz4NCkluc3RhbGF0aS1sLCBzaSBhbGVnZXRpLWwgaW4gcHJlZmVyaW50ZWxlIGRlIHV0aWxpemF0b3IgZGluIGFkbWluLic7CiRsYW5nWydxY2EnXSA9ICdQMC0xODM4MjE1MDQzLTEyODI4MDc1MzM5MzQnOwokbGFuZ1sndXRteiddID0gJzE1Njg2MTM1My4xMjgyODA3OTcyLjEuMi51dG1jc3I9Z29vZ2xlfHV0bWNjbj0ob3JnYW5pYyl8dXRtY21kPW9yZ2FuaWN8dXRtY3RyPWNtc21zJzsKJGxhbmdbJ3V0bWEnXSA9ICcxNTY4NjEzNTMuMTE5MTg3MzgxNy4xMjgyODA3NTM0LjEyODI4MDc1MzQuMTI4MjgwNzUzNC4xJzsKJGxhbmdbJ3V0bWMnXSA9ICcxNTY4NjEzNTMnOwokbGFuZ1sndXRtYiddID0gJzE1Njg2MTM1My4xMi45LjEyODI4MDc2MTUzNjgnOwo/Pg==]]></data>
	</file>
	<file>
	  <filename>/lang/ext/ru_RU.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0NvZGVNaXJyb3Igc3ludGF4aGlnaGxpZ2h0aW5nIGVkaXRvcic7CiRsYW5nWydwb3N0aW5zdGFsbCddID0gJ1RoZSBDb2RlTWlycm9yIG1vZHVsZSB3YXMgc3VjZXNzZnVsbHkgaW5zdGFsbGVkJzsKJGxhbmdbJ25lZWRwZXJtaXNzaW9uJ10gPSAnXCdZb3UgbmVlZCB0aGUgXCclc1wnIHBlcm1pc3Npb24gdG8gcGVyZm9ybSB0aGF0IGZ1bmN0aW9uLic7CiRsYW5nWydzZXR0aW5nc3RhYiddID0gJ9Cd0LDRgdGC0YDQvtC50LrQuCc7CiRsYW5nWydzYXZlc2V0dGluZ3MnXSA9ICfQodC+0YXRgNCw0L3QuNGC0Ywg0L3QsNGB0YLRgNC+0LnQutC4JzsKJGxhbmdbJ3NldHRpbmdzc2F2ZWQnXSA9ICfQndCw0YHRgtGA0L7QudC60Lgg0YHQvtGF0YDQsNC90LXQvdGLJzsKJGxhbmdbJ2h0bWx0ZXN0J10gPSAnSFRNTCBzeW50YXggdGVzdCAnOwokbGFuZ1snY3NzdGVzdCddID0gJ0NTUyBzeW50YXggdGVzdCAnOwokbGFuZ1sncGhwdGVzdCddID0gJ1BIUCBzeW50YXggdGVzdCAnOwokbGFuZ1snanN0ZXN0J10gPSAnSmF2YVNjcmlwdCBzeW50YXggdGVzdCAnOwokbGFuZ1snc2hvd2xpbmVudW1iZXJzJ10gPSAn0J/QvtC60LDQt9Cw0YLRjCDQvdGD0LzQtdGA0LDRhtC40Y4g0YHRgtGA0L7Quic7CiRsYW5nWydhbGxvd2Z1bGxzY3JlZW4nXSA9ICfQoNCw0LfRgNC10YjQuNGC0Ywg0L/QvtC70L3QvtGN0LrRgNCw0L3QvdGL0Lkg0YDQtdC20LjQvChGMTEpJzsKJGxhbmdbJ2F1dG9tYXRjaHBhcmVucyddID0gJ0F1dG9tYXRjaCBwYXJlbnRoZXNpcyc7CiRsYW5nWyd0YWJoYW5kbGluZyddID0gJ9Ca0LDQuiDQvtCx0YDQsNCx0LDRgtGL0LLQsNGC0Ywg0L3QsNC20LDRgtC40LUg0LrQu9Cw0LLQuNGI0LggVEFCJzsKJGxhbmdbJ3RhYmRlZmF1bHQnXSA9ICdMZXQgdGhlIGJyb3dzZXIgZGVjaWRlJzsKJGxhbmdbJ3RhYmluZGVudCddID0gJ0RvIGluZGVudGF0aW9uJzsKJGxhbmdbJ3RhYnNwYWNlcyddID0gJ9CS0YHRgtCw0LLQuNGC0Ywg0L/RgNC+0LHQtdC70YsnOwokbGFuZ1sndGFic2hpZnQnXSA9ICdTaGlmdCB0byB0aGUgcmlnaHQsIHNoaWZ0LVRBQiBzaGlmdHMgdG8gbGVmdCc7CiRsYW5nWyd0YWJzaXplJ10gPSAn0KDQsNC30LzQtdGAINCy0LrQu9Cw0LTQvtC6JzsKJGxhbmdbJ2Nzc2FkZGl0aW9ucyddID0gJ0FkZGl0aW9ucyB0byB0aGUgQ29kZU1pcnJvci1jc3MuJzsKJGxhbmdbJ3RoZW1lJ10gPSAn0KLQtdC80LAnOwokbGFuZ1snaGVscCddID0gJzxzdHJvbmc+V2hhdCBkb2VzIHRoaXMgbW9kdWxlIGRvPzwvc3Ryb25nPg0KPGJyLz4NClRoZSBDb2RlTWlycm9yIG1vZHVsZSBhbGxvd3MgeW91IHRvIGVkaXQgY29udGVudCwgdGVtcGxhdGVzIGFuZCBzdHlsZXNoZWV0cyB1c2luZyBhIHN5bnRheGhpZ2hsaWdodGluZyBlZGl0b3IgaW5zaWRlIHlvdXIgYnJvd3Nlci4NCkl0IGNhbiBib3RoIHJlcGxhY2UgYSB3eXNpd3lnLW1vZHVsZSwgYW5kIGFjdCBzdGFuZGFsb25lIGZvciB0ZW1wbGF0ZS9zdHlsZXNoZWV0IGVkaXRpbmcgKG9ubHkgc3VwcG9ydGVkIGluIENNU21zIDEuMSspDQo8YnIvPjxici8+DQo8c3Ryb25nPkhvdyBkbyBJIHVzZSB0aGlzIG1vZHVsZT88L3N0cm9uZz4NCllvdSBzaW1wbHkgaW5zdGFsbCBpdCwgYW5kIGNob29zZSBpdCBpbiB5b3VyIGFkbWluIHVzZXIgcHJlZmVyZW5jZXMuIE5vdGUsIHRoYXQgaWYgeW91IHVzZSBDTVNtcyAxLjEgb3IgYWJvdmUgeW91IGNhbg0Kc2VsZWN0IENvZGVNaXJyb3IgYm90aCBhcyBhIFdZU0lXWUcgYW5kIGFzIGEgc3ludGF4IGhpZ2hsaWdodGluZyBlZGl0b3IuJzsKJGxhbmdbJ3V0bWEnXSA9ICcxNTY4NjEzNTMuODk2MTM3NjE3LjEzNTc5MTI4MTIuMTM1ODA4Mzg1OC4xMzU4NjQ3ODMwLjMnOwokbGFuZ1sndXRtYyddID0gJzE1Njg2MTM1Myc7CiRsYW5nWyd1dG16J10gPSAnMTU2ODYxMzUzLjEzNTc5MTI4MTIuMS4xLnV0bWNzcj1mb3J1bS5jbXNtYWRlc2ltcGxlLm9yZ3x1dG1jY249KHJlZmVycmFsKXx1dG1jbWQ9cmVmZXJyYWx8dXRtY2N0PS9tZW1iZXJsaXN0LnBocCc7CiRsYW5nWyd1dG1iJ10gPSAnMTU2ODYxMzUzLjEuMTAuMTM1ODY0NzgzMCc7Cj8+]]></data>
	</file>
	<file>
	  <filename>/lang/ext/sv_SE.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKJGxhbmdbJ2ZyaWVuZGx5bmFtZSddID0gJ0NvZGVNaXJyb3Igc3ludGF4aGlnaGxpZ2h0aW5nIGVkaXRvcic7CiRsYW5nWydwb3N0aW5zdGFsbCddID0gJ0NvZGVNaXJyb3ItbW9kdWxlbiBpbnN0YWxsZXJhZGVzIHV0YW4gbiZhcmluZztncmEgcHJvYmxlbSc7CiRsYW5nWyduZWVkcGVybWlzc2lvbiddID0gJyYjMDM5O1lvdSBuZWVkIHRoZSAmIzAzOTslcyYjMDM5OyBwZXJtaXNzaW9uIHRvIHBlcmZvcm0gdGhhdCBmdW5jdGlvbi4nOwokbGFuZ1snc2V0dGluZ3N0YWInXSA9ICdJbnN0JmF1bWw7bGxuaW5nYXInOwokbGFuZ1snc2F2ZXNldHRpbmdzJ10gPSAnU3BhcmEgaW5zdCZhdW1sO2xsbmluZ2FyJzsKJGxhbmdbJ3NldHRpbmdzc2F2ZWQnXSA9ICdJbnN0JmF1bWw7bGxuaW5nYXIgc3BhcmFkZXMnOwokbGFuZ1snaHRtbHRlc3QnXSA9ICdIVE1MIHN5bnRheCB0ZXN0JzsKJGxhbmdbJ2Nzc3Rlc3QnXSA9ICdDU1Mgc3ludGF4IHRlc3QnOwokbGFuZ1sncGhwdGVzdCddID0gJ1BIUCBzeW50YXggdGVzdCc7CiRsYW5nWydqc3Rlc3QnXSA9ICdKYXZhU2NyaXB0IHN5bnRheCB0ZXN0JzsKJGxhbmdbJ2V4YW1wbGVzeW50YXgnXSA9ICdTeW50YXggYXR0IHRlc3RhIG1lZCc7CiRsYW5nWydjaGFuZ2UnXSA9ICcmQXVtbDtuZHJhLi4uJzsKJGxhbmdbJ3Nob3dsaW5lbnVtYmVycyddID0gJ1Zpc2EgcmFkbnVtbWVyJzsKJGxhbmdbJ3RleHR3cmFwcGluZyddID0gJ1dyYXAgbG9uZyBsaW5lcyc7CiRsYW5nWydoZWxwJ10gPSAnPHN0cm9uZz5XaGF0IGRvZXMgdGhpcyBtb2R1bGUgZG8/PC9zdHJvbmc+DQo8YnIvPg0KVGhlIENvZGVNaXJyb3IgbW9kdWxlIGFsbG93cyB5b3UgdG8gZWRpdCBjb250ZW50LCB0ZW1wbGF0ZXMgYW5kIHN0eWxlc2hlZXRzIHVzaW5nIGEgc3ludGF4aGlnaGxpZ2h0aW5nIGVkaXRvciBpbnNpZGUgeW91ciBicm93c2VyLg0KSXQgY2FuIGJvdGggcmVwbGFjZSBhIHd5c2l3eWctbW9kdWxlLCBhbmQgYWN0IHN0YW5kYWxvbmUgZm9yIHRlbXBsYXRlL3N0eWxlc2hlZXQgZWRpdGluZyAob25seSBzdXBwb3J0ZWQgaW4gQ01TbXMgMS4xKykNCjxici8+PGJyLz4NCjxzdHJvbmc+SG93IGRvIEkgdXNlIHRoaXMgbW9kdWxlPzwvc3Ryb25nPg0KWW91IHNpbXBseSBpbnN0YWxsIGl0LCBhbmQgY2hvb3NlIGl0IGluIHlvdXIgYWRtaW4gdXNlciBwcmVmZXJlbmNlcy4gTm90ZSwgdGhhdCBpZiB5b3UgdXNlIENNU21zIDEuMSBvciBhYm92ZSB5b3UgY2FuDQpzZWxlY3QgQ29kZUFyZWEgYm90aCBhcyBhIFdZU0lXWUcgYW5kIGFzIGEgc3ludGF4IGhpZ2hsaWdodGluZyBlZGl0b3IuJzsKJGxhbmdbJ3FjYSddID0gJ1AwLTEyMzE4NzIzMjUtMTI2OTM1OTMyMTE5NSc7CiRsYW5nWyd1dG1hJ10gPSAnMTU2ODYxMzUzLjEyNjk3Nzc2MDMuMTI2OTM1OTM0Mi4xMjY5MzU5MzQyLjEyNjkzNTkzNDIuMSc7CiRsYW5nWyd1dG1iJ10gPSAnMTU2ODYxMzUzLjEuMTAuMTI2OTM1OTM0Mic7CiRsYW5nWyd1dG1jJ10gPSAnMTU2ODYxMzUzJzsKJGxhbmdbJ3V0bXonXSA9ICcxNTY4NjEzNTMuMTI2OTM1OTM0Mi4xLjEudXRtY3NyPWdvb2dsZXx1dG1jY249KG9yZ2FuaWMpfHV0bWNtZD1vcmdhbmljfHV0bWN0cj1jbXNtcyc7Cj8+]]></data>
	</file>
	<file>
	  <filename>/lang/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCEtLSBEVU1NWSBIVE1MIEZJTEUgLS0+]]></data>
	</file>
	<file>
	  <filename>/method.install.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKaWYgKCFmdW5jdGlvbl9leGlzdHMoImNtc21zIikpIGV4aXQ7CiAgJHRoaXMtPlNldFByZWZlcmVuY2UoInNob3dsaW5lbnVtYmVycyIsMSk7CiAgJHRoaXMtPlNldFByZWZlcmVuY2UoInVzZWF1dG9jb21wbGV0ZSIsMSk7CiAgJHRoaXMtPlNldFByZWZlcmVuY2UoImF1dG9tYXRjaHBhcmVucyIsMCkKPz4=]]></data>
	</file>
	<file>
	  <filename>/method.uninstall.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKICBpZiAoIWZ1bmN0aW9uX2V4aXN0cygiY21zbXMiKSkgZXhpdDsKICAkdGhpcy0+UmVtb3ZlUHJlZmVyZW5jZSgpOwo/Pg==]]></data>
	</file>
	<file>
	  <filename>/method.upgrade.php</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PD9waHAKICBpZiAoIWZ1bmN0aW9uX2V4aXN0cygiY21zbXMiKSkgZXhpdDsKICAvL1JlbW92ZSBvbGQgc3BlY2lmaWsgcGVybWlzc2lvbgogICR0aGlzLT5SZW1vdmVQZXJtaXNzaW9uKCJtb2RpZnllZGl0YXJlYXNldHRpbmdzIik7Cj8+]]></data>
	</file>
	<file>
	  <filename>/moduleinfo.ini</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[W21vZHVsZV0KbmFtZSA9IENvZGVNaXJyb3IKdmVyc2lvbiA9IDUuMC4xCmRlc2NyaXB0aW9uID0gCmF1dGhvciA9IE1vcnRlbiBQb3Vsc2VuCmF1dGhvcmVtYWlsID0gJmx0O21vcnRlbkBwb3Vsc2VuLm9yZyZndDsKbWluY21zdmVyc2lvbiA9IDIuMApsYXp5bG9hZGFkbWluID0gMApsYXp5bG9hZGZyb250ZW5kID0gMAo=]]></data>
	</file>
	<file>
	  <filename>/templates/</filename>
	  <isdir>1</isdir>
	</file>
	<file>
	  <filename>/templates/changelog.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PHVsPgogIDxsaT41LjAuMSAtIEZpeGVkIGFwcGx5IGJ1dHRvbnMgKGF1dG9zYXZlIHRvIHRleHRhcmVhIG9uY2hhbmdlKSwgZml4ZWQgYSB1cmwgaXNzdWUsICh0aGFua3MgTWF0dGhpZXUpIGFuZCBhZGRlZCByZXBsYWNpbmcgY3NzIHN5bnRheCB3aXRoIHNhc3MvbGVzczwvbGk+CiAgPGxpPjUuMCAtIFVwZGF0ZWQgdG8gQ00gNS4yMC4yIGFuZCBmaXhlZCBtb2R1bGUgdG8gY21zbXMtMjwvbGk+CiAgPGxpPjQuNCAtIFVwZGF0ZWQgdG8gQ00gNC40PC9saT4KICA8bGk+NC4wIC0gVXBkYXRlZCB0byBDTSA0LjA8L2xpPgogIDxsaT4zLjIuMCAtIFVwZGF0ZWQgdG8gQ00gMy4yMDwvbGk+CiAgPGxpPjMuMC4yIC0gVXBkYXRlZCB0byBDTSAzLjAyPC9saT4KICA8bGk+My4wLjAgLSBVcGRhdGVkIHRvIENNIDMuMC1maW5hbC4gUG9zc2libGUgZml4IHRvIGFkbWlucyBvbiBodHRwcy4gRml4ZWQgc28gdGhhdCBlZGl0aW5nIFVEVCdzIGFyZSBnZXR0aW5nIGhpZ2hsaWdodGVkPC9saT4KICA8bGk+Mi4zLjIgLSBVcGRhdGVkIHRvIENNIDIuMzE8L2xpPgogIDxsaT4yLjMuMSAtIEFwcGx5LWJ1dHRvbiBpbiBlZGl0IGNzcyBhcmUgZml4ZWQsIHRlbXBsYXRlcyBzdGlsbCBoYXZlIGNvcmUgYnVnIDooPC9saT4KICA8bGk+Mi4zLjAgLSBSZWltcGxlbWVudGVkIGxpbmV3cmFwcGluZywgYXV0b21hdGVkIHRoZW1lIGRldGVjdGlvbjwvbGk+CiAgPGxpPjIuMi4zIC0gVXBkYXRlZCB0byBDTSAyLjIuMzwvbGk+CiAgPGxpPjIuMi4yIC0gVXBkYXRlZCB0byBDTSAyLjIuMTwvbGk+CiAgPGxpPjIuMi4xIC0gVXBkYXRlZCB0byBDTSAyLjIuMCwgYWRkZWQgdGFiLXdpZHRoIHNldHRpbmc8L2xpPgogIDxsaT4yLjIuMCAtIFVwZGF0ZWQgdG8gQ00gMi4xNSwgYWRkZWQgb3B0aW9uYWwgZnVsbHNjcmVlbiBtb2RlPC9saT4KICA8bGk+Mi4xLjIgLSBVcGRhdGVkIHRvIENNIDIuMTIsIGNsZWFuZXIgd2F5IG9mIHNhdmluZyBlZGl0b3IgY29udGVudCB0byB0ZXh0YXJlYTwvbGk+CiAgPGxpPjIuMS4wIC0gVXBkYXRlZCB0byBDTSAyLjEuMSwgb25jZSBhZ2FpbiBjaGFuZ2UgdGVzdG1vZGUuLi4gPC9saT4KICA8bGk+Mi4wLjEgLSBVcGRhdGVkIHRvIENNIDIuMC4xPC9saT4KICA8bGk+Mi4wIC0gVXBkYXRlZCB0byBDTSAyLjAgYW5kIHJld29ya2VkIGp1c3QgYWJvdXQgZXZlcnl0aGluZyB0byBtYWtlIHRoaXMgd29yazwvbGk+CiAgPGxpPjAuMS45IC0gVXBkYXRlZCB0byBDTSAwLjkzPC9saT4KICA8bGk+MC4xLjggLSBVcGRhdGVkIHRvIENNIDAuOSwgYWRkZWQgb3B0aW9uIG9uIGhvdyB0byBoYW5kbGUgVEFCPC9saT4KICA8bGk+MC4xLjcgLSBVcGRhdGVkIHRvIENNIDAuODA8L2xpPgogIDxsaT4wLjEuNiAtIFVwZGF0ZWQgdG8gQ00gMC43MCwgQWRkZWQgb3B0aW9uIHRvIG1hdGNoIHBhcmVudGhlc2lzPC9saT4KICA8bGk+MC4xLjUgLSBVcGRhdGVkIHRvIENNIDAuNjYsIHJlbW92ZWQgYSBzdHJhbmdlIFxuIGNoYXIgZnJvbSBoZWFkZXJvdXRwdXQsIG1hZGUgdGFiYmluZyB3b3JrPC9saT4KICA8bGk+MC4xLjQgLSBGaXhlZCBDUFUgaG9nZ2luZyBwcm9ibGVtcyBieSByZXdyaXRpbmcgdGVzdGFyZWEtY29kZTwvbGk+CiAgPGxpPjAuMS4zIC0gVXBkYXRlZCB0byBDTSAwLjY1LCBhZGRlZCBvcHRpb24gdG8gdG9nZ2xlIHdvcmR3cmFwPC9saT4KICA8bGk+MC4xLjIgLSBVcGRhdGVkIHRvIENNIDAuNjM8L2xpPgogIDxsaT4wLjEuMSAtIFVwZGF0ZWQgdG8gQ00gMC42MiwgZml4ZWQgZXhhbXBsZXMgYW5kIHByb2JhYmx5IGZ1bmN0aW9uYWxpdHkgYXMgd2VsbDwvbGk+CiAgPGxpPjAuMS4wIC0gSW5pdGlhbCByZWxlYXNlIDwvbGk+CjwvdWw+]]></data>
	</file>
	<file>
	  <filename>/templates/codemirror3area.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PGRpdiBzdHlsZT0iYm9yZGVyOjFweCBzb2xpZCBibGFjazsiID4NCiAgICA8dGV4dGFyZWEgaWQ9InskdGV4dGFyZWFpZH0iIG5hbWU9InskdGV4dGFyZWFuYW1lfSI+eyRjb250ZW50fTwvdGV4dGFyZWE+DQo8L2Rpdj4NCg0KPHNjcmlwdCB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPg0KDQogICAgdmFyIHskdGV4dGFyZWFpZH0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgneyR0ZXh0YXJlYWlkfScpOw0KICAgIHZhciBjb2RlbWlycm9yZWRpdG9yeyRudW1pZH0gPSBDb2RlTWlycm9yLmZyb21UZXh0QXJlYSh7JHRleHRhcmVhaWR9LCB7bGl0ZXJhbH17ey9saXRlcmFsfQ0KDQogICAgICAgIG1vZGUgOiAneyRtb2RlfScsDQogICAgICAgIGluZGVudFVuaXQgOiB7JHRhYnNpemV9LA0KICAgICAgICBsaW5lTnVtYmVyczogeyRsaW5lbnVtYmVyc30sDQogICAgICAgIGxpbmVXcmFwcGluZzogeyR0ZXh0d3JhcHBpbmd9LA0KDQogICAgICAgIHRhYk1vZGUgOiAneyR0YWJoYW5kbGluZ30nLA0KICAgICAgICB0aGVtZSA6ICd7JHRoZW1lfScsDQogICAgICAgIG1hdGNoQnJhY2tldHM6IHRydWUNCiAgICB7KmlmICRhbGxvd2Z1bGxzY3JlZW49PScxJ30NCiAgICAgICAge2xpdGVyYWx9DQogICAgICAgICAgICAsb25LZXlFdmVudDogZnVuY3Rpb24oaSwgZSkgew0KDQogICAgICAgICAgICBpZiAoKGUua2V5Q29kZSA9PSAxMjIgfHwgZS5rZXlDb2RlID09IDI3KSAmJiBlLnR5cGUgPT0gJ2tleWRvd24nKSB7DQogICAgICAgICAgICAgICAgZS5zdG9wKCk7DQogICAgICAgICAgICAgICAgcmV0dXJuIHRvZ2dsZUZ1bGxzY3JlZW5FZGl0aW5nKCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgey9saXRlcmFsfQ0KICAgIHsvaWYqfQ0KDQogICAge2xpdGVyYWx9fSk7ey9saXRlcmFsfQ0KPC9zY3JpcHQ+DQoNCg==]]></data>
	</file>
	<file>
	  <filename>/templates/index.html</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[PCEtLSBEVU1NWSBIVE1MIEZJTEUgLS0+]]></data>
	</file>
	<file>
	  <filename>/templates/settings.tpl</filename>
	  <isdir>0</isdir>
	  <data><![CDATA[eyRzdGFydGZvcm19CjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHNob3dsaW5lbnVtYmVyc3RleHR9PC9wPgoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPnskc2hvd2xpbmVudW1iZXJzaW5wdXR9PC9wPgoJPC9kaXY+Cgp7KjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JGFsbG93ZnVsbHNjcmVlbnRleHR9PC9wPgoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPnskYWxsb3dmdWxsc2NyZWVuaW5wdXR9PC9wPgoJPC9kaXY+Kn0KPGRpdiBjbGFzcz0icGFnZW92ZXJmbG93Ij4KCQk8cCBjbGFzcz0icGFnZXRleHQiPnskdGV4dHdyYXBwaW5ndGV4dH08L3A+CgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyR0ZXh0d3JhcHBpbmdpbnB1dH08L3A+Cgk8L2Rpdj4KeyoKICA8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgoJCTxwIGNsYXNzPSJwYWdldGV4dCI+eyRhdXRvbWF0Y2hwYXJlbnN0ZXh0fTwvcD4KCQk8cCBjbGFzcz0icGFnZWlucHV0Ij57JGF1dG9tYXRjaHBhcmVuc2lucHV0fTwvcD4KCTwvZGl2PgoqfQogIDxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHRhYmhhbmRsaW5ndGV4dH08L3A+CgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyR0YWJoYW5kbGluZ2lucHV0fTwvcD4KCTwvZGl2Pgo8ZGl2IGNsYXNzPSJwYWdlb3ZlcmZsb3ciPgogICAgPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHRhYnNpemV0ZXh0fTwvcD4KICAgIDxwIGNsYXNzPSJwYWdlaW5wdXQiPnskdGFic2l6ZWlucHV0fTwvcD4KPC9kaXY+Cgp7KjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JGNzc2FkZGl0aW9uc3RleHR9PC9wPgoJCTxwIGNsYXNzPSJwYWdlaW5wdXQiPnskY3NzYWRkaXRpb25zaW5wdXR9PC9wPgoJPC9kaXY+Cip9CjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+Cgk8cCBjbGFzcz0icGFnZXRleHQiPnskY3NzcmVwbGFjZXRleHR9PC9wPgoJPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRjc3NyZXBsYWNlaW5wdXR9PC9wPgo8L2Rpdj4KCjxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij57JHRoZW1ldGV4dH08L3A+CgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyR0aGVtZWlucHV0fTwvcD4KCTwvZGl2PgoKCTxkaXYgY2xhc3M9InBhZ2VvdmVyZmxvdyI+CgkJPHAgY2xhc3M9InBhZ2V0ZXh0Ij4mbmJzcDs8L3A+CgkJPHAgY2xhc3M9InBhZ2VpbnB1dCI+eyRzdWJtaXR9PC9wPgoJPC9kaXY+CnskZW5kZm9ybX0K]]></data>
	</file>
</module>
