Benchmark

This example compares performance of different date formatters

This example compares performance of different date formatters
<!DOCTYPE html> <html lang="en"> <head> <base href="/dataviewsjs/demos/en/sample/Benchmarks/DateFormatting/purejs/" /> <meta charset="utf-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta name="description" content="This example compares performance of different date formatters" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Date Formatting | Benchmarks | MESCIUS DataViewsJS JavaScript Demos</title> <link href="/dataviewsjs/demos/node_modules/normalize.css/normalize.css" rel="stylesheet" type="text/css" /> <link href="/dataviewsjs/demos/static/css/base.css" rel="stylesheet" type="text/css" /> <link href="/dataviewsjs/demos/static/dataviews/gc.dataviews.core.min.css" rel="stylesheet" type="text/css" /> <link href="styles.css" rel="stylesheet" type="text/css" /> <script src="/dataviewsjs/demos/static/js/app-polyfills.min.js" type="text/javascript"></script> <script type="text/javascript"> window.process = { env: { NODE_ENV: 'production', USE_NPM: false, USE_CDN: false, SITE_ROOT: '/dataviewsjs/demos', FRAMEWORK: 'purejs', DVJS_LICENSE_KEY: 'E348418822993781#B0EWvwY4dNNVQqJHUDpFROVWe5ZWNYFlVQFmRsJWRht4Z6lDO4Vla7YUaXhEWxd7Z5YXMuRnY7tWTQRHSlVnaYlXNhlEOpdkZ0FHWYJ5QKd6VXN5aR3ieGhUav9kZTBXWahkYBhEVutmZ72CbjdlZvV5TVdGdiplQsZXe95kUmNmZVF5cJ3mcypWNyx4UydESE3UblxGZyE7KQ94R4BjbUxUewsiaoREMxRDNllWREV6Voh4Q4dDZPRjWrIzUJl4TERXcQZWMHp4Sp9WaMZzN5o6StJmVDJXcwIVVmR6UMVGOlxUW8RmTxZDZTJWVN5GZqJHZuVDMkVGSW3WdxNzKCdDdSB7TzY7cqlnMU5GVyNzNP9WMyhDRvEEOFdkQORDM4dFVlFFWqFWSyMjNQJiOiMlIsISQyIkQ9YjQxIiOigkIsUTM7YjNxYTM0IicfJye&amp;Qf35VfikFVVljI0IyQiwiIxYHITp4c7VWaWFGdhRkI0IiTis7W0ICZyBlIsIiNxUTN6ADI8EDMxMjMwIjI0ICdyNkIsIyc59yc5l6YzVWbuoCLwpmLzVXajNXZt9iKs2WauMXdpN6cl5mLqwSbvNmLzVXajNXZt9iKsAnau26YuMXdpN6cl5mLqwSbvNmL6VGZ9RXajVGchJ7ZuoCLuNmLt36YukHdpNWZwFmcn9iKs46bj9Se4l6YlBXYydmLqwicr9ybj9Se4l6YlBXYydmLqwCcq9ybj9Se4l6YlBXYydmLqIiOiMXbEJCLiMVVJN4UF5kI0ISYONkIsUWdyRnOiwmdFJCLiEDO7MTO9IjM8gTM4gDNzIiOiQWSisnOiQkIsISP3EkVxBVUHFDMplzLlVUdGd7cI9UeIt4SshESzV7NvY7ZxlDOuNTb5tzLr', SJS_LICENSE_KEY: 'E518585142165236#B0wm4nx4QzdlTHRTSOFzcvVnaJdjSnNEeXdTMUtSUzk6bU94QuVXNwZVZjd4SzYjcadXRIVEMzEXTThkVyR7R85UayoHZZBTYQ5mZyh4Shd6VxFXazF4cBNGRG5WTvUGTsV4T6knQYRzKxxUdk9EarplU7d6VLF6KIR7bPJ5N6ZUMWZWaURGRKRDbLJDN5YjSN5mUoxmaxonSD56LEh7Y7RXenpmTvomevZlV9dkaysCO7hTRQFHcGRWQyc5LI9kQmB7QwR4Z7ZHOR3CSXp6SiFWYzFXeXZUSp94K8VDTkFjdwl4KptSYlRWcDxmNE5kS6kzdrkVcNJXROVGbLJkcTNGRzIER8tmd4YGNhh7dxAnMvIHRv46VtBXS4U5KvJ6dZJ6M5p4TxIjd9I5QSpXTTV6SDZXb7lzaL56ZiojITJCLikTQxUTQFV4NiojIIJCLyETO7UzM7kTO0IicfJye&amp;Qf35VfikkR9IkI0IyQiwiIyEjL6ByUKBCZhVmcwNlI0IiTis7W0ICZyBlIsISNwkTN6ADI8EDMxMjMwIjI0ICdyNkIsIyc59yc5l6YzVWbuoCLwpmLzVXajNXZt9iKs2WauMXdpN6cl5mLqwSbvNmLzVXajNXZt9iKsAnau26YuMXdpN6cl5mLqwSbvNmL6VGZ9RXajVGchJ7ZuoCLuNmLt36YukHdpNWZwFmcn9iKs46bj9Se4l6YlBXYydmLqwicr9ybj9Se4l6YlBXYydmLqwCcq9ybj9Se4l6YlBXYydmLqIiOiMXbEJCLiMVVJN4UF5kI0ISYONkIsUWdyRnOiwmdFJCLiYzMyUjNxIDNxUDO5gTM5IiOiQWSiwSfdtlOicGbmJCLlNHbhZmOiI7ckJye0ICbuFkI1pjIEJCLi4TPRtGOhtWWEFWd4IDOLRVRvx4SyMGcDhTW6n4ep', }, }; </script> <script src="/dataviewsjs/demos/node_modules/jquery/dist/jquery.min.js" type="text/javascript"></script> <script src="/dataviewsjs/demos/node_modules/moment/moment.js" type="text/javascript"></script> <script src="/dataviewsjs/demos/node_modules/lodash/lodash.min.js" type="text/javascript"></script> <script src="/dataviewsjs/demos/node_modules/platform/platform.js" type="text/javascript"></script> <script src="/dataviewsjs/demos/node_modules/benchmark/benchmark.js" type="text/javascript"></script> <script src="/dataviewsjs/demos/node_modules/bowser/es5.js" type="text/javascript"></script> <script src="/dataviewsjs/demos/static/js/jsperf.ui.js" type="text/javascript"></script> <script src="/dataviewsjs/demos/static/dataviews/gc.dataviews.common.min.js" type="text/javascript"></script> <script src="/dataviewsjs/demos/static/dataviews/gc.dataviews.core.min.js" type="text/javascript"></script> <script src="/dataviewsjs/demos/static/js/license.js" type="text/javascript"></script> </head> <body class="theme-default"> <noscript>You need to enable JavaScript to run this app.</noscript> <section id="runner"> <h2>Test runner</h2> <div id="options"> <div class="option"> <label>Category</label> <select id="test-category" value="render"> <option value="render">Rendering</option> <option value="sort">Sorting + Rendering</option> <option value="filter">Filtering + Rendering</option> <option value="group">Grouping + Rendering</option> </select> </div> <div class="option"> <label>Data size</label> <select id="data-size" value="1000"> <option value="1000">1000</option> <option value="10000">10000</option> <option value="100000">100000</option> </select> </div> </div> <p id="firebug"> <strong>Warning! For accurate results, please disable Firebug before running the tests.</strong> </p> <p id="java"><strong>Java applet disabled.</strong></p> <div id="test-container"> <div id="controls"> <div id="status"></div> <button id="run" type="button">Run again</button> </div> <table id="test-table"> <caption></caption> <thead> <tr> <th>Test</th> <th title="Operations per second (higher is better)">Ops/sec</th> </tr> </thead> <tbody></tbody> </table> <div id="error-info"></div> </div> </section> <script src="data.js" type="text/javascript"></script> <script src="app.js" type="text/javascript"></script> </body> </html>
var dataSize = parseInt($('#data-size').val(), 10); var data = generateData(dataSize); $('#data-size').change(function () { var dataSize = parseInt($('#data-size').val(), 10); data = generateData(dataSize); }); function formatDates(formatter) { data.slice(0, 10).forEach(function (date) { dateFormats.forEach(function (format) { formatter(format, date); }); }); } function formatSJS(format, date) { var formatter = new GC.Spread.Formatter.GeneralFormatter(format); return formatter.format(date); } function sjsCase() { return { name: 'SpreadJS', homepage: 'https://developer.mescius.com/spreadjs', fn: function fn() { formatDates(formatSJS); }, }; } function dvjsCase() { return { name: 'DataViewsJS', homepage: 'https://developer.mescius.com/dataviewsjs', fn: function fn() { formatDates(GC.DataViews.GeneralFormatter.formatDate); }, }; } function momentFormat(format, date) { return moment(date).format(format); } function momentCase() { return { name: 'MomentJS', homepage: 'https://momentjs.com/', fn: function fn() { formatDates(momentFormat); }, }; } $(function () { window.ui.add(sjsCase()); window.ui.add(dvjsCase()); window.ui.add(momentCase()); });
function repeatOf(k) { switch (k) { case 'M': case 'm': case 'D': case 'd': return [1, 2, 3, 4]; case 'Q': return [1]; case 'Y': case 'y': return [2, 4]; case 'F': case 'f': return [1, 2, 3]; default: return [1, 2]; } } var combinations = function combinations(templates) { return templates.reduce(function (acc, k) { var repeat = repeatOf(k); var combs = repeat.map(function (n) { return _.repeat(k, n); }); return _.isEmpty(acc) ? combs : _.flatten( acc.map(function (a) { return combs.map(function (b) { return ''.concat(a, '-').concat(b); }); }) ); }, []); }; var dateTemplates = combinations(['M', 'D', 'Y']).concat(combinations(['m', 'd', 'y'])); var timeTemplates = combinations(['H', 'm', 'S']) .concat(combinations(['h', 'm', 's'])) .map(function (t) { return t.replace(/-/g, ':'); }); var dateSeparators = ['/', '-', '.', ' ']; var dateFormats = _.flatten( dateSeparators.map(function (s) { return dateTemplates.map(function (f) { return f.replace(/-/g, s); }); }) ); dateFormats.forEach(function (f) { timeTemplates.forEach(function (t) { dateFormats.push(''.concat(f, ' ').concat(t)); dateFormats.push(''.concat(f, ', ').concat(t)); ['t', 'tt'].forEach(function (p) { dateFormats.push(''.concat(f, ' ').concat(t).concat(p)); dateFormats.push(''.concat(f, ', ').concat(t).concat(p)); }); }); }); var ISO_FORMAT = 'YYYY-MM-DDTHH:mm:ss.fffZ'; dateFormats.push(ISO_FORMAT); // week days dateFormats.push('ddd'); dateFormats.push('dddd'); dateFormats.push('DDD'); dateFormats.push('DDDD'); dateFormats.push('ddd, mmm dd'); // additional testing formats dateFormats.concat(['HH:mm:ss.S', 'HH:mm:ss.SS', 'HH:mm:ss.SSS']); var generateData = function generateData(n) { return _.range(0, n).map(function (t) { return new Date( Date.UTC( _.random(2000, 2020), _.random(0, 11), _.random(1, 28), _.random(0, 59), _.random(0, 59), _.random(0, 59) ) ); }); };
html, body, h1, h2, h3, fieldset, #faq, #faq dt, #faq dd { margin: 0; padding: 0; border: 0; } table, p, ul, h1, h2, h3, #error-info, form div, #faq, .bs-rt { margin-bottom: 1em; } button, input, textarea, a, .bs-rt { border-radius: 4px; } html, input, textarea, button { font: 1em/1.5 sans-serif; } body { background: #fff; padding: 0 2.5em; margin: 0 auto; min-height: 100%; } a, .btn-link { color: #357ab0; padding: 0.2em; } a:hover, a:focus, .btn-link:hover, .btn-link:focus { text-decoration: none; } .btn-link { background-color: transparent; border: 0; text-decoration: underline; } .btn-link:hover, .btn-link:focus { cursor: pointer; } blockquote { margin: 0 0 1em; border-left: 5px solid #b4b4b4; padding-left: 0.5em; } table { border-collapse: collapse; } thead th, button:hover, button:focus, .submit:hover, .submit:focus, a:hover, a:focus, .btn-link:hover, .btn-link:focus, #comments .meta a:hover, #comments .meta a:focus, li.current a:hover, li.current a:focus, form h3, #comments .owner .meta { background: #1a6ab9; background-image: linear-gradient(top, #6ca5dd, #1a6ab9); color: #fff; } caption, #comments .meta { background: #bcbcbc; background-image: linear-gradient(top, #d0d0d0, #a7a7a7); color: #555; } thead th, caption { font-weight: bold; } .js tbody th:hover, .js tbody th:focus { text-decoration: underline; cursor: pointer; } tbody th, td { border: solid #b4b4b4; border-width: 0 1px 1px 0; } tbody th { background: #dde4ea; width: 150px; } td.results { text-align: center; border-right: 0; } .results span, small { display: block; font-size: 0.8em; } td, th, caption { padding: 0.2em 0.5em; } td.fastest { background: #9cee82; } tr:last-child td, tr:last-child th { border-bottom: 0; } td.slowest, td.error, .invalid { background: pink; } /* needs its own rule because of buggy IE */ :focus:invalid { background: pink; } td.error { text-transform: uppercase; font-weight: bold; } button, .submit { padding: 0.35em 0.5em; cursor: pointer; color: #000; border: 1px solid #999; background: #dadada; background-image: linear-gradient(top, #ebebeb, #b8b8b8); } .login { padding: 0.35em 0.5em; text-decoration: none; cursor: pointer; color: #000; border: 1px solid #999; background: #dadada; background-image: linear-gradient(top, #ebebeb, #b8b8b8); } a:hover span, a:focus span, #comments .owner .meta a { color: #fff; } #options { display: flex; align-items: center; flex-wrap: wrap; } #options label, #options select { margin-right: 5px; } #options .option { display: inline-block; margin-bottom: 0.5em; } #test-container { display: flex; flex-direction: column; max-width: 800px; } #test-table { flex: 1 1; width: 100%; margin: 0.5em 0; } #controls { display: flex; align-items: center; justify-content: space-between; flex: 1 1; width: 100%; margin: 0.5em 0; } .buttons { float: right; } button:hover, button:focus, .submit:hover, .submit:focus { border-color: #357ab0; } #add-buttons button { padding: 0.15em 0.4em; font-size: 11px; font-weight: bold; } form label { float: left; width: 14em; cursor: pointer; text-align: right; margin-right: 1em; padding: 0.4em; } label.inline { float: none; padding: 0; margin: 0; } label[for=visible], label[for$="][defer]"] { position: relative; top: -0.37em; } label span { display: block; font-size: 90%; color: #b4b4b4; } label em { color: red; font-style: normal; } .js #advanced { display: none; } #show-advanced { display: none; } .js #show-advanced { display: block; } section { display: block; margin: 2em 0; } textarea { resize: vertical; height: 15em; width: 42.6em; *width: 42.4em; /* IE < 8 */ } input, textarea { border: 1px solid #b4b4b4; padding: 0.4em; } input[type=search] { -webkit-appearance: none; } #visible, #calibrate { /* checkboxes, for IE */ border: 0; padding: 0; } form h2, form h3, form h4, p.error, .preview, #add-libraries, #add-buttons { padding-left: 250px; display: block; } hgroup h2, #firebug, #java { display: none; } pre { width: 100%; overflow: auto; white-space: pre; white-space: pre-wrap; word-wrap: break-word; } table #results-1 { width: 100px; } table pre { *padding: 1.5em 0; /* IE < 8 */ *overflow-y: hidden; /* IE < 8 */ } table pre, table td.code { width: 600px; } mark { background: #ff9; padding: 0.2em 0.1em; } h1, h2, h3, h4 { font-weight: bold; font-size: 1em; } h1 { padding-top: 1em; font-size: 1.4em; } form h3 { padding-top: 0.2em; padding-bottom: 0.2em; } h1 em { font-style: normal; } h1 strong { font-style: italic; font-family: Monaco, "Lucida Console", monospace; } li.current a { background: #90ee85; } footer { display: block; margin-top: 2em; border-top: 2px solid #c4c4c4; font-size: 0.9em; overflow: hidden; } footer ul { list-style: none; padding: 0; margin: 0; } footer > ul > li { float: left; width: 15%; } footer > ul > li:first-child { width: 55%; } footer ul ul li { margin-bottom: 0.1em; } footer h4 { margin-bottom: 0.2em; } #add-test { margin-right: 0.3em; } #bs-chart { overflow: auto; } #bs-chart-frame { height: 240px; width: 100%; } #bs-logo { margin: 0; } #bs-logo span, applet { position: absolute; left: -9999em; } #bs-logo a { display: block; width: 232px; height: 39px; filter: none; background: url(//www.browserscope.org/static/img/logo.png) 0 0 no-repeat; } #bs-ua { padding: 0.5em 0.5em 0; color: #555; } #bs-results .bs-rt { font-size: 10pt; padding: 0.5em; background: #ddd; } #bs-results td { border: 1px solid #ddd; padding: 0.4em; white-space: nowrap; } #bs-results .rt-ua-cur { font-style: italic; font-weight: bold; } #bs-results .bs-rt-message { padding: 3em; text-align: center; font-weight: bold; color: #555; } #bs-results .google-visualization-table-tr-head td { white-space: normal; } #comments h1 { padding: 0; } #comments .meta img { position: absolute; left: 0; top: 0; margin: 0; } #comments .meta img { top: 2px; left: 2px; } #comments .meta { padding-left: 35px; margin-top: 0; width: 923px; line-height: 30px; } #comments .meta a { font-weight: bold; color: #555; } #comments article div { padding: 0 1em 0; } #comments article { display: block; border: 1px solid #b4b4b4; position: relative; margin-bottom: 1em; } /* needs its own rule (cannot be grouped with `tbody th`) because of buggy IE */ #comments article:target { background: #dde4ea; } #error-info.show, .meta strong, #firebug strong, #java strong, #status strong { background: pink; border: 1px solid #b00b00; padding: 0.4em; } #error-info.show { padding: 0.5em 1em; } #error-info, code, samp, var, textarea, #slug { font-family: Monaco, monospace; font-size: 0.9em; -moz-tab-size: 2; tab-size: 2; } #java strong { background: #ffffdc; border: 1px solid #faa700; } #slug { font-size: 1em; } #faq dt { margin-top: 1em; font-weight: bold; } #faq dt a { display: none; } #faq dt:hover a { display: inline; } #faq dt:target, #faq dt:target + dd { background: #90ee85; margin: 0 -0.8em; padding: 0 0.8em; } #faq dt:target + dd { padding-bottom: 0.5em; margin-bottom: -0.5em; } #faq dt:target { margin-top: 0.5em; padding-top: 0.5em; } #firebug, #java { margin: 0 0 1em; padding: 0.3em 0; } #prep-code pre { max-height: 500px; overflow: auto; } #firebug.show, #java.show { display: block; } .co1, .co2, .coMULTI { font-style: italic; color: #060; } .error { color: #b00b00; } .imp { color: red; } .kw1, .kw3 { color: #006; } .kw2 { color: #036; } .es0 { color: #009; } .br0 { color: #090; } .sy0 { color: #393; } .st0 { color: #36c; } .nu0 { color: #c00; } .me1 { color: #606; } #carbonads { float: right; width: 130px; font-size: 80%; } #carbonads a { display: block; } /* < 1051px */ @media (max-width: 1050px) { table pre, table td.code { width: 550px; } } /* < 1041px */ @media (max-width: 1040px) { body { margin: 0; border: 0; } body, #comments .meta { width: 100%; box-sizing: border-box; } } /* < 801px */ @media (max-width: 800px) { table pre, table td.code { width: 450px; } } /* < 681px */ @media (max-width: 680px) { table pre, table td.code { width: 350px; } } /* < 651px */ @media (max-width: 650px) { table pre, table td.code { width: 200px; } } /*# sourceMappingURL=data:application/json;charset=utf8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIkRhdGVGb3JtYXR0aW5nL3B1cmVqcy9idWlsZC5qc29uIiwiRGF0ZUZvcm1hdHRpbmcvcHVyZWpzL2J1aWxkLmNzcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7O0VBU0UsU0FBQTtFQUNBLFVBQUE7RUFDQSxTQUFBO0FDQ0Y7O0FERUE7Ozs7Ozs7Ozs7RUFVRSxrQkFBQTtBQ0NGOztBREVBOzs7OztFQU9FLGtCQUFBO0FDQ0Y7O0FERUE7Ozs7RUFJRSx3QkFBQTtBQ0NGOztBREVBO0VBQ0UsZ0JBQUE7RUFDQSxnQkFBQTtFQUNBLGNBQUE7RUFDQSxnQkFBQTtBQ0NGOztBREVBOztFQUVFLGNBQUE7RUFDQSxjQUFBO0FDQ0Y7O0FERUE7Ozs7RUFJRSxxQkFBQTtBQ0NGOztBREVBO0VBQ0UsNkJBQUE7RUFDQSxTQUFBO0VBQ0EsMEJBQUE7QUNDRjs7QURFQTs7RUFFRSxlQUFBO0FDQ0Y7O0FERUE7RUFDRSxlQUFBO0VBQ0EsOEJBQUE7RUFDQSxtQkFBQTtBQ0NGOztBREVBO0VBQ0UseUJBQUE7QUNDRjs7QURFQTs7Ozs7Ozs7Ozs7Ozs7O0VBZUUsbUJBQUE7RUFDQSx3REFBQTtFQUNBLFdBQUE7QUNDRjs7QURFQTs7RUFFRSxtQkFBQTtFQUNBLHdEQUFBO0VBQ0EsV0FBQTtBQ0NGOztBREVBOztFQUVFLGlCQUFBO0FDQ0Y7O0FERUE7O0VBRUUsMEJBQUE7RUFDQSxlQUFBO0FDQ0Y7O0FERUE7O0VBRUUscUJBQUE7RUFDQSx5QkFBQTtBQ0NGOztBREVBO0VBQ0UsbUJBQUE7RUFDQSxZQUFBO0FDQ0Y7O0FERUE7RUFDRSxrQkFBQTtFQUNBLGVBQUE7QUNDRjs7QURFQTs7RUFFRSxjQUFBO0VBQ0EsZ0JBQUE7QUNDRjs7QURFQTs7O0VBR0Usb0JBQUE7QUNDRjs7QURFQTtFQUNFLG1CQUFBO0FDQ0Y7O0FERUE7O0VBRUUsZ0JBQUE7QUNDRjs7QURFQTs7O0VBR0UsZ0JBQUE7QUNDRjs7QURFQSwyQ0FBQTtBQUNBO0VBQ0UsZ0JBQUE7QUNDRjs7QURFQTtFQUNFLHlCQUFBO0VBQ0EsaUJBQUE7QUNDRjs7QURFQTs7RUFFRSxxQkFBQTtFQUNBLGVBQUE7RUFDQSxXQUFBO0VBQ0Esc0JBQUE7RUFDQSxtQkFBQTtFQUNBLHdEQUFBO0FDQ0Y7O0FERUE7RUFDRSxxQkFBQTtFQUNBLHFCQUFBO0VBQ0EsZUFBQTtFQUNBLFdBQUE7RUFDQSxzQkFBQTtFQUNBLG1CQUFBO0VBQ0Esd0RBQUE7QUNDRjs7QURFQTs7O0VBR0UsV0FBQTtBQ0NGOztBREVBO0VBQ0UsYUFBQTtFQUNBLG1CQUFBO0VBQ0EsZUFBQTtBQ0NGO0FEQ0U7O0VBRUUsaUJBQUE7QUNDSjtBREVFO0VBQ0UscUJBQUE7RUFDQSxvQkFBQTtBQ0FKOztBRElBO0VBQ0UsYUFBQTtFQUNBLHNCQUFBO0VBQ0EsZ0JBQUE7QUNERjs7QURJQTtFQUNFLFNBQUE7RUFDQSxXQUFBO0VBQ0EsZUFBQTtBQ0RGOztBRElBO0VBQ0UsYUFBQTtFQUNBLG1CQUFBO0VBQ0EsOEJBQUE7RUFDQSxTQUFBO0VBQ0EsV0FBQTtFQUNBLGVBQUE7QUNERjs7QURJQTtFQUNFLFlBQUE7QUNERjs7QURJQTs7OztFQUlFLHFCQUFBO0FDREY7O0FESUE7RUFDRSxxQkFBQTtFQUNBLGVBQUE7RUFDQSxpQkFBQTtBQ0RGOztBRElBO0VBQ0UsV0FBQTtFQUNBLFdBQUE7RUFDQSxlQUFBO0VBQ0EsaUJBQUE7RUFDQSxpQkFBQTtFQUNBLGNBQUE7QUNERjs7QURJQTtFQUNFLFdBQUE7RUFDQSxVQUFBO0VBQ0EsU0FBQTtBQ0RGOztBRElBOztFQUVFLGtCQUFBO0VBQ0EsWUFBQTtBQ0RGOztBRElBO0VBQ0UsY0FBQTtFQUNBLGNBQUE7RUFDQSxjQUFBO0FDREY7O0FESUE7RUFDRSxVQUFBO0VBQ0Esa0JBQUE7QUNERjs7QURJQTtFQUNFLGFBQUE7QUNERjs7QURJQTtFQUNFLGFBQUE7QUNERjs7QURJQTtFQUNFLGNBQUE7QUNERjs7QURJQTtFQUNFLGNBQUE7RUFDQSxhQUFBO0FDREY7O0FESUE7RUFDRSxnQkFBQTtFQUNBLFlBQUE7RUFDQSxhQUFBO0dBQ0EsYUFBQTtFQUFnQixXQUFBO0FDQWxCOztBREdBOztFQUVFLHlCQUFBO0VBQ0EsY0FBQTtBQ0FGOztBREdBO0VBQ0Usd0JBQUE7QUNBRjs7QURHQTs7RUFFRSx1QkFBQTtFQUNBLFNBQUE7RUFDQSxVQUFBO0FDQUY7O0FER0E7Ozs7Ozs7RUFPRSxtQkFBQTtFQUNBLGNBQUE7QUNBRjs7QURHQTs7O0VBR0UsYUFBQTtBQ0FGOztBREdBO0VBQ0UsV0FBQTtFQUNBLGNBQUE7RUFDQSxnQkFBQTtFQUNBLHFCQUFBO0VBQ0EscUJBQUE7QUNBRjs7QURHQTtFQUNFLFlBQUE7QUNBRjs7QURHQTtHQUNFLGdCQUFBO0VBQW1CLFdBQUE7R0FDbkIsa0JBQUE7RUFBcUIsV0FBQTtBQ0V2Qjs7QURDQTs7RUFFRSxZQUFBO0FDRUY7O0FEQ0E7RUFDRSxnQkFBQTtFQUNBLG9CQUFBO0FDRUY7O0FEQ0E7Ozs7RUFJRSxpQkFBQTtFQUNBLGNBQUE7QUNFRjs7QURDQTtFQUNFLGdCQUFBO0VBQ0EsZ0JBQUE7QUNFRjs7QURDQTtFQUNFLGtCQUFBO0VBQ0EscUJBQUE7QUNFRjs7QURDQTtFQUNFLGtCQUFBO0FDRUY7O0FEQ0E7RUFDRSxrQkFBQTtFQUNBLGdEQUFBO0FDRUY7O0FEQ0E7RUFDRSxtQkFBQTtBQ0VGOztBRENBO0VBQ0UsY0FBQTtFQUNBLGVBQUE7RUFDQSw2QkFBQTtFQUNBLGdCQUFBO0VBQ0EsZ0JBQUE7QUNFRjs7QURDQTtFQUNFLGdCQUFBO0VBQ0EsVUFBQTtFQUNBLFNBQUE7QUNFRjs7QURDQTtFQUNFLFdBQUE7RUFDQSxVQUFBO0FDRUY7O0FEQ0E7RUFDRSxVQUFBO0FDRUY7O0FEQ0E7RUFDRSxvQkFBQTtBQ0VGOztBRENBO0VBQ0Usb0JBQUE7QUNFRjs7QURDQTtFQUNFLG1CQUFBO0FDRUY7O0FEQ0E7RUFDRSxjQUFBO0FDRUY7O0FEQ0E7RUFDRSxhQUFBO0VBQ0EsV0FBQTtBQ0VGOztBRENBO0VBQ0UsU0FBQTtBQ0VGOztBRENBOztFQUVFLGtCQUFBO0VBQ0EsYUFBQTtBQ0VGOztBRENBO0VBQ0UsY0FBQTtFQUNBLFlBQUE7RUFDQSxZQUFBO0VBQ0EsWUFBQTtFQUNBLHlFQUFBO0FDRUY7O0FEQ0E7RUFDRSxzQkFBQTtFQUNBLFdBQUE7QUNFRjs7QURDQTtFQUNFLGVBQUE7RUFDQSxjQUFBO0VBQ0EsZ0JBQUE7QUNFRjs7QURDQTtFQUNFLHNCQUFBO0VBQ0EsY0FBQTtFQUNBLG1CQUFBO0FDRUY7O0FEQ0E7RUFDRSxrQkFBQTtFQUNBLGlCQUFBO0FDRUY7O0FEQ0E7RUFDRSxZQUFBO0VBQ0Esa0JBQUE7RUFDQSxpQkFBQTtFQUNBLFdBQUE7QUNFRjs7QURDQTtFQUNFLG1CQUFBO0FDRUY7O0FEQ0E7RUFDRSxVQUFBO0FDRUY7O0FEQ0E7RUFDRSxrQkFBQTtFQUNBLE9BQUE7RUFDQSxNQUFBO0VBQ0EsU0FBQTtBQ0VGOztBRENBO0VBQ0UsUUFBQTtFQUNBLFNBQUE7QUNFRjs7QURDQTtFQUNFLGtCQUFBO0VBQ0EsYUFBQTtFQUNBLFlBQUE7RUFDQSxpQkFBQTtBQ0VGOztBRENBO0VBQ0UsaUJBQUE7RUFDQSxXQUFBO0FDRUY7O0FEQ0E7RUFDRSxnQkFBQTtBQ0VGOztBRENBO0VBQ0UsY0FBQTtFQUNBLHlCQUFBO0VBQ0Esa0JBQUE7RUFDQSxrQkFBQTtBQ0VGOztBRENBLCtFQUFBO0FBQ0E7RUFDRSxtQkFBQTtBQ0VGOztBRENBOzs7OztFQUtFLGdCQUFBO0VBQ0EseUJBQUE7RUFDQSxjQUFBO0FDRUY7O0FEQ0E7RUFDRSxrQkFBQTtBQ0VGOztBRENBOzs7Ozs7RUFNRSw4QkFBQTtFQUNBLGdCQUFBO0VBQ0EsZ0JBQUE7RUFFQSxXQUFBO0FDRUY7O0FEQ0E7RUFDRSxtQkFBQTtFQUNBLHlCQUFBO0FDRUY7O0FEQ0E7RUFDRSxjQUFBO0FDRUY7O0FEQ0E7RUFDRSxlQUFBO0VBQ0EsaUJBQUE7QUNFRjs7QURDQTtFQUNFLGFBQUE7QUNFRjs7QURDQTtFQUNFLGVBQUE7QUNFRjs7QURDQTs7RUFFRSxtQkFBQTtFQUNBLGdCQUFBO0VBQ0EsZ0JBQUE7QUNFRjs7QURDQTtFQUNFLHFCQUFBO0VBQ0EscUJBQUE7QUNFRjs7QURDQTtFQUNFLGlCQUFBO0VBQ0Esa0JBQUE7QUNFRjs7QURDQTs7RUFFRSxlQUFBO0VBQ0EsZ0JBQUE7QUNFRjs7QURDQTtFQUNFLGlCQUFBO0VBQ0EsY0FBQTtBQ0VGOztBRENBOztFQUVFLGNBQUE7QUNFRjs7QURDQTs7O0VBR0Usa0JBQUE7RUFDQSxXQUFBO0FDRUY7O0FEQ0E7RUFDRSxjQUFBO0FDRUY7O0FEQ0E7RUFDRSxVQUFBO0FDRUY7O0FEQ0E7O0VBRUUsV0FBQTtBQ0VGOztBRENBO0VBQ0UsV0FBQTtBQ0VGOztBRENBO0VBQ0UsV0FBQTtBQ0VGOztBRENBO0VBQ0UsV0FBQTtBQ0VGOztBRENBO0VBQ0UsV0FBQTtBQ0VGOztBRENBO0VBQ0UsV0FBQTtBQ0VGOztBRENBO0VBQ0UsV0FBQTtBQ0VGOztBRENBO0VBQ0UsV0FBQTtBQ0VGOztBRENBO0VBQ0UsWUFBQTtFQUNBLFlBQUE7RUFDQSxjQUFBO0FDRUY7O0FEQ0E7RUFDRSxjQUFBO0FDRUY7O0FEQ0EsYUFBQTtBQUNBO0VBQ0U7O0lBRUUsWUFBQTtFQ0VGO0FBQ0Y7QURDQSxhQUFBO0FBQ0E7RUFDRTtJQUNFLFNBQUE7SUFDQSxTQUFBO0VDQ0Y7O0VERUE7O0lBRUUsV0FBQTtJQUdBLHNCQUFBO0VDQ0Y7QUFDRjtBREVBLFlBQUE7QUFDQTtFQUNFOztJQUVFLFlBQUE7RUNBRjtBQUNGO0FER0EsWUFBQTtBQUNBO0VBQ0U7O0lBRUUsWUFBQTtFQ0RGO0FBQ0Y7QURJQSxZQUFBO0FBQ0E7RUFDRTs7SUFFRSxZQUFBO0VDRkY7QUFDRiIsImZpbGUiOiJEYXRlRm9ybWF0dGluZy9wdXJlanMvc3R5bGVzLmNzcyIsInNvdXJjZXNDb250ZW50IjpbImh0bWwsXG5ib2R5LFxuaDEsXG5oMixcbmgzLFxuZmllbGRzZXQsXG4jZmFxLFxuI2ZhcSBkdCxcbiNmYXEgZGQge1xuICBtYXJnaW46IDA7XG4gIHBhZGRpbmc6IDA7XG4gIGJvcmRlcjogMDtcbn1cblxudGFibGUsXG5wLFxudWwsXG5oMSxcbmgyLFxuaDMsXG4jZXJyb3ItaW5mbyxcbmZvcm0gZGl2LFxuI2ZhcSxcbi5icy1ydCB7XG4gIG1hcmdpbi1ib3R0b206IDFlbTtcbn1cblxuYnV0dG9uLFxuaW5wdXQsXG50ZXh0YXJlYSxcbmEsXG4uYnMtcnQge1xuICAtbW96LWJvcmRlci1yYWRpdXM6IDRweDtcbiAgLXdlYmtpdC1ib3JkZXItcmFkaXVzOiA0cHg7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbn1cblxuaHRtbCxcbmlucHV0LFxudGV4dGFyZWEsXG5idXR0b24ge1xuICBmb250OiAxZW0vMS41IHNhbnMtc2VyaWY7XG59XG5cbmJvZHkge1xuICBiYWNrZ3JvdW5kOiAjZmZmO1xuICBwYWRkaW5nOiAwIDIuNWVtO1xuICBtYXJnaW46IDAgYXV0bztcbiAgbWluLWhlaWdodDogMTAwJTtcbn1cblxuYSxcbi5idG4tbGluayB7XG4gIGNvbG9yOiAjMzU3YWIwO1xuICBwYWRkaW5nOiAwLjJlbTtcbn1cblxuYTpob3ZlcixcbmE6Zm9jdXMsXG4uYnRuLWxpbms6aG92ZXIsXG4uYnRuLWxpbms6Zm9jdXMge1xuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG59XG5cbi5idG4tbGluayB7XG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICBib3JkZXI6IDA7XG4gIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xufVxuXG4uYnRuLWxpbms6aG92ZXIsXG4uYnRuLWxpbms6Zm9jdXMge1xuICBjdXJzb3I6IHBvaW50ZXI7XG59XG5cbmJsb2NrcXVvdGUge1xuICBtYXJnaW46IDAgMCAxZW07XG4gIGJvcmRlci1sZWZ0OiA1cHggc29saWQgI2I0YjRiNDtcbiAgcGFkZGluZy1sZWZ0OiAwLjVlbTtcbn1cblxudGFibGUge1xuICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlO1xufVxuXG50aGVhZCB0aCxcbmJ1dHRvbjpob3ZlcixcbmJ1dHRvbjpmb2N1cyxcbi5zdWJtaXQ6aG92ZXIsXG4uc3VibWl0OmZvY3VzLFxuYTpob3ZlcixcbmE6Zm9jdXMsXG4uYnRuLWxpbms6aG92ZXIsXG4uYnRuLWxpbms6Zm9jdXMsXG4jY29tbWVudHMgLm1ldGEgYTpob3ZlcixcbiNjb21tZW50cyAubWV0YSBhOmZvY3VzLFxubGkuY3VycmVudCBhOmhvdmVyLFxubGkuY3VycmVudCBhOmZvY3VzLFxuZm9ybSBoMyxcbiNjb21tZW50cyAub3duZXIgLm1ldGEge1xuICBiYWNrZ3JvdW5kOiAjMWE2YWI5O1xuICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQodG9wLCAjNmNhNWRkLCAjMWE2YWI5KTtcbiAgY29sb3I6ICNmZmY7XG59XG5cbmNhcHRpb24sXG4jY29tbWVudHMgLm1ldGEge1xuICBiYWNrZ3JvdW5kOiAjYmNiY2JjO1xuICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQodG9wLCAjZDBkMGQwLCAjYTdhN2E3KTtcbiAgY29sb3I6ICM1NTU7XG59XG5cbnRoZWFkIHRoLFxuY2FwdGlvbiB7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xufVxuXG4uanMgdGJvZHkgdGg6aG92ZXIsXG4uanMgdGJvZHkgdGg6Zm9jdXMge1xuICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG50Ym9keSB0aCxcbnRkIHtcbiAgYm9yZGVyOiBzb2xpZCAjYjRiNGI0O1xuICBib3JkZXItd2lkdGg6IDAgMXB4IDFweCAwO1xufVxuXG50Ym9keSB0aCB7XG4gIGJhY2tncm91bmQ6ICNkZGU0ZWE7XG4gIHdpZHRoOiAxNTBweDtcbn1cblxudGQucmVzdWx0cyB7XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgYm9yZGVyLXJpZ2h0OiAwO1xufVxuXG4ucmVzdWx0cyBzcGFuLFxuc21hbGwge1xuICBkaXNwbGF5OiBibG9jaztcbiAgZm9udC1zaXplOiAwLjhlbTtcbn1cblxudGQsXG50aCxcbmNhcHRpb24ge1xuICBwYWRkaW5nOiAwLjJlbSAwLjVlbTtcbn1cblxudGQuZmFzdGVzdCB7XG4gIGJhY2tncm91bmQ6ICM5Y2VlODI7XG59XG5cbnRyOmxhc3QtY2hpbGQgdGQsXG50cjpsYXN0LWNoaWxkIHRoIHtcbiAgYm9yZGVyLWJvdHRvbTogMDtcbn1cblxudGQuc2xvd2VzdCxcbnRkLmVycm9yLFxuLmludmFsaWQge1xuICBiYWNrZ3JvdW5kOiBwaW5rO1xufVxuXG4vKiBuZWVkcyBpdHMgb3duIHJ1bGUgYmVjYXVzZSBvZiBidWdneSBJRSAqL1xuOmZvY3VzOmludmFsaWQge1xuICBiYWNrZ3JvdW5kOiBwaW5rO1xufVxuXG50ZC5lcnJvciB7XG4gIHRleHQtdHJhbnNmb3JtOiB1cHBlcmNhc2U7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xufVxuXG5idXR0b24sXG4uc3VibWl0IHtcbiAgcGFkZGluZzogMC4zNWVtIDAuNWVtO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIGNvbG9yOiAjMDAwO1xuICBib3JkZXI6IDFweCBzb2xpZCAjOTk5O1xuICBiYWNrZ3JvdW5kOiAjZGFkYWRhO1xuICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQodG9wLCAjZWJlYmViLCAjYjhiOGI4KTtcbn1cblxuLmxvZ2luIHtcbiAgcGFkZGluZzogMC4zNWVtIDAuNWVtO1xuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgY29sb3I6ICMwMDA7XG4gIGJvcmRlcjogMXB4IHNvbGlkICM5OTk7XG4gIGJhY2tncm91bmQ6ICNkYWRhZGE7XG4gIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCh0b3AsICNlYmViZWIsICNiOGI4YjgpO1xufVxuXG5hOmhvdmVyIHNwYW4sXG5hOmZvY3VzIHNwYW4sXG4jY29tbWVudHMgLm93bmVyIC5tZXRhIGEge1xuICBjb2xvcjogI2ZmZjtcbn1cblxuI29wdGlvbnMge1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBmbGV4LXdyYXA6IHdyYXA7XG5cbiAgbGFiZWwsXG4gIHNlbGVjdCB7XG4gICAgbWFyZ2luLXJpZ2h0OiA1cHg7XG4gIH1cblxuICAub3B0aW9uIHtcbiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gICAgbWFyZ2luLWJvdHRvbTogMC41ZW07XG4gIH1cbn1cblxuI3Rlc3QtY29udGFpbmVyIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgbWF4LXdpZHRoOiA4MDBweDtcbn1cblxuI3Rlc3QtdGFibGUge1xuICBmbGV4OiAxIDE7XG4gIHdpZHRoOiAxMDAlO1xuICBtYXJnaW46IDAuNWVtIDA7XG59XG5cbiNjb250cm9scyB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgZmxleDogMSAxO1xuICB3aWR0aDogMTAwJTtcbiAgbWFyZ2luOiAwLjVlbSAwO1xufVxuXG4uYnV0dG9ucyB7XG4gIGZsb2F0OiByaWdodDtcbn1cblxuYnV0dG9uOmhvdmVyLFxuYnV0dG9uOmZvY3VzLFxuLnN1Ym1pdDpob3Zlcixcbi5zdWJtaXQ6Zm9jdXMge1xuICBib3JkZXItY29sb3I6ICMzNTdhYjA7XG59XG5cbiNhZGQtYnV0dG9ucyBidXR0b24ge1xuICBwYWRkaW5nOiAwLjE1ZW0gMC40ZW07XG4gIGZvbnQtc2l6ZTogMTFweDtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG59XG5cbmZvcm0gbGFiZWwge1xuICBmbG9hdDogbGVmdDtcbiAgd2lkdGg6IDE0ZW07XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gIG1hcmdpbi1yaWdodDogMWVtO1xuICBwYWRkaW5nOiAwLjRlbTtcbn1cblxubGFiZWwuaW5saW5lIHtcbiAgZmxvYXQ6IG5vbmU7XG4gIHBhZGRpbmc6IDA7XG4gIG1hcmdpbjogMDtcbn1cblxubGFiZWxbZm9yPSd2aXNpYmxlJ10sXG5sYWJlbFtmb3IkPSddW2RlZmVyXSddIHtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICB0b3A6IC0wLjM3ZW07XG59XG5cbmxhYmVsIHNwYW4ge1xuICBkaXNwbGF5OiBibG9jaztcbiAgZm9udC1zaXplOiA5MCU7XG4gIGNvbG9yOiAjYjRiNGI0O1xufVxuXG5sYWJlbCBlbSB7XG4gIGNvbG9yOiByZWQ7XG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcbn1cblxuLmpzICNhZHZhbmNlZCB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG5cbiNzaG93LWFkdmFuY2VkIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cblxuLmpzICNzaG93LWFkdmFuY2VkIHtcbiAgZGlzcGxheTogYmxvY2s7XG59XG5cbnNlY3Rpb24ge1xuICBkaXNwbGF5OiBibG9jaztcbiAgbWFyZ2luOiAyZW0gMDtcbn1cblxudGV4dGFyZWEge1xuICByZXNpemU6IHZlcnRpY2FsO1xuICBoZWlnaHQ6IDE1ZW07XG4gIHdpZHRoOiA0Mi42ZW07XG4gICp3aWR0aDogNDIuNGVtOyAvKiBJRSA8IDggKi9cbn1cblxuaW5wdXQsXG50ZXh0YXJlYSB7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNiNGI0YjQ7XG4gIHBhZGRpbmc6IDAuNGVtO1xufVxuXG5pbnB1dFt0eXBlPSdzZWFyY2gnXSB7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbn1cblxuI3Zpc2libGUsXG4jY2FsaWJyYXRlIHtcbiAgLyogY2hlY2tib3hlcywgZm9yIElFICovXG4gIGJvcmRlcjogMDtcbiAgcGFkZGluZzogMDtcbn1cblxuZm9ybSBoMixcbmZvcm0gaDMsXG5mb3JtIGg0LFxucC5lcnJvcixcbi5wcmV2aWV3LFxuI2FkZC1saWJyYXJpZXMsXG4jYWRkLWJ1dHRvbnMge1xuICBwYWRkaW5nLWxlZnQ6IDI1MHB4O1xuICBkaXNwbGF5OiBibG9jaztcbn1cblxuaGdyb3VwIGgyLFxuI2ZpcmVidWcsXG4jamF2YSB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG5cbnByZSB7XG4gIHdpZHRoOiAxMDAlO1xuICBvdmVyZmxvdzogYXV0bztcbiAgd2hpdGUtc3BhY2U6IHByZTtcbiAgd2hpdGUtc3BhY2U6IHByZS13cmFwO1xuICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7XG59XG5cbnRhYmxlICNyZXN1bHRzLTEge1xuICB3aWR0aDogMTAwcHg7XG59XG5cbnRhYmxlIHByZSB7XG4gICpwYWRkaW5nOiAxLjVlbSAwOyAvKiBJRSA8IDggKi9cbiAgKm92ZXJmbG93LXk6IGhpZGRlbjsgLyogSUUgPCA4ICovXG59XG5cbnRhYmxlIHByZSxcbnRhYmxlIHRkLmNvZGUge1xuICB3aWR0aDogNjAwcHg7XG59XG5cbm1hcmsge1xuICBiYWNrZ3JvdW5kOiAjZmY5O1xuICBwYWRkaW5nOiAwLjJlbSAwLjFlbTtcbn1cblxuaDEsXG5oMixcbmgzLFxuaDQge1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgZm9udC1zaXplOiAxZW07XG59XG5cbmgxIHtcbiAgcGFkZGluZy10b3A6IDFlbTtcbiAgZm9udC1zaXplOiAxLjRlbTtcbn1cblxuZm9ybSBoMyB7XG4gIHBhZGRpbmctdG9wOiAwLjJlbTtcbiAgcGFkZGluZy1ib3R0b206IDAuMmVtO1xufVxuXG5oMSBlbSB7XG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcbn1cblxuaDEgc3Ryb25nIHtcbiAgZm9udC1zdHlsZTogaXRhbGljO1xuICBmb250LWZhbWlseTogTW9uYWNvLCAnTHVjaWRhIENvbnNvbGUnLCBtb25vc3BhY2U7XG59XG5cbmxpLmN1cnJlbnQgYSB7XG4gIGJhY2tncm91bmQ6ICM5MGVlODU7XG59XG5cbmZvb3RlciB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBtYXJnaW4tdG9wOiAyZW07XG4gIGJvcmRlci10b3A6IDJweCBzb2xpZCAjYzRjNGM0O1xuICBmb250LXNpemU6IDAuOWVtO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG5mb290ZXIgdWwge1xuICBsaXN0LXN0eWxlOiBub25lO1xuICBwYWRkaW5nOiAwO1xuICBtYXJnaW46IDA7XG59XG5cbmZvb3RlciA+IHVsID4gbGkge1xuICBmbG9hdDogbGVmdDtcbiAgd2lkdGg6IDE1JTtcbn1cblxuZm9vdGVyID4gdWwgPiBsaTpmaXJzdC1jaGlsZCB7XG4gIHdpZHRoOiA1NSU7XG59XG5cbmZvb3RlciB1bCB1bCBsaSB7XG4gIG1hcmdpbi1ib3R0b206IDAuMWVtO1xufVxuXG5mb290ZXIgaDQge1xuICBtYXJnaW4tYm90dG9tOiAwLjJlbTtcbn1cblxuI2FkZC10ZXN0IHtcbiAgbWFyZ2luLXJpZ2h0OiAwLjNlbTtcbn1cblxuI2JzLWNoYXJ0IHtcbiAgb3ZlcmZsb3c6IGF1dG87XG59XG5cbiNicy1jaGFydC1mcmFtZSB7XG4gIGhlaWdodDogMjQwcHg7XG4gIHdpZHRoOiAxMDAlO1xufVxuXG4jYnMtbG9nbyB7XG4gIG1hcmdpbjogMDtcbn1cblxuI2JzLWxvZ28gc3BhbixcbmFwcGxldCB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgbGVmdDogLTk5OTllbTtcbn1cblxuI2JzLWxvZ28gYSB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICB3aWR0aDogMjMycHg7XG4gIGhlaWdodDogMzlweDtcbiAgZmlsdGVyOiBub25lO1xuICBiYWNrZ3JvdW5kOiB1cmwoLy93d3cuYnJvd3NlcnNjb3BlLm9yZy9zdGF0aWMvaW1nL2xvZ28ucG5nKSAwIDAgbm8tcmVwZWF0O1xufVxuXG4jYnMtdWEge1xuICBwYWRkaW5nOiAwLjVlbSAwLjVlbSAwO1xuICBjb2xvcjogIzU1NTtcbn1cblxuI2JzLXJlc3VsdHMgLmJzLXJ0IHtcbiAgZm9udC1zaXplOiAxMHB0O1xuICBwYWRkaW5nOiAwLjVlbTtcbiAgYmFja2dyb3VuZDogI2RkZDtcbn1cblxuI2JzLXJlc3VsdHMgdGQge1xuICBib3JkZXI6IDFweCBzb2xpZCAjZGRkO1xuICBwYWRkaW5nOiAwLjRlbTtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbn1cblxuI2JzLXJlc3VsdHMgLnJ0LXVhLWN1ciB7XG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG59XG5cbiNicy1yZXN1bHRzIC5icy1ydC1tZXNzYWdlIHtcbiAgcGFkZGluZzogM2VtO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xuICBjb2xvcjogIzU1NTtcbn1cblxuI2JzLXJlc3VsdHMgLmdvb2dsZS12aXN1YWxpemF0aW9uLXRhYmxlLXRyLWhlYWQgdGQge1xuICB3aGl0ZS1zcGFjZTogbm9ybWFsO1xufVxuXG4jY29tbWVudHMgaDEge1xuICBwYWRkaW5nOiAwO1xufVxuXG4jY29tbWVudHMgLm1ldGEgaW1nIHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBsZWZ0OiAwO1xuICB0b3A6IDA7XG4gIG1hcmdpbjogMDtcbn1cblxuI2NvbW1lbnRzIC5tZXRhIGltZyB7XG4gIHRvcDogMnB4O1xuICBsZWZ0OiAycHg7XG59XG5cbiNjb21tZW50cyAubWV0YSB7XG4gIHBhZGRpbmctbGVmdDogMzVweDtcbiAgbWFyZ2luLXRvcDogMDtcbiAgd2lkdGg6IDkyM3B4O1xuICBsaW5lLWhlaWdodDogMzBweDtcbn1cblxuI2NvbW1lbnRzIC5tZXRhIGEge1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgY29sb3I6ICM1NTU7XG59XG5cbiNjb21tZW50cyBhcnRpY2xlIGRpdiB7XG4gIHBhZGRpbmc6IDAgMWVtIDA7XG59XG5cbiNjb21tZW50cyBhcnRpY2xlIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNiNGI0YjQ7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgbWFyZ2luLWJvdHRvbTogMWVtO1xufVxuXG4vKiBuZWVkcyBpdHMgb3duIHJ1bGUgKGNhbm5vdCBiZSBncm91cGVkIHdpdGggYHRib2R5IHRoYCkgYmVjYXVzZSBvZiBidWdneSBJRSAqL1xuI2NvbW1lbnRzIGFydGljbGU6dGFyZ2V0IHtcbiAgYmFja2dyb3VuZDogI2RkZTRlYTtcbn1cblxuI2Vycm9yLWluZm8uc2hvdyxcbi5tZXRhIHN0cm9uZyxcbiNmaXJlYnVnIHN0cm9uZyxcbiNqYXZhIHN0cm9uZyxcbiNzdGF0dXMgc3Ryb25nIHtcbiAgYmFja2dyb3VuZDogcGluaztcbiAgYm9yZGVyOiAxcHggc29saWQgI2IwMGIwMDtcbiAgcGFkZGluZzogMC40ZW07XG59XG5cbiNlcnJvci1pbmZvLnNob3cge1xuICBwYWRkaW5nOiAwLjVlbSAxZW07XG59XG5cbiNlcnJvci1pbmZvLFxuY29kZSxcbnNhbXAsXG52YXIsXG50ZXh0YXJlYSxcbiNzbHVnIHtcbiAgZm9udC1mYW1pbHk6IE1vbmFjbywgbW9ub3NwYWNlO1xuICBmb250LXNpemU6IDAuOWVtO1xuICAtbW96LXRhYi1zaXplOiAyO1xuICAtby10YWItc2l6ZTogMjtcbiAgdGFiLXNpemU6IDI7XG59XG5cbiNqYXZhIHN0cm9uZyB7XG4gIGJhY2tncm91bmQ6ICNmZmZmZGM7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNmYWE3MDA7XG59XG5cbiNzbHVnIHtcbiAgZm9udC1zaXplOiAxZW07XG59XG5cbiNmYXEgZHQge1xuICBtYXJnaW4tdG9wOiAxZW07XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xufVxuXG4jZmFxIGR0IGEge1xuICBkaXNwbGF5OiBub25lO1xufVxuXG4jZmFxIGR0OmhvdmVyIGEge1xuICBkaXNwbGF5OiBpbmxpbmU7XG59XG5cbiNmYXEgZHQ6dGFyZ2V0LFxuI2ZhcSBkdDp0YXJnZXQgKyBkZCB7XG4gIGJhY2tncm91bmQ6ICM5MGVlODU7XG4gIG1hcmdpbjogMCAtMC44ZW07XG4gIHBhZGRpbmc6IDAgMC44ZW07XG59XG5cbiNmYXEgZHQ6dGFyZ2V0ICsgZGQge1xuICBwYWRkaW5nLWJvdHRvbTogMC41ZW07XG4gIG1hcmdpbi1ib3R0b206IC0wLjVlbTtcbn1cblxuI2ZhcSBkdDp0YXJnZXQge1xuICBtYXJnaW4tdG9wOiAwLjVlbTtcbiAgcGFkZGluZy10b3A6IDAuNWVtO1xufVxuXG4jZmlyZWJ1ZyxcbiNqYXZhIHtcbiAgbWFyZ2luOiAwIDAgMWVtO1xuICBwYWRkaW5nOiAwLjNlbSAwO1xufVxuXG4jcHJlcC1jb2RlIHByZSB7XG4gIG1heC1oZWlnaHQ6IDUwMHB4O1xuICBvdmVyZmxvdzogYXV0bztcbn1cblxuI2ZpcmVidWcuc2hvdyxcbiNqYXZhLnNob3cge1xuICBkaXNwbGF5OiBibG9jaztcbn1cblxuLmNvMSxcbi5jbzIsXG4uY29NVUxUSSB7XG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcbiAgY29sb3I6ICMwNjA7XG59XG5cbi5lcnJvciB7XG4gIGNvbG9yOiAjYjAwYjAwO1xufVxuXG4uaW1wIHtcbiAgY29sb3I6IHJlZDtcbn1cblxuLmt3MSxcbi5rdzMge1xuICBjb2xvcjogIzAwNjtcbn1cblxuLmt3MiB7XG4gIGNvbG9yOiAjMDM2O1xufVxuXG4uZXMwIHtcbiAgY29sb3I6ICMwMDk7XG59XG5cbi5icjAge1xuICBjb2xvcjogIzA5MDtcbn1cblxuLnN5MCB7XG4gIGNvbG9yOiAjMzkzO1xufVxuXG4uc3QwIHtcbiAgY29sb3I6ICMzNmM7XG59XG5cbi5udTAge1xuICBjb2xvcjogI2MwMDtcbn1cblxuLm1lMSB7XG4gIGNvbG9yOiAjNjA2O1xufVxuXG4jY2FyYm9uYWRzIHtcbiAgZmxvYXQ6IHJpZ2h0O1xuICB3aWR0aDogMTMwcHg7XG4gIGZvbnQtc2l6ZTogODAlO1xufVxuXG4jY2FyYm9uYWRzIGEge1xuICBkaXNwbGF5OiBibG9jaztcbn1cblxuLyogPCAxMDUxcHggKi9cbkBtZWRpYSAobWF4LXdpZHRoOiAxMDUwcHgpIHtcbiAgdGFibGUgcHJlLFxuICB0YWJsZSB0ZC5jb2RlIHtcbiAgICB3aWR0aDogNTUwcHg7XG4gIH1cbn1cblxuLyogPCAxMDQxcHggKi9cbkBtZWRpYSAobWF4LXdpZHRoOiAxMDQwcHgpIHtcbiAgYm9keSB7XG4gICAgbWFyZ2luOiAwO1xuICAgIGJvcmRlcjogMDtcbiAgfVxuXG4gIGJvZHksXG4gICNjb21tZW50cyAubWV0YSB7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgLXdlYmtpdC1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIC1tb3otYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICB9XG59XG5cbi8qIDwgODAxcHggKi9cbkBtZWRpYSAobWF4LXdpZHRoOiA4MDBweCkge1xuICB0YWJsZSBwcmUsXG4gIHRhYmxlIHRkLmNvZGUge1xuICAgIHdpZHRoOiA0NTBweDtcbiAgfVxufVxuXG4vKiA8IDY4MXB4ICovXG5AbWVkaWEgKG1heC13aWR0aDogNjgwcHgpIHtcbiAgdGFibGUgcHJlLFxuICB0YWJsZSB0ZC5jb2RlIHtcbiAgICB3aWR0aDogMzUwcHg7XG4gIH1cbn1cblxuLyogPCA2NTFweCAqL1xuQG1lZGlhIChtYXgtd2lkdGg6IDY1MHB4KSB7XG4gIHRhYmxlIHByZSxcbiAgdGFibGUgdGQuY29kZSB7XG4gICAgd2lkdGg6IDIwMHB4O1xuICB9XG59XG4iLCJodG1sLFxuYm9keSxcbmgxLFxuaDIsXG5oMyxcbmZpZWxkc2V0LFxuI2ZhcSxcbiNmYXEgZHQsXG4jZmFxIGRkIHtcbiAgbWFyZ2luOiAwO1xuICBwYWRkaW5nOiAwO1xuICBib3JkZXI6IDA7XG59XG5cbnRhYmxlLFxucCxcbnVsLFxuaDEsXG5oMixcbmgzLFxuI2Vycm9yLWluZm8sXG5mb3JtIGRpdixcbiNmYXEsXG4uYnMtcnQge1xuICBtYXJnaW4tYm90dG9tOiAxZW07XG59XG5cbmJ1dHRvbixcbmlucHV0LFxudGV4dGFyZWEsXG5hLFxuLmJzLXJ0IHtcbiAgLW1vei1ib3JkZXItcmFkaXVzOiA0cHg7XG4gIC13ZWJraXQtYm9yZGVyLXJhZGl1czogNHB4O1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG59XG5cbmh0bWwsXG5pbnB1dCxcbnRleHRhcmVhLFxuYnV0dG9uIHtcbiAgZm9udDogMWVtLzEuNSBzYW5zLXNlcmlmO1xufVxuXG5ib2R5IHtcbiAgYmFja2dyb3VuZDogI2ZmZjtcbiAgcGFkZGluZzogMCAyLjVlbTtcbiAgbWFyZ2luOiAwIGF1dG87XG4gIG1pbi1oZWlnaHQ6IDEwMCU7XG59XG5cbmEsXG4uYnRuLWxpbmsge1xuICBjb2xvcjogIzM1N2FiMDtcbiAgcGFkZGluZzogMC4yZW07XG59XG5cbmE6aG92ZXIsXG5hOmZvY3VzLFxuLmJ0bi1saW5rOmhvdmVyLFxuLmJ0bi1saW5rOmZvY3VzIHtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xufVxuXG4uYnRuLWxpbmsge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgYm9yZGVyOiAwO1xuICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTtcbn1cblxuLmJ0bi1saW5rOmhvdmVyLFxuLmJ0bi1saW5rOmZvY3VzIHtcbiAgY3Vyc29yOiBwb2ludGVyO1xufVxuXG5ibG9ja3F1b3RlIHtcbiAgbWFyZ2luOiAwIDAgMWVtO1xuICBib3JkZXItbGVmdDogNXB4IHNvbGlkICNiNGI0YjQ7XG4gIHBhZGRpbmctbGVmdDogMC41ZW07XG59XG5cbnRhYmxlIHtcbiAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTtcbn1cblxudGhlYWQgdGgsXG5idXR0b246aG92ZXIsXG5idXR0b246Zm9jdXMsXG4uc3VibWl0OmhvdmVyLFxuLnN1Ym1pdDpmb2N1cyxcbmE6aG92ZXIsXG5hOmZvY3VzLFxuLmJ0bi1saW5rOmhvdmVyLFxuLmJ0bi1saW5rOmZvY3VzLFxuI2NvbW1lbnRzIC5tZXRhIGE6aG92ZXIsXG4jY29tbWVudHMgLm1ldGEgYTpmb2N1cyxcbmxpLmN1cnJlbnQgYTpob3ZlcixcbmxpLmN1cnJlbnQgYTpmb2N1cyxcbmZvcm0gaDMsXG4jY29tbWVudHMgLm93bmVyIC5tZXRhIHtcbiAgYmFja2dyb3VuZDogIzFhNmFiOTtcbiAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KHRvcCwgIzZjYTVkZCwgIzFhNmFiOSk7XG4gIGNvbG9yOiAjZmZmO1xufVxuXG5jYXB0aW9uLFxuI2NvbW1lbnRzIC5tZXRhIHtcbiAgYmFja2dyb3VuZDogI2JjYmNiYztcbiAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KHRvcCwgI2QwZDBkMCwgI2E3YTdhNyk7XG4gIGNvbG9yOiAjNTU1O1xufVxuXG50aGVhZCB0aCxcbmNhcHRpb24ge1xuICBmb250LXdlaWdodDogYm9sZDtcbn1cblxuLmpzIHRib2R5IHRoOmhvdmVyLFxuLmpzIHRib2R5IHRoOmZvY3VzIHtcbiAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7XG4gIGN1cnNvcjogcG9pbnRlcjtcbn1cblxudGJvZHkgdGgsXG50ZCB7XG4gIGJvcmRlcjogc29saWQgI2I0YjRiNDtcbiAgYm9yZGVyLXdpZHRoOiAwIDFweCAxcHggMDtcbn1cblxudGJvZHkgdGgge1xuICBiYWNrZ3JvdW5kOiAjZGRlNGVhO1xuICB3aWR0aDogMTUwcHg7XG59XG5cbnRkLnJlc3VsdHMge1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIGJvcmRlci1yaWdodDogMDtcbn1cblxuLnJlc3VsdHMgc3BhbixcbnNtYWxsIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIGZvbnQtc2l6ZTogMC44ZW07XG59XG5cbnRkLFxudGgsXG5jYXB0aW9uIHtcbiAgcGFkZGluZzogMC4yZW0gMC41ZW07XG59XG5cbnRkLmZhc3Rlc3Qge1xuICBiYWNrZ3JvdW5kOiAjOWNlZTgyO1xufVxuXG50cjpsYXN0LWNoaWxkIHRkLFxudHI6bGFzdC1jaGlsZCB0aCB7XG4gIGJvcmRlci1ib3R0b206IDA7XG59XG5cbnRkLnNsb3dlc3QsXG50ZC5lcnJvcixcbi5pbnZhbGlkIHtcbiAgYmFja2dyb3VuZDogcGluaztcbn1cblxuLyogbmVlZHMgaXRzIG93biBydWxlIGJlY2F1c2Ugb2YgYnVnZ3kgSUUgKi9cbjpmb2N1czppbnZhbGlkIHtcbiAgYmFja2dyb3VuZDogcGluaztcbn1cblxudGQuZXJyb3Ige1xuICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlO1xuICBmb250LXdlaWdodDogYm9sZDtcbn1cblxuYnV0dG9uLFxuLnN1Ym1pdCB7XG4gIHBhZGRpbmc6IDAuMzVlbSAwLjVlbTtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBjb2xvcjogIzAwMDtcbiAgYm9yZGVyOiAxcHggc29saWQgIzk5OTtcbiAgYmFja2dyb3VuZDogI2RhZGFkYTtcbiAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KHRvcCwgI2ViZWJlYiwgI2I4YjhiOCk7XG59XG5cbi5sb2dpbiB7XG4gIHBhZGRpbmc6IDAuMzVlbSAwLjVlbTtcbiAgdGV4dC1kZWNvcmF0aW9uOiBub25lO1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIGNvbG9yOiAjMDAwO1xuICBib3JkZXI6IDFweCBzb2xpZCAjOTk5O1xuICBiYWNrZ3JvdW5kOiAjZGFkYWRhO1xuICBiYWNrZ3JvdW5kLWltYWdlOiBsaW5lYXItZ3JhZGllbnQodG9wLCAjZWJlYmViLCAjYjhiOGI4KTtcbn1cblxuYTpob3ZlciBzcGFuLFxuYTpmb2N1cyBzcGFuLFxuI2NvbW1lbnRzIC5vd25lciAubWV0YSBhIHtcbiAgY29sb3I6ICNmZmY7XG59XG5cbiNvcHRpb25zIHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZmxleC13cmFwOiB3cmFwO1xufVxuI29wdGlvbnMgbGFiZWwsXG4jb3B0aW9ucyBzZWxlY3Qge1xuICBtYXJnaW4tcmlnaHQ6IDVweDtcbn1cbiNvcHRpb25zIC5vcHRpb24ge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIG1hcmdpbi1ib3R0b206IDAuNWVtO1xufVxuXG4jdGVzdC1jb250YWluZXIge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBtYXgtd2lkdGg6IDgwMHB4O1xufVxuXG4jdGVzdC10YWJsZSB7XG4gIGZsZXg6IDEgMTtcbiAgd2lkdGg6IDEwMCU7XG4gIG1hcmdpbjogMC41ZW0gMDtcbn1cblxuI2NvbnRyb2xzIHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICBmbGV4OiAxIDE7XG4gIHdpZHRoOiAxMDAlO1xuICBtYXJnaW46IDAuNWVtIDA7XG59XG5cbi5idXR0b25zIHtcbiAgZmxvYXQ6IHJpZ2h0O1xufVxuXG5idXR0b246aG92ZXIsXG5idXR0b246Zm9jdXMsXG4uc3VibWl0OmhvdmVyLFxuLnN1Ym1pdDpmb2N1cyB7XG4gIGJvcmRlci1jb2xvcjogIzM1N2FiMDtcbn1cblxuI2FkZC1idXR0b25zIGJ1dHRvbiB7XG4gIHBhZGRpbmc6IDAuMTVlbSAwLjRlbTtcbiAgZm9udC1zaXplOiAxMXB4O1xuICBmb250LXdlaWdodDogYm9sZDtcbn1cblxuZm9ybSBsYWJlbCB7XG4gIGZsb2F0OiBsZWZ0O1xuICB3aWR0aDogMTRlbTtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICB0ZXh0LWFsaWduOiByaWdodDtcbiAgbWFyZ2luLXJpZ2h0OiAxZW07XG4gIHBhZGRpbmc6IDAuNGVtO1xufVxuXG5sYWJlbC5pbmxpbmUge1xuICBmbG9hdDogbm9uZTtcbiAgcGFkZGluZzogMDtcbiAgbWFyZ2luOiAwO1xufVxuXG5sYWJlbFtmb3I9dmlzaWJsZV0sXG5sYWJlbFtmb3IkPVwiXVtkZWZlcl1cIl0ge1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gIHRvcDogLTAuMzdlbTtcbn1cblxubGFiZWwgc3BhbiB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBmb250LXNpemU6IDkwJTtcbiAgY29sb3I6ICNiNGI0YjQ7XG59XG5cbmxhYmVsIGVtIHtcbiAgY29sb3I6IHJlZDtcbiAgZm9udC1zdHlsZTogbm9ybWFsO1xufVxuXG4uanMgI2FkdmFuY2VkIHtcbiAgZGlzcGxheTogbm9uZTtcbn1cblxuI3Nob3ctYWR2YW5jZWQge1xuICBkaXNwbGF5OiBub25lO1xufVxuXG4uanMgI3Nob3ctYWR2YW5jZWQge1xuICBkaXNwbGF5OiBibG9jaztcbn1cblxuc2VjdGlvbiB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBtYXJnaW46IDJlbSAwO1xufVxuXG50ZXh0YXJlYSB7XG4gIHJlc2l6ZTogdmVydGljYWw7XG4gIGhlaWdodDogMTVlbTtcbiAgd2lkdGg6IDQyLjZlbTtcbiAgKndpZHRoOiA0Mi40ZW07XG4gIC8qIElFIDwgOCAqL1xufVxuXG5pbnB1dCxcbnRleHRhcmVhIHtcbiAgYm9yZGVyOiAxcHggc29saWQgI2I0YjRiNDtcbiAgcGFkZGluZzogMC40ZW07XG59XG5cbmlucHV0W3R5cGU9c2VhcmNoXSB7XG4gIC13ZWJraXQtYXBwZWFyYW5jZTogbm9uZTtcbn1cblxuI3Zpc2libGUsXG4jY2FsaWJyYXRlIHtcbiAgLyogY2hlY2tib3hlcywgZm9yIElFICovXG4gIGJvcmRlcjogMDtcbiAgcGFkZGluZzogMDtcbn1cblxuZm9ybSBoMixcbmZvcm0gaDMsXG5mb3JtIGg0LFxucC5lcnJvcixcbi5wcmV2aWV3LFxuI2FkZC1saWJyYXJpZXMsXG4jYWRkLWJ1dHRvbnMge1xuICBwYWRkaW5nLWxlZnQ6IDI1MHB4O1xuICBkaXNwbGF5OiBibG9jaztcbn1cblxuaGdyb3VwIGgyLFxuI2ZpcmVidWcsXG4jamF2YSB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG5cbnByZSB7XG4gIHdpZHRoOiAxMDAlO1xuICBvdmVyZmxvdzogYXV0bztcbiAgd2hpdGUtc3BhY2U6IHByZTtcbiAgd2hpdGUtc3BhY2U6IHByZS13cmFwO1xuICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7XG59XG5cbnRhYmxlICNyZXN1bHRzLTEge1xuICB3aWR0aDogMTAwcHg7XG59XG5cbnRhYmxlIHByZSB7XG4gICpwYWRkaW5nOiAxLjVlbSAwO1xuICAvKiBJRSA8IDggKi9cbiAgKm92ZXJmbG93LXk6IGhpZGRlbjtcbiAgLyogSUUgPCA4ICovXG59XG5cbnRhYmxlIHByZSxcbnRhYmxlIHRkLmNvZGUge1xuICB3aWR0aDogNjAwcHg7XG59XG5cbm1hcmsge1xuICBiYWNrZ3JvdW5kOiAjZmY5O1xuICBwYWRkaW5nOiAwLjJlbSAwLjFlbTtcbn1cblxuaDEsXG5oMixcbmgzLFxuaDQge1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgZm9udC1zaXplOiAxZW07XG59XG5cbmgxIHtcbiAgcGFkZGluZy10b3A6IDFlbTtcbiAgZm9udC1zaXplOiAxLjRlbTtcbn1cblxuZm9ybSBoMyB7XG4gIHBhZGRpbmctdG9wOiAwLjJlbTtcbiAgcGFkZGluZy1ib3R0b206IDAuMmVtO1xufVxuXG5oMSBlbSB7XG4gIGZvbnQtc3R5bGU6IG5vcm1hbDtcbn1cblxuaDEgc3Ryb25nIHtcbiAgZm9udC1zdHlsZTogaXRhbGljO1xuICBmb250LWZhbWlseTogTW9uYWNvLCBcIkx1Y2lkYSBDb25zb2xlXCIsIG1vbm9zcGFjZTtcbn1cblxubGkuY3VycmVudCBhIHtcbiAgYmFja2dyb3VuZDogIzkwZWU4NTtcbn1cblxuZm9vdGVyIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIG1hcmdpbi10b3A6IDJlbTtcbiAgYm9yZGVyLXRvcDogMnB4IHNvbGlkICNjNGM0YzQ7XG4gIGZvbnQtc2l6ZTogMC45ZW07XG4gIG92ZXJmbG93OiBoaWRkZW47XG59XG5cbmZvb3RlciB1bCB7XG4gIGxpc3Qtc3R5bGU6IG5vbmU7XG4gIHBhZGRpbmc6IDA7XG4gIG1hcmdpbjogMDtcbn1cblxuZm9vdGVyID4gdWwgPiBsaSB7XG4gIGZsb2F0OiBsZWZ0O1xuICB3aWR0aDogMTUlO1xufVxuXG5mb290ZXIgPiB1bCA+IGxpOmZpcnN0LWNoaWxkIHtcbiAgd2lkdGg6IDU1JTtcbn1cblxuZm9vdGVyIHVsIHVsIGxpIHtcbiAgbWFyZ2luLWJvdHRvbTogMC4xZW07XG59XG5cbmZvb3RlciBoNCB7XG4gIG1hcmdpbi1ib3R0b206IDAuMmVtO1xufVxuXG4jYWRkLXRlc3Qge1xuICBtYXJnaW4tcmlnaHQ6IDAuM2VtO1xufVxuXG4jYnMtY2hhcnQge1xuICBvdmVyZmxvdzogYXV0bztcbn1cblxuI2JzLWNoYXJ0LWZyYW1lIHtcbiAgaGVpZ2h0OiAyNDBweDtcbiAgd2lkdGg6IDEwMCU7XG59XG5cbiNicy1sb2dvIHtcbiAgbWFyZ2luOiAwO1xufVxuXG4jYnMtbG9nbyBzcGFuLFxuYXBwbGV0IHtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICBsZWZ0OiAtOTk5OWVtO1xufVxuXG4jYnMtbG9nbyBhIHtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHdpZHRoOiAyMzJweDtcbiAgaGVpZ2h0OiAzOXB4O1xuICBmaWx0ZXI6IG5vbmU7XG4gIGJhY2tncm91bmQ6IHVybCgvL3d3dy5icm93c2Vyc2NvcGUub3JnL3N0YXRpYy9pbWcvbG9nby5wbmcpIDAgMCBuby1yZXBlYXQ7XG59XG5cbiNicy11YSB7XG4gIHBhZGRpbmc6IDAuNWVtIDAuNWVtIDA7XG4gIGNvbG9yOiAjNTU1O1xufVxuXG4jYnMtcmVzdWx0cyAuYnMtcnQge1xuICBmb250LXNpemU6IDEwcHQ7XG4gIHBhZGRpbmc6IDAuNWVtO1xuICBiYWNrZ3JvdW5kOiAjZGRkO1xufVxuXG4jYnMtcmVzdWx0cyB0ZCB7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNkZGQ7XG4gIHBhZGRpbmc6IDAuNGVtO1xuICB3aGl0ZS1zcGFjZTogbm93cmFwO1xufVxuXG4jYnMtcmVzdWx0cyAucnQtdWEtY3VyIHtcbiAgZm9udC1zdHlsZTogaXRhbGljO1xuICBmb250LXdlaWdodDogYm9sZDtcbn1cblxuI2JzLXJlc3VsdHMgLmJzLXJ0LW1lc3NhZ2Uge1xuICBwYWRkaW5nOiAzZW07XG4gIHRleHQtYWxpZ246IGNlbnRlcjtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIGNvbG9yOiAjNTU1O1xufVxuXG4jYnMtcmVzdWx0cyAuZ29vZ2xlLXZpc3VhbGl6YXRpb24tdGFibGUtdHItaGVhZCB0ZCB7XG4gIHdoaXRlLXNwYWNlOiBub3JtYWw7XG59XG5cbiNjb21tZW50cyBoMSB7XG4gIHBhZGRpbmc6IDA7XG59XG5cbiNjb21tZW50cyAubWV0YSBpbWcge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIGxlZnQ6IDA7XG4gIHRvcDogMDtcbiAgbWFyZ2luOiAwO1xufVxuXG4jY29tbWVudHMgLm1ldGEgaW1nIHtcbiAgdG9wOiAycHg7XG4gIGxlZnQ6IDJweDtcbn1cblxuI2NvbW1lbnRzIC5tZXRhIHtcbiAgcGFkZGluZy1sZWZ0OiAzNXB4O1xuICBtYXJnaW4tdG9wOiAwO1xuICB3aWR0aDogOTIzcHg7XG4gIGxpbmUtaGVpZ2h0OiAzMHB4O1xufVxuXG4jY29tbWVudHMgLm1ldGEgYSB7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xuICBjb2xvcjogIzU1NTtcbn1cblxuI2NvbW1lbnRzIGFydGljbGUgZGl2IHtcbiAgcGFkZGluZzogMCAxZW0gMDtcbn1cblxuI2NvbW1lbnRzIGFydGljbGUge1xuICBkaXNwbGF5OiBibG9jaztcbiAgYm9yZGVyOiAxcHggc29saWQgI2I0YjRiNDtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xuICBtYXJnaW4tYm90dG9tOiAxZW07XG59XG5cbi8qIG5lZWRzIGl0cyBvd24gcnVsZSAoY2Fubm90IGJlIGdyb3VwZWQgd2l0aCBgdGJvZHkgdGhgKSBiZWNhdXNlIG9mIGJ1Z2d5IElFICovXG4jY29tbWVudHMgYXJ0aWNsZTp0YXJnZXQge1xuICBiYWNrZ3JvdW5kOiAjZGRlNGVhO1xufVxuXG4jZXJyb3ItaW5mby5zaG93LFxuLm1ldGEgc3Ryb25nLFxuI2ZpcmVidWcgc3Ryb25nLFxuI2phdmEgc3Ryb25nLFxuI3N0YXR1cyBzdHJvbmcge1xuICBiYWNrZ3JvdW5kOiBwaW5rO1xuICBib3JkZXI6IDFweCBzb2xpZCAjYjAwYjAwO1xuICBwYWRkaW5nOiAwLjRlbTtcbn1cblxuI2Vycm9yLWluZm8uc2hvdyB7XG4gIHBhZGRpbmc6IDAuNWVtIDFlbTtcbn1cblxuI2Vycm9yLWluZm8sXG5jb2RlLFxuc2FtcCxcbnZhcixcbnRleHRhcmVhLFxuI3NsdWcge1xuICBmb250LWZhbWlseTogTW9uYWNvLCBtb25vc3BhY2U7XG4gIGZvbnQtc2l6ZTogMC45ZW07XG4gIC1tb3otdGFiLXNpemU6IDI7XG4gIC1vLXRhYi1zaXplOiAyO1xuICB0YWItc2l6ZTogMjtcbn1cblxuI2phdmEgc3Ryb25nIHtcbiAgYmFja2dyb3VuZDogI2ZmZmZkYztcbiAgYm9yZGVyOiAxcHggc29saWQgI2ZhYTcwMDtcbn1cblxuI3NsdWcge1xuICBmb250LXNpemU6IDFlbTtcbn1cblxuI2ZhcSBkdCB7XG4gIG1hcmdpbi10b3A6IDFlbTtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG59XG5cbiNmYXEgZHQgYSB7XG4gIGRpc3BsYXk6IG5vbmU7XG59XG5cbiNmYXEgZHQ6aG92ZXIgYSB7XG4gIGRpc3BsYXk6IGlubGluZTtcbn1cblxuI2ZhcSBkdDp0YXJnZXQsXG4jZmFxIGR0OnRhcmdldCArIGRkIHtcbiAgYmFja2dyb3VuZDogIzkwZWU4NTtcbiAgbWFyZ2luOiAwIC0wLjhlbTtcbiAgcGFkZGluZzogMCAwLjhlbTtcbn1cblxuI2ZhcSBkdDp0YXJnZXQgKyBkZCB7XG4gIHBhZGRpbmctYm90dG9tOiAwLjVlbTtcbiAgbWFyZ2luLWJvdHRvbTogLTAuNWVtO1xufVxuXG4jZmFxIGR0OnRhcmdldCB7XG4gIG1hcmdpbi10b3A6IDAuNWVtO1xuICBwYWRkaW5nLXRvcDogMC41ZW07XG59XG5cbiNmaXJlYnVnLFxuI2phdmEge1xuICBtYXJnaW46IDAgMCAxZW07XG4gIHBhZGRpbmc6IDAuM2VtIDA7XG59XG5cbiNwcmVwLWNvZGUgcHJlIHtcbiAgbWF4LWhlaWdodDogNTAwcHg7XG4gIG92ZXJmbG93OiBhdXRvO1xufVxuXG4jZmlyZWJ1Zy5zaG93LFxuI2phdmEuc2hvdyB7XG4gIGRpc3BsYXk6IGJsb2NrO1xufVxuXG4uY28xLFxuLmNvMixcbi5jb01VTFRJIHtcbiAgZm9udC1zdHlsZTogaXRhbGljO1xuICBjb2xvcjogIzA2MDtcbn1cblxuLmVycm9yIHtcbiAgY29sb3I6ICNiMDBiMDA7XG59XG5cbi5pbXAge1xuICBjb2xvcjogcmVkO1xufVxuXG4ua3cxLFxuLmt3MyB7XG4gIGNvbG9yOiAjMDA2O1xufVxuXG4ua3cyIHtcbiAgY29sb3I6ICMwMzY7XG59XG5cbi5lczAge1xuICBjb2xvcjogIzAwOTtcbn1cblxuLmJyMCB7XG4gIGNvbG9yOiAjMDkwO1xufVxuXG4uc3kwIHtcbiAgY29sb3I6ICMzOTM7XG59XG5cbi5zdDAge1xuICBjb2xvcjogIzM2Yztcbn1cblxuLm51MCB7XG4gIGNvbG9yOiAjYzAwO1xufVxuXG4ubWUxIHtcbiAgY29sb3I6ICM2MDY7XG59XG5cbiNjYXJib25hZHMge1xuICBmbG9hdDogcmlnaHQ7XG4gIHdpZHRoOiAxMzBweDtcbiAgZm9udC1zaXplOiA4MCU7XG59XG5cbiNjYXJib25hZHMgYSB7XG4gIGRpc3BsYXk6IGJsb2NrO1xufVxuXG4vKiA8IDEwNTFweCAqL1xuQG1lZGlhIChtYXgtd2lkdGg6IDEwNTBweCkge1xuICB0YWJsZSBwcmUsXG50YWJsZSB0ZC5jb2RlIHtcbiAgICB3aWR0aDogNTUwcHg7XG4gIH1cbn1cbi8qIDwgMTA0MXB4ICovXG5AbWVkaWEgKG1heC13aWR0aDogMTA0MHB4KSB7XG4gIGJvZHkge1xuICAgIG1hcmdpbjogMDtcbiAgICBib3JkZXI6IDA7XG4gIH1cblxuICBib2R5LFxuI2NvbW1lbnRzIC5tZXRhIHtcbiAgICB3aWR0aDogMTAwJTtcbiAgICAtd2Via2l0LWJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gICAgLW1vei1ib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIH1cbn1cbi8qIDwgODAxcHggKi9cbkBtZWRpYSAobWF4LXdpZHRoOiA4MDBweCkge1xuICB0YWJsZSBwcmUsXG50YWJsZSB0ZC5jb2RlIHtcbiAgICB3aWR0aDogNDUwcHg7XG4gIH1cbn1cbi8qIDwgNjgxcHggKi9cbkBtZWRpYSAobWF4LXdpZHRoOiA2ODBweCkge1xuICB0YWJsZSBwcmUsXG50YWJsZSB0ZC5jb2RlIHtcbiAgICB3aWR0aDogMzUwcHg7XG4gIH1cbn1cbi8qIDwgNjUxcHggKi9cbkBtZWRpYSAobWF4LXdpZHRoOiA2NTBweCkge1xuICB0YWJsZSBwcmUsXG50YWJsZSB0ZC5jb2RlIHtcbiAgICB3aWR0aDogMjAwcHg7XG4gIH1cbn0iXX0= */