From mboxrd@z Thu Jan 1 00:00:00 1970 From: Adolf Belka To: development@lists.ipfire.org Subject: Testing required for modified dhcp.cgi file related to bug 10743 Date: Sat, 14 Nov 2020 13:29:49 +0100 Message-ID: <18899fc2-bc68-61c5-db71-9e6e2726cb05@gmail.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="===============4001512311447056657==" List-Id: --===============4001512311447056657== Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Hi all, I created a modified dhcp.cgi file for bug 10743. This gives the opportunity = to add deny unknown-clients or deny known-clients to the dhcpd.conf file for = the green and blue subnets. Unfortunately one of the bug originators has decided to move away from IPFire= and will not carry out any testing of this modification to confirm it works = before I create a patch and submit it. The modification provides a radio button set to green and blue that offers:- allow all clients deny unknown-clients deny known-clients The allow all clients option gives the same setup as currently and is the def= ault setting for the radio button set. The modified dhcp.cgi file is attached. I would appreciate it if you could te= st this out and let me know if there are any unexpected outcomes. Regards, Adolf. --===============4001512311447056657== Content-Type: text/plain Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="dhcp-new.cgi" MIME-Version: 1.0 IyEvdXNyL2Jpbi9wZXJsCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIyAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIwojIElQRmlyZS5vcmcgLSBBIGxpbnV4IGJhc2VkIGZpcmV3YWxsICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAjCiMgQ29weXJpZ2h0IChDKSAyMDA3ICBNaWNoYWVs IFRyZW1lciAmIENocmlzdGlhbiBTY2htaWR0ICAgICAgICAgICAgICAgICAgICAgICMKIyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIwojIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2Fu IHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAgICAgICAjCiMgaXQgdW5kZXIgdGhlIHRl cm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICAg ICAgICMKIyB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAzIG9m IHRoZSBMaWNlbnNlLCBvciAgICAgICAgICAgIwojIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVy IHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCiMgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICMKIyBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhv cGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgICAgICAgIwojIGJ1dCBXSVRIT1VUIEFO WSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAg ICAgICAjCiMgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQ T1NFLiAgU2VlIHRoZSAgICAgICAgICAgICAgICMKIyBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5z ZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIwojICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAjCiMgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0 aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICAgICAgICMKIyBhbG9uZyB3aXRoIHRo aXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4g ICAgICAgIwojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCnVz ZSBzdHJpY3Q7CnVzZSBleHBlcmltZW50YWwgJ3NtYXJ0bWF0Y2gnOwoKIyBlbmFibGUgb25seSB0 aGUgZm9sbG93aW5nIG9uIGRlYnVnZ2luZyBwdXJwb3NlCiN1c2Ugd2FybmluZ3M7CiN1c2UgQ0dJ OjpDYXJwICdmYXRhbHNUb0Jyb3dzZXInOwoKcmVxdWlyZSAnL3Zhci9pcGZpcmUvZ2VuZXJhbC1m dW5jdGlvbnMucGwnOwpyZXF1aXJlICIke0dlbmVyYWw6OnN3cm9vdH0vbGFuZy5wbCI7CnJlcXVp cmUgIiR7R2VuZXJhbDo6c3dyb290fS9oZWFkZXIucGwiOwojd29ya2Fyb3VuZCB0byBzdXBwcmVz cyBhIHdhcm5pbmcgd2hlbiBhIHZhcmlhYmxlIGlzIHVzZWQgb25seSBvbmNlCm15IEBkdW1teSA9 ICggJHtIZWFkZXI6OmNvbG91cnllbGxvd30gKTsKdW5kZWYgKEBkdW1teSk7CgpvdXIgJWRoY3Bz ZXR0aW5ncz0oKTsKb3VyICVuZXRzZXR0aW5ncz0oKTsKbXkgJW1haW5zZXR0aW5ncz0oKTsKbXkg JXRpbWVzZXR0aW5ncz0oKTsKbXkgJHNldHRpbmcgPSAiJHtHZW5lcmFsOjpzd3Jvb3R9L2RoY3Av c2V0dGluZ3MiOwpvdXIgJGZpbGVuYW1lMSA9ICIke0dlbmVyYWw6OnN3cm9vdH0vZGhjcC9hZHZv cHRpb25zIjsgCSMgRmllbGQgc2VwYXJhdG9yIGlzIFRBQiBpbiB0aGlzIGZpbGUgKGNvbW1hIGlz IHN0YW5kYXJ0KQoJCQkJCQkJCQkjIGJlY2F1c2Ugd2UgbmVlZCBjb21tYXMgaW4gdGhlIHNvbWUg ZGF0YQpvdXIgJGZpbGVuYW1lMiA9ICIke0dlbmVyYWw6OnN3cm9vdH0vZGhjcC9maXhsZWFzZXMi OwpvdXIgJGZpbGVuYW1lMyA9ICIke0dlbmVyYWw6OnN3cm9vdH0vZGhjcC9hZHZvcHRpb25zLWxp c3QiOwkjIERlc2NyaWJlIHRoZSBhbGxvd2VkIHN5bnRheCBmb3IgZGhjcCBvcHRpb25zCm15ICRl cnJvcm1lc3NhZ2UgPSAnJzsKbXkgJHdhcm5OVFBtZXNzYWdlID0gJyc7Cm15IEBub3NhdmVkPSgp OwpteSAlY29sb3IgPSAoKTsKCiNCYXNpYyBzeW50YXggYWxsb3dlZCBmb3IgbmV3IE9wdGlvbiBk ZWZpbml0aW9uLiBOb3QgaW1wbGVtZW50ZWQ6IFJFQ09SRFMgJiBhcnJheSBvZiBSRUNPUkRTIApv dXIgJE9wdGlvblR5cGVzID0gJ2Jvb2xlYW58KCh1bik/c2lnbmVkICk/aW50ZWdlciAoOHwxNnwz Mil8aXAtYWRkcmVzc3x0ZXh0fHN0cmluZ3xlbmNhcHN1bGF0ZSBcdyt8YXJyYXkgb2YgaXAtYWRk cmVzcyc7CgomSGVhZGVyOjpzaG93aHR0cGhlYWRlcnMoKTsKb3VyIEBJVEZzPSgnR1JFRU4nKTsK aWYgKCZIZWFkZXI6OmJsdWVfdXNlZCgpKXtwdXNoKEBJVEZzLCdCTFVFJyk7fQoKI1NldHRpbmdz MSBmb3IgdGhlIGZpcnN0IHNjcmVlbiBib3gKZm9yZWFjaCBteSAkaXRmIChASVRGcykgewogICAg JGRoY3BzZXR0aW5nc3siRU5BQkxFXyR7aXRmfSJ9ID0gJ29mZic7CiAgICAkZGhjcHNldHRpbmdz eyJFTkFCTEVCT09UUF8ke2l0Zn0ifSA9ICdvZmYnOwogICAgJGRoY3BzZXR0aW5nc3siU1RBUlRf QUREUl8ke2l0Zn0ifSA9ICcnOwogICAgJGRoY3BzZXR0aW5nc3siRU5EX0FERFJfJHtpdGZ9In0g PSAnJzsKICAgICRkaGNwc2V0dGluZ3N7IkRPTUFJTl9OQU1FXyR7aXRmfSJ9ID0gJyc7CiAgICAk ZGhjcHNldHRpbmdzeyJERUZBVUxUX0xFQVNFX1RJTUVfJHtpdGZ9In0gPSAnJzsKICAgICRkaGNw c2V0dGluZ3N7Ik1BWF9MRUFTRV9USU1FXyR7aXRmfSJ9ID0gJyc7CiAgICAkZGhjcHNldHRpbmdz eyJXSU5TMV8ke2l0Zn0ifSA9ICcnOwogICAgJGRoY3BzZXR0aW5nc3siV0lOUzJfJHtpdGZ9In0g PSAnJzsKICAgICRkaGNwc2V0dGluZ3N7IkROUzFfJHtpdGZ9In0gPSAnJzsKICAgICRkaGNwc2V0 dGluZ3N7IkROUzJfJHtpdGZ9In0gPSAnJzsKICAgICRkaGNwc2V0dGluZ3N7Ik5UUDFfJHtpdGZ9 In0gPSAnJzsKICAgICRkaGNwc2V0dGluZ3N7Ik5UUDJfJHtpdGZ9In0gPSAnJzsKICAgICRkaGNw c2V0dGluZ3N7Ik5FWFRfJHtpdGZ9In0gPSAnJzsKICAgICRkaGNwc2V0dGluZ3N7IkZJTEVfJHtp dGZ9In0gPSAnJzsKICAgICRkaGNwc2V0dGluZ3N7IkROU19VUERBVEVfS0VZX05BTUVfJHtpdGZ9 In0gPSAnJzsKICAgICRkaGNwc2V0dGluZ3N7IkROU19VUERBVEVfS0VZX1NFQ1JFVF8ke2l0Zn0i fSA9ICcnOwogICAgJGRoY3BzZXR0aW5nc3siRE5TX1VQREFURV9LRVlfQUxHT18ke2l0Zn0ifSA9 ICcnOwogICAgJGRoY3BzZXR0aW5nc3siREhDUF9DTElFTlRTXyR7aXRmfSJ9ID0gJ0FMTE9XX0FM TF9DTElFTlRTJzsKfQoKJGRoY3BzZXR0aW5nc3snU09SVF9GTEVBU0VMSVNUJ30gPSAnRklQQURE Uic7CiRkaGNwc2V0dGluZ3N7J1NPUlRfTEVBU0VMSVNUJ30gPSAnSVBBRERSJzsKCiMgRE5TIFVw ZGF0ZSBzZXR0aW5ncwokZGhjcHNldHRpbmdzeydETlNfVVBEQVRFX0VOQUJMRUQnfSA9ICdvZmYn OwoKI1NldHRpbmdzMiBmb3IgZWRpdGluZyB0aGUgbXVsdGktbGluZSBsaXN0CiNNdXN0IG5vdCBi ZSBzYXZlZCB3aXRoIHdyaXRlaGFzaCAhCiRkaGNwc2V0dGluZ3N7J0ZJWF9NQUMnfSA9ICcnOwok ZGhjcHNldHRpbmdzeydGSVhfQUREUid9ID0gJyc7CiRkaGNwc2V0dGluZ3N7J0ZJWF9FTkFCTEVE J30gPSAnb2ZmJzsKJGRoY3BzZXR0aW5nc3snRklYX05FWFRBRERSJ30gPSAnJzsKJGRoY3BzZXR0 aW5nc3snRklYX0ZJTEVOQU1FJ30gPSAnJzsKJGRoY3BzZXR0aW5nc3snRklYX1JPT1RQQVRIJ30g PSAnJzsKJGRoY3BzZXR0aW5nc3snRklYX1JFTUFSSyd9ID0gJyc7CiRkaGNwc2V0dGluZ3N7J0FD VElPTid9ID0gJyc7CiRkaGNwc2V0dGluZ3N7J0tFWTEnfSA9ICcnOwokZGhjcHNldHRpbmdzeydL RVkyJ30gPSAnJzsKQG5vc2F2ZWQ9KCdGSVhfTUFDJywnRklYX0FERFInLCdGSVhfRU5BQkxFRCcs J0ZJWF9ORVhUQUREUicsCgkgICAgJ0ZJWF9GSUxFTkFNRScsJ0ZJWF9ST09UUEFUSCcsJ0ZJWF9S RU1BUksnKTsKCiRkaGNwc2V0dGluZ3N7J0FEVk9QVF9FTkFCTEVEJ30gPSAnJzsKJGRoY3BzZXR0 aW5nc3snQURWT1BUX05BTUUnfSA9ICcnOwokZGhjcHNldHRpbmdzeydBRFZPUFRfREFUQSd9ID0g Jyc7CnVuc2hpZnQgKEBub3NhdmVkLCdBRFZPUFRfRU5BQkxFRCcsJ0FEVk9QVF9OQU1FJywnQURW T1BUX0RBVEEnKTsKZm9yZWFjaCBteSAkaXRmIChASVRGcykgewogICAgJGRoY3BzZXR0aW5nc3si QURWT1BUX1NDT1BFXyR7aXRmfSJ9ID0gJ29mZic7CiAgICB1bnNoaWZ0IChAbm9zYXZlZCwgIkFE Vk9QVF9TQ09QRV8ke2l0Zn0iKTsKfQoKIyBSZWFkIElwY29wIHNldHRpbmdzCiZHZW5lcmFsOjpy ZWFkaGFzaCgiJHtHZW5lcmFsOjpzd3Jvb3R9L2V0aGVybmV0L3NldHRpbmdzIiwgXCVuZXRzZXR0 aW5ncyk7CiZHZW5lcmFsOjpyZWFkaGFzaCgiJHtHZW5lcmFsOjpzd3Jvb3R9L21haW4vc2V0dGlu Z3MiLCBcJW1haW5zZXR0aW5ncyk7CiZHZW5lcmFsOjpyZWFkaGFzaCgiJHtHZW5lcmFsOjpzd3Jv b3R9L3RpbWUvc2V0dGluZ3MiLCBcJXRpbWVzZXR0aW5ncyk7CiZHZW5lcmFsOjpyZWFkaGFzaCgi L3Nydi93ZWIvaXBmaXJlL2h0bWwvdGhlbWVzLyIuJG1haW5zZXR0aW5nc3snVEhFTUUnfS4iL2lu Y2x1ZGUvY29sb3JzLnR4dCIsIFwlY29sb3IpOwoKI0dldCBHVUkgdmFsdWVzCiZIZWFkZXI6Omdl dGNnaWhhc2goXCVkaGNwc2V0dGluZ3MpOwoKb3BlbihGSUxFLCAiJGZpbGVuYW1lMSIpIG9yIGRp ZSAnVW5hYmxlIHRvIG9wZW4gZGhjcCBhZHZhbmNlZCBvcHRpb25zIGZpbGUuJzsKb3VyIEBjdXJy ZW50MSA9IDxGSUxFPjsKY2xvc2UoRklMRSk7CiMgRXh0cmFjdCBPcHRpb25EZWZpbml0aW9uCmZv cmVhY2ggbXkgJGxpbmUgKEBjdXJyZW50MSkgewogICAgI2Nob21wKCRsaW5lKTsgICAjIHJlbW92 ZSBuZXdsaW5lICAgICAgICAjZG9uJ3Qga25vdyB3aHksIGJ1dCB0aGlzIHJlbW92ZSBuZXdsaW5l IGluIEBjdXJyZW50MSAuLi4uICEKICAgIG15IEB0ZW1wID0gc3BsaXQoL1x0LywkbGluZSk7CiAg ICBBZGROZXdPcHRpb25EZWZpbml0aW9uICgkdGVtcFsxXSAuICcgJyAuICR0ZW1wWzJdKTsKfQoK b3BlbihGSUxFLCAiJGZpbGVuYW1lMiIpIG9yIGRpZSAnVW5hYmxlIHRvIG9wZW4gZml4ZWQgbGVh c2VzIGZpbGUuJzsKb3VyIEBjdXJyZW50MiA9IDxGSUxFPjsKY2xvc2UoRklMRSk7CgojIENoZWNr IFNldHRpbmdzMSBmaXJzdCBiZWNhdXNlIHRoZXkgYXJlIG5lZWRlZCBieSAmYnVpbGRjb25mCmlm ICgkZGhjcHNldHRpbmdzeydBQ1RJT04nfSBlcSAkTGFuZzo6dHJ7J3NhdmUnfSkgewogICAgZm9y ZWFjaCBteSAkaXRmIChASVRGcykgewoJaWYgKCRkaGNwc2V0dGluZ3N7IkVOQUJMRV8ke2l0Zn0i fSBlcSAnb24nICkgewoJICAgICMgIlN0YXJ0IiBpcyBkZWZpbmVkLCBuZWVkICJFbmQiIGFuZCB2 aWNlIHZlcnNhCgkgICAgaWYgKCRkaGNwc2V0dGluZ3N7IlNUQVJUX0FERFJfJHtpdGZ9In0pIHsK CQlpZiAoISgmR2VuZXJhbDo6dmFsaWRpcCgkZGhjcHNldHRpbmdzeyJTVEFSVF9BRERSXyR7aXRm fSJ9KSkpIHsKCQkgICAgJGVycm9ybWVzc2FnZSA9ICJESENQIG9uICR7aXRmfTogIiAuICRMYW5n Ojp0cnsnaW52YWxpZCBzdGFydCBhZGRyZXNzJ307CgkJICAgIGdvdG8gRVJST1I7CgkJfQoJCWlm ICghJGRoY3BzZXR0aW5nc3siRU5EX0FERFJfJHtpdGZ9In0pIHsKCQkgICAgJGVycm9ybWVzc2Fn ZSA9ICJESENQIG9uICR7aXRmfTogIiAuICRMYW5nOjp0cnsnaW52YWxpZCBlbmQgYWRkcmVzcyd9 OwoJCSAgICBnb3RvIEVSUk9SOwoJCX0KCQlpZiAoISAmR2VuZXJhbDo6SXBJblN1Ym5ldCAoICRk aGNwc2V0dGluZ3N7IlNUQVJUX0FERFJfJHtpdGZ9In0sIAoJCQkJICAgICRuZXRzZXR0aW5nc3si JHtpdGZ9X05FVEFERFJFU1MifSwKCQkJCSAgICAkbmV0c2V0dGluZ3N7IiR7aXRmfV9ORVRNQVNL In0pKSB7CgkJICAgICRlcnJvcm1lc3NhZ2UgPSAiREhDUCBvbiAke2l0Zn06ICIgLiAkTGFuZzo6 dHJ7J2ludmFsaWQgc3RhcnQgYWRkcmVzcyd9OwoJCSAgICBnb3RvIEVSUk9SOwoJCX0KCSAgICB9 CgkgICAgCgkgICAgaWYgKCRkaGNwc2V0dGluZ3N7IkVORF9BRERSXyR7aXRmfSJ9KSB7CgkJaWYg KCEoJkdlbmVyYWw6OnZhbGlkaXAoJGRoY3BzZXR0aW5nc3siRU5EX0FERFJfJHtpdGZ9In0pKSkg ewoJCSAgICAkZXJyb3JtZXNzYWdlID0gIkRIQ1Agb24gJHtpdGZ9OiAiIC4gJExhbmc6OnRyeydp bnZhbGlkIGVuZCBhZGRyZXNzJ307CgkJICAgIGdvdG8gRVJST1I7CgkJfQoJCWlmICghJGRoY3Bz ZXR0aW5nc3siU1RBUlRfQUREUl8ke2l0Zn0ifSkgewoJCSAgICAkZXJyb3JtZXNzYWdlID0gIkRI Q1Agb24gJHtpdGZ9OiAiIC4gJExhbmc6OnRyeydpbnZhbGlkIHN0YXJ0IGFkZHJlc3MnfTsKCQkg ICAgZ290byBFUlJPUjsKCQl9CgkJaWYgKCEgJkdlbmVyYWw6OklwSW5TdWJuZXQgKCAkZGhjcHNl dHRpbmdzeyJFTkRfQUREUl8ke2l0Zn0ifSwgCgkJCQkgICAgJG5ldHNldHRpbmdzeyIke2l0Zn1f TkVUQUREUkVTUyJ9LAoJCQkJICAgICRuZXRzZXR0aW5nc3siJHtpdGZ9X05FVE1BU0sifSkpIHsg CgkJICAgICRlcnJvcm1lc3NhZ2UgPSAiREhDUCBvbiAke2l0Zn06ICIgLiAkTGFuZzo6dHJ7J2lu dmFsaWQgZW5kIGFkZHJlc3MnfTsKCQkgICAgZ290byBFUlJPUjsKCQl9CgkJI3N3YXAgaWYgbmVj ZXNzYXJ5ISAoc3VwcG9ydCAyNTUuMjU1LjAuMCByYW5nZSwgSSBkb3VidCB3ZSBuZWVkIG1vcmUp IEdFCgkJbXkgQHN0YXJ0b2N0ID0gc3BsaXQgKC9cLi8sICRkaGNwc2V0dGluZ3N7IlNUQVJUX0FE RFJfJHtpdGZ9In0pOwoJCW15IEBlbmRvY3QgICA9IHNwbGl0ICgvXC4vLCAkZGhjcHNldHRpbmdz eyJFTkRfQUREUl8ke2l0Zn0ifSk7CgkJaWYgKCAkZW5kb2N0WzJdKjI1NiskZW5kb2N0WzNdIDwg JHN0YXJ0b2N0WzJdKjI1Niskc3RhcnRvY3RbM10gKSB7CgkJICAgICgkZGhjcHNldHRpbmdzeyJT VEFSVF9BRERSXyR7aXRmfSJ9LCRkaGNwc2V0dGluZ3N7IkVORF9BRERSXyR7aXRmfSJ9KSA9CgkJ CSgkZGhjcHNldHRpbmdzeyJFTkRfQUREUl8ke2l0Zn0ifSwkZGhjcHNldHRpbmdzeyJTVEFSVF9B RERSXyR7aXRmfSJ9KTsKCQl9CgkgICAgfQoKCSAgICBpZiAoISgkZGhjcHNldHRpbmdzeyJERUZB VUxUX0xFQVNFX1RJTUVfJHtpdGZ9In0gPX4gL15cZCskLykpIHsKCQkkZXJyb3JtZXNzYWdlID0g IkRIQ1Agb24gJHtpdGZ9OiAiIC4gJExhbmc6OnRyeydpbnZhbGlkIGRlZmF1bHQgbGVhc2UgdGlt ZSd9IC4gJGRoY3BzZXR0aW5nc3snREVGQVVMVF9MRUFTRV9USU1FXyR7aXRmfSd9OwoJCWdvdG8g RVJST1I7CgkgICAgfQoKCSAgICBpZiAoISgkZGhjcHNldHRpbmdzeyJNQVhfTEVBU0VfVElNRV8k e2l0Zn0ifSA9fiAvXlxkKyQvKSkgewoJCSRlcnJvcm1lc3NhZ2UgPSAiREhDUCBvbiAke2l0Zn06 ICIgLiAkTGFuZzo6dHJ7J2ludmFsaWQgbWF4IGxlYXNlIHRpbWUnfSAuICRkaGNwc2V0dGluZ3N7 J01BWF9MRUFTRV9USU1FXyR7aXRmfSd9OwoJCWdvdG8gRVJST1I7CgkgICAgfQoKCSAgICBpZiAo JGRoY3BzZXR0aW5nc3siRE5TMV8ke2l0Zn0ifSkgewoJCWlmICghKCZHZW5lcmFsOjp2YWxpZGlw KCRkaGNwc2V0dGluZ3N7IkROUzFfJHtpdGZ9In0pKSkgewoJCQkkZXJyb3JtZXNzYWdlID0gIkRI Q1Agb24gJHtpdGZ9OiAiIC4gJExhbmc6OnRyeydpbnZhbGlkIHByaW1hcnkgZG5zJ307CgkJCWdv dG8gRVJST1I7CgkJfQoJICAgIH0KCSAgICBpZiAoJGRoY3BzZXR0aW5nc3siRE5TMl8ke2l0Zn0i fSkgewoJCWlmICghKCZHZW5lcmFsOjp2YWxpZGlwKCRkaGNwc2V0dGluZ3N7IkROUzJfJHtpdGZ9 In0pKSkgewoJCQkkZXJyb3JtZXNzYWdlID0gIkRIQ1Agb24gJHtpdGZ9OiAiIC4gJExhbmc6OnRy eydpbnZhbGlkIHNlY29uZGFyeSBkbnMnfTsKCQkJZ290byBFUlJPUjsKCQl9CgkJaWYgKCEgJGRo Y3BzZXR0aW5nc3siRE5TMV8ke2l0Zn0ifSkgewoJCQkkZXJyb3JtZXNzYWdlID0gIkRIQ1Agb24g JHtpdGZ9OiAiIC4gJExhbmc6OnRyeydjYW5ub3Qgc3BlY2lmeSBzZWNvbmRhcnkgZG5zIHdpdGhv dXQgc3BlY2lmeWluZyBwcmltYXJ5J307IAoJCQlnb3RvIEVSUk9SOwoJCX0KCSAgICB9CgoJICAg IGlmICgkZGhjcHNldHRpbmdzeyJXSU5TMV8ke2l0Zn0ifSkgewoJCWlmICghKCZHZW5lcmFsOjp2 YWxpZGlwKCRkaGNwc2V0dGluZ3N7IldJTlMxXyR7aXRmfSJ9KSkpIHsKCQkJJGVycm9ybWVzc2Fn ZSA9ICJESENQIG9uICR7aXRmfTogIiAuICRMYW5nOjp0cnsnaW52YWxpZCB3aW5zIGFkZHJlc3Mn fTsKCQkJZ290byBFUlJPUjsKCQl9CgkgICAgfQoJICAgIGlmICgkZGhjcHNldHRpbmdzeyJXSU5T Ml8ke2l0Zn0ifSkgewoJCWlmICghKCZHZW5lcmFsOjp2YWxpZGlwKCRkaGNwc2V0dGluZ3N7IldJ TlMyXyR7aXRmfSJ9KSkpCXsKCQkJJGVycm9ybWVzc2FnZSA9ICJESENQIG9uICR7aXRmfTogIiAu ICRMYW5nOjp0cnsnaW52YWxpZCB3aW5zIGFkZHJlc3MnfTsKCQkJZ290byBFUlJPUjsKCQl9CgkJ aWYgKCEgJGRoY3BzZXR0aW5nc3siV0lOUzFfJHtpdGZ9In0gKSB7CgkJCSRlcnJvcm1lc3NhZ2Ug PSAiREhDUCBvbiAke2l0Zn06ICIgLiAkTGFuZzo6dHJ7J2Nhbm5vdCBzcGVjaWZ5IHNlY29uZGFy eSB3aW5zIHdpdGhvdXQgc3BlY2lmeWluZyBwcmltYXJ5J307CgkJCWdvdG8gRVJST1I7CgkJfQkJ CgkgICAgfQoJICAgIGlmICgkZGhjcHNldHRpbmdzeyJORVhUXyR7aXRmfSJ9KSB7CgkJaWYgKCEo JkdlbmVyYWw6OnZhbGlkaXAoJGRoY3BzZXR0aW5nc3siTkVYVF8ke2l0Zn0ifSkpKSB7CgkJCSRl cnJvcm1lc3NhZ2UgPSAibmV4dC1zZXJ2ZXIgb24gJHtpdGZ9OiAiIC4gJExhbmc6OnRyeydpbnZh bGlkIGlwJ307CgkJCWdvdG8gRVJST1I7CgkJfQoJICAgIH0KCSAgICBpZiAoJGRoY3BzZXR0aW5n c3siTlRQMV8ke2l0Zn0ifSkgewoJCWlmICghKCZHZW5lcmFsOjp2YWxpZGlwKCRkaGNwc2V0dGlu Z3N7Ik5UUDFfJHtpdGZ9In0pKSkgewoJCQkkZXJyb3JtZXNzYWdlID0gIkRIQ1Agb24gJHtpdGZ9 OiAiIC4gJExhbmc6OnRyeydpbnZhbGlkIHByaW1hcnkgbnRwJ307CgkJCWdvdG8gRVJST1I7CgkJ fQoJCWlmICgkZGhjcHNldHRpbmdzeyJOVFAxXyR7aXRmfSJ9IGVxICRuZXRzZXR0aW5nc3siJHtp dGZ9X0FERFJFU1MifSAmJiAoJHRpbWVzZXR0aW5nc3snRU5BQkxFQ0xOVFAnfSBuZSAnb24nKSkg ewoJCQkkd2Fybk5UUG1lc3NhZ2UgPSAiREhDUCBvbiAke2l0Zn06ICIgLiAkTGFuZzo6dHJ7J2xv Y2FsIG50cCBzZXJ2ZXIgc3BlY2lmaWVkIGJ1dCBub3QgZW5hYmxlZCd9OwoJCQkjZ290byBFUlJP UjsKCQl9CgkgICAgfQoJICAgIGlmICgkZGhjcHNldHRpbmdzeyJOVFAyXyR7aXRmfSJ9KSB7CgkJ aWYgKCEoJkdlbmVyYWw6OnZhbGlkaXAoJGRoY3BzZXR0aW5nc3siTlRQMl8ke2l0Zn0ifSkpKSB7 CgkJCSRlcnJvcm1lc3NhZ2UgPSAiREhDUCBvbiAke2l0Zn06ICIgLiAkTGFuZzo6dHJ7J2ludmFs aWQgc2Vjb25kYXJ5IG50cCd9OwoJCQlnb3RvIEVSUk9SOwoJCX0KCQlpZiAoJGRoY3BzZXR0aW5n c3siTlRQMl8ke2l0Zn0ifSBlcSAkbmV0c2V0dGluZ3N7IiR7aXRmfV9BRERSRVNTIn0gJiYgKCR0 aW1lc2V0dGluZ3N7J0VOQUJMRUNMTlRQJ30gbmUgJ29uJykpIHsKCQkJJHdhcm5OVFBtZXNzYWdl ID0gIkRIQ1Agb24gJHtpdGZ9OiAiIC4gJExhbmc6OnRyeydsb2NhbCBudHAgc2VydmVyIHNwZWNp ZmllZCBidXQgbm90IGVuYWJsZWQnfTsKCQkJI2dvdG8gRVJST1I7CgkJfQoJCWlmICghICRkaGNw c2V0dGluZ3N7Ik5UUDFfJHtpdGZ9In0pIHsKCQkJJGVycm9ybWVzc2FnZSA9ICJESENQIG9uICR7 aXRmfTogIiAuICRMYW5nOjp0cnsnY2Fubm90IHNwZWNpZnkgc2Vjb25kYXJ5IG50cCB3aXRob3V0 IHNwZWNpZnlpbmcgcHJpbWFyeSd9OwoJCQlnb3RvIEVSUk9SOwoJCX0KCSAgICB9Cgl9ICMgZW5h YmxlZAogICAgfSNsb29wIGludGVyZmFjZSB2ZXJpZnkKCiAgICBtYXAgKGRlbGV0ZSAoJGRoY3Bz ZXR0aW5nc3skX30pICxAbm9zYXZlZCwnQUNUSU9OJywnS0VZMScsJ0tFWTInLCdxJyk7CSMgTXVz dCBub3QgYmUgc2F2ZWQKICAgICZHZW5lcmFsOjp3cml0ZWhhc2goJHNldHRpbmcsIFwlZGhjcHNl dHRpbmdzKTsJCSMgU2F2ZSBnb29kIHNldHRpbmdzCiAgICAkZGhjcHNldHRpbmdzeydBQ1RJT04n fSA9ICRMYW5nOjp0cnsnc2F2ZSd9OwkJIyBjcmVhdGUgYW4gJ0FDVElPTicKICAgIG1hcCAoJGRo Y3BzZXR0aW5nc3skX30gPSAnJyxAbm9zYXZlZCwnS0VZMScsJ0tFWTInKTsJIyBhbmQgcmVpbml0 IHZhcnMgdG8gZW1wdHkKICAgICZidWlsZGNvbmY7CiAgICBFUlJPUjogICAJCQkJCQkJIyBMZWF2 ZSB0aGUgZmF1bHR5IGZpZWxkIHVudG91Y2hlZAp9IGVsc2UgewogICAgJkdlbmVyYWw6OnJlYWRo YXNoKCRzZXR0aW5nLCBcJWRoY3BzZXR0aW5ncyk7ICAgCQkjIEdldCBzYXZlZCBzZXR0aW5ncyBh bmQgcmVzZXQgdG8gZ29vZCBpZiBuZWVkZWQKfQoKIyMgU29ydGluZyBvZiBmaXhlZCBsZWFzZXMK aWYgKCRFTlZ7J1FVRVJZX1NUUklORyd9ID1+IC9eRkVUSEVSfF5GSVBBRERSLyApIHsKICAgIG15 ICRuZXdzb3J0PSRFTlZ7J1FVRVJZX1NUUklORyd9OwogICAgbXkgJGFjdD0kZGhjcHNldHRpbmdz eydTT1JUX0ZMRUFTRUxJU1QnfTsKICAgICNSZXZlcnNlIGFjdHVhbCBzb3J0ID8KICAgIGlmICgk YWN0ID1+ICRuZXdzb3J0KSB7CglteSAkUmV2PScnOwoJaWYgKCRhY3QgIX4gJ1JldicpIHsKCSAg ICAkUmV2PSdSZXYnOwoJfQoJJG5ld3NvcnQuPSRSZXY7CiAgICB9CiAgICAkZGhjcHNldHRpbmdz eydTT1JUX0ZMRUFTRUxJU1QnfT0kbmV3c29ydDsKICAgIG1hcCAoZGVsZXRlICgkZGhjcHNldHRp bmdzeyRffSkgLEBub3NhdmVkLCdBQ1RJT04nLCdLRVkxJywnS0VZMicsICdxJyk7CSMgTXVzdCBu ZXZlciBiZSBzYXZlZAogICAgJkdlbmVyYWw6OndyaXRlaGFzaCgkc2V0dGluZywgXCVkaGNwc2V0 dGluZ3MpOwogICAgJnNvcnRjdXJyZW50MjsKICAgICRkaGNwc2V0dGluZ3N7J0FDVElPTid9ID0g J1NPUlQnOwkJCSMgY3JlYXRlIGFuICdBQ1RJT04nCiAgICBtYXAgKCRkaGNwc2V0dGluZ3N7JF99 ID0gJycsQG5vc2F2ZWQsJ0tFWTEnLCdLRVkyJyk7IyBhbmQgcmVpbml0IHZhcnMgdG8gZW1wdHkg Cn0KCiNTb3J0aW5nIG9mIGFsbG9jYXRlZCBsZWFzZXMKJkhlYWRlcjo6Q2hlY2tTb3J0T3JkZXI7 CgoKIyMgTm93IG1hbmlwdWxhdGUgdGhlIHR3byBtdWx0aS1saW5lIGxpc3Qgd2l0aCBTZXR0aW5n czIuIAojICAnMScgc3VmZml4IGlzIGZvciBBRFZBTkNFRCBPUFRJT05TCiMgICcyJyBzdWZmaXgg aXMgZm9yIEZJWEVEIExFQVNFUwoKIyBUb2dnbGUgZW5hYmxlL2Rpc2FibGUgZmllbGQgb24gc3Bl Y2lmaWVkIG9wdGlvbnMuCgppZiAoJGRoY3BzZXR0aW5nc3snQUNUSU9OJ30gZXEgJExhbmc6OnRy eyd0b2dnbGUgZW5hYmxlIGRpc2FibGUnfS4nMScpIHsKICAgICNtb3ZlIG91dCBuZXcgbGluZQog ICAgY2hvbXAoQGN1cnJlbnQxWyRkaGNwc2V0dGluZ3N7J0tFWTEnfV0pOwogICAgbXkgQHRlbXAg PSBzcGxpdCgvXHQvLEBjdXJyZW50MVskZGhjcHNldHRpbmdzeydLRVkxJ31dKTsJCSN1c2UgVEFC IHNlcGFyYXRvciAhCiAgICAkdGVtcFswXSA9ICR0ZW1wWzBdIGVxICdvbicgPyAnJyA6ICdvbic7 ICAgICMgVG9nZ2xlIHRoZSBmaWVsZAogICAgQGN1cnJlbnQxWyRkaGNwc2V0dGluZ3N7J0tFWTEn fV0gPSBqb2luICgiXHQiLEB0ZW1wKS4iXG4iOwogICAgJGRoY3BzZXR0aW5nc3snS0VZMSd9ID0g Jyc7ICMgRW5kIGVkaXQgbW9kZQogICAgJkdlbmVyYWw6OmxvZygkTGFuZzo6dHJ7J2RoY3AgYWR2 b3B0IG1vZGlmaWVkJ30pOwogICAgb3BlbihGSUxFLCAiPiRmaWxlbmFtZTEiKSBvciBkaWUgJ1Vu YWJsZSB0byBvcGVuIGRoY3AgYWR2YW5jZWQgb3B0aW9ucyBmaWxlLic7CiAgICBwcmludCBGSUxF IEBjdXJyZW50MTsKICAgIGNsb3NlKEZJTEUpOwoJCiAgICAjV3JpdGUgY2hhbmdlcyB0byBkaGNw ZC5jb25mLgogICAgJmJ1aWxkY29uZjsKfQoKICAgIAoKaWYgKCRkaGNwc2V0dGluZ3N7J0FDVElP Tid9IGVxICRMYW5nOjp0cnsnYWRkJ30uJzEnICYmCgkkZGhjcHNldHRpbmdzeydTVUJNSVQnfSBu ZSAkTGFuZzo6dHJ7J2RoY3AgYWR2b3B0IGhlbHAnfSkgewogICAgJGRoY3BzZXR0aW5nc3snQURW T1BUX05BTUUnfSA9fiBzL1teIFx3LV0vL2c7ICAJIyBwcmV2ZW50IGV4ZWN1dGlvbiBvZiBjb2Rl IGJ5IHJlbW92aW5nIGV2ZXJ5dGhpbmcgZXhjZXB0IGxldHRlcnMvc3BhY2UKICAgICRkaGNwc2V0 dGluZ3N7J0FEVk9QVF9EQVRBJ30gPX4gcy9gLy9nOwkJIyBiYWNrIHRpayBgID8gbm90IGFsbG93 ZWQgIQoKICAgIGlmICgkZGhjcHNldHRpbmdzeydBRFZPUFRfREFUQSd9IGVxICcnKSB7CgkkZXJy b3JtZXNzYWdlPSRMYW5nOjp0cnsnZGhjcCBhZHZvcHQgYmxhbmsgdmFsdWUnfTsKICAgIH0KICAg IAogICAgIyBUZXN0IGZvciBhIG5ldyBvcHRpb24gZGVmaW5pdGlvbiBzdHJpbmcgKGpvaW4gZmll bGQgbmFtZSAmIGRhdGEpCiAgICBpZiAoRXhpc3ROZXdPcHRpb25EZWZpbml0aW9uICgkZGhjcHNl dHRpbmdzeydBRFZPUFRfTkFNRSd9IC4gJyAnIC4gJGRoY3BzZXR0aW5nc3snQURWT1BUX0RBVEEn fSkpIHsKCSNvbmx5IGVkaXQgcGVybWl0dGVkIGlmIG9wdGlvbiBkZWZpbml0aW9uIGV4aXN0cwoJ JGVycm9ybWVzc2FnZSA9ICRMYW5nOjp0cnsnZGhjcCBhZHZvcHQgZGVmaW5pdGlvbiBleGlzdHMn fSBpZiAoJGRoY3BzZXR0aW5nc3snS0VZMSd9IGVxICcnKTsKCSRkaGNwc2V0dGluZ3N7J0FEVk9Q VF9FTkFCTEVEJ30gPSAnb24nOwkJCSMgZm9yY2UgYWN0aXZlCgltYXAgKCRkaGNwc2V0dGluZ3N7 IkFEVk9QVF9TQ09QRV8kXyJ9ID0gJ29mZicsIEBJVEZzKTsJIyBmb3JjZSBnbG9iYWwKICAgIH0g ZWxzaWYgKEFkZE5ld09wdGlvbkRlZmluaXRpb24gKCRkaGNwc2V0dGluZ3N7J0FEVk9QVF9OQU1F J30gLiAnICcgLiAkZGhjcHNldHRpbmdzeydBRFZPUFRfREFUQSd9KSkgewoJI3dhcyBhIG5ldyBv cHRpb24gZGVmaW5pdGlvbgoJJGRoY3BzZXR0aW5nc3snQURWT1BUX0VOQUJMRUQnfSA9ICdvbic7 CQkJIyBmb3JjZSBhY3RpdmUKCW1hcCAoJGRoY3BzZXR0aW5nc3siQURWT1BUX1NDT1BFXyRfIn0g PSAnb2ZmJywgQElURnMpOwkjIGZvcmNlIGdsb2JhbAogICAgfSBlbHNpZiAoVmFsaWROZXdPcHRp b24gKCRkaGNwc2V0dGluZ3N7J0FEVk9QVF9OQU1FJ30gLiAnICcgLiAkZGhjcHNldHRpbmdzeydB RFZPUFRfREFUQSd9KSkgewoJI3dhcyBhIG5ldyBvcHRpb24KICAgIH0gZWxzaWYgKCEgYGdyZXAg Ilwkb3B0aW9uICRkaGNwc2V0dGluZ3N7J0FEVk9QVF9OQU1FJ30gIiAkZmlsZW5hbWUzYCkgewoJ JGVycm9ybWVzc2FnZT0kTGFuZzo6dHJ7J2RoY3AgYWR2b3B0IHVua25vd24nfS4nOiAnLiRkaGNw c2V0dGluZ3N7J0FEVk9QVF9OQU1FJ307CiAgICB9CgogICAgdW5sZXNzICgkZXJyb3JtZXNzYWdl KSB7CgkKCW15ICRzY29wZSA9ICcnOwoJZm9yZWFjaCBteSAkaXRmIChASVRGcykgeyAgIyBidWls cyAiUkVELEdSRUVOLE9SQU5HRSwuLi4gYmFzZWQgb24gc2VsZWN0aW9uCgkgICAgJHNjb3BlIC49 ICRkaGNwc2V0dGluZ3N7IkFEVk9QVF9TQ09QRV8ke2l0Zn0ifSBlcSAnb24nID8gIlx0JGl0ZiIg OiAiXHRvZmYiIDsKCX0KCWlmICgkZGhjcHNldHRpbmdzeydLRVkxJ30gZXEgJycpIHsgI2FkZCBv ciBlZGl0ID8gIFRBQiBzZXBhcmF0b3IgIQoJICAgIHVuc2hpZnQgKEBjdXJyZW50MSwgIiRkaGNw c2V0dGluZ3N7J0FEVk9QVF9FTkFCTEVEJ31cdCRkaGNwc2V0dGluZ3N7J0FEVk9QVF9OQU1FJ31c dCRkaGNwc2V0dGluZ3N7J0FEVk9QVF9EQVRBJ30kc2NvcGVcbiIpOwoJICAgICZHZW5lcmFsOjps b2coJExhbmc6OnRyeydkaGNwIGFkdm9wdCBhZGRlZCd9KTsKCX0gZWxzZSB7CgkgICAgQGN1cnJl bnQxWyRkaGNwc2V0dGluZ3N7J0tFWTEnfV0gPSAiJGRoY3BzZXR0aW5nc3snQURWT1BUX0VOQUJM RUQnfVx0JGRoY3BzZXR0aW5nc3snQURWT1BUX05BTUUnfVx0JGRoY3BzZXR0aW5nc3snQURWT1BU X0RBVEEnfSRzY29wZVxuIjsKCSAgICAkZGhjcHNldHRpbmdzeydLRVkxJ30gPSAnJzsgICAgICAg IyBFbmQgZWRpdCBtb2RlCgkgICAgJkdlbmVyYWw6OmxvZygkTGFuZzo6dHJ7J2RoY3AgYWR2b3B0 IG1vZGlmaWVkJ30pOwoJfQoKICAgICAgICAjV3JpdGUgY2hhbmdlcyB0byBkaGNwZC5jb25mLgog ICAgICAgICZzb3J0Y3VycmVudDE7ICAgICMgc29ydCBuZXdseSBhZGRlZC9tb2RpZmllZCBlbnRy eQogICAgICAgICZidWlsZGNvbmY7ICAgICAgICMgYmVmb3JlIGNhbGxpbmcgYnVpbGRjb25mIHdo aWNoIHVzZSBmaXhlZCBsZWFzZSBmaWxlICEKICAgIH0KfQoKaWYgKCRkaGNwc2V0dGluZ3N7J0FD VElPTid9IGVxICRMYW5nOjp0cnsnZWRpdCd9LicxJykgewogICAgI21vdmUgb3V0IG5ldyBsaW5l CiAgICBteSAkbGluZSA9IEBjdXJyZW50MVskZGhjcHNldHRpbmdzeydLRVkxJ31dOwogICAgY2hv bXAoJGxpbmUpOwogICAgbXkgQHRlbXAgPSBzcGxpdCgvXHQvLCAkbGluZSk7CiAgICAkZGhjcHNl dHRpbmdzeydBRFZPUFRfRU5BQkxFRCd9PSR0ZW1wWzBdOwogICAgJGRoY3BzZXR0aW5nc3snQURW T1BUX05BTUUnfT0kdGVtcFsxXTsKICAgICRkaGNwc2V0dGluZ3N7J0FEVk9QVF9EQVRBJ309JHRl bXBbMl07CgogICAgIyByZWFkIG5leHQgZmllbGRzIHdoaWNoIGFyZSB0aGUgbmFtZSAoY29sb3Ip IG9mIGFuIGludGVyZmFjZSBpZiB0aGlzIGludGVyZmFjZSBpcyBzY29wZWQKICAgIGZvciAobXkg JGtleT0wOyAka2V5PEBJVEZzOyAka2V5KyspIHsKCW15ICRpdGYgPSAkdGVtcFszKyRrZXldOwoJ aWYgKCRpdGYgbmUgJ29mZicpICMgT25seSBpcyBhbiBpbnRlcmZhY2UgbmFtZSBpcyByZWFkCgl7 CgkgICAgJGRoY3BzZXR0aW5nc3siQURWT1BUX1NDT1BFXyR7aXRmfSJ9ID0gJ29uJzsKCX0gICAg CiAgICB9Cn0KCmlmICgkZGhjcHNldHRpbmdzeydBQ1RJT04nfSBlcSAkTGFuZzo6dHJ7J3JlbW92 ZSd9LicxJykgewogICAgc3BsaWNlIChAY3VycmVudDEsJGRoY3BzZXR0aW5nc3snS0VZMSd9LDEp OwogICAgb3BlbihGSUxFLCAiPiRmaWxlbmFtZTEiKSBvciBkaWUgJ1VuYWJsZSB0byBvcGVuIGRo Y3AgYWR2YW5jZWQgb3B0aW9ucyBmaWxlLic7CiAgICBwcmludCBGSUxFIEBjdXJyZW50MTsKICAg IGNsb3NlKEZJTEUpOwogICAgJGRoY3BzZXR0aW5nc3snS0VZMSd9ID0gJyc7CQkJCSMgRW5kIHJl bW92ZSBtb2RlCiAgICAmR2VuZXJhbDo6bG9nKCRMYW5nOjp0cnsnZGhjcCBhZHZvcHQgcmVtb3Zl ZCd9KTsKICAgICNXcml0ZSBjaGFuZ2VzIHRvIGRoY3BkLmNvbmYuCiAgICAmYnVpbGRjb25mOwp9 CiNlbmQgS0VZMQoKCiMgVG9nZ2xlIGVuYWJsZS9kaXNhYmxlIGZpZWxkIG9uIHNwZWNpZmllZCBs ZWFzZS4KaWYgKCRkaGNwc2V0dGluZ3N7J0FDVElPTid9IGVxICRMYW5nOjp0cnsndG9nZ2xlIGVu YWJsZSBkaXNhYmxlJ30uJzInKSB7CiAgICAjbW92ZSBvdXQgbmV3IGxpbmUKICAgIGNob21wKEBj dXJyZW50MlskZGhjcHNldHRpbmdzeydLRVkyJ31dKTsKICAgIG15IEB0ZW1wID0gc3BsaXQoL1ws LyxAY3VycmVudDJbJGRoY3BzZXR0aW5nc3snS0VZMid9XSk7CiAgICAkdGVtcFsyXSA9ICR0ZW1w WzJdIGVxICdvbicgPyAnJyA6ICdvbic7ICAgICMgVG9nZ2xlIHRoZSBmaWVsZAogICAgQGN1cnJl bnQyWyRkaGNwc2V0dGluZ3N7J0tFWTInfV0gPSBqb2luICgnLCcsQHRlbXApLiJcbiI7CiAgICAk ZGhjcHNldHRpbmdzeydLRVkyJ30gPSAnJzsgIyBFbmQgZWRpdCBtb2RlCiAgICAmR2VuZXJhbDo6 bG9nKCRMYW5nOjp0cnsnZml4ZWQgaXAgbGVhc2UgbW9kaWZpZWQnfSk7CiAgICBvcGVuKEZJTEUs ICI+JGZpbGVuYW1lMiIpIG9yIGRpZSAnVW5hYmxlIHRvIG9wZW4gZml4ZWQgbGVhc2VzIGZpbGUu JzsKICAgIHByaW50IEZJTEUgQGN1cnJlbnQyOwogICAgY2xvc2UoRklMRSk7CgkKICAgICNXcml0 ZSBjaGFuZ2VzIHRvIGRoY3BkLmNvbmYuCiAgICAmYnVpbGRjb25mOwp9CgppZiAoJGRoY3BzZXR0 aW5nc3snQUNUSU9OJ30gZXEgJExhbmc6OnRyeydhZGQnfS4nMicpIHsKICAgICRkaGNwc2V0dGlu Z3N7J0ZJWF9NQUMnfSA9fiB0ci8tLzovOwogICAgdW5sZXNzKCZHZW5lcmFsOjp2YWxpZGlwKCRk aGNwc2V0dGluZ3N7J0ZJWF9BRERSJ30pKSB7ICRlcnJvcm1lc3NhZ2UgPSAkTGFuZzo6dHJ7J2lu dmFsaWQgZml4ZWQgaXAgYWRkcmVzcyd9OyB9CiAgICB1bmxlc3MoJkdlbmVyYWw6OnZhbGlkbWFj KCRkaGNwc2V0dGluZ3N7J0ZJWF9NQUMnfSkpIHsgJGVycm9ybWVzc2FnZSA9ICRMYW5nOjp0cnsn aW52YWxpZCBmaXhlZCBtYWMgYWRkcmVzcyd9OyB9CiAgICBpZiAoJGRoY3BzZXR0aW5nc3snRklY X05FWFRBRERSJ30pIHsKICAgICAgICB1bmxlc3MoJkdlbmVyYWw6OnZhbGlkaXAoJGRoY3BzZXR0 aW5nc3snRklYX05FWFRBRERSJ30pKSB7ICRlcnJvcm1lc3NhZ2UgPSAkTGFuZzo6dHJ7J2ludmFs aWQgZml4ZWQgaXAgYWRkcmVzcyd9OyB9CiAgICB9CgkKICAgIG15ICRrZXkgPSAwOwogICAgQ0hF Q0s6Zm9yZWFjaCBteSAkbGluZSAoQGN1cnJlbnQyKSB7CiAgICAgICAgbXkgQHRlbXAgPSBzcGxp dCgvXCwvLCRsaW5lKTsKICAgICAgICBpZigkZGhjcHNldHRpbmdzeydLRVkyJ30gbmUgJGtleSkg ewogCSAgICAjIHNhbWUgTUFDIGlzIE9LIG9uIGRpZmZlcmVudCBzdWJuZXRzLiBUaGlzIHRlc3Qg aXMgbm90IGNvbXBsZXRlIGJlY2F1c2UKCSAgICAjIGlmIGlwIGFyZSBub3QgaW5zaWRlIGEga25v d24gc3VibmV0LCBJIGRvbid0IHdhcm4uCgkgICAgIyBBbHNvIGl0IG1heSBiZSBuZWVkZWQgdG8g cHV0IGR1cGxpY2F0ZSBmaXhlZCBsZWFzZSBpbiB0aGVpciByaWdodCBzdWJuZXQgZGVmaW5pdGlv bi4uCgkgICAgZm9yZWFjaCBteSAkaXRmIChASVRGcykgewoJCW15ICRzY29wZWQgPSAmR2VuZXJh bDo6SXBJblN1Ym5ldCgkZGhjcHNldHRpbmdzeydGSVhfQUREUid9LAoJCQkJCQkgICRuZXRzZXR0 aW5nc3siJHtpdGZ9X05FVEFERFJFU1MifSwgCgkJCQkJCSAgJG5ldHNldHRpbmdzeyIke2l0Zn1f TkVUTUFTSyJ9KSAmJgoJCQkJCQkgICRkaGNwc2V0dGluZ3N7IkVOQUJMRV8ke2l0Zn0ifSBlcSAn b24nOwoJCWlmICggJHNjb3BlZCAmJgoJCSAgICAobGMoJGRoY3BzZXR0aW5nc3snRklYX01BQyd9 KSBlcSBsYygkdGVtcFswXSkpICYmCgkJICAgICZHZW5lcmFsOjpJcEluU3VibmV0KCR0ZW1wWzFd LAoJCQkJCSAkbmV0c2V0dGluZ3N7IiR7aXRmfV9ORVRBRERSRVNTIn0sIAoJCQkJCSAkbmV0c2V0 dGluZ3N7IiR7aXRmfV9ORVRNQVNLIn0pKSB7CgkJICAgICRlcnJvcm1lc3NhZ2UgPSAiJExhbmc6 OnRyeydtYWMgYWRkcmVzcyBpbiB1c2UnfSAkZGhjcHNldHRpbmdzeydGSVhfTUFDJ30iOwoJCSAg ICBsYXN0IENIRUNLOwoJCX0KCSAgICB9Cgl9Cgkka2V5Kys7CiAgICB9CgogICAgdW5sZXNzICgk ZXJyb3JtZXNzYWdlKSB7CgkkZGhjcHNldHRpbmdzeydGSVhfUkVNQVJLJ30gPSAmSGVhZGVyOjpj bGVhbmh0bWwoJGRoY3BzZXR0aW5nc3snRklYX1JFTUFSSyd9KTsKCSRkaGNwc2V0dGluZ3N7J0ZJ WF9ORVhUQUREUid9ID0gJkhlYWRlcjo6Y2xlYW5odG1sKCRkaGNwc2V0dGluZ3N7J0ZJWF9ORVhU QUREUid9KTsKCSRkaGNwc2V0dGluZ3N7J0ZJWF9GSUxFTkFNRSd9ID0gJkhlYWRlcjo6Y2xlYW5o dG1sKCRkaGNwc2V0dGluZ3N7J0ZJWF9GSUxFTkFNRSd9KTsKCSRkaGNwc2V0dGluZ3N7J0ZJWF9S T09UUEFUSCd9ID0gJkhlYWRlcjo6Y2xlYW5odG1sKCRkaGNwc2V0dGluZ3N7J0ZJWF9ST09UUEFU SCd9KTsKCWlmICgkZGhjcHNldHRpbmdzeydLRVkyJ30gZXEgJycpIHsgI2FkZCBvciBlZGl0ID8K CSAgICB1bnNoaWZ0IChAY3VycmVudDIsICIkZGhjcHNldHRpbmdzeydGSVhfTUFDJ30sJGRoY3Bz ZXR0aW5nc3snRklYX0FERFInfSwkZGhjcHNldHRpbmdzeydGSVhfRU5BQkxFRCd9LCRkaGNwc2V0 dGluZ3N7J0ZJWF9ORVhUQUREUid9LCRkaGNwc2V0dGluZ3N7J0ZJWF9GSUxFTkFNRSd9LCRkaGNw c2V0dGluZ3N7J0ZJWF9ST09UUEFUSCd9LCRkaGNwc2V0dGluZ3N7J0ZJWF9SRU1BUksnfVxuIik7 CgkgICAgb3BlbihGSUxFLCAiPiRmaWxlbmFtZTIiKSBvciBkaWUgJ1VuYWJsZSB0byBvcGVuIGZp eGVkIGxlYXNlIGZpbGUuJzsKCSAgICBwcmludCBGSUxFIEBjdXJyZW50MjsKCSAgICBjbG9zZShG SUxFKTsKCSAgICAmR2VuZXJhbDo6bG9nKCRMYW5nOjp0cnsnZml4ZWQgaXAgbGVhc2UgYWRkZWQn fSk7CgoJICAgICMgRW50ZXIgZWRpdCBtb2RlCgkgICAgJGRoY3BzZXR0aW5nc3snS0VZMid9ID0g MDsKCX0gZWxzZSB7CgkgICAgQGN1cnJlbnQyWyRkaGNwc2V0dGluZ3N7J0tFWTInfV0gPSAiJGRo Y3BzZXR0aW5nc3snRklYX01BQyd9LCRkaGNwc2V0dGluZ3N7J0ZJWF9BRERSJ30sJGRoY3BzZXR0 aW5nc3snRklYX0VOQUJMRUQnfSwkZGhjcHNldHRpbmdzeydGSVhfTkVYVEFERFInfSwkZGhjcHNl dHRpbmdzeydGSVhfRklMRU5BTUUnfSwkZGhjcHNldHRpbmdzeydGSVhfUk9PVFBBVEgnfSwkZGhj cHNldHRpbmdzeydGSVhfUkVNQVJLJ31cbiI7CgkgICAgJGRoY3BzZXR0aW5nc3snS0VZMid9ID0g Jyc7ICAgICAgICMgRW5kIGVkaXQgbW9kZQoJICAgICZHZW5lcmFsOjpsb2coJExhbmc6OnRyeydm aXhlZCBpcCBsZWFzZSBtb2RpZmllZCd9KTsKCgkgICAgIyBzb3J0IG5ld2x5IGFkZGVkL21vZGlm aWVkIGVudHJ5CgkgICAgJnNvcnRjdXJyZW50MjsKCX0KCiAgICAgICAgI1dyaXRlIGNoYW5nZXMg dG8gZGhjcGQuY29uZi4KICAgICAgICAmYnVpbGRjb25mOyAgICAgICAjIGJlZm9yZSBjYWxsaW5n IGJ1aWxkY29uZiB3aGljaCB1c2UgZml4ZWQgbGVhc2UgZmlsZSAhCiAgICB9Cn0KCmlmICgkZGhj cHNldHRpbmdzeydBQ1RJT05fQUxMJ30gZXEgJysnKSB7CiAgICBteSAkbmV3cyA9IDA7CiAgICBm b3JlYWNoIChrZXlzICVkaGNwc2V0dGluZ3MpIHsKICAgICAgICBpZiAoL14oXGQrXC5cZCtcLlxk K1wuXGQrKS0oWzAtOWEtZkEtRjpdKykkLykgeyAgICAgIyBjaGVja2VkIG5hbWVzIGFyZSBpbmRl eCBvZiB0aGUgbGluZQogICAgICAgICAgICBteSAkaXA9JDE7CiAgICAgICAgICAgIG15ICRtYWM9 JDI7CiAgICAgICAgICAgIGlmICghZ3JlcCAoLyQyLyxAY3VycmVudDIpKSB7CiAgICAgICAgICAg ICAgICB1bnNoaWZ0IChAY3VycmVudDIsICIkbWFjLCRpcCxvbiwsLCxpbXBvcnRlZFxuIik7CiAg ICAgICAgICAgICAgICAkbmV3cysrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAg aWYgKCRuZXdzKSB7CiAgICAgICAgI1dyaXRlIGNoYW5nZXMgdG8gZGhjcGQuY29uZi4KICAgICAg ICAkd2Fybk5UUG1lc3NhZ2UgPSAkTGFuZzo6dHJ7J2ZpeGVkIGlwIGxlYXNlIGFkZGVkJ30uIigk bmV3cykiOwogICAgICAgICZHZW5lcmFsOjpsb2coJHdhcm5OVFBtZXNzYWdlKTsKICAgICAgICAm c29ydGN1cnJlbnQyOyAgICAjIHNvcnQgbmV3bHkgYWRkZWQvbW9kaWZpZWQgZW50cnkKICAgICAg ICAmYnVpbGRjb25mOyAgICAgICAjIGJlZm9yZSBjYWxsaW5nIGJ1aWxkY29uZiB3aGljaCB1c2Ug Zml4ZWQgbGVhc2UgZmlsZSAhCiAgICB9Cn0KCmlmICgkZGhjcHNldHRpbmdzeydBQ1RJT04nfSBl cSAkTGFuZzo6dHJ7J2VkaXQnfS4nMicpIHsKICAgICNtb3ZlIG91dCBuZXcgbGluZQogICAgbXkg JGxpbmUgPSBAY3VycmVudDJbJGRoY3BzZXR0aW5nc3snS0VZMid9XTsKICAgIGNob21wKCRsaW5l KTsKICAgIG15IEB0ZW1wID0gc3BsaXQoL1wsLywgJGxpbmUpOwogICAgJGRoY3BzZXR0aW5nc3sn RklYX01BQyd9PSR0ZW1wWzBdOwogICAgJGRoY3BzZXR0aW5nc3snRklYX0FERFInfT0kdGVtcFsx XTsKICAgICRkaGNwc2V0dGluZ3N7J0ZJWF9FTkFCTEVEJ309JHRlbXBbMl07CiAgICAkZGhjcHNl dHRpbmdzeydGSVhfTkVYVEFERFInfT0kdGVtcFszXTsKICAgICRkaGNwc2V0dGluZ3N7J0ZJWF9G SUxFTkFNRSd9PSR0ZW1wWzRdOwogICAgJGRoY3BzZXR0aW5nc3snRklYX1JPT1RQQVRIJ309JHRl bXBbNV07CiAgICAkZGhjcHNldHRpbmdzeydGSVhfUkVNQVJLJ309JHRlbXBbNl07Cn0KCmlmICgk ZGhjcHNldHRpbmdzeydBQ1RJT04nfSBlcSAkTGFuZzo6dHJ7J3JlbW92ZSd9LicyJykgewogICAg c3BsaWNlIChAY3VycmVudDIsJGRoY3BzZXR0aW5nc3snS0VZMid9LDEpOwogICAgb3BlbihGSUxF LCAiPiRmaWxlbmFtZTIiKSBvciBkaWUgJ1VuYWJsZSB0byBvcGVuIGZpeGVkIGxlYXNlIGZpbGUu JzsKICAgIHByaW50IEZJTEUgQGN1cnJlbnQyOwogICAgY2xvc2UoRklMRSk7CiAgICAkZGhjcHNl dHRpbmdzeydLRVkyJ30gPSAnJzsJCQkJIyBFbmQgcmVtb3ZlIG1vZGUKICAgICZHZW5lcmFsOjps b2coJExhbmc6OnRyeydmaXhlZCBpcCBsZWFzZSByZW1vdmVkJ30pOwogICAgI1dyaXRlIGNoYW5n ZXMgdG8gZGhjcGQuY29uZi4KICAgICZidWlsZGNvbmY7Cn0KI2VuZCBLRVkyIGRlZmluZWQKCgoK CmlmICgkZGhjcHNldHRpbmdzeydBQ1RJT04nfSBlcSAnJyApIHsgIyBGaXJzdCBsYXVuY2ggZnJv bSBHVUkKCiAgICAjIFNldCBkZWZhdWx0IERIQ1AgdmFsdWVzIG9ubHkgaWYgYmxhbmsgYW5kIGRp c2FibGVkCiAgICBmb3JlYWNoIG15ICRpdGYgKEBJVEZzKSB7CglpZiAoJGRoY3BzZXR0aW5nc3si RU5BQkxFXyR7aXRmfSJ9IG5lICdvbicgKSB7CgkgICAgJGRoY3BzZXR0aW5nc3siRE5TMV8ke2l0 Zn0ifSA9ICRuZXRzZXR0aW5nc3siJHtpdGZ9X0FERFJFU1MifTsKCSAgICAkZGhjcHNldHRpbmdz eyJERUZBVUxUX0xFQVNFX1RJTUVfJHtpdGZ9In0gPSAnNjAnOwoJICAgICRkaGNwc2V0dGluZ3N7 Ik1BWF9MRUFTRV9USU1FXyR7aXRmfSJ9ID0gJzEyMCc7CgkgICAgJGRoY3BzZXR0aW5nc3siRE9N QUlOX05BTUVfJHtpdGZ9In0gPSAkbWFpbnNldHRpbmdzeydET01BSU5OQU1FJ307Cgl9CiAgICB9 CiAgICAkZGhjcHNldHRpbmdzeydGSVhfRU5BQkxFRCd9ID0gJ29uJzsKfQoKJkhlYWRlcjo6b3Bl bnBhZ2UoJExhbmc6OnRyeydkaGNwIGNvbmZpZ3VyYXRpb24nfSwgMSwgJycpOwomSGVhZGVyOjpv cGVuYmlnYm94KCcxMDAlJywgJ2xlZnQnLCAnJywgJGVycm9ybWVzc2FnZSk7CgppZiAoJGVycm9y bWVzc2FnZSkgewogICAgJkhlYWRlcjo6b3BlbmJveCgnMTAwJScsICdsZWZ0JywgJExhbmc6OnRy eydlcnJvciBtZXNzYWdlcyd9KTsKICAgIHByaW50ICI8Zm9udCBjbGFzcz0nYmFzZSc+JGVycm9y bWVzc2FnZSZuYnNwOzwvZm9udD5cbiI7CiAgICAmSGVhZGVyOjpjbG9zZWJveCgpOwp9CmlmICgk d2Fybk5UUG1lc3NhZ2UpIHsKICAgICR3YXJuTlRQbWVzc2FnZSA9ICI8Zm9udCBjb2xvcj0ke0hl YWRlcjo6Y29sb3VycmVkfT48Yj4kTGFuZzo6dHJ7J2NhcHN3YXJuaW5nJ308L2I+PC9mb250Pjog JHdhcm5OVFBtZXNzYWdlIjsKfQoKJkhlYWRlcjo6b3BlbmJveCgnMTAwJScsICdsZWZ0JywgJ0RI Q1AnKTsKcHJpbnQgIjxmb3JtIG1ldGhvZD0ncG9zdCcgYWN0aW9uPSckRU5WeydTQ1JJUFRfTkFN RSd9Jz4iOwoKZm9yZWFjaCBteSAkaXRmIChASVRGcykgewogICAgbXkgJWNoZWNrZWQ9KCk7CiAg ICAkY2hlY2tlZHsnRU5BQkxFJ317J29uJ30gPSAoICRkaGNwc2V0dGluZ3N7IkVOQUJMRV8ke2l0 Zn0ifSBuZSAnb24nKSA/ICcnIDogImNoZWNrZWQ9J2NoZWNrZWQnIjsKICAgICRjaGVja2VkeydF TkFCTEVCT09UUCd9eydvbid9ID0gKCAkZGhjcHNldHRpbmdzeyJFTkFCTEVCT09UUF8ke2l0Zn0i fSBuZSAnb24nKSA/ICcnIDogImNoZWNrZWQ9J2NoZWNrZWQnIjsKICAgICRjaGVja2VkeydESENQ X0NMSUVOVFMnfXsnYWxsb3dfYWxsX2NsaWVudHMnfSA9ICggJGRoY3BzZXR0aW5nc3siREhDUF9D TElFTlRTXyR7aXRmfSJ9IGVxICdBTExPV19BTExfQ0xJRU5UUycpID8gImNoZWNrZWQ9J2NoZWNr ZWQnIiA6ICcnOwogICAgJGNoZWNrZWR7J0RIQ1BfQ0xJRU5UUyd9eydkZW55X3Vua25vd25fY2xp ZW50cyd9ID0gKCAkZGhjcHNldHRpbmdzeyJESENQX0NMSUVOVFNfJHtpdGZ9In0gZXEgJ0RFTllf VU5LTk9XTl9DTElFTlRTJykgPyAiY2hlY2tlZD0nY2hlY2tlZCciIDogJyc7CiAgICAkY2hlY2tl ZHsnREhDUF9DTElFTlRTJ317J2Rlbnlfa25vd25fY2xpZW50cyd9ID0gKCAkZGhjcHNldHRpbmdz eyJESENQX0NMSUVOVFNfJHtpdGZ9In0gZXEgJ0RFTllfS05PV05fQ0xJRU5UUycpID8gImNoZWNr ZWQ9J2NoZWNrZWQnIiA6ICcnOwoKICAgIGlmICgkbmV0c2V0dGluZ3N7IiR7aXRmfV9ERVYifSBu ZSAnJyApIHsgIyBTaG93IG9ubHkgZGVmaW5lZCBpbnRlcmZhY2UKCW15ICRsY19pdGY9bGMoJGl0 Zik7CnByaW50IDw8RU5ECjx0YWJsZSB3aWR0aD0nMTAwJSc+Cjx0cj4KICAgIDx0ZCB3aWR0aD0n MjUlJyBjbGFzcz0nYm9sZGJhc2UnPjxiPjxmb250IGNvbG9yPScke2xjX2l0Zn0nPiRMYW5nOjp0 cnsiJGxjX2l0ZiBpbnRlcmZhY2UifTwvZm9udD48L2I+PC90ZD4KICAgIDx0ZCBjbGFzcz0nYmFz ZSc+JExhbmc6OnRyeydlbmFibGVkJ30KICAgIDxpbnB1dCB0eXBlPSdjaGVja2JveCcgbmFtZT0n RU5BQkxFXyR7aXRmfScgJGNoZWNrZWR7J0VOQUJMRSd9eydvbid9IC8+PC90ZD4KICAgIDx0ZCB3 aWR0aD0nMjUlJyBjbGFzcz0nYmFzZSc+JExhbmc6OnRyeydpcCBhZGRyZXNzJ308YnIgLz4kTGFu Zzo6dHJ7J25ldG1hc2snfTo8L3RkPjx0ZD48Yj4kbmV0c2V0dGluZ3N7IiR7aXRmfV9BRERSRVNT In08YnIgLz4kbmV0c2V0dGluZ3N7IiR7aXRmfV9ORVRNQVNLIn08L2I+PC90ZD4KPC90cj48dHI+ CiAgICA8dGQgd2lkdGg9JzI1JScgY2xhc3M9J2Jhc2UnPiRMYW5nOjp0cnsnc3RhcnQgYWRkcmVz cyd9Jm5ic3A7PGltZyBzcmM9Jy9ibG9iLmdpZicgYWx0PScqJyAvPjwvdGQ+CiAgICA8dGQgd2lk dGg9JzI1JSc+PGlucHV0IHR5cGU9J3RleHQnIG5hbWU9J1NUQVJUX0FERFJfJHtpdGZ9JyB2YWx1 ZT0nJGRoY3BzZXR0aW5nc3siU1RBUlRfQUREUl8ke2l0Zn0ifScgLz48L3RkPgogICAgPHRkIHdp ZHRoPScyNSUnIGNsYXNzPSdiYXNlJz4kTGFuZzo6dHJ7J2VuZCBhZGRyZXNzJ30mbmJzcDs8aW1n IHNyYz0nL2Jsb2IuZ2lmJyBhbHQ9JyonIC8+PC90ZD4KICAgIDx0ZCB3aWR0aD0nMjUlJz48aW5w dXQgdHlwZT0ndGV4dCcgbmFtZT0nRU5EX0FERFJfJHtpdGZ9JyB2YWx1ZT0nJGRoY3BzZXR0aW5n c3siRU5EX0FERFJfJHtpdGZ9In0nIC8+PC90ZD4KPC90cj48dHI+CiAgICA8dGQgY2xhc3M9J2Jh c2UnPiRMYW5nOjp0cnsnZGVmYXVsdCBsZWFzZSB0aW1lJ30mbmJzcDs8aW1nIHNyYz0nL2Jsb2Iu Z2lmJyBhbHQ9JyonIC8+PC90ZD4KICAgIDx0ZD48aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0nREVG QVVMVF9MRUFTRV9USU1FXyR7aXRmfScgdmFsdWU9JyRkaGNwc2V0dGluZ3N7IkRFRkFVTFRfTEVB U0VfVElNRV8ke2l0Zn0ifScgLz48L3RkPgogICAgPHRkIGNsYXNzPSdiYXNlJz4kTGFuZzo6dHJ7 J21heCBsZWFzZSB0aW1lJ30mbmJzcDs8aW1nIHNyYz0nL2Jsb2IuZ2lmJyBhbHQ9JyonIC8+PC90 ZD4KICAgIDx0ZD48aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0nTUFYX0xFQVNFX1RJTUVfJHtpdGZ9 JyB2YWx1ZT0nJGRoY3BzZXR0aW5nc3siTUFYX0xFQVNFX1RJTUVfJHtpdGZ9In0nIC8+PC90ZD4K PC90cj48dHI+CiAgICA8dGQgY2xhc3M9J2Jhc2UnPiRMYW5nOjp0cnsnZG9tYWluIG5hbWUgc3Vm Zml4J308L3RkPgogICAgPHRkPjxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdET01BSU5fTkFNRV8k e2l0Zn0nIHZhbHVlPSckZGhjcHNldHRpbmdzeyJET01BSU5fTkFNRV8ke2l0Zn0ifScgLz48L3Rk PgogICAgPHRkPiRMYW5nOjp0cnsnZGhjcCBhbGxvdyBib290cCd9OjwvdGQ+CiAgICA8dGQ+PGlu cHV0IHR5cGU9J2NoZWNrYm94JyBuYW1lPSdFTkFCTEVCT09UUF8ke2l0Zn0nICRjaGVja2VkeydF TkFCTEVCT09UUCd9eydvbid9IC8+PC90ZD4KPC90cj48dHI+CiAgICA8dGQgY2xhc3M9J2Jhc2Un PiRMYW5nOjp0cnsncHJpbWFyeSBkbnMnfSZuYnNwOzxpbWcgc3JjPScvYmxvYi5naWYnIGFsdD0n KicgLz48L3RkPgogICAgPHRkPjxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdETlMxXyR7aXRmfScg dmFsdWU9JyRkaGNwc2V0dGluZ3N7IkROUzFfJHtpdGZ9In0nIC8+PC90ZD4KICAgIDx0ZCBjbGFz cz0nYmFzZSc+JExhbmc6OnRyeydzZWNvbmRhcnkgZG5zJ308L3RkPgogICAgPHRkPjxpbnB1dCB0 eXBlPSd0ZXh0JyBuYW1lPSdETlMyXyR7aXRmfScgdmFsdWU9JyRkaGNwc2V0dGluZ3N7IkROUzJf JHtpdGZ9In0nIC8+PC90ZD4KPC90cj48dHI+CiAgICA8dGQgY2xhc3M9J2Jhc2UnPiRMYW5nOjp0 cnsncHJpbWFyeSBudHAgc2VydmVyJ306PC90ZD4KICAgIDx0ZD48aW5wdXQgdHlwZT0ndGV4dCcg bmFtZT0nTlRQMV8ke2l0Zn0nIHZhbHVlPSckZGhjcHNldHRpbmdzeyJOVFAxXyR7aXRmfSJ9JyAv PjwvdGQ+CiAgICA8dGQgY2xhc3M9J2Jhc2UnPiRMYW5nOjp0cnsnc2Vjb25kYXJ5IG50cCBzZXJ2 ZXInfTo8L3RkPgogICAgPHRkPjxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdOVFAyXyR7aXRmfScg dmFsdWU9JyRkaGNwc2V0dGluZ3N7Ik5UUDJfJHtpdGZ9In0nIC8+PC90ZD4KPC90cj48dHI+CiAg ICA8dGQgY2xhc3M9J2Jhc2UnPiRMYW5nOjp0cnsncHJpbWFyeSB3aW5zIHNlcnZlciBhZGRyZXNz J306PC90ZD4KICAgIDx0ZD48aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0nV0lOUzFfJHtpdGZ9JyB2 YWx1ZT0nJGRoY3BzZXR0aW5nc3siV0lOUzFfJHtpdGZ9In0nIC8+PC90ZD4KICAgIDx0ZCBjbGFz cz0nYmFzZSc+JExhbmc6OnRyeydzZWNvbmRhcnkgd2lucyBzZXJ2ZXIgYWRkcmVzcyd9OjwvdGQ+ CiAgICA8dGQ+PGlucHV0IHR5cGU9J3RleHQnIG5hbWU9J1dJTlMyXyR7aXRmfScgdmFsdWU9JyRk aGNwc2V0dGluZ3N7IldJTlMyXyR7aXRmfSJ9JyAvPjwvdGQ+CjwvdHI+PHRyPgogICAgPHRkIGNs YXNzPSdiYXNlJz5uZXh0LXNlcnZlcjo8L3RkPgogICAgPHRkPjxpbnB1dCB0eXBlPSd0ZXh0JyBu YW1lPSdORVhUXyR7aXRmfScgdmFsdWU9JyRkaGNwc2V0dGluZ3N7Ik5FWFRfJHtpdGZ9In0nIC8+ PC90ZD4KICAgIDx0ZCBjbGFzcz0nYmFzZSc+ZmlsZW5hbWU6PC90ZD4KICAgIDx0ZD48aW5wdXQg dHlwZT0ndGV4dCcgbmFtZT0nRklMRV8ke2l0Zn0nIHZhbHVlPSckZGhjcHNldHRpbmdzeyJGSUxF XyR7aXRmfSJ9JyAvPjwvdGQ+CjwvdHI+PHRyPgogICAgPHRkIGNsYXNzPSdiYXNlJz5hbGxvdyBh bGwgY2xpZW50czo8L3RkPgogICAgPHRkPjxpbnB1dCB0eXBlPSdyYWRpbycgbmFtZT0nREhDUF9D TElFTlRTXyR7aXRmfScgdmFsdWU9J0FMTE9XX0FMTF9DTElFTlRTJyAkY2hlY2tlZHsnREhDUF9D TElFTlRTJ317J2FsbG93X2FsbF9jbGllbnRzJ30gLz48L3RkPgo8L3RyPjx0cj4KICAgIDx0ZCBj bGFzcz0nYmFzZSc+ZGVueSB1bmtub3duIGNsaWVudHM6PC90ZD4KICAgIDx0ZD48aW5wdXQgdHlw ZT0ncmFkaW8nIG5hbWU9J0RIQ1BfQ0xJRU5UU18ke2l0Zn0nIHZhbHVlPSdERU5ZX1VOS05PV05f Q0xJRU5UUycgJGNoZWNrZWR7J0RIQ1BfQ0xJRU5UUyd9eydkZW55X3Vua25vd25fY2xpZW50cyd9 IC8+PC90ZD4KPC90cj48dHI+CiAgICA8dGQgY2xhc3M9J2Jhc2UnPmRlbnkga25vd24gY2xpZW50 czo8L3RkPgogICAgPHRkPjxpbnB1dCB0eXBlPSdyYWRpbycgbmFtZT0nREhDUF9DTElFTlRTXyR7 aXRmfScgdmFsdWU9J0RFTllfS05PV05fQ0xJRU5UUycgJGNoZWNrZWR7J0RIQ1BfQ0xJRU5UUyd9 eydkZW55X2tub3duX2NsaWVudHMnfSAvPjwvdGQ+CjwvdHI+CjwvdGFibGU+CjxociAvPgpFTkQK OwogICAgfSMgU2hvdyBvbmx5IGRlZmluZWQgaW50ZXJmYWNlCn0jZm9yZWFjaCBpdGYKcHJpbnQg PDxFTkQKPHRhYmxlIHdpZHRoPScxMDAlJz4KPHRyPgogICAgPHRkIGNsYXNzPSdiYXNlJyB3aWR0 aD0nMjUlJz48aW1nIHNyYz0nL2Jsb2IuZ2lmJyBhbGlnbj0ndG9wJyBhbHQ9JyonIC8+Jm5ic3A7 JExhbmc6OnRyeydyZXF1aXJlZCBmaWVsZCd9PC90ZD4KICAgIDx0ZCBjbGFzcz0nYmFzZScgd2lk dGg9JzMwJSc+JHdhcm5OVFBtZXNzYWdlPC90ZD4KICAgIDx0ZCB3aWR0aD0nNDAlJyBhbGlnbj0n cmlnaHQnPjxpbnB1dCB0eXBlPSdzdWJtaXQnIG5hbWU9J0FDVElPTicgdmFsdWU9JyRMYW5nOjp0 cnsnc2F2ZSd9JyAvPjwvdGQ+CjwvdHI+CjwvdGFibGU+CkVORAo7CiZIZWFkZXI6OmNsb3NlYm94 KCk7CgojIERIQ1AgRE5TIHVwZGF0ZSBzdXBwb3J0IChSRkMyMTM2KQomSGVhZGVyOjpvcGVuYm94 KCcxMDAlJywgJ2xlZnQnLCAkTGFuZzo6dHJ7J2RoY3AgZG5zIHVwZGF0ZSd9KTsKCm15ICVjaGVj a2VkID0gKCk7CiRjaGVja2VkeydETlNfVVBEQVRFX0VOQUJMRUQnfXsnb24nfSA9ICggJGRoY3Bz ZXR0aW5nc3snRE5TX1VQREFURV9FTkFCTEVEJ30gbmUgJ29uJykgPyAnJyA6ICJjaGVja2VkPSdj aGVja2VkJyI7CgpwcmludCA8PEVORAo8dGFibGUgIHdpZHRoPScxMDAlJz4KCTx0cj4KCQk8dGQg d2lkdGg9JzMwJScgY2xhc3M9J2JvbGRiYXNlJz4kTGFuZzo6dHJ7J2RoY3AgZG5zIGVuYWJsZSB1 cGRhdGUnfTwvdGQ+CgkJPHRkIGNsYXNzPSdiYXNlJz48aW5wdXQgdHlwZT0nY2hlY2tib3gnIG5h bWU9J0ROU19VUERBVEVfRU5BQkxFRCcgJGNoZWNrZWR7J0ROU19VUERBVEVfRU5BQkxFRCd9eydv bid9PgoJCTwvdGQ+Cgk8dHI+CjwvdGFibGU+Cgo8dGFibGUgd2lkdGg9JzEwMCUnPgpFTkQKOwoJ bXkgQGRvbWFpbnMgPSAoKTsKCgkjIFByaW50IG9wdGlvbnMgZm9yIGVhY2ggaW50ZXJmYWNlLgoJ Zm9yZWFjaCBteSAkaXRmIChASVRGcykgewoJCSMgQ2hlY2sgaWYgREhDUCBmb3IgdGhpcyBpbnRl cmZhY2UgaXMgZW5hYmxlZC4KCQlpZiAoJGRoY3BzZXR0aW5nc3siRU5BQkxFXyR7aXRmfSJ9IGVx ICdvbicpIHsKCQkJIyBDaGVjayBmb3Igc2FtZSBkb21haW4gbmFtZS4KCQkJbmV4dCBpZiAoJGRo Y3BzZXR0aW5nc3siRE9NQUlOX05BTUVfJHtpdGZ9In0gfn4gQGRvbWFpbnMpOwoJCQlteSAkbGNf aXRmID0gbGMoJGl0Zik7CgoJCQkjIFNlbGVjdCBwcmV2aW91c2x5IGNvbmZpZ3VyZWQgdXBkYXRl IGFsZ29yaXRobS4KCQkJbXkgJXNlbGVjdGVkID0gKCk7CgkJCSRzZWxlY3RlZHsnRE5TX1VQREFU RV9BTEdPXyR7aW5mfSd9eyRkaGNwc2V0dGluZ3N7J0ROU19VUERBVEVfQUxHT18ke2luZn0nfX0g PSAnc2VsZWN0ZWQnOwoKcHJpbnQgPDxFTkQKCTx0cj4KCQk8dGQgY29sc3Bhbj0nNic+Jm5ic3A7 PC90ZD4KCTwvdHI+Cgk8dHI+CgkJPHRkIGNvbHNwYW49JzYnIGNsYXNzPSdib2xkYmFzZSc+PGI+ JGRoY3BzZXR0aW5nc3siRE9NQUlOX05BTUVfJHtpdGZ9In08L2I+PC90ZD4KCTwvdHI+Cgk8dHI+ CgkJPHRkIHdpZHRoPScxMCUnIGNsYXNzPSdib2xkYmFzZSc+JExhbmc6OnRyeydkaGNwIGRucyBr ZXkgbmFtZSd9OjwvdGQ+CgkJPHRkIHdpZHRoPScyMCUnPjxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1l PSdETlNfVVBEQVRFX0tFWV9OQU1FXyR7aXRmfScgdmFsdWU9JyRkaGNwc2V0dGluZ3N7IkROU19V UERBVEVfS0VZX05BTUVfJHtpdGZ9In0nPjwvdGQ+CgkJPHRkIHdpZHRoPScxMCUnIGNsYXNzPSdi b2xkYmFzZScgYWxpZ249J3JpZ2h0Jz4kTGFuZzo6dHJ7J2RoY3AgZG5zIHVwZGF0ZSBzZWNyZXQn fTombmJzcDsmbmJzcDs8L3RkPgoJCTx0ZCB3aWR0aD0nMjAlJz48aW5wdXQgdHlwZT0ncGFzc3dv cmQnIG5hbWU9J0ROU19VUERBVEVfS0VZX1NFQ1JFVF8ke2l0Zn0nIHZhbHVlPSckZGhjcHNldHRp bmdzeyJETlNfVVBEQVRFX0tFWV9TRUNSRVRfJHtpdGZ9In0nPjwvdGQ+CgkJPHRkIHdpZHRoPScx MCUnIGNsYXNzPSdib2xkYmFzZScgYWxpZ249J3JpZ2h0Jz4kTGFuZzo6dHJ7J2RoY3AgZG5zIHVw ZGF0ZSBhbGdvJ306Jm5ic3A7Jm5ic3A7PC90ZD4KCQk8dGQgd2lkdGg9JzIwJSc+CgkJCTxzZWxl Y3QgbmFtZT0nRE5TX1VQREFURV9LRVlfQUxHT18ke2l0Zn0nPgoJCQkJPCEtLSA8b3B0aW9uIHZh bHVlPSdobWFjLXNoYTEnICRzZWxlY3RlZHsnRE5TX1VQREFURV9LRVlfQUxHT18ke2l0Zn0nfXsn aG1hYy1zaGExJ30+SE1BQy1TSEExPC9vcHRpb24+IC0tPgoJCQkJPG9wdGlvbiB2YWx1ZT0naG1h Yy1tZDUnICRzZWxlY3RlZHsnRE5TX1VQREFURV9LRVlfQUxHT18ke2l0Zn0nfXsnaG1hYy1tZDUn fT5ITUFDLU1ENTwvb3B0aW9uPgoJCQk8L3NlbGVjdD4KCQk8L3RkPgoJPC90cj4KRU5ECjsKCX0K CgkjIFN0b3JlIGNvbmZpZ3VyZWQgZG9tYWluIGJhc2VkIG9uIHRoZSBpbnRlcmZhY2UKCSMgaW4g dGhlIHRlbXBvcmFyeSB2YXJpYWJsZS4KCXB1c2goQGRvbWFpbnMsICRkaGNwc2V0dGluZ3N7IkRP TUFJTl9OQU1FXyR7aXRmfSJ9KTsKfQpwcmludCA8PEVORAo8L3RhYmxlPgo8aHI+Cjx0YWJsZSB3 aWR0aD0nMTAwJSc+Cgk8dHI+CgkJPHRkIGFsaWduPSdyaWdodCc+PGlucHV0IHR5cGU9J3N1Ym1p dCcgbmFtZT0nQUNUSU9OJyB2YWx1ZT0nJExhbmc6OnRyeydzYXZlJ30nIC8+PC90ZD4KCTwvdHI+ CjwvdGFibGU+CjwvZm9ybT4KRU5ECjsKCiZIZWFkZXI6OmNsb3NlYm94KCk7CgomSGVhZGVyOjpv cGVuYm94KCcxMDAlJywgJ2xlZnQnLCAkTGFuZzo6dHJ7J2RoY3AgYWR2b3B0IGxpc3QnfSk7CiMg REhDUCBBZHZhbmNlZCBvcHRpb25zIHNldHRpbmdzCm15ICVjaGVja2VkPSgpOwokY2hlY2tlZHsn QURWT1BUX0VOQUJMRUQnfXsnb24nfSA9ICgkZGhjcHNldHRpbmdzeydBRFZPUFRfRU5BQkxFRCd9 IG5lICdvbicpID8gJycgOiAiY2hlY2tlZD0nY2hlY2tlZCciOwoKcHJpbnQgIjxmb3JtIG1ldGhv ZD0ncG9zdCcgYWN0aW9uPSckRU5WeydTQ1JJUFRfTkFNRSd9Jz48dGFibGUgd2lkdGg9JzEwMCUn PiI7Cm15ICRidXR0b250ZXh0ID0gJExhbmc6OnRyeydhZGQnfTsKaWYgKCRkaGNwc2V0dGluZ3N7 J0tFWTEnfSBuZSAnJykgewogICAgJGJ1dHRvbnRleHQgPSAkTGFuZzo6dHJ7J3VwZGF0ZSd9Owog ICAgcHJpbnQgIjx0cj48dGQgY2xhc3M9J2JvbGRiYXNlJz48Yj4kTGFuZzo6dHJ7J2RoY3AgYWR2 b3B0IGVkaXQnfTwvYj48L3RkPjwvdHI+IjsKfSBlbHNlIHsKICAgIHByaW50ICI8dHI+PHRkIGNs YXNzPSdib2xkYmFzZSc+PGI+JExhbmc6OnRyeydkaGNwIGFkdm9wdCBhZGQnfTwvYj48L3RkPjwv dHI+Igp9Cgojc2VhcmNoIGlmIHRoZSAnb3B0aW9uJyBpcyBpbiB0aGUgbGlzdCBhbmQgcHJpbnQg dGhlIHN5bnRheCBtb2RlbApteSAkb3B0ID0gYGdyZXAgIlwkb3B0aW9uICRkaGNwc2V0dGluZ3N7 J0FEVk9QVF9OQU1FJ30gIiAkZmlsZW5hbWUzYDsKaWYgKCRvcHQgbmUgJycpIHsKICAgJG9wdCA9 fiBzL29wdGlvbiAkZGhjcHNldHRpbmdzeydBRFZPUFRfTkFNRSd9L1N5bnRheDovOyAgIyAib3B0 aW9uIHh5eiBhYmMiID0+ICJzeW50YXg6IGFiYyIKICAgJG9wdCA9fiBzLzsvLzsKICAgJG9wdCA9 ICI8dHI+PHRkPjwvdGQ+PHRkPjwvdGQ+PHRkIGNvbHNwYW49JzInPiRvcHQ8L3RkPjwvdHI+IjsK fQpwcmludCA8PEVORAo8dHI+CiAgICA8dGQgY2xhc3M9J2Jhc2UnPiRMYW5nOjp0cnsnZGhjcCBh ZHZvcHQgbmFtZSd9OiZuYnNwOzxpbWcgc3JjPScvYmxvYi5naWYnIGFsdD0nKicgLz48L3RkPgog ICAgPHRkPjxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1lPSdBRFZPUFRfTkFNRScgdmFsdWU9JyRkaGNw c2V0dGluZ3N7J0FEVk9QVF9OQU1FJ30nIHNpemU9JzE4JyAvPjwvdGQ+CiAgICA8dGQgY2xhc3M9 J2Jhc2UnPiRMYW5nOjp0cnsnZGhjcCBhZHZvcHQgdmFsdWUnfTombmJzcDs8aW1nIHNyYz0nL2Js b2IuZ2lmJyBhbHQ9JyonIC8+PC90ZD4KICAgIDx0ZD48aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0n QURWT1BUX0RBVEEnIHZhbHVlPSckZGhjcHNldHRpbmdzeydBRFZPUFRfREFUQSd9JyBzaXplPSc0 MCcgLz48L3RkPgo8L3RyPiRvcHQ8dHI+CiAgICA8dGQgY2xhc3M9J2Jhc2UnPiRMYW5nOjp0cnsn ZW5hYmxlZCd9PC90ZD48dGQ+PGlucHV0IHR5cGU9J2NoZWNrYm94JyBuYW1lPSdBRFZPUFRfRU5B QkxFRCcgJGNoZWNrZWR7J0FEVk9QVF9FTkFCTEVEJ317J29uJ30gLz48L3RkPgogICAgPHRkIGNs YXNzPSdiYXNlJz4kTGFuZzo6dHJ7J2RoY3AgYWR2b3B0IHNjb3BlJ306PC90ZD4KICAgIDx0ZD4K RU5ECjsKCiMgUHV0IGEgY2hlY2tib3ggZm9yIGVhY2ggaW50ZXJmYWNlLiBDaGVja2JveCB2aXNp YmxlIGRpc2FibGVkIGlmIGludGVyZmFjZSBpcyBkaXNhYmxlZCAgCmZvcmVhY2ggbXkgJGl0ZiAo QElURnMpIHsKICAgIG15ICRsY19pdGY9bGMoJGl0Zik7CiAgICAkY2hlY2tlZHsnQURWT1BUX1ND T1BFXyR7aXRmfSd9eydvbid9ID0gJGRoY3BzZXR0aW5nc3siQURWT1BUX1NDT1BFXyR7aXRmfSJ9 IG5lICdvbicgPyAnJyA6ICJjaGVja2VkPSdjaGVja2VkJyI7ICAgIAogICAgcHJpbnQgIiRMYW5n Ojp0cntcIiR7bGNfaXRmfVwifSA8aW5wdXQgdHlwZT0nY2hlY2tib3gnIG5hbWU9J0FEVk9QVF9T Q09QRV8ke2l0Zn0nICRjaGVja2VkeydBRFZPUFRfU0NPUEVfJHtpdGZ9J317J29uJ30gIjsKICAg IHByaW50ICRkaGNwc2V0dGluZ3N7IkVOQUJMRV8ke2l0Zn0ifSBlcSAnb24nID8gIi8+IiA6ICJk aXNhYmxlZD0nZGlzYWJsZWQnIC8+IjsKICAgIHByaW50ICImbmJzcDsgJm5ic3A7IjsKfQoKcHJp bnQgPDxFTkQKICAgIDwvdGQ+CjwvdHI+CjwvdGFibGU+CjxociAvPgo8dGFibGUgd2lkdGg9JzEw MCUnPgo8dHI+CiAgICA8dGQgY2xhc3M9J2Jhc2UnIHdpZHRoPSc1MCUnPiRMYW5nOjp0cnsnZGhj cCBhZHZvcHQgc2NvcGUgaGVscCd9PC90ZD4KICAgIDx0ZCB3aWR0aD0nNTAlJyBhbGlnbj0ncmln aHQnPgogICAgPGlucHV0IHR5cGU9J2hpZGRlbicgbmFtZT0nQUNUSU9OJyB2YWx1ZT0nJExhbmc6 OnRyeydhZGQnfTEnIC8+CiAgICA8aW5wdXQgdHlwZT0nc3VibWl0JyBuYW1lPSdTVUJNSVQnIHZh bHVlPSckYnV0dG9udGV4dCcgLz4KICAgIDxpbnB1dCB0eXBlPSdzdWJtaXQnIG5hbWU9J1NVQk1J VCcgdmFsdWU9JyRMYW5nOjp0cnsnZGhjcCBhZHZvcHQgaGVscCd9JyAvPgogICAgPGlucHV0IHR5 cGU9J2hpZGRlbicgbmFtZT0nS0VZMScgdmFsdWU9JyRkaGNwc2V0dGluZ3N7J0tFWTEnfScgLz4K ICAgIDwvdGQ+CjwvdHI+CjwvdGFibGU+CjwvZm9ybT4KRU5ECjsKI0VkaXRlZCBsaW5lIG51bWJl ciAoS0VZMSkgcGFzc2VkIHVudGlsIGNsZWFyZWQgYnkgJ3NhdmUnIG9yICdyZW1vdmUnIG9yICdu ZXcgc29ydCBvcmRlcicKCiMgcHJpbnQgaGVscCB0YWtlbiBmcm9tIHRoZSBmaWxlIGRlc2NyaWJp bmcgb3B0aW9ucwppZiAoJGRoY3BzZXR0aW5nc3snU1VCTUlUJ30gZXEgJExhbmc6OnRyeydkaGNw IGFkdm9wdCBoZWxwJ30pIHsKICAgIHByaW50ICI8aHIgLz4iOwogICAgcHJpbnQgIjx0YWJsZSB3 aWR0aD0nMTAwJSc+IjsKICAgIHByaW50ICI8dHI+PHRkIHdpZHRoPSczMCUnPjxiPiRMYW5nOjp0 cnsnZGhjcCBhZHZvcHQgbmFtZSd9PC9iPjwvdGQ+PHRkIHdpZHRoPSc3MCUnPjxiPiRMYW5nOjp0 cnsnZGhjcCBhZHZvcHQgdmFsdWUnfTwvYj48L3RkPiI7CiAgICBvcGVuKEZJTEUsICIkZmlsZW5h bWUzIik7CiAgICBteSBAY3VycmVudDMgPSA8RklMRT47CiAgICBjbG9zZShGSUxFKTsKICAgIGZv cmVhY2ggbXkgJGxpbmUgKEBjdXJyZW50MykgewoJJGxpbmUgPX4gL29wdGlvbiAoW2EtejAtOS1d KykgKC4qKTsvOwoJcHJpbnQgIjx0cj48dGQ+JDE8L3RkPjx0ZD4kMjwvdGQ+PC90cj5cbiI7CiAg ICB9CiAgICBwcmludCAiPHRyPjx0ZCBjb2xzcGFuPScyJz48aHIgLz48L3RkPjwvdHI+XG4iOwog ICAgcHJpbnQgJzx0cj48dGQ+c3RyaW5nIHR5cGU8L3RkPjx0ZD4icXVvdGVkIHN0cmluZyIgb3Ig MDA6MDE6RkYuLi48L3RkPjwvdHI+JzsKICAgIHByaW50ICc8dHI+PHRkPmlwLWFkZHJlc3MgdHlw ZSA8L3RkPjx0ZD4xMC4wLjAuMSB8IHd3dy5kb3QuY29tPC90ZD48L3RyPic7CiAgICBwcmludCAn PHRyPjx0ZD5pbnQsdWludCB0eXBlczwvdGQ+PHRkPm51bWJlcnM8L3RkPjwvdHI+JzsKICAgIHBy aW50ICc8dHI+PHRkPmZsYWcgdHlwZTwvdGQ+PHRkPm9uIHwgb2ZmPC90ZD48L3RyPic7CiAgICBw cmludCAnPC90YWJsZT4nOwogICAgcHJpbnQgIjxociAvPiI7CiAgICBwcmludCAiPHRhYmxlIHdp ZHRoPScxMDAlJz4iOwogICAgcHJpbnQgIjx0cj48dGQgd2lkdGg9JzMwJSc+PGI+JExhbmc6OnRy eydkaGNwIGFkdm9wdCBjdXN0b20gZGVmaW5pdGlvbid9PC9iPjwvdGQ+PHRkIHdpZHRoPSc3MCUn PjxiPiRMYW5nOjp0cnsnZGhjcCBhZHZvcHQgdmFsdWUnfTwvYj48L3RkPiI7CiAgICBwcmludCAi PHRyPjx0ZD5hbnktbmFtZSA8L3RkPjx0ZD4gY29kZSBOTk49JE9wdGlvblR5cGVzPC90ZD48L3Ry PiI7CiAgICBwcmludCAnPHRyPjx0ZD5hLXN0cmluZzwvdGQ+PHRkPmNvZGUgMTAwPXN0cmluZzwv dGQ+PC90cj4nOwogICAgcHJpbnQgJzx0cj48dGQ+YS1udW1iZXI8L3RkPjx0ZD5jb2RlIDEwMT1z aWduZWQgaW50ZWdlciA4PC90ZD48L3RyPic7CiAgICBwcmludCAnPHRyPjx0ZD53cGFkPC90ZD48 dGQ+Y29kZSAyNTI9dGV4dDwvdGQ+PC90cj4nOwogICAgcHJpbnQgJzx0cj48dGQ+d3BhZDwvdGQ+ PHRkPiJodHRwOi8vd3d3LnNlcnZlci5mci9wYXRoLXRvL3Byb3h5LnBhYyI8L3RkPjwvdHI+JzsK ICAgIHByaW50ICc8L3RhYmxlPic7CiAKfQoKcHJpbnQgPDxFTkQKPGhyIC8+Cjx0YWJsZSB3aWR0 aD0nMTAwJSc+Cjx0cj4KICAgIDx0ZCB3aWR0aD0nMzAlJyBjbGFzcz0nYm9sZGJhc2UnIGFsaWdu PSdjZW50ZXInPjxiPiRMYW5nOjp0cnsnZGhjcCBhZHZvcHQgbmFtZSd9PC9iPjwvdGQ+CiAgICA8 dGQgd2lkdGg9JzUwJScgY2xhc3M9J2JvbGRiYXNlJyBhbGlnbj0nY2VudGVyJz48Yj4kTGFuZzo6 dHJ7J2RoY3AgYWR2b3B0IHZhbHVlJ308L2I+PC90ZD4KICAgIDx0ZCB3aWR0aD0nMjAlJyBjbGFz cz0nYm9sZGJhc2UnIGFsaWduPSdjZW50ZXInPjxiPiRMYW5nOjp0cnsnZGhjcCBhZHZvcHQgc2Nv cGUnfTwvYj48L3RkPgogICAgPHRkIGNvbHNwYW49JzMnIGNsYXNzPSdib2xkYmFzZScgYWxpZ249 J2NlbnRlcic+PGI+JExhbmc6OnRyeydhY3Rpb24nfTwvYj48L3RkPgo8L3RyPgpFTkQKOwpteSAk a2V5ID0gMDsKZm9yZWFjaCBteSAkbGluZSAoQGN1cnJlbnQxKSB7CiAgICBteSAkZ2lmID0gJyc7 CiAgICBteSAkZ2Rlc2MgPSAnJzsKICAgIGNob21wKCRsaW5lKTsgICAjIHJlbW92ZSBuZXdsaW5l CiAgICBteSBAdGVtcCA9IHNwbGl0KC9cdC8sJGxpbmUpOwoKICAgIGlmICgkdGVtcFswXSBlcSAi b24iKSB7CgkkZ2lmID0gJ29uLmdpZic7CgkkZ2Rlc2MgPSAkTGFuZzo6dHJ7J2NsaWNrIHRvIGRp c2FibGUnfTsKICAgIH0gZWxzZSB7CgkkZ2lmID0gJ29mZi5naWYnOwoJJGdkZXNjID0gJExhbmc6 OnRyeydjbGljayB0byBlbmFibGUnfTsgCiAgICB9CgogICAgaWYgKCRkaGNwc2V0dGluZ3N7J0tF WTEnfSBlcSAka2V5KSB7CglwcmludCAiPHRyIGJnY29sb3I9JyR7SGVhZGVyOjpjb2xvdXJ5ZWxs b3d9Jz4iOwogICAgfSBlbHNpZiAoJGtleSAlIDIpIHsKCXByaW50ICI8dHIgYmdjb2xvcj0nJGNv bG9yeydjb2xvcjIyJ30nPiI7CiAgICB9IGVsc2UgewoJcHJpbnQgIjx0ciBiZ2NvbG9yPSckY29s b3J7J2NvbG9yMjAnfSc+IjsgCiAgICB9CgogICAgcHJpbnQgPDxFTkQKPHRkIGFsaWduPSdjZW50 ZXInPiR0ZW1wWzFdPC90ZD4KPHRkIGFsaWduPSdjZW50ZXInPiR0ZW1wWzJdPC90ZD4KPHRkIGFs aWduPSdjZW50ZXInPgpFTkQKOwogICAgIyBQcmVwYXJlIGEgZ2xvYmFsIGZsYWcgdG8gbWFrZSBl YXN5IHJlYWRpbmcKICAgIG15ICRnbG9iYWwgPSAnJzsKICAgIG15ICRkaXNhYmxlZFRvZ2xlID0g Jyc7CiAgICBteSAkZGlzYWJsZWRFZGl0UmVtb3ZlID0gJyc7CiAgICBpZiAoIEV4aXN0TmV3T3B0 aW9uRGVmaW5pdGlvbiAoJHRlbXBbMV0gLiAnICcgLiAkdGVtcFsyXSkgKSB7CgkkZ2xvYmFsID0g JExhbmc6OnRyeydkaGNwIGFkdm9wdCBkZWZpbml0aW9uJ307CgkkZGlzYWJsZWRUb2dsZSA9ICJk aXNhYmxlZD0nZGlzYWJsZWQnIjsKCSMgU2VhcmNoIGlmIGl0IGlzIGEgdXNlZCBOZXdPcHRpb25E ZWZpbml0aW9uIHRvIGFsc28gZGlzYWJsZSBlZGl0ICYgZGVsZXRlCgkkZGlzYWJsZWRFZGl0UmVt b3ZlID0gImRpc2FibGVkPSdkaXNhYmxlZCciIGlmIChJc1VzZWROZXdPcHRpb25EZWZpbml0aW9u ICgkdGVtcFsxXSwgJHRlbXBbMl0pKTsKICAgIH0gZWxzZSB7CgkkZ2xvYmFsID0gJExhbmc6OnRy eydkaGNwIGFkdm9wdCBzY29wZSBnbG9iYWwnfTsKICAgIH0KICAgIAogICAgCiAgICAjIFByaW50 IGVhY2ggY2hlY2tlZCBpbnRlcmZhY2UKICAgIGZvciAobXkgJGtleT0wOyAka2V5PEBJVEZzOyAk a2V5KyspIHsKCW15ICRpdGYgPSAkdGVtcFszKyRrZXldOwoJaWYgKCRpdGYgbmUgJ29mZicpIHsJ IyBPbmx5IGlmIGFuIGludGVyZmFjZSBuYW1lIGlzIHJlYWQKCSAgICBwcmludCAiJGl0ZiI7Cgkg ICAgJGdsb2JhbD0nJzsJCSMgZmFsbCB0byBsb2NhbCBzY29wZSAhCgl9CiAgICB9CiAgICBwcmlu dCA8PEVORAokZ2xvYmFsPC90ZD4KPHRkIGFsaWduPSdjZW50ZXInPgo8Zm9ybSBtZXRob2Q9J3Bv c3QnIGFjdGlvbj0nJEVOVnsnU0NSSVBUX05BTUUnfSc+CjxpbnB1dCB0eXBlPSdoaWRkZW4nIG5h bWU9J0FDVElPTicgdmFsdWU9JyRMYW5nOjp0cnsndG9nZ2xlIGVuYWJsZSBkaXNhYmxlJ30xJyAv Pgo8aW5wdXQgJGRpc2FibGVkVG9nbGUgdHlwZT0naW1hZ2UnIG5hbWU9JyRMYW5nOjp0cnsndG9n Z2xlIGVuYWJsZSBkaXNhYmxlJ30nIHNyYz0nL2ltYWdlcy8kZ2lmJyBhbHQ9JyRnZGVzYycgdGl0 bGU9JyRnZGVzYycgLz4KPGlucHV0IHR5cGU9J2hpZGRlbicgbmFtZT0nS0VZMScgdmFsdWU9JyRr ZXknIC8+CjwvZm9ybT4KPC90ZD4KCjx0ZCBhbGlnbj0nY2VudGVyJz4KPGZvcm0gbWV0aG9kPSdw b3N0JyBhY3Rpb249JyRFTlZ7J1NDUklQVF9OQU1FJ30nPgo8aW5wdXQgdHlwZT0naGlkZGVuJyBu YW1lPSdBQ1RJT04nIHZhbHVlPSckTGFuZzo6dHJ7J2VkaXQnfTEnIC8+CjxpbnB1dCAkZGlzYWJs ZWRFZGl0UmVtb3ZlIHR5cGU9J2ltYWdlJyBuYW1lPSckTGFuZzo6dHJ7J2VkaXQnfScgc3JjPScv aW1hZ2VzL2VkaXQuZ2lmJyBhbHQ9JyRMYW5nOjp0cnsnZWRpdCd9JyB0aXRsZT0nJExhbmc6OnRy eydlZGl0J30nIC8+CjxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J0tFWTEnIHZhbHVlPScka2V5 JyAvPgo8L2Zvcm0+CjwvdGQ+Cgo8dGQgYWxpZ249J2NlbnRlcic+Cjxmb3JtIG1ldGhvZD0ncG9z dCcgYWN0aW9uPSckRU5WeydTQ1JJUFRfTkFNRSd9Jz4KPGlucHV0IHR5cGU9J2hpZGRlbicgbmFt ZT0nQUNUSU9OJyB2YWx1ZT0nJExhbmc6OnRyeydyZW1vdmUnfTEnIC8+CjxpbnB1dCAkZGlzYWJs ZWRFZGl0UmVtb3ZlIHR5cGU9J2ltYWdlJyBuYW1lPSckTGFuZzo6dHJ7J3JlbW92ZSd9JyBzcmM9 Jy9pbWFnZXMvZGVsZXRlLmdpZicgYWx0PSckTGFuZzo6dHJ7J3JlbW92ZSd9JyB0aXRsZT0nJExh bmc6OnRyeydyZW1vdmUnfScgLz4KPGlucHV0IHR5cGU9J2hpZGRlbicgbmFtZT0nS0VZMScgdmFs dWU9JyRrZXknIC8+CjwvZm9ybT4KPC90ZD4KPC90cj4KRU5ECjsKICAgICRrZXkrKzsKfQoKcHJp bnQgIjwvdGFibGU+IjsKCiMgSWYgdGhlcmUgYXJlIGRoY3Agb3B0aW9ucywgcHJpbnQgS2V5IHRv IGFjdGlvbiBpY29ucwppZiAoJGtleSkgewpwcmludCA8PEVORAo8dGFibGU+Cjx0cj4KCTx0ZCBj bGFzcz0nYm9sZGJhc2UnPiZuYnNwOzxiPiRMYW5nOjp0cnsnbGVnZW5kJ306Jm5ic3A7PC9iPjwv dGQ+Cgk8dGQ+PGltZyBzcmM9Jy9pbWFnZXMvb24uZ2lmJyBhbHQ9JyRMYW5nOjp0cnsnY2xpY2sg dG8gZGlzYWJsZSd9JyAvPjwvdGQ+Cgk8dGQgY2xhc3M9J2Jhc2UnPiRMYW5nOjp0cnsnY2xpY2sg dG8gZGlzYWJsZSd9PC90ZD4KCTx0ZD4mbmJzcDsmbmJzcDs8L3RkPgoJPHRkPjxpbWcgc3JjPScv aW1hZ2VzL29mZi5naWYnIGFsdD0nJExhbmc6OnRyeydjbGljayB0byBlbmFibGUnfScgLz48L3Rk PgoJPHRkIGNsYXNzPSdiYXNlJz4kTGFuZzo6dHJ7J2NsaWNrIHRvIGVuYWJsZSd9PC90ZD4KCTx0 ZD4mbmJzcDsmbmJzcDs8L3RkPgoJPHRkPjxpbWcgc3JjPScvaW1hZ2VzL2VkaXQuZ2lmJyBhbHQ9 JyRMYW5nOjp0cnsnZWRpdCd9JyAvPjwvdGQ+Cgk8dGQgY2xhc3M9J2Jhc2UnPiRMYW5nOjp0cnsn ZWRpdCd9PC90ZD4KCTx0ZD4mbmJzcDsmbmJzcDs8L3RkPgoJPHRkPjxpbWcgc3JjPScvaW1hZ2Vz L2RlbGV0ZS5naWYnIGFsdD0nJExhbmc6OnRyeydyZW1vdmUnfScgLz48L3RkPgoJPHRkIGNsYXNz PSdiYXNlJz4kTGFuZzo6dHJ7J3JlbW92ZSd9PC90ZD4KPC90cj4KPC90YWJsZT4KRU5ECjsKfQom SGVhZGVyOjpjbG9zZWJveCgpOwoKJkhlYWRlcjo6b3BlbmJveCgnMTAwJScsICdsZWZ0JywgJExh bmc6OnRyeydjdXJyZW50IGZpeGVkIGxlYXNlcyd9KTsKIyBGaXhlZCBsZWFzZXMgc2NyZWVucwok Y2hlY2tlZHsnRklYX0VOQUJMRUQnfXsnb24nfSA9ICgkZGhjcHNldHRpbmdzeydGSVhfRU5BQkxF RCd9IG5lICdvbicpID8gJycgOiAiY2hlY2tlZD0nY2hlY2tlZCciOwoKJGJ1dHRvbnRleHQgPSAk TGFuZzo6dHJ7J2FkZCd9OwpwcmludCAiPGZvcm0gbWV0aG9kPSdwb3N0JyBhY3Rpb249JyRFTlZ7 J1NDUklQVF9OQU1FJ30nPjx0YWJsZSB3aWR0aD0nMTAwJSc+IjsKCmlmICgkZGhjcHNldHRpbmdz eydLRVkyJ30gbmUgJycpIHsKICAgICRidXR0b250ZXh0ID0gJExhbmc6OnRyeyd1cGRhdGUnfTsK ICAgIHByaW50ICI8dHI+PHRkIGNsYXNzPSdib2xkYmFzZScgY29sc3Bhbj0nMyc+PGI+JExhbmc6 OnRyeydlZGl0IGFuIGV4aXN0aW5nIGxlYXNlJ308L2I+PC90ZD48L3RyPiI7Cn0gZWxzZSB7CiAg ICBwcmludCAiPHRyPjx0ZCBjbGFzcz0nYm9sZGJhc2UnIGNvbHNwYW49JzMnPjxiPiRMYW5nOjp0 cnsnYWRkIG5ldyBsZWFzZSd9PC9iPjwvdGQ+PC90cj4iCn0KcHJpbnQgPDxFTkQKPHRyPgogICAg PHRkIGNsYXNzPSdiYXNlJz4kTGFuZzo6dHJ7J21hYyBhZGRyZXNzJ306Jm5ic3A7PGltZyBzcmM9 Jy9ibG9iLmdpZicgYWx0PScqJyAvPjwvdGQ+CiAgICA8dGQ+PGlucHV0IHR5cGU9J3RleHQnIG5h bWU9J0ZJWF9NQUMnIHZhbHVlPSckZGhjcHNldHRpbmdzeydGSVhfTUFDJ30nIHNpemU9JzE4JyAv PjwvdGQ+CiAgICA8dGQgY2xhc3M9J2Jhc2UnPiRMYW5nOjp0cnsnaXAgYWRkcmVzcyd9OiZuYnNw OzxpbWcgc3JjPScvYmxvYi5naWYnIGFsdD0nKicgLz48L3RkPgogICAgPHRkPjxpbnB1dCB0eXBl PSd0ZXh0JyBuYW1lPSdGSVhfQUREUicgdmFsdWU9JyRkaGNwc2V0dGluZ3N7J0ZJWF9BRERSJ30n IHNpemU9JzE4JyAvPjwvdGQ+CiAgICA8dGQgY2xhc3M9J2Jhc2UnPiRMYW5nOjp0cnsncmVtYXJr J306PC90ZD4KICAgIDx0ZD48aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0nRklYX1JFTUFSSycgdmFs dWU9JyRkaGNwc2V0dGluZ3N7J0ZJWF9SRU1BUksnfScgc2l6ZT0nMTgnIC8+PC90ZD4KPC90cj48 dHI+CiAgICA8dGQgY2xhc3M9J2Jhc2UnPiRMYW5nOjp0cnsnZW5hYmxlZCd9PC90ZD48dGQ+PGlu cHV0IHR5cGU9J2NoZWNrYm94JyBuYW1lPSdGSVhfRU5BQkxFRCcgJGNoZWNrZWR7J0ZJWF9FTkFC TEVEJ317J29uJ30gLz48L3RkPgo8L3RyPjx0cj4KICAgIDx0ZCBjb2xzcGFuID0gJzMnPjxiPiRM YW5nOjp0cnsnZGhjcCBib290cCBweGUgZGF0YSd9PC9iPjwvdGQ+CjwvdHI+PHRyPgogICAgPHRk IGNsYXNzPSdiYXNlJz5uZXh0LXNlcnZlcjo8L3RkPgogICAgPHRkPjxpbnB1dCB0eXBlPSd0ZXh0 JyBuYW1lPSdGSVhfTkVYVEFERFInIHZhbHVlPSckZGhjcHNldHRpbmdzeydGSVhfTkVYVEFERFIn fScgc2l6ZT0nMTgnIC8+PC90ZD4KICAgIDx0ZCBjbGFzcz0nYmFzZSc+ZmlsZW5hbWU6PC90ZD4K ICAgIDx0ZD48aW5wdXQgdHlwZT0ndGV4dCcgbmFtZT0nRklYX0ZJTEVOQU1FJyB2YWx1ZT0nJGRo Y3BzZXR0aW5nc3snRklYX0ZJTEVOQU1FJ30nIHNpemU9JzE4JyAvPjwvdGQ+CiAgICA8dGQgY2xh c3M9J2Jhc2UnPnJvb3QgcGF0aDo8L3RkPgogICAgPHRkPjxpbnB1dCB0eXBlPSd0ZXh0JyBuYW1l PSdGSVhfUk9PVFBBVEgnIHZhbHVlPSckZGhjcHNldHRpbmdzeydGSVhfUk9PVFBBVEgnfScgc2l6 ZT0nMTgnIC8+PC90ZD4KPC90cj4KPC90YWJsZT4KPGhyIC8+Cjx0YWJsZSB3aWR0aD0nMTAwJSc+ Cjx0cj4KICAgIDx0ZCBjbGFzcz0nYmFzZScgd2lkdGg9JzUwJSc+PGltZyBzcmM9Jy9ibG9iLmdp ZicgYWxpZ249J3RvcCcgYWx0PScqJyAvPiZuYnNwOyRMYW5nOjp0cnsncmVxdWlyZWQgZmllbGQn fTwvdGQ+CiAgICA8dGQgd2lkdGg9JzUwJScgYWxpZ249J3JpZ2h0Jz4KCTxpbnB1dCB0eXBlPSdo aWRkZW4nIG5hbWU9J0FDVElPTicgdmFsdWU9JyRMYW5nOjp0cnsnYWRkJ30yJyAvPgoJPGlucHV0 IHR5cGU9J3N1Ym1pdCcgbmFtZT0nU1VCTUlUJyB2YWx1ZT0nJGJ1dHRvbnRleHQnIC8+Cgk8aW5w dXQgdHlwZT0naGlkZGVuJyBuYW1lPSdLRVkyJyB2YWx1ZT0nJGRoY3BzZXR0aW5nc3snS0VZMid9 JyAvPjwvdGQ+CjwvdHI+CjwvdGFibGU+CjwvZm9ybT4KRU5ECjsKI0VkaXRlZCBsaW5lIG51bWJl ciAoS0VZMikgcGFzc2VkIHVudGlsIGNsZWFyZWQgYnkgJ3NhdmUnIG9yICdyZW1vdmUnIG9yICdu ZXcgc29ydCBvcmRlcicKCiMgU2VhcmNoIGZvciBzdGF0aWMgbGVhc2VzCm15ICRzZWFyY2hfcXVl cnkgPSAkZGhjcHNldHRpbmdzeydxJ307CgppZiAoc2NhbGFyIEBjdXJyZW50MiA+PSAxMCkgewoJ cHJpbnQgPDxFTkQ7CgkJPGZvcm0gbWV0aG9kPSJQT1NUIiBhY3Rpb249IiNzZWFyY2giPgoJCQk8 YSBuYW1lPSJzZWFyY2giPjwvYT4KCQkJPHRhYmxlIHdpZHRoPScxMDAlJz4KCQkJCTx0cj4KCQkJ CQk8dGQ+CgkJCQkJCTxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJxIiB2YWx1ZT0iJHNlYXJjaF9x dWVyeSI+CgkJCQkJCTxpbnB1dCB0eXBlPSJzdWJtaXQiIHZhbHVlPSIkTGFuZzo6dHJ7J3NlYXJj aCd9Ij4KCQkJCQk8L3RkPgoJCQkJPC90cj4KCQkJPC90YWJsZT4KCQk8L2Zvcm0+CkVORAp9Cgpw cmludCA8PEVORAo8dGFibGUgd2lkdGg9JzEwMCUnIGNsYXNzPSd0YmwnPgo8dHI+CiAgICA8dGgg d2lkdGg9JzIwJScgYWxpZ249J2NlbnRlcic+PGEgaHJlZj0nJEVOVnsnU0NSSVBUX05BTUUnfT9G RVRIRVInPjxiPiRMYW5nOjp0cnsnbWFjIGFkZHJlc3MnfTwvYj48L2E+PC90aD4KICAgIDx0aCB3 aWR0aD0nMjAlJyBhbGlnbj0nY2VudGVyJz48YSBocmVmPSckRU5WeydTQ1JJUFRfTkFNRSd9P0ZJ UEFERFInPjxiPiRMYW5nOjp0cnsnaXAgYWRkcmVzcyd9PC9iPjwvYT48L3RoPgogICAgPHRoIHdp ZHRoPScxNSUnIGFsaWduPSdjZW50ZXInPjxiPiRMYW5nOjp0cnsncmVtYXJrJ308L2I+PC90aD4K ICAgIDx0aCB3aWR0aD0nMTUlJyBjbGFzcz0nYm9sZGJhc2UnIGFsaWduPSdjZW50ZXInPjxiPm5l eHQtc2VydmVyPC9iPjwvdGg+CiAgICA8dGggd2lkdGg9JzE1JScgY2xhc3M9J2JvbGRiYXNlJyBh bGlnbj0nY2VudGVyJz48Yj5maWxlbmFtZTwvYj48L3RoPgogICAgPHRoIHdpZHRoPScxNSUnIGNs YXNzPSdib2xkYmFzZScgYWxpZ249J2NlbnRlcic+PGI+cm9vdCBwYXRoPC9iPjwvdGg+CiAgICA8 dGggY29sc3Bhbj0nMycgY2xhc3M9J2JvbGRiYXNlJyBhbGlnbj0nY2VudGVyJz48Yj4kTGFuZzo6 dHJ7J2FjdGlvbid9PC9iPjwvdGg+CjwvdHI+CkVORAo7Cm15ICRpcGR1cCA9IDA7Cm15ICVpcGlu dXNlID0gKCk7Cm15ICVtYWNkdXBsID0gKCk7ICMgRHVwbGljYXRlIE1BQ3MgaGF2ZSB0byBiZSBv biBkaWZmZXJlbnQgc3VibmV0cwpteSAlaXBvdXRzaWRlID0gKCk7CgojIG1hcmsgZHVwbGljYXRl IGlwIG9yIGR1cGxpY2F0ZSBNQUMKZm9yZWFjaCBteSAkbGluZSAoQGN1cnJlbnQyKSB7CiAgICBt eSBAdGVtcCA9IHNwbGl0KC9cLC8sJGxpbmUpOwogICAgJG1hY2R1cGx7JHRlbXBbMF19ICs9IDE7 CiAgICBpZiAoJG1hY2R1cGx7JHRlbXBbMF19ID4gMSkgeyAKCSRpcGR1cCA9IDE7IAkjIEZsYWcg dXAgZHVwbGljYXRlcyBmb3IgdXNlIGxhdGVyCiAgICB9CiAgICAkaXBpbnVzZXskdGVtcFsxXX0g Kz0gMTsKICAgIGlmICgkaXBpbnVzZXskdGVtcFsxXX0gPiAxKSB7IAoJJGlwZHVwID0gMTsgCSMg RmxhZyB1cCBkdXBsaWNhdGVzIGZvciB1c2UgbGF0ZXIKICAgIH0KICAgICMgTWFyayBJUCBhZGRy ZXNzZXMgb3V0d2l0aCBrbm93biBzdWJuZXRzCiAgICAkaXBvdXRzaWRleyR0ZW1wWzFdfSA9IDE7 CiAgICBmb3JlYWNoIG15ICRpdGYgKEBJVEZzKSB7CiAgICAgICAgaWYgKCAmR2VuZXJhbDo6SXBJ blN1Ym5ldCgkdGVtcFsxXSwKICAgICAgICAgICAgICAgICRuZXRzZXR0aW5nc3siJHtpdGZ9X05F VEFERFJFU1MifSwgCiAgICAgICAgICAgICAgICAkbmV0c2V0dGluZ3N7IiR7aXRmfV9ORVRNQVNL In0pKSB7CiAgICAgICAgICAgICRpcG91dHNpZGV7JHRlbXBbMV19ID0gMDsKICAgICAgICB9CiAg ICB9Cn0KCiRrZXkgPSAwOwpteSAkY29sPSIiOwpmb3JlYWNoIG15ICRsaW5lIChAY3VycmVudDIp IHsKICAgIG15ICRnaWYgPSAnJzsKICAgIG15ICRnZGVzYyA9ICcnOwogICAgY2hvbXAoJGxpbmUp OyAgICMgcmVtb3ZlIG5ld2xpbmUKICAgIG15IEB0ZW1wID0gc3BsaXQoL1wsLywkbGluZSk7Cgog ICAgaWYgKCR0ZW1wWzJdIGVxICJvbiIpIHsKCSRnaWYgPSAnb24uZ2lmJzsKCSRnZGVzYyA9ICRM YW5nOjp0cnsnY2xpY2sgdG8gZGlzYWJsZSd9OwogICAgfSBlbHNlIHsKCSRnaWYgPSAnb2ZmLmdp Zic7CgkkZ2Rlc2MgPSAkTGFuZzo6dHJ7J2NsaWNrIHRvIGVuYWJsZSd9OyAKICAgIH0KCiAgICAj IFNraXAgYWxsIGVudHJpZXMgdGhhdCBkbyBub3QgbWF0Y2ggdGhlIHNlYXJjaCBxdWVyeQogICAg aWYgKCRzZWFyY2hfcXVlcnkgbmUgIiIpIHsKCWlmICghZ3JlcCgvJHNlYXJjaF9xdWVyeS8sIEB0 ZW1wKSkgewoJCSRrZXkrKzsKCQluZXh0OwoJfQogICAgfQoKICAgIGlmICgkZGhjcHNldHRpbmdz eydLRVkyJ30gZXEgJGtleSkgewoJcHJpbnQgIjx0cj4iOwoJJGNvbD0iYmdjb2xvcj0nJHtIZWFk ZXI6OmNvbG91cnllbGxvd30nIjsKICAgIH0gZWxzaWYgKCRrZXkgJSAyKSB7CglwcmludCAiPHRy PiI7CgkkY29sPSJiZ2NvbG9yPSckY29sb3J7J2NvbG9yMjAnfSciOwogICAgfSBlbHNlIHsKCXBy aW50ICI8dHI+IjsKCSRjb2w9ImJnY29sb3I9JyRjb2xvcnsnY29sb3IyMid9JyI7CiAgICB9CiAg ICBteSAkVEFHMCA9ICcnOwogICAgbXkgJFRBRzEgPSAnJzsKICAgIG15ICRUQUcyID0gJyc7CiAg ICBteSAkVEFHMyA9ICcnOwogICAgbXkgJFRBRzQgPSAnJzsKICAgIGlmICgkaXBpbnVzZXskdGVt cFsxXX0gPiAxKSB7IAoJJFRBRzAgPSAnPGI+JzsKCSRUQUcxID0gJzwvYj4nOwogICAgfQogICAg aWYgKCRtYWNkdXBseyR0ZW1wWzBdfSA+IDEpIHsgCgkkVEFHMiA9ICc8Yj4nOwoJJFRBRzMgPSAn PC9iPic7CiAgICB9CiAgICBpZiAoJGlwb3V0c2lkZXskdGVtcFsxXX0gPiAwKSB7IAoJJFRBRzQg PSAiYmdjb2xvcj0nb3JhbmdlJyIgaWYgKCRkaGNwc2V0dGluZ3N7J0tFWTInfSBuZSAka2V5KTsK ICAgIH0KCiAgICBwcmludCA8PEVORAo8dGQgYWxpZ249J2NlbnRlcicgJGNvbD4kVEFHMiR0ZW1w WzBdJFRBRzM8L3RkPgo8dGQgYWxpZ249J2NlbnRlcicgJGNvbCAkVEFHND4kVEFHMCR0ZW1wWzFd JFRBRzE8L3RkPgo8dGQgYWxpZ249J2NlbnRlcicgJGNvbD4kdGVtcFs2XSZuYnNwOzwvdGQ+Cjx0 ZCBhbGlnbj0nY2VudGVyJyAkY29sPiR0ZW1wWzNdJm5ic3A7PC90ZD4KPHRkIGFsaWduPSdjZW50 ZXInICRjb2w+JHRlbXBbNF0mbmJzcDs8L3RkPgo8dGQgYWxpZ249J2NlbnRlcicgJGNvbD4kdGVt cFs1XSZuYnNwOzwvdGQ+Cgo8dGQgYWxpZ249J2NlbnRlcicgJGNvbD4KPGZvcm0gbWV0aG9kPSdw b3N0JyBhY3Rpb249JyRFTlZ7J1NDUklQVF9OQU1FJ30nPgo8aW5wdXQgdHlwZT0naGlkZGVuJyBu YW1lPSdBQ1RJT04nIHZhbHVlPSckTGFuZzo6dHJ7J3RvZ2dsZSBlbmFibGUgZGlzYWJsZSd9Micg Lz4KPGlucHV0IHR5cGU9J2ltYWdlJyBuYW1lPSckTGFuZzo6dHJ7J3RvZ2dsZSBlbmFibGUgZGlz YWJsZSd9JyBzcmM9Jy9pbWFnZXMvJGdpZicgYWx0PSckZ2Rlc2MnIHRpdGxlPSckZ2Rlc2MnIC8+ CjxpbnB1dCB0eXBlPSdoaWRkZW4nIG5hbWU9J0tFWTInIHZhbHVlPScka2V5JyAvPgo8L2Zvcm0+ CjwvdGQ+Cgo8dGQgYWxpZ249J2NlbnRlcicgJGNvbD4KPGZvcm0gbWV0aG9kPSdwb3N0JyBhY3Rp b249JyRFTlZ7J1NDUklQVF9OQU1FJ30nPgo8aW5wdXQgdHlwZT0naGlkZGVuJyBuYW1lPSdBQ1RJ T04nIHZhbHVlPSckTGFuZzo6dHJ7J2VkaXQnfTInIC8+CjxpbnB1dCB0eXBlPSdpbWFnZScgbmFt ZT0nJExhbmc6OnRyeydlZGl0J30nIHNyYz0nL2ltYWdlcy9lZGl0LmdpZicgYWx0PSckTGFuZzo6 dHJ7J2VkaXQnfScgdGl0bGU9JyRMYW5nOjp0cnsnZWRpdCd9JyAvPgo8aW5wdXQgdHlwZT0naGlk ZGVuJyBuYW1lPSdLRVkyJyB2YWx1ZT0nJGtleScgLz4KPC9mb3JtPgo8L3RkPgoKPHRkIGFsaWdu PSdjZW50ZXInICRjb2w+Cjxmb3JtIG1ldGhvZD0ncG9zdCcgYWN0aW9uPSckRU5WeydTQ1JJUFRf TkFNRSd9Jz4KPGlucHV0IHR5cGU9J2hpZGRlbicgbmFtZT0nQUNUSU9OJyB2YWx1ZT0nJExhbmc6 OnRyeydyZW1vdmUnfTInIC8+CjxpbnB1dCB0eXBlPSdpbWFnZScgbmFtZT0nJExhbmc6OnRyeydy ZW1vdmUnfScgc3JjPScvaW1hZ2VzL2RlbGV0ZS5naWYnIGFsdD0nJExhbmc6OnRyeydyZW1vdmUn fScgdGl0bGU9JyRMYW5nOjp0cnsncmVtb3ZlJ30nIC8+CjxpbnB1dCB0eXBlPSdoaWRkZW4nIG5h bWU9J0tFWTInIHZhbHVlPScka2V5JyAvPgo8L2Zvcm0+CjwvdGQ+CjwvdHI+CkVORAo7CiAgICAk a2V5Kys7Cn0KcHJpbnQgIjwvdGFibGU+IjsKCiMgSWYgdGhlIGZpeGVkIGxlYXNlIGZpbGUgY29u dGFpbnMgZW50cmllcywgcHJpbnQgS2V5IHRvIGFjdGlvbiBpY29ucwppZiAoJGtleSkgewpteSAk ZHVwID0gJGlwZHVwID8gIjx0ZCBjbGFzcz0nYmFzZSc+JExhbmc6OnRyeydkdXBsaWNhdGUgaXAg Ym9sZCd9PC90ZD4iIDonJzsKcHJpbnQgPDxFTkQKPHRhYmxlPgo8dHI+Cgk8dGQgY2xhc3M9J2Jv bGRiYXNlJz4mbmJzcDs8Yj4kTGFuZzo6dHJ7J2xlZ2VuZCd9OiZuYnNwOzwvYj48L3RkPgoJPHRk PjxpbWcgc3JjPScvaW1hZ2VzL29uLmdpZicgYWx0PSckTGFuZzo6dHJ7J2NsaWNrIHRvIGRpc2Fi bGUnfScgLz48L3RkPgoJPHRkIGNsYXNzPSdiYXNlJz4kTGFuZzo6dHJ7J2NsaWNrIHRvIGRpc2Fi bGUnfTwvdGQ+Cgk8dGQ+Jm5ic3A7Jm5ic3A7PC90ZD4KCTx0ZD48aW1nIHNyYz0nL2ltYWdlcy9v ZmYuZ2lmJyBhbHQ9JyRMYW5nOjp0cnsnY2xpY2sgdG8gZW5hYmxlJ30nIC8+PC90ZD4KCTx0ZCBj bGFzcz0nYmFzZSc+JExhbmc6OnRyeydjbGljayB0byBlbmFibGUnfTwvdGQ+Cgk8dGQ+Jm5ic3A7 Jm5ic3A7PC90ZD4KCTx0ZD48aW1nIHNyYz0nL2ltYWdlcy9lZGl0LmdpZicgYWx0PSckTGFuZzo6 dHJ7J2VkaXQnfScgLz48L3RkPgoJPHRkIGNsYXNzPSdiYXNlJz4kTGFuZzo6dHJ7J2VkaXQnfTwv dGQ+Cgk8dGQ+Jm5ic3A7Jm5ic3A7PC90ZD4KCTx0ZD48aW1nIHNyYz0nL2ltYWdlcy9kZWxldGUu Z2lmJyBhbHQ9JyRMYW5nOjp0cnsncmVtb3ZlJ30nIC8+PC90ZD4KCTx0ZCBjbGFzcz0nYmFzZSc+ JExhbmc6OnRyeydyZW1vdmUnfTwvdGQ+CjwvdHI+Cjx0cj4KCTx0ZD4mbmJzcDs8L3RkPgoJPHRk IGJnY29sb3I9J29yYW5nZSc+Jm5ic3A7PC90ZD4KCTx0ZCBjbGFzcz0nYmFzZSc+JExhbmc6OnRy eydpcCBhZGRyZXNzIG91dHNpZGUgc3VibmV0cyd9PC90ZD4KCTx0ZD4mbmJzcDs8L3RkPgoJPHRk PiZuYnNwOzwvdGQ+CgkkZHVwCjwvdHI+CjwvdGFibGU+CkVORAo7Cn0KCiZIZWFkZXI6OmNsb3Nl Ym94KCk7Cgpmb3JlYWNoIG15ICRpdGYgKEBJVEZzKSB7CiAgICBpZiAoJGRoY3BzZXR0aW5nc3si RU5BQkxFXyR7aXRmfSJ9IGVxICdvbicpIHsKCSMgZGlzcGxheSBsZWFzZXMgd2l0aCBhIGxpc3Qg b2YgYWN0aW9ucyB0byBkbyB3aXRoIHRoZSBnbG9iYWwgc2VsZWN0IGNoZWNrYm94LgoJJkhlYWRl cjo6UHJpbnRBY3R1YWxMZWFzZXMoIisiKTsJIyAiKyIgPT4gY3JlYXRlIGZpeGVkIGxlYXNlcyBm cm9tIG5vZGVhZGRyZXNzCglsYXN0OyAJCQkjUHJpbnQgb25lIHRpbWUgb25seSBmb3IgYWxsIGlu dGVyZmFjZXMKICAgIH07Cn0KCiZIZWFkZXI6OmNsb3NlYmlnYm94KCk7CiZIZWFkZXI6OmNsb3Nl cGFnZSgpOwoKIyMgT3VmIGl0J3MgdGhlIGVuZCAhCgpzdWIgc29ydGN1cnJlbnQxICAjIGJ5IG5v dywgZG8gbm90IHNvcnQsIGp1c3Qgd3JpdGUKewogICAgb3BlbihGSUxFLCAiPiRmaWxlbmFtZTEi KSBvciBkaWUgJ1VuYWJsZSB0byBvcGVuIGRoY3AgYWR2YW5jZWQgb3B0aW9ucyBmaWxlLic7CiAg ICBwcmludCBGSUxFIEBjdXJyZW50MTsKICAgIGNsb3NlKEZJTEUpOwp9CgoKIyBTb3J0IHRoZSAi Y3VycmVudDIiIGFycmF5IGFjY29yZGluZyB0byBjaG9pY2VzCnN1YiBzb3J0Y3VycmVudDIKewog ICAgb3VyICVlbnRyaWVzID0gKCk7CgogICAgc3ViIGZpeGVkbGVhc2Vzb3J0IHsKCW15ICRxcz0n JzsKCWlmIChyaW5kZXggKCRkaGNwc2V0dGluZ3N7J1NPUlRfRkxFQVNFTElTVCd9LCdSZXYnKSAh PSAtMSkgewoJICAgICRxcz1zdWJzdHIgKCRkaGNwc2V0dGluZ3N7J1NPUlRfRkxFQVNFTElTVCd9 LDAsbGVuZ3RoKCRkaGNwc2V0dGluZ3N7J1NPUlRfRkxFQVNFTElTVCd9KS0zKTsKCSAgICBpZiAo JHFzIGVxICdGSVBBRERSJykgewoJCW15IEBhID0gc3BsaXQoL1wuLywkZW50cmllc3skYX0tPnsk cXN9KTsKCQlteSBAYiA9IHNwbGl0KC9cLi8sJGVudHJpZXN7JGJ9LT57JHFzfSk7CgkJKCRiWzBd PD0+JGFbMF0pIHx8CgkJKCRiWzFdPD0+JGFbMV0pIHx8CgkJKCRiWzJdPD0+JGFbMl0pIHx8CgkJ KCRiWzNdPD0+JGFbM10pOwoJICAgIH0gZWxzZSB7CgkJJGVudHJpZXN7JGJ9LT57JHFzfSBjbXAg JGVudHJpZXN7JGF9LT57JHFzfTsKCSAgICB9Cgl9IGVsc2UgeyAjbm90IHJldmVyc2UKCSAgICAk cXM9JGRoY3BzZXR0aW5nc3snU09SVF9GTEVBU0VMSVNUJ307CgkgICAgaWYgKCRxcyBlcSAnRklQ QUREUicpIHsKCQlteSBAYSA9IHNwbGl0KC9cLi8sJGVudHJpZXN7JGF9LT57JHFzfSk7CgkJbXkg QGIgPSBzcGxpdCgvXC4vLCRlbnRyaWVzeyRifS0+eyRxc30pOwoJCSgkYVswXTw9PiRiWzBdKSB8 fAoJCSgkYVsxXTw9PiRiWzFdKSB8fAoJCSgkYVsyXTw9PiRiWzJdKSB8fAoJCSgkYVszXTw9PiRi WzNdKTsKCSAgICB9IGVsc2UgewoJCSRlbnRyaWVzeyRhfS0+eyRxc30gY21wICRlbnRyaWVzeyRi fS0+eyRxc307CgkgICAgfQoJfQogICAgfQoKICAgICNVc2UgYW4gYXNzb2NpYXRpdmUgYXJyYXkg KCVlbnRyaWVzKQogICAgZm9yZWFjaCBteSAkbGluZSAoQGN1cnJlbnQyKSB7CgljaG9tcCggJGxp bmUpOyAjcmVtb3ZlIG5ld2xpbmUgYmVjYXVzZSBjYW4gYmUgb24gZmllbGQgNSBvciA2IChhZGRp dGlvbiBvZiBSRU1BUkspCglteSBAdGVtcCA9IHNwbGl0ICgnLCcsJGxpbmUpOwoJbXkgQHJlY29y ZCA9ICgnRkVUSEVSJywkdGVtcFswXSwnRklQQUREUicsJHRlbXBbMV0sJ0RBVEEnLGpvaW4oJywn LEB0ZW1wWzIuLjZdKSk7CglteSAkcmVjb3JkID0ge307ICAgICAgICAgICAgICAgICAgICAgICAg IyBjcmVhdGUgYSByZWZlcmVuY2UgdG8gZW1wdHkgaGFzaAoJJXskcmVjb3JkfSA9IEByZWNvcmQ7 ICAgICAgICAgICAgICAgIAkjIHBvcHVsYXRlIHRoYXQgaGFzaCB3aXRoIEByZWNvcmQKCSMgdXNl IGNvbWJpbmF0aW9uIG9mIGV0aGVyICYgSVAgYXMga2V5IHRvIGFsbG93IGR1cGxpY2F0ZXMgaW4g ZWl0aGVyIGJ1dCBub3QgYm90aAoJJGVudHJpZXN7JHJlY29yZC0+e0ZFVEhFUn0gLiAkcmVjb3Jk LT57RklQQUREUn19ID0gJHJlY29yZDsgIyBhZGQgdGhpcyB0byBhIGhhc2ggb2YgaGFzaGVzCiAg ICB9CiAgICAKICAgIG9wZW4oRklMRSwgIj4kZmlsZW5hbWUyIikgb3IgZGllICdVbmFibGUgdG8g b3BlbiBmaXhlZCBsZWFzZSBmaWxlLic7CiAgICBmb3JlYWNoIG15ICRlbnRyeSAoIHNvcnQgZml4 ZWRsZWFzZXNvcnQga2V5cyAlZW50cmllcykgewoJcHJpbnQgRklMRSAiJGVudHJpZXN7JGVudHJ5 fS0+e0ZFVEhFUn0sJGVudHJpZXN7JGVudHJ5fS0+e0ZJUEFERFJ9LCRlbnRyaWVzeyRlbnRyeX0t PntEQVRBfVxuIjsKICAgIH0KICAgIGNsb3NlKEZJTEUpOwoKICAgICMgUmVsb2FkIHNvcnRlZCAg QGN1cnJlbnQyCiAgICBvcGVuIChGSUxFLCAiJGZpbGVuYW1lMiIpOwogICAgQGN1cnJlbnQyID0g PEZJTEU+OwogICAgY2xvc2UgKEZJTEUpOwogICAgdW5kZWYgKCVlbnRyaWVzKTsgICNUaGlzIGFy cmF5IGlzIHJldXNlZCBsYXR0ZXIuIENsZWFyIGl0Lgp9CgkJCQkJCSAgICAKIyBCdWlsZCB0aGUg Y29uZmlndXJhdGlvbiBmaWxlIG1peGluZyAgc2V0dGluZ3MsIGZpeGVkIGxlYXNlcyBhbmQgYWR2 YW5jZWQgb3B0aW9ucwpzdWIgYnVpbGRjb25mIHsKICAgIG9wZW4oRklMRSwgIj4vJHtHZW5lcmFs Ojpzd3Jvb3R9L2RoY3AvZGhjcGQuY29uZiIpIG9yIGRpZSAiVW5hYmxlIHRvIHdyaXRlIGRoY3Bk LmNvbmYgZmlsZSI7CiAgICBmbG9jayhGSUxFLCAyKTsKCiAgICAjIEdsb2JhbCBzZXR0aW5ncwog ICAgcHJpbnQgRklMRSAiZGVueSBib290cDsJI2RlZmF1bHRcbiI7CiAgICBwcmludCBGSUxFICJh dXRob3JpdGF0aXZlO1xuIjsKCiAgICAjIEROUyBVcGRhdGUgc2V0dGluZ3MKICAgIGlmICgkZGhj cHNldHRpbmdzeydETlNfVVBEQVRFX0VOQUJMRUQnfSBlcSAnb24nKSB7CiAgICAgICAgcHJpbnQg RklMRSAiZGRucy11cGRhdGVzICAgICAgICAgICBvbjtcbiI7CiAgICAgICAgcHJpbnQgRklMRSAi ZGRucy11cGRhdGUtc3R5bGUgICAgICBpbnRlcmltO1xuIjsKICAgICAgICBwcmludCBGSUxFICJk ZG5zLXR0bCAgICAgICAgICAgICAgIDYwOyAjIDEgbWluXG4iOwogICAgICAgIHByaW50IEZJTEUg Imlnbm9yZSAgICAgICAgICAgICAgICAgY2xpZW50LXVwZGF0ZXM7XG4iOwogICAgICAgIHByaW50 IEZJTEUgInVwZGF0ZS1zdGF0aWMtbGVhc2VzICAgb247XG4iOwogICAgfSBlbHNlIHsKICAgICAg ICBwcmludCBGSUxFICJkZG5zLXVwZGF0ZS1zdHlsZSBub25lO1xuIjsKICAgIH0KICAgIAogICAg IyBXcml0ZSBmaXJzdCBuZXcgb3B0aW9uIGRlZmluaXRpb24KICAgIGZvcmVhY2ggbXkgJGxpbmUg KEBjdXJyZW50MSkgewoJY2hvbXAoJGxpbmUpOyAgICMgcmVtb3ZlIG5ld2xpbmUKCW15IEB0ZW1w ID0gc3BsaXQoL1x0LywkbGluZSk7CiAgICAgICAgaWYgKEV4aXN0TmV3T3B0aW9uRGVmaW5pdGlv biAoJHRlbXBbMV0gLiAnICcgLiAkdGVtcFsyXSkpIHsKCQlwcmludCBGSUxFICJvcHRpb24gJHRl bXBbMV0gJHRlbXBbMl07XG4iOwoJfQogICAgfQogICAgIyBXcml0ZSBvdGhlciBnbG9iYWwgb3B0 aW9ucwogICAgZm9yZWFjaCBteSAkbGluZSAoQGN1cnJlbnQxKSB7CgljaG9tcCgkbGluZSk7ICAg IyByZW1vdmUgbmV3bGluZQoJbXkgQHRlbXAgPSBzcGxpdCgvXHQvLCRsaW5lKTsKCQoJaWYgKCR0 ZW1wWzBdIGVxICdvbicgJiYgIUV4aXN0TmV3T3B0aW9uRGVmaW5pdGlvbiAoJHRlbXBbMV0gLiAn ICcgLiAkdGVtcFsyXSkpeyAjIGFjdGl2ZSAmICFkZWZpbml0aW9uCgkgICAgbXkgJGdsb2JhbD0x OwoJICAgIGZvciAobXkgJGtleT0wOyAka2V5PEBJVEZzOyAka2V5KyspIHsKCQlteSAkaXRmID0g JHRlbXBbMyska2V5XTsKCQlpZiAoJGl0ZiBuZSAnb2ZmJykgIyBPbmx5IGlmIGFuIGludGVyZmFj ZSBuYW1lIGlzIHJlYWQKCQl7CgkJICAgICRnbG9iYWw9MDsKCQl9CgkgICAgfQoJICAgIGlmICgk Z2xvYmFsKSB7CgkJcHJpbnQgRklMRSAib3B0aW9uICR0ZW1wWzFdICR0ZW1wWzJdO1xuIjsKCSAg ICB9Cgl9IyBvbiAgICAKICAgIH0jIGZvcmVhY2ggbGluZQogICAgcHJpbnQgRklMRSAiXG4iOwoK ICAgICNTdWJuZXQgcmFuZ2UgZGVmaW5pdGlvbgogICAgZm9yZWFjaCBteSAkaXRmIChASVRGcykg ewoJbXkgJGxjX2l0Zj1sYygkaXRmKTsKCWlmICgkZGhjcHNldHRpbmdzeyJFTkFCTEVfJHtpdGZ9 In0gZXEgJ29uJyApewoJICAgIHByaW50IEZJTEUgInN1Ym5ldCAiIC4gJG5ldHNldHRpbmdzeyIk e2l0Zn1fTkVUQUREUkVTUyJ9IC4gIiBuZXRtYXNrICIuICRuZXRzZXR0aW5nc3siJHtpdGZ9X05F VE1BU0sifSAuICIgIyRpdGZcbiI7CgkgICAgcHJpbnQgRklMRSAie1xuIjsKCSAgICBwcmludCBG SUxFICJwb29sIHtcbiI7CgkgICAgcHJpbnQgRklMRSAiXHRyYW5nZSAiIC4gJGRoY3BzZXR0aW5n c3siU1RBUlRfQUREUl8ke2l0Zn0ifSAuICcgJyAuICRkaGNwc2V0dGluZ3N7IkVORF9BRERSXyR7 aXRmfSJ9LiI7XG4iIGlmICgkZGhjcHNldHRpbmdzeyJTVEFSVF9BRERSXyR7aXRmfSJ9KTsKCSAg ICBwcmludCBGSUxFICJcdG9wdGlvbiBzdWJuZXQtbWFzayAiICAgLiAkbmV0c2V0dGluZ3N7IiR7 aXRmfV9ORVRNQVNLIn0gLiAiO1xuIjsKCSAgICBwcmludCBGSUxFICJcdG9wdGlvbiBkb21haW4t bmFtZSBcIiIgLiAkZGhjcHNldHRpbmdzeyJET01BSU5fTkFNRV8ke2l0Zn0ifSAuICJcIjtcbiI7 CgkgICAgcHJpbnQgRklMRSAiXHRvcHRpb24gcm91dGVycyAiIC4gJG5ldHNldHRpbmdzeyIke2l0 Zn1fQUREUkVTUyJ9IC4gIjtcbiI7CgkgICAgcHJpbnQgRklMRSAiXHRvcHRpb24gZG9tYWluLW5h bWUtc2VydmVycyAiIC4gJGRoY3BzZXR0aW5nc3siRE5TMV8ke2l0Zn0ifSAgaWYgKCRkaGNwc2V0 dGluZ3N7IkROUzFfJHtpdGZ9In0pOwoJICAgIHByaW50IEZJTEUgIiwgIiAuICRkaGNwc2V0dGlu Z3N7IkROUzJfJHtpdGZ9In0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkZGhjcHNl dHRpbmdzeyJETlMyXyR7aXRmfSJ9KTsKCSAgICBwcmludCBGSUxFICI7XG4iICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGRoY3Bz ZXR0aW5nc3siRE5TMV8ke2l0Zn0ifSk7CgkgICAgcHJpbnQgRklMRSAiXHRvcHRpb24gbnRwLXNl cnZlcnMgIiAuICRkaGNwc2V0dGluZ3N7Ik5UUDFfJHtpdGZ9In0gICAgICAgICAgaWYgKCRkaGNw c2V0dGluZ3N7Ik5UUDFfJHtpdGZ9In0pOwoJICAgIHByaW50IEZJTEUgIiwgIiAuICRkaGNwc2V0 dGluZ3N7Ik5UUDJfJHtpdGZ9In0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgkZGhj cHNldHRpbmdzeyJOVFAyXyR7aXRmfSJ9KTsKCSAgICBwcmludCBGSUxFICI7XG4iICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGRo Y3BzZXR0aW5nc3siTlRQMV8ke2l0Zn0ifSk7CgkgICAgcHJpbnQgRklMRSAiXHRvcHRpb24gbmV0 Ymlvcy1uYW1lLXNlcnZlcnMgIiAuICRkaGNwc2V0dGluZ3N7IldJTlMxXyR7aXRmfSJ9ICAgICBp ZiAoJGRoY3BzZXR0aW5nc3siV0lOUzFfJHtpdGZ9In0pOwoJICAgIHByaW50IEZJTEUgIiwgIiAu ICRkaGNwc2V0dGluZ3N7IldJTlMyXyR7aXRmfSJ9ICAgICAgICAgICAgICAgICAgICAgICAgICAg IGlmICgkZGhjcHNldHRpbmdzeyJXSU5TMl8ke2l0Zn0ifSk7CgkgICAgcHJpbnQgRklMRSAiO1xu IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgaWYgKCRkaGNwc2V0dGluZ3N7IldJTlMxXyR7aXRmfSJ9KTsKCSAgICBwcmludCBGSUxFICJc dG5leHQtc2VydmVyICIgLiAkZGhjcHNldHRpbmdzeyJORVhUXyR7aXRmfSJ9IC4gIjtcbiIgaWYg KCRkaGNwc2V0dGluZ3N7Ik5FWFRfJHtpdGZ9In0pOwoJICAgIHByaW50IEZJTEUgIlx0ZmlsZW5h bWUgXCIiIC4gJkVzY2FwZUZpbGVuYW1lKCRkaGNwc2V0dGluZ3N7IkZJTEVfJHtpdGZ9In0pIC4g IlwiO1xuIiBpZiAoJGRoY3BzZXR0aW5nc3siRklMRV8ke2l0Zn0ifSk7CgkgICAgcHJpbnQgRklM RSAiXHRkZWZhdWx0LWxlYXNlLXRpbWUgIiAuICgkZGhjcHNldHRpbmdzeyJERUZBVUxUX0xFQVNF X1RJTUVfJHtpdGZ9In0gKiA2MCkuICI7XG4iOwoJICAgIHByaW50IEZJTEUgIlx0bWF4LWxlYXNl LXRpbWUgIiAgICAgLiAoJGRoY3BzZXR0aW5nc3siTUFYX0xFQVNFX1RJTUVfJHtpdGZ9In0gKiA2 MCkgICAgLiAiO1xuIjsKCSAgICBwcmludCBGSUxFICJcdGFsbG93IGJvb3RwO1xuIiBpZiAoJGRo Y3BzZXR0aW5nc3siRU5BQkxFQk9PVFBfJHtpdGZ9In0gZXEgJ29uJyk7CgkgICAgcHJpbnQgRklM RSAiXHRkZW55IHVua25vd24tY2xpZW50cztcbiIgaWYgKCRkaGNwc2V0dGluZ3N7IkRIQ1BfQ0xJ RU5UU18ke2l0Zn0ifSBlcSAnREVOWV9VTktOT1dOX0NMSUVOVFMnKTsKCSAgICBwcmludCBGSUxF ICJcdGRlbnkga25vd24tY2xpZW50cztcbiIgaWYgKCRkaGNwc2V0dGluZ3N7IkRIQ1BfQ0xJRU5U U18ke2l0Zn0ifSBlcSAnREVOWV9LTk9XTl9DTElFTlRTJyk7CgoKCgoJICAgICMgV3JpdGUgc2Nv cGVkIG9wdGlvbnMKCSAgICBmb3JlYWNoIG15ICRsaW5lIChAY3VycmVudDEpIHsKCQljaG9tcCgk bGluZSk7ICAgIyByZW1vdmUgbmV3bGluZQoJCW15IEB0ZW1wID0gc3BsaXQoL1x0LywkbGluZSk7 CQkjIFVzZSBUQUIgc2VwYXJhdG9yICEKCQoJCWlmICgkdGVtcFswXSBlcSAnb24nKXsKCQkgICAg Zm9yIChteSAka2V5PTA7ICRrZXk8QElURnM7ICRrZXkrKykgewoJCQlpZiAoJGl0ZiBlcSAkdGVt cFszKyRrZXldKSAjIE9ubHkgaXMgYW4gaW50ZXJmYWNlIG5hbWUgaXMgcmVhZAoJCQl7CgkJCSAg ICBwcmludCBGSUxFICJcdG9wdGlvbiAkdGVtcFsxXSAkdGVtcFsyXTtcbiI7CgkJCX0KCQkgICAg fQoJCX0jIG9uICAgIAoJICAgIH0jIGZvcmVhY2ggbGluZQoJICAgIHByaW50IEZJTEUgIiAgICAg fVxuIjsKCSAgICBwcmludCBGSUxFICJ9ICMkaXRmXG5cbiI7CgoJICAgIGlmICgoJGRoY3BzZXR0 aW5nc3siRE5TX1VQREFURV9FTkFCTEVEIn0gZXEgIm9uIikgJiYgKCRkaGNwc2V0dGluZ3N7IkRO U19VUERBVEVfS0VZX05BTUVfJHtpdGZ9In0gbmUgIiIpKSB7CgkgICAgICAgIHByaW50IEZJTEUg ImtleSAiIC4gJGRoY3BzZXR0aW5nc3siRE5TX1VQREFURV9LRVlfTkFNRV8ke2l0Zn0ifSAuICIg e1xuIjsKCSAgICAgICAgcHJpbnQgRklMRSAiXHRhbGdvcml0aG0gIiAuICRkaGNwc2V0dGluZ3N7 IkROU19VUERBVEVfS0VZX0FMR09fJHtpdGZ9In0gLiAiO1xuIjsKCSAgICAgICAgcHJpbnQgRklM RSAiXHRzZWNyZXQgXCIiIC4gJGRoY3BzZXR0aW5nc3siRE5TX1VQREFURV9LRVlfU0VDUkVUXyR7 aXRmfSJ9IC4gIlwiO1xuIjsKCSAgICAgICAgcHJpbnQgRklMRSAifTtcblxuIjsKCgkgICAgICAg IHByaW50IEZJTEUgInpvbmUgIiAuICRkaGNwc2V0dGluZ3N7IkRPTUFJTl9OQU1FXyR7aXRmfSJ9 IC4gIi4ge1xuIjsKCSAgICAgICAgcHJpbnQgRklMRSAiXHRrZXkgIiAuICRkaGNwc2V0dGluZ3N7 IkROU19VUERBVEVfS0VZX05BTUVfJHtpdGZ9In0gLiAiO1xuIjsKCQlwcmludCBGSUxFICJ9XG5c biI7CgkgICAgfQoKCSAgICBzeXN0ZW0gKCcvdXNyL2Jpbi90b3VjaCcsICIke0dlbmVyYWw6OnN3 cm9vdH0vZGhjcC9lbmFibGVfJHtsY19pdGZ9Iik7CgkgICAgJkdlbmVyYWw6OmxvZygiREhDUCBv biAke2l0Zn06ICIgLiAkTGFuZzo6dHJ7J2RoY3Agc2VydmVyIGVuYWJsZWQnfSkKCX0gZWxzZSB7 CgkgICAgdW5saW5rICIke0dlbmVyYWw6OnN3cm9vdH0vZGhjcC9lbmFibGVfJHtsY19pdGZ9IjsK CSAgICAmR2VuZXJhbDo6bG9nKCJESENQIG9uICR7aXRmfTogIiAuICRMYW5nOjp0cnsnZGhjcCBz ZXJ2ZXIgZGlzYWJsZWQnfSkKCX0KICAgIH0KCiAgICAjd3JpdGUgZml4ZWQgbGVhc2VzIGlmIGFu eS4gRG9lcyBub3QgaGFuZGxlIGR1cGxpY2F0ZXMgdG8gd3JpdGUgdGhlbSBlbHNld2hlcmUgdGhh biB0aGUgZ2xvYmFsIHNjb3BlLgogICAgbXkgJGtleSA9IDA7CiAgICBmb3JlYWNoIG15ICRsaW5l IChAY3VycmVudDIpIHsKCWNob21wKCRsaW5lKTsKCW15IEB0ZW1wID0gc3BsaXQoL1wsLywkbGlu ZSk7CglpZiAoJHRlbXBbMl0gZXEgIm9uIikgewoJICAgIHByaW50IEZJTEUgIlxuaG9zdCBmaXgk a2V5ICMgJHRlbXBbNl1cbiI7CgkgICAgcHJpbnQgRklMRSAie1xuIjsKCSAgICBwcmludCBGSUxF ICJcdGhhcmR3YXJlIGV0aGVybmV0ICR0ZW1wWzBdO1xuIjsKCSAgICBwcmludCBGSUxFICJcdGZp eGVkLWFkZHJlc3MgJHRlbXBbMV07XG4iOwoJICAgIHByaW50IEZJTEUgIlx0bmV4dC1zZXJ2ZXIg JHRlbXBbM107XG4iICAgICAgICAgIGlmICgkdGVtcFszXSk7CgkgICAgcHJpbnQgRklMRSAiXHRm aWxlbmFtZSBcIiIgLiAmRXNjYXBlRmlsZW5hbWUoJHRlbXBbNF0pIC4gIlwiO1xuIiBpZiAoJHRl bXBbNF0pOwoJICAgIHByaW50IEZJTEUgIlx0b3B0aW9uIHJvb3QtcGF0aCBcIiR0ZW1wWzVdXCI7 XG4iIGlmICgkdGVtcFs1XSk7CgkgICAgcHJpbnQgRklMRSAifVxuIjsKCSAgICAka2V5Kys7Cgl9 CiAgICB9CiAgICBwcmludCBGSUxFICJpbmNsdWRlIFwiJHtHZW5lcmFsOjpzd3Jvb3R9L2RoY3Av ZGhjcGQuY29uZi5sb2NhbFwiO1xuIjsKICAgIGNsb3NlIEZJTEU7CiAgICBpZiAoICRkaGNwc2V0 dGluZ3N7IkVOQUJMRV9HUkVFTiJ9IGVxICdvbicgfHwgJGRoY3BzZXR0aW5nc3siRU5BQkxFX0JM VUUifSBlcSAnb24nICkge3N5c3RlbSAnL3Vzci9sb2NhbC9iaW4vZGhjcGN0cmwgZW5hYmxlID4v ZGV2L251bGwgMj4mMSc7fQogICAgZWxzZSB7c3lzdGVtICcvdXNyL2xvY2FsL2Jpbi9kaGNwY3Ry bCBkaXNhYmxlID4vZGV2L251bGwgMj4mMSc7fQogICAgc3lzdGVtICcvdXNyL2xvY2FsL2Jpbi9k aGNwY3RybCByZXN0YXJ0ID4vZGV2L251bGwgMj4mMSAmJzsKfQoKIwojIFJlY2VpdmUgYSBzdHJp bmcgYW5kIGlmIGl0IG1hdGNoIG1vZGVsIGZvciBhIG5ldyBvcHRpb24sCiMgYWRkIGl0IHRvIHRo ZSBsaXN0ICVuZXdPcHRpb25zCiMKbXkgJU5ld09wdGlvbnMgPSAoKTsKCnN1YiBBZGROZXdPcHRp b25EZWZpbml0aW9uIHsKICAgIG15ICgkbGluZSkgPSBAXzsKICAgIGlmICggJGxpbmUgPX4gL14o Wy1cd10rKSggY29kZSBcZCs9KCRPcHRpb25UeXBlcykpLyApIHsKCSROZXdPcHRpb25zeyQxfSA9 ICQyOwoJIyZHZW5lcmFsOjpsb2cgKCJuZXc6PCQxPjwkMj4iKTsKCXJldHVybiAxOwogICAgfQog ICAgcmV0dXJuIDA7Cn0KCiMKIyBDaGVjayBleGlzdGVuY2Ugb2YgZGVmaW5pdGlvbiBmb3IgYSBu ZXcgb3B0aW9uCiMKc3ViIEV4aXN0TmV3T3B0aW9uRGVmaW5pdGlvbiB7CiAgICBteSAoJGxpbmUp ID0gQF87CgogICAgaWYgKCAkbGluZSA9fiAvXihbLVx3XSspKCBjb2RlIFxkKz0oJE9wdGlvblR5 cGVzKSkvICkgewoJcmV0dXJuIGRlZmluZWQgJE5ld09wdGlvbnN7JDF9OwogICAgfQogICAgcmV0 dXJuIDA7Cn0KCiMKIyBDaGVjayBpZiBpdCBpcyBhIG5ldyBvcHRpb24gKGRlZmluaXRpb24gbXVz dCBleGlzdCkKIyAiY29kZT0iIHRlc3QgZWxpbWluYXRlIGEgZmFsc2UgcmVzcG9uc2Ugd2hlbiBk ZWZpbml0aW9uIGV4aXN0cwojIGJ1dCB0aGlzIHN0cmluZyBpcyBhIGRlZmluaXRpb24gd2l0aCBi YWQgJE9wdGlvblR5cGVzLgpzdWIgVmFsaWROZXdPcHRpb24gewogICAgbXkgKCRsaW5lKSA9IEBf OwogICAgaWYgKCRsaW5lID1+IC9eKFstXHddKykgKC4qKS8gKSB7CglyZXR1cm4gZGVmaW5lZCAo ICROZXdPcHRpb25zeyQxfSApICYmICQyICF+IC9jb2RlPS87CiAgICB9CiAgICByZXR1cm4gMDsK fQoKIwojIENoZWNrIGlmIHRoZSBuZXcgb3B0aW9uICRvcHQgaXMgdXNlZCwgZXhjZXB0IHRoZSBk ZWZpbml0aW9uIG9mIGl0c2VsZiEKIwpzdWIgSXNVc2VkTmV3T3B0aW9uRGVmaW5pdGlvbiB7CiAg ICBteSAoJG9wdCwkdmFsKSA9IEBfOwoKICAgIGZvcmVhY2ggbXkgJGxpbmUgKEBjdXJyZW50MSkg ewoJI2Nob21wKCRsaW5lKTsgICAjIHJlbW92ZSBuZXdsaW5lICAgICAgICAjZG9uJ3Qga25vdyB3 aHksIGJ1dCB0aGlzIHJlbW92ZSBuZXdsaW5lIGluIEBjdXJyZW50MSAuLi4uICEKCW15IEB0ZW1w ID0gc3BsaXQoL1x0LywkbGluZSk7CgkjIGlmIHdlIGZpbmQgc29tZXRoaW5nICJvcHQgdmFsdWUi ICYgdmFsdWUgIT0gImNvZGUgbm5uPSIgaXQncyBvay4KCXJldHVybiAxIGlmICggKCRvcHQgZXEg JHRlbXBbMV0pICYmICgkdGVtcFsyXSAhfiAvY29kZSBcZCs9LykgKTsKICAgIH0KICAgIHJldHVy biAwOwp9CgpzdWIgRXNjYXBlRmlsZW5hbWUoJCkgewoJbXkgJGZpbGVuYW1lID0gc2hpZnQ7CgoJ IyBSZXBsYWNlIGFsbCBzaW5nbGUgLyBieSBcLwoJJGZpbGVuYW1lID1+IHMvXC8vXFxcLy9nOwoK CXJldHVybiAkZmlsZW5hbWU7Cn0K --===============4001512311447056657==--