jsPerf.app is an online JavaScript performance benchmark test runner & jsperf.com mirror. It is a complete rewrite in homage to the once excellent jsperf.com now with hopefully a more modern & maintainable codebase.
jsperf.com URLs are mirrored at the same path, e.g:
https://jsperf.com/negative-modulo/2
Can be accessed at:
https://jsperf.app/negative-modulo/2
// CloudFlare blocks JSON.
const data = atob(`eyJraW5kIjoiTGlzdGluZyIsImRhdGEiOnsibW9kaGFzaCI6ImxzcTBia25xcTI1Y2YyNWY5ZTMyNDg4NmUwZDg2NDk3ZjAyNjBiMzI2ZDFmYmI0MzlhIiwiZGlzdCI6NSwiY2hpbGRyZW4iOlt7ImtpbmQiOiJ0MyIsImRhdGEiOnsiYXBwcm92ZWRfYXRfdXRjIjpudWxsLCJzdWJyZWRkaXQiOiJqYXZhc2NyaXB0Iiwic2VsZnRleHQiOiJQb3N0IGEgbGluayB0byBhIEdpdEh1YiByZXBvIHRoYXQgeW91IHdvdWxkIGxpa2UgdG8gaGF2ZSByZXZpZXdlZCwgYW5kIGJyYWNlIHlvdXJzZWxmIGZvciB0aGUgY29tbWVudHMhXG5XaGV0aGVyIHlvdSdyZSBhIGp1bmlvciB3YW50aW5nIHlvdXIgY29kZSBzaGFycGVuZWQgb3IgYSBzZW5pb3IgaW50ZXJlc3RlZCBpbiBnaXZpbmcgc29tZSBmZWVkYmFjayBhbmQgaGF2ZSBzb21lIHRpbWUgdG8gc3BhcmUsIFxudGhpcyBpcyB0aGUgcGxhY2UuXG5cbltOYW1lZCBhZnRlciB0aGlzIGNvbWljXShodHRwczovL2Rhdmlkd2Fsc2gubmFtZS9kZW1vL2NvZGUtcmV2aWV3LnBuZykiLCJhdXRob3JfZnVsbG5hbWUiOiJ0Ml82bDR6MyIsInNhdmVkIjpmYWxzZSwibW9kX3JlYXNvbl90aXRsZSI6bnVsbCwiZ2lsZGVkIjowLCJjbGlja2VkIjpmYWxzZSwidGl0bGUiOiJXVEYgV2VkbmVzZGF5IChKdWx5IDA4LCAyMDIwKSIsImxpbmtfZmxhaXJfcmljaHRleHQiOltdLCJzdWJyZWRkaXRfbmFtZV9wcmVmaXhlZCI6InIvamF2YXNjcmlwdCIsImhpZGRlbiI6ZmFsc2UsInB3bHMiOjYsImxpbmtfZmxhaXJfY3NzX2NsYXNzIjoid3Rmd2VkbmVzZGF5IiwiZG93bnMiOjAsInRvcF9hd2FyZGVkX3R5cGUiOm51bGwsImhpZGVfc2NvcmUiOmZhbHNlLCJuYW1lIjoidDNfaG5qcWZmIiwicXVhcmFudGluZSI6ZmFsc2UsImxpbmtfZmxhaXJfdGV4dF9jb2xvciI6ImRhcmsiLCJ1cHZvdGVfcmF0aW8iOjAuNzksImF1dGhvcl9mbGFpcl9iYWNrZ3JvdW5kX2NvbG9yIjpudWxsLCJzdWJyZWRkaXRfdHlwZSI6InB1YmxpYyIsInVwcyI6MTAsInRvdGFsX2F3YXJkc19yZWNlaXZlZCI6MCwibWVkaWFfZW1iZWQiOnt9LCJhdXRob3JfZmxhaXJfdGVtcGxhdGVfaWQiOm51bGwsImlzX29yaWdpbmFsX2NvbnRlbnQiOmZhbHNlLCJ1c2VyX3JlcG9ydHMiOltdLCJzZWN1cmVfbWVkaWEiOm51bGwsImlzX3JlZGRpdF9tZWRpYV9kb21haW4iOmZhbHNlLCJpc19tZXRhIjpmYWxzZSwiY2F0ZWdvcnkiOm51bGwsInNlY3VyZV9tZWRpYV9lbWJlZCI6e30sImxpbmtfZmxhaXJfdGV4dCI6IldURiBXZWRuZXNkYXkiLCJjYW5fbW9kX3Bvc3QiOmZhbHNlLCJzY29yZSI6MTAsImFwcHJvdmVkX2J5IjpudWxsLCJhdXRob3JfcHJlbWl1bSI6dHJ1ZSwidGh1bWJuYWlsIjoiIiwiZWRpdGVkIjpmYWxzZSwiYXV0aG9yX2ZsYWlyX2Nzc19jbGFzcyI6bnVsbCwiYXV0aG9yX2ZsYWlyX3JpY2h0ZXh0IjpbXSwiZ2lsZGluZ3MiOnt9LCJjb250ZW50X2NhdGVnb3JpZXMiOm51bGwsImlzX3NlbGYiOnRydWUsIm1vZF9ub3RlIjpudWxsLCJjcmVhdGVkIjoxNTk0MjUzMDU2LCJsaW5rX2ZsYWlyX3R5cGUiOiJ0ZXh0Iiwid2xzIjo2LCJyZW1vdmVkX2J5X2NhdGVnb3J5IjpudWxsLCJiYW5uZWRfYnkiOm51bGwsImF1dGhvcl9mbGFpcl90eXBlIjoidGV4dCIsImRvbWFpbiI6InNlbGYuamF2YXNjcmlwdCIsImFsbG93X2xpdmVfY29tbWVudHMiOmZhbHNlLCJzZWxmdGV4dF9odG1sIjoiJmx0OyEtLSBTQ19PRkYgLS0mZ3Q7Jmx0O2RpdiBjbGFzcz1cIm1kXCImZ3Q7Jmx0O3AmZ3Q7UG9zdCBhIGxpbmsgdG8gYSBHaXRIdWIgcmVwbyB0aGF0IHlvdSB3b3VsZCBsaWtlIHRvIGhhdmUgcmV2aWV3ZWQsIGFuZCBicmFjZSB5b3Vyc2VsZiBmb3IgdGhlIGNvbW1lbnRzIVxuV2hldGhlciB5b3UmYW1wOyMzOTtyZSBhIGp1bmlvciB3YW50aW5nIHlvdXIgY29kZSBzaGFycGVuZWQgb3IgYSBzZW5pb3IgaW50ZXJlc3RlZCBpbiBnaXZpbmcgc29tZSBmZWVkYmFjayBhbmQgaGF2ZSBzb21lIHRpbWUgdG8gc3BhcmUsIFxudGhpcyBpcyB0aGUgcGxhY2UuJmx0Oy9wJmd0O1xuXG4mbHQ7cCZndDsmbHQ7YSBocmVmPVwiaHR0cHM6Ly9kYXZpZHdhbHNoLm5hbWUvZGVtby9jb2RlLXJldmlldy5wbmdcIiZndDtOYW1lZCBhZnRlciB0aGlzIGNvbWljJmx0Oy9hJmd0OyZsdDsvcCZndDtcbiZsdDsvZGl2Jmd0OyZsdDshLS0gU0NfT04gLS0mZ3Q7IiwibGlrZXMiOm51bGwsInN1Z2dlc3RlZF9zb3J0IjpudWxsLCJiYW5uZWRfYXRfdXRjIjpudWxsLCJ2aWV3X2NvdW50IjpudWxsLCJhcmNoaXZlZCI6ZmFsc2UsIm5vX2ZvbGxvdyI6dHJ1ZSwiaXNfY3Jvc3Nwb3N0YWJsZSI6dHJ1ZSwicGlubmVkIjpmYWxzZSwib3Zlcl8xOCI6ZmFsc2UsImFsbF9hd2FyZGluZ3MiOltdLCJhd2FyZGVycyI6W10sIm1lZGlhX29ubHkiOmZhbHNlLCJjYW5fZ2lsZCI6dHJ1ZSwic3BvaWxlciI6ZmFsc2UsImxvY2tlZCI6ZmFsc2UsImF1dGhvcl9mbGFpcl90ZXh0IjpudWxsLCJ0cmVhdG1lbnRfdGFncyI6W10sInZpc2l0ZWQiOmZhbHNlLCJyZW1vdmVkX2J5IjpudWxsLCJudW1fcmVwb3J0cyI6bnVsbCwiZGlzdGluZ3Vpc2hlZCI6Im1vZGVyYXRvciIsInN1YnJlZGRpdF9pZCI6InQ1XzJxaDMwIiwibW9kX3JlYXNvbl9ieSI6bnVsbCwicmVtb3ZhbF9yZWFzb24iOm51bGwsImxpbmtfZmxhaXJfYmFja2dyb3VuZF9jb2xvciI6IiIsImlkIjoiaG5qcWZmIiwiaXNfcm9ib3RfaW5kZXhhYmxlIjp0cnVlLCJyZXBvcnRfcmVhc29ucyI6bnVsbCwiYXV0aG9yIjoiQXV0b01vZGVyYXRvciIsImRpc2N1c3Npb25fdHlwZSI6bnVsbCwibnVtX2NvbW1lbnRzIjozLCJzZW5kX3JlcGxpZXMiOmZhbHNlLCJ3aGl0ZWxpc3Rfc3RhdHVzIjoiYWxsX2FkcyIsImNvbnRlc3RfbW9kZSI6ZmFsc2UsIm1vZF9yZXBvcnRzIjpbXSwiYXV0aG9yX3BhdHJlb25fZmxhaXIiOmZhbHNlLCJhdXRob3JfZmxhaXJfdGV4dF9jb2xvciI6bnVsbCwicGVybWFsaW5rIjoiL3IvamF2YXNjcmlwdC9jb21tZW50cy9obmpxZmYvd3RmX3dlZG5lc2RheV9qdWx5XzA4XzIwMjAvIiwicGFyZW50X3doaXRlbGlzdF9zdGF0dXMiOiJhbGxfYWRzIiwic3RpY2tpZWQiOnRydWUsInVybCI6Imh0dHBzOi8vd3d3LnJlZGRpdC5jb20vci9qYXZhc2NyaXB0L2NvbW1lbnRzL2huanFmZi93dGZfd2VkbmVzZGF5X2p1bHlfMDhfMjAyMC8iLCJzdWJyZWRkaXRfc3Vic2NyaWJlcnMiOjEwMDg2MDMsImNyZWF0ZWRfdXRjIjoxNTk0MjI0MjU2LCJudW1fY3Jvc3Nwb3N0cyI6MCwibWVkaWEiOm51bGwsImlzX3ZpZGVvIjpmYWxzZX19LHsia2luZCI6InQzIiwiZGF0YSI6eyJhcHByb3ZlZF9hdF91dGMiOm51bGwsInN1YnJlZGRpdCI6ImphdmFzY3JpcHQiLCJzZWxmdGV4dCI6IlBvc3QgYSBsaW5rIHRvIGEgR2l0SHViIHJlcG8gdGhhdCB5b3Ugd291bGQgbGlrZSB0byBoYXZlIHJldmlld2VkLCBhbmQgYnJhY2UgeW91cnNlbGYgZm9yIHRoZSBjb21tZW50cyFcbldoZXRoZXIgeW91J3JlIGEganVuaW9yIHdhbnRpbmcgeW91ciBjb2RlIHNoYXJwZW5lZCBvciBhIHNlbmlvciBpbnRlcmVzdGVkIGluIGdpdmluZyBzb21lIGZlZWRiYWNrIGFuZCBoYXZlIHNvbWUgdGltZSB0byBzcGFyZSwgXG50aGlzIGlzIHRoZSBwbGFjZS5cblxuW05hbWVkIGFmdGVyIHRoaXMgY29taWNdKGh0dHBzOi8vZGF2aWR3YWxzaC5uYW1lL2RlbW8vY29kZS1yZXZpZXcucG5nKSIsImF1dGhvcl9mdWxsbmFtZSI6InQyXzZsNHozIiwic2F2ZWQiOmZhbHNlLCJtb2RfcmVhc29uX3RpdGxlIjpudWxsLCJnaWxkZWQiOjAsImNsaWNrZWQiOmZhbHNlLCJ0aXRsZSI6IldURiBXZWRuZXNkYXkgKEp1bHkgMTUsIDIwMjApIiwibGlua19mbGFpcl9yaWNodGV4dCI6W10sInN1YnJlZGRpdF9uYW1lX3ByZWZpeGVkIjoici9qYXZhc2NyaXB0IiwiaGlkZGVuIjpmYWxzZSwicHdscyI6NiwibGlua19mbGFpcl9jc3NfY2xhc3MiOiJ3dGZ3ZWRuZXNkYXkiLCJkb3ducyI6MCwidG9wX2F3YXJkZWRfdHlwZSI6bnVsbCwiaGlkZV9zY29yZSI6ZmFsc2UsIm5hbWUiOiJ0M19ocnFiMjAiLCJxdWFyYW50aW5lIjpmYWxzZSwibGlua19mbGFpcl90ZXh0X2NvbG9yIjoiZGFyayIsInVwdm90ZV9yYXRpbyI6MSwiYXV0aG9yX2ZsYWlyX2JhY2tncm91bmRfY29sb3IiOm51bGwsInN1YnJlZGRpdF90eXBlIjoicHVibGljIiwidXBzIjoxLCJ0b3RhbF9hd2FyZHNfcmVjZWl2ZWQiOjAsIm1lZGlhX2VtYmVkIjp7fSwiYXV0aG9yX2ZsYWlyX3RlbXBsYXRlX2lkIjpudWxsLCJpc19vcmlnaW5hbF9jb250ZW50IjpmYWxzZSwidXNlcl9yZXBvcnRzIjpbXSwic2VjdXJlX21lZGlhIjpudWxsLCJpc19yZWRkaXRfbWVkaWFfZG9tYWluIjpmYWxzZSwiaXNfbWV0YSI6ZmFsc2UsImNhdGVnb3J5IjpudWxsLCJzZWN1cmVfbWVkaWFfZW1iZWQiOnt9LCJsaW5rX2ZsYWlyX3RleHQiOiJXVEYgV2VkbmVzZGF5IiwiY2FuX21vZF9wb3N0IjpmYWxzZSwic2NvcmUiOjEsImFwcHJvdmVkX2J5IjpudWxsLCJhdXRob3JfcHJlbWl1bSI6dHJ1ZSwidGh1bWJuYWlsIjoiIiwiZWRpdGVkIjpmYWxzZSwiYXV0aG9yX2ZsYWlyX2Nzc19jbGFzcyI6bnVsbCwiYXV0aG9yX2ZsYWlyX3JpY2h0ZXh0IjpbXSwiZ2lsZGluZ3MiOnt9LCJjb250ZW50X2NhdGVnb3JpZXMiOm51bGwsImlzX3NlbGYiOnRydWUsIm1vZF9ub3RlIjpudWxsLCJjcmVhdGVkIjoxNTk0ODU3ODY4LCJsaW5rX2ZsYWlyX3R5cGUiOiJ0ZXh0Iiwid2xzIjo2LCJyZW1vdmVkX2J5X2NhdGVnb3J5IjpudWxsLCJiYW5uZWRfYnkiOm51bGwsImF1dGhvcl9mbGFpcl90eXBlIjoidGV4dCIsImRvbWFpbiI6InNlbGYuamF2YXNjcmlwdCIsImFsbG93X2xpdmVfY29tbWVudHMiOmZhbHNlLCJzZWxmdGV4dF9odG1sIjoiJmx0OyEtLSBTQ19PRkYgLS0mZ3Q7Jmx0O2RpdiBjbGFzcz1cIm1kXCImZ3Q7Jmx0O3AmZ3Q7UG9zdCBhIGxpbmsgdG8gYSBHaXRIdWIgcmVwbyB0aGF0IHlvdSB3b3VsZCBsaWtlIHRvIGhhdmUgcmV2aWV3ZWQsIGFuZCBicmFjZSB5b3Vyc2VsZiBmb3IgdGhlIGNvbW1lbnRzIVxuV2hldGhlciB5b3UmYW1wOyMzOTtyZSBhIGp1bmlvciB3YW50aW5nIHlvdXIgY29kZSBzaGFycGVuZWQgb3IgYSBzZW5pb3IgaW50ZXJlc3RlZCBpbiBnaXZpbmcgc29tZSBmZWVkYmFjayBhbmQgaGF2ZSBzb21lIHRpbWUgdG8gc3BhcmUsIFxudGhpcyBpcyB0aGUgcGxhY2UuJmx0Oy9wJmd0O1xuXG4mbHQ7cCZndDsmbHQ7YSBocmVmPVwiaHR0cHM6Ly9kYXZpZHdhbHNoLm5hbWUvZGVtby9jb2RlLXJldmlldy5wbmdcIiZndDtOYW1lZCBhZnRlciB0aGlzIGNvbWljJmx0Oy9hJmd0OyZsdDsvcCZndDtcbiZsdDsvZGl2Jmd0OyZsdDshLS0gU0NfT04gLS0mZ3Q7IiwibGlrZXMiOm51bGwsInN1Z2dlc3RlZF9zb3J0IjpudWxsLCJiYW5uZWRfYXRfdXRjIjpudWxsLCJ2aWV3X2NvdW50IjpudWxsLCJhcmNoaXZlZCI6ZmFsc2UsIm5vX2ZvbGxvdyI6dHJ1ZSwiaXNfY3Jvc3Nwb3N0YWJsZSI6dHJ1ZSwicGlubmVkIjpmYWxzZSwib3Zlcl8xOCI6ZmFsc2UsImFsbF9hd2FyZGluZ3MiOltdLCJhd2FyZGVycyI6W10sIm1lZGlhX29ubHkiOmZhbHNlLCJjYW5fZ2lsZCI6dHJ1ZSwic3BvaWxlciI6ZmFsc2UsImxvY2tlZCI6ZmFsc2UsImF1dGhvcl9mbGFpcl90ZXh0IjpudWxsLCJ0cmVhdG1lbnRfdGFncyI6W10sInZpc2l0ZWQiOmZhbHNlLCJyZW1vdmVkX2J5IjpudWxsLCJudW1fcmVwb3J0cyI6bnVsbCwiZGlzdGluZ3Vpc2hlZCI6Im1vZGVyYXRvciIsInN1YnJlZGRpdF9pZCI6InQ1XzJxaDMwIiwibW9kX3JlYXNvbl9ieSI6bnVsbCwicmVtb3ZhbF9yZWFzb24iOm51bGwsImxpbmtfZmxhaXJfYmFja2dyb3VuZF9jb2xvciI6IiIsImlkIjoiaHJxYjIwIiwiaXNfcm9ib3RfaW5kZXhhYmxlIjp0cnVlLCJyZXBvcnRfcmVhc29ucyI6bnVsbCwiYXV0aG9yIjoiQXV0b01vZGVyYXRvciIsImRpc2N1c3Npb25fdHlwZSI6bnVsbCwibnVtX2NvbW1lbnRzIjowLCJzZW5kX3JlcGxpZXMiOmZhbHNlLCJ3aGl0ZWxpc3Rfc3RhdHVzIjoiYWxsX2FkcyIsImNvbnRlc3RfbW9kZSI6ZmFsc2UsIm1vZF9yZXBvcnRzIjpbXSwiYXV0aG9yX3BhdHJlb25fZmxhaXIiOmZhbHNlLCJhdXRob3JfZmxhaXJfdGV4dF9jb2xvciI6bnVsbCwicGVybWFsaW5rIjoiL3IvamF2YXNjcmlwdC9jb21tZW50cy9ocnFiMjAvd3RmX3dlZG5lc2RheV9qdWx5XzE1XzIwMjAvIiwicGFyZW50X3doaXRlbGlzdF9zdGF0dXMiOiJhbGxfYWRzIiwic3RpY2tpZWQiOnRydWUsInVybCI6Imh0dHBzOi8vd3d3LnJlZGRpdC5jb20vci9qYXZhc2NyaXB0L2NvbW1lbnRzL2hycWIyMC93dGZfd2VkbmVzZGF5X2p1bHlfMTVfMjAyMC8iLCJzdWJyZWRkaXRfc3Vic2NyaWJlcnMiOjEwMDg2MDMsImNyZWF0ZWRfdXRjIjoxNTk0ODI5MDY4LCJudW1fY3Jvc3Nwb3N0cyI6MCwibWVkaWEiOm51bGwsImlzX3ZpZGVvIjpmYWxzZX19LHsia2luZCI6InQzIiwiZGF0YSI6eyJhcHByb3ZlZF9hdF91dGMiOm51bGwsInN1YnJlZGRpdCI6ImphdmFzY3JpcHQiLCJzZWxmdGV4dCI6IiIsImF1dGhvcl9mdWxsbmFtZSI6InQyXzE2Y2didSIsInNhdmVkIjpmYWxzZSwibW9kX3JlYXNvbl90aXRsZSI6bnVsbCwiZ2lsZGVkIjowLCJjbGlja2VkIjpmYWxzZSwidGl0bGUiOiJTdXBlciBFeHByZXNzaXZlIC0gYSBaZXJvLWRlcGVuZGVuY3kgSmF2YVNjcmlwdCBMaWJyYXJ5IEZvciBCdWlsZGluZyBSZWd1bGFyIEV4cHJlc3Npb25zIGluIChBbG1vc3QpIE5hdHVyYWwgTGFuZ3VhZ2UiLCJsaW5rX2ZsYWlyX3JpY2h0ZXh0IjpbXSwic3VicmVkZGl0X25hbWVfcHJlZml4ZWQiOiJyL2phdmFzY3JpcHQiLCJoaWRkZW4iOmZhbHNlLCJwd2xzIjo2LCJsaW5rX2ZsYWlyX2Nzc19jbGFzcyI6bnVsbCwiZG93bnMiOjAsInRvcF9hd2FyZGVkX3R5cGUiOm51bGwsImhpZGVfc2NvcmUiOmZhbHNlLCJuYW1lIjoidDNfaHJsdjB3IiwicXVhcmFudGluZSI6ZmFsc2UsImxpbmtfZmxhaXJfdGV4dF9jb2xvciI6ImRhcmsiLCJ1cHZvdGVfcmF0aW8iOjAuOTgsImF1dGhvcl9mbGFpcl9iYWNrZ3JvdW5kX2NvbG9yIjpudWxsLCJzdWJyZWRkaXRfdHlwZSI6InB1YmxpYyIsInVwcyI6MTc1LCJ0b3RhbF9hd2FyZHNfcmVjZWl2ZWQiOjEsIm1lZGlhX2VtYmVkIjp7fSwiYXV0aG9yX2ZsYWlyX3RlbXBsYXRlX2lkIjpudWxsLCJpc19vcmlnaW5hbF9jb250ZW50IjpmYWxzZSwidXNlcl9yZXBvcnRzIjpbXSwic2VjdXJlX21lZGlhIjpudWxsLCJpc19yZWRkaXRfbWVkaWFfZG9tYWluIjpmYWxzZSwiaXNfbWV0YSI6ZmFsc2UsImNhdGVnb3J5IjpudWxsLCJzZWN1cmVfbWVkaWFfZW1iZWQiOnt9LCJsaW5rX2ZsYWlyX3RleHQiOm51bGwsImNhbl9tb2RfcG9zdCI6ZmFsc2UsInNjb3JlIjoxNzUsImFwcHJvdmVkX2J5IjpudWxsLCJhdXRob3JfcHJlbWl1bSI6ZmFsc2UsInRodW1ibmFpbCI6IiIsImVkaXRlZCI6ZmFsc2UsImF1dGhvcl9mbGFpcl9jc3NfY2xhc3MiOm51bGwsImF1dGhvcl9mbGFpcl9yaWNodGV4dCI6W10sImdpbGRpbmdzIjp7fSwiY29udGVudF9jYXRlZ29yaWVzIjpudWxsLCJpc19zZWxmIjpmYWxzZSwibW9kX25vdGUiOm51bGwsImNyZWF0ZWQiOjE1OTQ4NDEyNTIsImxpbmtfZmxhaXJfdHlwZSI6InRleHQiLCJ3bHMiOjYsInJlbW92ZWRfYnlfY2F0ZWdvcnkiOm51bGwsImJhbm5lZF9ieSI6bnVsbCwiYXV0aG9yX2ZsYWlyX3R5cGUiOiJ0ZXh0IiwiZG9tYWluIjoiZ2l0aHViLmNvbSIsImFsbG93X2xpdmVfY29tbWVudHMiOmZhbHNlLCJzZWxmdGV4dF9odG1sIjpudWxsLCJsaWtlcyI6bnVsbCwic3VnZ2VzdGVkX3NvcnQiOm51bGwsImJhbm5lZF9hdF91dGMiOm51bGwsInVybF9vdmVycmlkZGVuX2J5X2Rlc3QiOiJodHRwczovL2dpdGh1Yi5jb20vZnJhbmNpc3JzdG9rZXMvc3VwZXItZXhwcmVzc2l2ZSIsInZpZXdfY291bnQiOm51bGwsImFyY2hpdmVkIjpmYWxzZSwibm9fZm9sbG93IjpmYWxzZSwiaXNfY3Jvc3Nwb3N0YWJsZSI6dHJ1ZSwicGlubmVkIjpmYWxzZSwib3Zlcl8xOCI6ZmFsc2UsImFsbF9hd2FyZGluZ3MiOlt7ImdpdmVyX2NvaW5fcmV3YXJkIjpudWxsLCJzdWJyZWRkaXRfaWQiOm51bGwsImlzX25ldyI6ZmFsc2UsImRheXNfb2ZfZHJpcF9leHRlbnNpb24iOjAsImNvaW5fcHJpY2UiOjE1MCwiaWQiOiJhd2FyZF9mNDQ2MTFmMS1iODllLTQ2ZGMtOTdmZS04OTIyODBiMTNiODIiLCJwZW5ueV9kb25hdGUiOm51bGwsImF3YXJkX3N1Yl90eXBlIjoiR0xPQkFMIiwiY29pbl9yZXdhcmQiOjAsImljb25fdXJsIjoiaHR0cHM6Ly9pLnJlZGQuaXQvYXdhcmRfaW1hZ2VzL3Q1XzIyY2VycS9rbHZ4azF3Z2dmZDQxX0hlbHBmdWwucG5nIiwiZGF5c19vZl9wcmVtaXVtIjowLCJyZXNpemVkX2ljb25zIjpbeyJ1cmwiOiJodHRwczovL3ByZXZpZXcucmVkZC5pdC9hd2FyZF9pbWFnZXMvdDVfMjJjZXJxL2tsdnhrMXdnZ2ZkNDFfSGVscGZ1bC5wbmc/d2lkdGg9MTYmYW1wO2hlaWdodD0xNiZhbXA7YXV0bz13ZWJwJmFtcDtzPWE1NjYyZGZiZGI0MDJiZjY3ODY2YzA1MGFhNzZjMzFjMTQ3YzJmNDUiLCJ3aWR0aCI6MTYsImhlaWdodCI6MTZ9LHsidXJsIjoiaHR0cHM6Ly9wcmV2aWV3LnJlZGQuaXQvYXdhcmRfaW1hZ2VzL3Q1XzIyY2VycS9rbHZ4azF3Z2dmZDQxX0hlbHBmdWwucG5nP3dpZHRoPTMyJmFtcDtoZWlnaHQ9MzImYW1wO2F1dG89d2VicCZhbXA7cz1hNjg4MmViM2YzODBlOGU4ODAwOTc4OWY0ZDAwNzJlMTdiOGM1OWYxIiwid2lkdGgiOjMyLCJoZWlnaHQiOjMyfSx7InVybCI6Imh0dHBzOi8vcHJldmlldy5yZWRkLml0L2F3YXJkX2ltYWdlcy90NV8yMmNlcnEva2x2eGsxd2dnZmQ0MV9IZWxwZnVsLnBuZz93aWR0aD00OCZhbXA7aGVpZ2h0PTQ4JmFtcDthdXRvPXdlYnAmYW1wO3M9ZTUwMDY0YjA5MDg3OWU4YTBiNTVlNDMzZjZlZTYxZDVjYjVmYmUxZCIsIndpZHRoIjo0OCwiaGVpZ2h0Ijo0OH0seyJ1cmwiOiJodHRwczovL3ByZXZpZXcucmVkZC5pdC9hd2FyZF9pbWFnZXMvdDVfMjJjZXJxL2tsdnhrMXdnZ2ZkNDFfSGVscGZ1bC5wbmc/d2lkdGg9NjQmYW1wO2hlaWdodD02NCZhbXA7YXV0bz13ZWJwJmFtcDtzPThlNWJiMmU3NjY4M2NiNmIxNjE4MzBiY2RkOTY0MjA0OWQ2YWRjMTEiLCJ3aWR0aCI6NjQsImhlaWdodCI6NjR9LHsidXJsIjoiaHR0cHM6Ly9wcmV2aWV3LnJlZGQuaXQvYXdhcmRfaW1hZ2VzL3Q1XzIyY2VycS9rbHZ4azF3Z2dmZDQxX0hlbHBmdWwucG5nP3dpZHRoPTEyOCZhbXA7aGVpZ2h0PTEyOCZhbXA7YXV0bz13ZWJwJmFtcDtzPWVkYTRhOTI0NmY5NWY0MmVlNjk0MGNjMGVjNjUzMDZmZDIwZGU4NzgiLCJ3aWR0aCI6MTI4LCJoZWlnaHQiOjEyOH1dLCJpY29uX3dpZHRoIjoyMDQ4LCJzdGF0aWNfaWNvbl93aWR0aCI6MjA0OCwic3RhcnRfZGF0ZSI6bnVsbCwiaXNfZW5hYmxlZCI6dHJ1ZSwiZGVzY3JpcHRpb24iOiJUaGFuayB5b3Ugc3RyYW5nZXIuIFNob3dzIHRoZSBhd2FyZC4iLCJlbmRfZGF0ZSI6bnVsbCwic3VicmVkZGl0X2NvaW5fcmV3YXJkIjowLCJjb3VudCI6MSwic3RhdGljX2ljb25faGVpZ2h0IjoyMDQ4LCJuYW1lIjoiSGVscGZ1bCIsInJlc2l6ZWRfc3RhdGljX2ljb25zIjpbeyJ1cmwiOiJodHRwczovL3ByZXZpZXcucmVkZC5pdC9hd2FyZF9pbWFnZXMvdDVfMjJjZXJxL2tsdnhrMXdnZ2ZkNDFfSGVscGZ1bC5wbmc/d2lkdGg9MTYmYW1wO2hlaWdodD0xNiZhbXA7YXV0bz13ZWJwJmFtcDtzPWE1NjYyZGZiZGI0MDJiZjY3ODY2YzA1MGFhNzZjMzFjMTQ3YzJmNDUiLCJ3aWR0aCI6MTYsImhlaWdodCI6MTZ9LHsidXJsIjoiaHR0cHM6Ly9wcmV2aWV3LnJlZGQuaXQvYXdhcmRfaW1hZ2VzL3Q1XzIyY2VycS9rbHZ4azF3Z2dmZDQxX0hlbHBmdWwucG5nP3dpZHRoPTMyJmFtcDtoZWlnaHQ9MzImYW1wO2F1dG89d2VicCZhbXA7cz1hNjg4MmViM2YzODBlOGU4ODAwOTc4OWY0ZDAwNzJlMTdiOGM1OWYxIiwid2lkdGgiOjMyLCJoZWlnaHQiOjMyfSx7InVybCI6Imh0dHBzOi8vcHJldmlldy5yZWRkLml0L2F3YXJkX2ltYWdlcy90NV8yMmNlcnEva2x2eGsxd2dnZmQ0MV9IZWxwZnVsLnBuZz93aWR0aD00OCZhbXA7aGVpZ2h0PTQ4JmFtcDthdXRvPXdlYnAmYW1wO3M9ZTUwMDY0YjA5MDg3OWU4YTBiNTVlNDMzZjZlZTYxZDVjYjVmYmUxZCIsIndpZHRoIjo0OCwiaGVpZ2h0Ijo0OH0seyJ1cmwiOiJodHRwczovL3ByZXZpZXcucmVkZC5pdC9hd2FyZF9pbWFnZXMvdDVfMjJjZXJxL2tsdnhrMXdnZ2ZkNDFfSGVscGZ1bC5wbmc/d2lkdGg9NjQmYW1wO2hlaWdodD02NCZhbXA7YXV0bz13ZWJwJmFtcDtzPThlNWJiMmU3NjY4M2NiNmIxNjE4MzBiY2RkOTY0MjA0OWQ2YWRjMTEiLCJ3aWR0aCI6NjQsImhlaWdodCI6NjR9LHsidXJsIjoiaHR0cHM6Ly9wcmV2aWV3LnJlZGQuaXQvYXdhcmRfaW1hZ2VzL3Q1XzIyY2VycS9rbHZ4azF3Z2dmZDQxX0hlbHBmdWwucG5nP3dpZHRoPTEyOCZhbXA7aGVpZ2h0PTEyOCZhbXA7YXV0bz13ZWJwJmFtcDtzPWVkYTRhOTI0NmY5NWY0MmVlNjk0MGNjMGVjNjUzMDZmZDIwZGU4NzgiLCJ3aWR0aCI6MTI4LCJoZWlnaHQiOjEyOH1dLCJpY29uX2Zvcm1hdCI6bnVsbCwiaWNvbl9oZWlnaHQiOjIwNDgsInBlbm55X3ByaWNlIjpudWxsLCJhd2FyZF90eXBlIjoiZ2xvYmFsIiwic3RhdGljX2ljb25fdXJsIjoiaHR0cHM6Ly9pLnJlZGQuaXQvYXdhcmRfaW1hZ2VzL3Q1XzIyY2VycS9rbHZ4azF3Z2dmZDQxX0hlbHBmdWwucG5nIn1dLCJhd2FyZGVycyI6W10sIm1lZGlhX29ubHkiOmZhbHNlLCJjYW5fZ2lsZCI6dHJ1ZSwic3BvaWxlciI6ZmFsc2UsImxvY2tlZCI6ZmFsc2UsImF1dGhvcl9mbGFpcl90ZXh0IjpudWxsLCJ0cmVhdG1lbnRfdGFncyI6W10sInZpc2l0ZWQiOmZhbHNlLCJyZW1vdmVkX2J5IjpudWxsLCJudW1fcmVwb3J0cyI6bnVsbCwiZGlzdGluZ3Vpc2hlZCI6bnVsbCwic3VicmVkZGl0X2lkIjoidDVfMnFoMzAiLCJtb2RfcmVhc29uX2J5IjpudWxsLCJyZW1vdmFsX3JlYXNvbiI6bnVsbCwibGlua19mbGFpcl9iYWNrZ3JvdW5kX2NvbG9yIjoiIiwiaWQiOiJocmx2MHciLCJpc19yb2JvdF9pbmRleGFibGUiOnRydWUsInJlcG9ydF9yZWFzb25zIjpudWxsLCJhdXRob3IiOiJGcmFuY2lzU3Rva2VzIiwiZGlzY3Vzc2lvbl90eXBlIjpudWxsLCJudW1fY29tbWVudHMiOjQyLCJzZW5kX3JlcGxpZXMiOnRydWUsIndoaXRlbGlzdF9zdGF0dXMiOiJhbGxfYWRzIiwiY29udGVzdF9tb2RlIjpmYWxzZSwibW9kX3JlcG9ydHMiOltdLCJhdXRob3JfcGF0cmVvbl9mbGFpciI6ZmFsc2UsImF1dGhvcl9mbGFpcl90ZXh0X2NvbG9yIjpudWxsLCJwZXJtYWxpbmsiOiIvci9qYXZhc2NyaXB0L2NvbW1lbnRzL2hybHYwdy9zdXBlcl9leHByZXNzaXZlX2FfemVyb2RlcGVuZGVuY3lfamF2YXNjcmlwdC8iLCJwYXJlbnRfd2hpdGVsaXN0X3N0YXR1cyI6ImFsbF9hZHMiLCJzdGlja2llZCI6ZmFsc2UsInVybCI6Imh0dHBzOi8vZ2l0aHViLmNvbS9mcmFuY2lzcnN0b2tlcy9zdXBlci1leHByZXNzaXZlIiwic3VicmVkZGl0X3N1YnNjcmliZXJzIjoxMDA4NjAzLCJjcmVhdGVkX3V0YyI6MTU5NDgxMjQ1MiwibnVtX2Nyb3NzcG9zdHMiOjAsIm1lZGlhIjpudWxsLCJpc192aWRlbyI6ZmFsc2V9fSx7ImtpbmQiOiJ0MyIsImRhdGEiOnsiYXBwcm92ZWRfYXRfdXRjIjpudWxsLCJzdWJyZWRkaXQiOiJqYXZhc2NyaXB0Iiwic2VsZnRleHQiOiIiLCJhdXRob3JfZnVsbG5hbWUiOiJ0Ml9uZTh3enkwIiwic2F2ZWQiOmZhbHNlLCJtb2RfcmVhc29uX3RpdGxlIjpudWxsLCJnaWxkZWQiOjAsImNsaWNrZWQiOmZhbHNlLCJ0aXRsZSI6Ik1vdmVhYmxlIEVkaXRvciBUb29sIDAuMTggUmVsZWFzZSEgRHJhZywgUmVzaXplLCBTY2FsZSwgUm90YXRlLCBDbGlwLCBHcm91cCwgU25hcCIsImxpbmtfZmxhaXJfcmljaHRleHQiOltdLCJzdWJyZWRkaXRfbmFtZV9wcmVmaXhlZCI6InIvamF2YXNjcmlwdCIsImhpZGRlbiI6ZmFsc2UsInB3bHMiOjYsImxpbmtfZmxhaXJfY3NzX2NsYXNzIjpudWxsLCJkb3ducyI6MCwidG9wX2F3YXJkZWRfdHlwZSI6bnVsbCwiaGlkZV9zY29yZSI6ZmFsc2UsIm5hbWUiOiJ0M19ocmcybjAiLCJxdWFyYW50aW5lIjpmYWxzZSwibGlua19mbGFpcl90ZXh0X2NvbG9yIjoiZGFyayIsInVwdm90ZV9yYXRpbyI6MC45OCwiYXV0aG9yX2ZsYWlyX2JhY2tncm91bmRfY29sb3IiOm51bGwsInN1YnJlZGRpdF90eXBlIjoicHVibGljIiwidXBzIjoxNTcsInRvdGFsX2F3YXJkc19yZWNlaXZlZCI6MCwibWVkaWFfZW1iZWQiOnt9LCJhdXRob3JfZmxhaXJfdGVtcGxhdGVfaWQiOm51bGwsImlzX29yaWdpbmFsX2NvbnRlbnQiOmZhbHNlLCJ1c2VyX3JlcG9ydHMiOltdLCJzZWN1cmVfbWVkaWEiOm51bGwsImlzX3JlZGRpdF9tZWRpYV9kb21haW4iOmZhbHNlLCJpc19tZXRhIjpmYWxzZSwiY2F0ZWdvcnkiOm51bGwsInNlY3VyZV9tZWRpYV9lbWJlZCI6e30sImxpbmtfZmxhaXJfdGV4dCI6bnVsbCwiY2FuX21vZF9wb3N0IjpmYWxzZSwic2NvcmUiOjE1NywiYXBwcm92ZWRfYnkiOm51bGwsImF1dGhvcl9wcmVtaXVtIjpmYWxzZSwidGh1bWJuYWlsIjoiIiwiZWRpdGVkIjpmYWxzZSwiYXV0aG9yX2ZsYWlyX2Nzc19jbGFzcyI6bnVsbCwiYXV0aG9yX2ZsYWlyX3JpY2h0ZXh0IjpbXSwiZ2lsZGluZ3MiOnt9LCJjb250ZW50X2NhdGVnb3JpZXMiOm51bGwsImlzX3NlbGYiOmZhbHNlLCJtb2Rfbm90ZSI6bnVsbCwiY3JlYXRlZCI6MTU5NDgxMTk5MSwibGlua19mbGFpcl90eXBlIjoidGV4dCIsIndscyI6NiwicmVtb3ZlZF9ieV9jYXRlZ29yeSI6bnVsbCwiYmFubmVkX2J5IjpudWxsLCJhdXRob3JfZmxhaXJfdHlwZSI6InRleHQiLCJkb21haW4iOiJkYXlicnVzaC5jb20iLCJhbGxvd19saXZlX2NvbW1lbnRzIjpmYWxzZSwic2VsZnRleHRfaHRtbCI6bnVsbCwibGlrZXMiOm51bGwsInN1Z2dlc3RlZF9zb3J0IjpudWxsLCJiYW5uZWRfYXRfdXRjIjpudWxsLCJ1cmxfb3ZlcnJpZGRlbl9ieV9kZXN0IjoiaHR0cHM6Ly9kYXlicnVzaC5jb20vbW92ZWFibGUvIiwidmlld19jb3VudCI6bnVsbCwiYXJjaGl2ZWQiOmZhbHNlLCJub19mb2xsb3ciOmZhbHNlLCJpc19jcm9zc3Bvc3RhYmxlIjp0cnVlLCJwaW5uZWQiOmZhbHNlLCJvdmVyXzE4IjpmYWxzZSwiYWxsX2F3YXJkaW5ncyI6W10sImF3YXJkZXJzIjpbXSwibWVkaWFfb25seSI6ZmFsc2UsImNhbl9naWxkIjp0cnVlLCJzcG9pbGVyIjpmYWxzZSwibG9ja2VkIjpmYWxzZSwiYXV0aG9yX2ZsYWlyX3RleHQiOm51bGwsInRyZWF0bWVudF90YWdzIjpbXSwidmlzaXRlZCI6ZmFsc2UsInJlbW92ZWRfYnkiOm51bGwsIm51bV9yZXBvcnRzIjpudWxsLCJkaXN0aW5ndWlzaGVkIjpudWxsLCJzdWJyZWRkaXRfaWQiOiJ0NV8ycWgzMCIsIm1vZF9yZWFzb25fYnkiOm51bGwsInJlbW92YWxfcmVhc29uIjpudWxsLCJsaW5rX2ZsYWlyX2JhY2tncm91bmRfY29sb3IiOiIiLCJpZCI6ImhyZzJuMCIsImlzX3JvYm90X2luZGV4YWJsZSI6dHJ1ZSwicmVwb3J0X3JlYXNvbnMiOm51bGwsImF1dGhvciI6ImRheWJydXNoIiwiZGlzY3Vzc2lvbl90eXBlIjpudWxsLCJudW1fY29tbWVudHMiOjEwLCJzZW5kX3JlcGxpZXMiOnRydWUsIndoaXRlbGlzdF9zdGF0dXMiOiJhbGxfYWRzIiwiY29udGVzdF9tb2RlIjpmYWxzZSwibW9kX3JlcG9ydHMiOltdLCJhdXRob3JfcGF0cmVvbl9mbGFpciI6ZmFsc2UsImF1dGhvcl9mbGFpcl90ZXh0X2NvbG9yIjpudWxsLCJwZXJtYWxpbmsiOiIvci9qYXZhc2NyaXB0L2NvbW1lbnRzL2hyZzJuMC9tb3ZlYWJsZV9lZGl0b3JfdG9vbF8wMThfcmVsZWFzZV9kcmFnX3Jlc2l6ZS8iLCJwYXJlbnRfd2hpdGVsaXN0X3N0YXR1cyI6ImFsbF9hZHMiLCJzdGlja2llZCI6ZmFsc2UsInVybCI6Imh0dHBzOi8vZGF5YnJ1c2guY29tL21vdmVhYmxlLyIsInN1YnJlZGRpdF9zdWJzY3JpYmVycyI6MTAwODYwMywiY3JlYXRlZF91dGMiOjE1OTQ3ODMxOTEsIm51bV9jcm9zc3Bvc3RzIjoxLCJtZWRpYSI6bnVsbCwiaXNfdmlkZW8iOmZhbHNlfX0seyJraW5kIjoidDMiLCJkYXRhIjp7ImFwcHJvdmVkX2F0X3V0YyI6bnVsbCwic3VicmVkZGl0IjoiamF2YXNjcmlwdCIsInNlbGZ0ZXh0IjoiIiwiYXV0aG9yX2Z1bGxuYW1lIjoidDJfZmM3ZGoiLCJzYXZlZCI6ZmFsc2UsIm1vZF9yZWFzb25fdGl0bGUiOm51bGwsImdpbGRlZCI6MCwiY2xpY2tlZCI6ZmFsc2UsInRpdGxlIjoiRGV2ZWxvcGVycyBjYW4ndCBmaXggYmFkIG1hbmFnZW1lbnQiLCJsaW5rX2ZsYWlyX3JpY2h0ZXh0IjpbXSwic3VicmVkZGl0X25hbWVfcHJlZml4ZWQiOiJyL2phdmFzY3JpcHQiLCJoaWRkZW4iOmZhbHNlLCJwd2xzIjo2LCJsaW5rX2ZsYWlyX2Nzc19jbGFzcyI6bnVsbCwiZG93bnMiOjAsInRvcF9hd2FyZGVkX3R5cGUiOm51bGwsImhpZGVfc2NvcmUiOmZhbHNlLCJuYW1lIjoidDNfaHJocG8xIiwicXVhcmFudGluZSI6ZmFsc2UsImxpbmtfZmxhaXJfdGV4dF9jb2xvciI6ImRhcmsiLCJ1cHZvdGVfcmF0aW8iOjAuOTYsImF1dGhvcl9mbGFpcl9iYWNrZ3JvdW5kX2NvbG9yIjpudWxsLCJzdWJyZWRkaXRfdHlwZSI6InB1YmxpYyIsInVwcyI6ODIsInRvdGFsX2F3YXJkc19yZWNlaXZlZCI6MCwibWVkaWFfZW1iZWQiOnt9LCJhdXRob3JfZmxhaXJfdGVtcGxhdGVfaWQiOm51bGwsImlzX29yaWdpbmFsX2NvbnRlbnQiOmZhbHNlLCJ1c2VyX3JlcG9ydHMiOltdLCJzZWN1cmVfbWVkaWEiOm51bGwsImlzX3JlZGRpdF9tZWRpYV9kb21haW4iOmZhbHNlLCJpc19tZXRhIjpmYWxzZSwiY2F0ZWdvcnkiOm51bGwsInNlY3VyZV9tZWRpYV9lbWJlZCI6e30sImxpbmtfZmxhaXJfdGV4dCI6bnVsbCwiY2FuX21vZF9wb3N0IjpmYWxzZSwic2NvcmUiOjgyLCJhcHByb3ZlZF9ieSI6bnVsbCwiYXV0aG9yX3ByZW1pdW0iOmZhbHNlLCJ0aHVtYm5haWwiOiIiLCJlZGl0ZWQiOmZhbHNlLCJhdXRob3JfZmxhaXJfY3NzX2NsYXNzIjpudWxsLCJhdXRob3JfZmxhaXJfcmljaHRleHQiOltdLCJnaWxkaW5ncyI6e30sImNvbnRlbnRfY2F0ZWdvcmllcyI6bnVsbCwiaXNfc2VsZiI6ZmFsc2UsIm1vZF9ub3RlIjpudWxsLCJjcmVhdGVkIjoxNTk0ODE5MjMyLCJsaW5rX2ZsYWlyX3R5cGUiOiJ0ZXh0Iiwid2xzIjo2LCJyZW1vdmVkX2J5X2NhdGVnb3J5IjpudWxsLCJiYW5uZWRfYnkiOm51bGwsImF1dGhvcl9mbGFpcl90eXBlIjoidGV4dCIsImRvbWFpbiI6Imlpc20ub3JnIiwiYWxsb3dfbGl2ZV9jb21tZW50cyI6ZmFsc2UsInNlbGZ0ZXh0X2h0bWwiOm51bGwsImxpa2VzIjpudWxsLCJzdWdnZXN0ZWRfc29ydCI6bnVsbCwiYmFubmVkX2F0X3V0YyI6bnVsbCwidXJsX292ZXJyaWRkZW5fYnlfZGVzdCI6Imh0dHBzOi8vaWlzbS5vcmcvYXJ0aWNsZS9kZXZlbG9wZXJzLWNhbi10LWZpeC1iYWQtbWFuYWdlbWVudC01NyIsInZpZXdfY291bnQiOm51bGwsImFyY2hpdmVkIjpmYWxzZSwibm9fZm9sbG93IjpmYWxzZSwiaXNfY3Jvc3Nwb3N0YWJsZSI6dHJ1ZSwicGlubmVkIjpmYWxzZSwib3Zlcl8xOCI6ZmFsc2UsImFsbF9hd2FyZGluZ3MiOltdLCJhd2FyZGVycyI6W10sIm1lZGlhX29ubHkiOmZhbHNlLCJjYW5fZ2lsZCI6dHJ1ZSwic3BvaWxlciI6ZmFsc2UsImxvY2tlZCI6ZmFsc2UsImF1dGhvcl9mbGFpcl90ZXh0IjpudWxsLCJ0cmVhdG1lbnRfdGFncyI6W10sInZpc2l0ZWQiOmZhbHNlLCJyZW1vdmVkX2J5IjpudWxsLCJudW1fcmVwb3J0cyI6bnVsbCwiZGlzdGluZ3Vpc2hlZCI6bnVsbCwic3VicmVkZGl0X2lkIjoidDVfMnFoMzAiLCJtb2RfcmVhc29uX2J5IjpudWxsLCJyZW1vdmFsX3JlYXNvbiI6bnVsbCwibGlua19mbGFpcl9iYWNrZ3JvdW5kX2NvbG9yIjoiIiwiaWQiOiJocmhwbzEiLCJpc19yb2JvdF9pbmRleGFibGUiOnRydWUsInJlcG9ydF9yZWFzb25zIjpudWxsLCJhdXRob3IiOiJqYXNvbmJvdXJuZTE5MDEiLCJkaXNjdXNzaW9uX3R5cGUiOm51bGwsIm51bV9jb21tZW50cyI6MjcsInNlbmRfcmVwbGllcyI6dHJ1ZSwid2hpdGVsaXN0X3N0YXR1cyI6ImFsbF9hZHMiLCJjb250ZXN0X21vZGUiOmZhbHNlLCJtb2RfcmVwb3J0cyI6W10sImF1dGhvcl9wYXRyZW9uX2ZsYWlyIjpmYWxzZSwiYXV0aG9yX2ZsYWlyX3RleHRfY29sb3IiOm51bGwsInBlcm1hbGluayI6Ii9yL2phdmFzY3JpcHQvY29tbWVudHMvaHJocG8xL2RldmVsb3BlcnNfY2FudF9maXhfYmFkX21hbmFnZW1lbnQvIiwicGFyZW50X3doaXRlbGlzdF9zdGF0dXMiOiJhbGxfYWRzIiwic3RpY2tpZWQiOmZhbHNlLCJ1cmwiOiJodHRwczovL2lpc20ub3JnL2FydGljbGUvZGV2ZWxvcGVycy1jYW4tdC1maXgtYmFkLW1hbmFnZW1lbnQtNTciLCJzdWJyZWRkaXRfc3Vic2NyaWJlcnMiOjEwMDg2MDMsImNyZWF0ZWRfdXRjIjoxNTk0NzkwNDMyLCJudW1fY3Jvc3Nwb3N0cyI6MCwibWVkaWEiOm51bGwsImlzX3ZpZGVvIjpmYWxzZX19XSwiYWZ0ZXIiOiJ0M19ocmhwbzEiLCJiZWZvcmUiOm51bGx9fQ==`);
const data1 = JSON.parse(data);
const data2 = JSON.parse(data);
function equals1(x, y) {
if (x === y) return true;
if (Array.isArray(x) && Array.isArray(y)) {
if (x.length !== y.length) return false;
for (let i = 0; i < x.length; i++) {
if (!equals1(x[i], y[i])) return false;
}
return true;
}
if ((typeof x !== 'object') || (typeof y !== 'object')) return false;
const xKeys = Object.keys(x);
const yKeys = Object.keys(y);
if (xKeys.length !== yKeys.length) return false;
for (const k of xKeys) {
if (!y.hasOwnProperty(k)) return false;
if (!equals1(x[k], y[k])) return false;
}
return true;
}
function equals2(a, b) {
const stack = [a, b];
let idx = 2;
while (idx > 0) {
const x = stack[idx - 1];
const y = stack[idx - 2];
idx -= 2;
if (x === y) continue;
if (Array.isArray(x) && Array.isArray(y)) {
if (x.length !== y.length) return false;
for (let i = 0; i < x.length; i++) {
idx += 2;
if (idx > stack.length) stack.push(x[i], y[i]);
else {
stack[idx - 1] = x[i];
stack[idx - 2] = y[i];
}
}
} else {
if ((typeof x !== 'object') || (typeof y !== 'object')) return false;
const xKeys = Object.keys(x);
const yKeys = Object.keys(y);
if (xKeys.length !== yKeys.length) return false;
for (const k of xKeys) {
if (!y.hasOwnProperty(k)) return false;
idx += 2;
if (idx > stack.length) stack.push(x[k], y[k]);
else {
stack[idx - 1] = x[k];
stack[idx - 2] = y[k];
}
}
}
}
return true;
}
function equals3(a, b) {
const stack = ['k', { k: a }, { k: b }];
let idx = 3;
while (idx > 0) {
const k = stack[idx - 3];
const x = stack[idx - 2][k];
const y = stack[idx - 1][k];
idx -= 3;
if (x === y) continue;
if (Array.isArray(x) && Array.isArray(y)) {
if (x.length !== y.length) return false;
for (let i = 0; i < x.length; i++) {
idx += 3;
if (idx > stack.length) stack.push(i, x, y);
else {
stack[idx - 3] = i;
stack[idx - 2] = x;
stack[idx - 1] = y;
}
}
} else {
if ((typeof x !== 'object') || (typeof y !== 'object')) return false;
const xKeys = Object.keys(x);
const yKeys = Object.keys(y);
if (xKeys.length !== yKeys.length) return false;
for (const k2 of xKeys) {
if (!y.hasOwnProperty(k2)) return false;
idx += 3;
if (idx > stack.length) stack.push(k2, x, y);
else {
stack[idx - 3] = k2;
stack[idx - 2] = x;
stack[idx - 1] = y;
}
}
}
}
return true;
}
Ready to run.
Test | Ops/sec | |
---|---|---|
Recursive |
| ready |
Loop |
| ready |
Test |
| ready |
You can edit these tests or add more tests to this page by appending /edit to the URL.